ZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vQ1BVSUQuY3BwIGIvc3JjL0NvbW1vbi9DUFVJRC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAwOGM4NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db21tb24vQ1BVSUQuY3BwCkBAIC0wLDAgKzEsMzQ4IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJDUFVJRC5ocHAiCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKwkjaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKwkJI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisJI2VuZGlmCisJI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwkjaW5jbHVkZSA8aW50cmluLmg+CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKwkjaW5jbHVkZSA8c2NoZWQuaD4KKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyNlbHNlCisJI2Vycm9yIFVuaW1wbGVtZW50ZWQgcGxhdGZvcm0KKyNlbmRpZgorCituYW1lc3BhY2Ugc3cKK3sKKwlib29sIENQVUlEOjpNTVggPSBkZXRlY3RNTVgoKTsKKwlib29sIENQVUlEOjpDTU9WID0gZGV0ZWN0Q01PVigpOworCWJvb2wgQ1BVSUQ6OlNTRSA9IGRldGVjdFNTRSgpOworCWJvb2wgQ1BVSUQ6OlNTRTIgPSBkZXRlY3RTU0UyKCk7CisJYm9vbCBDUFVJRDo6U1NFMyA9IGRldGVjdFNTRTMoKTsKKwlib29sIENQVUlEOjpTU1NFMyA9IGRldGVjdFNTU0UzKCk7CisJYm9vbCBDUFVJRDo6U1NFNF8xID0gZGV0ZWN0U1NFNF8xKCk7CisJaW50IENQVUlEOjpjb3JlcyA9IGRldGVjdENvcmVDb3VudCgpOworCWludCBDUFVJRDo6YWZmaW5pdHkgPSBkZXRlY3RBZmZpbml0eSgpOworCisJYm9vbCBDUFVJRDo6ZW5hYmxlTU1YID0gdHJ1ZTsKKwlib29sIENQVUlEOjplbmFibGVDTU9WID0gdHJ1ZTsKKwlib29sIENQVUlEOjplbmFibGVTU0UgPSB0cnVlOworCWJvb2wgQ1BVSUQ6OmVuYWJsZVNTRTIgPSB0cnVlOworCWJvb2wgQ1BVSUQ6OmVuYWJsZVNTRTMgPSB0cnVlOworCWJvb2wgQ1BVSUQ6OmVuYWJsZVNTU0UzID0gdHJ1ZTsKKwlib29sIENQVUlEOjplbmFibGVTU0U0XzEgPSB0cnVlOworCisJdm9pZCBDUFVJRDo6c2V0RW5hYmxlTU1YKGJvb2wgZW5hYmxlKQorCXsKKwkJZW5hYmxlTU1YID0gZW5hYmxlOworCisJCWlmKCFlbmFibGVNTVgpCisJCXsKKwkJCWVuYWJsZVNTRSA9IGZhbHNlOworCQkJZW5hYmxlU1NFMiA9IGZhbHNlOworCQkJZW5hYmxlU1NFMyA9IGZhbHNlOworCQkJZW5hYmxlU1NTRTMgPSBmYWxzZTsKKwkJCWVuYWJsZVNTRTRfMSA9IGZhbHNlOworCQl9CisJfQorCisJdm9pZCBDUFVJRDo6c2V0RW5hYmxlQ01PVihib29sIGVuYWJsZSkKKwl7CisJCWVuYWJsZUNNT1YgPSBlbmFibGU7CisKKwkJaWYoIUNNT1YpCisJCXsKKwkJCWVuYWJsZVNTRSA9IGZhbHNlOworCQkJZW5hYmxlU1NFMiA9IGZhbHNlOworCQkJZW5hYmxlU1NFMyA9IGZhbHNlOworCQkJZW5hYmxlU1NTRTMgPSBmYWxzZTsKKwkJCWVuYWJsZVNTRTRfMSA9IGZhbHNlOworCQl9CisJfQorCisJdm9pZCBDUFVJRDo6c2V0RW5hYmxlU1NFKGJvb2wgZW5hYmxlKQorCXsKKwkJU1NFID0gZW5hYmxlOworCisJCWlmKGVuYWJsZVNTRSkKKwkJeworCQkJZW5hYmxlTU1YID0gdHJ1ZTsKKwkJCWVuYWJsZUNNT1YgPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJZW5hYmxlU1NFMiA9IGZhbHNlOworCQkJZW5hYmxlU1NFMyA9IGZhbHNlOworCQkJZW5hYmxlU1NTRTMgPSBmYWxzZTsKKwkJCWVuYWJsZVNTRTRfMSA9IGZhbHNlOworCQl9CisJfQorCisJdm9pZCBDUFVJRDo6c2V0RW5hYmxlU1NFMihib29sIGVuYWJsZSkKKwl7CisJCWVuYWJsZVNTRTIgPSBlbmFibGU7CisKKwkJaWYoZW5hYmxlU1NFMikKKwkJeworCQkJZW5hYmxlTU1YID0gdHJ1ZTsKKwkJCWVuYWJsZUNNT1YgPSB0cnVlOworCQkJZW5hYmxlU1NFID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWVuYWJsZVNTRTMgPSBmYWxzZTsKKwkJCWVuYWJsZVNTU0UzID0gZmFsc2U7CisJCQllbmFibGVTU0U0XzEgPSBmYWxzZTsKKwkJfQorCX0KKworCXZvaWQgQ1BVSUQ6OnNldEVuYWJsZVNTRTMoYm9vbCBlbmFibGUpCisJeworCQlTU0UzID0gZW5hYmxlOworCisJCWlmKGVuYWJsZVNTRTMpCisJCXsKKwkJCWVuYWJsZU1NWCA9IHRydWU7CisJCQllbmFibGVDTU9WID0gdHJ1ZTsKKwkJCWVuYWJsZVNTRSA9IHRydWU7CisJCQllbmFibGVTU0UyID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWVuYWJsZVNTU0UzID0gZmFsc2U7CisJCQllbmFibGVTU0U0XzEgPSBmYWxzZTsKKwkJfQorCX0KKworCXZvaWQgQ1BVSUQ6OnNldEVuYWJsZVNTU0UzKGJvb2wgZW5hYmxlKQorCXsKKwkJZW5hYmxlU1NTRTMgPSBlbmFibGU7CisKKwkJaWYoZW5hYmxlU1NTRTMpCisJCXsKKwkJCWVuYWJsZU1NWCA9IHRydWU7CisJCQllbmFibGVDTU9WID0gdHJ1ZTsKKwkJCWVuYWJsZVNTRSA9IHRydWU7CisJCQllbmFibGVTU0UyID0gdHJ1ZTsKKwkJCWVuYWJsZVNTRTMgPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJZW5hYmxlU1NFNF8xID0gZmFsc2U7CisJCX0KKwl9CisKKwl2b2lkIENQVUlEOjpzZXRFbmFibGVTU0U0XzEoYm9vbCBlbmFibGUpCisJeworCQllbmFibGVTU0U0XzEgPSBlbmFibGU7CisKKwkJaWYoZW5hYmxlU1NFNF8xKQorCQl7CisJCQllbmFibGVNTVggPSB0cnVlOworCQkJZW5hYmxlQ01PViA9IHRydWU7CisJCQllbmFibGVTU0UgPSB0cnVlOworCQkJZW5hYmxlU1NFMiA9IHRydWU7CisJCQllbmFibGVTU0UzID0gdHJ1ZTsKKwkJCWVuYWJsZVNTU0UzID0gdHJ1ZTsKKwkJfQorCX0KKworCWJvb2wgQ1BVSUQ6OmRldGVjdE1NWCgpCisJeworCQkjaWYgZGVmaW5lZChfV0lOMzIpCisJCQlpbnQgcmVnaXN0ZXJzWzRdOworCQkJX19jcHVpZChyZWdpc3RlcnMsIDEpOworCQkJcmV0dXJuIE1NWCA9IChyZWdpc3RlcnNbM10gJiAweDAwODAwMDAwKSAhPSAwOworCQkjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKwkJCWludCBNTVggPSBmYWxzZTsKKwkJCXNpemVfdCBsZW5ndGggPSBzaXplb2YoTU1YKTsKKwkJCXN5c2N0bGJ5bmFtZSgiaHcub3B0aW9uYWwubW14IiwgJk1NWCwgJmxlbmd0aCwgMCwgMCk7CisJCSNlbHNlCisJCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQorCQkjZW5kaWYKKworCQlyZXR1cm4gTU1YOworCX0KKworCWJvb2wgQ1BVSUQ6OmRldGVjdENNT1YoKQorCXsKKwkJI2lmIGRlZmluZWQoX1dJTjMyKQorCQkJaW50IHJlZ2lzdGVyc1s0XTsKKwkJCV9fY3B1aWQocmVnaXN0ZXJzLCAxKTsKKwkJCXJldHVybiBDTU9WID0gKHJlZ2lzdGVyc1szXSAmIDB4MDAwMDgwMDApICE9IDA7CisJCSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorCQkJaW50IENNT1YgPSBmYWxzZTsKKwkJCXNpemVfdCBsZW5ndGggPSBzaXplb2YoQ01PVik7CisJCQlzeXNjdGxieW5hbWUoImh3Lm9wdGlvbmFsLmZsb2F0aW5ncG9pbnQiLCAmQ01PViwgJmxlbmd0aCwgMCwgMCk7CisJCSNlbHNlCisJCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQorCQkjZW5kaWYKKworCQlyZXR1cm4gQ01PVjsKKwl9CisKKwlib29sIENQVUlEOjpkZXRlY3RTU0UoKQorCXsKKwkJI2lmIGRlZmluZWQoX1dJTjMyKQorCQkJaW50IHJlZ2lzdGVyc1s0XTsKKwkJCV9fY3B1aWQocmVnaXN0ZXJzLCAxKTsKKwkJCXJldHVybiBTU0UgPSAocmVnaXN0ZXJzWzNdICYgMHgwMjAwMDAwMCkgIT0gMDsKKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisJCQlpbnQgU1NFID0gZmFsc2U7CisJCQlzaXplX3QgbGVuZ3RoID0gc2l6ZW9mKFNTRSk7CisJCQlzeXNjdGxieW5hbWUoImh3Lm9wdGlvbmFsLnNzZSIsICZTU0UsICZsZW5ndGgsIDAsIDApOworCQkjZWxzZQorCQkJI2Vycm9yIFVuaW1wbGVtZW50ZWQgcGxhdGZvcm0KKwkJI2VuZGlmCisKKwkJcmV0dXJuIFNTRTsKKwl9CisKKwlib29sIENQVUlEOjpkZXRlY3RTU0UyKCkKKwl7CisJCSNpZiBkZWZpbmVkKF9XSU4zMikKKwkJCWludCByZWdpc3RlcnNbNF07CisJCQlfX2NwdWlkKHJlZ2lzdGVycywgMSk7CisJCQlyZXR1cm4gU1NFMiA9IChyZWdpc3RlcnNbM10gJiAweDA0MDAwMDAwKSAhPSAwOworCQkjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKwkJCWludCBTU0UyID0gZmFsc2U7CisJCQlzaXplX3QgbGVuZ3RoID0gc2l6ZW9mKFNTRTIpOworCQkJc3lzY3RsYnluYW1lKCJody5vcHRpb25hbC5zc2UyIiwgJlNTRTIsICZsZW5ndGgsIDAsIDApOworCQkjZWxzZQorCQkJI2Vycm9yIFVuaW1wbGVtZW50ZWQgcGxhdGZvcm0KKwkJI2VuZGlmCisKKwkJcmV0dXJuIFNTRTI7CisJfQorCisJYm9vbCBDUFVJRDo6ZGV0ZWN0U1NFMygpCisJeworCQkjaWYgZGVmaW5lZChfV0lOMzIpCisJCQlpbnQgcmVnaXN0ZXJzWzRdOworCQkJX19jcHVpZChyZWdpc3RlcnMsIDEpOworCQkJcmV0dXJuIFNTRTMgPSAocmVnaXN0ZXJzWzJdICYgMHgwMDAwMDAwMSkgIT0gMDsKKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisJCQlpbnQgU1NFMyA9IGZhbHNlOworCQkJc2l6ZV90IGxlbmd0aCA9IHNpemVvZihTU0UzKTsKKwkJCXN5c2N0bGJ5bmFtZSgiaHcub3B0aW9uYWwuc3NlMyIsICZTU0UzLCAmbGVuZ3RoLCAwLCAwKTsKKwkJI2Vsc2UKKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtCisJCSNlbmRpZgorCisJCXJldHVybiBTU0UzOworCX0KKworCWJvb2wgQ1BVSUQ6OmRldGVjdFNTU0UzKCkKKwl7CisJCSNpZiBkZWZpbmVkKF9XSU4zMikKKwkJCWludCByZWdpc3RlcnNbNF07CisJCQlfX2NwdWlkKHJlZ2lzdGVycywgMSk7CisJCQlyZXR1cm4gU1NTRTMgPSAocmVnaXN0ZXJzWzJdICYgMHgwMDAwMDIwMCkgIT0gMDsKKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisJCQlpbnQgU1NTRTMgPSBmYWxzZTsKKwkJCXNpemVfdCBsZW5ndGggPSBzaXplb2YoU1NTRTMpOworCQkJc3lzY3RsYnluYW1lKCJody5vcHRpb25hbC5zdXBwbGVtZW50YWxzc2UzIiwgJlNTU0UzLCAmbGVuZ3RoLCAwLCAwKTsKKwkJI2Vsc2UKKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtCisJCSNlbmRpZgorCisJCXJldHVybiBTU1NFMzsKKwl9CisKKwlib29sIENQVUlEOjpkZXRlY3RTU0U0XzEoKQorCXsKKwkJI2lmIGRlZmluZWQoX1dJTjMyKQorCQkJaW50IHJlZ2lzdGVyc1s0XTsKKwkJCV9fY3B1aWQocmVnaXN0ZXJzLCAxKTsKKwkJCXJldHVybiBTU0U0XzEgPSAocmVnaXN0ZXJzWzJdICYgMHgwMDA4MDAwMCkgIT0gMDsKKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisJCQlpbnQgU1NFNF8xID0gZmFsc2U7CisJCQlzaXplX3QgbGVuZ3RoID0gc2l6ZW9mKFNTRTRfMSk7CisJCQlzeXNjdGxieW5hbWUoImh3Lm9wdGlvbmFsLnNzZTRfMSIsICZTU0U0XzEsICZsZW5ndGgsIDAsIDApOworCQkjZWxzZQorCQkJI2Vycm9yIFVuaW1wbGVtZW50ZWQgcGxhdGZvcm0KKwkJI2VuZGlmCisKKwkJcmV0dXJuIFNTRTRfMTsKKwl9CisKKwlpbnQgQ1BVSUQ6OmRldGVjdENvcmVDb3VudCgpCisJeworCQlpbnQgY29yZXMgPSAwOworCisJCSNpZiBkZWZpbmVkKF9XSU4zMikKKwkJCURXT1JEX1BUUiBwcm9jZXNzQWZmaW5pdHlNYXNrID0gMTsKKwkJCURXT1JEX1BUUiBzeXN0ZW1BZmZpbml0eU1hc2sgPSAxOworCQkJCisJCQlHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRQcm9jZXNzKCksICZwcm9jZXNzQWZmaW5pdHlNYXNrLCAmc3lzdGVtQWZmaW5pdHlNYXNrKTsKKworCQkJd2hpbGUoc3lzdGVtQWZmaW5pdHlNYXNrKQorCQkJeworCQkJCWlmKHN5c3RlbUFmZmluaXR5TWFzayAmIDEpCisJCQkJeworCQkJCQljb3JlcysrOworCQkJCX0KKworCQkJCXN5c3RlbUFmZmluaXR5TWFzayA+Pj0gMTsKKwkJCX0KKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisJCQlpbnQgTUlCWzJdOworCQkJTUlCWzBdID0gQ1RMX0hXOworCQkJTUlCWzFdID0gSFdfTkNQVTsKKwkJCQorCQkJc2l6ZV90IGxlbmd0aCA9IHNpemVvZihjb3Jlcyk7CisJCQlzeXNjdGwoTUlCLCAyLCAmY29yZXMsICZsZW5ndGgsIDAsIDApOworCQkjZWxzZQorCQkJI2Vycm9yIFVuaW1wbGVtZW50ZWQgcGxhdGZvcm0KKwkJI2VuZGlmCisKKwkJaWYoY29yZXMgPCAxKSAgY29yZXMgPSAxOworCQlpZihjb3JlcyA+IDE2KSBjb3JlcyA9IDE2OworCisJCXJldHVybiBjb3JlczsgICAvLyBGSVhNRTogTnVtYmVyIG9mIHBoeXNpY2FsIGNvcmVzCisJfQorCisJaW50IENQVUlEOjpkZXRlY3RBZmZpbml0eSgpCisJeworCQlpbnQgY29yZXMgPSAwOworCisJCSNpZiBkZWZpbmVkKF9XSU4zMikKKwkJCURXT1JEX1BUUiBwcm9jZXNzQWZmaW5pdHlNYXNrID0gMTsKKwkJCURXT1JEX1BUUiBzeXN0ZW1BZmZpbml0eU1hc2sgPSAxOworCQkJCisJCQlHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRQcm9jZXNzKCksICZwcm9jZXNzQWZmaW5pdHlNYXNrLCAmc3lzdGVtQWZmaW5pdHlNYXNrKTsKKworCQkJd2hpbGUocHJvY2Vzc0FmZmluaXR5TWFzaykKKwkJCXsKKwkJCQlpZihwcm9jZXNzQWZmaW5pdHlNYXNrICYgMSkKKwkJCQl7CisJCQkJCWNvcmVzKys7CisJCQkJfQorCisJCQkJcHJvY2Vzc0FmZmluaXR5TWFzayA+Pj0gMTsKKwkJCX0KKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisJCQlyZXR1cm4gZGV0ZWN0Q29yZUNvdW50KCk7ICAgLy8gRklYTUU6IEFzc3VtZXMgbm8gYWZmaW5pdHkgbGltaXRhdGlvbgkKKwkJI2Vsc2UKKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtCisJCSNlbmRpZgorCisJCWlmKGNvcmVzIDwgMSkgIGNvcmVzID0gMTsKKwkJaWYoY29yZXMgPiAxNikgY29yZXMgPSAxNjsKKworCQlyZXR1cm4gY29yZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0NvbW1vbi9DUFVJRC5ocHAgYi9zcmMvQ29tbW9uL0NQVUlELmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFhMmEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0NvbW1vbi9DUFVJRC5ocHAKQEAgLTAsMCArMSwxMjEgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIHN3X0NQVUlEX2hwcA0KKyNkZWZpbmUgc3dfQ1BVSURfaHBwDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwkjaWYgIWRlZmluZWQoX194ODZfNjRfXykgJiYgKGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQgKF9NX1g2NCkpDQorCQkjZGVmaW5lIF9feDg2XzY0X18gMQ0KKwkjZW5kaWYNCisNCisJY2xhc3MgQ1BVSUQNCisJew0KKwlwdWJsaWM6DQorCQlzdGF0aWMgYm9vbCBzdXBwb3J0c01NWCgpOw0KKwkJc3RhdGljIGJvb2wgc3VwcG9ydHNDTU9WKCk7DQorCQlzdGF0aWMgYm9vbCBzdXBwb3J0c1NTRSgpOw0KKwkJc3RhdGljIGJvb2wgc3VwcG9ydHNTU0UyKCk7DQorCQlzdGF0aWMgYm9vbCBzdXBwb3J0c1NTRTMoKTsNCisJCXN0YXRpYyBib29sIHN1cHBvcnRzU1NTRTMoKTsNCisJCXN0YXRpYyBib29sIHN1cHBvcnRzU1NFNF8xKCk7DQorCQlzdGF0aWMgaW50IGNvcmVDb3VudCgpOw0KKwkJc3RhdGljIGludCBwcm9jZXNzQWZmaW5pdHkoKTsNCisNCisJCXN0YXRpYyB2b2lkIHNldEVuYWJsZU1NWChib29sIGVuYWJsZSk7DQorCQlzdGF0aWMgdm9pZCBzZXRFbmFibGVDTU9WKGJvb2wgZW5hYmxlKTsNCisJCXN0YXRpYyB2b2lkIHNldEVuYWJsZVNTRShib29sIGVuYWJsZSk7DQorCQlzdGF0aWMgdm9pZCBzZXRFbmFibGVTU0UyKGJvb2wgZW5hYmxlKTsNCisJCXN0YXRpYyB2b2lkIHNldEVuYWJsZVNTRTMoYm9vbCBlbmFibGUpOw0KKwkJc3RhdGljIHZvaWQgc2V0RW5hYmxlU1NTRTMoYm9vbCBlbmFibGUpOw0KKwkJc3RhdGljIHZvaWQgc2V0RW5hYmxlU1NFNF8xKGJvb2wgZW5hYmxlKTsNCisNCisJcHJpdmF0ZToNCisJCXN0YXRpYyBib29sIE1NWDsNCisJCXN0YXRpYyBib29sIENNT1Y7DQorCQlzdGF0aWMgYm9vbCBTU0U7DQorCQlzdGF0aWMgYm9vbCBTU0UyOw0KKwkJc3RhdGljIGJvb2wgU1NFMzsNCisJCXN0YXRpYyBib29sIFNTU0UzOw0KKwkJc3RhdGljIGJvb2wgU1NFNF8xOw0KKwkJc3RhdGljIGludCBjb3JlczsNCisJCXN0YXRpYyBpbnQgYWZmaW5pdHk7DQorDQorCQlzdGF0aWMgYm9vbCBlbmFibGVNTVg7DQorCQlzdGF0aWMgYm9vbCBlbmFibGVDTU9WOw0KKwkJc3RhdGljIGJvb2wgZW5hYmxlU1NFOw0KKwkJc3RhdGljIGJvb2wgZW5hYmxlU1NFMjsNCisJCXN0YXRpYyBib29sIGVuYWJsZVNTRTM7DQorCQlzdGF0aWMgYm9vbCBlbmFibGVTU1NFMzsNCisJCXN0YXRpYyBib29sIGVuYWJsZVNTRTRfMTsNCisNCisJCXN0YXRpYyBib29sIGRldGVjdE1NWCgpOw0KKwkJc3RhdGljIGJvb2wgZGV0ZWN0Q01PVigpOw0KKwkJc3RhdGljIGJvb2wgZGV0ZWN0U1NFKCk7DQorCQlzdGF0aWMgYm9vbCBkZXRlY3RTU0UyKCk7DQorCQlzdGF0aWMgYm9vbCBkZXRlY3RTU0UzKCk7DQorCQlzdGF0aWMgYm9vbCBkZXRlY3RTU1NFMygpOw0KKwkJc3RhdGljIGJvb2wgZGV0ZWN0U1NFNF8xKCk7DQorCQlzdGF0aWMgaW50IGRldGVjdENvcmVDb3VudCgpOw0KKwkJc3RhdGljIGludCBkZXRlY3RBZmZpbml0eSgpOw0KKwl9Ow0KK30NCisNCituYW1lc3BhY2Ugc3cNCit7DQorCWlubGluZSBib29sIENQVUlEOjpzdXBwb3J0c01NWCgpDQorCXsNCisJCXJldHVybiBNTVggJiYgZW5hYmxlTU1YOw0KKwl9DQorDQorCWlubGluZSBib29sIENQVUlEOjpzdXBwb3J0c0NNT1YoKQ0KKwl7DQorCQlyZXR1cm4gQ01PViAmJiBlbmFibGVDTU9WOw0KKwl9DQorDQorCWlubGluZSBib29sIENQVUlEOjpzdXBwb3J0c1NTRSgpDQorCXsNCisJCXJldHVybiBTU0UgJiYgZW5hYmxlU1NFOw0KKwl9DQorDQorCWlubGluZSBib29sIENQVUlEOjpzdXBwb3J0c1NTRTIoKQ0KKwl7DQorCQlyZXR1cm4gU1NFMiAmJiBlbmFibGVTU0UyOw0KKwl9DQorDQorCWlubGluZSBib29sIENQVUlEOjpzdXBwb3J0c1NTRTMoKQ0KKwl7DQorCQlyZXR1cm4gU1NFMyAmJiBlbmFibGVTU0UzOw0KKwl9DQorDQorCWlubGluZSBib29sIENQVUlEOjpzdXBwb3J0c1NTU0UzKCkNCisJew0KKwkJcmV0dXJuIFNTU0UzICYmIGVuYWJsZVNTU0UzOw0KKwl9DQorDQorCWlubGluZSBib29sIENQVUlEOjpzdXBwb3J0c1NTRTRfMSgpDQorCXsNCisJCXJldHVybiBTU0U0XzEgJiYgZW5hYmxlU1NFNF8xOw0KKwl9DQorDQorCWlubGluZSBpbnQgQ1BVSUQ6OmNvcmVDb3VudCgpDQorCXsNCisJCXJldHVybiBjb3JlczsNCisJfQ0KKw0KKwlpbmxpbmUgaW50IENQVUlEOjpwcm9jZXNzQWZmaW5pdHkoKQ0KKwl7DQorCQlyZXR1cm4gYWZmaW5pdHk7DQorCX0NCit9DQorDQorI2VuZGlmICAgLy8gc3dfQ1BVSURfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL0NvbW1vbi9Db25maWd1cmF0b3IuY3BwIGIvc3JjL0NvbW1vbi9Db25maWd1cmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDdmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvQ29tbW9uL0NvbmZpZ3VyYXRvci5jcHAKQEAgLTAsMCArMSwyMzYgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRvci5ocHAiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cnN0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworbmFtZXNwYWNlIHN3Cit7CisJQ29uZmlndXJhdG9yOjpDb25maWd1cmF0b3Ioc3RyaW5nIGluaVBhdGgpCisJeworCQlwYXRoID0gaW5pUGF0aDsKKworCQlyZWFkRmlsZSgpOworCX0KKworCUNvbmZpZ3VyYXRvcjo6fkNvbmZpZ3VyYXRvcigpCisJeworCX0KKworCWJvb2wgQ29uZmlndXJhdG9yOjpyZWFkRmlsZSgpCisJeworCQlmc3RyZWFtIGZpbGUocGF0aC5jX3N0cigpLCBpb3M6OmluKTsKKwkJaWYoZmlsZS5mYWlsKCkpIHJldHVybiBmYWxzZTsKKworCQlzdHJpbmcgbGluZTsKKwkJc3RyaW5nIGtleU5hbWU7CisKKwkJd2hpbGUoZ2V0bGluZShmaWxlLCBsaW5lKSkKKwkJeworCQkJaWYobGluZS5sZW5ndGgoKSkKKwkJCXsKKwkJCQlpZihsaW5lW2xpbmUubGVuZ3RoKCkgLSAxXSA9PSAnXHInKQorCQkJCXsKKwkJCQkJbGluZSA9IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoKCkgLSAxKTsKKwkJCQl9CisKKwkJCQlpZighaXNwcmludChsaW5lWzBdKSkKKwkJCQl7CisJCQkJCXByaW50ZigiRmFpbGluZyBvbiBjaGFyICVkXG4iLCBsaW5lWzBdKTsKKwkJCQkJZmlsZS5jbG9zZSgpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQkJc3RyaW5nOjpzaXplX3R5cGUgcExlZnQgPSBsaW5lLmZpbmRfZmlyc3Rfb2YoIjsjWz0iKTsKKworCQkJCWlmKHBMZWZ0ICE9IHN0cmluZzo6bnBvcykKKwkJCQl7CisJCQkJCXN3aXRjaChsaW5lW3BMZWZ0XSkKKwkJCQkJeworCQkJCQljYXNlICdbJzoKKwkJCQkJCXsKKwkJCQkJCQlzdHJpbmc6OnNpemVfdHlwZSBwUmlnaHQgPSBsaW5lLmZpbmRfbGFzdF9vZigiXSIpOworCisJCQkJCQkJaWYocFJpZ2h0ICE9IHN0cmluZzo6bnBvcyAmJiBwUmlnaHQgPiBwTGVmdCkKKwkJCQkJCQl7CisJCQkJCQkJCWtleU5hbWUgPSBsaW5lLnN1YnN0cihwTGVmdCArIDEsIHBSaWdodCAtIHBMZWZ0IC0gMSk7CisJCQkJCQkJCWFkZEtleU5hbWUoa2V5TmFtZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJz0nOgorCQkJCQkJeworCQkJCQkJCXN0cmluZyB2YWx1ZU5hbWUgPSBsaW5lLnN1YnN0cigwLCBwTGVmdCk7CisJCQkJCQkJc3RyaW5nIHZhbHVlID0gbGluZS5zdWJzdHIocExlZnQgKyAxKTsKKwkJCQkJCQlhZGRWYWx1ZShrZXlOYW1lLCB2YWx1ZU5hbWUsIHZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICc7JzoKKwkJCQkJY2FzZSAnIyc6CisJCQkJCQkvLyBJZ25vcmUgY29tbWVudHMKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJZmlsZS5jbG9zZSgpOworCisJCWlmKG5hbWVzLnNpemUoKSkKKwkJeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJdm9pZCBDb25maWd1cmF0b3I6OndyaXRlRmlsZShzdGQ6OnN0cmluZyB0aXRsZSkKKwl7CisJCWZzdHJlYW0gZmlsZShwYXRoLmNfc3RyKCksIGlvczo6b3V0KTsKKwkJaWYoZmlsZS5mYWlsKCkpIHJldHVybjsKKworCQlmaWxlIDw8ICI7ICIgPDwgdGl0bGUgPDwgZW5kbCA8PCBlbmRsOworCisJCWZvcih1bnNpZ25lZCBpbnQga2V5SUQgPSAwOyBrZXlJRCA8IHNlY3Rpb25zLnNpemUoKTsga2V5SUQrKykKKwkJeworCQkJZmlsZSA8PCAiWyIgPDwgbmFtZXNba2V5SURdIDw8ICJdIiA8PCBlbmRsOworCisJCQlmb3IodW5zaWduZWQgaW50IHZhbHVlSUQgPSAwOyB2YWx1ZUlEIDwgc2VjdGlvbnNba2V5SURdLm5hbWVzLnNpemUoKTsgdmFsdWVJRCsrKQorCQkJeworCQkJCWZpbGUgPDwgc2VjdGlvbnNba2V5SURdLm5hbWVzW3ZhbHVlSURdIDw8ICI9IiA8PCBzZWN0aW9uc1trZXlJRF0udmFsdWVzW3ZhbHVlSURdIDw8IGVuZGw7CisJCQl9CisKKwkJCWZpbGUgPDwgZW5kbDsKKwkJfQorCisJCWZpbGUuY2xvc2UoKTsKKwl9CisKKwlpbnQgQ29uZmlndXJhdG9yOjpmaW5kS2V5KHN0cmluZyBrZXlOYW1lKSBjb25zdAorCXsKKwkJZm9yKHVuc2lnbmVkIGludCBrZXlJRCA9IDA7IGtleUlEIDwgbmFtZXMuc2l6ZSgpOyBrZXlJRCsrKQorCQl7CisJCQlpZihuYW1lc1trZXlJRF0gPT0ga2V5TmFtZSkKKwkJCXsKKwkJCQlyZXR1cm4ga2V5SUQ7CisJCQl9CisJCX0KKworCQlyZXR1cm4gLTE7CisJfQorCisJaW50IENvbmZpZ3VyYXRvcjo6ZmluZFZhbHVlKHVuc2lnbmVkIGludCBrZXlJRCwgc3RyaW5nIHZhbHVlTmFtZSkgY29uc3QKKwl7CisJCWlmKCFzZWN0aW9ucy5zaXplKCkgfHwga2V5SUQgPj0gc2VjdGlvbnMuc2l6ZSgpKQorCQl7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlmb3IodW5zaWduZWQgaW50IHZhbHVlSUQgPSAwOyB2YWx1ZUlEIDwgc2VjdGlvbnNba2V5SURdLm5hbWVzLnNpemUoKTsgKyt2YWx1ZUlEKQorCQl7CisJCQlpZihzZWN0aW9uc1trZXlJRF0ubmFtZXNbdmFsdWVJRF0gPT0gdmFsdWVOYW1lKQorCQkJeworCQkJCXJldHVybiB2YWx1ZUlEOworCQkJfQorCQl9CisKKwkJcmV0dXJuIC0xOworCX0KKworCXVuc2lnbmVkIGludCBDb25maWd1cmF0b3I6OmFkZEtleU5hbWUoc3RyaW5nIGtleU5hbWUpCisJeworCQluYW1lcy5yZXNpemUobmFtZXMuc2l6ZSgpICsgMSwga2V5TmFtZSk7CisJCXNlY3Rpb25zLnJlc2l6ZShzZWN0aW9ucy5zaXplKCkgKyAxKTsKKwkJcmV0dXJuICh1bnNpZ25lZCBpbnQpbmFtZXMuc2l6ZSgpIC0gMTsKKwl9CisKKwl2b2lkIENvbmZpZ3VyYXRvcjo6YWRkVmFsdWUoc3RyaW5nIGNvbnN0IGtleU5hbWUsIHN0cmluZyBjb25zdCB2YWx1ZU5hbWUsIHN0cmluZyBjb25zdCB2YWx1ZSkKKwl7CisJCWludCBrZXlJRCA9IGZpbmRLZXkoa2V5TmFtZSk7CisJCWJvb2wgY3JlYXRlID0gdHJ1ZTsKKworCQlpZihrZXlJRCA9PSAtMSkKKwkJeworCQkJa2V5SUQgPSBhZGRLZXlOYW1lKGtleU5hbWUpOworCQl9CisKKwkJaW50IHZhbHVlSUQgPSBmaW5kVmFsdWUoa2V5SUQsIHZhbHVlTmFtZSk7CisJCQorCQlpZih2YWx1ZUlEID09IC0xKQorCQl7CisJCQlzZWN0aW9uc1trZXlJRF0ubmFtZXMucmVzaXplKHNlY3Rpb25zW2tleUlEXS5uYW1lcy5zaXplKCkgKyAxLCB2YWx1ZU5hbWUpOworCQkJc2VjdGlvbnNba2V5SURdLnZhbHVlcy5yZXNpemUoc2VjdGlvbnNba2V5SURdLnZhbHVlcy5zaXplKCkgKyAxLCB2YWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzZWN0aW9uc1trZXlJRF0udmFsdWVzW3ZhbHVlSURdID0gdmFsdWU7CisJCX0KKwl9CisKKwlzdHJpbmcgQ29uZmlndXJhdG9yOjpnZXRWYWx1ZShzdHJpbmcga2V5TmFtZSwgc3RyaW5nIHZhbHVlTmFtZSwgc3RyaW5nIGRlZmF1bHRWYWx1ZSkgY29uc3QKKwl7CisJCWludCBrZXlJRCA9IGZpbmRLZXkoa2V5TmFtZSk7CisJCWlmKGtleUlEID09IC0xKSByZXR1cm4gZGVmYXVsdFZhbHVlOworCQlpbnQgdmFsdWVJRCA9IGZpbmRWYWx1ZSh1bnNpZ25lZCBpbnQoa2V5SUQpLCB2YWx1ZU5hbWUpOworCQlpZih2YWx1ZUlEID09IC0xKSByZXR1cm4gZGVmYXVsdFZhbHVlOworCisJCXJldHVybiBzZWN0aW9uc1trZXlJRF0udmFsdWVzW3ZhbHVlSURdOworCX0KKworCWludCBDb25maWd1cmF0b3I6OmdldEludGVnZXIoc3RyaW5nIGtleU5hbWUsIHN0cmluZyB2YWx1ZU5hbWUsIGludCBkZWZhdWx0VmFsdWUpIGNvbnN0CisJeworCQljaGFyIHN2YWx1ZVsyNTZdOworCisJCXNwcmludGYoc3ZhbHVlLCAiJWQiLCBkZWZhdWx0VmFsdWUpOworCisJCXJldHVybiBhdG9pKGdldFZhbHVlKGtleU5hbWUsIHZhbHVlTmFtZSwgc3ZhbHVlKS5jX3N0cigpKTsgCisJfQorCisJYm9vbCBDb25maWd1cmF0b3I6OmdldEJvb2xlYW4oc3RyaW5nIGtleU5hbWUsIHN0cmluZyB2YWx1ZU5hbWUsIGJvb2wgZGVmYXVsdFZhbHVlKSBjb25zdAorCXsKKwkJcmV0dXJuIGdldEludGVnZXIoa2V5TmFtZSwgdmFsdWVOYW1lLCAoaW50KWRlZmF1bHRWYWx1ZSkgIT0gMDsKKwl9CisKKwlkb3VibGUgQ29uZmlndXJhdG9yOjpnZXRGbG9hdChzdHJpbmcga2V5TmFtZSwgc3RyaW5nIHZhbHVlTmFtZSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgY29uc3QKKwl7CisJCWNoYXIgc3ZhbHVlWzI1Nl07CisKKwkJc3ByaW50ZihzdmFsdWUsICIlZiIsIGRlZmF1bHRWYWx1ZSk7CisKKwkJcmV0dXJuIGF0b2YoZ2V0VmFsdWUoa2V5TmFtZSwgdmFsdWVOYW1lLCBzdmFsdWUpLmNfc3RyKCkpOyAKKwl9CisKKwl1bnNpZ25lZCBpbnQgQ29uZmlndXJhdG9yOjpnZXRGb3JtYXR0ZWQoc3RyaW5nIGtleU5hbWUsIHN0cmluZyB2YWx1ZU5hbWUsIGNoYXIgKmZvcm1hdCwKKwkJCQkJCQkJCQkJdm9pZCAqdjEsIHZvaWQgKnYyLCB2b2lkICp2Mywgdm9pZCAqdjQsCisJCQkJCQkJCQkJCXZvaWQgKnY1LCB2b2lkICp2Niwgdm9pZCAqdjcsIHZvaWQgKnY4LAorCQkJCQkJCQkJCQl2b2lkICp2OSwgdm9pZCAqdjEwLCB2b2lkICp2MTEsIHZvaWQgKnYxMiwKKwkJCQkJCQkJCQkJdm9pZCAqdjEzLCB2b2lkICp2MTQsIHZvaWQgKnYxNSwgdm9pZCAqdjE2KQorCXsKKwkJc3RyaW5nIHZhbHVlID0gZ2V0VmFsdWUoa2V5TmFtZSwgdmFsdWVOYW1lKTsKKworCQlpZighdmFsdWUubGVuZ3RoKCkpIHJldHVybiBmYWxzZTsKKworCQl1bnNpZ25lZCBpbnQgblZhbHMgPSBzc2NhbmYodmFsdWUuY19zdHIoKSwgZm9ybWF0LAorCQkJCQkJCQkJdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorCQkJCQkJCQkJdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNik7CisKKwkJcmV0dXJuIG5WYWxzOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vQ29uZmlndXJhdG9yLmhwcCBiL3NyYy9Db21tb24vQ29uZmlndXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWJmMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0NvbW1vbi9Db25maWd1cmF0b3IuaHBwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBzd19Db25maWd1cmF0b3JfaHBwCisjZGVmaW5lIHN3X0NvbmZpZ3VyYXRvcl9ocHAKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIHN3Cit7CisJY2xhc3MgQ29uZmlndXJhdG9yICAKKwl7CisJcHVibGljOgorCQlDb25maWd1cmF0b3Ioc3RkOjpzdHJpbmcgaW5pUGF0aCA9ICIiKTsKKworCQl+Q29uZmlndXJhdG9yKCk7CisKKwkJc3RkOjpzdHJpbmcgZ2V0VmFsdWUoc3RkOjpzdHJpbmcgc2VjdGlvbk5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlTmFtZSwgc3RkOjpzdHJpbmcgZGVmYXVsdFZhbHVlID0gIiIpIGNvbnN0OyAKKwkJaW50IGdldEludGVnZXIoc3RkOjpzdHJpbmcgc2VjdGlvbk5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlTmFtZSwgaW50IGRlZmF1bHRWYWx1ZSA9IDApIGNvbnN0OworCQlib29sIGdldEJvb2xlYW4oc3RkOjpzdHJpbmcgc2VjdGlvbk5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlTmFtZSwgYm9vbCBkZWZhdWx0VmFsdWUgPSBmYWxzZSkgY29uc3Q7CisJCWRvdWJsZSBnZXRGbG9hdChzdGQ6OnN0cmluZyBzZWN0aW9uTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWVOYW1lLCBkb3VibGUgZGVmYXVsdFZhbHVlID0gMC4wKSBjb25zdDsKKwkJdW5zaWduZWQgaW50IGdldEZvcm1hdHRlZChzdGQ6OnN0cmluZyBzZWN0aW9uTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWVOYW1lLCBjaGFyICpmb3JtYXQsCisJCQkJCQkJCXZvaWQgKnYxID0gMCwgdm9pZCAqdjIgPSAwLCB2b2lkICp2MyA9IDAsIHZvaWQgKnY0ID0gMCwKKyAgCQkJCQkJCQl2b2lkICp2NSA9IDAsIHZvaWQgKnY2ID0gMCwgdm9pZCAqdjcgPSAwLCB2b2lkICp2OCA9IDAsCisgIAkJCQkJCQkJdm9pZCAqdjkgPSAwLCB2b2lkICp2MTAgPSAwLCB2b2lkICp2MTEgPSAwLCB2b2lkICp2MTIgPSAwLAorICAJCQkJCQkJCXZvaWQgKnYxMyA9IDAsIHZvaWQgKnYxNCA9IDAsIHZvaWQgKnYxNSA9IDAsIHZvaWQgKnYxNiA9IDApOworCisJCXZvaWQgYWRkVmFsdWUoc3RkOjpzdHJpbmcgc2VjdGlvbk5hbWUsIHN0ZDo6c3RyaW5nIHZhbHVlTmFtZSwgc3RkOjpzdHJpbmcgdmFsdWUpOworCisJCXZvaWQgd3JpdGVGaWxlKHN0ZDo6c3RyaW5nIHRpdGxlID0gIkNvbmZpZ3VyYXRpb24gRmlsZSIpOworCisJcHJpdmF0ZToKKwkJYm9vbCByZWFkRmlsZSgpOworCisJCXVuc2lnbmVkIGludCBhZGRLZXlOYW1lKHN0ZDo6c3RyaW5nIHNlY3Rpb25OYW1lKTsKKwkJaW50IGZpbmRLZXkoc3RkOjpzdHJpbmcgc2VjdGlvbk5hbWUpIGNvbnN0OworCQlpbnQgZmluZFZhbHVlKHVuc2lnbmVkIGludCBzZWN0aW9uSUQsIHN0ZDo6c3RyaW5nIHZhbHVlTmFtZSkgY29uc3Q7CisKKwkJc3RkOjpzdHJpbmcgcGF0aDsKKworCQlzdHJ1Y3QgU2VjdGlvbgorCQl7CisJCQlzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXM7CisJCQlzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmFsdWVzOyAKKwkJfTsKKworCQlzdGQ6OnZlY3RvcjxTZWN0aW9uPiBzZWN0aW9uczsKKwkJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVzOworCX07Cit9CisKKyNlbmRpZiAgIC8vIHN3X0NvbmZpZ3VyYXRvcl9ocHAKZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vRGVidWcuY3BwIGIvc3JjL0NvbW1vbi9EZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyMmM0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db21tb24vRGVidWcuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3ZvaWQgdHJhY2UoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJaWYoZmFsc2UpCisJeworCQlGSUxFICpmaWxlID0gZm9wZW4oImRlYnVnLnR4dCIsICJhIik7CisKKwkJaWYoZmlsZSkKKwkJeworCQkJdmFfbGlzdCB2YXJhcmc7CisJCQl2YV9zdGFydCh2YXJhcmcsIGZvcm1hdCk7CisJCQl2ZnByaW50ZihmaWxlLCBmb3JtYXQsIHZhcmFyZyk7CisJCQl2YV9lbmQodmFyYXJnKTsKKworCQkJZmNsb3NlKGZpbGUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0NvbW1vbi9EZWJ1Zy5ocHAgYi9zcmMvQ29tbW9uL0RlYnVnLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE5ZTViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0NvbW1vbi9EZWJ1Zy5ocHAKQEAgLTAsMCArMSw1NyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgRGVidWdfaHBwDQorI2RlZmluZSBEZWJ1Z19ocHANCisNCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4NCisjaW5jbHVkZSA8d2luZG93cy5oPg0KKyNpbmNsdWRlIDxhc3NlcnQuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8Z3VpZGRlZi5oPg0KKw0KKyN1bmRlZiBtaW4NCisjdW5kZWYgbWF4DQorDQordm9pZCB0cmFjZShjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7DQorDQorI2lmbmRlZiBOREVCVUcNCisJI2RlZmluZSBUUkFDRShmb3JtYXQsIC4uLikgdHJhY2UoIlsweCUwLjhYXSVzKCJmb3JtYXQiKVxuIiwgdGhpcywgX19GVU5DVElPTl9fLCBfX1ZBX0FSR1NfXykNCisjZWxzZQ0KKwkjZGVmaW5lIFRSQUNFKC4uLikgKCh2b2lkKTApDQorI2VuZGlmDQorDQorI2lmbmRlZiBOREVCVUcNCisJI2RlZmluZSBVTklNUExFTUVOVEVEKCkge3RyYWNlKCJcdCEgVW5pbXBsZW1lbnRlZDogJXMoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgQVNTRVJUKGZhbHNlKTt9DQorI2Vsc2UNCisJI2RlZmluZSBVTklNUExFTUVOVEVEKCkgKCh2b2lkKTApDQorI2VuZGlmDQorDQorI2lmbmRlZiBOREVCVUcNCisJI2RlZmluZSBOT0lOVEVSRkFDRShpaWQpIF9OT0lOVEVSRkFDRShfX0ZVTkNUSU9OX18sIGlpZCkNCisNCisJaW5saW5lIGxvbmcgX05PSU5URVJGQUNFKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBJSUQgJmlpZCkNCisJew0KKwkJdHJhY2UoIlx0ISBObyBpbnRlcmZhY2UgezB4JTAuOFgsIDB4JTAuNFgsIDB4JTAuNFgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlh9IGZvciAlc1xuIiwgaWlkLkRhdGExLCBpaWQuRGF0YTIsIGlpZC5EYXRhMywgaWlkLkRhdGE0WzBdLCBpaWQuRGF0YTRbMV0sIGlpZC5EYXRhNFsyXSwgaWlkLkRhdGE0WzNdLCBpaWQuRGF0YTRbNF0sIGlpZC5EYXRhNFs1XSwgaWlkLkRhdGE0WzZdLCBpaWQuRGF0YTRbN10sIGZ1bmN0aW9uKTsNCisNCisJCXJldHVybiAgRV9OT0lOVEVSRkFDRTsNCisJfQ0KKyNlbHNlDQorCSNkZWZpbmUgTk9JTlRFUkZBQ0UoKSBFX05PSU5URVJGQUNFDQorI2VuZGlmDQorDQorI2lmbmRlZiBOREVCVUcNCisJI2RlZmluZSBBU1NFUlQoZXhwcmVzc2lvbikge2lmKCEoZXhwcmVzc2lvbikpIHRyYWNlKCJcdCEgQXNzZXJ0IGZhaWxlZCBpbiAlcyglZCk6ICIjZXhwcmVzc2lvbiJcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBhc3NlcnQoZXhwcmVzc2lvbik7fQ0KKyNlbHNlDQorCSNkZWZpbmUgQVNTRVJUIGFzc2VydA0KKyNlbmRpZg0KKw0KKyNlbmRpZiAgIC8vIERlYnVnX2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vRXhjZXB0aW9uSGFuZGxpbmcuaHBwIGIvc3JjL0NvbW1vbi9FeGNlcHRpb25IYW5kbGluZy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiYjhkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db21tb24vRXhjZXB0aW9uSGFuZGxpbmcuaHBwCkBAIC0wLDAgKzEsNCBAQAorI2lmIDEKKwkjZGVmaW5lIHRyeQorCSNkZWZpbmUgY2F0Y2goeCkgaWYoZmFsc2UpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vSGFsZi5jcHAgYi9zcmMvQ29tbW9uL0hhbGYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYTU0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvQ29tbW9uL0hhbGYuY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkhhbGYuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwloYWxmOjpoYWxmKGZsb2F0IGZwMzIpCisJeworICAgICAgICB1bnNpZ25lZCBpbnQgZnAzMmkgPSAqKHVuc2lnbmVkIGludCopJmZwMzI7CisgICAgICAgIHVuc2lnbmVkIGludCBzaWduID0gKGZwMzJpICYgMHg4MDAwMDAwMCkgPj4gMTY7CisgICAgICAgIHVuc2lnbmVkIGludCBhYnMgPSBmcDMyaSAmIDB4N0ZGRkZGRkY7CisKKyAgICAgICAgaWYoYWJzID4gMHg0N0ZGRUZGRikgICAvLyBJbmZpbml0eQorICAgICAgICB7CisgICAgICAgICAgICBmcDE2aSA9IHNpZ24gfCAweDdGRkY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihhYnMgPCAweDM4ODAwMDAwKSAgIC8vIERlbm9ybWFsCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYW50aXNzYSA9IChhYnMgJiAweDAwN0ZGRkZGKSB8IDB4MDA4MDAwMDA7ICAgCisgICAgICAgICAgICBpbnQgZSA9IDExMyAtIChhYnMgPj4gMjMpOworCisgICAgICAgICAgICBpZihlIDwgMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWJzID0gbWFudGlzc2EgPj4gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhYnMgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcDE2aSA9IHNpZ24gfCAoYWJzICsgMHgwMDAwMEZGRiArICgoYWJzID4+IDEzKSAmIDEpKSA+PiAxMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwMTZpID0gc2lnbiB8IChhYnMgKyAweEM4MDAwMDAwICsgMHgwMDAwMEZGRiArICgoYWJzID4+IDEzKSAmIDEpKSA+PiAxMzsKKyAgICAgICAgfQorCX0KKworCWhhbGY6Om9wZXJhdG9yIGZsb2F0KCkgY29uc3QKKwl7CisJCXVuc2lnbmVkIGludCBmcDMyaTsKKworCQlpbnQgcyA9IChmcDE2aSA+PiAxNSkgJiAweDAwMDAwMDAxOworCQlpbnQgZSA9IChmcDE2aSA+PiAxMCkgJiAweDAwMDAwMDFGOworCQlpbnQgbSA9ICBmcDE2aSAgICAgICAgJiAweDAwMDAwM0ZGOworCisJCWlmKGUgPT0gMCkKKwkJeworCQkJaWYobSA9PSAwKQorCQkJeworCQkJCWZwMzJpID0gcyA8PCAzMTsKKwkJCQorCQkJCXJldHVybiAoZmxvYXQmKWZwMzJpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXdoaWxlKCEobSAmIDB4MDAwMDA0MDApKQorCQkJCXsKKwkJCQkJbSA8PD0gMTsKKwkJCQkJZSAtPSAgMTsKKwkJCQl9CisKKwkJCQllICs9IDE7CisJCQkJbSAmPSB+MHgwMDAwMDQwMDsKKwkJCX0KKwkJfQorCisJCWUgPSBlICsgKDEyNyAtIDE1KTsKKwkJbSA9IG0gPDwgMTM7CisKKwkJZnAzMmkgPSAocyA8PCAzMSkgfCAoZSA8PCAyMykgfCBtOworCisJCXJldHVybiAoZmxvYXQmKWZwMzJpOworCX0KKworCWhhbGYgJmhhbGY6Om9wZXJhdG9yPShoYWxmIGgpCisJeworCQlmcDE2aSA9IGguZnAxNmk7CisJCQorCQlyZXR1cm4gKnRoaXM7CisJfQorCisKKwloYWxmICZoYWxmOjpvcGVyYXRvcj0oZmxvYXQgZikKKwl7CisJCSp0aGlzID0gaGFsZihmKTsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0NvbW1vbi9IYWxmLmhwcCBiL3NyYy9Db21tb24vSGFsZi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5YWMyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db21tb24vSGFsZi5ocHAKQEAgLTAsMCArMSwzNCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgc3dfSGFsZl9ocHANCisjZGVmaW5lIHN3X0hhbGZfaHBwDQorDQorI2luY2x1ZGUgPGlvc3RyZWFtPg0KKw0KK25hbWVzcGFjZSBzdw0KK3sNCisJY2xhc3MgaGFsZg0KKwl7DQorCXB1YmxpYzoNCisJCWV4cGxpY2l0IGhhbGYoZmxvYXQgZik7DQorDQorCQlvcGVyYXRvciBmbG9hdCgpIGNvbnN0Ow0KKw0KKwkJaGFsZiAmb3BlcmF0b3I9KGhhbGYgaCk7DQorCQloYWxmICZvcGVyYXRvcj0oZmxvYXQgZik7DQorDQorCXByaXZhdGU6DQorCQl1bnNpZ25lZCBzaG9ydCBmcDE2aTsNCisJfTsNCit9DQorDQorI2VuZGlmICAgLy8gc3dfSGFsZl9ocHANCmRpZmYgLS1naXQgYS9zcmMvQ29tbW9uL01hdGguY3BwIGIvc3JjL0NvbW1vbi9NYXRoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGEzZmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0NvbW1vbi9NYXRoLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJNYXRoLmhwcCIKKworI2luY2x1ZGUgIkNQVUlELmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJY29uc3QgZmxvYXQgTV9QSSAgICAgPSAgMy4xNDE1OTI2NWUrMGY7CisJY29uc3QgZmxvYXQgTV9QSV8xODAgPSAgMS43NDUzMjkyNWUtMmY7CisJY29uc3QgZmxvYXQgTV8xODBfUEkgPSAgNS43Mjk1Nzc5NWUrMWY7CisJY29uc3QgZmxvYXQgTV8yUEkgICAgPSAgNi4yODMxODUzMGUrMGY7CisJY29uc3QgZmxvYXQgTV9QSV8yICAgPSAgMS41NzA3OTYzMmUrMGY7CisKKwlpbnQ2NF90IEZOVl8xKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKQorCXsKKwkJaW50NjRfdCBoYXNoID0gMHhDQkYyOUNFNDg0MjIyMzI1OworICAgCisJCWZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXsKKyAgIAkJCWhhc2ggPSBoYXNoICogMTA5OTUxMTYyODIxMTsKKyAgIAkJCWhhc2ggPSBoYXNoIF4gZGF0YVtpXTsKKwkJfQorCisJCXJldHVybiBoYXNoOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vTWF0aC5ocHAgYi9zcmMvQ29tbW9uL01hdGguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNDJhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvQ29tbW9uL01hdGguaHBwCkBAIC0wLDAgKzEsMzk5IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgc3dfTWF0aF9ocHAKKyNkZWZpbmUgc3dfTWF0aF9ocHAKKworI2luY2x1ZGUgIlR5cGVzLmhwcCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxpbnRyaW4uaD4KKworbmFtZXNwYWNlIHN3Cit7CisJZXh0ZXJuIGNvbnN0IGZsb2F0IE1fUEk7CisJZXh0ZXJuIGNvbnN0IGZsb2F0IE1fUElfMTgwOworCWV4dGVybiBjb25zdCBmbG9hdCBNXzE4MF9QSTsKKwlleHRlcm4gY29uc3QgZmxvYXQgTV8yUEk7CisJZXh0ZXJuIGNvbnN0IGZsb2F0IE1fUElfMjsKKworCWlubGluZSBmbG9hdCByYWQoZmxvYXQgZGVnKQorCXsKKwkJcmV0dXJuIGRlZyAqIE1fUElfMTgwOworCX0KKworCWlubGluZSBmbG9hdCBkZWcoZmxvYXQgcmFkKQorCXsKKwkJcmV0dXJuIHJhZCAqIE1fMTgwX1BJOworCX0KKworCWlubGluZSBmbG9hdCBzaW4oZmxvYXQgeCkKKwl7CisJCXJldHVybiBzaW5mKHgpOworCX0KKworCWlubGluZSBmbG9hdCBhc2luKGZsb2F0IHgpCisJeworCQlyZXR1cm4gYXNpbmYoeCk7CisJfQorCisJaW5saW5lIGZsb2F0IHNpbmgoZmxvYXQgeCkKKwl7CisJCXJldHVybiBzaW5oZih4KTsKKwl9CisKKwlpbmxpbmUgZmxvYXQgY29zKGZsb2F0IHgpCisJeworCQlyZXR1cm4gY29zZih4KTsKKwl9CisKKwlpbmxpbmUgZmxvYXQgYWNvcyhmbG9hdCB4KQorCXsKKwkJcmV0dXJuIGFjb3NmKHgpOworCX0KKworCWlubGluZSBmbG9hdCBjb3NoKGZsb2F0IHgpCisJeworCQlyZXR1cm4gY29zaGYoeCk7CisJfQorCisJaW5saW5lIGZsb2F0IHRhbihmbG9hdCB4KQorCXsKKwkJcmV0dXJuIHRhbmYoeCk7CisJfQorCisJaW5saW5lIGZsb2F0IGNvdChmbG9hdCB4KQorCXsKKwkJcmV0dXJuIDEuMGYgLyB0YW4oeCk7CisJfQorCisJaW5saW5lIGZsb2F0IGF0YW4oZmxvYXQgeCkKKwl7CisJCXJldHVybiBhdGFuZih4KTsKKwl9CisKKwlpbmxpbmUgZmxvYXQgdGFuaChmbG9hdCB4KQorCXsKKwkJcmV0dXJuIHRhbmhmKHgpOworCX0KKworCWlubGluZSBmbG9hdCBzcXJ0KGZsb2F0IHgpCisJeworCQlyZXR1cm4gc3FydGYoeCk7CisJfQorCisJaW5saW5lIGZsb2F0IGV4cChmbG9hdCB4KQorCXsKKwkJcmV0dXJuIGV4cGYoeCk7CisJfQorCisJaW5saW5lIGZsb2F0IGV4cDIoZmxvYXQgeCkKKwl7CisJCXN0YXRpYyBjb25zdCBmbG9hdCBsbjIgPSBsb2dmKDIpOworCisJCXJldHVybiBleHAobG4yICogeCk7CisJfQorCisJaW5saW5lIGZsb2F0IHBvdyhmbG9hdCB4LCBmbG9hdCB5KQorCXsKKwkJcmV0dXJuIHBvd2YoeCwgeSk7CisJfQorCisJaW5saW5lIGZsb2F0IHBvdzIoZmxvYXQgeCkKKwl7CisJCXJldHVybiB4ICogeDsKKwl9CisKKwlpbmxpbmUgZmxvYXQgYWJzKGZsb2F0IHgpCisJeworCQlyZXR1cm4gZmFic2YoeCk7CisJfQorCisJI3VuZGVmIG1pbgorCSN1bmRlZiBtYXgKKworCWlubGluZSBmbG9hdCBtYXgoZmxvYXQgYSwgZmxvYXQgYikKKwl7CisJCXJldHVybiBhID4gYiA/IGEgOiBiOworCX0KKworCWlubGluZSBmbG9hdCBtaW4oZmxvYXQgYSwgZmxvYXQgYikgCisJeworCQlyZXR1cm4gYSA8IGIgPyBhIDogYjsKKwl9CisKKwlpbmxpbmUgZmxvYXQgbWF4KGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpCisJeworCQlyZXR1cm4gbWF4KG1heChhLCBiKSwgYyk7CisJfQorCisJaW5saW5lIGZsb2F0IG1pbihmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKQorCXsKKwkJcmV0dXJuIG1pbihtaW4oYSwgYiksIGMpOworCX0KKworCWlubGluZSBmbG9hdCBtYXgoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYywgZmxvYXQgZCkKKwl7CisJCXJldHVybiBtYXgobWF4KGEsIGIpLCBtYXgoYywgZCkpOworCX0KKworCWlubGluZSBmbG9hdCBtaW4oZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYywgZmxvYXQgZCkKKwl7CisJCXJldHVybiBtaW4obWluKGEsIGIpLCBtaW4oYywgZCkpOworCX0KKworCWlubGluZSBpbnQgbWF4KGludCBhLCBpbnQgYikKKwl7CisJCXJldHVybiBhID4gYiA/IGEgOiBiOworCX0KKworCWlubGluZSBpbnQgbWluKGludCBhLCBpbnQgYikgCisJeworCQlyZXR1cm4gYSA8IGIgPyBhIDogYjsKKwl9CisKKwlpbmxpbmUgaW50IG1heChpbnQgYSwgaW50IGIsIGludCBjKQorCXsKKwkJcmV0dXJuIG1heChtYXgoYSwgYiksIGMpOworCX0KKworCWlubGluZSBpbnQgbWluKGludCBhLCBpbnQgYiwgaW50IGMpCisJeworCQlyZXR1cm4gbWluKG1pbihhLCBiKSwgYyk7CisJfQorCisJaW5saW5lIGludCBtYXgoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpCisJeworCQlyZXR1cm4gbWF4KG1heChhLCBiKSwgbWF4KGMsIGQpKTsKKwl9CisKKwlpbmxpbmUgaW50IG1pbihpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkKKwl7CisJCXJldHVybiBtaW4obWluKGEsIGIpLCBtaW4oYywgZCkpOworCX0KKworCXRlbXBsYXRlPGNsYXNzIFQ+CisJaW5saW5lIHZvaWQgc3dhcChUICZhLCBUICZiKQorCXsKKwkJVCB0ID0gYTsKKwkJYSA9IGI7CisJCWIgPSB0OworCX0KKworCWlubGluZSBpbnQgaXJvdW5kKGZsb2F0IHgpCisJeworCQlyZXR1cm4gKGludClmbG9vcih4ICsgMC41Zik7CisJLy8JcmV0dXJuIF9tbV9jdnRzc19zaTMyKF9tbV9sb2FkX3NzKCZ4KSk7ICAgLy8gRklYTUU6IERlbWFuZHMgU1NFIHN1cHBvcnQKKwl9CisKKwlpbmxpbmUgaW50IGlmbG9vcihmbG9hdCB4KQorCXsKKwkJcmV0dXJuIChpbnQpZmxvb3IoeCk7CisJfQorCQorCWlubGluZSBpbnQgY2VpbEZpeDQoaW50IHgpCisJeworCQlyZXR1cm4gKHggKyAweEYpICYgMHhGRkZGRkZGMDsKKwl9CisKKwlpbmxpbmUgaW50IGNlaWxJbnQ0KGludCB4KQorCXsKKwkJcmV0dXJuICh4ICsgMHhGKSA+PiA0OworCX0KKworCSNkZWZpbmUgQklUUyh4KSAgICAoIFwKKwkhISh4ICYgMHg4MDAwMDAwMCkgKyBcCisJISEoeCAmIDB4QzAwMDAwMDApICsgXAorCSEhKHggJiAweEUwMDAwMDAwKSArIFwKKwkhISh4ICYgMHhGMDAwMDAwMCkgKyBcCisJISEoeCAmIDB4RjgwMDAwMDApICsgXAorCSEhKHggJiAweEZDMDAwMDAwKSArIFwKKwkhISh4ICYgMHhGRTAwMDAwMCkgKyBcCisJISEoeCAmIDB4RkYwMDAwMDApICsgXAorCSEhKHggJiAweEZGODAwMDAwKSArIFwKKwkhISh4ICYgMHhGRkMwMDAwMCkgKyBcCisJISEoeCAmIDB4RkZFMDAwMDApICsgXAorCSEhKHggJiAweEZGRjAwMDAwKSArIFwKKwkhISh4ICYgMHhGRkY4MDAwMCkgKyBcCisJISEoeCAmIDB4RkZGQzAwMDApICsgXAorCSEhKHggJiAweEZGRkUwMDAwKSArIFwKKwkhISh4ICYgMHhGRkZGMDAwMCkgKyBcCisJISEoeCAmIDB4RkZGRjgwMDApICsgXAorCSEhKHggJiAweEZGRkZDMDAwKSArIFwKKwkhISh4ICYgMHhGRkZGRTAwMCkgKyBcCisJISEoeCAmIDB4RkZGRkYwMDApICsgXAorCSEhKHggJiAweEZGRkZGODAwKSArIFwKKwkhISh4ICYgMHhGRkZGRkMwMCkgKyBcCisJISEoeCAmIDB4RkZGRkZFMDApICsgXAorCSEhKHggJiAweEZGRkZGRjAwKSArIFwKKwkhISh4ICYgMHhGRkZGRkY4MCkgKyBcCisJISEoeCAmIDB4RkZGRkZGQzApICsgXAorCSEhKHggJiAweEZGRkZGRkUwKSArIFwKKwkhISh4ICYgMHhGRkZGRkZGMCkgKyBcCisJISEoeCAmIDB4RkZGRkZGRjgpICsgXAorCSEhKHggJiAweEZGRkZGRkZDKSArIFwKKwkhISh4ICYgMHhGRkZGRkZGRSkgKyBcCisJISEoeCAmIDB4RkZGRkZGRkYpKQorCisJaW5saW5lIGludCBleHAyKGludCB4KQorCXsKKwkJcmV0dXJuIDEgPDwgeDsKKwl9CisKKwlpbmxpbmUgdW5zaWduZWQgbG9uZyBsb2cyKGludCB4KQorCXsKKwkJdW5zaWduZWQgbG9uZyB5OworCisJCV9CaXRTY2FuUmV2ZXJzZSgmeSwgeCk7CisKKwkJcmV0dXJuIHk7CisJfQorCisJaW5saW5lIGludCBpbG9nMihmbG9hdCB4KQorCXsKKwkJdW5zaWduZWQgaW50IHkgPSAqKHVuc2lnbmVkIGludCopJng7CisKKwkJcmV0dXJuICgoeSAmIDB4N0Y4MDAwMDApID4+IDIzKSAtIDEyNzsKKwl9CisKKwlpbmxpbmUgZmxvYXQgbG9nMihmbG9hdCB4KQorCXsKKwkJdW5zaWduZWQgaW50IHkgPSAoKih1bnNpZ25lZCBpbnQqKSZ4KTsKKworCQlyZXR1cm4gKGZsb2F0KSgoeSAmIDB4N0Y4MDAwMDApID4+IDIzKSAtIDEyNyArIChmbG9hdCkoKCoodW5zaWduZWQgaW50KikmeCkgJiAweDAwN0ZGRkZGKSAvIDE2Nzc3MjE2LjBmOworCX0KKworCWlubGluZSBib29sIGlzUG93MihpbnQgeCkKKwl7CisJCXJldHVybiAoeCAmIC14KSA9PSB4OworCX0KKworCXRlbXBsYXRlPGNsYXNzIFQ+CisJaW5saW5lIFQgY2xhbXAoVCB4LCBUIGEsIFQgYikKKwl7CisJCWlmKHggPCBhKSB4ID0gYTsKKwkJaWYoeCA+IGIpIHggPSBiOworCisJCXJldHVybiB4OworCX0KKworCWlubGluZSBpbnQgY2VpbFBvdzIoaW50IHgpCisJeworCQlpbnQgaSA9IDE7CisKKwkJd2hpbGUoaSA8IHgpCisJCXsKKwkJCWkgPDw9IDE7CisJCX0KKworCQlyZXR1cm4gaTsKKwl9CisKKwlpbmxpbmUgaW50IGZsb29yRGl2KGludCBhLCBpbnQgYikKKwl7CisJCXJldHVybiBhIC8gYiArICgoYSAlIGIpID4+IDMxKTsKKwl9CisKKwlpbmxpbmUgaW50IGZsb29yTW9kKGludCBhLCBpbnQgYikKKwl7CisJCWludCByID0gYSAlIGI7CisJCXJldHVybiByICsgKChyID4+IDMxKSAmIGIpOworCX0KKworCWlubGluZSBpbnQgY2VpbERpdihpbnQgYSwgaW50IGIpCisJeworCQlyZXR1cm4gYSAvIGIgLSAoLShhICUgYikgPj4gMzEpOworCX0KKworCWlubGluZSBpbnQgY2VpbE1vZChpbnQgYSwgaW50IGIpCisJeworCQlpbnQgciA9IGEgJSBiOworCQlyZXR1cm4gciAtICgoLXIgPj4gMzEpICYgYik7CisJfQorCisJdGVtcGxhdGU8Y29uc3QgaW50IG4+CisJaW5saW5lIHVuc2lnbmVkIGludCB1bm9ybShmbG9hdCB4KQorCXsKKwkJY29uc3QgdW5zaWduZWQgaW50IG1heCA9IDB4RkZGRkZGRkYgPj4gKDMyIC0gbik7CisKKwkJaWYoeCA+IDEpCisJCXsKKwkJCXJldHVybiBtYXg7CisJCX0KKwkJZWxzZSBpZih4IDwgMCkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gKHVuc2lnbmVkIGludCkobWF4ICogeCArIDAuNWYpOworCQl9CisJfQorCisJdGVtcGxhdGU8Y29uc3QgaW50IG4+CisJaW5saW5lIGludCBzbm9ybShmbG9hdCB4KQorCXsKKwkJY29uc3QgdW5zaWduZWQgaW50IG1pbiA9IDB4ODAwMDAwMDAgPj4gKDMyIC0gbik7CisJCWNvbnN0IHVuc2lnbmVkIGludCBtYXggPSAweEZGRkZGRkZGID4+ICgzMiAtIG4gKyAxKTsKKwkJY29uc3QgdW5zaWduZWQgaW50IHJhbmdlID0gMHhGRkZGRkZGRiA+PiAoMzIgLSBuKTsKKworCQlpZih4ID4gMCkKKwkJeworCQkJaWYoeCA+IDEpCisJCQl7CisJCQkJcmV0dXJuIG1heDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gKGludCkobWF4ICogeCArIDAuNWYpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoeCA8IC0xKQorCQkJeworCQkJCXJldHVybiBtaW47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIChpbnQpKG1heCAqIHggLSAwLjVmKSAmIHJhbmdlOworCQkJfQorCQl9CisJfQorCisJaW5saW5lIGZsb2F0IHNSR0J0b0xpbmVhcihmbG9hdCBjKQorCXsKKwkJaWYoYyA8PSAwLjA0MDQ1ZikKKwkJeworCQkJcmV0dXJuIGMgKiAwLjA3NzM5OTM4ZjsgICAvLyAxLjBmIC8gMTIuOTJmOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIHBvd2YoKGMgKyAwLjA1NWYpICogMC45NDc4NjczZiwgMi40Zik7ICAgLy8gMS4wZiAvIDEuMDU1ZgorCQl9CisJfQorCisJaW5saW5lIGZsb2F0IGxpbmVhclRvU1JHQihmbG9hdCBjKQorCXsKKwkJaWYoYyA8PSAwLjAwMzEzMDhmKQorCQl7CisJCQlyZXR1cm4gYyAqIDEyLjkyZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiAxLjA1NWYgKiBwb3dmKGMsIDAuNDE2NjY2N2YpIC0gMC4wNTVmOyAgIC8vIDEuMGYgLyAyLjRmCisJCX0KKwl9CisKKwlpbnQ2NF90IEZOVl8xKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKTsgICAvLyBGb3dsZXItTm9sbC1WbyBoYXNoIGZ1bmN0aW9uCit9CisKKyNlbmRpZiAgIC8vIHN3X01hdGhfaHBwCmRpZmYgLS1naXQgYS9zcmMvQ29tbW9uL01lbW9yeS5jcHAgYi9zcmMvQ29tbW9uL01lbW9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlZWJkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db21tb24vTWVtb3J5LmNwcApAQCAtMCwwICsxLDExOCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiTWVtb3J5LmhwcCIKKworI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2lmIGRlZmluZWQoX1dJTjMyKQorCSNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorCQkjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKwkjZW5kaWYKKwkjaW5jbHVkZSA8d2luZG93cy5oPgorI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisJI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZWxzZQorCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtCisjZW5kaWYKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorCisjdW5kZWYgYWxsb2NhdGUKKyN1bmRlZiBkZWFsbG9jYXRlCisjdW5kZWYgYWxsb2NhdGVaZXJvCisjdW5kZWYgZGVhbGxvY2F0ZVplcm8KKwordm9pZCAqYWxsb2NhdGUoc2l6ZV90IGJ5dGVzKQoreworCXJldHVybiBfYWxpZ25lZF9tYWxsb2MoYnl0ZXMsIDE2KTsKK30KKwordm9pZCAqYWxsb2NhdGVaZXJvKHNpemVfdCBieXRlcykKK3sKKwl2b2lkICptZW1vcnkgPSBfYWxpZ25lZF9tYWxsb2MoYnl0ZXMsIDE2KTsKKworCW1lbXNldChtZW1vcnksIDAsIGJ5dGVzKTsKKworCXJldHVybiBtZW1vcnk7Cit9CisKK3ZvaWQgZGVhbGxvY2F0ZSh2b2lkICptZW1vcnkpCit7CisJX2FsaWduZWRfZnJlZShtZW1vcnkpOworfQorCit2b2lkICphbGxvY2F0ZUV4ZWN1dGFibGUoc2l6ZV90IGJ5dGVzKQoreworCVNZU1RFTV9JTkZPIHN5c3RlbUluZm87CisJR2V0U3lzdGVtSW5mbygmc3lzdGVtSW5mbyk7CisKKwlyZXR1cm4gX2FsaWduZWRfbWFsbG9jKGJ5dGVzLCBzeXN0ZW1JbmZvLmR3UGFnZVNpemUpOworfQorCit2b2lkIG1hcmtFeGVjdXRhYmxlKHZvaWQgKm1lbW9yeSwgc2l6ZV90IGJ5dGVzKQoreworCSNpZiBkZWZpbmVkKF9XSU4zMikKKwkJdW5zaWduZWQgbG9uZyBvbGRQcm90ZWN0aW9uOworCQlWaXJ0dWFsUHJvdGVjdChtZW1vcnksIGJ5dGVzLCBQQUdFX0VYRUNVVEVfUkVBRCwgJm9sZFByb3RlY3Rpb24pOworCSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorCQltcHJvdGVjdChtZW1vcnksIGJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDKTsKKwkjZWxzZQorCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQorCSNlbmRpZgorfQorCit2b2lkIGRlYWxsb2NhdGVFeGVjdXRhYmxlKHZvaWQgKm1lbW9yeSwgc2l6ZV90IGJ5dGVzKQoreworCSNpZiBkZWZpbmVkKF9XSU4zMikKKwkJdW5zaWduZWQgbG9uZyBvbGRQcm90ZWN0aW9uOworCQlWaXJ0dWFsUHJvdGVjdChtZW1vcnksIGJ5dGVzLCBQQUdFX1JFQURXUklURSwgJm9sZFByb3RlY3Rpb24pOworCSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorCQltcHJvdGVjdChtZW1vcnksIGJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKKwkjZWxzZQorCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQorCSNlbmRpZgorCisJX2FsaWduZWRfZnJlZShtZW1vcnkpOworfQorCit2b2lkICphbGxvY2F0ZShzaXplX3QgYnl0ZXMsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uKQoreworCXRyYWNlKCJbMHglMC44WF0lcyguLi4pXG4iLCAweEZGRkZGRkZGLCBmdW5jdGlvbik7CisKKwl2b2lkICptZW1vcnkgPSBhbGxvY2F0ZShieXRlcyk7CisKKwl0cmFjZSgiXHQweCUwLjhYID0gYWxsb2NhdGUoJWQpXG4iLCBtZW1vcnksIGJ5dGVzKTsKKworCXJldHVybiBtZW1vcnk7Cit9CisKK3ZvaWQgKmFsbG9jYXRlWmVybyhzaXplX3QgYnl0ZXMsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uKQoreworCXRyYWNlKCJbMHglMC44WF0lcyguLi4pXG4iLCAweEZGRkZGRkZGLCBmdW5jdGlvbik7CisKKwl2b2lkICptZW1vcnkgPSBhbGxvY2F0ZVplcm8oYnl0ZXMpOworCisJdHJhY2UoIlx0MHglMC44WCA9IGFsbG9jYXRlWmVybyglZClcbiIsIG1lbW9yeSwgYnl0ZXMpOworCisJcmV0dXJuIG1lbW9yeTsKK30KKwordm9pZCBkZWFsbG9jYXRlKHZvaWQgKm1lbW9yeSwgY29uc3QgY2hhciAqZnVuY3Rpb24pCit7CisJaWYobWVtb3J5KQorCXsKKwkJdHJhY2UoIlsweCUwLjhYXSVzKC4uLilcbiIsIDB4RkZGRkZGRkYsIGZ1bmN0aW9uKTsKKwkJdHJhY2UoIlx0ZGVhbGxvY2F0ZSgweCUwLjhYKVxuIiwgbWVtb3J5KTsKKworCQlkZWFsbG9jYXRlKG1lbW9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0NvbW1vbi9NZW1vcnkuaHBwIGIvc3JjL0NvbW1vbi9NZW1vcnkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMTExNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvQ29tbW9uL01lbW9yeS5ocHAKQEAgLTAsMCArMSwzNyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgTWVtb3J5X2hwcA0KKyNkZWZpbmUgTWVtb3J5X2hwcA0KKw0KK3ZvaWQgKmFsbG9jYXRlKHNpemVfdCBieXRlcyk7DQordm9pZCAqYWxsb2NhdGVaZXJvKHNpemVfdCBieXRlcyk7DQordm9pZCBkZWFsbG9jYXRlKHZvaWQgKm1lbW9yeSk7DQorDQordm9pZCAqYWxsb2NhdGVFeGVjdXRhYmxlKHNpemVfdCBieXRlcyk7ICAgLy8gQWxsb2NhdGVzIG1lbW9yeSB0aGF0IGNhbiBiZSBtYWRlIGV4ZWN1dGFibGUgdXNpbmcgbWFya0V4ZWN1dGFibGUoKQ0KK3ZvaWQgbWFya0V4ZWN1dGFibGUodm9pZCAqbWVtb3J5LCBzaXplX3QgYnl0ZXMpOw0KK3ZvaWQgZGVhbGxvY2F0ZUV4ZWN1dGFibGUodm9pZCAqbWVtb3J5LCBzaXplX3QgYnl0ZXMpOw0KKw0KK3ZvaWQgKmFsbG9jYXRlKHNpemVfdCBieXRlcywgY29uc3QgY2hhciAqZnVuY3Rpb24pOw0KK3ZvaWQgKmFsbG9jYXRlWmVybyhzaXplX3QgYnl0ZXMsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uKTsNCit2b2lkIGRlYWxsb2NhdGUodm9pZCAqbWVtb3J5LCBjb25zdCBjaGFyICpmdW5jdGlvbik7DQorDQorI2lmbmRlZiBOREVCVUcNCisJI2RlZmluZSBhbGxvY2F0ZShieXRlcykgYWxsb2NhdGUoKGJ5dGVzKSwgX19GVU5DVElPTl9fKQ0KKwkjZGVmaW5lIGFsbG9jYXRlWmVybyhieXRlcykgYWxsb2NhdGVaZXJvKChieXRlcyksIF9fRlVOQ1RJT05fXykNCisjZW5kaWYNCisNCisjaWZuZGVmIE5ERUJVRw0KKwkjZGVmaW5lIGRlYWxsb2NhdGUobWVtb3J5KSBkZWFsbG9jYXRlKChtZW1vcnkpLCBfX0ZVTkNUSU9OX18pDQorCSNkZWZpbmUgZGVhbGxvY2F0ZVplcm8obWVtb3J5KSBkZWFsbG9jYXRlWmVybygobWVtb3J5KSwgX19GVU5DVElPTl9fKQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAgIC8vIE1lbW9yeV9ocHANCmRpZmYgLS1naXQgYS9zcmMvQ29tbW9uL01ldGFNYWNyby5ocHAgYi9zcmMvQ29tbW9uL01ldGFNYWNyby5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiOTY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db21tb24vTWV0YU1hY3JvLmhwcApAQCAtMCwwICsxLDk1IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgc3dfTWV0YU1hY3JvX2hwcAorI2RlZmluZSBzd19NZXRhTWFjcm9faHBwCisKKy8vICBEaXNhYmxlcyB0aGUgImlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnMjU1JyBjaGFyYWN0ZXJzIGluIHRoZSBicm93c2VyIGluZm9ybWF0aW9uIiB3YXJuaW5nCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDc4NikKKworbmFtZXNwYWNlIE1ldGEKK3sKKyNkZWZpbmUgTUVUQV9BU1NFUlQoY29uZGl0aW9uKSB0eXBlZGVmIGludCBDT01QSUxFX1RJTUVfQVNTRVJUXyMjX19MSU5FX19bc3RhdGljX2Nhc3Q8Ym9vbD4oY29uZGl0aW9uKSA/IDEgOiAtMV0KKworCXRlbXBsYXRlPGNsYXNzIFQ+CisJc3RydWN0IElzVm9pZAorCXsKKwkJZW51bSB7cmVzID0gZmFsc2V9OworCX07CisKKwl0ZW1wbGF0ZTw+CisJc3RydWN0IElzVm9pZDx2b2lkPgorCXsKKwkJZW51bSB7cmVzID0gdHJ1ZX07CisJfTsKKworI2RlZmluZSBNRVRBX0lTX1ZPSUQoVCkgTWV0YTo6SXNWb2lkPFQ+OjpyZXMKKworCXRlbXBsYXRlPGJvb2w+CisJc3RydWN0IFNlbGVjdAorCXsKKwkJdGVtcGxhdGU8Y2xhc3MgVDAsIGNsYXNzIFQxPgorCQlzdHJ1Y3QgVHlwZQorCQl7CisJCQl0eXBlZGVmIFQxIFJlczsKKwkJfTsKKwl9OworCisJdGVtcGxhdGU8PgorCXN0cnVjdCBTZWxlY3Q8dHJ1ZT4KKwl7CisJCXRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMT4KKwkJc3RydWN0IFR5cGUKKwkJeworCQkJdHlwZWRlZiBUMCBSZXM7CisJCX07CisJfTsKKworI2RlZmluZSBNRVRBX1NFTEVDVChpLCBUMCwgVDEpIE1ldGE6OlNlbGVjdDxpPjo6dGVtcGxhdGUgVHlwZTxUMCwgVDE+OjpSZXMKKworCXRlbXBsYXRlPGNsYXNzIEIwLCBjbGFzcyBCMT4KKwlzdHJ1Y3QgSW5oZXJpdCA6IEIwLCBCMQorCXsKKwl9OworCisjZGVmaW5lIE1FVEFfSU5IRVJJVChCMCwgQjEpIE1ldGE6OkluaGVyaXQ8QjAsIEIxPgorCisJdGVtcGxhdGU8Y2xhc3MgQjAsIGNsYXNzIEIxPgorCWNsYXNzIENhdGVuYXRlCisJeworCQl0eXBlZGVmIHR5cGVuYW1lIE1FVEFfU0VMRUNUKE1FVEFfSVNfVk9JRChCMCksIEIxLCBCMCkgVDA7CisJCXR5cGVkZWYgdHlwZW5hbWUgTUVUQV9TRUxFQ1QoTUVUQV9JU19WT0lEKEIwKSwgdm9pZCwgQjEpIFQxOworCisJcHVibGljOgorCQl0eXBlZGVmIHR5cGVuYW1lIE1FVEFfSU5IRVJJVChUMCwgVDEpIFQwMTsKKwkJdHlwZWRlZiB0eXBlbmFtZSBNRVRBX1NFTEVDVChNRVRBX0lTX1ZPSUQoVDEpLCBUMCwgVDAxKSBSZXM7CisKKwlwcml2YXRlOgorCQl0eXBlZGVmIHR5cGVuYW1lIE1FVEFfU0VMRUNUKE1FVEFfSVNfVk9JRChUMSksIGludCwgVDEpIENoZWNrZWRUMTsKKworCQlNRVRBX0FTU0VSVChNRVRBX0lTX1ZPSUQoVDEpIHx8IHNpemVvZihSZXMpID09IHNpemVvZihUMCkgKyBzaXplb2YoQ2hlY2tlZFQxKSk7CisJfTsKKworI2RlZmluZSBNRVRBX0NBVEVOQVRFKEIwLCBCMSkgTWV0YTo6Q2F0ZW5hdGU8QjAsIEIxPjo6UmVzCisKKwl0ZW1wbGF0ZTxib29sIGNvbmRpdGlvbiwgY2xhc3MgQjAsIGNsYXNzIEIxPgorCWNsYXNzIENvbmRpdGlvbmFsSW5oZXJpdAorCXsKKwkJdHlwZWRlZiB0eXBlbmFtZSBNRVRBX0NBVEVOQVRFKEIwLCBCMSkgTWV0YUluaGVyaXQ7CisKKwlwdWJsaWM6CisJCXR5cGVkZWYgdHlwZW5hbWUgTUVUQV9TRUxFQ1QoY29uZGl0aW9uLCBNZXRhSW5oZXJpdCwgQjApIFJlczsKKwl9OworCisjZGVmaW5lIE1FVEFfQ09ORElUSU9OQUxfSU5IRVJJVChjb25kaXRpb24sIEIwLCBCMSkgTWV0YTo6Q29uZGl0aW9uYWxJbmhlcml0PGNvbmRpdGlvbiwgQjAsIEIxPjo6UmVzCit9CisKKyNlbmRpZiAgIC8vIHN3X01ldGFNYWNyb19ocHAKZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vTXV0ZXhMb2NrLmhwcCBiL3NyYy9Db21tb24vTXV0ZXhMb2NrLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2RlZmEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0NvbW1vbi9NdXRleExvY2suaHBwCkBAIC0wLDAgKzEsMTIyIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZiBzd19NdXRleExvY2tfaHBwDQorI2RlZmluZSBzd19NdXRleExvY2tfaHBwDQorDQorI2luY2x1ZGUgIlRocmVhZC5ocHAiDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwljbGFzcyBCYWNrb2ZmTG9jaw0KKwl7DQorCXB1YmxpYzoNCisJCUJhY2tvZmZMb2NrKCkNCisJCXsNCisJCQltdXRleCA9IDA7DQorCQl9DQorDQorCQlib29sIGF0dGVtcHRMb2NrKCkNCisJCXsNCisJCQlpZighaXNMb2NrZWQoKSkNCisJCQl7DQorCQkJCWlmKGF0b21pY0V4Y2hhbmdlKCZtdXRleCwgMSkgPT0gMCkNCisJCQkJew0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCX0NCisJCQl9DQorDQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKw0KKwkJdm9pZCBsb2NrKCkNCisJCXsNCisJCQlpbnQgYmFja29mZiA9IDE7DQorDQorCQkJd2hpbGUoIWF0dGVtcHRMb2NrKCkpDQorCQkJew0KKwkJCQlpZihiYWNrb2ZmIDw9IDY0KQ0KKwkJCQl7DQorCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgYmFja29mZjsgaSsrKQ0KKwkJCQkJew0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJCW5vcCgpOw0KKwkJCQkJfQ0KKw0KKwkJCQkJYmFja29mZiAqPSAyOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJVGhyZWFkOjp5aWVsZCgpOw0KKw0KKwkJCQkJYmFja29mZiA9IDE7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKw0KKwkJdm9pZCB1bmxvY2soKQ0KKwkJew0KKwkJCW11dGV4ID0gMDsNCisJCX0NCisNCisJCWJvb2wgaXNMb2NrZWQoKQ0KKwkJew0KKwkJCXJldHVybiBtdXRleCAhPSAwOw0KKwkJfQ0KKw0KKwlwcml2YXRlOg0KKwkJLy8gRW5zdXJlIHRoYXQgdGhlIG11dGV4IHZhcmlhYmxlIGlzIG9uIGl0cyBvd24gNjQtYnl0ZSBjYWNoZSBsaW5lIHRvIGF2b2lkIGZhbHNlIHNoYXJpbmcNCisJCXZvbGF0aWxlIGludCBhWzE2XTsNCisJCXZvbGF0aWxlIGludCBtdXRleDsNCisJCXZvbGF0aWxlIGludCBiWzE1XTsNCisJfTsNCit9DQorDQorI2VuZGlmICAgLy8gc3dfTXV0ZXhMb2NrX2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vUmVzb3VyY2UuY3BwIGIvc3JjL0NvbW1vbi9SZXNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjNTc2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db21tb24vUmVzb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisKKyNpbmNsdWRlICJNZW1vcnkuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwlSZXNvdXJjZTo6UmVzb3VyY2UoaW50IGJ5dGVzKQorCXsKKwkJdW5ibG9jayA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisJCWJsb2NrZWQgPSAwOworCisJCWFjY2Vzc29yID0gUFVCTElDOworCQljb3VudCA9IDA7CisJCW9ycGhhbmVkID0gZmFsc2U7CisKKwkJYnVmZmVyID0gYWxsb2NhdGVaZXJvKGJ5dGVzKTsKKwl9CisKKwlSZXNvdXJjZTo6flJlc291cmNlKCkKKwl7CisgCQlkZWFsbG9jYXRlKGJ1ZmZlcik7CisJfQorCisJdm9pZCAqUmVzb3VyY2U6OmxvY2soQWNjZXNzb3IgY2xhaW1lcikKKwl7CisJCWNyaXRpY2FsU2VjdGlvbi5sb2NrKCk7CisKKwkJd2hpbGUoY291bnQgIT0gMCAmJiBhY2Nlc3NvciAhPSBjbGFpbWVyKQorCQl7CisJCQlibG9ja2VkKys7CisJCQljcml0aWNhbFNlY3Rpb24udW5sb2NrKCk7CisKKwkJCVdhaXRGb3JTaW5nbGVPYmplY3QodW5ibG9jaywgSU5GSU5JVEUpOworCisJCQljcml0aWNhbFNlY3Rpb24ubG9jaygpOworCQkJYmxvY2tlZC0tOworCQl9CisKKwkJYWNjZXNzb3IgPSBjbGFpbWVyOworCQljb3VudCsrOworCisJCWNyaXRpY2FsU2VjdGlvbi51bmxvY2soKTsKKworCQlyZXR1cm4gYnVmZmVyOworCX0KKworCXZvaWQgKlJlc291cmNlOjpsb2NrKEFjY2Vzc29yIHJlbGlucXVpc2hlciwgQWNjZXNzb3IgY2xhaW1lcikKKwl7CisJCWNyaXRpY2FsU2VjdGlvbi5sb2NrKCk7CisKKwkJLy8gUmVsZWFzZQorCQl3aGlsZShjb3VudCA+IDAgJiYgYWNjZXNzb3IgPT0gcmVsaW5xdWlzaGVyKQorCQl7CisJCQljb3VudC0tOworCQkKKwkJCWlmKGNvdW50ID09IDApCisJCQl7CisJCQkJaWYoYmxvY2tlZCkKKwkJCQl7CisJCQkJCVNldEV2ZW50KHVuYmxvY2spOworCQkJCX0KKwkJCQllbHNlIGlmKG9ycGhhbmVkKQorCQkJCXsKKwkJCQkJY3JpdGljYWxTZWN0aW9uLnVubG9jaygpOworCisJCQkJCWRlbGV0ZSB0aGlzOworCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIEFjcXVpcmUKKwkJd2hpbGUoY291bnQgIT0gMCAmJiBhY2Nlc3NvciAhPSBjbGFpbWVyKQorCQl7CisJCQlibG9ja2VkKys7CisJCQljcml0aWNhbFNlY3Rpb24udW5sb2NrKCk7CisKKwkJCVdhaXRGb3JTaW5nbGVPYmplY3QodW5ibG9jaywgSU5GSU5JVEUpOworCisJCQljcml0aWNhbFNlY3Rpb24ubG9jaygpOworCQkJYmxvY2tlZC0tOworCQl9CisKKwkJYWNjZXNzb3IgPSBjbGFpbWVyOworCQljb3VudCsrOworCisJCWNyaXRpY2FsU2VjdGlvbi51bmxvY2soKTsKKworCQlyZXR1cm4gYnVmZmVyOworCX0KKworCXZvaWQgUmVzb3VyY2U6OnVubG9jaygpCisJeworCQljcml0aWNhbFNlY3Rpb24ubG9jaygpOworCisJCWNvdW50LS07CisJCQorCQlpZihjb3VudCA9PSAwKQorCQl7CisJCQlpZihibG9ja2VkKQorCQkJeworCQkJCVNldEV2ZW50KHVuYmxvY2spOworCQkJfQorCQkJZWxzZSBpZihvcnBoYW5lZCkKKwkJCXsKKwkJCQljcml0aWNhbFNlY3Rpb24udW5sb2NrKCk7CisKKwkJCQlkZWxldGUgdGhpczsKKworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCWNyaXRpY2FsU2VjdGlvbi51bmxvY2soKTsKKwl9CisKKwl2b2lkIFJlc291cmNlOjp1bmxvY2soQWNjZXNzb3IgcmVsaW5xdWlzaGVyKQorCXsKKwkJY3JpdGljYWxTZWN0aW9uLmxvY2soKTsKKworCQl3aGlsZShjb3VudCA+IDAgJiYgYWNjZXNzb3IgPT0gcmVsaW5xdWlzaGVyKQorCQl7CisJCQljb3VudC0tOworCQkKKwkJCWlmKGNvdW50ID09IDApCisJCQl7CisJCQkJaWYoYmxvY2tlZCkKKwkJCQl7CisJCQkJCVNldEV2ZW50KHVuYmxvY2spOworCQkJCX0KKwkJCQllbHNlIGlmKG9ycGhhbmVkKQorCQkJCXsKKwkJCQkJY3JpdGljYWxTZWN0aW9uLnVubG9jaygpOworCisJCQkJCWRlbGV0ZSB0aGlzOworCisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKworCQljcml0aWNhbFNlY3Rpb24udW5sb2NrKCk7CisJfQorCisJdm9pZCBSZXNvdXJjZTo6ZGVzdHJ1Y3QoKQorCXsKKwkJY3JpdGljYWxTZWN0aW9uLmxvY2soKTsKKworCQlpZihjb3VudCA9PSAwICYmICFibG9ja2VkKQorCQl7CisJCQljcml0aWNhbFNlY3Rpb24udW5sb2NrKCk7CisKKwkJCWRlbGV0ZSB0aGlzOworCisJCQlyZXR1cm47CisJCX0KKworCQlvcnBoYW5lZCA9IHRydWU7CisKKwkJY3JpdGljYWxTZWN0aW9uLnVubG9jaygpOworCX0KKworCWNvbnN0IHZvaWQgKlJlc291cmNlOjpnZXRCdWZmZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0NvbW1vbi9SZXNvdXJjZS5ocHAgYi9zcmMvQ29tbW9uL1Jlc291cmNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzkyODYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0NvbW1vbi9SZXNvdXJjZS5ocHAKQEAgLTAsMCArMSw1NiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgc3dfUmVzb3VyY2VfaHBwDQorI2RlZmluZSBzd19SZXNvdXJjZV9ocHANCisNCisjaW5jbHVkZSAiTXV0ZXhMb2NrLmhwcCINCisNCituYW1lc3BhY2Ugc3cNCit7DQorCWVudW0gQWNjZXNzb3INCisJew0KKwkJUFVCTElDLCAgICAvLyBBcHBsaWNhdGlvbi9BUEkgYWNjZXNzDQorCQlQUklWQVRFLCAgIC8vIFJlbmRlcmVyIGFjY2Vzcywgc2hhcmVkIGJ5IG11bHRpcGxlIHRocmVhZHMgaWYgcmVhZC1vbmx5DQorCQlNQU5BR0VELCAgIC8vIFJlbmRlcmVyIGFjY2Vzcywgc2hhcmVkIHJlYWQvd3JpdGUgYWNjZXNzIGlmIHBhcnRpdGlvbmVkDQorCQlERVNUUlVDVA0KKwl9Ow0KKw0KKwljbGFzcyBSZXNvdXJjZQ0KKwl7DQorCXB1YmxpYzoNCisJCVJlc291cmNlKGludCBieXRlcyk7DQorDQorCQl2b2lkIGRlc3RydWN0KCk7ICAgLy8gQXN5bmNocm9ub3VzIGRlc3RydWN0b3INCisNCisJCXZvaWQgKmxvY2soQWNjZXNzb3IgY2xhaW1lcik7DQorCQl2b2lkICpsb2NrKEFjY2Vzc29yIHJlbGlucXVpc2hlciwgQWNjZXNzb3IgY2xhaW1lcik7DQorCQl2b2lkIHVubG9jaygpOw0KKwkJdm9pZCB1bmxvY2soQWNjZXNzb3IgcmVsaW5xdWlzaGVyKTsNCisNCisJCWNvbnN0IHZvaWQgKmdldEJ1ZmZlcigpIGNvbnN0OyAgIC8vIEZJWE1FDQorDQorCXByaXZhdGU6DQorCQl+UmVzb3VyY2UoKTsgICAvLyBBbHdheXMgY2FsbCBkZXN0cnVjdCgpIGluc3RlYWQNCisNCisJCUJhY2tvZmZMb2NrIGNyaXRpY2FsU2VjdGlvbjsNCisJCXZvbGF0aWxlIEhBTkRMRSB1bmJsb2NrOw0KKwkJdm9sYXRpbGUgaW50IGJsb2NrZWQ7DQorDQorCQl2b2xhdGlsZSBBY2Nlc3NvciBhY2Nlc3NvcjsNCisJCXZvbGF0aWxlIGludCBjb3VudDsNCisJCWJvb2wgb3JwaGFuZWQ7DQorDQorCQl2b2lkICpidWZmZXI7DQorCX07DQorfQ0KKw0KKyNlbmRpZiAgIC8vIHN3X1Jlc291cmNlX2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vVGhyZWFkLmNwcCBiL3NyYy9Db21tb24vVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzYwMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0NvbW1vbi9UaHJlYWQuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIlRocmVhZC5ocHAiCisKK25hbWVzcGFjZSBzdworeworCVRocmVhZDo6VGhyZWFkKHZvaWQgKCp0aHJlYWRGdW5jdGlvbikodm9pZCAqcGFyYW1ldGVycyksIHZvaWQgKnBhcmFtZXRlcnMpCisJeworCQlFdmVudCBpbml0OworCQlFbnRyeSBlbnRyeSA9IHt0aHJlYWRGdW5jdGlvbiwgcGFyYW1ldGVycywgJmluaXR9OworCQkKKwkJI2lmIGRlZmluZWQoX1dJTjMyKQorCQkJaGFuZGxlID0gQ3JlYXRlVGhyZWFkKDAsIDEwMjQgKiAxMDI0LCBzdGFydEZ1bmN0aW9uLCAmZW50cnksIDAsIDApOworCQkjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKwkJCXB0aHJlYWRfY3JlYXRlKCZoYW5kbGUsIDAsIHN0YXJ0RnVuY3Rpb24sICZlbnRyeSk7CisJCSNlbHNlCisJCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQorCQkjZW5kaWYKKwkJCisJCWluaXQud2FpdCgpOworCX0KKworCVRocmVhZDo6flRocmVhZCgpCisJewkJCisJCSNpZiBkZWZpbmVkKF9XSU4zMikKKwkJCUNsb3NlSGFuZGxlKGhhbmRsZSk7CisJCSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorCQkJcHRocmVhZF9jYW5jZWwoaGFuZGxlKTsKKwkJI2Vsc2UKKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtCisJCSNlbmRpZgorCX0KKworCXZvaWQgVGhyZWFkOjpqb2luKCkKKwl7CisJCSNpZiBkZWZpbmVkKF9XSU4zMikKKwkJCVdhaXRGb3JTaW5nbGVPYmplY3QoaGFuZGxlLCBJTkZJTklURSk7CisJCSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorCQkJcHRocmVhZF9qb2luKGhhbmRsZSwgMCk7CisJCSNlbHNlCisJCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQorCQkjZW5kaWYKKwl9CisKKwkjaWYgZGVmaW5lZChfV0lOMzIpCisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFRocmVhZDo6c3RhcnRGdW5jdGlvbih2b2lkICpwYXJhbWV0ZXJzKQorCQl7CisJCQlFbnRyeSBlbnRyeSA9ICooRW50cnkqKXBhcmFtZXRlcnM7CisJCQllbnRyeS5pbml0LT5zaWduYWwoKTsKKwkJCWVudHJ5LnRocmVhZEZ1bmN0aW9uKGVudHJ5LnRocmVhZFBhcmFtZXRlcnMpOworCQkJcmV0dXJuIDA7CisJCX0KKwkjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKwkJdm9pZCAqVGhyZWFkOjpzdGFydEZ1bmN0aW9uKHZvaWQgKnBhcmFtZXRlcnMpCisJCXsKKwkJCUVudHJ5IGVudHJ5ID0gKihFbnRyeSopcGFyYW1ldGVyczsKKwkJCWVudHJ5LmluaXQtPnNpZ25hbCgpOworCQkJZW50cnkudGhyZWFkRnVuY3Rpb24oZW50cnkudGhyZWFkUGFyYW1ldGVycyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCSNlbHNlCisJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtCisJI2VuZGlmCisKKwlFdmVudDo6RXZlbnQoKQorCXsKKwkJI2lmIGRlZmluZWQoX1dJTjMyKQorCQkJaGFuZGxlID0gQ3JlYXRlRXZlbnQoMCwgZmFsc2UsIGZhbHNlLCAwKTsKKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisJCQlwdGhyZWFkX2NvbmRfaW5pdCgmaGFuZGxlLCAwKTsKKwkJCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXgsIDApOworCQkJc2lnbmFsZWQgPSBmYWxzZTsKKwkJI2Vsc2UKKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtCisJCSNlbmRpZgorCX0KKworCUV2ZW50Ojp+RXZlbnQoKQorCXsKKwkJI2lmIGRlZmluZWQoX1dJTjMyKQorCQkJQ2xvc2VIYW5kbGUoaGFuZGxlKTsKKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisJCQlwdGhyZWFkX2NvbmRfZGVzdHJveSgmaGFuZGxlKTsKKwkJCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgpOworCQkjZWxzZQorCQkJI2Vycm9yIFVuaW1wbGVtZW50ZWQgcGxhdGZvcm0KKwkJI2VuZGlmCisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0NvbW1vbi9UaHJlYWQuaHBwIGIvc3JjL0NvbW1vbi9UaHJlYWQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYzdkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvQ29tbW9uL1RocmVhZC5ocHAKQEAgLTAsMCArMSwyMTYgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIHN3X1RocmVhZF9ocHANCisjZGVmaW5lIHN3X1RocmVhZF9ocHANCisNCisjaWYgZGVmaW5lZChfV0lOMzIpDQorCSNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTg0KKwkJI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFODQorCSNlbmRpZg0KKwkjaW5jbHVkZSA8d2luZG93cy5oPg0KKwkjaW5jbHVkZSA8aW50cmluLmg+DQorI2VsaWYgZGVmaW5lZChfX0FQUExFX18pDQorCSNpbmNsdWRlIDxwdGhyZWFkLmg+DQorI2Vsc2UNCisJI2Vycm9yIFVuaW1wbGVtZW50ZWQgcGxhdGZvcm0NCisjZW5kaWYNCisNCisjaW5jbHVkZSAiVHlwZXMuaHBwIg0KKw0KK25hbWVzcGFjZSBzdw0KK3sNCisJY2xhc3MgRXZlbnQ7DQorDQorCWNsYXNzIFRocmVhZA0KKwl7DQorCXB1YmxpYzoNCisJCVRocmVhZCh2b2lkICgqdGhyZWFkRnVuY3Rpb24pKHZvaWQgKnBhcmFtZXRlcnMpLCB2b2lkICpwYXJhbWV0ZXJzKTsNCisNCisJCX5UaHJlYWQoKTsNCisNCisJCXZvaWQgam9pbigpOw0KKw0KKwkJc3RhdGljIHZvaWQgeWllbGQoKTsNCisJCXN0YXRpYyB2b2lkIHNsZWVwKGludCBtaWxsaXNlY29uZHMpOw0KKw0KKwlwcml2YXRlOg0KKwkJc3RydWN0IEVudHJ5DQorCQl7DQorCQkJdm9pZCAoKmNvbnN0IHRocmVhZEZ1bmN0aW9uKSh2b2lkICpwYXJhbWV0ZXJzKTsNCisJCQl2b2lkICp0aHJlYWRQYXJhbWV0ZXJzOw0KKwkJCUV2ZW50ICppbml0Ow0KKwkJfTsNCisJCQ0KKwkJI2lmIGRlZmluZWQoX1dJTjMyKQ0KKwkJCXN0YXRpYyB1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBzdGFydEZ1bmN0aW9uKHZvaWQgKnBhcmFtZXRlcnMpOw0KKwkJCUhBTkRMRSBoYW5kbGU7DQorCQkjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykNCisJCQlzdGF0aWMgdm9pZCAqc3RhcnRGdW5jdGlvbih2b2lkICpwYXJhbWV0ZXJzKTsNCisJCQlwdGhyZWFkX3QgaGFuZGxlOw0KKwkJI2Vsc2UNCisJCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQ0KKwkJI2VuZGlmDQorCX07DQorDQorCWNsYXNzIEV2ZW50DQorCXsNCisJCWZyaWVuZCBjbGFzcyBUaHJlYWQ7DQorDQorCXB1YmxpYzoNCisJCUV2ZW50KCk7DQorDQorCQl+RXZlbnQoKTsNCisNCisJCXZvaWQgc2lnbmFsKCk7DQorCQl2b2lkIHdhaXQoKTsNCisNCisJcHJpdmF0ZToNCisJCSNpZiBkZWZpbmVkKF9XSU4zMikNCisJCQlIQU5ETEUgaGFuZGxlOw0KKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pDQorCQkJcHRocmVhZF9jb25kX3QgaGFuZGxlOw0KKwkJCXB0aHJlYWRfbXV0ZXhfdCBtdXRleDsNCisJCQl2b2xhdGlsZSBib29sIHNpZ25hbGVkOw0KKwkJI2Vsc2UNCisJCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQ0KKwkJI2VuZGlmDQorCX07DQorDQorCSNpZiBQRVJGX1BST0ZJTEUNCisJaW50NjRfdCBhdG9taWNFeGNoYW5nZShpbnQ2NF90IHZvbGF0aWxlICp0YXJnZXQsIGludDY0X3QgdmFsdWUpOw0KKwkjZW5kaWYNCisNCisJaW50IGF0b21pY0V4Y2hhbmdlKGludCB2b2xhdGlsZSAqdGFyZ2V0LCBpbnQgdmFsdWUpOw0KKwlpbnQgYXRvbWljSW5jcmVtZW50KGludCB2b2xhdGlsZSAqdmFsdWUpOw0KKwlpbnQgYXRvbWljRGVjcmVtZW50KGludCB2b2xhdGlsZSAqdmFsdWUpOw0KKwl2b2lkIG5vcCgpOw0KK30NCisNCituYW1lc3BhY2Ugc3cNCit7DQorCWlubGluZSB2b2lkIFRocmVhZDo6eWllbGQoKQ0KKwl7DQorCQkjaWYgZGVmaW5lZChfV0lOMzIpDQorCQkJU2xlZXAoMCk7DQorCQkjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykNCisJCQlwdGhyZWFkX3lpZWxkX25wKCk7DQorCQkjZWxzZQ0KKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtDQorCQkjZW5kaWYNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBUaHJlYWQ6OnNsZWVwKGludCBtaWxsaXNlY29uZHMpDQorCXsNCisJCSNpZiBkZWZpbmVkKF9XSU4zMikNCisJCQlTbGVlcChtaWxsaXNlY29uZHMpOw0KKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pDQorCQkJbmFwKG1pbGxpc2Vjb25kcyk7DQorCQkjZWxzZQ0KKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtDQorCQkjZW5kaWYNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBFdmVudDo6c2lnbmFsKCkNCisJew0KKwkJI2lmIGRlZmluZWQoX1dJTjMyKQ0KKwkJCVNldEV2ZW50KGhhbmRsZSk7DQorCQkjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykNCisJCQlwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsNCisJCQlzaWduYWxlZCA9IHRydWU7DQorCQkJcHRocmVhZF9jb25kX3NpZ25hbCgmaGFuZGxlKTsNCisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOw0KKwkJI2Vsc2UNCisJCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQ0KKwkJI2VuZGlmDQorCX0NCisNCisJaW5saW5lIHZvaWQgRXZlbnQ6OndhaXQoKQ0KKwl7DQorCQkjaWYgZGVmaW5lZChfV0lOMzIpDQorCQkJV2FpdEZvclNpbmdsZU9iamVjdChoYW5kbGUsIElORklOSVRFKTsNCisJCSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQ0KKwkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOw0KKwkJCXdoaWxlKCFzaWduYWxlZCkgcHRocmVhZF9jb25kX3dhaXQoJmhhbmRsZSwgJm11dGV4KTsNCisJCQlzaWduYWxlZCA9IGZhbHNlOw0KKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7DQorCQkjZWxzZQ0KKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtDQorCQkjZW5kaWYNCisJfQ0KKw0KKwkjaWYgUEVSRl9QUk9GSUxFDQorCWlubGluZSBpbnQ2NF90IGF0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIGludDY0X3QgKnRhcmdldCwgaW50NjRfdCB2YWx1ZSkNCisJew0KKwkJI2lmIGRlZmluZWQoX1dJTjMyKQ0KKwkJCXJldHVybiBJbnRlcmxvY2tlZEV4Y2hhbmdlNjQodGFyZ2V0LCB2YWx1ZSk7DQorCQkjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykNCisJCQlpbnQgcmV0Ow0KKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrOyB4Y2hnOCAlMCwoJTEpIiA6ICI9ciIgKHJldCkgOiJyIiAodGFyZ2V0KSwgIjAiICh2YWx1ZSkgOiAibWVtb3J5IiApOw0KKwkJCXJldHVybiByZXQ7DQorCQkjZWxzZQ0KKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtDQorCQkjZW5kaWYNCisJfQ0KKwkjZW5kaWYNCisNCisJaW5saW5lIGludCBhdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBpbnQgKnRhcmdldCwgaW50IHZhbHVlKQ0KKwl7DQorCQkjaWYgZGVmaW5lZChfV0lOMzIpDQorCQkJcmV0dXJuIEludGVybG9ja2VkRXhjaGFuZ2UoKHZvbGF0aWxlIGxvbmcqKXRhcmdldCwgKGxvbmcpdmFsdWUpOw0KKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pDQorCQkJaW50IHJldDsNCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9jazsgeGNoZ2wgJTAsKCUxKSIgOiAiPXIiIChyZXQpIDoiciIgKHRhcmdldCksICIwIiAodmFsdWUpIDogIm1lbW9yeSIgKTsNCisJCQlyZXR1cm4gcmV0Ow0KKwkJI2Vsc2UNCisJCQkjZXJyb3IgVW5pbXBsZW1lbnRlZCBwbGF0Zm9ybQ0KKwkJI2VuZGlmDQorCX0NCisNCisJaW5saW5lIGludCBhdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgaW50ICp2YWx1ZSkNCisJew0KKwkJI2lmIGRlZmluZWQoX1dJTjMyKQ0KKwkJCXJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCgodm9sYXRpbGUgbG9uZyopdmFsdWUpOw0KKwkJI2VsaWYgZGVmaW5lZChfX0FQUExFX18pDQorCQkJIGludCByZXQ7DQorCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oICJsb2NrOyB4YWRkbCAlMCwoJTEpIiA6ICI9ciIgKHJldCkgOiAiciIgKGRlc3QpLCAiMCIgKDEpIDogIm1lbW9yeSIgKTsNCisJCQlyZXR1cm4gcmV0ICsgMTsNCisJCSNlbHNlDQorCQkJI2Vycm9yIFVuaW1wbGVtZW50ZWQgcGxhdGZvcm0NCisJCSNlbmRpZg0KKwl9DQorDQorCWlubGluZSBpbnQgYXRvbWljRGVjcmVtZW50KHZvbGF0aWxlIGludCAqdmFsdWUpDQorCXsNCisJCSNpZiBkZWZpbmVkKF9XSU4zMikNCisJCQlyZXR1cm4gSW50ZXJsb2NrZWREZWNyZW1lbnQoKHZvbGF0aWxlIGxvbmcqKXZhbHVlKTsNCisJCSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQ0KKwkJCWludCByZXQ7DQorCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oICJsb2NrOyB4YWRkbCAlMCwoJTEpIiA6ICI9ciIgKHJldCkgOiAiciIgKGRlc3QpLCAiMCIgKC0xKSA6ICJtZW1vcnkiICk7DQorCQkJcmV0dXJuIHJldCAtIDE7DQorCQkjZWxzZQ0KKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtDQorCQkjZW5kaWYNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBub3AoKQ0KKwl7DQorCQkjaWYgZGVmaW5lZChfV0lOMzIpDQorCQkJX19ub3AoKTsNCisJCSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQ0KKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICgibm9wIik7DQorCQkjZWxzZQ0KKwkJCSNlcnJvciBVbmltcGxlbWVudGVkIHBsYXRmb3JtDQorCQkjZW5kaWYNCisJfQ0KK30NCisNCisjZW5kaWYgICAvLyBzd19UaHJlYWRfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL0NvbW1vbi9UaW1lci5jcHAgYi9zcmMvQ29tbW9uL1RpbWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA5MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0NvbW1vbi9UaW1lci5jcHAKQEAgLTAsMCArMSw1OCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiVGltZXIuaHBwIgorCisjaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKwkjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgPGludHJpbi5oPgorCituYW1lc3BhY2Ugc3cKK3sKKwlUaW1lcjo6VGltZXIoKQorCXsKKwl9CisKKwlUaW1lcjo6flRpbWVyKCkKKwl7CisJfQorCisJZG91YmxlIFRpbWVyOjpzZWNvbmRzKCkKKwl7CisJCXJldHVybiAoZG91YmxlKWNvdW50ZXIoKSAvIChkb3VibGUpZnJlcXVlbmN5KCk7CisJfQorCisJaW50NjRfdCBUaW1lcjo6dGlja3MoKQorCXsKKwkJcmV0dXJuIF9fcmR0c2MoKTsKKwl9CisKKwlpbnQ2NF90IFRpbWVyOjpjb3VudGVyKCkKKwl7CisJCWludDY0X3QgY291bnRlcjsKKworCQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJmNvdW50ZXIpOworCisJCXJldHVybiBjb3VudGVyOworCX0KKworCWludDY0X3QgVGltZXI6OmZyZXF1ZW5jeSgpCisJeworCQlpbnQ2NF90IGZyZXF1ZW5jeTsKKworCQlRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KChMQVJHRV9JTlRFR0VSKikmZnJlcXVlbmN5KTsKKworCQlyZXR1cm4gZnJlcXVlbmN5OworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vVGltZXIuaHBwIGIvc3JjL0NvbW1vbi9UaW1lci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2MjRjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db21tb24vVGltZXIuaHBwCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBzd19UaW1lcl9ocHAKKyNkZWZpbmUgc3dfVGltZXJfaHBwCisKKyNpbmNsdWRlICJUeXBlcy5ocHAiCisKK25hbWVzcGFjZSBzdworeworCWNsYXNzIFRpbWVyCisJeworCXB1YmxpYzoKKwkJVGltZXIoKTsKKworCQl+VGltZXIoKTsKKworCQlzdGF0aWMgZG91YmxlIHNlY29uZHMoKTsKKwkJc3RhdGljIGludDY0X3QgdGlja3MoKTsKKworCQlzdGF0aWMgaW50NjRfdCBjb3VudGVyKCk7CisJCXN0YXRpYyBpbnQ2NF90IGZyZXF1ZW5jeSgpOworCX07Cit9CisKKyNlbmRpZiAgIC8vIHN3X1RpbWVyX2hwcApkaWZmIC0tZ2l0IGEvc3JjL0NvbW1vbi9UeXBlcy5ocHAgYi9zcmMvQ29tbW9uL1R5cGVzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmY1OGMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0NvbW1vbi9UeXBlcy5ocHAKQEAgLTAsMCArMSwxNjEgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBzd19UeXBlc19ocHAKKyNkZWZpbmUgc3dfVHlwZXNfaHBwCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKwl0eXBlZGVmIHNpZ25lZCBfX2ludDggaW50OF90OworCXR5cGVkZWYgc2lnbmVkIF9faW50MTYgaW50MTZfdDsKKwl0eXBlZGVmIHNpZ25lZCBfX2ludDMyIGludDMyX3Q7CisJdHlwZWRlZiBzaWduZWQgX19pbnQ2NCBpbnQ2NF90OworCXR5cGVkZWYgdW5zaWduZWQgX19pbnQ4IHVpbnQ4X3Q7CisJdHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2IHVpbnQxNl90OworCXR5cGVkZWYgdW5zaWduZWQgX19pbnQzMiB1aW50MzJfdDsKKwl0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7CisJI2RlZmluZSBBTElHTihieXRlcywgdHlwZSkgX19kZWNsc3BlYyhhbGlnbihieXRlcykpIHR5cGUKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorCSNpbmNsdWRlIDxzdGRpbnQuaD4KKwkjZGVmaW5lIEFMSUdOKGJ5dGVzLCB0eXBlKSB0eXBlIF9fYXR0cmlidXRlX18oKGFsaWduZWQoYnl0ZXMpKSkKKyNlbHNlCisJI2Vycm9yIFVuaW1wbGVtZW50ZWQgcGxhdGZvcm0KKyNlbmRpZgorCituYW1lc3BhY2Ugc3cKK3sKKwl0eXBlZGVmIEFMSUdOKDEsIHVpbnQ4X3QpIGJ5dGU7CisJdHlwZWRlZiBBTElHTigyLCB1aW50MTZfdCkgd29yZDsKKwl0eXBlZGVmIEFMSUdOKDQsIHVpbnQzMl90KSBkd29yZDsKKwl0eXBlZGVmIEFMSUdOKDgsIHVpbnQ2NF90KSBxd29yZDsKKwl0eXBlZGVmIEFMSUdOKDE2LCB1aW50NjRfdCkgcXdvcmQyWzJdOworCXR5cGVkZWYgQUxJR04oNCwgdWludDhfdCkgYnl0ZTRbNF07CisJdHlwZWRlZiBBTElHTig4LCB1aW50OF90KSBieXRlOFs4XTsKKwl0eXBlZGVmIEFMSUdOKDE2LCB1aW50OF90KSBieXRlMTZbMTZdOworCXR5cGVkZWYgQUxJR04oOCwgdWludDE2X3QpIHdvcmQ0WzRdOworCXR5cGVkZWYgQUxJR04oOCwgdWludDMyX3QpIGR3b3JkMlsyXTsKKwl0eXBlZGVmIEFMSUdOKDE2LCB1aW50MzJfdCkgZHdvcmQ0WzRdOworCXR5cGVkZWYgQUxJR04oMTYsIHVpbnQ2NF90KSB4d29yZFsyXTsKKworCXR5cGVkZWYgQUxJR04oMSwgaW50OF90KSBzYnl0ZTsKKwl0eXBlZGVmIEFMSUdOKDQsIGludDhfdCkgc2J5dGU0WzRdOworCXR5cGVkZWYgQUxJR04oOCwgaW50OF90KSBzYnl0ZThbOF07CisJdHlwZWRlZiBBTElHTigxNiwgaW50OF90KSBzYnl0ZTE2WzE2XTsKKwl0eXBlZGVmIEFMSUdOKDgsIHNob3J0KSBzaG9ydDRbNF07CisJdHlwZWRlZiBBTElHTig4LCB1bnNpZ25lZCBzaG9ydCkgdXNob3J0NFs0XTsKKwl0eXBlZGVmIEFMSUdOKDE2LCBzaG9ydCkgc2hvcnQ4WzhdOworCXR5cGVkZWYgQUxJR04oMTYsIHVuc2lnbmVkIHNob3J0KSB1c2hvcnQ4WzhdOworCXR5cGVkZWYgQUxJR04oOCwgaW50KSBpbnQyWzJdOworCXR5cGVkZWYgQUxJR04oOCwgdW5zaWduZWQgaW50KSB1aW50MlsyXTsKKwl0eXBlZGVmIEFMSUdOKDE2LCB1bnNpZ25lZCBpbnQpIHVpbnQ0WzRdOworCisJdHlwZWRlZiBBTElHTig4LCBmbG9hdCkgZmxvYXQyWzJdOworCisJQUxJR04oMTYsIHN0cnVjdCBpbnQ0CisJeworCQlzdHJ1Y3QKKwkJeworCQkJaW50IHg7CisJCQlpbnQgeTsKKwkJCWludCB6OworCQkJaW50IHc7CisJCX07CisKKwkJaW50ICZvcGVyYXRvcltdKGludCBpKQkKKwkJeworCQkJcmV0dXJuICgmeClbaV07CisJCX0KKworCQljb25zdCBpbnQgJm9wZXJhdG9yW10oaW50IGkpIGNvbnN0CisJCXsKKwkJCXJldHVybiAoJngpW2ldOworCQl9CisKKwkJYm9vbCBvcGVyYXRvciE9KGludDQgJnJocykKKwkJeworCQkJcmV0dXJuIHggIT0gcmhzLnggfHwgeSAhPSByaHMueSB8fCB6ICE9IHJocy56IHx8IHcgIT0gcmhzLnc7CisJCX0KKworCQlib29sIG9wZXJhdG9yPT0oaW50NCAmcmhzKQorCQl7CisJCQlyZXR1cm4geCA9PSByaHMueCAmJiB5ID09IHJocy55ICYmIHogPT0gcmhzLnogJiYgdyA9PSByaHMudzsKKwkJfQorCX0pOworCisJQUxJR04oMTYsIHN0cnVjdCBmbG9hdDQKKwl7CisJCXVuaW9uCisJCXsKKwkJCXN0cnVjdAorCQkJeworCQkJCWZsb2F0IHg7CisJCQkJZmxvYXQgeTsKKwkJCQlmbG9hdCB6OworCQkJCWZsb2F0IHc7CisJCQl9OworCisJCQlzdHJ1Y3QKKwkJCXsKKwkJCQlmbG9hdCByOworCQkJCWZsb2F0IGc7CisJCQkJZmxvYXQgYjsKKwkJCQlmbG9hdCBhOworCQkJfTsKKwkJfTsKKworCQlmbG9hdCAmb3BlcmF0b3JbXShpbnQgaSkJCisJCXsKKwkJCXJldHVybiAoJngpW2ldOworCQl9CisKKwkJY29uc3QgZmxvYXQgJm9wZXJhdG9yW10oaW50IGkpIGNvbnN0CisJCXsKKwkJCXJldHVybiAoJngpW2ldOworCQl9CisKKwkJYm9vbCBvcGVyYXRvciE9KGZsb2F0NCAmcmhzKQorCQl7CisJCQlyZXR1cm4geCAhPSByaHMueCB8fCB5ICE9IHJocy55IHx8IHogIT0gcmhzLnogfHwgdyAhPSByaHMudzsKKwkJfQorCisJCWJvb2wgb3BlcmF0b3I9PShmbG9hdDQgJnJocykKKwkJeworCQkJcmV0dXJuIHggPT0gcmhzLnggJiYgeSA9PSByaHMueSAmJiB6ID09IHJocy56ICYmIHcgPT0gcmhzLnc7CisJCX0KKwl9KTsKKworCWlubGluZSBmbG9hdDQgdmVjdG9yKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcpCisJeworCQlmbG9hdDQgdjsKKworCQl2LnggPSB4OworCQl2LnkgPSB5OworCQl2LnogPSB6OworCQl2LncgPSB3OworCisJCXJldHVybiB2OworCX0KKwkKKwlpbmxpbmUgZmxvYXQ0IHJlcGxpY2F0ZShmbG9hdCBmKQorCXsKKwkJZmxvYXQ0IHY7CisKKwkJdi54ID0gZjsKKwkJdi55ID0gZjsKKwkJdi56ID0gZjsKKwkJdi53ID0gZjsKKworCQlyZXR1cm4gdjsKKwl9CisKKwkjZGVmaW5lIE9GRlNFVChzLG0pIChpbnQpKHNpemVfdCkmcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2xhdGlsZSBjaGFyJj4oKCgocyopMCktPm0pKQorfQorCisjZW5kaWYgICAvLyBzd19UeXBlc19ocHAKZGlmZiAtLWdpdCBhL3NyYy9Db21tb24vVmVyc2lvbi5oIGIvc3JjL0NvbW1vbi9WZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyMWM0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db21tb24vVmVyc2lvbi5oCkBAIC0wLDAgKzEsMTAgQEAKKyNkZWZpbmUgTUFKT1JfVkVSU0lPTiAzCisjZGVmaW5lIE1JTk9SX1ZFUlNJT04gMAorI2RlZmluZSBCVUlMRF9WRVJTSU9OIDAKKyNkZWZpbmUgQlVJTERfUkVWSVNJT04gMzY4OQorCisjZGVmaW5lIFNUUklOR0lGWSh4KSAjeAorI2RlZmluZSBNQUNST19TVFJJTkdJRlkoeCkgU1RSSU5HSUZZKHgpCisKKyNkZWZpbmUgUkVWSVNJT05fU1RSSU5HIE1BQ1JPX1NUUklOR0lGWShCVUlMRF9SRVZJU0lPTikKKyNkZWZpbmUgVkVSU0lPTl9TVFJJTkcgTUFDUk9fU1RSSU5HSUZZKE1BSk9SX1ZFUlNJT04pICIuIiBNQUNST19TVFJJTkdJRlkoTUlOT1JfVkVSU0lPTikgIi4iIE1BQ1JPX1NUUklOR0lGWShCVUlMRF9WRVJTSU9OKSAiLiIgTUFDUk9fU1RSSU5HSUZZKEJVSUxEX1JFVklTSU9OKQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvQ2FwYWJpbGl0aWVzLmNwcCBiL3NyYy9EM0Q5L0NhcGFiaWxpdGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmM2NmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0NhcGFiaWxpdGllcy5jcHAKQEAgLTAsMCArMSw0MTcgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkNhcGFiaWxpdGllcy5ocHAiCisKKyNpbmNsdWRlICJNYWluL0NvbmZpZy5ocHAiCisKK25hbWVzcGFjZSBEM0Q5Cit7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6TlVMTF8gPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDFSNUc1QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkExUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjNHM0IyID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThSM0czQjIgPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Olg4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDhCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTJCMTBHMTBSMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkEyUjEwRzEwQjEwID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlIxNkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlIzMkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkczMlIzMkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkEzMkIzMkczMlIzMkYgPSB0cnVlOworCisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDMyID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRTOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0WDggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0RlM4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMzJGX0xPQ0tBQkxFID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpERjI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpERjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpJTlRaID0gdHJ1ZTsKKworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI1RzZCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlgxUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTFSNUc1QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBNFI0RzRCNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlIzRzNCMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UjNHM0IyID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6WDRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlA4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UDggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RzE2UjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJSMTBHMTBCMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMkIxMEcxMFIxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkExNkIxNkcxNlIxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDEgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDIgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDMgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDQgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDUgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkFUSTEgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkFUSTIgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlIxNkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpHMTZSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTE2QjE2RzE2UjE2RiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlIzMkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpHMzJSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTMyQjMyRzMyUjMyRiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlY4VTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMNlY1VTUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOEw4VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlE4VzhWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6VjE2VTE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJXMTBWMTBVMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpRMTZXMTZWMTZVMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE0TDQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOEw4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6TlZEQiA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBVE9DID0gdHJ1ZTsKKworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpSNUc2QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlgxUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlIzRzNCMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThSM0czQjIgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpSOEc4QjggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpYOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UDggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFA4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzE2UjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMlIxMEcxMEIxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJCMTBHMTBSMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkExNkIxNkcxNlIxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMSA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQyID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDMgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUNCA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQ1ID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkFUSTEgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QVRJMiA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpHMTZSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMTZCMTZHMTZSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpHMzJSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMzJCMzJHMzJSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpMNlY1VTUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4TDhWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpROFc4VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjE2VTE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMlcxMFYxMFUxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UTE2VzE2VjE2VTE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpMOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTRMNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBOEw4ID0gdHJ1ZTsKKworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Ok5VTExfID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSOEc4QjggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMiA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QThCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMlIxMEcxMEIxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMTZSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMzJSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMzJCMzJHMzJSMzJGID0gdHJ1ZTsKKworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQzMiA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQyNFM4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0WDggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMTYgPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRGUzggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMzJGX0xPQ0tBQkxFID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6REYyNCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkRGMTYgPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpJTlRaID0gZmFsc2U7CisKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSNUc2QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSM0czQjIgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFIzRzNCMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjhHOEI4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UDggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThQOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpHMTZSMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMlIxMEcxMEIxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTE2QjE2RzE2UjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMSA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMiA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMyA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUNCA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUNSA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QVRJMSA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QVRJMiA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjE2RiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkcxNlIxNkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMTZCMTZHMTZSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjMyRiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkczMlIzMkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMzJCMzJHMzJSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Okw2VjVVNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg4TDhWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UThXOFY4VTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpWMTZVMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMlcxMFYxMFUxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlExNlcxNlYxNlUxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Okw4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTRMNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkwxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4TDggPSB0cnVlOworCisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UjVHNkI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDFSNUc1QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UjNHM0IyID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThSM0czQjIgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYNFI0RzRCNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI4RzhCOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDhCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlA4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4UDggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RzE2UjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTJSMTBHMTBCMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMkIxMEcxMFIxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkExNkIxNkcxNlIxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDEgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDIgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDMgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDQgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDUgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkFUSTEgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkFUSTIgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIxNkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpHMTZSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTE2QjE2RzE2UjE2RiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzMkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpHMzJSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTMyQjMyRzMyUjMyRiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlY4VTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMNlY1VTUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOEw4VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlE4VzhWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6VjE2VTE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTJXMTBWMTBVMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpRMTZXMTZWMTZVMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE0TDQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOEw4ID0gdHJ1ZTsKKworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Ok5VTExfID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMiA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QThCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMlIxMEcxMEIxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMzJSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMzJCMzJHMzJSMzJGID0gdHJ1ZTsKKworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0UzggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNEZTOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDMyRl9MT0NLQUJMRSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYyNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6SU5UWiA9IHRydWU7CisKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6TlVMTF8gPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlI1RzZCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlgxUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QTFSNUc1QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNFI0RzRCNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlIzRzNCMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UjNHM0IyID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6WDRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSOEc4QjggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QThCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpQOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFA4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkcxNlIxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEyUjEwRzEwQjEwID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJCMTBHMTBSMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMTZCMTZHMTZSMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQxID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQyID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQzID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQ0ID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQ1ID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBVEkxID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBVEkyID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSMTZGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RzE2UjE2RiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkExNkIxNkcxNlIxNkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSMzJGID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RzMyUjMyRiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEzMkIzMkczMlIzMkYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6TDZWNVU1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhMOFY4VTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpROFc4VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlYxNlUxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEyVzEwVjEwVTEwID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UTE2VzE2VjE2VTE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6TDggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNEw0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6TDE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QThMOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQzMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNFM4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0WDggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMjRGUzggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMzJGX0xPQ0tBQkxFID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6REYyNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRGMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpJTlRaID0gdHJ1ZTsKKworCWJvb2wgQ2FwYWJpbGl0aWVzOjppc1NSR0JyZWFkYWJsZShEM0RGT1JNQVQgZm9ybWF0KQorCXsKKwkJLy8gS2VlcCBpbiBzeW5jIHdpdGggU3VyZmFjZTo6aXNTUkdCcmVhZGFibGUKKwkJc3dpdGNoKGZvcm1hdCkKKwkJeworCQljYXNlIEQzREZNVF9MODoKKwkJY2FzZSBEM0RGTVRfQThMODoKKwkJY2FzZSBEM0RGTVRfUjhHOEI4OgorCQljYXNlIEQzREZNVF9BOFI4RzhCODoKKwkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CisJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgorCQljYXNlIEQzREZNVF9YOEI4RzhSODoKKwkJY2FzZSBEM0RGTVRfUjVHNkI1OgorCQljYXNlIEQzREZNVF9YMVI1RzVCNToKKwkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CisJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgorCQljYXNlIEQzREZNVF9EWFQxOgorCQljYXNlIEQzREZNVF9EWFQyOgorCQljYXNlIEQzREZNVF9EWFQzOgorCQljYXNlIEQzREZNVF9EWFQ0OgorCQljYXNlIEQzREZNVF9EWFQ1OgorCQljYXNlIEQzREZNVF9BVEkxOgorCQljYXNlIEQzREZNVF9BVEkyOgorCQkJcmV0dXJuIHRydWU7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBDYXBhYmlsaXRpZXM6OmlzU1JHQndyaXRhYmxlKEQzREZPUk1BVCBmb3JtYXQpCisJeworCQkvLyBLZWVwIGluIHN5bmMgd2l0aCBTdXJmYWNlOjppc1NSR0J3cml0YWJsZQorCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgRDNERk1UX05VTEw6CisJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgorCQljYXNlIEQzREZNVF9YOFI4RzhCODoKKwkJY2FzZSBEM0RGTVRfQThCOEc4Ujg6CisJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgorCQljYXNlIEQzREZNVF9SNUc2QjU6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXVuc2lnbmVkIGludCBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigzLCAwKTsKKwl1bnNpZ25lZCBpbnQgdmVydGV4U2hhZGVyVmVyc2lvblggPSBEM0RWU19WRVJTSU9OKDMsIDApOworCisJdW5zaWduZWQgbG9uZyBwaXhlbFNoYWRlckFyYml0cmFyeVN3aXp6bGUgPSBEM0RQUzIwQ0FQU19BUkJJVFJBUllTV0laWkxFOworCXVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJHcmFkaWVudEluc3RydWN0aW9ucyA9IEQzRFBTMjBDQVBTX0dSQURJRU5USU5TVFJVQ1RJT05TOworCXVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJQcmVkaWNhdGlvbiA9IEQzRFBTMjBDQVBTX1BSRURJQ0FUSU9OOworCXVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJOb0RlcGVuZGVudFJlYWRMaW1pdCA9IEQzRFBTMjBDQVBTX05PREVQRU5ERU5UUkVBRExJTUlUOworCXVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJOb1RleEluc3RydWN0aW9uTGltaXQgPSBEM0RQUzIwQ0FQU19OT1RFWElOU1RSVUNUSU9OTElNSVQ7CisKKwl1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSBEM0RQUzIwX01BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsKKwl1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyU3RhdGljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFBTMjBfTUFYX1NUQVRJQ0ZMT1dDT05UUk9MREVQVEg7CisKKwl1bnNpZ25lZCBsb25nIHZlcnRleFNoYWRlclByZWRpY2F0aW9uID0gRDNEVlMyMENBUFNfUFJFRElDQVRJT047CisJdW5zaWduZWQgbG9uZyB2ZXJ0ZXhTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFZTMjBfTUFYX0RZTkFNSUNGTE9XQ09OVFJPTERFUFRIOworCisJdW5zaWduZWQgaW50IHRleHR1cmVNZW1vcnkgPSAyNTYgKiAxMDI0ICogMTAyNDsKKwl1bnNpZ25lZCBpbnQgbWF4QW5pc290cm9weSA9IDE2OworfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvQ2FwYWJpbGl0aWVzLmhwcCBiL3NyYy9EM0Q5L0NhcGFiaWxpdGllcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjMTNlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0NhcGFiaWxpdGllcy5ocHAKQEAgLTAsMCArMSw0NjcgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIEQzRDlfQ2FwYWJpbGl0aWVzX2hwcA0KKyNkZWZpbmUgRDNEOV9DYXBhYmlsaXRpZXNfaHBwDQorDQorI2luY2x1ZGUgPGQzZDkuaD4NCisNCituYW1lc3BhY2UgRDNEOQ0KK3sNCisJZW51bQ0KKwl7DQorCQlEM0RGTVRfQVRJMSA9IE1BS0VGT1VSQ0MoJ0EnLCAnVCcsICdJJywgJzEnKSwNCisJCUQzREZNVF9BVEkyID0gTUFLRUZPVVJDQygnQScsICdUJywgJ0knLCAnMicpLA0KKwkJRDNERk1UX0lOU1QgPSBNQUtFRk9VUkNDKCdJJywgJ04nLCAnUycsICdUJyksDQorCQlEM0RGTVRfREYyNCA9IE1BS0VGT1VSQ0MoJ0QnLCAnRicsICcyJywgJzQnKSwNCisJCUQzREZNVF9ERjE2ID0gTUFLRUZPVVJDQygnRCcsICdGJywgJzEnLCAnNicpLA0KKwkJRDNERk1UX05VTEwgPSBNQUtFRk9VUkNDKCdOJywgJ1UnLCAnTCcsICdMJyksDQorCQlEM0RGTVRfR0VUNCA9IE1BS0VGT1VSQ0MoJ0cnLCAnRScsICdUJywgJzQnKSwNCisJCUQzREZNVF9HRVQxID0gTUFLRUZPVVJDQygnRycsICdFJywgJ1QnLCAnMScpLA0KKwkJRDNERk1UX05WREIgPSBNQUtFRk9VUkNDKCdOJywgJ1YnLCAnRCcsICdCJyksDQorCQlEM0RGTVRfQTJNMSA9IE1BS0VGT1VSQ0MoJ0EnLCAnMicsICdNJywgJzEnKSwNCisJCUQzREZNVF9BMk0wID0gTUFLRUZPVVJDQygnQScsICcyJywgJ00nLCAnMCcpLA0KKwkJRDNERk1UX0FUT0MgPSBNQUtFRk9VUkNDKCdBJywgJ1QnLCAnTycsICdDJyksDQorCQlEM0RGTVRfSU5UWiA9IE1BS0VGT1VSQ0MoJ0knLCAnTicsICdUJywgJ1onKQ0KKwl9Ow0KKw0KKwlzdHJ1Y3QgQ2FwYWJpbGl0aWVzDQorCXsNCisJCXN0cnVjdCBTdXJmYWNlDQorCQl7DQorCQkJc3RydWN0IFJlbmRlclRhcmdldA0KKwkJCXsNCisJCQkJc3RhdGljIGJvb2wgTlVMTF87DQorCQkJCXN0YXRpYyBib29sIFI4RzhCODsNCisJCQkJc3RhdGljIGJvb2wgUjVHNkI1Ow0KKwkJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsNCisJCQkJc3RhdGljIGJvb2wgQTFSNUc1QjU7DQorCQkJCXN0YXRpYyBib29sIEE0UjRHNEI0Ow0KKwkJCQlzdGF0aWMgYm9vbCBSM0czQjI7DQorCQkJCXN0YXRpYyBib29sIEE4UjNHM0IyOw0KKwkJCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsNCisJCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7DQorCQkJCXN0YXRpYyBib29sIFg4UjhHOEI4Ow0KKwkJCQlzdGF0aWMgYm9vbCBBOEI4RzhSODsNCisJCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7DQorCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMNCisJCQkJc3RhdGljIGJvb2wgRzE2UjE2Ow0KKwkJCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsNCisJCQkJc3RhdGljIGJvb2wgQTJSMTBHMTBCMTA7DQorCQkJCXN0YXRpYyBib29sIEExNkIxNkcxNlIxNjsNCisJCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cw0KKwkJCQlzdGF0aWMgYm9vbCBSMTZGOw0KKwkJCQlzdGF0aWMgYm9vbCBHMTZSMTZGOw0KKwkJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTZGOw0KKwkJCQlzdGF0aWMgYm9vbCBSMzJGOw0KKwkJCQlzdGF0aWMgYm9vbCBHMzJSMzJGOw0KKwkJCQlzdGF0aWMgYm9vbCBBMzJCMzJHMzJSMzJGOw0KKwkJCX07DQorDQorCQkJc3RydWN0IERlcHRoU3RlbmNpbA0KKwkJCXsNCisJCQkJc3RhdGljIGJvb2wgRDMyOw0KKwkJCQlzdGF0aWMgYm9vbCBEMjRTODsNCisJCQkJc3RhdGljIGJvb2wgRDI0WDg7DQorCQkJCXN0YXRpYyBib29sIEQxNjsNCisJCQkJc3RhdGljIGJvb2wgRDI0RlM4Ow0KKwkJCQlzdGF0aWMgYm9vbCBEMzJGX0xPQ0tBQkxFOw0KKwkJCQlzdGF0aWMgYm9vbCBERjI0Ow0KKwkJCQlzdGF0aWMgYm9vbCBERjE2Ow0KKwkJCQlzdGF0aWMgYm9vbCBJTlRaOw0KKwkJCX07DQorDQorCQkJc3RhdGljIGJvb2wgQTg7DQorCQkJc3RhdGljIGJvb2wgUjVHNkI1Ow0KKwkJCXN0YXRpYyBib29sIFgxUjVHNUI1Ow0KKwkJCXN0YXRpYyBib29sIEExUjVHNUI1Ow0KKwkJCXN0YXRpYyBib29sIEE0UjRHNEI0Ow0KKwkJCXN0YXRpYyBib29sIFIzRzNCMjsNCisJCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsNCisJCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsNCisJCQlzdGF0aWMgYm9vbCBSOEc4Qjg7DQorCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7DQorCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7DQorCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7DQorCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7DQorCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIFA4Ow0KKwkJCXN0YXRpYyBib29sIEE4UDg7DQorCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIEcxNlIxNjsNCisJCQlzdGF0aWMgYm9vbCBBMlIxMEcxMEIxMDsNCisJCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsNCisJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTY7DQorCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzDQorCQkJc3RhdGljIGJvb2wgRFhUMTsNCisJCQlzdGF0aWMgYm9vbCBEWFQyOw0KKwkJCXN0YXRpYyBib29sIERYVDM7DQorCQkJc3RhdGljIGJvb2wgRFhUNDsNCisJCQlzdGF0aWMgYm9vbCBEWFQ1Ow0KKwkJCXN0YXRpYyBib29sIEFUSTE7DQorCQkJc3RhdGljIGJvb2wgQVRJMjsNCisJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzDQorCQkJc3RhdGljIGJvb2wgUjE2RjsNCisJCQlzdGF0aWMgYm9vbCBHMTZSMTZGOw0KKwkJCXN0YXRpYyBib29sIEExNkIxNkcxNlIxNkY7DQorCQkJc3RhdGljIGJvb2wgUjMyRjsNCisJCQlzdGF0aWMgYm9vbCBHMzJSMzJGOw0KKwkJCXN0YXRpYyBib29sIEEzMkIzMkczMlIzMkY7DQorCQkJLy8gQnVtcCBtYXAgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIFY4VTg7DQorCQkJc3RhdGljIGJvb2wgTDZWNVU1Ow0KKwkJCXN0YXRpYyBib29sIFg4TDhWOFU4Ow0KKwkJCXN0YXRpYyBib29sIFE4VzhWOFU4Ow0KKwkJCXN0YXRpYyBib29sIFYxNlUxNjsNCisJCQlzdGF0aWMgYm9vbCBBMlcxMFYxMFUxMDsNCisJCQlzdGF0aWMgYm9vbCBRMTZXMTZWMTZVMTY7DQorCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBMODsNCisJCQlzdGF0aWMgYm9vbCBBNEw0Ow0KKwkJCXN0YXRpYyBib29sIEwxNjsNCisJCQlzdGF0aWMgYm9vbCBBOEw4Ow0KKwkJCS8vIERlcHRoIEJvdW5kcyBUZXN0DQorCQkJc3RhdGljIGJvb2wgTlZEQjsNCisJCQkvLyBUcmFuc3BhcmVuY3kgYW50aS1hbGlhc2luZw0KKwkJCXN0YXRpYyBib29sIEFUT0M7DQorCQl9Ow0KKw0KKwkJc3RydWN0IFZvbHVtZQ0KKwkJew0KKwkJCXN0YXRpYyBib29sIEE4Ow0KKwkJCXN0YXRpYyBib29sIFI1RzZCNTsNCisJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsNCisJCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsNCisJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsNCisJCQlzdGF0aWMgYm9vbCBSM0czQjI7DQorCQkJc3RhdGljIGJvb2wgQThSM0czQjI7DQorCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7DQorCQkJc3RhdGljIGJvb2wgUjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIFg4UjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIEE4UjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIEE4QjhHOFI4Ow0KKwkJCXN0YXRpYyBib29sIFg4QjhHOFI4Ow0KKwkJCS8vIFBhbGV0dGVkIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBQODsNCisJCQlzdGF0aWMgYm9vbCBBOFA4Ow0KKwkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBHMTZSMTY7DQorCQkJc3RhdGljIGJvb2wgQTJSMTBHMTBCMTA7DQorCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7DQorCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2Ow0KKwkJCS8vIENvbXByZXNzZWQgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIERYVDE7DQorCQkJc3RhdGljIGJvb2wgRFhUMjsNCisJCQlzdGF0aWMgYm9vbCBEWFQzOw0KKwkJCXN0YXRpYyBib29sIERYVDQ7DQorCQkJc3RhdGljIGJvb2wgRFhUNTsNCisJCQlzdGF0aWMgYm9vbCBBVEkxOw0KKwkJCXN0YXRpYyBib29sIEFUSTI7DQorCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIFIxNkY7DQorCQkJc3RhdGljIGJvb2wgRzE2UjE2RjsNCisJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTZGOw0KKwkJCXN0YXRpYyBib29sIFIzMkY7DQorCQkJc3RhdGljIGJvb2wgRzMyUjMyRjsNCisJCQlzdGF0aWMgYm9vbCBBMzJCMzJHMzJSMzJGOw0KKwkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBWOFU4Ow0KKwkJCXN0YXRpYyBib29sIEw2VjVVNTsNCisJCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsNCisJCQlzdGF0aWMgYm9vbCBROFc4VjhVODsNCisJCQlzdGF0aWMgYm9vbCBWMTZVMTY7DQorCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7DQorCQkJc3RhdGljIGJvb2wgUTE2VzE2VjE2VTE2Ow0KKwkJCS8vIEx1bWluYW5jZSBmb3JtYXRzDQorCQkJc3RhdGljIGJvb2wgTDg7DQorCQkJc3RhdGljIGJvb2wgQTRMNDsNCisJCQlzdGF0aWMgYm9vbCBMMTY7DQorCQkJc3RhdGljIGJvb2wgQThMODsNCisJCX07DQorDQorCQlzdHJ1Y3QgQ3ViZU1hcA0KKwkJew0KKwkJCXN0cnVjdCBSZW5kZXJUYXJnZXQNCisJCQl7DQorCQkJCXN0YXRpYyBib29sIE5VTExfOw0KKwkJCQlzdGF0aWMgYm9vbCBSOEc4Qjg7DQorCQkJCXN0YXRpYyBib29sIFI1RzZCNTsNCisJCQkJc3RhdGljIGJvb2wgWDFSNUc1QjU7DQorCQkJCXN0YXRpYyBib29sIEExUjVHNUI1Ow0KKwkJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsNCisJCQkJc3RhdGljIGJvb2wgUjNHM0IyOw0KKwkJCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsNCisJCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7DQorCQkJCXN0YXRpYyBib29sIEE4UjhHOEI4Ow0KKwkJCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsNCisJCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7DQorCQkJCXN0YXRpYyBib29sIFg4QjhHOFI4Ow0KKwkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzDQorCQkJCXN0YXRpYyBib29sIEcxNlIxNjsNCisJCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7DQorCQkJCXN0YXRpYyBib29sIEEyUjEwRzEwQjEwOw0KKwkJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTY7DQorCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMNCisJCQkJc3RhdGljIGJvb2wgUjE2RjsNCisJCQkJc3RhdGljIGJvb2wgRzE2UjE2RjsNCisJCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2RjsNCisJCQkJc3RhdGljIGJvb2wgUjMyRjsNCisJCQkJc3RhdGljIGJvb2wgRzMyUjMyRjsNCisJCQkJc3RhdGljIGJvb2wgQTMyQjMyRzMyUjMyRjsNCisJCQl9Ow0KKw0KKwkJCXN0cnVjdCBEZXB0aFN0ZW5jaWwNCisJCQl7DQorCQkJCXN0YXRpYyBib29sIEQzMjsNCisJCQkJc3RhdGljIGJvb2wgRDI0Uzg7DQorCQkJCXN0YXRpYyBib29sIEQyNFg4Ow0KKwkJCQlzdGF0aWMgYm9vbCBEMTY7DQorCQkJCXN0YXRpYyBib29sIEQyNEZTODsNCisJCQkJc3RhdGljIGJvb2wgRDMyRl9MT0NLQUJMRTsNCisJCQkJc3RhdGljIGJvb2wgREYyNDsNCisJCQkJc3RhdGljIGJvb2wgREYxNjsNCisJCQkJc3RhdGljIGJvb2wgSU5UWjsNCisJCQl9Ow0KKw0KKwkJCXN0YXRpYyBib29sIEE4Ow0KKwkJCXN0YXRpYyBib29sIFI1RzZCNTsNCisJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsNCisJCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsNCisJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsNCisJCQlzdGF0aWMgYm9vbCBSM0czQjI7DQorCQkJc3RhdGljIGJvb2wgQThSM0czQjI7DQorCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7DQorCQkJc3RhdGljIGJvb2wgUjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIFg4UjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIEE4UjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIEE4QjhHOFI4Ow0KKwkJCXN0YXRpYyBib29sIFg4QjhHOFI4Ow0KKwkJCS8vIFBhbGV0dGVkIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBQODsNCisJCQlzdGF0aWMgYm9vbCBBOFA4Ow0KKwkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBHMTZSMTY7DQorCQkJc3RhdGljIGJvb2wgQTJSMTBHMTBCMTA7DQorCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7DQorCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2Ow0KKwkJCS8vIENvbXByZXNzZWQgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIERYVDE7DQorCQkJc3RhdGljIGJvb2wgRFhUMjsNCisJCQlzdGF0aWMgYm9vbCBEWFQzOw0KKwkJCXN0YXRpYyBib29sIERYVDQ7DQorCQkJc3RhdGljIGJvb2wgRFhUNTsNCisJCQlzdGF0aWMgYm9vbCBBVEkxOw0KKwkJCXN0YXRpYyBib29sIEFUSTI7DQorCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIFIxNkY7DQorCQkJc3RhdGljIGJvb2wgRzE2UjE2RjsNCisJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTZGOw0KKwkJCXN0YXRpYyBib29sIFIzMkY7DQorCQkJc3RhdGljIGJvb2wgRzMyUjMyRjsNCisJCQlzdGF0aWMgYm9vbCBBMzJCMzJHMzJSMzJGOw0KKwkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBWOFU4Ow0KKwkJCXN0YXRpYyBib29sIEw2VjVVNTsNCisJCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsNCisJCQlzdGF0aWMgYm9vbCBROFc4VjhVODsNCisJCQlzdGF0aWMgYm9vbCBWMTZVMTY7DQorCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7DQorCQkJc3RhdGljIGJvb2wgUTE2VzE2VjE2VTE2Ow0KKwkJCS8vIEx1bWluYW5jZSBmb3JtYXRzDQorCQkJc3RhdGljIGJvb2wgTDg7DQorCQkJc3RhdGljIGJvb2wgQTRMNDsNCisJCQlzdGF0aWMgYm9vbCBMMTY7DQorCQkJc3RhdGljIGJvb2wgQThMODsNCisJCX07DQorDQorCQlzdHJ1Y3QgVm9sdW1lVGV4dHVyZQ0KKwkJew0KKwkJCXN0YXRpYyBib29sIEE4Ow0KKwkJCXN0YXRpYyBib29sIFI1RzZCNTsNCisJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsNCisJCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsNCisJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsNCisJCQlzdGF0aWMgYm9vbCBSM0czQjI7DQorCQkJc3RhdGljIGJvb2wgQThSM0czQjI7DQorCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7DQorCQkJc3RhdGljIGJvb2wgUjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIFg4UjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIEE4UjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIEE4QjhHOFI4Ow0KKwkJCXN0YXRpYyBib29sIFg4QjhHOFI4Ow0KKwkJCS8vIFBhbGV0dGVkIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBQODsNCisJCQlzdGF0aWMgYm9vbCBBOFA4Ow0KKwkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBHMTZSMTY7DQorCQkJc3RhdGljIGJvb2wgQTJSMTBHMTBCMTA7DQorCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7DQorCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2Ow0KKwkJCS8vIENvbXByZXNzZWQgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIERYVDE7DQorCQkJc3RhdGljIGJvb2wgRFhUMjsNCisJCQlzdGF0aWMgYm9vbCBEWFQzOw0KKwkJCXN0YXRpYyBib29sIERYVDQ7DQorCQkJc3RhdGljIGJvb2wgRFhUNTsNCisJCQlzdGF0aWMgYm9vbCBBVEkxOw0KKwkJCXN0YXRpYyBib29sIEFUSTI7DQorCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIFIxNkY7DQorCQkJc3RhdGljIGJvb2wgRzE2UjE2RjsNCisJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTZGOw0KKwkJCXN0YXRpYyBib29sIFIzMkY7DQorCQkJc3RhdGljIGJvb2wgRzMyUjMyRjsNCisJCQlzdGF0aWMgYm9vbCBBMzJCMzJHMzJSMzJGOw0KKwkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBWOFU4Ow0KKwkJCXN0YXRpYyBib29sIEw2VjVVNTsNCisJCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsNCisJCQlzdGF0aWMgYm9vbCBROFc4VjhVODsNCisJCQlzdGF0aWMgYm9vbCBWMTZVMTY7DQorCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7DQorCQkJc3RhdGljIGJvb2wgUTE2VzE2VjE2VTE2Ow0KKwkJCS8vIEx1bWluYW5jZSBmb3JtYXRzDQorCQkJc3RhdGljIGJvb2wgTDg7DQorCQkJc3RhdGljIGJvb2wgQTRMNDsNCisJCQlzdGF0aWMgYm9vbCBMMTY7DQorCQkJc3RhdGljIGJvb2wgQThMODsNCisJCX07DQorDQorCQlzdHJ1Y3QgVGV4dHVyZQ0KKwkJew0KKwkJCXN0cnVjdCBSZW5kZXJUYXJnZXQNCisJCQl7DQorCQkJCXN0YXRpYyBib29sIE5VTExfOw0KKwkJCQlzdGF0aWMgYm9vbCBSOEc4Qjg7DQorCQkJCXN0YXRpYyBib29sIFI1RzZCNTsNCisJCQkJc3RhdGljIGJvb2wgWDFSNUc1QjU7DQorCQkJCXN0YXRpYyBib29sIEExUjVHNUI1Ow0KKwkJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsNCisJCQkJc3RhdGljIGJvb2wgUjNHM0IyOw0KKwkJCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsNCisJCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7DQorCQkJCXN0YXRpYyBib29sIEE4UjhHOEI4Ow0KKwkJCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsNCisJCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7DQorCQkJCXN0YXRpYyBib29sIFg4QjhHOFI4Ow0KKwkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzDQorCQkJCXN0YXRpYyBib29sIEcxNlIxNjsNCisJCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7DQorCQkJCXN0YXRpYyBib29sIEEyUjEwRzEwQjEwOw0KKwkJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTY7DQorCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMNCisJCQkJc3RhdGljIGJvb2wgUjE2RjsNCisJCQkJc3RhdGljIGJvb2wgRzE2UjE2RjsNCisJCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2RjsNCisJCQkJc3RhdGljIGJvb2wgUjMyRjsNCisJCQkJc3RhdGljIGJvb2wgRzMyUjMyRjsNCisJCQkJc3RhdGljIGJvb2wgQTMyQjMyRzMyUjMyRjsNCisJCQl9Ow0KKw0KKwkJCXN0cnVjdCBEZXB0aFN0ZW5jaWwNCisJCQl7DQorCQkJCXN0YXRpYyBib29sIEQzMjsNCisJCQkJc3RhdGljIGJvb2wgRDI0Uzg7DQorCQkJCXN0YXRpYyBib29sIEQyNFg4Ow0KKwkJCQlzdGF0aWMgYm9vbCBEMTY7DQorCQkJCXN0YXRpYyBib29sIEQyNEZTODsNCisJCQkJc3RhdGljIGJvb2wgRDMyRl9MT0NLQUJMRTsNCisJCQkJc3RhdGljIGJvb2wgREYyNDsNCisJCQkJc3RhdGljIGJvb2wgREYxNjsNCisJCQkJc3RhdGljIGJvb2wgSU5UWjsNCisJCQl9Ow0KKw0KKwkJCXN0YXRpYyBib29sIE5VTExfOw0KKwkJCXN0YXRpYyBib29sIEE4Ow0KKwkJCXN0YXRpYyBib29sIFI1RzZCNTsNCisJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsNCisJCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsNCisJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsNCisJCQlzdGF0aWMgYm9vbCBSM0czQjI7DQorCQkJc3RhdGljIGJvb2wgQThSM0czQjI7DQorCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7DQorCQkJc3RhdGljIGJvb2wgUjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIFg4UjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIEE4UjhHOEI4Ow0KKwkJCXN0YXRpYyBib29sIEE4QjhHOFI4Ow0KKwkJCXN0YXRpYyBib29sIFg4QjhHOFI4Ow0KKwkJCS8vIFBhbGV0dGVkIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBQODsNCisJCQlzdGF0aWMgYm9vbCBBOFA4Ow0KKwkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBHMTZSMTY7DQorCQkJc3RhdGljIGJvb2wgQTJSMTBHMTBCMTA7DQorCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7DQorCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2Ow0KKwkJCS8vIENvbXByZXNzZWQgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIERYVDE7DQorCQkJc3RhdGljIGJvb2wgRFhUMjsNCisJCQlzdGF0aWMgYm9vbCBEWFQzOw0KKwkJCXN0YXRpYyBib29sIERYVDQ7DQorCQkJc3RhdGljIGJvb2wgRFhUNTsNCisJCQlzdGF0aWMgYm9vbCBBVEkxOw0KKwkJCXN0YXRpYyBib29sIEFUSTI7DQorCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cw0KKwkJCXN0YXRpYyBib29sIFIxNkY7DQorCQkJc3RhdGljIGJvb2wgRzE2UjE2RjsNCisJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTZGOw0KKwkJCXN0YXRpYyBib29sIFIzMkY7DQorCQkJc3RhdGljIGJvb2wgRzMyUjMyRjsNCisJCQlzdGF0aWMgYm9vbCBBMzJCMzJHMzJSMzJGOw0KKwkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMNCisJCQlzdGF0aWMgYm9vbCBWOFU4Ow0KKwkJCXN0YXRpYyBib29sIEw2VjVVNTsNCisJCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsNCisJCQlzdGF0aWMgYm9vbCBROFc4VjhVODsNCisJCQlzdGF0aWMgYm9vbCBWMTZVMTY7DQorCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7DQorCQkJc3RhdGljIGJvb2wgUTE2VzE2VjE2VTE2Ow0KKwkJCS8vIEx1bWluYW5jZSBmb3JtYXRzDQorCQkJc3RhdGljIGJvb2wgTDg7DQorCQkJc3RhdGljIGJvb2wgQTRMNDsNCisJCQlzdGF0aWMgYm9vbCBMMTY7DQorCQkJc3RhdGljIGJvb2wgQThMODsNCisJCQkvLyBEZXB0aCBmb3JtYXRzDQorCQkJc3RhdGljIGJvb2wgRDMyOw0KKwkJCXN0YXRpYyBib29sIEQyNFM4Ow0KKwkJCXN0YXRpYyBib29sIEQyNFg4Ow0KKwkJCXN0YXRpYyBib29sIEQxNjsNCisJCQlzdGF0aWMgYm9vbCBEMjRGUzg7DQorCQkJc3RhdGljIGJvb2wgRDMyRl9MT0NLQUJMRTsNCisJCQlzdGF0aWMgYm9vbCBERjI0Ow0KKwkJCXN0YXRpYyBib29sIERGMTY7DQorCQkJc3RhdGljIGJvb2wgSU5UWjsNCisJCX07DQorDQorCQlzdGF0aWMgYm9vbCBpc1NSR0JyZWFkYWJsZShEM0RGT1JNQVQgZm9ybWF0KTsNCisJCXN0YXRpYyBib29sIGlzU1JHQndyaXRhYmxlKEQzREZPUk1BVCBmb3JtYXQpOw0KKwl9Ow0KKw0KKwlleHRlcm4gdW5zaWduZWQgaW50IHBpeGVsU2hhZGVyVmVyc2lvblg7DQorCWV4dGVybiB1bnNpZ25lZCBpbnQgdmVydGV4U2hhZGVyVmVyc2lvblg7DQorDQorCWV4dGVybiB1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyQXJiaXRyYXJ5U3dpenpsZTsNCisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJHcmFkaWVudEluc3RydWN0aW9uczsNCisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJQcmVkaWNhdGlvbjsNCisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJOb0RlcGVuZGVudFJlYWRMaW1pdDsNCisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJOb1RleEluc3RydWN0aW9uTGltaXQ7DQorDQorCWV4dGVybiB1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGg7DQorCWV4dGVybiB1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyU3RhdGljRmxvd0NvbnRyb2xEZXB0aDsNCisNCisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmVydGV4U2hhZGVyUHJlZGljYXRpb247DQorCWV4dGVybiB1bnNpZ25lZCBsb25nIHZlcnRleFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoOw0KKw0KKwlleHRlcm4gdW5zaWduZWQgaW50IHRleHR1cmVNZW1vcnk7DQorCWV4dGVybiB1bnNpZ25lZCBpbnQgbWF4QW5pc290cm9weTsNCit9DQorDQorI2VuZGlmICAgLy8gRDNEOV9DYXBhYmlsaXRpZXNfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRDNEOS5jcHAgYi9zcmMvRDNEOS9EM0Q5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTExYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRDNEOS5jcHAKQEAgLTAsMCArMSwyOTMgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNEOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0Q5RXguaHBwIgorCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSAicmVzb3VyY2UuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJY2xhc3MgRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5CisJeworCXB1YmxpYzoKKwkJRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5KCk7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5KCk7CisKKwkJdmlydHVhbCBpbnQgX19zdGRjYWxsIFZhbGlkYXRlU2hhZGVyKGxvbmcgKnNoYWRlciwgbG9uZyAqc2hhZGVyMSwgbG9uZyAqc2hhZGVyMiwgbG9uZyAqc2hhZGVyMyk7CisJCXZpcnR1YWwgaW50IF9fc3RkY2FsbCBWYWxpZGF0ZVNoYWRlcjIobG9uZyAqc2hhZGVyKTsKKwkJdmlydHVhbCBpbnQgX19zdGRjYWxsIFZhbGlkYXRlU2hhZGVyMyhsb25nICpzaGFkZXIsIGxvbmcgKnNoYWRlcjEsIGxvbmcgKnNoYWRlcjIsIGxvbmcgKnNoYWRlcjMpOworCQl2aXJ0dWFsIGludCBfX3N0ZGNhbGwgVmFsaWRhdGVTaGFkZXI0KGxvbmcgKnNoYWRlciwgbG9uZyAqc2hhZGVyMSwgbG9uZyAqc2hhZGVyMiwgbG9uZyAqc2hhZGVyMyk7CisJCXZpcnR1YWwgaW50IF9fc3RkY2FsbCBWYWxpZGF0ZVNoYWRlcjUobG9uZyAqc2hhZGVyLCBsb25nICpzaGFkZXIxLCBsb25nICpzaGFkZXIyKTsKKwkJdmlydHVhbCBpbnQgX19zdGRjYWxsIFZhbGlkYXRlU2hhZGVyNihsb25nICpzaGFkZXIsIGxvbmcgKnNoYWRlcjEsIGxvbmcgKnNoYWRlcjIsIGxvbmcgKnNoYWRlcjMpOworCX07CisKKwlEaXJlY3QzRFNoYWRlclZhbGlkYXRvcjk6OkRpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOSgpCisJeworCX0KKworCURpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOTo6fkRpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOSgpCisJeworCX0KKworCWludCBfX3N0ZGNhbGwgRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5OjpWYWxpZGF0ZVNoYWRlcihsb25nICpzaGFkZXIsIGxvbmcgKnNoYWRlcjEsIGxvbmcgKnNoYWRlcjIsIGxvbmcgKnNoYWRlcjMpICAgLy8gRklYTUUKKwl7CisJCVRSQUNFKCIiKTsKKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIHRydWU7ICAgLy8gRklYTUUKKwl9CisKKwlpbnQgX19zdGRjYWxsIERpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOTo6VmFsaWRhdGVTaGFkZXIyKGxvbmcgKnNoYWRlcikgICAvLyBGSVhNRQorCXsKKwkJVFJBQ0UoIiIpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gdHJ1ZTsgICAvLyBGSVhNRQorCX0KKworCWludCBfX3N0ZGNhbGwgRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5OjpWYWxpZGF0ZVNoYWRlcjMobG9uZyAqc2hhZGVyLCBsb25nICpzaGFkZXIxLCBsb25nICpzaGFkZXIyLCBsb25nICpzaGFkZXIzKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gdHJ1ZTsgICAvLyBGSVhNRQorCX0KKworCWludCBfX3N0ZGNhbGwgRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5OjpWYWxpZGF0ZVNoYWRlcjQobG9uZyAqc2hhZGVyLCBsb25nICpzaGFkZXIxLCBsb25nICpzaGFkZXIyLCBsb25nICpzaGFkZXIzKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gdHJ1ZTsgICAvLyBGSVhNRQorCX0KKworCWludCBfX3N0ZGNhbGwgRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5OjpWYWxpZGF0ZVNoYWRlcjUobG9uZyAqc2hhZGVyLCBsb25nICpzaGFkZXIxLCBsb25nICpzaGFkZXIyKSAgIC8vIEZJWE1FCisJeworCQlUUkFDRSgiIik7CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiB0cnVlOyAgIC8vIEZJWE1FCisJfQorCisJaW50IF9fc3RkY2FsbCBEaXJlY3QzRFNoYWRlclZhbGlkYXRvcjk6OlZhbGlkYXRlU2hhZGVyNihsb25nICpzaGFkZXIsIGxvbmcgKnNoYWRlcjEsIGxvbmcgKnNoYWRlcjIsIGxvbmcgKnNoYWRlcjMpICAgLy8gRklYTUUKKwl7CisJCVRSQUNFKCIiKTsKKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIHRydWU7ICAgLy8gRklYTUUKKwl9Cit9CisKK3VzaW5nIG5hbWVzcGFjZSBEM0Q5OworCitleHRlcm4gIkMiCit7CisJSElOU1RBTkNFIGRsbEluc3RhbmNlID0gMDsKKworCWludAlfX3N0ZGNhbGwgRGxsTWFpbihISU5TVEFOQ0UgaW5zdGFuY2UsIHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICpyZXNlcnZlZCkKKwl7CisJCSNpZm5kZWYgTkRFQlVHCisJCQlpZihkbGxJbnN0YW5jZSA9PSAwKQorCQkJeworCQkJCUZJTEUgKmZpbGUgPSBmb3BlbigiZGVidWcudHh0IiwgInciKTsgICAvLyBDbGVhciBkZWJ1ZyBsb2cKKwkJCQlmY2xvc2UoZmlsZSk7CisJCQl9CisJCSNlbmRpZgorCisJCUdUUkFDRSgiSElOU1RBTkNFIGluc3RhbmNlID0gMHglMC44cCwgdW5zaWduZWQgbG9uZyByZWFzb24gPSAlZCwgdm9pZCAqcmVzZXJ2ZWQgPSAweCUwLjhwIiwgaW5zdGFuY2UsIHJlYXNvbiwgcmVzZXJ2ZWQpOworCisJCWRsbEluc3RhbmNlCT0gaW5zdGFuY2U7CisKKwkJc3dpdGNoKHJlYXNvbikKKwkJeworCQljYXNlIERMTF9QUk9DRVNTX0RFVEFDSDoKKwkJCWJyZWFrOworCQljYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKwkJCURpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMoaW5zdGFuY2UpOworCQkJYnJlYWs7CisJCWNhc2UgRExMX1RIUkVBRF9BVFRBQ0g6CisJCQlicmVhazsKKwkJY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCUlEaXJlY3QzRDkgKl9fc3RkY2FsbCBEaXJlY3QzRENyZWF0ZTkodW5zaWduZWQgaW50IHZlcnNpb24pCisJeworCQlHVFJBQ0UoIiIpOworCisJCS8vIEQzRF9TREtfVkVSU0lPTiBjaGVjaworCQlpZih2ZXJzaW9uICE9ICgzMSB8IDB4ODAwMDAwMDApICYmIC8vIDkuMGEvYiBERUJVR19JTkZPCisJCSAgIHZlcnNpb24gIT0gMzEgJiYgICAgICAgICAgICAgICAgLy8gOS4wYS9iCisJCSAgIHZlcnNpb24gIT0gKDMyIHwgMHg4MDAwMDAwMCkgJiYgLy8gOS4wYyBERUJVR19JTkZPCisJCSAgIHZlcnNpb24gIT0gMzIpICAgICAgICAgICAgICAgICAgLy8gOS4wYworCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCUlEaXJlY3QzRDkgKmRldmljZSA9IG5ldyBEM0Q5OjpEaXJlY3QzRDkodmVyc2lvbiwgZGxsSW5zdGFuY2UpOworCisJCWlmKGRldmljZSkKKwkJeworCQkJZGV2aWNlLT5BZGRSZWYoKTsKKwkJfQorCisJCXJldHVybiBkZXZpY2U7CisJfQorCisJSFJFU1VMVCBfX3N0ZGNhbGwgRGlyZWN0M0RDcmVhdGU5RXgodW5zaWduZWQgaW50IHZlcnNpb24sIElEaXJlY3QzRDlFeCAqKmRldmljZSkKKwl7CisJCS8vIEQzRF9TREtfVkVSU0lPTiBjaGVjaworCQlpZih2ZXJzaW9uICE9ICgzMSB8IDB4ODAwMDAwMDApICYmIC8vIDkuMGEvYiBERUJVR19JTkZPCisJCSAgIHZlcnNpb24gIT0gMzEgJiYgICAgICAgICAgICAgICAgLy8gOS4wYS9iCisJCSAgIHZlcnNpb24gIT0gKDMyIHwgMHg4MDAwMDAwMCkgJiYgLy8gOS4wYyBERUJVR19JTkZPCisJCSAgIHZlcnNpb24gIT0gMzIpICAgICAgICAgICAgICAgICAgLy8gOS4wYworCQl7CisJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCX0KKworCQkqZGV2aWNlID0gbmV3IEQzRDk6OkRpcmVjdDNEOUV4KHZlcnNpb24sIGRsbEluc3RhbmNlKTsKKworCQlpZihkZXZpY2UpCisJCXsKKwkJCSgqZGV2aWNlKS0+QWRkUmVmKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJaW50IF9fc3RkY2FsbCBDaGVja0Z1bGxzY3JlZW4oKQorCXsKKwkJR1RSQUNFKCIiKTsKKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWludCBfX3N0ZGNhbGwgRDNEUEVSRl9CZWdpbkV2ZW50KEQzRENPTE9SIGNvbG9yLCBjb25zdCB3Y2hhcl90ICpuYW1lKQorCXsKKwkJR1RSQUNFKCIiKTsKKworCS8vCVVOSU1QTEVNRU5URUQoKTsgICAvLyBQSVggdW5zdXBwb3J0ZWQKKworCQlyZXR1cm4gLTE7CisJfQorCisJaW50IF9fc3RkY2FsbCBEM0RQRVJGX0VuZEV2ZW50KCkKKwl7CisJCUdUUkFDRSgiIik7CisKKwkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gUElYIHVuc3VwcG9ydGVkCisKKwkJcmV0dXJuIC0xOworCX0KKworCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEQzRFBFUkZfR2V0U3RhdHVzKCkKKwl7CisJCUdUUkFDRSgiIik7CisKKwkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gUElYIHVuc3VwcG9ydGVkCisKKwkJcmV0dXJuIDA7CisJfQorCisJaW50IF9fc3RkY2FsbCBEM0RQRVJGX1F1ZXJ5UmVwZWF0RnJhbWUoKQorCXsKKwkJR1RSQUNFKCIiKTsKKworCS8vCVVOSU1QTEVNRU5URUQoKTsgICAvLyBQSVggdW5zdXBwb3J0ZWQKKworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJdm9pZCBfX3N0ZGNhbGwgRDNEUEVSRl9TZXRNYXJrZXIoRDNEQ09MT1IgY29sb3IsIGNvbnN0IHdjaGFyX3QgKm5hbWUpCisJeworCQlHVFJBQ0UoIiIpOworCisJLy8JVU5JTVBMRU1FTlRFRCgpOyAgIC8vIFBJWCB1bnN1cHBvcnRlZAorCX0KKworCXZvaWQgX19zdGRjYWxsIEQzRFBFUkZfU2V0T3B0aW9ucyh1bnNpZ25lZCBsb25nIG9wdGlvbnMpCisJeworCQlHVFJBQ0UoIiIpOworCisJLy8JVU5JTVBMRU1FTlRFRCgpOyAgIC8vIFBJWCB1bnN1cHBvcnRlZAorCX0KKworCXZvaWQgX19zdGRjYWxsIEQzRFBFUkZfU2V0UmVnaW9uKEQzRENPTE9SIGNvbG9yLCBjb25zdCB3Y2hhcl90ICpuYW1lKQorCXsKKwkJR1RSQUNFKCIiKTsKKwkKKwkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gUElYIHVuc3VwcG9ydGVkCisJfQorCisJdm9pZCBfX2NkZWNsIERlYnVnU2V0TGV2ZWwobG9uZyBsZXZlbCkKKwl7CisJCUdUUkFDRSgibG9uZyBsZXZlbCA9ICVkIiwgbGV2ZWwpOworCisJLy8JVU5JTVBMRU1FTlRFRCgpOyAgIC8vIERlYnVnIG91dHB1dCB1bnN1cHBvcnRlZAorCX0KKworCXZvaWQgX19jZGVjbCBEZWJ1Z1NldE11dGUobG9uZyBtdXRlKQorCXsKKwkJR1RSQUNFKCJsb25nIG11dGUgPSAlZCIsIG11dGUpOworCisJLy8JVU5JTVBMRU1FTlRFRCgpOyAgIC8vIERlYnVnIG91dHB1dCB1bnN1cHBvcnRlZAorCX0KKwkKKwl2b2lkICpfX3N0ZGNhbGwgRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3JDcmVhdGU5KCkKKwl7CisJCUdUUkFDRSgiIik7CisKKwkvLwlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIDA7CisKKwkvLwlyZXR1cm4gbmV3IEQzRDk6OkRpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOSgpOworCX0KKworCXZvaWQgX19zdGRjYWxsIFBTR1BFcnJvcigpCisJeworCQlHVFJBQ0UoIiIpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKwl9CisKKwl2b2lkIF9fc3RkY2FsbCBQU0dQU2FtcGxlVGV4dHVyZSgpCisJeworCQlHVFJBQ0UoIiIpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EM0Q5LnJjIGIvc3JjL0QzRDkvRDNEOS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDliNmJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRDNEOS5yYwpAQCAtMCwwICsxLDEwMSBAQAorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgZ2VuZXJhdGVkIHJlc291cmNlIHNjcmlwdC4NCisvLw0KKyNpbmNsdWRlICJyZXNvdXJjZS5oIg0KKw0KKyNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMiByZXNvdXJjZS4NCisvLw0KKyNpbmNsdWRlICJhZnhyZXMuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL1ZlcnNpb24uaCINCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKyN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSByZXNvdXJjZXMNCisNCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpDQorTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMNCisjcHJhZ21hIGNvZGVfcGFnZSgxMjUyKQ0KKw0KKyNpZmRlZiBBUFNUVURJT19JTlZPS0VEDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIFRFWFRJTkNMVURFDQorLy8NCisNCisxIFRFWFRJTkNMVURFIA0KK0JFR0lODQorICAgICJyZXNvdXJjZS5oXDAiDQorRU5EDQorDQorMiBURVhUSU5DTFVERSANCitCRUdJTg0KKyAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiINCisgICAgIiNpbmNsdWRlICIiLi4vQ29tbW9uL1ZlcnNpb24uaCIiXDAiDQorRU5EDQorDQorMyBURVhUSU5DTFVERSANCitCRUdJTg0KKyAgICAiXHJcbiINCisgICAgIlwwIg0KK0VORA0KKw0KKyNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VEDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIFZlcnNpb24NCisvLw0KKw0KK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTw0KKyBGSUxFVkVSU0lPTiBNQUpPUl9WRVJTSU9OLE1JTk9SX1ZFUlNJT04sQlVJTERfVkVSU0lPTixCVUlMRF9SRVZJU0lPTg0KKyBQUk9EVUNUVkVSU0lPTiBNQUpPUl9WRVJTSU9OLE1JTk9SX1ZFUlNJT04sQlVJTERfVkVSU0lPTixCVUlMRF9SRVZJU0lPTg0KKyBGSUxFRkxBR1NNQVNLIDB4MWZMDQorI2lmZGVmIF9ERUJVRw0KKyBGSUxFRkxBR1MgMHg5TA0KKyNlbHNlDQorIEZJTEVGTEFHUyAweDhMDQorI2VuZGlmDQorIEZJTEVPUyAweDRMDQorIEZJTEVUWVBFIDB4MkwNCisgRklMRVNVQlRZUEUgMHgwTA0KK0JFR0lODQorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyINCisgICAgQkVHSU4NCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCINCisgICAgICAgIEJFR0lODQorICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIlRyYW5zR2FtaW5nIg0KKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiU3dpZnRTaGFkZXIgRGlyZWN0M0QgOSBTb2Z0d2FyZSBSZW5kZXJlciINCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCBWRVJTSU9OX1NUUklORw0KKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAiRDNEOSINCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDExIFRyYW5zR2FtaW5nIEluYy4iDQorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiZDNkOS5kbGwiDQorICAgICAgICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsIFJFVklTSU9OX1NUUklORw0KKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJTd2lmdFNoYWRlciBEaXJlY3QzRCA5IFNvZnR3YXJlIFJlbmRlcmVyIg0KKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsIFZFUlNJT05fU1RSSU5HDQorICAgICAgICBFTkQNCisgICAgRU5EDQorICAgIEJMT0NLICJWYXJGaWxlSW5mbyINCisgICAgQkVHSU4NCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwDQorICAgIEVORA0KK0VORA0KKw0KKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSByZXNvdXJjZXMNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKw0KKw0KKyNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4NCisvLw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorI2VuZGlmICAgIC8vIG5vdCBBUFNUVURJT19JTlZPS0VEDQorDQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRDNEOS52Y3hwcm9qIGIvc3JjL0QzRDkvRDNEOS52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZGU1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EM0Q5LnZjeHByb2oKQEAgLTAsMCArMSw0NjIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+e0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH08L1Byb2plY3RHdWlkPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNQUC5VcGdyYWRlRnJvbVZDNzEucHJvcHMiIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNQUC5VcGdyYWRlRnJvbVZDNzEucHJvcHMiIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKU1pY3Jvc29mdC5DUFAuVXBncmFkZUZyb21WQzcxLnByb3BzIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClNaWNyb3NvZnQuQ1BQLlVwZ3JhZGVGcm9tVkM3MS5wcm9wcyIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNQUC5VcGdyYWRlRnJvbVZDNzEucHJvcHMiIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClNaWNyb3NvZnQuQ1BQLlVwZ3JhZGVGcm9tVkM3MS5wcm9wcyIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8TGlicmFyeVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChEWFNES19ESVIpTGliXHg4NjskKExpYnJhcnlQYXRoKTwvTGlicmFyeVBhdGg+DQorICAgIDxMaWJyYXJ5UGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChEWFNES19ESVIpTGliXHg4NjskKExpYnJhcnlQYXRoKTwvTGlicmFyeVBhdGg+DQorICAgIDxMaWJyYXJ5UGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKERYU0RLX0RJUilMaWJceDg2OyQoTGlicmFyeVBhdGgpPC9MaWJyYXJ5UGF0aD4NCisgICAgPExpYnJhcnlQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChEWFNES19ESVIpTGliXHg2NDskKExpYnJhcnlQYXRoKTwvTGlicmFyeVBhdGg+DQorICAgIDxMaWJyYXJ5UGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+JChEWFNES19ESVIpTGliXHg2NDskKExpYnJhcnlQYXRoKTwvTGlicmFyeVBhdGg+DQorICAgIDxMaWJyYXJ5UGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JChEWFNES19ESVIpTGliXHg2NDskKExpYnJhcnlQYXRoKTwvTGlicmFyeVBhdGg+DQorICAgIDxJbmNsdWRlUGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChEWFNES19ESVIpSW5jbHVkZTskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+DQorICAgIDxJbmNsdWRlUGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKERYU0RLX0RJUilJbmNsdWRlOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4NCisgICAgPEluY2x1ZGVQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoRFhTREtfRElSKUluY2x1ZGU7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPg0KKyAgICA8SW5jbHVkZVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKERYU0RLX0RJUilJbmNsdWRlOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4NCisgICAgPEluY2x1ZGVQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKERYU0RLX0RJUilJbmNsdWRlOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4NCisgICAgPEluY2x1ZGVQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKERYU0RLX0RJUilJbmNsdWRlOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkRlZmF1bHQ8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPk5laXRoZXI8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlw7Li5cTWFpbjsuLlxSZW5kZXJlcjsuLlxTaGFkZXI7Li5cQ29tbW9uOy4uXFN3aWZ0QXNtOy4uXGxpYmpwZWc7Li5cU3dpZnRTaGFkZXI7Li5cRDNEOTsuLlxSZWFjdG9yOy4uXExMVk1caW5jbHVkZTsuLlxMTFZNXHdpbjMyOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMO0QzRDlETExfRVhQT1JUUztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5FeGNlcHRpb25IYW5kbGluZy5ocHA7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5keGd1aWQubGliO1dTMl8zMi5saWI7Y29tY3RsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO1BzYXBpLmxpYjtQc2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8SWdub3JlU3BlY2lmaWNEZWZhdWx0TGlicmFyaWVzPmxpYmNpLmxpYjslKElnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcyk8L0lnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+ZDNkOS5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKUQzRDkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKUQzRDkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpZDNkOS5kbGw8L091dHB1dEZpbGU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5EZWZhdWx0PC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5OZWl0aGVyPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cOy4uXE1haW47Li5cUmVuZGVyZXI7Li5cU2hhZGVyOy4uXENvbW1vbjsuLlxTd2lmdEFzbTsuLlxsaWJqcGVnOy4uXFN3aWZ0U2hhZGVyOy4uXEQzRDk7Li5cUmVhY3RvcjsuLlxMTFZNXGluY2x1ZGU7Li5cTExWTVx3aW4zMjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtEM0Q5RExMX0VYUE9SVFM7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+RXhjZXB0aW9uSGFuZGxpbmcuaHBwOyUoRm9yY2VkSW5jbHVkZUZpbGVzKTwvRm9yY2VkSW5jbHVkZUZpbGVzPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+ZHhndWlkLmxpYjtXUzJfMzIubGliO2NvbWN0bDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjtQc2FwaS5saWI7UHNhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPElnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcz5saWJjaS5saWI7JShJZ25vcmVTcGVjaWZpY0RlZmF1bHRMaWJyYXJpZXMpPC9JZ25vcmVTcGVjaWZpY0RlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPmQzZDkuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpcilEM0Q5LnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8SW1wb3J0TGlicmFyeT4kKE91dERpcilEM0Q5LmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKWQzZDkuZGxsPC9PdXRwdXRGaWxlPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlw7Li5cTWFpbjsuLlxSZW5kZXJlcjsuLlxTaGFkZXI7Li5cQ29tbW9uOy4uXFN3aWZ0QXNtOy4uXGxpYmpwZWc7Li5cU3dpZnRTaGFkZXI7Li5cRDNEOTsuLlxSZWFjdG9yOy4uXExMVk1caW5jbHVkZTsuLlxMTFZNXHdpbjMyOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztfVVNSRExMO0QzRDlETExfRVhQT1JUUztETEw7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEV4cGFuZEF0dHJpYnV0ZWRTb3VyY2U+ZmFsc2U8L0V4cGFuZEF0dHJpYnV0ZWRTb3VyY2U+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+RXhjZXB0aW9uSGFuZGxpbmcuaHBwOyUoRm9yY2VkSW5jbHVkZUZpbGVzKTwvRm9yY2VkSW5jbHVkZUZpbGVzPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+ZHhndWlkLmxpYjtXUzJfMzIubGliO2NvbWN0bDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjtQc2FwaS5saWI7UHNhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPElnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcz5saWJjaS5saWI7JShJZ25vcmVTcGVjaWZpY0RlZmF1bHRMaWJyYXJpZXMpPC9JZ25vcmVTcGVjaWZpY0RlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPmQzZDkuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8U2V0Q2hlY2tzdW0+dHJ1ZTwvU2V0Q2hlY2tzdW0+DQorICAgICAgPEltcG9ydExpYnJhcnk+JChPdXREaXIpRDNEOS5saWI8L0ltcG9ydExpYnJhcnk+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj5Vc2VMaW5rVGltZUNvZGVHZW5lcmF0aW9uPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKWQzZDkuZGxsPC9PdXRwdXRGaWxlPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXDsuLlxNYWluOy4uXFJlbmRlcmVyOy4uXFNoYWRlcjsuLlxDb21tb247Li5cU3dpZnRBc207Li5cbGlianBlZzsuLlxTd2lmdFNoYWRlcjsuLlxEM0Q5Oy4uXFJlYWN0b3I7Li5cTExWTVxpbmNsdWRlOy4uXExMVk1cd2luMzI7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7RDNEOURMTF9FWFBPUlRTO0RMTDtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8RXhwYW5kQXR0cmlidXRlZFNvdXJjZT5mYWxzZTwvRXhwYW5kQXR0cmlidXRlZFNvdXJjZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5FeGNlcHRpb25IYW5kbGluZy5ocHA7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5keGd1aWQubGliO1dTMl8zMi5saWI7Y29tY3RsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO1BzYXBpLmxpYjtQc2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8SWdub3JlU3BlY2lmaWNEZWZhdWx0TGlicmFyaWVzPmxpYmNpLmxpYjslKElnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcyk8L0lnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+ZDNkOS5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFNldENoZWNrc3VtPnRydWU8L1NldENoZWNrc3VtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKUQzRDkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+RGVmYXVsdDwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcilkM2Q5LmRsbDwvT3V0cHV0RmlsZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTVAgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXDsuLlxNYWluOy4uXFJlbmRlcmVyOy4uXFNoYWRlcjsuLlxDb21tb247Li5cU3dpZnRBc207Li5cbGlianBlZzsuLlxTd2lmdFNoYWRlcjsuLlxEM0Q5Oy4uXFJlYWN0b3I7Li5cTExWTVxpbmNsdWRlOy4uXExMVk1cd2luMzI7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7RDNEOURMTF9FWFBPUlRTO0RMTDtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8RXhwYW5kQXR0cmlidXRlZFNvdXJjZT5mYWxzZTwvRXhwYW5kQXR0cmlidXRlZFNvdXJjZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5FeGNlcHRpb25IYW5kbGluZy5ocHA7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5keGd1aWQubGliO1dTMl8zMi5saWI7Y29tY3RsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO1BzYXBpLmxpYjtQc2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8SWdub3JlU3BlY2lmaWNEZWZhdWx0TGlicmFyaWVzPmxpYmNpLmxpYjslKElnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcyk8L0lnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+ZDNkOS5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+ZmFsc2U8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxTZXRDaGVja3N1bT50cnVlPC9TZXRDaGVja3N1bT4NCisgICAgICA8SW1wb3J0TGlicmFyeT4kKE91dERpcilEM0Q5LmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPlVzZUxpbmtUaW1lQ29kZUdlbmVyYXRpb248L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpZDNkOS5kbGw8L091dHB1dEZpbGU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01QICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXDsuLlxNYWluOy4uXFJlbmRlcmVyOy4uXFNoYWRlcjsuLlxDb21tb247Li5cU3dpZnRBc207Li5cbGlianBlZzsuLlxTd2lmdFNoYWRlcjsuLlxEM0Q5Oy4uXFJlYWN0b3I7Li5cTExWTVxpbmNsdWRlOy4uXExMVk1cd2luMzI7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7RDNEOURMTF9FWFBPUlRTO0RMTDtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8RXhwYW5kQXR0cmlidXRlZFNvdXJjZT5mYWxzZTwvRXhwYW5kQXR0cmlidXRlZFNvdXJjZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5FeGNlcHRpb25IYW5kbGluZy5ocHA7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5keGd1aWQubGliO1dTMl8zMi5saWI7Y29tY3RsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO1BzYXBpLmxpYjtQc2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8SWdub3JlU3BlY2lmaWNEZWZhdWx0TGlicmFyaWVzPmxpYmNpLmxpYjslKElnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcyk8L0lnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+ZDNkOS5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFNldENoZWNrc3VtPnRydWU8L1NldENoZWNrc3VtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKUQzRDkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+RGVmYXVsdDwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcilkM2Q5LmRsbDwvT3V0cHV0RmlsZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJDYXBhYmlsaXRpZXMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkQzRDkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRlYnVnLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRDkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEOUV4LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzREJhc2VUZXh0dXJlOS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RDdWJlVGV4dHVyZTkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNERGV2aWNlOS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0REZXZpY2U5RXguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNESW5kZXhCdWZmZXI5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFBpeGVsU2hhZGVyOS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RRdWVyeTkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEUmVzb3VyY2U5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFN0YXRlQmxvY2s5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFN1cmZhY2U5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFN3YXBDaGFpbjkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEVGV4dHVyZTkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEVmVydGV4QnVmZmVyOS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEVmVydGV4U2hhZGVyOS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RWb2x1bWU5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFZvbHVtZVRleHR1cmU5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJTd2lmdFNoYWRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bi5jcHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iQ2FwYWJpbGl0aWVzLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEZWJ1Zy5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0Q5LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRDlFeC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEQ3ViZVRleHR1cmU5LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRERldmljZTkuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNERGV2aWNlOUV4LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzREluZGV4QnVmZmVyOS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RQaXhlbFNoYWRlcjkuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEUXVlcnk5LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFJlc291cmNlOS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RTdGF0ZUJsb2NrOS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RTdXJmYWNlOS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RTd2FwQ2hhaW45LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFRleHR1cmU5LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFZlcnRleEJ1ZmZlcjkuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFZlcnRleFNoYWRlcjkuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEVm9sdW1lOS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RWb2x1bWVUZXh0dXJlOS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icmVzb3VyY2UuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJTd2lmdFNoYWRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlN3aWZ0U2hhZGVyLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJVbmtub3duLmhwcCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSJEM0Q5LnJjIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJkM2Q5LmRlZiIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cTExWTVx3aW4zMlxBbmFseXNpc1xBbmFseXNpcy52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MDYyMmU4MjctODQ2NC00ODlkLThiMWMtYjBiNDk2ZjM1YzA4fTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxMTFZNXHdpbjMyXENvZGVHZW5cQ29kZUdlbi52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MDhjZWIxYmItYzJhNC00NTg3LWI5YTktYWVkYjhmYjQ0ODk3fTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxMTFZNXHdpbjMyXEV4ZWN1dGlvbkVuZ2luZVxFeGVjdXRpb25FbmdpbmUudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezc2Mjk1YWU4LWEwODMtNDYwZS05ZjgwLTZmMmI4OTIzMjY0YX08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cTExWTVx3aW4zMlxNQ1xNQy52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MTJkMDBjZmEtZTM5My00ODU3LWE0MzYtYzczMjQ4NDlkZTUxfTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxMTFZNXHdpbjMyXFN1cHBvcnRcU3VwcG9ydC52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MjhhYTkxNDYtMzQ4Mi00ZjQxLTljYzYtNDA3YjFkMjU4NTA4fTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxMTFZNXHdpbjMyXFN5c3RlbVxTeXN0ZW0udmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezBmODQwN2YzLWZhMjMtNGNmMS04M2E5LWRjYmUwYjM2MTQ4OX08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cTExWTVx3aW4zMlxUYXJnZXRcVGFyZ2V0LnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0PnswNTlmYmFiOC1jNzZkLTQ4YTAtYWE3NS0zYzU3YmQzZWFmZTR9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXExMVk1cd2luMzJcVHJhbnNmb3Jtc1xUcmFuc2Zvcm1zLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0PntjNTkzNzRjMS05ZmMwLTQxNDctYjgzNi0zMjdkZmRjNTJkOTl9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXExMVk1cd2luMzJcVk1Db3JlXFZNQ29yZS52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57NDVjZDc4ZDctYzVkOS00N2ZlLWFkMTItZjMyNTFlZWRhZmZifTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxMTFZNXHdpbjMyXHg4Nlx4ODYudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezE0NGVlYmY2LThjOWItNDQ3My1iNzE1LTJjODIxNjY2YWY2Y308L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUmVhY3RvclxSZWFjdG9yLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0PnsyOGZkMDc2ZC0xMGI1LTRiZDgtYTRjZi1mNDRjNzAwMmE4MDN9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFN3aWZ0U2hhZGVyXFN3aWZ0U2hhZGVyLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns3YjAyY2IxOS00Y2RmLTRmNzktYmM5Yi03ZjNmNjE2NGEwMDN9PC9Qcm9qZWN0Pg0KKyAgICAgIDxSZWZlcmVuY2VPdXRwdXRBc3NlbWJseT5mYWxzZTwvUmVmZXJlbmNlT3V0cHV0QXNzZW1ibHk+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EM0Q5LnZjeHByb2ouZmlsdGVycyBiL3NyYy9EM0Q5L0QzRDkudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OGE2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EM0Q5LnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDE3NiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXg8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM7eHNkPC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJSZXNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+cmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkNhcGFiaWxpdGllcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkQzRDkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEZWJ1Zy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEOS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEOUV4LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RCYXNlVGV4dHVyZTkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzREN1YmVUZXh0dXJlOS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNERGV2aWNlOS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNERGV2aWNlOUV4LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RJbmRleEJ1ZmZlcjkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFBpeGVsU2hhZGVyOS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEUXVlcnk5LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RSZXNvdXJjZTkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFN0YXRlQmxvY2s5LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RTdXJmYWNlOS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEU3dhcENoYWluOS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEVGV4dHVyZTkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFZlcnRleEJ1ZmZlcjkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEVmVydGV4U2hhZGVyOS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEVm9sdW1lOS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEVm9sdW1lVGV4dHVyZTkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJTd2lmdFNoYWRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlVua25vd24uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJDYXBhYmlsaXRpZXMuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEZWJ1Zy5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEOS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEOUV4LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzREN1YmVUZXh0dXJlOS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNERGV2aWNlOS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNERGV2aWNlOUV4LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RJbmRleEJ1ZmZlcjkuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFBpeGVsU2hhZGVyOS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEUXVlcnk5LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RSZXNvdXJjZTkuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFN0YXRlQmxvY2s5LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RTdXJmYWNlOS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEU3dhcENoYWluOS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEVGV4dHVyZTkuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFZlcnRleEJ1ZmZlcjkuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEVmVydGV4U2hhZGVyOS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEVm9sdW1lOS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEVm9sdW1lVGV4dHVyZTkuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJyZXNvdXJjZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJTd2lmdFNoYWRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJTd2lmdFNoYWRlci5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlVua25vd24uaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSJEM0Q5LnJjIj4NCisgICAgICA8RmlsdGVyPlJlc291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJkM2Q5LmRlZiIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EZWJ1Zy5jcHAgYi9zcmMvRDNEOS9EZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkMDczMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RlYnVnLmNwcApAQCAtMCwwICsxLDE0IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKK2ludCBUcmFjZTo6aW5kZW50ID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RlYnVnLmhwcCBiL3NyYy9EM0Q5L0RlYnVnLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDY2MmVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGVidWcuaHBwCkBAIC0wLDAgKzEsMTcwIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZiBEZWJ1Z19ocHANCisjZGVmaW5lIERlYnVnX2hwcA0KKw0KKyNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTg0KKwkjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4NCisjZW5kaWYNCisjaW5jbHVkZSA8d2luZG93cy5oPg0KKyNpbmNsdWRlIDxkM2Q5Lmg+DQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPGd1aWRkZWYuaD4NCisjaW5jbHVkZSA8YXNzZXJ0Lmg+DQorDQorI2RlZmluZSBBUFBFTkQoeCwgeSkgeCAjIyB5DQorI2RlZmluZSBNQUNST19BUFBFTkQoeCwgeSkgQVBQRU5EKHgsIHkpDQorI2RlZmluZSBVTklRVUVfSURFTlRJRklFUihwcmVmaXgpIE1BQ1JPX0FQUEVORChwcmVmaXgsIF9fQ09VTlRFUl9fKQ0KKw0KK3N0cnVjdCBUcmFjZQ0KK3sNCisJVHJhY2UoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pDQorCXsNCisJCWlmKGZhbHNlKQ0KKwkJew0KKwkJCUZJTEUgKmZpbGUgPSBmb3BlbigiZGVidWcudHh0IiwgImEiKTsNCisNCisJCQlpZihmaWxlKQ0KKwkJCXsNCisJCQkJZm9yKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSBmcHJpbnRmKGZpbGUsICIgIik7DQorDQorCQkJCXZhX2xpc3QgdmFyYXJnOw0KKwkJCQl2YV9zdGFydCh2YXJhcmcsIGZvcm1hdCk7DQorCQkJCXZmcHJpbnRmKGZpbGUsIGZvcm1hdCwgdmFyYXJnKTsNCisJCQkJdmFfZW5kKHZhcmFyZyk7DQorDQorCQkJCWZjbG9zZShmaWxlKTsNCisJCQl9DQorCQl9DQorDQorCQlpbmRlbnQrKzsNCisJfQ0KKw0KKwl+VHJhY2UoKQ0KKwl7DQorCQlpbmRlbnQtLTsNCisJfQ0KKw0KKwlzdGF0aWMgaW50IGluZGVudDsNCit9Ow0KKw0KKyNpZm5kZWYgTkRFQlVHDQorCSNkZWZpbmUgVFJBQ0UoZm9ybWF0LCAuLi4pIFRyYWNlIFVOSVFVRV9JREVOVElGSUVSKF90cmFjZXJfKSgiWzB4JTAuOFhdJXMoImZvcm1hdCIpXG4iLCB0aGlzLCBfX0ZVTkNUSU9OX18sIF9fVkFfQVJHU19fKQ0KKwkjZGVmaW5lIEdUUkFDRShmb3JtYXQsIC4uLikgVHJhY2UoIiVzKCJmb3JtYXQiKVxuIiwgX19GVU5DVElPTl9fLCBfX1ZBX0FSR1NfXykNCisjZWxzZQ0KKwkjZGVmaW5lIFRSQUNFKC4uLikgKCh2b2lkKTApDQorCSNkZWZpbmUgR1RSQUNFKC4uLikgKCh2b2lkKTApDQorI2VuZGlmDQorDQorI2lmbmRlZiBOREVCVUcNCisJI2RlZmluZSBBU1NFUlQoZXhwcmVzc2lvbikge2lmKCEoZXhwcmVzc2lvbikpIFRyYWNlKCJcdCEgQXNzZXJ0IGZhaWxlZCBpbiAlcyglZCk6ICIjZXhwcmVzc2lvbiJcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBhc3NlcnQoZXhwcmVzc2lvbik7fQ0KKyNlbHNlDQorCSNkZWZpbmUgQVNTRVJUIGFzc2VydA0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgTkRFQlVHDQorCSNkZWZpbmUgVU5JTVBMRU1FTlRFRCgpIHtUcmFjZSgiXHQhIFVuaW1wbGVtZW50ZWQ6ICVzKCVkKVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IEFTU0VSVChmYWxzZSk7fQ0KKyNlbHNlDQorCSNkZWZpbmUgVU5JTVBMRU1FTlRFRCgpICgodm9pZCkwKQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgTkRFQlVHDQorCSNkZWZpbmUgTk9JTlRFUkZBQ0UoaWlkKSBfTk9JTlRFUkZBQ0UoX19GVU5DVElPTl9fLCBpaWQpDQorDQorCWlubGluZSBsb25nIF9OT0lOVEVSRkFDRShjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgSUlEICZpaWQpDQorCXsNCisJCVRyYWNlKCJcdCEgTm8gaW50ZXJmYWNlIHsweCUwLjhYLCAweCUwLjRYLCAweCUwLjRYLCAweCUwLjJYLCAweCUwLjJYLCAweCUwLjJYLCAweCUwLjJYLCAweCUwLjJYLCAweCUwLjJYLCAweCUwLjJYLCAweCUwLjJYfSBmb3IgJXNcbiIsIGlpZC5EYXRhMSwgaWlkLkRhdGEyLCBpaWQuRGF0YTMsIGlpZC5EYXRhNFswXSwgaWlkLkRhdGE0WzFdLCBpaWQuRGF0YTRbMl0sIGlpZC5EYXRhNFszXSwgaWlkLkRhdGE0WzRdLCBpaWQuRGF0YTRbNV0sIGlpZC5EYXRhNFs2XSwgaWlkLkRhdGE0WzddLCBmdW5jdGlvbik7DQorDQorCQlyZXR1cm4gRV9OT0lOVEVSRkFDRTsNCisJfQ0KKyNlbHNlDQorCSNkZWZpbmUgTk9JTlRFUkZBQ0UoaWlkKSBFX05PSU5URVJGQUNFDQorI2VuZGlmDQorDQorI2lmbmRlZiBOREVCVUcNCisJaW5saW5lIGxvbmcgSU5WQUxJRENBTEwoKQ0KKwl7DQorCQlUcmFjZSgiXHQhIEQzREVSUl9JTlZBTElEQ0FMTFxuIik7DQorDQorCQlyZXR1cm4gRDNERVJSX0lOVkFMSURDQUxMOw0KKwl9DQorI2Vsc2UNCisJI2RlZmluZSBJTlZBTElEQ0FMTCgpIEQzREVSUl9JTlZBTElEQ0FMTA0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgTkRFQlVHDQorCWlubGluZSBsb25nIE9VVE9GTUVNT1JZKCkNCisJew0KKwkJVHJhY2UoIlx0ISBFX09VVE9GTUVNT1JZXG4iKTsNCisNCisJCXJldHVybiBFX09VVE9GTUVNT1JZOw0KKwl9DQorI2Vsc2UNCisJI2RlZmluZSBPVVRPRk1FTU9SWSgpIEVfT1VUT0ZNRU1PUlkNCisjZW5kaWYNCisNCisjaWZuZGVmIE5ERUJVRw0KKwlpbmxpbmUgbG9uZyBPVVRPRlZJREVPTUVNT1JZKCkNCisJew0KKwkJVHJhY2UoIlx0ISBEM0RFUlJfT1VUT0ZWSURFT01FTU9SWVxuIik7DQorDQorCQlyZXR1cm4gRDNERVJSX09VVE9GVklERU9NRU1PUlk7DQorCX0NCisjZWxzZQ0KKwkjZGVmaW5lIE9VVE9GVklERU9NRU1PUlkoKSBEM0RFUlJfT1VUT0ZWSURFT01FTU9SWQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgTkRFQlVHDQorCWlubGluZSBsb25nIE5PVEFWQUlMQUJMRSgpDQorCXsNCisJCVRyYWNlKCJcdCEgRDNERVJSX05PVEFWQUlMQUJMRVxuIik7DQorDQorCQlyZXR1cm4gRDNERVJSX05PVEFWQUlMQUJMRTsNCisJfQ0KKyNlbHNlDQorCSNkZWZpbmUgTk9UQVZBSUxBQkxFKCkgRDNERVJSX05PVEFWQUlMQUJMRQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgTkRFQlVHDQorCWlubGluZSBsb25nIE5PVEZPVU5EKCkNCisJew0KKwkJVHJhY2UoIlx0ISBEM0RFUlJfTk9URk9VTkRcbiIpOw0KKw0KKwkJcmV0dXJuIEQzREVSUl9OT1RGT1VORDsNCisJfQ0KKyNlbHNlDQorCSNkZWZpbmUgTk9URk9VTkQoKSBEM0RFUlJfTk9URk9VTkQNCisjZW5kaWYNCisNCisjaWZuZGVmIE5ERUJVRw0KKwlpbmxpbmUgbG9uZyBNT1JFREFUQSgpDQorCXsNCisJCVRyYWNlKCJcdCEgRDNERVJSX01PUkVEQVRBXG4iKTsNCisNCisJCXJldHVybiBEM0RFUlJfTU9SRURBVEE7DQorCX0NCisjZWxzZQ0KKwkjZGVmaW5lIE1PUkVEQVRBKCkgRDNERVJSX01PUkVEQVRBDQorI2VuZGlmDQorDQorI2lmbmRlZiBOREVCVUcNCisJaW5saW5lIGxvbmcgRkFJTCgpDQorCXsNCisJCVRyYWNlKCJcdCEgRV9GQUlMXG4iKTsNCisNCisJCXJldHVybiBFX0ZBSUw7DQorCX0NCisjZWxzZQ0KKwkjZGVmaW5lIEZBSUwoKSBFX0ZBSUwNCisjZW5kaWYNCisNCisjZW5kaWYgICAvLyBEZWJ1Z19ocHANCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRDkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0Q5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOThiMjJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0Q5LmNwcApAQCAtMCwwICsxLDE2MzcgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNEOS5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgorI2luY2x1ZGUgIkNhcGFiaWxpdGllcy5ocHAiCisjaW5jbHVkZSAiU3dpZnRTaGFkZXIuaHBwIgorI2luY2x1ZGUgIkNvbmZpZ3VyYXRvci5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorI2luY2x1ZGUgIkNQVUlELmhwcCIKKyNpbmNsdWRlICJWZXJzaW9uLmgiCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKworI2RlZmluZSBDT01QSUxFX01VTFRJTU9OX1NUVUJTCisjaW5jbHVkZSA8bXVsdGltb24uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxwc2FwaS5oPgorCituYW1lc3BhY2UgRDNEOQoreworCURpcmVjdDNEOTo6RGlyZWN0M0Q5KGludCB2ZXJzaW9uLCBjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UpIDogdmVyc2lvbih2ZXJzaW9uKSwgaW5zdGFuY2UoaW5zdGFuY2UpCisJeworCQlkaXNwbGF5TW9kZSA9IDA7CisJCW51bURpc3BsYXlNb2RlcyA9IDA7CisKKwkJREVWTU9ERSBkZXZtb2RlOworCQlkZXZtb2RlLmRtU2l6ZSA9IHNpemVvZihERVZNT0RFKTsKKworCQkvLyBDb3VudCBudW1iZXIgb2YgZGlzcGxheSBtb2RlcworCQl3aGlsZShFbnVtRGlzcGxheVNldHRpbmdzKDAsIG51bURpc3BsYXlNb2RlcywgJmRldm1vZGUpKSAgIC8vIEZJWE1FOiBPbmx5IGVudW1hcmF0ZSBpbnRlcm5hbCBtb2RlcyEKKwkJeworCQkJbnVtRGlzcGxheU1vZGVzKys7CisJCX0KKworCQlkaXNwbGF5TW9kZSA9IG5ldyBERVZNT0RFW251bURpc3BsYXlNb2Rlc107CisKKwkJLy8gU3RvcmUgZGlzcGxheSBtb2RlcyBpbmZvcm1hdGlvbgorCQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtRGlzcGxheU1vZGVzOyBpKyspCisJCXsKKwkJCWRpc3BsYXlNb2RlW2ldLmRtU2l6ZSA9IHNpemVvZihERVZNT0RFKTsKKwkJCUVudW1EaXNwbGF5U2V0dGluZ3MoMCwgaSwgJmRpc3BsYXlNb2RlW2ldKTsKKwkJfQorCisJCWQzZDlMaWIgPSAwOworCQlkM2Q5ID0gMDsKKworCQlzdzo6Q29uZmlndXJhdG9yIGluaSgiU3dpZnRTaGFkZXIuaW5pIik7CisKKwkJZGlzYWJsZUFscGhhTW9kZSA9IGluaS5nZXRCb29sZWFuKCJUZXN0aW5nIiwgIkRpc2FibGVBbHBoYU1vZGUiLCBmYWxzZSk7CisJCWRpc2FibGUxMEJpdE1vZGUgPSBpbmkuZ2V0Qm9vbGVhbigiVGVzdGluZyIsICJEaXNhYmxlMTBCaXRNb2RlIiwgZmFsc2UpOworCisJCWludCBwcyA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiUGl4ZWxTaGFkZXJWZXJzaW9uIiwgMzApOworCQlpbnQgdnMgPSBpbmkuZ2V0SW50ZWdlcigiQ2FwYWJpbGl0aWVzIiwgIlZlcnRleFNoYWRlclZlcnNpb24iLCAzMCk7CisKKwkJICAgICBpZihwcyA9PSAgMCkgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMCwgMCk7CisJCWVsc2UgaWYocHMgPD0gMTEpIHBpeGVsU2hhZGVyVmVyc2lvblggPSBEM0RQU19WRVJTSU9OKDEsIDEpOworCQllbHNlIGlmKHBzIDw9IDEyKSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigxLCAyKTsKKwkJZWxzZSBpZihwcyA8PSAxMykgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMSwgMyk7CisJCWVsc2UgaWYocHMgPD0gMTQpIHBpeGVsU2hhZGVyVmVyc2lvblggPSBEM0RQU19WRVJTSU9OKDEsIDQpOworCQllbHNlIGlmKHBzIDw9IDIwKSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigyLCAwKTsKKwkJZWxzZSBpZihwcyA8PSAyMSkgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMiwgMSk7CisJCWVsc2UgICAgICAgICAgICAgIHBpeGVsU2hhZGVyVmVyc2lvblggPSBEM0RQU19WRVJTSU9OKDMsIDApOworCisgICAgICAgICAgICAgaWYodnMgPT0gIDApIHZlcnRleFNoYWRlclZlcnNpb25YID0gRDNEVlNfVkVSU0lPTigwLCAwKTsKKwkJZWxzZSBpZih2cyA8PSAxMSkgdmVydGV4U2hhZGVyVmVyc2lvblggPSBEM0RWU19WRVJTSU9OKDEsIDEpOworCQllbHNlIGlmKHZzIDw9IDIwKSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uWCA9IEQzRFZTX1ZFUlNJT04oMiwgMCk7CisJCWVsc2UgaWYodnMgPD0gMjEpIHZlcnRleFNoYWRlclZlcnNpb25YID0gRDNEVlNfVkVSU0lPTigyLCAxKTsKKwkJZWxzZSAgICAgICAgICAgICAgdmVydGV4U2hhZGVyVmVyc2lvblggPSBEM0RWU19WRVJTSU9OKDMsIDApOworCisJCXBpeGVsU2hhZGVyQXJiaXRyYXJ5U3dpenpsZSA9IDA7CisJCXBpeGVsU2hhZGVyR3JhZGllbnRJbnN0cnVjdGlvbnMgPSAwOworCQlwaXhlbFNoYWRlclByZWRpY2F0aW9uID0gMDsKKwkJcGl4ZWxTaGFkZXJOb0RlcGVuZGVudFJlYWRMaW1pdCA9IDA7CisJCXBpeGVsU2hhZGVyTm9UZXhJbnN0cnVjdGlvbkxpbWl0ID0gMDsKKworCQlwaXhlbFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoID0gRDNEUFMyMF9NSU5fRFlOQU1JQ0ZMT1dDT05UUk9MREVQVEg7CisJCXBpeGVsU2hhZGVyU3RhdGljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFBTMjBfTUlOX1NUQVRJQ0ZMT1dDT05UUk9MREVQVEg7CisKKwkJaWYocHMgPj0gMjEpCisJCXsKKwkJCXBpeGVsU2hhZGVyQXJiaXRyYXJ5U3dpenpsZSA9IEQzRFBTMjBDQVBTX0FSQklUUkFSWVNXSVpaTEU7CisJCQlwaXhlbFNoYWRlckdyYWRpZW50SW5zdHJ1Y3Rpb25zID0gRDNEUFMyMENBUFNfR1JBRElFTlRJTlNUUlVDVElPTlM7CisJCQlwaXhlbFNoYWRlclByZWRpY2F0aW9uID0gRDNEUFMyMENBUFNfUFJFRElDQVRJT047CisJCQlwaXhlbFNoYWRlck5vRGVwZW5kZW50UmVhZExpbWl0ID0gRDNEUFMyMENBUFNfTk9ERVBFTkRFTlRSRUFETElNSVQ7CisJCQlwaXhlbFNoYWRlck5vVGV4SW5zdHJ1Y3Rpb25MaW1pdCA9IEQzRFBTMjBDQVBTX05PVEVYSU5TVFJVQ1RJT05MSU1JVDsKKworCQkJcGl4ZWxTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFBTMjBfTUFYX0RZTkFNSUNGTE9XQ09OVFJPTERFUFRIOworCQkJcGl4ZWxTaGFkZXJTdGF0aWNGbG93Q29udHJvbERlcHRoID0gRDNEUFMyMF9NQVhfU1RBVElDRkxPV0NPTlRST0xERVBUSDsKKwkJfQorCisJCXZlcnRleFNoYWRlclByZWRpY2F0aW9uID0gMDsKKwkJdmVydGV4U2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSAwOworCisJCWlmKHZzID49IDIxKQorCQl7CisJCQl2ZXJ0ZXhTaGFkZXJQcmVkaWNhdGlvbiA9IEQzRFZTMjBDQVBTX1BSRURJQ0FUSU9OOworCQkJdmVydGV4U2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSBEM0RWUzIwX01BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsKKwkJfQorCisJCXRleHR1cmVNZW1vcnkgPSAxMDI0ICogMTAyNCAqIGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiVGV4dHVyZU1lbW9yeSIsIDI1Nik7CisKKwkJaW50IHNoYWRvd01hcHBpbmcgPSBpbmkuZ2V0SW50ZWdlcigiVGVzdGluZyIsICJTaGFkb3dNYXBwaW5nIiwgMyk7CisKKwkJaWYoc2hhZG93TWFwcGluZyAhPSAyICYmIHNoYWRvd01hcHBpbmcgIT0gMykgICAvLyBObyBEU1Qgc3VwcG9ydAorCQl7CisJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDMyID0gZmFsc2U7CisJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0UzggPSBmYWxzZTsKKwkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRYOCA9IGZhbHNlOworCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQxNiA9IGZhbHNlOworCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNEZTOCA9IGZhbHNlOworCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMkZfTE9DS0FCTEUgPSBmYWxzZTsKKworCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMzIgPSBmYWxzZTsKKwkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0UzggPSBmYWxzZTsKKwkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0WDggPSBmYWxzZTsKKwkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDE2ID0gZmFsc2U7CisJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNEZTOCA9IGZhbHNlOworCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMzJGX0xPQ0tBQkxFID0gZmFsc2U7CisJCX0KKworCQlpZihzaGFkb3dNYXBwaW5nICE9IDEgJiYgc2hhZG93TWFwcGluZyAhPSAzKSAgIC8vIE5vIEZldGNoNCBzdXBwb3J0CisJCXsKKwkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpERjI0ID0gZmFsc2U7CisJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYxNiA9IGZhbHNlOworCisJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRGMjQgPSBmYWxzZTsKKwkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6REYxNiA9IGZhbHNlOworCQl9CisJfQorCisJRGlyZWN0M0Q5Ojp+RGlyZWN0M0Q5KCkKKwl7CisJCWRlbGV0ZVtdIGRpc3BsYXlNb2RlOworCQlkaXNwbGF5TW9kZSA9IDA7CisKKwkJaWYoZDNkOSkKKwkJeworCQkJZDNkOS0+UmVsZWFzZSgpOworCQkJZDNkOSA9IDA7CisJCX0KKworCQlpZihkM2Q5TGliKQorCQl7CisJCQlGcmVlTGlicmFyeShkM2Q5TGliKTsKKwkJCWQzZDlMaWIgPSAwOworCQl9CisJfQorCisJbG9uZyBEaXJlY3QzRDk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJVFJBQ0UoImNvbnN0IElJRCAmaWlkID0gMHglMC44cCwgdm9pZCAqKm9iamVjdCA9IDB4JTAuOHAiLCBpaWQsIG9iamVjdCk7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0Q5IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisJCWVsc2UgaWYoaWlkID09IElJRF9Td2lmdFNoYWRlclByaXZhdGVWMSkKKwkJeworCQkJU3dpZnRTaGFkZXIgKnN3aWZ0U2hhZGVyID0gbmV3IFN3aWZ0U2hhZGVyKHRoaXMpOworCisJCQkqb2JqZWN0ID0gc3dpZnRTaGFkZXI7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRDk6OkFkZFJlZigpCisJeworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEOTo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRDk6OkNoZWNrRGVwdGhTdGVuY2lsTWF0Y2godW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIEQzREZPUk1BVCByZW5kZXJUYXJnZXRGb3JtYXQsIEQzREZPUk1BVCBkZXB0aFN0ZW5jaWxGb3JtYXQpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0ID0gJWQsIEQzREZPUk1BVCByZW5kZXJUYXJnZXRGb3JtYXQgPSAlZCwgRDNERk9STUFUIGRlcHRoU3RlbmNpbEZvcm1hdCA9ICVkIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q5KCk7CisKKwkJCWlmKGQzZDkpCisJCQl7CisJCQkJcmV0dXJuIGQzZDktPkNoZWNrRGVwdGhTdGVuY2lsTWF0Y2goYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBDaGVja0RlcHRoU3RlbmNpbE1hdGNoKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBhZGFwdGVyRm9ybWF0LCByZW5kZXJUYXJnZXRGb3JtYXQsIGRlcHRoU3RlbmNpbEZvcm1hdCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRDNEX09LOyAgIC8vIEFueSBmb3JtYXQgY29tYmluYXRpb24gaXMgb2sKKwl9CisKKwlsb25nIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VGb3JtYXQodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzRFJFU09VUkNFVFlQRSByZXNvdXJjZVR5cGUsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQgPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RSRVNPVVJDRVRZUEUgcmVzb3VyY2VUeXBlID0gJWQsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCA9ICVkIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q5KCk7CisKKwkJCWlmKGQzZDkpCisJCQl7CisJCQkJcmV0dXJuIGQzZDktPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKKwkJCX0KKwkJfQorCQkKKwkJaWYodXNhZ2UgJiBEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRCkKKwkJeworCQkJaWYoIUNhcGFiaWxpdGllczo6aXNTUkdCcmVhZGFibGUoY2hlY2tGb3JtYXQpKQorCQkJeworCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCX0KKwkJfQorCisJCWlmKHVzYWdlICYgRDNEVVNBR0VfUVVFUllfU1JHQldSSVRFKQorCQl7CisJCQlpZighQ2FwYWJpbGl0aWVzOjppc1NSR0J3cml0YWJsZShjaGVja0Zvcm1hdCkpCisJCQl7CisJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJfQorCQl9CisKKwkJLy8gQVRJIGhhY2sgdG8gaW5kaWNhdGUgaW5zdGFuY2luZyBzdXBwb3J0IG9uIFNNIDIuMCBoYXJkd2FyZQorCQlpZihjaGVja0Zvcm1hdCA9PSBEM0RGTVRfSU5TVCAmJiBwaXhlbFNoYWRlclZlcnNpb25YID49IEQzRFBTX1ZFUlNJT04oMiwgMCkgJiYgcGl4ZWxTaGFkZXJWZXJzaW9uWCA8IEQzRFBTX1ZFUlNJT04oMywgMCkpCisJCXsKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKworCQlzd2l0Y2gocmVzb3VyY2VUeXBlKQorCQl7CisJCWNhc2UgRDNEUlRZUEVfU1VSRkFDRToKKwkJCWlmKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKQorCQkJeworCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKKwkJCQl7CisJCQkJY2FzZSBEM0RGTVRfTlVMTDoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Ok5VTExfKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTJSMTBHMTBCMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9SMTZGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjE2RikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTZGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTZGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjMyRikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpHMzJSMzJGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMzJCMzJHMzJSMzJGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZih1c2FnZSAmIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCkKKwkJCXsKKwkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQkJeworCQkJCWNhc2UgRDNERk1UX0QzMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQzMikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EMjRTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQyNFM4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0WDgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QyNEZTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQyNEZTOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDMyRl9MT0NLQUJMRSkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfREYyNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkRGMjQpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfREYxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkRGMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfSU5UWjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OklOVFopCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQkJeworCQkJCWNhc2UgRDNERk1UX0E4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlgxUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSM0czQjIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4QjhHOFI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1A4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMlIxMEcxMEIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTE2QjE2RzE2UjE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9EWFQxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0RYVDM6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUMykJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EWFQ0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUNToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQ1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0FUSTE6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QVRJMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BVEkyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkFUSTIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RzE2UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMTZCMTZHMTZSMTZGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkczMlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTMyQjMyRzMyUjMyRikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gQnVtcCBtYXAgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlE4VzhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlExNlcxNlYxNlUxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9MODoJCQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTRMNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9MMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TDE2KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOEw4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4TDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gRGVwdGggQm91bmRzIFRlc3QKKwkJCQljYXNlIEQzREZNVF9OVkRCOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Ok5WREIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gVHJhbnNwYXJlbmN5IGFudGktYWxpYXNpbmcKKwkJCQljYXNlIEQzREZNVF9BVE9DOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkFUT0MpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJY2FzZSBEM0RSVFlQRV9WT0xVTUU6CisJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQl7CisJCQljYXNlIEQzREZNVF9BODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDFSNUc1QjUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkExUjVHNUI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBNFI0RzRCNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYNFI0RzRCNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDhCOEc4UjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4QjhHOFI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cworCQkJY2FzZSBEM0RGTVRfUDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0E4UDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCisJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkEyUjEwRzEwQjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJCMTBHMTBSMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTE2QjE2RzE2UjE2KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKKwkJCWNhc2UgRDNERk1UX0RYVDE6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMSkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9EWFQyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDIpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQzKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUNCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9EWFQ1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDUpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQVRJMToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBVEkxKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0FUSTI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QVRJMikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCisJCQljYXNlIEQzREZNVF9SMTZGOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlIxNkYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfRzE2UjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkcxNlIxNkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMTZCMTZHMTZSMTZGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1IzMkY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjMyRikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzMyUjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0EzMkIzMkczMlIzMkY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkEzMkIzMkczMlIzMkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJLy8gQnVtcCBtYXAgZm9ybWF0cworCQkJY2FzZSBEM0RGTVRfVjhVODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpWOFU4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0w2VjVVNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpMNlY1VTUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4TDhWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpROFc4VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpWMTZVMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1ExNlcxNlYxNlUxNjoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UTE2VzE2VjE2VTE2KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cworCQkJY2FzZSBEM0RGTVRfTDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Okw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTRMNCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9MMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDE2KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0E4TDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCX0KKwkJY2FzZSBEM0RSVFlQRV9DVUJFVEVYVFVSRToKKwkJCWlmKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKQorCQkJeworCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKKwkJCQl7CisJCQkJY2FzZSBEM0RGTVRfTlVMTDoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Ok5VTExfKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTJSMTBHMTBCMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9SMTZGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjE2RikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMTZSMTZGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTZGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjMyRikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMzJSMzJGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMzJCMzJHMzJSMzJGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZih1c2FnZSAmIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCkKKwkJCXsKKwkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQkJeworCQkJCWNhc2UgRDNERk1UX0QzMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQzMikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EMjRTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQyNFM4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0WDgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QyNEZTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQyNEZTOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDMyRl9MT0NLQUJMRSkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfREYyNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkRGMjQpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfREYxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkRGMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfSU5UWjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OklOVFopCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQkJeworCQkJCWNhc2UgRDNERk1UX0E4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlgxUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThSM0czQjIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4QjhHOFI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1A4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMlIxMEcxMEIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTE2QjE2RzE2UjE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9EWFQxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEWFQyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0RYVDM6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMykJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EWFQ0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUNToJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEWFQ1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0FUSTE6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QVRJMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BVEkyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkFUSTIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzE2UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMTZCMTZHMTZSMTZGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkczMlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTMyQjMyRzMyUjMyRikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gQnVtcCBtYXAgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlE4VzhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlExNlcxNlYxNlUxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9MODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTRMNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9MMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDE2KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOEw4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4TDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJY2FzZSBEM0RSVFlQRV9WT0xVTUVURVhUVVJFOgorCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQorCQkJeworCQkJY2FzZSBEM0RGTVRfQTg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSNUc2QjUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDFSNUc1QjUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTFSNUc1QjUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTRSNEc0QjQpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSM0czQjIpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThSM0czQjIpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDRSNEc0QjQpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSOEc4QjgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDhSOEc4QjgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThSOEc4QjgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDhCOEc4UjgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQThCOEc4Ujg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThCOEc4UjgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cworCQkJY2FzZSBEM0RGTVRfUDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpQOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQThQODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThQOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cworCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpHMTZSMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMlIxMEcxMEIxMCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTJCMTBHMTBSMTApCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMTZCMTZHMTZSMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKKwkJCWNhc2UgRDNERk1UX0RYVDE6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDEpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0RYVDI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0RYVDM6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDMpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0RYVDU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0FUSTE6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkFUSTEpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0FUSTI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkFUSTIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKKwkJCWNhc2UgRDNERk1UX1IxNkY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIxNkYpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RzE2UjE2RikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTE2QjE2RzE2UjE2RikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1IzMkY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzMkYpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0czMlIzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RzMyUjMyRikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTMyQjMyRzMyUjMyRikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKKwkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0w2VjVVNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6TDZWNVU1KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Olg4TDhWOFU4KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlE4VzhWOFU4KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6VjE2VTE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTJXMTBWMTBVMTApCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpRMTZXMTZWMTZVMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cworCQkJY2FzZSBEM0RGTVRfTDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTRMNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfTDE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMMTYpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0E4TDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4TDgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJfQorCQljYXNlIEQzRFJUWVBFX1RFWFRVUkU6CisJCQlpZih1c2FnZSAmIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCkKKwkJCXsKKwkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQkJeworCQkJCWNhc2UgRDNERk1UX05VTEw6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpOVUxMXykJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QThSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QThSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDhSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QThCOEc4UjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDhCOEc4UjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCisJCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6RzE2UjE2KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTJCMTBHMTBSMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkEyUjEwRzEwQjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTY6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2KQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCisJCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIxNkYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRzE2UjE2RjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6RzE2UjE2RikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2RikJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzMkYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6RzMyUjMyRikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EzMkIzMkczMlIzMkY6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTMyQjMyRzMyUjMyRikJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpCisJCQl7CisJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEQzREZNVF9EMzI6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMzIpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EMjRYODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EMjRGUzg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRGUzgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EMzJGX0xPQ0tBQkxFOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMkZfTE9DS0FCTEUpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0RGMjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpERjI0KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0RGMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpERjE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0lOVFo6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpJTlRaKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEQzREZNVF9OVUxMOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6Ok5VTExfKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlgxUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThSM0czQjIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4QjhHOFI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1A4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMlIxMEcxMEIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTE2QjE2RzE2UjE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9EWFQxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0RYVDM6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUMykJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EWFQ0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQ1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0FUSTE6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QVRJMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BVEkyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkFUSTIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RzE2UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMTZCMTZHMTZSMTZGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkczMlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTMyQjMyRzMyUjMyRikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gQnVtcCBtYXAgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlE4VzhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlExNlcxNlYxNlUxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9MODoJCQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTRMNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9MMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TDE2KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOEw4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4TDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gRGVwdGggZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX0QzMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMzIpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QyNFM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNFM4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNFg4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMTYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QyNEZTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMjRGUzgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRDMyRl9MT0NLQUJMRToJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDMyRl9MT0NLQUJMRSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfREYyNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpERjI0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0RGMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6REYxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9JTlRaOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OklOVFopCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJY2FzZSBEM0RSVFlQRV9WRVJURVhCVUZGRVI6CisJCQlpZihjaGVja0Zvcm1hdCA9PSBEM0RGTVRfVkVSVEVYREFUQSkKKwkJCXsKKwkJCQlyZXR1cm4gRDNEX09LOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCX0KKwkJY2FzZSBEM0RSVFlQRV9JTkRFWEJVRkZFUjoKKwkJCXN3aXRjaChjaGVja0Zvcm1hdCkKKwkJCXsKKwkJCWNhc2UgRDNERk1UX0lOREVYMTY6CisJCQljYXNlIEQzREZNVF9JTkRFWDMyOgorCQkJCXJldHVybiBEM0RfT0s7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCX07CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCX0KKwl9CisKKwlsb25nIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBzb3VyY2VGb3JtYXQsIEQzREZPUk1BVCB0YXJnZXRGb3JtYXQpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBzb3VyY2VGb3JtYXQgPSAlZCwgRDNERk9STUFUIHRhcmdldEZvcm1hdCA9ICVkIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgc291cmNlRm9ybWF0LCB0YXJnZXRGb3JtYXQpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q5KCk7CisKKwkJCWlmKGQzZDkpCisJCQl7CisJCQkJcmV0dXJuIGQzZDktPkNoZWNrRGV2aWNlRm9ybWF0Q29udmVyc2lvbihhZGFwdGVyLCBkZXZpY2VUeXBlLCBzb3VyY2VGb3JtYXQsIHRhcmdldEZvcm1hdCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIENoZWNrRGV2aWNlRm9ybWF0Q29udmVyc2lvbihhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgc291cmNlRm9ybWF0LCB0YXJnZXRGb3JtYXQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQsIGludCB3aW5kb3dlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUsIHVuc2lnbmVkIGxvbmcgKnF1YWxpdHlMZXZlbHMpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBzdXJmYWNlRm9ybWF0ID0gJWQsIGludCB3aW5kb3dlZCA9ICVkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlVHlwZSA9ICVkLCB1bnNpZ25lZCBsb25nICpxdWFsaXR5TGV2ZWxzID0gMHglMC44cCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIHN1cmZhY2VGb3JtYXQsIHdpbmRvd2VkLCBtdWx0aVNhbXBsZVR5cGUsIHF1YWxpdHlMZXZlbHMpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q5KCk7CisKKwkJCWlmKGQzZDkpCisJCQl7CisJCQkJcmV0dXJuIGQzZDktPkNoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKGFkYXB0ZXIsIGRldmljZVR5cGUsIHN1cmZhY2VGb3JtYXQsIHdpbmRvd2VkLCBtdWx0aVNhbXBsZVR5cGUsIHF1YWxpdHlMZXZlbHMpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBDaGVja0RldmljZU11bHRpU2FtcGxlVHlwZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgc3VyZmFjZUZvcm1hdCwgd2luZG93ZWQsIG11bHRpU2FtcGxlVHlwZSwgcXVhbGl0eUxldmVscyk7CisJCQl9CisJCX0KKworCQlpZihhZGFwdGVyID49IEdldEFkYXB0ZXJDb3VudCgpKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKHF1YWxpdHlMZXZlbHMpCisJCXsKKwkJCWlmKG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV9OT05NQVNLQUJMRSkKKwkJCXsKKwkJCQkqcXVhbGl0eUxldmVscyA9IDQ7ICAgLy8gMiwgNCwgOCwgMTYgc2FtcGxlcworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpxdWFsaXR5TGV2ZWxzID0gMTsKKwkJCX0KKwkJfQorCisJCWlmKG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV9OT05FIHx8CisJCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV9OT05NQVNLQUJMRSB8fAorCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfMl9TQU1QTEVTIHx8CisJCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV80X1NBTVBMRVMgfHwKKwkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFXzhfU0FNUExFUyB8fAorCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfMTZfU0FNUExFUykKKwkJeworCQkJaWYoQ2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCBEM0RVU0FHRV9SRU5ERVJUQVJHRVQsIEQzRFJUWVBFX1NVUkZBQ0UsIHN1cmZhY2VGb3JtYXQpID09IEQzRF9PSyB8fAorCQkJICAgQ2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCBEM0RVU0FHRV9ERVBUSFNURU5DSUwsIEQzRFJUWVBFX1NVUkZBQ0UsIHN1cmZhY2VGb3JtYXQpID09IEQzRF9PSykKKwkJCXsKKwkJCQlpZihzdXJmYWNlRm9ybWF0ICE9IEQzREZNVF9EMzJGX0xPQ0tBQkxFICYmIHN1cmZhY2VGb3JtYXQgIT0gRDNERk1UX0QxNl9MT0NLQUJMRSkKKwkJCQl7CisJCQkJCXJldHVybiBEM0RfT0s7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCX0KKworCWxvbmcgRGlyZWN0M0Q5OjpDaGVja0RldmljZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgY2hlY2tUeXBlLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCwgRDNERk9STUFUIGJhY2tCdWZmZXJGb3JtYXQsIGludCB3aW5kb3dlZCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGNoZWNrVHlwZSA9ICVkLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCA9ICVkLCBEM0RGT1JNQVQgYmFja0J1ZmZlckZvcm1hdCA9ICVkLCBpbnQgd2luZG93ZWQgPSAlZCIsIGFkYXB0ZXIsIGNoZWNrVHlwZSwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOworCisJCWlmKGNoZWNrVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKKwkJeworCQkJbG9hZFN5c3RlbUQzRDkoKTsKKworCQkJaWYoZDNkOSkKKwkJCXsKKwkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXZpY2VUeXBlKGFkYXB0ZXIsIGNoZWNrVHlwZSwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBDaGVja0RldmljZVR5cGUoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGRpc3BsYXlGb3JtYXQsIGJhY2tCdWZmZXJGb3JtYXQsIHdpbmRvd2VkKTsKKwkJCX0KKwkJfQorCisJCWlmKGFkYXB0ZXIgPj0gR2V0QWRhcHRlckNvdW50KCkpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJc3dpdGNoKGRpc3BsYXlGb3JtYXQpCisJCXsKKwkJY2FzZSBEM0RGTVRfVU5LTk9XTjoKKwkJCWlmKHdpbmRvd2VkID09IEZBTFNFKQorCQkJeworCQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCX0KKwkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CisJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgorCQkJaWYoZGlzYWJsZTEwQml0TW9kZSkKKwkJCXsKKwkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQl9CisJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgorCQljYXNlIEQzREZNVF9SNUc2QjU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJfQorCisJCWlmKHdpbmRvd2VkICE9IEZBTFNFKQorCQl7CisJCQlzd2l0Y2goYmFja0J1ZmZlckZvcm1hdCkKKwkJCXsKKwkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOgorCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CisJCQkJaWYoZGlzYWJsZTEwQml0TW9kZSkKKwkJCQl7CisJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCQl9CisJCQljYXNlIEQzREZNVF9BOFI4RzhCODoKKwkJCQlpZihkaXNhYmxlQWxwaGFNb2RlKQorCQkJCXsKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCWNhc2UgRDNERk1UX1VOS05PV046CisJCQljYXNlIEQzREZNVF9YOFI4RzhCODoKKwkJCWNhc2UgRDNERk1UX1I1RzZCNToKKwkJLy8JY2FzZSBEM0RGTVRfWDFSNUc1QjU6ICAgICAgLy8gRklYTUU6IFN1cHBvcnRlZCBieSBSRUYKKwkJLy8JY2FzZSBEM0RGTVRfQTFSNUc1QjU6ICAgICAgLy8gRklYTUU6IFN1cHBvcnRlZCBieSBSRUYKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJc3dpdGNoKGJhY2tCdWZmZXJGb3JtYXQpCisJCQl7CisJCQljYXNlIEQzREZNVF9VTktOT1dOOgorCQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CisJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoKKwkJCQlpZihkaXNhYmxlMTBCaXRNb2RlKQorCQkJCXsKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgorCQkJCWlmKGRpc2FibGVBbHBoYU1vZGUpCisJCQkJeworCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQkJfQorCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRDk6OkNyZWF0ZURldmljZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBIV05EIGZvY3VzV2luZG93LCB1bnNpZ25lZCBsb25nIGJlaGF2aW9yRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRERldmljZTkgKipyZXR1cm5lZERldmljZUludGVyZmFjZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgSFdORCBmb2N1c1dpbmRvdyA9ICVkLCB1bnNpZ25lZCBsb25nIGJlaGF2aW9yRmxhZ3MgPSAweCUwLjhYLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzID0gMHglMC44cCwgSURpcmVjdDNERGV2aWNlOSAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gMHglMC44cCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q5KCk7CisKKwkJCWlmKGQzZDkpCisJCQl7CisJCQkJcmV0dXJuIGQzZDktPkNyZWF0ZURldmljZShhZGFwdGVyLCBkZXZpY2VUeXBlLCBmb2N1c1dpbmRvdywgYmVoYXZpb3JGbGFncywgcHJlc2VudFBhcmFtZXRlcnMsIHJldHVybmVkRGV2aWNlSW50ZXJmYWNlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gQ3JlYXRlRGV2aWNlKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBmb2N1c1dpbmRvdywgYmVoYXZpb3JGbGFncywgcHJlc2VudFBhcmFtZXRlcnMsIHJldHVybmVkRGV2aWNlSW50ZXJmYWNlKTsKKwkJCX0KKwkJfQorCisJCWlmKCFmb2N1c1dpbmRvdyB8fCAhcHJlc2VudFBhcmFtZXRlcnMgfHwgIXJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQorCQl7CisJCQkqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UgPSAwOworCisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpyZXR1cm5lZERldmljZUludGVyZmFjZSA9IG5ldyBEaXJlY3QzRERldmljZTkoaW5zdGFuY2UsIHRoaXMsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycyk7CisKKwkJaWYoKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQorCQl7CisJCQkoKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKS0+QWRkUmVmKCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0Q5OjpFbnVtQWRhcHRlck1vZGVzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RGT1JNQVQgZm9ybWF0LCB1bnNpZ25lZCBpbnQgaW5kZXgsIEQzRERJU1BMQVlNT0RFICptb2RlKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgdW5zaWduZWQgaW50IGluZGV4ID0gJWQsIEQzRERJU1BMQVlNT0RFICptb2RlID0gMHglMC44cCIsIGFkYXB0ZXIsIGZvcm1hdCwgaW5kZXgsIG1vZGUpOworCisJCWlmKGFkYXB0ZXIgIT0gRDNEQURBUFRFUl9ERUZBVUxUIHx8ICFtb2RlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXVuc2lnbmVkIGludCBicHAgPSAzMjsKKworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJYnBwID0gMTY7IGJyZWFrOworCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJYnBwID0gMzI7IGJyZWFrOworCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWJwcCA9IDMyOyBicmVhazsKKwkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWJwcCA9IDE2OyBicmVhazsKKwkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlicHAgPSAxNjsgYnJlYWs7CisJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJYnBwID0gMzI7IGJyZWFrOworCQlkZWZhdWx0OiByZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCBudW1EaXNwbGF5TW9kZXM7IGkrKykKKwkJeworCQkJaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IGJwcCkKKwkJCXsKKwkJCQlpZihpbmRleC0tID09IDApCisJCQkJeworCQkJCQltb2RlLT5XaWR0aCA9IGRpc3BsYXlNb2RlW2ldLmRtUGVsc1dpZHRoOworCQkJCQltb2RlLT5IZWlnaHQgPSBkaXNwbGF5TW9kZVtpXS5kbVBlbHNIZWlnaHQ7CisJCQkJCW1vZGUtPlJlZnJlc2hSYXRlID0gZGlzcGxheU1vZGVbaV0uZG1EaXNwbGF5RnJlcXVlbmN5OworCQkJCQltb2RlLT5Gb3JtYXQgPSBmb3JtYXQ7CisKKwkJCQkJcmV0dXJuIEQzRF9PSzsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwl9CisKKwl1bnNpZ25lZCBpbnQgRGlyZWN0M0Q5OjpHZXRBZGFwdGVyQ291bnQoKQorCXsKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlyZXR1cm4gMTsgICAvLyBTd2lmdFNoYWRlciBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGRpc3BsYXkgYWRhcHRlcnMKKwl9CisKKwlsb25nIERpcmVjdDNEOTo6R2V0QWRhcHRlckRpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERSAqbW9kZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RESVNQTEFZTU9ERSAqbW9kZSA9IDB4JTAuOHAiLCBhZGFwdGVyLCBtb2RlKTsKKworCQlpZihhZGFwdGVyICE9IEQzREFEQVBURVJfREVGQVVMVCB8fCAhbW9kZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlIREMgZGV2aWNlQ29udGV4dCA9IEdldERDKDApOworCQkJCisJCW1vZGUtPldpZHRoID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIEhPUlpSRVMpOworCQltb2RlLT5IZWlnaHQgPSA6OkdldERldmljZUNhcHMoZGV2aWNlQ29udGV4dCwgVkVSVFJFUyk7CisJCW1vZGUtPlJlZnJlc2hSYXRlID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIFZSRUZSRVNIKTsKKwkJdW5zaWduZWQgaW50IGJwcCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBCSVRTUElYRUwpOworCisJCVJlbGVhc2VEQygwLCBkZXZpY2VDb250ZXh0KTsKKworCQlicHAgPSAzMjsgICAvLyBGSVhNRQorCisJCXN3aXRjaChicHApCisJCXsKKwkJY2FzZSAzMjogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1g4UjhHOEI4OyBicmVhazsKKwkJY2FzZSAyNDogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1I4RzhCODsgICBicmVhazsKKwkJY2FzZSAxNjogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1I1RzZCNTsgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7ICAgLy8gVW5leHBlY3RlZCBkaXNwbGF5IG1vZGUgY29sb3IgZGVwdGgKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRDk6OkdldEFkYXB0ZXJJZGVudGlmaWVyKHVuc2lnbmVkIGludCBhZGFwdGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBEM0RBREFQVEVSX0lERU5USUZJRVI5ICppZGVudGlmaWVyKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAweCUwLjhYLCBEM0RBREFQVEVSX0lERU5USUZJRVI5ICppZGVudGlmaWVyID0gMHglMC44cCIsIGFkYXB0ZXIsIGZsYWdzLCBpZGVudGlmaWVyKTsKKworCQlpZighaWRlbnRpZmllcikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlzdzo6Q29uZmlndXJhdG9yIGluaSgiU3dpZnRTaGFkZXIuaW5pIik7CisJCWludCBpZCA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiSWRlbnRpZmllciIsIDApOworCisJCWlmKGlkID09IDEpCisJCXsKKwkJCXVuc2lnbmVkIHNob3J0IHByb2R1Y3QgPSA2OworCQkJdW5zaWduZWQgc2hvcnQgdmVyc2lvbiA9IDE0OworCQkJdW5zaWduZWQgc2hvcnQgc3ViVmVyc2lvbiA9IDEwOworCQkJdW5zaWduZWQgc2hvcnQgcmV2aXNpb24gPSA4NDQwOworCQkJR1VJRCBndWlkID0gezB4RDdCNzFFM0UsIDB4NDFEMiwgMHgxMUNGLCB7MHg5NiwgMHg1MywgMHg3QSwgMHgyMywgMHgwMCwgMHhDMiwgMHhDQiwgMHgzNX19OworCisJCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkhpZ2hQYXJ0ID0gcHJvZHVjdCA8PCAxNiB8IHZlcnNpb247CisJCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkxvd1BhcnQgPSBzdWJWZXJzaW9uIDw8IDE2IHwgcmV2aXNpb247CisJCQlzdHJjcHkoaWRlbnRpZmllci0+RHJpdmVyLCAibnY0X2Rpc3AuZGxsIik7CisJCQlzdHJjcHkoaWRlbnRpZmllci0+RGVzY3JpcHRpb24sICJOVklESUEgR2VGb3JjZSA3OTAwIEdTIik7CisJCQlzdHJjcHkoaWRlbnRpZmllci0+RGV2aWNlTmFtZSwgIlxcXFwuXFxESVNQTEFZMSIpOworCQkJaWRlbnRpZmllci0+VmVuZG9ySWQgPSAweDEwREU7CisJCQlpZGVudGlmaWVyLT5EZXZpY2VJZCA9IDB4MDI5MjsKKwkJCWlkZW50aWZpZXItPlN1YlN5c0lkID0gMHgwMzcwMTBERTsKKwkJCWlkZW50aWZpZXItPlJldmlzaW9uID0gMHgwMEExOworCQkJaWRlbnRpZmllci0+RGV2aWNlSWRlbnRpZmllciA9IGd1aWQ7CisJCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAxOworCisJCQlyZXR1cm4gRDNEX09LOworCQl9CisJCWVsc2UgaWYoaWQgPT0gMikKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgcHJvZHVjdCA9IDc7CisJCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gMTQ7CisJCQl1bnNpZ25lZCBzaG9ydCBzdWJWZXJzaW9uID0gMTA7CisJCQl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbiA9IDQ2NDsKKwkJCUdVSUQgZ3VpZCA9IHsweEQ3QjcxRUUyLCAweDMyODUsIDB4MTFDRiwgezB4MTEsIDB4NzIsIDB4MEQsIDB4QTIsIDB4QTEsIDB4QzIsIDB4Q0EsIDB4MzV9fTsKKworCQkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5IaWdoUGFydCA9IHByb2R1Y3QgPDwgMTYgfCB2ZXJzaW9uOworCQkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5Mb3dQYXJ0ID0gc3ViVmVyc2lvbiA8PCAxNiB8IHJldmlzaW9uOworCQkJc3RyY3B5KGlkZW50aWZpZXItPkRyaXZlciwgImF0aXVtZGFnLmRsbCIpOworCQkJc3RyY3B5KGlkZW50aWZpZXItPkRlc2NyaXB0aW9uLCAiQVRJIE1vYmlsaXR5IFJhZGVvbiBYMTYwMCIpOworCQkJc3RyY3B5KGlkZW50aWZpZXItPkRldmljZU5hbWUsICJcXFxcLlxcRElTUExBWTEiKTsKKwkJCWlkZW50aWZpZXItPlZlbmRvcklkID0gMHgxMDAyOworCQkJaWRlbnRpZmllci0+RGV2aWNlSWQgPSAweDcxQzU7CisJCQlpZGVudGlmaWVyLT5TdWJTeXNJZCA9IDB4ODIwNzEwNzE7CisJCQlpZGVudGlmaWVyLT5SZXZpc2lvbiA9IDB4MDAwMDsKKwkJCWlkZW50aWZpZXItPkRldmljZUlkZW50aWZpZXIgPSBndWlkOworCQkJaWRlbnRpZmllci0+V0hRTExldmVsID0gMTsKKworCQkJcmV0dXJuIEQzRF9PSzsKKwkJfQorCQllbHNlIGlmKGlkID09IDMpCisJCXsKKwkJCXVuc2lnbmVkIHNob3J0IHByb2R1Y3QgPSA3OworCQkJdW5zaWduZWQgc2hvcnQgdmVyc2lvbiA9IDE0OworCQkJdW5zaWduZWQgc2hvcnQgc3ViVmVyc2lvbiA9IDEwOworCQkJdW5zaWduZWQgc2hvcnQgcmV2aXNpb24gPSAxNDM3OworCQkJR1VJRCBndWlkID0gezB4RDdCNzhFNjYsIDB4Njk0MiwgMHgxMUNGLCB7MHgwNSwgMHg3NiwgMHgwMywgMHgyMiwgMHhBRCwgMHhDMiwgMHhDQSwgMHgzNX19OworCisJCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkhpZ2hQYXJ0ID0gcHJvZHVjdCA8PCAxNiB8IHZlcnNpb247CisJCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkxvd1BhcnQgPSBzdWJWZXJzaW9uIDw8IDE2IHwgcmV2aXNpb247CisJCQlzdHJjcHkoaWRlbnRpZmllci0+RHJpdmVyLCAiaWdkdW1kNjQuZGxsIik7CisJCQlzdHJjcHkoaWRlbnRpZmllci0+RGVzY3JpcHRpb24sICJJbnRlbCBHTUEgWDMxMDAiKTsKKwkJCXN0cmNweShpZGVudGlmaWVyLT5EZXZpY2VOYW1lLCAiXFxcXC5cXERJU1BMQVkxIik7CisJCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDB4ODA4NjsKKwkJCWlkZW50aWZpZXItPkRldmljZUlkID0gMHgyQTAyOworCQkJaWRlbnRpZmllci0+U3ViU3lzSWQgPSAweDAyMDkxMDI4OworCQkJaWRlbnRpZmllci0+UmV2aXNpb24gPSAweDAwMEM7CisJCQlpZGVudGlmaWVyLT5EZXZpY2VJZGVudGlmaWVyID0gZ3VpZDsKKwkJCWlkZW50aWZpZXItPldIUUxMZXZlbCA9IDE7CisKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKwkJZWxzZSBpZihpZCA9PSA0KQorCQl7CisJCQlsb2FkU3lzdGVtRDNEOSgpOworCisJCQlpZihkM2Q5KQorCQkJeworCQkJCXJldHVybiBkM2Q5LT5HZXRBZGFwdGVySWRlbnRpZmllcihhZGFwdGVyLCBmbGFncywgaWRlbnRpZmllcik7CisJCQl9CisJCX0KKworCQl1bnNpZ25lZCBzaG9ydCBwcm9kdWN0ID0gJ3N3JzsKKwkJdW5zaWduZWQgc2hvcnQgdmVyc2lvbiA9IDM7CisJCXVuc2lnbmVkIHNob3J0IHN1YlZlcnNpb24gPSAwOworCQl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbiA9IEJVSUxEX1JFVklTSU9OOworCQlHVUlEIGd1aWQgPSB7MHgwMDAwMDAwMCwgMHgwMDAwLCAweDAwMDAsIHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfX07CisKKwkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5IaWdoUGFydCA9IHByb2R1Y3QgPDwgMTYgfCB2ZXJzaW9uOworCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkxvd1BhcnQgPSBzdWJWZXJzaW9uIDw8IDE2IHwgcmV2aXNpb247CisJCXN0cmNweShpZGVudGlmaWVyLT5Ecml2ZXIsICJTd2lmdFNoYWRlciIpOworCQlzdHJjcHkoaWRlbnRpZmllci0+RGVzY3JpcHRpb24sICJUcmFuc0dhbWluZyBTd2lmdFNoYWRlciBTb2Z0d2FyZSAzRCBSZW5kZXJlciIpOworCQlzdHJjcHkoaWRlbnRpZmllci0+RGV2aWNlTmFtZSwgIlxcXFwuXFxESVNQTEFZMSIpOworCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDA7CisJCWlkZW50aWZpZXItPkRldmljZUlkID0gMDsKKwkJaWRlbnRpZmllci0+U3ViU3lzSWQgPSAwOworCQlpZGVudGlmaWVyLT5SZXZpc2lvbiA9IDA7CisJCWlkZW50aWZpZXItPkRldmljZUlkZW50aWZpZXIgPSBndWlkOworCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAwOworCisJCWNoYXIgZXhlTmFtZVtNQVhfUEFUSCArIDFdOworCQlpbnQgbiA9IEdldE1vZHVsZUJhc2VOYW1lKEdldEN1cnJlbnRQcm9jZXNzKCksIDAsIGV4ZU5hbWUsIE1BWF9QQVRIKTsKKwkJZXhlTmFtZVtuXSA9ICdcMCc7CisKKwkJaWYoc3RybmNtcChleGVOYW1lLCAiRmFsbG91dCIsIDcpID09IDApCisJCXsKKwkJCXN0cmNweShpZGVudGlmaWVyLT5Ecml2ZXIsICJudjRfZGlzcC5kbGwiKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJdW5zaWduZWQgaW50IERpcmVjdDNEOTo6R2V0QWRhcHRlck1vZGVDb3VudCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERk9STUFUIGZvcm1hdCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQiLCBhZGFwdGVyLCBmb3JtYXQpOworCisJCWlmKGFkYXB0ZXIgIT0gRDNEQURBUFRFUl9ERUZBVUxUKQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWludCBtb2RlQ291bnQgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCBudW1EaXNwbGF5TW9kZXM7IGkrKykKKwkJeworCQkJc3dpdGNoKGZvcm1hdCkKKwkJCXsKKwkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgorCQkJCWlmKCFkaXNhYmxlQWxwaGFNb2RlKQorCQkJCXsKKwkJCQkJaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDMyKSBtb2RlQ291bnQrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzREZNVF9YOFI4RzhCODogICAgaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDMyKSBtb2RlQ291bnQrKzsgYnJlYWs7CisJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoKKwkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgorCQkJCWlmKCFkaXNhYmxlMTBCaXRNb2RlKQorCQkJCXsKKwkJCQkJaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDMyKSBtb2RlQ291bnQrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCS8vCWNhc2UgRDNERk1UX1I4RzhCODogICAgICBpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMjQpIG1vZGVDb3VudCsrOyBicmVhazsgICAvLyBOT1RFOiBEZXByZWNhdGVkIGJ5IERpcmVjdFggOQorCQkJY2FzZSBEM0RGTVRfUjVHNkI1OiAgICAgIGlmKGRpc3BsYXlNb2RlW2ldLmRtQml0c1BlclBlbCA9PSAxNikgbW9kZUNvdW50Kys7IGJyZWFrOworCQkvLwljYXNlIEQzREZNVF9YMVI1RzVCNTogICAgaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDE2KSBtb2RlQ291bnQrKzsgYnJlYWs7CisJCS8vCWNhc2UgRDNERk1UX0ExUjVHNUI1OiAgICBpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMTYpIG1vZGVDb3VudCsrOyBicmVhazsKKwkJLy8JZGVmYXVsdDoKKwkJLy8JCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbW9kZUNvdW50OworCX0KKworCUhNT05JVE9SIERpcmVjdDNEOTo6R2V0QWRhcHRlck1vbml0b3IodW5zaWduZWQgaW50IGFkYXB0ZXIpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCIsIGFkYXB0ZXIpOworCisJCVBPSU5UIHBvaW50ID0gezAsIDB9OworCisJCXJldHVybiBNb25pdG9yRnJvbVBvaW50KHBvaW50LCBNT05JVE9SX0RFRkFVTFRUT1BSSU1BUlkpOyAgIC8vIEZJWE1FOiBJZ25vcmVzIGFkYXB0ZXIgcGFyYW1ldGVyCisJfQorCisJbG9uZyBEaXJlY3QzRDk6OkdldERldmljZUNhcHModW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNEQ0FQUzkgKmNhcGFiaWxpdGllcykKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNEQ0FQUzkgKmNhcGFiaWxpdGllcyA9IDB4JTAuOHAiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBjYXBhYmlsaXRpZXMpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q5KCk7CisKKwkJCWlmKGQzZDkpCisJCQl7CisJCQkJcmV0dXJuIGQzZDktPkdldERldmljZUNhcHMoYWRhcHRlciwgZGV2aWNlVHlwZSwgY2FwYWJpbGl0aWVzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gR2V0RGV2aWNlQ2FwcyhhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgY2FwYWJpbGl0aWVzKTsKKwkJCX0KKwkJfQorCisJCWlmKCFjYXBhYmlsaXRpZXMpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdW5zaWduZWQgaW50IHBpeGVsU2hhZGVyVmVyc2lvbiA9IHBpeGVsU2hhZGVyVmVyc2lvblg7CisJCXVuc2lnbmVkIGludCB2ZXJ0ZXhTaGFkZXJWZXJzaW9uID0gdmVydGV4U2hhZGVyVmVyc2lvblg7CisKKwkJaWYocGl4ZWxTaGFkZXJWZXJzaW9uID09IEQzRFBTX1ZFUlNJT04oMiwgMSkpIHBpeGVsU2hhZGVyVmVyc2lvbiA9IEQzRFBTX1ZFUlNJT04oMiwgMCk7CisJCWlmKHZlcnRleFNoYWRlclZlcnNpb24gPT0gRDNEVlNfVkVSU0lPTigyLCAxKSkgdmVydGV4U2hhZGVyVmVyc2lvbiA9IEQzRFZTX1ZFUlNJT04oMiwgMCk7CisKKwkJdW5zaWduZWQgaW50IG1heGltdW1WZXJ0ZXhTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IDA7CisJCXVuc2lnbmVkIGludCBtYXhpbXVtUGl4ZWxTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IDA7CisJCXVuc2lnbmVkIGludCBtYXhpbXVtVmVydGV4U2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gMDsKKwkJdW5zaWduZWQgaW50IG1heGltdW1QaXhlbFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IDA7CisKKwkJaWYodmVydGV4U2hhZGVyVmVyc2lvbiA+PSBEM0RWU19WRVJTSU9OKDEsIDApKSBtYXhpbXVtVmVydGV4U2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgPSAweEZGRkZGRkZGOworCQlpZihwaXhlbFNoYWRlclZlcnNpb24gPj0gRDNEUFNfVkVSU0lPTigxLCAwKSkgbWF4aW11bVBpeGVsU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgPSAweEZGRkZGRkZGOworCQlpZih2ZXJ0ZXhTaGFkZXJWZXJzaW9uID49IEQzRFZTX1ZFUlNJT04oMywgMCkpIG1heGltdW1WZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSAzMjc2ODsKKwkJaWYocGl4ZWxTaGFkZXJWZXJzaW9uID49IEQzRFBTX1ZFUlNJT04oMywgMCkpIG1heGltdW1QaXhlbFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IDMyNzY4OworCisJCUQzRENBUFM5IGNhcHM7CisJCVplcm9NZW1vcnkoJmNhcHMsIHNpemVvZihEM0RDQVBTOSkpOworCisJCS8vIERldmljZSBpbmZvCisJCWNhcHMuRGV2aWNlVHlwZSA9IEQzRERFVlRZUEVfSEFMOworCQljYXBzLkFkYXB0ZXJPcmRpbmFsID0gRDNEQURBUFRFUl9ERUZBVUxUOworCisJCS8vIENhcHMgZnJvbSBEWDcKKwkJY2Fwcy5DYXBzID0JRDNEQ0FQU19SRUFEX1NDQU5MSU5FOworCisJCWNhcHMuQ2FwczIgPQkJRDNEQ0FQUzJfQ0FOQVVUT0dFTk1JUE1BUCB8CQkvLyBUaGUgZHJpdmVyIGlzIGNhcGFibGUgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0aW5nIG1pcG1hcHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQXV0b21hdGljIEdlbmVyYXRpb24gb2YgTWlwbWFwcy4gCisJCQkJCQkvLwlEM0RDQVBTMl9DQU5DQUxJQlJBVEVHQU1NQSB8CS8vIFRoZSBzeXN0ZW0gaGFzIGEgY2FsaWJyYXRvciBpbnN0YWxsZWQgdGhhdCBjYW4gYXV0b21hdGljYWxseSBhZGp1c3QgdGhlIGdhbW1hIHJhbXAgc28gdGhhdCB0aGUgcmVzdWx0IGlzIGlkZW50aWNhbCBvbiBhbGwgc3lzdGVtcyB0aGF0IGhhdmUgYSBjYWxpYnJhdG9yLiBUbyBpbnZva2UgdGhlIGNhbGlicmF0b3Igd2hlbiBzZXR0aW5nIG5ldyBnYW1tYSBsZXZlbHMsIHVzZSB0aGUgRDNEU0dSX0NBTElCUkFURSBmbGFnIHdoZW4gY2FsbGluZyBJRGlyZWN0M0REZXZpY2U5OjpTZXRHYW1tYVJhbXAuIENhbGlicmF0aW5nIGdhbW1hIHJhbXBzIGluY3VycyBzb21lIHByb2Nlc3Npbmcgb3ZlcmhlYWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmcmVxdWVudGx5LiAgCisJCQkJCQkvLwlEM0RDQVBTMl9DQU5NQU5BR0VSRVNPVVJDRSB8CS8vIFRoZSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBtYW5hZ2luZyByZXNvdXJjZXMuIE9uIHN1Y2ggZHJpdmVycywgRDNEUE9PTF9NQU5BR0VEIHJlc291cmNlcyB3aWxsIGJlIG1hbmFnZWQgYnkgdGhlIGRyaXZlci4gVG8gaGF2ZSBNaWNyb3NvZnSuIERpcmVjdDNEriBvdmVycmlkZSB0aGUgZHJpdmVyIHNvIHRoYXQgRGlyZWN0M0QgbWFuYWdlcyByZXNvdXJjZXMsIHVzZSB0aGUgRDNEQ1JFQVRFX0RJU0FCTEVfRFJJVkVSX01BTkFHRU1FTlQgZmxhZyB3aGVuIGNhbGxpbmcgSURpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlLiAKKwkJCQkJCQlEM0RDQVBTMl9EWU5BTUlDVEVYVFVSRVMgfCAJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgZHluYW1pYyB0ZXh0dXJlcy4gCisJCQkJCQkJRDNEQ0FQUzJfRlVMTFNDUkVFTkdBTU1BOwkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBkeW5hbWljIGdhbW1hIHJhbXAgYWRqdXN0bWVudCBpbiBmdWxsLXNjcmVlbiBtb2RlLgorCQkJCQkJLy8JRDNEQ0FQUzJfQ0FOU0hBUkVSRVNPVVJDRTsKKworCQljYXBzLkNhcHMzID0JCUQzRENBUFMzX0FMUEhBX0ZVTExTQ1JFRU5fRkxJUF9PUl9ESVNDQVJEIHwJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSBjYW4gcmVzcGVjdCB0aGUgRDNEUlNfQUxQSEFCTEVOREVOQUJMRSByZW5kZXIgc3RhdGUgaW4gZnVsbC1zY3JlZW4gbW9kZSB3aGlsZSB1c2luZyB0aGUgRkxJUCBvciBESVNDQVJEIHN3YXAgZWZmZWN0LgorCQkJCQkJCUQzRENBUFMzX0NPUFlfVE9fVklETUVNIHwJCQkJCS8vIERldmljZSBjYW4gYWNjZWxlcmF0ZSBhIG1lbW9yeSBjb3B5IGZyb20gc3lzdGVtIG1lbW9yeSB0byBsb2NhbCB2aWRlbyBtZW1vcnkuCisJCQkJCQkJRDNEQ0FQUzNfQ09QWV9UT19TWVNURU1NRU07CQkJCQkvLyBEZXZpY2UgY2FuIGFjY2VsZXJhdGUgYSBtZW1vcnkgY29weSBmcm9tIGxvY2FsIHZpZGVvIG1lbW9yeSB0byBzeXN0ZW0gbWVtb3J5LgorCQkJCQkJLy8JRDNEQ0FQUzNfTElORUFSX1RPX1NSR0JfUFJFU0VOVEFUSU9OOwkJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSBjYW4gcGVyZm9ybSBnYW1tYSBjb3JyZWN0aW9uIGZyb20gYSB3aW5kb3dlZCBiYWNrIGJ1ZmZlciAoY29udGFpbmluZyBsaW5lYXIgY29udGVudCkgdG8gYW4gc1JHQiBkZXNrdG9wLgorCisJCWNhcHMuUHJlc2VudGF0aW9uSW50ZXJ2YWxzID0JCUQzRFBSRVNFTlRfSU5URVJWQUxfSU1NRURJQVRFIHwKKwkJCQkJCQkJCQkJRDNEUFJFU0VOVF9JTlRFUlZBTF9PTkU7CisJCQkJCQkJCQkgCS8vCUQzRFBSRVNFTlRfSU5URVJWQUxfVFdPOworCQkJCQkJCQkJIAkvLwlEM0RQUkVTRU5UX0lOVEVSVkFMX1RIUkVFOworCQkJCQkJCQkJIAkvLwlEM0RQUkVTRU5UX0lOVEVSVkFMX0ZPVVI7CisKKwkJLy8gQ3Vyc29yIGNhcHMKKwkJY2Fwcy5DdXJzb3JDYXBzID0JRDNEQ1VSU09SQ0FQU19DT0xPUgl8CS8vIEEgZnVsbC1jb2xvciBjdXJzb3IgaXMgc3VwcG9ydGVkIGluIGhhcmR3YXJlLiBTcGVjaWZpY2FsbHksIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgZHJpdmVyIHN1cHBvcnRzIGF0IGxlYXN0IGEgaGFyZHdhcmUgY29sb3IgY3Vyc29yIGluIGhpZ2gtcmVzb2x1dGlvbiBtb2RlcyAod2l0aCBzY2FuIGxpbmVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA0MDApLiAKKwkJCQkJCQlEM0RDVVJTT1JDQVBTX0xPV1JFUzsJLy8gQSBmdWxsLWNvbG9yIGN1cnNvciBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuIFNwZWNpZmljYWxseSwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBkcml2ZXIgc3VwcG9ydHMgYSBoYXJkd2FyZSBjb2xvciBjdXJzb3IgaW4gYm90aCBoaWdoLXJlc29sdXRpb24gYW5kIGxvdy1yZXNvbHV0aW9uIG1vZGVzICh3aXRoIHNjYW4gbGluZXMgbGVzcyB0aGFuIDQwMCkuIAorCisJCS8vIDNEIERldmljZSBjYXBzCisJCWNhcHMuRGV2Q2FwcyA9CQlEM0RERVZDQVBTX0NBTkJMVFNZU1RPTk9OTE9DQUwgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIGJsaXRzIGZyb20gc3lzdGVtLW1lbW9yeSB0ZXh0dXJlcyB0byBub25sb2NhbCB2aWRlby1tZW1vcnkgdGV4dHVyZXMuIAorCQkJCQkJCUQzRERFVkNBUFNfQ0FOUkVOREVSQUZURVJGTElQIHwJCQkvLyBEZXZpY2UgY2FuIHF1ZXVlIHJlbmRlcmluZyBjb21tYW5kcyBhZnRlciBhIHBhZ2UgZmxpcC4gQXBwbGljYXRpb25zIGRvIG5vdCBjaGFuZ2UgdGhlaXIgYmVoYXZpb3IgaWYgdGhpcyBmbGFnIGlzIHNldDsgdGhpcyBjYXBhYmlsaXR5IG1lYW5zIHRoYXQgdGhlIGRldmljZSBpcyByZWxhdGl2ZWx5IGZhc3QuIAorCQkJCQkJCUQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyIHwJCQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgRHJhd1ByaW1pdGl2ZXMyLgorCQkJCQkJCUQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyRVggfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBleHRlbmRlZCBEcmF3UHJpbWl0aXZlczI7IHRoYXQgaXMsIHRoaXMgaXMgYSBEaXJlY3RYIDcuMC1jb21wbGlhbnQgZHJpdmVyLgorCQkJCQkJCUQzRERFVkNBUFNfRFJBV1BSSU1UTFZFUlRFWCB8CQkJLy8gRGV2aWNlIGV4cG9ydHMgYW4gSURpcmVjdDNERGV2aWNlOTo6RHJhd1ByaW1pdGl2ZS1hd2FyZSBoYXJkd2FyZSBhYnN0cmFjdGlvbiBsYXllciAoSEFMKS4gCisJCQkJCQkJRDNEREVWQ0FQU19FWEVDVVRFU1lTVEVNTUVNT1JZIHwJCS8vIERldmljZSBjYW4gdXNlIGV4ZWN1dGUgYnVmZmVycyBmcm9tIHN5c3RlbSBtZW1vcnkuCisJCQkJCQkJRDNEREVWQ0FQU19FWEVDVVRFVklERU9NRU1PUlkgfAkJCS8vIERldmljZSBjYW4gdXNlIGV4ZWN1dGUgYnVmZmVycyBmcm9tIHZpZGVvIG1lbW9yeS4gCisJCQkJCQkJRDNEREVWQ0FQU19IV1JBU1RFUklaQVRJT04gfAkJCS8vIERldmljZSBoYXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGZvciBzY2VuZSByYXN0ZXJpemF0aW9uLiAKKwkJCQkJCQlEM0RERVZDQVBTX0hXVFJBTlNGT1JNQU5ETElHSFQgfAkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IHRyYW5zZm9ybWF0aW9uIGFuZCBsaWdodGluZyBpbiBoYXJkd2FyZS4gCisJCQkJCQkvLwlEM0RERVZDQVBTX05QQVRDSEVTIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyBOIHBhdGNoZXMuIAorCQkJCQkJCUQzRERFVkNBUFNfUFVSRURFVklDRSB8CQkJCQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgcmFzdGVyaXphdGlvbiwgdHJhbnNmb3JtLCBsaWdodGluZywgYW5kIHNoYWRpbmcgaW4gaGFyZHdhcmUuIAorCQkJCQkJLy8JRDNEREVWQ0FQU19RVUlOVElDUlRQQVRDSEVTIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcXVpbnRpYyBC6XppZXIgY3VydmVzIGFuZCBCLXNwbGluZXMuIAorCQkJCQkJLy8JRDNEREVWQ0FQU19SVFBBVENIRVMgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHJlY3Rhbmd1bGFyIGFuZCB0cmlhbmd1bGFyIHBhdGNoZXMuIAorCQkJCQkJCUQzRERFVkNBUFNfUlRQQVRDSEhBTkRMRVpFUk8gfAkJCS8vIFdoZW4gdGhpcyBkZXZpY2UgY2FwYWJpbGl0eSBpcyBzZXQsIHRoZSBoYXJkd2FyZSBhcmNoaXRlY3R1cmUgZG9lcyBub3QgcmVxdWlyZSBjYWNoaW5nIG9mIGFueSBpbmZvcm1hdGlvbiBhbmQgdW5jYWNoZWQgcGF0Y2hlcyAoaGFuZGxlIHplcm8pIHdpbGwgYmUgZHJhd24gYXMgZWZmaWNpZW50bHkgYXMgY2FjaGVkIG9uZXMuIE5vdGUgdGhhdCBzZXR0aW5nIEQzRERFVkNBUFNfUlRQQVRDSEhBTkRMRVpFUk8gZG9lcyBub3QgbWVhbiB0aGF0IGEgcGF0Y2ggd2l0aCBoYW5kbGUgemVybyBjYW4gYmUgZHJhd24uIEEgaGFuZGxlLXplcm8gcGF0Y2ggY2FuIGFsd2F5cyBiZSBkcmF3biB3aGV0aGVyIHRoaXMgY2FwIGlzIHNldCBvciBub3QuIAorCQkJCQkJLy8JRDNEREVWQ0FQU19TRVBBUkFURVRFWFRVUkVNRU1PUklFUyB8CS8vIERldmljZSBpcyB0ZXh0dXJpbmcgZnJvbSBzZXBhcmF0ZSBtZW1vcnkgcG9vbHMuIAorCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRU5PTkxPQ0FMVklETUVNIHwJCS8vIERldmljZSBjYW4gcmV0cmlldmUgdGV4dHVyZXMgZnJvbSBub24tbG9jYWwgdmlkZW8gbWVtb3J5LiAKKwkJCQkJCQlEM0RERVZDQVBTX1RFWFRVUkVTWVNURU1NRU1PUlkgfAkJLy8gRGV2aWNlIGNhbiByZXRyaWV2ZSB0ZXh0dXJlcyBmcm9tIHN5c3RlbSBtZW1vcnkuIAorCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRVZJREVPTUVNT1JZIHwJCQkvLyBEZXZpY2UgY2FuIHJldHJpZXZlIHRleHR1cmVzIGZyb20gZGV2aWNlIG1lbW9yeS4gCisJCQkJCQkJRDNEREVWQ0FQU19UTFZFUlRFWFNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHVzZSBidWZmZXJzIGZyb20gc3lzdGVtIG1lbW9yeSBmb3IgdHJhbnNmb3JtZWQgYW5kIGxpdCB2ZXJ0aWNlcy4gCisJCQkJCQkJRDNEREVWQ0FQU19UTFZFUlRFWFZJREVPTUVNT1JZOwkJCS8vIERldmljZSBjYW4gdXNlIGJ1ZmZlcnMgZnJvbSB2aWRlbyBtZW1vcnkgZm9yIHRyYW5zZm9ybWVkIGFuZCBsaXQgdmVydGljZXMuCisKKwkJY2Fwcy5QcmltaXRpdmVNaXNjQ2FwcyA9IAkJRDNEUE1JU0NDQVBTX01BU0taIHwJCQkJCQkvLyBEZXZpY2UgY2FuIGVuYWJsZSBhbmQgZGlzYWJsZSBtb2RpZmljYXRpb24gb2YgdGhlIGRlcHRoIGJ1ZmZlciBvbiBwaXhlbCBvcGVyYXRpb25zLiAKKwkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ1VMTE5PTkUgfAkJCQkJCS8vIFRoZSBkcml2ZXIgZG9lcyBub3QgcGVyZm9ybSB0cmlhbmdsZSBjdWxsaW5nLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RDVUxMX05PTkUgbWVtYmVyIG9mIHRoZSBEM0RDVUxMIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NVTExDVyB8CQkJCQkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBjbG9ja3dpc2UgdHJpYW5nbGUgY3VsbGluZyB0aHJvdWdoIHRoZSBEM0RSU19DVUxMTU9ERSBzdGF0ZS4gKFRoaXMgYXBwbGllcyBvbmx5IHRvIHRyaWFuZ2xlIHByaW1pdGl2ZXMuKSBUaGlzIGZsYWcgY29ycmVzcG9uZHMgdG8gdGhlIEQzRENVTExfQ1cgbWVtYmVyIG9mIHRoZSBEM0RDVUxMIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NVTExDQ1cgfAkJCQkJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgY291bnRlcmNsb2Nrd2lzZSBjdWxsaW5nIHRocm91Z2ggdGhlIEQzRFJTX0NVTExNT0RFIHN0YXRlLiAoVGhpcyBhcHBsaWVzIG9ubHkgdG8gdHJpYW5nbGUgcHJpbWl0aXZlcy4pIFRoaXMgZmxhZyBjb3JyZXNwb25kcyB0byB0aGUgRDNEQ1VMTF9DQ1cgbWVtYmVyIG9mIHRoZSBEM0RDVUxMIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NPTE9SV1JJVEVFTkFCTEUgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLWNoYW5uZWwgd3JpdGVzIGZvciB0aGUgcmVuZGVyLXRhcmdldCBjb2xvciBidWZmZXIgdGhyb3VnaCB0aGUgRDNEUlNfQ09MT1JXUklURUVOQUJMRSBzdGF0ZS4gCisJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NMSVBQTEFORVNDQUxFRFBPSU5UUyB8CQkvLyBEZXZpY2UgY29ycmVjdGx5IGNsaXBzIHNjYWxlZCBwb2ludHMgb2Ygc2l6ZSBncmVhdGVyIHRoYW4gMS4wIHRvIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXMuIAorCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DTElQVExWRVJUUyB8CQkJCQkvLyBEZXZpY2UgY2xpcHMgcG9zdC10cmFuc2Zvcm1lZCB2ZXJ0ZXggcHJpbWl0aXZlcy4gU3BlY2lmeSBEM0RVU0FHRV9ET05PVENMSVAgd2hlbiB0aGUgcGlwZWxpbmUgc2hvdWxkIG5vdCBkbyBhbnkgY2xpcHBpbmcuIEZvciB0aGlzIGNhc2UsIGFkZGl0aW9uYWwgc29mdHdhcmUgY2xpcHBpbmcgbWF5IG5lZWQgdG8gYmUgcGVyZm9ybWVkIGF0IGRyYXcgdGltZSwgcmVxdWlyaW5nIHRoZSB2ZXJ0ZXggYnVmZmVyIHRvIGJlIGluIHN5c3RlbSBtZW1vcnkuIAorCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19UU1NBUkdURU1QIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyBEM0RUQSBmb3IgdGVtcG9yYXJ5IHJlZ2lzdGVyLiAKKwkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQkxFTkRPUCB8CQkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGFscGhhLWJsZW5kaW5nIG9wZXJhdGlvbnMgb3RoZXIgdGhhbiBEM0RCTEVORE9QX0FERC4gCisJCQkJCQkJCQkvLwlEM0RQTUlTQ0NBUFNfTlVMTFJFRkVSRU5DRSB8CQkJCS8vIEEgcmVmZXJlbmNlIGRldmljZSB0aGF0IGRvZXMgbm90IHJlbmRlci4gCisJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0lOREVQRU5ERU5UV1JJVEVNQVNLUyB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgaW5kZXBlbmRlbnQgd3JpdGUgbWFza3MgZm9yIG11bHRpcGxlIGVsZW1lbnQgdGV4dHVyZXMgb3IgbXVsdGlwbGUgcmVuZGVyIHRhcmdldHMuIAorCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19QRVJTVEFHRUNPTlNUQU5UIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBjb25zdGFudHMuIFNlZSBEM0RUU1NfQ09OU1RBTlQgaW4gRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFLiAKKwkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfRk9HQU5EU1BFQ1VMQVJBTFBIQSB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNlcGFyYXRlIGZvZyBhbmQgc3BlY3VsYXIgYWxwaGEuIE1hbnkgZGV2aWNlcyB1c2UgdGhlIHNwZWN1bGFyIGFscGhhIGNoYW5uZWwgdG8gc3RvcmUgdGhlIGZvZyBmYWN0b3IuIAorCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19TRVBBUkFURUFMUEhBQkxFTkQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzZXBhcmF0ZSBibGVuZCBzZXR0aW5ncyBmb3IgdGhlIGFscGhhIGNoYW5uZWwuIAorCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19NUlRJTkRFUEVOREVOVEJJVERFUFRIUyB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgZGlmZmVyZW50IGJpdCBkZXB0aHMgZm9yIG11bHRpcGxlIHJlbmRlciB0YXJnZXRzLiAKKwkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfTVJUUE9TVFBJWEVMU0hBREVSQkxFTkRJTkcgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcG9zdC1waXhlbCBzaGFkZXIgb3BlcmF0aW9ucyBmb3IgbXVsdGlwbGUgcmVuZGVyIHRhcmdldHMuIAorCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19GT0dWRVJURVhDTEFNUEVEOwkJCQkvLyBEZXZpY2UgY2xhbXBzIGZvZyBibGVuZCBmYWN0b3IgcGVyIHZlcnRleC4KKworCQljYXBzLlJhc3RlckNhcHMgPQkJRDNEUFJBU1RFUkNBUFNfQU5JU09UUk9QWSB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcuIAorCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19DT0xPUlBFUlNQRUNUSVZFIHwJCS8vIERldmljZSBpdGVyYXRlcyBjb2xvcnMgcGVyc3BlY3RpdmUgY29ycmVjdGx5LiAKKwkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19ESVRIRVIgfAkJCQkJLy8gRGV2aWNlIGNhbiBkaXRoZXIgdG8gaW1wcm92ZSBjb2xvciByZXNvbHV0aW9uLiAKKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfREVQVEhCSUFTIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGxlZ2FjeSBkZXB0aCBiaWFzLiBGb3IgdHJ1ZSBkZXB0aCBiaWFzLCBzZWUgRDNEUFJBU1RFUkNBUFNfU0xPUEVTQ0FMRURFUFRIQklBUy4KKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HUkFOR0UgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcmFuZ2UtYmFzZWQgZm9nLiBJbiByYW5nZS1iYXNlZCBmb2csIHRoZSBkaXN0YW5jZSBvZiBhbiBvYmplY3QgZnJvbSB0aGUgdmlld2VyIGlzIHVzZWQgdG8gY29tcHV0ZSBmb2cgZWZmZWN0cywgbm90IHRoZSBkZXB0aCBvZiB0aGUgb2JqZWN0ICh0aGF0IGlzLCB0aGUgei1jb29yZGluYXRlKSBpbiB0aGUgc2NlbmUuIAorCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19GT0dUQUJMRSB8CQkJCS8vIERldmljZSBjYWxjdWxhdGVzIHRoZSBmb2cgdmFsdWUgYnkgcmVmZXJyaW5nIHRvIGEgbG9va3VwIHRhYmxlIGNvbnRhaW5pbmcgZm9nIHZhbHVlcyB0aGF0IGFyZSBpbmRleGVkIHRvIHRoZSBkZXB0aCBvZiBhIGdpdmVuIHBpeGVsLiAKKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HVkVSVEVYIHwJCQkJLy8gRGV2aWNlIGNhbGN1bGF0ZXMgdGhlIGZvZyB2YWx1ZSBkdXJpbmcgdGhlIGxpZ2h0aW5nIG9wZXJhdGlvbiBhbmQgaW50ZXJwb2xhdGVzIHRoZSBmb2cgdmFsdWUgZHVyaW5nIHJhc3Rlcml6YXRpb24uIAorCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19NSVBNQVBMT0RCSUFTIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgbGV2ZWwgb2YgZGV0YWlsIChMT0QpIGJpYXMgYWRqdXN0bWVudHMuIFRoZXNlIGJpYXMgYWRqdXN0bWVudHMgZW5hYmxlIGFuIGFwcGxpY2F0aW9uIHRvIG1ha2UgYSBtaXBtYXAgYXBwZWFyIGNyaXNwZXIgb3IgbGVzcyBzaGFycCB0aGFuIGl0IG5vcm1hbGx5IHdvdWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBMT0QgYmlhcyBpbiBtaXBtYXBzLCBzZWUgRDNEU0FNUF9NSVBNQVBMT0RCSUFTLgorCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX01VTFRJU0FNUExFX1RPR0dMRSB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgdG9nZ2xpbmcgbXVsdGlzYW1wbGluZyBvbiBhbmQgb2ZmIGJldHdlZW4gSURpcmVjdDNERGV2aWNlOTo6QmVnaW5TY2VuZSBhbmQgSURpcmVjdDNERGV2aWNlOTo6RW5kU2NlbmUgKHVzaW5nIEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTKS4gCisJCQkJCQkJCUQzRFBSQVNURVJDQVBTX1NDSVNTT1JURVNUIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgc2Npc3NvciB0ZXN0LiBTZWUgU2Npc3NvciBUZXN0LgorCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19TTE9QRVNDQUxFREVQVEhCSUFTIHwJLy8gRGV2aWNlIHBlcmZvcm1zIHRydWUgc2xvcGUtc2NhbGUgYmFzZWQgZGVwdGggYmlhcy4gVGhpcyBpcyBpbiBjb250cmFzdCB0byB0aGUgbGVnYWN5IHN0eWxlIEQzRFBSQVNURVJDQVBTX0RFUFRIQklBUy4KKwkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19XQlVGRkVSIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGRlcHRoIGJ1ZmZlcmluZyB1c2luZyB3LiAKKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfV0ZPRyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgdy1iYXNlZCBmb2cuIFctYmFzZWQgZm9nIGlzIHVzZWQgd2hlbiBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IGlzIHNwZWNpZmllZCwgYnV0IGFmZmluZSBwcm9qZWN0aW9ucyBzdGlsbCB1c2Ugei1iYXNlZCBmb2cuIFRoZSBzeXN0ZW0gY29uc2lkZXJzIGEgcHJvamVjdGlvbiBtYXRyaXggdGhhdCBjb250YWlucyBhIG5vbnplcm8gdmFsdWUgaW4gdGhlIFszXVs0XSBlbGVtZW50IHRvIGJlIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXguIAorCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX1pCVUZGRVJMRVNTSFNSIHwJCQkvLyBEZXZpY2UgY2FuIHBlcmZvcm0gaGlkZGVuLXN1cmZhY2UgcmVtb3ZhbCAoSFNSKSB3aXRob3V0IHJlcXVpcmluZyB0aGUgYXBwbGljYXRpb24gdG8gc29ydCBwb2x5Z29ucyBhbmQgd2l0aG91dCByZXF1aXJpbmcgdGhlIGFsbG9jYXRpb24gb2YgYSBkZXB0aC1idWZmZXIuIFRoaXMgbGVhdmVzIG1vcmUgdmlkZW8gbWVtb3J5IGZvciB0ZXh0dXJlcy4gVGhlIG1ldGhvZCB1c2VkIHRvIHBlcmZvcm0gSFNSIGlzIGhhcmR3YXJlLWRlcGVuZGVudCBhbmQgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLiBaLWJ1ZmZlcmxlc3MgSFNSIGlzIHBlcmZvcm1lZCBpZiBubyBkZXB0aC1idWZmZXIgc3VyZmFjZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbmRlcmluZy10YXJnZXQgc3VyZmFjZSBhbmQgdGhlIGRlcHRoLWJ1ZmZlciBjb21wYXJpc29uIHRlc3QgaXMgZW5hYmxlZCAodGhhdCBpcywgd2hlbiB0aGUgc3RhdGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBEM0RSU19aRU5BQkxFIGVudW1lcmF0aW9uIGNvbnN0YW50IGlzIHNldCB0byBUUlVFKS4KKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfWkZPRyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgei1iYXNlZCBmb2cuIAorCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19aVEVTVDsJCQkJCS8vIERldmljZSBjYW4gcGVyZm9ybSB6LXRlc3Qgb3BlcmF0aW9ucy4gVGhpcyBlZmZlY3RpdmVseSByZW5kZXJzIGEgcHJpbWl0aXZlIGFuZCBpbmRpY2F0ZXMgd2hldGhlciBhbnkgeiBwaXhlbHMgaGF2ZSBiZWVuIHJlbmRlcmVkLgorCisJCWNhcHMuWkNtcENhcHMgPQkJRDNEUENNUENBUFNfQUxXQVlTIHwJCS8vIEFsd2F5cyBwYXNzIHRoZSB6LXRlc3QuIAorCQkJCQkJCUQzRFBDTVBDQVBTX0VRVUFMIHwJCQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGVxdWFscyB0aGUgY3VycmVudCB6LiAKKwkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSIHwJCS8vIFBhc3MgdGhlIHotdGVzdCBpZiB0aGUgbmV3IHogaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHouIAorCQkJCQkJCUQzRFBDTVBDQVBTX0dSRUFURVJFUVVBTCB8CS8vIFBhc3MgdGhlIHotdGVzdCBpZiB0aGUgbmV3IHogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHouIAorCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1MgfAkJCS8vIFBhc3MgdGhlIHotdGVzdCBpZiB0aGUgbmV3IHogaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHouIAorCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1NFUVVBTCB8CQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB6LiAKKwkJCQkJCQlEM0RQQ01QQ0FQU19ORVZFUiB8CQkJLy8gQWx3YXlzIGZhaWwgdGhlIHotdGVzdC4gCisJCQkJCQkJRDNEUENNUENBUFNfTk9URVFVQUw7CQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGRvZXMgbm90IGVxdWFsIHRoZSBjdXJyZW50IHouCisKKwkJY2Fwcy5TcmNCbGVuZENhcHMgPQkJRDNEUEJMRU5EQ0FQU19CTEVOREZBQ1RPUiB8CQkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIGJvdGggRDNEQkxFTkRfQkxFTkRGQUNUT1IgYW5kIEQzREJMRU5EX0lOVkJMRU5ERkFDVE9SLiBTZWUgRDNEQkxFTkQuCisJCQkJCQkJCUQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBIHwJLy8gU291cmNlIGJsZW5kIGZhY3RvciBpcyAoMS1BcywxLUFzLDEtQXMsMS1BcykgYW5kIGRlc3RpbmF0aW9uIGJsZW5kIGZhY3RvciBpcyAoQXMsQXMsQXMsQXMpOyB0aGUgZGVzdGluYXRpb24gYmxlbmQgc2VsZWN0aW9uIGlzIG92ZXJyaWRkZW4uIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSB8CS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIEQzREJMRU5EX0JPVEhTUkNBTFBIQSBibGVuZCBtb2RlLiAoVGhpcyBibGVuZCBtb2RlIGlzIG9ic29sZXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEQzREJMRU5ELikgCisJCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVEFMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQWQsIEFkLCBBZCwgQWQpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChSZCwgR2QsIEJkLCBBZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BZCwgMS1BZCwgMS1BZCwgMS1BZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1SZCwgMS1HZCwgMS1CZCwgMS1BZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BcywgMS1BcywgMS1BcywgMS1BcykuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1ScywgMS1HcywgMS1CcywgMS1BcykuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX09ORSB8CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMSwgMSwgMSwgMSkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQXMsIEFzLCBBcywgQXMpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKGYsIGYsIGYsIDEpOyBmID0gbWluKEFzLCAxLUFkKS4gCisJCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChScywgR3MsIEJzLCBBcykuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1pFUk87CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMCwgMCwgMCwgMCkuCisKKwkJY2Fwcy5EZXN0QmxlbmRDYXBzID0gCUQzRFBCTEVORENBUFNfQkxFTkRGQUNUT1IgfAkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBib3RoIEQzREJMRU5EX0JMRU5ERkFDVE9SIGFuZCBEM0RCTEVORF9JTlZCTEVOREZBQ1RPUi4gU2VlIEQzREJMRU5ELgorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQSB8CS8vIFNvdXJjZSBibGVuZCBmYWN0b3IgaXMgKDEtQXMsMS1BcywxLUFzLDEtQXMpIGFuZCBkZXN0aW5hdGlvbiBibGVuZCBmYWN0b3IgaXMgKEFzLEFzLEFzLEFzKTsgdGhlIGRlc3RpbmF0aW9uIGJsZW5kIHNlbGVjdGlvbiBpcyBvdmVycmlkZGVuLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19CT1RIU1JDQUxQSEEgfAkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIHRoZSBEM0RCTEVORF9CT1RIU1JDQUxQSEEgYmxlbmQgbW9kZS4gKFRoaXMgYmxlbmQgbW9kZSBpcyBvYnNvbGV0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBEM0RCTEVORC4pIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0RFU1RBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKEFkLCBBZCwgQWQsIEFkKS4gCisJCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVENPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoUmQsIEdkLCBCZCwgQWQpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZERVNUQUxQSEEgfAkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtQWQsIDEtQWQsIDEtQWQsIDEtQWQpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZERVNUQ09MT1IgfAkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtUmQsIDEtR2QsIDEtQmQsIDEtQWQpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtQXMsIDEtQXMsIDEtQXMsIDEtQXMpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZTUkNDT0xPUiB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtUnMsIDEtR3MsIDEtQnMsIDEtQXMpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19PTkUgfAkJCQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEsIDEsIDEsIDEpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKEFzLCBBcywgQXMsIEFzKS4gCisJCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQUxQSEFTQVQgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChmLCBmLCBmLCAxKTsgZiA9IG1pbihBcywgMS1BZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoUnMsIEdzLCBCcywgQXMpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19aRVJPOwkJCQkvLyBCbGVuZCBmYWN0b3IgaXMgKDAsIDAsIDAsIDApLgorCisJCWNhcHMuQWxwaGFDbXBDYXBzID0gRDNEUENNUENBUFNfQUxXQVlTIHwJCS8vIEFsd2F5cyBwYXNzIHRoZSBhcGhhLXRlc3QuIAorCQkJCQkJCUQzRFBDTVBDQVBTX0VRVUFMIHwJCQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGVxdWFscyB0aGUgY3VycmVudCBhcGhhLiAKKwkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSIHwJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGFwaGEuIAorCQkJCQkJCUQzRFBDTVBDQVBTX0dSRUFURVJFUVVBTCB8CS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IGFwaGEuIAorCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1MgfAkJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGFwaGEuIAorCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1NFUVVBTCB8CQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBhcGhhLiAKKwkJCQkJCQlEM0RQQ01QQ0FQU19ORVZFUiB8CQkJLy8gQWx3YXlzIGZhaWwgdGhlIGFwaGEtdGVzdC4gCisJCQkJCQkJRDNEUENNUENBUFNfTk9URVFVQUw7CQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGRvZXMgbm90IGVxdWFsIHRoZSBjdXJyZW50IGFwaGEuCisKKwkJY2Fwcy5TaGFkZUNhcHMgPQlEM0RQU0hBREVDQVBTX0FMUEhBR09VUkFVREJMRU5EIHwJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IGFuIGFscGhhIGNvbXBvbmVudCBmb3IgR291cmF1ZC1ibGVuZGVkIHRyYW5zcGFyZW5jeSAodGhlIEQzRFNIQURFX0dPVVJBVUQgc3RhdGUgZm9yIHRoZSBEM0RTSEFERU1PREUgZW51bWVyYXRlZCB0eXBlKS4gSW4gdGhpcyBtb2RlLCB0aGUgYWxwaGEgY29sb3IgY29tcG9uZW50IG9mIGEgcHJpbWl0aXZlIGlzIHByb3ZpZGVkIGF0IHZlcnRpY2VzIGFuZCBpbnRlcnBvbGF0ZWQgYWNyb3NzIGEgZmFjZSBhbG9uZyB3aXRoIHRoZSBvdGhlciBjb2xvciBjb21wb25lbnRzLiAKKwkJCQkJCQlEM0RQU0hBREVDQVBTX0NPTE9SR09VUkFVRFJHQiB8CQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgY29sb3JlZCBHb3VyYXVkIHNoYWRpbmcgaW4gdGhlIFJHQiBjb2xvciBtb2RlbC4gSW4gdGhpcyBtb2RlLCB0aGUgY29sb3IgY29tcG9uZW50IGZvciBhIHByaW1pdGl2ZSBpcyBwcm92aWRlZCBhdCB2ZXJ0aWNlcyBhbmQgaW50ZXJwb2xhdGVkIGFjcm9zcyBhIGZhY2UgYWxvbmcgd2l0aCB0aGUgb3RoZXIgY29sb3IgY29tcG9uZW50cy4gSW4gdGhlIFJHQiBsaWdodGluZyBtb2RlbCwgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNvbXBvbmVudHMgYXJlIGludGVycG9sYXRlZC4gCisJCQkJCQkJRDNEUFNIQURFQ0FQU19GT0dHT1VSQVVEIHwJCQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgZm9nIGluIHRoZSBHb3VyYXVkIHNoYWRpbmcgbW9kZS4gCisJCQkJCQkJRDNEUFNIQURFQ0FQU19TUEVDVUxBUkdPVVJBVURSR0I7CS8vIERldmljZSBzdXBwb3J0cyBHb3VyYXVkIHNoYWRpbmcgb2Ygc3BlY3VsYXIgaGlnaGxpZ2h0cy4KKworCQljYXBzLlRleHR1cmVDYXBzID0JCUQzRFBURVhUVVJFQ0FQU19BTFBIQSB8CQkJCQkJLy8gQWxwaGEgaW4gdGV4dHVyZSBwaXhlbHMgaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX0FMUEhBUEFMRVRURSB8CQkJCS8vIERldmljZSBjYW4gZHJhdyBhbHBoYSBmcm9tIHRleHR1cmUgcGFsZXR0ZXMuIAorCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfQ1VCRU1BUCB8CQkJCQkvLyBTdXBwb3J0cyBjdWJlIHRleHR1cmVzLgorCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19DVUJFTUFQX1BPVzIgfAkJCQkvLyBEZXZpY2UgcmVxdWlyZXMgdGhhdCBjdWJlIHRleHR1cmUgbWFwcyBoYXZlIGRpbWVuc2lvbnMgc3BlY2lmaWVkIGFzIHBvd2VycyBvZiB0d28uIAorCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfTUlQQ1VCRU1BUCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBtaXBtYXBwZWQgY3ViZSB0ZXh0dXJlcy4gCisJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19NSVBNQVAgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIG1pcG1hcHBlZCB0ZXh0dXJlcy4gCisJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19NSVBWT0xVTUVNQVAgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgbWlwbWFwcGVkIHZvbHVtZSB0ZXh0dXJlcy4gCisJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX05PTlBPVzJDT05ESVRJT05BTCB8CQkvLyBDb25kaXRpb25hbGx5IHN1cHBvcnRzIHRoZSB1c2Ugb2YgMi1EIHRleHR1cmVzIHdpdGggZGltZW5zaW9ucyB0aGF0IGFyZSBub3QgcG93ZXJzIG9mIHR3by4gQSBkZXZpY2UgdGhhdCBleHBvc2VzIHRoaXMgY2FwYWJpbGl0eSBjYW4gdXNlIHN1Y2ggYSB0ZXh0dXJlIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBhcmUgbWV0Li4uCisJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX05PUFJPSkVDVEVEQlVNUEVOViB8CQkvLyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhIHByb2plY3RlZCBidW1wLWVudmlyb25tZW50IGxvb3BrdXAgb3BlcmF0aW9uIGluIHByb2dyYW1tYWJsZSBhbmQgZml4ZWQgZnVuY3Rpb24gc2hhZGVycy4gCisJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSB8CQkJCS8vIFBlcnNwZWN0aXZlIGNvcnJlY3Rpb24gdGV4dHVyaW5nIGlzIHN1cHBvcnRlZC4KKwkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfUE9XMiB8CQkJCQkJLy8gQWxsIHRleHR1cmVzIG11c3QgaGF2ZSB3aWR0aHMgYW5kIGhlaWdodHMgc3BlY2lmaWVkIGFzIHBvd2VycyBvZiB0d28uIFRoaXMgcmVxdWlyZW1lbnQgZG9lcyBub3QgYXBwbHkgdG8gZWl0aGVyIGN1YmUgdGV4dHVyZXMgb3Igdm9sdW1lIHRleHR1cmVzLgorCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfUFJPSkVDVEVEIHwJCQkJCS8vIFN1cHBvcnRzIHRoZSBEM0RUVEZGX1BST0pFQ1RFRCB0ZXh0dXJlIHRyYW5zZm9ybWF0aW9uIGZsYWcuIFdoZW4gYXBwbGllZCwgdGhlIGRldmljZSBkaXZpZGVzIHRyYW5zZm9ybWVkIHRleHR1cmUgY29vcmRpbmF0ZXMgYnkgdGhlIGxhc3QgdGV4dHVyZSBjb29yZGluYXRlLiBJZiB0aGlzIGNhcGFiaWxpdHkgaXMgcHJlc2VudCwgdGhlbiB0aGUgcHJvamVjdGl2ZSBkaXZpZGUgb2NjdXJzIHBlciBwaXhlbC4gSWYgdGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBwcmVzZW50LCBidXQgdGhlIHByb2plY3RpdmUgZGl2aWRlIG5lZWRzIHRvIG9jY3VyIGFueXdheSwgdGhlbiBpdCBpcyBwZXJmb3JtZWQgb24gYSBwZXItdmVydGV4IGJhc2lzIGJ5IHRoZSBEaXJlY3QzRCBydW50aW1lLiAKKwkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfU1FVQVJFT05MWSB8CQkJCS8vIEFsbCB0ZXh0dXJlcyBtdXN0IGJlIHNxdWFyZS4gCisJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19URVhSRVBFQVROT1RTQ0FMRURCWVNJWkUgfAkvLyBUZXh0dXJlIGluZGljZXMgYXJlIG5vdCBzY2FsZWQgYnkgdGhlIHRleHR1cmUgc2l6ZSBwcmlvciB0byBpbnRlcnBvbGF0aW9uLgorCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQOwkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHZvbHVtZSB0ZXh0dXJlcy4KKwkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQX1BPVzI7CQkJCS8vIERldmljZSByZXF1aXJlcyB0aGF0IHZvbHVtZSB0ZXh0dXJlIG1hcHMgaGF2ZSBkaW1lbnNpb25zIHNwZWNpZmllZCBhcyBwb3dlcnMgb2YgdHdvLiAKKworCQljYXBzLlRleHR1cmVGaWx0ZXJDYXBzID0JCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHB5cmFtaWRhbCBtYWduaWZ5aW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QWVJBTUlEQUxRVUFEIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGR0FVU1NJQU5RVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBHYXVzc2lhbiBxdWFkIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gCisJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9BTklTT1RST1BJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORlBZUkFNSURBTFFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHB5cmFtaWRhbCBzYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIAorCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIAorCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIHBvaW50LXNhbXBsZSBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVI7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKworCQljYXBzLkN1YmVUZXh0dXJlRmlsdGVyQ2FwcyA9CQlEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBweXJhbWlkYWwgbWFnbmlmeWluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUFlSQU1JREFMUVVBRCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiAKKwkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgbGluZWFyIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgbGluZWFyIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIAorCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBwb2ludC1zYW1wbGUgbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUjsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCisJCWNhcHMuVm9sdW1lVGV4dHVyZUZpbHRlckNhcHMgPSAJCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9BTklTT1RST1BJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHB5cmFtaWRhbCBtYWduaWZ5aW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QWVJBTUlEQUxRVUFEIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIAorCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9BTklTT1RST1BJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiAKKwkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gCisJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIHBvaW50LXNhbXBsZSBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGTElORUFSOwkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisKKwkJY2Fwcy5UZXh0dXJlQWRkcmVzc0NhcHMgPQlEM0RQVEFERFJFU1NDQVBTX0JPUkRFUiB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNldHRpbmcgY29vcmRpbmF0ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAuMCwgMS4wXSB0byB0aGUgYm9yZGVyIGNvbG9yLCBhcyBzcGVjaWZpZWQgYnkgdGhlIEQzRFNBTVBfQk9SREVSQ09MT1IgdGV4dHVyZS1zdGFnZSBzdGF0ZS4gCisJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX0NMQU1QIHwJCQkvLyBEZXZpY2UgY2FuIGNsYW1wIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4gCisJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX0lOREVQRU5ERU5UVVYgfAkvLyBEZXZpY2UgY2FuIHNlcGFyYXRlIHRoZSB0ZXh0dXJlLWFkZHJlc3NpbmcgbW9kZXMgb2YgdGhlIHUgYW5kIHYgY29vcmRpbmF0ZXMgb2YgdGhlIHRleHR1cmUuIFRoaXMgYWJpbGl0eSBjb3JyZXNwb25kcyB0byB0aGUgRDNEU0FNUF9BRERSRVNTVSBhbmQgRDNEU0FNUF9BRERSRVNTViByZW5kZXItc3RhdGUgdmFsdWVzLiAKKwkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfTUlSUk9SIHwJCQkvLyBEZXZpY2UgY2FuIG1pcnJvciB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuIAorCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19NSVJST1JPTkNFIHwJCS8vIERldmljZSBjYW4gdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHRleHR1cmUgY29vcmRpbmF0ZSAodGh1cywgbWlycm9yaW5nIGFyb3VuZCAwKSBhbmQgdGhlbiBjbGFtcCB0byB0aGUgbWF4aW11bSB2YWx1ZS4gCisJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX1dSQVA7CQkJCS8vIERldmljZSBjYW4gd3JhcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuCisKKwkJY2Fwcy5Wb2x1bWVUZXh0dXJlQWRkcmVzc0NhcHMgPQlEM0RQVEFERFJFU1NDQVBTX0JPUkRFUiB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNldHRpbmcgY29vcmRpbmF0ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAuMCwgMS4wXSB0byB0aGUgYm9yZGVyIGNvbG9yLCBhcyBzcGVjaWZpZWQgYnkgdGhlIEQzRFNBTVBfQk9SREVSQ09MT1IgdGV4dHVyZS1zdGFnZSBzdGF0ZS4gCisJCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19DTEFNUCB8CQkJLy8gRGV2aWNlIGNhbiBjbGFtcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuIAorCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfSU5ERVBFTkRFTlRVViB8CS8vIERldmljZSBjYW4gc2VwYXJhdGUgdGhlIHRleHR1cmUtYWRkcmVzc2luZyBtb2RlcyBvZiB0aGUgdSBhbmQgdiBjb29yZGluYXRlcyBvZiB0aGUgdGV4dHVyZS4gVGhpcyBhYmlsaXR5IGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RTQU1QX0FERFJFU1NVIGFuZCBEM0RTQU1QX0FERFJFU1NWIHJlbmRlci1zdGF0ZSB2YWx1ZXMuIAorCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfTUlSUk9SIHwJCQkvLyBEZXZpY2UgY2FuIG1pcnJvciB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuIAorCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfTUlSUk9ST05DRSB8CQkvLyBEZXZpY2UgY2FuIHRha2UgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGUgKHRodXMsIG1pcnJvcmluZyBhcm91bmQgMCkgYW5kIHRoZW4gY2xhbXAgdG8gdGhlIG1heGltdW0gdmFsdWUuIAorCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfV1JBUDsJCQkJLy8gRGV2aWNlIGNhbiB3cmFwIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4KKworCQljYXBzLkxpbmVDYXBzID0JCUQzRExJTkVDQVBTX0FMUEhBQ01QIHwJLy8gU3VwcG9ydHMgYWxwaGEtdGVzdCBjb21wYXJpc29ucy4gCisJCQkJCQkvLwlEM0RMSU5FQ0FQU19BTlRJQUxJQVMgfCAvLyBBbnRpYWxpYXNlZCBsaW5lcyBhcmUgc3VwcG9ydGVkLgorCQkJCQkJCUQzRExJTkVDQVBTX0JMRU5EIHwJCS8vIFN1cHBvcnRzIHNvdXJjZS1ibGVuZGluZy4gCisJCQkJCQkJRDNETElORUNBUFNfRk9HIHwJCS8vIFN1cHBvcnRzIGZvZy4gCisJCQkJCQkJRDNETElORUNBUFNfVEVYVFVSRSB8CS8vIFN1cHBvcnRzIHRleHR1cmUtbWFwcGluZy4gCisJCQkJCQkJRDNETElORUNBUFNfWlRFU1Q7CQkvLyBTdXBwb3J0cyB6LWJ1ZmZlciBjb21wYXJpc29ucy4KKwkJCisJCWNhcHMuTWF4VGV4dHVyZVdpZHRoID0gMSA8PCAoTUlQTUFQX0xFVkVMUyAtIDEpOworCQljYXBzLk1heFRleHR1cmVIZWlnaHQgPSAxIDw8IChNSVBNQVBfTEVWRUxTIC0gMSk7CisJCWNhcHMuTWF4Vm9sdW1lRXh0ZW50ID0gMSA8PCAoTUlQTUFQX0xFVkVMUyAtIDEpOworCQljYXBzLk1heFRleHR1cmVSZXBlYXQgPSA4MTkyOworCQljYXBzLk1heFRleHR1cmVBc3BlY3RSYXRpbyA9IDEgPDwgKE1JUE1BUF9MRVZFTFMgLSAxKTsKKwkJY2Fwcy5NYXhBbmlzb3Ryb3B5ID0gbWF4QW5pc290cm9weTsKKwkJY2Fwcy5NYXhWZXJ0ZXhXID0gMWUrMDEwOworCisJCWNhcHMuR3VhcmRCYW5kTGVmdCA9IC0xZSswMDg7CisJCWNhcHMuR3VhcmRCYW5kVG9wID0gLTFlKzAwODsKKwkJY2Fwcy5HdWFyZEJhbmRSaWdodCA9IDFlKzAwODsKKwkJY2Fwcy5HdWFyZEJhbmRCb3R0b20gPSAxZSswMDg7CisKKwkJY2Fwcy5FeHRlbnRzQWRqdXN0ID0gMDsKKworCQljYXBzLlN0ZW5jaWxDYXBzID0JCUQzRFNURU5DSUxDQVBTX0tFRVAgfAkJLy8gRG8gbm90IHVwZGF0ZSB0aGUgZW50cnkgaW4gdGhlIHN0ZW5jaWwgYnVmZmVyLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlLiAKKwkJCQkJCQkJRDNEU1RFTkNJTENBUFNfWkVSTyB8CQkvLyBTZXQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5IHRvIDAuIAorCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19SRVBMQUNFIHwJLy8gUmVwbGFjZSB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnkgd2l0aCByZWZlcmVuY2UgdmFsdWUuIAorCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19JTkNSU0FUIHwJLy8gSW5jcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgY2xhbXBpbmcgdG8gdGhlIG1heGltdW0gdmFsdWUuICAKKwkJCQkJCQkJRDNEU1RFTkNJTENBUFNfREVDUlNBVCB8CS8vIERlY3JlbWVudCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnksIGNsYW1waW5nIHRvIHplcm8uIAorCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19JTlZFUlQgfAkJLy8gSW52ZXJ0IHRoZSBiaXRzIGluIHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeS4gCisJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOQ1IgfAkJLy8gSW5jcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgd3JhcHBpbmcgdG8gemVybyBpZiB0aGUgbmV3IHZhbHVlIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUuICAKKwkJCQkJCQkJRDNEU1RFTkNJTENBUFNfREVDUiB8CQkvLyBEZWNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCB3cmFwcGluZyB0byB0aGUgbWF4aW11bSB2YWx1ZSBpZiB0aGUgbmV3IHZhbHVlIGlzIGxlc3MgdGhhbiB6ZXJvLiAKKwkJCQkJCQkJRDNEU1RFTkNJTENBUFNfVFdPU0lERUQ7CS8vIFRoZSBkZXZpY2Ugc3VwcG9ydHMgdHdvLXNpZGVkIHN0ZW5jaWwuIAorCisJCWNhcHMuRlZGQ2FwcyA9CQlEM0RGVkZDQVBTX0RPTk9UU1RSSVBFTEVNRU5UUyB8CQkvLyBJdCBpcyBwcmVmZXJhYmxlIHRoYXQgdmVydGV4IGVsZW1lbnRzIG5vdCBiZSBzdHJpcHBlZC4gVGhhdCBpcywgaWYgdGhlIHZlcnRleCBmb3JtYXQgY29udGFpbnMgZWxlbWVudHMgdGhhdCBhcmUgbm90IHVzZWQgd2l0aCB0aGUgY3VycmVudCByZW5kZXIgc3RhdGVzLCB0aGVyZSBpcyBubyBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIHZlcnRpY2VzLiBJZiB0aGlzIGNhcGFiaWxpdHkgZmxhZyBpcyBub3QgcHJlc2VudCwgc3RyaXBwaW5nIGV4dHJhbmVvdXMgZWxlbWVudHMgZnJvbSB0aGUgdmVydGV4IGZvcm1hdCBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UuIAorCQkJCQkJCUQzREZWRkNBUFNfUFNJWkUgfAkJCQkJLy8gUG9pbnQgc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IGVpdGhlciB0aGUgcmVuZGVyIHN0YXRlIG9yIHRoZSB2ZXJ0ZXggZGF0YS4KKwkJCQkJCS8vCUQzREZWRkNBUFNfVEVYQ09PUkRDT1VOVE1BU0sgfAkJLy8gTWFza3MgdGhlIGxvdyBXT1JEIG9mIEZWRkNhcHMuIFRoZXNlIGJpdHMsIGNhc3QgdG8gdGhlIFdPUkQgZGF0YSB0eXBlLCBkZXNjcmliZSB0aGUgdG90YWwgbnVtYmVyIG9mIHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIHRoYXQgdGhlIGRldmljZSBjYW4gc2ltdWx0YW5lb3VzbHkgdXNlIGZvciBtdWx0aXBsZSB0ZXh0dXJlIGJsZW5kaW5nLiAoWW91IGNhbiB1c2UgdXAgdG8gZWlnaHQgdGV4dHVyZSBjb29yZGluYXRlIHNldHMgZm9yIGFueSB2ZXJ0ZXgsIGJ1dCB0aGUgZGV2aWNlIGNhbiBibGVuZCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzLikgCisJCQkJCQkJODsKKworCQljYXBzLlRleHR1cmVPcENhcHMgPQlEM0RURVhPUENBUFNfQUREIHwJCQkJCQkJLy8gVGhlIEQzRFRPUF9BREQgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0FERFNJR05FRCB8CQkJCQkvLyBUaGUgRDNEVE9QX0FERFNJR05FRCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfQUREU0lHTkVEMlggfAkJCQkJLy8gVGhlIEQzRFRPUF9BRERTSUdORUQyWCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfQUREU01PT1RIIHwJCQkJCS8vIFRoZSBEM0RUT1BfQUREU01PT1RIIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORENVUlJFTlRBTFBIQSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORENVUlJFTlRBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRESUZGVVNFQUxQSEEgfAkJCS8vIFRoZSBEM0RUT1BfQkxFTkRESUZGVVNFQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5ERkFDVE9SQUxQSEEgfAkJCQkvLyBUaGUgRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5EVEVYVFVSRUFMUEhBIHwJCQkvLyBUaGUgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQVBNIHwJCQkvLyBUaGUgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBUE0gdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0JVTVBFTlZNQVAgfAkJCQkJLy8gVGhlIEQzRFRPUF9CVU1QRU5WTUFQIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQTFVNSU5BTkNFIHwJCQkvLyBUaGUgRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0UgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0RJU0FCTEUgfAkJCQkJCS8vIFRoZSBEM0RUT1BfRElTQUJMRSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfRE9UUFJPRFVDVDMgfAkJCQkJLy8gVGhlIEQzRFRPUF9ET1RQUk9EVUNUMyB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfTEVSUCB8CQkJCQkJCS8vIFRoZSBEM0RUT1BfTEVSUCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEUgfAkJCQkJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEUgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFMlggfAkJCQkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURTJYIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURTRYIHwJCQkJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEU0WCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVBTFBIQV9BRERDT0xPUiB8CQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1IgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFQ09MT1JfQUREQUxQSEEgfAkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUNPTE9SX0FEREFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SIHwJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBIHwJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19NVUxUSVBMWUFERCB8CQkJCQkvLyBUaGUgRDNEVE9QX01VTFRJUExZQUREIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19QUkVNT0RVTEFURSB8CQkJCQkvLyBUaGUgRDNEVE9QX1BSRU1PRFVMQVRFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19TRUxFQ1RBUkcxIHwJCQkJCS8vIFRoZSBEM0RUT1BfU0VMRUNUQVJHMSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfU0VMRUNUQVJHMiB8CQkJCQkvLyBUaGUgRDNEVE9QX1NFTEVDVEFSRzIgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX1NVQlRSQUNUOwkJCQkJCS8vIFRoZSBEM0RUT1BfU1VCVFJBQ1QgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKworCQljYXBzLk1heFRleHR1cmVCbGVuZFN0YWdlcyA9IDg7CisJCWNhcHMuTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPSA4OworCisJCWNhcHMuVmVydGV4UHJvY2Vzc2luZ0NhcHMgPQkJRDNEVlRYUENBUFNfRElSRUNUSU9OQUxMSUdIVFMgfAkJCS8vIERldmljZSBjYW4gZG8gZGlyZWN0aW9uYWwgbGlnaHRzLiAKKwkJCQkJCQkJCQlEM0RWVFhQQ0FQU19MT0NBTFZJRVdFUiB8CQkJCS8vIERldmljZSBjYW4gZG8gbG9jYWwgdmlld2VyLiAKKwkJCQkJCQkJCQlEM0RWVFhQQ0FQU19NQVRFUklBTFNPVVJDRTcJfAkJCS8vIERldmljZSBjYW4gZG8gTWljcm9zb2Z0riBEaXJlY3RYriA3LjAgY29sb3JtYXRlcmlhbHNvdXJjZSBvcGVyYXRpb25zLiAKKwkJCQkJCQkJCS8vCUQzRFZUWFBDQVBTX05PX1RFWEdFTl9OT05MT0NBTFZJRVdFUiB8CS8vIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRleHR1cmUgZ2VuZXJhdGlvbiBpbiBub24tbG9jYWwgdmlld2VyIG1vZGUuIAorCQkJCQkJCQkJCUQzRFZUWFBDQVBTX1BPU0lUSU9OQUxMSUdIVFMgfAkJCS8vIERldmljZSBjYW4gZG8gcG9zaXRpb25hbCBsaWdodHMgKGluY2x1ZGVzIHBvaW50IGFuZCBzcG90KS4gCisJCQkJCQkJCQkJRDNEVlRYUENBUFNfVEVYR0VOIHwJCQkJCS8vIERldmljZSBjYW4gZG8gdGV4Z2VuLiAKKwkJCQkJCQkJCQlEM0RWVFhQQ0FQU19URVhHRU5fU1BIRVJFTUFQOwkJCS8vIERldmljZSBzdXBwb3J0cyBEM0RUU1NfVENJX1NQSEVSRU1BUC4gCisJCQkJCQkJCQkvLwlEM0RWVFhQQ0FQU19UV0VFTklORzsJCQkJCS8vIERldmljZSBjYW4gZG8gdmVydGV4IHR3ZWVuaW5nLiAKKworCQljYXBzLk1heEFjdGl2ZUxpZ2h0cyA9IDg7CQkJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgbGlnaHRzIHRoYXQgY2FuIGJlIGFjdGl2ZSBzaW11bHRhbmVvdXNseS4gRm9yIGEgZ2l2ZW4gcGh5c2ljYWwgZGV2aWNlLCB0aGlzIGNhcGFiaWxpdHkgbWlnaHQgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlLgorCQljYXBzLk1heFVzZXJDbGlwUGxhbmVzID0gNjsJCQkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiB1c2VyLWRlZmluZWQgY2xpcHBpbmcgcGxhbmVzIHN1cHBvcnRlZC4gVGhpcyBtZW1iZXIgY2FuIHJhbmdlIGZyb20gMCB0aHJvdWdoIEQzRE1BWFVTRVJDTElQUExBTkVTLiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtYXkgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlLiAKKwkJY2Fwcy5NYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzID0gNDsJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgbWF0cmljZXMgdGhhdCB0aGlzIGRldmljZSBjYW4gYXBwbHkgd2hlbiBwZXJmb3JtaW5nIG11bHRpbWF0cml4IHZlcnRleCBibGVuZGluZy4gRm9yIGEgZ2l2ZW4gcGh5c2ljYWwgZGV2aWNlLCB0aGlzIGNhcGFiaWxpdHkgbWF5IHZhcnkgYWNyb3NzIERpcmVjdDNERGV2aWNlIG9iamVjdHMgZGVwZW5kaW5nIG9uIHRoZSBwYXJhbWV0ZXJzIHN1cHBsaWVkIHRvIElEaXJlY3QzRDk6OkNyZWF0ZURldmljZS4gCisJCWNhcHMuTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCA9IDExOwkJCS8vIERXT1JEIHZhbHVlIHRoYXQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG1hdHJpeCBpbmRleCB0aGF0IGNhbiBiZSBpbmRleGVkIGludG8gdXNpbmcgdGhlIHBlci12ZXJ0ZXggaW5kaWNlcy4gVGhlIG51bWJlciBvZiBtYXRyaWNlcyBpcyBNYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4ICsgMSwgd2hpY2ggaXMgdGhlIHNpemUgb2YgdGhlIG1hdHJpeCBwYWxldHRlLiBJZiBub3JtYWxzIGFyZSBwcmVzZW50IGluIHRoZSB2ZXJ0ZXggZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGJsZW5kZWQgZm9yIGxpZ2h0aW5nLCB0aGVuIHRoZSBudW1iZXIgb2YgbWF0cmljZXMgaXMgaGFsZiB0aGUgbnVtYmVyIHNwZWNpZmllZCBieSB0aGlzIGNhcGFiaWxpdHkgZmxhZy4gSWYgTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCBpcyBzZXQgdG8gemVybywgdGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGluZGV4ZWQgdmVydGV4IGJsZW5kaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG5vdCB6ZXJvIHRoZW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMgaXMgemVybyB0aHJvdWdoIE1heFZlcnRleEJsZW5kTWF0cml4SW5kZXguCisJCWNhcHMuTWF4UG9pbnRTaXplID0gODE5Mi4wZjsJCQkJCS8vIE1heGltdW0gc2l6ZSBvZiBhIHBvaW50IHByaW1pdGl2ZS4gSWYgc2V0IHRvIDEuMGYgdGhlbiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBwb2ludCBzaXplIGNvbnRyb2wuIFRoZSByYW5nZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4wZi4KKwkJY2Fwcy5NYXhQcmltaXRpdmVDb3VudCA9IDEgPDwgMjE7CQkJCS8vIE1heGltdW0gbnVtYmVyIG9mIHByaW1pdGl2ZXMgZm9yIGVhY2ggSURpcmVjdDNERGV2aWNlOTo6RHJhd1ByaW1pdGl2ZSBjYWxsLiBOb3RlIHRoYXQgd2hlbiBEaXJlY3QzRCBpcyB3b3JraW5nIHdpdGggYSBEaXJlY3RYIDYuMCBvciBEaXJlY3RYIDcuMCBkcml2ZXIsIHRoaXMgZmllbGQgaXMgc2V0IHRvIDB4RkZGRi4gVGhpcyBtZWFucyB0aGF0IG5vdCBvbmx5IHRoZSBudW1iZXIgb2YgcHJpbWl0aXZlcyBidXQgYWxzbyB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzIGlzIGxpbWl0ZWQgYnkgdGhpcyB2YWx1ZS4KKwkJY2Fwcy5NYXhWZXJ0ZXhJbmRleCA9IDEgPDwgMjQ7CQkJCQkvLyBNYXhpbXVtIHNpemUgb2YgaW5kaWNlcyBzdXBwb3J0ZWQgZm9yIGhhcmR3YXJlIHZlcnRleCBwcm9jZXNzaW5nLiBJdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgMzItYml0IGluZGV4IGJ1ZmZlcnMgYnkgc3BlY2lmeWluZyBEM0RGTVRfSU5ERVgzMjsgaG93ZXZlciwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gcmVuZGVyIHdpdGggdGhlIGluZGV4IGJ1ZmZlciB1bmxlc3MgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMHgwMDAwRkZGRi4KKwkJY2Fwcy5NYXhTdHJlYW1zID0gMTY7CQkJCQkJCS8vIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgZGF0YSBzdHJlYW1zIGZvciBJRGlyZWN0M0REZXZpY2U5OjpTZXRTdHJlYW1Tb3VyY2UuIFRoZSB2YWxpZCByYW5nZSBpcyAxIHRvIDE2LiBOb3RlIHRoYXQgaWYgdGhpcyB2YWx1ZSBpcyAwLCB0aGVuIHRoZSBkcml2ZXIgaXMgbm90IGEgRGlyZWN0WCA5LjAgZHJpdmVyLgorCQljYXBzLk1heFN0cmVhbVN0cmlkZSA9IDY1NTM2OwkJCQkJLy8gTWF4aW11bSBzdHJpZGUgZm9yIElEaXJlY3QzRERldmljZTk6OlNldFN0cmVhbVNvdXJjZS4KKwkJY2Fwcy5WZXJ0ZXhTaGFkZXJWZXJzaW9uID0gdmVydGV4U2hhZGVyVmVyc2lvbjsJLy8gVHdvIG51bWJlcnMgdGhhdCByZXByZXNlbnQgdGhlIHZlcnRleCBzaGFkZXIgbWFpbiBhbmQgc3ViIHZlcnNpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBmb3IgZWFjaCB2ZXJ0ZXggc2hhZGVyIHZlcnNpb24sIHNlZSBWZXJzaW9uIDFfeCwgVmVyc2lvbiAyXzAsIFZlcnNpb24gMl8wIEV4dGVuZGVkLCBvciBWZXJzaW9uIDNfMC4KKwkJY2Fwcy5NYXhWZXJ0ZXhTaGFkZXJDb25zdCA9IDI1NjsJCQkJLy8gVGhlIG51bWJlciBvZiB2ZXJ0ZXggc2hhZGVyIFJlZ2lzdGVycyB0aGF0IGFyZSByZXNlcnZlZCBmb3IgY29uc3RhbnRzLgorCQljYXBzLlBpeGVsU2hhZGVyVmVyc2lvbiA9IHBpeGVsU2hhZGVyVmVyc2lvbjsJLy8gVHdvIG51bWJlcnMgdGhhdCByZXByZXNlbnQgdGhlIHBpeGVsIHNoYWRlciBtYWluIGFuZCBzdWIgdmVyc2lvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkIGZvciBlYWNoIHBpeGVsIHNoYWRlciB2ZXJzaW9uLCBzZWUgVmVyc2lvbiAxX3gsIFZlcnNpb24gMl8wLCBWZXJzaW9uIDJfMCBFeHRlbmRlZCwgb3IgVmVyc2lvbiAzXzAuCisJCWNhcHMuUGl4ZWxTaGFkZXIxeE1heFZhbHVlID0gOC4wOwkJCQkvLyBNYXhpbXVtIHZhbHVlIG9mIHBpeGVsIHNoYWRlciBhcml0aG1ldGljIGNvbXBvbmVudC4gVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGludGVybmFsIHJhbmdlIG9mIHZhbHVlcyBzdXBwb3J0ZWQgZm9yIHBpeGVsIGNvbG9yIGJsZW5kaW5nIG9wZXJhdGlvbnMuIFdpdGhpbiB0aGUgcmFuZ2UgdGhhdCB0aGV5IHJlcG9ydCB0bywgaW1wbGVtZW50YXRpb25zIG11c3QgYWxsb3cgZGF0YSB0byBwYXNzIHRocm91Z2ggcGl4ZWwgcHJvY2Vzc2luZyB1bm1vZGlmaWVkICh1bmNsYW1wZWQpLiBOb3JtYWxseSwgdGhlIHZhbHVlIG9mIHRoaXMgbWVtYmVyIGlzIGFuIGFic29sdXRlIHZhbHVlLiBGb3IgZXhhbXBsZSwgYSAxLjAgaW5kaWNhdGVzIHRoYXQgdGhlIHJhbmdlIGlzIC0xLjAgdG8gMSwgYW5kIGFuIDguMCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmFuZ2UgaXMgLTguMCB0byA4LjAuIFRoZSB2YWx1ZSBtdXN0IGJlID49IDEuMCBmb3IgYW55IGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgcGl4ZWwgc2hhZGVycy4KKwkJCisJCWNhcHMuRGV2Q2FwczIgPSAvLwlEM0RERVZDQVBTMl9BREFQVElWRVRFU1NSVFBBVENIIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGFkYXB0aXZlIHRlc3NlbGxhdGlvbiBvZiBSVC1wYXRjaGVzIAorCQkJCQkJLy8JRDNEREVWQ0FQUzJfQURBUFRJVkVURVNTTlBBVENIIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGFkYXB0aXZlIHRlc3NlbGxhdGlvbiBvZiBOLXBhdGNoZXMuIAorCQkJCQkJCUQzRERFVkNBUFMyX0NBTl9TVFJFVENIUkVDVF9GUk9NX1RFWFRVUkVTIHwJCS8vIERldmljZSBzdXBwb3J0cyBJRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdCB1c2luZyBhIHRleHR1cmUgYXMgdGhlIHNvdXJjZS4gCisJCQkJCQkvLwlEM0RERVZDQVBTMl9ETUFQTlBBVENIIHwJCQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgZGlzcGxhY2VtZW50IG1hcHMgZm9yIE4tcGF0Y2hlcy4gCisJCQkJCQkvLwlEM0RERVZDQVBTMl9QUkVTQU1QTEVERE1BUE5QQVRDSCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBwcmVzYW1wbGVkIGRpc3BsYWNlbWVudCBtYXBzIGZvciBOLXBhdGNoZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRpc3BsYWNlbWVudCBtYXBwaW5nLCBzZWUgRGlzcGxhY2VtZW50IE1hcHBpbmcuIAorCQkJCQkJCUQzRERFVkNBUFMyX1NUUkVBTU9GRlNFVCB8CQkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHN0cmVhbSBvZmZzZXRzLiAKKwkJCQkJCQlEM0RERVZDQVBTMl9WRVJURVhFTEVNRU5UU0NBTlNIQVJFU1RSRUFNT0ZGU0VUOwkvLyBNdWx0aXBsZSB2ZXJ0ZXggZWxlbWVudHMgY2FuIHNoYXJlIHRoZSBzYW1lIG9mZnNldCBpbiBhIHN0cmVhbSBpZiBEM0RERVZDQVBTMl9WRVJURVhFTEVNRU5UU0NBTlNIQVJFU1RSRUFNT0ZGU0VUIGlzIHNldCBieSB0aGUgZGV2aWNlIGFuZCB0aGUgdmVydGV4IGRlY2xhcmF0aW9uIGRvZXMgbm90IGhhdmUgYW4gZWxlbWVudCB3aXRoIEQzRERFQ0xVU0FHRV9QT1NJVElPTlQwLiAKKworCQljYXBzLk1heE5wYXRjaFRlc3NlbGxhdGlvbkxldmVsID0gMDsJLy8gTWF4aW11bSBudW1iZXIgb2YgTi1wYXRjaCBzdWJkaXZpc2lvbiBsZXZlbHMuIFRoZSBkcml2ZXIgd2lsbCBjbGFtcCBhcHBsaWNhdGlvbnMgdG8gdGhpcyB2YWx1ZSwgaWYgdGhleSBhcmUgdXNpbmcgcHJlc2FtcGxlZCBkaXNwbGFjZW1lbnQgbWFwcGluZy4gU2VlIFRlc3NlbGxhdGlvbiBhbmQgRGlzcGxhY2VtZW50IE1hcHBpbmcuCisJCWNhcHMuTWFzdGVyQWRhcHRlck9yZGluYWwgPSAwOwkJCS8vIFRoaXMgbnVtYmVyIGluZGljYXRlcyB3aGljaCBkZXZpY2UgaXMgdGhlIG1hc3RlciBmb3IgdGhpcyBzdWJvcmRpbmF0ZS4gVGhpcyBudW1iZXIgaXMgdGFrZW4gZnJvbSB0aGUgc2FtZSBzcGFjZSBhcyB0aGUgYWRhcHRlciB2YWx1ZXMgcGFzc2VkIHRvIHRoZSBJRGlyZWN0M0Q5IG1ldGhvZHMuCisJCWNhcHMuQWRhcHRlck9yZGluYWxJbkdyb3VwID0gMDsJCQkvLyBUaGlzIG51bWJlciBpbmRpY2F0ZXMgdGhlIG9yZGVyIGluIHdoaWNoIGhlYWRzIGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UgKEFQSSkuIFRoZSBtYXN0ZXIgYWRhcHRlciBhbHdheXMgaGFzIEFkYXB0ZXJPcmRpbmFsSW5Hcm91cCA9IDAuIFRoZXNlIHZhbHVlcyBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgYWRhcHRlciBvcmRpbmFscyBwYXNzZWQgdG8gdGhlIElEaXJlY3QzRDkgbWV0aG9kcy4gVGhleSBhcHBseSBvbmx5IHRvIGhlYWRzIHdpdGhpbiBhIGdyb3VwLgorCQljYXBzLk51bWJlck9mQWRhcHRlcnNJbkdyb3VwID0gMTsJCS8vIE51bWJlciBvZiBhZGFwdGVycyBpbiB0aGlzIGFkYXB0ZXIgZ3JvdXAgKG9ubHkgaWYgbWFzdGVyKS4gVGhpcyB3aWxsIGJlIDEgZm9yIGNvbnZlbnRpb25hbCBhZGFwdGVycy4gVGhlIHZhbHVlIHdpbGwgYmUgZ3JlYXRlciB0aGFuIDEgZm9yIHRoZSBtYXN0ZXIgYWRhcHRlciBvZiBhIG11bHRpaGVhZCBjYXJkLiBUaGUgdmFsdWUgd2lsbCBiZSAwIGZvciBhIHN1Ym9yZGluYXRlIGFkYXB0ZXIgb2YgYSBtdWx0aWhlYWQgY2FyZC4gRWFjaCBjYXJkIGNhbiBoYXZlIGF0IG1vc3Qgb25lIG1hc3RlciwgYnV0IG1heSBoYXZlIG1hbnkgc3Vib3JkaW5hdGVzLgorCisJCWNhcHMuRGVjbFR5cGVzID0JRDNERFRDQVBTX1VCWVRFNCB8CQkvLyA0LUQgdW5zaWduZWQgYnl0ZS4gCisJCQkJCQkJRDNERFRDQVBTX1VCWVRFNE4gfAkJLy8gTm9ybWFsaXplZCwgNC1EIHVuc2lnbmVkIGJ5dGUuIEVhY2ggb2YgdGhlIGZvdXIgYnl0ZXMgaXMgbm9ybWFsaXplZCBieSBkaXZpZGluZyB0byAyNTUuMC4gCisJCQkJCQkJRDNERFRDQVBTX1NIT1JUMk4gfAkJLy8gTm9ybWFsaXplZCwgMi1EIHNpZ25lZCBzaG9ydCwgZXhwYW5kZWQgdG8gKGZpcnN0IGJ5dGUvMzI3NjcuMCwgc2Vjb25kIGJ5dGUvMzI3NjcuMCwgMCwgMSkuIAorCQkJCQkJCUQzRERUQ0FQU19TSE9SVDROIHwJCS8vIE5vcm1hbGl6ZWQsIDQtRCBzaWduZWQgc2hvcnQsIGV4cGFuZGVkIHRvIChmaXJzdCBieXRlLzMyNzY3LjAsIHNlY29uZCBieXRlLzMyNzY3LjAsIHRoaXJkIGJ5dGUvMzI3NjcuMCwgZm91cnRoIGJ5dGUvMzI3NjcuMCkuIAorCQkJCQkJCUQzRERUQ0FQU19VU0hPUlQyTiB8CS8vIE5vcm1hbGl6ZWQsIDItRCB1bnNpZ25lZCBzaG9ydCwgZXhwYW5kZWQgdG8gKGZpcnN0IGJ5dGUvNjU1MzUuMCwgc2Vjb25kIGJ5dGUvNjU1MzUuMCwgMCwgMSkuICAKKwkJCQkJCQlEM0REVENBUFNfVVNIT1JUNE4gfAkvLyBOb3JtYWxpemVkIDQtRCB1bnNpZ25lZCBzaG9ydCwgZXhwYW5kZWQgdG8gKGZpcnN0IGJ5dGUvNjU1MzUuMCwgc2Vjb25kIGJ5dGUvNjU1MzUuMCwgdGhpcmQgYnl0ZS82NTUzNS4wLCBmb3VydGggYnl0ZS82NTUzNS4wKS4gIAorCQkJCQkJCUQzRERUQ0FQU19VREVDMyB8CQkvLyAzLUQgdW5zaWduZWQgMTAgMTAgMTAgZm9ybWF0IGV4cGFuZGVkIHRvICh2YWx1ZSwgdmFsdWUsIHZhbHVlLCAxKS4gCisJCQkJCQkJRDNERFRDQVBTX0RFQzNOIHwJCS8vIDMtRCBzaWduZWQgMTAgMTAgMTAgZm9ybWF0IG5vcm1hbGl6ZWQgYW5kIGV4cGFuZGVkIHRvICh2WzBdLzUxMS4wLCB2WzFdLzUxMS4wLCB2WzJdLzUxMS4wLCAxKS4gCisJCQkJCQkJRDNERFRDQVBTX0ZMT0FUMTZfMiB8CS8vIDItRCAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gCisJCQkJCQkJRDNERFRDQVBTX0ZMT0FUMTZfNDsJLy8gNC1EIDE2LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAKKworCQljYXBzLk51bVNpbXVsdGFuZW91c1JUcyA9IDQ7CS8vIE51bWJlciBvZiBzaW11bHRhbmVvdXMgcmVuZGVyIHRhcmdldHMuIFRoaXMgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3Qgb25lLgorCisJCWNhcHMuU3RyZXRjaFJlY3RGaWx0ZXJDYXBzID0gCUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyByZWN0YW5nbGVzLiBUaGlzIGZpbHRlciB0eXBlIGlzIHJlcXVlc3RlZCBieSBjYWxsaW5nIElEaXJlY3QzRERldmljZTk6OlN0cmV0Y2hSZWN0IHVzaW5nIEQzRFRFWEZfUE9JTlQuIAorCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgcmVjdGFuZ2xlcy4gVGhpcyBmaWx0ZXIgdHlwZSBpcyByZXF1ZXN0ZWQgYnkgY2FsbGluZyBJRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdCB1c2luZyBEM0RURVhGX1BPSU5ULiAKKwkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8CS8vIERldmljZSBzdXBwb3J0cyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHJlY3RhbmdsZXMuIFRoaXMgZmlsdGVyIHR5cGUgaXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcgSURpcmVjdDNERGV2aWNlOTo6U3RyZXRjaFJlY3QgdXNpbmcgRDNEVEVYRl9MSU5FQVIuIAorCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSOwkJLy8gRGV2aWNlIHN1cHBvcnRzIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHJlY3RhbmdsZXMuIFRoaXMgZmlsdGVyIHR5cGUgaXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcgSURpcmVjdDNERGV2aWNlOTo6U3RyZXRjaFJlY3QgdXNpbmcgRDNEVEVYRl9MSU5FQVIuIAorCisJCWNhcHMuVlMyMENhcHMuQ2FwcyA9IHZlcnRleFNoYWRlclByZWRpY2F0aW9uOwkJCQkJCQkJCS8vIEluc3RydWN0aW9uIHByZWRpY2F0aW9uIGlzIHN1cHBvcnRlZC4gU2VlIHNldHBfY29tcC4gCisJCWNhcHMuVlMyMENhcHMuRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSB2ZXJ0ZXhTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aDsJLy8gVGhlIG1heGltdW0gbGV2ZWwgb2YgbmVzdGluZyBvZiBkeW5hbWljIGZsb3cgY29udHJvbCBpbnN0cnVjdGlvbnMgKGJyZWFrLCBicmVha2MsIGlmYykuCisJCWNhcHMuVlMyMENhcHMuTnVtVGVtcHMgPSBEM0RWUzIwX01BWF9OVU1URU1QUzsJCQkJCQkJCQkvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGVtcG9yYXJ5IHJlZ2lzdGVycyBzdXBwb3J0ZWQuCisJCWNhcHMuVlMyMENhcHMuU3RhdGljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFZTMjBfTUFYX1NUQVRJQ0ZMT1dDT05UUk9MREVQVEg7CQkvLyBUaGUgbWF4aW11bSBkZXB0aCBvZiBuZXN0aW5nIG9mIHRoZSBsb29wL3JlcCBhbmQgY2FsbC9jYWxsbnogYm9vbCBpbnN0cnVjdGlvbnMuCisKKwkJY2Fwcy5QUzIwQ2Fwcy5DYXBzID0JcGl4ZWxTaGFkZXJBcmJpdHJhcnlTd2l6emxlIHwJCQkJCQkvLyBBcmJpdHJhcnkgc3dpenpsaW5nIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCXBpeGVsU2hhZGVyR3JhZGllbnRJbnN0cnVjdGlvbnMgfAkJCQkJLy8gR3JhZGllbnQgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuIAorCQkJCQkJCQlwaXhlbFNoYWRlclByZWRpY2F0aW9uIHwJCQkJCQkJLy8gSW5zdHJ1Y3Rpb24gcHJlZGljYXRpb24gaXMgc3VwcG9ydGVkLiBTZWUgc2V0cF9jb21wIC0gcHMuIAorCQkJCQkJCQlwaXhlbFNoYWRlck5vRGVwZW5kZW50UmVhZExpbWl0IHwJCQkJCS8vIFRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgZGVwZW5kZW50IHJlYWRzIHBlciBpbnN0cnVjdGlvbi4gCisJCQkJCQkJCXBpeGVsU2hhZGVyTm9UZXhJbnN0cnVjdGlvbkxpbWl0OwkJCQkJLy8gVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiB0ZXggaW5zdHJ1Y3Rpb25zLiAKKworCQljYXBzLlBTMjBDYXBzLkR5bmFtaWNGbG93Q29udHJvbERlcHRoID0gcGl4ZWxTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aDsJCS8vIFRoZSBtYXhpbXVtIGxldmVsIG9mIG5lc3Rpbmcgb2YgZHluYW1pYyBmbG93IGNvbnRyb2wgaW5zdHJ1Y3Rpb25zIChicmVhaywgYnJlYWtjLCBpZmMpLgorCQljYXBzLlBTMjBDYXBzLk51bUluc3RydWN0aW9uU2xvdHMgPSBEM0RQUzIwX01BWF9OVU1JTlNUUlVDVElPTlNMT1RTOwkJCS8vIFRoZSBkcml2ZXIgd2lsbCBzdXBwb3J0IGF0IG1vc3QgdGhpcyBtYW55IGluc3RydWN0aW9ucy4KKwkJY2Fwcy5QUzIwQ2Fwcy5OdW1UZW1wcyA9IEQzRFBTMjBfTUFYX05VTVRFTVBTOwkJCQkJCQkJCS8vIFRoZSBkcml2ZXIgd2lsbCBzdXBwb3J0IGF0IG1vc3QgdGhpcyBtYW55IHRlbXBvcmFyeSByZWdpc3Rlci4KKwkJY2Fwcy5QUzIwQ2Fwcy5TdGF0aWNGbG93Q29udHJvbERlcHRoID0gcGl4ZWxTaGFkZXJTdGF0aWNGbG93Q29udHJvbERlcHRoOwkJLy8gVGhlIG1heGltdW0gZGVwdGggb2YgbmVzdGluZyBvZiB0aGUgbG9vcC9yZXAgYW5kIGNhbGwvY2FsbG56IGJvb2wgaW5zdHJ1Y3Rpb25zLgorCisJCWNhcHMuVmVydGV4VGV4dHVyZUZpbHRlckNhcHMgPQkJRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBweXJhbWlkYWwgbWFnbmlmeWluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUFlSQU1JREFMUVVBRCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiAKKwkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9BTklTT1RST1BJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiAKKwkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gCisJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQ7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgcG9pbnQtc2FtcGxlIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUjsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCisJCWNhcHMuTWF4VlNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gbWF4aW11bVZlcnRleFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkOwkvLyBNYXhpbXVtIG51bWJlciBvZiB2ZXJ0ZXggc2hhZGVyIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBydW4uCisJCWNhcHMuTWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gbWF4aW11bVBpeGVsU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQ7CS8vIE1heGltdW0gbnVtYmVyIG9mIHBpeGVsIHNoYWRlciBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgcnVuLgorCQljYXBzLk1heFZlcnRleFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IG1heGltdW1WZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHM7CS8vIE1heGltdW0gbnVtYmVyIG9mIHZlcnRleCBzaGFkZXIgaW5zdHJ1Y3Rpb24gc2xvdHMgc3VwcG9ydGVkLiBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzZXQgb24gdGhpcyBjYXAgaXMgMzI3NjguIERldmljZXMgdGhhdCBzdXBwb3J0IHZzXzNfMCBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydCBhdCBsZWFzdCA1MTIgaW5zdHJ1Y3Rpb24gc2xvdHMuCisJCWNhcHMuTWF4UGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSBtYXhpbXVtUGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHM7CS8vIE1heGltdW0gbnVtYmVyIG9mIHBpeGVsIHNoYWRlciBpbnN0cnVjdGlvbiBzbG90cyBzdXBwb3J0ZWQuIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHNldCBvbiB0aGlzIGNhcCBpcyAzMjc2OC4gRGV2aWNlcyB0aGF0IHN1cHBvcnQgcHNfM18wIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IGF0IGxlYXN0IDUxMiBpbnN0cnVjdGlvbiBzbG90cy4KKworCQkqY2FwYWJpbGl0aWVzID0gY2FwczsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0Q5OjpSZWdpc3RlclNvZnR3YXJlRGV2aWNlKHZvaWQgKmluaXRpYWxpemVGdW5jdGlvbikKKwl7CisJCVRSQUNFKCJ2b2lkICppbml0aWFsaXplRnVuY3Rpb24gPSAweCUwLjhwIiwgaW5pdGlhbGl6ZUZ1bmN0aW9uKTsKKworCQlsb2FkU3lzdGVtRDNEOSgpOworCisJCWlmKGQzZDkpCisJCXsKKwkJCXJldHVybiBkM2Q5LT5SZWdpc3RlclNvZnR3YXJlRGV2aWNlKGluaXRpYWxpemVGdW5jdGlvbik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0Q5Ojpsb2FkU3lzdGVtRDNEOSgpCisJeworCQlpZihkM2Q5KQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQljaGFyIGQzZDlQYXRoW01BWF9QQVRIICsgMTZdOworCQlHZXRTeXN0ZW1EaXJlY3RvcnkoZDNkOVBhdGgsIE1BWF9QQVRIKTsKKwkJc3RyY2F0KGQzZDlQYXRoLCAiXFxkM2Q5LmRsbCIpOworCQlkM2Q5TGliID0gTG9hZExpYnJhcnkoZDNkOVBhdGgpOworCisJCWlmKGQzZDlMaWIpCisJCXsKKwkJCXR5cGVkZWYgSURpcmVjdDNEOSogKF9fc3RkY2FsbCAqRElSRUNUM0RDUkVBVEU5KSh1bnNpZ25lZCBpbnQpOworCQkJRElSRUNUM0RDUkVBVEU5IGRpcmVjdDNEQ3JlYXRlOSA9IChESVJFQ1QzRENSRUFURTkpR2V0UHJvY0FkZHJlc3MoZDNkOUxpYiwgIkRpcmVjdDNEQ3JlYXRlOSIpOworCQkJZDNkOSA9IGRpcmVjdDNEQ3JlYXRlOShEM0RfU0RLX1ZFUlNJT04pOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0Q5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEOS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4ZWQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNEOS5ocHAKQEAgLTAsMCArMSw3MyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0Q5X2hwcAorI2RlZmluZSBEM0Q5X0RpcmVjdDNEOV9ocHAKKworI2luY2x1ZGUgIlVua25vd24uaHBwIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxkM2Q5Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJY2xhc3MgRGlyZWN0M0REZXZpY2U5OworCisJY2xhc3MgRGlyZWN0M0Q5IDogcHVibGljIElEaXJlY3QzRDksIHB1YmxpYyBVbmtub3duCisJeworCXB1YmxpYzoKKwkJRGlyZWN0M0Q5KGludCB2ZXJzaW9uLCBjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UpOworCisJCXZpcnR1YWwgfkRpcmVjdDNEOSgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIElEaXJlY3QzRDkgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBSZWdpc3RlclNvZnR3YXJlRGV2aWNlKHZvaWQgKmluaXRpYWxpemVGdW5jdGlvbik7CisJCXVuc2lnbmVkIGludCBfX3N0ZGNhbGwgR2V0QWRhcHRlckNvdW50KCk7CisJCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJJZGVudGlmaWVyKHVuc2lnbmVkIGludCBhZGFwdGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBEM0RBREFQVEVSX0lERU5USUZJRVI5ICppZGVudGlmaWVyKTsKKwkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXRBZGFwdGVyTW9kZUNvdW50KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RGT1JNQVQgZm9ybWF0KTsKKwkJbG9uZyBfX3N0ZGNhbGwgRW51bUFkYXB0ZXJNb2Rlcyh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERk9STUFUIGZvcm1hdCwgdW5zaWduZWQgaW50IGluZGV4LCBEM0RESVNQTEFZTU9ERSAqbW9kZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJEaXNwbGF5TW9kZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERElTUExBWU1PREUgKm1vZGUpOworCQlsb25nIF9fc3RkY2FsbCBDaGVja0RldmljZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgY2hlY2tUeXBlLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCwgRDNERk9STUFUIGJhY2tCdWZmZXJGb3JtYXQsIGludCB3aW5kb3dlZCk7CisJCWxvbmcgX19zdGRjYWxsIENoZWNrRGV2aWNlRm9ybWF0KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgRDNERk9STUFUIGNoZWNrRm9ybWF0KTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQsIGludCB3aW5kb3dlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUsIHVuc2lnbmVkIGxvbmcgKnF1YWxpdHlMZXZlbHMpOworCQlsb25nIF9fc3RkY2FsbCBDaGVja0RlcHRoU3RlbmNpbE1hdGNoKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBEM0RGT1JNQVQgZGVwdGhTdGVuY2lsRm9ybWF0KTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBzb3VyY2VGb3JtYXQsIEQzREZPUk1BVCB0YXJnZXRGb3JtYXQpOworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2VDYXBzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzRENBUFM5ICpjYXBzKTsKKwkJSE1PTklUT1IgX19zdGRjYWxsIEdldEFkYXB0ZXJNb25pdG9yKHVuc2lnbmVkIGludCBhZGFwdGVyKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlRGV2aWNlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNERGV2aWNlOSAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKTsKKworCXByb3RlY3RlZDoKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQljb25zdCBpbnQgdmVyc2lvbjsKKwkJY29uc3QgSElOU1RBTkNFIGluc3RhbmNlOworCisJCS8vIFJlYWwgRDNEOSBsaWJyYXJ5CisJCUhNT0RVTEUgZDNkOUxpYjsKKworCXByaXZhdGU6CisJCXZvaWQgbG9hZFN5c3RlbUQzRDkoKTsKKworCQlERVZNT0RFICpkaXNwbGF5TW9kZTsKKwkJaW50IG51bURpc3BsYXlNb2RlczsKKwkJYm9vbCBkaXNhYmxlQWxwaGFNb2RlOyAgIC8vIERpc2FibGUgQThSOEc4QjggZGlzcGxheSBtb2RlIHN1cHBvcnQKKwkJYm9vbCBkaXNhYmxlMTBCaXRNb2RlOyAgIC8vIERpc2FibGUgQTJSMTBHMTBCMTAgZGlzcGxheSBtb2RlIHN1cHBvcnQKKworCQkvL1JlYWwgSURpcmVjdDNEOSBvYmplY3QKKwkJSURpcmVjdDNEOSAqZDNkOTsKKwl9OworfQorCisjZW5kaWYgICAvLyBEM0Q5X0RpcmVjdDNEOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEOUV4LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEOUV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjUxZWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0Q5RXguY3BwCkBAIC0wLDAgKzEsMzc5IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJEaXJlY3QzRDlFeC5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRERldmljZTlFeC5ocHAiCisjaW5jbHVkZSAiU3dpZnRTaGFkZXIuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJZXh0ZXJuIGJvb2wgcG9zdEJsZW5kU1JHQjsKK30KKworbmFtZXNwYWNlIEQzRDkKK3sKKwlEaXJlY3QzRDlFeDo6RGlyZWN0M0Q5RXgoaW50IHZlcnNpb24sIGNvbnN0IEhJTlNUQU5DRSBpbnN0YW5jZSkgOiBEaXJlY3QzRDkodmVyc2lvbiwgaW5zdGFuY2UpCisJeworCQlkM2Q5ZXggPSAwOworCX0KKworCURpcmVjdDNEOUV4Ojp+RGlyZWN0M0Q5RXgoKQorCXsKKwl9CisKKwlsb25nIERpcmVjdDNEOUV4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCVRSQUNFKCJjb25zdCBJSUQgJmlpZCA9IDB4JTAuOHAsIHZvaWQgKipvYmplY3QgPSAweCUwLjhwIiwgaWlkLCBvYmplY3QpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEOUV4IHx8CisJCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEOSB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCQllbHNlIGlmKGlpZCA9PSBJSURfU3dpZnRTaGFkZXJQcml2YXRlVjEpCisJCXsKKwkJCVN3aWZ0U2hhZGVyICpzd2lmdFNoYWRlciA9IG5ldyBTd2lmdFNoYWRlcih0aGlzKTsKKworCQkJKm9iamVjdCA9IHN3aWZ0U2hhZGVyOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0Q5RXg6OkFkZFJlZigpCisJeworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBEaXJlY3QzRDk6OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0Q5RXg6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlyZXR1cm4gRGlyZWN0M0Q5OjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRDlFeDo6UmVnaXN0ZXJTb2Z0d2FyZURldmljZSh2b2lkICppbml0aWFsaXplRnVuY3Rpb24pCisJeworCQlUUkFDRSgidm9pZCAqaW5pdGlhbGl6ZUZ1bmN0aW9uID0gMHglMC44cCIsIGluaXRpYWxpemVGdW5jdGlvbik7CisKKwkJbG9hZFN5c3RlbUQzRDlleCgpOworCisJCWlmKGQzZDlleCkKKwkJeworCQkJcmV0dXJuIGQzZDlleC0+UmVnaXN0ZXJTb2Z0d2FyZURldmljZShpbml0aWFsaXplRnVuY3Rpb24pOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKwl9CisKKwl1bnNpZ25lZCBpbnQgRGlyZWN0M0Q5RXg6OkdldEFkYXB0ZXJDb3VudCgpCisJeworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBEaXJlY3QzRDk6OkdldEFkYXB0ZXJDb3VudCgpOworCX0KKworCWxvbmcgRGlyZWN0M0Q5RXg6OkdldEFkYXB0ZXJJZGVudGlmaWVyKHVuc2lnbmVkIGludCBhZGFwdGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBEM0RBREFQVEVSX0lERU5USUZJRVI5ICppZGVudGlmaWVyKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAweCUwLjhYLCBEM0RBREFQVEVSX0lERU5USUZJRVI5ICppZGVudGlmaWVyID0gMHglMC44cCIsIGFkYXB0ZXIsIGZsYWdzLCBpZGVudGlmaWVyKTsKKworCQlyZXR1cm4gRGlyZWN0M0Q5OjpHZXRBZGFwdGVySWRlbnRpZmllcihhZGFwdGVyLCBmbGFncywgaWRlbnRpZmllcik7CisJfQorCisJdW5zaWduZWQgaW50IERpcmVjdDNEOUV4OjpHZXRBZGFwdGVyTW9kZUNvdW50KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RGT1JNQVQgZm9ybWF0KQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGZvcm1hdCk7CisKKwkJcmV0dXJuIERpcmVjdDNEOTo6R2V0QWRhcHRlck1vZGVDb3VudChhZGFwdGVyLCBmb3JtYXQpOworCX0KKworCWxvbmcgRGlyZWN0M0Q5RXg6OkVudW1BZGFwdGVyTW9kZXModW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzREZPUk1BVCBmb3JtYXQsIHVuc2lnbmVkIGludCBpbmRleCwgRDNERElTUExBWU1PREUgKm1vZGUpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCB1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgRDNERElTUExBWU1PREUgKm1vZGUgPSAweCUwLjhwIiwgYWRhcHRlciwgZm9ybWF0LCBpbmRleCwgbW9kZSk7CisKKwkJcmV0dXJuIERpcmVjdDNEOTo6RW51bUFkYXB0ZXJNb2RlcyhhZGFwdGVyLCBmb3JtYXQsIGluZGV4LCBtb2RlKTsKKwl9CisKKwlsb25nIERpcmVjdDNEOUV4OjpHZXRBZGFwdGVyRGlzcGxheU1vZGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERJU1BMQVlNT0RFICptb2RlKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERJU1BMQVlNT0RFICptb2RlID0gMHglMC44cCIsIGFkYXB0ZXIsIG1vZGUpOworCisJCXJldHVybiBEaXJlY3QzRDk6OkdldEFkYXB0ZXJEaXNwbGF5TW9kZShhZGFwdGVyLCBtb2RlKTsKKwl9CisKKwlsb25nIERpcmVjdDNEOUV4OjpDaGVja0RldmljZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgY2hlY2tUeXBlLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCwgRDNERk9STUFUIGJhY2tCdWZmZXJGb3JtYXQsIGludCB3aW5kb3dlZCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGNoZWNrVHlwZSA9ICVkLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCA9ICVkLCBEM0RGT1JNQVQgYmFja0J1ZmZlckZvcm1hdCA9ICVkLCBpbnQgd2luZG93ZWQgPSAlZCIsIGFkYXB0ZXIsIGNoZWNrVHlwZSwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOworCisJCWlmKGNoZWNrVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKKwkJeworCQkJbG9hZFN5c3RlbUQzRDlleCgpOworCisJCQlpZihkM2Q5ZXgpCisJCQl7CisJCQkJcmV0dXJuIGQzZDlleC0+Q2hlY2tEZXZpY2VUeXBlKGFkYXB0ZXIsIGNoZWNrVHlwZSwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBDaGVja0RldmljZVR5cGUoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGRpc3BsYXlGb3JtYXQsIGJhY2tCdWZmZXJGb3JtYXQsIHdpbmRvd2VkKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBEaXJlY3QzRDk6OkNoZWNrRGV2aWNlVHlwZShhZGFwdGVyLCBjaGVja1R5cGUsIGRpc3BsYXlGb3JtYXQsIGJhY2tCdWZmZXJGb3JtYXQsIHdpbmRvd2VkKTsKKwl9CisKKwlsb25nIERpcmVjdDNEOUV4OjpDaGVja0RldmljZUZvcm1hdCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNEUkVTT1VSQ0VUWVBFIHJlc291cmNlVHlwZSwgRDNERk9STUFUIGNoZWNrRm9ybWF0KQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCA9ICVkLCB1bnNpZ25lZCBsb25nIHVzYWdlID0gJWQsIEQzRFJFU09VUkNFVFlQRSByZXNvdXJjZVR5cGUgPSAlZCwgRDNERk9STUFUIGNoZWNrRm9ybWF0ID0gJWQiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBhZGFwdGVyRm9ybWF0LCB1c2FnZSwgcmVzb3VyY2VUeXBlLCBjaGVja0Zvcm1hdCk7CisKKwkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKKwkJeworCQkJbG9hZFN5c3RlbUQzRDlleCgpOworCisJCQlpZihkM2Q5ZXgpCisJCQl7CisJCQkJcmV0dXJuIGQzZDlleC0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBDaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOworCX0KKworCWxvbmcgRGlyZWN0M0Q5RXg6OkNoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBzdXJmYWNlRm9ybWF0LCBpbnQgd2luZG93ZWQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGVUeXBlLCB1bnNpZ25lZCBsb25nICpxdWFsaXR5TGV2ZWxzKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgc3VyZmFjZUZvcm1hdCA9ICVkLCBpbnQgd2luZG93ZWQgPSAlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUgPSAlZCwgdW5zaWduZWQgbG9uZyAqcXVhbGl0eUxldmVscyA9IDB4JTAuOHAiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBzdXJmYWNlRm9ybWF0LCB3aW5kb3dlZCwgbXVsdGlTYW1wbGVUeXBlLCBxdWFsaXR5TGV2ZWxzKTsKKworCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQorCQl7CisJCQlsb2FkU3lzdGVtRDNEOWV4KCk7CisKKwkJCWlmKGQzZDlleCkKKwkJCXsKKwkJCQlyZXR1cm4gZDNkOWV4LT5DaGVja0RldmljZU11bHRpU2FtcGxlVHlwZShhZGFwdGVyLCBkZXZpY2VUeXBlLCBzdXJmYWNlRm9ybWF0LCB3aW5kb3dlZCwgbXVsdGlTYW1wbGVUeXBlLCBxdWFsaXR5TGV2ZWxzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIHN1cmZhY2VGb3JtYXQsIHdpbmRvd2VkLCBtdWx0aVNhbXBsZVR5cGUsIHF1YWxpdHlMZXZlbHMpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoYWRhcHRlciwgZGV2aWNlVHlwZSwgc3VyZmFjZUZvcm1hdCwgd2luZG93ZWQsIG11bHRpU2FtcGxlVHlwZSwgcXVhbGl0eUxldmVscyk7CisJfQorCisJbG9uZyBEaXJlY3QzRDlFeDo6Q2hlY2tEZXB0aFN0ZW5jaWxNYXRjaCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCwgRDNERk9STUFUIHJlbmRlclRhcmdldEZvcm1hdCwgRDNERk9STUFUIGRlcHRoU3RlbmNpbEZvcm1hdCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQgPSAlZCwgRDNERk9STUFUIHJlbmRlclRhcmdldEZvcm1hdCA9ICVkLCBEM0RGT1JNQVQgZGVwdGhTdGVuY2lsRm9ybWF0ID0gJWQiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBhZGFwdGVyRm9ybWF0LCByZW5kZXJUYXJnZXRGb3JtYXQsIGRlcHRoU3RlbmNpbEZvcm1hdCk7CisKKwkJcmV0dXJuIERpcmVjdDNEOTo6Q2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChhZGFwdGVyLCBkZXZpY2VUeXBlLCBhZGFwdGVyRm9ybWF0LCByZW5kZXJUYXJnZXRGb3JtYXQsIGRlcHRoU3RlbmNpbEZvcm1hdCk7CisJfQorCisJbG9uZyBEaXJlY3QzRDlFeDo6Q2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBzb3VyY2VGb3JtYXQsIEQzREZPUk1BVCB0YXJnZXRGb3JtYXQpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBzb3VyY2VGb3JtYXQgPSAlZCwgRDNERk9STUFUIHRhcmdldEZvcm1hdCA9ICVkIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgc291cmNlRm9ybWF0LCB0YXJnZXRGb3JtYXQpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q5ZXgoKTsKKworCQkJaWYoZDNkOWV4KQorCQkJeworCQkJCXJldHVybiBkM2Q5ZXgtPkNoZWNrRGV2aWNlRm9ybWF0Q29udmVyc2lvbihhZGFwdGVyLCBkZXZpY2VUeXBlLCBzb3VyY2VGb3JtYXQsIHRhcmdldEZvcm1hdCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIENoZWNrRGV2aWNlRm9ybWF0Q29udmVyc2lvbihhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgc291cmNlRm9ybWF0LCB0YXJnZXRGb3JtYXQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEOUV4OjpHZXREZXZpY2VDYXBzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzRENBUFM5ICpjYXBhYmlsaXRpZXMpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzRENBUFM5ICpjYXBhYmlsaXRpZXMgPSAweCUwLjhwIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgY2FwYWJpbGl0aWVzKTsKKworCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQorCQl7CisJCQlsb2FkU3lzdGVtRDNEOWV4KCk7CisKKwkJCWlmKGQzZDlleCkKKwkJCXsKKwkJCQlyZXR1cm4gZDNkOWV4LT5HZXREZXZpY2VDYXBzKGFkYXB0ZXIsIGRldmljZVR5cGUsIGNhcGFiaWxpdGllcyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEdldERldmljZUNhcHMoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGNhcGFiaWxpdGllcyk7CisJCQl9CisJCX0KKworCQlsb25nIHJlc3VsdCA9IERpcmVjdDNEOTo6R2V0RGV2aWNlQ2FwcyhhZGFwdGVyLCBkZXZpY2VUeXBlLCBjYXBhYmlsaXRpZXMpOworCisJCWlmKHN3Ojpwb3N0QmxlbmRTUkdCKQorCQl7CisJCQljYXBhYmlsaXRpZXMtPlByaW1pdGl2ZU1pc2NDYXBzIHw9IEQzRFBNSVNDQ0FQU19QT1NUQkxFTkRTUkdCQ09OVkVSVDsgICAvLyBJbmRpY2F0ZXMgZGV2aWNlIGNhbiBwZXJmb3JtIGNvbnZlcnNpb24gdG8gc1JHQiBhZnRlciBibGVuZGluZy4JCisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUhNT05JVE9SIERpcmVjdDNEOUV4OjpHZXRBZGFwdGVyTW9uaXRvcih1bnNpZ25lZCBpbnQgYWRhcHRlcikKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkIiwgYWRhcHRlcik7CisKKwkJcmV0dXJuIERpcmVjdDNEOTo6R2V0QWRhcHRlck1vbml0b3IoYWRhcHRlcik7CisJfQorCisJbG9uZyBEaXJlY3QzRDlFeDo6Q3JlYXRlRGV2aWNlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNERGV2aWNlOSAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBIV05EIGZvY3VzV2luZG93ID0gJWQsIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncyA9IDB4JTAuOFgsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMgPSAweCUwLjhwLCBJRGlyZWN0M0REZXZpY2U5ICoqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UgPSAweCUwLjhwIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7CisKKwkJaWYoIWZvY3VzV2luZG93IHx8ICFwcmVzZW50UGFyYW1ldGVycyB8fCAhcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCisJCXsKKwkJCSpyZXR1cm5lZERldmljZUludGVyZmFjZSA9IDA7CisKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJRDNERElTUExBWU1PREVFWCBmdWxsc2NyZWVuRGlzcGxheU1vZGUgPSB7MH07CisJCWZ1bGxzY3JlZW5EaXNwbGF5TW9kZS5TaXplID0gc2l6ZW9mKEQzRERJU1BMQVlNT0RFRVgpOworCQlmdWxsc2NyZWVuRGlzcGxheU1vZGUuRm9ybWF0ID0gcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJGb3JtYXQ7CisJCWZ1bGxzY3JlZW5EaXNwbGF5TW9kZS5XaWR0aCA9IHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyV2lkdGg7CisJCWZ1bGxzY3JlZW5EaXNwbGF5TW9kZS5IZWlnaHQgPSBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckhlaWdodDsKKwkJZnVsbHNjcmVlbkRpc3BsYXlNb2RlLlJlZnJlc2hSYXRlID0gcHJlc2VudFBhcmFtZXRlcnMtPkZ1bGxTY3JlZW5fUmVmcmVzaFJhdGVJbkh6OworCQlmdWxsc2NyZWVuRGlzcGxheU1vZGUuU2NhbkxpbmVPcmRlcmluZyA9IEQzRFNDQU5MSU5FT1JERVJJTkdfUFJPR1JFU1NJVkU7CisKKwkJcmV0dXJuIENyZWF0ZURldmljZUV4KGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgcHJlc2VudFBhcmFtZXRlcnMtPldpbmRvd2VkID8gMCA6ICZmdWxsc2NyZWVuRGlzcGxheU1vZGUsIChJRGlyZWN0M0REZXZpY2U5RXgqKilyZXR1cm5lZERldmljZUludGVyZmFjZSk7CisJfQorCisJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBEaXJlY3QzRDlFeDo6R2V0QWRhcHRlck1vZGVDb3VudEV4KHVuc2lnbmVkIGludCBhZGFwdGVyLCBjb25zdCBEM0RESVNQTEFZTU9ERUZJTFRFUiAqZmlsdGVyKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIGNvbnN0IEQzRERJU1BMQVlNT0RFRklMVEVSICpmaWx0ZXIgPSAweCUwLjhwIiwgYWRhcHRlciwgZmlsdGVyKTsKKworCQlyZXR1cm4gRGlyZWN0M0Q5OjpHZXRBZGFwdGVyTW9kZUNvdW50KGFkYXB0ZXIsIGZpbHRlci0+Rm9ybWF0KTsgICAvLyBGSVhNRQorCX0KKwkKKwlsb25nIF9fc3RkY2FsbCBEaXJlY3QzRDlFeDo6RW51bUFkYXB0ZXJNb2Rlc0V4KHVuc2lnbmVkIGludCBhZGFwdGVyLCBjb25zdCBEM0RESVNQTEFZTU9ERUZJTFRFUiAqZmlsdGVyLCB1bnNpZ25lZCBpbnQgaW5kZXgsIEQzRERJU1BMQVlNT0RFRVggKm1vZGVFeCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBjb25zdCBEM0RESVNQTEFZTU9ERUZJTFRFUiAqZmlsdGVyID0gMHglMC44cCwgdW5zaWduZWQgaW50IGluZGV4ID0gJWQsIEQzRERJU1BMQVlNT0RFRVggKm1vZGVFeCA9IDB4JTAuOHAiLCBhZGFwdGVyLCBmaWx0ZXIsIGluZGV4LCBtb2RlRXgpOworCisJCUQzRERJU1BMQVlNT0RFIG1vZGU7CisKKwkJbW9kZS5Gb3JtYXQgPSBtb2RlRXgtPkZvcm1hdDsKKwkJbW9kZS5XaWR0aCA9IG1vZGVFeC0+V2lkdGg7CisJCW1vZGUuSGVpZ2h0ID0gbW9kZUV4LT5IZWlnaHQ7CisJCW1vZGUuUmVmcmVzaFJhdGUgPSBtb2RlRXgtPlJlZnJlc2hSYXRlOworCisJCXJldHVybiBEaXJlY3QzRDk6OkVudW1BZGFwdGVyTW9kZXMoYWRhcHRlciwgZmlsdGVyLT5Gb3JtYXQsIGluZGV4LCAmbW9kZSk7ICAgLy8gRklYTUUKKwl9CisKKwlsb25nIF9fc3RkY2FsbCBEaXJlY3QzRDlFeDo6R2V0QWRhcHRlckRpc3BsYXlNb2RlRXgodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERJU1BMQVlNT0RFRVggKm1vZGVFeCwgRDNERElTUExBWVJPVEFUSU9OICpyb3RhdGlvbikKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RESVNQTEFZTU9ERUVYICptb2RlRXggPSAweCUwLjhwLCBEM0RESVNQTEFZUk9UQVRJT04gKnJvdGF0aW9uID0gMHglMC44cCIsIGFkYXB0ZXIsIG1vZGVFeCwgcm90YXRpb24pOworCisJCUQzRERJU1BMQVlNT0RFIG1vZGU7CisKKwkJbW9kZS5Gb3JtYXQgPSBtb2RlRXgtPkZvcm1hdDsKKwkJbW9kZS5XaWR0aCA9IG1vZGVFeC0+V2lkdGg7CisJCW1vZGUuSGVpZ2h0ID0gbW9kZUV4LT5IZWlnaHQ7CisJCW1vZGUuUmVmcmVzaFJhdGUgPSBtb2RlRXgtPlJlZnJlc2hSYXRlOworCisJCXJldHVybiBHZXRBZGFwdGVyRGlzcGxheU1vZGUoYWRhcHRlciwgJm1vZGUpOyAgIC8vIEZJWE1FCisJfQorCisJbG9uZyBfX3N0ZGNhbGwgRGlyZWN0M0Q5RXg6OkNyZWF0ZURldmljZUV4KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIERXT1JEIGJlaGF2aW9yRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIEQzRERJU1BMQVlNT0RFRVggKmZ1bGxzY3JlZW5EaXNwbGF5TW9kZSwgSURpcmVjdDNERGV2aWNlOUV4ICoqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEhXTkQgZm9jdXNXaW5kb3cgPSAlZCwgRFdPUkQgYmVoYXZpb3JGbGFncyA9IDB4JTAuOFgsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMgPSAweCUwLjhwLCBEM0RESVNQTEFZTU9ERUVYICpmdWxsc2NyZWVuRGlzcGxheU1vZGUgPSAweCUwLjhwLCBJRGlyZWN0M0REZXZpY2U5RXggKipyZXR1cm5lZERldmljZUludGVyZmFjZSA9IDB4JTAuOHAiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBmb2N1c1dpbmRvdywgYmVoYXZpb3JGbGFncywgcHJlc2VudFBhcmFtZXRlcnMsIGZ1bGxzY3JlZW5EaXNwbGF5TW9kZSwgcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q5ZXgoKTsKKworCQkJaWYoZDNkOWV4KQorCQkJeworCQkJCXJldHVybiBkM2Q5ZXgtPkNyZWF0ZURldmljZUV4KGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgZnVsbHNjcmVlbkRpc3BsYXlNb2RlLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQ3JlYXRlRGV2aWNlRXgoYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCBmdWxsc2NyZWVuRGlzcGxheU1vZGUsIHJldHVybmVkRGV2aWNlSW50ZXJmYWNlKTsKKwkJCX0KKwkJfQorCisJCWlmKCFmb2N1c1dpbmRvdyB8fCAhcHJlc2VudFBhcmFtZXRlcnMgfHwgIXJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQorCQl7CisJCQkqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UgPSAwOworCisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpyZXR1cm5lZERldmljZUludGVyZmFjZSA9IG5ldyBEaXJlY3QzRERldmljZTlFeChpbnN0YW5jZSwgdGhpcywgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzKTsKKworCQlpZigqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCisJCXsKKwkJCSgqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpLT5BZGRSZWYoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBfX3N0ZGNhbGwgRGlyZWN0M0Q5RXg6OkdldEFkYXB0ZXJMVUlEKHVuc2lnbmVkIGludCBhZGFwdGVyLCBMVUlEICpsdWlkKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIExVSUQgKmx1aWQgPSAweCUwLjhwIiwgYWRhcHRlciwgbHVpZCk7CisKKwkJaWYoYWRhcHRlciAhPSBEM0RBREFQVEVSX0RFRkFVTFQpCisJCXsKKwkJCVVOSU1QTEVNRU5URUQoKTsKKwkJfQorCisJCS8vIEZJWE1FOiBTaG91bGQgcmV0dXJuIGEgcHJlc2lzdGVudCBpZCB1c2luZyBBbGxvY2F0ZUxvY2FsbHlVbmlxdWVJZCgpCisJCWx1aWQtPkxvd1BhcnQgPSAweDAwMDAwMDE7CisJCWx1aWQtPkhpZ2hQYXJ0ID0gMHgwMDAwMDAwOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJdm9pZCBEaXJlY3QzRDlFeDo6bG9hZFN5c3RlbUQzRDlleCgpCisJeworCQlpZihkM2Q5ZXgpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCWNoYXIgZDNkOVBhdGhbTUFYX1BBVEggKyAxNl07CisJCUdldFN5c3RlbURpcmVjdG9yeShkM2Q5UGF0aCwgTUFYX1BBVEgpOworCQlzdHJjYXQoZDNkOVBhdGgsICJcXGQzZDkuZGxsIik7CisJCWQzZDlMaWIgPSBMb2FkTGlicmFyeShkM2Q5UGF0aCk7CisKKwkJaWYoZDNkOUxpYikKKwkJeworCQkJdHlwZWRlZiBJRGlyZWN0M0Q5RXgqIChfX3N0ZGNhbGwgKkRJUkVDVDNEQ1JFQVRFOUVYKSh1bnNpZ25lZCBpbnQsIElEaXJlY3QzRDlFeCoqKTsKKwkJCURJUkVDVDNEQ1JFQVRFOUVYIGRpcmVjdDNEQ3JlYXRlOUV4ID0gKERJUkVDVDNEQ1JFQVRFOUVYKUdldFByb2NBZGRyZXNzKGQzZDlMaWIsICJEaXJlY3QzRENyZWF0ZTlFeCIpOworCQkJZGlyZWN0M0RDcmVhdGU5RXgoRDNEX1NES19WRVJTSU9OLCAmZDNkOWV4KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEOUV4LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEOUV4LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmM3MzAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0Q5RXguaHBwCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIEQzRDlfRGlyZWN0M0Q5RXhfaHBwDQorI2RlZmluZSBEM0Q5X0RpcmVjdDNEOUV4X2hwcA0KKw0KKyNpbmNsdWRlICJEaXJlY3QzRDkuaHBwIg0KKw0KKy8vI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPGQzZDkuaD4NCisNCituYW1lc3BhY2UgRDNEOQ0KK3sNCisJY2xhc3MgRGlyZWN0M0REZXZpY2U5Ow0KKw0KKwljbGFzcyBEaXJlY3QzRDlFeCA6IHB1YmxpYyBJRGlyZWN0M0Q5RXgsIHB1YmxpYyBEaXJlY3QzRDkNCisJew0KKwlwdWJsaWM6DQorCQlEaXJlY3QzRDlFeChpbnQgdmVyc2lvbiwgY29uc3QgSElOU1RBTkNFIGluc3RhbmNlKTsNCisNCisJCXZpcnR1YWwgfkRpcmVjdDNEOUV4KCk7DQorDQorCQkvLyBJVW5rbm93biBtZXRob2RzDQorCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7DQorCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsNCisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsNCisNCisJCS8vIElEaXJlY3QzRDkgbWV0aG9kcw0KKwkJbG9uZyBfX3N0ZGNhbGwgUmVnaXN0ZXJTb2Z0d2FyZURldmljZSh2b2lkICppbml0aWFsaXplRnVuY3Rpb24pOw0KKwkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXRBZGFwdGVyQ291bnQoKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJJZGVudGlmaWVyKHVuc2lnbmVkIGludCBhZGFwdGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBEM0RBREFQVEVSX0lERU5USUZJRVI5ICppZGVudGlmaWVyKTsNCisJCXVuc2lnbmVkIGludCBfX3N0ZGNhbGwgR2V0QWRhcHRlck1vZGVDb3VudCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERk9STUFUIGZvcm1hdCk7DQorCQlsb25nIF9fc3RkY2FsbCBFbnVtQWRhcHRlck1vZGVzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RGT1JNQVQgZm9ybWF0LCB1bnNpZ25lZCBpbnQgaW5kZXgsIEQzRERJU1BMQVlNT0RFICptb2RlKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJEaXNwbGF5TW9kZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERElTUExBWU1PREUgKm1vZGUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VUeXBlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGNoZWNrVHlwZSwgRDNERk9STUFUIGRpc3BsYXlGb3JtYXQsIEQzREZPUk1BVCBiYWNrQnVmZmVyRm9ybWF0LCBpbnQgd2luZG93ZWQpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VGb3JtYXQodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzRFJFU09VUkNFVFlQRSB0eXBlLCBEM0RGT1JNQVQgY2hlY2tGb3JtYXQpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQsIGludCB3aW5kb3dlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUsIHVuc2lnbmVkIGxvbmcgKnF1YWxpdHlMZXZlbHMpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCwgRDNERk9STUFUIHJlbmRlclRhcmdldEZvcm1hdCwgRDNERk9STUFUIGRlcHRoU3RlbmNpbEZvcm1hdCk7DQorCQlsb25nIF9fc3RkY2FsbCBDaGVja0RldmljZUZvcm1hdENvbnZlcnNpb24odW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHNvdXJjZUZvcm1hdCwgRDNERk9STUFUIHRhcmdldEZvcm1hdCk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2VDYXBzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzRENBUFM5ICpjYXBzKTsNCisJCUhNT05JVE9SIF9fc3RkY2FsbCBHZXRBZGFwdGVyTW9uaXRvcih1bnNpZ25lZCBpbnQgYWRhcHRlcik7DQorCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVEZXZpY2UodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgSFdORCBmb2N1c1dpbmRvdywgdW5zaWduZWQgbG9uZyBiZWhhdmlvckZsYWdzLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzLCBJRGlyZWN0M0REZXZpY2U5ICoqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOw0KKw0KKwkJLy8gSURpcmVjdDNEOUV4IG1ldGhvZHMNCisJCXVuc2lnbmVkIGludCBfX3N0ZGNhbGwgR2V0QWRhcHRlck1vZGVDb3VudEV4KHVuc2lnbmVkIGludCBhZGFwdGVyLCBjb25zdCBEM0RESVNQTEFZTU9ERUZJTFRFUiAqZmlsdGVyKTsNCisJCWxvbmcgX19zdGRjYWxsIEVudW1BZGFwdGVyTW9kZXNFeCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgY29uc3QgRDNERElTUExBWU1PREVGSUxURVIgKmZpbHRlciwgdW5zaWduZWQgaW50IGluZGV4LCBEM0RESVNQTEFZTU9ERUVYICptb2RlKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJEaXNwbGF5TW9kZUV4KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERUVYICptb2RlLCBEM0RESVNQTEFZUk9UQVRJT04gKnJvdGF0aW9uKTsNCisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZURldmljZUV4KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIERXT1JEIGJlaGF2aW9yRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIEQzRERJU1BMQVlNT0RFRVggKmZ1bGxzY3JlZW5EaXNwbGF5TW9kZSwgSURpcmVjdDNERGV2aWNlOUV4ICoqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0QWRhcHRlckxVSUQodW5zaWduZWQgaW50IGFkYXB0ZXIsIExVSUQgKmx1aWQpOw0KKw0KKwlwcml2YXRlOg0KKwkJdm9pZCBsb2FkU3lzdGVtRDNEOWV4KCk7DQorDQorCQkvLyBSZWFsIElEaXJlY3QzRDlFeCBvYmplY3QNCisJCUlEaXJlY3QzRDlFeCAqZDNkOWV4Ow0KKwl9Ow0KK30NCisNCisjZW5kaWYgICAvLyBEM0Q5X0RpcmVjdDNEOUV4X2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEQmFzZVRleHR1cmU5LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEQmFzZVRleHR1cmU5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI5NzliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RCYXNlVGV4dHVyZTkuY3BwCkBAIC0wLDAgKzEsMjUyIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJEaXJlY3QzREJhc2VUZXh0dXJlOS5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgorI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIEQzRDkKK3sKKwlEaXJlY3QzREJhc2VUZXh0dXJlOTo6RGlyZWN0M0RCYXNlVGV4dHVyZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFJFU09VUkNFVFlQRSB0eXBlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIHVuc2lnbmVkIGxvbmcgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlKSA6IERpcmVjdDNEUmVzb3VyY2U5KGRldmljZSwgdHlwZSwgcG9vbCwgMCksIGZvcm1hdChmb3JtYXQpLCBsZXZlbHMobGV2ZWxzKSwgdXNhZ2UodXNhZ2UpCisJeworCQlmaWx0ZXJUeXBlID0gRDNEVEVYRl9MSU5FQVI7CisJCUxPRCA9IDA7CisKKwkJcmVzb3VyY2UgPSBuZXcgc3c6OlJlc291cmNlKDApOworCX0KKworCURpcmVjdDNEQmFzZVRleHR1cmU5Ojp+RGlyZWN0M0RCYXNlVGV4dHVyZTkoKQorCXsKKwkJcmVzb3VyY2UtPmRlc3RydWN0KCk7CisJfQorCQorCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEQmFzZVRleHR1cmU5IHx8CisJCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U5IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6UmVsZWFzZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOworCX0KKworCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEQmFzZVRleHR1cmU5OjpQcmVMb2FkKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlEaXJlY3QzRFJlc291cmNlOTo6UHJlTG9hZCgpOworCX0KKworCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzLT5kZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldERldmljZShkZXZpY2UpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpTZXRQcmlvcml0eShuZXdQcmlvcml0eSk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0UHJpb3JpdHkoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0UHJpb3JpdHkoKTsKKwl9CisKKwlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFR5cGUoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0VHlwZSgpOworCX0KKworCUQzRFRFWFRVUkVGSUxURVJUWVBFIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRBdXRvR2VuRmlsdGVyVHlwZSgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYodXNhZ2UgJiBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQKQorCQl7CisJCQlyZXR1cm4gZmlsdGVyVHlwZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiBEM0RURVhGX05PTkU7CisJCX0KKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRMZXZlbENvdW50KCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZih1c2FnZSAmIEQzRFVTQUdFX0FVVE9HRU5NSVBNQVApCisJCXsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcmV0dXJuIGxldmVsczsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRMT0QoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKHBvb2wgJiBEM0RQT09MX01BTkFHRUQpCisJCXsKKwkJCXJldHVybiBMT0Q7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldEF1dG9HZW5GaWx0ZXJUeXBlKEQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlclR5cGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYodXNhZ2UgJiBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQKQorCQl7CisJCQl0aGlzLT5maWx0ZXJUeXBlID0gZmlsdGVyVHlwZTsgICAvLyBGSVhNRTogQ2hlY2sgaWYgdmFsaWQKKwkJCS8vIEZJWE1FOiBEaXJ0eSB0aGUgbWlwbWFwIGNoYWluCisKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gRDNEVEVYRl9OT05FOworCQl9CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6U2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXVuc2lnbmVkIGxvbmcgb2xkTE9EID0gTE9EOworCQlMT0QgPSBuZXdMT0QgPCBsZXZlbHMgPyBuZXdMT0QgOiBsZXZlbHMgLSAxOworCisJCWlmKHBvb2wgJiBEM0RQT09MX01BTkFHRUQpCisJCXsKKwkJCXJldHVybiBvbGRMT0Q7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdlbmVyYXRlTWlwU3ViTGV2ZWxzKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKwl9CisKKwlzdzo6UmVzb3VyY2UgKkRpcmVjdDNEQmFzZVRleHR1cmU5OjpnZXRSZXNvdXJjZSgpIGNvbnN0CisJeworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6Z2V0SW50ZXJuYWxMZXZlbENvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiBsZXZlbHM7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6Z2V0VXNhZ2UoKSBjb25zdAorCXsKKwkJcmV0dXJuIHVzYWdlOworCX0KKworCUQzREZPUk1BVCBEaXJlY3QzREJhc2VUZXh0dXJlOTo6Z2V0Rm9ybWF0KCkgY29uc3QKKwl7CisJCXJldHVybiBmb3JtYXQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzg1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzREJhc2VUZXh0dXJlOS5ocHAKQEAgLTAsMCArMSw3NiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0RCYXNlVGV4dHVyZTlfaHBwCisjZGVmaW5lIEQzRDlfRGlyZWN0M0RCYXNlVGV4dHVyZTlfaHBwCisKKyNpbmNsdWRlICJEaXJlY3QzRFJlc291cmNlOS5ocHAiCisKKyNpbmNsdWRlIDxkM2Q5Lmg+CisKK25hbWVzcGFjZSBzdworeworCWNsYXNzIFJlc291cmNlOworfQorCituYW1lc3BhY2UgRDNEOQoreworCWNsYXNzIERpcmVjdDNEQmFzZVRleHR1cmU5IDogcHVibGljIElEaXJlY3QzREJhc2VUZXh0dXJlOSwgcHVibGljIERpcmVjdDNEUmVzb3VyY2U5CisJeworCXB1YmxpYzoKKwkJRGlyZWN0M0RCYXNlVGV4dHVyZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFJFU09VUkNFVFlQRSB0eXBlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIHVuc2lnbmVkIGxvbmcgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzREJhc2VUZXh0dXJlOSgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIElEaXJlY3QzRFJlc291cmNlOSBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CisJCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldFByaW9yaXR5KCk7CisJCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKTsKKwkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCk7CisKKwkJLy8gSURpcmVjdDNEQmFzZVRleHR1cmU5IG1ldGhvZHMKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TE9EKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldExldmVsQ291bnQoKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0QXV0b0dlbkZpbHRlclR5cGUoRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyVHlwZSk7CisJCUQzRFRFWFRVUkVGSUxURVJUWVBFIF9fc3RkY2FsbCBHZXRBdXRvR2VuRmlsdGVyVHlwZSgpOworCQl2b2lkIF9fc3RkY2FsbCBHZW5lcmF0ZU1pcFN1YkxldmVscygpOworCisJCS8vIEludGVuYWwgbWV0aG9kcworCQlzdzo6UmVzb3VyY2UgKmdldFJlc291cmNlKCkgY29uc3Q7CisJCXVuc2lnbmVkIGxvbmcgZ2V0SW50ZXJuYWxMZXZlbENvdW50KCkgY29uc3Q7CisJCXVuc2lnbmVkIGxvbmcgZ2V0VXNhZ2UoKSBjb25zdDsKKwkJRDNERk9STUFUIGdldEZvcm1hdCgpIGNvbnN0OworCisJcHJvdGVjdGVkOgorCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCXVuc2lnbmVkIGxvbmcgbGV2ZWxzOyAgIC8vIFJlY2FsY3VsYXRlZCB3aGVuIDAKKwkJY29uc3QgdW5zaWduZWQgbG9uZyB1c2FnZTsKKwkJY29uc3QgRDNERk9STUFUIGZvcm1hdDsKKworCQlzdzo6UmVzb3VyY2UgKnJlc291cmNlOworCisJcHJpdmF0ZToKKwkJRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyVHlwZTsKKwkJdW5zaWduZWQgbG9uZyBMT0Q7CisJfTsKK30KKworI2VuZGlmIC8vIEQzRDlfRGlyZWN0M0RCYXNlVGV4dHVyZTlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzREN1YmVUZXh0dXJlOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzREN1YmVUZXh0dXJlOS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyMDk1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNEQ3ViZVRleHR1cmU5LmNwcApAQCAtMCwwICsxLDMzMiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiRGlyZWN0M0RDdWJlVGV4dHVyZTkuaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U5LmhwcCIKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJRGlyZWN0M0RDdWJlVGV4dHVyZTk6OkRpcmVjdDNEQ3ViZVRleHR1cmU5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKSA6IERpcmVjdDNEQmFzZVRleHR1cmU5KGRldmljZSwgRDNEUlRZUEVfQ1VCRVRFWFRVUkUsIGZvcm1hdCwgcG9vbCwgbGV2ZWxzLCB1c2FnZSksIGVkZ2VMZW5ndGgoZWRnZUxlbmd0aCkKKwl7CisJCWlmKGxldmVscyA9PSAwKQorCQl7CisJCQl0aGlzLT5sZXZlbHMgPSBzdzo6bG9nMihzdzo6bWF4KChpbnQpZWRnZUxlbmd0aCwgMSkpICsgMTsKKwkJfQorCisJCWZvcih1bnNpZ25lZCBpbnQgZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspCisJCXsKKwkJCWludCB3aWR0aCA9IGVkZ2VMZW5ndGg7CisJCQlpbnQgaGVpZ2h0ID0gZWRnZUxlbmd0aDsKKworCQkJZm9yKHVuc2lnbmVkIGludCBsZXZlbCA9IDA7IGxldmVsIDwgTUlQTUFQX0xFVkVMUzsgbGV2ZWwrKykKKwkJCXsKKwkJCQlpZihsZXZlbCA8IHRoaXMtPmxldmVscykKKwkJCQl7CQkJCQkKKwkJCQkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSA9IG5ldyBEaXJlY3QzRFN1cmZhY2U5KGRldmljZSwgdGhpcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBwb29sLCBEM0RNVUxUSVNBTVBMRV9OT05FLCAwLCBmYWxzZSwgdXNhZ2UpOworCQkJCQlzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdLT5iaW5kKCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0gPSAwOworCQkJCX0KKworCQkJCXdpZHRoID0gc3c6Om1heCgxLCB3aWR0aCAvIDIpOworCQkJCWhlaWdodCA9IHN3OjptYXgoMSwgaGVpZ2h0IC8gMik7CisJCQl9CisJCX0KKwl9CisKKwlEaXJlY3QzREN1YmVUZXh0dXJlOTo6fkRpcmVjdDNEQ3ViZVRleHR1cmU5KCkKKwl7CisJCXJlc291cmNlLT5sb2NrKHN3OjpERVNUUlVDVCk7CisKKwkJZm9yKHVuc2lnbmVkIGludCBmYWNlID0gMDsgZmFjZSA8IDY7IGZhY2UrKykKKwkJeworCQkJZm9yKGludCBsZXZlbCA9IDA7IGxldmVsIDwgTUlQTUFQX0xFVkVMUzsgbGV2ZWwrKykKKwkJCXsKKwkJCQlpZihzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdKQorCQkJCXsKKwkJCQkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXS0+dW5iaW5kKCk7CisJCQkJCXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0gPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJlc291cmNlLT51bmxvY2soKTsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzREN1YmVUZXh0dXJlOSB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzREJhc2VUZXh0dXJlOSB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOSB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpBZGRSZWYoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpSZWxlYXNlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSk7CisJfQorCisJdm9pZCBEaXJlY3QzREN1YmVUZXh0dXJlOTo6UHJlTG9hZCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlByZUxvYWQoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcy0+ZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXREZXZpY2UoZGV2aWNlKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6U2V0UHJpb3JpdHkobmV3UHJpb3JpdHkpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OkdldFByaW9yaXR5KCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFByaW9yaXR5KCk7CisJfQorCisJRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpHZXRUeXBlKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFR5cGUoKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpHZW5lcmF0ZU1pcFN1YkxldmVscygpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoISh1c2FnZSAmIEQzRFVTQUdFX0FVVE9HRU5NSVBNQVApKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlyZXNvdXJjZS0+bG9jayhzdzo6UFVCTElDKTsKKworCQlmb3IodW5zaWduZWQgaW50IGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKQorCQl7CisJCQlpZighc3VyZmFjZUxldmVsW2ZhY2VdWzBdLT5oYXNEaXJ0eU1pcG1hcHMoKSkKKwkJCXsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGxldmVscyAtIDE7IGkrKykKKwkJCXsKKwkJCQlkZXZpY2UtPnN0cmV0Y2hSZWN0KHN1cmZhY2VMZXZlbFtmYWNlXVtpXSwgMCwgc3VyZmFjZUxldmVsW2ZhY2VdW2kgKyAxXSwgMCwgR2V0QXV0b0dlbkZpbHRlclR5cGUoKSk7CisJCQl9CisKKwkJCXN1cmZhY2VMZXZlbFtmYWNlXVswXS0+Y2xlYW5NaXBtYXBzKCk7CisJCX0KKworCQlyZXNvdXJjZS0+dW5sb2NrKCk7CisJfQorCisJRDNEVEVYVFVSRUZJTFRFUlRZUEUgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OkdldEF1dG9HZW5GaWx0ZXJUeXBlKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldEF1dG9HZW5GaWx0ZXJUeXBlKCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6R2V0TGV2ZWxDb3VudCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRMZXZlbENvdW50KCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6R2V0TE9EKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldExPRCgpOworCX0KKworCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OlNldEF1dG9HZW5GaWx0ZXJUeXBlKEQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlclR5cGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRBdXRvR2VuRmlsdGVyVHlwZShmaWx0ZXJUeXBlKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRMT0QobmV3TE9EKTsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpBZGREaXJ0eVJlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCBjb25zdCBSRUNUICpkaXJ0eVJlY3QpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkvLwlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpHZXRDdWJlTWFwU3VyZmFjZShEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCwgSURpcmVjdDNEU3VyZmFjZTkgKipjdWJlTWFwU3VyZmFjZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQkqY3ViZU1hcFN1cmZhY2UgPSAwOworCisJCWlmKGZhY2UgPj0gNiB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXS0+QWRkUmVmKCk7CisJCSpjdWJlTWFwU3VyZmFjZSA9IHN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF07CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RTVVJGQUNFX0RFU0MgKmRlc2NyaXB0aW9uKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXNjcmlwdGlvbiB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFswXVtsZXZlbF0pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcmV0dXJuIHN1cmZhY2VMZXZlbFswXVtsZXZlbF0tPkdldERlc2MoZGVzY3JpcHRpb24pOworCX0KKworCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OkxvY2tSZWN0KEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsLCBEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighbG9ja2VkUmVjdCB8fCBmYWNlID49IDYgfHwgbGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXJldHVybiBzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdLT5Mb2NrUmVjdChsb2NrZWRSZWN0LCByZWN0LCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6VW5sb2NrUmVjdChEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZihmYWNlID49IDYgfHwgbGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXJldHVybiBzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdLT5VbmxvY2tSZWN0KCk7CisJfQorCisJRGlyZWN0M0RTdXJmYWNlOSAqRGlyZWN0M0RDdWJlVGV4dHVyZTk6OmdldEludGVybmFsQ3ViZU1hcFN1cmZhY2UoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwpCisJeworCQlyZXR1cm4gc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RDdWJlVGV4dHVyZTkuaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0RDdWJlVGV4dHVyZTkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWQ4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzREN1YmVUZXh0dXJlOS5ocHAKQEAgLTAsMCArMSw3MyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0RDdWJlVGV4dHVyZTlfaHBwCisjZGVmaW5lIEQzRDlfRGlyZWN0M0RDdWJlVGV4dHVyZTlfaHBwCisKKyNpbmNsdWRlICJEaXJlY3QzREJhc2VUZXh0dXJlOS5ocHAiCisKKyNpbmNsdWRlICJDb25maWcuaHBwIgorCisjaW5jbHVkZSA8ZDNkOS5oPgorCituYW1lc3BhY2UgRDNEOQoreworCWNsYXNzIERpcmVjdDNEU3VyZmFjZTk7CisKKwljbGFzcyBEaXJlY3QzREN1YmVUZXh0dXJlOSA6IHB1YmxpYyBJRGlyZWN0M0RDdWJlVGV4dHVyZTksIHB1YmxpYyBEaXJlY3QzREJhc2VUZXh0dXJlOQorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEQ3ViZVRleHR1cmU5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzREN1YmVUZXh0dXJlOSgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIElEaXJlY3QzRFJlc291cmNlOSBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CisJCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldFByaW9yaXR5KCk7CisJCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKTsKKwkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCk7CisKKwkJLy8gSURpcmVjdDNEQmFzZVRleHR1cmU5IG1ldGhvZHMKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TE9EKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldExldmVsQ291bnQoKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0QXV0b0dlbkZpbHRlclR5cGUoRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyVHlwZSk7CisJCUQzRFRFWFRVUkVGSUxURVJUWVBFIF9fc3RkY2FsbCBHZXRBdXRvR2VuRmlsdGVyVHlwZSgpOworCQl2b2lkIF9fc3RkY2FsbCBHZW5lcmF0ZU1pcFN1YkxldmVscygpOworCisJCS8vIElEaXJlY3QzREN1YmVUZXh0dXJlOSBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIEdldExldmVsRGVzYyh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRFNVUkZBQ0VfREVTQyAqZGVzY3JpcHRpb24pOworCQlsb25nIF9fc3RkY2FsbCBHZXRDdWJlTWFwU3VyZmFjZShEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCwgSURpcmVjdDNEU3VyZmFjZTkgKipjdWJlTWFwU3VyZmFjZSk7CisJCWxvbmcgX19zdGRjYWxsIExvY2tSZWN0KEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsLCBEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIFVubG9ja1JlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwpOworCQlsb25nIF9fc3RkY2FsbCBBZGREaXJ0eVJlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCBjb25zdCBSRUNUICpkaXJ0eVJlY3QpOworCisJCS8vIEludGVybmFsIG1ldGhvZHMKKwkJRGlyZWN0M0RTdXJmYWNlOSAqZ2V0SW50ZXJuYWxDdWJlTWFwU3VyZmFjZShEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCk7CisKKwlwcml2YXRlOgorCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCWNvbnN0IHVuc2lnbmVkIGludCBlZGdlTGVuZ3RoOworCisJCURpcmVjdDNEU3VyZmFjZTkgKnN1cmZhY2VMZXZlbFs2XVtNSVBNQVBfTEVWRUxTXTsKKwl9OworfQorCisjZW5kaWYgLy8gRDNEOV9EaXJlY3QzRDlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRERldmljZTkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjY3MjRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5LmNwcApAQCAtMCwwICsxLDY0NzIgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRDkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEU3VyZmFjZTkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNESW5kZXhCdWZmZXI5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleEJ1ZmZlcjkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEVGV4dHVyZTkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lVGV4dHVyZTkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEQ3ViZVRleHR1cmU5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RTd2FwQ2hhaW45LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFBpeGVsU2hhZGVyOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFN0YXRlQmxvY2s5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFF1ZXJ5OS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RWb2x1bWU5LmhwcCIKKworI2luY2x1ZGUgIkRlYnVnLmhwcCIKKyNpbmNsdWRlICJDYXBhYmlsaXRpZXMuaHBwIgorI2luY2x1ZGUgIk1hdGguaHBwIgorI2luY2x1ZGUgIlJlbmRlcmVyLmhwcCIKKyNpbmNsdWRlICJDb25maWcuaHBwIgorI2luY2x1ZGUgIkZyYW1lQnVmZmVyLmhwcCIKKyNpbmNsdWRlICJDbGlwcGVyLmhwcCIKKyNpbmNsdWRlICJDb25maWd1cmF0b3IuaHBwIgorI2luY2x1ZGUgIlRpbWVyLmhwcCIKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworYm9vbCBsb2NhbFNoYWRlckNvbnN0YW50cyA9IHRydWU7CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJaW5saW5lIHVuc2lnbmVkIGxvbmcgRnRvRFcoZmxvYXQgZikKKwl7CisJCXJldHVybiAodW5zaWduZWQgbG9uZyYpZjsKKwl9CisKKwlEaXJlY3QzRERldmljZTk6OkRpcmVjdDNERGV2aWNlOShjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UsIERpcmVjdDNEOSAqZDNkOSwgdW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgSFdORCBmb2N1c1dpbmRvdywgdW5zaWduZWQgbG9uZyBiZWhhdmlvdXJGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykgOiBpbnN0YW5jZShpbnN0YW5jZSksIGFkYXB0ZXIoYWRhcHRlciksIGQzZDkoZDNkOSksIGRldmljZVR5cGUoZGV2aWNlVHlwZSksIGZvY3VzV2luZG93KGZvY3VzV2luZG93KSwgYmVoYXZpb3VyRmxhZ3MoYmVoYXZpb3VyRmxhZ3MpCisJeworCQlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZjcml0aWNhbFNlY3Rpb24pOworCisJCWluaXQgPSB0cnVlOworCQlzdGF0ZVJlY29yZGVyID0gMDsKKworCQlkM2Q5LT5BZGRSZWYoKTsKKworCQljb250ZXh0ID0gbmV3IHN3OjpDb250ZXh0KCk7CisJCXJlbmRlcmVyID0gbmV3IHN3OjpSZW5kZXJlcihjb250ZXh0KTsKKworCQlzd2FwQ2hhaW4gPSAwOworCQlkZXB0aFN0ZW5jaWwgPSAwOworCQlhdXRvRGVwdGhTdGVuY2lsID0gMDsKKwkJcmVuZGVyVGFyZ2V0WzBdID0gMDsKKwkJcmVuZGVyVGFyZ2V0WzFdID0gMDsKKwkJcmVuZGVyVGFyZ2V0WzJdID0gMDsKKwkJcmVuZGVyVGFyZ2V0WzNdID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTYgKyA0OyBpKyspCisJCXsKKwkJCXRleHR1cmVbaV0gPSAwOworCQl9CisKKwkJY3Vyc29yID0gMDsKKworCQlSZXNldChwcmVzZW50UGFyYW1ldGVycyk7CisKKwkJcGl4ZWxTaGFkZXIgPSAwOworCQl2ZXJ0ZXhTaGFkZXIgPSAwOworCisJCWxpZ2h0c0RpcnR5ID0gdHJ1ZTsKKwkJcGl4ZWxTaGFkZXJEaXJ0eSA9IHRydWU7CisJCXBpeGVsU2hhZGVyQ29uc3RhbnRzQkRpcnR5ID0gMDsKKwkJcGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHkgPSAwOworCQlwaXhlbFNoYWRlckNvbnN0YW50c0lEaXJ0eSA9IDA7CisJCXZlcnRleFNoYWRlckRpcnR5ID0gdHJ1ZTsKKwkJdmVydGV4U2hhZGVyQ29uc3RhbnRzQkRpcnR5ID0gMDsKKwkJdmVydGV4U2hhZGVyQ29uc3RhbnRzRkRpcnR5ID0gMDsKKwkJdmVydGV4U2hhZGVyQ29uc3RhbnRzSURpcnR5ID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJZGF0YVN0cmVhbVtpXSA9IDA7CisJCQlzdHJlYW1TdHJpZGVbaV0gPSAwOworCQkJc3RyZWFtT2Zmc2V0W2ldID0gMDsKKworCQkJc3RyZWFtU291cmNlRnJlcVtpXSA9IDE7CisJCX0KKworCQlpbmRleERhdGEgPSAwOworCQl2ZXJ0ZXhEZWNsYXJhdGlvbiA9IDA7CisKKwkJRDNETUFURVJJQUw5IG1hdGVyaWFsOworCisJCW1hdGVyaWFsLkRpZmZ1c2UuciA9IDEuMGY7CisJCW1hdGVyaWFsLkRpZmZ1c2UuZyA9IDEuMGY7CisJCW1hdGVyaWFsLkRpZmZ1c2UuYiA9IDEuMGY7CisJCW1hdGVyaWFsLkRpZmZ1c2UuYSA9IDAuMGY7CisJCW1hdGVyaWFsLkFtYmllbnQuciA9IDAuMGY7CisJCW1hdGVyaWFsLkFtYmllbnQuZyA9IDAuMGY7CisJCW1hdGVyaWFsLkFtYmllbnQuYiA9IDAuMGY7CisJCW1hdGVyaWFsLkFtYmllbnQuYSA9IDAuMGY7CisJCW1hdGVyaWFsLkVtaXNzaXZlLnIgPSAwLjBmOworCQltYXRlcmlhbC5FbWlzc2l2ZS5nID0gMC4wZjsKKwkJbWF0ZXJpYWwuRW1pc3NpdmUuYiA9IDAuMGY7CisJCW1hdGVyaWFsLkVtaXNzaXZlLmEgPSAwLjBmOworCQltYXRlcmlhbC5TcGVjdWxhci5yID0gMC4wZjsKKwkJbWF0ZXJpYWwuU3BlY3VsYXIuZyA9IDAuMGY7CisJCW1hdGVyaWFsLlNwZWN1bGFyLmIgPSAwLjBmOworCQltYXRlcmlhbC5TcGVjdWxhci5hID0gMC4wZjsKKwkJbWF0ZXJpYWwuUG93ZXIgPSAwLjBmOworCisJCVNldE1hdGVyaWFsKCZtYXRlcmlhbCk7CisKKwkJRDNETUFUUklYIGlkZW50aXR5ID0gezEsIDAsIDAsIDAsCisJCSAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAwLCAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwgMCwKKwkJICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDF9OworCisJCVNldFRyYW5zZm9ybShEM0RUU19WSUVXLCAmaWRlbnRpdHkpOworCQlTZXRUcmFuc2Zvcm0oRDNEVFNfUFJPSkVDVElPTiwgJmlkZW50aXR5KTsKKwkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUwLCAmaWRlbnRpdHkpOworCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTEsICZpZGVudGl0eSk7CisJCVNldFRyYW5zZm9ybShEM0RUU19URVhUVVJFMiwgJmlkZW50aXR5KTsKKwkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUzLCAmaWRlbnRpdHkpOworCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTQsICZpZGVudGl0eSk7CisJCVNldFRyYW5zZm9ybShEM0RUU19URVhUVVJFNSwgJmlkZW50aXR5KTsKKwkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU2LCAmaWRlbnRpdHkpOworCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTcsICZpZGVudGl0eSk7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDEyOyBpKyspCisJCXsKKwkJCVNldFRyYW5zZm9ybShEM0RUU19XT1JMRE1BVFJJWChpKSwgJmlkZW50aXR5KTsKKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCAyMjQ7IGkrKykKKwkJeworCQkJZmxvYXQgemVyb1s0XSA9IHswLCAwLCAwLCAwfTsKKworCQkJU2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoaSwgemVybywgMSk7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXsKKwkJCWZsb2F0IHplcm9bNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJCVNldFZlcnRleFNoYWRlckNvbnN0YW50RihpLCB6ZXJvLCAxKTsKKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl7CisJCQlpbnQgemVyb1s0XSA9IHswLCAwLCAwLCAwfTsKKworCQkJU2V0UGl4ZWxTaGFkZXJDb25zdGFudEkoaSwgemVybywgMSk7CisJCQlTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkoaSwgemVybywgMSk7CisJCQlTZXRQaXhlbFNoYWRlckNvbnN0YW50QihpLCAmemVyb1swXSwgMSk7CisJCQlTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIoaSwgJnplcm9bMF0sIDEpOworCQl9CisKKwkJaW5pdCA9IGZhbHNlOworCisJCWlmKCEoYmVoYXZpb3VyRmxhZ3MgJiBEM0RDUkVBVEVfRlBVX1BSRVNFUlZFKSkKKwkJeworCQkJY29uZmlndXJlRlBVKCk7CisJCX0KKworCQlpbnN0YW5jaW5nRW5hYmxlZCA9IHBpeGVsU2hhZGVyVmVyc2lvblggPj0gRDNEUFNfVkVSU0lPTigzLCAwKTsKKwl9CisKKwlEaXJlY3QzRERldmljZTk6On5EaXJlY3QzRERldmljZTkoKQorCXsKKwkJZGVsZXRlIHJlbmRlcmVyOworCQlyZW5kZXJlciA9IDA7CisJCWRlbGV0ZSBjb250ZXh0OworCQljb250ZXh0ID0gMDsKKworCQlkM2Q5LT5SZWxlYXNlKCk7CisJCWQzZDkgPSAwOworCisJCXN3YXBDaGFpbi0+dW5iaW5kKCk7CisJCXN3YXBDaGFpbiA9IDA7CisJCQorCQlpZihkZXB0aFN0ZW5jaWwpCisJCXsKKwkJCWRlcHRoU3RlbmNpbC0+dW5iaW5kKCk7CisJCQlkZXB0aFN0ZW5jaWwgPSAwOworCQl9CisKKwkJaWYoYXV0b0RlcHRoU3RlbmNpbCkKKwkJeworCQkJYXV0b0RlcHRoU3RlbmNpbC0+dW5iaW5kKCk7CisJCQlhdXRvRGVwdGhTdGVuY2lsID0gMDsKKwkJfQorCQkKKwkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykKKwkJeworCQkJaWYocmVuZGVyVGFyZ2V0W2luZGV4XSkKKwkJCXsKKwkJCQlyZW5kZXJUYXJnZXRbaW5kZXhdLT51bmJpbmQoKTsKKwkJCQlyZW5kZXJUYXJnZXRbaW5kZXhdID0gMDsKKwkJCX0KKwkJfQorCisJCWlmKHZlcnRleERlY2xhcmF0aW9uKQorCQl7CisJCQl2ZXJ0ZXhEZWNsYXJhdGlvbi0+dW5iaW5kKCk7CisJCQl2ZXJ0ZXhEZWNsYXJhdGlvbiA9IDA7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTYgKyA0OyBpKyspCisJCXsKKwkJCWlmKHRleHR1cmVbaV0pCisJCQl7CisJCQkJdGV4dHVyZVtpXS0+dW5iaW5kKCk7CisJCQkJdGV4dHVyZVtpXSA9IDA7CisJCQl9CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJaWYoZGF0YVN0cmVhbVtpXSkKKwkJCXsKKwkJCQlkYXRhU3RyZWFtW2ldLT51bmJpbmQoKTsKKwkJCQlkYXRhU3RyZWFtW2ldID0gMDsKKwkJCX0KKwkJfQorCisJCWlmKGluZGV4RGF0YSkKKwkJeworCQkJaW5kZXhEYXRhLT51bmJpbmQoKTsKKwkJCWluZGV4RGF0YSA9IDA7CisJCX0KKwkJCisJCWlmKHBpeGVsU2hhZGVyKQorCQl7CisJCQlwaXhlbFNoYWRlci0+dW5iaW5kKCk7CisJCQlwaXhlbFNoYWRlciA9IDA7CisJCX0KKworCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCXsKKwkJCXZlcnRleFNoYWRlci0+dW5iaW5kKCk7CisJCQl2ZXJ0ZXhTaGFkZXIgPSAwOworCQl9CisKKwkJaWYoc3RhdGVSZWNvcmRlcikKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+dW5iaW5kKCk7CisJCQlzdGF0ZVJlY29yZGVyID0gMDsKKwkJfQorCisJCXBhbGV0dGUuY2xlYXIoKTsKKworCQlkZWxldGUgY3Vyc29yOworCisJCURlbGV0ZUNyaXRpY2FsU2VjdGlvbigmY3JpdGljYWxTZWN0aW9uKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoImNvbnN0IElJRCAmaWlkID0gMHglMC44cCwgdm9pZCAqKm9iamVjdCA9IDB4JTAuOHAiLCBpaWQsIG9iamVjdCk7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0REZXZpY2U5IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRERldmljZTk6OkFkZFJlZigpCisJeworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKKwl9CisJCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRERldmljZTk6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpCZWdpblNjZW5lKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkJlZ2luU3RhdGVCbG9jaygpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlpZihzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXN0YXRlUmVjb3JkZXIgPSBuZXcgRGlyZWN0M0RTdGF0ZUJsb2NrOSh0aGlzLCAoRDNEU1RBVEVCTE9DS1RZUEUpMCk7CisJCQorCQlpZighc3RhdGVSZWNvcmRlcikKKwkJeworCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7CisJCX0KKwkJCisJCXN0YXRlUmVjb3JkZXItPmJpbmQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDbGVhcih1bnNpZ25lZCBsb25nIGNvdW50LCBjb25zdCBEM0RSRUNUICpyZWN0cywgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBjb2xvciwgZmxvYXQgeiwgdW5zaWduZWQgbG9uZyBzdGVuY2lsKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGNvdW50ID0gJWQsIGNvbnN0IEQzRFJFQ1QgKnJlY3RzID0gMHglMC44cCwgdW5zaWduZWQgbG9uZyBmbGFncyA9IDB4JTAuOFgsIHVuc2lnbmVkIGxvbmcgY29sb3IgPSAweCUwLjhYLCBmbG9hdCB6ID0gJWYsIHVuc2lnbmVkIGxvbmcgc3RlbmNpbCA9ICVkIiwgY291bnQsIHJlY3RzLCBmbGFncywgY29sb3IsIHosIHN0ZW5jaWwpOworCisJCWlmKHJlY3RzID09IDAgJiYgY291bnQgIT0gMCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZihmbGFncyAmIChEM0RDTEVBUl9aQlVGRkVSIHwgRDNEQ0xFQVJfU1RFTkNJTCkgJiYgIWRlcHRoU3RlbmNpbCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZihmbGFncyAmIEQzRENMRUFSX1NURU5DSUwpICAgLy8gQ2hlY2sgZm9yIHN0ZW5jaWwgY29tcG9uZW50CisJCXsKKwkJCUQzRFNVUkZBQ0VfREVTQyBkZXNjcmlwdGlvbjsKKwkJCWRlcHRoU3RlbmNpbC0+R2V0RGVzYygmZGVzY3JpcHRpb24pOworCisJCQlzd2l0Y2goZGVzY3JpcHRpb24uRm9ybWF0KQorCQkJeworCQkJY2FzZSBEM0RGTVRfRDE1UzE6CisJCQljYXNlIEQzREZNVF9EMjRTODoKKwkJCWNhc2UgRDNERk1UX0QyNFg4OgorCQkJY2FzZSBEM0RGTVRfRDI0WDRTNDoKKwkJCWNhc2UgRDNERk1UX0QyNEZTODoKKwkJCWNhc2UgRDNERk1UX1M4X0xPQ0tBQkxFOiAgIC8vIEZJWE1FOiBJTlZBTElEQ0FMTCB3aGVuIHRyeWluZyB0byBjbGVhciBkZXB0aD8KKwkJCWNhc2UgRDNERk1UX0RGMjQ6CisJCQljYXNlIEQzREZNVF9ERjE2OgorCQkJY2FzZSBEM0RGTVRfSU5UWjoKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNERk1UX0QxNl9MT0NLQUJMRToKKwkJCWNhc2UgRDNERk1UX0QzMjoKKwkJCWNhc2UgRDNERk1UX0QxNjoKKwkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6CisJCQljYXNlIEQzREZNVF9EMzJfTE9DS0FCTEU6CisJCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKworCQlpZighcmVjdHMpCisJCXsKKwkJCWNvdW50ID0gMTsKKworCQkJRDNEUkVDVCByZWN0OworCisJCQlyZWN0LngxID0gdmlld3BvcnQuWDsKKwkJCXJlY3QueDIgPSB2aWV3cG9ydC5YICsgdmlld3BvcnQuV2lkdGg7CisJCQlyZWN0LnkxID0gdmlld3BvcnQuWTsKKwkJCXJlY3QueTIgPSB2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0OworCisJCQlyZWN0cyA9ICZyZWN0OworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCUQzRFJFQ1QgcmVjdCA9IHJlY3RzW2ldOworCisJCQkvLyBDbGFtcCBhZ2FpbnN0IHZpZXdwb3J0CisJCQlpZihyZWN0LngxIDwgKGludCl2aWV3cG9ydC5YKSByZWN0LngxID0gdmlld3BvcnQuWDsKKwkJCWlmKHJlY3QueDIgPCAoaW50KXZpZXdwb3J0LlgpIHJlY3QueDIgPSB2aWV3cG9ydC5YOworCQkJaWYocmVjdC54MSA+IChpbnQpdmlld3BvcnQuWCArIChpbnQpdmlld3BvcnQuV2lkdGgpIHJlY3QueDEgPSB2aWV3cG9ydC5YICsgdmlld3BvcnQuV2lkdGg7CisJCQlpZihyZWN0LngyID4gKGludCl2aWV3cG9ydC5YICsgKGludCl2aWV3cG9ydC5XaWR0aCkgcmVjdC54MiA9IHZpZXdwb3J0LlggKyB2aWV3cG9ydC5XaWR0aDsKKworCQkJaWYocmVjdC55MSA8IChpbnQpdmlld3BvcnQuWSkgcmVjdC55MSA9IHZpZXdwb3J0Llk7CisJCQlpZihyZWN0LnkyIDwgKGludCl2aWV3cG9ydC5ZKSByZWN0LnkyID0gdmlld3BvcnQuWTsKKwkJCWlmKHJlY3QueTEgPiAoaW50KXZpZXdwb3J0LlkgKyAoaW50KXZpZXdwb3J0LkhlaWdodCkgcmVjdC55MSA9IHZpZXdwb3J0LlkgKyB2aWV3cG9ydC5IZWlnaHQ7CisJCQlpZihyZWN0LnkyID4gKGludCl2aWV3cG9ydC5ZICsgKGludCl2aWV3cG9ydC5IZWlnaHQpIHJlY3QueTIgPSB2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0OworCisJCQkvLyBDbGFtcCBhZ2FpbnN0IHNjaXNzb3IgcmVjdGFuZ2xlCisJCQlpZihzY2lzc29yRW5hYmxlKQorCQkJeworCQkJCWlmKHJlY3QueDEgPCAoaW50KXNjaXNzb3JSZWN0LmxlZnQpIHJlY3QueDEgPSBzY2lzc29yUmVjdC5sZWZ0OworCQkJCWlmKHJlY3QueDIgPCAoaW50KXNjaXNzb3JSZWN0LmxlZnQpIHJlY3QueDIgPSBzY2lzc29yUmVjdC5sZWZ0OworCQkJCWlmKHJlY3QueDEgPiAoaW50KXNjaXNzb3JSZWN0LnJpZ2h0KSByZWN0LngxID0gc2Npc3NvclJlY3QucmlnaHQ7CisJCQkJaWYocmVjdC54MiA+IChpbnQpc2Npc3NvclJlY3QucmlnaHQpIHJlY3QueDIgPSBzY2lzc29yUmVjdC5yaWdodDsKKworCQkJCWlmKHJlY3QueTEgPCAoaW50KXNjaXNzb3JSZWN0LnRvcCkgcmVjdC55MSA9IHNjaXNzb3JSZWN0LnRvcDsKKwkJCQlpZihyZWN0LnkyIDwgKGludClzY2lzc29yUmVjdC50b3ApIHJlY3QueTIgPSBzY2lzc29yUmVjdC50b3A7CisJCQkJaWYocmVjdC55MSA+IChpbnQpc2Npc3NvclJlY3QuYm90dG9tKSByZWN0LnkxID0gc2Npc3NvclJlY3QuYm90dG9tOworCQkJCWlmKHJlY3QueTIgPiAoaW50KXNjaXNzb3JSZWN0LmJvdHRvbSkgcmVjdC55MiA9IHNjaXNzb3JSZWN0LmJvdHRvbTsKKwkJCX0KKworCQkJaWYoZmxhZ3MgJiBEM0RDTEVBUl9TVEVOQ0lMKQorCQkJeworCQkJCWRlcHRoU3RlbmNpbC0+Y2xlYXJTdGVuY2lsQnVmZmVyKHN0ZW5jaWwsIDB4RkYsIHJlY3QueDEsIHJlY3QueTEsIHJlY3QueDIgLSByZWN0LngxLCByZWN0LnkyIC0gcmVjdC55MSk7CisJCQl9CisKKwkJCWlmKGZsYWdzICYgRDNEQ0xFQVJfVEFSR0VUKQorCQkJeworCQkJCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspCisJCQkJeworCQkJCQlpZihyZW5kZXJUYXJnZXRbaW5kZXhdKQorCQkJCQl7CisJCQkJCQlEM0RTVVJGQUNFX0RFU0MgZGVzY3JpcHRpb247CisJCQkJCQlyZW5kZXJUYXJnZXRbaW5kZXhdLT5HZXREZXNjKCZkZXNjcmlwdGlvbik7CisKKwkJCQkJCWlmKHJlbmRlclN0YXRlW0QzRFJTX1NSR0JXUklURUVOQUJMRV0gIT0gRkFMU0UgJiYgaW5kZXggPT0gMCAmJiBDYXBhYmlsaXRpZXM6OmlzU1JHQndyaXRhYmxlKGRlc2NyaXB0aW9uLkZvcm1hdCkpCisJCQkJCQl7CisJCQkJCQkJZmxvYXQgciA9IChmbG9hdCkoY29sb3IgJiAweDAwRkYwMDAwKSAvIDB4MDBGRjAwMDA7CisJCQkJCQkJZmxvYXQgZyA9IChmbG9hdCkoY29sb3IgJiAweDAwMDBGRjAwKSAvIDB4MDAwMEZGMDA7CisJCQkJCQkJZmxvYXQgYiA9IChmbG9hdCkoY29sb3IgJiAweDAwMDAwMEZGKSAvIDB4MDAwMDAwRkY7CisJCQkJCQkJZmxvYXQgYSA9IChmbG9hdCkoY29sb3IgJiAweEZGMDAwMDAwKSAvIDB4RkYwMDAwMDA7CisKKwkJCQkJCQlyID0gc3c6OmxpbmVhclRvU1JHQihyKTsKKwkJCQkJCQlnID0gc3c6OmxpbmVhclRvU1JHQihnKTsKKwkJCQkJCQliID0gc3c6OmxpbmVhclRvU1JHQihiKTsKKworCQkJCQkJCWNvbG9yID0gKChpbnQpKGEgKiAyNTUpIDw8IDI0KSB8CisJCQkJCQkJCQkoKGludCkociAqIDI1NSkgPDwgMTYpIHwKKwkJCQkJCQkJCSgoaW50KShnICogMjU1KSA8PCA4KSB8CisJCQkJCQkJCQkoKGludCkoYiAqIDI1NSkgPDwgMCk7CisJCQkJCQl9CisKKwkJCQkJCXJlbmRlclRhcmdldFtpbmRleF0tPmNsZWFyQ29sb3JCdWZmZXIoY29sb3IsIDB4RiwgcmVjdC54MSwgcmVjdC55MSwgcmVjdC54MiAtIHJlY3QueDEsIHJlY3QueTIgLSByZWN0LnkxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYoZmxhZ3MgJiBEM0RDTEVBUl9aQlVGRkVSKQorCQkJeworCQkJCWlmKHogPiAxKSB6ID0gMTsKKwkJCQlpZih6IDwgMCkgeiA9IDA7CisKKwkJCQlkZXB0aFN0ZW5jaWwtPmNsZWFyRGVwdGhCdWZmZXIoeiwgcmVjdC54MSwgcmVjdC55MSwgcmVjdC54MiAtIHJlY3QueDEsIHJlY3QueTIgLSByZWN0LnkxKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkNvbG9yRmlsbChJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZSwgY29uc3QgUkVDVCAqcmVjdCwgRDNEQ09MT1IgY29sb3IpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIklEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlID0gMHglMC44cCwgY29uc3QgUkVDVCAqcmVjdCA9IDB4JTAuOHAsIEQzRENPTE9SIGNvbG9yID0gMHglMC44WCIsIHN1cmZhY2UsIHJlY3QsIGNvbG9yKTsKKworCQlpZighc3VyZmFjZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlEM0RTVVJGQUNFX0RFU0MgZGVzY3JpcHRpb247CisKKwkJc3VyZmFjZS0+R2V0RGVzYygmZGVzY3JpcHRpb24pOworCisJCWlmKGRlc2NyaXB0aW9uLlBvb2wgIT0gRDNEUE9PTF9ERUZBVUxUKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFyZWN0KQorCQl7CisJCQlSRUNUIGxvY2s7CisKKwkJCWxvY2subGVmdCA9IDA7CisJCQlsb2NrLnRvcCA9IDA7CisJCQlsb2NrLnJpZ2h0ID0gZGVzY3JpcHRpb24uV2lkdGg7CisJCQlsb2NrLmJvdHRvbSA9IGRlc2NyaXB0aW9uLkhlaWdodDsKKworCQkJcmVjdCA9ICZsb2NrOworCQl9CisKKwkJc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOSo+KHN1cmZhY2UpLT5maWxsKGNvbG9yLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRFN3YXBDaGFpbjkgKipzd2FwQ2hhaW4pCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMgPSAweCUwLjhwLCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluID0gMHglMC44cCIsIHByZXNlbnRQYXJhbWV0ZXJzLCBzd2FwQ2hhaW4pOworCisJCWlmKCFzd2FwQ2hhaW4pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnN3YXBDaGFpbiA9IDA7CisKKwkJaWYoIXByZXNlbnRQYXJhbWV0ZXJzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyQ291bnQgPiAzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsgICAvLyBNYXhpbXVtIG9mIHRocmVlIGJhY2sgYnVmZmVycworCQl9CisKKwkJKnN3YXBDaGFpbiA9IG5ldyBEaXJlY3QzRFN3YXBDaGFpbjkodGhpcywgcHJlc2VudFBhcmFtZXRlcnMpOworCisJCWlmKCEqc3dhcENoYWluKQorCQl7CisJCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKKwkJfQorCisJCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQorCQl7CisJCQlkZWxldGUgKnN3YXBDaGFpbjsKKwkJCSpzd2FwQ2hhaW4gPSAwOworCisJCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOworCQl9CisKKwkJKCpzd2FwQ2hhaW4pLT5BZGRSZWYoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVDdWJlVGV4dHVyZSh1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RDdWJlVGV4dHVyZTkgKipjdWJlVGV4dHVyZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IGVkZ2VMZW5ndGggPSAlZCwgdW5zaWduZWQgaW50IGxldmVscyA9ICVkLCB1bnNpZ25lZCBsb25nIHVzYWdlID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgRDNEUE9PTCBwb29sID0gJWQsIElEaXJlY3QzREN1YmVUZXh0dXJlOSAqKmN1YmVUZXh0dXJlID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCBlZGdlTGVuZ3RoLCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wsIGN1YmVUZXh0dXJlLCBzaGFyZWRIYW5kbGUpOworCisJCSpjdWJlVGV4dHVyZSA9IDA7CisKKwkJaWYoZWRnZUxlbmd0aCA9PSAwIHx8ICh1c2FnZSAmIEQzRFVTQUdFX0FVVE9HRU5NSVBNQVAgJiYgbGV2ZWxzID4gMSkgfHwgZDNkOS0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCB1c2FnZSwgRDNEUlRZUEVfQ1VCRVRFWFRVUkUsIGZvcm1hdCkgIT0gRDNEX09LKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpjdWJlVGV4dHVyZSA9IG5ldyBEaXJlY3QzREN1YmVUZXh0dXJlOSh0aGlzLCBlZGdlTGVuZ3RoLCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wpOworCisJCWlmKCEqY3ViZVRleHR1cmUpCisJCXsKKwkJCXJldHVybiBPVVRPRk1FTU9SWSgpOworCQl9CisKKwkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCisJCXsKKwkJCWRlbGV0ZSAqY3ViZVRleHR1cmU7CisJCQkqY3ViZVRleHR1cmUgPSAwOworCisJCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOworCQl9CisKKwkJKCpjdWJlVGV4dHVyZSktPkFkZFJlZigpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCB1bnNpZ25lZCBsb25nIG11bHRpU2FtcGxlUXVhbGl0eSwgaW50IGRpc2NhcmQsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHdpZHRoID0gJWQsIHVuc2lnbmVkIGludCBoZWlnaHQgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlID0gJWQsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5ID0gJWQsIGludCBkaXNjYXJkID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBtdWx0aVNhbXBsZSwgbXVsdGlTYW1wbGVRdWFsaXR5LCBkaXNjYXJkLCBzdXJmYWNlLCBzaGFyZWRIYW5kbGUpOworCisJCSpzdXJmYWNlID0gMDsKKworCQlpZih3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwIHx8IGQzZDktPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgRDNEVVNBR0VfREVQVEhTVEVOQ0lMLCBEM0RSVFlQRV9TVVJGQUNFLCBmb3JtYXQpICE9IEQzRF9PSyB8fCBoZWlnaHQgPiBPVVRMSU5FX1JFU09MVVRJT04pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisJCQorCQlib29sIGxvY2thYmxlID0gZmFsc2U7CisKKwkJc3dpdGNoKGZvcm1hdCkKKwkJeworCQljYXNlIEQzREZNVF9EMTVTMToKKwkJY2FzZSBEM0RGTVRfRDI0Uzg6CisJCWNhc2UgRDNERk1UX0QyNFg4OgorCQljYXNlIEQzREZNVF9EMjRYNFM0OgorCQljYXNlIEQzREZNVF9EMjRGUzg6CisJCWNhc2UgRDNERk1UX0QzMjoKKwkJY2FzZSBEM0RGTVRfRDE2OgorCQljYXNlIEQzREZNVF9ERjI0OgorCQljYXNlIEQzREZNVF9ERjE2OgorCQljYXNlIEQzREZNVF9JTlRaOgorCQkJbG9ja2FibGUgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlIEQzREZNVF9TOF9MT0NLQUJMRToKKwkJY2FzZSBEM0RGTVRfRDE2X0xPQ0tBQkxFOgorCQljYXNlIEQzREZNVF9EMzJGX0xPQ0tBQkxFOgorCQljYXNlIEQzREZNVF9EMzJfTE9DS0FCTEU6CisJCQlsb2NrYWJsZSA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQkqc3VyZmFjZSA9IG5ldyBEaXJlY3QzRFN1cmZhY2U5KHRoaXMsIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgRDNEUE9PTF9ERUZBVUxULCBtdWx0aVNhbXBsZSwgbXVsdGlTYW1wbGVRdWFsaXR5LCBsb2NrYWJsZSwgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKTsKKworCQlpZighKnN1cmZhY2UpCisJCXsKKwkJCXJldHVybiBPVVRPRk1FTU9SWSgpOworCQl9CisKKwkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCisJCXsKKwkJCWRlbGV0ZSAqc3VyZmFjZTsKKwkJCSpzdXJmYWNlID0gMDsKKworCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKKwkJfQorCisJCSgqc3VyZmFjZSktPkFkZFJlZigpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZUluZGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNESW5kZXhCdWZmZXI5ICoqaW5kZXhCdWZmZXIsIHZvaWQgKipzaGFyZWRIYW5kbGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBsZW5ndGggPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIEQzRFBPT0wgcG9vbCA9ICVkLCBJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKippbmRleEJ1ZmZlciA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgbGVuZ3RoLCB1c2FnZSwgZm9ybWF0LCBwb29sLCBpbmRleEJ1ZmZlciwgc2hhcmVkSGFuZGxlKTsKKworCQkqaW5kZXhCdWZmZXIgPSBuZXcgRGlyZWN0M0RJbmRleEJ1ZmZlcjkodGhpcywgbGVuZ3RoLCB1c2FnZSwgZm9ybWF0LCBwb29sKTsKKworCQlpZighKmluZGV4QnVmZmVyKQorCQl7CisJCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKKwkJfQorCisJCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQorCQl7CisJCQlkZWxldGUgKmluZGV4QnVmZmVyOworCQkJKmluZGV4QnVmZmVyID0gMDsKKworCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKKwkJfQorCisJCSgqaW5kZXhCdWZmZXIpLT5BZGRSZWYoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVPZmZzY3JlZW5QbGFpblN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHdpZHRoID0gJWQsIHVuc2lnbmVkIGludCBoZWlnaHQgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RQT09MIHBvb2wgPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHBvb2wsIHN1cmZhY2UsIHNoYXJlZEhhbmRsZSk7CisKKwkJKnN1cmZhY2UgPSAwOworCisJCWlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgZDNkOS0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCAwLCBEM0RSVFlQRV9TVVJGQUNFLCBmb3JtYXQpICE9IEQzRF9PSykgICAvLyBGSVhNRTogQWxsb3cgYWxsIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHJ1bnRpbWUvUkVGCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYocG9vbCA9PSBEM0RQT09MX01BTkFHRUQpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnN1cmZhY2UgPSBuZXcgRGlyZWN0M0RTdXJmYWNlOSh0aGlzLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHBvb2wsIEQzRE1VTFRJU0FNUExFX05PTkUsIDAsIHRydWUsIDApOworCisJCWlmKCEqc3VyZmFjZSkKKwkJeworCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7CisJCX0KKworCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKKwkJeworCQkJZGVsZXRlICpzdXJmYWNlOworCQkJKnN1cmZhY2UgPSAwOworCisJCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOworCQl9CisKKwkJKCpzdXJmYWNlKS0+QWRkUmVmKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlUGl4ZWxTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqKnNoYWRlcikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24gPSAweCUwLjhwLCBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKipzaGFkZXIgPSAweCUwLjhwIiwgZnVuY3Rpb24sIHNoYWRlcik7CisKKwkJaWYoIXNoYWRlcikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqc2hhZGVyID0gMDsKKworCQlpZighc3c6OlBpeGVsU2hhZGVyOjp2YWxpZGF0ZShmdW5jdGlvbikgfHwgZnVuY3Rpb25bMF0gPiBwaXhlbFNoYWRlclZlcnNpb25YKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsgICAvLyBTaGFkZXIgY29udGFpbnMgdW5zdXBwb3J0ZWQgb3BlcmF0aW9ucworCQl9CisKKwkJKnNoYWRlciA9IG5ldyBEaXJlY3QzRFBpeGVsU2hhZGVyOSh0aGlzLCBmdW5jdGlvbik7CisKKwkJaWYoISpzaGFkZXIpCisJCXsKKwkJCXJldHVybiBPVVRPRk1FTU9SWSgpOworCQl9CisKKwkJKCpzaGFkZXIpLT5BZGRSZWYoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVRdWVyeShEM0RRVUVSWVRZUEUgdHlwZSwgSURpcmVjdDNEUXVlcnk5ICoqcXVlcnkpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRFFVRVJZVFlQRSB0eXBlID0gJWQsIElEaXJlY3QzRFF1ZXJ5OSAqKnF1ZXJ5ID0gMHglMC44cCIsIHR5cGUsIHF1ZXJ5KTsKKworCQlpZihxdWVyeSA9PSAwKSAgIC8vIFN1cHBvcnQgY2hlY2tlZAorCQl7CisJCQlzd2l0Y2godHlwZSkKKwkJCXsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1ZDQUNIRToJCQkJcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1JFU09VUkNFTUFOQUdFUjoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1ZFUlRFWFNUQVRTOgkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX0VWRU5UOgkJCQlyZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RRVUVSWVRZUEVfT0NDTFVTSU9OOgkJCXJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVA6CQkJcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUERJU0pPSU5UOglyZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RRVUVSWVRZUEVfVElNRVNUQU1QRlJFUToJCXJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9QSVBFTElORVRJTUlOR1M6CQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9JTlRFUkZBQ0VUSU1JTkdTOgkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJY2FzZSBEM0RRVUVSWVRZUEVfVkVSVEVYVElNSU5HUzoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1BJWEVMVElNSU5HUzoJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9CQU5EV0lEVEhUSU1JTkdTOgkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJY2FzZSBEM0RRVUVSWVRZUEVfQ0FDSEVVVElMSVpBVElPTjoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCWRlZmF1bHQ6CQkJCQkJCQlBU1NFUlQoZmFsc2UpOyAgIHJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXN3aXRjaCh0eXBlKQorCQkJeworCQkJY2FzZSBEM0RRVUVSWVRZUEVfVkNBQ0hFOgkJCQlicmVhazsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1JFU09VUkNFTUFOQUdFUjoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1ZFUlRFWFNUQVRTOgkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX0VWRU5UOgkJCQlicmVhazsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX09DQ0xVU0lPTjoJCQlicmVhazsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUDoJCQlicmVhazsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUERJU0pPSU5UOglicmVhazsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUEZSRVE6CQlicmVhazsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1BJUEVMSU5FVElNSU5HUzoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX0lOVEVSRkFDRVRJTUlOR1M6CQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhUSU1JTkdTOgkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJY2FzZSBEM0RRVUVSWVRZUEVfUElYRUxUSU1JTkdTOgkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX0JBTkRXSURUSFRJTUlOR1M6CQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9DQUNIRVVUSUxJWkFUSU9OOgkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJZGVmYXVsdDoJCQkJCQkJCUFTU0VSVChmYWxzZSk7ICAgcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJfQorCisJCQkqcXVlcnkgPSBuZXcgRGlyZWN0M0RRdWVyeTkodGhpcywgdHlwZSk7CisKKwkJCWlmKCEqcXVlcnkpCisJCQl7CisJCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7CisJCQl9CisKKwkJCSgqcXVlcnkpLT5BZGRSZWYoKTsKKworCQkJcmV0dXJuIEQzRF9PSzsKKwkJfQorCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVSZW5kZXJUYXJnZXQodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCB1bnNpZ25lZCBsb25nIG11bHRpU2FtcGxlUXVhbGl0eSwgaW50IGxvY2thYmxlLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnN1cmZhY2UsIHZvaWQgKipzaGFyZWRIYW5kbGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCB3aWR0aCA9ICVkLCB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSA9ICVkLCB1bnNpZ25lZCBsb25nIG11bHRpU2FtcGxlUXVhbGl0eSA9ICVkLCBpbnQgbG9ja2FibGUgPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG11bHRpU2FtcGxlLCBtdWx0aVNhbXBsZVF1YWxpdHksIGxvY2thYmxlLCBzdXJmYWNlLCBzaGFyZWRIYW5kbGUpOworCisJCSpzdXJmYWNlID0gMDsKKworCQlpZih3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwIHx8IGQzZDktPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgRDNEVVNBR0VfUkVOREVSVEFSR0VULCBEM0RSVFlQRV9TVVJGQUNFLCBmb3JtYXQpICE9IEQzRF9PSyB8fCBoZWlnaHQgPiBPVVRMSU5FX1JFU09MVVRJT04pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnN1cmZhY2UgPSBuZXcgRGlyZWN0M0RTdXJmYWNlOSh0aGlzLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIEQzRFBPT0xfREVGQVVMVCwgbXVsdGlTYW1wbGUsIG11bHRpU2FtcGxlUXVhbGl0eSwgbG9ja2FibGUgIT0gRkFMU0UsIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCk7CisKKwkJaWYoISpzdXJmYWNlKQorCQl7CisJCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKKwkJfQorCisJCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQorCQl7CisJCQlkZWxldGUgKnN1cmZhY2U7CisJCQkqc3VyZmFjZSA9IDA7CisKKwkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7CisJCX0KKworCQkoKnN1cmZhY2UpLT5BZGRSZWYoKTsKKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVN0YXRlQmxvY2soRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSwgSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJEM0RTVEFURUJMT0NLVFlQRSB0eXBlID0gJWQsIElEaXJlY3QzRFN0YXRlQmxvY2s5ICoqc3RhdGVCbG9jayA9IDB4JTAuOHAiLCB0eXBlLCBzdGF0ZUJsb2NrKTsKKworCQkqc3RhdGVCbG9jayA9IG5ldyBEaXJlY3QzRFN0YXRlQmxvY2s5KHRoaXMsIHR5cGUpOworCisJCWlmKCEqc3RhdGVCbG9jaykKKwkJeworCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7CisJCX0KKworCQkoKnN0YXRlQmxvY2spLT5BZGRSZWYoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RUZXh0dXJlOSAqKnRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCB3aWR0aCA9ICVkLCB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gJWQsIHVuc2lnbmVkIGludCBsZXZlbHMgPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIEQzRFBPT0wgcG9vbCA9ICVkLCBJRGlyZWN0M0RUZXh0dXJlOSAqKnRleHR1cmUgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIHdpZHRoLCBoZWlnaHQsIGxldmVscywgdXNhZ2UsIGZvcm1hdCwgcG9vbCwgdGV4dHVyZSwgc2hhcmVkSGFuZGxlKTsKKworCQkqdGV4dHVyZSA9IDA7CisKKwkJaWYod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCB8fCAodXNhZ2UgJiBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQICYmIGxldmVscyA+IDEpIHx8IGQzZDktPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgdXNhZ2UsIEQzRFJUWVBFX1RFWFRVUkUsIGZvcm1hdCkgIT0gRDNEX09LKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSp0ZXh0dXJlID0gbmV3IERpcmVjdDNEVGV4dHVyZTkodGhpcywgd2lkdGgsIGhlaWdodCwgbGV2ZWxzLCB1c2FnZSwgZm9ybWF0LCBwb29sKTsKKworCQlpZighKnRleHR1cmUpCisJCXsKKwkJCXJldHVybiBPVVRPRk1FTU9SWSgpOworCQl9CisKKwkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCisJCXsKKwkJCWRlbGV0ZSAqdGV4dHVyZTsKKwkJCSp0ZXh0dXJlID0gMDsKKworCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKKwkJfQorCisJCSgqdGV4dHVyZSktPkFkZFJlZigpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVZlcnRleEJ1ZmZlcih1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCB1bnNpZ25lZCBsb25nIEZWRiwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICoqdmVydGV4QnVmZmVyLCB2b2lkICoqc2hhcmVkSGFuZGxlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgbGVuZ3RoID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgdW5zaWduZWQgbG9uZyBGVkYgPSAweCUwLjhYLCBEM0RQT09MIHBvb2wgPSAlZCwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqKnZlcnRleEJ1ZmZlciA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgbGVuZ3RoLCB1c2FnZSwgRlZGLCBwb29sLCB2ZXJ0ZXhCdWZmZXIsIHNoYXJlZEhhbmRsZSk7CisKKwkJKnZlcnRleEJ1ZmZlciA9IG5ldyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjkodGhpcywgbGVuZ3RoLCB1c2FnZSwgRlZGLCBwb29sKTsKKworCQlpZighKnZlcnRleEJ1ZmZlcikKKwkJeworCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7CisJCX0KKworCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKKwkJeworCQkJZGVsZXRlICp2ZXJ0ZXhCdWZmZXI7CisJCQkqdmVydGV4QnVmZmVyID0gMDsKKworCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKKwkJfQorCisJCSgqdmVydGV4QnVmZmVyKS0+QWRkUmVmKCk7CisJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVZlcnRleERlY2xhcmF0aW9uKGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5ICp2ZXJ0ZXhFbGVtZW50cywgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICoqZGVjbGFyYXRpb24pCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoImNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5ICp2ZXJ0ZXhFbGVtZW50cyA9IDB4JTAuOHAsIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uID0gMHglMC44cCIsIHZlcnRleEVsZW1lbnRzLCBkZWNsYXJhdGlvbik7CisKKwkJaWYoIWRlY2xhcmF0aW9uKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5ICplbGVtZW50ID0gdmVydGV4RWxlbWVudHM7CisKKwkJd2hpbGUoZWxlbWVudC0+U3RyZWFtICE9IDB4RkYpCisJCXsKKwkJCWlmKGVsZW1lbnQtPlR5cGUgPiBEM0RERUNMVFlQRV9VTlVTRUQpICAgLy8gRklYTUU6IENoZWNrIG90aGVyIGZpZWxkcyB0b28KKwkJCXsKKwkJCQlyZXR1cm4gRkFJTCgpOworCQkJfQorCisJCQllbGVtZW50Kys7CisJCX0KKworCQkqZGVjbGFyYXRpb24gPSBuZXcgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkodGhpcywgdmVydGV4RWxlbWVudHMpOworCisJCWlmKCEqZGVjbGFyYXRpb24pCisJCXsKKwkJCXJldHVybiBPVVRPRk1FTU9SWSgpOworCQl9CisKKwkJKCpkZWNsYXJhdGlvbiktPkFkZFJlZigpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVZlcnRleFNoYWRlcihjb25zdCB1bnNpZ25lZCBsb25nICpmdW5jdGlvbiwgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqKnNoYWRlcikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24gPSAweCUwLjhwLCBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICoqc2hhZGVyID0gMHglMC44cCIsIGZ1bmN0aW9uLCBzaGFkZXIpOworCisJCWlmKCFzaGFkZXIpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnNoYWRlciA9IDA7CisKKwkJaWYoIXN3OjpWZXJ0ZXhTaGFkZXI6OnZhbGlkYXRlKGZ1bmN0aW9uKSB8fCBmdW5jdGlvblswXSA+IHZlcnRleFNoYWRlclZlcnNpb25YKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsgICAvLyBTaGFkZXIgY29udGFpbnMgdW5zdXBwb3J0ZWQgb3BlcmF0aW9ucworCQl9CisKKwkJKnNoYWRlciA9IG5ldyBEaXJlY3QzRFZlcnRleFNoYWRlcjkodGhpcywgZnVuY3Rpb24pOworCisJCWlmKCEqc2hhZGVyKQorCQl7CisJCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKKwkJfQorCisJCSgqc2hhZGVyKS0+QWRkUmVmKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlVm9sdW1lVGV4dHVyZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBkZXB0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqKnZvbHVtZVRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCB3aWR0aCA9ICVkLCB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gJWQsIHVuc2lnbmVkIGludCBkZXB0aCA9ICVkLCB1bnNpZ25lZCBpbnQgbGV2ZWxzID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RQT09MIHBvb2wgPSAlZCwgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTkgKip2b2x1bWVUZXh0dXJlID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgbGV2ZWxzLCB1c2FnZSwgZm9ybWF0LCBwb29sLCB2b2x1bWVUZXh0dXJlLCBzaGFyZWRIYW5kbGUpOworCisJCSp2b2x1bWVUZXh0dXJlID0gMDsKKworCQlpZih3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwIHx8IGRlcHRoID09IDAgfHwgKHVzYWdlICYgRDNEVVNBR0VfQVVUT0dFTk1JUE1BUCAmJiBsZXZlbHMgPiAxKSB8fCBkM2Q5LT5DaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBkZXZpY2VUeXBlLCBEM0RGTVRfWDhSOEc4QjgsIHVzYWdlLCBEM0RSVFlQRV9WT0xVTUVURVhUVVJFLCBmb3JtYXQpICE9IEQzRF9PSykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqdm9sdW1lVGV4dHVyZSA9IG5ldyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5KHRoaXMsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wpOwkKKworCQlpZighKnZvbHVtZVRleHR1cmUpCisJCXsKKwkJCXJldHVybiBPVVRPRk1FTU9SWSgpOworCQl9CisKKwkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCisJCXsKKwkJCWRlbGV0ZSAqdm9sdW1lVGV4dHVyZTsKKwkJCSp2b2x1bWVUZXh0dXJlID0gMDsKKworCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKKwkJfQorCisJCSgqdm9sdW1lVGV4dHVyZSktPkFkZFJlZigpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkRlbGV0ZVBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBoYW5kbGUgPSAlZCIsIGhhbmRsZSk7CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkRyYXdJbmRleGVkUHJpbWl0aXZlKEQzRFBSSU1JVElWRVRZUEUgdHlwZSwgaW50IGJhc2VWZXJ0ZXhJbmRleCwgdW5zaWduZWQgaW50IG1pbkluZGV4LCB1bnNpZ25lZCBpbnQgbnVtVmVydGljZXMsIHVuc2lnbmVkIGludCBzdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRFBSSU1JVElWRVRZUEUgdHlwZSA9ICVkLCBpbnQgYmFzZVZlcnRleEluZGV4ID0gJWQsIHVuc2lnbmVkIGludCBtaW5JbmRleCA9ICVkLCB1bnNpZ25lZCBpbnQgbnVtVmVydGljZXMgPSAlZCwgdW5zaWduZWQgaW50IHN0YXJ0SW5kZXggPSAlZCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50ID0gJWQiLCB0eXBlLCBiYXNlVmVydGV4SW5kZXgsIG1pbkluZGV4LCBudW1WZXJ0aWNlcywgc3RhcnRJbmRleCwgcHJpbWl0aXZlQ291bnQpOworCisJCWlmKCFpbmRleERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoIWJpbmRSZXNvdXJjZXMoaW5kZXhEYXRhKSB8fCAhcHJpbWl0aXZlQ291bnQpCisJCXsKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKworCQl1bnNpZ25lZCBpbnQgaW5kZXhPZmZzZXQgPSBzdGFydEluZGV4ICogKGluZGV4RGF0YS0+aXMzMkJpdCgpID8gNCA6IDIpOyAgIC8vIEZJWE1FOiBEb2Vzbid0IHRha2Ugc3RyZWFtIGZyZXF1ZW5jaWVzIGludG8gYWNjb3VudAorCisJCXN3OjpDb250ZXh0OjpEcmF3VHlwZSBkcmF3VHlwZTsKKworCQlpZihpbmRleERhdGEtPmlzMzJCaXQoKSkKKwkJeworCQkJc3dpdGNoKHR5cGUpCisJCQl7CisJCQljYXNlIEQzRFBUX1BPSU5UTElTVDoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfSU5ERVhFRFBPSU5UTElTVDMyOwkJYnJlYWs7CisJCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19JTkRFWEVETElORUxJU1QzMjsJCQlicmVhazsKKwkJCWNhc2UgRDNEUFRfTElORVNUUklQOgkJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19JTkRFWEVETElORVNUUklQMzI7CQlicmVhazsKKwkJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRUxJU1QzMjsJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMzI7CWJyZWFrOworCQkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMzI7CQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXN3aXRjaCh0eXBlKQorCQkJeworCQkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX0lOREVYRURQT0lOVExJU1QxNjsJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9MSU5FTElTVDoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfSU5ERVhFRExJTkVMSVNUMTY7CQkJYnJlYWs7CisJCQljYXNlIEQzRFBUX0xJTkVTVFJJUDoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfSU5ERVhFRExJTkVTVFJJUDE2OwkJYnJlYWs7CisJCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMTY7CQlicmVhazsKKwkJCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDE2OwlicmVhazsKKwkJCWNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CQlkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRUZBTjE2OwkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKworCQlpZigoc3RyZWFtU291cmNlRnJlcVswXSAmIEQzRFNUUkVBTVNPVVJDRV9JTkRFWEVEREFUQSkgJiYgaW5zdGFuY2VEYXRhKCkpCisJCXsKKwkJCWludCBpbnN0YW5jZUNvdW50ID0gKHN0cmVhbVNvdXJjZUZyZXFbMF0gJiB+RDNEU1RSRUFNU09VUkNFX0lOREVYRUREQVRBKTsKKworCQkJZm9yKGludCBpbnN0YW5jZSA9IDA7IGluc3RhbmNlIDwgaW5zdGFuY2VDb3VudDsgaW5zdGFuY2UrKykKKwkJCXsKKwkJCQliaW5kVmVydGV4U3RyZWFtcyhiYXNlVmVydGV4SW5kZXgsIHRydWUsIGluc3RhbmNlKTsKKwkJCQlyZW5kZXJlci0+ZHJhdyhkcmF3VHlwZSwgaW5kZXhPZmZzZXQsIHByaW1pdGl2ZUNvdW50LCBpbnN0YW5jZSA9PSAwKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWJpbmRWZXJ0ZXhTdHJlYW1zKGJhc2VWZXJ0ZXhJbmRleCwgZmFsc2UsIDApOworCQkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIGluZGV4T2Zmc2V0LCBwcmltaXRpdmVDb3VudCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpEcmF3SW5kZXhlZFByaW1pdGl2ZVVQKEQzRFBSSU1JVElWRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IG1pbkluZGV4LCB1bnNpZ25lZCBpbnQgbnVtVmVydGljZXMsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqaW5kZXhEYXRhLCBEM0RGT1JNQVQgaW5kZXhEYXRhRm9ybWF0LCBjb25zdCB2b2lkICp2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdW5zaWduZWQgaW50IHZlcnRleFN0cmVhbVplcm9TdHJpZGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRFBSSU1JVElWRVRZUEUgdHlwZSA9ICVkLCB1bnNpZ25lZCBpbnQgbWluSW5kZXggPSAlZCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzID0gJWQsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCA9ICVkLCBjb25zdCB2b2lkICppbmRleERhdGEgPSAweCUwLjhwLCBEM0RGT1JNQVQgaW5kZXhEYXRhRm9ybWF0ID0gJWQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IHZlcnRleFN0cmVhbVplcm9TdHJpZGUgPSAlZCIsIHR5cGUsIG1pbkluZGV4LCBudW1WZXJ0aWNlcywgcHJpbWl0aXZlQ291bnQsIGluZGV4RGF0YSwgaW5kZXhEYXRhRm9ybWF0LCB2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7CisKKwkJaWYoIXZlcnRleFN0cmVhbVplcm9EYXRhIHx8ICFpbmRleERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaW50IGxlbmd0aCA9IChtaW5JbmRleCArIG51bVZlcnRpY2VzKSAqIHZlcnRleFN0cmVhbVplcm9TdHJpZGU7CisJCQorCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKnZlcnRleEJ1ZmZlciA9IG5ldyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjkodGhpcywgbGVuZ3RoLCAwLCAwLCBEM0RQT09MX0RFRkFVTFQpOworCisJCXZvaWQgKmRhdGE7CisJCXZlcnRleEJ1ZmZlci0+TG9jaygwLCAwLCAmZGF0YSwgMCk7CisJCW1lbWNweShkYXRhLCB2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgbGVuZ3RoKTsKKwkJdmVydGV4QnVmZmVyLT5VbmxvY2soKTsKKworCQlTZXRTdHJlYW1Tb3VyY2UoMCwgdmVydGV4QnVmZmVyLCAwLCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsKKworCQlzd2l0Y2godHlwZSkKKwkJeworCQljYXNlIEQzRFBUX1BPSU5UTElTVDoJCWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50OwkJYnJlYWs7CisJCWNhc2UgRDNEUFRfTElORUxJU1Q6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudCAqIDI7CWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVTVFJJUDoJCWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICsgMTsJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglsZW5ndGggPSBwcmltaXRpdmVDb3VudCAqIDM7CWJyZWFrOworCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6CWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICsgMjsJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDI7CWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWxlbmd0aCAqPSBpbmRleERhdGFGb3JtYXQgPT0gRDNERk1UX0lOREVYMzIgPyA0IDogMjsKKworCQlEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhCdWZmZXIgPSBuZXcgRGlyZWN0M0RJbmRleEJ1ZmZlcjkodGhpcywgbGVuZ3RoLCAwLCBpbmRleERhdGFGb3JtYXQsIEQzRFBPT0xfREVGQVVMVCk7CisKKwkJaW5kZXhCdWZmZXItPkxvY2soMCwgMCwgJmRhdGEsIDApOworCQltZW1jcHkoZGF0YSwgaW5kZXhEYXRhLCBsZW5ndGgpOworCQlpbmRleEJ1ZmZlci0+VW5sb2NrKCk7CisKKwkJU2V0SW5kaWNlcyhpbmRleEJ1ZmZlcik7CisKKwkJaWYoIWJpbmRSZXNvdXJjZXMoaW5kZXhCdWZmZXIpIHx8ICFwcmltaXRpdmVDb3VudCkKKwkJeworCQkJdmVydGV4QnVmZmVyLT5SZWxlYXNlKCk7CisKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKworCQlzdzo6Q29udGV4dDo6RHJhd1R5cGUgZHJhd1R5cGU7CisKKwkJaWYoaW5kZXhEYXRhRm9ybWF0ID09IEQzREZNVF9JTkRFWDMyKQorCQl7CisJCQlzd2l0Y2godHlwZSkKKwkJCXsKKwkJCWNhc2UgRDNEUFRfUE9JTlRMSVNUOgkJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19JTkRFWEVEUE9JTlRMSVNUMzI7CQlicmVhazsKKwkJCWNhc2UgRDNEUFRfTElORUxJU1Q6CQlkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX0lOREVYRURMSU5FTElTVDMyOwkJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6CQlkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX0lOREVYRURMSU5FU1RSSVAzMjsJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDMyOwkJYnJlYWs7CisJCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6CWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFU1RSSVAzMjsJYnJlYWs7CisJCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19JTkRFWEVEVFJJQU5HTEVGQU4zMjsJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJc3dpdGNoKHR5cGUpCisJCQl7CisJCQljYXNlIEQzRFBUX1BPSU5UTElTVDoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfSU5ERVhFRFBPSU5UTElTVDE2OwkJYnJlYWs7CisJCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19JTkRFWEVETElORUxJU1QxNjsJCQlicmVhazsKKwkJCWNhc2UgRDNEUFRfTElORVNUUklQOgkJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19JTkRFWEVETElORVNUUklQMTY7CQlicmVhazsKKwkJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRUxJU1QxNjsJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMTY7CWJyZWFrOworCQkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMTY7CQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCisJCWJpbmRWZXJ0ZXhTdHJlYW1zKDAsIGZhbHNlLCAwKTsKKwkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIDAsIHByaW1pdGl2ZUNvdW50KTsKKworCQlTZXRTdHJlYW1Tb3VyY2UoMCwgMCwgMCwgMCk7CisJCVNldEluZGljZXMoMCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6RHJhd1ByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBzdGFydFZlcnRleCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUgPSAlZCwgdW5zaWduZWQgaW50IHN0YXJ0VmVydGV4ID0gJWQsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCA9ICVkIiwgcHJpbWl0aXZlVHlwZSwgc3RhcnRWZXJ0ZXgsIHByaW1pdGl2ZUNvdW50KTsKKworCQlpZighYmluZFJlc291cmNlcygwKSB8fCAhcHJpbWl0aXZlQ291bnQpCisJCXsKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKworCQlzdzo6Q29udGV4dDo6RHJhd1R5cGUgZHJhd1R5cGU7CisKKwkJc3dpdGNoKHByaW1pdGl2ZVR5cGUpCisJCXsKKwkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX1BPSU5UTElTVDsJCWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19MSU5FTElTVDsJCWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVTVFJJUDoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfTElORVNUUklQOwkJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX1RSSUFOR0xFTElTVDsJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19UUklBTkdMRVNUUklQOwlicmVhazsKKwkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfVFJJQU5HTEVGQU47CWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWJpbmRWZXJ0ZXhTdHJlYW1zKHN0YXJ0VmVydGV4LCBmYWxzZSwgMCk7CisJCXJlbmRlcmVyLT5kcmF3KGRyYXdUeXBlLCAwLCBwcmltaXRpdmVDb3VudCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6RHJhd1ByaW1pdGl2ZVVQKEQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlVHlwZSwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50LCBjb25zdCB2b2lkICp2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdW5zaWduZWQgaW50IHZlcnRleFN0cmVhbVplcm9TdHJpZGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlVHlwZSA9ICVkLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQgPSAlZCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSA9ICVkIiwgcHJpbWl0aXZlVHlwZSwgcHJpbWl0aXZlQ291bnQsIHZlcnRleFN0cmVhbVplcm9EYXRhLCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsKKworCQlpZighdmVydGV4U3RyZWFtWmVyb0RhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqdmVydGV4QnVmZmVyID0gMDsKKwkJaW50IGxlbmd0aCA9IDA7CisKKwkJc3dpdGNoKHByaW1pdGl2ZVR5cGUpCisJCXsKKwkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudDsJCWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKiAyOwlicmVhazsKKwkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDE7CWJyZWFrOworCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKiAzOwlicmVhazsKKwkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDI7CWJyZWFrOworCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKyAyOwlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlsZW5ndGggKj0gdmVydGV4U3RyZWFtWmVyb1N0cmlkZTsKKworCQlDcmVhdGVWZXJ0ZXhCdWZmZXIobGVuZ3RoLCAwLCAwLCBEM0RQT09MX0RFRkFVTFQsICZ2ZXJ0ZXhCdWZmZXIsIDApOworCQkKKwkJdm9pZCAqZGF0YTsKKwkJdmVydGV4QnVmZmVyLT5Mb2NrKDAsIDAsICZkYXRhLCAwKTsKKwkJbWVtY3B5KGRhdGEsIHZlcnRleFN0cmVhbVplcm9EYXRhLCBsZW5ndGgpOworCQl2ZXJ0ZXhCdWZmZXItPlVubG9jaygpOworCisJCVNldFN0cmVhbVNvdXJjZSgwLCB2ZXJ0ZXhCdWZmZXIsIDAsIHZlcnRleFN0cmVhbVplcm9TdHJpZGUpOworCisJCWlmKCFiaW5kUmVzb3VyY2VzKDApIHx8ICFwcmltaXRpdmVDb3VudCkKKwkJeworCQkJdmVydGV4QnVmZmVyLT5SZWxlYXNlKCk7CisKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKworCQlzdzo6Q29udGV4dDo6RHJhd1R5cGUgZHJhd1R5cGU7CisKKwkJc3dpdGNoKHByaW1pdGl2ZVR5cGUpCisJCXsKKwkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX1BPSU5UTElTVDsJCWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19MSU5FTElTVDsJCWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVTVFJJUDoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfTElORVNUUklQOwkJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglkcmF3VHlwZSA9IHN3OjpDb250ZXh0OjpEUkFXX1RSSUFOR0xFTElTVDsJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoJZHJhd1R5cGUgPSBzdzo6Q29udGV4dDo6RFJBV19UUklBTkdMRVNUUklQOwlicmVhazsKKwkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWRyYXdUeXBlID0gc3c6OkNvbnRleHQ6OkRSQVdfVFJJQU5HTEVGQU47CWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWJpbmRWZXJ0ZXhTdHJlYW1zKDAsIGZhbHNlLCAwKTsKKwkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIDAsIHByaW1pdGl2ZUNvdW50KTsKKworCQlTZXRTdHJlYW1Tb3VyY2UoMCwgMCwgMCwgMCk7CisJCXZlcnRleEJ1ZmZlci0+UmVsZWFzZSgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkRyYXdSZWN0UGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFJFQ1RQQVRDSF9JTkZPICpyZWN0UGF0Y2hJbmZvKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaGFuZGxlID0gJWQsIGNvbnN0IGZsb2F0ICpudW1TZWdzID0gMHglMC44cCwgY29uc3QgRDNEUkVDVFBBVENIX0lORk8gKnJlY3RQYXRjaEluZm8gPSAweCUwLjhwIiwgaGFuZGxlLCBudW1TZWdzLCByZWN0UGF0Y2hJbmZvKTsKKworCQlpZighbnVtU2VncyB8fCAhcmVjdFBhdGNoSW5mbykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6RHJhd1RyaVBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUsIGNvbnN0IGZsb2F0ICpudW1TZWdzLCBjb25zdCBEM0RUUklQQVRDSF9JTkZPICp0cmlQYXRjaEluZm8pCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBoYW5kbGUgPSAlZCwgY29uc3QgZmxvYXQgKm51bVNlZ3MgPSAweCUwLjhwLCBjb25zdCBEM0RUUklQQVRDSF9JTkZPICp0cmlQYXRjaEluZm8gPSAweCUwLjhwIiwgaGFuZGxlLCBudW1TZWdzLCB0cmlQYXRjaEluZm8pOworCisJCWlmKCFudW1TZWdzIHx8ICF0cmlQYXRjaEluZm8pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkVuZFNjZW5lKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkVuZFN0YXRlQmxvY2soSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqKnN0YXRlQmxvY2sgPSAweCUwLjhwIiwgc3RhdGVCbG9jayk7CisKKwkJaWYoIXN0YXRlQmxvY2spCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnN0YXRlQmxvY2sgPSAwOworCQkJCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpzdGF0ZUJsb2NrID0gc3RhdGVSZWNvcmRlcjsKKwkJc3RhdGVSZWNvcmRlci0+QWRkUmVmKCk7CisJCXN0YXRlUmVjb3JkZXItPnVuYmluZCgpOworCQlzdGF0ZVJlY29yZGVyID0gMDsgICAvLyBTdG9wIHJlY29yZGluZworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkV2aWN0TWFuYWdlZFJlc291cmNlcygpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInZvaWQiKTsKKworCQkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJdW5zaWduZWQgaW50IERpcmVjdDNERGV2aWNlOTo6R2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlpbnQgYXZhaWxhYmxlTWVtb3J5ID0gdGV4dHVyZU1lbW9yeSAtIERpcmVjdDNEUmVzb3VyY2U5OjpnZXRNZW1vcnlVc2FnZSgpOworCQlpZihhdmFpbGFibGVNZW1vcnkgPCAwKSBhdmFpbGFibGVNZW1vcnkgPSAwOworCisJCS8vIFJvdW5kIHRvIG5lYXJlc3QgTUIKKwkJcmV0dXJuIChhdmFpbGFibGVNZW1vcnkgKyAweDgwMDAwKSAmIDB4RkZGMDAwMDA7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldEJhY2tCdWZmZXIodW5zaWduZWQgaW50IHN3YXBDaGFpbkluZGV4LCB1bnNpZ25lZCBpbnQgYmFja0J1ZmZlckluZGV4LCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSwgSURpcmVjdDNEU3VyZmFjZTkgKipiYWNrQnVmZmVyKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3dhcENoYWluSW5kZXggPSAlZCwgdW5zaWduZWQgaW50IGJhY2tCdWZmZXJJbmRleCA9ICVkLCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqKmJhY2tCdWZmZXIgPSAweCUwLjhwIiwgc3dhcENoYWluSW5kZXgsIGJhY2tCdWZmZXJJbmRleCwgdHlwZSwgYmFja0J1ZmZlcik7CisKKwkJaWYoc3dhcENoYWluSW5kZXggPj0gR2V0TnVtYmVyT2ZTd2FwQ2hhaW5zKCkpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcmV0dXJuIHN3YXBDaGFpbi0+R2V0QmFja0J1ZmZlcihiYWNrQnVmZmVySW5kZXgsIHR5cGUsIGJhY2tCdWZmZXIpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRDbGlwUGxhbmUodW5zaWduZWQgbG9uZyBpbmRleCwgZmxvYXQgKnBsYW5lKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIGZsb2F0ICpwbGFuZSA9IDB4JTAuOHAiLCBpbmRleCwgcGxhbmUpOworCisJCWlmKCFwbGFuZSB8fCBpbmRleCA+PSA2KQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXBsYW5lWzBdID0gdGhpcy0+cGxhbmVbaW5kZXhdWzBdOworCQlwbGFuZVsxXSA9IHRoaXMtPnBsYW5lW2luZGV4XVsxXTsKKwkJcGxhbmVbMl0gPSB0aGlzLT5wbGFuZVtpbmRleF1bMl07CisJCXBsYW5lWzNdID0gdGhpcy0+cGxhbmVbaW5kZXhdWzNdOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldENsaXBTdGF0dXMoRDNEQ0xJUFNUQVRVUzkgKmNsaXBTdGF0dXMpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzID0gMHglMC44cCIsIGNsaXBTdGF0dXMpOworCisJCWlmKCFjbGlwU3RhdHVzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpjbGlwU3RhdHVzID0gdGhpcy0+Y2xpcFN0YXR1czsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRDcmVhdGlvblBhcmFtZXRlcnMoRDNEREVWSUNFX0NSRUFUSU9OX1BBUkFNRVRFUlMgKnBhcmFtZXRlcnMpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTICpwYXJhbWV0ZXJzID0gMHglMC44cCIsIHBhcmFtZXRlcnMpOworCisJCWlmKCFwYXJhbWV0ZXJzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXBhcmFtZXRlcnMtPkFkYXB0ZXJPcmRpbmFsID0gYWRhcHRlcjsKKwkJcGFyYW1ldGVycy0+QmVoYXZpb3JGbGFncyA9IGJlaGF2aW91ckZsYWdzOworCQlwYXJhbWV0ZXJzLT5EZXZpY2VUeXBlID0gZGV2aWNlVHlwZTsKKwkJcGFyYW1ldGVycy0+aEZvY3VzV2luZG93ID0gZm9jdXNXaW5kb3c7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCAqcGFsZXR0ZU51bWJlcikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50ICpwYWxldHRlTnVtYmVyID0gMHglMC44cCIsIHBhbGV0dGVOdW1iZXIpOworCisJCWlmKCFwYWxldHRlTnVtYmVyKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpwYWxldHRlTnVtYmVyID0gY3VycmVudFBhbGV0dGU7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0RGVwdGhTdGVuY2lsU3VyZmFjZShJRGlyZWN0M0RTdXJmYWNlOSAqKmRlcHRoU3RlbmNpbFN1cmZhY2UpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIklEaXJlY3QzRFN1cmZhY2U5ICoqZGVwdGhTdGVuY2lsU3VyZmFjZSA9IDB4JTAuOHAiLCBkZXB0aFN0ZW5jaWxTdXJmYWNlKTsKKworCQlpZighZGVwdGhTdGVuY2lsU3VyZmFjZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqZGVwdGhTdGVuY2lsU3VyZmFjZSA9IGRlcHRoU3RlbmNpbDsKKworCQlpZihkZXB0aFN0ZW5jaWwpCisJCXsKKwkJCWRlcHRoU3RlbmNpbC0+QWRkUmVmKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gTk9URk9VTkQoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldERldmljZUNhcHMoRDNEQ0FQUzkgKmNhcHMpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRENBUFM5ICpjYXBzID0gMHglMC44cCIsIGNhcHMpOworCisJCXJldHVybiBkM2Q5LT5HZXREZXZpY2VDYXBzKEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwsIGNhcHMpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXREaXJlY3QzRChJRGlyZWN0M0Q5ICoqZDNkOSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiSURpcmVjdDNEOSAqKmQzZDkgPSAweCUwLjhwIiwgZDNkOSk7CisKKwkJaWYoIWQzZDkpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKmQzZDkgPSB0aGlzLT5kM2Q5OworCQl0aGlzLT5kM2Q5LT5BZGRSZWYoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXREaXNwbGF5TW9kZSh1bnNpZ25lZCBpbnQgaW5kZXgsIEQzRERJU1BMQVlNT0RFICptb2RlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgRDNERElTUExBWU1PREUgKm1vZGUgPSAweCUwLjhwIiwgaW5kZXgsIG1vZGUpOworCisJCWlmKGluZGV4ID49IEdldE51bWJlck9mU3dhcENoYWlucygpKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXJldHVybiBzd2FwQ2hhaW4tPkdldERpc3BsYXlNb2RlKG1vZGUpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRGcm9udEJ1ZmZlckRhdGEodW5zaWduZWQgaW50IGluZGV4LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBpbmRleCA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UgPSAlcCIsIGluZGV4LCBkZXN0U3VyZmFjZSk7CisKKwkJaWYoaW5kZXggPj0gR2V0TnVtYmVyT2ZTd2FwQ2hhaW5zKCkpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcmV0dXJuIHN3YXBDaGFpbi0+R2V0RnJvbnRCdWZmZXJEYXRhKGRlc3RTdXJmYWNlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0RlZGKHVuc2lnbmVkIGxvbmcgKkZWRikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgbG9uZyAqRlZGID0gMHglMC44cCIsIEZWRik7CisKKwkJaWYoIUZWRikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZih2ZXJ0ZXhEZWNsYXJhdGlvbikKKwkJeworCQkJKkZWRiA9IHZlcnRleERlY2xhcmF0aW9uLT5nZXRGVkYoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSpGVkYgPSAwOwkKKwkJfQorCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlOTo6R2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBpbmRleCwgRDNER0FNTUFSQU1QICpyYW1wKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgRDNER0FNTUFSQU1QICpyYW1wID0gMHglMC44cCIsIGluZGV4LCByYW1wKTsKKworCQlpZighcmFtcCB8fCBpbmRleCA+PSBHZXROdW1iZXJPZlN3YXBDaGFpbnMoKSkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJc3dhcENoYWluLT5nZXRHYW1tYVJhbXAoKHN3OjpHYW1tYVJhbXAqKXJhbXApOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRJbmRpY2VzKElEaXJlY3QzREluZGV4QnVmZmVyOSAqKmluZGV4RGF0YSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiSURpcmVjdDNESW5kZXhCdWZmZXI5ICoqaW5kZXhEYXRhID0gMHglMC44cCIsIGluZGV4RGF0YSk7CisKKwkJaWYoIWluZGV4RGF0YSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqaW5kZXhEYXRhID0gdGhpcy0+aW5kZXhEYXRhOworCisJCWlmKHRoaXMtPmluZGV4RGF0YSkKKwkJeworCQkJdGhpcy0+aW5kZXhEYXRhLT5BZGRSZWYoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRExJR0hUOSAqbGlnaHQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgaW5kZXggPSAlZCwgRDNETElHSFQ5ICpsaWdodCA9IDB4JTAuOHAiLCBpbmRleCwgbGlnaHQpOworCisJCWlmKCFsaWdodCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZighdGhpcy0+bGlnaHQuZXhpc3RzKGluZGV4KSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqbGlnaHQgPSB0aGlzLT5saWdodFtpbmRleF07CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgKmVuYWJsZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBpbmRleCA9ICVkLCBpbnQgKmVuYWJsZSA9IDB4JTAuOHAiLCBpbmRleCwgZW5hYmxlKTsKKworCQlpZighZW5hYmxlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFsaWdodC5leGlzdHMoaW5kZXgpKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSplbmFibGUgPSBsaWdodFtpbmRleF0uZW5hYmxlID8gMTI4IDogMDsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRNYXRlcmlhbChEM0RNQVRFUklBTDkgKm1hdGVyaWFsKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJEM0RNQVRFUklBTDkgKm1hdGVyaWFsID0gMHglMC44cCIsIG1hdGVyaWFsKTsKKworCQlpZighbWF0ZXJpYWwpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKm1hdGVyaWFsID0gdGhpcy0+bWF0ZXJpYWw7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlmbG9hdCBEaXJlY3QzRERldmljZTk6OkdldE5QYXRjaE1vZGUoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ2b2lkIik7CisKKwkJcmV0dXJuIDAuMGY7ICAgLy8gRklYTUU6IFVuaW1wbGVtZW50ZWQKKwl9CisKKwl1bnNpZ25lZCBpbnQgRGlyZWN0M0REZXZpY2U5OjpHZXROdW1iZXJPZlN3YXBDaGFpbnMoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ2b2lkIik7CisKKwkJcmV0dXJuIDE7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyID0gJWQsIFBBTEVUVEVFTlRSWSAqZW50cmllcyA9IDB4JTAuOHAiLCBwYWxldHRlTnVtYmVyLCBlbnRyaWVzKTsKKworCQlpZihwYWxldHRlTnVtYmVyID4gMHhGRkZGIHx8ICFlbnRyaWVzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJeworCQkJZW50cmllc1tpXSA9IHBhbGV0dGVbcGFsZXR0ZU51bWJlcl0uZW50cnlbaV07CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRQaXhlbFNoYWRlcihJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKipzaGFkZXIpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIklEaXJlY3QzRFBpeGVsU2hhZGVyOSAqKnNoYWRlciA9IDB4JTAuOHAiLCBzaGFkZXIpOworCisJCWlmKCFzaGFkZXIpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYocGl4ZWxTaGFkZXIpCisJCXsKKwkJCXBpeGVsU2hhZGVyLT5BZGRSZWYoKTsKKwkJfQorCisJCSpzaGFkZXIgPSBwaXhlbFNoYWRlcjsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCisJCWlmKCFjb25zdGFudERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCWNvbnN0YW50RGF0YVtpXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRCW3N0YXJ0UmVnaXN0ZXIgKyBpXTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKworCQlpZighY29uc3RhbnREYXRhKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl7CisJCQljb25zdGFudERhdGFbaSAqIDQgKyAwXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVswXTsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDFdID0gcGl4ZWxTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzFdOworCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMl0gPSBwaXhlbFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bMl07CisJCQljb25zdGFudERhdGFbaSAqIDQgKyAzXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVszXTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisKKwkJaWYoIWNvbnN0YW50RGF0YSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJeworCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMF0gPSBwaXhlbFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyICsgaV1bMF07CisJCQljb25zdGFudERhdGFbaSAqIDQgKyAxXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXTsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDJdID0gcGl4ZWxTaGFkZXJDb25zdGFudElbc3RhcnRSZWdpc3RlciArIGldWzJdOworCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgM10gPSBwaXhlbFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyICsgaV1bM107CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRSYXN0ZXJTdGF0dXModW5zaWduZWQgaW50IGluZGV4LCBEM0RSQVNURVJfU1RBVFVTICpyYXN0ZXJTdGF0dXMpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzd2FwQ2hhaW4gPSAlZCwgRDNEUkFTVEVSX1NUQVRVUyAqcmFzdGVyU3RhdHVzID0gMHglMC44cCIsIGluZGV4LCByYXN0ZXJTdGF0dXMpOworCisJCWlmKGluZGV4ID49IEdldE51bWJlck9mU3dhcENoYWlucygpKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXJldHVybiBzd2FwQ2hhaW4tPkdldFJhc3RlclN0YXR1cyhyYXN0ZXJTdGF0dXMpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUgPSAlZCwgdW5zaWduZWQgbG9uZyAqdmFsdWUgPSAweCUwLjhwIiwgc3RhdGUsIHZhbHVlKTsKKworCQlpZighdmFsdWUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnZhbHVlID0gcmVuZGVyU3RhdGVbc3RhdGVdOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFJlbmRlclRhcmdldCh1bnNpZ25lZCBsb25nIGluZGV4LCBJRGlyZWN0M0RTdXJmYWNlOSAqKnJlbmRlclRhcmdldCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBpbmRleCA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnJlbmRlclRhcmdldCA9IDB4JTAuOHAiLCBpbmRleCwgcmVuZGVyVGFyZ2V0KTsKKworCQlpZihpbmRleCA+PSA0IHx8ICFyZW5kZXJUYXJnZXQpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnJlbmRlclRhcmdldCA9IDA7CisKKwkJaWYoIXRoaXMtPnJlbmRlclRhcmdldFtpbmRleF0pCisJCXsKKwkJCXJldHVybiBOT1RGT1VORCgpOworCQl9CisKKwkJKnJlbmRlclRhcmdldCA9IHRoaXMtPnJlbmRlclRhcmdldFtpbmRleF07CisJCXRoaXMtPnJlbmRlclRhcmdldFtpbmRleF0tPkFkZFJlZigpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFJlbmRlclRhcmdldERhdGEoSURpcmVjdDNEU3VyZmFjZTkgKnJlbmRlclRhcmdldCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0ID0gMHglMC44cCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlID0gMHglMC44cCIsIHJlbmRlclRhcmdldCwgZGVzdFN1cmZhY2UpOworCisJCWlmKCFyZW5kZXJUYXJnZXQgfHwgIWRlc3RTdXJmYWNlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCUQzRFNVUkZBQ0VfREVTQyBzb3VyY2VEZXNjcmlwdGlvbjsKKwkJRDNEU1VSRkFDRV9ERVNDIGRlc3RpbmF0aW9uRGVzY3JpcHRpb247CisKKwkJcmVuZGVyVGFyZ2V0LT5HZXREZXNjKCZzb3VyY2VEZXNjcmlwdGlvbik7CisJCWRlc3RTdXJmYWNlLT5HZXREZXNjKCZkZXN0aW5hdGlvbkRlc2NyaXB0aW9uKTsKKworCQlpZihzb3VyY2VEZXNjcmlwdGlvbi5XaWR0aCAgIT0gZGVzdGluYXRpb25EZXNjcmlwdGlvbi5XaWR0aCB8fAorCQkgICBzb3VyY2VEZXNjcmlwdGlvbi5IZWlnaHQgIT0gZGVzdGluYXRpb25EZXNjcmlwdGlvbi5IZWlnaHQgfHwKKwkJICAgc291cmNlRGVzY3JpcHRpb24uRm9ybWF0ICE9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uRm9ybWF0IHx8CisJCSAgIHNvdXJjZURlc2NyaXB0aW9uLk11bHRpU2FtcGxlVHlwZSAhPSBEM0RNVUxUSVNBTVBMRV9OT05FKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCA9PSBEM0RGTVRfQThSOEc4QjggfHwKKwkJICAgc291cmNlRGVzY3JpcHRpb24uRm9ybWF0ID09IEQzREZNVF9YOFI4RzhCOCkKKwkJeworCQkJc3c6OlN1cmZhY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERpcmVjdDNEU3VyZmFjZTkqPihyZW5kZXJUYXJnZXQpOworCQkJc3c6OlN1cmZhY2UgKmRlc3QgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFN1cmZhY2U5Kj4oZGVzdFN1cmZhY2UpOworCisJCQl2b2lkICpzb3VyY2VCdWZmZXIgPSBzb3VyY2UtPmxvY2tFeHRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19SRUFET05MWSwgc3c6OlBVQkxJQyk7CisJCQl2b2lkICpkZXN0QnVmZmVyID0gZGVzdC0+bG9ja0V4dGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX1dSSVRFT05MWSwgc3c6OlBVQkxJQyk7CisKKwkJCXN0YXRpYyB2b2lkIChfX2NkZWNsICpibGl0RnVuY3Rpb24pKHZvaWQgKmRzdCwgdm9pZCAqc3JjKTsKKwkJCXN0YXRpYyBzdzo6Um91dGluZSAqYmxpdFJvdXRpbmU7CisJCQlzdGF0aWMgc3c6OkJsaXRTdGF0ZSBibGl0U3RhdGUgPSB7MH07CisKKwkJCXN3OjpCbGl0U3RhdGUgdXBkYXRlOworCQkJdXBkYXRlLndpZHRoID0gc291cmNlRGVzY3JpcHRpb24uV2lkdGg7CisJCQl1cGRhdGUuaGVpZ2h0ID0gc291cmNlRGVzY3JpcHRpb24uSGVpZ2h0OworCQkJdXBkYXRlLmRlcHRoID0gMzI7CisJCQl1cGRhdGUuc3RyaWRlID0gZGVzdC0+Z2V0RXh0ZXJuYWxQaXRjaEIoKTsKKwkJCXVwZGF0ZS5IRFIgPSBmYWxzZTsKKwkJCXVwZGF0ZS5jdXJzb3JIZWlnaHQgPSAwOworCQkJdXBkYXRlLmN1cnNvcldpZHRoID0gMDsKKwkJCisJCQlpZihtZW1jbXAoJmJsaXRTdGF0ZSwgJnVwZGF0ZSwgc2l6ZW9mKHN3OjpCbGl0U3RhdGUpKSAhPSAwKQorCQkJeworCQkJCWJsaXRTdGF0ZSA9IHVwZGF0ZTsKKwkJCQlkZWxldGUgYmxpdFJvdXRpbmU7CisKKwkJCQlibGl0Um91dGluZSA9IHN3OjpGcmFtZUJ1ZmZlcjo6Y29weVJvdXRpbmUoYmxpdFN0YXRlKTsKKwkJCQlibGl0RnVuY3Rpb24gPSAodm9pZChfX2NkZWNsKikodm9pZCosIHZvaWQqKSlibGl0Um91dGluZS0+Z2V0RW50cnkoKTsKKwkJCX0KKworCQkJYmxpdEZ1bmN0aW9uKGRlc3RCdWZmZXIsIHNvdXJjZUJ1ZmZlcik7CisKKwkJCWRlc3QtPnVubG9ja0V4dGVybmFsKCk7CisJCQlzb3VyY2UtPnVubG9ja0V4dGVybmFsKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gVXBkYXRlU3VyZmFjZShyZW5kZXJUYXJnZXQsIDAsIGRlc3RTdXJmYWNlLCAwKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFNhbXBsZXJTdGF0ZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIHNhbXBsZXIgPSAlZCwgRDNEU0FNUExFUlNUQVRFVFlQRSB0eXBlID0gJWQsIHVuc2lnbmVkIGxvbmcgKnZhbHVlID0gMHglMC44cCIsIHNhbXBsZXIsIHN0YXRlLCB2YWx1ZSk7CisKKwkJaWYoIXZhbHVlIHx8IHN0YXRlIDwgRDNEU0FNUF9BRERSRVNTVSB8fCBzdGF0ZSA+IEQzRFNBTVBfRE1BUE9GRlNFVCkgICAvLyBGSVhNRTogU2V0ICp2YWx1ZSB0byAwPworCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKChzYW1wbGVyID49IDE2ICYmIHNhbXBsZXIgPD0gRDNERE1BUFNBTVBMRVIpIHx8IHNhbXBsZXIgPiBEM0RWRVJURVhURVhUVVJFU0FNUExFUjMpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoc2FtcGxlciA+PSBEM0RWRVJURVhURVhUVVJFU0FNUExFUjApCisJCXsKKwkJCXNhbXBsZXIgPSAxNiArIChzYW1wbGVyIC0gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwKTsKKwkJfQorCisJCSp2YWx1ZSA9IHNhbXBsZXJTdGF0ZVtzYW1wbGVyXVtzdGF0ZV07CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0U2Npc3NvclJlY3QoUkVDVCAqcmVjdCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiUkVDVCAqcmVjdCA9IDB4JTAuOHAiLCByZWN0KTsKKworCQlpZighcmVjdCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqcmVjdCA9IHNjaXNzb3JSZWN0OworCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlpbnQgRGlyZWN0M0REZXZpY2U5OjpHZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3NpbmcoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ2b2lkIik7CisKKwkJcmV0dXJuIHNvZnR3YXJlVmVydGV4UHJvY2Vzc2luZyA/IFRSVUUgOiBGQUxTRTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKipzdHJlYW1EYXRhLCB1bnNpZ25lZCBpbnQgKm9mZnNldCwgdW5zaWduZWQgaW50ICpzdHJpZGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIgPSAlZCwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqKnN0cmVhbURhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgKm9mZnNldCA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCAqc3RyaWRlID0gMHglMC44cCIsIHN0cmVhbU51bWJlciwgc3RyZWFtRGF0YSwgb2Zmc2V0LCBzdHJpZGUpOworCisJCWlmKHN0cmVhbU51bWJlciA+PSAxNiB8fCAhc3RyZWFtRGF0YSB8fCAhb2Zmc2V0IHx8ICFzdHJpZGUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnN0cmVhbURhdGEgPSBkYXRhU3RyZWFtW3N0cmVhbU51bWJlcl07CisJCQorCQlpZihkYXRhU3RyZWFtW3N0cmVhbU51bWJlcl0pCisJCXsKKwkJCWRhdGFTdHJlYW1bc3RyZWFtTnVtYmVyXS0+QWRkUmVmKCk7CisJCX0KKworCQkqb2Zmc2V0ID0gc3RyZWFtT2Zmc2V0W3N0cmVhbU51bWJlcl07CisJCSpzdHJpZGUgPSBzdHJlYW1TdHJpZGVbc3RyZWFtTnVtYmVyXTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRTdHJlYW1Tb3VyY2VGcmVxKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIHVuc2lnbmVkIGludCAqZGl2aWRlcikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0cmVhbU51bWJlciA9ICVkLCB1bnNpZ25lZCBpbnQgKmRpdmlkZXIgPSAweCUwLjhwIiwgc3RyZWFtTnVtYmVyLCBkaXZpZGVyKTsKKworCQlpZihzdHJlYW1OdW1iZXIgPj0gMTYgfHwgIWRpdmlkZXIpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKmRpdmlkZXIgPSBzdHJlYW1Tb3VyY2VGcmVxW3N0cmVhbU51bWJlcl07CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRTd2FwQ2hhaW4odW5zaWduZWQgaW50IGluZGV4LCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgSURpcmVjdDNEU3dhcENoYWluOSAqKnN3YXBDaGFpbiA9IDB4JTAuOHAiLCBpbmRleCwgc3dhcENoYWluKTsKKworCQlpZighc3dhcENoYWluIHx8IGluZGV4ID49IEdldE51bWJlck9mU3dhcENoYWlucygpKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpzd2FwQ2hhaW4gPSB0aGlzLT5zd2FwQ2hhaW47CisKKwkJaWYoKnN3YXBDaGFpbikKKwkJeworCQkJKCpzd2FwQ2hhaW4pLT5BZGRSZWYoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFRleHR1cmUodW5zaWduZWQgbG9uZyBzYW1wbGVyLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKip0ZXh0dXJlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIHNhbXBsZXIgPSAlZCwgSURpcmVjdDNEQmFzZVRleHR1cmU5ICoqdGV4dHVyZSA9IDB4JTAuOHAiLCBzYW1wbGVyLCB0ZXh0dXJlKTsKKworCQlpZighdGV4dHVyZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKwkJCisJCSp0ZXh0dXJlID0gMDsKKworCQlpZigoc2FtcGxlciA+PSAxNiAmJiBzYW1wbGVyIDw9IEQzRERNQVBTQU1QTEVSKSB8fCBzYW1wbGVyID4gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSp0ZXh0dXJlID0gdGhpcy0+dGV4dHVyZVtzYW1wbGVyXTsKKwkJCisJCWlmKHRoaXMtPnRleHR1cmVbc2FtcGxlcl0pCisJCXsKKwkJCXRoaXMtPnRleHR1cmVbc2FtcGxlcl0tPkFkZFJlZigpOworCQl9CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc3RhZ2UgPSAlZCwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUgPSAlZCwgdW5zaWduZWQgbG9uZyAqdmFsdWUgPSAweCUwLjhwIiwgc3RhZ2UsIHR5cGUsIHZhbHVlKTsKKworCQlpZighdmFsdWUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnZhbHVlID0gdGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW3R5cGVdOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIEQzRE1BVFJJWCAqbWF0cml4KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUgPSAlZCwgRDNETUFUUklYICptYXRyaXggPSAweCUwLjhwIiwgc3RhdGUsIG1hdHJpeCk7CisKKwkJaWYoIW1hdHJpeCB8fCBzdGF0ZSA8IDAgfHwgc3RhdGUgPiA1MTEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKm1hdHJpeCA9IHRoaXMtPm1hdHJpeFtzdGF0ZV07CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0VmVydGV4RGVjbGFyYXRpb24oSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICoqZGVjbGFyYXRpb24pCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIklEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uID0gMHglMC44cCIsIGRlY2xhcmF0aW9uKTsKKworCQlpZighZGVjbGFyYXRpb24pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKmRlY2xhcmF0aW9uID0gdmVydGV4RGVjbGFyYXRpb247CisKKwkJaWYodmVydGV4RGVjbGFyYXRpb24pCisJCXsKKwkJCXZlcnRleERlY2xhcmF0aW9uLT5BZGRSZWYoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFZlcnRleFNoYWRlcihJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICoqc2hhZGVyKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICoqc2hhZGVyID0gMHglMC44cCIsIHNoYWRlcik7CisKKwkJaWYoIXNoYWRlcikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqc2hhZGVyID0gdmVydGV4U2hhZGVyOworCisJCWlmKHZlcnRleFNoYWRlcikKKwkJeworCQkJdmVydGV4U2hhZGVyLT5BZGRSZWYoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFZlcnRleFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCisJCWlmKCFjb25zdGFudERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCWNvbnN0YW50RGF0YVtpXSA9IHZlcnRleFNoYWRlckNvbnN0YW50QltzdGFydFJlZ2lzdGVyICsgaV07CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCisJCWlmKCFjb25zdGFudERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDBdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVswXTsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDFdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXTsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDJdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXTsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDNdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVszXTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFZlcnRleFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCisJCWlmKCFjb25zdGFudERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDBdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVswXTsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDFdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXTsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDJdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXTsKKwkJCWNvbnN0YW50RGF0YVtpICogNCArIDNdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVszXTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFZpZXdwb3J0KEQzRFZJRVdQT1JUOSAqdmlld3BvcnQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRFZJRVdQT1JUOSAqdmlld3BvcnQgPSAweCUwLjhwIiwgdmlld3BvcnQpOworCisJCWlmKCF2aWV3cG9ydCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqdmlld3BvcnQgPSB0aGlzLT52aWV3cG9ydDsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgZW5hYmxlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIGludCBlbmFibGUgPSAlZCIsIGluZGV4LCBlbmFibGUpOworCisJCWlmKCFsaWdodC5leGlzdHMoaW5kZXgpKSAgIC8vIEluc2VydCBkZWZhdWx0IGxpZ2h0CisJCXsKKwkJCUQzRExJR0hUOSBsaWdodDsKKworCQkJbGlnaHQuVHlwZSA9IEQzRExJR0hUX0RJUkVDVElPTkFMOworCQkJbGlnaHQuRGlmZnVzZS5yID0gMTsKKwkJCWxpZ2h0LkRpZmZ1c2UuZyA9IDE7CisJCQlsaWdodC5EaWZmdXNlLmIgPSAxOworCQkJbGlnaHQuRGlmZnVzZS5hID0gMDsKKwkJCWxpZ2h0LlNwZWN1bGFyLnIgPSAwOworCQkJbGlnaHQuU3BlY3VsYXIuZyA9IDA7CisJCQlsaWdodC5TcGVjdWxhci5iID0gMDsKKwkJCWxpZ2h0LlNwZWN1bGFyLmEgPSAwOworCQkJbGlnaHQuQW1iaWVudC5yID0gMDsKKwkJCWxpZ2h0LkFtYmllbnQuZyA9IDA7CisJCQlsaWdodC5BbWJpZW50LmIgPSAwOworCQkJbGlnaHQuQW1iaWVudC5hID0gMDsKKwkJCWxpZ2h0LlBvc2l0aW9uLnggPSAwOworCQkJbGlnaHQuUG9zaXRpb24ueSA9IDA7CisJCQlsaWdodC5Qb3NpdGlvbi56ID0gMDsKKwkJCWxpZ2h0LkRpcmVjdGlvbi54ID0gMDsKKwkJCWxpZ2h0LkRpcmVjdGlvbi55ID0gMDsKKwkJCWxpZ2h0LkRpcmVjdGlvbi56ID0gMTsKKwkJCWxpZ2h0LlJhbmdlID0gMDsKKwkJCWxpZ2h0LkZhbGxvZmYgPSAwOyAKKwkJCWxpZ2h0LkF0dGVudWF0aW9uMCA9IDA7CisJCQlsaWdodC5BdHRlbnVhdGlvbjEgPSAwOworCQkJbGlnaHQuQXR0ZW51YXRpb24yID0gMDsKKwkJCWxpZ2h0LlRoZXRhID0gMDsKKwkJCWxpZ2h0LlBoaSA9IDA7CisKKwkJCXRoaXMtPmxpZ2h0W2luZGV4XSA9IGxpZ2h0OworCQkJdGhpcy0+bGlnaHRbaW5kZXhdLmVuYWJsZSA9IGZhbHNlOworCQl9CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCWxpZ2h0W2luZGV4XS5lbmFibGUgPSAoZW5hYmxlICE9IEZBTFNFKTsKKworCQkJbGlnaHRzRGlydHkgPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+bGlnaHRFbmFibGUoaW5kZXgsIGVuYWJsZSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpNdWx0aXBseVRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUgPSAlZCwgY29uc3QgRDNETUFUUklYICptYXRyaXggPSAweCUwLjhwIiwgc3RhdGUsIG1hdHJpeCk7CisKKwkJaWYoIW1hdHJpeCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlEM0RNQVRSSVggKmN1cnJlbnQgPSAmdGhpcy0+bWF0cml4W3N0YXRlXTsKKworCQlzdzo6TWF0cml4IEMoY3VycmVudC0+XzExLCBjdXJyZW50LT5fMjEsIGN1cnJlbnQtPl8zMSwgY3VycmVudC0+XzQxLAorCQkgICAgICAgICAgICAgY3VycmVudC0+XzEyLCBjdXJyZW50LT5fMjIsIGN1cnJlbnQtPl8zMiwgY3VycmVudC0+XzQyLAorCQkgICAgICAgICAgICAgY3VycmVudC0+XzEzLCBjdXJyZW50LT5fMjMsIGN1cnJlbnQtPl8zMywgY3VycmVudC0+XzQzLAorCQkgICAgICAgICAgICAgY3VycmVudC0+XzE0LCBjdXJyZW50LT5fMjQsIGN1cnJlbnQtPl8zNCwgY3VycmVudC0+XzQ0KTsKKworCQlzdzo6TWF0cml4IE0obWF0cml4LT5fMTEsIG1hdHJpeC0+XzIxLCBtYXRyaXgtPl8zMSwgbWF0cml4LT5fNDEsCisJCSAgICAgICAgICAgICBtYXRyaXgtPl8xMiwgbWF0cml4LT5fMjIsIG1hdHJpeC0+XzMyLCBtYXRyaXgtPl80MiwKKwkJICAgICAgICAgICAgIG1hdHJpeC0+XzEzLCBtYXRyaXgtPl8yMywgbWF0cml4LT5fMzMsIG1hdHJpeC0+XzQzLAorCQkgICAgICAgICAgICAgbWF0cml4LT5fMTQsIG1hdHJpeC0+XzI0LCBtYXRyaXgtPl8zNCwgbWF0cml4LT5fNDQpOworCisJCXN3aXRjaChzdGF0ZSkKKwkJeworCQljYXNlIEQzRFRTX1dPUkxEOgorCQkJcmVuZGVyZXItPnNldE1vZGVsTWF0cml4KEMgKiBNKTsKKwkJCWJyZWFrOworCQljYXNlIEQzRFRTX1ZJRVc6CisJCQlyZW5kZXJlci0+c2V0Vmlld01hdHJpeChDICogTSk7CisJCQlicmVhazsKKwkJY2FzZSBEM0RUU19QUk9KRUNUSU9OOgorCQkJcmVuZGVyZXItPnNldFByb2plY3Rpb25NYXRyaXgoQyAqIE0pOworCQkJYnJlYWs7CisJCWNhc2UgRDNEVFNfVEVYVFVSRTA6CisJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgwLCBDICogTSk7CisJCQlicmVhazsKKwkJY2FzZSBEM0RUU19URVhUVVJFMToKKwkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDEsIEMgKiBNKTsKKwkJCWJyZWFrOworCQljYXNlIEQzRFRTX1RFWFRVUkUyOgorCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMiwgQyAqIE0pOworCQkJYnJlYWs7CisJCWNhc2UgRDNEVFNfVEVYVFVSRTM6CisJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgzLCBDICogTSk7CisJCQlicmVhazsKKwkJY2FzZSBEM0RUU19URVhUVVJFNDoKKwkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDQsIEMgKiBNKTsKKwkJCWJyZWFrOworCQljYXNlIEQzRFRTX1RFWFRVUkU1OgorCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNSwgQyAqIE0pOworCQkJYnJlYWs7CisJCWNhc2UgRDNEVFNfVEVYVFVSRTY6CisJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg2LCBDICogTSk7CisJCQlicmVhazsKKwkJY2FzZSBEM0RUU19URVhUVVJFNzoKKwkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDcsIEMgKiBNKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYoc3RhdGUgPiAyNTYgJiYgc3RhdGUgPCA1MTIpCisJCQl7CisJCQkJcmVuZGVyZXItPnNldE1vZGVsTWF0cml4KEMgKiBNLCBzdGF0ZSAtIDI1Nik7CisJCQl9CisJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpQcmVzZW50KGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBIV05EIGRlc3RXaW5kb3dPdmVycmlkZSwgY29uc3QgUkdOREFUQSAqZGlydHlSZWdpb24pCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoImNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QgPSAweCUwLjhwLCBjb25zdCBSRUNUICpkZXN0UmVjdCA9IDB4JTAuOHAsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlID0gJWQsIGNvbnN0IFJHTkRBVEEgKmRpcnR5UmVnaW9uID0gMHglMC44cCIsIHNvdXJjZVJlY3QsIGRlc3RSZWN0LCBkZXN0V2luZG93T3ZlcnJpZGUsIGRpcnR5UmVnaW9uKTsKKworCQlyZXR1cm4gc3dhcENoYWluLT5QcmVzZW50KHNvdXJjZVJlY3QsIGRlc3RSZWN0LCBkZXN0V2luZG93T3ZlcnJpZGUsIGRpcnR5UmVnaW9uLCAwKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6UHJvY2Vzc1ZlcnRpY2VzKHVuc2lnbmVkIGludCBzcmNTdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgZGVzdEluZGV4LCB1bnNpZ25lZCBpbnQgdmVydGV4Q291bnQsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRlc3RCdWZmZXIsIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4RGVjbGFyYXRpb24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzcmNTdGFydEluZGV4ID0gJWQsIHVuc2lnbmVkIGludCBkZXN0SW5kZXggPSAlZCwgdW5zaWduZWQgaW50IHZlcnRleENvdW50ID0gJWQsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRlc3RCdWZmZXIgPSAweCUwLjhwLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uID0gMHglMC44cCwgdW5zaWduZWQgbG9uZyBmbGFncyA9ICVkIiwgc3JjU3RhcnRJbmRleCwgZGVzdEluZGV4LCB2ZXJ0ZXhDb3VudCwgZGVzdEJ1ZmZlciwgdmVydGV4RGVjbGFyYXRpb24sIGZsYWdzKTsKKworCQlpZighZGVzdEJ1ZmZlcikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6UmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyA9IDB4JTAuOHAiLCBwcmVzZW50UGFyYW1ldGVycyk7CisKKwkJaWYoIXByZXNlbnRQYXJhbWV0ZXJzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWRldmljZVdpbmRvdyA9IHByZXNlbnRQYXJhbWV0ZXJzLT5oRGV2aWNlV2luZG93OworCQkKKwkJaWYoZGVwdGhTdGVuY2lsKQorCQl7CisJCQlkZXB0aFN0ZW5jaWwtPnVuYmluZCgpOworCQkJZGVwdGhTdGVuY2lsID0gMDsKKwkJfQorCisJCWlmKGF1dG9EZXB0aFN0ZW5jaWwpCisJCXsKKwkJCWF1dG9EZXB0aFN0ZW5jaWwtPnVuYmluZCgpOworCQkJYXV0b0RlcHRoU3RlbmNpbCA9IDA7CisJCX0KKwkJCisJCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspCisJCXsKKwkJCWlmKHJlbmRlclRhcmdldFtpbmRleF0pCisJCQl7CisJCQkJcmVuZGVyVGFyZ2V0W2luZGV4XS0+dW5iaW5kKCk7CisJCQkJcmVuZGVyVGFyZ2V0W2luZGV4XSA9IDA7CisJCQl9CisJCX0KKworCQlpZighc3dhcENoYWluKQorCQl7CisJCQlzd2FwQ2hhaW4gPSBuZXcgRGlyZWN0M0RTd2FwQ2hhaW45KHRoaXMsIHByZXNlbnRQYXJhbWV0ZXJzKTsKKwkJCXN3YXBDaGFpbi0+YmluZCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3dhcENoYWluLT5yZXNldChwcmVzZW50UGFyYW1ldGVycyk7CisJCX0KKworCQlpZihwcmVzZW50UGFyYW1ldGVycy0+RW5hYmxlQXV0b0RlcHRoU3RlbmNpbCAhPSBGQUxTRSkKKwkJeworCQkJYm9vbCBsb2NrYWJsZSA9IGZhbHNlOworCisJCQlzd2l0Y2gocHJlc2VudFBhcmFtZXRlcnMtPkF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQpCisJCQl7CisJCQljYXNlIEQzREZNVF9EMTVTMToKKwkJCWNhc2UgRDNERk1UX0QyNFM4OgorCQkJY2FzZSBEM0RGTVRfRDI0WDg6CisJCQljYXNlIEQzREZNVF9EMjRYNFM0OgorCQkJY2FzZSBEM0RGTVRfRDI0RlM4OgorCQkJY2FzZSBEM0RGTVRfRDMyOgorCQkJY2FzZSBEM0RGTVRfRDE2OgorCQkJY2FzZSBEM0RGTVRfREYyNDoKKwkJCWNhc2UgRDNERk1UX0RGMTY6CisJCQljYXNlIEQzREZNVF9JTlRaOgorCQkJCWxvY2thYmxlID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzREZNVF9TOF9MT0NLQUJMRToKKwkJCWNhc2UgRDNERk1UX0QxNl9MT0NLQUJMRToKKwkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6CisJCQljYXNlIEQzREZNVF9EMzJfTE9DS0FCTEU6CisJCQkJbG9ja2FibGUgPSB0cnVlOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCisJCQlhdXRvRGVwdGhTdGVuY2lsID0gbmV3IERpcmVjdDNEU3VyZmFjZTkodGhpcywgdGhpcywgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJXaWR0aCwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQsIHByZXNlbnRQYXJhbWV0ZXJzLT5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0LCBEM0RQT09MX0RFRkFVTFQsIHByZXNlbnRQYXJhbWV0ZXJzLT5NdWx0aVNhbXBsZVR5cGUsIHByZXNlbnRQYXJhbWV0ZXJzLT5NdWx0aVNhbXBsZVF1YWxpdHksIGxvY2thYmxlLCBEM0RVU0FHRV9ERVBUSFNURU5DSUwpOworCQkJYXV0b0RlcHRoU3RlbmNpbC0+YmluZCgpOworCisJCQlTZXREZXB0aFN0ZW5jaWxTdXJmYWNlKGF1dG9EZXB0aFN0ZW5jaWwpOworCQl9CisKKwkJSURpcmVjdDNEU3VyZmFjZTkgKnJlbmRlclRhcmdldDsKKwkJc3dhcENoYWluLT5HZXRCYWNrQnVmZmVyKDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmcmVuZGVyVGFyZ2V0KTsKKwkJU2V0UmVuZGVyVGFyZ2V0KDAsIHJlbmRlclRhcmdldCk7CisJCXJlbmRlclRhcmdldC0+UmVsZWFzZSgpOworCisJCVNldFJlbmRlclRhcmdldCgxLCAwKTsKKwkJU2V0UmVuZGVyVGFyZ2V0KDIsIDApOworCQlTZXRSZW5kZXJUYXJnZXQoMywgMCk7CisKKwkJc29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nID0gKGJlaGF2aW91ckZsYWdzICYgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcpID09IEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HOworCisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1pFTkFCTEUsIHByZXNlbnRQYXJhbWV0ZXJzLT5FbmFibGVBdXRvRGVwdGhTdGVuY2lsICE9IEZBTFNFID8gRDNEWkJfVFJVRSA6IEQzRFpCX0ZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRklMTE1PREUsIEQzREZJTExfU09MSUQpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19TSEFERU1PREUsIEQzRFNIQURFX0dPVVJBVUQpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19aV1JJVEVFTkFCTEUsIFRSVUUpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTFBIQVRFU1RFTkFCTEUsIEZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTEFTVFBJWEVMLCBUUlVFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1JDQkxFTkQsIEQzREJMRU5EX09ORSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0RFU1RCTEVORCwgRDNEQkxFTkRfWkVSTyk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0NVTExNT0RFLCBEM0RDVUxMX0NDVyk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1pGVU5DLCBEM0RDTVBfTEVTU0VRVUFMKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQUxQSEFSRUYsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTFBIQUZVTkMsIEQzRENNUF9BTFdBWVMpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19ESVRIRVJFTkFCTEUsIEZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQUxQSEFCTEVOREVOQUJMRSwgRkFMU0UpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dFTkFCTEUsIEZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1BFQ1VMQVJFTkFCTEUsIEZBTFNFKTsKKwkvLwlTZXRSZW5kZXJTdGF0ZShEM0RSU19aVklTSUJMRSwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR0NPTE9SLCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRk9HVEFCTEVNT0RFLCBEM0RGT0dfTk9ORSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR1NUQVJULCBGdG9EVygwLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR0VORCwgRnRvRFcoMS4wZikpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dERU5TSVRZLCBGdG9EVygxLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1JBTkdFRk9HRU5BQkxFLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxFTkFCTEUsIEZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEZBSUwsIEQzRFNURU5DSUxPUF9LRUVQKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFpGQUlMLCBEM0RTVEVOQ0lMT1BfS0VFUCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxQQVNTLCBEM0RTVEVOQ0lMT1BfS0VFUCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxGVU5DLCBEM0RDTVBfQUxXQVlTKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFJFRiwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxNQVNLLCAweEZGRkZGRkZGKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFdSSVRFTUFTSywgMHhGRkZGRkZGRik7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1RFWFRVUkVGQUNUT1IsIDB4RkZGRkZGRkYpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMCwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVAxLCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDIsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMywgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA0LCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDUsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQNiwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA3LCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ0xJUFBJTkcsIFRSVUUpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19MSUdIVElORywgVFJVRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0FNQklFTlQsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dWRVJURVhNT0RFLCBEM0RGT0dfTk9ORSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0NPTE9SVkVSVEVYLCBUUlVFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTE9DQUxWSUVXRVIsIFRSVUUpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19OT1JNQUxJWkVOT1JNQUxTLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRSwgRDNETUNTX0NPTE9SMSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19DT0xPUjIpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19NQVRFUklBTCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19NQVRFUklBTCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1ZFUlRFWEJMRU5ELCBEM0RWQkZfRElTQUJMRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0NMSVBQTEFORUVOQUJMRSwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0laRSwgRnRvRFcoMS4wZikpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkVfTUlOLCBGdG9EVygxLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVFTkFCTEUsIEZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTQ0FMRV9BLCBGdG9EVygxLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVfQiwgRnRvRFcoMC4wZikpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFX0MsIEZ0b0RXKDAuMGYpKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTVVMVElTQU1QTEVBTlRJQUxJQVMsIFRSVUUpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19NVUxUSVNBTVBMRU1BU0ssIDB4RkZGRkZGRkYpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QQVRDSEVER0VTVFlMRSwgRDNEUEFUQ0hFREdFX0RJU0NSRVRFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfREVCVUdNT05JVE9SVE9LRU4sIEQzRERNVF9FTkFCTEUpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkVfTUFYLCBGdG9EVyg2NC4wZikpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19JTkRFWEVEVkVSVEVYQkxFTkRFTkFCTEUsIEZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ09MT1JXUklURUVOQUJMRSwgMHgwMDAwMDAwRik7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1RXRUVORkFDVE9SLCBGdG9EVygwLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0JMRU5ET1AsIEQzREJMRU5ET1BfQUREKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9TSVRJT05ERUdSRUUsIEQzRERFR1JFRV9DVUJJQyk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX05PUk1BTERFR1JFRSwgRDNEREVHUkVFX0xJTkVBUik7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NDSVNTT1JURVNURU5BQkxFLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NMT1BFU0NBTEVERVBUSEJJQVMsIEZ0b0RXKDAuMGYpKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQU5USUFMSUFTRURMSU5FRU5BQkxFLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX01JTlRFU1NFTExBVElPTkxFVkVMLCBGdG9EVygxLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX01BWFRFU1NFTExBVElPTkxFVkVMLCBGdG9EVygxLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0FEQVBUSVZFVEVTU19YLCBGdG9EVygwLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0FEQVBUSVZFVEVTU19ZLCBGdG9EVygwLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0FEQVBUSVZFVEVTU19aLCBGdG9EVygxLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0FEQVBUSVZFVEVTU19XLCBGdG9EVygwLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1RXT1NJREVEU1RFTkNJTE1PREUsIEZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ0NXX1NURU5DSUxGQUlMLCBEM0RTVEVOQ0lMT1BfS0VFUCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0NDV19TVEVOQ0lMWkZBSUwsIEQzRFNURU5DSUxPUF9LRUVQKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ0NXX1NURU5DSUxQQVNTLCBEM0RTVEVOQ0lMT1BfS0VFUCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0NDV19TVEVOQ0lMRlVOQywgRDNEQ01QX0FMV0FZUyk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUxLCAweDAwMDAwMDBGKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ09MT1JXUklURUVOQUJMRTIsIDB4MDAwMDAwMEYpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19DT0xPUldSSVRFRU5BQkxFMywgMHgwMDAwMDAwRik7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0JMRU5ERkFDVE9SLCAweEZGRkZGRkZGKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1JHQldSSVRFRU5BQkxFLCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfREVQVEhCSUFTLCBGdG9EVygwLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA4LCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDksIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTAsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTEsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTIsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTMsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTQsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTUsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEUsIEZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1JDQkxFTkRBTFBIQSwgRDNEQkxFTkRfT05FKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfREVTVEJMRU5EQUxQSEEsIEQzREJMRU5EX1pFUk8pOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19CTEVORE9QQUxQSEEsIEQzREJMRU5ET1BfQUREKTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKQorCQl7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQ09MT1JPUCwgaSA9PSAwID8gRDNEVE9QX01PRFVMQVRFIDogRDNEVE9QX0RJU0FCTEUpOworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTE9SQVJHMSwgRDNEVEFfVEVYVFVSRSk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQ09MT1JBUkcyLCBEM0RUQV9DVVJSRU5UKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BTFBIQU9QLCBpID09IDAgPyBEM0RUT1BfU0VMRUNUQVJHMSA6IEQzRFRPUF9ESVNBQkxFKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BTFBIQUFSRzEsIEQzRFRBX1RFWFRVUkUpOworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0FMUEhBQVJHMiwgRDNEVEFfQ1VSUkVOVCk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVk1BVDAwLCBGdG9EVygwLjBmKSk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVk1BVDAxLCBGdG9EVygwLjBmKSk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVk1BVDEwLCBGdG9EVygwLjBmKSk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVk1BVDExLCBGdG9EVygwLjBmKSk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfVEVYQ09PUkRJTkRFWCwgaSk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVkxTQ0FMRSwgRnRvRFcoMC4wZikpOworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0JVTVBFTlZMT0ZGU0VULCBGdG9EVygwLjBmKSk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTLCBEM0RUVEZGX0RJU0FCTEUpOworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTE9SQVJHMCwgRDNEVEFfQ1VSUkVOVCk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQUxQSEFBUkcwLCBEM0RUQV9DVVJSRU5UKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19SRVNVTFRBUkcsIEQzRFRBX0NVUlJFTlQpOworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTlNUQU5ULCAweDAwMDAwMDAwKTsKKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPD0gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIzOyBpID0gKGkgIT0gMTUpID8gKGkgKyAxKSA6IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCkKKwkJeworCQkJU2V0VGV4dHVyZShpLCAwKTsKKworCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfQUREUkVTU1UsIEQzRFRBRERSRVNTX1dSQVApOworCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfQUREUkVTU1YsIEQzRFRBRERSRVNTX1dSQVApOworCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfQUREUkVTU1csIEQzRFRBRERSRVNTX1dSQVApOworCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfQk9SREVSQ09MT1IsIDB4MDAwMDAwMDApOworCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfTUFHRklMVEVSLCBEM0RURVhGX1BPSU5UKTsKKwkJCVNldFNhbXBsZXJTdGF0ZShpLCBEM0RTQU1QX01JTkZJTFRFUiwgRDNEVEVYRl9QT0lOVCk7CisJCQlTZXRTYW1wbGVyU3RhdGUoaSwgRDNEU0FNUF9NSVBGSUxURVIsIEQzRFRFWEZfTk9ORSk7CisJCQlTZXRTYW1wbGVyU3RhdGUoaSwgRDNEU0FNUF9NSVBNQVBMT0RCSUFTLCAwKTsKKwkJCVNldFNhbXBsZXJTdGF0ZShpLCBEM0RTQU1QX01BWE1JUExFVkVMLCAwKTsKKwkJCVNldFNhbXBsZXJTdGF0ZShpLCBEM0RTQU1QX01BWEFOSVNPVFJPUFksIDEpOworCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfU1JHQlRFWFRVUkUsIDApOworCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfRUxFTUVOVElOREVYLCAwKTsKKwkJCVNldFNhbXBsZXJTdGF0ZShpLCBEM0RTQU1QX0RNQVBPRkZTRVQsIDApOworCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDY7IGkrKykKKwkJeworCQkJZmxvYXQgcGxhbmVbNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJCVNldENsaXBQbGFuZShpLCBwbGFuZSk7CisJCX0KKworCQljdXJyZW50UGFsZXR0ZSA9IDB4RkZGRjsKKworCQlTaG93Q3Vyc29yKEZBTFNFKTsKKwkJZGVsZXRlIGN1cnNvcjsKKwkJY3Vyc29yID0gMDsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRDbGlwUGxhbmUodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgZmxvYXQgKnBsYW5lKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIGNvbnN0IGZsb2F0ICpwbGFuZSA9IDB4JTAuOHAiLCBpbmRleCwgcGxhbmUpOworCisJCWlmKCFwbGFuZSB8fCBpbmRleCA+PSA2KQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQl0aGlzLT5wbGFuZVtpbmRleF1bMF0gPSBwbGFuZVswXTsKKwkJCXRoaXMtPnBsYW5lW2luZGV4XVsxXSA9IHBsYW5lWzFdOworCQkJdGhpcy0+cGxhbmVbaW5kZXhdWzJdID0gcGxhbmVbMl07CisJCQl0aGlzLT5wbGFuZVtpbmRleF1bM10gPSBwbGFuZVszXTsKKworCQkJcmVuZGVyZXItPnNldENsaXBQbGFuZShpbmRleCwgcGxhbmUpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0Q2xpcFBsYW5lKGluZGV4LCBwbGFuZSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRDbGlwU3RhdHVzKGNvbnN0IEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJjb25zdCBEM0RDTElQU1RBVFVTOSAqY2xpcFN0YXR1cyA9IDB4JTAuOHAiLCBjbGlwU3RhdHVzKTsKKworCQlpZighY2xpcFN0YXR1cykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQl0aGlzLT5jbGlwU3RhdHVzID0gKmNsaXBTdGF0dXM7CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OlNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIgPSAlZCIsIHBhbGV0dGVOdW1iZXIpOworCisJCWlmKHBhbGV0dGVOdW1iZXIgPiAweEZGRkYgfHwgcGFsZXR0ZS5maW5kKHBhbGV0dGVOdW1iZXIpID09IHBhbGV0dGUuZW5kKCkpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCWN1cnJlbnRQYWxldHRlID0gcGFsZXR0ZU51bWJlcjsKKworCQkJc3c6OlN1cmZhY2U6OnNldFRleHR1cmVQYWxldHRlKCh1bnNpZ25lZCBpbnQqKSZwYWxldHRlW2N1cnJlbnRQYWxldHRlXSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLT5zZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUocGFsZXR0ZU51bWJlcik7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCXZvaWQgRGlyZWN0M0REZXZpY2U5OjpTZXRDdXJzb3JQb3NpdGlvbihpbnQgeCwgaW50IHksIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoImludCB4ID0gJWQsIGludCB5ID0gJWQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAweCUwLjhYIiwgeCwgeSwgZmxhZ3MpOworCisJCVBPSU5UIHBvaW50ID0ge3gsIHl9OworCQlIV05EIHdpbmRvdyA9IGRldmljZVdpbmRvdyA/IGRldmljZVdpbmRvdyA6IGZvY3VzV2luZG93OworCQlTY3JlZW5Ub0NsaWVudCh3aW5kb3csICZwb2ludCk7CisKKwkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JQb3NpdGlvbihwb2ludC54LCBwb2ludC55KTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0Q3Vyc29yUHJvcGVydGllcyh1bnNpZ25lZCBpbnQgeDAsIHVuc2lnbmVkIGludCB5MCwgSURpcmVjdDNEU3VyZmFjZTkgKmN1cnNvckJpdG1hcCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHgwID0gJWQsIHVuc2lnbmVkIGludCB5MCA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqY3Vyc29yQml0bWFwID0gMHglMC44cCIsIHgwLCB5MCwgY3Vyc29yQml0bWFwKTsKKworCQlpZighY3Vyc29yQml0bWFwKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXN3OjpTdXJmYWNlICpjdXJzb3JTdXJmYWNlID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOSo+KGN1cnNvckJpdG1hcCk7CisKKwkJaW50IHdpZHRoID0gY3Vyc29yU3VyZmFjZS0+Z2V0RXh0ZXJuYWxXaWR0aCgpOworCQlpbnQgaGVpZ2h0ID0gY3Vyc29yU3VyZmFjZS0+Z2V0RXh0ZXJuYWxIZWlnaHQoKTsKKwkJdm9pZCAqYml0bWFwID0gY3Vyc29yU3VyZmFjZS0+bG9ja0V4dGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX1JFQURPTkxZLCBzdzo6UFVCTElDKTsKKworCQlkZWxldGUgY3Vyc29yOworCQljdXJzb3IgPSBuZXcgc3c6OlN1cmZhY2UoMCwgd2lkdGgsIGhlaWdodCwgMSwgc3c6OkZPUk1BVF9BOFI4RzhCOCwgZmFsc2UsIGZhbHNlKTsKKworCQl2b2lkICpidWZmZXIgPSBjdXJzb3ItPmxvY2tFeHRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19ESVNDQVJELCBzdzo6UFVCTElDKTsKKwkJbWVtY3B5KGJ1ZmZlciwgYml0bWFwLCB3aWR0aCAqIGhlaWdodCAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwkJY3Vyc29yLT51bmxvY2tFeHRlcm5hbCgpOworCisJCWN1cnNvclN1cmZhY2UtPnVubG9ja0V4dGVybmFsKCk7CisKKwkJaWYoc2hvd0N1cnNvcikKKwkJeworCQkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JJbWFnZShjdXJzb3IpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JJbWFnZSgwKTsKKwkJfQorCisJCXN3OjpGcmFtZUJ1ZmZlcjo6c2V0Q3Vyc29yT3JpZ2luKHgwLCB5MCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0RGVwdGhTdGVuY2lsU3VyZmFjZShJRGlyZWN0M0RTdXJmYWNlOSAqaURlcHRoU3RlbmNpbCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKm5ld0RlcHRoU3RlbmNpbCA9IDB4JTAuOHAiLCBpRGVwdGhTdGVuY2lsKTsKKworCQlEaXJlY3QzRFN1cmZhY2U5ICpkZXB0aFN0ZW5jaWwgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFN1cmZhY2U5Kj4oaURlcHRoU3RlbmNpbCk7CisKKwkJaWYodGhpcy0+ZGVwdGhTdGVuY2lsID09IGRlcHRoU3RlbmNpbCkKKwkJeworCQkJcmV0dXJuIEQzRF9PSzsKKwkJfQorCisJCWlmKGRlcHRoU3RlbmNpbCkKKwkJeworCQkJZGVwdGhTdGVuY2lsLT5iaW5kKCk7CisJCX0KKworCQlpZih0aGlzLT5kZXB0aFN0ZW5jaWwpCisJCXsKKwkJCXRoaXMtPmRlcHRoU3RlbmNpbC0+dW5iaW5kKCk7CisJCX0KKworCQl0aGlzLT5kZXB0aFN0ZW5jaWwgPSBkZXB0aFN0ZW5jaWw7CisKKwkJcmVuZGVyZXItPnNldERlcHRoU3RlbmNpbChkZXB0aFN0ZW5jaWwpOworCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0RGlhbG9nQm94TW9kZShpbnQgZW5hYmxlRGlhbG9ncykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiaW50IGVuYWJsZURpYWxvZ3MgPSAlZCIsIGVuYWJsZURpYWxvZ3MpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OlNldEZWRih1bnNpZ25lZCBsb25nIEZWRikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBGVkYgPSAweCUwLjhYIiwgRlZGKTsKKworCQlpZighc3RhdGVSZWNvcmRlcikKKwkJeworCQkJaWYoRlZGICE9IDAgfHwgIXRoaXMtPnZlcnRleERlY2xhcmF0aW9uKQorCQkJeworCQkJCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICp2ZXJ0ZXhEZWNsYXJhdGlvbiA9IG5ldyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSh0aGlzLCBGVkYpOworCQkJCXZlcnRleERlY2xhcmF0aW9uLT5iaW5kKCk7CisKKwkJCQlpZih0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbikKKwkJCQl7CisJCQkJCXRoaXMtPnZlcnRleERlY2xhcmF0aW9uLT51bmJpbmQoKTsKKwkJCQl9CisKKwkJCQl0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbiA9IHZlcnRleERlY2xhcmF0aW9uOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0RlZGKEZWRik7CisJCX0KKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJdm9pZCBEaXJlY3QzRERldmljZTk6OlNldEdhbW1hUmFtcCh1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IEQzREdBTU1BUkFNUCAqcmFtcCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IGluZGV4ID0gJWQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAweCUwLjhYLCBjb25zdCBEM0RHQU1NQVJBTVAgKnJhbXAgPSAweCUwLjhwIiwgaW5kZXgsIGZsYWdzLCByYW1wKTsKKworCQlpZighcmFtcCB8fCBpbmRleCA+PSBHZXROdW1iZXJPZlN3YXBDaGFpbnMoKSkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJc3dhcENoYWluLT5zZXRHYW1tYVJhbXAoKHN3OjpHYW1tYVJhbXAqKXJhbXAsIGZsYWdzICYgRDNEU0dSX0NBTElCUkFURSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OlNldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI5KiBpSW5kZXhCdWZmZXIpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIklEaXJlY3QzREluZGV4QnVmZmVyOSogaW5kZXhEYXRhID0gMHglMC44cCIsIGlJbmRleEJ1ZmZlcik7CisKKwkJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4QnVmZmVyID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RJbmRleEJ1ZmZlcjkqPihpSW5kZXhCdWZmZXIpOworCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlpZih0aGlzLT5pbmRleERhdGEgPT0gaW5kZXhCdWZmZXIpCisJCQl7CisJCQkJcmV0dXJuIEQzRF9PSzsKKwkJCX0KKworCQkJaWYoaW5kZXhCdWZmZXIpCisJCQl7CisJCQkJaW5kZXhCdWZmZXItPmJpbmQoKTsKKwkJCX0KKworCQkJaWYodGhpcy0+aW5kZXhEYXRhKQorCQkJeworCQkJCXRoaXMtPmluZGV4RGF0YS0+dW5iaW5kKCk7CisJCQl9CisKKwkJCXRoaXMtPmluZGV4RGF0YSA9IGluZGV4QnVmZmVyOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0SW5kaWNlcyhpbmRleEJ1ZmZlcik7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBEM0RMSUdIVDkgKmxpZ2h0KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIGNvbnN0IEQzRExJR0hUOSAqbGlnaHQgPSAweCUwLjhwIiwgaW5kZXgsIGxpZ2h0KTsKKworCQlpZighbGlnaHQpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCXRoaXMtPmxpZ2h0W2luZGV4XSA9ICpsaWdodDsKKworCQkJbGlnaHRzRGlydHkgPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0TGlnaHQoaW5kZXgsIGxpZ2h0KTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OlNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoImNvbnN0IEQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwgPSAweCUwLjhwIiwgbWF0ZXJpYWwpOworCisJCWlmKCFtYXRlcmlhbCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7ICAgLy8gRklYTUU6IENvcnJlY3QgYmVoYXZpb3VyPworCQl9CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCXRoaXMtPm1hdGVyaWFsID0gKm1hdGVyaWFsOworCisJCQlyZW5kZXJlci0+c2V0TWF0ZXJpYWxBbWJpZW50KHN3OjpDb2xvcjxmbG9hdD4obWF0ZXJpYWwtPkFtYmllbnQuciwgbWF0ZXJpYWwtPkFtYmllbnQuZywgbWF0ZXJpYWwtPkFtYmllbnQuYiwgbWF0ZXJpYWwtPkFtYmllbnQuYSkpOworCQkJcmVuZGVyZXItPnNldE1hdGVyaWFsRGlmZnVzZShzdzo6Q29sb3I8ZmxvYXQ+KG1hdGVyaWFsLT5EaWZmdXNlLnIsIG1hdGVyaWFsLT5EaWZmdXNlLmcsIG1hdGVyaWFsLT5EaWZmdXNlLmIsIG1hdGVyaWFsLT5EaWZmdXNlLmEpKTsKKwkJCXJlbmRlcmVyLT5zZXRNYXRlcmlhbEVtaXNzaW9uKHN3OjpDb2xvcjxmbG9hdD4obWF0ZXJpYWwtPkVtaXNzaXZlLnIsIG1hdGVyaWFsLT5FbWlzc2l2ZS5nLCBtYXRlcmlhbC0+RW1pc3NpdmUuYiwgbWF0ZXJpYWwtPkVtaXNzaXZlLmEpKTsKKwkJCXJlbmRlcmVyLT5zZXRNYXRlcmlhbFNoaW5pbmVzcyhtYXRlcmlhbC0+UG93ZXIpOworCQkJcmVuZGVyZXItPnNldE1hdGVyaWFsU3BlY3VsYXIoc3c6OkNvbG9yPGZsb2F0PihtYXRlcmlhbC0+U3BlY3VsYXIuciwgbWF0ZXJpYWwtPlNwZWN1bGFyLmcsIG1hdGVyaWFsLT5TcGVjdWxhci5iLCBtYXRlcmlhbC0+U3BlY3VsYXIuYSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0TWF0ZXJpYWwobWF0ZXJpYWwpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0TlBhdGNoTW9kZShmbG9hdCBzZWdtZW50cykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiZmxvYXQgc2VnbWVudHMgPSAlZiIsIHNlZ21lbnRzKTsKKworCQlpZighc3RhdGVSZWNvcmRlcikKKwkJeworCQkJaWYoc2VnbWVudHMgPCAxKQorCQkJeworCQkJCS8vIE5PVEU6IERpc2FibGUKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlVTklNUExFTUVOVEVEKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLT5zZXROUGF0Y2hNb2RlKHNlZ21lbnRzKTsKKwkJfQorCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0UGFsZXR0ZUVudHJpZXModW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIsIGNvbnN0IFBBTEVUVEVFTlRSWSAqZW50cmllcykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIgPSAlZCwgY29uc3QgUEFMRVRURUVOVFJZICplbnRyaWVzID0gMHglMC44cCIsIHBhbGV0dGVOdW1iZXIsIGVudHJpZXMpOworCisJCWlmKHBhbGV0dGVOdW1iZXIgPiAweEZGRkYgfHwgIWVudHJpZXMpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQorCQl7CisJCQlwYWxldHRlW3BhbGV0dGVOdW1iZXJdLmVudHJ5W2ldID0gZW50cmllc1tpXTsKKwkJfQorCisJCWlmKHBhbGV0dGVOdW1iZXIgPT0gY3VycmVudFBhbGV0dGUpCisJCXsKKwkJCXN3OjpTdXJmYWNlOjpzZXRUZXh0dXJlUGFsZXR0ZSgodW5zaWduZWQgaW50KikmcGFsZXR0ZVtjdXJyZW50UGFsZXR0ZV0pOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0UGl4ZWxTaGFkZXIoSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICppUGl4ZWxTaGFkZXIpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIklEaXJlY3QzRFBpeGVsU2hhZGVyOSAqc2hhZGVyID0gMHglMC44cCIsIGlQaXhlbFNoYWRlcik7CisKKwkJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnBpeGVsU2hhZGVyID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RQaXhlbFNoYWRlcjkqPihpUGl4ZWxTaGFkZXIpOworCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlpZih0aGlzLT5waXhlbFNoYWRlciA9PSBwaXhlbFNoYWRlcikKKwkJCXsKKwkJCQlyZXR1cm4gRDNEX09LOworCQkJfQorCQkJCisJCQlpZihwaXhlbFNoYWRlcikKKwkJCXsKKwkJCQlwaXhlbFNoYWRlci0+YmluZCgpOworCQkJfQorCisJCQlpZih0aGlzLT5waXhlbFNoYWRlcikKKwkJCXsKKwkJCQl0aGlzLT5waXhlbFNoYWRlci0+dW5iaW5kKCk7CisJCQl9CisKKwkJCXRoaXMtPnBpeGVsU2hhZGVyID0gcGl4ZWxTaGFkZXI7CisJCQlwaXhlbFNoYWRlckRpcnR5ID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlUmVjb3JkZXItPnNldFBpeGVsU2hhZGVyKHBpeGVsU2hhZGVyKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OlNldFBpeGVsU2hhZGVyQ29uc3RhbnRCKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudCAmJiBzdGFydFJlZ2lzdGVyICsgaSA8IDE2OyBpKyspCisJCQl7CisJCQkJcGl4ZWxTaGFkZXJDb25zdGFudEJbc3RhcnRSZWdpc3RlciArIGldID0gY29uc3RhbnREYXRhW2ldOworCQkJfQorCisJCQlwaXhlbFNoYWRlckNvbnN0YW50c0JEaXJ0eSA9IHN3OjptYXgoc3RhcnRSZWdpc3RlciArIGNvdW50LCBwaXhlbFNoYWRlckNvbnN0YW50c0JEaXJ0eSk7CisJCQlwaXhlbFNoYWRlckRpcnR5ID0gdHJ1ZTsgICAvLyBSZWxvYWQgREVGIGNvbnN0YW50cworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEIoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRQaXhlbFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudCAmJiBzdGFydFJlZ2lzdGVyICsgaSA8IDIyNDsgaSsrKQorCQkJeworCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVswXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDBdOworCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDFdOworCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDJdOworCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVszXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDNdOworCQkJfQorCisJCQlwaXhlbFNoYWRlckNvbnN0YW50c0ZEaXJ0eSA9IHN3OjptYXgoc3RhcnRSZWdpc3RlciArIGNvdW50LCBwaXhlbFNoYWRlckNvbnN0YW50c0ZEaXJ0eSk7CisJCQlwaXhlbFNoYWRlckRpcnR5ID0gdHJ1ZTsgICAvLyBSZWxvYWQgREVGIGNvbnN0YW50cworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRQaXhlbFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgY29uc3QgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQgJiYgc3RhcnRSZWdpc3RlciArIGkgPCAxNjsgaSsrKQorCQkJeworCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVswXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDBdOworCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDFdOworCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDJdOworCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVszXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDNdOworCQkJfQorCisJCQlwaXhlbFNoYWRlckNvbnN0YW50c0lEaXJ0eSA9IHN3OjptYXgoc3RhcnRSZWdpc3RlciArIGNvdW50LCBwaXhlbFNoYWRlckNvbnN0YW50c0lEaXJ0eSk7CisJCQlwaXhlbFNoYWRlckRpcnR5ID0gdHJ1ZTsgICAvLyBSZWxvYWQgREVGIGNvbnN0YW50cworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEkoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoIkQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSA9ICVkLCB1bnNpZ25lZCBsb25nIHZhbHVlID0gJWQiLCBzdGF0ZSwgdmFsdWUpOworCisJCWlmKHN0YXRlIDwgRDNEUlNfWkVOQUJMRSB8fCBzdGF0ZSA+IEQzRFJTX0JMRU5ET1BBTFBIQSkKKwkJeworCQkJcmV0dXJuIEQzRF9PSzsgICAvLyBGSVhNRTogV2FybmluZworCQl9CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCWlmKCFpbml0ICYmIHJlbmRlclN0YXRlW3N0YXRlXSA9PSB2YWx1ZSkKKwkJCXsKKwkJCQlyZXR1cm4gRDNEX09LOworCQkJfQorCisJCQlyZW5kZXJTdGF0ZVtzdGF0ZV0gPSB2YWx1ZTsKKworCQkJc3dpdGNoKHN0YXRlKQorCQkJewkJCisJCQljYXNlIEQzRFJTX1pFTkFCTEU6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRFpCX1RSVUU6CisJCQkJY2FzZSBEM0RaQl9VU0VXOgorCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhCdWZmZXJFbmFibGUodHJ1ZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEWkJfRkFMU0U6CisJCQkJCXJlbmRlcmVyLT5zZXREZXB0aEJ1ZmZlckVuYWJsZShmYWxzZSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19GSUxMTU9ERToKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNERklMTF9QT0lOVDoKKwkJCQkJcmVuZGVyZXItPnNldEZpbGxNb2RlKHN3OjpDb250ZXh0OjpGSUxMX1ZFUlRFWCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNERklMTF9XSVJFRlJBTUU6CisJCQkJCXJlbmRlcmVyLT5zZXRGaWxsTW9kZShzdzo6Q29udGV4dDo6RklMTF9XSVJFRlJBTUUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREZJTExfU09MSUQ6CisJCQkJCXJlbmRlcmVyLT5zZXRGaWxsTW9kZShzdzo6Q29udGV4dDo6RklMTF9TT0xJRCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TSEFERU1PREU6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRFNIQURFX0ZMQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTaGFkaW5nTW9kZShzdzo6Q29udGV4dDo6U0hBRElOR19GTEFUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTSEFERV9HT1VSQVVEOgorCQkJCQlyZW5kZXJlci0+c2V0U2hhZGluZ01vZGUoc3c6OkNvbnRleHQ6OlNIQURJTkdfR09VUkFVRCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU0hBREVfUEhPTkc6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19aV1JJVEVFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldERlcHRoV3JpdGVFbmFibGUodmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19BTFBIQVRFU1RFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldEFscGhhVGVzdEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0xBU1RQSVhFTDoKKwkJCS8vCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfU1JDQkxFTkQ6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzREJMRU5EX1pFUk86CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6Q29udGV4dDo6QkxFTkRfWkVSTyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfT05FOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX09ORSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfU1JDQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6Q29udGV4dDo6QkxFTkRfU09VUkNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZTUkNDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX1NSQ0FMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZTUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfREVTVEFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX0RFU1RBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfSU5WREVTVEFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX0lOVkRFU1RBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfREVTVENPTE9SOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX0RFU1QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9JTlZERVNUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9TUkNBTFBIQVNBVDoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9TUkNBTFBIQVNBVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfQk9USFNSQ0FMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6Q29udGV4dDo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0JPVEhJTlZTUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9CTEVOREZBQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9DT05TVEFOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfSU5WQkxFTkRGQUNUT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6Q29udGV4dDo6QkxFTkRfSU5WQ09OU1RBTlQpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfREVTVEJMRU5EOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RCTEVORF9aRVJPOgorCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9aRVJPKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9PTkU6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX09ORSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfU1JDQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX0lOVlNPVVJDRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZTUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6Q29udGV4dDo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0RFU1RBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6Q29udGV4dDo6QkxFTkRfREVTVEFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX0lOVkRFU1RBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfREVTVENPTE9SOgorCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9ERVNUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX0lOVkRFU1QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX1NSQ0FMUEhBU0FUOgorCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9TUkNBTFBIQVNBVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfQk9USFNSQ0FMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6Q29udGV4dDo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0JPVEhJTlZTUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9CTEVOREZBQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6Q29udGV4dDo6QkxFTkRfQ09OU1RBTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0lOVkJMRU5ERkFDVE9SOgorCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpDb250ZXh0OjpCTEVORF9JTlZDT05TVEFOVCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19DVUxMTU9ERToJCisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRENVTExfTk9ORToKKwkJCQkJcmVuZGVyZXItPnNldEN1bGxNb2RlKHN3OjpDb250ZXh0OjpDVUxMX05PTkUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENVTExfQ0NXOgorCQkJCQlyZW5kZXJlci0+c2V0Q3VsbE1vZGUoc3c6OkNvbnRleHQ6OkNVTExfQ09VTlRFUkNMT0NLV0lTRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ1VMTF9DVzoKKwkJCQkJcmVuZGVyZXItPnNldEN1bGxNb2RlKHN3OjpDb250ZXh0OjpDVUxMX0NMT0NLV0lTRSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19aRlVOQzoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEQ01QX05FVkVSOgorCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpDb250ZXh0OjpERVBUSF9ORVZFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0xFU1M6CisJCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkNvbnRleHQ6OkRFUFRIX0xFU1MpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9FUVVBTDoKKwkJCQkJcmVuZGVyZXItPnNldERlcHRoQ29tcGFyZShzdzo6Q29udGV4dDo6REVQVEhfRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9MRVNTRVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkNvbnRleHQ6OkRFUFRIX0xFU1NFUVVBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0dSRUFURVI6CisJCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkNvbnRleHQ6OkRFUFRIX0dSRUFURVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9OT1RFUVVBTDoKKwkJCQkJcmVuZGVyZXItPnNldERlcHRoQ29tcGFyZShzdzo6Q29udGV4dDo6REVQVEhfTk9URVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9HUkVBVEVSRVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkNvbnRleHQ6OkRFUFRIX0dSRUFURVJFUVVBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0FMV0FZUzoKKwkJCQkJcmVuZGVyZXItPnNldERlcHRoQ29tcGFyZShzdzo6Q29udGV4dDo6REVQVEhfQUxXQVlTKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0FMUEhBUkVGOgorCQkJCXJlbmRlcmVyLT5zZXRBbHBoYVJlZmVyZW5jZSh2YWx1ZSAmIDB4MDAwMDAwRkYpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19BTFBIQUZVTkM6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRENNUF9ORVZFUjoKKwkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6Q29udGV4dDo6QUxQSEFfTkVWRVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9MRVNTOgorCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpDb250ZXh0OjpBTFBIQV9MRVNTKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfRVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXRBbHBoYUNvbXBhcmUoc3c6OkNvbnRleHQ6OkFMUEhBX0VRVUFMKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfTEVTU0VRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpDb250ZXh0OjpBTFBIQV9MRVNTRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9HUkVBVEVSOgorCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpDb250ZXh0OjpBTFBIQV9HUkVBVEVSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfTk9URVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXRBbHBoYUNvbXBhcmUoc3c6OkNvbnRleHQ6OkFMUEhBX05PVEVRVUFMKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfR1JFQVRFUkVRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpDb250ZXh0OjpBTFBIQV9HUkVBVEVSRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9BTFdBWVM6CisJCQkJCXJlbmRlcmVyLT5zZXRBbHBoYUNvbXBhcmUoc3c6OkNvbnRleHQ6OkFMUEhBX0FMV0FZUyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19ESVRIRVJFTkFCTEU6CisJCQkvLwlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19BTFBIQUJMRU5ERU5BQkxFOgorCQkJCXJlbmRlcmVyLT5zZXRBbHBoYUJsZW5kRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfRk9HRU5BQkxFOgorCQkJCXJlbmRlcmVyLT5zZXRGb2dFbmFibGUodmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19GT0dDT0xPUjoKKwkJCQlyZW5kZXJlci0+c2V0Rm9nQ29sb3IodmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19GT0dUQUJMRU1PREU6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzREZPR19OT05FOgorCQkJCQlyZW5kZXJlci0+c2V0UGl4ZWxGb2dNb2RlKHN3OjpDb250ZXh0OjpGT0dfTk9ORSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNERk9HX0xJTkVBUjoKKwkJCQkJcmVuZGVyZXItPnNldFBpeGVsRm9nTW9kZShzdzo6Q29udGV4dDo6Rk9HX0xJTkVBUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNERk9HX0VYUDoKKwkJCQkJcmVuZGVyZXItPnNldFBpeGVsRm9nTW9kZShzdzo6Q29udGV4dDo6Rk9HX0VYUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNERk9HX0VYUDI6CisJCQkJCXJlbmRlcmVyLT5zZXRQaXhlbEZvZ01vZGUoc3c6OkNvbnRleHQ6OkZPR19FWFAyKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0ZPR1NUQVJUOgorCQkJCXJlbmRlcmVyLT5zZXRGb2dTdGFydCgoZmxvYXQmKXZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfRk9HRU5EOgorCQkJCXJlbmRlcmVyLT5zZXRGb2dFbmQoKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0ZPR0RFTlNJVFk6CisJCQkJcmVuZGVyZXItPnNldEZvZ0RlbnNpdHkoKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1JBTkdFRk9HRU5BQkxFOgorCQkJCXJlbmRlcmVyLT5zZXRSYW5nZUZvZ0VuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NQRUNVTEFSRU5BQkxFOgorCQkJCXJlbmRlcmVyLT5zZXRTcGVjdWxhckVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NURU5DSUxFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxFbmFibGUodmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TVEVOQ0lMRkFJTDoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0tFRVA6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0tFRVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9aRVJPOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9aRVJPKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfUkVQTEFDRToKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fUkVQTEFDRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1JTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0lOQ1JTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSU0FUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9ERUNSU0FUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5WRVJUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9JTlZFUlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9JTkNSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9JTkNSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUjoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fREVDUik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TVEVOQ0lMWkZBSUw6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9LRUVQOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fS0VFUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1pFUk86CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9aRVJPKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfUkVQTEFDRToKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6Q29udGV4dDo6T1BFUkFUSU9OX1JFUExBQ0UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9JTkNSU0FUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fSU5DUlNBVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1JTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9ERUNSU0FUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5WRVJUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fSU5WRVJUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUjoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0lOQ1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fREVDUik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TVEVOQ0lMUEFTUzoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0tFRVA6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0tFRVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9aRVJPOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9aRVJPKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfUkVQTEFDRToKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fUkVQTEFDRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1JTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0lOQ1JTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSU0FUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9ERUNSU0FUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5WRVJUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9JTlZFUlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9JTkNSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9JTkNSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUjoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fREVDUik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TVEVOQ0lMRlVOQzoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEQ01QX05FVkVSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmUoc3c6OkNvbnRleHQ6OlNURU5DSUxfTkVWRVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9MRVNTOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmUoc3c6OkNvbnRleHQ6OlNURU5DSUxfTEVTUyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0VRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmUoc3c6OkNvbnRleHQ6OlNURU5DSUxfRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9MRVNTRVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6Q29udGV4dDo6U1RFTkNJTF9MRVNTRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9HUkVBVEVSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmUoc3c6OkNvbnRleHQ6OlNURU5DSUxfR1JFQVRFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX05PVEVRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmUoc3c6OkNvbnRleHQ6OlNURU5DSUxfTk9URVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9HUkVBVEVSRVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6Q29udGV4dDo6U1RFTkNJTF9HUkVBVEVSRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9BTFdBWVM6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6Q29udGV4dDo6U1RFTkNJTF9BTFdBWVMpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfU1RFTkNJTFJFRjoKKwkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFJlZmVyZW5jZSh2YWx1ZSk7CisJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxSZWZlcmVuY2VDQ1codmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TVEVOQ0lMTUFTSzoKKwkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbE1hc2sodmFsdWUpOworCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsTWFza0NDVyh2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NURU5DSUxXUklURU1BU0s6CisJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxXcml0ZU1hc2sodmFsdWUpOworCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsV3JpdGVNYXNrQ0NXKHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfVEVYVFVSRUZBQ1RPUjoKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZhY3Rvcih2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVAwOgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCgwLCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVAxOgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCgxLCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVAyOgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCgyLCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVAzOgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCgzLCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVA0OgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCg0LCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVA1OgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCg1LCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVA2OgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCg2LCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVA3OgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCg3LCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0NMSVBQSU5HOgorCQkJCS8vIElnbm9yZWQsIGNsaXBwaW5nIGlzIGFsd2F5cyBwZXJmb3JtZWQKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfTElHSFRJTkc6CisJCQkJcmVuZGVyZXItPnNldExpZ2h0aW5nRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQU1CSUVOVDoKKwkJCQlyZW5kZXJlci0+c2V0R2xvYmFsQW1iaWVudCh2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0ZPR1ZFUlRFWE1PREU6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzREZPR19OT05FOgorCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4Rm9nTW9kZShzdzo6Q29udGV4dDo6Rk9HX05PTkUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREZPR19MSU5FQVI6CisJCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhGb2dNb2RlKHN3OjpDb250ZXh0OjpGT0dfTElORUFSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RGT0dfRVhQOgorCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4Rm9nTW9kZShzdzo6Q29udGV4dDo6Rk9HX0VYUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNERk9HX0VYUDI6CisJCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhGb2dNb2RlKHN3OjpDb250ZXh0OjpGT0dfRVhQMik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19DT0xPUlZFUlRFWDoKKwkJCQlyZW5kZXJlci0+c2V0Q29sb3JWZXJ0ZXhFbmFibGUodmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19MT0NBTFZJRVdFUjoKKwkJCQlyZW5kZXJlci0+c2V0TG9jYWxWaWV3ZXIodmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19OT1JNQUxJWkVOT1JNQUxTOgorCQkJCXJlbmRlcmVyLT5zZXROb3JtYWxpemVOb3JtYWxzKHZhbHVlICE9IEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfRElGRlVTRU1BVEVSSUFMU09VUkNFOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RNQ1NfTUFURVJJQUw6CisJCQkJCXJlbmRlcmVyLT5zZXREaWZmdXNlTWF0ZXJpYWxTb3VyY2Uoc3c6OkNvbnRleHQ6Ok1BVEVSSUFMKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RNQ1NfQ09MT1IxOgorCQkJCQlyZW5kZXJlci0+c2V0RGlmZnVzZU1hdGVyaWFsU291cmNlKHN3OjpDb250ZXh0OjpDT0xPUjEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRE1DU19DT0xPUjI6CisJCQkJCXJlbmRlcmVyLT5zZXREaWZmdXNlTWF0ZXJpYWxTb3VyY2Uoc3c6OkNvbnRleHQ6OkNPTE9SMik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TUEVDVUxBUk1BVEVSSUFMU09VUkNFOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RNQ1NfTUFURVJJQUw6CisJCQkJCXJlbmRlcmVyLT5zZXRTcGVjdWxhck1hdGVyaWFsU291cmNlKHN3OjpDb250ZXh0OjpNQVRFUklBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNETUNTX0NPTE9SMToKKwkJCQkJcmVuZGVyZXItPnNldFNwZWN1bGFyTWF0ZXJpYWxTb3VyY2Uoc3c6OkNvbnRleHQ6OkNPTE9SMSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNETUNTX0NPTE9SMjoKKwkJCQkJcmVuZGVyZXItPnNldFNwZWN1bGFyTWF0ZXJpYWxTb3VyY2Uoc3c6OkNvbnRleHQ6OkNPTE9SMik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0U6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRE1DU19NQVRFUklBTDoKKwkJCQkJcmVuZGVyZXItPnNldEFtYmllbnRNYXRlcmlhbFNvdXJjZShzdzo6Q29udGV4dDo6TUFURVJJQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRE1DU19DT0xPUjE6CisJCQkJCXJlbmRlcmVyLT5zZXRBbWJpZW50TWF0ZXJpYWxTb3VyY2Uoc3c6OkNvbnRleHQ6OkNPTE9SMSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNETUNTX0NPTE9SMjoKKwkJCQkJcmVuZGVyZXItPnNldEFtYmllbnRNYXRlcmlhbFNvdXJjZShzdzo6Q29udGV4dDo6Q09MT1IyKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0U6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRE1DU19NQVRFUklBTDoKKwkJCQkJcmVuZGVyZXItPnNldEVtaXNzaXZlTWF0ZXJpYWxTb3VyY2Uoc3c6OkNvbnRleHQ6Ok1BVEVSSUFMKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RNQ1NfQ09MT1IxOgorCQkJCQlyZW5kZXJlci0+c2V0RW1pc3NpdmVNYXRlcmlhbFNvdXJjZShzdzo6Q29udGV4dDo6Q09MT1IxKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RNQ1NfQ09MT1IyOgorCQkJCQlyZW5kZXJlci0+c2V0RW1pc3NpdmVNYXRlcmlhbFNvdXJjZShzdzo6Q29udGV4dDo6Q09MT1IyKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1ZFUlRFWEJMRU5EOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RWQkZfRElTQUJMRToKKwkJCQkJcmVuZGVyZXItPnNldFZlcnRleEJsZW5kTWF0cml4Q291bnQoMCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVkJGXzFXRUlHSFRTOgorCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4QmxlbmRNYXRyaXhDb3VudCgyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RWQkZfMldFSUdIVFM6CisJCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhCbGVuZE1hdHJpeENvdW50KDMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFZCRl8zV0VJR0hUUzoKKwkJCQkJcmVuZGVyZXItPnNldFZlcnRleEJsZW5kTWF0cml4Q291bnQoNCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVkJGX1RXRUVOSU5HOgorCQkJCQlVTklNUExFTUVOVEVEKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVkJGXzBXRUlHSFRTOgorCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4QmxlbmRNYXRyaXhDb3VudCgxKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0NMSVBQTEFORUVOQUJMRToKKwkJCQlyZW5kZXJlci0+c2V0Q2xpcEZsYWdzKHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfUE9JTlRTSVpFOgorCQkJCWlmKHZhbHVlID09IEQzREZNVF9JTlNUICYmIHBpeGVsU2hhZGVyVmVyc2lvblggPj0gRDNEUFNfVkVSU0lPTigyLCAwKSkgICAvLyBBVEkgaGFjayB0byBlbmFibGUgaW5zdGFuY2luZyBvbiBTTSAyLjAgaGFyZHdhcmUKKwkJCQl7CisJCQkJCWluc3RhbmNpbmdFbmFibGVkID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZSBpZih2YWx1ZSA9PSBEM0RGTVRfQTJNMSkgICAvLyBBVEkgaGFjayB0byBlbmFibGUgdHJhbnNwYXJlbmN5IGFudGktYWxpYXNpbmcKKwkJCQl7CisJCQkJCXJlbmRlcmVyLT5zZXRUcmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcoc3c6OkNvbnRleHQ6OlRSQU5TUEFSRU5DWV9BTFBIQV9UT19DT1ZFUkFHRSk7CisJCQkJCXJlbmRlcmVyLT5zZXRBbHBoYVRlc3RFbmFibGUodHJ1ZSk7CisJCQkJfQorCQkJCWVsc2UgaWYodmFsdWUgPT0gRDNERk1UX0EyTTApICAgLy8gQVRJIGhhY2sgdG8gZGlzYWJsZSB0cmFuc3BhcmVuY3kgYW50aS1hbGlhc2luZworCQkJCXsKKwkJCQkJcmVuZGVyZXItPnNldFRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyhzdzo6Q29udGV4dDo6VFJBTlNQQVJFTkNZX05PTkUpOworCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFUZXN0RW5hYmxlKGZhbHNlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmVuZGVyZXItPnNldFBvaW50U2l6ZSgoZmxvYXQmKXZhbHVlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BPSU5UU0laRV9NSU46CisJCQkJcmVuZGVyZXItPnNldFBvaW50U2l6ZU1pbigoZmxvYXQmKXZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfUE9JTlRTUFJJVEVFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldFBvaW50U3ByaXRlRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRToKKwkJCQlyZW5kZXJlci0+c2V0UG9pbnRTY2FsZUVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BPSU5UU0NBTEVfQToKKwkJCQlyZW5kZXJlci0+c2V0UG9pbnRTY2FsZUEoKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BPSU5UU0NBTEVfQjoKKwkJCQlyZW5kZXJlci0+c2V0UG9pbnRTY2FsZUIoKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BPSU5UU0NBTEVfQzoKKwkJCQlyZW5kZXJlci0+c2V0UG9pbnRTY2FsZUMoKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTOgorCQkJLy8JaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfTVVMVElTQU1QTEVNQVNLOgorCQkJCVNldFJlbmRlclRhcmdldCgwLCByZW5kZXJUYXJnZXRbMF0pOyAgIC8vIFNldHMgdGhlIG11bHRpLXNhbXBsZSBtYXNrLCBpZiBtYXNrYWJsZQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19QQVRDSEVER0VTVFlMRToKKwkJCQlpZighaW5pdCkgaWYodmFsdWUgIT0gRDNEUEFUQ0hFREdFX0RJU0NSRVRFKSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0RFQlVHTU9OSVRPUlRPS0VOOgorCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BPSU5UU0laRV9NQVg6CisJCQkJcmVuZGVyZXItPnNldFBvaW50U2l6ZU1heCgoZmxvYXQmKXZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfSU5ERVhFRFZFUlRFWEJMRU5ERU5BQkxFOgorCQkJCXJlbmRlcmVyLT5zZXRJbmRleGVkVmVydGV4QmxlbmRFbmFibGUodmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19DT0xPUldSSVRFRU5BQkxFOgorCQkJCXJlbmRlcmVyLT5zZXRDb2xvcldyaXRlTWFzaygwLCB2YWx1ZSAmIDB4MDAwMDAwMEYpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19UV0VFTkZBQ1RPUjoKKwkJCQlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19CTEVORE9QOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RCTEVORE9QX0FERDoKKwkJCQkJcmVuZGVyZXItPnNldEJsZW5kT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpCTEVORE9QX0FERCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRPUF9TVUJUUkFDVDoKKwkJCQkJcmVuZGVyZXItPnNldEJsZW5kT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpCTEVORE9QX1NVQik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRPUF9SRVZTVUJUUkFDVDoKKwkJCQkJcmVuZGVyZXItPnNldEJsZW5kT3BlcmF0aW9uKHN3OjpDb250ZXh0OjpCTEVORE9QX0lOVlNVQik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRPUF9NSU46CisJCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6Q29udGV4dDo6QkxFTkRPUF9NSU4pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5ET1BfTUFYOgorCQkJCQlyZW5kZXJlci0+c2V0QmxlbmRPcGVyYXRpb24oc3c6OkNvbnRleHQ6OkJMRU5ET1BfTUFYKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BPU0lUSU9OREVHUkVFOgorCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX05PUk1BTERFR1JFRToKKwkJCQlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TQ0lTU09SVEVTVEVOQUJMRToKKwkJCQlzY2lzc29yRW5hYmxlID0gKHZhbHVlICE9IEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfU0xPUEVTQ0FMRURFUFRIQklBUzoKKwkJCQlyZW5kZXJlci0+c2V0U2xvcGVEZXB0aEJpYXMoKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0FOVElBTElBU0VETElORUVOQUJMRToKKwkJCQlpZighaW5pdCkgaWYodmFsdWUgIT0gRkFMU0UpIFVOSU1QTEVNRU5URUQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfTUlOVEVTU0VMTEFUSU9OTEVWRUw6CisJCQkJaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfTUFYVEVTU0VMTEFUSU9OTEVWRUw6CisJCQkJaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQURBUFRJVkVURVNTX1g6CisJCQkJaWYoIWluaXQpIGlmKChmbG9hdCYpdmFsdWUgIT0gMC4wZikgVU5JTVBMRU1FTlRFRCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19BREFQVElWRVRFU1NfWToKKwkJCQlpZih2YWx1ZSA9PSBEM0RGTVRfQVRPQykgICAvLyBOVklESUEgaGFjayB0byBlbmFibGUgdHJhbnNwYXJlbmN5IGFudGktYWxpYXNpbmcKKwkJCQl7CisJCQkJCXJlbmRlcmVyLT5zZXRUcmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcoc3c6OkNvbnRleHQ6OlRSQU5TUEFSRU5DWV9BTFBIQV9UT19DT1ZFUkFHRSk7CisJCQkJfQorCQkJCWVsc2UgaWYodmFsdWUgPT0gRDNERk1UX1VOS05PV04pICAgLy8gTlZJRElBIGhhY2sgdG8gZGlzYWJsZSB0cmFuc3BhcmVuY3kgYW50aS1hbGlhc2luZworCQkJCXsKKwkJCQkJcmVuZGVyZXItPnNldFRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyhzdzo6Q29udGV4dDo6VFJBTlNQQVJFTkNZX05PTkUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZighaW5pdCkgaWYoKGZsb2F0Jil2YWx1ZSAhPSAwLjBmKSBVTklNUExFTUVOVEVEKCk7CQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQURBUFRJVkVURVNTX1o6CisJCQkJaWYoIWluaXQpIGlmKChmbG9hdCYpdmFsdWUgIT0gMS4wZikgVU5JTVBMRU1FTlRFRCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19BREFQVElWRVRFU1NfVzoKKwkJCQlpZighaW5pdCkgaWYoKGZsb2F0Jil2YWx1ZSAhPSAwLjBmKSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OOgorCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1RXT1NJREVEU1RFTkNJTE1PREU6CisJCQkJcmVuZGVyZXItPnNldFR3b1NpZGVkU3RlbmNpbCh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0NDV19TVEVOQ0lMRkFJTDoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0tFRVA6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0tFRVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9aRVJPOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9aRVJPKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfUkVQTEFDRToKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uQ0NXKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fUkVQTEFDRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1JTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0lOQ1JTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSU0FUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9ERUNSU0FUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5WRVJUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9JTlZFUlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9JTkNSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9JTkNSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUjoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uQ0NXKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fREVDUik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19DQ1dfU1RFTkNJTFpGQUlMOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfS0VFUDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0tFRVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9aRVJPOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uQ0NXKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fWkVSTyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1JFUExBQ0U6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1coc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9SRVBMQUNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUlNBVDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0lOQ1JTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSU0FUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uQ0NXKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fREVDUlNBVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOVkVSVDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0lOVkVSVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1coc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9JTkNSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUjoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0RFQ1IpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQ0NXX1NURU5DSUxQQVNTOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfS0VFUDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uQ0NXKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fS0VFUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1pFUk86CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX1pFUk8pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9SRVBMQUNFOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb25DQ1coc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9SRVBMQUNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUlNBVDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uQ0NXKHN3OjpDb250ZXh0OjpPUEVSQVRJT05fSU5DUlNBVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1JTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0RFQ1JTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9JTlZFUlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0lOVkVSVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0lOQ1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb25DQ1coc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9ERUNSKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0NDV19TVEVOQ0lMRlVOQzoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEQ01QX05FVkVSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OkNvbnRleHQ6OlNURU5DSUxfTkVWRVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9MRVNTOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OkNvbnRleHQ6OlNURU5DSUxfTEVTUyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0VRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OkNvbnRleHQ6OlNURU5DSUxfRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9MRVNTRVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZUNDVyhzdzo6Q29udGV4dDo6U1RFTkNJTF9MRVNTRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9HUkVBVEVSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OkNvbnRleHQ6OlNURU5DSUxfR1JFQVRFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX05PVEVRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OkNvbnRleHQ6OlNURU5DSUxfTk9URVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9HUkVBVEVSRVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZUNDVyhzdzo6Q29udGV4dDo6U1RFTkNJTF9HUkVBVEVSRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9BTFdBWVM6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZUNDVyhzdzo6Q29udGV4dDo6U1RFTkNJTF9BTFdBWVMpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQ09MT1JXUklURUVOQUJMRTE6CisJCQkJcmVuZGVyZXItPnNldENvbG9yV3JpdGVNYXNrKDEsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQ09MT1JXUklURUVOQUJMRTI6CisJCQkJcmVuZGVyZXItPnNldENvbG9yV3JpdGVNYXNrKDIsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQ09MT1JXUklURUVOQUJMRTM6CisJCQkJcmVuZGVyZXItPnNldENvbG9yV3JpdGVNYXNrKDMsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQkxFTkRGQUNUT1I6CisJCQkJcmVuZGVyZXItPnNldEJsZW5kQ29uc3RhbnQoc3c6OkNvbG9yPGZsb2F0Pih2YWx1ZSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TUkdCV1JJVEVFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldFdyaXRlU1JHQih2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0RFUFRIQklBUzoKKwkJCQlyZW5kZXJlci0+c2V0RGVwdGhCaWFzKChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19XUkFQODoKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoOCwgdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19XUkFQOToKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoOSwgdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19XUkFQMTA6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDEwLCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVAxMToKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoMTEsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDEyOgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCgxMiwgdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19XUkFQMTM6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDEzLCB2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1dSQVAxNDoKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoMTQsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDE1OgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCgxNSwgdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldFNlcGFyYXRlQWxwaGFCbGVuZEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NSQ0JMRU5EQUxQSEE6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzREJMRU5EX1pFUk86CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9aRVJPKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9PTkU6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9PTkUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX1NSQ0NPTE9SOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfU09VUkNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZTUkNDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX0lOVlNPVVJDRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9TT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfREVTVEFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfREVTVEFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9JTlZERVNUQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0RFU1RDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX0RFU1QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX0lOVkRFU1QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX1NSQ0FMUEhBU0FUOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfU1JDQUxQSEFTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0JPVEhTUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOworCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9CTEVOREZBQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX0NPTlNUQU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZCTEVOREZBQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX0lOVkNPTlNUQU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0RFU1RCTEVOREFMUEhBOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RCTEVORF9aRVJPOgorCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX1pFUk8pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX09ORToKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9PTkUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX1NSQ0NPTE9SOgorCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfSU5WU09VUkNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9TUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9TT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0RFU1RBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9ERVNUQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9JTlZERVNUQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0RFU1RDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9ERVNUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfSU5WREVTVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEFTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfU1JDQUxQSEFTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0JPVEhTUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOworCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9CTEVOREZBQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpDb250ZXh0OjpCTEVORF9DT05TVEFOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfSU5WQkxFTkRGQUNUT1I6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6Q29udGV4dDo6QkxFTkRfSU5WQ09OU1RBTlQpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQkxFTkRPUEFMUEhBOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RCTEVORE9QX0FERDoKKwkJCQkJcmVuZGVyZXItPnNldEJsZW5kT3BlcmF0aW9uQWxwaGEoc3c6OkNvbnRleHQ6OkJMRU5ET1BfQUREKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORE9QX1NVQlRSQUNUOgorCQkJCQlyZW5kZXJlci0+c2V0QmxlbmRPcGVyYXRpb25BbHBoYShzdzo6Q29udGV4dDo6QkxFTkRPUF9TVUIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5ET1BfUkVWU1VCVFJBQ1Q6CisJCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbkFscGhhKHN3OjpDb250ZXh0OjpCTEVORE9QX0lOVlNVQik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRPUF9NSU46CisJCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbkFscGhhKHN3OjpDb250ZXh0OjpCTEVORE9QX01JTik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRPUF9NQVg6CisJCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbkFscGhhKHN3OjpDb250ZXh0OjpCTEVORE9QX01BWCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCQl9CisJCWVsc2UgICAvLyBzdGF0ZVJlY29yZGVyCisJCXsKKwkJCXN0YXRlUmVjb3JkZXItPnNldFJlbmRlclN0YXRlKHN0YXRlLCB2YWx1ZSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRSZW5kZXJUYXJnZXQodW5zaWduZWQgbG9uZyBpbmRleCwgSURpcmVjdDNEU3VyZmFjZTkgKmlSZW5kZXJUYXJnZXQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgaW5kZXggPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKm5ld1JlbmRlclRhcmdldCA9IDB4JTAuOHAiLCBpbmRleCwgaVJlbmRlclRhcmdldCk7CisKKwkJLy8gRklYTUU6IENoZWNrIGZvciBEM0RVU0FHRV9SRU5ERVJUQVJHRVQKKworCQlpZihpbmRleCA+PSA0IHx8IChpbmRleCA9PSAwICYmICFpUmVuZGVyVGFyZ2V0KSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlEaXJlY3QzRFN1cmZhY2U5ICpyZW5kZXJUYXJnZXQgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFN1cmZhY2U5Kj4oaVJlbmRlclRhcmdldCk7CisKKwkJaWYocmVuZGVyVGFyZ2V0KQorCQl7CisJCQlyZW5kZXJUYXJnZXQtPmJpbmQoKTsKKwkJfQorCisJCWlmKHRoaXMtPnJlbmRlclRhcmdldFtpbmRleF0pCisJCXsKKwkJCXRoaXMtPnJlbmRlclRhcmdldFtpbmRleF0tPnVuYmluZCgpOworCQl9CisKKwkJdGhpcy0+cmVuZGVyVGFyZ2V0W2luZGV4XSA9IHJlbmRlclRhcmdldDsKKworCQlpZihyZW5kZXJUYXJnZXQgJiYgaW5kZXggPT0gMCkKKwkJeworCQkJRDNEU1VSRkFDRV9ERVNDIHJlbmRlclRhcmdldERlc2M7CisJCQlyZW5kZXJUYXJnZXQtPkdldERlc2MoJnJlbmRlclRhcmdldERlc2MpOworCisJCQkvLyBSZXNldCB2aWV3cG9ydCB0byBzaXplIG9mIGN1cnJlbnQgcmVuZGVyIHRhcmdldAorCQkJdmlld3BvcnQuWCA9IDA7CisJCQl2aWV3cG9ydC5ZID0gMDsKKwkJCXZpZXdwb3J0LldpZHRoID0gcmVuZGVyVGFyZ2V0RGVzYy5XaWR0aDsKKwkJCXZpZXdwb3J0LkhlaWdodCA9IHJlbmRlclRhcmdldERlc2MuSGVpZ2h0OworCQkJdmlld3BvcnQuTWluWiA9IDA7CisJCQl2aWV3cG9ydC5NYXhaID0gMTsKKworCQkJLy8gUmVzZXQgc2Npc3NvciByZWN0YW5nbGUgdG8gc2l6ZSBvZiBjdXJyZW50IHJlbmRlciB0YXJnZXQKKwkJCXNjaXNzb3JSZWN0LmxlZnQgPSAwOworCQkJc2Npc3NvclJlY3QudG9wID0gMDsKKwkJCXNjaXNzb3JSZWN0LnJpZ2h0ID0gcmVuZGVyVGFyZ2V0RGVzYy5XaWR0aDsKKwkJCXNjaXNzb3JSZWN0LmJvdHRvbSA9IHJlbmRlclRhcmdldERlc2MuSGVpZ2h0OworCisJCQkvLyBTZXQgdGhlIG11bHRpLXNhbXBsZSBtYXNrLCBpZiBtYXNrYWJsZQorCQkJaWYocmVuZGVyVGFyZ2V0RGVzYy5NdWx0aVNhbXBsZVR5cGUgIT0gRDNETVVMVElTQU1QTEVfTk9ORSAmJgorCQkJICAgcmVuZGVyVGFyZ2V0RGVzYy5NdWx0aVNhbXBsZVR5cGUgIT0gRDNETVVMVElTQU1QTEVfTk9OTUFTS0FCTEUpCisJCQl7CisJCQkJcmVuZGVyZXItPnNldE11bHRpU2FtcGxlTWFzayhyZW5kZXJTdGF0ZVtEM0RSU19NVUxUSVNBTVBMRU1BU0tdKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZW5kZXJlci0+c2V0TXVsdGlTYW1wbGVNYXNrKDB4RkZGRkZGRkYpOworCQkJfQorCQl9CisKKwkJcmVuZGVyZXItPnNldFJlbmRlclRhcmdldChpbmRleCwgcmVuZGVyVGFyZ2V0KTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRTYW1wbGVyU3RhdGUodW5zaWduZWQgbG9uZyBzYW1wbGVyLCBEM0RTQU1QTEVSU1RBVEVUWVBFIHN0YXRlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIHNhbXBsZXIgPSAlZCwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSA9ICVkLCB1bnNpZ25lZCBsb25nIHZhbHVlID0gJWQiLCBzYW1wbGVyLCBzdGF0ZSwgdmFsdWUpOworCisJCWlmKHN0YXRlIDwgRDNEU0FNUF9BRERSRVNTVSB8fCBzdGF0ZSA+IEQzRFNBTVBfRE1BUE9GRlNFVCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZigoc2FtcGxlciA+PSAxNiAmJiBzYW1wbGVyIDw9IEQzRERNQVBTQU1QTEVSKSB8fCBzYW1wbGVyID4gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKHNhbXBsZXIgPj0gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwKQorCQl7CisJCQlzYW1wbGVyID0gMTYgKyAoc2FtcGxlciAtIEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCk7CisJCX0KKworCQlpZighc3RhdGVSZWNvcmRlcikKKwkJeworCQkJaWYoIWluaXQgJiYgc2FtcGxlclN0YXRlW3NhbXBsZXJdW3N0YXRlXSA9PSB2YWx1ZSkKKwkJCXsKKwkJCQlyZXR1cm4gRDNEX09LOworCQkJfQorCisJCQlzYW1wbGVyU3RhdGVbc2FtcGxlcl1bc3RhdGVdID0gdmFsdWU7CisKKwkJCXN3OjpTYW1wbGVyVHlwZSB0eXBlID0gc2FtcGxlciA8IDE2ID8gc3c6OlNBTVBMRVJfUElYRUwgOiBzdzo6U0FNUExFUl9WRVJURVg7CisJCQlpbnQgaW5kZXggPSBzYW1wbGVyIDwgMTYgPyBzYW1wbGVyIDogc2FtcGxlciAtIDE2OyAgIC8vIFNhbXBsZXIgaW5kZXggd2l0aGluIHR5cGUgZ3JvdXAKKworCQkJc3dpdGNoKHN0YXRlKQorCQkJeworCQkJY2FzZSBEM0RTQU1QX0FERFJFU1NVOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RUQUREUkVTU19XUkFQOgorCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVVKHR5cGUsIGluZGV4LCBzdzo6QUREUkVTU0lOR19XUkFQKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1I6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVUodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX01JUlJPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfQ0xBTVA6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVUodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0NMQU1QKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQUREUkVTU19CT1JERVI6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVUodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0JPUkRFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9ST05DRToKKwkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVSh0eXBlLCBpbmRleCwgc3c6OkFERFJFU1NJTkdfTUlSUk9ST05DRSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RTQU1QX0FERFJFU1NWOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RUQUREUkVTU19XUkFQOgorCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVWKHR5cGUsIGluZGV4LCBzdzo6QUREUkVTU0lOR19XUkFQKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1I6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX01JUlJPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfQ0xBTVA6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0NMQU1QKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQUREUkVTU19CT1JERVI6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0JPUkRFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9ST05DRToKKwkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVih0eXBlLCBpbmRleCwgc3c6OkFERFJFU1NJTkdfTUlSUk9ST05DRSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RTQU1QX0FERFJFU1NXOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RUQUREUkVTU19XUkFQOgorCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVXKHR5cGUsIGluZGV4LCBzdzo6QUREUkVTU0lOR19XUkFQKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1I6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX01JUlJPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfQ0xBTVA6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0NMQU1QKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQUREUkVTU19CT1JERVI6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0JPUkRFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9ST05DRToKKwkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVyh0eXBlLCBpbmRleCwgc3c6OkFERFJFU1NJTkdfTUlSUk9ST05DRSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RTQU1QX0JPUkRFUkNPTE9SOgorCQkJCXJlbmRlcmVyLT5zZXRCb3JkZXJDb2xvcih0eXBlLCBpbmRleCwgdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RTQU1QX01BR0ZJTFRFUjoKKwkJCQkvLyBOT1RFOiBTd2lmdFNoYWRlciBkb2VzIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbWluaWZpY2F0aW9uIGFuZCBtYWduaWZpY2F0aW9uIGZpbHRlcgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RURVhGX05PTkU6CisJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6RklMVEVSX1BPSU5UKTsgICAvLyBGSVhNRTogT25seSBmb3IgbWlwbWFwIGZpbHRlcgorCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRFWEZfUE9JTlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6RklMVEVSX1BPSU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RURVhGX0xJTkVBUjoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpGSUxURVJfTElORUFSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RURVhGX0FOSVNPVFJPUElDOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9BTklTT1RST1BJQyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9QWVJBTUlEQUxRVUFEOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9MSU5FQVIpOyAgIC8vIEZJWE1FOiBVbmltcGxlbWVudGVkLCBmYWlsIHNpbGVudGx5CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9HQVVTU0lBTlFVQUQ6CisJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6RklMVEVSX0xJTkVBUik7ICAgLy8gRklYTUU6IFVuaW1wbGVtZW50ZWQsIGZhaWwgc2lsZW50bHkKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCQkJfTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEU0FNUF9NSU5GSUxURVI6CisJCQkJLy8gTk9URTogU3dpZnRTaGFkZXIgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1pbmlmaWNhdGlvbiBhbmQgbWFnbmlmaWNhdGlvbiBmaWx0ZXIKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEVEVYRl9OT05FOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9QT0lOVCk7ICAgLy8gRklYTUU6IE9ubHkgZm9yIG1pcG1hcCBmaWx0ZXIKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RURVhGX1BPSU5UOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9QT0lOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9MSU5FQVI6CisJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6RklMVEVSX0xJTkVBUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9BTklTT1RST1BJQzoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpGSUxURVJfQU5JU09UUk9QSUMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRFWEZfUFlSQU1JREFMUVVBRDoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpGSUxURVJfTElORUFSKTsgICAvLyBGSVhNRTogVW5pbXBsZW1lbnRlZCwgZmFpbCBzaWxlbnRseQorCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRFWEZfR0FVU1NJQU5RVUFEOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9MSU5FQVIpOyAgIC8vIEZJWE1FOiBVbmltcGxlbWVudGVkLCBmYWlsIHNpbGVudGx5CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQkJCX07CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFNBTVBfTUlQRklMVEVSOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RURVhGX05PTkU6CisJCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpNSVBNQVBfTk9ORSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9QT0lOVDoKKwkJCQkJcmVuZGVyZXItPnNldE1pcG1hcEZpbHRlcih0eXBlLCBpbmRleCwgc3c6Ok1JUE1BUF9QT0lOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9MSU5FQVI6CisJCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpNSVBNQVBfTElORUFSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RURVhGX0FOSVNPVFJPUElDOgorCQkJCQlyZW5kZXJlci0+c2V0TWlwbWFwRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6TUlQTUFQX0xJTkVBUik7ICAgLy8gRklYTUU6IE9ubHkgZm9yIHRleHR1cmUgZmlsdGVyCisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9QWVJBTUlEQUxRVUFEOgorCQkJCQlyZW5kZXJlci0+c2V0TWlwbWFwRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6TUlQTUFQX0xJTkVBUik7ICAgLy8gRklYTUU6IE9ubHkgZm9yIHRleHR1cmUgZmlsdGVyCisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9HQVVTU0lBTlFVQUQ6CisJCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpNSVBNQVBfTElORUFSKTsgICAvLyBGSVhNRTogT25seSBmb3IgdGV4dHVyZSBmaWx0ZXIKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCQkJfTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEU0FNUF9NSVBNQVBMT0RCSUFTOgorCQkJCWlmKHZhbHVlID09IEQzREZNVF9HRVQ0KSAgIC8vIEFUSSBoYWNrIHRvIGVuYWJsZSBGZXRjaDQKKwkJCQl7CisJCQkJCXJlbmRlcmVyLT5zZXRHYXRoZXJFbmFibGUodHlwZSwgaW5kZXgsIHRydWUpOworCQkJCX0KKwkJCQllbHNlIGlmKHZhbHVlID09IEQzREZNVF9HRVQxKSAgIC8vIEFUSSBoYWNrIHRvIGRpc2FibGUgRmV0Y2g0CisJCQkJeworCQkJCQlyZW5kZXJlci0+c2V0R2F0aGVyRW5hYmxlKHR5cGUsIGluZGV4LCBmYWxzZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWZsb2F0IExPRCA9IChmbG9hdCYpdmFsdWUgLSBzdzo6bG9nMigoZmxvYXQpY29udGV4dC0+cmVuZGVyVGFyZ2V0WzBdLT5nZXRTdXBlclNhbXBsZUNvdW50KCkpOyAgIC8vIEZJWE1FOiBVcGRhdGUgd2hlbiByZW5kZXIgdGFyZ2V0IGNoYW5nZXMKKwkJCQkJcmVuZGVyZXItPnNldE1pcG1hcExPRCh0eXBlLCBpbmRleCwgTE9EKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFNBTVBfTUFYTUlQTEVWRUw6CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFNBTVBfTUFYQU5JU09UUk9QWToKKwkJCQlyZW5kZXJlci0+c2V0TWF4QW5pc290cm9weSh0eXBlLCBpbmRleCwgc3c6OmNsYW1wKCh1bnNpZ25lZCBpbnQpdmFsdWUsICh1bnNpZ25lZCBpbnQpMSwgbWF4QW5pc290cm9weSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RTQU1QX1NSR0JURVhUVVJFOgorCQkJCXJlbmRlcmVyLT5zZXRSZWFkU1JHQih0eXBlLCBpbmRleCwgdmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RTQU1QX0VMRU1FTlRJTkRFWDoKKwkJCQlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIE11bHRpLWVsZW1lbnQgdGV4dHVyZXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBtdWx0aXBsZSByZW5kZXIgdGFyZ2V0cworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RTQU1QX0RNQVBPRkZTRVQ6CisJCQkvLwlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCQl9CisJCWVsc2UgICAvLyBzdGF0ZVJlY29yZGVyCisJCXsKKwkJCXN0YXRlUmVjb3JkZXItPnNldFNhbXBsZXJTdGF0ZShzYW1wbGVyLCBzdGF0ZSwgdmFsdWUpOworCQl9CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRTY2lzc29yUmVjdChjb25zdCBSRUNUICpyZWN0KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJjb25zdCBSRUNUICpyZWN0ID0gMHglMC44cCIsIHJlY3QpOworCisJCWlmKCFyZWN0KQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlzY2lzc29yUmVjdCA9ICpyZWN0OworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0U2Npc3NvclJlY3QocmVjdCk7CisJCX0KKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OlNldFNvZnR3YXJlVmVydGV4UHJvY2Vzc2luZyhpbnQgc29mdHdhcmUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoImludCBzb2Z0d2FyZSA9ICVkIiwgc29mdHdhcmUpOworCisJCWlmKGJlaGF2aW91ckZsYWdzICYgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcgJiYgc29mdHdhcmUgPT0gRkFMU0UpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoYmVoYXZpb3VyRmxhZ3MgJiBEM0RDUkVBVEVfSEFSRFdBUkVfVkVSVEVYUFJPQ0VTU0lORyAmJiBzb2Z0d2FyZSA9PSBUUlVFKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXNvZnR3YXJlVmVydGV4UHJvY2Vzc2luZyA9IChzb2Z0d2FyZSAhPSBGQUxTRSk7CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbSwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqaVZlcnRleEJ1ZmZlciwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHN0cmlkZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0cmVhbSA9ICVkLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IG9mZnNldCA9ICVkLCB1bnNpZ25lZCBpbnQgc3RyaWRlID0gJWQiLCBzdHJlYW0sIGlWZXJ0ZXhCdWZmZXIsIG9mZnNldCwgc3RyaWRlKTsKKworCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKnZlcnRleEJ1ZmZlciA9IHN0YXRpY19jYXN0PERpcmVjdDNEVmVydGV4QnVmZmVyOSo+KGlWZXJ0ZXhCdWZmZXIpOworCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlpZihkYXRhU3RyZWFtW3N0cmVhbV0gPT0gdmVydGV4QnVmZmVyICYmIHN0cmVhbU9mZnNldFtzdHJlYW1dID09IG9mZnNldCAmJiBzdHJlYW1TdHJpZGVbc3RyZWFtXSA9PSBzdHJpZGUpCisJCQl7CisJCQkJcmV0dXJuIEQzRF9PSzsKKwkJCX0KKworCQkJaWYodmVydGV4QnVmZmVyKQorCQkJeworCQkJCXZlcnRleEJ1ZmZlci0+YmluZCgpOworCQkJfQorCisJCQlpZihkYXRhU3RyZWFtW3N0cmVhbV0pCisJCQl7CisJCQkJZGF0YVN0cmVhbVtzdHJlYW1dLT51bmJpbmQoKTsKKwkJCX0KKworCQkJZGF0YVN0cmVhbVtzdHJlYW1dID0gdmVydGV4QnVmZmVyOworCQkJc3RyZWFtT2Zmc2V0W3N0cmVhbV0gPSBvZmZzZXQ7CisJCQlzdHJlYW1TdHJpZGVbc3RyZWFtXSA9IHN0cmlkZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlUmVjb3JkZXItPnNldFN0cmVhbVNvdXJjZShzdHJlYW0sIHZlcnRleEJ1ZmZlciwgb2Zmc2V0LCBzdHJpZGUpOworCQl9CisJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OlNldFN0cmVhbVNvdXJjZUZyZXEodW5zaWduZWQgaW50IHN0cmVhbU51bWJlciwgdW5zaWduZWQgaW50IGRpdmlkZXIpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIgPSAlZCwgdW5zaWduZWQgaW50IGRpdmlkZXIgPSAlZCIsIHN0cmVhbU51bWJlciwgZGl2aWRlcik7CisKKwkJaWYoIWluc3RhbmNpbmdFbmFibGVkKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlzdHJlYW1Tb3VyY2VGcmVxW3N0cmVhbU51bWJlcl0gPSBkaXZpZGVyOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0U3RyZWFtU291cmNlRnJlcShzdHJlYW1OdW1iZXIsIGRpdmlkZXIpOworCQl9CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKwkKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqaUJhc2VUZXh0dXJlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIHNhbXBsZXIgPSAlZCwgSURpcmVjdDNEQmFzZVRleHR1cmU5ICp0ZXh0dXJlID0gMHglMC44cCIsIHNhbXBsZXIsIGlCYXNlVGV4dHVyZSk7CisKKwkJaWYoKHNhbXBsZXIgPj0gMTYgJiYgc2FtcGxlciA8PSBEM0RETUFQU0FNUExFUikgfHwgc2FtcGxlciA+IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKwkJCisJCWlmKHNhbXBsZXIgPj0gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwKQorCQl7CisJCQlzYW1wbGVyID0gMTYgKyAoc2FtcGxlciAtIEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCk7CisJCX0KKworCQlEaXJlY3QzREJhc2VUZXh0dXJlOSAqYmFzZVRleHR1cmUgPSBkeW5hbWljX2Nhc3Q8RGlyZWN0M0RCYXNlVGV4dHVyZTkqPihpQmFzZVRleHR1cmUpOworCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlpZih0ZXh0dXJlW3NhbXBsZXJdID09IGJhc2VUZXh0dXJlKQorCQkJeworCQkJCXJldHVybiBEM0RfT0s7CisJCQl9CisKKwkJCWlmKGJhc2VUZXh0dXJlKQorCQkJeworCQkJCWJhc2VUZXh0dXJlLT5iaW5kKCk7ICAgLy8gRklYTUU6IEJpbmQgaW5kaXZpZHVhbCBzdWItc3VyZmFjZXM/CisJCQl9CisKKwkJCWlmKHRleHR1cmVbc2FtcGxlcl0pCisJCQl7CisJCQkJdGV4dHVyZVtzYW1wbGVyXS0+dW5iaW5kKCk7CisJCQl9CisKKwkJCXRleHR1cmVbc2FtcGxlcl0gPSBiYXNlVGV4dHVyZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlUmVjb3JkZXItPnNldFRleHR1cmUoc2FtcGxlciwgYmFzZVRleHR1cmUpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0VGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc3RhZ2UgPSAlZCwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUgPSAlZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSA9ICVkIiwgc3RhZ2UsIHR5cGUsIHZhbHVlKTsKKworCQlpZihzdGFnZSA8IDAgfHwgc3RhZ2UgPj0gOCB8fCB0eXBlIDwgRDNEVFNTX0NPTE9ST1AgfHwgdHlwZSA+IEQzRFRTU19DT05TVEFOVCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZighc3RhdGVSZWNvcmRlcikKKwkJeworCQkJaWYoIWluaXQgJiYgdGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW3R5cGVdID09IHZhbHVlKQorCQkJeworCQkJCXJldHVybiBEM0RfT0s7CisJCQl9CisKKwkJCXRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVt0eXBlXSA9IHZhbHVlOworCisJCQlzd2l0Y2godHlwZSkKKwkJCXsKKwkJCWNhc2UgRDNEVFNTX0NPTE9ST1A6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRFRPUF9ESVNBQkxFOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0RJU0FCTEUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcxOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcyOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9NT0RVTEFURToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFMlg6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUyWCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFNFg6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEU0WCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0FERDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BREQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9BRERTSUdORUQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQUREU0lHTkVEMlg6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEMlgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9TVUJUUkFDVDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9TVUJUUkFDVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0FERFNNT09USDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTTU9PVEgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORERJRkZVU0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQkxFTkRGQUNUT1JBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVOREZBQ1RPUkFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQVBNKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRDVVJSRU5UQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9QUkVNT0RVTEFURToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9QUkVNT0RVTEFURSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVBTFBIQV9BRERDT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFQ09MT1JfQUREQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0JVTVBFTlZNQVA6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0U6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUExVTUlOQU5DRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0RPVFBST0RVQ1QzOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0RPVDMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9NVUxUSVBMWUFERDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NVUxUSVBMWUFERCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0xFUlA6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTEVSUCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQ09MT1JBUkcxOgorCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCisJCQkJeworCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9ESUZGVVNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DVVJSRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RFWFRVUkU6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9TUEVDVUxBUjoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9TUEVDVUxBUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEVNUDoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT05TVEFOVDoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DT05TVEFOVCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCisJCQkJc3dpdGNoKHZhbHVlICYgfkQzRFRBX1NFTEVDVE1BU0spCisJCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0TW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0NPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQgfCBEM0RUQV9BTFBIQVJFUExJQ0FURToKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0TW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19DT0xPUkFSRzI6CisJCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSBEM0RUQV9ESUZGVVNFOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9ESUZGVVNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DVVJSRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URVhUVVJFOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URkFDVE9SOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SKTsJCQkJCQkKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9TUEVDVUxBUjoKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RFTVA6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NPTlNUQU5UOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DT05TVEFOVCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCisJCQkJc3dpdGNoKHZhbHVlICYgfkQzRFRBX1NFTEVDVE1BU0spCisJCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQUxQSEFSRVBMSUNBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQgfCBEM0RUQV9BTFBIQVJFUExJQ0FURToKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQUxQSEFPUDoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEVE9QX0RJU0FCTEU6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9ESVNBQkxFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfU0VMRUNUQVJHMToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcyOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9NT0RVTEFURTJYOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUyWCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFNFg6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTRYKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQUREOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQUREU0lHTkVEOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQUREU0lHTkVEMlg6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQyWCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX1NVQlRSQUNUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfU1VCVFJBQ1QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9BRERTTU9PVEg6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTTU9PVEgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5ERElGRlVTRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVOREZBQ1RPUkFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBUE0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CTEVORENVUlJFTlRBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfUFJFTU9EVUxBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9QUkVNT0RVTEFURSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUFMUEhBX0FERENPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFQ09MT1JfQUREQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQlVNUEVOVk1BUDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JVTVBFTlZNQVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUExVTUlOQU5DRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0RPVFBST0RVQ1QzOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfRE9UMyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01VTFRJUExZQUREOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTVVMVElQTFlBREQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9MRVJQOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTEVSUCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQUxQSEFBUkcxOgorCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCisJCQkJeworCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URVhUVVJFOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RFTVA6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT05TVEFOVDoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisKKwkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSAwOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0TW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19BTFBIQUFSRzI6CisJCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSBEM0RUQV9ESUZGVVNFOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ1VSUkVOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEVYVFVSRToKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URkFDVE9SOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1NQRUNVTEFSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URU1QOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NPTlNUQU5UOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisKKwkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSAwOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQ09MT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQUxQSEFSRVBMSUNBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNTX0JVTVBFTlZNQVQwMDoKKwkJCQlyZW5kZXJlci0+c2V0QnVtcG1hcE1hdHJpeChzdGFnZSwgMCwgKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19CVU1QRU5WTUFUMDE6CisJCQkJcmVuZGVyZXItPnNldEJ1bXBtYXBNYXRyaXgoc3RhZ2UsIDEsIChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQlVNUEVOVk1BVDEwOgorCQkJCXJlbmRlcmVyLT5zZXRCdW1wbWFwTWF0cml4KHN0YWdlLCAyLCAoZmxvYXQmKXZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNTX0JVTVBFTlZNQVQxMToKKwkJCQlyZW5kZXJlci0+c2V0QnVtcG1hcE1hdHJpeChzdGFnZSwgMywgKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19URVhDT09SRElOREVYOgorCQkJCXJlbmRlcmVyLT5zZXRUZXhDb29yZEluZGV4KHN0YWdlLCB2YWx1ZSAmIDB4MDAwMEZGRkYpOworCisJCQkJc3dpdGNoKHZhbHVlICYgMHhGRkZGMDAwMCkKKwkJCQl7CisJCQkJY2FzZSBEM0RUU1NfVENJX1BBU1NUSFJVOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4R2VuKHN0YWdlLCBzdzo6Q29udGV4dDo6VEVYR0VOX1BBU1NUSFJVKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUU1NfVENJX0NBTUVSQVNQQUNFTk9STUFMOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4Q29vcmRJbmRleChzdGFnZSwgc3RhZ2UpOworCQkJCQlyZW5kZXJlci0+c2V0VGV4R2VuKHN0YWdlLCBzdzo6Q29udGV4dDo6VEVYR0VOX05PUk1BTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVBPU0lUSU9OOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4Q29vcmRJbmRleChzdGFnZSwgc3RhZ2UpOworCQkJCQlyZW5kZXJlci0+c2V0VGV4R2VuKHN0YWdlLCBzdzo6Q29udGV4dDo6VEVYR0VOX1BPU0lUSU9OKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUU1NfVENJX0NBTUVSQVNQQUNFUkVGTEVDVElPTlZFQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldFRleENvb3JkSW5kZXgoc3RhZ2UsIHN0YWdlKTsKKwkJCQkJcmVuZGVyZXItPnNldFRleEdlbihzdGFnZSwgc3c6OkNvbnRleHQ6OlRFWEdFTl9SRUZMRUNUSU9OKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUU1NfVENJX1NQSEVSRU1BUDoKKwkJCQkJcmVuZGVyZXItPnNldFRleENvb3JkSW5kZXgoc3RhZ2UsIHN0YWdlKTsKKwkJCQkJcmVuZGVyZXItPnNldFRleEdlbihzdGFnZSwgc3c6OkNvbnRleHQ6OlRFWEdFTl9TUEhFUkVNQVApOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNTX0JVTVBFTlZMU0NBTEU6CisJCQkJcmVuZGVyZXItPnNldEx1bWluYW5jZVNjYWxlKHN0YWdlLCAoZmxvYXQmKXZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNTX0JVTVBFTlZMT0ZGU0VUOgorCQkJCXJlbmRlcmVyLT5zZXRMdW1pbmFuY2VPZmZzZXQoc3RhZ2UsIChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTOgorCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUVEZGX1BST0pFQ1RFRCkKKwkJCQl7CisJCQkJY2FzZSBEM0RUVEZGX0RJU0FCTEU6CisJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlVHJhbnNmb3JtKHN0YWdlLCAwLCAodmFsdWUgJiBEM0RUVEZGX1BST0pFQ1RFRCkgPT0gRDNEVFRGRl9QUk9KRUNURUQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRURkZfQ09VTlQxOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVRyYW5zZm9ybShzdGFnZSwgMSwgKHZhbHVlICYgRDNEVFRGRl9QUk9KRUNURUQpID09IEQzRFRURkZfUFJPSkVDVEVEKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUVEZGX0NPVU5UMjoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVUcmFuc2Zvcm0oc3RhZ2UsIDIsICh2YWx1ZSAmIEQzRFRURkZfUFJPSkVDVEVEKSA9PSBEM0RUVEZGX1BST0pFQ1RFRCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVFRGRl9DT1VOVDM6CisJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlVHJhbnNmb3JtKHN0YWdlLCAzLCAodmFsdWUgJiBEM0RUVEZGX1BST0pFQ1RFRCkgPT0gRDNEVFRGRl9QUk9KRUNURUQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRURkZfQ09VTlQ0OgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVRyYW5zZm9ybShzdGFnZSwgNCwgKHZhbHVlICYgRDNEVFRGRl9QUk9KRUNURUQpID09IEQzRFRURkZfUFJPSkVDVEVEKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19DT0xPUkFSRzA6CisJCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSBEM0RUQV9DVVJSRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0RJRkZVU0U6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfRElGRlVTRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfU1BFQ1VMQVI6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RFTVA6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVNUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEVYVFVSRToKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URkFDVE9SOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKworCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUQV9TRUxFQ1RNQVNLKQorCQkJCXsKKwkJCQljYXNlIDA6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkNPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9BTFBIQVJFUExJQ0FURToKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0FMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UIHwgRDNEVEFfQUxQSEFSRVBMSUNBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQUxQSEFBUkcwOgorCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCisJCQkJeworCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URVhUVVJFOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RFTVA6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT05TVEFOVDoKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisKKwkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSAwOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfUkVTVUxUQVJHOgorCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCisJCQkJeworCQkJCWNhc2UgRDNEVEFfQ1VSUkVOVDoKKwkJCQkJcmVuZGVyZXItPnNldERlc3RpbmF0aW9uQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OkRFU1RJTkFUSU9OX0NVUlJFTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RFTVA6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0aW5hdGlvbkFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpERVNUSU5BVElPTl9URU1QKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19DT05TVEFOVDoKKwkJCQlyZW5kZXJlci0+c2V0Q29uc3RhbnRDb2xvcihzdGFnZSwgdmFsdWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCQl9CisJCWVsc2UgICAvLyBzdGF0ZVJlY29yZGVyCisJCXsKKwkJCXN0YXRlUmVjb3JkZXItPnNldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCB0eXBlLCB2YWx1ZSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlID0gJWQsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4ID0gMHglMC44cCIsIHN0YXRlLCBtYXRyaXgpOworCisJCWlmKCFtYXRyaXgpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCXRoaXMtPm1hdHJpeFtzdGF0ZV0gPSAqbWF0cml4OworCisJCQlzdzo6TWF0cml4IE0obWF0cml4LT5fMTEsIG1hdHJpeC0+XzIxLCBtYXRyaXgtPl8zMSwgbWF0cml4LT5fNDEsCisJCQkgICAgICAgICAgICAgbWF0cml4LT5fMTIsIG1hdHJpeC0+XzIyLCBtYXRyaXgtPl8zMiwgbWF0cml4LT5fNDIsCisJCQkgICAgICAgICAgICAgbWF0cml4LT5fMTMsIG1hdHJpeC0+XzIzLCBtYXRyaXgtPl8zMywgbWF0cml4LT5fNDMsCisJCQkgICAgICAgICAgICAgbWF0cml4LT5fMTQsIG1hdHJpeC0+XzI0LCBtYXRyaXgtPl8zNCwgbWF0cml4LT5fNDQpOworCisJCQlzd2l0Y2goc3RhdGUpCisJCQl7CisJCQljYXNlIEQzRFRTX1dPUkxEOgorCQkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNfVklFVzoKKwkJCQlyZW5kZXJlci0+c2V0Vmlld01hdHJpeChNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNfUFJPSkVDVElPTjoKKwkJCQlyZW5kZXJlci0+c2V0UHJvamVjdGlvbk1hdHJpeChNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNfVEVYVFVSRTA6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMCwgTSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTX1RFWFRVUkUxOgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDEsIE0pOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU19URVhUVVJFMjoKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgyLCBNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNfVEVYVFVSRTM6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMywgTSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTX1RFWFRVUkU0OgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDQsIE0pOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU19URVhUVVJFNToKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg1LCBNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNfVEVYVFVSRTY6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNiwgTSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTX1RFWFRVUkU3OgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDcsIE0pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZihzdGF0ZSA+IDI1NiAmJiBzdGF0ZSA8IDUxMikKKwkJCQl7CisJCQkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChNLCBzdGF0ZSAtIDI1Nik7CisJCQkJfQorCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCQllbHNlICAgLy8gc3RhdGVSZWNvcmRlcgorCQl7CisJCQlzdGF0ZVJlY29yZGVyLT5zZXRUcmFuc2Zvcm0oc3RhdGUsIG1hdHJpeCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmlWZXJ0ZXhEZWNsYXJhdGlvbikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsYXJhdGlvbiA9IDB4JTAuOHAiLCBpVmVydGV4RGVjbGFyYXRpb24pOworCisJCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICp2ZXJ0ZXhEZWNsYXJhdGlvbiA9IHN0YXRpY19jYXN0PERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245Kj4oaVZlcnRleERlY2xhcmF0aW9uKTsKKworCQlpZighc3RhdGVSZWNvcmRlcikKKwkJeworCQkJaWYodGhpcy0+dmVydGV4RGVjbGFyYXRpb24gPT0gdmVydGV4RGVjbGFyYXRpb24pCisJCQl7CisJCQkJcmV0dXJuIEQzRF9PSzsKKwkJCX0KKworCQkJaWYodmVydGV4RGVjbGFyYXRpb24pCisJCQl7CisJCQkJdmVydGV4RGVjbGFyYXRpb24tPmJpbmQoKTsKKwkJCX0KKworCQkJaWYodGhpcy0+dmVydGV4RGVjbGFyYXRpb24pCisJCQl7CisJCQkJdGhpcy0+dmVydGV4RGVjbGFyYXRpb24tPnVuYmluZCgpOworCQkJfQorCisJCQl0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbiA9IHZlcnRleERlY2xhcmF0aW9uOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0VmVydGV4RGVjbGFyYXRpb24odmVydGV4RGVjbGFyYXRpb24pOworCQl9CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRWZXJ0ZXhTaGFkZXIoSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqaVZlcnRleFNoYWRlcikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqc2hhZGVyID0gMHglMC44cCIsIGlWZXJ0ZXhTaGFkZXIpOworCisJCURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdmVydGV4U2hhZGVyID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RWZXJ0ZXhTaGFkZXI5Kj4oaVZlcnRleFNoYWRlcik7CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCWlmKHRoaXMtPnZlcnRleFNoYWRlciA9PSB2ZXJ0ZXhTaGFkZXIpCisJCQl7CisJCQkJcmV0dXJuIEQzRF9PSzsKKwkJCX0KKwkJCQorCQkJaWYodmVydGV4U2hhZGVyKQorCQkJeworCQkJCXZlcnRleFNoYWRlci0+YmluZCgpOworCQkJfQorCisJCQlpZih0aGlzLT52ZXJ0ZXhTaGFkZXIpCisJCQl7CisJCQkJdGhpcy0+dmVydGV4U2hhZGVyLT51bmJpbmQoKTsKKwkJCX0KKworCQkJdGhpcy0+dmVydGV4U2hhZGVyID0gdmVydGV4U2hhZGVyOworCQkJdmVydGV4U2hhZGVyRGlydHkgPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0VmVydGV4U2hhZGVyKHZlcnRleFNoYWRlcik7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKworCQlpZighY29uc3RhbnREYXRhKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQgJiYgc3RhcnRSZWdpc3RlciArIGkgPCAxNjsgaSsrKQorCQkJeworCQkJCXZlcnRleFNoYWRlckNvbnN0YW50QltzdGFydFJlZ2lzdGVyICsgaV0gPSBjb25zdGFudERhdGFbaV07CisJCQl9CisJCQkKKwkJCXZlcnRleFNoYWRlckNvbnN0YW50c0JEaXJ0eSA9IHN3OjptYXgoc3RhcnRSZWdpc3RlciArIGNvdW50LCB2ZXJ0ZXhTaGFkZXJDb25zdGFudHNCRGlydHkpOworCQkJdmVydGV4U2hhZGVyRGlydHkgPSB0cnVlOyAgIC8vIFJlbG9hZCBERUYgY29uc3RhbnRzCisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgY29uc3QgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCisJCWlmKCFjb25zdGFudERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudCAmJiBzdGFydFJlZ2lzdGVyICsgaSA8IDI1NjsgaSsrKQorCQkJeworCQkJCXZlcnRleFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bMF0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAwXTsKKwkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzFdID0gY29uc3RhbnREYXRhW2kgKiA0ICsgMV07CisJCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDJdOworCQkJCXZlcnRleFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bM10gPSBjb25zdGFudERhdGFbaSAqIDQgKyAzXTsKKwkJCX0KKwkJCQorCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRzRkRpcnR5ID0gc3c6Om1heChzdGFydFJlZ2lzdGVyICsgY291bnQsIHZlcnRleFNoYWRlckNvbnN0YW50c0ZEaXJ0eSk7CisJCQl2ZXJ0ZXhTaGFkZXJEaXJ0eSA9IHRydWU7ICAgLy8gUmVsb2FkIERFRiBjb25zdGFudHMKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlUmVjb3JkZXItPnNldFZlcnRleFNoYWRlckNvbnN0YW50RihzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTk6OlNldFZlcnRleFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgY29uc3QgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCisJCWlmKCFjb25zdGFudERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoIXN0YXRlUmVjb3JkZXIpCisJCXsKKwkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudCAmJiBzdGFydFJlZ2lzdGVyICsgaSA8IDE2OyBpKyspCisJCQl7CisJCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVswXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDBdOworCQkJCXZlcnRleFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyICsgaV1bMV0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAxXTsKKwkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudElbc3RhcnRSZWdpc3RlciArIGldWzJdID0gY29uc3RhbnREYXRhW2kgKiA0ICsgMl07CisJCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVszXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDNdOworCQkJfQorCQkJCisJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudHNJRGlydHkgPSBzdzo6bWF4KHN0YXJ0UmVnaXN0ZXIgKyBjb3VudCwgdmVydGV4U2hhZGVyQ29uc3RhbnRzSURpcnR5KTsKKwkJCXZlcnRleFNoYWRlckRpcnR5ID0gdHJ1ZTsgICAvLyBSZWxvYWQgREVGIGNvbnN0YW50cworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCA9IDB4JTAuOHAiLCB2aWV3cG9ydCk7CisKKwkJaWYoIXZpZXdwb3J0KSAgIC8vIEZJWE1FOiBDaGVjayBpZiB2YWxpZAorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFzdGF0ZVJlY29yZGVyKQorCQl7CisJCQl0aGlzLT52aWV3cG9ydCA9ICp2aWV3cG9ydDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlUmVjb3JkZXItPnNldFZpZXdwb3J0KHZpZXdwb3J0KTsKKwkJfQorCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlpbnQgRGlyZWN0M0REZXZpY2U5OjpTaG93Q3Vyc29yKGludCBzaG93KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJpbnQgc2hvdyA9ICVkIiwgc2hvdyk7CisKKwkJaW50IG9sZFZhbHVlID0gc2hvd0N1cnNvciA/IFRSVUUgOiBGQUxTRTsKKwkJc2hvd0N1cnNvciA9IHNob3cgIT0gRkFMU0U7CisKKwkJaWYoc2hvd0N1cnNvcikKKwkJeworCQkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JJbWFnZShjdXJzb3IpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JJbWFnZSgwKTsKKwkJfQorCisJCXJldHVybiBvbGRWYWx1ZTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6U3RyZXRjaFJlY3QoSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2UsIGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0U3VyZmFjZSwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlcikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0ID0gMHglMC44cCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlID0gMHglMC44cCwgY29uc3QgUkVDVCAqZGVzdFJlY3QgPSAweCUwLjhwLCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIgPSAlZCIsIHNvdXJjZVN1cmZhY2UsIHNvdXJjZVJlY3QsIGRlc3RTdXJmYWNlLCBkZXN0UmVjdCwgZmlsdGVyKTsKKworCQlpZighc291cmNlU3VyZmFjZSB8fCAhZGVzdFN1cmZhY2UgfHwgIXZhbGlkUmVjdGFuZ2xlKHNvdXJjZVJlY3QsIHNvdXJjZVN1cmZhY2UpIHx8ICF2YWxpZFJlY3RhbmdsZShkZXN0UmVjdCwgZGVzdFN1cmZhY2UpKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCUQzRFNVUkZBQ0VfREVTQyBzb3VyY2VEZXNjcmlwdGlvbjsKKwkJRDNEU1VSRkFDRV9ERVNDIGRlc3REZXNjcmlwdGlvbjsKKworCQlzb3VyY2VTdXJmYWNlLT5HZXREZXNjKCZzb3VyY2VEZXNjcmlwdGlvbik7CisJCWRlc3RTdXJmYWNlLT5HZXREZXNjKCZkZXN0RGVzY3JpcHRpb24pOworCisJCWlmKHNvdXJjZURlc2NyaXB0aW9uLlBvb2wgIT0gRDNEUE9PTF9ERUZBVUxUIHx8IGRlc3REZXNjcmlwdGlvbi5Qb29sICE9IEQzRFBPT0xfREVGQVVMVCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKwkJCisJCURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERpcmVjdDNEU3VyZmFjZTkqPihzb3VyY2VTdXJmYWNlKTsKKwkJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdCA9IHN0YXRpY19jYXN0PERpcmVjdDNEU3VyZmFjZTkqPihkZXN0U3VyZmFjZSk7CisKKwkJc3RyZXRjaFJlY3Qoc291cmNlLCBzb3VyY2VSZWN0LCBkZXN0LCBkZXN0UmVjdCwgZmlsdGVyKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpUZXN0Q29vcGVyYXRpdmVMZXZlbCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpVcGRhdGVTdXJmYWNlKElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdGluYXRpb25TdXJmYWNlLCBjb25zdCBQT0lOVCAqZGVzdFBvaW50KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJJRGlyZWN0M0RTdXJmYWNlOSAqc291cmNlU3VyZmFjZSA9IDB4JTAuOHAsIGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QgPSAweCUwLjhwLCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdGluYXRpb25TdXJmYWNlID0gMHglMC44cCwgY29uc3QgUE9JTlQgKmRlc3RQb2ludCA9IDB4JTAuOHAiLCBzb3VyY2VTdXJmYWNlLCBzb3VyY2VSZWN0LCBkZXN0aW5hdGlvblN1cmZhY2UsIGRlc3RQb2ludCk7CisKKwkJaWYoIXNvdXJjZVN1cmZhY2UgfHwgIWRlc3RpbmF0aW9uU3VyZmFjZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlEM0RTVVJGQUNFX0RFU0Mgc291cmNlRGVzY3JpcHRpb247CisJCUQzRFNVUkZBQ0VfREVTQyBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uOworCisJCXNvdXJjZVN1cmZhY2UtPkdldERlc2MoJnNvdXJjZURlc2NyaXB0aW9uKTsKKwkJZGVzdGluYXRpb25TdXJmYWNlLT5HZXREZXNjKCZkZXN0aW5hdGlvbkRlc2NyaXB0aW9uKTsKKworCQlSRUNUIHNSZWN0OworCQlSRUNUIGRSZWN0OworCQkKKwkJaWYoc291cmNlUmVjdCkKKwkJeworCQkJc1JlY3QubGVmdCA9IHNvdXJjZVJlY3QtPmxlZnQ7CisJCQlzUmVjdC50b3AgPSBzb3VyY2VSZWN0LT50b3A7CisJCQlzUmVjdC5yaWdodCA9IHNvdXJjZVJlY3QtPnJpZ2h0OworCQkJc1JlY3QuYm90dG9tID0gc291cmNlUmVjdC0+Ym90dG9tOworCQl9CisJCWVsc2UKKwkJeworCQkJc1JlY3QubGVmdCA9IDA7CisJCQlzUmVjdC50b3AgPSAwOworCQkJc1JlY3QucmlnaHQgPSBzb3VyY2VEZXNjcmlwdGlvbi5XaWR0aDsKKwkJCXNSZWN0LmJvdHRvbSA9IHNvdXJjZURlc2NyaXB0aW9uLkhlaWdodDsKKwkJfQorCisJCWlmKGRlc3RQb2ludCkKKwkJeworCQkJZFJlY3QubGVmdCA9IGRlc3RQb2ludC0+eDsKKwkJCWRSZWN0LnRvcCA9IGRlc3RQb2ludC0+eTsKKwkJCWRSZWN0LnJpZ2h0ID0gZGVzdFBvaW50LT54ICsgc1JlY3QucmlnaHQgLSBzUmVjdC5sZWZ0OworCQkJZFJlY3QuYm90dG9tID0gZGVzdFBvaW50LT55ICsgc1JlY3QuYm90dG9tIC0gc1JlY3QudG9wOworCQl9CisJCWVsc2UKKwkJeworCQkJZFJlY3QubGVmdCA9IDA7CisJCQlkUmVjdC50b3AgPSAwOworCQkJZFJlY3QucmlnaHQgPSBzUmVjdC5yaWdodCAtIHNSZWN0LmxlZnQ7CisJCQlkUmVjdC5ib3R0b20gPSBzUmVjdC5ib3R0b20gLSBzUmVjdC50b3A7CisJCX0KKworCQlpZighdmFsaWRSZWN0YW5nbGUoJnNSZWN0LCBzb3VyY2VTdXJmYWNlKSB8fCAhdmFsaWRSZWN0YW5nbGUoJmRSZWN0LCBkZXN0aW5hdGlvblN1cmZhY2UpKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWludCBzV2lkdGggPSBzUmVjdC5yaWdodCAtIHNSZWN0LmxlZnQ7CisJCWludCBzSGVpZ2h0ID0gc1JlY3QuYm90dG9tIC0gc1JlY3QudG9wOworCisJCWludCBkV2lkdGggPSBkUmVjdC5yaWdodCAtIGRSZWN0LmxlZnQ7CisJCWludCBkSGVpZ2h0ID0gZFJlY3QuYm90dG9tIC0gZFJlY3QudG9wOworCisJCWlmKHNvdXJjZURlc2NyaXB0aW9uLk11bHRpU2FtcGxlVHlwZSAgICAgICE9IEQzRE1VTFRJU0FNUExFX05PTkUgfHwKKwkJICAgZGVzdGluYXRpb25EZXNjcmlwdGlvbi5NdWx0aVNhbXBsZVR5cGUgIT0gRDNETVVMVElTQU1QTEVfTk9ORSB8fAorCQkvLyBzb3VyY2VEZXNjcmlwdGlvbi5Qb29sICAgICAgIT0gRDNEUE9PTF9TWVNURU1NRU0gfHwgICAvLyBGSVhNRTogQ2hlY2sgYmFjayBidWZmZXIgYW5kIGRlcHRoIGJ1ZmZlciBtZW1vcnkgcG9vbCBmbGFncworCQkvLyBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLlBvb2wgIT0gRDNEUE9PTF9ERUZBVUxUIHx8CisJCSAgIHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCAhPSBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLkZvcm1hdCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKwkJCisJCXN3OjpTdXJmYWNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFN1cmZhY2U5Kj4oc291cmNlU3VyZmFjZSk7CisJCXN3OjpTdXJmYWNlICpkZXN0ID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOSo+KGRlc3RpbmF0aW9uU3VyZmFjZSk7CisKKwkJdW5zaWduZWQgY2hhciAqc0J1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKilzb3VyY2UtPmxvY2tFeHRlcm5hbChzUmVjdC5sZWZ0LCBzUmVjdC50b3AsIDAsIHN3OjpMT0NLX1JFQURPTkxZLCBzdzo6UFVCTElDKTsKKwkJdW5zaWduZWQgY2hhciAqZEJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKilkZXN0LT5sb2NrRXh0ZXJuYWwoZFJlY3QubGVmdCwgZFJlY3QudG9wLCAwLCBzdzo6TE9DS19XUklURU9OTFksIHN3OjpQVUJMSUMpOworCQlpbnQgc1BpdGNoID0gc291cmNlLT5nZXRFeHRlcm5hbFBpdGNoQigpOworCQlpbnQgZFBpdGNoID0gZGVzdC0+Z2V0RXh0ZXJuYWxQaXRjaEIoKTsKKworCQl1bnNpZ25lZCBpbnQgd2lkdGg7CisJCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJCXVuc2lnbmVkIGludCBieXRlczsKKworCQlzd2l0Y2goc291cmNlRGVzY3JpcHRpb24uRm9ybWF0KQorCQl7CisJCWNhc2UgRDNERk1UX0RYVDE6CisJCWNhc2UgRDNERk1UX0FUSTE6CisJCQl3aWR0aCA9IChkV2lkdGggKyAzKSAvIDQ7CisJCQloZWlnaHQgPSAoZEhlaWdodCArIDMpIC8gNDsKKwkJCWJ5dGVzID0gd2lkdGggKiA4OyAgIC8vIDY0IGJpdCBwZXIgNHg0IGJsb2NrCisJCQlicmVhazsKKwkJY2FzZSBEM0RGTVRfRFhUMjoKKwkJY2FzZSBEM0RGTVRfRFhUMzoKKwkJY2FzZSBEM0RGTVRfRFhUNDoKKwkJY2FzZSBEM0RGTVRfRFhUNToKKwkJY2FzZSBEM0RGTVRfQVRJMjoKKwkJCXdpZHRoID0gKGRXaWR0aCArIDMpIC8gNDsKKwkJCWhlaWdodCA9IChkSGVpZ2h0ICsgMykgLyA0OworCQkJYnl0ZXMgPSB3aWR0aCAqIDE2OyAgIC8vIDEyOCBiaXQgcGVyIDR4NCBibG9jaworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl3aWR0aCA9IGRXaWR0aDsKKwkJCWhlaWdodCA9IGRIZWlnaHQ7CisJCQlieXRlcyA9IHdpZHRoICogRGlyZWN0M0RTdXJmYWNlOTo6Ynl0ZXMoc291cmNlRGVzY3JpcHRpb24uRm9ybWF0KTsKKwkJfQorCisJCWlmKHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCA9PSBEM0RGTVRfQVRJMSB8fCBzb3VyY2VEZXNjcmlwdGlvbi5Gb3JtYXQgPT0gRDNERk1UX0FUSTIpCisJCXsKKwkJCS8vIE1ha2UgdGhlIHBpdGNoIGNvcnJlc3BvbmQgdG8gNCByb3dzCisJCQlzUGl0Y2ggKj0gNDsKKwkJCWRQaXRjaCAqPSA0OworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQl7CisJCQltZW1jcHkoZEJ1ZmZlciwgc0J1ZmZlciwgYnl0ZXMpOworCQkJCisJCQlzQnVmZmVyICs9IHNQaXRjaDsKKwkJCWRCdWZmZXIgKz0gZFBpdGNoOworCQl9CisKKwkJc291cmNlLT51bmxvY2tFeHRlcm5hbCgpOworCQlkZXN0LT51bmxvY2tFeHRlcm5hbCgpOworCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6VXBkYXRlVGV4dHVyZShJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnNvdXJjZVRleHR1cmUsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqZGVzdGluYXRpb25UZXh0dXJlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVRSQUNFKCJJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnNvdXJjZVRleHR1cmUgPSAweCUwLjhwLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKmRlc3RpbmF0aW9uVGV4dHVyZSA9IDB4JTAuOHAiLCBzb3VyY2VUZXh0dXJlLCBkZXN0aW5hdGlvblRleHR1cmUpOworCisJCWlmKCFzb3VyY2VUZXh0dXJlIHx8ICFkZXN0aW5hdGlvblRleHR1cmUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJLy8gRklYTUU6IENoZWNrIG1lbW9yeSBwb29scworCisJCUQzRFJFU09VUkNFVFlQRSB0eXBlID0gc291cmNlVGV4dHVyZS0+R2V0VHlwZSgpOworCisJCWlmKHR5cGUgIT0gZGVzdGluYXRpb25UZXh0dXJlLT5HZXRUeXBlKCkpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJc3dpdGNoKHR5cGUpCisJCXsKKwkJY2FzZSBEM0RSVFlQRV9URVhUVVJFOgorCQkJeworCQkJCUlEaXJlY3QzRFRleHR1cmU5ICpzb3VyY2U7CisJCQkJSURpcmVjdDNEVGV4dHVyZTkgKmRlc3Q7CisKKwkJCQlzb3VyY2VUZXh0dXJlLT5RdWVyeUludGVyZmFjZShJSURfSURpcmVjdDNEVGV4dHVyZTksICh2b2lkKiopJnNvdXJjZSk7CisJCQkJZGVzdGluYXRpb25UZXh0dXJlLT5RdWVyeUludGVyZmFjZShJSURfSURpcmVjdDNEVGV4dHVyZTksICh2b2lkKiopJmRlc3QpOworCisJCQkJQVNTRVJUKHNvdXJjZSAmJiBkZXN0KTsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHNvdXJjZS0+R2V0TGV2ZWxDb3VudCgpICYmIGxldmVsIDwgZGVzdC0+R2V0TGV2ZWxDb3VudCgpOyBsZXZlbCsrKSAgIC8vIEZJWE1FOiBGYWlsIHdoZW4gc291cmNlIHRleHR1cmUgaGFzIGZld2VyIGxldmVscyB0aGFuIHRoZSBkZXN0aW5hdGlvbgorCQkJCXsKKwkJCQkJSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2U7CisJCQkJCUlEaXJlY3QzRFN1cmZhY2U5ICpkZXN0aW5hdGlvblN1cmZhY2U7CisKKwkJCQkJc291cmNlLT5HZXRTdXJmYWNlTGV2ZWwobGV2ZWwsICZzb3VyY2VTdXJmYWNlKTsKKwkJCQkJZGVzdC0+R2V0U3VyZmFjZUxldmVsKGxldmVsLCAmZGVzdGluYXRpb25TdXJmYWNlKTsKKworCQkJCQlVcGRhdGVTdXJmYWNlKHNvdXJjZVN1cmZhY2UsIDAsIGRlc3RpbmF0aW9uU3VyZmFjZSwgMCk7CisKKwkJCQkJc291cmNlU3VyZmFjZS0+UmVsZWFzZSgpOworCQkJCQlkZXN0aW5hdGlvblN1cmZhY2UtPlJlbGVhc2UoKTsKKwkJCQl9CisKKwkJCQlzb3VyY2UtPlJlbGVhc2UoKTsKKwkJCQlkZXN0LT5SZWxlYXNlKCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBEM0RSVFlQRV9WT0xVTUVURVhUVVJFOgorCQkJeworCQkJCUlEaXJlY3QzRFZvbHVtZVRleHR1cmU5ICpzb3VyY2U7CisJCQkJSURpcmVjdDNEVm9sdW1lVGV4dHVyZTkgKmRlc3Q7CisKKwkJCQlzb3VyY2VUZXh0dXJlLT5RdWVyeUludGVyZmFjZShJSURfSURpcmVjdDNEVm9sdW1lVGV4dHVyZTksICh2b2lkKiopJnNvdXJjZSk7CisJCQkJZGVzdGluYXRpb25UZXh0dXJlLT5RdWVyeUludGVyZmFjZShJSURfSURpcmVjdDNEVm9sdW1lVGV4dHVyZTksICh2b2lkKiopJmRlc3QpOworCisJCQkJQVNTRVJUKHNvdXJjZSAmJiBkZXN0KTsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHNvdXJjZS0+R2V0TGV2ZWxDb3VudCgpICYmIGxldmVsIDwgZGVzdC0+R2V0TGV2ZWxDb3VudCgpOyBsZXZlbCsrKSAgIC8vIEZJWE1FOiBGYWlsIHdoZW4gc291cmNlIHRleHR1cmUgaGFzIGZld2VyIGxldmVscyB0aGFuIHRoZSBkZXN0aW5hdGlvbgorCQkJCXsKKwkJCQkJSURpcmVjdDNEVm9sdW1lOSAqc291cmNlVm9sdW1lOworCQkJCQlJRGlyZWN0M0RWb2x1bWU5ICpkZXN0aW5hdGlvblZvbHVtZTsKKworCQkJCQlzb3VyY2UtPkdldFZvbHVtZUxldmVsKGxldmVsLCAmc291cmNlVm9sdW1lKTsKKwkJCQkJZGVzdC0+R2V0Vm9sdW1lTGV2ZWwobGV2ZWwsICZkZXN0aW5hdGlvblZvbHVtZSk7CisKKwkJCQkJdXBkYXRlVm9sdW1lKHNvdXJjZVZvbHVtZSwgZGVzdGluYXRpb25Wb2x1bWUpOworCisJCQkJCXNvdXJjZVZvbHVtZS0+UmVsZWFzZSgpOworCQkJCQlkZXN0aW5hdGlvblZvbHVtZS0+UmVsZWFzZSgpOworCQkJCX0KKworCQkJCXNvdXJjZS0+UmVsZWFzZSgpOworCQkJCWRlc3QtPlJlbGVhc2UoKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEQzRFJUWVBFX0NVQkVURVhUVVJFOgorCQkJeworCQkJCUlEaXJlY3QzREN1YmVUZXh0dXJlOSAqc291cmNlOworCQkJCUlEaXJlY3QzREN1YmVUZXh0dXJlOSAqZGVzdDsKKworCQkJCXNvdXJjZVRleHR1cmUtPlF1ZXJ5SW50ZXJmYWNlKElJRF9JRGlyZWN0M0RDdWJlVGV4dHVyZTksICh2b2lkKiopJnNvdXJjZSk7CisJCQkJZGVzdGluYXRpb25UZXh0dXJlLT5RdWVyeUludGVyZmFjZShJSURfSURpcmVjdDNEQ3ViZVRleHR1cmU5LCAodm9pZCoqKSZkZXN0KTsKKworCQkJCUFTU0VSVChzb3VyY2UgJiYgZGVzdCk7CisKKwkJCQlmb3IoaW50IGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKQorCQkJCXsKKwkJCQkJZm9yKHVuc2lnbmVkIGludCBsZXZlbCA9IDA7IGxldmVsIDwgc291cmNlLT5HZXRMZXZlbENvdW50KCkgJiYgbGV2ZWwgPCBkZXN0LT5HZXRMZXZlbENvdW50KCk7IGxldmVsKyspICAgLy8gRklYTUU6IEZhaWwgd2hlbiBzb3VyY2UgdGV4dHVyZSBoYXMgZmV3ZXIgbGV2ZWxzIHRoYW4gdGhlIGRlc3RpbmF0aW9uCisJCQkJCXsKKwkJCQkJCUlEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlOworCQkJCQkJSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RpbmF0aW9uU3VyZmFjZTsKKworCQkJCQkJc291cmNlLT5HZXRDdWJlTWFwU3VyZmFjZSgoRDNEQ1VCRU1BUF9GQUNFUylmYWNlLCBsZXZlbCwgJnNvdXJjZVN1cmZhY2UpOworCQkJCQkJZGVzdC0+R2V0Q3ViZU1hcFN1cmZhY2UoKEQzRENVQkVNQVBfRkFDRVMpZmFjZSwgbGV2ZWwsICZkZXN0aW5hdGlvblN1cmZhY2UpOworCisJCQkJCQlVcGRhdGVTdXJmYWNlKHNvdXJjZVN1cmZhY2UsIDAsIGRlc3RpbmF0aW9uU3VyZmFjZSwgMCk7CisKKwkJCQkJCXNvdXJjZVN1cmZhY2UtPlJlbGVhc2UoKTsKKwkJCQkJCWRlc3RpbmF0aW9uU3VyZmFjZS0+UmVsZWFzZSgpOworCQkJCQl9CisJCQkJfQorCisJCQkJc291cmNlLT5SZWxlYXNlKCk7CisJCQkJZGVzdC0+UmVsZWFzZSgpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlVTklNUExFTUVOVEVEKCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpWYWxpZGF0ZURldmljZSh1bnNpZ25lZCBsb25nICpudW1QYXNzZXMpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgKm51bVBhc3NlcyA9IDB4JTAuOHAiLCBudW1QYXNzZXMpOworCisJCWlmKCFudW1QYXNzZXMpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKm51bVBhc3NlcyA9IDE7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6Z2V0QWRhcHRlckRpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERSAqbW9kZSkKKwl7CisJCXJldHVybiBkM2Q5LT5HZXRBZGFwdGVyRGlzcGxheU1vZGUoYWRhcHRlciwgbW9kZSk7CisJfQorCisJaW50IERpcmVjdDNERGV2aWNlOTo6dHlwZVN0cmlkZSh1bnNpZ25lZCBjaGFyIHN0cmVhbVR5cGUpCisJeworCQlzdGF0aWMgaW50IExVVFtdID0KKwkJeworCQkJNCwJLy8gRDNEREVDTFRZUEVfRkxPQVQxICAgID0gIDAsICAvLyAxRCBmbG9hdCBleHBhbmRlZCB0byAodmFsdWUsIDAuLCAwLiwgMS4pCisJCQk4LAkvLyBEM0RERUNMVFlQRV9GTE9BVDIgICAgPSAgMSwgIC8vIDJEIGZsb2F0IGV4cGFuZGVkIHRvICh2YWx1ZSwgdmFsdWUsIDAuLCAxLikKKwkJCTEyLAkvLyBEM0RERUNMVFlQRV9GTE9BVDMgICAgPSAgMiwgIC8vIDNEIGZsb2F0IGV4cGFuZGVkIHRvICh2YWx1ZSwgdmFsdWUsIHZhbHVlLCAxLikKKwkJCTE2LAkvLyBEM0RERUNMVFlQRV9GTE9BVDQgICAgPSAgMywgIC8vIDREIGZsb2F0CisJCQk0LAkvLyBEM0RERUNMVFlQRV9EM0RDT0xPUiAgPSAgNCwgIC8vIDREIHBhY2tlZCB1bnNpZ25lZCBieXRlcyBtYXBwZWQgdG8gMC4gdG8gMS4gcmFuZ2UuIElucHV0IGlzIGluIEQzRENPTE9SIGZvcm1hdCAoQVJHQikgZXhwYW5kZWQgdG8gKFIsIEcsIEIsIEEpCisJCQk0LAkvLyBEM0RERUNMVFlQRV9VQllURTQgICAgPSAgNSwgIC8vIDREIHVuc2lnbmVkIGJ5dGUKKwkJCTQsCS8vIEQzRERFQ0xUWVBFX1NIT1JUMiAgICA9ICA2LCAgLy8gMkQgc2lnbmVkIHNob3J0IGV4cGFuZGVkIHRvICh2YWx1ZSwgdmFsdWUsIDAuLCAxLikKKwkJCTgsCS8vIEQzRERFQ0xUWVBFX1NIT1JUNCAgICA9ICA3LCAgLy8gNEQgc2lnbmVkIHNob3J0CisJCQk0LAkvLyBEM0RERUNMVFlQRV9VQllURTROICAgPSAgOCwgIC8vIEVhY2ggb2YgNCBieXRlcyBpcyBub3JtYWxpemVkIGJ5IGRpdmlkaW5nIHRvIDI1NS4wCisJCQk0LAkvLyBEM0RERUNMVFlQRV9TSE9SVDJOICAgPSAgOSwgIC8vIDJEIHNpZ25lZCBzaG9ydCBub3JtYWxpemVkICh2WzBdLzMyNzY3LjAsdlsxXS8zMjc2Ny4wLDAsMSkKKwkJCTgsCS8vIEQzRERFQ0xUWVBFX1NIT1JUNE4gICA9IDEwLCAgLy8gNEQgc2lnbmVkIHNob3J0IG5vcm1hbGl6ZWQgKHZbMF0vMzI3NjcuMCx2WzFdLzMyNzY3LjAsdlsyXS8zMjc2Ny4wLHZbM10vMzI3NjcuMCkKKwkJCTQsCS8vIEQzRERFQ0xUWVBFX1VTSE9SVDJOICA9IDExLCAgLy8gMkQgdW5zaWduZWQgc2hvcnQgbm9ybWFsaXplZCAodlswXS82NTUzNS4wLHZbMV0vNjU1MzUuMCwwLDEpCisJCQk4LAkvLyBEM0RERUNMVFlQRV9VU0hPUlQ0TiAgPSAxMiwgIC8vIDREIHVuc2lnbmVkIHNob3J0IG5vcm1hbGl6ZWQgKHZbMF0vNjU1MzUuMCx2WzFdLzY1NTM1LjAsdlsyXS82NTUzNS4wLHZbM10vNjU1MzUuMCkKKwkJCTQsCS8vIEQzRERFQ0xUWVBFX1VERUMzICAgICA9IDEzLCAgLy8gM0QgdW5zaWduZWQgMTAgMTAgMTAgZm9ybWF0IGV4cGFuZGVkIHRvICh2YWx1ZSwgdmFsdWUsIHZhbHVlLCAxKQorCQkJNCwJLy8gRDNEREVDTFRZUEVfREVDM04gICAgID0gMTQsICAvLyAzRCBzaWduZWQgMTAgMTAgMTAgZm9ybWF0IG5vcm1hbGl6ZWQgYW5kIGV4cGFuZGVkIHRvICh2WzBdLzUxMS4wLCB2WzFdLzUxMS4wLCB2WzJdLzUxMS4wLCAxKQorCQkJNCwJLy8gRDNEREVDTFRZUEVfRkxPQVQxNl8yID0gMTUsICAvLyBUd28gMTYtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlcywgZXhwYW5kZWQgdG8gKHZhbHVlLCB2YWx1ZSwgMCwgMSkKKwkJCTgsCS8vIEQzRERFQ0xUWVBFX0ZMT0FUMTZfNCA9IDE2LCAgLy8gRm91ciAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzCisJCQkwLAkvLyBEM0RERUNMVFlQRV9VTlVTRUQgICAgPSAxNywgIC8vIFdoZW4gdGhlIHR5cGUgZmllbGQgaW4gYSBkZWNsIGlzIHVudXNlZC4KKwkJfTsKKworCQlyZXR1cm4gTFVUW3N0cmVhbVR5cGVdOworCX0KKworCWJvb2wgRGlyZWN0M0REZXZpY2U5OjppbnN0YW5jZURhdGEoKQorCXsKKwkJQVNTRVJUKHZlcnRleERlY2xhcmF0aW9uKTsKKworCQlEM0RWRVJURVhFTEVNRU5UOSB2ZXJ0ZXhFbGVtZW50W01BWEQzRERFQ0xMRU5HVEggKyAxXTsKKwkJdW5zaWduZWQgaW50IG51bUVsZW1lbnRzOworCQl2ZXJ0ZXhEZWNsYXJhdGlvbi0+R2V0RGVjbGFyYXRpb24odmVydGV4RWxlbWVudCwgJm51bUVsZW1lbnRzKTsKKworCQlib29sIGluc3RhbmNlRGF0YSA9IGZhbHNlOworCisJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1FbGVtZW50cyAtIDE7IGkrKykKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgc3RyZWFtID0gdmVydGV4RWxlbWVudFtpXS5TdHJlYW07CisKKwkJCWlmKHN0cmVhbSAhPSAwKQorCQkJeworCQkJCWluc3RhbmNlRGF0YSA9IGluc3RhbmNlRGF0YSB8fCAoc3RyZWFtU291cmNlRnJlcVtzdHJlYW1dICYgRDNEU1RSRUFNU09VUkNFX0lOU1RBTkNFREFUQSkgIT0gMDsKKwkJCX0KKwkJfQorCisJCXJldHVybiBpbnN0YW5jZURhdGE7CisJfQorCisJYm9vbCBEaXJlY3QzRERldmljZTk6OmJpbmRSZXNvdXJjZXMoRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4QnVmZmVyKQorCXsKKwkJaWYoIWJpbmRWaWV3cG9ydCgpKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7ICAgLy8gWmVyby1hcmVhIHRhcmdldCByZWdpb24KKwkJfQorCisJCWJpbmRUZXh0dXJlcygpOworCQliaW5kSW5kZXhCdWZmZXIoaW5kZXhCdWZmZXIpOworCQliaW5kU2hhZGVyQ29uc3RhbnRzKCk7CisJCWJpbmRMaWdodHMoKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlOTo6YmluZFZlcnRleFN0cmVhbXMoaW50IGJhc2UsIGJvb2wgaW5zdGFuY2luZywgaW50IGluc3RhbmNlKQorCXsKKwkJQVNTRVJUKHZlcnRleERlY2xhcmF0aW9uKTsKKworCQlyZW5kZXJlci0+cmVzZXRJbnB1dFN0cmVhbXModmVydGV4RGVjbGFyYXRpb24tPmlzUHJlVHJhbnNmb3JtZWQoKSk7CisKKwkJRDNEVkVSVEVYRUxFTUVOVDkgdmVydGV4RWxlbWVudFtNQVhEM0RERUNMTEVOR1RIICsgMV07CisJCXVuc2lnbmVkIGludCBudW1FbGVtZW50czsKKwkJdmVydGV4RGVjbGFyYXRpb24tPkdldERlY2xhcmF0aW9uKHZlcnRleEVsZW1lbnQsICZudW1FbGVtZW50cyk7CisKKwkJLy8gQmluZCB2ZXJ0ZXggZGF0YSBzdHJlYW1zCisJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1FbGVtZW50cyAtIDE7IGkrKykKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgc3RyZWFtID0gdmVydGV4RWxlbWVudFtpXS5TdHJlYW07CisJCQl1bnNpZ25lZCBzaG9ydCBvZmZzZXQgPSB2ZXJ0ZXhFbGVtZW50W2ldLk9mZnNldDsKKwkJCXVuc2lnbmVkIGNoYXIgdHlwZSA9IHZlcnRleEVsZW1lbnRbaV0uVHlwZTsKKwkJCXVuc2lnbmVkIGNoYXIgbWV0aG9kID0gdmVydGV4RWxlbWVudFtpXS5NZXRob2Q7CisJCQl1bnNpZ25lZCBjaGFyIHVzYWdlID0gdmVydGV4RWxlbWVudFtpXS5Vc2FnZTsKKwkJCXVuc2lnbmVkIGNoYXIgaW5kZXggPSB2ZXJ0ZXhFbGVtZW50W2ldLlVzYWdlSW5kZXg7CisKKwkJCUFTU0VSVChtZXRob2QgPT0gRDNEREVDTE1FVEhPRF9ERUZBVUxUKTsJLy8gRklYTUU6IFVuaW1wbGVtZW50ZWQKKwkJCQorCQkJaWYoIWRhdGFTdHJlYW1bc3RyZWFtXSkKKwkJCXsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpzdHJlYW1CdWZmZXIgPSBkYXRhU3RyZWFtW3N0cmVhbV07CisJCQlzdzo6UmVzb3VyY2UgKnJlc291cmNlID0gc3RyZWFtQnVmZmVyLT5nZXRSZXNvdXJjZSgpOworCQkJY29uc3Qgdm9pZCAqYnVmZmVyID0gKChjaGFyKilyZXNvdXJjZS0+Z2V0QnVmZmVyKCkgKyBzdHJlYW1PZmZzZXRbc3RyZWFtXSkgKyBvZmZzZXQ7CisJCQkKKwkJCWludCBzdHJpZGUgPSBzdHJlYW1TdHJpZGVbc3RyZWFtXTsKKworCQkJaWYoaW5zdGFuY2luZyAmJiBzdHJlYW1Tb3VyY2VGcmVxW3N0cmVhbV0gJiBEM0RTVFJFQU1TT1VSQ0VfSU5TVEFOQ0VEQVRBKQorCQkJeworCQkJCWludCBpbnN0YW5jZUZyZXF1ZW5jeSA9IHN0cmVhbVNvdXJjZUZyZXFbc3RyZWFtXSAmIH5EM0RTVFJFQU1TT1VSQ0VfSU5TVEFOQ0VEQVRBOworCQkJCWJ1ZmZlciA9IChjaGFyKilidWZmZXIgKyBzdHJpZGUgKiAoaW5zdGFuY2UgLyBpbnN0YW5jZUZyZXF1ZW5jeSk7CisKKwkJCQlzdHJpZGUgPSAwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJ1ZmZlciA9IChjaGFyKilidWZmZXIgKyBzdHJpZGUgKiBiYXNlOworCQkJfQorCisJCQlzdzo6U3RyZWFtIGF0dHJpYnV0ZShyZXNvdXJjZSwgYnVmZmVyLCBzdHJpZGUpOworCisJCQlzd2l0Y2godHlwZSkKKwkJCXsKKwkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQxOiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAxLCBmYWxzZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQyOiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAyLCBmYWxzZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQzOiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzLCBmYWxzZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQ0OiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCA0LCBmYWxzZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfRDNEQ09MT1I6ICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0NPTE9SLCA0LCBmYWxzZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfVUJZVEU0OiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0JZVEUsIDQsIGZhbHNlKTsgICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfU0hPUlQyOiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCAyLCBmYWxzZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfU0hPUlQ0OiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCA0LCBmYWxzZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfVUJZVEU0TjogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0JZVEUsIDQsIHRydWUpOyAgICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfU0hPUlQyTjogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCAyLCB0cnVlKTsgICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfU0hPUlQ0TjogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCA0LCB0cnVlKTsgICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfVVNIT1JUMk46ICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1VTSE9SVCwgMiwgdHJ1ZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfVVNIT1JUNE46ICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1VTSE9SVCwgNCwgdHJ1ZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfVURFQzM6ICAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1VERUMzLCAzLCBmYWxzZSk7ICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfREVDM046ICAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0RFQzNOLCAzLCB0cnVlKTsgICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQxNl8yOiBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0hBTEYsIDIsIGZhbHNlKTsgICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQxNl80OiBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0hBTEYsIDQsIGZhbHNlKTsgICBicmVhazsKKwkJCWNhc2UgRDNEREVDTFRZUEVfVU5VU0VEOiAgICBhdHRyaWJ1dGUuZGVmYXVsdHMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKworCQkJaWYodmVydGV4U2hhZGVyKQorCQkJeworCQkJCWNvbnN0IHN3OjpWZXJ0ZXhTaGFkZXIgKnNoYWRlciA9IHZlcnRleFNoYWRlci0+Z2V0VmVydGV4U2hhZGVyKCk7CisKKwkJCQlpZighdmVydGV4RGVjbGFyYXRpb24tPmlzUHJlVHJhbnNmb3JtZWQoKSkKKwkJCQl7CisJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJCQl7CisJCQkJCQlpZih1c2FnZSA9PSBzaGFkZXItPmlucHV0W2ldLnVzYWdlICYmCisJCQkJCQkgICBpbmRleCA9PSBzaGFkZXItPmlucHV0W2ldLmluZGV4KQorCQkJCQkJeworCQkJCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShpLCBhdHRyaWJ1dGUpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSAgIC8vIEJpbmQgZGlyZWN0bHkgdG8gdGhlIG91dHB1dAorCQkJCXsKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IDEyOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmKCh1c2FnZSA9PSBzaGFkZXItPm91dHB1dFtpXVswXS51c2FnZSB8fCAodXNhZ2UgPT0gRDNEREVDTFVTQUdFX1BPU0lUSU9OVCAmJiBzaGFkZXItPm91dHB1dFtpXVswXS51c2FnZSA9PSBEM0RERUNMVVNBR0VfUE9TSVRJT04pKSAmJgorCQkJCQkJICAgIGluZGV4ID09IHNoYWRlci0+b3V0cHV0W2ldWzBdLmluZGV4KQorCQkJCQkJeworCQkJCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShpLCBhdHRyaWJ1dGUpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3dpdGNoKHVzYWdlKQorCQkJCXsKKwkJCQljYXNlIEQzRERFQ0xVU0FHRV9QT1NJVElPTjogICAgIHJlbmRlcmVyLT5zZXRJbnB1dFBvc2l0aW9uU3RyZWFtKGF0dHJpYnV0ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJY2FzZSBEM0RERUNMVVNBR0VfQkxFTkRXRUlHSFQ6ICByZW5kZXJlci0+c2V0SW5wdXRCbGVuZFdlaWdodFN0cmVhbShhdHRyaWJ1dGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCWNhc2UgRDNEREVDTFVTQUdFX0JMRU5ESU5ESUNFUzogcmVuZGVyZXItPnNldElucHV0QmxlbmRJbmRpY2VzU3RyZWFtKGF0dHJpYnV0ZS5kZWZpbmUoc3c6OlNUUkVBTVRZUEVfSU5ESUNFUywgMSkpOyBicmVhazsKKwkJCQljYXNlIEQzRERFQ0xVU0FHRV9OT1JNQUw6ICAgICAgIHJlbmRlcmVyLT5zZXRJbnB1dE5vcm1hbFN0cmVhbShhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7ICAgICAgICAgYnJlYWs7CisJCQkJY2FzZSBEM0RERUNMVVNBR0VfUFNJWkU6ICAgICAgICByZW5kZXJlci0+c2V0SW5wdXRQU2l6ZVN0cmVhbShhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAxKSk7ICAgICAgICAgIGJyZWFrOworCQkJCWNhc2UgRDNEREVDTFVTQUdFX1RFWENPT1JEOiAgICAgcmVuZGVyZXItPnNldElucHV0VGV4Q29vcmRTdHJlYW0oYXR0cmlidXRlLCBpbmRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQljYXNlIEQzRERFQ0xVU0FHRV9UQU5HRU5UOiAgICAgIC8qIElnbm9yZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJY2FzZSBEM0RERUNMVVNBR0VfQklOT1JNQUw6ICAgICAvKiBJZ25vcmVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCWNhc2UgRDNEREVDTFVTQUdFX1RFU1NGQUNUT1I6ICAgVU5JTVBMRU1FTlRFRCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQljYXNlIEQzRERFQ0xVU0FHRV9QT1NJVElPTlQ6ICAgIHJlbmRlcmVyLT5zZXRJbnB1dFBvc2l0aW9udFN0cmVhbShhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCA0KSk7ICAgICAgYnJlYWs7CisJCQkJY2FzZSBEM0RERUNMVVNBR0VfQ09MT1I6ICAgICAgICByZW5kZXJlci0+c2V0SW5wdXRDb2xvclN0cmVhbShhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0NPTE9SLCA0KSwgaW5kZXgpOyAgIGJyZWFrOworCQkJCWNhc2UgRDNEREVDTFVTQUdFX0ZPRzogICAgICAgICAgLyogSWdub3JlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQljYXNlIEQzRERFQ0xVU0FHRV9ERVBUSDogICAgICAgIC8qIElnbm9yZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJY2FzZSBEM0RERUNMVVNBR0VfU0FNUExFOiAgICAgICBVTklNUExFTUVOVEVEKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRERldmljZTk6OmJpbmRJbmRleEJ1ZmZlcihEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhCdWZmZXIpCisJeworCQlzdzo6UmVzb3VyY2UgKnJlc291cmNlID0gMDsKKworCQlpZihpbmRleEJ1ZmZlcikKKwkJeworCQkJcmVzb3VyY2UgPSBpbmRleEJ1ZmZlci0+Z2V0UmVzb3VyY2UoKTsKKwkJfQorCisJCXJlbmRlcmVyLT5zZXRJbmRleEJ1ZmZlcihyZXNvdXJjZSk7CisJfQorCisJdm9pZCBEaXJlY3QzRERldmljZTk6OmJpbmRTaGFkZXJDb25zdGFudHMoKQorCXsKKwkJaWYocGl4ZWxTaGFkZXJEaXJ0eSkKKwkJeworCQkJaWYocGl4ZWxTaGFkZXIpCisJCQl7CisJCQkJaWYocGl4ZWxTaGFkZXJDb25zdGFudHNCRGlydHkpCisJCQkJeworCQkJCQlyZW5kZXJlci0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEIoMCwgcGl4ZWxTaGFkZXJDb25zdGFudEIsIHBpeGVsU2hhZGVyQ29uc3RhbnRzQkRpcnR5KTsKKwkJCQl9CisJCQorCQkJCWlmKHBpeGVsU2hhZGVyQ29uc3RhbnRzRkRpcnR5KQorCQkJCXsKKwkJCQkJcmVuZGVyZXItPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKDAsIHBpeGVsU2hhZGVyQ29uc3RhbnRGWzBdLCBwaXhlbFNoYWRlckNvbnN0YW50c0ZEaXJ0eSk7CisJCQkJfQorCQkKKwkJCQlpZihwaXhlbFNoYWRlckNvbnN0YW50c0lEaXJ0eSkKKwkJCQl7CisJCQkJCXJlbmRlcmVyLT5zZXRQaXhlbFNoYWRlckNvbnN0YW50SSgwLCBwaXhlbFNoYWRlckNvbnN0YW50SVswXSwgcGl4ZWxTaGFkZXJDb25zdGFudHNJRGlydHkpOworCQkJCX0KKworCQkJCXJlbmRlcmVyLT5zZXRQaXhlbFNoYWRlcihwaXhlbFNoYWRlci0+Z2V0UGl4ZWxTaGFkZXIoKSk7ICAgLy8gTG9hZHMgc2hhZGVyIGNvbnN0YW50cyBzZXQgd2l0aCBERUYKKwkJCQlwaXhlbFNoYWRlckNvbnN0YW50c0JEaXJ0eSA9IHBpeGVsU2hhZGVyLT5nZXRQaXhlbFNoYWRlcigpLT5kaXJ0eUNvbnN0YW50c0I7ICAgLy8gU2hhZGVyIERFRidlZCBjb25zdGFudHMgYXJlIGRpcnR5CisJCQkJcGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHkgPSBwaXhlbFNoYWRlci0+Z2V0UGl4ZWxTaGFkZXIoKS0+ZGlydHlDb25zdGFudHNGOyAgIC8vIFNoYWRlciBERUYnZWQgY29uc3RhbnRzIGFyZSBkaXJ0eQorCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRzSURpcnR5ID0gcGl4ZWxTaGFkZXItPmdldFBpeGVsU2hhZGVyKCktPmRpcnR5Q29uc3RhbnRzSTsgICAvLyBTaGFkZXIgREVGJ2VkIGNvbnN0YW50cyBhcmUgZGlydHkKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZW5kZXJlci0+c2V0UGl4ZWxTaGFkZXIoMCk7CisJCQl9CisKKwkJCXBpeGVsU2hhZGVyRGlydHkgPSBmYWxzZTsKKwkJfQorCisJCWlmKHZlcnRleFNoYWRlckRpcnR5KQorCQl7CisJCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCQl7CisJCQkJaWYodmVydGV4U2hhZGVyQ29uc3RhbnRzQkRpcnR5KQorCQkJCXsKKwkJCQkJcmVuZGVyZXItPnNldFZlcnRleFNoYWRlckNvbnN0YW50QigwLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudEIsIHZlcnRleFNoYWRlckNvbnN0YW50c0JEaXJ0eSk7CisJCQkJfQorCQkKKwkJCQlpZih2ZXJ0ZXhTaGFkZXJDb25zdGFudHNGRGlydHkpCisJCQkJeworCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKDAsIHZlcnRleFNoYWRlckNvbnN0YW50RlswXSwgdmVydGV4U2hhZGVyQ29uc3RhbnRzRkRpcnR5KTsKKwkJCQl9CisJCQorCQkJCWlmKHZlcnRleFNoYWRlckNvbnN0YW50c0lEaXJ0eSkKKwkJCQl7CisJCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkoMCwgdmVydGV4U2hhZGVyQ29uc3RhbnRJWzBdLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudHNJRGlydHkpOworCQkJCX0KKwkJCQkKKwkJCQlyZW5kZXJlci0+c2V0VmVydGV4U2hhZGVyKHZlcnRleFNoYWRlci0+Z2V0VmVydGV4U2hhZGVyKCkpOyAgIC8vIExvYWRzIHNoYWRlciBjb25zdGFudHMgc2V0IHdpdGggREVGCisJCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRzQkRpcnR5ID0gdmVydGV4U2hhZGVyLT5nZXRWZXJ0ZXhTaGFkZXIoKS0+ZGlydHlDb25zdGFudHNCOyAgIC8vIFNoYWRlciBERUYnZWQgY29uc3RhbnRzIGFyZSBkaXJ0eQorCQkJCXZlcnRleFNoYWRlckNvbnN0YW50c0ZEaXJ0eSA9IHZlcnRleFNoYWRlci0+Z2V0VmVydGV4U2hhZGVyKCktPmRpcnR5Q29uc3RhbnRzRjsgICAvLyBTaGFkZXIgREVGJ2VkIGNvbnN0YW50cyBhcmUgZGlydHkKKwkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudHNJRGlydHkgPSB2ZXJ0ZXhTaGFkZXItPmdldFZlcnRleFNoYWRlcigpLT5kaXJ0eUNvbnN0YW50c0k7ICAgLy8gU2hhZGVyIERFRidlZCBjb25zdGFudHMgYXJlIGRpcnR5CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmVuZGVyZXItPnNldFZlcnRleFNoYWRlcigwKTsKKwkJCX0KKworCQkJdmVydGV4U2hhZGVyRGlydHkgPSBmYWxzZTsKKwkJfQorCX0KKwkKKwl2b2lkIERpcmVjdDNERGV2aWNlOTo6YmluZExpZ2h0cygpCisJeworCQlpZighbGlnaHRzRGlydHkpIHJldHVybjsKKworCQlMaWdodHM6Oml0ZXJhdG9yIGkgPSBsaWdodC5iZWdpbigpOworCQlpbnQgYWN0aXZlID0gMDsKKworCQkvLyBTZXQgYW5kIGVuYWJsZSByZW5kZXJlciBsaWdodHMKKwkJd2hpbGUoYWN0aXZlIDwgOCkKKwkJeworCQkJd2hpbGUoaSAhPSBsaWdodC5lbmQoKSAmJiAhaS0+c2Vjb25kLmVuYWJsZSkKKwkJCXsKKwkJCQlpKys7CisJCQl9CisKKwkJCWlmKGkgPT0gbGlnaHQuZW5kKCkpCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNvbnN0IExpZ2h0ICZsID0gaS0+c2Vjb25kOworCisJCQlzdzo6UG9pbnQgcG9zaXRpb24obC5Qb3NpdGlvbi54LCBsLlBvc2l0aW9uLnksIGwuUG9zaXRpb24ueik7CisJCQlzdzo6Q29sb3I8ZmxvYXQ+IGRpZmZ1c2UobC5EaWZmdXNlLnIsIGwuRGlmZnVzZS5nLCBsLkRpZmZ1c2UuYiwgbC5EaWZmdXNlLmEpOworCQkJc3c6OkNvbG9yPGZsb2F0PiBzcGVjdWxhcihsLlNwZWN1bGFyLnIsIGwuU3BlY3VsYXIuZywgbC5TcGVjdWxhci5iLCBsLlNwZWN1bGFyLmEpOworCQkJc3c6OkNvbG9yPGZsb2F0PiBhbWJpZW50KGwuQW1iaWVudC5yLCBsLkFtYmllbnQuZywgbC5BbWJpZW50LmIsIGwuQW1iaWVudC5hKTsKKwkJCXN3OjpWZWN0b3IgZGlyZWN0aW9uKGwuRGlyZWN0aW9uLngsIGwuRGlyZWN0aW9uLnksIGwuRGlyZWN0aW9uLnopOworCisJCQlyZW5kZXJlci0+c2V0TGlnaHREaWZmdXNlKGFjdGl2ZSwgZGlmZnVzZSk7CisJCQlyZW5kZXJlci0+c2V0TGlnaHRTcGVjdWxhcihhY3RpdmUsIHNwZWN1bGFyKTsKKwkJCXJlbmRlcmVyLT5zZXRMaWdodEFtYmllbnQoYWN0aXZlLCBhbWJpZW50KTsKKwkJCQorCQkJaWYobC5UeXBlID09IEQzRExJR0hUX0RJUkVDVElPTkFMKQorCQkJeworCQkJCS8vIEZJWE1FOiBVbnN1cHBvcnRlZCwgbWFrZSBpdCBhIHBvc2l0aW9uYWwgbGlnaHQgZmFyIGF3YXkgd2l0aG91dCBmYWxsb2ZmCisJCQkJcmVuZGVyZXItPnNldExpZ2h0UG9zaXRpb24oYWN0aXZlLCAtMWUxMGYgKiBkaXJlY3Rpb24pOworCQkJCXJlbmRlcmVyLT5zZXRMaWdodFJhbmdlKGFjdGl2ZSwgbC5SYW5nZSk7CisJCQkJcmVuZGVyZXItPnNldExpZ2h0QXR0ZW51YXRpb24oYWN0aXZlLCAxLCAwLCAwKTsKKwkJCX0KKwkJCWVsc2UgaWYobC5UeXBlID09IEQzRExJR0hUX1NQT1QpCisJCQl7CisJCQkJLy8gRklYTUU6IFVuc3VwcG9ydGVkLCBtYWtlIGl0IGEgcG9zaXRpb25hbCBsaWdodAorCQkJCXJlbmRlcmVyLT5zZXRMaWdodFBvc2l0aW9uKGFjdGl2ZSwgcG9zaXRpb24pOworCQkJCXJlbmRlcmVyLT5zZXRMaWdodFJhbmdlKGFjdGl2ZSwgbC5SYW5nZSk7CisJCQkJcmVuZGVyZXItPnNldExpZ2h0QXR0ZW51YXRpb24oYWN0aXZlLCBsLkF0dGVudWF0aW9uMCwgbC5BdHRlbnVhdGlvbjEsIGwuQXR0ZW51YXRpb24yKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZW5kZXJlci0+c2V0TGlnaHRQb3NpdGlvbihhY3RpdmUsIHBvc2l0aW9uKTsKKwkJCQlyZW5kZXJlci0+c2V0TGlnaHRSYW5nZShhY3RpdmUsIGwuUmFuZ2UpOworCQkJCXJlbmRlcmVyLT5zZXRMaWdodEF0dGVudWF0aW9uKGFjdGl2ZSwgbC5BdHRlbnVhdGlvbjAsIGwuQXR0ZW51YXRpb24xLCBsLkF0dGVudWF0aW9uMik7CisJCQl9CisKKwkJCXJlbmRlcmVyLT5zZXRMaWdodEVuYWJsZShhY3RpdmUsIHRydWUpOworCisJCQlhY3RpdmUrKzsKKwkJCWkrKzsKKwkJfQorCisJCS8vIFJlbWFpbmluZyBsaWdodHMgYXJlIGRpc2FibGVkCisJCXdoaWxlKGFjdGl2ZSA8IDgpCisJCXsKKwkJCXJlbmRlcmVyLT5zZXRMaWdodEVuYWJsZShhY3RpdmUsIGZhbHNlKTsKKworCQkJYWN0aXZlKys7CisJCX0KKworCQlsaWdodHNEaXJ0eSA9IGZhbHNlOworCX0KKworCWJvb2wgRGlyZWN0M0REZXZpY2U5OjpiaW5kVmlld3BvcnQoKQorCXsKKwkJaWYodmlld3BvcnQuV2lkdGggPD0gMCB8fCB2aWV3cG9ydC5IZWlnaHQgPD0gMCkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYoc2Npc3NvckVuYWJsZSkKKwkJeworCQkJUkVDVCBzY2lzc29yID0gc2Npc3NvclJlY3Q7CisKKwkJCWxvbmcgdmlld3BvcnRMZWZ0ID0gdmlld3BvcnQuWDsKKwkJCWxvbmcgdmlld3BvcnRSaWdodCA9IHZpZXdwb3J0LlggKyB2aWV3cG9ydC5XaWR0aDsKKwkJCWxvbmcgdmlld3BvcnRUb3AgPSB2aWV3cG9ydC5ZOworCQkJbG9uZyB2aWV3cG9ydEJvdHRvbSA9IHZpZXdwb3J0LlkgKyB2aWV3cG9ydC5IZWlnaHQ7CisKKwkJCS8vIEludGVyc2VjdGlvbiBvZiBzY2lzc29yIHJlY3RhbmdsZSBhbmQgdmlld3BvcnQKKwkJCWlmKHZpZXdwb3J0TGVmdCA+IHNjaXNzb3IubGVmdCkgc2Npc3Nvci5sZWZ0ID0gdmlld3BvcnRMZWZ0OworCQkJaWYodmlld3BvcnRUb3AgPiBzY2lzc29yLnRvcCkgc2Npc3Nvci50b3AgPSB2aWV3cG9ydFRvcDsKKwkJCWlmKHZpZXdwb3J0UmlnaHQgPCBzY2lzc29yLnJpZ2h0KSBzY2lzc29yLnJpZ2h0ID0gdmlld3BvcnRSaWdodDsKKwkJCWlmKHZpZXdwb3J0Qm90dG9tIDwgc2Npc3Nvci5ib3R0b20pIHNjaXNzb3IuYm90dG9tID0gdmlld3BvcnRCb3R0b207CisKKwkJCWlmKHNjaXNzb3IubGVmdCA9PSBzY2lzc29yLnJpZ2h0IHx8CisJCQkgICBzY2lzc29yLnRvcCA9PSBzY2lzc29yLmJvdHRvbSkKKwkJCXsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vIERpbWVuc2lvbnMgb2Ygc2Npc3NvciByZWN0YW5nbGUgcmVsYXRpdmUgdG8gdmlld3BvcnQKKwkJCWZsb2F0IHJlbGF0aXZlTGVmdCA9IChmbG9hdCkoc2Npc3Nvci5sZWZ0IC0gdmlld3BvcnRMZWZ0KSAvIHZpZXdwb3J0LldpZHRoOworCQkJZmxvYXQgcmVsYXRpdmVSaWdodCA9IChmbG9hdCkoc2Npc3Nvci5yaWdodCAtIHZpZXdwb3J0TGVmdCkgLyB2aWV3cG9ydC5XaWR0aDsKKwkJCWZsb2F0IHJlbGF0aXZlVG9wID0gKGZsb2F0KShzY2lzc29yLnRvcCAtIHZpZXdwb3J0VG9wKSAvIHZpZXdwb3J0LkhlaWdodDsKKwkJCWZsb2F0IHJlbGF0aXZlQm90dG9tID0gKGZsb2F0KShzY2lzc29yLmJvdHRvbSAtIHZpZXdwb3J0VG9wKSAvIHZpZXdwb3J0LkhlaWdodDsKKworCQkJLy8gVHJhbnNmb3JtYXRpb24gb2YgY2xpcCBzcGFjZSBjb29yZGluYXRlcworCQkJZmxvYXQgc1ggPSAxLjBmIC8gKHJlbGF0aXZlUmlnaHQgLSByZWxhdGl2ZUxlZnQpOyAgIC8vIFNjYWxlCisJCQlmbG9hdCB0WCA9IHNYICogKCgwLjVmIC0gcmVsYXRpdmVMZWZ0KSAtIChyZWxhdGl2ZVJpZ2h0IC0gMC41ZikpOyAgIC8vIFRyYW5zbGF0ZQorCQkJZmxvYXQgc1kgPSAxLjBmIC8gKHJlbGF0aXZlQm90dG9tIC0gcmVsYXRpdmVUb3ApOyAgIC8vIFNjYWxlCisJCQlmbG9hdCB0WSA9IHNZICogKCgwLjVmIC0gcmVsYXRpdmVUb3ApIC0gKHJlbGF0aXZlQm90dG9tIC0gMC41ZikpOyAgIC8vIFRyYW5zbGF0ZQorCisJCQkvLyBTZXQgdGhlIG5ldyB2aWV3cG9ydAorCQkJc3c6OlZpZXdwb3J0IHZpZXc7CisKKwkJCXZpZXcuc2V0TGVmdCgoZmxvYXQpc2Npc3Nvci5sZWZ0KTsKKwkJCXZpZXcuc2V0VG9wKChmbG9hdClzY2lzc29yLnRvcCk7CisJCQl2aWV3LnNldFdpZHRoKChmbG9hdCkoc2Npc3Nvci5yaWdodCAtIHNjaXNzb3IubGVmdCkpOworCQkJdmlldy5zZXRIZWlnaHQoKGZsb2F0KShzY2lzc29yLmJvdHRvbSAtIHNjaXNzb3IudG9wKSk7CisKKwkJCXZpZXcuc2V0TmVhcih2aWV3cG9ydC5NaW5aKTsKKwkJCXZpZXcuc2V0RmFyKHZpZXdwb3J0Lk1heFopOworCisJCQlyZW5kZXJlci0+c2V0Vmlld3BvcnQodmlldyk7CisJCQlyZW5kZXJlci0+c2V0UG9zdFRyYW5zZm9ybUVuYWJsZSh0cnVlKTsKKwkJCXJlbmRlcmVyLT5zZXRQb3NTY2FsZShzWCwgc1kpOworCQkJcmVuZGVyZXItPnNldFBvc09mZnNldCh0WCwgLXRZKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFNldCB2aWV3cG9ydAorCQkJc3c6OlZpZXdwb3J0IHZpZXc7CisKKwkJCXZpZXcuc2V0TGVmdCgoZmxvYXQpdmlld3BvcnQuWCk7CisJCQl2aWV3LnNldFRvcCgoZmxvYXQpdmlld3BvcnQuWSk7CisJCQl2aWV3LnNldFdpZHRoKChmbG9hdCl2aWV3cG9ydC5XaWR0aCk7CisJCQl2aWV3LnNldEhlaWdodCgoZmxvYXQpdmlld3BvcnQuSGVpZ2h0KTsKKworCQkJdmlldy5zZXROZWFyKHZpZXdwb3J0Lk1pblopOworCQkJdmlldy5zZXRGYXIodmlld3BvcnQuTWF4Wik7CisKKwkJCXJlbmRlcmVyLT5zZXRWaWV3cG9ydCh2aWV3KTsKKwkJCXJlbmRlcmVyLT5zZXRQb3N0VHJhbnNmb3JtRW5hYmxlKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCXZvaWQgRGlyZWN0M0REZXZpY2U5OjpiaW5kVGV4dHVyZXMoKQorCXsKKwkJZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8IDE2ICsgNDsgc2FtcGxlcisrKQorCQl7CisJCQlEaXJlY3QzREJhc2VUZXh0dXJlOSAqYmFzZVRleHR1cmUgPSB0ZXh0dXJlW3NhbXBsZXJdOworCisJCQlzdzo6U2FtcGxlclR5cGUgdHlwZSA9IHNhbXBsZXIgPCAxNiA/IHN3OjpTQU1QTEVSX1BJWEVMIDogc3c6OlNBTVBMRVJfVkVSVEVYOworCQkJaW50IGluZGV4ID0gc2FtcGxlciA8IDE2ID8gc2FtcGxlciA6IHNhbXBsZXIgLSAxNjsgICAvLyBTYW1wbGVyIGluZGV4IHdpdGhpbiB0eXBlIGdyb3VwCisKKwkJCWJvb2wgdGV4dHVyZVVzZWQgPSBmYWxzZTsKKworCQkJaWYodHlwZSA9PSBzdzo6U0FNUExFUl9QSVhFTCAmJiBwaXhlbFNoYWRlcikKKwkJCXsKKwkJCQl0ZXh0dXJlVXNlZCA9IHBpeGVsU2hhZGVyLT5nZXRQaXhlbFNoYWRlcigpLT51c2VzU2FtcGxlcihpbmRleCk7CisJCQl9CisJCQllbHNlIGlmKHR5cGUgPT0gc3c6OlNBTVBMRVJfVkVSVEVYICYmIHZlcnRleFNoYWRlcikKKwkJCXsKKwkJCQl0ZXh0dXJlVXNlZCA9IHZlcnRleFNoYWRlci0+Z2V0VmVydGV4U2hhZGVyKCktPnVzZXNTYW1wbGVyKGluZGV4KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0ZXh0dXJlVXNlZCA9IHRydWU7ICAgLy8gRklYTUU6IENoZWNrIGZpeGVkLWZ1bmN0aW9uIHVzZT8KKwkJCX0KKworCQkJc3c6OlJlc291cmNlICpyZXNvdXJjZSA9IDA7CisKKwkJCWlmKGJhc2VUZXh0dXJlICYmIHRleHR1cmVVc2VkKQorCQkJeworCQkJCXJlc291cmNlID0gYmFzZVRleHR1cmUtPmdldFJlc291cmNlKCk7CisJCQl9CisKKwkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlUmVzb3VyY2Uoc2FtcGxlciwgcmVzb3VyY2UpOworCQkJCisJCQlpZihiYXNlVGV4dHVyZSAmJiB0ZXh0dXJlVXNlZCkKKwkJCXsKKwkJCQliYXNlVGV4dHVyZS0+R2VuZXJhdGVNaXBTdWJMZXZlbHMoKTsKKwkJCX0KKworCQkJaWYoYmFzZVRleHR1cmUgJiYgdGV4dHVyZVVzZWQpCisJCQl7CisJCQkJaW50IGxldmVsQ291bnQgPSBiYXNlVGV4dHVyZS0+Z2V0SW50ZXJuYWxMZXZlbENvdW50KCk7CisJCQkJCisJCQkJaW50IHRleHR1cmVMT0QgPSBiYXNlVGV4dHVyZS0+R2V0TE9EKCk7CisJCQkJaW50IHNhbXBsZXJMT0QgPSBzYW1wbGVyU3RhdGVbc2FtcGxlcl1bRDNEU0FNUF9NQVhNSVBMRVZFTF07CisJCQkJaW50IExPRCA9IHRleHR1cmVMT0QgPiBzYW1wbGVyTE9EID8gdGV4dHVyZUxPRCA6IHNhbXBsZXJMT0Q7CisKKwkJCQlpZihzYW1wbGVyU3RhdGVbc2FtcGxlcl1bRDNEU0FNUF9NSVBGSUxURVJdID09IEQzRFRFWEZfTk9ORSkKKwkJCQl7CisJCQkJCUxPRCA9IDA7CisJCQkJfQorCisJCQkJc3dpdGNoKGJhc2VUZXh0dXJlLT5HZXRUeXBlKCkpCisJCQkJeworCQkJCWNhc2UgRDNEUlRZUEVfVEVYVFVSRToKKwkJCQkJeworCQkJCQkJRGlyZWN0M0RUZXh0dXJlOSAqdGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzRFRleHR1cmU5Kj4oYmFzZVRleHR1cmUpOworCQkJCQkJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZTsKKworCQkJCQkJZm9yKGludCBtaXBtYXBMZXZlbCA9IDA7IG1pcG1hcExldmVsIDwgTUlQTUFQX0xFVkVMUzsgbWlwbWFwTGV2ZWwrKykKKwkJCQkJCXsKKwkJCQkJCQlpbnQgc3VyZmFjZUxldmVsID0gbWlwbWFwTGV2ZWw7CisKKwkJCQkJCQlpZihzdXJmYWNlTGV2ZWwgPCBMT0QpCisJCQkJCQkJeworCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBMT0Q7CisJCQkJCQkJfQorCisJCQkJCQkJaWYoc3VyZmFjZUxldmVsIDwgMCkKKwkJCQkJCQl7CisJCQkJCQkJCXN1cmZhY2VMZXZlbCA9IDA7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYoc3VyZmFjZUxldmVsID49IGxldmVsQ291bnQpCisJCQkJCQkJeworCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBsZXZlbENvdW50IC0gMTsKKwkJCQkJCQl9CisKKwkJCQkJCQlzdXJmYWNlID0gdGV4dHVyZS0+Z2V0SW50ZXJuYWxTdXJmYWNlTGV2ZWwoc3VyZmFjZUxldmVsKTsKKwkJCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUxldmVsKHNhbXBsZXIsIDAsIG1pcG1hcExldmVsLCBzdXJmYWNlLCBzdzo6VEVYVFVSRV8yRCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RSVFlQRV9DVUJFVEVYVFVSRToKKwkJCQkJZm9yKGludCBmYWNlID0gMDsgZmFjZSA8IDY7IGZhY2UrKykKKwkJCQkJeworCQkJCQkJRGlyZWN0M0RDdWJlVGV4dHVyZTkgKmN1YmVUZXh0dXJlID0gZHluYW1pY19jYXN0PERpcmVjdDNEQ3ViZVRleHR1cmU5Kj4oYmFzZVRleHR1cmUpOworCQkJCQkJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZTsKKworCQkJCQkJZm9yKGludCBtaXBtYXBMZXZlbCA9IDA7IG1pcG1hcExldmVsIDwgTUlQTUFQX0xFVkVMUzsgbWlwbWFwTGV2ZWwrKykKKwkJCQkJCXsKKwkJCQkJCQlpbnQgc3VyZmFjZUxldmVsID0gbWlwbWFwTGV2ZWw7CisKKwkJCQkJCQlpZihzdXJmYWNlTGV2ZWwgPCBMT0QpCisJCQkJCQkJeworCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBMT0Q7CisJCQkJCQkJfQorCisJCQkJCQkJaWYoc3VyZmFjZUxldmVsIDwgMCkKKwkJCQkJCQl7CisJCQkJCQkJCXN1cmZhY2VMZXZlbCA9IDA7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYoc3VyZmFjZUxldmVsID49IGxldmVsQ291bnQpCisJCQkJCQkJeworCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBsZXZlbENvdW50IC0gMTsKKwkJCQkJCQl9CisKKwkJCQkJCQlzdXJmYWNlID0gY3ViZVRleHR1cmUtPmdldEludGVybmFsQ3ViZU1hcFN1cmZhY2UoKEQzRENVQkVNQVBfRkFDRVMpZmFjZSwgc3VyZmFjZUxldmVsKTsKKwkJCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUxldmVsKHNhbXBsZXIsIGZhY2UsIG1pcG1hcExldmVsLCBzdXJmYWNlLCBzdzo6VEVYVFVSRV9DVUJFKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkU6CisJCQkJCXsKKwkJCQkJCURpcmVjdDNEVm9sdW1lVGV4dHVyZTkgKnZvbHVtZVRleHR1cmUgPSBkeW5hbWljX2Nhc3Q8RGlyZWN0M0RWb2x1bWVUZXh0dXJlOSo+KGJhc2VUZXh0dXJlKTsKKwkJCQkJCURpcmVjdDNEVm9sdW1lOSAqdm9sdW1lOworCisJCQkJCQlmb3IoaW50IG1pcG1hcExldmVsID0gMDsgbWlwbWFwTGV2ZWwgPCBNSVBNQVBfTEVWRUxTOyBtaXBtYXBMZXZlbCsrKQorCQkJCQkJeworCQkJCQkJCWludCBzdXJmYWNlTGV2ZWwgPSBtaXBtYXBMZXZlbDsKKworCQkJCQkJCWlmKHN1cmZhY2VMZXZlbCA8IExPRCkKKwkJCQkJCQl7CisJCQkJCQkJCXN1cmZhY2VMZXZlbCA9IExPRDsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZihzdXJmYWNlTGV2ZWwgPCAwKQorCQkJCQkJCXsKKwkJCQkJCQkJc3VyZmFjZUxldmVsID0gMDsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZihzdXJmYWNlTGV2ZWwgPj0gbGV2ZWxDb3VudCkKKwkJCQkJCQl7CisJCQkJCQkJCXN1cmZhY2VMZXZlbCA9IGxldmVsQ291bnQgLSAxOworCQkJCQkJCX0KKworCQkJCQkJCXZvbHVtZSA9IHZvbHVtZVRleHR1cmUtPmdldEludGVybmFsVm9sdW1lTGV2ZWwoc3VyZmFjZUxldmVsKTsKKwkJCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUxldmVsKHNhbXBsZXIsIDAsIG1pcG1hcExldmVsLCB2b2x1bWUsIHN3OjpURVhUVVJFXzNEKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlVTklNUExFTUVOVEVEKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTGV2ZWwoc2FtcGxlciwgMCwgMCwgMCwgc3c6OlRFWFRVUkVfTlVMTCk7CisJCQl9CisJCX0KKwl9CisKKwlib29sIERpcmVjdDNERGV2aWNlOTo6aXNSZWNvcmRpbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuIHN0YXRlUmVjb3JkZXIgIT0gMDsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlOTo6c2V0T2NjbHVzaW9uRW5hYmxlZChib29sIGVuYWJsZSkKKwl7CisJCXJlbmRlcmVyLT5zZXRPY2NsdXNpb25FbmFibGVkKGVuYWJsZSk7CisJfQorCisJdm9pZCBEaXJlY3QzRERldmljZTk6OnJlbW92ZVF1ZXJ5KHN3OjpRdWVyeSAqcXVlcnkpCisJeworCQlyZW5kZXJlci0+cmVtb3ZlUXVlcnkocXVlcnkpOworCX0KKworCXZvaWQgRGlyZWN0M0REZXZpY2U5OjphZGRRdWVyeShzdzo6UXVlcnkgKnF1ZXJ5KQorCXsKKwkJcmVuZGVyZXItPmFkZFF1ZXJ5KHF1ZXJ5KTsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlOTo6c3RyZXRjaFJlY3QoRGlyZWN0M0RTdXJmYWNlOSAqc291cmNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBEaXJlY3QzRFN1cmZhY2U5ICpkZXN0LCBjb25zdCBSRUNUICpkZXN0UmVjdCwgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyKQorCXsKKwkJRDNEU1VSRkFDRV9ERVNDIHNvdXJjZURlc2NyaXB0aW9uOworCQlEM0RTVVJGQUNFX0RFU0MgZGVzdERlc2NyaXB0aW9uOworCisJCXNvdXJjZS0+R2V0RGVzYygmc291cmNlRGVzY3JpcHRpb24pOworCQlkZXN0LT5HZXREZXNjKCZkZXN0RGVzY3JpcHRpb24pOworCisJCWludCBzV2lkdGggPSBzb3VyY2UtPmdldEV4dGVybmFsV2lkdGgoKTsKKwkJaW50IHNIZWlnaHQgPSBzb3VyY2UtPmdldEV4dGVybmFsSGVpZ2h0KCk7CisJCWludCBkV2lkdGggPSBkZXN0LT5nZXRFeHRlcm5hbFdpZHRoKCk7CisJCWludCBkSGVpZ2h0ID0gZGVzdC0+Z2V0RXh0ZXJuYWxIZWlnaHQoKTsKKworCQlzdzo6UmVjdCBzUmVjdCA9IHswfTsKKwkJc3c6OlJlY3QgZFJlY3QgPSB7MH07CisKKwkJaWYoc291cmNlUmVjdCkKKwkJeworCQkJc1JlY3QubGVmdCA9IHNvdXJjZVJlY3QtPmxlZnQ7CisJCQlzUmVjdC50b3AgPSBzb3VyY2VSZWN0LT50b3A7CisJCQlzUmVjdC5yaWdodCA9IHNvdXJjZVJlY3QtPnJpZ2h0OworCQkJc1JlY3QuYm90dG9tID0gc291cmNlUmVjdC0+Ym90dG9tOworCQl9CisJCWVsc2UKKwkJeworCQkJc1JlY3QudG9wID0gMDsKKwkJCXNSZWN0LmxlZnQgPSAwOworCQkJc1JlY3QuYm90dG9tID0gc0hlaWdodDsKKwkJCXNSZWN0LnJpZ2h0ID0gc1dpZHRoOworCQl9CisKKwkJaWYoZGVzdFJlY3QpCisJCXsKKwkJCWRSZWN0LmxlZnQgPSBkZXN0UmVjdC0+bGVmdDsKKwkJCWRSZWN0LnRvcCA9IGRlc3RSZWN0LT50b3A7CisJCQlkUmVjdC5yaWdodCA9IGRlc3RSZWN0LT5yaWdodDsKKwkJCWRSZWN0LmJvdHRvbSA9IGRlc3RSZWN0LT5ib3R0b207CisJCX0KKwkJZWxzZQorCQl7CisJCQlkUmVjdC50b3AgPSAwOworCQkJZFJlY3QubGVmdCA9IDA7CisJCQlkUmVjdC5ib3R0b20gPSBkSGVpZ2h0OworCQkJZFJlY3QucmlnaHQgPSBkV2lkdGg7CisJCX0KKworCQlib29sIHNjYWxpbmcgPSAoc1JlY3QucmlnaHQgLSBzUmVjdC5sZWZ0ICE9IGRSZWN0LnJpZ2h0IC0gZFJlY3QubGVmdCkgfHwgKHNSZWN0LmJvdHRvbSAtIHNSZWN0LnRvcCAhPSBkUmVjdC5ib3R0b20gLSBkUmVjdC50b3ApOworCQlib29sIGVxdWFsRm9ybWF0cyA9IHNvdXJjZS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSA9PSBkZXN0LT5nZXRJbnRlcm5hbEZvcm1hdCgpOworCQlib29sIGRlcHRoU3RlbmNpbCA9IChzb3VyY2VEZXNjcmlwdGlvbi5Vc2FnZSAmIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCkgPT0gRDNEVVNBR0VfREVQVEhTVEVOQ0lMOworCQlib29sIGFscGhhMHhGRiA9IGZhbHNlOworCisJCWlmKChzb3VyY2VEZXNjcmlwdGlvbi5Gb3JtYXQgPT0gRDNERk1UX0E4UjhHOEI4ICYmIGRlc3REZXNjcmlwdGlvbi5Gb3JtYXQgPT0gRDNERk1UX1g4UjhHOEI4KSB8fAorCQkgICAoc291cmNlRGVzY3JpcHRpb24uRm9ybWF0ID09IEQzREZNVF9YOFI4RzhCOCAmJiBkZXN0RGVzY3JpcHRpb24uRm9ybWF0ID09IEQzREZNVF9BOFI4RzhCOCkpCisJCXsKKwkJCWVxdWFsRm9ybWF0cyA9IHRydWU7CisJCQlhbHBoYTB4RkYgPSB0cnVlOworCQl9CisKKwkJaWYoZGVwdGhTdGVuY2lsKSAgIC8vIENvcHkgZW50aXJlbHksIGludGVybmFsbHkgICAvLyBGSVhNRTogQ2hlY2sKKwkJeworCQkJaWYoc291cmNlLT5oYXNEZXB0aCgpKQorCQkJeworCQkJCWJ5dGUgKnNvdXJjZUJ1ZmZlciA9IChieXRlKilzb3VyY2UtPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19SRUFET05MWSwgc3c6OlBVQkxJQyk7CisJCQkJYnl0ZSAqZGVzdEJ1ZmZlciA9IChieXRlKilkZXN0LT5sb2NrSW50ZXJuYWwoMCwgMCwgMCwgc3c6OkxPQ0tfRElTQ0FSRCwgc3c6OlBVQkxJQyk7CisKKwkJCQl1bnNpZ25lZCBpbnQgd2lkdGggPSBzb3VyY2UtPmdldEludGVybmFsV2lkdGgoKTsKKwkJCQl1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gc291cmNlLT5nZXRJbnRlcm5hbEhlaWdodCgpOworCQkJCXVuc2lnbmVkIGludCBwaXRjaCA9IHNvdXJjZS0+Z2V0SW50ZXJuYWxQaXRjaEIoKTsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQl7CisJCQkJCW1lbWNweShkZXN0QnVmZmVyLCBzb3VyY2VCdWZmZXIsIHBpdGNoKTsgICAvLyBGSVhNRTogT25seSBjb3B5IHdpZHRoICogYnl0ZXMKKworCQkJCQlzb3VyY2VCdWZmZXIgKz0gcGl0Y2g7CisJCQkJCWRlc3RCdWZmZXIgKz0gcGl0Y2g7CisJCQkJfQorCisJCQkJc291cmNlLT51bmxvY2tJbnRlcm5hbCgpOworCQkJCWRlc3QtPnVubG9ja0ludGVybmFsKCk7CisJCQl9CisKKwkJCWlmKHNvdXJjZS0+aGFzU3RlbmNpbCgpKQorCQkJeworCQkJCWJ5dGUgKnNvdXJjZUJ1ZmZlciA9IChieXRlKilzb3VyY2UtPmxvY2tTdGVuY2lsKDAsIHN3OjpQVUJMSUMpOworCQkJCWJ5dGUgKmRlc3RCdWZmZXIgPSAoYnl0ZSopZGVzdC0+bG9ja1N0ZW5jaWwoMCwgc3c6OlBVQkxJQyk7CisKKwkJCQl1bnNpZ25lZCBpbnQgd2lkdGggPSBzb3VyY2UtPmdldEludGVybmFsV2lkdGgoKTsKKwkJCQl1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gc291cmNlLT5nZXRJbnRlcm5hbEhlaWdodCgpOworCQkJCXVuc2lnbmVkIGludCBwaXRjaCA9IHNvdXJjZS0+Z2V0U3RlbmNpbFBpdGNoQigpOworCisJCQkJZm9yKHVuc2lnbmVkIGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCXsKKwkJCQkJbWVtY3B5KGRlc3RCdWZmZXIsIHNvdXJjZUJ1ZmZlciwgcGl0Y2gpOyAgIC8vIEZJWE1FOiBPbmx5IGNvcHkgd2lkdGggKiBieXRlcworCisJCQkJCXNvdXJjZUJ1ZmZlciArPSBwaXRjaDsKKwkJCQkJZGVzdEJ1ZmZlciArPSBwaXRjaDsKKwkJCQl9CisKKwkJCQlzb3VyY2UtPnVubG9ja1N0ZW5jaWwoKTsKKwkJCQlkZXN0LT51bmxvY2tTdGVuY2lsKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZighc2NhbGluZyAmJiBlcXVhbEZvcm1hdHMpCisJCXsKKwkJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZUJ5dGVzID0gKHVuc2lnbmVkIGNoYXIqKXNvdXJjZS0+bG9ja0ludGVybmFsKHNSZWN0LmxlZnQsIHNSZWN0LnRvcCwgMCwgc3c6OkxPQ0tfUkVBRE9OTFksIHN3OjpQVUJMSUMpOworCQkJdW5zaWduZWQgY2hhciAqZGVzdEJ5dGVzID0gKHVuc2lnbmVkIGNoYXIqKWRlc3QtPmxvY2tJbnRlcm5hbChkUmVjdC5sZWZ0LCBkUmVjdC50b3AsIDAsIHN3OjpMT0NLX1JFQURXUklURSwgc3c6OlBVQkxJQyk7CisJCQl1bnNpZ25lZCBpbnQgc291cmNlUGl0Y2ggPSBzb3VyY2UtPmdldEludGVybmFsUGl0Y2hCKCk7CisJCQl1bnNpZ25lZCBpbnQgZGVzdFBpdGNoID0gZGVzdC0+Z2V0SW50ZXJuYWxQaXRjaEIoKTsKKworCQkJdW5zaWduZWQgaW50IHdpZHRoID0gZFJlY3QucmlnaHQgLSBkUmVjdC5sZWZ0OworCQkJdW5zaWduZWQgaW50IGhlaWdodCA9IGRSZWN0LmJvdHRvbSAtIGRSZWN0LnRvcDsKKwkJCXVuc2lnbmVkIGludCBieXRlcyA9IHdpZHRoICogc3c6OlN1cmZhY2U6OmJ5dGVzKHNvdXJjZS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSk7CisKKwkJCWZvcih1bnNpZ25lZCBpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCXsKKwkJCQltZW1jcHkoZGVzdEJ5dGVzLCBzb3VyY2VCeXRlcywgYnl0ZXMpOworCisJCQkJaWYoYWxwaGEweEZGKQorCQkJCXsKKwkJCQkJZm9yKHVuc2lnbmVkIGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCQkJCXsKKwkJCQkJCWRlc3RCeXRlc1s0ICogeCArIDNdID0gMHhGRjsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlzb3VyY2VCeXRlcyArPSBzb3VyY2VQaXRjaDsKKwkJCQlkZXN0Qnl0ZXMgKz0gZGVzdFBpdGNoOworCQkJfQorCisJCQlzb3VyY2UtPnVubG9ja0ludGVybmFsKCk7CisJCQlkZXN0LT51bmxvY2tJbnRlcm5hbCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJcmVuZGVyZXItPmJsaXQoc291cmNlLCBzUmVjdCwgZGVzdCwgZFJlY3QsIGZpbHRlciA+PSBEM0RURVhGX0xJTkVBUik7CisJCX0KKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOTo6dXBkYXRlVm9sdW1lKElEaXJlY3QzRFZvbHVtZTkgKnNvdXJjZVZvbHVtZSwgSURpcmVjdDNEVm9sdW1lOSAqZGVzdGluYXRpb25Wb2x1bWUpCisJeworCQlUUkFDRSgiSURpcmVjdDNEVm9sdW1lOSAqc291cmNlVm9sdW1lID0gMHglMC44cCwgSURpcmVjdDNEVm9sdW1lOSAqZGVzdGluYXRpb25Wb2x1bWUgPSAweCUwLjhwIiwgc291cmNlVm9sdW1lLCBkZXN0aW5hdGlvblZvbHVtZSk7CisKKwkJaWYoIXNvdXJjZVZvbHVtZSB8fCAhZGVzdGluYXRpb25Wb2x1bWUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJRDNEVk9MVU1FX0RFU0Mgc291cmNlRGVzY3JpcHRpb247CisJCUQzRFZPTFVNRV9ERVNDIGRlc3RpbmF0aW9uRGVzY3JpcHRpb247CisKKwkJc291cmNlVm9sdW1lLT5HZXREZXNjKCZzb3VyY2VEZXNjcmlwdGlvbik7CisJCWRlc3RpbmF0aW9uVm9sdW1lLT5HZXREZXNjKCZkZXN0aW5hdGlvbkRlc2NyaXB0aW9uKTsKKworCQlpZihzb3VyY2VEZXNjcmlwdGlvbi5Qb29sICAgICAgIT0gRDNEUE9PTF9TWVNURU1NRU0gfHwKKwkJICAgZGVzdGluYXRpb25EZXNjcmlwdGlvbi5Qb29sICE9IEQzRFBPT0xfREVGQVVMVCB8fAorCQkgICBzb3VyY2VEZXNjcmlwdGlvbi5Gb3JtYXQgIT0gZGVzdGluYXRpb25EZXNjcmlwdGlvbi5Gb3JtYXQgfHwKKwkJICAgc291cmNlRGVzY3JpcHRpb24uV2lkdGggICE9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uV2lkdGggfHwKKwkJICAgc291cmNlRGVzY3JpcHRpb24uSGVpZ2h0ICE9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uSGVpZ2h0IHx8CisJCSAgIHNvdXJjZURlc2NyaXB0aW9uLkRlcHRoICAhPSBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLkRlcHRoKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXN3OjpTdXJmYWNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFZvbHVtZTkqPihzb3VyY2VWb2x1bWUpOworCQlzdzo6U3VyZmFjZSAqZGVzdCA9IHN0YXRpY19jYXN0PERpcmVjdDNEVm9sdW1lOSo+KGRlc3RpbmF0aW9uVm9sdW1lKTsKKworCQlpZihzb3VyY2UtPmdldEV4dGVybmFsUGl0Y2hCKCkgIT0gZGVzdC0+Z2V0RXh0ZXJuYWxQaXRjaEIoKSB8fAorCQkgICBzb3VyY2UtPmdldEV4dGVybmFsU2xpY2VCKCkgIT0gZGVzdC0+Z2V0RXh0ZXJuYWxTbGljZUIoKSkKKwkJeworCQkJVU5JTVBMRU1FTlRFRCgpOworCQl9CisKKwkJdm9pZCAqc0J1ZmZlciA9IHNvdXJjZS0+bG9ja0V4dGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX1JFQURPTkxZLCBzdzo6UFVCTElDKTsKKwkJdm9pZCAqZEJ1ZmZlciA9IGRlc3QtPmxvY2tFeHRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19XUklURU9OTFksIHN3OjpQVUJMSUMpOworCisJCW1lbWNweShkQnVmZmVyLCBzQnVmZmVyLCBzb3VyY2UtPmdldEV4dGVybmFsU2xpY2VCKCkgKiBzb3VyY2VEZXNjcmlwdGlvbi5EZXB0aCk7CisKKwkJc291cmNlLT51bmxvY2tFeHRlcm5hbCgpOworCQlkZXN0LT51bmxvY2tFeHRlcm5hbCgpOworCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlib29sIERpcmVjdDNERGV2aWNlOTo6dmFsaWRSZWN0YW5nbGUoY29uc3QgUkVDVCAqcmVjdCwgSURpcmVjdDNEU3VyZmFjZTkgKnN1cmZhY2UpCisJeworCQlpZighcmVjdCkKKwkJeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZihyZWN0LT5yaWdodCA8PSByZWN0LT5sZWZ0IHx8IHJlY3QtPmJvdHRvbSA8PSByZWN0LT50b3ApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmKHJlY3QtPmxlZnQgPCAwIHx8IHJlY3QtPnRvcCA8IDApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUQzRFNVUkZBQ0VfREVTQyBkZXNjcmlwdGlvbjsKKwkJc3VyZmFjZS0+R2V0RGVzYygmZGVzY3JpcHRpb24pOworCisJCWlmKHJlY3QtPnJpZ2h0ID4gKGludClkZXNjcmlwdGlvbi5XaWR0aCB8fCByZWN0LT5ib3R0b20gPiAoaW50KWRlc2NyaXB0aW9uLkhlaWdodCkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJdm9pZCBEaXJlY3QzRERldmljZTk6OmNvbmZpZ3VyZUZQVSgpCisJeworCS8vCV9jb250cm9sZnAoX1BDXzI0LCBfTUNXX1BDKTsgICAgIC8vIFNpbmdsZS1wcmVjaXNpb24KKwkJX2NvbnRyb2xmcChfTUNXX0VNLCBfTUNXX0VNKTsgICAgLy8gTWFzayBhbGwgZXhjZXB0aW9ucworCQlfY29udHJvbGZwKF9SQ19ORUFSLCBfTUNXX1JDKTsgICAvLyBSb3VuZCB0byBuZWFyZXN0CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1MGY2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOS5ocHAKQEAgLTAsMCArMSwzMzcgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBEM0Q5X0RpcmVjdDNERGV2aWNlOV9ocHAKKyNkZWZpbmUgRDNEOV9EaXJlY3QzRERldmljZTlfaHBwCisKKyNpbmNsdWRlICJVbmtub3duLmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNEOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RTd2FwQ2hhaW45LmhwcCIKKworI2luY2x1ZGUgIlN0cmVhbS5ocHAiCisKKyNpbmNsdWRlIDxkM2Q5Lmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGxpc3Q+CisKK25hbWVzcGFjZSBzdworeworCWNsYXNzIFJlbmRlcmVyOworCWNsYXNzIENvbnRleHQ7CisJc3RydWN0IFF1ZXJ5OworfQorCituYW1lc3BhY2UgRDNEOQoreworCWNsYXNzIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OworCWNsYXNzIERpcmVjdDNEU3RhdGVCbG9jazk7CisJY2xhc3MgRGlyZWN0M0RTdXJmYWNlOTsKKwljbGFzcyBEaXJlY3QzRFBpeGVsU2hhZGVyOTsKKwljbGFzcyBEaXJlY3QzRFZlcnRleFNoYWRlcjk7CisJY2xhc3MgaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOTsKKwljbGFzcyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk7CisJY2xhc3MgRGlyZWN0M0RJbmRleEJ1ZmZlcjk7CisJY2xhc3MgQ3JpdGljYWxTZWN0aW9uOworCisJY2xhc3MgRGlyZWN0M0REZXZpY2U5IDogcHVibGljIElEaXJlY3QzRERldmljZTksIHB1YmxpYyBVbmtub3duCisJeworCQlmcmllbmQgQ3JpdGljYWxTZWN0aW9uOworCQlmcmllbmQgRGlyZWN0M0RTd2FwQ2hhaW45OworCisJcHVibGljOgorCQlEaXJlY3QzRERldmljZTkoY29uc3QgSElOU1RBTkNFIGluc3RhbmNlLCBEaXJlY3QzRDkgKmQzZDksIHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3VyRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpOworCisJCXZpcnR1YWwgfkRpcmVjdDNERGV2aWNlOSgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIElEaXJlY3QzRERldmljZTkgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBCZWdpblNjZW5lKCk7CisJCWxvbmcgX19zdGRjYWxsIEJlZ2luU3RhdGVCbG9jaygpOworCQlsb25nIF9fc3RkY2FsbCBDbGVhcih1bnNpZ25lZCBsb25nIGNvdW50LCBjb25zdCBEM0RSRUNUICpyZWN0cywgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBjb2xvciwgZmxvYXQgeiwgdW5zaWduZWQgbG9uZyBzdGVuY2lsKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ29sb3JGaWxsKElEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlLCBjb25zdCBSRUNUICpyZWN0LCBEM0RDT0xPUiBjb2xvcik7CisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4oRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNEU3dhcENoYWluOSAqKnN3YXBDaGFpbik7CisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZUN1YmVUZXh0dXJlKHVuc2lnbmVkIGludCBlZGdlTGVuZ3RoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzREN1YmVUZXh0dXJlOSAqKmN1YmVUZXh0dXJlLCB2b2lkICoqc2hhcmVkSGFuZGxlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5LCBpbnQgZGlzY2FyZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlSW5kZXhCdWZmZXIodW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKippbmRleEJ1ZmZlciwgdm9pZCAqKnNoYXJlZEhhbmRsZSk7CisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlUGl4ZWxTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqKnNoYWRlcik7CisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZVF1ZXJ5KEQzRFFVRVJZVFlQRSB0eXBlLCBJRGlyZWN0M0RRdWVyeTkgKipxdWVyeSk7CisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZVJlbmRlclRhcmdldCh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5LCBpbnQgbG9ja2FibGUsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSk7CisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZVN0YXRlQmxvY2soRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSwgSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVGV4dHVyZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEVGV4dHVyZTkgKip0ZXh0dXJlLCB2b2lkICoqc2hhcmVkSGFuZGxlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVmVydGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIHVuc2lnbmVkIGxvbmcgRlZGLCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKip2ZXJ0ZXhCdWZmZXIsIHZvaWQgKipzaGFyZWRIYW5kbGUpOworCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihjb25zdCBEM0RWRVJURVhFTEVNRU5UOSAqdmVydGV4RWxlbWVudHMsIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVmVydGV4U2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICoqc2hhZGVyKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVm9sdW1lVGV4dHVyZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBkZXB0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqKnZvbHVtZVRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpOworCQlsb25nIF9fc3RkY2FsbCBEZWxldGVQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgRHJhd0luZGV4ZWRQcmltaXRpdmUoRDNEUFJJTUlUSVZFVFlQRSB0eXBlLCBpbnQgYmFzZVZlcnRleEluZGV4LCB1bnNpZ25lZCBpbnQgbWluSW5kZXgsIHVuc2lnbmVkIGludCBudW1WZXJ0aWNlcywgdW5zaWduZWQgaW50IHN0YXJ0SW5kZXgsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCk7CisJCWxvbmcgX19zdGRjYWxsIERyYXdJbmRleGVkUHJpbWl0aXZlVVAoRDNEUFJJTUlUSVZFVFlQRSB0eXBlLCB1bnNpZ25lZCBpbnQgbWluVmVydGV4SW5kZXgsIHVuc2lnbmVkIGludCBudW1WZXJ0ZXhJbmRpY2VzLCB1bnNpZ25lZCBpbnQgUHJpbWl0aXZlQ291bnQsIGNvbnN0IHZvaWQgKmluZGV4RGF0YSwgRDNERk9STUFUIGluZGV4RGF0YUZvcm1hdCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCBWZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgRHJhd1ByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBzdGFydFZlcnRleCwgdW5zaWduZWQgaW50IHByaW1pdmVDb3VudCk7CisJCWxvbmcgX19zdGRjYWxsIERyYXdQcmltaXRpdmVVUChEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgRHJhd1JlY3RQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlLCBjb25zdCBmbG9hdCAqbnVtU2VncywgY29uc3QgRDNEUkVDVFBBVENIX0lORk8gKnJlY3RQYXRjaEluZm8pOworCQlsb25nIF9fc3RkY2FsbCBEcmF3VHJpUGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFRSSVBBVENIX0lORk8gKnRyaVBhdGNoSW5mbyk7CisJCWxvbmcgX19zdGRjYWxsIEVuZFNjZW5lKCk7CisJCWxvbmcgX19zdGRjYWxsIEVuZFN0YXRlQmxvY2soSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKTsKKwkJbG9uZyBfX3N0ZGNhbGwgRXZpY3RNYW5hZ2VkUmVzb3VyY2VzKCk7CisJCXVuc2lnbmVkIGludCBfX3N0ZGNhbGwgR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpOworCQlsb25nIF9fc3RkY2FsbCBHZXRCYWNrQnVmZmVyKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIHVuc2lnbmVkIGludCBpbmRleCwgRDNEQkFDS0JVRkZFUl9UWVBFIHR5cGUsIElEaXJlY3QzRFN1cmZhY2U5ICoqYmFja0J1ZmZlcik7CisJCWxvbmcgX19zdGRjYWxsIEdldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBmbG9hdCAqcGxhbmUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRDbGlwU3RhdHVzKEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0Q3JlYXRpb25QYXJhbWV0ZXJzKEQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTICpwYXJhbWV0ZXJzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCAqcGFsZXR0ZU51bWJlcik7CisJCWxvbmcgX19zdGRjYWxsIEdldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKipkZXB0aFN0ZW5jaWxTdXJmYWNlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlQ2FwcyhEM0RDQVBTOSAqY2Fwcyk7CisJCWxvbmcgX19zdGRjYWxsIEdldERpcmVjdDNEKElEaXJlY3QzRDkgKipEM0QpOworCQlsb25nIF9fc3RkY2FsbCBHZXREaXNwbGF5TW9kZSh1bnNpZ25lZCBpbnQgc3dhcENoYWluICxEM0RESVNQTEFZTU9ERSAqbW9kZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldEZyb250QnVmZmVyRGF0YSh1bnNpZ25lZCBpbnQgc3dhcENoYWluLCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UpOworCQlsb25nIF9fc3RkY2FsbCBHZXRGVkYodW5zaWduZWQgbG9uZyAqRlZGKTsKKwkJdm9pZCBfX3N0ZGNhbGwgR2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIEQzREdBTU1BUkFNUCAqcmFtcCk7CisJCWxvbmcgX19zdGRjYWxsIEdldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI5ICoqaW5kZXhEYXRhKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgRDNETElHSFQ5ICpwKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0TGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCAsIGludCAqZW5hYmxlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0TWF0ZXJpYWwoRDNETUFURVJJQUw5ICptYXRlcmlhbCk7CisJCWZsb2F0IF9fc3RkY2FsbCBHZXROUGF0Y2hNb2RlKCk7CisJCXVuc2lnbmVkIGludCBfX3N0ZGNhbGwgR2V0TnVtYmVyT2ZTd2FwQ2hhaW5zKCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQaXhlbFNoYWRlcihJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKipzaGFkZXIpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQaXhlbFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFJhc3RlclN0YXR1cyh1bnNpZ25lZCBpbnQgc3dhcENoYWluLCBEM0RSQVNURVJfU1RBVFVTICpyYXN0ZXJTdGF0dXMpOworCQlsb25nIF9fc3RkY2FsbCBHZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgU3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UmVuZGVyVGFyZ2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIElEaXJlY3QzRFN1cmZhY2U5ICoqcmVuZGVyVGFyZ2V0KTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UmVuZGVyVGFyZ2V0RGF0YShJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UpOworCQlsb25nIF9fc3RkY2FsbCBHZXRTYW1wbGVyU3RhdGUodW5zaWduZWQgbG9uZyBzYW1wbGVyLCBEM0RTQU1QTEVSU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0U2Npc3NvclJlY3QoUkVDVCAqcmVjdCk7CisJCWludCBfX3N0ZGNhbGwgR2V0U29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nKCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFN0cmVhbVNvdXJjZSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICoqc3RyZWFtRGF0YSwgdW5zaWduZWQgaW50ICpvZmZzZXQsIHVuc2lnbmVkIGludCAqc3RyaWRlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0U3RyZWFtU291cmNlRnJlcSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCB1bnNpZ25lZCBpbnQgKmRpdmlkZXIpOworCQlsb25nIF9fc3RkY2FsbCBHZXRTd2FwQ2hhaW4odW5zaWduZWQgaW50IGluZGV4LCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKnRleHR1cmUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBEM0RNQVRSSVggKm1hdHJpeCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFZlcnRleERlY2xhcmF0aW9uKElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0VmVydGV4U2hhZGVyKElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIpOworCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOworCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFZlcnRleFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFZpZXdwb3J0KEQzRFZJRVdQT1JUOSAqdmlld3BvcnQpOworCQlsb25nIF9fc3RkY2FsbCBMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgZW5hYmxlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgTXVsdGlwbHlUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCk7CisJCWxvbmcgX19zdGRjYWxsIFByZXNlbnQoY29uc3QgUkVDVCAqc291cmNlUmVjdCwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbik7CisJCWxvbmcgX19zdGRjYWxsIFByb2Nlc3NWZXJ0aWNlcyh1bnNpZ25lZCBpbnQgc3JjU3RhcnRJbmRleCwgdW5zaWduZWQgaW50IGRlc3RJbmRleCwgdW5zaWduZWQgaW50IHZlcnRleENvdW50LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkZXN0QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgUmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyk7CisJCWxvbmcgX19zdGRjYWxsIFNldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBmbG9hdCAqcGxhbmUpOworCQlsb25nIF9fc3RkY2FsbCBTZXRDbGlwU3RhdHVzKGNvbnN0IEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyKTsKKwkJdm9pZCBfX3N0ZGNhbGwgU2V0Q3Vyc29yUG9zaXRpb24oaW50IHgsIGludCB5LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0Q3Vyc29yUHJvcGVydGllcyh1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHksIElEaXJlY3QzRFN1cmZhY2U5ICpjdXJzb3JCaXRtYXApOworCQlsb25nIF9fc3RkY2FsbCBTZXREZXB0aFN0ZW5jaWxTdXJmYWNlKElEaXJlY3QzRFN1cmZhY2U5ICpuZXdEZXB0aFN0ZW5jaWwpOworCQlsb25nIF9fc3RkY2FsbCBTZXREaWFsb2dCb3hNb2RlKGludCBlbmFibGVEaWFsb2dzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0RlZGKHVuc2lnbmVkIGxvbmcgRlZGKTsKKwkJdm9pZCBfX3N0ZGNhbGwgU2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IEQzREdBTU1BUkFNUCAqcmFtcCk7CisJCWxvbmcgX19zdGRjYWxsIFNldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI5ICppbmRleERhdGEpOworCQlsb25nIF9fc3RkY2FsbCBTZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBEM0RMSUdIVDkgKmxpZ2h0KTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0TWF0ZXJpYWwoY29uc3QgRDNETUFURVJJQUw5ICptYXRlcmlhbCk7CisJCWxvbmcgX19zdGRjYWxsIFNldE5QYXRjaE1vZGUoZmxvYXQgc2VnbWVudHMpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQYWxldHRlRW50cmllcyh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlciwgY29uc3QgUEFMRVRURUVOVFJZICplbnRyaWVzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0UGl4ZWxTaGFkZXIoSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpzaGFkZXIpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCWxvbmcgX19zdGRjYWxsIFNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQaXhlbFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCWxvbmcgX19zdGRjYWxsIFNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CisJCWxvbmcgX19zdGRjYWxsIFNldFJlbmRlclRhcmdldCh1bnNpZ25lZCBsb25nIGluZGV4LCBJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0KTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0U2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgc2FtcGxlciwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CisJCWxvbmcgX19zdGRjYWxsIFNldFNjaXNzb3JSZWN0KGNvbnN0IFJFQ1QgKnJlY3QpOworCQlsb25nIF9fc3RkY2FsbCBTZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3NpbmcoaW50IHNvZnR3YXJlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW0sIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzdHJpZGUpOworCQlsb25nIF9fc3RkY2FsbCBTZXRTdHJlYW1Tb3VyY2VGcmVxKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIHVuc2lnbmVkIGludCBkaXZpZGVyKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqdGV4dHVyZSk7CisJCWxvbmcgX19zdGRjYWxsIFNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpOworCQlsb25nIF9fc3RkY2FsbCBTZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmRlY2xhcmF0aW9uKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0VmVydGV4U2hhZGVyKElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnNoYWRlcik7CisJCWxvbmcgX19zdGRjYWxsIFNldFZlcnRleFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCWxvbmcgX19zdGRjYWxsIFNldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCk7CisJCWludCBfX3N0ZGNhbGwgU2hvd0N1cnNvcihpbnQgc2hvdyk7CisJCWxvbmcgX19zdGRjYWxsIFN0cmV0Y2hSZWN0KElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIpOworCQlsb25nIF9fc3RkY2FsbCBUZXN0Q29vcGVyYXRpdmVMZXZlbCgpOworCQlsb25nIF9fc3RkY2FsbCBVcGRhdGVTdXJmYWNlKElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdGluYXRpb25TdXJmYWNlLCBjb25zdCBQT0lOVCAqZGVzdFBvaW50KTsKKwkJbG9uZyBfX3N0ZGNhbGwgVXBkYXRlVGV4dHVyZShJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnNvdXJjZVRleHR1cmUsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqZGVzdGluYXRpb25UZXh0dXJlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgVmFsaWRhdGVEZXZpY2UodW5zaWduZWQgbG9uZyAqbnVtUGFzc2VzKTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCWxvbmcgZ2V0QWRhcHRlckRpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERSAqbW9kZSk7CisJCWJvb2wgaXNSZWNvcmRpbmcoKSBjb25zdDsgICAvLyBJbiBhIHN0YXRlIHJlY29yZGluZyBtb2RlCisJCXZvaWQgc2V0T2NjbHVzaW9uRW5hYmxlZChib29sIGVuYWJsZSk7CisJCXZvaWQgcmVtb3ZlUXVlcnkoc3c6OlF1ZXJ5ICpxdWVyeSk7CisJCXZvaWQgYWRkUXVlcnkoc3c6OlF1ZXJ5ICpxdWVyeSk7CisJCXZvaWQgc3RyZXRjaFJlY3QoRGlyZWN0M0RTdXJmYWNlOSAqc291cmNlU3VyZmFjZSwgY29uc3QgUkVDVCAqc291cmNlUmVjdCwgRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIpOworCisJcHJpdmF0ZToKKwkJc3RhdGljIGludCB0eXBlU3RyaWRlKHVuc2lnbmVkIGNoYXIgc3RyZWFtVHlwZSk7CisJCWJvb2wgaW5zdGFuY2VEYXRhKCk7CisJCWJvb2wgYmluZFJlc291cmNlcyhEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhCdWZmZXIpOworCQl2b2lkIGJpbmRWZXJ0ZXhTdHJlYW1zKGludCBiYXNlLCBib29sIGluc3RhbmNpbmcsIGludCBpbnN0YW5jZSk7CisJCXZvaWQgYmluZEluZGV4QnVmZmVyKERpcmVjdDNESW5kZXhCdWZmZXI5ICppbmRleEJ1ZmZlcik7CisJCXZvaWQgYmluZFNoYWRlckNvbnN0YW50cygpOworCQl2b2lkIGJpbmRMaWdodHMoKTsKKwkJYm9vbCBiaW5kVmlld3BvcnQoKTsgICAvLyBBbHNvIGFkanVzdHMgZm9yIHNjaXNzb3JpbmcKKwkJdm9pZCBiaW5kVGV4dHVyZXMoKTsKKworCQlsb25nIHVwZGF0ZVZvbHVtZShJRGlyZWN0M0RWb2x1bWU5ICpzb3VyY2VWb2x1bWUsIElEaXJlY3QzRFZvbHVtZTkgKmRlc3RpbmF0aW9uVm9sdW1lKTsKKwkJYm9vbCB2YWxpZFJlY3RhbmdsZShjb25zdCBSRUNUICpyZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZSk7CisJCXZvaWQgY29uZmlndXJlRlBVKCk7CisKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQljb25zdCBISU5TVEFOQ0UgaW5zdGFuY2U7CisJCURpcmVjdDNEOSAqZDNkOTsKKwkJY29uc3QgdW5zaWduZWQgaW50IGFkYXB0ZXI7CisJCWNvbnN0IEQzRERFVlRZUEUgZGV2aWNlVHlwZTsKKwkJY29uc3QgSFdORCBmb2N1c1dpbmRvdzsKKwkJY29uc3QgdW5zaWduZWQgbG9uZyBiZWhhdmlvdXJGbGFnczsKKworCQlIV05EIGRldmljZVdpbmRvdzsKKworCQlEM0RWSUVXUE9SVDkgdmlld3BvcnQ7CisJCUQzRE1BVFJJWCBtYXRyaXhbNTEyXTsKKwkJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmVbMTYgKyA0XTsKKwkJRDNETUFURVJJQUw5IG1hdGVyaWFsOworCQlmbG9hdCBwbGFuZVs2XVs0XTsKKwkJRDNEQ0xJUFNUQVRVUzkgY2xpcFN0YXR1czsKKwkJUkVDVCBzY2lzc29yUmVjdDsKKwkJYm9vbCBzY2lzc29yRW5hYmxlOworCisJCXN0cnVjdCBMaWdodCA6IEQzRExJR0hUOQorCQl7CisJCQlMaWdodCAmb3BlcmF0b3I9KGNvbnN0IEQzRExJR0hUOSAmbGlnaHQpCisJCQl7CisJCQkJVHlwZSA9IGxpZ2h0LlR5cGU7CisJCQkJRGlmZnVzZSA9IGxpZ2h0LkRpZmZ1c2U7CisJCQkJU3BlY3VsYXIgPSBsaWdodC5TcGVjdWxhcjsKKwkJCQlBbWJpZW50ID0gbGlnaHQuQW1iaWVudDsKKwkJCQlQb3NpdGlvbiA9IGxpZ2h0LlBvc2l0aW9uOworCQkJCURpcmVjdGlvbiA9IGxpZ2h0LkRpcmVjdGlvbjsKKwkJCQlSYW5nZSA9IGxpZ2h0LlJhbmdlOworCQkJCUZhbGxvZmYgPSBsaWdodC5GYWxsb2ZmOworCQkJCUF0dGVudWF0aW9uMCA9IGxpZ2h0LkF0dGVudWF0aW9uMDsKKwkJCQlBdHRlbnVhdGlvbjEgPSBsaWdodC5BdHRlbnVhdGlvbjE7CisJCQkJQXR0ZW51YXRpb24yID0gbGlnaHQuQXR0ZW51YXRpb24yOworCQkJCVRoZXRhID0gbGlnaHQuVGhldGE7CisJCQkJUGhpID0gbGlnaHQuUGhpOworCisJCQkJcmV0dXJuICp0aGlzOworCQkJfQorCisJCQlib29sIGVuYWJsZTsKKwkJfTsKKworCQlzdHJ1Y3QgTGlnaHRzIDogc3RkOjptYXA8aW50LCBMaWdodD4KKwkJeworCQkJYm9vbCBleGlzdHMoaW50IGluZGV4KQorCQkJeworCQkJCXJldHVybiBmaW5kKGluZGV4KSAhPSBlbmQoKTsKKwkJCX0KKwkJfTsKKworCQlMaWdodHMgbGlnaHQ7CisJCWJvb2wgc29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nOworCQlEaXJlY3QzRFBpeGVsU2hhZGVyOSAqcGl4ZWxTaGFkZXI7CisJCURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdmVydGV4U2hhZGVyOworCisJCWJvb2wgbGlnaHRzRGlydHk7CisJCWJvb2wgcGl4ZWxTaGFkZXJEaXJ0eTsKKwkJaW50IHBpeGVsU2hhZGVyQ29uc3RhbnRzQkRpcnR5OworCQlpbnQgcGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHk7CisJCWludCBwaXhlbFNoYWRlckNvbnN0YW50c0lEaXJ0eTsKKwkJYm9vbCB2ZXJ0ZXhTaGFkZXJEaXJ0eTsKKwkJaW50IHZlcnRleFNoYWRlckNvbnN0YW50c0JEaXJ0eTsKKwkJaW50IHZlcnRleFNoYWRlckNvbnN0YW50c0ZEaXJ0eTsKKwkJaW50IHZlcnRleFNoYWRlckNvbnN0YW50c0lEaXJ0eTsKKworCQlmbG9hdCBwaXhlbFNoYWRlckNvbnN0YW50RlsyMjRdWzRdOworCQlpbnQgcGl4ZWxTaGFkZXJDb25zdGFudElbMTZdWzRdOworCQlpbnQgcGl4ZWxTaGFkZXJDb25zdGFudEJbMTZdOworCisJCWZsb2F0IHZlcnRleFNoYWRlckNvbnN0YW50RlsyNTZdWzRdOworCQlpbnQgdmVydGV4U2hhZGVyQ29uc3RhbnRJWzE2XVs0XTsKKwkJaW50IHZlcnRleFNoYWRlckNvbnN0YW50QlsxNl07CisKKwkJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uOworCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRhdGFTdHJlYW1bMTZdOworCQlpbnQgc3RyZWFtU3RyaWRlWzE2XTsKKwkJaW50IHN0cmVhbU9mZnNldFsxNl07CisJCXVuc2lnbmVkIGludCBzdHJlYW1Tb3VyY2VGcmVxWzE2XTsKKwkJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4RGF0YTsKKworCQlEaXJlY3QzRFN3YXBDaGFpbjkgKnN3YXBDaGFpbjsKKwkJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0WzRdOworCQlEaXJlY3QzRFN1cmZhY2U5ICpkZXB0aFN0ZW5jaWw7CisJCURpcmVjdDNEU3VyZmFjZTkgKmF1dG9EZXB0aFN0ZW5jaWw7CisKKwkJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqc3RhdGVSZWNvcmRlcjsKKworCQl1bnNpZ25lZCBsb25nIHJlbmRlclN0YXRlW0QzRFJTX0JMRU5ET1BBTFBIQSArIDFdOworCQl1bnNpZ25lZCBsb25nIHRleHR1cmVTdGFnZVN0YXRlWzhdW0QzRFRTU19DT05TVEFOVCArIDFdOworCQl1bnNpZ25lZCBsb25nIHNhbXBsZXJTdGF0ZVsxNiArIDRdW0QzRFNBTVBfRE1BUE9GRlNFVCArIDFdOworCQlib29sIGluaXQ7CisKKwkJc3RydWN0IFBhbGV0dGUKKwkJeworCQkJUEFMRVRURUVOVFJZIGVudHJ5WzI1Nl07CisJCX07CisKKwkJdW5zaWduZWQgaW50IGN1cnJlbnRQYWxldHRlOworCQlzdGQ6Om1hcDxpbnQsIFBhbGV0dGU+IHBhbGV0dGU7CisKKwkJc3c6OkNvbnRleHQgKmNvbnRleHQ7CisJCXN3OjpSZW5kZXJlciAqcmVuZGVyZXI7CisKKwkJYm9vbCBpbnN0YW5jaW5nRW5hYmxlZDsKKworCQlzdzo6U3VyZmFjZSAqY3Vyc29yOworCQlib29sIHNob3dDdXJzb3I7CisKKwkJQ1JJVElDQUxfU0VDVElPTiBjcml0aWNhbFNlY3Rpb247CisJfTsKKworCWNsYXNzIENyaXRpY2FsU2VjdGlvbgorCXsKKwlwdWJsaWM6CisJCUNyaXRpY2FsU2VjdGlvbihEaXJlY3QzRERldmljZTkgKmRldmljZSkgOiBkZXZpY2UoZGV2aWNlKQorCQl7CisJCQlpZihkZXZpY2UtPmJlaGF2aW91ckZsYWdzICYgRDNEQ1JFQVRFX01VTFRJVEhSRUFERUQpCisJCQl7CisJCQkJRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRldmljZS0+Y3JpdGljYWxTZWN0aW9uKTsKKwkJCX0KKwkJfQorCisJCX5Dcml0aWNhbFNlY3Rpb24oKQorCQl7CisJCQlpZihkZXZpY2UtPmJlaGF2aW91ckZsYWdzICYgRDNEQ1JFQVRFX01VTFRJVEhSRUFERUQpCisJCQl7CisJCQkJTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRldmljZS0+Y3JpdGljYWxTZWN0aW9uKTsKKwkJCX0KKwkJfQorCisJcHJpdmF0ZToKKwkJRGlyZWN0M0REZXZpY2U5ICpjb25zdCBkZXZpY2U7CisJfTsKK30KKworI2VuZGlmIC8vIEQzRDlfRGlyZWN0M0REZXZpY2U5X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5RXguY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5RXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNGIzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzRERldmljZTlFeC5jcHAKQEAgLTAsMCArMSwxMDM5IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJEaXJlY3QzRERldmljZTlFeC5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRDlFeC5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RTdXJmYWNlOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RJbmRleEJ1ZmZlcjkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4QnVmZmVyOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RUZXh0dXJlOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RWb2x1bWVUZXh0dXJlOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RDdWJlVGV4dHVyZTkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFN3YXBDaGFpbjkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEUGl4ZWxTaGFkZXI5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleFNoYWRlcjkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEU3RhdGVCbG9jazkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEUXVlcnk5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZTkuaHBwIgorCisjaW5jbHVkZSAiRGVidWcuaHBwIgorI2luY2x1ZGUgIlJlbmRlcmVyLmhwcCIKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlci5ocHAiCisjaW5jbHVkZSAiQ2xpcHBlci5ocHAiCisjaW5jbHVkZSAiQ29uZmlndXJhdG9yLmhwcCIKKyNpbmNsdWRlICJUaW1lci5ocHAiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIEQzRDkKK3sKKwlpbmxpbmUgdW5zaWduZWQgbG9uZyBGdG9EVyhmbG9hdCBmKQorCXsKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nJilmOworCX0KKworCWlubGluZSBmbG9hdCBEV3RvRih1bnNpZ25lZCBsb25nIGR3KQorCXsKKwkJcmV0dXJuIChmbG9hdCYpZHc7CisJfQorCisJRGlyZWN0M0REZXZpY2U5RXg6OkRpcmVjdDNERGV2aWNlOUV4KGNvbnN0IEhJTlNUQU5DRSBpbnN0YW5jZSwgRGlyZWN0M0Q5RXggKmQzZDlleCwgdW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgSFdORCBmb2N1c1dpbmRvdywgdW5zaWduZWQgbG9uZyBiZWhhdmlvdXJGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykgOiBEaXJlY3QzRERldmljZTkoaW5zdGFuY2UsIGQzZDlleCwgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW91ckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycyksIGQzZDlleChkM2Q5ZXgpCisJeworCX0KKworCURpcmVjdDNERGV2aWNlOUV4Ojp+RGlyZWN0M0REZXZpY2U5RXgoKQorCXsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlUUkFDRSgiY29uc3QgSUlEICZpaWQgPSAweCUwLjhwLCB2b2lkICoqb2JqZWN0ID0gMHglMC44cCIsIGlpZCwgb2JqZWN0KTsKKworCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRERldmljZTlFeCB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRERldmljZTkgfHwKKwkJICAgaWlkID09IElJRF9JVW5rbm93bikKKwkJeworCQkJQWRkUmVmKCk7CisJCQkqb2JqZWN0ID0gdGhpczsKKworCQkJcmV0dXJuIFNfT0s7CisJCX0KKworCQkqb2JqZWN0ID0gMDsKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNERGV2aWNlOUV4OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpBZGRSZWYoKTsKKwl9CisJCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRERldmljZTlFeDo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpCZWdpblNjZW5lKCkKKwl7CisJCVRSQUNFKCJ2b2lkIik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6QmVnaW5TY2VuZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkJlZ2luU3RhdGVCbG9jaygpCisJeworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkJlZ2luU3RhdGVCbG9jaygpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkNsZWFyKHVuc2lnbmVkIGxvbmcgY291bnQsIGNvbnN0IEQzRFJFQ1QgKnJlY3RzLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGNvbG9yLCBmbG9hdCB6LCB1bnNpZ25lZCBsb25nIHN0ZW5jaWwpCisJeworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBjb3VudCA9ICVkLCBjb25zdCBEM0RSRUNUICpyZWN0cyA9IDB4JTAuOHAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAweCUwLjhYLCB1bnNpZ25lZCBsb25nIGNvbG9yID0gMHglMC44WCwgZmxvYXQgeiA9ICVmLCB1bnNpZ25lZCBsb25nIHN0ZW5jaWwgPSAlZCIsIGNvdW50LCByZWN0cywgZmxhZ3MsIGNvbG9yLCB6LCBzdGVuY2lsKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpDbGVhcihjb3VudCwgcmVjdHMsIGZsYWdzLCBjb2xvciwgeiwgc3RlbmNpbCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q29sb3JGaWxsKElEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlLCBjb25zdCBSRUNUICpyZWN0LCBEM0RDT0xPUiBjb2xvcikKKwl7CisJCVRSQUNFKCJJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZSA9IDB4JTAuOHAsIGNvbnN0IFJFQ1QgKnJlY3QgPSAweCUwLjhwLCBEM0RDT0xPUiBjb2xvciA9IDB4JTAuOFgiLCBzdXJmYWNlLCByZWN0LCBjb2xvcik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q29sb3JGaWxsKHN1cmZhY2UsIHJlY3QsIGNvbG9yKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRFN3YXBDaGFpbjkgKipzd2FwQ2hhaW4pCisJeworCQlUUkFDRSgiRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyA9IDB4JTAuOHAsIElEaXJlY3QzRFN3YXBDaGFpbjkgKipzd2FwQ2hhaW4gPSAweCUwLjhwIiwgcHJlc2VudFBhcmFtZXRlcnMsIHN3YXBDaGFpbik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbihwcmVzZW50UGFyYW1ldGVycywgc3dhcENoYWluKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVDdWJlVGV4dHVyZSh1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RDdWJlVGV4dHVyZTkgKipjdWJlVGV4dHVyZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aCA9ICVkLCB1bnNpZ25lZCBpbnQgbGV2ZWxzID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RQT09MIHBvb2wgPSAlZCwgSURpcmVjdDNEQ3ViZVRleHR1cmU5ICoqY3ViZVRleHR1cmUgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIGVkZ2VMZW5ndGgsIGxldmVscywgdXNhZ2UsIGZvcm1hdCwgcG9vbCwgY3ViZVRleHR1cmUsIHNoYXJlZEhhbmRsZSk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlQ3ViZVRleHR1cmUoZWRnZUxlbmd0aCwgbGV2ZWxzLCB1c2FnZSwgZm9ybWF0LCBwb29sLCBjdWJlVGV4dHVyZSwgc2hhcmVkSGFuZGxlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgdW5zaWduZWQgbG9uZyBtdWx0aVNhbXBsZVF1YWxpdHksIGludCBkaXNjYXJkLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnN1cmZhY2UsIHZvaWQgKipzaGFyZWRIYW5kbGUpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IHdpZHRoID0gJWQsIHVuc2lnbmVkIGludCBoZWlnaHQgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlID0gJWQsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5ID0gJWQsIGludCBkaXNjYXJkID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBtdWx0aVNhbXBsZSwgbXVsdGlTYW1wbGVRdWFsaXR5LCBkaXNjYXJkLCBzdXJmYWNlLCBzaGFyZWRIYW5kbGUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2Uod2lkdGgsIGhlaWdodCwgZm9ybWF0LCBtdWx0aVNhbXBsZSwgbXVsdGlTYW1wbGVRdWFsaXR5LCBkaXNjYXJkLCBzdXJmYWNlLCBzaGFyZWRIYW5kbGUpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkNyZWF0ZUluZGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNESW5kZXhCdWZmZXI5ICoqaW5kZXhCdWZmZXIsIHZvaWQgKipzaGFyZWRIYW5kbGUpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGxlbmd0aCA9ICVkLCB1bnNpZ25lZCBsb25nIHVzYWdlID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgRDNEUE9PTCBwb29sID0gJWQsIElEaXJlY3QzREluZGV4QnVmZmVyOSAqKmluZGV4QnVmZmVyID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCBsZW5ndGgsIHVzYWdlLCBmb3JtYXQsIHBvb2wsIGluZGV4QnVmZmVyLCBzaGFyZWRIYW5kbGUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZUluZGV4QnVmZmVyKGxlbmd0aCwgdXNhZ2UsIGZvcm1hdCwgcG9vbCwgaW5kZXhCdWZmZXIsIHNoYXJlZEhhbmRsZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnN1cmZhY2UsIHZvaWQgKipzaGFyZWRIYW5kbGUpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IHdpZHRoID0gJWQsIHVuc2lnbmVkIGludCBoZWlnaHQgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RQT09MIHBvb2wgPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHBvb2wsIHN1cmZhY2UsIHNoYXJlZEhhbmRsZSk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgcG9vbCwgc3VyZmFjZSwgc2hhcmVkSGFuZGxlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVQaXhlbFNoYWRlcihjb25zdCB1bnNpZ25lZCBsb25nICpmdW5jdGlvbiwgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICoqc2hhZGVyKQorCXsKKwkJVFJBQ0UoImNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uID0gMHglMC44cCwgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICoqc2hhZGVyID0gMHglMC44cCIsIGZ1bmN0aW9uLCBzaGFkZXIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVBpeGVsU2hhZGVyKGZ1bmN0aW9uLCBzaGFkZXIpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkNyZWF0ZVF1ZXJ5KEQzRFFVRVJZVFlQRSB0eXBlLCBJRGlyZWN0M0RRdWVyeTkgKipxdWVyeSkKKwl7CisJCVRSQUNFKCJEM0RRVUVSWVRZUEUgdHlwZSA9ICVkLCBJRGlyZWN0M0RRdWVyeTkgKipxdWVyeSA9IDB4JTAuOHAiLCB0eXBlLCBxdWVyeSk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlUXVlcnkodHlwZSwgcXVlcnkpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkNyZWF0ZVJlbmRlclRhcmdldCh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5LCBpbnQgbG9ja2FibGUsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgd2lkdGggPSAlZCwgdW5zaWduZWQgaW50IGhlaWdodCA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUgPSAlZCwgdW5zaWduZWQgbG9uZyBtdWx0aVNhbXBsZVF1YWxpdHkgPSAlZCwgaW50IGxvY2thYmxlID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBtdWx0aVNhbXBsZSwgbXVsdGlTYW1wbGVRdWFsaXR5LCBsb2NrYWJsZSwgc3VyZmFjZSwgc2hhcmVkSGFuZGxlKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVSZW5kZXJUYXJnZXQod2lkdGgsIGhlaWdodCwgZm9ybWF0LCBtdWx0aVNhbXBsZSwgbXVsdGlTYW1wbGVRdWFsaXR5LCBsb2NrYWJsZSwgc3VyZmFjZSwgc2hhcmVkSGFuZGxlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVTdGF0ZUJsb2NrKEQzRFNUQVRFQkxPQ0tUWVBFIHR5cGUsIElEaXJlY3QzRFN0YXRlQmxvY2s5ICoqc3RhdGVCbG9jaykKKwl7CisJCVRSQUNFKCJEM0RTVEFURUJMT0NLVFlQRSB0eXBlID0gJWQsIElEaXJlY3QzRFN0YXRlQmxvY2s5ICoqc3RhdGVCbG9jayA9IDB4JTAuOHAiLCB0eXBlLCBzdGF0ZUJsb2NrKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVTdGF0ZUJsb2NrKHR5cGUsIHN0YXRlQmxvY2spOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkNyZWF0ZVRleHR1cmUodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFRleHR1cmU5ICoqdGV4dHVyZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgd2lkdGggPSAlZCwgdW5zaWduZWQgaW50IGhlaWdodCA9ICVkLCB1bnNpZ25lZCBpbnQgbGV2ZWxzID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RQT09MIHBvb2wgPSAlZCwgSURpcmVjdDNEVGV4dHVyZTkgKip0ZXh0dXJlID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCB3aWR0aCwgaGVpZ2h0LCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wsIHRleHR1cmUsIHNoYXJlZEhhbmRsZSk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlVGV4dHVyZSh3aWR0aCwgaGVpZ2h0LCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wsIHRleHR1cmUsIHNoYXJlZEhhbmRsZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlVmVydGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIHVuc2lnbmVkIGxvbmcgRlZGLCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKip2ZXJ0ZXhCdWZmZXIsIHZvaWQgKipzaGFyZWRIYW5kbGUpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGxlbmd0aCA9ICVkLCB1bnNpZ25lZCBsb25nIHVzYWdlID0gJWQsIHVuc2lnbmVkIGxvbmcgRlZGID0gMHglMC44WCwgRDNEUE9PTCBwb29sID0gJWQsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKip2ZXJ0ZXhCdWZmZXIgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIGxlbmd0aCwgdXNhZ2UsIEZWRiwgcG9vbCwgdmVydGV4QnVmZmVyLCBzaGFyZWRIYW5kbGUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVZlcnRleEJ1ZmZlcihsZW5ndGgsIHVzYWdlLCBGVkYsIHBvb2wsIHZlcnRleEJ1ZmZlciwgc2hhcmVkSGFuZGxlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihjb25zdCBEM0RWRVJURVhFTEVNRU5UOSAqdmVydGV4RWxlbWVudHMsIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uKQorCXsKKwkJVFJBQ0UoImNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5ICp2ZXJ0ZXhFbGVtZW50cyA9IDB4JTAuOHAsIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uID0gMHglMC44cCIsIHZlcnRleEVsZW1lbnRzLCBkZWNsYXJhdGlvbik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlVmVydGV4RGVjbGFyYXRpb24odmVydGV4RWxlbWVudHMsIGRlY2xhcmF0aW9uKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIpCisJeworCQlUUkFDRSgiY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24gPSAweCUwLjhwLCBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICoqc2hhZGVyID0gMHglMC44cCIsIGZ1bmN0aW9uLCBzaGFkZXIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVZlcnRleFNoYWRlcihmdW5jdGlvbiwgc2hhZGVyKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVWb2x1bWVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGRlcHRoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFZvbHVtZVRleHR1cmU5ICoqdm9sdW1lVGV4dHVyZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgd2lkdGggPSAlZCwgdW5zaWduZWQgaW50IGhlaWdodCA9ICVkLCB1bnNpZ25lZCBpbnQgZGVwdGggPSAlZCwgdW5zaWduZWQgaW50IGxldmVscyA9ICVkLCB1bnNpZ25lZCBsb25nIHVzYWdlID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgRDNEUE9PTCBwb29sID0gJWQsIElEaXJlY3QzRFZvbHVtZVRleHR1cmU5ICoqdm9sdW1lVGV4dHVyZSA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGxldmVscywgdXNhZ2UsIGZvcm1hdCwgcG9vbCwgdm9sdW1lVGV4dHVyZSwgc2hhcmVkSGFuZGxlKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVWb2x1bWVUZXh0dXJlKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wsIHZvbHVtZVRleHR1cmUsIHNoYXJlZEhhbmRsZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6RGVsZXRlUGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaGFuZGxlID0gJWQiLCBoYW5kbGUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkRlbGV0ZVBhdGNoKGhhbmRsZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6RHJhd0luZGV4ZWRQcmltaXRpdmUoRDNEUFJJTUlUSVZFVFlQRSB0eXBlLCBpbnQgYmFzZVZlcnRleEluZGV4LCB1bnNpZ25lZCBpbnQgbWluSW5kZXgsIHVuc2lnbmVkIGludCBudW1WZXJ0aWNlcywgdW5zaWduZWQgaW50IHN0YXJ0SW5kZXgsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCkKKwl7CisJCVRSQUNFKCJEM0RQUklNSVRJVkVUWVBFIHR5cGUgPSAlZCwgaW50IGJhc2VWZXJ0ZXhJbmRleCA9ICVkLCB1bnNpZ25lZCBpbnQgbWluSW5kZXggPSAlZCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzID0gJWQsIHVuc2lnbmVkIGludCBzdGFydEluZGV4ID0gJWQsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCA9ICVkIiwgdHlwZSwgYmFzZVZlcnRleEluZGV4LCBtaW5JbmRleCwgbnVtVmVydGljZXMsIHN0YXJ0SW5kZXgsIHByaW1pdGl2ZUNvdW50KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpEcmF3SW5kZXhlZFByaW1pdGl2ZSh0eXBlLCBiYXNlVmVydGV4SW5kZXgsIG1pbkluZGV4LCBudW1WZXJ0aWNlcywgc3RhcnRJbmRleCwgcHJpbWl0aXZlQ291bnQpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkRyYXdJbmRleGVkUHJpbWl0aXZlVVAoRDNEUFJJTUlUSVZFVFlQRSB0eXBlLCB1bnNpZ25lZCBpbnQgbWluSW5kZXgsIHVuc2lnbmVkIGludCBudW1WZXJ0aWNlcywgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50LCBjb25zdCB2b2lkICppbmRleERhdGEsIEQzREZPUk1BVCBpbmRleERhdGFGb3JtYXQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhLCB1bnNpZ25lZCBpbnQgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSkKKwl7CisJCVRSQUNFKCJEM0RQUklNSVRJVkVUWVBFIHR5cGUgPSAlZCwgdW5zaWduZWQgaW50IG1pbkluZGV4ID0gJWQsIHVuc2lnbmVkIGludCBudW1WZXJ0aWNlcyA9ICVkLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQgPSAlZCwgY29uc3Qgdm9pZCAqaW5kZXhEYXRhID0gMHglMC44cCwgRDNERk9STUFUIGluZGV4RGF0YUZvcm1hdCA9ICVkLCBjb25zdCB2b2lkICp2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlID0gJWQiLCB0eXBlLCBtaW5JbmRleCwgbnVtVmVydGljZXMsIHByaW1pdGl2ZUNvdW50LCBpbmRleERhdGEsIGluZGV4RGF0YUZvcm1hdCwgdmVydGV4U3RyZWFtWmVyb0RhdGEsIHZlcnRleFN0cmVhbVplcm9TdHJpZGUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkRyYXdJbmRleGVkUHJpbWl0aXZlVVAodHlwZSwgbWluSW5kZXgsIG51bVZlcnRpY2VzLCBwcmltaXRpdmVDb3VudCwgaW5kZXhEYXRhLCBpbmRleERhdGFGb3JtYXQsIHZlcnRleFN0cmVhbVplcm9EYXRhLCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpEcmF3UHJpbWl0aXZlKEQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlVHlwZSwgdW5zaWduZWQgaW50IHN0YXJ0VmVydGV4LCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQpCisJeworCQlUUkFDRSgiRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVUeXBlID0gJWQsIHVuc2lnbmVkIGludCBzdGFydFZlcnRleCA9ICVkLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQgPSAlZCIsIHByaW1pdGl2ZVR5cGUsIHN0YXJ0VmVydGV4LCBwcmltaXRpdmVDb3VudCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6RHJhd1ByaW1pdGl2ZShwcmltaXRpdmVUeXBlLCBzdGFydFZlcnRleCwgcHJpbWl0aXZlQ291bnQpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkRyYXdQcmltaXRpdmVVUChEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKQorCXsKKwkJVFJBQ0UoIkQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlVHlwZSA9ICVkLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQgPSAlZCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSA9ICVkIiwgcHJpbWl0aXZlVHlwZSwgcHJpbWl0aXZlQ291bnQsIHZlcnRleFN0cmVhbVplcm9EYXRhLCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpEcmF3UHJpbWl0aXZlVVAocHJpbWl0aXZlVHlwZSwgcHJpbWl0aXZlQ291bnQsIHZlcnRleFN0cmVhbVplcm9EYXRhLCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpEcmF3UmVjdFBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUsIGNvbnN0IGZsb2F0ICpudW1TZWdzLCBjb25zdCBEM0RSRUNUUEFUQ0hfSU5GTyAqcmVjdFBhdGNoSW5mbykKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaGFuZGxlID0gJWQsIGNvbnN0IGZsb2F0ICpudW1TZWdzID0gMHglMC44cCwgY29uc3QgRDNEUkVDVFBBVENIX0lORk8gKnJlY3RQYXRjaEluZm8gPSAweCUwLjhwIiwgaGFuZGxlLCBudW1TZWdzLCByZWN0UGF0Y2hJbmZvKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpEcmF3UmVjdFBhdGNoKGhhbmRsZSwgbnVtU2VncywgcmVjdFBhdGNoSW5mbyk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6RHJhd1RyaVBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUsIGNvbnN0IGZsb2F0ICpudW1TZWdzLCBjb25zdCBEM0RUUklQQVRDSF9JTkZPICp0cmlQYXRjaEluZm8pCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGhhbmRsZSA9ICVkLCBjb25zdCBmbG9hdCAqbnVtU2VncyA9IDB4JTAuOHAsIGNvbnN0IEQzRFRSSVBBVENIX0lORk8gKnRyaVBhdGNoSW5mbyA9IDB4JTAuOHAiLCBoYW5kbGUsIG51bVNlZ3MsIHRyaVBhdGNoSW5mbyk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6RHJhd1RyaVBhdGNoKGhhbmRsZSwgbnVtU2VncywgdHJpUGF0Y2hJbmZvKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpFbmRTY2VuZSgpCisJeworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkVuZFNjZW5lKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6RW5kU3RhdGVCbG9jayhJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqKnN0YXRlQmxvY2spCisJeworCQlUUkFDRSgiSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrID0gMHglMC44cCIsIHN0YXRlQmxvY2spOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkVuZFN0YXRlQmxvY2soc3RhdGVCbG9jayk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6RXZpY3RNYW5hZ2VkUmVzb3VyY2VzKCkKKwl7CisJCVRSQUNFKCJ2b2lkIik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6RXZpY3RNYW5hZ2VkUmVzb3VyY2VzKCk7CisJfQorCisJdW5zaWduZWQgaW50IERpcmVjdDNERGV2aWNlOUV4OjpHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkKKwl7CisJCVRSQUNFKCJ2b2lkIik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldEJhY2tCdWZmZXIodW5zaWduZWQgaW50IHN3YXBDaGFpbkluZGV4LCB1bnNpZ25lZCBpbnQgYmFja0J1ZmZlckluZGV4LCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSwgSURpcmVjdDNEU3VyZmFjZTkgKipiYWNrQnVmZmVyKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzd2FwQ2hhaW5JbmRleCA9ICVkLCB1bnNpZ25lZCBpbnQgYmFja0J1ZmZlckluZGV4ID0gJWQsIEQzREJBQ0tCVUZGRVJfVFlQRSB0eXBlID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICoqYmFja0J1ZmZlciA9IDB4JTAuOHAiLCBzd2FwQ2hhaW5JbmRleCwgYmFja0J1ZmZlckluZGV4LCB0eXBlLCBiYWNrQnVmZmVyKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRCYWNrQnVmZmVyKHN3YXBDaGFpbkluZGV4LCBiYWNrQnVmZmVySW5kZXgsIHR5cGUsIGJhY2tCdWZmZXIpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBmbG9hdCAqcGxhbmUpCisJeworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBpbmRleCA9ICVkLCBmbG9hdCAqcGxhbmUgPSAweCUwLjhwIiwgaW5kZXgsIHBsYW5lKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRDbGlwUGxhbmUoaW5kZXgsIHBsYW5lKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRDbGlwU3RhdHVzKEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKQorCXsKKwkJVFJBQ0UoIkQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzID0gMHglMC44cCIsIGNsaXBTdGF0dXMpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldENsaXBTdGF0dXMoY2xpcFN0YXR1cyk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0Q3JlYXRpb25QYXJhbWV0ZXJzKEQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTICpwYXJhbWV0ZXJzKQorCXsKKwkJVFJBQ0UoIkQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTICpwYXJhbWV0ZXJzID0gMHglMC44cCIsIHBhcmFtZXRlcnMpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldENyZWF0aW9uUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50ICpwYWxldHRlTnVtYmVyKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCAqcGFsZXR0ZU51bWJlciA9IDB4JTAuOHAiLCBwYWxldHRlTnVtYmVyKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUocGFsZXR0ZU51bWJlcik7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0RGVwdGhTdGVuY2lsU3VyZmFjZShJRGlyZWN0M0RTdXJmYWNlOSAqKmRlcHRoU3RlbmNpbFN1cmZhY2UpCisJeworCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKipkZXB0aFN0ZW5jaWxTdXJmYWNlID0gMHglMC44cCIsIGRlcHRoU3RlbmNpbFN1cmZhY2UpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldERlcHRoU3RlbmNpbFN1cmZhY2UoZGVwdGhTdGVuY2lsU3VyZmFjZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0RGV2aWNlQ2FwcyhEM0RDQVBTOSAqY2FwcykKKwl7CisJCVRSQUNFKCJEM0RDQVBTOSAqY2FwcyA9IDB4JTAuOHAiLCBjYXBzKTsKKworCQlyZXR1cm4gZDNkOWV4LT5HZXREZXZpY2VDYXBzKEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwsIGNhcHMpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldERpcmVjdDNEKElEaXJlY3QzRDkgKipkM2Q5KQorCXsKKwkJVFJBQ0UoIklEaXJlY3QzRDkgKipkM2Q5ID0gMHglMC44cCIsIGQzZDkpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldERpcmVjdDNEKGQzZDkpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldERpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBpbmRleCwgRDNERElTUExBWU1PREUgKm1vZGUpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGluZGV4ID0gJWQsIEQzRERJU1BMQVlNT0RFICptb2RlID0gMHglMC44cCIsIGluZGV4LCBtb2RlKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXREaXNwbGF5TW9kZShpbmRleCwgbW9kZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0RnJvbnRCdWZmZXJEYXRhKHVuc2lnbmVkIGludCBpbmRleCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBpbmRleCA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UgPSAlcCIsIGluZGV4LCBkZXN0U3VyZmFjZSk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0RnJvbnRCdWZmZXJEYXRhKGluZGV4LCBkZXN0U3VyZmFjZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0RlZGKHVuc2lnbmVkIGxvbmcgKkZWRikKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nICpGVkYgPSAweCUwLjhwIiwgRlZGKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRGVkYoRlZGKTsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlOUV4OjpHZXRHYW1tYVJhbXAodW5zaWduZWQgaW50IGluZGV4LCBEM0RHQU1NQVJBTVAgKnJhbXApCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IGluZGV4ID0gJWQsIEQzREdBTU1BUkFNUCAqcmFtcCA9IDB4JTAuOHAiLCBpbmRleCwgcmFtcCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0R2FtbWFSYW1wKGluZGV4LCByYW1wKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRJbmRpY2VzKElEaXJlY3QzREluZGV4QnVmZmVyOSAqKmluZGV4RGF0YSkKKwl7CisJCVRSQUNFKCJJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKippbmRleERhdGEgPSAweCUwLjhwIiwgaW5kZXhEYXRhKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRJbmRpY2VzKGluZGV4RGF0YSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgRDNETElHSFQ5ICpsaWdodCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIEQzRExJR0hUOSAqbGlnaHQgPSAweCUwLjhwIiwgaW5kZXgsIGxpZ2h0KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRMaWdodChpbmRleCwgbGlnaHQpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldExpZ2h0RW5hYmxlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCAqZW5hYmxlKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgaW5kZXggPSAlZCwgaW50ICplbmFibGUgPSAweCUwLjhwIiwgaW5kZXgsIGVuYWJsZSk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0TGlnaHRFbmFibGUoaW5kZXgsIGVuYWJsZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0TWF0ZXJpYWwoRDNETUFURVJJQUw5ICptYXRlcmlhbCkKKwl7CisJCVRSQUNFKCJEM0RNQVRFUklBTDkgKm1hdGVyaWFsID0gMHglMC44cCIsIG1hdGVyaWFsKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRNYXRlcmlhbChtYXRlcmlhbCk7CisJfQorCisJZmxvYXQgRGlyZWN0M0REZXZpY2U5RXg6OkdldE5QYXRjaE1vZGUoKQorCXsKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXROUGF0Y2hNb2RlKCk7CisJfQorCisJdW5zaWduZWQgaW50IERpcmVjdDNERGV2aWNlOUV4OjpHZXROdW1iZXJPZlN3YXBDaGFpbnMoKQorCXsKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXROdW1iZXJPZlN3YXBDaGFpbnMoKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRQYWxldHRlRW50cmllcyh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlciwgUEFMRVRURUVOVFJZICplbnRyaWVzKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyID0gJWQsIFBBTEVUVEVFTlRSWSAqZW50cmllcyA9IDB4JTAuOHAiLCBwYWxldHRlTnVtYmVyLCBlbnRyaWVzKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRQYWxldHRlRW50cmllcyhwYWxldHRlTnVtYmVyLCBlbnRyaWVzKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRQaXhlbFNoYWRlcihJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKipzaGFkZXIpCisJeworCQlUUkFDRSgiSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICoqc2hhZGVyID0gMHglMC44cCIsIHNoYWRlcik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0UGl4ZWxTaGFkZXIoc2hhZGVyKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0UGl4ZWxTaGFkZXJDb25zdGFudEIoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0UGl4ZWxTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0UGl4ZWxTaGFkZXJDb25zdGFudEkodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFJhc3RlclN0YXR1cyh1bnNpZ25lZCBpbnQgc3dhcENoYWluLCBEM0RSQVNURVJfU1RBVFVTICpyYXN0ZXJTdGF0dXMpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IHN3YXBDaGFpbiA9ICVkLCBEM0RSQVNURVJfU1RBVFVTICpyYXN0ZXJTdGF0dXMgPSAweCUwLjhwIiwgc3dhcENoYWluLCByYXN0ZXJTdGF0dXMpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFJhc3RlclN0YXR1cyhzd2FwQ2hhaW4sIHJhc3RlclN0YXR1cyk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0UmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVUWVBFIHN0YXRlLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKKwl7CisJCVRSQUNFKCJEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUgPSAlZCwgdW5zaWduZWQgbG9uZyAqdmFsdWUgPSAweCUwLjhwIiwgc3RhdGUsIHZhbHVlKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRSZW5kZXJTdGF0ZShzdGF0ZSwgdmFsdWUpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFJlbmRlclRhcmdldCh1bnNpZ25lZCBsb25nIGluZGV4LCBJRGlyZWN0M0RTdXJmYWNlOSAqKnJlbmRlclRhcmdldCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICoqcmVuZGVyVGFyZ2V0ID0gMHglMC44cCIsIGluZGV4LCByZW5kZXJUYXJnZXQpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFJlbmRlclRhcmdldChpbmRleCwgcmVuZGVyVGFyZ2V0KTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRSZW5kZXJUYXJnZXREYXRhKElEaXJlY3QzRFN1cmZhY2U5ICpyZW5kZXJUYXJnZXQsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0U3VyZmFjZSkKKwl7CisJCVRSQUNFKCJJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0ID0gMHglMC44cCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlID0gMHglMC44cCIsIHJlbmRlclRhcmdldCwgZGVzdFN1cmZhY2UpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFJlbmRlclRhcmdldERhdGEocmVuZGVyVGFyZ2V0LCBkZXN0U3VyZmFjZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0U2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgc2FtcGxlciwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCisJeworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBzYW1wbGVyID0gJWQsIEQzRFNBTVBMRVJTVEFURVRZUEUgdHlwZSA9ICVkLCB1bnNpZ25lZCBsb25nICp2YWx1ZSA9IDB4JTAuOHAiLCBzYW1wbGVyLCBzdGF0ZSwgdmFsdWUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFNhbXBsZXJTdGF0ZShzYW1wbGVyLCBzdGF0ZSwgdmFsdWUpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFNjaXNzb3JSZWN0KFJFQ1QgKnJlY3QpCisJeworCQlUUkFDRSgiUkVDVCAqcmVjdCA9IDB4JTAuOHAiLCByZWN0KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRTY2lzc29yUmVjdChyZWN0KTsKKwl9CisKKwlpbnQgRGlyZWN0M0REZXZpY2U5RXg6OkdldFNvZnR3YXJlVmVydGV4UHJvY2Vzc2luZygpCisJeworCQlUUkFDRSgidm9pZCIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFNvZnR3YXJlVmVydGV4UHJvY2Vzc2luZygpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFN0cmVhbVNvdXJjZSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICoqc3RyZWFtRGF0YSwgdW5zaWduZWQgaW50ICpvZmZzZXQsIHVuc2lnbmVkIGludCAqc3RyaWRlKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIgPSAlZCwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqKnN0cmVhbURhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgKm9mZnNldCA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCAqc3RyaWRlID0gMHglMC44cCIsIHN0cmVhbU51bWJlciwgc3RyZWFtRGF0YSwgb2Zmc2V0LCBzdHJpZGUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFN0cmVhbVNvdXJjZShzdHJlYW1OdW1iZXIsIHN0cmVhbURhdGEsIG9mZnNldCwgc3RyaWRlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRTdHJlYW1Tb3VyY2VGcmVxKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIHVuc2lnbmVkIGludCAqZGl2aWRlcikKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyID0gJWQsIHVuc2lnbmVkIGludCAqZGl2aWRlciA9IDB4JTAuOHAiLCBzdHJlYW1OdW1iZXIsIGRpdmlkZXIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFN0cmVhbVNvdXJjZUZyZXEoc3RyZWFtTnVtYmVyLCBkaXZpZGVyKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRTd2FwQ2hhaW4odW5zaWduZWQgaW50IGluZGV4LCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBpbmRleCA9ICVkLCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluID0gMHglMC44cCIsIGluZGV4LCBzd2FwQ2hhaW4pOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFN3YXBDaGFpbihpbmRleCwgc3dhcENoYWluKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgc2FtcGxlciwgSURpcmVjdDNEQmFzZVRleHR1cmU5ICoqdGV4dHVyZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIHNhbXBsZXIgPSAlZCwgSURpcmVjdDNEQmFzZVRleHR1cmU5ICoqdGV4dHVyZSA9IDB4JTAuOHAiLCBzYW1wbGVyLCB0ZXh0dXJlKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRUZXh0dXJlKHNhbXBsZXIsIHRleHR1cmUpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIHN0YWdlID0gJWQsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlID0gJWQsIHVuc2lnbmVkIGxvbmcgKnZhbHVlID0gMHglMC44cCIsIHN0YWdlLCB0eXBlLCB2YWx1ZSk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0VGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIHR5cGUsIHZhbHVlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBEM0RNQVRSSVggKm1hdHJpeCkKKwl7CisJCVRSQUNFKCJEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUgPSAlZCwgRDNETUFUUklYICptYXRyaXggPSAweCUwLjhwIiwgc3RhdGUsIG1hdHJpeCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0VHJhbnNmb3JtKHN0YXRlLCBtYXRyaXgpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFZlcnRleERlY2xhcmF0aW9uKElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uKQorCXsKKwkJVFJBQ0UoIklEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uID0gMHglMC44cCIsIGRlY2xhcmF0aW9uKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZWNsYXJhdGlvbik7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0VmVydGV4U2hhZGVyKElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIpCisJeworCQlUUkFDRSgiSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqKnNoYWRlciA9IDB4JTAuOHAiLCBzaGFkZXIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFZlcnRleFNoYWRlcihzaGFkZXIpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFZlcnRleFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0Vmlld3BvcnQoRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCkKKwl7CisJCVRSQUNFKCJEM0RWSUVXUE9SVDkgKnZpZXdwb3J0ID0gMHglMC44cCIsIHZpZXdwb3J0KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRWaWV3cG9ydCh2aWV3cG9ydCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6TGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCwgaW50IGVuYWJsZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIGludCBlbmFibGUgPSAlZCIsIGluZGV4LCBlbmFibGUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OkxpZ2h0RW5hYmxlKGluZGV4LCBlbmFibGUpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6Ok11bHRpcGx5VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpCisJeworCQlUUkFDRSgiRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlID0gJWQsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4ID0gMHglMC44cCIsIHN0YXRlLCBtYXRyaXgpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6Ok11bHRpcGx5VHJhbnNmb3JtKHN0YXRlLCBtYXRyaXgpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlByZXNlbnQoY29uc3QgUkVDVCAqc291cmNlUmVjdCwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbikKKwl7CisJCVRSQUNFKCJjb25zdCBSRUNUICpzb3VyY2VSZWN0ID0gMHglMC44cCwgY29uc3QgUkVDVCAqZGVzdFJlY3QgPSAweCUwLjhwLCBIV05EIGRlc3RXaW5kb3dPdmVycmlkZSA9ICVkLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbiA9IDB4JTAuOHAiLCBzb3VyY2VSZWN0LCBkZXN0UmVjdCwgZGVzdFdpbmRvd092ZXJyaWRlLCBkaXJ0eVJlZ2lvbik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6UHJlc2VudChzb3VyY2VSZWN0LCBkZXN0UmVjdCwgZGVzdFdpbmRvd092ZXJyaWRlLCBkaXJ0eVJlZ2lvbik7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6UHJvY2Vzc1ZlcnRpY2VzKHVuc2lnbmVkIGludCBzcmNTdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgZGVzdEluZGV4LCB1bnNpZ25lZCBpbnQgdmVydGV4Q291bnQsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRlc3RCdWZmZXIsIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4RGVjbGFyYXRpb24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IHNyY1N0YXJ0SW5kZXggPSAlZCwgdW5zaWduZWQgaW50IGRlc3RJbmRleCA9ICVkLCB1bnNpZ25lZCBpbnQgdmVydGV4Q291bnQgPSAlZCwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqZGVzdEJ1ZmZlciA9IDB4JTAuOHAsIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4RGVjbGFyYXRpb24gPSAweCUwLjhwLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gJWQiLCBzcmNTdGFydEluZGV4LCBkZXN0SW5kZXgsIHZlcnRleENvdW50LCBkZXN0QnVmZmVyLCB2ZXJ0ZXhEZWNsYXJhdGlvbiwgZmxhZ3MpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlByb2Nlc3NWZXJ0aWNlcyhzcmNTdGFydEluZGV4LCBkZXN0SW5kZXgsIHZlcnRleENvdW50LCBkZXN0QnVmZmVyLCB2ZXJ0ZXhEZWNsYXJhdGlvbiwgZmxhZ3MpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlJlc2V0KEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpCisJeworCQlUUkFDRSgiRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyA9IDB4JTAuOHAiLCBwcmVzZW50UGFyYW1ldGVycyk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6UmVzZXQocHJlc2VudFBhcmFtZXRlcnMpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBmbG9hdCAqcGxhbmUpCisJeworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBpbmRleCA9ICVkLCBjb25zdCBmbG9hdCAqcGxhbmUgPSAweCUwLjhwIiwgaW5kZXgsIHBsYW5lKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRDbGlwUGxhbmUoaW5kZXgsIHBsYW5lKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRDbGlwU3RhdHVzKGNvbnN0IEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKQorCXsKKwkJVFJBQ0UoImNvbnN0IEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzID0gMHglMC44cCIsIGNsaXBTdGF0dXMpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldENsaXBTdGF0dXMoY2xpcFN0YXR1cyk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyID0gJWQiLCBwYWxldHRlTnVtYmVyKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUocGFsZXR0ZU51bWJlcik7CisJfQorCisJdm9pZCBEaXJlY3QzRERldmljZTlFeDo6U2V0Q3Vyc29yUG9zaXRpb24oaW50IHgsIGludCB5LCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwkJVFJBQ0UoImludCB4ID0gJWQsIGludCB5ID0gJWQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAweCUwLjhYIiwgeCwgeSwgZmxhZ3MpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldEN1cnNvclBvc2l0aW9uKHgsIHksIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRDdXJzb3JQcm9wZXJ0aWVzKHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgeSwgSURpcmVjdDNEU3VyZmFjZTkgKmN1cnNvckJpdG1hcCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgeCA9ICVkLCB1bnNpZ25lZCBpbnQgeSA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqY3Vyc29yQml0bWFwID0gMHglMC44cCIsIHgsIHksIGN1cnNvckJpdG1hcCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0Q3Vyc29yUHJvcGVydGllcyh4LCB5LCBjdXJzb3JCaXRtYXApOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKmlEZXB0aFN0ZW5jaWwpCisJeworCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKm5ld0RlcHRoU3RlbmNpbCA9IDB4JTAuOHAiLCBpRGVwdGhTdGVuY2lsKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXREZXB0aFN0ZW5jaWxTdXJmYWNlKGlEZXB0aFN0ZW5jaWwpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldERpYWxvZ0JveE1vZGUoaW50IGVuYWJsZURpYWxvZ3MpCisJeworCQlUUkFDRSgiaW50IGVuYWJsZURpYWxvZ3MgPSAlZCIsIGVuYWJsZURpYWxvZ3MpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldERpYWxvZ0JveE1vZGUoZW5hYmxlRGlhbG9ncyk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0RlZGKHVuc2lnbmVkIGxvbmcgRlZGKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgRlZGID0gMHglMC44WCIsIEZWRik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0RlZGKEZWRik7CisJfQorCisJdm9pZCBEaXJlY3QzRERldmljZTlFeDo6U2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgRDNER0FNTUFSQU1QICpyYW1wKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBpbmRleCA9ICVkLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gMHglMC44WCwgY29uc3QgRDNER0FNTUFSQU1QICpyYW1wID0gMHglMC44cCIsIGluZGV4LCBmbGFncywgcmFtcCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0R2FtbWFSYW1wKGluZGV4LCBmbGFncywgcmFtcCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0SW5kaWNlcyhJRGlyZWN0M0RJbmRleEJ1ZmZlcjkqIGlJbmRleEJ1ZmZlcikKKwl7CisJCVRSQUNFKCJJRGlyZWN0M0RJbmRleEJ1ZmZlcjkqIGluZGV4RGF0YSA9IDB4JTAuOHAiLCBpSW5kZXhCdWZmZXIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldEluZGljZXMoaUluZGV4QnVmZmVyKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBEM0RMSUdIVDkgKmxpZ2h0KQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgaW5kZXggPSAlZCwgY29uc3QgRDNETElHSFQ5ICpsaWdodCA9IDB4JTAuOHAiLCBpbmRleCwgbGlnaHQpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldExpZ2h0KGluZGV4LCBsaWdodCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0TWF0ZXJpYWwoY29uc3QgRDNETUFURVJJQUw5ICptYXRlcmlhbCkKKwl7CisJCVRSQUNFKCJjb25zdCBEM0RNQVRFUklBTDkgKm1hdGVyaWFsID0gMHglMC44cCIsIG1hdGVyaWFsKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRNYXRlcmlhbChtYXRlcmlhbCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0TlBhdGNoTW9kZShmbG9hdCBzZWdtZW50cykKKwl7CisJCVRSQUNFKCJmbG9hdCBzZWdtZW50cyA9ICVmIiwgc2VnbWVudHMpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldE5QYXRjaE1vZGUoc2VnbWVudHMpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBjb25zdCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIgPSAlZCwgY29uc3QgUEFMRVRURUVOVFJZICplbnRyaWVzID0gMHglMC44cCIsIHBhbGV0dGVOdW1iZXIsIGVudHJpZXMpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFBhbGV0dGVFbnRyaWVzKHBhbGV0dGVOdW1iZXIsIGVudHJpZXMpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFBpeGVsU2hhZGVyKElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqaVBpeGVsU2hhZGVyKQorCXsKKwkJVFJBQ0UoIklEaXJlY3QzRFBpeGVsU2hhZGVyOSAqc2hhZGVyID0gMHglMC44cCIsIGlQaXhlbFNoYWRlcik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0UGl4ZWxTaGFkZXIoaVBpeGVsU2hhZGVyKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0UGl4ZWxTaGFkZXJDb25zdGFudEIoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0UGl4ZWxTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0UGl4ZWxTaGFkZXJDb25zdGFudEkodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgY29uc3QgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKKwl7CisJCVRSQUNFKCJEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUgPSAlZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSA9ICVkIiwgc3RhdGUsIHZhbHVlKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRSZW5kZXJTdGF0ZShzdGF0ZSwgdmFsdWUpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFJlbmRlclRhcmdldCh1bnNpZ25lZCBsb25nIGluZGV4LCBJRGlyZWN0M0RTdXJmYWNlOSAqaVJlbmRlclRhcmdldCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICpuZXdSZW5kZXJUYXJnZXQgPSAweCUwLjhwIiwgaW5kZXgsIGlSZW5kZXJUYXJnZXQpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFJlbmRlclRhcmdldChpbmRleCwgaVJlbmRlclRhcmdldCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0U2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgc2FtcGxlciwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIHNhbXBsZXIgPSAlZCwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSA9ICVkLCB1bnNpZ25lZCBsb25nIHZhbHVlID0gJWQiLCBzYW1wbGVyLCBzdGF0ZSwgdmFsdWUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFNhbXBsZXJTdGF0ZShzYW1wbGVyLCBzdGF0ZSwgdmFsdWUpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFNjaXNzb3JSZWN0KGNvbnN0IFJFQ1QgKnJlY3QpCisJeworCQlUUkFDRSgiY29uc3QgUkVDVCAqcmVjdCA9IDB4JTAuOHAiLCByZWN0KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRTY2lzc29yUmVjdChyZWN0KTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3NpbmcoaW50IHNvZnR3YXJlKQorCXsKKwkJVFJBQ0UoImludCBzb2Z0d2FyZSA9ICVkIiwgc29mdHdhcmUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFNvZnR3YXJlVmVydGV4UHJvY2Vzc2luZyhzb2Z0d2FyZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW0sIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmlWZXJ0ZXhCdWZmZXIsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzdHJpZGUpCisJeworCQlUUkFDRSgidW5zaWduZWQgaW50IHN0cmVhbSA9ICVkLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IG9mZnNldCA9ICVkLCB1bnNpZ25lZCBpbnQgc3RyaWRlID0gJWQiLCBzdHJlYW0sIGlWZXJ0ZXhCdWZmZXIsIG9mZnNldCwgc3RyaWRlKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRTdHJlYW1Tb3VyY2Uoc3RyZWFtLCBpVmVydGV4QnVmZmVyLCBvZmZzZXQsIHN0cmlkZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0U3RyZWFtU291cmNlRnJlcSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCB1bnNpZ25lZCBpbnQgZGl2aWRlcikKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyID0gJWQsIHVuc2lnbmVkIGludCBkaXZpZGVyID0gJWQiLCBzdHJlYW1OdW1iZXIsIGRpdmlkZXIpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFN0cmVhbVNvdXJjZUZyZXEoc3RyZWFtTnVtYmVyLCBkaXZpZGVyKTsKKwl9CisJCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqaUJhc2VUZXh0dXJlKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc2FtcGxlciA9ICVkLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmUgPSAweCUwLjhwIiwgc2FtcGxlciwgaUJhc2VUZXh0dXJlKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRUZXh0dXJlKHNhbXBsZXIsIGlCYXNlVGV4dHVyZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0VGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCisJeworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBzdGFnZSA9ICVkLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSA9ICVkLCB1bnNpZ25lZCBsb25nIHZhbHVlID0gJWQiLCBzdGFnZSwgdHlwZSwgdmFsdWUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCB0eXBlLCB2YWx1ZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpCisJeworCQlUUkFDRSgiRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlID0gJWQsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4ID0gMHglMC44cCIsIHN0YXRlLCBtYXRyaXgpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFRyYW5zZm9ybShzdGF0ZSwgbWF0cml4KTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmlWZXJ0ZXhEZWNsYXJhdGlvbikKKwl7CisJCVRSQUNFKCJJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmRlY2xhcmF0aW9uID0gMHglMC44cCIsIGlWZXJ0ZXhEZWNsYXJhdGlvbik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0VmVydGV4RGVjbGFyYXRpb24oaVZlcnRleERlY2xhcmF0aW9uKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRWZXJ0ZXhTaGFkZXIoSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqaVZlcnRleFNoYWRlcikKKwl7CisJCVRSQUNFKCJJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICpzaGFkZXIgPSAweCUwLjhwIiwgaVZlcnRleFNoYWRlcik7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0VmVydGV4U2hhZGVyKGlWZXJ0ZXhTaGFkZXIpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFZlcnRleFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCkKKwl7CisJCVRSQUNFKCJjb25zdCBEM0RWSUVXUE9SVDkgKnZpZXdwb3J0ID0gMHglMC44cCIsIHZpZXdwb3J0KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRWaWV3cG9ydCh2aWV3cG9ydCk7CisJfQorCisJaW50IERpcmVjdDNERGV2aWNlOUV4OjpTaG93Q3Vyc29yKGludCBzaG93KQorCXsKKwkJVFJBQ0UoImludCBzaG93ID0gJWQiLCBzaG93KTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTaG93Q3Vyc29yKHNob3cpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlN0cmV0Y2hSZWN0KElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIpCisJeworCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0ID0gMHglMC44cCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlID0gMHglMC44cCwgY29uc3QgUkVDVCAqZGVzdFJlY3QgPSAweCUwLjhwLCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIgPSAlZCIsIHNvdXJjZVN1cmZhY2UsIHNvdXJjZVJlY3QsIGRlc3RTdXJmYWNlLCBkZXN0UmVjdCwgZmlsdGVyKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdChzb3VyY2VTdXJmYWNlLCBzb3VyY2VSZWN0LCBkZXN0U3VyZmFjZSwgZGVzdFJlY3QsIGZpbHRlcik7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTlFeDo6VGVzdENvb3BlcmF0aXZlTGV2ZWwoKQorCXsKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpUZXN0Q29vcGVyYXRpdmVMZXZlbCgpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlVwZGF0ZVN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2UsIGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0aW5hdGlvblN1cmZhY2UsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQpCisJeworCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0ID0gMHglMC44cCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RpbmF0aW9uU3VyZmFjZSA9IDB4JTAuOHAsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQgPSAweCUwLjhwIiwgc291cmNlU3VyZmFjZSwgc291cmNlUmVjdCwgZGVzdGluYXRpb25TdXJmYWNlLCBkZXN0UG9pbnQpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlVwZGF0ZVN1cmZhY2Uoc291cmNlU3VyZmFjZSwgc291cmNlUmVjdCwgZGVzdGluYXRpb25TdXJmYWNlLCBkZXN0UG9pbnQpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlVwZGF0ZVRleHR1cmUoSURpcmVjdDNEQmFzZVRleHR1cmU5ICpzb3VyY2VUZXh0dXJlLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKmRlc3RpbmF0aW9uVGV4dHVyZSkKKwl7CisJCVRSQUNFKCJJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnNvdXJjZVRleHR1cmUgPSAweCUwLjhwLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKmRlc3RpbmF0aW9uVGV4dHVyZSA9IDB4JTAuOHAiLCBzb3VyY2VUZXh0dXJlLCBkZXN0aW5hdGlvblRleHR1cmUpOworCisJCXJldHVybiBEaXJlY3QzRERldmljZTk6OlVwZGF0ZVRleHR1cmUoc291cmNlVGV4dHVyZSwgZGVzdGluYXRpb25UZXh0dXJlKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpWYWxpZGF0ZURldmljZSh1bnNpZ25lZCBsb25nICpudW1QYXNzZXMpCisJeworCQlUUkFDRSgidW5zaWduZWQgbG9uZyAqbnVtUGFzc2VzID0gMHglMC44cCIsIG51bVBhc3Nlcyk7CisKKwkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6VmFsaWRhdGVEZXZpY2UobnVtUGFzc2VzKTsKKwl9CisKKwlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpTZXRDb252b2x1dGlvbk1vbm9LZXJuZWwoVUlOVCxVSU5ULGZsb2F0ICosZmxvYXQgKikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpDb21wb3NlUmVjdHMoSURpcmVjdDNEU3VyZmFjZTkgKixJRGlyZWN0M0RTdXJmYWNlOSAqLElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKixVSU5ULElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKixEM0RDT01QT1NFUkVDVFNPUCxpbnQsaW50KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OlByZXNlbnRFeChjb25zdCBSRUNUICosY29uc3QgUkVDVCAqLEhXTkQsY29uc3QgUkdOREFUQSAqLERXT1JEKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OkdldEdQVVRocmVhZFByaW9yaXR5KElOVCAqKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OlNldEdQVVRocmVhZFByaW9yaXR5KElOVCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpXYWl0Rm9yVkJsYW5rKFVJTlQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJSFJFU1VMVCBEaXJlY3QzRERldmljZTlFeDo6Q2hlY2tSZXNvdXJjZVJlc2lkZW5jeShJRGlyZWN0M0RSZXNvdXJjZTkgKiosVUlOVDMyKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OlNldE1heGltdW1GcmFtZUxhdGVuY3koVUlOVCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpHZXRNYXhpbXVtRnJhbWVMYXRlbmN5KFVJTlQgKikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpDaGVja0RldmljZVN0YXRlKEhXTkQgZGVzdGluYXRpb25XaW5kb3cpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkvLwlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVSZW5kZXJUYXJnZXRFeChVSU5ULFVJTlQsRDNERk9STUFULEQzRE1VTFRJU0FNUExFX1RZUEUsRFdPUkQsQk9PTCxJRGlyZWN0M0RTdXJmYWNlOSAqKixIQU5ETEUgKixEV09SRCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVPZmZzY3JlZW5QbGFpblN1cmZhY2VFeChVSU5ULFVJTlQsRDNERk9STUFULEQzRFBPT0wsSURpcmVjdDNEU3VyZmFjZTkgKiosSEFORExFICosRFdPUkQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJSFJFU1VMVCBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZUV4KFVJTlQsVUlOVCxEM0RGT1JNQVQsRDNETVVMVElTQU1QTEVfVFlQRSxEV09SRCxCT09MLElEaXJlY3QzRFN1cmZhY2U5ICoqLEhBTkRMRSAqLERXT1JEKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OlJlc2V0RXgoRDNEUFJFU0VOVF9QQVJBTUVURVJTICosRDNERElTUExBWU1PREVFWCAqKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OkdldERpc3BsYXlNb2RlRXgoVUlOVCxEM0RESVNQTEFZTU9ERUVYICosRDNERElTUExBWVJPVEFUSU9OICopCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5RXguaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5RXguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGE0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzRERldmljZTlFeC5ocHAKQEAgLTAsMCArMSwxOTYgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIEQzRDlfRGlyZWN0M0REZXZpY2U5RXhfaHBwDQorI2RlZmluZSBEM0Q5X0RpcmVjdDNERGV2aWNlOUV4X2hwcA0KKw0KKyNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIg0KKw0KKyNpbmNsdWRlICJEaXJlY3QzRDlFeC5ocHAiDQorI2luY2x1ZGUgIkRpcmVjdDNEU3dhcENoYWluOS5ocHAiDQorDQorI2luY2x1ZGUgIlN0cmVhbS5ocHAiDQorDQorI2luY2x1ZGUgPGQzZDkuaD4NCisjaW5jbHVkZSA8bWFwPg0KKyNpbmNsdWRlIDxsaXN0Pg0KKyNpbmNsdWRlIDx2ZWN0b3I+DQorDQorbmFtZXNwYWNlIHN3DQorew0KKwljbGFzcyBSZW5kZXJlcjsNCisJY2xhc3MgQ29udGV4dDsNCit9DQorDQorbmFtZXNwYWNlIEQzRDkNCit7DQorCWNsYXNzIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245Ow0KKwljbGFzcyBEaXJlY3QzRFN0YXRlQmxvY2s5Ow0KKwljbGFzcyBEaXJlY3QzRFN1cmZhY2U5Ow0KKwljbGFzcyBEaXJlY3QzRFBpeGVsU2hhZGVyOTsNCisJY2xhc3MgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5Ow0KKwljbGFzcyBpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245Ow0KKwljbGFzcyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk7DQorCWNsYXNzIERpcmVjdDNESW5kZXhCdWZmZXI5Ow0KKw0KKwljbGFzcyBEaXJlY3QzRERldmljZTlFeCA6IHB1YmxpYyBJRGlyZWN0M0REZXZpY2U5RXgsIHB1YmxpYyBEaXJlY3QzRERldmljZTkNCisJew0KKwlwdWJsaWM6DQorCQlEaXJlY3QzRERldmljZTlFeChjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UsIERpcmVjdDNEOUV4ICpkM2Q5ZXgsIHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3VyRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpOw0KKw0KKwkJdmlydHVhbCB+RGlyZWN0M0REZXZpY2U5RXgoKTsNCisNCisJCS8vIElVbmtub3duIG1ldGhvZHMNCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsNCisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOw0KKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOw0KKw0KKwkJLy8gSURpcmVjdDNERGV2aWNlOSBtZXRob2RzDQorCQlsb25nIF9fc3RkY2FsbCBUZXN0Q29vcGVyYXRpdmVMZXZlbCgpOw0KKwkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCk7DQorCQlsb25nIF9fc3RkY2FsbCBFdmljdE1hbmFnZWRSZXNvdXJjZXMoKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldERpcmVjdDNEKElEaXJlY3QzRDkgKipEM0QpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlQ2FwcyhEM0RDQVBTOSAqY2Fwcyk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXREaXNwbGF5TW9kZSh1bnNpZ25lZCBpbnQgc3dhcENoYWluICxEM0RESVNQTEFZTU9ERSAqbW9kZSk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRDcmVhdGlvblBhcmFtZXRlcnMoRDNEREVWSUNFX0NSRUFUSU9OX1BBUkFNRVRFUlMgKnBhcmFtZXRlcnMpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0Q3Vyc29yUHJvcGVydGllcyh1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHksIElEaXJlY3QzRFN1cmZhY2U5ICpjdXJzb3JCaXRtYXApOw0KKwkJdm9pZCBfX3N0ZGNhbGwgU2V0Q3Vyc29yUG9zaXRpb24oaW50IHgsIGludCB5LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsNCisJCWludCBfX3N0ZGNhbGwgU2hvd0N1cnNvcihpbnQgc2hvdyk7DQorCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRFN3YXBDaGFpbjkgKipzd2FwQ2hhaW4pOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0U3dhcENoYWluKHVuc2lnbmVkIGludCBpbmRleCwgSURpcmVjdDNEU3dhcENoYWluOSAqKnN3YXBDaGFpbik7DQorCQl1bnNpZ25lZCBpbnQgX19zdGRjYWxsIEdldE51bWJlck9mU3dhcENoYWlucygpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgUmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyk7DQorCQlsb25nIF9fc3RkY2FsbCBQcmVzZW50KGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBIV05EIGRlc3RXaW5kb3dPdmVycmlkZSwgY29uc3QgUkdOREFUQSAqZGlydHlSZWdpb24pOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0QmFja0J1ZmZlcih1bnNpZ25lZCBpbnQgc3dhcENoYWluLCB1bnNpZ25lZCBpbnQgaW5kZXgsIEQzREJBQ0tCVUZGRVJfVFlQRSB0eXBlLCBJRGlyZWN0M0RTdXJmYWNlOSAqKmJhY2tCdWZmZXIpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UmFzdGVyU3RhdHVzKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIEQzRFJBU1RFUl9TVEFUVVMgKnJhc3RlclN0YXR1cyk7DQorCQlsb25nIF9fc3RkY2FsbCBTZXREaWFsb2dCb3hNb2RlKGludCBlbmFibGVEaWFsb2dzKTsNCisJCXZvaWQgX19zdGRjYWxsIFNldEdhbW1hUmFtcCh1bnNpZ25lZCBpbnQgc3dhcENoYWluLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBEM0RHQU1NQVJBTVAgKnJhbXApOw0KKwkJdm9pZCBfX3N0ZGNhbGwgR2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIEQzREdBTU1BUkFNUCAqcmFtcCk7DQorCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RUZXh0dXJlOSAqKnRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVm9sdW1lVGV4dHVyZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBkZXB0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqKnZvbHVtZVRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlQ3ViZVRleHR1cmUodW5zaWduZWQgaW50IGVkZ2VMZW5ndGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEQ3ViZVRleHR1cmU5ICoqY3ViZVRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVmVydGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIHVuc2lnbmVkIGxvbmcgRlZGLCBEM0RQT09MLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICoqdmVydGV4QnVmZmVyLCB2b2lkICoqc2hhcmVkSGFuZGxlKTsNCisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZUluZGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNESW5kZXhCdWZmZXI5ICoqaW5kZXhCdWZmZXIsIHZvaWQgKipzaGFyZWRIYW5kbGUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlUmVuZGVyVGFyZ2V0KHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgdW5zaWduZWQgbG9uZyBtdWx0aVNhbXBsZVF1YWxpdHksIGludCBsb2NrYWJsZSwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKTsNCisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCB1bnNpZ25lZCBsb25nIG11bHRpU2FtcGxlUXVhbGl0eSwgaW50IGRpc2NhcmQsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSk7DQorCQlsb25nIF9fc3RkY2FsbCBVcGRhdGVTdXJmYWNlKElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdGluYXRpb25TdXJmYWNlLCBjb25zdCBQT0lOVCAqZGVzdFBvaW50KTsNCisJCWxvbmcgX19zdGRjYWxsIFVwZGF0ZVRleHR1cmUoSURpcmVjdDNEQmFzZVRleHR1cmU5ICpzb3VyY2VUZXh0dXJlLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKmRlc3RpbmF0aW9uVGV4dHVyZSk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRSZW5kZXJUYXJnZXREYXRhKElEaXJlY3QzRFN1cmZhY2U5ICpyZW5kZXJUYXJnZXQsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0U3VyZmFjZSk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRGcm9udEJ1ZmZlckRhdGEodW5zaWduZWQgaW50IHN3YXBDaGFpbiwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlKTsNCisJCWxvbmcgX19zdGRjYWxsIFN0cmV0Y2hSZWN0KElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ29sb3JGaWxsKElEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlLCBjb25zdCBSRUNUICpyZWN0LCBEM0RDT0xPUiBjb2xvcik7DQorCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVPZmZzY3JlZW5QbGFpblN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSk7DQorCQlsb25nIF9fc3RkY2FsbCBTZXRSZW5kZXJUYXJnZXQodW5zaWduZWQgbG9uZyBpbmRleCwgSURpcmVjdDNEU3VyZmFjZTkgKnJlbmRlclRhcmdldCk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRSZW5kZXJUYXJnZXQodW5zaWduZWQgbG9uZyBpbmRleCwgSURpcmVjdDNEU3VyZmFjZTkgKipyZW5kZXJUYXJnZXQpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0RGVwdGhTdGVuY2lsU3VyZmFjZShJRGlyZWN0M0RTdXJmYWNlOSAqbmV3RGVwdGhTdGVuY2lsKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKipkZXB0aFN0ZW5jaWxTdXJmYWNlKTsNCisJCWxvbmcgX19zdGRjYWxsIEJlZ2luU2NlbmUoKTsNCisJCWxvbmcgX19zdGRjYWxsIEVuZFNjZW5lKCk7DQorCQlsb25nIF9fc3RkY2FsbCBDbGVhcih1bnNpZ25lZCBsb25nIENvdW50LCBjb25zdCBEM0RSRUNUICpyZWN0cywgdW5zaWduZWQgbG9uZyBGbGFncywgdW5zaWduZWQgbG9uZyBDb2xvciwgZmxvYXQgWiwgdW5zaWduZWQgbG9uZyBTdGVuY2lsKTsNCisJCWxvbmcgX19zdGRjYWxsIFNldFRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4KTsNCisJCWxvbmcgX19zdGRjYWxsIEdldFRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIEQzRE1BVFJJWCAqbWF0cml4KTsNCisJCWxvbmcgX19zdGRjYWxsIE11bHRpcGx5VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRWaWV3cG9ydChEM0RWSUVXUE9SVDkgKnZpZXdwb3J0KTsNCisJCWxvbmcgX19zdGRjYWxsIFNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0TWF0ZXJpYWwoRDNETUFURVJJQUw5ICptYXRlcmlhbCk7DQorCQlsb25nIF9fc3RkY2FsbCBTZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBEM0RMSUdIVDkgKmxpZ2h0KTsNCisJCWxvbmcgX19zdGRjYWxsIEdldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRExJR0hUOSAqbGlnaHQpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgTGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCwgaW50IGVuYWJsZSk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4ICwgaW50ICplbmFibGUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IGZsb2F0ICpwbGFuZSk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRDbGlwUGxhbmUodW5zaWduZWQgbG9uZyBpbmRleCwgZmxvYXQgKnBsYW5lKTsNCisJCWxvbmcgX19zdGRjYWxsIFNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgU3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKTsNCisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZVN0YXRlQmxvY2soRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSwgSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKTsNCisJCWxvbmcgX19zdGRjYWxsIEJlZ2luU3RhdGVCbG9jaygpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgRW5kU3RhdGVCbG9jayhJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqKnN0YXRlQmxvY2spOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0Q2xpcFN0YXR1cyhjb25zdCBEM0RDTElQU1RBVFVTOSAqY2xpcFN0YXR1cyk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRDbGlwU3RhdHVzKEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldFRleHR1cmUodW5zaWduZWQgbG9uZyBzYW1wbGVyLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKip0ZXh0dXJlKTsNCisJCWxvbmcgX19zdGRjYWxsIFNldFRleHR1cmUodW5zaWduZWQgbG9uZyBzYW1wbGVyLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0VGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKTsNCisJCWxvbmcgX19zdGRjYWxsIFNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldFNhbXBsZXJTdGF0ZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKTsNCisJCWxvbmcgX19zdGRjYWxsIFNldFNhbXBsZXJTdGF0ZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgVmFsaWRhdGVEZXZpY2UodW5zaWduZWQgbG9uZyAqbnVtUGFzc2VzKTsNCisJCWxvbmcgX19zdGRjYWxsIFNldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBjb25zdCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UGFsZXR0ZUVudHJpZXModW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIsIFBBTEVUVEVFTlRSWSAqZW50cmllcyk7DQorCQlsb25nIF9fc3RkY2FsbCBTZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCAqcGFsZXR0ZU51bWJlcik7DQorCQlsb25nIF9fc3RkY2FsbCBTZXRTY2lzc29yUmVjdChjb25zdCBSRUNUICpyZWN0KTsNCisJCWxvbmcgX19zdGRjYWxsIEdldFNjaXNzb3JSZWN0KFJFQ1QgKnJlY3QpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0U29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nKGludCBzb2Z0d2FyZSk7DQorCQlpbnQgX19zdGRjYWxsIEdldFNvZnR3YXJlVmVydGV4UHJvY2Vzc2luZygpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0TlBhdGNoTW9kZShmbG9hdCBzZWdtZW50cyk7DQorCQlmbG9hdCBfX3N0ZGNhbGwgR2V0TlBhdGNoTW9kZSgpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgRHJhd1ByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBzdGFydFZlcnRleCwgdW5zaWduZWQgaW50IHByaW1pdmVDb3VudCk7DQorCQlsb25nIF9fc3RkY2FsbCBEcmF3SW5kZXhlZFByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHR5cGUsIGludCBiYXNlVmVydGV4SW5kZXgsIHVuc2lnbmVkIGludCBtaW5JbmRleCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzLCB1bnNpZ25lZCBpbnQgc3RhcnRJbmRleCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50KTsNCisJCWxvbmcgX19zdGRjYWxsIERyYXdQcmltaXRpdmVVUChEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsNCisJCWxvbmcgX19zdGRjYWxsIERyYXdJbmRleGVkUHJpbWl0aXZlVVAoRDNEUFJJTUlUSVZFVFlQRSB0eXBlLCB1bnNpZ25lZCBpbnQgbWluVmVydGV4SW5kZXgsIHVuc2lnbmVkIGludCBudW1WZXJ0ZXhJbmRpY2VzLCB1bnNpZ25lZCBpbnQgUHJpbWl0aXZlQ291bnQsIGNvbnN0IHZvaWQgKmluZGV4RGF0YSwgRDNERk9STUFUIGluZGV4RGF0YUZvcm1hdCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCBWZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsNCisJCWxvbmcgX19zdGRjYWxsIFByb2Nlc3NWZXJ0aWNlcyh1bnNpZ25lZCBpbnQgc3JjU3RhcnRJbmRleCwgdW5zaWduZWQgaW50IGRlc3RJbmRleCwgdW5zaWduZWQgaW50IHZlcnRleENvdW50LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkZXN0QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsNCisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZVZlcnRleERlY2xhcmF0aW9uKGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5ICp2ZXJ0ZXhFbGVtZW50cywgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICoqZGVjbGFyYXRpb24pOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0VmVydGV4RGVjbGFyYXRpb24oSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsYXJhdGlvbik7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKipkZWNsYXJhdGlvbik7DQorCQlsb25nIF9fc3RkY2FsbCBTZXRGVkYodW5zaWduZWQgbG9uZyBGVkYpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RlZGKHVuc2lnbmVkIGxvbmcgKkZWRik7DQorCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0VmVydGV4U2hhZGVyKElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnNoYWRlcik7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXIoSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqKnNoYWRlcik7DQorCQlsb25nIF9fc3RkY2FsbCBTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7DQorCQlsb25nIF9fc3RkY2FsbCBTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsNCisJCWxvbmcgX19zdGRjYWxsIFNldFZlcnRleFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW0sIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzdHJpZGUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKipzdHJlYW1EYXRhLCB1bnNpZ25lZCBpbnQgKm9mZnNldCwgdW5zaWduZWQgaW50ICpzdHJpZGUpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0U3RyZWFtU291cmNlRnJlcSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCB1bnNpZ25lZCBpbnQgZGl2aWRlcik7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRTdHJlYW1Tb3VyY2VGcmVxKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIHVuc2lnbmVkIGludCAqZGl2aWRlcik7DQorCQlsb25nIF9fc3RkY2FsbCBTZXRJbmRpY2VzKElEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhEYXRhKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI5ICoqaW5kZXhEYXRhKTsNCisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZVBpeGVsU2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKipzaGFkZXIpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0UGl4ZWxTaGFkZXIoSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpzaGFkZXIpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UGl4ZWxTaGFkZXIoSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICoqc2hhZGVyKTsNCisJCWxvbmcgX19zdGRjYWxsIFNldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsNCisJCWxvbmcgX19zdGRjYWxsIEdldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsNCisJCWxvbmcgX19zdGRjYWxsIFNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UGl4ZWxTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7DQorCQlsb25nIF9fc3RkY2FsbCBTZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7DQorCQlsb25nIF9fc3RkY2FsbCBEcmF3UmVjdFBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUsIGNvbnN0IGZsb2F0ICpudW1TZWdzLCBjb25zdCBEM0RSRUNUUEFUQ0hfSU5GTyAqcmVjdFBhdGNoSW5mbyk7DQorCQlsb25nIF9fc3RkY2FsbCBEcmF3VHJpUGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFRSSVBBVENIX0lORk8gKnRyaVBhdGNoSW5mbyk7DQorCQlsb25nIF9fc3RkY2FsbCBEZWxldGVQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlKTsNCisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZVF1ZXJ5KEQzRFFVRVJZVFlQRSB0eXBlLCBJRGlyZWN0M0RRdWVyeTkgKipxdWVyeSk7DQorCQkNCisJCS8vIElEaXJlY3QzRERldmljZTlFeCBtZXRob2RzDQorCQlsb25nIF9fc3RkY2FsbCBTZXRDb252b2x1dGlvbk1vbm9LZXJuZWwoVUlOVCxVSU5ULGZsb2F0ICosZmxvYXQgKik7DQorCQlsb25nIF9fc3RkY2FsbCBDb21wb3NlUmVjdHMoSURpcmVjdDNEU3VyZmFjZTkgKixJRGlyZWN0M0RTdXJmYWNlOSAqLElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKixVSU5ULElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKixEM0RDT01QT1NFUkVDVFNPUCxpbnQsaW50KTsNCisJCWxvbmcgX19zdGRjYWxsIFByZXNlbnRFeChjb25zdCBSRUNUICosY29uc3QgUkVDVCAqLEhXTkQsY29uc3QgUkdOREFUQSAqLERXT1JEKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldEdQVVRocmVhZFByaW9yaXR5KGludCAqcHJpb3JpdHkpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0R1BVVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsNCisJCWxvbmcgX19zdGRjYWxsIFdhaXRGb3JWQmxhbmsodW5zaWduZWQgaW50IHN3YXBDaGFpbik7DQorCQlsb25nIF9fc3RkY2FsbCBDaGVja1Jlc291cmNlUmVzaWRlbmN5KElEaXJlY3QzRFJlc291cmNlOSAqKnJlc291cmNlQXJyYXksIHVuc2lnbmVkIGludCBudW1SZXNvdXJjZXMpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgU2V0TWF4aW11bUZyYW1lTGF0ZW5jeSh1bnNpZ25lZCBpbnQgbWF4TGF0ZW5jeSk7DQorCQlsb25nIF9fc3RkY2FsbCBHZXRNYXhpbXVtRnJhbWVMYXRlbmN5KHVuc2lnbmVkIGludCAqbWF4TGF0ZW5jeSk7DQorCQlsb25nIF9fc3RkY2FsbCBDaGVja0RldmljZVN0YXRlKEhXTkQgZGVzdGluYXRpb25XaW5kb3cpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlUmVuZGVyVGFyZ2V0RXgodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlVHlwZSwgdW5zaWduZWQgbG9uZyBtdWx0aVNhbXBsZVF1YWxpdHksIGludCBsb2NrYWJsZSwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlLCB1bnNpZ25lZCBsb25nIHVzYWdlKTsNCisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZUV4KHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnN1cmZhY2UsIHZvaWQgKipzaGFyZWRIYW5kbGUsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpOw0KKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZUV4KHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5LCBpbnQgZGlzY2FyZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlLCB1bnNpZ25lZCBsb25nIHVzYWdlKTsNCisJCWxvbmcgX19zdGRjYWxsIFJlc2V0RXgoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgRDNERElTUExBWU1PREVFWCAqZnVsbHNjcmVlbkRpc3BsYXlNb2RlKTsNCisJCWxvbmcgX19zdGRjYWxsIEdldERpc3BsYXlNb2RlRXgodW5zaWduZWQgaW50IHN3YXBDaGFpbiwgRDNERElTUExBWU1PREVFWCAqbW9kZSwgRDNERElTUExBWVJPVEFUSU9OICpyb3RhdGlvbik7DQorDQorCXByaXZhdGU6DQorCQlEaXJlY3QzRDlFeCAqY29uc3QgZDNkOWV4Ow0KKwl9Ow0KK30NCisNCisjZW5kaWYgLy8gRDNEOV9EaXJlY3QzRERldmljZTlFeF9ocHANCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzREluZGV4QnVmZmVyOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzREluZGV4QnVmZmVyOS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhOTU0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNESW5kZXhCdWZmZXI5LmNwcApAQCAtMCwwICsxLDIzNCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiRGlyZWN0M0RJbmRleEJ1ZmZlcjkuaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U5LmhwcCIKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OkRpcmVjdDNESW5kZXhCdWZmZXI5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpIDogRGlyZWN0M0RSZXNvdXJjZTkoZGV2aWNlLCBEM0RSVFlQRV9JTkRFWEJVRkZFUiwgcG9vbCwgbGVuZ3RoKSwgbGVuZ3RoKGxlbmd0aCksIHVzYWdlKHVzYWdlKSwgZm9ybWF0KGZvcm1hdCkKKwl7CisJCWluZGV4QnVmZmVyID0gbmV3IHN3OjpSZXNvdXJjZShsZW5ndGggKyAxNik7CisJCWxvY2tDb3VudCA9IDA7CisJfQorCisJRGlyZWN0M0RJbmRleEJ1ZmZlcjk6On5EaXJlY3QzREluZGV4QnVmZmVyOSgpCisJeworCQlpbmRleEJ1ZmZlci0+ZGVzdHJ1Y3QoKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI5OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzREluZGV4QnVmZmVyOSB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOSB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpBZGRSZWYoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNESW5kZXhCdWZmZXI5OjpSZWxlYXNlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI5OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI5OjpHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSk7CisJfQorCisJdm9pZCBEaXJlY3QzREluZGV4QnVmZmVyOTo6UHJlTG9hZCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJRGlyZWN0M0RSZXNvdXJjZTk6OlByZUxvYWQoKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI5OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyOTo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcy0+ZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpHZXREZXZpY2UoZGV2aWNlKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNESW5kZXhCdWZmZXI5OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6U2V0UHJpb3JpdHkobmV3UHJpb3JpdHkpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OkdldFByaW9yaXR5KCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaW9yaXR5KCk7CisJfQorCisJRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNESW5kZXhCdWZmZXI5OjpHZXRUeXBlKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldFR5cGUoKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI5OjpHZXREZXNjKEQzRElOREVYQlVGRkVSX0RFU0MgKmRlc2NyaXB0aW9uKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXNjcmlwdGlvbikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlkZXNjcmlwdGlvbi0+Rm9ybWF0ID0gZm9ybWF0OworCQlkZXNjcmlwdGlvbi0+UG9vbCA9IHBvb2w7CisJCWRlc2NyaXB0aW9uLT5TaXplID0gbGVuZ3RoOworCQlkZXNjcmlwdGlvbi0+VHlwZSA9IEdldFR5cGUoKTsKKwkJZGVzY3JpcHRpb24tPlVzYWdlID0gdXNhZ2U7CisKKwkJcmV0dXJuIDA7CisJfQorCisJbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyOTo6TG9jayh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqKmRhdGEsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYob2Zmc2V0ID09IDAgJiYgc2l6ZSA9PSAwKSAgIC8vIExvY2sgd2hvbGUgYnVmZmVyCisJCXsKKwkJCXNpemUgPSBsZW5ndGg7CisJCX0KKworCQlpZighZGF0YSB8fCBvZmZzZXQgPiBsZW5ndGggfHwgb2Zmc2V0ICsgc2l6ZSA+IGxlbmd0aCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQl2b2lkICpidWZmZXI7CisKKwkJaWYoZmxhZ3MgJiBEM0RMT0NLX0RJU0NBUkQvKiAmJiB1c2FnZSAmIEQzRFVTQUdFX0RZTkFNSUMqLykKKwkJeworCQkJaW5kZXhCdWZmZXItPmRlc3RydWN0KCk7CisJCQlpbmRleEJ1ZmZlciA9IG5ldyBzdzo6UmVzb3VyY2UobGVuZ3RoICsgMTYpOworCisJCQlidWZmZXIgPSAodm9pZCopaW5kZXhCdWZmZXItPmdldEJ1ZmZlcigpOworCQl9CisJCWVsc2UgaWYoZmxhZ3MgJiBEM0RMT0NLX05PT1ZFUldSSVRFLyogJiYgdXNhZ2UgJiBEM0RVU0FHRV9EWU5BTUlDKi8pCisJCXsKKwkJCWJ1ZmZlciA9ICh2b2lkKilpbmRleEJ1ZmZlci0+Z2V0QnVmZmVyKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlidWZmZXIgPSBpbmRleEJ1ZmZlci0+bG9jayhzdzo6UFVCTElDKTsKKwkJCWxvY2tDb3VudCsrOworCQl9CisKKwkJKmRhdGEgPSAodW5zaWduZWQgY2hhciopYnVmZmVyICsgb2Zmc2V0OworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyOTo6VW5sb2NrKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZihsb2NrQ291bnQgPiAwKQorCQl7CisJCQlpbmRleEJ1ZmZlci0+dW5sb2NrKCk7CisJCQlsb2NrQ291bnQtLTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJc3c6OlJlc291cmNlICpEaXJlY3QzREluZGV4QnVmZmVyOTo6Z2V0UmVzb3VyY2UoKSBjb25zdAorCXsJCisJCXJldHVybiBpbmRleEJ1ZmZlcjsKKwl9CisKKwlib29sIERpcmVjdDNESW5kZXhCdWZmZXI5OjppczMyQml0KCkgY29uc3QKKwl7CisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJY2FzZSBEM0RGTVRfSU5ERVgxNjoKKwkJCXJldHVybiBmYWxzZTsKKwkJY2FzZSBEM0RGTVRfSU5ERVgzMjoKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzREluZGV4QnVmZmVyOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzREluZGV4QnVmZmVyOS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxMDhhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNESW5kZXhCdWZmZXI5LmhwcApAQCAtMCwwICsxLDY4IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgRDNEOV9EaXJlY3QzREluZGV4QnVmZmVyOV9ocHAKKyNkZWZpbmUgRDNEOV9EaXJlY3QzREluZGV4QnVmZmVyOV9ocHAKKworI2luY2x1ZGUgIkRpcmVjdDNEUmVzb3VyY2U5LmhwcCIKKworI2luY2x1ZGUgPGQzZDkuaD4KKworbmFtZXNwYWNlIHN3Cit7CisJY2xhc3MgUmVzb3VyY2U7Cit9CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJY2xhc3MgRGlyZWN0M0RJbmRleEJ1ZmZlcjkgOiBwdWJsaWMgSURpcmVjdDNESW5kZXhCdWZmZXI5LCBwdWJsaWMgRGlyZWN0M0RSZXNvdXJjZTkKKwl7CisJcHVibGljOgorCQlEaXJlY3QzREluZGV4QnVmZmVyOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgdW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzREluZGV4QnVmZmVyOSgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIElEaXJlY3QzRFJlc291cmNlOSBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CisJCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKTsKKwkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCk7CisKKwkJLy8gSURpcmVjdDNESW5kZXhCdWZmZXI5IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGVzYyhEM0RJTkRFWEJVRkZFUl9ERVNDICpkZXNjcmlwdGlvbik7CisJCWxvbmcgX19zdGRjYWxsIExvY2sodW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKipkYXRhLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrKCk7CisJCQorCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCXN3OjpSZXNvdXJjZSAqZ2V0UmVzb3VyY2UoKSBjb25zdDsKKwkJYm9vbCBpczMyQml0KCkgY29uc3Q7CisKKwlwcml2YXRlOgorCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCWNvbnN0IHVuc2lnbmVkIGludCBsZW5ndGg7CisJCWNvbnN0IGxvbmcgdXNhZ2U7CisJCWNvbnN0IEQzREZPUk1BVCBmb3JtYXQ7CisKKwkJc3c6OlJlc291cmNlICppbmRleEJ1ZmZlcjsKKwkJaW50IGxvY2tDb3VudDsKKwl9OworfQorCisjZW5kaWYgLy8gRDNEOV9EaXJlY3QzREluZGV4QnVmZmVyOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEUGl4ZWxTaGFkZXI5LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEUGl4ZWxTaGFkZXI5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTFiOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RQaXhlbFNoYWRlcjkuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNEUGl4ZWxTaGFkZXI5LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCituYW1lc3BhY2UgRDNEOQoreworCURpcmVjdDNEUGl4ZWxTaGFkZXI5OjpEaXJlY3QzRFBpeGVsU2hhZGVyOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyAqc2hhZGVyVG9rZW4pIDogZGV2aWNlKGRldmljZSksIHBpeGVsU2hhZGVyKHNoYWRlclRva2VuKQorCXsKKwl9CisKKwlEaXJlY3QzRFBpeGVsU2hhZGVyOTo6fkRpcmVjdDNEUGl4ZWxTaGFkZXI5KCkKKwl7CisJfQorCisJbG9uZyBEaXJlY3QzRFBpeGVsU2hhZGVyOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RQaXhlbFNoYWRlcjkgfHwKKwkJICAgaWlkID09IElJRF9JVW5rbm93bikKKwkJeworCQkJQWRkUmVmKCk7CisJCQkqb2JqZWN0ID0gdGhpczsKKworCQkJcmV0dXJuIFNfT0s7CisJCX0KKworCQkqb2JqZWN0ID0gMDsKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEUGl4ZWxTaGFkZXI5OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKKwl9CisJCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFBpeGVsU2hhZGVyOTo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEUGl4ZWxTaGFkZXI5OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzLT5kZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighZGV2aWNlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXRoaXMtPmRldmljZS0+QWRkUmVmKCk7CisJCSpkZXZpY2UgPSB0aGlzLT5kZXZpY2U7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEUGl4ZWxTaGFkZXI5OjpHZXRGdW5jdGlvbih2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgKnNpemUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoIXNpemUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcGl4ZWxTaGFkZXIuZ2V0RnVuY3Rpb24oZGF0YSwgc2l6ZSk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwljb25zdCBzdzo6UGl4ZWxTaGFkZXIgKkRpcmVjdDNEUGl4ZWxTaGFkZXI5OjpnZXRQaXhlbFNoYWRlcigpIGNvbnN0CisJeworCQlyZXR1cm4gJnBpeGVsU2hhZGVyOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEUGl4ZWxTaGFkZXI5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEUGl4ZWxTaGFkZXI5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Y1MTFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RQaXhlbFNoYWRlcjkuaHBwCkBAIC0wLDAgKzEsNTIgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBEM0Q5X0RpcmVjdDNEUGl4ZWxTaGFkZXI5X2hwcAorI2RlZmluZSBEM0Q5X0RpcmVjdDNEUGl4ZWxTaGFkZXI5X2hwcAorCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlICJQaXhlbFNoYWRlci5ocHAiCisKKyNpbmNsdWRlIDxkM2Q5Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJY2xhc3MgRGlyZWN0M0REZXZpY2U5OworCisJY2xhc3MgRGlyZWN0M0RQaXhlbFNoYWRlcjkgOiBwdWJsaWMgSURpcmVjdDNEUGl4ZWxTaGFkZXI5LCBwdWJsaWMgVW5rbm93bgorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEUGl4ZWxTaGFkZXI5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nICpzaGFkZXJUb2tlbik7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RQaXhlbFNoYWRlcjkoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldEZ1bmN0aW9uKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCAqc2l6ZSk7CisKKwkJLy8gSW50ZXJuYWwgbWV0aG9kcworCQljb25zdCBzdzo6UGl4ZWxTaGFkZXIgKmdldFBpeGVsU2hhZGVyKCkgY29uc3Q7CisKKwlwcml2YXRlOgorCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCURpcmVjdDNERGV2aWNlOSAqY29uc3QgZGV2aWNlOworCisJCXN3OjpQaXhlbFNoYWRlciBwaXhlbFNoYWRlcjsKKwl9OworfQorCisjZW5kaWYgICAvLyBEM0Q5X0RpcmVjdDNEUGl4ZWxTaGFkZXI5X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RRdWVyeTkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0RRdWVyeTkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjQzMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzRFF1ZXJ5OS5jcHAKQEAgLTAsMCArMSwyNDMgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNEUXVlcnk5LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCisjaW5jbHVkZSAiVGltZXIuaHBwIgorI2luY2x1ZGUgIlJlbmRlcmVyLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIEQzRDkKK3sKKwlEaXJlY3QzRFF1ZXJ5OTo6RGlyZWN0M0RRdWVyeTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFFVRVJZVFlQRSB0eXBlKSA6IGRldmljZShkZXZpY2UpLCB0eXBlKHR5cGUpCisJeworCQlpZih0eXBlID09IEQzRFFVRVJZVFlQRV9PQ0NMVVNJT04pCisJCXsKKwkJCXF1ZXJ5ID0gbmV3IHN3OjpRdWVyeSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJcXVlcnkgPSAwOworCQl9CisJfQorCisJRGlyZWN0M0RRdWVyeTk6On5EaXJlY3QzRFF1ZXJ5OSgpCisJeworCQlpZihxdWVyeSkKKwkJeworCQkJZGV2aWNlLT5yZW1vdmVRdWVyeShxdWVyeSk7CisKKwkJCWRlbGV0ZSBxdWVyeTsKKwkJfQorCX0KKworCWxvbmcgRGlyZWN0M0RRdWVyeTk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEUXVlcnk5IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFF1ZXJ5OTo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7CisJfQorCQorCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RRdWVyeTk6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBfX3N0ZGNhbGwgRGlyZWN0M0RRdWVyeTk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXZpY2UpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdGhpcy0+ZGV2aWNlLT5BZGRSZWYoKTsKKwkJKmRldmljZSA9IHRoaXMtPmRldmljZTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCUQzRFFVRVJZVFlQRSBEaXJlY3QzRFF1ZXJ5OTo6R2V0VHlwZSgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEUXVlcnk5OjpHZXREYXRhU2l6ZSgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJc3dpdGNoKHR5cGUpCisJCXsKKwkJY2FzZSBEM0RRVUVSWVRZUEVfVkNBQ0hFOgkJCQlyZXR1cm4gc2l6ZW9mKEQzRERFVklORk9fVkNBQ0hFKTsKKwkJY2FzZSBEM0RRVUVSWVRZUEVfUkVTT1VSQ0VNQU5BR0VSOgkJcmV0dXJuIHNpemVvZihEM0RERVZJTkZPX1JFU09VUkNFTUFOQUdFUik7CisJCWNhc2UgRDNEUVVFUllUWVBFX1ZFUlRFWFNUQVRTOgkJCXJldHVybiBzaXplb2YoRDNEREVWSU5GT19EM0RWRVJURVhTVEFUUyk7CisJCWNhc2UgRDNEUVVFUllUWVBFX0VWRU5UOgkJCQlyZXR1cm4gc2l6ZW9mKEJPT0wpOworCQljYXNlIEQzRFFVRVJZVFlQRV9PQ0NMVVNJT046CQkJcmV0dXJuIHNpemVvZihEV09SRCk7CisJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUDoJCQlyZXR1cm4gc2l6ZW9mKFVJTlQ2NCk7CisJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUERJU0pPSU5UOglyZXR1cm4gc2l6ZW9mKEJPT0wpOworCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVBGUkVROgkJcmV0dXJuIHNpemVvZihVSU5UNjQpOworCQljYXNlIEQzRFFVRVJZVFlQRV9QSVBFTElORVRJTUlOR1M6CQlyZXR1cm4gc2l6ZW9mKEQzRERFVklORk9fRDNEOVBJUEVMSU5FVElNSU5HUyk7CisJCWNhc2UgRDNEUVVFUllUWVBFX0lOVEVSRkFDRVRJTUlOR1M6CQlyZXR1cm4gc2l6ZW9mKEQzRERFVklORk9fRDNEOUlOVEVSRkFDRVRJTUlOR1MpOworCQljYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhUSU1JTkdTOgkJcmV0dXJuIHNpemVvZihEM0RERVZJTkZPX0QzRDlTVEFHRVRJTUlOR1MpOworCQljYXNlIEQzRFFVRVJZVFlQRV9QSVhFTFRJTUlOR1M6CQkJcmV0dXJuIHNpemVvZihEM0RERVZJTkZPX0QzRDlQSVBFTElORVRJTUlOR1MpOworCQljYXNlIEQzRFFVRVJZVFlQRV9CQU5EV0lEVEhUSU1JTkdTOgkJcmV0dXJuIHNpemVvZihEM0RERVZJTkZPX0QzRDlCQU5EV0lEVEhUSU1JTkdTKTsKKwkJY2FzZSBEM0RRVUVSWVRZUEVfQ0FDSEVVVElMSVpBVElPTjoJCXJldHVybiBzaXplb2YoRDNEREVWSU5GT19EM0Q5Q0FDSEVVVElMSVpBVElPTik7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEUXVlcnk5OjpJc3N1ZSh1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKGZsYWdzICE9IEQzRElTU1VFX0JFR0lOICYmIGZsYWdzICE9IEQzRElTU1VFX0VORCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlzd2l0Y2godHlwZSkKKwkJeworCQljYXNlIEQzRFFVRVJZVFlQRV9WQ0FDSEU6CQkJCWlmKGZsYWdzICE9IEQzRElTU1VFX0VORCkgcmV0dXJuIElOVkFMSURDQUxMKCk7IGJyZWFrOworCQljYXNlIEQzRFFVRVJZVFlQRV9SRVNPVVJDRU1BTkFHRVI6CQlpZihmbGFncyAhPSBEM0RJU1NVRV9FTkQpIHJldHVybiBJTlZBTElEQ0FMTCgpOyBicmVhazsKKwkJY2FzZSBEM0RRVUVSWVRZUEVfVkVSVEVYU1RBVFM6CQkJaWYoZmxhZ3MgIT0gRDNESVNTVUVfRU5EKSByZXR1cm4gSU5WQUxJRENBTEwoKTsgYnJlYWs7CisJCWNhc2UgRDNEUVVFUllUWVBFX0VWRU5UOgorCQkJaWYoZmxhZ3MgPT0gRDNESVNTVUVfRU5EKQorCQkJeworCQkJLy8JZGV2aWNlLT5yZW5kZXJlci0+c3luY2hyb25pemUoKTsgICAvLyBGSVhNRQorCQkJfQorCQkJZWxzZSByZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJCWJyZWFrOworCQljYXNlIEQzRFFVRVJZVFlQRV9PQ0NMVVNJT046CisJCQlpZihmbGFncyA9PSBEM0RJU1NVRV9CRUdJTikKKwkJCXsKKwkJCQlxdWVyeS0+YmVnaW4oKTsKKwkJCQlkZXZpY2UtPmFkZFF1ZXJ5KHF1ZXJ5KTsKKwkJCQlkZXZpY2UtPnNldE9jY2x1c2lvbkVuYWJsZWQodHJ1ZSk7CisJCQl9CisJCQllbHNlICAgLy8gZmxhZ3MgPT0gRDNESVNTVUVfRU5ECisJCQl7CisJCQkJcXVlcnktPmVuZCgpOworCQkJCWRldmljZS0+cmVtb3ZlUXVlcnkocXVlcnkpOworCQkJCWRldmljZS0+c2V0T2NjbHVzaW9uRW5hYmxlZChmYWxzZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBEM0RRVUVSWVRZUEVfVElNRVNUQU1QOgkJCWlmKGZsYWdzICE9IEQzRElTU1VFX0VORCkgcmV0dXJuIElOVkFMSURDQUxMKCk7IGJyZWFrOworCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVBESVNKT0lOVDoJaWYoZmxhZ3MgIT0gRDNESVNTVUVfQkVHSU4gJiYgZmxhZ3MgIT0gRDNESVNTVUVfRU5EKSByZXR1cm4gSU5WQUxJRENBTEwoKTsgYnJlYWs7CisJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUEZSRVE6CQlpZihmbGFncyAhPSBEM0RJU1NVRV9FTkQpIHJldHVybiBJTlZBTElEQ0FMTCgpOyBicmVhazsKKwkJY2FzZSBEM0RRVUVSWVRZUEVfUElQRUxJTkVUSU1JTkdTOgkJaWYoZmxhZ3MgIT0gRDNESVNTVUVfQkVHSU4gJiYgZmxhZ3MgIT0gRDNESVNTVUVfRU5EKSByZXR1cm4gSU5WQUxJRENBTEwoKTsgYnJlYWs7CisJCWNhc2UgRDNEUVVFUllUWVBFX0lOVEVSRkFDRVRJTUlOR1M6CQlpZihmbGFncyAhPSBEM0RJU1NVRV9CRUdJTiAmJiBmbGFncyAhPSBEM0RJU1NVRV9FTkQpIHJldHVybiBJTlZBTElEQ0FMTCgpOyBicmVhazsKKwkJY2FzZSBEM0RRVUVSWVRZUEVfVkVSVEVYVElNSU5HUzoJCWlmKGZsYWdzICE9IEQzRElTU1VFX0JFR0lOICYmIGZsYWdzICE9IEQzRElTU1VFX0VORCkgcmV0dXJuIElOVkFMSURDQUxMKCk7IGJyZWFrOworCQljYXNlIEQzRFFVRVJZVFlQRV9QSVhFTFRJTUlOR1M6CQkJaWYoZmxhZ3MgIT0gRDNESVNTVUVfQkVHSU4gJiYgZmxhZ3MgIT0gRDNESVNTVUVfRU5EKSByZXR1cm4gSU5WQUxJRENBTEwoKTsgYnJlYWs7CisJCWNhc2UgRDNEUVVFUllUWVBFX0JBTkRXSURUSFRJTUlOR1M6CQlpZihmbGFncyAhPSBEM0RJU1NVRV9CRUdJTiAmJiBmbGFncyAhPSBEM0RJU1NVRV9FTkQpIHJldHVybiBJTlZBTElEQ0FMTCgpOyBicmVhazsKKwkJY2FzZSBEM0RRVUVSWVRZUEVfQ0FDSEVVVElMSVpBVElPTjoJCWlmKGZsYWdzICE9IEQzRElTU1VFX0JFR0lOICYmIGZsYWdzICE9IEQzRElTU1VFX0VORCkgcmV0dXJuIElOVkFMSURDQUxMKCk7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFF1ZXJ5OTo6R2V0RGF0YSh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgidm9pZCAqZGF0YSA9ICVwLCB1bnNpZ25lZCBsb25nIHNpemUgPSAlZCwgdW5zaWduZWQgbG9uZyBmbGFncyA9ICVkIiwgZGF0YSwgc2l6ZSwgZmxhZ3MpOworCisJCWlmKHF1ZXJ5ICYmIHF1ZXJ5LT5idWlsZGluZykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlib29sIHNpZ25hbGVkID0gIXF1ZXJ5IHx8IHF1ZXJ5LT5yZWZlcmVuY2UgPT0gMDsgCisKKwkJaWYoc2l6ZSAmJiBzaWduYWxlZCkKKwkJeworCQkJaWYoIWRhdGEpCisJCQl7CisJCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCQl9CisKKwkJCS8vIEZJWE1FOiBDaGVjayBzaXplCisKKwkJCXN3aXRjaCh0eXBlKQorCQkJeworCQkJY2FzZSBEM0RRVUVSWVRZUEVfVkNBQ0hFOgorCQkJCXsKKwkJCQkJRDNEREVWSU5GT19WQ0FDSEUgdmNhY2hlOworCisJCQkJCXZjYWNoZS5QYXR0ZXJuID0gJ0NBQ0gnOworCQkJCQl2Y2FjaGUuT3B0TWV0aG9kID0gMTsgICAvLyBWZXJ0ZXgtY2FjaGUgYmFzZWQgb3B0aW1pemF0aW9uCisJCQkJCXZjYWNoZS5DYWNoZVNpemUgPSAxNjsKKwkJCQkJdmNhY2hlLk1hZ2ljTnVtYmVyID0gODsKKworCQkJCQkqKEQzRERFVklORk9fVkNBQ0hFKilkYXRhID0gdmNhY2hlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1JFU09VUkNFTUFOQUdFUjoJCVVOSU1QTEVNRU5URUQoKTsgYnJlYWs7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhTVEFUUzoJCQlVTklNUExFTUVOVEVEKCk7IGJyZWFrOworCQkJY2FzZSBEM0RRVUVSWVRZUEVfRVZFTlQ6CQkJCSooQk9PTCopZGF0YSA9IFRSVUU7IGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUKKwkJCWNhc2UgRDNEUVVFUllUWVBFX09DQ0xVU0lPTjoKKwkJCQkqKERXT1JEKilkYXRhID0gcXVlcnktPmRhdGE7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVA6CQkJKihVSU5UNjQqKWRhdGEgPSBzdzo6VGltZXI6OmNvdW50ZXIoKTsgYnJlYWs7ICAgICAvLyBGSVhNRTogVmVyaWZ5IGJlaGF2aW91cgorCQkJY2FzZSBEM0RRVUVSWVRZUEVfVElNRVNUQU1QRElTSk9JTlQ6CSooQk9PTCopZGF0YSA9IEZBTFNFOyBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFZlcmlmeSBiZWhhdmlvdXIKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUEZSRVE6CQkqKFVJTlQ2NCopZGF0YSA9IHN3OjpUaW1lcjo6ZnJlcXVlbmN5KCk7IGJyZWFrOyAgIC8vIEZJWE1FOiBWZXJpZnkgYmVoYXZpb3VyCisJCQljYXNlIEQzRFFVRVJZVFlQRV9QSVBFTElORVRJTUlOR1M6CQlVTklNUExFTUVOVEVEKCk7IGJyZWFrOworCQkJY2FzZSBEM0RRVUVSWVRZUEVfSU5URVJGQUNFVElNSU5HUzoJCVVOSU1QTEVNRU5URUQoKTsgYnJlYWs7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhUSU1JTkdTOgkJVU5JTVBMRU1FTlRFRCgpOyBicmVhazsKKwkJCWNhc2UgRDNEUVVFUllUWVBFX1BJWEVMVElNSU5HUzoJCQlVTklNUExFTUVOVEVEKCk7IGJyZWFrOworCQkJY2FzZSBEM0RRVUVSWVRZUEVfQkFORFdJRFRIVElNSU5HUzoJCVVOSU1QTEVNRU5URUQoKTsgYnJlYWs7CisJCQljYXNlIEQzRFFVRVJZVFlQRV9DQUNIRVVUSUxJWkFUSU9OOgkJVU5JTVBMRU1FTlRFRCgpOyBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBzaWduYWxlZCA/IFNfT0sgOiBTX0ZBTFNFOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEUXVlcnk5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEUXVlcnk5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWY1MWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RRdWVyeTkuaHBwCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBEM0Q5X0RpcmVjdDNEUXVlcnk5X2hwcAorI2RlZmluZSBEM0Q5X0RpcmVjdDNEUXVlcnk5X2hwcAorCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlICJSZW5kZXJlci5ocHAiCisKKyNpbmNsdWRlIDxkM2Q5Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJY2xhc3MgRGlyZWN0M0REZXZpY2U5OworCisJY2xhc3MgRGlyZWN0M0RRdWVyeTkgOiBwdWJsaWMgSURpcmVjdDNEUXVlcnk5LCBwdWJsaWMgVW5rbm93bgorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEUXVlcnk5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCBEM0RRVUVSWVRZUEUgdHlwZSk7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RRdWVyeTkoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RRdWVyeTkgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSk7CisJCUQzRFFVRVJZVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXREYXRhU2l6ZSgpOworCQlsb25nIF9fc3RkY2FsbCBJc3N1ZSh1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGF0YSh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisJcHJpdmF0ZToKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQlEaXJlY3QzRERldmljZTkgKmNvbnN0IGRldmljZTsKKwkJY29uc3QgRDNEUVVFUllUWVBFIHR5cGU7CisKKwkJc3c6OlF1ZXJ5ICpxdWVyeTsKKwl9OworfQorCisjZW5kaWYgICAvLyBEM0Q5X0RpcmVjdDNEUXVlcnk5X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RSZXNvdXJjZTkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0RSZXNvdXJjZTkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YWYwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzRFJlc291cmNlOS5jcHAKQEAgLTAsMCArMSwyMzkgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNEUmVzb3VyY2U5LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCituYW1lc3BhY2UgRDNEOQoreworCXVuc2lnbmVkIGludCBEaXJlY3QzRFJlc291cmNlOTo6bWVtb3J5VXNhZ2UgPSAwOworCisJRGlyZWN0M0RSZXNvdXJjZTk6OlByaXZhdGVEYXRhOjpQcml2YXRlRGF0YSgpCisJeworCQlkYXRhID0gMDsKKwl9CisKKwlEaXJlY3QzRFJlc291cmNlOTo6UHJpdmF0ZURhdGE6OlByaXZhdGVEYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludCBzaXplLCBib29sIG1hbmFnZWQpCisJeworCQl0aGlzLT5zaXplID0gc2l6ZTsKKwkJdGhpcy0+bWFuYWdlZCA9IG1hbmFnZWQ7CisKKwkJdGhpcy0+ZGF0YSA9ICh2b2lkKiluZXcgdW5zaWduZWQgY2hhcltzaXplXTsKKwkJbWVtY3B5KHRoaXMtPmRhdGEsIGRhdGEsIHNpemUpOworCisJCWlmKG1hbmFnZWQpCisJCXsKKwkJCSgoSVVua25vd24qKWRhdGEpLT5BZGRSZWYoKTsKKwkJfQorCX0KKworCURpcmVjdDNEUmVzb3VyY2U5OjpQcml2YXRlRGF0YSAmRGlyZWN0M0RSZXNvdXJjZTk6OlByaXZhdGVEYXRhOjpvcGVyYXRvcj0oY29uc3QgUHJpdmF0ZURhdGEgJnByaXZhdGVEYXRhKQorCXsKKwkJc2l6ZSA9IHByaXZhdGVEYXRhLnNpemU7CisJCW1hbmFnZWQgPSBwcml2YXRlRGF0YS5tYW5hZ2VkOworCisJCWlmKGRhdGEpCisJCXsKKwkJCWlmKG1hbmFnZWQpCisJCQl7CisJCQkJKChJVW5rbm93biopZGF0YSktPlJlbGVhc2UoKTsKKwkJCX0KKworCQkJZGVsZXRlW10gZGF0YTsKKwkJfQorCisJCWRhdGEgPSAodm9pZCopbmV3IHVuc2lnbmVkIGNoYXJbc2l6ZV07CisJCW1lbWNweShkYXRhLCBwcml2YXRlRGF0YS5kYXRhLCBzaXplKTsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJRGlyZWN0M0RSZXNvdXJjZTk6OlByaXZhdGVEYXRhOjp+UHJpdmF0ZURhdGEoKQorCXsKKwkJaWYoZGF0YSAmJiBtYW5hZ2VkKQorCQl7CisJCQkoKElVbmtub3duKilkYXRhKS0+UmVsZWFzZSgpOworCQl9CisKKwkJZGVsZXRlW10gZGF0YTsKKwkJZGF0YSA9IDA7CisJfQorCisJRGlyZWN0M0RSZXNvdXJjZTk6OkRpcmVjdDNEUmVzb3VyY2U5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgRDNEUE9PTCBwb29sLCB1bnNpZ25lZCBpbnQgc2l6ZSkgOiBkZXZpY2UoZGV2aWNlKSwgdHlwZSh0eXBlKSwgcG9vbChwb29sKSwgc2l6ZShzaXplKQorCXsKKwkJcHJpb3JpdHkgPSAwOworCisJCWlmKHBvb2wgPT0gRDNEUE9PTF9ERUZBVUxUKQorCQl7CisJCQltZW1vcnlVc2FnZSArPSBzaXplOworCQl9CisJfQorCisJRGlyZWN0M0RSZXNvdXJjZTk6On5EaXJlY3QzRFJlc291cmNlOSgpCisJeworCQlpZihwb29sID09IEQzRFBPT0xfREVGQVVMVCkKKwkJeworCQkJbWVtb3J5VXNhZ2UgLT0gc2l6ZTsKKwkJfQorCX0KKworCWxvbmcgRGlyZWN0M0RSZXNvdXJjZTk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U5IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFJlc291cmNlOTo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFJlc291cmNlOTo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEUmVzb3VyY2U5OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzLT5kZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighZGV2aWNlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXRoaXMtPmRldmljZS0+QWRkUmVmKCk7CisJCSpkZXZpY2UgPSB0aGlzLT5kZXZpY2U7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEUmVzb3VyY2U5OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcHJpdmF0ZURhdGFbZ3VpZF0gPSBQcml2YXRlRGF0YShkYXRhLCBzaXplLCBmbGFncyA9PSBEM0RTUERfSVVOS05PV04pOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFJlc291cmNlOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlJdGVyYXRvciByZXN1bHQgPSBwcml2YXRlRGF0YS5maW5kKGd1aWQpOworCisJCWlmKHJlc3VsdCA9PSBwcml2YXRlRGF0YS5lbmQoKSkKKwkJeworCQkJcmV0dXJuIE5PVEZPVU5EKCk7CisJCX0KKworCQlpZihyZXN1bHQtPnNlY29uZC5zaXplID4gKnNpemUpCisJCXsKKwkJCXJldHVybiBNT1JFREFUQSgpOworCQl9CisKKwkJbWVtY3B5KGRhdGEsIHJlc3VsdC0+c2Vjb25kLmRhdGEsIHJlc3VsdC0+c2Vjb25kLnNpemUpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFJlc291cmNlOTo6RnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJSXRlcmF0b3IgcmVzdWx0ID0gcHJpdmF0ZURhdGEuZmluZChndWlkKTsKKworCQlpZihyZXN1bHQgPT0gcHJpdmF0ZURhdGEuZW5kKCkpCisJCXsKKwkJCXJldHVybiBEM0RFUlJfTk9URk9VTkQ7CisJCX0KKwkJCisJCXByaXZhdGVEYXRhLmVyYXNlKGd1aWQpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFJlc291cmNlOTo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQl1bnNpZ25lZCBsb25nIG9sZFByaW9yaXR5ID0gcHJpb3JpdHk7CisJCXByaW9yaXR5ID0gbmV3UHJpb3JpdHk7CisKKwkJcmV0dXJuIG9sZFByaW9yaXR5OworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaW9yaXR5KCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gcHJpb3JpdHk7CisJfQorCisJdm9pZCBEaXJlY3QzRFJlc291cmNlOTo6UHJlTG9hZCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisJfQorCisJRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEUmVzb3VyY2U5OjpHZXRUeXBlKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwl1bnNpZ25lZCBpbnQgRGlyZWN0M0RSZXNvdXJjZTk6OmdldE1lbW9yeVVzYWdlKCkKKwl7CisJCXJldHVybiBtZW1vcnlVc2FnZTsKKwl9CisKKwlEM0RQT09MIERpcmVjdDNEUmVzb3VyY2U5OjpnZXRQb29sKCkgY29uc3QKKwl7CisJCXJldHVybiBwb29sOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFJlc291cmNlOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzRFJlc291cmNlOS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkNGMxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNEUmVzb3VyY2U5LmhwcApAQCAtMCwwICsxLDkxIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgRDNEOV9EaXJlY3QzRFJlc291cmNlOV9ocHAKKyNkZWZpbmUgRDNEOV9EaXJlY3QzRFJlc291cmNlOV9ocHAKKworI2luY2x1ZGUgIlVua25vd24uaHBwIgorCisjaW5jbHVkZSA8ZDNkOS5oPgorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgRDNEOQoreworCWNsYXNzIERpcmVjdDNERGV2aWNlOTsKKworCWNsYXNzIERpcmVjdDNEUmVzb3VyY2U5IDogcHVibGljIElEaXJlY3QzRFJlc291cmNlOSwgcHVibGljIFVua25vd24KKwl7CisJcHVibGljOgorCQlEaXJlY3QzRFJlc291cmNlOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgRDNEUkVTT1VSQ0VUWVBFIHR5cGUsIEQzRFBPT0wgcG9vbCwgdW5zaWduZWQgaW50IHNpemUpOworCisJCXZpcnR1YWwgfkRpcmVjdDNEUmVzb3VyY2U5KCk7CisKKwkJLy8gSVVua25vd24gbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7CisKKwkJLy8gSURpcmVjdDNEUmVzb3VyY2U5IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKTsKKwkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKTsKKwkJdm9pZCBfX3N0ZGNhbGwgUHJlTG9hZCgpOworCQlEM0RSRVNPVVJDRVRZUEUgX19zdGRjYWxsIEdldFR5cGUoKTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0TWVtb3J5VXNhZ2UoKTsKKwkJRDNEUE9PTCBnZXRQb29sKCkgY29uc3Q7CisKKwlwcm90ZWN0ZWQ6CisJCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKKwkJRGlyZWN0M0REZXZpY2U5ICpjb25zdCBkZXZpY2U7CisJCWNvbnN0IEQzRFJFU09VUkNFVFlQRSB0eXBlOworCQljb25zdCBEM0RQT09MIHBvb2w7CisJCWNvbnN0IHVuc2lnbmVkIGludCBzaXplOworCisJcHJpdmF0ZToKKwkJdW5zaWduZWQgbG9uZyBwcmlvcml0eTsKKworCQlzdHJ1Y3QgUHJpdmF0ZURhdGEKKwkJeworCQkJUHJpdmF0ZURhdGEoKTsKKwkJCVByaXZhdGVEYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludCBzaXplLCBib29sIG1hbmFnZWQpOworCisJCQl+UHJpdmF0ZURhdGEoKTsKKworCQkJUHJpdmF0ZURhdGEgJm9wZXJhdG9yPShjb25zdCBQcml2YXRlRGF0YSAmcHJpdmF0ZURhdGEpOworCisJCQl2b2lkICpkYXRhOworCQkJdW5zaWduZWQgbG9uZyBzaXplOworCQkJYm9vbCBtYW5hZ2VkOyAgIC8vIElVbmtub3duIGludGVyZmFjZQorCQl9OworCisJCXN0cnVjdCBDb21wYXJlR1VJRAorCQl7CisJCQlib29sIG9wZXJhdG9yKCkoY29uc3QgR1VJRCYgbGVmdCwgY29uc3QgR1VJRCYgcmlnaHQpIGNvbnN0CisJCQl7CisJCQkJcmV0dXJuIG1lbWNtcCgmbGVmdCwgJnJpZ2h0LCBzaXplb2YoR1VJRCkpIDwgMDsKKwkJCX0KKwkJfTsKKworCQl0eXBlZGVmIHN0ZDo6bWFwPEdVSUQsIFByaXZhdGVEYXRhLCBDb21wYXJlR1VJRD4gUHJpdmF0ZURhdGFNYXA7CisJCXR5cGVkZWYgUHJpdmF0ZURhdGFNYXA6Oml0ZXJhdG9yIEl0ZXJhdG9yOworCQlQcml2YXRlRGF0YU1hcCBwcml2YXRlRGF0YTsKKworCQlzdGF0aWMgdW5zaWduZWQgaW50IG1lbW9yeVVzYWdlOworCX07Cit9CisKKyNlbmRpZiAgIC8vIEQzRDlfRGlyZWN0M0RSZXNvdXJjZTlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFN0YXRlQmxvY2s5LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEU3RhdGVCbG9jazkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNWQwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzRFN0YXRlQmxvY2s5LmNwcApAQCAtMCwwICsxLDEzNDIgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNEU3RhdGVCbG9jazkuaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RJbmRleEJ1ZmZlcjkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4QnVmZmVyOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEUGl4ZWxTaGFkZXI5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleFNoYWRlcjkuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgRDNEOQoreworCURpcmVjdDNEU3RhdGVCbG9jazk6OkRpcmVjdDNEU3RhdGVCbG9jazkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFNUQVRFQkxPQ0tUWVBFIHR5cGUpIDogZGV2aWNlKGRldmljZSksIHR5cGUodHlwZSkKKwl7CisJCXZlcnRleERlY2xhcmF0aW9uID0gMDsKKworCQlpbmRleEJ1ZmZlciA9IDA7CisKKwkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCAxNjsgc3RyZWFtKyspCisJCXsKKwkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IDA7CisJCX0KKworCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgMTYgKyA0OyBzYW1wbGVyKyspCisJCXsKKwkJCXRleHR1cmVbc2FtcGxlcl0gPSAwOworCQl9CisKKwkJcGl4ZWxTaGFkZXIgPSAwOworCQl2ZXJ0ZXhTaGFkZXIgPSAwOworCisJCWNsZWFyKCk7CisKKwkJaWYodHlwZSA9PSBEM0RTQlRfUElYRUxTVEFURSB8fCB0eXBlID09IEQzRFNCVF9BTEwpCisJCXsKKwkJCWNhcHR1cmVQaXhlbFJlbmRlclN0YXRlcygpOworCQkJY2FwdHVyZVBpeGVsVGV4dHVyZVN0YXRlcygpOworCQkJY2FwdHVyZVBpeGVsU2FtcGxlclN0YXRlcygpOworCQkJY2FwdHVyZVBpeGVsU2hhZGVyU3RhdGVzKCk7CisJCX0KKwkJCisJCWlmKHR5cGUgPT0gRDNEU0JUX1ZFUlRFWFNUQVRFIHx8IHR5cGUgPT0gRDNEU0JUX0FMTCkKKwkJeworCQkJY2FwdHVyZVZlcnRleFJlbmRlclN0YXRlcygpOworCQkJY2FwdHVyZVZlcnRleFNhbXBsZXJTdGF0ZXMoKTsKKwkJCWNhcHR1cmVWZXJ0ZXhUZXh0dXJlU3RhdGVzKCk7CisJCQljYXB0dXJlTlBhdGNoTW9kZSgpOworCQkJY2FwdHVyZUxpZ2h0U3RhdGVzKCk7CisJCQljYXB0dXJlVmVydGV4U2hhZGVyU3RhdGVzKCk7CisJCQljYXB0dXJlU3RyZWFtU291cmNlRnJlcXVlbmNpZXMoKTsKKwkJCWNhcHR1cmVGVkYoKTsKKwkJCWNhcHR1cmVWZXJ0ZXhEZWNsYXJhdGlvbigpOworCQl9CisKKwkJaWYodHlwZSA9PSBEM0RTQlRfQUxMKSAgIC8vIENhcHR1cmUgcmVtYWluaW5nIHN0YXRlcworCQl7CisJCQljYXB0dXJlVGV4dHVyZXMoKTsKKwkJCWNhcHR1cmVUZXh0dXJlUGFsZXR0ZSgpOworCQkJY2FwdHVyZVZlcnRleFN0cmVhbXMoKTsKKwkJCWNhcHR1cmVJbmRleEJ1ZmZlcigpOworCQkJY2FwdHVyZVZpZXdwb3J0KCk7CisJCQljYXB0dXJlU2Npc3NvclJlY3RhbmdsZSgpOworCQkJY2FwdHVyZVRyYW5zZm9ybXMoKTsKKwkJCWNhcHR1cmVUZXh0dXJlVHJhbnNmb3JtcygpOworCQkJY2FwdHVyZUNsaXBwaW5nUGxhbmVzKCk7CisJCQljYXB0dXJlTWF0ZXJpYWwoKTsKKwkJfQorCX0KKworCURpcmVjdDNEU3RhdGVCbG9jazk6On5EaXJlY3QzRFN0YXRlQmxvY2s5KCkKKwl7CisJCWNsZWFyKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFN0YXRlQmxvY2s5OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFN0YXRlQmxvY2s5IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFN0YXRlQmxvY2s5OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKKwl9CisJCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFN0YXRlQmxvY2s5OjpSZWxlYXNlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6QXBwbHkoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKGRldmljZS0+aXNSZWNvcmRpbmcoKSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKwkJCisJCWlmKGZ2ZkNhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPlNldEZWRihGVkYpOworCQl9CisKKwkJaWYodmVydGV4RGVjbGFyYXRpb25DYXB0dXJlZCkKKwkJeworCQkJZGV2aWNlLT5TZXRWZXJ0ZXhEZWNsYXJhdGlvbih2ZXJ0ZXhEZWNsYXJhdGlvbik7CisJCX0KKworCQlpZihpbmRleEJ1ZmZlckNhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPlNldEluZGljZXMoaW5kZXhCdWZmZXIpOworCQl9CisKKwkJZm9yKGludCBzdGF0ZSA9IEQzRFJTX1pFTkFCTEU7IHN0YXRlIDw9IEQzRFJTX0JMRU5ET1BBTFBIQTsgc3RhdGUrKykKKwkJeworCQkJaWYocmVuZGVyU3RhdGVDYXB0dXJlZFtzdGF0ZV0pCisJCQl7CisJCQkJZGV2aWNlLT5TZXRSZW5kZXJTdGF0ZSgoRDNEUkVOREVSU1RBVEVUWVBFKXN0YXRlLCByZW5kZXJTdGF0ZVtzdGF0ZV0pOworCQkJfQorCQl9CisKKwkJaWYoblBhdGNoTW9kZUNhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPlNldE5QYXRjaE1vZGUoblBhdGNoTW9kZSk7CisJCX0KKworCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQorCQl7CisJCQlmb3IoaW50IHN0YXRlID0gRDNEVFNTX0NPTE9ST1A7IHN0YXRlIDw9IEQzRFRTU19DT05TVEFOVDsgc3RhdGUrKykKKwkJCXsKKwkJCQlpZih0ZXh0dXJlU3RhZ2VTdGF0ZUNhcHR1cmVkW3N0YWdlXVtzdGF0ZV0pCisJCQkJeworCQkJCQlkZXZpY2UtPlNldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCAoRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFKXN0YXRlLCB0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bc3RhdGVdKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgMTYgKyA0OyBzYW1wbGVyKyspCisJCXsKKwkJCWZvcihpbnQgc3RhdGUgPSBEM0RTQU1QX0FERFJFU1NVOyBzdGF0ZSA8PSBEM0RTQU1QX0RNQVBPRkZTRVQ7IHN0YXRlKyspCisJCQl7CisJCQkJaWYoc2FtcGxlclN0YXRlQ2FwdHVyZWRbc2FtcGxlcl1bc3RhdGVdKQorCQkJCXsKKwkJCQkJaW50IGluZGV4ID0gc2FtcGxlciA8IDE2ID8gc2FtcGxlciA6IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCArIChzYW1wbGVyIC0gMTYpOworCQkJCQlkZXZpY2UtPlNldFNhbXBsZXJTdGF0ZShpbmRleCwgKEQzRFNBTVBMRVJTVEFURVRZUEUpc3RhdGUsIHNhbXBsZXJTdGF0ZVtzYW1wbGVyXVtzdGF0ZV0pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgMTY7IHN0cmVhbSsrKQorCQl7CisJCQlpZihzdHJlYW1Tb3VyY2VDYXB0dXJlZFtzdHJlYW1dKQorCQkJeworCQkJCWRldmljZS0+U2V0U3RyZWFtU291cmNlKHN0cmVhbSwgc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyLCBzdHJlYW1Tb3VyY2Vbc3RyZWFtXS5vZmZzZXQsIHN0cmVhbVNvdXJjZVtzdHJlYW1dLnN0cmlkZSk7CisJCQl9CisKKwkJCWlmKHN0cmVhbVNvdXJjZUZyZXF1ZW5jeUNhcHR1cmVkW3N0cmVhbV0pCisJCQl7CisJCQkJZGV2aWNlLT5TZXRTdHJlYW1Tb3VyY2VGcmVxKHN0cmVhbSwgc3RyZWFtU291cmNlRnJlcXVlbmN5W3N0cmVhbV0pOworCQkJfQorCQl9CisKKwkJZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8IDE2ICsgNDsgc2FtcGxlcisrKQorCQl7CisJCQlpZih0ZXh0dXJlQ2FwdHVyZWRbc2FtcGxlcl0pCisJCQl7CisJCQkJaW50IGluZGV4ID0gc2FtcGxlciA8IDE2ID8gc2FtcGxlciA6IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCArIChzYW1wbGVyIC0gMTYpOworCQkJCWRldmljZS0+U2V0VGV4dHVyZShpbmRleCwgdGV4dHVyZVtzYW1wbGVyXSk7CisJCQl9CisJCX0KKworCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCA1MTI7IHN0YXRlKyspCisJCXsKKwkJCWlmKHRyYW5zZm9ybUNhcHR1cmVkW3N0YXRlXSkKKwkJCXsKKwkJCQlkZXZpY2UtPlNldFRyYW5zZm9ybSgoRDNEVFJBTlNGT1JNU1RBVEVUWVBFKXN0YXRlLCAmdHJhbnNmb3JtW3N0YXRlXSk7CisJCQl9CisJCX0KKworCQlpZihtYXRlcmlhbENhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPlNldE1hdGVyaWFsKCZtYXRlcmlhbCk7CisJCX0KKworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAorCQl7CisJCQlpZihsaWdodENhcHR1cmVkW2luZGV4XSkKKwkJCXsKKwkJCQlkZXZpY2UtPlNldExpZ2h0KGluZGV4LCAmbGlnaHRbaW5kZXhdKTsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspICAgLy8gRklYTUU6IFN1cHBvcnQgdW5saW1pdGVkIGluZGV4CisJCXsKKwkJCWlmKGxpZ2h0RW5hYmxlQ2FwdHVyZWRbaW5kZXhdKQorCQkJeworCQkJCWRldmljZS0+TGlnaHRFbmFibGUoaW5kZXgsIGxpZ2h0RW5hYmxlU3RhdGVbaW5kZXhdKTsKKwkJCX0KKwkJfQorCisJCWlmKHBpeGVsU2hhZGVyQ2FwdHVyZWQpCisJCXsKKwkJCWRldmljZS0+U2V0UGl4ZWxTaGFkZXIocGl4ZWxTaGFkZXIpOworCQl9CisKKwkJaWYodmVydGV4U2hhZGVyQ2FwdHVyZWQpCisJCXsKKwkJCWRldmljZS0+U2V0VmVydGV4U2hhZGVyKHZlcnRleFNoYWRlcik7CisJCX0KKworCQlpZih2aWV3cG9ydENhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPlNldFZpZXdwb3J0KCZ2aWV3cG9ydCk7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMjI0OyBpKyspCisJCXsKKwkJCWlmKCooaW50KilwaXhlbFNoYWRlckNvbnN0YW50RltpXSAhPSAweDgwMDAwMDAwKQorCQkJeworCQkJCWRldmljZS0+U2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoaSwgcGl4ZWxTaGFkZXJDb25zdGFudEZbaV0sIDEpOworCQkJfQorCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCWlmKHBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzBdICE9IDB4ODAwMDAwMDApCisJCQl7CisJCQkJZGV2aWNlLT5TZXRQaXhlbFNoYWRlckNvbnN0YW50SShpLCBwaXhlbFNoYWRlckNvbnN0YW50SVtpXSwgMSk7CisJCQl9CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJaWYocGl4ZWxTaGFkZXJDb25zdGFudEJbaV0gIT0gMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlkZXZpY2UtPlNldFBpeGVsU2hhZGVyQ29uc3RhbnRCKGksICZwaXhlbFNoYWRlckNvbnN0YW50QltpXSwgMSk7CisJCQl9CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXsKKwkJCWlmKCooaW50Kil2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbaV0gIT0gMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlkZXZpY2UtPlNldFZlcnRleFNoYWRlckNvbnN0YW50RihpLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbaV0sIDEpOworCQkJfQorCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCWlmKHZlcnRleFNoYWRlckNvbnN0YW50SVtpXVswXSAhPSAweDgwMDAwMDAwKQorCQkJeworCQkJCWRldmljZS0+U2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKGksIHZlcnRleFNoYWRlckNvbnN0YW50SVtpXSwgMSk7CisJCQl9CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJaWYodmVydGV4U2hhZGVyQ29uc3RhbnRCW2ldICE9IDB4ODAwMDAwMDApCisJCQl7CisJCQkJZGV2aWNlLT5TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIoaSwgJnZlcnRleFNoYWRlckNvbnN0YW50QltpXSwgMSk7CisJCQl9CisJCX0KKworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCsrKQorCQl7CisJCQlpZihjbGlwUGxhbmVDYXB0dXJlZFtpbmRleF0pCisJCQl7CisJCQkJZGV2aWNlLT5TZXRDbGlwUGxhbmUoaW5kZXgsIGNsaXBQbGFuZVtpbmRleF0pOworCQkJfQorCQl9CisKKwkJaWYoc2Npc3NvclJlY3RDYXB0dXJlZCkKKwkJeworCQkJZGV2aWNlLT5TZXRTY2lzc29yUmVjdCgmc2Npc3NvclJlY3QpOworCQl9CisKKwkJaWYocGFsZXR0ZU51bWJlckNhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPlNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZShwYWxldHRlTnVtYmVyKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN0YXRlQmxvY2s5OjpDYXB0dXJlKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKwkJCisJCWlmKGZ2ZkNhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPkdldEZWRigmRlZGKTsKKwkJfQorCisJCWlmKHZlcnRleERlY2xhcmF0aW9uQ2FwdHVyZWQpCisJCXsKKwkJCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICp2ZXJ0ZXhEZWNsYXJhdGlvbjsKKwkJCWRldmljZS0+R2V0VmVydGV4RGVjbGFyYXRpb24ocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkqKj4oJnZlcnRleERlY2xhcmF0aW9uKSk7CisJCQkKKwkJCWlmKHZlcnRleERlY2xhcmF0aW9uKQorCQkJeworCQkJCXZlcnRleERlY2xhcmF0aW9uLT5iaW5kKCk7CisJCQkJdmVydGV4RGVjbGFyYXRpb24tPlJlbGVhc2UoKTsKKwkJCX0KKworCQkJaWYodGhpcy0+dmVydGV4RGVjbGFyYXRpb24pCisJCQl7CisJCQkJdGhpcy0+dmVydGV4RGVjbGFyYXRpb24tPnVuYmluZCgpOworCQkJfQorCisJCQl0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbiA9IHZlcnRleERlY2xhcmF0aW9uOworCQl9CisKKwkJaWYoaW5kZXhCdWZmZXJDYXB0dXJlZCkKKwkJeworCQkJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4QnVmZmVyOworCQkJZGV2aWNlLT5HZXRJbmRpY2VzKHJlaW50ZXJwcmV0X2Nhc3Q8SURpcmVjdDNESW5kZXhCdWZmZXI5Kio+KCZpbmRleEJ1ZmZlcikpOworCQkJCisJCQlpZihpbmRleEJ1ZmZlcikKKwkJCXsKKwkJCQlpbmRleEJ1ZmZlci0+YmluZCgpOworCQkJCWluZGV4QnVmZmVyLT5SZWxlYXNlKCk7CisJCQl9CisKKwkJCWlmKHRoaXMtPmluZGV4QnVmZmVyKQorCQkJeworCQkJCXRoaXMtPmluZGV4QnVmZmVyLT51bmJpbmQoKTsKKwkJCX0KKworCQkJdGhpcy0+aW5kZXhCdWZmZXIgPSBpbmRleEJ1ZmZlcjsKKwkJfQorCisJCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IEQzRFJTX0JMRU5ET1BBTFBIQSArIDE7IHN0YXRlKyspCisJCXsKKwkJCWlmKHJlbmRlclN0YXRlQ2FwdHVyZWRbc3RhdGVdKQorCQkJeworCQkJCWRldmljZS0+R2V0UmVuZGVyU3RhdGUoKEQzRFJFTkRFUlNUQVRFVFlQRSlzdGF0ZSwgJnJlbmRlclN0YXRlW3N0YXRlXSk7CisJCQl9CisJCX0KKworCQlpZihuUGF0Y2hNb2RlQ2FwdHVyZWQpCisJCXsKKwkJCW5QYXRjaE1vZGUgPSBkZXZpY2UtPkdldE5QYXRjaE1vZGUoKTsKKwkJfQorCisJCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCisJCXsKKwkJCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IEQzRFRTU19DT05TVEFOVCArIDE7IHN0YXRlKyspCisJCQl7CisJCQkJaWYodGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFtzdGFnZV1bc3RhdGVdKQorCQkJCXsKKwkJCQkJZGV2aWNlLT5HZXRUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgKEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSlzdGF0ZSwgJnRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVtzdGF0ZV0pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvcihpbnQgc2FtcGxlciA9IDA7IHNhbXBsZXIgPCAxNiArIDQ7IHNhbXBsZXIrKykKKwkJeworCQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEU0FNUF9ETUFQT0ZGU0VUICsgMTsgc3RhdGUrKykKKwkJCXsKKwkJCQlpZihzYW1wbGVyU3RhdGVDYXB0dXJlZFtzYW1wbGVyXVtzdGF0ZV0pCisJCQkJeworCQkJCQlpbnQgaW5kZXggPSBzYW1wbGVyIDwgMTYgPyBzYW1wbGVyIDogRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwICsgKHNhbXBsZXIgLSAxNik7CisJCQkJCWRldmljZS0+R2V0U2FtcGxlclN0YXRlKGluZGV4LCAoRDNEU0FNUExFUlNUQVRFVFlQRSlzdGF0ZSwgJnNhbXBsZXJTdGF0ZVtzYW1wbGVyXVtzdGF0ZV0pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgMTY7IHN0cmVhbSsrKQorCQl7CisJCQlpZihzdHJlYW1Tb3VyY2VDYXB0dXJlZFtzdHJlYW1dKQorCQkJeworCQkJCURpcmVjdDNEVmVydGV4QnVmZmVyOSAqdmVydGV4QnVmZmVyOworCQkJCWRldmljZS0+R2V0U3RyZWFtU291cmNlKHN0cmVhbSwgcmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5Kio+KCZ2ZXJ0ZXhCdWZmZXIpLCAmc3RyZWFtU291cmNlW3N0cmVhbV0ub2Zmc2V0LCAmc3RyZWFtU291cmNlW3N0cmVhbV0uc3RyaWRlKTsKKworCQkJCWlmKHZlcnRleEJ1ZmZlcikKKwkJCQl7CisJCQkJCXZlcnRleEJ1ZmZlci0+YmluZCgpOworCQkJCQl2ZXJ0ZXhCdWZmZXItPlJlbGVhc2UoKTsKKwkJCQl9CisKKwkJCQlpZihzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIpCisJCQkJeworCQkJCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXItPnVuYmluZCgpOworCQkJCX0KKworCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IHZlcnRleEJ1ZmZlcjsKKwkJCX0KKworCQkJaWYoc3RyZWFtU291cmNlRnJlcXVlbmN5Q2FwdHVyZWRbc3RyZWFtXSkKKwkJCXsKKwkJCQlkZXZpY2UtPkdldFN0cmVhbVNvdXJjZUZyZXEoc3RyZWFtLCAmc3RyZWFtU291cmNlRnJlcXVlbmN5W3N0cmVhbV0pOworCQkJfQorCQl9CisKKwkJZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8IDE2ICsgNDsgc2FtcGxlcisrKQorCQl7CisJCQlpZih0ZXh0dXJlQ2FwdHVyZWRbc2FtcGxlcl0pCisJCQl7CisJCQkJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmU7CisJCQkJaW50IGluZGV4ID0gc2FtcGxlciA8IDE2ID8gc2FtcGxlciA6IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCArIChzYW1wbGVyIC0gMTYpOworCQkJCWRldmljZS0+R2V0VGV4dHVyZShpbmRleCwgcmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RCYXNlVGV4dHVyZTkqKj4oJnRleHR1cmUpKTsKKworCQkJCWlmKHRleHR1cmUpCisJCQkJeworCQkJCQl0ZXh0dXJlLT5iaW5kKCk7CisJCQkJCXRleHR1cmUtPlJlbGVhc2UoKTsKKwkJCQl9CisKKwkJCQlpZih0aGlzLT50ZXh0dXJlW3NhbXBsZXJdKQorCQkJCXsKKwkJCQkJdGhpcy0+dGV4dHVyZVtzYW1wbGVyXS0+dW5iaW5kKCk7CisJCQkJfQorCisJCQkJdGhpcy0+dGV4dHVyZVtzYW1wbGVyXSA9IHRleHR1cmU7CisJCQl9CisJCX0KKworCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCA1MTI7IHN0YXRlKyspCisJCXsKKwkJCWlmKHRyYW5zZm9ybUNhcHR1cmVkW3N0YXRlXSkKKwkJCXsKKwkJCQlkZXZpY2UtPkdldFRyYW5zZm9ybSgoRDNEVFJBTlNGT1JNU1RBVEVUWVBFKXN0YXRlLCAmdHJhbnNmb3JtW3N0YXRlXSk7CisJCQl9CisJCX0KKworCQlpZihtYXRlcmlhbENhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPkdldE1hdGVyaWFsKCZtYXRlcmlhbCk7CisJCX0KKworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAorCQl7CisJCQlpZihsaWdodENhcHR1cmVkW2luZGV4XSkKKwkJCXsKKwkJCQlkZXZpY2UtPkdldExpZ2h0KGluZGV4LCAmbGlnaHRbaW5kZXhdKTsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspICAgLy8gRklYTUU6IFN1cHBvcnQgdW5saW1pdGVkIGluZGV4CisJCXsKKwkJCWlmKGxpZ2h0RW5hYmxlQ2FwdHVyZWRbaW5kZXhdKQorCQkJeworCQkJCWxpZ2h0RW5hYmxlU3RhdGVbaW5kZXhdID0gZmFsc2U7CisJCQkJZGV2aWNlLT5HZXRMaWdodEVuYWJsZShpbmRleCwgJmxpZ2h0RW5hYmxlU3RhdGVbaW5kZXhdKTsKKwkJCX0KKwkJfQorCisJCWlmKHBpeGVsU2hhZGVyQ2FwdHVyZWQpCisJCXsKKwkJCURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpwaXhlbFNoYWRlcjsKKwkJCWRldmljZS0+R2V0UGl4ZWxTaGFkZXIocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RQaXhlbFNoYWRlcjkqKj4oJnBpeGVsU2hhZGVyKSk7CisKKwkJCWlmKHBpeGVsU2hhZGVyKQorCQkJeworCQkJCXBpeGVsU2hhZGVyLT5iaW5kKCk7CisJCQkJcGl4ZWxTaGFkZXItPlJlbGVhc2UoKTsKKwkJCX0KKworCQkJaWYodGhpcy0+cGl4ZWxTaGFkZXIpCisJCQl7CisJCQkJdGhpcy0+cGl4ZWxTaGFkZXItPnVuYmluZCgpOworCQkJfQorCisJCQl0aGlzLT5waXhlbFNoYWRlciA9IHBpeGVsU2hhZGVyOworCQl9CisKKwkJaWYodmVydGV4U2hhZGVyQ2FwdHVyZWQpCisJCXsKKwkJCURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdmVydGV4U2hhZGVyOworCQkJZGV2aWNlLT5HZXRWZXJ0ZXhTaGFkZXIocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5Kio+KCZ2ZXJ0ZXhTaGFkZXIpKTsKKworCQkJaWYodmVydGV4U2hhZGVyKQorCQkJeworCQkJCXZlcnRleFNoYWRlci0+YmluZCgpOworCQkJCXZlcnRleFNoYWRlci0+UmVsZWFzZSgpOworCQkJfQorCisJCQlpZih0aGlzLT52ZXJ0ZXhTaGFkZXIpCisJCQl7CisJCQkJdGhpcy0+dmVydGV4U2hhZGVyLT51bmJpbmQoKTsKKwkJCX0KKworCQkJdGhpcy0+dmVydGV4U2hhZGVyID0gdmVydGV4U2hhZGVyOworCQl9CisKKwkJaWYodmlld3BvcnRDYXB0dXJlZCkKKwkJeworCQkJZGV2aWNlLT5HZXRWaWV3cG9ydCgmdmlld3BvcnQpOworCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDIyNDsgaSsrKQorCQl7CisJCQlpZigqKGludCopcGl4ZWxTaGFkZXJDb25zdGFudEZbaV0gIT0gMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlkZXZpY2UtPkdldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGksIHBpeGVsU2hhZGVyQ29uc3RhbnRGW2ldLCAxKTsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl7CisJCQlpZihwaXhlbFNoYWRlckNvbnN0YW50SVtpXVswXSAhPSAweDgwMDAwMDAwKQorCQkJeworCQkJCWRldmljZS0+R2V0UGl4ZWxTaGFkZXJDb25zdGFudEkoaSwgcGl4ZWxTaGFkZXJDb25zdGFudElbaV0sIDEpOworCQkJfQorCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCWlmKHBpeGVsU2hhZGVyQ29uc3RhbnRCW2ldICE9IDB4ODAwMDAwMDApCisJCQl7CisJCQkJZGV2aWNlLT5HZXRQaXhlbFNoYWRlckNvbnN0YW50QihpLCAmcGl4ZWxTaGFkZXJDb25zdGFudEJbaV0sIDEpOworCQkJfQorCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQorCQl7CisJCQlpZigqKGludCopdmVydGV4U2hhZGVyQ29uc3RhbnRGW2ldICE9IDB4ODAwMDAwMDApCisJCQl7CisJCQkJZGV2aWNlLT5HZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoaSwgdmVydGV4U2hhZGVyQ29uc3RhbnRGW2ldLCAxKTsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl7CisJCQlpZih2ZXJ0ZXhTaGFkZXJDb25zdGFudElbaV1bMF0gIT0gMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlkZXZpY2UtPkdldFZlcnRleFNoYWRlckNvbnN0YW50SShpLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudElbaV0sIDEpOworCQkJfQorCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCWlmKHZlcnRleFNoYWRlckNvbnN0YW50QltpXSAhPSAweDgwMDAwMDAwKQorCQkJeworCQkJCWRldmljZS0+R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKGksICZ2ZXJ0ZXhTaGFkZXJDb25zdGFudEJbaV0sIDEpOworCQkJfQorCQl9CisKKwkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykKKwkJeworCQkJaWYoY2xpcFBsYW5lQ2FwdHVyZWRbaW5kZXhdKQorCQkJeworCQkJCWRldmljZS0+R2V0Q2xpcFBsYW5lKGluZGV4LCBjbGlwUGxhbmVbaW5kZXhdKTsKKwkJCX0KKwkJfQorCisJCWlmKHNjaXNzb3JSZWN0Q2FwdHVyZWQpCisJCXsKKwkJCWRldmljZS0+R2V0U2Npc3NvclJlY3QoJnNjaXNzb3JSZWN0KTsKKwkJfQorCisJCWlmKHBhbGV0dGVOdW1iZXJDYXB0dXJlZCkKKwkJeworCQkJZGV2aWNlLT5HZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUoJnBhbGV0dGVOdW1iZXIpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEU3RhdGVCbG9jazk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXZpY2UpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdGhpcy0+ZGV2aWNlLT5BZGRSZWYoKTsKKwkJKmRldmljZSA9IHRoaXMtPmRldmljZTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6bGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCwgaW50IGVuYWJsZSkKKwl7CisJCWlmKGluZGV4IDwgOCkKKwkJeworCQkJbGlnaHRFbmFibGVDYXB0dXJlZFtpbmRleF0gPSB0cnVlOworCQkJbGlnaHRFbmFibGVTdGF0ZVtpbmRleF0gPSBlbmFibGU7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOyAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IGZsb2F0ICpwbGFuZSkKKwl7CisJCWNsaXBQbGFuZUNhcHR1cmVkW2luZGV4XSA9IHRydWU7CisJCWNsaXBQbGFuZVtpbmRleF1bMF0gPSBwbGFuZVswXTsKKwkJY2xpcFBsYW5lW2luZGV4XVsxXSA9IHBsYW5lWzFdOworCQljbGlwUGxhbmVbaW5kZXhdWzJdID0gcGxhbmVbMl07CisJCWNsaXBQbGFuZVtpbmRleF1bM10gPSBwbGFuZVszXTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcikKKwl7CisJCXBhbGV0dGVOdW1iZXJDYXB0dXJlZCA9IHRydWU7CisJCXRoaXMtPnBhbGV0dGVOdW1iZXIgPSBwYWxldHRlTnVtYmVyOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0RlZGKHVuc2lnbmVkIGxvbmcgRlZGKQorCXsKKwkJZnZmQ2FwdHVyZWQgPSB0cnVlOworCQl0aGlzLT5GVkYgPSBGVkY7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRJbmRpY2VzKERpcmVjdDNESW5kZXhCdWZmZXI5ICppbmRleEJ1ZmZlcikKKwl7CisJCWlmKGluZGV4QnVmZmVyKSBpbmRleEJ1ZmZlci0+YmluZCgpOworCQlpZih0aGlzLT5pbmRleEJ1ZmZlcikgdGhpcy0+aW5kZXhCdWZmZXItPnVuYmluZCgpOworCisJCWluZGV4QnVmZmVyQ2FwdHVyZWQgPSB0cnVlOworCQl0aGlzLT5pbmRleEJ1ZmZlciA9IGluZGV4QnVmZmVyOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgRDNETElHSFQ5ICpsaWdodCkKKwl7CisJCWlmKGluZGV4IDwgOCkKKwkJeworCQkJbGlnaHRDYXB0dXJlZFtpbmRleF0gPSB0cnVlOworCQkJdGhpcy0+bGlnaHRbaW5kZXhdID0gKmxpZ2h0OworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsgICAvLyBGSVhNRTogU3VwcG9ydCB1bmxpbWl0ZWQgaW5kZXgKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwpCisJeworCQltYXRlcmlhbENhcHR1cmVkID0gdHJ1ZTsKKwkJdGhpcy0+bWF0ZXJpYWwgPSAqbWF0ZXJpYWw7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXROUGF0Y2hNb2RlKGZsb2F0IHNlZ21lbnRzKQorCXsKKwkJblBhdGNoTW9kZUNhcHR1cmVkID0gdHJ1ZTsKKwkJblBhdGNoTW9kZSA9IHNlZ21lbnRzOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0UGl4ZWxTaGFkZXIoRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnBpeGVsU2hhZGVyKQorCXsKKwkJaWYocGl4ZWxTaGFkZXIpIHBpeGVsU2hhZGVyLT5iaW5kKCk7CisJCWlmKHRoaXMtPnBpeGVsU2hhZGVyKSB0aGlzLT5waXhlbFNoYWRlci0+dW5iaW5kKCk7CisKKwkJcGl4ZWxTaGFkZXJDYXB0dXJlZCA9IHRydWU7CisJCXRoaXMtPnBpeGVsU2hhZGVyID0gcGl4ZWxTaGFkZXI7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCW1lbWNweSgmcGl4ZWxTaGFkZXJDb25zdGFudEJbc3RhcnRSZWdpc3Rlcl0sIGNvbnN0YW50RGF0YSwgY291bnQgKiBzaXplb2YoaW50KSk7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRQaXhlbFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJbWVtY3B5KHBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXJdLCBjb25zdGFudERhdGEsIGNvdW50ICogc2l6ZW9mKGZsb2F0WzRdKSk7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRQaXhlbFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCW1lbWNweShwaXhlbFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyXSwgY29uc3RhbnREYXRhLCBjb3VudCAqIHNpemVvZihpbnRbNF0pKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKKwl7CisJCXJlbmRlclN0YXRlQ2FwdHVyZWRbc3RhdGVdID0gdHJ1ZTsKKwkJcmVuZGVyU3RhdGVbc3RhdGVdID0gdmFsdWU7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRTYW1wbGVyU3RhdGUodW5zaWduZWQgbG9uZyBpbmRleCwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKKwl7CisJCXVuc2lnbmVkIGludCBzYW1wbGVyID0gaW5kZXggPCAxNiA/IGluZGV4IDogKGluZGV4IC0gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwKSArIDE2OworCisJCWlmKHNhbXBsZXIgPj0gMTYgKyA0KQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlzYW1wbGVyU3RhdGVDYXB0dXJlZFtzYW1wbGVyXVtzdGF0ZV0gPSB0cnVlOworCQlzYW1wbGVyU3RhdGVbc2FtcGxlcl1bc3RhdGVdID0gdmFsdWU7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRTY2lzc29yUmVjdChjb25zdCBSRUNUICpyZWN0KQorCXsKKwkJc2Npc3NvclJlY3RDYXB0dXJlZCA9IHRydWU7CisJCXNjaXNzb3JSZWN0ID0gKnJlY3Q7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbSwgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICp2ZXJ0ZXhCdWZmZXIsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzdHJpZGUpCisJeworCQlpZih2ZXJ0ZXhCdWZmZXIpIHZlcnRleEJ1ZmZlci0+YmluZCgpOworCQlpZihzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIpIHN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlci0+dW5iaW5kKCk7CisKKwkJc3RyZWFtU291cmNlQ2FwdHVyZWRbc3RyZWFtXSA9IHRydWU7CisJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IHZlcnRleEJ1ZmZlcjsKKwkJc3RyZWFtU291cmNlW3N0cmVhbV0ub2Zmc2V0ID0gb2Zmc2V0OworCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS5zdHJpZGUgPSBzdHJpZGU7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRTdHJlYW1Tb3VyY2VGcmVxKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIHVuc2lnbmVkIGludCBkaXZpZGVyKQorCXsKKwkJc3RyZWFtU291cmNlRnJlcXVlbmN5Q2FwdHVyZWRbc3RyZWFtTnVtYmVyXSA9IHRydWU7CisJCXN0cmVhbVNvdXJjZUZyZXF1ZW5jeVtzdHJlYW1OdW1iZXJdID0gZGl2aWRlcjsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFRleHR1cmUodW5zaWduZWQgbG9uZyBpbmRleCwgRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmUpCisJeworCQl1bnNpZ25lZCBpbnQgc2FtcGxlciA9IGluZGV4IDwgMTYgPyBpbmRleCA6IChpbmRleCAtIEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCkgKyAxNjsKKworCQlpZihzYW1wbGVyID49IDE2ICsgNCkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYodGV4dHVyZSkgdGV4dHVyZS0+YmluZCgpOworCQlpZih0aGlzLT50ZXh0dXJlW3NhbXBsZXJdKSB0aGlzLT50ZXh0dXJlW3NhbXBsZXJdLT51bmJpbmQoKTsKKworCQl0ZXh0dXJlQ2FwdHVyZWRbc2FtcGxlcl0gPSB0cnVlOworCQl0aGlzLT50ZXh0dXJlW3NhbXBsZXJdID0gdGV4dHVyZTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQorCXsKKwkJdGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFtzdGFnZV1bdHlwZV0gPSB0cnVlOworCQl0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bdHlwZV0gPSB2YWx1ZTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4KQorCXsKKwkJdHJhbnNmb3JtQ2FwdHVyZWRbc3RhdGVdID0gdHJ1ZTsKKwkJdHJhbnNmb3JtW3N0YXRlXSA9ICptYXRyaXg7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRWaWV3cG9ydChjb25zdCBEM0RWSUVXUE9SVDkgKnZpZXdwb3J0KQorCXsKKwkJdmlld3BvcnRDYXB0dXJlZCA9IHRydWU7CisJCXRoaXMtPnZpZXdwb3J0ID0gKnZpZXdwb3J0OworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0VmVydGV4RGVjbGFyYXRpb24oRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uKQorCXsKKwkJaWYodmVydGV4RGVjbGFyYXRpb24pIHZlcnRleERlY2xhcmF0aW9uLT5iaW5kKCk7CisJCWlmKHRoaXMtPnZlcnRleERlY2xhcmF0aW9uKSB0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbi0+dW5iaW5kKCk7CisKKwkJdmVydGV4RGVjbGFyYXRpb25DYXB0dXJlZCA9IHRydWU7CisJCXRoaXMtPnZlcnRleERlY2xhcmF0aW9uID0gdmVydGV4RGVjbGFyYXRpb247CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRWZXJ0ZXhTaGFkZXIoRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICp2ZXJ0ZXhTaGFkZXIpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIpIHZlcnRleFNoYWRlci0+YmluZCgpOworCQlpZih0aGlzLT52ZXJ0ZXhTaGFkZXIpIHRoaXMtPnZlcnRleFNoYWRlci0+dW5iaW5kKCk7CisKKwkJdmVydGV4U2hhZGVyQ2FwdHVyZWQgPSB0cnVlOworCQl0aGlzLT52ZXJ0ZXhTaGFkZXIgPSB2ZXJ0ZXhTaGFkZXI7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCisJeworCQltZW1jcHkoJnZlcnRleFNoYWRlckNvbnN0YW50QltzdGFydFJlZ2lzdGVyXSwgY29uc3RhbnREYXRhLCBjb3VudCAqIHNpemVvZihpbnQpKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJbWVtY3B5KHZlcnRleFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyXSwgY29uc3RhbnREYXRhLCBjb3VudCAqIHNpemVvZihmbG9hdFs0XSkpOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJbWVtY3B5KHZlcnRleFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyXSwgY29uc3RhbnREYXRhLCBjb3VudCAqIHNpemVvZihpbnRbNF0pKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNsZWFyKCkKKwl7CisJCS8vIEVyYXNlIGNhcHR1cmUgZmxhZ3MKKwkJZnZmQ2FwdHVyZWQgPSBmYWxzZTsKKwkJdmVydGV4RGVjbGFyYXRpb25DYXB0dXJlZCA9IGZhbHNlOworCisJCWluZGV4QnVmZmVyQ2FwdHVyZWQgPSBmYWxzZTsKKworCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCBEM0RSU19CTEVORE9QQUxQSEEgKyAxOyBzdGF0ZSsrKQorCQl7CisJCQlyZW5kZXJTdGF0ZUNhcHR1cmVkW3N0YXRlXSA9IGZhbHNlOworCQl9CisKKwkJblBhdGNoTW9kZUNhcHR1cmVkID0gZmFsc2U7CisKKwkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKKwkJeworCQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEVFNTX0NPTlNUQU5UICsgMTsgc3RhdGUrKykKKwkJCXsKKwkJCQl0ZXh0dXJlU3RhZ2VTdGF0ZUNhcHR1cmVkW3N0YWdlXVtzdGF0ZV0gPSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgc2FtcGxlciA9IDA7IHNhbXBsZXIgPCAxNiArIDQ7IHNhbXBsZXIrKykKKwkJeworCQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEU0FNUF9ETUFQT0ZGU0VUICsgMTsgc3RhdGUrKykKKwkJCXsKKwkJCQlzYW1wbGVyU3RhdGVDYXB0dXJlZFtzYW1wbGVyXVtzdGF0ZV0gPSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgMTY7IHN0cmVhbSsrKQorCQl7CisJCQlzdHJlYW1Tb3VyY2VDYXB0dXJlZFtzdHJlYW1dID0gZmFsc2U7CisJCQlzdHJlYW1Tb3VyY2VGcmVxdWVuY3lDYXB0dXJlZFtzdHJlYW1dID0gZmFsc2U7CisJCX0KKworCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgMTYgKyA0OyBzYW1wbGVyKyspCisJCXsKKwkJCXRleHR1cmVDYXB0dXJlZFtzYW1wbGVyXSA9IGZhbHNlOworCQl9CisKKwkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgNTEyOyBzdGF0ZSsrKQorCQl7CisJCQl0cmFuc2Zvcm1DYXB0dXJlZFtzdGF0ZV0gPSBmYWxzZTsKKwkJfQorCisJCW1hdGVyaWFsQ2FwdHVyZWQgPSBmYWxzZTsKKworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAorCQl7CisJCQlsaWdodENhcHR1cmVkW2luZGV4XSA9IGZhbHNlOworCQl9CisKKwkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgODsgaW5kZXgrKykgICAvLyBGSVhNRTogU3VwcG9ydCB1bmxpbWl0ZWQgaW5kZXgKKwkJeworCQkJbGlnaHRFbmFibGVDYXB0dXJlZFtpbmRleF0gPSBmYWxzZTsKKwkJfQorCisJCXNjaXNzb3JSZWN0Q2FwdHVyZWQgPSBmYWxzZTsKKworCQlwaXhlbFNoYWRlckNhcHR1cmVkID0gZmFsc2U7CisJCXZlcnRleFNoYWRlckNhcHR1cmVkID0gZmFsc2U7CisKKwkJdmlld3BvcnRDYXB0dXJlZCA9IGZhbHNlOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCAyMjQ7IGkrKykKKwkJeworCQkJKGludCYpcGl4ZWxTaGFkZXJDb25zdGFudEZbaV1bMF0gPSAweDgwMDAwMDAwOworCQkJKGludCYpcGl4ZWxTaGFkZXJDb25zdGFudEZbaV1bMV0gPSAweDgwMDAwMDAwOworCQkJKGludCYpcGl4ZWxTaGFkZXJDb25zdGFudEZbaV1bMl0gPSAweDgwMDAwMDAwOworCQkJKGludCYpcGl4ZWxTaGFkZXJDb25zdGFudEZbaV1bM10gPSAweDgwMDAwMDAwOworCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQorCQl7CisJCQkoaW50Jil2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbaV1bMF0gPSAweDgwMDAwMDAwOworCQkJKGludCYpdmVydGV4U2hhZGVyQ29uc3RhbnRGW2ldWzFdID0gMHg4MDAwMDAwMDsKKwkJCShpbnQmKXZlcnRleFNoYWRlckNvbnN0YW50RltpXVsyXSA9IDB4ODAwMDAwMDA7CisJCQkoaW50Jil2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbaV1bM10gPSAweDgwMDAwMDAwOworCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzBdID0gMHg4MDAwMDAwMDsKKwkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzFdID0gMHg4MDAwMDAwMDsKKwkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzJdID0gMHg4MDAwMDAwMDsKKwkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzNdID0gMHg4MDAwMDAwMDsKKworCQkJcGl4ZWxTaGFkZXJDb25zdGFudEJbaV0gPSAweDgwMDAwMDAwOworCisJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudElbaV1bMF0gPSAweDgwMDAwMDAwOworCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRJW2ldWzFdID0gMHg4MDAwMDAwMDsKKwkJCXZlcnRleFNoYWRlckNvbnN0YW50SVtpXVsyXSA9IDB4ODAwMDAwMDA7CisJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudElbaV1bM10gPSAweDgwMDAwMDAwOworCisJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudEJbaV0gPSAweDgwMDAwMDAwOworCQl9CisKKwkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykKKwkJeworCQkJY2xpcFBsYW5lQ2FwdHVyZWRbaW5kZXhdID0gZmFsc2U7CisJCX0KKworCQlwYWxldHRlTnVtYmVyQ2FwdHVyZWQgPSBmYWxzZTsKKworCQkvLyB1bmJpbmQgcmVzb3VyY2VzCisJCWlmKHZlcnRleERlY2xhcmF0aW9uKQorCQl7CisJCQl2ZXJ0ZXhEZWNsYXJhdGlvbi0+dW5iaW5kKCk7CisJCQl2ZXJ0ZXhEZWNsYXJhdGlvbiA9IDA7CisJCX0KKworCQlpZihpbmRleEJ1ZmZlcikKKwkJeworCQkJaW5kZXhCdWZmZXItPnVuYmluZCgpOworCQkJaW5kZXhCdWZmZXIgPSAwOworCQl9CisKKwkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCAxNjsgc3RyZWFtKyspCisJCXsKKwkJCWlmKHN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlcikKKwkJCXsKKwkJCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXItPnVuYmluZCgpOworCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IDA7CisJCQl9CisJCX0KKworCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgMTYgKyA0OyBzYW1wbGVyKyspCisJCXsKKwkJCWlmKHRleHR1cmVbc2FtcGxlcl0pCisJCQl7CisJCQkJdGV4dHVyZVtzYW1wbGVyXS0+dW5iaW5kKCk7CisJCQkJdGV4dHVyZVtzYW1wbGVyXSA9IDA7CisJCQl9CisJCX0KKworCQlpZihwaXhlbFNoYWRlcikKKwkJeworCQkJcGl4ZWxTaGFkZXItPnVuYmluZCgpOworCQkJcGl4ZWxTaGFkZXIgPSAwOworCQl9CisKKwkJaWYodmVydGV4U2hhZGVyKQorCQl7CisJCQl2ZXJ0ZXhTaGFkZXItPnVuYmluZCgpOworCQkJdmVydGV4U2hhZGVyID0gMDsKKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSkKKwl7CisJCWRldmljZS0+R2V0UmVuZGVyU3RhdGUoc3RhdGUsICZyZW5kZXJTdGF0ZVtzdGF0ZV0pOworCQlyZW5kZXJTdGF0ZUNhcHR1cmVkW3N0YXRlXSA9IHRydWU7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlU2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUpCisJeworCQlpZihpbmRleCA8IDE2KQorCQl7CisJCQlkZXZpY2UtPkdldFNhbXBsZXJTdGF0ZShpbmRleCwgc3RhdGUsICZzYW1wbGVyU3RhdGVbaW5kZXhdW3N0YXRlXSk7CisJCQlzYW1wbGVyU3RhdGVDYXB0dXJlZFtpbmRleF1bc3RhdGVdID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmKGluZGV4ID49IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCkKKwkJeworCQkJdW5zaWduZWQgaW50IHNhbXBsZXIgPSAxNiArIChpbmRleCAtIEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCk7CisKKwkJCWRldmljZS0+R2V0U2FtcGxlclN0YXRlKGluZGV4LCBzdGF0ZSwgJnNhbXBsZXJTdGF0ZVtzYW1wbGVyXVtzdGF0ZV0pOworCQkJc2FtcGxlclN0YXRlQ2FwdHVyZWRbc2FtcGxlcl1bc3RhdGVdID0gdHJ1ZTsKKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlKQorCXsKKwkJZGV2aWNlLT5HZXRUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgdHlwZSwgJnRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVt0eXBlXSk7CisJCXRleHR1cmVTdGFnZVN0YXRlQ2FwdHVyZWRbc3RhZ2VdW3R5cGVdID0gdHJ1ZTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlKQorCXsKKwkJZGV2aWNlLT5HZXRUcmFuc2Zvcm0oc3RhdGUsICZ0cmFuc2Zvcm1bc3RhdGVdKTsKKwkJdHJhbnNmb3JtQ2FwdHVyZWRbc3RhdGVdID0gdHJ1ZTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVQaXhlbFJlbmRlclN0YXRlcygpCisJeworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfWkVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GSUxMTU9ERSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TSEFERU1PREUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfWldSSVRFRU5BQkxFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0FMUEhBVEVTVEVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19MQVNUUElYRUwpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1JDQkxFTkQpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfREVTVEJMRU5EKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1pGVU5DKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0FMUEhBUkVGKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0FMUEhBRlVOQyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19ESVRIRVJFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HU1RBUlQpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HRU5EKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR0RFTlNJVFkpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQUxQSEFCTEVOREVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19ERVBUSEJJQVMpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMRkFJTCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMWkZBSUwpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFBBU1MpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEZVTkMpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFJFRik7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMTUFTSyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMV1JJVEVNQVNLKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1RFWFRVUkVGQUNUT1IpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDApOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDEpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDIpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDMpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDQpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDYpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDcpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDgpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDkpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDEwKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVAxMSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTIpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDEzKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVAxNCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ09MT1JXUklURUVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19CTEVORE9QKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NDSVNTT1JURVNURU5BQkxFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NMT1BFU0NBTEVERVBUSEJJQVMpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQU5USUFMSUFTRURMSU5FRU5BQkxFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1RXT1NJREVEU1RFTkNJTE1PREUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ0NXX1NURU5DSUxGQUlMKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NDV19TVEVOQ0lMWkZBSUwpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ0NXX1NURU5DSUxQQVNTKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NDV19TVEVOQ0lMRlVOQyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DT0xPUldSSVRFRU5BQkxFMSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DT0xPUldSSVRFRU5BQkxFMik7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DT0xPUldSSVRFRU5BQkxFMyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19CTEVOREZBQ1RPUik7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TUkdCV1JJVEVFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU0VQQVJBVEVBTFBIQUJMRU5ERU5BQkxFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NSQ0JMRU5EQUxQSEEpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfREVTVEJMRU5EQUxQSEEpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQkxFTkRPUEFMUEhBKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVQaXhlbFRleHR1cmVTdGF0ZXMoKQorCXsKKwkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKKwkJeworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQ09MT1JPUCk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19DT0xPUkFSRzEpOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQ09MT1JBUkcyKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FMUEhBT1ApOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQUxQSEFBUkcxKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FMUEhBQVJHMik7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTUFUMDApOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQlVNUEVOVk1BVDAxKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0JVTVBFTlZNQVQxMCk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTUFUMTEpOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfVEVYQ09PUkRJTkRFWCk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTFNDQUxFKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0JVTVBFTlZMT0ZGU0VUKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19DT0xPUkFSRzApOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQUxQSEFBUkcwKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1JFU1VMVEFSRyk7CisJCX0KKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVQaXhlbFNhbXBsZXJTdGF0ZXMoKQorCXsKKwkJZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8PSBEM0RWRVJURVhURVhUVVJFU0FNUExFUjM7IHNhbXBsZXIrKykKKwkJeworCQkJY2FwdHVyZVNhbXBsZXJTdGF0ZShzYW1wbGVyLCBEM0RTQU1QX0FERFJFU1NVKTsKKwkJCWNhcHR1cmVTYW1wbGVyU3RhdGUoc2FtcGxlciwgRDNEU0FNUF9BRERSRVNTVik7CisJCQljYXB0dXJlU2FtcGxlclN0YXRlKHNhbXBsZXIsIEQzRFNBTVBfQUREUkVTU1cpOyAKKwkJCWNhcHR1cmVTYW1wbGVyU3RhdGUoc2FtcGxlciwgRDNEU0FNUF9CT1JERVJDT0xPUik7CisJCQljYXB0dXJlU2FtcGxlclN0YXRlKHNhbXBsZXIsIEQzRFNBTVBfTUFHRklMVEVSKTsKKwkJCWNhcHR1cmVTYW1wbGVyU3RhdGUoc2FtcGxlciwgRDNEU0FNUF9NSU5GSUxURVIpOworCQkJY2FwdHVyZVNhbXBsZXJTdGF0ZShzYW1wbGVyLCBEM0RTQU1QX01JUEZJTFRFUik7CisJCQljYXB0dXJlU2FtcGxlclN0YXRlKHNhbXBsZXIsIEQzRFNBTVBfTUlQTUFQTE9EQklBUyk7CisJCQljYXB0dXJlU2FtcGxlclN0YXRlKHNhbXBsZXIsIEQzRFNBTVBfTUFYTUlQTEVWRUwpOworCQkJY2FwdHVyZVNhbXBsZXJTdGF0ZShzYW1wbGVyLCBEM0RTQU1QX01BWEFOSVNPVFJPUFkpOworCQkJY2FwdHVyZVNhbXBsZXJTdGF0ZShzYW1wbGVyLCBEM0RTQU1QX1NSR0JURVhUVVJFKTsKKwkJCWNhcHR1cmVTYW1wbGVyU3RhdGUoc2FtcGxlciwgRDNEU0FNUF9FTEVNRU5USU5ERVgpOworCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlUGl4ZWxTaGFkZXJTdGF0ZXMoKQorCXsKKwkJcGl4ZWxTaGFkZXJDYXB0dXJlZCA9IHRydWU7CisJCWRldmljZS0+R2V0UGl4ZWxTaGFkZXIocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RQaXhlbFNoYWRlcjkqKj4oJnBpeGVsU2hhZGVyKSk7CisJCQorCQlpZihwaXhlbFNoYWRlcikKKwkJeworCQkJcGl4ZWxTaGFkZXItPmJpbmQoKTsKKwkJCXBpeGVsU2hhZGVyLT5SZWxlYXNlKCk7CisJCX0KKworCQlkZXZpY2UtPkdldFBpeGVsU2hhZGVyQ29uc3RhbnRGKDAsIHBpeGVsU2hhZGVyQ29uc3RhbnRGWzBdLCAzMik7CisJCWRldmljZS0+R2V0UGl4ZWxTaGFkZXJDb25zdGFudEkoMCwgcGl4ZWxTaGFkZXJDb25zdGFudElbMF0sIDE2KTsKKwkJZGV2aWNlLT5HZXRQaXhlbFNoYWRlckNvbnN0YW50QigwLCBwaXhlbFNoYWRlckNvbnN0YW50QiwgMTYpOwkKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVWZXJ0ZXhSZW5kZXJTdGF0ZXMoKQorCXsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NVTExNT0RFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR0VOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dDT0xPUik7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dUQUJMRU1PREUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HU1RBUlQpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HRU5EKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR0RFTlNJVFkpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUkFOR0VGT0dFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQU1CSUVOVCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DT0xPUlZFUlRFWCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dWRVJURVhNT0RFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NMSVBQSU5HKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0xJR0hUSU5HKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0xPQ0FMVklFV0VSKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0UpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQU1CSUVOVE1BVEVSSUFMU09VUkNFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TUEVDVUxBUk1BVEVSSUFMU09VUkNFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1ZFUlRFWEJMRU5EKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NMSVBQTEFORUVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTSVpFX01JTik7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNQUklURUVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFRU5BQkxFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVfQSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFX0IpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTQ0FMRV9DKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX01VTFRJU0FNUExFTUFTSyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QQVRDSEVER0VTVFlMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkVfTUFYKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0lOREVYRURWRVJURVhCTEVOREVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19UV0VFTkZBQ1RPUik7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT1NJVElPTkRFR1JFRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19OT1JNQUxERUdSRUUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfTUlOVEVTU0VMTEFUSU9OTEVWRUwpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfTUFYVEVTU0VMTEFUSU9OTEVWRUwpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQURBUFRJVkVURVNTX1gpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQURBUFRJVkVURVNTX1kpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQURBUFRJVkVURVNTX1opOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQURBUFRJVkVURVNTX1cpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRU5BQkxFQURBUFRJVkVURVNTRUxMQVRJT04pOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfTk9STUFMSVpFTk9STUFMUyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TUEVDVUxBUkVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TSEFERU1PREUpOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVZlcnRleFNhbXBsZXJTdGF0ZXMoKQorCXsKKwkJZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8PSBEM0RWRVJURVhURVhUVVJFU0FNUExFUjM7IHNhbXBsZXIrKykKKwkJeworCQkJY2FwdHVyZVNhbXBsZXJTdGF0ZShzYW1wbGVyLCBEM0RTQU1QX0RNQVBPRkZTRVQpOworCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlVmVydGV4VGV4dHVyZVN0YXRlcygpCisJeworCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQorCQl7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19URVhDT09SRElOREVYKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyk7CisJCX0KKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVOUGF0Y2hNb2RlKCkKKwl7CisJCW5QYXRjaE1vZGUgPSBkZXZpY2UtPkdldE5QYXRjaE1vZGUoKTsKKwkJblBhdGNoTW9kZUNhcHR1cmVkID0gdHJ1ZTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVMaWdodFN0YXRlcygpCisJeworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAorCQl7CisJCQlsb25nIHJlc3VsdCA9IGRldmljZS0+R2V0TGlnaHQoaW5kZXgsICZsaWdodFtpbmRleF0pOworCQkJbGlnaHRDYXB0dXJlZFtpbmRleF0gPSBTVUNDRUVERUQocmVzdWx0KTsKKwkJfQorCisJCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspICAgLy8gRklYTUU6IFN1cHBvcnQgdW5saW1pdGVkIGluZGV4CisJCXsKKwkJCWxpZ2h0RW5hYmxlU3RhdGVbaW5kZXhdID0gZmFsc2U7CisJCQlsb25nIHJlc3VsdCA9IGRldmljZS0+R2V0TGlnaHRFbmFibGUoaW5kZXgsICZsaWdodEVuYWJsZVN0YXRlW2luZGV4XSk7CisJCQlsaWdodEVuYWJsZUNhcHR1cmVkW2luZGV4XSA9IFNVQ0NFRURFRChyZXN1bHQpOworCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlVmVydGV4U2hhZGVyU3RhdGVzKCkKKwl7CisJCXZlcnRleFNoYWRlckNhcHR1cmVkID0gdHJ1ZTsKKwkJZGV2aWNlLT5HZXRWZXJ0ZXhTaGFkZXIocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5Kio+KCZ2ZXJ0ZXhTaGFkZXIpKTsKKwkJCisJCWlmKHZlcnRleFNoYWRlcikKKwkJeworCQkJdmVydGV4U2hhZGVyLT5iaW5kKCk7CisJCQl2ZXJ0ZXhTaGFkZXItPlJlbGVhc2UoKTsKKwkJfQorCisJCWRldmljZS0+R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKDAsIHZlcnRleFNoYWRlckNvbnN0YW50RlswXSwgMjU2KTsKKwkJZGV2aWNlLT5HZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkoMCwgdmVydGV4U2hhZGVyQ29uc3RhbnRJWzBdLCAxNik7CisJCWRldmljZS0+R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKDAsIHZlcnRleFNoYWRlckNvbnN0YW50QiwgMTYpOwkJCisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlU3RyZWFtU291cmNlRnJlcXVlbmNpZXMoKQorCXsKKwkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCAxNjsgc3RyZWFtKyspCisJCXsKKwkJCXN0cmVhbVNvdXJjZUZyZXF1ZW5jeUNhcHR1cmVkW3N0cmVhbV0gPSB0cnVlOworCQkJZGV2aWNlLT5HZXRTdHJlYW1Tb3VyY2VGcmVxKHN0cmVhbSwgJnN0cmVhbVNvdXJjZUZyZXF1ZW5jeVtzdHJlYW1dKTsKKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZUZWRigpCisJeworCQlkZXZpY2UtPkdldEZWRigmRlZGKTsKKwkJZnZmQ2FwdHVyZWQgPSB0cnVlOworCX0KKwkKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVWZXJ0ZXhEZWNsYXJhdGlvbigpCisJeworCQl2ZXJ0ZXhEZWNsYXJhdGlvbkNhcHR1cmVkID0gdHJ1ZTsKKwkJZGV2aWNlLT5HZXRWZXJ0ZXhEZWNsYXJhdGlvbihyZWludGVycHJldF9jYXN0PElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSoqPigmdmVydGV4RGVjbGFyYXRpb24pKTsKKworCQlpZih2ZXJ0ZXhEZWNsYXJhdGlvbikKKwkJeworCQkJdmVydGV4RGVjbGFyYXRpb24tPmJpbmQoKTsKKwkJCXZlcnRleERlY2xhcmF0aW9uLT5SZWxlYXNlKCk7CisJCX0KKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVUZXh0dXJlcygpCisJeworCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgMTYgKyA0OyBzYW1wbGVyKyspCisJCXsKKwkJCXRleHR1cmVDYXB0dXJlZFtzYW1wbGVyXSA9IHRydWU7CisJCQlpbnQgaW5kZXggPSBzYW1wbGVyIDwgMTYgPyBzYW1wbGVyIDogRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwICsgKHNhbXBsZXIgLSAxNik7CisJCQlkZXZpY2UtPkdldFRleHR1cmUoaW5kZXgsIHJlaW50ZXJwcmV0X2Nhc3Q8SURpcmVjdDNEQmFzZVRleHR1cmU5Kio+KCZ0ZXh0dXJlW3NhbXBsZXJdKSk7CisKKwkJCWlmKHRleHR1cmVbc2FtcGxlcl0pCisJCQl7CisJCQkJdGV4dHVyZVtzYW1wbGVyXS0+YmluZCgpOworCQkJCXRleHR1cmVbc2FtcGxlcl0tPlJlbGVhc2UoKTsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVRleHR1cmVQYWxldHRlKCkKKwl7CisJCXBhbGV0dGVOdW1iZXJDYXB0dXJlZCA9IHRydWU7CisJCWRldmljZS0+R2V0Q3VycmVudFRleHR1cmVQYWxldHRlKCZwYWxldHRlTnVtYmVyKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVWZXJ0ZXhTdHJlYW1zKCkKKwl7CisJCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgMTY7IHN0cmVhbSsrKQorCQl7CisJCQlzdHJlYW1Tb3VyY2VDYXB0dXJlZFtzdHJlYW1dID0gdHJ1ZTsKKwkJCWRldmljZS0+R2V0U3RyZWFtU291cmNlKHN0cmVhbSwgcmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5Kio+KCZzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIpLCAmc3RyZWFtU291cmNlW3N0cmVhbV0ub2Zmc2V0LCAmc3RyZWFtU291cmNlW3N0cmVhbV0uc3RyaWRlKTsKKwkJCQorCQkJaWYoc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyKQorCQkJeworCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlci0+YmluZCgpOworCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlci0+UmVsZWFzZSgpOworCQkJfQorCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlSW5kZXhCdWZmZXIoKQorCXsKKwkJaW5kZXhCdWZmZXJDYXB0dXJlZCA9IHRydWU7CisJCWRldmljZS0+R2V0SW5kaWNlcyhyZWludGVycHJldF9jYXN0PElEaXJlY3QzREluZGV4QnVmZmVyOSoqPigmaW5kZXhCdWZmZXIpKTsKKworCQlpZihpbmRleEJ1ZmZlcikKKwkJeworCQkJaW5kZXhCdWZmZXItPmJpbmQoKTsKKwkJCWluZGV4QnVmZmVyLT5SZWxlYXNlKCk7CisJCX0KKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVWaWV3cG9ydCgpCisJeworCQlkZXZpY2UtPkdldFZpZXdwb3J0KCZ2aWV3cG9ydCk7CisJCXZpZXdwb3J0Q2FwdHVyZWQgPSB0cnVlOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVNjaXNzb3JSZWN0YW5nbGUoKQorCXsKKwkJZGV2aWNlLT5HZXRTY2lzc29yUmVjdCgmc2Npc3NvclJlY3QpOworCQlzY2lzc29yUmVjdENhcHR1cmVkID0gdHJ1ZTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVUcmFuc2Zvcm1zKCkKKwl7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVklFVyk7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfUFJPSkVDVElPTik7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfV09STEQpOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVRleHR1cmVUcmFuc2Zvcm1zKCkKKwl7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTApOworCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUxKTsKKwkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFMik7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTMpOworCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU0KTsKKwkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFNSk7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTYpOworCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU3KTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVDbGlwcGluZ1BsYW5lcygpCisJeworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCsrKQorCQl7CisJCQlkZXZpY2UtPkdldENsaXBQbGFuZShpbmRleCwgKGZsb2F0KikmY2xpcFBsYW5lW2luZGV4XSk7CisJCQljbGlwUGxhbmVDYXB0dXJlZFtpbmRleF0gPSB0cnVlOworCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlTWF0ZXJpYWwoKQorCXsKKwkJZGV2aWNlLT5HZXRNYXRlcmlhbCgmbWF0ZXJpYWwpOworCQltYXRlcmlhbENhcHR1cmVkID0gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFN0YXRlQmxvY2s5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEU3RhdGVCbG9jazkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTRlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzRFN0YXRlQmxvY2s5LmhwcApAQCAtMCwwICsxLDE5NSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0RTdGF0ZUJsb2NrOV9ocHAKKyNkZWZpbmUgRDNEOV9EaXJlY3QzRFN0YXRlQmxvY2s5X2hwcAorCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxkM2Q5Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJY2xhc3MgRGlyZWN0M0REZXZpY2U5OworCWNsYXNzIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OworCWNsYXNzIERpcmVjdDNESW5kZXhCdWZmZXI5OworCWNsYXNzIERpcmVjdDNEVmVydGV4QnVmZmVyOTsKKwljbGFzcyBEaXJlY3QzREJhc2VUZXh0dXJlOTsKKwljbGFzcyBEaXJlY3QzRFBpeGVsU2hhZGVyOTsKKwljbGFzcyBEaXJlY3QzRFZlcnRleFNoYWRlcjk7CisKKwljbGFzcyBEaXJlY3QzRFN0YXRlQmxvY2s5IDogcHVibGljIElEaXJlY3QzRFN0YXRlQmxvY2s5LCBwdWJsaWMgVW5rbm93bgorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEU3RhdGVCbG9jazkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFNUQVRFQkxPQ0tUWVBFIHR5cGUpOworCisJCXZpcnR1YWwgfkRpcmVjdDNEU3RhdGVCbG9jazkoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RTdGF0ZUJsb2NrOSBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIEFwcGx5KCk7CisJCWxvbmcgX19zdGRjYWxsIENhcHR1cmUoKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpOworCisJCS8vIEludGVybmFsIG1ldGhvZHMKKwkJdm9pZCBsaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgZW5hYmxlKTsKKwkJdm9pZCBzZXRDbGlwUGxhbmUodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgZmxvYXQgKnBsYW5lKTsKKwkJdm9pZCBzZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIpOworCQl2b2lkIHNldEZWRih1bnNpZ25lZCBsb25nIEZWRik7CisJCXZvaWQgc2V0SW5kaWNlcyhEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhEYXRhKTsKKwkJdm9pZCBzZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBEM0RMSUdIVDkgKmxpZ2h0KTsKKwkJdm9pZCBzZXRNYXRlcmlhbChjb25zdCBEM0RNQVRFUklBTDkgKm1hdGVyaWFsKTsKKwkJdm9pZCBzZXROUGF0Y2hNb2RlKGZsb2F0IHNlZ21lbnRzKTsKKwkJdm9pZCBzZXRQaXhlbFNoYWRlcihEaXJlY3QzRFBpeGVsU2hhZGVyOSAqc2hhZGVyKTsKKwkJdm9pZCBzZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCXZvaWQgc2V0UGl4ZWxTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCXZvaWQgc2V0UGl4ZWxTaGFkZXJDb25zdGFudEkodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOworCQl2b2lkIHNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CisJCXZvaWQgc2V0U2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCQl2b2lkIHNldFNjaXNzb3JSZWN0KGNvbnN0IFJFQ1QgKnJlY3QpOworCQl2b2lkIHNldFN0cmVhbVNvdXJjZSh1bnNpZ25lZCBpbnQgc3RyZWFtLCBEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzdHJpZGUpOworCQl2b2lkIHNldFN0cmVhbVNvdXJjZUZyZXEodW5zaWduZWQgaW50IHN0cmVhbU51bWJlciwgdW5zaWduZWQgaW50IGRpdmlkZXIpOworCQl2b2lkIHNldFRleHR1cmUodW5zaWduZWQgbG9uZyBpbmRleCwgRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmUpOworCQl2b2lkIHNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKKwkJdm9pZCBzZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCk7CisJCXZvaWQgc2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCk7CisJCXZvaWQgc2V0VmVydGV4RGVjbGFyYXRpb24oRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmRlY2xhcmF0aW9uKTsKKwkJdm9pZCBzZXRWZXJ0ZXhTaGFkZXIoRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICpzaGFkZXIpOworCQl2b2lkIHNldFZlcnRleFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCXZvaWQgc2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOworCQl2b2lkIHNldFZlcnRleFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisKKwlwcml2YXRlOgorCQkvLyBJbmRpdmlkdWFsIHN0YXRlcworCQl2b2lkIGNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUpOworCQl2b2lkIGNhcHR1cmVTYW1wbGVyU3RhdGUodW5zaWduZWQgbG9uZyBpbmRleCwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSk7CisJCXZvaWQgY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlKTsKKwkJdm9pZCBjYXB0dXJlVHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSk7CisKKwkJLy8gUGl4ZWwgc3RhdGVzCisJCXZvaWQgY2FwdHVyZVBpeGVsUmVuZGVyU3RhdGVzKCk7CisJCXZvaWQgY2FwdHVyZVBpeGVsVGV4dHVyZVN0YXRlcygpOworCQl2b2lkIGNhcHR1cmVQaXhlbFNhbXBsZXJTdGF0ZXMoKTsKKwkJdm9pZCBjYXB0dXJlUGl4ZWxTaGFkZXJTdGF0ZXMoKTsKKwkKKwkJLy8gVmVydGV4IHN0YXRlcworCQl2b2lkIGNhcHR1cmVWZXJ0ZXhSZW5kZXJTdGF0ZXMoKTsKKwkJdm9pZCBjYXB0dXJlVmVydGV4U2FtcGxlclN0YXRlcygpOworCQl2b2lkIGNhcHR1cmVWZXJ0ZXhUZXh0dXJlU3RhdGVzKCk7CisJCXZvaWQgY2FwdHVyZU5QYXRjaE1vZGUoKTsKKwkJdm9pZCBjYXB0dXJlTGlnaHRTdGF0ZXMoKTsKKwkJdm9pZCBjYXB0dXJlVmVydGV4U2hhZGVyU3RhdGVzKCk7CisJCXZvaWQgY2FwdHVyZVN0cmVhbVNvdXJjZUZyZXF1ZW5jaWVzKCk7CisJCXZvaWQgY2FwdHVyZVZlcnRleERlY2xhcmF0aW9uKCk7CisJCXZvaWQgY2FwdHVyZUZWRigpOworCQorCQkvLyBBbGwgKHJlbWFpbmluZykgc3RhdGVzCisJCXZvaWQgY2FwdHVyZVRleHR1cmVzKCk7CisJCXZvaWQgY2FwdHVyZVRleHR1cmVQYWxldHRlKCk7CisJCXZvaWQgY2FwdHVyZVZlcnRleFN0cmVhbXMoKTsKKwkJdm9pZCBjYXB0dXJlSW5kZXhCdWZmZXIoKTsKKwkJdm9pZCBjYXB0dXJlVmlld3BvcnQoKTsKKwkJdm9pZCBjYXB0dXJlU2Npc3NvclJlY3RhbmdsZSgpOworCQl2b2lkIGNhcHR1cmVUcmFuc2Zvcm1zKCk7CisJCXZvaWQgY2FwdHVyZVRleHR1cmVUcmFuc2Zvcm1zKCk7CisJCXZvaWQgY2FwdHVyZUNsaXBwaW5nUGxhbmVzKCk7CisJCXZvaWQgY2FwdHVyZU1hdGVyaWFsKCk7CisKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQlEaXJlY3QzRERldmljZTkgKmNvbnN0IGRldmljZTsKKwkJY29uc3QgRDNEU1RBVEVCTE9DS1RZUEUgdHlwZTsKKworCQkvLyBTdGF0ZSBkYXRhCisJCWJvb2wgdmVydGV4RGVjbGFyYXRpb25DYXB0dXJlZDsKKwkJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uOworCisJCWJvb2wgZnZmQ2FwdHVyZWQ7CisJCXVuc2lnbmVkIGxvbmcgRlZGOworCisJCWJvb2wgaW5kZXhCdWZmZXJDYXB0dXJlZDsKKwkJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4QnVmZmVyOworCisJCWJvb2wgcmVuZGVyU3RhdGVDYXB0dXJlZFtEM0RSU19CTEVORE9QQUxQSEEgKyAxXTsKKwkJdW5zaWduZWQgbG9uZyByZW5kZXJTdGF0ZVtEM0RSU19CTEVORE9QQUxQSEEgKyAxXTsKKworCQlib29sIG5QYXRjaE1vZGVDYXB0dXJlZDsKKwkJZmxvYXQgblBhdGNoTW9kZTsKKworCQlib29sIHRleHR1cmVTdGFnZVN0YXRlQ2FwdHVyZWRbOF1bRDNEVFNTX0NPTlNUQU5UICsgMV07CisJCXVuc2lnbmVkIGxvbmcgdGV4dHVyZVN0YWdlU3RhdGVbOF1bRDNEVFNTX0NPTlNUQU5UICsgMV07CisKKwkJYm9vbCBzYW1wbGVyU3RhdGVDYXB0dXJlZFsxNiArIDRdW0QzRFNBTVBfRE1BUE9GRlNFVCArIDFdOworCQl1bnNpZ25lZCBsb25nIHNhbXBsZXJTdGF0ZVsxNiArIDRdW0QzRFNBTVBfRE1BUE9GRlNFVCArIDFdOworCisJCWJvb2wgc3RyZWFtU291cmNlQ2FwdHVyZWRbMTZdOworCQlzdHJ1Y3QgU3RyZWFtU291cmNlCisJCXsKKwkJCURpcmVjdDNEVmVydGV4QnVmZmVyOSAqdmVydGV4QnVmZmVyOworCQkJdW5zaWduZWQgaW50IG9mZnNldDsKKwkJCXVuc2lnbmVkIGludCBzdHJpZGU7CisJCX07CisJCVN0cmVhbVNvdXJjZSBzdHJlYW1Tb3VyY2VbMTZdOworCisJCWJvb2wgc3RyZWFtU291cmNlRnJlcXVlbmN5Q2FwdHVyZWRbMTZdOworCQl1bnNpZ25lZCBpbnQgc3RyZWFtU291cmNlRnJlcXVlbmN5WzE2XTsKKworCQlib29sIHRleHR1cmVDYXB0dXJlZFsxNiArIDRdOworCQlEaXJlY3QzREJhc2VUZXh0dXJlOSAqdGV4dHVyZVsxNiArIDRdOworCisJCWJvb2wgdHJhbnNmb3JtQ2FwdHVyZWRbNTEyXTsKKwkJRDNETUFUUklYIHRyYW5zZm9ybVs1MTJdOworCisJCWJvb2wgbWF0ZXJpYWxDYXB0dXJlZDsKKwkJRDNETUFURVJJQUw5IG1hdGVyaWFsOworCisJCWJvb2wgbGlnaHRDYXB0dXJlZFs4XTsgICAvLyBGSVhNRTogVW5saW1pdGVkIGluZGV4CisJCUQzRExJR0hUOSBsaWdodFs4XTsKKworCQlib29sIGxpZ2h0RW5hYmxlQ2FwdHVyZWRbOF07ICAgLy8gRklYTUU6IFVubGltaXRlZCBpbmRleAorCQlpbnQgbGlnaHRFbmFibGVTdGF0ZVs4XTsKKworCQlib29sIHBpeGVsU2hhZGVyQ2FwdHVyZWQ7CisJCURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpwaXhlbFNoYWRlcjsKKworCQlib29sIHZlcnRleFNoYWRlckNhcHR1cmVkOworCQlEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnZlcnRleFNoYWRlcjsKKworCQlib29sIHZpZXdwb3J0Q2FwdHVyZWQ7CisJCUQzRFZJRVdQT1JUOSB2aWV3cG9ydDsKKworCQlmbG9hdCBwaXhlbFNoYWRlckNvbnN0YW50RlsyMjRdWzRdOworCQlpbnQgcGl4ZWxTaGFkZXJDb25zdGFudElbMTZdWzRdOworCQlpbnQgcGl4ZWxTaGFkZXJDb25zdGFudEJbMTZdOworCisJCWZsb2F0IHZlcnRleFNoYWRlckNvbnN0YW50RlsyNTZdWzRdOworCQlpbnQgdmVydGV4U2hhZGVyQ29uc3RhbnRJWzE2XVs0XTsKKwkJaW50IHZlcnRleFNoYWRlckNvbnN0YW50QlsxNl07CisKKwkJYm9vbCBjbGlwUGxhbmVDYXB0dXJlZFs2XTsKKwkJZmxvYXQgY2xpcFBsYW5lWzZdWzRdOworCisJCWJvb2wgc2Npc3NvclJlY3RDYXB0dXJlZDsKKwkJUkVDVCBzY2lzc29yUmVjdDsKKworCQlib29sIHBhbGV0dGVOdW1iZXJDYXB0dXJlZDsKKwkJdW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXI7CisKKwkJdm9pZCBjbGVhcigpOworCX07Cit9CisKKyNlbmRpZiAgIC8vIEQzRDlfRGlyZWN0M0RTdGF0ZUJsb2NrOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEU3VyZmFjZTkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0RTdXJmYWNlOS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0ZDE1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNEU3VyZmFjZTkuY3BwCkBAIC0wLDAgKzEsNDA0IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U5LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwIgorI2luY2x1ZGUgIkNhcGFiaWxpdGllcy5ocHAiCisjaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCitleHRlcm4gYm9vbCBxdWFkTGF5b3V0RW5hYmxlZDsKKworbmFtZXNwYWNlIEQzRDkKK3sKKwlzdzo6UmVzb3VyY2UgKmdldFBhcmVudFJlc291cmNlKFVua25vd24gKmNvbnRhaW5lcikKKwl7CisJCURpcmVjdDNEQmFzZVRleHR1cmU5ICpiYXNlVGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzREJhc2VUZXh0dXJlOSo+KGNvbnRhaW5lcik7CisKKwkJaWYoYmFzZVRleHR1cmUpCisJCXsKKwkJCXJldHVybiBiYXNlVGV4dHVyZS0+Z2V0UmVzb3VyY2UoKTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCWludCBzYW1wbGVDb3VudChEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCB1bnNpZ25lZCBpbnQgcXVhbGl0eSkKKwl7CisJCWlmKG11bHRpU2FtcGxlID09IEQzRE1VTFRJU0FNUExFX05PTk1BU0tBQkxFKQorCQl7CisJCQlzd2l0Y2gocXVhbGl0eSkKKwkJCXsKKwkJCWNhc2UgMDogcmV0dXJuIDI7CisJCQljYXNlIDE6IHJldHVybiA0OworCQkJY2FzZSAyOiByZXR1cm4gODsKKwkJCWNhc2UgMzogcmV0dXJuIDE2OworCQkJfQorCQl9CisJCWVsc2UgaWYobXVsdGlTYW1wbGUgPT0gRDNETVVMVElTQU1QTEVfMl9TQU1QTEVTKQorCQl7CisJCQlyZXR1cm4gMjsKKwkJfQorCQllbHNlIGlmKG11bHRpU2FtcGxlID09IEQzRE1VTFRJU0FNUExFXzRfU0FNUExFUykKKwkJeworCQkJcmV0dXJuIDQ7CisJCX0KKwkJZWxzZSBpZihtdWx0aVNhbXBsZSA9PSBEM0RNVUxUSVNBTVBMRV84X1NBTVBMRVMpCisJCXsKKwkJCXJldHVybiA4OworCQl9CisJCWVsc2UgaWYobXVsdGlTYW1wbGUgPT0gRDNETVVMVElTQU1QTEVfMTZfU0FNUExFUykKKwkJeworCQkJcmV0dXJuIDE2OworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJYm9vbCBpc0xvY2thYmxlKEQzRFBPT0wgcG9vbCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgYm9vbCBsb2NrYWJsZU92ZXJyaWRlKQorCXsKKwkJcmV0dXJuIChwb29sICE9IEQzRFBPT0xfREVGQVVMVCkgfHwgKHVzYWdlICYgRDNEVVNBR0VfRFlOQU1JQykgfHwgbG9ja2FibGVPdmVycmlkZTsKKwl9CisKKwlEaXJlY3QzRFN1cmZhY2U5OjpEaXJlY3QzRFN1cmZhY2U5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCBVbmtub3duICpjb250YWluZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCB1bnNpZ25lZCBpbnQgcXVhbGl0eSwgYm9vbCBsb2NrYWJsZU92ZXJyaWRlLCB1bnNpZ25lZCBsb25nIHVzYWdlKSA6IERpcmVjdDNEUmVzb3VyY2U5KGRldmljZSwgRDNEUlRZUEVfU1VSRkFDRSwgcG9vbCwgbWVtb3J5VXNhZ2Uod2lkdGgsIGhlaWdodCwgZm9ybWF0KSksIFN1cmZhY2UoZ2V0UGFyZW50UmVzb3VyY2UoY29udGFpbmVyKSwgd2lkdGgsIGhlaWdodCwgc2FtcGxlQ291bnQobXVsdGlTYW1wbGUsIHF1YWxpdHkpLCB0cmFuc2xhdGVGb3JtYXQoZm9ybWF0KSwgaXNMb2NrYWJsZShwb29sLCB1c2FnZSwgbG9ja2FibGVPdmVycmlkZSksICh1c2FnZSAmIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCkgfHwgKHVzYWdlICYgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKSksIGNvbnRhaW5lcihjb250YWluZXIpLCB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpLCBmb3JtYXQoZm9ybWF0KSwgcG9vbChwb29sKSwgbXVsdGlTYW1wbGUobXVsdGlTYW1wbGUpLCBxdWFsaXR5KHF1YWxpdHkpLCBsb2NrYWJsZShpc0xvY2thYmxlKHBvb2wsIHVzYWdlLCBsb2NrYWJsZU92ZXJyaWRlKSksIHVzYWdlKHVzYWdlKQorCXsKKwkJcGFyZW50VGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzREJhc2VUZXh0dXJlOSo+KGNvbnRhaW5lcik7CisJfQorCisJRGlyZWN0M0RTdXJmYWNlOTo6fkRpcmVjdDNEU3VyZmFjZTkoKQorCXsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEU3VyZmFjZTkgfHwKKwkJICAgaWlkID09IElJRF9JRGlyZWN0M0RSZXNvdXJjZTkgfHwKKwkJICAgaWlkID09IElJRF9JVW5rbm93bikKKwkJeworCQkJQWRkUmVmKCk7CisJCQkqb2JqZWN0ID0gdGhpczsKKworCQkJcmV0dXJuIFNfT0s7CisJCX0KKworCQkqb2JqZWN0ID0gMDsKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3VyZmFjZTk6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYocGFyZW50VGV4dHVyZSkKKwkJeworCQkJcmV0dXJuIHBhcmVudFRleHR1cmUtPkFkZFJlZigpOworCQl9CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpBZGRSZWYoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3VyZmFjZTk6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKHBhcmVudFRleHR1cmUpCisJCXsKKwkJCXJldHVybiBwYXJlbnRUZXh0dXJlLT5SZWxlYXNlKCk7CisJCX0KKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTk6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOworCX0KKworCWxvbmcgRGlyZWN0M0RTdXJmYWNlOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOworCX0KKworCXZvaWQgRGlyZWN0M0RTdXJmYWNlOTo6UHJlTG9hZCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJRGlyZWN0M0RSZXNvdXJjZTk6OlByZUxvYWQoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTk6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0RGV2aWNlKGRldmljZSk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFN1cmZhY2U5OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6U2V0UHJpb3JpdHkobmV3UHJpb3JpdHkpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RTdXJmYWNlOTo6R2V0UHJpb3JpdHkoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0UHJpb3JpdHkoKTsKKwl9CisKKwlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RTdXJmYWNlOTo6R2V0VHlwZSgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpHZXRUeXBlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFN1cmZhY2U5OjpHZXREQyhIREMgKmRldmljZUNvbnRleHQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRldmljZUNvbnRleHQpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN1cmZhY2U5OjpSZWxlYXNlREMoSERDIGRldmljZUNvbnRleHQpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN1cmZhY2U5OjpMb2NrUmVjdChEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCJEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCA9IDB4JTAuOHAsIGNvbnN0IFJFQ1QgKnJlY3QgPSAweCUwLjhwLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gJWQiLCBsb2NrZWRSZWN0LCByZWN0LCBmbGFncyk7CisKKwkJaWYoIWxvY2tlZFJlY3QpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJbG9ja2VkUmVjdC0+UGl0Y2ggPSAwOworCQlsb2NrZWRSZWN0LT5wQml0cyA9IDA7CisKKwkJaWYoIWxvY2thYmxlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWxvY2tlZFJlY3QtPlBpdGNoID0gZ2V0RXh0ZXJuYWxQaXRjaEIoKTsKKworCQlzdzo6TG9jayBsb2NrID0gc3c6OkxPQ0tfUkVBRFdSSVRFOworCisJCWlmKGZsYWdzICYgRDNETE9DS19ESVNDQVJEKQorCQl7CisJCQlsb2NrID0gc3c6OkxPQ0tfRElTQ0FSRDsKKwkJfQorCisJCWlmKGZsYWdzICYgRDNETE9DS19SRUFET05MWSkKKwkJeworCQkJbG9jayA9IHN3OjpMT0NLX1JFQURPTkxZOworCQl9CisKKwkJaWYocmVjdCkKKwkJeworCQkJbG9ja2VkUmVjdC0+cEJpdHMgPSBsb2NrRXh0ZXJuYWwocmVjdC0+bGVmdCwgcmVjdC0+dG9wLCAwLCBsb2NrLCBzdzo6UFVCTElDKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxvY2tlZFJlY3QtPnBCaXRzID0gbG9ja0V4dGVybmFsKDAsIDAsIDAsIGxvY2ssIHN3OjpQVUJMSUMpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTk6OlVubG9ja1JlY3QoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXVubG9ja0V4dGVybmFsKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTk6OkdldENvbnRhaW5lcihjb25zdCBJSUQgJmlpZCwgdm9pZCAqKmNvbnRhaW5lcikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighY29udGFpbmVyKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWxvbmcgcmVzdWx0ID0gdGhpcy0+Y29udGFpbmVyLT5RdWVyeUludGVyZmFjZShpaWQsIGNvbnRhaW5lcik7CisKKwkJaWYocmVzdWx0ID09IFNfT0spCisJCXsKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKworCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTk6OkdldERlc2MoRDNEU1VSRkFDRV9ERVNDICpkZXNjcmlwdGlvbikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighZGVzY3JpcHRpb24pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZGVzY3JpcHRpb24tPkZvcm1hdCA9IGZvcm1hdDsKKwkJZGVzY3JpcHRpb24tPlBvb2wgPSBwb29sOworCQlkZXNjcmlwdGlvbi0+VHlwZSA9IEQzRFJUWVBFX1NVUkZBQ0U7CisJCWRlc2NyaXB0aW9uLT5IZWlnaHQgPSBoZWlnaHQ7CisJCWRlc2NyaXB0aW9uLT5XaWR0aCA9IHdpZHRoOworCQlkZXNjcmlwdGlvbi0+TXVsdGlTYW1wbGVUeXBlID0gbXVsdGlTYW1wbGU7CisJCWRlc2NyaXB0aW9uLT5NdWx0aVNhbXBsZVF1YWxpdHkgPSBxdWFsaXR5OworCQlkZXNjcmlwdGlvbi0+VXNhZ2UgPSB1c2FnZTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCXN3OjpGb3JtYXQgRGlyZWN0M0RTdXJmYWNlOTo6dHJhbnNsYXRlRm9ybWF0KEQzREZPUk1BVCBmb3JtYXQpCisJeworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCSNpZiBTM1RDX1NVUFBPUlQKKwkJY2FzZSBEM0RGTVRfTlVMTDoJCQlyZXR1cm4gc3c6OkZPUk1BVF9OVUxMOworCQljYXNlIEQzREZNVF9EWFQxOgkJCXJldHVybiBzdzo6Rk9STUFUX0RYVDE7CisJCWNhc2UgRDNERk1UX0RYVDI6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRFhUMzsKKwkJY2FzZSBEM0RGTVRfRFhUMzoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EWFQzOworCQljYXNlIEQzREZNVF9EWFQ0OgkJCXJldHVybiBzdzo6Rk9STUFUX0RYVDU7CisJCWNhc2UgRDNERk1UX0RYVDU6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRFhUNTsKKwkJY2FzZSBEM0RGTVRfQVRJMToJCQlyZXR1cm4gc3c6OkZPUk1BVF9BVEkxOworCQljYXNlIEQzREZNVF9BVEkyOgkJCXJldHVybiBzdzo6Rk9STUFUX0FUSTI7CisJCSNlbmRpZgorCQljYXNlIEQzREZNVF9SM0czQjI6CQkJcmV0dXJuIHN3OjpGT1JNQVRfUjNHM0IyOworCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCXJldHVybiBzdzo6Rk9STUFUX0E4UjNHM0IyOworCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCXJldHVybiBzdzo6Rk9STUFUX1g0UjRHNEI0OworCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCXJldHVybiBzdzo6Rk9STUFUX0E0UjRHNEI0OworCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCXJldHVybiBzdzo6Rk9STUFUX0E4UjhHOEI4OworCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCXJldHVybiBzdzo6Rk9STUFUX0E4QjhHOFI4OworCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRzE2UjE2OworCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJcmV0dXJuIHN3OjpGT1JNQVRfQTJSMTBHMTBCMTA7CisJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglyZXR1cm4gc3c6OkZPUk1BVF9BMkIxMEcxMFIxMDsKKwkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglyZXR1cm4gc3c6OkZPUk1BVF9BMTZCMTZHMTZSMTY7CisJCWNhc2UgRDNERk1UX1A4OgkJCQlyZXR1cm4gc3c6OkZPUk1BVF9QODsKKwkJY2FzZSBEM0RGTVRfQThQODoJCQlyZXR1cm4gc3c6OkZPUk1BVF9BOFA4OworCQljYXNlIEQzREZNVF9BODoJCQkJcmV0dXJuIHN3OjpGT1JNQVRfQTg7CisJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlyZXR1cm4gc3c6OkZPUk1BVF9SNUc2QjU7CisJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJcmV0dXJuIHN3OjpGT1JNQVRfWDFSNUc1QjU7CisJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJcmV0dXJuIHN3OjpGT1JNQVRfQTFSNUc1QjU7CisJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlyZXR1cm4gc3c6OkZPUk1BVF9SOEc4Qjg7CisJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJcmV0dXJuIHN3OjpGT1JNQVRfWDhSOEc4Qjg7CisJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJcmV0dXJuIHN3OjpGT1JNQVRfWDhCOEc4Ujg7CisJCWNhc2UgRDNERk1UX1Y4VTg6CQkJcmV0dXJuIHN3OjpGT1JNQVRfVjhVODsKKwkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCXJldHVybiBzdzo6Rk9STUFUX0w2VjVVNTsKKwkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQlyZXR1cm4gc3c6OkZPUk1BVF9ROFc4VjhVODsKKwkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQlyZXR1cm4gc3c6OkZPUk1BVF9YOEw4VjhVODsKKwkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CXJldHVybiBzdzo6Rk9STUFUX0EyVzEwVjEwVTEwOworCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJcmV0dXJuIHN3OjpGT1JNQVRfVjE2VTE2OworCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CXJldHVybiBzdzo6Rk9STUFUX1ExNlcxNlYxNlUxNjsKKwkJY2FzZSBEM0RGTVRfTDg6CQkJCXJldHVybiBzdzo6Rk9STUFUX0w4OworCQljYXNlIEQzREZNVF9BNEw0OgkJCXJldHVybiBzdzo6Rk9STUFUX0E0TDQ7CisJCWNhc2UgRDNERk1UX0wxNjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9MMTY7CisJCWNhc2UgRDNERk1UX0E4TDg6CQkJcmV0dXJuIHN3OjpGT1JNQVRfQThMODsKKwkJY2FzZSBEM0RGTVRfUjE2RjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9SMTZGOworCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJcmV0dXJuIHN3OjpGT1JNQVRfRzE2UjE2RjsKKwkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJcmV0dXJuIHN3OjpGT1JNQVRfQTE2QjE2RzE2UjE2RjsKKwkJY2FzZSBEM0RGTVRfUjMyRjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9SMzJGOworCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJcmV0dXJuIHN3OjpGT1JNQVRfRzMyUjMyRjsKKwkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJcmV0dXJuIHN3OjpGT1JNQVRfQTMyQjMyRzMyUjMyRjsKKwkJY2FzZSBEM0RGTVRfRDE2OgkJCXJldHVybiBzdzo6Rk9STUFUX0QxNjsKKwkJY2FzZSBEM0RGTVRfRDMyOgkJCXJldHVybiBzdzo6Rk9STUFUX0QzMjsKKwkJY2FzZSBEM0RGTVRfRDI0WDg6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRDI0WDg7CisJCWNhc2UgRDNERk1UX0QyNFM4OgkJCXJldHVybiBzdzo6Rk9STUFUX0QyNFM4OworCQljYXNlIEQzREZNVF9EMjRGUzg6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRDI0RlM4OworCQljYXNlIEQzREZNVF9EMzJGX0xPQ0tBQkxFOglyZXR1cm4gc3c6OkZPUk1BVF9EMzJGX0xPQ0tBQkxFOworCQljYXNlIEQzREZNVF9ERjI0OgkJCXJldHVybiBzdzo6Rk9STUFUX0RGMjQ7CisJCWNhc2UgRDNERk1UX0RGMTY6CQkJcmV0dXJuIHN3OjpGT1JNQVRfREYxNjsKKwkJY2FzZSBEM0RGTVRfSU5UWjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9JTlRaOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiBzdzo6Rk9STUFUX05VTEw7CisJfQorCisJaW50IERpcmVjdDNEU3VyZmFjZTk6OmJ5dGVzKEQzREZPUk1BVCBmb3JtYXQpCisJeworCQlyZXR1cm4gU3VyZmFjZTo6Ynl0ZXModHJhbnNsYXRlRm9ybWF0KGZvcm1hdCkpOworCX0KKworCXVuc2lnbmVkIGludCBEaXJlY3QzRFN1cmZhY2U5OjptZW1vcnlVc2FnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQpCisJeworCQlyZXR1cm4gU3VyZmFjZTo6c2l6ZSh3aWR0aCwgaGVpZ2h0LCAxLCB0cmFuc2xhdGVGb3JtYXQoZm9ybWF0KSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RTdXJmYWNlOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzRFN1cmZhY2U5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjliZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RTdXJmYWNlOS5ocHAKQEAgLTAsMCArMSw3NyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0RTdXJmYWNlOV9ocHAKKyNkZWZpbmUgRDNEOV9EaXJlY3QzRFN1cmZhY2U5X2hwcAorCisjaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTkuaHBwIgorCisjaW5jbHVkZSAiU3VyZmFjZS5ocHAiCisKKyNpbmNsdWRlIDxkM2Q5Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJY2xhc3MgRGlyZWN0M0RCYXNlVGV4dHVyZTk7CisKKwljbGFzcyBEaXJlY3QzRFN1cmZhY2U5IDogcHVibGljIElEaXJlY3QzRFN1cmZhY2U5LCBwdWJsaWMgRGlyZWN0M0RSZXNvdXJjZTksIHB1YmxpYyBzdzo6U3VyZmFjZQorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEU3VyZmFjZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIFVua25vd24gKmNvbnRhaW5lciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGludCBxdWFsaXR5LCBib29sIGxvY2thYmxlT3ZlcnJpZGUsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpOworCisJCXZpcnR1YWwgfkRpcmVjdDNEU3VyZmFjZTkoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RSZXNvdXJjZTkgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCQl2b2lkIF9fc3RkY2FsbCBQcmVMb2FkKCk7CisJCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldFByaW9yaXR5KCk7CisJCUQzRFJFU09VUkNFVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpOworCisJCS8vIElEaXJlY3QzRFN1cmZhY2U5IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0REMoSERDICpkZXZpY2VDb250ZXh0KTsKKwkJbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZURDKEhEQyBkZXZpY2VDb250ZXh0KTsKKwkJbG9uZyBfX3N0ZGNhbGwgTG9ja1JlY3QoRDNETE9DS0VEX1JFQ1QgKmxvY2tlZFJlY3QsIGNvbnN0IFJFQ1QgKnJlY3QsIHVuc2lnbmVkIGxvbmcgRmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBVbmxvY2tSZWN0KCk7CisJCWxvbmcgX19zdGRjYWxsIEdldENvbnRhaW5lcihjb25zdCBJSUQgJmlpZCwgdm9pZCAqKmNvbnRhaW5lcik7CisJCWxvbmcgX19zdGRjYWxsIEdldERlc2MoRDNEU1VSRkFDRV9ERVNDICpkZXNjKTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCXN0YXRpYyBzdzo6Rm9ybWF0IHRyYW5zbGF0ZUZvcm1hdChEM0RGT1JNQVQgZm9ybWF0KTsKKwkJc3RhdGljIGludCBieXRlcyhEM0RGT1JNQVQgZm9ybWF0KTsKKworCXByaXZhdGU6CisJCXN0YXRpYyB1bnNpZ25lZCBpbnQgbWVtb3J5VXNhZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0KTsKKworCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCVVua25vd24gKmNvbnN0IGNvbnRhaW5lcjsKKwkJY29uc3QgaW50IHdpZHRoOworCQljb25zdCBpbnQgaGVpZ2h0OworCQljb25zdCBEM0RGT1JNQVQgZm9ybWF0OworCQljb25zdCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlOworCQljb25zdCB1bnNpZ25lZCBpbnQgcXVhbGl0eTsKKwkJY29uc3QgRDNEUE9PTCBwb29sOworCQljb25zdCBib29sIGxvY2thYmxlOworCQljb25zdCB1bnNpZ25lZCBsb25nIHVzYWdlOworCisJCURpcmVjdDNEQmFzZVRleHR1cmU5ICpwYXJlbnRUZXh0dXJlOworCX07Cit9CisKKyNlbmRpZiAvLyBEM0Q5X0RpcmVjdDNEU3VyZmFjZTlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFN3YXBDaGFpbjkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0RTd2FwQ2hhaW45LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWUxYzRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RTd2FwQ2hhaW45LmNwcApAQCAtMCwwICsxLDQwOCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiRGlyZWN0M0RTd2FwQ2hhaW45LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCisjaW5jbHVkZSAiUmVuZGVyZXIuaHBwIgorI2luY2x1ZGUgIlRpbWVyLmhwcCIKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiQ29uZmlndXJhdG9yLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlckRELmhwcCIKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlckdESS5ocHAiCisKK25hbWVzcGFjZSBEM0Q5Cit7CisJRGlyZWN0M0RTd2FwQ2hhaW45OjpEaXJlY3QzRFN3YXBDaGFpbjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpIDogZGV2aWNlKGRldmljZSksIHByZXNlbnRQYXJhbWV0ZXJzKCpwcmVzZW50UGFyYW1ldGVycykKKwl7CisJCWZyYW1lQnVmZmVyID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQorCQl7CisJCQliYWNrQnVmZmVyW2ldID0gMDsKKwkJfQorCisJCXJlc2V0KHByZXNlbnRQYXJhbWV0ZXJzKTsKKwl9CisKKwlEaXJlY3QzRFN3YXBDaGFpbjk6On5EaXJlY3QzRFN3YXBDaGFpbjkoKQorCXsKKwkJcmVsZWFzZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0RTd2FwQ2hhaW45OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFN3YXBDaGFpbjkgfHwKKwkJICAgaWlkID09IElJRF9JVW5rbm93bikKKwkJeworCQkJQWRkUmVmKCk7CisJCQkqb2JqZWN0ID0gdGhpczsKKworCQkJcmV0dXJuIFNfT0s7CisJCX0KKworCQkqb2JqZWN0ID0gMDsKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3dhcENoYWluOTo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjk6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjk6OlByZXNlbnQoY29uc3QgUkVDVCAqc291cmNlUmVjdCwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbiwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQkjaWYgUEVSRl9QUk9GSUxFCisJCQlwcm9maWxlci5uZXh0RnJhbWUoKTsKKwkJI2VuZGlmCisKKwkJI2lmIFBFUkZfSFVECisJCQlzdzo6UmVuZGVyZXIgKnJlbmRlcmVyID0gZGV2aWNlLT5yZW5kZXJlcjsKKworCQkJc3RhdGljIGludDY0X3QgZnJhbWUgPSBzdzo6VGltZXI6OnRpY2tzKCk7CisKKwkJCWludDY0X3QgZnJhbWVUaW1lID0gc3c6OlRpbWVyOjp0aWNrcygpIC0gZnJhbWU7CisJCQlmcmFtZSA9IHN3OjpUaW1lcjo6dGlja3MoKTsKKworCQkJaWYoZnJhbWVUaW1lID4gMCkKKwkJCXsKKwkJCQl1bnNpZ25lZCBpbnQgKmZyYW1lQnVmZmVyID0gKHVuc2lnbmVkIGludCopbG9ja0JhY2tCdWZmZXIoMCk7ICAgLy8gRklYTUU6IERvbid0IGFzc3VtZSBBOFI4RzhCOCBtb2RlCisJCQkJdW5zaWduZWQgaW50IHN0cmlkZSA9IGJhY2tCdWZmZXJbMF0tPmdldEludGVybmFsUGl0Y2hQKCk7CisKKwkJCQlpbnQgdGhyZWFkOworCQkJCWZvcih0aHJlYWQgPSAwOyB0aHJlYWQgPCByZW5kZXJlci0+Z2V0VGhyZWFkQ291bnQoKTsgdGhyZWFkKyspCisJCQkJeworCQkJCQlpbnQ2NF90IGRyYXdUaW1lID0gcmVuZGVyZXItPmdldFZlcnRleFRpbWUodGhyZWFkKSArIHJlbmRlcmVyLT5nZXRTZXR1cFRpbWUodGhyZWFkKSArIHJlbmRlcmVyLT5nZXRQaXhlbFRpbWUodGhyZWFkKTsKKworCQkJCQlpbnQgdmVydGV4UGVyY2VudGFnZSA9IHN3OjpjbGFtcCgoaW50KSgxMDAgKiByZW5kZXJlci0+Z2V0VmVydGV4VGltZSh0aHJlYWQpIC8gZnJhbWVUaW1lKSwgMCwgMTAwKTsKKwkJCQkJaW50IHNldHVwUGVyY2VudGFnZSA9IHN3OjpjbGFtcCgoaW50KSgxMDAgKiByZW5kZXJlci0+Z2V0U2V0dXBUaW1lKHRocmVhZCkgLyBmcmFtZVRpbWUpLCAwLCAxMDApOworCQkJCQlpbnQgcGl4ZWxQZXJjZW50YWdlID0gc3c6OmNsYW1wKChpbnQpKDEwMCAqIHJlbmRlcmVyLT5nZXRQaXhlbFRpbWUodGhyZWFkKSAvIGZyYW1lVGltZSksIDAsIDEwMCk7CisKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorCQkJCQl7CisJCQkJCQlmcmFtZUJ1ZmZlclt0aHJlYWQgKiBzdHJpZGUgKyBpXSA9IDB4MDAwMDAwMDA7CisJCQkJCX0KKworCQkJCQl1bnNpZ25lZCBpbnQgKmJ1ZmZlciA9IGZyYW1lQnVmZmVyOworCisJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB2ZXJ0ZXhQZXJjZW50YWdlOyBpKyspCisJCQkJCXsKKwkJCQkJCWJ1ZmZlclt0aHJlYWQgKiBzdHJpZGVdID0gMHgwMDAwMDBGRjsKKwkJCQkJCWJ1ZmZlcisrOworCQkJCQl9CisKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IHNldHVwUGVyY2VudGFnZTsgaSsrKQorCQkJCQl7CisJCQkJCQlidWZmZXJbdGhyZWFkICogc3RyaWRlXSA9IDB4MDAwMEZGMDA7CisJCQkJCQlidWZmZXIrKzsKKwkJCQkJfQorCisJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBwaXhlbFBlcmNlbnRhZ2U7IGkrKykKKwkJCQkJeworCQkJCQkJYnVmZmVyW3RocmVhZCAqIHN0cmlkZV0gPSAweDAwRkYwMDAwOworCQkJCQkJYnVmZmVyKys7CisJCQkJCX0KKworCQkJCQlmcmFtZUJ1ZmZlclt0aHJlYWQgKiBzdHJpZGUgKyAxMDBdID0gMHgwMEZGRkZGRjsKKwkJCQl9CisKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDw9IDEwMDsgaSsrKQorCQkJCXsKKwkJCQkJZnJhbWVCdWZmZXJbdGhyZWFkICogc3RyaWRlICsgaV0gPSAweDAwRkZGRkZGOworCQkJCX0KKworCQkJCXVubG9ja0JhY2tCdWZmZXIoMCk7CisJCQl9CisKKwkJCXJlbmRlcmVyLT5yZXNldFRpbWVycygpOworCQkjZW5kaWYKKworCQlIV05EIHdpbmRvdyA9IGRlc3RXaW5kb3dPdmVycmlkZSA/IGRlc3RXaW5kb3dPdmVycmlkZSA6IHByZXNlbnRQYXJhbWV0ZXJzLmhEZXZpY2VXaW5kb3c7CisJCXZvaWQgKnNvdXJjZSA9IGJhY2tCdWZmZXJbMF0tPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19SRUFET05MWSwgc3c6OlBVQkxJQyk7ICAgLy8gRklYTUU6IEV4dGVybmFsCisJCWJvb2wgSERSID0gYmFja0J1ZmZlclswXS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSA9PSBzdzo6Rk9STUFUX0ExNkIxNkcxNlIxNjsKKworCQlQT0lOVCBwb2ludDsKKwkJR2V0Q3Vyc29yUG9zKCZwb2ludCk7CisJCVNjcmVlblRvQ2xpZW50KHdpbmRvdywgJnBvaW50KTsKKworCQlmcmFtZUJ1ZmZlci0+c2V0Q3Vyc29yUG9zaXRpb24ocG9pbnQueCwgcG9pbnQueSk7CisKKwkJaWYoIXNvdXJjZVJlY3QgJiYgIWRlc3RSZWN0KSAgIC8vIEZJWE1FOiBNb3JlIGNhc2VzPworCQl7CisJCQlmcmFtZUJ1ZmZlci0+ZmxpcCh3aW5kb3csIHNvdXJjZSwgSERSKTsKKwkJfQorCQllbHNlICAgLy8gRklYTUU6IENoZWNrIGZvciBTV0FQRUZGRUNUX0NPUFkKKwkJeworCQkJc3c6OlJlY3Qgc1JlY3QgPSB7MH07CisJCQlzdzo6UmVjdCBkUmVjdCA9IHswfTsKKworCQkJaWYoc291cmNlUmVjdCkKKwkJCXsKKwkJCQlzUmVjdC5sZWZ0ID0gc291cmNlUmVjdC0+bGVmdDsKKwkJCQlzUmVjdC50b3AgPSBzb3VyY2VSZWN0LT50b3A7CisJCQkJc1JlY3QucmlnaHQgPSBzb3VyY2VSZWN0LT5yaWdodDsKKwkJCQlzUmVjdC5ib3R0b20gPSBzb3VyY2VSZWN0LT5ib3R0b207CisJCQl9CisKKwkJCWlmKGRlc3RSZWN0KQorCQkJeworCQkJCWRSZWN0LmxlZnQgPSBkZXN0UmVjdC0+bGVmdDsKKwkJCQlkUmVjdC50b3AgPSBkZXN0UmVjdC0+dG9wOworCQkJCWRSZWN0LnJpZ2h0ID0gZGVzdFJlY3QtPnJpZ2h0OworCQkJCWRSZWN0LmJvdHRvbSA9IGRlc3RSZWN0LT5ib3R0b207CisJCQl9CisKKwkJCWZyYW1lQnVmZmVyLT5ibGl0KHdpbmRvdywgc291cmNlLCBzb3VyY2VSZWN0ID8gJnNSZWN0IDogMCwgZGVzdFJlY3QgPyAmZFJlY3QgOiAwLCBIRFIpOworCQl9CisKKwkJYmFja0J1ZmZlclswXS0+dW5sb2NrSW50ZXJuYWwoKTsgICAvLyBGSVhNRTogRXh0ZXJuYWwKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RTd2FwQ2hhaW45OjpHZXRGcm9udEJ1ZmZlckRhdGEoSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXN0U3VyZmFjZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKwkJCisJCXN3OjpTdXJmYWNlICpkZXN0ID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOSo+KGRlc3RTdXJmYWNlKTsKKwkJdm9pZCAqYnVmZmVyID0gZGVzdC0+bG9ja0V4dGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX1dSSVRFT05MWSwgc3c6OlBSSVZBVEUpOworCisJCWZyYW1lQnVmZmVyLT5zY3JlZW5zaG90KGJ1ZmZlcik7CisKKwkJZGVzdC0+dW5sb2NrRXh0ZXJuYWwoKTsKKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjk6OkdldEJhY2tCdWZmZXIodW5zaWduZWQgaW50IGluZGV4LCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSwgSURpcmVjdDNEU3VyZmFjZTkgKipiYWNrQnVmZmVyKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFiYWNrQnVmZmVyLyogfHwgdHlwZSAhPSBEM0RCQUNLQlVGRkVSX1RZUEVfTU9OTyovKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpiYWNrQnVmZmVyID0gMDsKKworCQlpZihpbmRleCA+PSAzIHx8IHRoaXMtPmJhY2tCdWZmZXJbaW5kZXhdID09IDApCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKmJhY2tCdWZmZXIgPSB0aGlzLT5iYWNrQnVmZmVyW2luZGV4XTsKKwkJdGhpcy0+YmFja0J1ZmZlcltpbmRleF0tPkFkZFJlZigpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjk6OkdldFJhc3RlclN0YXR1cyhEM0RSQVNURVJfU1RBVFVTICpyYXN0ZXJTdGF0dXMpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoIXJhc3RlclN0YXR1cykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlib29sIGluVmVydGljYWxCbGFuazsKKwkJdW5zaWduZWQgaW50IHNjYW5saW5lOworCQlib29sIHN1cHBvcnRlZCA9IGZyYW1lQnVmZmVyLT5nZXRTY2FubGluZShpblZlcnRpY2FsQmxhbmssIHNjYW5saW5lKTsKKworCQlpZihzdXBwb3J0ZWQpCisJCXsKKwkJCXJhc3RlclN0YXR1cy0+SW5WQmxhbmsgPSBpblZlcnRpY2FsQmxhbms7CisJCQlyYXN0ZXJTdGF0dXMtPlNjYW5MaW5lID0gc2NhbmxpbmU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjk6OkdldERpc3BsYXlNb2RlKEQzRERJU1BMQVlNT0RFICpkaXNwbGF5TW9kZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighZGlzcGxheU1vZGUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZGV2aWNlLT5nZXRBZGFwdGVyRGlzcGxheU1vZGUoRDNEQURBUFRFUl9ERUZBVUxULCBkaXNwbGF5TW9kZSk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEU3dhcENoYWluOTo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcy0+ZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRldmljZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQl0aGlzLT5kZXZpY2UtPkFkZFJlZigpOworCQkqZGV2aWNlID0gdGhpcy0+ZGV2aWNlOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjk6OkdldFByZXNlbnRQYXJhbWV0ZXJzKEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoIXByZXNlbnRQYXJhbWV0ZXJzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpwcmVzZW50UGFyYW1ldGVycyA9IHRoaXMtPnByZXNlbnRQYXJhbWV0ZXJzOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjk6OnJlc2V0KEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpCisJeworCQlyZWxlYXNlKCk7CisKKwkJQVNTRVJUKHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyQ291bnQgPD0gMyk7ICAgLy8gTWF4aW11bSBvZiB0aHJlZSBiYWNrIGJ1ZmZlcnMKKworCQlpZihwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckNvdW50ID09IDApCisJCXsKKwkJCXByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyQ291bnQgPSAxOworCQl9CisKKwkJaWYocHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJGb3JtYXQgPT0gRDNERk1UX1VOS05PV04pCisJCXsKKwkJCUQzRERJU1BMQVlNT0RFIGRpc3BsYXlNb2RlOworCQkJR2V0RGlzcGxheU1vZGUoJmRpc3BsYXlNb2RlKTsKKworCQkJcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJGb3JtYXQgPSBkaXNwbGF5TW9kZS5Gb3JtYXQ7CisJCX0KKworCQlEM0RERVZJQ0VfQ1JFQVRJT05fUEFSQU1FVEVSUyBjcmVhdGlvblBhcmFtZXRlcnM7CisJCWRldmljZS0+R2V0Q3JlYXRpb25QYXJhbWV0ZXJzKCZjcmVhdGlvblBhcmFtZXRlcnMpOworCisJCUhXTkQgd2luZG93SGFuZGxlID0gcHJlc2VudFBhcmFtZXRlcnMtPmhEZXZpY2VXaW5kb3cgPyBwcmVzZW50UGFyYW1ldGVycy0+aERldmljZVdpbmRvdyA6IGNyZWF0aW9uUGFyYW1ldGVycy5oRm9jdXNXaW5kb3c7CisKKwkJaWYocHJlc2VudFBhcmFtZXRlcnMtPldpbmRvd2VkICYmIChwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckhlaWdodCA9PSAwIHx8IHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyV2lkdGggPT0gMCkpCisJCXsKKwkJCVJFQ1QgcmVjdGFuZ2xlOworCQkJR2V0Q2xpZW50UmVjdCh3aW5kb3dIYW5kbGUsICZyZWN0YW5nbGUpOworCisJCQlwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoID0gcmVjdGFuZ2xlLnJpZ2h0IC0gcmVjdGFuZ2xlLmxlZnQ7CisJCQlwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckhlaWdodCA9IHJlY3RhbmdsZS5ib3R0b20gLSByZWN0YW5nbGUudG9wOworCQl9CisKKwkJbG9ja2FibGUgPSBwcmVzZW50UGFyYW1ldGVycy0+RmxhZ3MgJiBEM0RQUkVTRU5URkxBR19MT0NLQUJMRV9CQUNLQlVGRkVSOworCisJCXN3OjpDb25maWd1cmF0b3IgaW5pKCJTd2lmdFNoYWRlci5pbmkiKTsKKwkJaW50IGFwaSA9IGluaS5nZXRJbnRlZ2VyKCJUZXN0aW5nIiwgIkZyYW1lQnVmZmVyQVBJIiwgMCk7CisKKwkJaWYoYXBpID09IDApCisJCXsKKwkJCWZyYW1lQnVmZmVyID0gbmV3IHN3OjpGcmFtZUJ1ZmZlckREKHdpbmRvd0hhbmRsZSwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJXaWR0aCwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQsIHByZXNlbnRQYXJhbWV0ZXJzLT5XaW5kb3dlZCA9PSBGQUxTRSk7CisJCX0KKwkJZWxzZSBpZihhcGkgPT0gMSkKKwkJeworCQkJZnJhbWVCdWZmZXIgPSBuZXcgc3c6OkZyYW1lQnVmZmVyR0RJKHdpbmRvd0hhbmRsZSwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJXaWR0aCwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQsIHByZXNlbnRQYXJhbWV0ZXJzLT5XaW5kb3dlZCA9PSBGQUxTRSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCisJCWJhY2tCdWZmZXJbMF0gPSAwOworCQliYWNrQnVmZmVyWzFdID0gMDsKKwkJYmFja0J1ZmZlclsyXSA9IDA7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IChpbnQpcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudDsgaSsrKQorCQl7CisJCQliYWNrQnVmZmVyW2ldID0gbmV3IERpcmVjdDNEU3VyZmFjZTkoZGV2aWNlLCB0aGlzLCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoLCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckhlaWdodCwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJGb3JtYXQsIEQzRFBPT0xfREVGQVVMVCwgcHJlc2VudFBhcmFtZXRlcnMtPk11bHRpU2FtcGxlVHlwZSwgcHJlc2VudFBhcmFtZXRlcnMtPk11bHRpU2FtcGxlUXVhbGl0eSwgbG9ja2FibGUsIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCk7CisJCQliYWNrQnVmZmVyW2ldLT5iaW5kKCk7CisJCX0KKworCQl0aGlzLT5wcmVzZW50UGFyYW1ldGVycyA9ICpwcmVzZW50UGFyYW1ldGVyczsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3dhcENoYWluOTo6cmVsZWFzZSgpCisJeworCQlkZWxldGUgZnJhbWVCdWZmZXI7CisJCWZyYW1lQnVmZmVyID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQorCQl7CisJCQlpZihiYWNrQnVmZmVyW2ldKQorCQkJeworCQkJCWJhY2tCdWZmZXJbaV0tPnVuYmluZCgpOworCQkJCWJhY2tCdWZmZXJbaV0gPSAwOworCQkJfQorCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjk6OnNldEdhbW1hUmFtcChzdzo6R2FtbWFSYW1wICpnYW1tYVJhbXAsIGJvb2wgY2FsaWJyYXRlKQorCXsKKwkJZnJhbWVCdWZmZXItPnNldEdhbW1hUmFtcChnYW1tYVJhbXAsIGNhbGlicmF0ZSk7CisJfQorCisJdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjk6OmdldEdhbW1hUmFtcChzdzo6R2FtbWFSYW1wICpnYW1tYVJhbXApCisJeworCQlmcmFtZUJ1ZmZlci0+Z2V0R2FtbWFSYW1wKGdhbW1hUmFtcCk7CisJfQorCisJdm9pZCAqRGlyZWN0M0RTd2FwQ2hhaW45Ojpsb2NrQmFja0J1ZmZlcihpbnQgaW5kZXgpCisJeworCQlyZXR1cm4gYmFja0J1ZmZlcltpbmRleF0tPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19SRUFEV1JJVEUsIHN3OjpQVUJMSUMpOyAgIC8vIEZJWE1FOiBFeHRlcm5hbAorCX0KKwkKKwl2b2lkIERpcmVjdDNEU3dhcENoYWluOTo6dW5sb2NrQmFja0J1ZmZlcihpbnQgaW5kZXgpCisJeworCQliYWNrQnVmZmVyW2luZGV4XS0+dW5sb2NrSW50ZXJuYWwoKTsgICAvLyBGSVhNRTogRXh0ZXJuYWwKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFN3YXBDaGFpbjkuaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0RTd2FwQ2hhaW45LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjZmMzAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RTd2FwQ2hhaW45LmhwcApAQCAtMCwwICsxLDczIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgRDNEOV9EaXJlY3QzRFN3YXBDaGFpbjlfaHBwCisjZGVmaW5lIEQzRDlfRGlyZWN0M0RTd2FwQ2hhaW45X2hwcAorCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U5LmhwcCIKKworI2luY2x1ZGUgIkZyYW1lQnVmZmVyLmhwcCIKKworI2luY2x1ZGUgPGQzZDkuaD4KKworbmFtZXNwYWNlIEQzRDkKK3sKKwljbGFzcyBEaXJlY3QzRERldmljZTk7CisKKwljbGFzcyBEaXJlY3QzRFN3YXBDaGFpbjkgOiBwdWJsaWMgSURpcmVjdDNEU3dhcENoYWluOSwgcHVibGljIFVua25vd24KKwl7CisJcHVibGljOgorCQlEaXJlY3QzRFN3YXBDaGFpbjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpOworCisJCXZpcnR1YWwgfkRpcmVjdDNEU3dhcENoYWluOSgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIElEaXJlY3QzRFN3YXBDaGFpbjkgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBQcmVzZW50KGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBIV05EIGRlc3RXaW5kb3dPdmVycmlkZSwgY29uc3QgUkdOREFUQSAqZGlydHlSZWdpb24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBHZXRGcm9udEJ1ZmZlckRhdGEoSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0QmFja0J1ZmZlcih1bnNpZ25lZCBpbnQgaW5kZXgsIEQzREJBQ0tCVUZGRVJfVFlQRSB0eXBlLCBJRGlyZWN0M0RTdXJmYWNlOSAqKmJhY2tCdWZmZXIpOworCQlsb25nIF9fc3RkY2FsbCBHZXRSYXN0ZXJTdGF0dXMoRDNEUkFTVEVSX1NUQVRVUyAqcmFzdGVyU3RhdHVzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGlzcGxheU1vZGUoRDNERElTUExBWU1PREUgKmRpc3BsYXlNb2RlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQcmVzZW50UGFyYW1ldGVycyhEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCXZvaWQgcmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyk7CisKKwkJdm9pZCBzZXRHYW1tYVJhbXAoc3c6OkdhbW1hUmFtcCAqZ2FtbWFSYW1wLCBib29sIGNhbGlicmF0ZSk7CisJCXZvaWQgZ2V0R2FtbWFSYW1wKHN3OjpHYW1tYVJhbXAgKmdhbW1hUmFtcCk7CisKKwkJdm9pZCAqbG9ja0JhY2tCdWZmZXIoaW50IGluZGV4KTsKKwkJdm9pZCB1bmxvY2tCYWNrQnVmZmVyKGludCBpbmRleCk7CisKKwlwcml2YXRlOgorCQl2b2lkIHJlbGVhc2UoKTsKKworCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCURpcmVjdDNERGV2aWNlOSAqY29uc3QgZGV2aWNlOworCQlEM0RQUkVTRU5UX1BBUkFNRVRFUlMgcHJlc2VudFBhcmFtZXRlcnM7CisKKwkJYm9vbCBsb2NrYWJsZTsKKworCQlzdzo6RnJhbWVCdWZmZXIgKmZyYW1lQnVmZmVyOworCisJcHVibGljOiAgIC8vIEZJWE1FCisJCURpcmVjdDNEU3VyZmFjZTkgKmJhY2tCdWZmZXJbM107CisJfTsKK30KKworI2VuZGlmIC8vIEQzRDlfRGlyZWN0M0RTd2FwQ2hhaW45X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RUZXh0dXJlOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRFRleHR1cmU5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTJmMWMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RUZXh0dXJlOS5jcHAKQEAgLTAsMCArMSwzMTUgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNEVGV4dHVyZTkuaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U5LmhwcCIKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJRGlyZWN0M0RUZXh0dXJlOTo6RGlyZWN0M0RUZXh0dXJlOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpIDogRGlyZWN0M0RCYXNlVGV4dHVyZTkoZGV2aWNlLCBEM0RSVFlQRV9URVhUVVJFLCBmb3JtYXQsIHBvb2wsIGxldmVscywgdXNhZ2UpLCB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpCisJeworCQlpZihsZXZlbHMgPT0gMCkKKwkJeworCQkJdGhpcy0+bGV2ZWxzID0gc3c6OmxvZzIoc3c6Om1heCgoaW50KXdpZHRoLCAoaW50KWhlaWdodCwgMSkpICsgMTsKKwkJfQorCisJCWZvcih1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IE1JUE1BUF9MRVZFTFM7IGxldmVsKyspCisJCXsKKwkJCWlmKGxldmVsIDwgdGhpcy0+bGV2ZWxzKQorCQkJeworCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0gPSBuZXcgRGlyZWN0M0RTdXJmYWNlOShkZXZpY2UsIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgcG9vbCwgRDNETVVMVElTQU1QTEVfTk9ORSwgMCwgZmFsc2UsIHVzYWdlKTsKKwkJCQlzdXJmYWNlTGV2ZWxbbGV2ZWxdLT5iaW5kKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3VyZmFjZUxldmVsW2xldmVsXSA9IDA7CisJCQl9CisKKwkJCXdpZHRoID0gc3c6Om1heCgxLCAoaW50KXdpZHRoIC8gMik7CisJCQloZWlnaHQgPSBzdzo6bWF4KDEsIChpbnQpaGVpZ2h0IC8gMik7CisJCX0KKwl9CisKKwlEaXJlY3QzRFRleHR1cmU5Ojp+RGlyZWN0M0RUZXh0dXJlOSgpCisJeworCQlyZXNvdXJjZS0+bG9jayhzdzo6REVTVFJVQ1QpOworCisJCWZvcihpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IE1JUE1BUF9MRVZFTFM7IGxldmVsKyspCisJCXsKKwkJCWlmKHN1cmZhY2VMZXZlbFtsZXZlbF0pCisJCQl7CisJCQkJc3VyZmFjZUxldmVsW2xldmVsXS0+dW5iaW5kKCk7CisJCQkJc3VyZmFjZUxldmVsW2xldmVsXSA9IDA7CisJCQl9CisJCX0KKworCQlyZXNvdXJjZS0+dW5sb2NrKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFRleHR1cmU5IHx8CisJCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEQmFzZVRleHR1cmU5IHx8CisJCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U5IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6QWRkUmVmKCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpSZWxlYXNlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVGV4dHVyZTk6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOworCX0KKworCWxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOworCX0KKworCXZvaWQgRGlyZWN0M0RUZXh0dXJlOTo6UHJlTG9hZCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlByZUxvYWQoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVGV4dHVyZTk6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVGV4dHVyZTk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7CisKKwkJVFJBQ0UoIklEaXJlY3QzRERldmljZTkgKipkZXZpY2UgPSAweCUwLjhwIiwgZGV2aWNlKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldERldmljZShkZXZpY2UpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5ID0gJWQiLCBuZXdQcmlvcml0eSk7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRQcmlvcml0eShuZXdQcmlvcml0eSk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpHZXRQcmlvcml0eSgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRQcmlvcml0eSgpOworCX0KKworCUQzRFJFU09VUkNFVFlQRSBEaXJlY3QzRFRleHR1cmU5OjpHZXRUeXBlKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFR5cGUoKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEVGV4dHVyZTk6OkdlbmVyYXRlTWlwU3ViTGV2ZWxzKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighKHVzYWdlICYgRDNEVVNBR0VfQVVUT0dFTk1JUE1BUCkgfHwgIXN1cmZhY2VMZXZlbFswXS0+aGFzRGlydHlNaXBtYXBzKCkpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlc291cmNlLT5sb2NrKHN3OjpQVUJMSUMpOworCisJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBsZXZlbHMgLSAxOyBpKyspCisJCXsKKwkJCWRldmljZS0+c3RyZXRjaFJlY3Qoc3VyZmFjZUxldmVsW2ldLCAwLCBzdXJmYWNlTGV2ZWxbaSArIDFdLCAwLCBHZXRBdXRvR2VuRmlsdGVyVHlwZSgpKTsKKwkJfQorCisJCXN1cmZhY2VMZXZlbFswXS0+Y2xlYW5NaXBtYXBzKCk7CisKKwkJcmVzb3VyY2UtPnVubG9jaygpOworCX0KKworCUQzRFRFWFRVUkVGSUxURVJUWVBFIERpcmVjdDNEVGV4dHVyZTk6OkdldEF1dG9HZW5GaWx0ZXJUeXBlKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldEF1dG9HZW5GaWx0ZXJUeXBlKCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpHZXRMZXZlbENvdW50KCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldExldmVsQ291bnQoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVGV4dHVyZTk6OkdldExPRCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRMT0QoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVGV4dHVyZTk6OlNldEF1dG9HZW5GaWx0ZXJUeXBlKEQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlclR5cGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyVHlwZSA9ICVkIiwgZmlsdGVyVHlwZSk7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRBdXRvR2VuRmlsdGVyVHlwZShmaWx0ZXJUeXBlKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVGV4dHVyZTk6OlNldExPRCh1bnNpZ25lZCBsb25nIG5ld0xPRCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIG5ld0xPRCA9ICVkIiwgbmV3TE9EKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldExPRChuZXdMT0QpOworCX0KKworCWxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6R2V0TGV2ZWxEZXNjKHVuc2lnbmVkIGludCBsZXZlbCwgRDNEU1VSRkFDRV9ERVNDICpkZXNjcmlwdGlvbikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgbGV2ZWwgPSAlZCwgRDNEU1VSRkFDRV9ERVNDICpkZXNjcmlwdGlvbiA9IDB4JTAuOHAiLCBsZXZlbCwgZGVzY3JpcHRpb24pOworCisJCWlmKCFkZXNjcmlwdGlvbiB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFtsZXZlbF0pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcmV0dXJuIHN1cmZhY2VMZXZlbFtsZXZlbF0tPkdldERlc2MoZGVzY3JpcHRpb24pOworCX0KKworCWxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6TG9ja1JlY3QodW5zaWduZWQgaW50IGxldmVsLCBEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgbGV2ZWwgPSAlZCwgRDNETE9DS0VEX1JFQ1QgKmxvY2tlZFJlY3QgPSAweCUwLjhwLCBjb25zdCBSRUNUICpyZWN0ID0gMHglMC44cCwgdW5zaWduZWQgbG9uZyBmbGFncyA9ICVkIiwgbGV2ZWwsIGxvY2tlZFJlY3QsIHJlY3QsIGZsYWdzKTsKKworCQlpZighbG9ja2VkUmVjdCB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFtsZXZlbF0pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcmV0dXJuIHN1cmZhY2VMZXZlbFtsZXZlbF0tPkxvY2tSZWN0KGxvY2tlZFJlY3QsIHJlY3QsIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVGV4dHVyZTk6OkdldFN1cmZhY2VMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgbGV2ZWwgPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlID0gMHglMC44cCIsIGxldmVsLCBzdXJmYWNlKTsKKworCQkqc3VyZmFjZSA9IDA7CisKKwkJaWYobGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXN1cmZhY2VMZXZlbFtsZXZlbF0tPkFkZFJlZigpOworCQkqc3VyZmFjZSA9IHN1cmZhY2VMZXZlbFtsZXZlbF07CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CQkKKworCWxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6VW5sb2NrUmVjdCh1bnNpZ25lZCBpbnQgbGV2ZWwpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgidW5zaWduZWQgaW50IGxldmVsID0gJWQiLCBsZXZlbCk7CisKKwkJaWYobGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXJldHVybiBzdXJmYWNlTGV2ZWxbbGV2ZWxdLT5VbmxvY2tSZWN0KCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpBZGREaXJ0eVJlY3QoY29uc3QgUkVDVCAqZGlydHlSZWN0KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJLy8JVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJRGlyZWN0M0RTdXJmYWNlOSAqRGlyZWN0M0RUZXh0dXJlOTo6Z2V0SW50ZXJuYWxTdXJmYWNlTGV2ZWwodW5zaWduZWQgaW50IGxldmVsKQorCXsKKwkJcmV0dXJuIHN1cmZhY2VMZXZlbFtsZXZlbF07CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RUZXh0dXJlOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzRFRleHR1cmU5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGVkMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RUZXh0dXJlOS5ocHAKQEAgLTAsMCArMSw3NCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0RUZXh0dXJlOV9ocHAKKyNkZWZpbmUgRDNEOV9EaXJlY3QzRFRleHR1cmU5X2hwcAorCisjaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwIgorCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKworI2luY2x1ZGUgPGQzZDkuaD4KKworbmFtZXNwYWNlIEQzRDkKK3sKKwljbGFzcyBEaXJlY3QzRFN1cmZhY2U5OworCisJY2xhc3MgRGlyZWN0M0RUZXh0dXJlOSA6IHB1YmxpYyBJRGlyZWN0M0RUZXh0dXJlOSwgcHVibGljIERpcmVjdDNEQmFzZVRleHR1cmU5CisJeworCXB1YmxpYzoJCisJCURpcmVjdDNEVGV4dHVyZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzRFRleHR1cmU5KCk7CisKKwkJLy8gSVVua25vd24gbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7CisKKwkJLy8gSURpcmVjdDNEUmVzb3VyY2U5IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKTsKKwkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKTsKKwkJdm9pZCBfX3N0ZGNhbGwgUHJlTG9hZCgpOworCQlEM0RSRVNPVVJDRVRZUEUgX19zdGRjYWxsIEdldFR5cGUoKTsKKworCQkvLyBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgbWV0aG9kcworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMT0QoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxDb3VudCgpOworCQlsb25nIF9fc3RkY2FsbCBTZXRBdXRvR2VuRmlsdGVyVHlwZShEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXJUeXBlKTsKKwkJRDNEVEVYVFVSRUZJTFRFUlRZUEUgX19zdGRjYWxsIEdldEF1dG9HZW5GaWx0ZXJUeXBlKCk7CisJCXZvaWQgX19zdGRjYWxsIEdlbmVyYXRlTWlwU3ViTGV2ZWxzKCk7CisKKwkJLy8gSURpcmVjdDNEVGV4dHVyZTkgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RTVVJGQUNFX0RFU0MgKmRlc2NyaXB0aW9uKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0U3VyZmFjZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgTG9ja1JlY3QodW5zaWduZWQgaW50IGxldmVsLCBEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIFVubG9ja1JlY3QodW5zaWduZWQgaW50IGxldmVsKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQWRkRGlydHlSZWN0KGNvbnN0IFJFQ1QgKmRpcnR5UmVjdCk7CisKKwkJLy8gSW50ZXJuYWwgbWV0aG9kcworCQlEaXJlY3QzRFN1cmZhY2U5ICpnZXRJbnRlcm5hbFN1cmZhY2VMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwpOworCisJcHJpdmF0ZToKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQljb25zdCB1bnNpZ25lZCBpbnQgd2lkdGg7CisJCWNvbnN0IHVuc2lnbmVkIGludCBoZWlnaHQ7CisKKwkJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZUxldmVsW01JUE1BUF9MRVZFTFNdOworCX07Cit9CisKKyNlbmRpZiAvLyBEM0Q5X0RpcmVjdDNEVGV4dHVyZTlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleEJ1ZmZlcjkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWQwOTMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmNwcApAQCAtMCwwICsxLDI2NCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCisjaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgRDNEOQoreworCURpcmVjdDNEVmVydGV4QnVmZmVyOTo6RGlyZWN0M0RWZXJ0ZXhCdWZmZXI5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBsb25nIEZWRiwgRDNEUE9PTCBwb29sKSA6IERpcmVjdDNEUmVzb3VyY2U5KGRldmljZSwgRDNEUlRZUEVfVkVSVEVYQlVGRkVSLCBwb29sLCBsZW5ndGgpLCBsZW5ndGgobGVuZ3RoKSwgdXNhZ2UodXNhZ2UpLCBGVkYoRlZGKQorCXsKKwkJaWYoRlZGKQorCQl7CisJCQl1bnNpZ25lZCBpbnQgc3RyaWRlID0gMDsKKworCQkJc3dpdGNoKEZWRiAmIEQzREZWRl9QT1NJVElPTl9NQVNLKQorCQkJeworCQkJY2FzZSBEM0RGVkZfWFlaOglzdHJpZGUgKz0gMTI7CWJyZWFrOworCQkJY2FzZSBEM0RGVkZfWFlaUkhXOglzdHJpZGUgKz0gMTY7CWJyZWFrOworCQkJY2FzZSBEM0RGVkZfWFlaQjE6CXN0cmlkZSArPSAxNjsJYnJlYWs7CisJCQljYXNlIEQzREZWRl9YWVpCMjoJc3RyaWRlICs9IDIwOwlicmVhazsKKwkJCWNhc2UgRDNERlZGX1hZWkIzOglzdHJpZGUgKz0gMjQ7CWJyZWFrOworCQkJY2FzZSBEM0RGVkZfWFlaQjQ6CXN0cmlkZSArPSAyODsJYnJlYWs7CisJCQljYXNlIEQzREZWRl9YWVpCNToJc3RyaWRlICs9IDMyOwlicmVhazsKKwkJCWNhc2UgRDNERlZGX1hZWlc6ICAgc3RyaWRlICs9IDE2OyAgIGJyZWFrOworCQkJfQorCisJCQlpZihGVkYgJiBEM0RGVkZfTk9STUFMKSAgIHN0cmlkZSArPSAxMjsKKwkJCWlmKEZWRiAmIEQzREZWRl9QU0laRSkgICAgc3RyaWRlICs9IDQ7CisJCQlpZihGVkYgJiBEM0RGVkZfRElGRlVTRSkgIHN0cmlkZSArPSA0OworCQkJaWYoRlZGICYgRDNERlZGX1NQRUNVTEFSKSBzdHJpZGUgKz0gNDsKKworCQkJc3dpdGNoKChGVkYgJiBEM0RGVkZfVEVYQ09VTlRfTUFTSykgPj4gRDNERlZGX1RFWENPVU5UX1NISUZUKQorCQkJeworCQkJY2FzZSA4OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDMwKSkgJSA0KTsKKwkJCWNhc2UgNzogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAyOCkpICUgNCk7CisJCQljYXNlIDY6IHN0cmlkZSArPSA0ICsgNCAqICgoMSArIChGVkYgPj4gMjYpKSAlIDQpOworCQkJY2FzZSA1OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI0KSkgJSA0KTsKKwkJCWNhc2UgNDogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAyMikpICUgNCk7CisJCQljYXNlIDM6IHN0cmlkZSArPSA0ICsgNCAqICgoMSArIChGVkYgPj4gMjApKSAlIDQpOworCQkJY2FzZSAyOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDE4KSkgJSA0KTsKKwkJCWNhc2UgMTogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAxNikpICUgNCk7CisJCQljYXNlIDA6IGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCisJCQlBU1NFUlQobGVuZ3RoID49IHN0cmlkZSk7ICAgICAgIC8vIEZJWE1FCisJCX0KKworCQl2ZXJ0ZXhCdWZmZXIgPSBuZXcgc3c6OlJlc291cmNlKGxlbmd0aCArIDE5MiArIDEwMjQpOyAgIC8vIE5PVEU6IEFwcGxpY2F0aW9ucyBjYW4gJ292ZXJzaG9vdCcgd2hpbGUgd3JpdGluZyB2ZXJ0aWNlcworCQlsb2NrQ291bnQgPSAwOworCX0KKworCURpcmVjdDNEVmVydGV4QnVmZmVyOTo6fkRpcmVjdDNEVmVydGV4QnVmZmVyOSgpCisJeworCQl2ZXJ0ZXhCdWZmZXItPmRlc3RydWN0KCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEVmVydGV4QnVmZmVyOSB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOSB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6QWRkUmVmKCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6UmVsZWFzZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOworCX0KKworCXZvaWQgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpQcmVMb2FkKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlEaXJlY3QzRFJlc291cmNlOTo6UHJlTG9hZCgpOworCX0KKworCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0RGV2aWNlKGRldmljZSk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OlNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpTZXRQcmlvcml0eShuZXdQcmlvcml0eSk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OkdldFByaW9yaXR5KCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaW9yaXR5KCk7CisJfQorCisJRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEVmVydGV4QnVmZmVyOTo6R2V0VHlwZSgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpHZXRUeXBlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OkxvY2sodW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKipkYXRhLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKG9mZnNldCA9PSAwICYmIHNpemUgPT0gMCkgICAvLyBMb2NrIHdob2xlIGJ1ZmZlcgorCQl7CisJCQlzaXplID0gbGVuZ3RoOworCQl9CisKKwkJaWYoIWRhdGEgfHwgb2Zmc2V0ICsgc2l6ZSA+IGxlbmd0aCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQl2b2lkICpidWZmZXI7CisKKwkJaWYoZmxhZ3MgJiBEM0RMT0NLX0RJU0NBUkQvKiAmJiB1c2FnZSAmIEQzRFVTQUdFX0RZTkFNSUMqLykKKwkJeworCQkJdmVydGV4QnVmZmVyLT5kZXN0cnVjdCgpOworCQkJdmVydGV4QnVmZmVyID0gbmV3IHN3OjpSZXNvdXJjZShsZW5ndGggKyAxOTIgKyAxMDI0KTsgICAvLyBOT1RFOiBBcHBsaWNhdGlvbnMgY2FuICdvdmVyc2hvb3QnIHdoaWxlIHdyaXRpbmcgdmVydGljZXMKKwkJCQorCQkJYnVmZmVyID0gKHZvaWQqKXZlcnRleEJ1ZmZlci0+Z2V0QnVmZmVyKCk7CisJCX0KKwkJZWxzZSBpZihmbGFncyAmIEQzRExPQ0tfTk9PVkVSV1JJVEUvKiAmJiB1c2FnZSAmIEQzRFVTQUdFX0RZTkFNSUMqLykKKwkJeworCQkJYnVmZmVyID0gKHZvaWQqKXZlcnRleEJ1ZmZlci0+Z2V0QnVmZmVyKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlidWZmZXIgPSB2ZXJ0ZXhCdWZmZXItPmxvY2soc3c6OlBVQkxJQyk7CisJCQlsb2NrQ291bnQrKzsKKwkJfQorCisJCSpkYXRhID0gKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlciArIG9mZnNldDsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpVbmxvY2soKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKGxvY2tDb3VudCA+IDApCisJCXsKKwkJCXZlcnRleEJ1ZmZlci0+dW5sb2NrKCk7CisJCQlsb2NrQ291bnQtLTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OkdldERlc2MoRDNEVkVSVEVYQlVGRkVSX0RFU0MgKmRlc2NyaXB0aW9uKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXNjcmlwdGlvbikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlkZXNjcmlwdGlvbi0+RlZGID0gRlZGOworCQlkZXNjcmlwdGlvbi0+Rm9ybWF0ID0gRDNERk1UX1ZFUlRFWERBVEE7CisJCWRlc2NyaXB0aW9uLT5Qb29sID0gcG9vbDsKKwkJZGVzY3JpcHRpb24tPlNpemUgPSBsZW5ndGg7CisJCWRlc2NyaXB0aW9uLT5UeXBlID0gRDNEUlRZUEVfVkVSVEVYQlVGRkVSOworCQlkZXNjcmlwdGlvbi0+VXNhZ2UgPSB1c2FnZTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWludCBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OmdldExlbmd0aCgpIGNvbnN0CisJeworCQlyZXR1cm4gbGVuZ3RoOworCX0KKworCXN3OjpSZXNvdXJjZSAqRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpnZXRSZXNvdXJjZSgpIGNvbnN0CisJeworCQlyZXR1cm4gdmVydGV4QnVmZmVyOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4QnVmZmVyOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleEJ1ZmZlcjkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGVlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleEJ1ZmZlcjkuaHBwCkBAIC0wLDAgKzEsNjggQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBEM0Q5X0RpcmVjdDNEVmVydGV4QnVmZmVyOV9ocHAKKyNkZWZpbmUgRDNEOV9EaXJlY3QzRFZlcnRleEJ1ZmZlcjlfaHBwCisKKyNpbmNsdWRlICJEaXJlY3QzRFJlc291cmNlOS5ocHAiCisKKyNpbmNsdWRlIDxkM2Q5Lmg+CisKK25hbWVzcGFjZSBzdworeworCWNsYXNzIFJlc291cmNlOworfQorCituYW1lc3BhY2UgRDNEOQoreworCWNsYXNzIERpcmVjdDNEVmVydGV4QnVmZmVyOSA6IHB1YmxpYyBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LCBwdWJsaWMgRGlyZWN0M0RSZXNvdXJjZTkKKwl7CisJcHVibGljOgorCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIGxvbmcgRlZGLCBEM0RQT09MIHBvb2wpOworCisJCXZpcnR1YWwgfkRpcmVjdDNEVmVydGV4QnVmZmVyOSgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIElEaXJlY3QzRFJlc291cmNlOSBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CisJCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKTsKKwkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCk7CisKKwkJLy8gSURpcmVjdDNEVmVydGV4QnVmZmVyOSBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIExvY2sodW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKipkYXRhLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrKCk7CisJCWxvbmcgX19zdGRjYWxsIEdldERlc2MoRDNEVkVSVEVYQlVGRkVSX0RFU0MgKmRlc2NyaXB0aW9uKTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCWludCBnZXRMZW5ndGgoKSBjb25zdDsKKwkJc3c6OlJlc291cmNlICpnZXRSZXNvdXJjZSgpIGNvbnN0OworCisJcHJpdmF0ZToKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQljb25zdCB1bnNpZ25lZCBpbnQgbGVuZ3RoOworCQljb25zdCBsb25nIHVzYWdlOworCQljb25zdCBsb25nIEZWRjsKKworCQlzdzo6UmVzb3VyY2UgKnZlcnRleEJ1ZmZlcjsKKwkJaW50IGxvY2tDb3VudDsKKwl9OworfQorCisjZW5kaWYgLy8gRDNEOV9EaXJlY3QzRFZlcnRleEJ1ZmZlcjlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliMmY1NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245LmNwcApAQCAtMCwwICsxLDUzMSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkuaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U5LmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxkM2Q5dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgRDNEOQoreworCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OjpEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgKnZlcnRleEVsZW1lbnQpIDogZGV2aWNlKGRldmljZSkKKwl7CisJCWludCBzaXplID0gc2l6ZW9mKEQzRFZFUlRFWEVMRU1FTlQ5KTsKKwkJY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgKmVsZW1lbnQgPSB2ZXJ0ZXhFbGVtZW50OworCQlwcmVUcmFuc2Zvcm1lZCA9IGZhbHNlOworCisJCXdoaWxlKGVsZW1lbnQtPlN0cmVhbSAhPSAweEZGKQorCQl7CisJCQlpZihlbGVtZW50LT5Vc2FnZSA9PSBEM0RERUNMVVNBR0VfUE9TSVRJT05UKQorCQkJeworCQkJCXByZVRyYW5zZm9ybWVkID0gdHJ1ZTsKKwkJCX0KKworCQkJc2l6ZSArPSBzaXplb2YoRDNEVkVSVEVYRUxFTUVOVDkpOworCQkJZWxlbWVudCsrOworCQl9CisKKwkJbnVtRWxlbWVudHMgPSBzaXplIC8gc2l6ZW9mKEQzRFZFUlRFWEVMRU1FTlQ5KTsKKwkJdGhpcy0+dmVydGV4RWxlbWVudCA9IG5ldyBEM0RWRVJURVhFTEVNRU5UOVtudW1FbGVtZW50c107CisJCW1lbWNweSh0aGlzLT52ZXJ0ZXhFbGVtZW50LCB2ZXJ0ZXhFbGVtZW50LCBzaXplKTsKKworCQlGVkYgPSBjb21wdXRlRlZGKCk7CisJfQorCisJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjk6OkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIEZWRikgOiBkZXZpY2UoZGV2aWNlKQorCXsKKwkJdGhpcy0+RlZGID0gRlZGOworCisJCXZlcnRleEVsZW1lbnQgPSBuZXcgRDNEVkVSVEVYRUxFTUVOVDlbMTZdOworCisJCW51bUVsZW1lbnRzID0gMDsKKwkJaW50IG9mZnNldCA9IDA7CisJCXByZVRyYW5zZm9ybWVkID0gZmFsc2U7CisKKwkJc3dpdGNoKEZWRiAmIEQzREZWRl9QT1NJVElPTl9NQVNLKQorCQl7CisJCWNhc2UgMDoKKwkJCS8vIE5vIHBvc2l0aW9uIHN0cmVhbQorCQkJYnJlYWs7CisJCWNhc2UgRDNERlZGX1hZWjoKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQzOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfUE9TSVRJT047CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMDsKKwkJCW51bUVsZW1lbnRzKys7CisJCQlvZmZzZXQgKz0gNCAqIDM7CisJCQlicmVhazsKKwkJY2FzZSBEM0RGVkZfWFlaUkhXOgorCQkJcHJlVHJhbnNmb3JtZWQgPSB0cnVlOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9QT1NJVElPTlQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMDsKKwkJCW51bUVsZW1lbnRzKys7CisJCQlvZmZzZXQgKz0gNCAqIDQ7CisJCQlicmVhazsKKwkJY2FzZSBEM0RGVkZfWFlaQjE6CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0ZMT0FUMzsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX1BPU0lUSU9OOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7CisJCQludW1FbGVtZW50cysrOworCQkJb2Zmc2V0ICs9IDQgKiAzOworCisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0ZMT0FUMTsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX0JMRU5EV0VJR0hUOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7CisJCQludW1FbGVtZW50cysrOworCQkJb2Zmc2V0ICs9IDQgKiAxOworCQkJYnJlYWs7CisJCWNhc2UgRDNERlZGX1hZWkIyOgorCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDM7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9QT1NJVElPTjsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOworCQkJbnVtRWxlbWVudHMrKzsKKwkJCW9mZnNldCArPSA0ICogMzsKKworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDI7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9CTEVORFdFSUdIVDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOworCQkJbnVtRWxlbWVudHMrKzsKKwkJCW9mZnNldCArPSA0ICogMjsKKwkJCWJyZWFrOworCQljYXNlIEQzREZWRl9YWVpCMzoKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQzOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfUE9TSVRJT047CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMDsKKwkJCW51bUVsZW1lbnRzKys7CisJCQlvZmZzZXQgKz0gNCAqIDM7CisKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQzOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfQkxFTkRXRUlHSFQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMDsKKwkJCW51bUVsZW1lbnRzKys7CisJCQlvZmZzZXQgKz0gNCAqIDM7CisJCQlicmVhazsKKwkJY2FzZSBEM0RGVkZfWFlaQjQ6CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0ZMT0FUMzsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX1BPU0lUSU9OOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7CisJCQludW1FbGVtZW50cysrOworCQkJb2Zmc2V0ICs9IDQgKiAzOworCisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0ZMT0FUNDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX0JMRU5EV0VJR0hUOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7CisJCQludW1FbGVtZW50cysrOworCQkJb2Zmc2V0ICs9IDQgKiA0OworCQkJYnJlYWs7CisJCWNhc2UgRDNERlZGX1hZWkI1OgorCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDM7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9QT1NJVElPTjsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOworCQkJbnVtRWxlbWVudHMrKzsKKwkJCW9mZnNldCArPSA0ICogMzsKKworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9CTEVORFdFSUdIVDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOworCQkJbnVtRWxlbWVudHMrKzsKKwkJCW9mZnNldCArPSA0ICogNTsKKwkJCWJyZWFrOworCQljYXNlIEQzREZWRl9YWVpXOgorCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9QT1NJVElPTjsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOworCQkJbnVtRWxlbWVudHMrKzsKKwkJCW9mZnNldCArPSA0ICogNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWlmKEZWRiAmIEQzREZWRl9OT1JNQUwpCisJCXsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQzOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfTk9STUFMOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7CisJCQludW1FbGVtZW50cysrOworCQkJb2Zmc2V0ICs9IDQgKiAzOworCQl9CisKKwkJaWYoRlZGICYgRDNERlZGX1BTSVpFKQorCQl7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0ZMT0FUMTsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX1BTSVpFOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7CisJCQludW1FbGVtZW50cysrOworCQkJb2Zmc2V0ICs9IDQ7CisJCX0KKworCQlpZihGVkYgJiBEM0RGVkZfRElGRlVTRSkKKwkJeworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsJCQkKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9EM0RDT0xPUjsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX0NPTE9SOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7CisJCQludW1FbGVtZW50cysrOworCQkJb2Zmc2V0ICs9IDQ7CisJCX0KKworCQlpZihGVkYgJiBEM0RGVkZfU1BFQ1VMQVIpCisJCXsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRDNEQ09MT1I7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9DT0xPUjsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAxOworCQkJbnVtRWxlbWVudHMrKzsKKwkJCW9mZnNldCArPSA0OworCQl9CisKKwkJaW50IG51bVRleENvb3JkID0gKEZWRiAmIEQzREZWRl9URVhDT1VOVF9NQVNLKSA+PiBEM0RGVkZfVEVYQ09VTlRfU0hJRlQ7CisJCWludCB0ZXh0dXJlRm9ybWF0cyA9IChGVkYgPj4gMTYpICYgMHhGRkZGOworCQkKKwkJc3RhdGljIGNvbnN0IGludCB0ZXh0dXJlU2l6ZVs0XSA9CisJCXsKKwkJCTIgKiA0LCAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUMgorCQkJMyAqIDQsICAgLy8gRDNERlZGX1RFWFRVUkVGT1JNQVQzCisJCQk0ICogNCwgICAvLyBEM0RGVkZfVEVYVFVSRUZPUk1BVDQKKwkJCTEgKiA0ICAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUMQorCQl9OworCQkKKwkJc3RhdGljIGNvbnN0IEQzRERFQ0xUWVBFIHRleHR1cmVUeXBlWzRdID0KKwkJeworCQkJRDNEREVDTFRZUEVfRkxPQVQyLCAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUMgorCQkJRDNEREVDTFRZUEVfRkxPQVQzLCAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUMworCQkJRDNEREVDTFRZUEVfRkxPQVQ0LCAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUNAorCQkJRDNEREVDTFRZUEVfRkxPQVQxICAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUMQorCQl9OworCisJCWZvcihpbnQgaSA9IDA7IGkgPCBudW1UZXhDb29yZDsgaSsrKQorCQl7CisJCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IHRleHR1cmVUeXBlW3RleHR1cmVGb3JtYXRzICYgMHgzXTsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKKwkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX1RFWENPT1JEOworCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IGk7CisJCQludW1FbGVtZW50cysrOworCQkJb2Zmc2V0ICs9IHRleHR1cmVTaXplW3RleHR1cmVGb3JtYXRzICYgMHgzXTsKKwkJCXRleHR1cmVGb3JtYXRzID4+PSAyOworCQl9CisKKwkJLy8gRDNEREVDTF9FTkQoKQorCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAweEZGOworCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSAwOworCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfVU5VU0VEOworCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSAwOworCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IDA7CisJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOworCQludW1FbGVtZW50cysrOworCX0KKworCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245Ojp+RGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkoKQorCXsKKwkJZGVsZXRlW10gdmVydGV4RWxlbWVudDsKKwkJdmVydGV4RWxlbWVudCA9IDA7CisJfQorCisJbG9uZyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgfHwKKwkJICAgaWlkID09IElJRF9JVW5rbm93bikKKwkJeworCQkJQWRkUmVmKCk7CisJCQkqb2JqZWN0ID0gdGhpczsKKworCQkJcmV0dXJuIFNfT0s7CisJCX0KKworCQkqb2JqZWN0ID0gMDsKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKKwl9CisJCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOTo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzLT5kZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighZGV2aWNlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXRoaXMtPmRldmljZS0+QWRkUmVmKCk7CisJCSpkZXZpY2UgPSB0aGlzLT5kZXZpY2U7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OjpHZXREZWNsYXJhdGlvbihEM0RWRVJURVhFTEVNRU5UOSAqZGVjbGFyYXRpb24sIHVuc2lnbmVkIGludCAqbnVtRWxlbWVudHMpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRlY2xhcmF0aW9uIHx8ICFudW1FbGVtZW50cykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqbnVtRWxlbWVudHMgPSB0aGlzLT5udW1FbGVtZW50czsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgdGhpcy0+bnVtRWxlbWVudHM7IGkrKykKKwkJeworCQkJZGVjbGFyYXRpb25baV0gPSB2ZXJ0ZXhFbGVtZW50W2ldOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OjpnZXRGVkYoKSBjb25zdAorCXsKKwkJcmV0dXJuIEZWRjsKKwl9CisKKwlib29sIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245Ojppc1ByZVRyYW5zZm9ybWVkKCkgY29uc3QKKwl7CisJCXJldHVybiBwcmVUcmFuc2Zvcm1lZDsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245Ojpjb21wdXRlRlZGKCkKKwl7CisJCXVuc2lnbmVkIGxvbmcgRlZGID0gMDsKKworCQlpbnQgdGV4dHVyZUJpdHMgPSAwOworCQlpbnQgbnVtQmxlbmRXZWlnaHRzID0gMDsKKwkgICAgCisJCWZvcihpbnQgaSA9IDA7IGkgPCBudW1FbGVtZW50cyAtIDE7IGkrKykKKwkJeworCQkJRDNEVkVSVEVYRUxFTUVOVDkgJmVsZW1lbnQgPSB2ZXJ0ZXhFbGVtZW50W2ldOworCisJCQlpZihlbGVtZW50LlN0cmVhbSAhPSAwKQorCQkJeworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlzd2l0Y2goZWxlbWVudC5Vc2FnZSkKKwkJCXsKKwkJCWNhc2UgRDNEREVDTFVTQUdFX1BPU0lUSU9OOgorCQkJCWlmKGVsZW1lbnQuVHlwZSA9PSBEM0RERUNMVFlQRV9GTE9BVDMgJiYgZWxlbWVudC5Vc2FnZUluZGV4ID09IDApCisJCQkJeworCQkJCQlGVkYgfD0gRDNERlZGX1hZWjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RERUNMVVNBR0VfUE9TSVRJT05UOgorCQkJCWlmKGVsZW1lbnQuVHlwZSA9PSBEM0RERUNMVFlQRV9GTE9BVDQgJiYgZWxlbWVudC5Vc2FnZUluZGV4ID09IDApCisJCQkJeworCQkJCQlGVkYgfD0gRDNERlZGX1hZWlJIVzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RERUNMVVNBR0VfQkxFTkRXRUlHSFQ6CisJCQkJaWYoZWxlbWVudC5UeXBlIDw9IEQzRERFQ0xUWVBFX0ZMT0FUNCAmJiBlbGVtZW50LlVzYWdlSW5kZXggPT0gMCkKKwkJCQl7CisJCQkJCW51bUJsZW5kV2VpZ2h0cyArPSBlbGVtZW50LlR5cGUgKyAxOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRERFQ0xVU0FHRV9CTEVORElORElDRVM6CisJCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRERFQ0xVU0FHRV9OT1JNQUw6CisJCQkJaWYoZWxlbWVudC5UeXBlID09IEQzRERFQ0xUWVBFX0ZMT0FUMyAmJiBlbGVtZW50LlVzYWdlSW5kZXggPT0gMCkKKwkJCQl7CisJCQkJCUZWRiB8PSBEM0RGVkZfTk9STUFMOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRERFQ0xVU0FHRV9QU0laRToKKwkJCQlpZihlbGVtZW50LlR5cGUgPT0gRDNEREVDTFRZUEVfRkxPQVQxICYmIGVsZW1lbnQuVXNhZ2VJbmRleCA9PSAwKQorCQkJCXsKKwkJCQkJRlZGIHw9IEQzREZWRl9QU0laRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RERUNMVVNBR0VfQ09MT1I6CisJCQkJaWYoZWxlbWVudC5UeXBlID09IEQzRERFQ0xUWVBFX0QzRENPTE9SICYmIGVsZW1lbnQuVXNhZ2VJbmRleCA8IDIpCisJCQkJeworCQkJCQlpZihlbGVtZW50LlVzYWdlSW5kZXggPT0gMCkKKwkJCQkJeworCQkJCQkJRlZGIHw9IEQzREZWRl9ESUZGVVNFOworCQkJCQl9CisJCQkJCWVsc2UgICAvLyBlbGVtZW50LlVzYWdlSW5kZXggPT0gMQorCQkJCQl7CisJCQkJCQlGVkYgfD0gRDNERlZGX1NQRUNVTEFSOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEREVDTFVTQUdFX1RFWENPT1JEOgorCQkJCWlmKChlbGVtZW50LlR5cGUgPiBEM0RERUNMVFlQRV9GTE9BVDQpIHx8IChlbGVtZW50LlVzYWdlSW5kZXggPiA3KSkKKwkJCQl7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQkKKwkJCQlpbnQgYml0ID0gMSA8PCBlbGVtZW50LlVzYWdlSW5kZXg7CisJCQkJCisJCQkJaWYodGV4dHVyZUJpdHMgJiBiaXQpCisJCQkJeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCQl0ZXh0dXJlQml0cyB8PSBiaXQ7CisJCQkJCisJCQkJc3dpdGNoKGVsZW1lbnQuVHlwZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RERUNMVFlQRV9GTE9BVDE6CisJCQkJCUZWRiB8PSBEM0RGVkZfVEVYQ09PUkRTSVpFMShlbGVtZW50LlVzYWdlSW5kZXgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRERFQ0xUWVBFX0ZMT0FUMjoKKwkJCQkJRlZGIHw9IEQzREZWRl9URVhDT09SRFNJWkUyKGVsZW1lbnQuVXNhZ2VJbmRleCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQzOgorCQkJCQlGVkYgfD0gRDNERlZGX1RFWENPT1JEU0laRTMoZWxlbWVudC5Vc2FnZUluZGV4KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RERUNMVFlQRV9GTE9BVDQ6CisJCQkJCUZWRiB8PSBEM0RGVkZfVEVYQ09PUkRTSVpFNChlbGVtZW50LlVzYWdlSW5kZXgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlib29sIGlzVHJhbnNmb3JtZWQgPSAoRlZGICYgRDNERlZGX1hZWlJIVykgIT0gMDsKKworCQlpZihpc1RyYW5zZm9ybWVkKQorCQl7CisJCQlpZihudW1CbGVuZFdlaWdodHMgIT0gMCkKKwkJCXsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQllbHNlIGlmKChGVkYgJiBEM0RGVkZfWFlaKSA9PSAwKQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCSAgICAgICAgCisJCWludCBwb3NpdGlvbk1hc2sgPSBpc1RyYW5zZm9ybWVkID8gMHgyIDogMHgxOworCisJCWlmKG51bUJsZW5kV2VpZ2h0cykKKwkJeworCQkJcG9zaXRpb25NYXNrICs9IG51bUJsZW5kV2VpZ2h0cyArIDE7CisJCX0KKwkgICAgICAgIAorCQlpbnQgbnVtVGV4Q29vcmQgPSAwOworCisJCXdoaWxlKHRleHR1cmVCaXRzICYgMSkKKwkJeworCQkJdGV4dHVyZUJpdHMgPj49IDE7CisKKwkJCW51bVRleENvb3JkKys7CisJCX0KKworCQlpZih0ZXh0dXJlQml0cykgICAvLyBGVkYgZG9lcyBub3QgYWxsb3cKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlGVkYgfD0gRDNERlZGX1BPU0lUSU9OX01BU0sgJiAocG9zaXRpb25NYXNrIDw8IDEpOworCQlGVkYgfD0gbnVtVGV4Q29vcmQgPDwgRDNERlZGX1RFWENPVU5UX1NISUZUOworCisJCXJldHVybiBGVkY7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkuaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDBkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOS5ocHAKQEAgLTAsMCArMSw1NyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfaHBwCisjZGVmaW5lIEQzRDlfRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfaHBwCisKKyNpbmNsdWRlICJVbmtub3duLmhwcCIKKworI2luY2x1ZGUgPGQzZDkuaD4KKworbmFtZXNwYWNlIEQzRDkKK3sKKwljbGFzcyBEaXJlY3QzRERldmljZTk7CisKKwljbGFzcyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSA6IHB1YmxpYyBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjksIHB1YmxpYyBVbmtub3duCisJeworCXB1YmxpYzoKKwkJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5ICp2ZXJ0ZXhFbGVtZW50cyk7CisJCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIEZWRik7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldERlY2xhcmF0aW9uKEQzRFZFUlRFWEVMRU1FTlQ5ICpkZWNsYXJhdGlvbiwgdW5zaWduZWQgaW50ICpudW1FbGVtZW50cyk7CisKKwkJLy8gSW50ZXJuYWwgbWV0aG9kcworCQl1bnNpZ25lZCBsb25nIGdldEZWRigpIGNvbnN0OworCQlib29sIGlzUHJlVHJhbnNmb3JtZWQoKSBjb25zdDsKKworCXByaXZhdGU6CisJCXVuc2lnbmVkIGxvbmcgY29tcHV0ZUZWRigpOyAgIC8vIElmIGVxdWl2YWxlbnQgdG8gRlZGLCBlbHNlIDAKKworCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCURpcmVjdDNERGV2aWNlOSAqY29uc3QgZGV2aWNlOworCQlEM0RWRVJURVhFTEVNRU5UOSAqdmVydGV4RWxlbWVudDsKKwkJCisJCWludCBudW1FbGVtZW50czsKKwkJdW5zaWduZWQgbG9uZyBGVkY7CisJCWJvb2wgcHJlVHJhbnNmb3JtZWQ7CisJfTsKK30KKworI2VuZGlmICAgLy8gRDNEOV9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4U2hhZGVyOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleFNoYWRlcjkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWY4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleFNoYWRlcjkuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4U2hhZGVyOS5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworbmFtZXNwYWNlIEQzRDkKK3sKKwlEaXJlY3QzRFZlcnRleFNoYWRlcjk6OkRpcmVjdDNEVmVydGV4U2hhZGVyOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyAqc2hhZGVyVG9rZW4pIDogZGV2aWNlKGRldmljZSksIHZlcnRleFNoYWRlcihzaGFkZXJUb2tlbikKKwl7CisJfQorCisJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5Ojp+RGlyZWN0M0RWZXJ0ZXhTaGFkZXI5KCkKKwl7CisJfQorCisJbG9uZyBEaXJlY3QzRFZlcnRleFNoYWRlcjk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEVmVydGV4U2hhZGVyOSB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKKwl9CisJCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleFNoYWRlcjk6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZlcnRleFNoYWRlcjk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXZpY2UpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdGhpcy0+ZGV2aWNlLT5BZGRSZWYoKTsKKwkJKmRldmljZSA9IHRoaXMtPmRldmljZTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5OjpHZXRGdW5jdGlvbih2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgKnNpemUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoIXNpemUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdmVydGV4U2hhZGVyLmdldEZ1bmN0aW9uKGRhdGEsIHNpemUpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJY29uc3Qgc3c6OlZlcnRleFNoYWRlciAqRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5OjpnZXRWZXJ0ZXhTaGFkZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuICZ2ZXJ0ZXhTaGFkZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4U2hhZGVyOS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzMTdhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4U2hhZGVyOS5ocHAKQEAgLTAsMCArMSw1MiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X2hwcAorI2RlZmluZSBEM0Q5X0RpcmVjdDNEVmVydGV4U2hhZGVyOV9ocHAKKworI2luY2x1ZGUgIlVua25vd24uaHBwIgorCisjaW5jbHVkZSAiVmVydGV4U2hhZGVyLmhwcCIKKworI2luY2x1ZGUgPGQzZDkuaD4KKworbmFtZXNwYWNlIEQzRDkKK3sKKwljbGFzcyBEaXJlY3QzRERldmljZTk7CisKKwljbGFzcyBEaXJlY3QzRFZlcnRleFNoYWRlcjkgOiBwdWJsaWMgSURpcmVjdDNEVmVydGV4U2hhZGVyOSwgcHVibGljIFVua25vd24KKwl7CisJcHVibGljOgorCQlEaXJlY3QzRFZlcnRleFNoYWRlcjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzRFZlcnRleFNoYWRlcjkoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpOworCQlsb25nIF9fc3RkY2FsbCBHZXRGdW5jdGlvbih2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgKnNpemUpOworCisJCS8vIEludGVybmFsIG1ldGhvZHMKKwkJY29uc3Qgc3c6OlZlcnRleFNoYWRlciAqZ2V0VmVydGV4U2hhZGVyKCkgY29uc3Q7CisKKwlwcml2YXRlOgorCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCURpcmVjdDNERGV2aWNlOSAqY29uc3QgZGV2aWNlOworCisJCXN3OjpWZXJ0ZXhTaGFkZXIgdmVydGV4U2hhZGVyOworCX07Cit9CisKKyNlbmRpZiAgIC8vIEQzRDlfRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWb2x1bWU5LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lOS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1ZmYwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lOS5jcHAKQEAgLTAsMCArMSwyMjEgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lOS5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEUmVzb3VyY2U5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZVRleHR1cmU5LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U5LmhwcCIKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJYm9vbCBpc0xvY2thYmxlKEQzRFBPT0wgcG9vbCwgdW5zaWduZWQgbG9uZyB1c2FnZSkKKwl7CisJCXJldHVybiAocG9vbCAhPSBEM0RQT09MX0RFRkFVTFQpIHx8ICh1c2FnZSAmIEQzRFVTQUdFX0RZTkFNSUMpOworCX0KKworCURpcmVjdDNEVm9sdW1lOTo6RGlyZWN0M0RWb2x1bWU5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCBEaXJlY3QzRFZvbHVtZVRleHR1cmU5ICpjb250YWluZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpIDogZGV2aWNlKGRldmljZSksIFN1cmZhY2UoY29udGFpbmVyLT5nZXRSZXNvdXJjZSgpLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgdHJhbnNsYXRlRm9ybWF0KGZvcm1hdCksIGlzTG9ja2FibGUocG9vbCwgdXNhZ2UpLCBmYWxzZSksIGNvbnRhaW5lcihjb250YWluZXIpLCB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpLCBkZXB0aChkZXB0aCksIGZvcm1hdChmb3JtYXQpLCBwb29sKHBvb2wpLCBsb2NrYWJsZShpc0xvY2thYmxlKHBvb2wsIHVzYWdlKSksIHVzYWdlKHVzYWdlKQorCXsKKwkJcmVzb3VyY2UgPSBuZXcgRGlyZWN0M0RSZXNvdXJjZTkoZGV2aWNlLCBEM0RSVFlQRV9WT0xVTUUsIHBvb2wsIG1lbW9yeVVzYWdlKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQpKTsKKwkJcmVzb3VyY2UtPmJpbmQoKTsKKwl9CisKKwlEaXJlY3QzRFZvbHVtZTk6On5EaXJlY3QzRFZvbHVtZTkoKQorCXsKKwkJcmVzb3VyY2UtPnVuYmluZCgpOworCX0KKworCWxvbmcgX19zdGRjYWxsIERpcmVjdDNEVm9sdW1lOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RWb2x1bWU5IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgRGlyZWN0M0RWb2x1bWU5OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBjb250YWluZXItPkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIERpcmVjdDNEVm9sdW1lOTo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIGNvbnRhaW5lci0+UmVsZWFzZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWU5OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gcmVzb3VyY2UtPkZyZWVQcml2YXRlRGF0YShndWlkKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lOTo6R2V0Q29udGFpbmVyKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqY29udGFpbmVyKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFjb250YWluZXIpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJbG9uZyByZXN1bHQgPSB0aGlzLT5jb250YWluZXItPlF1ZXJ5SW50ZXJmYWNlKGlpZCwgY29udGFpbmVyKTsKKworCQlpZihyZXN1bHQgPT0gU19PSykKKwkJeworCQkJcmV0dXJuIEQzRF9PSzsKKwkJfQorCisJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWU5OjpHZXREZXNjKEQzRFZPTFVNRV9ERVNDICpkZXNjcmlwdGlvbikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighZGVzY3JpcHRpb24pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZGVzY3JpcHRpb24tPkZvcm1hdCA9IGZvcm1hdDsKKwkJZGVzY3JpcHRpb24tPlR5cGUgPSBEM0RSVFlQRV9WT0xVTUU7CisJCWRlc2NyaXB0aW9uLT5Vc2FnZSA9IHVzYWdlOworCQlkZXNjcmlwdGlvbi0+UG9vbCA9IHBvb2w7CisJCWRlc2NyaXB0aW9uLT5XaWR0aCA9IHdpZHRoOworCQlkZXNjcmlwdGlvbi0+SGVpZ2h0ID0gaGVpZ2h0OworCQlkZXNjcmlwdGlvbi0+RGVwdGggPSBkZXB0aDsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWU5OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzLT5kZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gcmVzb3VyY2UtPkdldERldmljZShkZXZpY2UpOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWU5OjpHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiByZXNvdXJjZS0+R2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZTk6OkxvY2tCb3goRDNETE9DS0VEX0JPWCAqbG9ja2VkVm9sdW1lLCBjb25zdCBEM0RCT1ggKmJveCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighbG9ja2VkVm9sdW1lKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWxvY2tlZFZvbHVtZS0+Um93UGl0Y2ggPSAwOworCQlsb2NrZWRWb2x1bWUtPlNsaWNlUGl0Y2ggPSAwOworCQlsb2NrZWRWb2x1bWUtPnBCaXRzID0gMDsKKworCQlpZighbG9ja2FibGUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJbG9ja2VkVm9sdW1lLT5Sb3dQaXRjaCA9IGdldEV4dGVybmFsUGl0Y2hCKCk7CisJCWxvY2tlZFZvbHVtZS0+U2xpY2VQaXRjaCA9IGdldEV4dGVybmFsU2xpY2VCKCk7CisKKwkJc3c6OkxvY2sgbG9jayA9IHN3OjpMT0NLX1JFQURXUklURTsKKworCQlpZihmbGFncyAmIEQzRExPQ0tfRElTQ0FSRCkKKwkJeworCQkJbG9jayA9IHN3OjpMT0NLX0RJU0NBUkQ7CisJCX0KKworCQlpZihmbGFncyAmIEQzRExPQ0tfUkVBRE9OTFkpCisJCXsKKwkJCWxvY2sgPSBzdzo6TE9DS19SRUFET05MWTsKKwkJfQorCisJCWlmKGJveCkKKwkJeworCQkJbG9ja2VkVm9sdW1lLT5wQml0cyA9IGxvY2tFeHRlcm5hbChib3gtPkxlZnQsIGJveC0+VG9wLCBib3gtPkZyb250LCBsb2NrLCBzdzo6UFVCTElDKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxvY2tlZFZvbHVtZS0+cEJpdHMgPSBsb2NrRXh0ZXJuYWwoMCwgMCwgMCwgbG9jaywgc3c6OlBVQkxJQyk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWU5OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIHJlc291cmNlLT5TZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZTk6OlVubG9ja0JveCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJdW5sb2NrRXh0ZXJuYWwoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCXN3OjpGb3JtYXQgRGlyZWN0M0RWb2x1bWU5Ojp0cmFuc2xhdGVGb3JtYXQoRDNERk9STUFUIGZvcm1hdCkKKwl7CisJCXJldHVybiBEaXJlY3QzRFN1cmZhY2U5Ojp0cmFuc2xhdGVGb3JtYXQoZm9ybWF0KTsKKwl9CisKKwl1bnNpZ25lZCBpbnQgRGlyZWN0M0RWb2x1bWU5OjptZW1vcnlVc2FnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgRDNERk9STUFUIGZvcm1hdCkKKwl7CisJCXJldHVybiBTdXJmYWNlOjpzaXplKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB0cmFuc2xhdGVGb3JtYXQoZm9ybWF0KSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWb2x1bWU5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lOS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0YzNkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lOS5ocHAKQEAgLTAsMCArMSw2OCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0RWb2x1bWU5X2hwcAorI2RlZmluZSBEM0Q5X0RpcmVjdDNEVm9sdW1lOV9ocHAKKworI2luY2x1ZGUgIlVua25vd24uaHBwIgorCisjaW5jbHVkZSAiU3VyZmFjZS5ocHAiCisKKyNpbmNsdWRlIDxkM2Q5Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJY2xhc3MgRGlyZWN0M0REZXZpY2U5OworCWNsYXNzIERpcmVjdDNEUmVzb3VyY2U5OworCWNsYXNzIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk7CisKKwljbGFzcyBEaXJlY3QzRFZvbHVtZTkgOiBwdWJsaWMgSURpcmVjdDNEVm9sdW1lOSwgcHVibGljIFVua25vd24sIHB1YmxpYyBzdzo6U3VyZmFjZQorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEVm9sdW1lOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqY29udGFpbmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCB1bnNpZ25lZCBsb25nIHVzYWdlKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzRFZvbHVtZTkoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RWb2x1bWU5IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpOworCQlsb25nIF9fc3RkY2FsbCBHZXRDb250YWluZXIoY29uc3QgSUlEICZpaWQsIHZvaWQgKipjb250YWluZXIpOworCQlsb25nIF9fc3RkY2FsbCBHZXREZXNjKEQzRFZPTFVNRV9ERVNDICpkZXNjcmlwdGlvbik7CisJCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CisJCWxvbmcgX19zdGRjYWxsIExvY2tCb3goRDNETE9DS0VEX0JPWCAqbG9ja2VkVm9sdW1lLCBjb25zdCBEM0RCT1ggKmJveCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIFVubG9ja0JveCgpOworCisJcHJpdmF0ZToKKwkJc3RhdGljIHN3OjpGb3JtYXQgdHJhbnNsYXRlRm9ybWF0KEQzREZPUk1BVCBmb3JtYXQpOworCQlzdGF0aWMgdW5zaWduZWQgaW50IG1lbW9yeVVzYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBEM0RGT1JNQVQgZm9ybWF0KTsKKworCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCURpcmVjdDNERGV2aWNlOSAqY29uc3QgZGV2aWNlOworCQlEaXJlY3QzRFZvbHVtZVRleHR1cmU5ICpjb25zdCBjb250YWluZXI7CisJCWNvbnN0IGludCB3aWR0aDsKKwkJY29uc3QgaW50IGhlaWdodDsKKwkJY29uc3QgaW50IGRlcHRoOworCQljb25zdCBEM0RGT1JNQVQgZm9ybWF0OworCQljb25zdCBEM0RQT09MIHBvb2w7CisJCWNvbnN0IGJvb2wgbG9ja2FibGU7CisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgdXNhZ2U7CisKKwkJRGlyZWN0M0RSZXNvdXJjZTkgKnJlc291cmNlOworCX07Cit9CisKKyNlbmRpZiAvLyBEM0Q5X0RpcmVjdDNEVm9sdW1lOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0RWb2x1bWVUZXh0dXJlOS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjZTkwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTkuY3BwCkBAIC0wLDAgKzEsMzcxIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZVRleHR1cmU5LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lOS5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U5LmhwcCIKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q5Cit7CisJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6RGlyZWN0M0RWb2x1bWVUZXh0dXJlOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgZGVwdGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCkgOiBEaXJlY3QzREJhc2VUZXh0dXJlOShkZXZpY2UsIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkUsIGZvcm1hdCwgcG9vbCwgbGV2ZWxzLCB1c2FnZSksIHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGRlcHRoKGRlcHRoKQorCXsKKwkJaWYobGV2ZWxzID09IDApCisJCXsKKwkJCXRoaXMtPmxldmVscyA9IHN3Ojpsb2cyKHN3OjptYXgoKGludCl3aWR0aCwgKGludCloZWlnaHQsIChpbnQpZGVwdGgsIDEpKSArIDE7CisJCX0KKworCQlmb3IodW5zaWduZWQgaW50IGxldmVsID0gMDsgbGV2ZWwgPCBNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQorCQl7CisJCQlpZihsZXZlbCA8IHRoaXMtPmxldmVscykKKwkJCXsKKwkJCQl2b2x1bWVMZXZlbFtsZXZlbF0gPSBuZXcgRGlyZWN0M0RWb2x1bWU5KGRldmljZSwgdGhpcywgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgcG9vbCwgdXNhZ2UpOworCQkJCXZvbHVtZUxldmVsW2xldmVsXS0+YmluZCgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXZvbHVtZUxldmVsW2xldmVsXSA9IDA7CisJCQl9CisKKwkJCXdpZHRoID0gc3c6Om1heCgxLCAoaW50KXdpZHRoIC8gMik7CisJCQloZWlnaHQgPSBzdzo6bWF4KDEsIChpbnQpaGVpZ2h0IC8gMik7CisJCQlkZXB0aCA9IHN3OjptYXgoMSwgKGludClkZXB0aCAvIDIpOworCQl9CisJfQorCisJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6fkRpcmVjdDNEVm9sdW1lVGV4dHVyZTkoKQorCXsKKwkJcmVzb3VyY2UtPmxvY2soc3c6OkRFU1RSVUNUKTsKKworCQlmb3IoaW50IGxldmVsID0gMDsgbGV2ZWwgPCBNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQorCQl7CisJCQlpZih2b2x1bWVMZXZlbFtsZXZlbF0pCisJCQl7CisJCQkJdm9sdW1lTGV2ZWxbbGV2ZWxdLT51bmJpbmQoKTsKKwkJCQl2b2x1bWVMZXZlbFtsZXZlbF0gPSAwOworCQkJfQorCQl9CisKKwkJcmVzb3VyY2UtPnVubG9jaygpOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzREJhc2VUZXh0dXJlOSB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOSB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OlByZUxvYWQoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCURpcmVjdDNEQmFzZVRleHR1cmU5OjpQcmVMb2FkKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbih0aGlzLT5kZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldERldmljZShkZXZpY2UpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldFByaW9yaXR5KG5ld1ByaW9yaXR5KTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldFByaW9yaXR5KCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFByaW9yaXR5KCk7CisJfQorCisJRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldFR5cGUoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0VHlwZSgpOworCX0KKworCXZvaWQgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6R2VuZXJhdGVNaXBTdWJMZXZlbHMoKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCEodXNhZ2UgJiBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQKSB8fCAhdm9sdW1lTGV2ZWxbMF0tPmhhc0RpcnR5TWlwbWFwcygpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlyZXNvdXJjZS0+bG9jayhzdzo6UFVCTElDKTsKKworCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGV2ZWxzIC0gMTsgaSsrKQorCQl7CisJCQlEaXJlY3QzRFZvbHVtZTkgKnNvdXJjZSA9IHZvbHVtZUxldmVsW2ldOworCQkJRGlyZWN0M0RWb2x1bWU5ICpkZXN0ID0gdm9sdW1lTGV2ZWxbaSArIDFdOworCisJCQlzb3VyY2UtPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19SRUFET05MWSwgc3c6OlBVQkxJQyk7CisJCQlkZXN0LT5sb2NrSW50ZXJuYWwoMCwgMCwgMCwgc3c6OkxPQ0tfRElTQ0FSRCwgc3c6OlBVQkxJQyk7CisKKwkJCWludCBzV2lkdGggPSBzb3VyY2UtPmdldEludGVybmFsV2lkdGgoKTsKKwkJCWludCBzSGVpZ2h0ID0gc291cmNlLT5nZXRJbnRlcm5hbEhlaWdodCgpOworCQkJaW50IHNEZXB0aCA9IHNvdXJjZS0+Z2V0SW50ZXJuYWxEZXB0aCgpOworCisJCQlpbnQgZFdpZHRoID0gZGVzdC0+Z2V0SW50ZXJuYWxXaWR0aCgpOworCQkJaW50IGRIZWlnaHQgPSBkZXN0LT5nZXRJbnRlcm5hbEhlaWdodCgpOworCQkJaW50IGREZXB0aCA9IGRlc3QtPmdldEludGVybmFsRGVwdGgoKTsKKworCQkJRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyID0gR2V0QXV0b0dlbkZpbHRlclR5cGUoKTsKKworCQkJZmxvYXQgdyA9IChmbG9hdClzV2lkdGggLyAoZmxvYXQpZFdpZHRoOworCQkJZmxvYXQgaCA9IChmbG9hdClzSGVpZ2h0IC8gKGZsb2F0KWRIZWlnaHQ7CisJCQlmbG9hdCBkID0gKGZsb2F0KXNEZXB0aCAvIChmbG9hdClkRGVwdGg7CisKKwkJCWZsb2F0IHogPSAwLjVmICogZDsKKworCQkJZm9yKGludCBrID0gMDsgayA8IGREZXB0aDsgaysrKQorCQkJeworCQkJCWZsb2F0IHkgPSAwLjVmICogaDsKKworCQkJCWZvcihpbnQgaiA9IDA7IGogPCBkSGVpZ2h0OyBqKyspCisJCQkJeworCQkJCQlmbG9hdCB4ID0gMC41ZiAqIHc7CisKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IGRXaWR0aDsgaSsrKQorCQkJCQl7CisJCQkJCQlzdzo6Q29sb3I8ZmxvYXQ+IGNvbG9yOworCisJCQkJCQlpZihmaWx0ZXIgPD0gRDNEVEVYRl9QT0lOVCkKKwkJCQkJCXsKKwkJCQkJCQljb2xvciA9IHNvdXJjZS0+cmVhZEludGVybmFsKChpbnQpeCwgKGludCl5LCAoaW50KXopOworCQkJCQkJfQorCQkJCQkJZWxzZSAgIC8vIGZpbHRlciA+PSBEM0RURVhGX0xJTkVBUgorCQkJCQkJeworCQkJCQkJCWNvbG9yID0gc291cmNlLT5zYW1wbGVJbnRlcm5hbCh4LCB5LCB6KTsKKwkJCQkJCX0KKworCQkJCQkJZGVzdC0+d3JpdGVJbnRlcm5hbChpLCBqLCBrLCBjb2xvcik7CisKKwkJCQkJCXggKz0gdzsKKwkJCQkJfQorCisJCQkJCXkgKz0gaDsKKwkJCQl9CisKKwkJCQl6ICs9IGQ7CisJCQl9CisKKwkJCXNvdXJjZS0+dW5sb2NrSW50ZXJuYWwoKTsKKwkJCWRlc3QtPnVubG9ja0ludGVybmFsKCk7CisJCX0KKworCQl2b2x1bWVMZXZlbFswXS0+Y2xlYW5NaXBtYXBzKCk7CisKKwkJcmVzb3VyY2UtPnVubG9jaygpOworCX0KKworCUQzRFRFWFRVUkVGSUxURVJUWVBFIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldEF1dG9HZW5GaWx0ZXJUeXBlKCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldEF1dG9HZW5GaWx0ZXJUeXBlKCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpHZXRMZXZlbENvdW50KCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldExldmVsQ291bnQoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldExPRCgpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRMT0QoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OlNldEF1dG9HZW5GaWx0ZXJUeXBlKEQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlclR5cGUpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRBdXRvR2VuRmlsdGVyVHlwZShmaWx0ZXJUeXBlKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OlNldExPRCh1bnNpZ25lZCBsb25nIG5ld0xPRCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldExPRChuZXdMT0QpOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6R2V0Vm9sdW1lTGV2ZWwodW5zaWduZWQgaW50IGxldmVsLCBJRGlyZWN0M0RWb2x1bWU5ICoqdm9sdW1lKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCSp2b2x1bWUgPSAwOworCisJCWlmKGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhdm9sdW1lTGV2ZWxbbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXZvbHVtZUxldmVsW2xldmVsXS0+QWRkUmVmKCk7CisJCSp2b2x1bWUgPSB2b2x1bWVMZXZlbFtsZXZlbF07CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkxvY2tCb3godW5zaWduZWQgaW50IGxldmVsLCBEM0RMT0NLRURfQk9YICpsb2NrZWRWb2x1bWUsIGNvbnN0IEQzREJPWCAqYm94LCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7CisKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFsb2NrZWRWb2x1bWUgfHwgbGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICF2b2x1bWVMZXZlbFtsZXZlbF0pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcmV0dXJuIHZvbHVtZUxldmVsW2xldmVsXS0+TG9ja0JveChsb2NrZWRWb2x1bWUsIGJveCwgZmxhZ3MpOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6VW5sb2NrQm94KHVuc2lnbmVkIGludCBsZXZlbCkKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZihsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXZvbHVtZUxldmVsW2xldmVsXSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlyZXR1cm4gdm9sdW1lTGV2ZWxbbGV2ZWxdLT5VbmxvY2tCb3goKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkFkZERpcnR5Qm94KGNvbnN0IEQzREJPWCAqZGlydHlCb3gpCisJeworCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKKworCQlUUkFDRSgiIik7CisKKwkvLwlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldExldmVsRGVzYyh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRFZPTFVNRV9ERVNDICpkZXNjcmlwdGlvbikKKwl7CisJCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOworCisJCVRSQUNFKCIiKTsKKworCQlpZighZGVzY3JpcHRpb24gfHwgbGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICF2b2x1bWVMZXZlbFtsZXZlbF0pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcmV0dXJuIHZvbHVtZUxldmVsW2xldmVsXS0+R2V0RGVzYyhkZXNjcmlwdGlvbik7CisJfQorCisJRGlyZWN0M0RWb2x1bWU5ICpEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpnZXRJbnRlcm5hbFZvbHVtZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCkKKwl7CisJCXJldHVybiB2b2x1bWVMZXZlbFtsZXZlbF07CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWb2x1bWVUZXh0dXJlOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzRFZvbHVtZVRleHR1cmU5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmEyNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RWb2x1bWVUZXh0dXJlOS5ocHAKQEAgLTAsMCArMSw3NSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIEQzRDlfRGlyZWN0M0RWb2x1bWVUZXh0dXJlOV9ocHAKKyNkZWZpbmUgRDNEOV9EaXJlY3QzRFZvbHVtZVRleHR1cmU5X2hwcAorCisjaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwIgorCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKworI2luY2x1ZGUgPGQzZDkuaD4KKworbmFtZXNwYWNlIEQzRDkKK3sKKwljbGFzcyBEaXJlY3QzRFZvbHVtZTk7CisKKwljbGFzcyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5IDogcHVibGljIElEaXJlY3QzRFZvbHVtZVRleHR1cmU5LCBwdWJsaWMgRGlyZWN0M0RCYXNlVGV4dHVyZTkKKwl7CisJcHVibGljOgorCQlEaXJlY3QzRFZvbHVtZVRleHR1cmU5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBkZXB0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzRFZvbHVtZVRleHR1cmU5KCk7CisKKwkJLy8gSVVua25vd24gbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7CisKKwkJLy8gSURpcmVjdDNEUmVzb3VyY2U5IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKTsKKwkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKTsKKwkJdm9pZCBfX3N0ZGNhbGwgUHJlTG9hZCgpOworCQlEM0RSRVNPVVJDRVRZUEUgX19zdGRjYWxsIEdldFR5cGUoKTsKKworCQkvLyBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgbWV0aG9kcworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMT0QoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxDb3VudCgpOworCQlsb25nIF9fc3RkY2FsbCBTZXRBdXRvR2VuRmlsdGVyVHlwZShEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXJUeXBlKTsKKwkJRDNEVEVYVFVSRUZJTFRFUlRZUEUgX19zdGRjYWxsIEdldEF1dG9HZW5GaWx0ZXJUeXBlKCk7CisJCXZvaWQgX19zdGRjYWxsIEdlbmVyYXRlTWlwU3ViTGV2ZWxzKCk7CisKKwkJLy8gSURpcmVjdDNEVm9sdW1lVGV4dHVyZTkgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RWT0xVTUVfREVTQyAqZGVzY3JpcHRpb24pOworCQlsb25nIF9fc3RkY2FsbCBHZXRWb2x1bWVMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwsIElEaXJlY3QzRFZvbHVtZTkgKip2b2x1bWUpOworCQlsb25nIF9fc3RkY2FsbCBMb2NrQm94KHVuc2lnbmVkIGludCBsZXZlbCwgRDNETE9DS0VEX0JPWCAqbG9ja2VkVm9sdW1lLCBjb25zdCBEM0RCT1ggKmJveCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIFVubG9ja0JveCh1bnNpZ25lZCBpbnQgbGV2ZWwpOworCQlsb25nIF9fc3RkY2FsbCBBZGREaXJ0eUJveChjb25zdCBEM0RCT1ggKmRpcnR5Qm94KTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCURpcmVjdDNEVm9sdW1lOSAqZ2V0SW50ZXJuYWxWb2x1bWVMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwpOworCisJcHJpdmF0ZToKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQljb25zdCB1bnNpZ25lZCBpbnQgd2lkdGg7CisJCWNvbnN0IHVuc2lnbmVkIGludCBoZWlnaHQ7CisJCWNvbnN0IHVuc2lnbmVkIGludCBkZXB0aDsKKworCQlEaXJlY3QzRFZvbHVtZTkgKnZvbHVtZUxldmVsW01JUE1BUF9MRVZFTFNdOworCX07Cit9CisKKyNlbmRpZiAvLyBEM0Q5X0RpcmVjdDNEVm9sdW1lVGV4dHVyZTlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9Td2lmdFNoYWRlci5jcHAgYi9zcmMvRDNEOS9Td2lmdFNoYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmN2U0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L1N3aWZ0U2hhZGVyLmNwcApAQCAtMCwwICsxLDEwNSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiU3dpZnRTaGFkZXIuaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0Q5LmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorCSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGluaXRndWlkLmg+CisKK0RFRklORV9HVUlEKElJRF9Td2lmdFNoYWRlclByaXZhdGVWMSwgMHg3NjE5NTRFNiwgMHhDMzU3LCAweDQyNmQsIDB4QTYsIDB4OTAsIDB4MDAsIDB4NTAsIDB4NTYsIDB4QzAsIDB4MDAsIDB4MDgpOworCitleHRlcm4gU1dGSUxURVIgbWF4aW11bUZpbHRlclF1YWxpdHk7CitleHRlcm4gU1dGSUxURVIgbWF4aW11bU1pcG1hcFF1YWxpdHk7CitleHRlcm4gU1dQRVJTUEVDVElWRSBwZXJzcGVjdGl2ZVF1YWxpdHk7CitleHRlcm4gYm9vbCBkaXNhYmxlU2VydmVyOworCituYW1lc3BhY2UgRDNEOQoreworCVN3aWZ0U2hhZGVyOjpTd2lmdFNoYWRlcihEaXJlY3QzRDkgKmQzZDkpIDogZDNkOShkM2Q5KQorCXsKKwkJSW5pdFZhbGlkYXRpb25BcHAoKTsKKwl9CisKKwlTd2lmdFNoYWRlcjo6flN3aWZ0U2hhZGVyKCkKKwl7CisJfQorCisJbG9uZyBTd2lmdFNoYWRlcjo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoaWlkID09IElJRF9Td2lmdFNoYWRlclByaXZhdGVWMSB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgU3dpZnRTaGFkZXI6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgU3dpZnRTaGFkZXI6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBTd2lmdFNoYWRlcjo6UmVnaXN0ZXJMaWNlbnNlS2V5KGNoYXIgKmxpY2Vuc2VLZXkpCisJeworCQlUUkFDRSgiIik7CisKKwkJbWVtc2V0KHZhbGlkYXRpb25LZXksICdcMCcsIHNpemVvZih2YWxpZGF0aW9uS2V5KSk7CisJCXN0cm5jcHkodmFsaWRhdGlvbktleSwgbGljZW5zZUtleSwgc3RybGVuKGxpY2Vuc2VLZXkpKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgU3dpZnRTaGFkZXI6OlNldENvbnRyb2xTZXR0aW5nKFNXU0VUVElOR1RZUEUgc2V0dGluZywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKKwl7CisJCXN3aXRjaChzZXR0aW5nKQorCQl7CisJCWNhc2UgU1dTX01BWElNVU1GSUxURVJRVUFMSVRZOgorCQkJbWF4aW11bUZpbHRlclF1YWxpdHkgPSAoU1dGSUxURVIpdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBTV1NfTUFYSU1VTU1JUE1BUFFVQUxJVFk6CisJCQltYXhpbXVtTWlwbWFwUXVhbGl0eSA9IChTV0ZJTFRFUil2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNXU19QRVJTUEVDVElWRVFVQUxJVFk6CisJCQlwZXJzcGVjdGl2ZVF1YWxpdHkgPSAoU1dQRVJTUEVDVElWRSl2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNXU19ESVNBQkxFU0VSVkVSOgorCQkJZGlzYWJsZVNlcnZlciA9ICh2YWx1ZSAhPSBGQUxTRSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L1N3aWZ0U2hhZGVyLmggYi9zcmMvRDNEOS9Td2lmdFNoYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzQwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9Td2lmdFNoYWRlci5oCkBAIC0wLDAgKzEsMTM0IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgX1NXSUZUU0hBREVSX0hfCisjZGVmaW5lIF9TV0lGVFNIQURFUl9IXworCisjaW5jbHVkZSAiUmVnaXN0ZXIuaHBwIgorCisjaW5jbHVkZSA8b2JqYmFzZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIFNXSUZUU0hBREVSQVBJIFdJTkFQSQorCisvKgorICogSW50ZXJmYWNlIElJRCdzCisgKi8KKyNpZiBkZWZpbmVkKCBfV0lOMzIgKSAmJiAhZGVmaW5lZCggX05PX0NPTSkKKworLyogSUlEX1N3aWZ0U2hhZGVyUHJpdmF0ZVYxICovCisvKiB7NzYxOTU0RTYtQzM1Ny0xMURBLUE2OTAtMDA1MDU2QzAwMDA4fSAqLworREVGSU5FX0dVSUQoSUlEX1N3aWZ0U2hhZGVyUHJpdmF0ZVYxLCAweDc2MTk1NEU2LCAweEMzNTcsIDB4NDI2ZCwgMHhBNiwgMHg5MCwgMHgwMCwgMHg1MCwgMHg1NiwgMHhDMCwgMHgwMCwgMHgwOCk7CisKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2lmbmRlZiBERUNMU1BFQ19VVUlECisjaWYgX01TQ19WRVIgPj0gMTEwMAorI2RlZmluZSBERUNMU1BFQ19VVUlEKHgpICAgIF9fZGVjbHNwZWModXVpZCh4KSkKKyNlbHNlCisjZGVmaW5lIERFQ0xTUEVDX1VVSUQoeCkKKyNlbmRpZgorI2VuZGlmCisKK2ludGVyZmFjZSBERUNMU1BFQ19VVUlEKCI3NjE5NTRFNi1DMzU3LTExREEtQTY5MC0wMDUwNTZDMDAwMDgiKSBJSURfU3dpZnRTaGFkZXJQcml2YXRlVjE7CisKKworI2lmIGRlZmluZWQoX0NPTV9TTUFSVFBUUl9UWVBFREVGKQorX0NPTV9TTUFSVFBUUl9UWVBFREVGKElTd2lmdFNoYWRlclByaXZhdGVWMSwgX191dWlkb2YoSVN3aWZ0U2hhZGVyUHJpdmF0ZVYxKSk7CisjZW5kaWYKKyNlbmRpZgorCisKK3R5cGVkZWYgaW50ZXJmYWNlIElTd2lmdFNoYWRlclByaXZhdGVWMSAgSVN3aWZ0U2hhZGVyUHJpdmF0ZVYxOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKgorICogU3dpZnRTaGFkZXIgUHJpdmF0ZSBpbnRlcmZhY2UKKyAqLworIAordHlwZWRlZiBlbnVtIF9TV1NFVFRJTkdUWVBFIHsKKwlTV1NfTUFYSU1VTUZJTFRFUlFVQUxJVFkJPSAxLCAvKiBTV0ZJTFRFUiB0ZXh0dXJlIGZpbHRlcmluZyBxdWFsaXR5ICovCisJU1dTX01BWElNVU1NSVBNQVBRVUFMSVRZCT0gMiwgLyogU1dGSUxURVIgbWlwbWFwIGZpbHRlcmluZyBxdWFsaXR5ICovCisJU1dTX1BFUlNQRUNUSVZFUVVBTElUWQkJPSAzLCAvKiBTV1BFUlNQRUNUSVZFIHBlcnNwZWN0aXZlIGNvcnJlY3Rpb24gcXVhbGl0eSAqLworCVNXU19ESVNBQkxFU0VSVkVSCQkJPSA0LCAvKiBCT09MIGRpc2FibGUgU3dpZnRDb25maWcgc2VydmVyICovCisJU1dTX0ZPUkNFX0RXT1JECQkJCT0gMHg3ZmZmZmZmZiwgLyogZm9yY2UgMzItYml0IHNpemUgZW51bSAqLworfSBTV1NFVFRJTkdUWVBFOworCit0eXBlZGVmIGVudW0gX1NXRklMVEVSIHsKKwlTV0ZfREVGQVVMVAkJPSAwLCAvKiBEZWZhdWx0IGZpbHRlciBxdWFsaXR5IChidWlsZCBkZXBlbmRlbnQpICovCisJU1dGX05PTkUJCT0gMSwgLyogTm8gZmlsdGVyaW5nICh0ZXh0dXJlL21pcG1hcCkgKi8KKwlTV0ZfUE9JTlQJCT0gMiwgLyogUG9pbnQgZmlsdGVyaW5nICh0ZXh0dXJlL21pcG1hcCkgKi8KKwlTV0ZfQVZFUkFHRTIJPSAzLCAvKiBBdmVyYWdpbmcgMiBwb2ludCBzYW1wbGVzICh0ZXh0dXJlKSAqLworCVNXRl9BVkVSQUdFNAk9IDQsIC8qIEF2ZXJhZ2luZyA0IHBvaW50IHNhbXBsZXMgKHRleHR1cmUpICovCisJU1dGX1BPTFlHT04JCT0gNSwgLyogUGVyLXBvbHlnb24gbWlwbWFwcGluZyAqLworCVNXRl9MSU5FQVIJCT0gNiwgLyogKEJpKWxpbmVhciBmaWx0ZXJpbmcgKHRleHR1cmUvbWlwYW1wKSAqLworCVNXRl9NQVhJTVVNCQk9IDcsIC8qIE5vIGxpbWl0YXRpb24gb24gZmlsdGVyIHF1YWxpdHkgKi8KKwlTV0ZfRk9SQ0VfRFdPUkQJPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovCit9IFNXRklMVEVSOworCit0eXBlZGVmIGVudW0gX1NXUEVSU1BFQ1RJVkUgeworCVNXUF9ERUZBVUxUCQk9IDAsIC8qIERlZmF1bHQgcGVyc3BlY3RpdmUgY29ycmVjdGlvbiBxdWFsaXR5ICovCisJU1dQX05PTkUJCT0gMSwgLyogTm8gcGVyc3BlY3RpdmUgY29ycmVjdGlvbiAoYWZmaW5lIHRleHR1cmUgbWFwcGluZykgKi8KKwlTV1BfRkFTVAkJPSAyLCAvKiBGYXN0IGxvdy1wcmVjaXNpb24gcGVyc3BlY3RpdmUgY29ycmVjdGlvbiAqLworCVNXUF9BQ0NVUkFURQk9IDMsIC8qIFNsb3dlciBoaWdoLXByZWNpc2lvbiBwZXJzcGVjdGl2ZSBjb3JyZWN0aW9uICovCisJU1dQX0ZPUkNFX0RXT1JECT0gMHg3ZmZmZmZmZiwgLyogZm9yY2UgMzItYml0IHNpemUgZW51bSAqLworfSBTV1BFUlNQRUNUSVZFOworCisjdW5kZWYgSU5URVJGQUNFCisjZGVmaW5lIElOVEVSRkFDRSBJU3dpZnRTaGFkZXJQcml2YXRlVjEKKworREVDTEFSRV9JTlRFUkZBQ0VfKElTd2lmdFNoYWRlclByaXZhdGVWMSwgSVVua25vd24pCit7CisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsKKworICAgIC8qKiogSVN3aWZ0U2hhZGVyUHJpdmF0ZVYxIG1ldGhvZHMgKioqLworICAgIFNURE1FVEhPRChSZWdpc3RlckxpY2Vuc2VLZXkpKFRISVNfIGNoYXIqIHBMaWNlbnNlS2V5KSBQVVJFOworCVNURE1FVEhPRChTZXRDb250cm9sU2V0dGluZykoVEhJU18gU1dTRVRUSU5HVFlQRSBTZXR0aW5nLERXT1JEIFZhbHVlKSBQVVJFOworfTsKKyAgICAKK3R5cGVkZWYgc3RydWN0IElTd2lmdFNoYWRlclByaXZhdGVWMSAqTFBTV0lGVFNIQURFUlBSSVZBVEVWMSwgKkxQU1dJRlRTSEFERVJQUklWQVRFVjE7CisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQorI2RlZmluZSBJU3dpZnRTaGFkZXJQcml2YXRlVjFfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwLGEsYikKKyNkZWZpbmUgSVN3aWZ0U2hhZGVyUHJpdmF0ZVYxX0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApCisjZGVmaW5lIElTd2lmdFNoYWRlclByaXZhdGVWMV9SZWxlYXNlKHApIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApCisjZGVmaW5lIElTd2lmdFNoYWRlclByaXZhdGVWMV9SZWdpc3RlckxpY2Vuc2VLZXkocCxhKSAocCktPmxwVnRibC0+UmVnaXN0ZXJMaWNlbnNlS2V5KHAsYSkKKyNlbHNlCisjZGVmaW5lIElTd2lmdFNoYWRlclByaXZhdGVWMV9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpCisjZGVmaW5lIElTd2lmdFNoYWRlclByaXZhdGVWMV9BZGRSZWYocCkgKHApLT5BZGRSZWYoKQorI2RlZmluZSBJU3dpZnRTaGFkZXJQcml2YXRlVjFfUmVsZWFzZShwKSAocCktPlJlbGVhc2UoKQorI2RlZmluZSBJU3dpZnRTaGFkZXJQcml2YXRlVjFfUmVnaXN0ZXJMaWNlbnNlS2V5KHAsYSkgKHApLT5SZWdpc3RlckxpY2Vuc2VLZXkoYSkKKyNlbmRpZgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZsYWdzIGZvciBTd2lmdFNoYWRlciAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTV0lGVFNIQURFUl9TT01FX1JBTkRPTV9GTEFHIDB4MDAwMDAwMDFMCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZiAvKiBfU1dJRlRTSEFERVJfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvU3dpZnRTaGFkZXIuaHBwIGIvc3JjL0QzRDkvU3dpZnRTaGFkZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OTFiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9Td2lmdFNoYWRlci5ocHAKQEAgLTAsMCArMSw0NCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgRDNEOV9Td2lmdFNoYWRlcl9ocHANCisjZGVmaW5lIEQzRDlfU3dpZnRTaGFkZXJfaHBwDQorDQorI2luY2x1ZGUgIlN3aWZ0U2hhZGVyLmgiDQorI2luY2x1ZGUgIlVua25vd24uaHBwIg0KKw0KK25hbWVzcGFjZSBEM0Q5DQorew0KKwljbGFzcyBEaXJlY3QzRDk7DQorDQorCWNsYXNzIFN3aWZ0U2hhZGVyIDogcHVibGljIElTd2lmdFNoYWRlclByaXZhdGVWMSwgcHVibGljIFVua25vd24NCisJew0KKwlwdWJsaWM6DQorCQlTd2lmdFNoYWRlcihEaXJlY3QzRDkgKmQzZDkpOw0KKw0KKwkJdmlydHVhbCB+U3dpZnRTaGFkZXIoKTsNCisNCisJCS8vIElVbmtub3duIG1ldGhvZHMNCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsNCisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOw0KKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOw0KKw0KKwkJLy8gSVN3aWZ0U2hhZGVyUHJpdmF0ZVYxIG1ldGhvZHMNCisJCWxvbmcgX19zdGRjYWxsIFJlZ2lzdGVyTGljZW5zZUtleShjaGFyICpsaWNlbnNlS2V5KTsNCisJCWxvbmcgX19zdGRjYWxsIFNldENvbnRyb2xTZXR0aW5nKFNXU0VUVElOR1RZUEUgc2V0dGluZywgdW5zaWduZWQgbG9uZyB2YWx1ZSk7DQorDQorCXByaXZhdGU6DQorCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzDQorCQlEaXJlY3QzRDkgKmNvbnN0IGQzZDk7DQorCX07DQorfQ0KKw0KKyNlbmRpZiAgIC8vIEQzRDlfU3dpZnRTaGFkZXJfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvVW5rbm93bi5jcHAgYi9zcmMvRDNEOS9Vbmtub3duLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFkNDRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvVW5rbm93bi5jcHAKQEAgLTAsMCArMSw4MyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKK25hbWVzcGFjZSBEM0Q5Cit7CisJVW5rbm93bjo6VW5rbm93bigpCisJeworCQlyZWZlcmVuY2VDb3VudCA9IDA7CisJCWJpbmRDb3VudCA9IDA7CisJfQorCisJVW5rbm93bjo6flVua25vd24oKQorCXsKKwkJQVNTRVJUKHJlZmVyZW5jZUNvdW50ID09IDApOworCQlBU1NFUlQoYmluZENvdW50ID09IDApOworCX0KKworCWxvbmcgVW5rbm93bjo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlpZihpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCQkJCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgVW5rbm93bjo6QWRkUmVmKCkKKwl7CisJCXJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCgmcmVmZXJlbmNlQ291bnQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgVW5rbm93bjo6UmVsZWFzZSgpCisJeworCQlpbnQgY3VycmVudCA9IHJlZmVyZW5jZUNvdW50OworCQkKKwkJaWYocmVmZXJlbmNlQ291bnQgPiAwKQorCQl7CisJCQljdXJyZW50ID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJnJlZmVyZW5jZUNvdW50KTsKKwkJfQorCisJCWlmKHJlZmVyZW5jZUNvdW50ID09IDAgJiYgYmluZENvdW50ID09IDApCisJCXsKKwkJCWRlbGV0ZSB0aGlzOworCQl9CisKKwkJcmV0dXJuIGN1cnJlbnQ7CisJfQorCisJdm9pZCBVbmtub3duOjpiaW5kKCkKKwl7CisJCUludGVybG9ja2VkSW5jcmVtZW50KCZiaW5kQ291bnQpOworCX0KKworCXZvaWQgVW5rbm93bjo6dW5iaW5kKCkKKwl7CisJCUFTU0VSVChiaW5kQ291bnQgPiAwKTsKKworCQlJbnRlcmxvY2tlZERlY3JlbWVudCgmYmluZENvdW50KTsKKworCQlpZihyZWZlcmVuY2VDb3VudCA9PSAwICYmIGJpbmRDb3VudCA9PSAwKQorCQl7CisJCQlkZWxldGUgdGhpczsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9Vbmtub3duLmhwcCBiL3NyYy9EM0Q5L1Vua25vd24uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzJjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOS9Vbmtub3duLmhwcApAQCAtMCwwICsxLDQxIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgRDNEOV9Vbmtub3duX2hwcAorI2RlZmluZSBEM0Q5X1Vua25vd25faHBwCisKKyNpbmNsdWRlIDx1bmtud24uaD4KKworbmFtZXNwYWNlIEQzRDkKK3sKKwljbGFzcyBVbmtub3duIDogSVVua25vd24KKwl7CisJcHVibGljOgorCQlVbmtub3duKCk7CisKKwkJdmlydHVhbCB+VW5rbm93bigpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIEludGVybmFsIG1ldGhvZHMKKwkJdmlydHVhbCB2b2lkIGJpbmQoKTsKKwkJdmlydHVhbCB2b2lkIHVuYmluZCgpOworCisJcHJpdmF0ZToKKwkJdm9sYXRpbGUgbG9uZyByZWZlcmVuY2VDb3VudDsKKwkJdm9sYXRpbGUgbG9uZyBiaW5kQ291bnQ7CisJfTsKK30KKworI2VuZGlmICAgLy8gRDNEOV9Vbmtub3duX2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvZDNkOS5kZWYgYi9zcmMvRDNEOS9kM2Q5LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjZmNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDkvZDNkOS5kZWYKQEAgLTAsMCArMSwxOCBAQAorTElCUkFSWSBEM0Q5CitFWFBPUlRTCisJRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3JDcmVhdGU5CUAxCisJUFNHUEVycm9yCQkJCQkJQDIKKwlQU0dQU2FtcGxlVGV4dHVyZQkJCQlAMworCUQzRFBFUkZfQmVnaW5FdmVudAkJCQlANAorCUQzRFBFUkZfRW5kRXZlbnQJCQkJQDUKKwlEM0RQRVJGX0dldFN0YXR1cwkJCQlANgorCUQzRFBFUkZfUXVlcnlSZXBlYXRGcmFtZQkJQDcKKwlEM0RQRVJGX1NldE1hcmtlcgkJCQlAOAorCUQzRFBFUkZfU2V0T3B0aW9ucwkJCQlAOQorCUQzRFBFUkZfU2V0UmVnaW9uCQkJCUAxMAorCURlYnVnU2V0TGV2ZWwJCQkJCUAxMQorCURlYnVnU2V0TXV0ZQkJCQkJQDEyCisJRGlyZWN0M0RDcmVhdGU5CQkJCQlAMTMKKwlEaXJlY3QzRENyZWF0ZTlFeAkJCQlAMTQKKworCVJlZ2lzdGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvcmVzb3VyY2UuaCBiL3NyYy9EM0Q5L3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhZTYyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q5L3Jlc291cmNlLmgKQEAgLTAsMCArMSwxNCBAQAorLy97e05PX0RFUEVOREVOQ0lFU319CisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgorLy8gVXNlZCBieSBEM0Q5LnJjCisKKy8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCisvLyAKKyNpZmRlZiBBUFNUVURJT19JTlZPS0VECisjaWZuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKyNkZWZpbmUgX0FQU19ORVhUX1JFU09VUkNFX1ZBTFVFICAgICAgICAxMDEKKyNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUgICAgICAgICA0MDAwMQorI2RlZmluZSBfQVBTX05FWFRfQ09OVFJPTF9WQUxVRSAgICAgICAgIDEwMDEKKyNkZWZpbmUgX0FQU19ORVhUX1NZTUVEX1ZBTFVFICAgICAgICAgICAxMDEKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9DUkVESVRTLlRYVCBiL3NyYy9MTFZNL0NSRURJVFMuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDY3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9DUkVESVRTLlRYVApAQCAtMCwwICsxLDMzNyBAQAorVGhpcyBmaWxlIGlzIGEgcGFydGlhbCBsaXN0IG9mIHBlb3BsZSB3aG8gaGF2ZSBjb250cmlidXRlZCB0byB0aGUgTExWTQorcHJvamVjdC4gIElmIHlvdSBoYXZlIGNvbnRyaWJ1dGVkIGEgcGF0Y2ggb3IgbWFkZSBzb21lIG90aGVyIGNvbnRyaWJ1dGlvbiB0bworTExWTSwgcGxlYXNlIHN1Ym1pdCBhIHBhdGNoIHRvIHRoaXMgZmlsZSB0byBhZGQgeW91cnNlbGYsIGFuZCBpdCB3aWxsIGJlCitkb25lIQorCitUaGUgbGlzdCBpcyBzb3J0ZWQgYnkgc3VybmFtZSBhbmQgZm9ybWF0dGVkIHRvIGFsbG93IGVhc3kgZ3JlcHBpbmcgYW5kCitiZWF1dGlmaWNhdGlvbiBieSBzY3JpcHRzLiAgVGhlIGZpZWxkcyBhcmU6IG5hbWUgKE4pLCBlbWFpbCAoRSksIHdlYi1hZGRyZXNzCisoVyksIFBHUCBrZXkgSUQgYW5kIGZpbmdlcnByaW50IChQKSwgZGVzY3JpcHRpb24gKEQpLCBhbmQgc25haWwtbWFpbCBhZGRyZXNzCisoUykuCisKK046IFZpa3JhbSBBZHZlCitFOiB2YWR2ZUBjcy51aXVjLmVkdQorVzogaHR0cDovL3d3dy5jcy51aXVjLmVkdS9+dmFkdmUvCitEOiBUaGUgU3BhcmM2NCBiYWNrZW5kLCBwcm92aWRlciBvZiBtdWNoIHdpc2RvbSwgYW5kIG1vdGl2YXRvciBmb3IgTExWTQorCitOOiBPd2VuIEFuZGVyc29uCitFOiByZXNpc3RvckBtYWMuY29tCitEOiBMQ1NTQSBwYXNzIGFuZCByZWxhdGVkIExvb3BVbnN3aXRjaCB3b3JrCitEOiBHVk5QUkUgcGFzcywgVGFyZ2V0RGF0YSByZWZhY3RvcmluZywgcmFuZG9tIGltcHJvdmVtZW50cworCitOOiBIZW5yaWsgQmFjaAorRDogTWluZ1cgV2luMzIgQVBJIHBvcnRhYmlsaXR5IGxheWVyCisKK046IE5hdGUgQmVnZW1hbgorRTogbmF0ZWJlZ2VtYW5AbWFjLmNvbQorRDogUG93ZXJQQyBiYWNrZW5kIGRldmVsb3BlcgorRDogVGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgZ2VuZXJhdG9yIGFuZCBhbmFseXNpcyBpbXByb3ZlbWVudHMKKworTjogRGFuaWVsIEJlcmxpbgorRTogZGJlcmxpbkBkYmVybGluLm9yZworRDogRVQtRm9yZXN0IGltcGxlbWVudGF0aW9uLgorRDogU3BhcnNlIGJpdG1hcAorCitOOiBOZWlsIEJvb3RoCitFOiBuZWlsQGRhaWtva3V5YS5jby51aworRDogQVBGbG9hdCBpbXBsZW1lbnRhdGlvbi4KKworTjogTWlzaGEgQnJ1a21hbgorRTogYnJ1a21hbitsbHZtQHVpdWMuZWR1CitXOiBodHRwOi8vbWlzaGEuYnJ1a21hbi5uZXQKK0Q6IFBvcnRpb25zIG9mIFg4NiBhbmQgU3BhcmMgSklUIGNvbXBpbGVycywgUG93ZXJQQyBiYWNrZW5kCitEOiBJbmNyZW1lbnRhbCBieXRlY29kZSBsb2FkZXIKKworTjogQ2FtZXJvbiBCdXNjaGFyZHQKK0U6IGJ1c2NoYXJkQHVpdWMuZWR1CitEOiBUaGUgYG1lbTJyZWcnIHBhc3MgLSBwcm9tb3RlcyB2YWx1ZXMgc3RvcmVkIGluIG1lbW9yeSB0byByZWdpc3RlcnMKKworTjogQ2hhbmRsZXIgQ2FycnV0aAorRTogY2hhbmRsZXJjQGdtYWlsLmNvbQorRDogTGlua1RpbWVPcHRpbWl6ZXIgZm9yIExpbnV4LCB2aWEgYmludXRpbHMgaW50ZWdyYXRpb24sIGFuZCBDIEFQSQorCitOOiBDYXNleSBDYXJ0ZXIKK0U6IGNjYXJ0ZXJAdWl1Yy5lZHUKK0Q6IEZpeGVzIHRvIHRoZSBSZWFzc29jaWF0aW9uIHBhc3MsIHZhcmlvdXMgaW1wcm92ZW1lbnQgcGF0Y2hlcworCitOOiBFdmFuIENoZW5nCitFOiBldmFuLmNoZW5nQGFwcGxlLmNvbQorRDogQVJNIGFuZCBYODYgYmFja2VuZHMKK0Q6IEluc3RydWN0aW9uIHNjaGVkdWxlciBpbXByb3ZlbWVudHMKK0Q6IFJlZ2lzdGVyIGFsbG9jYXRvciBpbXByb3ZlbWVudHMKK0Q6IExvb3Agb3B0aW1pemVyIGltcHJvdmVtZW50cworRDogVGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgZ2VuZXJhdG9yIGltcHJvdmVtZW50cworCitOOiBEYW4gVmlsbGlvbSBQb2RsYXNraSBDaHJpc3RpYW5zZW4KK0U6IGRhbmNockBnbWFpbC5jb20KK0U6IGRhbmNockBjcy5hdS5kaworVzogaHR0cDovL3ZpbGxpb20uZGsKK0Q6IExMVk0gTWFrZWZpbGUgaW1wcm92ZW1lbnRzCitEOiBDbGFuZyBkaWFnbm9zdGljICYgZHJpdmVyIHR3ZWFrcworUzogQWFyaHVzLCBEZW5tYXJrCisKK046IEplZmYgQ29oZW4KK0U6IGplZmZjQGpvbHQtbGFuZy5vcmcKK1c6IGh0dHA6Ly9qb2x0LWxhbmcub3JnCitEOiBOYXRpdmUgV2luMzIgQVBJIHBvcnRhYmlsaXR5IGxheWVyCisKK046IEpvaG4gVC4gQ3Jpc3dlbGwKK0U6IGNyaXN3ZWxsQHVpdWMuZWR1CitEOiBPcmlnaW5hbCBBdXRvY29uZiBzdXBwb3J0LCBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cywgYnVnIGZpeGVzCisKK046IFN0ZWZhbnVzIER1IFRvaXQKK0U6IHN0ZWZhbnVzLmR1dG9pdEByYXBpZG1pbmQuY29tCitEOiBCdWcgZml4ZXMgYW5kIG1pbm9yIGltcHJvdmVtZW50cworCitOOiBSYWZhZWwgQXZpbGEgZGUgRXNwaW5kb2xhCitFOiByYWZhZWwuZXNwaW5kb2xhQGdtYWlsLmNvbQorRDogVGhlIEFSTSBiYWNrZW5kCisKK046IEFsa2lzIEV2bG9naW1lbm9zCitFOiBhbGtpc0BldmxvZ2ltZW5vcy5jb20KK0Q6IExpbmVhciBzY2FuIHJlZ2lzdGVyIGFsbG9jYXRvciwgbWFueSBjb2RlZ2VuIGltcHJvdmVtZW50cywgSmF2YSBmcm9udGVuZAorCitOOiBSeWFuIEZseW5uCitFOiBwaXp6YUBwYXJzZWVycm9yLmNvbQorRDogTWlzY2VsbGFuZW91cyBidWcgZml4ZXMKKworTjogQnJpYW4gR2Fla2UKK0U6IGdhZWtlQHVpdWMuZWR1CitXOiBodHRwOi8vd3d3LnN0dWRlbnRzLnVpdWMuZWR1L35nYWVrZS8KK0Q6IFBvcnRpb25zIG9mIFg4NiBzdGF0aWMgYW5kIEpJVCBjb21waWxlcnM7IGluaXRpYWwgU3BhcmNWOCBiYWNrZW5kCitEOiBEeW5hbWljIHRyYWNlIG9wdGltaXplcgorRDogRnJlZUJTRC9YODYgY29tcGF0aWJpbGl0eSBmaXhlcywgdGhlIGxsdm0tbm0gdG9vbAorCitOOiBOaWNvbGFzIEdlb2ZmcmF5CitFOiBuaWNvbGFzLmdlb2ZmcmF5QGxpcDYuZnIKK1c6IGh0dHA6Ly93d3ctc3JjLmxpcDYuZnIvaG9tZXBhZ2VzL05pY29sYXMuR2VvZmZyYXkvCitEOiBQUEMgYmFja2VuZCBmaXhlcyBmb3IgTGludXgKKworTjogTG91aXMgR2VyYmFyZworRDogUG9ydGlvbnMgb2YgdGhlIFBvd2VyUEMgYmFja2VuZAorCitOOiBTYWVtIEdoYW5pCitFOiBzYWVtZ2hhbmlAZ21haWwuY29tCitEOiBDYWxsZ3JhcGggY2xhc3MgY2xlYW51cHMKKworTjogTWlraGFpbCBHbHVzaGVua292CitFOiBmb2xkckBjb2RlZGdlcnMuY29tCitEOiBBdXRob3Igb2YgbGx2bWMyCisKK046IERhbiBHb2htYW4KK0U6IGdvaG1hbkBhcHBsZS5jb20KK0Q6IE1pc2NlbGxhbmVvdXMgYnVnIGZpeGVzCisKK046IERhdmlkIEdvb2R3aW4KK0U6IGRhdmlkQGdvb2R3aW56Lm5ldAorRDogVGh1bWItMiBjb2RlIGdlbmVyYXRvcgorCitOOiBEYXZpZCBHcmVlbmUKK0U6IGdyZWVuZWRAb2JibGlnYXRvLm9yZworRDogTWlzY2VsbGFuZW91cyBidWcgZml4ZXMKK0Q6IFJlZ2lzdGVyIGFsbG9jYXRpb24gcmVmYWN0b3JpbmcKKworTjogR2Fib3IgR3JlaWYKK0U6IGdncmVpZkBnbWFpbC5jb20KK0Q6IEltcHJvdmVtZW50cyBmb3Igc3BhY2UgZWZmaWNpZW5jeQorCitOOiBMYW5nIEhhbWVzCitFOiBsaGFtZXNAZ21haWwuY29tCitEOiBQQlFQLWJhc2VkIHJlZ2lzdGVyIGFsbG9jYXRvcgorCitOOiBHb3Jkb24gSGVucmlrc2VuCitFOiBnb3Jkb25oZW5yaWtzZW5AbWFjLmNvbQorRDogUGx1Z2dhYmxlIEdDIHN1cHBvcnQKK0Q6IEMgaW50ZXJmYWNlCitEOiBPY2FtbCBiaW5kaW5ncworCitOOiBSYXVsIEZlcm5hbmRlcyBIZXJic3RlcgorRTogcmF1bEBkc2MudWZjZy5lZHUuYnIKK0Q6IEpJVCBzdXBwb3J0IGZvciBBUk0KKworTjogUGFvbG8gSW52ZXJuaXp6aQorRTogYXJhdGhvcm5AZmFzdHdlYm5ldC5pdAorRDogVmlzdWFsIEMrKyBjb21wYXRpYmlsaXR5IGZpeGVzCisKK046IFBhdHJpY2sgSmVua2lucworRTogcGF0amVua0B3YW0udW1kLmVkdQorRDogTmlnaHRseSBUZXN0ZXIKKworTjogRGFsZSBKb2hhbm5lc2VuCitFOiBkYWxlakBhcHBsZS5jb20KK0Q6IEFSTSBjb25zdGFudCBpc2xhbmRzIGltcHJvdmVtZW50cworRDogVGFpbCBtZXJnaW5nIGltcHJvdmVtZW50cworRDogUmV3cml0ZSBYODcgYmFjayBlbmQKK0Q6IFVzZSBBUEZsb2F0IGZvciBmbG9hdGluZyBwb2ludCBjb25zdGFudHMgd2lkZWx5IHRocm91Z2hvdXQgY29tcGlsZXIKK0Q6IEltcGxlbWVudCBYODcgbG9uZyBkb3VibGUKKworTjogQnJhZCBKb25lcworRToga3VuZ2Zvb21hc3RlckBub25kb3Qub3JnCitEOiBTdXBwb3J0IGZvciBwYWNrZWQgdHlwZXMKKworTjogUm9kIEtheQorRTogcmtheUBhdXJvcmF1eC5vcmcKK0Q6IEF1dGhvciBvZiBMTFZNIEFkYSBiaW5kaW5ncworCitOOiBFcmljIEtpZGQKK1c6IGh0dHA6Ly9yYW5kb21oYWNrcy5uZXQvCitEOiBsbHZtLWNvbmZpZyBzY3JpcHQKKworTjogQW50b24gS29yb2JleW5pa292CitFOiBhc2xAbWF0aC5zcGJ1LnJ1CitEOiBNaW5ndzMyIGZpeGVzLCBjcm9zcy1jb21waWxpbmcgc3VwcG9ydCwgc3RkY2FsbC9mYXN0Y2FsbCBjYWxsaW5nIGNvbnYuCitEOiB4ODYvbGludXggUElDIGNvZGVnZW4sIGFsaWFzZXMsIHJlZ3Bhcm0vdmlzaWJpbGl0eSBhdHRyaWJ1dGVzCitEOiBTd2l0Y2ggbG93ZXJpbmcgcmVmYWN0b3JpbmcKKworTjogU3VtYW50IEtvd3NoaWsKK0U6IGtvd3NoaWtAdWl1Yy5lZHUKK0Q6IEF1dGhvciBvZiB0aGUgb3JpZ2luYWwgQyBiYWNrZW5kCisKK046IEJlbmphbWluIEtyYW1lcgorRTogYmVubnkua3JhQGdtYWlsLmNvbQorRDogTWlzY2VsbGFuZW91cyBidWcgZml4ZXMKKworTjogQ2hyaXN0b3BoZXIgTGFtYgorRTogY2hyaXN0b3BoZXIubGFtYkBnbWFpbC5jb20KK0Q6IGFsaWduZWQgbG9hZC9zdG9yZSBzdXBwb3J0LCBwYXJ0cyBvZiBub2FsaWFzIGFuZCByZXN0cmljdCBzdXBwb3J0CitEOiB2cmVnIHN1YnJlZyBpbmZyYXN0cnVjdHVyZSwgWDg2IGNvZGVnZW4gaW1wcm92ZW1lbnRzIGJhc2VkIG9uIHN1YnJlZ3MKK0Q6IGFkZHJlc3Mgc3BhY2VzCisKK046IEppbSBMYXNrZXkKK0U6IGpsYXNrZXlAYXBwbGUuY29tCitEOiBJbXByb3ZlbWVudHMgdG8gdGhlIFBQQyBiYWNrZW5kLCBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nCitEOiBEZWJ1ZyBhbmQgRHdhcmYgaW1wbGVtZW50YXRpb24KK0Q6IEF1dG8gdXBncmFkZSBtYW5nbGVyCitEOiBsbHZtLWdjYzQgc3ZuIHdyYW5nbGVyCisKK046IENocmlzIExhdHRuZXIKK0U6IHNhYnJlQG5vbmRvdC5vcmcKK1c6IGh0dHA6Ly9ub25kb3Qub3JnL35zYWJyZS8KK0Q6IFByaW1hcnkgYXJjaGl0ZWN0IG9mIExMVk0KKworTjogVGFueWEgTGF0dG5lciAoVGFueWEgQnJldGhvdXIpCitFOiB0b25pY0Bub25kb3Qub3JnCitXOiBodHRwOi8vbm9uZG90Lm9yZy9+dG9uaWMvCitEOiBUaGUgaW5pdGlhbCBsbHZtLWFyIHRvb2wsIGNvbnZlcnRlZCByZWdyZXNzaW9uIHRlc3RzdWl0ZSB0byBkZWphZ251CitEOiBNb2R1bG8gc2NoZWR1bGluZyBpbiB0aGUgU3BhcmNWOSBiYWNrZW5kCitEOiBSZWxlYXNlIG1hbmFnZXIgKDEuNyspCisKK046IEFuZHJldyBMZW5oYXJ0aAorRTogYWxlbmhhcjJAY3MudWl1Yy5lZHUKK1c6IGh0dHA6Ly93d3cubGVuaGFydGgub3JnL35hbmRyZXdsLworRDogQWxwaGEgYmFja2VuZAorRDogU2FtcGxpbmcgYmFzZWQgcHJvZmlsaW5nCisKK046IE5pY2sgTGV3eWNreQorRTogbmljaG9sYXNAbXhjLmNhCitEOiBQcmVkaWNhdGVTaW1wbGlmaWVyIHBhc3MKKworTjogQnJ1bm8gQ2FyZG9zbyBMb3BlcworRTogYnJ1bm8uY2FyZG9zb0BnbWFpbC5jb20KK1c6IGh0dHA6Ly93d3cuYnJ1bm9jYXJkb3NvLm9yZworRDogVGhlIE1pcHMgYmFja2VuZAorCitOOiBEdXJhaWQgTWFkaW5hCitFOiBkdXJhaWRAb2N0b3B1cy5jb20uYXUKK1c6IGh0dHA6Ly9raW5va28uYy51LXRva3lvLmFjLmpwL35kdXJhaWQvCitEOiBJQTY0IGJhY2tlbmQsIEJpZ0Jsb2NrIHJlZ2lzdGVyIGFsbG9jYXRvcgorCitOOiBNaWNoYWVsIE1jQ3JhY2tlbgorRTogbWljaGFlbC5tY2NyYWNrZW5AZ21haWwuY29tCitEOiBMaW5lIG51bWJlciBzdXBwb3J0IGZvciBsbHZtZ2NjCisKK046IFZsYWRpbWlyIE1lcnpsaWFrb3YKK0U6IHdhbmRlcmVyQHJzdS5ydQorRDogVGVzdCBzdWl0ZSBmaXhlcyBmb3IgRnJlZUJTRAorCitOOiBTY290dCBNaWNoZWwKK0U6IHNjb3R0bUBhZXJvLm9yZworRDogQWRkZWQgU1RJIENlbGwgU1BVIGJhY2tlbmQuCisKK046IEVkd2FyZCBPJ0NhbGxhZ2hhbgorRTogZW9jYWxsYWdoYW5AYXVyb3JhdXgub3JnCitXOiBodHRwOi8vd3d3LmF1cm9yYXV4Lm9yZworRDogQWRkIENsYW5nIHN1cHBvcnQgd2l0aCB2YXJpb3VzIG90aGVyIGltcHJvdmVtZW50cyB0byB1dGlscy9OZXdOaWdodGx5VGVzdC5wbAorRDogRml4IGFuZCBtYWludGFpbiBTb2xhcmlzICYgQXVyb3JhVVggc3VwcG9ydCBmb3IgbGx2bSwgdmFyaW91cyBidWlsZCB3YXJuaW5ncworRDogYW5kIGVycm9yIGNsZWFuIHVwcy4KKworTjogTW9ydGVuIE9mc3RhZAorRTogbW9ydGVuQGh1ZS5ubworRDogVmlzdWFsIEMrKyBjb21wYXRpYmlsaXR5IGZpeGVzCisKK046IEpha29iIFN0b2tsdW5kIE9sZXNlbgorRTogc3Rva2x1bmRAMnBpLmRrCitEOiBNYWNoaW5lIGNvZGUgdmVyaWZpZXIKK0Q6IEJsYWNrZmluIGJhY2tlbmQKKworTjogUmljaGFyZCBPc2Jvcm5lCitFOiByaWNoYXJkQHhtb3MuY29tCitEOiBYQ29yZSBiYWNrZW5kCisKK046IERldmFuZyBQYXRlbAorRTogZHBhdGVsQGFwcGxlLmNvbQorRDogTFRPIHRvb2wsIFBhc3NNYW5hZ2VyIHJld3JpdGUsIExvb3AgUGFzcyBNYW5hZ2VyLCBMb29wIFJvdGF0ZQorRDogR0NDIFBDSCBJbnRlZ3JhdGlvbiAobGx2bS1nY2MpLCBsbHZtLWdjYyBpbXByb3ZlbWVudHMKK0Q6IE9wdGltaXplciBpbXByb3ZlbWVudHMsIExvb3AgSW5kZXggU3BsaXQKKworTjogU2FuZGVlcCBQYXRlbAorRTogZGVlcHBhdGVsMTk4N0BnbWFpbC5jb20KK0Q6IEFSTSBjYWxsaW5nIGNvbnZlbnRpb25zIHJld3JpdGUsIGhhcmQgZmxvYXQgc3VwcG9ydAorCitOOiBWbGFkaW1pciBQcnVzCitXOiBodHRwOi8vdmxhZGltaXJfcHJ1cy5ibG9nc3BvdC5jb20KK0U6IGdob3N0QGNzLm1zdS5zdQorRDogTWFkZSBpbnN0X2l0ZXJhdG9yIGJlaGF2ZSBsaWtlIGEgcHJvcGVyIGl0ZXJhdG9yLCBMb3dlckNvbnN0YW50RXhwcnMgcGFzcworCitOOiBSb21hbiBTYW1vaWxvdgorRTogcm9tYW5AY29kZWRnZXJzLmNvbQorRDogTVNJTCBiYWNrZW5kCisKK046IER1bmNhbiBTYW5kcworRTogYmFsZHJpY2tAZnJlZS5mcgorRDogQWRhIGZyb250LWVuZCwgZXhjZXB0aW9uIGhhbmRsaW5nIGltcHJvdmVtZW50cworCitOOiBSdWNoaXJhIFNhc2Fua2EKK0U6IHNhc2Fua2FAdWl1Yy5lZHUKK0Q6IEdyYXBoIGNvbG9yaW5nIHJlZ2lzdGVyIGFsbG9jYXRvciBmb3IgdGhlIFNwYXJjNjQgYmFja2VuZAorCitOOiBBcm5vbGQgU2Nod2FpZ2hvZmVyCitFOiBhcm5vbGQuc2Nod2FpZ2hvZmVyQGdtYWlsLmNvbQorRDogVGFpbCBjYWxsIG9wdGltaXphdGlvbiBmb3IgdGhlIHg4NiBiYWNrZW5kCisKK046IFNoYW50b251IFNlbgorRTogc3NlbkBhcHBsZS5jb20KK0Q6IE1pc2NlbGxhbmVvdXMgYnVnIGZpeGVzCisKK046IEFuYW5kIFNodWtsYQorRTogYXNodWtsYUBjcy51aXVjLmVkdQorRDogVGhlIGBwYXRocycgcGFzcworCitOOiBSZWlkIFNwZW5jZXIKK0U6IHJzcGVuY2VyQHJlaWRzcGVuY2VyLmNvbQorVzogaHR0cDovL3JlaWRzcGVuY2VyLmNvbS8KK0Q6IExvdHMgb2Ygc3R1ZmYsIHNlZTogaHR0cDovL3dpa2kubGx2bS5vcmcvaW5kZXgucGhwL1VzZXI6UmVpZAorCitOOiBFZHdpbiBUb3JvaworRTogZWR3aW50b3Jva0BnbWFpbC5jb20KK0Q6IE1pc2NlbGxhbmVvdXMgYnVnIGZpeGVzCisKK046IEFkYW0gVHJlYXQKK0U6IG1hbnlvc29AeWFob28uY29tCitEOiBDKysgYnVncyBmaWxlZCwgYW5kIEMrKyBmcm9udC1lbmQgYnVnIGZpeGVzLgorCitOOiBMYXVybyBSYW1vcyBWZW5hbmNpbworRTogbGF1cm8udmVuYW5jaW9AaW5kdC5vcmcuYnIKK0Q6IEFSTSBiYWNrZW5kIGltcHJvdmVtZW50cworRDogVGhyZWFkIExvY2FsIFN0b3JhZ2UgaW1wbGVtZW50YXRpb24KKworTjogWGVyeGVzIFJhbmJ5CitFOiB4ZXJ4ZXNAemFmZW5hLnNlCitEOiBDbWFrZSBkZXBlbmRlbmN5IGNoYWluIGFuZCB2YXJpb3VzIGJ1ZyBmaXhlcworCitOOiBCaWxsIFdlbmRsaW5nCitFOiBpc2FuYmFyZEBnbWFpbC5jb20KK0Q6IEJ1bmNoZXMgb2Ygc3R1ZmYKKworTjogQm9iIFdpbHNvbgorRTogYm9iLndpbHNvbkBhY20ub3JnCitEOiBBZHZhbmNlZCBTSU1EIChORU9OKSBzdXBwb3J0IGluIHRoZSBBUk0gYmFja2VuZApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vRmFzdEludHJpbnNpY0lELnBhdGNoIGIvc3JjL0xMVk0vRmFzdEludHJpbnNpY0lELnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYThhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9GYXN0SW50cmluc2ljSUQucGF0Y2gKQEAgLTAsMCArMSw2NyBAQAorSW5kZXg6IGluY2x1ZGUvbGx2bS9GdW5jdGlvbi5oDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy0tLSBpbmNsdWRlL2xsdm0vRnVuY3Rpb24uaAkocmV2aXNpb24gMzAwNSkNCisrKysgaW5jbHVkZS9sbHZtL0Z1bmN0aW9uLmgJKHdvcmtpbmcgY29weSkNCitAQCAtOTMsNiArOTMsOCBAQA0KKyAgIC8vIFRoZSBDYWxsaW5nIENvbnZlbnRpb24gaXMgc3RvcmVkIGluIFZhbHVlOjpTdWJjbGFzc0RhdGEuDQorICAgLypDYWxsaW5nQ29udjo6SUQgQ2FsbGluZ0NvbnZlbnRpb247Ki8NCisgDQorKyAgdW5zaWduZWQgaW50cmluc2ljSUQ7ICAgICAgICAgICAgICAgICAgIC8vLzwgSUQgb2YgaW50cmluc2ljLCAwIG90aGVyd2lzZQ0KKysNCisgICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEZ1bmN0aW9uLCBNb2R1bGU+Ow0KKyANCisgICB2b2lkIHNldFBhcmVudChNb2R1bGUgKnBhcmVudCk7DQorQEAgLTEwOSw2ICsxMTEsOCBAQA0KKyAgICAgICBCdWlsZExhenlBcmd1bWVudHMoKTsNCisgICB9DQorICAgdm9pZCBCdWlsZExhenlBcmd1bWVudHMoKSBjb25zdDsNCisrDQorKyAgdW5zaWduZWQgaW5pdEludHJpbnNpY0lEKCkgY29uc3Q7DQorICAgDQorICAgRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24mKTsgLy8gRE8gTk9UIElNUExFTUVOVA0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEZ1bmN0aW9uJik7IC8vIERPIE5PVCBJTVBMRU1FTlQNCitAQCAtMTUyLDggKzE1Niw4IEBADQorICAgLy8vIFRoZSBwYXJ0aWN1bGFyIGludHJpbnNpYyBmdW5jdGlvbnMgd2hpY2ggY29ycmVzcG9uZCB0byB0aGlzIHZhbHVlIGFyZQ0KKyAgIC8vLyBkZWZpbmVkIGluIGxsdm0vSW50cmluc2ljcy5oLg0KKyAgIC8vLw0KKy0gIHVuc2lnbmVkIGdldEludHJpbnNpY0lEKCkgY29uc3QgQVRUUklCVVRFX1JFQURPTkxZOw0KKy0gIGJvb2wgaXNJbnRyaW5zaWMoKSBjb25zdCB7IHJldHVybiBnZXRJbnRyaW5zaWNJRCgpICE9IDA7IH0NCisrICB1bnNpZ25lZCBnZXRJbnRyaW5zaWNJRCgpIGNvbnN0IHsgcmV0dXJuIGludHJpbnNpY0lEOyB9DQorKyAgYm9vbCBpc0ludHJpbnNpYygpIGNvbnN0IHsgcmV0dXJuIGludHJpbnNpY0lEICE9IDA7IH0NCisgDQorICAgLy8vIGdldENhbGxpbmdDb252KCkvc2V0Q2FsbGluZ0NvbnYoQ0MpIC0gVGhlc2UgbWV0aG9kIGdldCBhbmQgc2V0IHRoZQ0KKyAgIC8vLyBjYWxsaW5nIGNvbnZlbnRpb24gb2YgdGhpcyBmdW5jdGlvbi4gIFRoZSBlbnVtIHZhbHVlcyBmb3IgdGhlIGtub3duDQorSW5kZXg6IGxpYi9WTUNvcmUvRnVuY3Rpb24uY3BwDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy0tLSBsaWIvVk1Db3JlL0Z1bmN0aW9uLmNwcAkocmV2aXNpb24gMzAwNSkNCisrKysgbGliL1ZNQ29yZS9GdW5jdGlvbi5jcHAJKHdvcmtpbmcgY29weSkNCitAQCAtMTY5LDkgKzE2OSw5IEBADQorICAgICBQYXJlbnRNb2R1bGUtPmdldEZ1bmN0aW9uTGlzdCgpLnB1c2hfYmFjayh0aGlzKTsNCisgDQorICAgLy8gRW5zdXJlIGludHJpbnNpY3MgaGF2ZSB0aGUgcmlnaHQgcGFyYW1ldGVyIGF0dHJpYnV0ZXMuDQorLSAgaWYgKHVuc2lnbmVkIElJRCA9IGdldEludHJpbnNpY0lEKCkpDQorLSAgICBzZXRBdHRyaWJ1dGVzKEludHJpbnNpYzo6Z2V0QXR0cmlidXRlcyhJbnRyaW5zaWM6OklEKElJRCkpKTsNCistDQorKyAgaW50cmluc2ljSUQgPSBpbml0SW50cmluc2ljSUQoKTsNCisrICBpZiAoaW50cmluc2ljSUQpDQorKyAgICBzZXRBdHRyaWJ1dGVzKEludHJpbnNpYzo6Z2V0QXR0cmlidXRlcyhJbnRyaW5zaWM6OklEKGludHJpbnNpY0lEKSkpOw0KKyB9DQorIA0KKyBGdW5jdGlvbjo6fkZ1bmN0aW9uKCkgew0KK0BAIC0zMTAsMTQgKzMxMCwxNCBAQA0KKyAgICAgY2xlYXJHQygpOw0KKyB9DQorIA0KKy0vLy8gZ2V0SW50cmluc2ljSUQgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBJRCBudW1iZXIgb2YgdGhlIHNwZWNpZmllZA0KKysvLy8gaW5pdEludHJpbnNpY0lEIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgbnVtYmVyIG9mIHRoZSBzcGVjaWZpZWQNCisgLy8vIGZ1bmN0aW9uLCBvciBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWMgaWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBhbg0KKyAvLy8gaW50cmluc2ljLCBvciBpZiB0aGUgcG9pbnRlciBpcyBudWxsLiAgVGhpcyB2YWx1ZSBpcyBhbHdheXMgZGVmaW5lZCB0byBiZQ0KKyAvLy8gemVybyB0byBhbGxvdyBlYXN5IGNoZWNraW5nIGZvciB3aGV0aGVyIGEgZnVuY3Rpb24gaXMgaW50cmluc2ljIG9yIG5vdC4gIFRoZQ0KKyAvLy8gcGFydGljdWxhciBpbnRyaW5zaWMgZnVuY3Rpb25zIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhpcyB2YWx1ZSBhcmUgZGVmaW5lZCBpbg0KKyAvLy8gbGx2bS9JbnRyaW5zaWNzLmguDQorIC8vLw0KKy11bnNpZ25lZCBGdW5jdGlvbjo6Z2V0SW50cmluc2ljSUQoKSBjb25zdCB7DQorK3Vuc2lnbmVkIEZ1bmN0aW9uOjppbml0SW50cmluc2ljSUQoKSBjb25zdCB7DQorICAgY29uc3QgVmFsdWVOYW1lICpWYWxOYW1lID0gdGhpcy0+Z2V0VmFsdWVOYW1lKCk7DQorICAgaWYgKCFWYWxOYW1lKQ0KKyAgICAgcmV0dXJuIDA7DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vTElDRU5TRS5UWFQgYi9zcmMvTExWTS9MSUNFTlNFLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ5MTcyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vTElDRU5TRS5UWFQKQEAgLTAsMCArMSw2OSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMTFZNIFJlbGVhc2UgTGljZW5zZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitVbml2ZXJzaXR5IG9mIElsbGlub2lzL05DU0EKK09wZW4gU291cmNlIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSAyMDAzLTIwMDkgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworRGV2ZWxvcGVkIGJ5OgorCisgICAgTExWTSBUZWFtCisKKyAgICBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24KKworICAgIGh0dHA6Ly9sbHZtLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCB3aXRoCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCitzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycyBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBMTFZNIFRlYW0sIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQKKyAgICAgIFVyYmFuYS1DaGFtcGFpZ24sIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKKyAgICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQ09OVFJJQlVUT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBXSVRIIFRIRQorU09GVFdBUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29weXJpZ2h0cyBhbmQgTGljZW5zZXMgZm9yIFRoaXJkIFBhcnR5IFNvZnR3YXJlIERpc3RyaWJ1dGVkIHdpdGggTExWTToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIExMVk0gc29mdHdhcmUgY29udGFpbnMgY29kZSB3cml0dGVuIGJ5IHRoaXJkIHBhcnRpZXMuICBTdWNoIHNvZnR3YXJlIHdpbGwKK2hhdmUgaXRzIG93biBpbmRpdmlkdWFsIExJQ0VOU0UuVFhUIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBhcHBlYXJzLgorVGhpcyBmaWxlIHdpbGwgZGVzY3JpYmUgdGhlIGNvcHlyaWdodHMsIGxpY2Vuc2UsIGFuZCByZXN0cmljdGlvbnMgd2hpY2ggYXBwbHkKK3RvIHRoYXQgY29kZS4KKworVGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgaW4gdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgTGljZW5zZQorYXBwbGllcyB0byBhbGwgY29kZSBpbiB0aGUgTExWTSBEaXN0cmlidXRpb24sIGFuZCBub3RoaW5nIGluIGFueSBvZiB0aGUKK290aGVyIGxpY2Vuc2VzIGdpdmVzIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBuYW1lcyBvZiB0aGUgTExWTSBUZWFtIG9yIHRoZQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKK1NvZnR3YXJlLgorCitUaGUgZm9sbG93aW5nIHBpZWNlcyBvZiBzb2Z0d2FyZSBoYXZlIGFkZGl0aW9uYWwgb3IgYWx0ZXJuYXRlIGNvcHlyaWdodHMsCitsaWNlbnNlcywgYW5kL29yIHJlc3RyaWN0aW9uczoKKworUHJvZ3JhbSAgICAgICAgICAgICBEaXJlY3RvcnkKKy0tLS0tLS0gICAgICAgICAgICAgLS0tLS0tLS0tCitBdXRvY29uZiAgICAgICAgICAgIGxsdm0vYXV0b2NvbmYKKyAgICAgICAgICAgICAgICAgICAgbGx2bS9wcm9qZWN0cy9Nb2R1bGVNYWtlci9hdXRvY29uZgorICAgICAgICAgICAgICAgICAgICBsbHZtL3Byb2plY3RzL3NhbXBsZS9hdXRvY29uZgorQ2VsbFNQVSBiYWNrZW5kICAgICBsbHZtL2xpYi9UYXJnZXQvQ2VsbFNQVS9SRUFETUUudHh0CitHb29nbGUgVGVzdCAgICAgICAgIGxsdm0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdAorT3BlbkJTRCByZWdleCAgICAgICBsbHZtL2xpYi9TdXBwb3J0L3tyZWcqLCBDT1BZUklHSFQucmVnZXh9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9Pbmx5WDg2LnBhdGNoIGIvc3JjL0xMVk0vT25seVg4Ni5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjM0MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vT25seVg4Ni5wYXRjaApAQCAtMCwwICsxLDU0IEBACitJbmRleDogaW5jbHVkZS9sbHZtL0ludHJpbnNpY3MudGQNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLS0tIGluY2x1ZGUvbGx2bS9JbnRyaW5zaWNzLnRkCShyZXZpc2lvbiAzMTc0KQ0KKysrKyBpbmNsdWRlL2xsdm0vSW50cmluc2ljcy50ZAkod29ya2luZyBjb3B5KQ0KK0BAIC00ODAsOSArNDgwLDkgQEANCisgLy8gVGFyZ2V0LXNwZWNpZmljIGludHJpbnNpY3MNCisgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisgDQorLWluY2x1ZGUgImxsdm0vSW50cmluc2ljc1Bvd2VyUEMudGQiDQorKy8vaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzUG93ZXJQQy50ZCINCisgaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzWDg2LnRkIg0KKy1pbmNsdWRlICJsbHZtL0ludHJpbnNpY3NBUk0udGQiDQorLWluY2x1ZGUgImxsdm0vSW50cmluc2ljc0NlbGxTUFUudGQiDQorLWluY2x1ZGUgImxsdm0vSW50cmluc2ljc0FscGhhLnRkIg0KKy1pbmNsdWRlICJsbHZtL0ludHJpbnNpY3NYQ29yZS50ZCINCisrLy9pbmNsdWRlICJsbHZtL0ludHJpbnNpY3NBUk0udGQiDQorKy8vaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzQ2VsbFNQVS50ZCINCisrLy9pbmNsdWRlICJsbHZtL0ludHJpbnNpY3NBbHBoYS50ZCINCisrLy9pbmNsdWRlICJsbHZtL0ludHJpbnNpY3NYQ29yZS50ZCINCitJbmRleDogbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVDYWxscy5jcHANCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLS0tIGxpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lQ2FsbHMuY3BwCShyZXZpc2lvbiAzMTc0KQ0KKysrKyBsaWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZUNhbGxzLmNwcAkod29ya2luZyBjb3B5KQ0KK0BAIC01OTcsOCArNTk3LDggQEANCisgICAgICAgfQorICAgICB9CisgICAgIGJyZWFrOworLSAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2x2eDoKKy0gIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY19sdnhsOgorKyAgLy9jYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfbHZ4OgorKyAgLy9jYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfbHZ4bDoKKyAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX2xvYWR1X3BzOgorICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX2xvYWR1X3BkOgorICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX2xvYWR1X2RxOgorQEAgLTYxMCw4ICs2MTAsOCBAQA0KKyAgICAgICByZXR1cm4gbmV3IExvYWRJbnN0KFB0cik7CisgICAgIH0KKyAgICAgYnJlYWs7CistICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfc3R2eDoKKy0gIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY19zdHZ4bDoKKysgIC8vY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3N0dng6CisrICAvL2Nhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY19zdHZ4bDoKKyAgICAgLy8gVHVybiBzdHZ4IC0+IHN0b3JlIGlmIHRoZSBwb2ludGVyIGlzIGtub3duIGFsaWduZWQuCisgICAgIGlmIChHZXRPckVuZm9yY2VLbm93bkFsaWdubWVudChJSS0+Z2V0QXJnT3BlcmFuZCgxKSwgMTYpID49IDE2KSB7CisgICAgICAgY29uc3QgVHlwZSAqT3BQdHJUeSA9IAorQEAgLTY0Nyw3ICs2NDcsNyBAQA0KKyAgICAgYnJlYWs7CisgICB9CisgICAgIAorLSAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZwZXJtOgorKyAgLy9jYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBlcm06CisgICAgIC8vIFR1cm4gdnBlcm0oVjEsVjIsbWFzaykgLT4gc2h1ZmZsZShWMSxWMixtYXNrKSBpZiBtYXNrIGlzIGEgY29uc3RhbnQuCisgICAgIGlmIChDb25zdGFudFZlY3RvciAqTWFzayA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihJSS0+Z2V0QXJnT3BlcmFuZCgyKSkpIHsKKyAgICAgICBhc3NlcnQoTWFzay0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAxNiAmJiAiQmFkIHR5cGUgZm9yIGludHJpbnNpYyEiKTsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0FuYWx5c2lzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9BbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZTQ0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9BbmFseXNpcy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qPT09LS0gbGx2bS1jL0FuYWx5c2lzLmggLSBBbmFseXNpcyBMaWJyYXJ5IEMgSW50ZXJmYWNlIC0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byBsaWJMTFZNQW5hbHlzaXMuYSwgd2hpY2ggICAgICAgICAgICp8Cit8KiBpbXBsZW1lbnRzIHZhcmlvdXMgYW5hbHlzZXMgb2YgdGhlIExMVk0gSVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIE1hbnkgZXhvdGljIGxhbmd1YWdlcyBjYW4gaW50ZXJvcGVyYXRlIHdpdGggQyBjb2RlIGJ1dCBoYXZlIGEgaGFyZGVyIHRpbWUgICp8Cit8KiB3aXRoIEMrKyBkdWUgdG8gbmFtZSBtYW5nbGluZy4gU28gaW4gYWRkaXRpb24gdG8gQywgdGhpcyBpbnRlcmZhY2UgZW5hYmxlcyAqfAorfCogdG9vbHMgd3JpdHRlbiBpbiBzdWNoIGxhbmd1YWdlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19BTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQ19BTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtLWMvQ29yZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTUFib3J0UHJvY2Vzc0FjdGlvbiwgLyogdmVyaWZpZXIgd2lsbCBwcmludCB0byBzdGRlcnIgYW5kIGFib3J0KCkgKi8KKyAgTExWTVByaW50TWVzc2FnZUFjdGlvbiwgLyogdmVyaWZpZXIgd2lsbCBwcmludCB0byBzdGRlcnIgYW5kIHJldHVybiAxICovCisgIExMVk1SZXR1cm5TdGF0dXNBY3Rpb24gIC8qIHZlcmlmaWVyIHdpbGwganVzdCByZXR1cm4gMSAqLworfSBMTFZNVmVyaWZpZXJGYWlsdXJlQWN0aW9uOworCisKKy8qIFZlcmlmaWVzIHRoYXQgYSBtb2R1bGUgaXMgdmFsaWQsIHRha2luZyB0aGUgc3BlY2lmaWVkIGFjdGlvbiBpZiBub3QuCisgICBPcHRpb25hbGx5IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiBhbnkgaW52YWxpZCBjb25zdHJ1Y3RzLgorICAgT3V0TWVzc2FnZSBtdXN0IGJlIGRpc3Bvc2VkIHdpdGggTExWTURpc3Bvc2VNZXNzYWdlLiAqLworTExWTUJvb2wgTExWTVZlcmlmeU1vZHVsZShMTFZNTW9kdWxlUmVmIE0sIExMVk1WZXJpZmllckZhaWx1cmVBY3Rpb24gQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0TWVzc2FnZSk7CisKKy8qIFZlcmlmaWVzIHRoYXQgYSBzaW5nbGUgZnVuY3Rpb24gaXMgdmFsaWQsIHRha2luZyB0aGUgc3BlY2lmaWVkIGFjdGlvbi4gVXNlZnVsCisgICBmb3IgZGVidWdnaW5nLiAqLworTExWTUJvb2wgTExWTVZlcmlmeUZ1bmN0aW9uKExMVk1WYWx1ZVJlZiBGbiwgTExWTVZlcmlmaWVyRmFpbHVyZUFjdGlvbiBBY3Rpb24pOworCisvKiBPcGVuIHVwIGEgZ2hvc3R2aWV3IHdpbmRvdyB0aGF0IGRpc3BsYXlzIHRoZSBDRkcgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgICBVc2VmdWwgZm9yIGRlYnVnZ2luZy4gKi8KK3ZvaWQgTExWTVZpZXdGdW5jdGlvbkNGRyhMTFZNVmFsdWVSZWYgRm4pOwordm9pZCBMTFZNVmlld0Z1bmN0aW9uQ0ZHT25seShMTFZNVmFsdWVSZWYgRm4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0JpdFJlYWRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtLWMvQml0UmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiNjYwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0JpdFJlYWRlci5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qPT09LS0gbGx2bS1jL0JpdFJlYWRlci5oIC0gQml0UmVhZGVyIExpYnJhcnkgQyBJbnRlcmZhY2UgLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byBsaWJMTFZNQml0UmVhZGVyLmEsIHdoaWNoICAgICAgICAgICp8Cit8KiBpbXBsZW1lbnRzIGlucHV0IG9mIHRoZSBMTFZNIGJpdGNvZGUgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIE1hbnkgZXhvdGljIGxhbmd1YWdlcyBjYW4gaW50ZXJvcGVyYXRlIHdpdGggQyBjb2RlIGJ1dCBoYXZlIGEgaGFyZGVyIHRpbWUgICp8Cit8KiB3aXRoIEMrKyBkdWUgdG8gbmFtZSBtYW5nbGluZy4gU28gaW4gYWRkaXRpb24gdG8gQywgdGhpcyBpbnRlcmZhY2UgZW5hYmxlcyAqfAorfCogdG9vbHMgd3JpdHRlbiBpbiBzdWNoIGxhbmd1YWdlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19CSVRDT0RFUkVBREVSX0gKKyNkZWZpbmUgTExWTV9DX0JJVENPREVSRUFERVJfSAorCisjaW5jbHVkZSAibGx2bS1jL0NvcmUuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIEJ1aWxkcyBhIG1vZHVsZSBmcm9tIHRoZSBiaXRjb2RlIGluIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGJ1ZmZlciwgcmV0dXJuaW5nIGEKKyAgIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxlIHZpYSB0aGUgT3V0TW9kdWxlIHBhcmFtZXRlci4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgICBPcHRpb25hbGx5IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlIHZpYSBPdXRNZXNzYWdlLiAqLyAKK0xMVk1Cb29sIExMVk1QYXJzZUJpdGNvZGUoTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgKk91dE1vZHVsZSwgY2hhciAqKk91dE1lc3NhZ2UpOworCitMTFZNQm9vbCBMTFZNUGFyc2VCaXRjb2RlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIENvbnRleHRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NZW1vcnlCdWZmZXJSZWYgTWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUmVmICpPdXRNb2R1bGUsIGNoYXIgKipPdXRNZXNzYWdlKTsKKworLyoqIFJlYWRzIGEgbW9kdWxlIGZyb20gdGhlIHNwZWNpZmllZCBwYXRoLCByZXR1cm5pbmcgdmlhIHRoZSBPdXRNUCBwYXJhbWV0ZXIKKyAgICBhIG1vZHVsZSBwcm92aWRlciB3aGljaCBwZXJmb3JtcyBsYXp5IGRlc2VyaWFsaXphdGlvbi4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgICAgT3B0aW9uYWxseSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZSB2aWEgT3V0TWVzc2FnZS4gKi8gCitMTFZNQm9vbCBMTFZNR2V0Qml0Y29kZU1vZHVsZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDb250ZXh0UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUmVmICpPdXRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dE1lc3NhZ2UpOworCitMTFZNQm9vbCBMTFZNR2V0Qml0Y29kZU1vZHVsZShMTFZNTWVtb3J5QnVmZmVyUmVmIE1lbUJ1ZiwgTExWTU1vZHVsZVJlZiAqT3V0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipPdXRNZXNzYWdlKTsKKworCisvKiogRGVwcmVjYXRlZDogVXNlIExMVk1HZXRCaXRjb2RlTW9kdWxlSW5Db250ZXh0IGluc3RlYWQuICovCitMTFZNQm9vbCBMTFZNR2V0Qml0Y29kZU1vZHVsZVByb3ZpZGVySW5Db250ZXh0KExMVk1Db250ZXh0UmVmIENvbnRleHRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NZW1vcnlCdWZmZXJSZWYgTWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUHJvdmlkZXJSZWYgKk91dE1QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0TWVzc2FnZSk7CisKKy8qKiBEZXByZWNhdGVkOiBVc2UgTExWTUdldEJpdGNvZGVNb2R1bGUgaW5zdGVhZC4gKi8KK0xMVk1Cb29sIExMVk1HZXRCaXRjb2RlTW9kdWxlUHJvdmlkZXIoTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVQcm92aWRlclJlZiAqT3V0TVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipPdXRNZXNzYWdlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9CaXRXcml0ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0JpdFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmZiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9CaXRXcml0ZXIuaApAQCAtMCwwICsxLDQ2IEBACisvKj09PS0tIGxsdm0tYy9CaXRXcml0ZXIuaCAtIEJpdFdyaXRlciBMaWJyYXJ5IEMgSW50ZXJmYWNlIC0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBkZWNsYXJlcyB0aGUgQyBpbnRlcmZhY2UgdG8gbGliTExWTUJpdFdyaXRlci5hLCB3aGljaCAgICAgICAgICAqfAorfCogaW1wbGVtZW50cyBvdXRwdXQgb2YgdGhlIExMVk0gYml0Y29kZSBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBNYW55IGV4b3RpYyBsYW5ndWFnZXMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIEMgY29kZSBidXQgaGF2ZSBhIGhhcmRlciB0aW1lICAqfAorfCogd2l0aCBDKysgZHVlIHRvIG5hbWUgbWFuZ2xpbmcuIFNvIGluIGFkZGl0aW9uIHRvIEMsIHRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgKnwKK3wqIHRvb2xzIHdyaXR0ZW4gaW4gc3VjaCBsYW5ndWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfQklUQ09ERVdSSVRFUl9ICisjZGVmaW5lIExMVk1fQ19CSVRDT0RFV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0tYy9Db3JlLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKj09PS0tIE9wZXJhdGlvbnMgb24gbW9kdWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKiogV3JpdGVzIGEgbW9kdWxlIHRvIHRoZSBzcGVjaWZpZWQgcGF0aC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICovIAoraW50IExMVk1Xcml0ZUJpdGNvZGVUb0ZpbGUoTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpQYXRoKTsKKworLyoqIFdyaXRlcyBhIG1vZHVsZSB0byBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvci4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICovCitpbnQgTExWTVdyaXRlQml0Y29kZVRvRkQoTExWTU1vZHVsZVJlZiBNLCBpbnQgRkQsIGludCBTaG91bGRDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVW5idWZmZXJlZCk7CisKKy8qKiBEZXByZWNhdGVkIGZvciBMTFZNV3JpdGVCaXRjb2RlVG9GRC4gV3JpdGVzIGEgbW9kdWxlIHRvIGFuIG9wZW4gZmlsZQorICAgIGRlc2NyaXB0b3IuIFJldHVybnMgMCBvbiBzdWNjZXNzLiBDbG9zZXMgdGhlIEhhbmRsZS4gKi8gCitpbnQgTExWTVdyaXRlQml0Y29kZVRvRmlsZUhhbmRsZShMTFZNTW9kdWxlUmVmIE0sIGludCBIYW5kbGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0NvcmUuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWRlOWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtLWMvQ29yZS5oCkBAIC0wLDAgKzEsMTE2MiBAQAorLyo9PT0tLSBsbHZtLWMvQ29yZS5oIC0gQ29yZSBMaWJyYXJ5IEMgSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBoZWFkZXIgZGVjbGFyZXMgdGhlIEMgaW50ZXJmYWNlIHRvIGxpYkxMVk1Db3JlLmEsIHdoaWNoIGltcGxlbWVudHMgICAgKnwKK3wqIHRoZSBMTFZNIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTExWTSB1c2VzIGEgcG9seW1vcnBoaWMgdHlwZSBoaWVyYXJjaHkgd2hpY2ggQyBjYW5ub3QgcmVwcmVzZW50LCB0aGVyZWZvcmUgKnwKK3wqIHBhcmFtZXRlcnMgbXVzdCBiZSBwYXNzZWQgYXMgYmFzZSB0eXBlcy4gRGVzcGl0ZSB0aGUgZGVjbGFyZWQgdHlwZXMsIG1vc3QgICp8Cit8KiBvZiB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIG9wZXJhdGUgb25seSBvbiBicmFuY2hlcyBvZiB0aGUgdHlwZSBoaWVyYXJjaHkuICAqfAorfCogVGhlIGRlY2xhcmVkIHBhcmFtZXRlciBuYW1lcyBhcmUgZGVzY3JpcHRpdmUgYW5kIHNwZWNpZnkgd2hpY2ggdHlwZSBpcyAgICAgKnwKK3wqIHJlcXVpcmVkLiBBZGRpdGlvbmFsbHksIGVhY2ggdHlwZSBoaWVyYXJjaHkgaXMgZG9jdW1lbnRlZCBhbG9uZyB3aXRoIHRoZSAgICp8Cit8KiBmdW5jdGlvbnMgdGhhdCBvcGVyYXRlIHVwb24gaXQuIEZvciBtb3JlIGRldGFpbCwgcmVmZXIgdG8gTExWTSdzIEMrKyBjb2RlLiAqfAorfCogSWYgaW4gZG91YnQsIHJlZmVyIHRvIENvcmUuY3BwLCB3aGljaCBwZXJmb3JtcyBwYXJhbXRlciBkb3duY2FzdHMgaW4gdGhlICAgKnwKK3wqIGZvcm0gdW53cmFwPFJlcXVpcmVkVHlwZT4oUGFyYW0pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTWFueSBleG90aWMgbGFuZ3VhZ2VzIGNhbiBpbnRlcm9wZXJhdGUgd2l0aCBDIGNvZGUgYnV0IGhhdmUgYSBoYXJkZXIgdGltZSAgKnwKK3wqIHdpdGggQysrIGR1ZSB0byBuYW1lIG1hbmdsaW5nLiBTbyBpbiBhZGRpdGlvbiB0byBDLCB0aGlzIGludGVyZmFjZSBlbmFibGVzICp8Cit8KiB0b29scyB3cml0dGVuIGluIHN1Y2ggbGFuZ3VhZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFdoZW4gaW5jbHVkZWQgaW50byBhIEMrKyBzb3VyY2UgZmlsZSwgYWxzbyBkZWNsYXJlcyAnd3JhcCcgYW5kICd1bndyYXAnICAgICp8Cit8KiBoZWxwZXJzIHRvIHBlcmZvcm0gb3BhcXVlIHJlZmVyZW5jZTwtLT5wb2ludGVyIGNvbnZlcnNpb25zLiBUaGVzZSBoZWxwZXJzICAqfAorfCogYXJlIHNob3J0ZXIgYW5kIG1vcmUgdGlnaHRseSB0eXBlZCB0aGFuIHdyaXRpbmcgdGhlIGNhc3RzIGJ5IGhhbmQgd2hlbiAgICAgKnwKK3wqIGF1dGhvcmluZyBiaW5kaW5ncy4gSW4gYXNzZXJ0IGJ1aWxkcywgdGhleSB3aWxsIGRvIHJ1bnRpbWUgdHlwZSBjaGVja2luZy4gICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfQ09SRV9ICisjZGVmaW5lIExMVk1fQ19DT1JFX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworLyogTmVlZCB0aGVzZSBpbmNsdWRlcyB0byBzdXBwb3J0IHRoZSBMTFZNICdjYXN0JyB0ZW1wbGF0ZSBmb3IgdGhlIEMrKyAnd3JhcCcgCisgICBhbmQgJ3Vud3JhcCcgY29udmVyc2lvbiBmdW5jdGlvbnMuICovCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSVJCdWlsZGVyLmgiCisKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwordHlwZWRlZiBpbnQgTExWTUJvb2w7CisKKy8qIE9wYXF1ZSB0eXBlcy4gKi8KKworLyoqCisgKiBUaGUgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgYWxsIExMVk0gZ2xvYmFsIGRhdGEuICBTZWUgdGhlIExMVk1Db250ZXh0IGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlQ29udGV4dCAqTExWTUNvbnRleHRSZWY7CisKKy8qKgorICogVGhlIHRvcC1sZXZlbCBjb250YWluZXIgZm9yIGFsbCBvdGhlciBMTFZNIEludGVybWVkaWF0ZSBSZXByZXNlbnRhdGlvbiAoSVIpCisgKiBvYmplY3RzLiBTZWUgdGhlIGxsdm06Ok1vZHVsZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZU1vZHVsZSAqTExWTU1vZHVsZVJlZjsKKworLyoqCisgKiBFYWNoIHZhbHVlIGluIHRoZSBMTFZNIElSIGhhcyBhIHR5cGUsIGFuIExMVk1UeXBlUmVmLiBTZWUgdGhlIGxsdm06OlR5cGUKKyAqIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlVHlwZSAqTExWTVR5cGVSZWY7CisKKy8qKgorICogV2hlbiBidWlsZGluZyByZWN1cnNpdmUgdHlwZXMgdXNpbmcgTExWTVJlZmluZVR5cGUsIExMVk1UeXBlUmVmIHZhbHVlcyBtYXkKKyAqIGJlY29tZSBpbnZhbGlkOyB1c2UgTExWTVR5cGVIYW5kbGVSZWYgdG8gcmVzb2x2ZSB0aGlzIHByb2JsZW0uIFNlZSB0aGUKKyAqIGxsdm06OkFic3RyYWN0VHlwZUhvbGRlciBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZVR5cGVIYW5kbGUgKkxMVk1UeXBlSGFuZGxlUmVmOworCit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlVmFsdWUgKkxMVk1WYWx1ZVJlZjsKK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVCYXNpY0Jsb2NrICpMTFZNQmFzaWNCbG9ja1JlZjsKK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVCdWlsZGVyICpMTFZNQnVpbGRlclJlZjsKKworLyogSW50ZXJmYWNlIHVzZWQgdG8gcHJvdmlkZSBhIG1vZHVsZSB0byBKSVQgb3IgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIG5vdyBqdXN0IGEKKyAqIHN5bm9ueW0gZm9yIGxsdm06Ok1vZHVsZSwgYnV0IHdlIGhhdmUgdG8ga2VlcCB1c2luZyB0aGUgZGlmZmVyZW50IHR5cGUgdG8KKyAqIGtlZXAgYmluYXJ5IGNvbXBhdGliaWxpdHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVNb2R1bGVQcm92aWRlciAqTExWTU1vZHVsZVByb3ZpZGVyUmVmOworCisvKiBVc2VkIHRvIHByb3ZpZGUgYSBtb2R1bGUgdG8gSklUIG9yIGludGVycHJldGVyLgorICogU2VlIHRoZSBsbHZtOjpNZW1vcnlCdWZmZXIgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVNZW1vcnlCdWZmZXIgKkxMVk1NZW1vcnlCdWZmZXJSZWY7CisKKy8qKiBTZWUgdGhlIGxsdm06OlBhc3NNYW5hZ2VyQmFzZSBjbGFzcy4gKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVQYXNzTWFuYWdlciAqTExWTVBhc3NNYW5hZ2VyUmVmOworCisvKiogVXNlZCB0byBnZXQgdGhlIHVzZXJzIGFuZCB1c2VlcyBvZiBhIFZhbHVlLiBTZWUgdGhlIGxsdm06OlVzZSBjbGFzcy4gKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVVc2UgKkxMVk1Vc2VSZWY7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTExWTVpFeHRBdHRyaWJ1dGUgICAgICAgPSAxPDwwLAorICAgIExMVk1TRXh0QXR0cmlidXRlICAgICAgID0gMTw8MSwKKyAgICBMTFZNTm9SZXR1cm5BdHRyaWJ1dGUgICA9IDE8PDIsCisgICAgTExWTUluUmVnQXR0cmlidXRlICAgICAgPSAxPDwzLAorICAgIExMVk1TdHJ1Y3RSZXRBdHRyaWJ1dGUgID0gMTw8NCwKKyAgICBMTFZNTm9VbndpbmRBdHRyaWJ1dGUgICA9IDE8PDUsCisgICAgTExWTU5vQWxpYXNBdHRyaWJ1dGUgICAgPSAxPDw2LAorICAgIExMVk1CeVZhbEF0dHJpYnV0ZSAgICAgID0gMTw8NywKKyAgICBMTFZNTmVzdEF0dHJpYnV0ZSAgICAgICA9IDE8PDgsCisgICAgTExWTVJlYWROb25lQXR0cmlidXRlICAgPSAxPDw5LAorICAgIExMVk1SZWFkT25seUF0dHJpYnV0ZSAgID0gMTw8MTAsCisgICAgTExWTU5vSW5saW5lQXR0cmlidXRlICAgPSAxPDwxMSwKKyAgICBMTFZNQWx3YXlzSW5saW5lQXR0cmlidXRlICAgID0gMTw8MTIsCisgICAgTExWTU9wdGltaXplRm9yU2l6ZUF0dHJpYnV0ZSA9IDE8PDEzLAorICAgIExMVk1TdGFja1Byb3RlY3RBdHRyaWJ1dGUgICAgPSAxPDwxNCwKKyAgICBMTFZNU3RhY2tQcm90ZWN0UmVxQXR0cmlidXRlID0gMTw8MTUsCisgICAgTExWTUFsaWdubWVudCA9IDMxPDwxNiwKKyAgICBMTFZNTm9DYXB0dXJlQXR0cmlidXRlICA9IDE8PDIxLAorICAgIExMVk1Ob1JlZFpvbmVBdHRyaWJ1dGUgID0gMTw8MjIsCisgICAgTExWTU5vSW1wbGljaXRGbG9hdEF0dHJpYnV0ZSA9IDE8PDIzLAorICAgIExMVk1OYWtlZEF0dHJpYnV0ZSAgICAgID0gMTw8MjQsCisgICAgTExWTUlubGluZUhpbnRBdHRyaWJ1dGUgPSAxPDwyNSwKKyAgICBMTFZNU3RhY2tBbGlnbm1lbnQgPSA3PDwyNgorfSBMTFZNQXR0cmlidXRlOworCit0eXBlZGVmIGVudW0geworICAvKiBUZXJtaW5hdG9yIEluc3RydWN0aW9ucyAqLworICBMTFZNUmV0ICAgICAgICAgICAgPSAxLAorICBMTFZNQnIgICAgICAgICAgICAgPSAyLAorICBMTFZNU3dpdGNoICAgICAgICAgPSAzLAorICBMTFZNSW5kaXJlY3RCciAgICAgPSA0LAorICBMTFZNSW52b2tlICAgICAgICAgPSA1LAorICBMTFZNVW53aW5kICAgICAgICAgPSA2LAorICBMTFZNVW5yZWFjaGFibGUgICAgPSA3LAorCisgIC8qIFN0YW5kYXJkIEJpbmFyeSBPcGVyYXRvcnMgKi8KKyAgTExWTUFkZCAgICAgICAgICAgID0gOCwKKyAgTExWTUZBZGQgICAgICAgICAgID0gOSwKKyAgTExWTVN1YiAgICAgICAgICAgID0gMTAsCisgIExMVk1GU3ViICAgICAgICAgICA9IDExLAorICBMTFZNTXVsICAgICAgICAgICAgPSAxMiwKKyAgTExWTUZNdWwgICAgICAgICAgID0gMTMsCisgIExMVk1VRGl2ICAgICAgICAgICA9IDE0LAorICBMTFZNU0RpdiAgICAgICAgICAgPSAxNSwKKyAgTExWTUZEaXYgICAgICAgICAgID0gMTYsCisgIExMVk1VUmVtICAgICAgICAgICA9IDE3LAorICBMTFZNU1JlbSAgICAgICAgICAgPSAxOCwKKyAgTExWTUZSZW0gICAgICAgICAgID0gMTksCisKKyAgLyogTG9naWNhbCBPcGVyYXRvcnMgKi8KKyAgTExWTVNobCAgICAgICAgICAgID0gMjAsCisgIExMVk1MU2hyICAgICAgICAgICA9IDIxLAorICBMTFZNQVNociAgICAgICAgICAgPSAyMiwKKyAgTExWTUFuZCAgICAgICAgICAgID0gMjMsCisgIExMVk1PciAgICAgICAgICAgICA9IDI0LAorICBMTFZNWG9yICAgICAgICAgICAgPSAyNSwKKworICAvKiBNZW1vcnkgT3BlcmF0b3JzICovCisgIExMVk1BbGxvY2EgICAgICAgICA9IDI2LAorICBMTFZNTG9hZCAgICAgICAgICAgPSAyNywKKyAgTExWTVN0b3JlICAgICAgICAgID0gMjgsCisgIExMVk1HZXRFbGVtZW50UHRyICA9IDI5LAorCisgIC8qIENhc3QgT3BlcmF0b3JzICovCisgIExMVk1UcnVuYyAgICAgICAgICA9IDMwLAorICBMTFZNWkV4dCAgICAgICAgICAgPSAzMSwKKyAgTExWTVNFeHQgICAgICAgICAgID0gMzIsCisgIExMVk1GUFRvVUkgICAgICAgICA9IDMzLAorICBMTFZNRlBUb1NJICAgICAgICAgPSAzNCwKKyAgTExWTVVJVG9GUCAgICAgICAgID0gMzUsCisgIExMVk1TSVRvRlAgICAgICAgICA9IDM2LAorICBMTFZNRlBUcnVuYyAgICAgICAgPSAzNywKKyAgTExWTUZQRXh0ICAgICAgICAgID0gMzgsCisgIExMVk1QdHJUb0ludCAgICAgICA9IDM5LAorICBMTFZNSW50VG9QdHIgICAgICAgPSA0MCwKKyAgTExWTUJpdENhc3QgICAgICAgID0gNDEsCisKKyAgLyogT3RoZXIgT3BlcmF0b3JzICovCisgIExMVk1JQ21wICAgICAgICAgICA9IDQyLAorICBMTFZNRkNtcCAgICAgICAgICAgPSA0MywKKyAgTExWTVBISSAgICAgICAgICAgID0gNDQsCisgIExMVk1DYWxsICAgICAgICAgICA9IDQ1LAorICBMTFZNU2VsZWN0ICAgICAgICAgPSA0NiwKKyAgLyogVXNlck9wMSAqLworICAvKiBVc2VyT3AyICovCisgIExMVk1WQUFyZyAgICAgICAgICA9IDQ5LAorICBMTFZNRXh0cmFjdEVsZW1lbnQgPSA1MCwKKyAgTExWTUluc2VydEVsZW1lbnQgID0gNTEsCisgIExMVk1TaHVmZmxlVmVjdG9yICA9IDUyLAorICBMTFZNRXh0cmFjdFZhbHVlICAgPSA1MywKKyAgTExWTUluc2VydFZhbHVlICAgID0gNTQKK30gTExWTU9wY29kZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTVZvaWRUeXBlS2luZCwgICAgICAgIC8qKjwgdHlwZSB3aXRoIG5vIHNpemUgKi8KKyAgTExWTUZsb2F0VHlwZUtpbmQsICAgICAgIC8qKjwgMzIgYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKi8KKyAgTExWTURvdWJsZVR5cGVLaW5kLCAgICAgIC8qKjwgNjQgYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKi8KKyAgTExWTVg4Nl9GUDgwVHlwZUtpbmQsICAgIC8qKjwgODAgYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKFg4NykgKi8KKyAgTExWTUZQMTI4VHlwZUtpbmQsICAgICAgIC8qKjwgMTI4IGJpdCBmbG9hdGluZyBwb2ludCB0eXBlICgxMTItYml0IG1hbnRpc3NhKSovCisgIExMVk1QUENfRlAxMjhUeXBlS2luZCwgICAvKio8IDEyOCBiaXQgZmxvYXRpbmcgcG9pbnQgdHlwZSAodHdvIDY0LWJpdHMpICovCisgIExMVk1MYWJlbFR5cGVLaW5kLCAgICAgICAvKio8IExhYmVscyAqLworICBMTFZNSW50ZWdlclR5cGVLaW5kLCAgICAgLyoqPCBBcmJpdHJhcnkgYml0IHdpZHRoIGludGVnZXJzICovCisgIExMVk1GdW5jdGlvblR5cGVLaW5kLCAgICAvKio8IEZ1bmN0aW9ucyAqLworICBMTFZNU3RydWN0VHlwZUtpbmQsICAgICAgLyoqPCBTdHJ1Y3R1cmVzICovCisgIExMVk1BcnJheVR5cGVLaW5kLCAgICAgICAvKio8IEFycmF5cyAqLworICBMTFZNUG9pbnRlclR5cGVLaW5kLCAgICAgLyoqPCBQb2ludGVycyAqLworICBMTFZNT3BhcXVlVHlwZUtpbmQsICAgICAgLyoqPCBPcGFxdWU6IHR5cGUgd2l0aCB1bmtub3duIHN0cnVjdHVyZSAqLworICBMTFZNVmVjdG9yVHlwZUtpbmQsICAgICAgLyoqPCBTSU1EICdwYWNrZWQnIGZvcm1hdCwgb3Igb3RoZXIgdmVjdG9yIHR5cGUgKi8KKyAgTExWTU1ldGFkYXRhVHlwZUtpbmQsICAgIC8qKjwgTWV0YWRhdGEgKi8KKyAgTExWTVVuaW9uVHlwZUtpbmQgICAgICAgIC8qKjwgVW5pb25zICovCit9IExMVk1UeXBlS2luZDsKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTUV4dGVybmFsTGlua2FnZSwgICAgLyoqPCBFeHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24gKi8KKyAgTExWTUF2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlLAorICBMTFZNTGlua09uY2VBbnlMaW5rYWdlLCAvKio8IEtlZXAgb25lIGNvcHkgb2YgZnVuY3Rpb24gd2hlbiBsaW5raW5nIChpbmxpbmUpKi8KKyAgTExWTUxpbmtPbmNlT0RSTGlua2FnZSwgLyoqPCBTYW1lLCBidXQgb25seSByZXBsYWNlZCBieSBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVpdmFsZW50LiAqLworICBMTFZNV2Vha0FueUxpbmthZ2UsICAgICAvKio8IEtlZXAgb25lIGNvcHkgb2YgZnVuY3Rpb24gd2hlbiBsaW5raW5nICh3ZWFrKSAqLworICBMTFZNV2Vha09EUkxpbmthZ2UsICAgICAvKio8IFNhbWUsIGJ1dCBvbmx5IHJlcGxhY2VkIGJ5IHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWl2YWxlbnQuICovCisgIExMVk1BcHBlbmRpbmdMaW5rYWdlLCAgIC8qKjwgU3BlY2lhbCBwdXJwb3NlLCBvbmx5IGFwcGxpZXMgdG8gZ2xvYmFsIGFycmF5cyAqLworICBMTFZNSW50ZXJuYWxMaW5rYWdlLCAgICAvKio8IFJlbmFtZSBjb2xsaXNpb25zIHdoZW4gbGlua2luZyAoc3RhdGljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zKSAqLworICBMTFZNUHJpdmF0ZUxpbmthZ2UsICAgICAvKio8IExpa2UgSW50ZXJuYWwsIGJ1dCBvbWl0IGZyb20gc3ltYm9sIHRhYmxlICovCisgIExMVk1ETExJbXBvcnRMaW5rYWdlLCAgIC8qKjwgRnVuY3Rpb24gdG8gYmUgaW1wb3J0ZWQgZnJvbSBETEwgKi8KKyAgTExWTURMTEV4cG9ydExpbmthZ2UsICAgLyoqPCBGdW5jdGlvbiB0byBiZSBhY2Nlc3NpYmxlIGZyb20gRExMICovCisgIExMVk1FeHRlcm5hbFdlYWtMaW5rYWdlLC8qKjwgRXh0ZXJuYWxXZWFrIGxpbmthZ2UgZGVzY3JpcHRpb24gKi8KKyAgTExWTUdob3N0TGlua2FnZSwgICAgICAgLyoqPCBPYnNvbGV0ZSAqLworICBMTFZNQ29tbW9uTGlua2FnZSwgICAgICAvKio8IFRlbnRhdGl2ZSBkZWZpbml0aW9ucyAqLworICBMTFZNTGlua2VyUHJpdmF0ZUxpbmthZ2UsIC8qKjwgTGlrZSBQcml2YXRlLCBidXQgbGlua2VyIHJlbW92ZXMuICovCisgIExMVk1MaW5rZXJQcml2YXRlV2Vha0xpbmthZ2UgLyoqPCBMaWtlIExpbmtlclByaXZhdGUsIGJ1dCBpcyB3ZWFrLiAqLworfSBMTFZNTGlua2FnZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTURlZmF1bHRWaXNpYmlsaXR5LCAgLyoqPCBUaGUgR1YgaXMgdmlzaWJsZSAqLworICBMTFZNSGlkZGVuVmlzaWJpbGl0eSwgICAvKio8IFRoZSBHViBpcyBoaWRkZW4gKi8KKyAgTExWTVByb3RlY3RlZFZpc2liaWxpdHkgLyoqPCBUaGUgR1YgaXMgcHJvdGVjdGVkICovCit9IExMVk1WaXNpYmlsaXR5OworCit0eXBlZGVmIGVudW0geworICBMTFZNQ0NhbGxDb252ICAgICAgICAgICA9IDAsCisgIExMVk1GYXN0Q2FsbENvbnYgICAgICAgID0gOCwKKyAgTExWTUNvbGRDYWxsQ29udiAgICAgICAgPSA5LAorICBMTFZNWDg2U3RkY2FsbENhbGxDb252ICA9IDY0LAorICBMTFZNWDg2RmFzdGNhbGxDYWxsQ29udiA9IDY1Cit9IExMVk1DYWxsQ29udjsKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTUludEVRID0gMzIsIC8qKjwgZXF1YWwgKi8KKyAgTExWTUludE5FLCAgICAgIC8qKjwgbm90IGVxdWFsICovCisgIExMVk1JbnRVR1QsICAgICAvKio8IHVuc2lnbmVkIGdyZWF0ZXIgdGhhbiAqLworICBMTFZNSW50VUdFLCAgICAgLyoqPCB1bnNpZ25lZCBncmVhdGVyIG9yIGVxdWFsICovCisgIExMVk1JbnRVTFQsICAgICAvKio8IHVuc2lnbmVkIGxlc3MgdGhhbiAqLworICBMTFZNSW50VUxFLCAgICAgLyoqPCB1bnNpZ25lZCBsZXNzIG9yIGVxdWFsICovCisgIExMVk1JbnRTR1QsICAgICAvKio8IHNpZ25lZCBncmVhdGVyIHRoYW4gKi8KKyAgTExWTUludFNHRSwgICAgIC8qKjwgc2lnbmVkIGdyZWF0ZXIgb3IgZXF1YWwgKi8KKyAgTExWTUludFNMVCwgICAgIC8qKjwgc2lnbmVkIGxlc3MgdGhhbiAqLworICBMTFZNSW50U0xFICAgICAgLyoqPCBzaWduZWQgbGVzcyBvciBlcXVhbCAqLworfSBMTFZNSW50UHJlZGljYXRlOworCit0eXBlZGVmIGVudW0geworICBMTFZNUmVhbFByZWRpY2F0ZUZhbHNlLCAvKio8IEFsd2F5cyBmYWxzZSAoYWx3YXlzIGZvbGRlZCkgKi8KKyAgTExWTVJlYWxPRVEsICAgICAgICAgICAgLyoqPCBUcnVlIGlmIG9yZGVyZWQgYW5kIGVxdWFsICovCisgIExMVk1SZWFsT0dULCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBncmVhdGVyIHRoYW4gKi8KKyAgTExWTVJlYWxPR0UsICAgICAgICAgICAgLyoqPCBUcnVlIGlmIG9yZGVyZWQgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAqLworICBMTFZNUmVhbE9MVCwgICAgICAgICAgICAvKio8IFRydWUgaWYgb3JkZXJlZCBhbmQgbGVzcyB0aGFuICovCisgIExMVk1SZWFsT0xFLCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgKi8KKyAgTExWTVJlYWxPTkUsICAgICAgICAgICAgLyoqPCBUcnVlIGlmIG9yZGVyZWQgYW5kIG9wZXJhbmRzIGFyZSB1bmVxdWFsICovCisgIExMVk1SZWFsT1JELCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiBvcmRlcmVkIChubyBuYW5zKSAqLworICBMTFZNUmVhbFVOTywgICAgICAgICAgICAvKio8IFRydWUgaWYgdW5vcmRlcmVkOiBpc25hbihYKSB8IGlzbmFuKFkpICovCisgIExMVk1SZWFsVUVRLCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgZXF1YWwgKi8KKyAgTExWTVJlYWxVR1QsICAgICAgICAgICAgLyoqPCBUcnVlIGlmIHVub3JkZXJlZCBvciBncmVhdGVyIHRoYW4gKi8KKyAgTExWTVJlYWxVR0UsICAgICAgICAgICAgLyoqPCBUcnVlIGlmIHVub3JkZXJlZCwgZ3JlYXRlciB0aGFuLCBvciBlcXVhbCAqLworICBMTFZNUmVhbFVMVCwgICAgICAgICAgICAvKio8IFRydWUgaWYgdW5vcmRlcmVkIG9yIGxlc3MgdGhhbiAqLworICBMTFZNUmVhbFVMRSwgICAgICAgICAgICAvKio8IFRydWUgaWYgdW5vcmRlcmVkLCBsZXNzIHRoYW4sIG9yIGVxdWFsICovCisgIExMVk1SZWFsVU5FLCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiB1bm9yZGVyZWQgb3Igbm90IGVxdWFsICovCisgIExMVk1SZWFsUHJlZGljYXRlVHJ1ZSAgIC8qKjwgQWx3YXlzIHRydWUgKGFsd2F5cyBmb2xkZWQpICovCit9IExMVk1SZWFsUHJlZGljYXRlOworCisKKy8qPT09LS0gRXJyb3IgaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK3ZvaWQgTExWTURpc3Bvc2VNZXNzYWdlKGNoYXIgKk1lc3NhZ2UpOworCisKKy8qPT09LS0gQ29udGV4dHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKy8qIENyZWF0ZSBhbmQgZGVzdHJveSBjb250ZXh0cy4gKi8KK0xMVk1Db250ZXh0UmVmIExMVk1Db250ZXh0Q3JlYXRlKHZvaWQpOworTExWTUNvbnRleHRSZWYgTExWTUdldEdsb2JhbENvbnRleHQodm9pZCk7Cit2b2lkIExMVk1Db250ZXh0RGlzcG9zZShMTFZNQ29udGV4dFJlZiBDKTsKKwordW5zaWduZWQgTExWTUdldE1ES2luZElESW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsIGNvbnN0IGNoYXIqIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU0xlbik7Cit1bnNpZ25lZCBMTFZNR2V0TURLaW5kSUQoY29uc3QgY2hhciogTmFtZSwgdW5zaWduZWQgU0xlbik7CisKKy8qPT09LS0gTW9kdWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKy8qIENyZWF0ZSBhbmQgZGVzdHJveSBtb2R1bGVzLiAqLyAKKy8qKiBTZWUgbGx2bTo6TW9kdWxlOjpNb2R1bGUuICovCitMTFZNTW9kdWxlUmVmIExMVk1Nb2R1bGVDcmVhdGVXaXRoTmFtZShjb25zdCBjaGFyICpNb2R1bGVJRCk7CitMTFZNTW9kdWxlUmVmIExMVk1Nb2R1bGVDcmVhdGVXaXRoTmFtZUluQ29udGV4dChjb25zdCBjaGFyICpNb2R1bGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0UmVmIEMpOworCisvKiogU2VlIGxsdm06Ok1vZHVsZTo6fk1vZHVsZS4gKi8KK3ZvaWQgTExWTURpc3Bvc2VNb2R1bGUoTExWTU1vZHVsZVJlZiBNKTsKKworLyoqIERhdGEgbGF5b3V0LiBTZWUgTW9kdWxlOjpnZXREYXRhTGF5b3V0LiAqLworY29uc3QgY2hhciAqTExWTUdldERhdGFMYXlvdXQoTExWTU1vZHVsZVJlZiBNKTsKK3ZvaWQgTExWTVNldERhdGFMYXlvdXQoTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpUcmlwbGUpOworCisvKiogVGFyZ2V0IHRyaXBsZS4gU2VlIE1vZHVsZTo6Z2V0VGFyZ2V0VHJpcGxlLiAqLworY29uc3QgY2hhciAqTExWTUdldFRhcmdldChMTFZNTW9kdWxlUmVmIE0pOwordm9pZCBMTFZNU2V0VGFyZ2V0KExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqVHJpcGxlKTsKKworLyoqIFNlZSBNb2R1bGU6OmFkZFR5cGVOYW1lLiAqLworTExWTUJvb2wgTExWTUFkZFR5cGVOYW1lKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqTmFtZSwgTExWTVR5cGVSZWYgVHkpOwordm9pZCBMTFZNRGVsZXRlVHlwZU5hbWUoTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1UeXBlUmVmIExMVk1HZXRUeXBlQnlOYW1lKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqTmFtZSk7CisKKy8qKiBTZWUgTW9kdWxlOjpkdW1wLiAqLwordm9pZCBMTFZNRHVtcE1vZHVsZShMTFZNTW9kdWxlUmVmIE0pOworCisvKiogU2VlIE1vZHVsZTo6c2V0TW9kdWxlSW5saW5lQXNtLiAqLwordm9pZCBMTFZNU2V0TW9kdWxlSW5saW5lQXNtKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqQXNtKTsKKworLyo9PT0tLSBUeXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworLyogTExWTSB0eXBlcyBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgaGllcmFyY2h5OgorICogCisgKiAgIHR5cGVzOgorICogICAgIGludGVnZXIgdHlwZQorICogICAgIHJlYWwgdHlwZQorICogICAgIGZ1bmN0aW9uIHR5cGUKKyAqICAgICBzZXF1ZW5jZSB0eXBlczoKKyAqICAgICAgIGFycmF5IHR5cGUKKyAqICAgICAgIHBvaW50ZXIgdHlwZQorICogICAgICAgdmVjdG9yIHR5cGUKKyAqICAgICB2b2lkIHR5cGUKKyAqICAgICBsYWJlbCB0eXBlCisgKiAgICAgb3BhcXVlIHR5cGUKKyAqLworCisvKiogU2VlIGxsdm06OkxMVk1UeXBlS2luZDo6Z2V0VHlwZUlELiAqLworTExWTVR5cGVLaW5kIExMVk1HZXRUeXBlS2luZChMTFZNVHlwZVJlZiBUeSk7CisKKy8qKiBTZWUgbGx2bTo6TExWTVR5cGU6OmdldENvbnRleHQuICovCitMTFZNQ29udGV4dFJlZiBMTFZNR2V0VHlwZUNvbnRleHQoTExWTVR5cGVSZWYgVHkpOworCisvKiBPcGVyYXRpb25zIG9uIGludGVnZXIgdHlwZXMgKi8KK0xMVk1UeXBlUmVmIExMVk1JbnQxVHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKK0xMVk1UeXBlUmVmIExMVk1JbnQ4VHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKK0xMVk1UeXBlUmVmIExMVk1JbnQxNlR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CitMTFZNVHlwZVJlZiBMTFZNSW50MzJUeXBlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMpOworTExWTVR5cGVSZWYgTExWTUludDY0VHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKK0xMVk1UeXBlUmVmIExMVk1JbnRUeXBlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsIHVuc2lnbmVkIE51bUJpdHMpOworCitMTFZNVHlwZVJlZiBMTFZNSW50MVR5cGUodm9pZCk7CitMTFZNVHlwZVJlZiBMTFZNSW50OFR5cGUodm9pZCk7CitMTFZNVHlwZVJlZiBMTFZNSW50MTZUeXBlKHZvaWQpOworTExWTVR5cGVSZWYgTExWTUludDMyVHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1JbnQ2NFR5cGUodm9pZCk7CitMTFZNVHlwZVJlZiBMTFZNSW50VHlwZSh1bnNpZ25lZCBOdW1CaXRzKTsKK3Vuc2lnbmVkIExMVk1HZXRJbnRUeXBlV2lkdGgoTExWTVR5cGVSZWYgSW50ZWdlclR5KTsKKworLyogT3BlcmF0aW9ucyBvbiByZWFsIHR5cGVzICovCitMTFZNVHlwZVJlZiBMTFZNRmxvYXRUeXBlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMpOworTExWTVR5cGVSZWYgTExWTURvdWJsZVR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CitMTFZNVHlwZVJlZiBMTFZNWDg2RlA4MFR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CitMTFZNVHlwZVJlZiBMTFZNRlAxMjhUeXBlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMpOworTExWTVR5cGVSZWYgTExWTVBQQ0ZQMTI4VHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKKworTExWTVR5cGVSZWYgTExWTUZsb2F0VHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1Eb3VibGVUeXBlKHZvaWQpOworTExWTVR5cGVSZWYgTExWTVg4NkZQODBUeXBlKHZvaWQpOworTExWTVR5cGVSZWYgTExWTUZQMTI4VHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1QUENGUDEyOFR5cGUodm9pZCk7CisKKy8qIE9wZXJhdGlvbnMgb24gZnVuY3Rpb24gdHlwZXMgKi8KK0xMVk1UeXBlUmVmIExMVk1GdW5jdGlvblR5cGUoTExWTVR5cGVSZWYgUmV0dXJuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgKlBhcmFtVHlwZXMsIHVuc2lnbmVkIFBhcmFtQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Cb29sIElzVmFyQXJnKTsKK0xMVk1Cb29sIExMVk1Jc0Z1bmN0aW9uVmFyQXJnKExMVk1UeXBlUmVmIEZ1bmN0aW9uVHkpOworTExWTVR5cGVSZWYgTExWTUdldFJldHVyblR5cGUoTExWTVR5cGVSZWYgRnVuY3Rpb25UeSk7Cit1bnNpZ25lZCBMTFZNQ291bnRQYXJhbVR5cGVzKExMVk1UeXBlUmVmIEZ1bmN0aW9uVHkpOwordm9pZCBMTFZNR2V0UGFyYW1UeXBlcyhMTFZNVHlwZVJlZiBGdW5jdGlvblR5LCBMTFZNVHlwZVJlZiAqRGVzdCk7CisKKy8qIE9wZXJhdGlvbnMgb24gc3RydWN0IHR5cGVzICovCitMTFZNVHlwZVJlZiBMTFZNU3RydWN0VHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDLCBMTFZNVHlwZVJlZiAqRWxlbWVudFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWxlbWVudENvdW50LCBMTFZNQm9vbCBQYWNrZWQpOworTExWTVR5cGVSZWYgTExWTVN0cnVjdFR5cGUoTExWTVR5cGVSZWYgKkVsZW1lbnRUeXBlcywgdW5zaWduZWQgRWxlbWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgUGFja2VkKTsKK3Vuc2lnbmVkIExMVk1Db3VudFN0cnVjdEVsZW1lbnRUeXBlcyhMTFZNVHlwZVJlZiBTdHJ1Y3RUeSk7Cit2b2lkIExMVk1HZXRTdHJ1Y3RFbGVtZW50VHlwZXMoTExWTVR5cGVSZWYgU3RydWN0VHksIExMVk1UeXBlUmVmICpEZXN0KTsKK0xMVk1Cb29sIExMVk1Jc1BhY2tlZFN0cnVjdChMTFZNVHlwZVJlZiBTdHJ1Y3RUeSk7CisKKy8qIE9wZXJhdGlvbnMgb24gdW5pb24gdHlwZXMgKi8KK0xMVk1UeXBlUmVmIExMVk1VbmlvblR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywgTExWTVR5cGVSZWYgKkVsZW1lbnRUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWxlbWVudENvdW50KTsKK0xMVk1UeXBlUmVmIExMVk1VbmlvblR5cGUoTExWTVR5cGVSZWYgKkVsZW1lbnRUeXBlcywgdW5zaWduZWQgRWxlbWVudENvdW50KTsKK3Vuc2lnbmVkIExMVk1Db3VudFVuaW9uRWxlbWVudFR5cGVzKExMVk1UeXBlUmVmIFVuaW9uVHkpOwordm9pZCBMTFZNR2V0VW5pb25FbGVtZW50VHlwZXMoTExWTVR5cGVSZWYgVW5pb25UeSwgTExWTVR5cGVSZWYgKkRlc3QpOworCisvKiBPcGVyYXRpb25zIG9uIGFycmF5LCBwb2ludGVyLCBhbmQgdmVjdG9yIHR5cGVzIChzZXF1ZW5jZSB0eXBlcykgKi8KK0xMVk1UeXBlUmVmIExMVk1BcnJheVR5cGUoTExWTVR5cGVSZWYgRWxlbWVudFR5cGUsIHVuc2lnbmVkIEVsZW1lbnRDb3VudCk7CitMTFZNVHlwZVJlZiBMTFZNUG9pbnRlclR5cGUoTExWTVR5cGVSZWYgRWxlbWVudFR5cGUsIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSk7CitMTFZNVHlwZVJlZiBMTFZNVmVjdG9yVHlwZShMTFZNVHlwZVJlZiBFbGVtZW50VHlwZSwgdW5zaWduZWQgRWxlbWVudENvdW50KTsKKworTExWTVR5cGVSZWYgTExWTUdldEVsZW1lbnRUeXBlKExMVk1UeXBlUmVmIFR5KTsKK3Vuc2lnbmVkIExMVk1HZXRBcnJheUxlbmd0aChMTFZNVHlwZVJlZiBBcnJheVR5KTsKK3Vuc2lnbmVkIExMVk1HZXRQb2ludGVyQWRkcmVzc1NwYWNlKExMVk1UeXBlUmVmIFBvaW50ZXJUeSk7Cit1bnNpZ25lZCBMTFZNR2V0VmVjdG9yU2l6ZShMTFZNVHlwZVJlZiBWZWN0b3JUeSk7CisKKy8qIE9wZXJhdGlvbnMgb24gb3RoZXIgdHlwZXMgKi8KK0xMVk1UeXBlUmVmIExMVk1Wb2lkVHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKK0xMVk1UeXBlUmVmIExMVk1MYWJlbFR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CitMTFZNVHlwZVJlZiBMTFZNT3BhcXVlVHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKKworTExWTVR5cGVSZWYgTExWTVZvaWRUeXBlKHZvaWQpOworTExWTVR5cGVSZWYgTExWTUxhYmVsVHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1PcGFxdWVUeXBlKHZvaWQpOworCisvKiBPcGVyYXRpb25zIG9uIHR5cGUgaGFuZGxlcyAqLworTExWTVR5cGVIYW5kbGVSZWYgTExWTUNyZWF0ZVR5cGVIYW5kbGUoTExWTVR5cGVSZWYgUG90ZW50aWFsbHlBYnN0cmFjdFR5KTsKK3ZvaWQgTExWTVJlZmluZVR5cGUoTExWTVR5cGVSZWYgQWJzdHJhY3RUeSwgTExWTVR5cGVSZWYgQ29uY3JldGVUeSk7CitMTFZNVHlwZVJlZiBMTFZNUmVzb2x2ZVR5cGVIYW5kbGUoTExWTVR5cGVIYW5kbGVSZWYgVHlwZUhhbmRsZSk7Cit2b2lkIExMVk1EaXNwb3NlVHlwZUhhbmRsZShMTFZNVHlwZUhhbmRsZVJlZiBUeXBlSGFuZGxlKTsKKworCisvKj09PS0tIFZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKiBUaGUgYnVsayBvZiBMTFZNJ3Mgb2JqZWN0IG1vZGVsIGNvbnNpc3RzIG9mIHZhbHVlcywgd2hpY2ggY29tcHJpc2UgYSB2ZXJ5CisgKiByaWNoIHR5cGUgaGllcmFyY2h5LgorICovCisKKyNkZWZpbmUgTExWTV9GT1JfRUFDSF9WQUxVRV9TVUJDTEFTUyhtYWNybykgXAorICBtYWNybyhBcmd1bWVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1hY3JvKEJhc2ljQmxvY2spICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWFjcm8oSW5saW5lQXNtKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtYWNybyhVc2VyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oQ29uc3RhbnQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKENvbnN0YW50QWdncmVnYXRlWmVybykgICAgICAgICAgXAorICAgICAgbWFjcm8oQ29uc3RhbnRBcnJheSkgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhDb25zdGFudEV4cHIpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKENvbnN0YW50RlApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oQ29uc3RhbnRJbnQpICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhDb25zdGFudFBvaW50ZXJOdWxsKSAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKENvbnN0YW50U3RydWN0KSAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oQ29uc3RhbnRWZWN0b3IpICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhHbG9iYWxWYWx1ZSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oRnVuY3Rpb24pICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhHbG9iYWxBbGlhcykgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKEdsb2JhbFZhcmlhYmxlKSAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKFVuZGVmVmFsdWUpICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKEluc3RydWN0aW9uKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhCaW5hcnlPcGVyYXRvcikgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKENhbGxJbnN0KSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhJbnRyaW5zaWNJbnN0KSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWFjcm8oRGJnSW5mb0ludHJpbnNpYykgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1hY3JvKERiZ0RlY2xhcmVJbnN0KSAgICAgICAgICAgXAorICAgICAgICAgIG1hY3JvKEVIU2VsZWN0b3JJbnN0KSAgICAgICAgICAgICBcCisgICAgICAgICAgbWFjcm8oTWVtSW50cmluc2ljKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1hY3JvKE1lbUNweUluc3QpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbWFjcm8oTWVtTW92ZUluc3QpICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtYWNybyhNZW1TZXRJbnN0KSAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKENtcEluc3QpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oRkNtcEluc3QpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhJQ21wSW5zdCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKEV4dHJhY3RFbGVtZW50SW5zdCkgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oR2V0RWxlbWVudFB0ckluc3QpICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhJbnNlcnRFbGVtZW50SW5zdCkgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKEluc2VydFZhbHVlSW5zdCkgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oUEhJTm9kZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhTZWxlY3RJbnN0KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKFNodWZmbGVWZWN0b3JJbnN0KSAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oU3RvcmVJbnN0KSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhUZXJtaW5hdG9ySW5zdCkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oQnJhbmNoSW5zdCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhJbnZva2VJbnN0KSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKFJldHVybkluc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oU3dpdGNoSW5zdCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhVbnJlYWNoYWJsZUluc3QpICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKFVud2luZEluc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhVbmFyeUluc3RydWN0aW9uKSAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oQWxsb2NhSW5zdCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhDYXN0SW5zdCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oQml0Q2FzdEluc3QpICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhGUEV4dEluc3QpICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKEZQVG9TSUluc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oRlBUb1VJSW5zdCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhGUFRydW5jSW5zdCkgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKEludFRvUHRySW5zdCkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oUHRyVG9JbnRJbnN0KSAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhTRXh0SW5zdCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKFNJVG9GUEluc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oVHJ1bmNJbnN0KSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhVSVRvRlBJbnN0KSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKFpFeHRJbnN0KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKEV4dHJhY3RWYWx1ZUluc3QpICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oTG9hZEluc3QpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhWQUFyZ0luc3QpCisKKy8qIE9wZXJhdGlvbnMgb24gYWxsIHZhbHVlcyAqLworTExWTVR5cGVSZWYgTExWTVR5cGVPZihMTFZNVmFsdWVSZWYgVmFsKTsKK2NvbnN0IGNoYXIgKkxMVk1HZXRWYWx1ZU5hbWUoTExWTVZhbHVlUmVmIFZhbCk7Cit2b2lkIExMVk1TZXRWYWx1ZU5hbWUoTExWTVZhbHVlUmVmIFZhbCwgY29uc3QgY2hhciAqTmFtZSk7Cit2b2lkIExMVk1EdW1wVmFsdWUoTExWTVZhbHVlUmVmIFZhbCk7Cit2b2lkIExMVk1SZXBsYWNlQWxsVXNlc1dpdGgoTExWTVZhbHVlUmVmIE9sZFZhbCwgTExWTVZhbHVlUmVmIE5ld1ZhbCk7CitpbnQgTExWTUhhc01ldGFkYXRhKExMVk1WYWx1ZVJlZiBWYWwpOworTExWTVZhbHVlUmVmIExMVk1HZXRNZXRhZGF0YShMTFZNVmFsdWVSZWYgVmFsLCB1bnNpZ25lZCBLaW5kSUQpOwordm9pZCBMTFZNU2V0TWV0YWRhdGEoTExWTVZhbHVlUmVmIFZhbCwgdW5zaWduZWQgS2luZElELCBMTFZNVmFsdWVSZWYgTm9kZSk7CisKKy8qIENvbnZlcnNpb24gZnVuY3Rpb25zLiBSZXR1cm4gdGhlIGlucHV0IHZhbHVlIGlmIGl0IGlzIGFuIGluc3RhbmNlIG9mIHRoZQorICAgc3BlY2lmaWVkIGNsYXNzLCBvdGhlcndpc2UgTlVMTC4gU2VlIGxsdm06OmR5bl9jYXN0X29yX251bGw8Pi4gKi8KKyNkZWZpbmUgTExWTV9ERUNMQVJFX1ZBTFVFX0NBU1QobmFtZSkgXAorICBMTFZNVmFsdWVSZWYgTExWTUlzQSMjbmFtZShMTFZNVmFsdWVSZWYgVmFsKTsKK0xMVk1fRk9SX0VBQ0hfVkFMVUVfU1VCQ0xBU1MoTExWTV9ERUNMQVJFX1ZBTFVFX0NBU1QpCisKKy8qIE9wZXJhdGlvbnMgb24gVXNlcyAqLworTExWTVVzZVJlZiBMTFZNR2V0Rmlyc3RVc2UoTExWTVZhbHVlUmVmIFZhbCk7CitMTFZNVXNlUmVmIExMVk1HZXROZXh0VXNlKExMVk1Vc2VSZWYgVSk7CitMTFZNVmFsdWVSZWYgTExWTUdldFVzZXIoTExWTVVzZVJlZiBVKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0VXNlZFZhbHVlKExMVk1Vc2VSZWYgVSk7CisKKy8qIE9wZXJhdGlvbnMgb24gVXNlcnMgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0T3BlcmFuZChMTFZNVmFsdWVSZWYgVmFsLCB1bnNpZ25lZCBJbmRleCk7CisKKy8qIE9wZXJhdGlvbnMgb24gY29uc3RhbnRzIG9mIGFueSB0eXBlICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TnVsbChMTFZNVHlwZVJlZiBUeSk7IC8qIGFsbCB6ZXJvZXMgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RBbGxPbmVzKExMVk1UeXBlUmVmIFR5KTsgLyogb25seSBmb3IgaW50L3ZlY3RvciAqLworTExWTVZhbHVlUmVmIExMVk1HZXRVbmRlZihMTFZNVHlwZVJlZiBUeSk7CitMTFZNQm9vbCBMTFZNSXNDb25zdGFudChMTFZNVmFsdWVSZWYgVmFsKTsKK0xMVk1Cb29sIExMVk1Jc051bGwoTExWTVZhbHVlUmVmIFZhbCk7CitMTFZNQm9vbCBMTFZNSXNVbmRlZihMTFZNVmFsdWVSZWYgVmFsKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RQb2ludGVyTnVsbChMTFZNVHlwZVJlZiBUeSk7CisKKy8qIE9wZXJhdGlvbnMgb24gbWV0YWRhdGEgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNTURTdHJpbmdJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywgY29uc3QgY2hhciAqU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTTGVuKTsKK0xMVk1WYWx1ZVJlZiBMTFZNTURTdHJpbmcoY29uc3QgY2hhciAqU3RyLCB1bnNpZ25lZCBTTGVuKTsKK0xMVk1WYWx1ZVJlZiBMTFZNTUROb2RlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsIExMVk1WYWx1ZVJlZiAqVmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvdW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNTUROb2RlKExMVk1WYWx1ZVJlZiAqVmFscywgdW5zaWduZWQgQ291bnQpOworCisvKiBPcGVyYXRpb25zIG9uIHNjYWxhciBjb25zdGFudHMgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RJbnQoTExWTVR5cGVSZWYgSW50VHksIHVuc2lnbmVkIGxvbmcgbG9uZyBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBTaWduRXh0ZW5kKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RJbnRPZlN0cmluZyhMTFZNVHlwZVJlZiBJbnRUeSwgY29uc3QgY2hhciAqVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IFJhZGl4KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RJbnRPZlN0cmluZ0FuZFNpemUoTExWTVR5cGVSZWYgSW50VHksIGNvbnN0IGNoYXIgKlRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNMZW4sIHVpbnQ4X3QgUmFkaXgpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFJlYWwoTExWTVR5cGVSZWYgUmVhbFR5LCBkb3VibGUgTik7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0UmVhbE9mU3RyaW5nKExMVk1UeXBlUmVmIFJlYWxUeSwgY29uc3QgY2hhciAqVGV4dCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0UmVhbE9mU3RyaW5nQW5kU2l6ZShMTFZNVHlwZVJlZiBSZWFsVHksIGNvbnN0IGNoYXIgKlRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTTGVuKTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBMTFZNQ29uc3RJbnRHZXRaRXh0VmFsdWUoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsKTsKK2xvbmcgbG9uZyBMTFZNQ29uc3RJbnRHZXRTRXh0VmFsdWUoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsKTsKKworCisvKiBPcGVyYXRpb25zIG9uIGNvbXBvc2l0ZSBjb25zdGFudHMgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RTdHJpbmdJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywgY29uc3QgY2hhciAqU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMZW5ndGgsIExMVk1Cb29sIERvbnROdWxsVGVybWluYXRlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RTdHJ1Y3RJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiAqQ29uc3RhbnRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3VudCwgTExWTUJvb2wgUGFja2VkKTsKKworTExWTVZhbHVlUmVmIExMVk1Db25zdFN0cmluZyhjb25zdCBjaGFyICpTdHIsIHVuc2lnbmVkIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgRG9udE51bGxUZXJtaW5hdGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEFycmF5KExMVk1UeXBlUmVmIEVsZW1lbnRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgKkNvbnN0YW50VmFscywgdW5zaWduZWQgTGVuZ3RoKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RTdHJ1Y3QoTExWTVZhbHVlUmVmICpDb25zdGFudFZhbHMsIHVuc2lnbmVkIENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBQYWNrZWQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFZlY3RvcihMTFZNVmFsdWVSZWYgKlNjYWxhckNvbnN0YW50VmFscywgdW5zaWduZWQgU2l6ZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0VW5pb24oTExWTVR5cGVSZWYgVHksIExMVk1WYWx1ZVJlZiBWYWwpOworCisvKiBDb25zdGFudCBleHByZXNzaW9ucyAqLworTExWTU9wY29kZSBMTFZNR2V0Q29uc3RPcGNvZGUoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQWxpZ25PZihMTFZNVHlwZVJlZiBUeSk7CitMTFZNVmFsdWVSZWYgTExWTVNpemVPZihMTFZNVHlwZVJlZiBUeSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TmVnKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TlNXTmVnKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TlVXTmVnKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0Rk5lZyhMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwpOworTExWTVZhbHVlUmVmIExMVk1Db25zdE5vdChMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEFkZChMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TlNXQWRkKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3ROVVdBZGQoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEZBZGQoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFN1YihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TlNXU3ViKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3ROVVdTdWIoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEZTdWIoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdE11bChMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TlNXTXVsKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3ROVVdNdWwoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEZNdWwoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFVEaXYoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFNEaXYoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEV4YWN0U0RpdihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RkRpdihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0VVJlbShMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U1JlbShMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RlJlbShMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0QW5kKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RPcihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0WG9yKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RJQ21wKExMVk1JbnRQcmVkaWNhdGUgUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEZDbXAoTExWTVJlYWxQcmVkaWNhdGUgUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFNobChMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TFNocihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0QVNocihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0R0VQKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmICpDb25zdGFudEluZGljZXMsIHVuc2lnbmVkIE51bUluZGljZXMpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEluQm91bmRzR0VQKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgKkNvbnN0YW50SW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JbmRpY2VzKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RUcnVuYyhMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U0V4dChMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0WkV4dChMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RlBUcnVuYyhMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RlBFeHQoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsLCBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFVJVG9GUChMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U0lUb0ZQKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTVR5cGVSZWYgVG9UeXBlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RGUFRvVUkoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsLCBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEZQVG9TSShMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0UHRyVG9JbnQoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsLCBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEludFRvUHRyKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTVR5cGVSZWYgVG9UeXBlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RCaXRDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTVR5cGVSZWYgVG9UeXBlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RaRXh0T3JCaXRDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U0V4dE9yQml0Q2FzdChMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFRydW5jT3JCaXRDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFBvaW50ZXJDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEludENhc3QoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsLCBMTFZNVHlwZVJlZiBUb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBpc1NpZ25lZCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RlBDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTVR5cGVSZWYgVG9UeXBlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RTZWxlY3QoTExWTVZhbHVlUmVmIENvbnN0YW50Q29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgQ29uc3RhbnRJZlRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBDb25zdGFudElmRmFsc2UpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEV4dHJhY3RFbGVtZW50KExMVk1WYWx1ZVJlZiBWZWN0b3JDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgSW5kZXhDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0SW5zZXJ0RWxlbWVudChMTFZNVmFsdWVSZWYgVmVjdG9yQ29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgRWxlbWVudFZhbHVlQ29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgSW5kZXhDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U2h1ZmZsZVZlY3RvcihMTFZNVmFsdWVSZWYgVmVjdG9yQUNvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIFZlY3RvckJDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBNYXNrQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEV4dHJhY3RWYWx1ZShMTFZNVmFsdWVSZWYgQWdnQ29uc3RhbnQsIHVuc2lnbmVkICpJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEluc2VydFZhbHVlKExMVk1WYWx1ZVJlZiBBZ2dDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgRWxlbWVudFZhbHVlQ29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKklkeExpc3QsIHVuc2lnbmVkIE51bUlkeCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0SW5saW5lQXNtKExMVk1UeXBlUmVmIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpBc21TdHJpbmcsIGNvbnN0IGNoYXIgKkNvbnN0cmFpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBIYXNTaWRlRWZmZWN0cywgTExWTUJvb2wgSXNBbGlnblN0YWNrKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQmxvY2tBZGRyZXNzKExMVk1WYWx1ZVJlZiBGLCBMTFZNQmFzaWNCbG9ja1JlZiBCQik7CisKKy8qIE9wZXJhdGlvbnMgb24gZ2xvYmFsIHZhcmlhYmxlcywgZnVuY3Rpb25zLCBhbmQgYWxpYXNlcyAoZ2xvYmFscykgKi8KK0xMVk1Nb2R1bGVSZWYgTExWTUdldEdsb2JhbFBhcmVudChMTFZNVmFsdWVSZWYgR2xvYmFsKTsKK0xMVk1Cb29sIExMVk1Jc0RlY2xhcmF0aW9uKExMVk1WYWx1ZVJlZiBHbG9iYWwpOworTExWTUxpbmthZ2UgTExWTUdldExpbmthZ2UoTExWTVZhbHVlUmVmIEdsb2JhbCk7Cit2b2lkIExMVk1TZXRMaW5rYWdlKExMVk1WYWx1ZVJlZiBHbG9iYWwsIExMVk1MaW5rYWdlIExpbmthZ2UpOworY29uc3QgY2hhciAqTExWTUdldFNlY3Rpb24oTExWTVZhbHVlUmVmIEdsb2JhbCk7Cit2b2lkIExMVk1TZXRTZWN0aW9uKExMVk1WYWx1ZVJlZiBHbG9iYWwsIGNvbnN0IGNoYXIgKlNlY3Rpb24pOworTExWTVZpc2liaWxpdHkgTExWTUdldFZpc2liaWxpdHkoTExWTVZhbHVlUmVmIEdsb2JhbCk7Cit2b2lkIExMVk1TZXRWaXNpYmlsaXR5KExMVk1WYWx1ZVJlZiBHbG9iYWwsIExMVk1WaXNpYmlsaXR5IFZpeik7Cit1bnNpZ25lZCBMTFZNR2V0QWxpZ25tZW50KExMVk1WYWx1ZVJlZiBHbG9iYWwpOwordm9pZCBMTFZNU2V0QWxpZ25tZW50KExMVk1WYWx1ZVJlZiBHbG9iYWwsIHVuc2lnbmVkIEJ5dGVzKTsKKworLyogT3BlcmF0aW9ucyBvbiBnbG9iYWwgdmFyaWFibGVzICovCitMTFZNVmFsdWVSZWYgTExWTUFkZEdsb2JhbChMTFZNTW9kdWxlUmVmIE0sIExMVk1UeXBlUmVmIFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQWRkR2xvYmFsSW5BZGRyZXNzU3BhY2UoTExWTU1vZHVsZVJlZiBNLCBMTFZNVHlwZVJlZiBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0TmFtZWRHbG9iYWwoTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0Rmlyc3RHbG9iYWwoTExWTU1vZHVsZVJlZiBNKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0TGFzdEdsb2JhbChMTFZNTW9kdWxlUmVmIE0pOworTExWTVZhbHVlUmVmIExMVk1HZXROZXh0R2xvYmFsKExMVk1WYWx1ZVJlZiBHbG9iYWxWYXIpOworTExWTVZhbHVlUmVmIExMVk1HZXRQcmV2aW91c0dsb2JhbChMTFZNVmFsdWVSZWYgR2xvYmFsVmFyKTsKK3ZvaWQgTExWTURlbGV0ZUdsb2JhbChMTFZNVmFsdWVSZWYgR2xvYmFsVmFyKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0SW5pdGlhbGl6ZXIoTExWTVZhbHVlUmVmIEdsb2JhbFZhcik7Cit2b2lkIExMVk1TZXRJbml0aWFsaXplcihMTFZNVmFsdWVSZWYgR2xvYmFsVmFyLCBMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwpOworTExWTUJvb2wgTExWTUlzVGhyZWFkTG9jYWwoTExWTVZhbHVlUmVmIEdsb2JhbFZhcik7Cit2b2lkIExMVk1TZXRUaHJlYWRMb2NhbChMTFZNVmFsdWVSZWYgR2xvYmFsVmFyLCBMTFZNQm9vbCBJc1RocmVhZExvY2FsKTsKK0xMVk1Cb29sIExMVk1Jc0dsb2JhbENvbnN0YW50KExMVk1WYWx1ZVJlZiBHbG9iYWxWYXIpOwordm9pZCBMTFZNU2V0R2xvYmFsQ29uc3RhbnQoTExWTVZhbHVlUmVmIEdsb2JhbFZhciwgTExWTUJvb2wgSXNDb25zdGFudCk7CisKKy8qIE9wZXJhdGlvbnMgb24gYWxpYXNlcyAqLworTExWTVZhbHVlUmVmIExMVk1BZGRBbGlhcyhMTFZNTW9kdWxlUmVmIE0sIExMVk1UeXBlUmVmIFR5LCBMTFZNVmFsdWVSZWYgQWxpYXNlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CisKKy8qIE9wZXJhdGlvbnMgb24gZnVuY3Rpb25zICovCitMTFZNVmFsdWVSZWYgTExWTUFkZEZ1bmN0aW9uKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRnVuY3Rpb25UeSk7CitMTFZNVmFsdWVSZWYgTExWTUdldE5hbWVkRnVuY3Rpb24oTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0Rmlyc3RGdW5jdGlvbihMTFZNTW9kdWxlUmVmIE0pOworTExWTVZhbHVlUmVmIExMVk1HZXRMYXN0RnVuY3Rpb24oTExWTU1vZHVsZVJlZiBNKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0TmV4dEZ1bmN0aW9uKExMVk1WYWx1ZVJlZiBGbik7CitMTFZNVmFsdWVSZWYgTExWTUdldFByZXZpb3VzRnVuY3Rpb24oTExWTVZhbHVlUmVmIEZuKTsKK3ZvaWQgTExWTURlbGV0ZUZ1bmN0aW9uKExMVk1WYWx1ZVJlZiBGbik7Cit1bnNpZ25lZCBMTFZNR2V0SW50cmluc2ljSUQoTExWTVZhbHVlUmVmIEZuKTsKK3Vuc2lnbmVkIExMVk1HZXRGdW5jdGlvbkNhbGxDb252KExMVk1WYWx1ZVJlZiBGbik7Cit2b2lkIExMVk1TZXRGdW5jdGlvbkNhbGxDb252KExMVk1WYWx1ZVJlZiBGbiwgdW5zaWduZWQgQ0MpOworY29uc3QgY2hhciAqTExWTUdldEdDKExMVk1WYWx1ZVJlZiBGbik7Cit2b2lkIExMVk1TZXRHQyhMTFZNVmFsdWVSZWYgRm4sIGNvbnN0IGNoYXIgKk5hbWUpOwordm9pZCBMTFZNQWRkRnVuY3Rpb25BdHRyKExMVk1WYWx1ZVJlZiBGbiwgTExWTUF0dHJpYnV0ZSBQQSk7CitMTFZNQXR0cmlidXRlIExMVk1HZXRGdW5jdGlvbkF0dHIoTExWTVZhbHVlUmVmIEZuKTsKK3ZvaWQgTExWTVJlbW92ZUZ1bmN0aW9uQXR0cihMTFZNVmFsdWVSZWYgRm4sIExMVk1BdHRyaWJ1dGUgUEEpOworCisvKiBPcGVyYXRpb25zIG9uIHBhcmFtZXRlcnMgKi8KK3Vuc2lnbmVkIExMVk1Db3VudFBhcmFtcyhMTFZNVmFsdWVSZWYgRm4pOwordm9pZCBMTFZNR2V0UGFyYW1zKExMVk1WYWx1ZVJlZiBGbiwgTExWTVZhbHVlUmVmICpQYXJhbXMpOworTExWTVZhbHVlUmVmIExMVk1HZXRQYXJhbShMTFZNVmFsdWVSZWYgRm4sIHVuc2lnbmVkIEluZGV4KTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0UGFyYW1QYXJlbnQoTExWTVZhbHVlUmVmIEluc3QpOworTExWTVZhbHVlUmVmIExMVk1HZXRGaXJzdFBhcmFtKExMVk1WYWx1ZVJlZiBGbik7CitMTFZNVmFsdWVSZWYgTExWTUdldExhc3RQYXJhbShMTFZNVmFsdWVSZWYgRm4pOworTExWTVZhbHVlUmVmIExMVk1HZXROZXh0UGFyYW0oTExWTVZhbHVlUmVmIEFyZyk7CitMTFZNVmFsdWVSZWYgTExWTUdldFByZXZpb3VzUGFyYW0oTExWTVZhbHVlUmVmIEFyZyk7Cit2b2lkIExMVk1BZGRBdHRyaWJ1dGUoTExWTVZhbHVlUmVmIEFyZywgTExWTUF0dHJpYnV0ZSBQQSk7Cit2b2lkIExMVk1SZW1vdmVBdHRyaWJ1dGUoTExWTVZhbHVlUmVmIEFyZywgTExWTUF0dHJpYnV0ZSBQQSk7CitMTFZNQXR0cmlidXRlIExMVk1HZXRBdHRyaWJ1dGUoTExWTVZhbHVlUmVmIEFyZyk7Cit2b2lkIExMVk1TZXRQYXJhbUFsaWdubWVudChMTFZNVmFsdWVSZWYgQXJnLCB1bnNpZ25lZCBhbGlnbik7CisKKy8qIE9wZXJhdGlvbnMgb24gYmFzaWMgYmxvY2tzICovCitMTFZNVmFsdWVSZWYgTExWTUJhc2ljQmxvY2tBc1ZhbHVlKExMVk1CYXNpY0Jsb2NrUmVmIEJCKTsKK0xMVk1Cb29sIExMVk1WYWx1ZUlzQmFzaWNCbG9jayhMTFZNVmFsdWVSZWYgVmFsKTsKK0xMVk1CYXNpY0Jsb2NrUmVmIExMVk1WYWx1ZUFzQmFzaWNCbG9jayhMTFZNVmFsdWVSZWYgVmFsKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0QmFzaWNCbG9ja1BhcmVudChMTFZNQmFzaWNCbG9ja1JlZiBCQik7Cit1bnNpZ25lZCBMTFZNQ291bnRCYXNpY0Jsb2NrcyhMTFZNVmFsdWVSZWYgRm4pOwordm9pZCBMTFZNR2V0QmFzaWNCbG9ja3MoTExWTVZhbHVlUmVmIEZuLCBMTFZNQmFzaWNCbG9ja1JlZiAqQmFzaWNCbG9ja3MpOworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldEZpcnN0QmFzaWNCbG9jayhMTFZNVmFsdWVSZWYgRm4pOworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldExhc3RCYXNpY0Jsb2NrKExMVk1WYWx1ZVJlZiBGbik7CitMTFZNQmFzaWNCbG9ja1JlZiBMTFZNR2V0TmV4dEJhc2ljQmxvY2soTExWTUJhc2ljQmxvY2tSZWYgQkIpOworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldFByZXZpb3VzQmFzaWNCbG9jayhMTFZNQmFzaWNCbG9ja1JlZiBCQik7CitMTFZNQmFzaWNCbG9ja1JlZiBMTFZNR2V0RW50cnlCYXNpY0Jsb2NrKExMVk1WYWx1ZVJlZiBGbik7CisKK0xMVk1CYXNpY0Jsb2NrUmVmIExMVk1BcHBlbmRCYXNpY0Jsb2NrSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1CYXNpY0Jsb2NrUmVmIExMVk1JbnNlcnRCYXNpY0Jsb2NrSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQmFzaWNCbG9ja1JlZiBCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworCitMTFZNQmFzaWNCbG9ja1JlZiBMTFZNQXBwZW5kQmFzaWNCbG9jayhMTFZNVmFsdWVSZWYgRm4sIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTUJhc2ljQmxvY2tSZWYgTExWTUluc2VydEJhc2ljQmxvY2soTExWTUJhc2ljQmxvY2tSZWYgSW5zZXJ0QmVmb3JlQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK3ZvaWQgTExWTURlbGV0ZUJhc2ljQmxvY2soTExWTUJhc2ljQmxvY2tSZWYgQkIpOworCit2b2lkIExMVk1Nb3ZlQmFzaWNCbG9ja0JlZm9yZShMTFZNQmFzaWNCbG9ja1JlZiBCQiwgTExWTUJhc2ljQmxvY2tSZWYgTW92ZVBvcyk7Cit2b2lkIExMVk1Nb3ZlQmFzaWNCbG9ja0FmdGVyKExMVk1CYXNpY0Jsb2NrUmVmIEJCLCBMTFZNQmFzaWNCbG9ja1JlZiBNb3ZlUG9zKTsKKworLyogT3BlcmF0aW9ucyBvbiBpbnN0cnVjdGlvbnMgKi8KK0xMVk1CYXNpY0Jsb2NrUmVmIExMVk1HZXRJbnN0cnVjdGlvblBhcmVudChMTFZNVmFsdWVSZWYgSW5zdCk7CitMTFZNVmFsdWVSZWYgTExWTUdldEZpcnN0SW5zdHJ1Y3Rpb24oTExWTUJhc2ljQmxvY2tSZWYgQkIpOworTExWTVZhbHVlUmVmIExMVk1HZXRMYXN0SW5zdHJ1Y3Rpb24oTExWTUJhc2ljQmxvY2tSZWYgQkIpOworTExWTVZhbHVlUmVmIExMVk1HZXROZXh0SW5zdHJ1Y3Rpb24oTExWTVZhbHVlUmVmIEluc3QpOworTExWTVZhbHVlUmVmIExMVk1HZXRQcmV2aW91c0luc3RydWN0aW9uKExMVk1WYWx1ZVJlZiBJbnN0KTsKKworLyogT3BlcmF0aW9ucyBvbiBjYWxsIHNpdGVzICovCit2b2lkIExMVk1TZXRJbnN0cnVjdGlvbkNhbGxDb252KExMVk1WYWx1ZVJlZiBJbnN0ciwgdW5zaWduZWQgQ0MpOwordW5zaWduZWQgTExWTUdldEluc3RydWN0aW9uQ2FsbENvbnYoTExWTVZhbHVlUmVmIEluc3RyKTsKK3ZvaWQgTExWTUFkZEluc3RyQXR0cmlidXRlKExMVk1WYWx1ZVJlZiBJbnN0ciwgdW5zaWduZWQgaW5kZXgsIExMVk1BdHRyaWJ1dGUpOwordm9pZCBMTFZNUmVtb3ZlSW5zdHJBdHRyaWJ1dGUoTExWTVZhbHVlUmVmIEluc3RyLCB1bnNpZ25lZCBpbmRleCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQXR0cmlidXRlKTsKK3ZvaWQgTExWTVNldEluc3RyUGFyYW1BbGlnbm1lbnQoTExWTVZhbHVlUmVmIEluc3RyLCB1bnNpZ25lZCBpbmRleCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFsaWduKTsKKworLyogT3BlcmF0aW9ucyBvbiBjYWxsIGluc3RydWN0aW9ucyAob25seSkgKi8KK0xMVk1Cb29sIExMVk1Jc1RhaWxDYWxsKExMVk1WYWx1ZVJlZiBDYWxsSW5zdCk7Cit2b2lkIExMVk1TZXRUYWlsQ2FsbChMTFZNVmFsdWVSZWYgQ2FsbEluc3QsIExMVk1Cb29sIElzVGFpbENhbGwpOworCisvKiBPcGVyYXRpb25zIG9uIHBoaSBub2RlcyAqLwordm9pZCBMTFZNQWRkSW5jb21pbmcoTExWTVZhbHVlUmVmIFBoaU5vZGUsIExMVk1WYWx1ZVJlZiAqSW5jb21pbmdWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICBMTFZNQmFzaWNCbG9ja1JlZiAqSW5jb21pbmdCbG9ja3MsIHVuc2lnbmVkIENvdW50KTsKK3Vuc2lnbmVkIExMVk1Db3VudEluY29taW5nKExMVk1WYWx1ZVJlZiBQaGlOb2RlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0SW5jb21pbmdWYWx1ZShMTFZNVmFsdWVSZWYgUGhpTm9kZSwgdW5zaWduZWQgSW5kZXgpOworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldEluY29taW5nQmxvY2soTExWTVZhbHVlUmVmIFBoaU5vZGUsIHVuc2lnbmVkIEluZGV4KTsKKworLyo9PT0tLSBJbnN0cnVjdGlvbiBidWlsZGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworLyogQW4gaW5zdHJ1Y3Rpb24gYnVpbGRlciByZXByZXNlbnRzIGEgcG9pbnQgd2l0aGluIGEgYmFzaWMgYmxvY2ssIGFuZCBpcyB0aGUKKyAqIGV4Y2x1c2l2ZSBtZWFucyBvZiBidWlsZGluZyBpbnN0cnVjdGlvbnMgdXNpbmcgdGhlIEMgaW50ZXJmYWNlLgorICovCisKK0xMVk1CdWlsZGVyUmVmIExMVk1DcmVhdGVCdWlsZGVySW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMpOworTExWTUJ1aWxkZXJSZWYgTExWTUNyZWF0ZUJ1aWxkZXIodm9pZCk7Cit2b2lkIExMVk1Qb3NpdGlvbkJ1aWxkZXIoTExWTUJ1aWxkZXJSZWYgQnVpbGRlciwgTExWTUJhc2ljQmxvY2tSZWYgQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIEluc3RyKTsKK3ZvaWQgTExWTVBvc2l0aW9uQnVpbGRlckJlZm9yZShMTFZNQnVpbGRlclJlZiBCdWlsZGVyLCBMTFZNVmFsdWVSZWYgSW5zdHIpOwordm9pZCBMTFZNUG9zaXRpb25CdWlsZGVyQXRFbmQoTExWTUJ1aWxkZXJSZWYgQnVpbGRlciwgTExWTUJhc2ljQmxvY2tSZWYgQmxvY2spOworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldEluc2VydEJsb2NrKExMVk1CdWlsZGVyUmVmIEJ1aWxkZXIpOwordm9pZCBMTFZNQ2xlYXJJbnNlcnRpb25Qb3NpdGlvbihMTFZNQnVpbGRlclJlZiBCdWlsZGVyKTsKK3ZvaWQgTExWTUluc2VydEludG9CdWlsZGVyKExMVk1CdWlsZGVyUmVmIEJ1aWxkZXIsIExMVk1WYWx1ZVJlZiBJbnN0cik7Cit2b2lkIExMVk1JbnNlcnRJbnRvQnVpbGRlcldpdGhOYW1lKExMVk1CdWlsZGVyUmVmIEJ1aWxkZXIsIExMVk1WYWx1ZVJlZiBJbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7Cit2b2lkIExMVk1EaXNwb3NlQnVpbGRlcihMTFZNQnVpbGRlclJlZiBCdWlsZGVyKTsKKworLyogTWV0YWRhdGEgKi8KK3ZvaWQgTExWTVNldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKExMVk1CdWlsZGVyUmVmIEJ1aWxkZXIsIExMVk1WYWx1ZVJlZiBMKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0Q3VycmVudERlYnVnTG9jYXRpb24oTExWTUJ1aWxkZXJSZWYgQnVpbGRlcik7Cit2b2lkIExMVk1TZXRJbnN0RGVidWdMb2NhdGlvbihMTFZNQnVpbGRlclJlZiBCdWlsZGVyLCBMTFZNVmFsdWVSZWYgSW5zdCk7CisKKy8qIFRlcm1pbmF0b3JzICovCitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkUmV0Vm9pZChMTFZNQnVpbGRlclJlZik7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkUmV0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVik7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkQWdncmVnYXRlUmV0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgKlJldFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE4pOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEJyKExMVk1CdWlsZGVyUmVmLCBMTFZNQmFzaWNCbG9ja1JlZiBEZXN0KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRDb25kQnIoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBJZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJhc2ljQmxvY2tSZWYgVGhlbiwgTExWTUJhc2ljQmxvY2tSZWYgRWxzZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkU3dpdGNoKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJhc2ljQmxvY2tSZWYgRWxzZSwgdW5zaWduZWQgTnVtQ2FzZXMpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEluZGlyZWN0QnIoTExWTUJ1aWxkZXJSZWYgQiwgTExWTVZhbHVlUmVmIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1EZXN0cyk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkSW52b2tlKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiAqQXJncywgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJhc2ljQmxvY2tSZWYgVGhlbiwgTExWTUJhc2ljQmxvY2tSZWYgQ2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFVud2luZChMTFZNQnVpbGRlclJlZik7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkVW5yZWFjaGFibGUoTExWTUJ1aWxkZXJSZWYpOworCisvKiBBZGQgYSBjYXNlIHRvIHRoZSBzd2l0Y2ggaW5zdHJ1Y3Rpb24gKi8KK3ZvaWQgTExWTUFkZENhc2UoTExWTVZhbHVlUmVmIFN3aXRjaCwgTExWTVZhbHVlUmVmIE9uVmFsLAorICAgICAgICAgICAgICAgICBMTFZNQmFzaWNCbG9ja1JlZiBEZXN0KTsKKworLyogQWRkIGEgZGVzdGluYXRpb24gdG8gdGhlIGluZGlyZWN0YnIgaW5zdHJ1Y3Rpb24gKi8KK3ZvaWQgTExWTUFkZERlc3RpbmF0aW9uKExMVk1WYWx1ZVJlZiBJbmRpcmVjdEJyLCBMTFZNQmFzaWNCbG9ja1JlZiBEZXN0KTsKKworLyogQXJpdGhtZXRpYyAqLworTExWTVZhbHVlUmVmIExMVk1CdWlsZEFkZChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTlNXQWRkKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGROVVdBZGQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZBZGQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRTdWIoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZE5TV1N1YihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTlVXU3ViKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGU3ViKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTXVsKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGROU1dNdWwoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZE5VV011bChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkRk11bChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFVEaXYoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRTRGl2KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkRXhhY3RTRGl2KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGRGl2KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkVVJlbShMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFNSZW0oTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGUmVtKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkU2hsKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTFNocihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEFTaHIoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRBbmQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZE9yKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRYb3IoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEJpbk9wKExMVk1CdWlsZGVyUmVmIEIsIExMVk1PcGNvZGUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGROZWcoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWLCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGROU1dOZWcoTExWTUJ1aWxkZXJSZWYgQiwgTExWTVZhbHVlUmVmIFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZE5VV05lZyhMTFZNQnVpbGRlclJlZiBCLCBMTFZNVmFsdWVSZWYgViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkRk5lZyhMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFYsIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZE5vdChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFYsIGNvbnN0IGNoYXIgKk5hbWUpOworCisvKiBNZW1vcnkgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRNYWxsb2MoTExWTUJ1aWxkZXJSZWYsIExMVk1UeXBlUmVmIFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRBcnJheU1hbGxvYyhMTFZNQnVpbGRlclJlZiwgTExWTVR5cGVSZWYgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIFZhbCwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkQWxsb2NhKExMVk1CdWlsZGVyUmVmLCBMTFZNVHlwZVJlZiBUeSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkQXJyYXlBbGxvY2EoTExWTUJ1aWxkZXJSZWYsIExMVk1UeXBlUmVmIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBWYWwsIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZyZWUoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBQb2ludGVyVmFsKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRMb2FkKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgUG9pbnRlclZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFN0b3JlKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLCBMTFZNVmFsdWVSZWYgUHRyKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRHRVAoTExWTUJ1aWxkZXJSZWYgQiwgTExWTVZhbHVlUmVmIFBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiAqSW5kaWNlcywgdW5zaWduZWQgTnVtSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkSW5Cb3VuZHNHRVAoTExWTUJ1aWxkZXJSZWYgQiwgTExWTVZhbHVlUmVmIFBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmICpJbmRpY2VzLCB1bnNpZ25lZCBOdW1JbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFN0cnVjdEdFUChMTFZNQnVpbGRlclJlZiBCLCBMTFZNVmFsdWVSZWYgUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSWR4LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRHbG9iYWxTdHJpbmcoTExWTUJ1aWxkZXJSZWYgQiwgY29uc3QgY2hhciAqU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRHbG9iYWxTdHJpbmdQdHIoTExWTUJ1aWxkZXJSZWYgQiwgY29uc3QgY2hhciAqU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKKworLyogQ2FzdHMgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRUcnVuYyhMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFpFeHQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFNFeHQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZQVG9VSShMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGUFRvU0koTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1UeXBlUmVmIERlc3RUeSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkVUlUb0ZQKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFNJVG9GUChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGUFRydW5jKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGUEV4dChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFB0clRvSW50KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1UeXBlUmVmIERlc3RUeSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkSW50VG9QdHIoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRCaXRDYXN0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRaRXh0T3JCaXRDYXN0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRTRXh0T3JCaXRDYXN0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRUcnVuY09yQml0Q2FzdChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZENhc3QoTExWTUJ1aWxkZXJSZWYgQiwgTExWTU9wY29kZSBPcCwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1UeXBlUmVmIERlc3RUeSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkUG9pbnRlckNhc3QoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRJbnRDYXN0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLCAvKlNpZ25lZCBjYXN0ISovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZQQ2FzdChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKKworLyogQ29tcGFyaXNvbnMgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRJQ21wKExMVk1CdWlsZGVyUmVmLCBMTFZNSW50UHJlZGljYXRlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZDbXAoTExWTUJ1aWxkZXJSZWYsIExMVk1SZWFsUHJlZGljYXRlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworCisvKiBNaXNjZWxsYW5lb3VzIGluc3RydWN0aW9ucyAqLworTExWTVZhbHVlUmVmIExMVk1CdWlsZFBoaShMTFZNQnVpbGRlclJlZiwgTExWTVR5cGVSZWYgVHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZENhbGwoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiAqQXJncywgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFNlbGVjdChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIElmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgVGhlbiwgTExWTVZhbHVlUmVmIEVsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFZBQXJnKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTGlzdCwgTExWTVR5cGVSZWYgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkRXh0cmFjdEVsZW1lbnQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWZWNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIEluZGV4LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRJbnNlcnRFbGVtZW50KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmVjVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIEVsdFZhbCwgTExWTVZhbHVlUmVmIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkU2h1ZmZsZVZlY3RvcihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIFYyLCBMTFZNVmFsdWVSZWYgTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEV4dHJhY3RWYWx1ZShMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIEFnZ1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXgsIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEluc2VydFZhbHVlKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgQWdnVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBFbHRWYWwsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworCitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkSXNOdWxsKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRJc05vdE51bGwoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFB0ckRpZmYoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgUkhTLCBjb25zdCBjaGFyICpOYW1lKTsKKworCisvKj09PS0tIE1vZHVsZSBwcm92aWRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKiBDaGFuZ2VzIHRoZSB0eXBlIG9mIE0gc28gaXQgY2FuIGJlIHBhc3NlZCB0byBGdW5jdGlvblBhc3NNYW5hZ2VycyBhbmQgdGhlCisgKiBKSVQuICBUaGV5IHRha2UgTW9kdWxlUHJvdmlkZXJzIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuCisgKi8KK0xMVk1Nb2R1bGVQcm92aWRlclJlZgorTExWTUNyZWF0ZU1vZHVsZVByb3ZpZGVyRm9yRXhpc3RpbmdNb2R1bGUoTExWTU1vZHVsZVJlZiBNKTsKKworLyogRGVzdHJveXMgdGhlIG1vZHVsZSBNLgorICovCit2b2lkIExMVk1EaXNwb3NlTW9kdWxlUHJvdmlkZXIoTExWTU1vZHVsZVByb3ZpZGVyUmVmIE0pOworCisKKy8qPT09LS0gTWVtb3J5IGJ1ZmZlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK0xMVk1Cb29sIExMVk1DcmVhdGVNZW1vcnlCdWZmZXJXaXRoQ29udGVudHNPZkZpbGUoY29uc3QgY2hhciAqUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1lbW9yeUJ1ZmZlclJlZiAqT3V0TWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0TWVzc2FnZSk7CitMTFZNQm9vbCBMTFZNQ3JlYXRlTWVtb3J5QnVmZmVyV2l0aFNURElOKExMVk1NZW1vcnlCdWZmZXJSZWYgKk91dE1lbUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dE1lc3NhZ2UpOwordm9pZCBMTFZNRGlzcG9zZU1lbW9yeUJ1ZmZlcihMTFZNTWVtb3J5QnVmZmVyUmVmIE1lbUJ1Zik7CisKKworLyo9PT0tLSBQYXNzIE1hbmFnZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworLyoqIENvbnN0cnVjdHMgYSBuZXcgd2hvbGUtbW9kdWxlIHBhc3MgcGlwZWxpbmUuIFRoaXMgdHlwZSBvZiBwaXBlbGluZSBpcworICAgIHN1aXRhYmxlIGZvciBsaW5rLXRpbWUgb3B0aW1pemF0aW9uIGFuZCB3aG9sZS1tb2R1bGUgdHJhbnNmb3JtYXRpb25zLgorICAgIFNlZSBsbHZtOjpQYXNzTWFuYWdlcjo6UGFzc01hbmFnZXIuICovCitMTFZNUGFzc01hbmFnZXJSZWYgTExWTUNyZWF0ZVBhc3NNYW5hZ2VyKHZvaWQpOworCisvKiogQ29uc3RydWN0cyBhIG5ldyBmdW5jdGlvbi1ieS1mdW5jdGlvbiBwYXNzIHBpcGVsaW5lIG92ZXIgdGhlIG1vZHVsZQorICAgIHByb3ZpZGVyLiBJdCBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgbW9kdWxlIHByb3ZpZGVyLiBUaGlzIHR5cGUgb2YKKyAgICBwaXBlbGluZSBpcyBzdWl0YWJsZSBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCBKSVQgY29tcGlsYXRpb24gdGFza3MuCisgICAgU2VlIGxsdm06OkZ1bmN0aW9uUGFzc01hbmFnZXI6OkZ1bmN0aW9uUGFzc01hbmFnZXIuICovCitMTFZNUGFzc01hbmFnZXJSZWYgTExWTUNyZWF0ZUZ1bmN0aW9uUGFzc01hbmFnZXJGb3JNb2R1bGUoTExWTU1vZHVsZVJlZiBNKTsKKworLyoqIERlcHJlY2F0ZWQ6IFVzZSBMTFZNQ3JlYXRlRnVuY3Rpb25QYXNzTWFuYWdlckZvck1vZHVsZSBpbnN0ZWFkLiAqLworTExWTVBhc3NNYW5hZ2VyUmVmIExMVk1DcmVhdGVGdW5jdGlvblBhc3NNYW5hZ2VyKExMVk1Nb2R1bGVQcm92aWRlclJlZiBNUCk7CisKKy8qKiBJbml0aWFsaXplcywgZXhlY3V0ZXMgb24gdGhlIHByb3ZpZGVkIG1vZHVsZSwgYW5kIGZpbmFsaXplcyBhbGwgb2YgdGhlCisgICAgcGFzc2VzIHNjaGVkdWxlZCBpbiB0aGUgcGFzcyBtYW5hZ2VyLiBSZXR1cm5zIDEgaWYgYW55IG9mIHRoZSBwYXNzZXMKKyAgICBtb2RpZmllZCB0aGUgbW9kdWxlLCAwIG90aGVyd2lzZS4gU2VlIGxsdm06OlBhc3NNYW5hZ2VyOjpydW4oTW9kdWxlJikuICovCitMTFZNQm9vbCBMTFZNUnVuUGFzc01hbmFnZXIoTExWTVBhc3NNYW5hZ2VyUmVmIFBNLCBMTFZNTW9kdWxlUmVmIE0pOworCisvKiogSW5pdGlhbGl6ZXMgYWxsIG9mIHRoZSBmdW5jdGlvbiBwYXNzZXMgc2NoZWR1bGVkIGluIHRoZSBmdW5jdGlvbiBwYXNzCisgICAgbWFuYWdlci4gUmV0dXJucyAxIGlmIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVkIHRoZSBtb2R1bGUsIDAgb3RoZXJ3aXNlLgorICAgIFNlZSBsbHZtOjpGdW5jdGlvblBhc3NNYW5hZ2VyOjpkb0luaXRpYWxpemF0aW9uLiAqLworTExWTUJvb2wgTExWTUluaXRpYWxpemVGdW5jdGlvblBhc3NNYW5hZ2VyKExMVk1QYXNzTWFuYWdlclJlZiBGUE0pOworCisvKiogRXhlY3V0ZXMgYWxsIG9mIHRoZSBmdW5jdGlvbiBwYXNzZXMgc2NoZWR1bGVkIGluIHRoZSBmdW5jdGlvbiBwYXNzIG1hbmFnZXIKKyAgICBvbiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uIFJldHVybnMgMSBpZiBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllZCB0aGUKKyAgICBmdW5jdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIFNlZSBsbHZtOjpGdW5jdGlvblBhc3NNYW5hZ2VyOjpydW4oRnVuY3Rpb24mKS4gKi8KK0xMVk1Cb29sIExMVk1SdW5GdW5jdGlvblBhc3NNYW5hZ2VyKExMVk1QYXNzTWFuYWdlclJlZiBGUE0sIExMVk1WYWx1ZVJlZiBGKTsKKworLyoqIEZpbmFsaXplcyBhbGwgb2YgdGhlIGZ1bmN0aW9uIHBhc3NlcyBzY2hlZHVsZWQgaW4gaW4gdGhlIGZ1bmN0aW9uIHBhc3MKKyAgICBtYW5hZ2VyLiBSZXR1cm5zIDEgaWYgYW55IG9mIHRoZSBwYXNzZXMgbW9kaWZpZWQgdGhlIG1vZHVsZSwgMCBvdGhlcndpc2UuCisgICAgU2VlIGxsdm06OkZ1bmN0aW9uUGFzc01hbmFnZXI6OmRvRmluYWxpemF0aW9uLiAqLworTExWTUJvb2wgTExWTUZpbmFsaXplRnVuY3Rpb25QYXNzTWFuYWdlcihMTFZNUGFzc01hbmFnZXJSZWYgRlBNKTsKKworLyoqIEZyZWVzIHRoZSBtZW1vcnkgb2YgYSBwYXNzIHBpcGVsaW5lLiBGb3IgZnVuY3Rpb24gcGlwZWxpbmVzLCBkb2VzIG5vdCBmcmVlCisgICAgdGhlIG1vZHVsZSBwcm92aWRlci4KKyAgICBTZWUgbGx2bTo6UGFzc01hbmFnZXJCYXNlOjp+UGFzc01hbmFnZXJCYXNlLiAqLwordm9pZCBMTFZNRGlzcG9zZVBhc3NNYW5hZ2VyKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTWVtb3J5QnVmZmVyOworICBjbGFzcyBQYXNzTWFuYWdlckJhc2U7CisgIAorICAjZGVmaW5lIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlModHksIHJlZikgICBcCisgICAgaW5saW5lIHR5ICp1bndyYXAocmVmIFApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHR5Kj4oUCk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgcmVmIHdyYXAoY29uc3QgdHkgKlApIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8cmVmPihjb25zdF9jYXN0PHR5Kj4oUCkpOyBcCisgICAgfQorICAKKyAgI2RlZmluZSBERUZJTkVfSVNBX0NPTlZFUlNJT05fRlVOQ1RJT05TKHR5LCByZWYpICBcCisgICAgREVGSU5FX1NJTVBMRV9DT05WRVJTSU9OX0ZVTkNUSU9OUyh0eSwgcmVmKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIFQgKnVud3JhcChyZWYgUCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBjYXN0PFQ+KHVud3JhcChQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgCisgICNkZWZpbmUgREVGSU5FX1NURENYWF9DT05WRVJTSU9OX0ZVTkNUSU9OUyh0eSwgcmVmKSAgIFwKKyAgICBERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKHR5LCByZWYpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgVCAqdW53cmFwKHJlZiBQKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVCAqUSA9IChUKil1bndyYXAoUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhc3NlcnQoUSAmJiAiSW52YWxpZCBjYXN0ISIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBROyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgCisgIERFRklORV9JU0FfQ09OVkVSU0lPTl9GVU5DVElPTlMgICAoVHlwZSwgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiAgICAgICAgICApCisgIERFRklORV9JU0FfQ09OVkVSU0lPTl9GVU5DVElPTlMgICAoVmFsdWUsICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgICAgICAgICApCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoTW9kdWxlLCAgICAgICAgICAgICBMTFZNTW9kdWxlUmVmICAgICAgICApCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoQmFzaWNCbG9jaywgICAgICAgICBMTFZNQmFzaWNCbG9ja1JlZiAgICApCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoSVJCdWlsZGVyPD4sICAgICAgICBMTFZNQnVpbGRlclJlZiAgICAgICApCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoUEFUeXBlSG9sZGVyLCAgICAgICBMTFZNVHlwZUhhbmRsZVJlZiAgICApCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoTWVtb3J5QnVmZmVyLCAgICAgICBMTFZNTWVtb3J5QnVmZmVyUmVmICApCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoTExWTUNvbnRleHQsICAgICAgICBMTFZNQ29udGV4dFJlZiAgICAgICApCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoVXNlLCAgICAgICAgICAgICAgICBMTFZNVXNlUmVmICAgICAgICAgICApCisgIERFRklORV9TVERDWFhfQ09OVkVSU0lPTl9GVU5DVElPTlMoUGFzc01hbmFnZXJCYXNlLCAgICBMTFZNUGFzc01hbmFnZXJSZWYgICApCisgIC8qIExMVk1Nb2R1bGVQcm92aWRlclJlZiBleGlzdHMgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgYnV0IG5vdyBqdXN0IGhvbGRzIGEKKyAgICogTW9kdWxlLgorICAgKi8KKyAgaW5saW5lIE1vZHVsZSAqdW53cmFwKExMVk1Nb2R1bGVQcm92aWRlclJlZiBNUCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE1vZHVsZSo+KE1QKTsKKyAgfQorICAKKyAgI3VuZGVmIERFRklORV9TVERDWFhfQ09OVkVSU0lPTl9GVU5DVElPTlMKKyAgI3VuZGVmIERFRklORV9JU0FfQ09OVkVSU0lPTl9GVU5DVElPTlMKKyAgI3VuZGVmIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMKKworICAvKiBTcGVjaWFsaXplZCBvcGFxdWUgY29udGV4dCBjb252ZXJzaW9ucy4KKyAgICovCisgIGlubGluZSBMTFZNQ29udGV4dCAqKnVud3JhcChMTFZNQ29udGV4dFJlZiogVHlzKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TExWTUNvbnRleHQqKj4oVHlzKTsKKyAgfQorICAKKyAgaW5saW5lIExMVk1Db250ZXh0UmVmICp3cmFwKGNvbnN0IExMVk1Db250ZXh0ICoqVHlzKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TExWTUNvbnRleHRSZWYqPihjb25zdF9jYXN0PExMVk1Db250ZXh0Kio+KFR5cykpOworICB9CisgIAorICAvKiBTcGVjaWFsaXplZCBvcGFxdWUgdHlwZSBjb252ZXJzaW9ucy4KKyAgICovCisgIGlubGluZSBUeXBlICoqdW53cmFwKExMVk1UeXBlUmVmKiBUeXMpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUeXBlKio+KFR5cyk7CisgIH0KKyAgCisgIGlubGluZSBMTFZNVHlwZVJlZiAqd3JhcChjb25zdCBUeXBlICoqVHlzKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TExWTVR5cGVSZWYqPihjb25zdF9jYXN0PFR5cGUqKj4oVHlzKSk7CisgIH0KKyAgCisgIC8qIFNwZWNpYWxpemVkIG9wYXF1ZSB2YWx1ZSBjb252ZXJzaW9ucy4KKyAgICovIAorICBpbmxpbmUgVmFsdWUgKip1bndyYXAoTExWTVZhbHVlUmVmICpWYWxzKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmFsdWUqKj4oVmFscyk7CisgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSBUICoqdW53cmFwKExMVk1WYWx1ZVJlZiAqVmFscywgdW5zaWduZWQgTGVuZ3RoKSB7CisgICAgI2lmIERFQlVHCisgICAgZm9yIChMTFZNVmFsdWVSZWYgKkkgPSBWYWxzLCAqRSA9IFZhbHMgKyBMZW5ndGg7IEkgIT0gRTsgKytJKQorICAgICAgY2FzdDxUPigqSSk7CisgICAgI2VuZGlmCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCoqPihWYWxzKTsKKyAgfQorICAKKyAgaW5saW5lIExMVk1WYWx1ZVJlZiAqd3JhcChjb25zdCBWYWx1ZSAqKlZhbHMpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxMTFZNVmFsdWVSZWYqPihjb25zdF9jYXN0PFZhbHVlKio+KFZhbHMpKTsKKyAgfQorfQorCisjZW5kaWYgLyogIWRlZmluZWQoX19jcGx1c3BsdXMpICovCisKKyNlbmRpZiAvKiAhZGVmaW5lZChMTFZNX0NfQ09SRV9IKSAqLwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtLWMvRW5oYW5jZWREaXNhc3NlbWJseS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtLWMvRW5oYW5jZWREaXNhc3NlbWJseS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzczODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9FbmhhbmNlZERpc2Fzc2VtYmx5LmgKQEAgLTAsMCArMSw1MTMgQEAKKy8qPT09LS0gbGx2bS1jL0VuaGFuY2VkRGlzYXNzZW1ibHkuaCAtIERpc2Fzc2VtYmxlciBDIEludGVyZmFjZSAtLS0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byBFbmhhbmNlZERpc2Fzc2VtYmx5LnNvLCB3aGljaCAgICAgICp8Cit8KiBpbXBsZW1lbnRzIGEgZGlzYXNzZW1ibGVyIHdpdGggdGhlIGFiaWxpdHkgdG8gZXh0cmFjdCBvcGVyYW5kIHZhbHVlcyBhbmQgICAqfAorfCogaW5kaXZpZHVhbCB0b2tlbnMgZnJvbSBhc3NlbWJseSBpbnN0cnVjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGUgaGVhZGVyIGRlY2xhcmVzIGFkZGl0aW9uYWwgaW50ZXJmYWNlcyBpZiB0aGUgaG9zdCBjb21waWxlciBzdXBwb3J0cyAgICAqfAorfCogdGhlIGJsb2NrcyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19FTkhBTkNFRERJU0FTU0VNQkxZX0gKKyNkZWZpbmUgTExWTV9DX0VOSEFOQ0VERElTQVNTRU1CTFlfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyohCisgQHR5cGVkZWYgRURCeXRlUmVhZGVyQ2FsbGJhY2sKKyBJbnRlcmZhY2UgdG8gbWVtb3J5IGZyb20gd2hpY2ggaW5zdHJ1Y3Rpb25zIG1heSBiZSByZWFkLgorIEBwYXJhbSBieXRlIEEgcG9pbnRlciB3aG9zZSB0YXJnZXQgc2hvdWxkIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBkYXRhIHJldHVybmVkLgorIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIHRvIGJlIHJlYWQuCisgQHBhcmFtIGFyZyBBbiBhbm9ueW1vdXMgYXJndW1lbnQgZm9yIGNsaWVudCB1c2UuCisgQHJlc3VsdCAwIG9uIHN1Y2Nlc3M7IC0xIG90aGVyd2lzZS4KKyAqLwordHlwZWRlZiBpbnQgKCpFREJ5dGVSZWFkZXJDYWxsYmFjaykodWludDhfdCAqYnl0ZSwgdWludDY0X3QgYWRkcmVzcywgdm9pZCAqYXJnKTsKKworLyohCisgQHR5cGVkZWYgRURSZWdpc3RlclJlYWRlckNhbGxiYWNrCisgSW50ZXJmYWNlIHRvIHJlZ2lzdGVycyBmcm9tIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgcmVhZC4KKyBAcGFyYW0gdmFsdWUgQSBwb2ludGVyIHdob3NlIHRhcmdldCBzaG91bGQgYmUgZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIG9mIHRoZQorICAgcmVnaXN0ZXIuCisgQHBhcmFtIHJlZ0lEIFRoZSBMTFZNIHJlZ2lzdGVyIGlkZW50aWZpZXIgZm9yIHRoZSByZWdpc3RlciB0byByZWFkLgorIEBwYXJhbSBhcmcgQW4gYW5vbnltb3VzIGFyZ3VtZW50IGZvciBjbGllbnQgdXNlLgorIEByZXN1bHQgMCBpZiB0aGUgcmVnaXN0ZXIgY291bGQgYmUgcmVhZDsgLTEgb3RoZXJ3aXNlLgorICovCit0eXBlZGVmIGludCAoKkVEUmVnaXN0ZXJSZWFkZXJDYWxsYmFjaykodWludDY0X3QgKnZhbHVlLCB1bnNpZ25lZCByZWdJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJnKTsKKworLyohCisgQHR5cGVkZWYgRURBc3NlbWJseVN5bnRheF90CisgQW4gYXNzZW1ibHkgc3ludGF4IGZvciB1c2UgaW4gdG9rZW5pemluZyBpbnN0cnVjdGlvbnMuCisgKi8KK2VudW0geworLyohIEBjb25zdGFudCBrRURBc3NlbWJseVN5bnRheFg4NkludGVsIEludGVsIHN5bnRheCBmb3IgaTM4NiBhbmQgeDg2XzY0LiAqLworICBrRURBc3NlbWJseVN5bnRheFg4NkludGVsICA9IDAsCisvKiEgQGNvbnN0YW50IGtFREFzc2VtYmx5U3ludGF4WDg2QVRUIEFUJlQgc3ludGF4IGZvciBpMzg2IGFuZCB4ODZfNjQuICovCisgIGtFREFzc2VtYmx5U3ludGF4WDg2QVRUICAgID0gMSwKKyAga0VEQXNzZW1ibHlTeW50YXhBUk1VQUwgICAgPSAyCit9OwordHlwZWRlZiB1bnNpZ25lZCBFREFzc2VtYmx5U3ludGF4X3Q7CisKKy8qIQorIEB0eXBlZGVmIEVERGlzYXNzZW1ibGVyUmVmCisgRW5jYXBzdWxhdGVzIGEgZGlzYXNzZW1ibGVyIGZvciBhIHNpbmdsZSBDUFUgYXJjaGl0ZWN0dXJlLgorICovCit0eXBlZGVmIHZvaWQgKkVERGlzYXNzZW1ibGVyUmVmOworCisvKiEKKyBAdHlwZWRlZiBFREluc3RSZWYKKyBFbmNhcHN1bGF0ZXMgYSBzaW5nbGUgZGlzYXNzZW1ibGVkIGluc3RydWN0aW9uIGluIG9uZSBhc3NlbWJseSBzeW50YXguCisgKi8KK3R5cGVkZWYgdm9pZCAqRURJbnN0UmVmOworCisvKiEKKyBAdHlwZWRlZiBFRFRva2VuUmVmCisgRW5jYXBzdWxhdGVzIGEgdG9rZW4gZnJvbSB0aGUgZGlzYXNzZW1ibHkgb2YgYW4gaW5zdHJ1Y3Rpb24uCisgKi8KK3R5cGVkZWYgdm9pZCAqRURUb2tlblJlZjsKKworLyohCisgQHR5cGVkZWYgRURPcGVyYW5kUmVmCisgRW5jYXBzdWxhdGVzIGFuIG9wZXJhbmQgb2YgYW4gaW5zdHJ1Y3Rpb24uCisgKi8KK3R5cGVkZWYgdm9pZCAqRURPcGVyYW5kUmVmOworICAKKy8qIQorIEBmdW5jdGlvbmdyb3VwIEdldHRpbmcgYSBkaXNhc3NlbWJsZXIKKyAqLworCisvKiEKKyBAZnVuY3Rpb24gRURHZXREaXNhc3NlbWJsZXIKKyBHZXRzIHRoZSBkaXNhc3NlbWJsZXIgZm9yIGEgZ2l2ZW4gdGFyZ2V0LgorIEBwYXJhbSBkaXNhc3NlbWJsZXIgQSBwb2ludGVyIHdob3NlIHRhcmdldCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSAKKyAgIGRpc2Fzc2VtYmxlci4KKyBAcGFyYW0gdHJpcGxlIElkZW50aWZpZXMgdGhlIHRhcmdldC4gIEV4YW1wbGU6ICJ4ODZfNjQtYXBwbGUtZGFyd2luMTAiCisgQHBhcmFtIHN5bnRheCBUaGUgYXNzZW1ibHkgc3ludGF4IHRvIHVzZSB3aGVuIGRlY29kaW5nIGluc3RydWN0aW9ucy4KKyBAcmVzdWx0IDAgb24gc3VjY2VzczsgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgRURHZXREaXNhc3NlbWJsZXIoRUREaXNhc3NlbWJsZXJSZWYgKmRpc2Fzc2VtYmxlciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0cmlwbGUsCisgICAgICAgICAgICAgICAgICAgICAgRURBc3NlbWJseVN5bnRheF90IHN5bnRheCk7CisKKy8qIQorIEBmdW5jdGlvbmdyb3VwIEdlbmVyaWMgYXJjaGl0ZWN0dXJhbCBxdWVyaWVzCisgKi8KKyAgCisvKiEKKyBAZnVuY3Rpb24gRURHZXRSZWdpc3Rlck5hbWUKKyBHZXRzIHRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciBhIGdpdmVuIHJlZ2lzdGVyLgorIEBwYXJhbSByZWdOYW1lIEEgcG9pbnRlciB3aG9zZSB0YXJnZXQgd2lsbCBiZSBwb2ludGVkIGF0IHRoZSBuYW1lIG9mIHRoZQorICAgcmVnaXN0ZXIuICBUaGUgbmFtZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlYWxsb2NhdGVkIGFuZCB3aWxsIGJlIAorIEBwYXJhbSBkaXNhc3NlbWJsZXIgVGhlIGRpc2Fzc2VtYmxlciB0byBxdWVyeSBmb3IgdGhlIG5hbWUuCisgQHBhcmFtIHJlZ0lEIFRoZSByZWdpc3RlciBpZGVudGlmaWVyLCBhcyByZXR1cm5lZCBieSBFRFJlZ2lzdGVyVG9rZW5WYWx1ZS4KKyBAcmVzdWx0IDAgb24gc3VjY2VzczsgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgRURHZXRSZWdpc3Rlck5hbWUoY29uc3QgY2hhcioqIHJlZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRUREaXNhc3NlbWJsZXJSZWYgZGlzYXNzZW1ibGVyLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlZ0lEKTsKKyAgCisvKiEKKyBAZnVuY3Rpb24gRURSZWdpc3RlcklzU3RhY2tQb2ludGVyCisgRGV0ZXJtaW5lcyBpZiBhIHJlZ2lzdGVyIGlzIG9uZSBvZiB0aGUgcGxhdGZvcm0ncyBzdGFjay1wb2ludGVyIHJlZ2lzdGVycy4KKyBAcGFyYW0gZGlzYXNzZW1ibGVyIFRoZSBkaXNhc3NlbWJsZXIgdG8gcXVlcnkuCisgQHBhcmFtIHJlZ0lEIFRoZSByZWdpc3RlciBpZGVudGlmaWVyLCBhcyByZXR1cm5lZCBieSBFRFJlZ2lzdGVyVG9rZW5WYWx1ZS4KKyBAcmVzdWx0IDEgaWYgdHJ1ZTsgMCBvdGhlcndpc2UuCisgKi8KK2ludCBFRFJlZ2lzdGVySXNTdGFja1BvaW50ZXIoRUREaXNhc3NlbWJsZXJSZWYgZGlzYXNzZW1ibGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZWdJRCk7CisKKy8qIQorIEBmdW5jdGlvbiBFRFJlZ2lzdGVySXNQcm9ncmFtQ291bnRlcgorIERldGVybWluZXMgaWYgYSByZWdpc3RlciBpcyBvbmUgb2YgdGhlIHBsYXRmb3JtJ3Mgc3RhY2stcG9pbnRlciByZWdpc3RlcnMuCisgQHBhcmFtIGRpc2Fzc2VtYmxlciBUaGUgZGlzYXNzZW1ibGVyIHRvIHF1ZXJ5LgorIEBwYXJhbSByZWdJRCBUaGUgcmVnaXN0ZXIgaWRlbnRpZmllciwgYXMgcmV0dXJuZWQgYnkgRURSZWdpc3RlclRva2VuVmFsdWUuCisgQHJlc3VsdCAxIGlmIHRydWU7IDAgb3RoZXJ3aXNlLgorICovCitpbnQgRURSZWdpc3RlcklzUHJvZ3JhbUNvdW50ZXIoRUREaXNhc3NlbWJsZXJSZWYgZGlzYXNzZW1ibGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlZ0lEKTsKKyAgCisvKiEKKyBAZnVuY3Rpb25ncm91cCBDcmVhdGluZyBhbmQgcXVlcnlpbmcgaW5zdHJ1Y3Rpb25zCisgKi8KKyAgCisvKiEKKyBAZnVuY3Rpb24gRURDcmVhdGVJbnN0CisgR2V0cyBhIHNldCBvZiBjb250aWd1b3VzIGluc3RydWN0aW9ucyBmcm9tIGEgZGlzYXNzZW1ibGVyLgorIEBwYXJhbSBpbnN0cyBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgdGhhdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZQorICAgaW5zdHJ1Y3Rpb25zLiAgTXVzdCBoYXZlIGF0IGxlYXN0IGNvdW50IGVudHJpZXMuICBFbnRyaWVzIG5vdCBmaWxsZWQgaW4gd2lsbCAKKyAgIGJlIHNldCB0byBOVUxMLgorIEBwYXJhbSBjb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRvIGZpbGwgaW4uCisgQHBhcmFtIGRpc2Fzc2VtYmxlciBUaGUgZGlzYXNzZW1ibGVyIHRvIHVzZSB3aGVuIGRlY29kaW5nIHRoZSBpbnN0cnVjdGlvbnMuCisgQHBhcmFtIGJ5dGVSZWFkZXIgVGhlIGZ1bmN0aW9uIHRvIHVzZSB3aGVuIHJlYWRpbmcgdGhlIGluc3RydWN0aW9uJ3MgbWFjaGluZQorICAgY29kZS4KKyBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgQHBhcmFtIGFyZyBBbiBhbm9ueW1vdXMgYXJndW1lbnQgdG8gYmUgcGFzc2VkIHRvIGJ5dGVSZWFkZXIuCisgQHJlc3VsdCBUaGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyByZWFkIG9uIHN1Y2Nlc3M7IDAgb3RoZXJ3aXNlLgorICovCit1bnNpZ25lZCBpbnQgRURDcmVhdGVJbnN0cyhFREluc3RSZWYgKmluc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUREaXNhc3NlbWJsZXJSZWYgZGlzYXNzZW1ibGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRURCeXRlUmVhZGVyQ2FsbGJhY2sgYnl0ZVJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCisvKiEKKyBAZnVuY3Rpb24gRURSZWxlYXNlSW5zdAorIEZyZWVzIHRoZSBtZW1vcnkgZm9yIGFuIGluc3RydWN0aW9uLiAgVGhlIGluc3RydWN0aW9uIGNhbiBubyBsb25nZXIgYmUgYWNjZXNzZWQKKyBhZnRlciB0aGlzIGNhbGwuCisgQHBhcmFtIGluc3QgVGhlIGluc3RydWN0aW9uIHRvIGJlIGZyZWVkLgorICovCit2b2lkIEVEUmVsZWFzZUluc3QoRURJbnN0UmVmIGluc3QpOworCisvKiEKKyBAZnVuY3Rpb24gRURJbnN0Qnl0ZVNpemUKKyBAcGFyYW0gaW5zdCBUaGUgaW5zdHJ1Y3Rpb24gdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGluc3RydWN0aW9uJ3MgbWFjaGluZS1jb2RlIHJlcHJlc2VudGF0aW9uLgorICovCitpbnQgRURJbnN0Qnl0ZVNpemUoRURJbnN0UmVmIGluc3QpOworCisvKiEKKyBAZnVuY3Rpb24gRURHZXRJbnN0U3RyaW5nCisgR2V0cyB0aGUgZGlzYXNzZW1ibGVkIHRleHQgZXF1aXZhbGVudCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgQHBhcmFtIGJ1ZiBBIHBvaW50ZXIgd2hvc2UgdGFyZ2V0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggYSBwb2ludGVyIHRvIHRoZQorICAgc3RyaW5nLiAgKFRoZSBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIHdoZW4gdGhlIGluc3RydWN0aW9uIGlzIHJlbGVhc2VkLikKKyBAcGFyYW0gaW5zdCBUaGUgaW5zdHJ1Y3Rpb24gdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IDAgb24gc3VjY2VzczsgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgRURHZXRJbnN0U3RyaW5nKGNvbnN0IGNoYXIgKipidWYsCisgICAgICAgICAgICAgICAgICAgIEVESW5zdFJlZiBpbnN0KTsKKworLyohCisgQGZ1bmN0aW9uIEVESW5zdElECisgQHBhcmFtIGluc3RJRCBBIHBvaW50ZXIgd2hvc2UgdGFyZ2V0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlIExMVk0gaWRlbnRpZmllcgorICAgZm9yIHRoZSBpbnN0cnVjdGlvbi4KKyBAcGFyYW0gaW5zdCBUaGUgaW5zdHJ1Y3Rpb24gdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IDAgb24gc3VjY2VzczsgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgRURJbnN0SUQodW5zaWduZWQgKmluc3RJRCwgRURJbnN0UmVmIGluc3QpOworICAKKy8qIQorIEBmdW5jdGlvbiBFREluc3RJc0JyYW5jaAorIEBwYXJhbSBpbnN0IFRoZSBpbnN0cnVjdGlvbiB0byBiZSBxdWVyaWVkLgorIEByZXN1bHQgMSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggaW5zdHJ1Y3Rpb247IDAgaWYgaXQgaXMgc29tZSBvdGhlcgorICAgdHlwZSBvZiBpbnN0cnVjdGlvbjsgLTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorICovCitpbnQgRURJbnN0SXNCcmFuY2goRURJbnN0UmVmIGluc3QpOworCisvKiEKKyBAZnVuY3Rpb24gRURJbnN0SXNNb3ZlCisgQHBhcmFtIGluc3QgVGhlIGluc3RydWN0aW9uIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCAxIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIG1vdmUgaW5zdHJ1Y3Rpb247IDAgaWYgaXQgaXMgc29tZSBvdGhlcgorICAgdHlwZSBvZiBpbnN0cnVjdGlvbjsgLTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorICovCitpbnQgRURJbnN0SXNNb3ZlKEVESW5zdFJlZiBpbnN0KTsKKworLyohCisgQGZ1bmN0aW9uIEVEQnJhbmNoVGFyZ2V0SUQKKyBAcGFyYW0gaW5zdCBUaGUgaW5zdHJ1Y3Rpb24gdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IFRoZSBJRCBvZiB0aGUgYnJhbmNoIHRhcmdldCBvcGVyYW5kLCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggCisgICBFRENvcHlPcGVyYW5kLiAgLTEgaWYgbm8gc3VjaCBvcGVyYW5kIGV4aXN0cy4KKyAqLworaW50IEVEQnJhbmNoVGFyZ2V0SUQoRURJbnN0UmVmIGluc3QpOworCisvKiEKKyBAZnVuY3Rpb24gRURNb3ZlU291cmNlSUQKKyBAcGFyYW0gaW5zdCBUaGUgaW5zdHJ1Y3Rpb24gdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IFRoZSBJRCBvZiB0aGUgbW92ZSBzb3VyY2Ugb3BlcmFuZCwgc3VpdGFibGUgZm9yIHVzZSB3aXRoIAorICAgRURDb3B5T3BlcmFuZC4gIC0xIGlmIG5vIHN1Y2ggb3BlcmFuZCBleGlzdHMuCisgKi8KK2ludCBFRE1vdmVTb3VyY2VJRChFREluc3RSZWYgaW5zdCk7CisKKy8qIQorIEBmdW5jdGlvbiBFRE1vdmVUYXJnZXRJRAorIEBwYXJhbSBpbnN0IFRoZSBpbnN0cnVjdGlvbiB0byBiZSBxdWVyaWVkLgorIEByZXN1bHQgVGhlIElEIG9mIHRoZSBtb3ZlIHNvdXJjZSBvcGVyYW5kLCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggCisgICBFRENvcHlPcGVyYW5kLiAgLTEgaWYgbm8gc3VjaCBvcGVyYW5kIGV4aXN0cy4KKyAqLworaW50IEVETW92ZVRhcmdldElEKEVESW5zdFJlZiBpbnN0KTsKKworLyohCisgQGZ1bmN0aW9uZ3JvdXAgQ3JlYXRpbmcgYW5kIHF1ZXJ5aW5nIHRva2VucworICovCisgIAorLyohCisgQGZ1bmN0aW9uIEVETnVtVG9rZW5zCisgQHBhcmFtIGluc3QgVGhlIGluc3RydWN0aW9uIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCBUaGUgbnVtYmVyIG9mIHRva2VucyBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG9yIC0xIG9uIGVycm9yLgorICovCitpbnQgRUROdW1Ub2tlbnMoRURJbnN0UmVmIGluc3QpOworCisvKiEKKyBAZnVuY3Rpb24gRURHZXRUb2tlbgorIFJldHJpZXZlcyBhIHRva2VuIGZyb20gYW4gaW5zdHJ1Y3Rpb24uICBUaGUgdG9rZW4gaXMgdmFsaWQgdW50aWwgdGhlCisgaW5zdHJ1Y3Rpb24gaXMgcmVsZWFzZWQuCisgQHBhcmFtIHRva2VuIEEgcG9pbnRlciB0byBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgdG9rZW4uCisgQHBhcmFtIGluc3QgVGhlIGluc3RydWN0aW9uIHRvIGJlIHF1ZXJpZWQuCisgQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgdG9rZW4gaW4gdGhlIGluc3RydWN0aW9uLgorIEByZXN1bHQgMCBvbiBzdWNjZXNzOyAtMSBvdGhlcndpc2UuCisgKi8KK2ludCBFREdldFRva2VuKEVEVG9rZW5SZWYgKnRva2VuLAorICAgICAgICAgICAgICAgRURJbnN0UmVmIGluc3QsCisgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworICAKKy8qIQorIEBmdW5jdGlvbiBFREdldFRva2VuU3RyaW5nCisgR2V0cyB0aGUgZGlzYXNzZW1ibGVkIHRleHQgZm9yIGEgdG9rZW4uCisgQHBhcmFtIGJ1ZiBBIHBvaW50ZXIgd2hvc2UgdGFyZ2V0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggYSBwb2ludGVyIHRvIHRoZQorICAgc3RyaW5nLiAgKFRoZSBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIHdoZW4gdGhlIHRva2VuIGlzIHJlbGVhc2VkLikKKyBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCAwIG9uIHN1Y2Nlc3M7IC0xIG90aGVyd2lzZS4KKyAqLworaW50IEVER2V0VG9rZW5TdHJpbmcoY29uc3QgY2hhciAqKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIEVEVG9rZW5SZWYgdG9rZW4pOworCisvKiEKKyBAZnVuY3Rpb24gRURPcGVyYW5kSW5kZXhGb3JUb2tlbgorIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBvcGVyYW5kIHRvIHdoaWNoIGEgdG9rZW4gYmVsb25ncy4KKyBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCBUaGUgb3BlcmFuZCBpbmRleCBvbiBzdWNjZXNzOyAtMSBvdGhlcndpc2UKKyAqLworaW50IEVET3BlcmFuZEluZGV4Rm9yVG9rZW4oRURUb2tlblJlZiB0b2tlbik7CisKKy8qIQorIEBmdW5jdGlvbiBFRFRva2VuSXNXaGl0ZXNwYWNlCisgQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBiZSBxdWVyaWVkLgorIEByZXN1bHQgMSBpZiB0aGUgdG9rZW4gaXMgd2hpdGVzcGFjZTsgMCBpZiBub3Q7IC0xIG9uIGVycm9yLgorICovCitpbnQgRURUb2tlbklzV2hpdGVzcGFjZShFRFRva2VuUmVmIHRva2VuKTsKKyAgCisvKiEKKyBAZnVuY3Rpb24gRURUb2tlbklzUHVuY3R1YXRpb24KKyBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCAxIGlmIHRoZSB0b2tlbiBpcyBwdW5jdHVhdGlvbjsgMCBpZiBub3Q7IC0xIG9uIGVycm9yLgorICovCitpbnQgRURUb2tlbklzUHVuY3R1YXRpb24oRURUb2tlblJlZiB0b2tlbik7CisKKy8qIQorIEBmdW5jdGlvbiBFRFRva2VuSXNPcGNvZGUKKyBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCAxIGlmIHRoZSB0b2tlbiBpcyBvcGNvZGU7IDAgaWYgbm90OyAtMSBvbiBlcnJvci4KKyAqLworaW50IEVEVG9rZW5Jc09wY29kZShFRFRva2VuUmVmIHRva2VuKTsKKworLyohCisgQGZ1bmN0aW9uIEVEVG9rZW5Jc0xpdGVyYWwKKyBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCAxIGlmIHRoZSB0b2tlbiBpcyBhIG51bWVyaWMgbGl0ZXJhbDsgMCBpZiBub3Q7IC0xIG9uIGVycm9yLgorICovCitpbnQgRURUb2tlbklzTGl0ZXJhbChFRFRva2VuUmVmIHRva2VuKTsKKworLyohCisgQGZ1bmN0aW9uIEVEVG9rZW5Jc1JlZ2lzdGVyCisgQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBiZSBxdWVyaWVkLgorIEByZXN1bHQgMSBpZiB0aGUgdG9rZW4gaWRlbnRpZmllcyBhIHJlZ2lzdGVyOyAwIGlmIG5vdDsgLTEgb24gZXJyb3IuCisgKi8KK2ludCBFRFRva2VuSXNSZWdpc3RlcihFRFRva2VuUmVmIHRva2VuKTsKKworLyohCisgQGZ1bmN0aW9uIEVEVG9rZW5Jc05lZ2F0aXZlTGl0ZXJhbAorIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IDEgaWYgdGhlIHRva2VuIGlzIGEgbmVnYXRpdmUgc2lnbmVkIGxpdGVyYWw7IDAgaWYgbm90OyAtMSBvbiBlcnJvci4KKyAqLworaW50IEVEVG9rZW5Jc05lZ2F0aXZlTGl0ZXJhbChFRFRva2VuUmVmIHRva2VuKTsKKworLyohCisgQGZ1bmN0aW9uIEVETGl0ZXJhbFRva2VuQWJzb2x1dGVWYWx1ZQorIEBwYXJhbSB2YWx1ZSBBIHBvaW50ZXIgd2hvc2UgdGFyZ2V0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlIGFic29sdXRlIHZhbHVlCisgICBvZiB0aGUgbGl0ZXJhbC4KKyBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCAwIG9uIHN1Y2Nlc3M7IC0xIG90aGVyd2lzZS4KKyAqLworaW50IEVETGl0ZXJhbFRva2VuQWJzb2x1dGVWYWx1ZSh1aW50NjRfdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEVG9rZW5SZWYgdG9rZW4pOworCisvKiEKKyBAZnVuY3Rpb24gRURSZWdpc3RlclRva2VuVmFsdWUKKyBAcGFyYW0gcmVnaXN0ZXJJRCBBIHBvaW50ZXIgd2hvc2UgdGFyZ2V0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlIExMVk0gCisgICByZWdpc3RlciBpZGVudGlmaWVyIGZvciB0aGUgdG9rZW4uCisgQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBiZSBxdWVyaWVkLgorIEByZXN1bHQgMCBvbiBzdWNjZXNzOyAtMSBvdGhlcndpc2UuCisgKi8KK2ludCBFRFJlZ2lzdGVyVG9rZW5WYWx1ZSh1bnNpZ25lZCAqcmVnaXN0ZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFRFRva2VuUmVmIHRva2VuKTsKKyAgCisvKiEKKyBAZnVuY3Rpb25ncm91cCBDcmVhdGluZyBhbmQgcXVlcnlpbmcgb3BlcmFuZHMKKyAqLworICAKKy8qIQorIEBmdW5jdGlvbiBFRE51bU9wZXJhbmRzCisgQHBhcmFtIGluc3QgVGhlIGluc3RydWN0aW9uIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCBUaGUgbnVtYmVyIG9mIG9wZXJhbmRzIGluIHRoZSBpbnN0cnVjdGlvbiwgb3IgLTEgb24gZXJyb3IuCisgKi8KK2ludCBFRE51bU9wZXJhbmRzKEVESW5zdFJlZiBpbnN0KTsKKworLyohCisgQGZ1bmN0aW9uIEVER2V0T3BlcmFuZAorIFJldHJpZXZlcyBhbiBvcGVyYW5kIGZyb20gYW4gaW5zdHJ1Y3Rpb24uICBUaGUgb3BlcmFuZCBpcyB2YWxpZCB1bnRpbCB0aGUKKyBpbnN0cnVjdGlvbiBpcyByZWxlYXNlZC4KKyBAcGFyYW0gb3BlcmFuZCBBIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIHdpdGggdGhlIG9wZXJhbmQuCisgQHBhcmFtIGluc3QgVGhlIGluc3RydWN0aW9uIHRvIGJlIHF1ZXJpZWQuCisgQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgb3BlcmFuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCisgQHJlc3VsdCAwIG9uIHN1Y2Nlc3M7IC0xIG90aGVyd2lzZS4KKyAqLworaW50IEVER2V0T3BlcmFuZChFRE9wZXJhbmRSZWYgKm9wZXJhbmQsCisgICAgICAgICAgICAgICAgIEVESW5zdFJlZiBpbnN0LAorICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworICAKKy8qIQorIEBmdW5jdGlvbiBFRE9wZXJhbmRJc1JlZ2lzdGVyCisgQHBhcmFtIG9wZXJhbmQgVGhlIG9wZXJhbmQgdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IDEgaWYgdGhlIG9wZXJhbmQgbmFtZXMgYSByZWdpc3RlcjsgMCBpZiBub3Q7IC0xIG9uIGVycm9yLgorICovCitpbnQgRURPcGVyYW5kSXNSZWdpc3RlcihFRE9wZXJhbmRSZWYgb3BlcmFuZCk7CisKKy8qIQorIEBmdW5jdGlvbiBFRE9wZXJhbmRJc0ltbWVkaWF0ZQorIEBwYXJhbSBvcGVyYW5kIFRoZSBvcGVyYW5kIHRvIGJlIHF1ZXJpZWQuCisgQHJlc3VsdCAxIGlmIHRoZSBvcGVyYW5kIHNwZWNpZmllcyBhbiBpbW1lZGlhdGUgdmFsdWU7IDAgaWYgbm90OyAtMSBvbiBlcnJvci4KKyAqLworaW50IEVET3BlcmFuZElzSW1tZWRpYXRlKEVET3BlcmFuZFJlZiBvcGVyYW5kKTsKKworLyohCisgQGZ1bmN0aW9uIEVET3BlcmFuZElzTWVtb3J5CisgQHBhcmFtIG9wZXJhbmQgVGhlIG9wZXJhbmQgdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IDEgaWYgdGhlIG9wZXJhbmQgc3BlY2lmaWVzIGEgbG9jYXRpb24gaW4gbWVtb3J5OyAwIGlmIG5vdDsgLTEgb24gZXJyb3IuCisgKi8KK2ludCBFRE9wZXJhbmRJc01lbW9yeShFRE9wZXJhbmRSZWYgb3BlcmFuZCk7CisKKy8qIQorIEBmdW5jdGlvbiBFRFJlZ2lzdGVyT3BlcmFuZFZhbHVlCisgQHBhcmFtIHZhbHVlIEEgcG9pbnRlciB3aG9zZSB0YXJnZXQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgTExWTSByZWdpc3RlciBJRAorICAgb2YgdGhlIHJlZ2lzdGVyIG5hbWVkIGJ5IHRoZSBvcGVyYW5kLiAgCisgQHBhcmFtIG9wZXJhbmQgVGhlIG9wZXJhbmQgdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IDAgb24gc3VjY2VzczsgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgRURSZWdpc3Rlck9wZXJhbmRWYWx1ZSh1bnNpZ25lZCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFRE9wZXJhbmRSZWYgb3BlcmFuZCk7CisgIAorLyohCisgQGZ1bmN0aW9uIEVESW1tZWRpYXRlT3BlcmFuZFZhbHVlCisgQHBhcmFtIHZhbHVlIEEgcG9pbnRlciB3aG9zZSB0YXJnZXQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgb2YgdGhlCisgICBpbW1lZGlhdGUuCisgQHBhcmFtIG9wZXJhbmQgVGhlIG9wZXJhbmQgdG8gYmUgcXVlcmllZC4KKyBAcmVzdWx0IDAgb24gc3VjY2VzczsgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgRURJbW1lZGlhdGVPcGVyYW5kVmFsdWUodWludDY0X3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVET3BlcmFuZFJlZiBvcGVyYW5kKTsKKworLyohCisgQGZ1bmN0aW9uIEVERXZhbHVhdGVPcGVyYW5kCisgRXZhbHVhdGVzIGFuIG9wZXJhbmQgdXNpbmcgYSBjbGllbnQtc3VwcGxpZWQgcmVnaXN0ZXIgc3RhdGUgYWNjZXNzb3IuICBSZWdpc3RlcgorIG9wZXJhbmRzIGFyZSBldmFsdWF0ZWQgYnkgcmVhZGluZyB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyOyBpbW1lZGlhdGUgb3BlcmFuZHMKKyBhcmUgZXZhbHVhdGVkIGJ5IHJlcG9ydGluZyB0aGUgaW1tZWRpYXRlIHZhbHVlOyBtZW1vcnkgb3BlcmFuZHMgYXJlIGV2YWx1YXRlZAorIGJ5IGNvbXB1dGluZyB0aGUgdGFyZ2V0IGFkZHJlc3MgKHdpdGggb25seSB0aG9zZSByZWxvY2F0aW9ucyBhcHBsaWVkIHRoYXQgd2VyZQorIGFscmVhZHkgYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgYnl0ZXMpLgorIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHdob3NlIHRhcmdldCBpcyB0byBiZSBmaWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9mCisgICBldmFsdWF0aW5nIHRoZSBvcGVyYW5kLgorIEBwYXJhbSBvcGVyYW5kIFRoZSBvcGVyYW5kIHRvIGJlIGV2YWx1YXRlZC4KKyBAcGFyYW0gcmVnUmVhZGVyIFRoZSBmdW5jdGlvbiB0byB1c2Ugd2hlbiByZWFkaW5nIHJlZ2lzdGVycyBmcm9tIHRoZSByZWdpc3RlcgorICAgc3RhdGUuCisgQHBhcmFtIGFyZyBBbiBhbm9ueW1vdXMgYXJndW1lbnQgZm9yIGNsaWVudCB1c2UuCisgQHJlc3VsdCAwIGlmIHRoZSBvcGVyYW5kIGNvdWxkIGJlIGV2YWx1YXRlZDsgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgRURFdmFsdWF0ZU9wZXJhbmQodWludDY0X3QgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBFRE9wZXJhbmRSZWYgb3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICBFRFJlZ2lzdGVyUmVhZGVyQ2FsbGJhY2sgcmVnUmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyk7CisgIAorI2lmZGVmIF9fQkxPQ0tTX18KKworLyohCisgQHR5cGVkZWYgRURCeXRlQmxvY2tfdAorIEJsb2NrLWJhc2VkIGludGVyZmFjZSB0byBtZW1vcnkgZnJvbSB3aGljaCBpbnN0cnVjdGlvbnMgbWF5IGJlIHJlYWQuCisgQHBhcmFtIGJ5dGUgQSBwb2ludGVyIHdob3NlIHRhcmdldCBzaG91bGQgYmUgZmlsbGVkIGluIHdpdGggdGhlIGRhdGEgcmV0dXJuZWQuCisgQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgdGhlIGJ5dGUgdG8gYmUgcmVhZC4KKyBAcmVzdWx0IDAgb24gc3VjY2VzczsgLTEgb3RoZXJ3aXNlLgorICovCit0eXBlZGVmIGludCAoXkVEQnl0ZUJsb2NrX3QpKHVpbnQ4X3QgKmJ5dGUsIHVpbnQ2NF90IGFkZHJlc3MpOworCisvKiEKKyBAdHlwZWRlZiBFRFJlZ2lzdGVyQmxvY2tfdAorIEJsb2NrLWJhc2VkIGludGVyZmFjZSB0byByZWdpc3RlcnMgZnJvbSB3aGljaCByZWdpc3RlcnMgbWF5IGJlIHJlYWQuCisgQHBhcmFtIHZhbHVlIEEgcG9pbnRlciB3aG9zZSB0YXJnZXQgc2hvdWxkIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUKKyAgIHJlZ2lzdGVyLgorIEBwYXJhbSByZWdJRCBUaGUgTExWTSByZWdpc3RlciBpZGVudGlmaWVyIGZvciB0aGUgcmVnaXN0ZXIgdG8gcmVhZC4KKyBAcmVzdWx0IDAgaWYgdGhlIHJlZ2lzdGVyIGNvdWxkIGJlIHJlYWQ7IC0xIG90aGVyd2lzZS4KKyAqLwordHlwZWRlZiBpbnQgKF5FRFJlZ2lzdGVyQmxvY2tfdCkodWludDY0X3QgKnZhbHVlLCB1bnNpZ25lZCByZWdJRCk7CisKKy8qIQorIEB0eXBlZGVmIEVEVG9rZW5WaXNpdG9yX3QKKyBCbG9jay1iYXNlZCBoYW5kbGVyIGZvciBpbmRpdmlkdWFsIHRva2Vucy4KKyBAcGFyYW0gdG9rZW4gVGhlIGN1cnJlbnQgdG9rZW4gYmVpbmcgcmVhZC4KKyBAcmVzdWx0IDAgdG8gY29udGludWU7IDEgdG8gc3RvcCBub3JtYWxseTsgLTEgb24gZXJyb3IuCisgKi8KK3R5cGVkZWYgaW50ICheRURUb2tlblZpc2l0b3JfdCkoRURUb2tlblJlZiB0b2tlbik7CisKKy8qISBAZnVuY3Rpb25ncm91cCBCbG9jay1iYXNlZCBpbnRlcmZhY2VzICovCisgIAorLyohCisgQGZ1bmN0aW9uIEVEQmxvY2tDcmVhdGVJbnN0cworIEdldHMgYSBzZXQgb2YgY29udGlndW91cyBpbnN0cnVjdGlvbnMgZnJvbSBhIGRpc2Fzc2VtYmxlciwgdXNpbmcgYSBibG9jayB0bworIHJlYWQgbWVtb3J5LgorIEBwYXJhbSBpbnN0cyBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgdGhhdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZQorICAgaW5zdHJ1Y3Rpb25zLiAgTXVzdCBoYXZlIGF0IGxlYXN0IGNvdW50IGVudHJpZXMuICBFbnRyaWVzIG5vdCBmaWxsZWQgaW4gd2lsbCAKKyAgIGJlIHNldCB0byBOVUxMLgorIEBwYXJhbSBjb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRvIGZpbGwgaW4uCisgQHBhcmFtIGRpc2Fzc2VtYmxlciBUaGUgZGlzYXNzZW1ibGVyIHRvIHVzZSB3aGVuIGRlY29kaW5nIHRoZSBpbnN0cnVjdGlvbnMuCisgQHBhcmFtIGJ5dGVCbG9jayBUaGUgYmxvY2sgdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgaW5zdHJ1Y3Rpb24ncyBtYWNoaW5lCisgICBjb2RlLgorIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyBAcmVzdWx0IFRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHJlYWQgb24gc3VjY2VzczsgMCBvdGhlcndpc2UuCisgKi8KK3Vuc2lnbmVkIGludCBFREJsb2NrQ3JlYXRlSW5zdHMoRURJbnN0UmVmICppbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRERpc2Fzc2VtYmxlclJlZiBkaXNhc3NlbWJsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEQnl0ZUJsb2NrX3QgYnl0ZUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBhZGRyZXNzKTsKKworLyohCisgQGZ1bmN0aW9uIEVEQmxvY2tFdmFsdWF0ZU9wZXJhbmQKKyBFdmFsdWF0ZXMgYW4gb3BlcmFuZCB1c2luZyBhIGJsb2NrIHRvIHJlYWQgcmVnaXN0ZXJzLgorIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHdob3NlIHRhcmdldCBpcyB0byBiZSBmaWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9mCisgICBldmFsdWF0aW5nIHRoZSBvcGVyYW5kLgorIEBwYXJhbSBvcGVyYW5kIFRoZSBvcGVyYW5kIHRvIGJlIGV2YWx1YXRlZC4KKyBAcGFyYW0gcmVnQmxvY2sgVGhlIGJsb2NrIHRvIHVzZSB3aGVuIHJlYWRpbmcgcmVnaXN0ZXJzIGZyb20gdGhlIHJlZ2lzdGVyCisgICBzdGF0ZS4KKyBAcmVzdWx0IDAgaWYgdGhlIG9wZXJhbmQgY291bGQgYmUgZXZhbHVhdGVkOyAtMSBvdGhlcndpc2UuCisgKi8KK2ludCBFREJsb2NrRXZhbHVhdGVPcGVyYW5kKHVpbnQ2NF90ICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFRE9wZXJhbmRSZWYgb3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEUmVnaXN0ZXJCbG9ja190IHJlZ0Jsb2NrKTsKKworLyohCisgQGZ1bmN0aW9uIEVEQmxvY2tWaXNpdFRva2VucworIFZpc2l0cyBldmVyeSB0b2tlbiB3aXRoIGEgdmlzaXRvci4KKyBAcGFyYW0gaW5zdCBUaGUgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgdG9rZW5zIHRvIGJlIHZpc2l0ZWQuCisgQHBhcmFtIHZpc2l0b3IgVGhlIHZpc2l0b3IuCisgQHJlc3VsdCAwIGlmIHRoZSB2aXNpdCBlbmRlZCBub3JtYWxseTsgLTEgaWYgdGhlIHZpc2l0b3IgZW5jb3VudGVyZWQgYW4gZXJyb3IKKyAgIG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yLgorICovCitpbnQgRURCbG9ja1Zpc2l0VG9rZW5zKEVESW5zdFJlZiBpbnN0LAorICAgICAgICAgICAgICAgICAgICAgICBFRFRva2VuVmlzaXRvcl90IHZpc2l0b3IpOworCisjZW5kaWYKKyAgCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0V4ZWN1dGlvbkVuZ2luZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtLWMvRXhlY3V0aW9uRW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmNDA2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0V4ZWN1dGlvbkVuZ2luZS5oCkBAIC0wLDAgKzEsMTUyIEBACisvKj09PS0tIGxsdm0tYy9FeGVjdXRpb25FbmdpbmUuaCAtIEV4ZWN1dGlvbkVuZ2luZSBMaWIgQyBJZmFjZSAtLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBkZWNsYXJlcyB0aGUgQyBpbnRlcmZhY2UgdG8gbGliTExWTUV4ZWN1dGlvbkVuZ2luZS5vLCB3aGljaCAgICAqfAorfCogaW1wbGVtZW50cyB2YXJpb3VzIGFuYWx5c2VzIG9mIHRoZSBMTFZNIElSLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBNYW55IGV4b3RpYyBsYW5ndWFnZXMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIEMgY29kZSBidXQgaGF2ZSBhIGhhcmRlciB0aW1lICAqfAorfCogd2l0aCBDKysgZHVlIHRvIG5hbWUgbWFuZ2xpbmcuIFNvIGluIGFkZGl0aW9uIHRvIEMsIHRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgKnwKK3wqIHRvb2xzIHdyaXR0ZW4gaW4gc3VjaCBsYW5ndWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfRVhFQ1VUSU9ORU5HSU5FX0gKKyNkZWZpbmUgTExWTV9DX0VYRUNVVElPTkVOR0lORV9ICisKKyNpbmNsdWRlICJsbHZtLWMvQ29yZS5oIgorI2luY2x1ZGUgImxsdm0tYy9UYXJnZXQuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIExMVk1MaW5rSW5KSVQodm9pZCk7Cit2b2lkIExMVk1MaW5rSW5JbnRlcnByZXRlcih2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZUdlbmVyaWNWYWx1ZSAqTExWTUdlbmVyaWNWYWx1ZVJlZjsKK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVFeGVjdXRpb25FbmdpbmUgKkxMVk1FeGVjdXRpb25FbmdpbmVSZWY7CisKKy8qPT09LS0gT3BlcmF0aW9ucyBvbiBnZW5lcmljIHZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK0xMVk1HZW5lcmljVmFsdWVSZWYgTExWTUNyZWF0ZUdlbmVyaWNWYWx1ZU9mSW50KExMVk1UeXBlUmVmIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBJc1NpZ25lZCk7CisKK0xMVk1HZW5lcmljVmFsdWVSZWYgTExWTUNyZWF0ZUdlbmVyaWNWYWx1ZU9mUG9pbnRlcih2b2lkICpQKTsKKworTExWTUdlbmVyaWNWYWx1ZVJlZiBMTFZNQ3JlYXRlR2VuZXJpY1ZhbHVlT2ZGbG9hdChMTFZNVHlwZVJlZiBUeSwgZG91YmxlIE4pOworCit1bnNpZ25lZCBMTFZNR2VuZXJpY1ZhbHVlSW50V2lkdGgoTExWTUdlbmVyaWNWYWx1ZVJlZiBHZW5WYWxSZWYpOworCit1bnNpZ25lZCBsb25nIGxvbmcgTExWTUdlbmVyaWNWYWx1ZVRvSW50KExMVk1HZW5lcmljVmFsdWVSZWYgR2VuVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBJc1NpZ25lZCk7CisKK3ZvaWQgKkxMVk1HZW5lcmljVmFsdWVUb1BvaW50ZXIoTExWTUdlbmVyaWNWYWx1ZVJlZiBHZW5WYWwpOworCitkb3VibGUgTExWTUdlbmVyaWNWYWx1ZVRvRmxvYXQoTExWTVR5cGVSZWYgVHlSZWYsIExMVk1HZW5lcmljVmFsdWVSZWYgR2VuVmFsKTsKKwordm9pZCBMTFZNRGlzcG9zZUdlbmVyaWNWYWx1ZShMTFZNR2VuZXJpY1ZhbHVlUmVmIEdlblZhbCk7CisKKy8qPT09LS0gT3BlcmF0aW9ucyBvbiBleGVjdXRpb24gZW5naW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK0xMVk1Cb29sIExMVk1DcmVhdGVFeGVjdXRpb25FbmdpbmVGb3JNb2R1bGUoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiAqT3V0RUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dEVycm9yKTsKKworTExWTUJvb2wgTExWTUNyZWF0ZUludGVycHJldGVyRm9yTW9kdWxlKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgKk91dEludGVycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUmVmIE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dEVycm9yKTsKKworTExWTUJvb2wgTExWTUNyZWF0ZUpJVENvbXBpbGVyRm9yTW9kdWxlKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgKk91dEpJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUmVmIE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dEVycm9yKTsKKworLyoqIERlcHJlY2F0ZWQ6IFVzZSBMTFZNQ3JlYXRlRXhlY3V0aW9uRW5naW5lRm9yTW9kdWxlIGluc3RlYWQuICovCitMTFZNQm9vbCBMTFZNQ3JlYXRlRXhlY3V0aW9uRW5naW5lKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgKk91dEVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUHJvdmlkZXJSZWYgTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipPdXRFcnJvcik7CisKKy8qKiBEZXByZWNhdGVkOiBVc2UgTExWTUNyZWF0ZUludGVycHJldGVyRm9yTW9kdWxlIGluc3RlYWQuICovCitMTFZNQm9vbCBMTFZNQ3JlYXRlSW50ZXJwcmV0ZXIoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiAqT3V0SW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVQcm92aWRlclJlZiBNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0RXJyb3IpOworCisvKiogRGVwcmVjYXRlZDogVXNlIExMVk1DcmVhdGVKSVRDb21waWxlckZvck1vZHVsZSBpbnN0ZWFkLiAqLworTExWTUJvb2wgTExWTUNyZWF0ZUpJVENvbXBpbGVyKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgKk91dEpJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUHJvdmlkZXJSZWYgTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dEVycm9yKTsKKwordm9pZCBMTFZNRGlzcG9zZUV4ZWN1dGlvbkVuZ2luZShMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFKTsKKwordm9pZCBMTFZNUnVuU3RhdGljQ29uc3RydWN0b3JzKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUpOworCit2b2lkIExMVk1SdW5TdGF0aWNEZXN0cnVjdG9ycyhMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFKTsKKworaW50IExMVk1SdW5GdW5jdGlvbkFzTWFpbihMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNVmFsdWVSZWYgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJnQywgY29uc3QgY2hhciAqIGNvbnN0ICpBcmdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKkVudlApOworCitMTFZNR2VuZXJpY1ZhbHVlUmVmIExMVk1SdW5GdW5jdGlvbihMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNVmFsdWVSZWYgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNR2VuZXJpY1ZhbHVlUmVmICpBcmdzKTsKKwordm9pZCBMTFZNRnJlZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24oTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwgTExWTVZhbHVlUmVmIEYpOworCit2b2lkIExMVk1BZGRNb2R1bGUoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwgTExWTU1vZHVsZVJlZiBNKTsKKworLyoqIERlcHJlY2F0ZWQ6IFVzZSBMTFZNQWRkTW9kdWxlIGluc3RlYWQuICovCit2b2lkIExMVk1BZGRNb2R1bGVQcm92aWRlcihMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNTW9kdWxlUHJvdmlkZXJSZWYgTVApOworCitMTFZNQm9vbCBMTFZNUmVtb3ZlTW9kdWxlKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUsIExMVk1Nb2R1bGVSZWYgTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1vZHVsZVJlZiAqT3V0TW9kLCBjaGFyICoqT3V0RXJyb3IpOworCisvKiogRGVwcmVjYXRlZDogVXNlIExMVk1SZW1vdmVNb2R1bGUgaW5zdGVhZC4gKi8KK0xMVk1Cb29sIExMVk1SZW1vdmVNb2R1bGVQcm92aWRlcihMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVQcm92aWRlclJlZiBNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUmVmICpPdXRNb2QsIGNoYXIgKipPdXRFcnJvcik7CisKK0xMVk1Cb29sIExMVk1GaW5kRnVuY3Rpb24oTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwgY29uc3QgY2hhciAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmICpPdXRGbik7CisKK3ZvaWQgKkxMVk1SZWNvbXBpbGVBbmRSZWxpbmtGdW5jdGlvbihMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNVmFsdWVSZWYgRm4pOworCitMTFZNVGFyZ2V0RGF0YVJlZiBMTFZNR2V0RXhlY3V0aW9uRW5naW5lVGFyZ2V0RGF0YShMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFKTsKKwordm9pZCBMTFZNQWRkR2xvYmFsTWFwcGluZyhMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNVmFsdWVSZWYgR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBBZGRyKTsKKwordm9pZCAqTExWTUdldFBvaW50ZXJUb0dsb2JhbChMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNVmFsdWVSZWYgR2xvYmFsKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgc3RydWN0IEdlbmVyaWNWYWx1ZTsKKyAgY2xhc3MgRXhlY3V0aW9uRW5naW5lOworICAKKyAgI2RlZmluZSBERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKHR5LCByZWYpICAgXAorICAgIGlubGluZSB0eSAqdW53cmFwKHJlZiBQKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx0eSo+KFApOyAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIHJlZiB3cmFwKGNvbnN0IHR5ICpQKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHJlZj4oY29uc3RfY2FzdDx0eSo+KFApKTsgXAorICAgIH0KKyAgCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoR2VuZXJpY1ZhbHVlLCAgICBMTFZNR2VuZXJpY1ZhbHVlUmVmICAgKQorICBERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKEV4ZWN1dGlvbkVuZ2luZSwgTExWTUV4ZWN1dGlvbkVuZ2luZVJlZikKKyAgCisgICN1bmRlZiBERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TCit9CisgIAorI2VuZGlmIC8qIGRlZmluZWQoX19jcGx1c3BsdXMpICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtLWMvTGlua1RpbWVPcHRpbWl6ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0xpbmtUaW1lT3B0aW1pemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmZGNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL0xpbmtUaW1lT3B0aW1pemVyLmgKQEAgLTAsMCArMSw1OCBAQAorLy89PT0tLSBsbHZtL0xpbmtUaW1lT3B0aW1pemVyLmggLSBMVE8gUHVibGljIEMgSW50ZXJmYWNlIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgcHJvdmlkZXMgYSBDIEFQSSB0byB1c2UgdGhlIExMVk0gbGluayB0aW1lIG9wdGltaXphdGlvbgorLy8gbGlicmFyeS4gVGhpcyBpcyBpbnRlZGVkIHRvIGJlIHVzZWQgYnkgbGlua2VycyB3aGljaCBhcmUgQy1vbmx5IGluCisvLyB0aGVpciBpbXBsZW1lbnRhdGlvbiBmb3IgcGVyZm9ybWluZyBMVE8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfX0xUT19DQVBJX0hfXworI2RlZmluZSBfX0xUT19DQVBJX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyAgLy8vIFRoaXMgcHJvdmlkZXMgYSBkdW1teSB0eXBlIGZvciBwb2ludGVycyB0byB0aGUgTFRPIG9iamVjdC4KKyAgdHlwZWRlZiB2b2lkKiBsbHZtX2x0b190OworCisgIC8vLyBUaGlzIHByb3ZpZGVzIGEgQy12aXNpYmxlIGVudW1lcmF0b3IgdG8gbWFuYWdlIHN0YXR1cyBjb2Rlcy4KKyAgLy8vIFRoaXMgc2hvdWxkIG1hcCBleGFjdGx5IG9udG8gdGhlIEMrKyBlbnVtZXJhdG9yIExUT1N0YXR1cy4KKyAgdHlwZWRlZiBlbnVtIGxsdm1fbHRvX3N0YXR1cyB7CisgICAgTExWTV9MVE9fVU5LTk9XTiwKKyAgICBMTFZNX0xUT19PUFRfU1VDQ0VTUywKKyAgICBMTFZNX0xUT19SRUFEX1NVQ0NFU1MsCisgICAgTExWTV9MVE9fUkVBRF9GQUlMVVJFLAorICAgIExMVk1fTFRPX1dSSVRFX0ZBSUxVUkUsCisgICAgTExWTV9MVE9fTk9fVEFSR0VULAorICAgIExMVk1fTFRPX05PX1dPUkssCisgICAgTExWTV9MVE9fTU9EVUxFX01FUkdFX0ZBSUxVUkUsCisgICAgTExWTV9MVE9fQVNNX0ZBSUxVUkUsCisKKyAgICAvLyAgQWRkZWQgQy1zcGVjaWZpYyBlcnJvciBjb2RlcworICAgIExMVk1fTFRPX05VTExfT0JKRUNUCisgIH0gbGx2bV9sdG9fc3RhdHVzX3Q7CisgCisgIC8vLyBUaGlzIHByb3ZpZGVzIEMgaW50ZXJmYWNlIHRvIGluaXRpYWxpemUgbGluayB0aW1lIG9wdGltaXplci4gVGhpcyBhbGxvd3MKKyAgLy8vIGxpbmtlciB0byB1c2UgZGxvcGVuKCkgaW50ZXJmYWNlIHRvIGR5bmFtaWNhbGx5IGxvYWQgTGlua1RpbWVPcHRpbWl6ZXIuCisgIC8vLyBleHRlcm4gIkMiIGhlbHBzLCBiZWNhdXNlIGRsb3BlbigpIGludGVyZmFjZSB1c2VzIG5hbWUgdG8gZmluZCB0aGUgc3ltYm9sLgorICBleHRlcm4gbGx2bV9sdG9fdCBsbHZtX2NyZWF0ZV9vcHRpbWl6ZXIodm9pZCk7CisgIGV4dGVybiB2b2lkIGxsdm1fZGVzdHJveV9vcHRpbWl6ZXIobGx2bV9sdG9fdCBsdG8pOworCisgIGV4dGVybiBsbHZtX2x0b19zdGF0dXNfdCBsbHZtX3JlYWRfb2JqZWN0X2ZpbGUKKyAgICAobGx2bV9sdG9fdCBsdG8sIGNvbnN0IGNoYXIqIGlucHV0X2ZpbGVuYW1lKTsKKyAgZXh0ZXJuIGxsdm1fbHRvX3N0YXR1c190IGxsdm1fb3B0aW1pemVfbW9kdWxlcworICAgIChsbHZtX2x0b190IGx0bywgY29uc3QgY2hhciogb3V0cHV0X2ZpbGVuYW1lKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9UYXJnZXQuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL1RhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmQ2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9UYXJnZXQuaApAQCAtMCwwICsxLDE3NyBAQAorLyo9PT0tLSBsbHZtLWMvVGFyZ2V0LmggLSBUYXJnZXQgTGliIEMgSWZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICovCisvKiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBoZWFkZXIgZGVjbGFyZXMgdGhlIEMgaW50ZXJmYWNlIHRvIGxpYkxMVk1UYXJnZXQuYSwgd2hpY2ggICAgICAgICAgICAgKi8KKy8qIGltcGxlbWVudHMgdGFyZ2V0IGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWFueSBleG90aWMgbGFuZ3VhZ2VzIGNhbiBpbnRlcm9wZXJhdGUgd2l0aCBDIGNvZGUgYnV0IGhhdmUgYSBoYXJkZXIgdGltZSAgKi8KKy8qIHdpdGggQysrIGR1ZSB0byBuYW1lIG1hbmdsaW5nLiBTbyBpbiBhZGRpdGlvbiB0byBDLCB0aGlzIGludGVyZmFjZSBlbmFibGVzICovCisvKiB0b29scyB3cml0dGVuIGluIHN1Y2ggbGFuZ3VhZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DX1RBUkdFVF9ICisjZGVmaW5lIExMVk1fQ19UQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS1jL0NvcmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2VudW0gTExWTUJ5dGVPcmRlcmluZyB7IExMVk1CaWdFbmRpYW4sIExMVk1MaXR0bGVFbmRpYW4gfTsKKwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZVRhcmdldERhdGEgKkxMVk1UYXJnZXREYXRhUmVmOwordHlwZWRlZiBzdHJ1Y3QgTExWTVN0cnVjdExheW91dCAqTExWTVN0cnVjdExheW91dFJlZjsKKworLyogRGVjbGFyZSBhbGwgb2YgdGhlIHRhcmdldC1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlLiAqLworI2RlZmluZSBMTFZNX1RBUkdFVChUYXJnZXROYW1lKSBcCisgIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldEluZm8odm9pZCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvVGFyZ2V0cy5kZWYiCisjdW5kZWYgTExWTV9UQVJHRVQgIC8qIEV4cGxpY2l0IHVuZGVmIHRvIG1ha2UgU1dJRyBoYXBwaWVyICovCisgIAorI2RlZmluZSBMTFZNX1RBUkdFVChUYXJnZXROYW1lKSB2b2lkIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXQodm9pZCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvVGFyZ2V0cy5kZWYiCisjdW5kZWYgTExWTV9UQVJHRVQgIC8qIEV4cGxpY2l0IHVuZGVmIHRvIG1ha2UgU1dJRyBoYXBwaWVyICovCisKKy8qKiBMTFZNSW5pdGlhbGl6ZUFsbFRhcmdldEluZm9zIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmCisgICAgaXQgd2FudHMgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgdGFyZ2V0cyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0bworICAgIHN1cHBvcnQuICovCitzdGF0aWMgaW5saW5lIHZvaWQgTExWTUluaXRpYWxpemVBbGxUYXJnZXRJbmZvcyh2b2lkKSB7CisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXRJbmZvKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvVGFyZ2V0cy5kZWYiCisjdW5kZWYgTExWTV9UQVJHRVQgIC8qIEV4cGxpY2l0IHVuZGVmIHRvIG1ha2UgU1dJRyBoYXBwaWVyICovCit9CisKKy8qKiBMTFZNSW5pdGlhbGl6ZUFsbFRhcmdldHMgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgaXQKKyAgICB3YW50cyB0byBsaW5rIGluIGFsbCBhdmFpbGFibGUgdGFyZ2V0cyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0bworICAgIHN1cHBvcnQuICovCitzdGF0aWMgaW5saW5lIHZvaWQgTExWTUluaXRpYWxpemVBbGxUYXJnZXRzKHZvaWQpIHsKKyNkZWZpbmUgTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldCgpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorI3VuZGVmIExMVk1fVEFSR0VUICAvKiBFeHBsaWNpdCB1bmRlZiB0byBtYWtlIFNXSUcgaGFwcGllciAqLworfQorICAKKy8qKiBMTFZNSW5pdGlhbGl6ZU5hdGl2ZVRhcmdldCAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB0bworICAgIGluaXRpYWxpemUgdGhlIG5hdGl2ZSB0YXJnZXQgY29ycmVzcG9uZGluZyB0byB0aGUgaG9zdC4gIFRoaXMgaXMgdXNlZnVsIAorICAgIGZvciBKSVQgYXBwbGljYXRpb25zIHRvIGVuc3VyZSB0aGF0IHRoZSB0YXJnZXQgZ2V0cyBsaW5rZWQgaW4gY29ycmVjdGx5LiAqLworc3RhdGljIGlubGluZSBMTFZNQm9vbCBMTFZNSW5pdGlhbGl6ZU5hdGl2ZVRhcmdldCh2b2lkKSB7CisgIC8qIElmIHdlIGhhdmUgYSBuYXRpdmUgdGFyZ2V0LCBpbml0aWFsaXplIGl0IHRvIGVuc3VyZSBpdCBpcyBsaW5rZWQgaW4uICovCisjaWZkZWYgTExWTV9OQVRJVkVfQVJDSAorI2RlZmluZSBEb0luaXQyKFRBUkcpIFwKKyAgTExWTUluaXRpYWxpemUgIyMgVEFSRyAjIyBJbmZvICgpOyAgICAgICAgICBcCisgIExMVk1Jbml0aWFsaXplICMjIFRBUkcgKCkKKyNkZWZpbmUgRG9Jbml0KFQpIERvSW5pdDIoVCkKKyAgRG9Jbml0KExMVk1fTkFUSVZFX0FSQ0gpOworICByZXR1cm4gMDsKKyN1bmRlZiBEb0luaXQKKyN1bmRlZiBEb0luaXQyCisjZWxzZQorICByZXR1cm4gMTsKKyNlbmRpZgorfSAgCisKKy8qPT09LS0gVGFyZ2V0IERhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKy8qKiBDcmVhdGVzIHRhcmdldCBkYXRhIGZyb20gYSB0YXJnZXQgbGF5b3V0IHN0cmluZy4KKyAgICBTZWUgdGhlIGNvbnN0cnVjdG9yIGxsdm06OlRhcmdldERhdGE6OlRhcmdldERhdGEuICovCitMTFZNVGFyZ2V0RGF0YVJlZiBMTFZNQ3JlYXRlVGFyZ2V0RGF0YShjb25zdCBjaGFyICpTdHJpbmdSZXApOworCisvKiogQWRkcyB0YXJnZXQgZGF0YSBpbmZvcm1hdGlvbiB0byBhIHBhc3MgbWFuYWdlci4gVGhpcyBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcAorICAgIG9mIHRoZSB0YXJnZXQgZGF0YS4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpQYXNzTWFuYWdlckJhc2U6OmFkZC4gKi8KK3ZvaWQgTExWTUFkZFRhcmdldERhdGEoTExWTVRhcmdldERhdGFSZWYsIExMVk1QYXNzTWFuYWdlclJlZik7CisKKy8qKiBDb252ZXJ0cyB0YXJnZXQgZGF0YSB0byBhIHRhcmdldCBsYXlvdXQgc3RyaW5nLiBUaGUgc3RyaW5nIG11c3QgYmUgZGlzcG9zZWQKKyAgICB3aXRoIExMVk1EaXNwb3NlTWVzc2FnZS4KKyAgICBTZWUgdGhlIGNvbnN0cnVjdG9yIGxsdm06OlRhcmdldERhdGE6OlRhcmdldERhdGEuICovCitjaGFyICpMTFZNQ29weVN0cmluZ1JlcE9mVGFyZ2V0RGF0YShMTFZNVGFyZ2V0RGF0YVJlZik7CisKKy8qKiBSZXR1cm5zIHRoZSBieXRlIG9yZGVyIG9mIGEgdGFyZ2V0LCBlaXRoZXIgTExWTUJpZ0VuZGlhbiBvcgorICAgIExMVk1MaXR0bGVFbmRpYW4uCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6VGFyZ2V0RGF0YTo6aXNMaXR0bGVFbmRpYW4uICovCitlbnVtIExMVk1CeXRlT3JkZXJpbmcgTExWTUJ5dGVPcmRlcihMTFZNVGFyZ2V0RGF0YVJlZik7CisKKy8qKiBSZXR1cm5zIHRoZSBwb2ludGVyIHNpemUgaW4gYnl0ZXMgZm9yIGEgdGFyZ2V0LgorICAgIFNlZSB0aGUgbWV0aG9kIGxsdm06OlRhcmdldERhdGE6OmdldFBvaW50ZXJTaXplLiAqLwordW5zaWduZWQgTExWTVBvaW50ZXJTaXplKExMVk1UYXJnZXREYXRhUmVmKTsKKworLyoqIFJldHVybnMgdGhlIGludGVnZXIgdHlwZSB0aGF0IGlzIHRoZSBzYW1lIHNpemUgYXMgYSBwb2ludGVyIG9uIGEgdGFyZ2V0LgorICAgIFNlZSB0aGUgbWV0aG9kIGxsdm06OlRhcmdldERhdGE6OmdldEludFB0clR5cGUuICovCitMTFZNVHlwZVJlZiBMTFZNSW50UHRyVHlwZShMTFZNVGFyZ2V0RGF0YVJlZik7CisKKy8qKiBDb21wdXRlcyB0aGUgc2l6ZSBvZiBhIHR5cGUgaW4gYnl0ZXMgZm9yIGEgdGFyZ2V0LgorICAgIFNlZSB0aGUgbWV0aG9kIGxsdm06OlRhcmdldERhdGE6OmdldFR5cGVTaXplSW5CaXRzLiAqLwordW5zaWduZWQgbG9uZyBsb25nIExMVk1TaXplT2ZUeXBlSW5CaXRzKExMVk1UYXJnZXREYXRhUmVmLCBMTFZNVHlwZVJlZik7CisKKy8qKiBDb21wdXRlcyB0aGUgc3RvcmFnZSBzaXplIG9mIGEgdHlwZSBpbiBieXRlcyBmb3IgYSB0YXJnZXQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6VGFyZ2V0RGF0YTo6Z2V0VHlwZVN0b3JlU2l6ZS4gKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBMTFZNU3RvcmVTaXplT2ZUeXBlKExMVk1UYXJnZXREYXRhUmVmLCBMTFZNVHlwZVJlZik7CisKKy8qKiBDb21wdXRlcyB0aGUgQUJJIHNpemUgb2YgYSB0eXBlIGluIGJ5dGVzIGZvciBhIHRhcmdldC4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpUYXJnZXREYXRhOjpnZXRUeXBlQWxsb2NTaXplLiAqLwordW5zaWduZWQgbG9uZyBsb25nIExMVk1BQklTaXplT2ZUeXBlKExMVk1UYXJnZXREYXRhUmVmLCBMTFZNVHlwZVJlZik7CisKKy8qKiBDb21wdXRlcyB0aGUgQUJJIGFsaWdubWVudCBvZiBhIHR5cGUgaW4gYnl0ZXMgZm9yIGEgdGFyZ2V0LgorICAgIFNlZSB0aGUgbWV0aG9kIGxsdm06OlRhcmdldERhdGE6OmdldFR5cGVBQklTaXplLiAqLwordW5zaWduZWQgTExWTUFCSUFsaWdubWVudE9mVHlwZShMTFZNVGFyZ2V0RGF0YVJlZiwgTExWTVR5cGVSZWYpOworCisvKiogQ29tcHV0ZXMgdGhlIGNhbGwgZnJhbWUgYWxpZ25tZW50IG9mIGEgdHlwZSBpbiBieXRlcyBmb3IgYSB0YXJnZXQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6VGFyZ2V0RGF0YTo6Z2V0VHlwZUFCSVNpemUuICovCit1bnNpZ25lZCBMTFZNQ2FsbEZyYW1lQWxpZ25tZW50T2ZUeXBlKExMVk1UYXJnZXREYXRhUmVmLCBMTFZNVHlwZVJlZik7CisKKy8qKiBDb21wdXRlcyB0aGUgcHJlZmVycmVkIGFsaWdubWVudCBvZiBhIHR5cGUgaW4gYnl0ZXMgZm9yIGEgdGFyZ2V0LgorICAgIFNlZSB0aGUgbWV0aG9kIGxsdm06OlRhcmdldERhdGE6OmdldFR5cGVBQklTaXplLiAqLwordW5zaWduZWQgTExWTVByZWZlcnJlZEFsaWdubWVudE9mVHlwZShMTFZNVGFyZ2V0RGF0YVJlZiwgTExWTVR5cGVSZWYpOworCisvKiogQ29tcHV0ZXMgdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQgb2YgYSBnbG9iYWwgdmFyaWFibGUgaW4gYnl0ZXMgZm9yIGEgdGFyZ2V0LgorICAgIFNlZSB0aGUgbWV0aG9kIGxsdm06OlRhcmdldERhdGE6OmdldFByZWZlcnJlZEFsaWdubWVudC4gKi8KK3Vuc2lnbmVkIExMVk1QcmVmZXJyZWRBbGlnbm1lbnRPZkdsb2JhbChMTFZNVGFyZ2V0RGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgR2xvYmFsVmFyKTsKKworLyoqIENvbXB1dGVzIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBieXRlIG9mZnNldCBmb3IgYSB0YXJnZXQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6U3RydWN0TGF5b3V0OjpnZXRFbGVtZW50Q29udGFpbmluZ09mZnNldC4gKi8KK3Vuc2lnbmVkIExMVk1FbGVtZW50QXRPZmZzZXQoTExWTVRhcmdldERhdGFSZWYsIExMVk1UeXBlUmVmIFN0cnVjdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgT2Zmc2V0KTsKKworLyoqIENvbXB1dGVzIHRoZSBieXRlIG9mZnNldCBvZiB0aGUgaW5kZXhlZCBzdHJ1Y3QgZWxlbWVudCBmb3IgYSB0YXJnZXQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6U3RydWN0TGF5b3V0OjpnZXRFbGVtZW50Q29udGFpbmluZ09mZnNldC4gKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBMTFZNT2Zmc2V0T2ZFbGVtZW50KExMVk1UYXJnZXREYXRhUmVmLCBMTFZNVHlwZVJlZiBTdHJ1Y3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVsZW1lbnQpOworCisvKiogU3RydWN0IGxheW91dHMgYXJlIHNwZWN1bGF0aXZlbHkgY2FjaGVkLiBJZiBhIFRhcmdldERhdGFSZWYgaXMgYWxpdmUgd2hlbgorICAgIHR5cGVzIGFyZSBiZWluZyByZWZpbmVkIGFuZCByZW1vdmVkLCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCB3aGVuZXZlciBhCisgICAgc3RydWN0IHR5cGUgaXMgcmVtb3ZlZCB0byBhdm9pZCBhIGRhbmdsaW5nIHBvaW50ZXIgaW4gdGhpcyBjYWNoZS4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpUYXJnZXREYXRhOjpJbnZhbGlkYXRlU3RydWN0TGF5b3V0SW5mby4gKi8KK3ZvaWQgTExWTUludmFsaWRhdGVTdHJ1Y3RMYXlvdXQoTExWTVRhcmdldERhdGFSZWYsIExMVk1UeXBlUmVmIFN0cnVjdFR5KTsKKworLyoqIERlYWxsb2NhdGVzIGEgVGFyZ2V0RGF0YS4KKyAgICBTZWUgdGhlIGRlc3RydWN0b3IgbGx2bTo6VGFyZ2V0RGF0YTo6flRhcmdldERhdGEuICovCit2b2lkIExMVk1EaXNwb3NlVGFyZ2V0RGF0YShMTFZNVGFyZ2V0RGF0YVJlZik7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgVGFyZ2V0RGF0YTsKKworICBpbmxpbmUgVGFyZ2V0RGF0YSAqdW53cmFwKExMVk1UYXJnZXREYXRhUmVmIFApIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUYXJnZXREYXRhKj4oUCk7CisgIH0KKyAgCisgIGlubGluZSBMTFZNVGFyZ2V0RGF0YVJlZiB3cmFwKGNvbnN0IFRhcmdldERhdGEgKlApIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxMTFZNVGFyZ2V0RGF0YVJlZj4oY29uc3RfY2FzdDxUYXJnZXREYXRhKj4oUCkpOworICB9Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvSVBPLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9UcmFuc2Zvcm1zL0lQTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNmU4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9UcmFuc2Zvcm1zL0lQTy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qPT09LS0gSVBPLmggLSBJbnRlcnByb2NlZHVyYWwgVHJhbnNmb3JtYXRpb25zIEMgSW50ZXJmYWNlIC0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byBsaWJMTFZNSVBPLmEsIHdoaWNoIGltcGxlbWVudHMgICAgICp8Cit8KiB2YXJpb3VzIGludGVycHJvY2VkdXJhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIExMVk0gSVIuICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DX1RSQU5TRk9STVNfSVBPX0gKKyNkZWZpbmUgTExWTV9DX1RSQU5TRk9STVNfSVBPX0gKKworI2luY2x1ZGUgImxsdm0tYy9Db3JlLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVBcmd1bWVudFByb21vdGlvblBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRBcmd1bWVudFByb21vdGlvblBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVDb25zdGFudE1lcmdlUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZENvbnN0YW50TWVyZ2VQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlRGVhZEFyZ0VsaW1pbmF0aW9uUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZERlYWRBcmdFbGltaW5hdGlvblBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVEZWFkVHlwZUVsaW1pbmF0aW9uUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZERlYWRUeXBlRWxpbWluYXRpb25QYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlRnVuY3Rpb25BdHRyc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRGdW5jdGlvbkF0dHJzUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkRnVuY3Rpb25JbmxpbmluZ1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVHbG9iYWxEQ0VQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkR2xvYmFsRENFUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUdsb2JhbE9wdGltaXplclBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRHbG9iYWxPcHRpbWl6ZXJQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlSVBDb25zdGFudFByb3BhZ2F0aW9uUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZElQQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVMb3dlclNldEptcFBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRMb3dlclNldEptcFBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVQcnVuZUVIUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZFBydW5lRUhQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlSVBTQ0NQUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZElQU0NDUFBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVJbnRlcm5hbGl6ZVBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRJbnRlcm5hbGl6ZVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmLCB1bnNpZ25lZCBBbGxCdXRNYWluKTsKKworLy8gRklYTUU6IFJlbW92ZSBpbiBMTFZNIDMuMC4KK3ZvaWQgTExWTUFkZFJhaXNlQWxsb2NhdGlvbnNQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRTdHJpcERlYWRQcm90b3R5cGVzUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVN0cmlwU3ltYm9sc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRTdHJpcFN5bWJvbHNQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIGRlZmluZWQoX19jcGx1c3BsdXMpICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtLWMvVHJhbnNmb3Jtcy9TY2FsYXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvU2NhbGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0MDE5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvU2NhbGFyLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qPT09LS0gU2NhbGFyLmggLSBTY2FsYXIgVHJhbnNmb3JtYXRpb24gTGlicmFyeSBDIEludGVyZmFjZSAtLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byBsaWJMTFZNU2NhbGFyT3B0cy5hLCB3aGljaCAgICAgICAgICp8Cit8KiBpbXBsZW1lbnRzIHZhcmlvdXMgc2NhbGFyIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgTExWTSBJUi4gICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIE1hbnkgZXhvdGljIGxhbmd1YWdlcyBjYW4gaW50ZXJvcGVyYXRlIHdpdGggQyBjb2RlIGJ1dCBoYXZlIGEgaGFyZGVyIHRpbWUgICp8Cit8KiB3aXRoIEMrKyBkdWUgdG8gbmFtZSBtYW5nbGluZy4gU28gaW4gYWRkaXRpb24gdG8gQywgdGhpcyBpbnRlcmZhY2UgZW5hYmxlcyAqfAorfCogdG9vbHMgd3JpdHRlbiBpbiBzdWNoIGxhbmd1YWdlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19UUkFOU0ZPUk1TX1NDQUxBUl9ICisjZGVmaW5lIExMVk1fQ19UUkFOU0ZPUk1TX1NDQUxBUl9ICisKKyNpbmNsdWRlICJsbHZtLWMvQ29yZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlQWdncmVzc2l2ZURDRVBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRBZ2dyZXNzaXZlRENFUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUNGR1NpbXBsaWZpY2F0aW9uUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZENGR1NpbXBsaWZpY2F0aW9uUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZURlYWRTdG9yZUVsaW1pbmF0aW9uUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZERlYWRTdG9yZUVsaW1pbmF0aW9uUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUdWTlBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRHVk5QYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlSW5kVmFyU2ltcGxpZnlQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkSW5kVmFyU2ltcGxpZnlQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlSnVtcFRocmVhZGluZ1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRKdW1wVGhyZWFkaW5nUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUxJQ01QYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkTElDTVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVMb29wRGVsZXRpb25QYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkTG9vcERlbGV0aW9uUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUxvb3BJbmRleFNwbGl0UGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZExvb3BJbmRleFNwbGl0UGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUxvb3BSb3RhdGVQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkTG9vcFJvdGF0ZVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVMb29wVW5yb2xsUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZExvb3BVbnJvbGxQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlTG9vcFVuc3dpdGNoUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZExvb3BVbnN3aXRjaFBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVNZW1DcHlPcHRQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkTWVtQ3B5T3B0UGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZFByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVJlYXNzb2NpYXRlUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZFJlYXNzb2NpYXRlUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVNDQ1BQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkU0NDUFBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVTY2FsYXJSZXBsQWdncmVnYXRlc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRTY2FsYXJSZXBsQWdncmVnYXRlc1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVTY2FsYXJSZXBsQWdncmVnYXRlc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRTY2FsYXJSZXBsQWdncmVnYXRlc1Bhc3NXaXRoVGhyZXNob2xkKExMVk1QYXNzTWFuYWdlclJlZiBQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFRocmVzaG9sZCk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlU2ltcGxpZnlMaWJDYWxsc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRTaW1wbGlmeUxpYkNhbGxzUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVRhaWxDYWxsRWxpbWluYXRpb25QYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkVGFpbENhbGxFbGltaW5hdGlvblBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVDb25zdGFudFByb3BhZ2F0aW9uUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZENvbnN0YW50UHJvcGFnYXRpb25QYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6ZGVtb3RlUHJvbW90ZU1lbW9yeVRvUmVnaXN0ZXJQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkRGVtb3RlTWVtb3J5VG9SZWdpc3RlclBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVWZXJpZmllclBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRWZXJpZmllclBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogZGVmaW5lZChfX2NwbHVzcGx1cykgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9sdG8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS1jL2x0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjI3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0tYy9sdG8uaApAQCAtMCwwICsxLDI3NyBAQAorLyo9PT0tLSBsbHZtLWMvbHRvLmggLSBMVE8gUHVibGljIEMgSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBoZWFkZXIgcHJvdmlkZXMgcHVibGljIGludGVyZmFjZSB0byBhbiBhYnN0cmFjdCBsaW5rIHRpbWUgb3B0aW1pemF0aW9uKnwKK3wqIGxpYnJhcnkuICBMTFZNIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGZvciB1c2Ugd2l0aCAgICp8Cit8KiBsbHZtIGJpdGNvZGUgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTFRPX0gKKyNkZWZpbmUgTFRPX0ggIDEKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBMVE9fQVBJX1ZFUlNJT04gMworCit0eXBlZGVmIGVudW0geworICAgIExUT19TWU1CT0xfQUxJR05NRU5UX01BU0sgICAgICAgICA9IDB4MDAwMDAwMUYsICAgIC8qIGxvZzIgb2YgYWxpZ25tZW50ICovCisgICAgTFRPX1NZTUJPTF9QRVJNSVNTSU9OU19NQVNLICAgICAgID0gMHgwMDAwMDBFMCwgICAgCisgICAgTFRPX1NZTUJPTF9QRVJNSVNTSU9OU19DT0RFICAgICAgID0gMHgwMDAwMDBBMCwgICAgCisgICAgTFRPX1NZTUJPTF9QRVJNSVNTSU9OU19EQVRBICAgICAgID0gMHgwMDAwMDBDMCwgICAgCisgICAgTFRPX1NZTUJPTF9QRVJNSVNTSU9OU19ST0RBVEEgICAgID0gMHgwMDAwMDA4MCwgICAgCisgICAgTFRPX1NZTUJPTF9ERUZJTklUSU9OX01BU0sgICAgICAgID0gMHgwMDAwMDcwMCwgICAgCisgICAgTFRPX1NZTUJPTF9ERUZJTklUSU9OX1JFR1VMQVIgICAgID0gMHgwMDAwMDEwMCwgICAgCisgICAgTFRPX1NZTUJPTF9ERUZJTklUSU9OX1RFTlRBVElWRSAgID0gMHgwMDAwMDIwMCwgICAgCisgICAgTFRPX1NZTUJPTF9ERUZJTklUSU9OX1dFQUsgICAgICAgID0gMHgwMDAwMDMwMCwgICAgCisgICAgTFRPX1NZTUJPTF9ERUZJTklUSU9OX1VOREVGSU5FRCAgID0gMHgwMDAwMDQwMCwgICAgCisgICAgTFRPX1NZTUJPTF9ERUZJTklUSU9OX1dFQUtVTkRFRiAgID0gMHgwMDAwMDUwMCwKKyAgICBMVE9fU1lNQk9MX1NDT1BFX01BU0sgICAgICAgICAgICAgPSAweDAwMDAzODAwLCAgICAKKyAgICBMVE9fU1lNQk9MX1NDT1BFX0lOVEVSTkFMICAgICAgICAgPSAweDAwMDAwODAwLCAgICAKKyAgICBMVE9fU1lNQk9MX1NDT1BFX0hJRERFTiAgICAgICAgICAgPSAweDAwMDAxMDAwLCAgICAKKyAgICBMVE9fU1lNQk9MX1NDT1BFX1BST1RFQ1RFRCAgICAgICAgPSAweDAwMDAyMDAwLCAgICAKKyAgICBMVE9fU1lNQk9MX1NDT1BFX0RFRkFVTFQgICAgICAgICAgPSAweDAwMDAxODAwICAgIAorfSBsdG9fc3ltYm9sX2F0dHJpYnV0ZXM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTFRPX0RFQlVHX01PREVMX05PTkUgICAgICAgICA9IDAsCisgICAgTFRPX0RFQlVHX01PREVMX0RXQVJGICAgICAgICA9IDEKK30gbHRvX2RlYnVnX21vZGVsOworCit0eXBlZGVmIGVudW0geworICAgIExUT19DT0RFR0VOX1BJQ19NT0RFTF9TVEFUSUMgICAgICAgICA9IDAsCisgICAgTFRPX0NPREVHRU5fUElDX01PREVMX0RZTkFNSUMgICAgICAgID0gMSwKKyAgICBMVE9fQ09ERUdFTl9QSUNfTU9ERUxfRFlOQU1JQ19OT19QSUMgPSAyCit9IGx0b19jb2RlZ2VuX21vZGVsOworCisKKy8qKiBvcGFxdWUgcmVmZXJlbmNlIHRvIGEgbG9hZGVkIG9iamVjdCBtb2R1bGUgKi8KK3R5cGVkZWYgc3RydWN0IExUT01vZHVsZSogICAgICAgICBsdG9fbW9kdWxlX3Q7CisKKy8qKiBvcGFxdWUgcmVmZXJlbmNlIHRvIGEgY29kZSBnZW5lcmF0b3IgKi8KK3R5cGVkZWYgc3RydWN0IExUT0NvZGVHZW5lcmF0b3IqICBsdG9fY29kZV9nZW5fdDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFJldHVybnMgYSBwcmludGFibGUgc3RyaW5nLgorICovCitleHRlcm4gY29uc3QgY2hhcioKK2x0b19nZXRfdmVyc2lvbih2b2lkKTsKKworCisvKioKKyAqIFJldHVybnMgdGhlIGxhc3QgZXJyb3Igc3RyaW5nIG9yIE5VTEwgaWYgbGFzdCBvcGVyYXRpb24gd2FzIHN1Y2Vzc2Z1bC4KKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIqCitsdG9fZ2V0X2Vycm9yX21lc3NhZ2Uodm9pZCk7CisKKy8qKgorICogQ2hlY2tzIGlmIGEgZmlsZSBpcyBhIGxvYWRhYmxlIG9iamVjdCBmaWxlLgorICovCitleHRlcm4gYm9vbAorbHRvX21vZHVsZV9pc19vYmplY3RfZmlsZShjb25zdCBjaGFyKiBwYXRoKTsKKworCisvKioKKyAqIENoZWNrcyBpZiBhIGZpbGUgaXMgYSBsb2FkYWJsZSBvYmplY3QgY29tcGlsZWQgZm9yIHJlcXVlc3RlZCB0YXJnZXQuCisgKi8KK2V4dGVybiBib29sCitsdG9fbW9kdWxlX2lzX29iamVjdF9maWxlX2Zvcl90YXJnZXQoY29uc3QgY2hhciogcGF0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGFyZ2V0X3RyaXBsZV9wcmVmaXgpOworCisKKy8qKgorICogQ2hlY2tzIGlmIGEgYnVmZmVyIGlzIGEgbG9hZGFibGUgb2JqZWN0IGZpbGUuCisgKi8KK2V4dGVybiBib29sCitsdG9fbW9kdWxlX2lzX29iamVjdF9maWxlX2luX21lbW9yeShjb25zdCB2b2lkKiBtZW0sIHNpemVfdCBsZW5ndGgpOworCisKKy8qKgorICogQ2hlY2tzIGlmIGEgYnVmZmVyIGlzIGEgbG9hZGFibGUgb2JqZWN0IGNvbXBpbGVkIGZvciByZXF1ZXN0ZWQgdGFyZ2V0LgorICovCitleHRlcm4gYm9vbAorbHRvX21vZHVsZV9pc19vYmplY3RfZmlsZV9pbl9tZW1vcnlfZm9yX3RhcmdldChjb25zdCB2b2lkKiBtZW0sIHNpemVfdCBsZW5ndGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRhcmdldF90cmlwbGVfcHJlZml4KTsKKworCisvKioKKyAqIExvYWRzIGFuIG9iamVjdCBmaWxlIGZyb20gZGlzay4KKyAqIFJldHVybnMgTlVMTCBvbiBlcnJvciAoY2hlY2sgbHRvX2dldF9lcnJvcl9tZXNzYWdlKCkgZm9yIGRldGFpbHMpLgorICovCitleHRlcm4gbHRvX21vZHVsZV90CitsdG9fbW9kdWxlX2NyZWF0ZShjb25zdCBjaGFyKiBwYXRoKTsKKworCisvKioKKyAqIExvYWRzIGFuIG9iamVjdCBmaWxlIGZyb20gbWVtb3J5LgorICogUmV0dXJucyBOVUxMIG9uIGVycm9yIChjaGVjayBsdG9fZ2V0X2Vycm9yX21lc3NhZ2UoKSBmb3IgZGV0YWlscykuCisgKi8KK2V4dGVybiBsdG9fbW9kdWxlX3QKK2x0b19tb2R1bGVfY3JlYXRlX2Zyb21fbWVtb3J5KGNvbnN0IHZvaWQqIG1lbSwgc2l6ZV90IGxlbmd0aCk7CisKKworLyoqCisgKiBGcmVlcyBhbGwgbWVtb3J5IGludGVybmFsbHkgYWxsb2NhdGVkIGJ5IHRoZSBtb2R1bGUuCisgKiBVcG9uIHJldHVybiB0aGUgbHRvX21vZHVsZV90IGlzIG5vIGxvbmdlciB2YWxpZC4KKyAqLworZXh0ZXJuIHZvaWQKK2x0b19tb2R1bGVfZGlzcG9zZShsdG9fbW9kdWxlX3QgbW9kKTsKKworCisvKioKKyAqIFJldHVybnMgdHJpcGxlIHN0cmluZyB3aGljaCB0aGUgb2JqZWN0IG1vZHVsZSB3YXMgY29tcGlsZWQgdW5kZXIuCisgKi8KK2V4dGVybiBjb25zdCBjaGFyKgorbHRvX21vZHVsZV9nZXRfdGFyZ2V0X3RyaXBsZShsdG9fbW9kdWxlX3QgbW9kKTsKKworLyoqCisgKiBTZXRzIHRyaXBsZSBzdHJpbmcgd2l0aCB3aGljaCB0aGUgb2JqZWN0IHdpbGwgYmUgY29kZWdlbmVkLgorICovCitleHRlcm4gdm9pZAorbHRvX21vZHVsZV9zZXRfdGFyZ2V0X3RyaXBsZShsdG9fbW9kdWxlX3QgbW9kLCBjb25zdCBjaGFyICp0cmlwbGUpOworCisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBtb2R1bGUuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQKK2x0b19tb2R1bGVfZ2V0X251bV9zeW1ib2xzKGx0b19tb2R1bGVfdCBtb2QpOworCisKKy8qKgorICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgaXRoIHN5bWJvbCBpbiB0aGUgb2JqZWN0IG1vZHVsZS4KKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIqCitsdG9fbW9kdWxlX2dldF9zeW1ib2xfbmFtZShsdG9fbW9kdWxlX3QgbW9kLCB1bnNpZ25lZCBpbnQgaW5kZXgpOworCisKKy8qKgorICogUmV0dXJucyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgaXRoIHN5bWJvbCBpbiB0aGUgb2JqZWN0IG1vZHVsZS4KKyAqLworZXh0ZXJuIGx0b19zeW1ib2xfYXR0cmlidXRlcworbHRvX21vZHVsZV9nZXRfc3ltYm9sX2F0dHJpYnV0ZShsdG9fbW9kdWxlX3QgbW9kLCB1bnNpZ25lZCBpbnQgaW5kZXgpOworCisKKy8qKgorICogSW5zdGFudGlhdGVzIGEgY29kZSBnZW5lcmF0b3IuCisgKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IgKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqLworZXh0ZXJuIGx0b19jb2RlX2dlbl90CitsdG9fY29kZWdlbl9jcmVhdGUodm9pZCk7CisKKworLyoqCisgKiBGcmVlcyBhbGwgY29kZSBnZW5lcmF0b3IgYW5kIGFsbCBtZW1vcnkgaXQgaW50ZXJuYWxseSBhbGxvY2F0ZWQuCisgKiBVcG9uIHJldHVybiB0aGUgbHRvX2NvZGVfZ2VuX3QgaXMgbm8gbG9uZ2VyIHZhbGlkLgorICovCitleHRlcm4gdm9pZAorbHRvX2NvZGVnZW5fZGlzcG9zZShsdG9fY29kZV9nZW5fdCk7CisKKworCisvKioKKyAqIEFkZCBhbiBvYmplY3QgbW9kdWxlIHRvIHRoZSBzZXQgb2YgbW9kdWxlcyBmb3Igd2hpY2ggY29kZSB3aWxsIGJlIGdlbmVyYXRlZC4KKyAqIFJldHVybnMgdHJ1ZSBvbiBlcnJvciAoY2hlY2sgbHRvX2dldF9lcnJvcl9tZXNzYWdlKCkgZm9yIGRldGFpbHMpLgorICovCitleHRlcm4gYm9vbAorbHRvX2NvZGVnZW5fYWRkX21vZHVsZShsdG9fY29kZV9nZW5fdCBjZywgbHRvX21vZHVsZV90IG1vZCk7CisKKworCisvKioKKyAqIFNldHMgaWYgZGVidWcgaW5mbyBzaG91bGQgYmUgZ2VuZXJhdGVkLgorICogUmV0dXJucyB0cnVlIG9uIGVycm9yIChjaGVjayBsdG9fZ2V0X2Vycm9yX21lc3NhZ2UoKSBmb3IgZGV0YWlscykuCisgKi8KK2V4dGVybiBib29sCitsdG9fY29kZWdlbl9zZXRfZGVidWdfbW9kZWwobHRvX2NvZGVfZ2VuX3QgY2csIGx0b19kZWJ1Z19tb2RlbCk7CisKKworLyoqCisgKiBTZXRzIHdoaWNoIFBJQyBjb2RlIG1vZGVsIHRvIGdlbmVyYXRlZC4KKyAqIFJldHVybnMgdHJ1ZSBvbiBlcnJvciAoY2hlY2sgbHRvX2dldF9lcnJvcl9tZXNzYWdlKCkgZm9yIGRldGFpbHMpLgorICovCitleHRlcm4gYm9vbAorbHRvX2NvZGVnZW5fc2V0X3BpY19tb2RlbChsdG9fY29kZV9nZW5fdCBjZywgbHRvX2NvZGVnZW5fbW9kZWwpOworCisKKy8qKgorICogU2V0cyB0aGUgY3B1IHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCitleHRlcm4gdm9pZAorbHRvX2NvZGVnZW5fc2V0X2NwdShsdG9fY29kZV9nZW5fdCBjZywgY29uc3QgY2hhciAqY3B1KTsKKworCisvKioKKyAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSAiZ2NjIiB0byBydW4uIElmIG5vdCBzZXQsIGxpYkxUTyB3aWxsIHNlYXJjaCBmb3IKKyAqICJnY2MiIG9uIHRoZSBwYXRoLgorICovCitleHRlcm4gdm9pZAorbHRvX2NvZGVnZW5fc2V0X2djY19wYXRoKGx0b19jb2RlX2dlbl90IGNnLCBjb25zdCBjaGFyKiBwYXRoKTsKKworCisvKioKKyAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBhc3NlbWJsZXIgdG9vbCB0byBydW4uIElmIG5vdCBzZXQsIGxpYkxUTworICogd2lsbCB1c2UgZ2NjIHRvIGludm9rZSB0aGUgYXNzZW1ibGVyLgorICovCitleHRlcm4gdm9pZAorbHRvX2NvZGVnZW5fc2V0X2Fzc2VtYmxlcl9wYXRoKGx0b19jb2RlX2dlbl90IGNnLCBjb25zdCBjaGFyKiBwYXRoKTsKKworLyoqCisgKiBTZXRzIGV4dHJhIGFyZ3VtZW50cyB0aGF0IGxpYkxUTyBzaG91bGQgcGFzcyB0byB0aGUgYXNzZW1ibGVyLgorICovCitleHRlcm4gdm9pZAorbHRvX2NvZGVnZW5fc2V0X2Fzc2VtYmxlcl9hcmdzKGx0b19jb2RlX2dlbl90IGNnLCBjb25zdCBjaGFyICoqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmFyZ3MpOworCisvKioKKyAqIEFkZHMgdG8gYSBsaXN0IG9mIGFsbCBnbG9iYWwgc3ltYm9scyB0aGF0IG11c3QgZXhpc3QgaW4gdGhlIGZpbmFsCisgKiBnZW5lcmF0ZWQgY29kZS4gIElmIGEgZnVuY3Rpb24gaXMgbm90IGxpc3RlZCwgaXQgbWlnaHQgYmUKKyAqIGlubGluZWQgaW50byBldmVyeSB1c2FnZSBhbmQgb3B0aW1pemVkIGF3YXkuCisgKi8KK2V4dGVybiB2b2lkCitsdG9fY29kZWdlbl9hZGRfbXVzdF9wcmVzZXJ2ZV9zeW1ib2wobHRvX2NvZGVfZ2VuX3QgY2csIGNvbnN0IGNoYXIqIHN5bWJvbCk7CisKKworLyoqCisgKiBXcml0ZXMgYSBuZXcgb2JqZWN0IGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIHRoYXQgY29udGFpbnMgdGhlCisgKiBtZXJnZWQgY29udGVudHMgb2YgYWxsIG1vZHVsZXMgYWRkZWQgc28gZmFyLgorICogUmV0dXJucyB0cnVlIG9uIGVycm9yIChjaGVjayBsdG9fZ2V0X2Vycm9yX21lc3NhZ2UoKSBmb3IgZGV0YWlscykuCisgKi8KK2V4dGVybiBib29sCitsdG9fY29kZWdlbl93cml0ZV9tZXJnZWRfbW9kdWxlcyhsdG9fY29kZV9nZW5fdCBjZywgY29uc3QgY2hhciogcGF0aCk7CisKKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYWxsIGFkZGVkIG1vZHVsZXMgaW50byBvbmUgbmF0aXZlIG9iamVjdCBmaWxlLgorICogT24gc3VjZXNzIHJldHVybnMgYSBwb2ludGVyIHRvIGEgZ2VuZXJhdGVkIG1hY2gtby9FTEYgYnVmZmVyIGFuZAorICogbGVuZ3RoIHNldCB0byB0aGUgYnVmZmVyIHNpemUuICBUaGUgYnVmZmVyIGlzIG93bmVkIGJ5IHRoZSAKKyAqIGx0b19jb2RlX2dlbl90IGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gbHRvX2NvZGVnZW5fZGlzcG9zZSgpCisgKiBpcyBjYWxsZWQsIG9yIGx0b19jb2RlZ2VuX2NvbXBpbGUoKSBpcyBjYWxsZWQgYWdhaW4uCisgKiBPbiBmYWlsdXJlLCByZXR1cm5zIE5VTEwgKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqLworZXh0ZXJuIGNvbnN0IHZvaWQqCitsdG9fY29kZWdlbl9jb21waWxlKGx0b19jb2RlX2dlbl90IGNnLCBzaXplX3QqIGxlbmd0aCk7CisKKworLyoqCisgKiBTZXRzIG9wdGlvbnMgdG8gaGVscCBkZWJ1ZyBjb2RlZ2VuIGJ1Z3MuCisgKi8KK2V4dGVybiB2b2lkCitsdG9fY29kZWdlbl9kZWJ1Z19vcHRpb25zKGx0b19jb2RlX2dlbl90IGNnLCBjb25zdCBjaGFyICopOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvQVBGbG9hdC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9BUEZsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlNGUwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvQVBGbG9hdC5oCkBAIC0wLDAgKzEsNDQ1IEBACisvLz09IGxsdm0vU3VwcG9ydC9BUEZsb2F0LmggLSBBcmJpdHJhcnkgUHJlY2lzaW9uIEZsb2F0aW5nIFBvaW50IC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBhIGNsYXNzIHRvIHJlcHJlc2VudCBhcmJpdHJhcnkgcHJlY2lzaW9uIGZsb2F0aW5nCisvLyBwb2ludCB2YWx1ZXMgYW5kIHByb3ZpZGUgYSB2YXJpZXR5IG9mIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvbiB0aGVtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8qICBBIHNlbGYtY29udGFpbmVkIGhvc3QtIGFuZCB0YXJnZXQtaW5kZXBlbmRlbnQgYXJiaXRyYXJ5LXByZWNpc2lvbgorICAgIGZsb2F0aW5nLXBvaW50IHNvZnR3YXJlIGltcGxlbWVudGF0aW9uLiAgSXQgdXNlcyBiaWdudW0gaW50ZWdlcgorICAgIGFyaXRobWV0aWMgYXMgcHJvdmlkZWQgYnkgc3RhdGljIGZ1bmN0aW9ucyBpbiB0aGUgQVBJbnQgY2xhc3MuCisgICAgVGhlIGxpYnJhcnkgd2lsbCB3b3JrIHdpdGggYmlnbnVtIGludGVnZXJzIHdob3NlIHBhcnRzIGFyZSBhbnkKKyAgICB1bnNpZ25lZCB0eXBlIGF0IGxlYXN0IDE2IGJpdHMgd2lkZSwgYnV0IDY0IGJpdHMgaXMgcmVjb21tZW5kZWQuCisKKyAgICBXcml0dGVuIGZvciBjbGFyaXR5IHJhdGhlciB0aGFuIHNwZWVkLCBpbiBwYXJ0aWN1bGFyIHdpdGggYSB2aWV3CisgICAgdG8gdXNlIGluIHRoZSBmcm9udC1lbmQgb2YgYSBjcm9zcyBjb21waWxlciBzbyB0aGF0IHRhcmdldAorICAgIGFyaXRobWV0aWMgY2FuIGJlIGNvcnJlY3RseSBwZXJmb3JtZWQgb24gdGhlIGhvc3QuICBQZXJmb3JtYW5jZQorICAgIHNob3VsZCBub25ldGhlbGVzcyBiZSByZWFzb25hYmxlLCBwYXJ0aWN1bGFybHkgZm9yIGl0cyBpbnRlbmRlZAorICAgIHVzZS4gIEl0IG1heSBiZSB1c2VmdWwgYXMgYSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBhIHJ1bi10aW1lCisgICAgbGlicmFyeSBkdXJpbmcgZGV2ZWxvcG1lbnQgb2YgYSBmYXN0ZXIgdGFyZ2V0LXNwZWNpZmljIG9uZS4KKworICAgIEFsbCA1IHJvdW5kaW5nIG1vZGVzIGluIHRoZSBJRUVFLTc1NFIgZHJhZnQgYXJlIGhhbmRsZWQgY29ycmVjdGx5CisgICAgZm9yIGFsbCBpbXBsZW1lbnRlZCBvcGVyYXRpb25zLiAgQ3VycmVudGx5IGltcGxlbWVudGVkIG9wZXJhdGlvbnMKKyAgICBhcmUgYWRkLCBzdWJ0cmFjdCwgbXVsdGlwbHksIGRpdmlkZSwgZnVzZWQtbXVsdGlwbHktYWRkLAorICAgIGNvbnZlcnNpb24tdG8tZmxvYXQsIGNvbnZlcnNpb24tdG8taW50ZWdlciBhbmQKKyAgICBjb252ZXJzaW9uLWZyb20taW50ZWdlci4gIE5ldyByb3VuZGluZyBtb2RlcyAoZS5nLiBhd2F5IGZyb20gemVybykKKyAgICBjYW4gYmUgYWRkZWQgd2l0aCB0aHJlZSBvciBmb3VyIGxpbmVzIG9mIGNvZGUuCisKKyAgICBGb3VyIGZvcm1hdHMgYXJlIGJ1aWx0LWluOiBJRUVFIHNpbmdsZSBwcmVjaXNpb24sIGRvdWJsZQorICAgIHByZWNpc2lvbiwgcXVhZHJ1cGxlIHByZWNpc2lvbiwgYW5kIHg4NyA4MC1iaXQgZXh0ZW5kZWQgZG91YmxlCisgICAgKHdoZW4gb3BlcmF0aW5nIHdpdGggZnVsbCBleHRlbmRlZCBwcmVjaXNpb24pLiAgQWRkaW5nIGEgbmV3CisgICAgZm9ybWF0IHRoYXQgb2JleXMgSUVFRSBzZW1hbnRpY3Mgb25seSByZXF1aXJlcyBhZGRpbmcgdHdvIGxpbmVzIG9mCisgICAgY29kZTogYSBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbiBvZiB0aGUgZm9ybWF0LgorCisgICAgQWxsIG9wZXJhdGlvbnMgcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhhdCBvcGVyYXRpb24gYXMgYW4gZXhjZXB0aW9uCisgICAgYml0LW1hc2ssIHNvIG11bHRpcGxlIG9wZXJhdGlvbnMgY2FuIGJlIGRvbmUgY29uc2VjdXRpdmVseSB3aXRoCisgICAgdGhlaXIgcmVzdWx0cyBvci1lZCB0b2dldGhlci4gIFRoZSByZXR1cm5lZCBzdGF0dXMgY2FuIGJlIHVzZWZ1bAorICAgIGZvciBjb21waWxlciBkaWFnbm9zdGljczsgZS5nLiwgaW5leGFjdCwgdW5kZXJmbG93IGFuZCBvdmVyZmxvdworICAgIGNhbiBiZSBlYXNpbHkgZGlhZ25vc2VkIG9uIGNvbnN0YW50IGZvbGRpbmcsIGFuZCBjb21waWxlcgorICAgIG9wdGltaXplcnMgY2FuIGRldGVybWluZSB3aGF0IGV4Y2VwdGlvbnMgd291bGQgYmUgcmFpc2VkIGJ5CisgICAgZm9sZGluZyBvcGVyYXRpb25zIGFuZCBvcHRpbWl6ZSwgb3IgcGVyaGFwcyBub3Qgb3B0aW1pemUsCisgICAgYWNjb3JkaW5nbHkuCisKKyAgICBBdCBwcmVzZW50LCB1bmRlcmZsb3cgdGluaW5lc3MgaXMgZGV0ZWN0ZWQgYWZ0ZXIgcm91bmRpbmc7IGl0CisgICAgc2hvdWxkIGJlIHN0cmFpZ2h0IGZvcndhcmQgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBiZWZvcmUtcm91bmRpbmcKKyAgICBjYXNlIHRvby4KKworICAgIFRoZSBsaWJyYXJ5IHJlYWRzIGhleGFkZWNpbWFsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgYXMgcGVyIEM5OSwKKyAgICBhbmQgY29ycmVjdGx5IHJvdW5kcyBpZiBuZWNlc3NhcnkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICByb3VuZGluZyBtb2RlLiAgU3ludGF4IGlzIHJlcXVpcmVkIHRvIGhhdmUgYmVlbiB2YWxpZGF0ZWQgYnkgdGhlCisgICAgY2FsbGVyLiAgSXQgYWxzbyBjb252ZXJ0cyBmbG9hdGluZyBwb2ludCBudW1iZXJzIHRvIGhleGFkZWNpbWFsCisgICAgdGV4dCBhcyBwZXIgdGhlIEM5OSAlYSBhbmQgJUEgY29udmVyc2lvbnMuICBUaGUgb3V0cHV0IHByZWNpc2lvbgorICAgIChvciBhbHRlcm5hdGl2ZWx5IHRoZSBuYXR1cmFsIG1pbmltYWwgcHJlY2lzaW9uKSBjYW4gYmUgc3BlY2lmaWVkOworICAgIGlmIHRoZSByZXF1ZXN0ZWQgcHJlY2lzaW9uIGlzIGxlc3MgdGhhbiB0aGUgbmF0dXJhbCBwcmVjaXNpb24gdGhlCisgICAgb3V0cHV0IGlzIGNvcnJlY3RseSByb3VuZGVkIGZvciB0aGUgc3BlY2lmaWVkIHJvdW5kaW5nIG1vZGUuCisKKyAgICBJdCBhbHNvIHJlYWRzIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhbmQgY29ycmVjdGx5IHJvdW5kcworICAgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHJvdW5kaW5nIG1vZGUuCisKKyAgICBDb252ZXJzaW9uIHRvIGRlY2ltYWwgdGV4dCBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgorCisgICAgTm9uLXplcm8gZmluaXRlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGludGVybmFsbHkgYXMgYSBzaWduIGJpdCwKKyAgICBhIDE2LWJpdCBzaWduZWQgZXhwb25lbnQsIGFuZCB0aGUgc2lnbmlmaWNhbmQgYXMgYW4gYXJyYXkgb2YKKyAgICBpbnRlZ2VyIHBhcnRzLiAgQWZ0ZXIgbm9ybWFsaXphdGlvbiBvZiBhIG51bWJlciBvZiBwcmVjaXNpb24gUCB0aGUKKyAgICBleHBvbmVudCBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBmb3JtYXQsIGFuZCBpZiB0aGUgbnVtYmVyIGlzCisgICAgbm90IGRlbm9ybWFsIHRoZSBQLXRoIGJpdCBvZiB0aGUgc2lnbmlmaWNhbmQgaXMgc2V0IGFzIGFuIGV4cGxpY2l0CisgICAgaW50ZWdlciBiaXQuICBGb3IgZGVub3JtYWxzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBzaGlmdGVkCisgICAgcmlnaHQgc28gdGhhdCB0aGUgZXhwb25lbnQgaXMgbWFpbnRhaW5lZCBhdCB0aGUgZm9ybWF0J3MgbWluaW11bSwKKyAgICBzbyB0aGF0IHRoZSBzbWFsbGVzdCBkZW5vcm1hbCBoYXMganVzdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0CisgICAgb2YgdGhlIHNpZ25pZmljYW5kIHNldC4gIFRoZSBzaWduIG9mIHplcm9lcyBhbmQgaW5maW5pdGllcyBpcworICAgIHNpZ25pZmljYW50OyB0aGUgZXhwb25lbnQgYW5kIHNpZ25pZmljYW5kIG9mIHN1Y2ggbnVtYmVycyBpcyBub3QKKyAgICBzdG9yZWQsIGJ1dCBoYXMgYSBrbm93biBpbXBsaWNpdCAoZGV0ZXJtaW5pc3RpYykgdmFsdWU6IDAgZm9yIHRoZQorICAgIHNpZ25pZmljYW5kcywgMCBmb3IgemVybyBleHBvbmVudCwgYWxsIDEgYml0cyBmb3IgaW5maW5pdHkKKyAgICBleHBvbmVudC4gIEZvciBOYU5zIHRoZSBzaWduIGFuZCBzaWduaWZpY2FuZCBhcmUgZGV0ZXJtaW5pc3RpYywKKyAgICBhbHRob3VnaCBub3QgcmVhbGx5IG1lYW5pbmdmdWwsIGFuZCBwcmVzZXJ2ZWQgaW4gbm9uLWNvbnZlcnNpb24KKyAgICBvcGVyYXRpb25zLiAgVGhlIGV4cG9uZW50IGlzIGltcGxpY2l0bHkgYWxsIDEgYml0cy4KKworICAgIFRPRE8KKyAgICA9PT09CisKKyAgICBTb21lIGZlYXR1cmVzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgd29ydGggYWRkaW5nOgorCisgICAgQmluYXJ5IHRvIGRlY2ltYWwgY29udmVyc2lvbiAoaGFyZCkuCisKKyAgICBPcHRpb25hbCBhYmlsaXR5IHRvIGRldGVjdCB1bmRlcmZsb3cgdGluaW5lc3MgYmVmb3JlIHJvdW5kaW5nLgorCisgICAgTmV3IGZvcm1hdHM6IHg4NyBpbiBzaW5nbGUgYW5kIGRvdWJsZSBwcmVjaXNpb24gbW9kZSAoSUVFRSBhcGFydAorICAgIGZyb20gZXh0ZW5kZWQgZXhwb25lbnQgcmFuZ2UpIChoYXJkKS4KKworICAgIE5ldyBvcGVyYXRpb25zOiBzcXJ0LCBJRUVFIHJlbWFpbmRlciwgQzkwIGZtb2QsIG5leHRhZnRlciwKKyAgICBuZXh0dG93YXJkLgorKi8KKworI2lmbmRlZiBMTFZNX0ZMT0FUX0gKKyNkZWZpbmUgTExWTV9GTE9BVF9ICisKKy8vIEFQSW50IGNvbnRhaW5zIHN0YXRpYyBmdW5jdGlvbnMgaW1wbGVtZW50aW5nIGJpZ251bSBhcml0aG1ldGljLgorI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvKiBFeHBvbmVudHMgYXJlIHN0b3JlZCBhcyBzaWduZWQgbnVtYmVycy4gICovCisgIHR5cGVkZWYgc2lnbmVkIHNob3J0IGV4cG9uZW50X3Q7CisKKyAgc3RydWN0IGZsdFNlbWFudGljczsKKyAgY2xhc3MgU3RyaW5nUmVmOworCisgIC8qIFdoZW4gYml0cyBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBhcmUgdHJ1bmNhdGVkLCB0aGlzIGVudW0gaXMKKyAgICAgdXNlZCB0byBpbmRpY2F0ZSB3aGF0IGZyYWN0aW9uIG9mIHRoZSBMU0IgdGhvc2UgYml0cyByZXByZXNlbnRlZC4KKyAgICAgSXQgZXNzZW50aWFsbHkgY29tYmluZXMgdGhlIHJvbGVzIG9mIGd1YXJkIGFuZCBzdGlja3kgYml0cy4gICovCisgIGVudW0gbG9zdEZyYWN0aW9uIHsgICAgICAgICAgIC8vIEV4YW1wbGUgb2YgdHJ1bmNhdGVkIGJpdHM6CisgICAgbGZFeGFjdGx5WmVybywgICAgICAgICAgICAgIC8vIDAwMDAwMAorICAgIGxmTGVzc1RoYW5IYWxmLCAgICAgICAgICAgICAvLyAweHh4eHggIHgncyBub3QgYWxsIHplcm8KKyAgICBsZkV4YWN0bHlIYWxmLCAgICAgICAgICAgICAgLy8gMTAwMDAwCisgICAgbGZNb3JlVGhhbkhhbGYgICAgICAgICAgICAgIC8vIDF4eHh4eCAgeCdzIG5vdCBhbGwgemVybworICB9OworCisgIGNsYXNzIEFQRmxvYXQgeworICBwdWJsaWM6CisKKyAgICAvKiBXZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgZmxvYXRpbmcgcG9pbnQgc2VtYW50aWNzLiAgKi8KKyAgICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzIElFRUVoYWxmOworICAgIHN0YXRpYyBjb25zdCBmbHRTZW1hbnRpY3MgSUVFRXNpbmdsZTsKKyAgICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzIElFRUVkb3VibGU7CisgICAgc3RhdGljIGNvbnN0IGZsdFNlbWFudGljcyBJRUVFcXVhZDsKKyAgICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzIFBQQ0RvdWJsZURvdWJsZTsKKyAgICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzIHg4N0RvdWJsZUV4dGVuZGVkOworICAgIC8qIEFuZCB0aGlzIHBzZXVkbywgdXNlZCB0byBjb25zdHJ1Y3QgQVBGbG9hdHMgdGhhdCBjYW5ub3QKKyAgICAgICBjb25mbGljdCB3aXRoIGFueXRoaW5nIHJlYWwuICovCisgICAgc3RhdGljIGNvbnN0IGZsdFNlbWFudGljcyBCb2d1czsKKworICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VtYW50aWNzUHJlY2lzaW9uKGNvbnN0IGZsdFNlbWFudGljcyAmKTsKKworICAgIC8qIEZsb2F0aW5nIHBvaW50IG51bWJlcnMgaGF2ZSBhIGZvdXItc3RhdGUgY29tcGFyaXNvbiByZWxhdGlvbi4gICovCisgICAgZW51bSBjbXBSZXN1bHQgeworICAgICAgY21wTGVzc1RoYW4sCisgICAgICBjbXBFcXVhbCwKKyAgICAgIGNtcEdyZWF0ZXJUaGFuLAorICAgICAgY21wVW5vcmRlcmVkCisgICAgfTsKKworICAgIC8qIElFRUUtNzU0UiBnaXZlcyBmaXZlIHJvdW5kaW5nIG1vZGVzLiAgKi8KKyAgICBlbnVtIHJvdW5kaW5nTW9kZSB7CisgICAgICBybU5lYXJlc3RUaWVzVG9FdmVuLAorICAgICAgcm1Ub3dhcmRQb3NpdGl2ZSwKKyAgICAgIHJtVG93YXJkTmVnYXRpdmUsCisgICAgICBybVRvd2FyZFplcm8sCisgICAgICBybU5lYXJlc3RUaWVzVG9Bd2F5CisgICAgfTsKKworICAgIC8vIE9wZXJhdGlvbiBzdGF0dXMuICBvcFVuZGVyZmxvdyBvciBvcE92ZXJmbG93IGFyZSBhbHdheXMgcmV0dXJuZWQKKyAgICAvLyBvci1lZCB3aXRoIG9wSW5leGFjdC4KKyAgICBlbnVtIG9wU3RhdHVzIHsKKyAgICAgIG9wT0sgICAgICAgICAgPSAweDAwLAorICAgICAgb3BJbnZhbGlkT3AgICA9IDB4MDEsCisgICAgICBvcERpdkJ5WmVybyAgID0gMHgwMiwKKyAgICAgIG9wT3ZlcmZsb3cgICAgPSAweDA0LAorICAgICAgb3BVbmRlcmZsb3cgICA9IDB4MDgsCisgICAgICBvcEluZXhhY3QgICAgID0gMHgxMAorICAgIH07CisKKyAgICAvLyBDYXRlZ29yeSBvZiBpbnRlcm5hbGx5LXJlcHJlc2VudGVkIG51bWJlci4KKyAgICBlbnVtIGZsdENhdGVnb3J5IHsKKyAgICAgIGZjSW5maW5pdHksCisgICAgICBmY05hTiwKKyAgICAgIGZjTm9ybWFsLAorICAgICAgZmNaZXJvCisgICAgfTsKKworICAgIGVudW0gdW5pbml0aWFsaXplZFRhZyB7CisgICAgICB1bmluaXRpYWxpemVkCisgICAgfTsKKworICAgIC8vIENvbnN0cnVjdG9ycy4KKyAgICBBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmKTsgLy8gRGVmYXVsdCBjb25zdHJ1Y3QgdG8gMC4wCisgICAgQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJiwgU3RyaW5nUmVmKTsKKyAgICBBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmLCBpbnRlZ2VyUGFydCk7CisgICAgQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJiwgZmx0Q2F0ZWdvcnksIGJvb2wgbmVnYXRpdmUpOworICAgIEFQRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICYsIHVuaW5pdGlhbGl6ZWRUYWcpOworICAgIGV4cGxpY2l0IEFQRmxvYXQoZG91YmxlIGQpOworICAgIGV4cGxpY2l0IEFQRmxvYXQoZmxvYXQgZik7CisgICAgZXhwbGljaXQgQVBGbG9hdChjb25zdCBBUEludCAmLCBib29sIGlzSUVFRSA9IGZhbHNlKTsKKyAgICBBUEZsb2F0KGNvbnN0IEFQRmxvYXQgJik7CisgICAgfkFQRmxvYXQoKTsKKworICAgIC8vIENvbnZlbmllbmNlICJjb25zdHJ1Y3RvcnMiCisgICAgc3RhdGljIEFQRmxvYXQgZ2V0WmVybyhjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSwgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlKSB7CisgICAgICByZXR1cm4gQVBGbG9hdChTZW0sIGZjWmVybywgTmVnYXRpdmUpOworICAgIH0KKyAgICBzdGF0aWMgQVBGbG9hdCBnZXRJbmYoY29uc3QgZmx0U2VtYW50aWNzICZTZW0sIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSkgeworICAgICAgcmV0dXJuIEFQRmxvYXQoU2VtLCBmY0luZmluaXR5LCBOZWdhdGl2ZSk7CisgICAgfQorCisgICAgLy8vIGdldE5hTiAtIEZhY3RvcnkgZm9yIFFOYU4gdmFsdWVzLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTmVnYXRpdmUgLSBUcnVlIGlmZiB0aGUgTmFOIGdlbmVyYXRlZCBzaG91bGQgYmUgbmVnYXRpdmUuCisgICAgLy8vIFxwYXJhbSB0eXBlIC0gVGhlIHVuc3BlY2lmaWVkIGZpbGwgYml0cyBmb3IgY3JlYXRpbmcgdGhlIE5hTiwgMCBieQorICAgIC8vLyBkZWZhdWx0LiAgVGhlIHZhbHVlIGlzIHRydW5jYXRlZCBhcyBuZWNlc3NhcnkuCisgICAgc3RhdGljIEFQRmxvYXQgZ2V0TmFOKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIE5lZ2F0aXZlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHR5cGUgPSAwKSB7CisgICAgICBpZiAodHlwZSkgeworICAgICAgICBBUEludCBmaWxsKDY0LCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIGdldFFOYU4oU2VtLCBOZWdhdGl2ZSwgJmZpbGwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGdldFFOYU4oU2VtLCBOZWdhdGl2ZSwgMCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIGdldFFOYW4gLSBGYWN0b3J5IGZvciBRTmFOIHZhbHVlcy4KKyAgICBzdGF0aWMgQVBGbG9hdCBnZXRRTmFOKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgKnBheWxvYWQgPSAwKSB7CisgICAgICByZXR1cm4gbWFrZU5hTihTZW0sIGZhbHNlLCBOZWdhdGl2ZSwgcGF5bG9hZCk7CisgICAgfQorCisgICAgLy8vIGdldFNOYW4gLSBGYWN0b3J5IGZvciBTTmFOIHZhbHVlcy4KKyAgICBzdGF0aWMgQVBGbG9hdCBnZXRTTmFOKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgKnBheWxvYWQgPSAwKSB7CisgICAgICByZXR1cm4gbWFrZU5hTihTZW0sIHRydWUsIE5lZ2F0aXZlLCBwYXlsb2FkKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0TGFyZ2VzdCAtIFJldHVybnMgdGhlIGxhcmdlc3QgZmluaXRlIG51bWJlciBpbiB0aGUgZ2l2ZW4KKyAgICAvLy8gc2VtYW50aWNzLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTmVnYXRpdmUgLSBUcnVlIGlmZiB0aGUgbnVtYmVyIHNob3VsZCBiZSBuZWdhdGl2ZQorICAgIHN0YXRpYyBBUEZsb2F0IGdldExhcmdlc3QoY29uc3QgZmx0U2VtYW50aWNzICZTZW0sIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSk7CisKKyAgICAvLy8gZ2V0U21hbGxlc3QgLSBSZXR1cm5zIHRoZSBzbWFsbGVzdCAoYnkgbWFnbml0dWRlKSBmaW5pdGUgbnVtYmVyCisgICAgLy8vIGluIHRoZSBnaXZlbiBzZW1hbnRpY3MuICBNaWdodCBiZSBkZW5vcm1hbGl6ZWQsIHdoaWNoIGltcGxpZXMgYQorICAgIC8vLyByZWxhdGl2ZSBsb3NzIG9mIHByZWNpc2lvbi4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIE5lZ2F0aXZlIC0gVHJ1ZSBpZmYgdGhlIG51bWJlciBzaG91bGQgYmUgbmVnYXRpdmUKKyAgICBzdGF0aWMgQVBGbG9hdCBnZXRTbWFsbGVzdChjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSwgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlKTsKKworICAgIC8vLyBnZXRTbWFsbGVzdE5vcm1hbGl6ZWQgLSBSZXR1cm5zIHRoZSBzbWFsbGVzdCAoYnkgbWFnbml0dWRlKQorICAgIC8vLyBub3JtYWxpemVkIGZpbml0ZSBudW1iZXIgaW4gdGhlIGdpdmVuIHNlbWFudGljcy4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIE5lZ2F0aXZlIC0gVHJ1ZSBpZmYgdGhlIG51bWJlciBzaG91bGQgYmUgbmVnYXRpdmUKKyAgICBzdGF0aWMgQVBGbG9hdCBnZXRTbWFsbGVzdE5vcm1hbGl6ZWQoY29uc3QgZmx0U2VtYW50aWNzICZTZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSk7CisKKyAgICAvLy8gUHJvZmlsZSAtIFVzZWQgdG8gaW5zZXJ0IEFQRmxvYXQgb2JqZWN0cywgb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4KKyAgICAvLy8gIEFQRmxvYXQgb2JqZWN0cywgaW50byBGb2xkaW5nU2V0cy4KKyAgICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgTklEKSBjb25zdDsKKworICAgIC8vLyBAYnJpZWYgVXNlZCBieSB0aGUgQml0Y29kZSBzZXJpYWxpemVyIHRvIGVtaXQgQVBJbnRzIHRvIEJpdGNvZGUuCisgICAgdm9pZCBFbWl0KFNlcmlhbGl6ZXImIFMpIGNvbnN0OworCisgICAgLy8vIEBicmllZiBVc2VkIGJ5IHRoZSBCaXRjb2RlIGRlc2VyaWFsaXplciB0byBkZXNlcmlhbGl6ZSBBUEludHMuCisgICAgc3RhdGljIEFQRmxvYXQgUmVhZFZhbChEZXNlcmlhbGl6ZXImIEQpOworCisgICAgLyogQXJpdGhtZXRpYy4gICovCisgICAgb3BTdGF0dXMgYWRkKGNvbnN0IEFQRmxvYXQgJiwgcm91bmRpbmdNb2RlKTsKKyAgICBvcFN0YXR1cyBzdWJ0cmFjdChjb25zdCBBUEZsb2F0ICYsIHJvdW5kaW5nTW9kZSk7CisgICAgb3BTdGF0dXMgbXVsdGlwbHkoY29uc3QgQVBGbG9hdCAmLCByb3VuZGluZ01vZGUpOworICAgIG9wU3RhdHVzIGRpdmlkZShjb25zdCBBUEZsb2F0ICYsIHJvdW5kaW5nTW9kZSk7CisgICAgLyogSUVFRSByZW1haW5kZXIuICovCisgICAgb3BTdGF0dXMgcmVtYWluZGVyKGNvbnN0IEFQRmxvYXQgJik7CisgICAgLyogQyBmbW9kLCBvciBsbHZtIGZyZW0uICovCisgICAgb3BTdGF0dXMgbW9kKGNvbnN0IEFQRmxvYXQgJiwgcm91bmRpbmdNb2RlKTsKKyAgICBvcFN0YXR1cyBmdXNlZE11bHRpcGx5QWRkKGNvbnN0IEFQRmxvYXQgJiwgY29uc3QgQVBGbG9hdCAmLCByb3VuZGluZ01vZGUpOworCisgICAgLyogU2lnbiBvcGVyYXRpb25zLiAgKi8KKyAgICB2b2lkIGNoYW5nZVNpZ24oKTsKKyAgICB2b2lkIGNsZWFyU2lnbigpOworICAgIHZvaWQgY29weVNpZ24oY29uc3QgQVBGbG9hdCAmKTsKKworICAgIC8qIENvbnZlcnNpb25zLiAgKi8KKyAgICBvcFN0YXR1cyBjb252ZXJ0KGNvbnN0IGZsdFNlbWFudGljcyAmLCByb3VuZGluZ01vZGUsIGJvb2wgKik7CisgICAgb3BTdGF0dXMgY29udmVydFRvSW50ZWdlcihpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQsIGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUsIGJvb2wgKikgY29uc3Q7CisgICAgb3BTdGF0dXMgY29udmVydEZyb21BUEludChjb25zdCBBUEludCAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCwgcm91bmRpbmdNb2RlKTsKKyAgICBvcFN0YXR1cyBjb252ZXJ0RnJvbVNpZ25FeHRlbmRlZEludGVnZXIoY29uc3QgaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sLCByb3VuZGluZ01vZGUpOworICAgIG9wU3RhdHVzIGNvbnZlcnRGcm9tWmVyb0V4dGVuZGVkSW50ZWdlcihjb25zdCBpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wsIHJvdW5kaW5nTW9kZSk7CisgICAgb3BTdGF0dXMgY29udmVydEZyb21TdHJpbmcoU3RyaW5nUmVmLCByb3VuZGluZ01vZGUpOworICAgIEFQSW50IGJpdGNhc3RUb0FQSW50KCkgY29uc3Q7CisgICAgZG91YmxlIGNvbnZlcnRUb0RvdWJsZSgpIGNvbnN0OworICAgIGZsb2F0IGNvbnZlcnRUb0Zsb2F0KCkgY29uc3Q7CisKKyAgICAvKiBUaGUgZGVmaW5pdGlvbiBvZiBlcXVhbGl0eSBpcyBub3Qgc3RyYWlnaHRmb3J3YXJkIGZvciBmbG9hdGluZyBwb2ludCwKKyAgICAgICBzbyB3ZSB3b24ndCB1c2Ugb3BlcmF0b3I9PS4gIFVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgb3Igd3JpdGUKKyAgICAgICB3aGF0ZXZlciBpdCBpcyB5b3UgcmVhbGx5IG1lYW4uICovCisgICAgLy8gYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFQRmxvYXQgJikgY29uc3Q7ICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisKKyAgICAvKiBJRUVFIGNvbXBhcmlzb24gd2l0aCBhbm90aGVyIGZsb2F0aW5nIHBvaW50IG51bWJlciAoTmFOcworICAgICAgIGNvbXBhcmUgdW5vcmRlcmVkLCAwPT0tMCkuICovCisgICAgY21wUmVzdWx0IGNvbXBhcmUoY29uc3QgQVBGbG9hdCAmKSBjb25zdDsKKworICAgIC8qIEJpdHdpc2UgY29tcGFyaXNvbiBmb3IgZXF1YWxpdHkgKFFOYU5zIGNvbXBhcmUgZXF1YWwsIDAhPS0wKS4gKi8KKyAgICBib29sIGJpdHdpc2VJc0VxdWFsKGNvbnN0IEFQRmxvYXQgJikgY29uc3Q7CisKKyAgICAvKiBXcml0ZSBvdXQgYSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmxvYXRpbmcgcG9pbnQKKyAgICAgICB2YWx1ZSB0byBEU1QsIHdoaWNoIG11c3QgYmUgb2Ygc3VmZmljaWVudCBzaXplLCBpbiB0aGUgQzk5IGZvcm0KKyAgICAgICBbLV0weGguaGhoaHBbKy1dZC4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwKKyAgICAgICBleGNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTC4gICovCisgICAgdW5zaWduZWQgaW50IGNvbnZlcnRUb0hleFN0cmluZyhjaGFyICpkc3QsIHVuc2lnbmVkIGludCBoZXhEaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVwcGVyQ2FzZSwgcm91bmRpbmdNb2RlKSBjb25zdDsKKworICAgIC8qIFNpbXBsZSBxdWVyaWVzLiAgKi8KKyAgICBmbHRDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIGNhdGVnb3J5OyB9CisgICAgY29uc3QgZmx0U2VtYW50aWNzICZnZXRTZW1hbnRpY3MoKSBjb25zdCB7IHJldHVybiAqc2VtYW50aWNzOyB9CisgICAgYm9vbCBpc1plcm8oKSBjb25zdCB7IHJldHVybiBjYXRlZ29yeSA9PSBmY1plcm87IH0KKyAgICBib29sIGlzTm9uWmVybygpIGNvbnN0IHsgcmV0dXJuIGNhdGVnb3J5ICE9IGZjWmVybzsgfQorICAgIGJvb2wgaXNOYU4oKSBjb25zdCB7IHJldHVybiBjYXRlZ29yeSA9PSBmY05hTjsgfQorICAgIGJvb2wgaXNJbmZpbml0eSgpIGNvbnN0IHsgcmV0dXJuIGNhdGVnb3J5ID09IGZjSW5maW5pdHk7IH0KKyAgICBib29sIGlzTmVnYXRpdmUoKSBjb25zdCB7IHJldHVybiBzaWduOyB9CisgICAgYm9vbCBpc1Bvc1plcm8oKSBjb25zdCB7IHJldHVybiBpc1plcm8oKSAmJiAhaXNOZWdhdGl2ZSgpOyB9CisgICAgYm9vbCBpc05lZ1plcm8oKSBjb25zdCB7IHJldHVybiBpc1plcm8oKSAmJiBpc05lZ2F0aXZlKCk7IH0KKworICAgIEFQRmxvYXQmIG9wZXJhdG9yPShjb25zdCBBUEZsb2F0ICYpOworCisgICAgLyogUmV0dXJuIGFuIGFyYml0cmFyeSBpbnRlZ2VyIHZhbHVlIHVzYWJsZSBmb3IgaGFzaGluZy4gKi8KKyAgICB1aW50MzJfdCBnZXRIYXNoVmFsdWUoKSBjb25zdDsKKworICAgIC8vLyBDb252ZXJ0cyB0aGlzIHZhbHVlIGludG8gYSBkZWNpbWFsIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIEZvcm1hdFByZWNpc2lvbiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzIG9mCisgICAgLy8vICAgcHJlY2lzaW9uIHRvIG91dHB1dC4gIElmIHRoZXJlIGFyZSBmZXdlciBkaWdpdHMgYXZhaWxhYmxlLAorICAgIC8vLyAgIHplcm8gcGFkZGluZyB3aWxsIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgdmFsdWUgaXMKKyAgICAvLy8gICBpbnRlZ3JhbCBhbmQgc21hbGwgZW5vdWdoIHRvIGJlIGV4cHJlc3NlZCBpbgorICAgIC8vLyAgIEZvcm1hdFByZWNpc2lvbiBkaWdpdHMuICAwIG1lYW5zIHRvIHVzZSB0aGUgbmF0dXJhbAorICAgIC8vLyAgIHByZWNpc2lvbiBvZiB0aGUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gRm9ybWF0TWF4UGFkZGluZyBUaGUgbWF4aW11bSBudW1iZXIgb2YgemVyb3MgdG8KKyAgICAvLy8gICBjb25zaWRlciBpbnNlcnRpbmcgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBzY2llbnRpZmljCisgICAgLy8vICAgbm90YXRpb24uICAwIG1lYW5zIHRvIGFsd2F5cyB1c2Ugc2NpZW50aWZpYyBub3RhdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gTnVtYmVyICAgICAgIFByZWNpc2lvbiAgICBNYXhQYWRkaW5nICAgICAgUmVzdWx0CisgICAgLy8vIC0tLS0tLSAgICAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLQorICAgIC8vLyAxLjAxRSs0ICAgICAgICAgICAgICA1ICAgICAgICAgICAgIDIgICAgICAgMTAxMDAKKyAgICAvLy8gMS4wMUUrNCAgICAgICAgICAgICAgNCAgICAgICAgICAgICAyICAgICAgIDEuMDFFKzQKKyAgICAvLy8gMS4wMUUrNCAgICAgICAgICAgICAgNSAgICAgICAgICAgICAxICAgICAgIDEuMDFFKzQKKyAgICAvLy8gMS4wMUUtMiAgICAgICAgICAgICAgNSAgICAgICAgICAgICAyICAgICAgIDAuMDEwMQorICAgIC8vLyAxLjAxRS0yICAgICAgICAgICAgICA0ICAgICAgICAgICAgIDIgICAgICAgMC4wMTAxCisgICAgLy8vIDEuMDFFLTIgICAgICAgICAgICAgIDQgICAgICAgICAgICAgMSAgICAgICAxLjAxRS0yCisgICAgdm9pZCB0b1N0cmluZyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZvcm1hdFByZWNpc2lvbiA9IDAsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGb3JtYXRNYXhQYWRkaW5nID0gMykgY29uc3Q7CisKKyAgcHJpdmF0ZToKKworICAgIC8qIFRyaXZpYWwgcXVlcmllcy4gICovCisgICAgaW50ZWdlclBhcnQgKnNpZ25pZmljYW5kUGFydHMoKTsKKyAgICBjb25zdCBpbnRlZ2VyUGFydCAqc2lnbmlmaWNhbmRQYXJ0cygpIGNvbnN0OworICAgIHVuc2lnbmVkIGludCBwYXJ0Q291bnQoKSBjb25zdDsKKworICAgIC8qIFNpZ25pZmljYW5kIG9wZXJhdGlvbnMuICAqLworICAgIGludGVnZXJQYXJ0IGFkZFNpZ25pZmljYW5kKGNvbnN0IEFQRmxvYXQgJik7CisgICAgaW50ZWdlclBhcnQgc3VidHJhY3RTaWduaWZpY2FuZChjb25zdCBBUEZsb2F0ICYsIGludGVnZXJQYXJ0KTsKKyAgICBsb3N0RnJhY3Rpb24gYWRkT3JTdWJ0cmFjdFNpZ25pZmljYW5kKGNvbnN0IEFQRmxvYXQgJiwgYm9vbCBzdWJ0cmFjdCk7CisgICAgbG9zdEZyYWN0aW9uIG11bHRpcGx5U2lnbmlmaWNhbmQoY29uc3QgQVBGbG9hdCAmLCBjb25zdCBBUEZsb2F0ICopOworICAgIGxvc3RGcmFjdGlvbiBkaXZpZGVTaWduaWZpY2FuZChjb25zdCBBUEZsb2F0ICYpOworICAgIHZvaWQgaW5jcmVtZW50U2lnbmlmaWNhbmQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgZmx0U2VtYW50aWNzICopOworICAgIHZvaWQgc2hpZnRTaWduaWZpY2FuZExlZnQodW5zaWduZWQgaW50KTsKKyAgICBsb3N0RnJhY3Rpb24gc2hpZnRTaWduaWZpY2FuZFJpZ2h0KHVuc2lnbmVkIGludCk7CisgICAgdW5zaWduZWQgaW50IHNpZ25pZmljYW5kTFNCKCkgY29uc3Q7CisgICAgdW5zaWduZWQgaW50IHNpZ25pZmljYW5kTVNCKCkgY29uc3Q7CisgICAgdm9pZCB6ZXJvU2lnbmlmaWNhbmQoKTsKKworICAgIC8qIEFyaXRobWV0aWMgb24gc3BlY2lhbCB2YWx1ZXMuICAqLworICAgIG9wU3RhdHVzIGFkZE9yU3VidHJhY3RTcGVjaWFscyhjb25zdCBBUEZsb2F0ICYsIGJvb2wgc3VidHJhY3QpOworICAgIG9wU3RhdHVzIGRpdmlkZVNwZWNpYWxzKGNvbnN0IEFQRmxvYXQgJik7CisgICAgb3BTdGF0dXMgbXVsdGlwbHlTcGVjaWFscyhjb25zdCBBUEZsb2F0ICYpOworICAgIG9wU3RhdHVzIG1vZFNwZWNpYWxzKGNvbnN0IEFQRmxvYXQgJik7CisKKyAgICAvKiBNaXNjZWxsYW55LiAgKi8KKyAgICBzdGF0aWMgQVBGbG9hdCBtYWtlTmFOKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIFNOYU4sIGJvb2wgTmVnYXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAqZmlsbCk7CisgICAgdm9pZCBtYWtlTmFOKGJvb2wgU05hTiA9IGZhbHNlLCBib29sIE5lZyA9IGZhbHNlLCBjb25zdCBBUEludCAqZmlsbCA9IDApOworICAgIG9wU3RhdHVzIG5vcm1hbGl6ZShyb3VuZGluZ01vZGUsIGxvc3RGcmFjdGlvbik7CisgICAgb3BTdGF0dXMgYWRkT3JTdWJ0cmFjdChjb25zdCBBUEZsb2F0ICYsIHJvdW5kaW5nTW9kZSwgYm9vbCBzdWJ0cmFjdCk7CisgICAgY21wUmVzdWx0IGNvbXBhcmVBYnNvbHV0ZVZhbHVlKGNvbnN0IEFQRmxvYXQgJikgY29uc3Q7CisgICAgb3BTdGF0dXMgaGFuZGxlT3ZlcmZsb3cocm91bmRpbmdNb2RlKTsKKyAgICBib29sIHJvdW5kQXdheUZyb21aZXJvKHJvdW5kaW5nTW9kZSwgbG9zdEZyYWN0aW9uLCB1bnNpZ25lZCBpbnQpIGNvbnN0OworICAgIG9wU3RhdHVzIGNvbnZlcnRUb1NpZ25FeHRlbmRlZEludGVnZXIoaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50LCBib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlLCBib29sICopIGNvbnN0OworICAgIG9wU3RhdHVzIGNvbnZlcnRGcm9tVW5zaWduZWRQYXJ0cyhjb25zdCBpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSk7CisgICAgb3BTdGF0dXMgY29udmVydEZyb21IZXhhZGVjaW1hbFN0cmluZyhTdHJpbmdSZWYsIHJvdW5kaW5nTW9kZSk7CisgICAgb3BTdGF0dXMgY29udmVydEZyb21EZWNpbWFsU3RyaW5nKFN0cmluZ1JlZiwgcm91bmRpbmdNb2RlKTsKKyAgICBjaGFyICpjb252ZXJ0Tm9ybWFsVG9IZXhTdHJpbmcoY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSkgY29uc3Q7CisgICAgb3BTdGF0dXMgcm91bmRTaWduaWZpY2FuZFdpdGhFeHBvbmVudChjb25zdCBpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIHJvdW5kaW5nTW9kZSk7CisKKyAgICBBUEludCBjb252ZXJ0SGFsZkFQRmxvYXRUb0FQSW50KCkgY29uc3Q7CisgICAgQVBJbnQgY29udmVydEZsb2F0QVBGbG9hdFRvQVBJbnQoKSBjb25zdDsKKyAgICBBUEludCBjb252ZXJ0RG91YmxlQVBGbG9hdFRvQVBJbnQoKSBjb25zdDsKKyAgICBBUEludCBjb252ZXJ0UXVhZHJ1cGxlQVBGbG9hdFRvQVBJbnQoKSBjb25zdDsKKyAgICBBUEludCBjb252ZXJ0RjgwTG9uZ0RvdWJsZUFQRmxvYXRUb0FQSW50KCkgY29uc3Q7CisgICAgQVBJbnQgY29udmVydFBQQ0RvdWJsZURvdWJsZUFQRmxvYXRUb0FQSW50KCkgY29uc3Q7CisgICAgdm9pZCBpbml0RnJvbUFQSW50KGNvbnN0IEFQSW50JiBhcGksIGJvb2wgaXNJRUVFID0gZmFsc2UpOworICAgIHZvaWQgaW5pdEZyb21IYWxmQVBJbnQoY29uc3QgQVBJbnQmIGFwaSk7CisgICAgdm9pZCBpbml0RnJvbUZsb2F0QVBJbnQoY29uc3QgQVBJbnQmIGFwaSk7CisgICAgdm9pZCBpbml0RnJvbURvdWJsZUFQSW50KGNvbnN0IEFQSW50JiBhcGkpOworICAgIHZvaWQgaW5pdEZyb21RdWFkcnVwbGVBUEludChjb25zdCBBUEludCAmYXBpKTsKKyAgICB2b2lkIGluaXRGcm9tRjgwTG9uZ0RvdWJsZUFQSW50KGNvbnN0IEFQSW50JiBhcGkpOworICAgIHZvaWQgaW5pdEZyb21QUENEb3VibGVEb3VibGVBUEludChjb25zdCBBUEludCYgYXBpKTsKKworICAgIHZvaWQgYXNzaWduKGNvbnN0IEFQRmxvYXQgJik7CisgICAgdm9pZCBjb3B5U2lnbmlmaWNhbmQoY29uc3QgQVBGbG9hdCAmKTsKKyAgICB2b2lkIGZyZWVTaWduaWZpY2FuZCgpOworCisgICAgLyogV2hhdCBraW5kIG9mIHNlbWFudGljcyBkb2VzIHRoaXMgdmFsdWUgb2JleT8gICovCisgICAgY29uc3QgZmx0U2VtYW50aWNzICpzZW1hbnRpY3M7CisKKyAgICAvKiBTaWduaWZpY2FuZCAtIHRoZSBmcmFjdGlvbiB3aXRoIGFuIGV4cGxpY2l0IGludGVnZXIgYml0LiAgTXVzdCBiZQorICAgICAgIGF0IGxlYXN0IG9uZSBiaXQgd2lkZXIgdGhhbiB0aGUgdGFyZ2V0IHByZWNpc2lvbi4gICovCisgICAgdW5pb24gU2lnbmlmaWNhbmQKKyAgICB7CisgICAgICBpbnRlZ2VyUGFydCBwYXJ0OworICAgICAgaW50ZWdlclBhcnQgKnBhcnRzOworICAgIH0gc2lnbmlmaWNhbmQ7CisKKyAgICAvKiBUaGUgZXhwb25lbnQgLSBhIHNpZ25lZCBudW1iZXIuICAqLworICAgIGV4cG9uZW50X3QgZXhwb25lbnQ7CisKKyAgICAvKiBXaGF0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRoaXMgaXMuICAqLworICAgIC8qIE9ubHkgMiBiaXRzIGFyZSByZXF1aXJlZCwgYnV0IFZpc3VhbFN0dWRpbyBpbmNvcnJlY3RseSBzaWduIGV4dGVuZHMKKyAgICAgICBpdC4gIFVzaW5nIHRoZSBleHRyYSBiaXQga2VlcHMgaXQgZnJvbSBmYWlsaW5nIHVuZGVyIFZpc3VhbFN0dWRpbyAqLworICAgIGZsdENhdGVnb3J5IGNhdGVnb3J5OiAzOworCisgICAgLyogVGhlIHNpZ24gYml0IG9mIHRoaXMgbnVtYmVyLiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2lnbjogMTsKKworICAgIC8qIEZvciBQUENEb3VibGVEb3VibGUsIHdlIGhhdmUgYSBzZWNvbmQgZXhwb25lbnQgYW5kIHNpZ24gKHRoZSBzZWNvbmQKKyAgICAgICBzaWduaWZpY2FuZCBpcyBhcHBlbmRlZCB0byB0aGUgZmlyc3Qgb25lLCBhbHRob3VnaCBpdCB3b3VsZCBiZSB3cm9uZyB0bworICAgICAgIHJlZ2FyZCB0aGVzZSBhcyBhIHNpbmdsZSBudW1iZXIgZm9yIGFyaXRobWV0aWMgcHVycG9zZXMpLiAgVGhlc2UgZmllbGRzCisgICAgICAgYXJlIG5vdCBtZWFuaW5nZnVsIGZvciBhbnkgb3RoZXIgdHlwZS4gKi8KKyAgICBleHBvbmVudF90IGV4cG9uZW50MiA6IDExOworICAgIHVuc2lnbmVkIGludCBzaWduMjogMTsKKyAgfTsKK30gLyogbmFtZXNwYWNlIGxsdm0gKi8KKworI2VuZGlmIC8qIExMVk1fRkxPQVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9BUEludC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9BUEludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTAyM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0FQSW50LmgKQEAgLTAsMCArMSwxNzA4IEBACisvLz09PS0tIGxsdm0vQURUL0FQSW50LmggLSBGb3IgQXJiaXRyYXJ5IFByZWNpc2lvbiBJbnRlZ2VyIC0tLS0tKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgY2xhc3MgdG8gcmVwcmVzZW50IGFyYml0cmFyeSBwcmVjaXNpb24gaW50ZWdyYWwKKy8vIGNvbnN0YW50IHZhbHVlcyBhbmQgb3BlcmF0aW9ucyBvbiB0aGVtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BUElOVF9ICisjZGVmaW5lIExMVk1fQVBJTlRfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgU2VyaWFsaXplcjsKKyAgY2xhc3MgRGVzZXJpYWxpemVyOworICBjbGFzcyBGb2xkaW5nU2V0Tm9kZUlEOworICBjbGFzcyByYXdfb3N0cmVhbTsKKyAgY2xhc3MgU3RyaW5nUmVmOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKworICAvLyBBbiB1bnNpZ25lZCBob3N0IHR5cGUgdXNlZCBhcyBhIHNpbmdsZSBwYXJ0IG9mIGEgbXVsdGktcGFydAorICAvLyBiaWdudW0uCisgIHR5cGVkZWYgdWludDY0X3QgaW50ZWdlclBhcnQ7CisKKyAgY29uc3QgdW5zaWduZWQgaW50IGhvc3RfY2hhcl9iaXQgPSA4OworICBjb25zdCB1bnNpZ25lZCBpbnQgaW50ZWdlclBhcnRXaWR0aCA9IGhvc3RfY2hhcl9iaXQgKgorICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc2l6ZW9mKGludGVnZXJQYXJ0KSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQVBJbnQgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYXJiaXRyYXJ5IHByZWNpc2lvbiBjb25zdGFudCBpbnRlZ3JhbCB2YWx1ZXMuCisvLy8gSXQgaXMgYSBmdW5jdGlvbmFsIHJlcGxhY2VtZW50IGZvciBjb21tb24gY2FzZSB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgbGlrZQorLy8vICJ1bnNpZ25lZCIsICJ1bnNpZ25lZCBsb25nIiBvciAidWludDY0X3QiLCBidXQgYWxzbyBhbGxvd3Mgbm9uLWJ5dGUtd2lkdGgKKy8vLyBpbnRlZ2VyIHNpemVzIGFuZCBsYXJnZSBpbnRlZ2VyIHZhbHVlIHR5cGVzIHN1Y2ggYXMgMy1iaXRzLCAxNS1iaXRzLCBvciBtb3JlCisvLy8gdGhhbiA2NC1iaXRzIG9mIHByZWNpc2lvbi4gQVBJbnQgcHJvdmlkZXMgYSB2YXJpZXR5IG9mIGFyaXRobWV0aWMgb3BlcmF0b3JzCisvLy8gYW5kIG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBpbnRlZ2VyIHZhbHVlcyBvZiBhbnkgYml0LXdpZHRoLiBJdCBzdXBwb3J0cyBib3RoCisvLy8gdGhlIHR5cGljYWwgaW50ZWdlciBhcml0aG1ldGljIGFuZCBjb21wYXJpc29uIG9wZXJhdGlvbnMgYXMgd2VsbCBhcyBiaXR3aXNlCisvLy8gbWFuaXB1bGF0aW9uLgorLy8vCisvLy8gVGhlIGNsYXNzIGhhcyBzZXZlcmFsIGludmFyaWFudHMgd29ydGggbm90aW5nOgorLy8vICAgKiBBbGwgYml0LCBieXRlLCBhbmQgd29yZCBwb3NpdGlvbnMgYXJlIHplcm8tYmFzZWQuCisvLy8gICAqIE9uY2UgdGhlIGJpdCB3aWR0aCBpcyBzZXQsIGl0IGRvZXNuJ3QgY2hhbmdlIGV4Y2VwdCBieSB0aGUgVHJ1bmNhdGUsCisvLy8gICAgIFNpZ25FeHRlbmQsIG9yIFplcm9FeHRlbmQgb3BlcmF0aW9ucy4KKy8vLyAgICogQWxsIGJpbmFyeSBvcGVyYXRvcnMgbXVzdCBiZSBvbiBBUEludCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYml0IHdpZHRoLgorLy8vICAgICBBdHRlbXB0aW5nIHRvIHVzZSB0aGVzZSBvcGVyYXRvcnMgb24gaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGJpdAorLy8vICAgICB3aWR0aHMgd2lsbCB5aWVsZCBhbiBhc3NlcnRpb24uCisvLy8gICAqIFRoZSB2YWx1ZSBpcyBzdG9yZWQgY2Fub25pY2FsbHkgYXMgYW4gdW5zaWduZWQgdmFsdWUuIEZvciBvcGVyYXRpb25zCisvLy8gICAgIHdoZXJlIGl0IG1ha2VzIGEgZGlmZmVyZW5jZSwgdGhlcmUgYXJlIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCB2YXJpYW50cworLy8vICAgICBvZiB0aGUgb3BlcmF0aW9uLiBGb3IgZXhhbXBsZSwgc2RpdiBhbmQgdWRpdi4gSG93ZXZlciwgYmVjYXVzZSB0aGUgYml0CisvLy8gICAgIHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lLCBvcGVyYXRpb25zIHN1Y2ggYXMgTXVsIGFuZCBBZGQgcHJvZHVjZSB0aGUgc2FtZQorLy8vICAgICByZXN1bHRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBzaWduZWQgb3IKKy8vLyAgICAgbm90LgorLy8vICAgKiBJbiBnZW5lcmFsLCB0aGUgY2xhc3MgdHJpZXMgdG8gZm9sbG93IHRoZSBzdHlsZSBvZiBjb21wdXRhdGlvbiB0aGF0IExMVk0KKy8vLyAgICAgdXNlcyBpbiBpdHMgSVIuIFRoaXMgc2ltcGxpZmllcyBpdHMgdXNlIGZvciBMTFZNLgorLy8vCisvLy8gQGJyaWVmIENsYXNzIGZvciBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXJzLgorY2xhc3MgQVBJbnQgeworICB1bnNpZ25lZCBCaXRXaWR0aDsgICAgICAvLy88IFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGlzIEFQSW50LgorCisgIC8vLyBUaGlzIHVuaW9uIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGludGVnZXIgdmFsdWUuIFdoZW4gdGhlCisgIC8vLyBpbnRlZ2VyIGJpdC13aWR0aCA8PSA2NCwgaXQgdXNlcyBWQUwsIG90aGVyd2lzZSBpdCB1c2VzIHBWYWwuCisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCBWQUw7ICAgIC8vLzwgVXNlZCB0byBzdG9yZSB0aGUgPD0gNjQgYml0cyBpbnRlZ2VyIHZhbHVlLgorICAgIHVpbnQ2NF90ICpwVmFsOyAgLy8vPCBVc2VkIHRvIHN0b3JlIHRoZSA+NjQgYml0cyBpbnRlZ2VyIHZhbHVlLgorICB9OworCisgIC8vLyBUaGlzIGVudW0gaXMgdXNlZCB0byBob2xkIHRoZSBjb25zdGFudHMgd2UgbmVlZGVkIGZvciBBUEludC4KKyAgZW51bSB7CisgICAgLy8vIEJpdHMgaW4gYSB3b3JkCisgICAgQVBJTlRfQklUU19QRVJfV09SRCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc2l6ZW9mKHVpbnQ2NF90KSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSX0JJVCwKKyAgICAvLy8gQnl0ZSBzaXplIG9mIGEgd29yZAorICAgIEFQSU5UX1dPUkRfU0laRSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc2l6ZW9mKHVpbnQ2NF90KSkKKyAgfTsKKworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIG9ubHkgaW50ZXJuYWxseSBmb3Igc3BlZWQgb2YgY29uc3RydWN0aW9uIG9mCisgIC8vLyB0ZW1wb3Jhcmllcy4gSXQgaXMgdW5zYWZlIGZvciBnZW5lcmFsIHVzZSBzbyBpdCBpcyBub3QgcHVibGljLgorICAvLy8gQGJyaWVmIEZhc3QgaW50ZXJuYWwgY29uc3RydWN0b3IKKyAgQVBJbnQodWludDY0X3QqIHZhbCwgdW5zaWduZWQgYml0cykgOiBCaXRXaWR0aChiaXRzKSwgcFZhbCh2YWwpIHsgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgb2YgYml0cyA8PSA2NCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIEFQSW50IGp1c3QgaGFzIG9uZSB3b3JkIHRvIHN0b3JlIHZhbHVlLgorICBib29sIGlzU2luZ2xlV29yZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0V2lkdGggPD0gQVBJTlRfQklUU19QRVJfV09SRDsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0aGUgd29yZCBwb3NpdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBiaXQgcG9zaXRpb24uCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIHdoaWNoIHdvcmQgYSBiaXQgaXMgaW4uCisgIHN0YXRpYyB1bnNpZ25lZCB3aGljaFdvcmQodW5zaWduZWQgYml0UG9zaXRpb24pIHsKKyAgICByZXR1cm4gYml0UG9zaXRpb24gLyBBUElOVF9CSVRTX1BFUl9XT1JEOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRoZSBiaXQgcG9zaXRpb24gaW4gYSB3b3JkIGZvciB0aGUgc3BlY2lmaWVkIGJpdCBwb3NpdGlvbgorICAvLy8gaW4gdGhlIEFQSW50LgorICAvLy8gQGJyaWVmIERldGVybWluZSB3aGljaCBiaXQgaW4gYSB3b3JkIGEgYml0IGlzIGluLgorICBzdGF0aWMgdW5zaWduZWQgd2hpY2hCaXQodW5zaWduZWQgYml0UG9zaXRpb24pIHsKKyAgICByZXR1cm4gYml0UG9zaXRpb24gJSBBUElOVF9CSVRTX1BFUl9XT1JEOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhbmQgcmV0dXJucyBhIHVpbnQ2NF90ICh3b3JkKSBtYXNrIGZvciBhIHNpbmdsZQorICAvLy8gYml0IGF0IGEgc3BlY2lmaWMgYml0IHBvc2l0aW9uLiBUaGlzIGlzIHVzZWQgdG8gbWFzayB0aGUgYml0IGluIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyB3b3JkLgorICAvLy8gQHJldHVybnMgYSB1aW50NjRfdCB3aXRoIG9ubHkgYml0IGF0ICJ3aGljaEJpdChiaXRQb3NpdGlvbikiIHNldAorICAvLy8gQGJyaWVmIEdldCBhIHNpbmdsZSBiaXQgbWFzay4KKyAgc3RhdGljIHVpbnQ2NF90IG1hc2tCaXQodW5zaWduZWQgYml0UG9zaXRpb24pIHsKKyAgICByZXR1cm4gMVVMTCA8PCB3aGljaEJpdChiaXRQb3NpdGlvbik7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGNsZWFyIHRoZSB0byAiTiIgYml0cyBpbiB0aGUgaGlnaCBvcmRlcgorICAvLy8gd29yZCB0aGF0IGFyZSBub3QgdXNlZCBieSB0aGUgQVBJbnQuIFRoaXMgaXMgbmVlZGVkIGFmdGVyIHRoZSBtb3N0CisgIC8vLyBzaWduaWZpY2FudCB3b3JkIGlzIGFzc2lnbmVkIGEgdmFsdWUgdG8gZW5zdXJlIHRoYXQgdGhvc2UgYml0cyBhcmUKKyAgLy8vIHplcm8nZCBvdXQuCisgIC8vLyBAYnJpZWYgQ2xlYXIgdW51c2VkIGhpZ2ggb3JkZXIgYml0cworICBBUEludCYgY2xlYXJVbnVzZWRCaXRzKCkgeworICAgIC8vIENvbXB1dGUgaG93IG1hbnkgYml0cyBhcmUgdXNlZCBpbiB0aGUgZmluYWwgd29yZAorICAgIHVuc2lnbmVkIHdvcmRCaXRzID0gQml0V2lkdGggJSBBUElOVF9CSVRTX1BFUl9XT1JEOworICAgIGlmICh3b3JkQml0cyA9PSAwKQorICAgICAgLy8gSWYgYWxsIGJpdHMgYXJlIHVzZWQsIHdlIHdhbnQgdG8gbGVhdmUgdGhlIHZhbHVlIGFsb25lLiBUaGlzIGFsc28KKyAgICAgIC8vIGF2b2lkcyB0aGUgdW5kZWZpbmVkIGJlaGF2aW9yIG9mID4+IHdoZW4gdGhlIHNoaWZ0IGlzIHRoZSBzYW1lIHNpemUgYXMKKyAgICAgIC8vIHRoZSB3b3JkIHNpemUgKDY0KS4KKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIC8vIE1hc2sgb3V0IHRoZSBoaWdoIGJpdHMuCisgICAgdWludDY0X3QgbWFzayA9IH51aW50NjRfdCgwVUxMKSA+PiAoQVBJTlRfQklUU19QRVJfV09SRCAtIHdvcmRCaXRzKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICBWQUwgJj0gbWFzazsKKyAgICBlbHNlCisgICAgICBwVmFsW2dldE51bVdvcmRzKCkgLSAxXSAmPSBtYXNrOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB3b3JkIGZvciB0aGUgc3BlY2lmaWVkIGJpdCBwb3NpdGlvbi4KKyAgLy8vIEBicmllZiBHZXQgdGhlIHdvcmQgY29ycmVzcG9uZGluZyB0byBhIGJpdCBwb3NpdGlvbgorICB1aW50NjRfdCBnZXRXb3JkKHVuc2lnbmVkIGJpdFBvc2l0aW9uKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU2luZ2xlV29yZCgpID8gVkFMIDogcFZhbFt3aGljaFdvcmQoYml0UG9zaXRpb24pXTsKKyAgfQorCisgIC8vLyBDb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgbnVtYmVyLiAgVGhlIHN0cmluZyBtdXN0IGJlIG5vbi1lbXB0eQorICAvLy8gYW5kIHdlbGwtZm9ybWVkIGFzIGEgbnVtYmVyIG9mIHRoZSBnaXZlbiBiYXNlLiBUaGUgYml0LXdpZHRoCisgIC8vLyBtdXN0IGJlIHN1ZmZpY2llbnQgdG8gaG9sZCB0aGUgcmVzdWx0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCBieSB0aGUgY29uc3RydWN0b3JzIHRoYXQgdGFrZSBzdHJpbmcgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIFN0cmluZ1JlZjo6Z2V0QXNJbnRlZ2VyIGlzIHN1cGVyZmljaWFsbHkgc2ltaWxhciBidXQgKDEpIGRvZXMKKyAgLy8vIG5vdCBhc3N1bWUgdGhhdCB0aGUgc3RyaW5nIGlzIHdlbGwtZm9ybWVkIGFuZCAoMikgZ3Jvd3MgdGhlCisgIC8vLyByZXN1bHQgdG8gaG9sZCB0aGUgaW5wdXQuCisgIC8vLworICAvLy8gQHBhcmFtIHJhZGl4IDIsIDgsIDEwLCBvciAxNgorICAvLy8gQGJyaWVmIENvbnZlcnQgYSBjaGFyIGFycmF5IGludG8gYW4gQVBJbnQKKyAgdm9pZCBmcm9tU3RyaW5nKHVuc2lnbmVkIG51bUJpdHMsIFN0cmluZ1JlZiBzdHIsIHVpbnQ4X3QgcmFkaXgpOworCisgIC8vLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHRvU3RyaW5nIG1ldGhvZCB0byBkaXZpZGUgYnkgdGhlIHJhZGl4LiBJdCBzaW1wbHkKKyAgLy8vIHByb3ZpZGVzIGEgbW9yZSBjb252ZW5pZW50IGZvcm0gb2YgZGl2aWRlIGZvciBpbnRlcm5hbCB1c2Ugc2luY2UgS251dGhEaXYKKyAgLy8vIGhhcyBzcGVjaWZpYyBjb25zdHJhaW50cyBvbiBpdHMgaW5wdXRzLiBJZiB0aG9zZSBjb25zdHJhaW50cyBhcmUgbm90IG1ldAorICAvLy8gdGhlbiBpdCBwcm92aWRlcyBhIHNpbXBsZXIgZm9ybSBvZiBkaXZpZGUuCisgIC8vLyBAYnJpZWYgQW4gaW50ZXJuYWwgZGl2aXNpb24gZnVuY3Rpb24gZm9yIGRpdmlkaW5nIEFQSW50cy4KKyAgc3RhdGljIHZvaWQgZGl2aWRlKGNvbnN0IEFQSW50IExIUywgdW5zaWduZWQgbGhzV29yZHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmUkhTLCB1bnNpZ25lZCByaHNXb3JkcywKKyAgICAgICAgICAgICAgICAgICAgIEFQSW50ICpRdW90aWVudCwgQVBJbnQgKlJlbWFpbmRlcik7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgaW5saW5lIGNvbnN0cnVjdG9yCisgIHZvaWQgaW5pdFNsb3dDYXNlKHVuc2lnbmVkIG51bUJpdHMsIHVpbnQ2NF90IHZhbCwgYm9vbCBpc1NpZ25lZCk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgaW5saW5lIGNvcHkgY29uc3RydWN0b3IKKyAgdm9pZCBpbml0U2xvd0Nhc2UoY29uc3QgQVBJbnQmIHRoYXQpOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIHNobAorICBBUEludCBzaGxTbG93Q2FzZSh1bnNpZ25lZCBzaGlmdEFtdCkgY29uc3Q7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3Igb3BlcmF0b3ImCisgIEFQSW50IEFuZFNsb3dDYXNlKGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0OworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIG9wZXJhdG9yfAorICBBUEludCBPclNsb3dDYXNlKGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0OworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIG9wZXJhdG9yXgorICBBUEludCBYb3JTbG93Q2FzZShjb25zdCBBUEludCYgUkhTKSBjb25zdDsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBvcGVyYXRvcj0KKyAgQVBJbnQmIEFzc2lnblNsb3dDYXNlKGNvbnN0IEFQSW50JiBSSFMpOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIG9wZXJhdG9yPT0KKyAgYm9vbCBFcXVhbFNsb3dDYXNlKGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0OworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIG9wZXJhdG9yPT0KKyAgYm9vbCBFcXVhbFNsb3dDYXNlKHVpbnQ2NF90IFZhbCkgY29uc3Q7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgY291bnRMZWFkaW5nWmVyb3MKKyAgdW5zaWduZWQgY291bnRMZWFkaW5nWmVyb3NTbG93Q2FzZSgpIGNvbnN0OworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGNvdW50VHJhaWxpbmdPbmVzCisgIHVuc2lnbmVkIGNvdW50VHJhaWxpbmdPbmVzU2xvd0Nhc2UoKSBjb25zdDsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBjb3VudFBvcHVsYXRpb24KKyAgdW5zaWduZWQgY291bnRQb3B1bGF0aW9uU2xvd0Nhc2UoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgIC8vLyBAeworICAvLy8gSWYgaXNTaWduZWQgaXMgdHJ1ZSB0aGVuIHZhbCBpcyB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgYSBzaWduZWQgdmFsdWUKKyAgLy8vIChpLmUuIGFzIGFuIGludDY0X3QpIGFuZCB0aGUgYXBwcm9wcmlhdGUgc2lnbiBleHRlbnNpb24gdG8gdGhlIGJpdCB3aWR0aAorICAvLy8gd2lsbCBiZSBkb25lLiBPdGhlcndpc2UsIG5vIHNpZ24gZXh0ZW5zaW9uIG9jY3VycyAoaGlnaCBvcmRlciBiaXRzIGJleW9uZAorICAvLy8gdGhlIHJhbmdlIG9mIHZhbCBhcmUgemVybyBmaWxsZWQpLgorICAvLy8gQHBhcmFtIG51bUJpdHMgdGhlIGJpdCB3aWR0aCBvZiB0aGUgY29uc3RydWN0ZWQgQVBJbnQKKyAgLy8vIEBwYXJhbSB2YWwgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIEFQSW50CisgIC8vLyBAcGFyYW0gaXNTaWduZWQgaG93IHRvIHRyZWF0IHNpZ25lZG5lc3Mgb2YgdmFsCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgbmV3IEFQSW50IG9mIG51bUJpdHMgd2lkdGgsIGluaXRpYWxpemVkIGFzIHZhbC4KKyAgQVBJbnQodW5zaWduZWQgbnVtQml0cywgdWludDY0X3QgdmFsLCBib29sIGlzU2lnbmVkID0gZmFsc2UpCisgICAgOiBCaXRXaWR0aChudW1CaXRzKSwgVkFMKDApIHsKKyAgICBhc3NlcnQoQml0V2lkdGggJiYgImJpdHdpZHRoIHRvbyBzbWFsbCIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFZBTCA9IHZhbDsKKyAgICBlbHNlCisgICAgICBpbml0U2xvd0Nhc2UobnVtQml0cywgdmFsLCBpc1NpZ25lZCk7CisgICAgY2xlYXJVbnVzZWRCaXRzKCk7CisgIH0KKworICAvLy8gTm90ZSB0aGF0IG51bVdvcmRzIGNhbiBiZSBzbWFsbGVyIG9yIGxhcmdlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGJpdAorICAvLy8gd2lkdGggYnV0IGFueSBleHRyYW5lb3VzIGJpdHMgd2lsbCBiZSBkcm9wcGVkLgorICAvLy8gQHBhcmFtIG51bUJpdHMgdGhlIGJpdCB3aWR0aCBvZiB0aGUgY29uc3RydWN0ZWQgQVBJbnQKKyAgLy8vIEBwYXJhbSBudW1Xb3JkcyB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIGJpZ1ZhbAorICAvLy8gQHBhcmFtIGJpZ1ZhbCBhIHNlcXVlbmNlIG9mIHdvcmRzIHRvIGZvcm0gdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIEFQSW50CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFuIEFQSW50IG9mIG51bUJpdHMgd2lkdGgsIGluaXRpYWxpemVkIGFzIGJpZ1ZhbFtdLgorICBBUEludCh1bnNpZ25lZCBudW1CaXRzLCB1bnNpZ25lZCBudW1Xb3JkcywgY29uc3QgdWludDY0X3QgYmlnVmFsW10pOworCisgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGludGVycHJldHMgdGhlIHN0cmluZyBcYXJnIHN0ciBpbiB0aGUgZ2l2ZW4gcmFkaXguIFRoZQorICAvLy8gaW50ZXJwcmV0YXRpb24gc3RvcHMgd2hlbiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRoYXQgaXMgbm90IHN1aXRhYmxlIGZvciB0aGUKKyAgLy8vIHJhZGl4IGlzIGVuY291bnRlcmVkLCBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIEFjY2VwdGFibGUgcmFkaXggdmFsdWVzCisgIC8vLyBhcmUgMiwgOCwgMTAgYW5kIDE2LiBJdCBpcyBhbiBlcnJvciBmb3IgdGhlIHZhbHVlIGltcGxpZWQgYnkgdGhlIHN0cmluZyB0bworICAvLy8gcmVxdWlyZSBtb3JlIGJpdHMgdGhhbiBudW1CaXRzLgorICAvLy8KKyAgLy8vIEBwYXJhbSBudW1CaXRzIHRoZSBiaXQgd2lkdGggb2YgdGhlIGNvbnN0cnVjdGVkIEFQSW50CisgIC8vLyBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYmUgaW50ZXJwcmV0ZWQKKyAgLy8vIEBwYXJhbSByYWRpeCB0aGUgcmFkaXggdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbiAKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW4gQVBJbnQgZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgQVBJbnQodW5zaWduZWQgbnVtQml0cywgU3RyaW5nUmVmIHN0ciwgdWludDhfdCByYWRpeCk7CisKKyAgLy8vIFNpbXBseSBtYWtlcyAqdGhpcyBhIGNvcHkgb2YgdGhhdC4KKyAgLy8vIEBicmllZiBDb3B5IENvbnN0cnVjdG9yLgorICBBUEludChjb25zdCBBUEludCYgdGhhdCkKKyAgICA6IEJpdFdpZHRoKHRoYXQuQml0V2lkdGgpLCBWQUwoMCkgeworICAgIGFzc2VydChCaXRXaWR0aCAmJiAiYml0d2lkdGggdG9vIHNtYWxsIik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgVkFMID0gdGhhdC5WQUw7CisgICAgZWxzZQorICAgICAgaW5pdFNsb3dDYXNlKHRoYXQpOworICB9CisKKyAgLy8vIEBicmllZiBEZXN0cnVjdG9yLgorICB+QVBJbnQoKSB7CisgICAgaWYgKCFpc1NpbmdsZVdvcmQoKSkKKyAgICAgIGRlbGV0ZSBbXSBwVmFsOworICB9CisKKyAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IgdGhhdCBjcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgQVBJbnQuICBUaGlzIGlzIHVzZWZ1bAorICAvLy8gIGZvciBvYmplY3QgZGVzZXJpYWxpemF0aW9uIChwYWlyIHRoaXMgd2l0aCB0aGUgc3RhdGljIG1ldGhvZCBSZWFkKS4KKyAgZXhwbGljaXQgQVBJbnQoKSA6IEJpdFdpZHRoKDEpIHt9CisKKyAgLy8vIFByb2ZpbGUgLSBVc2VkIHRvIGluc2VydCBBUEludCBvYmplY3RzLCBvciBvYmplY3RzIHRoYXQgY29udGFpbiBBUEludAorICAvLy8gIG9iamVjdHMsIGludG8gRm9sZGluZ1NldHMuCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBpZCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBVc2VkIGJ5IHRoZSBCaXRjb2RlIHNlcmlhbGl6ZXIgdG8gZW1pdCBBUEludHMgdG8gQml0Y29kZS4KKyAgdm9pZCBFbWl0KFNlcmlhbGl6ZXImIFMpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgVXNlZCBieSB0aGUgQml0Y29kZSBkZXNlcmlhbGl6ZXIgdG8gZGVzZXJpYWxpemUgQVBJbnRzLgorICB2b2lkIFJlYWQoRGVzZXJpYWxpemVyJiBEKTsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFZhbHVlIFRlc3RzCisgIC8vLyBAeworICAvLy8gVGhpcyB0ZXN0cyB0aGUgaGlnaCBiaXQgb2YgdGhpcyBBUEludCB0byBkZXRlcm1pbmUgaWYgaXQgaXMgc2V0LgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGlzIEFQSW50IGlzIG5lZ2F0aXZlLCBmYWxzZSBvdGhlcndpc2UKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgc2lnbiBvZiB0aGlzIEFQSW50LgorICBib29sIGlzTmVnYXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuICgqdGhpcylbQml0V2lkdGggLSAxXTsKKyAgfQorCisgIC8vLyBUaGlzIHRlc3RzIHRoZSBoaWdoIGJpdCBvZiB0aGUgQVBJbnQgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHVuc2V0LgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIEFQSW50IFZhbHVlIGlzIG5vbi1uZWdhdGl2ZSAoPj0gMCkKKyAgYm9vbCBpc05vbk5lZ2F0aXZlKCkgY29uc3QgeworICAgIHJldHVybiAhaXNOZWdhdGl2ZSgpOworICB9CisKKyAgLy8vIFRoaXMgdGVzdHMgaWYgdGhlIHZhbHVlIG9mIHRoaXMgQVBJbnQgaXMgcG9zaXRpdmUgKD4gMCkuIE5vdGUKKyAgLy8vIHRoYXQgMCBpcyBub3QgYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhpcyBBUEludCBpcyBwb3NpdGl2ZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBBUEludCBWYWx1ZSBpcyBwb3NpdGl2ZS4KKyAgYm9vbCBpc1N0cmljdGx5UG9zaXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzTm9uTmVnYXRpdmUoKSAmJiAoKnRoaXMpICE9IDA7CisgIH0KKworICAvLy8gVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSB2YWx1ZSBoYXMgYWxsIGJpdHMgb2YgdGhlIEFQSW50IGFyZSBzZXQgb3Igbm90LgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiBhbGwgYml0cyBhcmUgc2V0CisgIGJvb2wgaXNBbGxPbmVzVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvdW50UG9wdWxhdGlvbigpID09IEJpdFdpZHRoOworICB9CisKKyAgLy8vIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBBUEludCBpcyB0aGUgbWF4aW11bSB1bnNpZ25lZAorICAvLy8gdmFsdWUgZm9yIHRoZSBBUEludCdzIGJpdCB3aWR0aC4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgbGFyZ2VzdCB1bnNpZ25lZCB2YWx1ZS4KKyAgYm9vbCBpc01heFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBjb3VudFBvcHVsYXRpb24oKSA9PSBCaXRXaWR0aDsKKyAgfQorCisgIC8vLyBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgQVBJbnQgaXMgdGhlIG1heGltdW0gc2lnbmVkCisgIC8vLyB2YWx1ZSBmb3IgdGhlIEFQSW50J3MgYml0IHdpZHRoLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIHRoZSBsYXJnZXN0IHNpZ25lZCB2YWx1ZS4KKyAgYm9vbCBpc01heFNpZ25lZFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBCaXRXaWR0aCA9PSAxID8gVkFMID09IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNOZWdhdGl2ZSgpICYmIGNvdW50UG9wdWxhdGlvbigpID09IEJpdFdpZHRoIC0gMTsKKyAgfQorCisgIC8vLyBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgQVBJbnQgaXMgdGhlIG1pbmltdW0gdW5zaWduZWQKKyAgLy8vIHZhbHVlIGZvciB0aGUgQVBJbnQncyBiaXQgd2lkdGguCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaXMgdGhlIHNtYWxsZXN0IHVuc2lnbmVkIHZhbHVlLgorICBib29sIGlzTWluVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvdW50UG9wdWxhdGlvbigpID09IDA7CisgIH0KKworICAvLy8gVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50IGlzIHRoZSBtaW5pbXVtIHNpZ25lZAorICAvLy8gdmFsdWUgZm9yIHRoZSBBUEludCdzIGJpdCB3aWR0aC4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgc21hbGxlc3Qgc2lnbmVkIHZhbHVlLgorICBib29sIGlzTWluU2lnbmVkVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIEJpdFdpZHRoID09IDEgPyBWQUwgPT0gMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05lZ2F0aXZlKCkgJiYgY291bnRQb3B1bGF0aW9uKCkgPT0gMTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQ2hlY2sgaWYgdGhpcyBBUEludCBoYXMgYW4gTi1iaXRzIHVuc2lnbmVkIGludGVnZXIgdmFsdWUuCisgIGJvb2wgaXNJbnROKHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoTiAmJiAiTiA9PSAwID8/PyIpOworICAgIGlmIChOID49IGdldEJpdFdpZHRoKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBWQUwgPT0gKFZBTCAmICh+MFVMTCA+PiAoNjQgLSBOKSkpOworICAgIEFQSW50IFRtcChOLCBnZXROdW1Xb3JkcygpLCBwVmFsKTsKKyAgICBUbXAuemV4dChnZXRCaXRXaWR0aCgpKTsKKyAgICByZXR1cm4gVG1wID09ICgqdGhpcyk7CisgIH0KKworICAvLy8gQGJyaWVmIENoZWNrIGlmIHRoaXMgQVBJbnQgaGFzIGFuIE4tYml0cyBzaWduZWQgaW50ZWdlciB2YWx1ZS4KKyAgYm9vbCBpc1NpZ25lZEludE4odW5zaWduZWQgTikgY29uc3QgeworICAgIGFzc2VydChOICYmICJOID09IDAgPz8/Iik7CisgICAgcmV0dXJuIGdldE1pblNpZ25lZEJpdHMoKSA8PSBOOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IEFQSW50IHZhbHVlIGlzIGEgcG93ZXIgb2YgdHdvID4gMC4KKyAgYm9vbCBpc1Bvd2VyT2YyKCkgY29uc3Q7CisKKyAgLy8vIGlzU2lnbkJpdCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldFNpZ25CaXQuCisgIGJvb2wgaXNTaWduQml0KCkgY29uc3QgeyByZXR1cm4gaXNNaW5TaWduZWRWYWx1ZSgpOyB9CisKKyAgLy8vIFRoaXMgY29udmVydHMgdGhlIEFQSW50IHRvIGEgYm9vbGVhbiB2YWx1ZSBhcyBhIHRlc3QgYWdhaW5zdCB6ZXJvLgorICAvLy8gQGJyaWVmIEJvb2xlYW4gY29udmVyc2lvbiBmdW5jdGlvbi4KKyAgYm9vbCBnZXRCb29sVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuICp0aGlzICE9IDA7CisgIH0KKworICAvLy8gZ2V0TGltaXRlZFZhbHVlIC0gSWYgdGhpcyB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsaW1pdCwKKyAgLy8vIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbGltaXQgdmFsdWUuICBUaGlzIGNhdXNlcyB0aGUgdmFsdWUKKyAgLy8vIHRvIHNhdHVyYXRlIHRvIHRoZSBsaW1pdC4KKyAgdWludDY0X3QgZ2V0TGltaXRlZFZhbHVlKHVpbnQ2NF90IExpbWl0ID0gfjBVTEwpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldEFjdGl2ZUJpdHMoKSA+IDY0IHx8IGdldFpFeHRWYWx1ZSgpID4gTGltaXQpID8KKyAgICAgIExpbWl0IDogIGdldFpFeHRWYWx1ZSgpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBWYWx1ZSBHZW5lcmF0b3JzCisgIC8vLyBAeworICAvLy8gQGJyaWVmIEdldHMgbWF4aW11bSB1bnNpZ25lZCB2YWx1ZSBvZiBBUEludCBmb3Igc3BlY2lmaWMgYml0IHdpZHRoLgorICBzdGF0aWMgQVBJbnQgZ2V0TWF4VmFsdWUodW5zaWduZWQgbnVtQml0cykgeworICAgIHJldHVybiBBUEludChudW1CaXRzLCAwKS5zZXQoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0cyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBvZiBBUEludCBmb3IgYSBzcGVjaWZpYyBiaXQgd2lkdGguCisgIHN0YXRpYyBBUEludCBnZXRTaWduZWRNYXhWYWx1ZSh1bnNpZ25lZCBudW1CaXRzKSB7CisgICAgcmV0dXJuIEFQSW50KG51bUJpdHMsIDApLnNldCgpLmNsZWFyKG51bUJpdHMgLSAxKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0cyBtaW5pbXVtIHVuc2lnbmVkIHZhbHVlIG9mIEFQSW50IGZvciBhIHNwZWNpZmljIGJpdCB3aWR0aC4KKyAgc3RhdGljIEFQSW50IGdldE1pblZhbHVlKHVuc2lnbmVkIG51bUJpdHMpIHsKKyAgICByZXR1cm4gQVBJbnQobnVtQml0cywgMCk7CisgIH0KKworICAvLy8gQGJyaWVmIEdldHMgbWluaW11bSBzaWduZWQgdmFsdWUgb2YgQVBJbnQgZm9yIGEgc3BlY2lmaWMgYml0IHdpZHRoLgorICBzdGF0aWMgQVBJbnQgZ2V0U2lnbmVkTWluVmFsdWUodW5zaWduZWQgbnVtQml0cykgeworICAgIHJldHVybiBBUEludChudW1CaXRzLCAwKS5zZXQobnVtQml0cyAtIDEpOworICB9CisKKyAgLy8vIGdldFNpZ25CaXQgLSBUaGlzIGlzIGp1c3QgYSB3cmFwcGVyIGZ1bmN0aW9uIG9mIGdldFNpZ25lZE1pblZhbHVlKCksIGFuZAorICAvLy8gaXQgaGVscHMgY29kZSByZWFkYWJpbGl0eSB3aGVuIHdlIHdhbnQgdG8gZ2V0IGEgU2lnbkJpdC4KKyAgLy8vIEBicmllZiBHZXQgdGhlIFNpZ25CaXQgZm9yIGEgc3BlY2lmaWMgYml0IHdpZHRoLgorICBzdGF0aWMgQVBJbnQgZ2V0U2lnbkJpdCh1bnNpZ25lZCBCaXRXaWR0aCkgeworICAgIHJldHVybiBnZXRTaWduZWRNaW5WYWx1ZShCaXRXaWR0aCk7CisgIH0KKworICAvLy8gQHJldHVybnMgdGhlIGFsbC1vbmVzIHZhbHVlIGZvciBhbiBBUEludCBvZiB0aGUgc3BlY2lmaWVkIGJpdC13aWR0aC4KKyAgLy8vIEBicmllZiBHZXQgdGhlIGFsbC1vbmVzIHZhbHVlLgorICBzdGF0aWMgQVBJbnQgZ2V0QWxsT25lc1ZhbHVlKHVuc2lnbmVkIG51bUJpdHMpIHsKKyAgICByZXR1cm4gQVBJbnQobnVtQml0cywgMCkuc2V0KCk7CisgIH0KKworICAvLy8gQHJldHVybnMgdGhlICcwJyB2YWx1ZSBmb3IgYW4gQVBJbnQgb2YgdGhlIHNwZWNpZmllZCBiaXQtd2lkdGguCisgIC8vLyBAYnJpZWYgR2V0IHRoZSAnMCcgdmFsdWUuCisgIHN0YXRpYyBBUEludCBnZXROdWxsVmFsdWUodW5zaWduZWQgbnVtQml0cykgeworICAgIHJldHVybiBBUEludChudW1CaXRzLCAwKTsKKyAgfQorCisgIC8vLyBHZXQgYW4gQVBJbnQgd2l0aCB0aGUgc2FtZSBCaXRXaWR0aCBhcyB0aGlzIEFQSW50LCBqdXN0IHplcm8gbWFzaworICAvLy8gdGhlIGxvdyBiaXRzIGFuZCByaWdodCBzaGlmdCB0byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LgorICAvLy8gQHJldHVybnMgdGhlIGhpZ2ggIm51bUJpdHMiIGJpdHMgb2YgdGhpcyBBUEludC4KKyAgQVBJbnQgZ2V0SGlCaXRzKHVuc2lnbmVkIG51bUJpdHMpIGNvbnN0OworCisgIC8vLyBHZXQgYW4gQVBJbnQgd2l0aCB0aGUgc2FtZSBCaXRXaWR0aCBhcyB0aGlzIEFQSW50LCBqdXN0IHplcm8gbWFzaworICAvLy8gdGhlIGhpZ2ggYml0cy4KKyAgLy8vIEByZXR1cm5zIHRoZSBsb3cgIm51bUJpdHMiIGJpdHMgb2YgdGhpcyBBUEludC4KKyAgQVBJbnQgZ2V0TG9CaXRzKHVuc2lnbmVkIG51bUJpdHMpIGNvbnN0OworCisgIC8vLyBDb25zdHJ1Y3RzIGFuIEFQSW50IHZhbHVlIHRoYXQgaGFzIGEgY29udGlndW91cyByYW5nZSBvZiBiaXRzIHNldC4gVGhlCisgIC8vLyBiaXRzIGZyb20gbG9CaXQgKGluY2x1c2l2ZSkgdG8gaGlCaXQgKGV4Y2x1c2l2ZSkgd2lsbCBiZSBzZXQuIEFsbCBvdGhlcgorICAvLy8gYml0cyB3aWxsIGJlIHplcm8uIEZvciBleGFtcGxlLCB3aXRoIHBhcmFtZXRlcnMoMzIsIDAsIDE2KSB5b3Ugd291bGQgZ2V0CisgIC8vLyAweDAwMDBGRkZGLiBJZiBoaUJpdCBpcyBsZXNzIHRoYW4gbG9CaXQgdGhlbiB0aGUgc2V0IGJpdHMgIndyYXAiLiBGb3IKKyAgLy8vIGV4YW1wbGUsIHdpdGggcGFyYW1ldGVycyAoMzIsIDI4LCA0KSwgeW91IHdvdWxkIGdldCAweEYwMDAwMDBGLgorICAvLy8gQHBhcmFtIG51bUJpdHMgdGhlIGludGVuZGVkIGJpdCB3aWR0aCBvZiB0aGUgcmVzdWx0CisgIC8vLyBAcGFyYW0gbG9CaXQgdGhlIGluZGV4IG9mIHRoZSBsb3dlc3QgYml0IHNldC4KKyAgLy8vIEBwYXJhbSBoaUJpdCB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgYml0IHNldC4KKyAgLy8vIEByZXR1cm5zIEFuIEFQSW50IHZhbHVlIHdpdGggdGhlIHJlcXVlc3RlZCBiaXRzIHNldC4KKyAgLy8vIEBicmllZiBHZXQgYSB2YWx1ZSB3aXRoIGEgYmxvY2sgb2YgYml0cyBzZXQuCisgIHN0YXRpYyBBUEludCBnZXRCaXRzU2V0KHVuc2lnbmVkIG51bUJpdHMsIHVuc2lnbmVkIGxvQml0LCB1bnNpZ25lZCBoaUJpdCkgeworICAgIGFzc2VydChoaUJpdCA8PSBudW1CaXRzICYmICJoaUJpdCBvdXQgb2YgcmFuZ2UiKTsKKyAgICBhc3NlcnQobG9CaXQgPCBudW1CaXRzICYmICJsb0JpdCBvdXQgb2YgcmFuZ2UiKTsKKyAgICBpZiAoaGlCaXQgPCBsb0JpdCkKKyAgICAgIHJldHVybiBnZXRMb3dCaXRzU2V0KG51bUJpdHMsIGhpQml0KSB8CisgICAgICAgICAgICAgZ2V0SGlnaEJpdHNTZXQobnVtQml0cywgbnVtQml0cy1sb0JpdCk7CisgICAgcmV0dXJuIGdldExvd0JpdHNTZXQobnVtQml0cywgaGlCaXQtbG9CaXQpLnNobChsb0JpdCk7CisgIH0KKworICAvLy8gQ29uc3RydWN0cyBhbiBBUEludCB2YWx1ZSB0aGF0IGhhcyB0aGUgdG9wIGhpQml0c1NldCBiaXRzIHNldC4KKyAgLy8vIEBwYXJhbSBudW1CaXRzIHRoZSBiaXR3aWR0aCBvZiB0aGUgcmVzdWx0CisgIC8vLyBAcGFyYW0gaGlCaXRzU2V0IHRoZSBudW1iZXIgb2YgaGlnaC1vcmRlciBiaXRzIHNldCBpbiB0aGUgcmVzdWx0LgorICAvLy8gQGJyaWVmIEdldCBhIHZhbHVlIHdpdGggaGlnaCBiaXRzIHNldAorICBzdGF0aWMgQVBJbnQgZ2V0SGlnaEJpdHNTZXQodW5zaWduZWQgbnVtQml0cywgdW5zaWduZWQgaGlCaXRzU2V0KSB7CisgICAgYXNzZXJ0KGhpQml0c1NldCA8PSBudW1CaXRzICYmICJUb28gbWFueSBiaXRzIHRvIHNldCEiKTsKKyAgICAvLyBIYW5kbGUgYSBkZWdlbmVyYXRlIGNhc2UsIHRvIGF2b2lkIHNoaWZ0aW5nIGJ5IHdvcmQgc2l6ZQorICAgIGlmIChoaUJpdHNTZXQgPT0gMCkKKyAgICAgIHJldHVybiBBUEludChudW1CaXRzLCAwKTsKKyAgICB1bnNpZ25lZCBzaGlmdEFtdCA9IG51bUJpdHMgLSBoaUJpdHNTZXQ7CisgICAgLy8gRm9yIHNtYWxsIHZhbHVlcywgcmV0dXJuIHF1aWNrbHkKKyAgICBpZiAobnVtQml0cyA8PSBBUElOVF9CSVRTX1BFUl9XT1JEKQorICAgICAgcmV0dXJuIEFQSW50KG51bUJpdHMsIH4wVUxMIDw8IHNoaWZ0QW10KTsKKyAgICByZXR1cm4gKH5BUEludChudW1CaXRzLCAwKSkuc2hsKHNoaWZ0QW10KTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3RzIGFuIEFQSW50IHZhbHVlIHRoYXQgaGFzIHRoZSBib3R0b20gbG9CaXRzU2V0IGJpdHMgc2V0LgorICAvLy8gQHBhcmFtIG51bUJpdHMgdGhlIGJpdHdpZHRoIG9mIHRoZSByZXN1bHQKKyAgLy8vIEBwYXJhbSBsb0JpdHNTZXQgdGhlIG51bWJlciBvZiBsb3ctb3JkZXIgYml0cyBzZXQgaW4gdGhlIHJlc3VsdC4KKyAgLy8vIEBicmllZiBHZXQgYSB2YWx1ZSB3aXRoIGxvdyBiaXRzIHNldAorICBzdGF0aWMgQVBJbnQgZ2V0TG93Qml0c1NldCh1bnNpZ25lZCBudW1CaXRzLCB1bnNpZ25lZCBsb0JpdHNTZXQpIHsKKyAgICBhc3NlcnQobG9CaXRzU2V0IDw9IG51bUJpdHMgJiYgIlRvbyBtYW55IGJpdHMgdG8gc2V0ISIpOworICAgIC8vIEhhbmRsZSBhIGRlZ2VuZXJhdGUgY2FzZSwgdG8gYXZvaWQgc2hpZnRpbmcgYnkgd29yZCBzaXplCisgICAgaWYgKGxvQml0c1NldCA9PSAwKQorICAgICAgcmV0dXJuIEFQSW50KG51bUJpdHMsIDApOworICAgIGlmIChsb0JpdHNTZXQgPT0gQVBJTlRfQklUU19QRVJfV09SRCkKKyAgICAgIHJldHVybiBBUEludChudW1CaXRzLCAtMVVMTCk7CisgICAgLy8gRm9yIHNtYWxsIHZhbHVlcywgcmV0dXJuIHF1aWNrbHkuCisgICAgaWYgKG51bUJpdHMgPCBBUElOVF9CSVRTX1BFUl9XT1JEKQorICAgICAgcmV0dXJuIEFQSW50KG51bUJpdHMsICgxVUxMIDw8IGxvQml0c1NldCkgLSAxKTsKKyAgICByZXR1cm4gKH5BUEludChudW1CaXRzLCAwKSkubHNocihudW1CaXRzIC0gbG9CaXRzU2V0KTsKKyAgfQorCisgIC8vLyBUaGUgaGFzaCB2YWx1ZSBpcyBjb21wdXRlZCBhcyB0aGUgc3VtIG9mIHRoZSB3b3JkcyBhbmQgdGhlIGJpdCB3aWR0aC4KKyAgLy8vIEByZXR1cm5zIEEgaGFzaCB2YWx1ZSBjb21wdXRlZCBmcm9tIHRoZSBzdW0gb2YgdGhlIEFQSW50IHdvcmRzLgorICAvLy8gQGJyaWVmIEdldCBhIGhhc2ggdmFsdWUgYmFzZWQgb24gdGhpcyBBUEludAorICB1aW50NjRfdCBnZXRIYXNoVmFsdWUoKSBjb25zdDsKKworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgc3RvcmFnZSBvZiB0aGUgQVBJbnQuCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCBmb3Igd3JpdGluZyBvdXQgdGhlIEFQSW50IGluIGJpbmFyeSBmb3JtIHdpdGhvdXQgYW55CisgIC8vLyBjb252ZXJzaW9ucy4KKyAgY29uc3QgdWludDY0X3QqIGdldFJhd0RhdGEoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuICZWQUw7CisgICAgcmV0dXJuICZwVmFsWzBdOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBVbmFyeSBPcGVyYXRvcnMKKyAgLy8vIEB7CisgIC8vLyBAcmV0dXJucyBhIG5ldyBBUEludCB2YWx1ZSByZXByZXNlbnRpbmcgKnRoaXMgaW5jcmVtZW50ZWQgYnkgb25lCisgIC8vLyBAYnJpZWYgUG9zdGZpeCBpbmNyZW1lbnQgb3BlcmF0b3IuCisgIGNvbnN0IEFQSW50IG9wZXJhdG9yKysoaW50KSB7CisgICAgQVBJbnQgQVBJKCp0aGlzKTsKKyAgICArKygqdGhpcyk7CisgICAgcmV0dXJuIEFQSTsKKyAgfQorCisgIC8vLyBAcmV0dXJucyAqdGhpcyBpbmNyZW1lbnRlZCBieSBvbmUKKyAgLy8vIEBicmllZiBQcmVmaXggaW5jcmVtZW50IG9wZXJhdG9yLgorICBBUEludCYgb3BlcmF0b3IrKygpOworCisgIC8vLyBAcmV0dXJucyBhIG5ldyBBUEludCByZXByZXNlbnRpbmcgKnRoaXMgZGVjcmVtZW50ZWQgYnkgb25lLgorICAvLy8gQGJyaWVmIFBvc3RmaXggZGVjcmVtZW50IG9wZXJhdG9yLgorICBjb25zdCBBUEludCBvcGVyYXRvci0tKGludCkgeworICAgIEFQSW50IEFQSSgqdGhpcyk7CisgICAgLS0oKnRoaXMpOworICAgIHJldHVybiBBUEk7CisgIH0KKworICAvLy8gQHJldHVybnMgKnRoaXMgZGVjcmVtZW50ZWQgYnkgb25lLgorICAvLy8gQGJyaWVmIFByZWZpeCBkZWNyZW1lbnQgb3BlcmF0b3IuCisgIEFQSW50JiBvcGVyYXRvci0tKCk7CisKKyAgLy8vIFBlcmZvcm1zIGEgYml0d2lzZSBjb21wbGVtZW50IG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50LgorICAvLy8gQHJldHVybnMgYW4gQVBJbnQgdGhhdCBpcyB0aGUgYml0d2lzZSBjb21wbGVtZW50IG9mICp0aGlzCisgIC8vLyBAYnJpZWYgVW5hcnkgYml0d2lzZSBjb21wbGVtZW50IG9wZXJhdG9yLgorICBBUEludCBvcGVyYXRvcn4oKSBjb25zdCB7CisgICAgQVBJbnQgUmVzdWx0KCp0aGlzKTsKKyAgICBSZXN1bHQuZmxpcCgpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gTmVnYXRlcyAqdGhpcyB1c2luZyB0d28ncyBjb21wbGVtZW50IGxvZ2ljLgorICAvLy8gQHJldHVybnMgQW4gQVBJbnQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBuZWdhdGlvbiBvZiAqdGhpcy4KKyAgLy8vIEBicmllZiBVbmFyeSBuZWdhdGlvbiBvcGVyYXRvcgorICBBUEludCBvcGVyYXRvci0oKSBjb25zdCB7CisgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLCAwKSAtICgqdGhpcyk7CisgIH0KKworICAvLy8gUGVyZm9ybXMgbG9naWNhbCBuZWdhdGlvbiBvcGVyYXRpb24gb24gdGhpcyBBUEludC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgKnRoaXMgaXMgemVybywgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8gQGJyaWVmIExvZ2ljYWwgbmVnYXRpb24gb3BlcmF0b3IuCisgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3Q7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBc3NpZ25tZW50IE9wZXJhdG9ycworICAvLy8gQHsKKyAgLy8vIEByZXR1cm5zICp0aGlzIGFmdGVyIGFzc2lnbm1lbnQgb2YgUkhTLgorICAvLy8gQGJyaWVmIENvcHkgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgQVBJbnQmIG9wZXJhdG9yPShjb25zdCBBUEludCYgUkhTKSB7CisgICAgLy8gSWYgdGhlIGJpdHdpZHRocyBhcmUgdGhlIHNhbWUsIHdlIGNhbiBhdm9pZCBtdWNraW5nIHdpdGggbWVtb3J5CisgICAgaWYgKGlzU2luZ2xlV29yZCgpICYmIFJIUy5pc1NpbmdsZVdvcmQoKSkgeworICAgICAgVkFMID0gUkhTLlZBTDsKKyAgICAgIEJpdFdpZHRoID0gUkhTLkJpdFdpZHRoOworICAgICAgcmV0dXJuIGNsZWFyVW51c2VkQml0cygpOworICAgIH0KKworICAgIHJldHVybiBBc3NpZ25TbG93Q2FzZShSSFMpOworICB9CisKKyAgLy8vIFRoZSBSSFMgdmFsdWUgaXMgYXNzaWduZWQgdG8gKnRoaXMuIElmIHRoZSBzaWduaWZpY2FudCBiaXRzIGluIFJIUyBleGNlZWQKKyAgLy8vIHRoZSBiaXQgd2lkdGgsIHRoZSBleGNlc3MgYml0cyBhcmUgdHJ1bmNhdGVkLiBJZiB0aGUgYml0IHdpZHRoIGlzIGxhcmdlcgorICAvLy8gdGhhbiA2NCwgdGhlIHZhbHVlIGlzIHplcm8gZmlsbGVkIGluIHRoZSB1bnNwZWNpZmllZCBoaWdoIG9yZGVyIGJpdHMuCisgIC8vLyBAcmV0dXJucyAqdGhpcyBhZnRlciBhc3NpZ25tZW50IG9mIFJIUyB2YWx1ZS4KKyAgLy8vIEBicmllZiBBc3NpZ25tZW50IG9wZXJhdG9yLgorICBBUEludCYgb3BlcmF0b3I9KHVpbnQ2NF90IFJIUyk7CisKKyAgLy8vIFBlcmZvcm1zIGEgYml0d2lzZSBBTkQgb3BlcmF0aW9uIG9uIHRoaXMgQVBJbnQgYW5kIFJIUy4gVGhlIHJlc3VsdCBpcworICAvLy8gYXNzaWduZWQgdG8gKnRoaXMuCisgIC8vLyBAcmV0dXJucyAqdGhpcyBhZnRlciBBTkRpbmcgd2l0aCBSSFMuCisgIC8vLyBAYnJpZWYgQml0d2lzZSBBTkQgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgQVBJbnQmIG9wZXJhdG9yJj0oY29uc3QgQVBJbnQmIFJIUyk7CisKKyAgLy8vIFBlcmZvcm1zIGEgYml0d2lzZSBPUiBvcGVyYXRpb24gb24gdGhpcyBBUEludCBhbmQgUkhTLiBUaGUgcmVzdWx0IGlzCisgIC8vLyBhc3NpZ25lZCAqdGhpczsKKyAgLy8vIEByZXR1cm5zICp0aGlzIGFmdGVyIE9SaW5nIHdpdGggUkhTLgorICAvLy8gQGJyaWVmIEJpdHdpc2UgT1IgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgQVBJbnQmIG9wZXJhdG9yfD0oY29uc3QgQVBJbnQmIFJIUyk7CisKKyAgLy8vIFBlcmZvcm1zIGEgYml0d2lzZSBPUiBvcGVyYXRpb24gb24gdGhpcyBBUEludCBhbmQgUkhTLiBSSFMgaXMKKyAgLy8vIGxvZ2ljYWxseSB6ZXJvLWV4dGVuZGVkIG9yIHRydW5jYXRlZCB0byBtYXRjaCB0aGUgYml0LXdpZHRoIG9mCisgIC8vLyB0aGUgTEhTLgorICAvLy8gCisgIC8vLyBAYnJpZWYgQml0d2lzZSBPUiBhc3NpZ25tZW50IG9wZXJhdG9yLgorICBBUEludCYgb3BlcmF0b3J8PSh1aW50NjRfdCBSSFMpIHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICAgIFZBTCB8PSBSSFM7CisgICAgICBjbGVhclVudXNlZEJpdHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgcFZhbFswXSB8PSBSSFM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBQZXJmb3JtcyBhIGJpdHdpc2UgWE9SIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50IGFuZCBSSFMuIFRoZSByZXN1bHQgaXMKKyAgLy8vIGFzc2lnbmVkIHRvICp0aGlzLgorICAvLy8gQHJldHVybnMgKnRoaXMgYWZ0ZXIgWE9SaW5nIHdpdGggUkhTLgorICAvLy8gQGJyaWVmIEJpdHdpc2UgWE9SIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIEFQSW50JiBvcGVyYXRvcl49KGNvbnN0IEFQSW50JiBSSFMpOworCisgIC8vLyBNdWx0aXBsaWVzIHRoaXMgQVBJbnQgYnkgUkhTIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gKnRoaXMuCisgIC8vLyBAcmV0dXJucyAqdGhpcworICAvLy8gQGJyaWVmIE11bHRpcGxpY2F0aW9uIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIEFQSW50JiBvcGVyYXRvcio9KGNvbnN0IEFQSW50JiBSSFMpOworCisgIC8vLyBBZGRzIFJIUyB0byAqdGhpcyBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvICp0aGlzLgorICAvLy8gQHJldHVybnMgKnRoaXMKKyAgLy8vIEBicmllZiBBZGRpdGlvbiBhc3NpZ25tZW50IG9wZXJhdG9yLgorICBBUEludCYgb3BlcmF0b3IrPShjb25zdCBBUEludCYgUkhTKTsKKworICAvLy8gU3VidHJhY3RzIFJIUyBmcm9tICp0aGlzIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gKnRoaXMuCisgIC8vLyBAcmV0dXJucyAqdGhpcworICAvLy8gQGJyaWVmIFN1YnRyYWN0aW9uIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIEFQSW50JiBvcGVyYXRvci09KGNvbnN0IEFQSW50JiBSSFMpOworCisgIC8vLyBTaGlmdHMgKnRoaXMgbGVmdCBieSBzaGlmdEFtdCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvICp0aGlzLgorICAvLy8gQHJldHVybnMgKnRoaXMgYWZ0ZXIgc2hpZnRpbmcgbGVmdCBieSBzaGlmdEFtdAorICAvLy8gQGJyaWVmIExlZnQtc2hpZnQgYXNzaWdubWVudCBmdW5jdGlvbi4KKyAgQVBJbnQmIG9wZXJhdG9yPDw9KHVuc2lnbmVkIHNoaWZ0QW10KSB7CisgICAgKnRoaXMgPSBzaGwoc2hpZnRBbXQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQmluYXJ5IE9wZXJhdG9ycworICAvLy8gQHsKKyAgLy8vIFBlcmZvcm1zIGEgYml0d2lzZSBBTkQgb3BlcmF0aW9uIG9uICp0aGlzIGFuZCBSSFMuCisgIC8vLyBAcmV0dXJucyBBbiBBUEludCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGJpdHdpc2UgQU5EIG9mICp0aGlzIGFuZCBSSFMuCisgIC8vLyBAYnJpZWYgQml0d2lzZSBBTkQgb3BlcmF0b3IuCisgIEFQSW50IG9wZXJhdG9yJihjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIEFQSW50KGdldEJpdFdpZHRoKCksIFZBTCAmIFJIUy5WQUwpOworICAgIHJldHVybiBBbmRTbG93Q2FzZShSSFMpOworICB9CisgIEFQSW50IEFuZChjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yJihSSFMpOworICB9CisKKyAgLy8vIFBlcmZvcm1zIGEgYml0d2lzZSBPUiBvcGVyYXRpb24gb24gKnRoaXMgYW5kIFJIUy4KKyAgLy8vIEByZXR1cm5zIEFuIEFQSW50IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgYml0d2lzZSBPUiBvZiAqdGhpcyBhbmQgUkhTLgorICAvLy8gQGJyaWVmIEJpdHdpc2UgT1Igb3BlcmF0b3IuCisgIEFQSW50IG9wZXJhdG9yfChjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIEFQSW50KGdldEJpdFdpZHRoKCksIFZBTCB8IFJIUy5WQUwpOworICAgIHJldHVybiBPclNsb3dDYXNlKFJIUyk7CisgIH0KKyAgQVBJbnQgT3IoY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcnwoUkhTKTsKKyAgfQorCisgIC8vLyBQZXJmb3JtcyBhIGJpdHdpc2UgWE9SIG9wZXJhdGlvbiBvbiAqdGhpcyBhbmQgUkhTLgorICAvLy8gQHJldHVybnMgQW4gQVBJbnQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBiaXR3aXNlIFhPUiBvZiAqdGhpcyBhbmQgUkhTLgorICAvLy8gQGJyaWVmIEJpdHdpc2UgWE9SIG9wZXJhdG9yLgorICBBUEludCBvcGVyYXRvcl4oY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChCaXRXaWR0aCA9PSBSSFMuQml0V2lkdGggJiYgIkJpdCB3aWR0aHMgbXVzdCBiZSB0aGUgc2FtZSIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBBUEludChCaXRXaWR0aCwgVkFMIF4gUkhTLlZBTCk7CisgICAgcmV0dXJuIFhvclNsb3dDYXNlKFJIUyk7CisgIH0KKyAgQVBJbnQgWG9yKGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+b3BlcmF0b3JeKFJIUyk7CisgIH0KKworICAvLy8gTXVsdGlwbGllcyB0aGlzIEFQSW50IGJ5IFJIUyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAvLy8gQGJyaWVmIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yLgorICBBUEludCBvcGVyYXRvciooY29uc3QgQVBJbnQmIFJIUykgY29uc3Q7CisKKyAgLy8vIEFkZHMgUkhTIHRvIHRoaXMgQVBJbnQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgLy8vIEBicmllZiBBZGRpdGlvbiBvcGVyYXRvci4KKyAgQVBJbnQgb3BlcmF0b3IrKGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0OworICBBUEludCBvcGVyYXRvcisodWludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICgqdGhpcykgKyBBUEludChCaXRXaWR0aCwgUkhTKTsKKyAgfQorCisgIC8vLyBTdWJ0cmFjdHMgUkhTIGZyb20gdGhpcyBBUEludCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAvLy8gQGJyaWVmIFN1YnRyYWN0aW9uIG9wZXJhdG9yLgorICBBUEludCBvcGVyYXRvci0oY29uc3QgQVBJbnQmIFJIUykgY29uc3Q7CisgIEFQSW50IG9wZXJhdG9yLSh1aW50NjRfdCBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gKCp0aGlzKSAtIEFQSW50KEJpdFdpZHRoLCBSSFMpOworICB9CisKKyAgQVBJbnQgb3BlcmF0b3I8PCh1bnNpZ25lZCBCaXRzKSBjb25zdCB7CisgICAgcmV0dXJuIHNobChCaXRzKTsKKyAgfQorCisgIEFQSW50IG9wZXJhdG9yPDwoY29uc3QgQVBJbnQgJkJpdHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc2hsKEJpdHMpOworICB9CisKKyAgLy8vIEFyaXRobWV0aWMgcmlnaHQtc2hpZnQgdGhpcyBBUEludCBieSBzaGlmdEFtdC4KKyAgLy8vIEBicmllZiBBcml0aG1ldGljIHJpZ2h0LXNoaWZ0IGZ1bmN0aW9uLgorICBBUEludCBhc2hyKHVuc2lnbmVkIHNoaWZ0QW10KSBjb25zdDsKKworICAvLy8gTG9naWNhbCByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorICAvLy8gQGJyaWVmIExvZ2ljYWwgcmlnaHQtc2hpZnQgZnVuY3Rpb24uCisgIEFQSW50IGxzaHIodW5zaWduZWQgc2hpZnRBbXQpIGNvbnN0OworCisgIC8vLyBMZWZ0LXNoaWZ0IHRoaXMgQVBJbnQgYnkgc2hpZnRBbXQuCisgIC8vLyBAYnJpZWYgTGVmdC1zaGlmdCBmdW5jdGlvbi4KKyAgQVBJbnQgc2hsKHVuc2lnbmVkIHNoaWZ0QW10KSBjb25zdCB7CisgICAgYXNzZXJ0KHNoaWZ0QW10IDw9IEJpdFdpZHRoICYmICJJbnZhbGlkIHNoaWZ0IGFtb3VudCIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgICAgaWYgKHNoaWZ0QW10ID09IEJpdFdpZHRoKQorICAgICAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIDApOyAvLyBhdm9pZCB1bmRlZmluZWQgc2hpZnQgcmVzdWx0cworICAgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLCBWQUwgPDwgc2hpZnRBbXQpOworICAgIH0KKyAgICByZXR1cm4gc2hsU2xvd0Nhc2Uoc2hpZnRBbXQpOworICB9CisKKyAgLy8vIEBicmllZiBSb3RhdGUgbGVmdCBieSByb3RhdGVBbXQuCisgIEFQSW50IHJvdGwodW5zaWduZWQgcm90YXRlQW10KSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJvdGF0ZSByaWdodCBieSByb3RhdGVBbXQuCisgIEFQSW50IHJvdHIodW5zaWduZWQgcm90YXRlQW10KSBjb25zdDsKKworICAvLy8gQXJpdGhtZXRpYyByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorICAvLy8gQGJyaWVmIEFyaXRobWV0aWMgcmlnaHQtc2hpZnQgZnVuY3Rpb24uCisgIEFQSW50IGFzaHIoY29uc3QgQVBJbnQgJnNoaWZ0QW10KSBjb25zdDsKKworICAvLy8gTG9naWNhbCByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorICAvLy8gQGJyaWVmIExvZ2ljYWwgcmlnaHQtc2hpZnQgZnVuY3Rpb24uCisgIEFQSW50IGxzaHIoY29uc3QgQVBJbnQgJnNoaWZ0QW10KSBjb25zdDsKKworICAvLy8gTGVmdC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorICAvLy8gQGJyaWVmIExlZnQtc2hpZnQgZnVuY3Rpb24uCisgIEFQSW50IHNobChjb25zdCBBUEludCAmc2hpZnRBbXQpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUm90YXRlIGxlZnQgYnkgcm90YXRlQW10LgorICBBUEludCByb3RsKGNvbnN0IEFQSW50ICZyb3RhdGVBbXQpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUm90YXRlIHJpZ2h0IGJ5IHJvdGF0ZUFtdC4KKyAgQVBJbnQgcm90cihjb25zdCBBUEludCAmcm90YXRlQW10KSBjb25zdDsKKworICAvLy8gUGVyZm9ybSBhbiB1bnNpZ25lZCBkaXZpZGUgb3BlcmF0aW9uIG9uIHRoaXMgQVBJbnQgYnkgUkhTLiBCb3RoIHRoaXMgYW5kCisgIC8vLyBSSFMgYXJlIHRyZWF0ZWQgYXMgdW5zaWduZWQgcXVhbnRpdGllcyBmb3IgcHVycG9zZXMgb2YgdGhpcyBkaXZpc2lvbi4KKyAgLy8vIEByZXR1cm5zIGEgbmV3IEFQSW50IHZhbHVlIGNvbnRhaW5pbmcgdGhlIGRpdmlzaW9uIHJlc3VsdAorICAvLy8gQGJyaWVmIFVuc2lnbmVkIGRpdmlzaW9uIG9wZXJhdGlvbi4KKyAgQVBJbnQgdWRpdihjb25zdCBBUEludCYgUkhTKSBjb25zdDsKKworICAvLy8gU2lnbmVkIGRpdmlkZSB0aGlzIEFQSW50IGJ5IEFQSW50IFJIUy4KKyAgLy8vIEBicmllZiBTaWduZWQgZGl2aXNpb24gZnVuY3Rpb24gZm9yIEFQSW50LgorICBBUEludCBzZGl2KGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0IHsKKyAgICBpZiAoaXNOZWdhdGl2ZSgpKQorICAgICAgaWYgKFJIUy5pc05lZ2F0aXZlKCkpCisgICAgICAgIHJldHVybiAoLSgqdGhpcykpLnVkaXYoLVJIUyk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAtKCgtKCp0aGlzKSkudWRpdihSSFMpKTsKKyAgICBlbHNlIGlmIChSSFMuaXNOZWdhdGl2ZSgpKQorICAgICAgcmV0dXJuIC0odGhpcy0+dWRpdigtUkhTKSk7CisgICAgcmV0dXJuIHRoaXMtPnVkaXYoUkhTKTsKKyAgfQorCisgIC8vLyBQZXJmb3JtIGFuIHVuc2lnbmVkIHJlbWFpbmRlciBvcGVyYXRpb24gb24gdGhpcyBBUEludCB3aXRoIFJIUyBiZWluZyB0aGUKKyAgLy8vIGRpdmlzb3IuIEJvdGggdGhpcyBhbmQgUkhTIGFyZSB0cmVhdGVkIGFzIHVuc2lnbmVkIHF1YW50aXRpZXMgZm9yIHB1cnBvc2VzCisgIC8vLyBvZiB0aGlzIG9wZXJhdGlvbi4gTm90ZSB0aGF0IHRoaXMgaXMgYSB0cnVlIHJlbWFpbmRlciBvcGVyYXRpb24gYW5kIG5vdAorICAvLy8gYSBtb2R1bG8gb3BlcmF0aW9uIGJlY2F1c2UgdGhlIHNpZ24gZm9sbG93cyB0aGUgc2lnbiBvZiB0aGUgZGl2aWRlbmQKKyAgLy8vIHdoaWNoIGlzICp0aGlzLgorICAvLy8gQHJldHVybnMgYSBuZXcgQVBJbnQgdmFsdWUgY29udGFpbmluZyB0aGUgcmVtYWluZGVyIHJlc3VsdAorICAvLy8gQGJyaWVmIFVuc2lnbmVkIHJlbWFpbmRlciBvcGVyYXRpb24uCisgIEFQSW50IHVyZW0oY29uc3QgQVBJbnQmIFJIUykgY29uc3Q7CisKKyAgLy8vIFNpZ25lZCByZW1haW5kZXIgb3BlcmF0aW9uIG9uIEFQSW50LgorICAvLy8gQGJyaWVmIEZ1bmN0aW9uIGZvciBzaWduZWQgcmVtYWluZGVyIG9wZXJhdGlvbi4KKyAgQVBJbnQgc3JlbShjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgICAgaWYgKGlzTmVnYXRpdmUoKSkKKyAgICAgIGlmIChSSFMuaXNOZWdhdGl2ZSgpKQorICAgICAgICByZXR1cm4gLSgoLSgqdGhpcykpLnVyZW0oLVJIUykpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gLSgoLSgqdGhpcykpLnVyZW0oUkhTKSk7CisgICAgZWxzZSBpZiAoUkhTLmlzTmVnYXRpdmUoKSkKKyAgICAgIHJldHVybiB0aGlzLT51cmVtKC1SSFMpOworICAgIHJldHVybiB0aGlzLT51cmVtKFJIUyk7CisgIH0KKworICAvLy8gU29tZXRpbWVzIGl0IGlzIGNvbnZlbmllbnQgdG8gZGl2aWRlIHR3byBBUEludCB2YWx1ZXMgYW5kIG9idGFpbiBib3RoIHRoZQorICAvLy8gcXVvdGllbnQgYW5kIHJlbWFpbmRlci4gVGhpcyBmdW5jdGlvbiBkb2VzIGJvdGggb3BlcmF0aW9ucyBpbiB0aGUgc2FtZQorICAvLy8gY29tcHV0YXRpb24gbWFraW5nIGl0IGEgbGl0dGxlIG1vcmUgZWZmaWNpZW50LiBUaGUgcGFpciBvZiBpbnB1dCBhcmd1bWVudHMKKyAgLy8vIG1heSBvdmVybGFwIHdpdGggdGhlIHBhaXIgb2Ygb3V0cHV0IGFyZ3VtZW50cy4gSXQgaXMgc2FmZSB0byBjYWxsCisgIC8vLyB1ZGl2cmVtKFgsIFksIFgsIFkpLCBmb3IgZXhhbXBsZS4KKyAgLy8vIEBicmllZiBEdWFsIGRpdmlzaW9uL3JlbWFpbmRlciBpbnRlcmZhY2UuCisgIHN0YXRpYyB2b2lkIHVkaXZyZW0oY29uc3QgQVBJbnQgJkxIUywgY29uc3QgQVBJbnQgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgICBBUEludCAmUXVvdGllbnQsIEFQSW50ICZSZW1haW5kZXIpOworCisgIHN0YXRpYyB2b2lkIHNkaXZyZW0oY29uc3QgQVBJbnQgJkxIUywgY29uc3QgQVBJbnQgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgICBBUEludCAmUXVvdGllbnQsIEFQSW50ICZSZW1haW5kZXIpCisgIHsKKyAgICBpZiAoTEhTLmlzTmVnYXRpdmUoKSkgeworICAgICAgaWYgKFJIUy5pc05lZ2F0aXZlKCkpCisgICAgICAgIEFQSW50Ojp1ZGl2cmVtKC1MSFMsIC1SSFMsIFF1b3RpZW50LCBSZW1haW5kZXIpOworICAgICAgZWxzZQorICAgICAgICBBUEludDo6dWRpdnJlbSgtTEhTLCBSSFMsIFF1b3RpZW50LCBSZW1haW5kZXIpOworICAgICAgUXVvdGllbnQgPSAtUXVvdGllbnQ7CisgICAgICBSZW1haW5kZXIgPSAtUmVtYWluZGVyOworICAgIH0gZWxzZSBpZiAoUkhTLmlzTmVnYXRpdmUoKSkgeworICAgICAgQVBJbnQ6OnVkaXZyZW0oTEhTLCAtUkhTLCBRdW90aWVudCwgUmVtYWluZGVyKTsKKyAgICAgIFF1b3RpZW50ID0gLVF1b3RpZW50OworICAgIH0gZWxzZSB7CisgICAgICBBUEludDo6dWRpdnJlbShMSFMsIFJIUywgUXVvdGllbnQsIFJlbWFpbmRlcik7CisgICAgfQorICB9CisKKyAgLy8vIEByZXR1cm5zIHRoZSBiaXQgdmFsdWUgYXQgYml0UG9zaXRpb24KKyAgLy8vIEBicmllZiBBcnJheS1pbmRleGluZyBzdXBwb3J0LgorICBib29sIG9wZXJhdG9yW10odW5zaWduZWQgYml0UG9zaXRpb24pIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQ29tcGFyaXNvbiBPcGVyYXRvcnMKKyAgLy8vIEB7CisgIC8vLyBDb21wYXJlcyB0aGlzIEFQSW50IHdpdGggUkhTIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIGVxdWFsaXR5CisgIC8vLyByZWxhdGlvbnNoaXAuCisgIC8vLyBAYnJpZWYgRXF1YWxpdHkgb3BlcmF0b3IuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQ29tcGFyaXNvbiByZXF1aXJlcyBlcXVhbCBiaXQgd2lkdGhzIik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIFZBTCA9PSBSSFMuVkFMOworICAgIHJldHVybiBFcXVhbFNsb3dDYXNlKFJIUyk7CisgIH0KKworICAvLy8gQ29tcGFyZXMgdGhpcyBBUEludCB3aXRoIGEgdWludDY0X3QgZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgZXF1YWxpdHkKKyAgLy8vIHJlbGF0aW9uc2hpcC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgKnRoaXMgPT0gVmFsCisgIC8vLyBAYnJpZWYgRXF1YWxpdHkgb3BlcmF0b3IuCisgIGJvb2wgb3BlcmF0b3I9PSh1aW50NjRfdCBWYWwpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVkFMID09IFZhbDsKKyAgICByZXR1cm4gRXF1YWxTbG93Q2FzZShWYWwpOworICB9CisKKyAgLy8vIENvbXBhcmVzIHRoaXMgQVBJbnQgd2l0aCBSSFMgZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgZXF1YWxpdHkKKyAgLy8vIHJlbGF0aW9uc2hpcC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgKnRoaXMgPT0gVmFsCisgIC8vLyBAYnJpZWYgRXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgYm9vbCBlcShjb25zdCBBUEludCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICgqdGhpcykgPT0gUkhTOworICB9CisKKyAgLy8vIENvbXBhcmVzIHRoaXMgQVBJbnQgd2l0aCBSSFMgZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgaW5lcXVhbGl0eQorICAvLy8gcmVsYXRpb25zaGlwLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiAqdGhpcyAhPSBWYWwKKyAgLy8vIEBicmllZiBJbmVxdWFsaXR5IG9wZXJhdG9yLgorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICAgIHJldHVybiAhKCgqdGhpcykgPT0gUkhTKTsKKyAgfQorCisgIC8vLyBDb21wYXJlcyB0aGlzIEFQSW50IHdpdGggYSB1aW50NjRfdCBmb3IgdGhlIHZhbGlkaXR5IG9mIHRoZSBpbmVxdWFsaXR5CisgIC8vLyByZWxhdGlvbnNoaXAuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmICp0aGlzICE9IFZhbAorICAvLy8gQGJyaWVmIEluZXF1YWxpdHkgb3BlcmF0b3IuCisgIGJvb2wgb3BlcmF0b3IhPSh1aW50NjRfdCBWYWwpIGNvbnN0IHsKKyAgICByZXR1cm4gISgoKnRoaXMpID09IFZhbCk7CisgIH0KKworICAvLy8gQ29tcGFyZXMgdGhpcyBBUEludCB3aXRoIFJIUyBmb3IgdGhlIHZhbGlkaXR5IG9mIHRoZSBpbmVxdWFsaXR5CisgIC8vLyByZWxhdGlvbnNoaXAuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmICp0aGlzICE9IFZhbAorICAvLy8gQGJyaWVmIEluZXF1YWxpdHkgY29tcGFyaXNvbgorICBib29sIG5lKGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgoKnRoaXMpID09IFJIUyk7CisgIH0KKworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgdW5zaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgbGVzcy10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgKnRoaXMgPCBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHVuc2lnbmVkLgorICAvLy8gQGJyaWVmIFVuc2lnbmVkIGxlc3MgdGhhbiBjb21wYXJpc29uCisgIGJvb2wgdWx0KGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0OworCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYXMgYW4gdW5zaWduZWQgcXVhbnRpdHkgYW5kIGNvbXBhcmVzIGl0IHdpdGggUkhTIGZvcgorICAvLy8gdGhlIHZhbGlkaXR5IG9mIHRoZSBsZXNzLXRoYW4gcmVsYXRpb25zaGlwLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA8IFJIUyB3aGVuIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIC8vLyBAYnJpZWYgVW5zaWduZWQgbGVzcyB0aGFuIGNvbXBhcmlzb24KKyAgYm9vbCB1bHQodWludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHVsdChBUEludChnZXRCaXRXaWR0aCgpLCBSSFMpKTsKKyAgfQorCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyBzaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IKKyAgLy8vIHZhbGlkaXR5IG9mIHRoZSBsZXNzLXRoYW4gcmVsYXRpb25zaGlwLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA8IFJIUyB3aGVuIGJvdGggYXJlIGNvbnNpZGVyZWQgc2lnbmVkLgorICAvLy8gQGJyaWVmIFNpZ25lZCBsZXNzIHRoYW4gY29tcGFyaXNvbgorICBib29sIHNsdChjb25zdCBBUEludCYgUkhTKSBjb25zdDsKKworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFzIGEgc2lnbmVkIHF1YW50aXR5IGFuZCBjb21wYXJlcyBpdCB3aXRoIFJIUyBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgbGVzcy10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgKnRoaXMgPCBSSFMgd2hlbiBjb25zaWRlcmVkIHNpZ25lZC4KKyAgLy8vIEBicmllZiBTaWduZWQgbGVzcyB0aGFuIGNvbXBhcmlzb24KKyAgYm9vbCBzbHQodWludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHNsdChBUEludChnZXRCaXRXaWR0aCgpLCBSSFMpKTsKKyAgfQorCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyB1bnNpZ25lZCBxdWFudGl0aWVzIGFuZCBjb21wYXJlcyB0aGVtIGZvcgorICAvLy8gdmFsaWRpdHkgb2YgdGhlIGxlc3Mtb3ItZXF1YWwgcmVsYXRpb25zaGlwLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA8PSBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHVuc2lnbmVkLgorICAvLy8gQGJyaWVmIFVuc2lnbmVkIGxlc3Mgb3IgZXF1YWwgY29tcGFyaXNvbgorICBib29sIHVsZShjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHVsdChSSFMpIHx8IGVxKFJIUyk7CisgIH0KKworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFzIGFuIHVuc2lnbmVkIHF1YW50aXR5IGFuZCBjb21wYXJlcyBpdCB3aXRoIFJIUyBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgbGVzcy1vci1lcXVhbCByZWxhdGlvbnNoaXAuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmICp0aGlzIDw9IFJIUyB3aGVuIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIC8vLyBAYnJpZWYgVW5zaWduZWQgbGVzcyBvciBlcXVhbCBjb21wYXJpc29uCisgIGJvb2wgdWxlKHVpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiB1bGUoQVBJbnQoZ2V0Qml0V2lkdGgoKSwgUkhTKSk7CisgIH0KKworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgc2lnbmVkIHF1YW50aXRpZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yCisgIC8vLyB2YWxpZGl0eSBvZiB0aGUgbGVzcy1vci1lcXVhbCByZWxhdGlvbnNoaXAuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmICp0aGlzIDw9IFJIUyB3aGVuIGJvdGggYXJlIGNvbnNpZGVyZWQgc2lnbmVkLgorICAvLy8gQGJyaWVmIFNpZ25lZCBsZXNzIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgYm9vbCBzbGUoY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICAgIHJldHVybiBzbHQoUkhTKSB8fCBlcShSSFMpOworICB9CisKKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhcyBhIHNpZ25lZCBxdWFudGl0eSBhbmQgY29tcGFyZXMgaXQgd2l0aCBSSFMgZm9yCisgIC8vLyB0aGUgdmFsaWRpdHkgb2YgdGhlIGxlc3Mtb3ItZXF1YWwgcmVsYXRpb25zaGlwLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA8PSBSSFMgd2hlbiBjb25zaWRlcmVkIHNpZ25lZC4KKyAgLy8vIEBicmllZiBTaWduZWQgbGVzcyBvciBlcXVhbCBjb21wYXJpc29uCisgIGJvb2wgc2xlKHVpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiBzbGUoQVBJbnQoZ2V0Qml0V2lkdGgoKSwgUkhTKSk7CisgIH0KKworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgdW5zaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgKnRoaXMgPiBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHVuc2lnbmVkLgorICAvLy8gQGJyaWVmIFVuc2lnbmVkIGdyZWF0aGVyIHRoYW4gY29tcGFyaXNvbgorICBib29sIHVndChjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICF1bHQoUkhTKSAmJiAhZXEoUkhTKTsKKyAgfQorCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYXMgYW4gdW5zaWduZWQgcXVhbnRpdHkgYW5kIGNvbXBhcmVzIGl0IHdpdGggUkhTIGZvcgorICAvLy8gdGhlIHZhbGlkaXR5IG9mIHRoZSBncmVhdGVyLXRoYW4gcmVsYXRpb25zaGlwLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA+IFJIUyB3aGVuIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIC8vLyBAYnJpZWYgVW5zaWduZWQgZ3JlYXRlciB0aGFuIGNvbXBhcmlzb24KKyAgYm9vbCB1Z3QodWludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHVndChBUEludChnZXRCaXRXaWR0aCgpLCBSSFMpKTsKKyAgfQorCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyBzaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgKnRoaXMgPiBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHNpZ25lZC4KKyAgLy8vIEBicmllZiBTaWduZWQgZ3JlYXRoZXIgdGhhbiBjb21wYXJpc29uCisgIGJvb2wgc2d0KGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gIXNsdChSSFMpICYmICFlcShSSFMpOworICB9CisKKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhcyBhIHNpZ25lZCBxdWFudGl0eSBhbmQgY29tcGFyZXMgaXQgd2l0aCBSSFMgZm9yCisgIC8vLyB0aGUgdmFsaWRpdHkgb2YgdGhlIGdyZWF0ZXItdGhhbiByZWxhdGlvbnNoaXAuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmICp0aGlzID4gUkhTIHdoZW4gY29uc2lkZXJlZCBzaWduZWQuCisgIC8vLyBAYnJpZWYgU2lnbmVkIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uCisgIGJvb2wgc2d0KHVpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiBzZ3QoQVBJbnQoZ2V0Qml0V2lkdGgoKSwgUkhTKSk7CisgIH0KKworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgdW5zaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IKKyAgLy8vIHZhbGlkaXR5IG9mIHRoZSBncmVhdGVyLW9yLWVxdWFsIHJlbGF0aW9uc2hpcC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgKnRoaXMgPj0gUkhTIHdoZW4gYm90aCBhcmUgY29uc2lkZXJlZCB1bnNpZ25lZC4KKyAgLy8vIEBicmllZiBVbnNpZ25lZCBncmVhdGVyIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgYm9vbCB1Z2UoY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICAgIHJldHVybiAhdWx0KFJIUyk7CisgIH0KKworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFzIGFuIHVuc2lnbmVkIHF1YW50aXR5IGFuZCBjb21wYXJlcyBpdCB3aXRoIFJIUyBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci1vci1lcXVhbCByZWxhdGlvbnNoaXAuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmICp0aGlzID49IFJIUyB3aGVuIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIC8vLyBAYnJpZWYgVW5zaWduZWQgZ3JlYXRlciBvciBlcXVhbCBjb21wYXJpc29uCisgIGJvb2wgdWdlKHVpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiB1Z2UoQVBJbnQoZ2V0Qml0V2lkdGgoKSwgUkhTKSk7CisgIH0KKworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgc2lnbmVkIHF1YW50aXRpZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yCisgIC8vLyB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci1vci1lcXVhbCByZWxhdGlvbnNoaXAuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmICp0aGlzID49IFJIUyB3aGVuIGJvdGggYXJlIGNvbnNpZGVyZWQgc2lnbmVkLgorICAvLy8gQGJyaWVmIFNpZ25lZCBncmVhdGhlciBvciBlcXVhbCBjb21wYXJpc29uCisgIGJvb2wgc2dlKGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gIXNsdChSSFMpOworICB9CisKKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhcyBhIHNpZ25lZCBxdWFudGl0eSBhbmQgY29tcGFyZXMgaXQgd2l0aCBSSFMgZm9yCisgIC8vLyB0aGUgdmFsaWRpdHkgb2YgdGhlIGdyZWF0ZXItb3ItZXF1YWwgcmVsYXRpb25zaGlwLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA+PSBSSFMgd2hlbiBjb25zaWRlcmVkIHNpZ25lZC4KKyAgLy8vIEBicmllZiBTaWduZWQgZ3JlYXRlciBvciBlcXVhbCBjb21wYXJpc29uCisgIGJvb2wgc2dlKHVpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiBzZ2UoQVBJbnQoZ2V0Qml0V2lkdGgoKSwgUkhTKSk7CisgIH0KKworICAvLy8gVGhpcyBvcGVyYXRpb24gdGVzdHMgaWYgdGhlcmUgYXJlIGFueSBwYWlycyBvZiBjb3JyZXNwb25kaW5nIGJpdHMKKyAgLy8vIGJldHdlZW4gdGhpcyBBUEludCBhbmQgUkhTIHRoYXQgYXJlIGJvdGggc2V0LgorICBib29sIGludGVyc2VjdHMoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeworICAgIHJldHVybiAoKnRoaXMgJiBSSFMpICE9IDA7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFJlc2l6aW5nIE9wZXJhdG9ycworICAvLy8gQHsKKyAgLy8vIFRydW5jYXRlIHRoZSBBUEludCB0byBhIHNwZWNpZmllZCB3aWR0aC4gSXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSBhIHdpZHRoCisgIC8vLyB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB3aWR0aC4KKyAgLy8vIEBicmllZiBUcnVuY2F0ZSB0byBuZXcgd2lkdGguCisgIEFQSW50ICZ0cnVuYyh1bnNpZ25lZCB3aWR0aCk7CisKKyAgLy8vIFRoaXMgb3BlcmF0aW9uIHNpZ24gZXh0ZW5kcyB0aGUgQVBJbnQgdG8gYSBuZXcgd2lkdGguIElmIHRoZSBoaWdoIG9yZGVyCisgIC8vLyBiaXQgaXMgc2V0LCB0aGUgZmlsbCBvbiB0aGUgbGVmdCB3aWxsIGJlIGRvbmUgd2l0aCAxIGJpdHMsIG90aGVyd2lzZSB6ZXJvLgorICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSBhIHdpZHRoIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQorICAvLy8gY3VycmVudCB3aWR0aC4KKyAgLy8vIEBicmllZiBTaWduIGV4dGVuZCB0byBhIG5ldyB3aWR0aC4KKyAgQVBJbnQgJnNleHQodW5zaWduZWQgd2lkdGgpOworCisgIC8vLyBUaGlzIG9wZXJhdGlvbiB6ZXJvIGV4dGVuZHMgdGhlIEFQSW50IHRvIGEgbmV3IHdpZHRoLiBUaGUgaGlnaCBvcmRlciBiaXRzCisgIC8vLyBhcmUgZmlsbGVkIHdpdGggMCBiaXRzLiAgSXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSBhIHdpZHRoIHRoYXQgaXMgbGVzcworICAvLy8gdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB3aWR0aC4KKyAgLy8vIEBicmllZiBaZXJvIGV4dGVuZCB0byBhIG5ldyB3aWR0aC4KKyAgQVBJbnQgJnpleHQodW5zaWduZWQgd2lkdGgpOworCisgIC8vLyBNYWtlIHRoaXMgQVBJbnQgaGF2ZSB0aGUgYml0IHdpZHRoIGdpdmVuIGJ5IFxwIHdpZHRoLiBUaGUgdmFsdWUgaXMgc2lnbgorICAvLy8gZXh0ZW5kZWQsIHRydW5jYXRlZCwgb3IgbGVmdCBhbG9uZSB0byBtYWtlIGl0IHRoYXQgd2lkdGguCisgIC8vLyBAYnJpZWYgU2lnbiBleHRlbmQgb3IgdHJ1bmNhdGUgdG8gd2lkdGgKKyAgQVBJbnQgJnNleHRPclRydW5jKHVuc2lnbmVkIHdpZHRoKTsKKworICAvLy8gTWFrZSB0aGlzIEFQSW50IGhhdmUgdGhlIGJpdCB3aWR0aCBnaXZlbiBieSBccCB3aWR0aC4gVGhlIHZhbHVlIGlzIHplcm8KKyAgLy8vIGV4dGVuZGVkLCB0cnVuY2F0ZWQsIG9yIGxlZnQgYWxvbmUgdG8gbWFrZSBpdCB0aGF0IHdpZHRoLgorICAvLy8gQGJyaWVmIFplcm8gZXh0ZW5kIG9yIHRydW5jYXRlIHRvIHdpZHRoCisgIEFQSW50ICZ6ZXh0T3JUcnVuYyh1bnNpZ25lZCB3aWR0aCk7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBCaXQgTWFuaXB1bGF0aW9uIE9wZXJhdG9ycworICAvLy8gQHsKKyAgLy8vIEBicmllZiBTZXQgZXZlcnkgYml0IHRvIDEuCisgIEFQSW50JiBzZXQoKSB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgICBWQUwgPSAtMVVMTDsKKyAgICAgIHJldHVybiBjbGVhclVudXNlZEJpdHMoKTsKKyAgICB9CisKKyAgICAvLyBTZXQgYWxsIHRoZSBiaXRzIGluIGFsbCB0aGUgd29yZHMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGdldE51bVdvcmRzKCk7ICsraSkKKyAgICAgIHBWYWxbaV0gPSAtMVVMTDsKKyAgICAvLyBDbGVhciB0aGUgdW51c2VkIG9uZXMKKyAgICByZXR1cm4gY2xlYXJVbnVzZWRCaXRzKCk7CisgIH0KKworICAvLy8gU2V0IHRoZSBnaXZlbiBiaXQgdG8gMSB3aG9zZSBwb3NpdGlvbiBpcyBnaXZlbiBhcyAiYml0UG9zaXRpb24iLgorICAvLy8gQGJyaWVmIFNldCBhIGdpdmVuIGJpdCB0byAxLgorICBBUEludCYgc2V0KHVuc2lnbmVkIGJpdFBvc2l0aW9uKTsKKworICAvLy8gQGJyaWVmIFNldCBldmVyeSBiaXQgdG8gMC4KKyAgQVBJbnQmIGNsZWFyKCkgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFZBTCA9IDA7CisgICAgZWxzZQorICAgICAgbWVtc2V0KHBWYWwsIDAsIGdldE51bVdvcmRzKCkgKiBBUElOVF9XT1JEX1NJWkUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBTZXQgdGhlIGdpdmVuIGJpdCB0byAwIHdob3NlIHBvc2l0aW9uIGlzIGdpdmVuIGFzICJiaXRQb3NpdGlvbiIuCisgIC8vLyBAYnJpZWYgU2V0IGEgZ2l2ZW4gYml0IHRvIDAuCisgIEFQSW50JiBjbGVhcih1bnNpZ25lZCBiaXRQb3NpdGlvbik7CisKKyAgLy8vIEBicmllZiBUb2dnbGUgZXZlcnkgYml0IHRvIGl0cyBvcHBvc2l0ZSB2YWx1ZS4KKyAgQVBJbnQmIGZsaXAoKSB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgICBWQUwgXj0gLTFVTEw7CisgICAgICByZXR1cm4gY2xlYXJVbnVzZWRCaXRzKCk7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBnZXROdW1Xb3JkcygpOyArK2kpCisgICAgICBwVmFsW2ldIF49IC0xVUxMOworICAgIHJldHVybiBjbGVhclVudXNlZEJpdHMoKTsKKyAgfQorCisgIC8vLyBUb2dnbGUgYSBnaXZlbiBiaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlIHdob3NlIHBvc2l0aW9uIGlzIGdpdmVuCisgIC8vLyBhcyAiYml0UG9zaXRpb24iLgorICAvLy8gQGJyaWVmIFRvZ2dsZXMgYSBnaXZlbiBiaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlLgorICBBUEludCYgZmxpcCh1bnNpZ25lZCBiaXRQb3NpdGlvbik7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBWYWx1ZSBDaGFyYWN0ZXJpemF0aW9uIEZ1bmN0aW9ucworICAvLy8gQHsKKworICAvLy8gQHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzLgorICB1bnNpZ25lZCBnZXRCaXRXaWR0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0V2lkdGg7CisgIH0KKworICAvLy8gSGVyZSBvbmUgd29yZCdzIGJpdHdpZHRoIGVxdWFscyB0byB0aGF0IG9mIHVpbnQ2NF90LgorICAvLy8gQHJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyB0byBob2xkIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgQVBJbnQuCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBudW1iZXIgb2Ygd29yZHMuCisgIHVuc2lnbmVkIGdldE51bVdvcmRzKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1Xb3JkcyhCaXRXaWR0aCk7CisgIH0KKworICAvLy8gSGVyZSBvbmUgd29yZCdzIGJpdHdpZHRoIGVxdWFscyB0byB0aGF0IG9mIHVpbnQ2NF90LgorICAvLy8gQHJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyB0byBob2xkIHRoZSBpbnRlZ2VyIHZhbHVlIHdpdGggYQorICAvLy8gZ2l2ZW4gYml0IHdpZHRoLgorICAvLy8gQGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0TnVtV29yZHModW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICByZXR1cm4gKEJpdFdpZHRoICsgQVBJTlRfQklUU19QRVJfV09SRCAtIDEpIC8gQVBJTlRfQklUU19QRVJfV09SRDsKKyAgfQorCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBhY3RpdmUgYml0cyB3aGljaCBpcyBkZWZpbmVkIGFzIHRoZQorICAvLy8gYml0IHdpZHRoIG1pbnVzIHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcy4gVGhpcyBpcyB1c2VkIGluIHNldmVyYWwKKyAgLy8vIGNvbXB1dGF0aW9ucyB0byBzZWUgaG93ICJ3aWRlIiB0aGUgdmFsdWUgaXMuCisgIC8vLyBAYnJpZWYgQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBiaXRzIGluIHRoZSB2YWx1ZQorICB1bnNpZ25lZCBnZXRBY3RpdmVCaXRzKCkgY29uc3QgeworICAgIHJldHVybiBCaXRXaWR0aCAtIGNvdW50TGVhZGluZ1plcm9zKCk7CisgIH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYWN0aXZlIHdvcmRzIGluIHRoZSB2YWx1ZSBvZiB0aGlzCisgIC8vLyBBUEludC4gVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggZ2V0QWN0aXZlRGF0YSB0byBleHRyYWN0IHRoZSByYXcKKyAgLy8vIHZhbHVlIG9mIHRoZSBBUEludC4KKyAgdW5zaWduZWQgZ2V0QWN0aXZlV29yZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHdoaWNoV29yZChnZXRBY3RpdmVCaXRzKCktMSkgKyAxOworICB9CisKKyAgLy8vIENvbXB1dGVzIHRoZSBtaW5pbXVtIGJpdCB3aWR0aCBmb3IgdGhpcyBBUEludCB3aGlsZSBjb25zaWRlcmluZyBpdCB0byBiZQorICAvLy8gYSBzaWduZWQgKGFuZCBwcm9iYWJseSBuZWdhdGl2ZSkgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBub3QgbmVnYXRpdmUsCisgIC8vLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgYXMgZ2V0QWN0aXZlQml0cygpKzEuIE90aGVyd2lzZSwgaXQKKyAgLy8vIHJldHVybnMgdGhlIHNtYWxsZXN0IGJpdCB3aWR0aCB0aGF0IHdpbGwgcmV0YWluIHRoZSBuZWdhdGl2ZSB2YWx1ZS4gRm9yCisgIC8vLyBleGFtcGxlLCAtMSBjYW4gYmUgd3JpdHRlbiBhcyAwYjEgb3IgMHhGRkZGRkZGRkZGLiAwYjEgaXMgc2hvcnRlciBhbmQgc28KKyAgLy8vIGZvciAtMSwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gMS4KKyAgLy8vIEBicmllZiBHZXQgdGhlIG1pbmltdW0gYml0IHNpemUgZm9yIHRoaXMgc2lnbmVkIEFQSW50CisgIHVuc2lnbmVkIGdldE1pblNpZ25lZEJpdHMoKSBjb25zdCB7CisgICAgaWYgKGlzTmVnYXRpdmUoKSkKKyAgICAgIHJldHVybiBCaXRXaWR0aCAtIGNvdW50TGVhZGluZ09uZXMoKSArIDE7CisgICAgcmV0dXJuIGdldEFjdGl2ZUJpdHMoKSsxOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBBUEludCBhcyBhIHplcm8gZXh0ZW5kZWQKKyAgLy8vIHVpbnQ2NF90LiBUaGUgYml0d2lkdGggbXVzdCBiZSA8PSA2NCBvciB0aGUgdmFsdWUgbXVzdCBmaXQgd2l0aGluIGEKKyAgLy8vIHVpbnQ2NF90LiBPdGhlcndpc2UgYW4gYXNzZXJ0aW9uIHdpbGwgcmVzdWx0LgorICAvLy8gQGJyaWVmIEdldCB6ZXJvIGV4dGVuZGVkIHZhbHVlCisgIHVpbnQ2NF90IGdldFpFeHRWYWx1ZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVkFMOworICAgIGFzc2VydChnZXRBY3RpdmVCaXRzKCkgPD0gNjQgJiYgIlRvbyBtYW55IGJpdHMgZm9yIHVpbnQ2NF90Iik7CisgICAgcmV0dXJuIHBWYWxbMF07CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50IGFzIGEgc2lnbiBleHRlbmRlZAorICAvLy8gaW50NjRfdC4gVGhlIGJpdCB3aWR0aCBtdXN0IGJlIDw9IDY0IG9yIHRoZSB2YWx1ZSBtdXN0IGZpdCB3aXRoaW4gYW4KKyAgLy8vIGludDY0X3QuIE90aGVyd2lzZSBhbiBhc3NlcnRpb24gd2lsbCByZXN1bHQuCisgIC8vLyBAYnJpZWYgR2V0IHNpZ24gZXh0ZW5kZWQgdmFsdWUKKyAgaW50NjRfdCBnZXRTRXh0VmFsdWUoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIGludDY0X3QoVkFMIDw8IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gQml0V2lkdGgpKSA+PgorICAgICAgICAgICAgICAgICAgICAgKEFQSU5UX0JJVFNfUEVSX1dPUkQgLSBCaXRXaWR0aCk7CisgICAgYXNzZXJ0KGdldE1pblNpZ25lZEJpdHMoKSA8PSA2NCAmJiAiVG9vIG1hbnkgYml0cyBmb3IgaW50NjRfdCIpOworICAgIHJldHVybiBpbnQ2NF90KHBWYWxbMF0pOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGRldGVybWluZXMgaG93IG1hbnkgYml0cyBhcmUgcmVxdWlyZWQgdG8gaG9sZCB0aGUgQVBJbnQKKyAgLy8vIGVxdWl2YWxlbnQgb2YgdGhlIHN0cmluZyBnaXZlbiBieSBcYXJnIHN0ci4KKyAgLy8vIEBicmllZiBHZXQgYml0cyByZXF1aXJlZCBmb3Igc3RyaW5nIHZhbHVlLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0Qml0c05lZWRlZChTdHJpbmdSZWYgc3RyLCB1aW50OF90IHJhZGl4KTsKKworICAvLy8gY291bnRMZWFkaW5nWmVyb3MgLSBUaGlzIGZ1bmN0aW9uIGlzIGFuIEFQSW50IHZlcnNpb24gb2YgdGhlCisgIC8vLyBjb3VudExlYWRpbmdaZXJvc197MzIsNjR9IGZ1bmN0aW9ucyBpbiBNYXRoRXh0cmFzLmguIEl0IGNvdW50cyB0aGUgbnVtYmVyCisgIC8vLyBvZiB6ZXJvcyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3Qgb25lIGJpdC4KKyAgLy8vIEByZXR1cm5zIEJpdFdpZHRoIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLgorICAvLy8gQHJldHVybnMgdGhlIG51bWJlciBvZiB6ZXJvcyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QKKyAgLy8vIG9uZSBiaXRzLgorICB1bnNpZ25lZCBjb3VudExlYWRpbmdaZXJvcygpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICAgIHVuc2lnbmVkIHVudXNlZEJpdHMgPSBBUElOVF9CSVRTX1BFUl9XT1JEIC0gQml0V2lkdGg7CisgICAgICByZXR1cm4gQ291bnRMZWFkaW5nWmVyb3NfNjQoVkFMKSAtIHVudXNlZEJpdHM7CisgICAgfQorICAgIHJldHVybiBjb3VudExlYWRpbmdaZXJvc1Nsb3dDYXNlKCk7CisgIH0KKworICAvLy8gY291bnRMZWFkaW5nT25lcyAtIFRoaXMgZnVuY3Rpb24gaXMgYW4gQVBJbnQgdmVyc2lvbiBvZiB0aGUKKyAgLy8vIGNvdW50TGVhZGluZ09uZXNfezMyLDY0fSBmdW5jdGlvbnMgaW4gTWF0aEV4dHJhcy5oLiBJdCBjb3VudHMgdGhlIG51bWJlcgorICAvLy8gb2Ygb25lcyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QgemVybyBiaXQuCisgIC8vLyBAcmV0dXJucyAwIGlmIHRoZSBoaWdoIG9yZGVyIGJpdCBpcyBub3Qgc2V0CisgIC8vLyBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIDEgYml0cyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IHRvIHRoZSBsZWFzdAorICAvLy8gQGJyaWVmIENvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyBvbmUgYml0cy4KKyAgdW5zaWduZWQgY291bnRMZWFkaW5nT25lcygpIGNvbnN0OworCisgIC8vLyBjb3VudFRyYWlsaW5nWmVyb3MgLSBUaGlzIGZ1bmN0aW9uIGlzIGFuIEFQSW50IHZlcnNpb24gb2YgdGhlCisgIC8vLyBjb3VudFRyYWlsaW5nWmVyb3NfezMyLDY0fSBmdW5jdGlvbnMgaW4gTWF0aEV4dHJhcy5oLiBJdCBjb3VudHMKKyAgLy8vIHRoZSBudW1iZXIgb2YgemVyb3MgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdCBzZXQgYml0LgorICAvLy8gQHJldHVybnMgQml0V2lkdGggaWYgdGhlIHZhbHVlIGlzIHplcm8uCisgIC8vLyBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIHplcm9zIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QKKyAgLy8vIG9uZSBiaXQuCisgIC8vLyBAYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHMuCisgIHVuc2lnbmVkIGNvdW50VHJhaWxpbmdaZXJvcygpIGNvbnN0OworCisgIC8vLyBjb3VudFRyYWlsaW5nT25lcyAtIFRoaXMgZnVuY3Rpb24gaXMgYW4gQVBJbnQgdmVyc2lvbiBvZiB0aGUKKyAgLy8vIGNvdW50VHJhaWxpbmdPbmVzX3szMiw2NH0gZnVuY3Rpb25zIGluIE1hdGhFeHRyYXMuaC4gSXQgY291bnRzCisgIC8vLyB0aGUgbnVtYmVyIG9mIG9uZXMgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdCB6ZXJvIGJpdC4KKyAgLy8vIEByZXR1cm5zIEJpdFdpZHRoIGlmIHRoZSB2YWx1ZSBpcyBhbGwgb25lcy4KKyAgLy8vIEByZXR1cm5zIHRoZSBudW1iZXIgb2Ygb25lcyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIGZpcnN0CisgIC8vLyB6ZXJvIGJpdC4KKyAgLy8vIEBicmllZiBDb3VudCB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIG9uZSBiaXRzLgorICB1bnNpZ25lZCBjb3VudFRyYWlsaW5nT25lcygpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gQ291bnRUcmFpbGluZ09uZXNfNjQoVkFMKTsKKyAgICByZXR1cm4gY291bnRUcmFpbGluZ09uZXNTbG93Q2FzZSgpOworICB9CisKKyAgLy8vIGNvdW50UG9wdWxhdGlvbiAtIFRoaXMgZnVuY3Rpb24gaXMgYW4gQVBJbnQgdmVyc2lvbiBvZiB0aGUKKyAgLy8vIGNvdW50UG9wdWxhdGlvbl97MzIsNjR9IGZ1bmN0aW9ucyBpbiBNYXRoRXh0cmFzLmguIEl0IGNvdW50cyB0aGUgbnVtYmVyCisgIC8vLyBvZiAxIGJpdHMgaW4gdGhlIEFQSW50IHZhbHVlLgorICAvLy8gQHJldHVybnMgMCBpZiB0aGUgdmFsdWUgaXMgemVyby4KKyAgLy8vIEByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2V0IGJpdHMuCisgIC8vLyBAYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiBiaXRzIHNldC4KKyAgdW5zaWduZWQgY291bnRQb3B1bGF0aW9uKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBDb3VudFBvcHVsYXRpb25fNjQoVkFMKTsKKyAgICByZXR1cm4gY291bnRQb3B1bGF0aW9uU2xvd0Nhc2UoKTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQ29udmVyc2lvbiBGdW5jdGlvbnMKKyAgLy8vIEB7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBib29sIGlzU2lnbmVkKSBjb25zdDsKKworICAvLy8gdG9TdHJpbmcgLSBDb252ZXJ0cyBhbiBBUEludCB0byBhIHN0cmluZyBhbmQgYXBwZW5kIGl0IHRvIFN0ci4gIFN0ciBpcworICAvLy8gY29tbW9ubHkgYSBTbWFsbFN0cmluZy4KKyAgdm9pZCB0b1N0cmluZyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwgdW5zaWduZWQgUmFkaXgsIGJvb2wgU2lnbmVkKSBjb25zdDsKKworICAvLy8gQ29uc2lkZXJzIHRoZSBBUEludCB0byBiZSB1bnNpZ25lZCBhbmQgY29udmVydHMgaXQgaW50byBhIHN0cmluZyBpbiB0aGUKKyAgLy8vIHJhZGl4IGdpdmVuLiBUaGUgcmFkaXggY2FuIGJlIDIsIDgsIDEwIG9yIDE2LgorICB2b2lkIHRvU3RyaW5nVW5zaWduZWQoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIsIHVuc2lnbmVkIFJhZGl4ID0gMTApIGNvbnN0IHsKKyAgICB0b1N0cmluZyhTdHIsIFJhZGl4LCBmYWxzZSk7CisgIH0KKworICAvLy8gQ29uc2lkZXJzIHRoZSBBUEludCB0byBiZSBzaWduZWQgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBzdHJpbmcgaW4gdGhlCisgIC8vLyByYWRpeCBnaXZlbi4gVGhlIHJhZGl4IGNhbiBiZSAyLCA4LCAxMCBvciAxNi4KKyAgdm9pZCB0b1N0cmluZ1NpZ25lZChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwgdW5zaWduZWQgUmFkaXggPSAxMCkgY29uc3QgeworICAgIHRvU3RyaW5nKFN0ciwgUmFkaXgsIHRydWUpOworICB9CisKKyAgLy8vIHRvU3RyaW5nIC0gVGhpcyByZXR1cm5zIHRoZSBBUEludCBhcyBhIHN0ZDo6c3RyaW5nLiAgTm90ZSB0aGF0IHRoaXMgaXMgYW4KKyAgLy8vIGluZWZmaWNpZW50IG1ldGhvZC4gIEl0IGlzIGJldHRlciB0byBwYXNzIGluIGEgU21hbGxWZWN0b3IvU21hbGxTdHJpbmcKKyAgLy8vIHRvIHRoZSBtZXRob2RzIGFib3ZlIHRvIGF2b2lkIHRocmFzaGluZyB0aGUgaGVhcCBmb3IgdGhlIHN0cmluZy4KKyAgc3RkOjpzdHJpbmcgdG9TdHJpbmcodW5zaWduZWQgUmFkaXgsIGJvb2wgU2lnbmVkKSBjb25zdDsKKworCisgIC8vLyBAcmV0dXJucyBhIGJ5dGUtc3dhcHBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEFQSW50IFZhbHVlLgorICBBUEludCBieXRlU3dhcCgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgQ29udmVydHMgdGhpcyBBUEludCB0byBhIGRvdWJsZSB2YWx1ZS4KKyAgZG91YmxlIHJvdW5kVG9Eb3VibGUoYm9vbCBpc1NpZ25lZCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBDb252ZXJ0cyB0aGlzIHVuc2lnbmVkIEFQSW50IHRvIGEgZG91YmxlIHZhbHVlLgorICBkb3VibGUgcm91bmRUb0RvdWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcm91bmRUb0RvdWJsZShmYWxzZSk7CisgIH0KKworICAvLy8gQGJyaWVmIENvbnZlcnRzIHRoaXMgc2lnbmVkIEFQSW50IHRvIGEgZG91YmxlIHZhbHVlLgorICBkb3VibGUgc2lnbmVkUm91bmRUb0RvdWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcm91bmRUb0RvdWJsZSh0cnVlKTsKKyAgfQorCisgIC8vLyBUaGUgY29udmVyc2lvbiBkb2VzIG5vdCBkbyBhIHRyYW5zbGF0aW9uIGZyb20gaW50ZWdlciB0byBkb3VibGUsIGl0IGp1c3QKKyAgLy8vIHJlLWludGVycHJldHMgdGhlIGJpdHMgYXMgYSBkb3VibGUuIE5vdGUgdGhhdCBpdCBpcyB2YWxpZCB0byBkbyB0aGlzIG9uCisgIC8vLyBhbnkgYml0IHdpZHRoLiBFeGFjdGx5IDY0IGJpdHMgd2lsbCBiZSB0cmFuc2xhdGVkLgorICAvLy8gQGJyaWVmIENvbnZlcnRzIEFQSW50IGJpdHMgdG8gYSBkb3VibGUKKyAgZG91YmxlIGJpdHNUb0RvdWJsZSgpIGNvbnN0IHsKKyAgICB1bmlvbiB7CisgICAgICB1aW50NjRfdCBJOworICAgICAgZG91YmxlIEQ7CisgICAgfSBUOworICAgIFQuSSA9IChpc1NpbmdsZVdvcmQoKSA/IFZBTCA6IHBWYWxbMF0pOworICAgIHJldHVybiBULkQ7CisgIH0KKworICAvLy8gVGhlIGNvbnZlcnNpb24gZG9lcyBub3QgZG8gYSB0cmFuc2xhdGlvbiBmcm9tIGludGVnZXIgdG8gZmxvYXQsIGl0IGp1c3QKKyAgLy8vIHJlLWludGVycHJldHMgdGhlIGJpdHMgYXMgYSBmbG9hdC4gTm90ZSB0aGF0IGl0IGlzIHZhbGlkIHRvIGRvIHRoaXMgb24KKyAgLy8vIGFueSBiaXQgd2lkdGguIEV4YWN0bHkgMzIgYml0cyB3aWxsIGJlIHRyYW5zbGF0ZWQuCisgIC8vLyBAYnJpZWYgQ29udmVydHMgQVBJbnQgYml0cyB0byBhIGRvdWJsZQorICBmbG9hdCBiaXRzVG9GbG9hdCgpIGNvbnN0IHsKKyAgICB1bmlvbiB7CisgICAgICB1bnNpZ25lZCBJOworICAgICAgZmxvYXQgRjsKKyAgICB9IFQ7CisgICAgVC5JID0gdW5zaWduZWQoKGlzU2luZ2xlV29yZCgpID8gVkFMIDogcFZhbFswXSkpOworICAgIHJldHVybiBULkY7CisgIH0KKworICAvLy8gVGhlIGNvbnZlcnNpb24gZG9lcyBub3QgZG8gYSB0cmFuc2xhdGlvbiBmcm9tIGRvdWJsZSB0byBpbnRlZ2VyLCBpdCBqdXN0CisgIC8vLyByZS1pbnRlcnByZXRzIHRoZSBiaXRzIG9mIHRoZSBkb3VibGUuIE5vdGUgdGhhdCBpdCBpcyB2YWxpZCB0byBkbyB0aGlzIG9uCisgIC8vLyBhbnkgYml0IHdpZHRoIGJ1dCBiaXRzIGZyb20gViBtYXkgZ2V0IHRydW5jYXRlZC4KKyAgLy8vIEBicmllZiBDb252ZXJ0cyBhIGRvdWJsZSB0byBBUEludCBiaXRzLgorICBBUEludCYgZG91YmxlVG9CaXRzKGRvdWJsZSBWKSB7CisgICAgdW5pb24geworICAgICAgdWludDY0X3QgSTsKKyAgICAgIGRvdWJsZSBEOworICAgIH0gVDsKKyAgICBULkQgPSBWOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFZBTCA9IFQuSTsKKyAgICBlbHNlCisgICAgICBwVmFsWzBdID0gVC5JOworICAgIHJldHVybiBjbGVhclVudXNlZEJpdHMoKTsKKyAgfQorCisgIC8vLyBUaGUgY29udmVyc2lvbiBkb2VzIG5vdCBkbyBhIHRyYW5zbGF0aW9uIGZyb20gZmxvYXQgdG8gaW50ZWdlciwgaXQganVzdAorICAvLy8gcmUtaW50ZXJwcmV0cyB0aGUgYml0cyBvZiB0aGUgZmxvYXQuIE5vdGUgdGhhdCBpdCBpcyB2YWxpZCB0byBkbyB0aGlzIG9uCisgIC8vLyBhbnkgYml0IHdpZHRoIGJ1dCBiaXRzIGZyb20gViBtYXkgZ2V0IHRydW5jYXRlZC4KKyAgLy8vIEBicmllZiBDb252ZXJ0cyBhIGZsb2F0IHRvIEFQSW50IGJpdHMuCisgIEFQSW50JiBmbG9hdFRvQml0cyhmbG9hdCBWKSB7CisgICAgdW5pb24geworICAgICAgdW5zaWduZWQgSTsKKyAgICAgIGZsb2F0IEY7CisgICAgfSBUOworICAgIFQuRiA9IFY7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgVkFMID0gVC5JOworICAgIGVsc2UKKyAgICAgIHBWYWxbMF0gPSBULkk7CisgICAgcmV0dXJuIGNsZWFyVW51c2VkQml0cygpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBNYXRoZW1hdGljcyBPcGVyYXRpb25zCisgIC8vLyBAeworCisgIC8vLyBAcmV0dXJucyB0aGUgZmxvb3IgbG9nIGJhc2UgMiBvZiB0aGlzIEFQSW50LgorICB1bnNpZ25lZCBsb2dCYXNlMigpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0V2lkdGggLSAxIC0gY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0aGUgY2VpbCBsb2cgYmFzZSAyIG9mIHRoaXMgQVBJbnQuCisgIHVuc2lnbmVkIGNlaWxMb2dCYXNlMigpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0V2lkdGggLSAoKnRoaXMgLSAxKS5jb3VudExlYWRpbmdaZXJvcygpOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRoZSBsb2cgYmFzZSAyIG9mIHRoaXMgQVBJbnQgaWYgaXRzIGFuIGV4YWN0IHBvd2VyIG9mIHR3bywgLTEKKyAgLy8vIG90aGVyd2lzZQorICBpbnQzMl90IGV4YWN0TG9nQmFzZTIoKSBjb25zdCB7CisgICAgaWYgKCFpc1Bvd2VyT2YyKCkpCisgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIGxvZ0Jhc2UyKCk7CisgIH0KKworICAvLy8gQGJyaWVmIENvbXB1dGUgdGhlIHNxdWFyZSByb290CisgIEFQSW50IHNxcnQoKSBjb25zdDsKKworICAvLy8gSWYgKnRoaXMgaXMgPCAwIHRoZW4gcmV0dXJuIC0oKnRoaXMpLCBvdGhlcndpc2UgKnRoaXM7CisgIC8vLyBAYnJpZWYgR2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZTsKKyAgQVBJbnQgYWJzKCkgY29uc3QgeworICAgIGlmIChpc05lZ2F0aXZlKCkpCisgICAgICByZXR1cm4gLSgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRoZSBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIGZvciBhIGdpdmVuIG1vZHVsby4KKyAgQVBJbnQgbXVsdGlwbGljYXRpdmVJbnZlcnNlKGNvbnN0IEFQSW50JiBtb2R1bG8pIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgU3VwcG9ydCBmb3IgZGl2aXNpb24gYnkgY29uc3RhbnQKKyAgLy8vIEB7CisKKyAgLy8vIENhbGN1bGF0ZSB0aGUgbWFnaWMgbnVtYmVyIGZvciBzaWduZWQgZGl2aXNpb24gYnkgYSBjb25zdGFudC4KKyAgc3RydWN0IG1zOworICBtcyBtYWdpYygpIGNvbnN0OworCisgIC8vLyBDYWxjdWxhdGUgdGhlIG1hZ2ljIG51bWJlciBmb3IgdW5zaWduZWQgZGl2aXNpb24gYnkgYSBjb25zdGFudC4KKyAgc3RydWN0IG11OworICBtdSBtYWdpY3UoKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEJ1aWxkaW5nLWJsb2NrIE9wZXJhdGlvbnMgZm9yIEFQSW50IGFuZCBBUEZsb2F0CisgIC8vLyBAeworCisgIC8vIFRoZXNlIGJ1aWxkaW5nIGJsb2NrIG9wZXJhdGlvbnMgb3BlcmF0ZSBvbiBhIHJlcHJlc2VudGF0aW9uIG9mCisgIC8vIGFyYml0cmFyeSBwcmVjaXNpb24sIHR3bydzLWNvbXBsZW1lbnQsIGJpZ251bSBpbnRlZ2VyIHZhbHVlcy4KKyAgLy8gVGhleSBzaG91bGQgYmUgc3VmZmljaWVudCB0byBpbXBsZW1lbnQgQVBJbnQgYW5kIEFQRmxvYXQgYmlnbnVtCisgIC8vIHJlcXVpcmVtZW50cy4gIElucHV0cyBhcmUgZ2VuZXJhbGx5IGEgcG9pbnRlciB0byB0aGUgYmFzZSBvZiBhbgorICAvLyBhcnJheSBvZiBpbnRlZ2VyIHBhcnRzLCByZXByZXNlbnRpbmcgYW4gdW5zaWduZWQgYmlnbnVtLCBhbmQgYQorICAvLyBjb3VudCBvZiBob3cgbWFueSBwYXJ0cyB0aGVyZSBhcmUuCisKKyAgLy8vIFNldHMgdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnQgb2YgYSBiaWdudW0gdG8gdGhlIGlucHV0IHZhbHVlLAorICAvLy8gYW5kIHplcm9lcyBvdXQgaGlnaGVyIHBhcnRzLiAgKi8KKyAgc3RhdGljIHZvaWQgdGNTZXQoaW50ZWdlclBhcnQgKiwgaW50ZWdlclBhcnQsIHVuc2lnbmVkIGludCk7CisKKyAgLy8vIEFzc2lnbiBvbmUgYmlnbnVtIHRvIGFub3RoZXIuCisgIHN0YXRpYyB2b2lkIHRjQXNzaWduKGludGVnZXJQYXJ0ICosIGNvbnN0IGludGVnZXJQYXJ0ICosIHVuc2lnbmVkIGludCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhIGJpZ251bSBpcyB6ZXJvLCBmYWxzZSBvdGhlcndpc2UuCisgIHN0YXRpYyBib29sIHRjSXNaZXJvKGNvbnN0IGludGVnZXJQYXJ0ICosIHVuc2lnbmVkIGludCk7CisKKyAgLy8vIEV4dHJhY3QgdGhlIGdpdmVuIGJpdCBvZiBhIGJpZ251bTsgcmV0dXJucyAwIG9yIDEuICBaZXJvLWJhc2VkLgorICBzdGF0aWMgaW50IHRjRXh0cmFjdEJpdChjb25zdCBpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQgYml0KTsKKworICAvLy8gQ29weSB0aGUgYml0IHZlY3RvciBvZiB3aWR0aCBzcmNCSVRTIGZyb20gU1JDLCBzdGFydGluZyBhdCBiaXQKKyAgLy8vIHNyY0xTQiwgdG8gRFNULCBvZiBkc3RDT1VOVCBwYXJ0cywgc3VjaCB0aGF0IHRoZSBiaXQgc3JjTFNCCisgIC8vLyBiZWNvbWVzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgRFNULiAgQWxsIGhpZ2ggYml0cyBhYm92ZQorICAvLy8gc3JjQklUUyBpbiBEU1QgYXJlIHplcm8tZmlsbGVkLgorICBzdGF0aWMgdm9pZCB0Y0V4dHJhY3QoaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50IGRzdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZWdlclBhcnQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNCaXRzLCB1bnNpZ25lZCBpbnQgc3JjTFNCKTsKKworICAvLy8gU2V0IHRoZSBnaXZlbiBiaXQgb2YgYSBiaWdudW0uICBaZXJvLWJhc2VkLgorICBzdGF0aWMgdm9pZCB0Y1NldEJpdChpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQgYml0KTsKKworICAvLy8gQ2xlYXIgdGhlIGdpdmVuIGJpdCBvZiBhIGJpZ251bS4gIFplcm8tYmFzZWQuCisgIHN0YXRpYyB2b2lkIHRjQ2xlYXJCaXQoaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50IGJpdCk7CisKKyAgLy8vIFJldHVybnMgdGhlIGJpdCBudW1iZXIgb2YgdGhlIGxlYXN0IG9yIG1vc3Qgc2lnbmlmaWNhbnQgc2V0IGJpdAorICAvLy8gb2YgYSBudW1iZXIuICBJZiB0aGUgaW5wdXQgbnVtYmVyIGhhcyBubyBiaXRzIHNldCAtMVUgaXMKKyAgLy8vIHJldHVybmVkLgorICBzdGF0aWMgdW5zaWduZWQgaW50IHRjTFNCKGNvbnN0IGludGVnZXJQYXJ0ICosIHVuc2lnbmVkIGludCk7CisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgdGNNU0IoY29uc3QgaW50ZWdlclBhcnQgKnBhcnRzLCB1bnNpZ25lZCBpbnQgbik7CisKKyAgLy8vIE5lZ2F0ZSBhIGJpZ251bSBpbi1wbGFjZS4KKyAgc3RhdGljIHZvaWQgdGNOZWdhdGUoaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50KTsKKworICAvLy8gRFNUICs9IFJIUyArIENBUlJZIHdoZXJlIENBUlJZIGlzIHplcm8gb3Igb25lLiAgUmV0dXJucyB0aGUKKyAgLy8vIGNhcnJ5IGZsYWcuCisgIHN0YXRpYyBpbnRlZ2VyUGFydCB0Y0FkZChpbnRlZ2VyUGFydCAqLCBjb25zdCBpbnRlZ2VyUGFydCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlclBhcnQgY2FycnksIHVuc2lnbmVkKTsKKworICAvLy8gRFNUIC09IFJIUyArIENBUlJZIHdoZXJlIENBUlJZIGlzIHplcm8gb3Igb25lLiAgUmV0dXJucyB0aGUKKyAgLy8vIGNhcnJ5IGZsYWcuCisgIHN0YXRpYyBpbnRlZ2VyUGFydCB0Y1N1YnRyYWN0KGludGVnZXJQYXJ0ICosIGNvbnN0IGludGVnZXJQYXJ0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXJQYXJ0IGNhcnJ5LCB1bnNpZ25lZCk7CisKKyAgLy8vICBEU1QgKz0gU1JDICogTVVMVElQTElFUiArIFBBUlQgICBpZiBhZGQgaXMgdHJ1ZQorICAvLy8gIERTVCAgPSBTUkMgKiBNVUxUSVBMSUVSICsgUEFSVCAgIGlmIGFkZCBpcyBmYWxzZQorICAvLy8KKyAgLy8vICBSZXF1aXJlcyAwIDw9IERTVFBBUlRTIDw9IFNSQ1BBUlRTICsgMS4gIElmIERTVCBvdmVybGFwcyBTUkMKKyAgLy8vICB0aGV5IG11c3Qgc3RhcnQgYXQgdGhlIHNhbWUgcG9pbnQsIGkuZS4gRFNUID09IFNSQy4KKyAgLy8vCisgIC8vLyAgSWYgRFNUUEFSVFMgPT0gU1JDX1BBUlRTICsgMSBubyBvdmVyZmxvdyBvY2N1cnMgYW5kIHplcm8gaXMKKyAgLy8vICByZXR1cm5lZC4gIE90aGVyd2lzZSBEU1QgaXMgZmlsbGVkIHdpdGggdGhlIGxlYXN0IHNpZ25pZmljYW50CisgIC8vLyAgRFNUUEFSVFMgcGFydHMgb2YgdGhlIHJlc3VsdCwgYW5kIGlmIGFsbCBvZiB0aGUgb21pdHRlZCBoaWdoZXIKKyAgLy8vICBwYXJ0cyB3ZXJlIHplcm8gcmV0dXJuIHplcm8sIG90aGVyd2lzZSBvdmVyZmxvdyBvY2N1cnJlZCBhbmQKKyAgLy8vICByZXR1cm4gb25lLgorICBzdGF0aWMgaW50IHRjTXVsdGlwbHlQYXJ0KGludGVnZXJQYXJ0ICpkc3QsIGNvbnN0IGludGVnZXJQYXJ0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlclBhcnQgbXVsdGlwbGllciwgaW50ZWdlclBhcnQgY2FycnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNyY1BhcnRzLCB1bnNpZ25lZCBpbnQgZHN0UGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGQpOworCisgIC8vLyBEU1QgPSBMSFMgKiBSSFMsIHdoZXJlIERTVCBoYXMgdGhlIHNhbWUgd2lkdGggYXMgdGhlIG9wZXJhbmRzCisgIC8vLyBhbmQgaXMgZmlsbGVkIHdpdGggdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnRzIG9mIHRoZSByZXN1bHQuCisgIC8vLyBSZXR1cm5zIG9uZSBpZiBvdmVyZmxvdyBvY2N1cnJlZCwgb3RoZXJ3aXNlIHplcm8uICBEU1QgbXVzdCBiZQorICAvLy8gZGlzam9pbnQgZnJvbSBib3RoIG9wZXJhbmRzLgorICBzdGF0aWMgaW50IHRjTXVsdGlwbHkoaW50ZWdlclBhcnQgKiwgY29uc3QgaW50ZWdlclBhcnQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVnZXJQYXJ0ICosIHVuc2lnbmVkKTsKKworICAvLy8gRFNUID0gTEhTICogUkhTLCB3aGVyZSBEU1QgaGFzIHdpZHRoIHRoZSBzdW0gb2YgdGhlIHdpZHRocyBvZgorICAvLy8gdGhlIG9wZXJhbmRzLiAgTm8gb3ZlcmZsb3cgb2NjdXJzLiAgRFNUIG11c3QgYmUgZGlzam9pbnQgZnJvbQorICAvLy8gYm90aCBvcGVyYW5kcy4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcnRzIHJlcXVpcmVkIHRvIGhvbGQgdGhlCisgIC8vLyByZXN1bHQuCisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgdGNGdWxsTXVsdGlwbHkoaW50ZWdlclBhcnQgKiwgY29uc3QgaW50ZWdlclBhcnQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOworCisgIC8vLyBJZiBSSFMgaXMgemVybyBMSFMgYW5kIFJFTUFJTkRFUiBhcmUgbGVmdCB1bmNoYW5nZWQsIHJldHVybiBvbmUuCisgIC8vLyBPdGhlcndpc2Ugc2V0IExIUyB0byBMSFMgLyBSSFMgd2l0aCB0aGUgZnJhY3Rpb25hbCBwYXJ0CisgIC8vLyBkaXNjYXJkZWQsIHNldCBSRU1BSU5ERVIgdG8gdGhlIHJlbWFpbmRlciwgcmV0dXJuIHplcm8uICBpLmUuCisgIC8vLworICAvLy8gIE9MRF9MSFMgPSBSSFMgKiBMSFMgKyBSRU1BSU5ERVIKKyAgLy8vCisgIC8vLyAgU0NSQVRDSCBpcyBhIGJpZ251bSBvZiB0aGUgc2FtZSBzaXplIGFzIHRoZSBvcGVyYW5kcyBhbmQgcmVzdWx0CisgIC8vLyAgZm9yIHVzZSBieSB0aGUgcm91dGluZTsgaXRzIGNvbnRlbnRzIG5lZWQgbm90IGJlIGluaXRpYWxpemVkCisgIC8vLyAgYW5kIGFyZSBkZXN0cm95ZWQuICBMSFMsIFJFTUFJTkRFUiBhbmQgU0NSQVRDSCBtdXN0IGJlCisgIC8vLyAgZGlzdGluY3QuCisgIHN0YXRpYyBpbnQgdGNEaXZpZGUoaW50ZWdlclBhcnQgKmxocywgY29uc3QgaW50ZWdlclBhcnQgKnJocywKKyAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyUGFydCAqcmVtYWluZGVyLCBpbnRlZ2VyUGFydCAqc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFydHMpOworCisgIC8vLyBTaGlmdCBhIGJpZ251bSBsZWZ0IENPVU5UIGJpdHMuICBTaGlmdGVkIGluIGJpdHMgYXJlIHplcm8uCisgIC8vLyBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIENPVU5ULgorICBzdGF0aWMgdm9pZCB0Y1NoaWZ0TGVmdChpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQgcGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb3VudCk7CisKKyAgLy8vIFNoaWZ0IGEgYmlnbnVtIHJpZ2h0IENPVU5UIGJpdHMuICBTaGlmdGVkIGluIGJpdHMgYXJlIHplcm8uCisgIC8vLyBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIENPVU5ULgorICBzdGF0aWMgdm9pZCB0Y1NoaWZ0UmlnaHQoaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50IHBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50KTsKKworICAvLy8gVGhlIG9idmlvdXMgQU5ELCBPUiBhbmQgWE9SIGFuZCBjb21wbGVtZW50IG9wZXJhdGlvbnMuCisgIHN0YXRpYyB2b2lkIHRjQW5kKGludGVnZXJQYXJ0ICosIGNvbnN0IGludGVnZXJQYXJ0ICosIHVuc2lnbmVkIGludCk7CisgIHN0YXRpYyB2b2lkIHRjT3IoaW50ZWdlclBhcnQgKiwgY29uc3QgaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50KTsKKyAgc3RhdGljIHZvaWQgdGNYb3IoaW50ZWdlclBhcnQgKiwgY29uc3QgaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50KTsKKyAgc3RhdGljIHZvaWQgdGNDb21wbGVtZW50KGludGVnZXJQYXJ0ICosIHVuc2lnbmVkIGludCk7CisKKyAgLy8vIENvbXBhcmlzb24gKHVuc2lnbmVkKSBvZiB0d28gYmlnbnVtcy4KKyAgc3RhdGljIGludCB0Y0NvbXBhcmUoY29uc3QgaW50ZWdlclBhcnQgKiwgY29uc3QgaW50ZWdlclBhcnQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KTsKKworICAvLy8gSW5jcmVtZW50IGEgYmlnbnVtIGluLXBsYWNlLiAgUmV0dXJuIHRoZSBjYXJyeSBmbGFnLgorICBzdGF0aWMgaW50ZWdlclBhcnQgdGNJbmNyZW1lbnQoaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50KTsKKworICAvLy8gU2V0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBCSVRTIGFuZCBjbGVhciB0aGUgcmVzdC4KKyAgc3RhdGljIHZvaWQgdGNTZXRMZWFzdFNpZ25pZmljYW50Qml0cyhpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJpdHMpOworCisgIC8vLyBAYnJpZWYgZGVidWcgbWV0aG9kCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBAfQorfTsKKworLy8vIE1hZ2ljIGRhdGEgZm9yIG9wdGltaXNpbmcgc2lnbmVkIGRpdmlzaW9uIGJ5IGEgY29uc3RhbnQuCitzdHJ1Y3QgQVBJbnQ6Om1zIHsKKyAgQVBJbnQgbTsgIC8vLzwgbWFnaWMgbnVtYmVyCisgIHVuc2lnbmVkIHM7ICAvLy88IHNoaWZ0IGFtb3VudAorfTsKKworLy8vIE1hZ2ljIGRhdGEgZm9yIG9wdGltaXNpbmcgdW5zaWduZWQgZGl2aXNpb24gYnkgYSBjb25zdGFudC4KK3N0cnVjdCBBUEludDo6bXUgeworICBBUEludCBtOyAgICAgLy8vPCBtYWdpYyBudW1iZXIKKyAgYm9vbCBhOyAgICAgIC8vLzwgYWRkIGluZGljYXRvcgorICB1bnNpZ25lZCBzOyAgLy8vPCBzaGlmdCBhbW91bnQKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0odWludDY0X3QgVjEsIGNvbnN0IEFQSW50JiBWMikgeworICByZXR1cm4gVjIgPT0gVjE7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0odWludDY0X3QgVjEsIGNvbnN0IEFQSW50JiBWMikgeworICByZXR1cm4gVjIgIT0gVjE7Cit9CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEFQSW50ICZJKSB7CisgIEkucHJpbnQoT1MsIHRydWUpOworICByZXR1cm4gT1M7Cit9CisKK25hbWVzcGFjZSBBUEludE9wcyB7CisKKy8vLyBAYnJpZWYgRGV0ZXJtaW5lIHRoZSBzbWFsbGVyIG9mIHR3byBBUEludHMgY29uc2lkZXJlZCB0byBiZSBzaWduZWQuCitpbmxpbmUgQVBJbnQgc21pbihjb25zdCBBUEludCAmQSwgY29uc3QgQVBJbnQgJkIpIHsKKyAgcmV0dXJuIEEuc2x0KEIpID8gQSA6IEI7Cit9CisKKy8vLyBAYnJpZWYgRGV0ZXJtaW5lIHRoZSBsYXJnZXIgb2YgdHdvIEFQSW50cyBjb25zaWRlcmVkIHRvIGJlIHNpZ25lZC4KK2lubGluZSBBUEludCBzbWF4KGNvbnN0IEFQSW50ICZBLCBjb25zdCBBUEludCAmQikgeworICByZXR1cm4gQS5zZ3QoQikgPyBBIDogQjsKK30KKworLy8vIEBicmllZiBEZXRlcm1pbmUgdGhlIHNtYWxsZXIgb2YgdHdvIEFQSW50cyBjb25zaWRlcmVkIHRvIGJlIHNpZ25lZC4KK2lubGluZSBBUEludCB1bWluKGNvbnN0IEFQSW50ICZBLCBjb25zdCBBUEludCAmQikgeworICByZXR1cm4gQS51bHQoQikgPyBBIDogQjsKK30KKworLy8vIEBicmllZiBEZXRlcm1pbmUgdGhlIGxhcmdlciBvZiB0d28gQVBJbnRzIGNvbnNpZGVyZWQgdG8gYmUgdW5zaWduZWQuCitpbmxpbmUgQVBJbnQgdW1heChjb25zdCBBUEludCAmQSwgY29uc3QgQVBJbnQgJkIpIHsKKyAgcmV0dXJuIEEudWd0KEIpID8gQSA6IEI7Cit9CisKKy8vLyBAYnJpZWYgQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBBUEludCBoYXMgYSBOLWJpdHMgdW5zaWduZWQgaW50ZWdlciB2YWx1ZS4KK2lubGluZSBib29sIGlzSW50Tih1bnNpZ25lZCBOLCBjb25zdCBBUEludCYgQVBJVmFsKSB7CisgIHJldHVybiBBUElWYWwuaXNJbnROKE4pOworfQorCisvLy8gQGJyaWVmIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgQVBJbnQgaGFzIGEgTi1iaXRzIHNpZ25lZCBpbnRlZ2VyIHZhbHVlLgoraW5saW5lIGJvb2wgaXNTaWduZWRJbnROKHVuc2lnbmVkIE4sIGNvbnN0IEFQSW50JiBBUElWYWwpIHsKKyAgcmV0dXJuIEFQSVZhbC5pc1NpZ25lZEludE4oTik7Cit9CisKKy8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBBUEludCB2YWx1ZSBpcyBhIHNlcXVlbmNlIG9mIG9uZXMKKy8vLyBzdGFydGluZyBhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdpdGggdGhlIHJlbWFpbmRlciB6ZXJvLgoraW5saW5lIGJvb2wgaXNNYXNrKHVuc2lnbmVkIG51bUJpdHMsIGNvbnN0IEFQSW50JiBBUElWYWwpIHsKKyAgcmV0dXJuIG51bUJpdHMgPD0gQVBJVmFsLmdldEJpdFdpZHRoKCkgJiYKKyAgICBBUElWYWwgPT0gQVBJbnQ6OmdldExvd0JpdHNTZXQoQVBJVmFsLmdldEJpdFdpZHRoKCksIG51bUJpdHMpOworfQorCisvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgQVBJbnQgdmFsdWUgY29udGFpbnMgYSBzZXF1ZW5jZSBvZiBvbmVzCisvLy8gd2l0aCB0aGUgcmVtYWluZGVyIHplcm8uCitpbmxpbmUgYm9vbCBpc1NoaWZ0ZWRNYXNrKHVuc2lnbmVkIG51bUJpdHMsIGNvbnN0IEFQSW50JiBBUElWYWwpIHsKKyAgcmV0dXJuIGlzTWFzayhudW1CaXRzLCAoQVBJVmFsIC0gQVBJbnQobnVtQml0cywxKSkgfCBBUElWYWwpOworfQorCisvLy8gQHJldHVybnMgYSBieXRlLXN3YXBwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBBUEludCBWYWx1ZS4KK2lubGluZSBBUEludCBieXRlU3dhcChjb25zdCBBUEludCYgQVBJVmFsKSB7CisgIHJldHVybiBBUElWYWwuYnl0ZVN3YXAoKTsKK30KKworLy8vIEByZXR1cm5zIHRoZSBmbG9vciBsb2cgYmFzZSAyIG9mIHRoZSBzcGVjaWZpZWQgQVBJbnQgdmFsdWUuCitpbmxpbmUgdW5zaWduZWQgbG9nQmFzZTIoY29uc3QgQVBJbnQmIEFQSVZhbCkgeworICByZXR1cm4gQVBJVmFsLmxvZ0Jhc2UyKCk7Cit9CisKKy8vLyBHcmVhdGVzdENvbW1vbkRpdmlzb3IgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGdyZWF0ZXN0IGNvbW1vbgorLy8vIGRpdmlzb3Igb2YgdGhlIHR3byBBUEludCB2YWx1ZXMgdXNpbmcgRXVjbGlkJ3MgYWxnb3JpdGhtLgorLy8vIEByZXR1cm5zIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiBWYWwxIGFuZCBWYWwyCisvLy8gQGJyaWVmIENvbXB1dGUgR0NEIG9mIHR3byBBUEludCB2YWx1ZXMuCitBUEludCBHcmVhdGVzdENvbW1vbkRpdmlzb3IoY29uc3QgQVBJbnQmIFZhbDEsIGNvbnN0IEFQSW50JiBWYWwyKTsKKworLy8vIFRyZWF0cyB0aGUgQVBJbnQgYXMgYW4gdW5zaWduZWQgdmFsdWUgZm9yIGNvbnZlcnNpb24gcHVycG9zZXMuCisvLy8gQGJyaWVmIENvbnZlcnRzIHRoZSBnaXZlbiBBUEludCB0byBhIGRvdWJsZSB2YWx1ZS4KK2lubGluZSBkb3VibGUgUm91bmRBUEludFRvRG91YmxlKGNvbnN0IEFQSW50JiBBUElWYWwpIHsKKyAgcmV0dXJuIEFQSVZhbC5yb3VuZFRvRG91YmxlKCk7Cit9CisKKy8vLyBUcmVhdHMgdGhlIEFQSW50IGFzIGEgc2lnbmVkIHZhbHVlIGZvciBjb252ZXJzaW9uIHB1cnBvc2VzLgorLy8vIEBicmllZiBDb252ZXJ0cyB0aGUgZ2l2ZW4gQVBJbnQgdG8gYSBkb3VibGUgdmFsdWUuCitpbmxpbmUgZG91YmxlIFJvdW5kU2lnbmVkQVBJbnRUb0RvdWJsZShjb25zdCBBUEludCYgQVBJVmFsKSB7CisgIHJldHVybiBBUElWYWwuc2lnbmVkUm91bmRUb0RvdWJsZSgpOworfQorCisvLy8gQGJyaWVmIENvbnZlcnRzIHRoZSBnaXZlbiBBUEludCB0byBhIGZsb2F0IHZsYWx1ZS4KK2lubGluZSBmbG9hdCBSb3VuZEFQSW50VG9GbG9hdChjb25zdCBBUEludCYgQVBJVmFsKSB7CisgIHJldHVybiBmbG9hdChSb3VuZEFQSW50VG9Eb3VibGUoQVBJVmFsKSk7Cit9CisKKy8vLyBUcmVhc3QgdGhlIEFQSW50IGFzIGEgc2lnbmVkIHZhbHVlIGZvciBjb252ZXJzaW9uIHB1cnBvc2VzLgorLy8vIEBicmllZiBDb252ZXJ0cyB0aGUgZ2l2ZW4gQVBJbnQgdG8gYSBmbG9hdCB2YWx1ZS4KK2lubGluZSBmbG9hdCBSb3VuZFNpZ25lZEFQSW50VG9GbG9hdChjb25zdCBBUEludCYgQVBJVmFsKSB7CisgIHJldHVybiBmbG9hdChBUElWYWwuc2lnbmVkUm91bmRUb0RvdWJsZSgpKTsKK30KKworLy8vIFJvdW5kRG91YmxlVG9BUEludCAtIFRoaXMgZnVuY3Rpb24gY29udmVydCBhIGRvdWJsZSB2YWx1ZSB0byBhbiBBUEludCB2YWx1ZS4KKy8vLyBAYnJpZWYgQ29udmVydHMgdGhlIGdpdmVuIGRvdWJsZSB2YWx1ZSBpbnRvIGEgQVBJbnQuCitBUEludCBSb3VuZERvdWJsZVRvQVBJbnQoZG91YmxlIERvdWJsZSwgdW5zaWduZWQgd2lkdGgpOworCisvLy8gUm91bmRGbG9hdFRvQVBJbnQgLSBDb252ZXJ0cyBhIGZsb2F0IHZhbHVlIGludG8gYW4gQVBJbnQgdmFsdWUuCisvLy8gQGJyaWVmIENvbnZlcnRzIGEgZmxvYXQgdmFsdWUgaW50byBhIEFQSW50LgoraW5saW5lIEFQSW50IFJvdW5kRmxvYXRUb0FQSW50KGZsb2F0IEZsb2F0LCB1bnNpZ25lZCB3aWR0aCkgeworICByZXR1cm4gUm91bmREb3VibGVUb0FQSW50KGRvdWJsZShGbG9hdCksIHdpZHRoKTsKK30KKworLy8vIEFyaXRobWV0aWMgcmlnaHQtc2hpZnQgdGhlIEFQSW50IGJ5IHNoaWZ0QW10LgorLy8vIEBicmllZiBBcml0aG1ldGljIHJpZ2h0LXNoaWZ0IGZ1bmN0aW9uLgoraW5saW5lIEFQSW50IGFzaHIoY29uc3QgQVBJbnQmIExIUywgdW5zaWduZWQgc2hpZnRBbXQpIHsKKyAgcmV0dXJuIExIUy5hc2hyKHNoaWZ0QW10KTsKK30KKworLy8vIExvZ2ljYWwgcmlnaHQtc2hpZnQgdGhlIEFQSW50IGJ5IHNoaWZ0QW10LgorLy8vIEBicmllZiBMb2dpY2FsIHJpZ2h0LXNoaWZ0IGZ1bmN0aW9uLgoraW5saW5lIEFQSW50IGxzaHIoY29uc3QgQVBJbnQmIExIUywgdW5zaWduZWQgc2hpZnRBbXQpIHsKKyAgcmV0dXJuIExIUy5sc2hyKHNoaWZ0QW10KTsKK30KKworLy8vIExlZnQtc2hpZnQgdGhlIEFQSW50IGJ5IHNoaWZ0QW10LgorLy8vIEBicmllZiBMZWZ0LXNoaWZ0IGZ1bmN0aW9uLgoraW5saW5lIEFQSW50IHNobChjb25zdCBBUEludCYgTEhTLCB1bnNpZ25lZCBzaGlmdEFtdCkgeworICByZXR1cm4gTEhTLnNobChzaGlmdEFtdCk7Cit9CisKKy8vLyBTaWduZWQgZGl2aWRlIEFQSW50IExIUyBieSBBUEludCBSSFMuCisvLy8gQGJyaWVmIFNpZ25lZCBkaXZpc2lvbiBmdW5jdGlvbiBmb3IgQVBJbnQuCitpbmxpbmUgQVBJbnQgc2Rpdihjb25zdCBBUEludCYgTEhTLCBjb25zdCBBUEludCYgUkhTKSB7CisgIHJldHVybiBMSFMuc2RpdihSSFMpOworfQorCisvLy8gVW5zaWduZWQgZGl2aWRlIEFQSW50IExIUyBieSBBUEludCBSSFMuCisvLy8gQGJyaWVmIFVuc2lnbmVkIGRpdmlzaW9uIGZ1bmN0aW9uIGZvciBBUEludC4KK2lubGluZSBBUEludCB1ZGl2KGNvbnN0IEFQSW50JiBMSFMsIGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgcmV0dXJuIExIUy51ZGl2KFJIUyk7Cit9CisKKy8vLyBTaWduZWQgcmVtYWluZGVyIG9wZXJhdGlvbiBvbiBBUEludC4KKy8vLyBAYnJpZWYgRnVuY3Rpb24gZm9yIHNpZ25lZCByZW1haW5kZXIgb3BlcmF0aW9uLgoraW5saW5lIEFQSW50IHNyZW0oY29uc3QgQVBJbnQmIExIUywgY29uc3QgQVBJbnQmIFJIUykgeworICByZXR1cm4gTEhTLnNyZW0oUkhTKTsKK30KKworLy8vIFVuc2lnbmVkIHJlbWFpbmRlciBvcGVyYXRpb24gb24gQVBJbnQuCisvLy8gQGJyaWVmIEZ1bmN0aW9uIGZvciB1bnNpZ25lZCByZW1haW5kZXIgb3BlcmF0aW9uLgoraW5saW5lIEFQSW50IHVyZW0oY29uc3QgQVBJbnQmIExIUywgY29uc3QgQVBJbnQmIFJIUykgeworICByZXR1cm4gTEhTLnVyZW0oUkhTKTsKK30KKworLy8vIFBlcmZvcm1zIG11bHRpcGxpY2F0aW9uIG9uIEFQSW50IHZhbHVlcy4KKy8vLyBAYnJpZWYgRnVuY3Rpb24gZm9yIG11bHRpcGxpY2F0aW9uIG9wZXJhdGlvbi4KK2lubGluZSBBUEludCBtdWwoY29uc3QgQVBJbnQmIExIUywgY29uc3QgQVBJbnQmIFJIUykgeworICByZXR1cm4gTEhTICogUkhTOworfQorCisvLy8gUGVyZm9ybXMgYWRkaXRpb24gb24gQVBJbnQgdmFsdWVzLgorLy8vIEBicmllZiBGdW5jdGlvbiBmb3IgYWRkaXRpb24gb3BlcmF0aW9uLgoraW5saW5lIEFQSW50IGFkZChjb25zdCBBUEludCYgTEhTLCBjb25zdCBBUEludCYgUkhTKSB7CisgIHJldHVybiBMSFMgKyBSSFM7Cit9CisKKy8vLyBQZXJmb3JtcyBzdWJ0cmFjdGlvbiBvbiBBUEludCB2YWx1ZXMuCisvLy8gQGJyaWVmIEZ1bmN0aW9uIGZvciBzdWJ0cmFjdGlvbiBvcGVyYXRpb24uCitpbmxpbmUgQVBJbnQgc3ViKGNvbnN0IEFQSW50JiBMSFMsIGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgcmV0dXJuIExIUyAtIFJIUzsKK30KKworLy8vIFBlcmZvcm1zIGJpdHdpc2UgQU5EIG9wZXJhdGlvbiBvbiBBUEludCBMSFMgYW5kCisvLy8gQVBJbnQgUkhTLgorLy8vIEBicmllZiBCaXR3aXNlIEFORCBmdW5jdGlvbiBmb3IgQVBJbnQuCitpbmxpbmUgQVBJbnQgQW5kKGNvbnN0IEFQSW50JiBMSFMsIGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgcmV0dXJuIExIUyAmIFJIUzsKK30KKworLy8vIFBlcmZvcm1zIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIEFQSW50IExIUyBhbmQgQVBJbnQgUkhTLgorLy8vIEBicmllZiBCaXR3aXNlIE9SIGZ1bmN0aW9uIGZvciBBUEludC4KK2lubGluZSBBUEludCBPcihjb25zdCBBUEludCYgTEhTLCBjb25zdCBBUEludCYgUkhTKSB7CisgIHJldHVybiBMSFMgfCBSSFM7Cit9CisKKy8vLyBQZXJmb3JtcyBiaXR3aXNlIFhPUiBvcGVyYXRpb24gb24gQVBJbnQuCisvLy8gQGJyaWVmIEJpdHdpc2UgWE9SIGZ1bmN0aW9uIGZvciBBUEludC4KK2lubGluZSBBUEludCBYb3IoY29uc3QgQVBJbnQmIExIUywgY29uc3QgQVBJbnQmIFJIUykgeworICByZXR1cm4gTEhTIF4gUkhTOworfQorCisvLy8gUGVyZm9ybXMgYSBiaXR3aXNlIGNvbXBsZW1lbnQgb3BlcmF0aW9uIG9uIEFQSW50LgorLy8vIEBicmllZiBCaXR3aXNlIGNvbXBsZW1lbnQgZnVuY3Rpb24uCitpbmxpbmUgQVBJbnQgTm90KGNvbnN0IEFQSW50JiBBUElWYWwpIHsKKyAgcmV0dXJuIH5BUElWYWw7Cit9CisKK30gLy8gRW5kIG9mIEFQSW50T3BzIG5hbWVzcGFjZQorCit9IC8vIEVuZCBvZiBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvQVBTSW50LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0FQU0ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTkzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0FQU0ludC5oCkBAIC0wLDAgKzEsMjY0IEBACisvLz09PS0tIGxsdm0vQURUL0FQU0ludC5oIC0gQXJiaXRyYXJ5IFByZWNpc2lvbiBTaWduZWQgSW50IC0tLS0tKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBUFNJbnQgY2xhc3MsIHdoaWNoIGlzIGEgc2ltcGxlIGNsYXNzIHRoYXQKKy8vIHJlcHJlc2VudHMgYW4gYXJiaXRyYXJ5IHNpemVkIGludGVnZXIgdGhhdCBrbm93cyBpdHMgc2lnbmVkbmVzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQVBTSU5UX0gKKyNkZWZpbmUgTExWTV9BUFNJTlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBUFNJbnQgOiBwdWJsaWMgQVBJbnQgeworICBib29sIElzVW5zaWduZWQ7CitwdWJsaWM6CisgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIHRoYXQgY3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIEFQSW50LgorICBleHBsaWNpdCBBUFNJbnQoKSB7fQorCisgIC8vLyBBUFNJbnQgY3RvciAtIENyZWF0ZSBhbiBBUFNJbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBkZWZhdWx0IHRvCisgIC8vLyB1bnNpZ25lZC4KKyAgZXhwbGljaXQgQVBTSW50KHVpbnQzMl90IEJpdFdpZHRoLCBib29sIGlzVW5zaWduZWQgPSB0cnVlKQorICAgOiBBUEludChCaXRXaWR0aCwgMCksIElzVW5zaWduZWQoaXNVbnNpZ25lZCkge30KKworICBleHBsaWNpdCBBUFNJbnQoY29uc3QgQVBJbnQgJkksIGJvb2wgaXNVbnNpZ25lZCA9IHRydWUpCisgICA6IEFQSW50KEkpLCBJc1Vuc2lnbmVkKGlzVW5zaWduZWQpIHt9CisKKyAgQVBTSW50ICZvcGVyYXRvcj0oY29uc3QgQVBTSW50ICZSSFMpIHsKKyAgICBBUEludDo6b3BlcmF0b3I9KFJIUyk7CisgICAgSXNVbnNpZ25lZCA9IFJIUy5Jc1Vuc2lnbmVkOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEFQU0ludCAmb3BlcmF0b3I9KGNvbnN0IEFQSW50ICZSSFMpIHsKKyAgICAvLyBSZXRhaW4gb3VyIGN1cnJlbnQgc2lnbi4KKyAgICBBUEludDo6b3BlcmF0b3I9KFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQVBTSW50ICZvcGVyYXRvcj0odWludDY0X3QgUkhTKSB7CisgICAgLy8gUmV0YWluIG91ciBjdXJyZW50IHNpZ24uCisgICAgQVBJbnQ6Om9wZXJhdG9yPShSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFF1ZXJ5IHNpZ24gaW5mb3JtYXRpb24uCisgIGJvb2wgaXNTaWduZWQoKSBjb25zdCB7IHJldHVybiAhSXNVbnNpZ25lZDsgfQorICBib29sIGlzVW5zaWduZWQoKSBjb25zdCB7IHJldHVybiBJc1Vuc2lnbmVkOyB9CisgIHZvaWQgc2V0SXNVbnNpZ25lZChib29sIFZhbCkgeyBJc1Vuc2lnbmVkID0gVmFsOyB9CisgIHZvaWQgc2V0SXNTaWduZWQoYm9vbCBWYWwpIHsgSXNVbnNpZ25lZCA9ICFWYWw7IH0KKworICAvLy8gdG9TdHJpbmcgLSBBcHBlbmQgdGhpcyBBUFNJbnQgdG8gdGhlIHNwZWNpZmllZCBTbWFsbFN0cmluZy4KKyAgdm9pZCB0b1N0cmluZyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwgdW5zaWduZWQgUmFkaXggPSAxMCkgY29uc3QgeworICAgIEFQSW50Ojp0b1N0cmluZyhTdHIsIFJhZGl4LCBpc1NpZ25lZCgpKTsKKyAgfQorICAvLy8gdG9TdHJpbmcgLSBDb252ZXJ0cyBhbiBBUEludCB0byBhIHN0ZDo6c3RyaW5nLiAgVGhpcyBpcyBhbiBpbmVmZmljaWVudAorICAvLy8gbWV0aG9kLCB5b3VyIHNob3VsZCBwcmVmZXIgcGFzc2luZyBpbiBhIFNtYWxsU3RyaW5nIGluc3RlYWQuCisgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKHVuc2lnbmVkIFJhZGl4KSBjb25zdCB7CisgICAgcmV0dXJuIEFQSW50Ojp0b1N0cmluZyhSYWRpeCwgaXNTaWduZWQoKSk7CisgIH0KKyAgdXNpbmcgQVBJbnQ6OnRvU3RyaW5nOworCisgIEFQU0ludCYgZXh0ZW5kKHVpbnQzMl90IHdpZHRoKSB7CisgICAgaWYgKElzVW5zaWduZWQpCisgICAgICB6ZXh0KHdpZHRoKTsKKyAgICBlbHNlCisgICAgICBzZXh0KHdpZHRoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBBUFNJbnQmIGV4dE9yVHJ1bmModWludDMyX3Qgd2lkdGgpIHsKKyAgICAgIGlmIChJc1Vuc2lnbmVkKQorICAgICAgICB6ZXh0T3JUcnVuYyh3aWR0aCk7CisgICAgICBlbHNlCisgICAgICAgIHNleHRPclRydW5jKHdpZHRoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IEFQU0ludCAmb3BlcmF0b3IlPShjb25zdCBBUFNJbnQgJlJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIGlmIChJc1Vuc2lnbmVkKQorICAgICAgKnRoaXMgPSB1cmVtKFJIUyk7CisgICAgZWxzZQorICAgICAgKnRoaXMgPSBzcmVtKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGNvbnN0IEFQU0ludCAmb3BlcmF0b3IvPShjb25zdCBBUFNJbnQgJlJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIGlmIChJc1Vuc2lnbmVkKQorICAgICAgKnRoaXMgPSB1ZGl2KFJIUyk7CisgICAgZWxzZQorICAgICAgKnRoaXMgPSBzZGl2KFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFQU0ludCBvcGVyYXRvciUoY29uc3QgQVBTSW50ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gSXNVbnNpZ25lZCA/IEFQU0ludCh1cmVtKFJIUyksIHRydWUpIDogQVBTSW50KHNyZW0oUkhTKSwgZmFsc2UpOworICB9CisgIEFQU0ludCBvcGVyYXRvci8oY29uc3QgQVBTSW50ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gSXNVbnNpZ25lZCA/IEFQU0ludCh1ZGl2KFJIUyksIHRydWUpIDogQVBTSW50KHNkaXYoUkhTKSwgZmFsc2UpOworICB9CisKKyAgQVBTSW50IG9wZXJhdG9yPj4odW5zaWduZWQgQW10KSBjb25zdCB7CisgICAgcmV0dXJuIElzVW5zaWduZWQgPyBBUFNJbnQobHNocihBbXQpLCB0cnVlKSA6IEFQU0ludChhc2hyKEFtdCksIGZhbHNlKTsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yPj49KHVuc2lnbmVkIEFtdCkgeworICAgICp0aGlzID0gKnRoaXMgPj4gQW10OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBJc1Vuc2lnbmVkID8gdWx0KFJIUykgOiBzbHQoUkhTKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gSXNVbnNpZ25lZCA/IHVndChSSFMpIDogc2d0KFJIUyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBJc1Vuc2lnbmVkID8gdWxlKFJIUykgOiBzbGUoUkhTKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIElzVW5zaWduZWQgPyB1Z2UoUkhTKSA6IHNnZShSSFMpOworICB9CisKKyAgLy8gVGhlIHJlbWFpbmluZyBvcGVyYXRvcnMganVzdCB3cmFwIHRoZSBsb2dpYyBvZiBBUEludCwgYnV0IHJldGFpbiB0aGUKKyAgLy8gc2lnbmVkbmVzcyBpbmZvcm1hdGlvbi4KKworICBBUFNJbnQgb3BlcmF0b3I8PCh1bnNpZ25lZCBCaXRzKSBjb25zdCB7CisgICAgcmV0dXJuIEFQU0ludChzdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSA8PCBCaXRzLCBJc1Vuc2lnbmVkKTsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yPDw9KHVuc2lnbmVkIEFtdCkgeworICAgICp0aGlzID0gKnRoaXMgPDwgQW10OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEFQU0ludCYgb3BlcmF0b3IrKygpIHsKKyAgICBzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSsrOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yLS0oKSB7CisgICAgc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcyktLTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQVBTSW50IG9wZXJhdG9yKysoaW50KSB7CisgICAgcmV0dXJuIEFQU0ludCgrK3N0YXRpY19jYXN0PEFQSW50Jj4oKnRoaXMpLCBJc1Vuc2lnbmVkKTsKKyAgfQorICBBUFNJbnQgb3BlcmF0b3ItLShpbnQpIHsKKyAgICByZXR1cm4gQVBTSW50KC0tc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcyksIElzVW5zaWduZWQpOworICB9CisgIEFQU0ludCBvcGVyYXRvci0oKSBjb25zdCB7CisgICAgcmV0dXJuIEFQU0ludCgtc3RhdGljX2Nhc3Q8Y29uc3QgQVBJbnQmPigqdGhpcyksIElzVW5zaWduZWQpOworICB9CisgIEFQU0ludCYgb3BlcmF0b3IrPShjb25zdCBBUFNJbnQmIFJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHN0YXRpY19jYXN0PEFQSW50Jj4oKnRoaXMpICs9IFJIUzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQVBTSW50JiBvcGVyYXRvci09KGNvbnN0IEFQU0ludCYgUkhTKSB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcykgLT0gUkhTOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yKj0oY29uc3QgQVBTSW50JiBSSFMpIHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICBzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSAqPSBSSFM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFQU0ludCYgb3BlcmF0b3ImPShjb25zdCBBUFNJbnQmIFJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHN0YXRpY19jYXN0PEFQSW50Jj4oKnRoaXMpICY9IFJIUzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQVBTSW50JiBvcGVyYXRvcnw9KGNvbnN0IEFQU0ludCYgUkhTKSB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcykgfD0gUkhTOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yXj0oY29uc3QgQVBTSW50JiBSSFMpIHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICBzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSBePSBSSFM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQVBTSW50IG9wZXJhdG9yJihjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBBUFNJbnQoc3RhdGljX2Nhc3Q8Y29uc3QgQVBJbnQmPigqdGhpcykgJiBSSFMsIElzVW5zaWduZWQpOworICB9CisgIEFQU0ludCBBbmQoY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+b3BlcmF0b3ImKFJIUyk7CisgIH0KKworICBBUFNJbnQgb3BlcmF0b3J8KGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIEFQU0ludChzdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSB8IFJIUywgSXNVbnNpZ25lZCk7CisgIH0KKyAgQVBTSW50IE9yKGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yfChSSFMpOworICB9CisKKworICBBUFNJbnQgb3BlcmF0b3JeKGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIEFQU0ludChzdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSBeIFJIUywgSXNVbnNpZ25lZCk7CisgIH0KKyAgQVBTSW50IFhvcihjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcl4oUkhTKTsKKyAgfQorCisgIEFQU0ludCBvcGVyYXRvciooY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gQVBTSW50KHN0YXRpY19jYXN0PGNvbnN0IEFQSW50Jj4oKnRoaXMpICogUkhTLCBJc1Vuc2lnbmVkKTsKKyAgfQorICBBUFNJbnQgb3BlcmF0b3IrKGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIEFQU0ludChzdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSArIFJIUywgSXNVbnNpZ25lZCk7CisgIH0KKyAgQVBTSW50IG9wZXJhdG9yLShjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBBUFNJbnQoc3RhdGljX2Nhc3Q8Y29uc3QgQVBJbnQmPigqdGhpcykgLSBSSFMsIElzVW5zaWduZWQpOworICB9CisgIEFQU0ludCBvcGVyYXRvcn4oKSBjb25zdCB7CisgICAgcmV0dXJuIEFQU0ludCh+c3RhdGljX2Nhc3Q8Y29uc3QgQVBJbnQmPigqdGhpcyksIElzVW5zaWduZWQpOworICB9CisKKyAgLy8vIGdldE1heFZhbHVlIC0gUmV0dXJuIHRoZSBBUFNJbnQgcmVwcmVzZW50aW5nIHRoZSBtYXhpbXVtIGludGVnZXIgdmFsdWUKKyAgLy8vICB3aXRoIHRoZSBnaXZlbiBiaXQgd2lkdGggYW5kIHNpZ25lZG5lc3MuCisgIHN0YXRpYyBBUFNJbnQgZ2V0TWF4VmFsdWUodWludDMyX3QgbnVtQml0cywgYm9vbCBVbnNpZ25lZCkgeworICAgIHJldHVybiBBUFNJbnQoVW5zaWduZWQgPyBBUEludDo6Z2V0TWF4VmFsdWUobnVtQml0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVBJbnQ6OmdldFNpZ25lZE1heFZhbHVlKG51bUJpdHMpLCBVbnNpZ25lZCk7CisgIH0KKworICAvLy8gZ2V0TWluVmFsdWUgLSBSZXR1cm4gdGhlIEFQU0ludCByZXByZXNlbnRpbmcgdGhlIG1pbmltdW0gaW50ZWdlciB2YWx1ZQorICAvLy8gIHdpdGggdGhlIGdpdmVuIGJpdCB3aWR0aCBhbmQgc2lnbmVkbmVzcy4KKyAgc3RhdGljIEFQU0ludCBnZXRNaW5WYWx1ZSh1aW50MzJfdCBudW1CaXRzLCBib29sIFVuc2lnbmVkKSB7CisgICAgcmV0dXJuIEFQU0ludChVbnNpZ25lZCA/IEFQSW50OjpnZXRNaW5WYWx1ZShudW1CaXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBUEludDo6Z2V0U2lnbmVkTWluVmFsdWUobnVtQml0cyksIFVuc2lnbmVkKTsKKyAgfQorCisgIC8vLyBQcm9maWxlIC0gVXNlZCB0byBpbnNlcnQgQVBTSW50IG9iamVjdHMsIG9yIG9iamVjdHMgdGhhdCBjb250YWluIEFQU0ludAorICAvLy8gIG9iamVjdHMsIGludG8gRm9sZGluZ1NldHMuCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Q7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBBUFNJbnQgJkkpIHsKKyAgSS5wcmludChPUywgSS5pc1NpZ25lZCgpKTsKKyAgcmV0dXJuIE9TOworfQorCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9CaXRWZWN0b3IuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvQml0VmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjYjllMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvQml0VmVjdG9yLmgKQEAgLTAsMCArMSw0MzUgQEAKKy8vPT09LSBsbHZtL0FEVC9CaXRWZWN0b3IuaCAtIEJpdCB2ZWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEJpdFZlY3RvciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0JJVFZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQURUX0JJVFZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaXRWZWN0b3IgeworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQml0V29yZDsKKworICBlbnVtIHsgQklUV09SRF9TSVpFID0gKHVuc2lnbmVkKXNpemVvZihCaXRXb3JkKSAqIENIQVJfQklUIH07CisKKyAgQml0V29yZCAgKkJpdHM7ICAgICAgICAvLyBBY3R1YWwgYml0cy4KKyAgdW5zaWduZWQgU2l6ZTsgICAgICAgICAvLyBTaXplIG9mIGJpdHZlY3RvciBpbiBiaXRzLgorICB1bnNpZ25lZCBDYXBhY2l0eTsgICAgIC8vIFNpemUgb2YgYWxsb2NhdGVkIG1lbW9yeSBpbiBCaXRXb3JkLgorCitwdWJsaWM6CisgIC8vIEVuY2Fwc3VsYXRpb24gb2YgYSBzaW5nbGUgYml0LgorICBjbGFzcyByZWZlcmVuY2UgeworICAgIGZyaWVuZCBjbGFzcyBCaXRWZWN0b3I7CisKKyAgICBCaXRXb3JkICpXb3JkUmVmOworICAgIHVuc2lnbmVkIEJpdFBvczsKKworICAgIHJlZmVyZW5jZSgpOyAgLy8gVW5kZWZpbmVkCisKKyAgcHVibGljOgorICAgIHJlZmVyZW5jZShCaXRWZWN0b3IgJmIsIHVuc2lnbmVkIElkeCkgeworICAgICAgV29yZFJlZiA9ICZiLkJpdHNbSWR4IC8gQklUV09SRF9TSVpFXTsKKyAgICAgIEJpdFBvcyA9IElkeCAlIEJJVFdPUkRfU0laRTsKKyAgICB9CisKKyAgICB+cmVmZXJlbmNlKCkge30KKworICAgIHJlZmVyZW5jZSAmb3BlcmF0b3I9KHJlZmVyZW5jZSB0KSB7CisgICAgICAqdGhpcyA9IGJvb2wodCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgcmVmZXJlbmNlJiBvcGVyYXRvcj0oYm9vbCB0KSB7CisgICAgICBpZiAodCkKKyAgICAgICAgKldvcmRSZWYgfD0gMUwgPDwgQml0UG9zOworICAgICAgZWxzZQorICAgICAgICAqV29yZFJlZiAmPSB+KDFMIDw8IEJpdFBvcyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoKCpXb3JkUmVmKSAmICgxTCA8PCBCaXRQb3MpKSA/IHRydWUgOiBmYWxzZTsKKyAgICB9CisgIH07CisKKworICAvLy8gQml0VmVjdG9yIGRlZmF1bHQgY3RvciAtIENyZWF0ZXMgYW4gZW1wdHkgYml0dmVjdG9yLgorICBCaXRWZWN0b3IoKSA6IFNpemUoMCksIENhcGFjaXR5KDApIHsKKyAgICBCaXRzID0gMDsKKyAgfQorCisgIC8vLyBCaXRWZWN0b3IgY3RvciAtIENyZWF0ZXMgYSBiaXR2ZWN0b3Igb2Ygc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLiBBbGwKKyAgLy8vIGJpdHMgYXJlIGluaXRpYWxpemVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIGV4cGxpY2l0IEJpdFZlY3Rvcih1bnNpZ25lZCBzLCBib29sIHQgPSBmYWxzZSkgOiBTaXplKHMpIHsKKyAgICBDYXBhY2l0eSA9IE51bUJpdFdvcmRzKHMpOworICAgIEJpdHMgPSBuZXcgQml0V29yZFtDYXBhY2l0eV07CisgICAgaW5pdF93b3JkcyhCaXRzLCBDYXBhY2l0eSwgdCk7CisgICAgaWYgKHQpCisgICAgICBjbGVhcl91bnVzZWRfYml0cygpOworICB9CisKKyAgLy8vIEJpdFZlY3RvciBjb3B5IGN0b3IuCisgIEJpdFZlY3Rvcihjb25zdCBCaXRWZWN0b3IgJlJIUykgOiBTaXplKFJIUy5zaXplKCkpIHsKKyAgICBpZiAoU2l6ZSA9PSAwKSB7CisgICAgICBCaXRzID0gMDsKKyAgICAgIENhcGFjaXR5ID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDYXBhY2l0eSA9IE51bUJpdFdvcmRzKFJIUy5zaXplKCkpOworICAgIEJpdHMgPSBuZXcgQml0V29yZFtDYXBhY2l0eV07CisgICAgc3RkOjpjb3B5KFJIUy5CaXRzLCAmUkhTLkJpdHNbQ2FwYWNpdHldLCBCaXRzKTsKKyAgfQorCisgIH5CaXRWZWN0b3IoKSB7CisgICAgZGVsZXRlW10gQml0czsKKyAgfQorCisgIC8vLyBlbXB0eSAtIFRlc3RzIHdoZXRoZXIgdGhlcmUgYXJlIG5vIGJpdHMgaW4gdGhpcyBiaXR2ZWN0b3IuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBTaXplID09IDA7IH0KKworICAvLy8gc2l6ZSAtIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoaXMgYml0dmVjdG9yLgorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIC8vLyBjb3VudCAtIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIHdoaWNoIGFyZSBzZXQuCisgIHVuc2lnbmVkIGNvdW50KCkgY29uc3QgeworICAgIHVuc2lnbmVkIE51bUJpdHMgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1CaXRXb3JkcyhzaXplKCkpOyArK2kpCisgICAgICBpZiAoc2l6ZW9mKEJpdFdvcmQpID09IDQpCisgICAgICAgIE51bUJpdHMgKz0gQ291bnRQb3B1bGF0aW9uXzMyKCh1aW50MzJfdClCaXRzW2ldKTsKKyAgICAgIGVsc2UgaWYgKHNpemVvZihCaXRXb3JkKSA9PSA4KQorICAgICAgICBOdW1CaXRzICs9IENvdW50UG9wdWxhdGlvbl82NChCaXRzW2ldKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYXNzZXJ0KDAgJiYgIlVuc3VwcG9ydGVkISIpOworICAgIHJldHVybiBOdW1CaXRzOworICB9CisKKyAgLy8vIGFueSAtIFJldHVybnMgdHJ1ZSBpZiBhbnkgYml0IGlzIHNldC4KKyAgYm9vbCBhbnkoKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUJpdFdvcmRzKHNpemUoKSk7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldICE9IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBub25lIC0gUmV0dXJucyB0cnVlIGlmIG5vbmUgb2YgdGhlIGJpdHMgYXJlIHNldC4KKyAgYm9vbCBub25lKCkgY29uc3QgeworICAgIHJldHVybiAhYW55KCk7CisgIH0KKworICAvLy8gZmluZF9maXJzdCAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzZXQgYml0LCAtMSBpZiBub25lCisgIC8vLyBvZiB0aGUgYml0cyBhcmUgc2V0LgorICBpbnQgZmluZF9maXJzdCgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQml0V29yZHMoc2l6ZSgpKTsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gIT0gMCkgeworICAgICAgICBpZiAoc2l6ZW9mKEJpdFdvcmQpID09IDQpCisgICAgICAgICAgcmV0dXJuIGkgKiBCSVRXT1JEX1NJWkUgKyBDb3VudFRyYWlsaW5nWmVyb3NfMzIoKHVpbnQzMl90KUJpdHNbaV0pOworICAgICAgICBlbHNlIGlmIChzaXplb2YoQml0V29yZCkgPT0gOCkKKyAgICAgICAgICByZXR1cm4gaSAqIEJJVFdPUkRfU0laRSArIENvdW50VHJhaWxpbmdaZXJvc182NChCaXRzW2ldKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFzc2VydCgwICYmICJVbnN1cHBvcnRlZCEiKTsKKyAgICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLy8gZmluZF9uZXh0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgc2V0IGJpdCBmb2xsb3dpbmcgdGhlCisgIC8vLyAiUHJldiIgYml0LiBSZXR1cm5zIC0xIGlmIHRoZSBuZXh0IHNldCBiaXQgaXMgbm90IGZvdW5kLgorICBpbnQgZmluZF9uZXh0KHVuc2lnbmVkIFByZXYpIGNvbnN0IHsKKyAgICArK1ByZXY7CisgICAgaWYgKFByZXYgPj0gU2l6ZSkKKyAgICAgIHJldHVybiAtMTsKKworICAgIHVuc2lnbmVkIFdvcmRQb3MgPSBQcmV2IC8gQklUV09SRF9TSVpFOworICAgIHVuc2lnbmVkIEJpdFBvcyA9IFByZXYgJSBCSVRXT1JEX1NJWkU7CisgICAgQml0V29yZCBDb3B5ID0gQml0c1tXb3JkUG9zXTsKKyAgICAvLyBNYXNrIG9mZiBwcmV2aW91cyBiaXRzLgorICAgIENvcHkgJj0gfjBMIDw8IEJpdFBvczsKKworICAgIGlmIChDb3B5ICE9IDApIHsKKyAgICAgIGlmIChzaXplb2YoQml0V29yZCkgPT0gNCkKKyAgICAgICAgcmV0dXJuIFdvcmRQb3MgKiBCSVRXT1JEX1NJWkUgKyBDb3VudFRyYWlsaW5nWmVyb3NfMzIoKHVpbnQzMl90KUNvcHkpOworICAgICAgZWxzZSBpZiAoc2l6ZW9mKEJpdFdvcmQpID09IDgpCisgICAgICAgIHJldHVybiBXb3JkUG9zICogQklUV09SRF9TSVpFICsgQ291bnRUcmFpbGluZ1plcm9zXzY0KENvcHkpOworICAgICAgZWxzZQorICAgICAgICBhc3NlcnQoMCAmJiAiVW5zdXBwb3J0ZWQhIik7CisgICAgfQorCisgICAgLy8gQ2hlY2sgc3Vic2VxdWVudCB3b3Jkcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBXb3JkUG9zKzE7IGkgPCBOdW1CaXRXb3JkcyhzaXplKCkpOyArK2kpCisgICAgICBpZiAoQml0c1tpXSAhPSAwKSB7CisgICAgICAgIGlmIChzaXplb2YoQml0V29yZCkgPT0gNCkKKyAgICAgICAgICByZXR1cm4gaSAqIEJJVFdPUkRfU0laRSArIENvdW50VHJhaWxpbmdaZXJvc18zMigodWludDMyX3QpQml0c1tpXSk7CisgICAgICAgIGVsc2UgaWYgKHNpemVvZihCaXRXb3JkKSA9PSA4KQorICAgICAgICAgIHJldHVybiBpICogQklUV09SRF9TSVpFICsgQ291bnRUcmFpbGluZ1plcm9zXzY0KEJpdHNbaV0pOworICAgICAgICBlbHNlCisgICAgICAgICAgYXNzZXJ0KDAgJiYgIlVuc3VwcG9ydGVkISIpOworICAgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBjbGVhciAtIENsZWFyIGFsbCBiaXRzLgorICB2b2lkIGNsZWFyKCkgeworICAgIFNpemUgPSAwOworICB9CisKKyAgLy8vIHJlc2l6ZSAtIEdyb3cgb3Igc2hyaW5rIHRoZSBiaXR2ZWN0b3IuCisgIHZvaWQgcmVzaXplKHVuc2lnbmVkIE4sIGJvb2wgdCA9IGZhbHNlKSB7CisgICAgaWYgKE4gPiBDYXBhY2l0eSAqIEJJVFdPUkRfU0laRSkgeworICAgICAgdW5zaWduZWQgT2xkQ2FwYWNpdHkgPSBDYXBhY2l0eTsKKyAgICAgIGdyb3coTik7CisgICAgICBpbml0X3dvcmRzKCZCaXRzW09sZENhcGFjaXR5XSwgKENhcGFjaXR5LU9sZENhcGFjaXR5KSwgdCk7CisgICAgfQorCisgICAgLy8gU2V0IGFueSBvbGQgdW51c2VkIGJpdHMgdGhhdCBhcmUgbm93IGluY2x1ZGVkIGluIHRoZSBCaXRWZWN0b3IuIFRoaXMKKyAgICAvLyBtYXkgc2V0IGJpdHMgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBuZXcgdmVjdG9yLCBidXQgd2Ugd2lsbCBjbGVhcgorICAgIC8vIHRoZW0gYmFjayBvdXQgYmVsb3cuCisgICAgaWYgKE4gPiBTaXplKQorICAgICAgc2V0X3VudXNlZF9iaXRzKHQpOworCisgICAgLy8gVXBkYXRlIHRoZSBzaXplLCBhbmQgY2xlYXIgb3V0IGFueSBiaXRzIHRoYXQgYXJlIG5vdyB1bnVzZWQKKyAgICB1bnNpZ25lZCBPbGRTaXplID0gU2l6ZTsKKyAgICBTaXplID0gTjsKKyAgICBpZiAodCB8fCBOIDwgT2xkU2l6ZSkKKyAgICAgIGNsZWFyX3VudXNlZF9iaXRzKCk7CisgIH0KKworICB2b2lkIHJlc2VydmUodW5zaWduZWQgTikgeworICAgIGlmIChOID4gQ2FwYWNpdHkgKiBCSVRXT1JEX1NJWkUpCisgICAgICBncm93KE4pOworICB9CisKKyAgLy8gU2V0LCByZXNldCwgZmxpcAorICBCaXRWZWN0b3IgJnNldCgpIHsKKyAgICBpbml0X3dvcmRzKEJpdHMsIENhcGFjaXR5LCB0cnVlKTsKKyAgICBjbGVhcl91bnVzZWRfYml0cygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJpdFZlY3RvciAmc2V0KHVuc2lnbmVkIElkeCkgeworICAgIEJpdHNbSWR4IC8gQklUV09SRF9TSVpFXSB8PSAxTCA8PCAoSWR4ICUgQklUV09SRF9TSVpFKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaXRWZWN0b3IgJnJlc2V0KCkgeworICAgIGluaXRfd29yZHMoQml0cywgQ2FwYWNpdHksIGZhbHNlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaXRWZWN0b3IgJnJlc2V0KHVuc2lnbmVkIElkeCkgeworICAgIEJpdHNbSWR4IC8gQklUV09SRF9TSVpFXSAmPSB+KDFMIDw8IChJZHggJSBCSVRXT1JEX1NJWkUpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaXRWZWN0b3IgJmZsaXAoKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUJpdFdvcmRzKHNpemUoKSk7ICsraSkKKyAgICAgIEJpdHNbaV0gPSB+Qml0c1tpXTsKKyAgICBjbGVhcl91bnVzZWRfYml0cygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJpdFZlY3RvciAmZmxpcCh1bnNpZ25lZCBJZHgpIHsKKyAgICBCaXRzW0lkeCAvIEJJVFdPUkRfU0laRV0gXj0gMUwgPDwgKElkeCAlIEJJVFdPUkRfU0laRSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gTm8gYXJndW1lbnQgZmxpcC4KKyAgQml0VmVjdG9yIG9wZXJhdG9yfigpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0VmVjdG9yKCp0aGlzKS5mbGlwKCk7CisgIH0KKworICAvLyBJbmRleGluZy4KKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10odW5zaWduZWQgSWR4KSB7CisgICAgYXNzZXJ0IChJZHggPCBTaXplICYmICJPdXQtb2YtYm91bmRzIEJpdCBhY2Nlc3MuIik7CisgICAgcmV0dXJuIHJlZmVyZW5jZSgqdGhpcywgSWR4KTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3JbXSh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQgKElkeCA8IFNpemUgJiYgIk91dC1vZi1ib3VuZHMgQml0IGFjY2Vzcy4iKTsKKyAgICBCaXRXb3JkIE1hc2sgPSAxTCA8PCAoSWR4ICUgQklUV09SRF9TSVpFKTsKKyAgICByZXR1cm4gKEJpdHNbSWR4IC8gQklUV09SRF9TSVpFXSAmIE1hc2spICE9IDA7CisgIH0KKworICBib29sIHRlc3QodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuICgqdGhpcylbSWR4XTsKKyAgfQorCisgIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQml0VmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBUaGlzV29yZHMgPSBOdW1CaXRXb3JkcyhzaXplKCkpOworICAgIHVuc2lnbmVkIFJIU1dvcmRzICA9IE51bUJpdFdvcmRzKFJIUy5zaXplKCkpOworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgaSAhPSBzdGQ6Om1pbihUaGlzV29yZHMsIFJIU1dvcmRzKTsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gIT0gUkhTLkJpdHNbaV0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFZlcmlmeSB0aGF0IGFueSBleHRyYSB3b3JkcyBhcmUgYWxsIHplcm9zLgorICAgIGlmIChpICE9IFRoaXNXb3JkcykgeworICAgICAgZm9yICg7IGkgIT0gVGhpc1dvcmRzOyArK2kpCisgICAgICAgIGlmIChCaXRzW2ldKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKGkgIT0gUkhTV29yZHMpIHsKKyAgICAgIGZvciAoOyBpICE9IFJIU1dvcmRzOyArK2kpCisgICAgICAgIGlmIChSSFMuQml0c1tpXSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEJpdFZlY3RvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsKKyAgfQorCisgIC8vIEludGVyc2VjdGlvbiwgdW5pb24sIGRpc2pvaW50IHVuaW9uLgorICBCaXRWZWN0b3IgJm9wZXJhdG9yJj0oY29uc3QgQml0VmVjdG9yICZSSFMpIHsKKyAgICB1bnNpZ25lZCBUaGlzV29yZHMgPSBOdW1CaXRXb3JkcyhzaXplKCkpOworICAgIHVuc2lnbmVkIFJIU1dvcmRzICA9IE51bUJpdFdvcmRzKFJIUy5zaXplKCkpOworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgaSAhPSBzdGQ6Om1pbihUaGlzV29yZHMsIFJIU1dvcmRzKTsgKytpKQorICAgICAgQml0c1tpXSAmPSBSSFMuQml0c1tpXTsKKworICAgIC8vIEFueSBiaXRzIHRoYXQgYXJlIGp1c3QgaW4gdGhpcyBiaXR2ZWN0b3IgYmVjb21lIHplcm8sIGJlY2F1c2UgdGhleSBhcmVuJ3QKKyAgICAvLyBpbiB0aGUgUkhTIGJpdCB2ZWN0b3IuICBBbnkgd29yZHMgb25seSBpbiBSSFMgYXJlIGlnbm9yZWQgYmVjYXVzZSB0aGV5CisgICAgLy8gYXJlIGFscmVhZHkgemVybyBpbiB0aGUgTEhTLgorICAgIGZvciAoOyBpICE9IFRoaXNXb3JkczsgKytpKQorICAgICAgQml0c1tpXSA9IDA7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaXRWZWN0b3IgJm9wZXJhdG9yfD0oY29uc3QgQml0VmVjdG9yICZSSFMpIHsKKyAgICBpZiAoc2l6ZSgpIDwgUkhTLnNpemUoKSkKKyAgICAgIHJlc2l6ZShSSFMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IE51bUJpdFdvcmRzKFJIUy5zaXplKCkpOyBpICE9IGU7ICsraSkKKyAgICAgIEJpdHNbaV0gfD0gUkhTLkJpdHNbaV07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQml0VmVjdG9yICZvcGVyYXRvcl49KGNvbnN0IEJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKHNpemUoKSA8IFJIUy5zaXplKCkpCisgICAgICByZXNpemUoUkhTLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBOdW1CaXRXb3JkcyhSSFMuc2l6ZSgpKTsgaSAhPSBlOyArK2kpCisgICAgICBCaXRzW2ldIF49IFJIUy5CaXRzW2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIGNvbnN0IEJpdFZlY3RvciAmb3BlcmF0b3I9KGNvbnN0IEJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKHRoaXMgPT0gJlJIUykgcmV0dXJuICp0aGlzOworCisgICAgU2l6ZSA9IFJIUy5zaXplKCk7CisgICAgdW5zaWduZWQgUkhTV29yZHMgPSBOdW1CaXRXb3JkcyhTaXplKTsKKyAgICBpZiAoU2l6ZSA8PSBDYXBhY2l0eSAqIEJJVFdPUkRfU0laRSkgeworICAgICAgaWYgKFNpemUpCisgICAgICAgIHN0ZDo6Y29weShSSFMuQml0cywgJlJIUy5CaXRzW1JIU1dvcmRzXSwgQml0cyk7CisgICAgICBjbGVhcl91bnVzZWRfYml0cygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIEdyb3cgdGhlIGJpdHZlY3RvciB0byBoYXZlIGVub3VnaCBlbGVtZW50cy4KKyAgICBDYXBhY2l0eSA9IFJIU1dvcmRzOworICAgIEJpdFdvcmQgKk5ld0JpdHMgPSBuZXcgQml0V29yZFtDYXBhY2l0eV07CisgICAgc3RkOjpjb3B5KFJIUy5CaXRzLCAmUkhTLkJpdHNbUkhTV29yZHNdLCBOZXdCaXRzKTsKKworICAgIC8vIERlc3Ryb3kgdGhlIG9sZCBiaXRzLgorICAgIGRlbGV0ZVtdIEJpdHM7CisgICAgQml0cyA9IE5ld0JpdHM7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHN3YXAoQml0VmVjdG9yICZSSFMpIHsKKyAgICBzdGQ6OnN3YXAoQml0cywgUkhTLkJpdHMpOworICAgIHN0ZDo6c3dhcChTaXplLCBSSFMuU2l6ZSk7CisgICAgc3RkOjpzd2FwKENhcGFjaXR5LCBSSFMuQ2FwYWNpdHkpOworICB9CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIE51bUJpdFdvcmRzKHVuc2lnbmVkIFMpIGNvbnN0IHsKKyAgICByZXR1cm4gKFMgKyBCSVRXT1JEX1NJWkUtMSkgLyBCSVRXT1JEX1NJWkU7CisgIH0KKworICAvLyBTZXQgdGhlIHVudXNlZCBiaXRzIGluIHRoZSBoaWdoIHdvcmRzLgorICB2b2lkIHNldF91bnVzZWRfYml0cyhib29sIHQgPSB0cnVlKSB7CisgICAgLy8gIFNldCBoaWdoIHdvcmRzIGZpcnN0LgorICAgIHVuc2lnbmVkIFVzZWRXb3JkcyA9IE51bUJpdFdvcmRzKFNpemUpOworICAgIGlmIChDYXBhY2l0eSA+IFVzZWRXb3JkcykKKyAgICAgIGluaXRfd29yZHMoJkJpdHNbVXNlZFdvcmRzXSwgKENhcGFjaXR5LVVzZWRXb3JkcyksIHQpOworCisgICAgLy8gIFRoZW4gc2V0IGFueSBzdHJheSBoaWdoIGJpdHMgb2YgdGhlIGxhc3QgdXNlZCB3b3JkLgorICAgIHVuc2lnbmVkIEV4dHJhQml0cyA9IFNpemUgJSBCSVRXT1JEX1NJWkU7CisgICAgaWYgKEV4dHJhQml0cykgeworICAgICAgQml0c1tVc2VkV29yZHMtMV0gJj0gfih+MEwgPDwgRXh0cmFCaXRzKTsKKyAgICAgIEJpdHNbVXNlZFdvcmRzLTFdIHw9ICgwIC0gKEJpdFdvcmQpdCkgPDwgRXh0cmFCaXRzOworICAgIH0KKyAgfQorCisgIC8vIENsZWFyIHRoZSB1bnVzZWQgYml0cyBpbiB0aGUgaGlnaCB3b3Jkcy4KKyAgdm9pZCBjbGVhcl91bnVzZWRfYml0cygpIHsKKyAgICBzZXRfdW51c2VkX2JpdHMoZmFsc2UpOworICB9CisKKyAgdm9pZCBncm93KHVuc2lnbmVkIE5ld1NpemUpIHsKKyAgICB1bnNpZ25lZCBPbGRDYXBhY2l0eSA9IENhcGFjaXR5OworICAgIENhcGFjaXR5ID0gTnVtQml0V29yZHMoTmV3U2l6ZSk7CisgICAgQml0V29yZCAqTmV3Qml0cyA9IG5ldyBCaXRXb3JkW0NhcGFjaXR5XTsKKworICAgIC8vIENvcHkgdGhlIG9sZCBiaXRzIG92ZXIuCisgICAgaWYgKE9sZENhcGFjaXR5ICE9IDApCisgICAgICBzdGQ6OmNvcHkoQml0cywgJkJpdHNbT2xkQ2FwYWNpdHldLCBOZXdCaXRzKTsKKworICAgIC8vIERlc3Ryb3kgdGhlIG9sZCBiaXRzLgorICAgIGRlbGV0ZVtdIEJpdHM7CisgICAgQml0cyA9IE5ld0JpdHM7CisKKyAgICBjbGVhcl91bnVzZWRfYml0cygpOworICB9CisKKyAgdm9pZCBpbml0X3dvcmRzKEJpdFdvcmQgKkIsIHVuc2lnbmVkIE51bVdvcmRzLCBib29sIHQpIHsKKyAgICBtZW1zZXQoQiwgMCAtIChpbnQpdCwgTnVtV29yZHMqc2l6ZW9mKEJpdFdvcmQpKTsKKyAgfQorfTsKKworaW5saW5lIEJpdFZlY3RvciBvcGVyYXRvciYoY29uc3QgQml0VmVjdG9yICZMSFMsIGNvbnN0IEJpdFZlY3RvciAmUkhTKSB7CisgIEJpdFZlY3RvciBSZXN1bHQoTEhTKTsKKyAgUmVzdWx0ICY9IFJIUzsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworaW5saW5lIEJpdFZlY3RvciBvcGVyYXRvcnwoY29uc3QgQml0VmVjdG9yICZMSFMsIGNvbnN0IEJpdFZlY3RvciAmUkhTKSB7CisgIEJpdFZlY3RvciBSZXN1bHQoTEhTKTsKKyAgUmVzdWx0IHw9IFJIUzsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworaW5saW5lIEJpdFZlY3RvciBvcGVyYXRvcl4oY29uc3QgQml0VmVjdG9yICZMSFMsIGNvbnN0IEJpdFZlY3RvciAmUkhTKSB7CisgIEJpdFZlY3RvciBSZXN1bHQoTEhTKTsKKyAgUmVzdWx0IF49IFJIUzsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCB7CisgIC8vLyBJbXBsZW1lbnQgc3RkOjpzd2FwIGluIHRlcm1zIG9mIEJpdFZlY3RvciBzd2FwLgorICBpbmxpbmUgdm9pZAorICBzd2FwKGxsdm06OkJpdFZlY3RvciAmTEhTLCBsbHZtOjpCaXRWZWN0b3IgJlJIUykgeworICAgIExIUy5zd2FwKFJIUyk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0RBR0RlbHRhQWxnb3JpdGhtLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0RBR0RlbHRhQWxnb3JpdGhtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllZDE1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvREFHRGVsdGFBbGdvcml0aG0uaApAQCAtMCwwICsxLDc1IEBACisvLz09PS0tLSBEQUdEZWx0YUFsZ29yaXRobS5oIC0gQSBEQUcgTWluaW1pemF0aW9uIEFsZ29yaXRobSAtLS0tKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfREFHREVMVEFBTEdPUklUSE1fSAorI2RlZmluZSBMTFZNX0FEVF9EQUdERUxUQUFMR09SSVRITV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBEQUdEZWx0YUFsZ29yaXRobSAtIEltcGxlbWVudHMgYSAiZGVsdGEgZGVidWdnaW5nIiBhbGdvcml0aG0gZm9yIG1pbmltaXppbmcKKy8vLyBkaXJlY3RlZCBhY3ljbGljIGdyYXBocyB1c2luZyBhIHByZWRpY2F0ZSBmdW5jdGlvbi4KKy8vLworLy8vIFRoZSByZXN1bHQgb2YgdGhlIGFsZ29yaXRobSBpcyBhIHN1YnNldCBvZiB0aGUgaW5wdXQgY2hhbmdlIHNldCB3aGljaCBpcworLy8vIGd1YXJhbnRlZWQgdG8gc2F0aXNmeSB0aGUgcHJlZGljYXRlLCBhc3N1bWluZyB0aGF0IHRoZSBpbnB1dCBzZXQgZGlkLiBGb3IKKy8vLyB3ZWxsIGZvcm1lZCBwcmVkaWNhdGVzLCB0aGUgcmVzdWx0IHNldCBpcyBndWFyYW50ZWVkIHRvIGJlIHN1Y2ggdGhhdAorLy8vIHJlbW92aW5nIGFueSBzaW5nbGUgZWxlbWVudCBub3QgcmVxdWlyZWQgYnkgdGhlIGRlcGVuZGVuY2llcyBvbiB0aGUgb3RoZXIKKy8vLyBlbGVtZW50cyB3b3VsZCBmYWxzaWZ5IHRoZSBwcmVkaWNhdGUuCisvLy8KKy8vLyBUaGUgREFHIHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCBkZXBlbmRlbmNpZXMgaW4gdGhlIGNoYW5nZXMgd2hpY2ggYXJlCisvLy8gbGlrZWx5IHRvIGhvbGQgYWNyb3NzIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uIFRoYXQgaXMsIGZvciBhIHBhcnRpY3VsYXIKKy8vLyBjaGFuZ2VzZXQgUyBhbmQgcHJlZGljYXRlIFA6CisvLy8KKy8vLyAgIFAoUykgPT4gUChTIHVuaW9uIHByZWQoUykpCisvLy8KKy8vLyBUaGUgbWluaXphdGlvbiBhbGdvcml0aG0gdXNlcyB0aGlzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gYXR0ZW1wdCB0bworLy8vIGVhZ2VybHkgcHJ1bmUgbGFyZ2Ugc3Vic2V0cyBvZiBjaGFuZ2VzLiBBcyB3aXRoIFxzZWUgRGVsdGFBbGdvcml0aG0sIHRoZSBEQUcKKy8vLyBpcyBub3QgcmVxdWlyZWQgdG8gc2F0aXNmeSB0aGlzIHByb3BlcnR5LCBidXQgdGhlIGFsZ29yaXRobSB3aWxsIHJ1bgorLy8vIHN1YnN0YW50aWFsbHkgZmV3ZXIgdGVzdHMgd2l0aCBhcHByb3ByaWF0ZSBkZXBlbmRlbmNpZXMuIFxzZWUgRGVsdGFBbGdvcml0aG0KKy8vLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcHJvcGVydGllcyB3aGljaCB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIGl0c2VsZgorLy8vIHNob3VsZCBzYXRpc2Z5LgorY2xhc3MgREFHRGVsdGFBbGdvcml0aG0geworcHVibGljOgorICB0eXBlZGVmIHVuc2lnbmVkIGNoYW5nZV90eTsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Y2hhbmdlX3R5LCBjaGFuZ2VfdHk+IGVkZ2VfdHk7CisKKyAgLy8gRklYTUU6IFVzZSBhIGRlY2VudCBkYXRhIHN0cnVjdHVyZS4KKyAgdHlwZWRlZiBzdGQ6OnNldDxjaGFuZ2VfdHk+IGNoYW5nZXNldF90eTsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxjaGFuZ2VzZXRfdHk+IGNoYW5nZXNldGxpc3RfdHk7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+REFHRGVsdGFBbGdvcml0aG0oKSB7fQorCisgIC8vLyBSdW4gLSBNaW5pbWl6ZSB0aGUgREFHIGZvcm1lZCBieSB0aGUgXGFyZyBDaGFuZ2VzIHZlcnRpY2VzIGFuZCB0aGUgXGFyZworICAvLy8gRGVwZW5kZW5jaWVzIGVkZ2VzIGJ5IGV4ZWN1dGluZyBcc2VlIEV4ZWN1dGVPbmVUZXN0KCkgb24gc3Vic2V0cyBvZgorICAvLy8gY2hhbmdlcyBhbmQgcmV0dXJuaW5nIHRoZSBzbWFsbGVzdCBzZXQgd2hpY2ggc3RpbGwgc2F0aXNmaWVzIHRoZSB0ZXN0CisgIC8vLyBwcmVkaWNhdGUgYW5kIHRoZSBpbnB1dCBcYXJnIERlcGVuZGVuY2llcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2hhbmdlcyBUaGUgbGlzdCBvZiBjaGFuZ2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEZXBlbmRlbmNpZXMgVGhlIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGFtb25nc3QgY2hhbmdlcy4gRm9yIGVhY2gKKyAgLy8vICh4LHkpIGluIFxhcmcgRGVwZW5kZW5jaWVzLCBib3RoIHggYW5kIHkgbXVzdCBiZSBpbiBcYXJnIENoYW5nZXMuIFRoZQorICAvLy8gbWluaW1pemF0aW9uIGFsZ29yaXRobSBndWFyYW50ZWVzIHRoYXQgZm9yIGVhY2ggdGVzdGVkIGNoYW5nZWQgc2V0IFMsIHgKKyAgLy8vIFxpbiBTIGltcGxpZXMgeSBcaW4gUy4gSXQgaXMgYW4gZXJyb3IgdG8gaGF2ZSBjeWNsaWMgZGVwZW5kZW5jaWVzLgorICBjaGFuZ2VzZXRfdHkgUnVuKGNvbnN0IGNoYW5nZXNldF90eSAmQ2hhbmdlcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxlZGdlX3R5PiAmRGVwZW5kZW5jaWVzKTsKKworICAvLy8gVXBkYXRlZFNlYXJjaFN0YXRlIC0gQ2FsbGJhY2sgdXNlZCB3aGVuIHRoZSBzZWFyY2ggc3RhdGUgY2hhbmdlcy4KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZWRTZWFyY2hTdGF0ZShjb25zdCBjaGFuZ2VzZXRfdHkgJkNoYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlc2V0bGlzdF90eSAmU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzZXRfdHkgJlJlcXVpcmVkKSB7fQorCisgIC8vLyBFeGVjdXRlT25lVGVzdCAtIEV4ZWN1dGUgYSBzaW5nbGUgdGVzdCBwcmVkaWNhdGUgb24gdGhlIGNoYW5nZSBzZXQgXGFyZyBTLgorICB2aXJ0dWFsIGJvb2wgRXhlY3V0ZU9uZVRlc3QoY29uc3QgY2hhbmdlc2V0X3R5ICZTKSA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvRGVsdGFBbGdvcml0aG0uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvRGVsdGFBbGdvcml0aG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJhMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9EZWx0YUFsZ29yaXRobS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vPT09LS0tIERlbHRhQWxnb3JpdGhtLmggLSBBIFNldCBNaW5pbWl6YXRpb24gQWxnb3JpdGhtIC0tLS0tLS0qLSBDKysgLSotLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9ERUxUQUFMR09SSVRITV9ICisjZGVmaW5lIExMVk1fQURUX0RFTFRBQUxHT1JJVEhNX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIERlbHRhQWxnb3JpdGhtIC0gSW1wbGVtZW50cyB0aGUgZGVsdGEgZGVidWdnaW5nIGFsZ29yaXRobSAoQS4gWmVsbGVyICc5OSkKKy8vLyBmb3IgbWluaW1pemluZyBhcmJpdHJhcnkgc2V0cyB1c2luZyBhIHByZWRpY2F0ZSBmdW5jdGlvbi4KKy8vLworLy8vIFRoZSByZXN1bHQgb2YgdGhlIGFsZ29yaXRobSBpcyBhIHN1YnNldCBvZiB0aGUgaW5wdXQgY2hhbmdlIHNldCB3aGljaCBpcworLy8vIGd1YXJhbnRlZWQgdG8gc2F0aXNmeSB0aGUgcHJlZGljYXRlLCBhc3N1bWluZyB0aGF0IHRoZSBpbnB1dCBzZXQgZGlkLiBGb3IKKy8vLyB3ZWxsIGZvcm1lZCBwcmVkaWNhdGVzLCB0aGUgcmVzdWx0IHNldCBpcyBndWFyYW50ZWVkIHRvIGJlIHN1Y2ggdGhhdAorLy8vIHJlbW92aW5nIGFueSBzaW5nbGUgZWxlbWVudCB3b3VsZCBmYWxzaWZ5IHRoZSBwcmVkaWNhdGUuCisvLy8KKy8vLyBGb3IgYmVzdCByZXN1bHRzIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gKnNob3VsZCogKGJ1dCBuZWVkIG5vdCkgc2F0aXNmeQorLy8vIGNlcnRhaW4gcHJvcGVydGllcywgaW4gcGFydGljdWxhcjoKKy8vLyAgKDEpIFRoZSBwcmVkaWNhdGUgc2hvdWxkIHJldHVybiBmYWxzZSBvbiBhbiBlbXB0eSBzZXQgYW5kIHRydWUgb24gdGhlIGZ1bGwKKy8vLyAgc2V0LgorLy8vICAoMikgSWYgdGhlIHByZWRpY2F0ZSByZXR1cm5zIHRydWUgZm9yIGEgc2V0IG9mIGNoYW5nZXMsIGl0IHNob3VsZCByZXR1cm4KKy8vLyAgdHJ1ZSBmb3IgYWxsIHN1cGVyc2V0cyBvZiB0aGF0IHNldC4KKy8vLworLy8vIEl0IGlzIG5vdCBhbiBlcnJvciB0byBwcm92aWRlIGEgcHJlZGljYXRlIHRoYXQgZG9lcyBub3Qgc2F0aXNmeSB0aGVzZQorLy8vIHJlcXVpcmVtZW50cywgYW5kIHRoZSBhbGdvcml0aG0gd2lsbCBnZW5lcmFsbHkgcHJvZHVjZSByZWFzb25hYmxlCisvLy8gcmVzdWx0cy4gSG93ZXZlciwgaXQgbWF5IHJ1biBzdWJzdGFudGlhbGx5IG1vcmUgdGVzdHMgdGhhbiB3aXRoIGEgZ29vZAorLy8vIHByZWRpY2F0ZS4KK2NsYXNzIERlbHRhQWxnb3JpdGhtIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFuZ2VfdHk7CisgIC8vIEZJWE1FOiBVc2UgYSBkZWNlbnQgZGF0YSBzdHJ1Y3R1cmUuCisgIHR5cGVkZWYgc3RkOjpzZXQ8Y2hhbmdlX3R5PiBjaGFuZ2VzZXRfdHk7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Y2hhbmdlc2V0X3R5PiBjaGFuZ2VzZXRsaXN0X3R5OworCitwcml2YXRlOgorICAvLy8gQ2FjaGUgb2YgZmFpbGVkIHRlc3QgcmVzdWx0cy4gU3VjY2Vzc2Z1bCB0ZXN0IHJlc3VsdHMgYXJlIG5ldmVyIGNhY2hlZAorICAvLy8gc2luY2Ugd2UgYWx3YXlzIHJlZHVjZSBmb2xsb3dpbmcgYSBzdWNjZXNzLgorICBzdGQ6OnNldDxjaGFuZ2VzZXRfdHk+IEZhaWxlZFRlc3RzQ2FjaGU7CisKKyAgLy8vIEdldFRlc3RSZXN1bHQgLSBHZXQgdGhlIHRlc3QgcmVzdWx0IGZvciB0aGUgXGFyZyBDaGFuZ2VzIGZyb20gdGhlCisgIC8vLyBjYWNoZSwgZXhlY3V0aW5nIHRoZSB0ZXN0IGlmIG5lY2Vzc2FyeS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2hhbmdlcyAtIFRoZSBjaGFuZ2Ugc2V0IHRvIHRlc3QuCisgIC8vLyBccmV0dXJuIC0gVGhlIHRlc3QgcmVzdWx0LgorICBib29sIEdldFRlc3RSZXN1bHQoY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzKTsKKworICAvLy8gU3BsaXQgLSBQYXJ0aXRpb24gYSBzZXQgb2YgY2hhbmdlcyBcYXJnIFMgaW50byBvbmUgb3IgdHdvIHN1YnNldHMuCisgIHZvaWQgU3BsaXQoY29uc3QgY2hhbmdlc2V0X3R5ICZTLCBjaGFuZ2VzZXRsaXN0X3R5ICZSZXMpOworCisgIC8vLyBEZWx0YSAtIE1pbmltaXplIGEgc2V0IG9mIFxhcmcgQ2hhbmdlcyB3aGljaCBoYXMgYmVlbiBwYXJ0aW9uZWQgaW50bworICAvLy8gc21hbGxlciBzZXRzLCBieSBhdHRlbXB0aW5nIHRvIHJlbW92ZSBpbmRpdmlkdWFsIHN1YnNldHMuCisgIGNoYW5nZXNldF90eSBEZWx0YShjb25zdCBjaGFuZ2VzZXRfdHkgJkNoYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzZXRsaXN0X3R5ICZTZXRzKTsKKworICAvLy8gU2VhcmNoIC0gU2VhcmNoIGZvciBhIHN1YnNldCAob3Igc3Vic2V0cykgaW4gXGFyZyBTZXRzIHdoaWNoIGNhbiBiZQorICAvLy8gcmVtb3ZlZCBmcm9tIFxhcmcgQ2hhbmdlcyB3aGlsZSBzdGlsbCBzYXRpc2Z5aW5nIHRoZSBwcmVkaWNhdGUuCisgIC8vLworICAvLy8gXHBhcmFtIFJlcyAtIE9uIHN1Y2Nlc3MsIGEgc3Vic2V0IG9mIENoYW5nZXMgd2hpY2ggc2F0aXNmaWVzIHRoZQorICAvLy8gcHJlZGljYXRlLgorICAvLy8gXHJldHVybiAtIFRydWUgb24gc3VjY2Vzcy4KKyAgYm9vbCBTZWFyY2goY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzLCBjb25zdCBjaGFuZ2VzZXRsaXN0X3R5ICZTZXRzLAorICAgICAgICAgICAgICBjaGFuZ2VzZXRfdHkgJlJlcyk7CisgICAgICAgICAgICAgIAorcHJvdGVjdGVkOgorICAvLy8gVXBkYXRlZFNlYXJjaFN0YXRlIC0gQ2FsbGJhY2sgdXNlZCB3aGVuIHRoZSBzZWFyY2ggc3RhdGUgY2hhbmdlcy4KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZWRTZWFyY2hTdGF0ZShjb25zdCBjaGFuZ2VzZXRfdHkgJkNoYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlc2V0bGlzdF90eSAmU2V0cykge30KKworICAvLy8gRXhlY3V0ZU9uZVRlc3QgLSBFeGVjdXRlIGEgc2luZ2xlIHRlc3QgcHJlZGljYXRlIG9uIHRoZSBjaGFuZ2Ugc2V0IFxhcmcgUy4KKyAgdmlydHVhbCBib29sIEV4ZWN1dGVPbmVUZXN0KGNvbnN0IGNoYW5nZXNldF90eSAmUykgPSAwOworCitwdWJsaWM6CisgIHZpcnR1YWwgfkRlbHRhQWxnb3JpdGhtKCk7CisKKyAgLy8vIFJ1biAtIE1pbmltaXplIHRoZSBzZXQgXGFyZyBDaGFuZ2VzIGJ5IGV4ZWN1dGluZyBcc2VlIEV4ZWN1dGVPbmVUZXN0KCkgb24KKyAgLy8vIHN1YnNldHMgb2YgY2hhbmdlcyBhbmQgcmV0dXJuaW5nIHRoZSBzbWFsbGVzdCBzZXQgd2hpY2ggc3RpbGwgc2F0aXNmaWVzCisgIC8vLyB0aGUgdGVzdCBwcmVkaWNhdGUuCisgIGNoYW5nZXNldF90eSBSdW4oY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9EZW5zZU1hcC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9EZW5zZU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2UyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0RlbnNlTWFwLmgKQEAgLTAsMCArMSw1MDkgQEAKKy8vPT09LSBsbHZtL0FEVC9EZW5zZU1hcC5oIC0gRGVuc2UgcHJvYmVkIGhhc2ggdGFibGUgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIERlbnNlTWFwIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfREVOU0VNQVBfSAorI2RlZmluZSBMTFZNX0FEVF9ERU5TRU1BUF9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsCisgICAgICAgICB0eXBlbmFtZSBLZXlJbmZvVCA9IERlbnNlTWFwSW5mbzxLZXlUPiwKKyAgICAgICAgIHR5cGVuYW1lIFZhbHVlSW5mb1QgPSBEZW5zZU1hcEluZm88VmFsdWVUPiwgYm9vbCBJc0NvbnN0ID0gZmFsc2U+CitjbGFzcyBEZW5zZU1hcEl0ZXJhdG9yOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsCisgICAgICAgICB0eXBlbmFtZSBLZXlJbmZvVCA9IERlbnNlTWFwSW5mbzxLZXlUPiwKKyAgICAgICAgIHR5cGVuYW1lIFZhbHVlSW5mb1QgPSBEZW5zZU1hcEluZm88VmFsdWVUPiA+CitjbGFzcyBEZW5zZU1hcCB7CisgIHR5cGVkZWYgc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4gQnVja2V0VDsKKyAgdW5zaWduZWQgTnVtQnVja2V0czsKKyAgQnVja2V0VCAqQnVja2V0czsKKworICB1bnNpZ25lZCBOdW1FbnRyaWVzOworICB1bnNpZ25lZCBOdW1Ub21ic3RvbmVzOworcHVibGljOgorICB0eXBlZGVmIEtleVQga2V5X3R5cGU7CisgIHR5cGVkZWYgVmFsdWVUIG1hcHBlZF90eXBlOworICB0eXBlZGVmIEJ1Y2tldFQgdmFsdWVfdHlwZTsKKworICBEZW5zZU1hcChjb25zdCBEZW5zZU1hcCAmb3RoZXIpIHsKKyAgICBOdW1CdWNrZXRzID0gMDsKKyAgICBDb3B5RnJvbShvdGhlcik7CisgIH0KKworICBleHBsaWNpdCBEZW5zZU1hcCh1bnNpZ25lZCBOdW1Jbml0QnVja2V0cyA9IDY0KSB7CisgICAgaW5pdChOdW1Jbml0QnVja2V0cyk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0PgorICBEZW5zZU1hcChjb25zdCBJbnB1dEl0ICZJLCBjb25zdCBJbnB1dEl0ICZFKSB7CisgICAgaW5pdCg2NCk7CisgICAgaW5zZXJ0KEksIEUpOworICB9CisgIAorICB+RGVuc2VNYXAoKSB7CisgICAgY29uc3QgS2V5VCBFbXB0eUtleSA9IGdldEVtcHR5S2V5KCksIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIGZvciAoQnVja2V0VCAqUCA9IEJ1Y2tldHMsICpFID0gQnVja2V0cytOdW1CdWNrZXRzOyBQICE9IEU7ICsrUCkgeworICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChQLT5maXJzdCwgRW1wdHlLZXkpICYmCisgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKFAtPmZpcnN0LCBUb21ic3RvbmVLZXkpKQorICAgICAgICBQLT5zZWNvbmQuflZhbHVlVCgpOworICAgICAgUC0+Zmlyc3QufktleVQoKTsKKyAgICB9CisjaWZuZGVmIE5ERUJVRworICAgIG1lbXNldChCdWNrZXRzLCAweDVhLCBzaXplb2YoQnVja2V0VCkqTnVtQnVja2V0cyk7CisjZW5kaWYKKyAgICBvcGVyYXRvciBkZWxldGUoQnVja2V0cyk7CisgIH0KKworICB0eXBlZGVmIERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVD4gaXRlcmF0b3I7CisgIHR5cGVkZWYgRGVuc2VNYXBJdGVyYXRvcjxLZXlULCBWYWx1ZVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJbmZvVCwgVmFsdWVJbmZvVCwgdHJ1ZT4gY29uc3RfaXRlcmF0b3I7CisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIHsKKyAgICAvLyBXaGVuIHRoZSBtYXAgaXMgZW1wdHksIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBBZHZhbmNlUGFzdEVtcHR5QnVja2V0cygpLgorICAgIHJldHVybiBlbXB0eSgpID8gZW5kKCkgOiBpdGVyYXRvcihCdWNrZXRzLCBCdWNrZXRzK051bUJ1Y2tldHMpOworICB9CisgIGlubGluZSBpdGVyYXRvciBlbmQoKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKEJ1Y2tldHMrTnVtQnVja2V0cywgQnVja2V0cytOdW1CdWNrZXRzKTsKKyAgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGVtcHR5KCkgPyBlbmQoKSA6IGNvbnN0X2l0ZXJhdG9yKEJ1Y2tldHMsIEJ1Y2tldHMrTnVtQnVja2V0cyk7CisgIH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoQnVja2V0cytOdW1CdWNrZXRzLCBCdWNrZXRzK051bUJ1Y2tldHMpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE51bUVudHJpZXMgPT0gMDsgfQorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTnVtRW50cmllczsgfQorCisgIC8vLyBHcm93IHRoZSBkZW5zZW1hcCBzbyB0aGF0IGl0IGhhcyBhdCBsZWFzdCBTaXplIGJ1Y2tldHMuIERvZXMgbm90IHNocmluaworICB2b2lkIHJlc2l6ZShzaXplX3QgU2l6ZSkgeyBncm93KFNpemUpOyB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBpZiAoTnVtRW50cmllcyA9PSAwICYmIE51bVRvbWJzdG9uZXMgPT0gMCkgcmV0dXJuOworICAgIAorICAgIC8vIElmIHRoZSBjYXBhY2l0eSBvZiB0aGUgYXJyYXkgaXMgaHVnZSwgYW5kIHRoZSAjIGVsZW1lbnRzIHVzZWQgaXMgc21hbGwsCisgICAgLy8gc2hyaW5rIHRoZSBhcnJheS4KKyAgICBpZiAoTnVtRW50cmllcyAqIDQgPCBOdW1CdWNrZXRzICYmIE51bUJ1Y2tldHMgPiA2NCkgeworICAgICAgc2hyaW5rX2FuZF9jbGVhcigpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSBnZXRFbXB0eUtleSgpLCBUb21ic3RvbmVLZXkgPSBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBmb3IgKEJ1Y2tldFQgKlAgPSBCdWNrZXRzLCAqRSA9IEJ1Y2tldHMrTnVtQnVja2V0czsgUCAhPSBFOyArK1ApIHsKKyAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoUC0+Zmlyc3QsIEVtcHR5S2V5KSkgeworICAgICAgICBpZiAoIUtleUluZm9UOjppc0VxdWFsKFAtPmZpcnN0LCBUb21ic3RvbmVLZXkpKSB7CisgICAgICAgICAgUC0+c2Vjb25kLn5WYWx1ZVQoKTsKKyAgICAgICAgICAtLU51bUVudHJpZXM7CisgICAgICAgIH0KKyAgICAgICAgUC0+Zmlyc3QgPSBFbXB0eUtleTsKKyAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KE51bUVudHJpZXMgPT0gMCAmJiAiTm9kZSBjb3VudCBpbWJhbGFuY2UhIik7CisgICAgTnVtVG9tYnN0b25lcyA9IDA7CisgIH0KKworICAvLy8gY291bnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGtleSBpcyBpbiB0aGUgbWFwLgorICBib29sIGNvdW50KGNvbnN0IEtleVQgJlZhbCkgY29uc3QgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKKyAgICByZXR1cm4gTG9va3VwQnVja2V0Rm9yKFZhbCwgVGhlQnVja2V0KTsKKyAgfQorCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgS2V5VCAmVmFsKSB7CisgICAgQnVja2V0VCAqVGhlQnVja2V0OworICAgIGlmIChMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpKQorICAgICAgcmV0dXJuIGl0ZXJhdG9yKFRoZUJ1Y2tldCwgQnVja2V0cytOdW1CdWNrZXRzKTsKKyAgICByZXR1cm4gZW5kKCk7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBLZXlUICZWYWwpIGNvbnN0IHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoVGhlQnVja2V0LCBCdWNrZXRzK051bUJ1Y2tldHMpOworICAgIHJldHVybiBlbmQoKTsKKyAgfQorCisgIC8vLyBsb29rdXAgLSBSZXR1cm4gdGhlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleSwgb3IgYSBkZWZhdWx0CisgIC8vLyBjb25zdHJ1Y3RlZCB2YWx1ZSBpZiBubyBzdWNoIGVudHJ5IGV4aXN0cy4KKyAgVmFsdWVUIGxvb2t1cChjb25zdCBLZXlUICZWYWwpIGNvbnN0IHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gVGhlQnVja2V0LT5zZWNvbmQ7CisgICAgcmV0dXJuIFZhbHVlVCgpOworICB9CisKKyAgLy8gSW5zZXJ0cyBrZXksdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleSBpc24ndCBhbHJlYWR5IGluIHRoZSBtYXAuCisgIC8vIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IHVwZGF0ZSB0aGUKKyAgLy8gdmFsdWUuCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICZLVikgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKKyAgICBpZiAoTG9va3VwQnVja2V0Rm9yKEtWLmZpcnN0LCBUaGVCdWNrZXQpKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKFRoZUJ1Y2tldCwgQnVja2V0cytOdW1CdWNrZXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7IC8vIEFscmVhZHkgaW4gbWFwLgorCisgICAgLy8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIG5ldyBlbGVtZW50LgorICAgIFRoZUJ1Y2tldCA9IEluc2VydEludG9CdWNrZXQoS1YuZmlyc3QsIEtWLnNlY29uZCwgVGhlQnVja2V0KTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoVGhlQnVja2V0LCBCdWNrZXRzK051bUJ1Y2tldHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgfQorCisgIC8vLyBpbnNlcnQgLSBSYW5nZSBpbnNlcnRpb24gb2YgcGFpcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXQ+CisgIHZvaWQgaW5zZXJ0KElucHV0SXQgSSwgSW5wdXRJdCBFKSB7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKQorICAgICAgaW5zZXJ0KCpJKTsKKyAgfQorCisKKyAgYm9vbCBlcmFzZShjb25zdCBLZXlUICZWYWwpIHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKCFMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpKQorICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3QgaW4gbWFwLgorCisgICAgVGhlQnVja2V0LT5zZWNvbmQuflZhbHVlVCgpOworICAgIFRoZUJ1Y2tldC0+Zmlyc3QgPSBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICAtLU51bUVudHJpZXM7CisgICAgKytOdW1Ub21ic3RvbmVzOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgZXJhc2UoaXRlcmF0b3IgSSkgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldCA9ICYqSTsKKyAgICBUaGVCdWNrZXQtPnNlY29uZC5+VmFsdWVUKCk7CisgICAgVGhlQnVja2V0LT5maXJzdCA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIC0tTnVtRW50cmllczsKKyAgICArK051bVRvbWJzdG9uZXM7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIHN3YXAoRGVuc2VNYXAmIFJIUykgeworICAgIHN0ZDo6c3dhcChOdW1CdWNrZXRzLCBSSFMuTnVtQnVja2V0cyk7CisgICAgc3RkOjpzd2FwKEJ1Y2tldHMsIFJIUy5CdWNrZXRzKTsKKyAgICBzdGQ6OnN3YXAoTnVtRW50cmllcywgUkhTLk51bUVudHJpZXMpOworICAgIHN0ZDo6c3dhcChOdW1Ub21ic3RvbmVzLCBSSFMuTnVtVG9tYnN0b25lcyk7CisgIH0KKworICB2YWx1ZV90eXBlJiBGaW5kQW5kQ29uc3RydWN0KGNvbnN0IEtleVQgJktleSkgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKKyAgICBpZiAoTG9va3VwQnVja2V0Rm9yKEtleSwgVGhlQnVja2V0KSkKKyAgICAgIHJldHVybiAqVGhlQnVja2V0OworCisgICAgcmV0dXJuICpJbnNlcnRJbnRvQnVja2V0KEtleSwgVmFsdWVUKCksIFRoZUJ1Y2tldCk7CisgIH0KKworICBWYWx1ZVQgJm9wZXJhdG9yW10oY29uc3QgS2V5VCAmS2V5KSB7CisgICAgcmV0dXJuIEZpbmRBbmRDb25zdHJ1Y3QoS2V5KS5zZWNvbmQ7CisgIH0KKworICBEZW5zZU1hcCYgb3BlcmF0b3I9KGNvbnN0IERlbnNlTWFwJiBvdGhlcikgeworICAgIENvcHlGcm9tKG90aGVyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gaXNQb2ludGVySW50b0J1Y2tldHNBcnJheSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnRlciBwb2ludHMKKyAgLy8vIHNvbWV3aGVyZSBpbnRvIHRoZSBEZW5zZU1hcCdzIGFycmF5IG9mIGJ1Y2tldHMgKGkuZS4gZWl0aGVyIHRvIGEga2V5IG9yCisgIC8vLyB2YWx1ZSBpbiB0aGUgRGVuc2VNYXApLgorICBib29sIGlzUG9pbnRlckludG9CdWNrZXRzQXJyYXkoY29uc3Qgdm9pZCAqUHRyKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ciA+PSBCdWNrZXRzICYmIFB0ciA8IEJ1Y2tldHMrTnVtQnVja2V0czsKKyAgfQorCisgIC8vLyBnZXRQb2ludGVySW50b0J1Y2tldHNBcnJheSgpIC0gUmV0dXJuIGFuIG9wYXF1ZSBwb2ludGVyIGludG8gdGhlIGJ1Y2tldHMKKyAgLy8vIGFycmF5LiAgSW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgbWV0aG9kLCB0aGlzIGNhbiBiZSB1c2VkIHRvCisgIC8vLyBkZXRlcm1pbmUgd2hldGhlciBhbiBpbnNlcnRpb24gY2F1c2VkIHRoZSBEZW5zZU1hcCB0byByZWFsbG9jYXRlLgorICBjb25zdCB2b2lkICpnZXRQb2ludGVySW50b0J1Y2tldHNBcnJheSgpIGNvbnN0IHsgcmV0dXJuIEJ1Y2tldHM7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBEZW5zZU1hcCYgb3RoZXIpIHsKKyAgICBpZiAoTnVtQnVja2V0cyAhPSAwICYmCisgICAgICAgICghaXNQb2RMaWtlPEtleUluZm9UPjo6dmFsdWUgfHwgIWlzUG9kTGlrZTxWYWx1ZUluZm9UPjo6dmFsdWUpKSB7CisgICAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gZ2V0RW1wdHlLZXkoKSwgVG9tYnN0b25lS2V5ID0gZ2V0VG9tYnN0b25lS2V5KCk7CisgICAgICBmb3IgKEJ1Y2tldFQgKlAgPSBCdWNrZXRzLCAqRSA9IEJ1Y2tldHMrTnVtQnVja2V0czsgUCAhPSBFOyArK1ApIHsKKyAgICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChQLT5maXJzdCwgRW1wdHlLZXkpICYmCisgICAgICAgICAgICAhS2V5SW5mb1Q6OmlzRXF1YWwoUC0+Zmlyc3QsIFRvbWJzdG9uZUtleSkpCisgICAgICAgICAgUC0+c2Vjb25kLn5WYWx1ZVQoKTsKKyAgICAgICAgUC0+Zmlyc3QufktleVQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBOdW1FbnRyaWVzID0gb3RoZXIuTnVtRW50cmllczsKKyAgICBOdW1Ub21ic3RvbmVzID0gb3RoZXIuTnVtVG9tYnN0b25lczsKKworICAgIGlmIChOdW1CdWNrZXRzKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgbWVtc2V0KEJ1Y2tldHMsIDB4NWEsIHNpemVvZihCdWNrZXRUKSpOdW1CdWNrZXRzKTsKKyNlbmRpZgorICAgICAgb3BlcmF0b3IgZGVsZXRlKEJ1Y2tldHMpOworICAgIH0KKyAgICBCdWNrZXRzID0gc3RhdGljX2Nhc3Q8QnVja2V0VCo+KG9wZXJhdG9yIG5ldyhzaXplb2YoQnVja2V0VCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLk51bUJ1Y2tldHMpKTsKKworICAgIGlmIChpc1BvZExpa2U8S2V5SW5mb1Q+Ojp2YWx1ZSAmJiBpc1BvZExpa2U8VmFsdWVJbmZvVD46OnZhbHVlKQorICAgICAgbWVtY3B5KEJ1Y2tldHMsIG90aGVyLkJ1Y2tldHMsIG90aGVyLk51bUJ1Y2tldHMgKiBzaXplb2YoQnVja2V0VCkpOworICAgIGVsc2UKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3RoZXIuTnVtQnVja2V0czsgKytpKSB7CisgICAgICAgIG5ldyAoJkJ1Y2tldHNbaV0uZmlyc3QpIEtleVQob3RoZXIuQnVja2V0c1tpXS5maXJzdCk7CisgICAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoQnVja2V0c1tpXS5maXJzdCwgZ2V0RW1wdHlLZXkoKSkgJiYKKyAgICAgICAgICAgICFLZXlJbmZvVDo6aXNFcXVhbChCdWNrZXRzW2ldLmZpcnN0LCBnZXRUb21ic3RvbmVLZXkoKSkpCisgICAgICAgICAgbmV3ICgmQnVja2V0c1tpXS5zZWNvbmQpIFZhbHVlVChvdGhlci5CdWNrZXRzW2ldLnNlY29uZCk7CisgICAgICB9CisgICAgTnVtQnVja2V0cyA9IG90aGVyLk51bUJ1Y2tldHM7CisgIH0KKworICBCdWNrZXRUICpJbnNlcnRJbnRvQnVja2V0KGNvbnN0IEtleVQgJktleSwgY29uc3QgVmFsdWVUICZWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXRUICpUaGVCdWNrZXQpIHsKKyAgICAvLyBJZiB0aGUgbG9hZCBvZiB0aGUgaGFzaCB0YWJsZSBpcyBtb3JlIHRoYW4gMy80LCBvciBpZiBmZXdlciB0aGFuIDEvOCBvZgorICAgIC8vIHRoZSBidWNrZXRzIGFyZSBlbXB0eSAobWVhbmluZyB0aGF0IG1hbnkgYXJlIGZpbGxlZCB3aXRoIHRvbWJzdG9uZXMpLAorICAgIC8vIGdyb3cgdGhlIHRhYmxlLgorICAgIC8vCisgICAgLy8gVGhlIGxhdGVyIGNhc2UgaXMgdHJpY2t5LiAgRm9yIGV4YW1wbGUsIGlmIHdlIGhhZCBvbmUgZW1wdHkgYnVja2V0IHdpdGgKKyAgICAvLyB0b25zIG9mIHRvbWJzdG9uZXMsIGZhaWxpbmcgbG9va3VwcyAoZS5nLiBmb3IgaW5zZXJ0aW9uKSB3b3VsZCBoYXZlIHRvCisgICAgLy8gcHJvYmUgYWxtb3N0IHRoZSBlbnRpcmUgdGFibGUgdW50aWwgaXQgZm91bmQgdGhlIGVtcHR5IGJ1Y2tldC4gIElmIHRoZQorICAgIC8vIHRhYmxlIGNvbXBsZXRlbHkgZmlsbGVkIHdpdGggdG9tYnN0b25lcywgbm8gbG9va3VwIHdvdWxkIGV2ZXIgc3VjY2VlZCwKKyAgICAvLyBjYXVzaW5nIGluZmluaXRlIGxvb3BzIGluIGxvb2t1cC4KKyAgICArK051bUVudHJpZXM7CisgICAgaWYgKE51bUVudHJpZXMqNCA+PSBOdW1CdWNrZXRzKjMgfHwKKyAgICAgICAgTnVtQnVja2V0cy0oTnVtRW50cmllcytOdW1Ub21ic3RvbmVzKSA8IE51bUJ1Y2tldHMvOCkgeworICAgICAgdGhpcy0+Z3JvdyhOdW1CdWNrZXRzICogMik7CisgICAgICBMb29rdXBCdWNrZXRGb3IoS2V5LCBUaGVCdWNrZXQpOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSB3cml0aW5nIG92ZXIgYSB0b21ic3RvbmUsIHJlbWVtYmVyIHRoaXMuCisgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChUaGVCdWNrZXQtPmZpcnN0LCBnZXRFbXB0eUtleSgpKSkKKyAgICAgIC0tTnVtVG9tYnN0b25lczsKKworICAgIFRoZUJ1Y2tldC0+Zmlyc3QgPSBLZXk7CisgICAgbmV3ICgmVGhlQnVja2V0LT5zZWNvbmQpIFZhbHVlVChWYWx1ZSk7CisgICAgcmV0dXJuIFRoZUJ1Y2tldDsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgS2V5VCAmVmFsKSB7CisgICAgcmV0dXJuIEtleUluZm9UOjpnZXRIYXNoVmFsdWUoVmFsKTsKKyAgfQorICBzdGF0aWMgY29uc3QgS2V5VCBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gS2V5SW5mb1Q6OmdldEVtcHR5S2V5KCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IEtleVQgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBLZXlJbmZvVDo6Z2V0VG9tYnN0b25lS2V5KCk7CisgIH0KKworICAvLy8gTG9va3VwQnVja2V0Rm9yIC0gTG9va3VwIHRoZSBhcHByb3ByaWF0ZSBidWNrZXQgZm9yIFZhbCwgcmV0dXJuaW5nIGl0IGluCisgIC8vLyBGb3VuZEJ1Y2tldC4gIElmIHRoZSBidWNrZXQgY29udGFpbnMgdGhlIGtleSBhbmQgYSB2YWx1ZSwgdGhpcyByZXR1cm5zCisgIC8vLyB0cnVlLCBvdGhlcndpc2UgaXQgcmV0dXJucyBhIGJ1Y2tldCB3aXRoIGFuIGVtcHR5IG1hcmtlciBvciB0b21ic3RvbmUgYW5kCisgIC8vLyByZXR1cm5zIGZhbHNlLgorICBib29sIExvb2t1cEJ1Y2tldEZvcihjb25zdCBLZXlUICZWYWwsIEJ1Y2tldFQgKiZGb3VuZEJ1Y2tldCkgY29uc3QgeworICAgIHVuc2lnbmVkIEJ1Y2tldE5vID0gZ2V0SGFzaFZhbHVlKFZhbCk7CisgICAgdW5zaWduZWQgUHJvYmVBbXQgPSAxOworICAgIEJ1Y2tldFQgKkJ1Y2tldHNQdHIgPSBCdWNrZXRzOworCisgICAgLy8gRm91bmRUb21ic3RvbmUgLSBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgZmluZCBhIHRvbWJzdG9uZSB3aGlsZSBwcm9iaW5nLgorICAgIEJ1Y2tldFQgKkZvdW5kVG9tYnN0b25lID0gMDsKKyAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gZ2V0RW1wdHlLZXkoKTsKKyAgICBjb25zdCBLZXlUIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIGFzc2VydCghS2V5SW5mb1Q6OmlzRXF1YWwoVmFsLCBFbXB0eUtleSkgJiYKKyAgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKFZhbCwgVG9tYnN0b25lS2V5KSAmJgorICAgICAgICAgICAiRW1wdHkvVG9tYnN0b25lIHZhbHVlIHNob3VsZG4ndCBiZSBpbnNlcnRlZCBpbnRvIG1hcCEiKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICBCdWNrZXRUICpUaGlzQnVja2V0ID0gQnVja2V0c1B0ciArIChCdWNrZXRObyAmIChOdW1CdWNrZXRzLTEpKTsKKyAgICAgIC8vIEZvdW5kIFZhbCdzIGJ1Y2tldD8gIElmIHNvLCByZXR1cm4gaXQuCisgICAgICBpZiAoS2V5SW5mb1Q6OmlzRXF1YWwoVGhpc0J1Y2tldC0+Zmlyc3QsIFZhbCkpIHsKKyAgICAgICAgRm91bmRCdWNrZXQgPSBUaGlzQnVja2V0OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgZm91bmQgYW4gZW1wdHkgYnVja2V0LCB0aGUga2V5IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHNldC4KKyAgICAgIC8vIEluc2VydCBpdCBhbmQgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgaWYgKEtleUluZm9UOjppc0VxdWFsKFRoaXNCdWNrZXQtPmZpcnN0LCBFbXB0eUtleSkpIHsKKyAgICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBzZWVuIGEgdG9tYnN0b25lIHdoaWxlIHByb2JpbmcsIGZpbGwgaXQgaW4gaW5zdGVhZAorICAgICAgICAvLyBvZiB0aGUgZW1wdHkgYnVja2V0IHdlIGV2ZW50dWFsbHkgcHJvYmVkIHRvLgorICAgICAgICBpZiAoRm91bmRUb21ic3RvbmUpIFRoaXNCdWNrZXQgPSBGb3VuZFRvbWJzdG9uZTsKKyAgICAgICAgRm91bmRCdWNrZXQgPSBGb3VuZFRvbWJzdG9uZSA/IEZvdW5kVG9tYnN0b25lIDogVGhpc0J1Y2tldDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGlzIGlzIGEgdG9tYnN0b25lLCByZW1lbWJlciBpdC4gIElmIFZhbCBlbmRzIHVwIG5vdCBpbiB0aGUgbWFwLCB3ZQorICAgICAgLy8gcHJlZmVyIHRvIHJldHVybiBpdCB0aGFuIHNvbWV0aGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgbW9yZSBwcm9iaW5nLgorICAgICAgaWYgKEtleUluZm9UOjppc0VxdWFsKFRoaXNCdWNrZXQtPmZpcnN0LCBUb21ic3RvbmVLZXkpICYmICFGb3VuZFRvbWJzdG9uZSkKKyAgICAgICAgRm91bmRUb21ic3RvbmUgPSBUaGlzQnVja2V0OyAgLy8gUmVtZW1iZXIgdGhlIGZpcnN0IHRvbWJzdG9uZSBmb3VuZC4KKworICAgICAgLy8gT3RoZXJ3aXNlLCBpdCdzIGEgaGFzaCBjb2xsaXNpb24gb3IgYSB0b21ic3RvbmUsIGNvbnRpbnVlIHF1YWRyYXRpYworICAgICAgLy8gcHJvYmluZy4KKyAgICAgIEJ1Y2tldE5vICs9IFByb2JlQW10Kys7CisgICAgfQorICB9CisKKyAgdm9pZCBpbml0KHVuc2lnbmVkIEluaXRCdWNrZXRzKSB7CisgICAgTnVtRW50cmllcyA9IDA7CisgICAgTnVtVG9tYnN0b25lcyA9IDA7CisgICAgTnVtQnVja2V0cyA9IEluaXRCdWNrZXRzOworICAgIGFzc2VydChJbml0QnVja2V0cyAmJiAoSW5pdEJ1Y2tldHMgJiAoSW5pdEJ1Y2tldHMtMSkpID09IDAgJiYKKyAgICAgICAgICAgIiMgaW5pdGlhbCBidWNrZXRzIG11c3QgYmUgYSBwb3dlciBvZiB0d28hIik7CisgICAgQnVja2V0cyA9IHN0YXRpY19jYXN0PEJ1Y2tldFQqPihvcGVyYXRvciBuZXcoc2l6ZW9mKEJ1Y2tldFQpKkluaXRCdWNrZXRzKSk7CisgICAgLy8gSW5pdGlhbGl6ZSBhbGwgdGhlIGtleXMgdG8gRW1wdHlLZXkuCisgICAgY29uc3QgS2V5VCBFbXB0eUtleSA9IGdldEVtcHR5S2V5KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBJbml0QnVja2V0czsgKytpKQorICAgICAgbmV3ICgmQnVja2V0c1tpXS5maXJzdCkgS2V5VChFbXB0eUtleSk7CisgIH0KKworICB2b2lkIGdyb3codW5zaWduZWQgQXRMZWFzdCkgeworICAgIHVuc2lnbmVkIE9sZE51bUJ1Y2tldHMgPSBOdW1CdWNrZXRzOworICAgIEJ1Y2tldFQgKk9sZEJ1Y2tldHMgPSBCdWNrZXRzOworCisgICAgLy8gRG91YmxlIHRoZSBudW1iZXIgb2YgYnVja2V0cy4KKyAgICB3aGlsZSAoTnVtQnVja2V0cyA8IEF0TGVhc3QpCisgICAgICBOdW1CdWNrZXRzIDw8PSAxOworICAgIE51bVRvbWJzdG9uZXMgPSAwOworICAgIEJ1Y2tldHMgPSBzdGF0aWNfY2FzdDxCdWNrZXRUKj4ob3BlcmF0b3IgbmV3KHNpemVvZihCdWNrZXRUKSpOdW1CdWNrZXRzKSk7CisKKyAgICAvLyBJbml0aWFsaXplIGFsbCB0aGUga2V5cyB0byBFbXB0eUtleS4KKyAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gZ2V0RW1wdHlLZXkoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtQnVja2V0czsgaSAhPSBlOyArK2kpCisgICAgICBuZXcgKCZCdWNrZXRzW2ldLmZpcnN0KSBLZXlUKEVtcHR5S2V5KTsKKworICAgIC8vIEluc2VydCBhbGwgdGhlIG9sZCBlbGVtZW50cy4KKyAgICBjb25zdCBLZXlUIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIGZvciAoQnVja2V0VCAqQiA9IE9sZEJ1Y2tldHMsICpFID0gT2xkQnVja2V0cytPbGROdW1CdWNrZXRzOyBCICE9IEU7ICsrQikgeworICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChCLT5maXJzdCwgRW1wdHlLZXkpICYmCisgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKEItPmZpcnN0LCBUb21ic3RvbmVLZXkpKSB7CisgICAgICAgIC8vIEluc2VydCB0aGUga2V5L3ZhbHVlIGludG8gdGhlIG5ldyB0YWJsZS4KKyAgICAgICAgQnVja2V0VCAqRGVzdEJ1Y2tldDsKKyAgICAgICAgYm9vbCBGb3VuZFZhbCA9IExvb2t1cEJ1Y2tldEZvcihCLT5maXJzdCwgRGVzdEJ1Y2tldCk7CisgICAgICAgIEZvdW5kVmFsID0gRm91bmRWYWw7IC8vIHNpbGVuY2Ugd2FybmluZy4KKyAgICAgICAgYXNzZXJ0KCFGb3VuZFZhbCAmJiAiS2V5IGFscmVhZHkgaW4gbmV3IG1hcD8iKTsKKyAgICAgICAgRGVzdEJ1Y2tldC0+Zmlyc3QgPSBCLT5maXJzdDsKKyAgICAgICAgbmV3ICgmRGVzdEJ1Y2tldC0+c2Vjb25kKSBWYWx1ZVQoQi0+c2Vjb25kKTsKKworICAgICAgICAvLyBGcmVlIHRoZSB2YWx1ZS4KKyAgICAgICAgQi0+c2Vjb25kLn5WYWx1ZVQoKTsKKyAgICAgIH0KKyAgICAgIEItPmZpcnN0Ln5LZXlUKCk7CisgICAgfQorCisjaWZuZGVmIE5ERUJVRworICAgIG1lbXNldChPbGRCdWNrZXRzLCAweDVhLCBzaXplb2YoQnVja2V0VCkqT2xkTnVtQnVja2V0cyk7CisjZW5kaWYKKyAgICAvLyBGcmVlIHRoZSBvbGQgdGFibGUuCisgICAgb3BlcmF0b3IgZGVsZXRlKE9sZEJ1Y2tldHMpOworICB9CisKKyAgdm9pZCBzaHJpbmtfYW5kX2NsZWFyKCkgeworICAgIHVuc2lnbmVkIE9sZE51bUJ1Y2tldHMgPSBOdW1CdWNrZXRzOworICAgIEJ1Y2tldFQgKk9sZEJ1Y2tldHMgPSBCdWNrZXRzOworCisgICAgLy8gUmVkdWNlIHRoZSBudW1iZXIgb2YgYnVja2V0cy4KKyAgICBOdW1CdWNrZXRzID0gTnVtRW50cmllcyA+IDMyID8gMSA8PCAoTG9nMl8zMl9DZWlsKE51bUVudHJpZXMpICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNjQ7CisgICAgTnVtVG9tYnN0b25lcyA9IDA7CisgICAgQnVja2V0cyA9IHN0YXRpY19jYXN0PEJ1Y2tldFQqPihvcGVyYXRvciBuZXcoc2l6ZW9mKEJ1Y2tldFQpKk51bUJ1Y2tldHMpKTsKKworICAgIC8vIEluaXRpYWxpemUgYWxsIHRoZSBrZXlzIHRvIEVtcHR5S2V5LgorICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSBnZXRFbXB0eUtleSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1CdWNrZXRzOyBpICE9IGU7ICsraSkKKyAgICAgIG5ldyAoJkJ1Y2tldHNbaV0uZmlyc3QpIEtleVQoRW1wdHlLZXkpOworCisgICAgLy8gRnJlZSB0aGUgb2xkIGJ1Y2tldHMuCisgICAgY29uc3QgS2V5VCBUb21ic3RvbmVLZXkgPSBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBmb3IgKEJ1Y2tldFQgKkIgPSBPbGRCdWNrZXRzLCAqRSA9IE9sZEJ1Y2tldHMrT2xkTnVtQnVja2V0czsgQiAhPSBFOyArK0IpIHsKKyAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoQi0+Zmlyc3QsIEVtcHR5S2V5KSAmJgorICAgICAgICAgICFLZXlJbmZvVDo6aXNFcXVhbChCLT5maXJzdCwgVG9tYnN0b25lS2V5KSkgeworICAgICAgICAvLyBGcmVlIHRoZSB2YWx1ZS4KKyAgICAgICAgQi0+c2Vjb25kLn5WYWx1ZVQoKTsKKyAgICAgIH0KKyAgICAgIEItPmZpcnN0Ln5LZXlUKCk7CisgICAgfQorCisjaWZuZGVmIE5ERUJVRworICAgIG1lbXNldChPbGRCdWNrZXRzLCAweDVhLCBzaXplb2YoQnVja2V0VCkqT2xkTnVtQnVja2V0cyk7CisjZW5kaWYKKyAgICAvLyBGcmVlIHRoZSBvbGQgdGFibGUuCisgICAgb3BlcmF0b3IgZGVsZXRlKE9sZEJ1Y2tldHMpOworCisgICAgTnVtRW50cmllcyA9IDA7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwKKyAgICAgICAgIHR5cGVuYW1lIEtleUluZm9ULCB0eXBlbmFtZSBWYWx1ZUluZm9ULCBib29sIElzQ29uc3Q+CitjbGFzcyBEZW5zZU1hcEl0ZXJhdG9yIHsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiBCdWNrZXQ7CisgIHR5cGVkZWYgRGVuc2VNYXBJdGVyYXRvcjxLZXlULCBWYWx1ZVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJbmZvVCwgVmFsdWVJbmZvVCwgdHJ1ZT4gQ29uc3RJdGVyYXRvcjsKKyAgZnJpZW5kIGNsYXNzIERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgVmFsdWVJbmZvVCwgdHJ1ZT47CitwdWJsaWM6CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxJc0NvbnN0LCBjb25zdCBCdWNrZXQsIEJ1Y2tldD46OnR5cGUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlICpwb2ludGVyOworICB0eXBlZGVmIHZhbHVlX3R5cGUgJnJlZmVyZW5jZTsKKyAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworcHJpdmF0ZToKKyAgcG9pbnRlciBQdHIsIEVuZDsKK3B1YmxpYzoKKyAgRGVuc2VNYXBJdGVyYXRvcigpIDogUHRyKDApLCBFbmQoMCkge30KKworICBEZW5zZU1hcEl0ZXJhdG9yKHBvaW50ZXIgUG9zLCBwb2ludGVyIEUpIDogUHRyKFBvcyksIEVuZChFKSB7CisgICAgQWR2YW5jZVBhc3RFbXB0eUJ1Y2tldHMoKTsKKyAgfQorCisgIC8vIElmIElzQ29uc3QgaXMgdHJ1ZSB0aGlzIGlzIGEgY29udmVydGluZyBjb25zdHJ1Y3RvciBmcm9tIGl0ZXJhdG9yIHRvCisgIC8vIGNvbnN0X2l0ZXJhdG9yIGFuZCB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGlzIHVzZWQuCisgIC8vIE90aGVyd2lzZSB0aGlzIGlzIGEgY29weSBjb25zdHJ1Y3RvciBmb3IgaXRlcmF0b3IuCisgIERlbnNlTWFwSXRlcmF0b3IoY29uc3QgRGVuc2VNYXBJdGVyYXRvcjxLZXlULCBWYWx1ZVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJbmZvVCwgVmFsdWVJbmZvVCwgZmFsc2U+JiBJKQorICAgIDogUHRyKEkuUHRyKSwgRW5kKEkuRW5kKSB7fQorCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuICpQdHI7CisgIH0KKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBQdHI7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29uc3RJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ciA9PSBSSFMub3BlcmF0b3ItPigpOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb25zdEl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyICE9IFJIUy5vcGVyYXRvci0+KCk7CisgIH0KKworICBpbmxpbmUgRGVuc2VNYXBJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgIC8vIFByZWluY3JlbWVudAorICAgICsrUHRyOworICAgIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIERlbnNlTWFwSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBEZW5zZU1hcEl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgQWR2YW5jZVBhc3RFbXB0eUJ1Y2tldHMoKSB7CisgICAgY29uc3QgS2V5VCBFbXB0eSA9IEtleUluZm9UOjpnZXRFbXB0eUtleSgpOworICAgIGNvbnN0IEtleVQgVG9tYnN0b25lID0gS2V5SW5mb1Q6OmdldFRvbWJzdG9uZUtleSgpOworCisgICAgd2hpbGUgKFB0ciAhPSBFbmQgJiYKKyAgICAgICAgICAgKEtleUluZm9UOjppc0VxdWFsKFB0ci0+Zmlyc3QsIEVtcHR5KSB8fAorICAgICAgICAgICAgS2V5SW5mb1Q6OmlzRXF1YWwoUHRyLT5maXJzdCwgVG9tYnN0b25lKSkpCisgICAgICArK1B0cjsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0RlbnNlTWFwSW5mby5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9EZW5zZU1hcEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjk5Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9EZW5zZU1hcEluZm8uaApAQCAtMCwwICsxLDE1MSBAQAorLy89PT0tIGxsdm0vQURUL0RlbnNlTWFwSW5mby5oIC0gVHlwZSB0cmFpdHMgZm9yIERlbnNlTWFwIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBEZW5zZU1hcEluZm8gdHJhaXRzIGZvciBEZW5zZU1hcC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0RFTlNFTUFQSU5GT19ICisjZGVmaW5lIExMVk1fQURUX0RFTlNFTUFQSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBEZW5zZU1hcEluZm8geworICAvL3N0YXRpYyBpbmxpbmUgVCBnZXRFbXB0eUtleSgpOworICAvL3N0YXRpYyBpbmxpbmUgVCBnZXRUb21ic3RvbmVLZXkoKTsKKyAgLy9zdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFQgJlZhbCk7CisgIC8vc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBUICZMSFMsIGNvbnN0IFQgJlJIUyk7Cit9OworCisvLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgYWxsIHBvaW50ZXJzLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBEZW5zZU1hcEluZm88VCo+IHsKKyAgc3RhdGljIGlubGluZSBUKiBnZXRFbXB0eUtleSgpIHsKKyAgICBpbnRwdHJfdCBWYWwgPSAtMTsKKyAgICBWYWwgPDw9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUKj46Ok51bUxvd0JpdHNBdmFpbGFibGU7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KFZhbCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBUKiBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgaW50cHRyX3QgVmFsID0gLTI7CisgICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VCo+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihWYWwpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgVCAqUHRyVmFsKSB7CisgICAgcmV0dXJuICh1bnNpZ25lZCgodWludHB0cl90KVB0clZhbCkgPj4gNCkgXgorICAgICAgICAgICAodW5zaWduZWQoKHVpbnRwdHJfdClQdHJWYWwpID4+IDkpOworICB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgVCAqTEhTLCBjb25zdCBUICpSSFMpIHsgcmV0dXJuIExIUyA9PSBSSFM7IH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBjaGFycy4KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxjaGFyPiB7CisgIHN0YXRpYyBpbmxpbmUgY2hhciBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIH4wOyB9CisgIHN0YXRpYyBpbmxpbmUgY2hhciBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiB+MCAtIDE7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBjaGFyJiBWYWwpIHsgcmV0dXJuIFZhbCAqIDM3OyB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgY2hhciAmTEhTLCBjb25zdCBjaGFyICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKyAgCisvLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgdW5zaWduZWQgaW50cy4KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzx1bnNpZ25lZD4geworICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gfjA7IH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiB+MFUgLSAxOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgdW5zaWduZWQmIFZhbCkgeyByZXR1cm4gVmFsICogMzc7IH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCB1bnNpZ25lZCYgTEhTLCBjb25zdCB1bnNpZ25lZCYgUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciB1bnNpZ25lZCBsb25ncy4KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzx1bnNpZ25lZCBsb25nPiB7CisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIH4wVUw7IH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIH4wVUwgLSAxTDsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IHVuc2lnbmVkIGxvbmcmIFZhbCkgeworICAgIHJldHVybiAodW5zaWduZWQpKFZhbCAqIDM3VUwpOworICB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgdW5zaWduZWQgbG9uZyYgTEhTLCBjb25zdCB1bnNpZ25lZCBsb25nJiBSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIHVuc2lnbmVkIGxvbmcgbG9uZ3MuCit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88dW5zaWduZWQgbG9uZyBsb25nPiB7CisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gfjBVTEw7IH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0VG9tYnN0b25lS2V5KCkgeyByZXR1cm4gfjBVTEwgLSAxVUxMOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgdW5zaWduZWQgbG9uZyBsb25nJiBWYWwpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKShWYWwgKiAzN1VMTCk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcmIExIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcmIFJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCisvLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgaW50cy4KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxpbnQ+IHsKKyAgc3RhdGljIGlubGluZSBpbnQgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiAweDdmZmZmZmZmOyB9CisgIHN0YXRpYyBpbmxpbmUgaW50IGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIC0weDdmZmZmZmZmIC0gMTsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IGludCYgVmFsKSB7IHJldHVybiAodW5zaWduZWQpKFZhbCAqIDM3KTsgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IGludCYgTEhTLCBjb25zdCBpbnQmIFJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCisvLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgbG9uZyBsb25ncy4KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxsb25nIGxvbmc+IHsKKyAgc3RhdGljIGlubGluZSBsb25nIGxvbmcgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiAweDdmZmZmZmZmZmZmZmZmZmZMTDsgfQorICBzdGF0aWMgaW5saW5lIGxvbmcgbG9uZyBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiAtMHg3ZmZmZmZmZmZmZmZmZmZmTEwtMTsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IGxvbmcgbG9uZyYgVmFsKSB7CisgICAgcmV0dXJuICh1bnNpZ25lZCkoVmFsICogMzdMTCk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBsb25nIGxvbmcmIExIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcmIFJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCisvLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgYWxsIHBhaXJzIHdob3NlIG1lbWJlcnMgaGF2ZSBpbmZvLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBEZW5zZU1hcEluZm88c3RkOjpwYWlyPFQsIFU+ID4geworICB0eXBlZGVmIHN0ZDo6cGFpcjxULCBVPiBQYWlyOworICB0eXBlZGVmIERlbnNlTWFwSW5mbzxUPiBGaXJzdEluZm87CisgIHR5cGVkZWYgRGVuc2VNYXBJbmZvPFU+IFNlY29uZEluZm87CisKKyAgc3RhdGljIGlubGluZSBQYWlyIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihGaXJzdEluZm86OmdldEVtcHR5S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZEluZm86OmdldEVtcHR5S2V5KCkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgUGFpciBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEZpcnN0SW5mbzo6Z2V0VG9tYnN0b25lS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kSW5mbzo6Z2V0RW1wdHlLZXkoKSk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBQYWlyJiBQYWlyVmFsKSB7CisgICAgdWludDY0X3Qga2V5ID0gKHVpbnQ2NF90KUZpcnN0SW5mbzo6Z2V0SGFzaFZhbHVlKFBhaXJWYWwuZmlyc3QpIDw8IDMyCisgICAgICAgICAgfCAodWludDY0X3QpU2Vjb25kSW5mbzo6Z2V0SGFzaFZhbHVlKFBhaXJWYWwuc2Vjb25kKTsKKyAgICBrZXkgKz0gfihrZXkgPDwgMzIpOworICAgIGtleSBePSAoa2V5ID4+IDIyKTsKKyAgICBrZXkgKz0gfihrZXkgPDwgMTMpOworICAgIGtleSBePSAoa2V5ID4+IDgpOworICAgIGtleSArPSAoa2V5IDw8IDMpOworICAgIGtleSBePSAoa2V5ID4+IDE1KTsKKyAgICBrZXkgKz0gfihrZXkgPDwgMjcpOworICAgIGtleSBePSAoa2V5ID4+IDMxKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKWtleTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFBhaXImIExIUywgY29uc3QgUGFpciYgUkhTKSB7IHJldHVybiBMSFMgPT0gUkhTOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvRGVuc2VTZXQuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvRGVuc2VTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjUxMDViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9EZW5zZVNldC5oCkBAIC0wLDAgKzEsMTI2IEBACisvLz09PS0gbGx2bS9BRFQvRGVuc2VTZXQuaCAtIERlbnNlIHByb2JlZCBoYXNoIHRhYmxlIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBEZW5zZVNldCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0RFTlNFU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfREVOU0VTRVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gRGVuc2VTZXQgLSBUaGlzIGltcGxlbWVudHMgYSBkZW5zZSBwcm9iZWQgaGFzaC10YWJsZSBiYXNlZCBzZXQuCisvLy8KKy8vLyBGSVhNRTogVGhpcyBpcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgZGlyZWN0bHkgaW4gdGVybXMgb2YgRGVuc2VNYXAsIHRoaXMKKy8vLyBzaG91bGQgYmUgb3B0aW1pemVkIGxhdGVyIGlmIHRoZXJlIGlzIGEgbmVlZC4KK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgVmFsdWVJbmZvVCA9IERlbnNlTWFwSW5mbzxWYWx1ZVQ+ID4KK2NsYXNzIERlbnNlU2V0IHsKKyAgdHlwZWRlZiBEZW5zZU1hcDxWYWx1ZVQsIGNoYXIsIFZhbHVlSW5mb1Q+IE1hcFR5OworICBNYXBUeSBUaGVNYXA7CitwdWJsaWM6CisgIERlbnNlU2V0KGNvbnN0IERlbnNlU2V0ICZPdGhlcikgOiBUaGVNYXAoT3RoZXIuVGhlTWFwKSB7fQorICBleHBsaWNpdCBEZW5zZVNldCh1bnNpZ25lZCBOdW1Jbml0QnVja2V0cyA9IDY0KSA6IFRoZU1hcChOdW1Jbml0QnVja2V0cykge30KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gVGhlTWFwLmVtcHR5KCk7IH0KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFRoZU1hcC5zaXplKCk7IH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIFRoZU1hcC5jbGVhcigpOworICB9CisKKyAgYm9vbCBjb3VudChjb25zdCBWYWx1ZVQgJlYpIGNvbnN0IHsKKyAgICByZXR1cm4gVGhlTWFwLmNvdW50KFYpOworICB9CisKKyAgYm9vbCBlcmFzZShjb25zdCBWYWx1ZVQgJlYpIHsKKyAgICByZXR1cm4gVGhlTWFwLmVyYXNlKFYpOworICB9CisKKyAgdm9pZCBzd2FwKERlbnNlU2V0JiBSSFMpIHsKKyAgICBUaGVNYXAuc3dhcChSSFMuVGhlTWFwKTsKKyAgfQorCisgIERlbnNlU2V0ICZvcGVyYXRvcj0oY29uc3QgRGVuc2VTZXQgJlJIUykgeworICAgIFRoZU1hcCA9IFJIUy5UaGVNYXA7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSXRlcmF0b3JzLgorCisgIGNsYXNzIEl0ZXJhdG9yIHsKKyAgICB0eXBlbmFtZSBNYXBUeTo6aXRlcmF0b3IgSTsKKyAgICBmcmllbmQgY2xhc3MgRGVuc2VTZXQ7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIFZhbHVlVCB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSAqcG9pbnRlcjsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUgJnJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICBJdGVyYXRvcihjb25zdCB0eXBlbmFtZSBNYXBUeTo6aXRlcmF0b3IgJmkpIDogSShpKSB7fQorCisgICAgVmFsdWVUJiBvcGVyYXRvciooKSB7IHJldHVybiBJLT5maXJzdDsgfQorICAgIFZhbHVlVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuICZJLT5maXJzdDsgfQorCisgICAgSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICsrSTsgcmV0dXJuICp0aGlzOyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yJiBYKSBjb25zdCB7IHJldHVybiBJID09IFguSTsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciYgWCkgY29uc3QgeyByZXR1cm4gSSAhPSBYLkk7IH0KKyAgfTsKKworICBjbGFzcyBDb25zdEl0ZXJhdG9yIHsKKyAgICB0eXBlbmFtZSBNYXBUeTo6Y29uc3RfaXRlcmF0b3IgSTsKKyAgICBmcmllbmQgY2xhc3MgRGVuc2VTZXQ7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hcFR5Ojpjb25zdF9pdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIFZhbHVlVCB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSAqcG9pbnRlcjsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUgJnJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICBDb25zdEl0ZXJhdG9yKGNvbnN0IHR5cGVuYW1lIE1hcFR5Ojpjb25zdF9pdGVyYXRvciAmaSkgOiBJKGkpIHt9CisKKyAgICBjb25zdCBWYWx1ZVQmIG9wZXJhdG9yKigpIHsgcmV0dXJuIEktPmZpcnN0OyB9CisgICAgY29uc3QgVmFsdWVUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gJkktPmZpcnN0OyB9CisKKyAgICBDb25zdEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyArK0k7IHJldHVybiAqdGhpczsgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb25zdEl0ZXJhdG9yJiBYKSBjb25zdCB7IHJldHVybiBJID09IFguSTsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb25zdEl0ZXJhdG9yJiBYKSBjb25zdCB7IHJldHVybiBJICE9IFguSTsgfQorICB9OworCisgIHR5cGVkZWYgSXRlcmF0b3IgICAgICBpdGVyYXRvcjsKKyAgdHlwZWRlZiBDb25zdEl0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gSXRlcmF0b3IoVGhlTWFwLmJlZ2luKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEl0ZXJhdG9yKFRoZU1hcC5lbmQoKSk7IH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIENvbnN0SXRlcmF0b3IoVGhlTWFwLmJlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIENvbnN0SXRlcmF0b3IoVGhlTWFwLmVuZCgpKTsgfQorCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgVmFsdWVUICZWKSB7IHJldHVybiBJdGVyYXRvcihUaGVNYXAuZmluZChWKSk7IH0KKyAgYm9vbCBlcmFzZShJdGVyYXRvciBJKSB7IHJldHVybiBUaGVNYXAuZXJhc2UoSS5JKTsgfQorICBib29sIGVyYXNlKENvbnN0SXRlcmF0b3IgQ0kpIHsgcmV0dXJuIFRoZU1hcC5lcmFzZShDSS5JKTsgfQorCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IFZhbHVlVCAmVikgeworICAgIHJldHVybiBUaGVNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFYsIDApKTsKKyAgfQorICAKKyAgLy8gUmFuZ2UgaW5zZXJ0aW9uIG9mIHZhbHVlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdD4KKyAgdm9pZCBpbnNlcnQoSW5wdXRJdCBJLCBJbnB1dEl0IEUpIHsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpCisgICAgICBpbnNlcnQoKkkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMmRmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oCkBAIC0wLDAgKzEsMjU5IEBACisvLz09PS0gbGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmggLSBEZXB0aCBGaXJzdCBpdGVyYXRvciAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBidWlsZHMgb24gdGhlIEFEVC9HcmFwaFRyYWl0cy5oIGZpbGUgdG8gYnVpbGQgZ2VuZXJpYyBkZXB0aAorLy8gZmlyc3QgZ3JhcGggaXRlcmF0b3IuICBUaGlzIGZpbGUgZXhwb3NlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy90eXBlczoKKy8vCisvLyBkZl9iZWdpbi9kZl9lbmQvZGZfaXRlcmF0b3IKKy8vICAgKiBOb3JtYWwgZGVwdGgtZmlyc3QgaXRlcmF0aW9uIC0gdmlzaXQgYSBub2RlIGFuZCB0aGVuIGFsbCBvZiBpdHMgY2hpbGRyZW4uCisvLworLy8gaWRmX2JlZ2luL2lkZl9lbmQvaWRmX2l0ZXJhdG9yCisvLyAgICogRGVwdGgtZmlyc3QgaXRlcmF0aW9uIG9uIHRoZSAnaW52ZXJzZScgZ3JhcGguCisvLworLy8gZGZfZXh0X2JlZ2luL2RmX2V4dF9lbmQvZGZfZXh0X2l0ZXJhdG9yCisvLyAgICogTm9ybWFsIGRlcHRoLWZpcnN0IGl0ZXJhdGlvbiAtIHZpc2l0IGEgbm9kZSBhbmQgdGhlbiBhbGwgb2YgaXRzIGNoaWxkcmVuLgorLy8gICAgIFRoaXMgaXRlcmF0b3Igc3RvcmVzIHRoZSAndmlzaXRlZCcgc2V0IGluIGFuIGV4dGVybmFsIHNldCwgd2hpY2ggYWxsb3dzCisvLyAgICAgaXQgdG8gYmUgbW9yZSBlZmZpY2llbnQsIGFuZCBhbGxvd3MgZXh0ZXJuYWwgY2xpZW50cyB0byB1c2UgdGhlIHNldCBmb3IKKy8vICAgICBvdGhlciBwdXJwb3Nlcy4KKy8vCisvLyBpZGZfZXh0X2JlZ2luL2lkZl9leHRfZW5kL2lkZl9leHRfaXRlcmF0b3IKKy8vICAgKiBEZXB0aC1maXJzdCBpdGVyYXRpb24gb24gdGhlICdpbnZlcnNlJyBncmFwaC4KKy8vICAgICBUaGlzIGl0ZXJhdG9yIHN0b3JlcyB0aGUgJ3Zpc2l0ZWQnIHNldCBpbiBhbiBleHRlcm5hbCBzZXQsIHdoaWNoIGFsbG93cworLy8gICAgIGl0IHRvIGJlIG1vcmUgZWZmaWNpZW50LCBhbmQgYWxsb3dzIGV4dGVybmFsIGNsaWVudHMgdG8gdXNlIHRoZSBzZXQgZm9yCisvLyAgICAgb3RoZXIgcHVycG9zZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9ERVBUSEZJUlNUSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9ERVBUSEZJUlNUSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLyBkZl9pdGVyYXRvcl9zdG9yYWdlIC0gQSBwcml2YXRlIGNsYXNzIHdoaWNoIGlzIHVzZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0bworLy8gc3RvcmUgdGhlIHZpc2l0ZWQgc2V0LgordGVtcGxhdGU8Y2xhc3MgU2V0VHlwZSwgYm9vbCBFeHRlcm5hbD4gICAvLyBOb24tZXh0ZXJuYWwgc2V0CitjbGFzcyBkZl9pdGVyYXRvcl9zdG9yYWdlIHsKK3B1YmxpYzoKKyAgU2V0VHlwZSBWaXNpdGVkOworfTsKKwordGVtcGxhdGU8Y2xhc3MgU2V0VHlwZT4KK2NsYXNzIGRmX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgdHJ1ZT4geworcHVibGljOgorICBkZl9pdGVyYXRvcl9zdG9yYWdlKFNldFR5cGUgJlZTZXQpIDogVmlzaXRlZChWU2V0KSB7fQorICBkZl9pdGVyYXRvcl9zdG9yYWdlKGNvbnN0IGRmX2l0ZXJhdG9yX3N0b3JhZ2UgJlMpIDogVmlzaXRlZChTLlZpc2l0ZWQpIHt9CisgIFNldFR5cGUgJlZpc2l0ZWQ7Cit9OworCisKKy8vIEdlbmVyaWMgRGVwdGggRmlyc3QgSXRlcmF0b3IKK3RlbXBsYXRlPGNsYXNzIEdyYXBoVCwKK2NsYXNzIFNldFR5cGUgPSBsbHZtOjpTbWFsbFB0clNldDx0eXBlbmFtZSBHcmFwaFRyYWl0czxHcmFwaFQ+OjpOb2RlVHlwZSosIDg+LAorICAgICAgICAgYm9vbCBFeHRTdG9yYWdlID0gZmFsc2UsIGNsYXNzIEdUID0gR3JhcGhUcmFpdHM8R3JhcGhUPiA+CitjbGFzcyBkZl9pdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEdUOjpOb2RlVHlwZSwgcHRyZGlmZl90PiwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGRmX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4geworICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEdUOjpOb2RlVHlwZSwgcHRyZGlmZl90PiBzdXBlcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIEdUOjpOb2RlVHlwZSAgICAgICAgICBOb2RlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBHVDo6Q2hpbGRJdGVyYXRvclR5cGUgQ2hpbGRJdFR5OworICB0eXBlZGVmIFBvaW50ZXJJbnRQYWlyPE5vZGVUeXBlKiwgMT4gICBQb2ludGVySW50VHk7CisKKyAgLy8gVmlzaXRTdGFjayAtIFVzZWQgdG8gbWFpbnRhaW4gdGhlIG9yZGVyaW5nLiAgVG9wID0gY3VycmVudCBibG9jaworICAvLyBGaXJzdCBlbGVtZW50IGlzIG5vZGUgcG9pbnRlciwgc2Vjb25kIGlzIHRoZSAnbmV4dCBjaGlsZCcgdG8gdmlzaXQKKyAgLy8gaWYgdGhlIGludCBpbiBQb2ludGVySW50VHkgaXMgMCwgdGhlICduZXh0IGNoaWxkJyB0byB2aXNpdCBpcyBpbnZhbGlkCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxQb2ludGVySW50VHksIENoaWxkSXRUeT4gPiBWaXNpdFN0YWNrOworcHJpdmF0ZToKKyAgaW5saW5lIGRmX2l0ZXJhdG9yKE5vZGVUeXBlICpOb2RlKSB7CisgICAgdGhpcy0+VmlzaXRlZC5pbnNlcnQoTm9kZSk7CisgICAgVmlzaXRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUG9pbnRlckludFR5KE5vZGUsIDApLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVDo6Y2hpbGRfYmVnaW4oTm9kZSkpKTsKKyAgfQorICBpbmxpbmUgZGZfaXRlcmF0b3IoKSB7IAorICAgIC8vIEVuZCBpcyB3aGVuIHN0YWNrIGlzIGVtcHR5IAorICB9CisgIGlubGluZSBkZl9pdGVyYXRvcihOb2RlVHlwZSAqTm9kZSwgU2V0VHlwZSAmUykKKyAgICA6IGRmX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4oUykgeworICAgIGlmICghUy5jb3VudChOb2RlKSkgeworICAgICAgVmlzaXRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUG9pbnRlckludFR5KE5vZGUsIDApLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUOjpjaGlsZF9iZWdpbihOb2RlKSkpOworICAgICAgdGhpcy0+VmlzaXRlZC5pbnNlcnQoTm9kZSk7CisgICAgfQorICB9CisgIGlubGluZSBkZl9pdGVyYXRvcihTZXRUeXBlICZTKQorICAgIDogZGZfaXRlcmF0b3Jfc3RvcmFnZTxTZXRUeXBlLCBFeHRTdG9yYWdlPihTKSB7CisgICAgLy8gRW5kIGlzIHdoZW4gc3RhY2sgaXMgZW1wdHkKKyAgfQorCisgIGlubGluZSB2b2lkIHRvTmV4dCgpIHsKKyAgICBkbyB7CisgICAgICBzdGQ6OnBhaXI8UG9pbnRlckludFR5LCBDaGlsZEl0VHk+ICZUb3AgPSBWaXNpdFN0YWNrLmJhY2soKTsKKyAgICAgIE5vZGVUeXBlICpOb2RlID0gVG9wLmZpcnN0LmdldFBvaW50ZXIoKTsKKyAgICAgIENoaWxkSXRUeSAmSXQgID0gVG9wLnNlY29uZDsKKyAgICAgIGlmICghVG9wLmZpcnN0LmdldEludCgpKSB7CisgICAgICAgIC8vIG5vdyByZXRyaWV2ZSB0aGUgcmVhbCBiZWdpbiBvZiB0aGUgY2hpbGRyZW4gYmVmb3JlIHdlIGRpdmUgaW4KKyAgICAgICAgSXQgPSBHVDo6Y2hpbGRfYmVnaW4oTm9kZSk7CisgICAgICAgIFRvcC5maXJzdC5zZXRJbnQoMSk7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChJdCAhPSBHVDo6Y2hpbGRfZW5kKE5vZGUpKSB7CisgICAgICAgIE5vZGVUeXBlICpOZXh0ID0gKkl0Kys7CisgICAgICAgIC8vIEhhcyBvdXIgbmV4dCBzaWJsaW5nIGJlZW4gdmlzaXRlZD8KKyAgICAgICAgaWYgKE5leHQgJiYgIXRoaXMtPlZpc2l0ZWQuY291bnQoTmV4dCkpIHsgIAorICAgICAgICAgIC8vIE5vLCBkbyBpdCBub3cuCisgICAgICAgICAgdGhpcy0+VmlzaXRlZC5pbnNlcnQoTmV4dCk7CisgICAgICAgICAgVmlzaXRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUG9pbnRlckludFR5KE5leHQsIDApLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVDo6Y2hpbGRfYmVnaW4oTmV4dCkpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gT29wcywgcmFuIG91dCBvZiBzdWNjZXNzb3JzLi4uIGdvIHVwIGEgbGV2ZWwgb24gdGhlIHN0YWNrLgorICAgICAgVmlzaXRTdGFjay5wb3BfYmFjaygpOworICAgIH0gd2hpbGUgKCFWaXNpdFN0YWNrLmVtcHR5KCkpOworICB9CisKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcjo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIGRmX2l0ZXJhdG9yPEdyYXBoVCwgU2V0VHlwZSwgRXh0U3RvcmFnZSwgR1Q+IF9TZWxmOworCisgIC8vIFByb3ZpZGUgc3RhdGljIGJlZ2luIGFuZCBlbmQgbWV0aG9kcyBhcyBvdXIgcHVibGljICJjb25zdHJ1Y3RvcnMiCisgIHN0YXRpYyBpbmxpbmUgX1NlbGYgYmVnaW4oY29uc3QgR3JhcGhUJiBHKSB7CisgICAgcmV0dXJuIF9TZWxmKEdUOjpnZXRFbnRyeU5vZGUoRykpOworICB9CisgIHN0YXRpYyBpbmxpbmUgX1NlbGYgZW5kKGNvbnN0IEdyYXBoVCYgRykgeyByZXR1cm4gX1NlbGYoKTsgfQorCisgIC8vIFN0YXRpYyBiZWdpbiBhbmQgZW5kIG1ldGhvZHMgYXMgb3VyIHB1YmxpYyBjdG9ycyBmb3IgZXh0ZXJuYWwgaXRlcmF0b3JzCisgIHN0YXRpYyBpbmxpbmUgX1NlbGYgYmVnaW4oY29uc3QgR3JhcGhUJiBHLCBTZXRUeXBlICZTKSB7CisgICAgcmV0dXJuIF9TZWxmKEdUOjpnZXRFbnRyeU5vZGUoRyksIFMpOworICB9CisgIHN0YXRpYyBpbmxpbmUgX1NlbGYgZW5kKGNvbnN0IEdyYXBoVCYgRywgU2V0VHlwZSAmUykgeyByZXR1cm4gX1NlbGYoUyk7IH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJiB4KSBjb25zdCB7CisgICAgcmV0dXJuIFZpc2l0U3RhY2suc2l6ZSgpID09IHguVmlzaXRTdGFjay5zaXplKCkgJiYKKyAgICAgICAgICAgVmlzaXRTdGFjayA9PSB4LlZpc2l0U3RhY2s7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICBpbmxpbmUgcG9pbnRlciBvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIFZpc2l0U3RhY2suYmFjaygpLmZpcnN0LmdldFBvaW50ZXIoKTsKKyAgfQorCisgIC8vIFRoaXMgaXMgYSBub25zdGFuZGFyZCBvcGVyYXRvci0+IHRoYXQgZGVyZWZlcmVuY2VzIHRoZSBwb2ludGVyIGFuIGV4dHJhCisgIC8vIHRpbWUuLi4gc28gdGhhdCB5b3UgY2FuIGFjdHVhbGx5IGNhbGwgbWV0aG9kcyBPTiB0aGUgTm9kZSwgYmVjYXVzZQorICAvLyB0aGUgY29udGFpbmVkIHR5cGUgaXMgYSBwb2ludGVyLiAgVGhpcyBhbGxvd3MgQkJJdC0+Z2V0VGVybWluYXRvcigpIGYuZS4KKyAgLy8KKyAgaW5saW5lIE5vZGVUeXBlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKworICBpbmxpbmUgX1NlbGYmIG9wZXJhdG9yKysoKSB7ICAgLy8gUHJlaW5jcmVtZW50CisgICAgdG9OZXh0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gc2tpcHMgYWxsIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIHRyYXZlcnNlcyB0byBuZXh0IG5vZGUKKyAgLy8KKyAgaW5saW5lIF9TZWxmJiBza2lwQ2hpbGRyZW4oKSB7ICAKKyAgICBWaXNpdFN0YWNrLnBvcF9iYWNrKCk7CisgICAgaWYgKCFWaXNpdFN0YWNrLmVtcHR5KCkpCisgICAgICB0b05leHQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgIF9TZWxmIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9CisKKyAgLy8gbm9kZVZpc2l0ZWQgLSByZXR1cm4gdHJ1ZSBpZiB0aGlzIGl0ZXJhdG9yIGhhcyBhbHJlYWR5IHZpc2l0ZWQgdGhlCisgIC8vIHNwZWNpZmllZCBub2RlLiAgVGhpcyBpcyBwdWJsaWMsIGFuZCB3aWxsIHByb2JhYmx5IGJlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyCisgIC8vIG5vZGVzIHRoYXQgYSBkZXB0aCBmaXJzdCBpdGVyYXRpb24gZGlkIG5vdCBmaW5kOiBpZSB1bnJlYWNoYWJsZSBub2Rlcy4KKyAgLy8KKyAgaW5saW5lIGJvb2wgbm9kZVZpc2l0ZWQoTm9kZVR5cGUgKk5vZGUpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+VmlzaXRlZC5jb3VudChOb2RlKSAhPSAwOworICB9Cit9OworCisKKy8vIFByb3ZpZGUgZ2xvYmFsIGNvbnN0cnVjdG9ycyB0aGF0IGF1dG9tYXRpY2FsbHkgZmlndXJlIG91dCBjb3JyZWN0IHR5cGVzLi4uCisvLwordGVtcGxhdGUgPGNsYXNzIFQ+CitkZl9pdGVyYXRvcjxUPiBkZl9iZWdpbihjb25zdCBUJiBHKSB7CisgIHJldHVybiBkZl9pdGVyYXRvcjxUPjo6YmVnaW4oRyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorZGZfaXRlcmF0b3I8VD4gZGZfZW5kKGNvbnN0IFQmIEcpIHsKKyAgcmV0dXJuIGRmX2l0ZXJhdG9yPFQ+OjplbmQoRyk7Cit9CisKKy8vIFByb3ZpZGUgZ2xvYmFsIGRlZmluaXRpb25zIG9mIGV4dGVybmFsIGRlcHRoIGZpcnN0IGl0ZXJhdG9ycy4uLgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5ID0gc3RkOjpzZXQ8dHlwZW5hbWUgR3JhcGhUcmFpdHM8VD46Ok5vZGVUeXBlKj4gPgorc3RydWN0IGRmX2V4dF9pdGVyYXRvciA6IHB1YmxpYyBkZl9pdGVyYXRvcjxULCBTZXRUeSwgdHJ1ZT4geworICBkZl9leHRfaXRlcmF0b3IoY29uc3QgZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+ICZWKQorICAgIDogZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+KFYpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHk+CitkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+IGRmX2V4dF9iZWdpbihjb25zdCBUJiBHLCBTZXRUeSAmUykgeworICByZXR1cm4gZGZfZXh0X2l0ZXJhdG9yPFQsIFNldFR5Pjo6YmVnaW4oRywgUyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeT4KK2RmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT4gZGZfZXh0X2VuZChjb25zdCBUJiBHLCBTZXRUeSAmUykgeworICByZXR1cm4gZGZfZXh0X2l0ZXJhdG9yPFQsIFNldFR5Pjo6ZW5kKEcsIFMpOworfQorCisKKy8vIFByb3ZpZGUgZ2xvYmFsIGRlZmluaXRpb25zIG9mIGludmVyc2UgZGVwdGggZmlyc3QgaXRlcmF0b3JzLi4uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwKKyAgY2xhc3MgU2V0VHkgPSBsbHZtOjpTbWFsbFB0clNldDx0eXBlbmFtZSBHcmFwaFRyYWl0czxUPjo6Tm9kZVR5cGUqLCA4PiwKKyAgICAgICAgICBib29sIEV4dGVybmFsID0gZmFsc2U+CitzdHJ1Y3QgaWRmX2l0ZXJhdG9yIDogcHVibGljIGRmX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5LCBFeHRlcm5hbD4geworICBpZGZfaXRlcmF0b3IoY29uc3QgZGZfaXRlcmF0b3I8SW52ZXJzZTxUPiwgU2V0VHksIEV4dGVybmFsPiAmVikKKyAgICA6IGRmX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5LCBFeHRlcm5hbD4oVikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraWRmX2l0ZXJhdG9yPFQ+IGlkZl9iZWdpbihjb25zdCBUJiBHKSB7CisgIHJldHVybiBpZGZfaXRlcmF0b3I8VD46OmJlZ2luKEludmVyc2U8VD4oRykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lkZl9pdGVyYXRvcjxUPiBpZGZfZW5kKGNvbnN0IFQmIEcpeworICByZXR1cm4gaWRmX2l0ZXJhdG9yPFQ+OjplbmQoSW52ZXJzZTxUPihHKSk7Cit9CisKKy8vIFByb3ZpZGUgZ2xvYmFsIGRlZmluaXRpb25zIG9mIGV4dGVybmFsIGludmVyc2UgZGVwdGggZmlyc3QgaXRlcmF0b3JzLi4uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHkgPSBzdGQ6OnNldDx0eXBlbmFtZSBHcmFwaFRyYWl0czxUPjo6Tm9kZVR5cGUqPiA+CitzdHJ1Y3QgaWRmX2V4dF9pdGVyYXRvciA6IHB1YmxpYyBpZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+IHsKKyAgaWRmX2V4dF9pdGVyYXRvcihjb25zdCBpZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+ICZWKQorICAgIDogaWRmX2l0ZXJhdG9yPFQsIFNldFR5LCB0cnVlPihWKSB7fQorICBpZGZfZXh0X2l0ZXJhdG9yKGNvbnN0IGRmX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5LCB0cnVlPiAmVikKKyAgICA6IGlkZl9pdGVyYXRvcjxULCBTZXRUeSwgdHJ1ZT4oVikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeT4KK2lkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+IGlkZl9leHRfYmVnaW4oY29uc3QgVCYgRywgU2V0VHkgJlMpIHsKKyAgcmV0dXJuIGlkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+OjpiZWdpbihJbnZlcnNlPFQ+KEcpLCBTKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5PgoraWRmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT4gaWRmX2V4dF9lbmQoY29uc3QgVCYgRywgU2V0VHkgJlMpIHsKKyAgcmV0dXJuIGlkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+OjplbmQoSW52ZXJzZTxUPihHKSwgUyk7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9FcXVpdmFsZW5jZUNsYXNzZXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvRXF1aXZhbGVuY2VDbGFzc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhNWVkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvRXF1aXZhbGVuY2VDbGFzc2VzLmgKQEAgLTAsMCArMSwyODEgQEAKKy8vPT09LS0gbGx2bS9BRFQvRXF1aXZhbGVuY2VDbGFzc2VzLmggLSBHZW5lcmljIEVxdWl2LiBDbGFzc2VzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBlcXVpdmFsZW5jZSBjbGFzc2VzIHRocm91Z2ggdGhlIHVzZSBUYXJqYW4ncworLy8gZWZmaWNpZW50IHVuaW9uLWZpbmQgYWxnb3JpdGhtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfRVFVSVZBTEVOQ0VDTEFTU0VTX0gKKyNkZWZpbmUgTExWTV9BRFRfRVFVSVZBTEVOQ0VDTEFTU0VTX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBFcXVpdmFsZW5jZUNsYXNzZXMgLSBUaGlzIHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGVxdWl2YWxlbmNlIGNsYXNzZXMgYW5kCisvLy8gc3VwcG9ydHMgdGhyZWUgZWZmaWNpZW50IG9wZXJhdGlvbnM6IGluc2VydCBhbiBlbGVtZW50IGludG8gYSBjbGFzcyBvZiBpdHMKKy8vLyBvd24sIHVuaW9uIHR3byBjbGFzc2VzLCBhbmQgZmluZCB0aGUgY2xhc3MgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gIEluCisvLy8gYWRkaXRpb24gdG8gdGhlc2UgbW9kaWZpY2F0aW9uIG1ldGhvZHMsIGl0IGlzIHBvc3NpYmxlIHRvIGl0ZXJhdGUgb3ZlciBhbGwKKy8vLyBvZiB0aGUgZXF1aXZhbGVuY2UgY2xhc3NlcyBhbmQgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiBhIGNsYXNzLgorLy8vCisvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhbiBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gdGhhdCBvbmx5IHN0b3JlcyBvbmUgY29weQorLy8vIG9mIHRoZSBlbGVtZW50IGJlaW5nIGluZGV4ZWQgcGVyIGVudHJ5IGluIHRoZSBzZXQsIGFuZCBhbGxvd3MgYW55IGFyYml0cmFyeQorLy8vIHR5cGUgdG8gYmUgaW5kZXhlZCAoYXMgbG9uZyBhcyBpdCBjYW4gYmUgb3JkZXJlZCB3aXRoIG9wZXJhdG9yPCkuCisvLy8KKy8vLyBIZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGUgdXNpbmcgaW50ZWdlcnM6CisvLy8KKy8vLyAgRXF1aXZhbGVuY2VDbGFzc2VzPGludD4gRUM7CisvLy8gIEVDLnVuaW9uU2V0cygxLCAyKTsgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IDEsIDIgaW50byB0aGUgc2FtZSBzZXQKKy8vLyAgRUMuaW5zZXJ0KDQpOyBFQy5pbnNlcnQoNSk7ICAgICAgICAvLyBpbnNlcnQgNCwgNSBpbnRvIG93biBzZXRzCisvLy8gIEVDLnVuaW9uU2V0cyg1LCAxKTsgICAgICAgICAgICAgICAgLy8gbWVyZ2UgdGhlIHNldCBmb3IgMSB3aXRoIDUncyBzZXQuCisvLy8KKy8vLyAgZm9yIChFcXVpdmFsZW5jZUNsYXNzZXM8aW50Pjo6aXRlcmF0b3IgSSA9IEVDLmJlZ2luKCksIEUgPSBFQy5lbmQoKTsKKy8vLyAgICAgICBJICE9IEU7ICsrSSkgeyAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgZXF1aXZhbGVuY2Ugc2V0cy4KKy8vLyAgICBpZiAoIUktPmlzTGVhZGVyKCkpIGNvbnRpbnVlOyAgIC8vIElnbm9yZSBub24tbGVhZGVyIHNldHMuCisvLy8gICAgZm9yIChFcXVpdmFsZW5jZUNsYXNzZXM8aW50Pjo6bWVtYmVyX2l0ZXJhdG9yIE1JID0gRUMubWVtYmVyX2JlZ2luKEkpOworLy8vICAgICAgICAgTUkgIT0gRUMubWVtYmVyX2VuZCgpOyArK01JKSAgIC8vIExvb3Agb3ZlciBtZW1iZXJzIGluIHRoaXMgc2V0LgorLy8vICAgICAgY2VyciA8PCAqTUkgPDwgIiAiOyAgLy8gUHJpbnQgbWVtYmVyLgorLy8vICAgIGNlcnIgPDwgIlxuIjsgICAvLyBGaW5pc2ggc2V0LgorLy8vICB9CisvLy8KKy8vLyBUaGlzIGV4YW1wbGUgcHJpbnRzOgorLy8vICAgNAorLy8vICAgNSAxIDIKKy8vLwordGVtcGxhdGUgPGNsYXNzIEVsZW1UeT4KK2NsYXNzIEVxdWl2YWxlbmNlQ2xhc3NlcyB7CisgIC8vLyBFQ1ZhbHVlIC0gVGhlIEVxdWl2YWxlbmNlQ2xhc3NlcyBkYXRhIHN0cnVjdHVyZSBpcyBqdXN0IGEgc2V0IG9mIHRoZXNlLgorICAvLy8gRWFjaCBvZiB0aGVzZSByZXByZXNlbnRzIGEgcmVsYXRpb24gZm9yIGEgdmFsdWUuICBGaXJzdCBpdCBzdG9yZXMgdGhlCisgIC8vLyB2YWx1ZSBpdHNlbGYsIHdoaWNoIHByb3ZpZGVzIHRoZSBvcmRlcmluZyB0aGF0IHRoZSBzZXQgcXVlcmllcy4gIE5leHQsIGl0CisgIC8vLyBwcm92aWRlcyBhICJuZXh0IHBvaW50ZXIiLCB3aGljaCBpcyB1c2VkIHRvIGVudW1lcmF0ZSBhbGwgb2YgdGhlIGVsZW1lbnRzCisgIC8vLyBpbiB0aGUgdW5pb25lZCBzZXQuICBGaW5hbGx5LCBpdCBkZWZpbmVzIGVpdGhlciBhICJlbmQgb2YgbGlzdCBwb2ludGVyIiBvcgorICAvLy8gImxlYWRlciBwb2ludGVyIiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdmFsdWUgaXRzZWxmIGlzIGEgbGVhZGVyLiAgQQorICAvLy8gImxlYWRlciBwb2ludGVyIiBwb2ludHMgdG8gdGhlIG5vZGUgdGhhdCBpcyB0aGUgbGVhZGVyIGZvciB0aGlzIGVsZW1lbnQsCisgIC8vLyBpZiB0aGUgbm9kZSBpcyBub3QgYSBsZWFkZXIuICBBICJlbmQgb2YgbGlzdCBwb2ludGVyIiBwb2ludHMgdG8gdGhlIGxhc3QKKyAgLy8vIG5vZGUgaW4gdGhlIGxpc3Qgb2YgbWVtYmVycyBvZiB0aGlzIGxpc3QuICBXaGV0aGVyIG9yIG5vdCBhIG5vZGUgaXMgYQorICAvLy8gbGVhZGVyIGlzIGRldGVybWluZWQgYnkgYSBiaXQgc3RvbGVuIGZyb20gb25lIG9mIHRoZSBwb2ludGVycy4KKyAgY2xhc3MgRUNWYWx1ZSB7CisgICAgZnJpZW5kIGNsYXNzIEVxdWl2YWxlbmNlQ2xhc3NlczsKKyAgICBtdXRhYmxlIGNvbnN0IEVDVmFsdWUgKkxlYWRlciwgKk5leHQ7CisgICAgRWxlbVR5IERhdGE7CisgICAgLy8gRUNWYWx1ZSBjdG9yIC0gU3RhcnQgb3V0IHdpdGggRW5kT2ZMaXN0IHBvaW50aW5nIHRvIHRoaXMgbm9kZSwgTmV4dCBpcworICAgIC8vIE51bGwsIGlzTGVhZGVyID0gdHJ1ZS4KKyAgICBFQ1ZhbHVlKGNvbnN0IEVsZW1UeSAmRWx0KQorICAgICAgOiBMZWFkZXIodGhpcyksIE5leHQoKEVDVmFsdWUqKShpbnRwdHJfdCkxKSwgRGF0YShFbHQpIHt9CisKKyAgICBjb25zdCBFQ1ZhbHVlICpnZXRMZWFkZXIoKSBjb25zdCB7CisgICAgICBpZiAoaXNMZWFkZXIoKSkgcmV0dXJuIHRoaXM7CisgICAgICBpZiAoTGVhZGVyLT5pc0xlYWRlcigpKSByZXR1cm4gTGVhZGVyOworICAgICAgLy8gUGF0aCBjb21wcmVzc2lvbi4KKyAgICAgIHJldHVybiBMZWFkZXIgPSBMZWFkZXItPmdldExlYWRlcigpOworICAgIH0KKyAgICBjb25zdCBFQ1ZhbHVlICpnZXRFbmRPZkxpc3QoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNMZWFkZXIoKSAmJiAiQ2Fubm90IGdldCB0aGUgZW5kIG9mIGEgbGlzdCBmb3IgYSBub24tbGVhZGVyISIpOworICAgICAgcmV0dXJuIExlYWRlcjsKKyAgICB9CisKKyAgICB2b2lkIHNldE5leHQoY29uc3QgRUNWYWx1ZSAqTmV3TmV4dCkgY29uc3QgeworICAgICAgYXNzZXJ0KGdldE5leHQoKSA9PSAwICYmICJBbHJlYWR5IGhhcyBhIG5leHQgcG9pbnRlciEiKTsKKyAgICAgIE5leHQgPSAoY29uc3QgRUNWYWx1ZSopKChpbnRwdHJfdClOZXdOZXh0IHwgKGludHB0cl90KWlzTGVhZGVyKCkpOworICAgIH0KKyAgcHVibGljOgorICAgIEVDVmFsdWUoY29uc3QgRUNWYWx1ZSAmUkhTKSA6IExlYWRlcih0aGlzKSwgTmV4dCgoRUNWYWx1ZSopKGludHB0cl90KTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEoUkhTLkRhdGEpIHsKKyAgICAgIC8vIE9ubHkgc3VwcG9ydCBjb3B5aW5nIG9mIHNpbmdsZXRvbiBub2Rlcy4KKyAgICAgIGFzc2VydChSSFMuaXNMZWFkZXIoKSAmJiBSSFMuZ2V0TmV4dCgpID09IDAgJiYgIk5vdCBhIHNpbmdsZXRvbiEiKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBFQ1ZhbHVlICZVRk4pIGNvbnN0IHsgcmV0dXJuIERhdGEgPCBVRk4uRGF0YTsgfQorCisgICAgYm9vbCBpc0xlYWRlcigpIGNvbnN0IHsgcmV0dXJuIChpbnRwdHJfdClOZXh0ICYgMTsgfQorICAgIGNvbnN0IEVsZW1UeSAmZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKworICAgIGNvbnN0IEVDVmFsdWUgKmdldE5leHQoKSBjb25zdCB7CisgICAgICByZXR1cm4gKEVDVmFsdWUqKSgoaW50cHRyX3QpTmV4dCAmIH4oaW50cHRyX3QpMSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBUICZWYWwpIGNvbnN0IHsgcmV0dXJuIERhdGEgPCBWYWw7IH0KKyAgfTsKKworICAvLy8gVGhlTWFwcGluZyAtIFRoaXMgaW1wbGljaXRseSBwcm92aWRlcyBhIG1hcHBpbmcgZnJvbSBFbGVtVHkgdmFsdWVzIHRvIHRoZQorICAvLy8gRUNWYWx1ZXMsIGl0IGp1c3Qga2VlcHMgdGhlIGtleSBhcyBwYXJ0IG9mIHRoZSB2YWx1ZS4KKyAgc3RkOjpzZXQ8RUNWYWx1ZT4gVGhlTWFwcGluZzsKKworcHVibGljOgorICBFcXVpdmFsZW5jZUNsYXNzZXMoKSB7fQorICBFcXVpdmFsZW5jZUNsYXNzZXMoY29uc3QgRXF1aXZhbGVuY2VDbGFzc2VzICZSSFMpIHsKKyAgICBvcGVyYXRvcj0oUkhTKTsKKyAgfQorCisgIGNvbnN0IEVxdWl2YWxlbmNlQ2xhc3NlcyAmb3BlcmF0b3I9KGNvbnN0IEVxdWl2YWxlbmNlQ2xhc3NlcyAmUkhTKSB7CisgICAgVGhlTWFwcGluZy5jbGVhcigpOworICAgIGZvciAoaXRlcmF0b3IgSSA9IFJIUy5iZWdpbigpLCBFID0gUkhTLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmIChJLT5pc0xlYWRlcigpKSB7CisgICAgICAgIG1lbWJlcl9pdGVyYXRvciBNSSA9IFJIUy5tZW1iZXJfYmVnaW4oSSk7CisgICAgICAgIG1lbWJlcl9pdGVyYXRvciBMZWFkZXJJdCA9IG1lbWJlcl9iZWdpbihpbnNlcnQoKk1JKSk7CisgICAgICAgIGZvciAoKytNSTsgTUkgIT0gbWVtYmVyX2VuZCgpOyArK01JKQorICAgICAgICAgIHVuaW9uU2V0cyhMZWFkZXJJdCwgbWVtYmVyX2JlZ2luKGluc2VydCgqTUkpKSk7CisgICAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEluc3BlY3Rpb24gbWV0aG9kcworICAvLworCisgIC8vLyBpdGVyYXRvciogLSBQcm92aWRlcyBhIHdheSB0byBpdGVyYXRlIG92ZXIgYWxsIHZhbHVlcyBpbiB0aGUgc2V0LgorICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6c2V0PEVDVmFsdWU+Ojpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBUaGVNYXBwaW5nLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gVGhlTWFwcGluZy5lbmQoKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBUaGVNYXBwaW5nLmVtcHR5KCk7IH0KKworICAvLy8gbWVtYmVyXyogSXRlcmF0ZSBvdmVyIHRoZSBtZW1iZXJzIG9mIGFuIGVxdWl2YWxlbmNlIGNsYXNzLgorICAvLy8KKyAgY2xhc3MgbWVtYmVyX2l0ZXJhdG9yOworICBtZW1iZXJfaXRlcmF0b3IgbWVtYmVyX2JlZ2luKGl0ZXJhdG9yIEkpIGNvbnN0IHsKKyAgICAvLyBPbmx5IGxlYWRlcnMgcHJvdmlkZSBhbnl0aGluZyB0byBpdGVyYXRlIG92ZXIuCisgICAgcmV0dXJuIG1lbWJlcl9pdGVyYXRvcihJLT5pc0xlYWRlcigpID8gJipJIDogMCk7CisgIH0KKyAgbWVtYmVyX2l0ZXJhdG9yIG1lbWJlcl9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1lbWJlcl9pdGVyYXRvcigwKTsKKyAgfQorCisgIC8vLyBmaW5kVmFsdWUgLSBSZXR1cm4gYW4gaXRlcmF0b3IgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmIGl0IGRvZXMgbm90CisgIC8vLyBleGlzdCwgZW5kKCkgaXMgcmV0dXJuZWQuCisgIGl0ZXJhdG9yIGZpbmRWYWx1ZShjb25zdCBFbGVtVHkgJlYpIGNvbnN0IHsKKyAgICByZXR1cm4gVGhlTWFwcGluZy5maW5kKFYpOworICB9CisKKyAgLy8vIGdldExlYWRlclZhbHVlIC0gUmV0dXJuIHRoZSBsZWFkZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgdGhhdCBpcyBpbiB0aGUKKyAgLy8vIHNldC4gIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBtZXRob2QgZm9yIGEgdmFsdWUgdGhhdCBpcyBub3QgeWV0IGluCisgIC8vLyB0aGUgc2V0LiAgRm9yIHRoYXQsIGNhbGwgZ2V0T3JJbnNlcnRMZWFkZXJWYWx1ZShWKS4KKyAgY29uc3QgRWxlbVR5ICZnZXRMZWFkZXJWYWx1ZShjb25zdCBFbGVtVHkgJlYpIGNvbnN0IHsKKyAgICBtZW1iZXJfaXRlcmF0b3IgTUkgPSBmaW5kTGVhZGVyKFYpOworICAgIGFzc2VydChNSSAhPSBtZW1iZXJfZW5kKCkgJiYgIlZhbHVlIGlzIG5vdCBpbiB0aGUgc2V0ISIpOworICAgIHJldHVybiAqTUk7CisgIH0KKworICAvLy8gZ2V0T3JJbnNlcnRMZWFkZXJWYWx1ZSAtIFJldHVybiB0aGUgbGVhZGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIHRoYXQgaXMKKyAgLy8vIGluIHRoZSBzZXQuICBJZiB0aGUgbWVtYmVyIGlzIG5vdCBpbiB0aGUgc2V0LCBpdCBpcyBpbnNlcnRlZCwgdGhlbgorICAvLy8gcmV0dXJuZWQuCisgIGNvbnN0IEVsZW1UeSAmZ2V0T3JJbnNlcnRMZWFkZXJWYWx1ZShjb25zdCBFbGVtVHkgJlYpIHsKKyAgICBtZW1iZXJfaXRlcmF0b3IgTUkgPSBmaW5kTGVhZGVyKGluc2VydChWKSk7CisgICAgYXNzZXJ0KE1JICE9IG1lbWJlcl9lbmQoKSAmJiAiVmFsdWUgaXMgbm90IGluIHRoZSBzZXQhIik7CisgICAgcmV0dXJuICpNSTsKKyAgfQorCisgIC8vLyBnZXROdW1DbGFzc2VzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgZXF1aXZhbGVuY2UgY2xhc3NlcyBpbiB0aGlzIHNldC4KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGEgbGluZWFyIHRpbWUgb3BlcmF0aW9uLgorICB1bnNpZ25lZCBnZXROdW1DbGFzc2VzKCkgY29uc3QgeworICAgIHVuc2lnbmVkIE5DID0gMDsKKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKEktPmlzTGVhZGVyKCkpICsrTkM7CisgICAgcmV0dXJuIE5DOworICB9CisKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTXV0YXRpb24gbWV0aG9kcworCisgIC8vLyBpbnNlcnQgLSBJbnNlcnQgYSBuZXcgdmFsdWUgaW50byB0aGUgdW5pb24vZmluZCBzZXQsIGlnbm9yaW5nIHRoZSByZXF1ZXN0CisgIC8vLyBpZiB0aGUgdmFsdWUgYWxyZWFkeSBleGlzdHMuCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCBFbGVtVHkgJkRhdGEpIHsKKyAgICByZXR1cm4gVGhlTWFwcGluZy5pbnNlcnQoRUNWYWx1ZShEYXRhKSkuZmlyc3Q7CisgIH0KKworICAvLy8gZmluZExlYWRlciAtIEdpdmVuIGEgdmFsdWUgaW4gdGhlIHNldCwgcmV0dXJuIGEgbWVtYmVyIGl0ZXJhdG9yIGZvciB0aGUKKyAgLy8vIGVxdWl2YWxlbmNlIGNsYXNzIGl0IGlzIGluLiAgVGhpcyBkb2VzIHRoZSBwYXRoLWNvbXByZXNzaW9uIHBhcnQgdGhhdAorICAvLy8gbWFrZXMgdW5pb24tZmluZCAidW5pb24gZmluZHkiLiAgVGhpcyByZXR1cm5zIGFuIGVuZCBpdGVyYXRvciBpZiB0aGUgdmFsdWUKKyAgLy8vIGlzIG5vdCBpbiB0aGUgZXF1aXZhbGVuY2UgY2xhc3MuCisgIC8vLworICBtZW1iZXJfaXRlcmF0b3IgZmluZExlYWRlcihpdGVyYXRvciBJKSBjb25zdCB7CisgICAgaWYgKEkgPT0gVGhlTWFwcGluZy5lbmQoKSkgcmV0dXJuIG1lbWJlcl9lbmQoKTsKKyAgICByZXR1cm4gbWVtYmVyX2l0ZXJhdG9yKEktPmdldExlYWRlcigpKTsKKyAgfQorICBtZW1iZXJfaXRlcmF0b3IgZmluZExlYWRlcihjb25zdCBFbGVtVHkgJlYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZExlYWRlcihUaGVNYXBwaW5nLmZpbmQoVikpOworICB9CisKKworICAvLy8gdW5pb24gLSBNZXJnZSB0aGUgdHdvIGVxdWl2YWxlbmNlIHNldHMgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWVzLCBpbnNlcnRpbmcKKyAgLy8vIHRoZW0gaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgZXF1aXZhbGVuY2Ugc2V0LgorICBtZW1iZXJfaXRlcmF0b3IgdW5pb25TZXRzKGNvbnN0IEVsZW1UeSAmVjEsIGNvbnN0IEVsZW1UeSAmVjIpIHsKKyAgICBpdGVyYXRvciBWMUkgPSBpbnNlcnQoVjEpLCBWMkkgPSBpbnNlcnQoVjIpOworICAgIHJldHVybiB1bmlvblNldHMoZmluZExlYWRlcihWMUkpLCBmaW5kTGVhZGVyKFYySSkpOworICB9CisgIG1lbWJlcl9pdGVyYXRvciB1bmlvblNldHMobWVtYmVyX2l0ZXJhdG9yIEwxLCBtZW1iZXJfaXRlcmF0b3IgTDIpIHsKKyAgICBhc3NlcnQoTDEgIT0gbWVtYmVyX2VuZCgpICYmIEwyICE9IG1lbWJlcl9lbmQoKSAmJiAiSWxsZWdhbCBpbnB1dHMhIik7CisgICAgaWYgKEwxID09IEwyKSByZXR1cm4gTDE7ICAgLy8gVW5pZnlpbmcgdGhlIHNhbWUgdHdvIHNldHMsIG5vb3AuCisKKyAgICAvLyBPdGhlcndpc2UsIHRoaXMgaXMgYSByZWFsIHVuaW9uIG9wZXJhdGlvbi4gIFNldCB0aGUgZW5kIG9mIHRoZSBMMSBsaXN0IHRvCisgICAgLy8gcG9pbnQgdG8gdGhlIEwyIGxlYWRlciBub2RlLgorICAgIGNvbnN0IEVDVmFsdWUgJkwxTFYgPSAqTDEuTm9kZSwgJkwyTFYgPSAqTDIuTm9kZTsKKyAgICBMMUxWLmdldEVuZE9mTGlzdCgpLT5zZXROZXh0KCZMMkxWKTsKKworICAgIC8vIFVwZGF0ZSBMMUxWJ3MgZW5kIG9mIGxpc3QgcG9pbnRlci4KKyAgICBMMUxWLkxlYWRlciA9IEwyTFYuZ2V0RW5kT2ZMaXN0KCk7CisKKyAgICAvLyBDbGVhciBMMidzIGxlYWRlciBmbGFnOgorICAgIEwyTFYuTmV4dCA9IEwyTFYuZ2V0TmV4dCgpOworCisgICAgLy8gTDIncyBsZWFkZXIgaXMgbm93IEwxLgorICAgIEwyTFYuTGVhZGVyID0gJkwxTFY7CisgICAgcmV0dXJuIEwxOworICB9CisKKyAgY2xhc3MgbWVtYmVyX2l0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWxlbVR5LCBwdHJkaWZmX3Q+IHsKKyAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWxlbVR5LCBwdHJkaWZmX3Q+IHN1cGVyOworICAgIGNvbnN0IEVDVmFsdWUgKk5vZGU7CisgICAgZnJpZW5kIGNsYXNzIEVxdWl2YWxlbmNlQ2xhc3NlczsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN1cGVyOjpwb2ludGVyIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcjo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICAgIGV4cGxpY2l0IG1lbWJlcl9pdGVyYXRvcigpIHt9CisgICAgZXhwbGljaXQgbWVtYmVyX2l0ZXJhdG9yKGNvbnN0IEVDVmFsdWUgKk4pIDogTm9kZShOKSB7fQorICAgIG1lbWJlcl9pdGVyYXRvcihjb25zdCBtZW1iZXJfaXRlcmF0b3IgJkkpIDogTm9kZShJLk5vZGUpIHt9CisKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgYXNzZXJ0KE5vZGUgIT0gMCAmJiAiRGVyZWZlcmVuY2luZyBlbmQoKSEiKTsKKyAgICAgIHJldHVybiBOb2RlLT5nZXREYXRhKCk7CisgICAgfQorICAgIHJlZmVyZW5jZSBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKworICAgIG1lbWJlcl9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIGFzc2VydChOb2RlICE9IDAgJiYgIisrJ2Qgb2ZmIHRoZSBlbmQgb2YgdGhlIGxpc3QhIik7CisgICAgICBOb2RlID0gTm9kZS0+Z2V0TmV4dCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG1lbWJlcl9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAvLyBwb3N0aW5jcmVtZW50IG9wZXJhdG9ycy4KKyAgICAgIG1lbWJlcl9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICAgICsrKnRoaXM7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBtZW1iZXJfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIE5vZGUgPT0gUkhTLk5vZGU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBtZW1iZXJfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIE5vZGUgIT0gUkhTLk5vZGU7CisgICAgfQorICB9OworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0ZvbGRpbmdTZXQuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvRm9sZGluZ1NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMDgwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0ZvbGRpbmdTZXQuaApAQCAtMCwwICsxLDU3NSBAQAorLy89PT0tLSBsbHZtL0FEVC9Gb2xkaW5nU2V0LmggLSBVbmlxdWluZyBIYXNoIFNldCAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGhhc2ggc2V0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uIG9mIG5vZGVzCisvLyBpbiBhIGdyYXBoLiAgVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IGNyZWF0ZWQgYnkgQ2hyaXMgTGF0dG5lciBmb3IgdXNlIHdpdGgKKy8vIFNlbGVjdGlvbkRBR0NTRU1hcCwgYnV0IHdhcyBpc29sYXRlZCB0byBwcm92aWRlIHVzZSBhY3Jvc3MgdGhlIGxsdm0gY29kZSBzZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9GT0xESU5HU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfRk9MRElOR1NFVF9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEFQRmxvYXQ7CisgIGNsYXNzIEFQSW50OworICBjbGFzcyBCdW1wUHRyQWxsb2NhdG9yOworCisvLy8gVGhpcyBmb2xkaW5nIHNldCB1c2VkIGZvciB0d28gcHVycG9zZXM6CisvLy8gICAxLiBHaXZlbiBpbmZvcm1hdGlvbiBhYm91dCBhIG5vZGUgd2Ugd2FudCB0byBjcmVhdGUsIGxvb2sgdXAgdGhlIHVuaXF1ZQorLy8vICAgICAgaW5zdGFuY2Ugb2YgdGhlIG5vZGUgaW4gdGhlIHNldC4gIElmIHRoZSBub2RlIGFscmVhZHkgZXhpc3RzLCByZXR1cm4KKy8vLyAgICAgIGl0LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBidWNrZXQgaXQgc2hvdWxkIGJlIGluc2VydGVkIGludG8uCisvLy8gICAyLiBHaXZlbiBhIG5vZGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIHJlbW92ZSBpdCBmcm9tIHRoZSBzZXQuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIGltcGxlbWVudGVkIGFzIGEgc2luZ2xlLWxpbmsgY2hhaW5lZCBoYXNoIHRhYmxlLCB3aGVyZSB0aGUKKy8vLyAiYnVja2V0cyIgYXJlIGFjdHVhbGx5IHRoZSBub2RlcyB0aGVtc2VsdmVzICh0aGUgbmV4dCBwb2ludGVyIGlzIGluIHRoZQorLy8vIG5vZGUpLiAgVGhlIGxhc3Qgbm9kZSBwb2ludHMgYmFjayB0byB0aGUgYnVja2V0IHRvIHNpbXBsaWZ5IG5vZGUgcmVtb3ZhbC4KKy8vLworLy8vIEFueSBub2RlIHRoYXQgaXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZvbGRpbmcgc2V0IG11c3QgYmUgYSBzdWJjbGFzcyBvZgorLy8vIEZvbGRpbmdTZXROb2RlLiAgVGhlIG5vZGUgY2xhc3MgbXVzdCBhbHNvIGRlZmluZSBhIFByb2ZpbGUgbWV0aG9kIHVzZWQgdG8KKy8vLyBlc3RhYmxpc2ggdGhlIHVuaXF1ZSBiaXRzIG9mIGRhdGEgZm9yIHRoZSBub2RlLiAgVGhlIFByb2ZpbGUgbWV0aG9kIGlzCisvLy8gcGFzc2VkIGEgRm9sZGluZ1NldE5vZGVJRCBvYmplY3Qgd2hpY2ggaXMgdXNlZCB0byBnYXRoZXIgdGhlIGJpdHMuICBKdXN0CisvLy8gY2FsbCBvbmUgb2YgdGhlIEFkZCogZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIEZvbGRpbmdTZXRJbXBsOjpOb2RlSUQgY2xhc3MuCisvLy8gTk9URTogVGhhdCB0aGUgZm9sZGluZyBzZXQgZG9lcyBub3Qgb3duIHRoZSBub2RlcyBhbmQgaXQgaXMgdGhlCisvLy8gcmVzcG9uc2liaWxpdHkgb2YgdGhlIHVzZXIgdG8gZGlzcG9zZSBvZiB0aGUgbm9kZXMuCisvLy8KKy8vLyBFZy4KKy8vLyAgICBjbGFzcyBNeU5vZGUgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworLy8vICAgIHByaXZhdGU6CisvLy8gICAgICBzdGQ6OnN0cmluZyBOYW1lOworLy8vICAgICAgdW5zaWduZWQgVmFsdWU7CisvLy8gICAgcHVibGljOgorLy8vICAgICAgTXlOb2RlKGNvbnN0IGNoYXIgKk4sIHVuc2lnbmVkIFYpIDogTmFtZShOKSwgVmFsdWUoVikge30KKy8vLyAgICAgICAuLi4KKy8vLyAgICAgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeworLy8vICAgICAgICBJRC5BZGRTdHJpbmcoTmFtZSk7CisvLy8gICAgICAgIElELkFkZEludGVnZXIoVmFsdWUpOworLy8vICAgICAgIH0KKy8vLyAgICAgICAuLi4KKy8vLyAgICAgfTsKKy8vLworLy8vIFRvIGRlZmluZSB0aGUgZm9sZGluZyBzZXQgaXRzZWxmIHVzZSB0aGUgRm9sZGluZ1NldCB0ZW1wbGF0ZTsKKy8vLworLy8vIEVnLgorLy8vICAgIEZvbGRpbmdTZXQ8TXlOb2RlPiBNeUZvbGRpbmdTZXQ7CisvLy8KKy8vLyBGb3VyIHB1YmxpYyBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUgZm9sZGluZyBzZXQ7CisvLy8KKy8vLyAxKSBJZiB5b3UgaGF2ZSBhbiBleGlzdGluZyBub2RlIHRoYXQgeW91IHdhbnQgYWRkIHRvIHRoZSBzZXQgYnV0IHVuc3VyZQorLy8vIHRoYXQgdGhlIG5vZGUgbWlnaHQgYWxyZWFkeSBleGlzdCB0aGVuIGNhbGw7CisvLy8KKy8vLyAgICBNeU5vZGUgKk0gPSBNeUZvbGRpbmdTZXQuR2V0T3JJbnNlcnROb2RlKE4pOworLy8vCisvLy8gSWYgVGhlIHJlc3VsdCBpcyBlcXVhbCB0byB0aGUgaW5wdXQgdGhlbiB0aGUgbm9kZSBoYXMgYmVlbiBpbnNlcnRlZC4KKy8vLyBPdGhlcndpc2UsIHRoZSByZXN1bHQgaXMgdGhlIG5vZGUgZXhpc3RpbmcgaW4gdGhlIGZvbGRpbmcgc2V0LCBhbmQgdGhlCisvLy8gaW5wdXQgY2FuIGJlIGRpc2NhcmRlZCAodXNlIHRoZSByZXN1bHQgaW5zdGVhZC4pCisvLy8KKy8vLyAyKSBJZiB5b3UgYXJlIHJlYWR5IHRvIGNvbnN0cnVjdCBhIG5vZGUgYnV0IHdhbnQgdG8gY2hlY2sgaWYgaXQgYWxyZWFkeQorLy8vIGV4aXN0cywgdGhlbiBjYWxsIEZpbmROb2RlT3JJbnNlcnRQb3Mgd2l0aCBhIEZvbGRpbmdTZXROb2RlSUQgb2YgdGhlIGJpdHMgdG8KKy8vLyBjaGVjazsKKy8vLworLy8vICAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKy8vLyAgIElELkFkZFN0cmluZyhOYW1lKTsKKy8vLyAgIElELkFkZEludGVnZXIoVmFsdWUpOworLy8vICAgdm9pZCAqSW5zZXJ0UG9pbnQ7CisvLy8KKy8vLyAgICBNeU5vZGUgKk0gPSBNeUZvbGRpbmdTZXQuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9pbnQpOworLy8vCisvLy8gSWYgZm91bmQgdGhlbiBNIHdpdGggYmUgbm9uLU5VTEwsIGVsc2UgSW5zZXJ0UG9pbnQgd2lsbCBwb2ludCB0byB3aGVyZSBpdAorLy8vIHNob3VsZCBiZSBpbnNlcnRlZCB1c2luZyBJbnNlcnROb2RlLgorLy8vCisvLy8gMykgSWYgeW91IGdldCBhIE5VTEwgcmVzdWx0IGZyb20gRmluZE5vZGVPckluc2VydFBvcyB0aGVuIHlvdSBjYW4gYXMgYSBuZXcKKy8vLyBub2RlIHdpdGggRmluZE5vZGVPckluc2VydFBvczsKKy8vLworLy8vICAgIEluc2VydE5vZGUoTiwgSW5zZXJ0UG9pbnQpOworLy8vCisvLy8gNCkgRmluYWxseSwgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBmb2xkaW5nIHNldCBjYWxsOworLy8vCisvLy8gICAgYm9vbCBXYXNSZW1vdmVkID0gUmVtb3ZlTm9kZShOKTsKKy8vLworLy8vIFRoZSByZXN1bHQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vZGUgZXhpc3RlZCBpbiB0aGUgZm9sZGluZyBzZXQuCisKK2NsYXNzIEZvbGRpbmdTZXROb2RlSUQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRm9sZGluZ1NldEltcGwgLSBJbXBsZW1lbnRzIHRoZSBmb2xkaW5nIHNldCBmdW5jdGlvbmFsaXR5LiAgVGhlIG1haW4KKy8vLyBzdHJ1Y3R1cmUgaXMgYW4gYXJyYXkgb2YgYnVja2V0cy4gIEVhY2ggYnVja2V0IGlzIGluZGV4ZWQgYnkgdGhlIGhhc2ggb2YKKy8vLyB0aGUgbm9kZXMgaXQgY29udGFpbnMuICBUaGUgYnVja2V0IGl0c2VsZiBwb2ludHMgdG8gdGhlIG5vZGVzIGNvbnRhaW5lZAorLy8vIGluIHRoZSBidWNrZXQgdmlhIGEgc2luZ2x5IGxpbmtlZCBsaXN0LiAgVGhlIGxhc3Qgbm9kZSBpbiB0aGUgbGlzdCBwb2ludHMKKy8vLyBiYWNrIHRvIHRoZSBidWNrZXQgdG8gZmFjaWxpdGF0ZSBub2RlIHJlbW92YWwuCisvLy8KK2NsYXNzIEZvbGRpbmdTZXRJbXBsIHsKK3Byb3RlY3RlZDoKKyAgLy8vIEJ1Y2tldHMgLSBBcnJheSBvZiBidWNrZXQgY2hhaW5zLgorICAvLy8KKyAgdm9pZCAqKkJ1Y2tldHM7CisKKyAgLy8vIE51bUJ1Y2tldHMgLSBMZW5ndGggb2YgdGhlIEJ1Y2tldHMgYXJyYXkuICBBbHdheXMgYSBwb3dlciBvZiAyLgorICAvLy8KKyAgdW5zaWduZWQgTnVtQnVja2V0czsKKworICAvLy8gTnVtTm9kZXMgLSBOdW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGZvbGRpbmcgc2V0LiBHcm93dGggb2NjdXJzIHdoZW4gTnVtTm9kZXMKKyAgLy8vIGlzIGdyZWF0ZXIgdGhhbiB0d2ljZSB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMuCisgIHVuc2lnbmVkIE51bU5vZGVzOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEZvbGRpbmdTZXRJbXBsKHVuc2lnbmVkIExvZzJJbml0U2l6ZSA9IDYpOworICB2aXJ0dWFsIH5Gb2xkaW5nU2V0SW1wbCgpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gTm9kZSAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtYWludGFpbiB0aGUgc2luZ2x5IGxpbmtlZCBidWNrZXQgbGlzdCBpbgorICAvLy8gYSBmb2xkaW5nIHNldC4KKyAgLy8vCisgIGNsYXNzIE5vZGUgeworICBwcml2YXRlOgorICAgIC8vIE5leHRJbkZvbGRpbmdTZXRCdWNrZXQgLSBuZXh0IGxpbmsgaW4gdGhlIGJ1Y2tldCBsaXN0LgorICAgIHZvaWQgKk5leHRJbkZvbGRpbmdTZXRCdWNrZXQ7CisKKyAgcHVibGljOgorCisgICAgTm9kZSgpIDogTmV4dEluRm9sZGluZ1NldEJ1Y2tldCgwKSB7fQorCisgICAgLy8gQWNjZXNzb3JzCisgICAgdm9pZCAqZ2V0TmV4dEluQnVja2V0KCkgY29uc3QgeyByZXR1cm4gTmV4dEluRm9sZGluZ1NldEJ1Y2tldDsgfQorICAgIHZvaWQgU2V0TmV4dEluQnVja2V0KHZvaWQgKk4pIHsgTmV4dEluRm9sZGluZ1NldEJ1Y2tldCA9IE47IH0KKyAgfTsKKworICAvLy8gY2xlYXIgLSBSZW1vdmUgYWxsIG5vZGVzIGZyb20gdGhlIGZvbGRpbmcgc2V0LgorICB2b2lkIGNsZWFyKCk7CisKKyAgLy8vIFJlbW92ZU5vZGUgLSBSZW1vdmUgYSBub2RlIGZyb20gdGhlIGZvbGRpbmcgc2V0LCByZXR1cm5pbmcgdHJ1ZSBpZiBvbmUKKyAgLy8vIHdhcyByZW1vdmVkIG9yIGZhbHNlIGlmIHRoZSBub2RlIHdhcyBub3QgaW4gdGhlIGZvbGRpbmcgc2V0LgorICBib29sIFJlbW92ZU5vZGUoTm9kZSAqTik7CisKKyAgLy8vIEdldE9ySW5zZXJ0Tm9kZSAtIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHNpbXBsZSBOb2RlIGV4YWN0bHkKKyAgLy8vIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgbm9kZSwgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCBpbnNlcnQgJ04nIGFuZCByZXR1cm4KKyAgLy8vIGl0IGluc3RlYWQuCisgIE5vZGUgKkdldE9ySW5zZXJ0Tm9kZShOb2RlICpOKTsKKworICAvLy8gRmluZE5vZGVPckluc2VydFBvcyAtIExvb2sgdXAgdGhlIG5vZGUgc3BlY2lmaWVkIGJ5IElELiAgSWYgaXQgZXhpc3RzLAorICAvLy8gcmV0dXJuIGl0LiAgSWYgbm90LCByZXR1cm4gdGhlIGluc2VydGlvbiB0b2tlbiB0aGF0IHdpbGwgbWFrZSBpbnNlcnRpb24KKyAgLy8vIGZhc3Rlci4KKyAgTm9kZSAqRmluZE5vZGVPckluc2VydFBvcyhjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdm9pZCAqJkluc2VydFBvcyk7CisKKyAgLy8vIEluc2VydE5vZGUgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBub2RlIGludG8gdGhlIGZvbGRpbmcgc2V0LCBrbm93aW5nIHRoYXQKKyAgLy8vIGl0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBmb2xkaW5nIHNldC4gIEluc2VydFBvcyBtdXN0IGJlIG9idGFpbmVkIGZyb20KKyAgLy8vIEZpbmROb2RlT3JJbnNlcnRQb3MuCisgIHZvaWQgSW5zZXJ0Tm9kZShOb2RlICpOLCB2b2lkICpJbnNlcnRQb3MpOworCisgIC8vLyBJbnNlcnROb2RlIC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbm9kZSBpbnRvIHRoZSBmb2xkaW5nIHNldCwga25vd2luZyB0aGF0CisgIC8vLyBpdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZm9sZGluZyBzZXQuCisgIHZvaWQgSW5zZXJ0Tm9kZShOb2RlICpOKSB7CisgICAgTm9kZSAqSW5zZXJ0ZWQgPSBHZXRPckluc2VydE5vZGUoTik7CisgICAgKHZvaWQpSW5zZXJ0ZWQ7CisgICAgYXNzZXJ0KEluc2VydGVkID09IE4gJiYgIk5vZGUgYWxyZWFkeSBpbnNlcnRlZCEiKTsKKyAgfQorCisgIC8vLyBzaXplIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBmb2xkaW5nIHNldC4KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bU5vZGVzOyB9CisKKyAgLy8vIGVtcHR5IC0gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBub2RlcyBpbiB0aGUgZm9sZGluZyBzZXQuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1Ob2RlcyA9PSAwOyB9CisKK3ByaXZhdGU6CisKKyAgLy8vIEdyb3dIYXNoVGFibGUgLSBEb3VibGUgdGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgYW5kIHJlaGFzaCBldmVyeXRoaW5nLgorICAvLy8KKyAgdm9pZCBHcm93SGFzaFRhYmxlKCk7CisKK3Byb3RlY3RlZDoKKworICAvLy8gR2V0Tm9kZVByb2ZpbGUgLSBJbnN0YW50aWF0aW9ucyBvZiB0aGUgRm9sZGluZ1NldCB0ZW1wbGF0ZSBpbXBsZW1lbnQKKyAgLy8vIHRoaXMgZnVuY3Rpb24gdG8gZ2F0aGVyIGRhdGEgYml0cyBmb3IgdGhlIGdpdmVuIG5vZGUuCisgIHZpcnR1YWwgdm9pZCBHZXROb2RlUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwgTm9kZSAqTikgY29uc3QgPSAwOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0VHJhaXQgLSBUaGlzIHRyYWl0IGNsYXNzIGlzIHVzZWQgdG8gZGVmaW5lIGJlaGF2aW9yIG9mIGhvdworLy8vICB0byAicHJvZmlsZSIgKGluIHRoZSBGb2xkaW5nU2V0IHBhcmxhbmNlKSBhbiBvYmplY3Qgb2YgYSBnaXZlbiB0eXBlLgorLy8vICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBpbnZva2UgYSAnUHJvZmlsZScgbWV0aG9kIG9uIGFuIG9iamVjdCwgYnV0CisvLy8gIHRocm91Z2ggdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGhlIGJlaGF2aW9yIGNhbiBiZSB0YWlsb3JlZCBmb3Igc3BlY2lmaWMKKy8vLyAgdHlwZXMuICBDb21iaW5lZCB3aXRoIHRoZSBGb2xkaW5nU2V0Tm9kZVdyYXBwZXIgY2xhc3MsIG9uZSBjYW4gYWRkIG9iamVjdHMKKy8vLyAgdG8gRm9sZGluZ1NldHMgdGhhdCB3ZXJlIG5vdCBvcmlnaW5hbGx5IGRlc2lnbmVkIHRvIGhhdmUgdGhhdCBiZWhhdmlvci4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEZvbGRpbmdTZXRUcmFpdCB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKGNvbnN0IFQmIFgsIEZvbGRpbmdTZXROb2RlSUQmIElEKSB7IFguUHJvZmlsZShJRCk7fQorICBzdGF0aWMgaW5saW5lIHZvaWQgUHJvZmlsZShUJiBYLCBGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgeyBYLlByb2ZpbGUoSUQpOyB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDdHg+CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKFQgJlgsIEZvbGRpbmdTZXROb2RlSUQgJklELCBDdHggQ29udGV4dCkgeworICAgIFguUHJvZmlsZShJRCwgQ29udGV4dCk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZvbGRpbmdTZXROb2RlSURSZWYgLSBUaGlzIGNsYXNzIGRlc2NyaWJlcyBhIHJlZmVyZW5jZSB0byBhbiBpbnRlcm5lZAorLy8vIEZvbGRpbmdTZXROb2RlSUQsIHdoaWNoIGNhbiBiZSBhIHVzZWZ1bCB0byBzdG9yZSBub2RlIGlkIGRhdGEgcmF0aGVyCisvLy8gdGhhbiB1c2luZyBwbGFpbiBGb2xkaW5nU2V0Tm9kZUlEcywgc2luY2UgdGhlIDMyLWVsZW1lbnQgU21hbGxWZWN0b3IKKy8vLyBpcyBvZnRlbiBtdWNoIGxhcmdlciB0aGFuIG5lY2Vzc2FyeSwgYW5kIHRoZSBwb3NzaWJpbGl0eSBvZiBoZWFwCisvLy8gYWxsb2NhdGlvbiBtZWFucyBpdCByZXF1aXJlcyBhIG5vbi10cml2aWFsIGRlc3RydWN0b3IgY2FsbC4KK2NsYXNzIEZvbGRpbmdTZXROb2RlSURSZWYgeworICB1bnNpZ25lZCogRGF0YTsKKyAgc2l6ZV90IFNpemU7CitwdWJsaWM6CisgIEZvbGRpbmdTZXROb2RlSURSZWYoKSA6IERhdGEoMCksIFNpemUoMCkge30KKyAgRm9sZGluZ1NldE5vZGVJRFJlZih1bnNpZ25lZCAqRCwgc2l6ZV90IFMpIDogRGF0YShEKSwgU2l6ZShTKSB7fQorCisgIHVuc2lnbmVkICpnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZvbGRpbmdTZXROb2RlSUQgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZ2F0aGVyIGFsbCB0aGUgdW5pcXVlIGRhdGEgYml0cyBvZgorLy8vIGEgbm9kZS4gIFdoZW4gYWxsIHRoZSBiaXRzIGFyZSBnYXRoZXJlZCB0aGlzIGNsYXNzIGlzIHVzZWQgdG8gcHJvZHVjZSBhCisvLy8gaGFzaCB2YWx1ZSBmb3IgdGhlIG5vZGUuCisvLy8KK2NsYXNzIEZvbGRpbmdTZXROb2RlSUQgeworICAvLy8gQml0cyAtIFZlY3RvciBvZiBhbGwgdGhlIGRhdGEgYml0cyB0aGF0IG1ha2UgdGhlIG5vZGUgdW5pcXVlLgorICAvLy8gVXNlIGEgU21hbGxWZWN0b3IgdG8gYXZvaWQgYSBoZWFwIGFsbG9jYXRpb24gaW4gdGhlIGNvbW1vbiBjYXNlLgorICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMzI+IEJpdHM7CisKK3B1YmxpYzoKKyAgRm9sZGluZ1NldE5vZGVJRCgpIHt9CisKKyAgRm9sZGluZ1NldE5vZGVJRChGb2xkaW5nU2V0Tm9kZUlEUmVmIFJlZikKKyAgICA6IEJpdHMoUmVmLmdldERhdGEoKSwgUmVmLmdldERhdGEoKSArIFJlZi5nZXRTaXplKCkpIHt9CisKKyAgLy8vIEFkZCogLSBBZGQgdmFyaW91cyBkYXRhIHR5cGVzIHRvIEJpdCBkYXRhLgorICAvLy8KKyAgdm9pZCBBZGRQb2ludGVyKGNvbnN0IHZvaWQgKlB0cik7CisgIHZvaWQgQWRkSW50ZWdlcihzaWduZWQgSSk7CisgIHZvaWQgQWRkSW50ZWdlcih1bnNpZ25lZCBJKTsKKyAgdm9pZCBBZGRJbnRlZ2VyKGxvbmcgSSk7CisgIHZvaWQgQWRkSW50ZWdlcih1bnNpZ25lZCBsb25nIEkpOworICB2b2lkIEFkZEludGVnZXIobG9uZyBsb25nIEkpOworICB2b2lkIEFkZEludGVnZXIodW5zaWduZWQgbG9uZyBsb25nIEkpOworICB2b2lkIEFkZEJvb2xlYW4oYm9vbCBCKSB7IEFkZEludGVnZXIoQiA/IDFVIDogMFUpOyB9CisgIHZvaWQgQWRkU3RyaW5nKFN0cmluZ1JlZiBTdHJpbmcpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZCBBZGQoY29uc3QgVCYgeCkgeyBGb2xkaW5nU2V0VHJhaXQ8VD46OlByb2ZpbGUoeCwgKnRoaXMpOyB9CisKKyAgLy8vIGNsZWFyIC0gQ2xlYXIgdGhlIGFjY3VtdWxhdGVkIHByb2ZpbGUsIGFsbG93aW5nIHRoaXMgRm9sZGluZ1NldE5vZGVJRAorICAvLy8gIG9iamVjdCB0byBiZSB1c2VkIHRvIGNvbXB1dGUgYSBuZXcgcHJvZmlsZS4KKyAgaW5saW5lIHZvaWQgY2xlYXIoKSB7IEJpdHMuY2xlYXIoKTsgfQorCisgIC8vLyBDb21wdXRlSGFzaCAtIENvbXB1dGUgYSBzdHJvbmcgaGFzaCB2YWx1ZSBmb3IgdGhpcyBGb2xkaW5nU2V0Tm9kZUlELCB1c2VkCisgIC8vLyAgdG8gbG9va3VwIHRoZSBub2RlIGluIHRoZSBGb2xkaW5nU2V0SW1wbC4KKyAgdW5zaWduZWQgQ29tcHV0ZUhhc2goKSBjb25zdDsKKworICAvLy8gb3BlcmF0b3I9PSAtIFVzZWQgdG8gY29tcGFyZSB0d28gbm9kZXMgdG8gZWFjaCBvdGhlci4KKyAgLy8vCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZSSFMpIGNvbnN0OworCisgIC8vLyBJbnRlcm4gLSBDb3B5IHRoaXMgbm9kZSdzIGRhdGEgdG8gYSBtZW1vcnkgcmVnaW9uIGFsbG9jYXRlZCBmcm9tIHRoZQorICAvLy8gZ2l2ZW4gYWxsb2NhdG9yIGFuZCByZXR1cm4gYSBGb2xkaW5nU2V0Tm9kZUlEUmVmIGRlc2NyaWJpbmcgdGhlCisgIC8vLyBpbnRlcm5lZCBkYXRhLgorICBGb2xkaW5nU2V0Tm9kZUlEUmVmIEludGVybihCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpIGNvbnN0OworfTsKKworLy8gQ29udmVuaWVuY2UgdHlwZSB0byBoaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZm9sZGluZyBzZXQuCit0eXBlZGVmIEZvbGRpbmdTZXRJbXBsOjpOb2RlIEZvbGRpbmdTZXROb2RlOwordGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9sZGluZ1NldEl0ZXJhdG9yOwordGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZvbGRpbmdTZXQgLSBUaGlzIHRlbXBsYXRlIGNsYXNzIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgYSBzcGVjaWFsaXplZAorLy8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmb2xkaW5nIHNldCB0byB0aGUgbm9kZSBjbGFzcyBULiAgVCBtdXN0IGJlIGEKKy8vLyBzdWJjbGFzcyBvZiBGb2xkaW5nU2V0Tm9kZSBhbmQgaW1wbGVtZW50IGEgUHJvZmlsZSBmdW5jdGlvbi4KKy8vLwordGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9sZGluZ1NldCA6IHB1YmxpYyBGb2xkaW5nU2V0SW1wbCB7Citwcml2YXRlOgorICAvLy8gR2V0Tm9kZVByb2ZpbGUgLSBFYWNoIGluc3RhbnRpYXRhdGlvbiBvZiB0aGUgRm9sZGluZ1NldCBuZWVkcyB0byBwcm92aWRlIGEKKyAgLy8vIHdheSB0byBjb252ZXJ0IG5vZGVzIGludG8gYSB1bmlxdWUgc3BlY2lmaWVyLgorICB2aXJ0dWFsIHZvaWQgR2V0Tm9kZVByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQsIE5vZGUgKk4pIGNvbnN0IHsKKyAgICBUICpUTiA9IHN0YXRpY19jYXN0PFQgKj4oTik7CisgICAgRm9sZGluZ1NldFRyYWl0PFQ+OjpQcm9maWxlKCpUTixJRCk7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBGb2xkaW5nU2V0KHVuc2lnbmVkIExvZzJJbml0U2l6ZSA9IDYpCisgIDogRm9sZGluZ1NldEltcGwoTG9nMkluaXRTaXplKQorICB7fQorCisgIHR5cGVkZWYgRm9sZGluZ1NldEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKEJ1Y2tldHMpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKEJ1Y2tldHMrTnVtQnVja2V0cyk7IH0KKworICB0eXBlZGVmIEZvbGRpbmdTZXRJdGVyYXRvcjxjb25zdCBUPiBjb25zdF9pdGVyYXRvcjsKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihCdWNrZXRzKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihCdWNrZXRzK051bUJ1Y2tldHMpOyB9CisKKyAgdHlwZWRlZiBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3I8VD4gYnVja2V0X2l0ZXJhdG9yOworCisgIGJ1Y2tldF9pdGVyYXRvciBidWNrZXRfYmVnaW4odW5zaWduZWQgaGFzaCkgeworICAgIHJldHVybiBidWNrZXRfaXRlcmF0b3IoQnVja2V0cyArIChoYXNoICYgKE51bUJ1Y2tldHMtMSkpKTsKKyAgfQorCisgIGJ1Y2tldF9pdGVyYXRvciBidWNrZXRfZW5kKHVuc2lnbmVkIGhhc2gpIHsKKyAgICByZXR1cm4gYnVja2V0X2l0ZXJhdG9yKEJ1Y2tldHMgKyAoaGFzaCAmIChOdW1CdWNrZXRzLTEpKSwgdHJ1ZSk7CisgIH0KKworICAvLy8gR2V0T3JJbnNlcnROb2RlIC0gSWYgdGhlcmUgaXMgYW4gZXhpc3Rpbmcgc2ltcGxlIE5vZGUgZXhhY3RseQorICAvLy8gZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBub2RlLCByZXR1cm4gaXQuICBPdGhlcndpc2UsIGluc2VydCAnTicgYW5kCisgIC8vLyByZXR1cm4gaXQgaW5zdGVhZC4KKyAgVCAqR2V0T3JJbnNlcnROb2RlKE5vZGUgKk4pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPihGb2xkaW5nU2V0SW1wbDo6R2V0T3JJbnNlcnROb2RlKE4pKTsKKyAgfQorCisgIC8vLyBGaW5kTm9kZU9ySW5zZXJ0UG9zIC0gTG9vayB1cCB0aGUgbm9kZSBzcGVjaWZpZWQgYnkgSUQuICBJZiBpdCBleGlzdHMsCisgIC8vLyByZXR1cm4gaXQuICBJZiBub3QsIHJldHVybiB0aGUgaW5zZXJ0aW9uIHRva2VuIHRoYXQgd2lsbCBtYWtlIGluc2VydGlvbgorICAvLy8gZmFzdGVyLgorICBUICpGaW5kTm9kZU9ySW5zZXJ0UG9zKGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJklELCB2b2lkIComSW5zZXJ0UG9zKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4oRm9sZGluZ1NldEltcGw6OkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvcykpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIENvbnRleHR1YWxGb2xkaW5nU2V0IC0gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBpcyBhIGZ1cnRoZXIgcmVmaW5lbWVudAorLy8vIG9mIEZvbGRpbmdTZXQgd2hpY2ggcHJvdmlkZXMgYSBjb250ZXh0IGFyZ3VtZW50IHdoZW4gY2FsbGluZworLy8vIFByb2ZpbGUgb24gaXRzIG5vZGVzLiAgQ3VycmVudGx5LCB0aGF0IGFyZ3VtZW50IGlzIGZpeGVkIGF0CisvLy8gaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vLworLy8vIFQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEZvbGRpbmdTZXROb2RlIGFuZCBpbXBsZW1lbnQgYSBQcm9maWxlCisvLy8gZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUKKy8vLyAgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICYsIEN0eCk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ3R4PgorY2xhc3MgQ29udGV4dHVhbEZvbGRpbmdTZXQgOiBwdWJsaWMgRm9sZGluZ1NldEltcGwgeworICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGNhbid0IGRlcml2ZSBmcm9tIEZvbGRpbmdTZXQ8VD4gYmVjYXVzZSB0aGUKKyAgLy8gY29uc3RydWN0aW9uIHZ0YWJsZSBmb3IgRm9sZGluZ1NldDxUPiByZXF1aXJlcworICAvLyBGb2xkaW5nU2V0PFQ+OjpHZXROb2RlUHJvZmlsZSB0byBiZSBpbnN0YW50aWF0ZWQsIHdoaWNoIGluIHR1cm4KKyAgLy8gcmVxdWlyZXMgYSBzaW5nbGUtYXJndW1lbnQgVDo6UHJvZmlsZSgpLgorCitwcml2YXRlOgorICBDdHggQ29udGV4dDsKKworICAvLy8gR2V0Tm9kZVByb2ZpbGUgLSBFYWNoIGluc3RhbnRpYXRhdGlvbiBvZiB0aGUgRm9sZGluZ1NldCBuZWVkcyB0byBwcm92aWRlIGEKKyAgLy8vIHdheSB0byBjb252ZXJ0IG5vZGVzIGludG8gYSB1bmlxdWUgc3BlY2lmaWVyLgorICB2aXJ0dWFsIHZvaWQgR2V0Tm9kZVByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xkaW5nU2V0SW1wbDo6Tm9kZSAqTikgY29uc3QgeworICAgIFQgKlROID0gc3RhdGljX2Nhc3Q8VCAqPihOKTsKKworICAgIC8vIFdlIG11c3QgdXNlIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50cyBpbiBjYXNlIEN0eCBpcyBhCisgICAgLy8gcmVmZXJlbmNlIHR5cGUuCisgICAgRm9sZGluZ1NldFRyYWl0PFQ+Ojp0ZW1wbGF0ZSBQcm9maWxlPEN0eD4oKlROLCBJRCwgQ29udGV4dCk7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBDb250ZXh0dWFsRm9sZGluZ1NldChDdHggQ29udGV4dCwgdW5zaWduZWQgTG9nMkluaXRTaXplID0gNikKKyAgOiBGb2xkaW5nU2V0SW1wbChMb2cySW5pdFNpemUpLCBDb250ZXh0KENvbnRleHQpCisgIHt9CisKKyAgQ3R4IGdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9CisKKworICB0eXBlZGVmIEZvbGRpbmdTZXRJdGVyYXRvcjxUPiBpdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcihCdWNrZXRzKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcihCdWNrZXRzK051bUJ1Y2tldHMpOyB9CisKKyAgdHlwZWRlZiBGb2xkaW5nU2V0SXRlcmF0b3I8Y29uc3QgVD4gY29uc3RfaXRlcmF0b3I7CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoQnVja2V0cyk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoQnVja2V0cytOdW1CdWNrZXRzKTsgfQorCisgIHR5cGVkZWYgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yPFQ+IGJ1Y2tldF9pdGVyYXRvcjsKKworICBidWNrZXRfaXRlcmF0b3IgYnVja2V0X2JlZ2luKHVuc2lnbmVkIGhhc2gpIHsKKyAgICByZXR1cm4gYnVja2V0X2l0ZXJhdG9yKEJ1Y2tldHMgKyAoaGFzaCAmIChOdW1CdWNrZXRzLTEpKSk7CisgIH0KKworICBidWNrZXRfaXRlcmF0b3IgYnVja2V0X2VuZCh1bnNpZ25lZCBoYXNoKSB7CisgICAgcmV0dXJuIGJ1Y2tldF9pdGVyYXRvcihCdWNrZXRzICsgKGhhc2ggJiAoTnVtQnVja2V0cy0xKSksIHRydWUpOworICB9CisKKyAgLy8vIEdldE9ySW5zZXJ0Tm9kZSAtIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHNpbXBsZSBOb2RlIGV4YWN0bHkKKyAgLy8vIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgbm9kZSwgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCBpbnNlcnQgJ04nCisgIC8vLyBhbmQgcmV0dXJuIGl0IGluc3RlYWQuCisgIFQgKkdldE9ySW5zZXJ0Tm9kZShOb2RlICpOKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4oRm9sZGluZ1NldEltcGw6OkdldE9ySW5zZXJ0Tm9kZShOKSk7CisgIH0KKworICAvLy8gRmluZE5vZGVPckluc2VydFBvcyAtIExvb2sgdXAgdGhlIG5vZGUgc3BlY2lmaWVkIGJ5IElELiAgSWYgaXQKKyAgLy8vIGV4aXN0cywgcmV0dXJuIGl0LiAgSWYgbm90LCByZXR1cm4gdGhlIGluc2VydGlvbiB0b2tlbiB0aGF0IHdpbGwKKyAgLy8vIG1ha2UgaW5zZXJ0aW9uIGZhc3Rlci4KKyAgVCAqRmluZE5vZGVPckluc2VydFBvcyhjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdm9pZCAqJkluc2VydFBvcykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KEZvbGRpbmdTZXRJbXBsOjpGaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJbnNlcnRQb3MpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsIC0gVGhpcyBpcyB0aGUgY29tbW9uIGl0ZXJhdG9yIHN1cHBvcnQgc2hhcmVkIGJ5IGFsbAorLy8vIGZvbGRpbmcgc2V0cywgd2hpY2gga25vd3MgaG93IHRvIHdhbGsgdGhlIGZvbGRpbmcgc2V0IGhhc2ggdGFibGUuCitjbGFzcyBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsIHsKK3Byb3RlY3RlZDoKKyAgRm9sZGluZ1NldE5vZGUgKk5vZGVQdHI7CisgIEZvbGRpbmdTZXRJdGVyYXRvckltcGwodm9pZCAqKkJ1Y2tldCk7CisgIHZvaWQgYWR2YW5jZSgpOworCitwdWJsaWM6CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZVB0ciA9PSBSSFMuTm9kZVB0cjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgRm9sZGluZ1NldEl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGVQdHIgIT0gUkhTLk5vZGVQdHI7CisgIH0KK307CisKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIEZvbGRpbmdTZXRJdGVyYXRvciA6IHB1YmxpYyBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRm9sZGluZ1NldEl0ZXJhdG9yKHZvaWQgKipCdWNrZXQpIDogRm9sZGluZ1NldEl0ZXJhdG9ySW1wbChCdWNrZXQpIHt9CisKKyAgVCAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8VCo+KE5vZGVQdHIpOworICB9CisKKyAgVCAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KE5vZGVQdHIpOworICB9CisKKyAgaW5saW5lIEZvbGRpbmdTZXRJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgYWR2YW5jZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBGb2xkaW5nU2V0SXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgICAgICAgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBGb2xkaW5nU2V0SXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbCAtIFRoaXMgaXMgdGhlIGNvbW1vbiBidWNrZXQgaXRlcmF0b3Igc3VwcG9ydAorLy8vICBzaGFyZWQgYnkgYWxsIGZvbGRpbmcgc2V0cywgd2hpY2gga25vd3MgaG93IHRvIHdhbGsgYSBwYXJ0aWN1bGFyIGJ1Y2tldAorLy8vICBvZiBhIGZvbGRpbmcgc2V0IGhhc2ggdGFibGUuCisKK2NsYXNzIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwgeworcHJvdGVjdGVkOgorICB2b2lkICpQdHI7CisKKyAgZXhwbGljaXQgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbCh2b2lkICoqQnVja2V0KTsKKworICBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3JJbXBsKHZvaWQgKipCdWNrZXQsIGJvb2wpCisgICAgOiBQdHIoQnVja2V0KSB7fQorCisgIHZvaWQgYWR2YW5jZSgpIHsKKyAgICB2b2lkICpQcm9iZSA9IHN0YXRpY19jYXN0PEZvbGRpbmdTZXROb2RlKj4oUHRyKS0+Z2V0TmV4dEluQnVja2V0KCk7CisgICAgdWludHB0cl90IHggPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUHJvYmUpICYgfjB4MTsKKyAgICBQdHIgPSByZWludGVycHJldF9jYXN0PHZvaWQqPih4KTsKKyAgfQorCitwdWJsaWM6CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyID09IFJIUy5QdHI7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwgJlJIUykgY29uc3QgeworICAgIHJldHVybiBQdHIgIT0gUkhTLlB0cjsKKyAgfQorfTsKKworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yIDogcHVibGljIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwgeworcHVibGljOgorICBleHBsaWNpdCBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3Iodm9pZCAqKkJ1Y2tldCkgOgorICAgIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwoQnVja2V0KSB7fQorCisgIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvcih2b2lkICoqQnVja2V0LCBib29sKSA6CisgICAgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbChCdWNrZXQsIHRydWUpIHt9CisKKyAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PFQqPihQdHIpOyB9CisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxUKj4oUHRyKTsgfQorCisgIGlubGluZSBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IC8vIFByZWluY3JlbWVudAorICAgIGFkdmFuY2UoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0Tm9kZVdyYXBwZXIgLSBUaGlzIHRlbXBsYXRlIGNsYXNzIGlzIHVzZWQgdG8gIndyYXAiIGFyYml0cmFyeQorLy8vIHR5cGVzIGluIGFuIGVuY2xvc2luZyBvYmplY3Qgc28gdGhhdCB0aGV5IGNhbiBiZSBpbnNlcnRlZCBpbnRvIEZvbGRpbmdTZXRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGb2xkaW5nU2V0Tm9kZVdyYXBwZXIgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworICBUIGRhdGE7CitwdWJsaWM6CisgIGV4cGxpY2l0IEZvbGRpbmdTZXROb2RlV3JhcHBlcihjb25zdCBUJiB4KSA6IGRhdGEoeCkge30KKyAgdmlydHVhbCB+Rm9sZGluZ1NldE5vZGVXcmFwcGVyKCkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBMT4KKyAgZXhwbGljaXQgRm9sZGluZ1NldE5vZGVXcmFwcGVyKGNvbnN0IEExJiBhMSkKKyAgICA6IGRhdGEoYTEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KKyAgZXhwbGljaXQgRm9sZGluZ1NldE5vZGVXcmFwcGVyKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKQorICAgIDogZGF0YShhMSxhMikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KKyAgZXhwbGljaXQgRm9sZGluZ1NldE5vZGVXcmFwcGVyKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpCisgICAgOiBkYXRhKGExLGEyLGEzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KKyAgZXhwbGljaXQgRm9sZGluZ1NldE5vZGVXcmFwcGVyKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBNCYgYTQpCisgICAgOiBkYXRhKGExLGEyLGEzLGE0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTU+CisgIGV4cGxpY2l0IEZvbGRpbmdTZXROb2RlV3JhcHBlcihjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQTQmIGE0LCBjb25zdCBBNSYgYTUpCisgIDogZGF0YShhMSxhMixhMyxhNCxhNSkge30KKworCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgeyBGb2xkaW5nU2V0VHJhaXQ8VD46OlByb2ZpbGUoZGF0YSwgSUQpOyB9CisKKyAgVCYgZ2V0VmFsdWUoKSB7IHJldHVybiBkYXRhOyB9CisgIGNvbnN0IFQmIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZGF0YTsgfQorCisgIG9wZXJhdG9yIFQmKCkgeyByZXR1cm4gZGF0YTsgfQorICBvcGVyYXRvciBjb25zdCBUJigpIGNvbnN0IHsgcmV0dXJuIGRhdGE7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRmFzdEZvbGRpbmdTZXROb2RlIC0gVGhpcyBpcyBhIHN1YmNsYXNzIG9mIEZvbGRpbmdTZXROb2RlIHdoaWNoIHN0b3JlcworLy8vIGEgRm9sZGluZ1NldE5vZGVJRCB2YWx1ZSByYXRoZXIgdGhhbiByZXF1aXJpbmcgdGhlIG5vZGUgdG8gcmVjb21wdXRlIGl0CisvLy8gZWFjaCB0aW1lIGl0IGlzIG5lZWRlZC4gVGhpcyB0cmFkZXMgc3BhY2UgZm9yIHNwZWVkICh3aGljaCBjYW4gYmUKKy8vLyBzaWduaWZpY2FudCBpZiB0aGUgSUQgaXMgbG9uZyksIGFuZCBpdCBhbHNvIHBlcm1pdHMgbm9kZXMgdG8gZHJvcAorLy8vIGluZm9ybWF0aW9uIHRoYXQgd291bGQgb3RoZXJ3aXNlIG9ubHkgYmUgcmVxdWlyZWQgZm9yIHJlY29tcHV0aW5nIGFuIElELgorY2xhc3MgRmFzdEZvbGRpbmdTZXROb2RlIDogcHVibGljIEZvbGRpbmdTZXROb2RlIHsKKyAgRm9sZGluZ1NldE5vZGVJRCBGYXN0SUQ7Citwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEZhc3RGb2xkaW5nU2V0Tm9kZShjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCkgOiBGYXN0SUQoSUQpIHt9CitwdWJsaWM6CisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgeyBJRCA9IEZhc3RJRDsgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIG9mIEZvbGRpbmdTZXRUcmFpdC4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEZvbGRpbmdTZXRUcmFpdDxUKj4geworICBzdGF0aWMgaW5saW5lIHZvaWQgUHJvZmlsZShjb25zdCBUKiBYLCBGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgeworICAgIElELkFkZFBvaW50ZXIoWCk7CisgIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIFByb2ZpbGUoVCogWCwgRm9sZGluZ1NldE5vZGVJRCYgSUQpIHsKKyAgICBJRC5BZGRQb2ludGVyKFgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRm9sZGluZ1NldFRyYWl0PGNvbnN0IFQqPiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKGNvbnN0IFQqIFgsIEZvbGRpbmdTZXROb2RlSUQmIElEKSB7CisgICAgSUQuQWRkUG9pbnRlcihYKTsKKyAgfQorfTsKKworfSAvLyBFbmQgb2YgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9HcmFwaFRyYWl0cy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9HcmFwaFRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDFmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0dyYXBoVHJhaXRzLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8vPT09LS0gbGx2bS9BRFQvR3JhcGhUcmFpdHMuaCAtIEdyYXBoIHRyYWl0cyB0ZW1wbGF0ZSAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGxpdHRsZSBHcmFwaFRyYWl0czxYPiB0ZW1wbGF0ZSBjbGFzcyB0aGF0IHNob3VsZCBiZQorLy8gc3BlY2lhbGl6ZWQgYnkgY2xhc3NlcyB0aGF0IHdhbnQgdG8gYmUgaXRlcmF0YWJsZSBieSBnZW5lcmljIGdyYXBoIGl0ZXJhdG9ycy4KKy8vCisvLyBUaGlzIGZpbGUgYWxzbyBkZWZpbmVzIHRoZSBtYXJrZXIgY2xhc3MgSW52ZXJzZSB0aGF0IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyCisvLyBncmFwaHMgaW4gYSBncmFwaCBkZWZpbmVkLCBpbnZlcnNlIG9yZGVyaW5nLi4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9HUkFQSFRSQUlUU19ICisjZGVmaW5lIExMVk1fQURUX0dSQVBIVFJBSVRTX0gKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBHcmFwaFRyYWl0cyAtIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGJ5IGRpZmZlcmVudCBncmFwaCB0eXBlcy4uLgorLy8gd2hpY2ggaXMgd2h5IHRoZSBkZWZhdWx0IHZlcnNpb24gaXMgZW1wdHkuCisvLwordGVtcGxhdGU8Y2xhc3MgR3JhcGhUeXBlPgorc3RydWN0IEdyYXBoVHJhaXRzIHsKKyAgLy8gRWxlbWVudHMgdG8gcHJvdmlkZToKKworICAvLyB0eXBlZGVmIE5vZGVUeXBlICAgICAgICAgIC0gVHlwZSBvZiBOb2RlIGluIHRoZSBncmFwaAorICAvLyB0eXBlZGVmIENoaWxkSXRlcmF0b3JUeXBlIC0gVHlwZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciBjaGlsZHJlbiBpbiBncmFwaAorCisgIC8vIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKGNvbnN0IEdyYXBoVHlwZSAmKQorICAvLyAgICBSZXR1cm4gdGhlIGVudHJ5IG5vZGUgb2YgdGhlIGdyYXBoCisKKyAgLy8gc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICopCisgIC8vIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQgIChOb2RlVHlwZSAqKQorICAvLyAgICBSZXR1cm4gaXRlcmF0b3JzIHRoYXQgcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIG9mIHRoZSBjaGlsZAorICAvLyAgICBub2RlIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKyAgLy8KKworCisgIC8vIHR5cGVkZWYgIC4uLml0ZXJhdG9yIG5vZGVzX2l0ZXJhdG9yOworICAvLyBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oR3JhcGhUeXBlICpHKQorICAvLyBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kICAoR3JhcGhUeXBlICpHKQorICAvLworICAvLyAgICBub2Rlc19pdGVyYXRvci9iZWdpbi9lbmQgLSBBbGxvdyBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoCisKKworICAvLyBJZiBhbnlvbmUgdHJpZXMgdG8gdXNlIHRoaXMgY2xhc3Mgd2l0aG91dCBoYXZpbmcgYW4gYXBwcm9wcmlhdGUKKyAgLy8gc3BlY2lhbGl6YXRpb24sIG1ha2UgYW4gZXJyb3IuICBJZiB5b3UgZ2V0IHRoaXMgZXJyb3IsIGl0J3MgYmVjYXVzZSB5b3UKKyAgLy8gbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBzcGVjaWFsaXphdGlvbiBvZiBHcmFwaFRyYWl0czw+IGZvciB5b3VyCisgIC8vIGdyYXBoLCBvciB5b3UgbmVlZCB0byBkZWZpbmUgaXQgZm9yIGEgbmV3IGdyYXBoIHR5cGUuIEVpdGhlciB0aGF0IG9yCisgIC8vIHlvdXIgYXJndW1lbnQgdG8gWFhYX2JlZ2luKC4uLikgaXMgdW5rbm93biBvciBuZWVkcyB0byBoYXZlIHRoZSBwcm9wZXIgLmgKKyAgLy8gZmlsZSAjaW5jbHVkZSdkLgorICAvLworICB0eXBlZGVmIHR5cGVuYW1lIEdyYXBoVHlwZTo6VW5rbm93bkdyYXBoVHlwZUVycm9yIE5vZGVUeXBlOworfTsKKworCisvLyBJbnZlcnNlIC0gVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgbGl0dGxlIG1hcmtlciBjbGFzcyB0byB0ZWxsIHRoZSBncmFwaAorLy8gaXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIHRoZSBncmFwaCBpbiBhIGdyYXBoIGRlZmluZWQgIkludmVyc2UiIG9yZGVyaW5nLgorLy8gTm90IGFsbCBncmFwaHMgZGVmaW5lIGFuIGludmVyc2Ugb3JkZXJpbmcsIGFuZCBpZiB0aGV5IGRvLCBpdCBkZXBlbmRzIG9uCisvLyB0aGUgZ3JhcGggZXhhY3RseSB3aGF0IHRoYXQgaXMuICBIZXJlJ3MgYW4gZXhhbXBsZSBvZiB1c2FnZSB3aXRoIHRoZQorLy8gZGZfaXRlcmF0b3I6CisvLworLy8gaWRmX2l0ZXJhdG9yPE1ldGhvZCo+IEkgPSBpZGZfYmVnaW4oTSksIEUgPSBpZGZfZW5kKE0pOworLy8gZm9yICg7IEkgIT0gRTsgKytJKSB7IC4uLiB9CisvLworLy8gV2hpY2ggaXMgZXF1aXZhbGVudCB0bzoKKy8vIGRmX2l0ZXJhdG9yPEludmVyc2U8TWV0aG9kKj4gPiBJID0gaWRmX2JlZ2luKE0pLCBFID0gaWRmX2VuZChNKTsKKy8vIGZvciAoOyBJICE9IEU7ICsrSSkgeyAuLi4gfQorLy8KK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFR5cGU+CitzdHJ1Y3QgSW52ZXJzZSB7CisgIGNvbnN0IEdyYXBoVHlwZSAmR3JhcGg7CisKKyAgaW5saW5lIEludmVyc2UoY29uc3QgR3JhcGhUeXBlICZHKSA6IEdyYXBoKEcpIHt9Cit9OworCisvLyBQcm92aWRlIGEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBHcmFwaFRyYWl0cyBzbyB0aGF0IHRoZSBpbnZlcnNlIG9mIGFuCisvLyBpbnZlcnNlIGZhbGxzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGdyYXBoLgordGVtcGxhdGU8Y2xhc3MgVD4KK3N0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPEludmVyc2U8VD4gPiA+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBHcmFwaFRyYWl0czxUPjo6Tm9kZVR5cGUgTm9kZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgR3JhcGhUcmFpdHM8VD46OkNoaWxkSXRlcmF0b3JUeXBlIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKEludmVyc2U8SW52ZXJzZTxUPiA+ICpHKSB7CisgICAgcmV0dXJuIEdyYXBoVHJhaXRzPFQ+OjpnZXRFbnRyeU5vZGUoRy0+R3JhcGguR3JhcGgpOworICB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlKiBOKSB7CisgICAgcmV0dXJuIEdyYXBoVHJhaXRzPFQ+OjpjaGlsZF9iZWdpbihOKTsKKyAgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUqIE4pIHsKKyAgICByZXR1cm4gR3JhcGhUcmFpdHM8VD46OmNoaWxkX2VuZChOKTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZUludGVydmFsTWFwLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZUludGVydmFsTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4Y2UxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvSW1tdXRhYmxlSW50ZXJ2YWxNYXAuaApAQCAtMCwwICsxLDI0MiBAQAorLy89PT0tLS0gSW1tdXRhYmxlSW50ZXJ2YWxNYXAuaCAtIEltbXV0YWJsZSAoZnVuY3Rpb25hbCkgbWFwICAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSW1tdXRhYmxlSW50ZXJ2YWxNYXAgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpbmNsdWRlICJsbHZtL0FEVC9JbW11dGFibGVNYXAuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBJbnRlcnZhbCB7Citwcml2YXRlOgorICBpbnQ2NF90IFN0YXJ0OworICBpbnQ2NF90IEVuZDsKKworcHVibGljOgorICBJbnRlcnZhbChpbnQ2NF90IFMsIGludDY0X3QgRSkgOiBTdGFydChTKSwgRW5kKEUpIHt9CisKKyAgaW50NjRfdCBnZXRTdGFydCgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0OyB9CisgIGludDY0X3QgZ2V0RW5kKCkgY29uc3QgeyByZXR1cm4gRW5kOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbXV0SW50ZXJ2YWxJbmZvIHsKKyAgdHlwZWRlZiBjb25zdCBzdGQ6OnBhaXI8SW50ZXJ2YWwsIFQ+IHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSAmdmFsdWVfdHlwZV9yZWY7CisgIHR5cGVkZWYgY29uc3QgSW50ZXJ2YWwga2V5X3R5cGU7CisgIHR5cGVkZWYgY29uc3QgSW50ZXJ2YWwgJmtleV90eXBlX3JlZjsKKyAgdHlwZWRlZiBjb25zdCBUIGRhdGFfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBUICZkYXRhX3R5cGVfcmVmOworCisgIHN0YXRpYyBrZXlfdHlwZV9yZWYgS2V5T2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgcmV0dXJuIFYuZmlyc3Q7CisgIH0KKworICBzdGF0aWMgZGF0YV90eXBlX3JlZiBEYXRhT2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgcmV0dXJuIFYuc2Vjb25kOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChrZXlfdHlwZV9yZWYgTCwga2V5X3R5cGVfcmVmIFIpIHsKKyAgICByZXR1cm4gTC5nZXRTdGFydCgpID09IFIuZ2V0U3RhcnQoKSAmJiBMLmdldEVuZCgpID09IFIuZ2V0RW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0RhdGFFcXVhbChkYXRhX3R5cGVfcmVmIEwsIGRhdGFfdHlwZV9yZWYgUikgeworICAgIHJldHVybiBJbXV0Q29udGFpbmVySW5mbzxUPjo6aXNFcXVhbChMLFIpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNMZXNzKGtleV90eXBlX3JlZiBMLCBrZXlfdHlwZV9yZWYgUikgeworICAgIC8vIEFzc3VtZSBMIGFuZCBSIGRvZXMgbm90IG92ZXJsYXAuCisgICAgaWYgKEwuZ2V0U3RhcnQoKSA8IFIuZ2V0U3RhcnQoKSkgeworICAgICAgYXNzZXJ0KEwuZ2V0RW5kKCkgPCBSLmdldFN0YXJ0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChMLmdldFN0YXJ0KCkgPT0gUi5nZXRTdGFydCgpKSB7CisgICAgICBhc3NlcnQoTC5nZXRFbmQoKSA9PSBSLmdldEVuZCgpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KEwuZ2V0U3RhcnQoKSA+IFIuZ2V0RW5kKCkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBib29sIGlzQ29udGFpbmVkSW4oa2V5X3R5cGVfcmVmIEssIGtleV90eXBlX3JlZiBMKSB7CisgICAgaWYgKEsuZ2V0U3RhcnQoKSA+PSBMLmdldFN0YXJ0KCkgJiYgSy5nZXRFbmQoKSA8PSBMLmdldEVuZCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdmFsdWVfdHlwZV9yZWYgVikgeworICAgIElELkFkZEludGVnZXIoVi5maXJzdC5nZXRTdGFydCgpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKFYuZmlyc3QuZ2V0RW5kKCkpOworICAgIEltdXRQcm9maWxlSW5mbzxUPjo6UHJvZmlsZShJRCwgVi5zZWNvbmQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW11dEluZm8+CitjbGFzcyBJbXV0SW50ZXJ2YWxBVkxGYWN0b3J5IDogcHVibGljIEltdXRBVkxGYWN0b3J5PEltdXRJbmZvPiB7CisgIHR5cGVkZWYgSW11dEFWTFRyZWU8SW11dEluZm8+IFRyZWVUeTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbXV0SW5mbzo6dmFsdWVfdHlwZSAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbXV0SW5mbzo6dmFsdWVfdHlwZV9yZWYgdmFsdWVfdHlwZV9yZWY7CisgIHR5cGVkZWYgdHlwZW5hbWUgSW11dEluZm86OmtleV90eXBlICAgICAgIGtleV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEltdXRJbmZvOjprZXlfdHlwZV9yZWYgICBrZXlfdHlwZV9yZWY7CisgIHR5cGVkZWYgdHlwZW5hbWUgSW11dEluZm86OmRhdGFfdHlwZSAgICAgIGRhdGFfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbXV0SW5mbzo6ZGF0YV90eXBlX3JlZiAgZGF0YV90eXBlX3JlZjsKKworcHVibGljOgorICBJbXV0SW50ZXJ2YWxBVkxGYWN0b3J5KEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jKSAKKyAgICA6IEltdXRBVkxGYWN0b3J5PEltdXRJbmZvPihBbGxvYykge30KKworICBUcmVlVHkgKkFkZChUcmVlVHkgKlQsIHZhbHVlX3R5cGVfcmVmIFYpIHsKKyAgICBUID0gQWRkX2ludGVybmFsKFYsVCk7CisgICAgdGhpcy0+TWFya0ltbXV0YWJsZShUKTsKKyAgICByZXR1cm4gVDsKKyAgfQorCisgIFRyZWVUeSAqRmluZChUcmVlVHkgKlQsIGtleV90eXBlX3JlZiBLKSB7CisgICAgaWYgKCFUKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBrZXlfdHlwZV9yZWYgQ3VycmVudEtleSA9IEltdXRJbmZvOjpLZXlPZlZhbHVlKHRoaXMtPlZhbHVlKFQpKTsKKworICAgIGlmIChJbXV0SW5mbzo6aXNDb250YWluZWRJbihLLCBDdXJyZW50S2V5KSkKKyAgICAgIHJldHVybiBUOworICAgIGVsc2UgaWYgKEltdXRJbmZvOjppc0xlc3MoSywgQ3VycmVudEtleSkpCisgICAgICByZXR1cm4gRmluZCh0aGlzLT5MZWZ0KFQpLCBLKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRmluZCh0aGlzLT5SaWdodChUKSwgSyk7CisgIH0KKworcHJpdmF0ZToKKyAgVHJlZVR5ICpBZGRfaW50ZXJuYWwodmFsdWVfdHlwZV9yZWYgViwgVHJlZVR5ICpUKSB7CisgICAga2V5X3R5cGVfcmVmIEsgPSBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShWKTsKKyAgICBUID0gUmVtb3ZlQWxsT3ZlcmxhcHMoVCwgSyk7CisgICAgaWYgKHRoaXMtPmlzRW1wdHkoVCkpCisgICAgICByZXR1cm4gdGhpcy0+Q3JlYXRlTm9kZShOVUxMLCBWLCBOVUxMKTsKKworICAgIGFzc2VydCghVC0+aXNNdXRhYmxlKCkpOworCisgICAga2V5X3R5cGVfcmVmIEtDdXJyZW50ID0gSW11dEluZm86OktleU9mVmFsdWUodGhpcy0+VmFsdWUoVCkpOworCisgICAgaWYgKEltdXRJbmZvOjppc0xlc3MoSywgS0N1cnJlbnQpKQorICAgICAgcmV0dXJuIHRoaXMtPkJhbGFuY2UoQWRkX2ludGVybmFsKFYsIHRoaXMtPkxlZnQoVCkpLCB0aGlzLT5WYWx1ZShUKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+UmlnaHQoVCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0aGlzLT5CYWxhbmNlKHRoaXMtPkxlZnQoVCksIHRoaXMtPlZhbHVlKFQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZF9pbnRlcm5hbChWLCB0aGlzLT5SaWdodChUKSkpOworICB9CisKKyAgLy8gUmVtb3ZlIGFsbCBvdmVybGFwcyBmcm9tIFQuCisgIFRyZWVUeSAqUmVtb3ZlQWxsT3ZlcmxhcHMoVHJlZVR5ICpULCBrZXlfdHlwZV9yZWYgSykgeworICAgIGJvb2wgQ2hhbmdlZDsKKyAgICBkbyB7CisgICAgICBDaGFuZ2VkID0gZmFsc2U7CisgICAgICBUID0gUmVtb3ZlT3ZlcmxhcChULCBLLCBDaGFuZ2VkKTsKKyAgICAgIHRoaXMtPk1hcmtJbW11dGFibGUoVCk7CisgICAgfSB3aGlsZSAoQ2hhbmdlZCk7CisKKyAgICByZXR1cm4gVDsKKyAgfQorCisgIC8vIFJlbW92ZSBvbmUgb3ZlcmxhcCBmcm9tIFQuCisgIFRyZWVUeSAqUmVtb3ZlT3ZlcmxhcChUcmVlVHkgKlQsIGtleV90eXBlX3JlZiBLLCBib29sICZDaGFuZ2VkKSB7CisgICAgaWYgKCFUKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW50ZXJ2YWwgQ3VycmVudEsgPSBJbXV0SW5mbzo6S2V5T2ZWYWx1ZSh0aGlzLT5WYWx1ZShUKSk7CisKKyAgICAvLyBJZiBjdXJyZW50IGtleSBkb2VzIG5vdCBvdmVybGFwIHRoZSBpbnNlcnRlZCBrZXkuCisgICAgaWYgKEN1cnJlbnRLLmdldFN0YXJ0KCkgPiBLLmdldEVuZCgpKQorICAgICAgcmV0dXJuIHRoaXMtPkJhbGFuY2UoUmVtb3ZlT3ZlcmxhcCh0aGlzLT5MZWZ0KFQpLCBLLCBDaGFuZ2VkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPlZhbHVlKFQpLCB0aGlzLT5SaWdodChUKSk7CisgICAgZWxzZSBpZiAoQ3VycmVudEsuZ2V0RW5kKCkgPCBLLmdldFN0YXJ0KCkpCisgICAgICByZXR1cm4gdGhpcy0+QmFsYW5jZSh0aGlzLT5MZWZ0KFQpLCB0aGlzLT5WYWx1ZShUKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVPdmVybGFwKHRoaXMtPlJpZ2h0KFQpLCBLLCBDaGFuZ2VkKSk7CisKKyAgICAvLyBDdXJyZW50IGtleSBvdmVybGFwcyB3aXRoIHRoZSBpbnNlcnRlZCBrZXkuCisgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IGtleS4KKyAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICBkYXRhX3R5cGVfcmVmIE9sZERhdGEgPSBJbXV0SW5mbzo6RGF0YU9mVmFsdWUodGhpcy0+VmFsdWUoVCkpOworICAgIFQgPSB0aGlzLT5SZW1vdmVfaW50ZXJuYWwoQ3VycmVudEssIFQpOworICAgIC8vIEFkZCBiYWNrIHRoZSB1bm92ZXJsYXBwZWQgcGFydCBvZiB0aGUgY3VycmVudCBrZXkuCisgICAgaWYgKEN1cnJlbnRLLmdldFN0YXJ0KCkgPCBLLmdldFN0YXJ0KCkpIHsKKyAgICAgIGlmIChDdXJyZW50Sy5nZXRFbmQoKSA8PSBLLmdldEVuZCgpKSB7CisgICAgICAgIEludGVydmFsIE5ld0soQ3VycmVudEsuZ2V0U3RhcnQoKSwgSy5nZXRTdGFydCgpLTEpOworICAgICAgICByZXR1cm4gQWRkX2ludGVybmFsKHN0ZDo6bWFrZV9wYWlyKE5ld0ssIE9sZERhdGEpLCBUKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEludGVydmFsIE5ld0sxKEN1cnJlbnRLLmdldFN0YXJ0KCksIEsuZ2V0U3RhcnQoKS0xKTsKKyAgICAgICAgVCA9IEFkZF9pbnRlcm5hbChzdGQ6Om1ha2VfcGFpcihOZXdLMSwgT2xkRGF0YSksIFQpOyAKKworICAgICAgICBJbnRlcnZhbCBOZXdLMihLLmdldEVuZCgpKzEsIEN1cnJlbnRLLmdldEVuZCgpKTsKKyAgICAgICAgcmV0dXJuIEFkZF9pbnRlcm5hbChzdGQ6Om1ha2VfcGFpcihOZXdLMiwgT2xkRGF0YSksIFQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoQ3VycmVudEsuZ2V0RW5kKCkgPiBLLmdldEVuZCgpKSB7CisgICAgICAgIEludGVydmFsIE5ld0soSy5nZXRFbmQoKSsxLCBDdXJyZW50Sy5nZXRFbmQoKSk7CisgICAgICAgIHJldHVybiBBZGRfaW50ZXJuYWwoc3RkOjptYWtlX3BhaXIoTmV3SywgT2xkRGF0YSksIFQpOworICAgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBUOworICAgIH0KKyAgfQorfTsKKworLy8vIEltbXV0YWJsZUludGVydmFsTWFwIG1hcHMgYW4gaW50ZXJ2YWwgW3N0YXJ0LCBlbmRdIHRvIGEgdmFsdWUuIFRoZSBpbnRlcnZhbHMKKy8vLyBpbiB0aGUgbWFwIGFyZSBndWFyYW50ZWVkIHRvIGJlIGRpc2pvaW50LgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbFQ+CitjbGFzcyBJbW11dGFibGVJbnRlcnZhbE1hcCAKKyAgOiBwdWJsaWMgSW1tdXRhYmxlTWFwPEludGVydmFsLCBWYWxULCBJbXV0SW50ZXJ2YWxJbmZvPFZhbFQ+ID4geworCisgIHR5cGVkZWYgdHlwZW5hbWUgSW11dEludGVydmFsSW5mbzxWYWxUPjo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgSW11dEludGVydmFsSW5mbzxWYWxUPjo6dmFsdWVfdHlwZV9yZWYgIHZhbHVlX3R5cGVfcmVmOworICB0eXBlZGVmIHR5cGVuYW1lIEltdXRJbnRlcnZhbEluZm88VmFsVD46OmtleV90eXBlICAgICAgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbXV0SW50ZXJ2YWxJbmZvPFZhbFQ+OjprZXlfdHlwZV9yZWYgICAga2V5X3R5cGVfcmVmOworICB0eXBlZGVmIHR5cGVuYW1lIEltdXRJbnRlcnZhbEluZm88VmFsVD46OmRhdGFfdHlwZSAgICAgICBkYXRhX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgSW11dEludGVydmFsSW5mbzxWYWxUPjo6ZGF0YV90eXBlX3JlZiAgIGRhdGFfdHlwZV9yZWY7CisgIHR5cGVkZWYgSW11dEFWTFRyZWU8SW11dEludGVydmFsSW5mbzxWYWxUPiA+IFRyZWVUeTsKKworcHVibGljOgorICBleHBsaWNpdCBJbW11dGFibGVJbnRlcnZhbE1hcChUcmVlVHkgKlIpIAorICAgIDogSW1tdXRhYmxlTWFwPEludGVydmFsLCBWYWxULCBJbXV0SW50ZXJ2YWxJbmZvPFZhbFQ+ID4oUikge30KKworICBjbGFzcyBGYWN0b3J5IHsKKyAgICBJbXV0SW50ZXJ2YWxBVkxGYWN0b3J5PEltdXRJbnRlcnZhbEluZm88VmFsVD4gPiBGOworCisgIHB1YmxpYzoKKyAgICBGYWN0b3J5KEJ1bXBQdHJBbGxvY2F0b3ImIEFsbG9jKSA6IEYoQWxsb2MpIHt9CisKKyAgICBJbW11dGFibGVJbnRlcnZhbE1hcCBHZXRFbXB0eU1hcCgpIHsgCisgICAgICByZXR1cm4gSW1tdXRhYmxlSW50ZXJ2YWxNYXAoRi5HZXRFbXB0eVRyZWUoKSk7IAorICAgIH0KKworICAgIEltbXV0YWJsZUludGVydmFsTWFwIEFkZChJbW11dGFibGVJbnRlcnZhbE1hcCBPbGQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZV9yZWYgSywgZGF0YV90eXBlX3JlZiBEKSB7CisgICAgICBUcmVlVHkgKlQgPSBGLkFkZChPbGQuUm9vdCwgc3RkOjptYWtlX3BhaXI8a2V5X3R5cGUsIGRhdGFfdHlwZT4oSywgRCkpOworICAgICAgcmV0dXJuIEltbXV0YWJsZUludGVydmFsTWFwKEYuR2V0Q2Fub25pY2FsVHJlZShUKSk7CisgICAgfQorCisgICAgSW1tdXRhYmxlSW50ZXJ2YWxNYXAgUmVtb3ZlKEltbXV0YWJsZUludGVydmFsTWFwIE9sZCwga2V5X3R5cGVfcmVmIEspIHsKKyAgICAgIFRyZWVUeSAqVCA9IEYuUmVtb3ZlKE9sZC5Sb290LCBLKTsKKyAgICAgIHJldHVybiBJbW11dGFibGVJbnRlcnZhbE1hcChGLkdldENhbm9uaWNhbFRyZWUoVCkpOworICAgIH0KKworICAgIGRhdGFfdHlwZSAqTG9va3VwKEltbXV0YWJsZUludGVydmFsTWFwIE0sIGtleV90eXBlX3JlZiBLKSB7CisgICAgICBUcmVlVHkgKlQgPSBGLkZpbmQoTS5nZXRSb290KCksIEspOworICAgICAgaWYgKFQpCisgICAgICAgIHJldHVybiAmVC0+Z2V0VmFsdWUoKS5zZWNvbmQ7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8gRm9yIEltbXV0YWJsZUludGVydmFsTWFwLCB0aGUgbG9va3VwIG9wZXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBieSB0aGUgCisgIC8vIGZhY3RvcnkuCisgIGRhdGFfdHlwZSogbG9va3VwKGtleV90eXBlX3JlZiBLKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZUxpc3QuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvSW1tdXRhYmxlTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTdjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZUxpc3QuaApAQCAtMCwwICsxLDIyMiBAQAorLy89PS0tLSBJbW11dGFibGVMaXN0LmggLSBJbW11dGFibGUgKGZ1bmN0aW9uYWwpIGxpc3QgaW50ZXJmYWNlIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSW1tdXRhYmxlTGlzdCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lNTElTVF9ICisjZGVmaW5lIExMVk1fQURUX0lNTElTVF9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEltbXV0YWJsZUxpc3RGYWN0b3J5OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEltbXV0YWJsZUxpc3RJbXBsIDogcHVibGljIEZvbGRpbmdTZXROb2RlIHsKKyAgVCBIZWFkOworICBjb25zdCBJbW11dGFibGVMaXN0SW1wbCogVGFpbDsKKworICBJbW11dGFibGVMaXN0SW1wbChjb25zdCBUJiBoZWFkLCBjb25zdCBJbW11dGFibGVMaXN0SW1wbCogdGFpbCA9IDApCisgICAgOiBIZWFkKGhlYWQpLCBUYWlsKHRhaWwpIHt9CisKKyAgZnJpZW5kIGNsYXNzIEltbXV0YWJsZUxpc3RGYWN0b3J5PFQ+OworCisgIC8vIERvIG5vdCBpbXBsZW1lbnQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEltbXV0YWJsZUxpc3RJbXBsJik7CisgIEltbXV0YWJsZUxpc3RJbXBsKGNvbnN0IEltbXV0YWJsZUxpc3RJbXBsJik7CisKK3B1YmxpYzoKKyAgY29uc3QgVCYgZ2V0SGVhZCgpIGNvbnN0IHsgcmV0dXJuIEhlYWQ7IH0KKyAgY29uc3QgSW1tdXRhYmxlTGlzdEltcGwqIGdldFRhaWwoKSBjb25zdCB7IHJldHVybiBUYWlsOyB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgSUQsIGNvbnN0IFQmIEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltbXV0YWJsZUxpc3RJbXBsKiBMKXsKKyAgICBJRC5BZGRQb2ludGVyKEwpOworICAgIElELkFkZChIKTsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgeworICAgIFByb2ZpbGUoSUQsIEhlYWQsIFRhaWwpOworICB9Cit9OworCisvLy8gSW1tdXRhYmxlTGlzdCAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBpbW11dGFibGUgKGZ1bmN0aW9uYWwpIGxpc3QuCisvLy8gIEl0IGlzIGltcGxlbWVudGVkIGFzIGEgc21hcnQgcG9pbnRlciAod3JhcHMgSW1tdXRhYmxlTGlzdEltcGwpLCBzbyBpdAorLy8vICBpdCBpcyBpbnRlbmRlZCB0byBhbHdheXMgYmUgY29waWVkIGJ5IHZhbHVlIGFzIGlmIGl0IHdlcmUgYSBwb2ludGVyLgorLy8vICBUaGlzIGludGVyZmFjZSBtYXRjaGVzIEltbXV0YWJsZVNldCBhbmQgSW1tdXRhYmxlTWFwLiAgSW1tdXRhYmxlTGlzdAorLy8vICBvYmplY3RzIHNob3VsZCBhbG1vc3QgbmV2ZXIgYmUgY3JlYXRlZCBkaXJlY3RseSwgYW5kIGluc3RlYWQgc2hvdWxkCisvLy8gIGJlIGNyZWF0ZWQgYnkgSW1tdXRhYmxlTGlzdEZhY3Rvcnkgb2JqZWN0cyB0aGF0IG1hbmFnZSB0aGUgbGlmZXRpbWUKKy8vLyAgb2YgYSBncm91cCBvZiBsaXN0cy4gIFdoZW4gdGhlIGZhY3Rvcnkgb2JqZWN0IGlzIHJlY2xhaW1lZCwgYWxsIGxpc3RzCisvLy8gIGNyZWF0ZWQgYnkgdGhhdCBmYWN0b3J5IGFyZSByZWxlYXNlZCBhcyB3ZWxsLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBJbW11dGFibGVMaXN0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgSW1tdXRhYmxlTGlzdEZhY3Rvcnk8VD4gRmFjdG9yeTsKKworcHJpdmF0ZToKKyAgY29uc3QgSW1tdXRhYmxlTGlzdEltcGw8VD4qIFg7CisKK3B1YmxpYzoKKyAgLy8gVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbm9ybWFsbHkgb25seSBiZSBjYWxsZWQgYnkgSW1tdXRhYmxlTGlzdEZhY3Rvcnk8VD4uCisgIC8vIFRoZXJlIG1heSBiZSBjYXNlcywgaG93ZXZlciwgd2hlbiBvbmUgbmVlZHMgdG8gZXh0cmFjdCB0aGUgaW50ZXJuYWwgcG9pbnRlcgorICAvLyBhbmQgcmVjb25zdHJ1Y3QgYSBsaXN0IG9iamVjdCBmcm9tIHRoYXQgcG9pbnRlci4KKyAgSW1tdXRhYmxlTGlzdChjb25zdCBJbW11dGFibGVMaXN0SW1wbDxUPiogeCA9IDApIDogWCh4KSB7fQorCisgIGNvbnN0IEltbXV0YWJsZUxpc3RJbXBsPFQ+KiBnZXRJbnRlcm5hbFBvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFg7CisgIH0KKworICBjbGFzcyBpdGVyYXRvciB7CisgICAgY29uc3QgSW1tdXRhYmxlTGlzdEltcGw8VD4qIEw7CisgIHB1YmxpYzoKKyAgICBpdGVyYXRvcigpIDogTCgwKSB7fQorICAgIGl0ZXJhdG9yKEltbXV0YWJsZUxpc3QgbCkgOiBMKGwuZ2V0SW50ZXJuYWxQb2ludGVyKCkpIHt9CisKKyAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgTCA9IEwtPmdldFRhaWwoKTsgcmV0dXJuICp0aGlzOyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBJKSBjb25zdCB7IHJldHVybiBMID09IEkuTDsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgSSkgY29uc3QgeyByZXR1cm4gTCAhPSBJLkw7IH0KKyAgICBjb25zdCB2YWx1ZV90eXBlJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBMLT5nZXRIZWFkKCk7IH0KKyAgICBJbW11dGFibGVMaXN0IGdldExpc3QoKSBjb25zdCB7IHJldHVybiBMOyB9CisgIH07CisKKyAgLy8vIGJlZ2luIC0gUmV0dXJucyBhbiBpdGVyYXRvciByZWZlcnJpbmcgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yCisgIC8vLyAgYW4gaXRlcmF0b3IgZGVub3RpbmcgdGhlIGVuZCBvZiB0aGUgbGlzdCBpZiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihYKTsgfQorCisgIC8vLyBlbmQgLSBSZXR1cm5zIGFuIGl0ZXJhdG9yIGRlbm90aW5nIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBUaGlzIGl0ZXJhdG9yCisgIC8vLyAgZG9lcyBub3QgcmVmZXIgdG8gYSB2YWxpZCBsaXN0IGVsZW1lbnQuCisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKworICAvLy8gaXNFbXB0eSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIVg7IH0KKworICAvLy8gaXNFcXVhbCAtIFJldHVybnMgdHJ1ZSBpZiB0d28gbGlzdHMgYXJlIGVxdWFsLiAgQmVjYXVzZSBhbGwgbGlzdHMgY3JlYXRlZAorICAvLy8gIGZyb20gdGhlIHNhbWUgSW1tdXRhYmxlTGlzdEZhY3RvcnkgYXJlIHVuaXF1ZWQsIHRoaXMgaGFzIE8oMSkgY29tcGxleGl0eQorICAvLy8gIGJlY2F1c2UgaXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IGRvIG5vdCBuZWVkIHRvIGJlIGNvbXBhcmVkLiAgTm90ZQorICAvLy8gIHRoYXQgeW91IHNob3VsZCBvbmx5IGNvbXBhcmUgdHdvIGxpc3RzIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZQorICAvLy8gIEltbXV0YWJsZUxpc3RGYWN0b3J5LgorICBib29sIGlzRXF1YWwoY29uc3QgSW1tdXRhYmxlTGlzdCYgTCkgY29uc3QgeyByZXR1cm4gWCA9PSBMLlg7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW1tdXRhYmxlTGlzdCYgTCkgY29uc3QgeyByZXR1cm4gaXNFcXVhbChMKTsgfQorCisgIC8vLyBnZXRIZWFkIC0gUmV0dXJucyB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAgY29uc3QgVCYgZ2V0SGVhZCgpIHsKKyAgICBhc3NlcnQgKCFpc0VtcHR5KCkgJiYgIkNhbm5vdCBnZXQgdGhlIGhlYWQgb2YgYW4gZW1wdHkgbGlzdC4iKTsKKyAgICByZXR1cm4gWC0+Z2V0SGVhZCgpOworICB9CisKKyAgLy8vIGdldFRhaWwgLSBSZXR1cm5zIHRoZSB0YWlsIG9mIHRoZSBsaXN0LCB3aGljaCBpcyBhbm90aGVyIChwb3NzaWJseSBlbXB0eSkKKyAgLy8vICBJbW11dGFibGVMaXN0LgorICBJbW11dGFibGVMaXN0IGdldFRhaWwoKSB7CisgICAgcmV0dXJuIFggPyBYLT5nZXRUYWlsKCkgOiAwOworICB9CisKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCB7CisgICAgSUQuQWRkUG9pbnRlcihYKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBJbW11dGFibGVMaXN0RmFjdG9yeSB7CisgIHR5cGVkZWYgSW1tdXRhYmxlTGlzdEltcGw8VD4gTGlzdFR5OworICB0eXBlZGVmIEZvbGRpbmdTZXQ8TGlzdFR5PiAgIENhY2hlVHk7CisKKyAgQ2FjaGVUeSBDYWNoZTsKKyAgdWludHB0cl90IEFsbG9jYXRvcjsKKworICBib29sIG93bnNBbGxvY2F0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEFsbG9jYXRvciAmIDB4MSA/IGZhbHNlIDogdHJ1ZTsKKyAgfQorCisgIEJ1bXBQdHJBbGxvY2F0b3ImIGdldEFsbG9jYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVtcFB0ckFsbG9jYXRvcio+KEFsbG9jYXRvciAmIH4weDEpOworICB9CisKK3B1YmxpYzoKKyAgSW1tdXRhYmxlTGlzdEZhY3RvcnkoKQorICAgIDogQWxsb2NhdG9yKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihuZXcgQnVtcFB0ckFsbG9jYXRvcigpKSkge30KKworICBJbW11dGFibGVMaXN0RmFjdG9yeShCdW1wUHRyQWxsb2NhdG9yJiBBbGxvYykKKyAgOiBBbGxvY2F0b3IocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KCZBbGxvYykgfCAweDEpIHt9CisKKyAgfkltbXV0YWJsZUxpc3RGYWN0b3J5KCkgeworICAgIGlmIChvd25zQWxsb2NhdG9yKCkpIGRlbGV0ZSAmZ2V0QWxsb2NhdG9yKCk7CisgIH0KKworICBJbW11dGFibGVMaXN0PFQ+IENvbmNhdChjb25zdCBUJiBIZWFkLCBJbW11dGFibGVMaXN0PFQ+IFRhaWwpIHsKKyAgICAvLyBQcm9maWxlIHRoZSBuZXcgbGlzdCB0byBzZWUgaWYgaXQgYWxyZWFkeSBleGlzdHMgaW4gb3VyIGNhY2hlLgorICAgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgICAgdm9pZCogSW5zZXJ0UG9zOworCisgICAgY29uc3QgTGlzdFR5KiBUYWlsSW1wbCA9IFRhaWwuZ2V0SW50ZXJuYWxQb2ludGVyKCk7CisgICAgTGlzdFR5OjpQcm9maWxlKElELCBIZWFkLCBUYWlsSW1wbCk7CisgICAgTGlzdFR5KiBMID0gQ2FjaGUuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9zKTsKKworICAgIGlmICghTCkgeworICAgICAgLy8gVGhlIGxpc3QgZG9lcyBub3QgZXhpc3QgaW4gb3VyIGNhY2hlLiAgQ3JlYXRlIGl0LgorICAgICAgQnVtcFB0ckFsbG9jYXRvciYgQSA9IGdldEFsbG9jYXRvcigpOworICAgICAgTCA9IChMaXN0VHkqKSBBLkFsbG9jYXRlPExpc3RUeT4oKTsKKyAgICAgIG5ldyAoTCkgTGlzdFR5KEhlYWQsIFRhaWxJbXBsKTsKKworICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgbGlzdCBpbnRvIHRoZSBjYWNoZS4KKyAgICAgIENhY2hlLkluc2VydE5vZGUoTCwgSW5zZXJ0UG9zKTsKKyAgICB9CisKKyAgICByZXR1cm4gTDsKKyAgfQorCisgIEltbXV0YWJsZUxpc3Q8VD4gQWRkKGNvbnN0IFQmIEQsIEltbXV0YWJsZUxpc3Q8VD4gTCkgeworICAgIHJldHVybiBDb25jYXQoRCwgTCk7CisgIH0KKworICBJbW11dGFibGVMaXN0PFQ+IEdldEVtcHR5TGlzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTGlzdDxUPigwKTsKKyAgfQorCisgIEltbXV0YWJsZUxpc3Q8VD4gQ3JlYXRlKGNvbnN0IFQmIFgpIHsKKyAgICByZXR1cm4gQ29uY2F0KFgsIEdldEVtcHR5TGlzdCgpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhcnRpYWxseS1zcGVjaWFsaXplZCBUcmFpdHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzxJbW11dGFibGVMaXN0PFQ+ID4geworICBzdGF0aWMgaW5saW5lIEltbXV0YWJsZUxpc3Q8VD4gZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SW1tdXRhYmxlTGlzdEltcGw8VD4qPigtMSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBJbW11dGFibGVMaXN0PFQ+IGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJbW11dGFibGVMaXN0SW1wbDxUPio+KC0yKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKEltbXV0YWJsZUxpc3Q8VD4gWCkgeworICAgIHVpbnRwdHJfdCBQdHJWYWwgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oWC5nZXRJbnRlcm5hbFBvaW50ZXIoKSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCgodWludHB0cl90KVB0clZhbCkgPj4gNCkgXgorICAgICAgICAgICAodW5zaWduZWQoKHVpbnRwdHJfdClQdHJWYWwpID4+IDkpOworICB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoSW1tdXRhYmxlTGlzdDxUPiBYMSwgSW1tdXRhYmxlTGlzdDxUPiBYMikgeworICAgIHJldHVybiBYMSA9PSBYMjsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc1BvZExpa2U7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc1BvZExpa2U8SW1tdXRhYmxlTGlzdDxUPiA+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvSW1tdXRhYmxlTWFwLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZjEyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZU1hcC5oCkBAIC0wLDAgKzEsMjMwIEBACisvLz09PS0tLSBJbW11dGFibGVNYXAuaCAtIEltbXV0YWJsZSAoZnVuY3Rpb25hbCkgbWFwIGludGVyZmFjZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBJbW11dGFibGVNYXAgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTU1BUF9ICisjZGVmaW5lIExMVk1fQURUX0lNTUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZVNldC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBJbXV0S2V5VmFsdWVJbmZvIC1UcmFpdHMgY2xhc3MgdXNlZCBieSBJbW11dGFibGVNYXAuICBXaGlsZSBib3RoIHRoZSBmaXJzdAorLy8vIGFuZCBzZWNvbmQgZWxlbWVudHMgaW4gYSBwYWlyIGFyZSB1c2VkIHRvIGdlbmVyYXRlIHByb2ZpbGUgaW5mb3JtYXRpb24sCisvLy8gb25seSB0aGUgZmlyc3QgZWxlbWVudCAodGhlIGtleSkgaXMgdXNlZCBieSBpc0VxdWFsIGFuZCBpc0xlc3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK3N0cnVjdCBJbXV0S2V5VmFsdWVJbmZvIHsKKyAgdHlwZWRlZiBjb25zdCBzdGQ6OnBhaXI8VCxTPiB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIHZhbHVlX3R5cGVfcmVmOworICB0eXBlZGVmIGNvbnN0IFQgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBUJiAga2V5X3R5cGVfcmVmOworICB0eXBlZGVmIGNvbnN0IFMgICBkYXRhX3R5cGU7CisgIHR5cGVkZWYgY29uc3QgUyYgIGRhdGFfdHlwZV9yZWY7CisKKyAgc3RhdGljIGlubGluZSBrZXlfdHlwZV9yZWYgS2V5T2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgcmV0dXJuIFYuZmlyc3Q7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGRhdGFfdHlwZV9yZWYgRGF0YU9mVmFsdWUodmFsdWVfdHlwZV9yZWYgVikgeworICAgIHJldHVybiBWLnNlY29uZDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0VxdWFsKGtleV90eXBlX3JlZiBMLCBrZXlfdHlwZV9yZWYgUikgeworICAgIHJldHVybiBJbXV0Q29udGFpbmVySW5mbzxUPjo6aXNFcXVhbChMLFIpOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0xlc3Moa2V5X3R5cGVfcmVmIEwsIGtleV90eXBlX3JlZiBSKSB7CisgICAgcmV0dXJuIEltdXRDb250YWluZXJJbmZvPFQ+Ojppc0xlc3MoTCxSKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0RhdGFFcXVhbChkYXRhX3R5cGVfcmVmIEwsIGRhdGFfdHlwZV9yZWYgUikgeworICAgIHJldHVybiBJbXV0Q29udGFpbmVySW5mbzxTPjo6aXNFcXVhbChMLFIpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgSUQsIHZhbHVlX3R5cGVfcmVmIFYpIHsKKyAgICBJbXV0Q29udGFpbmVySW5mbzxUPjo6UHJvZmlsZShJRCwgVi5maXJzdCk7CisgICAgSW11dENvbnRhaW5lckluZm88Uz46OlByb2ZpbGUoSUQsIFYuc2Vjb25kKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwKKyAgICAgICAgICB0eXBlbmFtZSBWYWxJbmZvID0gSW11dEtleVZhbHVlSW5mbzxLZXlULFZhbFQ+ID4KK2NsYXNzIEltbXV0YWJsZU1hcCB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZV9yZWYgIHZhbHVlX3R5cGVfcmVmOworICB0eXBlZGVmIHR5cGVuYW1lIFZhbEluZm86OmtleV90eXBlICAgICAgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWYWxJbmZvOjprZXlfdHlwZV9yZWYgICAga2V5X3R5cGVfcmVmOworICB0eXBlZGVmIHR5cGVuYW1lIFZhbEluZm86OmRhdGFfdHlwZSAgICAgICBkYXRhX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmFsSW5mbzo6ZGF0YV90eXBlX3JlZiAgIGRhdGFfdHlwZV9yZWY7CisgIHR5cGVkZWYgSW11dEFWTFRyZWU8VmFsSW5mbz4gICAgICAgICAgICAgIFRyZWVUeTsKKworcHJvdGVjdGVkOgorICBUcmVlVHkqIFJvb3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYSBtYXAgZnJvbSBhIHBvaW50ZXIgdG8gYSB0cmVlIHJvb3QuICBJbiBnZW5lcmFsIG9uZQorICAvLy8gc2hvdWxkIHVzZSBhIEZhY3Rvcnkgb2JqZWN0IHRvIGNyZWF0ZSBtYXBzIGluc3RlYWQgb2YgZGlyZWN0bHkKKyAgLy8vIGludm9raW5nIHRoZSBjb25zdHJ1Y3RvciwgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBtYWtlIHRoaXMKKyAgLy8vIGNvbnN0cnVjdG9yIHB1YmxpYyBpcyB1c2VmdWwuCisgIGV4cGxpY2l0IEltbXV0YWJsZU1hcChjb25zdCBUcmVlVHkqIFIpIDogUm9vdChjb25zdF9jYXN0PFRyZWVUeSo+KFIpKSB7fQorCisgIGNsYXNzIEZhY3RvcnkgeworICAgIHR5cGVuYW1lIFRyZWVUeTo6RmFjdG9yeSBGOworICAgIGNvbnN0IGJvb2wgQ2Fub25pY2FsaXplOworCisgIHB1YmxpYzoKKyAgICBGYWN0b3J5KGJvb2wgY2Fub25pY2FsaXplID0gdHJ1ZSkKKyAgICAgIDogQ2Fub25pY2FsaXplKGNhbm9uaWNhbGl6ZSkge30KKyAgICAKKyAgICBGYWN0b3J5KEJ1bXBQdHJBbGxvY2F0b3ImIEFsbG9jLCBib29sIGNhbm9uaWNhbGl6ZSA9IHRydWUpCisgICAgICA6IEYoQWxsb2MpLCBDYW5vbmljYWxpemUoY2Fub25pY2FsaXplKSB7fQorCisgICAgSW1tdXRhYmxlTWFwIEdldEVtcHR5TWFwKCkgeyByZXR1cm4gSW1tdXRhYmxlTWFwKEYuR2V0RW1wdHlUcmVlKCkpOyB9CisKKyAgICBJbW11dGFibGVNYXAgQWRkKEltbXV0YWJsZU1hcCBPbGQsIGtleV90eXBlX3JlZiBLLCBkYXRhX3R5cGVfcmVmIEQpIHsKKyAgICAgIFRyZWVUeSAqVCA9IEYuQWRkKE9sZC5Sb290LCBzdGQ6Om1ha2VfcGFpcjxrZXlfdHlwZSxkYXRhX3R5cGU+KEssRCkpOworICAgICAgcmV0dXJuIEltbXV0YWJsZU1hcChDYW5vbmljYWxpemUgPyBGLkdldENhbm9uaWNhbFRyZWUoVCk6IFQpOworICAgIH0KKworICAgIEltbXV0YWJsZU1hcCBSZW1vdmUoSW1tdXRhYmxlTWFwIE9sZCwga2V5X3R5cGVfcmVmIEspIHsKKyAgICAgIFRyZWVUeSAqVCA9IEYuUmVtb3ZlKE9sZC5Sb290LEspOworICAgICAgcmV0dXJuIEltbXV0YWJsZU1hcChDYW5vbmljYWxpemUgPyBGLkdldENhbm9uaWNhbFRyZWUoVCk6IFQpOworICAgIH0KKworICBwcml2YXRlOgorICAgIEZhY3RvcnkoY29uc3QgRmFjdG9yeSYgUkhTKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEZhY3RvcnkmIFJIUyk7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgfTsKKworICBib29sIGNvbnRhaW5zKGtleV90eXBlX3JlZiBLKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgPyBSb290LT5jb250YWlucyhLKSA6IGZhbHNlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KEltbXV0YWJsZU1hcCBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCAmJiBSSFMuUm9vdCA/IFJvb3QtPmlzRXF1YWwoKlJIUy5Sb290KSA6IFJvb3QgPT0gUkhTLlJvb3Q7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oSW1tdXRhYmxlTWFwIFJIUykgY29uc3QgeworICAgIHJldHVybiBSb290ICYmIFJIUy5Sb290ID8gUm9vdC0+aXNOb3RFcXVhbCgqUkhTLlJvb3QpIDogUm9vdCAhPSBSSFMuUm9vdDsKKyAgfQorCisgIFRyZWVUeSogZ2V0Um9vdCgpIGNvbnN0IHsgcmV0dXJuIFJvb3Q7IH0KKworICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhUm9vdDsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGb3JlYWNoIC0gQSBsaW1pdGVkIGZvcm0gb2YgbWFwIGl0ZXJhdGlvbi4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYmFjaz4KKyAgc3RydWN0IENCV3JhcHBlciB7CisgICAgQ2FsbGJhY2sgQzsKKyAgICB2b2lkIG9wZXJhdG9yKCkodmFsdWVfdHlwZV9yZWYgVikgeyBDKFYuZmlyc3QsVi5zZWNvbmQpOyB9CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxiYWNrPgorICBzdHJ1Y3QgQ0JXcmFwcGVyUmVmIHsKKyAgICBDYWxsYmFjayAmQzsKKyAgICBDQldyYXBwZXJSZWYoQ2FsbGJhY2smIGMpIDogQyhjKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKHZhbHVlX3R5cGVfcmVmIFYpIHsgQyhWLmZpcnN0LFYuc2Vjb25kKTsgfQorICB9OworCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYmFjaz4KKyAgdm9pZCBmb3JlYWNoKENhbGxiYWNrJiBDKSB7CisgICAgaWYgKFJvb3QpIHsKKyAgICAgIENCV3JhcHBlclJlZjxDYWxsYmFjaz4gQ0IoQyk7CisgICAgICBSb290LT5mb3JlYWNoKENCKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2s+CisgIHZvaWQgZm9yZWFjaCgpIHsKKyAgICBpZiAoUm9vdCkgeworICAgICAgQ0JXcmFwcGVyPENhbGxiYWNrPiBDQjsKKyAgICAgIFJvb3QtPmZvcmVhY2goQ0IpOworICAgIH0KKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGb3IgdGVzdGluZy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdm9pZCB2ZXJpZnkoKSBjb25zdCB7IGlmIChSb290KSBSb290LT52ZXJpZnkoKTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJdGVyYXRvcnMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICB0eXBlbmFtZSBUcmVlVHk6Oml0ZXJhdG9yIGl0cjsKKworICAgIGl0ZXJhdG9yKCkge30KKyAgICBpdGVyYXRvcihUcmVlVHkqIHQpIDogaXRyKHQpIHt9CisgICAgZnJpZW5kIGNsYXNzIEltbXV0YWJsZU1hcDsKKworICBwdWJsaWM6CisgICAgdmFsdWVfdHlwZV9yZWYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gaXRyLT5nZXRWYWx1ZSgpOyB9CisgICAgdmFsdWVfdHlwZSogICAgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZpdHItPmdldFZhbHVlKCk7IH0KKworICAgIGtleV90eXBlX3JlZiBnZXRLZXkoKSBjb25zdCB7IHJldHVybiBpdHItPmdldFZhbHVlKCkuZmlyc3Q7IH0KKyAgICBkYXRhX3R5cGVfcmVmIGdldERhdGEoKSBjb25zdCB7IHJldHVybiBpdHItPmdldFZhbHVlKCkuc2Vjb25kOyB9CisKKworICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyArK2l0cjsgcmV0dXJuICp0aGlzOyB9CisgICAgaXRlcmF0b3IgIG9wZXJhdG9yKysoaW50KSB7IGl0ZXJhdG9yIHRtcCgqdGhpcyk7ICsraXRyOyByZXR1cm4gdG1wOyB9CisgICAgaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7IC0taXRyOyByZXR1cm4gKnRoaXM7IH0KKyAgICBpdGVyYXRvciAgb3BlcmF0b3ItLShpbnQpIHsgaXRlcmF0b3IgdG1wKCp0aGlzKTsgLS1pdHI7IHJldHVybiB0bXA7IH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIFJIUykgY29uc3QgeyByZXR1cm4gUkhTLml0ciA9PSBpdHI7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIFJIUykgY29uc3QgeyByZXR1cm4gUkhTLml0ciAhPSBpdHI7IH0KKyAgfTsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJvb3QpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKworICBkYXRhX3R5cGUqIGxvb2t1cChrZXlfdHlwZV9yZWYgSykgY29uc3QgeworICAgIGlmIChSb290KSB7CisgICAgICBUcmVlVHkqIFQgPSBSb290LT5maW5kKEspOworICAgICAgaWYgKFQpIHJldHVybiAmVC0+Z2V0VmFsdWUoKS5zZWNvbmQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIC8vLyBnZXRNYXhFbGVtZW50IC0gUmV0dXJucyB0aGUgPGtleSx2YWx1ZT4gcGFpciBpbiB0aGUgSW1tdXRhYmxlTWFwIGZvcgorICAvLy8gIHdoaWNoIGtleSBpcyB0aGUgaGlnaGVzdCBpbiB0aGUgb3JkZXJpbmcgb2Yga2V5cyBpbiB0aGUgbWFwLiAgVGhpcworICAvLy8gIG1ldGhvZCByZXR1cm5zIE5VTEwgaWYgdGhlIG1hcCBpcyBlbXB0eS4KKyAgdmFsdWVfdHlwZSogZ2V0TWF4RWxlbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCA/ICYoUm9vdC0+Z2V0TWF4RWxlbWVudCgpLT5nZXRWYWx1ZSgpKSA6IDA7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVXRpbGl0eSBtZXRob2RzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB1bnNpZ25lZCBnZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBSb290ID8gUm9vdC0+Z2V0SGVpZ2h0KCkgOiAwOyB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgSUQsIGNvbnN0IEltbXV0YWJsZU1hcCYgTSkgeworICAgIElELkFkZFBvaW50ZXIoTS5Sb290KTsKKyAgfQorCisgIGlubGluZSB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvZmlsZShJRCwqdGhpcyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9JbW11dGFibGVTZXQuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvSW1tdXRhYmxlU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjM2NhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvSW1tdXRhYmxlU2V0LmgKQEAgLTAsMCArMSwxMDU3IEBACisvLz09PS0tLSBJbW11dGFibGVTZXQuaCAtIEltbXV0YWJsZSAoZnVuY3Rpb25hbCkgc2V0IGludGVyZmFjZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBJbXV0QVZMVHJlZSBhbmQgSW1tdXRhYmxlU2V0IGNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTVNFVF9ICisjZGVmaW5lIExMVk1fQURUX0lNU0VUX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbW11dGFibGUgQVZMLVRyZWUgRGVmaW5pdGlvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXV0SW5mbz4gY2xhc3MgSW11dEFWTEZhY3Rvcnk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW11dEluZm8+IGNsYXNzIEltdXRJbnRlcnZhbEFWTEZhY3Rvcnk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW11dEluZm8+IGNsYXNzIEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yOwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvPiBjbGFzcyBJbXV0QVZMVHJlZUdlbmVyaWNJdGVyYXRvcjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvID4KK2NsYXNzIEltdXRBVkxUcmVlIDogcHVibGljIEZvbGRpbmdTZXROb2RlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbXV0SW5mbzo6a2V5X3R5cGVfcmVmICAga2V5X3R5cGVfcmVmOworICB0eXBlZGVmIHR5cGVuYW1lIEltdXRJbmZvOjp2YWx1ZV90eXBlICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEltdXRJbmZvOjp2YWx1ZV90eXBlX3JlZiB2YWx1ZV90eXBlX3JlZjsKKworICB0eXBlZGVmIEltdXRBVkxGYWN0b3J5PEltdXRJbmZvPiAgICAgICAgICBGYWN0b3J5OworICBmcmllbmQgY2xhc3MgSW11dEFWTEZhY3Rvcnk8SW11dEluZm8+OworICBmcmllbmQgY2xhc3MgSW11dEludGVydmFsQVZMRmFjdG9yeTxJbXV0SW5mbz47CisKKyAgZnJpZW5kIGNsYXNzIEltdXRBVkxUcmVlR2VuZXJpY0l0ZXJhdG9yPEltdXRJbmZvPjsKKyAgZnJpZW5kIGNsYXNzIEZvbGRpbmdTZXQ8SW11dEFWTFRyZWU+OworCisgIHR5cGVkZWYgSW11dEFWTFRyZWVJbk9yZGVySXRlcmF0b3I8SW11dEluZm8+ICBpdGVyYXRvcjsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBQdWJsaWMgSW50ZXJmYWNlLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBnZXRMZWZ0IC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxlZnQgc3VidHJlZS4gIFRoaXMgdmFsdWUKKyAgLy8vICBpcyBOVUxMIGlmIHRoZXJlIGlzIG5vIGxlZnQgc3VidHJlZS4KKyAgSW11dEFWTFRyZWUgKmdldExlZnQoKSBjb25zdCB7IHJldHVybiBMZWZ0OyB9CisKKyAgLy8vIGdldFJpZ2h0IC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJpZ2h0IHN1YnRyZWUuICBUaGlzIHZhbHVlIGlzCisgIC8vLyAgTlVMTCBpZiB0aGVyZSBpcyBubyByaWdodCBzdWJ0cmVlLgorICBJbXV0QVZMVHJlZSAqZ2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiBSaWdodDsgfQorCisgIC8vLyBnZXRIZWlnaHQgLSBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHRyZWUuICBBIHRyZWUgd2l0aCBubyBzdWJ0cmVlcworICAvLy8gIGhhcyBhIGhlaWdodCBvZiAxLgorICB1bnNpZ25lZCBnZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBIZWlnaHQ7IH0KKworICAvLy8gZ2V0VmFsdWUgLSBSZXR1cm5zIHRoZSBkYXRhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJlZSBub2RlLgorICBjb25zdCB2YWx1ZV90eXBlJiBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgLy8vIGZpbmQgLSBGaW5kcyB0aGUgc3VidHJlZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgdmFsdWUuCisgIC8vLyAgVGhpcyBtZXRob2QgcmV0dXJucyBOVUxMIGlmIG5vIG1hdGNoaW5nIHN1YnRyZWUgaXMgZm91bmQuCisgIEltdXRBVkxUcmVlKiBmaW5kKGtleV90eXBlX3JlZiBLKSB7CisgICAgSW11dEFWTFRyZWUgKlQgPSB0aGlzOworCisgICAgd2hpbGUgKFQpIHsKKyAgICAgIGtleV90eXBlX3JlZiBDdXJyZW50S2V5ID0gSW11dEluZm86OktleU9mVmFsdWUoVC0+Z2V0VmFsdWUoKSk7CisKKyAgICAgIGlmIChJbXV0SW5mbzo6aXNFcXVhbChLLEN1cnJlbnRLZXkpKQorICAgICAgICByZXR1cm4gVDsKKyAgICAgIGVsc2UgaWYgKEltdXRJbmZvOjppc0xlc3MoSyxDdXJyZW50S2V5KSkKKyAgICAgICAgVCA9IFQtPmdldExlZnQoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgVCA9IFQtPmdldFJpZ2h0KCk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgCisgIC8vLyBnZXRNYXhFbGVtZW50IC0gRmluZCB0aGUgc3VidHJlZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhpZ2hlc3QgcmFuZ2VkCisgIC8vLyAga2V5IHZhbHVlLgorICBJbXV0QVZMVHJlZSogZ2V0TWF4RWxlbWVudCgpIHsKKyAgICBJbXV0QVZMVHJlZSAqVCA9IHRoaXM7CisgICAgSW11dEFWTFRyZWUgKlJpZ2h0ID0gVC0+Z2V0UmlnaHQoKTsgICAgCisgICAgd2hpbGUgKFJpZ2h0KSB7IFQgPSBSaWdodDsgUmlnaHQgPSBULT5nZXRSaWdodCgpOyB9CisgICAgcmV0dXJuIFQ7CisgIH0KKworICAvLy8gc2l6ZSAtIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgdHJlZSwgd2hpY2ggaW5jbHVkZXMKKyAgLy8vICBib3RoIGxlYXZlcyBhbmQgbm9uLWxlYWYgbm9kZXMuCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7CisgICAgdW5zaWduZWQgbiA9IDE7CisKKyAgICBpZiAoY29uc3QgSW11dEFWTFRyZWUqIEwgPSBnZXRMZWZ0KCkpICBuICs9IEwtPnNpemUoKTsKKyAgICBpZiAoY29uc3QgSW11dEFWTFRyZWUqIFIgPSBnZXRSaWdodCgpKSBuICs9IFItPnNpemUoKTsKKworICAgIHJldHVybiBuOworICB9CisKKyAgLy8vIGJlZ2luIC0gUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIG5vZGVzIG9mIHRoZSB0cmVlCisgIC8vLyAgaW4gYW4gaW5vcmRlciB0cmF2ZXJzYWwuICBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgdGh1cyByZWZlcnMgdG8gdGhlCisgIC8vLyAgdGhlIHRyZWUgbm9kZSB3aXRoIHRoZSBtaW5pbXVtIGRhdGEgZWxlbWVudC4KKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcih0aGlzKTsgfQorCisgIC8vLyBlbmQgLSBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGUgdHJlZSB0aGF0IGRlbm90ZXMgdGhlIGVuZCBvZiBhbgorICAvLy8gIGlub3JkZXIgdHJhdmVyc2FsLgorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigpOyB9CisKKyAgYm9vbCBFbGVtZW50RXF1YWwodmFsdWVfdHlwZV9yZWYgVikgY29uc3QgeworICAgIC8vIENvbXBhcmUgdGhlIGtleXMuCisgICAgaWYgKCFJbXV0SW5mbzo6aXNFcXVhbChJbXV0SW5mbzo6S2V5T2ZWYWx1ZShnZXRWYWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEltdXRJbmZvOjpLZXlPZlZhbHVlKFYpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEFsc28gY29tcGFyZSB0aGUgZGF0YSB2YWx1ZXMuCisgICAgaWYgKCFJbXV0SW5mbzo6aXNEYXRhRXF1YWwoSW11dEluZm86OkRhdGFPZlZhbHVlKGdldFZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltdXRJbmZvOjpEYXRhT2ZWYWx1ZShWKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgRWxlbWVudEVxdWFsKGNvbnN0IEltdXRBVkxUcmVlKiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRWxlbWVudEVxdWFsKFJIUy0+Z2V0VmFsdWUoKSk7CisgIH0KKworICAvLy8gaXNFcXVhbCAtIENvbXBhcmVzIHR3byB0cmVlcyBmb3Igc3RydWN0dXJhbCBlcXVhbGl0eSBhbmQgcmV0dXJucyB0cnVlCisgIC8vLyAgIGlmIHRoZXkgYXJlIGVxdWFsLiAgVGhpcyB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIHRoaXMgb3BlcmF0aW9uIGlzCisgIC8vICAgIGxpbmVhciBpbiB0aGUgc2l6ZXMgb2YgdGhlIHRyZWVzLgorICBib29sIGlzRXF1YWwoY29uc3QgSW11dEFWTFRyZWUmIFJIUykgY29uc3QgeworICAgIGlmICgmUkhTID09IHRoaXMpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGl0ZXJhdG9yIExJdHIgPSBiZWdpbigpLCBMRW5kID0gZW5kKCk7CisgICAgaXRlcmF0b3IgUkl0ciA9IFJIUy5iZWdpbigpLCBSRW5kID0gUkhTLmVuZCgpOworCisgICAgd2hpbGUgKExJdHIgIT0gTEVuZCAmJiBSSXRyICE9IFJFbmQpIHsKKyAgICAgIGlmICgqTEl0ciA9PSAqUkl0cikgeworICAgICAgICBMSXRyLlNraXBTdWJUcmVlKCk7CisgICAgICAgIFJJdHIuU2tpcFN1YlRyZWUoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmICghTEl0ci0+RWxlbWVudEVxdWFsKCpSSXRyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICArK0xJdHI7CisgICAgICArK1JJdHI7CisgICAgfQorCisgICAgcmV0dXJuIExJdHIgPT0gTEVuZCAmJiBSSXRyID09IFJFbmQ7CisgIH0KKworICAvLy8gaXNOb3RFcXVhbCAtIENvbXBhcmVzIHR3byB0cmVlcyBmb3Igc3RydWN0dXJhbCBpbmVxdWFsaXR5LiAgUGVyZm9ybWFuY2UKKyAgLy8vICBpcyB0aGUgc2FtZSBpcyBpc0VxdWFsLgorICBib29sIGlzTm90RXF1YWwoY29uc3QgSW11dEFWTFRyZWUmIFJIUykgY29uc3QgeyByZXR1cm4gIWlzRXF1YWwoUkhTKTsgfQorCisgIC8vLyBjb250YWlucyAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRyZWUgY29udGFpbnMgYSBzdWJ0cmVlIChub2RlKSB0aGF0CisgIC8vLyAgaGFzIGFuIGRhdGEgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBrZXkuICBDb21wbGV4aXR5CisgIC8vLyAgaXMgbG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIHRyZWUuCisgIGJvb2wgY29udGFpbnMoa2V5X3R5cGVfcmVmIEspIHsgcmV0dXJuIChib29sKSBmaW5kKEspOyB9CisKKyAgLy8vIGZvcmVhY2ggLSBBIG1lbWJlciB0ZW1wbGF0ZSB0aGUgYWNjZXB0cyBpbnZva2VzIG9wZXJhdG9yKCkgb24gYSBmdW5jdG9yCisgIC8vLyAgb2JqZWN0IChzcGVjaWZlZCBieSBDYWxsYmFjaykgZm9yIGV2ZXJ5IG5vZGUvc3VidHJlZSBpbiB0aGUgdHJlZS4KKyAgLy8vICBOb2RlcyBhcmUgdmlzaXRlZCB1c2luZyBhbiBpbm9yZGVyIHRyYXZlcnNhbC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxiYWNrPgorICB2b2lkIGZvcmVhY2goQ2FsbGJhY2smIEMpIHsKKyAgICBpZiAoSW11dEFWTFRyZWUqIEwgPSBnZXRMZWZ0KCkpIEwtPmZvcmVhY2goQyk7CisKKyAgICBDKFZhbHVlKTsKKworICAgIGlmIChJbXV0QVZMVHJlZSogUiA9IGdldFJpZ2h0KCkpIFItPmZvcmVhY2goQyk7CisgIH0KKworICAvLy8gdmVyaWZ5IC0gQSB1dGlsaXR5IG1ldGhvZCB0aGF0IGNoZWNrcyB0aGF0IHRoZSBiYWxhbmNpbmcgYW5kCisgIC8vLyAgb3JkZXJpbmcgaW52YXJpYW50cyBvZiB0aGUgdHJlZSBhcmUgc2F0aXNpZmVkLiAgSXQgaXMgYSByZWN1cnNpdmUKKyAgLy8vICBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHRyZWUsIHdoaWNoIGlzIHRoZW4gY29uc3VtZWQKKyAgLy8vICBieSB0aGUgZW5jbG9zaW5nIHZlcmlmeSBjYWxsLiAgRXh0ZXJuYWwgY2FsbGVycyBzaG91bGQgaWdub3JlIHRoZQorICAvLy8gIHJldHVybiB2YWx1ZS4gIEFuIGludmFsaWQgdHJlZSB3aWxsIGNhdXNlIGFuIGFzc2VydGlvbiB0byBmaXJlIGluCisgIC8vLyAgYSBkZWJ1ZyBidWlsZC4KKyAgdW5zaWduZWQgdmVyaWZ5KCkgY29uc3QgeworICAgIHVuc2lnbmVkIEhMID0gZ2V0TGVmdCgpID8gZ2V0TGVmdCgpLT52ZXJpZnkoKSA6IDA7CisgICAgdW5zaWduZWQgSFIgPSBnZXRSaWdodCgpID8gZ2V0UmlnaHQoKS0+dmVyaWZ5KCkgOiAwOworICAgICh2b2lkKSBITDsKKyAgICAodm9pZCkgSFI7CisKKyAgICBhc3NlcnQoZ2V0SGVpZ2h0KCkgPT0gKCBITCA+IEhSID8gSEwgOiBIUiApICsgMQorICAgICAgICAgICAgJiYgIkhlaWdodCBjYWxjdWxhdGlvbiB3cm9uZyIpOworCisgICAgYXNzZXJ0KChITCA+IEhSID8gSEwtSFIgOiBIUi1ITCkgPD0gMgorICAgICAgICAgICAmJiAiQmFsYW5jaW5nIGludmFyaWFudCB2aW9sYXRlZCIpOworCisgICAgYXNzZXJ0KCFnZXRMZWZ0KCkKKyAgICAgICAgICAgfHwgSW11dEluZm86OmlzTGVzcyhJbXV0SW5mbzo6S2V5T2ZWYWx1ZShnZXRMZWZ0KCktPmdldFZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltdXRJbmZvOjpLZXlPZlZhbHVlKGdldFZhbHVlKCkpKQorICAgICAgICAgICAmJiAiVmFsdWUgaW4gbGVmdCBjaGlsZCBpcyBub3QgbGVzcyB0aGF0IGN1cnJlbnQgdmFsdWUiKTsKKworCisgICAgYXNzZXJ0KCFnZXRSaWdodCgpCisgICAgICAgICAgIHx8IEltdXRJbmZvOjppc0xlc3MoSW11dEluZm86OktleU9mVmFsdWUoZ2V0VmFsdWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW11dEluZm86OktleU9mVmFsdWUoZ2V0UmlnaHQoKS0+Z2V0VmFsdWUoKSkpCisgICAgICAgICAgICYmICJDdXJyZW50IHZhbHVlIGlzIG5vdCBsZXNzIHRoYXQgdmFsdWUgb2YgcmlnaHQgY2hpbGQiKTsKKworICAgIHJldHVybiBnZXRIZWlnaHQoKTsKKyAgfQorCisgIC8vLyBQcm9maWxlIC0gUHJvZmlsaW5nIGZvciBJbXV0QVZMVHJlZS4KKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSB7CisgICAgSUQuQWRkSW50ZWdlcihDb21wdXRlRGlnZXN0KCkpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW50ZXJuYWwgVmFsdWVzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwcml2YXRlOgorICBJbXV0QVZMVHJlZSogICAgIExlZnQ7CisgIEltdXRBVkxUcmVlKiAgICAgUmlnaHQ7CisgIHVuc2lnbmVkICAgICAgICAgSGVpZ2h0ICAgICAgIDogMjg7CisgIHVuc2lnbmVkICAgICAgICAgTXV0YWJsZSAgICAgIDogMTsKKyAgdW5zaWduZWQgICAgICAgICBDYWNoZWREaWdlc3QgOiAxOworICB2YWx1ZV90eXBlICAgICAgIFZhbHVlOworICB1aW50MzJfdCAgICAgICAgIERpZ2VzdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnRlcm5hbCBtZXRob2RzIChub2RlIG1hbmlwdWxhdGlvbjsgdXNlZCBieSBGYWN0b3J5KS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHJpdmF0ZToKKyAgLy8vIEltdXRBVkxUcmVlIC0gSW50ZXJuYWwgY29uc3RydWN0b3IgdGhhdCBpcyBvbmx5IGNhbGxlZCBieQorICAvLy8gICBJbXV0QVZMRmFjdG9yeS4KKyAgSW11dEFWTFRyZWUoSW11dEFWTFRyZWUqIGwsIEltdXRBVkxUcmVlKiByLCB2YWx1ZV90eXBlX3JlZiB2LAorICAgICAgICAgICAgICB1bnNpZ25lZCBoZWlnaHQpCisgICAgOiBMZWZ0KGwpLCBSaWdodChyKSwgSGVpZ2h0KGhlaWdodCksIE11dGFibGUodHJ1ZSksIENhY2hlZERpZ2VzdChmYWxzZSksCisgICAgICBWYWx1ZSh2KSwgRGlnZXN0KDApIHt9CisKKyAgLy8vIGlzTXV0YWJsZSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdCBhbmQgcmlnaHQgc3VidHJlZSByZWZlcmVuY2VzCisgIC8vLyAgKGFzIHdlbGwgYXMgaGVpZ2h0KSBjYW4gYmUgY2hhbmdlZC4gIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsCisgIC8vLyAgdGhlIHRyZWUgaXMgdHJ1bHkgaW1tdXRhYmxlLiAgVHJlZXMgcmV0dXJuZWQgZnJvbSBhbiBJbXV0QVZMRmFjdG9yeQorICAvLy8gIG9iamVjdCBzaG91bGQgYWx3YXlzIGhhdmUgdGhpcyBtZXRob2QgcmV0dXJuIHRydWUuICBGdXJ0aGVyLCBpZiB0aGlzCisgIC8vLyAgbWV0aG9kIHJldHVybnMgZmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIEltdXRBVkxUcmVlLCBhbGwgc3VidHJlZXMKKyAgLy8vICB3aWxsIGFsc28gaGF2ZSB0aGlzIG1ldGhvZCByZXR1cm4gZmFsc2UuICBUaGUgY29udmVyc2UgaXMgbm90IHRydWUuCisgIGJvb2wgaXNNdXRhYmxlKCkgY29uc3QgeyByZXR1cm4gTXV0YWJsZTsgfQorICAKKyAgLy8vIGhhc0NhY2hlZERpZ2VzdCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlnZXN0IGZvciB0aGlzIHRyZWUgaXMgY2FjaGVkLgorICAvLy8gIFRoaXMgY2FuIG9ubHkgYmUgdHJ1ZSBpZiB0aGUgdHJlZSBpcyBpbW11dGFibGUuCisgIGJvb2wgaGFzQ2FjaGVkRGlnZXN0KCkgY29uc3QgeyByZXR1cm4gQ2FjaGVkRGlnZXN0OyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTXV0YXRpbmcgb3BlcmF0aW9ucy4gIEEgdHJlZSByb290IGNhbiBiZSBtYW5pcHVsYXRlZCBhcworICAvLyBsb25nIGFzIGl0cyByZWZlcmVuY2UgaGFzIG5vdCAiZXNjYXBlZCIgZnJvbSBpbnRlcm5hbAorICAvLyBtZXRob2RzIG9mIGEgZmFjdG9yeSBvYmplY3QgKHNlZSBiZWxvdykuICBXaGVuIGEgdHJlZQorICAvLyBwb2ludGVyIGlzIGV4dGVybmFsbHkgdmlld2FibGUgYnkgY2xpZW50IGNvZGUsIHRoZQorICAvLyBpbnRlcm5hbCAibXV0YWJsZSBiaXQiIGlzIGNsZWFyZWQgdG8gbWFyayB0aGUgdHJlZQorICAvLyBpbW11dGFibGUuICBOb3RlIHRoYXQgYSB0cmVlIHRoYXQgc3RpbGwgaGFzIGl0cyBtdXRhYmxlCisgIC8vIGJpdCBzZXQgbWF5IGhhdmUgY2hpbGRyZW4gKHN1YnRyZWVzKSB0aGF0IGFyZSB0aGVtc2VsdmVzCisgIC8vIGltbXV0YWJsZS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gTWFya0ltbXV0YWJsZSAtIENsZWFycyB0aGUgbXV0YWJsZSBmbGFnIGZvciBhIHRyZWUuICBBZnRlciB0aGlzIGhhcHBlbnMsCisgIC8vLyAgIGl0IGlzIGFuIGVycm9yIHRvIGNhbGwgc2V0TGVmdCgpLCBzZXRSaWdodCgpLCBhbmQgc2V0SGVpZ2h0KCkuCisgIHZvaWQgTWFya0ltbXV0YWJsZSgpIHsKKyAgICBhc3NlcnQoaXNNdXRhYmxlKCkgJiYgIk11dGFibGUgZmxhZyBhbHJlYWR5IHJlbW92ZWQuIik7CisgICAgTXV0YWJsZSA9IGZhbHNlOworICB9CisgIAorICAvLy8gTWFya2VkQ2FjaGVkRGlnZXN0IC0gQ2xlYXJzIHRoZSBOb0NhY2hlZERpZ2VzdCBmbGFnIGZvciBhIHRyZWUuCisgIHZvaWQgTWFya2VkQ2FjaGVkRGlnZXN0KCkgeworICAgIGFzc2VydCghaGFzQ2FjaGVkRGlnZXN0KCkgJiYgIk5vQ2FjaGVkRGlnZXN0IGZsYWcgYWxyZWFkeSByZW1vdmVkLiIpOworICAgIENhY2hlZERpZ2VzdCA9IHRydWU7CisgIH0KKworICAvLy8gc2V0TGVmdCAtIENoYW5nZXMgdGhlIHJlZmVyZW5jZSBvZiB0aGUgbGVmdCBzdWJ0cmVlLiAgVXNlZCBpbnRlcm5hbGx5CisgIC8vLyAgIGJ5IEltdXRBVkxGYWN0b3J5LgorICB2b2lkIHNldExlZnQoSW11dEFWTFRyZWUqIE5ld0xlZnQpIHsKKyAgICBhc3NlcnQoaXNNdXRhYmxlKCkgJiYKKyAgICAgICAgICAgIk9ubHkgYSBtdXRhYmxlIHRyZWUgY2FuIGhhdmUgaXRzIGxlZnQgc3VidHJlZSBjaGFuZ2VkLiIpOworICAgIExlZnQgPSBOZXdMZWZ0OworICAgIENhY2hlZERpZ2VzdCA9IGZhbHNlOworICB9CisKKyAgLy8vIHNldFJpZ2h0IC0gQ2hhbmdlcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSByaWdodCBzdWJ0cmVlLiAgVXNlZCBpbnRlcm5hbGx5CisgIC8vLyAgYnkgSW11dEFWTEZhY3RvcnkuCisgIHZvaWQgc2V0UmlnaHQoSW11dEFWTFRyZWUqIE5ld1JpZ2h0KSB7CisgICAgYXNzZXJ0KGlzTXV0YWJsZSgpICYmCisgICAgICAgICAgICJPbmx5IGEgbXV0YWJsZSB0cmVlIGNhbiBoYXZlIGl0cyByaWdodCBzdWJ0cmVlIGNoYW5nZWQuIik7CisKKyAgICBSaWdodCA9IE5ld1JpZ2h0OworICAgIENhY2hlZERpZ2VzdCA9IGZhbHNlOworICB9CisKKyAgLy8vIHNldEhlaWdodCAtIENoYW5nZXMgdGhlIGhlaWdodCBvZiB0aGUgdHJlZS4gIFVzZWQgaW50ZXJuYWxseSBieQorICAvLy8gIEltdXRBVkxGYWN0b3J5LgorICB2b2lkIHNldEhlaWdodCh1bnNpZ25lZCBoKSB7CisgICAgYXNzZXJ0KGlzTXV0YWJsZSgpICYmICJPbmx5IGEgbXV0YWJsZSB0cmVlIGNhbiBoYXZlIGl0cyBoZWlnaHQgY2hhbmdlZC4iKTsKKyAgICBIZWlnaHQgPSBoOworICB9CisKKyAgc3RhdGljIGlubGluZQorICB1aW50MzJfdCBDb21wdXRlRGlnZXN0KEltdXRBVkxUcmVlKiBMLCBJbXV0QVZMVHJlZSogUiwgdmFsdWVfdHlwZV9yZWYgVikgeworICAgIHVpbnQzMl90IGRpZ2VzdCA9IDA7CisKKyAgICBpZiAoTCkKKyAgICAgIGRpZ2VzdCArPSBMLT5Db21wdXRlRGlnZXN0KCk7CisKKyAgICAvLyBDb21wdXRlIGRpZ2VzdCBvZiBzdG9yZWQgZGF0YS4KKyAgICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICAgIEltdXRJbmZvOjpQcm9maWxlKElELFYpOworICAgIGRpZ2VzdCArPSBJRC5Db21wdXRlSGFzaCgpOworCisgICAgaWYgKFIpCisgICAgICBkaWdlc3QgKz0gUi0+Q29tcHV0ZURpZ2VzdCgpOworCisgICAgcmV0dXJuIGRpZ2VzdDsKKyAgfQorCisgIGlubGluZSB1aW50MzJfdCBDb21wdXRlRGlnZXN0KCkgeworICAgIC8vIENoZWNrIHRoZSBsb3dlc3QgYml0IHRvIGRldGVybWluZSBpZiBkaWdlc3QgaGFzIGFjdHVhbGx5IGJlZW4KKyAgICAvLyBwcmUtY29tcHV0ZWQuCisgICAgaWYgKGhhc0NhY2hlZERpZ2VzdCgpKQorICAgICAgcmV0dXJuIERpZ2VzdDsKKworICAgIHVpbnQzMl90IFggPSBDb21wdXRlRGlnZXN0KGdldExlZnQoKSwgZ2V0UmlnaHQoKSwgZ2V0VmFsdWUoKSk7CisgICAgRGlnZXN0ID0gWDsKKyAgICBNYXJrZWRDYWNoZWREaWdlc3QoKTsKKyAgICByZXR1cm4gWDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEltbXV0YWJsZSBBVkwtVHJlZSBGYWN0b3J5IGNsYXNzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvID4KK2NsYXNzIEltdXRBVkxGYWN0b3J5IHsKKyAgdHlwZWRlZiBJbXV0QVZMVHJlZTxJbXV0SW5mbz4gVHJlZVR5OworICB0eXBlZGVmIHR5cGVuYW1lIFRyZWVUeTo6dmFsdWVfdHlwZV9yZWYgdmFsdWVfdHlwZV9yZWY7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJlZVR5OjprZXlfdHlwZV9yZWYgICBrZXlfdHlwZV9yZWY7CisKKyAgdHlwZWRlZiBGb2xkaW5nU2V0PFRyZWVUeT4gQ2FjaGVUeTsKKworICBDYWNoZVR5IENhY2hlOworICB1aW50cHRyX3QgQWxsb2NhdG9yOworCisgIGJvb2wgb3duc0FsbG9jYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQWxsb2NhdG9yICYgMHgxID8gZmFsc2UgOiB0cnVlOworICB9CisKKyAgQnVtcFB0ckFsbG9jYXRvciYgZ2V0QWxsb2NhdG9yKCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdW1wUHRyQWxsb2NhdG9yKj4oQWxsb2NhdG9yICYgfjB4MSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3B1YmxpYzoKKyAgSW11dEFWTEZhY3RvcnkoKQorICAgIDogQWxsb2NhdG9yKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihuZXcgQnVtcFB0ckFsbG9jYXRvcigpKSkge30KKworICBJbXV0QVZMRmFjdG9yeShCdW1wUHRyQWxsb2NhdG9yJiBBbGxvYykKKyAgICA6IEFsbG9jYXRvcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oJkFsbG9jKSB8IDB4MSkge30KKworICB+SW11dEFWTEZhY3RvcnkoKSB7CisgICAgaWYgKG93bnNBbGxvY2F0b3IoKSkgZGVsZXRlICZnZXRBbGxvY2F0b3IoKTsKKyAgfQorCisgIFRyZWVUeSogQWRkKFRyZWVUeSogVCwgdmFsdWVfdHlwZV9yZWYgVikgeworICAgIFQgPSBBZGRfaW50ZXJuYWwoVixUKTsKKyAgICBNYXJrSW1tdXRhYmxlKFQpOworICAgIHJldHVybiBUOworICB9CisKKyAgVHJlZVR5KiBSZW1vdmUoVHJlZVR5KiBULCBrZXlfdHlwZV9yZWYgVikgeworICAgIFQgPSBSZW1vdmVfaW50ZXJuYWwoVixUKTsKKyAgICBNYXJrSW1tdXRhYmxlKFQpOworICAgIHJldHVybiBUOworICB9CisKKyAgVHJlZVR5KiBHZXRFbXB0eVRyZWUoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEEgYnVuY2ggb2YgcXVpY2sgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGZvciByZWFzb25pbmcKKyAgLy8gYWJvdXQgdGhlIHByb3BlcnRpZXMgb2YgdHJlZXMgYW5kIHRoZWlyIGNoaWxkcmVuLgorICAvLyBUaGVzZSBoYXZlIHN1Y2NpbmN0IG5hbWVzIHNvIHRoYXQgdGhlIGJhbGFuY2luZyBjb2RlCisgIC8vIGlzIGFzIHRlcnNlIChhbmQgcmVhZGFibGUpIGFzIHBvc3NpYmxlLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK3Byb3RlY3RlZDoKKworICBib29sICAgICAgICAgICBpc0VtcHR5KFRyZWVUeSogVCkgY29uc3QgeyByZXR1cm4gIVQ7IH0KKyAgdW5zaWduZWQgSGVpZ2h0KFRyZWVUeSogVCkgY29uc3QgeyByZXR1cm4gVCA/IFQtPmdldEhlaWdodCgpIDogMDsgfQorICBUcmVlVHkqICAgICAgICAgICBMZWZ0KFRyZWVUeSogVCkgY29uc3QgeyByZXR1cm4gVC0+Z2V0TGVmdCgpOyB9CisgIFRyZWVUeSogICAgICAgICAgUmlnaHQoVHJlZVR5KiBUKSBjb25zdCB7IHJldHVybiBULT5nZXRSaWdodCgpOyB9CisgIHZhbHVlX3R5cGVfcmVmICAgVmFsdWUoVHJlZVR5KiBUKSBjb25zdCB7IHJldHVybiBULT5WYWx1ZTsgfQorCisgIHVuc2lnbmVkIEluY3JlbWVudEhlaWdodChUcmVlVHkqIEwsIFRyZWVUeSogUikgY29uc3QgeworICAgIHVuc2lnbmVkIGhsID0gSGVpZ2h0KEwpOworICAgIHVuc2lnbmVkIGhyID0gSGVpZ2h0KFIpOworICAgIHJldHVybiAoaGwgPiBociA/IGhsIDogaHIpICsgMTsKKyAgfQorCisgIHN0YXRpYyBib29sIENvbXBhcmVUcmVlV2l0aFNlY3Rpb24oVHJlZVR5KiBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyZWVUeTo6aXRlcmF0b3ImIFRJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyZWVUeTo6aXRlcmF0b3ImIFRFKSB7CisKKyAgICB0eXBlbmFtZSBUcmVlVHk6Oml0ZXJhdG9yIEkgPSBULT5iZWdpbigpLCBFID0gVC0+ZW5kKCk7CisKKyAgICBmb3IgKCA7IEkhPUUgOyArK0ksICsrVEkpCisgICAgICBpZiAoVEkgPT0gVEUgfHwgIUktPkVsZW1lbnRFcXVhbCgqVEkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyAiQ3JlYXRlTm9kZSIgaXMgdXNlZCB0byBnZW5lcmF0ZSBuZXcgdHJlZSByb290cyB0aGF0IGxpbmsKKyAgLy8gdG8gb3RoZXIgdHJlZXMuICBUaGUgZnVuY3RvbiBtYXkgYWxzbyBzaW1wbHkgbW92ZSBsaW5rcworICAvLyBpbiBhbiBleGlzdGluZyByb290IGlmIHRoYXQgcm9vdCBpcyBzdGlsbCBtYXJrZWQgbXV0YWJsZS4KKyAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdGhlcndpc2Ugb3VyIGJhbGFuY2luZyBjb2RlCisgIC8vIHdvdWxkIGxlYWsgbWVtb3J5IGFzIGl0IHdvdWxkIGNyZWF0ZSBub2RlcyB0aGF0IGFyZQorICAvLyB0aGVuIGRpc2NhcmRlZCBsYXRlciBiZWZvcmUgdGhlIGZpbmlzaGVkIHRyZWUgaXMKKyAgLy8gcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgVHJlZVR5KiBDcmVhdGVOb2RlKFRyZWVUeSogTCwgdmFsdWVfdHlwZV9yZWYgViwgVHJlZVR5KiBSKSB7ICAgCisgICAgQnVtcFB0ckFsbG9jYXRvciYgQSA9IGdldEFsbG9jYXRvcigpOworICAgIFRyZWVUeSogVCA9IChUcmVlVHkqKSBBLkFsbG9jYXRlPFRyZWVUeT4oKTsKKyAgICBuZXcgKFQpIFRyZWVUeShMLCBSLCBWLCBJbmNyZW1lbnRIZWlnaHQoTCxSKSk7CisgICAgcmV0dXJuIFQ7CisgIH0KKworICBUcmVlVHkqIENyZWF0ZU5vZGUoVHJlZVR5KiBMLCBUcmVlVHkqIE9sZFRyZWUsIFRyZWVUeSogUikgeworICAgIGFzc2VydCghaXNFbXB0eShPbGRUcmVlKSk7CisKKyAgICBpZiAoT2xkVHJlZS0+aXNNdXRhYmxlKCkpIHsKKyAgICAgIE9sZFRyZWUtPnNldExlZnQoTCk7CisgICAgICBPbGRUcmVlLT5zZXRSaWdodChSKTsKKyAgICAgIE9sZFRyZWUtPnNldEhlaWdodChJbmNyZW1lbnRIZWlnaHQoTCwgUikpOworICAgICAgcmV0dXJuIE9sZFRyZWU7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBDcmVhdGVOb2RlKEwsIFZhbHVlKE9sZFRyZWUpLCBSKTsKKyAgfQorCisgIC8vLyBCYWxhbmNlIC0gVXNlZCBieSBBZGRfaW50ZXJuYWwgYW5kIFJlbW92ZV9pbnRlcm5hbCB0bworICAvLy8gIGJhbGFuY2UgYSBuZXdseSBjcmVhdGVkIHRyZWUuCisgIFRyZWVUeSogQmFsYW5jZShUcmVlVHkqIEwsIHZhbHVlX3R5cGVfcmVmIFYsIFRyZWVUeSogUikgeworCisgICAgdW5zaWduZWQgaGwgPSBIZWlnaHQoTCk7CisgICAgdW5zaWduZWQgaHIgPSBIZWlnaHQoUik7CisKKyAgICBpZiAoaGwgPiBociArIDIpIHsKKyAgICAgIGFzc2VydCghaXNFbXB0eShMKSAmJiAiTGVmdCB0cmVlIGNhbm5vdCBiZSBlbXB0eSB0byBoYXZlIGEgaGVpZ2h0ID49IDIiKTsKKworICAgICAgVHJlZVR5KiBMTCA9IExlZnQoTCk7CisgICAgICBUcmVlVHkqIExSID0gUmlnaHQoTCk7CisKKyAgICAgIGlmIChIZWlnaHQoTEwpID49IEhlaWdodChMUikpCisgICAgICAgIHJldHVybiBDcmVhdGVOb2RlKExMLCBMLCBDcmVhdGVOb2RlKExSLFYsUikpOworCisgICAgICBhc3NlcnQoIWlzRW1wdHkoTFIpICYmICJMUiBjYW5ub3QgYmUgZW1wdHkgYmVjYXVzZSBpdCBoYXMgYSBoZWlnaHQgPj0gMSIpOworCisgICAgICBUcmVlVHkqIExSTCA9IExlZnQoTFIpOworICAgICAgVHJlZVR5KiBMUlIgPSBSaWdodChMUik7CisKKyAgICAgIHJldHVybiBDcmVhdGVOb2RlKENyZWF0ZU5vZGUoTEwsTCxMUkwpLCBMUiwgQ3JlYXRlTm9kZShMUlIsVixSKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGhyID4gaGwgKyAyKSB7CisgICAgICBhc3NlcnQoIWlzRW1wdHkoUikgJiYgIlJpZ2h0IHRyZWUgY2Fubm90IGJlIGVtcHR5IHRvIGhhdmUgYSBoZWlnaHQgPj0gMiIpOworCisgICAgICBUcmVlVHkqIFJMID0gTGVmdChSKTsKKyAgICAgIFRyZWVUeSogUlIgPSBSaWdodChSKTsKKworICAgICAgaWYgKEhlaWdodChSUikgPj0gSGVpZ2h0KFJMKSkKKyAgICAgICAgcmV0dXJuIENyZWF0ZU5vZGUoQ3JlYXRlTm9kZShMLFYsUkwpLCBSLCBSUik7CisKKyAgICAgIGFzc2VydCghaXNFbXB0eShSTCkgJiYgIlJMIGNhbm5vdCBiZSBlbXB0eSBiZWNhdXNlIGl0IGhhcyBhIGhlaWdodCA+PSAxIik7CisKKyAgICAgIFRyZWVUeSogUkxMID0gTGVmdChSTCk7CisgICAgICBUcmVlVHkqIFJMUiA9IFJpZ2h0KFJMKTsKKworICAgICAgcmV0dXJuIENyZWF0ZU5vZGUoQ3JlYXRlTm9kZShMLFYsUkxMKSwgUkwsIENyZWF0ZU5vZGUoUkxSLFIsUlIpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIENyZWF0ZU5vZGUoTCxWLFIpOworICB9CisKKyAgLy8vIEFkZF9pbnRlcm5hbCAtIENyZWF0ZXMgYSBuZXcgdHJlZSB0aGF0IGluY2x1ZGVzIHRoZSBzcGVjaWZpZWQKKyAgLy8vICBkYXRhIGFuZCB0aGUgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCB0cmVlLiAgSWYgdGhlIG9yaWdpbmFsIHRyZWUKKyAgLy8vICBhbHJlYWR5IGNvbnRhaW5lZCB0aGUgZGF0YSBpdGVtLCB0aGUgb3JpZ2luYWwgdHJlZSBpcyByZXR1cm5lZC4KKyAgVHJlZVR5KiBBZGRfaW50ZXJuYWwodmFsdWVfdHlwZV9yZWYgViwgVHJlZVR5KiBUKSB7CisgICAgaWYgKGlzRW1wdHkoVCkpCisgICAgICByZXR1cm4gQ3JlYXRlTm9kZShULCBWLCBUKTsKKworICAgIGFzc2VydCghVC0+aXNNdXRhYmxlKCkpOworCisgICAga2V5X3R5cGVfcmVmIEsgPSBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShWKTsKKyAgICBrZXlfdHlwZV9yZWYgS0N1cnJlbnQgPSBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShWYWx1ZShUKSk7CisKKyAgICBpZiAoSW11dEluZm86OmlzRXF1YWwoSyxLQ3VycmVudCkpCisgICAgICByZXR1cm4gQ3JlYXRlTm9kZShMZWZ0KFQpLCBWLCBSaWdodChUKSk7CisgICAgZWxzZSBpZiAoSW11dEluZm86OmlzTGVzcyhLLEtDdXJyZW50KSkKKyAgICAgIHJldHVybiBCYWxhbmNlKEFkZF9pbnRlcm5hbChWLExlZnQoVCkpLCBWYWx1ZShUKSwgUmlnaHQoVCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBCYWxhbmNlKExlZnQoVCksIFZhbHVlKFQpLCBBZGRfaW50ZXJuYWwoVixSaWdodChUKSkpOworICB9CisKKyAgLy8vIFJlbW92ZV9pbnRlcm5hbCAtIENyZWF0ZXMgYSBuZXcgdHJlZSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgZGF0YQorICAvLy8gIGZyb20gdGhlIG9yaWdpbmFsIHRyZWUgZXhjZXB0IHRoZSBzcGVjaWZpZWQgZGF0YS4gIElmIHRoZQorICAvLy8gIHNwZWNpZmllZCBkYXRhIGRpZCBub3QgZXhpc3QgaW4gdGhlIG9yaWdpbmFsIHRyZWUsIHRoZSBvcmlnaW5hbAorICAvLy8gIHRyZWUgaXMgcmV0dXJuZWQuCisgIFRyZWVUeSogUmVtb3ZlX2ludGVybmFsKGtleV90eXBlX3JlZiBLLCBUcmVlVHkqIFQpIHsKKyAgICBpZiAoaXNFbXB0eShUKSkKKyAgICAgIHJldHVybiBUOworCisgICAgYXNzZXJ0KCFULT5pc011dGFibGUoKSk7CisKKyAgICBrZXlfdHlwZV9yZWYgS0N1cnJlbnQgPSBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShWYWx1ZShUKSk7CisKKyAgICBpZiAoSW11dEluZm86OmlzRXF1YWwoSyxLQ3VycmVudCkpCisgICAgICByZXR1cm4gQ29tYmluZUxlZnRSaWdodFRyZWVzKExlZnQoVCksUmlnaHQoVCkpOworICAgIGVsc2UgaWYgKEltdXRJbmZvOjppc0xlc3MoSyxLQ3VycmVudCkpCisgICAgICByZXR1cm4gQmFsYW5jZShSZW1vdmVfaW50ZXJuYWwoSyxMZWZ0KFQpKSwgVmFsdWUoVCksIFJpZ2h0KFQpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQmFsYW5jZShMZWZ0KFQpLCBWYWx1ZShUKSwgUmVtb3ZlX2ludGVybmFsKEssUmlnaHQoVCkpKTsKKyAgfQorCisgIFRyZWVUeSogQ29tYmluZUxlZnRSaWdodFRyZWVzKFRyZWVUeSogTCwgVHJlZVR5KiBSKSB7CisgICAgaWYgKGlzRW1wdHkoTCkpIHJldHVybiBSOworICAgIGlmIChpc0VtcHR5KFIpKSByZXR1cm4gTDsKKworICAgIFRyZWVUeSogT2xkTm9kZTsKKyAgICBUcmVlVHkqIE5ld1JpZ2h0ID0gUmVtb3ZlTWluQmluZGluZyhSLE9sZE5vZGUpOworICAgIHJldHVybiBCYWxhbmNlKEwsVmFsdWUoT2xkTm9kZSksTmV3UmlnaHQpOworICB9CisKKyAgVHJlZVR5KiBSZW1vdmVNaW5CaW5kaW5nKFRyZWVUeSogVCwgVHJlZVR5KiYgTm9kZVJlbW92ZWQpIHsKKyAgICBhc3NlcnQoIWlzRW1wdHkoVCkpOworCisgICAgaWYgKGlzRW1wdHkoTGVmdChUKSkpIHsKKyAgICAgIE5vZGVSZW1vdmVkID0gVDsKKyAgICAgIHJldHVybiBSaWdodChUKTsKKyAgICB9CisKKyAgICByZXR1cm4gQmFsYW5jZShSZW1vdmVNaW5CaW5kaW5nKExlZnQoVCksTm9kZVJlbW92ZWQpLFZhbHVlKFQpLFJpZ2h0KFQpKTsKKyAgfQorCisgIC8vLyBNYXJrSW1tdXRhYmxlIC0gQ2xlYXJzIHRoZSBtdXRhYmxlIGJpdHMgb2YgYSByb290IGFuZCBhbGwgb2YgaXRzCisgIC8vLyAgZGVzY2VuZGFudHMuCisgIHZvaWQgTWFya0ltbXV0YWJsZShUcmVlVHkqIFQpIHsKKyAgICBpZiAoIVQgfHwgIVQtPmlzTXV0YWJsZSgpKQorICAgICAgcmV0dXJuOworCisgICAgVC0+TWFya0ltbXV0YWJsZSgpOworICAgIE1hcmtJbW11dGFibGUoTGVmdChUKSk7CisgICAgTWFya0ltbXV0YWJsZShSaWdodChUKSk7CisgIH0KKyAgCitwdWJsaWM6CisgIFRyZWVUeSAqR2V0Q2Fub25pY2FsVHJlZShUcmVlVHkgKlROZXcpIHsKKyAgICBpZiAoIVROZXcpCisgICAgICByZXR1cm4gTlVMTDsgICAgCisgICAgCisgICAgLy8gU2VhcmNoIHRoZSBGb2xkaW5nU2V0IGJ1Y2tldCBmb3IgYSBUcmVlIHdpdGggdGhlIHNhbWUgZGlnZXN0LgorICAgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgICAgdW5zaWduZWQgZGlnZXN0ID0gVE5ldy0+Q29tcHV0ZURpZ2VzdCgpOworICAgIElELkFkZEludGVnZXIoZGlnZXN0KTsKKyAgICB1bnNpZ25lZCBoYXNoID0gSUQuQ29tcHV0ZUhhc2goKTsKKyAgICAKKyAgICB0eXBlbmFtZSBDYWNoZVR5OjpidWNrZXRfaXRlcmF0b3IgSSA9IENhY2hlLmJ1Y2tldF9iZWdpbihoYXNoKTsKKyAgICB0eXBlbmFtZSBDYWNoZVR5OjpidWNrZXRfaXRlcmF0b3IgRSA9IENhY2hlLmJ1Y2tldF9lbmQoaGFzaCk7CisgICAgCisgICAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgICBUcmVlVHkgKlQgPSAmKkk7CisgICAgICAKKyAgICAgIGlmIChULT5Db21wdXRlRGlnZXN0KCkgIT0gZGlnZXN0KQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgLy8gV2UgZm91bmQgYSBjb2xsaXNpb24uICBQZXJmb3JtIGEgY29tcGFyaXNvbiBvZiBDb250ZW50cygnVCcpCisgICAgICAvLyB3aXRoIENvbnRlbnRzKCdUTmV3JykKKyAgICAgIHR5cGVuYW1lIFRyZWVUeTo6aXRlcmF0b3IgVEkgPSBULT5iZWdpbigpLCBURSA9IFQtPmVuZCgpOworICAgICAgCisgICAgICBpZiAoIUNvbXBhcmVUcmVlV2l0aFNlY3Rpb24oVE5ldywgVEksIFRFKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIGlmIChUSSAhPSBURSkKKyAgICAgICAgY29udGludWU7IC8vIFQgaGFzIG1vcmUgY29udGVudHMgdGhhbiBUTmV3LgorICAgICAgCisgICAgICAvLyBUcmVlcyBkaWQgbWF0Y2ghICBSZXR1cm4gJ1QnLgorICAgICAgcmV0dXJuIFQ7CisgICAgfQorCisgICAgLy8gJ1ROZXcnIGlzIHRoZSBvbmx5IHRyZWUgb2YgaXRzIGtpbmQuICBSZXR1cm4gaXQuCisgICAgQ2FjaGUuSW5zZXJ0Tm9kZShUTmV3LCAodm9pZCopICYqQ2FjaGUuYnVja2V0X2VuZChoYXNoKSk7CisgICAgcmV0dXJuIFROZXc7CisgIH0KK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEltbXV0YWJsZSBBVkwtVHJlZSBJdGVyYXRvcnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW11dEluZm8+CitjbGFzcyBJbXV0QVZMVHJlZUdlbmVyaWNJdGVyYXRvciB7CisgIFNtYWxsVmVjdG9yPHVpbnRwdHJfdCwyMD4gc3RhY2s7CitwdWJsaWM6CisgIGVudW0gVmlzaXRGbGFnIHsgVmlzaXRlZE5vbmU9MHgwLCBWaXNpdGVkTGVmdD0weDEsIFZpc2l0ZWRSaWdodD0weDMsCisgICAgICAgICAgICAgICAgICAgRmxhZ3M9MHgzIH07CisKKyAgdHlwZWRlZiBJbXV0QVZMVHJlZTxJbXV0SW5mbz4gVHJlZVR5OworICB0eXBlZGVmIEltdXRBVkxUcmVlR2VuZXJpY0l0ZXJhdG9yPEltdXRJbmZvPiBfU2VsZjsKKworICBpbmxpbmUgSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3IoKSB7fQorICBpbmxpbmUgSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3IoY29uc3QgVHJlZVR5KiBSb290KSB7CisgICAgaWYgKFJvb3QpIHN0YWNrLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUm9vdCkpOworICB9CisKKyAgVHJlZVR5KiBvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KCFzdGFjay5lbXB0eSgpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUcmVlVHkqPihzdGFjay5iYWNrKCkgJiB+RmxhZ3MpOworICB9CisKKyAgdWludHB0cl90IGdldFZpc2l0U3RhdGUoKSB7CisgICAgYXNzZXJ0KCFzdGFjay5lbXB0eSgpKTsKKyAgICByZXR1cm4gc3RhY2suYmFjaygpICYgRmxhZ3M7CisgIH0KKworCisgIGJvb2wgQXRFbmQoKSBjb25zdCB7IHJldHVybiBzdGFjay5lbXB0eSgpOyB9CisKKyAgYm9vbCBBdEJlZ2lubmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhY2suc2l6ZSgpID09IDEgJiYgZ2V0VmlzaXRTdGF0ZSgpID09IFZpc2l0ZWROb25lOworICB9CisKKyAgdm9pZCBTa2lwVG9QYXJlbnQoKSB7CisgICAgYXNzZXJ0KCFzdGFjay5lbXB0eSgpKTsKKyAgICBzdGFjay5wb3BfYmFjaygpOworCisgICAgaWYgKHN0YWNrLmVtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICBzd2l0Y2ggKGdldFZpc2l0U3RhdGUoKSkgeworICAgICAgY2FzZSBWaXNpdGVkTm9uZToKKyAgICAgICAgc3RhY2suYmFjaygpIHw9IFZpc2l0ZWRMZWZ0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVmlzaXRlZExlZnQ6CisgICAgICAgIHN0YWNrLmJhY2soKSB8PSBWaXNpdGVkUmlnaHQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbnJlYWNoYWJsZS4iKTsKKyAgICB9CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJiB4KSBjb25zdCB7CisgICAgaWYgKHN0YWNrLnNpemUoKSAhPSB4LnN0YWNrLnNpemUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAgOyBpIDwgc3RhY2suc2l6ZSgpOyBpKyspCisgICAgICBpZiAoc3RhY2tbaV0gIT0geC5zdGFja1tpXSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9TZWxmJiB4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeworICAgIGFzc2VydCghc3RhY2suZW1wdHkoKSk7CisKKyAgICBUcmVlVHkqIEN1cnJlbnQgPSByZWludGVycHJldF9jYXN0PFRyZWVUeSo+KHN0YWNrLmJhY2soKSAmIH5GbGFncyk7CisgICAgYXNzZXJ0KEN1cnJlbnQpOworCisgICAgc3dpdGNoIChnZXRWaXNpdFN0YXRlKCkpIHsKKyAgICAgIGNhc2UgVmlzaXRlZE5vbmU6CisgICAgICAgIGlmIChUcmVlVHkqIEwgPSBDdXJyZW50LT5nZXRMZWZ0KCkpCisgICAgICAgICAgc3RhY2sucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihMKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdGFjay5iYWNrKCkgfD0gVmlzaXRlZExlZnQ7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVmlzaXRlZExlZnQ6CisgICAgICAgIGlmIChUcmVlVHkqIFIgPSBDdXJyZW50LT5nZXRSaWdodCgpKQorICAgICAgICAgIHN0YWNrLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUikpOworICAgICAgICBlbHNlCisgICAgICAgICAgc3RhY2suYmFjaygpIHw9IFZpc2l0ZWRSaWdodDsKKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBWaXNpdGVkUmlnaHQ6CisgICAgICAgIFNraXBUb1BhcmVudCgpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbnJlYWNoYWJsZS4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKKyAgICBhc3NlcnQoIXN0YWNrLmVtcHR5KCkpOworCisgICAgVHJlZVR5KiBDdXJyZW50ID0gcmVpbnRlcnByZXRfY2FzdDxUcmVlVHkqPihzdGFjay5iYWNrKCkgJiB+RmxhZ3MpOworICAgIGFzc2VydChDdXJyZW50KTsKKworICAgIHN3aXRjaCAoZ2V0VmlzaXRTdGF0ZSgpKSB7CisgICAgICBjYXNlIFZpc2l0ZWROb25lOgorICAgICAgICBzdGFjay5wb3BfYmFjaygpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBWaXNpdGVkTGVmdDoKKyAgICAgICAgc3RhY2suYmFjaygpICY9IH5GbGFnczsgLy8gU2V0IHN0YXRlIHRvICJWaXNpdGVkTm9uZS4iCisKKyAgICAgICAgaWYgKFRyZWVUeSogTCA9IEN1cnJlbnQtPmdldExlZnQoKSkKKyAgICAgICAgICBzdGFjay5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KEwpIHwgVmlzaXRlZFJpZ2h0KTsKKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBWaXNpdGVkUmlnaHQ6CisgICAgICAgIHN0YWNrLmJhY2soKSAmPSB+RmxhZ3M7CisgICAgICAgIHN0YWNrLmJhY2soKSB8PSBWaXNpdGVkTGVmdDsKKworICAgICAgICBpZiAoVHJlZVR5KiBSID0gQ3VycmVudC0+Z2V0UmlnaHQoKSkKKyAgICAgICAgICBzdGFjay5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFIpIHwgVmlzaXRlZFJpZ2h0KTsKKworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbnJlYWNoYWJsZS4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXV0SW5mbz4KK2NsYXNzIEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yIHsKKyAgdHlwZWRlZiBJbXV0QVZMVHJlZUdlbmVyaWNJdGVyYXRvcjxJbXV0SW5mbz4gSW50ZXJuYWxJdGVyYXRvclR5OworICBJbnRlcm5hbEl0ZXJhdG9yVHkgSW50ZXJuYWxJdHI7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBJbXV0QVZMVHJlZTxJbXV0SW5mbz4gVHJlZVR5OworICB0eXBlZGVmIEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yPEltdXRJbmZvPiBfU2VsZjsKKworICBJbXV0QVZMVHJlZUluT3JkZXJJdGVyYXRvcihjb25zdCBUcmVlVHkqIFJvb3QpIDogSW50ZXJuYWxJdHIoUm9vdCkgeworICAgIGlmIChSb290KSBvcGVyYXRvcisrKCk7IC8vIEFkdmFuY2UgdG8gZmlyc3QgZWxlbWVudC4KKyAgfQorCisgIEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yKCkgOiBJbnRlcm5hbEl0cigpIHt9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfU2VsZiYgeCkgY29uc3QgeworICAgIHJldHVybiBJbnRlcm5hbEl0ciA9PSB4LkludGVybmFsSXRyOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICBpbmxpbmUgVHJlZVR5KiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqSW50ZXJuYWxJdHI7IH0KKyAgaW5saW5lIFRyZWVUeSogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICpJbnRlcm5hbEl0cjsgfQorCisgIGlubGluZSBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICBkbyArK0ludGVybmFsSXRyOworICAgIHdoaWxlICghSW50ZXJuYWxJdHIuQXRFbmQoKSAmJgorICAgICAgICAgICBJbnRlcm5hbEl0ci5nZXRWaXNpdFN0YXRlKCkgIT0gSW50ZXJuYWxJdGVyYXRvclR5OjpWaXNpdGVkTGVmdCk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgX1NlbGYmIG9wZXJhdG9yLS0oKSB7CisgICAgZG8gLS1JbnRlcm5hbEl0cjsKKyAgICB3aGlsZSAoIUludGVybmFsSXRyLkF0QmVnaW5uaW5nKCkgJiYKKyAgICAgICAgICAgSW50ZXJuYWxJdHIuZ2V0VmlzaXRTdGF0ZSgpICE9IEludGVybmFsSXRlcmF0b3JUeTo6VmlzaXRlZExlZnQpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIHZvaWQgU2tpcFN1YlRyZWUoKSB7CisgICAgSW50ZXJuYWxJdHIuU2tpcFRvUGFyZW50KCk7CisKKyAgICB3aGlsZSAoIUludGVybmFsSXRyLkF0RW5kKCkgJiYKKyAgICAgICAgICAgSW50ZXJuYWxJdHIuZ2V0VmlzaXRTdGF0ZSgpICE9IEludGVybmFsSXRlcmF0b3JUeTo6VmlzaXRlZExlZnQpCisgICAgICArK0ludGVybmFsSXRyOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVHJhaXQgY2xhc3NlcyBmb3IgUHJvZmlsZSBpbmZvcm1hdGlvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBHZW5lcmljIHByb2ZpbGUgdGVtcGxhdGUuICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBpbnZva2UgdGhlCisvLy8gcHJvZmlsZSBtZXRob2Qgb2YgYW4gb2JqZWN0LiAgU3BlY2lhbGl6YXRpb25zIGZvciBwcmltaXRpdmUgaW50ZWdlcnMKKy8vLyBhbmQgZ2VuZXJpYyBoYW5kbGluZyBvZiBwb2ludGVycyBpcyBkb25lIGJlbG93LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW11dFByb2ZpbGVJbmZvIHsKKyAgdHlwZWRlZiBjb25zdCBUICB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbnN0IFQmIHZhbHVlX3R5cGVfcmVmOworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElELCB2YWx1ZV90eXBlX3JlZiBYKSB7CisgICAgRm9sZGluZ1NldFRyYWl0PFQ+OjpQcm9maWxlKFgsSUQpOworICB9Cit9OworCisvLy8gUHJvZmlsZSB0cmFpdHMgZm9yIGludGVnZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW11dFByb2ZpbGVJbnRlZ2VyIHsKKyAgdHlwZWRlZiBjb25zdCBUICB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbnN0IFQmIHZhbHVlX3R5cGVfcmVmOworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElELCB2YWx1ZV90eXBlX3JlZiBYKSB7CisgICAgSUQuQWRkSW50ZWdlcihYKTsKKyAgfQorfTsKKworI2RlZmluZSBQUk9GSUxFX0lOVEVHRVJfSU5GTyhYKVwKK3RlbXBsYXRlPD4gc3RydWN0IEltdXRQcm9maWxlSW5mbzxYPiA6IEltdXRQcm9maWxlSW50ZWdlcjxYPiB7fTsKKworUFJPRklMRV9JTlRFR0VSX0lORk8oY2hhcikKK1BST0ZJTEVfSU5URUdFUl9JTkZPKHVuc2lnbmVkIGNoYXIpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyhzaG9ydCkKK1BST0ZJTEVfSU5URUdFUl9JTkZPKHVuc2lnbmVkIHNob3J0KQorUFJPRklMRV9JTlRFR0VSX0lORk8odW5zaWduZWQpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyhzaWduZWQpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyhsb25nKQorUFJPRklMRV9JTlRFR0VSX0lORk8odW5zaWduZWQgbG9uZykKK1BST0ZJTEVfSU5URUdFUl9JTkZPKGxvbmcgbG9uZykKK1BST0ZJTEVfSU5URUdFUl9JTkZPKHVuc2lnbmVkIGxvbmcgbG9uZykKKworI3VuZGVmIFBST0ZJTEVfSU5URUdFUl9JTkZPCisKKy8vLyBHZW5lcmljIHByb2ZpbGUgdHJhaXQgZm9yIHBvaW50ZXIgdHlwZXMuICBXZSB0cmVhdCBwb2ludGVycyBhcworLy8vIHJlZmVyZW5jZXMgdG8gdW5pcXVlIG9iamVjdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbXV0UHJvZmlsZUluZm88VCo+IHsKKyAgdHlwZWRlZiBjb25zdCBUKiAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSB2YWx1ZV90eXBlX3JlZjsKKworICBzdGF0aWMgaW5saW5lIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdmFsdWVfdHlwZV9yZWYgWCkgeworICAgIElELkFkZFBvaW50ZXIoWCk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUcmFpdCBjbGFzc2VzIHRoYXQgY29udGFpbiBlbGVtZW50IGNvbXBhcmlzb24gb3BlcmF0b3JzIGFuZCB0eXBlCisvLyAgZGVmaW5pdGlvbnMgdXNlZCBieSBJbXV0QVZMVHJlZSwgSW1tdXRhYmxlU2V0LCBhbmQgSW1tdXRhYmxlTWFwLiAgVGhlc2UKKy8vICBpbmhlcml0IGZyb20gdGhlIHByb2ZpbGUgdHJhaXRzIChJbXV0UHJvZmlsZUluZm8pIHRvIGluY2x1ZGUgb3BlcmF0aW9ucworLy8gIGZvciBlbGVtZW50IHByb2ZpbGluZy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8vIEltdXRDb250YWluZXJJbmZvIC0gR2VuZXJpYyBkZWZpbml0aW9uIG9mIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBmb3IKKy8vLyAgIGVsZW1lbnRzIG9mIGltbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZGVmYXVsdHMgdG8gdXNpbmcKKy8vLyAgIHN0ZDo6ZXF1YWxfdG88PiBhbmQgc3RkOjpsZXNzPD4gdG8gcGVyZm9ybSBjb21wYXJpc29uIG9mIGVsZW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW11dENvbnRhaW5lckluZm8gOiBwdWJsaWMgSW11dFByb2ZpbGVJbmZvPFQ+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbXV0UHJvZmlsZUluZm88VD46OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEltdXRQcm9maWxlSW5mbzxUPjo6dmFsdWVfdHlwZV9yZWYgIHZhbHVlX3R5cGVfcmVmOworICB0eXBlZGVmIHZhbHVlX3R5cGUgICAgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlX3JlZiAga2V5X3R5cGVfcmVmOworICB0eXBlZGVmIGJvb2wgICAgICAgICAgICBkYXRhX3R5cGU7CisgIHR5cGVkZWYgYm9vbCAgICAgICAgICAgIGRhdGFfdHlwZV9yZWY7CisKKyAgc3RhdGljIGlubGluZSBrZXlfdHlwZV9yZWYgS2V5T2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZiBEKSB7IHJldHVybiBEOyB9CisgIHN0YXRpYyBpbmxpbmUgZGF0YV90eXBlX3JlZiBEYXRhT2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZikgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0VxdWFsKGtleV90eXBlX3JlZiBMSFMsIGtleV90eXBlX3JlZiBSSFMpIHsKKyAgICByZXR1cm4gc3RkOjplcXVhbF90bzxrZXlfdHlwZT4oKShMSFMsUkhTKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0xlc3Moa2V5X3R5cGVfcmVmIExIUywga2V5X3R5cGVfcmVmIFJIUykgeworICAgIHJldHVybiBzdGQ6Omxlc3M8a2V5X3R5cGU+KCkoTEhTLFJIUyk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNEYXRhRXF1YWwoZGF0YV90eXBlX3JlZixkYXRhX3R5cGVfcmVmKSB7IHJldHVybiB0cnVlOyB9Cit9OworCisvLy8gSW11dENvbnRhaW5lckluZm8gLSBTcGVjaWFsaXphdGlvbiBmb3IgcG9pbnRlciB2YWx1ZXMgdG8gdHJlYXQgcG9pbnRlcnMKKy8vLyAgYXMgcmVmZXJlbmNlcyB0byB1bmlxdWUgb2JqZWN0cy4gIFBvaW50ZXJzIGFyZSB0aHVzIGNvbXBhcmVkIGJ5CisvLy8gIHRoZWlyIGFkZHJlc3Nlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEltdXRDb250YWluZXJJbmZvPFQqPiA6IHB1YmxpYyBJbXV0UHJvZmlsZUluZm88VCo+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbXV0UHJvZmlsZUluZm88VCo+Ojp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbXV0UHJvZmlsZUluZm88VCo+Ojp2YWx1ZV90eXBlX3JlZiAgdmFsdWVfdHlwZV9yZWY7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSAgICAgIGtleV90eXBlOworICB0eXBlZGVmIHZhbHVlX3R5cGVfcmVmICBrZXlfdHlwZV9yZWY7CisgIHR5cGVkZWYgYm9vbCAgICAgICAgICAgIGRhdGFfdHlwZTsKKyAgdHlwZWRlZiBib29sICAgICAgICAgICAgZGF0YV90eXBlX3JlZjsKKworICBzdGF0aWMgaW5saW5lIGtleV90eXBlX3JlZiBLZXlPZlZhbHVlKHZhbHVlX3R5cGVfcmVmIEQpIHsgcmV0dXJuIEQ7IH0KKyAgc3RhdGljIGlubGluZSBkYXRhX3R5cGVfcmVmIERhdGFPZlZhbHVlKHZhbHVlX3R5cGVfcmVmKSB7IHJldHVybiB0cnVlOyB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGlzRXF1YWwoa2V5X3R5cGVfcmVmIExIUywga2V5X3R5cGVfcmVmIFJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGlzTGVzcyhrZXlfdHlwZV9yZWYgTEhTLCBrZXlfdHlwZV9yZWYgUkhTKSB7CisgICAgcmV0dXJuIExIUyA8IFJIUzsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0RhdGFFcXVhbChkYXRhX3R5cGVfcmVmLGRhdGFfdHlwZV9yZWYpIHsgcmV0dXJuIHRydWU7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbW11dGFibGUgU2V0CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsVCwgdHlwZW5hbWUgVmFsSW5mbyA9IEltdXRDb250YWluZXJJbmZvPFZhbFQ+ID4KK2NsYXNzIEltbXV0YWJsZVNldCB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZV9yZWYgIHZhbHVlX3R5cGVfcmVmOworICB0eXBlZGVmIEltdXRBVkxUcmVlPFZhbEluZm8+IFRyZWVUeTsKKworcHJpdmF0ZToKKyAgVHJlZVR5ICpSb290OworICAKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYSBzZXQgZnJvbSBhIHBvaW50ZXIgdG8gYSB0cmVlIHJvb3QuICBJbiBnZW5lcmFsIG9uZQorICAvLy8gc2hvdWxkIHVzZSBhIEZhY3Rvcnkgb2JqZWN0IHRvIGNyZWF0ZSBzZXRzIGluc3RlYWQgb2YgZGlyZWN0bHkKKyAgLy8vIGludm9raW5nIHRoZSBjb25zdHJ1Y3RvciwgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBtYWtlIHRoaXMKKyAgLy8vIGNvbnN0cnVjdG9yIHB1YmxpYyBpcyB1c2VmdWwuCisgIGV4cGxpY2l0IEltbXV0YWJsZVNldChUcmVlVHkqIFIpIDogUm9vdChSKSB7fQorCisgIGNsYXNzIEZhY3RvcnkgeworICAgIHR5cGVuYW1lIFRyZWVUeTo6RmFjdG9yeSBGOworICAgIGNvbnN0IGJvb2wgQ2Fub25pY2FsaXplOworCisgIHB1YmxpYzoKKyAgICBGYWN0b3J5KGJvb2wgY2Fub25pY2FsaXplID0gdHJ1ZSkKKyAgICAgIDogQ2Fub25pY2FsaXplKGNhbm9uaWNhbGl6ZSkge30KKworICAgIEZhY3RvcnkoQnVtcFB0ckFsbG9jYXRvciYgQWxsb2MsIGJvb2wgY2Fub25pY2FsaXplID0gdHJ1ZSkKKyAgICAgIDogRihBbGxvYyksIENhbm9uaWNhbGl6ZShjYW5vbmljYWxpemUpIHt9CisKKyAgICAvLy8gR2V0RW1wdHlTZXQgLSBSZXR1cm5zIGFuIGltbXV0YWJsZSBzZXQgdGhhdCBjb250YWlucyBubyBlbGVtZW50cy4KKyAgICBJbW11dGFibGVTZXQgR2V0RW1wdHlTZXQoKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0KEYuR2V0RW1wdHlUcmVlKCkpOworICAgIH0KKworICAgIC8vLyBBZGQgLSBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSBzZXQgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHZhbHVlcworICAgIC8vLyAgb2YgdGhlIG9yaWdpbmFsIHNldCB3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLiAgSWYKKyAgICAvLy8gIHRoZSBvcmlnaW5hbCBzZXQgYWxyZWFkeSBpbmNsdWRlZCB0aGUgdmFsdWUsIHRoZW4gdGhlIG9yaWdpbmFsIHNldCBpcworICAgIC8vLyAgcmV0dXJuZWQgYW5kIG5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQuICBUaGUgdGltZSBhbmQgc3BhY2UgY29tcGxleGl0eQorICAgIC8vLyAgb2YgdGhpcyBvcGVyYXRpb24gaXMgbG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsIHNldC4KKyAgICAvLy8gIFRoZSBtZW1vcnkgYWxsb2NhdGVkIHRvIHJlcHJlc2VudCB0aGUgc2V0IGlzIHJlbGVhc2VkIHdoZW4gdGhlCisgICAgLy8vICBmYWN0b3J5IG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhlIHNldCBpcyBkZXN0cm95ZWQuCisgICAgSW1tdXRhYmxlU2V0IEFkZChJbW11dGFibGVTZXQgT2xkLCB2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgICBUcmVlVHkgKk5ld1QgPSBGLkFkZChPbGQuUm9vdCwgVik7CisgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0KENhbm9uaWNhbGl6ZSA/IEYuR2V0Q2Fub25pY2FsVHJlZShOZXdUKSA6IE5ld1QpOworICAgIH0KKworICAgIC8vLyBSZW1vdmUgLSBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSBzZXQgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHZhbHVlcworICAgIC8vLyAgb2YgdGhlIG9yaWdpbmFsIHNldCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmCisgICAgLy8vICB0aGUgb3JpZ2luYWwgc2V0IGRpZCBub3QgY29udGFpbiB0aGUgdmFsdWUsIHRoZSBvcmlnaW5hbCBzZXQgaXMKKyAgICAvLy8gIHJldHVybmVkIGFuZCBubyBtZW1vcnkgaXMgYWxsb2NhdGVkLiAgVGhlIHRpbWUgYW5kIHNwYWNlIGNvbXBsZXhpdHkKKyAgICAvLy8gIG9mIHRoaXMgb3BlcmF0aW9uIGlzIGxvZ2FyaXRobWljIGluIHRoZSBzaXplIG9mIHRoZSBvcmlnaW5hbCBzZXQuCisgICAgLy8vICBUaGUgbWVtb3J5IGFsbG9jYXRlZCB0byByZXByZXNlbnQgdGhlIHNldCBpcyByZWxlYXNlZCB3aGVuIHRoZQorICAgIC8vLyAgZmFjdG9yeSBvYmplY3QgdGhhdCBjcmVhdGVkIHRoZSBzZXQgaXMgZGVzdHJveWVkLgorICAgIEltbXV0YWJsZVNldCBSZW1vdmUoSW1tdXRhYmxlU2V0IE9sZCwgdmFsdWVfdHlwZV9yZWYgVikgeworICAgICAgVHJlZVR5ICpOZXdUID0gRi5SZW1vdmUoT2xkLlJvb3QsIFYpOworICAgICAgcmV0dXJuIEltbXV0YWJsZVNldChDYW5vbmljYWxpemUgPyBGLkdldENhbm9uaWNhbFRyZWUoTmV3VCkgOiBOZXdUKTsKKyAgICB9CisKKyAgICBCdW1wUHRyQWxsb2NhdG9yJiBnZXRBbGxvY2F0b3IoKSB7IHJldHVybiBGLmdldEFsbG9jYXRvcigpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBGYWN0b3J5KGNvbnN0IEZhY3RvcnkmIFJIUyk7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBGYWN0b3J5JiBSSFMpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisgIH07CisKKyAgZnJpZW5kIGNsYXNzIEZhY3Rvcnk7CisKKyAgLy8vIGNvbnRhaW5zIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzZXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgYm9vbCBjb250YWlucyh2YWx1ZV90eXBlX3JlZiBWKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgPyBSb290LT5jb250YWlucyhWKSA6IGZhbHNlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KEltbXV0YWJsZVNldCBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCAmJiBSSFMuUm9vdCA/IFJvb3QtPmlzRXF1YWwoKlJIUy5Sb290KSA6IFJvb3QgPT0gUkhTLlJvb3Q7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oSW1tdXRhYmxlU2V0IFJIUykgY29uc3QgeworICAgIHJldHVybiBSb290ICYmIFJIUy5Sb290ID8gUm9vdC0+aXNOb3RFcXVhbCgqUkhTLlJvb3QpIDogUm9vdCAhPSBSSFMuUm9vdDsKKyAgfQorCisgIFRyZWVUeSAqZ2V0Um9vdCgpIHsgCisgICAgcmV0dXJuIFJvb3Q7CisgIH0KKworICAvLy8gaXNFbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZSBzZXQgY29udGFpbnMgbm8gZWxlbWVudHMuCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFSb290OyB9CisKKyAgLy8vIGlzU2luZ2xldG9uIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNldCBjb250YWlucyBleGFjdGx5IG9uZSBlbGVtZW50LgorICAvLy8gICBUaGlzIG1ldGhvZCBydW5zIGluIGNvbnN0YW50IHRpbWUuCisgIGJvb2wgaXNTaW5nbGV0b24oKSBjb25zdCB7IHJldHVybiBnZXRIZWlnaHQoKSA9PSAxOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxiYWNrPgorICB2b2lkIGZvcmVhY2goQ2FsbGJhY2smIEMpIHsgaWYgKFJvb3QpIFJvb3QtPmZvcmVhY2goQyk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2s+CisgIHZvaWQgZm9yZWFjaCgpIHsgaWYgKFJvb3QpIHsgQ2FsbGJhY2sgQzsgUm9vdC0+Zm9yZWFjaChDKTsgfSB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEl0ZXJhdG9ycy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgY2xhc3MgaXRlcmF0b3IgeworICAgIHR5cGVuYW1lIFRyZWVUeTo6aXRlcmF0b3IgaXRyOworICAgIGl0ZXJhdG9yKFRyZWVUeSogdCkgOiBpdHIodCkge30KKyAgICBmcmllbmQgY2xhc3MgSW1tdXRhYmxlU2V0PFZhbFQsVmFsSW5mbz47CisgIHB1YmxpYzoKKyAgICBpdGVyYXRvcigpIHt9CisgICAgaW5saW5lIHZhbHVlX3R5cGVfcmVmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGl0ci0+Z2V0VmFsdWUoKTsgfQorICAgIGlubGluZSBpdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgKytpdHI7IHJldHVybiAqdGhpczsgfQorICAgIGlubGluZSBpdGVyYXRvciAgb3BlcmF0b3IrKyhpbnQpIHsgaXRlcmF0b3IgdG1wKCp0aGlzKTsgKytpdHI7IHJldHVybiB0bXA7IH0KKyAgICBpbmxpbmUgaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7IC0taXRyOyByZXR1cm4gKnRoaXM7IH0KKyAgICBpbmxpbmUgaXRlcmF0b3IgIG9wZXJhdG9yLS0oaW50KSB7IGl0ZXJhdG9yIHRtcCgqdGhpcyk7IC0taXRyOyByZXR1cm4gdG1wOyB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgUkhTKSBjb25zdCB7IHJldHVybiBSSFMuaXRyID09IGl0cjsgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIFJIUykgY29uc3QgeyByZXR1cm4gUkhTLml0ciAhPSBpdHI7IH0KKyAgICBpbmxpbmUgdmFsdWVfdHlwZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisgIH07CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSb290KTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigpOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFV0aWxpdHkgbWV0aG9kcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdW5zaWduZWQgZ2V0SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gUm9vdCA/IFJvb3QtPmdldEhlaWdodCgpIDogMDsgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElELCBjb25zdCBJbW11dGFibGVTZXQmIFMpIHsKKyAgICBJRC5BZGRQb2ludGVyKFMuUm9vdCk7CisgIH0KKworICBpbmxpbmUgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCB7CisgICAgcmV0dXJuIFByb2ZpbGUoSUQsKnRoaXMpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEZvciB0ZXN0aW5nLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB2b2lkIHZlcmlmeSgpIGNvbnN0IHsgaWYgKFJvb3QpIFJvb3QtPnZlcmlmeSgpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvSW5kZXhlZE1hcC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9JbmRleGVkTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmMGRmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvSW5kZXhlZE1hcC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vPT09LSBsbHZtL0FEVC9JbmRleGVkTWFwLmggLSBBbiBpbmRleCBtYXAgaW1wbGVtZW50YXRpb24gLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYW4gaW5kZXhlZCBtYXAuIFRoZSBpbmRleCBtYXAgdGVtcGxhdGUgdGFrZXMgdHdvCisvLyB0eXBlcy4gVGhlIGZpcnN0IGlzIHRoZSBtYXBwZWQgdHlwZSBhbmQgdGhlIHNlY29uZCBpcyBhIGZ1bmN0b3IKKy8vIHRoYXQgbWFwcyBpdHMgYXJndW1lbnQgdG8gYSBzaXplX3QuIE9uIGluc3RhbnRpYXRpb24gYSAibnVsbCIgdmFsdWUKKy8vIGNhbiBiZSBwcm92aWRlZCB0byBiZSB1c2VkIGFzIGEgImRvZXMgbm90IGV4aXN0IiBpbmRpY2F0b3IgaW4gdGhlCisvLyBtYXAuIEEgbWVtYmVyIGZ1bmN0aW9uIGdyb3coKSBpcyBwcm92aWRlZCB0aGF0IGdpdmVuIHRoZSB2YWx1ZSBvZgorLy8gdGhlIG1heGltYWxseSBpbmRleGVkIGtleSAodGhlIGFyZ3VtZW50IG9mIHRoZSBmdW5jdG9yKSBtYWtlcyBzdXJlCisvLyB0aGUgbWFwIGhhcyBlbm91Z2ggc3BhY2UgZm9yIGl0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSU5ERVhFRE1BUF9ICisjZGVmaW5lIExMVk1fQURUX0lOREVYRURNQVBfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisgIHN0cnVjdCBJZGVudGl0eUZ1bmN0b3IgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjx1bnNpZ25lZCwgdW5zaWduZWQ+IHsKKyAgICB1bnNpZ25lZCBvcGVyYXRvcigpKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgICAgICByZXR1cm4gSW5kZXg7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBUb0luZGV4VCA9IElkZW50aXR5RnVuY3Rvcj4KKyAgY2xhc3MgSW5kZXhlZE1hcCB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUb0luZGV4VDo6YXJndW1lbnRfdHlwZSBJbmRleFQ7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxUPiBTdG9yYWdlVDsKKyAgICBTdG9yYWdlVCBzdG9yYWdlXzsKKyAgICBUIG51bGxWYWxfOworICAgIFRvSW5kZXhUIHRvSW5kZXhfOworCisgIHB1YmxpYzoKKyAgICBJbmRleGVkTWFwKCkgOiBudWxsVmFsXyhUKCkpIHsgfQorCisgICAgZXhwbGljaXQgSW5kZXhlZE1hcChjb25zdCBUJiB2YWwpIDogbnVsbFZhbF8odmFsKSB7IH0KKworICAgIHR5cGVuYW1lIFN0b3JhZ2VUOjpyZWZlcmVuY2Ugb3BlcmF0b3JbXShJbmRleFQgbikgeworICAgICAgYXNzZXJ0KHRvSW5kZXhfKG4pIDwgc3RvcmFnZV8uc2l6ZSgpICYmICJpbmRleCBvdXQgb2YgYm91bmRzISIpOworICAgICAgcmV0dXJuIHN0b3JhZ2VfW3RvSW5kZXhfKG4pXTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBTdG9yYWdlVDo6Y29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oSW5kZXhUIG4pIGNvbnN0IHsKKyAgICAgIGFzc2VydCh0b0luZGV4XyhuKSA8IHN0b3JhZ2VfLnNpemUoKSAmJiAiaW5kZXggb3V0IG9mIGJvdW5kcyEiKTsKKyAgICAgIHJldHVybiBzdG9yYWdlX1t0b0luZGV4XyhuKV07CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIHN0b3JhZ2VfLmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBncm93KEluZGV4VCBuKSB7CisgICAgICB1bnNpZ25lZCBOZXdTaXplID0gdG9JbmRleF8obikgKyAxOworICAgICAgaWYgKE5ld1NpemUgPiBzdG9yYWdlXy5zaXplKCkpCisgICAgICAgIHN0b3JhZ2VfLnJlc2l6ZShOZXdTaXplLCBudWxsVmFsXyk7CisgICAgfQorCisgICAgdHlwZW5hbWUgU3RvcmFnZVQ6OnNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0b3JhZ2VfLnNpemUoKTsKKyAgICB9CisgIH07CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkNGFjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8vPT0gbGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmggLSBTbWFydCBSZWZjb3VudGluZyBQb2ludGVyIC0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgSW50cnVzaXZlUmVmQ250UHRyLCBhIHRlbXBsYXRlIGNsYXNzIHRoYXQKKy8vIGltcGxlbWVudHMgYSAic21hcnQiIHBvaW50ZXIgZm9yIG9iamVjdHMgdGhhdCBtYWludGFpbiB0aGVpciBvd24KKy8vIGludGVybmFsIHJlZmVyZW5jZSBjb3VudCwgYW5kIFJlZkNvdW50ZWRCYXNlL1JlZkNvdW50ZWRCYXNlVlBUUiwgdHdvCisvLyBnZW5lcmljIGJhc2UgY2xhc3NlcyBmb3Igb2JqZWN0cyB0aGF0IHdpc2ggdG8gaGF2ZSB0aGVpciBsaWZldGltZXMKKy8vIG1hbmFnZWQgdXNpbmcgcmVmZXJlbmNlIGNvdW50aW5nLgorLy8KKy8vIEludHJ1c2l2ZVJlZkNudFB0ciBpcyBzaW1pbGFyIHRvIEJvb3N0J3MgaW50cnVzaXZlX3B0ciB3aXRoIGFkZGVkCisvLyBMTFZNLXN0eWxlIGNhc3RpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTlRSVVNJVkVfUkVGX0NOVF9QVFIKKyNkZWZpbmUgTExWTV9BRFRfSU5UUlVTSVZFX1JFRl9DTlRfUFRSCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBjbGFzcyBJbnRydXNpdmVSZWZDbnRQdHI7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUmVmQ291bnRlZEJhc2UgLSBBIGdlbmVyaWMgYmFzZSBjbGFzcyBmb3Igb2JqZWN0cyB0aGF0IHdpc2ggdG8KKy8vLyAgaGF2ZSB0aGVpciBsaWZldGltZXMgbWFuYWdlZCB1c2luZyByZWZlcmVuY2UgY291bnRzLiBDbGFzc2VzCisvLy8gIHN1YmNsYXNzIFJlZkNvdW50ZWRCYXNlIHRvIG9idGFpbiBzdWNoIGZ1bmN0aW9uYWxpdHksIGFuZCBhcmUKKy8vLyAgdHlwaWNhbGx5IGhhbmRsZWQgd2l0aCBJbnRydXNpdmVQdHIgInNtYXJ0IHBvaW50ZXJzIiAoc2VlIGJlbG93KQorLy8vICB3aGljaCBhdXRvbWF0aWNhbGx5IGhhbmRsZSB0aGUgbWFuYWdlbWVudCBvZiByZWZlcmVuY2UgY291bnRzLgorLy8vICBPYmplY3RzIHRoYXQgc3ViY2xhc3MgUmVmQ291bnRlZEJhc2Ugc2hvdWxkIG5vdCBiZSBhbGxvY2F0ZWQgb24KKy8vLyAgdGhlIHN0YWNrLCBhcyBpbnZva2luZyAiZGVsZXRlIiAod2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlCisvLy8gIHJlZmVyZW5jZSBjb3VudCBoaXRzIDApIG9uIHN1Y2ggb2JqZWN0cyBpcyBhbiBlcnJvci4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIHRlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPgorICBjbGFzcyBSZWZDb3VudGVkQmFzZSB7CisgICAgdW5zaWduZWQgcmVmX2NudDsKKworICBwcm90ZWN0ZWQ6CisgICAgUmVmQ291bnRlZEJhc2UoKSA6IHJlZl9jbnQoMCkge30KKworICAgIHZvaWQgUmV0YWluKCkgeyArK3JlZl9jbnQ7IH0KKyAgICB2b2lkIFJlbGVhc2UoKSB7CisgICAgICBhc3NlcnQgKHJlZl9jbnQgPiAwICYmICJSZWZlcmVuY2UgY291bnQgaXMgYWxyZWFkeSB6ZXJvLiIpOworICAgICAgaWYgKC0tcmVmX2NudCA9PSAwKSBkZWxldGUgc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBJbnRydXNpdmVSZWZDbnRQdHI8RGVyaXZlZD47CisgIH07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUmVmQ291bnRlZEJhc2VWUFRSIC0gQSBjbGFzcyB0aGF0IGhhcyB0aGUgc2FtZSBmdW5jdGlvbiBhcworLy8vICBSZWZDb3VudGVkQmFzZSwgYnV0IHdpdGggYSB2aXJ0dWFsIGRlc3RydWN0b3IuIFNob3VsZCBiZSB1c2VkCisvLy8gIGluc3RlYWQgb2YgUmVmQ291bnRlZEJhc2UgZm9yIGNsYXNzZXMgdGhhdCBhbHJlYWR5IGhhdmUgdmlydHVhbAorLy8vICBtZXRob2RzIHRvIGVuZm9yY2UgZHluYW1pYyBhbGxvY2F0aW9uIHZpYSAnbmV3Jy4gQ2xhc3NlcyB0aGF0CisvLy8gIGluaGVyaXQgZnJvbSBSZWZDb3VudGVkQmFzZVZQVFIgY2FuJ3QgYmUgYWxsb2NhdGVkIG9uIHN0YWNrIC0KKy8vLyAgYXR0ZW1wdGluZyB0byBkbyB0aGlzIHdpbGwgcHJvZHVjZSBhIGNvbXBpbGUgZXJyb3IuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICB0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KKyAgY2xhc3MgUmVmQ291bnRlZEJhc2VWUFRSIHsKKyAgICB1bnNpZ25lZCByZWZfY250OworCisgIHByb3RlY3RlZDoKKyAgICBSZWZDb3VudGVkQmFzZVZQVFIoKSA6IHJlZl9jbnQoMCkge30KKyAgICB2aXJ0dWFsIH5SZWZDb3VudGVkQmFzZVZQVFIoKSB7fQorCisgICAgdm9pZCBSZXRhaW4oKSB7ICsrcmVmX2NudDsgfQorICAgIHZvaWQgUmVsZWFzZSgpIHsKKyAgICAgIGFzc2VydCAocmVmX2NudCA+IDAgJiYgIlJlZmVyZW5jZSBjb3VudCBpcyBhbHJlYWR5IHplcm8uIik7CisgICAgICBpZiAoLS1yZWZfY250ID09IDApIGRlbGV0ZSB0aGlzOworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBJbnRydXNpdmVSZWZDbnRQdHI8RGVyaXZlZD47CisgIH07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gSW50cnVzaXZlUmVmQ250UHRyIC0gQSB0ZW1wbGF0ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSAic21hcnQgcG9pbnRlciIKKy8vLyAgdGhhdCBhc3N1bWVzIHRoZSB3cmFwcGVkIG9iamVjdCBoYXMgYSByZWZlcmVuY2UgY291bnQgYXNzb2NpYXRlZAorLy8vICB3aXRoIGl0IHRoYXQgY2FuIGJlIG1hbmFnZWQgdmlhIGNhbGxzIHRvCisvLy8gIEludHJ1c2l2ZVB0ckFkZFJlZi9JbnRydXNpdmVQdHJSZWxlYXNlLiAgVGhlIHNtYXJ0IHBvaW50ZXJzCisvLy8gIG1hbmFnZSByZWZlcmVuY2UgY291bnRzIHZpYSB0aGUgUkFJSSBpZGlvbTogdXBvbiBjcmVhdGlvbiBvZgorLy8vICBzbWFydCBwb2ludGVyIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIHdyYXBwZWQgb2JqZWN0IGlzCisvLy8gIGluY3JlbWVudGVkIGFuZCB1cG9uIGRlc3RydWN0aW9uIG9mIHRoZSBzbWFydCBwb2ludGVyIHRoZQorLy8vICByZWZlcmVuY2UgY291bnQgaXMgZGVjcmVtZW50ZWQuICBUaGlzIGNsYXNzIGFsc28gc2FmZWx5IGhhbmRsZXMKKy8vLyAgd3JhcHBpbmcgTlVMTCBwb2ludGVycy4KKy8vLworLy8vIFJlZmVyZW5jZSBjb3VudGluZyBpcyBpbXBsZW1lbnRlZCB2aWEgY2FsbHMgdG8KKy8vLyAgT2JqLT5SZXRhaW4oKS9PYmotPlJlbGVhc2UoKS4gUmVsZWFzZSgpIGlzIHJlcXVpcmVkIHRvIGRlc3Ryb3kKKy8vLyAgdGhlIG9iamVjdCB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiBJbmhlcml0aW5nIGZyb20KKy8vLyAgUmVmQ291bnRlZEJhc2UvUmVmQ291bnRlZEJhc2VWUFRSIHRha2VzIGNhcmUgb2YgdGhpcworLy8vICBhdXRvbWF0aWNhbGx5LgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNsYXNzIEludHJ1c2l2ZVJlZkNudFB0ciB7CisgICAgVCogT2JqOworICAgIHR5cGVkZWYgSW50cnVzaXZlUmVmQ250UHRyIHRoaXNfdHlwZTsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7CisKKyAgICBleHBsaWNpdCBJbnRydXNpdmVSZWZDbnRQdHIoKSA6IE9iaigwKSB7fQorCisgICAgZXhwbGljaXQgSW50cnVzaXZlUmVmQ250UHRyKFQqIG9iaikgOiBPYmoob2JqKSB7CisgICAgICByZXRhaW4oKTsKKyAgICB9CisKKyAgICBJbnRydXNpdmVSZWZDbnRQdHIoY29uc3QgSW50cnVzaXZlUmVmQ250UHRyJiBTKSA6IE9iaihTLk9iaikgeworICAgICAgcmV0YWluKCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIFg+CisgICAgSW50cnVzaXZlUmVmQ250UHRyKGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxYPiYgUykKKyAgICAgIDogT2JqKFMuZ2V0UHRyKCkpIHsKKyAgICAgIHJldGFpbigpOworICAgIH0KKworICAgIEludHJ1c2l2ZVJlZkNudFB0ciYgb3BlcmF0b3I9KGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0ciYgUykgeworICAgICAgcmVwbGFjZShTLmdldFB0cigpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWD4KKyAgICBJbnRydXNpdmVSZWZDbnRQdHImIG9wZXJhdG9yPShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8WD4mIFMpIHsKKyAgICAgIHJlcGxhY2UoUy5nZXRQdHIoKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW50cnVzaXZlUmVmQ250UHRyJiBvcGVyYXRvcj0oVCAqIFMpIHsKKyAgICAgIHJlcGxhY2UoUyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgfkludHJ1c2l2ZVJlZkNudFB0cigpIHsgcmVsZWFzZSgpOyB9CisKKyAgICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqT2JqOyB9CisKKyAgICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gT2JqOyB9CisKKyAgICBUKiBnZXRQdHIoKSBjb25zdCB7IHJldHVybiBPYmo7IH0KKworICAgIHR5cGVkZWYgVCogKEludHJ1c2l2ZVJlZkNudFB0cjo6KnVuc3BlY2lmaWVkX2Jvb2xfdHlwZSkgKCkgY29uc3Q7CisgICAgb3BlcmF0b3IgdW5zcGVjaWZpZWRfYm9vbF90eXBlKCkgY29uc3QgeworICAgICAgcmV0dXJuIE9iaiA9PSAwID8gMCA6ICZJbnRydXNpdmVSZWZDbnRQdHI6OmdldFB0cjsKKyAgICB9CisKKyAgICB2b2lkIHN3YXAoSW50cnVzaXZlUmVmQ250UHRyJiBvdGhlcikgeworICAgICAgVCogdG1wID0gb3RoZXIuT2JqOworICAgICAgb3RoZXIuT2JqID0gT2JqOworICAgICAgT2JqID0gdG1wOworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgcmV0YWluKCkgeyBpZiAoT2JqKSBPYmotPlJldGFpbigpOyB9CisgICAgdm9pZCByZWxlYXNlKCkgeyBpZiAoT2JqKSBPYmotPlJlbGVhc2UoKTsgfQorCisgICAgdm9pZCByZXBsYWNlKFQqIFMpIHsKKyAgICAgIHRoaXNfdHlwZShTKS5zd2FwKCp0aGlzKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4mIEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFU+JiBCKQorICB7CisgICAgcmV0dXJuIEEuZ2V0UHRyKCkgPT0gQi5nZXRQdHIoKTsKKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+JiBBLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxVPiYgQikKKyAgeworICAgIHJldHVybiBBLmdldFB0cigpICE9IEIuZ2V0UHRyKCk7CisgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxUPiYgQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVKiBCKQorICB7CisgICAgcmV0dXJuIEEuZ2V0UHRyKCkgPT0gQjsKKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+JiBBLAorICAgICAgICAgICAgICAgICAgICAgICAgIFUqIEIpCisgIHsKKyAgICByZXR1cm4gQS5nZXRQdHIoKSAhPSBCOworICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShUKiBBLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxVPiYgQikKKyAgeworICAgIHJldHVybiBBID09IEIuZ2V0UHRyKCk7CisgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KFQqIEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFU+JiBCKQorICB7CisgICAgcmV0dXJuIEEgIT0gQi5nZXRQdHIoKTsKKyAgfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTExWTS1zdHlsZSBkb3duY2FzdGluZyBzdXBwb3J0IGZvciBJbnRydXNpdmVSZWZDbnRQdHIgb2JqZWN0cworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxJbnRydXNpdmVSZWZDbnRQdHI8VD4gPiB7CisgICAgdHlwZWRlZiBUKiBTaW1wbGVUeXBlOworICAgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4mIFZhbCkgeworICAgICAgcmV0dXJuIFZhbC5nZXRQdHIoKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+ID4geworICAgIHR5cGVkZWYgVCogU2ltcGxlVHlwZTsKKyAgICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+JiBWYWwpIHsKKyAgICAgIHJldHVybiBWYWwuZ2V0UHRyKCk7CisgICAgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSU5UUlVTSVZFX1JFRl9DTlRfUFRSCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL051bGxhYmxlUHRyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL051bGxhYmxlUHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljNDdhMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvTnVsbGFibGVQdHIuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0gbGx2bS9BRFQvTnVsbGFibGVQdHIuaCAtIEEgcG9pbnRlciB0aGF0IGFsbG93cyBudWxsIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuZCBpbXBsZW1lbnRzIHRoZSBOdWxsYWJsZVB0ciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX05VTExBQkxFX1BUUl9ICisjZGVmaW5lIExMVk1fQURUX05VTExBQkxFX1BUUl9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKKy8vLyBOdWxsYWJsZVB0ciBwb2ludGVyIHdyYXBwZXIgLSBOdWxsYWJsZVB0ciBpcyB1c2VkIGZvciBBUElzIHdoZXJlIGEKKy8vLyBwb3RlbnRpYWxseS1udWxsIHBvaW50ZXIgZ2V0cyBwYXNzZWQgYXJvdW5kIHRoYXQgbXVzdCBiZSBleHBsaWNpdGx5IGhhbmRsZWQKKy8vLyBpbiBsb3RzIG9mIHBsYWNlcy4gIEJ5IHB1dHRpbmcgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbnVsbCBwb2ludGVyLCBpdCBtYWtlcworLy8vIGl0IG1vcmUgbGlrZWx5IHRoYXQgdGhlIG51bGwgcG9pbnRlciBjYXNlIHdpbGwgYmUgaGFuZGxlZCBjb3JyZWN0bHkuCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgTnVsbGFibGVQdHIgeworICBUICpQdHI7CitwdWJsaWM6CisgIE51bGxhYmxlUHRyKFQgKlAgPSAwKSA6IFB0cihQKSB7fQorICAKKyAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiBQdHIgPT0gMDsgfQorICBib29sIGlzTm9uTnVsbCgpIGNvbnN0IHsgcmV0dXJuIFB0ciAhPSAwOyB9CisKKyAgLy8vIGdldCAtIFJldHVybiB0aGUgcG9pbnRlciBpZiBpdCBpcyBub24tbnVsbC4KKyAgY29uc3QgVCAqZ2V0KCkgY29uc3QgeworICAgIGFzc2VydChQdHIgJiYgIlBvaW50ZXIgd2Fzbid0IGNoZWNrZWQgZm9yIG51bGwhIik7CisgICAgcmV0dXJuIFB0cjsKKyAgfQorCisgIC8vLyBnZXQgLSBSZXR1cm4gdGhlIHBvaW50ZXIgaWYgaXQgaXMgbm9uLW51bGwuCisgIFQgKmdldCgpIHsKKyAgICBhc3NlcnQoUHRyICYmICJQb2ludGVyIHdhc24ndCBjaGVja2VkIGZvciBudWxsISIpOworICAgIHJldHVybiBQdHI7CisgIH0KKyAgCisgIFQgKmdldFB0ck9yTnVsbCgpIHsgcmV0dXJuIFB0cjsgfQorICBjb25zdCBUICpnZXRQdHJPck51bGwoKSBjb25zdCB7IHJldHVybiBQdHI7IH0KK307CisgIAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL09wdGlvbmFsLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL09wdGlvbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlNTRhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvT3B0aW9uYWwuaApAQCAtMCwwICsxLDY2IEBACisvLz09PS0tIE9wdGlvbmFsLmggLSBTaW1wbGUgdmFyaWFudCBmb3IgcGFzc2luZyBvcHRpb25hbCB2YWx1ZXMgLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgcHJvdmlkZXMgT3B0aW9uYWwsIGEgdGVtcGxhdGUgY2xhc3MgbW9kZWxlZCBpbiB0aGUgc3Bpcml0IG9mCisvLyAgT0NhbWwncyAnb3B0JyB2YXJpYW50LiAgVGhlIGlkZWEgaXMgdG8gc3Ryb25nbHkgdHlwZSB3aGV0aGVyIG9yIG5vdAorLy8gIGEgdmFsdWUgY2FuIGJlIG9wdGlvbmFsLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfT1BUSU9OQUwKKyNkZWZpbmUgTExWTV9BRFRfT1BUSU9OQUwKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIE9wdGlvbmFsIHsKKyAgVCB4OworICB1bnNpZ25lZCBoYXNWYWwgOiAxOworcHVibGljOgorICBleHBsaWNpdCBPcHRpb25hbCgpIDogeCgpLCBoYXNWYWwoZmFsc2UpIHt9CisgIE9wdGlvbmFsKGNvbnN0IFQgJnkpIDogeCh5KSwgaGFzVmFsKHRydWUpIHt9CisKKyAgc3RhdGljIGlubGluZSBPcHRpb25hbCBjcmVhdGUoY29uc3QgVCogeSkgeworICAgIHJldHVybiB5ID8gT3B0aW9uYWwoKnkpIDogT3B0aW9uYWwoKTsKKyAgfQorCisgIE9wdGlvbmFsICZvcGVyYXRvcj0oY29uc3QgVCAmeSkgeworICAgIHggPSB5OworICAgIGhhc1ZhbCA9IHRydWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBjb25zdCBUKiBnZXRQb2ludGVyKCkgY29uc3QgeyBhc3NlcnQoaGFzVmFsKTsgcmV0dXJuICZ4OyB9CisgIGNvbnN0IFQmIGdldFZhbHVlKCkgY29uc3QgeyBhc3NlcnQoaGFzVmFsKTsgcmV0dXJuIHg7IH0KKworICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaGFzVmFsOyB9CisgIGJvb2wgaGFzVmFsdWUoKSBjb25zdCB7IHJldHVybiBoYXNWYWw7IH0KKyAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldFBvaW50ZXIoKTsgfQorICBjb25zdCBUJiBvcGVyYXRvciooKSBjb25zdCB7IGFzc2VydChoYXNWYWwpOyByZXR1cm4geDsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgT3B0aW9uYWw8VD4gPiB7CisgIHR5cGVkZWYgY29uc3QgVCogU2ltcGxlVHlwZTsKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IE9wdGlvbmFsPFQ+ICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFBvaW50ZXIoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxPcHRpb25hbDxUPiA+CisgIDogcHVibGljIHNpbXBsaWZ5X3R5cGU8Y29uc3QgT3B0aW9uYWw8VD4gPiB7fTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL093bmluZ1B0ci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9Pd25pbmdQdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDljMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9Pd25pbmdQdHIuaApAQCAtMCwwICsxLDEzMyBAQAorLy89PT0tIGxsdm0vQURUL093bmluZ1B0ci5oIC0gU21hcnQgcHRyIHRoYXQgb3ducyB0aGUgcG9pbnRlZSAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbmQgaW1wbGVtZW50cyB0aGUgT3duaW5nUHRyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfT1dOSU5HX1BUUl9ICisjZGVmaW5lIExMVk1fQURUX09XTklOR19QVFJfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBPd25pbmdQdHIgc21hcnQgcG9pbnRlciAtIE93bmluZ1B0ciBtaW1pY3MgYSBidWlsdC1pbiBwb2ludGVyIGV4Y2VwdCB0aGF0IGl0CisvLy8gZ3VhcmFudGVlcyBkZWxldGlvbiBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8sIGVpdGhlciBvbiBkZXN0cnVjdGlvbiBvZiB0aGUKKy8vLyBPd25pbmdQdHIgb3IgdmlhIGFuIGV4cGxpY2l0IHJlc2V0KCkuICBPbmNlIGNyZWF0ZWQsIG93bmVyc2hpcCBvZiB0aGUKKy8vLyBwb2ludGVlIG9iamVjdCBjYW4gYmUgdGFrZW4gYXdheSBmcm9tIE93bmluZ1B0ciBieSB1c2luZyB0aGUgdGFrZSBtZXRob2QuCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgT3duaW5nUHRyIHsKKyAgT3duaW5nUHRyKE93bmluZ1B0ciBjb25zdCAmKTsgICAgICAgICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICBPd25pbmdQdHIgJm9wZXJhdG9yPShPd25pbmdQdHIgY29uc3QgJik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIFQgKlB0cjsKK3B1YmxpYzoKKyAgZXhwbGljaXQgT3duaW5nUHRyKFQgKlAgPSAwKSA6IFB0cihQKSB7fQorCisgIH5Pd25pbmdQdHIoKSB7CisgICAgZGVsZXRlIFB0cjsKKyAgfQorCisgIC8vLyByZXNldCAtIENoYW5nZSB0aGUgY3VycmVudCBwb2ludGVlIHRvIHRoZSBzcGVjaWZpZWQgcG9pbnRlci4gIE5vdGUgdGhhdAorICAvLy8gY2FsbGluZyB0aGlzIHdpdGggYW55IHBvaW50ZXIgKGluY2x1ZGluZyBhIG51bGwgcG9pbnRlcikgZGVsZXRlcyB0aGUKKyAgLy8vIGN1cnJlbnQgcG9pbnRlci4KKyAgdm9pZCByZXNldChUICpQID0gMCkgeworICAgIGlmIChQID09IFB0cikgcmV0dXJuOworICAgIFQgKlRtcCA9IFB0cjsKKyAgICBQdHIgPSBQOworICAgIGRlbGV0ZSBUbXA7CisgIH0KKworICAvLy8gdGFrZSAtIFJlc2V0IHRoZSBvd25pbmcgcG9pbnRlciB0byBudWxsIGFuZCByZXR1cm4gaXRzIHBvaW50ZXIuICBUaGlzIGRvZXMKKyAgLy8vIG5vdCBkZWxldGUgdGhlIHBvaW50ZXIgYmVmb3JlIHJldHVybmluZyBpdC4KKyAgVCAqdGFrZSgpIHsKKyAgICBUICpUbXAgPSBQdHI7CisgICAgUHRyID0gMDsKKyAgICByZXR1cm4gVG1wOworICB9CisKKyAgVCAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChQdHIgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBudWxsIHBvaW50ZXIiKTsKKyAgICByZXR1cm4gKlB0cjsKKyAgfQorCisgIFQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBQdHI7IH0KKyAgVCAqZ2V0KCkgY29uc3QgeyByZXR1cm4gUHRyOyB9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBQdHIgIT0gMDsgfQorICBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuIFB0ciA9PSAwOyB9CisKKyAgdm9pZCBzd2FwKE93bmluZ1B0ciAmUkhTKSB7CisgICAgVCAqVG1wID0gUkhTLlB0cjsKKyAgICBSSFMuUHRyID0gUHRyOworICAgIFB0ciA9IFRtcDsKKyAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSB2b2lkIHN3YXAoT3duaW5nUHRyPFQ+ICZhLCBPd25pbmdQdHI8VD4gJmIpIHsKKyAgYS5zd2FwKGIpOworfQorCisvLy8gT3duaW5nQXJyYXlQdHIgc21hcnQgcG9pbnRlciAtIE93bmluZ0FycmF5UHRyIHByb3ZpZGVzIHRoZSBzYW1lCisvLy8gIGZ1bmN0aW9uYWxpdHkgYXMgT3duaW5nUHRyLCBleGNlcHQgdGhhdCBpdCB3b3JrcyBmb3IgYXJyYXkgdHlwZXMuCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgT3duaW5nQXJyYXlQdHIgeworICBPd25pbmdBcnJheVB0cihPd25pbmdBcnJheVB0ciBjb25zdCAmKTsgICAgICAgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIE93bmluZ0FycmF5UHRyICZvcGVyYXRvcj0oT3duaW5nQXJyYXlQdHIgY29uc3QgJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgVCAqUHRyOworcHVibGljOgorICBleHBsaWNpdCBPd25pbmdBcnJheVB0cihUICpQID0gMCkgOiBQdHIoUCkge30KKworICB+T3duaW5nQXJyYXlQdHIoKSB7CisgICAgZGVsZXRlIFtdIFB0cjsKKyAgfQorCisgIC8vLyByZXNldCAtIENoYW5nZSB0aGUgY3VycmVudCBwb2ludGVlIHRvIHRoZSBzcGVjaWZpZWQgcG9pbnRlci4gIE5vdGUgdGhhdAorICAvLy8gY2FsbGluZyB0aGlzIHdpdGggYW55IHBvaW50ZXIgKGluY2x1ZGluZyBhIG51bGwgcG9pbnRlcikgZGVsZXRlcyB0aGUKKyAgLy8vIGN1cnJlbnQgcG9pbnRlci4KKyAgdm9pZCByZXNldChUICpQID0gMCkgeworICAgIGlmIChQID09IFB0cikgcmV0dXJuOworICAgIFQgKlRtcCA9IFB0cjsKKyAgICBQdHIgPSBQOworICAgIGRlbGV0ZSBbXSBUbXA7CisgIH0KKworICAvLy8gdGFrZSAtIFJlc2V0IHRoZSBvd25pbmcgcG9pbnRlciB0byBudWxsIGFuZCByZXR1cm4gaXRzIHBvaW50ZXIuICBUaGlzIGRvZXMKKyAgLy8vIG5vdCBkZWxldGUgdGhlIHBvaW50ZXIgYmVmb3JlIHJldHVybmluZyBpdC4KKyAgVCAqdGFrZSgpIHsKKyAgICBUICpUbXAgPSBQdHI7CisgICAgUHRyID0gMDsKKyAgICByZXR1cm4gVG1wOworICB9CisKKyAgVCAmb3BlcmF0b3JbXShzdGQ6OnB0cmRpZmZfdCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KFB0ciAmJiAiQ2Fubm90IGRlcmVmZXJlbmNlIG51bGwgcG9pbnRlciIpOworICAgIHJldHVybiBQdHJbaV07CisgIH0KKworICBUICpnZXQoKSBjb25zdCB7IHJldHVybiBQdHI7IH0KKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIFB0ciAhPSAwOyB9CisgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gUHRyID09IDA7IH0KKworICB2b2lkIHN3YXAoT3duaW5nQXJyYXlQdHIgJlJIUykgeworICAgIFQgKlRtcCA9IFJIUy5QdHI7CisgICAgUkhTLlB0ciA9IFB0cjsKKyAgICBQdHIgPSBUbXA7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgdm9pZCBzd2FwKE93bmluZ0FycmF5UHRyPFQ+ICZhLCBPd25pbmdBcnJheVB0cjxUPiAmYikgeworICBhLnN3YXAoYik7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVySW50UGFpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZjRhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8vPT09LSBsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIC0gUGFpciBmb3IgcG9pbnRlciBhbmQgaW50IC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBvaW50ZXJJbnRQYWlyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfUE9JTlRFUklOVFBBSVJfSAorI2RlZmluZSBMTFZNX0FEVF9QT0lOVEVSSU5UUEFJUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IERlbnNlTWFwSW5mbzsKKworLy8vIFBvaW50ZXJJbnRQYWlyIC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgcGFpciBvZiBhIHBvaW50ZXIgYW5kIHNtYWxsCisvLy8gaW50ZWdlci4gIEl0IGlzIGRlc2lnbmVkIHRvIHJlcHJlc2VudCB0aGlzIGluIHRoZSBzcGFjZSByZXF1aXJlZCBieSBvbmUKKy8vLyBwb2ludGVyIGJ5IGJpdG1hbmdsaW5nIHRoZSBpbnRlZ2VyIGludG8gdGhlIGxvdyBwYXJ0IG9mIHRoZSBwb2ludGVyLiAgVGhpcworLy8vIGNhbiBvbmx5IGJlIGRvbmUgZm9yIHNtYWxsIGludGVnZXJzOiB0eXBpY2FsbHkgdXAgdG8gMyBiaXRzLCBidXQgaXQgZGVwZW5kcworLy8vIG9uIHRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgYWNjb3JkaW5nIHRvIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBmb3IgdGhlCisvLy8gdHlwZS4KKy8vLworLy8vIE5vdGUgdGhhdCBQb2ludGVySW50UGFpciBhbHdheXMgcHV0cyB0aGUgSW50IHBhcnQgaW4gdGhlIGhpZ2hlc3QgYml0cworLy8vIHBvc3NpYmxlLiAgRm9yIGV4YW1wbGUsIFBvaW50ZXJJbnRQYWlyPHZvaWQqLCAxLCBib29sPiB3aWxsIHB1dCB0aGUgYml0IGZvcgorLy8vIHRoZSBib29sIGludG8gYml0ICMyLCBub3QgYml0ICMwLCB3aGljaCBhbGxvd3MgdGhlIGxvdyB0d28gYml0cyB0byBiZSB1c2VkCisvLy8gZm9yIHNvbWV0aGluZyBlbHNlLiAgRm9yIGV4YW1wbGUsIHRoaXMgYWxsb3dzOgorLy8vICAgUG9pbnRlckludFBhaXI8UG9pbnRlckludFBhaXI8dm9pZCosIDEsIGJvb2w+LCAxLCBib29sPgorLy8vIC4uLiBhbmQgdGhlIHR3byBib29scyB3aWxsIGxhbmQgaW4gZGlmZmVyZW50IGJpdHMuCisvLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyVHksIHVuc2lnbmVkIEludEJpdHMsIHR5cGVuYW1lIEludFR5cGU9dW5zaWduZWQsCisgICAgICAgICAgdHlwZW5hbWUgUHRyVHJhaXRzID0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJUeT4gPgorY2xhc3MgUG9pbnRlckludFBhaXIgeworICBpbnRwdHJfdCBWYWx1ZTsKKyAgZW51bSB7CisgICAgLy8vIFBvaW50ZXJCaXRNYXNrIC0gVGhlIGJpdHMgdGhhdCBjb21lIGZyb20gdGhlIHBvaW50ZXIuCisgICAgUG9pbnRlckJpdE1hc2sgPQorICAgICAgfih1aW50cHRyX3QpKCgoaW50cHRyX3QpMSA8PCBQdHJUcmFpdHM6Ok51bUxvd0JpdHNBdmFpbGFibGUpLTEpLAorCisgICAgLy8vIEludFNoaWZ0IC0gVGhlIG51bWJlciBvZiBsb3cgYml0cyB0aGF0IHdlIHJlc2VydmUgZm9yIG90aGVyIHVzZXMsIGFuZAorICAgIC8vLyBrZWVwIHplcm8uCisgICAgSW50U2hpZnQgPSAodWludHB0cl90KVB0clRyYWl0czo6TnVtTG93Qml0c0F2YWlsYWJsZS1JbnRCaXRzLAorICAgIAorICAgIC8vLyBJbnRNYXNrIC0gVGhpcyBpcyB0aGUgdW5zaGlmdGVkIG1hc2sgZm9yIHZhbGlkIGJpdHMgb2YgdGhlIGludCB0eXBlLgorICAgIEludE1hc2sgPSAodWludHB0cl90KSgoKGludHB0cl90KTEgPDwgSW50Qml0cyktMSksCisgICAgCisgICAgLy8gU2hpZnRlZEludE1hc2sgLSBUaGlzIGlzIHRoZSBiaXRzIGZvciB0aGUgaW50ZWdlciBzaGlmdGVkIGluIHBsYWNlLgorICAgIFNoaWZ0ZWRJbnRNYXNrID0gKHVpbnRwdHJfdCkoSW50TWFzayA8PCBJbnRTaGlmdCkKKyAgfTsKK3B1YmxpYzoKKyAgUG9pbnRlckludFBhaXIoKSA6IFZhbHVlKDApIHt9CisgIFBvaW50ZXJJbnRQYWlyKFBvaW50ZXJUeSBQdHIsIEludFR5cGUgSW50KSA6IFZhbHVlKDApIHsKKyAgICBhc3NlcnQoSW50Qml0cyA8PSBQdHJUcmFpdHM6Ok51bUxvd0JpdHNBdmFpbGFibGUgJiYKKyAgICAgICAgICAgIlBvaW50ZXJJbnRQYWlyIGZvcm1lZCB3aXRoIGludGVnZXIgc2l6ZSB0b28gbGFyZ2UgZm9yIHBvaW50ZXIiKTsKKyAgICBzZXRQb2ludGVyKFB0cik7CisgICAgc2V0SW50KEludCk7CisgIH0KKworICBQb2ludGVyVHkgZ2V0UG9pbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyVHJhaXRzOjpnZXRGcm9tVm9pZFBvaW50ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oVmFsdWUgJiBQb2ludGVyQml0TWFzaykpOworICB9CisKKyAgSW50VHlwZSBnZXRJbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIChJbnRUeXBlKSgoVmFsdWUgPj4gSW50U2hpZnQpICYgSW50TWFzayk7CisgIH0KKworICB2b2lkIHNldFBvaW50ZXIoUG9pbnRlclR5IFB0cikgeworICAgIGludHB0cl90IFB0clZhbAorICAgICAgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihQdHJUcmFpdHM6OmdldEFzVm9pZFBvaW50ZXIoUHRyKSk7CisgICAgYXNzZXJ0KChQdHJWYWwgJiAoKDEgPDwgUHRyVHJhaXRzOjpOdW1Mb3dCaXRzQXZhaWxhYmxlKS0xKSkgPT0gMCAmJgorICAgICAgICAgICAiUG9pbnRlciBpcyBub3Qgc3VmZmljaWVudGx5IGFsaWduZWQiKTsKKyAgICAvLyBQcmVzZXJ2ZSBhbGwgbG93IGJpdHMsIGp1c3QgdXBkYXRlIHRoZSBwb2ludGVyLgorICAgIFZhbHVlID0gUHRyVmFsIHwgKFZhbHVlICYgflBvaW50ZXJCaXRNYXNrKTsKKyAgfQorCisgIHZvaWQgc2V0SW50KEludFR5cGUgSW50KSB7CisgICAgaW50cHRyX3QgSW50VmFsID0gSW50OworICAgIGFzc2VydChJbnRWYWwgPCAoMSA8PCBJbnRCaXRzKSAmJiAiSW50ZWdlciB0b28gbGFyZ2UgZm9yIGZpZWxkIik7CisgICAgCisgICAgLy8gUHJlc2VydmUgYWxsIGJpdHMgb3RoZXIgdGhhbiB0aGUgb25lcyB3ZSBhcmUgdXBkYXRpbmcuCisgICAgVmFsdWUgJj0gflNoaWZ0ZWRJbnRNYXNrOyAgICAgLy8gUmVtb3ZlIGludGVnZXIgZmllbGQuCisgICAgVmFsdWUgfD0gSW50VmFsIDw8IEludFNoaWZ0OyAgLy8gU2V0IG5ldyBpbnRlZ2VyLgorICB9CisKKyAgdm9pZCAqZ2V0T3BhcXVlVmFsdWUoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihWYWx1ZSk7IH0KKyAgdm9pZCBzZXRGcm9tT3BhcXVlVmFsdWUodm9pZCAqVmFsKSB7IFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oVmFsKTt9CisKKyAgc3RhdGljIFBvaW50ZXJJbnRQYWlyIGdldEZyb21PcGFxdWVWYWx1ZSh2b2lkICpWKSB7CisgICAgUG9pbnRlckludFBhaXIgUDsgUC5zZXRGcm9tT3BhcXVlVmFsdWUoVik7IHJldHVybiBQOyAKKyAgfQorICAKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBvaW50ZXJJbnRQYWlyICZSSFMpIGNvbnN0IHtyZXR1cm4gVmFsdWUgPT0gUkhTLlZhbHVlO30KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBvaW50ZXJJbnRQYWlyICZSSFMpIGNvbnN0IHtyZXR1cm4gVmFsdWUgIT0gUkhTLlZhbHVlO30KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUG9pbnRlckludFBhaXIgJlJIUykgY29uc3Qge3JldHVybiBWYWx1ZSA8IFJIUy5WYWx1ZTt9CisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFBvaW50ZXJJbnRQYWlyICZSSFMpIGNvbnN0IHtyZXR1cm4gVmFsdWUgPiBSSFMuVmFsdWU7fQorICBib29sIG9wZXJhdG9yPD0oY29uc3QgUG9pbnRlckludFBhaXIgJlJIUykgY29uc3Qge3JldHVybiBWYWx1ZSA8PSBSSFMuVmFsdWU7fQorICBib29sIG9wZXJhdG9yPj0oY29uc3QgUG9pbnRlckludFBhaXIgJlJIUykgY29uc3Qge3JldHVybiBWYWx1ZSA+PSBSSFMuVmFsdWU7fQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc1BvZExpa2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBQb2ludGVyVHksIHVuc2lnbmVkIEludEJpdHMsIHR5cGVuYW1lIEludFR5cGU+CitzdHJ1Y3QgaXNQb2RMaWtlPFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZT4gPiB7CisgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworICAKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb24gb2YgRGVuc2VNYXBJbmZvIGZvciBQb2ludGVySW50UGFpci4KK3RlbXBsYXRlPHR5cGVuYW1lIFBvaW50ZXJUeSwgdW5zaWduZWQgSW50Qml0cywgdHlwZW5hbWUgSW50VHlwZT4KK3N0cnVjdCBEZW5zZU1hcEluZm88UG9pbnRlckludFBhaXI8UG9pbnRlclR5LCBJbnRCaXRzLCBJbnRUeXBlPiA+IHsKKyAgdHlwZWRlZiBQb2ludGVySW50UGFpcjxQb2ludGVyVHksIEludEJpdHMsIEludFR5cGU+IFR5OworICBzdGF0aWMgVHkgZ2V0RW1wdHlLZXkoKSB7CisgICAgaW50cHRyX3QgVmFsID0gLTE7CisgICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UG9pbnRlclR5Pjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gVHkocmVpbnRlcnByZXRfY2FzdDxQb2ludGVyVHk+KFZhbCksIEludFR5cGUoKDEgPDwgSW50Qml0cyktMSkpOworICB9CisgIHN0YXRpYyBUeSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgaW50cHRyX3QgVmFsID0gLTI7CisgICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UG9pbnRlclR5Pjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gVHkocmVpbnRlcnByZXRfY2FzdDxQb2ludGVyVHk+KFZhbCksIEludFR5cGUoMCkpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoVHkgVikgeworICAgIHVpbnRwdHJfdCBJViA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihWLmdldE9wYXF1ZVZhbHVlKCkpOworICAgIHJldHVybiB1bnNpZ25lZChJVikgXiB1bnNpZ25lZChJViA+PiA5KTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFR5ICZMSFMsIGNvbnN0IFR5ICZSSFMpIHsgcmV0dXJuIExIUyA9PSBSSFM7IH0KK307CisKKy8vIFRlYWNoIFNtYWxsUHRyU2V0IHRoYXQgUG9pbnRlckludFBhaXIgaXMgImJhc2ljYWxseSBhIHBvaW50ZXIiLgordGVtcGxhdGU8dHlwZW5hbWUgUG9pbnRlclR5LCB1bnNpZ25lZCBJbnRCaXRzLCB0eXBlbmFtZSBJbnRUeXBlLAorICAgICAgICAgdHlwZW5hbWUgUHRyVHJhaXRzPgorY2xhc3MgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJUcmFpdHM+ID4geworcHVibGljOgorICBzdGF0aWMgaW5saW5lIHZvaWQgKgorICBnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZT4gJlApIHsKKyAgICByZXR1cm4gUC5nZXRPcGFxdWVWYWx1ZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgUG9pbnRlckludFBhaXI8UG9pbnRlclR5LCBJbnRCaXRzLCBJbnRUeXBlPgorICBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiBQb2ludGVySW50UGFpcjxQb2ludGVyVHksIEludEJpdHMsIEludFR5cGU+OjpnZXRGcm9tT3BhcXVlVmFsdWUoUCk7CisgIH0KKyAgZW51bSB7CisgICAgTnVtTG93Qml0c0F2YWlsYWJsZSA9IFB0clRyYWl0czo6TnVtTG93Qml0c0F2YWlsYWJsZSAtIEludEJpdHMKKyAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlclVuaW9uLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1BvaW50ZXJVbmlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTE0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1BvaW50ZXJVbmlvbi5oCkBAIC0wLDAgKzEsMzcxIEBACisvLz09PS0gbGx2bS9BRFQvUG9pbnRlclVuaW9uLmggLSBEaXNjcmltaW5hdGVkIFVuaW9uIG9mIDIgUHRycyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQb2ludGVyVW5pb24gY2xhc3MsIHdoaWNoIGlzIGEgZGlzY3JpbWluYXRlZCB1bmlvbiBvZgorLy8gcG9pbnRlciB0eXBlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1BPSU5URVJVTklPTl9ICisjZGVmaW5lIExMVk1fQURUX1BPSU5URVJVTklPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIGdldFBvaW50ZXJVbmlvblR5cGVOdW0gLSBJZiB0aGUgYXJndW1lbnQgaGFzIHR5cGUgUFQxKiBvciBQVDIqIHJldHVybgorICAvLy8gZmFsc2Ugb3IgdHJ1ZSByZXNwZWN0aXZlbHkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMj4KKyAgc3RhdGljIGlubGluZSBpbnQgZ2V0UG9pbnRlclVuaW9uVHlwZU51bShQVDEgKlApIHsgcmV0dXJuIDA7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyPgorICBzdGF0aWMgaW5saW5lIGludCBnZXRQb2ludGVyVW5pb25UeXBlTnVtKFBUMiAqUCkgeyByZXR1cm4gMTsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDI+CisgIHN0YXRpYyBpbmxpbmUgaW50IGdldFBvaW50ZXJVbmlvblR5cGVOdW0oLi4uKSB7IHJldHVybiAtMTsgfQorICAKKyAgCisgIC8vLyBQcm92aWRlIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBmb3Igdm9pZCogdGhhdCBpcyB1c2VkIGJ5IFBvaW50ZXJVbmlvbgorICAvLy8gZm9yIHRoZSB0d28gdGVtcGxhdGUgYXJndW1lbnRzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDI+CisgIGNsYXNzIFBvaW50ZXJVbmlvblVJbnRUcmFpdHMgeworICBwdWJsaWM6CisgICAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKHZvaWQgKlApIHsgcmV0dXJuIFA7IH0KKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7IHJldHVybiBQOyB9CisgICAgZW51bSB7CisgICAgICBQVDFCaXRzQXYgPSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UFQxPjo6TnVtTG93Qml0c0F2YWlsYWJsZSwKKyAgICAgIFBUMkJpdHNBdiA9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQVDI+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlLAorICAgICAgTnVtTG93Qml0c0F2YWlsYWJsZSA9IFBUMUJpdHNBdiA8IFBUMkJpdHNBdiA/IFBUMUJpdHNBdiA6IFBUMkJpdHNBdgorICAgIH07CisgIH07CisgIAorICAvLy8gUG9pbnRlclVuaW9uIC0gVGhpcyBpbXBsZW1lbnRzIGEgZGlzY3JpbWluYXRlZCB1bmlvbiBvZiB0d28gcG9pbnRlciB0eXBlcywKKyAgLy8vIGFuZCBrZWVwcyB0aGUgZGlzY3JpbWluYXRvciBiaXQtbWFuZ2xlZCBpbnRvIHRoZSBsb3cgYml0cyBvZiB0aGUgcG9pbnRlci4KKyAgLy8vIFRoaXMgYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBiZSBleHRyZW1lbHkgZWZmaWNpZW50IGluIHNwYWNlLCBidXQKKyAgLy8vIHBlcm1pdHMgYSB2ZXJ5IG5hdHVyYWwgYW5kIHR5cGUtc2FmZSBBUEkuCisgIC8vLworICAvLy8gQ29tbW9uIHVzZSBwYXR0ZXJucyB3b3VsZCBiZSBzb21ldGhpbmcgbGlrZSB0aGlzOgorICAvLy8gICAgUG9pbnRlclVuaW9uPGludCosIGZsb2F0Kj4gUDsKKyAgLy8vICAgIFAgPSAoaW50KikwOworICAvLy8gICAgcHJpbnRmKCIlZCAlZCIsIFAuaXM8aW50Kj4oKSwgUC5pczxmbG9hdCo+KCkpOyAgLy8gcHJpbnRzICIxIDAiCisgIC8vLyAgICBYID0gUC5nZXQ8aW50Kj4oKTsgICAgIC8vIG9rLgorICAvLy8gICAgWSA9IFAuZ2V0PGZsb2F0Kj4oKTsgICAvLyBydW50aW1lIGFzc2VydGlvbiBmYWlsdXJlLgorICAvLy8gICAgWiA9IFAuZ2V0PGRvdWJsZSo+KCk7ICAvLyBydW50aW1lIGFzc2VydGlvbiBmYWlsdXJlIChyZWdhcmRsZXNzIG9mIHRhZykKKyAgLy8vICAgIFAgPSAoZmxvYXQqKTA7CisgIC8vLyAgICBZID0gUC5nZXQ8ZmxvYXQqPigpOyAgIC8vIG9rLgorICAvLy8gICAgWCA9IFAuZ2V0PGludCo+KCk7ICAgICAvLyBydW50aW1lIGFzc2VydGlvbiBmYWlsdXJlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDI+CisgIGNsYXNzIFBvaW50ZXJVbmlvbiB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFBvaW50ZXJJbnRQYWlyPHZvaWQqLCAxLCBib29sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJVbmlvblVJbnRUcmFpdHM8UFQxLFBUMj4gPiBWYWxUeTsKKyAgcHJpdmF0ZToKKyAgICBWYWxUeSBWYWw7CisgIHB1YmxpYzoKKyAgICBQb2ludGVyVW5pb24oKSB7fQorICAgIAorICAgIFBvaW50ZXJVbmlvbihQVDEgVikgeworICAgICAgVmFsLnNldFBvaW50ZXIoCisgICAgICAgICBjb25zdF9jYXN0PHZvaWQgKj4oUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBUMT46OmdldEFzVm9pZFBvaW50ZXIoVikpKTsKKyAgICAgIFZhbC5zZXRJbnQoMCk7CisgICAgfQorICAgIFBvaW50ZXJVbmlvbihQVDIgVikgeworICAgICAgVmFsLnNldFBvaW50ZXIoCisgICAgICAgICBjb25zdF9jYXN0PHZvaWQgKj4oUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBUMj46OmdldEFzVm9pZFBvaW50ZXIoVikpKTsKKyAgICAgIFZhbC5zZXRJbnQoMSk7CisgICAgfQorICAgIAorICAgIC8vLyBpc051bGwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcG9pbnRlciBoZWxkIGluIHRoZSB1bmlvbiBpcyBudWxsLAorICAgIC8vLyByZWdhcmRsZXNzIG9mIHdoaWNoIHR5cGUgaXQgaXMuCisgICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiBWYWwuZ2V0UG9pbnRlcigpID09IDA7IH0KKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIWlzTnVsbCgpOyB9CisKKyAgICAvLy8gaXM8VD4oKSByZXR1cm4gdHJ1ZSBpZiB0aGUgVW5pb24gY3VycmVudGx5IGhvbGRzIHRoZSB0eXBlIG1hdGNoaW5nIFQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbnQgaXMoKSBjb25zdCB7CisgICAgICBpbnQgVHlObyA9IDo6bGx2bTo6Z2V0UG9pbnRlclVuaW9uVHlwZU51bTxQVDEsIFBUMj4oKFQqKTApOworICAgICAgYXNzZXJ0KFR5Tm8gIT0gLTEgJiYgIlR5cGUgcXVlcnkgY291bGQgbmV2ZXIgc3VjY2VlZCBvbiBQb2ludGVyVW5pb24hIik7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihWYWwuZ2V0SW50KCkpID09IFR5Tm87CisgICAgfQorICAgIAorICAgIC8vLyBnZXQ8VD4oKSAtIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwb2ludGVyIHR5cGUuIElmIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgcG9pbnRlciB0eXBlIGlzIGluY29ycmVjdCwgYXNzZXJ0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCBnZXQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXM8VD4oKSAmJiAiSW52YWxpZCBhY2Nlc3NvciBjYWxsZWQiKTsKKyAgICAgIHJldHVybiBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VD46OmdldEZyb21Wb2lkUG9pbnRlcihWYWwuZ2V0UG9pbnRlcigpKTsKKyAgICB9CisgICAgCisgICAgLy8vIGR5bl9jYXN0PFQ+KCkgLSBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBvZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZSwKKyAgICAvLy8gcmV0dXJuIGl0LCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBUIGR5bl9jYXN0KCkgY29uc3QgeworICAgICAgaWYgKGlzPFQ+KCkpIHJldHVybiBnZXQ8VD4oKTsKKyAgICAgIHJldHVybiBUKCk7CisgICAgfQorICAgIAorICAgIC8vLyBBc3NpZ25tZW50IG9wZXJhdG9ycyAtIEFsbG93IGFzc2lnbmluZyBpbnRvIHRoaXMgdW5pb24gZnJvbSBlaXRoZXIKKyAgICAvLy8gcG9pbnRlciB0eXBlLCBzZXR0aW5nIHRoZSBkaXNjcmltaW5hdG9yIHRvIHJlbWVtYmVyIHdoYXQgaXQgY2FtZSBmcm9tLgorICAgIGNvbnN0IFBvaW50ZXJVbmlvbiAmb3BlcmF0b3I9KGNvbnN0IFBUMSAmUkhTKSB7CisgICAgICBWYWwuc2V0UG9pbnRlcigKKyAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPihQb2ludGVyTGlrZVR5cGVUcmFpdHM8UFQxPjo6Z2V0QXNWb2lkUG9pbnRlcihSSFMpKSk7CisgICAgICBWYWwuc2V0SW50KDApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBjb25zdCBQb2ludGVyVW5pb24gJm9wZXJhdG9yPShjb25zdCBQVDIgJlJIUykgeworICAgICAgVmFsLnNldFBvaW50ZXIoCisgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPihQb2ludGVyTGlrZVR5cGVUcmFpdHM8UFQyPjo6Z2V0QXNWb2lkUG9pbnRlcihSSFMpKSk7CisgICAgICBWYWwuc2V0SW50KDEpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAKKyAgICB2b2lkICpnZXRPcGFxdWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRPcGFxdWVWYWx1ZSgpOyB9CisgICAgc3RhdGljIGlubGluZSBQb2ludGVyVW5pb24gZ2V0RnJvbU9wYXF1ZVZhbHVlKHZvaWQgKlZQKSB7CisgICAgICBQb2ludGVyVW5pb24gVjsKKyAgICAgIFYuVmFsID0gVmFsVHk6OmdldEZyb21PcGFxdWVWYWx1ZShWUCk7CisgICAgICByZXR1cm4gVjsKKyAgICB9CisgIH07CisgIAorICAvLyBUZWFjaCBTbWFsbFB0clNldCB0aGF0IFBvaW50ZXJVbmlvbiBpcyAiYmFzaWNhbGx5IGEgcG9pbnRlciIsIHRoYXQgaGFzCisgIC8vICMgbG93IGJpdHMgYXZhaWxhYmxlID0gbWluKFBUMWJpdHMsUFQyYml0cyktMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDI+CisgIGNsYXNzIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQb2ludGVyVW5pb248UFQxLCBQVDI+ID4geworICBwdWJsaWM6CisgICAgc3RhdGljIGlubGluZSB2b2lkICoKKyAgICBnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFBvaW50ZXJVbmlvbjxQVDEsIFBUMj4gJlApIHsKKyAgICAgIHJldHVybiBQLmdldE9wYXF1ZVZhbHVlKCk7CisgICAgfQorICAgIHN0YXRpYyBpbmxpbmUgUG9pbnRlclVuaW9uPFBUMSwgUFQyPgorICAgIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgICByZXR1cm4gUG9pbnRlclVuaW9uPFBUMSwgUFQyPjo6Z2V0RnJvbU9wYXF1ZVZhbHVlKFApOworICAgIH0KKyAgICAKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlIGFyZSB0aGUgbWluIG9mIHRoZSB0d28gcG9pbnRlciB0eXBlcy4KKyAgICBlbnVtIHsKKyAgICAgIE51bUxvd0JpdHNBdmFpbGFibGUgPSAKKyAgICAgICAgUG9pbnRlckxpa2VUeXBlVHJhaXRzPHR5cGVuYW1lIFBvaW50ZXJVbmlvbjxQVDEsUFQyPjo6VmFsVHk+CisgICAgICAgICAgOjpOdW1Mb3dCaXRzQXZhaWxhYmxlCisgICAgfTsKKyAgfTsKKyAgCisgIAorICAvLy8gUG9pbnRlclVuaW9uMyAtIFRoaXMgaXMgYSBwb2ludGVyIHVuaW9uIG9mIHRocmVlIHBvaW50ZXIgdHlwZXMuICBTZWUKKyAgLy8vIGRvY3VtZW50YXRpb24gZm9yIFBvaW50ZXJVbmlvbiBmb3IgdXNhZ2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMiwgdHlwZW5hbWUgUFQzPgorICBjbGFzcyBQb2ludGVyVW5pb24zIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgUG9pbnRlclVuaW9uPFBUMSwgUFQyPiBJbm5lclVuaW9uOworICAgIHR5cGVkZWYgUG9pbnRlclVuaW9uPElubmVyVW5pb24sIFBUMz4gVmFsVHk7CisgIHByaXZhdGU6CisgICAgVmFsVHkgVmFsOworICBwdWJsaWM6CisgICAgUG9pbnRlclVuaW9uMygpIHt9CisgICAgCisgICAgUG9pbnRlclVuaW9uMyhQVDEgVikgeworICAgICAgVmFsID0gSW5uZXJVbmlvbihWKTsKKyAgICB9CisgICAgUG9pbnRlclVuaW9uMyhQVDIgVikgeworICAgICAgVmFsID0gSW5uZXJVbmlvbihWKTsKKyAgICB9CisgICAgUG9pbnRlclVuaW9uMyhQVDMgVikgeworICAgICAgVmFsID0gVjsKKyAgICB9CisgICAgCisgICAgLy8vIGlzTnVsbCAtIFJldHVybiB0cnVlIGlmIHRoZSBwb2ludGVyIGhlbGQgaW4gdGhlIHVuaW9uIGlzIG51bGwsCisgICAgLy8vIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdHlwZSBpdCBpcy4KKyAgICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIFZhbC5pc051bGwoKTsgfQorICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhaXNOdWxsKCk7IH0KKyAgICAKKyAgICAvLy8gaXM8VD4oKSByZXR1cm4gdHJ1ZSBpZiB0aGUgVW5pb24gY3VycmVudGx5IGhvbGRzIHRoZSB0eXBlIG1hdGNoaW5nIFQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbnQgaXMoKSBjb25zdCB7CisgICAgICAvLyBJcyBpdCBQVDEvUFQyPworICAgICAgaWYgKDo6bGx2bTo6Z2V0UG9pbnRlclVuaW9uVHlwZU51bTxQVDEsIFBUMj4oKFQqKTApICE9IC0xKQorICAgICAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGlzPElubmVyVW5pb24+KCkgJiYgCisgICAgICAgICAgICAgICBWYWwudGVtcGxhdGUgZ2V0PElubmVyVW5pb24+KCkudGVtcGxhdGUgaXM8VD4oKTsKKyAgICAgIHJldHVybiBWYWwudGVtcGxhdGUgaXM8VD4oKTsKKyAgICB9CisgICAgCisgICAgLy8vIGdldDxUPigpIC0gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZS4gSWYgdGhlCisgICAgLy8vIHNwZWNpZmllZCBwb2ludGVyIHR5cGUgaXMgaW5jb3JyZWN0LCBhc3NlcnQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBUIGdldCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpczxUPigpICYmICJJbnZhbGlkIGFjY2Vzc29yIGNhbGxlZCIpOworICAgICAgLy8gSXMgaXQgUFQxL1BUMj8KKyAgICAgIGlmICg6Omxsdm06OmdldFBvaW50ZXJVbmlvblR5cGVOdW08UFQxLCBQVDI+KChUKikwKSAhPSAtMSkKKyAgICAgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8SW5uZXJVbmlvbj4oKS50ZW1wbGF0ZSBnZXQ8VD4oKTsKKyAgICAgIAorICAgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8VD4oKTsKKyAgICB9CisgICAgCisgICAgLy8vIGR5bl9jYXN0PFQ+KCkgLSBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBvZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZSwKKyAgICAvLy8gcmV0dXJuIGl0LCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBUIGR5bl9jYXN0KCkgY29uc3QgeworICAgICAgaWYgKGlzPFQ+KCkpIHJldHVybiBnZXQ8VD4oKTsKKyAgICAgIHJldHVybiBUKCk7CisgICAgfQorICAgIAorICAgIC8vLyBBc3NpZ25tZW50IG9wZXJhdG9ycyAtIEFsbG93IGFzc2lnbmluZyBpbnRvIHRoaXMgdW5pb24gZnJvbSBlaXRoZXIKKyAgICAvLy8gcG9pbnRlciB0eXBlLCBzZXR0aW5nIHRoZSBkaXNjcmltaW5hdG9yIHRvIHJlbWVtYmVyIHdoYXQgaXQgY2FtZSBmcm9tLgorICAgIGNvbnN0IFBvaW50ZXJVbmlvbjMgJm9wZXJhdG9yPShjb25zdCBQVDEgJlJIUykgeworICAgICAgVmFsID0gSW5uZXJVbmlvbihSSFMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBjb25zdCBQb2ludGVyVW5pb24zICZvcGVyYXRvcj0oY29uc3QgUFQyICZSSFMpIHsKKyAgICAgIFZhbCA9IElubmVyVW5pb24oUkhTKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgY29uc3QgUG9pbnRlclVuaW9uMyAmb3BlcmF0b3I9KGNvbnN0IFBUMyAmUkhTKSB7CisgICAgICBWYWwgPSBSSFM7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAgIHZvaWQgKmdldE9wYXF1ZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldE9wYXF1ZVZhbHVlKCk7IH0KKyAgICBzdGF0aWMgaW5saW5lIFBvaW50ZXJVbmlvbjMgZ2V0RnJvbU9wYXF1ZVZhbHVlKHZvaWQgKlZQKSB7CisgICAgICBQb2ludGVyVW5pb24zIFY7CisgICAgICBWLlZhbCA9IFZhbFR5OjpnZXRGcm9tT3BhcXVlVmFsdWUoVlApOworICAgICAgcmV0dXJuIFY7CisgICAgfQorICB9OworIAorICAvLyBUZWFjaCBTbWFsbFB0clNldCB0aGF0IFBvaW50ZXJVbmlvbjMgaXMgImJhc2ljYWxseSBhIHBvaW50ZXIiLCB0aGF0IGhhcworICAvLyAjIGxvdyBiaXRzIGF2YWlsYWJsZSA9IG1pbihQVDFiaXRzLFBUMmJpdHMsUFQyYml0cyktMi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDIsIHR5cGVuYW1lIFBUMz4KKyAgY2xhc3MgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJVbmlvbjM8UFQxLCBQVDIsIFBUMz4gPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgKgorICAgIGdldEFzVm9pZFBvaW50ZXIoY29uc3QgUG9pbnRlclVuaW9uMzxQVDEsIFBUMiwgUFQzPiAmUCkgeworICAgICAgcmV0dXJuIFAuZ2V0T3BhcXVlVmFsdWUoKTsKKyAgICB9CisgICAgc3RhdGljIGlubGluZSBQb2ludGVyVW5pb24zPFBUMSwgUFQyLCBQVDM+CisgICAgZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKKyAgICAgIHJldHVybiBQb2ludGVyVW5pb24zPFBUMSwgUFQyLCBQVDM+OjpnZXRGcm9tT3BhcXVlVmFsdWUoUCk7CisgICAgfQorICAgIAorICAgIC8vIFRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgYXJlIHRoZSBtaW4gb2YgdGhlIHR3byBwb2ludGVyIHR5cGVzLgorICAgIGVudW0geworICAgICAgTnVtTG93Qml0c0F2YWlsYWJsZSA9IAorICAgICAgICBQb2ludGVyTGlrZVR5cGVUcmFpdHM8dHlwZW5hbWUgUG9pbnRlclVuaW9uMzxQVDEsIFBUMiwgUFQzPjo6VmFsVHk+CisgICAgICAgICAgOjpOdW1Mb3dCaXRzQXZhaWxhYmxlCisgICAgfTsKKyAgfTsKKworICAvLy8gUG9pbnRlclVuaW9uNCAtIFRoaXMgaXMgYSBwb2ludGVyIHVuaW9uIG9mIGZvdXIgcG9pbnRlciB0eXBlcy4gIFNlZQorICAvLy8gZG9jdW1lbnRhdGlvbiBmb3IgUG9pbnRlclVuaW9uIGZvciB1c2FnZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyLCB0eXBlbmFtZSBQVDMsIHR5cGVuYW1lIFBUND4KKyAgY2xhc3MgUG9pbnRlclVuaW9uNCB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFBvaW50ZXJVbmlvbjxQVDEsIFBUMj4gSW5uZXJVbmlvbjE7CisgICAgdHlwZWRlZiBQb2ludGVyVW5pb248UFQzLCBQVDQ+IElubmVyVW5pb24yOworICAgIHR5cGVkZWYgUG9pbnRlclVuaW9uPElubmVyVW5pb24xLCBJbm5lclVuaW9uMj4gVmFsVHk7CisgIHByaXZhdGU6CisgICAgVmFsVHkgVmFsOworICBwdWJsaWM6CisgICAgUG9pbnRlclVuaW9uNCgpIHt9CisgICAgCisgICAgUG9pbnRlclVuaW9uNChQVDEgVikgeworICAgICAgVmFsID0gSW5uZXJVbmlvbjEoVik7CisgICAgfQorICAgIFBvaW50ZXJVbmlvbjQoUFQyIFYpIHsKKyAgICAgIFZhbCA9IElubmVyVW5pb24xKFYpOworICAgIH0KKyAgICBQb2ludGVyVW5pb240KFBUMyBWKSB7CisgICAgICBWYWwgPSBJbm5lclVuaW9uMihWKTsKKyAgICB9CisgICAgUG9pbnRlclVuaW9uNChQVDQgVikgeworICAgICAgVmFsID0gSW5uZXJVbmlvbjIoVik7CisgICAgfQorICAgIAorICAgIC8vLyBpc051bGwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcG9pbnRlciBoZWxkIGluIHRoZSB1bmlvbiBpcyBudWxsLAorICAgIC8vLyByZWdhcmRsZXNzIG9mIHdoaWNoIHR5cGUgaXQgaXMuCisgICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiBWYWwuaXNOdWxsKCk7IH0KKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIWlzTnVsbCgpOyB9CisgICAgCisgICAgLy8vIGlzPFQ+KCkgcmV0dXJuIHRydWUgaWYgdGhlIFVuaW9uIGN1cnJlbnRseSBob2xkcyB0aGUgdHlwZSBtYXRjaGluZyBULgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW50IGlzKCkgY29uc3QgeworICAgICAgLy8gSXMgaXQgUFQxL1BUMj8KKyAgICAgIGlmICg6Omxsdm06OmdldFBvaW50ZXJVbmlvblR5cGVOdW08UFQxLCBQVDI+KChUKikwKSAhPSAtMSkKKyAgICAgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBpczxJbm5lclVuaW9uMT4oKSAmJiAKKyAgICAgICAgICAgICAgIFZhbC50ZW1wbGF0ZSBnZXQ8SW5uZXJVbmlvbjE+KCkudGVtcGxhdGUgaXM8VD4oKTsKKyAgICAgIHJldHVybiBWYWwudGVtcGxhdGUgaXM8SW5uZXJVbmlvbjI+KCkgJiYgCisgICAgICAgICAgICAgVmFsLnRlbXBsYXRlIGdldDxJbm5lclVuaW9uMj4oKS50ZW1wbGF0ZSBpczxUPigpOworICAgIH0KKyAgICAKKyAgICAvLy8gZ2V0PFQ+KCkgLSBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnRlciB0eXBlLiBJZiB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIHBvaW50ZXIgdHlwZSBpcyBpbmNvcnJlY3QsIGFzc2VydC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQgZ2V0KCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzPFQ+KCkgJiYgIkludmFsaWQgYWNjZXNzb3IgY2FsbGVkIik7CisgICAgICAvLyBJcyBpdCBQVDEvUFQyPworICAgICAgaWYgKDo6bGx2bTo6Z2V0UG9pbnRlclVuaW9uVHlwZU51bTxQVDEsIFBUMj4oKFQqKTApICE9IC0xKQorICAgICAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGdldDxJbm5lclVuaW9uMT4oKS50ZW1wbGF0ZSBnZXQ8VD4oKTsKKyAgICAgIAorICAgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8SW5uZXJVbmlvbjI+KCkudGVtcGxhdGUgZ2V0PFQ+KCk7CisgICAgfQorICAgIAorICAgIC8vLyBkeW5fY2FzdDxUPigpIC0gSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgb2YgdGhlIHNwZWNpZmllZCBwb2ludGVyIHR5cGUsCisgICAgLy8vIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCBkeW5fY2FzdCgpIGNvbnN0IHsKKyAgICAgIGlmIChpczxUPigpKSByZXR1cm4gZ2V0PFQ+KCk7CisgICAgICByZXR1cm4gVCgpOworICAgIH0KKyAgICAKKyAgICAvLy8gQXNzaWdubWVudCBvcGVyYXRvcnMgLSBBbGxvdyBhc3NpZ25pbmcgaW50byB0aGlzIHVuaW9uIGZyb20gZWl0aGVyCisgICAgLy8vIHBvaW50ZXIgdHlwZSwgc2V0dGluZyB0aGUgZGlzY3JpbWluYXRvciB0byByZW1lbWJlciB3aGF0IGl0IGNhbWUgZnJvbS4KKyAgICBjb25zdCBQb2ludGVyVW5pb240ICZvcGVyYXRvcj0oY29uc3QgUFQxICZSSFMpIHsKKyAgICAgIFZhbCA9IElubmVyVW5pb24xKFJIUyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGNvbnN0IFBvaW50ZXJVbmlvbjQgJm9wZXJhdG9yPShjb25zdCBQVDIgJlJIUykgeworICAgICAgVmFsID0gSW5uZXJVbmlvbjEoUkhTKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgY29uc3QgUG9pbnRlclVuaW9uNCAmb3BlcmF0b3I9KGNvbnN0IFBUMyAmUkhTKSB7CisgICAgICBWYWwgPSBJbm5lclVuaW9uMihSSFMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBjb25zdCBQb2ludGVyVW5pb240ICZvcGVyYXRvcj0oY29uc3QgUFQ0ICZSSFMpIHsKKyAgICAgIFZhbCA9IElubmVyVW5pb24yKFJIUyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAgIHZvaWQgKmdldE9wYXF1ZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldE9wYXF1ZVZhbHVlKCk7IH0KKyAgICBzdGF0aWMgaW5saW5lIFBvaW50ZXJVbmlvbjQgZ2V0RnJvbU9wYXF1ZVZhbHVlKHZvaWQgKlZQKSB7CisgICAgICBQb2ludGVyVW5pb240IFY7CisgICAgICBWLlZhbCA9IFZhbFR5OjpnZXRGcm9tT3BhcXVlVmFsdWUoVlApOworICAgICAgcmV0dXJuIFY7CisgICAgfQorICB9OworICAKKyAgLy8gVGVhY2ggU21hbGxQdHJTZXQgdGhhdCBQb2ludGVyVW5pb240IGlzICJiYXNpY2FsbHkgYSBwb2ludGVyIiwgdGhhdCBoYXMKKyAgLy8gIyBsb3cgYml0cyBhdmFpbGFibGUgPSBtaW4oUFQxYml0cyxQVDJiaXRzLFBUMmJpdHMpLTIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyLCB0eXBlbmFtZSBQVDMsIHR5cGVuYW1lIFBUND4KKyAgY2xhc3MgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJVbmlvbjQ8UFQxLCBQVDIsIFBUMywgUFQ0PiA+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCAqCisgICAgZ2V0QXNWb2lkUG9pbnRlcihjb25zdCBQb2ludGVyVW5pb240PFBUMSwgUFQyLCBQVDMsIFBUND4gJlApIHsKKyAgICAgIHJldHVybiBQLmdldE9wYXF1ZVZhbHVlKCk7CisgICAgfQorICAgIHN0YXRpYyBpbmxpbmUgUG9pbnRlclVuaW9uNDxQVDEsIFBUMiwgUFQzLCBQVDQ+CisgICAgZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKKyAgICAgIHJldHVybiBQb2ludGVyVW5pb240PFBUMSwgUFQyLCBQVDMsIFBUND46OmdldEZyb21PcGFxdWVWYWx1ZShQKTsKKyAgICB9CisgICAgCisgICAgLy8gVGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBhcmUgdGhlIG1pbiBvZiB0aGUgdHdvIHBvaW50ZXIgdHlwZXMuCisgICAgZW51bSB7CisgICAgICBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gCisgICAgICAgIFBvaW50ZXJMaWtlVHlwZVRyYWl0czx0eXBlbmFtZSBQb2ludGVyVW5pb240PFBUMSwgUFQyLCBQVDMsIFBUND46OlZhbFR5PgorICAgICAgICAgIDo6TnVtTG93Qml0c0F2YWlsYWJsZQorICAgIH07CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZTViMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8vPT09LSBsbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIC0gUG9zdE9yZGVyIGl0ZXJhdG9yIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGJ1aWxkcyBvbiB0aGUgQURUL0dyYXBoVHJhaXRzLmggZmlsZSB0byBidWlsZCBhIGdlbmVyaWMgZ3JhcGgKKy8vIHBvc3Qgb3JkZXIgaXRlcmF0b3IuICBUaGlzIHNob3VsZCB3b3JrIG92ZXIgYW55IGdyYXBoIHR5cGUgdGhhdCBoYXMgYQorLy8gR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9QT1NUT1JERVJJVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fQURUX1BPU1RPUkRFUklURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlPGNsYXNzIFNldFR5cGUsIGJvb2wgRXh0ZXJuYWw+ICAgLy8gTm9uLWV4dGVybmFsIHNldAorY2xhc3MgcG9faXRlcmF0b3Jfc3RvcmFnZSB7CitwdWJsaWM6CisgIFNldFR5cGUgVmlzaXRlZDsKK307CisKK3RlbXBsYXRlPGNsYXNzIFNldFR5cGU+CitjbGFzcyBwb19pdGVyYXRvcl9zdG9yYWdlPFNldFR5cGUsIHRydWU+IHsKK3B1YmxpYzoKKyAgcG9faXRlcmF0b3Jfc3RvcmFnZShTZXRUeXBlICZWU2V0KSA6IFZpc2l0ZWQoVlNldCkge30KKyAgcG9faXRlcmF0b3Jfc3RvcmFnZShjb25zdCBwb19pdGVyYXRvcl9zdG9yYWdlICZTKSA6IFZpc2l0ZWQoUy5WaXNpdGVkKSB7fQorICBTZXRUeXBlICZWaXNpdGVkOworfTsKKwordGVtcGxhdGU8Y2xhc3MgR3JhcGhULAorICBjbGFzcyBTZXRUeXBlID0gbGx2bTo6U21hbGxQdHJTZXQ8dHlwZW5hbWUgR3JhcGhUcmFpdHM8R3JhcGhUPjo6Tm9kZVR5cGUqLCA4PiwKKyAgYm9vbCBFeHRTdG9yYWdlID0gZmFsc2UsCisgIGNsYXNzIEdUID0gR3JhcGhUcmFpdHM8R3JhcGhUPiA+CitjbGFzcyBwb19pdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEdUOjpOb2RlVHlwZSwgcHRyZGlmZl90PiwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHBvX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4geworICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEdUOjpOb2RlVHlwZSwgcHRyZGlmZl90PiBzdXBlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBHVDo6Tm9kZVR5cGUgICAgICAgICAgTm9kZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgR1Q6OkNoaWxkSXRlcmF0b3JUeXBlIENoaWxkSXRUeTsKKworICAvLyBWaXNpdFN0YWNrIC0gVXNlZCB0byBtYWludGFpbiB0aGUgb3JkZXJpbmcuICBUb3AgPSBjdXJyZW50IGJsb2NrCisgIC8vIEZpcnN0IGVsZW1lbnQgaXMgYmFzaWMgYmxvY2sgcG9pbnRlciwgc2Vjb25kIGlzIHRoZSAnbmV4dCBjaGlsZCcgdG8gdmlzaXQKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPE5vZGVUeXBlICosIENoaWxkSXRUeT4gPiBWaXNpdFN0YWNrOworCisgIHZvaWQgdHJhdmVyc2VDaGlsZCgpIHsKKyAgICB3aGlsZSAoVmlzaXRTdGFjay5iYWNrKCkuc2Vjb25kICE9IEdUOjpjaGlsZF9lbmQoVmlzaXRTdGFjay5iYWNrKCkuZmlyc3QpKSB7CisgICAgICBOb2RlVHlwZSAqQkIgPSAqVmlzaXRTdGFjay5iYWNrKCkuc2Vjb25kKys7CisgICAgICBpZiAoIXRoaXMtPlZpc2l0ZWQuY291bnQoQkIpKSB7ICAvLyBJZiB0aGUgYmxvY2sgaXMgbm90IHZpc2l0ZWQuLi4KKyAgICAgICAgdGhpcy0+VmlzaXRlZC5pbnNlcnQoQkIpOworICAgICAgICBWaXNpdFN0YWNrLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihCQiwgR1Q6OmNoaWxkX2JlZ2luKEJCKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlubGluZSBwb19pdGVyYXRvcihOb2RlVHlwZSAqQkIpIHsKKyAgICB0aGlzLT5WaXNpdGVkLmluc2VydChCQik7CisgICAgVmlzaXRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQkIsIEdUOjpjaGlsZF9iZWdpbihCQikpKTsKKyAgICB0cmF2ZXJzZUNoaWxkKCk7CisgIH0KKyAgaW5saW5lIHBvX2l0ZXJhdG9yKCkge30gLy8gRW5kIGlzIHdoZW4gc3RhY2sgaXMgZW1wdHkuCisKKyAgaW5saW5lIHBvX2l0ZXJhdG9yKE5vZGVUeXBlICpCQiwgU2V0VHlwZSAmUykgOgorICAgIHBvX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4oUykgeworICAgIGlmKCFTLmNvdW50KEJCKSkgeworICAgICAgdGhpcy0+VmlzaXRlZC5pbnNlcnQoQkIpOworICAgICAgVmlzaXRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQkIsIEdUOjpjaGlsZF9iZWdpbihCQikpKTsKKyAgICAgIHRyYXZlcnNlQ2hpbGQoKTsKKyAgICB9CisgIH0KKworICBpbmxpbmUgcG9faXRlcmF0b3IoU2V0VHlwZSAmUykgOgorICAgICAgcG9faXRlcmF0b3Jfc3RvcmFnZTxTZXRUeXBlLCBFeHRTdG9yYWdlPihTKSB7CisgIH0gLy8gRW5kIGlzIHdoZW4gc3RhY2sgaXMgZW1wdHkuCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXI6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiBwb19pdGVyYXRvcjxHcmFwaFQsIFNldFR5cGUsIEV4dFN0b3JhZ2UsIEdUPiBfU2VsZjsKKworICAvLyBQcm92aWRlIHN0YXRpYyAiY29uc3RydWN0b3JzIi4uLgorICBzdGF0aWMgaW5saW5lIF9TZWxmIGJlZ2luKEdyYXBoVCBHKSB7IHJldHVybiBfU2VsZihHVDo6Z2V0RW50cnlOb2RlKEcpKTsgfQorICBzdGF0aWMgaW5saW5lIF9TZWxmIGVuZCAgKEdyYXBoVCBHKSB7IHJldHVybiBfU2VsZigpOyB9CisKKyAgc3RhdGljIGlubGluZSBfU2VsZiBiZWdpbihHcmFwaFQgRywgU2V0VHlwZSAmUykgeworICAgIHJldHVybiBfU2VsZihHVDo6Z2V0RW50cnlOb2RlKEcpLCBTKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIF9TZWxmIGVuZCAgKEdyYXBoVCBHLCBTZXRUeXBlICZTKSB7IHJldHVybiBfU2VsZihTKTsgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX1NlbGYmIHgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmlzaXRTdGFjayA9PSB4LlZpc2l0U3RhY2s7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICBpbmxpbmUgcG9pbnRlciBvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIFZpc2l0U3RhY2suYmFjaygpLmZpcnN0OworICB9CisKKyAgLy8gVGhpcyBpcyBhIG5vbnN0YW5kYXJkIG9wZXJhdG9yLT4gdGhhdCBkZXJlZmVyZW5jZXMgdGhlIHBvaW50ZXIgYW4gZXh0cmEKKyAgLy8gdGltZS4uLiBzbyB0aGF0IHlvdSBjYW4gYWN0dWFsbHkgY2FsbCBtZXRob2RzIE9OIHRoZSBCYXNpY0Jsb2NrLCBiZWNhdXNlCisgIC8vIHRoZSBjb250YWluZWQgdHlwZSBpcyBhIHBvaW50ZXIuICBUaGlzIGFsbG93cyBCQkl0LT5nZXRUZXJtaW5hdG9yKCkgZi5lLgorICAvLworICBpbmxpbmUgTm9kZVR5cGUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciooKTsgfQorCisgIGlubGluZSBfU2VsZiYgb3BlcmF0b3IrKygpIHsgICAvLyBQcmVpbmNyZW1lbnQKKyAgICBWaXNpdFN0YWNrLnBvcF9iYWNrKCk7CisgICAgaWYgKCFWaXNpdFN0YWNrLmVtcHR5KCkpCisgICAgICB0cmF2ZXJzZUNoaWxkKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICBfU2VsZiB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBnbG9iYWwgY29uc3RydWN0b3JzIHRoYXQgYXV0b21hdGljYWxseSBmaWd1cmUgb3V0IGNvcnJlY3QgdHlwZXMuLi4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3BvX2l0ZXJhdG9yPFQ+IHBvX2JlZ2luKFQgRykgeyByZXR1cm4gcG9faXRlcmF0b3I8VD46OmJlZ2luKEcpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3BvX2l0ZXJhdG9yPFQ+IHBvX2VuZCAgKFQgRykgeyByZXR1cm4gcG9faXRlcmF0b3I8VD46OmVuZChHKTsgfQorCisvLyBQcm92aWRlIGdsb2JhbCBkZWZpbml0aW9ucyBvZiBleHRlcm5hbCBwb3N0b3JkZXIgaXRlcmF0b3JzLi4uCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTZXRUeXBlPXN0ZDo6c2V0PHR5cGVuYW1lIEdyYXBoVHJhaXRzPFQ+OjpOb2RlVHlwZSo+ID4KK3N0cnVjdCBwb19leHRfaXRlcmF0b3IgOiBwdWJsaWMgcG9faXRlcmF0b3I8VCwgU2V0VHlwZSwgdHJ1ZT4geworICBwb19leHRfaXRlcmF0b3IoY29uc3QgcG9faXRlcmF0b3I8VCwgU2V0VHlwZSwgdHJ1ZT4gJlYpIDoKKyAgcG9faXRlcmF0b3I8VCwgU2V0VHlwZSwgdHJ1ZT4oVikge30KK307CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFNldFR5cGU+Citwb19leHRfaXRlcmF0b3I8VCwgU2V0VHlwZT4gcG9fZXh0X2JlZ2luKFQgRywgU2V0VHlwZSAmUykgeworICByZXR1cm4gcG9fZXh0X2l0ZXJhdG9yPFQsIFNldFR5cGU+OjpiZWdpbihHLCBTKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgU2V0VHlwZT4KK3BvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPiBwb19leHRfZW5kKFQgRywgU2V0VHlwZSAmUykgeworICByZXR1cm4gcG9fZXh0X2l0ZXJhdG9yPFQsIFNldFR5cGU+OjplbmQoRywgUyk7Cit9CisKKy8vIFByb3ZpZGUgZ2xvYmFsIGRlZmluaXRpb25zIG9mIGludmVyc2UgcG9zdCBvcmRlciBpdGVyYXRvcnMuLi4KK3RlbXBsYXRlIDxjbGFzcyBULAorICAgICAgICAgIGNsYXNzIFNldFR5cGUgPSBzdGQ6OnNldDx0eXBlbmFtZSBHcmFwaFRyYWl0czxUPjo6Tm9kZVR5cGUqPiwKKyAgICAgICAgICBib29sIEV4dGVybmFsID0gZmFsc2U+CitzdHJ1Y3QgaXBvX2l0ZXJhdG9yIDogcHVibGljIHBvX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5cGUsIEV4dGVybmFsID4geworICBpcG9faXRlcmF0b3IoY29uc3QgcG9faXRlcmF0b3I8SW52ZXJzZTxUPiwgU2V0VHlwZSwgRXh0ZXJuYWw+ICZWKSA6CisgICAgIHBvX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5cGUsIEV4dGVybmFsPiAoVikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraXBvX2l0ZXJhdG9yPFQ+IGlwb19iZWdpbihUIEcsIGJvb2wgUmV2ZXJzZSA9IGZhbHNlKSB7CisgIHJldHVybiBpcG9faXRlcmF0b3I8VD46OmJlZ2luKEcsIFJldmVyc2UpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lwb19pdGVyYXRvcjxUPiBpcG9fZW5kKFQgRyl7CisgIHJldHVybiBpcG9faXRlcmF0b3I8VD46OmVuZChHKTsKK30KKworLy9Qcm92aWRlIGdsb2JhbCBkZWZpbml0aW9ucyBvZiBleHRlcm5hbCBpbnZlcnNlIHBvc3RvcmRlciBpdGVyYXRvcnMuLi4KK3RlbXBsYXRlIDxjbGFzcyBULAorICAgICAgICAgIGNsYXNzIFNldFR5cGUgPSBzdGQ6OnNldDx0eXBlbmFtZSBHcmFwaFRyYWl0czxUPjo6Tm9kZVR5cGUqPiA+CitzdHJ1Y3QgaXBvX2V4dF9pdGVyYXRvciA6IHB1YmxpYyBpcG9faXRlcmF0b3I8VCwgU2V0VHlwZSwgdHJ1ZT4geworICBpcG9fZXh0X2l0ZXJhdG9yKGNvbnN0IGlwb19pdGVyYXRvcjxULCBTZXRUeXBlLCB0cnVlPiAmVikgOgorICAgIGlwb19pdGVyYXRvcjxULCBTZXRUeXBlLCB0cnVlPigmVikge30KKyAgaXBvX2V4dF9pdGVyYXRvcihjb25zdCBwb19pdGVyYXRvcjxJbnZlcnNlPFQ+LCBTZXRUeXBlLCB0cnVlPiAmVikgOgorICAgIGlwb19pdGVyYXRvcjxULCBTZXRUeXBlLCB0cnVlPigmVikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeXBlPgoraXBvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPiBpcG9fZXh0X2JlZ2luKFQgRywgU2V0VHlwZSAmUykgeworICByZXR1cm4gaXBvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPjo6YmVnaW4oRywgUyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeXBlPgoraXBvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPiBpcG9fZXh0X2VuZChUIEcsIFNldFR5cGUgJlMpIHsKKyAgcmV0dXJuIGlwb19leHRfaXRlcmF0b3I8VCwgU2V0VHlwZT46OmVuZChHLCBTKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSZXZlcnNlIFBvc3QgT3JkZXIgQ0ZHIGl0ZXJhdG9yIGNvZGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgdXNlZCB0byB2aXNpdCBiYXNpYyBibG9ja3MgaW4gYSBtZXRob2QgaW4gcmV2ZXJzZSBwb3N0IG9yZGVyLiAgVGhpcworLy8gY2xhc3MgaXMgYXdrd2FyZCB0byB1c2UgYmVjYXVzZSBJIGRvbid0IGtub3cgYSBnb29kIGluY3JlbWVudGFsIGFsZ29yaXRobSB0bworLy8gY29tcHV0ZXIgUlBPIGZyb20gYSBncmFwaC4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUKKy8vIFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWwgb2JqZWN0IGlzIGV4cGVuc2l2ZSAoaXQgbXVzdCB3YWxrIHRoZSBlbnRpcmUgZ3JhcGgKKy8vIHdpdGggYSBwb3N0b3JkZXIgaXRlcmF0b3IgdG8gYnVpbGQgdGhlIGRhdGEgc3RydWN0dXJlcykuICBUaGUgbW9yYWwgb2YgdGhpcworLy8gc3RvcnkgaXM6IERvbid0IGNyZWF0ZSBtb3JlIFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWwgY2xhc3NlcyB0aGFuIG5lY2Vzc2FyeS4KKy8vCisvLyBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGxpa2UgdGhpczoKKy8vIHsKKy8vICAgUmV2ZXJzZVBvc3RPcmRlclRyYXZlcnNhbDxGdW5jdGlvbio+IFJQT1QoRnVuY1B0cik7IC8vIEV4cGVuc2l2ZSB0byBjcmVhdGUKKy8vICAgZm9yIChycG9faXRlcmF0b3IgSSA9IFJQT1QuYmVnaW4oKTsgSSAhPSBSUE9ULmVuZCgpOyArK0kpIHsKKy8vICAgICAgLi4uCisvLyAgIH0KKy8vICAgZm9yIChycG9faXRlcmF0b3IgSSA9IFJQT1QuYmVnaW4oKTsgSSAhPSBSUE9ULmVuZCgpOyArK0kpIHsKKy8vICAgICAgLi4uCisvLyAgIH0KKy8vIH0KKy8vCisKK3RlbXBsYXRlPGNsYXNzIEdyYXBoVCwgY2xhc3MgR1QgPSBHcmFwaFRyYWl0czxHcmFwaFQ+ID4KK2NsYXNzIFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWwgeworICB0eXBlZGVmIHR5cGVuYW1lIEdUOjpOb2RlVHlwZSBOb2RlVHlwZTsKKyAgc3RkOjp2ZWN0b3I8Tm9kZVR5cGUqPiBCbG9ja3M7ICAgICAgIC8vIEJsb2NrIGxpc3QgaW4gbm9ybWFsIFBPIG9yZGVyCisgIGlubGluZSB2b2lkIEluaXRpYWxpemUoTm9kZVR5cGUgKkJCKSB7CisgICAgY29weShwb19iZWdpbihCQiksIHBvX2VuZChCQiksIGJhY2tfaW5zZXJ0ZXIoQmxvY2tzKSk7CisgIH0KK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxOb2RlVHlwZSo+OjpyZXZlcnNlX2l0ZXJhdG9yIHJwb19pdGVyYXRvcjsKKworICBpbmxpbmUgUmV2ZXJzZVBvc3RPcmRlclRyYXZlcnNhbChHcmFwaFQgRykgeworICAgIEluaXRpYWxpemUoR1Q6OmdldEVudHJ5Tm9kZShHKSk7CisgIH0KKworICAvLyBCZWNhdXNlIHdlIHdhbnQgYSByZXZlcnNlIHBvc3Qgb3JkZXIsIHVzZSByZXZlcnNlIGl0ZXJhdG9ycyBmcm9tIHRoZSB2ZWN0b3IKKyAgaW5saW5lIHJwb19pdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEJsb2Nrcy5yYmVnaW4oKTsgfQorICBpbmxpbmUgcnBvX2l0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gQmxvY2tzLnJlbmQoKTsgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1ByaW9yaXR5UXVldWUuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvUHJpb3JpdHlRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOGE2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1ByaW9yaXR5UXVldWUuaApAQCAtMCwwICsxLDg0IEBACisvLz09PS0gbGx2bS9BRFQvUHJpb3JpdHlRdWV1ZS5oIC0gUHJpb3JpdHkgcXVldWVzIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQcmlvcml0eVF1ZXVlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfUFJJT1JJVFlfUVVFVUVfSAorI2RlZmluZSBMTFZNX0FEVF9QUklPUklUWV9RVUVVRV9ICisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8cXVldWU+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFByaW9yaXR5UXVldWUgLSBUaGlzIGNsYXNzIGJlaGF2ZXMgbGlrZSBzdGQ6OnByaW9yaXR5X3F1ZXVlIGFuZAorLy8vIHByb3ZpZGVzIGEgZmV3IGFkZGl0aW9uYWwgY29udmVuaWVuY2UgZnVuY3Rpb25zLgorLy8vCit0ZW1wbGF0ZTxjbGFzcyBULAorICAgICAgICAgY2xhc3MgU2VxdWVuY2UgPSBzdGQ6OnZlY3RvcjxUPiwKKyAgICAgICAgIGNsYXNzIENvbXBhcmUgPSBzdGQ6Omxlc3M8dHlwZW5hbWUgU2VxdWVuY2U6OnZhbHVlX3R5cGU+ID4KK2NsYXNzIFByaW9yaXR5UXVldWUgOiBwdWJsaWMgc3RkOjpwcmlvcml0eV9xdWV1ZTxULCBTZXF1ZW5jZSwgQ29tcGFyZT4geworcHVibGljOgorICBleHBsaWNpdCBQcmlvcml0eVF1ZXVlKGNvbnN0IENvbXBhcmUgJmNvbXBhcmUgPSBDb21wYXJlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VxdWVuY2UgJnNlcXVlbmNlID0gU2VxdWVuY2UoKSkKKyAgICA6IHN0ZDo6cHJpb3JpdHlfcXVldWU8VCwgU2VxdWVuY2UsIENvbXBhcmU+KGNvbXBhcmUsIHNlcXVlbmNlKQorICB7fQorCisgIHRlbXBsYXRlPGNsYXNzIEl0ZXJhdG9yPgorICBQcmlvcml0eVF1ZXVlKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsCisgICAgICAgICAgICAgICAgY29uc3QgQ29tcGFyZSAmY29tcGFyZSA9IENvbXBhcmUoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZSAmc2VxdWVuY2UgPSBTZXF1ZW5jZSgpKQorICAgIDogc3RkOjpwcmlvcml0eV9xdWV1ZTxULCBTZXF1ZW5jZSwgQ29tcGFyZT4oYmVnaW4sIGVuZCwgY29tcGFyZSwgc2VxdWVuY2UpCisgIHt9CisKKyAgLy8vIGVyYXNlX29uZSAtIEVyYXNlIG9uZSBlbGVtZW50IGZyb20gdGhlIHF1ZXVlLCByZWdhcmRsZXNzIG9mIGl0cworICAvLy8gcG9zaXRpb24uIFRoaXMgb3BlcmF0aW9uIHBlcmZvcm1zIGEgbGluZWFyIHNlYXJjaCB0byBmaW5kIGFuIGVsZW1lbnQKKyAgLy8vIGVxdWFsIHRvIHQsIGJ1dCB0aGVuIHVzZXMgYWxsIGxvZ2FyaXRobWljLXRpbWUgYWxnb3JpdGhtcyB0byBkbworICAvLy8gdGhlIGVyYXNlIG9wZXJhdGlvbi4KKyAgLy8vCisgIHZvaWQgZXJhc2Vfb25lKGNvbnN0IFQgJnQpIHsKKyAgICAvLyBMaW5lYXItc2VhcmNoIHRvIGZpbmQgdGhlIGVsZW1lbnQuCisgICAgdHlwZW5hbWUgU2VxdWVuY2U6OnNpemVfdHlwZSBpID0KKyAgICAgIHN0ZDo6ZmluZCh0aGlzLT5jLmJlZ2luKCksIHRoaXMtPmMuZW5kKCksIHQpIC0gdGhpcy0+Yy5iZWdpbigpOworCisgICAgLy8gTG9nYXJpdGhtaWMtdGltZSBoZWFwIGJ1YmJsZS11cC4KKyAgICB3aGlsZSAoaSAhPSAwKSB7CisgICAgICB0eXBlbmFtZSBTZXF1ZW5jZTo6c2l6ZV90eXBlIHBhcmVudCA9IChpIC0gMSkgLyAyOworICAgICAgdGhpcy0+Y1tpXSA9IHRoaXMtPmNbcGFyZW50XTsKKyAgICAgIGkgPSBwYXJlbnQ7CisgICAgfQorCisgICAgLy8gVGhlIGVsZW1lbnQgd2Ugd2FudCB0byByZW1vdmUgaXMgbm93IGF0IHRoZSByb290LCBzbyB3ZSBjYW4gdXNlCisgICAgLy8gcHJpb3JpdHlfcXVldWUncyBwbGFpbiBwb3AgdG8gcmVtb3ZlIGl0LgorICAgIHRoaXMtPnBvcCgpOworICB9CisKKyAgLy8vIHJlaGVhcGlmeSAtIElmIGFuIGVsZW1lbnQgaW4gdGhlIHF1ZXVlIGhhcyBjaGFuZ2VkIGluIGEgd2F5IHRoYXQKKyAgLy8vIGFmZmVjdHMgaXRzIHN0YW5kaW5nIGluIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLCB0aGUgcXVldWUncworICAvLy8gaW50ZXJuYWwgc3RhdGUgYmVjb21lcyBpbnZhbGlkLiBDYWxsaW5nIHJlaGVhcGlmeSgpIHJlc2V0cyB0aGUKKyAgLy8vIHF1ZXVlJ3Mgc3RhdGUsIG1ha2luZyBpdCB2YWxpZCBhZ2Fpbi4gVGhpcyBvcGVyYXRpb24gaGFzIHRpbWUKKyAgLy8vIGNvbXBsZXhpdHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLAorICAvLy8gc28gZG9uJ3QgcGxhbiB0byB1c2UgaXQgYSBsb3QuCisgIC8vLworICB2b2lkIHJlaGVhcGlmeSgpIHsKKyAgICBzdGQ6Om1ha2VfaGVhcCh0aGlzLT5jLmJlZ2luKCksIHRoaXMtPmMuZW5kKCksIHRoaXMtPmNvbXApOworICB9CisKKyAgLy8vIGNsZWFyIC0gRXJhc2UgYWxsIGVsZW1lbnRzIGZyb20gdGhlIHF1ZXVlLgorICAvLy8KKyAgdm9pZCBjbGVhcigpIHsKKyAgICB0aGlzLT5jLmNsZWFyKCk7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TQ0NJdGVyYXRvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TQ0NJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWQ1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1NDQ0l0ZXJhdG9yLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8vPT09LS0gU3VwcG9ydC9TQ0NJdGVyYXRvci5oIC0gU3Ryb25nbHkgQ29ubmVjdGVkIENvbXAuIEl0ZXIuIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBidWlsZHMgb24gdGhlIGxsdm0vQURUL0dyYXBoVHJhaXRzLmggZmlsZSB0byBmaW5kIHRoZSBzdHJvbmdseSBjb25uZWN0ZWQKKy8vIGNvbXBvbmVudHMgKFNDQ3MpIG9mIGEgZ3JhcGggaW4gTyhOK0UpIHRpbWUgdXNpbmcgVGFyamFuJ3MgREZTIGFsZ29yaXRobS4KKy8vCisvLyBUaGUgU0NDIGl0ZXJhdG9yIGhhcyB0aGUgaW1wb3J0YW50IHByb3BlcnR5IHRoYXQgaWYgYSBub2RlIGluIFNDQyBTMSBoYXMgYW4KKy8vIGVkZ2UgdG8gYSBub2RlIGluIFNDQyBTMiwgdGhlbiBpdCB2aXNpdHMgUzEgKmFmdGVyKiBTMi4KKy8vCisvLyBUbyB2aXNpdCBTMSAqYmVmb3JlKiBTMiwgdXNlIHRoZSBzY2NfaXRlcmF0b3Igb24gdGhlIEludmVyc2UgZ3JhcGguCisvLyAoTk9URTogVGhpcyByZXF1aXJlcyBzb21lIHNpbXBsZSB3cmFwcGVycyBhbmQgaXMgbm90IHN1cHBvcnRlZCB5ZXQuKQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU0NDSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9TQ0NJVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBzY2NfaXRlcmF0b3IgLSBFbnVtZXJhdGUgdGhlIFNDQ3Mgb2YgYSBkaXJlY3RlZCBncmFwaCwgaW4KKy8vLyByZXZlcnNlIHRvcG9sb2dpY2FsIG9yZGVyIG9mIHRoZSBTQ0MgREFHLgorLy8vCit0ZW1wbGF0ZTxjbGFzcyBHcmFwaFQsIGNsYXNzIEdUID0gR3JhcGhUcmFpdHM8R3JhcGhUPiA+CitjbGFzcyBzY2NfaXRlcmF0b3IKKyAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIEdUOjpOb2RlVHlwZT4sIHB0cmRpZmZfdD4geworICB0eXBlZGVmIHR5cGVuYW1lIEdUOjpOb2RlVHlwZSAgICAgICAgICBOb2RlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBHVDo6Q2hpbGRJdGVyYXRvclR5cGUgQ2hpbGRJdFR5OworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE5vZGVUeXBlKj4gU2NjVHk7CisgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgR1Q6Ok5vZGVUeXBlPiwgcHRyZGlmZl90PiBzdXBlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcjo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcjo6cG9pbnRlciBwb2ludGVyOworCisgIC8vIFRoZSB2aXNpdCBjb3VudGVycyB1c2VkIHRvIGRldGVjdCB3aGVuIGEgY29tcGxldGUgU0NDIGlzIG9uIHRoZSBzdGFjay4KKyAgLy8gdmlzaXROdW0gaXMgdGhlIGdsb2JhbCBjb3VudGVyLgorICAvLyBub2RlVmlzaXROdW1iZXJzIGFyZSBwZXItbm9kZSB2aXNpdCBudW1iZXJzLCBhbHNvIHVzZWQgYXMgREZTIGZsYWdzLgorICB1bnNpZ25lZCB2aXNpdE51bTsKKyAgRGVuc2VNYXA8Tm9kZVR5cGUgKiwgdW5zaWduZWQ+IG5vZGVWaXNpdE51bWJlcnM7CisKKyAgLy8gU0NDTm9kZVN0YWNrIC0gU3RhY2sgaG9sZGluZyBub2RlcyBvZiB0aGUgU0NDLgorICBzdGQ6OnZlY3RvcjxOb2RlVHlwZSAqPiBTQ0NOb2RlU3RhY2s7CisKKyAgLy8gQ3VycmVudFNDQyAtIFRoZSBjdXJyZW50IFNDQywgcmV0cmlldmVkIHVzaW5nIG9wZXJhdG9yKigpLgorICBTY2NUeSBDdXJyZW50U0NDOworCisgIC8vIFZpc2l0U3RhY2sgLSBVc2VkIHRvIG1haW50YWluIHRoZSBvcmRlcmluZy4gIFRvcCA9IGN1cnJlbnQgYmxvY2sKKyAgLy8gRmlyc3QgZWxlbWVudCBpcyBiYXNpYyBibG9jayBwb2ludGVyLCBzZWNvbmQgaXMgdGhlICduZXh0IGNoaWxkJyB0byB2aXNpdAorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Tm9kZVR5cGUgKiwgQ2hpbGRJdFR5PiA+IFZpc2l0U3RhY2s7CisKKyAgLy8gTWluVmlzdE51bVN0YWNrIC0gU3RhY2sgaG9sZGluZyB0aGUgIm1pbiIgdmFsdWVzIGZvciBlYWNoIG5vZGUgaW4gdGhlIERGUy4KKyAgLy8gVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBtaW5pbXVtIHVwbGluayB2YWx1ZXMgZm9yIGFsbCBjaGlsZHJlbiBvZgorICAvLyB0aGUgY29ycmVzcG9uZGluZyBub2RlIG9uIHRoZSBWaXNpdFN0YWNrLgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gTWluVmlzaXROdW1TdGFjazsKKworICAvLyBBIHNpbmdsZSAidmlzaXQiIHdpdGhpbiB0aGUgbm9uLXJlY3Vyc2l2ZSBERlMgdHJhdmVyc2FsLgorICB2b2lkIERGU1Zpc2l0T25lKE5vZGVUeXBlICpOKSB7CisgICAgKyt2aXNpdE51bTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2xvYmFsIGNvdW50ZXIgZm9yIHRoZSB2aXNpdCBvcmRlcgorICAgIG5vZGVWaXNpdE51bWJlcnNbTl0gPSB2aXNpdE51bTsKKyAgICBTQ0NOb2RlU3RhY2sucHVzaF9iYWNrKE4pOworICAgIE1pblZpc2l0TnVtU3RhY2sucHVzaF9iYWNrKHZpc2l0TnVtKTsKKyAgICBWaXNpdFN0YWNrLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihOLCBHVDo6Y2hpbGRfYmVnaW4oTikpKTsKKyAgICAvL2RiZ3MoKSA8PCAiVGFyamFuU0NDOiBOb2RlICIgPDwgTiA8PAorICAgIC8vICAgICAgIiA6IHZpc2l0TnVtID0gIiA8PCB2aXNpdE51bSA8PCAiXG4iOworICB9CisKKyAgLy8gVGhlIHN0YWNrLWJhc2VkIERGUyB0cmF2ZXJzYWw7IGRlZmluZWQgYmVsb3cuCisgIHZvaWQgREZTVmlzaXRDaGlsZHJlbigpIHsKKyAgICBhc3NlcnQoIVZpc2l0U3RhY2suZW1wdHkoKSk7CisgICAgd2hpbGUgKFZpc2l0U3RhY2suYmFjaygpLnNlY29uZCAhPSBHVDo6Y2hpbGRfZW5kKFZpc2l0U3RhY2suYmFjaygpLmZpcnN0KSkgeworICAgICAgLy8gVE9TIGhhcyBhdCBsZWFzdCBvbmUgbW9yZSBjaGlsZCBzbyBjb250aW51ZSBERlMKKyAgICAgIE5vZGVUeXBlICpjaGlsZE4gPSAqVmlzaXRTdGFjay5iYWNrKCkuc2Vjb25kKys7CisgICAgICBpZiAoIW5vZGVWaXNpdE51bWJlcnMuY291bnQoY2hpbGROKSkgeworICAgICAgICAvLyB0aGlzIG5vZGUgaGFzIG5ldmVyIGJlZW4gc2Vlbi4KKyAgICAgICAgREZTVmlzaXRPbmUoY2hpbGROKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIHVuc2lnbmVkIGNoaWxkTnVtID0gbm9kZVZpc2l0TnVtYmVyc1tjaGlsZE5dOworICAgICAgaWYgKE1pblZpc2l0TnVtU3RhY2suYmFjaygpID4gY2hpbGROdW0pCisgICAgICAgIE1pblZpc2l0TnVtU3RhY2suYmFjaygpID0gY2hpbGROdW07CisgICAgfQorICB9CisKKyAgLy8gQ29tcHV0ZSB0aGUgbmV4dCBTQ0MgdXNpbmcgdGhlIERGUyB0cmF2ZXJzYWwuCisgIHZvaWQgR2V0TmV4dFNDQygpIHsKKyAgICBhc3NlcnQoVmlzaXRTdGFjay5zaXplKCkgPT0gTWluVmlzaXROdW1TdGFjay5zaXplKCkpOworICAgIEN1cnJlbnRTQ0MuY2xlYXIoKTsgICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgdG8gY29tcHV0ZSB0aGUgbmV4dCBTQ0MKKyAgICB3aGlsZSAoIVZpc2l0U3RhY2suZW1wdHkoKSkgeworICAgICAgREZTVmlzaXRDaGlsZHJlbigpOworICAgICAgYXNzZXJ0KFZpc2l0U3RhY2suYmFjaygpLnNlY29uZCA9PUdUOjpjaGlsZF9lbmQoVmlzaXRTdGFjay5iYWNrKCkuZmlyc3QpKTsKKyAgICAgIE5vZGVUeXBlICp2aXNpdGluZ04gPSBWaXNpdFN0YWNrLmJhY2soKS5maXJzdDsKKyAgICAgIHVuc2lnbmVkIG1pblZpc2l0TnVtID0gTWluVmlzaXROdW1TdGFjay5iYWNrKCk7CisgICAgICBWaXNpdFN0YWNrLnBvcF9iYWNrKCk7CisgICAgICBNaW5WaXNpdE51bVN0YWNrLnBvcF9iYWNrKCk7CisgICAgICBpZiAoIU1pblZpc2l0TnVtU3RhY2suZW1wdHkoKSAmJiBNaW5WaXNpdE51bVN0YWNrLmJhY2soKSA+IG1pblZpc2l0TnVtKQorICAgICAgICBNaW5WaXNpdE51bVN0YWNrLmJhY2soKSA9IG1pblZpc2l0TnVtOworCisgICAgICAvL2RiZ3MoKSA8PCAiVGFyamFuU0NDOiBQb3BwZWQgbm9kZSAiIDw8IHZpc2l0aW5nTiA8PAorICAgICAgLy8gICAgICAiIDogbWluVmlzaXROdW0gPSAiIDw8IG1pblZpc2l0TnVtIDw8ICI7IE5vZGUgdmlzaXQgbnVtID0gIiA8PAorICAgICAgLy8gICAgICBub2RlVmlzaXROdW1iZXJzW3Zpc2l0aW5nTl0gPDwgIlxuIjsKKworICAgICAgaWYgKG1pblZpc2l0TnVtICE9IG5vZGVWaXNpdE51bWJlcnNbdmlzaXRpbmdOXSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIEEgZnVsbCBTQ0MgaXMgb24gdGhlIFNDQ05vZGVTdGFjayEgIEl0IGluY2x1ZGVzIGFsbCBub2RlcyBiZWxvdworICAgICAgLy8gdmlzaXRpbmdOIG9uIHRoZSBzdGFjay4gIENvcHkgdGhvc2Ugbm9kZXMgdG8gQ3VycmVudFNDQywKKyAgICAgIC8vIHJlc2V0IHRoZWlyIG1pblZpc2l0IHZhbHVlcywgYW5kIHJldHVybiAodGhpcyBzdXNwZW5kcworICAgICAgLy8gdGhlIERGUyB0cmF2ZXJzYWwgdGlsbCB0aGUgbmV4dCArKykuCisgICAgICBkbyB7CisgICAgICAgIEN1cnJlbnRTQ0MucHVzaF9iYWNrKFNDQ05vZGVTdGFjay5iYWNrKCkpOworICAgICAgICBTQ0NOb2RlU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgbm9kZVZpc2l0TnVtYmVyc1tDdXJyZW50U0NDLmJhY2soKV0gPSB+MFU7CisgICAgICB9IHdoaWxlIChDdXJyZW50U0NDLmJhY2soKSAhPSB2aXNpdGluZ04pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlubGluZSBzY2NfaXRlcmF0b3IoTm9kZVR5cGUgKmVudHJ5TikgOiB2aXNpdE51bSgwKSB7CisgICAgREZTVmlzaXRPbmUoZW50cnlOKTsKKyAgICBHZXROZXh0U0NDKCk7CisgIH0KKyAgaW5saW5lIHNjY19pdGVyYXRvcigpIHsgLyogRW5kIGlzIHdoZW4gREZTIHN0YWNrIGlzIGVtcHR5ICovIH0KKworcHVibGljOgorICB0eXBlZGVmIHNjY19pdGVyYXRvcjxHcmFwaFQsIEdUPiBfU2VsZjsKKworICAvLyBQcm92aWRlIHN0YXRpYyAiY29uc3RydWN0b3JzIi4uLgorICBzdGF0aWMgaW5saW5lIF9TZWxmIGJlZ2luKGNvbnN0IEdyYXBoVCAmRyl7cmV0dXJuIF9TZWxmKEdUOjpnZXRFbnRyeU5vZGUoRykpO30KKyAgc3RhdGljIGlubGluZSBfU2VsZiBlbmQgIChjb25zdCBHcmFwaFQgJkcpIHsgcmV0dXJuIF9TZWxmKCk7IH0KKworICAvLyBEaXJlY3QgbG9vcCB0ZXJtaW5hdGlvbiB0ZXN0OiBJLmlzQXRFbmQoKSBpcyBtb3JlIGVmZmljaWVudCB0aGFuIEkgPT0gZW5kKCkKKyAgaW5saW5lIGJvb2wgaXNBdEVuZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIUN1cnJlbnRTQ0MuZW1wdHkoKSB8fCBWaXNpdFN0YWNrLmVtcHR5KCkpOworICAgIHJldHVybiBDdXJyZW50U0NDLmVtcHR5KCk7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJiB4KSBjb25zdCB7CisgICAgcmV0dXJuIFZpc2l0U3RhY2sgPT0geC5WaXNpdFN0YWNrICYmIEN1cnJlbnRTQ0MgPT0geC5DdXJyZW50U0NDOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgX1NlbGYmIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgLy8gSXRlcmF0b3IgdHJhdmVyc2FsOiBmb3J3YXJkIGl0ZXJhdGlvbiBvbmx5CisgIGlubGluZSBfU2VsZiYgb3BlcmF0b3IrKygpIHsgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgR2V0TmV4dFNDQygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsgICAgICAgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBfU2VsZiB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorCisgIC8vIFJldHJpZXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFNDQworICBpbmxpbmUgY29uc3QgU2NjVHkgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoIUN1cnJlbnRTQ0MuZW1wdHkoKSAmJiAiRGVyZWZlcmVuY2luZyBFTkQgU0NDIGl0ZXJhdG9yISIpOworICAgIHJldHVybiBDdXJyZW50U0NDOworICB9CisgIGlubGluZSBTY2NUeSAmb3BlcmF0b3IqKCkgeworICAgIGFzc2VydCghQ3VycmVudFNDQy5lbXB0eSgpICYmICJEZXJlZmVyZW5jaW5nIEVORCBTQ0MgaXRlcmF0b3IhIik7CisgICAgcmV0dXJuIEN1cnJlbnRTQ0M7CisgIH0KKworICAvLyBoYXNMb29wKCkgLS0gVGVzdCBpZiB0aGUgY3VycmVudCBTQ0MgaGFzIGEgbG9vcC4gIElmIGl0IGhhcyBtb3JlIHRoYW4gb25lCisgIC8vIG5vZGUsIHRoaXMgaXMgdHJpdmlhbGx5IHRydWUuICBJZiBub3QsIGl0IG1heSBzdGlsbCBjb250YWluIGEgbG9vcCBpZiB0aGUKKyAgLy8gbm9kZSBoYXMgYW4gZWRnZSBiYWNrIHRvIGl0c2VsZi4KKyAgYm9vbCBoYXNMb29wKCkgY29uc3QgeworICAgIGFzc2VydCghQ3VycmVudFNDQy5lbXB0eSgpICYmICJEZXJlZmVyZW5jaW5nIEVORCBTQ0MgaXRlcmF0b3IhIik7CisgICAgaWYgKEN1cnJlbnRTQ0Muc2l6ZSgpID4gMSkgcmV0dXJuIHRydWU7CisgICAgTm9kZVR5cGUgKk4gPSBDdXJyZW50U0NDLmZyb250KCk7CisgICAgZm9yIChDaGlsZEl0VHkgQ0kgPSBHVDo6Y2hpbGRfYmVnaW4oTiksIENFPUdUOjpjaGlsZF9lbmQoTik7IENJICE9IENFOyArK0NJKQorICAgICAgaWYgKCpDSSA9PSBOKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAvLy8gUmVwbGFjZU5vZGUgLSBUaGlzIGluZm9ybXMgdGhlIHNjY19pdGVyYXRvciB0aGF0IHRoZSBzcGVjaWZpZWQgT2xkIG5vZGUKKyAgLy8vIGhhcyBiZWVuIGRlbGV0ZWQsIGFuZCBOZXcgaXMgdG8gYmUgdXNlZCBpbiBpdHMgcGxhY2UuCisgIHZvaWQgUmVwbGFjZU5vZGUoTm9kZVR5cGUgKk9sZCwgTm9kZVR5cGUgKk5ldykgeworICAgIGFzc2VydChub2RlVmlzaXROdW1iZXJzLmNvdW50KE9sZCkgJiYgIk9sZCBub3QgaW4gc2NjX2l0ZXJhdG9yPyIpOworICAgIG5vZGVWaXNpdE51bWJlcnNbTmV3XSA9IG5vZGVWaXNpdE51bWJlcnNbT2xkXTsKKyAgICBub2RlVmlzaXROdW1iZXJzLmVyYXNlKE9sZCk7CisgIH0KK307CisKKworLy8gR2xvYmFsIGNvbnN0cnVjdG9yIGZvciB0aGUgU0NDIGl0ZXJhdG9yLgordGVtcGxhdGUgPGNsYXNzIFQ+CitzY2NfaXRlcmF0b3I8VD4gc2NjX2JlZ2luKGNvbnN0IFQgJkcpIHsKKyAgcmV0dXJuIHNjY19pdGVyYXRvcjxUPjo6YmVnaW4oRyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc2NjX2l0ZXJhdG9yPFQ+IHNjY19lbmQoY29uc3QgVCAmRykgeworICByZXR1cm4gc2NjX2l0ZXJhdG9yPFQ+OjplbmQoRyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc2NjX2l0ZXJhdG9yPEludmVyc2U8VD4gPiBzY2NfYmVnaW4oY29uc3QgSW52ZXJzZTxUPiAmRykgeworICByZXR1cm4gc2NjX2l0ZXJhdG9yPEludmVyc2U8VD4gPjo6YmVnaW4oRyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc2NjX2l0ZXJhdG9yPEludmVyc2U8VD4gPiBzY2NfZW5kKGNvbnN0IEludmVyc2U8VD4gJkcpIHsKKyAgcmV0dXJuIHNjY19pdGVyYXRvcjxJbnZlcnNlPFQ+ID46OmVuZChHKTsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1NUTEV4dHJhcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TVExFeHRyYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGJmNzkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TVExFeHRyYXMuaApAQCAtMCwwICsxLDMwNiBAQAorLy89PT0tIGxsdm0vQURUL1NUTEV4dHJhcy5oIC0gVXNlZnVsIFNUTCByZWxhdGVkIGZ1bmN0aW9ucyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgc29tZSB0ZW1wbGF0ZXMgdGhhdCBhcmUgdXNlZnVsIGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIHRoZQorLy8gU1RMIGF0IGFsbC4KKy8vCisvLyBObyBsaWJyYXJ5IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlc2UgZnVuY3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1RMRVhUUkFTX0gKKyNkZWZpbmUgTExWTV9BRFRfU1RMRVhUUkFTX0gKKworI2luY2x1ZGUgPGNzdGRkZWY+IC8vIGZvciBzdGQ6OnNpemVfdAorI2luY2x1ZGUgPGNzdGRsaWI+IC8vIGZvciBxc29ydAorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4gLy8gZm9yIHN0ZDo6cGFpcgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgRXh0cmEgYWRkaXRpb25zIHRvIDxmdW5jdGlvbmFsPgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGU8Y2xhc3MgVHk+CitzdHJ1Y3QgbGVzc19wdHIgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248VHksIFR5LCBib29sPiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUeSogbGVmdCwgY29uc3QgVHkqIHJpZ2h0KSBjb25zdCB7CisgICAgcmV0dXJuICpsZWZ0IDwgKnJpZ2h0OworICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUeT4KK3N0cnVjdCBncmVhdGVyX3B0ciA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxUeSwgVHksIGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFR5KiBsZWZ0LCBjb25zdCBUeSogcmlnaHQpIGNvbnN0IHsKKyAgICByZXR1cm4gKnJpZ2h0IDwgKmxlZnQ7CisgIH0KK307CisKKy8vIGRlbGV0ZXIgLSBWZXJ5IHZlcnkgdmVyeSBzaW1wbGUgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbnZva2Ugb3BlcmF0b3IKKy8vIGRlbGV0ZSBvbiBzb21ldGhpbmcuICBJdCBpcyB1c2VkIGxpa2UgdGhpczoKKy8vCisvLyAgIGZvcl9lYWNoKFYuYmVnaW4oKSwgQi5lbmQoKSwgZGVsZXRlcjxJbnRlcnZhbD4pOworLy8KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RhdGljIGlubGluZSB2b2lkIGRlbGV0ZXIoVCAqUHRyKSB7CisgIGRlbGV0ZSBQdHI7Cit9CisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgIEV4dHJhIGFkZGl0aW9ucyB0byA8aXRlcmF0b3I+CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBtYXBwZWRfaXRlcmF0b3IgLSBUaGlzIGlzIGEgc2ltcGxlIGl0ZXJhdG9yIGFkYXB0ZXIgdGhhdCBjYXVzZXMgYSBmdW5jdGlvbiB0bworLy8gYmUgZGVyZWZlcmVuY2VkIHdoZW5ldmVyIG9wZXJhdG9yKiBpcyBpbnZva2VkIG9uIHRoZSBpdGVyYXRvci4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgUm9vdEl0LCBjbGFzcyBVbmFyeUZ1bmM+CitjbGFzcyBtYXBwZWRfaXRlcmF0b3IgeworICBSb290SXQgY3VycmVudDsKKyAgVW5hcnlGdW5jIEZuOworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPFJvb3RJdD46Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8Um9vdEl0Pjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFVuYXJ5RnVuYzo6cmVzdWx0X3R5cGUgdmFsdWVfdHlwZTsKKworICB0eXBlZGVmIHZvaWQgcG9pbnRlcjsKKyAgLy90eXBlZGVmIHR5cGVuYW1lIFVuYXJ5RnVuYzo6cmVzdWx0X3R5cGUgKnBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCByZWZlcmVuY2U7ICAgICAgICAvLyBDYW4ndCBtb2RpZnkgdmFsdWUgcmV0dXJuZWQgYnkgZm4KKworICB0eXBlZGVmIFJvb3RJdCBpdGVyYXRvcl90eXBlOworICB0eXBlZGVmIG1hcHBlZF9pdGVyYXRvcjxSb290SXQsIFVuYXJ5RnVuYz4gX1NlbGY7CisKKyAgaW5saW5lIGNvbnN0IFJvb3RJdCAmZ2V0Q3VycmVudCgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnQ7IH0KKyAgaW5saW5lIGNvbnN0IFVuYXJ5RnVuYyAmZ2V0RnVuYygpIGNvbnN0IHsgcmV0dXJuIEZuOyB9CisKKyAgaW5saW5lIGV4cGxpY2l0IG1hcHBlZF9pdGVyYXRvcihjb25zdCBSb290SXQgJkksIFVuYXJ5RnVuYyBGKQorICAgIDogY3VycmVudChJKSwgRm4oRikge30KKyAgaW5saW5lIG1hcHBlZF9pdGVyYXRvcihjb25zdCBtYXBwZWRfaXRlcmF0b3IgJkl0KQorICAgIDogY3VycmVudChJdC5jdXJyZW50KSwgRm4oSXQuRm4pIHt9CisKKyAgaW5saW5lIHZhbHVlX3R5cGUgb3BlcmF0b3IqKCkgY29uc3QgeyAgIC8vIEFsbCB0aGlzIHdvcmsgdG8gZG8gdGhpcworICAgIHJldHVybiBGbigqY3VycmVudCk7ICAgICAgICAgLy8gbGl0dGxlIGNoYW5nZQorICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7ICsrY3VycmVudDsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmJiBvcGVyYXRvci0tKCkgeyAtLWN1cnJlbnQ7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiAgb3BlcmF0b3IrKyhpbnQpIHsgX1NlbGYgX190bXAgPSAqdGhpczsgKytjdXJyZW50OyByZXR1cm4gX190bXA7IH0KKyAgX1NlbGYgIG9wZXJhdG9yLS0oaW50KSB7IF9TZWxmIF9fdG1wID0gKnRoaXM7IC0tY3VycmVudDsgcmV0dXJuIF9fdG1wOyB9CisgIF9TZWxmICBvcGVyYXRvcisgICAgKGRpZmZlcmVuY2VfdHlwZSBuKSBjb25zdCB7CisgICAgcmV0dXJuIF9TZWxmKGN1cnJlbnQgKyBuLCBGbik7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0gICAoZGlmZmVyZW5jZV90eXBlIG4pIHsgY3VycmVudCArPSBuOyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYgIG9wZXJhdG9yLSAgICAoZGlmZmVyZW5jZV90eXBlIG4pIGNvbnN0IHsKKyAgICByZXR1cm4gX1NlbGYoY3VycmVudCAtIG4sIEZuKTsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItPSAgIChkaWZmZXJlbmNlX3R5cGUgbikgeyBjdXJyZW50IC09IG47IHJldHVybiAqdGhpczsgfQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgbikgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIG4pOyB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfU2VsZiAmWCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oWCk7IH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfU2VsZiAmWCkgY29uc3QgeyByZXR1cm4gY3VycmVudCA9PSBYLmN1cnJlbnQ7IH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8IChjb25zdCBfU2VsZiAmWCkgY29uc3QgeyByZXR1cm4gY3VycmVudCA8ICBYLmN1cnJlbnQ7IH0KKworICBpbmxpbmUgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCBfU2VsZiAmWCkgY29uc3QgeworICAgIHJldHVybiBjdXJyZW50IC0gWC5jdXJyZW50OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yLCBjbGFzcyBGdW5jPgoraW5saW5lIG1hcHBlZF9pdGVyYXRvcjxfSXRlcmF0b3IsIEZ1bmM+CitvcGVyYXRvcisodHlwZW5hbWUgbWFwcGVkX2l0ZXJhdG9yPF9JdGVyYXRvciwgRnVuYz46OmRpZmZlcmVuY2VfdHlwZSBOLAorICAgICAgICAgIGNvbnN0IG1hcHBlZF9pdGVyYXRvcjxfSXRlcmF0b3IsIEZ1bmM+JiBYKSB7CisgIHJldHVybiBtYXBwZWRfaXRlcmF0b3I8X0l0ZXJhdG9yLCBGdW5jPihYLmdldEN1cnJlbnQoKSAtIE4sIFguZ2V0RnVuYygpKTsKK30KKworCisvLyBtYXBfaXRlcmF0b3IgLSBQcm92aWRlIGEgY29udmVuaWVudCB3YXkgdG8gY3JlYXRlIG1hcHBlZF9pdGVyYXRvcnMsIGp1c3QgbGlrZQorLy8gbWFrZV9wYWlyIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgcGFpcnMuLi4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgSXRUeSwgY2xhc3MgRnVuY1R5PgoraW5saW5lIG1hcHBlZF9pdGVyYXRvcjxJdFR5LCBGdW5jVHk+IG1hcF9pdGVyYXRvcihjb25zdCBJdFR5ICZJLCBGdW5jVHkgRikgeworICByZXR1cm4gbWFwcGVkX2l0ZXJhdG9yPEl0VHksIEZ1bmNUeT4oSSwgRik7Cit9CisKKworLy8gbmV4dC9wcmlvciAtIFRoZXNlIGZ1bmN0aW9ucyB1bmxpa2Ugc3RkOjphZHZhbmNlIGRvIG5vdCBtb2RpZnkgdGhlCisvLyBwYXNzZWQgaXRlcmF0b3IgYnV0IHJldHVybiBhIGNvcHkuCisvLworLy8gbmV4dChteUl0KSByZXR1cm5zIGNvcHkgb2YgbXlJdCBpbmNyZW1lbnRlZCBvbmNlCisvLyBuZXh0KG15SXQsIG4pIHJldHVybnMgY29weSBvZiBteUl0IGluY3JlbWVudGVkIG4gdGltZXMKKy8vIHByaW9yKG15SXQpIHJldHVybnMgY29weSBvZiBteUl0IGRlY3JlbWVudGVkIG9uY2UKKy8vIHByaW9yKG15SXQsIG4pIHJldHVybnMgY29weSBvZiBteUl0IGRlY3JlbWVudGVkIG4gdGltZXMKKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0VHksIHR5cGVuYW1lIERpc3Q+CitpbmxpbmUgSXRUeSBuZXh0KEl0VHkgaXQsIERpc3QgbikKK3sKKyAgc3RkOjphZHZhbmNlKGl0LCBuKTsKKyAgcmV0dXJuIGl0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRUeT4KK2lubGluZSBJdFR5IG5leHQoSXRUeSBpdCkKK3sKKyAgcmV0dXJuICsraXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJdFR5LCB0eXBlbmFtZSBEaXN0PgoraW5saW5lIEl0VHkgcHJpb3IoSXRUeSBpdCwgRGlzdCBuKQoreworICBzdGQ6OmFkdmFuY2UoaXQsIC1uKTsKKyAgcmV0dXJuIGl0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRUeT4KK2lubGluZSBJdFR5IHByaW9yKEl0VHkgaXQpCit7CisgIHJldHVybiAtLWl0OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgIEV4dHJhIGFkZGl0aW9ucyB0byA8dXRpbGl0eT4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIHRpZSAtIHRoaXMgZnVuY3Rpb24gdGllcyB0d28gb2JqZWN0cyBhbmQgcmV0dXJucyBhIHRlbXBvcmFyeSBvYmplY3QKKy8vIHRoYXQgaXMgYXNzaWduYWJsZSBmcm9tIGEgc3RkOjpwYWlyLiBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgY29kZQorLy8gbW9yZSByZWFkYWJsZSB3aGVuIHVzaW5nIHZhbHVlcyByZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyBidW5kbGVkIGluCisvLyBhIHN0ZDo6cGFpci4gU2luY2UgYW4gZXhhbXBsZSBpcyB3b3J0aCAxMDAwIHdvcmRzOgorLy8KKy8vIHR5cGVkZWYgc3RkOjptYXA8aW50LCBpbnQ+IEludDJJbnRNYXA7CisvLworLy8gSW50MkludE1hcCBteU1hcDsKKy8vIEludDJJbnRNYXA6Oml0ZXJhdG9yIHdoZXJlOworLy8gYm9vbCBpbnNlcnRlZDsKKy8vIHRpZSh3aGVyZSwgaW5zZXJ0ZWQpID0gbXlNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKDEyMyw0NTYpKTsKKy8vCisvLyBpZiAoaW5zZXJ0ZWQpCisvLyAgIC8vIGRvIHN0dWZmCisvLyBlbHNlCisvLyAgIC8vIGRvIG90aGVyIHN0dWZmCisKK25hbWVzcGFjZQoreworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBzdHJ1Y3QgdGllciB7CisgICAgdHlwZWRlZiBUMSAmZmlyc3RfdHlwZTsKKyAgICB0eXBlZGVmIFQyICZzZWNvbmRfdHlwZTsKKworICAgIGZpcnN0X3R5cGUgZmlyc3Q7CisgICAgc2Vjb25kX3R5cGUgc2Vjb25kOworCisgICAgdGllcihmaXJzdF90eXBlIGYsIHNlY29uZF90eXBlIHMpIDogZmlyc3QoZiksIHNlY29uZChzKSB7IH0KKyAgICB0aWVyJiBvcGVyYXRvcj0oY29uc3Qgc3RkOjpwYWlyPFQxLCBUMj4mIHApIHsKKyAgICAgIGZpcnN0ID0gcC5maXJzdDsKKyAgICAgIHNlY29uZCA9IHAuc2Vjb25kOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2lubGluZSB0aWVyPFQxLCBUMj4gdGllKFQxJiBmLCBUMiYgcykgeworICByZXR1cm4gdGllcjxUMSwgVDI+KGYsIHMpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgIEV4dHJhIGFkZGl0aW9ucyBmb3IgYXJyYXlzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRmluZCB3aGVyZSBhbiBhcnJheSBlbmRzIChmb3IgZW5kaW5nIGl0ZXJhdG9ycykKKy8vLyBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBieXRlIGltbWVkaWF0ZWx5CisvLy8gYWZ0ZXIgdGhlIGVuZCBvZiBhbiBhcnJheS4KK3RlbXBsYXRlPGNsYXNzIFQsIHN0ZDo6c2l6ZV90IE4+CitpbmxpbmUgVCAqYXJyYXlfZW5kb2YoVCAoJngpW05dKSB7CisgIHJldHVybiB4K047Cit9CisKKy8vLyBGaW5kIHRoZSBsZW5ndGggb2YgYW4gYXJyYXkuCit0ZW1wbGF0ZTxjbGFzcyBULCBzdGQ6OnNpemVfdCBOPgoraW5saW5lIHNpemVfdCBhcnJheV9sZW5ndGhvZihUICgmeClbTl0pIHsKKyAgcmV0dXJuIE47Cit9CisKKy8vLyBhcnJheV9wb2Rfc29ydF9jb21wYXJhdG9yIC0gVGhpcyBpcyBoZWxwZXIgZnVuY3Rpb24gZm9yIGFycmF5X3BvZF9zb3J0LAorLy8vIHdoaWNoIGp1c3QgdXNlcyBvcGVyYXRvcjwgb24gVC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGludCBhcnJheV9wb2Rfc29ydF9jb21wYXJhdG9yKGNvbnN0IHZvaWQgKlAxLCBjb25zdCB2b2lkICpQMikgeworICBpZiAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KFAxKSA8ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihQMikpCisgICAgcmV0dXJuIC0xOworICBpZiAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KFAyKSA8ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihQMSkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvLy8gZ2V0X2FycmF5X3BhZF9zb3J0X2NvbXBhcmF0b3IgLSBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvCisvLy8gZ2V0IHR5cGUgZGVkdWN0aW9uIG9mIFQgcmlnaHQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIGludCAoKmdldF9hcnJheV9wYWRfc29ydF9jb21wYXJhdG9yKGNvbnN0IFQgJlgpKQorICAgICAgICAgICAgIChjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopIHsKKyAgcmV0dXJuIGFycmF5X3BvZF9zb3J0X2NvbXBhcmF0b3I8VD47Cit9CisKKworLy8vIGFycmF5X3BvZF9zb3J0IC0gVGhpcyBzb3J0cyBhbiBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnQgYW5kIGVuZAorLy8vIGV4dGVudC4gIFRoaXMgaXMganVzdCBsaWtlIHN0ZDo6c29ydCwgZXhjZXB0IHRoYXQgaXQgY2FsbHMgcXNvcnQgaW5zdGVhZCBvZgorLy8vIHVzaW5nIGFuIGlubGluZWQgdGVtcGxhdGUuICBxc29ydCBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBzdGQ6OnNvcnQsIGJ1dAorLy8vIG1vc3Qgc29ydHMgYXJlIG5vdCBwZXJmb3JtYW5jZSBjcml0aWNhbCBpbiBMTFZNIGFuZCBzdGQ6OnNvcnQgaGFzIHRvIGJlCisvLy8gdGVtcGxhdGUgaW5zdGFudGlhdGVkIGZvciBlYWNoIHR5cGUsIGxlYWRpbmcgdG8gc2lnbmlmaWNhbnQgbWVhc3VyZWQgY29kZQorLy8vIGJsb2F0LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2VuZXJhbGx5IGJlIHVzZWQgaW5zdGVhZCBvZiBzdGQ6OnNvcnQgd2hlcmUKKy8vLyBwb3NzaWJsZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHlvdSBoYXZlIHNpbXBsZSBQT0QtbGlrZSB0eXBlcyB0aGF0IGNhbiBiZQorLy8vIGNvbXBhcmVkIHdpdGggb3BlcmF0b3I8IGFuZCBjYW4gYmUgbW92ZWQgd2l0aCBtZW1jcHkuICBJZiB0aGlzIGlzbid0IHRydWUsCisvLy8geW91IHNob3VsZCB1c2Ugc3RkOjpzb3J0LgorLy8vCisvLy8gTk9URTogSWYgcXNvcnRfciB3ZXJlIHBvcnRhYmxlLCB3ZSBjb3VsZCBhbGxvdyBhIGN1c3RvbSBjb21wYXJhdG9yIGFuZAorLy8vIGRlZmF1bHQgdG8gc3RkOjpsZXNzLgordGVtcGxhdGU8Y2xhc3MgSXRlcmF0b3JUeT4KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcnJheV9wb2Rfc29ydChJdGVyYXRvclR5IFN0YXJ0LCBJdGVyYXRvclR5IEVuZCkgeworICAvLyBEb24ndCBkZXJlZmVyZW5jZSBzdGFydCBpdGVyYXRvciBvZiBlbXB0eSBzZXF1ZW5jZS4KKyAgaWYgKFN0YXJ0ID09IEVuZCkgcmV0dXJuOworICBxc29ydCgmKlN0YXJ0LCBFbmQtU3RhcnQsIHNpemVvZigqU3RhcnQpLAorICAgICAgICBnZXRfYXJyYXlfcGFkX3NvcnRfY29tcGFyYXRvcigqU3RhcnQpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgSXRlcmF0b3JUeT4KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcnJheV9wb2Rfc29ydChJdGVyYXRvclR5IFN0YXJ0LCBJdGVyYXRvclR5IEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpDb21wYXJlKShjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopKSB7CisgIC8vIERvbid0IGRlcmVmZXJlbmNlIHN0YXJ0IGl0ZXJhdG9yIG9mIGVtcHR5IHNlcXVlbmNlLgorICBpZiAoU3RhcnQgPT0gRW5kKSByZXR1cm47CisgIHFzb3J0KCYqU3RhcnQsIEVuZC1TdGFydCwgc2l6ZW9mKCpTdGFydCksIENvbXBhcmUpOworfQorICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgRXh0cmEgYWRkaXRpb25zIHRvIDxhbGdvcml0aG0+CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRm9yIGEgY29udGFpbmVyIG9mIHBvaW50ZXJzLCBkZWxldGVzIHRoZSBwb2ludGVycyBhbmQgdGhlbiBjbGVhcnMgdGhlCisvLy8gY29udGFpbmVyLgordGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyPgordm9pZCBEZWxldGVDb250YWluZXJQb2ludGVycyhDb250YWluZXIgJkMpIHsKKyAgZm9yICh0eXBlbmFtZSBDb250YWluZXI6Oml0ZXJhdG9yIEkgPSBDLmJlZ2luKCksIEUgPSBDLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBkZWxldGUgKkk7CisgIEMuY2xlYXIoKTsKK30KKworLy8vIEluIGEgY29udGFpbmVyIG9mIHBhaXJzICh1c3VhbGx5IGEgbWFwKSB3aG9zZSBzZWNvbmQgZWxlbWVudCBpcyBhIHBvaW50ZXIsCisvLy8gZGVsZXRlcyB0aGUgc2Vjb25kIGVsZW1lbnRzIGFuZCB0aGVuIGNsZWFycyB0aGUgY29udGFpbmVyLgordGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyPgordm9pZCBEZWxldGVDb250YWluZXJTZWNvbmRzKENvbnRhaW5lciAmQykgeworICBmb3IgKHR5cGVuYW1lIENvbnRhaW5lcjo6aXRlcmF0b3IgSSA9IEMuYmVnaW4oKSwgRSA9IEMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGRlbGV0ZSBJLT5zZWNvbmQ7CisgIEMuY2xlYXIoKTsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1Njb3BlZEhhc2hUYWJsZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TY29wZWRIYXNoVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTZhZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TY29wZWRIYXNoVGFibGUuaApAQCAtMCwwICsxLDIxMSBAQAorLy89PT0tIFNjb3BlZEhhc2hUYWJsZS5oIC0gQSBzaW1wbGUgc2NvcGVkIGhhc2ggdGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhbiBlZmZpY2llbnQgc2NvcGVkIGhhc2ggdGFibGUsIHdoaWNoIGlzIHVzZWZ1bCBmb3IKKy8vIHRoaW5ncyBsaWtlIGRvbWluYXRvci1iYXNlZCBvcHRpbWl6YXRpb25zLiAgVGhpcyBhbGxvd3MgY2xpZW50cyB0byBkbyB0aGluZ3MKKy8vIGxpa2UgdGhpczoKKy8vCisvLyAgU2NvcGVkSGFzaFRhYmxlPGludCwgaW50PiBIVDsKKy8vICB7CisvLyAgICBTY29wZWRIYXNoVGFibGVTY29wZTxpbnQsIGludD4gU2NvcGUxKEhUKTsKKy8vICAgIEhULmluc2VydCgwLCAwKTsKKy8vICAgIEhULmluc2VydCgxLCAxKTsKKy8vICAgIHsKKy8vICAgICAgU2NvcGVkSGFzaFRhYmxlU2NvcGU8aW50LCBpbnQ+IFNjb3BlMihIVCk7CisvLyAgICAgIEhULmluc2VydCgwLCA0Mik7CisvLyAgICB9CisvLyAgfQorLy8KKy8vIExvb2tpbmcgdXAgdGhlIHZhbHVlIGZvciAiMCIgaW4gdGhlIFNjb3BlMiBibG9jayB3aWxsIHJldHVybiA0Mi4gIExvb2tpbmcKKy8vIHVwIHRoZSB2YWx1ZSBmb3IgMCBiZWZvcmUgNDIgaXMgaW5zZXJ0ZWQgb3IgYWZ0ZXIgU2NvcGUyIGlzIHBvcHBlZCB3aWxsCisvLyByZXR1cm4gMC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NDT1BFREhBU0hUQUJMRV9ICisjZGVmaW5lIExMVk1fQURUX1NDT1BFREhBU0hUQUJMRV9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIHR5cGVuYW1lIEtJbmZvID0gRGVuc2VNYXBJbmZvPEs+ID4KK2NsYXNzIFNjb3BlZEhhc2hUYWJsZTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIHR5cGVuYW1lIEtJbmZvID0gRGVuc2VNYXBJbmZvPEs+ID4KK2NsYXNzIFNjb3BlZEhhc2hUYWJsZVZhbCB7CisgIFNjb3BlZEhhc2hUYWJsZVZhbCAqTmV4dEluU2NvcGU7CisgIFNjb3BlZEhhc2hUYWJsZVZhbCAqTmV4dEZvcktleTsKKyAgSyBLZXk7CisgIFYgVmFsOworcHVibGljOgorICBTY29wZWRIYXNoVGFibGVWYWwoU2NvcGVkSGFzaFRhYmxlVmFsICpuZXh0SW5TY29wZSwKKyAgICAgICAgICAgICAgICAgICAgIFNjb3BlZEhhc2hUYWJsZVZhbCAqbmV4dEZvcktleSwgY29uc3QgSyAma2V5LCBjb25zdCBWICZ2YWwpCisgICAgOiBOZXh0SW5TY29wZShuZXh0SW5TY29wZSksIE5leHRGb3JLZXkobmV4dEZvcktleSksIEtleShrZXkpLCBWYWwodmFsKSB7CisgIH0KKworICBjb25zdCBLICZnZXRLZXkoKSBjb25zdCB7IHJldHVybiBLZXk7IH0KKyAgY29uc3QgViAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKyAgViAmZ2V0VmFsdWUoKSB7IHJldHVybiBWYWw7IH0KKworICBTY29wZWRIYXNoVGFibGVWYWwgKmdldE5leHRGb3JLZXkoKSB7IHJldHVybiBOZXh0Rm9yS2V5OyB9CisgIGNvbnN0IFNjb3BlZEhhc2hUYWJsZVZhbCAqZ2V0TmV4dEZvcktleSgpIGNvbnN0IHsgcmV0dXJuIE5leHRGb3JLZXk7IH0KK3B1YmxpYzoKKyAgU2NvcGVkSGFzaFRhYmxlVmFsICpnZXROZXh0SW5TY29wZSgpIHsgcmV0dXJuIE5leHRJblNjb3BlOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgViwgdHlwZW5hbWUgS0luZm8gPSBEZW5zZU1hcEluZm88Sz4gPgorY2xhc3MgU2NvcGVkSGFzaFRhYmxlU2NvcGUgeworICAvLy8gSFQgLSBUaGUgaGFzaHRhYmxlIHRoYXQgd2UgYXJlIGFjdGl2ZSBmb3IuCisgIFNjb3BlZEhhc2hUYWJsZTxLLCBWLCBLSW5mbz4gJkhUOworCisgIC8vLyBQcmV2U2NvcGUgLSBUaGlzIGlzIHRoZSBzY29wZSB0aGF0IHdlIGFyZSBzaGFkb3dpbmcgaW4gSFQuCisgIFNjb3BlZEhhc2hUYWJsZVNjb3BlICpQcmV2U2NvcGU7CisKKyAgLy8vIExhc3RWYWxJblNjb3BlIC0gVGhpcyBpcyB0aGUgbGFzdCB2YWx1ZSB0aGF0IHdhcyBpbnNlcnRlZCBmb3IgdGhpcyBzY29wZQorICAvLy8gb3IgbnVsbCBpZiBub25lIGhhdmUgYmVlbiBpbnNlcnRlZCB5ZXQuCisgIFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWLCBLSW5mbz4gKkxhc3RWYWxJblNjb3BlOworICB2b2lkIG9wZXJhdG9yPShTY29wZWRIYXNoVGFibGVTY29wZSYpOyAgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIFNjb3BlZEhhc2hUYWJsZVNjb3BlKFNjb3BlZEhhc2hUYWJsZVNjb3BlJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKK3B1YmxpYzoKKyAgU2NvcGVkSGFzaFRhYmxlU2NvcGUoU2NvcGVkSGFzaFRhYmxlPEssIFYsIEtJbmZvPiAmSFQpOworICB+U2NvcGVkSGFzaFRhYmxlU2NvcGUoKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNjb3BlZEhhc2hUYWJsZTxLLCBWLCBLSW5mbz47CisgIFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWLCBLSW5mbz4gKmdldExhc3RWYWxJblNjb3BlKCkgeworICAgIHJldHVybiBMYXN0VmFsSW5TY29wZTsKKyAgfQorICB2b2lkIHNldExhc3RWYWxJblNjb3BlKFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWLCBLSW5mbz4gKlZhbCkgeworICAgIExhc3RWYWxJblNjb3BlID0gVmFsOworICB9Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBLSW5mbyA9IERlbnNlTWFwSW5mbzxLPiA+CitjbGFzcyBTY29wZWRIYXNoVGFibGVJdGVyYXRvciB7CisgIFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWLCBLSW5mbz4gKk5vZGU7CitwdWJsaWM6CisgIFNjb3BlZEhhc2hUYWJsZUl0ZXJhdG9yKFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWLCBLSW5mbz4gKm5vZGUpIDogTm9kZShub2RlKSB7fQorCisgIFYgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoTm9kZSAmJiAiRGVyZWZlcmVuY2UgZW5kKCkiKTsKKyAgICByZXR1cm4gTm9kZS0+Z2V0VmFsdWUoKTsKKyAgfQorICBWICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiAmTm9kZS0+Z2V0VmFsdWUoKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTY29wZWRIYXNoVGFibGVJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGUgPT0gUkhTLk5vZGU7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNjb3BlZEhhc2hUYWJsZUl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZSAhPSBSSFMuTm9kZTsKKyAgfQorCisgIGlubGluZSBTY29wZWRIYXNoVGFibGVJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgYXNzZXJ0KE5vZGUgJiYgImluY3JlbWVudGluZyBwYXN0IGVuZCgpIik7CisgICAgTm9kZSA9IE5vZGUtPmdldE5leHRGb3JLZXkoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgU2NvcGVkSGFzaFRhYmxlSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgICAgICAgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBTY29wZWRIYXNoVGFibGVJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgViwgdHlwZW5hbWUgS0luZm8+CitjbGFzcyBTY29wZWRIYXNoVGFibGUgeworICBEZW5zZU1hcDxLLCBTY29wZWRIYXNoVGFibGVWYWw8SywgViwgS0luZm8+KiwgS0luZm8+IFRvcExldmVsTWFwOworICBTY29wZWRIYXNoVGFibGVTY29wZTxLLCBWLCBLSW5mbz4gKkN1clNjb3BlOworICBTY29wZWRIYXNoVGFibGUoY29uc3QgU2NvcGVkSGFzaFRhYmxlJik7IC8vIE5PVCBZRVQgSU1QTEVNRU5URUQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU2NvcGVkSGFzaFRhYmxlJik7ICAvLyBOT1QgWUVUIElNUExFTUVOVEVECisgIGZyaWVuZCBjbGFzcyBTY29wZWRIYXNoVGFibGVTY29wZTxLLCBWLCBLSW5mbz47CitwdWJsaWM6CisgIFNjb3BlZEhhc2hUYWJsZSgpIDogQ3VyU2NvcGUoMCkge30KKyAgflNjb3BlZEhhc2hUYWJsZSgpIHsKKyAgICBhc3NlcnQoQ3VyU2NvcGUgPT0gMCAmJiBUb3BMZXZlbE1hcC5lbXB0eSgpICYmICJTY29wZSBpbWJhbGFuY2UhIik7CisgIH0KKworICBib29sIGNvdW50KGNvbnN0IEsgJktleSkgY29uc3QgeworICAgIHJldHVybiBUb3BMZXZlbE1hcC5jb3VudChLZXkpOworICB9CisKKyAgViBsb29rdXAoY29uc3QgSyAmS2V5KSB7CisgICAgdHlwZW5hbWUgRGVuc2VNYXA8SywgU2NvcGVkSGFzaFRhYmxlVmFsPEssIFYsIEtJbmZvPiosIEtJbmZvPjo6aXRlcmF0b3IKKyAgICAgIEkgPSBUb3BMZXZlbE1hcC5maW5kKEtleSk7CisgICAgaWYgKEkgIT0gVG9wTGV2ZWxNYXAuZW5kKCkpCisgICAgICByZXR1cm4gSS0+c2Vjb25kLT5nZXRWYWx1ZSgpOworICAgICAgCisgICAgcmV0dXJuIFYoKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KGNvbnN0IEsgJktleSwgY29uc3QgViAmVmFsKSB7CisgICAgYXNzZXJ0KEN1clNjb3BlICYmICJObyBzY29wZSBhY3RpdmUhIik7CisKKyAgICBTY29wZWRIYXNoVGFibGVWYWw8SywgViwgS0luZm8+IComS2V5RW50cnkgPSBUb3BMZXZlbE1hcFtLZXldOworCisgICAgS2V5RW50cnk9IG5ldyBTY29wZWRIYXNoVGFibGVWYWw8SywgViwgS0luZm8+KEN1clNjb3BlLT5nZXRMYXN0VmFsSW5TY29wZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFbnRyeSwgS2V5LCBWYWwpOworICAgIEN1clNjb3BlLT5zZXRMYXN0VmFsSW5TY29wZShLZXlFbnRyeSk7CisgIH0KKworICB0eXBlZGVmIFNjb3BlZEhhc2hUYWJsZUl0ZXJhdG9yPEssIFYsIEtJbmZvPiBpdGVyYXRvcjsKKworICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigwKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKGNvbnN0IEsgJktleSkgeworICAgIHR5cGVuYW1lIERlbnNlTWFwPEssIFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWLCBLSW5mbz4qLCBLSW5mbz46Oml0ZXJhdG9yIEkgPQorICAgICAgVG9wTGV2ZWxNYXAuZmluZChLZXkpOworICAgIGlmIChJID09IFRvcExldmVsTWFwLmVuZCgpKSByZXR1cm4gZW5kKCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKEktPnNlY29uZCk7CisgIH0KK307CisKKy8vLyBTY29wZWRIYXNoVGFibGVTY29wZSBjdG9yIC0gSW5zdGFsbCB0aGlzIGFzIHRoZSBjdXJyZW50IHNjb3BlIGZvciB0aGUgaGFzaAorLy8vIHRhYmxlLgordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIHR5cGVuYW1lIEtJbmZvPgorU2NvcGVkSGFzaFRhYmxlU2NvcGU8SywgViwgS0luZm8+OjoKKyAgU2NvcGVkSGFzaFRhYmxlU2NvcGUoU2NvcGVkSGFzaFRhYmxlPEssIFYsIEtJbmZvPiAmaHQpIDogSFQoaHQpIHsKKyAgUHJldlNjb3BlID0gSFQuQ3VyU2NvcGU7CisgIEhULkN1clNjb3BlID0gdGhpczsKKyAgTGFzdFZhbEluU2NvcGUgPSAwOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgViwgdHlwZW5hbWUgS0luZm8+CitTY29wZWRIYXNoVGFibGVTY29wZTxLLCBWLCBLSW5mbz46On5TY29wZWRIYXNoVGFibGVTY29wZSgpIHsKKyAgYXNzZXJ0KEhULkN1clNjb3BlID09IHRoaXMgJiYgIlNjb3BlIGltYmFsYW5jZSEiKTsKKyAgSFQuQ3VyU2NvcGUgPSBQcmV2U2NvcGU7CisKKyAgLy8gUG9wIGFuZCBkZWxldGUgYWxsIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2NvcGUuCisgIHdoaWxlIChTY29wZWRIYXNoVGFibGVWYWw8SywgViwgS0luZm8+ICpUaGlzRW50cnkgPSBMYXN0VmFsSW5TY29wZSkgeworICAgIC8vIFBvcCB0aGlzIHZhbHVlIG91dCBvZiB0aGUgVG9wTGV2ZWxNYXAuCisgICAgaWYgKFRoaXNFbnRyeS0+Z2V0TmV4dEZvcktleSgpID09IDApIHsKKyAgICAgIGFzc2VydChIVC5Ub3BMZXZlbE1hcFtUaGlzRW50cnktPmdldEtleSgpXSA9PSBUaGlzRW50cnkgJiYKKyAgICAgICAgICAgICAiU2NvcGUgaW1iYWxhbmNlISIpOworICAgICAgSFQuVG9wTGV2ZWxNYXAuZXJhc2UoVGhpc0VudHJ5LT5nZXRLZXkoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWLCBLSW5mbz4gKiZLZXlFbnRyeSA9CisgICAgICAgIEhULlRvcExldmVsTWFwW1RoaXNFbnRyeS0+Z2V0S2V5KCldOworICAgICAgYXNzZXJ0KEtleUVudHJ5ID09IFRoaXNFbnRyeSAmJiAiU2NvcGUgaW1iYWxhbmNlISIpOworICAgICAgS2V5RW50cnkgPSBUaGlzRW50cnktPmdldE5leHRGb3JLZXkoKTsKKyAgICB9CisKKyAgICAvLyBQb3AgdGhpcyB2YWx1ZSBvdXQgb2YgdGhlIHNjb3BlLgorICAgIExhc3RWYWxJblNjb3BlID0gVGhpc0VudHJ5LT5nZXROZXh0SW5TY29wZSgpOworCisgICAgLy8gRGVsZXRlIHRoaXMgZW50cnkuCisgICAgZGVsZXRlIFRoaXNFbnRyeTsKKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU2V0T3BlcmF0aW9ucy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TZXRPcGVyYXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmNWRiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU2V0T3BlcmF0aW9ucy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vPT09LS0gbGx2bS9BRFQvU2V0T3BlcmF0aW9ucy5oIC0gR2VuZXJpYyBTZXQgT3BlcmF0aW9ucyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgZ2VuZXJpYyBzZXQgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSB1c2VkIG9uIHNldCdzIG9mCisvLyBkaWZmZXJlbnQgdHlwZXMsIGFuZCBkaWZmZXJlbnQgZWxlbWVudCB0eXBlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NFVE9QRVJBVElPTlNfSAorI2RlZmluZSBMTFZNX0FEVF9TRVRPUEVSQVRJT05TX0gKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gc2V0X3VuaW9uKEEsIEIpIC0gQ29tcHV0ZSBBIDo9IEEgdSBCLCByZXR1cm4gd2hldGhlciBBIGNoYW5nZWQuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBTMVR5LCBjbGFzcyBTMlR5PgorYm9vbCBzZXRfdW5pb24oUzFUeSAmUzEsIGNvbnN0IFMyVHkgJlMyKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIGZvciAodHlwZW5hbWUgUzJUeTo6Y29uc3RfaXRlcmF0b3IgU0kgPSBTMi5iZWdpbigpLCBTRSA9IFMyLmVuZCgpOworICAgICAgIFNJICE9IFNFOyArK1NJKQorICAgIGlmIChTMS5pbnNlcnQoKlNJKS5zZWNvbmQpCisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIHNldF9pbnRlcnNlY3QoQSwgQikgLSBDb21wdXRlIEEgOj0gQSBeIEIKKy8vLyBJZGVudGljYWwgdG8gc2V0X2ludGVyc2VjdGlvbiwgZXhjZXB0IHRoYXQgaXQgd29ya3Mgb24gc2V0PD4ncyBhbmQKKy8vLyBpcyBuaWNlciB0byB1c2UuICBGdW5jdGlvbmFsbHksIHRoaXMgaXRlcmF0ZXMgdGhyb3VnaCBTMSwgcmVtb3ZpbmcKKy8vLyBlbGVtZW50cyB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIFMyLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgUzFUeSwgY2xhc3MgUzJUeT4KK3ZvaWQgc2V0X2ludGVyc2VjdChTMVR5ICZTMSwgY29uc3QgUzJUeSAmUzIpIHsKKyAgIGZvciAodHlwZW5hbWUgUzFUeTo6aXRlcmF0b3IgSSA9IFMxLmJlZ2luKCk7IEkgIT0gUzEuZW5kKCk7KSB7CisgICAgIGNvbnN0IHR5cGVuYW1lIFMxVHk6OmtleV90eXBlICZFID0gKkk7CisgICAgICsrSTsKKyAgICAgaWYgKCFTMi5jb3VudChFKSkgUzEuZXJhc2UoRSk7ICAgLy8gRXJhc2UgZWxlbWVudCBpZiBub3QgaW4gUzIKKyAgIH0KK30KKworLy8vIHNldF9kaWZmZXJlbmNlKEEsIEIpIC0gUmV0dXJuIEEgLSBCCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBTMVR5LCBjbGFzcyBTMlR5PgorUzFUeSBzZXRfZGlmZmVyZW5jZShjb25zdCBTMVR5ICZTMSwgY29uc3QgUzJUeSAmUzIpIHsKKyAgUzFUeSBSZXN1bHQ7CisgIGZvciAodHlwZW5hbWUgUzFUeTo6Y29uc3RfaXRlcmF0b3IgU0kgPSBTMS5iZWdpbigpLCBTRSA9IFMxLmVuZCgpOworICAgICAgIFNJICE9IFNFOyArK1NJKQorICAgIGlmICghUzIuY291bnQoKlNJKSkgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgbm90IGluIHNldDIKKyAgICAgIFJlc3VsdC5pbnNlcnQoKlNJKTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8vIHNldF9zdWJ0cmFjdChBLCBCKSAtIENvbXB1dGUgQSA6PSBBIC0gQgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgUzFUeSwgY2xhc3MgUzJUeT4KK3ZvaWQgc2V0X3N1YnRyYWN0KFMxVHkgJlMxLCBjb25zdCBTMlR5ICZTMikgeworICBmb3IgKHR5cGVuYW1lIFMyVHk6OmNvbnN0X2l0ZXJhdG9yIFNJID0gUzIuYmVnaW4oKSwgU0UgPSBTMi5lbmQoKTsKKyAgICAgICBTSSAhPSBTRTsgKytTSSkKKyAgICBTMS5lcmFzZSgqU0kpOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU2V0VmVjdG9yLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1NldFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODI4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1NldFZlY3Rvci5oCkBAIC0wLDAgKzEsMTc2IEBACisvLz09PS0gbGx2bS9BRFQvU2V0VmVjdG9yLmggLSBTZXQgd2l0aCBpbnNlcnQgb3JkZXIgaXRlcmF0aW9uIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgc2V0IHRoYXQgaGFzIGluc2VydGlvbiBvcmRlciBpdGVyYXRpb24KKy8vIGNoYXJhY3RlcmlzdGljcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGtlZXBpbmcgYSBzZXQgb2YgdGhpbmdzIHRoYXQgbmVlZCB0byBiZQorLy8gdmlzaXRlZCBsYXRlciBidXQgaW4gYSBkZXRlcm1pbmlzdGljIG9yZGVyIChpbnNlcnRpb24gb3JkZXIpLiBUaGUgaW50ZXJmYWNlCisvLyBpcyBwdXJwb3NlZnVsbHkgbWluaW1hbC4KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBTZXRWZWN0b3IgYW5kIFNtYWxsU2V0VmVjdG9yLCB3aGljaCBwZXJmb3JtcyBubyBhbGxvY2F0aW9ucworLy8gaWYgdGhlIFNldFZlY3RvciBoYXMgbGVzcyB0aGFuIGEgY2VydGFpbiBudW1iZXIgb2YgZWxlbWVudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TRVRWRUNUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9TRVRWRUNUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgYWRhcHRlciBjbGFzcyBwcm92aWRlcyBhIHdheSB0byBrZWVwIGEgc2V0IG9mIHRoaW5ncyB0aGF0IGFsc28gaGFzIHRoZQorLy8vIHByb3BlcnR5IG9mIGEgZGV0ZXJtaW5pc3RpYyBpdGVyYXRpb24gb3JkZXIuIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgdGhlCisvLy8gb3JkZXIgb2YgaW5zZXJ0aW9uLgorLy8vIEBicmllZiBBIHZlY3RvciB0aGF0IGhhcyBzZXQgaW5zZXJ0aW9uIHNlbWFudGljcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBWZWN0b3IgPSBzdGQ6OnZlY3RvcjxUPiwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBTZXQgPSBTbWFsbFNldDxULCAxNj4gPgorY2xhc3MgU2V0VmVjdG9yIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgVCBrZXlfdHlwZTsKKyAgdHlwZWRlZiBUJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgVCYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIFNldCBzZXRfdHlwZTsKKyAgdHlwZWRlZiBWZWN0b3IgdmVjdG9yX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmVjdG9yX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIHZlY3Rvcl90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2ZWN0b3JfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBTZXRWZWN0b3IKKyAgU2V0VmVjdG9yKCkge30KKworICAvLy8gQGJyaWVmIEluaXRpYWxpemUgYSBTZXRWZWN0b3Igd2l0aCBhIHJhbmdlIG9mIGVsZW1lbnRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICBTZXRWZWN0b3IoSXQgU3RhcnQsIEl0IEVuZCkgeworICAgIGluc2VydChTdGFydCwgRW5kKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBTZXRWZWN0b3IgaXMgZW1wdHkgb3Igbm90LgorICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfLmVtcHR5KCk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBTZXRWZWN0b3IuCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfLnNpemUoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNldFZlY3Rvci4KKyAgaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgcmV0dXJuIHZlY3Rvcl8uYmVnaW4oKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgU2V0VmVjdG9yLgorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gdmVjdG9yXy5iZWdpbigpOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgU2V0VmVjdG9yLgorICBpdGVyYXRvciBlbmQoKSB7CisgICAgcmV0dXJuIHZlY3Rvcl8uZW5kKCk7CisgIH0KKworICAvLy8gQGJyaWVmIEdldCBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIFNldFZlY3Rvci4KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfLmVuZCgpOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgU2V0VmVjdG9yLgorICBjb25zdCBUICZiYWNrKCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2Fubm90IGNhbGwgYmFjaygpIG9uIGVtcHR5IFNldFZlY3RvciEiKTsKKyAgICByZXR1cm4gdmVjdG9yXy5iYWNrKCk7CisgIH0KKworICAvLy8gQGJyaWVmIEluZGV4IGludG8gdGhlIFNldFZlY3Rvci4KKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIG4pIGNvbnN0IHsKKyAgICBhc3NlcnQobiA8IHZlY3Rvcl8uc2l6ZSgpICYmICJTZXRWZWN0b3IgYWNjZXNzIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gdmVjdG9yX1tuXTsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGUgZWxlbWVudCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgU2V0VmVjdG9yLgorICAvLy8gQGJyaWVmIEluc2VydCBhIG5ldyBlbGVtZW50IGludG8gdGhlIFNldFZlY3Rvci4KKyAgYm9vbCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSAmWCkgeworICAgIGJvb2wgcmVzdWx0ID0gc2V0Xy5pbnNlcnQoWCk7CisgICAgaWYgKHJlc3VsdCkKKyAgICAgIHZlY3Rvcl8ucHVzaF9iYWNrKFgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLy8gQGJyaWVmIEluc2VydCBhIHJhbmdlIG9mIGVsZW1lbnRzIGludG8gdGhlIFNldFZlY3Rvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgIHZvaWQgaW5zZXJ0KEl0IFN0YXJ0LCBJdCBFbmQpIHsKKyAgICBmb3IgKDsgU3RhcnQgIT0gRW5kOyArK1N0YXJ0KQorICAgICAgaWYgKHNldF8uaW5zZXJ0KCpTdGFydCkpCisgICAgICAgIHZlY3Rvcl8ucHVzaF9iYWNrKCpTdGFydCk7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIHNldCB2ZWN0b3IuCisgIHZvaWQgcmVtb3ZlKGNvbnN0IHZhbHVlX3R5cGUmIFgpIHsKKyAgICBpZiAoc2V0Xy5lcmFzZShYKSkgeworICAgICAgdHlwZW5hbWUgdmVjdG9yX3R5cGU6Oml0ZXJhdG9yIEkgPQorICAgICAgICBzdGQ6OmZpbmQodmVjdG9yXy5iZWdpbigpLCB2ZWN0b3JfLmVuZCgpLCBYKTsKKyAgICAgIGFzc2VydChJICE9IHZlY3Rvcl8uZW5kKCkgJiYgIkNvcnJ1cHRlZCBTZXRWZWN0b3IgaW5zdGFuY2VzISIpOworICAgICAgdmVjdG9yXy5lcmFzZShJKTsKKyAgICB9CisgIH0KKworCisgIC8vLyBAcmV0dXJucyAwIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBpbiB0aGUgU2V0VmVjdG9yLCAxIGlmIGl0IGlzLgorICAvLy8gQGJyaWVmIENvdW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSBnaXZlbiBrZXkgaW4gdGhlIFNldFZlY3Rvci4KKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlICZrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gc2V0Xy5jb3VudChrZXkpOworICB9CisKKyAgLy8vIEBicmllZiBDb21wbGV0ZWx5IGNsZWFyIHRoZSBTZXRWZWN0b3IKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBzZXRfLmNsZWFyKCk7CisgICAgdmVjdG9yXy5jbGVhcigpOworICB9CisKKyAgLy8vIEBicmllZiBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgU2V0VmVjdG9yLgorICB2b2lkIHBvcF9iYWNrKCkgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2Fubm90IHJlbW92ZSBhbiBlbGVtZW50IGZyb20gYW4gZW1wdHkgU2V0VmVjdG9yISIpOworICAgIHNldF8uZXJhc2UoYmFjaygpKTsKKyAgICB2ZWN0b3JfLnBvcF9iYWNrKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2V0VmVjdG9yICZ0aGF0KSBjb25zdCB7CisgICAgcmV0dXJuIHZlY3Rvcl8gPT0gdGhhdC52ZWN0b3JfOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNldFZlY3RvciAmdGhhdCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfICE9IHRoYXQudmVjdG9yXzsKKyAgfQorCitwcml2YXRlOgorICBzZXRfdHlwZSBzZXRfOyAgICAgICAgIC8vLzwgVGhlIHNldC4KKyAgdmVjdG9yX3R5cGUgdmVjdG9yXzsgICAvLy88IFRoZSB2ZWN0b3IuCit9OworCisvLy8gU21hbGxTZXRWZWN0b3IgLSBBIFNldFZlY3RvciB0aGF0IHBlcmZvcm1zIG5vIGFsbG9jYXRpb25zIGlmIHNtYWxsZXIgdGhhbgorLy8vIGEgY2VydGFpbiBzaXplLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CitjbGFzcyBTbWFsbFNldFZlY3RvciA6IHB1YmxpYyBTZXRWZWN0b3I8VCwgU21hbGxWZWN0b3I8VCwgTj4sIFNtYWxsU2V0PFQsIE4+ID4geworcHVibGljOgorICBTbWFsbFNldFZlY3RvcigpIHt9CisKKyAgLy8vIEBicmllZiBJbml0aWFsaXplIGEgU21hbGxTZXRWZWN0b3Igd2l0aCBhIHJhbmdlIG9mIGVsZW1lbnRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICBTbWFsbFNldFZlY3RvcihJdCBTdGFydCwgSXQgRW5kKSB7CisgICAgdGhpcy0+aW5zZXJ0KFN0YXJ0LCBFbmQpOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisvLyB2aW06IHN3PTIgYWkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbEJpdFZlY3Rvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbEJpdFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDFkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsQml0VmVjdG9yLmgKQEAgLTAsMCArMSw0NTQgQEAKKy8vPT09LSBsbHZtL0FEVC9TbWFsbEJpdFZlY3Rvci5oIC0gJ05vcm1hbGx5IHNtYWxsJyBiaXQgdmVjdG9ycyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNtYWxsQml0VmVjdG9yIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU01BTExCSVRWRUNUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9TTUFMTEJJVFZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFNtYWxsQml0VmVjdG9yIC0gVGhpcyBpcyBhICdiaXR2ZWN0b3InIChyZWFsbHksIGEgdmFyaWFibGUtc2l6ZWQgYml0IGFycmF5KSwKKy8vLyBvcHRpbWl6ZWQgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIGFycmF5IGlzIHNtYWxsLiAgSXQgY29udGFpbnMgb25lCisvLy8gcG9pbnRlci1zaXplZCBmaWVsZCwgd2hpY2ggaXMgZGlyZWN0bHkgdXNlZCBhcyBhIHBsYWluIGNvbGxlY3Rpb24gb2YgYml0cworLy8vIHdoZW4gcG9zc2libGUsIG9yIGFzIGEgcG9pbnRlciB0byBhIGxhcmdlciBoZWFwLWFsbG9jYXRlZCBhcnJheSB3aGVuCisvLy8gbmVjZXNzYXJ5LiAgVGhpcyBhbGxvd3Mgbm9ybWFsICJzbWFsbCIgY2FzZXMgdG8gYmUgZmFzdCB3aXRob3V0IGxvc2luZworLy8vIGdlbmVyYWxpdHkgZm9yIGxhcmdlIGlucHV0cy4KKy8vLworY2xhc3MgU21hbGxCaXRWZWN0b3IgeworICAvLyBUT0RPOiBJbiAibGFyZ2UiIG1vZGUsIGEgcG9pbnRlciB0byBhIEJpdFZlY3RvciBpcyB1c2VkLCBsZWFkaW5nIHRvIGFuCisgIC8vIHVubmVjZXNzYXJ5IGxldmVsIG9mIGluZGlyZWN0aW9uLiBJdCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgYQorICAvLyBwb2ludGVyIHRvIG1lbW9yeSBjb250YWluaW5nIHNpemUsIGFsbG9jYXRpb24gc2l6ZSwgYW5kIHRoZSBhcnJheSBvZiBiaXRzLgorICB1aW50cHRyX3QgWDsKKworICBlbnVtIHsKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjbGFzcy4KKyAgICBOdW1CYXNlQml0cyA9IHNpemVvZih1aW50cHRyX3QpICogQ0hBUl9CSVQsCisKKyAgICAvLyBPbmUgYml0IGlzIHVzZWQgdG8gZGlzY3JpbWluYXRlIGJldHdlZW4gc21hbGwgYW5kIGxhcmdlIG1vZGUuIFRoZQorICAgIC8vIHJlbWFpbmluZyBiaXRzIGFyZSB1c2VkIGZvciB0aGUgc21hbGwtbW9kZSByZXByZXNlbnRhdGlvbi4KKyAgICBTbWFsbE51bVJhd0JpdHMgPSBOdW1CYXNlQml0cyAtIDEsCisKKyAgICAvLyBBIGZldyBtb3JlIGJpdHMgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIHNpemUgb2YgdGhlIGJpdCBzZXQgaW4gc21hbGwgbW9kZS4KKyAgICAvLyBUaGVvcmV0aWNhbGx5IHRoaXMgaXMgYSBjZWlsLWxvZzIuIFRoZXNlIGJpdHMgYXJlIGVuY29kZWQgaW4gdGhlIG1vc3QKKyAgICAvLyBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByYXcgYml0cy4KKyAgICBTbWFsbE51bVNpemVCaXRzID0gKE51bUJhc2VCaXRzID09IDMyID8gNSA6CisgICAgICAgICAgICAgICAgICAgICAgICBOdW1CYXNlQml0cyA9PSA2NCA/IDYgOgorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxOdW1SYXdCaXRzKSwKKworICAgIC8vIFRoZSByZW1haW5pbmcgYml0cyBhcmUgdXNlZCB0byBzdG9yZSB0aGUgYWN0dWFsIHNldCBpbiBzbWFsbCBtb2RlLgorICAgIFNtYWxsTnVtRGF0YUJpdHMgPSBTbWFsbE51bVJhd0JpdHMgLSBTbWFsbE51bVNpemVCaXRzCisgIH07CisKK3B1YmxpYzoKKyAgLy8gRW5jYXBzdWxhdGlvbiBvZiBhIHNpbmdsZSBiaXQuCisgIGNsYXNzIHJlZmVyZW5jZSB7CisgICAgU21hbGxCaXRWZWN0b3IgJlRoZVZlY3RvcjsKKyAgICB1bnNpZ25lZCBCaXRQb3M7CisKKyAgcHVibGljOgorICAgIHJlZmVyZW5jZShTbWFsbEJpdFZlY3RvciAmYiwgdW5zaWduZWQgSWR4KSA6IFRoZVZlY3RvcihiKSwgQml0UG9zKElkeCkge30KKworICAgIHJlZmVyZW5jZSYgb3BlcmF0b3I9KHJlZmVyZW5jZSB0KSB7CisgICAgICAqdGhpcyA9IGJvb2wodCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgcmVmZXJlbmNlJiBvcGVyYXRvcj0oYm9vbCB0KSB7CisgICAgICBpZiAodCkKKyAgICAgICAgVGhlVmVjdG9yLnNldChCaXRQb3MpOworICAgICAgZWxzZQorICAgICAgICBUaGVWZWN0b3IucmVzZXQoQml0UG9zKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgU21hbGxCaXRWZWN0b3IgJj4oVGhlVmVjdG9yKS5vcGVyYXRvcltdKEJpdFBvcyk7CisgICAgfQorICB9OworCitwcml2YXRlOgorICBib29sIGlzU21hbGwoKSBjb25zdCB7CisgICAgcmV0dXJuIFggJiB1aW50cHRyX3QoMSk7CisgIH0KKworICBCaXRWZWN0b3IgKmdldFBvaW50ZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc1NtYWxsKCkpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEJpdFZlY3RvciAqPihYKTsKKyAgfQorCisgIHZvaWQgc3dpdGNoVG9TbWFsbCh1aW50cHRyX3QgTmV3U21hbGxCaXRzLCBzaXplX3QgTmV3U2l6ZSkgeworICAgIFggPSAxOworICAgIHNldFNtYWxsU2l6ZShOZXdTaXplKTsKKyAgICBzZXRTbWFsbEJpdHMoTmV3U21hbGxCaXRzKTsKKyAgfQorCisgIHZvaWQgc3dpdGNoVG9MYXJnZShCaXRWZWN0b3IgKkJWKSB7CisgICAgWCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihCVik7CisgICAgYXNzZXJ0KCFpc1NtYWxsKCkgJiYgIlRyaWVkIHRvIHVzZSBhbiB1bmFsaWduZWQgcG9pbnRlciIpOworICB9CisKKyAgLy8gUmV0dXJuIGFsbCB0aGUgYml0cyB1c2VkIGZvciB0aGUgInNtYWxsIiByZXByZXNlbnRhdGlvbjsgdGhpcyBpbmNsdWRlcworICAvLyBiaXRzIGZvciB0aGUgc2l6ZSBhcyB3ZWxsIGFzIHRoZSBlbGVtZW50IGJpdHMuCisgIHVpbnRwdHJfdCBnZXRTbWFsbFJhd0JpdHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU21hbGwoKSk7CisgICAgcmV0dXJuIFggPj4gMTsKKyAgfQorCisgIHZvaWQgc2V0U21hbGxSYXdCaXRzKHVpbnRwdHJfdCBOZXdSYXdCaXRzKSB7CisgICAgYXNzZXJ0KGlzU21hbGwoKSk7CisgICAgWCA9IChOZXdSYXdCaXRzIDw8IDEpIHwgdWludHB0cl90KDEpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBzaXplLgorICBzaXplX3QgZ2V0U21hbGxTaXplKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTbWFsbFJhd0JpdHMoKSA+PiBTbWFsbE51bURhdGFCaXRzOworICB9CisKKyAgdm9pZCBzZXRTbWFsbFNpemUoc2l6ZV90IFNpemUpIHsKKyAgICBzZXRTbWFsbFJhd0JpdHMoZ2V0U21hbGxCaXRzKCkgfCAoU2l6ZSA8PCBTbWFsbE51bURhdGFCaXRzKSk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGVsZW1lbnQgYml0cy4KKyAgdWludHB0cl90IGdldFNtYWxsQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U21hbGxSYXdCaXRzKCkgJiB+KH51aW50cHRyX3QoMCkgPDwgZ2V0U21hbGxTaXplKCkpOworICB9CisKKyAgdm9pZCBzZXRTbWFsbEJpdHModWludHB0cl90IE5ld0JpdHMpIHsKKyAgICBzZXRTbWFsbFJhd0JpdHMoKE5ld0JpdHMgJiB+KH51aW50cHRyX3QoMCkgPDwgZ2V0U21hbGxTaXplKCkpKSB8CisgICAgICAgICAgICAgICAgICAgIChnZXRTbWFsbFNpemUoKSA8PCBTbWFsbE51bURhdGFCaXRzKSk7CisgIH0KKworcHVibGljOgorICAvLy8gU21hbGxCaXRWZWN0b3IgZGVmYXVsdCBjdG9yIC0gQ3JlYXRlcyBhbiBlbXB0eSBiaXR2ZWN0b3IuCisgIFNtYWxsQml0VmVjdG9yKCkgOiBYKDEpIHt9CisKKyAgLy8vIFNtYWxsQml0VmVjdG9yIGN0b3IgLSBDcmVhdGVzIGEgYml0dmVjdG9yIG9mIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4gQWxsCisgIC8vLyBiaXRzIGFyZSBpbml0aWFsaXplZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICBleHBsaWNpdCBTbWFsbEJpdFZlY3Rvcih1bnNpZ25lZCBzLCBib29sIHQgPSBmYWxzZSkgeworICAgIGlmIChzIDw9IFNtYWxsTnVtRGF0YUJpdHMpCisgICAgICBzd2l0Y2hUb1NtYWxsKHQgPyB+dWludHB0cl90KDApIDogMCwgcyk7CisgICAgZWxzZQorICAgICAgc3dpdGNoVG9MYXJnZShuZXcgQml0VmVjdG9yKHMsIHQpKTsKKyAgfQorCisgIC8vLyBTbWFsbEJpdFZlY3RvciBjb3B5IGN0b3IuCisgIFNtYWxsQml0VmVjdG9yKGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgICBpZiAoUkhTLmlzU21hbGwoKSkKKyAgICAgIFggPSBSSFMuWDsKKyAgICBlbHNlCisgICAgICBzd2l0Y2hUb0xhcmdlKG5ldyBCaXRWZWN0b3IoKlJIUy5nZXRQb2ludGVyKCkpKTsKKyAgfQorCisgIH5TbWFsbEJpdFZlY3RvcigpIHsKKyAgICBpZiAoIWlzU21hbGwoKSkKKyAgICAgIGRlbGV0ZSBnZXRQb2ludGVyKCk7CisgIH0KKworICAvLy8gZW1wdHkgLSBUZXN0cyB3aGV0aGVyIHRoZXJlIGFyZSBubyBiaXRzIGluIHRoaXMgYml0dmVjdG9yLgorICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBpc1NtYWxsKCkgPyBnZXRTbWFsbFNpemUoKSA9PSAwIDogZ2V0UG9pbnRlcigpLT5lbXB0eSgpOworICB9CisKKyAgLy8vIHNpemUgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGJpdHZlY3Rvci4KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU21hbGwoKSA/IGdldFNtYWxsU2l6ZSgpIDogZ2V0UG9pbnRlcigpLT5zaXplKCk7CisgIH0KKworICAvLy8gY291bnQgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyB3aGljaCBhcmUgc2V0LgorICB1bnNpZ25lZCBjb3VudCgpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICB1aW50cHRyX3QgQml0cyA9IGdldFNtYWxsQml0cygpOworICAgICAgaWYgKHNpemVvZih1aW50cHRyX3QpICogQ0hBUl9CSVQgPT0gMzIpCisgICAgICAgIHJldHVybiBDb3VudFBvcHVsYXRpb25fMzIoQml0cyk7CisgICAgICBpZiAoc2l6ZW9mKHVpbnRwdHJfdCkgKiBDSEFSX0JJVCA9PSA2NCkKKyAgICAgICAgcmV0dXJuIENvdW50UG9wdWxhdGlvbl82NChCaXRzKTsKKyAgICAgIGFzc2VydCgwICYmICJVbnN1cHBvcnRlZCEiKTsKKyAgICB9CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+Y291bnQoKTsKKyAgfQorCisgIC8vLyBhbnkgLSBSZXR1cm5zIHRydWUgaWYgYW55IGJpdCBpcyBzZXQuCisgIGJvb2wgYW55KCkgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICByZXR1cm4gZ2V0U21hbGxCaXRzKCkgIT0gMDsKKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5hbnkoKTsKKyAgfQorCisgIC8vLyBub25lIC0gUmV0dXJucyB0cnVlIGlmIG5vbmUgb2YgdGhlIGJpdHMgYXJlIHNldC4KKyAgYm9vbCBub25lKCkgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICByZXR1cm4gZ2V0U21hbGxCaXRzKCkgPT0gMDsKKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5ub25lKCk7CisgIH0KKworICAvLy8gZmluZF9maXJzdCAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzZXQgYml0LCAtMSBpZiBub25lCisgIC8vLyBvZiB0aGUgYml0cyBhcmUgc2V0LgorICBpbnQgZmluZF9maXJzdCgpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICB1aW50cHRyX3QgQml0cyA9IGdldFNtYWxsQml0cygpOworICAgICAgaWYgKEJpdHMgPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgaWYgKHNpemVvZih1aW50cHRyX3QpICogQ0hBUl9CSVQgPT0gMzIpCisgICAgICAgIHJldHVybiBDb3VudFRyYWlsaW5nWmVyb3NfMzIoQml0cyk7CisgICAgICBpZiAoc2l6ZW9mKHVpbnRwdHJfdCkgKiBDSEFSX0JJVCA9PSA2NCkKKyAgICAgICAgcmV0dXJuIENvdW50VHJhaWxpbmdaZXJvc182NChCaXRzKTsKKyAgICAgIGFzc2VydCgwICYmICJVbnN1cHBvcnRlZCEiKTsKKyAgICB9CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+ZmluZF9maXJzdCgpOworICB9CisKKyAgLy8vIGZpbmRfbmV4dCAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHNldCBiaXQgZm9sbG93aW5nIHRoZQorICAvLy8gIlByZXYiIGJpdC4gUmV0dXJucyAtMSBpZiB0aGUgbmV4dCBzZXQgYml0IGlzIG5vdCBmb3VuZC4KKyAgaW50IGZpbmRfbmV4dCh1bnNpZ25lZCBQcmV2KSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgdWludHB0cl90IEJpdHMgPSBnZXRTbWFsbEJpdHMoKTsKKyAgICAgIC8vIE1hc2sgb2ZmIHByZXZpb3VzIGJpdHMuCisgICAgICBCaXRzICY9IH51aW50cHRyX3QoMCkgPDwgKFByZXYgKyAxKTsKKyAgICAgIGlmIChCaXRzID09IDAgfHwgUHJldiArIDEgPj0gZ2V0U21hbGxTaXplKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmIChzaXplb2YodWludHB0cl90KSAqIENIQVJfQklUID09IDMyKQorICAgICAgICByZXR1cm4gQ291bnRUcmFpbGluZ1plcm9zXzMyKEJpdHMpOworICAgICAgaWYgKHNpemVvZih1aW50cHRyX3QpICogQ0hBUl9CSVQgPT0gNjQpCisgICAgICAgIHJldHVybiBDb3VudFRyYWlsaW5nWmVyb3NfNjQoQml0cyk7CisgICAgICBhc3NlcnQoMCAmJiAiVW5zdXBwb3J0ZWQhIik7CisgICAgfQorICAgIHJldHVybiBnZXRQb2ludGVyKCktPmZpbmRfbmV4dChQcmV2KTsKKyAgfQorCisgIC8vLyBjbGVhciAtIENsZWFyIGFsbCBiaXRzLgorICB2b2lkIGNsZWFyKCkgeworICAgIGlmICghaXNTbWFsbCgpKQorICAgICAgZGVsZXRlIGdldFBvaW50ZXIoKTsKKyAgICBzd2l0Y2hUb1NtYWxsKDAsIDApOworICB9CisKKyAgLy8vIHJlc2l6ZSAtIEdyb3cgb3Igc2hyaW5rIHRoZSBiaXR2ZWN0b3IuCisgIHZvaWQgcmVzaXplKHVuc2lnbmVkIE4sIGJvb2wgdCA9IGZhbHNlKSB7CisgICAgaWYgKCFpc1NtYWxsKCkpIHsKKyAgICAgIGdldFBvaW50ZXIoKS0+cmVzaXplKE4sIHQpOworICAgIH0gZWxzZSBpZiAoU21hbGxOdW1EYXRhQml0cyA+PSBOKSB7CisgICAgICB1aW50cHRyX3QgTmV3Qml0cyA9IHQgPyB+dWludHB0cl90KDApIDw8IGdldFNtYWxsU2l6ZSgpIDogMDsKKyAgICAgIHNldFNtYWxsU2l6ZShOKTsKKyAgICAgIHNldFNtYWxsQml0cyhOZXdCaXRzIHwgZ2V0U21hbGxCaXRzKCkpOworICAgIH0gZWxzZSB7CisgICAgICBCaXRWZWN0b3IgKkJWID0gbmV3IEJpdFZlY3RvcihOLCB0KTsKKyAgICAgIHVpbnRwdHJfdCBPbGRCaXRzID0gZ2V0U21hbGxCaXRzKCk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IGdldFNtYWxsU2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgKCpCVilbaV0gPSAoT2xkQml0cyA+PiBpKSAmIDE7CisgICAgICBzd2l0Y2hUb0xhcmdlKEJWKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlc2VydmUodW5zaWduZWQgTikgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIGlmIChOID4gU21hbGxOdW1EYXRhQml0cykgeworICAgICAgICB1aW50cHRyX3QgT2xkQml0cyA9IGdldFNtYWxsUmF3Qml0cygpOworICAgICAgICBzaXplX3QgU21hbGxTaXplID0gZ2V0U21hbGxTaXplKCk7CisgICAgICAgIEJpdFZlY3RvciAqQlYgPSBuZXcgQml0VmVjdG9yKFNtYWxsU2l6ZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgU21hbGxTaXplOyArK2kpCisgICAgICAgICAgaWYgKChPbGRCaXRzID4+IGkpICYgMSkKKyAgICAgICAgICAgIEJWLT5zZXQoaSk7CisgICAgICAgIEJWLT5yZXNlcnZlKE4pOworICAgICAgICBzd2l0Y2hUb0xhcmdlKEJWKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ2V0UG9pbnRlcigpLT5yZXNlcnZlKE4pOworICAgIH0KKyAgfQorCisgIC8vIFNldCwgcmVzZXQsIGZsaXAKKyAgU21hbGxCaXRWZWN0b3IgJnNldCgpIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKH51aW50cHRyX3QoMCkpOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+c2V0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJnNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpIHwgKHVpbnRwdHJfdCgxKSA8PCBJZHgpKTsKKyAgICBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPnNldChJZHgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsQml0VmVjdG9yICZyZXNldCgpIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKDApOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+cmVzZXQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbEJpdFZlY3RvciAmcmVzZXQodW5zaWduZWQgSWR4KSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSAmIH4odWludHB0cl90KDEpIDw8IElkeCkpOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+cmVzZXQoSWR4KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbEJpdFZlY3RvciAmZmxpcCgpIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKH5nZXRTbWFsbEJpdHMoKSk7CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5mbGlwKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJmZsaXAodW5zaWduZWQgSWR4KSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSBeICh1aW50cHRyX3QoMSkgPDwgSWR4KSk7CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5mbGlwKElkeCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gTm8gYXJndW1lbnQgZmxpcC4KKyAgU21hbGxCaXRWZWN0b3Igb3BlcmF0b3J+KCkgY29uc3QgeworICAgIHJldHVybiBTbWFsbEJpdFZlY3RvcigqdGhpcykuZmxpcCgpOworICB9CisKKyAgLy8gSW5kZXhpbmcuCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgeworICAgIGFzc2VydChJZHggPCBzaXplKCkgJiYgIk91dC1vZi1ib3VuZHMgQml0IGFjY2Vzcy4iKTsKKyAgICByZXR1cm4gcmVmZXJlbmNlKCp0aGlzLCBJZHgpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBzaXplKCkgJiYgIk91dC1vZi1ib3VuZHMgQml0IGFjY2Vzcy4iKTsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgcmV0dXJuICgoZ2V0U21hbGxCaXRzKCkgPj4gSWR4KSAmIDEpICE9IDA7CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+b3BlcmF0b3JbXShJZHgpOworICB9CisKKyAgYm9vbCB0ZXN0KHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiAoKnRoaXMpW0lkeF07CisgIH0KKworICAvLyBDb21wYXJpc29uIG9wZXJhdG9ycy4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICBpZiAoc2l6ZSgpICE9IFJIUy5zaXplKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHJldHVybiBnZXRTbWFsbEJpdHMoKSA9PSBSSFMuZ2V0U21hbGxCaXRzKCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuICpnZXRQb2ludGVyKCkgPT0gKlJIUy5nZXRQb2ludGVyKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgIH0KKworICAvLyBJbnRlcnNlY3Rpb24sIHVuaW9uLCBkaXNqb2ludCB1bmlvbi4KKyAgU21hbGxCaXRWZWN0b3IgJm9wZXJhdG9yJj0oY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgeworICAgIHJlc2l6ZShzdGQ6Om1heChzaXplKCksIFJIUy5zaXplKCkpKTsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpICYgUkhTLmdldFNtYWxsQml0cygpKTsKKyAgICBlbHNlIGlmICghUkhTLmlzU21hbGwoKSkKKyAgICAgIGdldFBvaW50ZXIoKS0+b3BlcmF0b3ImPSgqUkhTLmdldFBvaW50ZXIoKSk7CisgICAgZWxzZSB7CisgICAgICBTbWFsbEJpdFZlY3RvciBDb3B5ID0gUkhTOworICAgICAgQ29weS5yZXNpemUoc2l6ZSgpKTsKKyAgICAgIGdldFBvaW50ZXIoKS0+b3BlcmF0b3ImPSgqQ29weS5nZXRQb2ludGVyKCkpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbEJpdFZlY3RvciAmb3BlcmF0b3J8PShjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgICAgcmVzaXplKHN0ZDo6bWF4KHNpemUoKSwgUkhTLnNpemUoKSkpOworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBzZXRTbWFsbEJpdHMoZ2V0U21hbGxCaXRzKCkgfCBSSFMuZ2V0U21hbGxCaXRzKCkpOworICAgIGVsc2UgaWYgKCFSSFMuaXNTbWFsbCgpKQorICAgICAgZ2V0UG9pbnRlcigpLT5vcGVyYXRvcnw9KCpSSFMuZ2V0UG9pbnRlcigpKTsKKyAgICBlbHNlIHsKKyAgICAgIFNtYWxsQml0VmVjdG9yIENvcHkgPSBSSFM7CisgICAgICBDb3B5LnJlc2l6ZShzaXplKCkpOworICAgICAgZ2V0UG9pbnRlcigpLT5vcGVyYXRvcnw9KCpDb3B5LmdldFBvaW50ZXIoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsQml0VmVjdG9yICZvcGVyYXRvcl49KGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgICByZXNpemUoc3RkOjptYXgoc2l6ZSgpLCBSSFMuc2l6ZSgpKSk7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSBeIFJIUy5nZXRTbWFsbEJpdHMoKSk7CisgICAgZWxzZSBpZiAoIVJIUy5pc1NtYWxsKCkpCisgICAgICBnZXRQb2ludGVyKCktPm9wZXJhdG9yXj0oKlJIUy5nZXRQb2ludGVyKCkpOworICAgIGVsc2UgeworICAgICAgU21hbGxCaXRWZWN0b3IgQ29weSA9IFJIUzsKKyAgICAgIENvcHkucmVzaXplKHNpemUoKSk7CisgICAgICBnZXRQb2ludGVyKCktPm9wZXJhdG9yXj0oKkNvcHkuZ2V0UG9pbnRlcigpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQXNzaWdubWVudCBvcGVyYXRvci4KKyAgY29uc3QgU21hbGxCaXRWZWN0b3IgJm9wZXJhdG9yPShjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgaWYgKFJIUy5pc1NtYWxsKCkpCisgICAgICAgIFggPSBSSFMuWDsKKyAgICAgIGVsc2UKKyAgICAgICAgc3dpdGNoVG9MYXJnZShuZXcgQml0VmVjdG9yKCpSSFMuZ2V0UG9pbnRlcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghUkhTLmlzU21hbGwoKSkKKyAgICAgICAgKmdldFBvaW50ZXIoKSA9ICpSSFMuZ2V0UG9pbnRlcigpOworICAgICAgZWxzZSB7CisgICAgICAgIGRlbGV0ZSBnZXRQb2ludGVyKCk7CisgICAgICAgIFggPSBSSFMuWDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBzd2FwKFNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgICBzdGQ6OnN3YXAoWCwgUkhTLlgpOworICB9Cit9OworCitpbmxpbmUgU21hbGxCaXRWZWN0b3IKK29wZXJhdG9yJihjb25zdCBTbWFsbEJpdFZlY3RvciAmTEhTLCBjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgIFNtYWxsQml0VmVjdG9yIFJlc3VsdChMSFMpOworICBSZXN1bHQgJj0gUkhTOworICByZXR1cm4gUmVzdWx0OworfQorCitpbmxpbmUgU21hbGxCaXRWZWN0b3IKK29wZXJhdG9yfChjb25zdCBTbWFsbEJpdFZlY3RvciAmTEhTLCBjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgIFNtYWxsQml0VmVjdG9yIFJlc3VsdChMSFMpOworICBSZXN1bHQgfD0gUkhTOworICByZXR1cm4gUmVzdWx0OworfQorCitpbmxpbmUgU21hbGxCaXRWZWN0b3IKK29wZXJhdG9yXihjb25zdCBTbWFsbEJpdFZlY3RvciAmTEhTLCBjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgIFNtYWxsQml0VmVjdG9yIFJlc3VsdChMSFMpOworICBSZXN1bHQgXj0gUkhTOworICByZXR1cm4gUmVzdWx0OworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIHsKKyAgLy8vIEltcGxlbWVudCBzdGQ6OnN3YXAgaW4gdGVybXMgb2YgQml0VmVjdG9yIHN3YXAuCisgIGlubGluZSB2b2lkCisgIHN3YXAobGx2bTo6U21hbGxCaXRWZWN0b3IgJkxIUywgbGx2bTo6U21hbGxCaXRWZWN0b3IgJlJIUykgeworICAgIExIUy5zd2FwKFJIUyk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsUHRyU2V0LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1NtYWxsUHRyU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0YmRiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxQdHJTZXQuaApAQCAtMCwwICsxLDI5MyBAQAorLy89PT0tIGxsdm0vQURUL1NtYWxsUHRyU2V0LmggLSAnTm9ybWFsbHkgc21hbGwnIHBvaW50ZXIgc2V0IC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU21hbGxQdHJTZXQgY2xhc3MuICBTZWUgdGhlIGRveHlnZW4gY29tbWVudCBmb3IKKy8vIFNtYWxsUHRyU2V0SW1wbCBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBhbGdvcml0aG0gdXNlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NNQUxMUFRSU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfU01BTExQVFJTRVRfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbDsKKworLy8vIFNtYWxsUHRyU2V0SW1wbCAtIFRoaXMgaXMgdGhlIGNvbW1vbiBjb2RlIHNoYXJlZCBhbW9uZyBhbGwgdGhlCisvLy8gU21hbGxQdHJTZXQ8PidzLCB3aGljaCBpcyBhbG1vc3QgZXZlcnl0aGluZy4gIFNtYWxsUHRyU2V0IGhhcyB0d28gbW9kZXMsIG9uZQorLy8vIGZvciBzbWFsbCBhbmQgb25lIGZvciBsYXJnZSBzZXRzLgorLy8vCisvLy8gU21hbGwgc2V0cyB1c2UgYW4gYXJyYXkgb2YgcG9pbnRlcnMgYWxsb2NhdGVkIGluIHRoZSBTbWFsbFB0clNldCBvYmplY3QsCisvLy8gd2hpY2ggaXMgdHJlYXRlZCBhcyBhIHNpbXBsZSBhcnJheSBvZiBwb2ludGVycy4gIFdoZW4gYSBwb2ludGVyIGlzIGFkZGVkIHRvCisvLy8gdGhlIHNldCwgdGhlIGFycmF5IGlzIHNjYW5uZWQgdG8gc2VlIGlmIHRoZSBlbGVtZW50IGFscmVhZHkgZXhpc3RzLCBpZiBub3QKKy8vLyB0aGUgZWxlbWVudCBpcyAncHVzaGVkIGJhY2snIG9udG8gdGhlIGFycmF5LiAgSWYgd2UgcnVuIG91dCBvZiBzcGFjZSBpbiB0aGUKKy8vLyBhcnJheSwgd2UgZ3JvdyBpbnRvIHRoZSAnbGFyZ2Ugc2V0JyBjYXNlLiAgU21hbGxTZXQgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUKKy8vLyBzZXRzIGFyZSBvZnRlbiBzbWFsbC4gIEluIHRoaXMgY2FzZSwgbm8gbWVtb3J5IGFsbG9jYXRpb24gaXMgdXNlZCwgYW5kIG9ubHkKKy8vLyBsaWdodC13ZWlnaHQgYW5kIGNhY2hlLWVmZmljaWVudCBzY2FubmluZyBpcyB1c2VkLgorLy8vCisvLy8gTGFyZ2Ugc2V0cyB1c2UgYSBjbGFzc2ljIGV4cG9uZW50aWFsbHktcHJvYmVkIGhhc2ggdGFibGUuICBFbXB0eSBidWNrZXRzIGFyZQorLy8vIHJlcHJlc2VudGVkIHdpdGggYW4gaWxsZWdhbCBwb2ludGVyIHZhbHVlICgtMSkgdG8gYWxsb3cgbnVsbCBwb2ludGVycyB0byBiZQorLy8vIGluc2VydGVkLiAgVG9tYnN0b25lcyBhcmUgcmVwcmVzZW50ZWQgd2l0aCBhbm90aGVyIGlsbGVnYWwgcG9pbnRlciB2YWx1ZQorLy8vICgtMiksIHRvIGFsbG93IGRlbGV0aW9uLiAgVGhlIGhhc2ggdGFibGUgaXMgcmVzaXplZCB3aGVuIHRoZSB0YWJsZSBpcyAzLzQgb3IKKy8vLyBtb3JlLiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSB0YWJsZSBpcyBkb3VibGVkIGluIHNpemUuCisvLy8KK2NsYXNzIFNtYWxsUHRyU2V0SW1wbCB7CisgIGZyaWVuZCBjbGFzcyBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbDsKK3Byb3RlY3RlZDoKKyAgLy8vIFNtYWxsQXJyYXkgLSBQb2ludHMgdG8gYSBmaXhlZCBzaXplIHNldCBvZiBidWNrZXRzLCB1c2VkIGluICdzbWFsbCBtb2RlJy4KKyAgY29uc3Qgdm9pZCAqKlNtYWxsQXJyYXk7CisgIC8vLyBDdXJBcnJheSAtIFRoaXMgaXMgdGhlIGN1cnJlbnQgc2V0IG9mIGJ1Y2tldHMuICBJZiBlcXVhbCB0byBTbWFsbEFycmF5LAorICAvLy8gdGhlbiB0aGUgc2V0IGlzIGluICdzbWFsbCBtb2RlJy4KKyAgY29uc3Qgdm9pZCAqKkN1ckFycmF5OworICAvLy8gQ3VyQXJyYXlTaXplIC0gVGhlIGFsbG9jYXRlZCBzaXplIG9mIEN1ckFycmF5LCBhbHdheXMgYSBwb3dlciBvZiB0d28uCisgIC8vLyBOb3RlIHRoYXQgQ3VyQXJyYXkgcG9pbnRzIHRvIGFuIGFycmF5IHRoYXQgaGFzIEN1ckFycmF5U2l6ZSsxIGVsZW1lbnRzIGluCisgIC8vLyBpdCwgc28gdGhhdCB0aGUgZW5kIGl0ZXJhdG9yIGFjdHVhbGx5IHBvaW50cyB0byB2YWxpZCBtZW1vcnkuCisgIHVuc2lnbmVkIEN1ckFycmF5U2l6ZTsKKworICAvLyBJZiBzbWFsbCwgdGhpcyBpcyAjIGVsdHMgYWxsb2NhdGVkIGNvbnNlcXV0aXZlbHkKKyAgdW5zaWduZWQgTnVtRWxlbWVudHM7CisgIHVuc2lnbmVkIE51bVRvbWJzdG9uZXM7CisKKyAgLy8gSGVscGVyIHRvIGNvcHkgY29uc3RydWN0IGEgU21hbGxQdHJTZXQuCisgIFNtYWxsUHRyU2V0SW1wbChjb25zdCB2b2lkICoqU21hbGxTdG9yYWdlLCBjb25zdCBTbWFsbFB0clNldEltcGwmIHRoYXQpOworICBleHBsaWNpdCBTbWFsbFB0clNldEltcGwoY29uc3Qgdm9pZCAqKlNtYWxsU3RvcmFnZSwgdW5zaWduZWQgU21hbGxTaXplKSA6CisgICAgU21hbGxBcnJheShTbWFsbFN0b3JhZ2UpLCBDdXJBcnJheShTbWFsbFN0b3JhZ2UpLCBDdXJBcnJheVNpemUoU21hbGxTaXplKSB7CisgICAgYXNzZXJ0KFNtYWxsU2l6ZSAmJiAoU21hbGxTaXplICYgKFNtYWxsU2l6ZS0xKSkgPT0gMCAmJgorICAgICAgICAgICAiSW5pdGlhbCBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28hIik7CisgICAgLy8gVGhlIGVuZCBwb2ludGVyLCBhbHdheXMgdmFsaWQsIGlzIHNldCB0byBhIHZhbGlkIGVsZW1lbnQgdG8gaGVscCB0aGUKKyAgICAvLyBpdGVyYXRvci4KKyAgICBDdXJBcnJheVtTbWFsbFNpemVdID0gMDsKKyAgICBjbGVhcigpOworICB9CisgIH5TbWFsbFB0clNldEltcGwoKTsKKworcHVibGljOgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bUVsZW1lbnRzOyB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICAvLyBJZiB0aGUgY2FwYWNpdHkgb2YgdGhlIGFycmF5IGlzIGh1Z2UsIGFuZCB0aGUgIyBlbGVtZW50cyB1c2VkIGlzIHNtYWxsLAorICAgIC8vIHNocmluayB0aGUgYXJyYXkuCisgICAgaWYgKCFpc1NtYWxsKCkgJiYgTnVtRWxlbWVudHMqNCA8IEN1ckFycmF5U2l6ZSAmJiBDdXJBcnJheVNpemUgPiAzMikKKyAgICAgIHJldHVybiBzaHJpbmtfYW5kX2NsZWFyKCk7CisKKyAgICAvLyBGaWxsIHRoZSBhcnJheSB3aXRoIGVtcHR5IG1hcmtlcnMuCisgICAgbWVtc2V0KEN1ckFycmF5LCAtMSwgQ3VyQXJyYXlTaXplKnNpemVvZih2b2lkKikpOworICAgIE51bUVsZW1lbnRzID0gMDsKKyAgICBOdW1Ub21ic3RvbmVzID0gMDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkICpnZXRUb21ic3RvbmVNYXJrZXIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPigtMik7IH0KKyAgc3RhdGljIHZvaWQgKmdldEVtcHR5TWFya2VyKCkgeworICAgIC8vIE5vdGUgdGhhdCAtMSBpcyBjaG9zZW4gdG8gbWFrZSBjbGVhcigpIGVmZmljaWVudGx5IGltcGxlbWVudGFibGUgd2l0aAorICAgIC8vIG1lbXNldCBhbmQgYmVjYXVzZSBpdCdzIG5vdCBhIHZhbGlkIHBvaW50ZXIgdmFsdWUuCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KC0xKTsKKyAgfQorCisgIC8vLyBpbnNlcnRfaW1wIC0gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50ZXIgd2FzIG5ldyB0byB0aGUgc2V0LCBmYWxzZSBpZgorICAvLy8gaXQgd2FzIGFscmVhZHkgaW4gdGhlIHNldC4gIFRoaXMgaXMgaGlkZGVuIGZyb20gdGhlIGNsaWVudCBzbyB0aGF0IHRoZQorICAvLy8gZGVyaXZlZCBjbGFzcyBjYW4gY2hlY2sgdGhhdCB0aGUgcmlnaHQgdHlwZSBvZiBwb2ludGVyIGlzIHBhc3NlZCBpbi4KKyAgYm9vbCBpbnNlcnRfaW1wKGNvbnN0IHZvaWQgKiBQdHIpOworCisgIC8vLyBlcmFzZV9pbXAgLSBJZiB0aGUgc2V0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcG9pbnRlciwgcmVtb3ZlIGl0IGFuZAorICAvLy8gcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuICBUaGlzIGlzIGhpZGRlbiBmcm9tIHRoZSBjbGllbnQgc28KKyAgLy8vIHRoYXQgdGhlIGRlcml2ZWQgY2xhc3MgY2FuIGNoZWNrIHRoYXQgdGhlIHJpZ2h0IHR5cGUgb2YgcG9pbnRlciBpcyBwYXNzZWQKKyAgLy8vIGluLgorICBib29sIGVyYXNlX2ltcChjb25zdCB2b2lkICogUHRyKTsKKworICBib29sIGNvdW50X2ltcChjb25zdCB2b2lkICogUHRyKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgLy8gTGluZWFyIHNlYXJjaCBmb3IgdGhlIGl0ZW0uCisgICAgICBmb3IgKGNvbnN0IHZvaWQgKmNvbnN0ICpBUHRyID0gU21hbGxBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAqY29uc3QgKkUgPSBTbWFsbEFycmF5K051bUVsZW1lbnRzOyBBUHRyICE9IEU7ICsrQVB0cikKKyAgICAgICAgaWYgKCpBUHRyID09IFB0cikKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBCaWcgc2V0IGNhc2UuCisgICAgcmV0dXJuICpGaW5kQnVja2V0Rm9yKFB0cikgPT0gUHRyOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNTbWFsbCgpIGNvbnN0IHsgcmV0dXJuIEN1ckFycmF5ID09IFNtYWxsQXJyYXk7IH0KKworICB1bnNpZ25lZCBIYXNoKGNvbnN0IHZvaWQgKlB0cikgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oKCh1aW50cHRyX3QpUHRyID4+IDQpICYgKEN1ckFycmF5U2l6ZS0xKSk7CisgIH0KKyAgY29uc3Qgdm9pZCAqIGNvbnN0ICpGaW5kQnVja2V0Rm9yKGNvbnN0IHZvaWQgKlB0cikgY29uc3Q7CisgIHZvaWQgc2hyaW5rX2FuZF9jbGVhcigpOworCisgIC8vLyBHcm93IC0gQWxsb2NhdGUgYSBsYXJnZXIgYmFja2luZyBzdG9yZSBmb3IgdGhlIGJ1Y2tldHMgYW5kIG1vdmUgaXQgb3Zlci4KKyAgdm9pZCBHcm93KCk7CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU21hbGxQdHJTZXRJbXBsICZSSFMpOyAgLy8gRE8gTk9UIElNUExFTUVOVC4KK3Byb3RlY3RlZDoKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBTbWFsbFB0clNldEltcGwgJlJIUyk7Cit9OworCisvLy8gU21hbGxQdHJTZXRJdGVyYXRvckltcGwgLSBUaGlzIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyBzaGFyZWQgYmV0d2VlbiBhbGwKKy8vLyBpbnN0YW5jZXMgb2YgU21hbGxQdHJTZXRJdGVyYXRvci4KK2NsYXNzIFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsIHsKK3Byb3RlY3RlZDoKKyAgY29uc3Qgdm9pZCAqY29uc3QgKkJ1Y2tldDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgU21hbGxQdHJTZXRJdGVyYXRvckltcGwoY29uc3Qgdm9pZCAqY29uc3QgKkJQKSA6IEJ1Y2tldChCUCkgeworICAgIEFkdmFuY2VJZk5vdFZhbGlkKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU21hbGxQdHJTZXRJdGVyYXRvckltcGwgJlJIUykgY29uc3QgeworICAgIHJldHVybiBCdWNrZXQgPT0gUkhTLkJ1Y2tldDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU21hbGxQdHJTZXRJdGVyYXRvckltcGwgJlJIUykgY29uc3QgeworICAgIHJldHVybiBCdWNrZXQgIT0gUkhTLkJ1Y2tldDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBBZHZhbmNlSWZOb3RWYWxpZCAtIElmIHRoZSBjdXJyZW50IGJ1Y2tldCBpc24ndCB2YWxpZCwgYWR2YW5jZSB0byBhIGJ1Y2tldAorICAvLy8gdGhhdCBpcy4gICBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gc3RvcCBiZWNhdXNlIHRoZSBlbmQoKSBidWNrZXQgaXMgbWFya2VkCisgIC8vLyB2YWxpZC4KKyAgdm9pZCBBZHZhbmNlSWZOb3RWYWxpZCgpIHsKKyAgICB3aGlsZSAoKkJ1Y2tldCA9PSBTbWFsbFB0clNldEltcGw6OmdldEVtcHR5TWFya2VyKCkgfHwKKyAgICAgICAgICAgKkJ1Y2tldCA9PSBTbWFsbFB0clNldEltcGw6OmdldFRvbWJzdG9uZU1hcmtlcigpKQorICAgICAgKytCdWNrZXQ7CisgIH0KK307CisKKy8vLyBTbWFsbFB0clNldEl0ZXJhdG9yIC0gVGhpcyBpbXBsZW1lbnRzIGEgY29uc3RfaXRlcmF0b3IgZm9yIFNtYWxsUHRyU2V0LgordGVtcGxhdGU8dHlwZW5hbWUgUHRyVHk+CitjbGFzcyBTbWFsbFB0clNldEl0ZXJhdG9yIDogcHVibGljIFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsIHsKKyAgdHlwZWRlZiBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UHRyVHk+IFB0clRyYWl0czsKKyAgCitwdWJsaWM6CisgIHR5cGVkZWYgUHRyVHkgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIFB0clR5ICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICB0eXBlZGVmIFB0clR5ICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAKKyAgZXhwbGljaXQgU21hbGxQdHJTZXRJdGVyYXRvcihjb25zdCB2b2lkICpjb25zdCAqQlApCisgICAgOiBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbChCUCkge30KKworICAvLyBNb3N0IG1ldGhvZHMgcHJvdmlkZWQgYnkgYmFzZWNsYXNzLgorCisgIGNvbnN0IFB0clR5IG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyVHJhaXRzOjpnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3RfY2FzdDx2b2lkKj4oKkJ1Y2tldCkpOworICB9CisKKyAgaW5saW5lIFNtYWxsUHRyU2V0SXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAgICAgICAgIC8vIFByZWluY3JlbWVudAorICAgICsrQnVja2V0OworICAgIEFkdmFuY2VJZk5vdFZhbGlkKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxQdHJTZXRJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgIFNtYWxsUHRyU2V0SXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KK307CisKKy8vLyBSb3VuZFVwVG9Qb3dlck9mVHdvIC0gVGhpcyBpcyBhIGhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJvdW5kcyBOIHVwIHRvIHRoZSBuZXh0CisvLy8gcG93ZXIgb2YgdHdvICh3aGljaCBtZWFucyBOIGl0c2VsZiBpZiBOIGlzIGFscmVhZHkgYSBwb3dlciBvZiB0d28pLgordGVtcGxhdGU8dW5zaWduZWQgTj4KK3N0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvOworCisvLy8gUm91bmRVcFRvUG93ZXJPZlR3b0ggLSBJZiBOIGlzIG5vdCBhIHBvd2VyIG9mIHR3bywgaW5jcmVhc2UgaXQuICBUaGlzIGlzIGEKKy8vLyBoZWxwZXIgdGVtcGxhdGUgdXNlZCB0byBpbXBsZW1lbnQgUm91bmRVcFRvUG93ZXJPZlR3by4KK3RlbXBsYXRlPHVuc2lnbmVkIE4sIGJvb2wgaXNQb3dlclR3bz4KK3N0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvSCB7CisgIGVudW0geyBWYWwgPSBOIH07Cit9OwordGVtcGxhdGU8dW5zaWduZWQgTj4KK3N0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvSDxOLCBmYWxzZT4geworICBlbnVtIHsKKyAgICAvLyBXZSBjb3VsZCBqdXN0IHVzZSBOZXh0VmFsID0gTisxLCBidXQgdGhpcyBjb252ZXJnZXMgZmFzdGVyLiAgTnwoTi0xKSBzZXRzCisgICAgLy8gdGhlIHJpZ2h0LW1vc3QgemVybyBiaXRzIHRvIG9uZSBhbGwgYXQgb25jZSwgZS5nLiAwYjAwMTEwMDAgLT4gMGIwMDExMTExLgorICAgIFZhbCA9IFJvdW5kVXBUb1Bvd2VyT2ZUd288KE58KE4tMSkpICsgMT46OlZhbAorICB9OworfTsKKwordGVtcGxhdGU8dW5zaWduZWQgTj4KK3N0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvIHsKKyAgZW51bSB7IFZhbCA9IFJvdW5kVXBUb1Bvd2VyT2ZUd29IPE4sIChOJihOLTEpKSA9PSAwPjo6VmFsIH07Cit9OworICAKKworLy8vIFNtYWxsUHRyU2V0IC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc2V0IHdoaWNoIGlzIG9wdGltaXplZCBmb3IgaG9sZGluZworLy8vIFNtYWxsU2l6ZSBvciBsZXNzIGVsZW1lbnRzLiAgVGhpcyBpbnRlcm5hbGx5IHJvdW5kcyB1cCBTbWFsbFNpemUgdG8gdGhlIG5leHQKKy8vLyBwb3dlciBvZiB0d28gaWYgaXQgaXMgbm90IGFscmVhZHkgYSBwb3dlciBvZiB0d28uICBTZWUgdGhlIGNvbW1lbnRzIGFib3ZlCisvLy8gU21hbGxQdHJTZXRJbXBsIGZvciBkZXRhaWxzIG9mIHRoZSBhbGdvcml0aG0uCit0ZW1wbGF0ZTxjbGFzcyBQdHJUeXBlLCB1bnNpZ25lZCBTbWFsbFNpemU+CitjbGFzcyBTbWFsbFB0clNldCA6IHB1YmxpYyBTbWFsbFB0clNldEltcGwgeworICAvLyBNYWtlIHN1cmUgdGhhdCBTbWFsbFNpemUgaXMgYSBwb3dlciBvZiB0d28sIHJvdW5kIHVwIGlmIG5vdC4KKyAgZW51bSB7IFNtYWxsU2l6ZVBvd1R3byA9IFJvdW5kVXBUb1Bvd2VyT2ZUd288U21hbGxTaXplPjo6VmFsIH07CisgIC8vLyBTbWFsbFN0b3JhZ2UgLSBGaXhlZCBzaXplIHN0b3JhZ2UgdXNlZCBpbiAnc21hbGwgbW9kZScuICBUaGUgZXh0cmEgZWxlbWVudAorICAvLy8gZW5zdXJlcyB0aGF0IHRoZSBlbmQgaXRlcmF0b3IgYWN0dWFsbHkgcG9pbnRzIHRvIHZhbGlkIG1lbW9yeS4KKyAgY29uc3Qgdm9pZCAqU21hbGxTdG9yYWdlW1NtYWxsU2l6ZVBvd1R3bysxXTsKKyAgdHlwZWRlZiBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UHRyVHlwZT4gUHRyVHJhaXRzOworcHVibGljOgorICBTbWFsbFB0clNldCgpIDogU21hbGxQdHJTZXRJbXBsKFNtYWxsU3RvcmFnZSwgU21hbGxTaXplUG93VHdvKSB7fQorICBTbWFsbFB0clNldChjb25zdCBTbWFsbFB0clNldCAmdGhhdCkgOiBTbWFsbFB0clNldEltcGwoU21hbGxTdG9yYWdlLCB0aGF0KSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICBTbWFsbFB0clNldChJdCBJLCBJdCBFKSA6IFNtYWxsUHRyU2V0SW1wbChTbWFsbFN0b3JhZ2UsIFNtYWxsU2l6ZVBvd1R3bykgeworICAgIGluc2VydChJLCBFKTsKKyAgfQorCisgIC8vLyBpbnNlcnQgLSBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgcG9pbnRlciB3YXMgbmV3IHRvIHRoZSBzZXQsIGZhbHNlIGlmIGl0CisgIC8vLyB3YXMgYWxyZWFkeSBpbiB0aGUgc2V0LgorICBib29sIGluc2VydChQdHJUeXBlIFB0cikgeworICAgIHJldHVybiBpbnNlcnRfaW1wKFB0clRyYWl0czo6Z2V0QXNWb2lkUG9pbnRlcihQdHIpKTsKKyAgfQorCisgIC8vLyBlcmFzZSAtIElmIHRoZSBzZXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwb2ludGVyLCByZW1vdmUgaXQgYW5kIHJldHVybgorICAvLy8gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCBlcmFzZShQdHJUeXBlIFB0cikgeworICAgIHJldHVybiBlcmFzZV9pbXAoUHRyVHJhaXRzOjpnZXRBc1ZvaWRQb2ludGVyKFB0cikpOworICB9CisKKyAgLy8vIGNvdW50IC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIGlzIGluIHRoZSBzZXQuCisgIGJvb2wgY291bnQoUHRyVHlwZSBQdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gY291bnRfaW1wKFB0clRyYWl0czo6Z2V0QXNWb2lkUG9pbnRlcihQdHIpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyVD4KKyAgdm9pZCBpbnNlcnQoSXRlclQgSSwgSXRlclQgRSkgeworICAgIGZvciAoOyBJICE9IEU7ICsrSSkKKyAgICAgIGluc2VydCgqSSk7CisgIH0KKworICB0eXBlZGVmIFNtYWxsUHRyU2V0SXRlcmF0b3I8UHRyVHlwZT4gaXRlcmF0b3I7CisgIHR5cGVkZWYgU21hbGxQdHJTZXRJdGVyYXRvcjxQdHJUeXBlPiBjb25zdF9pdGVyYXRvcjsKKyAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBpdGVyYXRvcihDdXJBcnJheSk7CisgIH0KKyAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXRlcmF0b3IoQ3VyQXJyYXkrQ3VyQXJyYXlTaXplKTsKKyAgfQorCisgIC8vIEFsbG93IGFzc2lnbm1lbnQgZnJvbSBhbnkgc21hbGxwdHJzZXQgd2l0aCB0aGUgc2FtZSBlbGVtZW50IHR5cGUgZXZlbiBpZiBpdAorICAvLyBkb2Vzbid0IGhhdmUgdGhlIHNhbWUgc21hbGxzaXplLgorICBjb25zdCBTbWFsbFB0clNldDxQdHJUeXBlLCBTbWFsbFNpemU+JgorICBvcGVyYXRvcj0oY29uc3QgU21hbGxQdHJTZXQ8UHRyVHlwZSwgU21hbGxTaXplPiAmUkhTKSB7CisgICAgQ29weUZyb20oUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxTZXQuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDNmMWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFNldC5oCkBAIC0wLDAgKzEsMTE4IEBACisvLz09PS0gbGx2bS9BRFQvU21hbGxTZXQuaCAtICdOb3JtYWxseSBzbWFsbCcgc2V0cyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTbWFsbFNldCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NNQUxMU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfU01BTExTRVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gU21hbGxTZXQgLSBUaGlzIG1haW50YWlucyBhIHNldCBvZiB1bmlxdWUgdmFsdWVzLCBvcHRpbWl6aW5nIGZvciB0aGUgY2FzZQorLy8vIHdoZW4gdGhlIHNldCBpcyBzbWFsbCAobGVzcyB0aGFuIE4pLiAgSW4gdGhpcyBjYXNlLCB0aGUgc2V0IGNhbiBiZQorLy8vIG1haW50YWluZWQgd2l0aCBubyBtYWxsb2NzLiAgSWYgdGhlIHNldCBnZXRzIGxhcmdlLCB3ZSBleHBhbmQgdG8gdXNpbmcgYW4KKy8vLyBzdGQ6OnNldCB0byBtYWludGFpbiByZWFzb25hYmxlIGxvb2t1cCB0aW1lcy4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIHNldCBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIGl0ZXJhdGUgb3ZlciBtZW1iZXJzIGluIHRoZQorLy8vIHNldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB1bnNpZ25lZCBOPgorY2xhc3MgU21hbGxTZXQgeworICAvLy8gVXNlIGEgU21hbGxWZWN0b3IgdG8gaG9sZCB0aGUgZWxlbWVudHMgaGVyZSAoZXZlbiB0aG91Z2ggaXQgd2lsbCBuZXZlcgorICAvLy8gcmVhY2ggaXRzICdsYXJnZScgc3RhZ2UpIHRvIGF2b2lkIGNhbGxpbmcgdGhlIGRlZmF1bHQgY3RvcnMgb2YgZWxlbWVudHMKKyAgLy8vIHdlIHdpbGwgbmV2ZXIgdXNlLgorICBTbWFsbFZlY3RvcjxULCBOPiBWZWN0b3I7CisgIHN0ZDo6c2V0PFQ+IFNldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTbWFsbFZlY3RvcjxULCBOPjo6Y29uc3RfaXRlcmF0b3IgVkl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIFNtYWxsVmVjdG9yPFQsIE4+OjppdGVyYXRvciBtdXRhYmxlX2l0ZXJhdG9yOworcHVibGljOgorICBTbWFsbFNldCgpIHt9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5lbXB0eSgpICYmIFNldC5lbXB0eSgpOyB9CisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU21hbGwoKSA/IFZlY3Rvci5zaXplKCkgOiBTZXQuc2l6ZSgpOworICB9CisKKyAgLy8vIGNvdW50IC0gUmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIHNldC4KKyAgYm9vbCBjb3VudChjb25zdCBUICZWKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgLy8gU2luY2UgdGhlIGNvbGxlY3Rpb24gaXMgc21hbGwsIGp1c3QgZG8gYSBsaW5lYXIgc2VhcmNoLgorICAgICAgcmV0dXJuIHZmaW5kKFYpICE9IFZlY3Rvci5lbmQoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFNldC5jb3VudChWKTsKKyAgICB9CisgIH0KKworICAvLy8gaW5zZXJ0IC0gSW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgc2V0IGlmIGl0IGlzbid0IGFscmVhZHkgdGhlcmUuCisgIGJvb2wgaW5zZXJ0KGNvbnN0IFQgJlYpIHsKKyAgICBpZiAoIWlzU21hbGwoKSkKKyAgICAgIHJldHVybiBTZXQuaW5zZXJ0KFYpLnNlY29uZDsKKworICAgIFZJdGVyYXRvciBJID0gdmZpbmQoVik7CisgICAgaWYgKEkgIT0gVmVjdG9yLmVuZCgpKSAgICAvLyBEb24ndCByZWluc2VydCBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoVmVjdG9yLnNpemUoKSA8IE4pIHsKKyAgICAgIFZlY3Rvci5wdXNoX2JhY2soVik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGdyb3cgZnJvbSB2ZWN0b3IgdG8gc2V0LgorICAgIHdoaWxlICghVmVjdG9yLmVtcHR5KCkpIHsKKyAgICAgIFNldC5pbnNlcnQoVmVjdG9yLmJhY2soKSk7CisgICAgICBWZWN0b3IucG9wX2JhY2soKTsKKyAgICB9CisgICAgU2V0Lmluc2VydChWKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyVD4KKyAgdm9pZCBpbnNlcnQoSXRlclQgSSwgSXRlclQgRSkgeworICAgIGZvciAoOyBJICE9IEU7ICsrSSkKKyAgICAgIGluc2VydCgqSSk7CisgIH0KKyAgCisgIGJvb2wgZXJhc2UoY29uc3QgVCAmVikgeworICAgIGlmICghaXNTbWFsbCgpKQorICAgICAgcmV0dXJuIFNldC5lcmFzZShWKTsKKyAgICBmb3IgKG11dGFibGVfaXRlcmF0b3IgSSA9IFZlY3Rvci5iZWdpbigpLCBFID0gVmVjdG9yLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmICgqSSA9PSBWKSB7CisgICAgICAgIFZlY3Rvci5lcmFzZShJKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBWZWN0b3IuY2xlYXIoKTsKKyAgICBTZXQuY2xlYXIoKTsKKyAgfQorcHJpdmF0ZToKKyAgYm9vbCBpc1NtYWxsKCkgY29uc3QgeyByZXR1cm4gU2V0LmVtcHR5KCk7IH0KKworICBWSXRlcmF0b3IgdmZpbmQoY29uc3QgVCAmVikgY29uc3QgeworICAgIGZvciAoVkl0ZXJhdG9yIEkgPSBWZWN0b3IuYmVnaW4oKSwgRSA9IFZlY3Rvci5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoKkkgPT0gVikKKyAgICAgICAgcmV0dXJuIEk7CisgICAgcmV0dXJuIFZlY3Rvci5lbmQoKTsKKyAgfQorfTsKKworLy8vIElmIHRoaXMgc2V0IGlzIG9mIHBvaW50ZXIgdmFsdWVzLCB0cmFuc3BhcmVudGx5IHN3aXRjaCBvdmVyIHRvIHVzaW5nCisvLy8gU21hbGxQdHJTZXQgZm9yIHBlcmZvcm1hbmNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZWVUeXBlLCB1bnNpZ25lZCBOPgorY2xhc3MgU21hbGxTZXQ8UG9pbnRlZVR5cGUqLCBOPiA6IHB1YmxpYyBTbWFsbFB0clNldDxQb2ludGVlVHlwZSosIE4+IHt9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxTdHJpbmcuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxTdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWJkOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFN0cmluZy5oCkBAIC0wLDAgKzEsNjggQEAKKy8vPT09LSBsbHZtL0FEVC9TbWFsbFN0cmluZy5oIC0gJ05vcm1hbGx5IHNtYWxsJyBzdHJpbmdzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNtYWxsU3RyaW5nIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU01BTExTVFJJTkdfSAorI2RlZmluZSBMTFZNX0FEVF9TTUFMTFNUUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTbWFsbFN0cmluZyAtIEEgU21hbGxTdHJpbmcgaXMganVzdCBhIFNtYWxsVmVjdG9yIHdpdGggbWV0aG9kcyBhbmQgYWNjZXNzb3JzCisvLy8gdGhhdCBtYWtlIGl0IHdvcmsgYmV0dGVyIGFzIGEgc3RyaW5nIChlLmcuIG9wZXJhdG9yKyBldGMpLgordGVtcGxhdGU8dW5zaWduZWQgSW50ZXJuYWxMZW4+CitjbGFzcyBTbWFsbFN0cmluZyA6IHB1YmxpYyBTbWFsbFZlY3RvcjxjaGFyLCBJbnRlcm5hbExlbj4geworcHVibGljOgorICAvLyBEZWZhdWx0IGN0b3IgLSBJbml0aWFsaXplIHRvIGVtcHR5LgorICBTbWFsbFN0cmluZygpIHt9CisKKyAgLy8gSW5pdGlhbGl6ZSB3aXRoIGEgcmFuZ2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0VHk+CisgIFNtYWxsU3RyaW5nKEl0VHkgUywgSXRUeSBFKSA6IFNtYWxsVmVjdG9yPGNoYXIsIEludGVybmFsTGVuPihTLCBFKSB7fQorCisgIC8vIENvcHkgY3Rvci4KKyAgU21hbGxTdHJpbmcoY29uc3QgU21hbGxTdHJpbmcgJlJIUykgOiBTbWFsbFZlY3RvcjxjaGFyLCBJbnRlcm5hbExlbj4oUkhTKSB7fQorCisKKyAgLy8gRXh0cmEgbWV0aG9kcy4KKyAgU3RyaW5nUmVmIHN0cigpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1JlZih0aGlzLT5iZWdpbigpLCB0aGlzLT5zaXplKCkpOyB9CisKKyAgLy8gSW1wbGljaXQgY29udmVyc2lvbiB0byBTdHJpbmdSZWYuCisgIG9wZXJhdG9yIFN0cmluZ1JlZigpIGNvbnN0IHsgcmV0dXJuIHN0cigpOyB9CisKKyAgY29uc3QgY2hhciAqY19zdHIoKSB7CisgICAgdGhpcy0+cHVzaF9iYWNrKDApOworICAgIHRoaXMtPnBvcF9iYWNrKCk7CisgICAgcmV0dXJuIHRoaXMtPmRhdGEoKTsKKyAgfQorCisgIC8vIEV4dHJhIG9wZXJhdG9ycy4KKyAgY29uc3QgU21hbGxTdHJpbmcgJm9wZXJhdG9yPShTdHJpbmdSZWYgUkhTKSB7CisgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICByZXR1cm4gKnRoaXMgKz0gUkhTOworICB9CisKKyAgU21hbGxTdHJpbmcgJm9wZXJhdG9yKz0oU3RyaW5nUmVmIFJIUykgeworICAgIHRoaXMtPmFwcGVuZChSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgU21hbGxTdHJpbmcgJm9wZXJhdG9yKz0oY2hhciBDKSB7CisgICAgdGhpcy0+cHVzaF9iYWNrKEMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTYxZDIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oCkBAIC0wLDAgKzEsNzI4IEBACisvLz09PS0gbGx2bS9BRFQvU21hbGxWZWN0b3IuaCAtICdOb3JtYWxseSBzbWFsbCcgdmVjdG9ycyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTbWFsbFZlY3RvciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NNQUxMVkVDVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfU01BTExWRUNUT1JfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWZkZWYgX01TQ19WRVIKK25hbWVzcGFjZSBzdGQgeworI2lmIF9NU0NfVkVSIDw9IDEzMTAKKyAgLy8gV29yayBhcm91bmQgZmxhd2VkIFZDKysgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjp1bmluaXRpYWxpemVkX2NvcHkuICBEZWZpbmUKKyAgLy8gYWRkaXRpb25hbCBvdmVybG9hZHMgc28gdGhhdCBlbGVtZW50cyB3aXRoIHBvaW50ZXIgdHlwZXMgYXJlIHJlY29nbml6ZWQgYXMKKyAgLy8gc2NhbGFycyBhbmQgbm90IG9iamVjdHMsIGNhdXNpbmcgYml6YXJyZSB0eXBlIGNvbnZlcnNpb24gZXJyb3JzLgorICB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CisgIGlubGluZSBfU2NhbGFyX3B0cl9pdGVyYXRvcl90YWcgX1B0cl9jYXQoVDEgKiosIFQyICoqKSB7CisgICAgX1NjYWxhcl9wdHJfaXRlcmF0b3JfdGFnIF9DYXQ7CisgICAgcmV0dXJuIF9DYXQ7CisgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CisgIGlubGluZSBfU2NhbGFyX3B0cl9pdGVyYXRvcl90YWcgX1B0cl9jYXQoVDEqIGNvbnN0ICosIFQyICoqKSB7CisgICAgX1NjYWxhcl9wdHJfaXRlcmF0b3JfdGFnIF9DYXQ7CisgICAgcmV0dXJuIF9DYXQ7CisgIH0KKyNlbHNlCisvLyBGSVhNRTogSXQgaXMgbm90IGNsZWFyIGlmIHRoZSBwcm9ibGVtIGlzIGZpeGVkIGluIFZTIDIwMDUuICBXaGF0IGlzIGNsZWFyCisvLyBpcyB0aGF0IHRoZSBhYm92ZSBoYWNrIHdvbid0IHdvcmsgaWYgaXQgd2Fzbid0IGZpeGVkLgorI2VuZGlmCit9CisjZW5kaWYKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gU21hbGxWZWN0b3JCYXNlIC0gVGhpcyBpcyBhbGwgdGhlIG5vbi10ZW1wbGF0ZWQgc3R1ZmYgY29tbW9uIHRvIGFsbAorLy8vIFNtYWxsVmVjdG9ycy4KK2NsYXNzIFNtYWxsVmVjdG9yQmFzZSB7Citwcm90ZWN0ZWQ6CisgIHZvaWQgKkJlZ2luWCwgKkVuZFgsICpDYXBhY2l0eVg7CisKKyAgLy8gQWxsb2NhdGUgcmF3IHNwYWNlIGZvciBOIGVsZW1lbnRzIG9mIHR5cGUgVC4gIElmIFQgaGFzIGEgY3RvciBvciBkdG9yLCB3ZQorICAvLyBkb24ndCB3YW50IGl0IHRvIGJlIGF1dG9tYXRpY2FsbHkgcnVuLCBzbyB3ZSBuZWVkIHRvIHJlcHJlc2VudCB0aGUgc3BhY2UgYXMKKyAgLy8gc29tZXRoaW5nIGVsc2UuICBBbiBhcnJheSBvZiBjaGFyIHdvdWxkIHdvcmsgZ3JlYXQsIGJ1dCBtaWdodCBub3QgYmUKKyAgLy8gYWxpZ25lZCBzdWZmaWNpZW50bHkuICBJbnN0ZWFkLCB3ZSBlaXRoZXIgdXNlIEdDQyBleHRlbnNpb25zLCBvciBzb21lCisgIC8vIG51bWJlciBvZiB1bmlvbiBpbnN0YW5jZXMgZm9yIHRoZSBzcGFjZSwgd2hpY2ggZ3VhcmFudGVlIG1heGltYWwgYWxpZ25tZW50LgorICBzdHJ1Y3QgVSB7CisjaWZkZWYgX19HTlVDX18KKyAgICBjaGFyIFggX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICBkb3VibGUgRDsKKyAgICAgIGxvbmcgZG91YmxlIExEOworICAgICAgbG9uZyBsb25nIEw7CisgICAgICB2b2lkICpQOworICAgIH0gWDsKKyNlbmRpZgorICB9IEZpcnN0RWw7CisgIC8vIFNwYWNlIGFmdGVyICdGaXJzdEVsJyBpcyBjbG9iYmVyZWQsIGRvIG5vdCBhZGQgYW55IGluc3RhbmNlIHZhcnMgYWZ0ZXIgaXQuCisKK3Byb3RlY3RlZDoKKyAgU21hbGxWZWN0b3JCYXNlKHNpemVfdCBTaXplKQorICAgIDogQmVnaW5YKCZGaXJzdEVsKSwgRW5kWCgmRmlyc3RFbCksIENhcGFjaXR5WCgoY2hhciopJkZpcnN0RWwrU2l6ZSkge30KKworICAvLy8gaXNTbWFsbCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBzbWFsbHZlY3RvciB3aGljaCBoYXMgbm90IGhhZCBkeW5hbWljCisgIC8vLyBtZW1vcnkgYWxsb2NhdGVkIGZvciBpdC4KKyAgYm9vbCBpc1NtYWxsKCkgY29uc3QgeworICAgIHJldHVybiBCZWdpblggPT0gc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KCZGaXJzdEVsKTsKKyAgfQorCisgIC8vLyBzaXplX2luX2J5dGVzIC0gVGhpcyByZXR1cm5zIHNpemUoKSpzaXplb2YoVCkuCisgIHNpemVfdCBzaXplX2luX2J5dGVzKCkgY29uc3QgeworICAgIHJldHVybiBzaXplX3QoKGNoYXIqKUVuZFggLSAoY2hhciopQmVnaW5YKTsKKyAgfQorCisgIC8vLyBjYXBhY2l0eV9pbl9ieXRlcyAtIFRoaXMgcmV0dXJucyBjYXBhY2l0eSgpKnNpemVvZihUKS4KKyAgc2l6ZV90IGNhcGFjaXR5X2luX2J5dGVzKCkgY29uc3QgeworICAgIHJldHVybiBzaXplX3QoKGNoYXIqKUNhcGFjaXR5WCAtIChjaGFyKilCZWdpblgpOworICB9CisKKyAgLy8vIGdyb3dfcG9kIC0gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ3JvdygpIG1ldGhvZCB3aGljaCBvbmx5IHdvcmtzCisgIC8vLyBvbiBQT0QtbGlrZSBkYXRhdHlwZXMgYW5kIGlzIG91dCBvZiBsaW5lIHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uLgorICB2b2lkIGdyb3dfcG9kKHNpemVfdCBNaW5TaXplSW5CeXRlcywgc2l6ZV90IFRTaXplKTsKKworcHVibGljOgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQmVnaW5YID09IEVuZFg7IH0KK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uIDogcHVibGljIFNtYWxsVmVjdG9yQmFzZSB7Citwcm90ZWN0ZWQ6CisgIHZvaWQgc2V0RW5kKFQgKlApIHsgdGhpcy0+RW5kWCA9IFA7IH0KK3B1YmxpYzoKKyAgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbihzaXplX3QgU2l6ZSkgOiBTbWFsbFZlY3RvckJhc2UoU2l6ZSkge30KKworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgVCAqaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgVCAqY29uc3RfaXRlcmF0b3I7CisKKyAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOworCisgIHR5cGVkZWYgVCAmcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IFQgJmNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBUICpwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IFQgKmNvbnN0X3BvaW50ZXI7CisKKyAgLy8gZm9yd2FyZCBpdGVyYXRvciBjcmVhdGlvbiBtZXRob2RzLgorICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIChpdGVyYXRvcil0aGlzLT5CZWdpblg7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+QmVnaW5YOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIChpdGVyYXRvcil0aGlzLT5FbmRYOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIChjb25zdF9pdGVyYXRvcil0aGlzLT5FbmRYOyB9Citwcm90ZWN0ZWQ6CisgIGl0ZXJhdG9yIGNhcGFjaXR5X3B0cigpIHsgcmV0dXJuIChpdGVyYXRvcil0aGlzLT5DYXBhY2l0eVg7IH0KKyAgY29uc3RfaXRlcmF0b3IgY2FwYWNpdHlfcHRyKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkNhcGFjaXR5WDt9CitwdWJsaWM6CisKKyAgLy8gcmV2ZXJzZSBpdGVyYXRvciBjcmVhdGlvbiBtZXRob2RzLgorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kKCktYmVnaW4oKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoLTEpIC8gc2l6ZW9mKFQpOyB9CisKKyAgLy8vIGNhcGFjaXR5IC0gUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnRseSBhbGxvY2F0ZWQKKyAgLy8vIGJ1ZmZlci4KKyAgc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gY2FwYWNpdHlfcHRyKCkgLSBiZWdpbigpOyB9CisKKyAgLy8vIGRhdGEgLSBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB2ZWN0b3IncyBidWZmZXIsIGV2ZW4gaWYgZW1wdHkoKS4KKyAgcG9pbnRlciBkYXRhKCkgeyByZXR1cm4gcG9pbnRlcihiZWdpbigpKTsgfQorICAvLy8gZGF0YSAtIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHZlY3RvcidzIGJ1ZmZlciwgZXZlbiBpZiBlbXB0eSgpLgorICBjb25zdF9wb2ludGVyIGRhdGEoKSBjb25zdCB7IHJldHVybiBjb25zdF9wb2ludGVyKGJlZ2luKCkpOyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10odW5zaWduZWQgaWR4KSB7CisgICAgYXNzZXJ0KGJlZ2luKCkgKyBpZHggPCBlbmQoKSk7CisgICAgcmV0dXJuIGJlZ2luKClbaWR4XTsKKyAgfQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXSh1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoYmVnaW4oKSArIGlkeCA8IGVuZCgpKTsKKyAgICByZXR1cm4gYmVnaW4oKVtpZHhdOworICB9CisKKyAgcmVmZXJlbmNlIGZyb250KCkgeworICAgIHJldHVybiBiZWdpbigpWzBdOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYmVnaW4oKVswXTsKKyAgfQorCisgIHJlZmVyZW5jZSBiYWNrKCkgeworICAgIHJldHVybiBlbmQoKVstMV07CisgIH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIGVuZCgpWy0xXTsKKyAgfQorfTsKKworLy8vIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPGlzUG9kTGlrZSA9IGZhbHNlPiAtIFRoaXMgaXMgd2hlcmUgd2UgcHV0IG1ldGhvZAorLy8vIGltcGxlbWVudGF0aW9ucyB0aGF0IGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGggbm9uLVBPRC1saWtlIFQncy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzUG9kTGlrZT4KK2NsYXNzIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlIDogcHVibGljIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4geworcHVibGljOgorICBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZShzaXplX3QgU2l6ZSkgOiBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPFQ+KFNpemUpIHt9CisKKyAgc3RhdGljIHZvaWQgZGVzdHJveV9yYW5nZShUICpTLCBUICpFKSB7CisgICAgd2hpbGUgKFMgIT0gRSkgeworICAgICAgLS1FOworICAgICAgRS0+flQoKTsKKyAgICB9CisgIH0KKworICAvLy8gdW5pbml0aWFsaXplZF9jb3B5IC0gQ29weSB0aGUgcmFuZ2UgW0ksIEUpIG9udG8gdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5CisgIC8vLyBzdGFydGluZyB3aXRoICJEZXN0IiwgY29uc3RydWN0aW5nIGVsZW1lbnRzIGludG8gaXQgYXMgbmVlZGVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdDEsIHR5cGVuYW1lIEl0Mj4KKyAgc3RhdGljIHZvaWQgdW5pbml0aWFsaXplZF9jb3B5KEl0MSBJLCBJdDEgRSwgSXQyIERlc3QpIHsKKyAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShJLCBFLCBEZXN0KTsKKyAgfQorCisgIC8vLyBncm93IC0gZG91YmxlIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCBndWFyYW50ZWVpbmcgc3BhY2UgZm9yIGF0CisgIC8vLyBsZWFzdCBvbmUgbW9yZSBlbGVtZW50IG9yIE1pblNpemUgaWYgc3BlY2lmaWVkLgorICB2b2lkIGdyb3coc2l6ZV90IE1pblNpemUgPSAwKTsKK307CisKKy8vIERlZmluZSB0aGlzIG91dC1vZi1saW5lIHRvIGRpc3N1YWRlIHRoZSBDKysgY29tcGlsZXIgZnJvbSBpbmxpbmluZyBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzUG9kTGlrZT4KK3ZvaWQgU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8VCwgaXNQb2RMaWtlPjo6Z3JvdyhzaXplX3QgTWluU2l6ZSkgeworICBzaXplX3QgQ3VyQ2FwYWNpdHkgPSB0aGlzLT5jYXBhY2l0eSgpOworICBzaXplX3QgQ3VyU2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgc2l6ZV90IE5ld0NhcGFjaXR5ID0gMipDdXJDYXBhY2l0eTsKKyAgaWYgKE5ld0NhcGFjaXR5IDwgTWluU2l6ZSkKKyAgICBOZXdDYXBhY2l0eSA9IE1pblNpemU7CisgIFQgKk5ld0VsdHMgPSBzdGF0aWNfY2FzdDxUKj4obWFsbG9jKE5ld0NhcGFjaXR5KnNpemVvZihUKSkpOworCisgIC8vIENvcHkgdGhlIGVsZW1lbnRzIG92ZXIuCisgIHRoaXMtPnVuaW5pdGlhbGl6ZWRfY29weSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSwgTmV3RWx0cyk7CisKKyAgLy8gRGVzdHJveSB0aGUgb3JpZ2luYWwgZWxlbWVudHMuCisgIGRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCkpOworCisgIC8vIElmIHRoaXMgd2Fzbid0IGdyb3duIGZyb20gdGhlIGlubGluZSBjb3B5LCBkZWFsbG9jYXRlIHRoZSBvbGQgc3BhY2UuCisgIGlmICghdGhpcy0+aXNTbWFsbCgpKQorICAgIGZyZWUodGhpcy0+YmVnaW4oKSk7CisKKyAgdGhpcy0+c2V0RW5kKE5ld0VsdHMrQ3VyU2l6ZSk7CisgIHRoaXMtPkJlZ2luWCA9IE5ld0VsdHM7CisgIHRoaXMtPkNhcGFjaXR5WCA9IHRoaXMtPmJlZ2luKCkrTmV3Q2FwYWNpdHk7Cit9CisKKworLy8vIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPGlzUG9kTGlrZSA9IHRydWU+IC0gVGhpcyBpcyB3aGVyZSB3ZSBwdXQgbWV0aG9kCisvLy8gaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBQT0QtbGlrZSBUJ3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPFQsIHRydWU+IDogcHVibGljIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4geworcHVibGljOgorICBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZShzaXplX3QgU2l6ZSkgOiBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPFQ+KFNpemUpIHt9CisKKyAgLy8gTm8gbmVlZCB0byBkbyBhIGRlc3Ryb3kgbG9vcCBmb3IgUE9EJ3MuCisgIHN0YXRpYyB2b2lkIGRlc3Ryb3lfcmFuZ2UoVCAqLCBUICopIHt9CisKKyAgLy8vIHVuaW5pdGlhbGl6ZWRfY29weSAtIENvcHkgdGhlIHJhbmdlIFtJLCBFKSBvbnRvIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeQorICAvLy8gc3RhcnRpbmcgd2l0aCAiRGVzdCIsIGNvbnN0cnVjdGluZyBlbGVtZW50cyBpbnRvIGl0IGFzIG5lZWRlZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXQxLCB0eXBlbmFtZSBJdDI+CisgIHN0YXRpYyB2b2lkIHVuaW5pdGlhbGl6ZWRfY29weShJdDEgSSwgSXQxIEUsIEl0MiBEZXN0KSB7CisgICAgLy8gQXJiaXRyYXJ5IGl0ZXJhdG9yIHR5cGVzOyBqdXN0IHVzZSB0aGUgYmFzaWMgaW1wbGVtZW50YXRpb24uCisgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoSSwgRSwgRGVzdCk7CisgIH0KKworICAvLy8gdW5pbml0aWFsaXplZF9jb3B5IC0gQ29weSB0aGUgcmFuZ2UgW0ksIEUpIG9udG8gdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5CisgIC8vLyBzdGFydGluZyB3aXRoICJEZXN0IiwgY29uc3RydWN0aW5nIGVsZW1lbnRzIGludG8gaXQgYXMgbmVlZGVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHN0YXRpYyB2b2lkIHVuaW5pdGlhbGl6ZWRfY29weShUMSAqSSwgVDEgKkUsIFQyICpEZXN0KSB7CisgICAgLy8gVXNlIG1lbWNweSBmb3IgUE9EcyBpdGVyYXRlZCBieSBwb2ludGVycyAod2hpY2ggaW5jbHVkZXMgU21hbGxWZWN0b3IKKyAgICAvLyBpdGVyYXRvcnMpOiBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weSBvcHRpbWl6ZXMgdG8gbWVtbW92ZSwgYnV0IHdlIGNhbgorICAgIC8vIHVzZSBtZW1jcHkgaGVyZS4KKyAgICBtZW1jcHkoRGVzdCwgSSwgKEUtSSkqc2l6ZW9mKFQpKTsKKyAgfQorCisgIC8vLyBncm93IC0gZG91YmxlIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCBndWFyYW50ZWVpbmcgc3BhY2UgZm9yIGF0CisgIC8vLyBsZWFzdCBvbmUgbW9yZSBlbGVtZW50IG9yIE1pblNpemUgaWYgc3BlY2lmaWVkLgorICB2b2lkIGdyb3coc2l6ZV90IE1pblNpemUgPSAwKSB7CisgICAgdGhpcy0+Z3Jvd19wb2QoTWluU2l6ZSpzaXplb2YoVCksIHNpemVvZihUKSk7CisgIH0KK307CisKKworLy8vIFNtYWxsVmVjdG9ySW1wbCAtIFRoaXMgY2xhc3MgY29uc2lzdHMgb2YgY29tbW9uIGNvZGUgZmFjdG9yZWQgb3V0IG9mIHRoZQorLy8vIFNtYWxsVmVjdG9yIGNsYXNzIHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uIGJhc2VkIG9uIHRoZSBTbWFsbFZlY3RvciAnTicKKy8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFNtYWxsVmVjdG9ySW1wbCA6IHB1YmxpYyBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZTxULCBpc1BvZExpa2U8VD46OnZhbHVlPiB7CisgIHR5cGVkZWYgU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8VCwgaXNQb2RMaWtlPFQ+Ojp2YWx1ZSA+IFN1cGVyQ2xhc3M7CisgIAorICBTbWFsbFZlY3RvckltcGwoY29uc3QgU21hbGxWZWN0b3JJbXBsJik7IC8vIERJU0FCTEVELgorcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFN1cGVyQ2xhc3M6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIFN1cGVyQ2xhc3M6OnNpemVfdHlwZSBzaXplX3R5cGU7CisKKyAgLy8gRGVmYXVsdCBjdG9yIC0gSW5pdGlhbGl6ZSB0byBlbXB0eS4KKyAgZXhwbGljaXQgU21hbGxWZWN0b3JJbXBsKHVuc2lnbmVkIE4pCisgICAgOiBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZTxULCBpc1BvZExpa2U8VD46OnZhbHVlPihOKnNpemVvZihUKSkgeworICB9CisKKyAgflNtYWxsVmVjdG9ySW1wbCgpIHsKKyAgICAvLyBEZXN0cm95IHRoZSBjb25zdHJ1Y3RlZCBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCkpOworCisgICAgLy8gSWYgdGhpcyB3YXNuJ3QgZ3Jvd24gZnJvbSB0aGUgaW5saW5lIGNvcHksIGRlYWxsb2NhdGUgdGhlIG9sZCBzcGFjZS4KKyAgICBpZiAoIXRoaXMtPmlzU21hbGwoKSkKKyAgICAgIGZyZWUodGhpcy0+YmVnaW4oKSk7CisgIH0KKworCisgIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSk7CisgICAgdGhpcy0+RW5kWCA9IHRoaXMtPkJlZ2luWDsKKyAgfQorCisgIHZvaWQgcmVzaXplKHVuc2lnbmVkIE4pIHsKKyAgICBpZiAoTiA8IHRoaXMtPnNpemUoKSkgeworICAgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpK04sIHRoaXMtPmVuZCgpKTsKKyAgICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK04pOworICAgIH0gZWxzZSBpZiAoTiA+IHRoaXMtPnNpemUoKSkgeworICAgICAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBOKQorICAgICAgICB0aGlzLT5ncm93KE4pOworICAgICAgdGhpcy0+Y29uc3RydWN0X3JhbmdlKHRoaXMtPmVuZCgpLCB0aGlzLT5iZWdpbigpK04sIFQoKSk7CisgICAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStOKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlc2l6ZSh1bnNpZ25lZCBOLCBjb25zdCBUICZOVikgeworICAgIGlmIChOIDwgdGhpcy0+c2l6ZSgpKSB7CisgICAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCkrTiwgdGhpcy0+ZW5kKCkpOworICAgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTik7CisgICAgfSBlbHNlIGlmIChOID4gdGhpcy0+c2l6ZSgpKSB7CisgICAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IE4pCisgICAgICAgIHRoaXMtPmdyb3coTik7CisgICAgICBjb25zdHJ1Y3RfcmFuZ2UodGhpcy0+ZW5kKCksIHRoaXMtPmJlZ2luKCkrTiwgTlYpOworICAgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTik7CisgICAgfQorICB9CisKKyAgdm9pZCByZXNlcnZlKHVuc2lnbmVkIE4pIHsKKyAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IE4pCisgICAgICB0aGlzLT5ncm93KE4pOworICB9CisKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCAmRWx0KSB7CisgICAgaWYgKHRoaXMtPkVuZFggPCB0aGlzLT5DYXBhY2l0eVgpIHsKKyAgICBSZXRyeToKKyAgICAgIG5ldyAodGhpcy0+ZW5kKCkpIFQoRWx0KTsKKyAgICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSsxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdGhpcy0+Z3JvdygpOworICAgIGdvdG8gUmV0cnk7CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKS0xKTsKKyAgICB0aGlzLT5lbmQoKS0+flQoKTsKKyAgfQorCisgIFQgcG9wX2JhY2tfdmFsKCkgeworICAgIFQgUmVzdWx0ID0gdGhpcy0+YmFjaygpOworICAgIHBvcF9iYWNrKCk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisKKyAgdm9pZCBzd2FwKFNtYWxsVmVjdG9ySW1wbCAmUkhTKTsKKworICAvLy8gYXBwZW5kIC0gQWRkIHRoZSBzcGVjaWZpZWQgcmFuZ2UgdG8gdGhlIGVuZCBvZiB0aGUgU21hbGxWZWN0b3IuCisgIC8vLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBpbl9pdGVyPgorICB2b2lkIGFwcGVuZChpbl9pdGVyIGluX3N0YXJ0LCBpbl9pdGVyIGluX2VuZCkgeworICAgIHNpemVfdHlwZSBOdW1JbnB1dHMgPSBzdGQ6OmRpc3RhbmNlKGluX3N0YXJ0LCBpbl9lbmQpOworICAgIC8vIEdyb3cgYWxsb2NhdGVkIHNwYWNlIGlmIG5lZWRlZC4KKyAgICBpZiAoTnVtSW5wdXRzID4gc2l6ZV90eXBlKHRoaXMtPmNhcGFjaXR5X3B0cigpLXRoaXMtPmVuZCgpKSkKKyAgICAgIHRoaXMtPmdyb3codGhpcy0+c2l6ZSgpK051bUlucHV0cyk7CisKKyAgICAvLyBDb3B5IHRoZSBuZXcgZWxlbWVudHMgb3Zlci4KKyAgICAvLyBUT0RPOiBORUVEIFRvIGNvbXBpbGUgdGltZSBkaXNwYXRjaCBvbiB3aGV0aGVyIGluX2l0ZXIgaXMgYSByYW5kb20gYWNjZXNzCisgICAgLy8gaXRlcmF0b3IgdG8gdXNlIHRoZSBmYXN0IHVuaW5pdGlhbGl6ZWRfY29weS4KKyAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShpbl9zdGFydCwgaW5fZW5kLCB0aGlzLT5lbmQoKSk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpICsgTnVtSW5wdXRzKTsKKyAgfQorCisgIC8vLyBhcHBlbmQgLSBBZGQgdGhlIHNwZWNpZmllZCByYW5nZSB0byB0aGUgZW5kIG9mIHRoZSBTbWFsbFZlY3Rvci4KKyAgLy8vCisgIHZvaWQgYXBwZW5kKHNpemVfdHlwZSBOdW1JbnB1dHMsIGNvbnN0IFQgJkVsdCkgeworICAgIC8vIEdyb3cgYWxsb2NhdGVkIHNwYWNlIGlmIG5lZWRlZC4KKyAgICBpZiAoTnVtSW5wdXRzID4gc2l6ZV90eXBlKHRoaXMtPmNhcGFjaXR5X3B0cigpLXRoaXMtPmVuZCgpKSkKKyAgICAgIHRoaXMtPmdyb3codGhpcy0+c2l6ZSgpK051bUlucHV0cyk7CisKKyAgICAvLyBDb3B5IHRoZSBuZXcgZWxlbWVudHMgb3Zlci4KKyAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPmVuZCgpLCBOdW1JbnB1dHMsIEVsdCk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpICsgTnVtSW5wdXRzKTsKKyAgfQorCisgIHZvaWQgYXNzaWduKHVuc2lnbmVkIE51bUVsdHMsIGNvbnN0IFQgJkVsdCkgeworICAgIGNsZWFyKCk7CisgICAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBOdW1FbHRzKQorICAgICAgdGhpcy0+Z3JvdyhOdW1FbHRzKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStOdW1FbHRzKTsKKyAgICBjb25zdHJ1Y3RfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCksIEVsdCk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBJKSB7CisgICAgaXRlcmF0b3IgTiA9IEk7CisgICAgLy8gU2hpZnQgYWxsIGVsdHMgZG93biBvbmUuCisgICAgc3RkOjpjb3B5KEkrMSwgdGhpcy0+ZW5kKCksIEkpOworICAgIC8vIERyb3AgdGhlIGxhc3QgZWx0LgorICAgIHBvcF9iYWNrKCk7CisgICAgcmV0dXJuKE4pOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgUywgaXRlcmF0b3IgRSkgeworICAgIGl0ZXJhdG9yIE4gPSBTOworICAgIC8vIFNoaWZ0IGFsbCBlbHRzIGRvd24uCisgICAgaXRlcmF0b3IgSSA9IHN0ZDo6Y29weShFLCB0aGlzLT5lbmQoKSwgUyk7CisgICAgLy8gRHJvcCB0aGUgbGFzdCBlbHRzLgorICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UoSSwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZChJKTsKKyAgICByZXR1cm4oTik7CisgIH0KKworICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgY29uc3QgVCAmRWx0KSB7CisgICAgaWYgKEkgPT0gdGhpcy0+ZW5kKCkpIHsgIC8vIEltcG9ydGFudCBzcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHZlY3Rvci4KKyAgICAgIHB1c2hfYmFjayhFbHQpOworICAgICAgcmV0dXJuIHRoaXMtPmVuZCgpLTE7CisgICAgfQorCisgICAgaWYgKHRoaXMtPkVuZFggPCB0aGlzLT5DYXBhY2l0eVgpIHsKKyAgICBSZXRyeToKKyAgICAgIG5ldyAodGhpcy0+ZW5kKCkpIFQodGhpcy0+YmFjaygpKTsKKyAgICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSsxKTsKKyAgICAgIC8vIFB1c2ggZXZlcnl0aGluZyBlbHNlIG92ZXIuCisgICAgICBzdGQ6OmNvcHlfYmFja3dhcmQoSSwgdGhpcy0+ZW5kKCktMSwgdGhpcy0+ZW5kKCkpOworICAgICAgKkkgPSBFbHQ7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisgICAgc2l6ZV90IEVsdE5vID0gSS10aGlzLT5iZWdpbigpOworICAgIHRoaXMtPmdyb3coKTsKKyAgICBJID0gdGhpcy0+YmVnaW4oKStFbHRObzsKKyAgICBnb3RvIFJldHJ5OworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIHNpemVfdHlwZSBOdW1Ub0luc2VydCwgY29uc3QgVCAmRWx0KSB7CisgICAgaWYgKEkgPT0gdGhpcy0+ZW5kKCkpIHsgIC8vIEltcG9ydGFudCBzcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHZlY3Rvci4KKyAgICAgIGFwcGVuZChOdW1Ub0luc2VydCwgRWx0KTsKKyAgICAgIHJldHVybiB0aGlzLT5lbmQoKS0xOworICAgIH0KKworICAgIC8vIENvbnZlcnQgaXRlcmF0b3IgdG8gZWx0IyB0byBhdm9pZCBpbnZhbGlkYXRpbmcgaXRlcmF0b3Igd2hlbiB3ZSByZXNlcnZlKCkKKyAgICBzaXplX3QgSW5zZXJ0RWx0ID0gSSAtIHRoaXMtPmJlZ2luKCk7CisKKyAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlLgorICAgIHJlc2VydmUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPnNpemUoKSArIE51bVRvSW5zZXJ0KSk7CisKKyAgICAvLyBVbmludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgorICAgIEkgPSB0aGlzLT5iZWdpbigpK0luc2VydEVsdDsKKworICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGJldHdlZW4gdGhlIGluc2VydGlvbiBwb2ludCBhbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAvLyByYW5nZSB0aGFuIHRoZXJlIGFyZSBiZWluZyBpbnNlcnRlZCwgd2UgY2FuIHVzZSBhIHNpbXBsZSBhcHByb2FjaCB0bworICAgIC8vIGluc2VydGlvbi4gIFNpbmNlIHdlIGFscmVhZHkgcmVzZXJ2ZWQgc3BhY2UsIHdlIGtub3cgdGhhdCB0aGlzIHdvbid0CisgICAgLy8gcmVhbGxvY2F0ZSB0aGUgdmVjdG9yLgorICAgIGlmIChzaXplX3QodGhpcy0+ZW5kKCktSSkgPj0gTnVtVG9JbnNlcnQpIHsKKyAgICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOworICAgICAgYXBwZW5kKHRoaXMtPmVuZCgpLU51bVRvSW5zZXJ0LCB0aGlzLT5lbmQoKSk7CisKKyAgICAgIC8vIENvcHkgdGhlIGV4aXN0aW5nIGVsZW1lbnRzIHRoYXQgZ2V0IHJlcGxhY2VkLgorICAgICAgc3RkOjpjb3B5X2JhY2t3YXJkKEksIE9sZEVuZC1OdW1Ub0luc2VydCwgT2xkRW5kKTsKKworICAgICAgc3RkOjpmaWxsX24oSSwgTnVtVG9JbnNlcnQsIEVsdCk7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGluc2VydGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QgYWxyZWFkeSwgYW5kIHdlJ3JlCisgICAgLy8gbm90IGluc2VydGluZyBhdCB0aGUgZW5kLgorCisgICAgLy8gQ29weSBvdmVyIHRoZSBlbGVtZW50cyB0aGF0IHdlJ3JlIGFib3V0IHRvIG92ZXJ3cml0ZS4KKyAgICBUICpPbGRFbmQgPSB0aGlzLT5lbmQoKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkgKyBOdW1Ub0luc2VydCk7CisgICAgc2l6ZV90IE51bU92ZXJ3cml0dGVuID0gT2xkRW5kLUk7CisgICAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KEksIE9sZEVuZCwgdGhpcy0+ZW5kKCktTnVtT3ZlcndyaXR0ZW4pOworCisgICAgLy8gUmVwbGFjZSB0aGUgb3ZlcndyaXR0ZW4gcGFydC4KKyAgICBzdGQ6OmZpbGxfbihJLCBOdW1PdmVyd3JpdHRlbiwgRWx0KTsKKworICAgIC8vIEluc2VydCB0aGUgbm9uLW92ZXJ3cml0dGVuIG1pZGRsZSBwYXJ0LgorICAgIHN0ZDo6dW5pbml0aWFsaXplZF9maWxsX24oT2xkRW5kLCBOdW1Ub0luc2VydC1OdW1PdmVyd3JpdHRlbiwgRWx0KTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0VHk+CisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBJLCBJdFR5IEZyb20sIEl0VHkgVG8pIHsKKyAgICBpZiAoSSA9PSB0aGlzLT5lbmQoKSkgeyAgLy8gSW1wb3J0YW50IHNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgdmVjdG9yLgorICAgICAgYXBwZW5kKEZyb20sIFRvKTsKKyAgICAgIHJldHVybiB0aGlzLT5lbmQoKS0xOworICAgIH0KKworICAgIHNpemVfdCBOdW1Ub0luc2VydCA9IHN0ZDo6ZGlzdGFuY2UoRnJvbSwgVG8pOworICAgIC8vIENvbnZlcnQgaXRlcmF0b3IgdG8gZWx0IyB0byBhdm9pZCBpbnZhbGlkYXRpbmcgaXRlcmF0b3Igd2hlbiB3ZSByZXNlcnZlKCkKKyAgICBzaXplX3QgSW5zZXJ0RWx0ID0gSSAtIHRoaXMtPmJlZ2luKCk7CisKKyAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlLgorICAgIHJlc2VydmUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPnNpemUoKSArIE51bVRvSW5zZXJ0KSk7CisKKyAgICAvLyBVbmludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgorICAgIEkgPSB0aGlzLT5iZWdpbigpK0luc2VydEVsdDsKKworICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGJldHdlZW4gdGhlIGluc2VydGlvbiBwb2ludCBhbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAvLyByYW5nZSB0aGFuIHRoZXJlIGFyZSBiZWluZyBpbnNlcnRlZCwgd2UgY2FuIHVzZSBhIHNpbXBsZSBhcHByb2FjaCB0bworICAgIC8vIGluc2VydGlvbi4gIFNpbmNlIHdlIGFscmVhZHkgcmVzZXJ2ZWQgc3BhY2UsIHdlIGtub3cgdGhhdCB0aGlzIHdvbid0CisgICAgLy8gcmVhbGxvY2F0ZSB0aGUgdmVjdG9yLgorICAgIGlmIChzaXplX3QodGhpcy0+ZW5kKCktSSkgPj0gTnVtVG9JbnNlcnQpIHsKKyAgICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOworICAgICAgYXBwZW5kKHRoaXMtPmVuZCgpLU51bVRvSW5zZXJ0LCB0aGlzLT5lbmQoKSk7CisKKyAgICAgIC8vIENvcHkgdGhlIGV4aXN0aW5nIGVsZW1lbnRzIHRoYXQgZ2V0IHJlcGxhY2VkLgorICAgICAgc3RkOjpjb3B5X2JhY2t3YXJkKEksIE9sZEVuZC1OdW1Ub0luc2VydCwgT2xkRW5kKTsKKworICAgICAgc3RkOjpjb3B5KEZyb20sIFRvLCBJKTsKKyAgICAgIHJldHVybiBJOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgd2UncmUgaW5zZXJ0aW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCBhbHJlYWR5LCBhbmQgd2UncmUKKyAgICAvLyBub3QgaW5zZXJ0aW5nIGF0IHRoZSBlbmQuCisKKyAgICAvLyBDb3B5IG92ZXIgdGhlIGVsZW1lbnRzIHRoYXQgd2UncmUgYWJvdXQgdG8gb3ZlcndyaXRlLgorICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIE51bVRvSW5zZXJ0KTsKKyAgICBzaXplX3QgTnVtT3ZlcndyaXR0ZW4gPSBPbGRFbmQtSTsKKyAgICB0aGlzLT51bmluaXRpYWxpemVkX2NvcHkoSSwgT2xkRW5kLCB0aGlzLT5lbmQoKS1OdW1PdmVyd3JpdHRlbik7CisKKyAgICAvLyBSZXBsYWNlIHRoZSBvdmVyd3JpdHRlbiBwYXJ0LgorICAgIGZvciAoOyBOdW1PdmVyd3JpdHRlbiA+IDA7IC0tTnVtT3ZlcndyaXR0ZW4pIHsKKyAgICAgICpJID0gKkZyb207CisgICAgICArK0k7ICsrRnJvbTsKKyAgICB9CisKKyAgICAvLyBJbnNlcnQgdGhlIG5vbi1vdmVyd3JpdHRlbiBtaWRkbGUgcGFydC4KKyAgICB0aGlzLT51bmluaXRpYWxpemVkX2NvcHkoRnJvbSwgVG8sIE9sZEVuZCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICBjb25zdCBTbWFsbFZlY3RvckltcGwKKyAgJm9wZXJhdG9yPShjb25zdCBTbWFsbFZlY3RvckltcGwgJlJIUyk7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNtYWxsVmVjdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgaWYgKHRoaXMtPnNpemUoKSAhPSBSSFMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHN0ZDo6ZXF1YWwodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCksIFJIUy5iZWdpbigpKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU21hbGxWZWN0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU21hbGxWZWN0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKKyAgfQorCisgIC8vLyBzZXRfc2l6ZSAtIFNldCB0aGUgYXJyYXkgc2l6ZSB0byBcYXJnIE4sIHdoaWNoIHRoZSBjdXJyZW50IGFycmF5IG11c3QgaGF2ZQorICAvLy8gZW5vdWdoIGNhcGFjaXR5IGZvci4KKyAgLy8vCisgIC8vLyBUaGlzIGRvZXMgbm90IGNvbnN0cnVjdCBvciBkZXN0cm95IGFueSBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICAvLy8KKyAgLy8vIENsaWVudHMgY2FuIHVzZSB0aGlzIGluIGNvbmp1bmN0aW9uIHdpdGggY2FwYWNpdHkoKSB0byB3cml0ZSBwYXN0IHRoZSBlbmQKKyAgLy8vIG9mIHRoZSBidWZmZXIgd2hlbiB0aGV5IGtub3cgdGhhdCBtb3JlIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUsIGFuZCBvbmx5CisgIC8vLyB1cGRhdGUgdGhlIHNpemUgbGF0ZXIuIFRoaXMgYXZvaWRzIHRoZSBjb3N0IG9mIHZhbHVlIGluaXRpYWxpemluZyBlbGVtZW50cworICAvLy8gd2hpY2ggd2lsbCBvbmx5IGJlIG92ZXJ3cml0dGVuLgorICB2b2lkIHNldF9zaXplKHVuc2lnbmVkIE4pIHsKKyAgICBhc3NlcnQoTiA8PSB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKSArIE4pOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdF9yYW5nZShUICpTLCBUICpFLCBjb25zdCBUICZFbHQpIHsKKyAgICBmb3IgKDsgUyAhPSBFOyArK1MpCisgICAgICBuZXcgKFMpIFQoRWx0KTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgU21hbGxWZWN0b3JJbXBsPFQ+Ojpzd2FwKFNtYWxsVmVjdG9ySW1wbDxUPiAmUkhTKSB7CisgIGlmICh0aGlzID09ICZSSFMpIHJldHVybjsKKworICAvLyBXZSBjYW4gb25seSBhdm9pZCBjb3B5aW5nIGVsZW1lbnRzIGlmIG5laXRoZXIgdmVjdG9yIGlzIHNtYWxsLgorICBpZiAoIXRoaXMtPmlzU21hbGwoKSAmJiAhUkhTLmlzU21hbGwoKSkgeworICAgIHN0ZDo6c3dhcCh0aGlzLT5CZWdpblgsIFJIUy5CZWdpblgpOworICAgIHN0ZDo6c3dhcCh0aGlzLT5FbmRYLCBSSFMuRW5kWCk7CisgICAgc3RkOjpzd2FwKHRoaXMtPkNhcGFjaXR5WCwgUkhTLkNhcGFjaXR5WCk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChSSFMuc2l6ZSgpID4gdGhpcy0+Y2FwYWNpdHkoKSkKKyAgICB0aGlzLT5ncm93KFJIUy5zaXplKCkpOworICBpZiAodGhpcy0+c2l6ZSgpID4gUkhTLmNhcGFjaXR5KCkpCisgICAgUkhTLmdyb3codGhpcy0+c2l6ZSgpKTsKKworICAvLyBTd2FwIHRoZSBzaGFyZWQgZWxlbWVudHMuCisgIHNpemVfdCBOdW1TaGFyZWQgPSB0aGlzLT5zaXplKCk7CisgIGlmIChOdW1TaGFyZWQgPiBSSFMuc2l6ZSgpKSBOdW1TaGFyZWQgPSBSSFMuc2l6ZSgpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihOdW1TaGFyZWQpOyArK2kpCisgICAgc3RkOjpzd2FwKCgqdGhpcylbaV0sIFJIU1tpXSk7CisKKyAgLy8gQ29weSBvdmVyIHRoZSBleHRyYSBlbHRzLgorICBpZiAodGhpcy0+c2l6ZSgpID4gUkhTLnNpemUoKSkgeworICAgIHNpemVfdCBFbHREaWZmID0gdGhpcy0+c2l6ZSgpIC0gUkhTLnNpemUoKTsKKyAgICB0aGlzLT51bmluaXRpYWxpemVkX2NvcHkodGhpcy0+YmVnaW4oKStOdW1TaGFyZWQsIHRoaXMtPmVuZCgpLCBSSFMuZW5kKCkpOworICAgIFJIUy5zZXRFbmQoUkhTLmVuZCgpK0VsdERpZmYpOworICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKStOdW1TaGFyZWQsIHRoaXMtPmVuZCgpKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStOdW1TaGFyZWQpOworICB9IGVsc2UgaWYgKFJIUy5zaXplKCkgPiB0aGlzLT5zaXplKCkpIHsKKyAgICBzaXplX3QgRWx0RGlmZiA9IFJIUy5zaXplKCkgLSB0aGlzLT5zaXplKCk7CisgICAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KFJIUy5iZWdpbigpK051bVNoYXJlZCwgUkhTLmVuZCgpLCB0aGlzLT5lbmQoKSk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpICsgRWx0RGlmZik7CisgICAgdGhpcy0+ZGVzdHJveV9yYW5nZShSSFMuYmVnaW4oKStOdW1TaGFyZWQsIFJIUy5lbmQoKSk7CisgICAgUkhTLnNldEVuZChSSFMuYmVnaW4oKStOdW1TaGFyZWQpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY29uc3QgU21hbGxWZWN0b3JJbXBsPFQ+ICZTbWFsbFZlY3RvckltcGw8VD46OgorICBvcGVyYXRvcj0oY29uc3QgU21hbGxWZWN0b3JJbXBsPFQ+ICZSSFMpIHsKKyAgLy8gQXZvaWQgc2VsZi1hc3NpZ25tZW50LgorICBpZiAodGhpcyA9PSAmUkhTKSByZXR1cm4gKnRoaXM7CisKKyAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHN1ZmZpY2llbnQgc3BhY2UsIGFzc2lnbiB0aGUgY29tbW9uIGVsZW1lbnRzLCB0aGVuCisgIC8vIGRlc3Ryb3kgYW55IGV4Y2Vzcy4KKyAgc2l6ZV90IFJIU1NpemUgPSBSSFMuc2l6ZSgpOworICBzaXplX3QgQ3VyU2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgaWYgKEN1clNpemUgPj0gUkhTU2l6ZSkgeworICAgIC8vIEFzc2lnbiBjb21tb24gZWxlbWVudHMuCisgICAgaXRlcmF0b3IgTmV3RW5kOworICAgIGlmIChSSFNTaXplKQorICAgICAgTmV3RW5kID0gc3RkOjpjb3B5KFJIUy5iZWdpbigpLCBSSFMuYmVnaW4oKStSSFNTaXplLCB0aGlzLT5iZWdpbigpKTsKKyAgICBlbHNlCisgICAgICBOZXdFbmQgPSB0aGlzLT5iZWdpbigpOworCisgICAgLy8gRGVzdHJveSBleGNlc3MgZWxlbWVudHMuCisgICAgdGhpcy0+ZGVzdHJveV9yYW5nZShOZXdFbmQsIHRoaXMtPmVuZCgpKTsKKworICAgIC8vIFRyaW0uCisgICAgdGhpcy0+c2V0RW5kKE5ld0VuZCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSB0byBncm93IHRvIGhhdmUgZW5vdWdoIGVsZW1lbnRzLCBkZXN0cm95IHRoZSBjdXJyZW50IGVsZW1lbnRzLgorICAvLyBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBjb3B5aW5nIHRoZW0gZHVyaW5nIHRoZSBncm93LgorICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IFJIU1NpemUpIHsKKyAgICAvLyBEZXN0cm95IGN1cnJlbnQgZWxlbWVudHMuCisgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkpOworICAgIEN1clNpemUgPSAwOworICAgIHRoaXMtPmdyb3coUkhTU2l6ZSk7CisgIH0gZWxzZSBpZiAoQ3VyU2l6ZSkgeworICAgIC8vIE90aGVyd2lzZSwgdXNlIGFzc2lnbm1lbnQgZm9yIHRoZSBhbHJlYWR5LWNvbnN0cnVjdGVkIGVsZW1lbnRzLgorICAgIHN0ZDo6Y29weShSSFMuYmVnaW4oKSwgUkhTLmJlZ2luKCkrQ3VyU2l6ZSwgdGhpcy0+YmVnaW4oKSk7CisgIH0KKworICAvLyBDb3B5IGNvbnN0cnVjdCB0aGUgbmV3IGVsZW1lbnRzIGluIHBsYWNlLgorICB0aGlzLT51bmluaXRpYWxpemVkX2NvcHkoUkhTLmJlZ2luKCkrQ3VyU2l6ZSwgUkhTLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+YmVnaW4oKStDdXJTaXplKTsKKworICAvLyBTZXQgZW5kLgorICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStSSFNTaXplKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisKKy8vLyBTbWFsbFZlY3RvciAtIFRoaXMgaXMgYSAndmVjdG9yJyAocmVhbGx5LCBhIHZhcmlhYmxlLXNpemVkIGFycmF5KSwgb3B0aW1pemVkCisvLy8gZm9yIHRoZSBjYXNlIHdoZW4gdGhlIGFycmF5IGlzIHNtYWxsLiAgSXQgY29udGFpbnMgc29tZSBudW1iZXIgb2YgZWxlbWVudHMKKy8vLyBpbi1wbGFjZSwgd2hpY2ggYWxsb3dzIGl0IHRvIGF2b2lkIGhlYXAgYWxsb2NhdGlvbiB3aGVuIHRoZSBhY3R1YWwgbnVtYmVyIG9mCisvLy8gZWxlbWVudHMgaXMgYmVsb3cgdGhhdCB0aHJlc2hvbGQuICBUaGlzIGFsbG93cyBub3JtYWwgInNtYWxsIiBjYXNlcyB0byBiZQorLy8vIGZhc3Qgd2l0aG91dCBsb3NpbmcgZ2VuZXJhbGl0eSBmb3IgbGFyZ2UgaW5wdXRzLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXR0ZW1wdCB0byBiZSBleGNlcHRpb24gc2FmZS4KKy8vLwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CitjbGFzcyBTbWFsbFZlY3RvciA6IHB1YmxpYyBTbWFsbFZlY3RvckltcGw8VD4geworICAvLy8gSW5saW5lRWx0cyAtIFRoZXNlIGFyZSAnTi0xJyBlbGVtZW50cyB0aGF0IGFyZSBzdG9yZWQgaW5saW5lIGluIHRoZSBib2R5CisgIC8vLyBvZiB0aGUgdmVjdG9yLiAgVGhlIGV4dHJhICcxJyBlbGVtZW50IGlzIHN0b3JlZCBpbiBTbWFsbFZlY3RvckltcGwuCisgIHR5cGVkZWYgdHlwZW5hbWUgU21hbGxWZWN0b3JJbXBsPFQ+OjpVIFU7CisgIGVudW0geworICAgIC8vIE1pblVzIC0gVGhlIG51bWJlciBvZiBVJ3MgcmVxdWlyZSB0byBjb3ZlciBOIFQncy4KKyAgICBNaW5VcyA9IChzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHNpemVvZihUKSkqTiArCisgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihzaXplb2YoVSkpIC0gMSkgLworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihzaXplb2YoVSkpLAorCisgICAgLy8gTnVtSW5saW5lRWx0c0VsdHMgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjdHVhbGx5IGluIHRoaXMgYXJyYXkuICBUaGVyZQorICAgIC8vIGlzIGFscmVhZHkgb25lIGluIHRoZSBwYXJlbnQgY2xhc3MsIGFuZCB3ZSBoYXZlIHRvIHJvdW5kIHVwIHRvIGF2b2lkCisgICAgLy8gaGF2aW5nIGEgemVyby1lbGVtZW50IGFycmF5LgorICAgIE51bUlubGluZUVsdHNFbHRzID0gTWluVXMgPiAxID8gKE1pblVzIC0gMSkgOiAxLAorCisgICAgLy8gTnVtVHNBdmFpbGFibGUgLSBUaGUgbnVtYmVyIG9mIFQncyB3ZSBhY3R1YWxseSBoYXZlIHNwYWNlIGZvciwgd2hpY2ggbWF5CisgICAgLy8gYmUgbW9yZSB0aGFuIE4gZHVlIHRvIHJvdW5kaW5nLgorICAgIE51bVRzQXZhaWxhYmxlID0gKE51bUlubGluZUVsdHNFbHRzKzEpKnN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc2l6ZW9mKFUpKS8KKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc2l6ZW9mKFQpKQorICB9OworICBVIElubGluZUVsdHNbTnVtSW5saW5lRWx0c0VsdHNdOworcHVibGljOgorICBTbWFsbFZlY3RvcigpIDogU21hbGxWZWN0b3JJbXBsPFQ+KE51bVRzQXZhaWxhYmxlKSB7CisgIH0KKworICBleHBsaWNpdCBTbWFsbFZlY3Rvcih1bnNpZ25lZCBTaXplLCBjb25zdCBUICZWYWx1ZSA9IFQoKSkKKyAgICA6IFNtYWxsVmVjdG9ySW1wbDxUPihOdW1Uc0F2YWlsYWJsZSkgeworICAgIHRoaXMtPnJlc2VydmUoU2l6ZSk7CisgICAgd2hpbGUgKFNpemUtLSkKKyAgICAgIHRoaXMtPnB1c2hfYmFjayhWYWx1ZSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdFR5PgorICBTbWFsbFZlY3RvcihJdFR5IFMsIEl0VHkgRSkgOiBTbWFsbFZlY3RvckltcGw8VD4oTnVtVHNBdmFpbGFibGUpIHsKKyAgICB0aGlzLT5hcHBlbmQoUywgRSk7CisgIH0KKworICBTbWFsbFZlY3Rvcihjb25zdCBTbWFsbFZlY3RvciAmUkhTKSA6IFNtYWxsVmVjdG9ySW1wbDxUPihOdW1Uc0F2YWlsYWJsZSkgeworICAgIGlmICghUkhTLmVtcHR5KCkpCisgICAgICBTbWFsbFZlY3RvckltcGw8VD46Om9wZXJhdG9yPShSSFMpOworICB9CisKKyAgY29uc3QgU21hbGxWZWN0b3IgJm9wZXJhdG9yPShjb25zdCBTbWFsbFZlY3RvciAmUkhTKSB7CisgICAgU21hbGxWZWN0b3JJbXBsPFQ+OjpvcGVyYXRvcj0oUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCB7CisgIC8vLyBJbXBsZW1lbnQgc3RkOjpzd2FwIGluIHRlcm1zIG9mIFNtYWxsVmVjdG9yIHN3YXAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkCisgIHN3YXAobGx2bTo6U21hbGxWZWN0b3JJbXBsPFQ+ICZMSFMsIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxUPiAmUkhTKSB7CisgICAgTEhTLnN3YXAoUkhTKTsKKyAgfQorCisgIC8vLyBJbXBsZW1lbnQgc3RkOjpzd2FwIGluIHRlcm1zIG9mIFNtYWxsVmVjdG9yIHN3YXAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CisgIGlubGluZSB2b2lkCisgIHN3YXAobGx2bTo6U21hbGxWZWN0b3I8VCwgTj4gJkxIUywgbGx2bTo6U21hbGxWZWN0b3I8VCwgTj4gJlJIUykgeworICAgIExIUy5zd2FwKFJIUyk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1NwYXJzZUJpdFZlY3Rvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TcGFyc2VCaXRWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODYyOTgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TcGFyc2VCaXRWZWN0b3IuaApAQCAtMCwwICsxLDkwNiBAQAorLy89PT0tIGxsdm0vQURUL1NwYXJzZUJpdFZlY3Rvci5oIC0gRWZmaWNpZW50IFNwYXJzZSBCaXRWZWN0b3IgLSotIEMrKyAtKi0gPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU3BhcnNlQml0VmVjdG9yIGNsYXNzLiAgU2VlIHRoZSBkb3h5Z2VuIGNvbW1lbnQgZm9yCisvLyBTcGFyc2VCaXRWZWN0b3IgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgYWxnb3JpdGhtIHVzZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TUEFSU0VCSVRWRUNUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9TUEFSU0VCSVRWRUNUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gU3BhcnNlQml0VmVjdG9yIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgYml0dmVjdG9yIHRoYXQgaXMgc3BhcnNlIGJ5IG9ubHkKKy8vLyBzdG9yaW5nIHRoZSBlbGVtZW50cyB0aGF0IGhhdmUgbm9uLXplcm8gYml0cyBzZXQuICBJbiBvcmRlciB0byBtYWtlIHRoaXMKKy8vLyBmYXN0IGZvciB0aGUgbW9zdCBjb21tb24gY2FzZXMsIFNwYXJzZUJpdFZlY3RvciBpcyBpbXBsZW1lbnRlZCBhcyBhIGxpbmtlZAorLy8vIGxpc3Qgb2YgU3BhcnNlQml0VmVjdG9yRWxlbWVudHMuICBXZSBtYWludGFpbiBhIHBvaW50ZXIgdG8gdGhlIGxhc3QKKy8vLyBTcGFyc2VCaXRWZWN0b3JFbGVtZW50IGFjY2Vzc2VkIChpbiB0aGUgZm9ybSBvZiBhIGxpc3QgaXRlcmF0b3IpLCBpbiBvcmRlcgorLy8vIHRvIG1ha2UgbXVsdGlwbGUgaW4tb3JkZXIgdGVzdC9zZXQgY29uc3RhbnQgdGltZSBhZnRlciB0aGUgZmlyc3Qgb25lIGlzCisvLy8gZXhlY3V0ZWQuICBOb3RlIHRoYXQgdXNpbmcgdmVjdG9ycyB0byBzdG9yZSBTcGFyc2VCaXRWZWN0b3JFbGVtZW50J3MgZG9lcworLy8vIG5vdCB3b3JrIG91dCB2ZXJ5IHdlbGwgYmVjYXVzZSBpdCBjYXVzZXMgaW5zZXJ0aW9uIGluIHRoZSBtaWRkbGUgdG8gdGFrZQorLy8vIGVub3Jtb3VzIGFtb3VudHMgb2YgdGltZSB3aXRoIGEgbGFyZ2UgYW1vdW50IG9mIGJpdHMuICBPdGhlciBzdHJ1Y3R1cmVzIHRoYXQKKy8vLyBoYXZlIGJldHRlciB3b3JzdCBjYXNlcyBmb3IgaW5zZXJ0aW9uIGluIHRoZSBtaWRkbGUgKHZhcmlvdXMgYmFsYW5jZWQgdHJlZXMsCisvLy8gZXRjKSBkbyBub3QgcGVyZm9ybSBhcyB3ZWxsIGluIHByYWN0aWNlIGFzIGEgbGlua2VkIGxpc3Qgd2l0aCB0aGlzIGl0ZXJhdG9yCisvLy8ga2VwdCB1cCB0byBkYXRlLiAgVGhleSBhcmUgYWxzbyBzaWduaWZpY2FudGx5IG1vcmUgbWVtb3J5IGludGVuc2l2ZS4KKworCit0ZW1wbGF0ZSA8dW5zaWduZWQgRWxlbWVudFNpemUgPSAxMjg+CitzdHJ1Y3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudAorICA6IHB1YmxpYyBpbGlzdF9ub2RlPFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+ID4geworcHVibGljOgorICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQml0V29yZDsKKyAgZW51bSB7CisgICAgQklUV09SRF9TSVpFID0gc2l6ZW9mKEJpdFdvcmQpICogQ0hBUl9CSVQsCisgICAgQklUV09SRFNfUEVSX0VMRU1FTlQgPSAoRWxlbWVudFNpemUgKyBCSVRXT1JEX1NJWkUgLSAxKSAvIEJJVFdPUkRfU0laRSwKKyAgICBCSVRTX1BFUl9FTEVNRU5UID0gRWxlbWVudFNpemUKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8gSW5kZXggb2YgRWxlbWVudCBpbiB0ZXJtcyBvZiB3aGVyZSBmaXJzdCBiaXQgc3RhcnRzLgorICB1bnNpZ25lZCBFbGVtZW50SW5kZXg7CisgIEJpdFdvcmQgQml0c1tCSVRXT1JEU19QRVJfRUxFTUVOVF07CisgIC8vIE5lZWRlZCBmb3Igc2VudGluZWxzCisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3Rfc2VudGluZWxfdHJhaXRzPFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ+OworICBTcGFyc2VCaXRWZWN0b3JFbGVtZW50KCkgeworICAgIEVsZW1lbnRJbmRleCA9IH4wVTsKKyAgICBtZW1zZXQoJkJpdHNbMF0sIDAsIHNpemVvZiAoQml0V29yZCkgKiBCSVRXT1JEU19QRVJfRUxFTUVOVCk7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50KHVuc2lnbmVkIElkeCkgeworICAgIEVsZW1lbnRJbmRleCA9IElkeDsKKyAgICBtZW1zZXQoJkJpdHNbMF0sIDAsIHNpemVvZiAoQml0V29yZCkgKiBCSVRXT1JEU19QRVJfRUxFTUVOVCk7CisgIH0KKworICAvLyBDb21wYXJpc29uLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTKSBjb25zdCB7CisgICAgaWYgKEVsZW1lbnRJbmRleCAhPSBSSFMuRWxlbWVudEluZGV4KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gIT0gUkhTLkJpdHNbaV0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50ICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBiaXRzIHRoYXQgbWFrZSB1cCB3b3JkIElkeCBpbiBvdXIgZWxlbWVudC4KKyAgQml0V29yZCB3b3JkKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydCAoSWR4IDwgQklUV09SRFNfUEVSX0VMRU1FTlQpOworICAgIHJldHVybiBCaXRzW0lkeF07CisgIH0KKworICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRWxlbWVudEluZGV4OworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIHNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBCaXRzW0lkeCAvIEJJVFdPUkRfU0laRV0gfD0gMUwgPDwgKElkeCAlIEJJVFdPUkRfU0laRSk7CisgIH0KKworICBib29sIHRlc3RfYW5kX3NldCAodW5zaWduZWQgSWR4KSB7CisgICAgYm9vbCBvbGQgPSB0ZXN0KElkeCk7CisgICAgaWYgKCFvbGQpIHsKKyAgICAgIHNldChJZHgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgcmVzZXQodW5zaWduZWQgSWR4KSB7CisgICAgQml0c1tJZHggLyBCSVRXT1JEX1NJWkVdICY9IH4oMUwgPDwgKElkeCAlIEJJVFdPUkRfU0laRSkpOworICB9CisKKyAgYm9vbCB0ZXN0KHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiBCaXRzW0lkeCAvIEJJVFdPUkRfU0laRV0gJiAoMUwgPDwgKElkeCAlIEJJVFdPUkRfU0laRSkpOworICB9CisKKyAgdW5zaWduZWQgY291bnQoKSBjb25zdCB7CisgICAgdW5zaWduZWQgTnVtQml0cyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpCisgICAgICBpZiAoc2l6ZW9mKEJpdFdvcmQpID09IDQpCisgICAgICAgIE51bUJpdHMgKz0gQ291bnRQb3B1bGF0aW9uXzMyKEJpdHNbaV0pOworICAgICAgZWxzZSBpZiAoc2l6ZW9mKEJpdFdvcmQpID09IDgpCisgICAgICAgIE51bUJpdHMgKz0gQ291bnRQb3B1bGF0aW9uXzY0KEJpdHNbaV0pOworICAgICAgZWxzZQorICAgICAgICBhc3NlcnQoMCAmJiAiVW5zdXBwb3J0ZWQhIik7CisgICAgcmV0dXJuIE51bUJpdHM7CisgIH0KKworICAvLy8gZmluZF9maXJzdCAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzZXQgYml0LgorICBpbnQgZmluZF9maXJzdCgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldICE9IDApIHsKKyAgICAgICAgaWYgKHNpemVvZihCaXRXb3JkKSA9PSA0KQorICAgICAgICAgIHJldHVybiBpICogQklUV09SRF9TSVpFICsgQ291bnRUcmFpbGluZ1plcm9zXzMyKEJpdHNbaV0pOworICAgICAgICBlbHNlIGlmIChzaXplb2YoQml0V29yZCkgPT0gOCkKKyAgICAgICAgICByZXR1cm4gaSAqIEJJVFdPUkRfU0laRSArIENvdW50VHJhaWxpbmdaZXJvc182NChCaXRzW2ldKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFzc2VydCgwICYmICJVbnN1cHBvcnRlZCEiKTsKKyAgICAgIH0KKyAgICBhc3NlcnQoMCAmJiAiSWxsZWdhbCBlbXB0eSBlbGVtZW50Iik7CisgICAgcmV0dXJuIDA7IC8vIE5vdCByZWFjaGVkCisgIH0KKworICAvLy8gZmluZF9uZXh0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgc2V0IGJpdCBzdGFydGluZyBmcm9tIHRoZQorICAvLy8gIkN1cnIiIGJpdC4gUmV0dXJucyAtMSBpZiB0aGUgbmV4dCBzZXQgYml0IGlzIG5vdCBmb3VuZC4KKyAgaW50IGZpbmRfbmV4dCh1bnNpZ25lZCBDdXJyKSBjb25zdCB7CisgICAgaWYgKEN1cnIgPj0gQklUU19QRVJfRUxFTUVOVCkKKyAgICAgIHJldHVybiAtMTsKKworICAgIHVuc2lnbmVkIFdvcmRQb3MgPSBDdXJyIC8gQklUV09SRF9TSVpFOworICAgIHVuc2lnbmVkIEJpdFBvcyA9IEN1cnIgJSBCSVRXT1JEX1NJWkU7CisgICAgQml0V29yZCBDb3B5ID0gQml0c1tXb3JkUG9zXTsKKyAgICBhc3NlcnQgKFdvcmRQb3MgPD0gQklUV09SRFNfUEVSX0VMRU1FTlQKKyAgICAgICAgICAgICYmICJXb3JkIFBvc2l0aW9uIG91dHNpZGUgb2YgZWxlbWVudCIpOworCisgICAgLy8gTWFzayBvZmYgcHJldmlvdXMgYml0cy4KKyAgICBDb3B5ICY9IH4wTCA8PCBCaXRQb3M7CisKKyAgICBpZiAoQ29weSAhPSAwKSB7CisgICAgICBpZiAoc2l6ZW9mKEJpdFdvcmQpID09IDQpCisgICAgICAgIHJldHVybiBXb3JkUG9zICogQklUV09SRF9TSVpFICsgQ291bnRUcmFpbGluZ1plcm9zXzMyKENvcHkpOworICAgICAgZWxzZSBpZiAoc2l6ZW9mKEJpdFdvcmQpID09IDgpCisgICAgICAgIHJldHVybiBXb3JkUG9zICogQklUV09SRF9TSVpFICsgQ291bnRUcmFpbGluZ1plcm9zXzY0KENvcHkpOworICAgICAgZWxzZQorICAgICAgICBhc3NlcnQoMCAmJiAiVW5zdXBwb3J0ZWQhIik7CisgICAgfQorCisgICAgLy8gQ2hlY2sgc3Vic2VxdWVudCB3b3Jkcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBXb3JkUG9zKzE7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gIT0gMCkgeworICAgICAgICBpZiAoc2l6ZW9mKEJpdFdvcmQpID09IDQpCisgICAgICAgICAgcmV0dXJuIGkgKiBCSVRXT1JEX1NJWkUgKyBDb3VudFRyYWlsaW5nWmVyb3NfMzIoQml0c1tpXSk7CisgICAgICAgIGVsc2UgaWYgKHNpemVvZihCaXRXb3JkKSA9PSA4KQorICAgICAgICAgIHJldHVybiBpICogQklUV09SRF9TSVpFICsgQ291bnRUcmFpbGluZ1plcm9zXzY0KEJpdHNbaV0pOworICAgICAgICBlbHNlCisgICAgICAgICAgYXNzZXJ0KDAgJiYgIlVuc3VwcG9ydGVkISIpOworICAgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIFVuaW9uIHRoaXMgZWxlbWVudCB3aXRoIFJIUyBhbmQgcmV0dXJuIHRydWUgaWYgdGhpcyBvbmUgY2hhbmdlZC4KKyAgYm9vbCB1bmlvbldpdGgoY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTKSB7CisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpIHsKKyAgICAgIEJpdFdvcmQgb2xkID0gY2hhbmdlZCA/IDAgOiBCaXRzW2ldOworCisgICAgICBCaXRzW2ldIHw9IFJIUy5CaXRzW2ldOworICAgICAgaWYgKCFjaGFuZ2VkICYmIG9sZCAhPSBCaXRzW2ldKQorICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGNoYW5nZWQ7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGFueSBiaXRzIGluIGNvbW1vbiB3aXRoIFJIUworICBib29sIGludGVyc2VjdHMoY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpIHsKKyAgICAgIGlmIChSSFMuQml0c1tpXSAmIEJpdHNbaV0pCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJbnRlcnNlY3QgdGhpcyBFbGVtZW50IHdpdGggUkhTIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGlzIG9uZSBjaGFuZ2VkLgorICAvLyBCZWNhbWVaZXJvIGlzIHNldCB0byB0cnVlIGlmIHRoaXMgZWxlbWVudCBiZWNhbWUgYWxsLXplcm8gYml0cy4KKyAgYm9vbCBpbnRlcnNlY3RXaXRoKGNvbnN0IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkJlY2FtZVplcm8pIHsKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBib29sIGFsbHplcm8gPSB0cnVlOworCisgICAgQmVjYW1lWmVybyA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKSB7CisgICAgICBCaXRXb3JkIG9sZCA9IGNoYW5nZWQgPyAwIDogQml0c1tpXTsKKworICAgICAgQml0c1tpXSAmPSBSSFMuQml0c1tpXTsKKyAgICAgIGlmIChCaXRzW2ldICE9IDApCisgICAgICAgIGFsbHplcm8gPSBmYWxzZTsKKworICAgICAgaWYgKCFjaGFuZ2VkICYmIG9sZCAhPSBCaXRzW2ldKQorICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgQmVjYW1lWmVybyA9IGFsbHplcm87CisgICAgcmV0dXJuIGNoYW5nZWQ7CisgIH0KKyAgLy8gSW50ZXJzZWN0IHRoaXMgRWxlbWVudCB3aXRoIHRoZSBjb21wbGVtZW50IG9mIFJIUyBhbmQgcmV0dXJuIHRydWUgaWYgdGhpcworICAvLyBvbmUgY2hhbmdlZC4gIEJlY2FtZVplcm8gaXMgc2V0IHRvIHRydWUgaWYgdGhpcyBlbGVtZW50IGJlY2FtZSBhbGwtemVybworICAvLyBiaXRzLgorICBib29sIGludGVyc2VjdFdpdGhDb21wbGVtZW50KGNvbnN0IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZCZWNhbWVaZXJvKSB7CisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgYm9vbCBhbGx6ZXJvID0gdHJ1ZTsKKworICAgIEJlY2FtZVplcm8gPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsraSkgeworICAgICAgQml0V29yZCBvbGQgPSBjaGFuZ2VkID8gMCA6IEJpdHNbaV07CisKKyAgICAgIEJpdHNbaV0gJj0gflJIUy5CaXRzW2ldOworICAgICAgaWYgKEJpdHNbaV0gIT0gMCkKKyAgICAgICAgYWxsemVybyA9IGZhbHNlOworCisgICAgICBpZiAoIWNoYW5nZWQgJiYgb2xkICE9IEJpdHNbaV0pCisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICBCZWNhbWVaZXJvID0gYWxsemVybzsKKyAgICByZXR1cm4gY2hhbmdlZDsKKyAgfQorICAvLyBUaHJlZSBhcmd1bWVudCB2ZXJzaW9uIG9mIGludGVyc2VjdFdpdGhDb21wbGVtZW50IHRoYXQgaW50ZXJzZWN0cworICAvLyBSSFMxICYgflJIUzIgaW50byB0aGlzIGVsZW1lbnQKKyAgdm9pZCBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudChjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50ICZSSFMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQgJlJIUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQmVjYW1lWmVybykgeworICAgIGJvb2wgYWxsemVybyA9IHRydWU7CisKKyAgICBCZWNhbWVaZXJvID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpIHsKKyAgICAgIEJpdHNbaV0gPSBSSFMxLkJpdHNbaV0gJiB+UkhTMi5CaXRzW2ldOworICAgICAgaWYgKEJpdHNbaV0gIT0gMCkKKyAgICAgICAgYWxsemVybyA9IGZhbHNlOworICAgIH0KKyAgICBCZWNhbWVaZXJvID0gYWxsemVybzsKKyAgfQorCisgIC8vIEdldCBhIGhhc2ggdmFsdWUgZm9yIHRoaXMgZWxlbWVudDsKKyAgdWludDY0X3QgZ2V0SGFzaFZhbHVlKCkgY29uc3QgeworICAgIHVpbnQ2NF90IEhhc2hWYWwgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKSB7CisgICAgICBIYXNoVmFsIF49IEJpdHNbaV07CisgICAgfQorICAgIHJldHVybiBIYXNoVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8dW5zaWduZWQgRWxlbWVudFNpemUgPSAxMjg+CitjbGFzcyBTcGFyc2VCaXRWZWN0b3IgeworICB0eXBlZGVmIGlsaXN0PFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+ID4gRWxlbWVudExpc3Q7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWxlbWVudExpc3Q6Oml0ZXJhdG9yIEVsZW1lbnRMaXN0SXRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFbGVtZW50TGlzdDo6Y29uc3RfaXRlcmF0b3IgRWxlbWVudExpc3RDb25zdEl0ZXI7CisgIGVudW0geworICAgIEJJVFdPUkRfU0laRSA9IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+OjpCSVRXT1JEX1NJWkUKKyAgfTsKKworICAvLyBQb2ludGVyIHRvIG91ciBjdXJyZW50IEVsZW1lbnQuCisgIEVsZW1lbnRMaXN0SXRlciBDdXJyRWxlbWVudEl0ZXI7CisgIEVsZW1lbnRMaXN0IEVsZW1lbnRzOworCisgIC8vIFRoaXMgaXMgbGlrZSBzdGQ6Omxvd2VyX2JvdW5kLCBleGNlcHQgd2UgZG8gbGluZWFyIHNlYXJjaGluZyBmcm9tIHRoZQorICAvLyBjdXJyZW50IHBvc2l0aW9uLgorICBFbGVtZW50TGlzdEl0ZXIgRmluZExvd2VyQm91bmQodW5zaWduZWQgRWxlbWVudEluZGV4KSB7CisKKyAgICBpZiAoRWxlbWVudHMuZW1wdHkoKSkgeworICAgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICAgIHJldHVybiBFbGVtZW50cy5iZWdpbigpOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSBvdXIgY3VycmVudCBpdGVyYXRvciBpcyB2YWxpZC4KKyAgICBpZiAoQ3VyckVsZW1lbnRJdGVyID09IEVsZW1lbnRzLmVuZCgpKQorICAgICAgLS1DdXJyRWxlbWVudEl0ZXI7CisKKyAgICAvLyBTZWFyY2ggZnJvbSBvdXIgY3VycmVudCBpdGVyYXRvciwgZWl0aGVyIGJhY2t3YXJkcyBvciBmb3J3YXJkcywKKyAgICAvLyBkZXBlbmRpbmcgb24gd2hhdCBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvci4KKyAgICBFbGVtZW50TGlzdEl0ZXIgRWxlbWVudEl0ZXIgPSBDdXJyRWxlbWVudEl0ZXI7CisgICAgaWYgKEN1cnJFbGVtZW50SXRlci0+aW5kZXgoKSA9PSBFbGVtZW50SW5kZXgpIHsKKyAgICAgIHJldHVybiBFbGVtZW50SXRlcjsKKyAgICB9IGVsc2UgaWYgKEN1cnJFbGVtZW50SXRlci0+aW5kZXgoKSA+IEVsZW1lbnRJbmRleCkgeworICAgICAgd2hpbGUgKEVsZW1lbnRJdGVyICE9IEVsZW1lbnRzLmJlZ2luKCkKKyAgICAgICAgICAgICAmJiBFbGVtZW50SXRlci0+aW5kZXgoKSA+IEVsZW1lbnRJbmRleCkKKyAgICAgICAgLS1FbGVtZW50SXRlcjsKKyAgICB9IGVsc2UgeworICAgICAgd2hpbGUgKEVsZW1lbnRJdGVyICE9IEVsZW1lbnRzLmVuZCgpICYmCisgICAgICAgICAgICAgRWxlbWVudEl0ZXItPmluZGV4KCkgPCBFbGVtZW50SW5kZXgpCisgICAgICAgICsrRWxlbWVudEl0ZXI7CisgICAgfQorICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRJdGVyOworICAgIHJldHVybiBFbGVtZW50SXRlcjsKKyAgfQorCisgIC8vIEl0ZXJhdG9yIHRvIHdhbGsgc2V0IGJpdHMgaW4gdGhlIGJpdG1hcC4gIFRoaXMgaXRlcmF0b3IgaXMgYSBsb3QgdWdsaWVyCisgIC8vIHRoYW4gaXQgd291bGQgYmUsIGluIG9yZGVyIHRvIGJlIGVmZmljaWVudC4KKyAgY2xhc3MgU3BhcnNlQml0VmVjdG9ySXRlcmF0b3IgeworICBwcml2YXRlOgorICAgIGJvb2wgQXRFbmQ7CisKKyAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICpCaXRWZWN0b3I7CisKKyAgICAvLyBDdXJyZW50IGVsZW1lbnQgaW5zaWRlIG9mIGJpdG1hcC4KKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBJdGVyOworCisgICAgLy8gQ3VycmVudCBiaXQgbnVtYmVyIGluc2lkZSBvZiBvdXIgYml0bWFwLgorICAgIHVuc2lnbmVkIEJpdE51bWJlcjsKKworICAgIC8vIEN1cnJlbnQgd29yZCBudW1iZXIgaW5zaWRlIG9mIG91ciBlbGVtZW50LgorICAgIHVuc2lnbmVkIFdvcmROdW1iZXI7CisKKyAgICAvLyBDdXJyZW50IGJpdHMgZnJvbSB0aGUgZWxlbWVudC4KKyAgICB0eXBlbmFtZSBTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPjo6Qml0V29yZCBCaXRzOworCisgICAgLy8gTW92ZSBvdXIgaXRlcmF0b3IgdG8gdGhlIGZpcnN0IG5vbi16ZXJvIGJpdCBpbiB0aGUgYml0bWFwLgorICAgIHZvaWQgQWR2YW5jZVRvRmlyc3ROb25aZXJvKCkgeworICAgICAgaWYgKEF0RW5kKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoQml0VmVjdG9yLT5FbGVtZW50cy5lbXB0eSgpKSB7CisgICAgICAgIEF0RW5kID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgSXRlciA9IEJpdFZlY3Rvci0+RWxlbWVudHMuYmVnaW4oKTsKKyAgICAgIEJpdE51bWJlciA9IEl0ZXItPmluZGV4KCkgKiBFbGVtZW50U2l6ZTsKKyAgICAgIHVuc2lnbmVkIEJpdFBvcyA9IEl0ZXItPmZpbmRfZmlyc3QoKTsKKyAgICAgIEJpdE51bWJlciArPSBCaXRQb3M7CisgICAgICBXb3JkTnVtYmVyID0gKEJpdE51bWJlciAlIEVsZW1lbnRTaXplKSAvIEJJVFdPUkRfU0laRTsKKyAgICAgIEJpdHMgPSBJdGVyLT53b3JkKFdvcmROdW1iZXIpOworICAgICAgQml0cyA+Pj0gQml0UG9zICUgQklUV09SRF9TSVpFOworICAgIH0KKworICAgIC8vIE1vdmUgb3VyIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IG5vbi16ZXJvIGJpdC4KKyAgICB2b2lkIEFkdmFuY2VUb05leHROb25aZXJvKCkgeworICAgICAgaWYgKEF0RW5kKQorICAgICAgICByZXR1cm47CisKKyAgICAgIHdoaWxlIChCaXRzICYmICEoQml0cyAmIDEpKSB7CisgICAgICAgIEJpdHMgPj49IDE7CisgICAgICAgIEJpdE51bWJlciArPSAxOworICAgICAgfQorCisgICAgICAvLyBTZWUgaWYgd2UgcmFuIG91dCBvZiBCaXRzIGluIHRoaXMgd29yZC4KKyAgICAgIGlmICghQml0cykgeworICAgICAgICBpbnQgTmV4dFNldEJpdE51bWJlciA9IEl0ZXItPmZpbmRfbmV4dChCaXROdW1iZXIgJSBFbGVtZW50U2l6ZSkgOworICAgICAgICAvLyBJZiB3ZSByYW4gb3V0IG9mIHNldCBiaXRzIGluIHRoaXMgZWxlbWVudCwgbW92ZSB0byBuZXh0IGVsZW1lbnQuCisgICAgICAgIGlmIChOZXh0U2V0Qml0TnVtYmVyID09IC0xIHx8IChCaXROdW1iZXIgJSBFbGVtZW50U2l6ZSA9PSAwKSkgeworICAgICAgICAgICsrSXRlcjsKKyAgICAgICAgICBXb3JkTnVtYmVyID0gMDsKKworICAgICAgICAgIC8vIFdlIG1heSBydW4gb3V0IG9mIGVsZW1lbnRzIGluIHRoZSBiaXRtYXAuCisgICAgICAgICAgaWYgKEl0ZXIgPT0gQml0VmVjdG9yLT5FbGVtZW50cy5lbmQoKSkgeworICAgICAgICAgICAgQXRFbmQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBTZXQgdXAgZm9yIG5leHQgbm9uIHplcm8gd29yZCBpbiBiaXRtYXAuCisgICAgICAgICAgQml0TnVtYmVyID0gSXRlci0+aW5kZXgoKSAqIEVsZW1lbnRTaXplOworICAgICAgICAgIE5leHRTZXRCaXROdW1iZXIgPSBJdGVyLT5maW5kX2ZpcnN0KCk7CisgICAgICAgICAgQml0TnVtYmVyICs9IE5leHRTZXRCaXROdW1iZXI7CisgICAgICAgICAgV29yZE51bWJlciA9IChCaXROdW1iZXIgJSBFbGVtZW50U2l6ZSkgLyBCSVRXT1JEX1NJWkU7CisgICAgICAgICAgQml0cyA9IEl0ZXItPndvcmQoV29yZE51bWJlcik7CisgICAgICAgICAgQml0cyA+Pj0gTmV4dFNldEJpdE51bWJlciAlIEJJVFdPUkRfU0laRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBXb3JkTnVtYmVyID0gKE5leHRTZXRCaXROdW1iZXIgJSBFbGVtZW50U2l6ZSkgLyBCSVRXT1JEX1NJWkU7CisgICAgICAgICAgQml0cyA9IEl0ZXItPndvcmQoV29yZE51bWJlcik7CisgICAgICAgICAgQml0cyA+Pj0gTmV4dFNldEJpdE51bWJlciAlIEJJVFdPUkRfU0laRTsKKyAgICAgICAgICBCaXROdW1iZXIgPSBJdGVyLT5pbmRleCgpICogRWxlbWVudFNpemU7CisgICAgICAgICAgQml0TnVtYmVyICs9IE5leHRTZXRCaXROdW1iZXI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIHB1YmxpYzoKKyAgICAvLyBQcmVpbmNyZW1lbnQuCisgICAgaW5saW5lIFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgKytCaXROdW1iZXI7CisgICAgICBCaXRzID4+PSAxOworICAgICAgQWR2YW5jZVRvTmV4dE5vblplcm8oKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBQb3N0aW5jcmVtZW50LgorICAgIGlubGluZSBTcGFyc2VCaXRWZWN0b3JJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgU3BhcnNlQml0VmVjdG9ySXRlcmF0b3IgdG1wID0gKnRoaXM7CisgICAgICArKyp0aGlzOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0IGJpdCBudW1iZXIuCisgICAgdW5zaWduZWQgb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgcmV0dXJuIEJpdE51bWJlcjsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3BhcnNlQml0VmVjdG9ySXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgICAgLy8gSWYgdGhleSBhcmUgYm90aCBhdCB0aGUgZW5kLCBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcy4KKyAgICAgIGlmIChBdEVuZCAmJiBSSFMuQXRFbmQpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgLy8gT3RoZXJ3aXNlIHRoZXkgYXJlIHRoZSBzYW1lIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBiaXQgbnVtYmVyIGFuZAorICAgICAgLy8gYml0bWFwLgorICAgICAgcmV0dXJuIEF0RW5kID09IFJIUy5BdEVuZCAmJiBSSFMuQml0TnVtYmVyID09IEJpdE51bWJlcjsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgICAgfQorICAgIFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yKCk6IEJpdFZlY3RvcihOVUxMKSB7CisgICAgfQorCisKKyAgICBTcGFyc2VCaXRWZWN0b3JJdGVyYXRvcihjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmQgPSBmYWxzZSk6Qml0VmVjdG9yKFJIUykgeworICAgICAgSXRlciA9IEJpdFZlY3Rvci0+RWxlbWVudHMuYmVnaW4oKTsKKyAgICAgIEJpdE51bWJlciA9IDA7CisgICAgICBCaXRzID0gMDsKKyAgICAgIFdvcmROdW1iZXIgPSB+MDsKKyAgICAgIEF0RW5kID0gZW5kOworICAgICAgQWR2YW5jZVRvRmlyc3ROb25aZXJvKCk7CisgICAgfQorICB9OworcHVibGljOgorICB0eXBlZGVmIFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yIGl0ZXJhdG9yOworCisgIFNwYXJzZUJpdFZlY3RvciAoKSB7CisgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4gKCk7CisgIH0KKworICB+U3BhcnNlQml0VmVjdG9yKCkgeworICB9CisKKyAgLy8gU3BhcnNlQml0VmVjdG9yIGNvcHkgY3Rvci4KKyAgU3BhcnNlQml0VmVjdG9yKGNvbnN0IFNwYXJzZUJpdFZlY3RvciAmUkhTKSB7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgRWxlbWVudEl0ZXIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKyAgICB3aGlsZSAoRWxlbWVudEl0ZXIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICBFbGVtZW50cy5wdXNoX2JhY2soU3BhcnNlQml0VmVjdG9yRWxlbWVudDxFbGVtZW50U2l6ZT4oKkVsZW1lbnRJdGVyKSk7CisgICAgICArK0VsZW1lbnRJdGVyOworICAgIH0KKworICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luICgpOworICB9CisKKyAgLy8gQ2xlYXIuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgRWxlbWVudHMuY2xlYXIoKTsKKyAgfQorCisgIC8vIEFzc2lnbm1lbnQKKyAgU3BhcnNlQml0VmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlQml0VmVjdG9yJiBSSFMpIHsKKyAgICBFbGVtZW50cy5jbGVhcigpOworCisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgRWxlbWVudEl0ZXIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKyAgICB3aGlsZSAoRWxlbWVudEl0ZXIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICBFbGVtZW50cy5wdXNoX2JhY2soU3BhcnNlQml0VmVjdG9yRWxlbWVudDxFbGVtZW50U2l6ZT4oKkVsZW1lbnRJdGVyKSk7CisgICAgICArK0VsZW1lbnRJdGVyOworICAgIH0KKworICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luICgpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gVGVzdCwgUmVzZXQsIGFuZCBTZXQgYSBiaXQgaW4gdGhlIGJpdG1hcC4KKyAgYm9vbCB0ZXN0KHVuc2lnbmVkIElkeCkgeworICAgIGlmIChFbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgRWxlbWVudEluZGV4ID0gSWR4IC8gRWxlbWVudFNpemU7CisgICAgRWxlbWVudExpc3RJdGVyIEVsZW1lbnRJdGVyID0gRmluZExvd2VyQm91bmQoRWxlbWVudEluZGV4KTsKKworICAgIC8vIElmIHdlIGNhbid0IGZpbmQgYW4gZWxlbWVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gdGhpcyBiaXQsIHRoZXJlCisgICAgLy8gaXMgbm90aGluZyBtb3JlIHRvIGRvLgorICAgIGlmIChFbGVtZW50SXRlciA9PSBFbGVtZW50cy5lbmQoKSB8fAorICAgICAgICBFbGVtZW50SXRlci0+aW5kZXgoKSAhPSBFbGVtZW50SW5kZXgpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEVsZW1lbnRJdGVyLT50ZXN0KElkeCAlIEVsZW1lbnRTaXplKTsKKyAgfQorCisgIHZvaWQgcmVzZXQodW5zaWduZWQgSWR4KSB7CisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBFbGVtZW50SW5kZXggPSBJZHggLyBFbGVtZW50U2l6ZTsKKyAgICBFbGVtZW50TGlzdEl0ZXIgRWxlbWVudEl0ZXIgPSBGaW5kTG93ZXJCb3VuZChFbGVtZW50SW5kZXgpOworCisgICAgLy8gSWYgd2UgY2FuJ3QgZmluZCBhbiBlbGVtZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGlzIGJpdCwgdGhlcmUKKyAgICAvLyBpcyBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgaWYgKEVsZW1lbnRJdGVyID09IEVsZW1lbnRzLmVuZCgpIHx8CisgICAgICAgIEVsZW1lbnRJdGVyLT5pbmRleCgpICE9IEVsZW1lbnRJbmRleCkKKyAgICAgIHJldHVybjsKKyAgICBFbGVtZW50SXRlci0+cmVzZXQoSWR4ICUgRWxlbWVudFNpemUpOworCisgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBpcyB6ZXJvZWQgb3V0LCBkZWxldGUgaXQuCisgICAgaWYgKEVsZW1lbnRJdGVyLT5lbXB0eSgpKSB7CisgICAgICArK0N1cnJFbGVtZW50SXRlcjsKKyAgICAgIEVsZW1lbnRzLmVyYXNlKEVsZW1lbnRJdGVyKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICB1bnNpZ25lZCBFbGVtZW50SW5kZXggPSBJZHggLyBFbGVtZW50U2l6ZTsKKyAgICBTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPiAqRWxlbWVudDsKKyAgICBFbGVtZW50TGlzdEl0ZXIgRWxlbWVudEl0ZXI7CisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkpIHsKKyAgICAgIEVsZW1lbnQgPSBuZXcgU3BhcnNlQml0VmVjdG9yRWxlbWVudDxFbGVtZW50U2l6ZT4oRWxlbWVudEluZGV4KTsKKyAgICAgIEVsZW1lbnRJdGVyID0gRWxlbWVudHMuaW5zZXJ0KEVsZW1lbnRzLmVuZCgpLCBFbGVtZW50KTsKKworICAgIH0gZWxzZSB7CisgICAgICBFbGVtZW50SXRlciA9IEZpbmRMb3dlckJvdW5kKEVsZW1lbnRJbmRleCk7CisKKyAgICAgIGlmIChFbGVtZW50SXRlciA9PSBFbGVtZW50cy5lbmQoKSB8fAorICAgICAgICAgIEVsZW1lbnRJdGVyLT5pbmRleCgpICE9IEVsZW1lbnRJbmRleCkgeworICAgICAgICBFbGVtZW50ID0gbmV3IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+KEVsZW1lbnRJbmRleCk7CisgICAgICAgIC8vIFdlIG1heSBoYXZlIGhpdCB0aGUgYmVnaW5uaW5nIG9mIG91ciBTcGFyc2VCaXRWZWN0b3IsIGluIHdoaWNoIGNhc2UsCisgICAgICAgIC8vIHdlIG1heSBuZWVkIHRvIGluc2VydCByaWdodCBhZnRlciB0aGlzIGVsZW1lbnQsIHdoaWNoIHJlcXVpcmVzIG1vdmluZworICAgICAgICAvLyB0aGUgY3VycmVudCBpdGVyYXRvciBmb3J3YXJkIG9uZSwgYmVjYXVzZSBpbnNlcnQgZG9lcyBpbnNlcnQgYmVmb3JlLgorICAgICAgICBpZiAoRWxlbWVudEl0ZXIgIT0gRWxlbWVudHMuZW5kKCkgJiYKKyAgICAgICAgICAgIEVsZW1lbnRJdGVyLT5pbmRleCgpIDwgRWxlbWVudEluZGV4KQorICAgICAgICAgIEVsZW1lbnRJdGVyID0gRWxlbWVudHMuaW5zZXJ0KCsrRWxlbWVudEl0ZXIsIEVsZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5pbnNlcnQoRWxlbWVudEl0ZXIsIEVsZW1lbnQpOworICAgICAgfQorICAgIH0KKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50SXRlcjsKKworICAgIEVsZW1lbnRJdGVyLT5zZXQoSWR4ICUgRWxlbWVudFNpemUpOworICB9CisKKyAgYm9vbCB0ZXN0X2FuZF9zZXQgKHVuc2lnbmVkIElkeCkgeworICAgIGJvb2wgb2xkID0gdGVzdChJZHgpOworICAgIGlmICghb2xkKSB7CisgICAgICBzZXQoSWR4KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU3BhcnNlQml0VmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNwYXJzZUJpdFZlY3RvciAmUkhTKSBjb25zdCB7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlcjEgPSBFbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIyID0gUkhTLkVsZW1lbnRzLmJlZ2luKCk7CisKKyAgICBmb3IgKDsgSXRlcjEgIT0gRWxlbWVudHMuZW5kKCkgJiYgSXRlcjIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpOworICAgICAgICAgKytJdGVyMSwgKytJdGVyMikgeworICAgICAgaWYgKCpJdGVyMSAhPSAqSXRlcjIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEl0ZXIxID09IEVsZW1lbnRzLmVuZCgpICYmIEl0ZXIyID09IFJIUy5FbGVtZW50cy5lbmQoKTsKKyAgfQorCisgIC8vIFVuaW9uIG91ciBiaXRtYXAgd2l0aCB0aGUgUkhTIGFuZCByZXR1cm4gdHJ1ZSBpZiB3ZSBjaGFuZ2VkLgorICBib29sIG9wZXJhdG9yfD0oY29uc3QgU3BhcnNlQml0VmVjdG9yICZSSFMpIHsKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBFbGVtZW50TGlzdEl0ZXIgSXRlcjEgPSBFbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIyID0gUkhTLkVsZW1lbnRzLmJlZ2luKCk7CisKKyAgICAvLyBJZiBSSFMgaXMgZW1wdHksIHdlIGFyZSBkb25lCisgICAgaWYgKFJIUy5FbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgd2hpbGUgKEl0ZXIyICE9IFJIUy5FbGVtZW50cy5lbmQoKSkgeworICAgICAgaWYgKEl0ZXIxID09IEVsZW1lbnRzLmVuZCgpIHx8IEl0ZXIxLT5pbmRleCgpID4gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgRWxlbWVudHMuaW5zZXJ0KEl0ZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+KCpJdGVyMikpOworICAgICAgICArK0l0ZXIyOworICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoSXRlcjEtPmluZGV4KCkgPT0gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgY2hhbmdlZCB8PSBJdGVyMS0+dW5pb25XaXRoKCpJdGVyMik7CisgICAgICAgICsrSXRlcjE7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgeworICAgICAgICArK0l0ZXIxOworICAgICAgfQorICAgIH0KKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgIHJldHVybiBjaGFuZ2VkOworICB9CisKKyAgLy8gSW50ZXJzZWN0IG91ciBiaXRtYXAgd2l0aCB0aGUgUkhTIGFuZCByZXR1cm4gdHJ1ZSBpZiBvdXJzIGNoYW5nZWQuCisgIGJvb2wgb3BlcmF0b3ImPShjb25zdCBTcGFyc2VCaXRWZWN0b3IgJlJIUykgeworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIEVsZW1lbnRMaXN0SXRlciBJdGVyMSA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlcjIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKworICAgIC8vIENoZWNrIGlmIGJvdGggYml0bWFwcyBhcmUgZW1wdHkuCisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkgJiYgUkhTLkVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBMb29wIHRocm91Z2gsIGludGVyc2VjdGluZyBhcyB3ZSBnbywgZXJhc2luZyBlbGVtZW50cyB3aGVuIG5lY2Vzc2FyeS4KKyAgICB3aGlsZSAoSXRlcjIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICBpZiAoSXRlcjEgPT0gRWxlbWVudHMuZW5kKCkpIHsKKyAgICAgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgICB9CisKKyAgICAgIGlmIChJdGVyMS0+aW5kZXgoKSA+IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgaWYgKEl0ZXIxLT5pbmRleCgpID09IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgIGJvb2wgQmVjYW1lWmVybzsKKyAgICAgICAgY2hhbmdlZCB8PSBJdGVyMS0+aW50ZXJzZWN0V2l0aCgqSXRlcjIsIEJlY2FtZVplcm8pOworICAgICAgICBpZiAoQmVjYW1lWmVybykgeworICAgICAgICAgIEVsZW1lbnRMaXN0SXRlciBJdGVyVG1wID0gSXRlcjE7CisgICAgICAgICAgKytJdGVyMTsKKyAgICAgICAgICBFbGVtZW50cy5lcmFzZShJdGVyVG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICArK0l0ZXIxOworICAgICAgICB9CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgeworICAgICAgICBFbGVtZW50TGlzdEl0ZXIgSXRlclRtcCA9IEl0ZXIxOworICAgICAgICArK0l0ZXIxOworICAgICAgICBFbGVtZW50cy5lcmFzZShJdGVyVG1wKTsKKyAgICAgIH0KKyAgICB9CisgICAgRWxlbWVudHMuZXJhc2UoSXRlcjEsIEVsZW1lbnRzLmVuZCgpKTsKKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgIHJldHVybiBjaGFuZ2VkOworICB9CisKKyAgLy8gSW50ZXJzZWN0IG91ciBiaXRtYXAgd2l0aCB0aGUgY29tcGxlbWVudCBvZiB0aGUgUkhTIGFuZCByZXR1cm4gdHJ1ZQorICAvLyBpZiBvdXJzIGNoYW5nZWQuCisgIGJvb2wgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoY29uc3QgU3BhcnNlQml0VmVjdG9yICZSSFMpIHsKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBFbGVtZW50TGlzdEl0ZXIgSXRlcjEgPSBFbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIyID0gUkhTLkVsZW1lbnRzLmJlZ2luKCk7CisKKyAgICAvLyBJZiBlaXRoZXIgb3VyIGJpdG1hcCBvciBSSFMgaXMgZW1wdHksIHdlIGFyZSBkb25lCisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkgfHwgUkhTLkVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBMb29wIHRocm91Z2gsIGludGVyc2VjdGluZyBhcyB3ZSBnbywgZXJhc2luZyBlbGVtZW50cyB3aGVuIG5lY2Vzc2FyeS4KKyAgICB3aGlsZSAoSXRlcjIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICBpZiAoSXRlcjEgPT0gRWxlbWVudHMuZW5kKCkpIHsKKyAgICAgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgICB9CisKKyAgICAgIGlmIChJdGVyMS0+aW5kZXgoKSA+IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgaWYgKEl0ZXIxLT5pbmRleCgpID09IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgIGJvb2wgQmVjYW1lWmVybzsKKyAgICAgICAgY2hhbmdlZCB8PSBJdGVyMS0+aW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoKkl0ZXIyLCBCZWNhbWVaZXJvKTsKKyAgICAgICAgaWYgKEJlY2FtZVplcm8pIHsKKyAgICAgICAgICBFbGVtZW50TGlzdEl0ZXIgSXRlclRtcCA9IEl0ZXIxOworICAgICAgICAgICsrSXRlcjE7CisgICAgICAgICAgRWxlbWVudHMuZXJhc2UoSXRlclRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytJdGVyMTsKKyAgICAgICAgfQorICAgICAgICArK0l0ZXIyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKytJdGVyMTsKKyAgICAgIH0KKyAgICB9CisgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICByZXR1cm4gY2hhbmdlZDsKKyAgfQorCisgIGJvb2wgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVyc2VjdFdpdGhDb21wbGVtZW50KCpSSFMpOworICB9CisKKworICAvLyAgVGhyZWUgYXJndW1lbnQgdmVyc2lvbiBvZiBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudC4KKyAgLy8gIFJlc3VsdCBvZiBSSFMxICYgflJIUzIgaXMgc3RvcmVkIGludG8gdGhpcyBiaXRtYXAuCisgIHZvaWQgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZSSFMyKQorICB7CisgICAgRWxlbWVudHMuY2xlYXIoKTsKKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIxID0gUkhTMS5FbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIyID0gUkhTMi5FbGVtZW50cy5iZWdpbigpOworCisgICAgLy8gSWYgUkhTMSBpcyBlbXB0eSwgd2UgYXJlIGRvbmUKKyAgICAvLyBJZiBSSFMyIGlzIGVtcHR5LCB3ZSBzdGlsbCBoYXZlIHRvIGNvcHkgUkhTMQorICAgIGlmIChSSFMxLkVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICAvLyBMb29wIHRocm91Z2gsIGludGVyc2VjdGluZyBhcyB3ZSBnbywgZXJhc2luZyBlbGVtZW50cyB3aGVuIG5lY2Vzc2FyeS4KKyAgICB3aGlsZSAoSXRlcjIgIT0gUkhTMi5FbGVtZW50cy5lbmQoKSkgeworICAgICAgaWYgKEl0ZXIxID09IFJIUzEuRWxlbWVudHMuZW5kKCkpCisgICAgICAgIHJldHVybjsKKworICAgICAgaWYgKEl0ZXIxLT5pbmRleCgpID4gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgKytJdGVyMjsKKyAgICAgIH0gZWxzZSBpZiAoSXRlcjEtPmluZGV4KCkgPT0gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgYm9vbCBCZWNhbWVaZXJvID0gZmFsc2U7CisgICAgICAgIFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+ICpOZXdFbGVtZW50ID0KKyAgICAgICAgICBuZXcgU3BhcnNlQml0VmVjdG9yRWxlbWVudDxFbGVtZW50U2l6ZT4oSXRlcjEtPmluZGV4KCkpOworICAgICAgICBOZXdFbGVtZW50LT5pbnRlcnNlY3RXaXRoQ29tcGxlbWVudCgqSXRlcjEsICpJdGVyMiwgQmVjYW1lWmVybyk7CisgICAgICAgIGlmICghQmVjYW1lWmVybykgeworICAgICAgICAgIEVsZW1lbnRzLnB1c2hfYmFjayhOZXdFbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgZGVsZXRlIE5ld0VsZW1lbnQ7CisgICAgICAgICsrSXRlcjE7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgeworICAgICAgICBTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPiAqTmV3RWxlbWVudCA9CisgICAgICAgICAgbmV3IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+KCpJdGVyMSk7CisgICAgICAgIEVsZW1lbnRzLnB1c2hfYmFjayhOZXdFbGVtZW50KTsKKyAgICAgICAgKytJdGVyMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb3B5IHRoZSByZW1haW5pbmcgZWxlbWVudHMKKyAgICB3aGlsZSAoSXRlcjEgIT0gUkhTMS5FbGVtZW50cy5lbmQoKSkgeworICAgICAgICBTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPiAqTmV3RWxlbWVudCA9CisgICAgICAgICAgbmV3IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+KCpJdGVyMSk7CisgICAgICAgIEVsZW1lbnRzLnB1c2hfYmFjayhOZXdFbGVtZW50KTsKKyAgICAgICAgKytJdGVyMTsKKyAgICAgIH0KKworICAgIHJldHVybjsKKyAgfQorCisgIHZvaWQgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqUkhTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICpSSFMyKSB7CisgICAgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoKlJIUzEsICpSSFMyKTsKKyAgfQorCisgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJzZWN0cygqUkhTKTsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIHdlIHNoYXJlIGFueSBiaXRzIGluIGNvbW1vbiB3aXRoIFJIUworICBib29sIGludGVyc2VjdHMoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTKSBjb25zdCB7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlcjEgPSBFbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIyID0gUkhTLkVsZW1lbnRzLmJlZ2luKCk7CisKKyAgICAvLyBDaGVjayBpZiBib3RoIGJpdG1hcHMgYXJlIGVtcHR5LgorICAgIGlmIChFbGVtZW50cy5lbXB0eSgpICYmIFJIUy5FbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTG9vcCB0aHJvdWdoLCBpbnRlcnNlY3Rpbmcgc3RvcHBpbmcgd2hlbiB3ZSBoaXQgYml0cyBpbiBjb21tb24uCisgICAgd2hpbGUgKEl0ZXIyICE9IFJIUy5FbGVtZW50cy5lbmQoKSkgeworICAgICAgaWYgKEl0ZXIxID09IEVsZW1lbnRzLmVuZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChJdGVyMS0+aW5kZXgoKSA+IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgaWYgKEl0ZXIxLT5pbmRleCgpID09IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgIGlmIChJdGVyMS0+aW50ZXJzZWN0cygqSXRlcjIpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICArK0l0ZXIxOworICAgICAgICArK0l0ZXIyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKytJdGVyMTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWZmIGFsbCBiaXRzIHNldCBpbiB0aGlzIFNwYXJzZUJpdFZlY3RvciBhcmUKKyAgLy8gYWxzbyBzZXQgaW4gUkhTLgorICBib29sIGNvbnRhaW5zKGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJlJIUykgY29uc3QgeworICAgIFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gUmVzdWx0KCp0aGlzKTsKKyAgICBSZXN1bHQgJj0gUkhTOworICAgIHJldHVybiAoUmVzdWx0ID09IFJIUyk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGZpcnN0IHNldCBiaXQgaW4gdGhlIGJpdG1hcC4gIFJldHVybiAtMSBpZiBubyBiaXRzIGFyZSBzZXQuCisgIGludCBmaW5kX2ZpcnN0KCkgY29uc3QgeworICAgIGlmIChFbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuIC0xOworICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+ICZGaXJzdCA9ICooRWxlbWVudHMuYmVnaW4oKSk7CisgICAgcmV0dXJuIChGaXJzdC5pbmRleCgpICogRWxlbWVudFNpemUpICsgRmlyc3QuZmluZF9maXJzdCgpOworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIFNwYXJzZUJpdFZlY3RvciBpcyBlbXB0eQorICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBFbGVtZW50cy5lbXB0eSgpOworICB9CisKKyAgdW5zaWduZWQgY291bnQoKSBjb25zdCB7CisgICAgdW5zaWduZWQgQml0Q291bnQgPSAwOworICAgIGZvciAoRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlciA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgICAgICBJdGVyICE9IEVsZW1lbnRzLmVuZCgpOworICAgICAgICAgKytJdGVyKQorICAgICAgQml0Q291bnQgKz0gSXRlci0+Y291bnQoKTsKKworICAgIHJldHVybiBCaXRDb3VudDsKKyAgfQorICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXRlcmF0b3IodGhpcyk7CisgIH0KKworICBpdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIHRydWUpOworICB9CisKKyAgLy8gR2V0IGEgaGFzaCB2YWx1ZSBmb3IgdGhpcyBiaXRtYXAuCisgIHVpbnQ2NF90IGdldEhhc2hWYWx1ZSgpIGNvbnN0IHsKKyAgICB1aW50NjRfdCBIYXNoVmFsID0gMDsKKyAgICBmb3IgKEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgICAgICAgSXRlciAhPSBFbGVtZW50cy5lbmQoKTsKKyAgICAgICAgICsrSXRlcikgeworICAgICAgSGFzaFZhbCBePSBJdGVyLT5pbmRleCgpOworICAgICAgSGFzaFZhbCBePSBJdGVyLT5nZXRIYXNoVmFsdWUoKTsKKyAgICB9CisgICAgcmV0dXJuIEhhc2hWYWw7CisgIH0KK307CisKKy8vIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBhbGxvdyBPciBhbmQgQW5kIHdpdGhvdXQgZGVyZWZlcmVuY2luZyBpbiB0aGUgdXNlcgorLy8gY29kZS4KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIGJvb2wgb3BlcmF0b3IgfD0oU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqUkhTKSB7CisgIHJldHVybiBMSFMgfD0gKlJIUzsKK30KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIGJvb2wgb3BlcmF0b3IgfD0oU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTKSB7CisgIHJldHVybiBMSFMtPm9wZXJhdG9yfD0oUkhTKTsKK30KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIGJvb2wgb3BlcmF0b3IgJj0oU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTKSB7CisgIHJldHVybiBMSFMtPm9wZXJhdG9yJj0oUkhTKTsKK30KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIGJvb2wgb3BlcmF0b3IgJj0oU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqUkhTKSB7CisgIHJldHVybiBMSFMgJj0gKlJIUzsKK30KKworLy8gQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBpbmZpeCB1bmlvbiwgaW50ZXJzZWN0aW9uLCBkaWZmZXJlbmNlIG9wZXJhdG9ycy4KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4KK29wZXJhdG9yfChjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZMSFMsCisgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTKSB7CisgIFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gUmVzdWx0KExIUyk7CisgIFJlc3VsdCB8PSBSSFM7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZT4KK2lubGluZSBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+CitvcGVyYXRvciYoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmTEhTLAorICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJlJIUykgeworICBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+IFJlc3VsdChMSFMpOworICBSZXN1bHQgJj0gUkhTOworICByZXR1cm4gUmVzdWx0OworfQorCit0ZW1wbGF0ZSA8dW5zaWduZWQgRWxlbWVudFNpemU+CitpbmxpbmUgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPgorb3BlcmF0b3ItKGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJkxIUywKKyAgICAgICAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZSSFMpIHsKKyAgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiBSZXN1bHQ7CisgIFJlc3VsdC5pbnRlcnNlY3RXaXRoQ29tcGxlbWVudChMSFMsIFJIUyk7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKworCisKKy8vIER1bXAgYSBTcGFyc2VCaXRWZWN0b3IgdG8gYSBzdHJlYW0KK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZT4KK3ZvaWQgZHVtcChjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZMSFMsIHJhd19vc3RyZWFtICZvdXQpIHsKKyAgb3V0IDw8ICJbIjsKKworICB0eXBlbmFtZSBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+OjppdGVyYXRvciBiaSA9IExIUy5iZWdpbigpLAorICAgIGJlID0gTEhTLmVuZCgpOworICBpZiAoYmkgIT0gYmUpIHsKKyAgICBvdXQgPDwgKmJpOworICAgIGZvciAoKytiaTsgYmkgIT0gYmU7ICsrYmkpIHsKKyAgICAgIG91dCA8PCAiICIgPDwgKmJpOworICAgIH0KKyAgfQorICBvdXQgPDwgIl1cbiI7Cit9Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU3RhdGlzdGljLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1N0YXRpc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTMxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1N0YXRpc3RpYy5oCkBAIC0wLDAgKzEsMTMyIEBACisvLz09PS0tIGxsdm0vQURUL1N0YXRpc3RpYy5oIC0gRWFzeSB3YXkgdG8gZXhwb3NlIHN0YXRzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSAnU3RhdGlzdGljJyBjbGFzcywgd2hpY2ggaXMgZGVzaWduZWQgdG8gYmUgYW4gZWFzeSB3YXkKKy8vIHRvIGV4cG9zZSB2YXJpb3VzIG1ldHJpY3MgZnJvbSBwYXNzZXMuICBUaGVzZSBzdGF0aXN0aWNzIGFyZSBwcmludGVkIGF0IHRoZQorLy8gZW5kIG9mIGEgcnVuIChmcm9tIGxsdm1fc2h1dGRvd24pLCB3aGVuIHRoZSAtc3RhdHMgY29tbWFuZCBsaW5lIG9wdGlvbiBpcworLy8gcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisvLworLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHJlcG9ydGluZyBpbmZvcm1hdGlvbiBsaWtlIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zCisvLyBzaW1wbGlmaWVkLCBvcHRpbWl6ZWQgb3IgcmVtb3ZlZCBieSB2YXJpb3VzIHRyYW5zZm9ybWF0aW9ucywgbGlrZSB0aGlzOgorLy8KKy8vIHN0YXRpYyBTdGF0aXN0aWMgTnVtSW5zdHNLaWxsZWQoImdjc2UiLCAiTnVtYmVyIG9mIGluc3RydWN0aW9ucyBraWxsZWQiKTsKKy8vCisvLyBMYXRlciwgaW4gdGhlIGNvZGU6ICsrTnVtSW5zdHNLaWxsZWQ7CisvLworLy8gTk9URTogU3RhdGlzdGljcyAqbXVzdCogYmUgZGVjbGFyZWQgYXMgZ2xvYmFsIHZhcmlhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NUQVRJU1RJQ19ICisjZGVmaW5lIExMVk1fQURUX1NUQVRJU1RJQ19ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9BdG9taWMuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIFN0YXRpc3RpYyB7CitwdWJsaWM6CisgIGNvbnN0IGNoYXIgKk5hbWU7CisgIGNvbnN0IGNoYXIgKkRlc2M7CisgIHZvbGF0aWxlIGxsdm06OnN5czo6Y2FzX2ZsYWcgVmFsdWU7CisgIGJvb2wgSW5pdGlhbGl6ZWQ7CisKKyAgbGx2bTo6c3lzOjpjYXNfZmxhZyBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIGNvbnN0IGNoYXIgKmdldERlc2MoKSBjb25zdCB7IHJldHVybiBEZXNjOyB9CisKKyAgLy8vIGNvbnN0cnVjdCAtIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBub24tZ2xvYmFsIHN0YXRpc3RpY3MuCisgIHZvaWQgY29uc3RydWN0KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlc2MpIHsKKyAgICBOYW1lID0gbmFtZTsgRGVzYyA9IGRlc2M7CisgICAgVmFsdWUgPSAwOyBJbml0aWFsaXplZCA9IDA7CisgIH0KKworICAvLyBBbGxvdyB1c2Ugb2YgdGhpcyBjbGFzcyBhcyB0aGUgdmFsdWUgaXRzZWxmLgorICBvcGVyYXRvciB1bnNpZ25lZCgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3I9KHVuc2lnbmVkIFZhbCkgeworICAgIFZhbHVlID0gVmFsOworICAgIHJldHVybiBpbml0KCk7CisgIH0KKyAgCisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3IrKygpIHsKKyAgICAvLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBhbmQgYWxsIHRob3NlIHRoYXQgZm9sbG93IGNhcmVmdWxseSB1c2UgYW4KKyAgICAvLyBhdG9taWMgb3BlcmF0aW9uIHRvIHVwZGF0ZSB0aGUgdmFsdWUgc2FmZWx5IGluIHRoZSBwcmVzZW5jZSBvZgorICAgIC8vIGNvbmN1cnJlbnQgYWNjZXNzZXMsIGJ1dCBub3QgdG8gcmVhZCB0aGUgcmV0dXJuIHZhbHVlLCBzbyB0aGUKKyAgICAvLyByZXR1cm4gdmFsdWUgaXMgbm90IHRocmVhZCBzYWZlLgorICAgIHN5czo6QXRvbWljSW5jcmVtZW50KCZWYWx1ZSk7CisgICAgcmV0dXJuIGluaXQoKTsKKyAgfQorICAKKyAgdW5zaWduZWQgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBpbml0KCk7CisgICAgdW5zaWduZWQgT2xkVmFsdWUgPSBWYWx1ZTsKKyAgICBzeXM6OkF0b21pY0luY3JlbWVudCgmVmFsdWUpOworICAgIHJldHVybiBPbGRWYWx1ZTsKKyAgfQorICAKKyAgY29uc3QgU3RhdGlzdGljICZvcGVyYXRvci0tKCkgeworICAgIHN5czo6QXRvbWljRGVjcmVtZW50KCZWYWx1ZSk7CisgICAgcmV0dXJuIGluaXQoKTsKKyAgfQorICAKKyAgdW5zaWduZWQgb3BlcmF0b3ItLShpbnQpIHsKKyAgICBpbml0KCk7CisgICAgdW5zaWduZWQgT2xkVmFsdWUgPSBWYWx1ZTsKKyAgICBzeXM6OkF0b21pY0RlY3JlbWVudCgmVmFsdWUpOworICAgIHJldHVybiBPbGRWYWx1ZTsKKyAgfQorICAKKyAgY29uc3QgU3RhdGlzdGljICZvcGVyYXRvcis9KGNvbnN0IHVuc2lnbmVkICZWKSB7CisgICAgc3lzOjpBdG9taWNBZGQoJlZhbHVlLCBWKTsKKyAgICByZXR1cm4gaW5pdCgpOworICB9CisgIAorICBjb25zdCBTdGF0aXN0aWMgJm9wZXJhdG9yLT0oY29uc3QgdW5zaWduZWQgJlYpIHsKKyAgICBzeXM6OkF0b21pY0FkZCgmVmFsdWUsIC1WKTsKKyAgICByZXR1cm4gaW5pdCgpOworICB9CisgIAorICBjb25zdCBTdGF0aXN0aWMgJm9wZXJhdG9yKj0oY29uc3QgdW5zaWduZWQgJlYpIHsKKyAgICBzeXM6OkF0b21pY011bCgmVmFsdWUsIFYpOworICAgIHJldHVybiBpbml0KCk7CisgIH0KKyAgCisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3IvPShjb25zdCB1bnNpZ25lZCAmVikgeworICAgIHN5czo6QXRvbWljRGl2KCZWYWx1ZSwgVik7CisgICAgcmV0dXJuIGluaXQoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFN0YXRpc3RpYyAmaW5pdCgpIHsKKyAgICBib29sIHRtcCA9IEluaXRpYWxpemVkOworICAgIHN5czo6TWVtb3J5RmVuY2UoKTsKKyAgICBpZiAoIXRtcCkgUmVnaXN0ZXJTdGF0aXN0aWMoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgdm9pZCBSZWdpc3RlclN0YXRpc3RpYygpOworfTsKKworLy8gU1RBVElTVElDIC0gQSBtYWNybyB0byBtYWtlIGRlZmluaXRpb24gb2Ygc3RhdGlzdGljcyByZWFsbHkgc2ltcGxlLiAgVGhpcworLy8gYXV0b21hdGljYWxseSBwYXNzZXMgdGhlIERFQlVHX1RZUEUgb2YgdGhlIGZpbGUgaW50byB0aGUgc3RhdGlzdGljLgorI2RlZmluZSBTVEFUSVNUSUMoVkFSTkFNRSwgREVTQykgXAorICBzdGF0aWMgbGx2bTo6U3RhdGlzdGljIFZBUk5BTUUgPSB7IERFQlVHX1RZUEUsIERFU0MsIDAsIDAgfQorCisvLy8gXGJyaWVmIEVuYWJsZSB0aGUgY29sbGVjdGlvbiBhbmQgcHJpbnRpbmcgb2Ygc3RhdGlzdGljcy4KK3ZvaWQgRW5hYmxlU3RhdGlzdGljcygpOworCisvLy8gXGJyaWVmIFByaW50IHN0YXRpc3RpY3MgdG8gdGhlIGZpbGUgcmV0dXJuZWQgYnkgQ3JlYXRlSW5mb091dHB1dEZpbGUoKS4KK3ZvaWQgUHJpbnRTdGF0aXN0aWNzKCk7CisKKy8vLyBcYnJpZWYgUHJpbnQgc3RhdGlzdGljcyB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KK3ZvaWQgUHJpbnRTdGF0aXN0aWNzKHJhd19vc3RyZWFtICZPUyk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1M2FkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8vPT09LS0gbGx2bS9BRFQvU3RyaW5nRXh0cmFzLmggLSBVc2VmdWwgc3RyaW5nIGZ1bmN0aW9ucyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBzdHJpbmdzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1RSSU5HRVhUUkFTX0gKKyNkZWZpbmUgTExWTV9BRFRfU1RSSU5HRVhUUkFTX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQRmxvYXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKworLy8vIGhleGRpZ2l0IC0gUmV0dXJuIHRoZSAodXBwZXJjYXNlKSBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgZm9yIHRoZQorLy8vIGdpdmVuIG51bWJlciBcYXJnIFggKHdoaWNoIHNob3VsZCBiZSBsZXNzIHRoYW4gMTYpLgorc3RhdGljIGlubGluZSBjaGFyIGhleGRpZ2l0KHVuc2lnbmVkIFgpIHsKKyAgcmV0dXJuIFggPCAxMCA/ICcwJyArIFggOiAnQScgKyBYIC0gMTA7Cit9CisKKy8vLyB1dG9oZXhfYnVmZmVyIC0gRW1pdCB0aGUgc3BlY2lmaWVkIG51bWJlciBpbnRvIHRoZSBidWZmZXIgc3BlY2lmaWVkIGJ5CisvLy8gQnVmZmVyRW5kLCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLiAgVGhpcyBjYW4gYmUgdXNlZAorLy8vIGxpa2UgdGhpczogKG5vdGUgdGhhdCB0aGUgYnVmZmVyIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhhbmRsZSBhbnkgbnVtYmVyKToKKy8vLyAgICBjaGFyIEJ1ZmZlcls0MF07CisvLy8gICAgcHJpbnRmKCIweCVzIiwgdXRvaGV4X2J1ZmZlcihYLCBCdWZmZXIrNDApKTsKKy8vLworLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHVuc2lnbmVkIHR5cGVzLgorLy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnRUeT4KK3N0YXRpYyBpbmxpbmUgY2hhciAqdXRvaGV4X2J1ZmZlcihJbnRUeSBYLCBjaGFyICpCdWZmZXJFbmQpIHsKKyAgY2hhciAqQnVmUHRyID0gQnVmZmVyRW5kOworICAqLS1CdWZQdHIgPSAwOyAgICAgIC8vIE51bGwgdGVybWluYXRlIGJ1ZmZlci4KKyAgaWYgKFggPT0gMCkgeworICAgICotLUJ1ZlB0ciA9ICcwJzsgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2UuCisgICAgcmV0dXJuIEJ1ZlB0cjsKKyAgfQorCisgIHdoaWxlIChYKSB7CisgICAgdW5zaWduZWQgY2hhciBNb2QgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihYKSAmIDE1OworICAgICotLUJ1ZlB0ciA9IGhleGRpZ2l0KE1vZCk7CisgICAgWCA+Pj0gNDsKKyAgfQorICByZXR1cm4gQnVmUHRyOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHV0b2hleHN0cih1aW50NjRfdCBYKSB7CisgIGNoYXIgQnVmZmVyWzE3XTsKKyAgcmV0dXJuIHV0b2hleF9idWZmZXIoWCwgQnVmZmVyKzE3KTsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB1dG9zdHJfMzIodWludDMyX3QgWCwgYm9vbCBpc05lZyA9IGZhbHNlKSB7CisgIGNoYXIgQnVmZmVyWzExXTsKKyAgY2hhciAqQnVmUHRyID0gQnVmZmVyKzExOworCisgIGlmIChYID09IDApICotLUJ1ZlB0ciA9ICcwJzsgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2UuLi4KKworICB3aGlsZSAoWCkgeworICAgICotLUJ1ZlB0ciA9ICcwJyArIGNoYXIoWCAlIDEwKTsKKyAgICBYIC89IDEwOworICB9CisKKyAgaWYgKGlzTmVnKSAqLS1CdWZQdHIgPSAnLSc7ICAgLy8gQWRkIG5lZ2F0aXZlIHNpZ24uLi4KKworICByZXR1cm4gc3RkOjpzdHJpbmcoQnVmUHRyLCBCdWZmZXIrMTEpOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHV0b3N0cih1aW50NjRfdCBYLCBib29sIGlzTmVnID0gZmFsc2UpIHsKKyAgY2hhciBCdWZmZXJbMjFdOworICBjaGFyICpCdWZQdHIgPSBCdWZmZXIrMjE7CisKKyAgaWYgKFggPT0gMCkgKi0tQnVmUHRyID0gJzAnOyAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZS4uLgorCisgIHdoaWxlIChYKSB7CisgICAgKi0tQnVmUHRyID0gJzAnICsgY2hhcihYICUgMTApOworICAgIFggLz0gMTA7CisgIH0KKworICBpZiAoaXNOZWcpICotLUJ1ZlB0ciA9ICctJzsgICAvLyBBZGQgbmVnYXRpdmUgc2lnbi4uLgorICByZXR1cm4gc3RkOjpzdHJpbmcoQnVmUHRyLCBCdWZmZXIrMjEpOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgaXRvc3RyKGludDY0X3QgWCkgeworICBpZiAoWCA8IDApCisgICAgcmV0dXJuIHV0b3N0cihzdGF0aWNfY2FzdDx1aW50NjRfdD4oLVgpLCB0cnVlKTsKKyAgZWxzZQorICAgIHJldHVybiB1dG9zdHIoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KFgpKTsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBmdG9zdHIoZG91YmxlIFYpIHsKKyAgY2hhciBCdWZmZXJbMjAwXTsKKyAgc3ByaW50ZihCdWZmZXIsICIlMjAuNmUiLCBWKTsKKyAgY2hhciAqQiA9IEJ1ZmZlcjsKKyAgd2hpbGUgKCpCID09ICcgJykgKytCOworICByZXR1cm4gQjsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBmdG9zdHIoY29uc3QgQVBGbG9hdCYgVikgeworICBpZiAoJlYuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OklFRUVkb3VibGUpCisgICAgcmV0dXJuIGZ0b3N0cihWLmNvbnZlcnRUb0RvdWJsZSgpKTsKKyAgZWxzZSBpZiAoJlYuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OklFRUVzaW5nbGUpCisgICAgcmV0dXJuIGZ0b3N0cigoZG91YmxlKVYuY29udmVydFRvRmxvYXQoKSk7CisgIHJldHVybiAiPHVua25vd24gZm9ybWF0IGluIGZ0b3N0cj4iOyAvLyBlcnJvcgorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIExvd2VyY2FzZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmUykgeworICBzdGQ6OnN0cmluZyByZXN1bHQoUyk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBTLmxlbmd0aCgpOyArK2kpCisgICAgaWYgKGlzdXBwZXIocmVzdWx0W2ldKSkKKyAgICAgIHJlc3VsdFtpXSA9IGNoYXIodG9sb3dlcihyZXN1bHRbaV0pKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBVcHBlcmNhc2VTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJlMpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0KFMpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUy5sZW5ndGgoKTsgKytpKQorICAgIGlmIChpc2xvd2VyKHJlc3VsdFtpXSkpCisgICAgICByZXN1bHRbaV0gPSBjaGFyKHRvdXBwZXIocmVzdWx0W2ldKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vLyBTdHJJblN0ck5vQ2FzZSAtIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RyY2FzZXN0ci4gIExvY2F0ZXMgdGhlIGZpcnN0CisvLy8gb2NjdXJyZW5jZSBvZiBzdHJpbmcgJ3MxJyBpbiBzdHJpbmcgJ3MyJywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMKKy8vLyB0aGUgb2Zmc2V0IG9mIHMyIGluIHMxIG9yIG5wb3MgaWYgczIgY2Fubm90IGJlIGZvdW5kLgorU3RyaW5nUmVmOjpzaXplX3R5cGUgU3RySW5TdHJOb0Nhc2UoU3RyaW5nUmVmIHMxLCBTdHJpbmdSZWYgczIpOworCisvLy8gZ2V0VG9rZW4gLSBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIG9uZSB0b2tlbiBmcm9tIHNvdXJjZSwgaWdub3JpbmcgYW55CisvLy8gbGVhZGluZyBjaGFyYWN0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBEZWxpbWl0ZXJzIHN0cmluZywgYW5kIGVuZGluZyB0aGUKKy8vLyB0b2tlbiBhdCBhbnkgb2YgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIERlbGltaXRlcnMgc3RyaW5nLiAgSWYKKy8vLyB0aGVyZSBhcmUgbm8gdG9rZW5zIGluIHRoZSBzb3VyY2Ugc3RyaW5nLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisvLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwYWlyIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCB0b2tlbiBhbmQgdGhlCisvLy8gcmVtYWluaW5nIHRhaWwgc3RyaW5nLgorc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBnZXRUb2tlbihTdHJpbmdSZWYgU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGVsaW1pdGVycyA9ICIgXHRcblx2XGZcciIpOworCisvLy8gU3BsaXRTdHJpbmcgLSBTcGxpdCB1cCB0aGUgc3BlY2lmaWVkIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorLy8vIGRlbGltaXRlcnMsIGFwcGVuZGluZyB0aGUgcmVzdWx0IGZyYWdtZW50cyB0byB0aGUgb3V0cHV0IGxpc3QuCit2b2lkIFNwbGl0U3RyaW5nKFN0cmluZ1JlZiBTb3VyY2UsCisgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZPdXRGcmFnbWVudHMsCisgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEZWxpbWl0ZXJzID0gIiBcdFxuXHZcZlxyIik7CisKKy8vLyBIYXNoU3RyaW5nIC0gSGFzaCBmdW50aW9uIGZvciBzdHJpbmdzLgorLy8vCisvLy8gVGhpcyBpcyB0aGUgQmVybnN0ZWluIGhhc2ggZnVuY3Rpb24uCisvLworLy8gRklYTUU6IEludmVzdGlnYXRlIHdoZXRoZXIgYSBtb2RpZmllZCBiZXJuc3RlaW4gaGFzaCBmdW5jdGlvbiBwZXJmb3JtcworLy8gYmV0dGVyOiBodHRwOi8vZXRlcm5hbGx5Y29uZnV6emxlZC5jb20vdHV0cy9hbGdvcml0aG1zL2pzd190dXRfaGFzaGluZy5hc3B4CisvLyAgIFgqMzMrYyAtPiBYKjMzXmMKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgSGFzaFN0cmluZyhTdHJpbmdSZWYgU3RyLCB1bnNpZ25lZCBSZXN1bHQgPSAwKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdHIuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBSZXN1bHQgPSBSZXN1bHQgKiAzMyArIFN0cltpXTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ01hcC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWZmNmFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdNYXAuaApAQCAtMCwwICsxLDQ5MCBAQAorLy89PT0tLS0gU3RyaW5nTWFwLmggLSBTdHJpbmcgSGFzaCB0YWJsZSBtYXAgaW50ZXJmYWNlIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU3RyaW5nTWFwIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1RSSU5HTUFQX0gKKyNkZWZpbmUgTExWTV9BRFRfU1RSSU5HTUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVQ+CisgIGNsYXNzIFN0cmluZ01hcENvbnN0SXRlcmF0b3I7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVD4KKyAgY2xhc3MgU3RyaW5nTWFwSXRlcmF0b3I7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+CisgIGNsYXNzIFN0cmluZ01hcEVudHJ5OworCisvLy8gU3RyaW5nTWFwRW50cnlJbml0aWFsaXplciAtIFRoaXMgZGF0YXR5cGUgY2FuIGJlIHBhcnRpYWxseSBzcGVjaWFsaXplZCBmb3IKKy8vLyB2YXJpb3VzIGRhdGF0eXBlcyBpbiBhIHN0cmluZ21hcCB0byBhbGxvdyB0aGVtIHRvIGJlIGluaXRpYWxpemVkIHdoZW4gYW4KKy8vLyBlbnRyeSBpcyBkZWZhdWx0IGNvbnN0cnVjdGVkIGZvciB0aGUgbWFwLgordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeT4KK2NsYXNzIFN0cmluZ01hcEVudHJ5SW5pdGlhbGl6ZXIgeworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5pdFR5PgorICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+ICZULCBJbml0VHkgSW5pdFZhbCkgeworICAgIFQuc2Vjb25kID0gSW5pdFZhbDsKKyAgfQorfTsKKworCisvLy8gU3RyaW5nTWFwRW50cnlCYXNlIC0gU2hhcmVkIGJhc2UgY2xhc3Mgb2YgU3RyaW5nTWFwRW50cnkgaW5zdGFuY2VzLgorY2xhc3MgU3RyaW5nTWFwRW50cnlCYXNlIHsKKyAgdW5zaWduZWQgU3RyTGVuOworcHVibGljOgorICBleHBsaWNpdCBTdHJpbmdNYXBFbnRyeUJhc2UodW5zaWduZWQgTGVuKSA6IFN0ckxlbihMZW4pIHt9CisKKyAgdW5zaWduZWQgZ2V0S2V5TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gU3RyTGVuOyB9Cit9OworCisvLy8gU3RyaW5nTWFwSW1wbCAtIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgU3RyaW5nTWFwIHRoYXQgaXMgc2hhcmVkIGFtb25nCisvLy8gYWxsIG9mIGl0cyBpbnN0YW50aWF0aW9ucy4KK2NsYXNzIFN0cmluZ01hcEltcGwgeworcHVibGljOgorICAvLy8gSXRlbUJ1Y2tldCAtIFRoZSBoYXNoIHRhYmxlIGNvbnNpc3RzIG9mIGFuIGFycmF5IG9mIHRoZXNlLiAgSWYgSXRlbSBpcworICAvLy8gbm9uLW51bGwsIHRoaXMgaXMgYW4gZXh0YW50IGVudHJ5LCBvdGhlcndpc2UsIGl0IGlzIGEgaG9sZS4KKyAgc3RydWN0IEl0ZW1CdWNrZXQgeworICAgIC8vLyBGdWxsSGFzaFZhbHVlIC0gVGhpcyByZW1lbWJlcnMgdGhlIGZ1bGwgaGFzaCB2YWx1ZSBvZiB0aGUga2V5IGZvcgorICAgIC8vLyBlYXN5IHNjYW5uaW5nLgorICAgIHVuc2lnbmVkIEZ1bGxIYXNoVmFsdWU7CisKKyAgICAvLy8gSXRlbSAtIFRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgaXRlbSBvYmplY3QuCisgICAgU3RyaW5nTWFwRW50cnlCYXNlICpJdGVtOworICB9OworCitwcm90ZWN0ZWQ6CisgIEl0ZW1CdWNrZXQgKlRoZVRhYmxlOworICB1bnNpZ25lZCBOdW1CdWNrZXRzOworICB1bnNpZ25lZCBOdW1JdGVtczsKKyAgdW5zaWduZWQgTnVtVG9tYnN0b25lczsKKyAgdW5zaWduZWQgSXRlbVNpemU7Citwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFN0cmluZ01hcEltcGwodW5zaWduZWQgaXRlbVNpemUpIDogSXRlbVNpemUoaXRlbVNpemUpIHsKKyAgICAvLyBJbml0aWFsaXplIHRoZSBtYXAgd2l0aCB6ZXJvIGJ1Y2tldHMgdG8gYWxsb2NhdGlvbi4KKyAgICBUaGVUYWJsZSA9IDA7CisgICAgTnVtQnVja2V0cyA9IDA7CisgICAgTnVtSXRlbXMgPSAwOworICAgIE51bVRvbWJzdG9uZXMgPSAwOworICB9CisgIFN0cmluZ01hcEltcGwodW5zaWduZWQgSW5pdFNpemUsIHVuc2lnbmVkIEl0ZW1TaXplKTsKKyAgdm9pZCBSZWhhc2hUYWJsZSgpOworCisgIC8vLyBTaG91bGRSZWhhc2ggLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgc2hvdWxkIGJlIHJlaGFzaGVkIGFmdGVyIGEgbmV3CisgIC8vLyBlbGVtZW50IHdhcyByZWNlbnRseSBpbnNlcnRlZC4KKyAgYm9vbCBTaG91bGRSZWhhc2goKSBjb25zdCB7CisgICAgLy8gSWYgdGhlIGhhc2ggdGFibGUgaXMgbm93IG1vcmUgdGhhbiAzLzQgZnVsbCwgb3IgaWYgZmV3ZXIgdGhhbiAxLzggb2YKKyAgICAvLyB0aGUgYnVja2V0cyBhcmUgZW1wdHkgKG1lYW5pbmcgdGhhdCBtYW55IGFyZSBmaWxsZWQgd2l0aCB0b21ic3RvbmVzKSwKKyAgICAvLyBncm93IHRoZSB0YWJsZS4KKyAgICByZXR1cm4gTnVtSXRlbXMqNCA+IE51bUJ1Y2tldHMqMyB8fAorICAgICAgICAgICBOdW1CdWNrZXRzLShOdW1JdGVtcytOdW1Ub21ic3RvbmVzKSA8IE51bUJ1Y2tldHMvODsKKyAgfQorCisgIC8vLyBMb29rdXBCdWNrZXRGb3IgLSBMb29rIHVwIHRoZSBidWNrZXQgdGhhdCB0aGUgc3BlY2lmaWVkIHN0cmluZyBzaG91bGQgZW5kCisgIC8vLyB1cCBpbi4gIElmIGl0IGFscmVhZHkgZXhpc3RzIGFzIGEga2V5IGluIHRoZSBtYXAsIHRoZSBJdGVtIHBvaW50ZXIgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIGJ1Y2tldCB3aWxsIGJlIG5vbi1udWxsLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIG51bGwuICBJbiBlaXRoZXIKKyAgLy8vIGNhc2UsIHRoZSBGdWxsSGFzaFZhbHVlIGZpZWxkIG9mIHRoZSBidWNrZXQgd2lsbCBiZSBzZXQgdG8gdGhlIGhhc2ggdmFsdWUKKyAgLy8vIG9mIHRoZSBzdHJpbmcuCisgIHVuc2lnbmVkIExvb2t1cEJ1Y2tldEZvcihTdHJpbmdSZWYgS2V5KTsKKworICAvLy8gRmluZEtleSAtIExvb2sgdXAgdGhlIGJ1Y2tldCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQga2V5LiBJZiBpdCBleGlzdHMKKyAgLy8vIGluIHRoZSBtYXAsIHJldHVybiB0aGUgYnVja2V0IG51bWJlciBvZiB0aGUga2V5LiAgT3RoZXJ3aXNlIHJldHVybiAtMS4KKyAgLy8vIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSBtYXAuCisgIGludCBGaW5kS2V5KFN0cmluZ1JlZiBLZXkpIGNvbnN0OworCisgIC8vLyBSZW1vdmVLZXkgLSBSZW1vdmUgdGhlIHNwZWNpZmllZCBTdHJpbmdNYXBFbnRyeSBmcm9tIHRoZSB0YWJsZSwgYnV0IGRvIG5vdAorICAvLy8gZGVsZXRlIGl0LiAgVGhpcyBhYm9ydHMgaWYgdGhlIHZhbHVlIGlzbid0IGluIHRoZSB0YWJsZS4KKyAgdm9pZCBSZW1vdmVLZXkoU3RyaW5nTWFwRW50cnlCYXNlICpWKTsKKworICAvLy8gUmVtb3ZlS2V5IC0gUmVtb3ZlIHRoZSBTdHJpbmdNYXBFbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUKKyAgLy8vIHRhYmxlLCByZXR1cm5pbmcgaXQuICBJZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgdGFibGUsIHRoaXMgcmV0dXJucyBudWxsLgorICBTdHJpbmdNYXBFbnRyeUJhc2UgKlJlbW92ZUtleShTdHJpbmdSZWYgS2V5KTsKK3ByaXZhdGU6CisgIHZvaWQgaW5pdCh1bnNpZ25lZCBTaXplKTsKK3B1YmxpYzoKKyAgc3RhdGljIFN0cmluZ01hcEVudHJ5QmFzZSAqZ2V0VG9tYnN0b25lVmFsKCkgeworICAgIHJldHVybiAoU3RyaW5nTWFwRW50cnlCYXNlKiktMTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUJ1Y2tldHMoKSBjb25zdCB7IHJldHVybiBOdW1CdWNrZXRzOyB9CisgIHVuc2lnbmVkIGdldE51bUl0ZW1zKCkgY29uc3QgeyByZXR1cm4gTnVtSXRlbXM7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtSXRlbXMgPT0gMDsgfQorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTnVtSXRlbXM7IH0KK307CisKKy8vLyBTdHJpbmdNYXBFbnRyeSAtIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgb25lIHZhbHVlIHRoYXQgaXMgaW5zZXJ0ZWQgaW50bworLy8vIGEgU3RyaW5nTWFwLiAgSXQgY29udGFpbnMgdGhlIFZhbHVlIGl0c2VsZiBhbmQgdGhlIGtleTogdGhlIHN0cmluZyBsZW5ndGgKKy8vLyBhbmQgZGF0YS4KK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+CitjbGFzcyBTdHJpbmdNYXBFbnRyeSA6IHB1YmxpYyBTdHJpbmdNYXBFbnRyeUJhc2UgeworcHVibGljOgorICBWYWx1ZVR5IHNlY29uZDsKKworICBleHBsaWNpdCBTdHJpbmdNYXBFbnRyeSh1bnNpZ25lZCBzdHJMZW4pCisgICAgOiBTdHJpbmdNYXBFbnRyeUJhc2Uoc3RyTGVuKSwgc2Vjb25kKCkge30KKyAgU3RyaW5nTWFwRW50cnkodW5zaWduZWQgc3RyTGVuLCBjb25zdCBWYWx1ZVR5ICZWKQorICAgIDogU3RyaW5nTWFwRW50cnlCYXNlKHN0ckxlbiksIHNlY29uZChWKSB7fQorCisgIFN0cmluZ1JlZiBnZXRLZXkoKSBjb25zdCB7IAorICAgIHJldHVybiBTdHJpbmdSZWYoZ2V0S2V5RGF0YSgpLCBnZXRLZXlMZW5ndGgoKSk7IAorICB9CisKKyAgY29uc3QgVmFsdWVUeSAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBzZWNvbmQ7IH0KKyAgVmFsdWVUeSAmZ2V0VmFsdWUoKSB7IHJldHVybiBzZWNvbmQ7IH0KKworICB2b2lkIHNldFZhbHVlKGNvbnN0IFZhbHVlVHkgJlYpIHsgc2Vjb25kID0gVjsgfQorCisgIC8vLyBnZXRLZXlEYXRhIC0gUmV0dXJuIHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIGRhdGEgdGhhdCBpcyB0aGUga2V5IGZvciB0aGlzCisgIC8vLyB2YWx1ZS4gIFRoZSBzdHJpbmcgZGF0YSBpcyBhbHdheXMgc3RvcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICAvLy8gU3RyaW5nTWFwRW50cnkgb2JqZWN0LgorICBjb25zdCBjaGFyICpnZXRLZXlEYXRhKCkgY29uc3Qge3JldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih0aGlzKzEpO30KKworICBjb25zdCBjaGFyICpmaXJzdCgpIGNvbnN0IHsgcmV0dXJuIGdldEtleURhdGEoKTsgfQorCisgIC8vLyBDcmVhdGUgLSBDcmVhdGUgYSBTdHJpbmdNYXBFbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgYW5kIGRlZmF1bHQKKyAgLy8vIGNvbnN0cnVjdCB0aGUgdmFsdWUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvclR5LCB0eXBlbmFtZSBJbml0VHlwZT4KKyAgc3RhdGljIFN0cmluZ01hcEVudHJ5ICpDcmVhdGUoY29uc3QgY2hhciAqS2V5U3RhcnQsIGNvbnN0IGNoYXIgKktleUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdG9yVHkgJkFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdFR5cGUgSW5pdFZhbCkgeworICAgIHVuc2lnbmVkIEtleUxlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihLZXlFbmQtS2V5U3RhcnQpOworCisgICAgLy8gT2theSwgdGhlIGl0ZW0gZG9lc24ndCBhbHJlYWR5IGV4aXN0LCBhbmQgJ0J1Y2tldCcgaXMgdGhlIGJ1Y2tldCB0byBmaWxsCisgICAgLy8gaW4uICBBbGxvY2F0ZSBhIG5ldyBpdGVtIHdpdGggc3BhY2UgZm9yIHRoZSBzdHJpbmcgYXQgdGhlIGVuZCBhbmQgYSBudWxsCisgICAgLy8gdGVybWluYXRvci4KKworICAgIHVuc2lnbmVkIEFsbG9jU2l6ZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplb2YoU3RyaW5nTWFwRW50cnkpKSsKKyAgICAgIEtleUxlbmd0aCsxOworICAgIHVuc2lnbmVkIEFsaWdubWVudCA9IGFsaWdub2Y8U3RyaW5nTWFwRW50cnk+KCk7CisKKyAgICBTdHJpbmdNYXBFbnRyeSAqTmV3SXRlbSA9CisgICAgICBzdGF0aWNfY2FzdDxTdHJpbmdNYXBFbnRyeSo+KEFsbG9jYXRvci5BbGxvY2F0ZShBbGxvY1NpemUsQWxpZ25tZW50KSk7CisKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdCB0aGUgdmFsdWUuCisgICAgbmV3IChOZXdJdGVtKSBTdHJpbmdNYXBFbnRyeShLZXlMZW5ndGgpOworCisgICAgLy8gQ29weSB0aGUgc3RyaW5nIGluZm9ybWF0aW9uLgorICAgIGNoYXIgKlN0ckJ1ZmZlciA9IGNvbnN0X2Nhc3Q8Y2hhcio+KE5ld0l0ZW0tPmdldEtleURhdGEoKSk7CisgICAgbWVtY3B5KFN0ckJ1ZmZlciwgS2V5U3RhcnQsIEtleUxlbmd0aCk7CisgICAgU3RyQnVmZmVyW0tleUxlbmd0aF0gPSAwOyAgLy8gTnVsbCB0ZXJtaW5hdGUgZm9yIGNvbnZlbmllbmNlIG9mIGNsaWVudHMuCisKKyAgICAvLyBJbml0aWFsaXplIHRoZSB2YWx1ZSBpZiB0aGUgY2xpZW50IHdhbnRzIHRvLgorICAgIFN0cmluZ01hcEVudHJ5SW5pdGlhbGl6ZXI8VmFsdWVUeT46OkluaXRpYWxpemUoKk5ld0l0ZW0sIEluaXRWYWwpOworICAgIHJldHVybiBOZXdJdGVtOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yVHk+CisgIHN0YXRpYyBTdHJpbmdNYXBFbnRyeSAqQ3JlYXRlKGNvbnN0IGNoYXIgKktleVN0YXJ0LCBjb25zdCBjaGFyICpLZXlFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRvclR5ICZBbGxvY2F0b3IpIHsKKyAgICByZXR1cm4gQ3JlYXRlKEtleVN0YXJ0LCBLZXlFbmQsIEFsbG9jYXRvciwgMCk7CisgIH0KKworCisgIC8vLyBDcmVhdGUgLSBDcmVhdGUgYSBTdHJpbmdNYXBFbnRyeSB3aXRoIG5vcm1hbCBtYWxsb2MvZnJlZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5pdFR5cGU+CisgIHN0YXRpYyBTdHJpbmdNYXBFbnRyeSAqQ3JlYXRlKGNvbnN0IGNoYXIgKktleVN0YXJ0LCBjb25zdCBjaGFyICpLZXlFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRUeXBlIEluaXRWYWwpIHsKKyAgICBNYWxsb2NBbGxvY2F0b3IgQTsKKyAgICByZXR1cm4gQ3JlYXRlKEtleVN0YXJ0LCBLZXlFbmQsIEEsIEluaXRWYWwpOworICB9CisKKyAgc3RhdGljIFN0cmluZ01hcEVudHJ5ICpDcmVhdGUoY29uc3QgY2hhciAqS2V5U3RhcnQsIGNvbnN0IGNoYXIgKktleUVuZCkgeworICAgIHJldHVybiBDcmVhdGUoS2V5U3RhcnQsIEtleUVuZCwgVmFsdWVUeSgpKTsKKyAgfQorCisgIC8vLyBHZXRTdHJpbmdNYXBFbnRyeUZyb21WYWx1ZSAtIEdpdmVuIGEgdmFsdWUgdGhhdCBpcyBrbm93biB0byBiZSBlbWJlZGRlZAorICAvLy8gaW50byBhIFN0cmluZ01hcEVudHJ5LCByZXR1cm4gdGhlIFN0cmluZ01hcEVudHJ5IGl0c2VsZi4KKyAgc3RhdGljIFN0cmluZ01hcEVudHJ5ICZHZXRTdHJpbmdNYXBFbnRyeUZyb21WYWx1ZShWYWx1ZVR5ICZWKSB7CisgICAgU3RyaW5nTWFwRW50cnkgKkVQdHIgPSAwOworICAgIGNoYXIgKlB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZWKSAtCisgICAgICAgICAgICAgICAgICAocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJkVQdHItPnNlY29uZCkgLQorICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KEVQdHIpKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8U3RyaW5nTWFwRW50cnkqPihQdHIpOworICB9CisgIHN0YXRpYyBjb25zdCBTdHJpbmdNYXBFbnRyeSAmR2V0U3RyaW5nTWFwRW50cnlGcm9tVmFsdWUoY29uc3QgVmFsdWVUeSAmVikgeworICAgIHJldHVybiBHZXRTdHJpbmdNYXBFbnRyeUZyb21WYWx1ZShjb25zdF9jYXN0PFZhbHVlVHkmPihWKSk7CisgIH0KKyAgCisgIC8vLyBHZXRTdHJpbmdNYXBFbnRyeUZyb21LZXlEYXRhIC0gR2l2ZW4ga2V5IGRhdGEgdGhhdCBpcyBrbm93biB0byBiZSBlbWJlZGRlZAorICAvLy8gaW50byBhIFN0cmluZ01hcEVudHJ5LCByZXR1cm4gdGhlIFN0cmluZ01hcEVudHJ5IGl0c2VsZi4KKyAgc3RhdGljIFN0cmluZ01hcEVudHJ5ICZHZXRTdHJpbmdNYXBFbnRyeUZyb21LZXlEYXRhKGNvbnN0IGNoYXIgKktleURhdGEpIHsKKyAgICBjaGFyICpQdHIgPSBjb25zdF9jYXN0PGNoYXIqPihLZXlEYXRhKSAtIHNpemVvZihTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pik7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFN0cmluZ01hcEVudHJ5Kj4oUHRyKTsKKyAgfQorICAKKworICAvLy8gRGVzdHJveSAtIERlc3Ryb3kgdGhpcyBTdHJpbmdNYXBFbnRyeSwgcmVsZWFzaW5nIG1lbW9yeSBiYWNrIHRvIHRoZQorICAvLy8gc3BlY2lmaWVkIGFsbG9jYXRvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yVHk+CisgIHZvaWQgRGVzdHJveShBbGxvY2F0b3JUeSAmQWxsb2NhdG9yKSB7CisgICAgLy8gRnJlZSBtZW1vcnkgcmVmZXJlbmNlZCBieSB0aGUgaXRlbS4KKyAgICB0aGlzLT5+U3RyaW5nTWFwRW50cnkoKTsKKyAgICBBbGxvY2F0b3IuRGVhbGxvY2F0ZSh0aGlzKTsKKyAgfQorCisgIC8vLyBEZXN0cm95IHRoaXMgb2JqZWN0LCByZWxlYXNpbmcgbWVtb3J5IGJhY2sgdG8gdGhlIG1hbGxvYyBhbGxvY2F0b3IuCisgIHZvaWQgRGVzdHJveSgpIHsKKyAgICBNYWxsb2NBbGxvY2F0b3IgQTsKKyAgICBEZXN0cm95KEEpOworICB9Cit9OworCisKKy8vLyBTdHJpbmdNYXAgLSBUaGlzIGlzIGFuIHVuY29udmVudGlvbmFsIG1hcCB0aGF0IGlzIHNwZWNpYWxpemVkIGZvciBoYW5kbGluZworLy8vIGtleXMgdGhhdCBhcmUgInN0cmluZ3MiLCB3aGljaCBhcmUgYmFzaWNhbGx5IHJhbmdlcyBvZiBieXRlcy4gVGhpcyBkb2VzIHNvbWUKKy8vLyBmdW5reSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgaGFzaGluZyB0aGluZ3MgdG8gbWFrZSBpdCBleHRyZW1lbHkgZWZmaWNpZW50LAorLy8vIHN0b3JpbmcgdGhlIHN0cmluZyBkYXRhICphZnRlciogdGhlIHZhbHVlIGluIHRoZSBtYXAuCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5LCB0eXBlbmFtZSBBbGxvY2F0b3JUeSA9IE1hbGxvY0FsbG9jYXRvcj4KK2NsYXNzIFN0cmluZ01hcCA6IHB1YmxpYyBTdHJpbmdNYXBJbXBsIHsKKyAgQWxsb2NhdG9yVHkgQWxsb2NhdG9yOworICB0eXBlZGVmIFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+IE1hcEVudHJ5VHk7CitwdWJsaWM6CisgIFN0cmluZ01hcCgpIDogU3RyaW5nTWFwSW1wbChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2l6ZW9mKE1hcEVudHJ5VHkpKSkge30KKyAgZXhwbGljaXQgU3RyaW5nTWFwKHVuc2lnbmVkIEluaXRpYWxTaXplKQorICAgIDogU3RyaW5nTWFwSW1wbChJbml0aWFsU2l6ZSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihNYXBFbnRyeVR5KSkpIHt9CisgIAorICBleHBsaWNpdCBTdHJpbmdNYXAoQWxsb2NhdG9yVHkgQSkKKyAgICA6IFN0cmluZ01hcEltcGwoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihNYXBFbnRyeVR5KSkpLCBBbGxvY2F0b3IoQSkge30KKworICBleHBsaWNpdCBTdHJpbmdNYXAoY29uc3QgU3RyaW5nTWFwICZSSFMpCisgICAgOiBTdHJpbmdNYXBJbXBsKHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplb2YoTWFwRW50cnlUeSkpKSB7CisgICAgYXNzZXJ0KFJIUy5lbXB0eSgpICYmCisgICAgICAgICAgICJDb3B5IGN0b3IgZnJvbSBub24tZW1wdHkgc3RyaW5nbWFwIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7CisgIH0KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU3RyaW5nTWFwICZSSFMpIHsKKyAgICBhc3NlcnQoUkhTLmVtcHR5KCkgJiYKKyAgICAgICAgICAgImFzc2lnbm1lbnQgZnJvbSBub24tZW1wdHkgc3RyaW5nbWFwIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7CisgICAgY2xlYXIoKTsKKyAgfQorCisKKyAgQWxsb2NhdG9yVHkgJmdldEFsbG9jYXRvcigpIHsgcmV0dXJuIEFsbG9jYXRvcjsgfQorICBjb25zdCBBbGxvY2F0b3JUeSAmZ2V0QWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gQWxsb2NhdG9yOyB9CisKKyAgdHlwZWRlZiBjb25zdCBjaGFyKiBrZXlfdHlwZTsKKyAgdHlwZWRlZiBWYWx1ZVR5IG1hcHBlZF90eXBlOworICB0eXBlZGVmIFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+IHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKworICB0eXBlZGVmIFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT4gY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgU3RyaW5nTWFwSXRlcmF0b3I8VmFsdWVUeT4gaXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKFRoZVRhYmxlLCBOdW1CdWNrZXRzID09IDApOworICB9CisgIGl0ZXJhdG9yIGVuZCgpIHsKKyAgICByZXR1cm4gaXRlcmF0b3IoVGhlVGFibGUrTnVtQnVja2V0cywgdHJ1ZSk7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKFRoZVRhYmxlLCBOdW1CdWNrZXRzID09IDApOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoVGhlVGFibGUrTnVtQnVja2V0cywgdHJ1ZSk7CisgIH0KKworICBpdGVyYXRvciBmaW5kKFN0cmluZ1JlZiBLZXkpIHsKKyAgICBpbnQgQnVja2V0ID0gRmluZEtleShLZXkpOworICAgIGlmIChCdWNrZXQgPT0gLTEpIHJldHVybiBlbmQoKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoVGhlVGFibGUrQnVja2V0KTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoU3RyaW5nUmVmIEtleSkgY29uc3QgeworICAgIGludCBCdWNrZXQgPSBGaW5kS2V5KEtleSk7CisgICAgaWYgKEJ1Y2tldCA9PSAtMSkgcmV0dXJuIGVuZCgpOworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihUaGVUYWJsZStCdWNrZXQpOworICB9CisKKyAgIC8vLyBsb29rdXAgLSBSZXR1cm4gdGhlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleSwgb3IgYSBkZWZhdWx0CisgIC8vLyBjb25zdHJ1Y3RlZCB2YWx1ZSBpZiBubyBzdWNoIGVudHJ5IGV4aXN0cy4KKyAgVmFsdWVUeSBsb29rdXAoU3RyaW5nUmVmIEtleSkgY29uc3QgeworICAgIGNvbnN0X2l0ZXJhdG9yIGl0ID0gZmluZChLZXkpOworICAgIGlmIChpdCAhPSBlbmQoKSkKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIHJldHVybiBWYWx1ZVR5KCk7CisgIH0KKworICBWYWx1ZVR5JiBvcGVyYXRvcltdKFN0cmluZ1JlZiBLZXkpIHsKKyAgICByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZShLZXkpLmdldFZhbHVlKCk7CisgIH0KKworICBzaXplX3R5cGUgY291bnQoU3RyaW5nUmVmIEtleSkgY29uc3QgeworICAgIHJldHVybiBmaW5kKEtleSkgPT0gZW5kKCkgPyAwIDogMTsKKyAgfQorCisgIC8vLyBpbnNlcnQgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAuICBJZiB0aGUga2V5CisgIC8vLyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLCByZXR1cm4gZmFsc2UgYW5kIGlnbm9yZSB0aGUgcmVxdWVzdCwgb3RoZXJ3aXNlCisgIC8vLyBpbnNlcnQgaXQgYW5kIHJldHVybiB0cnVlLgorICBib29sIGluc2VydChNYXBFbnRyeVR5ICpLZXlWYWx1ZSkgeworICAgIHVuc2lnbmVkIEJ1Y2tldE5vID0gTG9va3VwQnVja2V0Rm9yKEtleVZhbHVlLT5nZXRLZXkoKSk7CisgICAgSXRlbUJ1Y2tldCAmQnVja2V0ID0gVGhlVGFibGVbQnVja2V0Tm9dOworICAgIGlmIChCdWNrZXQuSXRlbSAmJiBCdWNrZXQuSXRlbSAhPSBnZXRUb21ic3RvbmVWYWwoKSkKKyAgICAgIHJldHVybiBmYWxzZTsgIC8vIEFscmVhZHkgZXhpc3RzIGluIG1hcC4KKworICAgIGlmIChCdWNrZXQuSXRlbSA9PSBnZXRUb21ic3RvbmVWYWwoKSkKKyAgICAgIC0tTnVtVG9tYnN0b25lczsKKyAgICBCdWNrZXQuSXRlbSA9IEtleVZhbHVlOworICAgICsrTnVtSXRlbXM7CisKKyAgICBpZiAoU2hvdWxkUmVoYXNoKCkpCisgICAgICBSZWhhc2hUYWJsZSgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gY2xlYXIgLSBFbXB0aWVzIG91dCB0aGUgU3RyaW5nTWFwCisgIHZvaWQgY2xlYXIoKSB7CisgICAgaWYgKGVtcHR5KCkpIHJldHVybjsKKworICAgIC8vIFphcCBhbGwgdmFsdWVzLCByZXNldHRpbmcgdGhlIGtleXMgYmFjayB0byBub24tcHJlc2VudCAobm90IHRvbWJzdG9uZSksCisgICAgLy8gd2hpY2ggaXMgc2FmZSBiZWNhdXNlIHdlJ3JlIHJlbW92aW5nIGFsbCBlbGVtZW50cy4KKyAgICBmb3IgKEl0ZW1CdWNrZXQgKkkgPSBUaGVUYWJsZSwgKkUgPSBUaGVUYWJsZStOdW1CdWNrZXRzOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKEktPkl0ZW0gJiYgSS0+SXRlbSAhPSBnZXRUb21ic3RvbmVWYWwoKSkgeworICAgICAgICBzdGF0aWNfY2FzdDxNYXBFbnRyeVR5Kj4oSS0+SXRlbSktPkRlc3Ryb3koQWxsb2NhdG9yKTsKKyAgICAgICAgSS0+SXRlbSA9IDA7CisgICAgICB9CisgICAgfQorCisgICAgTnVtSXRlbXMgPSAwOworICB9CisKKyAgLy8vIEdldE9yQ3JlYXRlVmFsdWUgLSBMb29rIHVwIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSB0YWJsZS4gIElmIGEgdmFsdWUKKyAgLy8vIGV4aXN0cywgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCBkZWZhdWx0IGNvbnN0cnVjdCBhIHZhbHVlLCBpbnNlcnQgaXQsIGFuZAorICAvLy8gcmV0dXJuLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5pdFR5PgorICBTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5PiAmR2V0T3JDcmVhdGVWYWx1ZShTdHJpbmdSZWYgS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0VHkgVmFsKSB7CisgICAgdW5zaWduZWQgQnVja2V0Tm8gPSBMb29rdXBCdWNrZXRGb3IoS2V5KTsKKyAgICBJdGVtQnVja2V0ICZCdWNrZXQgPSBUaGVUYWJsZVtCdWNrZXROb107CisgICAgaWYgKEJ1Y2tldC5JdGVtICYmIEJ1Y2tldC5JdGVtICE9IGdldFRvbWJzdG9uZVZhbCgpKQorICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxNYXBFbnRyeVR5Kj4oQnVja2V0Lkl0ZW0pOworCisgICAgTWFwRW50cnlUeSAqTmV3SXRlbSA9CisgICAgICBNYXBFbnRyeVR5OjpDcmVhdGUoS2V5LmJlZ2luKCksIEtleS5lbmQoKSwgQWxsb2NhdG9yLCBWYWwpOworCisgICAgaWYgKEJ1Y2tldC5JdGVtID09IGdldFRvbWJzdG9uZVZhbCgpKQorICAgICAgLS1OdW1Ub21ic3RvbmVzOworICAgICsrTnVtSXRlbXM7CisKKyAgICAvLyBGaWxsIGluIHRoZSBidWNrZXQgZm9yIHRoZSBoYXNoIHRhYmxlLiAgVGhlIEZ1bGxIYXNoVmFsdWUgd2FzIGFscmVhZHkKKyAgICAvLyBmaWxsZWQgaW4gYnkgTG9va3VwQnVja2V0Rm9yLgorICAgIEJ1Y2tldC5JdGVtID0gTmV3SXRlbTsKKworICAgIGlmIChTaG91bGRSZWhhc2goKSkKKyAgICAgIFJlaGFzaFRhYmxlKCk7CisgICAgcmV0dXJuICpOZXdJdGVtOworICB9CisKKyAgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4gJkdldE9yQ3JlYXRlVmFsdWUoU3RyaW5nUmVmIEtleSkgeworICAgIHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKEtleSwgVmFsdWVUeSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbml0VHk+CisgIFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+ICZHZXRPckNyZWF0ZVZhbHVlKGNvbnN0IGNoYXIgKktleVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpLZXlFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRUeSBWYWwpIHsKKyAgICByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZShTdHJpbmdSZWYoS2V5U3RhcnQsIEtleUVuZCAtIEtleVN0YXJ0KSwgVmFsKTsKKyAgfQorCisgIFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+ICZHZXRPckNyZWF0ZVZhbHVlKGNvbnN0IGNoYXIgKktleVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpLZXlFbmQpIHsKKyAgICByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZShTdHJpbmdSZWYoS2V5U3RhcnQsIEtleUVuZCAtIEtleVN0YXJ0KSk7CisgIH0KKworICAvLy8gcmVtb3ZlIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIHBhaXIgZnJvbSB0aGUgbWFwLCBidXQgZG8gbm90CisgIC8vLyBlcmFzZSBpdC4gIFRoaXMgYWJvcnRzIGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBtYXAuCisgIHZvaWQgcmVtb3ZlKE1hcEVudHJ5VHkgKktleVZhbHVlKSB7CisgICAgUmVtb3ZlS2V5KEtleVZhbHVlKTsKKyAgfQorCisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgSSkgeworICAgIE1hcEVudHJ5VHkgJlYgPSAqSTsKKyAgICByZW1vdmUoJlYpOworICAgIFYuRGVzdHJveShBbGxvY2F0b3IpOworICB9CisKKyAgYm9vbCBlcmFzZShTdHJpbmdSZWYgS2V5KSB7CisgICAgaXRlcmF0b3IgSSA9IGZpbmQoS2V5KTsKKyAgICBpZiAoSSA9PSBlbmQoKSkgcmV0dXJuIGZhbHNlOworICAgIGVyYXNlKEkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgflN0cmluZ01hcCgpIHsKKyAgICBjbGVhcigpOworICAgIGZyZWUoVGhlVGFibGUpOworICB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+CitjbGFzcyBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yIHsKK3Byb3RlY3RlZDoKKyAgU3RyaW5nTWFwSW1wbDo6SXRlbUJ1Y2tldCAqUHRyOworcHVibGljOgorICB0eXBlZGVmIFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+IHZhbHVlX3R5cGU7CisKKyAgZXhwbGljaXQgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcihTdHJpbmdNYXBJbXBsOjpJdGVtQnVja2V0ICpCdWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb0FkdmFuY2UgPSBmYWxzZSkKKyAgOiBQdHIoQnVja2V0KSB7CisgICAgaWYgKCFOb0FkdmFuY2UpIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCk7CisgIH0KKworICBjb25zdCB2YWx1ZV90eXBlICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pio+KFB0ci0+SXRlbSk7CisgIH0KKyAgY29uc3QgdmFsdWVfdHlwZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RyaW5nTWFwRW50cnk8VmFsdWVUeT4qPihQdHItPkl0ZW0pOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cmluZ01hcENvbnN0SXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBQdHIgPT0gUkhTLlB0cjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RyaW5nTWFwQ29uc3RJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ciAhPSBSSFMuUHRyOworICB9CisKKyAgaW5saW5lIFN0cmluZ01hcENvbnN0SXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAgICAgICAgIC8vIFByZWluY3JlbWVudAorICAgICsrUHRyOworICAgIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFN0cmluZ01hcENvbnN0SXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgICAgICAgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgQWR2YW5jZVBhc3RFbXB0eUJ1Y2tldHMoKSB7CisgICAgd2hpbGUgKFB0ci0+SXRlbSA9PSAwIHx8IFB0ci0+SXRlbSA9PSBTdHJpbmdNYXBJbXBsOjpnZXRUb21ic3RvbmVWYWwoKSkKKyAgICAgICsrUHRyOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5PgorY2xhc3MgU3RyaW5nTWFwSXRlcmF0b3IgOiBwdWJsaWMgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFN0cmluZ01hcEl0ZXJhdG9yKFN0cmluZ01hcEltcGw6Okl0ZW1CdWNrZXQgKkJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb0FkdmFuY2UgPSBmYWxzZSkKKyAgICA6IFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT4oQnVja2V0LCBOb0FkdmFuY2UpIHsKKyAgfQorICBTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5PiAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8U3RyaW5nTWFwRW50cnk8VmFsdWVUeT4qPih0aGlzLT5QdHItPkl0ZW0pOworICB9CisgIFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+ICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pio+KHRoaXMtPlB0ci0+SXRlbSk7CisgIH0KK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ1JlZi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdSZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzc1NmY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdSZWYuaApAQCAtMCwwICsxLDQzMiBAQAorLy89PT0tLS0gU3RyaW5nUmVmLmggLSBDb25zdGFudCBTdHJpbmcgUmVmZXJlbmNlIFdyYXBwZXIgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TVFJJTkdSRUZfSAorI2RlZmluZSBMTFZNX0FEVF9TVFJJTkdSRUZfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKyAgY2xhc3MgQVBJbnQ7CisKKyAgLy8vIFN0cmluZ1JlZiAtIFJlcHJlc2VudCBhIGNvbnN0YW50IHJlZmVyZW5jZSB0byBhIHN0cmluZywgaS5lLiBhIGNoYXJhY3RlcgorICAvLy8gYXJyYXkgYW5kIGEgbGVuZ3RoLCB3aGljaCBuZWVkIG5vdCBiZSBudWxsIHRlcm1pbmF0ZWQuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBvd24gdGhlIHN0cmluZyBkYXRhLCBpdCBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGluCisgIC8vLyBzaXR1YXRpb25zIHdoZXJlIHRoZSBjaGFyYWN0ZXIgZGF0YSByZXNpZGVzIGluIHNvbWUgb3RoZXIgYnVmZmVyLCB3aG9zZQorICAvLy8gbGlmZXRpbWUgZXh0ZW5kcyBwYXN0IHRoYXQgb2YgdGhlIFN0cmluZ1JlZi4gRm9yIHRoaXMgcmVhc29uLCBpdCBpcyBub3QgaW4KKyAgLy8vIGdlbmVyYWwgc2FmZSB0byBzdG9yZSBhIFN0cmluZ1JlZi4KKyAgY2xhc3MgU3RyaW5nUmVmIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgY29uc3QgY2hhciAqaXRlcmF0b3I7CisgICAgdHlwZWRlZiBjb25zdCBjaGFyICpjb25zdF9pdGVyYXRvcjsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IG5wb3MgPSB+c2l6ZV90KDApOworICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKworICBwcml2YXRlOgorICAgIC8vLyBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZywgaW4gYW4gZXh0ZXJuYWwgYnVmZmVyLgorICAgIGNvbnN0IGNoYXIgKkRhdGE7CisKKyAgICAvLy8gVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgorICAgIHNpemVfdCBMZW5ndGg7CisKKyAgICAvLyBXb3JrYXJvdW5kIFBSNTQ4MjogbmVhcmx5IGFsbCBnY2MgNC54IG1pc2NvbXBpbGUgU3RyaW5nUmVmIGFuZCBzdGQ6Om1pbigpCisgICAgLy8gQ2hhbmdpbmcgdGhlIGFyZyBvZiBtaW4gdG8gYmUgYW4gaW50ZWdlciwgaW5zdGVhZCBvZiBhIHJlZmVyZW5jZSB0byBhbgorICAgIC8vIGludGVnZXIgd29ya3MgYXJvdW5kIHRoaXMgYnVnLgorICAgIHN0YXRpYyBzaXplX3QgbWluKHNpemVfdCBhLCBzaXplX3QgYikgeyByZXR1cm4gYSA8IGIgPyBhIDogYjsgfQorICAgIHN0YXRpYyBzaXplX3QgbWF4KHNpemVfdCBhLCBzaXplX3QgYikgeyByZXR1cm4gYSA+IGIgPyBhIDogYjsgfQorCisgIHB1YmxpYzoKKyAgICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgICAgLy8vIEB7CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIGVtcHR5IHN0cmluZyByZWYuCisgICAgLyppbXBsaWNpdCovIFN0cmluZ1JlZigpIDogRGF0YSgwKSwgTGVuZ3RoKDApIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGEgc3RyaW5nIHJlZiBmcm9tIGEgY3N0cmluZy4KKyAgICAvKmltcGxpY2l0Ki8gU3RyaW5nUmVmKGNvbnN0IGNoYXIgKlN0cikKKyAgICAgIDogRGF0YShTdHIpLCBMZW5ndGgoOjpzdHJsZW4oU3RyKSkge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYSBzdHJpbmcgcmVmIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGguCisgICAgLyppbXBsaWNpdCovIFN0cmluZ1JlZihjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKQorICAgICAgOiBEYXRhKGRhdGEpLCBMZW5ndGgobGVuZ3RoKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhIHN0cmluZyByZWYgZnJvbSBhbiBzdGQ6OnN0cmluZy4KKyAgICAvKmltcGxpY2l0Ki8gU3RyaW5nUmVmKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpCisgICAgICA6IERhdGEoU3RyLmRhdGEoKSksIExlbmd0aChTdHIubGVuZ3RoKCkpIHt9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgSXRlcmF0b3JzCisgICAgLy8vIEB7CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKworICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIERhdGEgKyBMZW5ndGg7IH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBTdHJpbmcgT3BlcmF0aW9ucworICAgIC8vLyBAeworCisgICAgLy8vIGRhdGEgLSBHZXQgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nICh3aGljaCBtYXkgbm90IGJlIG51bGwKKyAgICAvLy8gdGVybWluYXRlZCkuCisgICAgY29uc3QgY2hhciAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKworICAgIC8vLyBlbXB0eSAtIENoZWNrIGlmIHRoZSBzdHJpbmcgaXMgZW1wdHkuCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIExlbmd0aCA9PSAwOyB9CisKKyAgICAvLy8gc2l6ZSAtIEdldCB0aGUgc3RyaW5nIHNpemUuCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBMZW5ndGg7IH0KKworICAgIC8vLyBmcm9udCAtIEdldCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuCisgICAgY2hhciBmcm9udCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgICByZXR1cm4gRGF0YVswXTsKKyAgICB9CisKKyAgICAvLy8gYmFjayAtIEdldCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KKyAgICBjaGFyIGJhY2soKSBjb25zdCB7CisgICAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgICAgcmV0dXJuIERhdGFbTGVuZ3RoLTFdOworICAgIH0KKworICAgIC8vLyBlcXVhbHMgLSBDaGVjayBmb3Igc3RyaW5nIGVxdWFsaXR5LCB0aGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KKyAgICAvLy8gY29tcGFyZSgpIHdoZW4gdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGluZXF1YWwgc3RyaW5ncyBpc24ndCBuZWVkZWQuCisgICAgYm9vbCBlcXVhbHMoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICAgICAgcmV0dXJuIChMZW5ndGggPT0gUkhTLkxlbmd0aCAmJgorICAgICAgICAgICAgICBtZW1jbXAoRGF0YSwgUkhTLkRhdGEsIFJIUy5MZW5ndGgpID09IDApOworICAgIH0KKworICAgIC8vLyBlcXVhbHNfbG93ZXIgLSBDaGVjayBmb3Igc3RyaW5nIGVxdWFsaXR5LCBpZ25vcmluZyBjYXNlLgorICAgIGJvb2wgZXF1YWxzX2xvd2VyKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMZW5ndGggPT0gUkhTLkxlbmd0aCAmJiBjb21wYXJlX2xvd2VyKFJIUykgPT0gMDsKKyAgICB9CisKKyAgICAvLy8gY29tcGFyZSAtIENvbXBhcmUgdHdvIHN0cmluZ3M7IHRoZSByZXN1bHQgaXMgLTEsIDAsIG9yIDEgaWYgdGhpcyBzdHJpbmcKKyAgICAvLy8gaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBcYXJnIFJIUy4KKyAgICBpbnQgY29tcGFyZShTdHJpbmdSZWYgUkhTKSBjb25zdCB7CisgICAgICAvLyBDaGVjayB0aGUgcHJlZml4IGZvciBhIG1pc21hdGNoLgorICAgICAgaWYgKGludCBSZXMgPSBtZW1jbXAoRGF0YSwgUkhTLkRhdGEsIG1pbihMZW5ndGgsIFJIUy5MZW5ndGgpKSkKKyAgICAgICAgcmV0dXJuIFJlcyA8IDAgPyAtMSA6IDE7CisKKyAgICAgIC8vIE90aGVyd2lzZSB0aGUgcHJlZml4ZXMgbWF0Y2gsIHNvIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbGVuZ3Rocy4KKyAgICAgIGlmIChMZW5ndGggPT0gUkhTLkxlbmd0aCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gTGVuZ3RoIDwgUkhTLkxlbmd0aCA/IC0xIDogMTsKKyAgICB9CisKKyAgICAvLy8gY29tcGFyZV9sb3dlciAtIENvbXBhcmUgdHdvIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuCisgICAgaW50IGNvbXBhcmVfbG93ZXIoU3RyaW5nUmVmIFJIUykgY29uc3Q7CisKKyAgICAvLy8gY29tcGFyZV9udW1lcmljIC0gQ29tcGFyZSB0d28gc3RyaW5ncywgdHJlYXRpbmcgc2VxdWVuY2VzIG9mIGRpZ2l0cyBhcworICAgIC8vLyBudW1iZXJzLgorICAgIGludCBjb21wYXJlX251bWVyaWMoU3RyaW5nUmVmIFJIUykgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgZWRpdCBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgc3RyaW5nIGFuZCBhbm90aGVyIAorICAgIC8vLyBzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBPdGhlciB0aGUgc3RyaW5nIHRvIGNvbXBhcmUgdGhpcyBzdHJpbmcgYWdhaW5zdC4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIEFsbG93UmVwbGFjZW1lbnRzIHdoZXRoZXIgdG8gYWxsb3cgY2hhcmFjdGVyCisgICAgLy8vIHJlcGxhY2VtZW50cyAoY2hhbmdlIG9uZSBjaGFyYWN0ZXIgaW50byBhbm90aGVyKSBhcyBhIHNpbmdsZQorICAgIC8vLyBvcGVyYXRpb24sIHJhdGhlciB0aGFuIGFzIHR3byBvcGVyYXRpb25zIChhbiBpbnNlcnRpb24gYW5kIGEKKyAgICAvLy8gcmVtb3ZhbCkuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXIgaW5zZXJ0aW9ucywgcmVtb3ZhbHMsCisgICAgLy8vIG9yIChpZiBccCBBbGxvd1JlcGxhY2VtZW50cyBpcyBcYyB0cnVlKSByZXBsYWNlbWVudHMgbmVlZGVkIHRvCisgICAgLy8vIHRyYW5zZm9ybSBvbmUgb2YgdGhlIGdpdmVuIHN0cmluZ3MgaW50byB0aGUgb3RoZXIuIElmIHplcm8sCisgICAgLy8vIHRoZSBzdHJpbmdzIGFyZSBpZGVudGljYWwuCisgICAgdW5zaWduZWQgZWRpdF9kaXN0YW5jZShTdHJpbmdSZWYgT3RoZXIsIGJvb2wgQWxsb3dSZXBsYWNlbWVudHMgPSB0cnVlKTsKKworICAgIC8vLyBzdHIgLSBHZXQgdGhlIGNvbnRlbnRzIGFzIGFuIHN0ZDo6c3RyaW5nLgorICAgIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6c3RyaW5nKERhdGEsIExlbmd0aCk7IH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBPcGVyYXRvciBPdmVybG9hZHMKKyAgICAvLy8gQHsKKworICAgIGNoYXIgb3BlcmF0b3JbXShzaXplX3QgSW5kZXgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChJbmRleCA8IExlbmd0aCAmJiAiSW52YWxpZCBpbmRleCEiKTsKKyAgICAgIHJldHVybiBEYXRhW0luZGV4XTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgVHlwZSBDb252ZXJzaW9ucworICAgIC8vLyBAeworCisgICAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RyKCk7CisgICAgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIFN0cmluZyBQcmVkaWNhdGVzCisgICAgLy8vIEB7CisKKyAgICAvLy8gc3RhcnRzd2l0aCAtIENoZWNrIGlmIHRoaXMgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBcYXJnIFByZWZpeC4KKyAgICBib29sIHN0YXJ0c3dpdGgoU3RyaW5nUmVmIFByZWZpeCkgY29uc3QgeworICAgICAgcmV0dXJuIExlbmd0aCA+PSBQcmVmaXguTGVuZ3RoICYmCisgICAgICAgICAgICAgbWVtY21wKERhdGEsIFByZWZpeC5EYXRhLCBQcmVmaXguTGVuZ3RoKSA9PSAwOworICAgIH0KKworICAgIC8vLyBlbmRzd2l0aCAtIENoZWNrIGlmIHRoaXMgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gXGFyZyBTdWZmaXguCisgICAgYm9vbCBlbmRzd2l0aChTdHJpbmdSZWYgU3VmZml4KSBjb25zdCB7CisgICAgICByZXR1cm4gTGVuZ3RoID49IFN1ZmZpeC5MZW5ndGggJiYKKyAgICAgICAgICAgICBtZW1jbXAoZW5kKCkgLSBTdWZmaXguTGVuZ3RoLCBTdWZmaXguRGF0YSwgU3VmZml4Lkxlbmd0aCkgPT0gMDsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgU3RyaW5nIFNlYXJjaGluZworICAgIC8vLyBAeworCisgICAgLy8vIGZpbmQgLSBTZWFyY2ggZm9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgXGFyZyBDIGluIHRoZSBzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm4gLSBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXGFyZyBDLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICBzaXplX3QgZmluZChjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3QgeworICAgICAgZm9yIChzaXplX3QgaSA9IG1pbihGcm9tLCBMZW5ndGgpLCBlID0gTGVuZ3RoOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKERhdGFbaV0gPT0gQykKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICAgIC8vLyBmaW5kIC0gU2VhcmNoIGZvciB0aGUgZmlyc3Qgc3RyaW5nIFxhcmcgU3RyIGluIHRoZSBzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm4gLSBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXGFyZyBTdHIsIG9yIG5wb3MgaWYgbm90CisgICAgLy8vIGZvdW5kLgorICAgIHNpemVfdCBmaW5kKFN0cmluZ1JlZiBTdHIsIHNpemVfdCBGcm9tID0gMCkgY29uc3Q7CisKKyAgICAvLy8gcmZpbmQgLSBTZWFyY2ggZm9yIHRoZSBsYXN0IGNoYXJhY3RlciBcYXJnIEMgaW4gdGhlIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybiAtIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxhcmcgQywgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgc2l6ZV90IHJmaW5kKGNoYXIgQywgc2l6ZV90IEZyb20gPSBucG9zKSBjb25zdCB7CisgICAgICBGcm9tID0gbWluKEZyb20sIExlbmd0aCk7CisgICAgICBzaXplX3QgaSA9IEZyb207CisgICAgICB3aGlsZSAoaSAhPSAwKSB7CisgICAgICAgIC0taTsKKyAgICAgICAgaWYgKERhdGFbaV0gPT0gQykKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICAgIC8vLyByZmluZCAtIFNlYXJjaCBmb3IgdGhlIGxhc3Qgc3RyaW5nIFxhcmcgU3RyIGluIHRoZSBzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm4gLSBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBcYXJnIFN0ciwgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgc2l6ZV90IHJmaW5kKFN0cmluZ1JlZiBTdHIpIGNvbnN0OworCisgICAgLy8vIGZpbmRfZmlyc3Rfb2YgLSBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIFxhcmcgQywKKyAgICAvLy8gb3IgbnBvcyBpZiBub3QgZm91bmQuIFNhbWUgYXMgZmluZC4KKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjaGFyIEMsIHNpemVfdCA9IDApIGNvbnN0IHsgcmV0dXJuIGZpbmQoQyk7IH0KKworICAgIC8vLyBmaW5kX2ZpcnN0X29mIC0gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBpbiBcYXJnCisgICAgLy8vIENoYXJzLCBvciBucG9zIGlmIG5vdCBmb3VuZC4KKyAgICAvLy8KKyAgICAvLy8gTm90ZTogTyhzaXplKCkgKiBDaGFycy5zaXplKCkpCisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoU3RyaW5nUmVmIENoYXJzLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0OworCisgICAgLy8vIGZpbmRfZmlyc3Rfbm90X29mIC0gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QKKyAgICAvLy8gXGFyZyBDIG9yIG5wb3MgaWYgbm90IGZvdW5kLgorICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3Q7CisKKyAgICAvLy8gZmluZF9maXJzdF9ub3Rfb2YgLSBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIG5vdAorICAgIC8vLyBpbiB0aGUgc3RyaW5nIFxhcmcgQ2hhcnMsIG9yIG5wb3MgaWYgbm90IGZvdW5kLgorICAgIC8vLworICAgIC8vLyBOb3RlOiBPKHNpemUoKSAqIENoYXJzLnNpemUoKSkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoU3RyaW5nUmVmIENoYXJzLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0OworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIEhlbHBmdWwgQWxnb3JpdGhtcworICAgIC8vLyBAeworCisgICAgLy8vIGNvdW50IC0gUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgXGFyZyBDIGluIHRoZSBzdHJpbmcuCisgICAgc2l6ZV90IGNvdW50KGNoYXIgQykgY29uc3QgeworICAgICAgc2l6ZV90IENvdW50ID0gMDsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTGVuZ3RoOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKERhdGFbaV0gPT0gQykKKyAgICAgICAgICArK0NvdW50OworICAgICAgcmV0dXJuIENvdW50OworICAgIH0KKworICAgIC8vLyBjb3VudCAtIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGVkIG9jY3VycmVuY2VzIG9mIFxhcmcgU3RyIGluCisgICAgLy8vIHRoZSBzdHJpbmcuCisgICAgc2l6ZV90IGNvdW50KFN0cmluZ1JlZiBTdHIpIGNvbnN0OworCisgICAgLy8vIGdldEFzSW50ZWdlciAtIFBhcnNlIHRoZSBjdXJyZW50IHN0cmluZyBhcyBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gcmFkaXguICBJZiBSYWRpeCBpcyBzcGVjaWZpZWQgYXMgemVybywgdGhpcyBkb2VzIHJhZGl4IGF1dG9zZW5zaW5nIHVzaW5nCisgICAgLy8vIGV4dGVuZGVkIEMgcnVsZXM6IDAgaXMgb2N0YWwsIDB4IGlzIGhleCwgMGIgaXMgYmluYXJ5LgorICAgIC8vLworICAgIC8vLyBJZiB0aGUgc3RyaW5nIGlzIGludmFsaWQgb3IgaWYgb25seSBhIHN1YnNldCBvZiB0aGUgc3RyaW5nIGlzIHZhbGlkLAorICAgIC8vLyB0aGlzIHJldHVybnMgdHJ1ZSB0byBzaWduaWZ5IHRoZSBlcnJvci4gIFRoZSBzdHJpbmcgaXMgY29uc2lkZXJlZAorICAgIC8vLyBlcnJvbmVvdXMgaWYgZW1wdHkuCisgICAgLy8vCisgICAgYm9vbCBnZXRBc0ludGVnZXIodW5zaWduZWQgUmFkaXgsIGxvbmcgbG9uZyAmUmVzdWx0KSBjb25zdDsKKyAgICBib29sIGdldEFzSW50ZWdlcih1bnNpZ25lZCBSYWRpeCwgdW5zaWduZWQgbG9uZyBsb25nICZSZXN1bHQpIGNvbnN0OworICAgIGJvb2wgZ2V0QXNJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCBpbnQgJlJlc3VsdCkgY29uc3Q7CisgICAgYm9vbCBnZXRBc0ludGVnZXIodW5zaWduZWQgUmFkaXgsIHVuc2lnbmVkICZSZXN1bHQpIGNvbnN0OworCisgICAgLy8gVE9ETzogUHJvdmlkZSBvdmVybG9hZHMgZm9yIGludC91bnNpZ25lZCB0aGF0IGNoZWNrIGZvciBvdmVyZmxvdy4KKworICAgIC8vLyBnZXRBc0ludGVnZXIgLSBQYXJzZSB0aGUgY3VycmVudCBzdHJpbmcgYXMgYW4gaW50ZWdlciBvZiB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIHJhZGl4LCBvciBvZiBhbiBhdXRvc2Vuc2VkIHJhZGl4IGlmIHRoZSByYWRpeCBnaXZlbgorICAgIC8vLyBpcyAwLiAgVGhlIGN1cnJlbnQgdmFsdWUgaW4gUmVzdWx0IGlzIGRpc2NhcmRlZCwgYW5kIHRoZQorICAgIC8vLyBzdG9yYWdlIGlzIGNoYW5nZWQgdG8gYmUgd2lkZSBlbm91Z2ggdG8gc3RvcmUgdGhlIHBhcnNlZAorICAgIC8vLyBpbnRlZ2VyLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBzb2xlbHkgY29uc2lzdCBvZiBhIHZhbGlkCisgICAgLy8vIG5vbi1lbXB0eSBudW1iZXIgaW4gdGhlIGFwcHJvcHJpYXRlIGJhc2UuCisgICAgLy8vCisgICAgLy8vIEFQSW50Ojpmcm9tU3RyaW5nIGlzIHN1cGVyZmljaWFsbHkgc2ltaWxhciBidXQgYXNzdW1lcyB0aGUKKyAgICAvLy8gc3RyaW5nIGlzIHdlbGwtZm9ybWVkIGluIHRoZSBnaXZlbiByYWRpeC4KKyAgICBib29sIGdldEFzSW50ZWdlcih1bnNpZ25lZCBSYWRpeCwgQVBJbnQgJlJlc3VsdCkgY29uc3Q7CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgU3Vic3RyaW5nIE9wZXJhdGlvbnMKKyAgICAvLy8gQHsKKworICAgIC8vLyBzdWJzdHIgLSBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHN1YnN0cmluZyBmcm9tIFtTdGFydCwgU3RhcnQgKyBOKS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFN0YXJ0IC0gVGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIgaW4gdGhlIHN1YnN0cmluZzsgaWYKKyAgICAvLy8gdGhlIGluZGV4IGlzIG5wb3Mgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGVuIHRoZQorICAgIC8vLyBlbXB0eSBzdWJzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIE4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5jbHVkZWQgaW4gdGhlIHN1YnN0cmluZy4gSWYgTgorICAgIC8vLyBleGNlZWRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5pbmcgaW4gdGhlIHN0cmluZywgdGhlIHN0cmluZworICAgIC8vLyBzdWZmaXggKHN0YXJ0aW5nIHdpdGggXGFyZyBTdGFydCkgd2lsbCBiZSByZXR1cm5lZC4KKyAgICBTdHJpbmdSZWYgc3Vic3RyKHNpemVfdCBTdGFydCwgc2l6ZV90IE4gPSBucG9zKSBjb25zdCB7CisgICAgICBTdGFydCA9IG1pbihTdGFydCwgTGVuZ3RoKTsKKyAgICAgIHJldHVybiBTdHJpbmdSZWYoRGF0YSArIFN0YXJ0LCBtaW4oTiwgTGVuZ3RoIC0gU3RhcnQpKTsKKyAgICB9CisKKyAgICAvLy8gc2xpY2UgLSBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHN1YnN0cmluZyBmcm9tIFtTdGFydCwgRW5kKS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFN0YXJ0IC0gVGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIgaW4gdGhlIHN1YnN0cmluZzsgaWYKKyAgICAvLy8gdGhlIGluZGV4IGlzIG5wb3Mgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGVuIHRoZQorICAgIC8vLyBlbXB0eSBzdWJzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIEVuZCAtIFRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIGluY2x1ZGUgaW4gdGhlCisgICAgLy8vIHN1YnN0cmluZy4gSWYgdGhpcyBpcyBucG9zLCBvciBsZXNzIHRoYW4gXGFyZyBTdGFydCwgb3IgZXhjZWVkcyB0aGUKKyAgICAvLy8gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtYWluaW5nIGluIHRoZSBzdHJpbmcsIHRoZSBzdHJpbmcgc3VmZml4CisgICAgLy8vIChzdGFydGluZyB3aXRoIFxhcmcgU3RhcnQpIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgU3RyaW5nUmVmIHNsaWNlKHNpemVfdCBTdGFydCwgc2l6ZV90IEVuZCkgY29uc3QgeworICAgICAgU3RhcnQgPSBtaW4oU3RhcnQsIExlbmd0aCk7CisgICAgICBFbmQgPSBtaW4obWF4KFN0YXJ0LCBFbmQpLCBMZW5ndGgpOworICAgICAgcmV0dXJuIFN0cmluZ1JlZihEYXRhICsgU3RhcnQsIEVuZCAtIFN0YXJ0KTsKKyAgICB9CisKKyAgICAvLy8gc3BsaXQgLSBTcGxpdCBpbnRvIHR3byBzdWJzdHJpbmdzIGFyb3VuZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhCisgICAgLy8vIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgLy8vCisgICAgLy8vIElmIFxhcmcgU2VwYXJhdG9yIGlzIGluIHRoZSBzdHJpbmcsIHRoZW4gdGhlIHJlc3VsdCBpcyBhIHBhaXIgKExIUywgUkhTKQorICAgIC8vLyBzdWNoIHRoYXQgKCp0aGlzID09IExIUyArIFNlcGFyYXRvciArIFJIUykgaXMgdHJ1ZSBhbmQgUkhTIGlzCisgICAgLy8vIG1heGltYWwuIElmIFxhcmcgU2VwYXJhdG9yIGlzIG5vdCBpbiB0aGUgc3RyaW5nLCB0aGVuIHRoZSByZXN1bHQgaXMgYQorICAgIC8vLyBwYWlyIChMSFMsIFJIUykgd2hlcmUgKCp0aGlzID09IExIUykgYW5kIChSSFMgPT0gIiIpLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gU2VwYXJhdG9yIC0gVGhlIGNoYXJhY3RlciB0byBzcGxpdCBvbi4KKyAgICAvLy8gXHJldHVybiAtIFRoZSBzcGxpdCBzdWJzdHJpbmdzLgorICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gc3BsaXQoY2hhciBTZXBhcmF0b3IpIGNvbnN0IHsKKyAgICAgIHNpemVfdCBJZHggPSBmaW5kKFNlcGFyYXRvcik7CisgICAgICBpZiAoSWR4ID09IG5wb3MpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigqdGhpcywgU3RyaW5nUmVmKCkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHNsaWNlKDAsIElkeCksIHNsaWNlKElkeCsxLCBucG9zKSk7CisgICAgfQorCisgICAgLy8vIHNwbGl0IC0gU3BsaXQgaW50byB0d28gc3Vic3RyaW5ncyBhcm91bmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYQorICAgIC8vLyBzZXBhcmF0b3Igc3RyaW5nLgorICAgIC8vLworICAgIC8vLyBJZiBcYXJnIFNlcGFyYXRvciBpcyBpbiB0aGUgc3RyaW5nLCB0aGVuIHRoZSByZXN1bHQgaXMgYSBwYWlyIChMSFMsIFJIUykKKyAgICAvLy8gc3VjaCB0aGF0ICgqdGhpcyA9PSBMSFMgKyBTZXBhcmF0b3IgKyBSSFMpIGlzIHRydWUgYW5kIFJIUyBpcworICAgIC8vLyBtYXhpbWFsLiBJZiBcYXJnIFNlcGFyYXRvciBpcyBub3QgaW4gdGhlIHN0cmluZywgdGhlbiB0aGUgcmVzdWx0IGlzIGEKKyAgICAvLy8gcGFpciAoTEhTLCBSSFMpIHdoZXJlICgqdGhpcyA9PSBMSFMpIGFuZCAoUkhTID09ICIiKS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFNlcGFyYXRvciAtIFRoZSBzdHJpbmcgdG8gc3BsaXQgb24uCisgICAgLy8vIFxyZXR1cm4gLSBUaGUgc3BsaXQgc3Vic3RyaW5ncy4KKyAgICBzdGQ6OnBhaXI8U3RyaW5nUmVmLCBTdHJpbmdSZWY+IHNwbGl0KFN0cmluZ1JlZiBTZXBhcmF0b3IpIGNvbnN0IHsKKyAgICAgIHNpemVfdCBJZHggPSBmaW5kKFNlcGFyYXRvcik7CisgICAgICBpZiAoSWR4ID09IG5wb3MpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigqdGhpcywgU3RyaW5nUmVmKCkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHNsaWNlKDAsIElkeCksIHNsaWNlKElkeCArIFNlcGFyYXRvci5zaXplKCksIG5wb3MpKTsKKyAgICB9CisKKyAgICAvLy8gc3BsaXQgLSBTcGxpdCBpbnRvIHN1YnN0cmluZ3MgYXJvdW5kIHRoZSBvY2N1cnJlbmNlcyBvZiBhIHNlcGFyYXRvcgorICAgIC8vLyBzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIEVhY2ggc3Vic3RyaW5nIGlzIHN0b3JlZCBpbiBcYXJnIEEuIElmIFxhcmcgTWF4U3BsaXQgaXMgPj0gMCwgYXQgbW9zdAorICAgIC8vLyBcYXJnIE1heFNwbGl0IHNwbGl0cyBhcmUgZG9uZSBhbmQgY29uc2VxdWVudGx5IDw9IFxhcmcgTWF4U3BsaXQKKyAgICAvLy8gZWxlbWVudHMgYXJlIGFkZGVkIHRvIEEuCisgICAgLy8vIElmIFxhcmcgS2VlcEVtcHR5IGlzIGZhbHNlLCBlbXB0eSBzdHJpbmdzIGFyZSBub3QgYWRkZWQgdG8gXGFyZyBBLiBUaGV5CisgICAgLy8vIHN0aWxsIGNvdW50IHdoZW4gY29uc2lkZXJpbmcgXGFyZyBNYXhTcGxpdAorICAgIC8vLyBBbiB1c2VmdWwgaW52YXJpYW50IGlzIHRoYXQKKyAgICAvLy8gU2VwYXJhdG9yLmpvaW4oQSkgPT0gKnRoaXMgaWYgTWF4U3BsaXQgPT0gLTEgYW5kIEtlZXBFbXB0eSA9PSB0cnVlCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBBIC0gV2hlcmUgdG8gcHV0IHRoZSBzdWJzdHJpbmdzLgorICAgIC8vLyBccGFyYW0gU2VwYXJhdG9yIC0gVGhlIHN0cmluZyB0byBzcGxpdCBvbi4KKyAgICAvLy8gXHBhcmFtIE1heFNwbGl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBzdHJpbmcgaXMgc3BsaXQuCisgICAgLy8vIFxwYXJhbSBLZWVwRW1wdHkgLSBUcnVlIGlmIGVtcHR5IHN1YnN0cmluZyBzaG91bGQgYmUgYWRkZWQuCisgICAgdm9pZCBzcGxpdChTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmQSwKKyAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZXBhcmF0b3IsIGludCBNYXhTcGxpdCA9IC0xLAorICAgICAgICAgICAgICAgYm9vbCBLZWVwRW1wdHkgPSB0cnVlKSBjb25zdDsKKworICAgIC8vLyByc3BsaXQgLSBTcGxpdCBpbnRvIHR3byBzdWJzdHJpbmdzIGFyb3VuZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEKKyAgICAvLy8gc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgICAvLy8KKyAgICAvLy8gSWYgXGFyZyBTZXBhcmF0b3IgaXMgaW4gdGhlIHN0cmluZywgdGhlbiB0aGUgcmVzdWx0IGlzIGEgcGFpciAoTEhTLCBSSFMpCisgICAgLy8vIHN1Y2ggdGhhdCAoKnRoaXMgPT0gTEhTICsgU2VwYXJhdG9yICsgUkhTKSBpcyB0cnVlIGFuZCBSSFMgaXMKKyAgICAvLy8gbWluaW1hbC4gSWYgXGFyZyBTZXBhcmF0b3IgaXMgbm90IGluIHRoZSBzdHJpbmcsIHRoZW4gdGhlIHJlc3VsdCBpcyBhCisgICAgLy8vIHBhaXIgKExIUywgUkhTKSB3aGVyZSAoKnRoaXMgPT0gTEhTKSBhbmQgKFJIUyA9PSAiIikuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBTZXBhcmF0b3IgLSBUaGUgY2hhcmFjdGVyIHRvIHNwbGl0IG9uLgorICAgIC8vLyBccmV0dXJuIC0gVGhlIHNwbGl0IHN1YnN0cmluZ3MuCisgICAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiByc3BsaXQoY2hhciBTZXBhcmF0b3IpIGNvbnN0IHsKKyAgICAgIHNpemVfdCBJZHggPSByZmluZChTZXBhcmF0b3IpOworICAgICAgaWYgKElkeCA9PSBucG9zKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoKnRoaXMsIFN0cmluZ1JlZigpKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzbGljZSgwLCBJZHgpLCBzbGljZShJZHgrMSwgbnBvcykpOworICAgIH0KKworICAgIC8vLyBAfQorICB9OworCisgIC8vLyBAbmFtZSBTdHJpbmdSZWYgQ29tcGFyaXNvbiBPcGVyYXRvcnMKKyAgLy8vIEB7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7CisgICAgcmV0dXJuIExIUy5lcXVhbHMoUkhTKTsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgeworICAgIHJldHVybiAhKExIUyA9PSBSSFMpOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KFN0cmluZ1JlZiBMSFMsIFN0cmluZ1JlZiBSSFMpIHsKKyAgICByZXR1cm4gTEhTLmNvbXBhcmUoUkhTKSA9PSAtMTsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgeworICAgIHJldHVybiBMSFMuY29tcGFyZShSSFMpICE9IDE7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgeworICAgIHJldHVybiBMSFMuY29tcGFyZShSSFMpID09IDE7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KFN0cmluZ1JlZiBMSFMsIFN0cmluZ1JlZiBSSFMpIHsKKyAgICByZXR1cm4gTEhTLmNvbXBhcmUoUkhTKSAhPSAtMTsKKyAgfQorCisgIC8vLyBAfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdTZXQuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1NWY2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU2V0LmgKQEAgLTAsMCArMSwzOCBAQAorLy89PT0tLS0gU3RyaW5nU2V0LmggLSBUaGUgTExWTSBDb21waWxlciBEcml2ZXIgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgU3RyaW5nU2V0IC0gQSBzZXQtbGlrZSB3cmFwcGVyIGZvciB0aGUgU3RyaW5nTWFwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1RSSU5HU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfU1RSSU5HU0VUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIFN0cmluZ1NldCAtIEEgd3JhcHBlciBmb3IgU3RyaW5nTWFwIHRoYXQgcHJvdmlkZXMgc2V0LWxpa2UKKyAgLy8vIGZ1bmN0aW9uYWxpdHkuICBPbmx5IGluc2VydCgpIGFuZCBjb3VudCgpIG1ldGhvZHMgYXJlIHVzZWQgYnkgbXkKKyAgLy8vIGNvZGUuCisgIHRlbXBsYXRlIDxjbGFzcyBBbGxvY2F0b3JUeSA9IGxsdm06Ok1hbGxvY0FsbG9jYXRvcj4KKyAgY2xhc3MgU3RyaW5nU2V0IDogcHVibGljIGxsdm06OlN0cmluZ01hcDxjaGFyLCBBbGxvY2F0b3JUeT4geworICAgIHR5cGVkZWYgbGx2bTo6U3RyaW5nTWFwPGNoYXIsIEFsbG9jYXRvclR5PiBiYXNlOworICBwdWJsaWM6CisgICAgYm9vbCBpbnNlcnQoU3RyaW5nUmVmIEluTGFuZykgeworICAgICAgYXNzZXJ0KCFJbkxhbmcuZW1wdHkoKSk7CisgICAgICBjb25zdCBjaGFyICpLZXlTdGFydCA9IEluTGFuZy5kYXRhKCk7CisgICAgICBjb25zdCBjaGFyICpLZXlFbmQgPSBLZXlTdGFydCArIEluTGFuZy5zaXplKCk7CisgICAgICByZXR1cm4gYmFzZTo6aW5zZXJ0KGxsdm06OlN0cmluZ01hcEVudHJ5PGNoYXI+OjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlKEtleVN0YXJ0LCBLZXlFbmQsIGJhc2U6OmdldEFsbG9jYXRvcigpLCAnKycpKTsKKyAgICB9CisgIH07Cit9CisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TVFJJTkdTRVRfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdTd2l0Y2guaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkNTY0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8vPT09LS0tIFN0cmluZ1N3aXRjaC5oIC0gU3dpdGNoLW9uLWxpdGVyYWwtc3RyaW5nIENvbnN0cnVjdCAtLS0tLS0tLS0tLS0tLT09PS8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vCisvLworLy8gIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTdHJpbmdTd2l0Y2ggdGVtcGxhdGUsIHdoaWNoIG1pbWljcyBhIHN3aXRjaCgpCisvLyAgc3RhdGVtZW50IHdob3NlIGNhc2VzIGFyZSBzdHJpbmcgbGl0ZXJhbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09LworI2lmbmRlZiBMTFZNX0FEVF9TVFJJTkdTV0lUQ0hfSAorI2RlZmluZSBMTFZNX0FEVF9TVFJJTkdTV0lUQ0hfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgQSBzd2l0Y2goKS1saWtlIHN0YXRlbWVudCB3aG9zZSBjYXNlcyBhcmUgc3RyaW5nIGxpdGVyYWxzLgorLy8vCisvLy8gVGhlIFN0cmluZ1N3aXRjaCBjbGFzcyBpcyBhIHNpbXBsZSBmb3JtIG9mIGEgc3dpdGNoKCkgc3RhdGVtZW50IHRoYXQKKy8vLyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIHN0cmluZyBtYXRjaGVzIG9uZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nCisvLy8gbGl0ZXJhbHMuIFRoZSB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciBccCBUIGlzIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0aGF0CisvLy8gd2lsbCBiZSByZXR1cm5lZCBmcm9tIHRoZSBzdHJpbmctc3dpdGNoIGV4cHJlc3Npb24uIEZvciBleGFtcGxlLAorLy8vIHRoZSBmb2xsb3dpbmcgY29kZSBzd2l0Y2hlcyBvbiB0aGUgbmFtZSBvZiBhIGNvbG9yIGluIFxjIGFyZ3ZbaV06CisvLy8KKy8vLyBcY29kZQorLy8vIENvbG9yIGNvbG9yID0gU3RyaW5nU3dpdGNoPENvbG9yPihhcmd2W2ldKQorLy8vICAgLkNhc2UoInJlZCIsIFJlZCkKKy8vLyAgIC5DYXNlKCJvcmFuZ2UiLCBPcmFuZ2UpCisvLy8gICAuQ2FzZSgieWVsbG93IiwgWWVsbG93KQorLy8vICAgLkNhc2UoImdyZWVuIiwgR3JlZW4pCisvLy8gICAuQ2FzZSgiYmx1ZSIsIEJsdWUpCisvLy8gICAuQ2FzZSgiaW5kaWdvIiwgSW5kaWdvKQorLy8vICAgLkNhc2VzKCJ2aW9sZXQiLCAicHVycGxlIiwgVmlvbGV0KQorLy8vICAgLkRlZmF1bHQoVW5rbm93bkNvbG9yKTsKKy8vLyBcZW5kY29kZQordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUiA9IFQ+CitjbGFzcyBTdHJpbmdTd2l0Y2ggeworICAvLy8gXGJyaWVmIFRoZSBzdHJpbmcgd2UgYXJlIG1hdGNoaW5nLgorICBTdHJpbmdSZWYgU3RyOworCisgIC8vLyBcYnJpZWYgVGhlIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBvZiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQsIG9uY2Uga25vd24sCisgIC8vLyBudWxsIGJlZm9yZSB0aGF0LgorICBjb25zdCBUICpSZXN1bHQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU3RyaW5nU3dpdGNoKFN0cmluZ1JlZiBTdHIpCisgIDogU3RyKFN0ciksIFJlc3VsdCgwKSB7IH0KKworICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICBTdHJpbmdTd2l0Y2gmIENhc2UoY29uc3QgY2hhciAoJlMpW05dLCBjb25zdCBUJiBWYWx1ZSkgeworICAgIGlmICghUmVzdWx0ICYmIE4tMSA9PSBTdHIuc2l6ZSgpICYmCisgICAgICAgIChzdGQ6Om1lbWNtcChTLCBTdHIuZGF0YSgpLCBOLTEpID09IDApKSB7CisgICAgICBSZXN1bHQgPSAmVmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGU8dW5zaWduZWQgTjAsIHVuc2lnbmVkIE4xPgorICBTdHJpbmdTd2l0Y2gmIENhc2VzKGNvbnN0IGNoYXIgKCZTMClbTjBdLCBjb25zdCBjaGFyICgmUzEpW04xXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlKFMwLCBWYWx1ZSkuQ2FzZShTMSwgVmFsdWUpOworICB9CisKKyAgdGVtcGxhdGU8dW5zaWduZWQgTjAsIHVuc2lnbmVkIE4xLCB1bnNpZ25lZCBOMj4KKyAgU3RyaW5nU3dpdGNoJiBDYXNlcyhjb25zdCBjaGFyICgmUzApW04wXSwgY29uc3QgY2hhciAoJlMxKVtOMV0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAoJlMyKVtOMl0sIGNvbnN0IFQmIFZhbHVlKSB7CisgICAgcmV0dXJuIENhc2UoUzAsIFZhbHVlKS5DYXNlKFMxLCBWYWx1ZSkuQ2FzZShTMiwgVmFsdWUpOworICB9CisKKyAgdGVtcGxhdGU8dW5zaWduZWQgTjAsIHVuc2lnbmVkIE4xLCB1bnNpZ25lZCBOMiwgdW5zaWduZWQgTjM+CisgIFN0cmluZ1N3aXRjaCYgQ2FzZXMoY29uc3QgY2hhciAoJlMwKVtOMF0sIGNvbnN0IGNoYXIgKCZTMSlbTjFdLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKCZTMilbTjJdLCBjb25zdCBjaGFyICgmUzMpW04zXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlKFMwLCBWYWx1ZSkuQ2FzZShTMSwgVmFsdWUpLkNhc2UoUzIsIFZhbHVlKS5DYXNlKFMzLCBWYWx1ZSk7CisgIH0KKworICB0ZW1wbGF0ZTx1bnNpZ25lZCBOMCwgdW5zaWduZWQgTjEsIHVuc2lnbmVkIE4yLCB1bnNpZ25lZCBOMywgdW5zaWduZWQgTjQ+CisgIFN0cmluZ1N3aXRjaCYgQ2FzZXMoY29uc3QgY2hhciAoJlMwKVtOMF0sIGNvbnN0IGNoYXIgKCZTMSlbTjFdLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKCZTMilbTjJdLCBjb25zdCBjaGFyICgmUzMpW04zXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICgmUzQpW040XSwgY29uc3QgVCYgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZShTMCwgVmFsdWUpLkNhc2UoUzEsIFZhbHVlKS5DYXNlKFMyLCBWYWx1ZSkuQ2FzZShTMywgVmFsdWUpCisgICAgICAuQ2FzZShTNCwgVmFsdWUpOworICB9CisKKyAgUiBEZWZhdWx0KGNvbnN0IFQmIFZhbHVlKSBjb25zdCB7CisgICAgaWYgKFJlc3VsdCkKKyAgICAgIHJldHVybiAqUmVzdWx0OworCisgICAgcmV0dXJuIFZhbHVlOworICB9CisKKyAgb3BlcmF0b3IgUigpIGNvbnN0IHsKKyAgICBhc3NlcnQoUmVzdWx0ICYmICJGZWxsIG9mZiB0aGUgZW5kIG9mIGEgc3RyaW5nLXN3aXRjaCIpOworICAgIHJldHVybiAqUmVzdWx0OworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU1RSSU5HU1dJVENIX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvVHJpZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9UcmllLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxNTBjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvVHJpZS5oCkBAIC0wLDAgKzEsMzM2IEBACisvLz09PS0gbGx2bS9BRFQvVHJpZS5oIC0tLS0gR2VuZXJpYyB0cmllIHN0cnVjdHVyZSAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgZGVmaW5lcyBhIGdlbmVyaWMgdHJpZSBzdHJ1Y3R1cmUuIFRoZSB0cmllIHN0cnVjdHVyZQorLy8gaXMgaW1tdXRhYmxlIGFmdGVyIGNyZWF0aW9uLCBidXQgdGhlIHBheWxvYWQgY29udGFpbmVkIHdpdGhpbiBpdCBpcyBub3QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9UUklFX0gKKyNkZWZpbmUgTExWTV9BRFRfVFJJRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ET1RHcmFwaFRyYWl0cy5oIgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gRklYTUU6CisvLyAtIExhYmVscyBhcmUgdXN1YWxseSBzbWFsbCwgbWF5YmUgaXQncyBiZXR0ZXIgdG8gdXNlIFNtYWxsU3RyaW5nCisvLyAtIFNob3VsZCB3ZSB1c2UgY2hhciogZHVyaW5nIGNvbnN0cnVjdGlvbj8KKy8vIC0gU2hvdWxkIHdlIHRlbXBsYXRpemUgRW1wdHkgd2l0aCB0cmFpdHMtbGlrZSBpbnRlcmZhY2U/CisKK3RlbXBsYXRlPGNsYXNzIFBheWxvYWQ+CitjbGFzcyBUcmllIHsKKyAgZnJpZW5kIGNsYXNzIEdyYXBoVHJhaXRzPFRyaWU8UGF5bG9hZD4gPjsKKyAgZnJpZW5kIGNsYXNzIERPVEdyYXBoVHJhaXRzPFRyaWU8UGF5bG9hZD4gPjsKK3B1YmxpYzoKKyAgY2xhc3MgTm9kZSB7CisgICAgZnJpZW5kIGNsYXNzIFRyaWU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Tm9kZSo+IE5vZGVWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZVZlY3RvclR5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZVZlY3RvclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgIHByaXZhdGU6CisgICAgZW51bSBRdWVyeVJlc3VsdCB7CisgICAgICBTYW1lICAgICAgICAgICA9IC0zLAorICAgICAgU3RyaW5nSXNQcmVmaXggPSAtMiwKKyAgICAgIExhYmVsSXNQcmVmaXggID0gLTEsCisgICAgICBEb250TWF0Y2ggICAgICA9IDAsCisgICAgICBIYXZlQ29tbW9uUGFydAorICAgIH07CisKKyAgICBzdHJ1Y3QgTm9kZUNtcCB7CisgICAgICBib29sIG9wZXJhdG9yKCkgKE5vZGUqIE4xLCBOb2RlKiBOMikgeworICAgICAgICByZXR1cm4gKE4xLT5MYWJlbFswXSA8IE4yLT5MYWJlbFswXSk7CisgICAgICB9CisgICAgICBib29sIG9wZXJhdG9yKCkgKE5vZGUqIE4sIGNoYXIgSWQpIHsKKyAgICAgICAgcmV0dXJuIChOLT5MYWJlbFswXSA8IElkKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgc3RkOjpzdHJpbmcgTGFiZWw7CisgICAgUGF5bG9hZCBEYXRhOworICAgIE5vZGVWZWN0b3JUeXBlIENoaWxkcmVuOworCisgICAgLy8gRG8gbm90IGltcGxlbWVudAorICAgIE5vZGUoY29uc3QgTm9kZSYpOworICAgIE5vZGUmIG9wZXJhdG9yPShjb25zdCBOb2RlJik7CisKKyAgICBpbmxpbmUgdm9pZCBhZGRFZGdlKE5vZGUqIE4pIHsKKyAgICAgIGlmIChDaGlsZHJlbi5lbXB0eSgpKQorICAgICAgICBDaGlsZHJlbi5wdXNoX2JhY2soTik7CisgICAgICBlbHNlIHsKKyAgICAgICAgaXRlcmF0b3IgSSA9IHN0ZDo6bG93ZXJfYm91bmQoQ2hpbGRyZW4uYmVnaW4oKSwgQ2hpbGRyZW4uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIE5vZGVDbXAoKSk7CisgICAgICAgIC8vIEZJWE1FOiBubyBkdXBzIGFyZSBhbGxvd2VkCisgICAgICAgIENoaWxkcmVuLmluc2VydChJLCBOKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBzZXRFZGdlKE5vZGUqIE4pIHsKKyAgICAgIGNoYXIgSWQgPSBOLT5MYWJlbFswXTsKKyAgICAgIGl0ZXJhdG9yIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKENoaWxkcmVuLmJlZ2luKCksIENoaWxkcmVuLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkLCBOb2RlQ21wKCkpOworICAgICAgYXNzZXJ0KEkgIT0gQ2hpbGRyZW4uZW5kKCkgJiYgIk5vZGUgZG9lcyBub3QgZXhpc3RzISIpOworICAgICAgKkkgPSBOOworICAgIH0KKworICAgIFF1ZXJ5UmVzdWx0IHF1ZXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBpLCBsOworICAgICAgdW5zaWduZWQgbDEgPSBzLmxlbmd0aCgpOworICAgICAgdW5zaWduZWQgbDIgPSBMYWJlbC5sZW5ndGgoKTsKKworICAgICAgLy8gRmluZCB0aGUgbGVuZ3RoIG9mIGNvbW1vbiBwYXJ0CisgICAgICBsID0gc3RkOjptaW4obDEsIGwyKTsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKChpIDwgbCkgJiYgKHNbaV0gPT0gTGFiZWxbaV0pKQorICAgICAgICArK2k7CisKKyAgICAgIGlmIChpID09IGwpIHsgLy8gT25lIGlzIHByZWZpeCBvZiBhbm90aGVyLCBmaW5kIHdobyBpcyB3aG8KKyAgICAgICAgaWYgKGwxID09IGwyKQorICAgICAgICAgIHJldHVybiBTYW1lOworICAgICAgICBlbHNlIGlmIChpID09IGwxKQorICAgICAgICAgIHJldHVybiBTdHJpbmdJc1ByZWZpeDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBMYWJlbElzUHJlZml4OworICAgICAgfSBlbHNlIC8vIHMgYW5kIExhYmVsIGhhdmUgY29tbW9uIChwb3NzaWJsZSBlbXB0eSkgcGFydCwgcmV0dXJuIGl0cyBsZW5ndGgKKyAgICAgICAgcmV0dXJuIChRdWVyeVJlc3VsdClpOworICAgIH0KKworICBwdWJsaWM6CisgICAgaW5saW5lIGV4cGxpY2l0IE5vZGUoY29uc3QgUGF5bG9hZCYgZGF0YSwgY29uc3Qgc3RkOjpzdHJpbmcmIGxhYmVsID0gIiIpOgorICAgICAgICBMYWJlbChsYWJlbCksIERhdGEoZGF0YSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3QgUGF5bG9hZCYgZGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKyAgICBpbmxpbmUgdm9pZCBzZXREYXRhKGNvbnN0IFBheWxvYWQmIGRhdGEpIHsgRGF0YSA9IGRhdGE7IH0KKworICAgIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgbGFiZWwoKSBjb25zdCB7IHJldHVybiBMYWJlbDsgfQorCisjaWYgMAorICAgIGlubGluZSB2b2lkIGR1bXAoKSB7CisgICAgICBsbHZtOjpjZXJyIDw8ICJOb2RlOiAiIDw8IHRoaXMgPDwgIlxuIgorICAgICAgICAgICAgICAgIDw8ICJMYWJlbDogIiA8PCBMYWJlbCA8PCAiXG4iCisgICAgICAgICAgICAgICAgPDwgIkNoaWxkcmVuOlxuIjsKKworICAgICAgZm9yIChpdGVyYXRvciBJID0gQ2hpbGRyZW4uYmVnaW4oKSwgRSA9IENoaWxkcmVuLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgbGx2bTo6Y2VyciA8PCAoKkkpLT5MYWJlbCA8PCAiXG4iOworICAgIH0KKyNlbmRpZgorCisgICAgaW5saW5lIE5vZGUqIGdldEVkZ2UoY2hhciBJZCkgeworICAgICAgTm9kZSogZk5vZGUgPSBOVUxMOworICAgICAgaXRlcmF0b3IgSSA9IHN0ZDo6bG93ZXJfYm91bmQoQ2hpbGRyZW4uYmVnaW4oKSwgQ2hpbGRyZW4uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZCwgTm9kZUNtcCgpKTsKKyAgICAgIGlmIChJICE9IENoaWxkcmVuLmVuZCgpICYmICgqSSktPkxhYmVsWzBdID09IElkKQorICAgICAgICBmTm9kZSA9ICpJOworCisgICAgICByZXR1cm4gZk5vZGU7CisgICAgfQorCisgICAgaW5saW5lIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkgICAgICAgeyByZXR1cm4gQ2hpbGRyZW4uYmVnaW4oKTsgfQorICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuLmJlZ2luKCk7IH0KKyAgICBpbmxpbmUgaXRlcmF0b3IgICAgICAgZW5kICAoKSAgICAgICB7IHJldHVybiBDaGlsZHJlbi5lbmQoKTsgICB9CisgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW4uZW5kKCk7ICAgfQorCisgICAgaW5saW5lIHNpemVfdCAgICAgICAgIHNpemUgKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW4uc2l6ZSgpOyAgfQorICAgIGlubGluZSBib29sICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuLmVtcHR5KCk7IH0KKyAgICBpbmxpbmUgY29uc3QgTm9kZSogICAmZnJvbnQoKSBjb25zdCB7IHJldHVybiBDaGlsZHJlbi5mcm9udCgpOyB9CisgICAgaW5saW5lICAgICAgIE5vZGUqICAgJmZyb250KCkgICAgICAgeyByZXR1cm4gQ2hpbGRyZW4uZnJvbnQoKTsgfQorICAgIGlubGluZSBjb25zdCBOb2RlKiAgICZiYWNrKCkgIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuLmJhY2soKTsgIH0KKyAgICBpbmxpbmUgICAgICAgTm9kZSogICAmYmFjaygpICAgICAgICB7IHJldHVybiBDaGlsZHJlbi5iYWNrKCk7ICB9CisKKyAgfTsKKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8Tm9kZSo+IE5vZGVzOworICBQYXlsb2FkIEVtcHR5OworCisgIGlubGluZSBOb2RlKiBhZGROb2RlKGNvbnN0IFBheWxvYWQmIGRhdGEsIGNvbnN0IHN0ZDo6c3RyaW5nIGxhYmVsID0gIiIpIHsKKyAgICBOb2RlKiBOID0gbmV3IE5vZGUoZGF0YSwgbGFiZWwpOworICAgIE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgICByZXR1cm4gTjsKKyAgfQorCisgIGlubGluZSBOb2RlKiBzcGxpdEVkZ2UoTm9kZSogTiwgY2hhciBJZCwgc2l6ZV90IGluZGV4KSB7CisgICAgTm9kZSogZU5vZGUgPSBOLT5nZXRFZGdlKElkKTsKKyAgICBhc3NlcnQoZU5vZGUgJiYgIk5vZGUgZG9lc24ndCBleGlzdCIpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmwgPSBlTm9kZS0+TGFiZWw7CisgICAgYXNzZXJ0KGluZGV4ID4gMCAmJiBpbmRleCA8IGwubGVuZ3RoKCkgJiYgIlRyeWluZyB0byBzcGxpdCB0b28gZmFyISIpOworICAgIHN0ZDo6c3RyaW5nIGwxID0gbC5zdWJzdHIoMCwgaW5kZXgpOworICAgIHN0ZDo6c3RyaW5nIGwyID0gbC5zdWJzdHIoaW5kZXgpOworCisgICAgTm9kZSogbk5vZGUgPSBhZGROb2RlKEVtcHR5LCBsMSk7CisgICAgTi0+c2V0RWRnZShuTm9kZSk7CisKKyAgICBlTm9kZS0+TGFiZWwgPSBsMjsKKyAgICBuTm9kZS0+YWRkRWRnZShlTm9kZSk7CisKKyAgICByZXR1cm4gbk5vZGU7CisgIH0KKworICAvLyBEbyBub3QgaW1wbGVtZW50CisgIFRyaWUoY29uc3QgVHJpZSYpOworICBUcmllJiBvcGVyYXRvcj0oY29uc3QgVHJpZSYpOworCitwdWJsaWM6CisgIGlubGluZSBleHBsaWNpdCBUcmllKGNvbnN0IFBheWxvYWQmIGVtcHR5KTpFbXB0eShlbXB0eSkgeworICAgIGFkZE5vZGUoRW1wdHkpOworICB9CisgIGlubGluZSB+VHJpZSgpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTm9kZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGRlbGV0ZSBOb2Rlc1tpXTsKKyAgfQorCisgIGlubGluZSBOb2RlKiBnZXRSb290KCkgY29uc3QgeyByZXR1cm4gTm9kZXNbMF07IH0KKworICBib29sIGFkZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcywgY29uc3QgUGF5bG9hZCYgZGF0YSk7CisgIGNvbnN0IFBheWxvYWQmIGxvb2t1cChjb25zdCBzdGQ6OnN0cmluZyYgcykgY29uc3Q7CisKK307CisKKy8vIERlZmluZSB0aGlzIG91dC1vZi1saW5lIHRvIGRpc3N1YWRlIHRoZSBDKysgY29tcGlsZXIgZnJvbSBpbmxpbmluZyBpdC4KK3RlbXBsYXRlPGNsYXNzIFBheWxvYWQ+Citib29sIFRyaWU8UGF5bG9hZD46OmFkZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcywgY29uc3QgUGF5bG9hZCYgZGF0YSkgeworICBOb2RlKiBjTm9kZSA9IGdldFJvb3QoKTsKKyAgTm9kZSogdE5vZGUgPSBOVUxMOworICBzdGQ6OnN0cmluZyBzMShzKTsKKworICB3aGlsZSAodE5vZGUgPT0gTlVMTCkgeworICAgIGNoYXIgSWQgPSBzMVswXTsKKyAgICBpZiAoTm9kZSogbk5vZGUgPSBjTm9kZS0+Z2V0RWRnZShJZCkpIHsKKyAgICAgIHR5cGVuYW1lIE5vZGU6OlF1ZXJ5UmVzdWx0IHIgPSBuTm9kZS0+cXVlcnkoczEpOworCisgICAgICBzd2l0Y2ggKHIpIHsKKyAgICAgIGNhc2UgTm9kZTo6U2FtZToKKyAgICAgIGNhc2UgTm9kZTo6U3RyaW5nSXNQcmVmaXg6CisgICAgICAgIC8vIEN1cnJlbnRseSB3ZSBkb24ndCBhbGxvdyB0byBoYXZlIHR3byBzdHJpbmdzIGluIHRoZSB0cmllIG9uZQorICAgICAgICAvLyBiZWluZyBhIHByZWZpeCBvZiBhbm90aGVyLiBUaGlzIHNob3VsZCBiZSBmaXhlZC4KKyAgICAgICAgYXNzZXJ0KDAgJiYgIkZJWE1FISIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBjYXNlIE5vZGU6OkRvbnRNYXRjaDoKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkltcG9zc2libGUhIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgTm9kZTo6TGFiZWxJc1ByZWZpeDoKKyAgICAgICAgczEgPSBzMS5zdWJzdHIobk5vZGUtPmxhYmVsKCkubGVuZ3RoKCkpOworICAgICAgICBjTm9kZSA9IG5Ob2RlOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG5Ob2RlID0gc3BsaXRFZGdlKGNOb2RlLCBJZCwgcik7CisgICAgICAgIHROb2RlID0gYWRkTm9kZShkYXRhLCBzMS5zdWJzdHIocikpOworICAgICAgICBuTm9kZS0+YWRkRWRnZSh0Tm9kZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHROb2RlID0gYWRkTm9kZShkYXRhLCBzMSk7CisgICAgICBjTm9kZS0+YWRkRWRnZSh0Tm9kZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFBheWxvYWQ+Citjb25zdCBQYXlsb2FkJiBUcmllPFBheWxvYWQ+Ojpsb29rdXAoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIGNvbnN0IHsKKyAgTm9kZSogY05vZGUgPSBnZXRSb290KCk7CisgIE5vZGUqIHROb2RlID0gTlVMTDsKKyAgc3RkOjpzdHJpbmcgczEocyk7CisKKyAgd2hpbGUgKHROb2RlID09IE5VTEwpIHsKKyAgICBjaGFyIElkID0gczFbMF07CisgICAgaWYgKE5vZGUqIG5Ob2RlID0gY05vZGUtPmdldEVkZ2UoSWQpKSB7CisgICAgICB0eXBlbmFtZSBOb2RlOjpRdWVyeVJlc3VsdCByID0gbk5vZGUtPnF1ZXJ5KHMxKTsKKworICAgICAgc3dpdGNoIChyKSB7CisgICAgICBjYXNlIE5vZGU6OlNhbWU6CisgICAgICAgIHROb2RlID0gbk5vZGU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOb2RlOjpTdHJpbmdJc1ByZWZpeDoKKyAgICAgICAgcmV0dXJuIEVtcHR5OworICAgICAgY2FzZSBOb2RlOjpEb250TWF0Y2g6CisgICAgICAgIGFzc2VydCgwICYmICJJbXBvc3NpYmxlISIpOworICAgICAgICByZXR1cm4gRW1wdHk7CisgICAgICBjYXNlIE5vZGU6OkxhYmVsSXNQcmVmaXg6CisgICAgICAgIHMxID0gczEuc3Vic3RyKG5Ob2RlLT5sYWJlbCgpLmxlbmd0aCgpKTsKKyAgICAgICAgY05vZGUgPSBuTm9kZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRW1wdHk7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gRW1wdHk7CisgIH0KKworICByZXR1cm4gdE5vZGUtPmRhdGEoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgUGF5bG9hZD4KK3N0cnVjdCBHcmFwaFRyYWl0czxUcmllPFBheWxvYWQ+ID4geworICB0eXBlZGVmIFRyaWU8UGF5bG9hZD4gVHJpZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJpZVR5cGU6Ok5vZGUgTm9kZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZVR5cGU6Oml0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShjb25zdCBUcmllVHlwZSYgVCkgeworICAgIHJldHVybiBULmdldFJvb3QoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTi0+YmVnaW4oKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlVHlwZSAqTikgeyByZXR1cm4gTi0+ZW5kKCk7IH0KKworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPE5vZGVUeXBlKj46OmNvbnN0X2l0ZXJhdG9yIG5vZGVzX2l0ZXJhdG9yOworCisgIHN0YXRpYyBpbmxpbmUgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oY29uc3QgVHJpZVR5cGUmIEcpIHsKKyAgICByZXR1cm4gRy5Ob2Rlcy5iZWdpbigpOworICB9CisgIHN0YXRpYyBpbmxpbmUgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKGNvbnN0IFRyaWVUeXBlJiBHKSB7CisgICAgcmV0dXJuIEcuTm9kZXMuZW5kKCk7CisgIH0KKworfTsKKwordGVtcGxhdGU8Y2xhc3MgUGF5bG9hZD4KK3N0cnVjdCBET1RHcmFwaFRyYWl0czxUcmllPFBheWxvYWQ+ID4gOiBwdWJsaWMgRGVmYXVsdERPVEdyYXBoVHJhaXRzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmllPFBheWxvYWQ+OjpOb2RlIE5vZGVUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEdyYXBoVHJhaXRzPFRyaWU8UGF5bG9hZD4gPjo6Q2hpbGRJdGVyYXRvclR5cGUgRWRnZUl0ZXI7CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEdyYXBoTmFtZShjb25zdCBUcmllPFBheWxvYWQ+JiBUKSB7CisgICAgcmV0dXJuICJUcmllIjsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXROb2RlTGFiZWwoTm9kZVR5cGUqIE5vZGUsIGNvbnN0IFRyaWU8UGF5bG9hZD4mIFQpIHsKKyAgICBpZiAoVC5nZXRSb290KCkgPT0gTm9kZSkKKyAgICAgIHJldHVybiAiPFJvb3Q+IjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gTm9kZS0+bGFiZWwoKTsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRFZGdlU291cmNlTGFiZWwoTm9kZVR5cGUqIE5vZGUsIEVkZ2VJdGVyIEkpIHsKKyAgICBOb2RlVHlwZSogTiA9ICpJOworICAgIHJldHVybiBOLT5sYWJlbCgpLnN1YnN0cigwLCAxKTsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXROb2RlQXR0cmlidXRlcyhjb25zdCBOb2RlVHlwZSogTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyaWU8UGF5bG9hZD4mIFQpIHsKKyAgICBpZiAoTm9kZS0+ZGF0YSgpICE9IFQuRW1wdHkpCisgICAgICByZXR1cm4gImNvbG9yPWJsdWUiOworCisgICAgcmV0dXJuICIiOworICB9CisKK307CisKK30gLy8gZW5kIG9mIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9UUklFX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvVHJpcGxlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1RyaXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWRlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1RyaXBsZS5oCkBAIC0wLDAgKzEsMjkyIEBACisvLz09PS0tIGxsdm0vQURUL1RyaXBsZS5oIC0gVGFyZ2V0IHRyaXBsZSBoZWxwZXIgY2xhc3MgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1RSSVBMRV9ICisjZGVmaW5lIExMVk1fQURUX1RSSVBMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIFNvbWUgc3lzdGVtIGhlYWRlcnMgb3IgR0NDIHByZWRlZmluZWQgbWFjcm9zIGNvbmZsaWN0IHdpdGggaWRlbnRpZmllcnMgaW4KKy8vIHRoaXMgZmlsZS4gIFVuZGVmaW5lIHRoZW0gaGVyZS4KKyN1bmRlZiBtaXBzCisjdW5kZWYgc3BhcmMKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgVHdpbmU7CisKKy8vLyBUcmlwbGUgLSBIZWxwZXIgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCB0YXJnZXQgdHJpcGxlcy4KKy8vLworLy8vIFRhcmdldCB0cmlwbGVzIGFyZSBzdHJpbmdzIGluIHRoZSBmb3JtYXQgb2Y6CisvLy8gICBBUkNISVRFQ1RVUkUtVkVORE9SLU9QRVJBVElOR19TWVNURU0KKy8vLyBvcgorLy8vICAgQVJDSElURUNUVVJFLVZFTkRPUi1PUEVSQVRJTkdfU1lTVEVNLUVOVklST05NRU5UCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIGNsaWVudHMgd2hpY2ggd2FudCB0byBzdXBwb3J0IGFyYml0cmFyeQorLy8vIHRhcmdldCB0cmlwbGVzLCBidXQgYWxzbyB3YW50IHRvIGltcGxlbWVudCBjZXJ0YWluIHNwZWNpYWwKKy8vLyBiZWhhdmlvciBmb3IgcGFydGljdWxhciB0YXJnZXRzLiBUaGlzIGNsYXNzIGlzb2xhdGVzIHRoZSBtYXBwaW5nCisvLy8gZnJvbSB0aGUgY29tcG9uZW50cyBvZiB0aGUgdGFyZ2V0IHRyaXBsZSB0byB3ZWxsIGtub3duIElEcy4KKy8vLworLy8vIEF0IGl0cyBjb3JlIHRoZSBUcmlwbGUgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgYSB3cmFwcGVyIGZvciBhIHRyaXBsZQorLy8vIHN0cmluZzsgaXQgZG9lcyBub3Qgbm9ybWFsbHkgY2hhbmdlIG9yIG5vcm1hbGl6ZSB0aGUgdHJpcGxlIHN0cmluZywgaW5zdGVhZAorLy8vIGl0IHByb3ZpZGVzIGFkZGl0aW9uYWwgQVBJcyB0byBwYXJzZSBub3JtYWxpemVkIHBhcnRzIG91dCBvZiB0aGUgdHJpcGxlLgorLy8vCisvLy8gT25lIGN1cmlvc2l0eSB0aGlzIGltcGxpZXMgaXMgdGhhdCBmb3Igc29tZSBvZGQgdHJpcGxlcyB0aGUgcmVzdWx0cyBvZiwKKy8vLyBlLmcuLCBnZXRPU05hbWUoKSBjYW4gYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgcmVzdWx0IG9mIGdldE9TKCkuICBGb3IKKy8vLyBleGFtcGxlLCBmb3IgJ2kzODYtbWluZ3czMicsIGdldE9TKCkgd2lsbCByZXR1cm4gTWluR1czMiwgYnV0IHNpbmNlCisvLy8gZ2V0T1NOYW1lKCkgaXMgcHVyZWx5IGJhc2VkIG9uIHRoZSBzdHJpbmcgc3RydWN0dXJlIHRoYXQgd2lsbCByZXR1cm4gdGhlCisvLy8gZW1wdHkgc3RyaW5nLgorLy8vCisvLy8gQ2xpZW50cyBzaG91bGQgZ2VuZXJhbGx5IGF2b2lkIHVzaW5nIGdldE9TTmFtZSgpIGFuZCByZWxhdGVkIEFQSXMgdW5sZXNzCisvLy8gdGhleSBhcmUgZmFtaWxpYXIgd2l0aCB0aGUgdHJpcGxlIGZvcm1hdCAodGhpcyBpcyBwYXJ0aWN1bGFybHkgdHJ1ZSB3aGVuCisvLy8gcmV3cml0aW5nIGEgdHJpcGxlKS4KKy8vLworLy8vIFNlZSBhdXRvY29uZi9jb25maWcuZ3Vlc3MgZm9yIGEgZ2xpbXBzZSBpbnRvIHdoYXQgdGhleSBsb29rIGxpa2UgaW4KKy8vLyBwcmFjdGljZS4KK2NsYXNzIFRyaXBsZSB7CitwdWJsaWM6CisgIGVudW0gQXJjaFR5cGUgeworICAgIFVua25vd25BcmNoLAorICAgIAorICAgIGFscGhhLCAgIC8vIEFscGhhOiBhbHBoYQorICAgIGFybSwgICAgIC8vIEFSTTsgYXJtLCBhcm12LiosIHhzY2FsZQorICAgIGJmaW4sICAgIC8vIEJsYWNrZmluOiBiZmluCisgICAgY2VsbHNwdSwgLy8gQ2VsbFNQVTogc3B1LCBjZWxsc3B1CisgICAgbWlwcywgICAgLy8gTUlQUzogbWlwcywgbWlwc2FsbGVncmV4CisgICAgbWlwc2VsLCAgLy8gTUlQU0VMOiBtaXBzZWwsIG1pcHNhbGxlZ3JleGVsLCBwc3AKKyAgICBtc3A0MzAsICAvLyBNU1A0MzA6IG1zcDQzMAorICAgIHBpYzE2LCAgIC8vIFBJQzE2OiBwaWMxNgorICAgIHBwYywgICAgIC8vIFBQQzogcG93ZXJwYworICAgIHBwYzY0LCAgIC8vIFBQQzY0OiBwb3dlcnBjNjQsIHBwdQorICAgIHNwYXJjLCAgIC8vIFNwYXJjOiBzcGFyYworICAgIHNwYXJjdjksIC8vIFNwYXJjdjk6IFNwYXJjdjkKKyAgICBzeXN0ZW16LCAvLyBTeXN0ZW1aOiBzMzkweAorICAgIHRjZSwgICAgIC8vIFRDRSAoaHR0cDovL3RjZS5jcy50dXQuZmkvKTogdGNlCisgICAgdGh1bWIsICAgLy8gVGh1bWI6IHRodW1iLCB0aHVtYnYuKgorICAgIHg4NiwgICAgIC8vIFg4NjogaVszLTldODYKKyAgICB4ODZfNjQsICAvLyBYODYtNjQ6IGFtZDY0LCB4ODZfNjQKKyAgICB4Y29yZSwgICAvLyBYQ29yZTogeGNvcmUKKyAgICBtYmxhemUsICAvLyBNQmxhemU6IG1ibGF6ZQorCisgICAgSW52YWxpZEFyY2gKKyAgfTsKKyAgZW51bSBWZW5kb3JUeXBlIHsKKyAgICBVbmtub3duVmVuZG9yLAorCisgICAgQXBwbGUsIAorICAgIFBDCisgIH07CisgIGVudW0gT1NUeXBlIHsKKyAgICBVbmtub3duT1MsCisKKyAgICBBdXJvcmFVWCwKKyAgICBDeWd3aW4sCisgICAgRGFyd2luLAorICAgIERyYWdvbkZseSwKKyAgICBGcmVlQlNELAorICAgIExpbnV4LAorICAgIEx2MiwgICAgICAgIC8vIFBTMworICAgIE1pbkdXMzIsCisgICAgTWluR1c2NCwKKyAgICBOZXRCU0QsCisgICAgT3BlbkJTRCwKKyAgICBQc3AsCisgICAgU29sYXJpcywKKyAgICBXaW4zMiwKKyAgICBIYWlrdSwKKyAgICBNaW5peAorICB9OworICAKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIERhdGE7CisKKyAgLy8vIFRoZSBwYXJzZWQgYXJjaCB0eXBlIChvciBJbnZhbGlkQXJjaCBpZiB1bmluaXRpYWxpemVkKS4KKyAgbXV0YWJsZSBBcmNoVHlwZSBBcmNoOworCisgIC8vLyBUaGUgcGFyc2VkIHZlbmRvciB0eXBlLgorICBtdXRhYmxlIFZlbmRvclR5cGUgVmVuZG9yOworCisgIC8vLyBUaGUgcGFyc2VkIE9TIHR5cGUuCisgIG11dGFibGUgT1NUeXBlIE9TOworCisgIGJvb2wgaXNJbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIEFyY2ggIT0gSW52YWxpZEFyY2g7IH0KKyAgdm9pZCBQYXJzZSgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKyAgLy8vIEB7CisgIAorICBUcmlwbGUoKSA6IERhdGEoKSwgQXJjaChJbnZhbGlkQXJjaCkge30KKyAgZXhwbGljaXQgVHJpcGxlKFN0cmluZ1JlZiBTdHIpIDogRGF0YShTdHIpLCBBcmNoKEludmFsaWRBcmNoKSB7fQorICBleHBsaWNpdCBUcmlwbGUoU3RyaW5nUmVmIEFyY2hTdHIsIFN0cmluZ1JlZiBWZW5kb3JTdHIsIFN0cmluZ1JlZiBPU1N0cikKKyAgICA6IERhdGEoQXJjaFN0ciksIEFyY2goSW52YWxpZEFyY2gpIHsKKyAgICBEYXRhICs9ICctJzsKKyAgICBEYXRhICs9IFZlbmRvclN0cjsKKyAgICBEYXRhICs9ICctJzsKKyAgICBEYXRhICs9IE9TU3RyOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBUeXBlZCBDb21wb25lbnQgQWNjZXNzCisgIC8vLyBAeworICAKKyAgLy8vIGdldEFyY2ggLSBHZXQgdGhlIHBhcnNlZCBhcmNoaXRlY3R1cmUgdHlwZSBvZiB0aGlzIHRyaXBsZS4KKyAgQXJjaFR5cGUgZ2V0QXJjaCgpIGNvbnN0IHsgCisgICAgaWYgKCFpc0luaXRpYWxpemVkKCkpIFBhcnNlKCk7IAorICAgIHJldHVybiBBcmNoOworICB9CisgIAorICAvLy8gZ2V0VmVuZG9yIC0gR2V0IHRoZSBwYXJzZWQgdmVuZG9yIHR5cGUgb2YgdGhpcyB0cmlwbGUuCisgIFZlbmRvclR5cGUgZ2V0VmVuZG9yKCkgY29uc3QgeyAKKyAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSkgUGFyc2UoKTsgCisgICAgcmV0dXJuIFZlbmRvcjsKKyAgfQorICAKKyAgLy8vIGdldE9TIC0gR2V0IHRoZSBwYXJzZWQgb3BlcmF0aW5nIHN5c3RlbSB0eXBlIG9mIHRoaXMgdHJpcGxlLgorICBPU1R5cGUgZ2V0T1MoKSBjb25zdCB7IAorICAgIGlmICghaXNJbml0aWFsaXplZCgpKSBQYXJzZSgpOyAKKyAgICByZXR1cm4gT1M7CisgIH0KKworICAvLy8gaGFzRW52aXJvbm1lbnQgLSBEb2VzIHRoaXMgdHJpcGxlIGhhdmUgdGhlIG9wdGlvbmFsIGVudmlyb25tZW50CisgIC8vLyAoZm91cnRoKSBjb21wb25lbnQ/CisgIGJvb2wgaGFzRW52aXJvbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEVudmlyb25tZW50TmFtZSgpICE9ICIiOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBEaXJlY3QgQ29tcG9uZW50IEFjY2VzcworICAvLy8gQHsKKworICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRUcmlwbGUoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisKKyAgLy8vIGdldEFyY2hOYW1lIC0gR2V0IHRoZSBhcmNoaXRlY3R1cmUgKGZpcnN0KSBjb21wb25lbnQgb2YgdGhlCisgIC8vLyB0cmlwbGUuCisgIFN0cmluZ1JlZiBnZXRBcmNoTmFtZSgpIGNvbnN0OworCisgIC8vLyBnZXRWZW5kb3JOYW1lIC0gR2V0IHRoZSB2ZW5kb3IgKHNlY29uZCkgY29tcG9uZW50IG9mIHRoZSB0cmlwbGUuCisgIFN0cmluZ1JlZiBnZXRWZW5kb3JOYW1lKCkgY29uc3Q7CisKKyAgLy8vIGdldE9TTmFtZSAtIEdldCB0aGUgb3BlcmF0aW5nIHN5c3RlbSAodGhpcmQpIGNvbXBvbmVudCBvZiB0aGUKKyAgLy8vIHRyaXBsZS4KKyAgU3RyaW5nUmVmIGdldE9TTmFtZSgpIGNvbnN0OworCisgIC8vLyBnZXRFbnZpcm9ubWVudE5hbWUgLSBHZXQgdGhlIG9wdGlvbmFsIGVudmlyb25tZW50IChmb3VydGgpCisgIC8vLyBjb21wb25lbnQgb2YgdGhlIHRyaXBsZSwgb3IgIiIgaWYgZW1wdHkuCisgIFN0cmluZ1JlZiBnZXRFbnZpcm9ubWVudE5hbWUoKSBjb25zdDsKKworICAvLy8gZ2V0T1NBbmRFbnZpcm9ubWVudE5hbWUgLSBHZXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYW5kIG9wdGlvbmFsCisgIC8vLyBlbnZpcm9ubWVudCBjb21wb25lbnRzIGFzIGEgc2luZ2xlIHN0cmluZyAoc2VwYXJhdGVkIGJ5IGEgJy0nCisgIC8vLyBpZiB0aGUgZW52aXJvbm1lbnQgY29tcG9uZW50IGlzIHByZXNlbnQpLgorICBTdHJpbmdSZWYgZ2V0T1NBbmRFbnZpcm9ubWVudE5hbWUoKSBjb25zdDsKKworICAKKyAgLy8vIGdldERhcndpbk51bWJlciAtIFBhcnNlIHRoZSAnZGFyd2luIG51bWJlcicgb3V0IG9mIHRoZSBzcGVjaWZpYyB0YXJnZXQKKyAgLy8vIHRyaXBsZS4gIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGRhcndpbjguNSByZXR1cm4gOCw1LDAuICBJZiBhbnkgZW50cnkgaXMKKyAgLy8vIG5vdCBkZWZpbmVkLCByZXR1cm4gMCdzLiAgVGhpcyByZXF1aXJlcyB0aGF0IHRoZSB0cmlwbGUgaGF2ZSBhbiBPU1R5cGUgb2YKKyAgLy8vIGRhcndpbiBiZWZvcmUgaXQgaXMgY2FsbGVkLgorICB2b2lkIGdldERhcndpbk51bWJlcih1bnNpZ25lZCAmTWFqLCB1bnNpZ25lZCAmTWluLCB1bnNpZ25lZCAmUmV2aXNpb24pIGNvbnN0OworICAKKyAgLy8vIGdldERhcndpbk1ham9yTnVtYmVyIC0gUmV0dXJuIGp1c3QgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLCB0aGlzIGlzCisgIC8vLyBzcGVjaWFsaXplZCBiZWNhdXNlIGl0IGlzIGEgY29tbW9uIHF1ZXJ5LgorICB1bnNpZ25lZCBnZXREYXJ3aW5NYWpvck51bWJlcigpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBNYWosIE1pbiwgUmV2OworICAgIGdldERhcndpbk51bWJlcihNYWosIE1pbiwgUmV2KTsKKyAgICByZXR1cm4gTWFqOworICB9CisgIAorICAvLy8gQH0KKyAgLy8vIEBuYW1lIE11dGF0b3JzCisgIC8vLyBAeworCisgIC8vLyBzZXRBcmNoIC0gU2V0IHRoZSBhcmNoaXRlY3R1cmUgKGZpcnN0KSBjb21wb25lbnQgb2YgdGhlIHRyaXBsZQorICAvLy8gdG8gYSBrbm93biB0eXBlLgorICB2b2lkIHNldEFyY2goQXJjaFR5cGUgS2luZCk7CisKKyAgLy8vIHNldFZlbmRvciAtIFNldCB0aGUgdmVuZG9yIChzZWNvbmQpIGNvbXBvbmVudCBvZiB0aGUgdHJpcGxlIHRvIGEKKyAgLy8vIGtub3duIHR5cGUuCisgIHZvaWQgc2V0VmVuZG9yKFZlbmRvclR5cGUgS2luZCk7CisKKyAgLy8vIHNldE9TIC0gU2V0IHRoZSBvcGVyYXRpbmcgc3lzdGVtICh0aGlyZCkgY29tcG9uZW50IG9mIHRoZSB0cmlwbGUKKyAgLy8vIHRvIGEga25vd24gdHlwZS4KKyAgdm9pZCBzZXRPUyhPU1R5cGUgS2luZCk7CisKKyAgLy8vIHNldFRyaXBsZSAtIFNldCBhbGwgY29tcG9uZW50cyB0byB0aGUgbmV3IHRyaXBsZSBcYXJnIFN0ci4KKyAgdm9pZCBzZXRUcmlwbGUoY29uc3QgVHdpbmUgJlN0cik7CisKKyAgLy8vIHNldEFyY2hOYW1lIC0gU2V0IHRoZSBhcmNoaXRlY3R1cmUgKGZpcnN0KSBjb21wb25lbnQgb2YgdGhlCisgIC8vLyB0cmlwbGUgYnkgbmFtZS4KKyAgdm9pZCBzZXRBcmNoTmFtZShTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gc2V0VmVuZG9yTmFtZSAtIFNldCB0aGUgdmVuZG9yIChzZWNvbmQpIGNvbXBvbmVudCBvZiB0aGUgdHJpcGxlCisgIC8vLyBieSBuYW1lLgorICB2b2lkIHNldFZlbmRvck5hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIHNldE9TTmFtZSAtIFNldCB0aGUgb3BlcmF0aW5nIHN5c3RlbSAodGhpcmQpIGNvbXBvbmVudCBvZiB0aGUKKyAgLy8vIHRyaXBsZSBieSBuYW1lLgorICB2b2lkIHNldE9TTmFtZShTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gc2V0RW52aXJvbm1lbnROYW1lIC0gU2V0IHRoZSBvcHRpb25hbCBlbnZpcm9ubWVudCAoZm91cnRoKQorICAvLy8gY29tcG9uZW50IG9mIHRoZSB0cmlwbGUgYnkgbmFtZS4KKyAgdm9pZCBzZXRFbnZpcm9ubWVudE5hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIHNldE9TQW5kRW52aXJvbm1lbnROYW1lIC0gU2V0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBvcHRpb25hbAorICAvLy8gZW52aXJvbm1lbnQgY29tcG9uZW50cyB3aXRoIGEgc2luZ2xlIHN0cmluZy4KKyAgdm9pZCBzZXRPU0FuZEVudmlyb25tZW50TmFtZShTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gZ2V0QXJjaE5hbWVGb3JBc3NlbWJsZXIgLSBHZXQgYW4gYXJjaGl0ZWN0dXJlIG5hbWUgdGhhdCBpcyB1bmRlcnN0b29kIGJ5CisgIC8vLyB0aGUgdGFyZ2V0IGFzc2VtYmxlci4KKyAgY29uc3QgY2hhciAqZ2V0QXJjaE5hbWVGb3JBc3NlbWJsZXIoKTsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN0YXRpYyBoZWxwZXJzIGZvciBJRHMuCisgIC8vLyBAeworCisgIC8vLyBnZXRBcmNoVHlwZU5hbWUgLSBHZXQgdGhlIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgXGFyZyBLaW5kCisgIC8vLyBhcmNoaXRlY3R1cmUuCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRBcmNoVHlwZU5hbWUoQXJjaFR5cGUgS2luZCk7CisKKyAgLy8vIGdldEFyY2hUeXBlUHJlZml4IC0gR2V0IHRoZSAicHJlZml4IiBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIFxhcmcgS2luZAorICAvLy8gYXJjaGl0ZWN0dXJlLiBUaGlzIGlzIHRoZSBwcmVmaXggdXNlZCBieSB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljCisgIC8vLyBidWlsdGlucywgYW5kIGlzIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIFxzZWUKKyAgLy8vIEludHJpbnNpYzo6Z2V0SW50cmluc2ljRm9yR0NDQnVpbHRpbigpLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gLSBUaGUgYXJjaGl0ZWN0dXJlIHByZWZpeCwgb3IgMCBpZiBub25lIGlzIGRlZmluZWQuCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRBcmNoVHlwZVByZWZpeChBcmNoVHlwZSBLaW5kKTsKKworICAvLy8gZ2V0VmVuZG9yVHlwZU5hbWUgLSBHZXQgdGhlIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgXGFyZyBLaW5kCisgIC8vLyB2ZW5kb3IuCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRWZW5kb3JUeXBlTmFtZShWZW5kb3JUeXBlIEtpbmQpOworCisgIC8vLyBnZXRPU1R5cGVOYW1lIC0gR2V0IHRoZSBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIFxhcmcgS2luZCB2ZW5kb3IuCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRPU1R5cGVOYW1lKE9TVHlwZSBLaW5kKTsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN0YXRpYyBoZWxwZXJzIGZvciBjb252ZXJ0aW5nIGFsdGVybmF0ZSBhcmNoaXRlY3R1cmUgbmFtZXMuCisgIC8vLyBAeworCisgIC8vLyBnZXRBcmNoVHlwZUZvckxMVk1OYW1lIC0gVGhlIGNhbm9uaWNhbCB0eXBlIGZvciB0aGUgZ2l2ZW4gTExWTQorICAvLy8gYXJjaGl0ZWN0dXJlIG5hbWUgKGUuZy4sICJ4ODYiKS4KKyAgc3RhdGljIEFyY2hUeXBlIGdldEFyY2hUeXBlRm9yTExWTU5hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIGdldEFyY2hUeXBlRm9yRGFyd2luQXJjaE5hbWUgLSBHZXQgdGhlIGFyY2hpdGVjdHVyZSB0eXBlIGZvciBhICJEYXJ3aW4iCisgIC8vLyBhcmNoaXRlY3R1cmUgbmFtZSwgZm9yIGV4YW1wbGUgYXMgYWNjZXB0ZWQgYnkgImdjYyAtYXJjaCIgKHNlZSBhbHNvCisgIC8vLyBhcmNoKDMpKS4KKyAgc3RhdGljIEFyY2hUeXBlIGdldEFyY2hUeXBlRm9yRGFyd2luQXJjaE5hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIEB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9Ud2luZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9Ud2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTlhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1R3aW5lLmgKQEAgLTAsMCArMSw0NTcgQEAKKy8vPT09LS0gVHdpbmUuaCAtIEZhc3QgVGVtcG9yYXJ5IFN0cmluZyBDb25jYXRlbmF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfVFdJTkVfSAorI2RlZmluZSBMTFZNX0FEVF9UV0lORV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY2xhc3MgU21hbGxWZWN0b3JJbXBsOworICBjbGFzcyBTdHJpbmdSZWY7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIC8vLyBUd2luZSAtIEEgbGlnaHR3ZWlnaHQgZGF0YSBzdHJ1Y3R1cmUgZm9yIGVmZmljaWVudGx5IHJlcHJlc2VudGluZyB0aGUKKyAgLy8vIGNvbmNhdGVuYXRpb24gb2YgdGVtcG9yYXJ5IHZhbHVlcyBhcyBzdHJpbmdzLgorICAvLy8KKyAgLy8vIEEgVHdpbmUgaXMgYSBraW5kIG9mIHJvcGUsIGl0IHJlcHJlc2VudHMgYSBjb25jYXRlbmF0ZWQgc3RyaW5nIHVzaW5nIGEKKyAgLy8vIGJpbmFyeS10cmVlLCB3aGVyZSB0aGUgc3RyaW5nIGlzIHRoZSBwcmVvcmRlciBvZiB0aGUgbm9kZXMuIFNpbmNlIHRoZQorICAvLy8gVHdpbmUgY2FuIGJlIGVmZmljaWVudGx5IHJlbmRlcmVkIGludG8gYSBidWZmZXIgd2hlbiBpdHMgcmVzdWx0IGlzIHVzZWQsCisgIC8vLyBpdCBhdm9pZHMgdGhlIGNvc3Qgb2YgZ2VuZXJhdGluZyB0ZW1wb3JhcnkgdmFsdWVzIGZvciBpbnRlcm1lZGlhdGUgc3RyaW5nCisgIC8vLyByZXN1bHRzIC0tIHBhcnRpY3VsYXJseSBpbiBjYXNlcyB3aGVuIHRoZSBUd2luZSByZXN1bHQgaXMgbmV2ZXIKKyAgLy8vIHJlcXVpcmVkLiBCeSBleHBsaWNpdGx5IHRyYWNraW5nIHRoZSB0eXBlIG9mIGxlYWYgbm9kZXMsIHdlIGNhbiBhbHNvIGF2b2lkCisgIC8vLyB0aGUgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IHN0cmluZ3MgZm9yIGNvbnZlcnNpb25zIG9wZXJhdGlvbnMgKHN1Y2ggYXMKKyAgLy8vIGFwcGVuZGluZyBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nKS4KKyAgLy8vCisgIC8vLyBBIFR3aW5lIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGRpcmVjdGx5IGFuZCBzaG91bGQgbm90IGJlIHN0b3JlZCwgaXRzCisgIC8vLyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlIGFiaWxpdHkgdG8gc3RvcmUgcG9pbnRlcnMgdG8gdGVtcG9yYXJ5IHN0YWNrCisgIC8vLyBvYmplY3RzIHdoaWNoIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIGEgc3RhdGVtZW50LiBUd2luZXMgc2hvdWxkCisgIC8vLyBvbmx5IGJlIHVzZWQgYWNjZXB0ZWQgYXMgY29uc3QgcmVmZXJlbmNlcyBpbiBhcmd1bWVudHMsIHdoZW4gYW4gQVBJIHdpc2hlcworICAvLy8gdG8gYWNjZXB0IHBvc3NpYmx5LWNvbmNhdGVuYXRlZCBzdHJpbmdzLgorICAvLy8KKyAgLy8vIFR3aW5lcyBzdXBwb3J0IGEgc3BlY2lhbCAnbnVsbCcgdmFsdWUsIHdoaWNoIGFsd2F5cyBjb25jYXRlbmF0ZXMgdG8gZm9ybQorICAvLy8gaXRzZWxmLCBhbmQgcmVuZGVycyBhcyBhbiBlbXB0eSBzdHJpbmcuIFRoaXMgY2FuIGJlIHJldHVybmVkIGZyb20gQVBJcyB0bworICAvLy8gZWZmZWN0aXZlbHkgbnVsbGlmeSBhbnkgY29uY2F0ZW5hdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSByZXN1bHQuCisgIC8vLyAKKyAgLy8vIFxiIEltcGxlbWVudGF0aW9uIFxuCisgIC8vLworICAvLy8gR2l2ZW4gdGhlIG5hdHVyZSBvZiBhIFR3aW5lLCBpdCBpcyBub3QgcG9zc2libGUgZm9yIHRoZSBUd2luZSdzCisgIC8vLyBjb25jYXRlbmF0aW9uIG1ldGhvZCB0byBjb25zdHJ1Y3QgaW50ZXJpb3Igbm9kZXM7IHRoZSByZXN1bHQgbXVzdCBiZQorICAvLy8gcmVwcmVzZW50ZWQgaW5zaWRlIHRoZSByZXR1cm5lZCB2YWx1ZS4gRm9yIHRoaXMgcmVhc29uIGEgVHdpbmUgb2JqZWN0CisgIC8vLyBhY3R1YWxseSBob2xkcyB0d28gdmFsdWVzLCB0aGUgbGVmdC0gYW5kIHJpZ2h0LWhhbmQgc2lkZXMgb2YgYQorICAvLy8gY29uY2F0ZW5hdGlvbi4gV2UgYWxzbyBoYXZlIG51bGxhcnkgVHdpbmUgb2JqZWN0cywgd2hpY2ggYXJlIGVmZmVjdGl2ZWx5CisgIC8vLyBzZW50aW5lbCB2YWx1ZXMgdGhhdCByZXByZXNlbnQgZW1wdHkgc3RyaW5ncy4KKyAgLy8vCisgIC8vLyBUaHVzLCBhIFR3aW5lIGNhbiBlZmZlY3RpdmVseSBoYXZlIHplcm8sIG9uZSwgb3IgdHdvIGNoaWxkcmVuLiBUaGUgXHNlZQorICAvLy8gaXNOdWxsYXJ5KCksIFxzZWUgaXNVbmFyeSgpLCBhbmQgXHNlZSBpc0JpbmFyeSgpIHByZWRpY2F0ZXMgZXhpc3QgZm9yCisgIC8vLyB0ZXN0aW5nIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4uCisgIC8vLworICAvLy8gV2UgbWFpbnRhaW4gYSBudW1iZXIgb2YgaW52YXJpYW50cyBvbiBUd2luZSBvYmplY3RzIChGSVhNRTogV2h5KToKKyAgLy8vICAtIE51bGxhcnkgdHdpbmVzIGFyZSBhbHdheXMgcmVwcmVzZW50ZWQgd2l0aCB0aGVpciBLaW5kIG9uIHRoZSBsZWZ0LWhhbmQKKyAgLy8vICAgIHNpZGUsIGFuZCB0aGUgRW1wdHkga2luZCBvbiB0aGUgcmlnaHQtaGFuZCBzaWRlLgorICAvLy8gIC0gVW5hcnkgdHdpbmVzIGFyZSBhbHdheXMgcmVwcmVzZW50ZWQgd2l0aCB0aGUgdmFsdWUgb24gdGhlIGxlZnQtaGFuZAorICAvLy8gICAgc2lkZSwgYW5kIHRoZSBFbXB0eSBraW5kIG9uIHRoZSByaWdodC1oYW5kIHNpZGUuCisgIC8vLyAgLSBJZiBhIFR3aW5lIGhhcyBhbm90aGVyIFR3aW5lIGFzIGEgY2hpbGQsIHRoYXQgY2hpbGQgc2hvdWxkIGFsd2F5cyBiZQorICAvLy8gICAgYmluYXJ5IChvdGhlcndpc2UgaXQgY291bGQgaGF2ZSBiZWVuIGZvbGRlZCBpbnRvIHRoZSBwYXJlbnQpLgorICAvLy8KKyAgLy8vIFRoZXNlIGludmFyaWFudHMgYXJlIGNoZWNrIGJ5IFxzZWUgaXNWYWxpZCgpLgorICAvLy8KKyAgLy8vIFxiIEVmZmljaWVuY3kgQ29uc2lkZXJhdGlvbnMgXG4KKyAgLy8vCisgIC8vLyBUaGUgVHdpbmUgaXMgZGVzaWduZWQgdG8geWllbGQgZWZmaWNpZW50IGFuZCBzbWFsbCBjb2RlIGZvciBjb21tb24KKyAgLy8vIHNpdHVhdGlvbnMuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGNvbmNhdCgpIG1ldGhvZCBpcyBpbmxpbmVkIHNvIHRoYXQKKyAgLy8vIGNvbmNhdGVuYXRpb25zIG9mIGxlYWYgbm9kZXMgY2FuIGJlIG9wdGltaXplZCBpbnRvIHN0b3JlcyBkaXJlY3RseSBpbnRvIGEKKyAgLy8vIHNpbmdsZSBzdGFjayBhbGxvY2F0ZWQgb2JqZWN0LgorICAvLy8KKyAgLy8vIEluIHByYWN0aWNlLCBub3QgYWxsIGNvbXBpbGVycyBjYW4gYmUgdHJ1c3RlZCB0byBvcHRpbWl6ZSBjb25jYXQoKSBmdWxseSwKKyAgLy8vIHNvIHdlIHByb3ZpZGUgdHdvIGFkZGl0aW9uYWwgbWV0aG9kcyAoYW5kIGFjY29tcGFueWluZyBvcGVyYXRvcisKKyAgLy8vIG92ZXJsb2FkcykgdG8gZ3VhcmFudGVlIHRoYXQgcGFydGljdWxhcmx5IGltcG9ydGFudCBjYXNlcyAoY3N0cmluZyBwbHVzCisgIC8vLyBTdHJpbmdSZWYpIGNvZGVnZW4gYXMgZGVzaXJlZC4KKyAgY2xhc3MgVHdpbmUgeworICAgIC8vLyBOb2RlS2luZCAtIFJlcHJlc2VudCB0aGUgdHlwZSBvZiBhbiBhcmd1bWVudC4KKyAgICBlbnVtIE5vZGVLaW5kIHsKKyAgICAgIC8vLyBBbiBlbXB0eSBzdHJpbmc7IHRoZSByZXN1bHQgb2YgY29uY2F0ZW5hdGluZyBhbnl0aGluZyB3aXRoIGl0IGlzIGFsc28KKyAgICAgIC8vLyBlbXB0eS4KKyAgICAgIE51bGxLaW5kLAorCisgICAgICAvLy8gVGhlIGVtcHR5IHN0cmluZy4KKyAgICAgIEVtcHR5S2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhIFR3aW5lIGluc3RhbmNlLgorICAgICAgVHdpbmVLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGEgQyBzdHJpbmcgaW5zdGFuY2UuCisgICAgICBDU3RyaW5nS2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhbiBzdGQ6OnN0cmluZyBpbnN0YW5jZS4KKyAgICAgIFN0ZFN0cmluZ0tpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYSBTdHJpbmdSZWYgaW5zdGFuY2UuCisgICAgICBTdHJpbmdSZWZLaW5kLAorCisgICAgICAvLy8gQW4gdW5zaWduZWQgaW50IHZhbHVlIHJlaW50ZXJwcmV0ZWQgYXMgYSBwb2ludGVyLCB0byByZW5kZXIgYXMgYW4gCisgICAgICAvLy8gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgorICAgICAgRGVjVUlLaW5kLAorCisgICAgICAvLy8gQW4gaW50IHZhbHVlIHJlaW50ZXJwcmV0ZWQgYXMgYSBwb2ludGVyLCB0byByZW5kZXIgYXMgYSBzaWduZWQKKyAgICAgIC8vLyBkZWNpbWFsIGludGVnZXIuCisgICAgICBEZWNJS2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhbiB1bnNpZ25lZCBsb25nIHZhbHVlLCB0byByZW5kZXIgYXMgYW4gdW5zaWduZWQgZGVjaW1hbAorICAgICAgLy8vIGludGVnZXIuCisgICAgICBEZWNVTEtpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYSBsb25nIHZhbHVlLCB0byByZW5kZXIgYXMgYSBzaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgorICAgICAgRGVjTEtpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYW4gdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlLCB0byByZW5kZXIgYXMgYW4gdW5zaWduZWQKKyAgICAgIC8vLyBkZWNpbWFsIGludGVnZXIuCisgICAgICBEZWNVTExLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGEgbG9uZyBsb25nIHZhbHVlLCB0byByZW5kZXIgYXMgYSBzaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgorICAgICAgRGVjTExLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGEgdWludDY0X3QgdmFsdWUsIHRvIHJlbmRlciBhcyBhbiB1bnNpZ25lZCBoZXhhZGVjaW1hbAorICAgICAgLy8vIGludGVnZXIuCisgICAgICBVSGV4S2luZAorICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gTEhTIC0gVGhlIHByZWZpeCBpbiB0aGUgY29uY2F0ZW5hdGlvbiwgd2hpY2ggbWF5IGJlIHVuaW5pdGlhbGl6ZWQgZm9yCisgICAgLy8vIE51bGwgb3IgRW1wdHkga2luZHMuCisgICAgY29uc3Qgdm9pZCAqTEhTOworICAgIC8vLyBSSFMgLSBUaGUgc3VmZml4IGluIHRoZSBjb25jYXRlbmF0aW9uLCB3aGljaCBtYXkgYmUgdW5pbml0aWFsaXplZCBmb3IKKyAgICAvLy8gTnVsbCBvciBFbXB0eSBraW5kcy4KKyAgICBjb25zdCB2b2lkICpSSFM7CisgICAgLy8vIExIU0tpbmQgLSBUaGUgTm9kZUtpbmQgb2YgdGhlIGxlZnQgaGFuZCBzaWRlLCBcc2VlIGdldExIU0tpbmQoKS4KKyAgICB1bnNpZ25lZCBjaGFyIExIU0tpbmQ7CisgICAgLy8vIFJIU0tpbmQgLSBUaGUgTm9kZUtpbmQgb2YgdGhlIGxlZnQgaGFuZCBzaWRlLCBcc2VlIGdldExIU0tpbmQoKS4KKyAgICB1bnNpZ25lZCBjaGFyIFJIU0tpbmQ7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gQ29uc3RydWN0IGEgbnVsbGFyeSB0d2luZTsgdGhlIGtpbmQgbXVzdCBiZSBOdWxsS2luZCBvciBFbXB0eUtpbmQuCisgICAgZXhwbGljaXQgVHdpbmUoTm9kZUtpbmQgS2luZCkKKyAgICAgIDogTEhTS2luZChLaW5kKSwgUkhTS2luZChFbXB0eUtpbmQpIHsKKyAgICAgIGFzc2VydChpc051bGxhcnkoKSAmJiAiSW52YWxpZCBraW5kISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSBiaW5hcnkgdHdpbmUuCisgICAgZXhwbGljaXQgVHdpbmUoY29uc3QgVHdpbmUgJl9MSFMsIGNvbnN0IFR3aW5lICZfUkhTKQorICAgICAgOiBMSFMoJl9MSFMpLCBSSFMoJl9SSFMpLCBMSFNLaW5kKFR3aW5lS2luZCksIFJIU0tpbmQoVHdpbmVLaW5kKSB7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSBmcm9tIGV4cGxpY2l0IHZhbHVlcy4KKyAgICBleHBsaWNpdCBUd2luZShjb25zdCB2b2lkICpfTEhTLCBOb2RlS2luZCBfTEhTS2luZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpfUkhTLCBOb2RlS2luZCBfUkhTS2luZCkKKyAgICAgIDogTEhTKF9MSFMpLCBSSFMoX1JIUyksIExIU0tpbmQoX0xIU0tpbmQpLCBSSFNLaW5kKF9SSFNLaW5kKSB7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBpc051bGwgLSBDaGVjayBmb3IgdGhlIG51bGwgdHdpbmUuCisgICAgYm9vbCBpc051bGwoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TEhTS2luZCgpID09IE51bGxLaW5kOworICAgIH0KKworICAgIC8vLyBpc0VtcHR5IC0gQ2hlY2sgZm9yIHRoZSBlbXB0eSB0d2luZS4KKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TEhTS2luZCgpID09IEVtcHR5S2luZDsKKyAgICB9CisKKyAgICAvLy8gaXNOdWxsYXJ5IC0gQ2hlY2sgaWYgdGhpcyBpcyBhIG51bGxhcnkgdHdpbmUgKG51bGwgb3IgZW1wdHkpLgorICAgIGJvb2wgaXNOdWxsYXJ5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzTnVsbCgpIHx8IGlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvLy8gaXNVbmFyeSAtIENoZWNrIGlmIHRoaXMgaXMgYSB1bmFyeSB0d2luZS4KKyAgICBib29sIGlzVW5hcnkoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0UkhTS2luZCgpID09IEVtcHR5S2luZCAmJiAhaXNOdWxsYXJ5KCk7CisgICAgfQorCisgICAgLy8vIGlzQmluYXJ5IC0gQ2hlY2sgaWYgdGhpcyBpcyBhIGJpbmFyeSB0d2luZS4KKyAgICBib29sIGlzQmluYXJ5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldExIU0tpbmQoKSAhPSBOdWxsS2luZCAmJiBnZXRSSFNLaW5kKCkgIT0gRW1wdHlLaW5kOworICAgIH0KKworICAgIC8vLyBpc1ZhbGlkIC0gQ2hlY2sgaWYgdGhpcyBpcyBhIHZhbGlkIHR3aW5lIChzYXRpc2Z5aW5nIHRoZSBpbnZhcmlhbnRzIG9uCisgICAgLy8vIG9yZGVyIGFuZCBudW1iZXIgb2YgYXJndW1lbnRzKS4KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAvLyBOdWxsYXJ5IHR3aW5lcyBhbHdheXMgaGF2ZSBFbXB0eSBvbiB0aGUgUkhTLgorICAgICAgaWYgKGlzTnVsbGFyeSgpICYmIGdldFJIU0tpbmQoKSAhPSBFbXB0eUtpbmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gTnVsbCBzaG91bGQgbmV2ZXIgYXBwZWFyIG9uIHRoZSBSSFMuCisgICAgICBpZiAoZ2V0UkhTS2luZCgpID09IE51bGxLaW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8vIFRoZSBSSFMgY2Fubm90IGJlIG5vbi1lbXB0eSBpZiB0aGUgTEhTIGlzIGVtcHR5LgorICAgICAgaWYgKGdldFJIU0tpbmQoKSAhPSBFbXB0eUtpbmQgJiYgZ2V0TEhTS2luZCgpID09IEVtcHR5S2luZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBBIHR3aW5lIGNoaWxkIHNob3VsZCBhbHdheXMgYmUgYmluYXJ5LgorICAgICAgaWYgKGdldExIU0tpbmQoKSA9PSBUd2luZUtpbmQgJiYKKyAgICAgICAgICAhc3RhdGljX2Nhc3Q8Y29uc3QgVHdpbmUqPihMSFMpLT5pc0JpbmFyeSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoZ2V0UkhTS2luZCgpID09IFR3aW5lS2luZCAmJgorICAgICAgICAgICFzdGF0aWNfY2FzdDxjb25zdCBUd2luZSo+KFJIUyktPmlzQmluYXJ5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8vIGdldExIU0tpbmQgLSBHZXQgdGhlIE5vZGVLaW5kIG9mIHRoZSBsZWZ0LWhhbmQgc2lkZS4KKyAgICBOb2RlS2luZCBnZXRMSFNLaW5kKCkgY29uc3QgeyByZXR1cm4gKE5vZGVLaW5kKSBMSFNLaW5kOyB9CisKKyAgICAvLy8gZ2V0UkhTS2luZCAtIEdldCB0aGUgTm9kZUtpbmQgb2YgdGhlIGxlZnQtaGFuZCBzaWRlLgorICAgIE5vZGVLaW5kIGdldFJIU0tpbmQoKSBjb25zdCB7IHJldHVybiAoTm9kZUtpbmQpIFJIU0tpbmQ7IH0KKworICAgIC8vLyBwcmludE9uZUNoaWxkIC0gUHJpbnQgb25lIGNoaWxkIGZyb20gYSB0d2luZS4KKyAgICB2b2lkIHByaW50T25lQ2hpbGQocmF3X29zdHJlYW0gJk9TLCBjb25zdCB2b2lkICpQdHIsIE5vZGVLaW5kIEtpbmQpIGNvbnN0OworCisgICAgLy8vIHByaW50T25lQ2hpbGRSZXByIC0gUHJpbnQgdGhlIHJlcHJlc2VudGF0aW9uIG9mIG9uZSBjaGlsZCBmcm9tIGEgdHdpbmUuCisgICAgdm9pZCBwcmludE9uZUNoaWxkUmVwcihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IHZvaWQgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVLaW5kIEtpbmQpIGNvbnN0OworCisgIHB1YmxpYzoKKyAgICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgICAgLy8vIEB7CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gZW1wdHkgc3RyaW5nLgorICAgIC8qaW1wbGljaXQqLyBUd2luZSgpIDogTEhTS2luZChFbXB0eUtpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgeworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBDIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gV2UgdGFrZSBjYXJlIGhlcmUgdG8gb3B0aW1pemUgIiIgaW50byB0aGUgZW1wdHkgdHdpbmUgLS0gdGhpcyB3aWxsIGJlCisgICAgLy8vIG9wdGltaXplZCBvdXQgZm9yIHN0cmluZyBjb25zdGFudHMuIFRoaXMgYWxsb3dzIFR3aW5lIGFyZ3VtZW50cyBoYXZlCisgICAgLy8vIGRlZmF1bHQgIiIgdmFsdWVzLCB3aXRob3V0IGludHJvZHVjaW5nIHVubmVjZXNzYXJ5IHN0cmluZyBjb25zdGFudHMuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IGNoYXIgKlN0cikKKyAgICAgIDogUkhTS2luZChFbXB0eUtpbmQpIHsKKyAgICAgIGlmIChTdHJbMF0gIT0gJ1wwJykgeworICAgICAgICBMSFMgPSBTdHI7CisgICAgICAgIExIU0tpbmQgPSBDU3RyaW5nS2luZDsKKyAgICAgIH0gZWxzZQorICAgICAgICBMSFNLaW5kID0gRW1wdHlLaW5kOworCisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiBzdGQ6OnN0cmluZy4KKyAgICAvKmltcGxpY2l0Ki8gVHdpbmUoY29uc3Qgc3RkOjpzdHJpbmcgJlN0cikKKyAgICAgIDogTEhTKCZTdHIpLCBMSFNLaW5kKFN0ZFN0cmluZ0tpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgeworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBTdHJpbmdSZWYuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IFN0cmluZ1JlZiAmU3RyKQorICAgICAgOiBMSFMoJlN0ciksIExIU0tpbmQoU3RyaW5nUmVmS2luZCksIFJIU0tpbmQoRW1wdHlLaW5kKSB7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBcYXJnIFZhbCBhcyBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgZXhwbGljaXQgVHdpbmUodW5zaWduZWQgVmFsKSAKKyAgICAgIDogTEhTKCh2b2lkKikoaW50cHRyX3QpVmFsKSwgTEhTS2luZChEZWNVSUtpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgeworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBcYXJnIFZhbCBhcyBhIHNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgZXhwbGljaXQgVHdpbmUoaW50IFZhbCkgCisgICAgICA6IExIUygodm9pZCopKGludHB0cl90KVZhbCksIExIU0tpbmQoRGVjSUtpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgeworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBcYXJnIFZhbCBhcyBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgZXhwbGljaXQgVHdpbmUoY29uc3QgdW5zaWduZWQgbG9uZyAmVmFsKSAKKyAgICAgIDogTEhTKCZWYWwpLCBMSFNLaW5kKERlY1VMS2luZCksIFJIU0tpbmQoRW1wdHlLaW5kKSB7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxhcmcgVmFsIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICBleHBsaWNpdCBUd2luZShjb25zdCBsb25nICZWYWwpIAorICAgICAgOiBMSFMoJlZhbCksIExIU0tpbmQoRGVjTEtpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgeworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBcYXJnIFZhbCBhcyBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgZXhwbGljaXQgVHdpbmUoY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICZWYWwpIAorICAgICAgOiBMSFMoJlZhbCksIExIU0tpbmQoRGVjVUxMS2luZCksIFJIU0tpbmQoRW1wdHlLaW5kKSB7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxhcmcgVmFsIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICBleHBsaWNpdCBUd2luZShjb25zdCBsb25nIGxvbmcgJlZhbCkgCisgICAgICA6IExIUygmVmFsKSwgTEhTS2luZChEZWNMTEtpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgeworICAgIH0KKworICAgIC8vIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0byBtYWtlIHN1cmUgdGhpcyBpcyBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUgd2UKKyAgICAvLyBuZWVkIGV4dHJhIGJpbmFyeSBjb25zdHJ1Y3RvcnMgZnJvbSBwYXJ0aWN1bGFyIHR5cGVzLiBXZSBjYW4ndCByZWx5IG9uCisgICAgLy8gdGhlIGNvbXBpbGVyIHRvIGJlIHNtYXJ0IGVub3VnaCB0byBmb2xkIG9wZXJhdG9yKygpL2NvbmNhdCgpIGRvd24gdG8gdGhlCisgICAgLy8gcmlnaHQgdGhpbmcuIFlldC4KKworICAgIC8vLyBDb25zdHJ1Y3QgYXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgYSBDIHN0cmluZyBhbmQgYSBTdHJpbmdSZWYuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IGNoYXIgKl9MSFMsIGNvbnN0IFN0cmluZ1JlZiAmX1JIUykKKyAgICAgIDogTEhTKF9MSFMpLCBSSFMoJl9SSFMpLCBMSFNLaW5kKENTdHJpbmdLaW5kKSwgUkhTS2luZChTdHJpbmdSZWZLaW5kKSB7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgYSBTdHJpbmdSZWYgYW5kIGEgQyBzdHJpbmcuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IFN0cmluZ1JlZiAmX0xIUywgY29uc3QgY2hhciAqX1JIUykKKyAgICAgIDogTEhTKCZfTEhTKSwgUkhTKF9SSFMpLCBMSFNLaW5kKFN0cmluZ1JlZktpbmQpLCBSSFNLaW5kKENTdHJpbmdLaW5kKSB7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSAnbnVsbCcgc3RyaW5nLCB3aGljaCBpcyBhbiBlbXB0eSBzdHJpbmcgdGhhdCBhbHdheXMKKyAgICAvLy8gY29uY2F0ZW5hdGVzIHRvIGZvcm0gYW5vdGhlciBlbXB0eSBzdHJpbmcuCisgICAgc3RhdGljIFR3aW5lIGNyZWF0ZU51bGwoKSB7CisgICAgICByZXR1cm4gVHdpbmUoTnVsbEtpbmQpOworICAgIH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBOdW1lcmljIENvbnZlcnNpb25zCisgICAgLy8vIEB7CisKKyAgICAvLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBcYXJnIFZhbCBhcyBhbiB1bnNpZ25lZCBoZXhhZGVjaW1hbCBpbnRlZ2VyLgorICAgIHN0YXRpYyBUd2luZSB1dG9oZXhzdHIoY29uc3QgdWludDY0X3QgJlZhbCkgeworICAgICAgcmV0dXJuIFR3aW5lKCZWYWwsIFVIZXhLaW5kLCAwLCBFbXB0eUtpbmQpOworICAgIH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBQcmVkaWNhdGUgT3BlcmF0aW9ucworICAgIC8vLyBAeworCisgICAgLy8vIGlzVHJpdmlhbGx5RW1wdHkgLSBDaGVjayBpZiB0aGlzIHR3aW5lIGlzIHRyaXZpYWxseSBlbXB0eTsgYSBmYWxzZQorICAgIC8vLyByZXR1cm4gdmFsdWUgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGUgdHdpbmUgaXMgZW1wdHkuCisgICAgYm9vbCBpc1RyaXZpYWxseUVtcHR5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzTnVsbGFyeSgpOworICAgIH0KKyAgICAKKyAgICAvLy8gaXNTaW5nbGVTdHJpbmdSZWYgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHR3aW5lIGNhbiBiZSBkeW5hbWljYWxseQorICAgIC8vLyBhY2Nlc3NlZCBhcyBhIHNpbmdsZSBTdHJpbmdSZWYgdmFsdWUgd2l0aCBnZXRTaW5nbGVTdHJpbmdSZWYoKS4KKyAgICBib29sIGlzU2luZ2xlU3RyaW5nUmVmKCkgY29uc3QgeworICAgICAgaWYgKGdldFJIU0tpbmQoKSAhPSBFbXB0eUtpbmQpIHJldHVybiBmYWxzZTsKKyAgICAgIAorICAgICAgc3dpdGNoIChnZXRMSFNLaW5kKCkpIHsKKyAgICAgIGNhc2UgRW1wdHlLaW5kOgorICAgICAgY2FzZSBDU3RyaW5nS2luZDoKKyAgICAgIGNhc2UgU3RkU3RyaW5nS2luZDoKKyAgICAgIGNhc2UgU3RyaW5nUmVmS2luZDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIFN0cmluZyBPcGVyYXRpb25zCisgICAgLy8vIEB7CisKKyAgICBUd2luZSBjb25jYXQoY29uc3QgVHdpbmUgJlN1ZmZpeCkgY29uc3Q7CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgT3V0cHV0ICYgQ29udmVyc2lvbi4KKyAgICAvLy8gQHsKKworICAgIC8vLyBzdHIgLSBSZXR1cm4gdGhlIHR3aW5lIGNvbnRlbnRzIGFzIGEgc3RkOjpzdHJpbmcuCisgICAgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3Q7CisKKyAgICAvLy8gdG9WZWN0b3IgLSBXcml0ZSB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZyBpbnRvIHRoZSBnaXZlbiBTbWFsbFN0cmluZyBvcgorICAgIC8vLyBTbWFsbFZlY3Rvci4KKyAgICB2b2lkIHRvVmVjdG9yKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT3V0KSBjb25zdDsKKworICAgIC8vLyBnZXRTaW5nbGVTdHJpbmdSZWYgLSBUaGlzIHJldHVybnMgdGhlIHR3aW5lIGFzIGEgc2luZ2xlIFN0cmluZ1JlZi4gIFRoaXMKKyAgICAvLy8gbWV0aG9kIGlzIG9ubHkgdmFsaWQgaWYgaXNTaW5nbGVTdHJpbmdSZWYoKSBpcyB0cnVlLgorICAgIFN0cmluZ1JlZiBnZXRTaW5nbGVTdHJpbmdSZWYoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNTaW5nbGVTdHJpbmdSZWYoKSAmJiJUaGlzIGNhbm5vdCBiZSBoYWQgYXMgYSBzaW5nbGUgc3RyaW5ncmVmISIpOworICAgICAgc3dpdGNoIChnZXRMSFNLaW5kKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJPdXQgb2Ygc3luYyB3aXRoIGlzU2luZ2xlU3RyaW5nUmVmIik7CisgICAgICBjYXNlIEVtcHR5S2luZDogICAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisgICAgICBjYXNlIENTdHJpbmdLaW5kOiAgICByZXR1cm4gU3RyaW5nUmVmKChjb25zdCBjaGFyKilMSFMpOworICAgICAgY2FzZSBTdGRTdHJpbmdLaW5kOiAgcmV0dXJuIFN0cmluZ1JlZigqKGNvbnN0IHN0ZDo6c3RyaW5nKilMSFMpOworICAgICAgY2FzZSBTdHJpbmdSZWZLaW5kOiAgcmV0dXJuICooY29uc3QgU3RyaW5nUmVmKilMSFM7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIHRvU3RyaW5nUmVmIC0gVGhpcyByZXR1cm5zIHRoZSB0d2luZSBhcyBhIHNpbmdsZSBTdHJpbmdSZWYgaWYgaXQgY2FuIGJlCisgICAgLy8vIHJlcHJlc2VudGVkIGFzIHN1Y2guIE90aGVyd2lzZSB0aGUgdHdpbmUgaXMgd3JpdHRlbiBpbnRvIHRoZSBnaXZlbgorICAgIC8vLyBTbWFsbFZlY3RvciBhbmQgYSBTdHJpbmdSZWYgdG8gdGhlIFNtYWxsVmVjdG9yJ3MgZGF0YSBpcyByZXR1cm5lZC4KKyAgICBTdHJpbmdSZWYgdG9TdHJpbmdSZWYoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXQpIGNvbnN0OworCisgICAgLy8vIHByaW50IC0gV3JpdGUgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgdGhpcyB0d2luZSB0byB0aGUKKyAgICAvLy8gc3RyZWFtIFxhcmcgT1MuCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgICAgLy8vIGR1bXAgLSBEdW1wIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHJlcHJlc2VudGVkIGJ5IHRoaXMgdHdpbmUgdG8gc3RkZXJyLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIHByaW50IC0gV3JpdGUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHdpbmUgdG8gdGhlIHN0cmVhbSBcYXJnIE9TLgorICAgIHZvaWQgcHJpbnRSZXByKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gZHVtcFJlcHIgLSBEdW1wIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR3aW5lIHRvIHN0ZGVyci4KKyAgICB2b2lkIGR1bXBSZXByKCkgY29uc3Q7CisKKyAgICAvLy8gQH0KKyAgfTsKKworICAvLy8gQG5hbWUgVHdpbmUgSW5saW5lIEltcGxlbWVudGF0aW9ucworICAvLy8gQHsKKworICBpbmxpbmUgVHdpbmUgVHdpbmU6OmNvbmNhdChjb25zdCBUd2luZSAmU3VmZml4KSBjb25zdCB7CisgICAgLy8gQ29uY2F0ZW5hdGlvbiB3aXRoIG51bGwgaXMgbnVsbC4KKyAgICBpZiAoaXNOdWxsKCkgfHwgU3VmZml4LmlzTnVsbCgpKQorICAgICAgcmV0dXJuIFR3aW5lKE51bGxLaW5kKTsKKworICAgIC8vIENvbmNhdGVuYXRpb24gd2l0aCBlbXB0eSB5aWVsZHMgdGhlIG90aGVyIHNpZGUuCisgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgIHJldHVybiBTdWZmaXg7CisgICAgaWYgKFN1ZmZpeC5pc0VtcHR5KCkpCisgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgbm9kZSwgdGFraW5nIGNhcmUgdG8gZm9sZCBpbiB1bmFyeQorICAgIC8vIHR3aW5lcy4KKyAgICBjb25zdCB2b2lkICpOZXdMSFMgPSB0aGlzLCAqTmV3UkhTID0gJlN1ZmZpeDsKKyAgICBOb2RlS2luZCBOZXdMSFNLaW5kID0gVHdpbmVLaW5kLCBOZXdSSFNLaW5kID0gVHdpbmVLaW5kOworICAgIGlmIChpc1VuYXJ5KCkpIHsKKyAgICAgIE5ld0xIUyA9IExIUzsKKyAgICAgIE5ld0xIU0tpbmQgPSBnZXRMSFNLaW5kKCk7CisgICAgfQorICAgIGlmIChTdWZmaXguaXNVbmFyeSgpKSB7CisgICAgICBOZXdSSFMgPSBTdWZmaXguTEhTOworICAgICAgTmV3UkhTS2luZCA9IFN1ZmZpeC5nZXRMSFNLaW5kKCk7CisgICAgfQorCisgICAgcmV0dXJuIFR3aW5lKE5ld0xIUywgTmV3TEhTS2luZCwgTmV3UkhTLCBOZXdSSFNLaW5kKTsKKyAgfQorCisgIGlubGluZSBUd2luZSBvcGVyYXRvcisoY29uc3QgVHdpbmUgJkxIUywgY29uc3QgVHdpbmUgJlJIUykgeworICAgIHJldHVybiBMSFMuY29uY2F0KFJIUyk7CisgIH0KKworICAvLy8gQWRkaXRpb25hbCBvdmVybG9hZCB0byBndWFyYW50ZWUgc2ltcGxpZmllZCBjb2RlZ2VuOyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgLy8vIGNvbmNhdCgpLgorCisgIGlubGluZSBUd2luZSBvcGVyYXRvcisoY29uc3QgY2hhciAqTEhTLCBjb25zdCBTdHJpbmdSZWYgJlJIUykgeworICAgIHJldHVybiBUd2luZShMSFMsIFJIUyk7CisgIH0KKworICAvLy8gQWRkaXRpb25hbCBvdmVybG9hZCB0byBndWFyYW50ZWUgc2ltcGxpZmllZCBjb2RlZ2VuOyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgLy8vIGNvbmNhdCgpLgorCisgIGlubGluZSBUd2luZSBvcGVyYXRvcisoY29uc3QgU3RyaW5nUmVmICZMSFMsIGNvbnN0IGNoYXIgKlJIUykgeworICAgIHJldHVybiBUd2luZShMSFMsIFJIUyk7CisgIH0KKworICBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBUd2luZSAmUkhTKSB7CisgICAgUkhTLnByaW50KE9TKTsKKyAgICByZXR1cm4gT1M7CisgIH0KKworICAvLy8gQH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1VuaXF1ZVZlY3Rvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9VbmlxdWVWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDAyZDFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9VbmlxdWVWZWN0b3IuaApAQCAtMCwwICsxLDg5IEBACisvLz09PS0tIGxsdm0vQURUL1VuaXF1ZVZlY3Rvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1VOSVFVRVZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQURUX1VOSVFVRVZFQ1RPUl9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBVbmlxdWVWZWN0b3IgLSBUaGlzIGNsYXNzIHByb2R1Y2VzIGEgc2VxdWVudGlhbCBJRCBudW1iZXIgKGJhc2UgMSkgZm9yIGVhY2gKKy8vLyB1bmlxdWUgZW50cnkgdGhhdCBpcyBhZGRlZC4gIFQgaXMgdGhlIHR5cGUgb2YgZW50cmllcyBpbiB0aGUgdmVjdG9yLiBUaGlzCisvLy8gY2xhc3Mgc2hvdWxkIGhhdmUgYW4gaW1wbGVtZW50YXRpb24gb2Ygb3BlcmF0b3I9PSBhbmQgb2Ygb3BlcmF0b3I8LgorLy8vIEVudHJpZXMgY2FuIGJlIGZldGNoZWQgdXNpbmcgb3BlcmF0b3JbXSB3aXRoIHRoZSBlbnRyeSBJRC4KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIFVuaXF1ZVZlY3RvciB7Citwcml2YXRlOgorICAvLyBNYXAgLSBVc2VkIHRvIGhhbmRsZSB0aGUgY29ycmVzcG9uZGVuY2Ugb2YgZW50cnkgdG8gSUQuCisgIHN0ZDo6bWFwPFQsIHVuc2lnbmVkPiBNYXA7CisKKyAgLy8gVmVjdG9yIC0gSUQgb3JkZXJlZCB2ZWN0b3Igb2YgZW50cmllcy4gRW50cmllcyBjYW4gYmUgaW5kZXhlZCBieSBJRCAtIDEuCisgIC8vCisgIHN0ZDo6dmVjdG9yPFQ+IFZlY3RvcjsKKworcHVibGljOgorICAvLy8gaW5zZXJ0IC0gQXBwZW5kIGVudHJ5IHRvIHRoZSB2ZWN0b3IgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiAgUmV0dXJucworICAvLy8gdGhlIGVudHJ5J3MgaW5kZXggKyAxIHRvIGJlIHVzZWQgYXMgYSB1bmlxdWUgSUQuCisgIHVuc2lnbmVkIGluc2VydChjb25zdCBUICZFbnRyeSkgeworICAgIC8vIENoZWNrIGlmIHRoZSBlbnRyeSBpcyBhbHJlYWR5IGluIHRoZSBtYXAuCisgICAgdW5zaWduZWQgJlZhbCA9IE1hcFtFbnRyeV07CisKKyAgICAvLyBTZWUgaWYgZW50cnkgZXhpc3RzLCBpZiBzbyByZXR1cm4gcHJpb3IgSUQuCisgICAgaWYgKFZhbCkgcmV0dXJuIFZhbDsKKworICAgIC8vIENvbXB1dGUgSUQgZm9yIGVudHJ5LgorICAgIFZhbCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihWZWN0b3Iuc2l6ZSgpKSArIDE7CisKKyAgICAvLyBJbnNlcnQgaW4gdmVjdG9yLgorICAgIFZlY3Rvci5wdXNoX2JhY2soRW50cnkpOworICAgIHJldHVybiBWYWw7CisgIH0KKworICAvLy8gaWRGb3IgLSByZXR1cm4gdGhlIElEIGZvciBhbiBleGlzdGluZyBlbnRyeS4gIFJldHVybnMgMCBpZiB0aGUgZW50cnkgaXMKKyAgLy8vIG5vdCBmb3VuZC4KKyAgdW5zaWduZWQgaWRGb3IoY29uc3QgVCAmRW50cnkpIGNvbnN0IHsKKyAgICAvLyBTZWFyY2ggZm9yIGVudHJ5IGluIHRoZSBtYXAuCisgICAgdHlwZW5hbWUgc3RkOjptYXA8VCwgdW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBNSSA9IE1hcC5maW5kKEVudHJ5KTsKKworICAgIC8vIFNlZSBpZiBlbnRyeSBleGlzdHMsIGlmIHNvIHJldHVybiBJRC4KKyAgICBpZiAoTUkgIT0gTWFwLmVuZCgpKSByZXR1cm4gTUktPnNlY29uZDsKKworICAgIC8vIE5vIGx1Y2suCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gb3BlcmF0b3JbXSAtIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBJRC4KKyAgLy8vCisgIGNvbnN0IFQgJm9wZXJhdG9yW10odW5zaWduZWQgSUQpIGNvbnN0IHsKKyAgICBhc3NlcnQoSUQtMSA8IHNpemUoKSAmJiAiSUQgaXMgMCBvciBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIFZlY3RvcltJRCAtIDFdOworICB9CisKKyAgLy8vIHNpemUgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdmVjdG9yLgorICAvLy8KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBWZWN0b3Iuc2l6ZSgpOyB9CisKKyAgLy8vIGVtcHR5IC0gUmV0dXJucyB0cnVlIGlmIHRoZSB2ZWN0b3IgaXMgZW1wdHkuCisgIC8vLworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gVmVjdG9yLmVtcHR5KCk7IH0KKworICAvLy8gcmVzZXQgLSBDbGVhcnMgYWxsIHRoZSBlbnRyaWVzLgorICAvLy8KKyAgdm9pZCByZXNldCgpIHsKKyAgICBNYXAuY2xlYXIoKTsKKyAgICBWZWN0b3IucmVzaXplKDAsIDApOworICB9Cit9OworCit9IC8vIEVuZCBvZiBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfVU5JUVVFVkVDVE9SX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvVmFsdWVNYXAuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvVmFsdWVNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9WYWx1ZU1hcC5oCkBAIC0wLDAgKzEsMzY4IEBACisvLz09PS0gbGx2bS9BRFQvVmFsdWVNYXAuaCAtIFNhZmUgbWFwIGZyb20gVmFsdWVzIHRvIGRhdGEgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBWYWx1ZU1hcCBjbGFzcy4gIFZhbHVlTWFwIG1hcHMgVmFsdWUqIG9yIGFueSBzdWJjbGFzcworLy8gdG8gYW4gYXJiaXRyYXJ5IG90aGVyIHR5cGUuICBJdCBwcm92aWRlcyB0aGUgRGVuc2VNYXAgaW50ZXJmYWNlIGJ1dCB1cGRhdGVzCisvLyBpdHNlbGYgdG8gcmVtYWluIHNhZmUgd2hlbiBrZXlzIGFyZSBSQVVXZWQgb3IgZGVsZXRlZC4gIEJ5IGRlZmF1bHQsIHdoZW4gYQorLy8ga2V5IGlzIFJBVVdlZCBmcm9tIFYxIHRvIFYyLCB0aGUgb2xkIG1hcHBpbmcgVjEtPnRhcmdldCBpcyByZW1vdmVkLCBhbmQgYSBuZXcKKy8vIG1hcHBpbmcgVjItPnRhcmdldCBpcyBhZGRlZC4gIElmIFYyIGFscmVhZHkgZXhpc3RlZCwgaXRzIG9sZCB0YXJnZXQgaXMKKy8vIG92ZXJ3cml0dGVuLiAgV2hlbiBhIGtleSBpcyBkZWxldGVkLCBpdHMgbWFwcGluZyBpcyByZW1vdmVkLgorLy8KKy8vIFlvdSBjYW4gb3ZlcnJpZGUgYSBWYWx1ZU1hcCdzIENvbmZpZyBwYXJhbWV0ZXIgdG8gY29udHJvbCBleGFjdGx5IHdoYXQKKy8vIGhhcHBlbnMgb24gUkFVVyBhbmQgZGVzdHJ1Y3Rpb24gYW5kIHRvIGdldCBjYWxsZWQgYmFjayBvbiBlYWNoIGV2ZW50LiAgSXQncworLy8gbGVnYWwgdG8gY2FsbCBiYWNrIGludG8gdGhlIFZhbHVlTWFwIGZyb20gYSBDb25maWcncyBjYWxsYmFja3MuICBDb25maWcKKy8vIHBhcmFtZXRlcnMgc2hvdWxkIGluaGVyaXQgZnJvbSBWYWx1ZU1hcENvbmZpZzxLZXlUPiB0byBnZXQgZGVmYXVsdAorLy8gaW1wbGVtZW50YXRpb25zIG9mIGFsbCB0aGUgbWV0aG9kcyBWYWx1ZU1hcCB1c2VzLiAgU2VlIFZhbHVlTWFwQ29uZmlnIGZvcgorLy8gZG9jdW1lbnRhdGlvbiBvZiB0aGUgZnVuY3Rpb25zIHlvdSBjYW4gb3ZlcnJpZGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9WQUxVRU1BUF9ICisjZGVmaW5lIExMVk1fQURUX1ZBTFVFTUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTXV0ZXguaCIKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgQ29uZmlnLCB0eXBlbmFtZSBWYWx1ZUluZm9UPgorY2xhc3MgVmFsdWVNYXBDYWxsYmFja1ZIOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZU1hcFQsIHR5cGVuYW1lIEtleVQ+CitjbGFzcyBWYWx1ZU1hcEl0ZXJhdG9yOwordGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VNYXBULCB0eXBlbmFtZSBLZXlUPgorY2xhc3MgVmFsdWVNYXBDb25zdEl0ZXJhdG9yOworCisvLy8gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBjb25maWd1cmFibGUgYXNwZWN0cyBvZgorLy8vIFZhbHVlTWFwPD4uICBVc2VyIENvbmZpZ3Mgc2hvdWxkIGluaGVyaXQgZnJvbSB0aGlzIGNsYXNzIHRvIGJlIGFzIGNvbXBhdGlibGUKKy8vLyBhcyBwb3NzaWJsZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiBWYWx1ZU1hcC4KK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQ+CitzdHJ1Y3QgVmFsdWVNYXBDb25maWcgeworICAvLy8gSWYgRm9sbG93UkFVVyBpcyB0cnVlLCB0aGUgVmFsdWVNYXAgd2lsbCB1cGRhdGUgbWFwcGluZ3Mgb24gUkFVVy4gSWYgaXQncworICAvLy8gZmFsc2UsIHRoZSBWYWx1ZU1hcCB3aWxsIGxlYXZlIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluIHBsYWNlLgorICBlbnVtIHsgRm9sbG93UkFVVyA9IHRydWUgfTsKKworICAvLyBBbGwgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgZmlyc3QgYXJndW1lbnQgb2YgdHlwZSBFeHRyYURhdGEuICBUaGUKKyAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgaW4gdGhpcyBjbGFzcyB0YWtlIGEgdGVtcGxhdGVkIGZpcnN0IGFyZ3VtZW50IHNvCisgIC8vIHRoYXQgdXNlcnMnIHN1YmNsYXNzZXMgY2FuIHVzZSBhbnkgdHlwZSB0aGV5IHdhbnQgd2l0aG91dCBoYXZpbmcgdG8KKyAgLy8gb3ZlcnJpZGUgYWxsIHRoZSBkZWZhdWx0cy4KKyAgc3RydWN0IEV4dHJhRGF0YSB7fTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBFeHRyYURhdGFUPgorICBzdGF0aWMgdm9pZCBvblJBVVcoY29uc3QgRXh0cmFEYXRhVCAmIC8qRGF0YSovLCBLZXlUIC8qT2xkKi8sIEtleVQgLypOZXcqLykge30KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRXh0cmFEYXRhVD4KKyAgc3RhdGljIHZvaWQgb25EZWxldGUoY29uc3QgRXh0cmFEYXRhVCAmLypEYXRhKi8sIEtleVQgLypPbGQqLykge30KKworICAvLy8gUmV0dXJucyBhIG11dGV4IHRoYXQgc2hvdWxkIGJlIGFjcXVpcmVkIGFyb3VuZCBhbnkgY2hhbmdlcyB0byB0aGUgbWFwLgorICAvLy8gVGhpcyBpcyBvbmx5IGFjcXVpcmVkIGZyb20gdGhlIENhbGxiYWNrVkggKGFuZCBoZWxkIGFyb3VuZCBjYWxscyB0byBvblJBVVcKKyAgLy8vIGFuZCBvbkRlbGV0ZSkgYW5kIG5vdCBpbnNpZGUgb3RoZXIgVmFsdWVNYXAgbWV0aG9kcy4gIE5VTEwgbWVhbnMgdGhhdCBubworICAvLy8gbXV0ZXggaXMgbmVjZXNzYXJ5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBFeHRyYURhdGFUPgorICBzdGF0aWMgc3lzOjpNdXRleCAqZ2V0TXV0ZXgoY29uc3QgRXh0cmFEYXRhVCAmLypEYXRhKi8pIHsgcmV0dXJuIE5VTEw7IH0KK307CisKKy8vLyBTZWUgdGhlIGZpbGUgY29tbWVudC4KK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgQ29uZmlnID0gVmFsdWVNYXBDb25maWc8S2V5VD4sCisgICAgICAgICB0eXBlbmFtZSBWYWx1ZUluZm9UID0gRGVuc2VNYXBJbmZvPFZhbHVlVD4gPgorY2xhc3MgVmFsdWVNYXAgeworICBmcmllbmQgY2xhc3MgVmFsdWVNYXBDYWxsYmFja1ZIPEtleVQsIFZhbHVlVCwgQ29uZmlnLCBWYWx1ZUluZm9UPjsKKyAgdHlwZWRlZiBWYWx1ZU1hcENhbGxiYWNrVkg8S2V5VCwgVmFsdWVULCBDb25maWcsIFZhbHVlSW5mb1Q+IFZhbHVlTWFwQ1ZIOworICB0eXBlZGVmIERlbnNlTWFwPFZhbHVlTWFwQ1ZILCBWYWx1ZVQsIERlbnNlTWFwSW5mbzxWYWx1ZU1hcENWSD4sCisgICAgICAgICAgICAgICAgICAgVmFsdWVJbmZvVD4gTWFwVDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb25maWc6OkV4dHJhRGF0YSBFeHRyYURhdGE7CisgIE1hcFQgTWFwOworICBFeHRyYURhdGEgRGF0YTsKKyAgVmFsdWVNYXAoY29uc3QgVmFsdWVNYXAmKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICBWYWx1ZU1hcCYgb3BlcmF0b3I9KGNvbnN0IFZhbHVlTWFwJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKK3B1YmxpYzoKKyAgdHlwZWRlZiBLZXlUIGtleV90eXBlOworICB0eXBlZGVmIFZhbHVlVCBtYXBwZWRfdHlwZTsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiB2YWx1ZV90eXBlOworCisgIGV4cGxpY2l0IFZhbHVlTWFwKHVuc2lnbmVkIE51bUluaXRCdWNrZXRzID0gNjQpCisgICAgOiBNYXAoTnVtSW5pdEJ1Y2tldHMpLCBEYXRhKCkge30KKyAgZXhwbGljaXQgVmFsdWVNYXAoY29uc3QgRXh0cmFEYXRhICZEYXRhLCB1bnNpZ25lZCBOdW1Jbml0QnVja2V0cyA9IDY0KQorICAgIDogTWFwKE51bUluaXRCdWNrZXRzKSwgRGF0YShEYXRhKSB7fQorCisgIH5WYWx1ZU1hcCgpIHt9CisKKyAgdHlwZWRlZiBWYWx1ZU1hcEl0ZXJhdG9yPE1hcFQsIEtleVQ+IGl0ZXJhdG9yOworICB0eXBlZGVmIFZhbHVlTWFwQ29uc3RJdGVyYXRvcjxNYXBULCBLZXlUPiBjb25zdF9pdGVyYXRvcjsKKyAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IoTWFwLmJlZ2luKCkpOyB9CisgIGlubGluZSBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcihNYXAuZW5kKCkpOyB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKE1hcC5iZWdpbigpKTsgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoTWFwLmVuZCgpKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBNYXAuZW1wdHkoKTsgfQorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTWFwLnNpemUoKTsgfQorCisgIC8vLyBHcm93IHRoZSBtYXAgc28gdGhhdCBpdCBoYXMgYXQgbGVhc3QgU2l6ZSBidWNrZXRzLiBEb2VzIG5vdCBzaHJpbmsKKyAgdm9pZCByZXNpemUoc2l6ZV90IFNpemUpIHsgTWFwLnJlc2l6ZShTaXplKTsgfQorCisgIHZvaWQgY2xlYXIoKSB7IE1hcC5jbGVhcigpOyB9CisKKyAgLy8vIGNvdW50IC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgaW4gdGhlIG1hcC4KKyAgYm9vbCBjb3VudChjb25zdCBLZXlUICZWYWwpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFwLmNvdW50KFdyYXAoVmFsKSk7CisgIH0KKworICBpdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJlZhbCkgeworICAgIHJldHVybiBpdGVyYXRvcihNYXAuZmluZChXcmFwKFZhbCkpKTsKKyAgfQorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJlZhbCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihNYXAuZmluZChXcmFwKFZhbCkpKTsKKyAgfQorCisgIC8vLyBsb29rdXAgLSBSZXR1cm4gdGhlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleSwgb3IgYSBkZWZhdWx0CisgIC8vLyBjb25zdHJ1Y3RlZCB2YWx1ZSBpZiBubyBzdWNoIGVudHJ5IGV4aXN0cy4KKyAgVmFsdWVUIGxvb2t1cChjb25zdCBLZXlUICZWYWwpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFwLmxvb2t1cChXcmFwKFZhbCkpOworICB9CisKKyAgLy8gSW5zZXJ0cyBrZXksdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleSBpc24ndCBhbHJlYWR5IGluIHRoZSBtYXAuCisgIC8vIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IHVwZGF0ZSB0aGUKKyAgLy8gdmFsdWUuCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICZLVikgeworICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBNYXBUOjppdGVyYXRvciwgYm9vbD4gbWFwX3Jlc3VsdD0KKyAgICAgIE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoV3JhcChLVi5maXJzdCksIEtWLnNlY29uZCkpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihtYXBfcmVzdWx0LmZpcnN0KSwgbWFwX3Jlc3VsdC5zZWNvbmQpOworICB9CisKKyAgLy8vIGluc2VydCAtIFJhbmdlIGluc2VydGlvbiBvZiBwYWlycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdD4KKyAgdm9pZCBpbnNlcnQoSW5wdXRJdCBJLCBJbnB1dEl0IEUpIHsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpCisgICAgICBpbnNlcnQoKkkpOworICB9CisKKworICBib29sIGVyYXNlKGNvbnN0IEtleVQgJlZhbCkgeworICAgIHJldHVybiBNYXAuZXJhc2UoV3JhcChWYWwpKTsKKyAgfQorICBib29sIGVyYXNlKGl0ZXJhdG9yIEkpIHsKKyAgICByZXR1cm4gTWFwLmVyYXNlKEkuYmFzZSgpKTsKKyAgfQorCisgIHZhbHVlX3R5cGUmIEZpbmRBbmRDb25zdHJ1Y3QoY29uc3QgS2V5VCAmS2V5KSB7CisgICAgcmV0dXJuIE1hcC5GaW5kQW5kQ29uc3RydWN0KFdyYXAoS2V5KSk7CisgIH0KKworICBWYWx1ZVQgJm9wZXJhdG9yW10oY29uc3QgS2V5VCAmS2V5KSB7CisgICAgcmV0dXJuIE1hcFtXcmFwKEtleSldOworICB9CisKKyAgLy8vIGlzUG9pbnRlckludG9CdWNrZXRzQXJyYXkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgcG9pbnRzCisgIC8vLyBzb21ld2hlcmUgaW50byB0aGUgVmFsdWVNYXAncyBhcnJheSBvZiBidWNrZXRzIChpLmUuIGVpdGhlciB0byBhIGtleSBvcgorICAvLy8gdmFsdWUgaW4gdGhlIFZhbHVlTWFwKS4KKyAgYm9vbCBpc1BvaW50ZXJJbnRvQnVja2V0c0FycmF5KGNvbnN0IHZvaWQgKlB0cikgY29uc3QgeworICAgIHJldHVybiBNYXAuaXNQb2ludGVySW50b0J1Y2tldHNBcnJheShQdHIpOworICB9CisKKyAgLy8vIGdldFBvaW50ZXJJbnRvQnVja2V0c0FycmF5KCkgLSBSZXR1cm4gYW4gb3BhcXVlIHBvaW50ZXIgaW50byB0aGUgYnVja2V0cworICAvLy8gYXJyYXkuICBJbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBtZXRob2QsIHRoaXMgY2FuIGJlIHVzZWQgdG8KKyAgLy8vIGRldGVybWluZSB3aGV0aGVyIGFuIGluc2VydGlvbiBjYXVzZWQgdGhlIFZhbHVlTWFwIHRvIHJlYWxsb2NhdGUuCisgIGNvbnN0IHZvaWQgKmdldFBvaW50ZXJJbnRvQnVja2V0c0FycmF5KCkgY29uc3QgeworICAgIHJldHVybiBNYXAuZ2V0UG9pbnRlckludG9CdWNrZXRzQXJyYXkoKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBUYWtlcyBhIGtleSBiZWluZyBsb29rZWQgdXAgaW4gdGhlIG1hcCBhbmQgd3JhcHMgaXQgaW50byBhCisgIC8vIFZhbHVlTWFwQ2FsbGJhY2tWSCwgdGhlIGFjdHVhbCBrZXkgdHlwZSBvZiB0aGUgbWFwLiAgV2UgdXNlIGEgaGVscGVyCisgIC8vIGZ1bmN0aW9uIGJlY2F1c2UgVmFsdWVNYXBDVkggaXMgY29uc3RydWN0ZWQgd2l0aCBhIHNlY29uZCBwYXJhbWV0ZXIuCisgIFZhbHVlTWFwQ1ZIIFdyYXAoS2V5VCBrZXkpIGNvbnN0IHsKKyAgICAvLyBUaGUgb25seSB3YXkgdGhlIHJlc3VsdGluZyBDYWxsYmFja1ZIIGNvdWxkIHRyeSB0byBtb2RpZnkgKnRoaXMgKG1ha2luZworICAgIC8vIHRoZSBjb25zdF9jYXN0IGluY29ycmVjdCkgaXMgaWYgaXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBtYXAuICBCdXQgdGhlbgorICAgIC8vIHRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gYSBub24tY29uc3QgbWV0aG9kLCBtYWtpbmcgdGhlCisgICAgLy8gY29uc3RfY2FzdCBvay4KKyAgICByZXR1cm4gVmFsdWVNYXBDVkgoa2V5LCBjb25zdF9jYXN0PFZhbHVlTWFwKj4odGhpcykpOworICB9Cit9OworCisvLyBUaGlzIENhbGxiYWNrVkggdXBkYXRlcyBpdHMgVmFsdWVNYXAgd2hlbiB0aGUgY29udGFpbmVkIFZhbHVlIGNoYW5nZXMsCisvLyBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyBwcmVmZXJlbmNlcyBleHByZXNzZWQgdGhyb3VnaCB0aGUgQ29uZmlnIG9iamVjdC4KK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgQ29uZmlnLCB0eXBlbmFtZSBWYWx1ZUluZm9UPgorY2xhc3MgVmFsdWVNYXBDYWxsYmFja1ZIIDogcHVibGljIENhbGxiYWNrVkggeworICBmcmllbmQgY2xhc3MgVmFsdWVNYXA8S2V5VCwgVmFsdWVULCBDb25maWcsIFZhbHVlSW5mb1Q+OworICBmcmllbmQgc3RydWN0IERlbnNlTWFwSW5mbzxWYWx1ZU1hcENhbGxiYWNrVkg+OworICB0eXBlZGVmIFZhbHVlTWFwPEtleVQsIFZhbHVlVCwgQ29uZmlnLCBWYWx1ZUluZm9UPiBWYWx1ZU1hcFQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgbGx2bTo6cmVtb3ZlX3BvaW50ZXI8S2V5VD46OnR5cGUgS2V5U2Fuc1BvaW50ZXJUOworCisgIFZhbHVlTWFwVCAqTWFwOworCisgIFZhbHVlTWFwQ2FsbGJhY2tWSChLZXlUIEtleSwgVmFsdWVNYXBUICpNYXApCisgICAgICA6IENhbGxiYWNrVkgoY29uc3RfY2FzdDxWYWx1ZSo+KHN0YXRpY19jYXN0PGNvbnN0IFZhbHVlKj4oS2V5KSkpLAorICAgICAgICBNYXAoTWFwKSB7fQorCitwdWJsaWM6CisgIEtleVQgVW53cmFwKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPEtleVNhbnNQb2ludGVyVD4oZ2V0VmFsUHRyKCkpOyB9CisKKyAgdmlydHVhbCB2b2lkIGRlbGV0ZWQoKSB7CisgICAgLy8gTWFrZSBhIGNvcHkgdGhhdCB3b24ndCBnZXQgY2hhbmdlZCBldmVuIHdoZW4gKnRoaXMgaXMgZGVzdHJveWVkLgorICAgIFZhbHVlTWFwQ2FsbGJhY2tWSCBDb3B5KCp0aGlzKTsKKyAgICBzeXM6Ok11dGV4ICpNID0gQ29uZmlnOjpnZXRNdXRleChDb3B5Lk1hcC0+RGF0YSk7CisgICAgaWYgKE0pCisgICAgICBNLT5hY3F1aXJlKCk7CisgICAgQ29uZmlnOjpvbkRlbGV0ZShDb3B5Lk1hcC0+RGF0YSwgQ29weS5VbndyYXAoKSk7ICAvLyBNYXkgZGVzdHJveSAqdGhpcy4KKyAgICBDb3B5Lk1hcC0+TWFwLmVyYXNlKENvcHkpOyAgLy8gRGVmaW5pdGVseSBkZXN0cm95cyAqdGhpcy4KKyAgICBpZiAoTSkKKyAgICAgIE0tPnJlbGVhc2UoKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgYWxsVXNlc1JlcGxhY2VkV2l0aChWYWx1ZSAqbmV3X2tleSkgeworICAgIGFzc2VydChpc2E8S2V5U2Fuc1BvaW50ZXJUPihuZXdfa2V5KSAmJgorICAgICAgICAgICAiSW52YWxpZCBSQVVXIG9uIGtleSBvZiBWYWx1ZU1hcDw+Iik7CisgICAgLy8gTWFrZSBhIGNvcHkgdGhhdCB3b24ndCBnZXQgY2hhbmdlZCBldmVuIHdoZW4gKnRoaXMgaXMgZGVzdHJveWVkLgorICAgIFZhbHVlTWFwQ2FsbGJhY2tWSCBDb3B5KCp0aGlzKTsKKyAgICBzeXM6Ok11dGV4ICpNID0gQ29uZmlnOjpnZXRNdXRleChDb3B5Lk1hcC0+RGF0YSk7CisgICAgaWYgKE0pCisgICAgICBNLT5hY3F1aXJlKCk7CisKKyAgICBLZXlUIHR5cGVkX25ld19rZXkgPSBjYXN0PEtleVNhbnNQb2ludGVyVD4obmV3X2tleSk7CisgICAgLy8gQ2FuIGRlc3Ryb3kgKnRoaXM6CisgICAgQ29uZmlnOjpvblJBVVcoQ29weS5NYXAtPkRhdGEsIENvcHkuVW53cmFwKCksIHR5cGVkX25ld19rZXkpOworICAgIGlmIChDb25maWc6OkZvbGxvd1JBVVcpIHsKKyAgICAgIHR5cGVuYW1lIFZhbHVlTWFwVDo6TWFwVDo6aXRlcmF0b3IgSSA9IENvcHkuTWFwLT5NYXAuZmluZChDb3B5KTsKKyAgICAgIC8vIEkgY291bGQgPT0gQ29weS5NYXAtPk1hcC5lbmQoKSBpZiB0aGUgb25SQVVXIGNhbGxiYWNrIGFscmVhZHkKKyAgICAgIC8vIHJlbW92ZWQgdGhlIG9sZCBtYXBwaW5nLgorICAgICAgaWYgKEkgIT0gQ29weS5NYXAtPk1hcC5lbmQoKSkgeworICAgICAgICBWYWx1ZVQgVGFyZ2V0KEktPnNlY29uZCk7CisgICAgICAgIENvcHkuTWFwLT5NYXAuZXJhc2UoSSk7ICAvLyBEZWZpbml0ZWx5IGRlc3Ryb3lzICp0aGlzLgorICAgICAgICBDb3B5Lk1hcC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHR5cGVkX25ld19rZXksIFRhcmdldCkpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoTSkKKyAgICAgIE0tPnJlbGVhc2UoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBDb25maWcsIHR5cGVuYW1lIFZhbHVlSW5mb1Q+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvPFZhbHVlTWFwQ2FsbGJhY2tWSDxLZXlULCBWYWx1ZVQsIENvbmZpZywgVmFsdWVJbmZvVD4gPiB7CisgIHR5cGVkZWYgVmFsdWVNYXBDYWxsYmFja1ZIPEtleVQsIFZhbHVlVCwgQ29uZmlnLCBWYWx1ZUluZm9UPiBWSDsKKyAgdHlwZWRlZiBEZW5zZU1hcEluZm88S2V5VD4gUG9pbnRlckluZm87CisKKyAgc3RhdGljIGlubGluZSBWSCBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gVkgoUG9pbnRlckluZm86OmdldEVtcHR5S2V5KCksIE5VTEwpOworICB9CisgIHN0YXRpYyBpbmxpbmUgVkggZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBWSChQb2ludGVySW5mbzo6Z2V0VG9tYnN0b25lS2V5KCksIE5VTEwpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgVkggJlZhbCkgeworICAgIHJldHVybiBQb2ludGVySW5mbzo6Z2V0SGFzaFZhbHVlKFZhbC5VbndyYXAoKSk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBWSCAmTEhTLCBjb25zdCBWSCAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VNYXBULCB0eXBlbmFtZSBLZXlUPgorY2xhc3MgVmFsdWVNYXBJdGVyYXRvciA6CisgICAgcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8S2V5VCwgdHlwZW5hbWUgRGVuc2VNYXBUOjptYXBwZWRfdHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90PiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVuc2VNYXBUOjppdGVyYXRvciBCYXNlVDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZW5zZU1hcFQ6Om1hcHBlZF90eXBlIFZhbHVlVDsKKyAgQmFzZVQgSTsKK3B1YmxpYzoKKyAgVmFsdWVNYXBJdGVyYXRvcigpIDogSSgpIHt9CisKKyAgVmFsdWVNYXBJdGVyYXRvcihCYXNlVCBJKSA6IEkoSSkge30KKworICBCYXNlVCBiYXNlKCkgY29uc3QgeyByZXR1cm4gSTsgfQorCisgIHN0cnVjdCBWYWx1ZVR5cGVQcm94eSB7CisgICAgY29uc3QgS2V5VCBmaXJzdDsKKyAgICBWYWx1ZVQmIHNlY29uZDsKKyAgICBWYWx1ZVR5cGVQcm94eSAqb3BlcmF0b3ItPigpIHsgcmV0dXJuIHRoaXM7IH0KKyAgICBvcGVyYXRvciBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmaXJzdCwgc2Vjb25kKTsKKyAgICB9CisgIH07CisKKyAgVmFsdWVUeXBlUHJveHkgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIFZhbHVlVHlwZVByb3h5IFJlc3VsdCA9IHtJLT5maXJzdC5VbndyYXAoKSwgSS0+c2Vjb25kfTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgVmFsdWVUeXBlUHJveHkgb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICByZXR1cm4gb3BlcmF0b3IqKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVmFsdWVNYXBJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEkgPT0gUkhTLkk7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFZhbHVlTWFwSXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBJICE9IFJIUy5JOworICB9CisKKyAgaW5saW5lIFZhbHVlTWFwSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAvLyBQcmVpbmNyZW1lbnQKKyAgICArK0k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFZhbHVlTWFwSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBWYWx1ZU1hcEl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZU1hcFQsIHR5cGVuYW1lIEtleVQ+CitjbGFzcyBWYWx1ZU1hcENvbnN0SXRlcmF0b3IgOgorICAgIHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPEtleVQsIHR5cGVuYW1lIERlbnNlTWFwVDo6bWFwcGVkX3R5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdD4geworICB0eXBlZGVmIHR5cGVuYW1lIERlbnNlTWFwVDo6Y29uc3RfaXRlcmF0b3IgQmFzZVQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVuc2VNYXBUOjptYXBwZWRfdHlwZSBWYWx1ZVQ7CisgIEJhc2VUIEk7CitwdWJsaWM6CisgIFZhbHVlTWFwQ29uc3RJdGVyYXRvcigpIDogSSgpIHt9CisgIFZhbHVlTWFwQ29uc3RJdGVyYXRvcihCYXNlVCBJKSA6IEkoSSkge30KKyAgVmFsdWVNYXBDb25zdEl0ZXJhdG9yKFZhbHVlTWFwSXRlcmF0b3I8RGVuc2VNYXBULCBLZXlUPiBPdGhlcikKKyAgICA6IEkoT3RoZXIuYmFzZSgpKSB7fQorCisgIEJhc2VUIGJhc2UoKSBjb25zdCB7IHJldHVybiBJOyB9CisKKyAgc3RydWN0IFZhbHVlVHlwZVByb3h5IHsKKyAgICBjb25zdCBLZXlUIGZpcnN0OworICAgIGNvbnN0IFZhbHVlVCYgc2Vjb25kOworICAgIFZhbHVlVHlwZVByb3h5ICpvcGVyYXRvci0+KCkgeyByZXR1cm4gdGhpczsgfQorICAgIG9wZXJhdG9yIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+KCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZpcnN0LCBzZWNvbmQpOworICAgIH0KKyAgfTsKKworICBWYWx1ZVR5cGVQcm94eSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgVmFsdWVUeXBlUHJveHkgUmVzdWx0ID0ge0ktPmZpcnN0LlVud3JhcCgpLCBJLT5zZWNvbmR9OworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBWYWx1ZVR5cGVQcm94eSBvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBvcGVyYXRvciooKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWYWx1ZU1hcENvbnN0SXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBJID09IFJIUy5JOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBWYWx1ZU1hcENvbnN0SXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBJICE9IFJIUy5JOworICB9CisKKyAgaW5saW5lIFZhbHVlTWFwQ29uc3RJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgIC8vIFByZWluY3JlbWVudAorICAgICsrSTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgVmFsdWVNYXBDb25zdEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAvLyBQb3N0aW5jcmVtZW50CisgICAgVmFsdWVNYXBDb25zdEl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvVmVjdG9yRXh0cmFzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1ZlY3RvckV4dHJhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNWY1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL1ZlY3RvckV4dHJhcy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LS0gbGx2bS9BRFQvVmVjdG9yRXh0cmFzLmggLSBIZWxwZXJzIGZvciBzdGQ6OnZlY3RvciAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWZ1bCBmb3Igd29ya2luZyB3aXRoIHRoZQorLy8gc3RkOjp2ZWN0b3IgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9WRUNUT1JFWFRSQVNfSAorI2RlZmluZSBMTFZNX0FEVF9WRUNUT1JFWFRSQVNfSAorCisjaW5jbHVkZSA8Y3N0ZGFyZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIG1ha2VfdmVjdG9yIC0gSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWZ1bCBmb3IgYnVpbGRpbmcgdGVtcG9yYXJ5IHZlY3RvcnMKKy8vLyB0byBwYXNzIGludG8gdHlwZSBjb25zdHJ1Y3Rpb24gb2YgQ2FsbEluc3QgY3RvcnMuICBUaGlzIHR1cm5zIGEgbnVsbAorLy8vIHRlcm1pbmF0ZWQgbGlzdCBvZiBwb2ludGVycyAob3Igb3RoZXIgdmFsdWUgdHlwZXMpIGludG8gYSByZWFsIGxpdmUgdmVjdG9yLgorLy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIHN0ZDo6dmVjdG9yPFQ+IG1ha2VfdmVjdG9yKFQgQSwgLi4uKSB7CisgIHZhX2xpc3QgQXJnczsKKyAgdmFfc3RhcnQoQXJncywgQSk7CisgIHN0ZDo6dmVjdG9yPFQ+IFJlc3VsdDsKKyAgUmVzdWx0LnB1c2hfYmFjayhBKTsKKyAgd2hpbGUgKFQgVmFsID0gdmFfYXJnKEFyZ3MsIFQpKQorICAgIFJlc3VsdC5wdXNoX2JhY2soVmFsKTsKKyAgdmFfZW5kKEFyZ3MpOworICByZXR1cm4gUmVzdWx0OworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3QuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDc5ZDAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9pbGlzdC5oCkBAIC0wLDAgKzEsNzA4IEBACisvLz09LS0gbGx2bS9BRFQvaWxpc3QuaCAtIEludHJ1c2l2ZSBMaW5rZWQgTGlzdCBUZW1wbGF0ZSAtLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGNsYXNzZXMgdG8gaW1wbGVtZW50IGFuIGludHJ1c2l2ZSBkb3VibHkgbGlua2VkIGxpc3QgY2xhc3MKKy8vIChpLmUuIGVhY2ggbm9kZSBvZiB0aGUgbGlzdCBtdXN0IGNvbnRhaW4gYSBuZXh0IGFuZCBwcmV2aW91cyBmaWVsZCBmb3IgdGhlCisvLyBsaXN0LgorLy8KKy8vIFRoZSBpbGlzdF90cmFpdHMgdHJhaXQgY2xhc3MgaXMgdXNlZCB0byBnYWluIGFjY2VzcyB0byB0aGUgbmV4dCBhbmQgcHJldmlvdXMKKy8vIGZpZWxkcyBvZiB0aGUgbm9kZSB0eXBlIHRoYXQgdGhlIGxpc3QgaXMgaW5zdGFudGlhdGVkIHdpdGguICBJZiBpdCBpcyBub3QKKy8vIHNwZWNpYWxpemVkLCB0aGUgbGlzdCBkZWZhdWx0cyB0byB1c2luZyB0aGUgZ2V0UHJldigpLCBnZXROZXh0KCkgbWV0aG9kIGNhbGxzCisvLyB0byBnZXQgdGhlIG5leHQgYW5kIHByZXZpb3VzIHBvaW50ZXJzLgorLy8KKy8vIFRoZSBpbGlzdCBjbGFzcyBpdHNlbGYsIHNob3VsZCBiZSBhIHBsdWcgaW4gcmVwbGFjZW1lbnQgZm9yIGxpc3QsIGFzc3VtaW5nCisvLyB0aGF0IHRoZSBub2RlcyBjb250YWluIG5leHQvcHJldiBwb2ludGVycy4gIFRoaXMgbGlzdCByZXBsYWNlbWVudCBkb2VzIG5vdAorLy8gcHJvdmlkZSBhIGNvbnN0YW50IHRpbWUgc2l6ZSgpIG1ldGhvZCwgc28gYmUgY2FyZWZ1bCB0byB1c2UgZW1wdHkoKSB3aGVuIHlvdQorLy8gcmVhbGx5IHdhbnQgdG8ga25vdyBpZiBpdCdzIGVtcHR5LgorLy8KKy8vIFRoZSBpbGlzdCBjbGFzcyBpcyBpbXBsZW1lbnRlZCBieSBhbGxvY2F0aW5nIGEgJ3RhaWwnIG5vZGUgd2hlbiB0aGUgbGlzdCBpcworLy8gY3JlYXRlZCAodXNpbmcgaWxpc3RfdHJhaXRzPD46OmNyZWF0ZVNlbnRpbmVsKCkpLiAgVGhpcyB0YWlsIG5vZGUgaXMKKy8vIGFic29sdXRlbHkgcmVxdWlyZWQgYmVjYXVzZSB0aGUgdXNlciBtdXN0IGJlIGFibGUgdG8gY29tcHV0ZSBlbmQoKS0xLiBCZWNhdXNlCisvLyBvZiB0aGlzLCB1c2VycyBvZiB0aGUgZGlyZWN0IG5leHQvcHJldiBsaW5rcyB3aWxsIHNlZSBhbiBleHRyYSBsaW5rIG9uIHRoZQorLy8gZW5kIG9mIHRoZSBsaXN0LCB3aGljaCBzaG91bGQgYmUgaWdub3JlZC4KKy8vCisvLyBSZXF1aXJlbWVudHMgZm9yIGEgdXNlciBvZiB0aGlzIGxpc3Q6CisvLworLy8gICAxLiBUaGUgdXNlciBtdXN0IHByb3ZpZGUge2d8c31ldHtOZXh0fFByZXZ9IG1ldGhvZHMsIG9yIHNwZWNpYWxpemUKKy8vICAgICAgaWxpc3RfdHJhaXRzIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlIHdheSBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIG5leHQgYW5kCisvLyAgICAgIHByZXYgbGlua3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTElTVF9ICisjZGVmaW5lIExMVk1fQURUX0lMSVNUX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlVHksIHR5cGVuYW1lIFRyYWl0cz4gY2xhc3MgaXBsaXN0OwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZVR5PiBjbGFzcyBpbGlzdF9pdGVyYXRvcjsKKworLy8vIGlsaXN0X25leHRwcmV2X3RyYWl0cyAtIEEgZnJhZ21lbnQgZm9yIHRlbXBsYXRlIHRyYWl0cyBmb3IgaW50cnVzaXZlIGxpc3QKKy8vLyB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgbmV4dC9wcmV2IGltcGxlbWVudGF0aW9ucyBmb3IgY29tbW9uIG9wZXJhdGlvbnMuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVUeT4KK3N0cnVjdCBpbGlzdF9uZXh0cHJldl90cmFpdHMgeworICBzdGF0aWMgTm9kZVR5ICpnZXRQcmV2KE5vZGVUeSAqTikgeyByZXR1cm4gTi0+Z2V0UHJldigpOyB9CisgIHN0YXRpYyBOb2RlVHkgKmdldE5leHQoTm9kZVR5ICpOKSB7IHJldHVybiBOLT5nZXROZXh0KCk7IH0KKyAgc3RhdGljIGNvbnN0IE5vZGVUeSAqZ2V0UHJldihjb25zdCBOb2RlVHkgKk4pIHsgcmV0dXJuIE4tPmdldFByZXYoKTsgfQorICBzdGF0aWMgY29uc3QgTm9kZVR5ICpnZXROZXh0KGNvbnN0IE5vZGVUeSAqTikgeyByZXR1cm4gTi0+Z2V0TmV4dCgpOyB9CisKKyAgc3RhdGljIHZvaWQgc2V0UHJldihOb2RlVHkgKk4sIE5vZGVUeSAqUHJldikgeyBOLT5zZXRQcmV2KFByZXYpOyB9CisgIHN0YXRpYyB2b2lkIHNldE5leHQoTm9kZVR5ICpOLCBOb2RlVHkgKk5leHQpIHsgTi0+c2V0TmV4dChOZXh0KTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZVR5Pgorc3RydWN0IGlsaXN0X3RyYWl0czsKKworLy8vIGlsaXN0X3NlbnRpbmVsX3RyYWl0cyAtIEEgZnJhZ21lbnQgZm9yIHRlbXBsYXRlIHRyYWl0cyBmb3IgaW50cnVzaXZlIGxpc3QKKy8vLyB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgc2VudGluZWwgaW1wbGVtZW50YXRpb25zIGZvciBjb21tb24gb3BlcmF0aW9ucy4KKy8vLworLy8vIGlsaXN0X3NlbnRpbmVsX3RyYWl0cyBpbXBsZW1lbnRzIGEgbGF6eSBkeW5hbWljIHNlbnRpbmVsIGFsbG9jYXRpb24KKy8vLyBzdHJhdGVneS4gVGhlIHNlbnRpbmVsIGlzIHN0b3JlZCBpbiB0aGUgcHJldiBmaWVsZCBvZiBpbGlzdCdzIEhlYWQuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVUeT4KK3N0cnVjdCBpbGlzdF9zZW50aW5lbF90cmFpdHMgeworICAvLy8gY3JlYXRlU2VudGluZWwgLSBjcmVhdGUgdGhlIGR5bmFtaWMgc2VudGluZWwKKyAgc3RhdGljIE5vZGVUeSAqY3JlYXRlU2VudGluZWwoKSB7IHJldHVybiBuZXcgTm9kZVR5KCk7IH0KKworICAvLy8gZGVzdHJveVNlbnRpbmVsIC0gZGVhbGxvY2F0ZSB0aGUgZHluYW1pYyBzZW50aW5lbAorICBzdGF0aWMgdm9pZCBkZXN0cm95U2VudGluZWwoTm9kZVR5ICpOKSB7IGRlbGV0ZSBOOyB9CisKKyAgLy8vIHByb3ZpZGVJbml0aWFsSGVhZCAtIHdoZW4gY29uc3RydWN0aW5nIGFuIGlsaXN0LCBwcm92aWRlIGEgc3RhcnRpbmcKKyAgLy8vIHZhbHVlIGZvciBpdHMgSGVhZAorICAvLy8gQHJldHVybiBudWxsIG5vZGUgdG8gaW5kaWNhdGUgdGhhdCBpdCBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgbGF0ZXIKKyAgc3RhdGljIE5vZGVUeSAqcHJvdmlkZUluaXRpYWxIZWFkKCkgeyByZXR1cm4gMDsgfQorCisgIC8vLyBlbnN1cmVIZWFkIC0gbWFrZSBzdXJlIHRoYXQgSGVhZCBpcyBlaXRoZXIgYWxyZWFkeQorICAvLy8gaW5pdGlhbGl6ZWQgb3IgYXNzaWduZWQgYSBmcmVzaCBzZW50aW5lbAorICAvLy8gQHJldHVybiB0aGUgc2VudGluZWwKKyAgc3RhdGljIE5vZGVUeSAqZW5zdXJlSGVhZChOb2RlVHkgKiZIZWFkKSB7CisgICAgaWYgKCFIZWFkKSB7CisgICAgICBIZWFkID0gaWxpc3RfdHJhaXRzPE5vZGVUeT46OmNyZWF0ZVNlbnRpbmVsKCk7CisgICAgICBpbGlzdF90cmFpdHM8Tm9kZVR5Pjo6bm90ZUhlYWQoSGVhZCwgSGVhZCk7CisgICAgICBpbGlzdF90cmFpdHM8Tm9kZVR5Pjo6c2V0TmV4dChIZWFkLCAwKTsKKyAgICAgIHJldHVybiBIZWFkOworICAgIH0KKyAgICByZXR1cm4gaWxpc3RfdHJhaXRzPE5vZGVUeT46OmdldFByZXYoSGVhZCk7CisgIH0KKworICAvLy8gbm90ZUhlYWQgLSBzdGFzaCB0aGUgc2VudGluZWwgaW50byBpdHMgZGVmYXVsdCBsb2NhdGlvbgorICBzdGF0aWMgdm9pZCBub3RlSGVhZChOb2RlVHkgKk5ld0hlYWQsIE5vZGVUeSAqU2VudGluZWwpIHsKKyAgICBpbGlzdF90cmFpdHM8Tm9kZVR5Pjo6c2V0UHJldihOZXdIZWFkLCBTZW50aW5lbCk7CisgIH0KK307CisKKy8vLyBpbGlzdF9ub2RlX3RyYWl0cyAtIEEgZnJhZ21lbnQgZm9yIHRlbXBsYXRlIHRyYWl0cyBmb3IgaW50cnVzaXZlIGxpc3QKKy8vLyB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgbm9kZSByZWxhdGVkIG9wZXJhdGlvbnMuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVUeT4KK3N0cnVjdCBpbGlzdF9ub2RlX3RyYWl0cyB7CisgIHN0YXRpYyBOb2RlVHkgKmNyZWF0ZU5vZGUoY29uc3QgTm9kZVR5ICZWKSB7IHJldHVybiBuZXcgTm9kZVR5KFYpOyB9CisgIHN0YXRpYyB2b2lkIGRlbGV0ZU5vZGUoTm9kZVR5ICpWKSB7IGRlbGV0ZSBWOyB9CisKKyAgdm9pZCBhZGROb2RlVG9MaXN0KE5vZGVUeSAqKSB7fQorICB2b2lkIHJlbW92ZU5vZGVGcm9tTGlzdChOb2RlVHkgKikge30KKyAgdm9pZCB0cmFuc2Zlck5vZGVzRnJvbUxpc3QoaWxpc3Rfbm9kZV90cmFpdHMgJiAgICAvKlNyY1RyYWl0cyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbGlzdF9pdGVyYXRvcjxOb2RlVHk+IC8qZmlyc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWxpc3RfaXRlcmF0b3I8Tm9kZVR5PiAvKmxhc3QqLykge30KK307CisKKy8vLyBpbGlzdF9kZWZhdWx0X3RyYWl0cyAtIERlZmF1bHQgdGVtcGxhdGUgdHJhaXRzIGZvciBpbnRydXNpdmUgbGlzdC4KKy8vLyBCeSBpbmhlcml0aW5nIGZyb20gdGhpcywgeW91IGNhbiBlYXNpbHkgdXNlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCisvLy8gZm9yIGFsbCBjb21tb24gb3BlcmF0aW9ucy4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZVR5Pgorc3RydWN0IGlsaXN0X2RlZmF1bHRfdHJhaXRzIDogcHVibGljIGlsaXN0X25leHRwcmV2X3RyYWl0czxOb2RlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGlsaXN0X3NlbnRpbmVsX3RyYWl0czxOb2RlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGlsaXN0X25vZGVfdHJhaXRzPE5vZGVUeT4geworfTsKKworLy8gVGVtcGxhdGUgdHJhaXRzIGZvciBpbnRydXNpdmUgbGlzdC4gIEJ5IHNwZWNpYWxpemluZyB0aGlzIHRlbXBsYXRlIGNsYXNzLCB5b3UKKy8vIGNhbiBjaGFuZ2Ugd2hhdCBuZXh0L3ByZXYgZmllbGRzIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBsaW5rcy4uLgordGVtcGxhdGU8dHlwZW5hbWUgTm9kZVR5Pgorc3RydWN0IGlsaXN0X3RyYWl0cyA6IHB1YmxpYyBpbGlzdF9kZWZhdWx0X3RyYWl0czxOb2RlVHk+IHt9OworCisvLyBDb25zdCB0cmFpdHMgYXJlIHRoZSBzYW1lIGFzIG5vbmNvbnN0IHRyYWl0cy4uLgordGVtcGxhdGU8dHlwZW5hbWUgVHk+CitzdHJ1Y3QgaWxpc3RfdHJhaXRzPGNvbnN0IFR5PiA6IHB1YmxpYyBpbGlzdF90cmFpdHM8VHk+IHt9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gaWxpc3RfaXRlcmF0b3I8Tm9kZT4gLSBJdGVyYXRvciBmb3IgaW50cnVzaXZlIGxpc3QuCisvLwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZVR5PgorY2xhc3MgaWxpc3RfaXRlcmF0b3IKKyAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBOb2RlVHksIHB0cmRpZmZfdD4geworCitwdWJsaWM6CisgIHR5cGVkZWYgaWxpc3RfdHJhaXRzPE5vZGVUeT4gVHJhaXRzOworICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3I8c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVUeSwgcHRyZGlmZl90PiBzdXBlcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIHN1cGVyOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXI6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXI6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcjo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKK3ByaXZhdGU6CisgIHBvaW50ZXIgTm9kZVB0cjsKKworICAvLyBpbGlzdF9pdGVyYXRvciBpcyBub3QgYSByYW5kb20tYWNjZXNzIGl0ZXJhdG9yLCBidXQgaXQgaGFzIGFuCisgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gcG9pbnRlci10eXBlLCB3aGljaCBpcy4gRGVjbGFyZSAoYnV0CisgIC8vIGRvbid0IGRlZmluZSkgdGhlc2UgZnVuY3Rpb25zIGFzIHByaXZhdGUgdG8gaGVscCBjYXRjaAorICAvLyBhY2NpZGVudGFsIG1pc3VzZS4KKyAgdm9pZCBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSkgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSkgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSkgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUpIGNvbnN0OworICB2b2lkIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlKSBjb25zdDsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBvcGVyYXRvcjwoVCkgY29uc3Q7CisgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgb3BlcmF0b3I8PShUKSBjb25zdDsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBvcGVyYXRvcj4oVCkgY29uc3Q7CisgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgb3BlcmF0b3I+PShUKSBjb25zdDsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBvcGVyYXRvci0oVCkgY29uc3Q7CitwdWJsaWM6CisKKyAgaWxpc3RfaXRlcmF0b3IocG9pbnRlciBOUCkgOiBOb2RlUHRyKE5QKSB7fQorICBpbGlzdF9pdGVyYXRvcihyZWZlcmVuY2UgTlIpIDogTm9kZVB0cigmTlIpIHt9CisgIGlsaXN0X2l0ZXJhdG9yKCkgOiBOb2RlUHRyKDApIHt9CisKKyAgLy8gVGhpcyBpcyB0ZW1wbGF0ZWQgc28gdGhhdCB3ZSBjYW4gYWxsb3cgY29uc3RydWN0aW5nIGEgY29uc3QgaXRlcmF0b3IgZnJvbQorICAvLyBhIG5vbmNvbnN0IGl0ZXJhdG9yLi4uCisgIHRlbXBsYXRlPGNsYXNzIG5vZGVfdHk+CisgIGlsaXN0X2l0ZXJhdG9yKGNvbnN0IGlsaXN0X2l0ZXJhdG9yPG5vZGVfdHk+ICZSSFMpCisgICAgOiBOb2RlUHRyKFJIUy5nZXROb2RlUHRyVW5jaGVja2VkKCkpIHt9CisKKyAgLy8gVGhpcyBpcyB0ZW1wbGF0ZWQgc28gdGhhdCB3ZSBjYW4gYWxsb3cgYXNzaWduaW5nIHRvIGEgY29uc3QgaXRlcmF0b3IgZnJvbQorICAvLyBhIG5vbmNvbnN0IGl0ZXJhdG9yLi4uCisgIHRlbXBsYXRlPGNsYXNzIG5vZGVfdHk+CisgIGNvbnN0IGlsaXN0X2l0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgaWxpc3RfaXRlcmF0b3I8bm9kZV90eT4gJlJIUykgeworICAgIE5vZGVQdHIgPSBSSFMuZ2V0Tm9kZVB0clVuY2hlY2tlZCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFjY2Vzc29ycy4uLgorICBvcGVyYXRvciBwb2ludGVyKCkgY29uc3QgeworICAgIHJldHVybiBOb2RlUHRyOworICB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gKk5vZGVQdHI7CisgIH0KKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGlsaXN0X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZVB0ciA9PSBSSFMuTm9kZVB0cjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgaWxpc3RfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBOb2RlUHRyICE9IFJIUy5Ob2RlUHRyOworICB9CisKKyAgLy8gSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgb3BlcmF0b3JzLi4uCisgIGlsaXN0X2l0ZXJhdG9yICZvcGVyYXRvci0tKCkgeyAgICAgIC8vIHByZWRlY3JlbWVudCAtIEJhY2sgdXAKKyAgICBOb2RlUHRyID0gVHJhaXRzOjpnZXRQcmV2KE5vZGVQdHIpOworICAgIGFzc2VydChOb2RlUHRyICYmICItLSdkIG9mZiB0aGUgYmVnaW5uaW5nIG9mIGFuIGlsaXN0ISIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbGlzdF9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgICAgICAvLyBwcmVpbmNyZW1lbnQgLSBBZHZhbmNlCisgICAgTm9kZVB0ciA9IFRyYWl0czo6Z2V0TmV4dChOb2RlUHRyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaWxpc3RfaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpIHsgICAgLy8gcG9zdGRlY3JlbWVudCBvcGVyYXRvcnMuLi4KKyAgICBpbGlzdF9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICAtLSp0aGlzOworICAgIHJldHVybiB0bXA7CisgIH0KKyAgaWxpc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgICAgLy8gcG9zdGluY3JlbWVudCBvcGVyYXRvcnMuLi4KKyAgICBpbGlzdF9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiB0bXA7CisgIH0KKworICAvLyBJbnRlcm5hbCBpbnRlcmZhY2UsIGRvIG5vdCB1c2UuLi4KKyAgcG9pbnRlciBnZXROb2RlUHRyVW5jaGVja2VkKCkgY29uc3QgeyByZXR1cm4gTm9kZVB0cjsgfQorfTsKKworLy8gZG8gbm90IGltcGxlbWVudC4gdGhpcyBpcyB0byBjYXRjaCBlcnJvcnMgd2hlbiBwZW9wbGUgdHJ5IHRvIHVzZQorLy8gdGhlbSBhcyByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgb3BlcmF0b3ItKGludCwgaWxpc3RfaXRlcmF0b3I8VD4pOwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgb3BlcmF0b3ItKGlsaXN0X2l0ZXJhdG9yPFQ+LGludCk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIG9wZXJhdG9yKyhpbnQsIGlsaXN0X2l0ZXJhdG9yPFQ+KTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIG9wZXJhdG9yKyhpbGlzdF9pdGVyYXRvcjxUPixpbnQpOworCisvLyBvcGVyYXRvciE9L29wZXJhdG9yPT0gLSBBbGxvdyBtaXhlZCBjb21wYXJpc29ucyB3aXRob3V0IGRlcmVmZXJlbmNpbmcKKy8vIHRoZSBpdGVyYXRvciwgd2hpY2ggY291bGQgdmVyeSBsaWtlbHkgYmUgcG9pbnRpbmcgdG8gZW5kKCkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvciE9KGNvbnN0IFQqIExIUywgY29uc3QgaWxpc3RfaXRlcmF0b3I8Y29uc3QgVD4gJlJIUykgeworICByZXR1cm4gTEhTICE9IFJIUy5nZXROb2RlUHRyVW5jaGVja2VkKCk7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IFQqIExIUywgY29uc3QgaWxpc3RfaXRlcmF0b3I8Y29uc3QgVD4gJlJIUykgeworICByZXR1cm4gTEhTID09IFJIUy5nZXROb2RlUHRyVW5jaGVja2VkKCk7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvciE9KFQqIExIUywgY29uc3QgaWxpc3RfaXRlcmF0b3I8VD4gJlJIUykgeworICByZXR1cm4gTEhTICE9IFJIUy5nZXROb2RlUHRyVW5jaGVja2VkKCk7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvcj09KFQqIExIUywgY29uc3QgaWxpc3RfaXRlcmF0b3I8VD4gJlJIUykgeworICByZXR1cm4gTEhTID09IFJIUy5nZXROb2RlUHRyVW5jaGVja2VkKCk7Cit9CisKKworLy8gQWxsb3cgaWxpc3RfaXRlcmF0b3JzIHRvIGNvbnZlcnQgaW50byBwb2ludGVycyB0byBhIG5vZGUgYXV0b21hdGljYWxseSB3aGVuCisvLyB1c2VkIGJ5IHRoZSBkeW5fY2FzdCwgY2FzdCwgaXNhIG1lY2hhbmlzbXMuLi4KKwordGVtcGxhdGU8dHlwZW5hbWUgRnJvbT4gc3RydWN0IHNpbXBsaWZ5X3R5cGU7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVUeT4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8aWxpc3RfaXRlcmF0b3I8Tm9kZVR5PiA+IHsKKyAgdHlwZWRlZiBOb2RlVHkqIFNpbXBsZVR5cGU7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IGlsaXN0X2l0ZXJhdG9yPE5vZGVUeT4gJk5vZGUpIHsKKyAgICByZXR1cm4gJipOb2RlOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZVR5PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBpbGlzdF9pdGVyYXRvcjxOb2RlVHk+ID4geworICB0eXBlZGVmIE5vZGVUeSogU2ltcGxlVHlwZTsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgaWxpc3RfaXRlcmF0b3I8Tm9kZVR5PiAmTm9kZSkgeworICAgIHJldHVybiAmKk5vZGU7CisgIH0KK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gaXBsaXN0IC0gVGhlIHN1YnNldCBvZiBsaXN0IGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gc2FmZWx5IGJlIHVzZWQgb24gbm9kZXMKKy8vLyBvZiBwb2x5bW9ycGhpYyB0eXBlcywgaS5lLiBhIGhldGVyb2dlbm91cyBsaXN0IHdpdGggYSBjb21tb24gYmFzZSBjbGFzcyB0aGF0CisvLy8gaG9sZHMgdGhlIG5leHQvcHJldiBwb2ludGVycy4gIFRoZSBvbmx5IHN0YXRlIG9mIHRoZSBsaXN0IGl0c2VsZiBpcyBhIHNpbmdsZQorLy8vIHBvaW50ZXIgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisvLy8KKy8vLyBUaGlzIGxpc3QgY2FuIGJlIGluIG9uZSBvZiB0aHJlZSBpbnRlcmVzdGluZyBzdGF0ZXM6CisvLy8gMS4gVGhlIGxpc3QgbWF5IGJlIGNvbXBsZXRlbHkgdW5jb25zdHJ1Y3RlZC4gIEluIHRoaXMgY2FzZSwgdGhlIGhlYWQKKy8vLyAgICBwb2ludGVyIGlzIG51bGwuICBXaGVuIGluIHRoaXMgZm9ybSwgYW55IHF1ZXJ5IGZvciBhbiBpdGVyYXRvciAoZS5nLgorLy8vICAgIGJlZ2luKCkgb3IgZW5kKCkpIGNhdXNlcyB0aGUgbGlzdCB0byB0cmFuc3BhcmVudGx5IGNoYW5nZSB0byBzdGF0ZSAjMi4KKy8vLyAyLiBUaGUgbGlzdCBtYXkgYmUgZW1wdHksIGJ1dCBjb250YWluIGEgc2VudGluZWwgZm9yIHRoZSBlbmQgaXRlcmF0b3IuIFRoaXMKKy8vLyAgICBzZW50aW5lbCBpcyBjcmVhdGVkIGJ5IHRoZSBUcmFpdHM6OmNyZWF0ZVNlbnRpbmVsIG1ldGhvZCBhbmQgaXMgYSBsaW5rCisvLy8gICAgaW4gdGhlIGxpc3QuICBXaGVuIHRoZSBsaXN0IGlzIGVtcHR5LCB0aGUgcG9pbnRlciBpbiB0aGUgaXBsaXN0IHBvaW50cworLy8vICAgIHRvIHRoZSBzZW50aW5lbC4gIE9uY2UgdGhlIHNlbnRpbmVsIGlzIGNvbnN0cnVjdGVkLCBpdAorLy8vICAgIGlzIG5vdCBkZXN0cm95ZWQgdW50aWwgdGhlIGxpc3QgaXMuCisvLy8gMy4gVGhlIGxpc3QgbWF5IGNvbnRhaW4gYWN0dWFsIG9iamVjdHMgaW4gaXQsIHdoaWNoIGFyZSBzdG9yZWQgYXMgYSBkb3VibHkKKy8vLyAgICBsaW5rZWQgbGlzdCBvZiBub2Rlcy4gIE9uZSBpbnZhcmlhbnQgb2YgdGhlIGxpc3QgaXMgdGhhdCB0aGUgcHJlZGVjZXNzb3IKKy8vLyAgICBvZiB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgbGlzdCBhbHdheXMgcG9pbnRzIHRvIHRoZSBsYXN0IG5vZGUgaW4gdGhlIGxpc3QsCisvLy8gICAgYW5kIHRoZSBzdWNjZXNzb3IgcG9pbnRlciBmb3IgdGhlIHNlbnRpbmVsICh3aGljaCBhbHdheXMgc3RheXMgYXQgdGhlCisvLy8gICAgZW5kIG9mIHRoZSBsaXN0KSBpcyBhbHdheXMgbnVsbC4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZVR5LCB0eXBlbmFtZSBUcmFpdHM9aWxpc3RfdHJhaXRzPE5vZGVUeT4gPgorY2xhc3MgaXBsaXN0IDogcHVibGljIFRyYWl0cyB7CisgIG11dGFibGUgTm9kZVR5ICpIZWFkOworCisgIC8vIFVzZSB0aGUgcHJldiBub2RlIHBvaW50ZXIgb2YgJ2hlYWQnIGFzIHRoZSB0YWlsIHBvaW50ZXIuICBUaGlzIGlzIHJlYWxseSBhCisgIC8vIGNpcmN1bGFybHkgbGlua2VkIGxpc3Qgd2hlcmUgd2Ugc25pcCB0aGUgJ25leHQnIGxpbmsgZnJvbSB0aGUgc2VudGluZWwgbm9kZQorICAvLyBiYWNrIHRvIHRoZSBmaXJzdCBub2RlIGluIHRoZSBsaXN0ICh0byBwcmVzZXJ2ZSBhc3NlcnRpb25zIGFib3V0IGdvaW5nIG9mZgorICAvLyB0aGUgZW5kIG9mIHRoZSBsaXN0KS4KKyAgTm9kZVR5ICpnZXRUYWlsKCkgeyByZXR1cm4gdGhpcy0+ZW5zdXJlSGVhZChIZWFkKTsgfQorICBjb25zdCBOb2RlVHkgKmdldFRhaWwoKSBjb25zdCB7IHJldHVybiB0aGlzLT5lbnN1cmVIZWFkKEhlYWQpOyB9CisgIHZvaWQgc2V0VGFpbChOb2RlVHkgKk4pIGNvbnN0IHsgdGhpcy0+bm90ZUhlYWQoSGVhZCwgTik7IH0KKworICAvLy8gQ3JlYXRlTGF6eVNlbnRpbmVsIC0gVGhpcyBtZXRob2QgdmVyaWZpZXMgd2hldGhlciB0aGUgc2VudGluZWwgZm9yIHRoZQorICAvLy8gbGlzdCBoYXMgYmVlbiBjcmVhdGVkIGFuZCBsYXppbHkgbWFrZXMgaXQgaWYgbm90LgorICB2b2lkIENyZWF0ZUxhenlTZW50aW5lbCgpIGNvbnN0IHsKKyAgICB0aGlzLT5lbnN1cmVIZWFkKEhlYWQpOworICB9CisKKyAgc3RhdGljIGJvb2wgb3BfbGVzcyhOb2RlVHkgJkwsIE5vZGVUeSAmUikgeyByZXR1cm4gTCA8IFI7IH0KKyAgc3RhdGljIGJvb2wgb3BfZXF1YWwoTm9kZVR5ICZMLCBOb2RlVHkgJlIpIHsgcmV0dXJuIEwgPT0gUjsgfQorCisgIC8vIE5vIGZ1bmRhbWVudGFsIHJlYXNvbiB3aHkgaXBsaXN0IGNhbid0IGJlIGNvcHlhYmxlLCBidXQgdGhlIGRlZmF1bHQKKyAgLy8gY29weS9jb3B5LWFzc2lnbiB3b24ndCBkby4KKyAgaXBsaXN0KGNvbnN0IGlwbGlzdCAmKTsgICAgICAgICAvLyBkbyBub3QgaW1wbGVtZW50CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IGlwbGlzdCAmKTsgLy8gZG8gbm90IGltcGxlbWVudAorCitwdWJsaWM6CisgIHR5cGVkZWYgTm9kZVR5ICpwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IE5vZGVUeSAqY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiBOb2RlVHkgJnJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBOb2RlVHkgJmNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBOb2RlVHkgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBpbGlzdF9pdGVyYXRvcjxOb2RlVHk+IGl0ZXJhdG9yOworICB0eXBlZGVmIGlsaXN0X2l0ZXJhdG9yPGNvbnN0IE5vZGVUeT4gY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgcmV2ZXJzZV9pdGVyYXRvcjsKKworICBpcGxpc3QoKSA6IEhlYWQodGhpcy0+cHJvdmlkZUluaXRpYWxIZWFkKCkpIHt9CisgIH5pcGxpc3QoKSB7CisgICAgaWYgKCFIZWFkKSByZXR1cm47CisgICAgY2xlYXIoKTsKKyAgICBUcmFpdHM6OmRlc3Ryb3lTZW50aW5lbChnZXRUYWlsKCkpOworICB9CisKKyAgLy8gSXRlcmF0b3IgY3JlYXRpb24gbWV0aG9kcy4KKyAgaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgQ3JlYXRlTGF6eVNlbnRpbmVsKCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKEhlYWQpOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIENyZWF0ZUxhenlTZW50aW5lbCgpOworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihIZWFkKTsKKyAgfQorICBpdGVyYXRvciBlbmQoKSB7CisgICAgQ3JlYXRlTGF6eVNlbnRpbmVsKCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKGdldFRhaWwoKSk7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIENyZWF0ZUxhenlTZW50aW5lbCgpOworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihnZXRUYWlsKCkpOworICB9CisKKyAgLy8gcmV2ZXJzZSBpdGVyYXRvciBjcmVhdGlvbiBtZXRob2RzLgorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorCisKKyAgLy8gTWlzY2VsbGFuZW91cyBpbnNwZWN0aW9uIHJvdXRpbmVzLgorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoLTEpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBIZWFkID09IDAgfHwgSGVhZCA9PSBnZXRUYWlsKCk7IH0KKworICAvLyBGcm9udCBhbmQgYmFjayBhY2Nlc3NvciBmdW5jdGlvbnMuLi4KKyAgcmVmZXJlbmNlIGZyb250KCkgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2FsbGVkIGZyb250KCkgb24gZW1wdHkgbGlzdCEiKTsKKyAgICByZXR1cm4gKkhlYWQ7CisgIH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2FsbGVkIGZyb250KCkgb24gZW1wdHkgbGlzdCEiKTsKKyAgICByZXR1cm4gKkhlYWQ7CisgIH0KKyAgcmVmZXJlbmNlIGJhY2soKSB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJDYWxsZWQgYmFjaygpIG9uIGVtcHR5IGxpc3QhIik7CisgICAgcmV0dXJuICp0aGlzLT5nZXRQcmV2KGdldFRhaWwoKSk7CisgIH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJDYWxsZWQgYmFjaygpIG9uIGVtcHR5IGxpc3QhIik7CisgICAgcmV0dXJuICp0aGlzLT5nZXRQcmV2KGdldFRhaWwoKSk7CisgIH0KKworICB2b2lkIHN3YXAoaXBsaXN0ICZSSFMpIHsKKyAgICBhc3NlcnQoMCAmJiAiU3dhcCBkb2VzIG5vdCB1c2UgbGlzdCB0cmFpdHMgY2FsbGJhY2sgY29ycmVjdGx5IHlldCEiKTsKKyAgICBzdGQ6OnN3YXAoSGVhZCwgUkhTLkhlYWQpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIHdoZXJlLCBOb2RlVHkgKk5ldykgeworICAgIE5vZGVUeSAqQ3VyTm9kZSA9IHdoZXJlLmdldE5vZGVQdHJVbmNoZWNrZWQoKTsKKyAgICBOb2RlVHkgKlByZXZOb2RlID0gdGhpcy0+Z2V0UHJldihDdXJOb2RlKTsKKyAgICB0aGlzLT5zZXROZXh0KE5ldywgQ3VyTm9kZSk7CisgICAgdGhpcy0+c2V0UHJldihOZXcsIFByZXZOb2RlKTsKKworICAgIGlmIChDdXJOb2RlICE9IEhlYWQpICAvLyBJcyBQcmV2Tm9kZSBvZmYgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdD8KKyAgICAgIHRoaXMtPnNldE5leHQoUHJldk5vZGUsIE5ldyk7CisgICAgZWxzZQorICAgICAgSGVhZCA9IE5ldzsKKyAgICB0aGlzLT5zZXRQcmV2KEN1ck5vZGUsIE5ldyk7CisKKyAgICB0aGlzLT5hZGROb2RlVG9MaXN0KE5ldyk7ICAvLyBOb3RpZnkgdHJhaXRzIHRoYXQgd2UgYWRkZWQgYSBub2RlLi4uCisgICAgcmV0dXJuIE5ldzsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydEFmdGVyKGl0ZXJhdG9yIHdoZXJlLCBOb2RlVHkgKk5ldykgeworICAgIGlmIChlbXB0eSgpKQorICAgICAgcmV0dXJuIGluc2VydChiZWdpbigpLCBOZXcpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBpbnNlcnQoKyt3aGVyZSwgTmV3KTsKKyAgfQorCisgIE5vZGVUeSAqcmVtb3ZlKGl0ZXJhdG9yICZJVCkgeworICAgIGFzc2VydChJVCAhPSBlbmQoKSAmJiAiQ2Fubm90IHJlbW92ZSBlbmQgb2YgbGlzdCEiKTsKKyAgICBOb2RlVHkgKk5vZGUgPSAmKklUOworICAgIE5vZGVUeSAqTmV4dE5vZGUgPSB0aGlzLT5nZXROZXh0KE5vZGUpOworICAgIE5vZGVUeSAqUHJldk5vZGUgPSB0aGlzLT5nZXRQcmV2KE5vZGUpOworCisgICAgaWYgKE5vZGUgIT0gSGVhZCkgIC8vIElzIFByZXZOb2RlIG9mZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0PworICAgICAgdGhpcy0+c2V0TmV4dChQcmV2Tm9kZSwgTmV4dE5vZGUpOworICAgIGVsc2UKKyAgICAgIEhlYWQgPSBOZXh0Tm9kZTsKKyAgICB0aGlzLT5zZXRQcmV2KE5leHROb2RlLCBQcmV2Tm9kZSk7CisgICAgSVQgPSBOZXh0Tm9kZTsKKyAgICB0aGlzLT5yZW1vdmVOb2RlRnJvbUxpc3QoTm9kZSk7ICAvLyBOb3RpZnkgdHJhaXRzIHRoYXQgd2UgcmVtb3ZlZCBhIG5vZGUuLi4KKworICAgIC8vIFNldCB0aGUgbmV4dC9wcmV2IHBvaW50ZXJzIG9mIHRoZSBjdXJyZW50IG5vZGUgdG8gbnVsbC4gIFRoaXMgaXNuJ3QKKyAgICAvLyBzdHJpY3RseSByZXF1aXJlZCwgYnV0IHRoaXMgY2F0Y2hlcyBlcnJvcnMgd2hlcmUgYSBub2RlIGlzIHJlbW92ZWQgZnJvbQorICAgIC8vIGFuIGlsaXN0IChhbmQgcG90ZW50aWFsbHkgZGVsZXRlZCkgd2l0aCBpdGVyYXRvcnMgc3RpbGwgcG9pbnRpbmcgYXQgaXQuCisgICAgLy8gV2hlbiB0aG9zZSBpdGVyYXRvcnMgYXJlIGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVkLCB0aGV5IHdpbGwgYXNzZXJ0IG9uCisgICAgLy8gdGhlIG51bGwgbmV4dC9wcmV2IHBvaW50ZXIgaW5zdGVhZCBvZiAidXN1YWxseSB3b3JraW5nIi4KKyAgICB0aGlzLT5zZXROZXh0KE5vZGUsIDApOworICAgIHRoaXMtPnNldFByZXYoTm9kZSwgMCk7CisgICAgcmV0dXJuIE5vZGU7CisgIH0KKworICBOb2RlVHkgKnJlbW92ZShjb25zdCBpdGVyYXRvciAmSVQpIHsKKyAgICBpdGVyYXRvciBNdXRJdCA9IElUOworICAgIHJldHVybiByZW1vdmUoTXV0SXQpOworICB9CisKKyAgLy8gZXJhc2UgLSByZW1vdmUgYSBub2RlIGZyb20gdGhlIGNvbnRyb2xsZWQgc2VxdWVuY2UuLi4gYW5kIGRlbGV0ZSBpdC4KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3Igd2hlcmUpIHsKKyAgICB0aGlzLT5kZWxldGVOb2RlKHJlbW92ZSh3aGVyZSkpOworICAgIHJldHVybiB3aGVyZTsKKyAgfQorCisKK3ByaXZhdGU6CisgIC8vIHRyYW5zZmVyIC0gVGhlIGhlYXJ0IG9mIHRoZSBzcGxpY2UgZnVuY3Rpb24uICBNb3ZlIGxpbmtlZCBsaXN0IG5vZGVzIGZyb20KKyAgLy8gW2ZpcnN0LCBsYXN0KSBpbnRvIHBvc2l0aW9uLgorICAvLworICB2b2lkIHRyYW5zZmVyKGl0ZXJhdG9yIHBvc2l0aW9uLCBpcGxpc3QgJkwyLCBpdGVyYXRvciBmaXJzdCwgaXRlcmF0b3IgbGFzdCkgeworICAgIGFzc2VydChmaXJzdCAhPSBsYXN0ICYmICJTaG91bGQgYmUgY2hlY2tlZCBieSBjYWxsZXJzIik7CisKKyAgICBpZiAocG9zaXRpb24gIT0gbGFzdCkgeworICAgICAgLy8gTm90ZTogd2UgaGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0IHRoZSBjYXNlIHdoZW4gd2UgbW92ZSB0aGUgZmlyc3Qgbm9kZQorICAgICAgLy8gaW4gdGhlIGxpc3QuICBUaGlzIG5vZGUgaXMgdGhlIGxpc3Qgc2VudGluZWwgbm9kZSBhbmQgd2UgY2FuJ3QgbW92ZSBpdC4KKyAgICAgIE5vZGVUeSAqVGhpc1NlbnRpbmVsID0gZ2V0VGFpbCgpOworICAgICAgc2V0VGFpbCgwKTsKKyAgICAgIE5vZGVUeSAqTDJTZW50aW5lbCA9IEwyLmdldFRhaWwoKTsKKyAgICAgIEwyLnNldFRhaWwoMCk7CisKKyAgICAgIC8vIFJlbW92ZSBbZmlyc3QsIGxhc3QpIGZyb20gaXRzIG9sZCBwb3NpdGlvbi4KKyAgICAgIE5vZGVUeSAqRmlyc3QgPSAmKmZpcnN0LCAqUHJldiA9IHRoaXMtPmdldFByZXYoRmlyc3QpOworICAgICAgTm9kZVR5ICpOZXh0ID0gbGFzdC5nZXROb2RlUHRyVW5jaGVja2VkKCksICpMYXN0ID0gdGhpcy0+Z2V0UHJldihOZXh0KTsKKyAgICAgIGlmIChQcmV2KQorICAgICAgICB0aGlzLT5zZXROZXh0KFByZXYsIE5leHQpOworICAgICAgZWxzZQorICAgICAgICBMMi5IZWFkID0gTmV4dDsKKyAgICAgIHRoaXMtPnNldFByZXYoTmV4dCwgUHJldik7CisKKyAgICAgIC8vIFNwbGljZSBbZmlyc3QsIGxhc3QpIGludG8gaXRzIG5ldyBwb3NpdGlvbi4KKyAgICAgIE5vZGVUeSAqUG9zTmV4dCA9IHBvc2l0aW9uLmdldE5vZGVQdHJVbmNoZWNrZWQoKTsKKyAgICAgIE5vZGVUeSAqUG9zUHJldiA9IHRoaXMtPmdldFByZXYoUG9zTmV4dCk7CisKKyAgICAgIC8vIEZpeCBoZWFkIG9mIGxpc3QuLi4KKyAgICAgIGlmIChQb3NQcmV2KQorICAgICAgICB0aGlzLT5zZXROZXh0KFBvc1ByZXYsIEZpcnN0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgSGVhZCA9IEZpcnN0OworICAgICAgdGhpcy0+c2V0UHJldihGaXJzdCwgUG9zUHJldik7CisKKyAgICAgIC8vIEZpeCBlbmQgb2YgbGlzdC4uLgorICAgICAgdGhpcy0+c2V0TmV4dChMYXN0LCBQb3NOZXh0KTsKKyAgICAgIHRoaXMtPnNldFByZXYoUG9zTmV4dCwgTGFzdCk7CisKKyAgICAgIHRoaXMtPnRyYW5zZmVyTm9kZXNGcm9tTGlzdChMMiwgRmlyc3QsIFBvc05leHQpOworCisgICAgICAvLyBOb3cgdGhhdCBldmVyeXRoaW5nIGlzIHNldCwgcmVzdG9yZSB0aGUgcG9pbnRlcnMgdG8gdGhlIGxpc3Qgc2VudGluZWxzLgorICAgICAgTDIuc2V0VGFpbChMMlNlbnRpbmVsKTsKKyAgICAgIHNldFRhaWwoVGhpc1NlbnRpbmVsKTsKKyAgICB9CisgIH0KKworcHVibGljOgorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICAvLyBGdW5jdGlvbmFsaXR5IGRlcml2ZWQgZnJvbSBvdGhlciBmdW5jdGlvbnMgZGVmaW5lZCBhYm92ZS4uLgorICAvLworCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgIGlmIChIZWFkID09IDApIHJldHVybiAwOyAvLyBEb24ndCByZXF1aXJlIGNvbnN0cnVjdGlvbiBvZiBzZW50aW5lbCBpZiBlbXB0eS4KKyAgICByZXR1cm4gc3RkOjpkaXN0YW5jZShiZWdpbigpLCBlbmQoKSk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBmaXJzdCwgaXRlcmF0b3IgbGFzdCkgeworICAgIHdoaWxlIChmaXJzdCAhPSBsYXN0KQorICAgICAgZmlyc3QgPSBlcmFzZShmaXJzdCk7CisgICAgcmV0dXJuIGxhc3Q7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeyBpZiAoSGVhZCkgZXJhc2UoYmVnaW4oKSwgZW5kKCkpOyB9CisKKyAgLy8gRnJvbnQgYW5kIGJhY2sgaW5zZXJ0ZXJzLi4uCisgIHZvaWQgcHVzaF9mcm9udChOb2RlVHkgKnZhbCkgeyBpbnNlcnQoYmVnaW4oKSwgdmFsKTsgfQorICB2b2lkIHB1c2hfYmFjayhOb2RlVHkgKnZhbCkgeyBpbnNlcnQoZW5kKCksIHZhbCk7IH0KKyAgdm9pZCBwb3BfZnJvbnQoKSB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJwb3BfZnJvbnQoKSBvbiBlbXB0eSBsaXN0ISIpOworICAgIGVyYXNlKGJlZ2luKCkpOworICB9CisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJwb3BfYmFjaygpIG9uIGVtcHR5IGxpc3QhIik7CisgICAgaXRlcmF0b3IgdCA9IGVuZCgpOyBlcmFzZSgtLXQpOworICB9CisKKyAgLy8gU3BlY2lhbCBmb3JtcyBvZiBpbnNlcnQuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgSW5JdD4gdm9pZCBpbnNlcnQoaXRlcmF0b3Igd2hlcmUsIEluSXQgZmlyc3QsIEluSXQgbGFzdCkgeworICAgIGZvciAoOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0KSBpbnNlcnQod2hlcmUsICpmaXJzdCk7CisgIH0KKworICAvLyBTcGxpY2UgbWVtYmVycyAtIGRlZmluZWQgaW4gdGVybXMgb2YgdHJhbnNmZXIuLi4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3Igd2hlcmUsIGlwbGlzdCAmTDIpIHsKKyAgICBpZiAoIUwyLmVtcHR5KCkpCisgICAgICB0cmFuc2Zlcih3aGVyZSwgTDIsIEwyLmJlZ2luKCksIEwyLmVuZCgpKTsKKyAgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciB3aGVyZSwgaXBsaXN0ICZMMiwgaXRlcmF0b3IgZmlyc3QpIHsKKyAgICBpdGVyYXRvciBsYXN0ID0gZmlyc3Q7ICsrbGFzdDsKKyAgICBpZiAod2hlcmUgPT0gZmlyc3QgfHwgd2hlcmUgPT0gbGFzdCkgcmV0dXJuOyAvLyBObyBjaGFuZ2UKKyAgICB0cmFuc2Zlcih3aGVyZSwgTDIsIGZpcnN0LCBsYXN0KTsKKyAgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciB3aGVyZSwgaXBsaXN0ICZMMiwgaXRlcmF0b3IgZmlyc3QsIGl0ZXJhdG9yIGxhc3QpIHsKKyAgICBpZiAoZmlyc3QgIT0gbGFzdCkgdHJhbnNmZXIod2hlcmUsIEwyLCBmaXJzdCwgbGFzdCk7CisgIH0KKworCisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgIC8vIEhpZ2gtTGV2ZWwgRnVuY3Rpb25hbGl0eSB0aGF0IHNob3VsZG4ndCByZWFsbHkgYmUgaGVyZSwgYnV0IGlzIHBhcnQgb2YgbGlzdAorICAvLworCisgIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGNhbGxlZCByZW1vdmUvcmVtb3ZlX2lmIGluIGxpc3Q8PiwgYnV0CisgIC8vIHRoZXkgYWN0dWFsbHkgZG8gdGhlIGpvYiBvZiBlcmFzZSwgcmVuYW1lIHRoZW0gYWNjb3JkaW5nbHkuCisgIC8vCisgIHZvaWQgZXJhc2UoY29uc3QgTm9kZVR5ICZ2YWwpIHsKKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgICBpdGVyYXRvciBuZXh0ID0gSTsgKytuZXh0OworICAgICAgaWYgKCpJID09IHZhbCkgZXJhc2UoSSk7CisgICAgICBJID0gbmV4dDsKKyAgICB9CisgIH0KKyAgdGVtcGxhdGU8Y2xhc3MgUHIxPiB2b2lkIGVyYXNlX2lmKFByMSBwcmVkKSB7CisgICAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICkgeworICAgICAgaXRlcmF0b3IgbmV4dCA9IEk7ICsrbmV4dDsKKyAgICAgIGlmIChwcmVkKCpJKSkgZXJhc2UoSSk7CisgICAgICBJID0gbmV4dDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBQcjI+IHZvaWQgdW5pcXVlKFByMiBwcmVkKSB7CisgICAgaWYgKGVtcHR5KCkpIHJldHVybjsKKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCksIE5leHQgPSBiZWdpbigpOyArK05leHQgIT0gRTspIHsKKyAgICAgIGlmIChwcmVkKCpJKSkKKyAgICAgICAgZXJhc2UoTmV4dCk7CisgICAgICBlbHNlCisgICAgICAgIEkgPSBOZXh0OworICAgICAgTmV4dCA9IEk7CisgICAgfQorICB9CisgIHZvaWQgdW5pcXVlKCkgeyB1bmlxdWUob3BfZXF1YWwpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgUHIzPiB2b2lkIG1lcmdlKGlwbGlzdCAmcmlnaHQsIFByMyBwcmVkKSB7CisgICAgaXRlcmF0b3IgZmlyc3QxID0gYmVnaW4oKSwgbGFzdDEgPSBlbmQoKTsKKyAgICBpdGVyYXRvciBmaXJzdDIgPSByaWdodC5iZWdpbigpLCBsYXN0MiA9IHJpZ2h0LmVuZCgpOworICAgIHdoaWxlIChmaXJzdDEgIT0gbGFzdDEgJiYgZmlyc3QyICE9IGxhc3QyKQorICAgICAgaWYgKHByZWQoKmZpcnN0MiwgKmZpcnN0MSkpIHsKKyAgICAgICAgaXRlcmF0b3IgbmV4dCA9IGZpcnN0MjsKKyAgICAgICAgdHJhbnNmZXIoZmlyc3QxLCByaWdodCwgZmlyc3QyLCArK25leHQpOworICAgICAgICBmaXJzdDIgPSBuZXh0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKytmaXJzdDE7CisgICAgICB9CisgICAgaWYgKGZpcnN0MiAhPSBsYXN0MikgdHJhbnNmZXIobGFzdDEsIHJpZ2h0LCBmaXJzdDIsIGxhc3QyKTsKKyAgfQorICB2b2lkIG1lcmdlKGlwbGlzdCAmcmlnaHQpIHsgcmV0dXJuIG1lcmdlKHJpZ2h0LCBvcF9sZXNzKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIFByMz4gdm9pZCBzb3J0KFByMyBwcmVkKTsKKyAgdm9pZCBzb3J0KCkgeyBzb3J0KG9wX2xlc3MpOyB9CisgIHZvaWQgcmV2ZXJzZSgpOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlVHk+CitzdHJ1Y3QgaWxpc3QgOiBwdWJsaWMgaXBsaXN0PE5vZGVUeT4geworICB0eXBlZGVmIHR5cGVuYW1lIGlwbGlzdDxOb2RlVHk+OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGlwbGlzdDxOb2RlVHk+OjppdGVyYXRvciBpdGVyYXRvcjsKKworICBpbGlzdCgpIHt9CisgIGlsaXN0KGNvbnN0IGlsaXN0ICZyaWdodCkgeworICAgIGluc2VydCh0aGlzLT5iZWdpbigpLCByaWdodC5iZWdpbigpLCByaWdodC5lbmQoKSk7CisgIH0KKyAgZXhwbGljaXQgaWxpc3Qoc2l6ZV90eXBlIGNvdW50KSB7CisgICAgaW5zZXJ0KHRoaXMtPmJlZ2luKCksIGNvdW50LCBOb2RlVHkoKSk7CisgIH0KKyAgaWxpc3Qoc2l6ZV90eXBlIGNvdW50LCBjb25zdCBOb2RlVHkgJnZhbCkgeworICAgIGluc2VydCh0aGlzLT5iZWdpbigpLCBjb3VudCwgdmFsKTsKKyAgfQorICB0ZW1wbGF0ZTxjbGFzcyBJbkl0PiBpbGlzdChJbkl0IGZpcnN0LCBJbkl0IGxhc3QpIHsKKyAgICBpbnNlcnQodGhpcy0+YmVnaW4oKSwgZmlyc3QsIGxhc3QpOworICB9CisKKyAgLy8gYnJpbmcgaGlkZGVuIGZ1bmN0aW9ucyBpbnRvIHNjb3BlCisgIHVzaW5nIGlwbGlzdDxOb2RlVHk+OjppbnNlcnQ7CisgIHVzaW5nIGlwbGlzdDxOb2RlVHk+OjpwdXNoX2Zyb250OworICB1c2luZyBpcGxpc3Q8Tm9kZVR5Pjo6cHVzaF9iYWNrOworCisgIC8vIE1haW4gaW1wbGVtZW50YXRpb24gaGVyZSAtIEluc2VydCBmb3IgYSBub2RlIHBhc3NlZCBieSB2YWx1ZS4uLgorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3Igd2hlcmUsIGNvbnN0IE5vZGVUeSAmdmFsKSB7CisgICAgcmV0dXJuIGluc2VydCh3aGVyZSwgdGhpcy0+Y3JlYXRlTm9kZSh2YWwpKTsKKyAgfQorCisKKyAgLy8gRnJvbnQgYW5kIGJhY2sgaW5zZXJ0ZXJzLi4uCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCBOb2RlVHkgJnZhbCkgeyBpbnNlcnQodGhpcy0+YmVnaW4oKSwgdmFsKTsgfQorICB2b2lkIHB1c2hfYmFjayhjb25zdCBOb2RlVHkgJnZhbCkgeyBpbnNlcnQodGhpcy0+ZW5kKCksIHZhbCk7IH0KKworICAvLyBTcGVjaWFsIGZvcm1zIG9mIGluc2VydC4uLgorICB0ZW1wbGF0ZTxjbGFzcyBJbkl0PiB2b2lkIGluc2VydChpdGVyYXRvciB3aGVyZSwgSW5JdCBmaXJzdCwgSW5JdCBsYXN0KSB7CisgICAgZm9yICg7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QpIGluc2VydCh3aGVyZSwgKmZpcnN0KTsKKyAgfQorICB2b2lkIGluc2VydChpdGVyYXRvciB3aGVyZSwgc2l6ZV90eXBlIGNvdW50LCBjb25zdCBOb2RlVHkgJnZhbCkgeworICAgIGZvciAoOyBjb3VudCAhPSAwOyAtLWNvdW50KSBpbnNlcnQod2hlcmUsIHZhbCk7CisgIH0KKworICAvLyBBc3NpZ24gc3BlY2lhbCBmb3Jtcy4uLgorICB2b2lkIGFzc2lnbihzaXplX3R5cGUgY291bnQsIGNvbnN0IE5vZGVUeSAmdmFsKSB7CisgICAgaXRlcmF0b3IgSSA9IHRoaXMtPmJlZ2luKCk7CisgICAgZm9yICg7IEkgIT0gdGhpcy0+ZW5kKCkgJiYgY291bnQgIT0gMDsgKytJLCAtLWNvdW50KQorICAgICAgKkkgPSB2YWw7CisgICAgaWYgKGNvdW50ICE9IDApCisgICAgICBpbnNlcnQodGhpcy0+ZW5kKCksIHZhbCwgdmFsKTsKKyAgICBlbHNlCisgICAgICBlcmFzZShJLCB0aGlzLT5lbmQoKSk7CisgIH0KKyAgdGVtcGxhdGU8Y2xhc3MgSW5JdD4gdm9pZCBhc3NpZ24oSW5JdCBmaXJzdDEsIEluSXQgbGFzdDEpIHsKKyAgICBpdGVyYXRvciBmaXJzdDIgPSB0aGlzLT5iZWdpbigpLCBsYXN0MiA9IHRoaXMtPmVuZCgpOworICAgIGZvciAoIDsgZmlyc3QxICE9IGxhc3QxICYmIGZpcnN0MiAhPSBsYXN0MjsgKytmaXJzdDEsICsrZmlyc3QyKQorICAgICAgKmZpcnN0MSA9ICpmaXJzdDI7CisgICAgaWYgKGZpcnN0MiA9PSBsYXN0MikKKyAgICAgIGVyYXNlKGZpcnN0MSwgbGFzdDEpOworICAgIGVsc2UKKyAgICAgIGluc2VydChsYXN0MSwgZmlyc3QyLCBsYXN0Mik7CisgIH0KKworCisgIC8vIFJlc2l6ZSBtZW1iZXJzLi4uCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdzaXplLCBOb2RlVHkgdmFsKSB7CisgICAgaXRlcmF0b3IgaSA9IHRoaXMtPmJlZ2luKCk7CisgICAgc2l6ZV90eXBlIGxlbiA9IDA7CisgICAgZm9yICggOyBpICE9IHRoaXMtPmVuZCgpICYmIGxlbiA8IG5ld3NpemU7ICsraSwgKytsZW4pIC8qIGVtcHR5Ki8gOworCisgICAgaWYgKGxlbiA9PSBuZXdzaXplKQorICAgICAgZXJhc2UoaSwgdGhpcy0+ZW5kKCkpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpID09IGVuZCgpCisgICAgICBpbnNlcnQodGhpcy0+ZW5kKCksIG5ld3NpemUgLSBsZW4sIHZhbCk7CisgIH0KKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG5ld3NpemUpIHsgcmVzaXplKG5ld3NpemUsIE5vZGVUeSgpKTsgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCB7CisgIC8vIEVuc3VyZSB0aGF0IHN3YXAgdXNlcyB0aGUgZmFzdCBsaXN0IHN3YXAuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgVHk+CisgIHZvaWQgc3dhcChsbHZtOjppcGxpc3Q8VHk+ICZMZWZ0LCBsbHZtOjppcGxpc3Q8VHk+ICZSaWdodCkgeworICAgIExlZnQuc3dhcChSaWdodCk7CisgIH0KK30gIC8vIEVuZCAnc3RkJyBleHRlbnNpb25zLi4uCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9JTElTVF9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X25vZGUuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3Rfbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDgwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X25vZGUuaApAQCAtMCwwICsxLDEwNiBAQAorLy89PS0tIGxsdm0vQURUL2lsaXN0X25vZGUuaCAtIEludHJ1c2l2ZSBMaW5rZWQgTGlzdCBIZWxwZXIgLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaWxpc3Rfbm9kZSBjbGFzcyB0ZW1wbGF0ZSwgd2hpY2ggaXMgYSBjb252ZW5pZW50CisvLyBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBpbGlzdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTElTVF9OT0RFX0gKKyNkZWZpbmUgTExWTV9BRFRfSUxJU1RfTk9ERV9ICisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZVR5Pgorc3RydWN0IGlsaXN0X3RyYWl0czsKKworLy8vIGlsaXN0X2hhbGZfbm9kZSAtIEJhc2UgY2xhc3MgdGhhdCBwcm92aWRlcyBwcmV2IHNlcnZpY2VzIGZvciBzZW50aW5lbHMuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVUeT4KK2NsYXNzIGlsaXN0X2hhbGZfbm9kZSB7CisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3RfdHJhaXRzPE5vZGVUeT47CisgIE5vZGVUeSAqUHJldjsKK3Byb3RlY3RlZDoKKyAgTm9kZVR5ICpnZXRQcmV2KCkgeyByZXR1cm4gUHJldjsgfQorICBjb25zdCBOb2RlVHkgKmdldFByZXYoKSBjb25zdCB7IHJldHVybiBQcmV2OyB9CisgIHZvaWQgc2V0UHJldihOb2RlVHkgKlApIHsgUHJldiA9IFA7IH0KKyAgaWxpc3RfaGFsZl9ub2RlKCkgOiBQcmV2KDApIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlVHk+CitzdHJ1Y3QgaWxpc3RfbmV4dHByZXZfdHJhaXRzOworCisvLy8gaWxpc3Rfbm9kZSAtIEJhc2UgY2xhc3MgdGhhdCBwcm92aWRlcyBuZXh0L3ByZXYgc2VydmljZXMgZm9yIG5vZGVzCisvLy8gdGhhdCB1c2UgaWxpc3RfbmV4dHByZXZfdHJhaXRzIG9yIGlsaXN0X2RlZmF1bHRfdHJhaXRzLgorLy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlVHk+CitjbGFzcyBpbGlzdF9ub2RlIDogcHJpdmF0ZSBpbGlzdF9oYWxmX25vZGU8Tm9kZVR5PiB7CisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3RfbmV4dHByZXZfdHJhaXRzPE5vZGVUeT47CisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3RfdHJhaXRzPE5vZGVUeT47CisgIE5vZGVUeSAqTmV4dDsKKyAgTm9kZVR5ICpnZXROZXh0KCkgeyByZXR1cm4gTmV4dDsgfQorICBjb25zdCBOb2RlVHkgKmdldE5leHQoKSBjb25zdCB7IHJldHVybiBOZXh0OyB9CisgIHZvaWQgc2V0TmV4dChOb2RlVHkgKk4pIHsgTmV4dCA9IE47IH0KK3Byb3RlY3RlZDoKKyAgaWxpc3Rfbm9kZSgpIDogTmV4dCgwKSB7fQorCitwdWJsaWM6CisgIC8vLyBAbmFtZSBBZGphY2VudCBOb2RlIEFjY2Vzc29ycworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgcHJldmlvdXMgbm9kZSwgb3IgMCBmb3IgdGhlIGxpc3QgaGVhZC4KKyAgTm9kZVR5ICpnZXRQcmV2Tm9kZSgpIHsKKyAgICBOb2RlVHkgKlByZXYgPSB0aGlzLT5nZXRQcmV2KCk7CisKKyAgICAvLyBDaGVjayBmb3Igc2VudGluZWwuCisgICAgaWYgKCFQcmV2LT5nZXROZXh0KCkpCisgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBQcmV2OworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHByZXZpb3VzIG5vZGUsIG9yIDAgZm9yIHRoZSBsaXN0IGhlYWQuCisgIGNvbnN0IE5vZGVUeSAqZ2V0UHJldk5vZGUoKSBjb25zdCB7CisgICAgY29uc3QgTm9kZVR5ICpQcmV2ID0gdGhpcy0+Z2V0UHJldigpOworCisgICAgLy8gQ2hlY2sgZm9yIHNlbnRpbmVsLgorICAgIGlmICghUHJldi0+Z2V0TmV4dCgpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gUHJldjsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuZXh0IG5vZGUsIG9yIDAgZm9yIHRoZSBsaXN0IHRhaWwuCisgIE5vZGVUeSAqZ2V0TmV4dE5vZGUoKSB7CisgICAgTm9kZVR5ICpOZXh0ID0gZ2V0TmV4dCgpOworCisgICAgLy8gQ2hlY2sgZm9yIHNlbnRpbmVsLgorICAgIGlmICghTmV4dC0+Z2V0TmV4dCgpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gTmV4dDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuZXh0IG5vZGUsIG9yIDAgZm9yIHRoZSBsaXN0IHRhaWwuCisgIGNvbnN0IE5vZGVUeSAqZ2V0TmV4dE5vZGUoKSBjb25zdCB7CisgICAgY29uc3QgTm9kZVR5ICpOZXh0ID0gZ2V0TmV4dCgpOworCisgICAgLy8gQ2hlY2sgZm9yIHNlbnRpbmVsLgorICAgIGlmICghTmV4dC0+Z2V0TmV4dCgpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gTmV4dDsKKyAgfQorCisgIC8vLyBAfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQURUL2l0ZXJhdG9yIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9pdGVyYXRvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjJjYzFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FEVC9pdGVyYXRvcgpAQCAtMCwwICsxLDMyIEBACisvLz09PS0tIGxsdm0vQURUL2l0ZXJhdG9yIC0gUG9ydGFibGUgd3JhcHBlciBhcm91bmQgPGl0ZXJhdG9yPiAtLSotIEMrKyAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgdGhlIG15c3RlcmlvdXMgPGl0ZXJhdG9yPiBoZWFkZXIgZmlsZS4KKy8vIEluIEdDQyAyLjk1LjMsIHRoZSBmaWxlIGRlZmluZXMgYSBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yIGNsYXNzIChhbmQgb3RoZXIKKy8vIGZyaWVuZHMpLCBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBpdGVyYXRvciBjbGFzcy4gIEluIEdDQyAzLjEsIHRoZQorLy8gYmlkaXJlY3Rpb25hbF9pdGVyYXRvciBjbGFzcyBnb3QgbW92ZWQgb3V0IGFuZCB0aGUgbmV3LCBzdGFuZGFyZHMgY29tcGxpYW50LAorLy8gaXRlcmF0b3I8PiBjbGFzcyB3YXMgYWRkZWQuICBCZWNhdXNlIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCB3ZSBjYW4gZG8gdG8gZ2V0CisvLyBjb3JyZWN0IGJlaGF2aW9yIG9uIGJvdGggY29tcGlsZXJzLCB3ZSBoYXZlIHRoaXMgaGVhZGVyIHdpdGggI2lmZGVmJ3MuICBHcm9zcworLy8gaHVoPworLy8KKy8vIEJ5ICNpbmNsdWQnaW5nIHRoaXMgZmlsZSwgeW91IGdldCB0aGUgY29udGVudHMgb2YgPGl0ZXJhdG9yPiBwbHVzIHRoZQorLy8gZm9sbG93aW5nIGNsYXNzZXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2U6CisvLworLy8gICAxLiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yCisvLyAgIDIuIGZvcndhcmRfaXRlcmF0b3IKKy8vCisvLyBUaGUgI2lmIGRpcmVjdGl2ZXMnIGV4cHJlc3Npb25zIGFyZSBmaWxsZWQgaW4gYnkgQXV0b2NvbmYuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI3dhcm5pbmcgVGhpcyBmaWxlcyBpbmNsdWRlcyBvbGQgJ2xsdm0vQURUL2l0ZXJhdG9yJyBmaWxlLCB3aGljaCB3YXMgcmVwbGFjZWQgIFwKK2J5ICdsbHZtL0FEVC9pdGVyYXRvci5oJy4gUGxlYXNlIGNvbnNpZGVyIHVwZ3JhZGluZyB0aGUgc291cmNlLgorCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0Fic3RyYWN0VHlwZVVzZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BYnN0cmFjdFR5cGVVc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmNWM1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BYnN0cmFjdFR5cGVVc2VyLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8vPT09LS0gbGx2bS9BYnN0cmFjdFR5cGVVc2VyLmggLSBBYnN0cmFjdFR5cGVVc2VyIEludGVyZmFjZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBBYnN0cmFjdFR5cGVVc2VyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BQlNUUkFDVF9UWVBFX1VTRVJfSAorI2RlZmluZSBMTFZNX0FCU1RSQUNUX1RZUEVfVVNFUl9ICisKKyNpZiAhZGVmaW5lZChMTFZNX1RZUEVfSCkgJiYgIWRlZmluZWQoTExWTV9WQUxVRV9IKQorI2Vycm9yIERvIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gIEluY2x1ZGUgVHlwZS5oIGluc3RlYWQuCisjZXJyb3IgU29tZSB2ZXJzaW9ucyBvZiBHQ0MgKGUuZy4gMy40IGFuZCA0LjEpIGNhbiBub3QgaGFuZGxlIHRoZSBpbmxpbmVkIG1ldGhvZAorI2Vycm9yIFBBVHlwZUhvbGRlcjo6ZHJvcFJlZigpIGNvcnJlY3RseSBvdGhlcndpc2UuCisjZW5kaWYKKworLy8gVGhpcyBpcyB0aGUgIm1hc3RlciIgaW5jbHVkZSBmb3IgPGNhc3NlcnQ+IFdoZXRoZXIgdGhpcyBmaWxlIG5lZWRzIGl0IG9yIG5vdCwKKy8vIGl0IG11c3QgYWx3YXlzIGluY2x1ZGUgPGNhc3NlcnQ+IGZvciB0aGUgZmlsZXMgd2hpY2ggaW5jbHVkZQorLy8gbGx2bS9BYnN0cmFjdFR5cGVVc2VyLmgKKy8vCisvLyBJbiB0aGlzIHdheSwgbW9zdCBldmVyeSBMTFZNIHNvdXJjZSBmaWxlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlIGFzc2VydCgpCisvLyBtYWNybyB3aXRob3V0IGhhdmluZyB0byAjaW5jbHVkZSA8Y2Fzc2VydD4gZGlyZWN0bHkuCisvLworI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVmFsdWU7CitjbGFzcyBUeXBlOworY2xhc3MgRGVyaXZlZFR5cGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTsKKworLy8vIFRoZSBBYnN0cmFjdFR5cGVVc2VyIGNsYXNzIGlzIGFuIGludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHdobworLy8vIGNvdWxkIHBvc3NpYmx5IHVzZSBhbiBhYnN0cmFjdCB0eXBlLiAgQWJzdHJhY3QgdHlwZXMgYXJlIGRlbm90ZWQgYnkgdGhlCisvLy8gaXNBYnN0cmFjdCBmbGFnIHNldCB0byB0cnVlIGluIHRoZSBUeXBlIGNsYXNzLiAgVGhlc2UgYXJlIGNsYXNzZXMgdGhhdAorLy8vIGNvbnRhaW4gYW4gT3BhcXVlIHR5cGUgaW4gdGhlaXIgc3RydWN0dXJlIHNvbWV3aGVyZS4KKy8vLworLy8vIENsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2Ugc28gdGhhdCB0aGV5IG1heSBiZSBub3RpZmllZCB3aGVuIGFuCisvLy8gYWJzdHJhY3QgdHlwZSBpcyByZXNvbHZlZC4gIEFic3RyYWN0IHR5cGVzIG1heSBiZSByZXNvbHZlZCBpbnRvIG1vcmUgCisvLy8gY29uY3JldGUgdHlwZXMgdGhyb3VnaDogbGlua2luZywgcGFyc2luZywgYW5kIGJpdGNvZGUgcmVhZGluZy4gIFdoZW4gdGhpcyAKKy8vLyBoYXBwZW5zLCBhbGwgb2YgdGhlIHVzZXJzIG9mIHRoZSB0eXBlIG11c3QgYmUgdXBkYXRlZCB0byByZWZlcmVuY2UgdGhlIG5ldywKKy8vLyBtb3JlIGNvbmNyZXRlIHR5cGUuICBUaGV5IGFyZSBub3RpZmllZCB0aHJvdWdoIHRoZSBBYnN0cmFjdFR5cGVVc2VyIAorLy8vIGludGVyZmFjZS4KKy8vLworLy8vIEluIGFkZGl0aW9uIHRvIHRoaXMsIEFic3RyYWN0VHlwZVVzZXJzIG11c3Qga2VlcCB0aGUgdXNlIGxpc3Qgb2YgdGhlCisvLy8gcG90ZW50aWFsbHkgYWJzdHJhY3QgdHlwZSB0aGF0IHRoZXkgcmVmZXJlbmNlIHVwLXRvLWRhdGUuICBUbyBkbyB0aGlzIGluIGEKKy8vLyBuaWNlLCB0cmFuc3BhcmVudCB3YXksIHRoZSBQQVR5cGVIYW5kbGUgY2xhc3MgaXMgdXNlZCB0byBob2xkICJQb3RlbnRpYWxseQorLy8vIEFic3RyYWN0IFR5cGVzIiwgYW5kIGtlZXAgdGhlIHVzZSBsaXN0IG9mIHRoZSBhYnN0cmFjdCB0eXBlcyB1cC10by1kYXRlLgorLy8vIEBicmllZiBMTFZNIEFic3RyYWN0IFR5cGUgVXNlciBSZXByZXNlbnRhdGlvbgorY2xhc3MgQWJzdHJhY3RUeXBlVXNlciB7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfkFic3RyYWN0VHlwZVVzZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXJpdmUgZnJvbSBtZQorCisgIC8vLyBzZXRUeXBlIC0gSXQncyBub3JtYWxseSBub3QgcG9zc2libGUgdG8gY2hhbmdlIGEgVmFsdWUncyB0eXBlIGluIHBsYWNlLAorICAvLy8gYnV0IGFuIEFic3RyYWN0VHlwZVVzZXIgc3ViY2xhc3MgdGhhdCBrbm93cyB3aGF0IGl0cyBkb2luZyBjYW4gYmUKKyAgLy8vIHBlcm1pdHRlZCB0byBkbyBzbyB3aXRoIGNhcmUuCisgIHZvaWQgc2V0VHlwZShWYWx1ZSAqViwgY29uc3QgVHlwZSAqTmV3VHkpOworCitwdWJsaWM6CisKKyAgLy8vIHJlZmluZUFic3RyYWN0VHlwZSAtIFRoZSBjYWxsYmFjayBtZXRob2QgaW52b2tlZCB3aGVuIGFuIGFic3RyYWN0IHR5cGUgaXMKKyAgLy8vIHJlc29sdmVkIHRvIGFub3RoZXIgdHlwZS4gIEFuIG9iamVjdCBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHVwZGF0ZQorICAvLy8gaXRzIGludGVybmFsIHN0YXRlIHRvIHJlZmVyZW5jZSBOZXdUeXBlIGluc3RlYWQgb2YgT2xkVHlwZS4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCByZWZpbmVBYnN0cmFjdFR5cGUoY29uc3QgRGVyaXZlZFR5cGUgKk9sZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKk5ld1R5KSA9IDA7CisKKyAgLy8vIFRoZSBvdGhlciBjYXNlIHdoaWNoIEFic3RyYWN0VHlwZVVzZXJzIG11c3QgYmUgYXdhcmUgb2YgaXMgd2hlbiBhIHR5cGUKKyAgLy8vIG1ha2VzIHRoZSB0cmFuc2l0aW9uIGZyb20gYmVpbmcgYWJzdHJhY3QgKHdoZXJlIGl0IGhhcyBjbGllbnRzIG9uIGl0cworICAvLy8gQWJzdHJhY3RUeXBlVXNlcnMgbGlzdCkgdG8gY29uY3JldGUgKHdoZXJlIGl0IGRvZXMgbm90KS4gIFRoaXMgbWV0aG9kCisgIC8vLyBub3RpZmllcyBBVFUncyB3aGVuIHRoaXMgb2NjdXJzIGZvciBhIHR5cGUuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgdHlwZUJlY2FtZUNvbmNyZXRlKGNvbnN0IERlcml2ZWRUeXBlICpBYnNUeSkgPSAwOworCisgIC8vIGZvciBkZWJ1Z2dpbmcuLi4KKyAgdmlydHVhbCB2b2lkIGR1bXAoKSBjb25zdCA9IDA7Cit9OworCisKKy8vLyBQQVR5cGVIYW5kbGUgLSBIYW5kbGUgdG8gYSBUeXBlIHN1YmNsYXNzLiAgVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGtlZXAgdGhlCisvLy8gdXNlIGxpc3Qgb2YgYWJzdHJhY3QgdHlwZXMgdXAtdG8tZGF0ZS4KKy8vLworY2xhc3MgUEFUeXBlSGFuZGxlIHsKKyAgY29uc3QgVHlwZSAqVHk7CisgIEFic3RyYWN0VHlwZVVzZXIgKiBjb25zdCBVc2VyOworCisgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBhdCB0aGUgYm90dG9tIG9mIFR5cGUuaC4gIFNlZSB0aGUgY29tbWVudCB0aGVyZQorICAvLyBmb3IganVzdGlmaWNhdGlvbi4KKyAgdm9pZCBhZGRVc2VyKCk7CisgIHZvaWQgcmVtb3ZlVXNlcigpOworcHVibGljOgorICAvLyBjdG9yIC0gQWRkIHVzZSB0byB0eXBlIGlmIGFic3RyYWN0LiAgTm90ZSB0aGF0IFR5IG11c3Qgbm90IGJlIG51bGwKKyAgaW5saW5lIFBBVHlwZUhhbmRsZShjb25zdCBUeXBlICp0eSwgQWJzdHJhY3RUeXBlVXNlciAqdXNlcikKKyAgICA6IFR5KHR5KSwgVXNlcih1c2VyKSB7CisgICAgYWRkVXNlcigpOworICB9CisKKyAgLy8gY3RvciAtIEFkZCB1c2UgdG8gdHlwZSBpZiBhYnN0cmFjdC4KKyAgaW5saW5lIFBBVHlwZUhhbmRsZShjb25zdCBQQVR5cGVIYW5kbGUgJlQpIDogVHkoVC5UeSksIFVzZXIoVC5Vc2VyKSB7CisgICAgYWRkVXNlcigpOworICB9CisKKyAgLy8gZHRvciAtIFJlbW92ZSByZWZlcmVuY2UgdG8gdHlwZS4uLgorICBpbmxpbmUgflBBVHlwZUhhbmRsZSgpIHsgcmVtb3ZlVXNlcigpOyB9CisKKyAgLy8gQXV0b21hdGljIGNhc3Rpbmcgb3BlcmF0b3Igc28gdGhhdCB0aGUgaGFuZGxlIG1heSBiZSB1c2VkIG5hdHVyYWxseQorICBpbmxpbmUgb3BlcmF0b3IgVHlwZSAqKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxUeXBlKj4oVHkpOyB9CisgIGlubGluZSBUeXBlICpnZXQoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFR5cGUqPihUeSk7IH0KKworICAvLyBvcGVyYXRvcj0gLSBBbGxvdyBhc3NpZ25tZW50IHRvIGhhbmRsZQorICBpbmxpbmUgVHlwZSAqb3BlcmF0b3I9KGNvbnN0IFR5cGUgKnR5KSB7CisgICAgaWYgKFR5ICE9IHR5KSB7ICAgLy8gRW5zdXJlIHdlIGRvbid0IGFjY2lkZW50YWxseSBkcm9wIGxhc3QgcmVmIHRvIFR5CisgICAgICByZW1vdmVVc2VyKCk7CisgICAgICBUeSA9IHR5OworICAgICAgYWRkVXNlcigpOworICAgIH0KKyAgICByZXR1cm4gZ2V0KCk7CisgIH0KKworICAvLyBvcGVyYXRvcj0gLSBBbGxvdyBhc3NpZ25tZW50IHRvIGhhbmRsZQorICBpbmxpbmUgY29uc3QgVHlwZSAqb3BlcmF0b3I9KGNvbnN0IFBBVHlwZUhhbmRsZSAmVCkgeworICAgIHJldHVybiBvcGVyYXRvcj0oVC5UeSk7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGUgKnR5KSB7CisgICAgcmV0dXJuIFR5ID09IHR5OworICB9CisKKyAgLy8gb3BlcmF0b3ItPiAtIEFsbG93IHVzZXIgdG8gZGVyZWZlcmVuY2UgaGFuZGxlIG5hdHVyYWxseS4uLgorICBpbmxpbmUgY29uc3QgVHlwZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIFR5OyB9Cit9OworCisKKy8vLyBQQVR5cGVIb2xkZXIgLSBIb2xkZXIgY2xhc3MgZm9yIGEgcG90ZW50aWFsbHkgYWJzdHJhY3QgdHlwZS4gIFRoaXMgdXNlcworLy8vIGVmZmljaWVudCB1bmlvbi1maW5kIHRlY2huaXF1ZXMgdG8gaGFuZGxlIGR5bmFtaWMgdHlwZSByZXNvbHV0aW9uLiAgVW5sZXNzCisvLy8geW91IG5lZWQgdG8gZG8gY3VzdG9tIHByb2Nlc3Npbmcgd2hlbiB0eXBlcyBhcmUgcmVzb2x2ZWQsIHlvdSBzaG91bGQgYWx3YXlzCisvLy8gdXNlIFBBVHlwZUhvbGRlcnMgaW4gcHJlZmVyZW5jZSB0byBQQVR5cGVIYW5kbGVzLgorLy8vCitjbGFzcyBQQVR5cGVIb2xkZXIgeworICBtdXRhYmxlIGNvbnN0IFR5cGUgKlR5OworICB2b2lkIGRlc3Ryb3koKTsKK3B1YmxpYzoKKyAgUEFUeXBlSG9sZGVyKCkgOiBUeSgwKSB7fQorICBQQVR5cGVIb2xkZXIoY29uc3QgVHlwZSAqdHkpIDogVHkodHkpIHsKKyAgICBhZGRSZWYoKTsKKyAgfQorICBQQVR5cGVIb2xkZXIoY29uc3QgUEFUeXBlSG9sZGVyICZUKSA6IFR5KFQuVHkpIHsKKyAgICBhZGRSZWYoKTsKKyAgfQorCisgIH5QQVR5cGVIb2xkZXIoKSB7IGRyb3BSZWYoKTsgfQorCisgIG9wZXJhdG9yIFR5cGUgKigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIFR5cGUgKmdldCgpIGNvbnN0OworCisgIC8vIG9wZXJhdG9yLT4gLSBBbGxvdyB1c2VyIHRvIGRlcmVmZXJlbmNlIGhhbmRsZSBuYXR1cmFsbHkuLi4KKyAgVHlwZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisKKyAgLy8gb3BlcmF0b3I9IC0gQWxsb3cgYXNzaWdubWVudCB0byBoYW5kbGUKKyAgVHlwZSAqb3BlcmF0b3I9KGNvbnN0IFR5cGUgKnR5KSB7CisgICAgaWYgKFR5ICE9IHR5KSB7ICAgLy8gRG9uJ3QgYWNjaWRlbnRhbGx5IGRyb3AgbGFzdCByZWYgdG8gVHkuCisgICAgICBkcm9wUmVmKCk7CisgICAgICBUeSA9IHR5OworICAgICAgYWRkUmVmKCk7CisgICAgfQorICAgIHJldHVybiBnZXQoKTsKKyAgfQorICBUeXBlICpvcGVyYXRvcj0oY29uc3QgUEFUeXBlSG9sZGVyICZIKSB7CisgICAgcmV0dXJuIG9wZXJhdG9yPShILlR5KTsKKyAgfQorCisgIC8vLyBnZXRSYXdUeXBlIC0gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgdm1jb3JlIGxpYnJhcnkuCisgIC8vLworICBjb25zdCBUeXBlICpnZXRSYXdUeXBlKCkgY29uc3QgeyByZXR1cm4gVHk7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBhZGRSZWYoKTsKKyAgdm9pZCBkcm9wUmVmKCk7CisgIGZyaWVuZCBjbGFzcyBUeXBlTWFwQmFzZTsKK307CisKKy8vIHNpbXBsaWZ5X3R5cGUgLSBBbGxvdyBjbGllbnRzIHRvIHRyZWF0IHVzZXMganVzdCBsaWtlIHZhbHVlcyB3aGVuIHVzaW5nCisvLyBjYXN0aW5nIG9wZXJhdG9ycy4KK3RlbXBsYXRlPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8UEFUeXBlSG9sZGVyPiB7CisgIHR5cGVkZWYgY29uc3QgVHlwZSogU2ltcGxlVHlwZTsKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IFBBVHlwZUhvbGRlciAmVmFsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNpbXBsZVR5cGU+KFZhbC5nZXQoKSk7CisgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFBBVHlwZUhvbGRlcj4geworICB0eXBlZGVmIGNvbnN0IFR5cGUqIFNpbXBsZVR5cGU7CisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBQQVR5cGVIb2xkZXIgJlZhbCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTaW1wbGVUeXBlPihWYWwuZ2V0KCkpOworICB9Cit9OworICAKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxY2NlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgKQEAgLTAsMCArMSwzMjggQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCAtIEFsaWFzIEFuYWx5c2lzIEludGVyZmFjZSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGdlbmVyaWMgQWxpYXNBbmFseXNpcyBpbnRlcmZhY2UsIHdoaWNoIGlzIHVzZWQgYXMgdGhlCisvLyBjb21tb24gaW50ZXJmYWNlIHVzZWQgYnkgYWxsIGNsaWVudHMgb2YgYWxpYXMgYW5hbHlzaXMgaW5mb3JtYXRpb24sIGFuZAorLy8gaW1wbGVtZW50ZWQgYnkgYWxsIGFsaWFzIGFuYWx5c2lzIGltcGxlbWVudGF0aW9ucy4gIE1vZC9SZWYgaW5mb3JtYXRpb24gaXMKKy8vIGFsc28gY2FwdHVyZWQgYnkgdGhpcyBpbnRlcmZhY2UuCisvLworLy8gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIG11c3QgaW1wbGVtZW50IHRoZSB2YXJpb3VzIHZpcnR1YWwgbWV0aG9kcywKKy8vIHdoaWNoIGF1dG9tYXRpY2FsbHkgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIGVudGlyZSBzdWl0ZSBvZiBjbGllbnQKKy8vIEFQSXMuCisvLworLy8gVGhpcyBBUEkgcmVwcmVzZW50cyBtZW1vcnkgYXMgYSAoUG9pbnRlciwgU2l6ZSkgcGFpci4gIFRoZSBQb2ludGVyIGNvbXBvbmVudAorLy8gc3BlY2lmaWVzIHRoZSBiYXNlIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSByZWdpb24sIHRoZSBTaXplIHNwZWNpZmllcyBob3cgbGFyZ2UKKy8vIG9mIGFuIGFyZWEgaXMgYmVpbmcgcXVlcmllZCwgb3IgVW5rbm93blNpemUgaWYgdGhlIHNpemUgaXMgbm90IGtub3duLgorLy8gUG9pbnRlcnMgdGhhdCBwb2ludCB0byB0d28gY29tcGxldGVseSBkaWZmZXJlbnQgb2JqZWN0cyBpbiBtZW1vcnkgbmV2ZXIKKy8vIGFsaWFzLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgU2l6ZSBjb21wb25lbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0FMSUFTX0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19BTElBU19BTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9JbmNsdWRlRmlsZS5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb2FkSW5zdDsKK2NsYXNzIFN0b3JlSW5zdDsKK2NsYXNzIFZBQXJnSW5zdDsKK2NsYXNzIFRhcmdldERhdGE7CitjbGFzcyBQYXNzOworY2xhc3MgQW5hbHlzaXNVc2FnZTsKKworY2xhc3MgQWxpYXNBbmFseXNpcyB7Citwcm90ZWN0ZWQ6CisgIGNvbnN0IFRhcmdldERhdGEgKlREOworCitwcml2YXRlOgorICBBbGlhc0FuYWx5c2lzICpBQTsgICAgICAgLy8gUHJldmlvdXMgQWxpYXMgQW5hbHlzaXMgdG8gY2hhaW4gdG8uCisKK3Byb3RlY3RlZDoKKyAgLy8vIEluaXRpYWxpemVBbGlhc0FuYWx5c2lzIC0gU3ViY2xhc3NlcyBtdXN0IGNhbGwgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZQorICAvLy8gdGhlIEFsaWFzQW5hbHlzaXMgaW50ZXJmYWNlIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBhcmUgY2FsbGVkLiAgVGhpcyBpcworICAvLy8gdHlwaWNhbGx5IGNhbGxlZCBieSB0aGUgcnVuKiBtZXRob2RzIG9mIHRoZXNlIHN1YmNsYXNzZXMuICBUaGlzIG1heSBiZQorICAvLy8gY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorICAvLy8KKyAgdm9pZCBJbml0aWFsaXplQWxpYXNBbmFseXNpcyhQYXNzICpQKTsKKworICAvLy8gZ2V0QW5hbHlzaXNVc2FnZSAtIEFsbCBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGludm9rZSB0aGlzCisgIC8vLyBkaXJlY3RseSAodXNpbmcgQWxpYXNBbmFseXNpczo6Z2V0QW5hbHlzaXNVc2FnZShBVSkpLgorICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIENsYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWluZm8KKyAgQWxpYXNBbmFseXNpcygpIDogVEQoMCksIEFBKDApIHt9CisgIHZpcnR1YWwgfkFsaWFzQW5hbHlzaXMoKTsgIC8vIFdlIHdhbnQgdG8gYmUgc3ViY2xhc3NlZAorCisgIC8vLyBVbmtub3duU2l6ZSAtIFRoaXMgaXMgYSBzcGVjaWFsIHZhbHVlIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGhlCisgIC8vLyBzaXplIGFyZ3VtZW50cyBpbiBhbGlhcyBxdWVyaWVzIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAvLy8ga25vdyB0aGUgc2l6ZXMgb2YgdGhlIHBvdGVudGlhbCBtZW1vcnkgcmVmZXJlbmNlcy4KKyAgc3RhdGljIHVuc2lnbmVkIGNvbnN0IFVua25vd25TaXplID0gfjB1OworCisgIC8vLyBnZXRUYXJnZXREYXRhIC0gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBUYXJnZXREYXRhIG9iamVjdCwgb3IKKyAgLy8vIG51bGwgaWYgbm8gVGFyZ2V0RGF0YSBvYmplY3QgaXMgYXZhaWxhYmxlLgorICAvLy8KKyAgY29uc3QgVGFyZ2V0RGF0YSAqZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIFREOyB9CisKKyAgLy8vIGdldFR5cGVTdG9yZVNpemUgLSBSZXR1cm4gdGhlIFRhcmdldERhdGEgc3RvcmUgc2l6ZSBmb3IgdGhlIGdpdmVuIHR5cGUsCisgIC8vLyBpZiBrbm93biwgb3IgYSBjb25zZXJ2YXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0VHlwZVN0b3JlU2l6ZShjb25zdCBUeXBlICpUeSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBBbGlhcyBRdWVyaWVzLi4uCisgIC8vLworCisgIC8vLyBBbGlhcyBhbmFseXNpcyByZXN1bHQgLSBFaXRoZXIgd2Uga25vdyBmb3Igc3VyZSB0aGF0IGl0IGRvZXMgbm90IGFsaWFzLCB3ZQorICAvLy8ga25vdyBmb3Igc3VyZSBpdCBtdXN0IGFsaWFzLCBvciB3ZSBkb24ndCBrbm93IGFueXRoaW5nOiBUaGUgdHdvIHBvaW50ZXJzCisgIC8vLyBfbWlnaHRfIGFsaWFzLiAgVGhpcyBlbnVtIGlzIGRlc2lnbmVkIHNvIHlvdSBjYW4gZG8gdGhpbmdzIGxpa2U6CisgIC8vLyAgICAgaWYgKEFBLmFsaWFzKFAxLCBQMikpIHsgLi4uIH0KKyAgLy8vIHRvIGNoZWNrIHRvIHNlZSBpZiB0d28gcG9pbnRlcnMgbWlnaHQgYWxpYXMuCisgIC8vLworICAvLy8gU2VlIGRvY3MvQWxpYXNBbmFseXNpcy5odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBzcGVjaWZpYyBtZWFuaW5ncworICAvLy8gb2YgdGhlc2UgdmFsdWVzLgorICAvLy8KKyAgZW51bSBBbGlhc1Jlc3VsdCB7IE5vQWxpYXMgPSAwLCBNYXlBbGlhcyA9IDEsIE11c3RBbGlhcyA9IDIgfTsKKworICAvLy8gYWxpYXMgLSBUaGUgbWFpbiBsb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vIFJldHVybnMgYSBSZXN1bHQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0d28gcG9pbnRlcnMgYXJlIGFsaWFzZWQgdG8gZWFjaAorICAvLy8gb3RoZXIuICBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHNwZWNpZmljIGFsaWFzCisgIC8vLyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbnMuCisgIC8vLworICB2aXJ0dWFsIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IFZhbHVlICpWMSwgdW5zaWduZWQgVjFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpWMiwgdW5zaWduZWQgVjJTaXplKTsKKworICAvLy8gYWxpYXMgLSBBIGNvbnZlbmllbmNlIHdyYXBwZXIgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBzaXplcyBhcmUgdW5rbm93bi4KKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgVmFsdWUgKlYxLCBjb25zdCBWYWx1ZSAqVjIpIHsKKyAgICByZXR1cm4gYWxpYXMoVjEsIFVua25vd25TaXplLCBWMiwgVW5rbm93blNpemUpOworICB9CisKKyAgLy8vIGlzTm9BbGlhcyAtIEEgdHJpdmlhbCBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHBvaW50ZXJzIGFyZSBuby1hbGlhcy4KKyAgYm9vbCBpc05vQWxpYXMoY29uc3QgVmFsdWUgKlYxLCB1bnNpZ25lZCBWMVNpemUsCisgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpWMiwgdW5zaWduZWQgVjJTaXplKSB7CisgICAgcmV0dXJuIGFsaWFzKFYxLCBWMVNpemUsIFYyLCBWMlNpemUpID09IE5vQWxpYXM7CisgIH0KKworICAvLy8gcG9pbnRzVG9Db25zdGFudE1lbW9yeSAtIElmIHRoZSBzcGVjaWZpZWQgcG9pbnRlciBpcyBrbm93biB0byBwb2ludCBpbnRvCisgIC8vLyBjb25zdGFudCBnbG9iYWwgbWVtb3J5LCByZXR1cm4gdHJ1ZS4gIFRoaXMgYWxsb3dzIGRpc2FtYmlndWF0aW9uIG9mIHN0b3JlCisgIC8vLyBpbnN0cnVjdGlvbnMgZnJvbSBjb25zdGFudCBwb2ludGVycy4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IFZhbHVlICpQKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNpbXBsZSBtb2QvcmVmIGluZm9ybWF0aW9uLi4uCisgIC8vLworCisgIC8vLyBNb2RSZWZSZXN1bHQgLSBSZXByZXNlbnQgdGhlIHJlc3VsdCBvZiBhIG1vZC9yZWYgcXVlcnkuICBNb2QgYW5kIFJlZiBhcmUKKyAgLy8vIGJpdHMgd2hpY2ggbWF5IGJlIG9yJ2QgdG9nZXRoZXIuCisgIC8vLworICBlbnVtIE1vZFJlZlJlc3VsdCB7IE5vTW9kUmVmID0gMCwgUmVmID0gMSwgTW9kID0gMiwgTW9kUmVmID0gMyB9OworCisKKyAgLy8vIE1vZFJlZkJlaGF2aW9yIC0gU3VtbWFyeSBvZiBob3cgYSBmdW5jdGlvbiBhZmZlY3RzIG1lbW9yeSBpbiB0aGUgcHJvZ3JhbS4KKyAgLy8vIExvYWRzIGZyb20gY29uc3RhbnQgZ2xvYmFscyBhcmUgbm90IGNvbnNpZGVyZWQgbWVtb3J5IGFjY2Vzc2VzIGZvciB0aGlzCisgIC8vLyBpbnRlcmZhY2UuICBBbHNvLCBmdW5jdGlvbnMgbWF5IGZyZWVseSBtb2RpZnkgc3RhY2sgc3BhY2UgbG9jYWwgdG8gdGhlaXIKKyAgLy8vIGludm9jYXRpb24gd2l0aG91dCBoYXZpbmcgdG8gcmVwb3J0IGl0IHRocm91Z2ggdGhlc2UgaW50ZXJmYWNlcy4KKyAgZW51bSBNb2RSZWZCZWhhdmlvciB7CisgICAgLy8gRG9lc05vdEFjY2Vzc01lbW9yeSAtIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgbm9uLWxvY2FsIGxvYWRzCisgICAgLy8gb3Igc3RvcmVzIHRvIG1lbW9yeS4KKyAgICAvLworICAgIC8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIEdDQyAnY29uc3QnIGF0dHJpYnV0ZS4KKyAgICBEb2VzTm90QWNjZXNzTWVtb3J5LAorCisgICAgLy8gQWNjZXNzZXNBcmd1bWVudHMgLSBUaGlzIGZ1bmN0aW9uIGFjY2Vzc2VzIGZ1bmN0aW9uIGFyZ3VtZW50cyBpbiB3ZWxsCisgICAgLy8ga25vd24gKHBvc3NpYmx5IHZvbGF0aWxlKSB3YXlzLCBidXQgZG9lcyBub3QgYWNjZXNzIGFueSBvdGhlciBtZW1vcnkuCisgICAgQWNjZXNzZXNBcmd1bWVudHMsCisKKyAgICAvLyBBY2Nlc3Nlc0FyZ3VtZW50c0FuZEdsb2JhbHMgLSBUaGlzIGZ1bmN0aW9uIGhhcyBhY2Nlc3NlcyBmdW5jdGlvbgorICAgIC8vIGFyZ3VtZW50cyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyB3ZWxsIGtub3duIChwb3NzaWJseSB2b2xhdGlsZSkgd2F5cywgYnV0CisgICAgLy8gZG9lcyBub3QgYWNjZXNzIGFueSBvdGhlciBtZW1vcnkuCisgICAgQWNjZXNzZXNBcmd1bWVudHNBbmRHbG9iYWxzLAorCisgICAgLy8gT25seVJlYWRzTWVtb3J5IC0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGFueSBub24tbG9jYWwgc3RvcmVzIG9yCisgICAgLy8gdm9sYXRpbGUgbG9hZHMsIGJ1dCBtYXkgcmVhZCBmcm9tIGFueSBtZW1vcnkgbG9jYXRpb24uCisgICAgLy8KKyAgICAvLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBHQ0MgJ3B1cmUnIGF0dHJpYnV0ZS4KKyAgICBPbmx5UmVhZHNNZW1vcnksCisKKyAgICAvLyBVbmtub3duTW9kUmVmQmVoYXZpb3IgLSBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBmdW5jdGlvbiBjb3VsZCBub3QgYmUKKyAgICAvLyBjbGFzc2lmaWVkIGludG8gb25lIG9mIHRoZSBiZWhhdmlvcnMgYWJvdmUuCisgICAgVW5rbm93bk1vZFJlZkJlaGF2aW9yCisgIH07CisKKyAgLy8vIGdldE1vZFJlZkJlaGF2aW9yIC0gUmV0dXJuIHRoZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgdGhlIGdpdmVuIGNhbGwgc2l0ZS4KKyAgdmlydHVhbCBNb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUyk7CisKKyAgLy8vIGdldE1vZFJlZkJlaGF2aW9yIC0gUmV0dXJuIHRoZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uLgorICAvLy8gRm9yIHVzZSB3aGVuIHRoZSBjYWxsIHNpdGUgaXMgbm90IGtub3duLgorICB2aXJ0dWFsIE1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKGNvbnN0IEZ1bmN0aW9uICpGKTsKKworICAvLy8gZ2V0SW50cmluc2ljTW9kUmVmQmVoYXZpb3IgLSBSZXR1cm4gdGhlIG1vZHJlZiBiZWhhdmlvciBvZiB0aGUgaW50cmluc2ljCisgIC8vLyB3aXRoIHRoZSBnaXZlbiBpZC4gIE1vc3QgY2xpZW50cyB3b24ndCBuZWVkIHRoaXMsIGJlY2F1c2UgdGhlIHJlZ3VsYXIKKyAgLy8vIGdldE1vZFJlZkJlaGF2aW9yIGluY29ycG9yYXRlcyB0aGlzIGluZm9ybWF0aW9uLgorICBzdGF0aWMgTW9kUmVmQmVoYXZpb3IgZ2V0SW50cmluc2ljTW9kUmVmQmVoYXZpb3IodW5zaWduZWQgaWlkKTsKKworICAvLy8gZG9lc05vdEFjY2Vzc01lbW9yeSAtIElmIHRoZSBzcGVjaWZpZWQgY2FsbCBpcyBrbm93biB0byBuZXZlciByZWFkIG9yCisgIC8vLyB3cml0ZSBtZW1vcnksIHJldHVybiB0cnVlLiAgSWYgdGhlIGNhbGwgb25seSByZWFkcyBmcm9tIGtub3duLWNvbnN0YW50CisgIC8vLyBtZW1vcnksIGl0IGlzIGFsc28gbGVnYWwgdG8gcmV0dXJuIHRydWUuICBDYWxscyB0aGF0IHVud2luZCB0aGUgc3RhY2sKKyAgLy8vIGFyZSBsZWdhbCBmb3IgdGhpcyBwcmVkaWNhdGUuCisgIC8vLworICAvLy8gTWFueSBvcHRpbWl6YXRpb25zIChzdWNoIGFzIENTRSBhbmQgTElDTSkgY2FuIGJlIHBlcmZvcm1lZCBvbiBzdWNoIGNhbGxzCisgIC8vLyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGFsaWFzaW5nIHByb3BlcnRpZXMsIGFuZCBtYW55IGNhbGxzIGhhdmUgdGhpcworICAvLy8gcHJvcGVydHkgKGUuZy4gY2FsbHMgdG8gJ3NpbicgYW5kICdjb3MnKS4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBHQ0MgJ2NvbnN0JyBhdHRyaWJ1dGUuCisgIC8vLworICBib29sIGRvZXNOb3RBY2Nlc3NNZW1vcnkoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmQmVoYXZpb3IoQ1MpID09IERvZXNOb3RBY2Nlc3NNZW1vcnk7CisgIH0KKworICAvLy8gZG9lc05vdEFjY2Vzc01lbW9yeSAtIElmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaXMga25vd24gdG8gbmV2ZXIgcmVhZCBvcgorICAvLy8gd3JpdGUgbWVtb3J5LCByZXR1cm4gdHJ1ZS4gIEZvciB1c2Ugd2hlbiB0aGUgY2FsbCBzaXRlIGlzIG5vdCBrbm93bi4KKyAgLy8vCisgIGJvb2wgZG9lc05vdEFjY2Vzc01lbW9yeShjb25zdCBGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBnZXRNb2RSZWZCZWhhdmlvcihGKSA9PSBEb2VzTm90QWNjZXNzTWVtb3J5OworICB9CisKKyAgLy8vIG9ubHlSZWFkc01lbW9yeSAtIElmIHRoZSBzcGVjaWZpZWQgY2FsbCBpcyBrbm93biB0byBvbmx5IHJlYWQgZnJvbQorICAvLy8gbm9uLXZvbGF0aWxlIG1lbW9yeSAob3Igbm90IGFjY2VzcyBtZW1vcnkgYXQgYWxsKSwgcmV0dXJuIHRydWUuICBDYWxscworICAvLy8gdGhhdCB1bndpbmQgdGhlIHN0YWNrIGFyZSBsZWdhbCBmb3IgdGhpcyBwcmVkaWNhdGUuCisgIC8vLworICAvLy8gVGhpcyBwcm9wZXJ0eSBhbGxvd3MgbWFueSBjb21tb24gb3B0aW1pemF0aW9ucyB0byBiZSBwZXJmb3JtZWQgaW4gdGhlCisgIC8vLyBhYnNlbmNlIG9mIGludGVyZmVyaW5nIHN0b3JlIGluc3RydWN0aW9ucywgc3VjaCBhcyBDU0Ugb2Ygc3RybGVuIGNhbGxzLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIEdDQyAncHVyZScgYXR0cmlidXRlLgorICAvLy8KKyAgYm9vbCBvbmx5UmVhZHNNZW1vcnkoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpIHsKKyAgICBNb2RSZWZCZWhhdmlvciBNUkIgPSBnZXRNb2RSZWZCZWhhdmlvcihDUyk7CisgICAgcmV0dXJuIE1SQiA9PSBEb2VzTm90QWNjZXNzTWVtb3J5IHx8IE1SQiA9PSBPbmx5UmVhZHNNZW1vcnk7CisgIH0KKworICAvLy8gb25seVJlYWRzTWVtb3J5IC0gSWYgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpcyBrbm93biB0byBvbmx5IHJlYWQgZnJvbQorICAvLy8gbm9uLXZvbGF0aWxlIG1lbW9yeSAob3Igbm90IGFjY2VzcyBtZW1vcnkgYXQgYWxsKSwgcmV0dXJuIHRydWUuICBGb3IgdXNlCisgIC8vLyB3aGVuIHRoZSBjYWxsIHNpdGUgaXMgbm90IGtub3duLgorICAvLy8KKyAgYm9vbCBvbmx5UmVhZHNNZW1vcnkoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICBNb2RSZWZCZWhhdmlvciBNUkIgPSBnZXRNb2RSZWZCZWhhdmlvcihGKTsKKyAgICByZXR1cm4gTVJCID09IERvZXNOb3RBY2Nlc3NNZW1vcnkgfHwgTVJCID09IE9ubHlSZWFkc01lbW9yeTsKKyAgfQorCisKKyAgLy8vIGdldE1vZFJlZkluZm8gLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBvciBub3QgYW4gaW5zdHJ1Y3Rpb24gbWF5CisgIC8vLyByZWFkIG9yIHdyaXRlIG1lbW9yeSBzcGVjaWZpZWQgYnkgdGhlIHBvaW50ZXIgb3BlcmFuZC4gIEFuIGluc3RydWN0aW9uCisgIC8vLyB0aGF0IGRvZXNuJ3QgcmVhZCBvciB3cml0ZSBtZW1vcnkgbWF5IGJlIHRyaXZpYWxseSBMSUNNJ2QgZm9yIGV4YW1wbGUuCisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBjYWxsIHNpdGVzKSAtIFJldHVybiB3aGV0aGVyIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIKKyAgLy8vIGEgcGFydGljdWxhciBjYWxsIHNpdGUgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIG1lbW9yeSBzcGVjaWZpZWQgYnkgdGhlCisgIC8vLyBwb2ludGVyLgorICAvLy8KKyAgdmlydHVhbCBNb2RSZWZSZXN1bHQgZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqUCwgdW5zaWduZWQgU2l6ZSk7CisKKyAgLy8vIGdldE1vZFJlZkluZm8gLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciB0d28gY2FsbCBzaXRlcyBtYXkgcmVmZXIKKyAgLy8vIHRvIHRoZSBzYW1lIHNldCBvZiBtZW1vcnkgbG9jYXRpb25zLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIE5vTW9kUmVmIGlmCisgIC8vLyB0aGUgdHdvIGNhbGxzIHJlZmVyIHRvIGRpc2pvaW50IG1lbW9yeSBsb2NhdGlvbnMsIFJlZiBpZiBDUzEgcmVhZHMgbWVtb3J5CisgIC8vLyB3cml0dGVuIGJ5IENTMiwgTW9kIGlmIENTMSB3cml0ZXMgdG8gbWVtb3J5IHJlYWQgb3Igd3JpdHRlbiBieSBDUzIsIG9yCisgIC8vLyBNb2RSZWYgaWYgQ1MxIG1pZ2h0IHJlYWQgb3Igd3JpdGUgbWVtb3J5IGFjY2Vzc2VkIGJ5IENTMi4KKyAgLy8vCisgIHZpcnR1YWwgTW9kUmVmUmVzdWx0IGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUNhbGxTaXRlIENTMik7CisKK3B1YmxpYzoKKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9ucy4uLgorICBNb2RSZWZSZXN1bHQgZ2V0TW9kUmVmSW5mbyhjb25zdCBMb2FkSW5zdCAqTCwgY29uc3QgVmFsdWUgKlAsIHVuc2lnbmVkIFNpemUpOworICBNb2RSZWZSZXN1bHQgZ2V0TW9kUmVmSW5mbyhjb25zdCBTdG9yZUluc3QgKlMsIGNvbnN0IFZhbHVlICpQLCB1bnNpZ25lZCBTaXplKTsKKyAgTW9kUmVmUmVzdWx0IGdldE1vZFJlZkluZm8oY29uc3QgQ2FsbEluc3QgKkMsIGNvbnN0IFZhbHVlICpQLCB1bnNpZ25lZCBTaXplKSB7CisgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUoQyksIFAsIFNpemUpOworICB9CisgIE1vZFJlZlJlc3VsdCBnZXRNb2RSZWZJbmZvKGNvbnN0IEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqUCwgdW5zaWduZWQgU2l6ZSkgeworICAgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpMb2FkOiAgIHJldHVybiBnZXRNb2RSZWZJbmZvKChjb25zdCBMb2FkSW5zdCopSSwgUCwgU2l6ZSk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U3RvcmU6ICByZXR1cm4gZ2V0TW9kUmVmSW5mbygoY29uc3QgU3RvcmVJbnN0KilJLCBQLFNpemUpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhbGw6ICAgcmV0dXJuIGdldE1vZFJlZkluZm8oKGNvbnN0IENhbGxJbnN0KilJLCBQLCBTaXplKTsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiBOb01vZFJlZjsKKyAgICB9CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIEhpZ2hlciBsZXZlbCBtZXRob2RzIGZvciBxdWVyeWluZyBtb2QvcmVmIGluZm9ybWF0aW9uLgorICAvLy8KKworICAvLy8gY2FuQmFzaWNCbG9ja01vZGlmeSAtIFJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIGZvciBleGVjdXRpb24gb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgYmFzaWMgYmxvY2sgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IFB0ci4KKyAgLy8vCisgIGJvb2wgY2FuQmFzaWNCbG9ja01vZGlmeShjb25zdCBCYXNpY0Jsb2NrICZCQiwgY29uc3QgVmFsdWUgKlAsIHVuc2lnbmVkIFNpemUpOworCisgIC8vLyBjYW5JbnN0cnVjdGlvblJhbmdlTW9kaWZ5IC0gUmV0dXJuIHRydWUgaWYgaXQgaXMgcG9zc2libGUgZm9yIHRoZQorICAvLy8gZXhlY3V0aW9uIG9mIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb25zIHRvIG1vZGlmeSB0aGUgdmFsdWUgcG9pbnRlZCB0byBieQorICAvLy8gUHRyLiAgVGhlIGluc3RydWN0aW9ucyB0byBjb25zaWRlciBhcmUgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlCisgIC8vLyByYW5nZSBvZiBbSTEsSTJdIElOQ0xVU0lWRS4gIEkxIGFuZCBJMiBtdXN0IGJlIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrLgorICAvLy8KKyAgYm9vbCBjYW5JbnN0cnVjdGlvblJhbmdlTW9kaWZ5KGNvbnN0IEluc3RydWN0aW9uICZJMSwgY29uc3QgSW5zdHJ1Y3Rpb24gJkkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlB0ciwgdW5zaWduZWQgU2l6ZSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBNZXRob2RzIHRoYXQgY2xpZW50cyBzaG91bGQgY2FsbCB3aGVuIHRoZXkgdHJhbnNmb3JtIHRoZSBwcm9ncmFtIHRvIGFsbG93CisgIC8vLyBhbGlhcyBhbmFseXNlcyB0byB1cGRhdGUgdGhlaXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLiAgTm90ZSB0aGF0IHRoZXNlCisgIC8vLyBtZXRob2RzIG1heSBiZSBjYWxsZWQgb24gYW55IGluc3RydWN0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90CisgIC8vLyB0aGV5IGhhdmUgcG9pbnRlci1hbmFseXNpcyBpbXBsaWNhdGlvbnMuCisgIC8vLworCisgIC8vLyBkZWxldGVWYWx1ZSAtIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgYW4gTExWTSBWYWx1ZSBpcworICAvLy8gZGVsZXRlZCBmcm9tIHRoZSBwcm9ncmFtLCBmb3IgZXhhbXBsZSB3aGVuIGFuIGluc3RydWN0aW9uIGlzIGZvdW5kIHRvIGJlCisgIC8vLyByZWR1bmRhbnQgYW5kIGlzIGVsaW1pbmF0ZWQuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgZGVsZXRlVmFsdWUoVmFsdWUgKlYpOworCisgIC8vLyBjb3B5VmFsdWUgLSBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciBhIHByZWV4aXN0aW5nIHZhbHVlIGluIHRoZQorICAvLy8gcHJvZ3JhbSBpcyBjb3BpZWQgb3IgY2xvbmVkLCBpbnRyb2R1Y2luZyBhIG5ldyB2YWx1ZS4gIE5vdGUgdGhhdCBhbmFseXNpcworICAvLy8gaW1wbGVtZW50YXRpb25zIHNob3VsZCB0b2xlcmF0ZSBjbGllbnRzIHRoYXQgdXNlIHRoaXMgbWV0aG9kIHRvIGludHJvZHVjZQorICAvLy8gdGhlIHNhbWUgdmFsdWUgbXVsdGlwbGUgdGltZXM6IGlmIHRoZSBhbmFseXNpcyBhbHJlYWR5IGtub3dzIGFib3V0IGEKKyAgLy8vIHZhbHVlLCBpdCBzaG91bGQgaWdub3JlIHRoZSByZXF1ZXN0LgorICAvLy8KKyAgdmlydHVhbCB2b2lkIGNvcHlWYWx1ZShWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvKTsKKworICAvLy8gcmVwbGFjZVdpdGhOZXdWYWx1ZSAtIFRoaXMgbWV0aG9kIGlzIHRoZSBvYnZpb3VzIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28KKyAgLy8vIGFib3ZlLCBhbmQgaXQgcHJvdmlkZWQgYXMgYSBoZWxwZXIgdG8gc2ltcGxpZnkgY2xpZW50IGNvZGUuCisgIC8vLworICB2b2lkIHJlcGxhY2VXaXRoTmV3VmFsdWUoVmFsdWUgKk9sZCwgVmFsdWUgKk5ldykgeworICAgIGNvcHlWYWx1ZShPbGQsIE5ldyk7CisgICAgZGVsZXRlVmFsdWUoT2xkKTsKKyAgfQorfTsKKworLy8vIGlzTm9BbGlhc0NhbGwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBvaW50ZXIgaXMgcmV0dXJuZWQgYnkgYSBub2FsaWFzCisvLy8gZnVuY3Rpb24uCitib29sIGlzTm9BbGlhc0NhbGwoY29uc3QgVmFsdWUgKlYpOworCisvLy8gaXNJZGVudGlmaWVkT2JqZWN0IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBwb2ludGVyIHJlZmVycyB0byBhIGRpc3RpbmN0IGFuZAorLy8vIGlkZW50aWZpYWJsZSBvYmplY3QuICBUaGlzIHJldHVybnMgdHJ1ZSBmb3I6CisvLy8gICAgR2xvYmFsIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zIChidXQgbm90IEdsb2JhbCBBbGlhc2VzKQorLy8vICAgIEFsbG9jYXMgYW5kIE1hbGxvY3MKKy8vLyAgICBCeVZhbCBhbmQgTm9BbGlhcyBBcmd1bWVudHMKKy8vLyAgICBOb0FsaWFzIHJldHVybnMKKy8vLworYm9vbCBpc0lkZW50aWZpZWRPYmplY3QoY29uc3QgVmFsdWUgKlYpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisvLyBCZWNhdXNlIG9mIHRoZSB3YXkgLmEgZmlsZXMgd29yaywgd2UgbXVzdCBmb3JjZSB0aGUgQmFzaWNBQSBpbXBsZW1lbnRhdGlvbiB0bworLy8gYmUgcHVsbGVkIGluIGlmIHRoZSBBbGlhc0FuYWx5c2lzIGhlYWRlciBpcyBpbmNsdWRlZC4gIE90aGVyd2lzZSB3ZSBydW4KKy8vIHRoZSByaXNrIG9mIEFsaWFzQW5hbHlzaXMgYmVpbmcgdXNlZCwgYnV0IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG5vdAorLy8gYmVpbmcgbGlua2VkIGludG8gdGhlIHRvb2wgdGhhdCB1c2VzIGl0LgorRk9SQ0VfREVGSU5JTkdfRklMRV9UT19CRV9MSU5LRUQoQWxpYXNBbmFseXNpcykKK0ZPUkNFX0RFRklOSU5HX0ZJTEVfVE9fQkVfTElOS0VEKEJhc2ljQWxpYXNBbmFseXNpcykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNjQyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc1NldFRyYWNrZXIuaApAQCAtMCwwICsxLDQwMSBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmggLSBCdWlsZCBBbGlhcyBTZXRzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0d28gY2xhc3NlczogQWxpYXNTZXRUcmFja2VyIGFuZCBBbGlhc1NldC4gIFRoZXNlIGludGVyZmFjZQorLy8gYXJlIHVzZWQgdG8gY2xhc3NpZnkgYSBjb2xsZWN0aW9uIG9mIHBvaW50ZXIgcmVmZXJlbmNlcyBpbnRvIGEgbWF4aW1hbCBudW1iZXIKKy8vIG9mIGRpc2pvaW50IHNldHMuICBFYWNoIEFsaWFzU2V0IG9iamVjdCBjb25zdHJ1Y3RlZCBieSB0aGUgQWxpYXNTZXRUcmFja2VyCisvLyBvYmplY3QgcmVmZXJzIHRvIG1lbW9yeSBkaXNqb2ludCBmcm9tIHRoZSBvdGhlciBzZXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19BTElBU1NFVFRSQUNLRVJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0FMSUFTU0VUVFJBQ0tFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGlhc0FuYWx5c2lzOworY2xhc3MgTG9hZEluc3Q7CitjbGFzcyBTdG9yZUluc3Q7CitjbGFzcyBBbGlhc1NldFRyYWNrZXI7CitjbGFzcyBBbGlhc1NldDsKKworY2xhc3MgQWxpYXNTZXQgOiBwdWJsaWMgaWxpc3Rfbm9kZTxBbGlhc1NldD4geworICBmcmllbmQgY2xhc3MgQWxpYXNTZXRUcmFja2VyOworCisgIGNsYXNzIFBvaW50ZXJSZWMgeworICAgIFZhbHVlICpWYWw7ICAvLyBUaGUgcG9pbnRlciB0aGlzIHJlY29yZCBjb3JyZXNwb25kcyB0by4KKyAgICBQb2ludGVyUmVjICoqUHJldkluTGlzdCwgKk5leHRJbkxpc3Q7CisgICAgQWxpYXNTZXQgKkFTOworICAgIHVuc2lnbmVkIFNpemU7CisgIHB1YmxpYzoKKyAgICBQb2ludGVyUmVjKFZhbHVlICpWKQorICAgICAgOiBWYWwoViksIFByZXZJbkxpc3QoMCksIE5leHRJbkxpc3QoMCksIEFTKDApLCBTaXplKDApIHt9CisKKyAgICBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKyAgICAKKyAgICBQb2ludGVyUmVjICpnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gTmV4dEluTGlzdDsgfQorICAgIGJvb2wgaGFzQWxpYXNTZXQoKSBjb25zdCB7IHJldHVybiBBUyAhPSAwOyB9CisKKyAgICBQb2ludGVyUmVjKiogc2V0UHJldkluTGlzdChQb2ludGVyUmVjICoqUElMKSB7CisgICAgICBQcmV2SW5MaXN0ID0gUElMOworICAgICAgcmV0dXJuICZOZXh0SW5MaXN0OworICAgIH0KKworICAgIHZvaWQgdXBkYXRlU2l6ZSh1bnNpZ25lZCBOZXdTaXplKSB7CisgICAgICBpZiAoTmV3U2l6ZSA+IFNpemUpIFNpemUgPSBOZXdTaXplOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKKyAgICBBbGlhc1NldCAqZ2V0QWxpYXNTZXQoQWxpYXNTZXRUcmFja2VyICZBU1QpIHsKKyAgICAgIGFzc2VydChBUyAmJiAiTm8gQWxpYXNTZXQgeWV0ISIpOworICAgICAgaWYgKEFTLT5Gb3J3YXJkKSB7CisgICAgICAgIEFsaWFzU2V0ICpPbGRBUyA9IEFTOworICAgICAgICBBUyA9IE9sZEFTLT5nZXRGb3J3YXJkZWRUYXJnZXQoQVNUKTsKKyAgICAgICAgQVMtPmFkZFJlZigpOworICAgICAgICBPbGRBUy0+ZHJvcFJlZihBU1QpOworICAgICAgfQorICAgICAgcmV0dXJuIEFTOworICAgIH0KKworICAgIHZvaWQgc2V0QWxpYXNTZXQoQWxpYXNTZXQgKmFzKSB7CisgICAgICBhc3NlcnQoQVMgPT0gMCAmJiAiQWxyZWFkeSBoYXZlIGFuIGFsaWFzIHNldCEiKTsKKyAgICAgIEFTID0gYXM7CisgICAgfQorCisgICAgdm9pZCBlcmFzZUZyb21MaXN0KCkgeworICAgICAgaWYgKE5leHRJbkxpc3QpIE5leHRJbkxpc3QtPlByZXZJbkxpc3QgPSBQcmV2SW5MaXN0OworICAgICAgKlByZXZJbkxpc3QgPSBOZXh0SW5MaXN0OworICAgICAgaWYgKEFTLT5QdHJMaXN0RW5kID09ICZOZXh0SW5MaXN0KSB7CisgICAgICAgIEFTLT5QdHJMaXN0RW5kID0gUHJldkluTGlzdDsKKyAgICAgICAgYXNzZXJ0KCpBUy0+UHRyTGlzdEVuZCA9PSAwICYmICJMaXN0IG5vdCB0ZXJtaW5hdGVkIHJpZ2h0ISIpOworICAgICAgfQorICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorICB9OworCisgIFBvaW50ZXJSZWMgKlB0ckxpc3QsICoqUHRyTGlzdEVuZDsgIC8vIERvdWJseSBsaW5rZWQgbGlzdCBvZiBub2Rlcy4KKyAgQWxpYXNTZXQgKkZvcndhcmQ7ICAgICAgICAgICAgIC8vIEZvcndhcmRpbmcgcG9pbnRlci4KKyAgQWxpYXNTZXQgKk5leHQsICpQcmV2OyAgICAgICAgIC8vIERvdWJseSBsaW5rZWQgbGlzdCBvZiBBbGlhc1NldHMuCisKKyAgc3RkOjp2ZWN0b3I8Q2FsbFNpdGU+IENhbGxTaXRlczsgLy8gQWxsIGNhbGxzICYgaW52b2tlcyBpbiB0aGlzIGFsaWFzIHNldC4KKworICAvLyBSZWZDb3VudCAtIE51bWJlciBvZiBub2RlcyBwb2ludGluZyB0byB0aGlzIEFsaWFzU2V0IHBsdXMgdGhlIG51bWJlciBvZgorICAvLyBBbGlhc1NldHMgZm9yd2FyZGluZyB0byBpdC4KKyAgdW5zaWduZWQgUmVmQ291bnQgOiAyODsKKworICAvLy8gQWNjZXNzVHlwZSAtIEtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGlzIGFsaWFzIHNldCBtZXJlbHkgcmVmZXJzIHRvIHRoZQorICAvLy8gbG9jYXRpb25zIG9mIG1lbW9yeSwgd2hldGhlciBpdCBtb2RpZmllcyB0aGUgbWVtb3J5LCBvciB3aGV0aGVyIGl0IGRvZXMKKyAgLy8vIGJvdGguICBUaGUgbGF0dGljZSBnb2VzIGZyb20gIk5vTW9kUmVmIiB0byBlaXRoZXIgUmVmcyBvciBNb2RzLCB0aGVuIHRvCisgIC8vLyBNb2RSZWYgYXMgbmVjZXNzYXJ5LgorICAvLy8KKyAgZW51bSBBY2Nlc3NUeXBlIHsKKyAgICBOb01vZFJlZiA9IDAsIFJlZnMgPSAxLCAgICAgICAgIC8vIFJlZiA9IGJpdCAxCisgICAgTW9kcyAgICAgPSAyLCBNb2RSZWYgPSAzICAgICAgICAvLyBNb2QgPSBiaXQgMgorICB9OworICB1bnNpZ25lZCBBY2Nlc3NUeSA6IDI7CisKKyAgLy8vIEFsaWFzVHlwZSAtIEtlZXAgdHJhY2sgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgcG9pbnRlcnMgaW4gdGhlIHNldC4KKyAgLy8vIExhdHRpY2UgZ29lcyBmcm9tIE11c3RBbGlhcyB0byBNYXlBbGlhcy4KKyAgLy8vCisgIGVudW0gQWxpYXNUeXBlIHsKKyAgICBNdXN0QWxpYXMgPSAwLCBNYXlBbGlhcyA9IDEKKyAgfTsKKyAgdW5zaWduZWQgQWxpYXNUeSA6IDE7CisKKyAgLy8gVm9sYXRpbGUgLSBUcnVlIGlmIHRoaXMgYWxpYXMgc2V0IGNvbnRhaW5zIHZvbGF0aWxlIGxvYWRzIG9yIHN0b3Jlcy4KKyAgYm9vbCBWb2xhdGlsZSA6IDE7CisKKyAgdm9pZCBhZGRSZWYoKSB7ICsrUmVmQ291bnQ7IH0KKyAgdm9pZCBkcm9wUmVmKEFsaWFzU2V0VHJhY2tlciAmQVNUKSB7CisgICAgYXNzZXJ0KFJlZkNvdW50ID49IDEgJiYgIkludmFsaWQgcmVmZXJlbmNlIGNvdW50IGRldGVjdGVkISIpOworICAgIGlmICgtLVJlZkNvdW50ID09IDApCisgICAgICByZW1vdmVGcm9tVHJhY2tlcihBU1QpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIEFjY2Vzc29ycy4uLgorICBib29sIGlzUmVmKCkgY29uc3QgeyByZXR1cm4gQWNjZXNzVHkgJiBSZWZzOyB9CisgIGJvb2wgaXNNb2QoKSBjb25zdCB7IHJldHVybiBBY2Nlc3NUeSAmIE1vZHM7IH0KKyAgYm9vbCBpc011c3RBbGlhcygpIGNvbnN0IHsgcmV0dXJuIEFsaWFzVHkgPT0gTXVzdEFsaWFzOyB9CisgIGJvb2wgaXNNYXlBbGlhcygpICBjb25zdCB7IHJldHVybiBBbGlhc1R5ID09IE1heUFsaWFzOyB9CisKKyAgLy8gaXNWb2xhdGlsZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgYWxpYXMgc2V0IGNvbnRhaW5zIHZvbGF0aWxlIGxvYWRzIG9yCisgIC8vIHN0b3Jlcy4KKyAgYm9vbCBpc1ZvbGF0aWxlKCkgY29uc3QgeyByZXR1cm4gVm9sYXRpbGU7IH0KKworICAvLy8gaXNGb3J3YXJkaW5nQWxpYXNTZXQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFsaWFzIHNldCBzaG91bGQgYmUgaWdub3JlZCBhcworICAvLy8gcGFydCBvZiB0aGUgQWxpYXNTZXRUcmFja2VyIG9iamVjdC4KKyAgYm9vbCBpc0ZvcndhcmRpbmdBbGlhc1NldCgpIGNvbnN0IHsgcmV0dXJuIEZvcndhcmQ7IH0KKworICAvLy8gbWVyZ2VTZXRJbiAtIE1lcmdlIHRoZSBzcGVjaWZpZWQgYWxpYXMgc2V0IGludG8gdGhpcyBhbGlhcyBzZXQuLi4KKyAgLy8vCisgIHZvaWQgbWVyZ2VTZXRJbihBbGlhc1NldCAmQVMsIEFsaWFzU2V0VHJhY2tlciAmQVNUKTsKKworICAvLyBBbGlhcyBTZXQgaXRlcmF0aW9uIC0gQWxsb3cgYWNjZXNzIHRvIGFsbCBvZiB0aGUgcG9pbnRlciB3aGljaCBhcmUgcGFydCBvZgorICAvLyB0aGlzIGFsaWFzIHNldC4uLgorICBjbGFzcyBpdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihQdHJMaXN0KTsgfQorICBpdGVyYXRvciBlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFB0ckxpc3QgPT0gMDsgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIERlZmluZSBhbiBpdGVyYXRvciBmb3IgYWxpYXMgc2V0cy4uLiB0aGlzIGlzIGp1c3QgYSBmb3J3YXJkIGl0ZXJhdG9yLgorICBjbGFzcyBpdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclJlYywgcHRyZGlmZl90PiB7CisgICAgUG9pbnRlclJlYyAqQ3VyTm9kZTsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IGl0ZXJhdG9yKFBvaW50ZXJSZWMgKkNOID0gMCkgOiBDdXJOb2RlKENOKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7CisgICAgICByZXR1cm4gQ3VyTm9kZSA9PSB4LkN1ck5vZGU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICAgIGNvbnN0IGl0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgaXRlcmF0b3IgJkkpIHsKKyAgICAgIEN1ck5vZGUgPSBJLkN1ck5vZGU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdmFsdWVfdHlwZSAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgYXNzZXJ0KEN1ck5vZGUgJiYgIkRlcmVmZXJlbmNpbmcgQWxpYXNTZXQuZW5kKCkhIik7CisgICAgICByZXR1cm4gKkN1ck5vZGU7CisgICAgfQorICAgIHZhbHVlX3R5cGUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmb3BlcmF0b3IqKCk7IH0KKworICAgIFZhbHVlICpnZXRQb2ludGVyKCkgY29uc3QgeyByZXR1cm4gQ3VyTm9kZS0+Z2V0VmFsdWUoKTsgfQorICAgIHVuc2lnbmVkIGdldFNpemUoKSBjb25zdCB7IHJldHVybiBDdXJOb2RlLT5nZXRTaXplKCk7IH0KKworICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgICAgICAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICAgIGFzc2VydChDdXJOb2RlICYmICJBZHZhbmNpbmcgcGFzdCBBbGlhc1NldC5lbmQoKSEiKTsKKyAgICAgIEN1ck5vZGUgPSBDdXJOb2RlLT5nZXROZXh0KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIGl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8gQ2FuIG9ubHkgYmUgY3JlYXRlZCBieSBBbGlhc1NldFRyYWNrZXIuIEFsc28sIGlsaXN0IGNyZWF0ZXMgb25lCisgIC8vIHRvIHNlcnZlIGFzIGEgc2VudGluZWwuCisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3Rfc2VudGluZWxfdHJhaXRzPEFsaWFzU2V0PjsKKyAgQWxpYXNTZXQoKSA6IFB0ckxpc3QoMCksIFB0ckxpc3RFbmQoJlB0ckxpc3QpLCBGb3J3YXJkKDApLCBSZWZDb3VudCgwKSwKKyAgICAgICAgICAgICAgIEFjY2Vzc1R5KE5vTW9kUmVmKSwgQWxpYXNUeShNdXN0QWxpYXMpLCBWb2xhdGlsZShmYWxzZSkgeworICB9CisKKyAgQWxpYXNTZXQoY29uc3QgQWxpYXNTZXQgJkFTKTsgICAgICAgIC8vIGRvIG5vdCBpbXBsZW1lbnQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQWxpYXNTZXQgJkFTKTsgIC8vIGRvIG5vdCBpbXBsZW1lbnQKKworICBQb2ludGVyUmVjICpnZXRTb21lUG9pbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyTGlzdDsKKyAgfQorCisgIC8vLyBnZXRGb3J3YXJkZWRUYXJnZXQgLSBSZXR1cm4gdGhlIHJlYWwgYWxpYXMgc2V0IHRoaXMgcmVwcmVzZW50cy4gIElmIHRoaXMKKyAgLy8vIGhhcyBiZWVuIG1lcmdlZCB3aXRoIGFub3RoZXIgc2V0IGFuZCBpcyBmb3J3YXJkaW5nLCByZXR1cm4gdGhlIHVsdGltYXRlCisgIC8vLyBkZXN0aW5hdGlvbiBzZXQuICBUaGlzIGFsc28gaW1wbGVtZW50cyB0aGUgdW5pb24tZmluZCBjb2xsYXBzaW5nIGFzIHdlbGwuCisgIEFsaWFzU2V0ICpnZXRGb3J3YXJkZWRUYXJnZXQoQWxpYXNTZXRUcmFja2VyICZBU1QpIHsKKyAgICBpZiAoIUZvcndhcmQpIHJldHVybiB0aGlzOworCisgICAgQWxpYXNTZXQgKkRlc3QgPSBGb3J3YXJkLT5nZXRGb3J3YXJkZWRUYXJnZXQoQVNUKTsKKyAgICBpZiAoRGVzdCAhPSBGb3J3YXJkKSB7CisgICAgICBEZXN0LT5hZGRSZWYoKTsKKyAgICAgIEZvcndhcmQtPmRyb3BSZWYoQVNUKTsKKyAgICAgIEZvcndhcmQgPSBEZXN0OworICAgIH0KKyAgICByZXR1cm4gRGVzdDsKKyAgfQorCisgIHZvaWQgcmVtb3ZlRnJvbVRyYWNrZXIoQWxpYXNTZXRUcmFja2VyICZBU1QpOworCisgIHZvaWQgYWRkUG9pbnRlcihBbGlhc1NldFRyYWNrZXIgJkFTVCwgUG9pbnRlclJlYyAmRW50cnksIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICBib29sIEtub3duTXVzdEFsaWFzID0gZmFsc2UpOworICB2b2lkIGFkZENhbGxTaXRlKENhbGxTaXRlIENTLCBBbGlhc0FuYWx5c2lzICZBQSk7CisgIHZvaWQgcmVtb3ZlQ2FsbFNpdGUoQ2FsbFNpdGUgQ1MpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IENhbGxTaXRlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKENhbGxTaXRlc1tpXS5nZXRJbnN0cnVjdGlvbigpID09IENTLmdldEluc3RydWN0aW9uKCkpIHsKKyAgICAgICAgQ2FsbFNpdGVzW2ldID0gQ2FsbFNpdGVzLmJhY2soKTsKKyAgICAgICAgQ2FsbFNpdGVzLnBvcF9iYWNrKCk7CisgICAgICB9CisgIH0KKyAgdm9pZCBzZXRWb2xhdGlsZSgpIHsgVm9sYXRpbGUgPSB0cnVlOyB9CisKKyAgLy8vIGFsaWFzZXNQb2ludGVyIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVyICJtYXkiIChvciBtdXN0KQorICAvLy8gYWxpYXMgb25lIG9mIHRoZSBtZW1iZXJzIGluIHRoZSBzZXQuCisgIC8vLworICBib29sIGFsaWFzZXNQb2ludGVyKGNvbnN0IFZhbHVlICpQdHIsIHVuc2lnbmVkIFNpemUsIEFsaWFzQW5hbHlzaXMgJkFBKSBjb25zdDsKKyAgYm9vbCBhbGlhc2VzQ2FsbFNpdGUoQ2FsbFNpdGUgQ1MsIEFsaWFzQW5hbHlzaXMgJkFBKSBjb25zdDsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEFsaWFzU2V0ICZBUykgeworICBBUy5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworCitjbGFzcyBBbGlhc1NldFRyYWNrZXIgeworICAvLy8gQ2FsbGJhY2tWSCAtIEEgQ2FsbGJhY2tWSCB0byBhcnJhbmdlIGZvciBBbGlhc1NldFRyYWNrZXIgdG8gYmUKKyAgLy8vIG5vdGlmaWVkIHdoZW5ldmVyIGEgVmFsdWUgaXMgZGVsZXRlZC4KKyAgY2xhc3MgQVNUQ2FsbGJhY2tWSCA6IHB1YmxpYyBDYWxsYmFja1ZIIHsKKyAgICBBbGlhc1NldFRyYWNrZXIgKkFTVDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlZCgpOworICBwdWJsaWM6CisgICAgQVNUQ2FsbGJhY2tWSChWYWx1ZSAqViwgQWxpYXNTZXRUcmFja2VyICpBU1QgPSAwKTsKKyAgICBBU1RDYWxsYmFja1ZIICZvcGVyYXRvcj0oVmFsdWUgKlYpOworICB9OworICAvLy8gQVNUQ2FsbGJhY2tWSERlbnNlTWFwSW5mbyAtIFRyYWl0cyB0byB0ZWxsIERlbnNlTWFwIHRoYXQgdGVsbCB1cyBob3cgdG8KKyAgLy8vIGNvbXBhcmUgYW5kIGhhc2ggdGhlIHZhbHVlIGhhbmRsZS4KKyAgc3RydWN0IEFTVENhbGxiYWNrVkhEZW5zZU1hcEluZm8gOiBwdWJsaWMgRGVuc2VNYXBJbmZvPFZhbHVlICo+IHt9OworCisgIEFsaWFzQW5hbHlzaXMgJkFBOworICBpbGlzdDxBbGlhc1NldD4gQWxpYXNTZXRzOworCisgIHR5cGVkZWYgRGVuc2VNYXA8QVNUQ2FsbGJhY2tWSCwgQWxpYXNTZXQ6OlBvaW50ZXJSZWMqLAorICAgICAgICAgICAgICAgICAgIEFTVENhbGxiYWNrVkhEZW5zZU1hcEluZm8+CisgICAgUG9pbnRlck1hcFR5cGU7CisKKyAgLy8gTWFwIGZyb20gcG9pbnRlcnMgdG8gdGhlaXIgbm9kZQorICBQb2ludGVyTWFwVHlwZSBQb2ludGVyTWFwOworCitwdWJsaWM6CisgIC8vLyBBbGlhc1NldFRyYWNrZXIgY3RvciAtIENyZWF0ZSBhbiBlbXB0eSBjb2xsZWN0aW9uIG9mIEFsaWFzU2V0cywgYW5kIHVzZQorICAvLy8gdGhlIHNwZWNpZmllZCBhbGlhcyBhbmFseXNpcyBvYmplY3QgdG8gZGlzYW1iaWd1YXRlIGxvYWQgYW5kIHN0b3JlCisgIC8vLyBhZGRyZXNzZXMuCisgIGV4cGxpY2l0IEFsaWFzU2V0VHJhY2tlcihBbGlhc0FuYWx5c2lzICZhYSkgOiBBQShhYSkge30KKyAgfkFsaWFzU2V0VHJhY2tlcigpIHsgY2xlYXIoKTsgfQorCisgIC8vLyBhZGQgbWV0aG9kcyAtIFRoZXNlIG1ldGhvZHMgYXJlIHVzZWQgdG8gYWRkIGRpZmZlcmVudCB0eXBlcyBvZgorICAvLy8gaW5zdHJ1Y3Rpb25zIHRvIHRoZSBhbGlhcyBzZXRzLiAgQWRkaW5nIGEgbmV3IGluc3RydWN0aW9uIGNhbiByZXN1bHQgaW4KKyAgLy8vIG9uZSBvZiB0aHJlZSBhY3Rpb25zIGhhcHBlbmluZzoKKyAgLy8vCisgIC8vLyAgIDEuIElmIHRoZSBpbnN0cnVjdGlvbiBkb2Vzbid0IGFsaWFzIGFueSBvdGhlciBzZXRzLCBjcmVhdGUgYSBuZXcgc2V0LgorICAvLy8gICAyLiBJZiB0aGUgaW5zdHJ1Y3Rpb24gYWxpYXNlcyBleGFjdGx5IG9uZSBzZXQsIGFkZCBpdCB0byB0aGUgc2V0CisgIC8vLyAgIDMuIElmIHRoZSBpbnN0cnVjdGlvbiBhbGlhc2VzIG11bHRpcGxlIHNldHMsIG1lcmdlIHRoZSBzZXRzLCBhbmQgYWRkCisgIC8vLyAgICAgIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgcmVzdWx0LgorICAvLy8KKyAgLy8vIFRoZXNlIG1ldGhvZHMgcmV0dXJuIHRydWUgaWYgaW5zZXJ0aW5nIHRoZSBpbnN0cnVjdGlvbiByZXN1bHRlZCBpbiB0aGUKKyAgLy8vIGFkZGl0aW9uIG9mIGEgbmV3IGFsaWFzIHNldCAoaS5lLiwgdGhlIHBvaW50ZXIgZGlkIG5vdCBhbGlhcyBhbnl0aGluZykuCisgIC8vLworICBib29sIGFkZChWYWx1ZSAqUHRyLCB1bnNpZ25lZCBTaXplKTsgIC8vIEFkZCBhIGxvY2F0aW9uCisgIGJvb2wgYWRkKExvYWRJbnN0ICpMSSk7CisgIGJvb2wgYWRkKFN0b3JlSW5zdCAqU0kpOworICBib29sIGFkZChDYWxsU2l0ZSBDUyk7ICAgICAgICAgIC8vIENhbGwvSW52b2tlIGluc3RydWN0aW9ucworICBib29sIGFkZChDYWxsSW5zdCAqQ0kpICAgeyByZXR1cm4gYWRkKENhbGxTaXRlKENJKSk7IH0KKyAgYm9vbCBhZGQoSW5zdHJ1Y3Rpb24gKkkpOyAgICAgICAvLyBEaXNwYXRjaCB0byBvbmUgb2YgdGhlIG90aGVyIGFkZCBtZXRob2RzLi4uCisgIHZvaWQgYWRkKEJhc2ljQmxvY2sgJkJCKTsgICAgICAgLy8gQWRkIGFsbCBpbnN0cnVjdGlvbnMgaW4gYmFzaWMgYmxvY2sKKyAgdm9pZCBhZGQoY29uc3QgQWxpYXNTZXRUcmFja2VyICZBU1QpOyAvLyBBZGQgYWxpYXMgcmVsYXRpb25zIGZyb20gYW5vdGhlciBBU1QKKworICAvLy8gcmVtb3ZlIG1ldGhvZHMgLSBUaGVzZSBtZXRob2RzIGFyZSB1c2VkIHRvIHJlbW92ZSBhbGwgZW50cmllcyB0aGF0IG1pZ2h0CisgIC8vLyBiZSBhbGlhc2VkIGJ5IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uICBUaGVzZSBtZXRob2RzIHJldHVybiB0cnVlIGlmIGFueQorICAvLy8gYWxpYXMgc2V0cyB3ZXJlIGVsaW1pbmF0ZWQuCisgIGJvb2wgcmVtb3ZlKFZhbHVlICpQdHIsIHVuc2lnbmVkIFNpemUpOyAgLy8gUmVtb3ZlIGEgbG9jYXRpb24KKyAgYm9vbCByZW1vdmUoTG9hZEluc3QgKkxJKTsKKyAgYm9vbCByZW1vdmUoU3RvcmVJbnN0ICpTSSk7CisgICAgYm9vbCByZW1vdmUoQ2FsbFNpdGUgQ1MpOworICBib29sIHJlbW92ZShDYWxsSW5zdCAqQ0kpICAgeyByZXR1cm4gcmVtb3ZlKENhbGxTaXRlKENJKSk7IH0KKyAgYm9vbCByZW1vdmUoSW5zdHJ1Y3Rpb24gKkkpOworICB2b2lkIHJlbW92ZShBbGlhc1NldCAmQVMpOworICAKKyAgdm9pZCBjbGVhcigpOworCisgIC8vLyBnZXRBbGlhc1NldHMgLSBSZXR1cm4gdGhlIGFsaWFzIHNldHMgdGhhdCBhcmUgYWN0aXZlLgorICAvLy8KKyAgY29uc3QgaWxpc3Q8QWxpYXNTZXQ+ICZnZXRBbGlhc1NldHMoKSBjb25zdCB7IHJldHVybiBBbGlhc1NldHM7IH0KKworICAvLy8gZ2V0QWxpYXNTZXRGb3JQb2ludGVyIC0gUmV0dXJuIHRoZSBhbGlhcyBzZXQgdGhhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIKKyAgLy8vIGxpdmVzIGluLiAgSWYgdGhlIE5ldyBhcmd1bWVudCBpcyBub24tbnVsbCwgdGhpcyBtZXRob2Qgc2V0cyB0aGUgdmFsdWUgdG8KKyAgLy8vIHRydWUgaWYgYSBuZXcgYWxpYXMgc2V0IGlzIGNyZWF0ZWQgdG8gY29udGFpbiB0aGUgcG9pbnRlciAoYmVjYXVzZSB0aGUKKyAgLy8vIHBvaW50ZXIgZGlkbid0IGFsaWFzIGFueXRoaW5nKS4KKyAgQWxpYXNTZXQgJmdldEFsaWFzU2V0Rm9yUG9pbnRlcihWYWx1ZSAqUCwgdW5zaWduZWQgU2l6ZSwgYm9vbCAqTmV3ID0gMCk7CisKKyAgLy8vIGdldEFsaWFzU2V0Rm9yUG9pbnRlcklmRXhpc3RzIC0gUmV0dXJuIHRoZSBhbGlhcyBzZXQgY29udGFpbmluZyB0aGUKKyAgLy8vIGxvY2F0aW9uIHNwZWNpZmllZCBpZiBvbmUgZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIEFsaWFzU2V0ICpnZXRBbGlhc1NldEZvclBvaW50ZXJJZkV4aXN0cyhWYWx1ZSAqUCwgdW5zaWduZWQgU2l6ZSkgeworICAgIHJldHVybiBmaW5kQWxpYXNTZXRGb3JQb2ludGVyKFAsIFNpemUpOworICB9CisKKyAgLy8vIGNvbnRhaW5zUG9pbnRlciAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaXMgcmVwcmVzZW50ZWQgYnkKKyAgLy8vIHRoaXMgYWxpYXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuICBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgQVNUIG9iamVjdCBvcgorICAvLy8gYWxpYXMgc2V0cy4KKyAgYm9vbCBjb250YWluc1BvaW50ZXIoVmFsdWUgKlAsIHVuc2lnbmVkIFNpemUpIGNvbnN0OworCisgIC8vLyBnZXRBbGlhc0FuYWx5c2lzIC0gUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGFsaWFzIGFuYWx5c2lzIG9iamVjdCB1c2VkIGJ5CisgIC8vLyB0aGlzIHRyYWNrZXIuCisgIEFsaWFzQW5hbHlzaXMgJmdldEFsaWFzQW5hbHlzaXMoKSBjb25zdCB7IHJldHVybiBBQTsgfQorCisgIC8vLyBkZWxldGVWYWx1ZSBtZXRob2QgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJlbW92ZSBhIHBvaW50ZXIgdmFsdWUgZnJvbQorICAvLy8gdGhlIEFsaWFzU2V0VHJhY2tlciBlbnRpcmVseS4gIEl0IHNob3VsZCBiZSB1c2VkIHdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMKKyAgLy8vIGRlbGV0ZWQgZnJvbSB0aGUgcHJvZ3JhbSB0byB1cGRhdGUgdGhlIEFTVC4gIElmIHlvdSBkb24ndCB1c2UgdGhpcywgeW91CisgIC8vLyB3b3VsZCBoYXZlIGRhbmdsaW5nIHBvaW50ZXJzIHRvIGRlbGV0ZWQgaW5zdHJ1Y3Rpb25zLgorICAvLy8KKyAgdm9pZCBkZWxldGVWYWx1ZShWYWx1ZSAqUHRyVmFsKTsKKworICAvLy8gY29weVZhbHVlIC0gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgYSBwcmVleGlzdGluZyB2YWx1ZSBpbiB0aGUKKyAgLy8vIHByb2dyYW0gaXMgY29waWVkIG9yIGNsb25lZCwgaW50cm9kdWNpbmcgYSBuZXcgdmFsdWUuICBOb3RlIHRoYXQgaXQgaXMgb2sKKyAgLy8vIGZvciBjbGllbnRzIHRoYXQgdXNlIHRoaXMgbWV0aG9kIHRvIGludHJvZHVjZSB0aGUgc2FtZSB2YWx1ZSBtdWx0aXBsZQorICAvLy8gdGltZXM6IGlmIHRoZSB0cmFja2VyIGFscmVhZHkga25vd3MgYWJvdXQgYSB2YWx1ZSwgaXQgd2lsbCBpZ25vcmUgdGhlCisgIC8vLyByZXF1ZXN0LgorICAvLy8KKyAgdm9pZCBjb3B5VmFsdWUoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKKworICB0eXBlZGVmIGlsaXN0PEFsaWFzU2V0Pjo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgaWxpc3Q8QWxpYXNTZXQ+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEFsaWFzU2V0cy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgY29uc3QgeyByZXR1cm4gQWxpYXNTZXRzLmVuZCgpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBBbGlhc1NldHMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIEFsaWFzU2V0cy5lbmQoKTsgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBBbGlhc1NldDsKKyAgdm9pZCByZW1vdmVBbGlhc1NldChBbGlhc1NldCAqQVMpOworCisgIC8vIGdldEVudHJ5Rm9yIC0gSnVzdCBsaWtlIG9wZXJhdG9yW10gb24gdGhlIG1hcCwgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhbgorICAvLyBlbnRyeSBmb3IgdGhlIHBvaW50ZXIgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgorICBBbGlhc1NldDo6UG9pbnRlclJlYyAmZ2V0RW50cnlGb3IoVmFsdWUgKlYpIHsKKyAgICBBbGlhc1NldDo6UG9pbnRlclJlYyAqJkVudHJ5ID0gUG9pbnRlck1hcFtBU1RDYWxsYmFja1ZIKFYsIHRoaXMpXTsKKyAgICBpZiAoRW50cnkgPT0gMCkKKyAgICAgIEVudHJ5ID0gbmV3IEFsaWFzU2V0OjpQb2ludGVyUmVjKFYpOworICAgIHJldHVybiAqRW50cnk7CisgIH0KKworICBBbGlhc1NldCAmYWRkUG9pbnRlcihWYWx1ZSAqUCwgdW5zaWduZWQgU2l6ZSwgQWxpYXNTZXQ6OkFjY2Vzc1R5cGUgRSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmTmV3U2V0KSB7CisgICAgTmV3U2V0ID0gZmFsc2U7CisgICAgQWxpYXNTZXQgJkFTID0gZ2V0QWxpYXNTZXRGb3JQb2ludGVyKFAsIFNpemUsICZOZXdTZXQpOworICAgIEFTLkFjY2Vzc1R5IHw9IEU7CisgICAgcmV0dXJuIEFTOworICB9CisgIEFsaWFzU2V0ICpmaW5kQWxpYXNTZXRGb3JQb2ludGVyKGNvbnN0IFZhbHVlICpQdHIsIHVuc2lnbmVkIFNpemUpOworCisgIEFsaWFzU2V0ICpmaW5kQWxpYXNTZXRGb3JDYWxsU2l0ZShDYWxsU2l0ZSBDUyk7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBBbGlhc1NldFRyYWNrZXIgJkFTVCkgeworICBBU1QucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NGR1ByaW50ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkdQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4ZjU5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkdQcmludGVyLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vPT09LS0gQ0ZHUHJpbnRlci5oIC0gQ0ZHIHByaW50ZXIgZXh0ZXJuYWwgaW50ZXJmYWNlIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgZXh0ZXJuYWwgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBleHBsaWNpdGx5CisvLyBpbnN0YW50aWF0ZSB0aGUgQ0ZHIHByaW50ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NGR1BSSU5URVJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NGR1BSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dyYXBoV3JpdGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlPD4KK3N0cnVjdCBET1RHcmFwaFRyYWl0czxjb25zdCBGdW5jdGlvbio+IDogcHVibGljIERlZmF1bHRET1RHcmFwaFRyYWl0cyB7CisKKyAgRE9UR3JhcGhUcmFpdHMgKGJvb2wgaXNTaW1wbGU9ZmFsc2UpIDogRGVmYXVsdERPVEdyYXBoVHJhaXRzKGlzU2ltcGxlKSB7fQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRHcmFwaE5hbWUoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gIkNGRyBmb3IgJyIgKyBGLT5nZXROYW1lU3RyKCkgKyAiJyBmdW5jdGlvbiI7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0U2ltcGxlTm9kZUxhYmVsKGNvbnN0IEJhc2ljQmxvY2sgKk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gKkdyYXBoKSB7CisgICAgaWYgKCFOb2RlLT5nZXROYW1lKCkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBOb2RlLT5nZXROYW1lU3RyKCk7IAorCisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIHJhd19zdHJpbmdfb3N0cmVhbSBPUyhTdHIpOworCisgICAgV3JpdGVBc09wZXJhbmQoT1MsIE5vZGUsIGZhbHNlKTsKKyAgICByZXR1cm4gT1Muc3RyKCk7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0Q29tcGxldGVOb2RlTGFiZWwoY29uc3QgQmFzaWNCbG9jayAqTm9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqR3JhcGgpIHsKKyAgICBzdGQ6OnN0cmluZyBTdHI7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKFN0cik7CisKKyAgICBpZiAoTm9kZS0+Z2V0TmFtZSgpLmVtcHR5KCkpIHsKKyAgICAgIFdyaXRlQXNPcGVyYW5kKE9TLCBOb2RlLCBmYWxzZSk7CisgICAgICBPUyA8PCAiOiI7CisgICAgfQorCisgICAgT1MgPDwgKk5vZGU7CisgICAgc3RkOjpzdHJpbmcgT3V0U3RyID0gT1Muc3RyKCk7CisgICAgaWYgKE91dFN0clswXSA9PSAnXG4nKSBPdXRTdHIuZXJhc2UoT3V0U3RyLmJlZ2luKCkpOworCisgICAgLy8gUHJvY2VzcyBzdHJpbmcgb3V0cHV0IHRvIG1ha2UgaXQgbmljZXIuLi4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE91dFN0ci5sZW5ndGgoKTsgKytpKQorICAgICAgaWYgKE91dFN0cltpXSA9PSAnXG4nKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlZnQganVzdGlmeQorICAgICAgICBPdXRTdHJbaV0gPSAnXFwnOworICAgICAgICBPdXRTdHIuaW5zZXJ0KE91dFN0ci5iZWdpbigpK2krMSwgJ2wnKTsKKyAgICAgIH0gZWxzZSBpZiAoT3V0U3RyW2ldID09ICc7JykgeyAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxldGUgY29tbWVudHMhCisgICAgICAgIHVuc2lnbmVkIElkeCA9IE91dFN0ci5maW5kKCdcbicsIGkrMSk7ICAgICAgICAgICAgLy8gRmluZCBlbmQgb2YgbGluZQorICAgICAgICBPdXRTdHIuZXJhc2UoT3V0U3RyLmJlZ2luKCkraSwgT3V0U3RyLmJlZ2luKCkrSWR4KTsKKyAgICAgICAgLS1pOworICAgICAgfQorCisgICAgcmV0dXJuIE91dFN0cjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldE5vZGVMYWJlbChjb25zdCBCYXNpY0Jsb2NrICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gKkdyYXBoKSB7CisgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICByZXR1cm4gZ2V0U2ltcGxlTm9kZUxhYmVsKE5vZGUsIEdyYXBoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZ2V0Q29tcGxldGVOb2RlTGFiZWwoTm9kZSwgR3JhcGgpOworICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEVkZ2VTb3VyY2VMYWJlbChjb25zdCBCYXNpY0Jsb2NrICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2NfY29uc3RfaXRlcmF0b3IgSSkgeworICAgIC8vIExhYmVsIHNvdXJjZSBvZiBjb25kaXRpb25hbCBicmFuY2hlcyB3aXRoICJUIiBvciAiRiIKKyAgICBpZiAoY29uc3QgQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihOb2RlLT5nZXRUZXJtaW5hdG9yKCkpKQorICAgICAgaWYgKEJJLT5pc0NvbmRpdGlvbmFsKCkpCisgICAgICAgIHJldHVybiAoSSA9PSBzdWNjX2JlZ2luKE5vZGUpKSA/ICJUIiA6ICJGIjsKKyAgICAKKyAgICAvLyBMYWJlbCBzb3VyY2Ugb2Ygc3dpdGNoIGVkZ2VzIHdpdGggdGhlIGFzc29jaWF0ZWQgdmFsdWUuCisgICAgaWYgKGNvbnN0IFN3aXRjaEluc3QgKlNJID0gZHluX2Nhc3Q8U3dpdGNoSW5zdD4oTm9kZS0+Z2V0VGVybWluYXRvcigpKSkgeworICAgICAgdW5zaWduZWQgU3VjY05vID0gSS5nZXRTdWNjZXNzb3JJbmRleCgpOworCisgICAgICBpZiAoU3VjY05vID09IDApIHJldHVybiAiZGVmIjsKKyAgICAgIAorICAgICAgc3RkOjpzdHJpbmcgU3RyOworICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKFN0cik7CisgICAgICBPUyA8PCBTSS0+Z2V0Q2FzZVZhbHVlKFN1Y2NObyktPmdldFZhbHVlKCk7CisgICAgICByZXR1cm4gT1Muc3RyKCk7CisgICAgfSAgICAKKyAgICByZXR1cm4gIiI7CisgIH0KK307Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZ1bmN0aW9uUGFzczsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVDRkdQcmludGVyUGFzcyAoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVDRkdPbmx5UHJpbnRlclBhc3MgKCk7Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYWxsR3JhcGguaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYWxsR3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg4NGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhbGxHcmFwaC5oCkBAIC0wLDAgKzEsMzY2IEBACisvLz09PS0gQ2FsbEdyYXBoLmggLSBCdWlsZCBhIE1vZHVsZSdzIGNhbGwgZ3JhcGggLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gYnVpbGQgYW5kIG1hbmlwdWxhdGUgYSBjYWxsIGdyYXBoLCB3aGljaCBpcyBhIHZlcnkKKy8vIHVzZWZ1bCB0b29sIGZvciBpbnRlcnByb2NlZHVyYWwgb3B0aW1pemF0aW9uLgorLy8KKy8vIEV2ZXJ5IGZ1bmN0aW9uIGluIGEgbW9kdWxlIGlzIHJlcHJlc2VudGVkIGFzIGEgbm9kZSBpbiB0aGUgY2FsbCBncmFwaC4gIFRoZQorLy8gY2FsbGdyYXBoIG5vZGUga2VlcHMgdHJhY2sgb2Ygd2hpY2ggZnVuY3Rpb25zIHRoZSBhcmUgY2FsbGVkIGJ5IHRoZSBmdW5jdGlvbgorLy8gY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZS4KKy8vCisvLyBBIGNhbGwgZ3JhcGggbWF5IGNvbnRhaW4gbm9kZXMgd2hlcmUgdGhlIGZ1bmN0aW9uIHRoYXQgdGhleSBjb3JyZXNwb25kIHRvIGlzCisvLyBudWxsLiAgVGhlc2UgJ2V4dGVybmFsJyBub2RlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgY29udHJvbCBmbG93IHRoYXQgaXMgbm90CisvLyByZXByZXNlbnRlZCAob3IgYW5hbHl6YWJsZSkgaW4gdGhlIG1vZHVsZS4gIEluIHBhcnRpY3VsYXIsIHRoaXMgYW5hbHlzaXMKKy8vIGJ1aWxkcyBvbmUgZXh0ZXJuYWwgbm9kZSBzdWNoIHRoYXQ6CisvLyAgIDEuIEFsbCBmdW5jdGlvbnMgaW4gdGhlIG1vZHVsZSB3aXRob3V0IGludGVybmFsIGxpbmthZ2Ugd2lsbCBoYXZlIGVkZ2VzCisvLyAgICAgIGZyb20gdGhpcyBleHRlcm5hbCBub2RlLCBpbmRpY2F0aW5nIHRoYXQgdGhleSBjb3VsZCBiZSBjYWxsZWQgYnkKKy8vICAgICAgZnVuY3Rpb25zIG91dHNpZGUgb2YgdGhlIG1vZHVsZS4KKy8vICAgMi4gQWxsIGZ1bmN0aW9ucyB3aG9zZSBhZGRyZXNzIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBtb3JlIHRoYW4gYSBkaXJlY3QKKy8vICAgICAgY2FsbCwgZm9yIGV4YW1wbGUgYmVpbmcgc3RvcmVkIGludG8gYSBtZW1vcnkgbG9jYXRpb24gd2lsbCBhbHNvIGhhdmUgYW4KKy8vICAgICAgZWRnZSBmcm9tIHRoaXMgZXh0ZXJuYWwgbm9kZS4gIFNpbmNlIHRoZXkgbWF5IGJlIGNhbGxlZCBieSBhbiB1bmtub3duCisvLyAgICAgIGNhbGxlciBsYXRlciwgdGhleSBtdXN0IGJlIHRyYWNrZWQgYXMgc3VjaC4KKy8vCisvLyBUaGVyZSBpcyBhIHNlY29uZCBleHRlcm5hbCBub2RlIGFkZGVkIGZvciBjYWxscyB0aGF0IGxlYXZlIHRoaXMgbW9kdWxlLgorLy8gRnVuY3Rpb25zIGhhdmUgYSBjYWxsIGVkZ2UgdG8gdGhlIGV4dGVybmFsIG5vZGUgaWZmOgorLy8gICAxLiBUaGUgZnVuY3Rpb24gaXMgZXh0ZXJuYWwsIHJlZmxlY3RpbmcgdGhlIGZhY3QgdGhhdCB0aGV5IGNvdWxkIGNhbGwKKy8vICAgICAgYW55dGhpbmcgd2l0aG91dCBpbnRlcm5hbCBsaW5rYWdlIG9yIHRoYXQgaGFzIGl0cyBhZGRyZXNzIHRha2VuLgorLy8gICAyLiBUaGUgZnVuY3Rpb24gY29udGFpbnMgYW4gaW5kaXJlY3QgZnVuY3Rpb24gY2FsbC4KKy8vCisvLyBBcyBhbiBleHRlbnNpb24gaW4gdGhlIGZ1dHVyZSwgdGhlcmUgbWF5IGJlIG11bHRpcGxlIG5vZGVzIHdpdGggYSBudWxsCisvLyBmdW5jdGlvbi4gIFRoZXNlIHdpbGwgYmUgdXNlZCB3aGVuIHdlIGNhbiBwcm92ZSAodGhyb3VnaCBwb2ludGVyIGFuYWx5c2lzKQorLy8gdGhhdCBhbiBpbmRpcmVjdCBjYWxsIHNpdGUgY2FuIGNhbGwgb25seSBhIHNwZWNpZmljIHNldCBvZiBmdW5jdGlvbnMuCisvLworLy8gQmVjYXVzZSBvZiB0aGVzZSBwcm9wZXJ0aWVzLCB0aGUgQ2FsbEdyYXBoIGNhcHR1cmVzIGEgY29uc2VydmF0aXZlIHN1cGVyc2V0CisvLyBvZiBhbGwgb2YgdGhlIGNhbGxlci1jYWxsZWUgcmVsYXRpb25zaGlwcywgd2hpY2ggaXMgdXNlZnVsIGZvcgorLy8gdHJhbnNmb3JtYXRpb25zLgorLy8KKy8vIFRoZSBDYWxsR3JhcGggY2xhc3MgYWxzbyBhdHRlbXB0cyB0byBmaWd1cmUgb3V0IHdoYXQgdGhlIHJvb3Qgb2YgdGhlCisvLyBDYWxsR3JhcGggaXMsIHdoaWNoIGl0IGN1cnJlbnRseSBkb2VzIGJ5IGxvb2tpbmcgZm9yIGEgZnVuY3Rpb24gbmFtZWQgJ21haW4nLgorLy8gSWYgbm8gZnVuY3Rpb24gbmFtZWQgJ21haW4nIGlzIGZvdW5kLCB0aGUgZXh0ZXJuYWwgbm9kZSBpcyB1c2VkIGFzIHRoZSBlbnRyeQorLy8gbm9kZSwgcmVmbGVjdGluZyB0aGUgZmFjdCB0aGF0IGFueSBmdW5jdGlvbiB3aXRob3V0IGludGVybmFsIGxpbmthZ2UgY291bGQKKy8vIGJlIGNhbGxlZCBpbnRvICh3aGljaCBpcyBjb21tb24gZm9yIGxpYnJhcmllcykuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NBTExHUkFQSF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ0FMTEdSQVBIX0gKKworI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0luY2x1ZGVGaWxlLmgiCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgQ2FsbEdyYXBoTm9kZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENhbGxHcmFwaCBjbGFzcyBkZWZpbml0aW9uCisvLworY2xhc3MgQ2FsbEdyYXBoIHsKK3Byb3RlY3RlZDoKKyAgTW9kdWxlICpNb2Q7ICAgICAgICAgICAgICAvLyBUaGUgbW9kdWxlIHRoaXMgY2FsbCBncmFwaCByZXByZXNlbnRzCisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiAqLCBDYWxsR3JhcGhOb2RlICo+IEZ1bmN0aW9uTWFwVHk7CisgIEZ1bmN0aW9uTWFwVHkgRnVuY3Rpb25NYXA7ICAgIC8vIE1hcCBmcm9tIGEgZnVuY3Rpb24gdG8gaXRzIG5vZGUKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gQ2xhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaW5mbworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBBY2Nlc3NvcnMuCisgIC8vCisgIHR5cGVkZWYgRnVuY3Rpb25NYXBUeTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgRnVuY3Rpb25NYXBUeTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIGdldE1vZHVsZSAtIFJldHVybiB0aGUgbW9kdWxlIHRoZSBjYWxsIGdyYXBoIGNvcnJlc3BvbmRzIHRvLgorICAvLy8KKyAgTW9kdWxlICZnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiAqTW9kOyB9CisKKyAgaW5saW5lICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgeyByZXR1cm4gRnVuY3Rpb25NYXAuYmVnaW4oKTsgfQorICBpbmxpbmUgICAgICAgaXRlcmF0b3IgZW5kKCkgICAgICAgICB7IHJldHVybiBGdW5jdGlvbk1hcC5lbmQoKTsgICB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uTWFwLmJlZ2luKCk7IH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25NYXAuZW5kKCk7ICAgfQorCisgIC8vIFN1YnNjcmlwdGluZyBvcGVyYXRvcnMsIHJldHVybiB0aGUgY2FsbCBncmFwaCBub2RlIGZvciB0aGUgcHJvdmlkZWQKKyAgLy8gZnVuY3Rpb24KKyAgaW5saW5lIGNvbnN0IENhbGxHcmFwaE5vZGUgKm9wZXJhdG9yW10oY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0IHsKKyAgICBjb25zdF9pdGVyYXRvciBJID0gRnVuY3Rpb25NYXAuZmluZChGKTsKKyAgICBhc3NlcnQoSSAhPSBGdW5jdGlvbk1hcC5lbmQoKSAmJiAiRnVuY3Rpb24gbm90IGluIGNhbGxncmFwaCEiKTsKKyAgICByZXR1cm4gSS0+c2Vjb25kOworICB9CisgIGlubGluZSBDYWxsR3JhcGhOb2RlICpvcGVyYXRvcltdKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgY29uc3RfaXRlcmF0b3IgSSA9IEZ1bmN0aW9uTWFwLmZpbmQoRik7CisgICAgYXNzZXJ0KEkgIT0gRnVuY3Rpb25NYXAuZW5kKCkgJiYgIkZ1bmN0aW9uIG5vdCBpbiBjYWxsZ3JhcGghIik7CisgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBDYWxsR3JhcGhOb2RlIHdoaWNoIGlzIHVzZWQgdG8gcmVwcmVzZW50IHVuZGV0ZXJtaW5lZCBjYWxscworICAvLy8gaW50byB0aGUgY2FsbGdyYXBoLiAgT3ZlcnJpZGUgdGhpcyBpZiB5b3Ugd2FudCBiZWhhdmlvcmFsIGluaGVyaXRhbmNlLgorICB2aXJ0dWFsIENhbGxHcmFwaE5vZGUqIGdldEV4dGVybmFsQ2FsbGluZ05vZGUoKSBjb25zdCB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgQ2FsbEdyYXBoTm9kZSogZ2V0Q2FsbHNFeHRlcm5hbE5vZGUoKSAgIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAvLy8gUmV0dXJuIHRoZSByb290L21haW4gbWV0aG9kIGluIHRoZSBtb2R1bGUsIG9yIHNvbWUgb3RoZXIgcm9vdCBub2RlLCBzdWNoCisgIC8vLyBhcyB0aGUgZXh0ZXJuYWxjYWxsaW5nbm9kZS4gIE92ZXJsb2FkIHRoZXNlIGlmIHlvdSBiZWhhdmlvcmFsCisgIC8vLyBpbmhlcml0YW5jZS4KKyAgdmlydHVhbCBDYWxsR3JhcGhOb2RlKiBnZXRSb290KCkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIGNvbnN0IENhbGxHcmFwaE5vZGUqIGdldFJvb3QoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRnVuY3Rpb25zIHRvIGtlZXAgYSBjYWxsIGdyYXBoIHVwIHRvIGRhdGUgd2l0aCBhIGZ1bmN0aW9uIHRoYXQgaGFzIGJlZW4KKyAgLy8gbW9kaWZpZWQuCisgIC8vCisKKyAgLy8vIHJlbW92ZUZ1bmN0aW9uRnJvbU1vZHVsZSAtIFVubGluayB0aGUgZnVuY3Rpb24gZnJvbSB0aGlzIG1vZHVsZSwgcmV0dXJuaW5nCisgIC8vLyBpdC4gIEJlY2F1c2UgdGhpcyByZW1vdmVzIHRoZSBmdW5jdGlvbiBmcm9tIHRoZSBtb2R1bGUsIHRoZSBjYWxsIGdyYXBoCisgIC8vLyBub2RlIGlzIGRlc3Ryb3llZC4gIFRoaXMgaXMgb25seSB2YWxpZCBpZiB0aGUgZnVuY3Rpb24gZG9lcyBub3QgY2FsbCBhbnkKKyAgLy8vIG90aGVyIGZ1bmN0aW9ucyAoaWUsIHRoZXJlIGFyZSBubyBlZGdlcyBpbiBpdCdzIENHTikuICBUaGUgZWFzaWVzdCB3YXkgdG8KKyAgLy8vIGRvIHRoaXMgaXMgdG8gZHJvcEFsbFJlZmVyZW5jZXMgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAgLy8vCisgIEZ1bmN0aW9uICpyZW1vdmVGdW5jdGlvbkZyb21Nb2R1bGUoQ2FsbEdyYXBoTm9kZSAqQ0dOKTsKKyAgRnVuY3Rpb24gKnJlbW92ZUZ1bmN0aW9uRnJvbU1vZHVsZShGdW5jdGlvbiAqRikgeworICAgIHJldHVybiByZW1vdmVGdW5jdGlvbkZyb21Nb2R1bGUoKCp0aGlzKVtGXSk7CisgIH0KKworICAvLy8gZ2V0T3JJbnNlcnRGdW5jdGlvbiAtIFRoaXMgbWV0aG9kIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nIG9wZXJhdG9yW10sIGJ1dAorICAvLy8gaXQgd2lsbCBpbnNlcnQgYSBuZXcgQ2FsbEdyYXBoTm9kZSBmb3IgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpZiBvbmUgZG9lcworICAvLy8gbm90IGFscmVhZHkgZXhpc3QuCisgIENhbGxHcmFwaE5vZGUgKmdldE9ySW5zZXJ0RnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKkYpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFBhc3MgaW5mcmFzdHJ1Y3R1cmUgaW50ZXJmYWNlIGdsdWUgY29kZS4KKyAgLy8KK3Byb3RlY3RlZDoKKyAgQ2FsbEdyYXBoKCkge30KKworcHVibGljOgorICB2aXJ0dWFsIH5DYWxsR3JhcGgoKSB7IGRlc3Ryb3koKTsgfQorCisgIC8vLyBpbml0aWFsaXplIC0gQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgY2FsbGluZyBvdGhlciBtZXRob2RzLAorICAvLy8gcmUvaW5pdGlhbGl6ZXMgdGhlIHN0YXRlIG9mIHRoZSBDYWxsR3JhcGguCisgIC8vLworICB2b2lkIGluaXRpYWxpemUoTW9kdWxlICZNKTsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZvLCBNb2R1bGUgKikgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworcHJvdGVjdGVkOgorICAvLyBkZXN0cm95IC0gUmVsZWFzZSBtZW1vcnkgZm9yIHRoZSBjYWxsIGdyYXBoCisgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ2FsbEdyYXBoTm9kZSBjbGFzcyBkZWZpbml0aW9uLgorLy8KK2NsYXNzIENhbGxHcmFwaE5vZGUgeworICBBc3NlcnRpbmdWSDxGdW5jdGlvbj4gRjsKKyAgCisgIC8vIENhbGxSZWNvcmQgLSBUaGlzIGlzIGEgcGFpciBvZiB0aGUgY2FsbGluZyBpbnN0cnVjdGlvbiAoYSBjYWxsIG9yIGludm9rZSkKKyAgLy8gYW5kIHRoZSBjYWxsZ3JhcGggbm9kZSBiZWluZyBjYWxsZWQuCitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpwYWlyPFdlYWtWSCwgQ2FsbEdyYXBoTm9kZSo+IENhbGxSZWNvcmQ7Citwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxDYWxsUmVjb3JkPiBDYWxsZWRGdW5jdGlvbnM7CisgIAorICAvLy8gTnVtUmVmZXJlbmNlcyAtIFRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoaXMgQ2FsbEdyYXBoTm9kZSBvY2N1cnMKKyAgLy8vIGluIHRoZSBDYWxsZWRGdW5jdGlvbnMgYXJyYXkgb2YgdGhpcyBvciBvdGhlciBDYWxsR3JhcGhOb2Rlcy4KKyAgdW5zaWduZWQgTnVtUmVmZXJlbmNlczsKKworICBDYWxsR3JhcGhOb2RlKGNvbnN0IENhbGxHcmFwaE5vZGUgJik7ICAgICAgICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYWxsR3JhcGhOb2RlICYpOyAgICAgICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICAKKyAgdm9pZCBEcm9wUmVmKCkgeyAtLU51bVJlZmVyZW5jZXM7IH0KKyAgdm9pZCBBZGRSZWYoKSB7ICsrTnVtUmVmZXJlbmNlczsgfQorcHVibGljOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPENhbGxSZWNvcmQ+IENhbGxlZEZ1bmN0aW9uc1ZlY3RvcjsKKworICAKKyAgLy8gQ2FsbEdyYXBoTm9kZSBjdG9yIC0gQ3JlYXRlIGEgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCBmdW5jdGlvbi4KKyAgaW5saW5lIENhbGxHcmFwaE5vZGUoRnVuY3Rpb24gKmYpIDogRihmKSwgTnVtUmVmZXJlbmNlcygwKSB7fQorICB+Q2FsbEdyYXBoTm9kZSgpIHsKKyAgICBhc3NlcnQoTnVtUmVmZXJlbmNlcyA9PSAwICYmICJOb2RlIGRlbGV0ZWQgd2hpbGUgcmVmZXJlbmNlcyByZW1haW4iKTsKKyAgfQorICAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQWNjZXNzb3IgbWV0aG9kcy4KKyAgLy8KKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPENhbGxSZWNvcmQ+OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDYWxsUmVjb3JkPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgLy8gZ2V0RnVuY3Rpb24gLSBSZXR1cm4gdGhlIGZ1bmN0aW9uIHRoYXQgdGhpcyBjYWxsIGdyYXBoIG5vZGUgcmVwcmVzZW50cy4KKyAgRnVuY3Rpb24gKmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gRjsgfQorCisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIENhbGxlZEZ1bmN0aW9ucy5iZWdpbigpOyB9CisgIGlubGluZSBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIENhbGxlZEZ1bmN0aW9ucy5lbmQoKTsgICB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIENhbGxlZEZ1bmN0aW9ucy5iZWdpbigpOyB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIENhbGxlZEZ1bmN0aW9ucy5lbmQoKTsgICB9CisgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQ2FsbGVkRnVuY3Rpb25zLmVtcHR5KCk7IH0KKyAgaW5saW5lIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpQ2FsbGVkRnVuY3Rpb25zLnNpemUoKTsgfQorCisgIC8vLyBnZXROdW1SZWZlcmVuY2VzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2Ygb3RoZXIgQ2FsbEdyYXBoTm9kZXMgaW4gdGhpcworICAvLy8gQ2FsbEdyYXBoIHRoYXQgcmVmZXJlbmNlIHRoaXMgbm9kZSBpbiB0aGVpciBjYWxsZWUgbGlzdC4KKyAgdW5zaWduZWQgZ2V0TnVtUmVmZXJlbmNlcygpIGNvbnN0IHsgcmV0dXJuIE51bVJlZmVyZW5jZXM7IH0KKyAgCisgIC8vIFN1YnNjcmlwdGluZyBvcGVyYXRvciAtIFJldHVybiB0aGUgaSd0aCBjYWxsZWQgZnVuY3Rpb24uCisgIC8vCisgIENhbGxHcmFwaE5vZGUgKm9wZXJhdG9yW10odW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgQ2FsbGVkRnVuY3Rpb25zLnNpemUoKSAmJiAiSW52YWxpZCBpbmRleCIpOworICAgIHJldHVybiBDYWxsZWRGdW5jdGlvbnNbaV0uc2Vjb25kOworICB9CisKKyAgLy8vIGR1bXAgLSBQcmludCBvdXQgdGhpcyBjYWxsIGdyYXBoIG5vZGUuCisgIC8vLworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1ldGhvZHMgdG8ga2VlcCBhIGNhbGwgZ3JhcGggdXAgdG8gZGF0ZSB3aXRoIGEgZnVuY3Rpb24gdGhhdCBoYXMgYmVlbgorICAvLyBtb2RpZmllZAorICAvLworCisgIC8vLyByZW1vdmVBbGxDYWxsZWRGdW5jdGlvbnMgLSBBcyB0aGUgbmFtZSBpbXBsaWVzLCB0aGlzIHJlbW92ZXMgYWxsIGVkZ2VzCisgIC8vLyBmcm9tIHRoaXMgQ2FsbEdyYXBoTm9kZSB0byBhbnkgZnVuY3Rpb25zIGl0IGNhbGxzLgorICB2b2lkIHJlbW92ZUFsbENhbGxlZEZ1bmN0aW9ucygpIHsKKyAgICB3aGlsZSAoIUNhbGxlZEZ1bmN0aW9ucy5lbXB0eSgpKSB7CisgICAgICBDYWxsZWRGdW5jdGlvbnMuYmFjaygpLnNlY29uZC0+RHJvcFJlZigpOworICAgICAgQ2FsbGVkRnVuY3Rpb25zLnBvcF9iYWNrKCk7CisgICAgfQorICB9CisgIAorICAvLy8gc3RlYWxDYWxsZWRGdW5jdGlvbnNGcm9tIC0gTW92ZSBhbGwgdGhlIGNhbGxlZSBpbmZvcm1hdGlvbiBmcm9tIE4gdG8gdGhpcworICAvLy8gbm9kZS4KKyAgdm9pZCBzdGVhbENhbGxlZEZ1bmN0aW9uc0Zyb20oQ2FsbEdyYXBoTm9kZSAqTikgeworICAgIGFzc2VydChDYWxsZWRGdW5jdGlvbnMuZW1wdHkoKSAmJgorICAgICAgICAgICAiQ2Fubm90IHN0ZWFsIGNhbGxzaXRlIGluZm9ybWF0aW9uIGlmIEkgYWxyZWFkeSBoYXZlIHNvbWUiKTsKKyAgICBzdGQ6OnN3YXAoQ2FsbGVkRnVuY3Rpb25zLCBOLT5DYWxsZWRGdW5jdGlvbnMpOworICB9CisgIAorCisgIC8vLyBhZGRDYWxsZWRGdW5jdGlvbiAtIEFkZCBhIGZ1bmN0aW9uIHRvIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhpcworICAvLy8gb25lLgorICB2b2lkIGFkZENhbGxlZEZ1bmN0aW9uKENhbGxTaXRlIENTLCBDYWxsR3JhcGhOb2RlICpNKSB7CisgICAgQ2FsbGVkRnVuY3Rpb25zLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihDUy5nZXRJbnN0cnVjdGlvbigpLCBNKSk7CisgICAgTS0+QWRkUmVmKCk7CisgIH0KKworICB2b2lkIHJlbW92ZUNhbGxFZGdlKGl0ZXJhdG9yIEkpIHsKKyAgICBJLT5zZWNvbmQtPkRyb3BSZWYoKTsKKyAgICAqSSA9IENhbGxlZEZ1bmN0aW9ucy5iYWNrKCk7CisgICAgQ2FsbGVkRnVuY3Rpb25zLnBvcF9iYWNrKCk7CisgIH0KKyAgCisgIAorICAvLy8gcmVtb3ZlQ2FsbEVkZ2VGb3IgLSBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBlZGdlIGluIHRoZSBub2RlIGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCBjYWxsIHNpdGUuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgdGFrZXMgbGluZWFyIHRpbWUsIHNvIGl0CisgIC8vLyBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCisgIHZvaWQgcmVtb3ZlQ2FsbEVkZ2VGb3IoQ2FsbFNpdGUgQ1MpOworCisgIC8vLyByZW1vdmVBbnlDYWxsRWRnZVRvIC0gVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgY2FsbCBlZGdlcyBmcm9tIHRoaXMgbm9kZQorICAvLy8gdG8gdGhlIHNwZWNpZmllZCBjYWxsZWUgZnVuY3Rpb24uICBUaGlzIHRha2VzIG1vcmUgdGltZSB0byBleGVjdXRlIHRoYW4KKyAgLy8vIHJlbW92ZUNhbGxFZGdlVG8sIHNvIGl0IHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgbmVjZXNzYXJ5LgorICB2b2lkIHJlbW92ZUFueUNhbGxFZGdlVG8oQ2FsbEdyYXBoTm9kZSAqQ2FsbGVlKTsKKworICAvLy8gcmVtb3ZlT25lQWJzdHJhY3RFZGdlVG8gLSBSZW1vdmUgb25lIGVkZ2UgYXNzb2NpYXRlZCB3aXRoIGEgbnVsbCBjYWxsc2l0ZQorICAvLy8gZnJvbSB0aGlzIG5vZGUgdG8gdGhlIHNwZWNpZmllZCBjYWxsZWUgZnVuY3Rpb24uCisgIHZvaWQgcmVtb3ZlT25lQWJzdHJhY3RFZGdlVG8oQ2FsbEdyYXBoTm9kZSAqQ2FsbGVlKTsKKyAgCisgIC8vLyByZXBsYWNlQ2FsbEVkZ2UgLSBUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgZWRnZSBpbiB0aGUgbm9kZSBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgY2FsbCBzaXRlIHdpdGggYSBuZXcgb25lLiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHRha2VzIGxpbmVhcgorICAvLy8gdGltZSwgc28gaXQgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgorICB2b2lkIHJlcGxhY2VDYWxsRWRnZShDYWxsU2l0ZSBDUywgQ2FsbFNpdGUgTmV3Q1MsIENhbGxHcmFwaE5vZGUgKk5ld05vZGUpOworICAKKyAgLy8vIGFsbFJlZmVyZW5jZXNEcm9wcGVkIC0gVGhpcyBpcyBhIHNwZWNpYWwgZnVuY3Rpb24gdGhhdCBzaG91bGQgb25seSBiZQorICAvLy8gdXNlZCBieSB0aGUgQ2FsbEdyYXBoIGNsYXNzLgorICB2b2lkIGFsbFJlZmVyZW5jZXNEcm9wcGVkKCkgeworICAgIE51bVJlZmVyZW5jZXMgPSAwOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb25zIGZvciBjYWxsIGdyYXBocyBzbyB0aGF0IHRoZXkgY2FuIGJlIHRyZWF0ZWQgYXMKKy8vIGdyYXBocyBieSB0aGUgZ2VuZXJpYyBncmFwaCBhbGdvcml0aG1zLgorLy8KKworLy8gUHJvdmlkZSBncmFwaCB0cmFpdHMgZm9yIHRyYW52ZXJzaW5nIGNhbGwgZ3JhcGhzIHVzaW5nIHN0YW5kYXJkIGdyYXBoCisvLyB0cmF2ZXJzYWxzLgordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPENhbGxHcmFwaE5vZGUqPiB7CisgIHR5cGVkZWYgQ2FsbEdyYXBoTm9kZSBOb2RlVHlwZTsKKworICB0eXBlZGVmIENhbGxHcmFwaE5vZGU6OkNhbGxSZWNvcmQgQ0dOUGFpclR5OworICB0eXBlZGVmIHN0ZDo6cG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxDR05QYWlyVHksIENhbGxHcmFwaE5vZGUqPiBDR05EZXJlZkZ1bjsKKworICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShDYWxsR3JhcGhOb2RlICpDR04pIHsgcmV0dXJuIENHTjsgfQorCisgIHR5cGVkZWYgbWFwcGVkX2l0ZXJhdG9yPE5vZGVUeXBlOjppdGVyYXRvciwgQ0dORGVyZWZGdW4+IENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gbWFwX2l0ZXJhdG9yKE4tPmJlZ2luKCksIENHTkRlcmVmRnVuKENHTkRlcmVmKSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQgIChOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBtYXBfaXRlcmF0b3IoTi0+ZW5kKCksIENHTkRlcmVmRnVuKENHTkRlcmVmKSk7CisgIH0KKworICBzdGF0aWMgQ2FsbEdyYXBoTm9kZSAqQ0dORGVyZWYoQ0dOUGFpclR5IFApIHsKKyAgICByZXR1cm4gUC5zZWNvbmQ7CisgIH0KKworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IENhbGxHcmFwaE5vZGUqPiB7CisgIHR5cGVkZWYgY29uc3QgQ2FsbEdyYXBoTm9kZSBOb2RlVHlwZTsKKyAgdHlwZWRlZiBOb2RlVHlwZTo6Y29uc3RfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoY29uc3QgQ2FsbEdyYXBoTm9kZSAqQ0dOKSB7IHJldHVybiBDR047IH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSAqTikgeyByZXR1cm4gTi0+YmVnaW4oKTt9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kICAoTm9kZVR5cGUgKk4pIHsgcmV0dXJuIE4tPmVuZCgpOyB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBHcmFwaFRyYWl0czxDYWxsR3JhcGgqPiA6IHB1YmxpYyBHcmFwaFRyYWl0czxDYWxsR3JhcGhOb2RlKj4geworICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShDYWxsR3JhcGggKkNHTikgeworICAgIHJldHVybiBDR04tPmdldEV4dGVybmFsQ2FsbGluZ05vZGUoKTsgIC8vIFN0YXJ0IGF0IHRoZSBleHRlcm5hbCBub2RlIQorICB9CisgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IEZ1bmN0aW9uKiwgQ2FsbEdyYXBoTm9kZSo+IFBhaXJUeTsKKyAgdHlwZWRlZiBzdGQ6OnBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248UGFpclR5LCBDYWxsR3JhcGhOb2RlJj4gRGVyZWZGdW47CisKKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB0eXBlZGVmIG1hcHBlZF9pdGVyYXRvcjxDYWxsR3JhcGg6Oml0ZXJhdG9yLCBEZXJlZkZ1bj4gbm9kZXNfaXRlcmF0b3I7CisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihDYWxsR3JhcGggKkNHKSB7CisgICAgcmV0dXJuIG1hcF9pdGVyYXRvcihDRy0+YmVnaW4oKSwgRGVyZWZGdW4oQ0dkZXJlZmVyZW5jZSkpOworICB9CisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQgIChDYWxsR3JhcGggKkNHKSB7CisgICAgcmV0dXJuIG1hcF9pdGVyYXRvcihDRy0+ZW5kKCksIERlcmVmRnVuKENHZGVyZWZlcmVuY2UpKTsKKyAgfQorCisgIHN0YXRpYyBDYWxsR3JhcGhOb2RlICZDR2RlcmVmZXJlbmNlKFBhaXJUeSBQKSB7CisgICAgcmV0dXJuICpQLnNlY29uZDsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgQ2FsbEdyYXBoKj4gOgorICBwdWJsaWMgR3JhcGhUcmFpdHM8Y29uc3QgQ2FsbEdyYXBoTm9kZSo+IHsKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoY29uc3QgQ2FsbEdyYXBoICpDR04pIHsKKyAgICByZXR1cm4gQ0dOLT5nZXRFeHRlcm5hbENhbGxpbmdOb2RlKCk7CisgIH0KKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB0eXBlZGVmIENhbGxHcmFwaDo6Y29uc3RfaXRlcmF0b3Igbm9kZXNfaXRlcmF0b3I7CisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihjb25zdCBDYWxsR3JhcGggKkNHKSB7IHJldHVybiBDRy0+YmVnaW4oKTsgfQorICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kICAoY29uc3QgQ2FsbEdyYXBoICpDRykgeyByZXR1cm4gQ0ctPmVuZCgpOyB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisvLyBNYWtlIHN1cmUgdGhhdCBhbnkgY2xpZW50cyBvZiB0aGlzIGZpbGUgbGluayBpbiBDYWxsR3JhcGguY3BwCitGT1JDRV9ERUZJTklOR19GSUxFX1RPX0JFX0xJTktFRChDYWxsR3JhcGgpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhcHR1cmVUcmFja2luZy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhcHR1cmVUcmFja2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzkwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ2FwdHVyZVRyYWNraW5nLmgKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tLS0tLSBsbHZtL0FuYWx5c2lzL0NhcHR1cmVUcmFja2luZy5oIC0gUG9pbnRlciBjYXB0dXJlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdGhhdCBoZWxwIGRldGVybWluZSB3aGljaCBwb2ludGVycyBhcmUgY2FwdHVyZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NBUFRVUkVUUkFDS0lOR19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ0FQVFVSRVRSQUNLSU5HX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBWYWx1ZTsKKworICAvLy8gUG9pbnRlck1heUJlQ2FwdHVyZWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBvaW50ZXIgdmFsdWUgbWF5IGJlIGNhcHR1cmVkCisgIC8vLyBieSB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uICh3aGljaCBpcyByZXF1aXJlZCB0byBleGlzdCkuICBUaGlzIHJvdXRpbmUgY2FuCisgIC8vLyBiZSBleHBlbnNpdmUsIHNvIGNvbnNpZGVyIGNhY2hpbmcgdGhlIHJlc3VsdHMuICBUaGUgYm9vbGVhbiBSZXR1cm5DYXB0dXJlcworICAvLy8gc3BlY2lmaWVzIHdoZXRoZXIgcmV0dXJuaW5nIHRoZSB2YWx1ZSAob3IgcGFydCBvZiBpdCkgZnJvbSB0aGUgZnVuY3Rpb24KKyAgLy8vIGNvdW50cyBhcyBjYXB0dXJpbmcgaXQgb3Igbm90LiAgVGhlIGJvb2xlYW4gU3RvcmVDYXB0dXJlcyBzcGVjaWZpZWQKKyAgLy8vIHdoZXRoZXIgc3RvcmluZyB0aGUgdmFsdWUgKG9yIHBhcnQgb2YgaXQpIGludG8gbWVtb3J5IGFueXdoZXJlCisgIC8vLyBhdXRvbWF0aWNhbGx5IGNvdW50cyBhcyBjYXB0dXJpbmcgaXQgb3Igbm90LgorICBib29sIFBvaW50ZXJNYXlCZUNhcHR1cmVkKGNvbnN0IFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmV0dXJuQ2FwdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTdG9yZUNhcHR1cmVzKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ29kZU1ldHJpY3MuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Db2RlTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDk2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ29kZU1ldHJpY3MuaApAQCAtMCwwICsxLDcyIEBACisvLz09PS0gQ29kZU1ldHJpY3MuaCAtIE1lYXN1cmVzIHRoZSB3ZWlnaHQgb2YgYSBmdW5jdGlvbi0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHZhcmlvdXMgd2VpZ2h0IG1lYXN1cmVtZW50cyBmb3IgYSBmdW5jdGlvbiwgaGVscGluZworLy8gdGhlIElubGluZXIgYW5kIFBhcnRpYWxTcGVjaWFsaXphdGlvbiBkZWNpZGUgd2hldGhlciB0byBkdXBsaWNhdGUgaXRzCisvLyBjb250ZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ09ERU1FVFJJQ1NfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NPREVNRVRSSUNTX0gKKworbmFtZXNwYWNlIGxsdm0geworICAvLyBDb2RlTWV0cmljcyAtIENhbGN1bGF0ZSBzaXplIGFuZCBhIGZldyBzaW1pbGFyIG1ldHJpY3MgZm9yIGEgc2V0IG9mCisgIC8vIGJhc2ljIGJsb2Nrcy4KKyAgc3RydWN0IENvZGVNZXRyaWNzIHsKKyAgICAvLy8gTmV2ZXJJbmxpbmUgLSBUcnVlIGlmIHRoaXMgY2FsbGVlIHNob3VsZCBuZXZlciBiZSBpbmxpbmVkIGludG8gYQorICAgIC8vLyBjYWxsZXIuCisgICAgLy8gYm9vbCBOZXZlcklubGluZTsKKworICAgIC8vIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBjb250YWlucyBhIGNhbGwgdG8gc2V0am1wIG9yIF9zZXRqbXAKKyAgICBib29sIGNhbGxzU2V0Sm1wOworCisgICAgLy8gVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGNhbGxzIGl0c2VsZgorICAgIGJvb2wgaXNSZWN1cnNpdmU7CisKKyAgICAvLyBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gY29udGFpbnMgb25lIG9yIG1vcmUgaW5kaXJlY3QgYnJhbmNoZXMKKyAgICBib29sIGNvbnRhaW5zSW5kaXJlY3RCcjsKKworICAgIC8vLyB1c2VzRHluYW1pY0FsbG9jYSAtIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxscyBhbGxvY2EgKGluIHRoZSBDIHNlbnNlKS4KKyAgICBib29sIHVzZXNEeW5hbWljQWxsb2NhOworCisgICAgLy8vIE51bUluc3RzLCBOdW1CbG9ja3MgLSBLZWVwIHRyYWNrIG9mIGhvdyBsYXJnZSBlYWNoIGZ1bmN0aW9uIGlzLCB3aGljaAorICAgIC8vLyBpcyB1c2VkIHRvIGVzdGltYXRlIHRoZSBjb2RlIHNpemUgY29zdCBvZiBpbmxpbmluZyBpdC4KKyAgICB1bnNpZ25lZCBOdW1JbnN0cywgTnVtQmxvY2tzOworCisgICAgLy8vIE51bUJCSW5zdHMgLSBLZWVwcyB0cmFjayBvZiBiYXNpYyBibG9jayBjb2RlIHNpemUgZXN0aW1hdGVzLgorICAgIERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sgKiwgdW5zaWduZWQ+IE51bUJCSW5zdHM7CisKKyAgICAvLy8gTnVtQ2FsbHMgLSBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gJ2JpZycgZnVuY3Rpb25zLgorICAgIHVuc2lnbmVkIE51bUNhbGxzOworCisgICAgLy8vIE51bVZlY3Rvckluc3RzIC0gS2VlcCB0cmFjayBvZiBob3cgbWFueSBpbnN0cnVjdGlvbnMgcHJvZHVjZSB2ZWN0b3IKKyAgICAvLy8gdmFsdWVzLiAgVGhlIGlubGluZXIgaXMgYmVpbmcgbW9yZSBhZ2dyZXNzaXZlIHdpdGggaW5saW5pbmcgdmVjdG9yCisgICAgLy8vIGtlcm5lbHMuCisgICAgdW5zaWduZWQgTnVtVmVjdG9ySW5zdHM7CisKKyAgICAvLy8gTnVtUmV0cyAtIEtlZXAgdHJhY2sgb2YgaG93IG1hbnkgUmV0IGluc3RydWN0aW9ucyB0aGUgYmxvY2sgY29udGFpbnMuCisgICAgdW5zaWduZWQgTnVtUmV0czsKKworICAgIENvZGVNZXRyaWNzKCkgOiBjYWxsc1NldEptcChmYWxzZSksIGlzUmVjdXJzaXZlKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbnNJbmRpcmVjdEJyKGZhbHNlKSwgdXNlc0R5bmFtaWNBbGxvY2EoZmFsc2UpLCAKKyAgICAgICAgICAgICAgICAgICAgTnVtSW5zdHMoMCksIE51bUJsb2NrcygwKSwgTnVtQ2FsbHMoMCksIE51bVZlY3Rvckluc3RzKDApLCAKKyAgICAgICAgICAgICAgICAgICAgTnVtUmV0cygwKSB7fQorCisgICAgLy8vIGFuYWx5emVCYXNpY0Jsb2NrIC0gQWRkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sKKyAgICAvLy8gdG8gdGhlIGN1cnJlbnQgc3RydWN0dXJlLgorICAgIHZvaWQgYW5hbHl6ZUJhc2ljQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpOworCisgICAgLy8vIGFuYWx5emVGdW5jdGlvbiAtIEFkZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uCisgICAgLy8vIHRvIHRoZSBjdXJyZW50IHN0cnVjdHVyZS4KKyAgICB2b2lkIGFuYWx5emVGdW5jdGlvbihGdW5jdGlvbiAqRik7CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNjc1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmgKQEAgLTAsMCArMSw4MSBAQAorLy89PT0tLSBDb25zdGFudEZvbGRpbmcuaCAtIEZvbGQgaW5zdHJ1Y3Rpb25zIGludG8gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgcm91dGluZXMgZm9yIGZvbGRpbmcgaW5zdHJ1Y3Rpb25zIGludG8gY29uc3RhbnRzLgorLy8KKy8vIEFsc28sIHRvIHN1cHBsZW1lbnQgdGhlIGJhc2ljIFZNQ29yZSBDb25zdGFudEV4cHIgc2ltcGxpZmljYXRpb25zLAorLy8gdGhpcyBmaWxlIGRlY2xhcmVzIHNvbWUgYWRkaXRpb25hbCBmb2xkaW5nIHJvdXRpbmVzIHRoYXQgY2FuIG1ha2UgdXNlIG9mCisvLyBUYXJnZXREYXRhIGluZm9ybWF0aW9uLiBUaGVzZSBmdW5jdGlvbnMgY2Fubm90IGdvIGluIFZNQ29yZSBkdWUgdG8gbGlicmFyeQorLy8gZGVwZW5kZW5jeSBpc3N1ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NPTlNUQU5URk9MRElOR19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ09OU1RBTlRGT0xESU5HX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBDb25zdGFudDsKKyAgY2xhc3MgQ29uc3RhbnRFeHByOworICBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgY2xhc3MgVGFyZ2V0RGF0YTsKKyAgY2xhc3MgRnVuY3Rpb247CisgIGNsYXNzIFR5cGU7CisKKy8vLyBDb25zdGFudEZvbGRJbnN0cnVjdGlvbiAtIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCB0aGUgc3BlY2lmaWVkCisvLy8gaW5zdHJ1Y3Rpb24uICBJZiBzdWNjZXNzZnVsLCB0aGUgY29uc3RhbnQgcmVzdWx0IGlzIHJldHVybmVkLCBpZiBub3QsIG51bGwKKy8vLyBpcyByZXR1cm5lZC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGZhaWwgd2hlbiBhdHRlbXB0aW5nIHRvIGZvbGQKKy8vLyBpbnN0cnVjdGlvbnMgbGlrZSBsb2FkcyBhbmQgc3RvcmVzLCB3aGljaCBoYXZlIG5vIGNvbnN0YW50IGV4cHJlc3Npb24gZm9ybS4KKy8vLworQ29uc3RhbnQgKkNvbnN0YW50Rm9sZEluc3RydWN0aW9uKEluc3RydWN0aW9uICpJLCBjb25zdCBUYXJnZXREYXRhICpURCA9IDApOworCisvLy8gQ29uc3RhbnRGb2xkQ29uc3RhbnRFeHByZXNzaW9uIC0gQXR0ZW1wdCB0byBmb2xkIHRoZSBjb25zdGFudCBleHByZXNzaW9uCisvLy8gdXNpbmcgdGhlIHNwZWNpZmllZCBUYXJnZXREYXRhLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGNvbnN0YW50IHJlc3VsdCBpcworLy8vIHJlc3VsdCBpcyByZXR1cm5lZCwgaWYgbm90LCBudWxsIGlzIHJldHVybmVkLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZENvbnN0YW50RXhwcmVzc2lvbihjb25zdCBDb25zdGFudEV4cHIgKkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCA9IDApOworCisvLy8gQ29uc3RhbnRGb2xkSW5zdE9wZXJhbmRzIC0gQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGFuIGluc3RydWN0aW9uIHdpdGggdGhlCisvLy8gc3BlY2lmaWVkIG9wZXJhbmRzLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGNvbnN0YW50IHJlc3VsdCBpcyByZXR1cm5lZCwgaWYgbm90LAorLy8vIG51bGwgaXMgcmV0dXJuZWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gZmFpbCB3aGVuIGF0dGVtcHRpbmcgdG8gCisvLy8gZm9sZCBpbnN0cnVjdGlvbnMgbGlrZSBsb2FkcyBhbmQgc3RvcmVzLCB3aGljaCBoYXZlIG5vIGNvbnN0YW50IGV4cHJlc3Npb24gCisvLy8gZm9ybS4KKy8vLworQ29uc3RhbnQgKkNvbnN0YW50Rm9sZEluc3RPcGVyYW5kcyh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKmNvbnN0ICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSAwKTsKKworLy8vIENvbnN0YW50Rm9sZENvbXBhcmVJbnN0T3BlcmFuZHMgLSBBdHRlbXB0IHRvIGNvbnN0YW50IGZvbGQgYSBjb21wYXJlCisvLy8gaW5zdHJ1Y3Rpb24gKGljbXAvZmNtcCkgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzLiAgSWYgaXQgZmFpbHMsIGl0CisvLy8gcmV0dXJucyBhIGNvbnN0YW50IGV4cHJlc3Npb24gb2YgdGhlIHNwZWNpZmllZCBvcGVyYW5kcy4KKy8vLworQ29uc3RhbnQgKkNvbnN0YW50Rm9sZENvbXBhcmVJbnN0T3BlcmFuZHModW5zaWduZWQgUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREID0gMCk7CisKKy8vLyBDb25zdGFudEZvbGRMb2FkRnJvbUNvbnN0UHRyIC0gUmV0dXJuIHRoZSB2YWx1ZSB0aGF0IGEgbG9hZCBmcm9tIEMgd291bGQKKy8vLyBwcm9kdWNlIGlmIGl0IGlzIGNvbnN0YW50IGFuZCBkZXRlcm1pbmFibGUuICBJZiB0aGlzIGlzIG5vdCBkZXRlcm1pbmFibGUsCisvLy8gcmV0dXJuIG51bGwuCitDb25zdGFudCAqQ29uc3RhbnRGb2xkTG9hZEZyb21Db25zdFB0cihDb25zdGFudCAqQywgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSAwKTsKKworLy8vIENvbnN0YW50Rm9sZExvYWRUaHJvdWdoR0VQQ29uc3RhbnRFeHByIC0gR2l2ZW4gYSBjb25zdGFudCBhbmQgYQorLy8vIGdldGVsZW1lbnRwdHIgY29uc3RhbnRleHByLCByZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlIGJlaW5nIGFkZHJlc3NlZCBieSB0aGUKKy8vLyBjb25zdGFudCBleHByZXNzaW9uLCBvciBudWxsIGlmIHNvbWV0aGluZyBpcyBmdW5ueSBhbmQgd2UgY2FuJ3QgZGVjaWRlLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZExvYWRUaHJvdWdoR0VQQ29uc3RhbnRFeHByKENvbnN0YW50ICpDLCBDb25zdGFudEV4cHIgKkNFKTsKKyAgCisvLy8gY2FuQ29uc3RhbnRGb2xkQ2FsbFRvIC0gUmV0dXJuIHRydWUgaWYgaXRzIGV2ZW4gcG9zc2libGUgdG8gZm9sZCBhIGNhbGwgdG8KKy8vLyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLgorYm9vbCBjYW5Db25zdGFudEZvbGRDYWxsVG8oY29uc3QgRnVuY3Rpb24gKkYpOworCisvLy8gQ29uc3RhbnRGb2xkQ2FsbCAtIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhIGNhbGwgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbgorLy8vIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMsIHJldHVybmluZyBudWxsIGlmIHVuc3VjY2Vzc2Z1bC4KK0NvbnN0YW50ICoKK0NvbnN0YW50Rm9sZENhbGwoRnVuY3Rpb24gKkYsIENvbnN0YW50ICpjb25zdCAqT3BlcmFuZHMsIHVuc2lnbmVkIE51bU9wZXJhbmRzKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ29uc3RhbnRzU2Nhbm5lci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NvbnN0YW50c1NjYW5uZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGFmNjhkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NvbnN0YW50c1NjYW5uZXIuaApAQCAtMCwwICsxLDkzIEBACisvLz09LSBsbHZtL0FuYWx5c2lzL0NvbnN0YW50c1NjYW5uZXIuaCAtIEl0ZXJhdGUgb3ZlciBjb25zdGFudHMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBpdGVyYXRvciB0byB3YWxrIHRocm91Z2ggdGhlIGNvbnN0YW50cyByZWZlcmVuY2VkIGJ5CisvLyBhIG1ldGhvZC4gIFRoaXMgaXMgdXNlZCBieSB0aGUgQml0Y29kZSAmIEFzc2VtYmx5IHdyaXRlcnMgdG8gYnVpbGQgY29uc3RhbnQKKy8vIHBvb2xzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DT05TVEFOVFNTQ0FOTkVSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DT05TVEFOVFNTQ0FOTkVSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9JbnN0SXRlcmF0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb25zdGFudDsKKworY2xhc3MgY29uc3RhbnRfaXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudCwgcHRyZGlmZl90PiB7CisgIGNvbnN0X2luc3RfaXRlcmF0b3IgSW5zdEk7ICAgICAgICAgICAgICAgIC8vIE1ldGhvZCBpbnN0cnVjdGlvbiBpdGVyYXRvcgorICB1bnNpZ25lZCBPcElkeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVyYW5kIGluZGV4CisKKyAgdHlwZWRlZiBjb25zdGFudF9pdGVyYXRvciBfU2VsZjsKKworICBpbmxpbmUgYm9vbCBpc0F0Q29uc3RhbnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFJbnN0SS5hdEVuZCgpICYmIE9wSWR4IDwgSW5zdEktPmdldE51bU9wZXJhbmRzKCkgJiYKKyAgICAgICAgICAgImlzQXRDb25zdGFudCBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cyEiKTsKKyAgICByZXR1cm4gaXNhPENvbnN0YW50PihJbnN0SS0+Z2V0T3BlcmFuZChPcElkeCkpOworICB9CisKK3B1YmxpYzoKKyAgaW5saW5lIGNvbnN0YW50X2l0ZXJhdG9yKGNvbnN0IEZ1bmN0aW9uICpGKSA6IEluc3RJKGluc3RfYmVnaW4oRikpLCBPcElkeCgwKSB7CisgICAgLy8gQWR2YW5jZSB0byBmaXJzdCBjb25zdGFudC4uLiBpZiB3ZSBhcmUgbm90IGFscmVhZHkgYXQgY29uc3RhbnQgb3IgZW5kCisgICAgaWYgKEluc3RJICE9IGluc3RfZW5kKEYpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc3RJIGlzIHZhbGlkPworICAgICAgICAoSW5zdEktPmdldE51bU9wZXJhbmRzKCkgPT0gMCB8fCAhaXNBdENvbnN0YW50KCkpKSAvLyBOb3QgYXQgY29uc3RhbnQ/CisgICAgICBvcGVyYXRvcisrKCk7CisgIH0KKworICBpbmxpbmUgY29uc3RhbnRfaXRlcmF0b3IoY29uc3QgRnVuY3Rpb24gKkYsIGJvb2wpICAgLy8gZW5kIGN0b3IKKyAgICA6IEluc3RJKGluc3RfZW5kKEYpKSwgT3BJZHgoMCkgeworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfU2VsZiYgeCkgY29uc3QgeyByZXR1cm4gT3BJZHggPT0geC5PcElkeCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0SSA9PSB4Lkluc3RJOyB9CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgX1NlbGYmIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgaW5saW5lIHBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChpc0F0Q29uc3RhbnQoKSAmJiAiRGVyZWZlcmVuY2VkIGFuIGl0ZXJhdG9yIGF0IHRoZSBlbmQhIik7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnQ+KEluc3RJLT5nZXRPcGVyYW5kKE9wSWR4KSk7CisgIH0KKyAgaW5saW5lIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisKKyAgaW5saW5lIF9TZWxmJiBvcGVyYXRvcisrKCkgeyAgIC8vIFByZWluY3JlbWVudCBpbXBsZW1lbnRhdGlvbgorICAgICsrT3BJZHg7CisgICAgZG8geworICAgICAgdW5zaWduZWQgTnVtT3BlcmFuZHMgPSBJbnN0SS0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgIHdoaWxlIChPcElkeCA8IE51bU9wZXJhbmRzICYmICFpc0F0Q29uc3RhbnQoKSkgeworICAgICAgICArK09wSWR4OworICAgICAgfQorCisgICAgICBpZiAoT3BJZHggPCBOdW1PcGVyYW5kcykgcmV0dXJuICp0aGlzOyAgLy8gRm91bmQgYSBjb25zdGFudCEKKyAgICAgICsrSW5zdEk7CisgICAgICBPcElkeCA9IDA7CisgICAgfSB3aGlsZSAoIUluc3RJLmF0RW5kKCkpOworCisgICAgcmV0dXJuICp0aGlzOyAgLy8gQXQgdGhlIGVuZCBvZiB0aGUgbWV0aG9kCisgIH0KKworICBpbmxpbmUgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgIF9TZWxmIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9CisKKyAgaW5saW5lIGJvb2wgYXRFbmQoKSBjb25zdCB7IHJldHVybiBJbnN0SS5hdEVuZCgpOyB9Cit9OworCitpbmxpbmUgY29uc3RhbnRfaXRlcmF0b3IgY29uc3RhbnRfYmVnaW4oY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgcmV0dXJuIGNvbnN0YW50X2l0ZXJhdG9yKEYpOworfQorCitpbmxpbmUgY29uc3RhbnRfaXRlcmF0b3IgY29uc3RhbnRfZW5kKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIHJldHVybiBjb25zdGFudF9pdGVyYXRvcihGLCB0cnVlKTsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRE9UR3JhcGhUcmFpdHNQYXNzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRE9UR3JhcGhUcmFpdHNQYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkYWY1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9ET1RHcmFwaFRyYWl0c1Bhc3MuaApAQCAtMCwwICsxLDgzIEBACisvLz09PS0tIERPVEdyYXBoVHJhaXRzUGFzcy5oIC0gUHJpbnQvVmlldyBkb3R0eSBncmFwaHMtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRlbXBsYXRlcyB0byBjcmVhdGUgZG90dHkgdmlld2VyIGFuZCBwcmludGVyIHBhc3NlcyBmb3IgR3JhcGhUcmFpdHMgZ3JhcGhzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19ET1RfR1JBUEhUUkFJVFNfUEFTU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfRE9UX0dSQVBIVFJBSVRTX1BBU1NfSAorCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DRkdQcmludGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDxjbGFzcyBBbmFseXNpcywgYm9vbCBTaW1wbGU+CitzdHJ1Y3QgRE9UR3JhcGhUcmFpdHNWaWV3ZXIgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKworICBET1RHcmFwaFRyYWl0c1ZpZXdlcihzdGQ6OnN0cmluZyBHcmFwaE5hbWUsIGNoYXIgJklEKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgIE5hbWUgPSBHcmFwaE5hbWU7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICAgIEFuYWx5c2lzICpHcmFwaDsKKyAgICBzdGQ6OnN0cmluZyBUaXRsZSwgR3JhcGhOYW1lOworICAgIEdyYXBoID0gJmdldEFuYWx5c2lzPEFuYWx5c2lzPigpOworICAgIEdyYXBoTmFtZSA9IERPVEdyYXBoVHJhaXRzPEFuYWx5c2lzKj46OmdldEdyYXBoTmFtZShHcmFwaCk7CisgICAgVGl0bGUgPSBHcmFwaE5hbWUgKyAiIGZvciAnIiArIEYuZ2V0TmFtZVN0cigpICsgIicgZnVuY3Rpb24iOworICAgIFZpZXdHcmFwaChHcmFwaCwgTmFtZSwgU2ltcGxlLCBUaXRsZSk7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICAgIEFVLmFkZFJlcXVpcmVkPEFuYWx5c2lzPigpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQW5hbHlzaXMsIGJvb2wgU2ltcGxlPgorc3RydWN0IERPVEdyYXBoVHJhaXRzUHJpbnRlciA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworCisgIHN0ZDo6c3RyaW5nIE5hbWU7CisKKyAgRE9UR3JhcGhUcmFpdHNQcmludGVyKHN0ZDo6c3RyaW5nIEdyYXBoTmFtZSwgY2hhciAmSUQpCisgICAgOiBGdW5jdGlvblBhc3MoSUQpIHsKKyAgICBOYW1lID0gR3JhcGhOYW1lOworICB9CisKKyAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgICBBbmFseXNpcyAqR3JhcGg7CisgICAgc3RkOjpzdHJpbmcgRmlsZW5hbWUgPSBOYW1lICsgIi4iICsgRi5nZXROYW1lU3RyKCkgKyAiLmRvdCI7CisgICAgZXJycygpIDw8ICJXcml0aW5nICciIDw8IEZpbGVuYW1lIDw8ICInLi4uIjsKKworICAgIHN0ZDo6c3RyaW5nIEVycm9ySW5mbzsKKyAgICByYXdfZmRfb3N0cmVhbSBGaWxlKEZpbGVuYW1lLmNfc3RyKCksIEVycm9ySW5mbyk7CisgICAgR3JhcGggPSAmZ2V0QW5hbHlzaXM8QW5hbHlzaXM+KCk7CisKKyAgICBzdGQ6OnN0cmluZyBUaXRsZSwgR3JhcGhOYW1lOworICAgIEdyYXBoTmFtZSA9IERPVEdyYXBoVHJhaXRzPEFuYWx5c2lzKj46OmdldEdyYXBoTmFtZShHcmFwaCk7CisgICAgVGl0bGUgPSBHcmFwaE5hbWUgKyAiIGZvciAnIiArIEYuZ2V0TmFtZVN0cigpICsgIicgZnVuY3Rpb24iOworCisgICAgaWYgKEVycm9ySW5mby5lbXB0eSgpKQorICAgICAgV3JpdGVHcmFwaChGaWxlLCBHcmFwaCwgU2ltcGxlLCBOYW1lLCBUaXRsZSk7CisgICAgZWxzZQorICAgICAgZXJycygpIDw8ICIgIGVycm9yIG9wZW5pbmcgZmlsZSBmb3Igd3JpdGluZyEiOworICAgIGVycnMoKSA8PCAiXG4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgQVUuYWRkUmVxdWlyZWQ8QW5hbHlzaXM+KCk7CisgIH0KK307Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVjNDgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RlYnVnSW5mby5oCkBAIC0wLDAgKzEsODI3IEBACisvLz09PS0tLSBsbHZtL0FuYWx5c2lzL0RlYnVnSW5mby5oIC0gRGVidWcgSW5mb3JtYXRpb24gSGVscGVycyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgYnVuY2ggb2YgZGF0YXR5cGVzIHRoYXQgYXJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgYW5kCisvLyB3YWxraW5nIGRlYnVnIGluZm8gaW4gTExWTSBJUiBmb3JtLiBUaGV5IGVzc2VudGlhbGx5IHByb3ZpZGUgd3JhcHBlcnMgYXJvdW5kCisvLyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCdzIG5lZWRlZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUKKy8vIERXQVJGIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19ERUJVR0lORk9fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0RFQlVHSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0R3YXJmLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQmFzaWNCbG9jazsKKyAgY2xhc3MgQ29uc3RhbnQ7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBHbG9iYWxWYXJpYWJsZTsKKyAgY2xhc3MgTW9kdWxlOworICBjbGFzcyBUeXBlOworICBjbGFzcyBWYWx1ZTsKKyAgY2xhc3MgSW5zdHJ1Y3Rpb247CisgIGNsYXNzIE1ETm9kZTsKKyAgY2xhc3MgTExWTUNvbnRleHQ7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIGNsYXNzIERJRmlsZTsKKyAgY2xhc3MgRElTdWJwcm9ncmFtOworICBjbGFzcyBESUxleGljYWxCbG9jazsKKyAgY2xhc3MgRElWYXJpYWJsZTsKKyAgY2xhc3MgRElUeXBlOworCisgIC8vLyBESURlc2NyaXB0b3IgLSBBIHRoaW4gd3JhcGVyIGFyb3VuZCBNRE5vZGUgdG8gYWNjZXNzIGVuY29kZWQgZGVidWcgaW5mby4KKyAgLy8vIFRoaXMgc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW4gYSBjb250YWluZXIsIGJlY2F1c2UgdW5kZXJseSBNRE5vZGUgbWF5CisgIC8vLyBjaGFuZ2UgaW4gY2VydGFpbiBzaXR1YXRpb25zLgorICBjbGFzcyBESURlc2NyaXB0b3IgeworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgTUROb2RlICpEYmdOb2RlOworCisgICAgU3RyaW5nUmVmIGdldFN0cmluZ0ZpZWxkKHVuc2lnbmVkIEVsdCkgY29uc3Q7CisgICAgdW5zaWduZWQgZ2V0VW5zaWduZWRGaWVsZCh1bnNpZ25lZCBFbHQpIGNvbnN0IHsKKyAgICAgIHJldHVybiAodW5zaWduZWQpZ2V0VUludDY0RmllbGQoRWx0KTsKKyAgICB9CisgICAgdWludDY0X3QgZ2V0VUludDY0RmllbGQodW5zaWduZWQgRWx0KSBjb25zdDsKKyAgICBESURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZpZWxkKHVuc2lnbmVkIEVsdCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY1R5PgorICAgIERlc2NUeSBnZXRGaWVsZEFzKHVuc2lnbmVkIEVsdCkgY29uc3QgeworICAgICAgcmV0dXJuIERlc2NUeShnZXREZXNjcmlwdG9yRmllbGQoRWx0KSk7CisgICAgfQorCisgICAgR2xvYmFsVmFyaWFibGUgKmdldEdsb2JhbFZhcmlhYmxlRmllbGQodW5zaWduZWQgRWx0KSBjb25zdDsKKyAgICBDb25zdGFudCAqZ2V0Q29uc3RhbnRGaWVsZCh1bnNpZ25lZCBFbHQpIGNvbnN0OworICAgIEZ1bmN0aW9uICpnZXRGdW5jdGlvbkZpZWxkKHVuc2lnbmVkIEVsdCkgY29uc3Q7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJRGVzY3JpcHRvcigpIDogRGJnTm9kZSgwKSB7fQorICAgIGV4cGxpY2l0IERJRGVzY3JpcHRvcihjb25zdCBNRE5vZGUgKk4pIDogRGJnTm9kZShOKSB7fQorICAgIGV4cGxpY2l0IERJRGVzY3JpcHRvcihjb25zdCBESUZpbGUgRik7CisgICAgZXhwbGljaXQgRElEZXNjcmlwdG9yKGNvbnN0IERJU3VicHJvZ3JhbSBGKTsKKyAgICBleHBsaWNpdCBESURlc2NyaXB0b3IoY29uc3QgRElMZXhpY2FsQmxvY2sgRik7CisgICAgZXhwbGljaXQgRElEZXNjcmlwdG9yKGNvbnN0IERJVmFyaWFibGUgRik7CisgICAgZXhwbGljaXQgRElEZXNjcmlwdG9yKGNvbnN0IERJVHlwZSBGKTsKKworICAgIGJvb2wgVmVyaWZ5KCkgY29uc3QgeyByZXR1cm4gRGJnTm9kZSAhPSAwOyB9CisKKyAgICBvcGVyYXRvciBNRE5vZGUgKigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8TUROb2RlKj4oRGJnTm9kZSk7IH0KKyAgICBNRE5vZGUgKm9wZXJhdG9yIC0+KCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxNRE5vZGUqPihEYmdOb2RlKTsgfQorCisgICAgdW5zaWduZWQgZ2V0VmVyc2lvbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRVbnNpZ25lZEZpZWxkKDApICYgTExWTURlYnVnVmVyc2lvbk1hc2s7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0VGFnKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoMCkgJiB+TExWTURlYnVnVmVyc2lvbk1hc2s7CisgICAgfQorCisgICAgLy8vIHByaW50IC0gcHJpbnQgZGVzY3JpcHRvci4KKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gZHVtcCAtIHByaW50IGRlc2NyaXB0b3IgdG8gZGJncygpIHdpdGggYSBuZXdsaW5lLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgYm9vbCBpc0Rlcml2ZWRUeXBlKCkgY29uc3Q7CisgICAgYm9vbCBpc0NvbXBvc2l0ZVR5cGUoKSBjb25zdDsKKyAgICBib29sIGlzQmFzaWNUeXBlKCkgY29uc3Q7CisgICAgYm9vbCBpc1ZhcmlhYmxlKCkgY29uc3Q7CisgICAgYm9vbCBpc1N1YnByb2dyYW0oKSBjb25zdDsKKyAgICBib29sIGlzR2xvYmFsVmFyaWFibGUoKSBjb25zdDsKKyAgICBib29sIGlzU2NvcGUoKSBjb25zdDsKKyAgICBib29sIGlzRmlsZSgpIGNvbnN0OworICAgIGJvb2wgaXNDb21waWxlVW5pdCgpIGNvbnN0OworICAgIGJvb2wgaXNOYW1lU3BhY2UoKSBjb25zdDsKKyAgICBib29sIGlzTGV4aWNhbEJsb2NrKCkgY29uc3Q7CisgICAgYm9vbCBpc1N1YnJhbmdlKCkgY29uc3Q7CisgICAgYm9vbCBpc0VudW1lcmF0b3IoKSBjb25zdDsKKyAgICBib29sIGlzVHlwZSgpIGNvbnN0OworICAgIGJvb2wgaXNHbG9iYWwoKSBjb25zdDsKKyAgfTsKKworICAvLy8gRElTdWJyYW5nZSAtIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgcmFuZ2VzLCBmb3IgYXJyYXkgYm91bmRzLgorICBjbGFzcyBESVN1YnJhbmdlIDogcHVibGljIERJRGVzY3JpcHRvciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBESVN1YnJhbmdlKGNvbnN0IE1ETm9kZSAqTiA9IDApIDogRElEZXNjcmlwdG9yKE4pIHt9CisKKyAgICBpbnQ2NF90IGdldExvKCkgY29uc3QgeyByZXR1cm4gKGludDY0X3QpZ2V0VUludDY0RmllbGQoMSk7IH0KKyAgICBpbnQ2NF90IGdldEhpKCkgY29uc3QgeyByZXR1cm4gKGludDY0X3QpZ2V0VUludDY0RmllbGQoMik7IH0KKyAgfTsKKworICAvLy8gRElBcnJheSAtIFRoaXMgZGVzY3JpcHRvciBob2xkcyBhbiBhcnJheSBvZiBkZXNjcmlwdG9ycy4KKyAgY2xhc3MgRElBcnJheSA6IHB1YmxpYyBESURlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRElBcnJheShjb25zdCBNRE5vZGUgKk4gPSAwKQorICAgICAgOiBESURlc2NyaXB0b3IoTikge30KKworICAgIHVuc2lnbmVkIGdldE51bUVsZW1lbnRzKCkgY29uc3Q7CisgICAgRElEZXNjcmlwdG9yIGdldEVsZW1lbnQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvckZpZWxkKElkeCk7CisgICAgfQorICB9OworCisgIC8vLyBESVNjb3BlIC0gQSBiYXNlIGNsYXNzIGZvciB2YXJpb3VzIHNjb3Blcy4KKyAgY2xhc3MgRElTY29wZSA6IHB1YmxpYyBESURlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRElTY29wZShjb25zdCBNRE5vZGUgKk4gPSAwKSA6IERJRGVzY3JpcHRvciAoTikge30KKyAgICB2aXJ0dWFsIH5ESVNjb3BlKCkge30KKworICAgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0OworICAgIFN0cmluZ1JlZiBnZXREaXJlY3RvcnkoKSBjb25zdDsKKyAgfTsKKworICAvLy8gRElDb21waWxlVW5pdCAtIEEgd3JhcHBlciBmb3IgYSBjb21waWxlIHVuaXQuCisgIGNsYXNzIERJQ29tcGlsZVVuaXQgOiBwdWJsaWMgRElTY29wZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBESUNvbXBpbGVVbml0KGNvbnN0IE1ETm9kZSAqTiA9IDApIDogRElTY29wZShOKSB7fQorCisgICAgdW5zaWduZWQgZ2V0TGFuZ3VhZ2UoKSBjb25zdCAgIHsgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoMik7IH0KKyAgICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdCAgeyByZXR1cm4gZ2V0U3RyaW5nRmllbGQoMyk7ICAgfQorICAgIFN0cmluZ1JlZiBnZXREaXJlY3RvcnkoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdGaWVsZCg0KTsgICB9CisgICAgU3RyaW5nUmVmIGdldFByb2R1Y2VyKCkgY29uc3QgIHsgcmV0dXJuIGdldFN0cmluZ0ZpZWxkKDUpOyAgIH0KKworICAgIC8vLyBpc01haW4gLSBFYWNoIGlucHV0IGZpbGUgaXMgZW5jb2RlZCBhcyBhIHNlcGFyYXRlIGNvbXBpbGUgdW5pdCBpbiBMTFZNCisgICAgLy8vIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvdXRwdXQuIEhvd2V2ZXIsIG1hbnkgdGFyZ2V0IHNwZWNpZmljIHRvb2wgY2hhaW5zCisgICAgLy8vIHByZWZlciB0byBlbmNvZGUgb25seSBvbmUgY29tcGlsZSB1bml0IGluIGFuIG9iamVjdCBmaWxlLiBJbiB0aGlzCisgICAgLy8vIHNpdHVhdGlvbiwgdGhlIExMVk0gY29kZSBnZW5lcmF0b3Igd2lsbCBpbmNsdWRlICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKyAgICAvLy8gZW50aXRpZXMgaW4gdGhlIGNvbXBpbGUgdW5pdCB0aGF0IGlzIG1hcmtlZCBhcyBtYWluIGNvbXBpbGUgdW5pdC4gVGhlCisgICAgLy8vIGNvZGUgZ2VuZXJhdG9yIGFjY2VwdHMgbWF4aW11bSBvbmUgbWFpbiBjb21waWxlIHVuaXQgcGVyIG1vZHVsZS4gSWYgYQorICAgIC8vLyBtb2R1bGUgZG9lcyBub3QgY29udGFpbiBhbnkgbWFpbiBjb21waWxlIHVuaXQgdGhlbiB0aGUgY29kZSBnZW5lcmF0b3IKKyAgICAvLy8gd2lsbCBlbWl0IG11bHRpcGxlIGNvbXBpbGUgdW5pdHMgaW4gdGhlIG91dHB1dCBvYmplY3QgZmlsZS4KKworICAgIGJvb2wgaXNNYWluKCkgY29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gZ2V0VW5zaWduZWRGaWVsZCg2KTsgfQorICAgIGJvb2wgaXNPcHRpbWl6ZWQoKSBjb25zdCAgICAgICAgICAgeyByZXR1cm4gZ2V0VW5zaWduZWRGaWVsZCg3KTsgfQorICAgIFN0cmluZ1JlZiBnZXRGbGFncygpIGNvbnN0ICAgICAgIHsgcmV0dXJuIGdldFN0cmluZ0ZpZWxkKDgpOyAgIH0KKyAgICB1bnNpZ25lZCBnZXRSdW5UaW1lVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoOSk7IH0KKworICAgIC8vLyBWZXJpZnkgLSBWZXJpZnkgdGhhdCBhIGNvbXBpbGUgdW5pdCBpcyB3ZWxsIGZvcm1lZC4KKyAgICBib29sIFZlcmlmeSgpIGNvbnN0OworCisgICAgLy8vIHByaW50IC0gcHJpbnQgY29tcGlsZSB1bml0LgorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBkdW1wIC0gcHJpbnQgY29tcGlsZSB1bml0IHRvIGRiZ3MoKSB3aXRoIGEgbmV3bGluZS4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICAvLy8gRElGaWxlIC0gVGhpcyBpcyBhIHdyYXBwZXIgZm9yIGEgZmlsZS4KKyAgY2xhc3MgRElGaWxlIDogcHVibGljIERJU2NvcGUgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRElGaWxlKGNvbnN0IE1ETm9kZSAqTiA9IDApIDogRElTY29wZShOKSB7CisgICAgICBpZiAoRGJnTm9kZSAmJiAhaXNGaWxlKCkpCisgICAgICAgIERiZ05vZGUgPSAwOworICAgIH0KKyAgICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdCAgeyByZXR1cm4gZ2V0U3RyaW5nRmllbGQoMSk7ICAgfQorICAgIFN0cmluZ1JlZiBnZXREaXJlY3RvcnkoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdGaWVsZCgyKTsgICB9CisgICAgRElDb21waWxlVW5pdCBnZXRDb21waWxlVW5pdCgpIGNvbnN0eyByZXR1cm4gZ2V0RmllbGRBczxESUNvbXBpbGVVbml0PigzKTsgfQorICB9OworCisgIC8vLyBESUVudW1lcmF0b3IgLSBBIHdyYXBwZXIgZm9yIGFuIGVudW1lcmF0b3IgKGUuZy4gWCBhbmQgWSBpbiAnZW51bSB7WCxZfScpLgorICAvLy8gRklYTUU6IGl0IHNlZW1zIHN0cmFuZ2UgdGhhdCB0aGlzIGRvZXNuJ3QgaGF2ZSBlaXRoZXIgYSByZWZlcmVuY2UgdG8gdGhlCisgIC8vLyB0eXBlL3ByZWNpc2lvbiBvciBhIGZpbGUvbGluZSBwYWlyIGZvciBsb2NhdGlvbiBpbmZvLgorICBjbGFzcyBESUVudW1lcmF0b3IgOiBwdWJsaWMgRElEZXNjcmlwdG9yIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJRW51bWVyYXRvcihjb25zdCBNRE5vZGUgKk4gPSAwKSA6IERJRGVzY3JpcHRvcihOKSB7fQorCisgICAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCAgICAgICAgeyByZXR1cm4gZ2V0U3RyaW5nRmllbGQoMSk7IH0KKyAgICB1aW50NjRfdCBnZXRFbnVtVmFsdWUoKSBjb25zdCAgICAgIHsgcmV0dXJuIGdldFVJbnQ2NEZpZWxkKDIpOyB9CisgIH07CisKKyAgLy8vIERJVHlwZSAtIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhIHR5cGUuCisgIC8vLyBGSVhNRTogVHlwZXMgc2hvdWxkIGJlIGZhY3RvcmVkIG11Y2ggYmV0dGVyIHNvIHRoYXQgQ1YgcXVhbGlmaWVycyBhbmQKKyAgLy8vIG90aGVycyBkbyBub3QgcmVxdWlyZSBhIGh1Z2UgYW5kIGVtcHR5IGRlc2NyaXB0b3IgZnVsbCBvZiB6ZXJvcy4KKyAgY2xhc3MgRElUeXBlIDogcHVibGljIERJU2NvcGUgeworICBwdWJsaWM6CisgICAgZW51bSB7CisgICAgICBGbGFnUHJpdmF0ZSAgICAgICAgICA9IDEgPDwgMCwKKyAgICAgIEZsYWdQcm90ZWN0ZWQgICAgICAgID0gMSA8PCAxLAorICAgICAgRmxhZ0Z3ZERlY2wgICAgICAgICAgPSAxIDw8IDIsCisgICAgICBGbGFnQXBwbGVCbG9jayAgICAgICA9IDEgPDwgMywKKyAgICAgIEZsYWdCbG9ja0J5cmVmU3RydWN0ID0gMSA8PCA0LAorICAgICAgRmxhZ1ZpcnR1YWwgICAgICAgICAgPSAxIDw8IDUsCisgICAgICBGbGFnQXJ0aWZpY2lhbCAgICAgICA9IDEgPDwgNiAgLy8gVG8gaWRlbnRpZnkgYXJ0aWZpY2lhbCBhcmd1bWVudHMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHN1YnJvdXRpbmUgdHlwZS4gZS5nLiAidGhpcyIgaW4gYysrLgorICAgIH07CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFRoaXMgY3RvciBpcyB1c2VkIHdoZW4gdGhlIFRhZyBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSBhIGRlcml2ZWQKKyAgICAvLyBjdG9yLgorICAgIERJVHlwZShjb25zdCBNRE5vZGUgKk4sIGJvb2wsIGJvb2wpIDogRElTY29wZShOKSB7fQorCisgIHB1YmxpYzoKKworICAgIC8vLyBWZXJpZnkgLSBWZXJpZnkgdGhhdCBhIHR5cGUgZGVzY3JpcHRvciBpcyB3ZWxsIGZvcm1lZC4KKyAgICBib29sIFZlcmlmeSgpIGNvbnN0OworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRElUeXBlKGNvbnN0IE1ETm9kZSAqTik7CisgICAgZXhwbGljaXQgRElUeXBlKCkge30KKyAgICB2aXJ0dWFsIH5ESVR5cGUoKSB7fQorCisgICAgRElTY29wZSBnZXRDb250ZXh0KCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gZ2V0RmllbGRBczxESVNjb3BlPigxKTsgfQorICAgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgICAgICAgICAgIHsgcmV0dXJuIGdldFN0cmluZ0ZpZWxkKDIpOyAgICAgfQorICAgIERJQ29tcGlsZVVuaXQgZ2V0Q29tcGlsZVVuaXQoKSBjb25zdHsgCisgICAgICBpZiAoZ2V0VmVyc2lvbigpID09IGxsdm06OkxMVk1EZWJ1Z1ZlcnNpb243KQorICAgICAgICByZXR1cm4gZ2V0RmllbGRBczxESUNvbXBpbGVVbml0PigzKTsKKworICAgICAgRElGaWxlIEYgPSBnZXRGaWVsZEFzPERJRmlsZT4oMyk7CisgICAgICByZXR1cm4gRi5nZXRDb21waWxlVW5pdCgpOworICAgIH0KKyAgICB1bnNpZ25lZCBnZXRMaW5lTnVtYmVyKCkgY29uc3QgICAgICB7IHJldHVybiBnZXRVbnNpZ25lZEZpZWxkKDQpOyB9CisgICAgdWludDY0X3QgZ2V0U2l6ZUluQml0cygpIGNvbnN0ICAgICAgeyByZXR1cm4gZ2V0VUludDY0RmllbGQoNSk7IH0KKyAgICB1aW50NjRfdCBnZXRBbGlnbkluQml0cygpIGNvbnN0ICAgICB7IHJldHVybiBnZXRVSW50NjRGaWVsZCg2KTsgfQorICAgIC8vIEZJWE1FOiBPZmZzZXQgaXMgb25seSB1c2VkIGZvciBEV19UQUdfbWVtYmVyIG5vZGVzLiAgTWFraW5nIGV2ZXJ5IHR5cGUKKyAgICAvLyBjYXJyeSB0aGlzIGlzIGp1c3QgcGxhaW4gaW5zYW5lLgorICAgIHVpbnQ2NF90IGdldE9mZnNldEluQml0cygpIGNvbnN0ICAgIHsgcmV0dXJuIGdldFVJbnQ2NEZpZWxkKDcpOyB9CisgICAgdW5zaWduZWQgZ2V0RmxhZ3MoKSBjb25zdCAgICAgICAgICAgeyByZXR1cm4gZ2V0VW5zaWduZWRGaWVsZCg4KTsgfQorICAgIGJvb2wgaXNQcml2YXRlKCkgY29uc3QgeworICAgICAgcmV0dXJuIChnZXRGbGFncygpICYgRmxhZ1ByaXZhdGUpICE9IDA7CisgICAgfQorICAgIGJvb2wgaXNQcm90ZWN0ZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gKGdldEZsYWdzKCkgJiBGbGFnUHJvdGVjdGVkKSAhPSAwOworICAgIH0KKyAgICBib29sIGlzRm9yd2FyZERlY2woKSBjb25zdCB7CisgICAgICByZXR1cm4gKGdldEZsYWdzKCkgJiBGbGFnRndkRGVjbCkgIT0gMDsKKyAgICB9CisgICAgLy8gaXNBcHBsZUJsb2NrIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgQXBwbGUgQmxvY2tzIGV4dGVuc2lvbi4KKyAgICBib29sIGlzQXBwbGVCbG9ja0V4dGVuc2lvbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIEZsYWdBcHBsZUJsb2NrKSAhPSAwOworICAgIH0KKyAgICBib29sIGlzQmxvY2tCeXJlZlN0cnVjdCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIEZsYWdCbG9ja0J5cmVmU3RydWN0KSAhPSAwOworICAgIH0KKyAgICBib29sIGlzVmlydHVhbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIEZsYWdWaXJ0dWFsKSAhPSAwOworICAgIH0KKyAgICBib29sIGlzQXJ0aWZpY2lhbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIEZsYWdBcnRpZmljaWFsKSAhPSAwOworICAgIH0KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gRGJnTm9kZSAmJiAoaXNCYXNpY1R5cGUoKSB8fCBpc0Rlcml2ZWRUeXBlKCkgfHwgaXNDb21wb3NpdGVUeXBlKCkpOworICAgIH0KKyAgICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdCAgICB7IHJldHVybiBnZXRDb21waWxlVW5pdCgpLmdldEZpbGVuYW1lKCk7fQorICAgIFN0cmluZ1JlZiBnZXREaXJlY3RvcnkoKSBjb25zdCAgIHsgcmV0dXJuIGdldENvbXBpbGVVbml0KCkuZ2V0RGlyZWN0b3J5KCk7fQorCisgICAgLy8vIHByaW50IC0gcHJpbnQgdHlwZS4KKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gZHVtcCAtIHByaW50IHR5cGUgdG8gZGJncygpIHdpdGggYSBuZXdsaW5lLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworICB9OworCisgIC8vLyBESUJhc2ljVHlwZSAtIEEgYmFzaWMgdHlwZSwgbGlrZSAnaW50JyBvciAnZmxvYXQnLgorICBjbGFzcyBESUJhc2ljVHlwZSA6IHB1YmxpYyBESVR5cGUgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRElCYXNpY1R5cGUoY29uc3QgTUROb2RlICpOID0gMCkgOiBESVR5cGUoTikge30KKworICAgIHVuc2lnbmVkIGdldEVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gZ2V0VW5zaWduZWRGaWVsZCg5KTsgfQorCisgICAgLy8vIHByaW50IC0gcHJpbnQgYmFzaWMgdHlwZS4KKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gZHVtcCAtIHByaW50IGJhc2ljIHR5cGUgdG8gZGJncygpIHdpdGggYSBuZXdsaW5lLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworICB9OworCisgIC8vLyBESURlcml2ZWRUeXBlIC0gQSBzaW1wbGUgZGVyaXZlZCB0eXBlLCBsaWtlIGEgY29uc3QgcXVhbGlmaWVkIHR5cGUsCisgIC8vLyBhIHR5cGVkZWYsIGEgcG9pbnRlciBvciByZWZlcmVuY2UsIGV0Yy4KKyAgY2xhc3MgRElEZXJpdmVkVHlwZSA6IHB1YmxpYyBESVR5cGUgeworICBwcm90ZWN0ZWQ6CisgICAgZXhwbGljaXQgRElEZXJpdmVkVHlwZShjb25zdCBNRE5vZGUgKk4sIGJvb2wsIGJvb2wpCisgICAgICA6IERJVHlwZShOLCB0cnVlLCB0cnVlKSB7fQorICBwdWJsaWM6CisgICAgZXhwbGljaXQgRElEZXJpdmVkVHlwZShjb25zdCBNRE5vZGUgKk4gPSAwKQorICAgICAgOiBESVR5cGUoTiwgdHJ1ZSwgdHJ1ZSkge30KKworICAgIERJVHlwZSBnZXRUeXBlRGVyaXZlZEZyb20oKSBjb25zdCB7IHJldHVybiBnZXRGaWVsZEFzPERJVHlwZT4oOSk7IH0KKworICAgIC8vLyBnZXRPcmlnaW5hbFR5cGVTaXplIC0gSWYgdGhpcyB0eXBlIGlzIGRlcml2ZWQgZnJvbSBhIGJhc2UgdHlwZSB0aGVuCisgICAgLy8vIHJldHVybiBiYXNlIHR5cGUgc2l6ZS4KKyAgICB1aW50NjRfdCBnZXRPcmlnaW5hbFR5cGVTaXplKCkgY29uc3Q7CisKKyAgICAvLy8gcHJpbnQgLSBwcmludCBkZXJpdmVkIHR5cGUuCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgICAgLy8vIGR1bXAgLSBwcmludCBkZXJpdmVkIHR5cGUgdG8gZGJncygpIHdpdGggYSBuZXdsaW5lLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIHJlcGxhY2VBbGxVc2VzV2l0aCAtIFJlcGxhY2UgYWxsIHVzZXMgb2YgZGVidWcgaW5mbyByZWZlcmVuY2VkIGJ5CisgICAgLy8vIHRoaXMgZGVzY3JpcHRvci4KKyAgICB2b2lkIHJlcGxhY2VBbGxVc2VzV2l0aChESURlc2NyaXB0b3IgJkQpOworICB9OworCisgIC8vLyBESUNvbXBvc2l0ZVR5cGUgLSBUaGlzIGRlc2NyaXB0b3IgaG9sZHMgYSB0eXBlIHRoYXQgY2FuIHJlZmVyIHRvIG11bHRpcGxlCisgIC8vLyBvdGhlciB0eXBlcywgbGlrZSBhIGZ1bmN0aW9uIG9yIHN0cnVjdC4KKyAgLy8vIEZJWE1FOiBXaHkgaXMgdGhpcyBhIERJRGVyaXZlZFR5cGU/PworICBjbGFzcyBESUNvbXBvc2l0ZVR5cGUgOiBwdWJsaWMgRElEZXJpdmVkVHlwZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBESUNvbXBvc2l0ZVR5cGUoY29uc3QgTUROb2RlICpOID0gMCkKKyAgICAgIDogRElEZXJpdmVkVHlwZShOLCB0cnVlLCB0cnVlKSB7CisgICAgICBpZiAoTiAmJiAhaXNDb21wb3NpdGVUeXBlKCkpCisgICAgICAgIERiZ05vZGUgPSAwOworICAgIH0KKworICAgIERJQXJyYXkgZ2V0VHlwZUFycmF5KCkgY29uc3QgeyByZXR1cm4gZ2V0RmllbGRBczxESUFycmF5PigxMCk7IH0KKyAgICB1bnNpZ25lZCBnZXRSdW5UaW1lTGFuZygpIGNvbnN0IHsgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoMTEpOyB9CisgICAgRElDb21wb3NpdGVUeXBlIGdldENvbnRhaW5pbmdUeXBlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEZpZWxkQXM8RElDb21wb3NpdGVUeXBlPigxMik7CisgICAgfQorCisgICAgLy8vIFZlcmlmeSAtIFZlcmlmeSB0aGF0IGEgY29tcG9zaXRlIHR5cGUgZGVzY3JpcHRvciBpcyB3ZWxsIGZvcm1lZC4KKyAgICBib29sIFZlcmlmeSgpIGNvbnN0OworCisgICAgLy8vIHByaW50IC0gcHJpbnQgY29tcG9zaXRlIHR5cGUuCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgICAgLy8vIGR1bXAgLSBwcmludCBjb21wb3NpdGUgdHlwZSB0byBkYmdzKCkgd2l0aCBhIG5ld2xpbmUuCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIH07CisKKyAgLy8vIERJU3VicHJvZ3JhbSAtIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhIHN1YnByb2dyYW0gKGUuZy4gYSBmdW5jdGlvbikuCisgIGNsYXNzIERJU3VicHJvZ3JhbSA6IHB1YmxpYyBESVNjb3BlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJU3VicHJvZ3JhbShjb25zdCBNRE5vZGUgKk4gPSAwKSA6IERJU2NvcGUoTikge30KKworICAgIERJU2NvcGUgZ2V0Q29udGV4dCgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIGdldEZpZWxkQXM8RElTY29wZT4oMik7IH0KKyAgICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0ICAgICAgICAgeyByZXR1cm4gZ2V0U3RyaW5nRmllbGQoMyk7IH0KKyAgICBTdHJpbmdSZWYgZ2V0RGlzcGxheU5hbWUoKSBjb25zdCAgeyByZXR1cm4gZ2V0U3RyaW5nRmllbGQoNCk7IH0KKyAgICBTdHJpbmdSZWYgZ2V0TGlua2FnZU5hbWUoKSBjb25zdCAgeyByZXR1cm4gZ2V0U3RyaW5nRmllbGQoNSk7IH0KKyAgICBESUNvbXBpbGVVbml0IGdldENvbXBpbGVVbml0KCkgY29uc3R7IAorICAgICAgaWYgKGdldFZlcnNpb24oKSA9PSBsbHZtOjpMTFZNRGVidWdWZXJzaW9uNykKKyAgICAgICAgcmV0dXJuIGdldEZpZWxkQXM8RElDb21waWxlVW5pdD4oNik7CisKKyAgICAgIERJRmlsZSBGID0gZ2V0RmllbGRBczxESUZpbGU+KDYpOyAKKyAgICAgIHJldHVybiBGLmdldENvbXBpbGVVbml0KCk7CisgICAgfQorICAgIHVuc2lnbmVkIGdldExpbmVOdW1iZXIoKSBjb25zdCAgICAgIHsgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoNyk7IH0KKyAgICBESUNvbXBvc2l0ZVR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZpZWxkQXM8RElDb21wb3NpdGVUeXBlPig4KTsgfQorCisgICAgLy8vIGdldFJldHVyblR5cGVOYW1lIC0gU3VicHJvZ3JhbSByZXR1cm4gdHlwZXMgYXJlIGVuY29kZWQgZWl0aGVyIGFzCisgICAgLy8vIERJVHlwZSBvciBhcyBESUNvbXBvc2l0ZVR5cGUuCisgICAgU3RyaW5nUmVmIGdldFJldHVyblR5cGVOYW1lKCkgY29uc3QgeworICAgICAgRElDb21wb3NpdGVUeXBlIERDVChnZXRGaWVsZEFzPERJQ29tcG9zaXRlVHlwZT4oOCkpOworICAgICAgaWYgKERDVC5WZXJpZnkoKSkgeworICAgICAgICBESUFycmF5IEEgPSBEQ1QuZ2V0VHlwZUFycmF5KCk7CisgICAgICAgIERJVHlwZSBUKEEuZ2V0RWxlbWVudCgwKSk7CisgICAgICAgIHJldHVybiBULmdldE5hbWUoKTsKKyAgICAgIH0KKyAgICAgIERJVHlwZSBUKGdldEZpZWxkQXM8RElUeXBlPig4KSk7CisgICAgICByZXR1cm4gVC5nZXROYW1lKCk7CisgICAgfQorCisgICAgLy8vIGlzTG9jYWxUb1VuaXQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHN1YnByb2dyYW0gaXMgbG9jYWwgdG8gdGhlIGN1cnJlbnQKKyAgICAvLy8gY29tcGlsZSB1bml0LCBsaWtlICdzdGF0aWMnIGluIEMuCisgICAgdW5zaWduZWQgaXNMb2NhbFRvVW5pdCgpIGNvbnN0ICAgICB7IHJldHVybiBnZXRVbnNpZ25lZEZpZWxkKDkpOyB9CisgICAgdW5zaWduZWQgaXNEZWZpbml0aW9uKCkgY29uc3QgICAgICB7IHJldHVybiBnZXRVbnNpZ25lZEZpZWxkKDEwKTsgfQorCisgICAgdW5zaWduZWQgZ2V0VmlydHVhbGl0eSgpIGNvbnN0IHsgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoMTEpOyB9CisgICAgdW5zaWduZWQgZ2V0VmlydHVhbEluZGV4KCkgY29uc3QgeyByZXR1cm4gZ2V0VW5zaWduZWRGaWVsZCgxMik7IH0KKworICAgIERJQ29tcG9zaXRlVHlwZSBnZXRDb250YWluaW5nVHlwZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRGaWVsZEFzPERJQ29tcG9zaXRlVHlwZT4oMTMpOworICAgIH0KKyAgICB1bnNpZ25lZCBpc0FydGlmaWNpYWwoKSBjb25zdCAgICB7IHJldHVybiBnZXRVbnNpZ25lZEZpZWxkKDE0KTsgfQorICAgIHVuc2lnbmVkIGlzT3B0aW1pemVkKCkgY29uc3Q7CisKKyAgICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdCAgICB7IAorICAgICAgaWYgKGdldFZlcnNpb24oKSA9PSBsbHZtOjpMTFZNRGVidWdWZXJzaW9uNykKKyAgICAgICAgcmV0dXJuIGdldENvbXBpbGVVbml0KCkuZ2V0RmlsZW5hbWUoKTsKKworICAgICAgRElGaWxlIEYgPSBnZXRGaWVsZEFzPERJRmlsZT4oNik7IAorICAgICAgcmV0dXJuIEYuZ2V0RmlsZW5hbWUoKTsKKyAgICB9CisKKyAgICBTdHJpbmdSZWYgZ2V0RGlyZWN0b3J5KCkgY29uc3QgICB7IAorICAgICAgaWYgKGdldFZlcnNpb24oKSA9PSBsbHZtOjpMTFZNRGVidWdWZXJzaW9uNykKKyAgICAgICAgcmV0dXJuIGdldENvbXBpbGVVbml0KCkuZ2V0RmlsZW5hbWUoKTsKKworICAgICAgRElGaWxlIEYgPSBnZXRGaWVsZEFzPERJRmlsZT4oNik7IAorICAgICAgcmV0dXJuIEYuZ2V0RGlyZWN0b3J5KCk7CisgICAgfQorCisgICAgLy8vIFZlcmlmeSAtIFZlcmlmeSB0aGF0IGEgc3VicHJvZ3JhbSBkZXNjcmlwdG9yIGlzIHdlbGwgZm9ybWVkLgorICAgIGJvb2wgVmVyaWZ5KCkgY29uc3Q7CisKKyAgICAvLy8gcHJpbnQgLSBwcmludCBzdWJwcm9ncmFtLgorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBkdW1wIC0gcHJpbnQgc3VicHJvZ3JhbSB0byBkYmdzKCkgd2l0aCBhIG5ld2xpbmUuCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICAvLy8gZGVzY3JpYmVzIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzdWJwcm9ncmFtIHByb3ZpZGVzIGRlYnVnZ2luZworICAgIC8vLyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIEYuCisgICAgYm9vbCBkZXNjcmliZXMoY29uc3QgRnVuY3Rpb24gKkYpOworCisgICAgRnVuY3Rpb24gKmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gZ2V0RnVuY3Rpb25GaWVsZCgxNik7IH0KKyAgfTsKKworICAvLy8gRElHbG9iYWxWYXJpYWJsZSAtIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhIGdsb2JhbCB2YXJpYWJsZS4KKyAgY2xhc3MgRElHbG9iYWxWYXJpYWJsZSA6IHB1YmxpYyBESURlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRElHbG9iYWxWYXJpYWJsZShjb25zdCBNRE5vZGUgKk4gPSAwKSA6IERJRGVzY3JpcHRvcihOKSB7fQorCisgICAgRElTY29wZSBnZXRDb250ZXh0KCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gZ2V0RmllbGRBczxESVNjb3BlPigyKTsgfQorICAgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgICAgICAgICB7IHJldHVybiBnZXRTdHJpbmdGaWVsZCgzKTsgfQorICAgIFN0cmluZ1JlZiBnZXREaXNwbGF5TmFtZSgpIGNvbnN0ICB7IHJldHVybiBnZXRTdHJpbmdGaWVsZCg0KTsgfQorICAgIFN0cmluZ1JlZiBnZXRMaW5rYWdlTmFtZSgpIGNvbnN0ICB7IHJldHVybiBnZXRTdHJpbmdGaWVsZCg1KTsgfQorICAgIERJQ29tcGlsZVVuaXQgZ2V0Q29tcGlsZVVuaXQoKSBjb25zdHsgCisgICAgICBpZiAoZ2V0VmVyc2lvbigpID09IGxsdm06OkxMVk1EZWJ1Z1ZlcnNpb243KQorICAgICAgICByZXR1cm4gZ2V0RmllbGRBczxESUNvbXBpbGVVbml0Pig2KTsKKworICAgICAgRElGaWxlIEYgPSBnZXRGaWVsZEFzPERJRmlsZT4oNik7IAorICAgICAgcmV0dXJuIEYuZ2V0Q29tcGlsZVVuaXQoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRMaW5lTnVtYmVyKCkgY29uc3QgICAgICB7IHJldHVybiBnZXRVbnNpZ25lZEZpZWxkKDcpOyB9CisgICAgRElUeXBlIGdldFR5cGUoKSBjb25zdCAgICAgICAgICAgICAgeyByZXR1cm4gZ2V0RmllbGRBczxESVR5cGU+KDgpOyB9CisgICAgdW5zaWduZWQgaXNMb2NhbFRvVW5pdCgpIGNvbnN0ICAgICAgeyByZXR1cm4gZ2V0VW5zaWduZWRGaWVsZCg5KTsgfQorICAgIHVuc2lnbmVkIGlzRGVmaW5pdGlvbigpIGNvbnN0ICAgICAgIHsgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoMTApOyB9CisKKyAgICBHbG9iYWxWYXJpYWJsZSAqZ2V0R2xvYmFsKCkgY29uc3QgeyByZXR1cm4gZ2V0R2xvYmFsVmFyaWFibGVGaWVsZCgxMSk7IH0KKyAgICBDb25zdGFudCAqZ2V0Q29uc3RhbnQoKSBjb25zdCAgIHsgcmV0dXJuIGdldENvbnN0YW50RmllbGQoMTEpOyB9CisKKyAgICAvLy8gVmVyaWZ5IC0gVmVyaWZ5IHRoYXQgYSBnbG9iYWwgdmFyaWFibGUgZGVzY3JpcHRvciBpcyB3ZWxsIGZvcm1lZC4KKyAgICBib29sIFZlcmlmeSgpIGNvbnN0OworCisgICAgLy8vIHByaW50IC0gcHJpbnQgZ2xvYmFsIHZhcmlhYmxlLgorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBkdW1wIC0gcHJpbnQgZ2xvYmFsIHZhcmlhYmxlIHRvIGRiZ3MoKSB3aXRoIGEgbmV3bGluZS4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICAvLy8gRElWYXJpYWJsZSAtIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhIHZhcmlhYmxlIChlLmcuIHBhcmFtZXRlciwgbG9jYWwsCisgIC8vLyBnbG9iYWwgZXRjKS4KKyAgY2xhc3MgRElWYXJpYWJsZSA6IHB1YmxpYyBESURlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRElWYXJpYWJsZShjb25zdCBNRE5vZGUgKk4gPSAwKQorICAgICAgOiBESURlc2NyaXB0b3IoTikge30KKworICAgIERJU2NvcGUgZ2V0Q29udGV4dCgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIGdldEZpZWxkQXM8RElTY29wZT4oMSk7IH0KKyAgICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0ICAgICAgICAgICB7IHJldHVybiBnZXRTdHJpbmdGaWVsZCgyKTsgICAgIH0KKyAgICBESUNvbXBpbGVVbml0IGdldENvbXBpbGVVbml0KCkgY29uc3R7IAorICAgICAgaWYgKGdldFZlcnNpb24oKSA9PSBsbHZtOjpMTFZNRGVidWdWZXJzaW9uNykKKyAgICAgICAgcmV0dXJuIGdldEZpZWxkQXM8RElDb21waWxlVW5pdD4oMyk7CisKKyAgICAgIERJRmlsZSBGID0gZ2V0RmllbGRBczxESUZpbGU+KDMpOyAKKyAgICAgIHJldHVybiBGLmdldENvbXBpbGVVbml0KCk7CisgICAgfQorICAgIHVuc2lnbmVkIGdldExpbmVOdW1iZXIoKSBjb25zdCAgICAgIHsgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoNCk7IH0KKyAgICBESVR5cGUgZ2V0VHlwZSgpIGNvbnN0ICAgICAgICAgICAgICB7IHJldHVybiBnZXRGaWVsZEFzPERJVHlwZT4oNSk7IH0KKworCisgICAgLy8vIFZlcmlmeSAtIFZlcmlmeSB0aGF0IGEgdmFyaWFibGUgZGVzY3JpcHRvciBpcyB3ZWxsIGZvcm1lZC4KKyAgICBib29sIFZlcmlmeSgpIGNvbnN0OworCisgICAgLy8vIEhhc0NvbXBsZXhBZGRyIC0gUmV0dXJuIHRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBhIGNvbXBsZXggYWRkcmVzcy4KKyAgICBib29sIGhhc0NvbXBsZXhBZGRyZXNzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldE51bUFkZHJFbGVtZW50cygpID4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXROdW1BZGRyRWxlbWVudHMoKSBjb25zdDsKKyAgICAKKyAgICB1aW50NjRfdCBnZXRBZGRyRWxlbWVudCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRVSW50NjRGaWVsZChJZHgrNik7CisgICAgfQorCisgICAgLy8vIGlzQmxvY2tCeXJlZlZhcmlhYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHZhcmlhYmxlIHdhcyBkZWNsYXJlZCBhcworICAgIC8vLyBhICJfX2Jsb2NrIiB2YXJpYWJsZSAoQXBwbGUgQmxvY2tzKS4KKyAgICBib29sIGlzQmxvY2tCeXJlZlZhcmlhYmxlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFR5cGUoKS5pc0Jsb2NrQnlyZWZTdHJ1Y3QoKTsKKyAgICB9CisKKyAgICAvLy8gaXNJbmxpbmVkRm5Bcmd1bWVudCAtIFJldHVybiB0cnVsZSBpZiB0aGlzIHZhcmlhYmxlIHByb3ZpZGVzIGRlYnVnZ2luZworICAgIC8vLyBpbmZvcm1hdGlvbiBmb3IgYW4gaW5saW5lZCBmdW5jdGlvbiBhcmd1bWVudHMuCisgICAgYm9vbCBpc0lubGluZWRGbkFyZ3VtZW50KGNvbnN0IEZ1bmN0aW9uICpDdXJGbik7CisKKyAgICAvLy8gcHJpbnQgLSBwcmludCB2YXJpYWJsZS4KKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gZHVtcCAtIHByaW50IHZhcmlhYmxlIHRvIGRiZ3MoKSB3aXRoIGEgbmV3bGluZS4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICAvLy8gRElMZXhpY2FsQmxvY2sgLSBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYSBsZXhpY2FsIGJsb2NrLgorICBjbGFzcyBESUxleGljYWxCbG9jayA6IHB1YmxpYyBESVNjb3BlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJTGV4aWNhbEJsb2NrKGNvbnN0IE1ETm9kZSAqTiA9IDApIDogRElTY29wZShOKSB7fQorICAgIERJU2NvcGUgZ2V0Q29udGV4dCgpIGNvbnN0ICAgICAgIHsgcmV0dXJuIGdldEZpZWxkQXM8RElTY29wZT4oMSk7ICAgICAgfQorICAgIHVuc2lnbmVkIGdldExpbmVOdW1iZXIoKSBjb25zdCAgIHsgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoMik7ICAgICAgICAgfQorICAgIHVuc2lnbmVkIGdldENvbHVtbk51bWJlcigpIGNvbnN0IHsgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoMyk7ICAgICAgICAgfQorICAgIFN0cmluZ1JlZiBnZXREaXJlY3RvcnkoKSBjb25zdCB7CisgICAgICBESUZpbGUgRiA9IGdldEZpZWxkQXM8RElGaWxlPig0KTsKKyAgICAgIFN0cmluZ1JlZiBkaXIgPSBGLmdldERpcmVjdG9yeSgpOworICAgICAgcmV0dXJuICFkaXIuZW1wdHkoKSA/IGRpciA6IGdldENvbnRleHQoKS5nZXREaXJlY3RvcnkoKTsKKyAgICB9CisgICAgU3RyaW5nUmVmIGdldEZpbGVuYW1lKCkgY29uc3QgeworICAgICAgRElGaWxlIEYgPSBnZXRGaWVsZEFzPERJRmlsZT4oNCk7CisgICAgICBTdHJpbmdSZWYgZmlsZW5hbWUgPSBGLmdldEZpbGVuYW1lKCk7CisgICAgICByZXR1cm4gIWZpbGVuYW1lLmVtcHR5KCkgPyBmaWxlbmFtZSA6IGdldENvbnRleHQoKS5nZXRGaWxlbmFtZSgpOworICAgIH0KKyAgfTsKKworICAvLy8gRElOYW1lU3BhY2UgLSBBIHdyYXBwZXIgZm9yIGEgQysrIHN0eWxlIG5hbWUgc3BhY2UuCisgIGNsYXNzIERJTmFtZVNwYWNlIDogcHVibGljIERJU2NvcGUgeyAKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJTmFtZVNwYWNlKGNvbnN0IE1ETm9kZSAqTiA9IDApIDogRElTY29wZShOKSB7fQorICAgIERJU2NvcGUgZ2V0Q29udGV4dCgpIGNvbnN0ICAgICB7IHJldHVybiBnZXRGaWVsZEFzPERJU2NvcGU+KDEpOyAgICAgIH0KKyAgICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0ICAgICAgeyByZXR1cm4gZ2V0U3RyaW5nRmllbGQoMik7ICAgICAgICAgICB9CisgICAgU3RyaW5nUmVmIGdldERpcmVjdG9yeSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRleHQoKS5nZXREaXJlY3RvcnkoKTsgfQorICAgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0ICB7IHJldHVybiBnZXRDb250ZXh0KCkuZ2V0RmlsZW5hbWUoKTsgIH0KKyAgICBESUNvbXBpbGVVbml0IGdldENvbXBpbGVVbml0KCkgY29uc3R7IAorICAgICAgaWYgKGdldFZlcnNpb24oKSA9PSBsbHZtOjpMTFZNRGVidWdWZXJzaW9uNykKKyAgICAgICAgcmV0dXJuIGdldEZpZWxkQXM8RElDb21waWxlVW5pdD4oMyk7CisKKyAgICAgIERJRmlsZSBGID0gZ2V0RmllbGRBczxESUZpbGU+KDMpOyAKKyAgICAgIHJldHVybiBGLmdldENvbXBpbGVVbml0KCk7CisgICAgfQorICAgIHVuc2lnbmVkIGdldExpbmVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBnZXRVbnNpZ25lZEZpZWxkKDQpOyAgICAgICAgIH0KKyAgICBib29sIFZlcmlmeSgpIGNvbnN0OworICB9OworCisgIC8vLyBESUxvY2F0aW9uIC0gVGhpcyBvYmplY3QgaG9sZHMgbG9jYXRpb24gaW5mb3JtYXRpb24uIFRoaXMgb2JqZWN0CisgIC8vLyBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBEV0FSRiB0YWcuCisgIGNsYXNzIERJTG9jYXRpb24gOiBwdWJsaWMgRElEZXNjcmlwdG9yIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJTG9jYXRpb24oY29uc3QgTUROb2RlICpOKSA6IERJRGVzY3JpcHRvcihOKSB7IH0KKworICAgIHVuc2lnbmVkIGdldExpbmVOdW1iZXIoKSBjb25zdCAgICAgeyByZXR1cm4gZ2V0VW5zaWduZWRGaWVsZCgwKTsgfQorICAgIHVuc2lnbmVkIGdldENvbHVtbk51bWJlcigpIGNvbnN0ICAgeyByZXR1cm4gZ2V0VW5zaWduZWRGaWVsZCgxKTsgfQorICAgIERJU2NvcGUgIGdldFNjb3BlKCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gZ2V0RmllbGRBczxESVNjb3BlPigyKTsgfQorICAgIERJTG9jYXRpb24gZ2V0T3JpZ0xvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gZ2V0RmllbGRBczxESUxvY2F0aW9uPigzKTsgfQorICAgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0ICAgIHsgcmV0dXJuIGdldFNjb3BlKCkuZ2V0RmlsZW5hbWUoKTsgfQorICAgIFN0cmluZ1JlZiBnZXREaXJlY3RvcnkoKSBjb25zdCAgIHsgcmV0dXJuIGdldFNjb3BlKCkuZ2V0RGlyZWN0b3J5KCk7IH0KKyAgICBib29sIFZlcmlmeSgpIGNvbnN0OworICB9OworCisgIC8vLyBESUZhY3RvcnkgLSBUaGlzIG9iamVjdCBhc3Npc3RzIHdpdGggdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgdmFyaW91cworICAvLy8gZGVzY3JpcHRvcnMuCisgIGNsYXNzIERJRmFjdG9yeSB7CisgICAgTW9kdWxlICZNOworICAgIExMVk1Db250ZXh0JiBWTUNvbnRleHQ7CisKKyAgICBGdW5jdGlvbiAqRGVjbGFyZUZuOyAgICAgLy8gbGx2bS5kYmcuZGVjbGFyZQorICAgIEZ1bmN0aW9uICpWYWx1ZUZuOyAgICAgICAvLyBsbHZtLmRiZy52YWx1ZQorCisgICAgRElGYWN0b3J5KGNvbnN0IERJRmFjdG9yeSAmKTsgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBESUZhY3RvcnkmKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICBwdWJsaWM6CisgICAgZW51bSBDb21wbGV4QWRkcktpbmQgeyBPcFBsdXM9MSwgT3BEZXJlZiB9OworCisgICAgZXhwbGljaXQgRElGYWN0b3J5KE1vZHVsZSAmbSk7CisKKyAgICAvLy8gR2V0T3JDcmVhdGVBcnJheSAtIENyZWF0ZSBhbiBkZXNjcmlwdG9yIGZvciBhbiBhcnJheSBvZiBkZXNjcmlwdG9ycy4KKyAgICAvLy8gVGhpcyBpbXBsaWNpdGx5IHVuaXF1ZXMgdGhlIGFycmF5cyBjcmVhdGVkLgorICAgIERJQXJyYXkgR2V0T3JDcmVhdGVBcnJheShESURlc2NyaXB0b3IgKlR5cywgdW5zaWduZWQgTnVtVHlzKTsKKworICAgIC8vLyBHZXRPckNyZWF0ZVN1YnJhbmdlIC0gQ3JlYXRlIGEgZGVzY3JpcHRvciBmb3IgYSB2YWx1ZSByYW5nZS4gIFRoaXMKKyAgICAvLy8gaW1wbGljaXRseSB1bmlxdWVzIHRoZSB2YWx1ZXMgcmV0dXJuZWQuCisgICAgRElTdWJyYW5nZSBHZXRPckNyZWF0ZVN1YnJhbmdlKGludDY0X3QgTG8sIGludDY0X3QgSGkpOworCisgICAgLy8vIENyZWF0ZUNvbXBpbGVVbml0IC0gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY29tcGlsZQorICAgIC8vLyB1bml0LgorICAgIERJQ29tcGlsZVVuaXQgQ3JlYXRlQ29tcGlsZVVuaXQodW5zaWduZWQgTGFuZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBQcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNNYWluID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3B0aW1pemVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmxhZ3MgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJ1blRpbWVWZXIgPSAwKTsKKworICAgIC8vLyBDcmVhdGVGaWxlIC0gIENyZWF0ZSBhIG5ldyBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCisgICAgRElGaWxlIENyZWF0ZUZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBTdHJpbmdSZWYgRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgIERJQ29tcGlsZVVuaXQgQ1UpOworCisgICAgLy8vIENyZWF0ZUVudW1lcmF0b3IgLSBDcmVhdGUgYSBzaW5nbGUgZW51bWVyYXRvciB2YWx1ZS4KKyAgICBESUVudW1lcmF0b3IgQ3JlYXRlRW51bWVyYXRvcihTdHJpbmdSZWYgTmFtZSwgdWludDY0X3QgVmFsKTsKKworICAgIC8vLyBDcmVhdGVCYXNpY1R5cGUgLSBDcmVhdGUgYSBiYXNpYyB0eXBlIGxpa2UgaW50LCBmbG9hdCwgZXRjLgorICAgIERJQmFzaWNUeXBlIENyZWF0ZUJhc2ljVHlwZShESURlc2NyaXB0b3IgQ29udGV4dCwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSBGLCB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50NjRfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCB1bnNpZ25lZCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRW5jb2RpbmcpOworCisgICAgLy8vIENyZWF0ZUJhc2ljVHlwZSAtIENyZWF0ZSBhIGJhc2ljIHR5cGUgbGlrZSBpbnQsIGZsb2F0LCBldGMuCisgICAgRElCYXNpY1R5cGUgQ3JlYXRlQmFzaWNUeXBlRXgoRElEZXNjcmlwdG9yIENvbnRleHQsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgRiwgdW5zaWduZWQgTGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlNpemVJbkJpdHMsIENvbnN0YW50ICpBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKk9mZnNldEluQml0cywgdW5zaWduZWQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVuY29kaW5nKTsKKworICAgIC8vLyBDcmVhdGVEZXJpdmVkVHlwZSAtIENyZWF0ZSBhIGRlcml2ZWQgdHlwZSBsaWtlIGNvbnN0IHF1YWxpZmllZCB0eXBlLAorICAgIC8vLyBwb2ludGVyLCB0eXBlZGVmLCBldGMuCisgICAgRElEZXJpdmVkVHlwZSBDcmVhdGVEZXJpdmVkVHlwZSh1bnNpZ25lZCBUYWcsIERJRGVzY3JpcHRvciBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50NjRfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldEluQml0cywgdW5zaWduZWQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgRGVyaXZlZEZyb20pOworCisgICAgLy8vIENyZWF0ZURlcml2ZWRUeXBlIC0gQ3JlYXRlIGEgZGVyaXZlZCB0eXBlIGxpa2UgY29uc3QgcXVhbGlmaWVkIHR5cGUsCisgICAgLy8vIHBvaW50ZXIsIHR5cGVkZWYsIGV0Yy4KKyAgICBESURlcml2ZWRUeXBlIENyZWF0ZURlcml2ZWRUeXBlRXgodW5zaWduZWQgVGFnLCBESURlc2NyaXB0b3IgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqU2l6ZUluQml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKk9mZnNldEluQml0cywgdW5zaWduZWQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZSBEZXJpdmVkRnJvbSk7CisKKyAgICAvLy8gQ3JlYXRlQ29tcG9zaXRlVHlwZSAtIENyZWF0ZSBhIGNvbXBvc2l0ZSB0eXBlIGxpa2UgYXJyYXksIHN0cnVjdCwgZXRjLgorICAgIERJQ29tcG9zaXRlVHlwZSBDcmVhdGVDb21wb3NpdGVUeXBlKHVuc2lnbmVkIFRhZywgRElEZXNjcmlwdG9yIENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldEluQml0cywgdW5zaWduZWQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlIERlcml2ZWRGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQXJyYXkgRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUnVuVGltZUxhbmcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqQ29udGFpbmluZ1R5cGUgPSAwKTsKKworICAgIC8vLyBDcmVhdGVBcnRpZmljaWFsVHlwZSAtIENyZWF0ZSBhIG5ldyBESVR5cGUgd2l0aCAiYXJ0aWZpY2lhbCIgZmxhZyBzZXQuCisgICAgRElUeXBlIENyZWF0ZUFydGlmaWNpYWxUeXBlKERJVHlwZSBUeSk7CisKKyAgICAvLy8gQ3JlYXRlQ29tcG9zaXRlVHlwZSAtIENyZWF0ZSBhIGNvbXBvc2l0ZSB0eXBlIGxpa2UgYXJyYXksIHN0cnVjdCwgZXRjLgorICAgIERJQ29tcG9zaXRlVHlwZSBDcmVhdGVDb21wb3NpdGVUeXBlRXgodW5zaWduZWQgVGFnLCBESURlc2NyaXB0b3IgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqT2Zmc2V0SW5CaXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlIERlcml2ZWRGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElBcnJheSBFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJ1blRpbWVMYW5nID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqQ29udGFpbmluZ1R5cGUgPSAwKTsKKworICAgIC8vLyBDcmVhdGVTdWJwcm9ncmFtIC0gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgc3VicHJvZ3JhbS4KKyAgICAvLy8gU2VlIGNvbW1lbnRzIGluIERJU3VicHJvZ3JhbSBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZXNlIGZpZWxkcy4KKyAgICBESVN1YnByb2dyYW0gQ3JlYXRlU3VicHJvZ3JhbShESURlc2NyaXB0b3IgQ29udGV4dCwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBMaW5rYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgRiwgdW5zaWduZWQgTGluZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZSBUeSwgYm9vbCBpc0xvY2FsVG9Vbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZLID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWSW5kZXggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZSA9IERJVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBcnRpZmljaWFsID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3B0aW1pemVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gKkZuID0gMCk7CisKKyAgICAvLy8gQ3JlYXRlU3VicHJvZ3JhbURlZmluaXRpb24gLSBDcmVhdGUgbmV3IHN1YnByb2dyYW0gZGVzY3JpcHRvciBmb3IgdGhlCisgICAgLy8vIGdpdmVuIGRlY2xhcmF0aW9uLiAKKyAgICBESVN1YnByb2dyYW0gQ3JlYXRlU3VicHJvZ3JhbURlZmluaXRpb24oRElTdWJwcm9ncmFtICZTUERlY2xhcmF0aW9uKTsKKworICAgIC8vLyBDcmVhdGVHbG9iYWxWYXJpYWJsZSAtIENyZWF0ZSBhIG5ldyBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGdsb2JhbC4KKyAgICBESUdsb2JhbFZhcmlhYmxlCisgICAgQ3JlYXRlR2xvYmFsVmFyaWFibGUoRElEZXNjcmlwdG9yIENvbnRleHQsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEaXNwbGF5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTGlua2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZU5vLCBESVR5cGUgVHksIGJvb2wgaXNMb2NhbFRvVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGVmaW5pdGlvbiwgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWKTsKKworICAgIC8vLyBDcmVhdGVHbG9iYWxWYXJpYWJsZSAtIENyZWF0ZSBhIG5ldyBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN0YW50LgorICAgIERJR2xvYmFsVmFyaWFibGUKKyAgICBDcmVhdGVHbG9iYWxWYXJpYWJsZShESURlc2NyaXB0b3IgQ29udGV4dCwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBMaW5rYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTm8sIERJVHlwZSBUeSwgYm9vbCBpc0xvY2FsVG9Vbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZWZpbml0aW9uLCBsbHZtOjpDb25zdGFudCAqQyk7CisKKyAgICAvLy8gQ3JlYXRlVmFyaWFibGUgLSBDcmVhdGUgYSBuZXcgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCB2YXJpYWJsZS4KKyAgICBESVZhcmlhYmxlIENyZWF0ZVZhcmlhYmxlKHVuc2lnbmVkIFRhZywgRElEZXNjcmlwdG9yIENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSBGLCB1bnNpZ25lZCBMaW5lTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgVHksIGJvb2wgQWx3YXlzUHJlc2VydmUgPSBmYWxzZSk7CisKKyAgICAvLy8gQ3JlYXRlQ29tcGxleFZhcmlhYmxlIC0gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gdmFyaWFibGUgd2hpY2ggaGFzIGEgY29tcGxleCBhZGRyZXNzIGV4cHJlc3Npb24gZm9yIGl0cyBhZGRyZXNzLgorICAgIERJVmFyaWFibGUgQ3JlYXRlQ29tcGxleFZhcmlhYmxlKHVuc2lnbmVkIFRhZywgRElEZXNjcmlwdG9yIENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlIEYsIHVuc2lnbmVkIExpbmVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8VmFsdWUgKiwgOT4gJmFkZHIpOworCisgICAgLy8vIENyZWF0ZUxleGljYWxCbG9jayAtIFRoaXMgY3JlYXRlcyBhIGRlc2NyaXB0b3IgZm9yIGEgbGV4aWNhbCBibG9jaworICAgIC8vLyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyZW50IGNvbnRleHQuCisgICAgRElMZXhpY2FsQmxvY2sgQ3JlYXRlTGV4aWNhbEJsb2NrKERJRGVzY3JpcHRvciBDb250ZXh0LCBESUZpbGUgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSA9IDAsIHVuc2lnbmVkIENvbCA9IDApOworCisgICAgLy8vIENyZWF0ZU5hbWVTcGFjZSAtIFRoaXMgY3JlYXRlcyBuZXcgZGVzY3JpcHRvciBmb3IgYSBuYW1lc3BhY2UKKyAgICAvLy8gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmVudCBjb250ZXh0LgorICAgIERJTmFtZVNwYWNlIENyZWF0ZU5hbWVTcGFjZShESURlc2NyaXB0b3IgQ29udGV4dCwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSBGLCB1bnNpZ25lZCBMaW5lTm8pOworCisgICAgLy8vIENyZWF0ZUxvY2F0aW9uIC0gQ3JlYXRlcyBhIGRlYnVnIGluZm8gbG9jYXRpb24uCisgICAgRElMb2NhdGlvbiBDcmVhdGVMb2NhdGlvbih1bnNpZ25lZCBMaW5lTm8sIHVuc2lnbmVkIENvbHVtbk5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTY29wZSBTLCBESUxvY2F0aW9uIE9yaWdMb2MpOworCisgICAgLy8vIENyZWF0ZUxvY2F0aW9uIC0gQ3JlYXRlcyBhIGRlYnVnIGluZm8gbG9jYXRpb24uCisgICAgRElMb2NhdGlvbiBDcmVhdGVMb2NhdGlvbih1bnNpZ25lZCBMaW5lTm8sIHVuc2lnbmVkIENvbHVtbk5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTY29wZSBTLCBNRE5vZGUgKk9yaWdMb2MgPSAwKTsKKworICAgIC8vLyBJbnNlcnREZWNsYXJlIC0gSW5zZXJ0IGEgbmV3IGxsdm0uZGJnLmRlY2xhcmUgaW50cmluc2ljIGNhbGwuCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydERlY2xhcmUobGx2bTo6VmFsdWUgKlN0b3JhZ2UsIERJVmFyaWFibGUgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgICAvLy8gSW5zZXJ0RGVjbGFyZSAtIEluc2VydCBhIG5ldyBsbHZtLmRiZy5kZWNsYXJlIGludHJpbnNpYyBjYWxsLgorICAgIEluc3RydWN0aW9uICpJbnNlcnREZWNsYXJlKGxsdm06OlZhbHVlICpTdG9yYWdlLCBESVZhcmlhYmxlIEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisKKyAgICAvLy8gSW5zZXJ0RGJnVmFsdWVJbnRyaW5zaWMgLSBJbnNlcnQgYSBuZXcgbGx2bS5kYmcudmFsdWUgaW50cmluc2ljIGNhbGwuCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydERiZ1ZhbHVlSW50cmluc2ljKGxsdm06OlZhbHVlICpWLCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVmFyaWFibGUgRCwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgICAgLy8vIEluc2VydERiZ1ZhbHVlSW50cmluc2ljIC0gSW5zZXJ0IGEgbmV3IGxsdm0uZGJnLnZhbHVlIGludHJpbnNpYyBjYWxsLgorICAgIEluc3RydWN0aW9uICpJbnNlcnREYmdWYWx1ZUludHJpbnNpYyhsbHZtOjpWYWx1ZSAqViwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElWYXJpYWJsZSBELCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgcHJpdmF0ZToKKyAgICBDb25zdGFudCAqR2V0VGFnQ29uc3RhbnQodW5zaWduZWQgVEFHKTsKKyAgfTsKKworICBib29sIGdldExvY2F0aW9uSW5mbyhjb25zdCBWYWx1ZSAqViwgc3RkOjpzdHJpbmcgJkRpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmVHlwZSwgdW5zaWduZWQgJkxpbmVObywgc3RkOjpzdHJpbmcgJkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZEaXIpOworCisgIC8vLyBnZXRESVN1YnByb2dyYW0gLSBGaW5kIHN1YnByb2dyYW0gdGhhdCBpcyBlbmNsb3NpbmcgdGhpcyBzY29wZS4KKyAgRElTdWJwcm9ncmFtIGdldERJU3VicHJvZ3JhbShjb25zdCBNRE5vZGUgKlNjb3BlKTsKKworICAvLy8gZ2V0RElDb21wb3NpdGVUeXBlIC0gRmluZCB1bmRlcmx5aW5nIGNvbXBvc2l0ZSB0eXBlLgorICBESUNvbXBvc2l0ZVR5cGUgZ2V0RElDb21wb3NpdGVUeXBlKERJVHlwZSBUKTsKKworICBjbGFzcyBEZWJ1Z0luZm9GaW5kZXIgeworICBwdWJsaWM6CisgICAgLy8vIHByb2Nlc3NNb2R1bGUgLSBQcm9jZXNzIGVudGlyZSBtb2R1bGUgYW5kIGNvbGxlY3QgZGVidWcgaW5mbworICAgIC8vLyBhbmNob3JzLgorICAgIHZvaWQgcHJvY2Vzc01vZHVsZShNb2R1bGUgJk0pOworCisgIHByaXZhdGU6CisgICAgLy8vIHByb2Nlc3NUeXBlIC0gUHJvY2VzcyBESVR5cGUuCisgICAgdm9pZCBwcm9jZXNzVHlwZShESVR5cGUgRFQpOworCisgICAgLy8vIHByb2Nlc3NMZXhpY2FsQmxvY2sgLSBQcm9jZXNzIERJTGV4aWNhbEJsb2NrLgorICAgIHZvaWQgcHJvY2Vzc0xleGljYWxCbG9jayhESUxleGljYWxCbG9jayBMQik7CisKKyAgICAvLy8gcHJvY2Vzc1N1YnByb2dyYW0gLSBQcm9jZXNzIERJU3VicHJvZ3JhbS4KKyAgICB2b2lkIHByb2Nlc3NTdWJwcm9ncmFtKERJU3VicHJvZ3JhbSBTUCk7CisKKyAgICAvLy8gcHJvY2Vzc0xvY2F0aW9uIC0gUHJvY2VzcyBESUxvY2F0aW9uLgorICAgIHZvaWQgcHJvY2Vzc0xvY2F0aW9uKERJTG9jYXRpb24gTG9jKTsKKworICAgIC8vLyBhZGRDb21waWxlVW5pdCAtIEFkZCBjb21waWxlIHVuaXQgaW50byBDVXMuCisgICAgYm9vbCBhZGRDb21waWxlVW5pdChESUNvbXBpbGVVbml0IENVKTsKKworICAgIC8vLyBhZGRHbG9iYWxWYXJpYWJsZSAtIEFkZCBnbG9iYWwgdmFyaWFibGUgaW50byBHVnMuCisgICAgYm9vbCBhZGRHbG9iYWxWYXJpYWJsZShESUdsb2JhbFZhcmlhYmxlIERJRyk7CisKKyAgICAvLyBhZGRTdWJwcm9ncmFtIC0gQWRkIHN1YnByZ29yYW0gaW50byBTUHMuCisgICAgYm9vbCBhZGRTdWJwcm9ncmFtKERJU3VicHJvZ3JhbSBTUCk7CisKKyAgICAvLy8gYWRkVHlwZSAtIEFkZCB0eXBlIGludG8gVHlzLgorICAgIGJvb2wgYWRkVHlwZShESVR5cGUgRFQpOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9yPE1ETm9kZSAqLCA4Pjo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgaXRlcmF0b3IgY29tcGlsZV91bml0X2JlZ2luKCkgICAgY29uc3QgeyByZXR1cm4gQ1VzLmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciBjb21waWxlX3VuaXRfZW5kKCkgICAgICBjb25zdCB7IHJldHVybiBDVXMuZW5kKCk7IH0KKyAgICBpdGVyYXRvciBzdWJwcm9ncmFtX2JlZ2luKCkgICAgICBjb25zdCB7IHJldHVybiBTUHMuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIHN1YnByb2dyYW1fZW5kKCkgICAgICAgIGNvbnN0IHsgcmV0dXJuIFNQcy5lbmQoKTsgfQorICAgIGl0ZXJhdG9yIGdsb2JhbF92YXJpYWJsZV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEdWcy5iZWdpbigpOyB9CisgICAgaXRlcmF0b3IgZ2xvYmFsX3ZhcmlhYmxlX2VuZCgpICAgY29uc3QgeyByZXR1cm4gR1ZzLmVuZCgpOyB9CisgICAgaXRlcmF0b3IgdHlwZV9iZWdpbigpICAgICAgICAgICAgY29uc3QgeyByZXR1cm4gVFlzLmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciB0eXBlX2VuZCgpICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBUWXMuZW5kKCk7IH0KKworICAgIHVuc2lnbmVkIGNvbXBpbGVfdW5pdF9jb3VudCgpICAgIGNvbnN0IHsgcmV0dXJuIENVcy5zaXplKCk7IH0KKyAgICB1bnNpZ25lZCBnbG9iYWxfdmFyaWFibGVfY291bnQoKSBjb25zdCB7IHJldHVybiBHVnMuc2l6ZSgpOyB9CisgICAgdW5zaWduZWQgc3VicHJvZ3JhbV9jb3VudCgpICAgICAgY29uc3QgeyByZXR1cm4gU1BzLnNpemUoKTsgfQorICAgIHVuc2lnbmVkIHR5cGVfY291bnQoKSAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIFRZcy5zaXplKCk7IH0KKworICBwcml2YXRlOgorICAgIFNtYWxsVmVjdG9yPE1ETm9kZSAqLCA4PiBDVXM7ICAvLyBDb21waWxlIFVuaXRzCisgICAgU21hbGxWZWN0b3I8TUROb2RlICosIDg+IFNQczsgIC8vIFN1YnByb2dyYW1zCisgICAgU21hbGxWZWN0b3I8TUROb2RlICosIDg+IEdWczsgIC8vIEdsb2JhbCBWYXJpYWJsZXM7CisgICAgU21hbGxWZWN0b3I8TUROb2RlICosIDg+IFRZczsgIC8vIFR5cGVzCisgICAgU21hbGxQdHJTZXQ8TUROb2RlICosIDY0PiBOb2Rlc1NlZW47CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21QcmludGVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9tUHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDI4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9tUHJpbnRlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vPT09LS0gRG9tUHJpbnRlci5oIC0gRG9tIHByaW50ZXIgZXh0ZXJuYWwgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGV4dGVybmFsIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gZXhwbGljaXRseQorLy8gaW5zdGFudGlhdGUgdGhlIGRvbWluYW5jZSB0cmVlIHByaW50ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0RPTVBSSU5URVJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0RPTVBSSU5URVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZ1bmN0aW9uUGFzczsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVEb21QcmludGVyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZURvbU9ubHlQcmludGVyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZURvbVZpZXdlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVEb21Pbmx5Vmlld2VyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVBvc3REb21QcmludGVyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVBvc3REb21Pbmx5UHJpbnRlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVQb3N0RG9tVmlld2VyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVBvc3REb21Pbmx5Vmlld2VyUGFzcygpOworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9taW5hdG9ySW50ZXJuYWxzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9taW5hdG9ySW50ZXJuYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxOTY4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21pbmF0b3JJbnRlcm5hbHMuaApAQCAtMCwwICsxLDM0OCBAQAorLy89PT0gbGx2bS9BbmFseXNpcy9Eb21pbmF0b3JJbnRlcm5hbHMuaCAtIERvbWluYXRvciBDYWxjdWxhdGlvbiAtKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0RPTUlOQVRPUl9JTlRFUk5BTFNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0RPTUlOQVRPUl9JTlRFUk5BTFNfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEb21pbmF0b3JUcmVlIGNvbnN0cnVjdGlvbiAtIFRoaXMgcGFzcyBjb25zdHJ1Y3RzIGltbWVkaWF0ZSBkb21pbmF0b3IKKy8vIGluZm9ybWF0aW9uIGZvciBhIGZsb3ctZ3JhcGggYmFzZWQgb24gdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gdGhpcworLy8gZG9jdW1lbnQ6CisvLworLy8gICBBIEZhc3QgQWxnb3JpdGhtIGZvciBGaW5kaW5nIERvbWluYXRvcnMgaW4gYSBGbG93Z3JhcGgKKy8vICAgVC4gTGVuZ2F1ZXIgJiBSLiBUYXJqYW4sIEFDTSBUT1BMQVMgSnVseSAxOTc5LCBwZ3MgMTIxLTE0MS4KKy8vCisvLyBUaGlzIGltcGxlbWVudHMgYm90aCB0aGUgTyhuKmFjayhuKSkgYW5kIHRoZSBPKG4qbG9nKG4pKSB2ZXJzaW9ucyBvZiBFVkFMIGFuZAorLy8gTElOSywgYnV0IGl0IHR1cm5zIG91dCB0aGF0IHRoZSB0aGVvcmV0aWNhbGx5IHNsb3dlciBPKG4qbG9nKG4pKQorLy8gaW1wbGVtZW50YXRpb24gaXMgYWN0dWFsbHkgZmFzdGVyIHRoYW4gdGhlICJlZmZpY2llbnQiIGFsZ29yaXRobSAoZXZlbiBmb3IKKy8vIGxhcmdlIENGR3MpIGJlY2F1c2UgdGhlIGNvbnN0YW50IG92ZXJoZWFkcyBhcmUgc3Vic3RhbnRpYWxseSBzbWFsbGVyLiAgVGhlCisvLyBsb3dlci1jb21wbGV4aXR5IHZlcnNpb24gY2FuIGJlIGVuYWJsZWQgd2l0aCB0aGUgZm9sbG93aW5nICNkZWZpbmU6CisvLworI2RlZmluZSBCQUxBTkNFX0lET01fVFJFRSAwCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTxjbGFzcyBHcmFwaFQ+Cit1bnNpZ25lZCBERlNQYXNzKERvbWluYXRvclRyZWVCYXNlPHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGU+JiBEVCwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogViwgdW5zaWduZWQgTikgeworICAvLyBUaGlzIGlzIG1vcmUgdW5kZXJzdGFuZGFibGUgYXMgYSByZWN1cnNpdmUgYWxnb3JpdGhtLCBidXQgd2UgY2FuJ3QgdXNlIHRoZQorICAvLyByZWN1cnNpdmUgYWxnb3JpdGhtIGR1ZSB0byBzdGFjayBkZXB0aCBpc3N1ZXMuICBLZWVwIGl0IGhlcmUgZm9yCisgIC8vIGRvY3VtZW50YXRpb24gcHVycG9zZXMuCisjaWYgMAorICBJbmZvUmVjICZWSW5mbyA9IERULkluZm9bRFQuUm9vdHNbaV1dOworICBWSW5mby5ERlNOdW0gPSBWSW5mby5TZW1pID0gKytOOworICBWSW5mby5MYWJlbCA9IFY7CisKKyAgVmVydGV4LnB1c2hfYmFjayhWKTsgICAgICAgIC8vIFZlcnRleFtuXSA9IFY7CisgIC8vSW5mb1tWXS5BbmNlc3RvciA9IDA7ICAgICAvLyBBbmNlc3RvcltuXSA9IDAKKyAgLy9JbmZvW1ZdLkNoaWxkID0gMDsgICAgICAgIC8vIENoaWxkW3ZdID0gMAorICBWSW5mby5TaXplID0gMTsgICAgICAgICAgICAgLy8gU2l6ZVt2XSA9IDEKKworICBmb3IgKHN1Y2NfaXRlcmF0b3IgU0kgPSBzdWNjX2JlZ2luKFYpLCBFID0gc3VjY19lbmQoVik7IFNJICE9IEU7ICsrU0kpIHsKKyAgICBJbmZvUmVjICZTdWNjVkluZm8gPSBEVC5JbmZvWypTSV07CisgICAgaWYgKFN1Y2NWSW5mby5TZW1pID09IDApIHsKKyAgICAgIFN1Y2NWSW5mby5QYXJlbnQgPSBWOworICAgICAgTiA9IERUREZTUGFzcyhEVCwgKlNJLCBOKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGJvb2wgSXNDaGlsT2ZBcnRpZmljaWFsRXhpdCA9IChOICE9IDApOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEdyYXBoVDo6Q2hpbGRJdGVyYXRvclR5cGU+ID4gV29ya2xpc3Q7CisgIFdvcmtsaXN0LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWLCBHcmFwaFQ6OmNoaWxkX2JlZ2luKFYpKSk7CisgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqIEJCID0gV29ya2xpc3QuYmFjaygpLmZpcnN0OworICAgIHR5cGVuYW1lIEdyYXBoVDo6Q2hpbGRJdGVyYXRvclR5cGUgTmV4dFN1Y2MgPSBXb3JrbGlzdC5iYWNrKCkuc2Vjb25kOworCisgICAgdHlwZW5hbWUgRG9taW5hdG9yVHJlZUJhc2U8dHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZT46OkluZm9SZWMgJkJCSW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERULkluZm9bQkJdOworCisgICAgLy8gRmlyc3QgdGltZSB3ZSB2aXNpdGVkIHRoaXMgQkI/CisgICAgaWYgKE5leHRTdWNjID09IEdyYXBoVDo6Y2hpbGRfYmVnaW4oQkIpKSB7CisgICAgICBCQkluZm8uREZTTnVtID0gQkJJbmZvLlNlbWkgPSArK047CisgICAgICBCQkluZm8uTGFiZWwgPSBCQjsKKworICAgICAgRFQuVmVydGV4LnB1c2hfYmFjayhCQik7ICAgICAgIC8vIFZlcnRleFtuXSA9IFY7CisgICAgICAvL0JCSW5mb1tWXS5BbmNlc3RvciA9IDA7ICAgLy8gQW5jZXN0b3Jbbl0gPSAwCisgICAgICAvL0JCSW5mb1tWXS5DaGlsZCA9IDA7ICAgICAgLy8gQ2hpbGRbdl0gPSAwCisgICAgICBCQkluZm8uU2l6ZSA9IDE7ICAgICAgICAgICAgLy8gU2l6ZVt2XSA9IDEKKworICAgICAgaWYgKElzQ2hpbE9mQXJ0aWZpY2lhbEV4aXQpCisgICAgICAgIEJCSW5mby5QYXJlbnQgPSAxOworCisgICAgICBJc0NoaWxPZkFydGlmaWNpYWxFeGl0ID0gZmFsc2U7CisgICAgfQorCisgICAgLy8gc3RvcmUgdGhlIERGUyBudW1iZXIgb2YgdGhlIGN1cnJlbnQgQkIgLSB0aGUgcmVmZXJlbmNlIHRvIEJCSW5mbyBtaWdodAorICAgIC8vIGdldCBpbnZhbGlkYXRlZCB3aGVuIHByb2Nlc3NpbmcgdGhlIHN1Y2Nlc3NvcnMuCisgICAgdW5zaWduZWQgQkJERlNOdW0gPSBCQkluZm8uREZTTnVtOworCisgICAgLy8gSWYgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGJsb2NrLCByZW1vdmUgaXQgZnJvbSB0aGUgd29ya2xpc3QuCisgICAgaWYgKE5leHRTdWNjID09IEdyYXBoVDo6Y2hpbGRfZW5kKEJCKSkgeworICAgICAgV29ya2xpc3QucG9wX2JhY2soKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIEluY3JlbWVudCB0aGUgc3VjY2Vzc29yIG51bWJlciBmb3IgdGhlIG5leHQgdGltZSB3ZSBnZXQgdG8gaXQuCisgICAgKytXb3JrbGlzdC5iYWNrKCkuc2Vjb25kOworICAgIAorICAgIC8vIFZpc2l0IHRoZSBzdWNjZXNzb3IgbmV4dCwgaWYgaXQgaXNuJ3QgYWxyZWFkeSB2aXNpdGVkLgorICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqIFN1Y2MgPSAqTmV4dFN1Y2M7CisKKyAgICB0eXBlbmFtZSBEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPjo6SW5mb1JlYyAmU3VjY1ZJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERULkluZm9bU3VjY107CisgICAgaWYgKFN1Y2NWSW5mby5TZW1pID09IDApIHsKKyAgICAgIFN1Y2NWSW5mby5QYXJlbnQgPSBCQkRGU051bTsKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihTdWNjLCBHcmFwaFQ6OmNoaWxkX2JlZ2luKFN1Y2MpKSk7CisgICAgfQorICB9CisjZW5kaWYKKyAgICByZXR1cm4gTjsKK30KKwordGVtcGxhdGU8Y2xhc3MgR3JhcGhUPgordm9pZCBDb21wcmVzcyhEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPiYgRFQsCisgICAgICAgICAgICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUgKlZJbikgeworICBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlKj4gV29yazsKKyAgU21hbGxQdHJTZXQ8dHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSosIDMyPiBWaXNpdGVkOworICB0eXBlbmFtZSBEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPjo6SW5mb1JlYyAmVkluVkFJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFQuSW5mb1tEVC5WZXJ0ZXhbRFQuSW5mb1tWSW5dLkFuY2VzdG9yXV07CisKKyAgaWYgKFZJblZBSW5mby5BbmNlc3RvciAhPSAwKQorICAgIFdvcmsucHVzaF9iYWNrKFZJbik7CisgIAorICB3aGlsZSAoIVdvcmsuZW1wdHkoKSkgeworICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqIFYgPSBXb3JrLmJhY2soKTsKKyAgICB0eXBlbmFtZSBEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPjo6SW5mb1JlYyAmVkluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFQuSW5mb1tWXTsKKyAgICB0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlKiBWQW5jZXN0b3IgPSBEVC5WZXJ0ZXhbVkluZm8uQW5jZXN0b3JdOworICAgIHR5cGVuYW1lIERvbWluYXRvclRyZWVCYXNlPHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGU+OjpJbmZvUmVjICZWQUluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERULkluZm9bVkFuY2VzdG9yXTsKKworICAgIC8vIFByb2Nlc3MgQW5jZXN0b3IgZmlyc3QKKyAgICBpZiAoVmlzaXRlZC5pbnNlcnQoVkFuY2VzdG9yKSAmJgorICAgICAgICBWQUluZm8uQW5jZXN0b3IgIT0gMCkgeworICAgICAgV29yay5wdXNoX2JhY2soVkFuY2VzdG9yKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gCisgICAgV29yay5wb3BfYmFjaygpOyAKKworICAgIC8vIFVwZGF0ZSBWSW5mbyBiYXNlZCBvbiBBbmNlc3RvciBpbmZvCisgICAgaWYgKFZBSW5mby5BbmNlc3RvciA9PSAwKQorICAgICAgY29udGludWU7CisgICAgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogVkFuY2VzdG9yTGFiZWwgPSBWQUluZm8uTGFiZWw7CisgICAgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogVkxhYmVsID0gVkluZm8uTGFiZWw7CisgICAgaWYgKERULkluZm9bVkFuY2VzdG9yTGFiZWxdLlNlbWkgPCBEVC5JbmZvW1ZMYWJlbF0uU2VtaSkKKyAgICAgIFZJbmZvLkxhYmVsID0gVkFuY2VzdG9yTGFiZWw7CisgICAgVkluZm8uQW5jZXN0b3IgPSBWQUluZm8uQW5jZXN0b3I7CisgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgR3JhcGhUPgordHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogCitFdmFsKERvbWluYXRvclRyZWVCYXNlPHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGU+JiBEVCwKKyAgICAgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSAqVikgeworICB0eXBlbmFtZSBEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPjo6SW5mb1JlYyAmVkluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFQuSW5mb1tWXTsKKyNpZiAhQkFMQU5DRV9JRE9NX1RSRUUKKyAgLy8gSGlnaGVyLWNvbXBsZXhpdHkgYnV0IGZhc3RlciBpbXBsZW1lbnRhdGlvbgorICBpZiAoVkluZm8uQW5jZXN0b3IgPT0gMCkKKyAgICByZXR1cm4gVjsKKyAgQ29tcHJlc3M8R3JhcGhUPihEVCwgVik7CisgIHJldHVybiBWSW5mby5MYWJlbDsKKyNlbHNlCisgIC8vIExvd2VyLWNvbXBsZXhpdHkgYnV0IHNsb3dlciBpbXBsZW1lbnRhdGlvbgorICBpZiAoVkluZm8uQW5jZXN0b3IgPT0gMCkKKyAgICByZXR1cm4gVkluZm8uTGFiZWw7CisgIENvbXByZXNzPEdyYXBoVD4oRFQsIFYpOworICBHcmFwaFQ6Ok5vZGVUeXBlKiBWTGFiZWwgPSBWSW5mby5MYWJlbDsKKworICBHcmFwaFQ6Ok5vZGVUeXBlKiBWQW5jZXN0b3JMYWJlbCA9IERULkluZm9bVkluZm8uQW5jZXN0b3JdLkxhYmVsOworICBpZiAoRFQuSW5mb1tWQW5jZXN0b3JMYWJlbF0uU2VtaSA+PSBEVC5JbmZvW1ZMYWJlbF0uU2VtaSkKKyAgICByZXR1cm4gVkxhYmVsOworICBlbHNlCisgICAgcmV0dXJuIFZBbmNlc3RvckxhYmVsOworI2VuZGlmCit9CisKK3RlbXBsYXRlPGNsYXNzIEdyYXBoVD4KK3ZvaWQgTGluayhEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPiYgRFQsCisgICAgICAgICAgdW5zaWduZWQgREZTTnVtViwgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogVywKKyAgICAgICAgdHlwZW5hbWUgRG9taW5hdG9yVHJlZUJhc2U8dHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZT46OkluZm9SZWMgJldJbmZvKSB7CisjaWYgIUJBTEFOQ0VfSURPTV9UUkVFCisgIC8vIEhpZ2hlci1jb21wbGV4aXR5IGJ1dCBmYXN0ZXIgaW1wbGVtZW50YXRpb24KKyAgV0luZm8uQW5jZXN0b3IgPSBERlNOdW1WOworI2Vsc2UKKyAgLy8gTG93ZXItY29tcGxleGl0eSBidXQgc2xvd2VyIGltcGxlbWVudGF0aW9uCisgIEdyYXBoVDo6Tm9kZVR5cGUqIFdMYWJlbCA9IFdJbmZvLkxhYmVsOworICB1bnNpZ25lZCBXTGFiZWxTZW1pID0gRFQuSW5mb1tXTGFiZWxdLlNlbWk7CisgIEdyYXBoVDo6Tm9kZVR5cGUqIFMgPSBXOworICBJbmZvUmVjICpTSW5mbyA9ICZEVC5JbmZvW1NdOworCisgIEdyYXBoVDo6Tm9kZVR5cGUqIFNDaGlsZCA9IFNJbmZvLT5DaGlsZDsKKyAgSW5mb1JlYyAqU0NoaWxkSW5mbyA9ICZEVC5JbmZvW1NDaGlsZF07CisKKyAgd2hpbGUgKFdMYWJlbFNlbWkgPCBEVC5JbmZvW1NDaGlsZEluZm8tPkxhYmVsXS5TZW1pKSB7CisgICAgR3JhcGhUOjpOb2RlVHlwZSogU0NoaWxkQ2hpbGQgPSBTQ2hpbGRJbmZvLT5DaGlsZDsKKyAgICBpZiAoU0luZm8tPlNpemUrRFQuSW5mb1tTQ2hpbGRDaGlsZF0uU2l6ZSA+PSAyKlNDaGlsZEluZm8tPlNpemUpIHsKKyAgICAgIFNDaGlsZEluZm8tPkFuY2VzdG9yID0gUzsKKyAgICAgIFNJbmZvLT5DaGlsZCA9IFNDaGlsZCA9IFNDaGlsZENoaWxkOworICAgICAgU0NoaWxkSW5mbyA9ICZEVC5JbmZvW1NDaGlsZF07CisgICAgfSBlbHNlIHsKKyAgICAgIFNDaGlsZEluZm8tPlNpemUgPSBTSW5mby0+U2l6ZTsKKyAgICAgIFMgPSBTSW5mby0+QW5jZXN0b3IgPSBTQ2hpbGQ7CisgICAgICBTSW5mbyA9IFNDaGlsZEluZm87CisgICAgICBTQ2hpbGQgPSBTQ2hpbGRDaGlsZDsKKyAgICAgIFNDaGlsZEluZm8gPSAmRFQuSW5mb1tTQ2hpbGRdOworICAgIH0KKyAgfQorCisgIERvbWluYXRvclRyZWVCYXNlOjpJbmZvUmVjICZWSW5mbyA9IERULkluZm9bVl07CisgIFNJbmZvLT5MYWJlbCA9IFdMYWJlbDsKKworICBhc3NlcnQoViAhPSBXICYmICJUaGUgb3B0aW1pemF0aW9uIGhlcmUgd2lsbCBub3Qgd29yayBpbiB0aGlzIGNhc2UhIik7CisgIHVuc2lnbmVkIFdTaXplID0gV0luZm8uU2l6ZTsKKyAgdW5zaWduZWQgVlNpemUgPSAoVkluZm8uU2l6ZSArPSBXU2l6ZSk7CisKKyAgaWYgKFZTaXplIDwgMipXU2l6ZSkKKyAgICBzdGQ6OnN3YXAoUywgVkluZm8uQ2hpbGQpOworCisgIHdoaWxlIChTKSB7CisgICAgU0luZm8gPSAmRFQuSW5mb1tTXTsKKyAgICBTSW5mby0+QW5jZXN0b3IgPSBWOworICAgIFMgPSBTSW5mby0+Q2hpbGQ7CisgIH0KKyNlbmRpZgorfQorCit0ZW1wbGF0ZTxjbGFzcyBGdW5jVCwgY2xhc3MgTm9kZVQ+Cit2b2lkIENhbGN1bGF0ZShEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFRyYWl0czxOb2RlVD46Ok5vZGVUeXBlPiYgRFQsCisgICAgICAgICAgICAgICBGdW5jVCYgRikgeworICB0eXBlZGVmIEdyYXBoVHJhaXRzPE5vZGVUPiBHcmFwaFQ7CisKKyAgdW5zaWduZWQgTiA9IDA7CisgIGJvb2wgTXVsdGlwbGVSb290cyA9IChEVC5Sb290cy5zaXplKCkgPiAxKTsKKyAgaWYgKE11bHRpcGxlUm9vdHMpIHsKKyAgICB0eXBlbmFtZSBEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPjo6SW5mb1JlYyAmQkJJbmZvID0KKyAgICAgICAgRFQuSW5mb1tOVUxMXTsKKyAgICBCQkluZm8uREZTTnVtID0gQkJJbmZvLlNlbWkgPSArK047CisgICAgQkJJbmZvLkxhYmVsID0gTlVMTDsKKworICAgIERULlZlcnRleC5wdXNoX2JhY2soTlVMTCk7ICAgICAgIC8vIFZlcnRleFtuXSA9IFY7CisgICAgICAvL0JCSW5mb1tWXS5BbmNlc3RvciA9IDA7ICAgLy8gQW5jZXN0b3Jbbl0gPSAwCisgICAgICAvL0JCSW5mb1tWXS5DaGlsZCA9IDA7ICAgICAgLy8gQ2hpbGRbdl0gPSAwCisgICAgQkJJbmZvLlNpemUgPSAxOyAgICAgICAgICAgIC8vIFNpemVbdl0gPSAxCisgIH0KKworICAvLyBTdGVwICMxOiBOdW1iZXIgYmxvY2tzIGluIGRlcHRoLWZpcnN0IG9yZGVyIGFuZCBpbml0aWFsaXplIHZhcmlhYmxlcyB1c2VkCisgIC8vIGluIGxhdGVyIHN0YWdlcyBvZiB0aGUgYWxnb3JpdGhtLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KERULlJvb3RzLnNpemUoKSk7CisgICAgICAgaSAhPSBlOyArK2kpCisgICAgTiA9IERGU1Bhc3M8R3JhcGhUPihEVCwgRFQuUm9vdHNbaV0sIE4pOworCisgIC8vIGl0IG1pZ2h0IGJlIHRoYXQgc29tZSBibG9ja3MgZGlkIG5vdCBnZXQgYSBERlMgbnVtYmVyIChlLmcuLCBibG9ja3Mgb2YgCisgIC8vIGluZmluaXRlIGxvb3BzKS4gSW4gdGhlc2UgY2FzZXMgYW4gYXJ0aWZpY2lhbCBleGl0IG5vZGUgaXMgcmVxdWlyZWQuCisgIE11bHRpcGxlUm9vdHMgfD0gKERULmlzUG9zdERvbWluYXRvcigpICYmIE4gIT0gRi5zaXplKCkpOworCisgIGZvciAodW5zaWduZWQgaSA9IE47IGkgPj0gMjsgLS1pKSB7CisgICAgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogVyA9IERULlZlcnRleFtpXTsKKyAgICB0eXBlbmFtZSBEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPjo6SW5mb1JlYyAmV0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFQuSW5mb1tXXTsKKworICAgIC8vIFN0ZXAgIzI6IENhbGN1bGF0ZSB0aGUgc2VtaWRvbWluYXRvcnMgb2YgYWxsIHZlcnRpY2VzCisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBzZW1pIGRvbWluYXRvciB0byBwb2ludCB0byB0aGUgcGFyZW50IG5vZGUKKyAgICBXSW5mby5TZW1pID0gV0luZm8uUGFyZW50OworICAgIHR5cGVkZWYgR3JhcGhUcmFpdHM8SW52ZXJzZTxOb2RlVD4gPiBJbnZUcmFpdHM7CisgICAgZm9yICh0eXBlbmFtZSBJbnZUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIENJID0KKyAgICAgICAgIEludlRyYWl0czo6Y2hpbGRfYmVnaW4oVyksCisgICAgICAgICBFID0gSW52VHJhaXRzOjpjaGlsZF9lbmQoVyk7IENJICE9IEU7ICsrQ0kpIHsKKyAgICAgIHR5cGVuYW1lIEludlRyYWl0czo6Tm9kZVR5cGUgKk4gPSAqQ0k7CisgICAgICBpZiAoRFQuSW5mby5jb3VudChOKSkgeyAgLy8gT25seSBpZiB0aGlzIHByZWRlY2Vzc29yIGlzIHJlYWNoYWJsZSEKKyAgICAgICAgdW5zaWduZWQgU2VtaVUgPSBEVC5JbmZvW0V2YWw8R3JhcGhUPihEVCwgTildLlNlbWk7CisgICAgICAgIGlmIChTZW1pVSA8IFdJbmZvLlNlbWkpCisgICAgICAgICAgV0luZm8uU2VtaSA9IFNlbWlVOworICAgICAgfQorICAgIH0KKworICAgIERULkluZm9bRFQuVmVydGV4W1dJbmZvLlNlbWldXS5CdWNrZXQucHVzaF9iYWNrKFcpOworCisgICAgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogV1BhcmVudCA9IERULlZlcnRleFtXSW5mby5QYXJlbnRdOworICAgIExpbms8R3JhcGhUPihEVCwgV0luZm8uUGFyZW50LCBXLCBXSW5mbyk7CisKKyAgICAvLyBTdGVwICMzOiBJbXBsaWNpdGx5IGRlZmluZSB0aGUgaW1tZWRpYXRlIGRvbWluYXRvciBvZiB2ZXJ0aWNlcworICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqPiAmV1BhcmVudEJ1Y2tldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERULkluZm9bV1BhcmVudF0uQnVja2V0OworICAgIHdoaWxlICghV1BhcmVudEJ1Y2tldC5lbXB0eSgpKSB7CisgICAgICB0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlKiBWID0gV1BhcmVudEJ1Y2tldC5iYWNrKCk7CisgICAgICBXUGFyZW50QnVja2V0LnBvcF9iYWNrKCk7CisgICAgICB0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlKiBVID0gRXZhbDxHcmFwaFQ+KERULCBWKTsKKyAgICAgIERULklEb21zW1ZdID0gRFQuSW5mb1tVXS5TZW1pIDwgRFQuSW5mb1tWXS5TZW1pID8gVSA6IFdQYXJlbnQ7CisgICAgfQorICB9CisKKyAgLy8gU3RlcCAjNDogRXhwbGljaXRseSBkZWZpbmUgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3Igb2YgZWFjaCB2ZXJ0ZXgKKyAgZm9yICh1bnNpZ25lZCBpID0gMjsgaSA8PSBOOyArK2kpIHsKKyAgICB0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlKiBXID0gRFQuVmVydGV4W2ldOworICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqJiBXSURvbSA9IERULklEb21zW1ddOworICAgIGlmIChXSURvbSAhPSBEVC5WZXJ0ZXhbRFQuSW5mb1tXXS5TZW1pXSkKKyAgICAgIFdJRG9tID0gRFQuSURvbXNbV0lEb21dOworICB9CisKKyAgaWYgKERULlJvb3RzLmVtcHR5KCkpIHJldHVybjsKKworICAvLyBBZGQgYSBub2RlIGZvciB0aGUgcm9vdC4gIFRoaXMgbm9kZSBtaWdodCBiZSB0aGUgYWN0dWFsIHJvb3QsIGlmIHRoZXJlIGlzCisgIC8vIG9uZSBleGl0IGJsb2NrLCBvciBpdCBtYXkgYmUgdGhlIHZpcnR1YWwgZXhpdCAoZGVub3RlZCBieSAoQmFzaWNCbG9jayAqKTApCisgIC8vIHdoaWNoIHBvc3Rkb21pbmF0ZXMgYWxsIHJlYWwgZXhpdHMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGV4aXQgYmxvY2tzLCBvcgorICAvLyBhbiBpbmZpbml0ZSBsb29wLgorICB0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlKiBSb290ID0gIU11bHRpcGxlUm9vdHMgPyBEVC5Sb290c1swXSA6IDA7CisKKyAgRFQuRG9tVHJlZU5vZGVzW1Jvb3RdID0gRFQuUm9vdE5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERvbVRyZWVOb2RlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPihSb290LCAwKTsKKworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSByZWFjaGFibGUgYmxvY2tzIGluIHRoZSBmdW5jdGlvbi4uLgorICBmb3IgKHVuc2lnbmVkIGkgPSAyOyBpIDw9IE47ICsraSkgeworICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqIFcgPSBEVC5WZXJ0ZXhbaV07CisKKyAgICBEb21UcmVlTm9kZUJhc2U8dHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZT4gKkJCTm9kZSA9IERULkRvbVRyZWVOb2Rlc1tXXTsKKyAgICBpZiAoQkJOb2RlKSBjb250aW51ZTsgIC8vIEhhdmVuJ3QgY2FsY3VsYXRlZCB0aGlzIG5vZGUgeWV0PworCisgICAgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogSW1tRG9tID0gRFQuZ2V0SURvbShXKTsKKworICAgIGFzc2VydChJbW1Eb20gfHwgRFQuRG9tVHJlZU5vZGVzW05VTExdKTsKKworICAgIC8vIEdldCBvciBjYWxjdWxhdGUgdGhlIG5vZGUgZm9yIHRoZSBpbW1lZGlhdGUgZG9taW5hdG9yCisgICAgRG9tVHJlZU5vZGVCYXNlPHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGU+ICpJRG9tTm9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERULmdldE5vZGVGb3JCbG9jayhJbW1Eb20pOworCisgICAgLy8gQWRkIGEgbmV3IHRyZWUgbm9kZSBmb3IgdGhpcyBCYXNpY0Jsb2NrLCBhbmQgbGluayBpdCBhcyBhIGNoaWxkIG9mCisgICAgLy8gSURvbU5vZGUKKyAgICBEb21UcmVlTm9kZUJhc2U8dHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZT4gKkMgPQorICAgICAgICAgICAgICAgICAgICBuZXcgRG9tVHJlZU5vZGVCYXNlPHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGU+KFcsIElEb21Ob2RlKTsKKyAgICBEVC5Eb21UcmVlTm9kZXNbV10gPSBJRG9tTm9kZS0+YWRkQ2hpbGQoQyk7CisgIH0KKworICAvLyBGcmVlIHRlbXBvcmFyeSBtZW1vcnkgdXNlZCB0byBjb25zdHJ1Y3QgaWRvbSdzCisgIERULklEb21zLmNsZWFyKCk7CisgIERULkluZm8uY2xlYXIoKTsKKyAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSo+KCkuc3dhcChEVC5WZXJ0ZXgpOworCisgIERULnVwZGF0ZURGU051bWJlcnMoKTsKK30KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYzZlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oCkBAIC0wLDAgKzEsMTA2OSBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oIC0gRG9taW5hdG9yIEluZm8gQ2FsY3VsYXRpb24gLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CisvLyAgMS4gRG9taW5hdG9yVHJlZTogUmVwcmVzZW50IGRvbWluYXRvcnMgYXMgYW4gZXhwbGljaXQgdHJlZSBzdHJ1Y3R1cmUuCisvLyAgMi4gRG9taW5hbmNlRnJvbnRpZXI6IENhbGN1bGF0ZSBhbmQgaG9sZCB0aGUgZG9taW5hbmNlIGZyb250aWVyIGZvciBhCisvLyAgICAgZnVuY3Rpb24uCisvLworLy8gIFRoZXNlIGRhdGEgc3RydWN0dXJlcyBhcmUgbGlzdGVkIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgY29tcGxleGl0eS4gIEl0CisvLyAgdGFrZXMgbG9uZ2VyIHRvIGNhbGN1bGF0ZSB0aGUgZG9taW5hdG9yIGZyb250aWVyLCBmb3IgZXhhbXBsZSwgdGhhbiB0aGUKKy8vICBEb21pbmF0b3JUcmVlIG1hcHBpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0RPTUlOQVRPUlNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0RPTUlOQVRPUlNfSAorCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1dyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIERvbWluYXRvckJhc2UgLSBCYXNlIGNsYXNzIHRoYXQgb3RoZXIsIG1vcmUgaW50ZXJlc3RpbmcgZG9taW5hdG9yIGFuYWx5c2VzCisvLy8gaW5oZXJpdCBmcm9tLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVQ+CitjbGFzcyBEb21pbmF0b3JCYXNlIHsKK3Byb3RlY3RlZDoKKyAgc3RkOjp2ZWN0b3I8Tm9kZVQqPiBSb290czsKKyAgY29uc3QgYm9vbCBJc1Bvc3REb21pbmF0b3JzOworICBpbmxpbmUgZXhwbGljaXQgRG9taW5hdG9yQmFzZShib29sIGlzUG9zdERvbSkgOgorICAgIFJvb3RzKCksIElzUG9zdERvbWluYXRvcnMoaXNQb3N0RG9tKSB7fQorcHVibGljOgorCisgIC8vLyBnZXRSb290cyAtIFJldHVybiB0aGUgcm9vdCBibG9ja3Mgb2YgdGhlIGN1cnJlbnQgQ0ZHLiAgVGhpcyBtYXkgaW5jbHVkZQorICAvLy8gbXVsdGlwbGUgYmxvY2tzIGlmIHdlIGFyZSBjb21wdXRpbmcgcG9zdCBkb21pbmF0b3JzLiAgRm9yIGZvcndhcmQKKyAgLy8vIGRvbWluYXRvcnMsIHRoaXMgd2lsbCBhbHdheXMgYmUgYSBzaW5nbGUgYmxvY2sgKHRoZSBlbnRyeSBub2RlKS4KKyAgLy8vCisgIGlubGluZSBjb25zdCBzdGQ6OnZlY3RvcjxOb2RlVCo+ICZnZXRSb290cygpIGNvbnN0IHsgcmV0dXJuIFJvb3RzOyB9CisKKyAgLy8vIGlzUG9zdERvbWluYXRvciAtIFJldHVybnMgdHJ1ZSBpZiBhbmFseXNpcyBiYXNlZCBvZiBwb3N0ZG9tcworICAvLy8KKyAgYm9vbCBpc1Bvc3REb21pbmF0b3IoKSBjb25zdCB7IHJldHVybiBJc1Bvc3REb21pbmF0b3JzOyB9Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEb21UcmVlTm9kZSAtIERvbWluYXRvciBUcmVlIE5vZGUKK3RlbXBsYXRlPGNsYXNzIE5vZGVUPiBjbGFzcyBEb21pbmF0b3JUcmVlQmFzZTsKK3N0cnVjdCBQb3N0RG9taW5hdG9yVHJlZTsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworCit0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVQ+CitjbGFzcyBEb21UcmVlTm9kZUJhc2UgeworICBOb2RlVCAqVGhlQkI7CisgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKklEb207CisgIHN0ZDo6dmVjdG9yPERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKj4gQ2hpbGRyZW47CisgIGludCBERlNOdW1JbiwgREZTTnVtT3V0OworCisgIHRlbXBsYXRlPGNsYXNzIE4+IGZyaWVuZCBjbGFzcyBEb21pbmF0b3JUcmVlQmFzZTsKKyAgZnJpZW5kIHN0cnVjdCBQb3N0RG9taW5hdG9yVHJlZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICo+OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gQ2hpbGRyZW4uYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIENoaWxkcmVuLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW4uYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuLmVuZCgpOyB9CisKKyAgTm9kZVQgKmdldEJsb2NrKCkgY29uc3QgeyByZXR1cm4gVGhlQkI7IH0KKyAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqZ2V0SURvbSgpIGNvbnN0IHsgcmV0dXJuIElEb207IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8RG9tVHJlZU5vZGVCYXNlPE5vZGVUPio+ICZnZXRDaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hpbGRyZW47CisgIH0KKworICBEb21UcmVlTm9kZUJhc2UoTm9kZVQgKkJCLCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICppRG9tKQorICAgIDogVGhlQkIoQkIpLCBJRG9tKGlEb20pLCBERlNOdW1JbigtMSksIERGU051bU91dCgtMSkgeyB9CisKKyAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqYWRkQ2hpbGQoRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQykgeworICAgIENoaWxkcmVuLnB1c2hfYmFjayhDKTsKKyAgICByZXR1cm4gQzsKKyAgfQorCisgIHNpemVfdCBnZXROdW1DaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hpbGRyZW4uc2l6ZSgpOworICB9CisKKyAgdm9pZCBjbGVhckFsbENoaWxkcmVuKCkgeworICAgIENoaWxkcmVuLmNsZWFyKCk7CisgIH0KKworICBib29sIGNvbXBhcmUoRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqT3RoZXIpIHsKKyAgICBpZiAoZ2V0TnVtQ2hpbGRyZW4oKSAhPSBPdGhlci0+Z2V0TnVtQ2hpbGRyZW4oKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgU21hbGxQdHJTZXQ8Tm9kZVQgKiwgND4gT3RoZXJDaGlsZHJlbjsKKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBPdGhlci0+YmVnaW4oKSwgRSA9IE90aGVyLT5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIE5vZGVUICpOZCA9ICgqSSktPmdldEJsb2NrKCk7CisgICAgICBPdGhlckNoaWxkcmVuLmluc2VydChOZCk7CisgICAgfQorCisgICAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgTm9kZVQgKk4gPSAoKkkpLT5nZXRCbG9jaygpOworICAgICAgaWYgKE90aGVyQ2hpbGRyZW4uY291bnQoTikgPT0gMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgc2V0SURvbShEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOZXdJRG9tKSB7CisgICAgYXNzZXJ0KElEb20gJiYgIk5vIGltbWVkaWF0ZSBkb21pbmF0b3I/Iik7CisgICAgaWYgKElEb20gIT0gTmV3SURvbSkgeworICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8RG9tVHJlZU5vZGVCYXNlPE5vZGVUPio+OjppdGVyYXRvciBJID0KKyAgICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChJRG9tLT5DaGlsZHJlbi5iZWdpbigpLCBJRG9tLT5DaGlsZHJlbi5lbmQoKSwgdGhpcyk7CisgICAgICBhc3NlcnQoSSAhPSBJRG9tLT5DaGlsZHJlbi5lbmQoKSAmJgorICAgICAgICAgICAgICJOb3QgaW4gaW1tZWRpYXRlIGRvbWluYXRvciBjaGlsZHJlbiBzZXQhIik7CisgICAgICAvLyBJIGFtIG5vIGxvbmdlciB5b3VyIGNoaWxkLi4uCisgICAgICBJRG9tLT5DaGlsZHJlbi5lcmFzZShJKTsKKworICAgICAgLy8gU3dpdGNoIHRvIG5ldyBkb21pbmF0b3IKKyAgICAgIElEb20gPSBOZXdJRG9tOworICAgICAgSURvbS0+Q2hpbGRyZW4ucHVzaF9iYWNrKHRoaXMpOworICAgIH0KKyAgfQorCisgIC8vLyBnZXRERlNOdW1Jbi9nZXRERlNOdW1PdXQgLSBUaGVzZSBhcmUgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLCBkbworICAvLy8gbm90IGNhbGwgdGhlbS4KKyAgdW5zaWduZWQgZ2V0REZTTnVtSW4oKSBjb25zdCB7IHJldHVybiBERlNOdW1JbjsgfQorICB1bnNpZ25lZCBnZXRERlNOdW1PdXQoKSBjb25zdCB7IHJldHVybiBERlNOdW1PdXQ7IH0KK3ByaXZhdGU6CisgIC8vIFJldHVybiB0cnVlIGlmIHRoaXMgbm9kZSBpcyBkb21pbmF0ZWQgYnkgb3RoZXIuIFVzZSB0aGlzIG9ubHkgaWYgREZTIGluZm8KKyAgLy8gaXMgdmFsaWQuCisgIGJvb2wgRG9taW5hdGVkQnkoY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+REZTTnVtSW4gPj0gb3RoZXItPkRGU051bUluICYmCisgICAgICB0aGlzLT5ERlNOdW1PdXQgPD0gb3RoZXItPkRGU051bU91dDsKKyAgfQorfTsKKworRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgRG9tVHJlZU5vZGVCYXNlPEJhc2ljQmxvY2s+KTsKK0VYVEVSTl9URU1QTEFURV9JTlNUQU5USUFUSU9OKGNsYXNzIERvbVRyZWVOb2RlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaz4pOworCit0ZW1wbGF0ZTxjbGFzcyBOb2RlVD4KK3N0YXRpYyByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOb2RlKSB7CisgIGlmIChOb2RlLT5nZXRCbG9jaygpKQorICAgIFdyaXRlQXNPcGVyYW5kKG8sIE5vZGUtPmdldEJsb2NrKCksIGZhbHNlKTsKKyAgZWxzZQorICAgIG8gPDwgIiA8PGV4aXQgbm9kZT4+IjsKKworICBvIDw8ICIgeyIgPDwgTm9kZS0+Z2V0REZTTnVtSW4oKSA8PCAiLCIgPDwgTm9kZS0+Z2V0REZTTnVtT3V0KCkgPDwgIn0iOworCisgIHJldHVybiBvIDw8ICJcbiI7Cit9CisKK3RlbXBsYXRlPGNsYXNzIE5vZGVUPgorc3RhdGljIHZvaWQgUHJpbnREb21UcmVlKGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk4sIHJhd19vc3RyZWFtICZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExldikgeworICBvLmluZGVudCgyKkxldikgPDwgIlsiIDw8IExldiA8PCAiXSAiIDw8IE47CisgIGZvciAodHlwZW5hbWUgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPjo6Y29uc3RfaXRlcmF0b3IgSSA9IE4tPmJlZ2luKCksCisgICAgICAgRSA9IE4tPmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBQcmludERvbVRyZWU8Tm9kZVQ+KCpJLCBvLCBMZXYrMSk7Cit9CisKK3R5cGVkZWYgRG9tVHJlZU5vZGVCYXNlPEJhc2ljQmxvY2s+IERvbVRyZWVOb2RlOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIERvbWluYXRvclRyZWUgLSBDYWxjdWxhdGUgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3IgdHJlZSBmb3IgYSBmdW5jdGlvbi4KKy8vLworCit0ZW1wbGF0ZTxjbGFzcyBGdW5jVCwgY2xhc3MgTj4KK3ZvaWQgQ2FsY3VsYXRlKERvbWluYXRvclRyZWVCYXNlPHR5cGVuYW1lIEdyYXBoVHJhaXRzPE4+OjpOb2RlVHlwZT4mIERULAorICAgICAgICAgICAgICAgRnVuY1QmIEYpOworCit0ZW1wbGF0ZTxjbGFzcyBOb2RlVD4KK2NsYXNzIERvbWluYXRvclRyZWVCYXNlIDogcHVibGljIERvbWluYXRvckJhc2U8Tm9kZVQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBEZW5zZU1hcDxOb2RlVCosIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4qPiBEb21UcmVlTm9kZU1hcFR5cGU7CisgIERvbVRyZWVOb2RlTWFwVHlwZSBEb21UcmVlTm9kZXM7CisgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKlJvb3ROb2RlOworCisgIGJvb2wgREZTSW5mb1ZhbGlkOworICB1bnNpZ25lZCBpbnQgU2xvd1F1ZXJpZXM7CisgIC8vIEluZm9ybWF0aW9uIHJlY29yZCB1c2VkIGR1cmluZyBpbW1lZGlhdGUgZG9taW5hdG9ycyBjb21wdXRhdGlvbi4KKyAgc3RydWN0IEluZm9SZWMgeworICAgIHVuc2lnbmVkIERGU051bTsKKyAgICB1bnNpZ25lZCBTZW1pOworICAgIHVuc2lnbmVkIFNpemU7CisgICAgTm9kZVQgKkxhYmVsLCAqQ2hpbGQ7CisgICAgdW5zaWduZWQgUGFyZW50LCBBbmNlc3RvcjsKKworICAgIHN0ZDo6dmVjdG9yPE5vZGVUKj4gQnVja2V0OworCisgICAgSW5mb1JlYygpIDogREZTTnVtKDApLCBTZW1pKDApLCBTaXplKDApLCBMYWJlbCgwKSwgQ2hpbGQoMCksIFBhcmVudCgwKSwKKyAgICAgICAgICAgICAgICBBbmNlc3RvcigwKSB7fQorICB9OworCisgIERlbnNlTWFwPE5vZGVUKiwgTm9kZVQqPiBJRG9tczsKKworICAvLyBWZXJ0ZXggLSBNYXAgdGhlIERGUyBudW1iZXIgdG8gdGhlIEJhc2ljQmxvY2sqCisgIHN0ZDo6dmVjdG9yPE5vZGVUKj4gVmVydGV4OworCisgIC8vIEluZm8gLSBDb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIHVzZWQgZHVyaW5nIHRoZSBjb21wdXRhdGlvbiBvZiBpZG9tcy4KKyAgRGVuc2VNYXA8Tm9kZVQqLCBJbmZvUmVjPiBJbmZvOworCisgIHZvaWQgcmVzZXQoKSB7CisgICAgZm9yICh0eXBlbmFtZSBEb21UcmVlTm9kZU1hcFR5cGU6Oml0ZXJhdG9yIEkgPSB0aGlzLT5Eb21UcmVlTm9kZXMuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IERvbVRyZWVOb2Rlcy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBkZWxldGUgSS0+c2Vjb25kOworICAgIERvbVRyZWVOb2Rlcy5jbGVhcigpOworICAgIElEb21zLmNsZWFyKCk7CisgICAgdGhpcy0+Um9vdHMuY2xlYXIoKTsKKyAgICBWZXJ0ZXguY2xlYXIoKTsKKyAgICBSb290Tm9kZSA9IDA7CisgIH0KKworICAvLyBOZXdCQiBpcyBzcGxpdCBhbmQgbm93IGl0IGhhcyBvbmUgc3VjY2Vzc29yLiBVcGRhdGUgZG9taW5hdG9yIHRyZWUgdG8KKyAgLy8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKyAgdGVtcGxhdGU8Y2xhc3MgTiwgY2xhc3MgR3JhcGhUPgorICB2b2lkIFNwbGl0KERvbWluYXRvclRyZWVCYXNlPHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGU+JiBEVCwKKyAgICAgICAgICAgICB0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlKiBOZXdCQikgeworICAgIGFzc2VydChzdGQ6OmRpc3RhbmNlKEdyYXBoVDo6Y2hpbGRfYmVnaW4oTmV3QkIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoVDo6Y2hpbGRfZW5kKE5ld0JCKSkgPT0gMSAmJgorICAgICAgICAgICAiTmV3QkIgc2hvdWxkIGhhdmUgYSBzaW5nbGUgc3VjY2Vzc29yISIpOworICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqIE5ld0JCU3VjYyA9ICpHcmFwaFQ6OmNoaWxkX2JlZ2luKE5ld0JCKTsKKworICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqPiBQcmVkQmxvY2tzOworICAgIHR5cGVkZWYgR3JhcGhUcmFpdHM8SW52ZXJzZTxOPiA+IEludlRyYWl0czsKKyAgICBmb3IgKHR5cGVuYW1lIEludlRyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGUgUEkgPQorICAgICAgICAgSW52VHJhaXRzOjpjaGlsZF9iZWdpbihOZXdCQiksCisgICAgICAgICBQRSA9IEludlRyYWl0czo6Y2hpbGRfZW5kKE5ld0JCKTsgUEkgIT0gUEU7ICsrUEkpCisgICAgICBQcmVkQmxvY2tzLnB1c2hfYmFjaygqUEkpOworCisgICAgYXNzZXJ0KCFQcmVkQmxvY2tzLmVtcHR5KCkgJiYgIk5vIHByZWRibG9ja3M/Iik7CisKKyAgICBib29sIE5ld0JCRG9taW5hdGVzTmV3QkJTdWNjID0gdHJ1ZTsKKyAgICBmb3IgKHR5cGVuYW1lIEludlRyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGUgUEkgPQorICAgICAgICAgSW52VHJhaXRzOjpjaGlsZF9iZWdpbihOZXdCQlN1Y2MpLAorICAgICAgICAgRSA9IEludlRyYWl0czo6Y2hpbGRfZW5kKE5ld0JCU3VjYyk7IFBJICE9IEU7ICsrUEkpIHsKKyAgICAgIHR5cGVuYW1lIEludlRyYWl0czo6Tm9kZVR5cGUgKk5EID0gKlBJOworICAgICAgaWYgKE5EICE9IE5ld0JCICYmICFEVC5kb21pbmF0ZXMoTmV3QkJTdWNjLCBORCkgJiYKKyAgICAgICAgICBEVC5pc1JlYWNoYWJsZUZyb21FbnRyeShORCkpIHsKKyAgICAgICAgTmV3QkJEb21pbmF0ZXNOZXdCQlN1Y2MgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRmluZCBOZXdCQidzIGltbWVkaWF0ZSBkb21pbmF0b3IgYW5kIGNyZWF0ZSBuZXcgZG9taW5hdG9yIHRyZWUgbm9kZSBmb3IKKyAgICAvLyBOZXdCQi4KKyAgICBOb2RlVCAqTmV3QkJJRG9tID0gMDsKKyAgICB1bnNpZ25lZCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHJlZEJsb2Nrcy5zaXplKCk7ICsraSkKKyAgICAgIGlmIChEVC5pc1JlYWNoYWJsZUZyb21FbnRyeShQcmVkQmxvY2tzW2ldKSkgeworICAgICAgICBOZXdCQklEb20gPSBQcmVkQmxvY2tzW2ldOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCBub25lIG9mIHRoZSBwcmVkZWNlc3NvcnMgb2YgTmV3QkIgYXJlIHJlYWNoYWJsZTsKKyAgICAvLyBpbiB0aGF0IGNhc2UsIE5ld0JCIGl0c2VsZiBpcyB1bnJlYWNoYWJsZSwgc28gbm90aGluZyBuZWVkcyB0byBiZQorICAgIC8vIGNoYW5nZWQuCisgICAgaWYgKCFOZXdCQklEb20pCisgICAgICByZXR1cm47CisKKyAgICBmb3IgKGkgPSBpICsgMTsgaSA8IFByZWRCbG9ja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChEVC5pc1JlYWNoYWJsZUZyb21FbnRyeShQcmVkQmxvY2tzW2ldKSkKKyAgICAgICAgTmV3QkJJRG9tID0gRFQuZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoTmV3QkJJRG9tLCBQcmVkQmxvY2tzW2ldKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG5ldyBkb21pbmF0b3IgdHJlZSBub2RlLi4uIGFuZCBzZXQgdGhlIGlkb20gb2YgTmV3QkIuCisgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTmV3QkJOb2RlID0gRFQuYWRkTmV3QmxvY2soTmV3QkIsIE5ld0JCSURvbSk7CisKKyAgICAvLyBJZiBOZXdCQiBzdHJpY3RseSBkb21pbmF0ZXMgb3RoZXIgYmxvY2tzLCB0aGVuIGl0IGlzIG5vdyB0aGUgaW1tZWRpYXRlCisgICAgLy8gZG9taW5hdG9yIG9mIE5ld0JCU3VjYy4gIFVwZGF0ZSB0aGUgZG9taW5hdG9yIHRyZWUgYXMgYXBwcm9wcmlhdGUuCisgICAgaWYgKE5ld0JCRG9taW5hdGVzTmV3QkJTdWNjKSB7CisgICAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOZXdCQlN1Y2NOb2RlID0gRFQuZ2V0Tm9kZShOZXdCQlN1Y2MpOworICAgICAgRFQuY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE5ld0JCU3VjY05vZGUsIE5ld0JCTm9kZSk7CisgICAgfQorICB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRG9taW5hdG9yVHJlZUJhc2UoYm9vbCBpc1Bvc3REb20pCisgICAgOiBEb21pbmF0b3JCYXNlPE5vZGVUPihpc1Bvc3REb20pLCBERlNJbmZvVmFsaWQoZmFsc2UpLCBTbG93UXVlcmllcygwKSB7fQorICB2aXJ0dWFsIH5Eb21pbmF0b3JUcmVlQmFzZSgpIHsgcmVzZXQoKTsgfQorCisgIC8vIEZJWE1FOiBTaG91bGQgcmVtb3ZlIHRoaXMKKyAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIGNvbXBhcmUgLSBSZXR1cm4gZmFsc2UgaWYgdGhlIG90aGVyIGRvbWluYXRvciB0cmVlIGJhc2UgbWF0Y2hlcyB0aGlzCisgIC8vLyBkb21pbmF0b3IgdHJlZSBiYXNlLiBPdGhlcndpc2UgcmV0dXJuIHRydWUuCisgIGJvb2wgY29tcGFyZShEb21pbmF0b3JUcmVlQmFzZSAmT3RoZXIpIGNvbnN0IHsKKworICAgIGNvbnN0IERvbVRyZWVOb2RlTWFwVHlwZSAmT3RoZXJEb21UcmVlTm9kZXMgPSBPdGhlci5Eb21UcmVlTm9kZXM7CisgICAgaWYgKERvbVRyZWVOb2Rlcy5zaXplKCkgIT0gT3RoZXJEb21UcmVlTm9kZXMuc2l6ZSgpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmb3IgKHR5cGVuYW1lIERvbVRyZWVOb2RlTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgSSA9IHRoaXMtPkRvbVRyZWVOb2Rlcy5iZWdpbigpLAorICAgICAgICAgICBFID0gdGhpcy0+RG9tVHJlZU5vZGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgTm9kZVQgKkJCID0gSS0+Zmlyc3Q7CisgICAgICB0eXBlbmFtZSBEb21UcmVlTm9kZU1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIE9JID0gT3RoZXJEb21UcmVlTm9kZXMuZmluZChCQik7CisgICAgICBpZiAoT0kgPT0gT3RoZXJEb21UcmVlTm9kZXMuZW5kKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+KiBNeU5kID0gSS0+c2Vjb25kOworICAgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiogT3RoZXJOZCA9IE9JLT5zZWNvbmQ7CisKKyAgICAgIGlmIChNeU5kLT5jb21wYXJlKE90aGVyTmQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpIHsgcmVzZXQoKTsgfQorCisgIC8vLyBnZXROb2RlIC0gcmV0dXJuIHRoZSAoUG9zdClEb21pbmF0b3JUcmVlIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFzaWMKKyAgLy8vIGJsb2NrLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB1c2luZyBvcGVyYXRvcltdIG9uIHRoaXMgY2xhc3MuCisgIC8vLworICBpbmxpbmUgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqZ2V0Tm9kZShOb2RlVCAqQkIpIGNvbnN0IHsKKyAgICB0eXBlbmFtZSBEb21UcmVlTm9kZU1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIEkgPSBEb21UcmVlTm9kZXMuZmluZChCQik7CisgICAgcmV0dXJuIEkgIT0gRG9tVHJlZU5vZGVzLmVuZCgpID8gSS0+c2Vjb25kIDogMDsKKyAgfQorCisgIC8vLyBnZXRSb290Tm9kZSAtIFRoaXMgcmV0dXJucyB0aGUgZW50cnkgbm9kZSBmb3IgdGhlIENGRyBvZiB0aGUgZnVuY3Rpb24uICBJZgorICAvLy8gdGhpcyB0cmVlIHJlcHJlc2VudHMgdGhlIHBvc3QtZG9taW5hbmNlIHJlbGF0aW9ucyBmb3IgYSBmdW5jdGlvbiwgaG93ZXZlciwKKyAgLy8vIHRoaXMgcm9vdCBtYXkgYmUgYSBub2RlIHdpdGggdGhlIGJsb2NrID09IE5VTEwuICBUaGlzIGlzIHRoZSBjYXNlIHdoZW4KKyAgLy8vIHRoZXJlIGFyZSBtdWx0aXBsZSBleGl0IG5vZGVzIGZyb20gYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLiAgQ29uc3VtZXJzIG9mCisgIC8vLyBwb3N0LWRvbWluYW5jZSBpbmZvcm1hdGlvbiBtdXN0IGJlIGNhcGFibGUgb2YgZGVhbGluZyB3aXRoIHRoaXMKKyAgLy8vIHBvc3NpYmlsaXR5LgorICAvLy8KKyAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqZ2V0Um9vdE5vZGUoKSB7IHJldHVybiBSb290Tm9kZTsgfQorICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpnZXRSb290Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIFJvb3ROb2RlOyB9CisKKyAgLy8vIHByb3Blcmx5RG9taW5hdGVzIC0gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGRvbWluYXRlcyBOIGFuZCB0aGlzICE9IE4uCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBjb25zdGFudCB0aW1lIG9wZXJhdGlvbiEKKyAgLy8vCisgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpCKSBjb25zdCB7CisgICAgaWYgKEEgPT0gMCB8fCBCID09IDApIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gZG9taW5hdGVkQnlTbG93VHJlZVdhbGsoQSwgQik7CisgIH0KKworICBpbmxpbmUgYm9vbCBwcm9wZXJseURvbWluYXRlcyhOb2RlVCAqQSwgTm9kZVQgKkIpIHsKKyAgICByZXR1cm4gcHJvcGVybHlEb21pbmF0ZXMoZ2V0Tm9kZShBKSwgZ2V0Tm9kZShCKSk7CisgIH0KKworICBib29sIGRvbWluYXRlZEJ5U2xvd1RyZWVXYWxrKGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQikgY29uc3QgeworICAgIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKklEb207CisgICAgaWYgKEEgPT0gMCB8fCBCID09IDApIHJldHVybiBmYWxzZTsKKyAgICB3aGlsZSAoKElEb20gPSBCLT5nZXRJRG9tKCkpICE9IDAgJiYgSURvbSAhPSBBICYmIElEb20gIT0gQikKKyAgICAgIEIgPSBJRG9tOyAgIC8vIFdhbGsgdXAgdGhlIHRyZWUKKyAgICByZXR1cm4gSURvbSAhPSAwOworICB9CisKKworICAvLy8gaXNSZWFjaGFibGVGcm9tRW50cnkgLSBSZXR1cm4gdHJ1ZSBpZiBBIGlzIGRvbWluYXRlZCBieSB0aGUgZW50cnkKKyAgLy8vIGJsb2NrIG9mIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIGl0LgorICBib29sIGlzUmVhY2hhYmxlRnJvbUVudHJ5KE5vZGVUKiBBKSB7CisgICAgYXNzZXJ0KCF0aGlzLT5pc1Bvc3REb21pbmF0b3IoKSAmJgorICAgICAgICAgICAiVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHBvc3QgZG9taW5hdG9ycyIpOworICAgIHJldHVybiBkb21pbmF0ZXMoJkEtPmdldFBhcmVudCgpLT5mcm9udCgpLCBBKTsKKyAgfQorCisgIC8vLyBkb21pbmF0ZXMgLSBSZXR1cm5zIHRydWUgaWZmIEEgZG9taW5hdGVzIEIuICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYQorICAvLy8gY29uc3RhbnQgdGltZSBvcGVyYXRpb24hCisgIC8vLworICBpbmxpbmUgYm9vbCBkb21pbmF0ZXMoY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKkIpIHsKKyAgICBpZiAoQiA9PSBBKQorICAgICAgcmV0dXJuIHRydWU7ICAvLyBBIG5vZGUgdHJpdmlhbGx5IGRvbWluYXRlcyBpdHNlbGYuCisKKyAgICBpZiAoQSA9PSAwIHx8IEIgPT0gMCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIENvbXBhcmUgdGhlIHJlc3VsdCBvZiB0aGUgdHJlZSB3YWxrIGFuZCB0aGUgZGZzIG51bWJlcnMsIGlmIGV4cGVuc2l2ZQorICAgIC8vIGNoZWNrcyBhcmUgZW5hYmxlZC4KKyNpZmRlZiBYREVCVUcKKyAgICBhc3NlcnQoKCFERlNJbmZvVmFsaWQgfHwKKyAgICAgICAgICAgIChkb21pbmF0ZWRCeVNsb3dUcmVlV2FsayhBLCBCKSA9PSBCLT5Eb21pbmF0ZWRCeShBKSkpICYmCisgICAgICAgICAgICJUcmVlIHdhbGsgZGlzYWdyZWVzIHdpdGggZGZzIG51bWJlcnMhIik7CisjZW5kaWYKKworICAgIGlmIChERlNJbmZvVmFsaWQpCisgICAgICByZXR1cm4gQi0+RG9taW5hdGVkQnkoQSk7CisKKyAgICAvLyBJZiB3ZSBlbmQgdXAgd2l0aCB0b28gbWFueSBzbG93IHF1ZXJpZXMsIGp1c3QgdXBkYXRlIHRoZQorICAgIC8vIERGUyBudW1iZXJzIG9uIHRoZSB0aGVvcnkgdGhhdCB3ZSBhcmUgZ29pbmcgdG8ga2VlcCBxdWVyeWluZy4KKyAgICBTbG93UXVlcmllcysrOworICAgIGlmIChTbG93UXVlcmllcyA+IDMyKSB7CisgICAgICB1cGRhdGVERlNOdW1iZXJzKCk7CisgICAgICByZXR1cm4gQi0+RG9taW5hdGVkQnkoQSk7CisgICAgfQorCisgICAgcmV0dXJuIGRvbWluYXRlZEJ5U2xvd1RyZWVXYWxrKEEsIEIpOworICB9CisKKyAgaW5saW5lIGJvb2wgZG9taW5hdGVzKGNvbnN0IE5vZGVUICpBLCBjb25zdCBOb2RlVCAqQikgeworICAgIGlmIChBID09IEIpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIENhc3QgYXdheSB0aGUgY29uc3QgcXVhbGlmaWVycyBoZXJlLiBUaGlzIGlzIG9rIHNpbmNlCisgICAgLy8gdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGFjdHVhbGx5IHJldHVybiB0aGUgdmFsdWVzIHJldHVybmVkCisgICAgLy8gZnJvbSBnZXROb2RlLgorICAgIHJldHVybiBkb21pbmF0ZXMoZ2V0Tm9kZShjb25zdF9jYXN0PE5vZGVUICo+KEEpKSwKKyAgICAgICAgICAgICAgICAgICAgIGdldE5vZGUoY29uc3RfY2FzdDxOb2RlVCAqPihCKSkpOworICB9CisKKyAgTm9kZVQgKmdldFJvb3QoKSBjb25zdCB7CisgICAgYXNzZXJ0KHRoaXMtPlJvb3RzLnNpemUoKSA9PSAxICYmICJTaG91bGQgYWx3YXlzIGhhdmUgZW50cnkgbm9kZSEiKTsKKyAgICByZXR1cm4gdGhpcy0+Um9vdHNbMF07CisgIH0KKworICAvLy8gZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IgLSBGaW5kIG5lYXJlc3QgY29tbW9uIGRvbWluYXRvciBiYXNpYyBibG9jaworICAvLy8gZm9yIGJhc2ljIGJsb2NrIEEgYW5kIEIuIElmIHRoZXJlIGlzIG5vIHN1Y2ggYmxvY2sgdGhlbiByZXR1cm4gTlVMTC4KKyAgTm9kZVQgKmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKE5vZGVUICpBLCBOb2RlVCAqQikgeworICAgIGFzc2VydChBLT5nZXRQYXJlbnQoKSA9PSBCLT5nZXRQYXJlbnQoKSAmJgorICAgICAgICAgICAiVHdvIGJsb2NrcyBhcmUgbm90IGluIHNhbWUgZnVuY3Rpb24iKTsKKworICAgIC8vIElmIGVpdGhlciBBIG9yIEIgaXMgYSBlbnRyeSBibG9jayB0aGVuIGl0IGlzIG5lYXJlc3QgY29tbW9uIGRvbWluYXRvcgorICAgIC8vIChmb3IgZm9yd2FyZC1kb21pbmF0b3JzKS4KKyAgICBpZiAoIXRoaXMtPmlzUG9zdERvbWluYXRvcigpKSB7CisgICAgICBOb2RlVCAmRW50cnkgPSBBLT5nZXRQYXJlbnQoKS0+ZnJvbnQoKTsKKyAgICAgIGlmIChBID09ICZFbnRyeSB8fCBCID09ICZFbnRyeSkKKyAgICAgICAgcmV0dXJuICZFbnRyeTsKKyAgICB9CisKKyAgICAvLyBJZiBCIGRvbWluYXRlcyBBIHRoZW4gQiBpcyBuZWFyZXN0IGNvbW1vbiBkb21pbmF0b3IuCisgICAgaWYgKGRvbWluYXRlcyhCLCBBKSkKKyAgICAgIHJldHVybiBCOworCisgICAgLy8gSWYgQSBkb21pbmF0ZXMgQiB0aGVuIEEgaXMgbmVhcmVzdCBjb21tb24gZG9taW5hdG9yLgorICAgIGlmIChkb21pbmF0ZXMoQSwgQikpCisgICAgICByZXR1cm4gQTsKKworICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk5vZGVBID0gZ2V0Tm9kZShBKTsKKyAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOb2RlQiA9IGdldE5vZGUoQik7CisKKyAgICAvLyBDb2xsZWN0IE5vZGVBIGRvbWluYXRvcnMgc2V0LgorICAgIFNtYWxsUHRyU2V0PERvbVRyZWVOb2RlQmFzZTxOb2RlVD4qLCAxNj4gTm9kZUFEb21zOworICAgIE5vZGVBRG9tcy5pbnNlcnQoTm9kZUEpOworICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKklEb21BID0gTm9kZUEtPmdldElEb20oKTsKKyAgICB3aGlsZSAoSURvbUEpIHsKKyAgICAgIE5vZGVBRG9tcy5pbnNlcnQoSURvbUEpOworICAgICAgSURvbUEgPSBJRG9tQS0+Z2V0SURvbSgpOworICAgIH0KKworICAgIC8vIFdhbGsgTm9kZUIgaW1tZWRpYXRlIGRvbWluYXRvcnMgY2hhaW4gYW5kIGZpbmQgY29tbW9uIGRvbWluYXRvciBub2RlLgorICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKklEb21CID0gTm9kZUItPmdldElEb20oKTsKKyAgICB3aGlsZSAoSURvbUIpIHsKKyAgICAgIGlmIChOb2RlQURvbXMuY291bnQoSURvbUIpICE9IDApCisgICAgICAgIHJldHVybiBJRG9tQi0+Z2V0QmxvY2soKTsKKworICAgICAgSURvbUIgPSBJRG9tQi0+Z2V0SURvbSgpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFQSSB0byB1cGRhdGUgKFBvc3QpRG9taW5hdG9yVHJlZSBpbmZvcm1hdGlvbiBiYXNlZCBvbiBtb2RpZmljYXRpb25zIHRvCisgIC8vIHRoZSBDRkcuLi4KKworICAvLy8gYWRkTmV3QmxvY2sgLSBBZGQgYSBuZXcgbm9kZSB0byB0aGUgZG9taW5hdG9yIHRyZWUgaW5mb3JtYXRpb24uICBUaGlzCisgIC8vLyBjcmVhdGVzIGEgbmV3IG5vZGUgYXMgYSBjaGlsZCBvZiBEb21CQiBkb21pbmF0b3Igbm9kZSxsaW5raW5nIGl0IGludG8KKyAgLy8vIHRoZSBjaGlsZHJlbiBsaXN0IG9mIHRoZSBpbW1lZGlhdGUgZG9taW5hdG9yLgorICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICphZGROZXdCbG9jayhOb2RlVCAqQkIsIE5vZGVUICpEb21CQikgeworICAgIGFzc2VydChnZXROb2RlKEJCKSA9PSAwICYmICJCbG9jayBhbHJlYWR5IGluIGRvbWluYXRvciB0cmVlISIpOworICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKklEb21Ob2RlID0gZ2V0Tm9kZShEb21CQik7CisgICAgYXNzZXJ0KElEb21Ob2RlICYmICJOb3QgaW1tZWRpYXRlIGRvbWluYXRvciBzcGVjaWZpZWQgZm9yIGJsb2NrISIpOworICAgIERGU0luZm9WYWxpZCA9IGZhbHNlOworICAgIHJldHVybiBEb21UcmVlTm9kZXNbQkJdID0KKyAgICAgIElEb21Ob2RlLT5hZGRDaGlsZChuZXcgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPihCQiwgSURvbU5vZGUpKTsKKyAgfQorCisgIC8vLyBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgZG9taW5hdG9yCisgIC8vLyB0cmVlIGluZm9ybWF0aW9uIHdoZW4gYSBub2RlJ3MgaW1tZWRpYXRlIGRvbWluYXRvciBjaGFuZ2VzLgorICAvLy8KKyAgdm9pZCBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTmV3SURvbSkgeworICAgIGFzc2VydChOICYmIE5ld0lEb20gJiYgIkNhbm5vdCBjaGFuZ2UgbnVsbCBub2RlIHBvaW50ZXJzISIpOworICAgIERGU0luZm9WYWxpZCA9IGZhbHNlOworICAgIE4tPnNldElEb20oTmV3SURvbSk7CisgIH0KKworICB2b2lkIGNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihOb2RlVCAqQkIsIE5vZGVUICpOZXdCQikgeworICAgIGNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihnZXROb2RlKEJCKSwgZ2V0Tm9kZShOZXdCQikpOworICB9CisKKyAgLy8vIGVyYXNlTm9kZSAtIFJlbW92ZXMgYSBub2RlIGZyb20gdGhlIGRvbWluYXRvciB0cmVlLiBCbG9jayBtdXN0IG5vdAorICAvLy8gZG9taWFudGUgYW55IG90aGVyIGJsb2Nrcy4gUmVtb3ZlcyBub2RlIGZyb20gaXRzIGltbWVkaWF0ZSBkb21pbmF0b3IncworICAvLy8gY2hpbGRyZW4gbGlzdC4gRGVsZXRlcyBkb21pbmF0b3Igbm9kZSBhc3NvY2lhdGVkIHdpdGggYmFzaWMgYmxvY2sgQkIuCisgIHZvaWQgZXJhc2VOb2RlKE5vZGVUICpCQikgeworICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk5vZGUgPSBnZXROb2RlKEJCKTsKKyAgICBhc3NlcnQoTm9kZSAmJiAiUmVtb3Zpbmcgbm9kZSB0aGF0IGlzbid0IGluIGRvbWluYXRvciB0cmVlLiIpOworICAgIGFzc2VydChOb2RlLT5nZXRDaGlsZHJlbigpLmVtcHR5KCkgJiYgIk5vZGUgaXMgbm90IGEgbGVhZiBub2RlLiIpOworCisgICAgICAvLyBSZW1vdmUgbm9kZSBmcm9tIGltbWVkaWF0ZSBkb21pbmF0b3IncyBjaGlsZHJlbiBsaXN0LgorICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKklEb20gPSBOb2RlLT5nZXRJRG9tKCk7CisgICAgaWYgKElEb20pIHsKKyAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPERvbVRyZWVOb2RlQmFzZTxOb2RlVD4qPjo6aXRlcmF0b3IgSSA9CisgICAgICAgIHN0ZDo6ZmluZChJRG9tLT5DaGlsZHJlbi5iZWdpbigpLCBJRG9tLT5DaGlsZHJlbi5lbmQoKSwgTm9kZSk7CisgICAgICBhc3NlcnQoSSAhPSBJRG9tLT5DaGlsZHJlbi5lbmQoKSAmJgorICAgICAgICAgICAgICJOb3QgaW4gaW1tZWRpYXRlIGRvbWluYXRvciBjaGlsZHJlbiBzZXQhIik7CisgICAgICAvLyBJIGFtIG5vIGxvbmdlciB5b3VyIGNoaWxkLi4uCisgICAgICBJRG9tLT5DaGlsZHJlbi5lcmFzZShJKTsKKyAgICB9CisKKyAgICBEb21UcmVlTm9kZXMuZXJhc2UoQkIpOworICAgIGRlbGV0ZSBOb2RlOworICB9CisKKyAgLy8vIHJlbW92ZU5vZGUgLSBSZW1vdmVzIGEgbm9kZSBmcm9tIHRoZSBkb21pbmF0b3IgdHJlZS4gIEJsb2NrIG11c3Qgbm90CisgIC8vLyBkb21pbmF0ZSBhbnkgb3RoZXIgYmxvY2tzLiAgSW52YWxpZGF0ZXMgYW55IG5vZGUgcG9pbnRpbmcgdG8gcmVtb3ZlZAorICAvLy8gYmxvY2suCisgIHZvaWQgcmVtb3ZlTm9kZShOb2RlVCAqQkIpIHsKKyAgICBhc3NlcnQoZ2V0Tm9kZShCQikgJiYgIlJlbW92aW5nIG5vZGUgdGhhdCBpc24ndCBpbiBkb21pbmF0b3IgdHJlZS4iKTsKKyAgICBEb21UcmVlTm9kZXMuZXJhc2UoQkIpOworICB9CisKKyAgLy8vIHNwbGl0QmxvY2sgLSBCQiBpcyBzcGxpdCBhbmQgbm93IGl0IGhhcyBvbmUgc3VjY2Vzc29yLiBVcGRhdGUgZG9taW5hdG9yCisgIC8vLyB0cmVlIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UuCisgIHZvaWQgc3BsaXRCbG9jayhOb2RlVCogTmV3QkIpIHsKKyAgICBpZiAodGhpcy0+SXNQb3N0RG9taW5hdG9ycykKKyAgICAgIHRoaXMtPlNwbGl0PEludmVyc2U8Tm9kZVQqPiwgR3JhcGhUcmFpdHM8SW52ZXJzZTxOb2RlVCo+ID4gPigqdGhpcywgTmV3QkIpOworICAgIGVsc2UKKyAgICAgIHRoaXMtPlNwbGl0PE5vZGVUKiwgR3JhcGhUcmFpdHM8Tm9kZVQqPiA+KCp0aGlzLCBOZXdCQik7CisgIH0KKworICAvLy8gcHJpbnQgLSBDb252ZXJ0IHRvIGh1bWFuIHJlYWRhYmxlIGZvcm0KKyAgLy8vCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJm8pIGNvbnN0IHsKKyAgICBvIDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgIGlmICh0aGlzLT5pc1Bvc3REb21pbmF0b3IoKSkKKyAgICAgIG8gPDwgIklub3JkZXIgUG9zdERvbWluYXRvciBUcmVlOiAiOworICAgIGVsc2UKKyAgICAgIG8gPDwgIklub3JkZXIgRG9taW5hdG9yIFRyZWU6ICI7CisgICAgaWYgKHRoaXMtPkRGU0luZm9WYWxpZCkKKyAgICAgIG8gPDwgIkRGU051bWJlcnMgaW52YWxpZDogIiA8PCBTbG93UXVlcmllcyA8PCAiIHNsb3cgcXVlcmllcy4iOworICAgIG8gPDwgIlxuIjsKKworICAgIC8vIFRoZSBwb3N0ZG9tIHRyZWUgY2FuIGhhdmUgYSBudWxsIHJvb3QgaWYgdGhlcmUgYXJlIG5vIHJldHVybnMuCisgICAgaWYgKGdldFJvb3ROb2RlKCkpCisgICAgICBQcmludERvbVRyZWU8Tm9kZVQ+KGdldFJvb3ROb2RlKCksIG8sIDEpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdGVtcGxhdGU8Y2xhc3MgR3JhcGhUPgorICBmcmllbmQgdm9pZCBDb21wcmVzcyhEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPiYgRFQsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqIFZJbik7CisKKyAgdGVtcGxhdGU8Y2xhc3MgR3JhcGhUPgorICBmcmllbmQgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogRXZhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPiYgRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqIFYpOworCisgIHRlbXBsYXRlPGNsYXNzIEdyYXBoVD4KKyAgZnJpZW5kIHZvaWQgTGluayhEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPiYgRFQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgREZTTnVtViwgdHlwZW5hbWUgR3JhcGhUOjpOb2RlVHlwZSogVywKKyAgICAgICAgIHR5cGVuYW1lIERvbWluYXRvclRyZWVCYXNlPHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGU+OjpJbmZvUmVjICZXSW5mbyk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgR3JhcGhUPgorICBmcmllbmQgdW5zaWduZWQgREZTUGFzcyhEb21pbmF0b3JUcmVlQmFzZTx0eXBlbmFtZSBHcmFwaFQ6Ok5vZGVUeXBlPiYgRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVR5cGUqIFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE4pOworCisgIHRlbXBsYXRlPGNsYXNzIEZ1bmNULCBjbGFzcyBOPgorICBmcmllbmQgdm9pZCBDYWxjdWxhdGUoRG9taW5hdG9yVHJlZUJhc2U8dHlwZW5hbWUgR3JhcGhUcmFpdHM8Tj46Ok5vZGVUeXBlPiYgRFQsCisgICAgICAgICAgICAgICAgICAgICAgICBGdW5jVCYgRik7CisKKyAgLy8vIHVwZGF0ZURGU051bWJlcnMgLSBBc3NpZ24gSW4gYW5kIE91dCBudW1iZXJzIHRvIHRoZSBub2RlcyB3aGlsZSB3YWxraW5nCisgIC8vLyBkb21pbmF0b3IgdHJlZSBpbiBkZnMgb3JkZXIuCisgIHZvaWQgdXBkYXRlREZTTnVtYmVycygpIHsKKyAgICB1bnNpZ25lZCBERlNOdW0gPSAwOworCisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPERvbVRyZWVOb2RlQmFzZTxOb2RlVD4qLAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIERvbVRyZWVOb2RlQmFzZTxOb2RlVD46Oml0ZXJhdG9yPiwgMzI+IFdvcmtTdGFjazsKKworICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKlRoaXNSb290ID0gZ2V0Um9vdE5vZGUoKTsKKworICAgIGlmICghVGhpc1Jvb3QpCisgICAgICByZXR1cm47CisKKyAgICAvLyBFdmVuIGluIHRoZSBjYXNlIG9mIG11bHRpcGxlIGV4aXRzIHRoYXQgZm9ybSB0aGUgcG9zdCBkb21pbmF0b3Igcm9vdAorICAgIC8vIG5vZGVzLCBkbyBub3QgaXRlcmF0ZSBvdmVyIGFsbCBleGl0cywgYnV0IHN0YXJ0IGZyb20gdGhlIHZpcnR1YWwgcm9vdAorICAgIC8vIG5vZGUuIE90aGVyd2lzZSBiYnMsIHRoYXQgYXJlIG5vdCBwb3N0IGRvbWluYXRlZCBieSBhbnkgZXhpdCBidXQgYnkgdGhlCisgICAgLy8gdmlydHVhbCByb290IG5vZGUsIHdpbGwgbmV2ZXIgYmUgYXNzaWduZWQgYSBERlMgbnVtYmVyLgorICAgIFdvcmtTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoVGhpc1Jvb3QsIFRoaXNSb290LT5iZWdpbigpKSk7CisgICAgVGhpc1Jvb3QtPkRGU051bUluID0gREZTTnVtKys7CisKKyAgICB3aGlsZSAoIVdvcmtTdGFjay5lbXB0eSgpKSB7CisgICAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOb2RlID0gV29ya1N0YWNrLmJhY2soKS5maXJzdDsKKyAgICAgIHR5cGVuYW1lIERvbVRyZWVOb2RlQmFzZTxOb2RlVD46Oml0ZXJhdG9yIENoaWxkSXQgPQorICAgICAgICBXb3JrU3RhY2suYmFjaygpLnNlY29uZDsKKworICAgICAgLy8gSWYgd2UgdmlzaXRlZCBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgInJlY3Vyc2UiIGJhY2sgdXAgdGhlCisgICAgICAvLyBzdGFjayBzZXR0aW5nIHRoZSBERk91dE51bS4KKyAgICAgIGlmIChDaGlsZEl0ID09IE5vZGUtPmVuZCgpKSB7CisgICAgICAgIE5vZGUtPkRGU051bU91dCA9IERGU051bSsrOworICAgICAgICBXb3JrU3RhY2sucG9wX2JhY2soKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE90aGVyd2lzZSwgcmVjdXJzaXZlbHkgdmlzaXQgdGhpcyBjaGlsZC4KKyAgICAgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQ2hpbGQgPSAqQ2hpbGRJdDsKKyAgICAgICAgKytXb3JrU3RhY2suYmFjaygpLnNlY29uZDsKKworICAgICAgICBXb3JrU3RhY2sucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKENoaWxkLCBDaGlsZC0+YmVnaW4oKSkpOworICAgICAgICBDaGlsZC0+REZTTnVtSW4gPSBERlNOdW0rKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTbG93UXVlcmllcyA9IDA7CisgICAgREZTSW5mb1ZhbGlkID0gdHJ1ZTsKKyAgfQorCisgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKmdldE5vZGVGb3JCbG9jayhOb2RlVCAqQkIpIHsKKyAgICB0eXBlbmFtZSBEb21UcmVlTm9kZU1hcFR5cGU6Oml0ZXJhdG9yIEkgPSB0aGlzLT5Eb21UcmVlTm9kZXMuZmluZChCQik7CisgICAgaWYgKEkgIT0gdGhpcy0+RG9tVHJlZU5vZGVzLmVuZCgpICYmIEktPnNlY29uZCkKKyAgICAgIHJldHVybiBJLT5zZWNvbmQ7CisKKyAgICAvLyBIYXZlbid0IGNhbGN1bGF0ZWQgdGhpcyBub2RlIHlldD8gIEdldCBvciBjYWxjdWxhdGUgdGhlIG5vZGUgZm9yIHRoZQorICAgIC8vIGltbWVkaWF0ZSBkb21pbmF0b3IuCisgICAgTm9kZVQgKklEb20gPSBnZXRJRG9tKEJCKTsKKworICAgIGFzc2VydChJRG9tIHx8IHRoaXMtPkRvbVRyZWVOb2Rlc1tOVUxMXSk7CisgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqSURvbU5vZGUgPSBnZXROb2RlRm9yQmxvY2soSURvbSk7CisKKyAgICAvLyBBZGQgYSBuZXcgdHJlZSBub2RlIGZvciB0aGlzIEJhc2ljQmxvY2ssIGFuZCBsaW5rIGl0IGFzIGEgY2hpbGQgb2YKKyAgICAvLyBJRG9tTm9kZQorICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKkMgPSBuZXcgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPihCQiwgSURvbU5vZGUpOworICAgIHJldHVybiB0aGlzLT5Eb21UcmVlTm9kZXNbQkJdID0gSURvbU5vZGUtPmFkZENoaWxkKEMpOworICB9CisKKyAgaW5saW5lIE5vZGVUICpnZXRJRG9tKE5vZGVUICpCQikgY29uc3QgeworICAgIHR5cGVuYW1lIERlbnNlTWFwPE5vZGVUKiwgTm9kZVQqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IElEb21zLmZpbmQoQkIpOworICAgIHJldHVybiBJICE9IElEb21zLmVuZCgpID8gSS0+c2Vjb25kIDogMDsKKyAgfQorCisgIGlubGluZSB2b2lkIGFkZFJvb3QoTm9kZVQqIEJCKSB7CisgICAgdGhpcy0+Um9vdHMucHVzaF9iYWNrKEJCKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyByZWNhbGN1bGF0ZSAtIGNvbXB1dGUgYSBkb21pbmF0b3IgdHJlZSBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uCisgIHRlbXBsYXRlPGNsYXNzIEZUPgorICB2b2lkIHJlY2FsY3VsYXRlKEZUJiBGKSB7CisgICAgcmVzZXQoKTsKKyAgICB0aGlzLT5WZXJ0ZXgucHVzaF9iYWNrKDApOworCisgICAgaWYgKCF0aGlzLT5Jc1Bvc3REb21pbmF0b3JzKSB7CisgICAgICAvLyBJbml0aWFsaXplIHJvb3QKKyAgICAgIHRoaXMtPlJvb3RzLnB1c2hfYmFjaygmRi5mcm9udCgpKTsKKyAgICAgIHRoaXMtPklEb21zWyZGLmZyb250KCldID0gMDsKKyAgICAgIHRoaXMtPkRvbVRyZWVOb2Rlc1smRi5mcm9udCgpXSA9IDA7CisKKyAgICAgIENhbGN1bGF0ZTxGVCwgTm9kZVQqPigqdGhpcywgRik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEluaXRpYWxpemUgdGhlIHJvb3RzIGxpc3QKKyAgICAgIGZvciAodHlwZW5hbWUgRlQ6Oml0ZXJhdG9yIEkgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBpZiAoc3RkOjpkaXN0YW5jZShHcmFwaFRyYWl0czxGVCo+OjpjaGlsZF9iZWdpbihJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8RlQqPjo6Y2hpbGRfZW5kKEkpKSA9PSAwKQorICAgICAgICAgIGFkZFJvb3QoSSk7CisKKyAgICAgICAgLy8gUHJlcG9wdWxhdGUgbWFwcyBzbyB0aGF0IHdlIGRvbid0IGdldCBpdGVyYXRvciBpbnZhbGlkYXRpb24gaXNzdWVzIGxhdGVyLgorICAgICAgICB0aGlzLT5JRG9tc1tJXSA9IDA7CisgICAgICAgIHRoaXMtPkRvbVRyZWVOb2Rlc1tJXSA9IDA7CisgICAgICB9CisKKyAgICAgIENhbGN1bGF0ZTxGVCwgSW52ZXJzZTxOb2RlVCo+ID4oKnRoaXMsIEYpOworICAgIH0KKyAgfQorfTsKKworRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgRG9taW5hdG9yVHJlZUJhc2U8QmFzaWNCbG9jaz4pOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBEb21pbmF0b3JUcmVlIENsYXNzIC0gQ29uY3JldGUgc3ViY2xhc3Mgb2YgRG9taW5hdG9yVHJlZUJhc2UgdGhhdCBpcyB1c2VkIHRvCisvLy8gY29tcHV0ZSBhIG5vcm1hbCBkb21pbmF0b3IgdHJlZS4KKy8vLworY2xhc3MgRG9taW5hdG9yVHJlZSA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBJRCwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICBEb21pbmF0b3JUcmVlQmFzZTxCYXNpY0Jsb2NrPiogRFQ7CisKKyAgRG9taW5hdG9yVHJlZSgpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgRFQgPSBuZXcgRG9taW5hdG9yVHJlZUJhc2U8QmFzaWNCbG9jaz4oZmFsc2UpOworICB9CisKKyAgfkRvbWluYXRvclRyZWUoKSB7CisgICAgZGVsZXRlIERUOworICB9CisKKyAgRG9taW5hdG9yVHJlZUJhc2U8QmFzaWNCbG9jaz4mIGdldEJhc2UoKSB7IHJldHVybiAqRFQ7IH0KKworICAvLy8gZ2V0Um9vdHMgLSBSZXR1cm4gdGhlIHJvb3QgYmxvY2tzIG9mIHRoZSBjdXJyZW50IENGRy4gIFRoaXMgbWF5IGluY2x1ZGUKKyAgLy8vIG11bHRpcGxlIGJsb2NrcyBpZiB3ZSBhcmUgY29tcHV0aW5nIHBvc3QgZG9taW5hdG9ycy4gIEZvciBmb3J3YXJkCisgIC8vLyBkb21pbmF0b3JzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGEgc2luZ2xlIGJsb2NrICh0aGUgZW50cnkgbm9kZSkuCisgIC8vLworICBpbmxpbmUgY29uc3Qgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+ICZnZXRSb290cygpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldFJvb3RzKCk7CisgIH0KKworICBpbmxpbmUgQmFzaWNCbG9jayAqZ2V0Um9vdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldFJvb3QoKTsKKyAgfQorCisgIGlubGluZSBEb21UcmVlTm9kZSAqZ2V0Um9vdE5vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5nZXRSb290Tm9kZSgpOworICB9CisKKyAgLy8vIGNvbXBhcmUgLSBSZXR1cm4gZmFsc2UgaWYgdGhlIG90aGVyIGRvbWluYXRvciB0cmVlIG1hdGNoZXMgdGhpcworICAvLy8gZG9taW5hdG9yIHRyZWUuIE90aGVyd2lzZSByZXR1cm4gdHJ1ZS4KKyAgaW5saW5lIGJvb2wgY29tcGFyZShEb21pbmF0b3JUcmVlICZPdGhlcikgY29uc3QgeworICAgIERvbVRyZWVOb2RlICpSID0gZ2V0Um9vdE5vZGUoKTsKKyAgICBEb21UcmVlTm9kZSAqT3RoZXJSID0gT3RoZXIuZ2V0Um9vdE5vZGUoKTsKKworICAgIGlmICghUiB8fCAhT3RoZXJSIHx8IFItPmdldEJsb2NrKCkgIT0gT3RoZXJSLT5nZXRCbG9jaygpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoRFQtPmNvbXBhcmUoT3RoZXIuZ2V0QmFzZSgpKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworCisgIHZpcnR1YWwgdm9pZCB2ZXJpZnlBbmFseXNpcygpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICBpbmxpbmUgYm9vbCBkb21pbmF0ZXMoRG9tVHJlZU5vZGUqIEEsIERvbVRyZWVOb2RlKiBCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5kb21pbmF0ZXMoQSwgQik7CisgIH0KKworICBpbmxpbmUgYm9vbCBkb21pbmF0ZXMoY29uc3QgQmFzaWNCbG9jayogQSwgY29uc3QgQmFzaWNCbG9jayogQikgY29uc3QgeworICAgIHJldHVybiBEVC0+ZG9taW5hdGVzKEEsIEIpOworICB9CisKKyAgLy8gZG9taW5hdGVzIC0gUmV0dXJuIHRydWUgaWYgQSBkb21pbmF0ZXMgQi4gVGhpcyBwZXJmb3JtcyB0aGUKKyAgLy8gc3BlY2lhbCBjaGVja3MgbmVjZXNzYXJ5IGlmIEEgYW5kIEIgYXJlIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrLgorICBib29sIGRvbWluYXRlcyhjb25zdCBJbnN0cnVjdGlvbiAqQSwgY29uc3QgSW5zdHJ1Y3Rpb24gKkIpIGNvbnN0OworCisgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoY29uc3QgRG9tVHJlZU5vZGUgKkEsIGNvbnN0IERvbVRyZWVOb2RlICpCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5wcm9wZXJseURvbWluYXRlcyhBLCBCKTsKKyAgfQorCisgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoQmFzaWNCbG9jayAqQSwgQmFzaWNCbG9jayAqQikgY29uc3QgeworICAgIHJldHVybiBEVC0+cHJvcGVybHlEb21pbmF0ZXMoQSwgQik7CisgIH0KKworICAvLy8gZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IgLSBGaW5kIG5lYXJlc3QgY29tbW9uIGRvbWluYXRvciBiYXNpYyBibG9jaworICAvLy8gZm9yIGJhc2ljIGJsb2NrIEEgYW5kIEIuIElmIHRoZXJlIGlzIG5vIHN1Y2ggYmxvY2sgdGhlbiByZXR1cm4gTlVMTC4KKyAgaW5saW5lIEJhc2ljQmxvY2sgKmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKEJhc2ljQmxvY2sgKkEsIEJhc2ljQmxvY2sgKkIpIHsKKyAgICByZXR1cm4gRFQtPmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKEEsIEIpOworICB9CisKKyAgaW5saW5lIERvbVRyZWVOb2RlICpvcGVyYXRvcltdKEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5nZXROb2RlKEJCKTsKKyAgfQorCisgIC8vLyBnZXROb2RlIC0gcmV0dXJuIHRoZSAoUG9zdClEb21pbmF0b3JUcmVlIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFzaWMKKyAgLy8vIGJsb2NrLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB1c2luZyBvcGVyYXRvcltdIG9uIHRoaXMgY2xhc3MuCisgIC8vLworICBpbmxpbmUgRG9tVHJlZU5vZGUgKmdldE5vZGUoQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldE5vZGUoQkIpOworICB9CisKKyAgLy8vIGFkZE5ld0Jsb2NrIC0gQWRkIGEgbmV3IG5vZGUgdG8gdGhlIGRvbWluYXRvciB0cmVlIGluZm9ybWF0aW9uLiAgVGhpcworICAvLy8gY3JlYXRlcyBhIG5ldyBub2RlIGFzIGEgY2hpbGQgb2YgRG9tQkIgZG9taW5hdG9yIG5vZGUsbGlua2luZyBpdCBpbnRvCisgIC8vLyB0aGUgY2hpbGRyZW4gbGlzdCBvZiB0aGUgaW1tZWRpYXRlIGRvbWluYXRvci4KKyAgaW5saW5lIERvbVRyZWVOb2RlICphZGROZXdCbG9jayhCYXNpY0Jsb2NrICpCQiwgQmFzaWNCbG9jayAqRG9tQkIpIHsKKyAgICByZXR1cm4gRFQtPmFkZE5ld0Jsb2NrKEJCLCBEb21CQik7CisgIH0KKworICAvLy8gY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGRvbWluYXRvcgorICAvLy8gdHJlZSBpbmZvcm1hdGlvbiB3aGVuIGEgbm9kZSdzIGltbWVkaWF0ZSBkb21pbmF0b3IgY2hhbmdlcy4KKyAgLy8vCisgIGlubGluZSB2b2lkIGNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihCYXNpY0Jsb2NrICpOLCBCYXNpY0Jsb2NrKiBOZXdJRG9tKSB7CisgICAgRFQtPmNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihOLCBOZXdJRG9tKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihEb21UcmVlTm9kZSAqTiwgRG9tVHJlZU5vZGUqIE5ld0lEb20pIHsKKyAgICBEVC0+Y2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE4sIE5ld0lEb20pOworICB9CisKKyAgLy8vIGVyYXNlTm9kZSAtIFJlbW92ZXMgYSBub2RlIGZyb20gdGhlIGRvbWluYXRvciB0cmVlLiBCbG9jayBtdXN0IG5vdAorICAvLy8gZG9taWFudGUgYW55IG90aGVyIGJsb2Nrcy4gUmVtb3ZlcyBub2RlIGZyb20gaXRzIGltbWVkaWF0ZSBkb21pbmF0b3IncworICAvLy8gY2hpbGRyZW4gbGlzdC4gRGVsZXRlcyBkb21pbmF0b3Igbm9kZSBhc3NvY2lhdGVkIHdpdGggYmFzaWMgYmxvY2sgQkIuCisgIGlubGluZSB2b2lkIGVyYXNlTm9kZShCYXNpY0Jsb2NrICpCQikgeworICAgIERULT5lcmFzZU5vZGUoQkIpOworICB9CisKKyAgLy8vIHNwbGl0QmxvY2sgLSBCQiBpcyBzcGxpdCBhbmQgbm93IGl0IGhhcyBvbmUgc3VjY2Vzc29yLiBVcGRhdGUgZG9taW5hdG9yCisgIC8vLyB0cmVlIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UuCisgIGlubGluZSB2b2lkIHNwbGl0QmxvY2soQmFzaWNCbG9jayogTmV3QkIpIHsKKyAgICBEVC0+c3BsaXRCbG9jayhOZXdCQik7CisgIH0KKworICBib29sIGlzUmVhY2hhYmxlRnJvbUVudHJ5KEJhc2ljQmxvY2sqIEEpIHsKKyAgICByZXR1cm4gRFQtPmlzUmVhY2hhYmxlRnJvbUVudHJ5KEEpOworICB9CisKKworICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpIHsKKyAgICBEVC0+cmVsZWFzZU1lbW9yeSgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlKiBNPSAwKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIERvbWluYXRvclRyZWUgR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb24gc28gdGhlIERvbWluYXRvclRyZWUgY2FuIGJlCisvLy8gaXRlcmFibGUgYnkgZ2VuZXJpYyBncmFwaCBpdGVyYXRvcnMuCisvLy8KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxEb21UcmVlTm9kZSo+IHsKKyAgdHlwZWRlZiBEb21UcmVlTm9kZSBOb2RlVHlwZTsKKyAgdHlwZWRlZiBOb2RlVHlwZTo6aXRlcmF0b3IgIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE47CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBOLT5iZWdpbigpOworICB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPmVuZCgpOworICB9CisKKyAgdHlwZWRlZiBkZl9pdGVyYXRvcjxEb21UcmVlTm9kZSo+IG5vZGVzX2l0ZXJhdG9yOworCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihEb21UcmVlTm9kZSAqTikgeworICAgIHJldHVybiBkZl9iZWdpbihnZXRFbnRyeU5vZGUoTikpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChEb21UcmVlTm9kZSAqTikgeworICAgIHJldHVybiBkZl9lbmQoZ2V0RW50cnlOb2RlKE4pKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPERvbWluYXRvclRyZWUqPgorICA6IHB1YmxpYyBHcmFwaFRyYWl0czxEb21UcmVlTm9kZSo+IHsKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoRG9taW5hdG9yVHJlZSAqRFQpIHsKKyAgICByZXR1cm4gRFQtPmdldFJvb3ROb2RlKCk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oRG9taW5hdG9yVHJlZSAqTikgeworICAgIHJldHVybiBkZl9iZWdpbihnZXRFbnRyeU5vZGUoTikpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChEb21pbmF0b3JUcmVlICpOKSB7CisgICAgcmV0dXJuIGRmX2VuZChnZXRFbnRyeU5vZGUoTikpOworICB9Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRG9taW5hbmNlRnJvbnRpZXJCYXNlIC0gQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGNvbXB1dGluZyBmb3J3YXJkIGFuZCBpbnZlcnNlCisvLy8gZG9taW5hbmNlIGZyb250aWVycyBmb3IgYSBmdW5jdGlvbi4KKy8vLworY2xhc3MgRG9taW5hbmNlRnJvbnRpZXJCYXNlIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpzZXQ8QmFzaWNCbG9jayo+ICAgICAgICAgICAgIERvbVNldFR5cGU7ICAgIC8vIERvbSBzZXQgZm9yIGEgYmIKKyAgdHlwZWRlZiBzdGQ6Om1hcDxCYXNpY0Jsb2NrKiwgRG9tU2V0VHlwZT4gRG9tU2V0TWFwVHlwZTsgLy8gRG9tIHNldCBtYXAKK3Byb3RlY3RlZDoKKyAgRG9tU2V0TWFwVHlwZSBGcm9udGllcnM7CisgIHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPiBSb290czsKKyAgY29uc3QgYm9vbCBJc1Bvc3REb21pbmF0b3JzOworCitwdWJsaWM6CisgIERvbWluYW5jZUZyb250aWVyQmFzZShjaGFyICZJRCwgYm9vbCBpc1Bvc3REb20pCisgICAgOiBGdW5jdGlvblBhc3MoSUQpLCBJc1Bvc3REb21pbmF0b3JzKGlzUG9zdERvbSkge30KKworICAvLy8gZ2V0Um9vdHMgLSBSZXR1cm4gdGhlIHJvb3QgYmxvY2tzIG9mIHRoZSBjdXJyZW50IENGRy4gIFRoaXMgbWF5IGluY2x1ZGUKKyAgLy8vIG11bHRpcGxlIGJsb2NrcyBpZiB3ZSBhcmUgY29tcHV0aW5nIHBvc3QgZG9taW5hdG9ycy4gIEZvciBmb3J3YXJkCisgIC8vLyBkb21pbmF0b3JzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGEgc2luZ2xlIGJsb2NrICh0aGUgZW50cnkgbm9kZSkuCisgIC8vLworICBpbmxpbmUgY29uc3Qgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+ICZnZXRSb290cygpIGNvbnN0IHsgcmV0dXJuIFJvb3RzOyB9CisKKyAgLy8vIGlzUG9zdERvbWluYXRvciAtIFJldHVybnMgdHJ1ZSBpZiBhbmFseXNpcyBiYXNlZCBvZiBwb3N0ZG9tcworICAvLy8KKyAgYm9vbCBpc1Bvc3REb21pbmF0b3IoKSBjb25zdCB7IHJldHVybiBJc1Bvc3REb21pbmF0b3JzOyB9CisKKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7IEZyb250aWVycy5jbGVhcigpOyB9CisKKyAgLy8gQWNjZXNzb3IgaW50ZXJmYWNlOgorICB0eXBlZGVmIERvbVNldE1hcFR5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIERvbVNldE1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICBpdGVyYXRvciAgICAgICBiZWdpbigpICAgICAgIHsgcmV0dXJuIEZyb250aWVycy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRnJvbnRpZXJzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgICAgICAgZW5kKCkgICAgICAgICB7IHJldHVybiBGcm9udGllcnMuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICBjb25zdCB7IHJldHVybiBGcm9udGllcnMuZW5kKCk7IH0KKyAgaXRlcmF0b3IgICAgICAgZmluZChCYXNpY0Jsb2NrICpCKSAgICAgICB7IHJldHVybiBGcm9udGllcnMuZmluZChCKTsgfQorICBjb25zdF9pdGVyYXRvciBmaW5kKEJhc2ljQmxvY2sgKkIpIGNvbnN0IHsgcmV0dXJuIEZyb250aWVycy5maW5kKEIpOyB9CisKKyAgaXRlcmF0b3IgYWRkQmFzaWNCbG9jayhCYXNpY0Jsb2NrICpCQiwgY29uc3QgRG9tU2V0VHlwZSAmZnJvbnRpZXIpIHsKKyAgICBhc3NlcnQoZmluZChCQikgPT0gZW5kKCkgJiYgIkJsb2NrIGFscmVhZHkgaW4gRG9taW5hbmNlRnJvbnRpZXIhIik7CisgICAgcmV0dXJuIEZyb250aWVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoQkIsIGZyb250aWVyKSkuZmlyc3Q7CisgIH0KKworICAvLy8gcmVtb3ZlQmxvY2sgLSBSZW1vdmUgYmFzaWMgYmxvY2sgQkIncyBmcm9udGllci4KKyAgdm9pZCByZW1vdmVCbG9jayhCYXNpY0Jsb2NrICpCQikgeworICAgIGFzc2VydChmaW5kKEJCKSAhPSBlbmQoKSAmJiAiQmxvY2sgaXMgbm90IGluIERvbWluYW5jZUZyb250aWVyISIpOworICAgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBJLT5zZWNvbmQuZXJhc2UoQkIpOworICAgIEZyb250aWVycy5lcmFzZShCQik7CisgIH0KKworICB2b2lkIGFkZFRvRnJvbnRpZXIoaXRlcmF0b3IgSSwgQmFzaWNCbG9jayAqTm9kZSkgeworICAgIGFzc2VydChJICE9IGVuZCgpICYmICJCQiBpcyBub3QgaW4gRG9taW5hbmNlRnJvbnRpZXIhIik7CisgICAgSS0+c2Vjb25kLmluc2VydChOb2RlKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlRnJvbUZyb250aWVyKGl0ZXJhdG9yIEksIEJhc2ljQmxvY2sgKk5vZGUpIHsKKyAgICBhc3NlcnQoSSAhPSBlbmQoKSAmJiAiQkIgaXMgbm90IGluIERvbWluYW5jZUZyb250aWVyISIpOworICAgIGFzc2VydChJLT5zZWNvbmQuY291bnQoTm9kZSkgJiYgIk5vZGUgaXMgbm90IGluIERvbWluYW5jZUZyb250aWVyIG9mIEJCIik7CisgICAgSS0+c2Vjb25kLmVyYXNlKE5vZGUpOworICB9CisKKyAgLy8vIGNvbXBhcmVEb21TZXQgLSBSZXR1cm4gZmFsc2UgaWYgdHdvIGRvbXNldHMgbWF0Y2guIE90aGVyd2lzZQorICAvLy8gcmV0dXJuIHRydWU7CisgIGJvb2wgY29tcGFyZURvbVNldChEb21TZXRUeXBlICZEUzEsIGNvbnN0IERvbVNldFR5cGUgJkRTMikgY29uc3QgeworICAgIHN0ZDo6c2V0PEJhc2ljQmxvY2sgKj4gdG1wU2V0OworICAgIGZvciAoRG9tU2V0VHlwZTo6Y29uc3RfaXRlcmF0b3IgSSA9IERTMi5iZWdpbigpLAorICAgICAgICAgICBFID0gRFMyLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIHRtcFNldC5pbnNlcnQoKkkpOworCisgICAgZm9yIChEb21TZXRUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gRFMxLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBEUzEuZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgICBCYXNpY0Jsb2NrICpOb2RlID0gKkkrKzsKKworICAgICAgaWYgKHRtcFNldC5lcmFzZShOb2RlKSA9PSAwKQorICAgICAgICAvLyBOb2RlIGlzIGluIERTMSBidXQgbm90IGluIERTMi4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCF0bXBTZXQuZW1wdHkoKSkKKyAgICAgIC8vIFRoZXJlIGFyZSBub2RlcyB0aGF0IGFyZSBpbiBEUzIgYnV0IG5vdCBpbiBEUzEuCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIERTMSBhbmQgRFMyIG1hdGNoZXMuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGNvbXBhcmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgb3RoZXIgZG9taW5hbmNlIGZyb250aWVyIGJhc2UgbWF0Y2hlcworICAvLy8gdGhpcyBkb21pbmFuY2UgZnJvbnRpZXIgYmFzZS4gT3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCBjb21wYXJlKERvbWluYW5jZUZyb250aWVyQmFzZSAmT3RoZXIpIGNvbnN0IHsKKyAgICBEb21TZXRNYXBUeXBlIHRtcEZyb250aWVyczsKKyAgICBmb3IgKERvbVNldE1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIEkgPSBPdGhlci5iZWdpbigpLAorICAgICAgICAgICBFID0gT3RoZXIuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgdG1wRnJvbnRpZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihJLT5maXJzdCwgSS0+c2Vjb25kKSk7CisKKyAgICBmb3IgKERvbVNldE1hcFR5cGU6Oml0ZXJhdG9yIEkgPSB0bXBGcm9udGllcnMuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IHRtcEZyb250aWVycy5lbmQoKTsgSSAhPSBFOyApIHsKKyAgICAgIEJhc2ljQmxvY2sgKk5vZGUgPSBJLT5maXJzdDsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIERGSSA9IGZpbmQoTm9kZSk7CisgICAgICBpZiAoREZJID09IGVuZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgaWYgKGNvbXBhcmVEb21TZXQoSS0+c2Vjb25kLCBERkktPnNlY29uZCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICArK0k7CisgICAgICB0bXBGcm9udGllcnMuZXJhc2UoTm9kZSk7CisgICAgfQorCisgICAgaWYgKCF0bXBGcm9udGllcnMuZW1wdHkoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIHByaW50IC0gQ29udmVydCB0byBodW1hbiByZWFkYWJsZSBmb3JtCisgIC8vLworICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUqID0gMCkgY29uc3Q7CisKKyAgLy8vIGR1bXAgLSBEdW1wIHRoZSBkb21pbmFuY2UgZnJvbnRpZXIgdG8gZGJncygpLgorICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gRG9taW5hbmNlRnJvbnRpZXIgQ2xhc3MgLSBDb25jcmV0ZSBzdWJjbGFzcyBvZiBEb21pbmFuY2VGcm9udGllckJhc2UgdGhhdCBpcworLy8vIHVzZWQgdG8gY29tcHV0ZSBhIGZvcndhcmQgZG9taW5hdG9yIGZyb250aWVycy4KKy8vLworY2xhc3MgRG9taW5hbmNlRnJvbnRpZXIgOiBwdWJsaWMgRG9taW5hbmNlRnJvbnRpZXJCYXNlIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgSUQsIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgRG9taW5hbmNlRnJvbnRpZXIoKSA6CisgICAgRG9taW5hbmNlRnJvbnRpZXJCYXNlKElELCBmYWxzZSkge30KKworICBCYXNpY0Jsb2NrICpnZXRSb290KCkgY29uc3QgeworICAgIGFzc2VydChSb290cy5zaXplKCkgPT0gMSAmJiAiU2hvdWxkIGFsd2F5cyBoYXZlIGVudHJ5IG5vZGUhIik7CisgICAgcmV0dXJuIFJvb3RzWzBdOworICB9CisKKyAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJikgeworICAgIEZyb250aWVycy5jbGVhcigpOworICAgIERvbWluYXRvclRyZWUgJkRUID0gZ2V0QW5hbHlzaXM8RG9taW5hdG9yVHJlZT4oKTsKKyAgICBSb290cyA9IERULmdldFJvb3RzKCk7CisgICAgYXNzZXJ0KFJvb3RzLnNpemUoKSA9PSAxICYmICJPbmx5IG9uZSBlbnRyeSBibG9jayBmb3IgZm9yd2FyZCBkb21mcm9udHMhIik7CisgICAgY2FsY3VsYXRlKERULCBEVFtSb290c1swXV0pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB2ZXJpZnlBbmFseXNpcygpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgQVUuYWRkUmVxdWlyZWQ8RG9taW5hdG9yVHJlZT4oKTsKKyAgfQorCisgIC8vLyBzcGxpdEJsb2NrIC0gQkIgaXMgc3BsaXQgYW5kIG5vdyBpdCBoYXMgb25lIHN1Y2Nlc3Nvci4gVXBkYXRlIGRvbWluYW5jZQorICAvLy8gZnJvbnRpZXIgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKyAgdm9pZCBzcGxpdEJsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gQmFzaWNCbG9jayBCQidzIG5ldyBkb21pbmF0b3IgaXMgTmV3QkIuIFVwZGF0ZSBCQidzIGRvbWluYW5jZSBmcm9udGllcgorICAvLy8gdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKyAgdm9pZCBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoQmFzaWNCbG9jayAqQkIsIEJhc2ljQmxvY2sgKk5ld0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCkgeworICAgIC8vIE5ld0JCIGlzIG5vdyBkb21pbmF0aW5nIEJCLiBXaGljaCBtZWFucyBCQidzIGRvbWluYW5jZQorICAgIC8vIGZyb250aWVyIGlzIG5vdyBwYXJ0IG9mIE5ld0JCJ3MgZG9taW5hbmNlIGZyb250aWVyLiBIb3dldmVyLCBCQgorICAgIC8vIGl0c2VsZiBpcyBub3QgbWVtYmVyIG9mIE5ld0JCJ3MgZG9taW5hbmNlIGZyb250aWVyLgorICAgIERvbWluYW5jZUZyb250aWVyOjppdGVyYXRvciBOZXdERkkgPSBmaW5kKE5ld0JCKTsKKyAgICBEb21pbmFuY2VGcm9udGllcjo6aXRlcmF0b3IgREZJID0gZmluZChCQik7CisgICAgLy8gSWYgQkIgd2FzIGFuIGVudHJ5IGJsb2NrIHRoZW4gaXRzIGZyb250aWVyIGlzIGVtcHR5LgorICAgIGlmIChERkkgPT0gZW5kKCkpCisgICAgICByZXR1cm47CisgICAgRG9taW5hbmNlRnJvbnRpZXI6OkRvbVNldFR5cGUgQkJTZXQgPSBERkktPnNlY29uZDsKKyAgICBmb3IgKERvbWluYW5jZUZyb250aWVyOjpEb21TZXRUeXBlOjppdGVyYXRvciBCQlNldEkgPSBCQlNldC5iZWdpbigpLAorICAgICAgICAgICBCQlNldEUgPSBCQlNldC5lbmQoKTsgQkJTZXRJICE9IEJCU2V0RTsgKytCQlNldEkpIHsKKyAgICAgIEJhc2ljQmxvY2sgKkRGTWVtYmVyID0gKkJCU2V0STsKKyAgICAgIC8vIEluc2VydCBvbmx5IGlmIE5ld0JCIGRvbWluYXRlcyBERk1lbWJlci4KKyAgICAgIGlmICghRFQtPmRvbWluYXRlcyhOZXdCQiwgREZNZW1iZXIpKQorICAgICAgICBOZXdERkktPnNlY29uZC5pbnNlcnQoREZNZW1iZXIpOworICAgIH0KKyAgICBOZXdERkktPnNlY29uZC5lcmFzZShCQik7CisgIH0KKworICBjb25zdCBEb21TZXRUeXBlICZjYWxjdWxhdGUoY29uc3QgRG9taW5hdG9yVHJlZSAmRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlTm9kZSAqTm9kZSk7Cit9OworCisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0ZpbmRVc2VkVHlwZXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9GaW5kVXNlZFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3OGViNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9GaW5kVXNlZFR5cGVzLmgKQEAgLTAsMCArMSw2NCBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvRmluZFVzZWRUeXBlcy5oIC0gRmluZCBhbGwgVHlwZXMgaW4gdXNlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaXMgdXNlZCB0byBzZWVrIG91dCBhbGwgb2YgdGhlIHR5cGVzIGluIHVzZSBieSB0aGUgcHJvZ3JhbS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfRklORFVTRURUWVBFU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfRklORFVTRURUWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVHlwZTsKK2NsYXNzIFZhbHVlOworCitjbGFzcyBGaW5kVXNlZFR5cGVzIDogcHVibGljIE1vZHVsZVBhc3MgeworICBzdGQ6OnNldDxjb25zdCBUeXBlICo+IFVzZWRUeXBlczsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgRmluZFVzZWRUeXBlcygpIDogTW9kdWxlUGFzcyhJRCkge30KKworICAvLy8gZ2V0VHlwZXMgLSBBZnRlciB0aGUgcGFzcyBoYXMgYmVlbiBydW4sIHJldHVybiB0aGUgc2V0IGNvbnRhaW5pbmcgYWxsIG9mCisgIC8vLyB0aGUgdHlwZXMgdXNlZCBpbiB0aGUgbW9kdWxlLgorICAvLy8KKyAgY29uc3Qgc3RkOjpzZXQ8Y29uc3QgVHlwZSAqPiAmZ2V0VHlwZXMoKSBjb25zdCB7IHJldHVybiBVc2VkVHlwZXM7IH0KKworICAvLy8gUHJpbnQgdGhlIHR5cGVzIGZvdW5kIGluIHRoZSBtb2R1bGUuICBJZiB0aGUgb3B0aW9uYWwgTW9kdWxlIHBhcmFtZXRlciBpcworICAvLy8gcGFzc2VkIGluLCB0aGVuIHRoZSB0eXBlcyBhcmUgcHJpbnRlZCBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUsIHVzaW5nIHRoZQorICAvLy8gc3ltYm9sIHRhYmxlIGZyb20gdGhlIG1vZHVsZS4KKyAgLy8vCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJm8sIGNvbnN0IE1vZHVsZSAqTSkgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBJbmNvcnBvcmF0ZVR5cGUgLSBJbmNvcnBvcmF0ZSBvbmUgdHlwZSBhbmQgYWxsIG9mIGl0cyBzdWJ0eXBlcyBpbnRvIHRoZQorICAvLy8gY29sbGVjdGlvbiBvZiB1c2VkIHR5cGVzLgorICAvLy8KKyAgdm9pZCBJbmNvcnBvcmF0ZVR5cGUoY29uc3QgVHlwZSAqVHkpOworCisgIC8vLyBJbmNvcnBvcmF0ZVZhbHVlIC0gSW5jb3Jwb3JhdGUgYWxsIG9mIHRoZSB0eXBlcyB1c2VkIGJ5IHRoaXMgdmFsdWUuCisgIC8vLworICB2b2lkIEluY29ycG9yYXRlVmFsdWUoY29uc3QgVmFsdWUgKlYpOworCitwdWJsaWM6CisgIC8vLyBydW4gLSBUaGlzIGluY29ycG9yYXRlcyBhbGwgdHlwZXMgdXNlZCBieSB0aGUgc3BlY2lmaWVkIG1vZHVsZQorICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSk7CisKKyAgLy8vIGdldEFuYWx5c2lzVXNhZ2UgLSBXZSBkbyBub3QgbW9kaWZ5IGFueXRoaW5nLgorICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JVlVzZXJzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSVZVc2Vycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OGU2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSVZVc2Vycy5oCkBAIC0wLDAgKzEsMTc1IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9JVlVzZXJzLmggLSBJbmR1Y3Rpb24gVmFyaWFibGUgVXNlcnMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGJvb2trZWVwaW5nIGZvciAiaW50ZXJlc3RpbmciIHVzZXJzIG9mIGV4cHJlc3Npb25zCisvLyBjb21wdXRlZCBmcm9tIGluZHVjdGlvbiB2YXJpYWJsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0lWVVNFUlNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0lWVVNFUlNfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIFZhbHVlOworY2xhc3MgSVZVc2VyczsKK2NsYXNzIFNjYWxhckV2b2x1dGlvbjsKK2NsYXNzIFNDRVY7CitjbGFzcyBJVlVzZXJzOworCisvLy8gSVZTdHJpZGVVc2UgLSBLZWVwIHRyYWNrIG9mIG9uZSB1c2Ugb2YgYSBzdHJpZGVkIGluZHVjdGlvbiB2YXJpYWJsZS4KKy8vLyBUaGUgRXhwciBtZW1iZXIga2VlcHMgdHJhY2sgb2YgdGhlIGV4cHJlc3Npb24sIFVzZXIgaXMgdGhlIGFjdHVhbCB1c2VyCisvLy8gaW5zdHJ1Y3Rpb24gb2YgdGhlIG9wZXJhbmQsIGFuZCAnT3BlcmFuZFZhbFRvUmVwbGFjZScgaXMgdGhlIG9wZXJhbmQgb2YKKy8vLyB0aGUgVXNlciB0aGF0IGlzIHRoZSB1c2UuCitjbGFzcyBJVlN0cmlkZVVzZSA6IHB1YmxpYyBDYWxsYmFja1ZILCBwdWJsaWMgaWxpc3Rfbm9kZTxJVlN0cmlkZVVzZT4geworICBmcmllbmQgY2xhc3MgSVZVc2VyczsKK3B1YmxpYzoKKyAgSVZTdHJpZGVVc2UoSVZVc2VycyAqUCwgSW5zdHJ1Y3Rpb24qIFUsIFZhbHVlICpPKQorICAgIDogQ2FsbGJhY2tWSChVKSwgUGFyZW50KFApLCBPcGVyYW5kVmFsVG9SZXBsYWNlKE8pIHsKKyAgfQorCisgIC8vLyBnZXRVc2VyIC0gUmV0dXJuIHRoZSB1c2VyIGluc3RydWN0aW9uIGZvciB0aGlzIHVzZS4KKyAgSW5zdHJ1Y3Rpb24gKmdldFVzZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8SW5zdHJ1Y3Rpb24+KGdldFZhbFB0cigpKTsKKyAgfQorCisgIC8vLyBzZXRVc2VyIC0gQXNzaWduIGEgbmV3IHVzZXIgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgdXNlLgorICB2b2lkIHNldFVzZXIoSW5zdHJ1Y3Rpb24gKk5ld1VzZXIpIHsKKyAgICBzZXRWYWxQdHIoTmV3VXNlcik7CisgIH0KKworICAvLy8gZ2V0T3BlcmFuZFZhbFRvUmVwbGFjZSAtIFJldHVybiB0aGUgVmFsdWUgb2YgdGhlIG9wZXJhbmQgaW4gdGhlIHVzZXIKKyAgLy8vIGluc3RydWN0aW9uIHRoYXQgdGhpcyBJVlN0cmlkZVVzZSBpcyByZXByZXNlbnRpbmcuCisgIFZhbHVlICpnZXRPcGVyYW5kVmFsVG9SZXBsYWNlKCkgY29uc3QgeworICAgIHJldHVybiBPcGVyYW5kVmFsVG9SZXBsYWNlOworICB9CisKKyAgLy8vIHNldE9wZXJhbmRWYWxUb1JlcGxhY2UgLSBBc3NpZ24gYSBuZXcgVmFsdWUgYXMgdGhlIG9wZXJhbmQgdmFsdWUKKyAgLy8vIHRvIHJlcGxhY2UuCisgIHZvaWQgc2V0T3BlcmFuZFZhbFRvUmVwbGFjZShWYWx1ZSAqT3ApIHsKKyAgICBPcGVyYW5kVmFsVG9SZXBsYWNlID0gT3A7CisgIH0KKworICAvLy8gZ2V0UG9zdEluY0xvb3BzIC0gUmV0dXJuIHRoZSBzZXQgb2YgbG9vcHMgZm9yIHdoaWNoIHRoZSBleHByZXNzaW9uIGhhcworICAvLy8gYmVlbiBhZGp1c3RlZCB0byB1c2UgcG9zdC1pbmMgbW9kZS4KKyAgY29uc3QgUG9zdEluY0xvb3BTZXQgJmdldFBvc3RJbmNMb29wcygpIGNvbnN0IHsKKyAgICByZXR1cm4gUG9zdEluY0xvb3BzOworICB9CisKKyAgLy8vIHRyYW5zZm9ybVRvUG9zdEluYyAtIFRyYW5zZm9ybSB0aGUgZXhwcmVzc2lvbiB0byBwb3N0LWluYyBmb3JtIGZvciB0aGUKKyAgLy8vIGdpdmVuIGxvb3AuCisgIHZvaWQgdHJhbnNmb3JtVG9Qb3N0SW5jKGNvbnN0IExvb3AgKkwpOworCitwcml2YXRlOgorICAvLy8gUGFyZW50IC0gYSBwb2ludGVyIHRvIHRoZSBJVlVzZXJzIHRoYXQgb3ducyB0aGlzIElWU3RyaWRlVXNlLgorICBJVlVzZXJzICpQYXJlbnQ7CisKKyAgLy8vIE9wZXJhbmRWYWxUb1JlcGxhY2UgLSBUaGUgVmFsdWUgb2YgdGhlIG9wZXJhbmQgaW4gdGhlIHVzZXIgaW5zdHJ1Y3Rpb24KKyAgLy8vIHRoYXQgdGhpcyBJVlN0cmlkZVVzZSBpcyByZXByZXNlbnRpbmcuCisgIFdlYWtWSCBPcGVyYW5kVmFsVG9SZXBsYWNlOworCisgIC8vLyBQb3N0SW5jTG9vcHMgLSBUaGUgc2V0IG9mIGxvb3BzIGZvciB3aGljaCBFeHByIGhhcyBiZWVuIGFkanVzdGVkIHRvCisgIC8vLyB1c2UgcG9zdC1pbmMgbW9kZS4gVGhpcyBjb3JyZXNwb25kcyB3aXRoIFNDRVZFeHBhbmRlcidzIHBvc3QtaW5jIGNvbmNlcHQuCisgIFBvc3RJbmNMb29wU2V0IFBvc3RJbmNMb29wczsKKworICAvLy8gRGVsZXRlZCAtIEltcGxlbWVudGF0aW9uIG9mIENhbGxiYWNrVkggdmlydHVhbCBmdW5jdGlvbiB0bworICAvLy8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGUgVXNlciBpcyBkZWxldGVkLgorICB2aXJ0dWFsIHZvaWQgZGVsZXRlZCgpOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgaWxpc3RfdHJhaXRzPElWU3RyaWRlVXNlPgorICA6IHB1YmxpYyBpbGlzdF9kZWZhdWx0X3RyYWl0czxJVlN0cmlkZVVzZT4geworICAvLyBjcmVhdGVTZW50aW5lbCBpcyB1c2VkIHRvIGdldCBob2xkIG9mIGEgbm9kZSB0aGF0IG1hcmtzIHRoZSBlbmQgb2YKKyAgLy8gdGhlIGxpc3QuLi4KKyAgLy8gVGhlIHNlbnRpbmVsIGlzIHJlbGF0aXZlIHRvIHRoaXMgaW5zdGFuY2UsIHNvIHdlIHVzZSBhIG5vbi1zdGF0aWMKKyAgLy8gbWV0aG9kLgorICBJVlN0cmlkZVVzZSAqY3JlYXRlU2VudGluZWwoKSBjb25zdCB7CisgICAgLy8gc2luY2UgaShwKWxpc3RzIGFsd2F5cyBwdWJsaWNseSBkZXJpdmUgZnJvbSB0aGUgY29ycmVzcG9uZGluZworICAgIC8vIHRyYWl0cywgcGxhY2luZyBhIGRhdGEgbWVtYmVyIGluIHRoaXMgY2xhc3Mgd2lsbCBhdWdtZW50IGkocClsaXN0LgorICAgIC8vIEJ1dCBzaW5jZSB0aGUgTm9kZVR5IGlzIGV4cGVjdGVkIHRvIHB1YmxpY2x5IGRlcml2ZSBmcm9tCisgICAgLy8gaWxpc3Rfbm9kZTxOb2RlVHk+LCB0aGVyZSBpcyBhIGxlZ2FsIHZpYWJsZSBkb3duY2FzdCBmcm9tIGl0CisgICAgLy8gdG8gTm9kZVR5LiBXZSB1c2UgdGhpcyB0cmljayB0byBzdXBlcnBvc2UgaShwKWxpc3Qgd2l0aCBhICJnaG9zdGx5IgorICAgIC8vIE5vZGVUeSwgd2hpY2ggYmVjb21lcyB0aGUgc2VudGluZWwuIERlcmVmZXJlbmNpbmcgdGhlIHNlbnRpbmVsIGlzCisgICAgLy8gZm9yYmlkZGVuIChzYXZlIHRoZSBpbGlzdF9ub2RlPE5vZGVUeT4pIHNvIG5vIG9uZSB3aWxsIGV2ZXIgbm90aWNlCisgICAgLy8gdGhlIHN1cGVycG9zaXRpb24uCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PElWU3RyaWRlVXNlKj4oJlNlbnRpbmVsKTsKKyAgfQorICBzdGF0aWMgdm9pZCBkZXN0cm95U2VudGluZWwoSVZTdHJpZGVVc2UqKSB7fQorCisgIElWU3RyaWRlVXNlICpwcm92aWRlSW5pdGlhbEhlYWQoKSBjb25zdCB7IHJldHVybiBjcmVhdGVTZW50aW5lbCgpOyB9CisgIElWU3RyaWRlVXNlICplbnN1cmVIZWFkKElWU3RyaWRlVXNlKikgY29uc3QgeyByZXR1cm4gY3JlYXRlU2VudGluZWwoKTsgfQorICBzdGF0aWMgdm9pZCBub3RlSGVhZChJVlN0cmlkZVVzZSosIElWU3RyaWRlVXNlKikge30KKworcHJpdmF0ZToKKyAgbXV0YWJsZSBpbGlzdF9ub2RlPElWU3RyaWRlVXNlPiBTZW50aW5lbDsKK307CisKK2NsYXNzIElWVXNlcnMgOiBwdWJsaWMgTG9vcFBhc3MgeworICBmcmllbmQgY2xhc3MgSVZTdHJpZGVVc2U7CisgIExvb3AgKkw7CisgIExvb3BJbmZvICpMSTsKKyAgRG9taW5hdG9yVHJlZSAqRFQ7CisgIFNjYWxhckV2b2x1dGlvbiAqU0U7CisgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uKiwxNj4gUHJvY2Vzc2VkOworCisgIC8vLyBJVlVzZXMgLSBBIGxpc3Qgb2YgYWxsIHRyYWNrZWQgSVYgdXNlcyBvZiBpbmR1Y3Rpb24gdmFyaWFibGUgZXhwcmVzc2lvbnMKKyAgLy8vIHdlIGFyZSBpbnRlcmVzdGVkIGluLgorICBpbGlzdDxJVlN0cmlkZVVzZT4gSVZVc2VzOworCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgcnVuT25Mb29wKExvb3AgKkwsIExQUGFzc01hbmFnZXIgJkxQTSk7CisKKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBJRCwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICBJVlVzZXJzKCk7CisKKyAgLy8vIEFkZFVzZXJzSWZJbnRlcmVzdGluZyAtIEluc3BlY3QgdGhlIHNwZWNpZmllZCBJbnN0cnVjdGlvbi4gIElmIGl0IGlzIGEKKyAgLy8vIHJlZHVjaWJsZSBTQ0VWLCByZWN1cnNpdmVseSBhZGQgaXRzIHVzZXJzIHRvIHRoZSBJVlVzZXNCeVN0cmlkZSBzZXQgYW5kCisgIC8vLyByZXR1cm4gdHJ1ZS4gIE90aGVyd2lzZSwgcmV0dXJuIGZhbHNlLgorICBib29sIEFkZFVzZXJzSWZJbnRlcmVzdGluZyhJbnN0cnVjdGlvbiAqSSk7CisKKyAgSVZTdHJpZGVVc2UgJkFkZFVzZXIoSW5zdHJ1Y3Rpb24gKlVzZXIsIFZhbHVlICpPcGVyYW5kKTsKKworICAvLy8gZ2V0UmVwbGFjZW1lbnRFeHByIC0gUmV0dXJuIGEgU0NFViBleHByZXNzaW9uIHdoaWNoIGNvbXB1dGVzIHRoZQorICAvLy8gdmFsdWUgb2YgdGhlIE9wZXJhbmRWYWxUb1JlcGxhY2Ugb2YgdGhlIGdpdmVuIElWU3RyaWRlVXNlLgorICBjb25zdCBTQ0VWICpnZXRSZXBsYWNlbWVudEV4cHIoY29uc3QgSVZTdHJpZGVVc2UgJklVKSBjb25zdDsKKworICAvLy8gZ2V0RXhwciAtIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIHVzZS4KKyAgY29uc3QgU0NFViAqZ2V0RXhwcihjb25zdCBJVlN0cmlkZVVzZSAmSVUpIGNvbnN0OworCisgIGNvbnN0IFNDRVYgKmdldFN0cmlkZShjb25zdCBJVlN0cmlkZVVzZSAmSVUsIGNvbnN0IExvb3AgKkwpIGNvbnN0OworCisgIHR5cGVkZWYgaWxpc3Q8SVZTdHJpZGVVc2U+OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiBpbGlzdDxJVlN0cmlkZVVzZT46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIElWVXNlcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gSVZVc2VzLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gSVZVc2VzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBJVlVzZXMuZW5kKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIElWVXNlcy5lbXB0eSgpOyB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSogPSAwKSBjb25zdDsKKworICAvLy8gZHVtcCAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGRlYnVnZ2luZy4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCitQYXNzICpjcmVhdGVJVlVzZXJzUGFzcygpOworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0lubGluZUNvc3QuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbmxpbmVDb3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyYmRkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbmxpbmVDb3N0LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8vPT09LSBJbmxpbmVDb3N0LmggLSBDb3N0IGFuYWx5c2lzIGZvciBpbmxpbmVyIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgaGV1cmlzdGljcyBmb3IgaW5saW5pbmcgZGVjaXNpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19JTkxJTkVDT1NUX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19JTkxJTkVDT1NUX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9WYWx1ZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ29kZU1ldHJpY3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIFZhbHVlOworICBjbGFzcyBGdW5jdGlvbjsKKyAgY2xhc3MgQmFzaWNCbG9jazsKKyAgY2xhc3MgQ2FsbFNpdGU7CisgIHRlbXBsYXRlPGNsYXNzIFB0clR5cGUsIHVuc2lnbmVkIFNtYWxsU2l6ZT4KKyAgY2xhc3MgU21hbGxQdHJTZXQ7CisKKyAgbmFtZXNwYWNlIElubGluZUNvbnN0YW50cyB7CisgICAgLy8gVmFyaW91cyBtYWdpYyBjb25zdGFudHMgdXNlZCB0byBhZGp1c3QgaGV1cmlzdGljcy4KKyAgICBjb25zdCBpbnQgSW5zdHJDb3N0ID0gNTsKKyAgICBjb25zdCBpbnQgSW5kaXJlY3RDYWxsQm9udXMgPSA1MDA7CisgICAgY29uc3QgaW50IENhbGxQZW5hbHR5ID0gMjU7CisgICAgY29uc3QgaW50IExhc3RDYWxsVG9TdGF0aWNCb251cyA9IC0xNTAwMDsKKyAgICBjb25zdCBpbnQgQ29sZGNjUGVuYWx0eSA9IDIwMDA7CisgICAgY29uc3QgaW50IE5vcmV0dXJuUGVuYWx0eSA9IDEwMDAwOworICB9CisKKyAgLy8vIElubGluZUNvc3QgLSBSZXByZXNlbnQgdGhlIGNvc3Qgb2YgaW5saW5pbmcgYSBmdW5jdGlvbi4gVGhpcworICAvLy8gc3VwcG9ydHMgc3BlY2lhbCB2YWx1ZXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBzaG91bGQgImFsd2F5cyIgb3IKKyAgLy8vICJuZXZlciIgYmUgaW5saW5lZC4gT3RoZXJ3aXNlLCB0aGUgY29zdCByZXByZXNlbnRzIGEgdW5pdGxlc3MKKyAgLy8vIGFtb3VudDsgc21hbGxlciB2YWx1ZXMgaW5jcmVhc2UgdGhlIGxpa2VseWhvb2Qgb2YgdGhlIGZ1bmN0aW9uCisgIC8vLyBiZWluZyBpbmxpbmVkLgorICBjbGFzcyBJbmxpbmVDb3N0IHsKKyAgICBlbnVtIEtpbmQgeworICAgICAgVmFsdWUsCisgICAgICBBbHdheXMsCisgICAgICBOZXZlcgorICAgIH07CisKKyAgICAvLyBUaGlzIGlzIGEgZG8taXQteW91cnNlbGYgaW1wbGVtZW50YXRpb24gb2YKKyAgICAvLyAgIGludCBDb3N0IDogMzA7CisgICAgLy8gICB1bnNpZ25lZCBUeXBlIDogMjsKKyAgICAvLyBXZSB1c2VkIHRvIHVzZSBiaXRmaWVsZHMsIGJ1dCB0aGV5IHdlcmUgc29tZXRpbWVzIG1pc2NvbXBpbGVkIChQUjM4MjIpLgorICAgIGVudW0geyBUWVBFX0JJVFMgPSAyIH07CisgICAgZW51bSB7IENPU1RfQklUUyA9IHVuc2lnbmVkKHNpemVvZih1bnNpZ25lZCkpICogQ0hBUl9CSVQgLSBUWVBFX0JJVFMgfTsKKyAgICB1bnNpZ25lZCBUeXBlZENvc3Q7IC8vIGludCBDb3N0IDogQ09TVF9CSVRTOyB1bnNpZ25lZCBUeXBlIDogVFlQRV9CSVRTOworCisgICAgS2luZCBnZXRUeXBlKCkgY29uc3QgeworICAgICAgcmV0dXJuIEtpbmQoVHlwZWRDb3N0ID4+IENPU1RfQklUUyk7CisgICAgfQorCisgICAgaW50IGdldENvc3QoKSBjb25zdCB7CisgICAgICAvLyBTaWduLWV4dGVuZCB0aGUgYm90dG9tIENPU1RfQklUUyBiaXRzLgorICAgICAgcmV0dXJuIChpbnQoVHlwZWRDb3N0IDw8IFRZUEVfQklUUykpID4+IFRZUEVfQklUUzsKKyAgICB9CisKKyAgICBJbmxpbmVDb3N0KGludCBDLCBpbnQgVCkgeworICAgICAgVHlwZWRDb3N0ID0gKHVuc2lnbmVkKEMgPDwgVFlQRV9CSVRTKSA+PiBUWVBFX0JJVFMpIHwgKFQgPDwgQ09TVF9CSVRTKTsKKyAgICAgIGFzc2VydChnZXRDb3N0KCkgPT0gQyAmJiAiQ29zdCBleGNlZWRzIElubGluZUNvc3QgcHJlY2lzaW9uIik7CisgICAgfQorICBwdWJsaWM6CisgICAgc3RhdGljIElubGluZUNvc3QgZ2V0KGludCBDb3N0KSB7IHJldHVybiBJbmxpbmVDb3N0KENvc3QsIFZhbHVlKTsgfQorICAgIHN0YXRpYyBJbmxpbmVDb3N0IGdldEFsd2F5cygpIHsgcmV0dXJuIElubGluZUNvc3QoMCwgQWx3YXlzKTsgfQorICAgIHN0YXRpYyBJbmxpbmVDb3N0IGdldE5ldmVyKCkgeyByZXR1cm4gSW5saW5lQ29zdCgwLCBOZXZlcik7IH0KKworICAgIGJvb2wgaXNWYXJpYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGUoKSA9PSBWYWx1ZTsgfQorICAgIGJvb2wgaXNBbHdheXMoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlKCkgPT0gQWx3YXlzOyB9CisgICAgYm9vbCBpc05ldmVyKCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZSgpID09IE5ldmVyOyB9CisKKyAgICAvLy8gZ2V0VmFsdWUoKSAtIFJldHVybiBhICJ2YXJpYWJsZSIgaW5saW5lIGNvc3QncyBhbW91bnQuIEl0IGlzCisgICAgLy8vIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBvbiBhbiAiYWx3YXlzIiBvciAibmV2ZXIiIElubGluZUNvc3QuCisgICAgaW50IGdldFZhbHVlKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGdldFR5cGUoKSA9PSBWYWx1ZSAmJiAiSW52YWxpZCBhY2Nlc3Mgb2YgSW5saW5lQ29zdCIpOworICAgICAgcmV0dXJuIGdldENvc3QoKTsKKyAgICB9CisgIH07CisKKyAgLy8vIElubGluZUNvc3RBbmFseXplciAtIENvc3QgYW5hbHl6ZXIgdXNlZCBieSBpbmxpbmVyLgorICBjbGFzcyBJbmxpbmVDb3N0QW5hbHl6ZXIgeworICAgIHN0cnVjdCBBcmdJbmZvIHsKKyAgICBwdWJsaWM6CisgICAgICB1bnNpZ25lZCBDb25zdGFudFdlaWdodDsKKyAgICAgIHVuc2lnbmVkIEFsbG9jYVdlaWdodDsKKworICAgICAgQXJnSW5mbyh1bnNpZ25lZCBDV2VpZ2h0LCB1bnNpZ25lZCBBV2VpZ2h0KQorICAgICAgICA6IENvbnN0YW50V2VpZ2h0KENXZWlnaHQpLCBBbGxvY2FXZWlnaHQoQVdlaWdodCkge30KKyAgICB9OworCisgICAgc3RydWN0IEZ1bmN0aW9uSW5mbyB7CisgICAgICBDb2RlTWV0cmljcyBNZXRyaWNzOworCisgICAgICAvLy8gQXJndW1lbnRXZWlnaHRzIC0gRWFjaCBmb3JtYWwgYXJndW1lbnQgb2YgdGhlIGZ1bmN0aW9uIGlzIGluc3BlY3RlZCB0bworICAgICAgLy8vIHNlZSBpZiBpdCBpcyB1c2VkIGluIGFueSBjb250ZXh0cyB3aGVyZSBtYWtpbmcgaXQgYSBjb25zdGFudCBvciBhbGxvY2EKKyAgICAgIC8vLyB3b3VsZCByZWR1Y2UgdGhlIGNvZGUgc2l6ZS4gIElmIHNvLCB3ZSBhZGQgc29tZSB2YWx1ZSB0byB0aGUgYXJndW1lbnQKKyAgICAgIC8vLyBlbnRyeSBoZXJlLgorICAgICAgc3RkOjp2ZWN0b3I8QXJnSW5mbz4gQXJndW1lbnRXZWlnaHRzOworCisgICAgICAvLy8gQ291bnRDb2RlUmVkdWN0aW9uRm9yQ29uc3RhbnQgLSBGaWd1cmUgb3V0IGFuIGFwcHJveGltYXRpb24gZm9yIGhvdworICAgICAgLy8vIG1hbnkgaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgY29uc3RhbnQgZm9sZGVkIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMKKyAgICAgIC8vLyBjb25zdGFudC4KKyAgICAgIHVuc2lnbmVkIENvdW50Q29kZVJlZHVjdGlvbkZvckNvbnN0YW50KFZhbHVlICpWKTsKKworICAgICAgLy8vIENvdW50Q29kZVJlZHVjdGlvbkZvckFsbG9jYSAtIEZpZ3VyZSBvdXQgYW4gYXBwcm94aW1hdGlvbiBvZiBob3cgbXVjaAorICAgICAgLy8vIHNtYWxsZXIgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgaWYgaXQgaXMgaW5saW5lZCBpbnRvIGEgY29udGV4dCB3aGVyZSBhbgorICAgICAgLy8vIGFyZ3VtZW50IGJlY29tZXMgYW4gYWxsb2NhLgorICAgICAgLy8vCisgICAgICB1bnNpZ25lZCBDb3VudENvZGVSZWR1Y3Rpb25Gb3JBbGxvY2EoVmFsdWUgKlYpOworCisgICAgICAvLy8gYW5hbHl6ZUZ1bmN0aW9uIC0gQWRkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24KKyAgICAgIC8vLyB0byB0aGUgY3VycmVudCBzdHJ1Y3R1cmUuCisgICAgICB2b2lkIGFuYWx5emVGdW5jdGlvbihGdW5jdGlvbiAqRik7CisKKyAgICAgIC8vLyBOZXZlcklubGluZSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gc2hvdWxkIG5ldmVyIGJlCisgICAgICAvLy8gaW5saW5lZCBpbnRvIGFueSBjYWxsZXIuCisgICAgICBib29sIE5ldmVySW5saW5lKCk7CisgICAgfTsKKworICAgIC8vIFRoZSBGdW5jdGlvbiogZm9yIGEgZnVuY3Rpb24gY2FuIGJlIGNoYW5nZWQgKGJ5IEFyZ3VtZW50UHJvbW90aW9uKTsKKyAgICAvLyB0aGUgVmFsdWVNYXAgd2lsbCB1cGRhdGUgaXRzZWxmIHdoZW4gdGhpcyBoYXBwZW5zLgorICAgIFZhbHVlTWFwPGNvbnN0IEZ1bmN0aW9uICosIEZ1bmN0aW9uSW5mbz4gQ2FjaGVkRnVuY3Rpb25JbmZvOworCisgIHB1YmxpYzoKKworICAgIC8vLyBnZXRJbmxpbmVDb3N0IC0gVGhlIGhldXJpc3RpYyB1c2VkIHRvIGRldGVybWluZSBpZiB3ZSBzaG91bGQgaW5saW5lIHRoZQorICAgIC8vLyBmdW5jdGlvbiBjYWxsIG9yIG5vdC4KKyAgICAvLy8KKyAgICBJbmxpbmVDb3N0IGdldElubGluZUNvc3QoQ2FsbFNpdGUgQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PGNvbnN0IEZ1bmN0aW9uICosIDE2PiAmTmV2ZXJJbmxpbmUpOworICAgIC8vLyBnZXRDYWxsZWRGdW5jdGlvbiAtIFRoZSBoZXVyaXN0aWMgdXNlZCB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGlubGluZQorICAgIC8vLyB0aGUgZnVuY3Rpb24gY2FsbCBvciBub3QuICBUaGUgY2FsbGVlIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCB0byBhbGxvdworICAgIC8vLyB5b3UgdG8gY2FsY3VsYXRlIHRoZSBjb3N0IG9mIGlubGluaW5nIGEgZnVuY3Rpb24gdmlhIGEgcG9pbnRlci4gIFRoZQorICAgIC8vLyByZXN1bHQgYXNzdW1lcyB0aGF0IHRoZSBpbmxpbmVkIHZlcnNpb24gd2lsbCBhbHdheXMgYmUgdXNlZC4gIFlvdSBzaG91bGQKKyAgICAvLy8gd2VpZ2h0IGl0IHlvdXJzZWxmIGluIGNhc2VzIHdoZXJlIHRoaXMgY2FsbGVlIHdpbGwgbm90IGFsd2F5cyBiZSBjYWxsZWQuCisgICAgSW5saW5lQ29zdCBnZXRJbmxpbmVDb3N0KENhbGxTaXRlIENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiAqQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxjb25zdCBGdW5jdGlvbiAqLCAxNj4gJk5ldmVySW5saW5lKTsKKworICAgIC8vLyBnZXRJbmxpbmVGdWRnZUZhY3RvciAtIFJldHVybiBhID4gMS4wIGZhY3RvciBpZiB0aGUgaW5saW5lciBzaG91bGQgdXNlIGEKKyAgICAvLy8gaGlnaGVyIHRocmVzaG9sZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZ1bmN0aW9uIGNhbGwgc2hvdWxkIGJlIGlubGluZWQuCisgICAgZmxvYXQgZ2V0SW5saW5lRnVkZ2VGYWN0b3IoQ2FsbFNpdGUgQ1MpOworCisgICAgLy8vIHJlc2V0Q2FjaGVkRnVuY3Rpb25JbmZvIC0gZXJhc2UgYW55IGNhY2hlZCBjb3N0IGluZm8gZm9yIHRoaXMgZnVuY3Rpb24uCisgICAgdm9pZCByZXNldENhY2hlZENvc3RJbmZvKEZ1bmN0aW9uKiBDYWxsZXIpIHsKKyAgICAgIENhY2hlZEZ1bmN0aW9uSW5mb1tDYWxsZXJdID0gRnVuY3Rpb25JbmZvKCk7CisgICAgfQorCisgICAgLy8vIGdyb3dDYWNoZWRDb3N0SW5mbyAtIHVwZGF0ZSB0aGUgY2FjaGVkIGNvc3QgaW5mbyBmb3IgQ2FsbGVyIGFmdGVyIENhbGxlZQorICAgIC8vLyBoYXMgYmVlbiBpbmxpbmVkLiBJZiBDYWxsZWUgaXMgTlVMTCBpdCBtZWFucyBhIGRlYWQgY2FsbCBoYXMgYmVlbgorICAgIC8vLyBlbGltaW5hdGVkLgorICAgIHZvaWQgZ3Jvd0NhY2hlZENvc3RJbmZvKEZ1bmN0aW9uKiBDYWxsZXIsIEZ1bmN0aW9uKiBDYWxsZWUpOworCisgICAgLy8vIGNsZWFyIC0gZW1wdHkgdGhlIGNhY2hlIG9mIGlubGluZSBjb3N0cworICAgIHZvaWQgY2xlYXIoKTsKKyAgfTsKKworICAvLy8gY2FsbElzU21hbGwgLSBJZiBhIGNhbGwgaXMgbGlrZWx5IHRvIGxvd2VyIHRvIGEgc2luZ2xlIHRhcmdldCBpbnN0cnVjdGlvbiwKKyAgLy8vIG9yIGlzIG90aGVyd2lzZSBkZWVtZWQgc21hbGwgcmV0dXJuIHRydWUuCisgIGJvb2wgY2FsbElzU21hbGwoY29uc3QgRnVuY3Rpb24gKkNhbGxlZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0luc3RydWN0aW9uU2ltcGxpZnkuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3ZTc0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgKQEAgLTAsMCArMSw4OCBAQAorLy89PT0tLSBJbnN0cnVjdGlvblNpbXBsaWZ5LmggLSBGb2xkIGluc3RydWN0aW9ucyBpbnRvIHNpbXBsZXIgZm9ybXMgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgcm91dGluZXMgZm9yIGZvbGRpbmcgaW5zdHJ1Y3Rpb25zIGludG8gc2ltcGxlciBmb3JtcyB0aGF0CisvLyBkbyBub3QgcmVxdWlyZSBjcmVhdGluZyBuZXcgaW5zdHJ1Y3Rpb25zLiAgRm9yIGV4YW1wbGUsIHRoaXMgZG9lcyBjb25zdGFudAorLy8gZm9sZGluZywgYW5kIGNhbiBoYW5kbGUgaWRlbnRpdGllcyBsaWtlIChYJjApLT4wLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19JTlNUUlVDVElPTlNJTVBMSUZZX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19JTlNUUlVDVElPTlNJTVBMSUZZX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgY2xhc3MgVmFsdWU7CisgIGNsYXNzIFRhcmdldERhdGE7CisKKyAgLy8vIFNpbXBsaWZ5QWRkSW5zdCAtIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBBZGQsIHNlZSBpZiB3ZSBjYW4KKyAgLy8vIGZvbGQgdGhlIHJlc3VsdC4gIElmIG5vdCwgdGhpcyByZXR1cm5zIG51bGwuCisgIFZhbHVlICpTaW1wbGlmeUFkZEluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgYm9vbCBpc05TVywgYm9vbCBpc05VVywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCA9IDApOworICAKKyAgLy8vIFNpbXBsaWZ5QW5kSW5zdCAtIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBBbmQsIHNlZSBpZiB3ZSBjYW4KKyAgLy8vIGZvbGQgdGhlIHJlc3VsdC4gIElmIG5vdCwgdGhpcyByZXR1cm5zIG51bGwuCisgIFZhbHVlICpTaW1wbGlmeUFuZEluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCA9IDApOworCisgIC8vLyBTaW1wbGlmeU9ySW5zdCAtIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBPciwgc2VlIGlmIHdlIGNhbgorICAvLy8gZm9sZCB0aGUgcmVzdWx0LiAgSWYgbm90LCB0aGlzIHJldHVybnMgbnVsbC4KKyAgVmFsdWUgKlNpbXBsaWZ5T3JJbnN0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCA9IDApOworICAKKyAgLy8vIFNpbXBsaWZ5SUNtcEluc3QgLSBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gSUNtcEluc3QsIHNlZSBpZiB3ZSBjYW4KKyAgLy8vIGZvbGQgdGhlIHJlc3VsdC4gIElmIG5vdCwgdGhpcyByZXR1cm5zIG51bGwuCisgIFZhbHVlICpTaW1wbGlmeUlDbXBJbnN0KHVuc2lnbmVkIFByZWRpY2F0ZSwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSAwKTsKKyAgCisgIC8vLyBTaW1wbGlmeUZDbXBJbnN0IC0gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIEZDbXBJbnN0LCBzZWUgaWYgd2UgY2FuCisgIC8vLyBmb2xkIHRoZSByZXN1bHQuICBJZiBub3QsIHRoaXMgcmV0dXJucyBudWxsLgorICBWYWx1ZSAqU2ltcGxpZnlGQ21wSW5zdCh1bnNpZ25lZCBQcmVkaWNhdGUsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREID0gMCk7CisgIAorICAvLy8gU2ltcGxpZnlTZWxlY3RJbnN0IC0gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgU2VsZWN0SW5zdCwgc2VlIGlmIHdlIGNhbiBmb2xkCisgIC8vLyB0aGUgcmVzdWx0LiAgSWYgbm90LCB0aGlzIHJldHVybnMgbnVsbC4KKyAgVmFsdWUgKlNpbXBsaWZ5U2VsZWN0SW5zdChWYWx1ZSAqQ29uZCwgVmFsdWUgKlRydWVWYWwsIFZhbHVlICpGYWxzZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCA9IDApOworCisgIC8vLyBTaW1wbGlmeUdFUEluc3QgLSBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gR2V0RWxlbWVudFB0ckluc3QsIHNlZSBpZiB3ZSBjYW4KKyAgLy8vIGZvbGQgdGhlIHJlc3VsdC4gIElmIG5vdCwgdGhpcyByZXR1cm5zIG51bGwuCisgIFZhbHVlICpTaW1wbGlmeUdFUEluc3QoVmFsdWUgKiBjb25zdCAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSAwKTsKKyAgCisgIC8vPT09IEhlbHBlciBmdW5jdGlvbnMgZm9yIGhpZ2hlciB1cCB0aGUgY2xhc3MgaGllcmFyY2h5LgorICAKKyAgCisgIC8vLyBTaW1wbGlmeUNtcEluc3QgLSBHaXZlbiBvcGVyYW5kcyBmb3IgYSBDbXBJbnN0LCBzZWUgaWYgd2UgY2FuCisgIC8vLyBmb2xkIHRoZSByZXN1bHQuICBJZiBub3QsIHRoaXMgcmV0dXJucyBudWxsLgorICBWYWx1ZSAqU2ltcGxpZnlDbXBJbnN0KHVuc2lnbmVkIFByZWRpY2F0ZSwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCA9IDApOworICAKKyAgLy8vIFNpbXBsaWZ5QmluT3AgLSBHaXZlbiBvcGVyYW5kcyBmb3IgYSBCaW5hcnlPcGVyYXRvciwgc2VlIGlmIHdlIGNhbgorICAvLy8gZm9sZCB0aGUgcmVzdWx0LiAgSWYgbm90LCB0aGlzIHJldHVybnMgbnVsbC4KKyAgVmFsdWUgKlNpbXBsaWZ5QmluT3AodW5zaWduZWQgT3Bjb2RlLCBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCAKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSAwKTsKKyAgCisgIC8vLyBTaW1wbGlmeUluc3RydWN0aW9uIC0gU2VlIGlmIHdlIGNhbiBjb21wdXRlIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoaXMKKyAgLy8vIGluc3RydWN0aW9uLiAgSWYgbm90LCB0aGlzIHJldHVybnMgbnVsbC4KKyAgVmFsdWUgKlNpbXBsaWZ5SW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFRhcmdldERhdGEgKlREID0gMCk7CisgIAorICAKKyAgLy8vIFJlcGxhY2VBbmRTaW1wbGlmeUFsbFVzZXMgLSBQZXJmb3JtIEZyb20tPnJlcGxhY2VBbGxVc2VzV2l0aChUbykgYW5kIHRoZW4KKyAgLy8vIGRlbGV0ZSB0aGUgRnJvbSBpbnN0cnVjdGlvbi4gIEluIGFkZGl0aW9uIHRvIGEgYmFzaWMgUkFVVywgdGhpcyBkb2VzIGEKKyAgLy8vIHJlY3Vyc2l2ZSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgdXBkYXRlZCBpbnN0cnVjdGlvbnMuICBUaGlzIGNhdGNoZXMKKyAgLy8vIHRoaW5ncyB3aGVyZSBvbmUgc2ltcGxpZmljYXRpb24gZXhwb3NlcyBvdGhlciBvcHBvcnR1bml0aWVzLiAgVGhpcyBvbmx5CisgIC8vLyBzaW1wbGlmaWVzIGFuZCBkZWxldGVzIHNjYWxhciBvcGVyYXRpb25zLCBpdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIENGRy4KKyAgLy8vCisgIHZvaWQgUmVwbGFjZUFuZFNpbXBsaWZ5QWxsVXNlcyhJbnN0cnVjdGlvbiAqRnJvbSwgVmFsdWUgKlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSAwKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWwuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnRlcnZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOGFkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWwuaApAQCAtMCwwICsxLDE1MyBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvSW50ZXJ2YWwuaCAtIEludGVydmFsIENsYXNzIERlY2xhcmF0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBJbnRlcnZhbCBjbGFzcywgd2hpY2gKKy8vIHJlcHJlc2VudHMgYSBzZXQgb2YgQ0ZHIG5vZGVzIGFuZCBpcyBhIHBvcnRpb24gb2YgYW4gaW50ZXJ2YWwgcGFydGl0aW9uLgorLy8KKy8vIEludGVydmFscyBoYXZlIHNvbWUgaW50ZXJlc3RpbmcgYW5kIHVzZWZ1bCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhlCisvLyBmb2xsb3dpbmc6CisvLyAgICAxLiBUaGUgaGVhZGVyIG5vZGUgb2YgYW4gaW50ZXJ2YWwgZG9taW5hdGVzIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlCisvLyAgICAgICBpbnRlcnZhbAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTlRFUlZBTF9ICisjZGVmaW5lIExMVk1fSU5URVJWQUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBJbnRlcnZhbCBDbGFzcyAtIEFuIEludGVydmFsIGlzIGEgc2V0IG9mIG5vZGVzIGRlZmluZWQgc3VjaCB0aGF0IGV2ZXJ5IG5vZGUKKy8vLyBpbiB0aGUgaW50ZXJ2YWwgaGFzIGFsbCBvZiBpdHMgcHJlZGVjZXNzb3JzIGluIHRoZSBpbnRlcnZhbCAoZXhjZXB0IGZvciB0aGUKKy8vLyBoZWFkZXIpCisvLy8KK2NsYXNzIEludGVydmFsIHsKKyAgLy8vIEhlYWRlck5vZGUgLSBUaGUgaGVhZGVyIEJhc2ljQmxvY2ssIHdoaWNoIGRvbWluYXRlcyBhbGwgQmFzaWNCbG9ja3MgaW4gdGhpcworICAvLy8gaW50ZXJ2YWwuICBBbHNvLCBhbnkgbG9vcHMgaW4gdGhpcyBpbnRlcnZhbCBtdXN0IGdvIHRocm91Z2ggdGhlIEhlYWRlck5vZGUuCisgIC8vLworICBCYXNpY0Jsb2NrICpIZWFkZXJOb2RlOworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPjo6aXRlcmF0b3Igc3VjY19pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj46Oml0ZXJhdG9yIHByZWRfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+OjppdGVyYXRvciBub2RlX2l0ZXJhdG9yOworCisgIGlubGluZSBJbnRlcnZhbChCYXNpY0Jsb2NrICpIZWFkZXIpIDogSGVhZGVyTm9kZShIZWFkZXIpIHsKKyAgICBOb2Rlcy5wdXNoX2JhY2soSGVhZGVyKTsKKyAgfQorCisgIGlubGluZSBJbnRlcnZhbChjb25zdCBJbnRlcnZhbCAmSSkgLy8gY29weSBjdG9yCisgICAgOiBIZWFkZXJOb2RlKEkuSGVhZGVyTm9kZSksIE5vZGVzKEkuTm9kZXMpLCBTdWNjZXNzb3JzKEkuU3VjY2Vzc29ycykge30KKworICBpbmxpbmUgQmFzaWNCbG9jayAqZ2V0SGVhZGVyTm9kZSgpIGNvbnN0IHsgcmV0dXJuIEhlYWRlck5vZGU7IH0KKworICAvLy8gTm9kZXMgLSBUaGUgYmFzaWMgYmxvY2tzIGluIHRoaXMgaW50ZXJ2YWwuCisgIC8vLworICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gTm9kZXM7CisKKyAgLy8vIFN1Y2Nlc3NvcnMgLSBMaXN0IG9mIEJhc2ljQmxvY2tzIHRoYXQgYXJlIHJlYWNoYWJsZSBkaXJlY3RseSBmcm9tIG5vZGVzIGluCisgIC8vLyB0aGlzIGludGVydmFsLCBidXQgYXJlIG5vdCBpbiB0aGUgaW50ZXJ2YWwgdGhlbXNlbHZlcy4KKyAgLy8vIFRoZXNlIG5vZGVzIG5lY2Vzc2FyaWx5IG11c3QgYmUgaGVhZGVyIG5vZGVzIGZvciBvdGhlciBpbnRlcnZhbHMuCisgIC8vLworICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gU3VjY2Vzc29yczsKKworICAvLy8gUHJlZGVjZXNzb3JzIC0gTGlzdCBvZiBCYXNpY0Jsb2NrcyB0aGF0IGhhdmUgdGhpcyBJbnRlcnZhbCdzIGhlYWRlciBibG9jaworICAvLy8gYXMgb25lIG9mIHRoZWlyIHN1Y2Nlc3NvcnMuCisgIC8vLworICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gUHJlZGVjZXNzb3JzOworCisgIC8vLyBjb250YWlucyAtIEZpbmQgb3V0IGlmIGEgYmFzaWMgYmxvY2sgaXMgaW4gdGhpcyBpbnRlcnZhbAorICBpbmxpbmUgYm9vbCBjb250YWlucyhCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOb2Rlcy5zaXplKCk7ICsraSkKKyAgICAgIGlmIChOb2Rlc1tpXSA9PSBCQikgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEkgZG9uJ3Qgd2FudCB0aGUgZGVwZW5kZW5jeSBvbiA8YWxnb3JpdGhtPgorICAgIC8vcmV0dXJuIGZpbmQoTm9kZXMuYmVnaW4oKSwgTm9kZXMuZW5kKCksIEJCKSAhPSBOb2Rlcy5lbmQoKTsKKyAgfQorCisgIC8vLyBpc1N1Y2Nlc3NvciAtIGZpbmQgb3V0IGlmIGEgYmFzaWMgYmxvY2sgaXMgYSBzdWNjZXNzb3Igb2YgdGhpcyBJbnRlcnZhbAorICBpbmxpbmUgYm9vbCBpc1N1Y2Nlc3NvcihCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBTdWNjZXNzb3JzLnNpemUoKTsgKytpKQorICAgICAgaWYgKFN1Y2Nlc3NvcnNbaV0gPT0gQkIpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBJIGRvbid0IHdhbnQgdGhlIGRlcGVuZGVuY3kgb24gPGFsZ29yaXRobT4KKyAgICAvL3JldHVybiBmaW5kKFN1Y2Nlc3NvcnMuYmVnaW4oKSwgU3VjY2Vzc29ycy5lbmQoKSwgQkIpICE9IFN1Y2Nlc3NvcnMuZW5kKCk7CisgIH0KKworICAvLy8gRXF1YWxpdHkgb3BlcmF0b3IuICBJdCBpcyBvbmx5IHZhbGlkIHRvIGNvbXBhcmUgdHdvIGludGVydmFscyBmcm9tIHRoZQorICAvLy8gc2FtZSBwYXJ0aXRpb24sIGJlY2F1c2Ugb2YgdGhpcywgYWxsIHdlIGhhdmUgdG8gY2hlY2sgaXMgdGhlIGhlYWRlciBub2RlCisgIC8vLyBmb3IgZXF1YWxpdHkuCisgIC8vLworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVydmFsICZJKSBjb25zdCB7CisgICAgcmV0dXJuIEhlYWRlck5vZGUgPT0gSS5IZWFkZXJOb2RlOworICB9CisKKyAgLy8vIGlzTG9vcCAtIEZpbmQgb3V0IGlmIHRoZXJlIGlzIGEgYmFjayBlZGdlIGluIHRoaXMgaW50ZXJ2YWwuLi4KKyAgYm9vbCBpc0xvb3AoKSBjb25zdDsKKworICAvLy8gcHJpbnQgLSBTaG93IGNvbnRlbnRzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC4uLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vLyBzdWNjX2JlZ2luL3N1Y2NfZW5kIC0gZGVmaW5lIG1ldGhvZHMgc28gdGhhdCBJbnRlcnZhbHMgbWF5IGJlIHVzZWQKKy8vLyBqdXN0IGxpa2UgQmFzaWNCbG9ja3MgY2FuIHdpdGggdGhlIHN1Y2NfKiBmdW5jdGlvbnMsIGFuZCAqOjpzdWNjX2l0ZXJhdG9yLgorLy8vCitpbmxpbmUgSW50ZXJ2YWw6OnN1Y2NfaXRlcmF0b3Igc3VjY19iZWdpbihJbnRlcnZhbCAqSSkgeworICByZXR1cm4gSS0+U3VjY2Vzc29ycy5iZWdpbigpOworfQoraW5saW5lIEludGVydmFsOjpzdWNjX2l0ZXJhdG9yIHN1Y2NfZW5kKEludGVydmFsICpJKSAgIHsKKyAgcmV0dXJuIEktPlN1Y2Nlc3NvcnMuZW5kKCk7Cit9CisKKy8vLyBwcmVkX2JlZ2luL3ByZWRfZW5kIC0gZGVmaW5lIG1ldGhvZHMgc28gdGhhdCBJbnRlcnZhbHMgbWF5IGJlIHVzZWQKKy8vLyBqdXN0IGxpa2UgQmFzaWNCbG9ja3MgY2FuIHdpdGggdGhlIHByZWRfKiBmdW5jdGlvbnMsIGFuZCAqOjpwcmVkX2l0ZXJhdG9yLgorLy8vCitpbmxpbmUgSW50ZXJ2YWw6OnByZWRfaXRlcmF0b3IgcHJlZF9iZWdpbihJbnRlcnZhbCAqSSkgeworICByZXR1cm4gSS0+UHJlZGVjZXNzb3JzLmJlZ2luKCk7Cit9CitpbmxpbmUgSW50ZXJ2YWw6OnByZWRfaXRlcmF0b3IgcHJlZF9lbmQoSW50ZXJ2YWwgKkkpICAgeworICByZXR1cm4gSS0+UHJlZGVjZXNzb3JzLmVuZCgpOworfQorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8SW50ZXJ2YWwqPiB7CisgIHR5cGVkZWYgSW50ZXJ2YWwgTm9kZVR5cGU7CisgIHR5cGVkZWYgSW50ZXJ2YWw6OnN1Y2NfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoSW50ZXJ2YWwgKkkpIHsgcmV0dXJuIEk7IH0KKworICAvLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIHN1Y2NfYmVnaW4oTik7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gc3VjY19lbmQoTik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPEludGVydmFsKj4gPiB7CisgIHR5cGVkZWYgSW50ZXJ2YWwgTm9kZVR5cGU7CisgIHR5cGVkZWYgSW50ZXJ2YWw6OnByZWRfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKEludmVyc2U8SW50ZXJ2YWwgKj4gRykgeyByZXR1cm4gRy5HcmFwaDsgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIHByZWRfYmVnaW4oTik7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gcHJlZF9lbmQoTik7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0ludGVydmFsSXRlcmF0b3IuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnRlcnZhbEl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiMzI5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnRlcnZhbEl0ZXJhdG9yLmgKQEAgLTAsMCArMSwyNTkgQEAKKy8vPT09LSBJbnRlcnZhbEl0ZXJhdG9yLmggLSBJbnRlcnZhbCBJdGVyYXRvciBEZWNsYXJhdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYW4gaXRlcmF0b3IgdGhhdCBlbnVtZXJhdGVzIHRoZSBpbnRlcnZhbHMgaW4gYSBjb250cm9sIGZsb3cKKy8vIGdyYXBoIG9mIHNvbWUgc29ydC4gIFRoaXMgaXRlcmF0b3IgaXMgcGFyYW1ldHJpYywgYWxsb3dpbmcgaXRlcmF0b3Igb3ZlciB0aGUKKy8vIGZvbGxvd2luZyB0eXBlcyBvZiBncmFwaHM6CisvLworLy8gIDEuIEEgRnVuY3Rpb24qIG9iamVjdCwgY29tcG9zZWQgb2YgQmFzaWNCbG9jayBub2Rlcy4KKy8vICAyLiBBbiBJbnRlcnZhbFBhcnRpdGlvbiYgb2JqZWN0LCBjb21wb3NlZCBvZiBJbnRlcnZhbCBub2Rlcy4KKy8vCisvLyBUaGlzIGl0ZXJhdG9yIGlzIGRlZmluZWQgdG8gd2FsayB0aGUgY29udHJvbCBmbG93IGdyYXBoLCByZXR1cm5pbmcgaW50ZXJ2YWxzCisvLyBpbiBkZXB0aCBmaXJzdCBvcmRlci4gIFRoZXNlIGludGVydmFscyBhcmUgY29tcGxldGVseSBmaWxsZWQgaW4gZXhjZXB0IGZvcgorLy8gdGhlIHByZWRlY2Vzc29yIGZpZWxkcyAodGhlIHN1Y2Nlc3NvciBpbmZvcm1hdGlvbiBpcyBmaWxsZWQgaW4gaG93ZXZlcikuCisvLworLy8gQnkgZGVmYXVsdCwgdGhlIGludGVydmFscyBjcmVhdGVkIGJ5IHRoaXMgaXRlcmF0b3IgYXJlIGRlbGV0ZWQgYWZ0ZXIgdGhleQorLy8gYXJlIG5vIGxvbmdlciBhbnkgdXNlIHRvIHRoZSBpdGVyYXRvci4gIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQgYnkKKy8vIHBhc3NpbmcgYSBmYWxzZSB2YWx1ZSBpbnRvIHRoZSBpbnRlcnZhbHNfYmVnaW4oKSBmdW5jdGlvbi4gVGhpcyBjYXVzZXMgdGhlCisvLyBJT3duTWVtIG1lbWJlciB0byBiZSBzZXQsIGFuZCB0aGUgaW50ZXJ2YWxzIHRvIG5vdCBiZSBkZWxldGVkLgorLy8KKy8vIEl0IGlzIG9ubHkgc2FmZSB0byB1c2UgdGhpcyBpZiBhbGwgb2YgdGhlIGludGVydmFscyBhcmUgZGVsZXRlZCBieSB0aGUgY2FsbGVyCisvLyBhbmQgYWxsIG9mIHRoZSBpbnRlcnZhbHMgYXJlIHByb2Nlc3NlZC4gIEhvd2V2ZXIsIHRoZSB1c2VyIG9mIHRoZSBpdGVyYXRvciBpcworLy8gbm90IGFsbG93ZWQgdG8gbW9kaWZ5IG9yIGRlbGV0ZSB0aGUgaW50ZXJ2YWxzIHVudGlsIGFmdGVyIHRoZSBpdGVyYXRvciBoYXMKKy8vIGJlZW4gdXNlZCBjb21wbGV0ZWx5LiAgVGhlIEludGVydmFsUGFydGl0aW9uIGNsYXNzIHVzZXMgdGhpcyBmdW5jdGlvbmFsaXR5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTlRFUlZBTF9JVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fSU5URVJWQUxfSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnRlcnZhbFBhcnRpdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gZ2V0Tm9kZUhlYWRlciAtIEdpdmVuIGEgc291cmNlIGdyYXBoIG5vZGUgYW5kIHRoZSBzb3VyY2UgZ3JhcGgsIHJldHVybiB0aGUKKy8vIEJhc2ljQmxvY2sgdGhhdCBpcyB0aGUgaGVhZGVyIG5vZGUuICBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZgorLy8gZ2V0U291cmNlR3JhcGhOb2RlLgorLy8KK2lubGluZSBCYXNpY0Jsb2NrICpnZXROb2RlSGVhZGVyKEJhc2ljQmxvY2sgKkJCKSB7IHJldHVybiBCQjsgfQoraW5saW5lIEJhc2ljQmxvY2sgKmdldE5vZGVIZWFkZXIoSW50ZXJ2YWwgKkkpIHsgcmV0dXJuIEktPmdldEhlYWRlck5vZGUoKTsgfQorCisvLyBnZXRTb3VyY2VHcmFwaE5vZGUgLSBHaXZlbiBhIEJhc2ljQmxvY2sgYW5kIHRoZSBzb3VyY2UgZ3JhcGgsIHJldHVybiB0aGUKKy8vIHNvdXJjZSBncmFwaCBub2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIEJhc2ljQmxvY2suICBUaGlzIGlzIHRoZSBvcHBvc2l0ZQorLy8gb2YgZ2V0Tm9kZUhlYWRlci4KKy8vCitpbmxpbmUgQmFzaWNCbG9jayAqZ2V0U291cmNlR3JhcGhOb2RlKEZ1bmN0aW9uICosIEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBCQjsKK30KK2lubGluZSBJbnRlcnZhbCAqZ2V0U291cmNlR3JhcGhOb2RlKEludGVydmFsUGFydGl0aW9uICpJUCwgQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIElQLT5nZXRCbG9ja0ludGVydmFsKEJCKTsKK30KKworLy8gYWRkTm9kZVRvSW50ZXJ2YWwgLSBUaGlzIG1ldGhvZCBleGlzdHMgdG8gYXNzaXN0IHRoZSBnZW5lcmljIFByb2Nlc3NOb2RlCisvLyB3aXRoIHRoZSB0YXNrIG9mIGFkZGluZyBhIG5vZGUgdG8gdGhlIG5ldyBpbnRlcnZhbCwgZGVwZW5kaW5nIG9uIHRoZQorLy8gdHlwZSBvZiB0aGUgc291cmNlIG5vZGUuICBJbiB0aGUgY2FzZSBvZiBhIENGRyBzb3VyY2UgZ3JhcGggKEJhc2ljQmxvY2sKKy8vIGNhc2UpLCB0aGUgQmFzaWNCbG9jayBpdHNlbGYgaXMgYWRkZWQgdG8gdGhlIGludGVydmFsLgorLy8KK2lubGluZSB2b2lkIGFkZE5vZGVUb0ludGVydmFsKEludGVydmFsICpJbnQsIEJhc2ljQmxvY2sgKkJCKSB7CisgIEludC0+Tm9kZXMucHVzaF9iYWNrKEJCKTsKK30KKworLy8gYWRkTm9kZVRvSW50ZXJ2YWwgLSBUaGlzIG1ldGhvZCBleGlzdHMgdG8gYXNzaXN0IHRoZSBnZW5lcmljIFByb2Nlc3NOb2RlCisvLyB3aXRoIHRoZSB0YXNrIG9mIGFkZGluZyBhIG5vZGUgdG8gdGhlIG5ldyBpbnRlcnZhbCwgZGVwZW5kaW5nIG9uIHRoZQorLy8gdHlwZSBvZiB0aGUgc291cmNlIG5vZGUuICBJbiB0aGUgY2FzZSBvZiBhIENGRyBzb3VyY2UgZ3JhcGggKEJhc2ljQmxvY2sKKy8vIGNhc2UpLCB0aGUgQmFzaWNCbG9jayBpdHNlbGYgaXMgYWRkZWQgdG8gdGhlIGludGVydmFsLiAgSW4gdGhlIGNhc2Ugb2YKKy8vIGFuIEludGVydmFsUGFydGl0aW9uIHNvdXJjZSBncmFwaCAoSW50ZXJ2YWwgY2FzZSksIGFsbCBvZiB0aGUgbWVtYmVyCisvLyBCYXNpY0Jsb2NrcyBhcmUgYWRkZWQgdG8gdGhlIGludGVydmFsLgorLy8KK2lubGluZSB2b2lkIGFkZE5vZGVUb0ludGVydmFsKEludGVydmFsICpJbnQsIEludGVydmFsICpJKSB7CisgIC8vIEFkZCBhbGwgb2YgdGhlIG5vZGVzIGluIEkgYXMgbmV3IG5vZGVzIGluIEludC4KKyAgY29weShJLT5Ob2Rlcy5iZWdpbigpLCBJLT5Ob2Rlcy5lbmQoKSwgYmFja19pbnNlcnRlcihJbnQtPk5vZGVzKSk7Cit9CisKKworCisKKwordGVtcGxhdGU8Y2xhc3MgTm9kZVR5LCBjbGFzcyBPcmlnQ29udGFpbmVyX3QsIGNsYXNzIEdUID0gR3JhcGhUcmFpdHM8Tm9kZVR5Kj4sCisgICAgICAgICBjbGFzcyBJR1QgPSBHcmFwaFRyYWl0czxJbnZlcnNlPE5vZGVUeSo+ID4gPgorY2xhc3MgSW50ZXJ2YWxJdGVyYXRvciB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxJbnRlcnZhbCosIHR5cGVuYW1lIEludGVydmFsOjpzdWNjX2l0ZXJhdG9yPiA+IEludFN0YWNrOworICBzdGQ6OnNldDxCYXNpY0Jsb2NrKj4gVmlzaXRlZDsKKyAgT3JpZ0NvbnRhaW5lcl90ICpPcmlnQ29udGFpbmVyOworICBib29sIElPd25NZW07ICAgICAvLyBJZiBUcnVlLCBkZWxldGUgaW50ZXJ2YWxzIHdoZW4gZG9uZSB3aXRoIHRoZW0KKyAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGZpbGUgaGVhZGVyIGZvciBjb25kaXRpb25zIG9mIHVzZQorcHVibGljOgorICB0eXBlZGVmIEludGVydmFsSXRlcmF0b3I8Tm9kZVR5LCBPcmlnQ29udGFpbmVyX3Q+IF9TZWxmOworICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgSW50ZXJ2YWxJdGVyYXRvcigpIHt9IC8vIEVuZCBpdGVyYXRvciwgZW1wdHkgc3RhY2sKKyAgSW50ZXJ2YWxJdGVyYXRvcihGdW5jdGlvbiAqTSwgYm9vbCBPd25NZW1vcnkpIDogSU93bk1lbShPd25NZW1vcnkpIHsKKyAgICBPcmlnQ29udGFpbmVyID0gTTsKKyAgICBpZiAoIVByb2Nlc3NJbnRlcnZhbCgmTS0+ZnJvbnQoKSkpIHsKKyAgICAgIGFzc2VydCgwICYmICJQcm9jZXNzSW50ZXJ2YWwgc2hvdWxkIG5ldmVyIGZhaWwgZm9yIGZpcnN0IGludGVydmFsISIpOworICAgIH0KKyAgfQorCisgIEludGVydmFsSXRlcmF0b3IoSW50ZXJ2YWxQYXJ0aXRpb24gJklQLCBib29sIE93bk1lbW9yeSkgOiBJT3duTWVtKE93bk1lbW9yeSkgeworICAgIE9yaWdDb250YWluZXIgPSAmSVA7CisgICAgaWYgKCFQcm9jZXNzSW50ZXJ2YWwoSVAuZ2V0Um9vdEludGVydmFsKCkpKSB7CisgICAgICBhc3NlcnQoMCAmJiAiUHJvY2Vzc0ludGVydmFsIHNob3VsZCBuZXZlciBmYWlsIGZvciBmaXJzdCBpbnRlcnZhbCEiKTsKKyAgICB9CisgIH0KKworICBpbmxpbmUgfkludGVydmFsSXRlcmF0b3IoKSB7CisgICAgaWYgKElPd25NZW0pCisgICAgICB3aGlsZSAoIUludFN0YWNrLmVtcHR5KCkpIHsKKyAgICAgICAgZGVsZXRlIG9wZXJhdG9yKigpOworICAgICAgICBJbnRTdGFjay5wb3BfYmFjaygpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfU2VsZiYgeCkgY29uc3QgeyByZXR1cm4gSW50U3RhY2sgPT0geC5JbnRTdGFjazt9CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgX1NlbGYmIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgaW5saW5lIGNvbnN0IEludGVydmFsICpvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBJbnRTdGFjay5iYWNrKCkuZmlyc3Q7IH0KKyAgaW5saW5lICAgICAgIEludGVydmFsICpvcGVyYXRvciooKSAgICAgICB7IHJldHVybiBJbnRTdGFjay5iYWNrKCkuZmlyc3Q7IH0KKyAgaW5saW5lIGNvbnN0IEludGVydmFsICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKyAgaW5saW5lICAgICAgIEludGVydmFsICpvcGVyYXRvci0+KCkgICAgICAgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKworICBfU2VsZiYgb3BlcmF0b3IrKygpIHsgIC8vIFByZWluY3JlbWVudAorICAgIGFzc2VydCghSW50U3RhY2suZW1wdHkoKSAmJiAiQXR0ZW1wdGluZyB0byB1c2UgaW50ZXJ2YWwgaXRlcmF0b3IgYXQgZW5kISIpOworICAgIGRvIHsKKyAgICAgIC8vIEFsbCBvZiB0aGUgaW50ZXJ2YWxzIG9uIHRoZSBzdGFjayBoYXZlIGJlZW4gdmlzaXRlZC4gIFRyeSB2aXNpdGluZworICAgICAgLy8gdGhlaXIgc3VjY2Vzc29ycyBub3cuCisgICAgICBJbnRlcnZhbDo6c3VjY19pdGVyYXRvciAmU3VjY0l0ID0gSW50U3RhY2suYmFjaygpLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kSXQgPSBzdWNjX2VuZChJbnRTdGFjay5iYWNrKCkuZmlyc3QpOworICAgICAgd2hpbGUgKFN1Y2NJdCAhPSBFbmRJdCkgeyAgICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCBpbnRlcnZhbCBzdWNjcworICAgICAgICBib29sIERvbmUgPSBQcm9jZXNzSW50ZXJ2YWwoZ2V0U291cmNlR3JhcGhOb2RlKE9yaWdDb250YWluZXIsICpTdWNjSXQpKTsKKyAgICAgICAgKytTdWNjSXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBpdGVyYXRvcgorICAgICAgICBpZiAoRG9uZSkgcmV0dXJuICp0aGlzOyAgICAgICAgICAgICAgICAgLy8gRm91bmQgYSBuZXcgaW50ZXJ2YWwhIFVzZSBpdCEKKyAgICAgIH0KKworICAgICAgLy8gRnJlZSBpbnRlcnZhbCBtZW1vcnkuLi4gaWYgbmVjZXNzYXJ5CisgICAgICBpZiAoSU93bk1lbSkgZGVsZXRlIEludFN0YWNrLmJhY2soKS5maXJzdDsKKworICAgICAgLy8gV2UgcmFuIG91dCBvZiBzdWNjZXNzb3JzIGZvciB0aGlzIGludGVydmFsLi4uIHBvcCBvZmYgdGhlIHN0YWNrCisgICAgICBJbnRTdGFjay5wb3BfYmFjaygpOworICAgIH0gd2hpbGUgKCFJbnRTdGFjay5lbXB0eSgpKTsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgIF9TZWxmIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9CisKK3ByaXZhdGU6CisgIC8vIFByb2Nlc3NJbnRlcnZhbCAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlCisgIC8vIGludGVydmFsIGdyYXBoLiAgSXQgd2Fsa3MgdGhyb3VnaCB0aGUgc291cmNlIGdyYXBoLCByZWN1cnNpdmVseSBjcmVhdGluZworICAvLyBhbiBpbnRlcnZhbCBwZXIgaW52b2thdGlvbiB1bnRpbCB0aGUgZW50aXJlIGdyYXBoIGlzIGNvdmVyZWQuICBUaGlzIHVzZXMKKyAgLy8gdGhlIFByb2Nlc3NOb2RlIG1ldGhvZCB0byBhZGQgYWxsIG9mIHRoZSBub2RlcyB0byB0aGUgaW50ZXJ2YWwuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGlzIHRlbXBsYXRlZCBiZWNhdXNlIGl0IG1heSBvcGVyYXRlIG9uIHR3byBkaWZmZXJlbnQgc291cmNlCisgIC8vIGdyYXBoczogYSBiYXNpYyBibG9jayBncmFwaCwgb3IgYSBwcmVleGlzdGluZyBpbnRlcnZhbCBncmFwaC4KKyAgLy8KKyAgYm9vbCBQcm9jZXNzSW50ZXJ2YWwoTm9kZVR5ICpOb2RlKSB7CisgICAgQmFzaWNCbG9jayAqSGVhZGVyID0gZ2V0Tm9kZUhlYWRlcihOb2RlKTsKKyAgICBpZiAoVmlzaXRlZC5jb3VudChIZWFkZXIpKSByZXR1cm4gZmFsc2U7CisKKyAgICBJbnRlcnZhbCAqSW50ID0gbmV3IEludGVydmFsKEhlYWRlcik7CisgICAgVmlzaXRlZC5pbnNlcnQoSGVhZGVyKTsgICAvLyBUaGUgaGVhZGVyIGhhcyBub3cgYmVlbiB2aXNpdGVkIQorCisgICAgLy8gQ2hlY2sgYWxsIG9mIG91ciBzdWNjZXNzb3JzIHRvIHNlZSBpZiB0aGV5IGFyZSBpbiB0aGUgaW50ZXJ2YWwuLi4KKyAgICBmb3IgKHR5cGVuYW1lIEdUOjpDaGlsZEl0ZXJhdG9yVHlwZSBJID0gR1Q6OmNoaWxkX2JlZ2luKE5vZGUpLAorICAgICAgICAgICBFID0gR1Q6OmNoaWxkX2VuZChOb2RlKTsgSSAhPSBFOyArK0kpCisgICAgICBQcm9jZXNzTm9kZShJbnQsIGdldFNvdXJjZUdyYXBoTm9kZShPcmlnQ29udGFpbmVyLCAqSSkpOworCisgICAgSW50U3RhY2sucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEludCwgc3VjY19iZWdpbihJbnQpKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBQcm9jZXNzTm9kZSAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBQcm9jZXNzSW50ZXJ2YWwgdG8gYWRkIG5vZGVzIHRvIHRoZQorICAvLyBpbnRlcnZhbCBiZWluZyBjb25zdHJ1Y3RlZCwgYW5kIGl0IGlzIGFsc28gY2FsbGVkIHJlY3Vyc2l2ZWx5IGFzIGl0IHdhbGtzCisgIC8vIHRoZSBzb3VyY2UgZ3JhcGguICBBIG5vZGUgaXMgYWRkZWQgdG8gdGhlIGN1cnJlbnQgaW50ZXJ2YWwgb25seSBpZiBhbGwgb2YKKyAgLy8gaXRzIHByZWRlY2Vzc29ycyBhcmUgYWxyZWFkeSBpbiB0aGUgZ3JhcGguICBUaGlzIGFsc28gdGFrZXMgY2FyZSBvZiBrZWVwaW5nCisgIC8vIHRoZSBzdWNjZXNzb3Igc2V0IG9mIGFuIGludGVydmFsIHVwIHRvIGRhdGUuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGlzIHRlbXBsYXRlZCBiZWNhdXNlIGl0IG1heSBvcGVyYXRlIG9uIHR3byBkaWZmZXJlbnQgc291cmNlCisgIC8vIGdyYXBoczogYSBiYXNpYyBibG9jayBncmFwaCwgb3IgYSBwcmVleGlzdGluZyBpbnRlcnZhbCBncmFwaC4KKyAgLy8KKyAgdm9pZCBQcm9jZXNzTm9kZShJbnRlcnZhbCAqSW50LCBOb2RlVHkgKk5vZGUpIHsKKyAgICBhc3NlcnQoSW50ICYmICJOdWxsIGludGVydmFsID09IGJhZCEiKTsKKyAgICBhc3NlcnQoTm9kZSAmJiAiTnVsbCBOb2RlID09IGJhZCEiKTsKKworICAgIEJhc2ljQmxvY2sgKk5vZGVIZWFkZXIgPSBnZXROb2RlSGVhZGVyKE5vZGUpOworCisgICAgaWYgKFZpc2l0ZWQuY291bnQoTm9kZUhlYWRlcikpIHsgICAgIC8vIE5vZGUgYWxyZWFkeSBiZWVuIHZpc2l0ZWQ/CisgICAgICBpZiAoSW50LT5jb250YWlucyhOb2RlSGVhZGVyKSkgeyAgIC8vIEFscmVhZHkgaW4gdGhpcyBpbnRlcnZhbC4uLgorICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG90aGVyIGludGVydmFsLCBhZGQgYXMgc3VjY2Vzc29yCisgICAgICAgIGlmICghSW50LT5pc1N1Y2Nlc3NvcihOb2RlSGVhZGVyKSkgLy8gQWRkIG9ubHkgaWYgbm90IGFscmVhZHkgaW4gc2V0CisgICAgICAgICAgSW50LT5TdWNjZXNzb3JzLnB1c2hfYmFjayhOb2RlSGVhZGVyKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBub3QgaW4gaW50ZXJ2YWwgeWV0CisgICAgICBmb3IgKHR5cGVuYW1lIElHVDo6Q2hpbGRJdGVyYXRvclR5cGUgSSA9IElHVDo6Y2hpbGRfYmVnaW4oTm9kZSksCisgICAgICAgICAgICAgRSA9IElHVDo6Y2hpbGRfZW5kKE5vZGUpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBpZiAoIUludC0+Y29udGFpbnMoKkkpKSB7ICAgICAgICAvLyBJZiBwcmVkIG5vdCBpbiBpbnRlcnZhbCwgd2UgY2FuJ3QgYmUKKyAgICAgICAgICBpZiAoIUludC0+aXNTdWNjZXNzb3IoTm9kZUhlYWRlcikpIC8vIEFkZCBvbmx5IGlmIG5vdCBhbHJlYWR5IGluIHNldAorICAgICAgICAgICAgSW50LT5TdWNjZXNzb3JzLnB1c2hfYmFjayhOb2RlSGVhZGVyKTsKKyAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIHlvdSBsYXRlcgorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIGdldCBoZXJlLCB0aGVuIGFsbCBvZiB0aGUgcHJlZGVjZXNzb3JzIG9mIEJCIGFyZSBpbiB0aGUgaW50ZXJ2YWwKKyAgICAgIC8vIGFscmVhZHkuICBJbiB0aGlzIGNhc2UsIHdlIG11c3QgYWRkIEJCIHRvIHRoZSBpbnRlcnZhbCEKKyAgICAgIGFkZE5vZGVUb0ludGVydmFsKEludCwgTm9kZSk7CisgICAgICBWaXNpdGVkLmluc2VydChOb2RlSGVhZGVyKTsgICAgIC8vIFRoZSBub2RlIGhhcyBub3cgYmVlbiB2aXNpdGVkIQorCisgICAgICBpZiAoSW50LT5pc1N1Y2Nlc3NvcihOb2RlSGVhZGVyKSkgeworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGluIHRoZSBzdWNjZXNzb3IgbGlzdCBmcm9tIGJlZm9yZS4uLiByZW1vdmUgZnJvbSBzdWNjIGxpc3QKKyAgICAgICAgSW50LT5TdWNjZXNzb3JzLmVyYXNlKHN0ZDo6cmVtb3ZlKEludC0+U3VjY2Vzc29ycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50LT5TdWNjZXNzb3JzLmVuZCgpLCBOb2RlSGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludC0+U3VjY2Vzc29ycy5lbmQoKSk7CisgICAgICB9CisKKyAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZGlzY292ZXJlZCB0aGF0IE5vZGUgaXMgaW4gdGhlIGludGVydmFsLCBwZXJoYXBzIHNvbWUKKyAgICAgIC8vIG9mIGl0cyBzdWNjZXNzb3JzIGFyZSBhcyB3ZWxsPworICAgICAgZm9yICh0eXBlbmFtZSBHVDo6Q2hpbGRJdGVyYXRvclR5cGUgSXQgPSBHVDo6Y2hpbGRfYmVnaW4oTm9kZSksCisgICAgICAgICAgICAgRW5kID0gR1Q6OmNoaWxkX2VuZChOb2RlKTsgSXQgIT0gRW5kOyArK0l0KQorICAgICAgICBQcm9jZXNzTm9kZShJbnQsIGdldFNvdXJjZUdyYXBoTm9kZShPcmlnQ29udGFpbmVyLCAqSXQpKTsKKyAgICB9CisgIH0KK307CisKK3R5cGVkZWYgSW50ZXJ2YWxJdGVyYXRvcjxCYXNpY0Jsb2NrLCBGdW5jdGlvbj4gZnVuY3Rpb25faW50ZXJ2YWxfaXRlcmF0b3I7Cit0eXBlZGVmIEludGVydmFsSXRlcmF0b3I8SW50ZXJ2YWwsIEludGVydmFsUGFydGl0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxfcGFydF9pbnRlcnZhbF9pdGVyYXRvcjsKKworCitpbmxpbmUgZnVuY3Rpb25faW50ZXJ2YWxfaXRlcmF0b3IgaW50ZXJ2YWxzX2JlZ2luKEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlbGV0ZUludHMgPSB0cnVlKSB7CisgIHJldHVybiBmdW5jdGlvbl9pbnRlcnZhbF9pdGVyYXRvcihGLCBEZWxldGVJbnRzKTsKK30KK2lubGluZSBmdW5jdGlvbl9pbnRlcnZhbF9pdGVyYXRvciBpbnRlcnZhbHNfZW5kKEZ1bmN0aW9uICopIHsKKyAgcmV0dXJuIGZ1bmN0aW9uX2ludGVydmFsX2l0ZXJhdG9yKCk7Cit9CisKK2lubGluZSBpbnRlcnZhbF9wYXJ0X2ludGVydmFsX2l0ZXJhdG9yCisgICBpbnRlcnZhbHNfYmVnaW4oSW50ZXJ2YWxQYXJ0aXRpb24gJklQLCBib29sIERlbGV0ZUludGVydmFscyA9IHRydWUpIHsKKyAgcmV0dXJuIGludGVydmFsX3BhcnRfaW50ZXJ2YWxfaXRlcmF0b3IoSVAsIERlbGV0ZUludGVydmFscyk7Cit9CisKK2lubGluZSBpbnRlcnZhbF9wYXJ0X2ludGVydmFsX2l0ZXJhdG9yIGludGVydmFsc19lbmQoSW50ZXJ2YWxQYXJ0aXRpb24gJklQKSB7CisgIHJldHVybiBpbnRlcnZhbF9wYXJ0X2ludGVydmFsX2l0ZXJhdG9yKCk7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0ludGVydmFsUGFydGl0aW9uLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWxQYXJ0aXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWE1Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0ludGVydmFsUGFydGl0aW9uLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vPT09LSBJbnRlcnZhbFBhcnRpdGlvbi5oIC0gSW50ZXJ2YWwgcGFydGl0aW9uIENhbGN1bGF0aW9uIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgSW50ZXJ2YWxQYXJ0aXRpb24gY2xhc3MsIHdoaWNoCisvLyBjYWxjdWxhdGVzIGFuZCByZXByZXNlbnRzIHRoZSBpbnRlcnZhbCBwYXJ0aXRpb24gb2YgYSBmdW5jdGlvbiwgb3IgYQorLy8gcHJlZXhpc3RpbmcgaW50ZXJ2YWwgcGFydGl0aW9uLgorLy8KKy8vIEluIHRoaXMgd2F5LCB0aGUgaW50ZXJ2YWwgcGFydGl0aW9uIG1heSBiZSB1c2VkIHRvIHJlZHVjZSBhIGZsb3cgZ3JhcGggZG93bgorLy8gdG8gaXRzIGRlZ2VuZXJhdGUgc2luZ2xlIG5vZGUgaW50ZXJ2YWwgcGFydGl0aW9uICh1bmxlc3MgaXQgaXMgaXJyZWR1Y2libGUpLgorLy8KKy8vIFRPRE86IFRoZSBJbnRlcnZhbFBhcnRpdGlvbiBjbGFzcyBzaG91bGQgdGFrZSBhIGJvb2wgcGFyYW1ldGVyIHRoYXQgdGVsbHMKKy8vIHdoZXRoZXIgaXQgc2hvdWxkIGFkZCB0aGUgInRhaWxzIiBvZiBhbiBpbnRlcnZhbCB0byBhbiBpbnRlcnZhbCBpdHNlbGYgb3IgaWYKKy8vIHRoZXkgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGFzIGRpc3RpbmN0IGludGVydmFscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSU5URVJWQUxfUEFSVElUSU9OX0gKKyNkZWZpbmUgTExWTV9JTlRFUlZBTF9QQVJUSVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnRlcnZhbC5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEludGVydmFsUGFydGl0aW9uIC0gVGhpcyBjbGFzcyBidWlsZHMgYW5kIGhvbGRzIGFuICJpbnRlcnZhbCBwYXJ0aXRpb24iIGZvcgorLy8gYSBmdW5jdGlvbi4gIFRoaXMgcGFydGl0aW9uIGRpdmlkZXMgdGhlIGNvbnRyb2wgZmxvdyBncmFwaCBpbnRvIGEgc2V0IG9mCisvLyBtYXhpbWFsIGludGVydmFscywgYXMgZGVmaW5lZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIGFib3ZlLiAgSW50dWl0aXZlbHksIGEKKy8vIEJhc2ljQmxvY2sgaXMgYSAocG9zc2libHkgbm9uZXhpc3RlbnQpIGxvb3Agd2l0aCBhICJ0YWlsIiBvZiBub24gbG9vcGluZworLy8gbm9kZXMgZm9sbG93aW5nIGl0LgorLy8KK2NsYXNzIEludGVydmFsUGFydGl0aW9uIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHR5cGVkZWYgc3RkOjptYXA8QmFzaWNCbG9jayosIEludGVydmFsKj4gSW50ZXJ2YWxNYXBUeTsKKyAgSW50ZXJ2YWxNYXBUeSBJbnRlcnZhbE1hcDsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEludGVydmFsKj4gSW50ZXJ2YWxMaXN0VHk7CisgIEludGVydmFsICpSb290SW50ZXJ2YWw7CisgIHN0ZDo6dmVjdG9yPEludGVydmFsKj4gSW50ZXJ2YWxzOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisKKyAgSW50ZXJ2YWxQYXJ0aXRpb24oKSA6IEZ1bmN0aW9uUGFzcyhJRCksIFJvb3RJbnRlcnZhbCgwKSB7fQorCisgIC8vIHJ1biAtIENhbGN1bGF0ZSB0aGUgaW50ZXJ2YWwgcGFydGl0aW9uIGZvciB0aGlzIGZ1bmN0aW9uCisgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKworICAvLyBJbnRlcnZhbFBhcnRpdGlvbiBjdG9yIC0gQnVpbGQgYSByZWR1Y2VkIGludGVydmFsIHBhcnRpdGlvbiBmcm9tIGFuCisgIC8vIGV4aXN0aW5nIGludGVydmFsIGdyYXBoLiAgVGhpcyB0YWtlcyBhbiBhZGRpdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyIHRvCisgIC8vIGRpc3Rpbmd1aXNoIGl0IGZyb20gYSBjb3B5IGNvbnN0cnVjdG9yLiAgQWx3YXlzIHBhc3MgaW4gZmFsc2UgZm9yIG5vdy4KKyAgLy8KKyAgSW50ZXJ2YWxQYXJ0aXRpb24oSW50ZXJ2YWxQYXJ0aXRpb24gJkksIGJvb2wpOworCisgIC8vIHByaW50IC0gU2hvdyBjb250ZW50cyBpbiBodW1hbiByZWFkYWJsZSBmb3JtYXQuLi4KKyAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUqID0gMCkgY29uc3Q7CisKKyAgLy8gZ2V0Um9vdEludGVydmFsKCkgLSBSZXR1cm4gdGhlIHJvb3QgaW50ZXJ2YWwgdGhhdCBjb250YWlucyB0aGUgc3RhcnRpbmcKKyAgLy8gYmxvY2sgb2YgdGhlIGZ1bmN0aW9uLgorICBpbmxpbmUgSW50ZXJ2YWwgKmdldFJvb3RJbnRlcnZhbCgpIHsgcmV0dXJuIFJvb3RJbnRlcnZhbDsgfQorCisgIC8vIGlzRGVnZW5lcmF0ZVBhcnRpdGlvbigpIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBpbnRlcnZhbCBwYXJ0aXRpb24gY29udGFpbnMKKyAgLy8gYSBzaW5nbGUgaW50ZXJ2YWwsIGFuZCB0aHVzIGNhbm5vdCBiZSBzaW1wbGlmaWVkIGFueW1vcmUuCisgIGJvb2wgaXNEZWdlbmVyYXRlUGFydGl0aW9uKCkgeyByZXR1cm4gSW50ZXJ2YWxzLnNpemUoKSA9PSAxOyB9CisKKyAgLy8gVE9ETzogaXNJcnJlZHVjaWJsZSAtIGxvb2sgZm9yIHRyaWFuZ2xlIGdyYXBoLgorCisgIC8vIGdldEJsb2NrSW50ZXJ2YWwgLSBSZXR1cm4gdGhlIGludGVydmFsIHRoYXQgYSBiYXNpYyBibG9jayBleGlzdHMgaW4uCisgIGlubGluZSBJbnRlcnZhbCAqZ2V0QmxvY2tJbnRlcnZhbChCYXNpY0Jsb2NrICpCQikgeworICAgIEludGVydmFsTWFwVHk6Oml0ZXJhdG9yIEkgPSBJbnRlcnZhbE1hcC5maW5kKEJCKTsKKyAgICByZXR1cm4gSSAhPSBJbnRlcnZhbE1hcC5lbmQoKSA/IEktPnNlY29uZCA6IDA7CisgIH0KKworICAvLyBnZXRBbmFseXNpc1VzYWdlIC0gSW1wbGVtZW50IHRoZSBQYXNzIEFQSQorICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICB9CisKKyAgLy8gSW50ZXJmYWNlIHRvIEludGVydmFscyB2ZWN0b3IuLi4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8SW50ZXJ2YWwqPiAmZ2V0SW50ZXJ2YWxzKCkgY29uc3QgeyByZXR1cm4gSW50ZXJ2YWxzOyB9CisKKyAgLy8gcmVsZWFzZU1lbW9yeSAtIFJlc2V0IHN0YXRlIGJhY2sgdG8gYmVmb3JlIGZ1bmN0aW9uIHdhcyBhbmFseXplZAorICB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKworcHJpdmF0ZToKKyAgLy8gYWRkSW50ZXJ2YWxUb1BhcnRpdGlvbiAtIEFkZCBhbiBpbnRlcnZhbCB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBpbnRlcnZhbHMsCisgIC8vIGFuZCB0aGVuIGFkZCBtYXBwaW5ncyBmcm9tIGFsbCBvZiB0aGUgYmFzaWMgYmxvY2tzIGluIHRoZSBpbnRlcnZhbCB0byB0aGUKKyAgLy8gaW50ZXJ2YWwgaXRzZWxmIChpbiB0aGUgSW50ZXJ2YWxNYXApLgorICAvLworICB2b2lkIGFkZEludGVydmFsVG9QYXJ0aXRpb24oSW50ZXJ2YWwgKkkpOworCisgIC8vIHVwZGF0ZVByZWRlY2Vzc29ycyAtIEludGVydmFsIGdlbmVyYXRpb24gb25seSBzZXRzIHRoZSBzdWNjZXNzb3IgZmllbGRzIG9mCisgIC8vIHRoZSBpbnRlcnZhbCBkYXRhIHN0cnVjdHVyZXMuICBBZnRlciBpbnRlcnZhbCBnZW5lcmF0aW9uIGlzIGNvbXBsZXRlLAorICAvLyBydW4gdGhyb3VnaCBhbGwgb2YgdGhlIGludGVydmFscyBhbmQgcHJvcGFnYXRlIHN1Y2Nlc3NvciBpbmZvIGFzCisgIC8vIHByZWRlY2Vzc29yIGluZm8uCisgIC8vCisgIHZvaWQgdXBkYXRlUHJlZGVjZXNzb3JzKEludGVydmFsICpJbnQpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGF6eVZhbHVlSW5mby5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlWYWx1ZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE2NGMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlWYWx1ZUluZm8uaApAQCAtMCwwICsxLDc3IEBACisvLz09PS0gTGF6eVZhbHVlSW5mby5oIC0gVmFsdWUgY29uc3RyYWludCBhbmFseXNpcyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIGxhenkgY29tcHV0YXRpb24gb2YgdmFsdWUgY29uc3RyYWludAorLy8gaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xJVkVWQUxVRVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0xJVkVWQUxVRVNfSAorCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQ29uc3RhbnQ7CisgIGNsYXNzIFRhcmdldERhdGE7CisgIGNsYXNzIFZhbHVlOworICAKKy8vLyBMYXp5VmFsdWVJbmZvIC0gVGhpcyBwYXNzIGNvbXB1dGVzLCBjYWNoZXMsIGFuZCB2ZW5kcyBsYXp5IHZhbHVlIGNvbnN0cmFpbnQKKy8vLyBpbmZvcm1hdGlvbi4KK2NsYXNzIExhenlWYWx1ZUluZm8gOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgY2xhc3MgVGFyZ2V0RGF0YSAqVEQ7CisgIHZvaWQgKlBJbXBsOworICBMYXp5VmFsdWVJbmZvKGNvbnN0IExhenlWYWx1ZUluZm8mKTsgLy8gRE8gTk9UIElNUExFTUVOVC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTGF6eVZhbHVlSW5mbyYpOyAvLyBETyBOT1QgSU1QTEVNRU5ULgorcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgTGF6eVZhbHVlSW5mbygpIDogRnVuY3Rpb25QYXNzKElEKSwgUEltcGwoMCkge30KKyAgfkxhenlWYWx1ZUluZm8oKSB7IGFzc2VydChQSW1wbCA9PSAwICYmICJyZWxlYXNlTWVtb3J5IG5vdCBjYWxsZWQiKTsgfQorCisgIC8vLyBUcmlzdGF0ZSAtIFRoaXMgaXMgdXNlZCB0byByZXR1cm4gdHJ1ZS9mYWxzZS9kdW5ubyByZXN1bHRzLgorICBlbnVtIFRyaXN0YXRlIHsKKyAgICBVbmtub3duID0gLTEsIEZhbHNlID0gMCwgVHJ1ZSA9IDEKKyAgfTsKKyAgCisgIAorICAvLyBQdWJsaWMgcXVlcnkgaW50ZXJmYWNlLgorICAKKyAgLy8vIGdldFByZWRpY2F0ZU9uRWRnZSAtIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgY29tcGFyaXNvbgorICAvLy8gd2l0aCBhIGNvbnN0YW50IGlzIGtub3duIHRvIGJlIHRydWUgb3IgZmFsc2Ugb24gdGhlIHNwZWNpZmllZCBDRkcgZWRnZS4KKyAgLy8vIFByZWQgaXMgYSBDbXBJbnN0IHByZWRpY2F0ZS4KKyAgVHJpc3RhdGUgZ2V0UHJlZGljYXRlT25FZGdlKHVuc2lnbmVkIFByZWQsIFZhbHVlICpWLCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkZyb21CQiwgQmFzaWNCbG9jayAqVG9CQik7CisgIAorICAKKyAgLy8vIGdldENvbnN0YW50IC0gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBrbm93biB0byBiZSBhCisgIC8vLyBjb25zdGFudCBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suICBSZXR1cm4gbnVsbCBpZiBub3QuCisgIENvbnN0YW50ICpnZXRDb25zdGFudChWYWx1ZSAqViwgQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBnZXRDb25zdGFudE9uRWRnZSAtIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMga25vd24gdG8gYmUgYQorICAvLy8gY29uc3RhbnQgb24gdGhlIHNwZWNpZmllZCBlZGdlLiAgUmV0dXJuIG51bGwgaWYgbm90LgorICBDb25zdGFudCAqZ2V0Q29uc3RhbnRPbkVkZ2UoVmFsdWUgKlYsIEJhc2ljQmxvY2sgKkZyb21CQiwgQmFzaWNCbG9jayAqVG9CQik7CisgIAorICAvLy8gdGhyZWFkRWRnZSAtIEluZm9ybSB0aGUgYW5hbHlzaXMgY2FjaGUgdGhhdCB3ZSBoYXZlIHRocmVhZGVkIGFuIGVkZ2UgZnJvbQorICAvLy8gUHJlZEJCIHRvIE9sZFN1Y2MgdG8gYmUgZnJvbSBQcmVkQkIgdG8gTmV3U3VjYyBpbnN0ZWFkLgorICB2b2lkIHRocmVhZEVkZ2UoQmFzaWNCbG9jayAqUHJlZEJCLCBCYXNpY0Jsb2NrICpPbGRTdWNjLCBCYXNpY0Jsb2NrICpOZXdTdWNjKTsKKyAgCisgIAorICAvLyBJbXBsZW1lbnRhdGlvbiBib2lsZXJwbGF0ZS4KKyAgCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKyAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGliQ2FsbEFsaWFzQW5hbHlzaXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MaWJDYWxsQWxpYXNBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YWRmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGliQ2FsbEFsaWFzQW5hbHlzaXMuaApAQCAtMCwwICsxLDcxIEBACisvLz09PS0gTGliQ2FsbEFsaWFzQW5hbHlzaXMuaCAtIEltcGxlbWVudCBBbGlhc0FuYWx5c2lzIGZvciBsaWJjYWxscyAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBMaWJDYWxsQWxpYXNBbmFseXNpcyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTElCQ0FMTF9BQV9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTElCQ0FMTF9BQV9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBMaWJDYWxsSW5mbzsKKyAgc3RydWN0IExpYkNhbGxGdW5jdGlvbkluZm87CisgIAorICAvLy8gTGliQ2FsbEFsaWFzQW5hbHlzaXMgLSBBbGlhcyBhbmFseXNpcyBkcml2ZW4gZnJvbSBMaWJDYWxsSW5mby4KKyAgc3RydWN0IExpYkNhbGxBbGlhc0FuYWx5c2lzIDogcHVibGljIEZ1bmN0aW9uUGFzcywgcHVibGljIEFsaWFzQW5hbHlzaXMgeworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBDbGFzcyBpZGVudGlmaWNhdGlvbgorICAgIAorICAgIExpYkNhbGxJbmZvICpMQ0k7CisgICAgCisgICAgZXhwbGljaXQgTGliQ2FsbEFsaWFzQW5hbHlzaXMoTGliQ2FsbEluZm8gKkxDID0gMCkKKyAgICAgIDogRnVuY3Rpb25QYXNzKElEKSwgTENJKExDKSB7CisgICAgfQorICAgIGV4cGxpY2l0IExpYkNhbGxBbGlhc0FuYWx5c2lzKGNoYXIgJklELCBMaWJDYWxsSW5mbyAqTEMpCisgICAgICA6IEZ1bmN0aW9uUGFzcyhJRCksIExDSShMQykgeworICAgIH0KKyAgICB+TGliQ2FsbEFsaWFzQW5hbHlzaXMoKTsKKyAgICAKKyAgICBNb2RSZWZSZXN1bHQgZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqUCwgdW5zaWduZWQgU2l6ZSk7CisgICAgCisgICAgTW9kUmVmUmVzdWx0IGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUNhbGxTaXRlIENTMikgeworICAgICAgLy8gVE9ETzogQ291bGQgY29tcGFyZSB0d28gZGlyZWN0IGNhbGxzIGFnYWluc3QgZWFjaCBvdGhlciBpZiB3ZSBjYXJlZCB0by4KKyAgICAgIHJldHVybiBBbGlhc0FuYWx5c2lzOjpnZXRNb2RSZWZJbmZvKENTMSwgQ1MyKTsKKyAgICB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0OworICAgIAorICAgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgICAgICBJbml0aWFsaXplQWxpYXNBbmFseXNpcyh0aGlzKTsgICAgICAgICAgICAgICAgIC8vIHNldCB1cCBzdXBlciBjbGFzcworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvLy8gZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gYSBwYXNzIGltcGxlbWVudHMKKyAgICAvLy8gYW4gYW5hbHlzaXMgaW50ZXJmYWNlIHRocm91Z2ggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiBuZWVkZWQsIGl0CisgICAgLy8vIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGFkanVzdCB0aGUgdGhpcyBwb2ludGVyIGFzIG5lZWRlZCBmb3IgdGhlCisgICAgLy8vIHNwZWNpZmllZCBwYXNzIGluZm8uCisgICAgdmlydHVhbCB2b2lkICpnZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlcihjb25zdCB2b2lkICpQSSkgeworICAgICAgaWYgKFBJID09ICZBbGlhc0FuYWx5c2lzOjpJRCkKKyAgICAgICAgcmV0dXJuIChBbGlhc0FuYWx5c2lzKil0aGlzOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICBwcml2YXRlOgorICAgIE1vZFJlZlJlc3VsdCBBbmFseXplTGliQ2FsbERldGFpbHMoY29uc3QgTGliQ2FsbEZ1bmN0aW9uSW5mbyAqRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVDYWxsU2l0ZSBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpQLCB1bnNpZ25lZCBTaXplKTsKKyAgfTsKK30gIC8vIEVuZCBvZiBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MaWJDYWxsU2VtYW50aWNzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGliQ2FsbFNlbWFudGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDdjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGliQ2FsbFNlbWFudGljcy5oCkBAIC0wLDAgKzEsMTY3IEBACisvLz09PS0gTGliQ2FsbFNlbWFudGljcy5oIC0gRGVzY3JpYmUgbGlicmFyeSBzZW1hbnRpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGludGVyZmFjZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXNjcmliZSBsYW5ndWFnZSBzcGVjaWZpYworLy8gcnVudGltZSBsaWJyYXJ5IGludGVyZmFjZXMgKGUuZy4gbGliYywgbGlibSwgZXRjKSB0byBMTFZNIG9wdGltaXplcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xJQkNBTExTRU1BTlRJQ1NfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0xJQkNBTExTRU1BTlRJQ1NfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLy8gTGliQ2FsbExvY2F0aW9uSW5mbyAtIFRoaXMgc3RydWN0IGRlc2NyaWJlcyBhIHNldCBvZiBtZW1vcnkgbG9jYXRpb25zIHRoYXQKKyAgLy8vIGFyZSBhY2Nlc3NlZCBieSBsaWJjYWxscy4gIElkZW50aWZpY2F0aW9uIG9mIGEgbG9jYXRpb24gaXMgZG9pbmcgd2l0aCBhCisgIC8vLyBzaW1wbGUgY2FsbGJhY2sgZnVuY3Rpb24uCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIHRoZSBMaWJDYWxsSW5mbyBtYXkgYmUgc2V0IHVwIHRvIG1vZGVsIHRoZSBiZWhhdmlvciBvZgorICAvLy8gc3RhbmRhcmQgbGlibSBmdW5jdGlvbnMuICBUaGUgbG9jYXRpb24gdGhhdCB0aGV5IG1heSBiZSBpbnRlcmVzdGVkIGluIGlzCisgIC8vLyBhbiBhYnN0cmFjdCBsb2NhdGlvbiB0aGF0IHJlcHJlc2VudHMgZXJybm8gZm9yIHRoZSBjdXJyZW50IHRhcmdldC4gIEluCisgIC8vLyB0aGlzIGNhc2UsIGEgbG9jYXRpb24gZm9yIGVycm5vIGlzIGFueXRoaW5nIHN1Y2ggdGhhdCB0aGUgcHJlZGljYXRlCisgIC8vLyByZXR1cm5zIHRydWUuICBPbiBNYWMgT1MvWCwgdGhpcyBwcmVkaWNhdGUgd291bGQgcmV0dXJuIHRydWUgaWYgdGhlCisgIC8vLyBwb2ludGVyIGlzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvICJfX2Vycm9yKCkiLgorICAvLy8KKyAgLy8vIExvY2F0aW9ucyBjYW4gYWxzbyBiZSBkZWZpbmVkIGluIGEgY29uc3RhbnQtc2Vuc2l0aXZlIHdheS4gIEZvciBleGFtcGxlLAorICAvLy8gaXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIGEgbG9jYXRpb24gdGhhdCByZXR1cm5zIHRydWUgaWZmIGl0IGlzIHBhc3NlZAorICAvLy8gaW50byB0aGUgY2FsbCBhcyBhIHNwZWNpZmljIGFyZ3VtZW50LiAgVGhpcyBpcyB1c2VmdWwgZm9yIG1vZGVsaW5nIHRoaW5ncworICAvLy8gbGlrZSAicHJpbnRmIiwgd2hpY2ggY2FuIHN0b3JlIHRvIG1lbW9yeSwgYnV0IG9ubHkgdGhyb3VnaCBwb2ludGVycyBwYXNzZWQKKyAgLy8vIHdpdGggYSAnJW4nIGNvbnN0cmFpbnQuCisgIC8vLworICBzdHJ1Y3QgTGliQ2FsbExvY2F0aW9uSW5mbyB7CisgICAgLy8gVE9ETzogRmxhZ3M6IGlzQ29udGV4dFNlbnNpdGl2ZSBldGMuCisgICAgCisgICAgLy8vIGlzTG9jYXRpb24gLSBSZXR1cm4gYSBMb2NSZXN1bHQgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIHJlZmVycyB0byB0aGlzCisgICAgLy8vIGxvY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGNhbGwgc2l0ZS4gIFRoaXMgcmV0dXJucyAiWWVzIiBpZiB3ZSBjYW4gdGVsbAorICAgIC8vLyB0aGF0IHRoZSBwb2ludGVyICpkb2VzIGRlZmluaXRlbHkqIHJlZmVyIHRvIHRoZSBsb2NhdGlvbiwgIk5vIiBpZiB3ZSBjYW4KKyAgICAvLy8gdGVsbCB0aGF0IHRoZSBsb2NhdGlvbiAqZGVmaW5pdGVseSBkb2VzIG5vdCogcmVmZXIgdG8gdGhlIGxvY2F0aW9uLCBhbmQKKyAgICAvLy8gcmV0dXJucyAiVW5rbm93biIgaWYgd2UgY2Fubm90IHRlbGwgZm9yIGNlcnRhaW4uCisgICAgZW51bSBMb2NSZXN1bHQgeworICAgICAgWWVzLCBObywgVW5rbm93bgorICAgIH07CisgICAgTG9jUmVzdWx0ICgqaXNMb2NhdGlvbikoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlB0ciwgdW5zaWduZWQgU2l6ZSk7CisgIH07CisgIAorICAvLy8gTGliQ2FsbEZ1bmN0aW9uSW5mbyAtIEVhY2ggcmVjb3JkIGluIHRoZSBhcnJheSBvZiBGdW5jdGlvbkluZm8gc3RydWN0cworICAvLy8gcmVjb3JkcyB0aGUgYmVoYXZpb3Igb2Ygb25lIGxpYmNhbGwgdGhhdCBpcyBrbm93biBieSB0aGUgb3B0aW1pemVyLiAgVGhpcworICAvLy8gY2FwdHVyZXMgdGhpbmdzIGxpa2UgdGhlIHNpZGUgZWZmZWN0cyBvZiB0aGUgY2FsbC4gIFNpZGUgZWZmZWN0cyBhcmUKKyAgLy8vIG1vZGVsZWQgYm90aCB1bml2ZXJzYWxseSAoaW4gdGhlIHJlYWRub25lL3JlYWRvbmx5KSBzZW5zZSwgYnV0IGFsc28KKyAgLy8vIHBvdGVudGlhbGx5IGFnYWluc3QgYSBzZXQgb2YgYWJzdHJhY3QgbG9jYXRpb25zIGRlZmluZWQgYnkgdGhlIG9wdGltaXplci4KKyAgLy8vIFRoaXMgYWxsb3dzIGFuIG9wdGltaXplciB0byBkZWZpbmUgdGhhdCBzb21lIGxpYmNhbGwgKGUuZy4gc3FydCkgaXMKKyAgLy8vIHNpZGUtZWZmZWN0IGZyZWUgZXhjZXB0IHRoYXQgaXQgbWlnaHQgbW9kaWZ5IGVycm5vICh0aHVzLCB0aGUgY2FsbCBpcworICAvLy8gKm5vdCogdW5pdmVyc2FsbHkgcmVhZG9ubHkpLiAgT3IgaXQgbWlnaHQgc2F5IHRoYXQgdGhlIHNpZGUgZWZmZWN0cworICAvLy8gYXJlIHVua25vd24gb3RoZXIgdGhhbiB0byBzYXkgdGhhdCBlcnJubyBpcyBub3QgbW9kaWZpZWQuCisgIC8vLworICBzdHJ1Y3QgTGliQ2FsbEZ1bmN0aW9uSW5mbyB7CisgICAgLy8vIE5hbWUgLSBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBsaWJjYWxsIHRoaXMgZGVzY3JpYmVzLgorICAgIGNvbnN0IGNoYXIgKk5hbWU7CisgICAgCisgICAgLy8vIFRPRE86IENvbnN0YW50IGZvbGRpbmcgZnVuY3Rpb246IENvbnN0YW50KiB2ZWN0b3IgLT4gQ29uc3RhbnQqLgorICAgIAorICAgIC8vLyBVbml2ZXJzYWxCZWhhdmlvciAtIFRoaXMgY2FwdHVyZXMgdGhlIGFic29sdXRlIG1vZC9yZWYgYmVoYXZpb3Igd2l0aG91dAorICAgIC8vLyBhbnkgc3BlY2lmaWMgY29udGV4dCBrbm93bGVkZ2UuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGZ1bmN0aW9uIGlzIGtub3duCisgICAgLy8vIHRvIGJlIHJlYWRvbmx5LCB0aGlzIHdvdWxkIGJlIHNldCB0byAncmVmJy4gIElmIGtub3duIHRvIGJlIHJlYWRub25lLAorICAgIC8vLyB0aGlzIGlzIHNldCB0byBOb01vZFJlZi4KKyAgICBBbGlhc0FuYWx5c2lzOjpNb2RSZWZSZXN1bHQgVW5pdmVyc2FsQmVoYXZpb3I7CisgICAgCisgICAgLy8vIExvY2F0aW9uTVJJbmZvIC0gVGhpcyBwYWlyIGNhcHR1cmVzIGluZm8gYWJvdXQgd2hldGhlciBhIHNwZWNpZmljCisgICAgLy8vIGxvY2F0aW9uIGlzIG1vZGlmaWVkIG9yIHJlZmVyZW5jZWQgYnkgYSBsaWJjYWxsLgorICAgIHN0cnVjdCBMb2NhdGlvbk1SSW5mbyB7CisgICAgICAvLy8gTG9jYXRpb25JRCAtIElEICMgb2YgdGhlIGFjY2Vzc2VkIGxvY2F0aW9uIG9yIH4wVSBmb3IgYXJyYXkgZW5kLgorICAgICAgdW5zaWduZWQgTG9jYXRpb25JRDsKKyAgICAgIC8vLyBNUkluZm8gLSBNb2QvUmVmIGluZm8gZm9yIHRoaXMgbG9jYXRpb24uCisgICAgICBBbGlhc0FuYWx5c2lzOjpNb2RSZWZSZXN1bHQgTVJJbmZvOworICAgIH07CisgICAgCisgICAgLy8vIERldGFpbHNUeXBlIC0gSW5kaWNhdGUgdGhlIHNlbnNlIG9mIHRoZSBMb2NhdGlvbkRldGFpbHMgYXJyYXkuICBUaGlzCisgICAgLy8vIGNvbnRyb2xzIGhvdyB0aGUgTG9jYXRpb25EZXRhaWxzIGFycmF5IGlzIGludGVycHJldGVkLgorICAgIGVudW0geworICAgICAgLy8vIERvZXNPbmx5IC0gSWYgRGV0YWlsc1R5cGUgaXMgc2V0IHRvIERvZXNPbmx5LCB0aGVuIHdlIGtub3cgdGhhdCB0aGUKKyAgICAgIC8vLyAqb25seSogbW9kL3JlZiBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGlzIGNhcHR1cmVkIGJ5IHRoZQorICAgICAgLy8vIExvY2F0aW9uRGV0YWlscyBhcnJheS4gIElmIHdlIGFyZSB0cnlpbmcgdG8gc2F5IHRoYXQgJ3NxcnQnIGNhbiBvbmx5CisgICAgICAvLy8gbW9kaWZ5IGVycm5vLCB3ZSdkIGhhdmUgdGhlIHtlcnJub2xvYyxtb2R9IGluIHRoZSBMb2NhdGlvbkRldGFpbHMKKyAgICAgIC8vLyBhcnJheSBhbmQgaGF2ZSBEZXRhaWxzVHlwZSBzZXQgdG8gRG9lc09ubHkuCisgICAgICBEb2VzT25seSwKKyAgICAgIAorICAgICAgLy8vIERvZXNOb3QgLSBJZiBEZXRhaWxzVHlwZSBpcyBzZXQgdG8gRG9lc05vdCwgdGhlbiB0aGUgc2Vuc2Ugb2YgdGhlCisgICAgICAvLy8gTG9jYXRpb25EZXRhaWxzIGFycmF5IGlzIGNvbXBsZXRlbHkgaW52ZXJ0ZWQuICBUaGlzIG1lYW5zIHRoYXQgd2UgKmRvCisgICAgICAvLy8gbm90KiBrbm93IGV2ZXJ5dGhpbmcgYWJvdXQgdGhlIHNpZGUgZWZmZWN0cyBvZiB0aGlzIGxpYmNhbGwsIGJ1dCB3ZSBkbworICAgICAgLy8vIGtub3cgdGhpbmdzIHRoYXQgdGhlIGxpYmNhbGwgY2Fubm90IGRvLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNvbXBsZXgKKyAgICAgIC8vLyBmdW5jdGlvbnMgbGlrZSAnY3RpbWUnIHdoaWNoIGhhdmUgY3JhenkgbW9kL3JlZiBiZWhhdmlvciwgYnV0IGFyZQorICAgICAgLy8vIGtub3duIHRvIG5ldmVyIHJlYWQgb3Igd3JpdGUgZXJybm8uICBJbiB0aGlzIGNhc2UsIHdlJ2QgaGF2ZQorICAgICAgLy8vIHtlcnJub2xvYyxtb2RyZWZ9IGluIHRoZSBMb2NhdGlvbkRldGFpbHMgYXJyYXkgYW5kIERldGFpbHNUeXBlIHdvdWxkCisgICAgICAvLy8gYmUgc2V0IHRvIERvZXNOb3QsIGluZGljYXRpbmcgdGhhdCBjdGltZSBkb2VzIG5vdCByZWFkIG9yIHdyaXRlIHRoZQorICAgICAgLy8vIGVycm5vIGxvY2F0aW9uLgorICAgICAgRG9lc05vdAorICAgIH0gRGV0YWlsc1R5cGU7CisgICAgCisgICAgLy8vIExvY2F0aW9uRGV0YWlscyAtIFRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIExvY2F0aW9uTVJJbmZvCisgICAgLy8vIHN0cnVjdHMgd2hpY2ggaW5kaWNhdGVzIHRoZSBiZWhhdmlvciBvZiB0aGUgbGliY2FsbCB3LnIudC4gc3BlY2lmaWMKKyAgICAvLy8gbG9jYXRpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgbGliY2FsbCBpcyBrbm93biB0byBvbmx5IG1vZGlmeQorICAgIC8vLyAnZXJybm8nLCBpdCB3b3VsZCBoYXZlIGEgTG9jYXRpb25EZXRhaWxzIGFycmF5IHdpdGggdGhlIGVycm5vIElEIGFuZAorICAgIC8vLyAnbW9kJyBpbiBpdC4gIFNlZSB0aGUgRGV0YWlsc1R5cGUgZmllbGQgZm9yIGhvdyB0aGlzIGlzIGludGVycHJldGVkLgorICAgIC8vLworICAgIC8vLyBJbiB0aGUgIkRvZXNPbmx5IiBjYXNlLCB0aGlzIGluZm9ybWF0aW9uIGlzICdtYXknIGluZm9ybWF0aW9uIGZvcjogdGhlcmUKKyAgICAvLy8gaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHNwZWNpZmllZCBzaWRlIGVmZmVjdCBhY3R1YWxseSBkb2VzIGhhcHBlbiwKKyAgICAvLy8ganVzdCB0aGF0IGl0IGNvdWxkLiAgSW4gdGhlICJEb2VzTm90IiBjYXNlLCB0aGlzIGlzICdtdXN0IG5vdCcgaW5mby4KKyAgICAvLy8KKyAgICAvLy8gSWYgdGhpcyBwb2ludGVyIGlzIG51bGwsIG5vIGRldGFpbHMgYXJlIGtub3duLgorICAgIC8vLworICAgIGNvbnN0IExvY2F0aW9uTVJJbmZvICpMb2NhdGlvbkRldGFpbHM7CisgIH07CisgIAorICAKKyAgLy8vIExpYkNhbGxJbmZvIC0gQWJzdHJhY3QgaW50ZXJmYWNlIHRvIHF1ZXJ5IGFib3V0IGxpYnJhcnkgY2FsbCBpbmZvcm1hdGlvbi4KKyAgLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJldHVybiBrbm93biBpbmZvcm1hdGlvbiBhYm91dCBzb21lIHNldCBvZgorICAvLy8gbGliY2FsbHMuCisgIC8vLyAKKyAgY2xhc3MgTGliQ2FsbEluZm8geworICAgIC8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgdGhpcyBvYmplY3QsIHByaXZhdGUuCisgICAgbXV0YWJsZSB2b2lkICpJbXBsOworICAgIG11dGFibGUgY29uc3QgTGliQ2FsbExvY2F0aW9uSW5mbyAqTG9jYXRpb25zOworICAgIG11dGFibGUgdW5zaWduZWQgTnVtTG9jYXRpb25zOworICBwdWJsaWM6CisgICAgTGliQ2FsbEluZm8oKSA6IEltcGwoMCksIExvY2F0aW9ucygwKSwgTnVtTG9jYXRpb25zKDApIHt9CisgICAgdmlydHVhbCB+TGliQ2FsbEluZm8oKTsKKyAgICAKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gIEFjY2Vzc29yIE1ldGhvZHM6IEVmZmljaWVudCBhY2Nlc3MgdG8gY29udGFpbmVkIGRhdGEuCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIAorICAgIC8vLyBnZXRMb2NhdGlvbkluZm8gLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBMb2NhdGlvbklELgorICAgIGNvbnN0IExpYkNhbGxMb2NhdGlvbkluZm8gJmdldExvY2F0aW9uSW5mbyh1bnNpZ25lZCBMb2NJRCkgY29uc3Q7CisgICAgCisgICAgCisgICAgLy8vIGdldEZ1bmN0aW9uSW5mbyAtIFJldHVybiB0aGUgTGliQ2FsbEZ1bmN0aW9uSW5mbyBvYmplY3QgY29ycmVzcG9uZGluZyB0bworICAgIC8vLyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlmIHdlIGhhdmUgaXQuICBJZiBub3QsIHJldHVybiBudWxsLgorICAgIGNvbnN0IExpYkNhbGxGdW5jdGlvbkluZm8gKmdldEZ1bmN0aW9uSW5mbyhjb25zdCBGdW5jdGlvbiAqRikgY29uc3Q7CisgICAgCisgICAgCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vICBJbXBsZW1lbnRhdGlvbiBNZXRob2RzOiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhlc2UuCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIAorICAgIC8vLyBnZXRMb2NhdGlvbkluZm8gLSBSZXR1cm4gZGVzY3JpcHRvcnMgZm9yIHRoZSBsb2NhdGlvbnMgcmVmZXJlbmNlZCBieQorICAgIC8vLyB0aGlzIHNldCBvZiBsaWJjYWxscy4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldExvY2F0aW9uSW5mbyhjb25zdCBMaWJDYWxsTG9jYXRpb25JbmZvIComQXJyYXkpIGNvbnN0IHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICAvLy8gZ2V0RnVuY3Rpb25JbmZvQXJyYXkgLSBSZXR1cm4gYW4gYXJyYXkgb2YgZGVzY3JpcHRvcnMgdGhhdCBkZXNjcmliZSB0aGUKKyAgICAvLy8gc2V0IG9mIGxpYmNhbGxzIHJlcHJlc2VudGVkIGJ5IHRoaXMgTGliQ2FsbEluZm8gb2JqZWN0LiAgVGhpcyBhcnJheSBpcworICAgIC8vLyB0ZXJtaW5hdGVkIGJ5IGFuIGVudHJ5IHdpdGggYSBOVUxMIG5hbWUuCisgICAgdmlydHVhbCBjb25zdCBMaWJDYWxsRnVuY3Rpb25JbmZvICpnZXRGdW5jdGlvbkluZm9BcnJheSgpIGNvbnN0ID0gMDsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGludC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjY1ZDIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xpbnQuaApAQCAtMCwwICsxLDUxIEBACisvLz09PS0tIGxsdm0vQW5hbHlzaXMvTGludC5oIC0gTExWTSBJUiBMaW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGxpbnQgaW50ZXJmYWNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBzb21lIHNhbml0eSBjaGVja2luZworLy8gb2YgaW5wdXQgdG8gdGhlIHN5c3RlbSwgYW5kIGZvciBjaGVja2luZyB0aGF0IHRyYW5zZm9ybWF0aW9ucworLy8gaGF2ZW4ndCBkb25lIHNvbWV0aGluZyBiYWQuIEluIGNvbnRyYXN0IHRvIHRoZSBWZXJpZmllciwgdGhlIExpbnQgY2hlY2tlcgorLy8gY2hlY2tzIGZvciB1bmRlZmluZWQgYmVoYXZpb3Igb3IgY29uc3RydWN0aW9ucyB3aXRoIGxpa2VseSB1bmludGVuZGVkCisvLyBiZWhhdmlvci4KKy8vCisvLyBUbyBzZWUgd2hhdCBzcGVjaWZpY2FsbHkgaXMgY2hlY2tlZCwgbG9vayBhdCBMaW50LmNwcAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19MSU5UX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MSU5UX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBGdW5jdGlvbjsKKworLy8vIEBicmllZiBDcmVhdGUgYSBsaW50IHBhc3MuCisvLy8KKy8vLyBDaGVjayBhIG1vZHVsZSBvciBmdW5jdGlvbi4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTGludFBhc3MoKTsKKworLy8vIEBicmllZiBDaGVjayBhIG1vZHVsZS4KKy8vLworLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWdnaW5nLCBiZWNhdXNlIGl0IHBsYXlzIGdhbWVzIHdpdGgKKy8vLyBQYXNzTWFuYWdlcnMgYW5kIHN0dWZmLgordm9pZCBsaW50TW9kdWxlKAorICBjb25zdCBNb2R1bGUgJk0gICAgLy8vPCBUaGUgbW9kdWxlIHRvIGJlIGNoZWNrZWQKKyk7CisKKy8vIGxpbnRGdW5jdGlvbiAtIENoZWNrIGEgZnVuY3Rpb24uCit2b2lkIGxpbnRGdW5jdGlvbigKKyAgY29uc3QgRnVuY3Rpb24gJkYgIC8vLzwgVGhlIGZ1bmN0aW9uIHRvIGJlIGNoZWNrZWQKKyk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xpdmVWYWx1ZXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MaXZlVmFsdWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyY2I3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MaXZlVmFsdWVzLmgKQEAgLTAsMCArMSw5OSBAQAorLy89PT0tIExpdmVWYWx1ZXMuaCAtIExpdmVuZXNzIGluZm9ybWF0aW9uIGZvciBMTFZNIElSIFZhbHVlcy4gLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgTExWTSBJUiBWYWx1ZSBsaXZlbmVzcworLy8gYW5hbHlzaXMgcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTElWRVZBTFVFU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTElWRVZBTFVFU19ICisKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgVmFsdWU7CisKKy8vLyBMaXZlVmFsdWVzIC0gQW5hbHlzaXMgdGhhdCBwcm92aWRlcyBsaXZlbmVzcyBpbmZvcm1hdGlvbiBmb3IKKy8vLyBMTFZNIElSIFZhbHVlcy4KKy8vLworY2xhc3MgTGl2ZVZhbHVlcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgTG9vcEluZm8gKkxJOworCisgIC8vLyBNZW1vIC0gQSBidW5jaCBvZiBzdGF0ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSB2YWx1ZS4KKyAgLy8vCisgIHN0cnVjdCBNZW1vIHsKKyAgICAvLy8gVXNlZCAtIFRoZSBzZXQgb2YgYmxvY2tzIHdoaWNoIGNvbnRhaW4gYSB1c2Ugb2YgdGhlIHZhbHVlLgorICAgIC8vLworICAgIFNtYWxsUHRyU2V0PGNvbnN0IEJhc2ljQmxvY2sgKiwgND4gVXNlZDsKKworICAgIC8vLyBMaXZlVGhyb3VnaCAtIEEgY29uc2VydmF0aXZlIGFwcHJveGltYXRpb24gb2YgdGhlIHNldCBvZiBibG9ja3MgaW4KKyAgICAvLy8gd2hpY2ggdGhlIHZhbHVlIGlzIGxpdmUtdGhyb3VnaCwgbWVhbmluZyBibG9ja3MgcHJvcGVybHkgZG9taW5hdGVkCisgICAgLy8vIGJ5IHRoZSBkZWZpbml0aW9uLCBhbmQgZnJvbSB3aGljaCBibG9ja3MgY29udGFpbmluZyB1c2VzIG9mIHRoZQorICAgIC8vLyB2YWx1ZSBhcmUgcmVhY2hhYmxlLgorICAgIC8vLworICAgIFNtYWxsUHRyU2V0PGNvbnN0IEJhc2ljQmxvY2sgKiwgND4gTGl2ZVRocm91Z2g7CisKKyAgICAvLy8gS2lsbGVkIC0gQSBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbiBvZiB0aGUgc2V0IG9mIGJsb2NrcyBpbiB3aGljaAorICAgIC8vLyB0aGUgdmFsdWUgaXMgdXNlZCBhbmQgbm90IGxpdmUtb3V0LgorICAgIC8vLworICAgIFNtYWxsUHRyU2V0PGNvbnN0IEJhc2ljQmxvY2sgKiwgND4gS2lsbGVkOworICB9OworCisgIC8vLyBNZW1vcyAtIFJlbWVtYmVycyB0aGUgTWVtbyBmb3IgZWFjaCBWYWx1ZS4gVGhpcyBpcyBwb3B1bGF0ZWQgb24KKyAgLy8vIGRlbWFuZC4KKyAgLy8vCisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIE1lbW8+IE1lbW9zOworCisgIC8vLyBnZXRNZW1vIC0gUmV0cmlldmUgYW4gZXhpc3RpbmcgTWVtbyBmb3IgdGhlIGdpdmVuIHZhbHVlIGlmIG9uZQorICAvLy8gaXMgYXZhaWxhYmxlLCBvdGhlcndpc2UgY29tcHV0ZSBhIG5ldyBvbmUuCisgIC8vLworICBNZW1vICZnZXRNZW1vKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gY29tcHV0ZSAtIENvbXB1dGUgYSBuZXcgTWVtbyBmb3IgdGhlIGdpdmVuIHZhbHVlLgorICAvLy8KKyAgTWVtbyAmY29tcHV0ZShjb25zdCBWYWx1ZSAqVik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIExpdmVWYWx1ZXMoKTsKKworICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKworICAvLy8gaXNVc2VkSW5CbG9jayAtIFRlc3QgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIHVzZWQgaW4gdGhlIGdpdmVuIGJsb2NrLgorICAvLy8KKyAgYm9vbCBpc1VzZWRJbkJsb2NrKGNvbnN0IFZhbHVlICpWLCBjb25zdCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIGlzTGl2ZVRocm91Z2hCbG9jayAtIFRlc3QgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGtub3duIHRvIGJlCisgIC8vLyBsaXZlLXRocm91Z2ggdGhlIGdpdmVuIGJsb2NrLCBtZWFuaW5nIHRoYXQgdGhlIGJsb2NrIGlzIHByb3Blcmx5CisgIC8vLyBkb21pbmF0ZWQgYnkgdGhlIHZhbHVlJ3MgZGVmaW5pdGlvbiwgYW5kIHRoZXJlIGV4aXN0cyBhIGJsb2NrCisgIC8vLyByZWFjaGFibGUgZnJvbSBpdCB0aGF0IGNvbnRhaW5zIGEgdXNlLiBUaGlzIHVzZXMgYSBjb25zZXJ2YXRpdmUKKyAgLy8vIGFwcHJveGltYXRpb24gdGhhdCBlcnJzIG9uIHRoZSBzaWRlIG9mIHJldHVybmluZyBmYWxzZS4KKyAgLy8vCisgIGJvb2wgaXNMaXZlVGhyb3VnaEJsb2NrKGNvbnN0IFZhbHVlICpWLCBjb25zdCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIGlzS2lsbGVkSW5CbG9jayAtIFRlc3QgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGtub3duIHRvIGJlIGtpbGxlZCBpbgorICAvLy8gdGhlIGdpdmVuIGJsb2NrLCBtZWFuaW5nIHRoYXQgdGhlIGJsb2NrIGNvbnRhaW5zIGEgdXNlIG9mIHRoZSB2YWx1ZSwKKyAgLy8vIGFuZCBubyBibG9ja3MgcmVhY2hhYmxlIGZyb20gdGhlIGJsb2NrIGNvbnRhaW4gYSB1c2UuIFRoaXMgdXNlcyBhCisgIC8vLyBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbiB0aGF0IGVycnMgb24gdGhlIHNpZGUgb2YgcmV0dXJuaW5nIGZhbHNlLgorICAvLy8KKyAgYm9vbCBpc0tpbGxlZEluQmxvY2soY29uc3QgVmFsdWUgKlYsIGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb2Fkcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvYWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3NDI2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb2Fkcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vPT09LSBMb2Fkcy5oIC0gTG9jYWwgbG9hZCBhbmFseXNpcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHNpbXBsZSBsb2NhbCBhbmFseXNlcyBmb3IgbG9hZCBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPQURTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MT0FEU19ICisKKyNpbmNsdWRlICJsbHZtL0Jhc2ljQmxvY2suaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGlhc0FuYWx5c2lzOworY2xhc3MgVGFyZ2V0RGF0YTsKKworLy8vIGlzU2FmZVRvTG9hZFVuY29uZGl0aW9uYWxseSAtIFJldHVybiB0cnVlIGlmIHdlIGtub3cgdGhhdCBleGVjdXRpbmcgYSBsb2FkCisvLy8gZnJvbSB0aGlzIHZhbHVlIGNhbm5vdCB0cmFwLiAgSWYgaXQgaXMgbm90IG9idmlvdXNseSBzYWZlIHRvIGxvYWQgZnJvbSB0aGUKKy8vLyBzcGVjaWZpZWQgcG9pbnRlciwgd2UgZG8gYSBxdWljayBsb2NhbCBzY2FuIG9mIHRoZSBiYXNpYyBibG9jayBjb250YWluaW5nCisvLy8gU2NhbkZyb20sIHRvIGRldGVybWluZSBpZiB0aGUgYWRkcmVzcyBpcyBhbHJlYWR5IGFjY2Vzc2VkLgorYm9vbCBpc1NhZmVUb0xvYWRVbmNvbmRpdGlvbmFsbHkoVmFsdWUgKlYsIEluc3RydWN0aW9uICpTY2FuRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBjb25zdCBUYXJnZXREYXRhICpURCA9IDApOworCisvLy8gRmluZEF2YWlsYWJsZUxvYWRlZFZhbHVlIC0gU2NhbiB0aGUgU2NhbkJCIGJsb2NrIGJhY2t3YXJkcyAoc3RhcnRpbmcgYXQKKy8vLyB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIFNjYW5Gcm9tKSBjaGVja2luZyB0byBzZWUgaWYgd2UgaGF2ZSB0aGUgdmFsdWUgYXQKKy8vLyB0aGUgbWVtb3J5IGFkZHJlc3MgKlB0ciBsb2NhbGx5IGF2YWlsYWJsZSB3aXRoaW4gYSBzbWFsbCBudW1iZXIgb2YKKy8vLyAgaW5zdHJ1Y3Rpb25zLiBJZiB0aGUgdmFsdWUgaXMgYXZhaWxhYmxlLCByZXR1cm4gaXQuCisvLy8KKy8vLyBJZiBub3QsIHJldHVybiB0aGUgaXRlcmF0b3IgZm9yIHRoZSBsYXN0IHZhbGlkYXRlZCBpbnN0cnVjdGlvbiB0aGF0IHRoZSAKKy8vLyB2YWx1ZSB3b3VsZCBiZSBsaXZlIHRocm91Z2guICBJZiB3ZSBzY2FubmVkIHRoZSBlbnRpcmUgYmxvY2sgYW5kIGRpZG4ndAorLy8vIGZpbmQgc29tZXRoaW5nIHRoYXQgaW52YWxpZGF0ZXMgKlB0ciBvciBwcm92aWRlcyBpdCwgU2NhbkZyb20gd291bGQgYmUKKy8vLyBsZWZ0IGF0IGJlZ2luKCkgYW5kIHRoaXMgcmV0dXJucyBudWxsLiAgU2NhbkZyb20gY291bGQgYWxzbyBiZSBsZWZ0IAorLy8vCisvLy8gTWF4SW5zdHNUb1NjYW4gc3BlY2lmaWVzIHRoZSBtYXhpbXVtIGluc3RydWN0aW9ucyB0byBzY2FuIGluIHRoZSBibG9jay4KKy8vLyBJZiBpdCBpcyBzZXQgdG8gMCwgaXQgd2lsbCBzY2FuIHRoZSB3aG9sZSBibG9jay4gWW91IGNhbiBhbHNvIG9wdGlvbmFsbHkKKy8vLyBzcGVjaWZ5IGFuIGFsaWFzIGFuYWx5c2lzIGltcGxlbWVudGF0aW9uLCB3aGljaCBtYWtlcyB0aGlzIG1vcmUgcHJlY2lzZS4KK1ZhbHVlICpGaW5kQXZhaWxhYmxlTG9hZGVkVmFsdWUoVmFsdWUgKlB0ciwgQmFzaWNCbG9jayAqU2NhbkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciAmU2NhbkZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEluc3RzVG9TY2FuID0gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAqQUEgPSAwKTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wRGVwZW5kZW5jZUFuYWx5c2lzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcERlcGVuZGVuY2VBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZmQ5OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcERlcGVuZGVuY2VBbmFseXNpcy5oCkBAIC0wLDAgKzEsMTIyIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9Mb29wRGVwZW5kZW5jZUFuYWx5c2lzLmggLS0tLS0tLS0tLS0tLS0tIC0qLSBDKysgLSotLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BEZXBlbmRlbmNlQW5hbHlzaXMgaXMgYW4gTExWTSBwYXNzIHRoYXQgYW5hbHlzZXMgZGVwZW5kZW5jZXMgaW4gbWVtb3J5CisvLyBhY2Nlc3NlcyBpbiBsb29wcy4KKy8vCisvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgd29yayBpbiBwcm9ncmVzcyBhbmQgdGhlIGludGVyZmFjZSBpcyBzdWJqZWN0IHRvCisvLyBjaGFuZ2UuCisvLworLy8gVE9ETzogYWRhcHQgYXMgaW50ZXJmYWNlIHByb2dyZXNzZXMKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTE9PUF9ERVBFTkRFTkNFX0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MT09QX0RFUEVOREVOQ0VfQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFsaWFzQW5hbHlzaXM7CitjbGFzcyBBbmFseXNpc1VzYWdlOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgU0NFVjsKK2NsYXNzIFZhbHVlOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIExvb3BEZXBlbmRlbmNlQW5hbHlzaXMgOiBwdWJsaWMgTG9vcFBhc3MgeworICBBbGlhc0FuYWx5c2lzICpBQTsKKyAgU2NhbGFyRXZvbHV0aW9uICpTRTsKKworICAvLy8gTCAtIFRoZSBsb29wIHdlIGFyZSBjdXJyZW50bHkgYW5hbHlzaW5nLgorICBMb29wICpMOworCisgIC8vLyBUT0RPOiBkb2MKKyAgZW51bSBEZXBlbmRlbmNlUmVzdWx0IHsgSW5kZXBlbmRlbnQgPSAwLCBEZXBlbmRlbnQgPSAxLCBVbmtub3duID0gMiB9OworCisgIC8vLyBUT0RPOiBkb2MKKyAgc3RydWN0IFN1YnNjcmlwdCB7CisgICAgLy8vIFRPRE86IEFkZCBkaXN0YW5jZSwgZGlyZWN0aW9uLCBicmVha2luZyBjb25kaXRpb25zLCAuLi4KKyAgfTsKKworICAvLy8gRGVwZW5kZW5jZVBhaXIgLSBSZXByZXNlbnRzIGEgZGF0YSBkZXBlbmRlbmNlIHJlbGF0aW9uIGJldHdlZW4gdG8gbWVtb3J5CisgIC8vLyByZWZlcmVuY2UgaW5zdHJ1Y3Rpb25zLgorICBzdHJ1Y3QgRGVwZW5kZW5jZVBhaXIgOiBwdWJsaWMgRmFzdEZvbGRpbmdTZXROb2RlIHsKKyAgICBWYWx1ZSAqQTsKKyAgICBWYWx1ZSAqQjsKKyAgICBEZXBlbmRlbmNlUmVzdWx0IFJlc3VsdDsKKyAgICBTbWFsbFZlY3RvcjxTdWJzY3JpcHQsIDQ+IFN1YnNjcmlwdHM7CisKKyAgICBEZXBlbmRlbmNlUGFpcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgVmFsdWUgKmEsIFZhbHVlICpiKSA6CisgICAgICAgIEZhc3RGb2xkaW5nU2V0Tm9kZShJRCksIEEoYSksIEIoYiksIFJlc3VsdChVbmtub3duKSwgU3Vic2NyaXB0cygpIHt9CisgIH07CisKKyAgLy8vIGZpbmRPckluc2VydERlcGVuZGVuY2VQYWlyIC0gUmV0dXJuIHRydWUgaWYgYSBEZXBlbmRlbmNlUGFpciBmb3IgdGhlCisgIC8vLyBnaXZlbiBWYWx1ZXMgYWxyZWFkeSBleGlzdHMsIGZhbHNlIGlmIGEgbmV3IERlcGVuZGVuY2VQYWlyIGhhZCB0byBiZQorICAvLy8gY3JlYXRlZC4gVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHNldCB0byB0aGUgcGFpciBmb3VuZCBvciBjcmVhdGVkLgorICBib29sIGZpbmRPckluc2VydERlcGVuZGVuY2VQYWlyKFZhbHVlKiwgVmFsdWUqLCBEZXBlbmRlbmNlUGFpciomKTsKKworICAvLy8gZ2V0TG9vcHMgLSBDb2xsZWN0IGFsbCBsb29wcyBvZiB0aGUgbG9vcCBuZXN0IEwgaW4gd2hpY2gKKyAgLy8vIGEgZ2l2ZW4gU0NFViBpcyB2YXJpYW50LgorICB2b2lkIGdldExvb3BzKGNvbnN0IFNDRVYqLCBEZW5zZVNldDxjb25zdCBMb29wKj4qKSBjb25zdDsKKworICAvLy8gaXNMb29wSW52YXJpYW50IC0gVHJ1ZSBpZiBhIGdpdmVuIFNDRVYgaXMgaW52YXJpYW50IGluIGFsbCBsb29wcyBvZiB0aGUKKyAgLy8vIGxvb3AgbmVzdCBzdGFydGluZyBhdCB0aGUgaW5uZXJtb3N0IGxvb3AgTC4KKyAgYm9vbCBpc0xvb3BJbnZhcmlhbnQoY29uc3QgU0NFViopIGNvbnN0OworCisgIC8vLyBpc0FmZmluZSAtIEFuIFNDRVYgaXMgYWZmaW5lIHdpdGggcmVzcGVjdCB0byB0aGUgbG9vcCBuZXN0IHN0YXJ0aW5nIGF0CisgIC8vLyB0aGUgaW5uZXJtb3N0IGxvb3AgTCBpZiBpdCBpcyBvZiB0aGUgZm9ybSBBK0IqWCB3aGVyZSBBLCBCIGFyZSBpbnZhcmlhbnQKKyAgLy8vIGluIHRoZSBsb29wIG5lc3QgYW5kIFggaXMgYSBpbmR1Y3Rpb24gdmFyaWFibGUgaW4gdGhlIGxvb3AgbmVzdC4KKyAgYm9vbCBpc0FmZmluZShjb25zdCBTQ0VWKikgY29uc3Q7CisKKyAgLy8vIFRPRE86IGRvYworICBib29sIGlzWklWUGFpcihjb25zdCBTQ0VWKiwgY29uc3QgU0NFViopIGNvbnN0OworICBib29sIGlzU0lWUGFpcihjb25zdCBTQ0VWKiwgY29uc3QgU0NFViopIGNvbnN0OworICBEZXBlbmRlbmNlUmVzdWx0IGFuYWx5c2VaSVYoY29uc3QgU0NFViosIGNvbnN0IFNDRVYqLCBTdWJzY3JpcHQqKSBjb25zdDsKKyAgRGVwZW5kZW5jZVJlc3VsdCBhbmFseXNlU0lWKGNvbnN0IFNDRVYqLCBjb25zdCBTQ0VWKiwgU3Vic2NyaXB0KikgY29uc3Q7CisgIERlcGVuZGVuY2VSZXN1bHQgYW5hbHlzZU1JVihjb25zdCBTQ0VWKiwgY29uc3QgU0NFViosIFN1YnNjcmlwdCopIGNvbnN0OworICBEZXBlbmRlbmNlUmVzdWx0IGFuYWx5c2VTdWJzY3JpcHQoY29uc3QgU0NFViosIGNvbnN0IFNDRVYqLCBTdWJzY3JpcHQqKSBjb25zdDsKKyAgRGVwZW5kZW5jZVJlc3VsdCBhbmFseXNlUGFpcihEZXBlbmRlbmNlUGFpciopIGNvbnN0OworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBDbGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpbmZvCisgIExvb3BEZXBlbmRlbmNlQW5hbHlzaXMoKSA6IExvb3BQYXNzKElEKSB7fQorCisgIC8vLyBpc0RlcGVuZGVuY2VQYWlyIC0gQ2hlY2sgd2hldGhlciB0d28gdmFsdWVzIGNhbiBwb3NzaWJseSBnaXZlIHJpc2UgdG8KKyAgLy8vIGEgZGF0YSBkZXBlbmRlbmNlOiB0aGF0IGlzIHRoZSBjYXNlIGlmIGJvdGggYXJlIGluc3RydWN0aW9ucyBhY2Nlc3NpbmcKKyAgLy8vIG1lbW9yeSBhbmQgYXQgbGVhc3Qgb25lIG9mIHRob3NlIGFjY2Vzc2VzIGlzIGEgd3JpdGUuCisgIGJvb2wgaXNEZXBlbmRlbmNlUGFpcihjb25zdCBWYWx1ZSosIGNvbnN0IFZhbHVlKikgY29uc3Q7CisKKyAgLy8vIGRlcGVuZHMgLSBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlcmUgaXMgYSBkYXRhIGRlcGVuZGVuY2UKKyAgLy8vIGJldHdlZW4gdHdvIGluc3RydWN0aW9ucy4KKyAgYm9vbCBkZXBlbmRzKFZhbHVlKiwgVmFsdWUqKTsKKworICBib29sIHJ1bk9uTG9vcChMb29wKiwgTFBQYXNzTWFuYWdlciYpOworICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlJikgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0mLCBjb25zdCBNb2R1bGUqID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIEZvbGRpbmdTZXQ8RGVwZW5kZW5jZVBhaXI+IFBhaXJzOworICBCdW1wUHRyQWxsb2NhdG9yIFBhaXJBbGxvY2F0b3I7Cit9OyAvLyBjbGFzcyBMb29wRGVwZW5kZW5jZUFuYWx5c2lzCisKKy8vIGNyZWF0ZUxvb3BEZXBlbmRlbmNlQW5hbHlzaXNQYXNzIC0gVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZQorLy8gTG9vcERlcGVuZGVuY2VBbmFseXNpcyBwYXNzLgorLy8KK0xvb3BQYXNzICpjcmVhdGVMb29wRGVwZW5kZW5jZUFuYWx5c2lzUGFzcygpOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvKiBMTFZNX0FOQUxZU0lTX0xPT1BfREVQRU5ERU5DRV9BTkFMWVNJU19IICovCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjYyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcEluZm8uaApAQCAtMCwwICsxLDEwNzUgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmggLSBOYXR1cmFsIExvb3AgQ2FsY3VsYXRvciAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIExvb3BJbmZvIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSBuYXR1cmFsIGxvb3BzCisvLyBhbmQgZGV0ZXJtaW5lIHRoZSBsb29wIGRlcHRoIG9mIHZhcmlvdXMgbm9kZXMgb2YgdGhlIENGRy4gIEEgbmF0dXJhbCBsb29wCisvLyBoYXMgZXhhY3RseSBvbmUgZW50cnktcG9pbnQsIHdoaWNoIGlzIGNhbGxlZCB0aGUgaGVhZGVyLiBOb3RlIHRoYXQgbmF0dXJhbAorLy8gbG9vcHMgbWF5IGFjdHVhbGx5IGJlIHNldmVyYWwgbG9vcHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBoZWFkZXIgbm9kZS4KKy8vCisvLyBUaGlzIGFuYWx5c2lzIGNhbGN1bGF0ZXMgdGhlIG5lc3Rpbmcgc3RydWN0dXJlIG9mIGxvb3BzIGluIGEgZnVuY3Rpb24uICBGb3IKKy8vIGVhY2ggbmF0dXJhbCBsb29wIGlkZW50aWZpZWQsIHRoaXMgYW5hbHlzaXMgaWRlbnRpZmllcyBuYXR1cmFsIGxvb3BzCisvLyBjb250YWluZWQgZW50aXJlbHkgd2l0aGluIHRoZSBsb29wIGFuZCB0aGUgYmFzaWMgYmxvY2tzIHRoZSBtYWtlIHVwIHRoZSBsb29wLgorLy8KKy8vIEl0IGNhbiBjYWxjdWxhdGUgb24gdGhlIGZseSB2YXJpb3VzIGJpdHMgb2YgaW5mb3JtYXRpb24sIGZvciBleGFtcGxlOgorLy8KKy8vICAqIHdoZXRoZXIgdGhlcmUgaXMgYSBwcmVoZWFkZXIgZm9yIHRoZSBsb29wCisvLyAgKiB0aGUgbnVtYmVyIG9mIGJhY2sgZWRnZXMgdG8gdGhlIGhlYWRlcgorLy8gICogd2hldGhlciBvciBub3QgYSBwYXJ0aWN1bGFyIGJsb2NrIGJyYW5jaGVzIG91dCBvZiB0aGUgbG9vcAorLy8gICogdGhlIHN1Y2Nlc3NvciBibG9ja3Mgb2YgdGhlIGxvb3AKKy8vICAqIHRoZSBsb29wIGRlcHRoCisvLyAgKiB0aGUgdHJpcCBjb3VudAorLy8gICogZXRjLi4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPT1BfSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTE9PUF9JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBSZW1vdmVGcm9tVmVjdG9yKHN0ZDo6dmVjdG9yPFQqPiAmViwgVCAqTikgeworICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxUKj46Oml0ZXJhdG9yIEkgPSBzdGQ6OmZpbmQoVi5iZWdpbigpLCBWLmVuZCgpLCBOKTsKKyAgYXNzZXJ0KEkgIT0gVi5lbmQoKSAmJiAiTiBpcyBub3QgaW4gdGhpcyBsaXN0ISIpOworICBWLmVyYXNlKEkpOworfQorCitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBMb29wOwordGVtcGxhdGU8Y2xhc3MgTiwgY2xhc3MgTT4gY2xhc3MgTG9vcEluZm9CYXNlOwordGVtcGxhdGU8Y2xhc3MgTiwgY2xhc3MgTT4gY2xhc3MgTG9vcEJhc2U7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gTG9vcEJhc2UgY2xhc3MgLSBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgdXNlZCB0byByZXByZXNlbnQgbG9vcHMgdGhhdAorLy8vIGFyZSBkZXRlY3RlZCBpbiB0aGUgZmxvdyBncmFwaAorLy8vCit0ZW1wbGF0ZTxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgorY2xhc3MgTG9vcEJhc2UgeworICBMb29wVCAqUGFyZW50TG9vcDsKKyAgLy8gU3ViTG9vcHMgLSBMb29wcyBjb250YWluZWQgZW50aXJlbHkgd2l0aGluIHRoaXMgb25lLgorICBzdGQ6OnZlY3RvcjxMb29wVCAqPiBTdWJMb29wczsKKworICAvLyBCbG9ja3MgLSBUaGUgbGlzdCBvZiBibG9ja3MgaW4gdGhpcyBsb29wLiAgRmlyc3QgZW50cnkgaXMgdGhlIGhlYWRlciBub2RlLgorICBzdGQ6OnZlY3RvcjxCbG9ja1QqPiBCbG9ja3M7CisKKyAgLy8gRE8gTk9UIElNUExFTUVOVAorICBMb29wQmFzZShjb25zdCBMb29wQmFzZTxCbG9ja1QsIExvb3BUPiAmKTsKKyAgLy8gRE8gTk9UIElNUExFTUVOVAorICBjb25zdCBMb29wQmFzZTxCbG9ja1QsIExvb3BUPiZvcGVyYXRvcj0oY29uc3QgTG9vcEJhc2U8QmxvY2tULCBMb29wVD4gJik7CitwdWJsaWM6CisgIC8vLyBMb29wIGN0b3IgLSBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgbG9vcC4KKyAgTG9vcEJhc2UoKSA6IFBhcmVudExvb3AoMCkge30KKyAgfkxvb3BCYXNlKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gU3ViTG9vcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGRlbGV0ZSBTdWJMb29wc1tpXTsKKyAgfQorCisgIC8vLyBnZXRMb29wRGVwdGggLSBSZXR1cm4gdGhlIG5lc3RpbmcgbGV2ZWwgb2YgdGhpcyBsb29wLiAgQW4gb3V0ZXItbW9zdAorICAvLy8gbG9vcCBoYXMgZGVwdGggMSwgZm9yIGNvbnNpc3RlbmN5IHdpdGggbG9vcCBkZXB0aCB2YWx1ZXMgdXNlZCBmb3IgYmFzaWMKKyAgLy8vIGJsb2Nrcywgd2hlcmUgZGVwdGggMCBpcyB1c2VkIGZvciBibG9ja3Mgbm90IGluc2lkZSBhbnkgbG9vcHMuCisgIHVuc2lnbmVkIGdldExvb3BEZXB0aCgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBEID0gMTsKKyAgICBmb3IgKGNvbnN0IExvb3BUICpDdXJMb29wID0gUGFyZW50TG9vcDsgQ3VyTG9vcDsKKyAgICAgICAgIEN1ckxvb3AgPSBDdXJMb29wLT5QYXJlbnRMb29wKQorICAgICAgKytEOworICAgIHJldHVybiBEOworICB9CisgIEJsb2NrVCAqZ2V0SGVhZGVyKCkgY29uc3QgeyByZXR1cm4gQmxvY2tzLmZyb250KCk7IH0KKyAgTG9vcFQgKmdldFBhcmVudExvb3AoKSBjb25zdCB7IHJldHVybiBQYXJlbnRMb29wOyB9CisKKyAgLy8vIGNvbnRhaW5zIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBsb29wIGlzIGNvbnRhaW5lZCB3aXRoaW4gaW4KKyAgLy8vIHRoaXMgbG9vcC4KKyAgLy8vCisgIGJvb2wgY29udGFpbnMoY29uc3QgTG9vcFQgKkwpIGNvbnN0IHsKKyAgICBpZiAoTCA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoTCA9PSAwKSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGNvbnRhaW5zKEwtPmdldFBhcmVudExvb3AoKSk7CisgIH0KKyAgICAKKyAgLy8vIGNvbnRhaW5zIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jayBpcyBpbiB0aGlzIGxvb3AuCisgIC8vLworICBib29sIGNvbnRhaW5zKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpmaW5kKGJsb2NrX2JlZ2luKCksIGJsb2NrX2VuZCgpLCBCQikgIT0gYmxvY2tfZW5kKCk7CisgIH0KKworICAvLy8gY29udGFpbnMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGlzIGluIHRoaXMgbG9vcC4KKyAgLy8vCisgIHRlbXBsYXRlPGNsYXNzIEluc3RUPgorICBib29sIGNvbnRhaW5zKGNvbnN0IEluc3RUICpJbnN0KSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRhaW5zKEluc3QtPmdldFBhcmVudCgpKTsKKyAgfQorCisgIC8vLyBpdGVyYXRvci9iZWdpbi9lbmQgLSBSZXR1cm4gdGhlIGxvb3BzIGNvbnRhaW5lZCBlbnRpcmVseSB3aXRoaW4gdGhpcyBsb29wLgorICAvLy8KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TG9vcFQgKj4gJmdldFN1Ykxvb3BzKCkgY29uc3QgeyByZXR1cm4gU3ViTG9vcHM7IH0KKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxMb29wVCAqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gU3ViTG9vcHMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBTdWJMb29wcy5lbmQoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gU3ViTG9vcHMuZW1wdHkoKTsgfQorCisgIC8vLyBnZXRCbG9ja3MgLSBHZXQgYSBsaXN0IG9mIHRoZSBiYXNpYyBibG9ja3Mgd2hpY2ggbWFrZSB1cCB0aGlzIGxvb3AuCisgIC8vLworICBjb25zdCBzdGQ6OnZlY3RvcjxCbG9ja1QqPiAmZ2V0QmxvY2tzKCkgY29uc3QgeyByZXR1cm4gQmxvY2tzOyB9CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QmxvY2tUKj46OmNvbnN0X2l0ZXJhdG9yIGJsb2NrX2l0ZXJhdG9yOworICBibG9ja19pdGVyYXRvciBibG9ja19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJsb2Nrcy5iZWdpbigpOyB9CisgIGJsb2NrX2l0ZXJhdG9yIGJsb2NrX2VuZCgpIGNvbnN0IHsgcmV0dXJuIEJsb2Nrcy5lbmQoKTsgfQorCisgIC8vLyBpc0xvb3BFeGl0aW5nIC0gVHJ1ZSBpZiB0ZXJtaW5hdG9yIGluIHRoZSBibG9jayBjYW4gYnJhbmNoIHRvIGFub3RoZXIKKyAgLy8vIGJsb2NrIHRoYXQgaXMgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBsb29wLgorICAvLy8KKyAgYm9vbCBpc0xvb3BFeGl0aW5nKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICB0eXBlZGVmIEdyYXBoVHJhaXRzPEJsb2NrVCo+IEJsb2NrVHJhaXRzOworICAgIGZvciAodHlwZW5hbWUgQmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIFNJID0KKyAgICAgICAgIEJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihjb25zdF9jYXN0PEJsb2NrVCo+KEJCKSksCisgICAgICAgICBTRSA9IEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoY29uc3RfY2FzdDxCbG9ja1QqPihCQikpOyBTSSAhPSBTRTsgKytTSSkgeworICAgICAgaWYgKCFjb250YWlucygqU0kpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGdldE51bUJhY2tFZGdlcyAtIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJhY2sgZWRnZXMgdG8gdGhlIGxvb3AgaGVhZGVyCisgIC8vLworICB1bnNpZ25lZCBnZXROdW1CYWNrRWRnZXMoKSBjb25zdCB7CisgICAgdW5zaWduZWQgTnVtQmFja0VkZ2VzID0gMDsKKyAgICBCbG9ja1QgKkggPSBnZXRIZWFkZXIoKTsKKworICAgIHR5cGVkZWYgR3JhcGhUcmFpdHM8SW52ZXJzZTxCbG9ja1QqPiA+IEludkJsb2NrVHJhaXRzOworICAgIGZvciAodHlwZW5hbWUgSW52QmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIEkgPQorICAgICAgICAgSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKGNvbnN0X2Nhc3Q8QmxvY2tUKj4oSCkpLAorICAgICAgICAgRSA9IEludkJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoY29uc3RfY2FzdDxCbG9ja1QqPihIKSk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKGNvbnRhaW5zKCpJKSkKKyAgICAgICAgKytOdW1CYWNrRWRnZXM7CisKKyAgICByZXR1cm4gTnVtQmFja0VkZ2VzOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFQSXMgZm9yIHNpbXBsZSBhbmFseXNpcyBvZiB0aGUgbG9vcC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGFsbCBvZiB0aGVzZSBtZXRob2RzIGNhbiBmYWlsIG9uIGdlbmVyYWwgbG9vcHMgKGllLCB0aGVyZSBtYXkgbm90CisgIC8vIGJlIGEgcHJlaGVhZGVyLCBldGMpLiAgRm9yIGJlc3Qgc3VjY2VzcywgdGhlIGxvb3Agc2ltcGxpZmljYXRpb24gYW5kCisgIC8vIGluZHVjdGlvbiB2YXJpYWJsZSBjYW5vbmljYWxpemF0aW9uIHBhc3Mgc2hvdWxkIGJlIHVzZWQgdG8gbm9ybWFsaXplIGxvb3BzCisgIC8vIGZvciBlYXN5IGFuYWx5c2lzLiAgVGhlc2UgbWV0aG9kcyBhc3N1bWUgY2Fub25pY2FsIGxvb3BzLgorCisgIC8vLyBnZXRFeGl0aW5nQmxvY2tzIC0gUmV0dXJuIGFsbCBibG9ja3MgaW5zaWRlIHRoZSBsb29wIHRoYXQgaGF2ZSBzdWNjZXNzb3JzCisgIC8vLyBvdXRzaWRlIG9mIHRoZSBsb29wLiAgVGhlc2UgYXJlIHRoZSBibG9ja3MgX2luc2lkZSBvZiB0aGUgY3VycmVudCBsb29wXworICAvLy8gd2hpY2ggYnJhbmNoIG91dC4gIFRoZSByZXR1cm5lZCBsaXN0IGlzIGFsd2F5cyB1bmlxdWUuCisgIC8vLworICB2b2lkIGdldEV4aXRpbmdCbG9ja3MoU21hbGxWZWN0b3JJbXBsPEJsb2NrVCAqPiAmRXhpdGluZ0Jsb2NrcykgY29uc3QgeworICAgIC8vIFNvcnQgdGhlIGJsb2NrcyB2ZWN0b3Igc28gdGhhdCB3ZSBjYW4gdXNlIGJpbmFyeSBzZWFyY2ggdG8gZG8gcXVpY2sKKyAgICAvLyBsb29rdXBzLgorICAgIFNtYWxsVmVjdG9yPEJsb2NrVCosIDEyOD4gTG9vcEJCcyhibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgICAgc3RkOjpzb3J0KExvb3BCQnMuYmVnaW4oKSwgTG9vcEJCcy5lbmQoKSk7CisKKyAgICB0eXBlZGVmIEdyYXBoVHJhaXRzPEJsb2NrVCo+IEJsb2NrVHJhaXRzOworICAgIGZvciAoYmxvY2tfaXRlcmF0b3IgQkkgPSBibG9ja19iZWdpbigpLCBCRSA9IGJsb2NrX2VuZCgpOyBCSSAhPSBCRTsgKytCSSkKKyAgICAgIGZvciAodHlwZW5hbWUgQmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIEkgPQorICAgICAgICAgIEJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbigqQkkpLCBFID0gQmxvY2tUcmFpdHM6OmNoaWxkX2VuZCgqQkkpOworICAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgICBpZiAoIXN0ZDo6YmluYXJ5X3NlYXJjaChMb29wQkJzLmJlZ2luKCksIExvb3BCQnMuZW5kKCksICpJKSkgeworICAgICAgICAgIC8vIE5vdCBpbiBjdXJyZW50IGxvb3A/IEl0IG11c3QgYmUgYW4gZXhpdCBibG9jay4KKyAgICAgICAgICBFeGl0aW5nQmxvY2tzLnB1c2hfYmFjaygqQkkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgIH0KKworICAvLy8gZ2V0RXhpdGluZ0Jsb2NrIC0gSWYgZ2V0RXhpdGluZ0Jsb2NrcyB3b3VsZCByZXR1cm4gZXhhY3RseSBvbmUgYmxvY2ssCisgIC8vLyByZXR1cm4gdGhhdCBibG9jay4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBCbG9ja1QgKmdldEV4aXRpbmdCbG9jaygpIGNvbnN0IHsKKyAgICBTbWFsbFZlY3RvcjxCbG9ja1QqLCA4PiBFeGl0aW5nQmxvY2tzOworICAgIGdldEV4aXRpbmdCbG9ja3MoRXhpdGluZ0Jsb2Nrcyk7CisgICAgaWYgKEV4aXRpbmdCbG9ja3Muc2l6ZSgpID09IDEpCisgICAgICByZXR1cm4gRXhpdGluZ0Jsb2Nrc1swXTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXRFeGl0QmxvY2tzIC0gUmV0dXJuIGFsbCBvZiB0aGUgc3VjY2Vzc29yIGJsb2NrcyBvZiB0aGlzIGxvb3AuICBUaGVzZQorICAvLy8gYXJlIHRoZSBibG9ja3MgX291dHNpZGUgb2YgdGhlIGN1cnJlbnQgbG9vcF8gd2hpY2ggYXJlIGJyYW5jaGVkIHRvLgorICAvLy8KKyAgdm9pZCBnZXRFeGl0QmxvY2tzKFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QqPiAmRXhpdEJsb2NrcykgY29uc3QgeworICAgIC8vIFNvcnQgdGhlIGJsb2NrcyB2ZWN0b3Igc28gdGhhdCB3ZSBjYW4gdXNlIGJpbmFyeSBzZWFyY2ggdG8gZG8gcXVpY2sKKyAgICAvLyBsb29rdXBzLgorICAgIFNtYWxsVmVjdG9yPEJsb2NrVCosIDEyOD4gTG9vcEJCcyhibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgICAgc3RkOjpzb3J0KExvb3BCQnMuYmVnaW4oKSwgTG9vcEJCcy5lbmQoKSk7CisKKyAgICB0eXBlZGVmIEdyYXBoVHJhaXRzPEJsb2NrVCo+IEJsb2NrVHJhaXRzOworICAgIGZvciAoYmxvY2tfaXRlcmF0b3IgQkkgPSBibG9ja19iZWdpbigpLCBCRSA9IGJsb2NrX2VuZCgpOyBCSSAhPSBCRTsgKytCSSkKKyAgICAgIGZvciAodHlwZW5hbWUgQmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIEkgPQorICAgICAgICAgICBCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oKkJJKSwgRSA9IEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoKkJJKTsKKyAgICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICAgIGlmICghc3RkOjpiaW5hcnlfc2VhcmNoKExvb3BCQnMuYmVnaW4oKSwgTG9vcEJCcy5lbmQoKSwgKkkpKQorICAgICAgICAgIC8vIE5vdCBpbiBjdXJyZW50IGxvb3A/IEl0IG11c3QgYmUgYW4gZXhpdCBibG9jay4KKyAgICAgICAgICBFeGl0QmxvY2tzLnB1c2hfYmFjaygqSSk7CisgIH0KKworICAvLy8gZ2V0RXhpdEJsb2NrIC0gSWYgZ2V0RXhpdEJsb2NrcyB3b3VsZCByZXR1cm4gZXhhY3RseSBvbmUgYmxvY2ssCisgIC8vLyByZXR1cm4gdGhhdCBibG9jay4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBCbG9ja1QgKmdldEV4aXRCbG9jaygpIGNvbnN0IHsKKyAgICBTbWFsbFZlY3RvcjxCbG9ja1QqLCA4PiBFeGl0QmxvY2tzOworICAgIGdldEV4aXRCbG9ja3MoRXhpdEJsb2Nrcyk7CisgICAgaWYgKEV4aXRCbG9ja3Muc2l6ZSgpID09IDEpCisgICAgICByZXR1cm4gRXhpdEJsb2Nrc1swXTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBFZGdlIHR5cGUuCisgIHR5cGVkZWYgc3RkOjpwYWlyPEJsb2NrVCosIEJsb2NrVCo+IEVkZ2U7CisKKyAgLy8vIGdldEV4aXRFZGdlcyAtIFJldHVybiBhbGwgcGFpcnMgb2YgKF9pbnNpZGVfYmxvY2tfLF9vdXRzaWRlX2Jsb2NrXykuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFZGdlVD4KKyAgdm9pZCBnZXRFeGl0RWRnZXMoU21hbGxWZWN0b3JJbXBsPEVkZ2VUPiAmRXhpdEVkZ2VzKSBjb25zdCB7CisgICAgLy8gU29ydCB0aGUgYmxvY2tzIHZlY3RvciBzbyB0aGF0IHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaCB0byBkbyBxdWljaworICAgIC8vIGxvb2t1cHMuCisgICAgU21hbGxWZWN0b3I8QmxvY2tUKiwgMTI4PiBMb29wQkJzKGJsb2NrX2JlZ2luKCksIGJsb2NrX2VuZCgpKTsKKyAgICBhcnJheV9wb2Rfc29ydChMb29wQkJzLmJlZ2luKCksIExvb3BCQnMuZW5kKCkpOworCisgICAgdHlwZWRlZiBHcmFwaFRyYWl0czxCbG9ja1QqPiBCbG9ja1RyYWl0czsKKyAgICBmb3IgKGJsb2NrX2l0ZXJhdG9yIEJJID0gYmxvY2tfYmVnaW4oKSwgQkUgPSBibG9ja19lbmQoKTsgQkkgIT0gQkU7ICsrQkkpCisgICAgICBmb3IgKHR5cGVuYW1lIEJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZSBJID0KKyAgICAgICAgICAgQmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKCpCSSksIEUgPSBCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKCpCSSk7CisgICAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgICBpZiAoIXN0ZDo6YmluYXJ5X3NlYXJjaChMb29wQkJzLmJlZ2luKCksIExvb3BCQnMuZW5kKCksICpJKSkKKyAgICAgICAgICAvLyBOb3QgaW4gY3VycmVudCBsb29wPyBJdCBtdXN0IGJlIGFuIGV4aXQgYmxvY2suCisgICAgICAgICAgRXhpdEVkZ2VzLnB1c2hfYmFjayhFZGdlVCgqQkksICpJKSk7CisgIH0KKworICAvLy8gZ2V0TG9vcFByZWhlYWRlciAtIElmIHRoZXJlIGlzIGEgcHJlaGVhZGVyIGZvciB0aGlzIGxvb3AsIHJldHVybiBpdC4gIEEKKyAgLy8vIGxvb3AgaGFzIGEgcHJlaGVhZGVyIGlmIHRoZXJlIGlzIG9ubHkgb25lIGVkZ2UgdG8gdGhlIGhlYWRlciBvZiB0aGUgbG9vcAorICAvLy8gZnJvbSBvdXRzaWRlIG9mIHRoZSBsb29wLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlIGJsb2NrIGJyYW5jaGluZyB0byB0aGUKKyAgLy8vIGhlYWRlciBvZiB0aGUgbG9vcCBpcyB0aGUgcHJlaGVhZGVyIG5vZGUuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHByZWhlYWRlciBmb3IgdGhlIGxvb3AuCisgIC8vLworICBCbG9ja1QgKmdldExvb3BQcmVoZWFkZXIoKSBjb25zdCB7CisgICAgLy8gS2VlcCB0cmFjayBvZiBub2RlcyBvdXRzaWRlIHRoZSBsb29wIGJyYW5jaGluZyB0byB0aGUgaGVhZGVyLi4uCisgICAgQmxvY2tUICpPdXQgPSBnZXRMb29wUHJlZGVjZXNzb3IoKTsKKyAgICBpZiAoIU91dCkgcmV0dXJuIDA7CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUgZXhpdCBvdXQgb2YgdGhlIHByZWhlYWRlci4KKyAgICB0eXBlZGVmIEdyYXBoVHJhaXRzPEJsb2NrVCo+IEJsb2NrVHJhaXRzOworICAgIHR5cGVuYW1lIEJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZSBTSSA9IEJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihPdXQpOworICAgICsrU0k7CisgICAgaWYgKFNJICE9IEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoT3V0KSkKKyAgICAgIHJldHVybiAwOyAgLy8gTXVsdGlwbGUgZXhpdHMgZnJvbSB0aGUgYmxvY2ssIG11c3Qgbm90IGJlIGEgcHJlaGVhZGVyLgorCisgICAgLy8gVGhlIHByZWRlY2Vzc29yIGhhcyBleGFjdGx5IG9uZSBzdWNjZXNzb3IsIHNvIGl0IGlzIGEgcHJlaGVhZGVyLgorICAgIHJldHVybiBPdXQ7CisgIH0KKworICAvLy8gZ2V0TG9vcFByZWRlY2Vzc29yIC0gSWYgdGhlIGdpdmVuIGxvb3AncyBoZWFkZXIgaGFzIGV4YWN0bHkgb25lIHVuaXF1ZQorICAvLy8gcHJlZGVjZXNzb3Igb3V0c2lkZSB0aGUgbG9vcCwgcmV0dXJuIGl0LiBPdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIC8vLyBUaGlzIGlzIGxlc3Mgc3RyaWN0IHRoYXQgdGhlIGxvb3AgInByZWhlYWRlciIgY29uY2VwdCwgd2hpY2ggcmVxdWlyZXMKKyAgLy8vIHRoZSBwcmVkZWNlc3NvciB0byBoYXZlIGV4YWN0bHkgb25lIHN1Y2Nlc3Nvci4KKyAgLy8vCisgIEJsb2NrVCAqZ2V0TG9vcFByZWRlY2Vzc29yKCkgY29uc3QgeworICAgIC8vIEtlZXAgdHJhY2sgb2Ygbm9kZXMgb3V0c2lkZSB0aGUgbG9vcCBicmFuY2hpbmcgdG8gdGhlIGhlYWRlci4uLgorICAgIEJsb2NrVCAqT3V0ID0gMDsKKworICAgIC8vIExvb3Agb3ZlciB0aGUgcHJlZGVjZXNzb3JzIG9mIHRoZSBoZWFkZXIgbm9kZS4uLgorICAgIEJsb2NrVCAqSGVhZGVyID0gZ2V0SGVhZGVyKCk7CisgICAgdHlwZWRlZiBHcmFwaFRyYWl0czxCbG9ja1QqPiBCbG9ja1RyYWl0czsKKyAgICB0eXBlZGVmIEdyYXBoVHJhaXRzPEludmVyc2U8QmxvY2tUKj4gPiBJbnZCbG9ja1RyYWl0czsKKyAgICBmb3IgKHR5cGVuYW1lIEludkJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZSBQSSA9CisgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oSGVhZGVyKSwKKyAgICAgICAgIFBFID0gSW52QmxvY2tUcmFpdHM6OmNoaWxkX2VuZChIZWFkZXIpOyBQSSAhPSBQRTsgKytQSSkgeworICAgICAgdHlwZW5hbWUgSW52QmxvY2tUcmFpdHM6Ok5vZGVUeXBlICpOID0gKlBJOworICAgICAgaWYgKCFjb250YWlucyhOKSkgeyAgICAgLy8gSWYgdGhlIGJsb2NrIGlzIG5vdCBpbiB0aGUgbG9vcC4uLgorICAgICAgICBpZiAoT3V0ICYmIE91dCAhPSBOKQorICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAvLyBNdWx0aXBsZSBwcmVkZWNlc3NvcnMgb3V0c2lkZSB0aGUgbG9vcAorICAgICAgICBPdXQgPSBOOworICAgICAgfQorICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSBleGl0IG91dCBvZiB0aGUgcHJlaGVhZGVyLgorICAgIGFzc2VydChPdXQgJiYgIkhlYWRlciBvZiBsb29wIGhhcyBubyBwcmVkZWNlc3NvcnMgZnJvbSBvdXRzaWRlIGxvb3A/Iik7CisgICAgcmV0dXJuIE91dDsKKyAgfQorCisgIC8vLyBnZXRMb29wTGF0Y2ggLSBJZiB0aGVyZSBpcyBhIHNpbmdsZSBsYXRjaCBibG9jayBmb3IgdGhpcyBsb29wLCByZXR1cm4gaXQuCisgIC8vLyBBIGxhdGNoIGJsb2NrIGlzIGEgYmxvY2sgdGhhdCBjb250YWlucyBhIGJyYW5jaCBiYWNrIHRvIHRoZSBoZWFkZXIuCisgIEJsb2NrVCAqZ2V0TG9vcExhdGNoKCkgY29uc3QgeworICAgIEJsb2NrVCAqSGVhZGVyID0gZ2V0SGVhZGVyKCk7CisgICAgdHlwZWRlZiBHcmFwaFRyYWl0czxJbnZlcnNlPEJsb2NrVCo+ID4gSW52QmxvY2tUcmFpdHM7CisgICAgdHlwZW5hbWUgSW52QmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIFBJID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKEhlYWRlcik7CisgICAgdHlwZW5hbWUgSW52QmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIFBFID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKEhlYWRlcik7CisgICAgQmxvY2tUICpMYXRjaCA9IDA7CisgICAgZm9yICg7IFBJICE9IFBFOyArK1BJKSB7CisgICAgICB0eXBlbmFtZSBJbnZCbG9ja1RyYWl0czo6Tm9kZVR5cGUgKk4gPSAqUEk7CisgICAgICBpZiAoY29udGFpbnMoTikpIHsKKyAgICAgICAgaWYgKExhdGNoKSByZXR1cm4gMDsKKyAgICAgICAgTGF0Y2ggPSBOOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBMYXRjaDsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBUElzIGZvciB1cGRhdGluZyBsb29wIGluZm9ybWF0aW9uIGFmdGVyIGNoYW5naW5nIHRoZSBDRkcKKyAgLy8KKworICAvLy8gYWRkQmFzaWNCbG9ja1RvTG9vcCAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgb3RoZXIgYW5hbHlzZXMgdG8gdXBkYXRlIGxvb3AKKyAgLy8vIGluZm9ybWF0aW9uLiAgTmV3QkIgaXMgc2V0IHRvIGJlIGEgbmV3IG1lbWJlciBvZiB0aGUgY3VycmVudCBsb29wLgorICAvLy8gQmVjYXVzZSBvZiB0aGlzLCBpdCBpcyBhZGRlZCBhcyBhIG1lbWJlciBvZiBhbGwgcGFyZW50IGxvb3BzLCBhbmQgaXMgYWRkZWQKKyAgLy8vIHRvIHRoZSBzcGVjaWZpZWQgTG9vcEluZm8gb2JqZWN0IGFzIGJlaW5nIGluIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrLiAgSXQKKyAgLy8vIGlzIG5vdCB2YWxpZCB0byByZXBsYWNlIHRoZSBsb29wIGhlYWRlciB3aXRoIHRoaXMgbWV0aG9kLgorICAvLy8KKyAgdm9pZCBhZGRCYXNpY0Jsb2NrVG9Mb29wKEJsb2NrVCAqTmV3QkIsIExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPiAmTEkpOworCisgIC8vLyByZXBsYWNlQ2hpbGRMb29wV2l0aCAtIFRoaXMgaXMgdXNlZCB3aGVuIHNwbGl0dGluZyBsb29wcyB1cC4gIEl0IHJlcGxhY2VzCisgIC8vLyB0aGUgT2xkQ2hpbGQgZW50cnkgaW4gb3VyIGNoaWxkcmVuIGxpc3Qgd2l0aCBOZXdDaGlsZCwgYW5kIHVwZGF0ZXMgdGhlCisgIC8vLyBwYXJlbnQgcG9pbnRlciBvZiBPbGRDaGlsZCB0byBiZSBudWxsIGFuZCB0aGUgTmV3Q2hpbGQgdG8gYmUgdGhpcyBsb29wLgorICAvLy8gVGhpcyB1cGRhdGVzIHRoZSBsb29wIGRlcHRoIG9mIHRoZSBuZXcgY2hpbGQuCisgIHZvaWQgcmVwbGFjZUNoaWxkTG9vcFdpdGgoTG9vcFQgKk9sZENoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BUICpOZXdDaGlsZCkgeworICAgIGFzc2VydChPbGRDaGlsZC0+UGFyZW50TG9vcCA9PSB0aGlzICYmICJUaGlzIGxvb3AgaXMgYWxyZWFkeSBicm9rZW4hIik7CisgICAgYXNzZXJ0KE5ld0NoaWxkLT5QYXJlbnRMb29wID09IDAgJiYgIk5ld0NoaWxkIGFscmVhZHkgaGFzIGEgcGFyZW50ISIpOworICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPExvb3BUICo+OjppdGVyYXRvciBJID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmaW5kKFN1Ykxvb3BzLmJlZ2luKCksIFN1Ykxvb3BzLmVuZCgpLCBPbGRDaGlsZCk7CisgICAgYXNzZXJ0KEkgIT0gU3ViTG9vcHMuZW5kKCkgJiYgIk9sZENoaWxkIG5vdCBpbiBsb29wISIpOworICAgICpJID0gTmV3Q2hpbGQ7CisgICAgT2xkQ2hpbGQtPlBhcmVudExvb3AgPSAwOworICAgIE5ld0NoaWxkLT5QYXJlbnRMb29wID0gc3RhdGljX2Nhc3Q8TG9vcFQgKj4odGhpcyk7CisgIH0KKworICAvLy8gYWRkQ2hpbGRMb29wIC0gQWRkIHRoZSBzcGVjaWZpZWQgbG9vcCB0byBiZSBhIGNoaWxkIG9mIHRoaXMgbG9vcC4gIFRoaXMKKyAgLy8vIHVwZGF0ZXMgdGhlIGxvb3AgZGVwdGggb2YgdGhlIG5ldyBjaGlsZC4KKyAgLy8vCisgIHZvaWQgYWRkQ2hpbGRMb29wKExvb3BUICpOZXdDaGlsZCkgeworICAgIGFzc2VydChOZXdDaGlsZC0+UGFyZW50TG9vcCA9PSAwICYmICJOZXdDaGlsZCBhbHJlYWR5IGhhcyBhIHBhcmVudCEiKTsKKyAgICBOZXdDaGlsZC0+UGFyZW50TG9vcCA9IHN0YXRpY19jYXN0PExvb3BUICo+KHRoaXMpOworICAgIFN1Ykxvb3BzLnB1c2hfYmFjayhOZXdDaGlsZCk7CisgIH0KKworICAvLy8gcmVtb3ZlQ2hpbGRMb29wIC0gVGhpcyByZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2hpbGQgZnJvbSBiZWluZyBhIHN1Ymxvb3Agb2YKKyAgLy8vIHRoaXMgbG9vcC4gIFRoZSBsb29wIGlzIG5vdCBkZWxldGVkLCBhcyBpdCB3aWxsIHByZXN1bWFibHkgYmUgaW5zZXJ0ZWQKKyAgLy8vIGludG8gYW5vdGhlciBsb29wLgorICBMb29wVCAqcmVtb3ZlQ2hpbGRMb29wKGl0ZXJhdG9yIEkpIHsKKyAgICBhc3NlcnQoSSAhPSBTdWJMb29wcy5lbmQoKSAmJiAiQ2Fubm90IHJlbW92ZSBlbmQgaXRlcmF0b3IhIik7CisgICAgTG9vcFQgKkNoaWxkID0gKkk7CisgICAgYXNzZXJ0KENoaWxkLT5QYXJlbnRMb29wID09IHRoaXMgJiYgIkNoaWxkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbG9vcCEiKTsKKyAgICBTdWJMb29wcy5lcmFzZShTdWJMb29wcy5iZWdpbigpKyhJLWJlZ2luKCkpKTsKKyAgICBDaGlsZC0+UGFyZW50TG9vcCA9IDA7CisgICAgcmV0dXJuIENoaWxkOworICB9CisKKyAgLy8vIGFkZEJsb2NrRW50cnkgLSBUaGlzIGFkZHMgYSBiYXNpYyBibG9jayBkaXJlY3RseSB0byB0aGUgYmFzaWMgYmxvY2sgbGlzdC4KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBjcmVhdGUgbmV3IGxvb3BzLiAgT3RoZXIKKyAgLy8vIHRyYW5zZm9ybWF0aW9ucyBzaG91bGQgdXNlIGFkZEJhc2ljQmxvY2tUb0xvb3AuCisgIHZvaWQgYWRkQmxvY2tFbnRyeShCbG9ja1QgKkJCKSB7CisgICAgQmxvY2tzLnB1c2hfYmFjayhCQik7CisgIH0KKworICAvLy8gbW92ZVRvSGVhZGVyIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBtb3ZlIEJCICh3aGljaCBtdXN0IGJlIHBhcnQgb2YgdGhpcworICAvLy8gbG9vcCkgdG8gYmUgdGhlIGxvb3AgaGVhZGVyIG9mIHRoZSBsb29wICh0aGUgYmxvY2sgdGhhdCBkb21pbmF0ZXMgYWxsCisgIC8vLyBvdGhlcnMpLgorICB2b2lkIG1vdmVUb0hlYWRlcihCbG9ja1QgKkJCKSB7CisgICAgaWYgKEJsb2Nrc1swXSA9PSBCQikgcmV0dXJuOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IDsgKytpKSB7CisgICAgICBhc3NlcnQoaSAhPSBCbG9ja3Muc2l6ZSgpICYmICJMb29wIGRvZXMgbm90IGNvbnRhaW4gQkIhIik7CisgICAgICBpZiAoQmxvY2tzW2ldID09IEJCKSB7CisgICAgICAgIEJsb2Nrc1tpXSA9IEJsb2Nrc1swXTsKKyAgICAgICAgQmxvY2tzWzBdID0gQkI7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gcmVtb3ZlQmxvY2tGcm9tTG9vcCAtIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrIGZyb20gdGhlCisgIC8vLyBjdXJyZW50IGxvb3AsIHVwZGF0aW5nIHRoZSBCbG9ja3MgYXMgYXBwcm9wcmlhdGUuICBUaGlzIGRvZXMgbm90IHVwZGF0ZQorICAvLy8gdGhlIG1hcHBpbmcgaW4gdGhlIExvb3BJbmZvIGNsYXNzLgorICB2b2lkIHJlbW92ZUJsb2NrRnJvbUxvb3AoQmxvY2tUICpCQikgeworICAgIFJlbW92ZUZyb21WZWN0b3IoQmxvY2tzLCBCQik7CisgIH0KKworICAvLy8gdmVyaWZ5TG9vcCAtIFZlcmlmeSBsb29wIHN0cnVjdHVyZQorICB2b2lkIHZlcmlmeUxvb3AoKSBjb25zdCB7CisjaWZuZGVmIE5ERUJVRworICAgIGFzc2VydCghQmxvY2tzLmVtcHR5KCkgJiYgIkxvb3AgaGVhZGVyIGlzIG1pc3NpbmciKTsKKworICAgIC8vIFNvcnQgdGhlIGJsb2NrcyB2ZWN0b3Igc28gdGhhdCB3ZSBjYW4gdXNlIGJpbmFyeSBzZWFyY2ggdG8gZG8gcXVpY2sKKyAgICAvLyBsb29rdXBzLgorICAgIFNtYWxsVmVjdG9yPEJsb2NrVCosIDEyOD4gTG9vcEJCcyhibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgICAgc3RkOjpzb3J0KExvb3BCQnMuYmVnaW4oKSwgTG9vcEJCcy5lbmQoKSk7CisKKyAgICAvLyBDaGVjayB0aGUgaW5kaXZpZHVhbCBibG9ja3MuCisgICAgZm9yIChibG9ja19pdGVyYXRvciBJID0gYmxvY2tfYmVnaW4oKSwgRSA9IGJsb2NrX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgQmxvY2tUICpCQiA9ICpJOworICAgICAgYm9vbCBIYXNJbnNpZGVMb29wU3VjY3MgPSBmYWxzZTsKKyAgICAgIGJvb2wgSGFzSW5zaWRlTG9vcFByZWRzID0gZmFsc2U7CisgICAgICBTbWFsbFZlY3RvcjxCbG9ja1QgKiwgMj4gT3V0c2lkZUxvb3BQcmVkczsKKworICAgICAgdHlwZWRlZiBHcmFwaFRyYWl0czxCbG9ja1QqPiBCbG9ja1RyYWl0czsKKyAgICAgIGZvciAodHlwZW5hbWUgQmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIFNJID0KKyAgICAgICAgICAgQmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKEJCKSwgU0UgPSBCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKEJCKTsKKyAgICAgICAgICAgU0kgIT0gU0U7ICsrU0kpCisgICAgICAgIGlmIChzdGQ6OmJpbmFyeV9zZWFyY2goTG9vcEJCcy5iZWdpbigpLCBMb29wQkJzLmVuZCgpLCAqU0kpKSB7CisgICAgICAgICAgSGFzSW5zaWRlTG9vcFN1Y2NzID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgdHlwZWRlZiBHcmFwaFRyYWl0czxJbnZlcnNlPEJsb2NrVCo+ID4gSW52QmxvY2tUcmFpdHM7CisgICAgICBmb3IgKHR5cGVuYW1lIEludkJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZSBQSSA9CisgICAgICAgICAgIEludkJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihCQiksIFBFID0gSW52QmxvY2tUcmFpdHM6OmNoaWxkX2VuZChCQik7CisgICAgICAgICAgIFBJICE9IFBFOyArK1BJKSB7CisgICAgICAgIHR5cGVuYW1lIEludkJsb2NrVHJhaXRzOjpOb2RlVHlwZSAqTiA9ICpQSTsKKyAgICAgICAgaWYgKHN0ZDo6YmluYXJ5X3NlYXJjaChMb29wQkJzLmJlZ2luKCksIExvb3BCQnMuZW5kKCksIE4pKQorICAgICAgICAgIEhhc0luc2lkZUxvb3BQcmVkcyA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBPdXRzaWRlTG9vcFByZWRzLnB1c2hfYmFjayhOKTsKKyAgICAgIH0KKworICAgICAgaWYgKEJCID09IGdldEhlYWRlcigpKSB7CisgICAgICAgIGFzc2VydCghT3V0c2lkZUxvb3BQcmVkcy5lbXB0eSgpICYmICJMb29wIGlzIHVucmVhY2hhYmxlISIpOworICAgICAgfSBlbHNlIGlmICghT3V0c2lkZUxvb3BQcmVkcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIEEgbm9uLWhlYWRlciBsb29wIHNob3VsZG4ndCBiZSByZWFjaGFibGUgZnJvbSBvdXRzaWRlIHRoZSBsb29wLAorICAgICAgICAvLyB0aG91Z2ggaXQgaXMgcGVybWl0dGVkIGlmIHRoZSBwcmVkZWNlc3NvciBpcyBub3QgaXRzZWxmIGFjdHVhbGx5CisgICAgICAgIC8vIHJlYWNoYWJsZS4KKyAgICAgICAgQmxvY2tUICpFbnRyeUJCID0gQkItPmdldFBhcmVudCgpLT5iZWdpbigpOworICAgICAgICBmb3IgKGRmX2l0ZXJhdG9yPEJsb2NrVCAqPiBOSSA9IGRmX2JlZ2luKEVudHJ5QkIpLAorICAgICAgICAgICAgIE5FID0gZGZfZW5kKEVudHJ5QkIpOyBOSSAhPSBORTsgKytOSSkKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3V0c2lkZUxvb3BQcmVkcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgYXNzZXJ0KCpOSSAhPSBPdXRzaWRlTG9vcFByZWRzW2ldICYmCisgICAgICAgICAgICAgICAgICAgIkxvb3AgaGFzIG11bHRpcGxlIGVudHJ5IHBvaW50cyEiKTsKKyAgICAgIH0KKyAgICAgIGFzc2VydChIYXNJbnNpZGVMb29wUHJlZHMgJiYgIkxvb3AgYmxvY2sgaGFzIG5vIGluLWxvb3AgcHJlZGVjZXNzb3JzISIpOworICAgICAgYXNzZXJ0KEhhc0luc2lkZUxvb3BTdWNjcyAmJiAiTG9vcCBibG9jayBoYXMgbm8gaW4tbG9vcCBzdWNjZXNzb3JzISIpOworICAgICAgYXNzZXJ0KEJCICE9IGdldEhlYWRlcigpLT5nZXRQYXJlbnQoKS0+YmVnaW4oKSAmJgorICAgICAgICAgICAgICJMb29wIGNvbnRhaW5zIGZ1bmN0aW9uIGVudHJ5IGJsb2NrISIpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoZSBzdWJsb29wcy4KKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgLy8gRWFjaCBibG9jayBpbiBlYWNoIHN1Ymxvb3Agc2hvdWxkIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBsb29wLgorICAgICAgZm9yIChibG9ja19pdGVyYXRvciBCSSA9ICgqSSktPmJsb2NrX2JlZ2luKCksIEJFID0gKCpJKS0+YmxvY2tfZW5kKCk7CisgICAgICAgICAgIEJJICE9IEJFOyArK0JJKSB7CisgICAgICAgIGFzc2VydChzdGQ6OmJpbmFyeV9zZWFyY2goTG9vcEJCcy5iZWdpbigpLCBMb29wQkJzLmVuZCgpLCAqQkkpICYmCisgICAgICAgICAgICAgICAiTG9vcCBkb2VzIG5vdCBjb250YWluIGFsbCB0aGUgYmxvY2tzIG9mIGEgc3VibG9vcCEiKTsKKyAgICAgIH0KKworICAgIC8vIENoZWNrIHRoZSBwYXJlbnQgbG9vcCBwb2ludGVyLgorICAgIGlmIChQYXJlbnRMb29wKSB7CisgICAgICBhc3NlcnQoc3RkOjpmaW5kKFBhcmVudExvb3AtPmJlZ2luKCksIFBhcmVudExvb3AtPmVuZCgpLCB0aGlzKSAhPQorICAgICAgICAgICAgICAgUGFyZW50TG9vcC0+ZW5kKCkgJiYKKyAgICAgICAgICAgICAiTG9vcCBpcyBub3QgYSBzdWJsb29wIG9mIGl0cyBwYXJlbnQhIik7CisgICAgfQorI2VuZGlmCisgIH0KKworICAvLy8gdmVyaWZ5TG9vcCAtIFZlcmlmeSBsb29wIHN0cnVjdHVyZSBvZiB0aGlzIGxvb3AgYW5kIGFsbCBuZXN0ZWQgbG9vcHMuCisgIHZvaWQgdmVyaWZ5TG9vcE5lc3QoKSBjb25zdCB7CisgICAgLy8gVmVyaWZ5IHRoaXMgbG9vcC4KKyAgICB2ZXJpZnlMb29wKCk7CisgICAgLy8gVmVyaWZ5IHRoZSBzdWJsb29wcy4KKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgKCpJKS0+dmVyaWZ5TG9vcE5lc3QoKTsKKyAgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0IHsKKyAgICBPUy5pbmRlbnQoRGVwdGgqMikgPDwgIkxvb3AgYXQgZGVwdGggIiA8PCBnZXRMb29wRGVwdGgoKQorICAgICAgIDw8ICIgY29udGFpbmluZzogIjsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBnZXRCbG9ja3MoKS5zaXplKCk7ICsraSkgeworICAgICAgaWYgKGkpIE9TIDw8ICIsIjsKKyAgICAgIEJsb2NrVCAqQkIgPSBnZXRCbG9ja3MoKVtpXTsKKyAgICAgIFdyaXRlQXNPcGVyYW5kKE9TLCBCQiwgZmFsc2UpOworICAgICAgaWYgKEJCID09IGdldEhlYWRlcigpKSAgICBPUyA8PCAiPGhlYWRlcj4iOworICAgICAgaWYgKEJCID09IGdldExvb3BMYXRjaCgpKSBPUyA8PCAiPGxhdGNoPiI7CisgICAgICBpZiAoaXNMb29wRXhpdGluZyhCQikpICAgIE9TIDw8ICI8ZXhpdGluZz4iOworICAgIH0KKyAgICBPUyA8PCAiXG4iOworCisgICAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICgqSSktPnByaW50KE9TLCBEZXB0aCsyKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBMb29wSW5mb0Jhc2U8QmxvY2tULCBMb29wVD47CisgIGV4cGxpY2l0IExvb3BCYXNlKEJsb2NrVCAqQkIpIDogUGFyZW50TG9vcCgwKSB7CisgICAgQmxvY2tzLnB1c2hfYmFjayhCQik7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+CityYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+ICZMb29wKSB7CisgIExvb3AucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK2NsYXNzIExvb3AgOiBwdWJsaWMgTG9vcEJhc2U8QmFzaWNCbG9jaywgTG9vcD4geworcHVibGljOgorICBMb29wKCkge30KKworICAvLy8gaXNMb29wSW52YXJpYW50IC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBsb29wIGludmFyaWFudAorICAvLy8KKyAgYm9vbCBpc0xvb3BJbnZhcmlhbnQoVmFsdWUgKlYpIGNvbnN0OworCisgIC8vLyBpc0xvb3BJbnZhcmlhbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGlzCisgIC8vLyBsb29wLWludmFyaWFudC4KKyAgLy8vCisgIGJvb2wgaXNMb29wSW52YXJpYW50KEluc3RydWN0aW9uICpJKSBjb25zdDsKKworICAvLy8gbWFrZUxvb3BJbnZhcmlhbnQgLSBJZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdHJ1Y3Rpb24gaW5zaWRlIG9mIHRoZQorICAvLy8gbG9vcCBhbmQgaXQgY2FuIGJlIGhvaXN0ZWQsIGRvIHNvIHRvIG1ha2UgaXQgdHJpdmlhbGx5IGxvb3AtaW52YXJpYW50LgorICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGFmdGVyIGFueSBob2lzdGluZyBpcyBsb29wIGludmFyaWFudC4gVGhpcworICAvLy8gZnVuY3Rpb24gY2FuIGJlIHVzZWQgYXMgYSBzbGlnaHRseSBtb3JlIGFnZ3Jlc3NpdmUgcmVwbGFjZW1lbnQgZm9yCisgIC8vLyBpc0xvb3BJbnZhcmlhbnQuCisgIC8vLworICAvLy8gSWYgSW5zZXJ0UHQgaXMgc3BlY2lmaWVkLCBpdCBpcyB0aGUgcG9pbnQgdG8gaG9pc3QgaW5zdHJ1Y3Rpb25zIHRvLgorICAvLy8gSWYgbnVsbCwgdGhlIHRlcm1pbmF0b3Igb2YgdGhlIGxvb3AgcHJlaGVhZGVyIGlzIHVzZWQuCisgIC8vLworICBib29sIG1ha2VMb29wSW52YXJpYW50KFZhbHVlICpWLCBib29sICZDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRQdCA9IDApIGNvbnN0OworCisgIC8vLyBtYWtlTG9vcEludmFyaWFudCAtIElmIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBpcyBpbnNpZGUgb2YgdGhlCisgIC8vLyBsb29wIGFuZCBpdCBjYW4gYmUgaG9pc3RlZCwgZG8gc28gdG8gbWFrZSBpdCB0cml2aWFsbHkgbG9vcC1pbnZhcmlhbnQuCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgYW55IGhvaXN0aW5nIGlzIGxvb3AgaW52YXJpYW50LiBUaGlzCisgIC8vLyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyBhIHNsaWdodGx5IG1vcmUgYWdncmVzc2l2ZSByZXBsYWNlbWVudCBmb3IKKyAgLy8vIGlzTG9vcEludmFyaWFudC4KKyAgLy8vCisgIC8vLyBJZiBJbnNlcnRQdCBpcyBzcGVjaWZpZWQsIGl0IGlzIHRoZSBwb2ludCB0byBob2lzdCBpbnN0cnVjdGlvbnMgdG8uCisgIC8vLyBJZiBudWxsLCB0aGUgdGVybWluYXRvciBvZiB0aGUgbG9vcCBwcmVoZWFkZXIgaXMgdXNlZC4KKyAgLy8vCisgIGJvb2wgbWFrZUxvb3BJbnZhcmlhbnQoSW5zdHJ1Y3Rpb24gKkksIGJvb2wgJkNoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydFB0ID0gMCkgY29uc3Q7CisKKyAgLy8vIGdldENhbm9uaWNhbEluZHVjdGlvblZhcmlhYmxlIC0gQ2hlY2sgdG8gc2VlIGlmIHRoZSBsb29wIGhhcyBhIGNhbm9uaWNhbAorICAvLy8gaW5kdWN0aW9uIHZhcmlhYmxlOiBhbiBpbnRlZ2VyIHJlY3VycmVuY2UgdGhhdCBzdGFydHMgYXQgMCBhbmQgaW5jcmVtZW50cworICAvLy8gYnkgb25lIGVhY2ggdGltZSB0aHJvdWdoIHRoZSBsb29wLiAgSWYgc28sIHJldHVybiB0aGUgcGhpIG5vZGUgdGhhdAorICAvLy8gY29ycmVzcG9uZHMgdG8gaXQuCisgIC8vLworICAvLy8gVGhlIEluZFZhclNpbXBsaWZ5IHBhc3MgdHJhbnNmb3JtcyBsb29wcyB0byBoYXZlIGEgY2Fub25pY2FsIGluZHVjdGlvbgorICAvLy8gdmFyaWFibGUuCisgIC8vLworICBQSElOb2RlICpnZXRDYW5vbmljYWxJbmR1Y3Rpb25WYXJpYWJsZSgpIGNvbnN0OworCisgIC8vLyBnZXRUcmlwQ291bnQgLSBSZXR1cm4gYSBsb29wLWludmFyaWFudCBMTFZNIHZhbHVlIGluZGljYXRpbmcgdGhlIG51bWJlciBvZgorICAvLy8gdGltZXMgdGhlIGxvb3Agd2lsbCBiZSBleGVjdXRlZC4gIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoYXQgdGhlIGJhY2tlZGdlCisgIC8vLyBvZiB0aGUgbG9vcCBleGVjdXRlcyBOLTEgdGltZXMuICBJZiB0aGUgdHJpcC1jb3VudCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwKKyAgLy8vIHRoaXMgcmV0dXJucyBudWxsLgorICAvLy8KKyAgLy8vIFRoZSBJbmRWYXJTaW1wbGlmeSBwYXNzIHRyYW5zZm9ybXMgbG9vcHMgdG8gaGF2ZSBhIGZvcm0gdGhhdCB0aGlzCisgIC8vLyBmdW5jdGlvbiBlYXNpbHkgdW5kZXJzdGFuZHMuCisgIC8vLworICBWYWx1ZSAqZ2V0VHJpcENvdW50KCkgY29uc3Q7CisKKyAgLy8vIGdldFNtYWxsQ29uc3RhbnRUcmlwQ291bnQgLSBSZXR1cm5zIHRoZSB0cmlwIGNvdW50IG9mIHRoaXMgbG9vcCBhcyBhCisgIC8vLyBub3JtYWwgdW5zaWduZWQgdmFsdWUsIGlmIHBvc3NpYmxlLiBSZXR1cm5zIDAgaWYgdGhlIHRyaXAgY291bnQgaXMgdW5rbm93bgorICAvLy8gb2Ygbm90IGNvbnN0YW50LiBXaWxsIGFsc28gcmV0dXJuIDAgaWYgdGhlIHRyaXAgY291bnQgaXMgdmVyeSBsYXJnZQorICAvLy8gKD49IDJeMzIpCisgIC8vLworICAvLy8gVGhlIEluZFZhclNpbXBsaWZ5IHBhc3MgdHJhbnNmb3JtcyBsb29wcyB0byBoYXZlIGEgZm9ybSB0aGF0IHRoaXMKKyAgLy8vIGZ1bmN0aW9uIGVhc2lseSB1bmRlcnN0YW5kcy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldFNtYWxsQ29uc3RhbnRUcmlwQ291bnQoKSBjb25zdDsKKworICAvLy8gZ2V0U21hbGxDb25zdGFudFRyaXBNdWx0aXBsZSAtIFJldHVybnMgdGhlIGxhcmdlc3QgY29uc3RhbnQgZGl2aXNvciBvZiB0aGUKKyAgLy8vIHRyaXAgY291bnQgb2YgdGhpcyBsb29wIGFzIGEgbm9ybWFsIHVuc2lnbmVkIHZhbHVlLCBpZiBwb3NzaWJsZS4gVGhpcworICAvLy8gbWVhbnMgdGhhdCB0aGUgYWN0dWFsIHRyaXAgY291bnQgaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgdGhlIHJldHVybmVkCisgIC8vLyB2YWx1ZSAoZG9uJ3QgZm9yZ2V0IHRoZSB0cmlwIGNvdW50IGNvdWxkIHZlcnkgd2VsbCBiZSB6ZXJvIGFzIHdlbGwhKS4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIDEgaWYgdGhlIHRyaXAgY291bnQgaXMgdW5rbm93biBvciBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGUKKyAgLy8vIG11bHRpcGxlIG9mIGEgY29uc3RhbnQgKHdoaWNoIGlzIGFsc28gdGhlIGNhc2UgaWYgdGhlIHRyaXAgY291bnQgaXMgc2ltcGx5CisgIC8vLyBjb25zdGFudCwgdXNlIGdldFNtYWxsQ29uc3RhbnRUcmlwQ291bnQgZm9yIHRoYXQgY2FzZSksIFdpbGwgYWxzbyByZXR1cm4gMQorICAvLy8gaWYgdGhlIHRyaXAgY291bnQgaXMgdmVyeSBsYXJnZSAoPj0gMl4zMikuCisgIHVuc2lnbmVkIGdldFNtYWxsQ29uc3RhbnRUcmlwTXVsdGlwbGUoKSBjb25zdDsKKworICAvLy8gaXNMQ1NTQUZvcm0gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgTG9vcCBpcyBpbiBMQ1NTQSBmb3JtCisgIGJvb2wgaXNMQ1NTQUZvcm0oRG9taW5hdG9yVHJlZSAmRFQpIGNvbnN0OworCisgIC8vLyBpc0xvb3BTaW1wbGlmeUZvcm0gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgTG9vcCBpcyBpbiB0aGUgZm9ybSB0aGF0CisgIC8vLyB0aGUgTG9vcFNpbXBsaWZ5IGZvcm0gdHJhbnNmb3JtcyBsb29wcyB0bywgd2hpY2ggaXMgc29tZXRpbWVzIGNhbGxlZAorICAvLy8gbm9ybWFsIGZvcm0uCisgIGJvb2wgaXNMb29wU2ltcGxpZnlGb3JtKCkgY29uc3Q7CisKKyAgLy8vIGhhc0RlZGljYXRlZEV4aXRzIC0gUmV0dXJuIHRydWUgaWYgbm8gZXhpdCBibG9jayBmb3IgdGhlIGxvb3AKKyAgLy8vIGhhcyBhIHByZWRlY2Vzc29yIHRoYXQgaXMgb3V0c2lkZSB0aGUgbG9vcC4KKyAgYm9vbCBoYXNEZWRpY2F0ZWRFeGl0cygpIGNvbnN0OworCisgIC8vLyBnZXRVbmlxdWVFeGl0QmxvY2tzIC0gUmV0dXJuIGFsbCB1bmlxdWUgc3VjY2Vzc29yIGJsb2NrcyBvZiB0aGlzIGxvb3AuIAorICAvLy8gVGhlc2UgYXJlIHRoZSBibG9ja3MgX291dHNpZGUgb2YgdGhlIGN1cnJlbnQgbG9vcF8gd2hpY2ggYXJlIGJyYW5jaGVkIHRvLgorICAvLy8gVGhpcyBhc3N1bWVzIHRoYXQgbG9vcCBleGl0cyBhcmUgaW4gY2Fub25pY2FsIGZvcm0uCisgIC8vLworICB2b2lkIGdldFVuaXF1ZUV4aXRCbG9ja3MoU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sgKj4gJkV4aXRCbG9ja3MpIGNvbnN0OworCisgIC8vLyBnZXRVbmlxdWVFeGl0QmxvY2sgLSBJZiBnZXRVbmlxdWVFeGl0QmxvY2tzIHdvdWxkIHJldHVybiBleGFjdGx5IG9uZQorICAvLy8gYmxvY2ssIHJldHVybiB0aGF0IGJsb2NrLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIEJhc2ljQmxvY2sgKmdldFVuaXF1ZUV4aXRCbG9jaygpIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICAKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBMb29wSW5mb0Jhc2U8QmFzaWNCbG9jaywgTG9vcD47CisgIGV4cGxpY2l0IExvb3AoQmFzaWNCbG9jayAqQkIpIDogTG9vcEJhc2U8QmFzaWNCbG9jaywgTG9vcD4oQkIpIHt9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIExvb3BJbmZvIC0gVGhpcyBjbGFzcyBidWlsZHMgYW5kIGNvbnRhaW5zIGFsbCBvZiB0aGUgdG9wIGxldmVsIGxvb3AKKy8vLyBzdHJ1Y3R1cmVzIGluIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24uCisvLy8KKwordGVtcGxhdGU8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK2NsYXNzIExvb3BJbmZvQmFzZSB7CisgIC8vIEJCTWFwIC0gTWFwcGluZyBvZiBiYXNpYyBibG9ja3MgdG8gdGhlIGlubmVyIG1vc3QgbG9vcCB0aGV5IG9jY3VyIGluCisgIHN0ZDo6bWFwPEJsb2NrVCAqLCBMb29wVCAqPiBCQk1hcDsKKyAgc3RkOjp2ZWN0b3I8TG9vcFQgKj4gVG9wTGV2ZWxMb29wczsKKyAgZnJpZW5kIGNsYXNzIExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OworCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IExvb3BJbmZvQmFzZSAmKTsgLy8gZG8gbm90IGltcGxlbWVudAorICBMb29wSW5mb0Jhc2UoY29uc3QgTG9vcEluZm8gJik7ICAgICAgIC8vIGRvIG5vdCBpbXBsZW1lbnQKK3B1YmxpYzoKKyAgTG9vcEluZm9CYXNlKCkgeyB9CisgIH5Mb29wSW5mb0Jhc2UoKSB7IHJlbGVhc2VNZW1vcnkoKTsgfQorICAKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgeworICAgIGZvciAodHlwZW5hbWUgc3RkOjp2ZWN0b3I8TG9vcFQgKj46Oml0ZXJhdG9yIEkgPQorICAgICAgICAgVG9wTGV2ZWxMb29wcy5iZWdpbigpLCBFID0gVG9wTGV2ZWxMb29wcy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBkZWxldGUgKkk7ICAgLy8gRGVsZXRlIGFsbCBvZiB0aGUgbG9vcHMuLi4KKworICAgIEJCTWFwLmNsZWFyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgaW50ZXJuYWwgc3RhdGUgb2YgYW5hbHlzaXMKKyAgICBUb3BMZXZlbExvb3BzLmNsZWFyKCk7CisgIH0KKyAgCisgIC8vLyBpdGVyYXRvci9iZWdpbi9lbmQgLSBUaGUgaW50ZXJmYWNlIHRvIHRoZSB0b3AtbGV2ZWwgbG9vcHMgaW4gdGhlIGN1cnJlbnQKKyAgLy8vIGZ1bmN0aW9uLgorICAvLy8KKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxMb29wVCAqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gVG9wTGV2ZWxMb29wcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFRvcExldmVsTG9vcHMuZW5kKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFRvcExldmVsTG9vcHMuZW1wdHkoKTsgfQorICAKKyAgLy8vIGdldExvb3BGb3IgLSBSZXR1cm4gdGhlIGlubmVyIG1vc3QgbG9vcCB0aGF0IEJCIGxpdmVzIGluLiAgSWYgYSBiYXNpYworICAvLy8gYmxvY2sgaXMgaW4gbm8gbG9vcCAoZm9yIGV4YW1wbGUgdGhlIGVudHJ5IG5vZGUpLCBudWxsIGlzIHJldHVybmVkLgorICAvLy8KKyAgTG9vcFQgKmdldExvb3BGb3IoY29uc3QgQmxvY2tUICpCQikgY29uc3QgeworICAgIHR5cGVuYW1lIHN0ZDo6bWFwPEJsb2NrVCAqLCBMb29wVCAqPjo6Y29uc3RfaXRlcmF0b3IgST0KKyAgICAgIEJCTWFwLmZpbmQoY29uc3RfY2FzdDxCbG9ja1QqPihCQikpOworICAgIHJldHVybiBJICE9IEJCTWFwLmVuZCgpID8gSS0+c2Vjb25kIDogMDsKKyAgfQorICAKKyAgLy8vIG9wZXJhdG9yW10gLSBzYW1lIGFzIGdldExvb3BGb3IuLi4KKyAgLy8vCisgIGNvbnN0IExvb3BUICpvcGVyYXRvcltdKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9vcEZvcihCQik7CisgIH0KKyAgCisgIC8vLyBnZXRMb29wRGVwdGggLSBSZXR1cm4gdGhlIGxvb3AgbmVzdGluZyBsZXZlbCBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLiAgQQorICAvLy8gZGVwdGggb2YgMCBtZWFucyB0aGUgYmxvY2sgaXMgbm90IGluc2lkZSBhbnkgbG9vcC4KKyAgLy8vCisgIHVuc2lnbmVkIGdldExvb3BEZXB0aChjb25zdCBCbG9ja1QgKkJCKSBjb25zdCB7CisgICAgY29uc3QgTG9vcFQgKkwgPSBnZXRMb29wRm9yKEJCKTsKKyAgICByZXR1cm4gTCA/IEwtPmdldExvb3BEZXB0aCgpIDogMDsKKyAgfQorCisgIC8vIGlzTG9vcEhlYWRlciAtIFRydWUgaWYgdGhlIGJsb2NrIGlzIGEgbG9vcCBoZWFkZXIgbm9kZQorICBib29sIGlzTG9vcEhlYWRlcihCbG9ja1QgKkJCKSBjb25zdCB7CisgICAgY29uc3QgTG9vcFQgKkwgPSBnZXRMb29wRm9yKEJCKTsKKyAgICByZXR1cm4gTCAmJiBMLT5nZXRIZWFkZXIoKSA9PSBCQjsKKyAgfQorICAKKyAgLy8vIHJlbW92ZUxvb3AgLSBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCB0b3AtbGV2ZWwgbG9vcCBmcm9tIHRoaXMgbG9vcCBpbmZvCisgIC8vLyBvYmplY3QuICBUaGUgbG9vcCBpcyBub3QgZGVsZXRlZCwgYXMgaXQgd2lsbCBwcmVzdW1hYmx5IGJlIGluc2VydGVkIGludG8KKyAgLy8vIGFub3RoZXIgbG9vcC4KKyAgTG9vcFQgKnJlbW92ZUxvb3AoaXRlcmF0b3IgSSkgeworICAgIGFzc2VydChJICE9IGVuZCgpICYmICJDYW5ub3QgcmVtb3ZlIGVuZCBpdGVyYXRvciEiKTsKKyAgICBMb29wVCAqTCA9ICpJOworICAgIGFzc2VydChMLT5nZXRQYXJlbnRMb29wKCkgPT0gMCAmJiAiTm90IGEgdG9wLWxldmVsIGxvb3AhIik7CisgICAgVG9wTGV2ZWxMb29wcy5lcmFzZShUb3BMZXZlbExvb3BzLmJlZ2luKCkgKyAoSS1iZWdpbigpKSk7CisgICAgcmV0dXJuIEw7CisgIH0KKyAgCisgIC8vLyBjaGFuZ2VMb29wRm9yIC0gQ2hhbmdlIHRoZSB0b3AtbGV2ZWwgbG9vcCB0aGF0IGNvbnRhaW5zIEJCIHRvIHRoZQorICAvLy8gc3BlY2lmaWVkIGxvb3AuICBUaGlzIHNob3VsZCBiZSB1c2VkIGJ5IHRyYW5zZm9ybWF0aW9ucyB0aGF0IHJlc3RydWN0dXJlCisgIC8vLyB0aGUgbG9vcCBoaWVyYXJjaHkgdHJlZS4KKyAgdm9pZCBjaGFuZ2VMb29wRm9yKEJsb2NrVCAqQkIsIExvb3BUICpMKSB7CisgICAgTG9vcFQgKiZPbGRMb29wID0gQkJNYXBbQkJdOworICAgIGFzc2VydChPbGRMb29wICYmICJCbG9jayBub3QgaW4gYSBsb29wIHlldCEiKTsKKyAgICBPbGRMb29wID0gTDsKKyAgfQorICAKKyAgLy8vIGNoYW5nZVRvcExldmVsTG9vcCAtIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBsb29wIGluIHRoZSB0b3AtbGV2ZWwgbG9vcHMKKyAgLy8vIGxpc3Qgd2l0aCB0aGUgaW5kaWNhdGVkIGxvb3AuCisgIHZvaWQgY2hhbmdlVG9wTGV2ZWxMb29wKExvb3BUICpPbGRMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wVCAqTmV3TG9vcCkgeworICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPExvb3BUICo+OjppdGVyYXRvciBJID0KKyAgICAgICAgICAgICAgICAgc3RkOjpmaW5kKFRvcExldmVsTG9vcHMuYmVnaW4oKSwgVG9wTGV2ZWxMb29wcy5lbmQoKSwgT2xkTG9vcCk7CisgICAgYXNzZXJ0KEkgIT0gVG9wTGV2ZWxMb29wcy5lbmQoKSAmJiAiT2xkIGxvb3Agbm90IGF0IHRvcCBsZXZlbCEiKTsKKyAgICAqSSA9IE5ld0xvb3A7CisgICAgYXNzZXJ0KE5ld0xvb3AtPlBhcmVudExvb3AgPT0gMCAmJiBPbGRMb29wLT5QYXJlbnRMb29wID09IDAgJiYKKyAgICAgICAgICAgIkxvb3BzIGFscmVhZHkgZW1iZWRkZWQgaW50byBhIHN1Ymxvb3AhIik7CisgIH0KKyAgCisgIC8vLyBhZGRUb3BMZXZlbExvb3AgLSBUaGlzIGFkZHMgdGhlIHNwZWNpZmllZCBsb29wIHRvIHRoZSBjb2xsZWN0aW9uIG9mCisgIC8vLyB0b3AtbGV2ZWwgbG9vcHMuCisgIHZvaWQgYWRkVG9wTGV2ZWxMb29wKExvb3BUICpOZXcpIHsKKyAgICBhc3NlcnQoTmV3LT5nZXRQYXJlbnRMb29wKCkgPT0gMCAmJiAiTG9vcCBhbHJlYWR5IGluIHN1Ymxvb3AhIik7CisgICAgVG9wTGV2ZWxMb29wcy5wdXNoX2JhY2soTmV3KTsKKyAgfQorICAKKyAgLy8vIHJlbW92ZUJsb2NrIC0gVGhpcyBtZXRob2QgY29tcGxldGVseSByZW1vdmVzIEJCIGZyb20gYWxsIGRhdGEgc3RydWN0dXJlcywKKyAgLy8vIGluY2x1ZGluZyBhbGwgb2YgdGhlIExvb3Agb2JqZWN0cyBpdCBpcyBuZXN0ZWQgaW4gYW5kIG91ciBtYXBwaW5nIGZyb20KKyAgLy8vIEJhc2ljQmxvY2tzIHRvIGxvb3BzLgorICB2b2lkIHJlbW92ZUJsb2NrKEJsb2NrVCAqQkIpIHsKKyAgICB0eXBlbmFtZSBzdGQ6Om1hcDxCbG9ja1QgKiwgTG9vcFQgKj46Oml0ZXJhdG9yIEkgPSBCQk1hcC5maW5kKEJCKTsKKyAgICBpZiAoSSAhPSBCQk1hcC5lbmQoKSkgeworICAgICAgZm9yIChMb29wVCAqTCA9IEktPnNlY29uZDsgTDsgTCA9IEwtPmdldFBhcmVudExvb3AoKSkKKyAgICAgICAgTC0+cmVtb3ZlQmxvY2tGcm9tTG9vcChCQik7CisKKyAgICAgIEJCTWFwLmVyYXNlKEkpOworICAgIH0KKyAgfQorICAKKyAgLy8gSW50ZXJuYWxzCisgIAorICBzdGF0aWMgYm9vbCBpc05vdEFscmVhZHlDb250YWluZWRJbihjb25zdCBMb29wVCAqU3ViTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcFQgKlBhcmVudExvb3ApIHsKKyAgICBpZiAoU3ViTG9vcCA9PSAwKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoU3ViTG9vcCA9PSBQYXJlbnRMb29wKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGlzTm90QWxyZWFkeUNvbnRhaW5lZEluKFN1Ykxvb3AtPmdldFBhcmVudExvb3AoKSwgUGFyZW50TG9vcCk7CisgIH0KKyAgCisgIHZvaWQgQ2FsY3VsYXRlKERvbWluYXRvclRyZWVCYXNlPEJsb2NrVD4gJkRUKSB7CisgICAgQmxvY2tUICpSb290Tm9kZSA9IERULmdldFJvb3ROb2RlKCktPmdldEJsb2NrKCk7CisKKyAgICBmb3IgKGRmX2l0ZXJhdG9yPEJsb2NrVCo+IE5JID0gZGZfYmVnaW4oUm9vdE5vZGUpLAorICAgICAgICAgICBORSA9IGRmX2VuZChSb290Tm9kZSk7IE5JICE9IE5FOyArK05JKQorICAgICAgaWYgKExvb3BUICpMID0gQ29uc2lkZXJGb3JMb29wKCpOSSwgRFQpKQorICAgICAgICBUb3BMZXZlbExvb3BzLnB1c2hfYmFjayhMKTsKKyAgfQorICAKKyAgTG9vcFQgKkNvbnNpZGVyRm9yTG9vcChCbG9ja1QgKkJCLCBEb21pbmF0b3JUcmVlQmFzZTxCbG9ja1Q+ICZEVCkgeworICAgIGlmIChCQk1hcC5maW5kKEJCKSAhPSBCQk1hcC5lbmQoKSkgcmV0dXJuIDA7Ly8gSGF2ZW4ndCBwcm9jZXNzZWQgdGhpcyBub2RlPworCisgICAgc3RkOjp2ZWN0b3I8QmxvY2tUICo+IFRvZG9TdGFjazsKKworICAgIC8vIFNjYW4gdGhlIHByZWRlY2Vzc29ycyBvZiBCQiwgY2hlY2tpbmcgdG8gc2VlIGlmIEJCIGRvbWluYXRlcyBhbnkgb2YKKyAgICAvLyB0aGVtLiAgVGhpcyBpZGVudGlmaWVzIGJhY2tlZGdlcyB3aGljaCB0YXJnZXQgdGhpcyBub2RlLi4uCisgICAgdHlwZWRlZiBHcmFwaFRyYWl0czxJbnZlcnNlPEJsb2NrVCo+ID4gSW52QmxvY2tUcmFpdHM7CisgICAgZm9yICh0eXBlbmFtZSBJbnZCbG9ja1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGUgSSA9CisgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oQkIpLCBFID0gSW52QmxvY2tUcmFpdHM6OmNoaWxkX2VuZChCQik7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgdHlwZW5hbWUgSW52QmxvY2tUcmFpdHM6Ok5vZGVUeXBlICpOID0gKkk7CisgICAgICBpZiAoRFQuZG9taW5hdGVzKEJCLCBOKSkgICAvLyBJZiBCQiBkb21pbmF0ZXMgaXRzIHByZWRlY2Vzc29yLi4uCisgICAgICAgICAgVG9kb1N0YWNrLnB1c2hfYmFjayhOKTsKKyAgICB9CisKKyAgICBpZiAoVG9kb1N0YWNrLmVtcHR5KCkpIHJldHVybiAwOyAgLy8gTm8gYmFja2VkZ2VzIHRvIHRoaXMgYmxvY2suLi4KKworICAgIC8vIENyZWF0ZSBhIG5ldyBsb29wIHRvIHJlcHJlc2VudCB0aGlzIGJhc2ljIGJsb2NrLi4uCisgICAgTG9vcFQgKkwgPSBuZXcgTG9vcFQoQkIpOworICAgIEJCTWFwW0JCXSA9IEw7CisKKyAgICBCbG9ja1QgKkVudHJ5QmxvY2sgPSBCQi0+Z2V0UGFyZW50KCktPmJlZ2luKCk7CisKKyAgICB3aGlsZSAoIVRvZG9TdGFjay5lbXB0eSgpKSB7ICAvLyBQcm9jZXNzIGFsbCB0aGUgbm9kZXMgaW4gdGhlIGxvb3AKKyAgICAgIEJsb2NrVCAqWCA9IFRvZG9TdGFjay5iYWNrKCk7CisgICAgICBUb2RvU3RhY2sucG9wX2JhY2soKTsKKworICAgICAgaWYgKCFMLT5jb250YWlucyhYKSAmJiAgICAgICAgIC8vIEFzIG9mIHlldCB1bnByb2Nlc3NlZD8/CisgICAgICAgICAgRFQuZG9taW5hdGVzKEVudHJ5QmxvY2ssIFgpKSB7ICAgLy8gWCBpcyByZWFjaGFibGUgZnJvbSBlbnRyeSBibG9jaz8KKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgYmxvY2sgYWxyZWFkeSBiZWxvbmdzIHRvIGEgbG9vcC4gIElmIHRoaXMgb2NjdXJzCisgICAgICAgIC8vIHRoZW4gd2UgaGF2ZSBhIGNhc2Ugd2hlcmUgYSBsb29wIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgYSBjaGlsZCBvZgorICAgICAgICAvLyB0aGUgY3VycmVudCBsb29wIHdhcyBwcm9jZXNzZWQgYmVmb3JlIHRoZSBjdXJyZW50IGxvb3AuICBXaGVuIHRoaXMKKyAgICAgICAgLy8gb2NjdXJzLCB0aGlzIGNoaWxkIGxvb3AgZ2V0cyBhZGRlZCB0byBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgbG9vcCwKKyAgICAgICAgLy8gbWFraW5nIGl0IGEgc2libGluZyB0byB0aGUgY3VycmVudCBsb29wLiAgV2UgaGF2ZSB0byByZXBhcmVudCB0aGlzCisgICAgICAgIC8vIGxvb3AuCisgICAgICAgIGlmIChMb29wVCAqU3ViTG9vcCA9CisgICAgICAgICAgICBjb25zdF9jYXN0PExvb3BUICo+KGdldExvb3BGb3IoWCkpKQorICAgICAgICAgIGlmIChTdWJMb29wLT5nZXRIZWFkZXIoKSA9PSBYICYmIGlzTm90QWxyZWFkeUNvbnRhaW5lZEluKFN1Ykxvb3AsIEwpKXsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3VibG9vcCBmcm9tIGl0cyBjdXJyZW50IHBhcmVudC4uLgorICAgICAgICAgICAgYXNzZXJ0KFN1Ykxvb3AtPlBhcmVudExvb3AgJiYgU3ViTG9vcC0+UGFyZW50TG9vcCAhPSBMKTsKKyAgICAgICAgICAgIExvb3BUICpTTFAgPSBTdWJMb29wLT5QYXJlbnRMb29wOyAgLy8gU3ViTG9vcFBhcmVudAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8TG9vcFQgKj46Oml0ZXJhdG9yIEkgPQorICAgICAgICAgICAgICBzdGQ6OmZpbmQoU0xQLT5TdWJMb29wcy5iZWdpbigpLCBTTFAtPlN1Ykxvb3BzLmVuZCgpLCBTdWJMb29wKTsKKyAgICAgICAgICAgIGFzc2VydChJICE9IFNMUC0+U3ViTG9vcHMuZW5kKCkgJiYiU3ViTG9vcCBub3QgYSBjaGlsZCBvZiBwYXJlbnQ/Iik7CisgICAgICAgICAgICBTTFAtPlN1Ykxvb3BzLmVyYXNlKEkpOyAgIC8vIFJlbW92ZSBmcm9tIHBhcmVudC4uLgorCisgICAgICAgICAgICAvLyBBZGQgdGhlIHN1Ymxvb3AgdG8gVEhJUyBsb29wLi4uCisgICAgICAgICAgICBTdWJMb29wLT5QYXJlbnRMb29wID0gTDsKKyAgICAgICAgICAgIEwtPlN1Ykxvb3BzLnB1c2hfYmFjayhTdWJMb29wKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgLy8gTm9ybWFsIGNhc2UsIGFkZCB0aGUgYmxvY2sgdG8gb3VyIGxvb3AuLi4KKyAgICAgICAgTC0+QmxvY2tzLnB1c2hfYmFjayhYKTsKKyAgICAgICAgCisgICAgICAgIHR5cGVkZWYgR3JhcGhUcmFpdHM8SW52ZXJzZTxCbG9ja1QqPiA+IEludkJsb2NrVHJhaXRzOworICAgICAgICAKKyAgICAgICAgLy8gQWRkIGFsbCBvZiB0aGUgcHJlZGVjZXNzb3JzIG9mIFggdG8gdGhlIGVuZCBvZiB0aGUgd29yayBzdGFjay4uLgorICAgICAgICBUb2RvU3RhY2suaW5zZXJ0KFRvZG9TdGFjay5lbmQoKSwgSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKFgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEludkJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoWCkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgbG9vcHMgbmVzdGVkIHdpdGhpbiB0aGlzIGxvb3AsIGNyZWF0ZSB0aGVtIG5vdyEKKyAgICBmb3IgKHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEJsb2NrVCo+OjppdGVyYXRvciBJID0gTC0+QmxvY2tzLmJlZ2luKCksCisgICAgICAgICBFID0gTC0+QmxvY2tzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmIChMb29wVCAqTmV3TG9vcCA9IENvbnNpZGVyRm9yTG9vcCgqSSwgRFQpKSB7CisgICAgICAgIEwtPlN1Ykxvb3BzLnB1c2hfYmFjayhOZXdMb29wKTsKKyAgICAgICAgTmV3TG9vcC0+UGFyZW50TG9vcCA9IEw7CisgICAgICB9CisKKyAgICAvLyBBZGQgdGhlIGJhc2ljIGJsb2NrcyB0aGF0IGNvbXByaXNlIHRoaXMgbG9vcCB0byB0aGUgQkJNYXAgc28gdGhhdCB0aGlzCisgICAgLy8gbG9vcCBjYW4gYmUgZm91bmQgZm9yIHRoZW0uCisgICAgLy8KKyAgICBmb3IgKHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEJsb2NrVCo+OjppdGVyYXRvciBJID0gTC0+QmxvY2tzLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBMLT5CbG9ja3MuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgQkJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpJLCBMKSk7CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgbGlzdCBvZiBhbGwgb2YgdGhlIGNoaWxkIGxvb3BzIG9mIHRoaXMgbG9vcCwgY2hlY2sgdG8KKyAgICAvLyBzZWUgaWYgYW55IG9mIHRoZW0gc2hvdWxkIGFjdHVhbGx5IGJlIG5lc3RlZCBpbnNpZGUgb2YgZWFjaCBvdGhlci4gIFdlCisgICAgLy8gY2FuIGFjY2lkZW50YWxseSBwdWxsIGxvb3BzIG91ciBvZiB0aGVpciBwYXJlbnRzLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0bworICAgIC8vIG9yZ2FuaXplIHRoZSBsb29wIG5lc3RzIGNvcnJlY3RseSBub3cuCisgICAgeworICAgICAgc3RkOjptYXA8QmxvY2tUICosIExvb3BUICo+IENvbnRhaW5pbmdMb29wczsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTC0+U3ViTG9vcHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgTG9vcFQgKkNoaWxkID0gTC0+U3ViTG9vcHNbaV07CisgICAgICAgIGFzc2VydChDaGlsZC0+Z2V0UGFyZW50TG9vcCgpID09IEwgJiYgIk5vdCBwcm9wZXIgY2hpbGQgbG9vcD8iKTsKKworICAgICAgICBpZiAoTG9vcFQgKkNvbnRhaW5pbmdMb29wID0gQ29udGFpbmluZ0xvb3BzW0NoaWxkLT5nZXRIZWFkZXIoKV0pIHsKKyAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgbG9vcCB3aGljaCBjb250YWlucyB0aGlzIGxvb3AsIG1vdmUgdGhpcyBsb29wCisgICAgICAgICAgLy8gaW50byB0aGUgY29udGFpbmluZyBsb29wLgorICAgICAgICAgIE1vdmVTaWJsaW5nTG9vcEludG8oQ2hpbGQsIENvbnRhaW5pbmdMb29wKTsKKyAgICAgICAgICAtLWk7ICAvLyBUaGUgbG9vcCBnb3QgcmVtb3ZlZCBmcm9tIHRoZSBTdWJMb29wcyBsaXN0LgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFRoaXMgaXMgY3VycmVudGx5IGNvbnNpZGVyZWQgdG8gYmUgYSB0b3AtbGV2ZWwgbG9vcC4gIENoZWNrIHRvIHNlZQorICAgICAgICAgIC8vIGlmIGFueSBvZiB0aGUgY29udGFpbmVkIGJsb2NrcyBhcmUgbG9vcCBoZWFkZXJzIGZvciBzdWJsb29wcyB3ZQorICAgICAgICAgIC8vIGhhdmUgYWxyZWFkeSBwcm9jZXNzZWQuCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBiID0gMCwgZSA9IENoaWxkLT5CbG9ja3Muc2l6ZSgpOyBiICE9IGU7ICsrYikgeworICAgICAgICAgICAgTG9vcFQgKiZCbG9ja0xvb3AgPSBDb250YWluaW5nTG9vcHNbQ2hpbGQtPkJsb2Nrc1tiXV07CisgICAgICAgICAgICBpZiAoQmxvY2tMb29wID09IDApIHsgICAvLyBDaGlsZCBibG9jayBub3QgcHJvY2Vzc2VkIHlldC4uLgorICAgICAgICAgICAgICBCbG9ja0xvb3AgPSBDaGlsZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQmxvY2tMb29wICE9IENoaWxkKSB7CisgICAgICAgICAgICAgIExvb3BUICpTdWJMb29wID0gQmxvY2tMb29wOworICAgICAgICAgICAgICAvLyBSZXBhcmVudCBhbGwgb2YgdGhlIGJsb2NrcyB3aGljaCB1c2VkIHRvIGJlbG9uZyB0byBCbG9ja0xvb3BzCisgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGYgPSBTdWJMb29wLT5CbG9ja3Muc2l6ZSgpOyBqICE9IGY7ICsraikKKyAgICAgICAgICAgICAgICBDb250YWluaW5nTG9vcHNbU3ViTG9vcC0+QmxvY2tzW2pdXSA9IENoaWxkOworCisgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFscmVhZHkgYSBsb29wIHdoaWNoIGNvbnRhaW5zIHRoaXMgYmxvY2ssIHRoYXQgbWVhbnMKKyAgICAgICAgICAgICAgLy8gdGhhdCB3ZSBzaG91bGQgcmVwYXJlbnQgdGhlIGxvb3Agd2hpY2ggdGhlIGJsb2NrIGlzIGN1cnJlbnRseQorICAgICAgICAgICAgICAvLyBjb25zaWRlcmVkIHRvIGJlbG9uZyB0byB0byBiZSBhIGNoaWxkIG9mIHRoaXMgbG9vcC4KKyAgICAgICAgICAgICAgTW92ZVNpYmxpbmdMb29wSW50byhTdWJMb29wLCBDaGlsZCk7CisgICAgICAgICAgICAgIC0taTsgIC8vIFdlIGp1c3Qgc2hydW5rIHRoZSBTdWJMb29wcyBsaXN0LgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBMOworICB9CisgIAorICAvLy8gTW92ZVNpYmxpbmdMb29wSW50byAtIFRoaXMgbWV0aG9kIG1vdmVzIHRoZSBOZXdDaGlsZCBsb29wIHRvIGxpdmUgaW5zaWRlCisgIC8vLyBvZiB0aGUgTmV3UGFyZW50IExvb3AsIGluc3RlYWQgb2YgYmVpbmcgYSBzaWJsaW5nIG9mIGl0LgorICB2b2lkIE1vdmVTaWJsaW5nTG9vcEludG8oTG9vcFQgKk5ld0NoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFQgKk5ld1BhcmVudCkgeworICAgIExvb3BUICpPbGRQYXJlbnQgPSBOZXdDaGlsZC0+Z2V0UGFyZW50TG9vcCgpOworICAgIGFzc2VydChPbGRQYXJlbnQgJiYgT2xkUGFyZW50ID09IE5ld1BhcmVudC0+Z2V0UGFyZW50TG9vcCgpICYmCisgICAgICAgICAgIE5ld0NoaWxkICE9IE5ld1BhcmVudCAmJiAiTm90IHNpYmxpbmcgbG9vcHMhIik7CisKKyAgICAvLyBSZW1vdmUgTmV3Q2hpbGQgZnJvbSBiZWluZyBhIGNoaWxkIG9mIE9sZFBhcmVudAorICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPExvb3BUICo+OjppdGVyYXRvciBJID0KKyAgICAgIHN0ZDo6ZmluZChPbGRQYXJlbnQtPlN1Ykxvb3BzLmJlZ2luKCksIE9sZFBhcmVudC0+U3ViTG9vcHMuZW5kKCksCisgICAgICAgICAgICAgICAgTmV3Q2hpbGQpOworICAgIGFzc2VydChJICE9IE9sZFBhcmVudC0+U3ViTG9vcHMuZW5kKCkgJiYgIlBhcmVudCBmaWVsZHMgaW5jb3JyZWN0Pz8iKTsKKyAgICBPbGRQYXJlbnQtPlN1Ykxvb3BzLmVyYXNlKEkpOyAgIC8vIFJlbW92ZSBmcm9tIHBhcmVudCdzIHN1Ymxvb3BzIGxpc3QKKyAgICBOZXdDaGlsZC0+UGFyZW50TG9vcCA9IDA7CisKKyAgICBJbnNlcnRMb29wSW50byhOZXdDaGlsZCwgTmV3UGFyZW50KTsKKyAgfQorICAKKyAgLy8vIEluc2VydExvb3BJbnRvIC0gVGhpcyBpbnNlcnRzIGxvb3AgTCBpbnRvIHRoZSBzcGVjaWZpZWQgcGFyZW50IGxvb3AuICBJZgorICAvLy8gdGhlIHBhcmVudCBsb29wIGNvbnRhaW5zIGEgbG9vcCB3aGljaCBzaG91bGQgY29udGFpbiBMLCB0aGUgbG9vcCBnZXRzCisgIC8vLyBpbnNlcnRlZCBpbnRvIEwgaW5zdGVhZC4KKyAgdm9pZCBJbnNlcnRMb29wSW50byhMb29wVCAqTCwgTG9vcFQgKlBhcmVudCkgeworICAgIEJsb2NrVCAqTEhlYWRlciA9IEwtPmdldEhlYWRlcigpOworICAgIGFzc2VydChQYXJlbnQtPmNvbnRhaW5zKExIZWFkZXIpICYmCisgICAgICAgICAgICJUaGlzIGxvb3Agc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCBoZXJlISIpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0IGJlbG9uZ3MgaW4gYSBjaGlsZCBsb29wLi4uCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihQYXJlbnQtPlN1Ykxvb3BzLnNpemUoKSk7CisgICAgICAgICBpICE9IGU7ICsraSkKKyAgICAgIGlmIChQYXJlbnQtPlN1Ykxvb3BzW2ldLT5jb250YWlucyhMSGVhZGVyKSkgeworICAgICAgICBJbnNlcnRMb29wSW50byhMLCBQYXJlbnQtPlN1Ykxvb3BzW2ldKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgLy8gSWYgbm90LCBpbnNlcnQgaXQgaGVyZSEKKyAgICBQYXJlbnQtPlN1Ykxvb3BzLnB1c2hfYmFjayhMKTsKKyAgICBMLT5QYXJlbnRMb29wID0gUGFyZW50OworICB9CisgIAorICAvLyBEZWJ1Z2dpbmcKKyAgCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFRvcExldmVsTG9vcHMuc2l6ZSgpOyArK2kpCisgICAgICBUb3BMZXZlbExvb3BzW2ldLT5wcmludChPUyk7CisgICNpZiAwCisgICAgZm9yIChzdGQ6Om1hcDxCYXNpY0Jsb2NrKiwgTG9vcFQqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCTWFwLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBCQk1hcC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBPUyA8PCAiQkIgJyIgPDwgSS0+Zmlyc3QtPmdldE5hbWUoKSA8PCAiJyBsZXZlbCA9ICIKKyAgICAgICAgIDw8IEktPnNlY29uZC0+Z2V0TG9vcERlcHRoKCkgPDwgIlxuIjsKKyAgI2VuZGlmCisgIH0KK307CisKK2NsYXNzIExvb3BJbmZvIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIExvb3BJbmZvQmFzZTxCYXNpY0Jsb2NrLCBMb29wPiBMSTsKKyAgZnJpZW5kIGNsYXNzIExvb3BCYXNlPEJhc2ljQmxvY2ssIExvb3A+OworCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IExvb3BJbmZvICYpOyAvLyBkbyBub3QgaW1wbGVtZW50CisgIExvb3BJbmZvKGNvbnN0IExvb3BJbmZvICYpOyAgICAgICAvLyBkbyBub3QgaW1wbGVtZW50CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisKKyAgTG9vcEluZm8oKSA6IEZ1bmN0aW9uUGFzcyhJRCkge30KKworICBMb29wSW5mb0Jhc2U8QmFzaWNCbG9jaywgTG9vcD4mIGdldEJhc2UoKSB7IHJldHVybiBMSTsgfQorCisgIC8vLyBpdGVyYXRvci9iZWdpbi9lbmQgLSBUaGUgaW50ZXJmYWNlIHRvIHRoZSB0b3AtbGV2ZWwgbG9vcHMgaW4gdGhlIGN1cnJlbnQKKyAgLy8vIGZ1bmN0aW9uLgorICAvLy8KKyAgdHlwZWRlZiBMb29wSW5mb0Jhc2U8QmFzaWNCbG9jaywgTG9vcD46Oml0ZXJhdG9yIGl0ZXJhdG9yOworICBpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBMSS5iZWdpbigpOyB9CisgIGlubGluZSBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBMSS5lbmQoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTEkuZW1wdHkoKTsgfQorCisgIC8vLyBnZXRMb29wRm9yIC0gUmV0dXJuIHRoZSBpbm5lciBtb3N0IGxvb3AgdGhhdCBCQiBsaXZlcyBpbi4gIElmIGEgYmFzaWMKKyAgLy8vIGJsb2NrIGlzIGluIG5vIGxvb3AgKGZvciBleGFtcGxlIHRoZSBlbnRyeSBub2RlKSwgbnVsbCBpcyByZXR1cm5lZC4KKyAgLy8vCisgIGlubGluZSBMb29wICpnZXRMb29wRm9yKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIExJLmdldExvb3BGb3IoQkIpOworICB9CisKKyAgLy8vIG9wZXJhdG9yW10gLSBzYW1lIGFzIGdldExvb3BGb3IuLi4KKyAgLy8vCisgIGlubGluZSBjb25zdCBMb29wICpvcGVyYXRvcltdKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIExJLmdldExvb3BGb3IoQkIpOworICB9CisKKyAgLy8vIGdldExvb3BEZXB0aCAtIFJldHVybiB0aGUgbG9vcCBuZXN0aW5nIGxldmVsIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suICBBCisgIC8vLyBkZXB0aCBvZiAwIG1lYW5zIHRoZSBibG9jayBpcyBub3QgaW5zaWRlIGFueSBsb29wLgorICAvLy8KKyAgaW5saW5lIHVuc2lnbmVkIGdldExvb3BEZXB0aChjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBMSS5nZXRMb29wRGVwdGgoQkIpOworICB9CisKKyAgLy8gaXNMb29wSGVhZGVyIC0gVHJ1ZSBpZiB0aGUgYmxvY2sgaXMgYSBsb29wIGhlYWRlciBub2RlCisgIGlubGluZSBib29sIGlzTG9vcEhlYWRlcihCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBMSS5pc0xvb3BIZWFkZXIoQkIpOworICB9CisKKyAgLy8vIHJ1bk9uRnVuY3Rpb24gLSBDYWxjdWxhdGUgdGhlIG5hdHVyYWwgbG9vcCBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKworICB2aXJ0dWFsIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpIHsgTEkucmVsZWFzZU1lbW9yeSgpOyB9CisKKyAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUqIE0gPSAwKSBjb25zdDsKKyAgCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKworICAvLy8gcmVtb3ZlTG9vcCAtIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHRvcC1sZXZlbCBsb29wIGZyb20gdGhpcyBsb29wIGluZm8KKyAgLy8vIG9iamVjdC4gIFRoZSBsb29wIGlzIG5vdCBkZWxldGVkLCBhcyBpdCB3aWxsIHByZXN1bWFibHkgYmUgaW5zZXJ0ZWQgaW50bworICAvLy8gYW5vdGhlciBsb29wLgorICBpbmxpbmUgTG9vcCAqcmVtb3ZlTG9vcChpdGVyYXRvciBJKSB7IHJldHVybiBMSS5yZW1vdmVMb29wKEkpOyB9CisKKyAgLy8vIGNoYW5nZUxvb3BGb3IgLSBDaGFuZ2UgdGhlIHRvcC1sZXZlbCBsb29wIHRoYXQgY29udGFpbnMgQkIgdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgbG9vcC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgYnkgdHJhbnNmb3JtYXRpb25zIHRoYXQgcmVzdHJ1Y3R1cmUKKyAgLy8vIHRoZSBsb29wIGhpZXJhcmNoeSB0cmVlLgorICBpbmxpbmUgdm9pZCBjaGFuZ2VMb29wRm9yKEJhc2ljQmxvY2sgKkJCLCBMb29wICpMKSB7CisgICAgTEkuY2hhbmdlTG9vcEZvcihCQiwgTCk7CisgIH0KKworICAvLy8gY2hhbmdlVG9wTGV2ZWxMb29wIC0gUmVwbGFjZSB0aGUgc3BlY2lmaWVkIGxvb3AgaW4gdGhlIHRvcC1sZXZlbCBsb29wcworICAvLy8gbGlzdCB3aXRoIHRoZSBpbmRpY2F0ZWQgbG9vcC4KKyAgaW5saW5lIHZvaWQgY2hhbmdlVG9wTGV2ZWxMb29wKExvb3AgKk9sZExvb3AsIExvb3AgKk5ld0xvb3ApIHsKKyAgICBMSS5jaGFuZ2VUb3BMZXZlbExvb3AoT2xkTG9vcCwgTmV3TG9vcCk7CisgIH0KKworICAvLy8gYWRkVG9wTGV2ZWxMb29wIC0gVGhpcyBhZGRzIHRoZSBzcGVjaWZpZWQgbG9vcCB0byB0aGUgY29sbGVjdGlvbiBvZgorICAvLy8gdG9wLWxldmVsIGxvb3BzLgorICBpbmxpbmUgdm9pZCBhZGRUb3BMZXZlbExvb3AoTG9vcCAqTmV3KSB7CisgICAgTEkuYWRkVG9wTGV2ZWxMb29wKE5ldyk7CisgIH0KKworICAvLy8gcmVtb3ZlQmxvY2sgLSBUaGlzIG1ldGhvZCBjb21wbGV0ZWx5IHJlbW92ZXMgQkIgZnJvbSBhbGwgZGF0YSBzdHJ1Y3R1cmVzLAorICAvLy8gaW5jbHVkaW5nIGFsbCBvZiB0aGUgTG9vcCBvYmplY3RzIGl0IGlzIG5lc3RlZCBpbiBhbmQgb3VyIG1hcHBpbmcgZnJvbQorICAvLy8gQmFzaWNCbG9ja3MgdG8gbG9vcHMuCisgIHZvaWQgcmVtb3ZlQmxvY2soQmFzaWNCbG9jayAqQkIpIHsKKyAgICBMSS5yZW1vdmVCbG9jayhCQik7CisgIH0KK307CisKKworLy8gQWxsb3cgY2xpZW50cyB0byB3YWxrIHRoZSBsaXN0IG9mIG5lc3RlZCBsb29wcy4uLgordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IExvb3AqPiB7CisgIHR5cGVkZWYgY29uc3QgTG9vcCBOb2RlVHlwZTsKKyAgdHlwZWRlZiBMb29wSW5mbzo6aXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoY29uc3QgTG9vcCAqTCkgeyByZXR1cm4gTDsgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPmJlZ2luKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTi0+ZW5kKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxMb29wKj4geworICB0eXBlZGVmIExvb3AgTm9kZVR5cGU7CisgIHR5cGVkZWYgTG9vcEluZm86Oml0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKExvb3AgKkwpIHsgcmV0dXJuIEw7IH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBOLT5iZWdpbigpOworICB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPmVuZCgpOworICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgordm9pZAorTG9vcEJhc2U8QmxvY2tULCBMb29wVD46OmFkZEJhc2ljQmxvY2tUb0xvb3AoQmxvY2tUICpOZXdCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPiAmTElCKSB7CisgIGFzc2VydCgoQmxvY2tzLmVtcHR5KCkgfHwgTElCW2dldEhlYWRlcigpXSA9PSB0aGlzKSAmJgorICAgICAgICAgIkluY29ycmVjdCBMSSBzcGVjaWZpZWQgZm9yIHRoaXMgbG9vcCEiKTsKKyAgYXNzZXJ0KE5ld0JCICYmICJDYW5ub3QgYWRkIGEgbnVsbCBiYXNpYyBibG9jayB0byB0aGUgbG9vcCEiKTsKKyAgYXNzZXJ0KExJQltOZXdCQl0gPT0gMCAmJiAiQmFzaWNCbG9jayBhbHJlYWR5IGluIHRoZSBsb29wISIpOworCisgIExvb3BUICpMID0gc3RhdGljX2Nhc3Q8TG9vcFQgKj4odGhpcyk7CisKKyAgLy8gQWRkIHRoZSBsb29wIG1hcHBpbmcgdG8gdGhlIExvb3BJbmZvIG9iamVjdC4uLgorICBMSUIuQkJNYXBbTmV3QkJdID0gTDsKKworICAvLyBBZGQgdGhlIGJhc2ljIGJsb2NrIHRvIHRoaXMgbG9vcCBhbmQgYWxsIHBhcmVudCBsb29wcy4uLgorICB3aGlsZSAoTCkgeworICAgIEwtPkJsb2Nrcy5wdXNoX2JhY2soTmV3QkIpOworICAgIEwgPSBMLT5nZXRQYXJlbnRMb29wKCk7CisgIH0KK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wUGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTliOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaApAQCAtMCwwICsxLDE1OCBAQAorLy89PT0tIExvb3BQYXNzLmggLSBMb29wUGFzcyBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBMb29wUGFzcyBjbGFzcy4gQWxsIGxvb3Agb3B0aW1pemF0aW9uCisvLyBhbmQgdHJhbnNmb3JtYXRpb24gcGFzc2VzIGFyZSBkZXJpdmVkIGZyb20gTG9vcFBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xPT1BfUEFTU19ICisjZGVmaW5lIExMVk1fTE9PUF9QQVNTX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2Vycy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlIDxkZXF1ZT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMUFBhc3NNYW5hZ2VyOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBQTVN0YWNrOworCitjbGFzcyBMb29wUGFzcyA6IHB1YmxpYyBQYXNzIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTG9vcFBhc3MoY2hhciAmcGlkKSA6IFBhc3MoUFRfTG9vcCwgcGlkKSB7fQorCisgIC8vLyBnZXRQcmludGVyUGFzcyAtIEdldCBhIHBhc3MgdG8gcHJpbnQgdGhlIGZ1bmN0aW9uIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHRvIGEgTG9vcC4KKyAgUGFzcyAqY3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk8sIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0OworCisgIC8vIHJ1bk9uTG9vcCAtIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc3ViY2xhc3MgdG8gcGVyZm9ybQorICAvLyB3aGF0ZXZlciBhY3Rpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGUgc3BlY2lmaWVkIExvb3AuCisgIHZpcnR1YWwgYm9vbCBydW5Pbkxvb3AoTG9vcCAqTCwgTFBQYXNzTWFuYWdlciAmTFBNKSA9IDA7CisKKyAgLy8gSW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiBob29rcy4KKyAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oTG9vcCAqTCwgTFBQYXNzTWFuYWdlciAmTFBNKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRmluYWxpemF0aW9uIGhvb2sgZG9lcyBub3Qgc3VwcGx5IExvb3AgYmVjYXVzZSBhdCB0aGlzIHRpbWUKKyAgLy8gbG9vcCBuZXN0IGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50LgorICB2aXJ0dWFsIGJvb2wgZG9GaW5hbGl6YXRpb24oKSB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vIENoZWNrIGlmIHRoaXMgcGFzcyBpcyBzdWl0YWJsZSBmb3IgdGhlIGN1cnJlbnQgTFBQYXNzTWFuYWdlciwgaWYKKyAgLy8gYXZhaWxhYmxlLiBUaGlzIHBhc3MgUCBpcyBub3Qgc3VpdGFibGUgZm9yIGEgTFBQYXNzTWFuYWdlciBpZiBQCisgIC8vIGlzIG5vdCBwcmVzZXJ2aW5nIGhpZ2hlciBsZXZlbCBhbmFseXNpcyBpbmZvIHVzZWQgYnkgb3RoZXIKKyAgLy8gTFBQYXNzTWFuYWdlciBwYXNzZXMuIEluIHN1Y2ggY2FzZSwgcG9wIExQUGFzc01hbmFnZXIgZnJvbSB0aGUKKyAgLy8gc3RhY2suIFRoaXMgd2lsbCBmb3JjZSBhc3NpZ25QYXNzTWFuYWdlcigpIHRvIGNyZWF0ZSBuZXcKKyAgLy8gTFBQYXNzTWFuZ2VyIGFzIGV4cGVjdGVkLgorICB2b2lkIHByZXBhcmVQYXNzTWFuYWdlcihQTVN0YWNrICZQTVMpOworCisgIC8vLyBBc3NpZ24gcGFzcyBtYW5hZ2VyIHRvIG1hbmFnZSB0aGlzIHBhc3MKKyAgdmlydHVhbCB2b2lkIGFzc2lnblBhc3NNYW5hZ2VyKFBNU3RhY2sgJlBNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NNYW5hZ2VyVHlwZSBQTVQpOworCisgIC8vLyAgUmV0dXJuIHdoYXQga2luZCBvZiBQYXNzIE1hbmFnZXIgY2FuIG1hbmFnZSB0aGlzIHBhc3MuCisgIHZpcnR1YWwgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUE1UX0xvb3BQYXNzTWFuYWdlcjsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gU2ltcGxlQW5hbHlzaXMgLSBQcm92aWRlcyBzaW1wbGUgaW50ZXJmYWNlIHRvIHVwZGF0ZSBhbmFseXNpcyBpbmZvCisgIC8vLyBtYWludGFpbmVkIGJ5IHZhcmlvdXMgcGFzc2VzLiBOb3RlLCBpZiByZXF1aXJlZCB0aGlzIGludGVyZmFjZSBjYW4KKyAgLy8vIGJlIGV4dHJhY3RlZCBpbnRvIGEgc2VwYXJhdGUgYWJzdHJhY3QgY2xhc3MgYnV0IGl0IHdvdWxkIHJlcXVpcmUKKyAgLy8vIGFkZGl0aW9uYWwgdXNlIG9mIG11bHRpcGxlIGluaGVyaXRhbmNlIGluIFBhc3MgY2xhc3MgaGllcmFyY2h5LCBzb21ldGhpbmcKKyAgLy8vIHdlIGFyZSB0cnlpbmcgdG8gYXZvaWQuCisKKyAgLy8vIEVhY2ggbG9vcCBwYXNzIGNhbiBvdmVycmlkZSB0aGVzZSBzaW1wbGUgYW5hbHlzaXMgaG9va3MgdG8gdXBkYXRlCisgIC8vLyBkZXNpcmVkIGFuYWx5c2lzIGluZm9ybWF0aW9uLgorICAvLy8gY2xvbmVCYXNpY0Jsb2NrQW5hbHlzaXMgLSBDbG9uZSBhbmFseXNpcyBpbmZvIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBibG9jay4KKyAgdmlydHVhbCB2b2lkIGNsb25lQmFzaWNCbG9ja0FuYWx5c2lzKEJhc2ljQmxvY2sgKkYsIEJhc2ljQmxvY2sgKlQsIExvb3AgKkwpIHt9CisKKyAgLy8vIGRlbGV0ZUFuYWx5c2lzVmFsdWUgLSBEZWxldGUgYW5hbHlzaXMgaW5mbyBhc3NvY2lhdGVkIHdpdGggdmFsdWUgVi4KKyAgdmlydHVhbCB2b2lkIGRlbGV0ZUFuYWx5c2lzVmFsdWUoVmFsdWUgKlYsIExvb3AgKkwpIHt9Cit9OworCitjbGFzcyBMUFBhc3NNYW5hZ2VyIDogcHVibGljIEZ1bmN0aW9uUGFzcywgcHVibGljIFBNRGF0YU1hbmFnZXIgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgZXhwbGljaXQgTFBQYXNzTWFuYWdlcihpbnQgRGVwdGgpOworCisgIC8vLyBydW4gLSBFeGVjdXRlIGFsbCBvZiB0aGUgcGFzc2VzIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uLiAgS2VlcCB0cmFjayBvZgorICAvLy8gd2hldGhlciBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllcyB0aGUgbW9kdWxlLCBhbmQgaWYgc28sIHJldHVybiB0cnVlLgorICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworCisgIC8vLyBQYXNzIE1hbmFnZXIgaXRzZWxmIGRvZXMgbm90IGludmFsaWRhdGUgYW55IGFuYWx5c2lzIGluZm8uCisgIC8vIExQUGFzc01hbmFnZXIgbmVlZHMgTG9vcEluZm8uCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZJbmZvKSBjb25zdDsKKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiTG9vcCBQYXNzIE1hbmFnZXIiOworICB9CisKKyAgdmlydHVhbCBQTURhdGFNYW5hZ2VyICpnZXRBc1BNRGF0YU1hbmFnZXIoKSB7IHJldHVybiB0aGlzOyB9CisgIHZpcnR1YWwgUGFzcyAqZ2V0QXNQYXNzKCkgeyByZXR1cm4gdGhpczsgfQorCisgIC8vLyBQcmludCBwYXNzZXMgbWFuYWdlZCBieSB0aGlzIG1hbmFnZXIKKyAgdm9pZCBkdW1wUGFzc1N0cnVjdHVyZSh1bnNpZ25lZCBPZmZzZXQpOworCisgIFBhc3MgKmdldENvbnRhaW5lZFBhc3ModW5zaWduZWQgTikgeworICAgIGFzc2VydChOIDwgUGFzc1ZlY3Rvci5zaXplKCkgJiYgIlBhc3MgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICBQYXNzICpGUCA9IHN0YXRpY19jYXN0PFBhc3MgKj4oUGFzc1ZlY3RvcltOXSk7CisgICAgcmV0dXJuIEZQOworICB9CisKKyAgdmlydHVhbCBQYXNzTWFuYWdlclR5cGUgZ2V0UGFzc01hbmFnZXJUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBQTVRfTG9vcFBhc3NNYW5hZ2VyOworICB9CisKK3B1YmxpYzoKKyAgLy8gRGVsZXRlIGxvb3AgZnJvbSB0aGUgbG9vcCBxdWV1ZSBhbmQgbG9vcCBuZXN0IChMb29wSW5mbykuCisgIHZvaWQgZGVsZXRlTG9vcEZyb21RdWV1ZShMb29wICpMKTsKKworICAvLyBJbnNlcnQgbG9vcCBpbnRvIHRoZSBsb29wIHF1ZXVlIGFuZCBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGUKKyAgLy8gZ2l2ZW4gcGFyZW50LgorICB2b2lkIGluc2VydExvb3AoTG9vcCAqTCwgTG9vcCAqUGFyZW50TG9vcCk7CisKKyAgLy8gSW5zZXJ0IGEgbG9vcCBpbnRvIHRoZSBsb29wIHF1ZXVlLgorICB2b2lkIGluc2VydExvb3BJbnRvUXVldWUoTG9vcCAqTCk7CisKKyAgLy8gUmVvcHRpbWl6ZSB0aGlzIGxvb3AuIExQUGFzc01hbmFnZXIgd2lsbCByZS1pbnNlcnQgdGhpcyBsb29wIGludG8gdGhlCisgIC8vIHF1ZXVlLiBUaGlzIGFsbG93cyBMb29wUGFzcyB0byBjaGFuZ2UgbG9vcCBuZXN0IGZvciB0aGUgbG9vcC4gVGhpcworICAvLyB1dGlsaXR5IG1heSBzZW5kIExQUGFzc01hbmFnZXIgaW50byBpbmZpbml0ZSBsb29wcyBzbyB1c2UgY2F1dGlvbi4KKyAgdm9pZCByZWRvTG9vcChMb29wICpMKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNpbXBsZUFuYWx5c2lzIC0gUHJvdmlkZXMgc2ltcGxlIGludGVyZmFjZSB0byB1cGRhdGUgYW5hbHlzaXMgaW5mbworICAvLy8gbWFpbnRhaW5lZCBieSB2YXJpb3VzIHBhc3Nlcy4gTm90ZSwgaWYgcmVxdWlyZWQgdGhpcyBpbnRlcmZhY2UgY2FuCisgIC8vLyBiZSBleHRyYWN0ZWQgaW50byBhIHNlcGFyYXRlIGFic3RyYWN0IGNsYXNzIGJ1dCBpdCB3b3VsZCByZXF1aXJlCisgIC8vLyBhZGRpdGlvbmFsIHVzZSBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZSBpbiBQYXNzIGNsYXNzIGhpZXJhcmNoeSwgc29tZXRoaW5nCisgIC8vLyB3ZSBhcmUgdHJ5aW5nIHRvIGF2b2lkLgorCisgIC8vLyBjbG9uZUJhc2ljQmxvY2tTaW1wbGVBbmFseXNpcyAtIEludm9rZSBjbG9uZUJhc2ljQmxvY2tBbmFseXNpcyBob29rIGZvcgorICAvLy8gYWxsIHBhc3NlcyB0aGF0IGltcGxlbWVudCBzaW1wbGUgYW5hbHlzaXMgaW50ZXJmYWNlLgorICB2b2lkIGNsb25lQmFzaWNCbG9ja1NpbXBsZUFuYWx5c2lzKEJhc2ljQmxvY2sgKkZyb20sIEJhc2ljQmxvY2sgKlRvLCBMb29wICpMKTsKKworICAvLy8gZGVsZXRlU2ltcGxlQW5hbHlzaXNWYWx1ZSAtIEludm9rZSBkZWxldGVBbmFseXNpc1ZhbHVlIGhvb2sgZm9yIGFsbCBwYXNzZXMKKyAgLy8vIHRoYXQgaW1wbGVtZW50IHNpbXBsZSBhbmFseXNpcyBpbnRlcmZhY2UuCisgIHZvaWQgZGVsZXRlU2ltcGxlQW5hbHlzaXNWYWx1ZShWYWx1ZSAqViwgTG9vcCAqTCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6ZGVxdWU8TG9vcCAqPiBMUTsKKyAgYm9vbCBza2lwVGhpc0xvb3A7CisgIGJvb2wgcmVkb1RoaXNMb29wOworICBMb29wSW5mbyAqTEk7CisgIExvb3AgKkN1cnJlbnRMb29wOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhYWIwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMuaApAQCAtMCwwICsxLDM0OSBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmggLSBNZW1vcnkgRGVwcyAgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzIGFuYWx5c2lzIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX01FTU9SWV9ERVBFTkRFTkNFX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19NRU1PUllfREVQRU5ERU5DRV9ICisKKyNpbmNsdWRlICJsbHZtL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBGdW5jdGlvbjsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgY2xhc3MgQ2FsbFNpdGU7CisgIGNsYXNzIEFsaWFzQW5hbHlzaXM7CisgIGNsYXNzIFRhcmdldERhdGE7CisgIGNsYXNzIE1lbW9yeURlcGVuZGVuY2VBbmFseXNpczsKKyAgY2xhc3MgUHJlZEl0ZXJhdG9yQ2FjaGU7CisgIGNsYXNzIERvbWluYXRvclRyZWU7CisgIGNsYXNzIFBISVRyYW5zQWRkcjsKKyAgCisgIC8vLyBNZW1EZXBSZXN1bHQgLSBBIG1lbW9yeSBkZXBlbmRlbmNlIHF1ZXJ5IGNhbiByZXR1cm4gb25lIG9mIHRocmVlIGRpZmZlcmVudAorICAvLy8gYW5zd2VycywgZGVzY3JpYmVkIGJlbG93LgorICBjbGFzcyBNZW1EZXBSZXN1bHQgeworICAgIGVudW0gRGVwVHlwZSB7CisgICAgICAvLy8gSW52YWxpZCAtIENsaWVudHMgb2YgTWVtRGVwIG5ldmVyIHNlZSB0aGlzLgorICAgICAgSW52YWxpZCA9IDAsCisgICAgICAKKyAgICAgIC8vLyBDbG9iYmVyIC0gVGhpcyBpcyBhIGRlcGVuZGVuY2Ugb24gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiB3aGljaAorICAgICAgLy8vIGNsb2JiZXJzIHRoZSBkZXNpcmVkIHZhbHVlLiAgVGhlIHBvaW50ZXIgbWVtYmVyIG9mIHRoZSBNZW1EZXBSZXN1bHQKKyAgICAgIC8vLyBwYWlyIGhvbGRzIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGNsb2JiZXJzIHRoZSBtZW1vcnkuICBGb3IgZXhhbXBsZSwKKyAgICAgIC8vLyB0aGlzIG9jY3VycyB3aGVuIHdlIHNlZSBhIG1heS1hbGlhc2VkIHN0b3JlIHRvIHRoZSBtZW1vcnkgbG9jYXRpb24gd2UKKyAgICAgIC8vLyBjYXJlIGFib3V0LgorICAgICAgQ2xvYmJlciwKKworICAgICAgLy8vIERlZiAtIFRoaXMgaXMgYSBkZXBlbmRlbmNlIG9uIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gd2hpY2gKKyAgICAgIC8vLyBkZWZpbmVzL3Byb2R1Y2VzIHRoZSBkZXNpcmVkIG1lbW9yeSBsb2NhdGlvbi4gIFRoZSBwb2ludGVyIG1lbWJlciBvZgorICAgICAgLy8vIHRoZSBNZW1EZXBSZXN1bHQgcGFpciBob2xkcyB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBtZW1vcnkuCisgICAgICAvLy8gQ2FzZXMgb2YgaW50ZXJlc3Q6CisgICAgICAvLy8gICAxLiBUaGlzIGNvdWxkIGJlIGEgbG9hZCBvciBzdG9yZSBmb3IgZGVwZW5kZW5jZSBxdWVyaWVzIG9uCisgICAgICAvLy8gICAgICBsb2FkL3N0b3JlLiAgVGhlIHZhbHVlIGxvYWRlZCBvciBzdG9yZWQgaXMgdGhlIHByb2R1Y2VkIHZhbHVlLgorICAgICAgLy8vICAgICAgTm90ZSB0aGF0IHRoZSBwb2ludGVyIG9wZXJhbmQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoYXQgb2YgdGhlCisgICAgICAvLy8gICAgICBxdWVyaWVkIHBvaW50ZXIgZHVlIHRvIG11c3QgYWxpYXNlcyBhbmQgcGhpIHRyYW5zbGF0aW9uLiAgTm90ZQorICAgICAgLy8vICAgICAgdGhhdCB0aGUgZGVmIG1heSBub3QgYmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUgcXVlcnksIHRoZSBwb2ludGVycworICAgICAgLy8vICAgICAgbWF5IGp1c3QgYmUgbXVzdCBhbGlhc2VzLgorICAgICAgLy8vICAgMi4gRm9yIGxvYWRzIGFuZCBzdG9yZXMsIHRoaXMgY291bGQgYmUgYW4gYWxsb2NhdGlvbiBpbnN0cnVjdGlvbi4gSW4KKyAgICAgIC8vLyAgICAgIHRoaXMgY2FzZSwgdGhlIGxvYWQgaXMgbG9hZGluZyBhbiB1bmRlZiB2YWx1ZSBvciBhIHN0b3JlIGlzIHRoZQorICAgICAgLy8vICAgICAgZmlyc3Qgc3RvcmUgdG8gKHRoYXQgcGFydCBvZikgdGhlIGFsbG9jYXRpb24uCisgICAgICAvLy8gICAzLiBEZXBlbmRlbmNlIHF1ZXJpZXMgb24gY2FsbHMgcmV0dXJuIERlZiBvbmx5IHdoZW4gdGhleSBhcmUKKyAgICAgIC8vLyAgICAgIHJlYWRvbmx5IGNhbGxzIG9yIG1lbW9yeSB1c2UgaW50cmluc2ljcyB3aXRoIGlkZW50aWNhbCBjYWxsZWVzCisgICAgICAvLy8gICAgICBhbmQgbm8gaW50ZXJ2ZW5pbmcgY2xvYmJlcnMuICBObyB2YWxpZGF0aW9uIGlzIGRvbmUgdGhhdCB0aGUKKyAgICAgIC8vLyAgICAgIG9wZXJhbmRzIHRvIHRoZSBjYWxscyBhcmUgdGhlIHNhbWUuCisgICAgICBEZWYsCisgICAgICAKKyAgICAgIC8vLyBOb25Mb2NhbCAtIFRoaXMgbWFya2VyIGluZGljYXRlcyB0aGF0IHRoZSBxdWVyeSBoYXMgbm8gZGVwZW5kZW5jeSBpbgorICAgICAgLy8vIHRoZSBzcGVjaWZpZWQgYmxvY2suICBUbyBmaW5kIG91dCBtb3JlLCB0aGUgY2xpZW50IHNob3VsZCBxdWVyeSBvdGhlcgorICAgICAgLy8vIHByZWRlY2Vzc29yIGJsb2Nrcy4KKyAgICAgIE5vbkxvY2FsCisgICAgfTsKKyAgICB0eXBlZGVmIFBvaW50ZXJJbnRQYWlyPEluc3RydWN0aW9uKiwgMiwgRGVwVHlwZT4gUGFpclR5OworICAgIFBhaXJUeSBWYWx1ZTsKKyAgICBleHBsaWNpdCBNZW1EZXBSZXN1bHQoUGFpclR5IFYpIDogVmFsdWUoVikge30KKyAgcHVibGljOgorICAgIE1lbURlcFJlc3VsdCgpIDogVmFsdWUoMCwgSW52YWxpZCkge30KKyAgICAKKyAgICAvLy8gZ2V0IG1ldGhvZHM6IFRoZXNlIGFyZSBzdGF0aWMgY3RvciBtZXRob2RzIGZvciBjcmVhdGluZyB2YXJpb3VzCisgICAgLy8vIE1lbURlcFJlc3VsdCBraW5kcy4KKyAgICBzdGF0aWMgTWVtRGVwUmVzdWx0IGdldERlZihJbnN0cnVjdGlvbiAqSW5zdCkgeworICAgICAgcmV0dXJuIE1lbURlcFJlc3VsdChQYWlyVHkoSW5zdCwgRGVmKSk7CisgICAgfQorICAgIHN0YXRpYyBNZW1EZXBSZXN1bHQgZ2V0Q2xvYmJlcihJbnN0cnVjdGlvbiAqSW5zdCkgeworICAgICAgcmV0dXJuIE1lbURlcFJlc3VsdChQYWlyVHkoSW5zdCwgQ2xvYmJlcikpOworICAgIH0KKyAgICBzdGF0aWMgTWVtRGVwUmVzdWx0IGdldE5vbkxvY2FsKCkgeworICAgICAgcmV0dXJuIE1lbURlcFJlc3VsdChQYWlyVHkoMCwgTm9uTG9jYWwpKTsKKyAgICB9CisKKyAgICAvLy8gaXNDbG9iYmVyIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBNZW1EZXBSZXN1bHQgcmVwcmVzZW50cyBhIHF1ZXJ5IHRoYXQgaXMKKyAgICAvLy8gYSBpbnN0cnVjdGlvbiBjbG9iYmVyIGRlcGVuZGVuY3kuCisgICAgYm9vbCBpc0Nsb2JiZXIoKSBjb25zdCB7IHJldHVybiBWYWx1ZS5nZXRJbnQoKSA9PSBDbG9iYmVyOyB9CisKKyAgICAvLy8gaXNEZWYgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1lbURlcFJlc3VsdCByZXByZXNlbnRzIGEgcXVlcnkgdGhhdCBpcworICAgIC8vLyBhIGluc3RydWN0aW9uIGRlZmluaXRpb24gZGVwZW5kZW5jeS4KKyAgICBib29sIGlzRGVmKCkgY29uc3QgeyByZXR1cm4gVmFsdWUuZ2V0SW50KCkgPT0gRGVmOyB9CisgICAgCisgICAgLy8vIGlzTm9uTG9jYWwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1lbURlcFJlc3VsdCByZXByZXNlbnRzIGEgcXVlcnkgdGhhdAorICAgIC8vLyBpcyB0cmFuc3BhcmVudCB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrLCBidXQgd2hlcmUgYSBub24tbG9jYWwgaGFzbid0CisgICAgLy8vIGJlZW4gZG9uZS4KKyAgICBib29sIGlzTm9uTG9jYWwoKSBjb25zdCB7IHJldHVybiBWYWx1ZS5nZXRJbnQoKSA9PSBOb25Mb2NhbDsgfQorICAgIAorICAgIC8vLyBnZXRJbnN0KCkgLSBJZiB0aGlzIGlzIGEgbm9ybWFsIGRlcGVuZGVuY3ksIHJldHVybiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdAorICAgIC8vLyBpcyBkZXBlbmRlZCBvbi4gIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuCisgICAgSW5zdHJ1Y3Rpb24gKmdldEluc3QoKSBjb25zdCB7IHJldHVybiBWYWx1ZS5nZXRQb2ludGVyKCk7IH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWVtRGVwUmVzdWx0ICZNKSBjb25zdCB7IHJldHVybiBWYWx1ZSA9PSBNLlZhbHVlOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1lbURlcFJlc3VsdCAmTSkgY29uc3QgeyByZXR1cm4gVmFsdWUgIT0gTS5WYWx1ZTsgfQorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE1lbURlcFJlc3VsdCAmTSkgY29uc3QgeyByZXR1cm4gVmFsdWUgPCBNLlZhbHVlOyB9CisgICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgTWVtRGVwUmVzdWx0ICZNKSBjb25zdCB7IHJldHVybiBWYWx1ZSA+IE0uVmFsdWU7IH0KKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzOworICAgIC8vLyBEaXJ0eSAtIEVudHJpZXMgd2l0aCB0aGlzIG1hcmtlciBvY2N1ciBpbiBhIExvY2FsRGVwcyBtYXAgb3IKKyAgICAvLy8gTm9uTG9jYWxEZXBzIG1hcCB3aGVuIHRoZSBpbnN0cnVjdGlvbiB0aGV5IHByZXZpb3VzbHkgcmVmZXJlbmNlZCB3YXMKKyAgICAvLy8gcmVtb3ZlZCBmcm9tIE1lbURlcC4gIEluIGVpdGhlciBjYXNlLCB0aGUgZW50cnkgbWF5IGluY2x1ZGUgYW4KKyAgICAvLy8gaW5zdHJ1Y3Rpb24gcG9pbnRlci4gIElmIHNvLCB0aGUgcG9pbnRlciBpcyBhbiBpbnN0cnVjdGlvbiBpbiB0aGUKKyAgICAvLy8gYmxvY2sgd2hlcmUgc2Nhbm5pbmcgY2FuIHN0YXJ0IGZyb20sIHNhdmluZyBzb21lIHdvcmsuCisgICAgLy8vCisgICAgLy8vIEluIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBNZW1EZXBSZXN1bHQgb2JqZWN0LCB0aGUgdHlwZSB3aWxsIGJlIERpcnR5CisgICAgLy8vIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB3aWxsIGJlIG51bGwuCisgICAgLy8vCisgICAgICAgICAKKyAgICAvLy8gaXNEaXJ0eSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBNZW1EZXBSZXN1bHQgaW4gaXRzIGRpcnR5L2ludmFsaWQuCisgICAgLy8vIHN0YXRlLgorICAgIGJvb2wgaXNEaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLmdldEludCgpID09IEludmFsaWQ7IH0KKyAgICAKKyAgICBzdGF0aWMgTWVtRGVwUmVzdWx0IGdldERpcnR5KEluc3RydWN0aW9uICpJbnN0KSB7CisgICAgICByZXR1cm4gTWVtRGVwUmVzdWx0KFBhaXJUeShJbnN0LCBJbnZhbGlkKSk7CisgICAgfQorICB9OworCisgIC8vLyBOb25Mb2NhbERlcFJlc3VsdCAtIFRoaXMgaXMgYSByZXN1bHQgZnJvbSBhIE5vbkxvY2FsIGRlcGVuZGVuY2UgcXVlcnkuCisgIC8vLyBGb3IgZWFjaCBCYXNpY0Jsb2NrICh0aGUgQkIgZW50cnkpIGl0IGtlZXBzIGEgTWVtRGVwUmVzdWx0IGFuZCB0aGUKKyAgLy8vIChwb3RlbnRpYWxseSBwaGkgdHJhbnNsYXRlZCkgYWRkcmVzcyB0aGF0IHdhcyBsaXZlIGluIHRoZSBibG9jay4KKyAgY2xhc3MgTm9uTG9jYWxEZXBSZXN1bHQgeworICAgIEJhc2ljQmxvY2sgKkJCOworICAgIE1lbURlcFJlc3VsdCBSZXN1bHQ7CisgICAgVmFsdWUgKkFkZHJlc3M7CisgIHB1YmxpYzoKKyAgICBOb25Mb2NhbERlcFJlc3VsdChCYXNpY0Jsb2NrICpiYiwgTWVtRGVwUmVzdWx0IHJlc3VsdCwgVmFsdWUgKmFkZHJlc3MpCisgICAgICA6IEJCKGJiKSwgUmVzdWx0KHJlc3VsdCksIEFkZHJlc3MoYWRkcmVzcykge30KKyAgICAKKyAgICAvLyBCQiBpcyB0aGUgc29ydCBrZXksIGl0IGNhbid0IGJlIGNoYW5nZWQuCisgICAgQmFzaWNCbG9jayAqZ2V0QkIoKSBjb25zdCB7IHJldHVybiBCQjsgfQorICAgIAorICAgIHZvaWQgc2V0UmVzdWx0KGNvbnN0IE1lbURlcFJlc3VsdCAmUiwgVmFsdWUgKkFkZHIpIHsKKyAgICAgIFJlc3VsdCA9IFI7CisgICAgICBBZGRyZXNzID0gQWRkcjsKKyAgICB9CisgICAgCisgICAgY29uc3QgTWVtRGVwUmVzdWx0ICZnZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiBSZXN1bHQ7IH0KKyAgICAKKyAgICAvLy8gZ2V0QWRkcmVzcyAtIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGlzIHBvaW50ZXIgaW4gdGhpcyBibG9jay4gIFRoaXMgY2FuCisgICAgLy8vIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBhZGRyZXNzIHF1ZXJpZWQgZm9yIHRoZSBub24tbG9jYWwgcmVzdWx0IGJlY2F1c2UKKyAgICAvLy8gb2YgcGhpIHRyYW5zbGF0aW9uLiAgVGhpcyByZXR1cm5zIG51bGwgaWYgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhdmFpbGFibGUKKyAgICAvLy8gaW4gYSBibG9jayAoaS5lLiBiZWNhdXNlIHBoaSB0cmFuc2xhdGlvbiBmYWlsZWQpIG9yIGlmIHRoaXMgaXMgYSBjYWNoZWQKKyAgICAvLy8gcmVzdWx0IGFuZCB0aGF0IGFkZHJlc3Mgd2FzIGRlbGV0ZWQuCisgICAgLy8vCisgICAgLy8vIFRoZSBhZGRyZXNzIGlzIGFsd2F5cyBudWxsIGZvciBhIG5vbi1sb2NhbCAnY2FsbCcgZGVwZW5kZW5jZS4KKyAgICBWYWx1ZSAqZ2V0QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEFkZHJlc3M7IH0KKyAgfTsKKyAgCisgIC8vLyBOb25Mb2NhbERlcEVudHJ5IC0gVGhpcyBpcyBhbiBlbnRyeSBpbiB0aGUgTm9uTG9jYWxEZXBJbmZvIGNhY2hlLiAgRm9yCisgIC8vLyBlYWNoIEJhc2ljQmxvY2sgKHRoZSBCQiBlbnRyeSkgaXQga2VlcHMgYSBNZW1EZXBSZXN1bHQuCisgIGNsYXNzIE5vbkxvY2FsRGVwRW50cnkgeworICAgIEJhc2ljQmxvY2sgKkJCOworICAgIE1lbURlcFJlc3VsdCBSZXN1bHQ7CisgIHB1YmxpYzoKKyAgICBOb25Mb2NhbERlcEVudHJ5KEJhc2ljQmxvY2sgKmJiLCBNZW1EZXBSZXN1bHQgcmVzdWx0KQorICAgICAgOiBCQihiYiksIFJlc3VsdChyZXN1bHQpIHt9CisKKyAgICAvLyBUaGlzIGlzIHVzZWQgZm9yIHNlYXJjaGVzLgorICAgIE5vbkxvY2FsRGVwRW50cnkoQmFzaWNCbG9jayAqYmIpIDogQkIoYmIpIHt9CisKKyAgICAvLyBCQiBpcyB0aGUgc29ydCBrZXksIGl0IGNhbid0IGJlIGNoYW5nZWQuCisgICAgQmFzaWNCbG9jayAqZ2V0QkIoKSBjb25zdCB7IHJldHVybiBCQjsgfQorICAgIAorICAgIHZvaWQgc2V0UmVzdWx0KGNvbnN0IE1lbURlcFJlc3VsdCAmUikgeyBSZXN1bHQgPSBSOyB9CisKKyAgICBjb25zdCBNZW1EZXBSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIFJlc3VsdDsgfQorICAgIAorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE5vbkxvY2FsRGVwRW50cnkgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIEJCIDwgUkhTLkJCOworICAgIH0KKyAgfTsKKyAgCisgIC8vLyBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMgLSBUaGlzIGlzIGFuIGFuYWx5c2lzIHRoYXQgZGV0ZXJtaW5lcywgZm9yIGEKKyAgLy8vIGdpdmVuIG1lbW9yeSBvcGVyYXRpb24sIHdoYXQgcHJlY2VkaW5nIG1lbW9yeSBvcGVyYXRpb25zIGl0IGRlcGVuZHMgb24uCisgIC8vLyBJdCBidWlsZHMgb24gYWxpYXMgYW5hbHlzaXMgaW5mb3JtYXRpb24sIGFuZCB0cmllcyB0byBwcm92aWRlIGEgbGF6eSwKKyAgLy8vIGNhY2hpbmcgaW50ZXJmYWNlIHRvIGEgY29tbW9uIGtpbmQgb2YgYWxpYXMgaW5mb3JtYXRpb24gcXVlcnkuCisgIC8vLworICAvLy8gVGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gcmV0dXJuZWQgaXMgc29tZXdoYXQgdW51c3VhbCwgYnV0IGlzIHByYWdtYXRpYy4KKyAgLy8vIElmIHF1ZXJpZWQgYWJvdXQgYSBzdG9yZSBvciBjYWxsIHRoYXQgbWlnaHQgbW9kaWZ5IG1lbW9yeSwgdGhlIGFuYWx5c2lzCisgIC8vLyB3aWxsIHJldHVybiB0aGUgaW5zdHJ1Y3Rpb25bc10gdGhhdCBtYXkgZWl0aGVyIGxvYWQgZnJvbSB0aGF0IG1lbW9yeSBvcgorICAvLy8gc3RvcmUgdG8gaXQuICBJZiBxdWVyaWVkIHdpdGggYSBsb2FkIG9yIGNhbGwgdGhhdCBjYW4gbmV2ZXIgbW9kaWZ5IG1lbW9yeSwKKyAgLy8vIHRoZSBhbmFseXNpcyB3aWxsIHJldHVybiBjYWxscyBhbmQgc3RvcmVzIHRoYXQgbWlnaHQgbW9kaWZ5IHRoZSBwb2ludGVyLAorICAvLy8gYnV0IGdlbmVyYWxseSBkb2VzIG5vdCByZXR1cm4gbG9hZHMgdW5sZXNzIGEpIHRoZXkgYXJlIHZvbGF0aWxlLCBvcgorICAvLy8gYikgdGhleSBsb2FkIGZyb20gKm11c3QtYWxpYXNlZCogcG9pbnRlcnMuICBSZXR1cm5pbmcgYSBkZXBlbmRlbmNlIG9uCisgIC8vLyBtdXN0LWFsaWFzJ2QgcG9pbnRlcnMgaW5zdGVhZCBvZiBhbGwgcG9pbnRlcnMgaW50ZXJhY3RzIHdlbGwgd2l0aCB0aGUKKyAgLy8vIGludGVybmFsIGNhY2hpbmcgbWVjaGFuaXNtLgorICAvLy8KKyAgY2xhc3MgTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgICAgLy8gQSBtYXAgZnJvbSBpbnN0cnVjdGlvbnMgdG8gdGhlaXIgZGVwZW5kZW5jeS4KKyAgICB0eXBlZGVmIERlbnNlTWFwPEluc3RydWN0aW9uKiwgTWVtRGVwUmVzdWx0PiBMb2NhbERlcE1hcFR5cGU7CisgICAgTG9jYWxEZXBNYXBUeXBlIExvY2FsRGVwczsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxOb25Mb2NhbERlcEVudHJ5PiBOb25Mb2NhbERlcEluZm87CisgIHByaXZhdGU6CisgICAgLy8vIFZhbHVlSXNMb2FkUGFpciAtIFRoaXMgaXMgYSBwYWlyPFZhbHVlKiwgYm9vbD4gd2hlcmUgdGhlIGJvb2wgaXMgdHJ1ZSBpZgorICAgIC8vLyB0aGUgZGVwZW5kZW5jZSBpcyBhIHJlYWQgb25seSBkZXBlbmRlbmNlLCBmYWxzZSBpZiByZWFkL3dyaXRlLgorICAgIHR5cGVkZWYgUG9pbnRlckludFBhaXI8VmFsdWUqLCAxLCBib29sPiBWYWx1ZUlzTG9hZFBhaXI7CisKKyAgICAvLy8gQkJTa2lwRmlyc3RCbG9ja1BhaXIgLSBUaGlzIHBhaXIgaXMgdXNlZCB3aGVuIGNhY2hpbmcgaW5mb3JtYXRpb24gZm9yIGEKKyAgICAvLy8gYmxvY2suICBJZiB0aGUgcG9pbnRlciBpcyBudWxsLCB0aGUgY2FjaGUgdmFsdWUgaXMgbm90IGEgZnVsbCBxdWVyeSB0aGF0CisgICAgLy8vIHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIGJsb2NrLiAgSWYgbm9uLW51bGwsIHRoZSBib29sIGluZGljYXRlcyB3aGV0aGVyCisgICAgLy8vIG9yIG5vdCB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIHdhcyBza2lwcGVkLgorICAgIHR5cGVkZWYgUG9pbnRlckludFBhaXI8QmFzaWNCbG9jayosIDEsIGJvb2w+IEJCU2tpcEZpcnN0QmxvY2tQYWlyOworCisgICAgLy8vIENhY2hlZE5vbkxvY2FsUG9pbnRlckluZm8gLSBUaGlzIG1hcCBzdG9yZXMgdGhlIGNhY2hlZCByZXN1bHRzIG9mIGRvaW5nCisgICAgLy8vIGEgcG9pbnRlciBsb29rdXAgYXQgdGhlIGJvdHRvbSBvZiBhIGJsb2NrLiAgVGhlIGtleSBvZiB0aGlzIG1hcCBpcyB0aGUKKyAgICAvLy8gcG9pbnRlcitpc2xvYWQgYml0LCB0aGUgdmFsdWUgaXMgYSBsaXN0IG9mIDxiYi0+cmVzdWx0PiBtYXBwaW5ncy4KKyAgICB0eXBlZGVmIERlbnNlTWFwPFZhbHVlSXNMb2FkUGFpciwgc3RkOjpwYWlyPEJCU2tpcEZpcnN0QmxvY2tQYWlyLCAKKyAgICAgICAgICAgICAgICAgIE5vbkxvY2FsRGVwSW5mbz4gPiBDYWNoZWROb25Mb2NhbFBvaW50ZXJJbmZvOworICAgIENhY2hlZE5vbkxvY2FsUG9pbnRlckluZm8gTm9uTG9jYWxQb2ludGVyRGVwczsKKworICAgIC8vIEEgbWFwIGZyb20gaW5zdHJ1Y3Rpb25zIHRvIHRoZWlyIG5vbi1sb2NhbCBwb2ludGVyIGRlcGVuZGVuY2llcy4KKyAgICB0eXBlZGVmIERlbnNlTWFwPEluc3RydWN0aW9uKiwgCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxWYWx1ZUlzTG9hZFBhaXIsIDQ+ID4gUmV2ZXJzZU5vbkxvY2FsUHRyRGVwVHk7CisgICAgUmV2ZXJzZU5vbkxvY2FsUHRyRGVwVHkgUmV2ZXJzZU5vbkxvY2FsUHRyRGVwczsKKworICAgIAorICAgIC8vLyBQZXJJbnN0TkxJbmZvIC0gVGhpcyBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2Uga2VlcCBmb3IgZWFjaCBjYWNoZWQgYWNjZXNzCisgICAgLy8vIHRoYXQgd2UgaGF2ZSBmb3IgYW4gaW5zdHJ1Y3Rpb24uICBUaGUgcG9pbnRlciBpcyBhbiBvd25pbmcgcG9pbnRlciBhbmQKKyAgICAvLy8gdGhlIGJvb2wgaW5kaWNhdGVzIHdoZXRoZXIgd2UgaGF2ZSBhbnkgZGlydHkgYml0cyBpbiB0aGUgc2V0LgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPE5vbkxvY2FsRGVwSW5mbywgYm9vbD4gUGVySW5zdE5MSW5mbzsKKyAgICAKKyAgICAvLyBBIG1hcCBmcm9tIGluc3RydWN0aW9ucyB0byB0aGVpciBub24tbG9jYWwgZGVwZW5kZW5jaWVzLgorICAgIHR5cGVkZWYgRGVuc2VNYXA8SW5zdHJ1Y3Rpb24qLCBQZXJJbnN0TkxJbmZvPiBOb25Mb2NhbERlcE1hcFR5cGU7CisgICAgICAKKyAgICBOb25Mb2NhbERlcE1hcFR5cGUgTm9uTG9jYWxEZXBzOworICAgIAorICAgIC8vIEEgcmV2ZXJzZSBtYXBwaW5nIGZyb20gZGVwZW5kZW5jaWVzIHRvIHRoZSBkZXBlbmRlZXMuICBUaGlzIGlzCisgICAgLy8gdXNlZCB3aGVuIHJlbW92aW5nIGluc3RydWN0aW9ucyB0byBrZWVwIHRoZSBjYWNoZSBjb2hlcmVudC4KKyAgICB0eXBlZGVmIERlbnNlTWFwPEluc3RydWN0aW9uKiwKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uKiwgND4gPiBSZXZlcnNlRGVwTWFwVHlwZTsKKyAgICBSZXZlcnNlRGVwTWFwVHlwZSBSZXZlcnNlTG9jYWxEZXBzOworICAgIAorICAgIC8vIEEgcmV2ZXJzZSBtYXBwaW5nIGZyb20gZGVwZW5kZW5jaWVzIHRvIHRoZSBub24tbG9jYWwgZGVwZW5kZWVzLgorICAgIFJldmVyc2VEZXBNYXBUeXBlIFJldmVyc2VOb25Mb2NhbERlcHM7CisgICAgCisgICAgLy8vIEN1cnJlbnQgQUEgaW1wbGVtZW50YXRpb24sIGp1c3QgYSBjYWNoZS4KKyAgICBBbGlhc0FuYWx5c2lzICpBQTsKKyAgICBUYXJnZXREYXRhICpURDsKKyAgICBPd25pbmdQdHI8UHJlZEl0ZXJhdG9yQ2FjaGU+IFByZWRDYWNoZTsKKyAgcHVibGljOgorICAgIE1lbW9yeURlcGVuZGVuY2VBbmFseXNpcygpOworICAgIH5NZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMoKTsKKyAgICBzdGF0aWMgY2hhciBJRDsKKworICAgIC8vLyBQYXNzIEltcGxlbWVudGF0aW9uIHN0dWZmLiAgVGhpcyBkb2Vzbid0IGRvIGFueSBhbmFseXNpcyBlYWdlcmx5LgorICAgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmKTsKKyAgICAKKyAgICAvLy8gQ2xlYW4gdXAgbWVtb3J5IGluIGJldHdlZW4gcnVucworICAgIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworICAgIAorICAgIC8vLyBnZXRBbmFseXNpc1VzYWdlIC0gRG9lcyBub3QgbW9kaWZ5IGFueXRoaW5nLiAgSXQgdXNlcyBWYWx1ZSBOdW1iZXJpbmcKKyAgICAvLy8gYW5kIEFsaWFzIEFuYWx5c2lzLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKyAgICAKKyAgICAvLy8gZ2V0RGVwZW5kZW5jeSAtIFJldHVybiB0aGUgaW5zdHJ1Y3Rpb24gb24gd2hpY2ggYSBtZW1vcnkgb3BlcmF0aW9uCisgICAgLy8vIGRlcGVuZHMuICBTZWUgdGhlIGNsYXNzIGNvbW1lbnQgZm9yIG1vcmUgZGV0YWlscy4gIEl0IGlzIGlsbGVnYWwgdG8gY2FsbAorICAgIC8vLyB0aGlzIG9uIG5vbi1tZW1vcnkgaW5zdHJ1Y3Rpb25zLgorICAgIE1lbURlcFJlc3VsdCBnZXREZXBlbmRlbmN5KEluc3RydWN0aW9uICpRdWVyeUluc3QpOworCisgICAgLy8vIGdldE5vbkxvY2FsQ2FsbERlcGVuZGVuY3kgLSBQZXJmb3JtIGEgZnVsbCBkZXBlbmRlbmN5IHF1ZXJ5IGZvciB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGNhbGwsIHJldHVybmluZyB0aGUgc2V0IG9mIGJsb2NrcyB0aGF0IHRoZSB2YWx1ZSBpcworICAgIC8vLyBwb3RlbnRpYWxseSBsaXZlIGFjcm9zcy4gIFRoZSByZXR1cm5lZCBzZXQgb2YgcmVzdWx0cyB3aWxsIGluY2x1ZGUgYQorICAgIC8vLyAiTm9uTG9jYWwiIHJlc3VsdCBmb3IgYWxsIGJsb2NrcyB3aGVyZSB0aGUgdmFsdWUgaXMgbGl2ZSBhY3Jvc3MuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIGluc3RydWN0aW9uIHJldHVybnMgYSAiTm9uTG9jYWwiIGRlcGVuZGVuY3kKKyAgICAvLy8gd2l0aGluIGl0cyBvd24gYmxvY2suCisgICAgLy8vCisgICAgLy8vIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB0aGF0IG1heSBiZQorICAgIC8vLyBpbnZhbGlkYXRlZCBvbiB0aGUgbmV4dCBub24tbG9jYWwgcXVlcnkgb3Igd2hlbiBhbiBpbnN0cnVjdGlvbiBpcworICAgIC8vLyByZW1vdmVkLiAgQ2xpZW50cyBtdXN0IGNvcHkgdGhpcyBkYXRhIGlmIHRoZXkgd2FudCBpdCBhcm91bmQgbG9uZ2VyIHRoYW4KKyAgICAvLy8gdGhhdC4KKyAgICBjb25zdCBOb25Mb2NhbERlcEluZm8gJmdldE5vbkxvY2FsQ2FsbERlcGVuZGVuY3koQ2FsbFNpdGUgUXVlcnlDUyk7CisgICAgCisgICAgCisgICAgLy8vIGdldE5vbkxvY2FsUG9pbnRlckRlcGVuZGVuY3kgLSBQZXJmb3JtIGEgZnVsbCBkZXBlbmRlbmN5IHF1ZXJ5IGZvciBhbgorICAgIC8vLyBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCAobm9uLXZvbGF0aWxlKSBtZW1vcnkgbG9jYXRpb24sIHJldHVybmluZyB0aGUKKyAgICAvLy8gc2V0IG9mIGluc3RydWN0aW9ucyB0aGF0IGVpdGhlciBkZWZpbmUgb3IgY2xvYmJlciB0aGUgdmFsdWUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIHBvaW50ZXIgaGFzIGEgIk5vbkxvY2FsIiBkZXBlbmRlbmN5IHdpdGhpbiBCQi4KKyAgICB2b2lkIGdldE5vbkxvY2FsUG9pbnRlckRlcGVuZGVuY3koVmFsdWUgKlBvaW50ZXIsIGJvb2wgaXNMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxOb25Mb2NhbERlcFJlc3VsdD4gJlJlc3VsdCk7CisgICAgCisgICAgLy8vIHJlbW92ZUluc3RydWN0aW9uIC0gUmVtb3ZlIGFuIGluc3RydWN0aW9uIGZyb20gdGhlIGRlcGVuZGVuY2UgYW5hbHlzaXMsCisgICAgLy8vIHVwZGF0aW5nIHRoZSBkZXBlbmRlbmNlIG9mIGluc3RydWN0aW9ucyB0aGF0IHByZXZpb3VzbHkgZGVwZW5kZWQgb24gaXQuCisgICAgdm9pZCByZW1vdmVJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSW5zdFRvUmVtb3ZlKTsKKyAgICAKKyAgICAvLy8gaW52YWxpZGF0ZUNhY2hlZFBvaW50ZXJJbmZvIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbnZhbGlkYXRlIGNhY2hlZAorICAgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIsIGJlY2F1c2UgaXQgbWF5IGJlIHRvbworICAgIC8vLyBjb25zZXJ2YXRpdmUgaW4gbWVtZGVwLiAgVGhpcyBpcyBhbiBvcHRpb25hbCBjYWxsIHRoYXQgY2FuIGJlIHVzZWQgd2hlbgorICAgIC8vLyB0aGUgY2xpZW50IGRldGVjdHMgYW4gZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgcG9pbnRlciBhbmQgc29tZSBvdGhlcgorICAgIC8vLyB2YWx1ZSBhbmQgcmVwbGFjZXMgdGhlIG90aGVyIHZhbHVlIHdpdGggcHRyLiBUaGlzIGNhbiBtYWtlIFB0ciBhdmFpbGFibGUKKyAgICAvLy8gaW4gbW9yZSBwbGFjZXMgdGhhdCBjYWNoZWQgaW5mbyBkb2VzIG5vdCBuZWNlc3NhcmlseSBrZWVwLgorICAgIHZvaWQgaW52YWxpZGF0ZUNhY2hlZFBvaW50ZXJJbmZvKFZhbHVlICpQdHIpOworCisgICAgLy8vIGludmFsaWRhdGVDYWNoZWRQcmVkZWNlc3NvcnMgLSBDbGVhciB0aGUgUHJlZEl0ZXJhdG9yQ2FjaGUgaW5mby4KKyAgICAvLy8gVGhpcyBuZWVkcyB0byBiZSBkb25lIHdoZW4gdGhlIENGRyBjaGFuZ2VzLCBlLmcuLCBkdWUgdG8gc3BsaXR0aW5nCisgICAgLy8vIGNyaXRpY2FsIGVkZ2VzLgorICAgIHZvaWQgaW52YWxpZGF0ZUNhY2hlZFByZWRlY2Vzc29ycygpOworICAgIAorICBwcml2YXRlOgorICAgIE1lbURlcFJlc3VsdCBnZXRQb2ludGVyRGVwZW5kZW5jeUZyb20oVmFsdWUgKlBvaW50ZXIsIHVpbnQ2NF90IE1lbVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTG9hZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTY2FuSXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQik7CisgICAgTWVtRGVwUmVzdWx0IGdldENhbGxTaXRlRGVwZW5kZW5jeUZyb20oQ2FsbFNpdGUgQywgYm9vbCBpc1JlYWRPbmx5Q2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTY2FuSXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqQkIpOworICAgIGJvb2wgZ2V0Tm9uTG9jYWxQb2ludGVyRGVwRnJvbUJCKGNvbnN0IFBISVRyYW5zQWRkciAmUG9pbnRlciwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTG9hZCwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE5vbkxvY2FsRGVwUmVzdWx0PiAmUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPEJhc2ljQmxvY2sqLCBWYWx1ZSo+ICZWaXNpdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2tpcEZpcnN0QmxvY2sgPSBmYWxzZSk7CisgICAgTWVtRGVwUmVzdWx0IEdldE5vbkxvY2FsSW5mb0ZvckJsb2NrKFZhbHVlICpQb2ludGVyLCB1aW50NjRfdCBQb2ludGVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0xvYWQsIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25Mb2NhbERlcEluZm8gKkNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Tb3J0ZWRFbnRyaWVzKTsKKworICAgIHZvaWQgUmVtb3ZlQ2FjaGVkTm9uTG9jYWxQb2ludGVyRGVwZW5kZW5jaWVzKFZhbHVlSXNMb2FkUGFpciBQKTsKKyAgICAKKyAgICAvLy8gdmVyaWZ5UmVtb3ZlZCAtIFZlcmlmeSB0aGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gZG9lcyBub3Qgb2NjdXIKKyAgICAvLy8gaW4gb3VyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KKyAgICB2b2lkIHZlcmlmeVJlbW92ZWQoSW5zdHJ1Y3Rpb24gKkluc3QpIGNvbnN0OworICAgIAorICB9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9QSElUcmFuc0FkZHIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9QSElUcmFuc0FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzNlZmJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1BISVRyYW5zQWRkci5oCkBAIC0wLDAgKzEsMTE3IEBACisvLz09PS0gUEhJVHJhbnNBZGRyLmggLSBQSEkgVHJhbnNsYXRpb24gZm9yIEFkZHJlc3NlcyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgUEhJVHJhbnNBZGRyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19QSElUUkFOU0FERFJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1BISVRSQU5TQUREUl9ICisKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBEb21pbmF0b3JUcmVlOworICBjbGFzcyBUYXJnZXREYXRhOworICAKKy8vLyBQSElUcmFuc0FkZHIgLSBBbiBhZGRyZXNzIHZhbHVlIHdoaWNoIHRyYWNrcyBhbmQgaGFuZGxlcyBwaGkgdHJhbnNsYXRpb24uCisvLy8gQXMgd2Ugd2FsayAidXAiIHRoZSBDRkcgdGhyb3VnaCBwcmVkZWNlc3NvcnMsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlCisvLy8gYWRkcmVzcyB3ZSdyZSB0cmFja2luZyBpcyBrZXB0IHVwIHRvIGRhdGUuICBGb3IgZXhhbXBsZSwgaWYgd2UncmUgYW5hbHl6aW5nCisvLy8gYW4gYWRkcmVzcyBvZiAiJkFbaV0iIGFuZCB3YWxrIHRocm91Z2ggdGhlIGRlZmluaXRpb24gb2YgJ2knIHdoaWNoIGlzIGEgUEhJCisvLy8gbm9kZSwgd2UgKm11c3QqIHBoaSB0cmFuc2xhdGUgaSB0byBnZXQgIiZBW2pdIiBvciBlbHNlIHdlIHdpbGwgYW5hbHl6ZSBhbgorLy8vIGluY29ycmVjdCBwb2ludGVyIGluIHRoZSBwcmVkZWNlc3NvciBibG9jay4KKy8vLworLy8vIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgYSByZWxhdGl2ZWx5IHNtYWxsIG9iamVjdCB0aGF0IGxpdmVzIG9uIHRoZSBzdGFjayBhbmQKKy8vLyBpcyBjb3B5YWJsZS4KKy8vLworY2xhc3MgUEhJVHJhbnNBZGRyIHsKKyAgLy8vIEFkZHIgLSBUaGUgYWN0dWFsIGFkZHJlc3Mgd2UncmUgYW5hbHl6aW5nLgorICBWYWx1ZSAqQWRkcjsKKyAgCisgIC8vLyBURCAtIFRoZSB0YXJnZXQgZGF0YSB3ZSBhcmUgcGxheWluZyB3aXRoIGlmIGtub3duLCBvdGhlcndpc2UgbnVsbC4KKyAgY29uc3QgVGFyZ2V0RGF0YSAqVEQ7CisgIAorICAvLy8gSW5zdElucHV0cyAtIFRoZSBpbnB1dHMgZm9yIG91ciBzeW1ib2xpYyBhZGRyZXNzLgorICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiosIDQ+IEluc3RJbnB1dHM7CitwdWJsaWM6CisgIFBISVRyYW5zQWRkcihWYWx1ZSAqYWRkciwgY29uc3QgVGFyZ2V0RGF0YSAqdGQpIDogQWRkcihhZGRyKSwgVEQodGQpIHsKKyAgICAvLyBJZiB0aGUgYWRkcmVzcyBpcyBhbiBpbnN0cnVjdGlvbiwgdGhlIHdob2xlIHRoaW5nIGlzIGNvbnNpZGVyZWQgYW4gaW5wdXQuCisgICAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KEFkZHIpKQorICAgICAgSW5zdElucHV0cy5wdXNoX2JhY2soSSk7CisgIH0KKyAgCisgIFZhbHVlICpnZXRBZGRyKCkgY29uc3QgeyByZXR1cm4gQWRkcjsgfQorICAKKyAgLy8vIE5lZWRzUEhJVHJhbnNsYXRpb25Gcm9tQmxvY2sgLSBSZXR1cm4gdHJ1ZSBpZiBtb3ZpbmcgZnJvbSB0aGUgc3BlY2lmaWVkCisgIC8vLyBCYXNpY0Jsb2NrIHRvIGl0cyBwcmVkZWNlc3NvcnMgcmVxdWlyZXMgUEhJIHRyYW5zbGF0aW9uLgorICBib29sIE5lZWRzUEhJVHJhbnNsYXRpb25Gcm9tQmxvY2soQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICAvLyBXZSBkbyBuZWVkIHRyYW5zbGF0aW9uIGlmIG9uZSBvZiBvdXIgaW5wdXQgaW5zdHJ1Y3Rpb25zIGlzIGRlZmluZWQgaW4KKyAgICAvLyB0aGlzIGJsb2NrLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbnN0SW5wdXRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoSW5zdElucHV0c1tpXS0+Z2V0UGFyZW50KCkgPT0gQkIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgLy8vIElzUG90ZW50aWFsbHlQSElUcmFuc2xhdGFibGUgLSBJZiB0aGlzIG5lZWRzIFBISSB0cmFuc2xhdGlvbiwgcmV0dXJuIHRydWUKKyAgLy8vIGlmIHdlIGhhdmUgc29tZSBob3BlIG9mIGRvaW5nIGl0LiAgVGhpcyBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlciB0bworICAvLy8gYXZvaWQgY2FsbGluZyBQSElUcmFuc2xhdGVWYWx1ZSBpbiBob3BlbGVzcyBzaXR1YXRpb25zLgorICBib29sIElzUG90ZW50aWFsbHlQSElUcmFuc2xhdGFibGUoKSBjb25zdDsKKyAgCisgIC8vLyBQSElUcmFuc2xhdGVWYWx1ZSAtIFBISSB0cmFuc2xhdGUgdGhlIGN1cnJlbnQgYWRkcmVzcyB1cCB0aGUgQ0ZHIGZyb20KKyAgLy8vIEN1ckJCIHRvIFByZWQsIHVwZGF0aW5nIG91ciBzdGF0ZSB0byByZWZsZWN0IGFueSBuZWVkZWQgY2hhbmdlcy4gIElmIHRoZQorICAvLy8gZG9taW5hdG9yIHRyZWUgRFQgaXMgbm9uLW51bGwsIHRoZSB0cmFuc2xhdGVkIHZhbHVlIG11c3QgZG9taW5hdGUKKyAgLy8vIFByZWRCQi4gIFRoaXMgcmV0dXJucyB0cnVlIG9uIGZhaWx1cmUgYW5kIHNldHMgQWRkciB0byBudWxsLgorICBib29sIFBISVRyYW5zbGF0ZVZhbHVlKEJhc2ljQmxvY2sgKkN1ckJCLCBCYXNpY0Jsb2NrICpQcmVkQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQpOworICAKKyAgLy8vIFBISVRyYW5zbGF0ZVdpdGhJbnNlcnRpb24gLSBQSEkgdHJhbnNsYXRlIHRoaXMgdmFsdWUgaW50byB0aGUgc3BlY2lmaWVkCisgIC8vLyBwcmVkZWNlc3NvciBibG9jaywgaW5zZXJ0aW5nIGEgY29tcHV0YXRpb24gb2YgdGhlIHZhbHVlIGlmIGl0IGlzCisgIC8vLyB1bmF2YWlsYWJsZS4KKyAgLy8vCisgIC8vLyBBbGwgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBOZXdJbnN0cyBsaXN0LiAgVGhpcworICAvLy8gcmV0dXJucyBudWxsIG9uIGZhaWx1cmUuCisgIC8vLworICBWYWx1ZSAqUEhJVHJhbnNsYXRlV2l0aEluc2VydGlvbihCYXNpY0Jsb2NrICpDdXJCQiwgQmFzaWNCbG9jayAqUHJlZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uKj4gJk5ld0luc3RzKTsKKyAgCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICAKKyAgLy8vIFZlcmlmeSAtIENoZWNrIGludGVybmFsIGNvbnNpc3RlbmN5IG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuICBJZiB0aGUKKyAgLy8vIHN0cnVjdHVyZSBpcyB2YWxpZCwgaXQgcmV0dXJucyB0cnVlLiAgSWYgaW52YWxpZCwgaXQgcHJpbnRzIGVycm9ycyBhbmQKKyAgLy8vIHJldHVybnMgZmFsc2UuCisgIGJvb2wgVmVyaWZ5KCkgY29uc3Q7Citwcml2YXRlOgorICBWYWx1ZSAqUEhJVHJhbnNsYXRlU3ViRXhwcihWYWx1ZSAqViwgQmFzaWNCbG9jayAqQ3VyQkIsIEJhc2ljQmxvY2sgKlByZWRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQpOworICAKKyAgLy8vIEluc2VydFBISVRyYW5zbGF0ZWRTdWJFeHByIC0gSW5zZXJ0IGEgY29tcHV0YXRpb24gb2YgdGhlIFBISSB0cmFuc2xhdGVkCisgIC8vLyB2ZXJzaW9uIG9mICdWJyBmb3IgdGhlIGVkZ2UgUHJlZEJCLT5DdXJCQiBpbnRvIHRoZSBlbmQgb2YgdGhlIFByZWRCQgorICAvLy8gYmxvY2suICBBbGwgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBOZXdJbnN0cyBsaXN0LgorICAvLy8gVGhpcyByZXR1cm5zIG51bGwgb24gZmFpbHVyZS4KKyAgLy8vCisgIFZhbHVlICpJbnNlcnRQSElUcmFuc2xhdGVkU3ViRXhwcihWYWx1ZSAqSW5WYWwsIEJhc2ljQmxvY2sgKkN1ckJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqUHJlZEJCLCBjb25zdCBEb21pbmF0b3JUcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbio+ICZOZXdJbnN0cyk7CisgIAorICAvLy8gQWRkQXNJbnB1dCAtIElmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gaW5zdHJ1Y3Rpb24sIGFkZCBpdCBhcyBhbiBpbnB1dC4KKyAgVmFsdWUgKkFkZEFzSW5wdXQoVmFsdWUgKlYpIHsKKyAgICAvLyBJZiBWIGlzIGFuIGluc3RydWN0aW9uLCBpdCBpcyBub3cgYW4gaW5wdXQuCisgICAgaWYgKEluc3RydWN0aW9uICpWSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkKKyAgICAgIEluc3RJbnB1dHMucHVzaF9iYWNrKFZJKTsKKyAgICByZXR1cm4gVjsKKyAgfQorICAKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDI1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUGFzc2VzLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8vPT09LS0gbGx2bS9BbmFseXNpcy9QYXNzZXMuaCAtIENvbnN0cnVjdG9ycyBmb3IgYW5hbHlzZXMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHByb3RvdHlwZXMgZm9yIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IGV4cG9zZSBwYXNzZXMKKy8vIGluIHRoZSBhbmFseXNpcyBsaWJyYXJpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1BBU1NFU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUEFTU0VTX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBGdW5jdGlvblBhc3M7CisgIGNsYXNzIEltbXV0YWJsZVBhc3M7CisgIGNsYXNzIExvb3BQYXNzOworICBjbGFzcyBNb2R1bGVQYXNzOworICBjbGFzcyBQYXNzOworICBjbGFzcyBQYXNzSW5mbzsKKyAgY2xhc3MgTGliQ2FsbEluZm87CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZUdsb2JhbHNNb2RSZWZQYXNzIC0gVGhpcyBwYXNzIHByb3ZpZGVzIGFsaWFzIGFuZCBtb2QvcmVmIGluZm8gZm9yCisgIC8vIGdsb2JhbCB2YWx1ZXMgdGhhdCBkbyBub3QgaGF2ZSB0aGVpciBhZGRyZXNzZXMgdGFrZW4uCisgIC8vCisgIFBhc3MgKmNyZWF0ZUdsb2JhbHNNb2RSZWZQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZUFsaWFzRGVidWdnZXIgLSBUaGlzIHBhc3MgaGVscHMgZGVidWcgY2xpZW50cyBvZiBBQQorICAvLworICBQYXNzICpjcmVhdGVBbGlhc0RlYnVnZ2VyKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZUFsaWFzQW5hbHlzaXNDb3VudGVyUGFzcyAtIFRoaXMgcGFzcyBjb3VudHMgYWxpYXMgcXVlcmllcyBhbmQgaG93IHRoZQorICAvLyBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbiByZXNwb25kcy4KKyAgLy8KKyAgTW9kdWxlUGFzcyAqY3JlYXRlQWxpYXNBbmFseXNpc0NvdW50ZXJQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZUFBRXZhbFBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSBOXjIgYWxpYXMgYW5hbHlzaXMKKyAgLy8gYWNjdXJhY3kgZXZhbHVhdG9yLgorICAvLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUFBRXZhbFBhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlTm9BQVBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyBhICJJIGRvbid0IGtub3ciIGFsaWFzIGFuYWx5c2lzLgorICAvLworICBJbW11dGFibGVQYXNzICpjcmVhdGVOb0FBUGFzcygpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBjcmVhdGVCYXNpY0FsaWFzQW5hbHlzaXNQYXNzIC0gVGhpcyBwYXNzIGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYWxpYXMKKyAgLy8gYW5hbHlzaXMuCisgIC8vCisgIEltbXV0YWJsZVBhc3MgKmNyZWF0ZUJhc2ljQWxpYXNBbmFseXNpc1Bhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8vIGNyZWF0ZUxpYkNhbGxBbGlhc0FuYWx5c2lzUGFzcyAtIENyZWF0ZSBhbiBhbGlhcyBhbmFseXNpcyBwYXNzIHRoYXQga25vd3MKKyAgLy8vIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgYSBzZXQgb2YgbGliY2FsbHMgc3BlY2lmaWVkIGJ5IExDSS4gIFRoZSBuZXdseQorICAvLy8gY29uc3RydWN0ZWQgcGFzcyB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIgdGhhdCBpcyBwcm92aWRlZC4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlTGliQ2FsbEFsaWFzQW5hbHlzaXNQYXNzKExpYkNhbGxJbmZvICpMQ0kpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBjcmVhdGVTY2FsYXJFdm9sdXRpb25BbGlhc0FuYWx5c2lzUGFzcyAtIFRoaXMgcGFzcyBpbXBsZW1lbnRzIGEgc2ltcGxlCisgIC8vIGFsaWFzIGFuYWx5c2lzIHVzaW5nIFNjYWxhckV2b2x1dGlvbiBxdWVyaWVzLgorICAvLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVNjYWxhckV2b2x1dGlvbkFsaWFzQW5hbHlzaXNQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZVR5cGVCYXNlZEFsaWFzQW5hbHlzaXNQYXNzIC0gVGhpcyBwYXNzIGltcGxlbWVudHMgbWV0YWRhdGEtYmFzZWQKKyAgLy8gdHlwZS1iYXNlZCBhbGlhcyBhbmFseXNpcy4KKyAgLy8KKyAgSW1tdXRhYmxlUGFzcyAqY3JlYXRlVHlwZUJhc2VkQWxpYXNBbmFseXNpc1Bhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlUHJvZmlsZUxvYWRlclBhc3MgLSBUaGlzIHBhc3MgbG9hZHMgaW5mb3JtYXRpb24gZnJvbSBhIHByb2ZpbGUgZHVtcAorICAvLyBmaWxlLgorICAvLworICBNb2R1bGVQYXNzICpjcmVhdGVQcm9maWxlTG9hZGVyUGFzcygpOworICBleHRlcm4gY2hhciAmUHJvZmlsZUxvYWRlclBhc3NJRDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlTm9Qcm9maWxlSW5mb1Bhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCAibm8gcHJvZmlsZSIuCisgIC8vCisgIEltbXV0YWJsZVBhc3MgKmNyZWF0ZU5vUHJvZmlsZUluZm9QYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZVByb2ZpbGVFc3RpbWF0b3JQYXNzIC0gVGhpcyBwYXNzIGVzdGltYXRlcyBwcm9maWxpbmcgaW5mb3JtYXRpb24KKyAgLy8gaW5zdGVhZCBvZiBsb2FkaW5nIGl0IGZyb20gYSBwcmV2aW91cyBydW4uCisgIC8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUHJvZmlsZUVzdGltYXRvclBhc3MoKTsKKyAgZXh0ZXJuIGNoYXIgJlByb2ZpbGVFc3RpbWF0b3JQYXNzSUQ7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZVByb2ZpbGVWZXJpZmllclBhc3MgLSBUaGlzIHBhc3MgdmVyaWZpZXMgcHJvZmlsaW5nIGluZm9ybWF0aW9uLgorICAvLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVByb2ZpbGVWZXJpZmllclBhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlRFNBQVBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyBzaW1wbGUgY29udGV4dCBzZW5zaXRpdmUgYWxpYXMKKyAgLy8gYW5hbHlzaXMuCisgIC8vCisgIE1vZHVsZVBhc3MgKmNyZWF0ZURTQUFQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZURTT3B0UGFzcyAtIFRoaXMgcGFzcyB1c2VzIERTQSB0byBkbyBhIHNlcmllcyBvZiBzaW1wbGUKKyAgLy8gb3B0aW1pemF0aW9ucy4KKyAgLy8KKyAgTW9kdWxlUGFzcyAqY3JlYXRlRFNPcHRQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZVN0ZWVuc2dhYXJkUGFzcyAtIFRoaXMgcGFzcyB1c2VzIHRoZSBkYXRhIHN0cnVjdHVyZSBncmFwaHMgdG8gZG8gYQorICAvLyBzaW1wbGUgY29udGV4dCBpbnNlbnNpdGl2ZSBhbGlhcyBhbmFseXNpcy4KKyAgLy8KKyAgTW9kdWxlUGFzcyAqY3JlYXRlU3RlZW5zZ2FhcmRQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZUxpdmVWYWx1ZXNQYXNzIC0gVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBMaXZlVmFsdWVzIHBhc3MuCisgIC8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlTGl2ZVZhbHVlc1Bhc3MoKTsKKyAgCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLy8gY3JlYXRlTGF6eVZhbHVlSW5mb1Bhc3MgLSBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIExhenlWYWx1ZUluZm8KKyAgLy8vIHBhc3MuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlTGF6eVZhbHVlSW5mb1Bhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlTG9vcERlcGVuZGVuY2VBbmFseXNpc1Bhc3MgLSBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlCisgIC8vIExvb3BEZXBlbmRlbmNlQW5hbHlzaXMgcGFzcy4KKyAgLy8KKyAgTG9vcFBhc3MgKmNyZWF0ZUxvb3BEZXBlbmRlbmNlQW5hbHlzaXNQYXNzKCk7CisgIAorICAvLyBNaW5vciBwYXNzIHByb3RvdHlwZXMsIGFsbG93aW5nIHVzIHRvIGV4cG9zZSB0aGVtIHRocm91Z2ggYnVncG9pbnQgYW5kCisgIC8vIGFuYWx5emUuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlSW5zdENvdW50UGFzcygpOworCisgIC8vIHByaW50IGRlYnVnIGluZm8gaW50cmluc2ljcyBpbiBodW1hbiByZWFkYWJsZSBmb3JtCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRGJnSW5mb1ByaW50ZXJQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZVJlZ2lvbkluZm9QYXNzIC0gVGhpcyBwYXNzIGZpbmRzIGFsbCBzaW5nbGUgZW50cnkgc2luZ2xlIGV4aXQgcmVnaW9ucworICAvLyBpbiBhIGZ1bmN0aW9uIGFuZCBidWlsZHMgdGhlIHJlZ2lvbiBoaWVyYXJjaHkuCisgIC8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUmVnaW9uSW5mb1Bhc3MoKTsKKworICAvLyBQcmludCBtb2R1bGUtbGV2ZWwgZGVidWcgaW5mbyBtZXRhZGF0YSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICBNb2R1bGVQYXNzICpjcmVhdGVNb2R1bGVEZWJ1Z0luZm9QcmludGVyUGFzcygpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qb2ludGVyVHJhY2tpbmcuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qb2ludGVyVHJhY2tpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQ5ZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1BvaW50ZXJUcmFja2luZy5oCkBAIC0wLDAgKzEsMTMyIEBACisvLz09PS0gUG9pbnRlclRyYWNraW5nLmggLSBQb2ludGVyIEJvdW5kcyBUcmFja2luZyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRyYWNraW5nIG9mIHBvaW50ZXIgYm91bmRzLgorLy8gSXQga25vd3MgdGhhdCB0aGUgbGliYyBmdW5jdGlvbnMgImNhbGxvYyIgYW5kICJyZWFsbG9jIiBhbGxvY2F0ZSBtZW1vcnksIHRodXMKKy8vIHlvdSBzaG91bGQgYXZvaWQgdXNpbmcgdGhpcyBwYXNzIGlmIHRoZXkgbWVhbiBzb21ldGhpbmcgZWxzZSBmb3IgeW91cgorLy8gbGFuZ3VhZ2UuCisvLworLy8gQWxsIG1ldGhvZHMgYXNzdW1lIHRoYXQgdGhlIHBvaW50ZXIgaXMgbm90IE5VTEwsIGlmIGl0IGlzIHRoZW4gdGhlIHJldHVybmVkCisvLyBhbGxvY2F0aW9uIHNpemUgaXMgd3JvbmcsIGFuZCB0aGUgcmVzdWx0IGZyb20gY2hlY2tMaW1pdHMgaXMgd3JvbmcgdG9vLgorLy8gSXQgYWxzbyBhc3N1bWVzIHRoYXQgcG9pbnRlcnMgYXJlIHZhbGlkLCBhbmQgdGhhdCBpdCBpcyBub3QgYW5hbHl6aW5nIGEKKy8vIHVzZS1hZnRlci1mcmVlIHNjZW5hcmlvLgorLy8gRHVlIHRvIHRoZXNlIGxpbWl0YXRpb25zIHRoZSAic2l6ZSIgcmV0dXJuZWQgYnkgdGhlc2UgbWV0aG9kcyBzaG91bGQgYmUKKy8vIGNvbnNpZGVyZWQgYXMgZWl0aGVyIDAgb3IgdGhlIHJldHVybmVkIHNpemUuCisvLworLy8gQW5vdGhlciBhbmFseXNpcyBwYXNzIHNob3VsZCBiZSB1c2VkIHRvIGZpbmQgdXNlLWFmdGVyLWZyZWUvTlVMTCBkZXJlZmVyZW5jZQorLy8gYnVncy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUE9JTlRFUlRSQUNLSU5HX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19QT0lOVEVSVFJBQ0tJTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QcmVkSXRlcmF0b3JDYWNoZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIERvbWluYXRvclRyZWU7CisgIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKyAgY2xhc3MgU0NFVjsKKyAgY2xhc3MgTG9vcDsKKyAgY2xhc3MgTG9vcEluZm87CisgIGNsYXNzIFRhcmdldERhdGE7CisKKyAgLy8gUmVzdWx0IGZyb20gc29sdmVyLCBhc3N1bWluZyBwb2ludGVyIGlzIG5vdCBOVUxMLAorICAvLyBhbmQgaXQgaXMgbm90IGEgdXNlLWFmdGVyLWZyZWUgc2l0dWF0aW9uLgorICBlbnVtIFNvbHZlclJlc3VsdCB7CisgICAgQWx3YXlzRmFsc2UsLy8gYWx3YXlzIGZhbHNlIHdpdGggYWJvdmUgY29uc3RyYWludHMKKyAgICBBbHdheXNUcnVlLC8vIGFsd2F5cyB0cnVlIHdpdGggYWJvdmUgY29uc3RyYWludHMKKyAgICBVbmtub3duIC8vIGl0IGNhbiBzb21ldGltZXMgYmUgdHJ1ZSwgc29tZXRpbWVzIGZhbHNlLCBvciBpdCBpcyB1bmRlY2lkZWQKKyAgfTsKKworICBjbGFzcyBQb2ludGVyVHJhY2tpbmcgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkaWNhdGU7CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgUG9pbnRlclRyYWNraW5nKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJk0pOworCisgICAgLy8gSWYgdGhpcyBwb2ludGVyIGRpcmVjdGx5IHBvaW50cyB0byBhbiBhbGxvY2F0aW9uLCByZXR1cm4KKyAgICAvLyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHR5cGUgVHkgYWxsb2NhdGVkLgorICAgIC8vIE90aGVyd2lzZSByZXR1cm4gQ291bGROb3RDb21wdXRlLgorICAgIC8vIFNpbmNlIGFsbG9jYXRpb25zIGNhbiBmYWlsIGJ5IHJldHVybmluZyBOVUxMLCB0aGUgcmVhbCBlbGVtZW50IGNvdW50CisgICAgLy8gZm9yIGV2ZXJ5IGFsbG9jYXRpb24gaXMgZWl0aGVyIDAgb3IgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgICAgY29uc3QgU0NFViAqZ2V0QWxsb2NhdGlvbkVsZW1lbnRDb3VudChWYWx1ZSAqUCkgY29uc3Q7CisKKyAgICAvLyBTYW1lIGFzIGdldEFsbG9jYXRpb25TaXplKCkgYnV0IHJldHVybnMgc2l6ZSBpbiBieXRlcy4KKyAgICAvLyBXZSBjb25zaWRlciBvbmUgYnl0ZSBhcyA4IGJpdHMuCisgICAgY29uc3QgU0NFViAqZ2V0QWxsb2NhdGlvblNpemVJbkJ5dGVzKFZhbHVlICpWKSBjb25zdDsKKworICAgIC8vIEdpdmVuIGEgUG9pbnRlciwgZGV0ZXJtaW5lIGEgYmFzZSBwb2ludGVyIG9mIGtub3duIHNpemUsIGFuZCBhbiBvZmZzZXQKKyAgICAvLyB0aGVyZWZyb20uCisgICAgLy8gV2hlbiB1bmFibGUgdG8gZGV0ZXJtaW5lLCBzZXRzIEJhc2UgdG8gTlVMTCwgYW5kIExpbWl0L09mZnNldCB0bworICAgIC8vIENvdWxkTm90Q29tcHV0ZS4KKyAgICAvLyBCYXNlU2l6ZSwgYW5kIE9mZnNldCBhcmUgaW4gYnl0ZXM6IFBvaW50ZXIgPT0gQmFzZSArIE9mZnNldAorICAgIHZvaWQgZ2V0UG9pbnRlck9mZnNldChWYWx1ZSAqUG9pbnRlciwgVmFsdWUgKiZCYXNlLCBjb25zdCBTQ0VWIComIEJhc2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComT2Zmc2V0KSBjb25zdDsKKworICAgIC8vIENvbXBhcmVzIHRoZSAyIHNjYWxhciBldm9sdXRpb24gZXhwcmVzc2lvbnMgYWNjb3JkaW5nIHRvIHByZWRpY2F0ZSwKKyAgICAvLyBhbmQgaWYgaXQgY2FuIHByb3ZlIHRoYXQgdGhlIHJlc3VsdCBpcyBhbHdheXMgdHJ1ZSBvciBhbHdheXMgZmFsc2UKKyAgICAvLyByZXR1cm4gQWx3YXlzVHJ1ZS9BbHdheXNGYWxzZS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgVW5rbm93bi4KKyAgICBlbnVtIFNvbHZlclJlc3VsdCBjb21wYXJlU0NFVihjb25zdCBTQ0VWICpBLCBQcmVkaWNhdGUgUHJlZCwgY29uc3QgU0NFViAqQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMKTsKKworICAgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgY29uZGl0aW9uIExIUyA8UHJlZD4gUkhTIGlzIHN1ZmZpY2llbnQKKyAgICAvLyBmb3IgdGhlIGNvbmRpdGlvbiBBIDxQcmVkPiBCIHRvIGhvbGQuCisgICAgLy8gQ3VycmVudGx5IG9ubHkgVUxUL1VMRSBpcyBzdXBwb3J0ZWQuCisgICAgLy8gVGhpcyBlcnJzIG9uIHRoZSBzaWRlIG9mIHJldHVybmluZyBmYWxzZS4KKyAgICBib29sIGNvbmRpdGlvblN1ZmZpY2llbnQoY29uc3QgU0NFViAqTEhTLCBQcmVkaWNhdGUgUHJlZDEsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqQSwgUHJlZGljYXRlIFByZWQyLCBjb25zdCBTQ0VWICpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMKTsKKworICAgIC8vIERldGVybWluZXMgd2hldGhlciBPZmZzZXQgaXMga25vd24gdG8gYmUgYWx3YXlzIGluIFswLCBMaW1pdCkgYm91bmRzLgorICAgIC8vIFRoaXMgZXJycyBvbiB0aGUgc2lkZSBvZiByZXR1cm5pbmcgVW5rbm93bi4KKyAgICBlbnVtIFNvbHZlclJlc3VsdCBjaGVja0xpbWl0cyhjb25zdCBTQ0VWICpPZmZzZXQsIGNvbnN0IFNDRVYgKkxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCKTsKKworICAgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Q7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSogPSAwKSBjb25zdDsKKyAgICBWYWx1ZSAqY29tcHV0ZUFsbG9jYXRpb25Db3VudFZhbHVlKFZhbHVlICpQLCBjb25zdCBUeXBlIComVHkpIGNvbnN0OworICBwcml2YXRlOgorICAgIEZ1bmN0aW9uICpGRjsKKyAgICBUYXJnZXREYXRhICpURDsKKyAgICBTY2FsYXJFdm9sdXRpb24gKlNFOworICAgIExvb3BJbmZvICpMSTsKKyAgICBEb21pbmF0b3JUcmVlICpEVDsKKworICAgIEZ1bmN0aW9uICpjYWxsb2NGdW5jOworICAgIEZ1bmN0aW9uICpyZWFsbG9jRnVuYzsKKyAgICBQcmVkSXRlcmF0b3JDYWNoZSBwcmVkQ2FjaGU7CisKKyAgICBTbWFsbFB0clNldDxjb25zdCBTQ0VWKiwgMT4gYW5hbHl6aW5nOworCisgICAgZW51bSBTb2x2ZXJSZXN1bHQgaXNMb29wR3VhcmRlZEJ5KGNvbnN0IExvb3AgKkwsIFByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpBLCBjb25zdCBTQ0VWICpCKSBjb25zdDsKKyAgICBzdGF0aWMgYm9vbCBpc01vbm90b25pYyhjb25zdCBTQ0VWICpTKTsKKyAgICBib29sIHNjZXZQb3NpdGl2ZShjb25zdCBTQ0VWICpBLCBjb25zdCBMb29wICpMLCBib29sIHN0cmljdD10cnVlKSBjb25zdDsKKyAgICBib29sIGNvbmRpdGlvblN1ZmZpY2llbnQoVmFsdWUgKkNvbmQsIGJvb2wgbmVnYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqQSwgUHJlZGljYXRlIFByZWQsIGNvbnN0IFNDRVYgKkIpOworICAgIFZhbHVlICpnZXRDb25kaXRpb25Ub1JlYWNoKEJhc2ljQmxvY2sgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9tVHJlZU5vZGVCYXNlPEJhc2ljQmxvY2s+ICpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJm5lZ2F0ZWQpOworICAgIFZhbHVlICpnZXRDb25kaXRpb25Ub1JlYWNoKEJhc2ljQmxvY2sgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZuZWdhdGVkKTsKKyAgICBjb25zdCBTQ0VWICpjb21wdXRlQWxsb2NhdGlvbkNvdW50KFZhbHVlICpQLCBjb25zdCBUeXBlIComVHkpIGNvbnN0OworICAgIGNvbnN0IFNDRVYgKmNvbXB1dGVBbGxvY2F0aW9uQ291bnRGb3JUeXBlKFZhbHVlICpQLCBjb25zdCBUeXBlICpUeSkgY29uc3Q7CisgIH07Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Bvc3REb21pbmF0b3JzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUG9zdERvbWluYXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNlODIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Bvc3REb21pbmF0b3JzLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vPS0gbGx2bS9BbmFseXNpcy9Qb3N0RG9taW5hdG9ycy5oIC0gUG9zdCBEb21pbmF0b3IgQ2FsY3VsYXRpb24tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgaW50ZXJmYWNlcyB0byBwb3N0IGRvbWluYW5jZSBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUE9TVF9ET01JTkFUT1JTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19QT1NUX0RPTUlOQVRPUlNfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFBvc3REb21pbmF0b3JUcmVlIENsYXNzIC0gQ29uY3JldGUgc3ViY2xhc3Mgb2YgRG9taW5hdG9yVHJlZSB0aGF0IGlzIHVzZWQgdG8KKy8vLyBjb21wdXRlIHRoZSBhIHBvc3QtZG9taW5hdG9yIHRyZWUuCisvLy8KK3N0cnVjdCBQb3N0RG9taW5hdG9yVHJlZSA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICBEb21pbmF0b3JUcmVlQmFzZTxCYXNpY0Jsb2NrPiogRFQ7CisKKyAgUG9zdERvbWluYXRvclRyZWUoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgIERUID0gbmV3IERvbWluYXRvclRyZWVCYXNlPEJhc2ljQmxvY2s+KHRydWUpOworICB9CisKKyAgflBvc3REb21pbmF0b3JUcmVlKCk7CisKKyAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICBpbmxpbmUgY29uc3Qgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+ICZnZXRSb290cygpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldFJvb3RzKCk7CisgIH0KKworICBpbmxpbmUgRG9tVHJlZU5vZGUgKmdldFJvb3ROb2RlKCkgY29uc3QgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdE5vZGUoKTsKKyAgfQorCisgIGlubGluZSBEb21UcmVlTm9kZSAqb3BlcmF0b3JbXShCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBEVC0+Z2V0Tm9kZShCQik7CisgIH0KKworICBpbmxpbmUgRG9tVHJlZU5vZGUgKmdldE5vZGUoQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldE5vZGUoQkIpOworICB9CisKKyAgaW5saW5lIGJvb2wgZG9taW5hdGVzKERvbVRyZWVOb2RlKiBBLCBEb21UcmVlTm9kZSogQikgY29uc3QgeworICAgIHJldHVybiBEVC0+ZG9taW5hdGVzKEEsIEIpOworICB9CisKKyAgaW5saW5lIGJvb2wgZG9taW5hdGVzKGNvbnN0IEJhc2ljQmxvY2sqIEEsIGNvbnN0IEJhc2ljQmxvY2sqIEIpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmRvbWluYXRlcyhBLCBCKTsKKyAgfQorCisgIGlubGluZSBib29sIHByb3Blcmx5RG9taW5hdGVzKGNvbnN0IERvbVRyZWVOb2RlKiBBLCBEb21UcmVlTm9kZSogQikgY29uc3QgeworICAgIHJldHVybiBEVC0+cHJvcGVybHlEb21pbmF0ZXMoQSwgQik7CisgIH0KKworICBpbmxpbmUgYm9vbCBwcm9wZXJseURvbWluYXRlcyhCYXNpY0Jsb2NrKiBBLCBCYXNpY0Jsb2NrKiBCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5wcm9wZXJseURvbWluYXRlcyhBLCBCKTsKKyAgfQorCisgIGlubGluZSBCYXNpY0Jsb2NrICpmaW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihCYXNpY0Jsb2NrICpBLCBCYXNpY0Jsb2NrICpCKSB7CisgICAgcmV0dXJuIERULT5maW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihBLCBCKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCByZWxlYXNlTWVtb3J5KCkgeworICAgIERULT5yZWxlYXNlTWVtb3J5KCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUqKSBjb25zdDsKK307CisKK0Z1bmN0aW9uUGFzcyogY3JlYXRlUG9zdERvbVRyZWUoKTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFBvc3REb21pbmF0b3JUcmVlKj4KKyAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8RG9tVHJlZU5vZGUqPiB7CisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKFBvc3REb21pbmF0b3JUcmVlICpEVCkgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdE5vZGUoKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihQb3N0RG9taW5hdG9yVHJlZSAqTikgeworICAgIGlmIChnZXRFbnRyeU5vZGUoTikpCisgICAgICByZXR1cm4gZGZfYmVnaW4oZ2V0RW50cnlOb2RlKE4pKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZGZfZW5kKGdldEVudHJ5Tm9kZShOKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKFBvc3REb21pbmF0b3JUcmVlICpOKSB7CisgICAgcmV0dXJuIGRmX2VuZChnZXRFbnRyeU5vZGUoTikpOworICB9Cit9OworCisvLy8gUG9zdERvbWluYW5jZUZyb250aWVyIENsYXNzIC0gQ29uY3JldGUgc3ViY2xhc3Mgb2YgRG9taW5hbmNlRnJvbnRpZXIgdGhhdCBpcworLy8vIHVzZWQgdG8gY29tcHV0ZSB0aGUgYSBwb3N0LWRvbWluYW5jZSBmcm9udGllci4KKy8vLworc3RydWN0IFBvc3REb21pbmFuY2VGcm9udGllciA6IHB1YmxpYyBEb21pbmFuY2VGcm9udGllckJhc2UgeworICBzdGF0aWMgY2hhciBJRDsKKyAgUG9zdERvbWluYW5jZUZyb250aWVyKCkKKyAgICA6IERvbWluYW5jZUZyb250aWVyQmFzZShJRCwgdHJ1ZSkge30KKworICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmKSB7CisgICAgRnJvbnRpZXJzLmNsZWFyKCk7CisgICAgUG9zdERvbWluYXRvclRyZWUgJkRUID0gZ2V0QW5hbHlzaXM8UG9zdERvbWluYXRvclRyZWU+KCk7CisgICAgUm9vdHMgPSBEVC5nZXRSb290cygpOworICAgIGlmIChjb25zdCBEb21UcmVlTm9kZSAqUm9vdCA9IERULmdldFJvb3ROb2RlKCkpCisgICAgICBjYWxjdWxhdGUoRFQsIFJvb3QpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgQVUuYWRkUmVxdWlyZWQ8UG9zdERvbWluYXRvclRyZWU+KCk7CisgIH0KKworcHJpdmF0ZToKKyAgY29uc3QgRG9tU2V0VHlwZSAmY2FsY3VsYXRlKGNvbnN0IFBvc3REb21pbmF0b3JUcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbVRyZWVOb2RlICpOb2RlKTsKK307CisKK0Z1bmN0aW9uUGFzcyogY3JlYXRlUG9zdERvbUZyb250aWVyKCk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Byb2ZpbGVJbmZvLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUHJvZmlsZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBhMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Byb2ZpbGVJbmZvLmgKQEAgLTAsMCArMSwyNDggQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL1Byb2ZpbGVJbmZvLmggLSBQcm9maWxlIEluZm8gSW50ZXJmYWNlIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGdlbmVyaWMgUHJvZmlsZUluZm8gaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIGFzIHRoZQorLy8gY29tbW9uIGludGVyZmFjZSB1c2VkIGJ5IGFsbCBjbGllbnRzIG9mIHByb2ZpbGluZyBpbmZvcm1hdGlvbiwgYW5kCisvLyBpbXBsZW1lbnRlZCBlaXRoZXIgYnkgbWFraW5nIHN0YXRpYyBndWVzdGltYXRpb25zLCBvciBieSBhY3R1YWxseSByZWFkaW5nIGluCisvLyBwcm9maWxpbmcgaW5mb3JtYXRpb24gZ2F0aGVyZWQgYnkgcnVubmluZyB0aGUgcHJvZ3JhbS4KKy8vCisvLyBOb3RlIHRoYXQgdG8gYmUgdXNlZnVsLCBhbGwgcHJvZmlsZS1iYXNlZCBvcHRpbWl6YXRpb25zIHNob3VsZCBwcmVzZXJ2ZQorLy8gUHJvZmlsZUluZm8sIHdoaWNoIHJlcXVpcmVzIHRoYXQgdGhleSBub3RpZnkgaXQgd2hlbiBjaGFuZ2VzIHRvIHRoZSBDRkcgYXJlCisvLyBtYWRlLiAoVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LikKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUFJPRklMRUlORk9fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1BST0ZJTEVJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFBhc3M7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIGNsYXNzIEJhc2ljQmxvY2s7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworCisgIC8vIEhlbHBlciBmb3IgZHVtcGluZyBlZGdlcyB0byBkYmdzKCkuCisgIHJhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPLCBzdGQ6OnBhaXI8Y29uc3QgQmFzaWNCbG9jayAqLCBjb25zdCBCYXNpY0Jsb2NrICo+IEUpOworICByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmTywgc3RkOjpwYWlyPGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICosIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICo+IEUpOworCisgIHJhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPLCBjb25zdCBCYXNpY0Jsb2NrICpCQik7CisgIHJhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPLCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKworICByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmTywgY29uc3QgRnVuY3Rpb24gKkYpOworICByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmTywgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRik7CisKKyAgLy8vIFByb2ZpbGVJbmZvIENsYXNzIC0gVGhpcyBjbGFzcyBob2xkcyBhbmQgbWFpbnRhaW5zIHByb2ZpbGluZworICAvLy8gaW5mb3JtYXRpb24gZm9yIHNvbWUgdW5pdCBvZiBjb2RlLgorICB0ZW1wbGF0ZTxjbGFzcyBGVHlwZSwgY2xhc3MgQlR5cGU+CisgIGNsYXNzIFByb2ZpbGVJbmZvVCB7CisgIHB1YmxpYzoKKyAgICAvLyBUeXBlcyBmb3IgaGFuZGxpbmcgcHJvZmlsaW5nIGluZm9ybWF0aW9uLgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IEJUeXBlKiwgY29uc3QgQlR5cGUqPiBFZGdlOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPEVkZ2UsIGRvdWJsZT4gRWRnZVdlaWdodDsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPEVkZ2UsIGRvdWJsZT4gRWRnZVdlaWdodHM7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBCVHlwZSosIGRvdWJsZT4gQmxvY2tDb3VudHM7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBCVHlwZSosIGNvbnN0IEJUeXBlKj4gUGF0aDsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gRWRnZUluZm9ybWF0aW9uIC0gQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBhIHRyYW5zaXRpb24gYmV0d2VlbiB0d28KKyAgICAvLyBibG9ja3MgaXMgZXhlY3V0ZWQuIEFzIGEgc3BlY2lhbCBjYXNlLCB3ZSBhbHNvIGhvbGQgYW4gZWRnZSBmcm9tIHRoZQorICAgIC8vIG51bGwgQmFzaWNCbG9jayB0byB0aGUgZW50cnkgYmxvY2sgdG8gaW5kaWNhdGUgaG93IG1hbnkgdGltZXMgdGhlCisgICAgLy8gZnVuY3Rpb24gd2FzIGVudGVyZWQuCisgICAgc3RkOjptYXA8Y29uc3QgRlR5cGUqLCBFZGdlV2VpZ2h0cz4gRWRnZUluZm9ybWF0aW9uOworCisgICAgLy8gQmxvY2tJbmZvcm1hdGlvbiAtIENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgYSBibG9jayBpcyBleGVjdXRlZC4KKyAgICBzdGQ6Om1hcDxjb25zdCBGVHlwZSosIEJsb2NrQ291bnRzPiBCbG9ja0luZm9ybWF0aW9uOworCisgICAgLy8gRnVuY3Rpb25JbmZvcm1hdGlvbiAtIENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgYSBmdW5jdGlvbiBpcyBleGVjdXRlZC4KKyAgICBzdGQ6Om1hcDxjb25zdCBGVHlwZSosIGRvdWJsZT4gRnVuY3Rpb25JbmZvcm1hdGlvbjsKKworICAgIFByb2ZpbGVJbmZvVDxNYWNoaW5lRnVuY3Rpb24sIE1hY2hpbmVCYXNpY0Jsb2NrPiAqTWFjaGluZVByb2ZpbGU7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gQ2xhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaW5mbworICAgIFByb2ZpbGVJbmZvVCgpOworICAgIH5Qcm9maWxlSW5mb1QoKTsgIC8vIFdlIHdhbnQgdG8gYmUgc3ViY2xhc3NlZAorCisgICAgLy8gTWlzc2luZ1ZhbHVlIC0gVGhlIHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgZm9yIGV4ZWN1dGlvbiBjb3VudHMgaW4gY2FzZQorICAgIC8vIG5vIHZhbHVlIGlzIGF2YWlsYWJsZS4KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIE1pc3NpbmdWYWx1ZTsKKworICAgIC8vIGdldEZ1bmN0aW9uKCkgLSBSZXR1cm5zIHRoZSBGdW5jdGlvbiBmb3IgYW4gRWRnZSwgY2hlY2tpbmcgZm9yIHZhbGlkaXR5LgorICAgIHN0YXRpYyBjb25zdCBGVHlwZSogZ2V0RnVuY3Rpb24oRWRnZSBlKSB7CisgICAgICBpZiAoZS5maXJzdCkgeworICAgICAgICByZXR1cm4gZS5maXJzdC0+Z2V0UGFyZW50KCk7CisgICAgICB9IGVsc2UgaWYgKGUuc2Vjb25kKSB7CisgICAgICAgIHJldHVybiBlLnNlY29uZC0+Z2V0UGFyZW50KCk7CisgICAgICB9CisgICAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBQcm9maWxlSW5mbzo6RWRnZSIpOworICAgICAgcmV0dXJuIChjb25zdCBGVHlwZSopMDsKKyAgICB9CisKKyAgICAvLyBnZXRFZGdlKCkgLSBDcmVhdGVzIGFuIEVkZ2UgZnJvbSB0d28gQmFzaWNCbG9ja3MuCisgICAgc3RhdGljIEVkZ2UgZ2V0RWRnZShjb25zdCBCVHlwZSAqU3JjLCBjb25zdCBCVHlwZSAqRGVzdCkgeworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFNyYywgRGVzdCk7CisgICAgfQorCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vLyBQcm9maWxlIEluZm9ybWF0aW9uIFF1ZXJpZXMKKyAgICAvLy8KKyAgICBkb3VibGUgZ2V0RXhlY3V0aW9uQ291bnQoY29uc3QgRlR5cGUgKkYpOworCisgICAgZG91YmxlIGdldEV4ZWN1dGlvbkNvdW50KGNvbnN0IEJUeXBlICpCQik7CisKKyAgICB2b2lkIHNldEV4ZWN1dGlvbkNvdW50KGNvbnN0IEJUeXBlICpCQiwgZG91YmxlIHcpOworCisgICAgdm9pZCBhZGRFeGVjdXRpb25Db3VudChjb25zdCBCVHlwZSAqQkIsIGRvdWJsZSB3KTsKKworICAgIGRvdWJsZSBnZXRFZGdlV2VpZ2h0KEVkZ2UgZSkgY29uc3QgeworICAgICAgdHlwZW5hbWUgc3RkOjptYXA8Y29uc3QgRlR5cGUqLCBFZGdlV2VpZ2h0cz46OmNvbnN0X2l0ZXJhdG9yIEogPQorICAgICAgICBFZGdlSW5mb3JtYXRpb24uZmluZChnZXRGdW5jdGlvbihlKSk7CisgICAgICBpZiAoSiA9PSBFZGdlSW5mb3JtYXRpb24uZW5kKCkpIHJldHVybiBNaXNzaW5nVmFsdWU7CisKKyAgICAgIHR5cGVuYW1lIEVkZ2VXZWlnaHRzOjpjb25zdF9pdGVyYXRvciBJID0gSi0+c2Vjb25kLmZpbmQoZSk7CisgICAgICBpZiAoSSA9PSBKLT5zZWNvbmQuZW5kKCkpIHJldHVybiBNaXNzaW5nVmFsdWU7CisKKyAgICAgIHJldHVybiBJLT5zZWNvbmQ7CisgICAgfQorCisgICAgdm9pZCBzZXRFZGdlV2VpZ2h0KEVkZ2UgZSwgZG91YmxlIHcpIHsKKyAgICAgIERFQlVHX1dJVEhfVFlQRSgicHJvZmlsZS1pbmZvIiwKKyAgICAgICAgICAgIGRiZ3MoKSA8PCAiQ3JlYXRpbmcgRWRnZSAiIDw8IGUKKyAgICAgICAgICAgICAgICAgICA8PCAiICh3ZWlnaHQ6ICIgPDwgZm9ybWF0KCIlLjIwZyIsdykgPDwgIilcbiIpOworICAgICAgRWRnZUluZm9ybWF0aW9uW2dldEZ1bmN0aW9uKGUpXVtlXSA9IHc7CisgICAgfQorCisgICAgdm9pZCBhZGRFZGdlV2VpZ2h0KEVkZ2UgZSwgZG91YmxlIHcpOworCisgICAgRWRnZVdlaWdodHMgJmdldEVkZ2VXZWlnaHRzIChjb25zdCBGVHlwZSAqRikgeworICAgICAgcmV0dXJuIEVkZ2VJbmZvcm1hdGlvbltGXTsKKyAgICB9CisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8vIEFuYWx5c2lzIFVwZGF0ZSBNZXRob2RzCisgICAgLy8vCisgICAgdm9pZCByZW1vdmVCbG9jayhjb25zdCBCVHlwZSAqQkIpOworCisgICAgdm9pZCByZW1vdmVFZGdlKEVkZ2UgZSk7CisKKyAgICB2b2lkIHJlcGxhY2VFZGdlKGNvbnN0IEVkZ2UgJiwgY29uc3QgRWRnZSAmKTsKKworICAgIGVudW0gR2V0UGF0aE1vZGUgeworICAgICAgR2V0UGF0aFRvRXhpdCA9IDEsCisgICAgICBHZXRQYXRoVG9WYWx1ZSA9IDIsCisgICAgICBHZXRQYXRoVG9EZXN0ID0gNCwKKyAgICAgIEdldFBhdGhXaXRoTmV3RWRnZXMgPSA4CisgICAgfTsKKworICAgIGNvbnN0IEJUeXBlICpHZXRQYXRoKGNvbnN0IEJUeXBlICpTcmMsIGNvbnN0IEJUeXBlICpEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAmUCwgdW5zaWduZWQgTW9kZSk7CisKKyAgICB2b2lkIGRpdmVydEZsb3coY29uc3QgRWRnZSAmLCBjb25zdCBFZGdlICYpOworCisgICAgdm9pZCBzcGxpdEVkZ2UoY29uc3QgQlR5cGUgKkZpcnN0QkIsIGNvbnN0IEJUeXBlICpTZWNvbmRCQiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCVHlwZSAqTmV3QkIsIGJvb2wgTWVyZ2VJZGVudGljYWxFZGdlcyA9IGZhbHNlKTsKKworICAgIHZvaWQgc3BsaXRCbG9jayhjb25zdCBCVHlwZSAqT2xkLCBjb25zdCBCVHlwZSogTmV3KTsKKworICAgIHZvaWQgc3BsaXRCbG9jayhjb25zdCBCVHlwZSAqQkIsIGNvbnN0IEJUeXBlKiBOZXdCQiwKKyAgICAgICAgICAgICAgICAgICAgQlR5cGUgKmNvbnN0ICpQcmVkcywgdW5zaWduZWQgTnVtUHJlZHMpOworCisgICAgdm9pZCByZXBsYWNlQWxsVXNlcyhjb25zdCBCVHlwZSAqUm1CQiwgY29uc3QgQlR5cGUgKkRlc3RCQik7CisKKyAgICB2b2lkIHRyYW5zZmVyKGNvbnN0IEZUeXBlICpPbGQsIGNvbnN0IEZUeXBlICpOZXcpOworCisgICAgdm9pZCByZXBhaXIoY29uc3QgRlR5cGUgKkYpOworCisgICAgdm9pZCBkdW1wKEZUeXBlICpGID0gMCwgYm9vbCByZWFsID0gdHJ1ZSkgeworICAgICAgZGJncygpIDw8ICIqKioqIFRoaXMgaXMgUHJvZmlsZUluZm8gIiA8PCB0aGlzIDw8ICIgc3BlYWtpbmc6XG4iOworICAgICAgaWYgKCFyZWFsKSB7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6c2V0PGNvbnN0IEZUeXBlKj4gRnVuY3Rpb25zOworCisgICAgICAgIGRiZ3MoKSA8PCAiRnVuY3Rpb25zOiBcbiI7CisgICAgICAgIGlmIChGKSB7CisgICAgICAgICAgZGJncygpIDw8IEYgPDwgIkAiIDw8IGZvcm1hdCgiJXAiLCBGKSA8PCAiOiAiIDw8IGZvcm1hdCgiJS4yMGciLGdldEV4ZWN1dGlvbkNvdW50KEYpKSA8PCAiXG4iOworICAgICAgICAgIEZ1bmN0aW9ucy5pbnNlcnQoRik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yICh0eXBlbmFtZSBzdGQ6Om1hcDxjb25zdCBGVHlwZSosIGRvdWJsZT46Oml0ZXJhdG9yIGZpID0gRnVuY3Rpb25JbmZvcm1hdGlvbi5iZWdpbigpLAorICAgICAgICAgICAgICAgZmUgPSBGdW5jdGlvbkluZm9ybWF0aW9uLmVuZCgpOyBmaSAhPSBmZTsgKytmaSkgeworICAgICAgICAgICAgZGJncygpIDw8IGZpLT5maXJzdCA8PCAiQCIgPDwgZm9ybWF0KCIlcCIsZmktPmZpcnN0KSA8PCAiOiAiIDw8IGZvcm1hdCgiJS4yMGciLGZpLT5zZWNvbmQpIDw8ICJcbiI7CisgICAgICAgICAgICBGdW5jdGlvbnMuaW5zZXJ0KGZpLT5maXJzdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICh0eXBlbmFtZSBzdGQ6OnNldDxjb25zdCBGVHlwZSo+OjppdGVyYXRvciBGSSA9IEZ1bmN0aW9ucy5iZWdpbigpLCBGRSA9IEZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICBGSSAhPSBGRTsgKytGSSkgeworICAgICAgICAgIGNvbnN0IEZUeXBlICpGID0gKkZJOworICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGNvbnN0IEZUeXBlKiwgQmxvY2tDb3VudHM+OjppdGVyYXRvciBid2kgPSBCbG9ja0luZm9ybWF0aW9uLmZpbmQoRik7CisgICAgICAgICAgZGJncygpIDw8ICJCYXNpY0Jsb2NrcyBmb3IgRnVuY3Rpb24gIiA8PCBGIDw8ICI6XG4iOworICAgICAgICAgIGZvciAodHlwZW5hbWUgQmxvY2tDb3VudHM6OmNvbnN0X2l0ZXJhdG9yIGJpID0gYndpLT5zZWNvbmQuYmVnaW4oKSwgYmUgPSBid2ktPnNlY29uZC5lbmQoKTsgYmkgIT0gYmU7ICsrYmkpIHsKKyAgICAgICAgICAgIGRiZ3MoKSA8PCBiaS0+Zmlyc3QgPDwgIkAiIDw8IGZvcm1hdCgiJXAiLCBiaS0+Zmlyc3QpIDw8ICI6ICIgPDwgZm9ybWF0KCIlLjIwZyIsYmktPnNlY29uZCkgPDwgIlxuIjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHR5cGVuYW1lIHN0ZDo6c2V0PGNvbnN0IEZUeXBlKj46Oml0ZXJhdG9yIEZJID0gRnVuY3Rpb25zLmJlZ2luKCksIEZFID0gRnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgICAgIEZJICE9IEZFOyArK0ZJKSB7CisgICAgICAgICAgdHlwZW5hbWUgc3RkOjptYXA8Y29uc3QgRlR5cGUqLCBFZGdlV2VpZ2h0cz46Oml0ZXJhdG9yIGVpID0gRWRnZUluZm9ybWF0aW9uLmZpbmQoKkZJKTsKKyAgICAgICAgICBkYmdzKCkgPDwgIkVkZ2VzIGZvciBGdW5jdGlvbiAiIDw8IGVpLT5maXJzdCA8PCAiOlxuIjsKKyAgICAgICAgICBmb3IgKHR5cGVuYW1lIEVkZ2VXZWlnaHRzOjppdGVyYXRvciBld2kgPSBlaS0+c2Vjb25kLmJlZ2luKCksIGV3ZSA9IGVpLT5zZWNvbmQuZW5kKCk7IAorICAgICAgICAgICAgICAgZXdpICE9IGV3ZTsgKytld2kpIHsKKyAgICAgICAgICAgIGRiZ3MoKSA8PCBld2ktPmZpcnN0IDw8ICI6ICIgPDwgZm9ybWF0KCIlLjIwZyIsZXdpLT5zZWNvbmQpIDw8ICJcbiI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoRiAmJiAiTm8gZnVuY3Rpb24gZ2l2ZW4sIHRoaXMgaXMgbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgZGJncygpIDw8ICJGdW5jdGlvbnM6IFxuIjsKKyAgICAgICAgZGJncygpIDw8IEYgPDwgIkAiIDw8IGZvcm1hdCgiJXAiLCBGKSA8PCAiOiAiIDw8IGZvcm1hdCgiJS4yMGciLGdldEV4ZWN1dGlvbkNvdW50KEYpKSA8PCAiXG4iOworCisgICAgICAgIGRiZ3MoKSA8PCAiQmFzaWNCbG9ja3MgZm9yIEZ1bmN0aW9uICIgPDwgRiA8PCAiOlxuIjsKKyAgICAgICAgZm9yICh0eXBlbmFtZSBGVHlwZTo6Y29uc3RfaXRlcmF0b3IgQkkgPSBGLT5iZWdpbigpLCBCRSA9IEYtPmVuZCgpOworICAgICAgICAgICAgIEJJICE9IEJFOyArK0JJKSB7CisgICAgICAgICAgY29uc3QgQlR5cGUgKkJCID0gJigqQkkpOworICAgICAgICAgIGRiZ3MoKSA8PCBCQiA8PCAiQCIgPDwgZm9ybWF0KCIlcCIsIEJCKSA8PCAiOiAiIDw8IGZvcm1hdCgiJS4yMGciLGdldEV4ZWN1dGlvbkNvdW50KEJCKSkgPDwgIlxuIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGJncygpIDw8ICIqKioqIFByb2ZpbGVJbmZvICIgPDwgdGhpcyA8PCAiLCBvdmVyIGFuZCBvdXQuXG4iOworICAgIH0KKworICAgIGJvb2wgQ2FsY3VsYXRlTWlzc2luZ0VkZ2UoY29uc3QgQlR5cGUgKkJCLCBFZGdlICZyZW1vdmVkLCBib29sIGFzc3VtZUVtcHR5RXhpdCA9IGZhbHNlKTsKKworICAgIGJvb2wgRXN0aW1hdGVNaXNzaW5nRWRnZXMoY29uc3QgQlR5cGUgKkJCKTsKKworICAgIFByb2ZpbGVJbmZvVDxNYWNoaW5lRnVuY3Rpb24sIE1hY2hpbmVCYXNpY0Jsb2NrPiAqTUkoKSB7CisgICAgICBpZiAoTWFjaGluZVByb2ZpbGUgPT0gMCkKKyAgICAgICAgTWFjaGluZVByb2ZpbGUgPSBuZXcgUHJvZmlsZUluZm9UPE1hY2hpbmVGdW5jdGlvbiwgTWFjaGluZUJhc2ljQmxvY2s+KCk7CisgICAgICByZXR1cm4gTWFjaGluZVByb2ZpbGU7CisgICAgfQorCisgICAgYm9vbCBoYXNNSSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoTWFjaGluZVByb2ZpbGUgIT0gMCk7CisgICAgfQorICB9OworCisgIHR5cGVkZWYgUHJvZmlsZUluZm9UPEZ1bmN0aW9uLCBCYXNpY0Jsb2NrPiBQcm9maWxlSW5mbzsKKyAgdHlwZWRlZiBQcm9maWxlSW5mb1Q8TWFjaGluZUZ1bmN0aW9uLCBNYWNoaW5lQmFzaWNCbG9jaz4gTWFjaGluZVByb2ZpbGVJbmZvOworCisgIC8vLyBjcmVhdGVQcm9maWxlTG9hZGVyUGFzcyAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIFBhc3MgdGhhdCBsb2FkcyB0aGUKKyAgLy8vIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG1vZHVsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUsIG1ha2luZworICAvLy8gaXQgYXZhaWxhYmxlIHRvIHRoZSBvcHRpbWl6ZXJzLgorICBQYXNzICpjcmVhdGVQcm9maWxlTG9hZGVyUGFzcyhjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qcm9maWxlSW5mb0xvYWRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Byb2ZpbGVJbmZvTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwYzM5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qcm9maWxlSW5mb0xvYWRlci5oCkBAIC0wLDAgKzEsODQgQEAKKy8vPT09LSBQcm9maWxlSW5mb0xvYWRlci5oIC0gTG9hZCAmIGNvbnZlcnQgcHJvZmlsZSBpbmZvcm1hdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBQcm9maWxlSW5mb0xvYWRlciBjbGFzcyBpcyB1c2VkIHRvIGxvYWQgYW5kIHJlcHJlc2VudCBwcm9maWxpbmcKKy8vIGluZm9ybWF0aW9uIHJlYWQgaW4gZnJvbSB0aGUgZHVtcCBmaWxlLiAgSWYgY29udmVyc2lvbnMgYmV0d2VlbiBmb3JtYXRzIGFyZQorLy8gbmVlZGVkLCBpdCBjYW4gYWxzbyBkbyB0aGlzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19QUk9GSUxFSU5GT0xPQURFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUFJPRklMRUlORk9MT0FERVJfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgQmFzaWNCbG9jazsKKworY2xhc3MgUHJvZmlsZUluZm9Mb2FkZXIgeworICBjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWU7CisgIE1vZHVsZSAmTTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENvbW1hbmRMaW5lczsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICAgIEZ1bmN0aW9uQ291bnRzOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gICAgQmxvY2tDb3VudHM7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAgICBFZGdlQ291bnRzOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gICAgT3B0aW1hbEVkZ2VDb3VudHM7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAgICBCQlRyYWNlOworICBib29sIFdhcm5lZDsKK3B1YmxpYzoKKyAgLy8gUHJvZmlsZUluZm9Mb2FkZXIgY3RvciAtIFJlYWQgdGhlIHNwZWNpZmllZCBwcm9maWxpbmcgZGF0YSBmaWxlLCBleGl0aW5nCisgIC8vIHRoZSBwcm9ncmFtIGlmIHRoZSBmaWxlIGlzIGludmFsaWQgb3IgYnJva2VuLgorICBQcm9maWxlSW5mb0xvYWRlcihjb25zdCBjaGFyICpUb29sTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICBNb2R1bGUgJk0pOworCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBVbmNvdW50ZWQ7CisKKyAgdW5zaWduZWQgZ2V0TnVtRXhlY3V0aW9ucygpIGNvbnN0IHsgcmV0dXJuIENvbW1hbmRMaW5lcy5zaXplKCk7IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEV4ZWN1dGlvbih1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBDb21tYW5kTGluZXNbaV07IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0RmlsZU5hbWUoKSBjb25zdCB7IHJldHVybiBGaWxlbmFtZTsgfQorCisgIC8vIGdldFJhd0Z1bmN0aW9uQ291bnRzIC0gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBjb25zdW1lcnMgb2YgZnVuY3Rpb24KKyAgLy8gY291bnRpbmcgaW5mb3JtYXRpb24uCisgIC8vCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmZ2V0UmF3RnVuY3Rpb25Db3VudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmN0aW9uQ291bnRzOworICB9CisKKyAgLy8gZ2V0UmF3QmxvY2tDb3VudHMgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGNvbnN1bWVycyBvZiBibG9jayBjb3VudGluZworICAvLyBpbmZvcm1hdGlvbi4KKyAgLy8KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZnZXRSYXdCbG9ja0NvdW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gQmxvY2tDb3VudHM7CisgIH0KKworICAvLyBnZXRFZGdlQ291bnRzIC0gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBjb25zdW1lcnMgb2YgZWRnZSBjb3VudGluZworICAvLyBpbmZvcm1hdGlvbi4KKyAgLy8KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZnZXRSYXdFZGdlQ291bnRzKCkgY29uc3QgeworICAgIHJldHVybiBFZGdlQ291bnRzOworICB9CisKKyAgLy8gZ2V0RWRnZU9wdGltYWxDb3VudHMgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGNvbnN1bWVycyBvZiBvcHRpbWFsIGVkZ2UgCisgIC8vIGNvdW50aW5nIGluZm9ybWF0aW9uLgorICAvLworICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJmdldFJhd09wdGltYWxFZGdlQ291bnRzKCkgY29uc3QgeworICAgIHJldHVybiBPcHRpbWFsRWRnZUNvdW50czsKKyAgfQorCit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qcm9maWxlSW5mb1R5cGVzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUHJvZmlsZUluZm9UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNTMxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUHJvZmlsZUluZm9UeXBlcy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qPT09LS0gUHJvZmlsZUluZm9UeXBlcy5oIC0gUHJvZmlsaW5nIGluZm8gc2hhcmVkIGNvbnN0YW50cyAtLS0tLS0qLSBDIC0qLT09PSpcCit8KgorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorfCoKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorfCoKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KgorfCogVGhpcyBmaWxlIGRlZmluZXMgY29uc3RhbnRzIHNoYXJlZCBieSB0aGUgdmFyaW91cyBkaWZmZXJlbnQgcHJvZmlsaW5nCit8KiBydW50aW1lIGxpYnJhcmllcyBhbmQgdGhlIExMVk0gQysrIHByb2ZpbGUgaW5mbyBsb2FkZXIuIEl0IG11c3QgYmUgYQorfCogQyBoZWFkZXIgYmVjYXVzZSwgYXQgcHJlc2VudCwgdGhlIHByb2ZpbGluZyBydW50aW1lcyBhcmUgd3JpdHRlbiBpbiBDLgorfCoKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19QUk9GSUxFSU5GT1RZUEVTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19QUk9GSUxFSU5GT1RZUEVTX0gKKworZW51bSBQcm9maWxpbmdUeXBlIHsKKyAgQXJndW1lbnRJbmZvICA9IDEsICAgLyogVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBibG9jayAqLworICBGdW5jdGlvbkluZm8gID0gMiwgICAvKiBGdW5jdGlvbiBwcm9maWxpbmcgaW5mb3JtYXRpb24gICovCisgIEJsb2NrSW5mbyAgICAgPSAzLCAgIC8qIEJsb2NrIHByb2ZpbGluZyBpbmZvcm1hdGlvbiAgICAgKi8KKyAgRWRnZUluZm8gICAgICA9IDQsICAgLyogRWRnZSBwcm9maWxpbmcgaW5mb3JtYXRpb24gICAgICAqLworICBQYXRoSW5mbyAgICAgID0gNSwgICAvKiBQYXRoIHByb2ZpbGluZyBpbmZvcm1hdGlvbiAgICAgICovCisgIEJCVHJhY2VJbmZvICAgPSA2LCAgIC8qIEJhc2ljIGJsb2NrIHRyYWNlIGluZm9ybWF0aW9uICAgKi8KKyAgT3B0RWRnZUluZm8gICA9IDcgICAgLyogRWRnZSBwcm9maWxpbmcgaW5mb3JtYXRpb24sIG9wdGltYWwgdmVyc2lvbiAqLworfTsKKworI2VuZGlmIC8qIExMVk1fQU5BTFlTSVNfUFJPRklMRUlORk9UWVBFU19IICovCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uSW5mby5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTI2NzBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaApAQCAtMCwwICsxLDYzMCBAQAorLy89PT0tIFJlZ2lvbkluZm8uaCAtIFNFU0UgcmVnaW9uIGFuYWx5c2lzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDYWxjdWxhdGUgYSBwcm9ncmFtIHN0cnVjdHVyZSB0cmVlIGJ1aWx0IG91dCBvZiBzaW5nbGUgZW50cnkgc2luZ2xlIGV4aXQKKy8vIHJlZ2lvbnMuCisvLyBUaGUgYmFzaWMgaWRlYXMgYXJlIHRha2VuIGZyb20gIlRoZSBQcm9ncmFtIFN0cnVjdHVyZSBUcmVlIC0gUmljaGFyZCBKb2huc29uLAorLy8gRGF2aWQgUGVhcnNvbiwgS2VzaGF2IFBpbmdhbGkgLSAxOTk0IiwgaG93ZXZlciBlbnJpY2hlZCB3aXRoIGlkZWFzIGZyb20gIlRoZQorLy8gUmVmaW5lZCBQcm9jZXNzIFN0cnVjdHVyZSBUcmVlIC0gSnVzc2kgVmFuaGF0YWxvLCBIYWdlbiBWb2VseWVyLCBKYW5hCisvLyBLb2VobGVyIC0gMjAwOSIuCisvLyBUaGUgYWxnb3JpdGhtIHRvIGNhbGN1bGF0ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgaG93ZXZlciBpcyBjb21wbGV0ZWx5CisvLyBkaWZmZXJlbnQsIGFzIGl0IHRha2VzIGFkdmFudGFnZSBvZiBleGlzdGluZyBpbmZvcm1hdGlvbiBhbHJlYWR5IGF2YWlsYWJsZQorLy8gaW4gKFBvc3QpZG9taW5hY2UgdHJlZSBhbmQgZG9taW5hbmNlIGZyb250aWVyIHBhc3Nlcy4gVGhpcyBsZWFkcyB0byBhIHNpbXBsZXIKKy8vIGFuZCBpbiBwcmFjdGljZSBob3BlZnVsbHkgYmV0dGVyIHBlcmZvcm1pbmcgYWxnb3JpdGhtLiBUaGUgcnVudGltZSBvZiB0aGUKKy8vIGFsZ29yaXRobXMgZGVzY3JpYmVkIGluIHRoZSBwYXBlcnMgYWJvdmUgYXJlIGJvdGggbGluZWFyIGluIGdyYXBoIHNpemUsCisvLyBPKFYrRSksIHdoZXJlYXMgdGhpcyBhbGdvcml0aG0gaXMgbm90LCBhcyB0aGUgZG9taW5hbmNlIGZyb250aWVyIGluZm9ybWF0aW9uCisvLyBpdHNlbGYgaXMgbm90LCBidXQgaW4gcHJhY3RpY2UgcnVudGltZSBzZWVtcyB0byBiZSBpbiB0aGUgb3JkZXIgb2YgbWFnbml0dWRlCisvLyBvZiBkb21pbmFuY2UgdHJlZSBjYWxjdWxhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUkVHSU9OX0lORk9fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1JFR0lPTl9JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Qb3N0RG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBSZWdpb247CitjbGFzcyBSZWdpb25JbmZvOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBMb29wOworY2xhc3MgTG9vcEluZm87CisKKy8vLyBAYnJpZWYgTWFya2VyIGNsYXNzIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSBSZWdpb24gaW4gZmxhdCBtb2RlLgorLy8vCisvLy8gVGhlIGNsYXNzIGlzIHVzZWQgdG8gZWl0aGVyIGl0ZXJhdGUgaW4gRmxhdCBtb2RlIG9yIGJ5IG5vdCB1c2luZyBpdCB0byBub3QKKy8vLyBpdGVyYXRlIGluIEZsYXQgbW9kZS4gIER1cmluZyBhIEZsYXQgbW9kZSBpdGVyYXRpb24gYWxsIFJlZ2lvbnMgYXJlIGVudGVyZWQKKy8vLyBhbmQgdGhlIGl0ZXJhdGlvbiByZXR1cm5zIGV2ZXJ5IEJhc2ljQmxvY2suICBJZiB0aGUgRmxhdCBtb2RlIGlzIG5vdAorLy8vIHNlbGVjdGVkIGZvciBTdWJSZWdpb25zIGp1c3Qgb25lIFJlZ2lvbk5vZGUgY29udGFpbmluZyB0aGUgc3VicmVnaW9uIGlzCisvLy8gcmV0dXJuZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgR3JhcGhUeXBlPgorY2xhc3MgRmxhdEl0IHt9OworCisvLy8gQGJyaWVmIEEgUmVnaW9uTm9kZSByZXByZXNlbnRzIGEgc3VicmVnaW9uIG9yIGEgQmFzaWNCbG9jayB0aGF0IGlzIHBhcnQgb2YgYQorLy8vIFJlZ2lvbi4KK2NsYXNzIFJlZ2lvbk5vZGUgeworICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIFJlZ2lvbk5vZGUoY29uc3QgUmVnaW9uTm9kZSAmKTsKKyAgLy8gRE8gTk9UIElNUExFTUVOVAorICBjb25zdCBSZWdpb25Ob2RlICZvcGVyYXRvcj0oY29uc3QgUmVnaW9uTm9kZSAmKTsKKworICAvLy8gVGhpcyBpcyB0aGUgZW50cnkgYmFzaWMgYmxvY2sgdGhhdCBzdGFydHMgdGhpcyByZWdpb24gbm9kZS4gIElmIHRoaXMgaXMgYQorICAvLy8gQmFzaWNCbG9jayBSZWdpb25Ob2RlLCB0aGVuIGVudHJ5IGlzIGp1c3QgdGhlIGJhc2ljIGJsb2NrLCB0aGF0IHRoaXMKKyAgLy8vIFJlZ2lvbk5vZGUgcmVwcmVzZW50cy4gIE90aGVyd2lzZSBpdCBpcyB0aGUgZW50cnkgb2YgdGhpcyAoU3ViKVJlZ2lvbk5vZGUuCisgIC8vLworICAvLy8gSW4gdGhlIEJCdG9SZWdpb25Ob2RlIG1hcCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZSwgQkIgd2lsbCBhbHdheXMgbWFwCisgIC8vLyB0byB0aGlzIG5vZGUgbm8gbWF0dGVyIHdoaWNoIGtpbmQgb2Ygbm9kZSB0aGlzIG9uZSBpcy4KKyAgLy8vCisgIC8vLyBUaGUgbm9kZSBjYW4gaG9sZCBlaXRoZXIgYSBSZWdpb24gb3IgYSBCYXNpY0Jsb2NrLgorICAvLy8gVXNlIG9uZSBiaXQgdG8gc2F2ZSwgaWYgdGhpcyBSZWdpb25Ob2RlIGlzIGEgc3VicmVnaW9uIG9yIEJhc2ljQmxvY2sKKyAgLy8vIFJlZ2lvbk5vZGUuCisgIFBvaW50ZXJJbnRQYWlyPEJhc2ljQmxvY2sqLCAxLCBib29sPiBlbnRyeTsKKworcHJvdGVjdGVkOgorICAvLy8gQGJyaWVmIFRoZSBwYXJlbnQgUmVnaW9uIG9mIHRoaXMgUmVnaW9uTm9kZS4KKyAgLy8vIEBzZWUgZ2V0UGFyZW50KCkKKyAgUmVnaW9uKiBwYXJlbnQ7CisKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBSZWdpb25Ob2RlLgorICAvLy8KKyAgLy8vIEBwYXJhbSBQYXJlbnQgICAgICBUaGUgcGFyZW50IG9mIHRoaXMgUmVnaW9uTm9kZS4KKyAgLy8vIEBwYXJhbSBFbnRyeSAgICAgICBUaGUgZW50cnkgQmFzaWNCbG9jayBvZiB0aGUgUmVnaW9uTm9kZS4gIElmIHRoaXMKKyAgLy8vICAgICAgICAgICAgICAgICAgICBSZWdpb25Ob2RlIHJlcHJlc2VudHMgYSBCYXNpY0Jsb2NrLCB0aGlzIGlzIHRoZQorICAvLy8gICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgaXRzZWxmLiAgSWYgaXQgcmVwcmVzZW50cyBhIHN1YnJlZ2lvbiwgdGhpcworICAvLy8gICAgICAgICAgICAgICAgICAgIGlzIHRoZSBlbnRyeSBCYXNpY0Jsb2NrIG9mIHRoZSBzdWJyZWdpb24uCisgIC8vLyBAcGFyYW0gaXNTdWJSZWdpb24gSWYgdGhpcyBSZWdpb25Ob2RlIHJlcHJlc2VudHMgYSBTdWJSZWdpb24uCisgIGlubGluZSBSZWdpb25Ob2RlKFJlZ2lvbiogUGFyZW50LCBCYXNpY0Jsb2NrKiBFbnRyeSwgYm9vbCBpc1N1YlJlZ2lvbiA9IDApCisgICAgOiBlbnRyeShFbnRyeSwgaXNTdWJSZWdpb24pLCBwYXJlbnQoUGFyZW50KSB7fQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBwYXJlbnQgUmVnaW9uIG9mIHRoaXMgUmVnaW9uTm9kZS4KKyAgLy8vCisgIC8vLyBUaGUgcGFyZW50IFJlZ2lvbiBpcyB0aGUgUmVnaW9uIHRoaXMgUmVnaW9uTm9kZSBiZWxvbmdzIHRvLiBJZiBmb3IKKyAgLy8vIGV4YW1wbGUgYSBCYXNpY0Jsb2NrIGlzIGVsZW1lbnQgb2YgdHdvIFJlZ2lvbnMsIHRoZXJlIGV4aXN0IHR3bworICAvLy8gUmVnaW9uTm9kZXMgZm9yIHRoaXMgQmFzaWNCbG9jay4gRWFjaCB3aXRoIHRoZSBnZXRQYXJlbnQoKSBmdW5jdGlvbgorICAvLy8gcG9pbnRpbmcgdG8gdGhlIFJlZ2lvbiB0aGlzIFJlZ2lvbk5vZGUgYmVsb25ncyB0by4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIEdldCB0aGUgcGFyZW50IFJlZ2lvbiBvZiB0aGlzIFJlZ2lvbk5vZGUuCisgIGlubGluZSBSZWdpb24qIGdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIHBhcmVudDsgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBlbnRyeSBCYXNpY0Jsb2NrIG9mIHRoaXMgUmVnaW9uTm9kZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIFJlZ2lvbk5vZGUgcmVwcmVzZW50cyBhIEJhc2ljQmxvY2sgdGhpcyBpcyBqdXN0IHRoZSBCYXNpY0Jsb2NrCisgIC8vLyBpdHNlbGYsIG90aGVyd2lzZSB3ZSByZXR1cm4gdGhlIGVudHJ5IEJhc2ljQmxvY2sgb2YgdGhlIFN1YnJlZ2lvbgorICAvLy8KKyAgLy8vIEByZXR1cm4gVGhlIGVudHJ5IEJhc2ljQmxvY2sgb2YgdGhpcyBSZWdpb25Ob2RlLgorICBpbmxpbmUgQmFzaWNCbG9jayogZ2V0RW50cnkoKSBjb25zdCB7IHJldHVybiBlbnRyeS5nZXRQb2ludGVyKCk7IH0KKworICAvLy8gQGJyaWVmIEdldCB0aGUgY29udGVudCBvZiB0aGlzIFJlZ2lvbk5vZGUuCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgZWl0aGVyIGEgQmFzaWNCbG9jayBvciBhIHN1YnJlZ2lvbi4gQmVmb3JlIGNhbGxpbmcgZ2V0Tm9kZUFzKCkKKyAgLy8vIGNoZWNrIHRoZSB0eXBlIG9mIHRoZSBjb250ZW50IHdpdGggdGhlIGlzU3ViUmVnaW9uKCkgZnVuY3Rpb24gY2FsbC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIFRoZSBjb250ZW50IG9mIHRoaXMgUmVnaW9uTm9kZS4KKyAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgaW5saW5lIFQqIGdldE5vZGVBcygpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgSXMgdGhpcyBSZWdpb25Ob2RlIGEgc3VicmVnaW9uPworICAvLy8KKyAgLy8vIEByZXR1cm4gVHJ1ZSBpZiBpdCBjb250YWlucyBhIHN1YnJlZ2lvbi4gRmFsc2UgaWYgaXQgY29udGFpbnMgYQorICAvLy8gICAgICAgICBCYXNpY0Jsb2NrLgorICBpbmxpbmUgYm9vbCBpc1N1YlJlZ2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZW50cnkuZ2V0SW50KCk7CisgIH0KK307CisKKy8vLyBQcmludCBhIFJlZ2lvbk5vZGUuCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBSZWdpb25Ob2RlICZOb2RlKTsKKwordGVtcGxhdGU8PgoraW5saW5lIEJhc2ljQmxvY2sqIFJlZ2lvbk5vZGU6OmdldE5vZGVBczxCYXNpY0Jsb2NrPigpIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc1N1YlJlZ2lvbigpICYmICJUaGlzIGlzIG5vdCBhIEJhc2ljQmxvY2sgUmVnaW9uTm9kZSEiKTsKKyAgcmV0dXJuIGdldEVudHJ5KCk7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBSZWdpb24qIFJlZ2lvbk5vZGU6OmdldE5vZGVBczxSZWdpb24+KCkgY29uc3QgeworICBhc3NlcnQoaXNTdWJSZWdpb24oKSAmJiAiVGhpcyBpcyBub3QgYSBzdWJyZWdpb24gUmVnaW9uTm9kZSEiKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVnaW9uKj4oY29uc3RfY2FzdDxSZWdpb25Ob2RlKj4odGhpcykpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEBicmllZiBBIHNpbmdsZSBlbnRyeSBzaW5nbGUgZXhpdCBSZWdpb24uCisvLy8KKy8vLyBBIFJlZ2lvbiBpcyBhIGNvbm5lY3RlZCBzdWJncmFwaCBvZiBhIGNvbnRyb2wgZmxvdyBncmFwaCB0aGF0IGhhcyBleGFjdGx5CisvLy8gdHdvIGNvbm5lY3Rpb25zIHRvIHRoZSByZW1haW5pbmcgZ3JhcGguIEl0IGNhbiBiZSB1c2VkIHRvIGFuYWx5emUgb3IKKy8vLyBvcHRpbWl6ZSBwYXJ0cyBvZiB0aGUgY29udHJvbCBmbG93IGdyYXBoLgorLy8vCisvLy8gQSA8ZW0+IHNpbXBsZSBSZWdpb24gPC9lbT4gaXMgY29ubmVjdGVkIHRvIHRoZSByZW1haW5nIGdyYXBoIGJ5IGp1c3QgdHdvCisvLy8gZWRnZXMuIE9uZSBlZGdlIGVudGVyaW5nIHRoZSBSZWdpb24gYW5kIGFub3RoZXIgb25lIGxlYXZpbmcgdGhlIFJlZ2lvbi4KKy8vLworLy8vIEFuIDxlbT4gZXh0ZW5kZWQgUmVnaW9uIDwvZW0+IChvciBqdXN0IFJlZ2lvbikgaXMgYSBzdWJncmFwaCB0aGF0IGNhbiBiZQorLy8vIHRyYW5zZm9ybSBpbnRvIGEgc2ltcGxlIFJlZ2lvbi4gVGhlIHRyYW5zZm9ybWF0aW9uIGlzIGRvbmUgYnkgYWRkaW5nCisvLy8gQmFzaWNCbG9ja3MgdGhhdCBtZXJnZSBzZXZlcmFsIGVudHJ5IG9yIGV4aXQgZWRnZXMgc28gdGhhdCBhZnRlciB0aGUgbWVyZ2UKKy8vLyBqdXN0IG9uZSBlbnRyeSBhbmQgb25lIGV4aXQgZWRnZSBleGlzdHMuCisvLy8KKy8vLyBUaGUgXGUgRW50cnkgb2YgYSBSZWdpb24gaXMgdGhlIGZpcnN0IEJhc2ljQmxvY2sgdGhhdCBpcyBwYXNzZWQgYWZ0ZXIKKy8vLyBlbnRlcmluZyB0aGUgUmVnaW9uLiBJdCBpcyBhbiBlbGVtZW50IG9mIHRoZSBSZWdpb24uIFRoZSBlbnRyeSBCYXNpY0Jsb2NrCisvLy8gZG9taW5hdGVzIGFsbCBCYXNpY0Jsb2NrcyBpbiB0aGUgUmVnaW9uLgorLy8vCisvLy8gVGhlIFxlIEV4aXQgb2YgYSBSZWdpb24gaXMgdGhlIGZpcnN0IEJhc2ljQmxvY2sgdGhhdCBpcyBwYXNzZWQgYWZ0ZXIKKy8vLyBsZWF2aW5nIHRoZSBSZWdpb24uIEl0IGlzIG5vdCBhbiBlbGVtZW50IG9mIHRoZSBSZWdpb24uIFRoZSBleGl0IEJhc2ljQmxvY2ssCisvLy8gcG9zdGRvbWluYXRlcyBhbGwgQmFzaWNCbG9ja3MgaW4gdGhlIFJlZ2lvbi4KKy8vLworLy8vIEEgPGVtPiBjYW5vbmljYWwgUmVnaW9uIDwvZW0+IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBieSBjb21iaW5pbmcgc21hbGxlcgorLy8vIFJlZ2lvbnMuCisvLy8KKy8vLyBSZWdpb24gQSBpcyB0aGUgXGUgcGFyZW50IG9mIFJlZ2lvbiBCLCBpZiBCIGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIGluIEEuCisvLy8KKy8vLyBUd28gY2Fub25pY2FsIFJlZ2lvbnMgZWl0aGVyIGRvIG5vdCBpbnRlcnNlY3QgYXQgYWxsIG9yIG9uZSBpcworLy8vIHRoZSBwYXJlbnQgb2YgdGhlIG90aGVyLgorLy8vCisvLy8gVGhlIDxlbT4gUHJvZ3JhbSBTdHJ1Y3R1cmUgVHJlZTwvZW0+IGlzIGEgZ3JhcGggKFYsIEUpIHdoZXJlIFYgaXMgdGhlIHNldCBvZgorLy8vIFJlZ2lvbnMgaW4gdGhlIGNvbnRyb2wgZmxvdyBncmFwaCBhbmQgRSBpcyB0aGUgXGUgcGFyZW50IHJlbGF0aW9uIG9mIHRoZXNlCisvLy8gUmVnaW9ucy4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8KKy8vLyBcdmVyYmF0aW0KKy8vLyBBIHNpbXBsZSBjb250cm9sIGZsb3cgZ3JhcGgsIHRoYXQgY29udGFpbnMgdHdvIHJlZ2lvbnMuCisvLy8KKy8vLyAgICAgICAgMQorLy8vICAgICAgIC8gfAorLy8vICAgICAgMiAgIHwKKy8vLyAgICAgLyBcICAgMworLy8vICAgIDQgICA1ICB8CisvLy8gICAgfCAgIHwgIHwKKy8vLyAgICA2ICAgNyAgOAorLy8vICAgICBcICB8IC8KKy8vLyAgICAgIFwgfC8gICAgICAgUmVnaW9uIEE6IDEgLT4gOSB7MSwyLDMsNCw1LDYsNyw4fQorLy8vICAgICAgICA5ICAgICAgICBSZWdpb24gQjogMiAtPiA5IHsyLDQsNSw2LDd9CisvLy8gXGVuZHZlcmJhdGltCisvLy8KKy8vLyBZb3UgY2FuIG9idGFpbiBtb3JlIGV4YW1wbGVzIGJ5IGVpdGhlciBjYWxsaW5nCisvLy8KKy8vLyA8dHQ+ICJvcHQgLXJlZ2lvbnMgLWFuYWx5emUgYW55cHJvZ3JhbS5sbCIgPC90dD4KKy8vLyBvcgorLy8vIDx0dD4gIm9wdCAtdmlldy1yZWdpb25zLW9ubHkgYW55cHJvZ3JhbS5sbCIgPC90dD4KKy8vLworLy8vIG9uIGFueSBMTFZNIGZpbGUgeW91IGFyZSBpbnRlcmVzdGVkIGluLgorLy8vCisvLy8gVGhlIGZpcnN0IGNhbGwgcmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb2dyYW0gc3RydWN0dXJlCisvLy8gdHJlZSwgdGhlIHNlY29uZCBvbmUgY3JlYXRlcyBhIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiB1c2luZyBncmFwaHZpei4KK2NsYXNzIFJlZ2lvbiA6IHB1YmxpYyBSZWdpb25Ob2RlIHsKKyAgZnJpZW5kIGNsYXNzIFJlZ2lvbkluZm87CisgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgUmVnaW9uKGNvbnN0IFJlZ2lvbiAmKTsKKyAgLy8gRE8gTk9UIElNUExFTUVOVAorICBjb25zdCBSZWdpb24gJm9wZXJhdG9yPShjb25zdCBSZWdpb24gJik7CisKKyAgLy8gSW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIG1hbmFnZSB0aGlzIFJlZ2lvbi4KKyAgUmVnaW9uSW5mbyogUkk7CisgIERvbWluYXRvclRyZWUgKkRUOworCisgIC8vIFRoZSBleGl0IEJhc2ljQmxvY2sgb2YgdGhpcyByZWdpb24uCisgIC8vIChUaGUgZW50cnkgQmFzaWNCbG9jayBpcyBwYXJ0IG9mIFJlZ2lvbk5vZGUpCisgIEJhc2ljQmxvY2sgKmV4aXQ7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxSZWdpb24qPiBSZWdpb25TZXQ7CisKKyAgLy8gVGhlIHN1YnJlZ2lvbnMgb2YgdGhpcyByZWdpb24uCisgIFJlZ2lvblNldCBjaGlsZHJlbjsKKworICB0eXBlZGVmIHN0ZDo6bWFwPEJhc2ljQmxvY2sqLCBSZWdpb25Ob2RlKj4gQkJOb2RlTWFwVDsKKworICAvLyBTYXZlIHRoZSBCYXNpY0Jsb2NrIFJlZ2lvbk5vZGVzIHRoYXQgYXJlIGVsZW1lbnQgb2YgdGhpcyBSZWdpb24uCisgIG11dGFibGUgQkJOb2RlTWFwVCBCQk5vZGVNYXA7CisKKyAgLy8vIHZlcmlmeUJCSW5SZWdpb24gLSBDaGVjayBpZiBhIEJCIGlzIGluIHRoaXMgUmVnaW9uLiBUaGlzIGNoZWNrIGFsc28gd29ya3MKKyAgLy8vIGlmIHRoZSByZWdpb24gaXMgaW5jb3JyZWN0bHkgYnVpbHQuIChFWFBFTlNJVkUhKQorICB2b2lkIHZlcmlmeUJCSW5SZWdpb24oQmFzaWNCbG9jayogQkIpIGNvbnN0OworCisgIC8vLyB2ZXJpZnlXYWxrIC0gV2FsayBvdmVyIGFsbCB0aGUgQkJzIG9mIHRoZSByZWdpb24gc3RhcnRpbmcgZnJvbSBCQiBhbmQKKyAgLy8vIHZlcmlmeSB0aGF0IGFsbCByZWFjaGFibGUgYmFzaWMgYmxvY2tzIGFyZSBlbGVtZW50cyBvZiB0aGUgcmVnaW9uLgorICAvLy8gKEVYUEVOU0lWRSEpCisgIHZvaWQgdmVyaWZ5V2FsayhCYXNpY0Jsb2NrKiBCQiwgc3RkOjpzZXQ8QmFzaWNCbG9jayo+KiB2aXNpdGVkQkIpIGNvbnN0OworCisgIC8vLyB2ZXJpZnlSZWdpb25OZXN0IC0gVmVyaWZ5IGlmIHRoZSByZWdpb24gYW5kIGl0cyBjaGlsZHJlbiBhcmUgdmFsaWQKKyAgLy8vIHJlZ2lvbnMgKEVYUEVOU0lWRSEpCisgIHZvaWQgdmVyaWZ5UmVnaW9uTmVzdCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgbmV3IHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gRW50cnkgIFRoZSBlbnRyeSBiYXNpYyBibG9jayBvZiB0aGUgcmVnaW9uLgorICAvLy8gQHBhcmFtIEV4aXQgICBUaGUgZXhpdCBiYXNpYyBibG9jayBvZiB0aGUgcmVnaW9uLgorICAvLy8gQHBhcmFtIFJJICAgICBUaGUgcmVnaW9uIGluZm8gb2JqZWN0IHRoYXQgaXMgbWFuYWdpbmcgdGhpcyByZWdpb24uCisgIC8vLyBAcGFyYW0gRFQgICAgIFRoZSBkb21pbmF0b3IgdHJlZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgLy8vIEBwYXJhbSBQYXJlbnQgVGhlIHN1cnJvdW5kaW5nIHJlZ2lvbiBvciBOVUxMIGlmIHRoaXMgaXMgYSB0b3AgbGV2ZWwKKyAgLy8vICAgICAgICAgICAgICAgcmVnaW9uLgorICBSZWdpb24oQmFzaWNCbG9jayAqRW50cnksIEJhc2ljQmxvY2sgKkV4aXQsIFJlZ2lvbkluZm8qIFJJLAorICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQsIFJlZ2lvbiAqUGFyZW50ID0gMCk7CisKKyAgLy8vIERlbGV0ZSB0aGUgUmVnaW9uIGFuZCBhbGwgaXRzIHN1YnJlZ2lvbnMuCisgIH5SZWdpb24oKTsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgZW50cnkgQmFzaWNCbG9jayBvZiB0aGUgUmVnaW9uLgorICAvLy8gQHJldHVybiBUaGUgZW50cnkgQmFzaWNCbG9jayBvZiB0aGUgcmVnaW9uLgorICBCYXNpY0Jsb2NrICpnZXRFbnRyeSgpIGNvbnN0IHsgcmV0dXJuIFJlZ2lvbk5vZGU6OmdldEVudHJ5KCk7IH0KKworICAvLy8gQGJyaWVmIEdldCB0aGUgZXhpdCBCYXNpY0Jsb2NrIG9mIHRoZSBSZWdpb24uCisgIC8vLyBAcmV0dXJuIFRoZSBleGl0IEJhc2ljQmxvY2sgb2YgdGhlIFJlZ2lvbiwgTlVMTCBpZiB0aGlzIGlzIHRoZSBUb3BMZXZlbAorICAvLy8gICAgICAgICBSZWdpb24uCisgIEJhc2ljQmxvY2sgKmdldEV4aXQoKSBjb25zdCB7IHJldHVybiBleGl0OyB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIHBhcmVudCBvZiB0aGUgUmVnaW9uLgorICAvLy8gQHJldHVybiBUaGUgcGFyZW50IG9mIHRoZSBSZWdpb24gb3IgTlVMTCBpZiB0aGlzIGlzIGEgdG9wIGxldmVsCisgIC8vLyAgICAgICAgIFJlZ2lvbi4KKyAgUmVnaW9uICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBSZWdpb25Ob2RlOjpnZXRQYXJlbnQoKTsgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBSZWdpb25Ob2RlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBSZWdpb24uCisgIC8vLyBAcmV0dXJuIFRoZSBSZWdpb25Ob2RlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBSZWdpb24uCisgIFJlZ2lvbk5vZGUqIGdldE5vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UmVnaW9uTm9kZSo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVnaW9uTm9kZSo+KHRoaXMpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBuZXN0aW5nIGxldmVsIG9mIHRoaXMgUmVnaW9uLgorICAvLy8KKyAgLy8vIEFuIHRvcGxldmVsIFJlZ2lvbiBoYXMgZGVwdGggMC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIFRoZSBkZXB0aCBvZiB0aGUgcmVnaW9uLgorICB1bnNpZ25lZCBnZXREZXB0aCgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgSXMgdGhpcyBhIHNpbXBsZSByZWdpb24/CisgIC8vLworICAvLy8gQSByZWdpb24gaXMgc2ltcGxlIGlmIGl0IGhhcyBleGFjdGx5IG9uZSBleGl0IGFuZCBvbmUgZW50cnkgZWRnZS4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIFRydWUgaWYgdGhlIFJlZ2lvbiBpcyBzaW1wbGUuCisgIGJvb2wgaXNTaW1wbGUoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFJlZ2lvbi4KKyAgLy8vIEByZXR1cm4gVGhlIE5hbWUgb2YgdGhlIFJlZ2lvbi4KKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZVN0cigpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBSZWdpb25JbmZvIG9iamVjdCwgdGhhdCBiZWxvbmdzIHRvIHRoaXMgUmVnaW9uLgorICBSZWdpb25JbmZvICpnZXRSZWdpb25JbmZvKCkgY29uc3QgeworICAgIHJldHVybiBSSTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUHJpbnQgdGhlIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gT1MgVGhlIG91dHB1dCBzdHJlYW0gdGhlIFJlZ2lvbiBpcyBwcmludGVkIHRvLgorICAvLy8gQHBhcmFtIHByaW50VHJlZSBQcmludCBhbHNvIHRoZSB0cmVlIG9mIHN1YnJlZ2lvbnMuCisgIC8vLyBAcGFyYW0gbGV2ZWwgVGhlIGluZGVudGF0aW9uIGxldmVsIHVzZWQgZm9yIHByaW50aW5nLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtJiBPUywgYm9vbCBwcmludFRyZWUgPSB0cnVlLCB1bnNpZ25lZCBsZXZlbCA9IDApIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUHJpbnQgdGhlIHJlZ2lvbiB0byBzdGRlcnIuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgQ2hlY2sgaWYgdGhlIHJlZ2lvbiBjb250YWlucyBhIEJhc2ljQmxvY2suCisgIC8vLworICAvLy8gQHBhcmFtIEJCIFRoZSBCYXNpY0Jsb2NrIHRoYXQgbWlnaHQgYmUgY29udGFpbmVkIGluIHRoaXMgUmVnaW9uLgorICAvLy8gQHJldHVybiBUcnVlIGlmIHRoZSBibG9jayBpcyBjb250YWluZWQgaW4gdGhlIHJlZ2lvbiBvdGhlcndpc2UgZmFsc2UuCisgIGJvb2wgY29udGFpbnMoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgQ2hlY2sgaWYgdGhlIHJlZ2lvbiBjb250YWlucyBhbm90aGVyIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gU3ViUmVnaW9uIFRoZSByZWdpb24gdGhhdCBtaWdodCBiZSBjb250YWluZWQgaW4gdGhpcyBSZWdpb24uCisgIC8vLyBAcmV0dXJuIFRydWUgaWYgU3ViUmVnaW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVnaW9uIG90aGVyd2lzZSBmYWxzZS4KKyAgYm9vbCBjb250YWlucyhjb25zdCBSZWdpb24gKlN1YlJlZ2lvbikgY29uc3QgeworICAgIC8vIFRvcGxldmVsIFJlZ2lvbi4KKyAgICBpZiAoIWdldEV4aXQoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGNvbnRhaW5zKFN1YlJlZ2lvbi0+Z2V0RW50cnkoKSkKKyAgICAgICYmIChjb250YWlucyhTdWJSZWdpb24tPmdldEV4aXQoKSkgfHwgU3ViUmVnaW9uLT5nZXRFeGl0KCkgPT0gZ2V0RXhpdCgpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQ2hlY2sgaWYgdGhlIHJlZ2lvbiBjb250YWlucyBhbiBJbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gSW5zdCBUaGUgSW5zdHJ1Y3Rpb24gdGhhdCBtaWdodCBiZSBjb250YWluZWQgaW4gdGhpcyByZWdpb24uCisgIC8vLyBAcmV0dXJuIFRydWUgaWYgdGhlIEluc3RydWN0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVnaW9uIG90aGVyd2lzZSBmYWxzZS4KKyAgYm9vbCBjb250YWlucyhjb25zdCBJbnN0cnVjdGlvbiAqSW5zdCkgY29uc3QgeworICAgIHJldHVybiBjb250YWlucyhJbnN0LT5nZXRQYXJlbnQoKSk7CisgIH0KKworICAvLy8gQGJyaWVmIENoZWNrIGlmIHRoZSByZWdpb24gY29udGFpbnMgYSBsb29wLgorICAvLy8KKyAgLy8vIEBwYXJhbSBMIFRoZSBsb29wIHRoYXQgbWlnaHQgYmUgY29udGFpbmVkIGluIHRoaXMgcmVnaW9uLgorICAvLy8gQHJldHVybiBUcnVlIGlmIHRoZSBsb29wIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVnaW9uIG90aGVyd2lzZSBmYWxzZS4KKyAgLy8vICAgICAgICAgSW4gY2FzZSBhIE5VTEwgcG9pbnRlciBpcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiB0aGUgcmVzdWx0CisgIC8vLyAgICAgICAgIGlzIGZhbHNlLCBleGNlcHQgZm9yIHRoZSByZWdpb24gdGhhdCBkZXNjcmliZXMgdGhlIHdob2xlIGZ1bmN0aW9uLgorICAvLy8gICAgICAgICBJbiB0aGF0IGNhc2UgdHJ1ZSBpcyByZXR1cm5lZC4KKyAgYm9vbCBjb250YWlucyhjb25zdCBMb29wICpMKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgb3V0ZXJtb3N0IGxvb3AgaW4gdGhlIHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGEgbG9vcC4KKyAgLy8vCisgIC8vLyBGaW5kIGZvciBhIExvb3AgTCB0aGUgb3V0ZXJtb3N0IGxvb3AgT3V0ZXJMIHRoYXQgaXMgYSBwYXJlbnQgbG9vcCBvZiBMCisgIC8vLyBhbmQgaXMgaXRzZWxmIGNvbnRhaW5lZCBpbiB0aGUgcmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBMIFRoZSBsb29wIHRoZSBsb29rdXAgaXMgc3RhcnRlZC4KKyAgLy8vIEByZXR1cm4gVGhlIG91dGVybW9zdCBsb29wIGluIHRoZSByZWdpb24sIE5VTEwgaWYgc3VjaCBhIGxvb3AgZG9lcyBub3QKKyAgLy8vICAgICAgICAgZXhpc3Qgb3IgaWYgdGhlIHJlZ2lvbiBkZXNjcmliZXMgdGhlIHdob2xlIGZ1bmN0aW9uLgorICBMb29wICpvdXRlcm1vc3RMb29wSW5SZWdpb24oTG9vcCAqTCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIG91dGVybW9zdCBsb29wIGluIHRoZSByZWdpb24gdGhhdCBjb250YWlucyBhIGJhc2ljIGJsb2NrLgorICAvLy8KKyAgLy8vIEZpbmQgZm9yIGEgYmFzaWMgYmxvY2sgQkIgdGhlIG91dGVybW9zdCBsb29wIEwgdGhhdCBjb250YWlucyBCQiBhbmQgaXMKKyAgLy8vIGl0c2VsZiBjb250YWluZWQgaW4gdGhlIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gTEkgQSBwb2ludGVyIHRvIGEgTG9vcEluZm8gYW5hbHlzaXMuCisgIC8vLyBAcGFyYW0gQkIgVGhlIGJhc2ljIGJsb2NrIHN1cnJvdW5kZWQgYnkgdGhlIGxvb3AuCisgIC8vLyBAcmV0dXJuIFRoZSBvdXRlcm1vc3QgbG9vcCBpbiB0aGUgcmVnaW9uLCBOVUxMIGlmIHN1Y2ggYSBsb29wIGRvZXMgbm90CisgIC8vLyAgICAgICAgIGV4aXN0IG9yIGlmIHRoZSByZWdpb24gZGVzY3JpYmVzIHRoZSB3aG9sZSBmdW5jdGlvbi4KKyAgTG9vcCAqb3V0ZXJtb3N0TG9vcEluUmVnaW9uKExvb3BJbmZvICpMSSwgQmFzaWNCbG9jayogQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBzdWJyZWdpb24gdGhhdCBzdGFydHMgYXQgYSBCYXNpY0Jsb2NrCisgIC8vLworICAvLy8gQHBhcmFtIEJCIFRoZSBCYXNpY0Jsb2NrIHRoZSBzdWJyZWdpb24gc2hvdWxkIHN0YXJ0LgorICAvLy8gQHJldHVybiBUaGUgU3VicmVnaW9uIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIE5VTEwuCisgIFJlZ2lvbiogZ2V0U3ViUmVnaW9uTm9kZShCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIFJlZ2lvbk5vZGUgZm9yIGEgQmFzaWNCbG9jaworICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgQmFzaWNCbG9jayBhdCB3aGljaCB0aGUgUmVnaW9uTm9kZSBzaG91bGQgc3RhcnQuCisgIC8vLyBAcmV0dXJuIElmIGF2YWlsYWJsZSwgdGhlIFJlZ2lvbk5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBzdWJyZWdpb24KKyAgLy8vICAgICAgICAgc3RhcnRpbmcgYXQgQkIuIElmIG5vIHN1YnJlZ2lvbiBzdGFydHMgYXQgQkIsIHRoZSBSZWdpb25Ob2RlCisgIC8vLyAgICAgICAgIHJlcHJlc2VudGluZyBCQi4KKyAgUmVnaW9uTm9kZSogZ2V0Tm9kZShCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIEJhc2ljQmxvY2sgUmVnaW9uTm9kZSBmb3IgYSBCYXNpY0Jsb2NrCisgIC8vLworICAvLy8gQHBhcmFtIEJCIFRoZSBCYXNpY0Jsb2NrIGZvciB3aGljaCB0aGUgUmVnaW9uTm9kZSBpcyByZXF1ZXN0ZWQuCisgIC8vLyBAcmV0dXJuIFRoZSBSZWdpb25Ob2RlIHJlcHJlc2VudGluZyB0aGUgQkIuCisgIFJlZ2lvbk5vZGUqIGdldEJCTm9kZShCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBBZGQgYSBuZXcgc3VicmVnaW9uIHRvIHRoaXMgUmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBTdWJSZWdpb24gVGhlIG5ldyBzdWJyZWdpb24gdGhhdCB3aWxsIGJlIGFkZGVkLgorICB2b2lkIGFkZFN1YlJlZ2lvbihSZWdpb24gKlN1YlJlZ2lvbik7CisKKyAgLy8vIEBicmllZiBSZW1vdmUgYSBzdWJyZWdpb24gZnJvbSB0aGlzIFJlZ2lvbi4KKyAgLy8vCisgIC8vLyBUaGUgc3VicmVnaW9uIGlzIG5vdCBkZWxldGVkLCBhcyBpdCB3aWxsIHByb2JhYmx5IGJlIGluc2VydGVkIGludG8gYW5vdGhlcgorICAvLy8gcmVnaW9uLgorICAvLy8gQHBhcmFtIFN1YlJlZ2lvbiBUaGUgU3ViUmVnaW9uIHRoYXQgd2lsbCBiZSByZW1vdmVkLgorICBSZWdpb24gKnJlbW92ZVN1YlJlZ2lvbihSZWdpb24gKlN1YlJlZ2lvbik7CisKKyAgLy8vIEBicmllZiBNb3ZlIGFsbCBkaXJlY3QgY2hpbGQgbm9kZXMgb2YgdGhpcyBSZWdpb24gdG8gYW5vdGhlciBSZWdpb24uCisgIC8vLworICAvLy8gQHBhcmFtIFRvIFRoZSBSZWdpb24gdGhlIGNoaWxkIG5vZGVzIHdpbGwgYmUgdHJhbnNmZXJlZCB0by4KKyAgdm9pZCB0cmFuc2ZlckNoaWxkcmVuVG8oUmVnaW9uICpUbyk7CisKKyAgLy8vIEBicmllZiBWZXJpZnkgaWYgdGhlIHJlZ2lvbiBpcyBhIGNvcnJlY3QgcmVnaW9uLgorICAvLy8KKyAgLy8vIENoZWNrIGlmIHRoaXMgaXMgYSBjb3JyZWN0bHkgYnVpbGQgUmVnaW9uLiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjaGVjaywgYXMKKyAgLy8vIHRoZSBjb21wbGV0ZSBDRkcgb2YgdGhlIFJlZ2lvbiB3aWxsIGJlIHdhbGtlZC4KKyAgdm9pZCB2ZXJpZnlSZWdpb24oKSBjb25zdDsKKworICAvLy8gQGJyaWVmIENsZWFyIHRoZSBjYWNoZSBmb3IgQkIgUmVnaW9uTm9kZXMuCisgIC8vLworICAvLy8gQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSBCYXNpY0Jsb2NrIFJlZ2lvbk5vZGVzIHdpbGwgYmUgc3RvcmVkIGF0CisgIC8vLyBkaWZmZXJlbnQgbWVtb3J5IGxvY2F0aW9ucy4gUmVnaW9uTm9kZXMgb2J0YWluZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMKKyAgLy8vIGNhbGxlZCBhcmUgdGhlcmVmb3JlIG5vdCBjb21wYXJhYmxlIHRvIFJlZ2lvbk5vZGVzIGFidGFpbmVkIGFmdGVyd29yZHMuCisgIHZvaWQgY2xlYXJOb2RlQ2FjaGUoKTsKKworICAvLy8gQG5hbWUgU3VicmVnaW9uIEl0ZXJhdG9ycworICAvLy8KKyAgLy8vIFRoZXNlIGl0ZXJhdG9ycyBpdGVyYXRvciBvdmVyIGFsbCBzdWJyZWdpb25zIG9mIHRoaXMgUmVnaW9uLgorICAvL0B7CisgIHR5cGVkZWYgUmVnaW9uU2V0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiBSZWdpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gY2hpbGRyZW4uYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBjaGlsZHJlbi5lbmQoKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY2hpbGRyZW4uYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjaGlsZHJlbi5lbmQoKTsgfQorICAvL0B9CisKKyAgLy8vIEBuYW1lIEJhc2ljQmxvY2sgSXRlcmF0b3JzCisgIC8vLworICAvLy8gVGhlc2UgaXRlcmF0b3JzIGl0ZXJhdGUgb3ZlciBhbGwgQmFzaWNCbG9jayBSZWdpb25Ob2RlcyB0aGF0IGFyZQorICAvLy8gY29udGFpbmVkIGluIHRoaXMgUmVnaW9uLiBUaGUgaXRlcmF0b3IgYWxzbyBpdGVyYXRlcyBvdmVyIEJhc2ljQmxvY2tzCisgIC8vLyB0aGF0IGFyZSBlbGVtZW50cyBvZiBhIHN1YnJlZ2lvbiBvZiB0aGlzIFJlZ2lvbi4gSXQgaXMgdGhlcmVmb3JlIGNhbGxlZCBhCisgIC8vLyBmbGF0IGl0ZXJhdG9yLgorICAvL0B7CisgIHR5cGVkZWYgZGZfaXRlcmF0b3I8UmVnaW9uTm9kZSosIFNtYWxsUHRyU2V0PFJlZ2lvbk5vZGUqLCA4PiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8RmxhdEl0PFJlZ2lvbk5vZGUqPiA+ID4gYmxvY2tfaXRlcmF0b3I7CisKKyAgdHlwZWRlZiBkZl9pdGVyYXRvcjxjb25zdCBSZWdpb25Ob2RlKiwgU21hbGxQdHJTZXQ8Y29uc3QgUmVnaW9uTm9kZSosIDg+LAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBHcmFwaFRyYWl0czxGbGF0SXQ8Y29uc3QgUmVnaW9uTm9kZSo+ID4gPgorICAgICAgICAgICAgY29uc3RfYmxvY2tfaXRlcmF0b3I7CisKKyAgYmxvY2tfaXRlcmF0b3IgYmxvY2tfYmVnaW4oKTsKKyAgYmxvY2tfaXRlcmF0b3IgYmxvY2tfZW5kKCk7CisKKyAgY29uc3RfYmxvY2tfaXRlcmF0b3IgYmxvY2tfYmVnaW4oKSBjb25zdDsKKyAgY29uc3RfYmxvY2tfaXRlcmF0b3IgYmxvY2tfZW5kKCkgY29uc3Q7CisgIC8vQH0KKworICAvLy8gQG5hbWUgRWxlbWVudCBJdGVyYXRvcnMKKyAgLy8vCisgIC8vLyBUaGVzZSBpdGVyYXRvcnMgaXRlcmF0ZSBvdmVyIGFsbCBCYXNpY0Jsb2NrIGFuZCBzdWJyZWdpb24gUmVnaW9uTm9kZXMgdGhhdAorICAvLy8gYXJlIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGlzIFJlZ2lvbi4gSXQgZG9lcyBub3QgaXRlcmF0ZSBvdmVyIGFueQorICAvLy8gUmVnaW9uTm9kZXMgdGhhdCBhcmUgYWxzbyBlbGVtZW50IG9mIGEgc3VicmVnaW9uIG9mIHRoaXMgUmVnaW9uLgorICAvL0B7CisgIHR5cGVkZWYgZGZfaXRlcmF0b3I8UmVnaW9uTm9kZSosIFNtYWxsUHRyU2V0PFJlZ2lvbk5vZGUqLCA4PiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8UmVnaW9uTm9kZSo+ID4gZWxlbWVudF9pdGVyYXRvcjsKKworICB0eXBlZGVmIGRmX2l0ZXJhdG9yPGNvbnN0IFJlZ2lvbk5vZGUqLCBTbWFsbFB0clNldDxjb25zdCBSZWdpb25Ob2RlKiwgOD4sCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIEdyYXBoVHJhaXRzPGNvbnN0IFJlZ2lvbk5vZGUqPiA+CisgICAgICAgICAgICBjb25zdF9lbGVtZW50X2l0ZXJhdG9yOworCisgIGVsZW1lbnRfaXRlcmF0b3IgZWxlbWVudF9iZWdpbigpOworICBlbGVtZW50X2l0ZXJhdG9yIGVsZW1lbnRfZW5kKCk7CisKKyAgY29uc3RfZWxlbWVudF9pdGVyYXRvciBlbGVtZW50X2JlZ2luKCkgY29uc3Q7CisgIGNvbnN0X2VsZW1lbnRfaXRlcmF0b3IgZWxlbWVudF9lbmQoKSBjb25zdDsKKyAgLy9AfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBAYnJpZWYgQW5hbHlzaXMgdGhhdCBkZXRlY3RzIGFsbCBjYW5vbmljYWwgUmVnaW9ucy4KKy8vLworLy8vIFRoZSBSZWdpb25JbmZvIHBhc3MgZGV0ZWN0cyBhbGwgY2Fub25pY2FsIHJlZ2lvbnMgaW4gYSBmdW5jdGlvbi4gVGhlIFJlZ2lvbnMKKy8vLyBhcmUgY29ubmVjdGVkIHVzaW5nIHRoZSBwYXJlbnQgcmVsYXRpb24uIFRoaXMgYnVpbGRzIGEgUHJvZ3JhbSBTdHJ1Y3R1cmUKKy8vLyBUcmVlLgorY2xhc3MgUmVnaW9uSW5mbyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICB0eXBlZGVmIERlbnNlTWFwPEJhc2ljQmxvY2sqLEJhc2ljQmxvY2sqPiBCQnRvQkJNYXA7CisgIHR5cGVkZWYgRGVuc2VNYXA8QmFzaWNCbG9jayosIFJlZ2lvbio+IEJCdG9SZWdpb25NYXA7CisgIHR5cGVkZWYgU21hbGxQdHJTZXQ8UmVnaW9uKiwgND4gUmVnaW9uU2V0OworCisgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgUmVnaW9uSW5mbyhjb25zdCBSZWdpb25JbmZvICYpOworICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIGNvbnN0IFJlZ2lvbkluZm8gJm9wZXJhdG9yPShjb25zdCBSZWdpb25JbmZvICYpOworCisgIERvbWluYXRvclRyZWUgKkRUOworICBQb3N0RG9taW5hdG9yVHJlZSAqUERUOworICBEb21pbmFuY2VGcm9udGllciAqREY7CisKKyAgLy8vIFRoZSB0b3AgbGV2ZWwgcmVnaW9uLgorICBSZWdpb24gKlRvcExldmVsUmVnaW9uOworCisgIC8vLyBNYXAgZXZlcnkgQkIgdG8gdGhlIHNtYWxsZXN0IHJlZ2lvbiwgdGhhdCBjb250YWlucyBCQi4KKyAgQkJ0b1JlZ2lvbk1hcCBCQnRvUmVnaW9uOworCisgIC8vIGlzQ29tbW9uRG9tRnJvbnRpZXIgLSBSZXR1cm5zIHRydWUgaWYgQkIgaXMgaW4gdGhlIGRvbWluYW5jZSBmcm9udGllciBvZgorICAvLyBlbnRyeSwgYmVjYXVzZSBpdCB3YXMgaW5oZXJpdGVkIGZyb20gZXhpdC4gSW4gdGhlIG90aGVyIGNhc2UgdGhlcmUgaXMgYW4KKyAgLy8gZWRnZSBnb2luZyBmcm9tIGVudHJ5IHRvIEJCIHdpdGhvdXQgcGFzc2luZyBleGl0LgorICBib29sIGlzQ29tbW9uRG9tRnJvbnRpZXIoQmFzaWNCbG9jayogQkIsIEJhc2ljQmxvY2sqIGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayogZXhpdCkgY29uc3Q7CisKKyAgLy8gaXNSZWdpb24gLSBDaGVjayBpZiBlbnRyeSBhbmQgZXhpdCBzdXJyb3VuZCBhIHZhbGlkIHJlZ2lvbiwgYmFzZWQgb24KKyAgLy8gZG9taW5hbmNlIHRyZWUgYW5kIGRvbWluYW5jZSBmcm9udGllci4KKyAgYm9vbCBpc1JlZ2lvbihCYXNpY0Jsb2NrKiBlbnRyeSwgQmFzaWNCbG9jayogZXhpdCkgY29uc3Q7CisKKyAgLy8gaW5zZXJ0U2hvcnRDdXQgLSBTYXZlcyBhIHNob3J0Y3V0IHBvaW50aW5nIGZyb20gZW50cnkgdG8gZXhpdC4KKyAgLy8gVGhpcyBmdW5jdGlvbiBtYXkgZXh0ZW5kIHRoaXMgc2hvcnRjdXQgaWYgcG9zc2libGUuCisgIHZvaWQgaW5zZXJ0U2hvcnRDdXQoQmFzaWNCbG9jayogZW50cnksIEJhc2ljQmxvY2sqIGV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgQkJ0b0JCTWFwKiBTaG9ydEN1dCkgY29uc3Q7CisKKyAgLy8gZ2V0TmV4dFBvc3REb20gLSBSZXR1cm5zIHRoZSBuZXh0IEJCIHRoYXQgcG9zdGRvbWluYXRlcyBOLCB3aGlsZSBza2lwcGluZworICAvLyBhbGwgcG9zdCBkb21pbmF0b3JzIHRoYXQgY2Fubm90IGZpbmlzaCBhIGNhbm9uaWNhbCByZWdpb24uCisgIERvbVRyZWVOb2RlICpnZXROZXh0UG9zdERvbShEb21UcmVlTm9kZSogTiwgQkJ0b0JCTWFwICpTaG9ydEN1dCkgY29uc3Q7CisKKyAgLy8gaXNUcml2aWFsUmVnaW9uIC0gQSByZWdpb24gaXMgdHJpdmlhbCwgaWYgaXQgY29udGFpbnMgb25seSBvbmUgQkIuCisgIGJvb2wgaXNUcml2aWFsUmVnaW9uKEJhc2ljQmxvY2sgKmVudHJ5LCBCYXNpY0Jsb2NrICpleGl0KSBjb25zdDsKKworICAvLyBjcmVhdGVSZWdpb24gLSBDcmVhdGVzIGEgc2luZ2xlIGVudHJ5IHNpbmdsZSBleGl0IHJlZ2lvbi4KKyAgUmVnaW9uICpjcmVhdGVSZWdpb24oQmFzaWNCbG9jayAqZW50cnksIEJhc2ljQmxvY2sgKmV4aXQpOworCisgIC8vIGZpbmRSZWdpb25zV2l0aEVudHJ5IC0gRGV0ZWN0IGFsbCByZWdpb25zIHN0YXJ0aW5nIHdpdGggYmIgJ2VudHJ5Jy4KKyAgdm9pZCBmaW5kUmVnaW9uc1dpdGhFbnRyeShCYXNpY0Jsb2NrICplbnRyeSwgQkJ0b0JCTWFwICpTaG9ydEN1dCk7CisKKyAgLy8gc2NhbkZvclJlZ2lvbnMgLSBEZXRlY3RzIHJlZ2lvbnMgaW4gRi4KKyAgdm9pZCBzY2FuRm9yUmVnaW9ucyhGdW5jdGlvbiAmRiwgQkJ0b0JCTWFwICpTaG9ydEN1dCk7CisKKyAgLy8gZ2V0VG9wTW9zdFBhcmVudCAtIEdldCB0aGUgdG9wIG1vc3QgcGFyZW50IHdpdGggdGhlIHNhbWUgZW50cnkgYmxvY2suCisgIFJlZ2lvbiAqZ2V0VG9wTW9zdFBhcmVudChSZWdpb24gKnJlZ2lvbik7CisKKyAgLy8gYnVpbGRSZWdpb25zVHJlZSAtIGJ1aWxkIHRoZSByZWdpb24gaGllcmFyY2h5IGFmdGVyIGFsbCByZWdpb24gZGV0ZWN0ZWQuCisgIHZvaWQgYnVpbGRSZWdpb25zVHJlZShEb21UcmVlTm9kZSAqTiwgUmVnaW9uICpyZWdpb24pOworCisgIC8vIENhbGN1bGF0ZSAtIGRldGVjdGUgYWxsIHJlZ2lvbnMgaW4gZnVuY3Rpb24gYW5kIGJ1aWxkIHRoZSByZWdpb24gdHJlZS4KKyAgdm9pZCBDYWxjdWxhdGUoRnVuY3Rpb24mIEYpOworCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworCisgIC8vIHVwZGF0ZVN0YXRpc3RpY3MgLSBVcGRhdGUgc3RhdGlzdGljIGFib3V0IGNyZWF0ZWQgcmVnaW9ucy4KKyAgdm9pZCB1cGRhdGVTdGF0aXN0aWNzKFJlZ2lvbiAqUik7CisKKyAgLy8gaXNTaW1wbGUgLSBDaGVjayBpZiBhIHJlZ2lvbiBpcyBhIHNpbXBsZSByZWdpb24gd2l0aCBleGFjdGx5IG9uZSBlbnRyeQorICAvLyBlZGdlIGFuZCBleGFjdGx5IG9uZSBleGl0IGVkZ2UuCisgIGJvb2wgaXNTaW1wbGUoUmVnaW9uKiBSKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgZXhwbGljaXQgUmVnaW9uSW5mbygpOworCisgIH5SZWdpb25JbmZvKCk7CisKKyAgLy8vIEBuYW1lIEZ1bmN0aW9uUGFzcyBpbnRlcmZhY2UKKyAgLy9AeworICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7CisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICopIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdDsKKyAgLy9AfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBzbWFsbGVzdCByZWdpb24gdGhhdCBjb250YWlucyBhIEJhc2ljQmxvY2suCisgIC8vLworICAvLy8gQHBhcmFtIEJCIFRoZSBiYXNpYyBibG9jay4KKyAgLy8vIEByZXR1cm4gVGhlIHNtYWxsZXN0IHJlZ2lvbiwgdGhhdCBjb250YWlucyBCQiBvciBOVUxMLCBpZiB0aGVyZSBpcyBubworICAvLy8gcmVnaW9uIGNvbnRhaW5pbmcgQkIuCisgIFJlZ2lvbiAqZ2V0UmVnaW9uRm9yKEJhc2ljQmxvY2sgKkJCKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEEgc2hvcnRjdXQgZm9yIGdldFJlZ2lvbkZvcigpLgorICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgYmFzaWMgYmxvY2suCisgIC8vLyBAcmV0dXJuIFRoZSBzbWFsbGVzdCByZWdpb24sIHRoYXQgY29udGFpbnMgQkIgb3IgTlVMTCwgaWYgdGhlcmUgaXMgbm8KKyAgLy8vIHJlZ2lvbiBjb250YWluaW5nIEJCLgorICBSZWdpb24gKm9wZXJhdG9yW10oQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBleGl0IG9mIHRoZSBtYXhpbWFsIHJlZmluZWQgcmVnaW9uLCB0aGF0IHN0YXJ0cyBhdCBhCisgIC8vLyBCYXNpY0Jsb2NrLgorICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgQmFzaWNCbG9jayB0aGUgcmVmaW5lZCByZWdpb24gc3RhcnRzLgorICBCYXNpY0Jsb2NrICpnZXRNYXhSZWdpb25FeGl0KEJhc2ljQmxvY2sgKkJCKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEZpbmQgdGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIHR3byByZWdpb25zLgorICAvLy8KKyAgLy8vIEBwYXJhbSBBIFRoZSBmaXJzdCByZWdpb24uCisgIC8vLyBAcGFyYW0gQiBUaGUgc2Vjb25kIHJlZ2lvbi4KKyAgLy8vIEByZXR1cm4gVGhlIHNtYWxsZXN0IHJlZ2lvbiBjb250YWluaW5nIEEgYW5kIEIuCisgIFJlZ2lvbiAqZ2V0Q29tbW9uUmVnaW9uKFJlZ2lvbiogQSwgUmVnaW9uICpCKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEZpbmQgdGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIHR3byBiYXNpYyBibG9ja3MuCisgIC8vLworICAvLy8gQHBhcmFtIEEgVGhlIGZpcnN0IGJhc2ljIGJsb2NrLgorICAvLy8gQHBhcmFtIEIgVGhlIHNlY29uZCBiYXNpYyBibG9jay4KKyAgLy8vIEByZXR1cm4gVGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIEEgYW5kIEIuCisgIFJlZ2lvbiogZ2V0Q29tbW9uUmVnaW9uKEJhc2ljQmxvY2sqIEEsIEJhc2ljQmxvY2sgKkIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q29tbW9uUmVnaW9uKGdldFJlZ2lvbkZvcihBKSwgZ2V0UmVnaW9uRm9yKEIpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRmluZCB0aGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgY29udGFpbnMgYSBzZXQgb2YgcmVnaW9ucy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUmVnaW9ucyBBIHZlY3RvciBvZiByZWdpb25zLgorICAvLy8gQHJldHVybiBUaGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgY29udGFpbnMgYWxsIHJlZ2lvbnMgaW4gUmVnaW9ucy4KKyAgUmVnaW9uKiBnZXRDb21tb25SZWdpb24oU21hbGxWZWN0b3JJbXBsPFJlZ2lvbio+ICZSZWdpb25zKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEZpbmQgdGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGEgc2V0IG9mIGJhc2ljIGJsb2Nrcy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQkJzIEEgdmVjdG9yIG9mIGJhc2ljIGJsb2Nrcy4KKyAgLy8vIEByZXR1cm4gVGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGFsbCBiYXNpYyBibG9ja3MgaW4gQkJTLgorICBSZWdpb24qIGdldENvbW1vblJlZ2lvbihTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayo+ICZCQnMpIGNvbnN0OworCisgIFJlZ2lvbiAqZ2V0VG9wTGV2ZWxSZWdpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFRvcExldmVsUmVnaW9uOworICB9CisKKyAgLy8vIEBicmllZiBDbGVhciB0aGUgTm9kZSBDYWNoZSBmb3IgYWxsIFJlZ2lvbnMuCisgIC8vLworICAvLy8gQHNlZSBSZWdpb246OmNsZWFyTm9kZUNhY2hlKCkKKyAgdm9pZCBjbGVhck5vZGVDYWNoZSgpIHsKKyAgICBpZiAoVG9wTGV2ZWxSZWdpb24pCisgICAgICBUb3BMZXZlbFJlZ2lvbi0+Y2xlYXJOb2RlQ2FjaGUoKTsKKyAgfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVnaW9uTm9kZSAmTm9kZSkgeworICBpZiAoTm9kZS5pc1N1YlJlZ2lvbigpKQorICAgIHJldHVybiBPUyA8PCBOb2RlLmdldE5vZGVBczxSZWdpb24+KCktPmdldE5hbWVTdHIoKTsKKyAgZWxzZQorICAgIHJldHVybiBPUyA8PCBOb2RlLmdldE5vZGVBczxCYXNpY0Jsb2NrPigpLT5nZXROYW1lU3RyKCk7Cit9Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25JdGVyYXRvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkNWI1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25JdGVyYXRvci5oCkBAIC0wLDAgKzEsMzQyIEBACisvLz09PS0gUmVnaW9uSXRlcmF0b3IuaCAtIEl0ZXJhdG9ycyB0byBpdGVyYXRhdGUgb3ZlciBSZWdpb25zIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGl0ZXJhdG9ycyB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgUmVnaW9uLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9BTkFMWVNJU19SRUdJT05fSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1JFR0lPTl9JVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQGJyaWVmIEhpZXJhY2hpY2FsIFJlZ2lvbk5vZGUgc3VjY2Vzc29yIGl0ZXJhdG9yLgorLy8vCisvLy8gVGhpcyBpdGVyYXRvciBpdGVyYXRlcyBvdmVyIGFsbCBzdWNjZXNzb3JzIG9mIGEgUmVnaW9uTm9kZS4KKy8vLworLy8vIEZvciBhIEJhc2ljQmxvY2sgUmVnaW9uTm9kZSBpdCBza2lwcyBhbGwgQmFzaWNCbG9ja3MgdGhhdCBhcmUgbm90IHBhcnQgb2YKKy8vLyB0aGUgcGFyZW50IFJlZ2lvbi4gIEZ1cnRoZXJtb3JlIGZvciBCYXNpY0Jsb2NrcyB0aGF0IHN0YXJ0IGEgc3VicmVnaW9uLCBhCisvLy8gUmVnaW9uTm9kZSByZXByZXNlbnRpbmcgdGhlIHN1YnJlZ2lvbiBpcyByZXR1cm5lZC4KKy8vLworLy8vIEZvciBhIHN1YnJlZ2lvbiBSZWdpb25Ob2RlIHRoZXJlIGlzIGp1c3Qgb25lIHN1Y2Nlc3Nvci4gVGhlIFJlZ2lvbk5vZGUKKy8vLyByZXByZXNlbnRpbmcgdGhlIGV4aXQgb2YgdGhlIHN1YnJlZ2lvbi4KK3RlbXBsYXRlPGNsYXNzIE5vZGVUeXBlPgorY2xhc3MgUk5TdWNjSXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVUeXBlLCBwdHJkaWZmX3Q+Cit7CisgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBOb2RlVHlwZSwgcHRyZGlmZl90PiBzdXBlcjsKKyAgLy8gVGhlIGl0ZXJhdG9yIHdvcmtzIGluIHR3byBtb2RlcywgYmIgbW9kZSBvciByZWdpb24gbW9kZS4KKyAgZW51bSBJdE1vZGV7CisgICAgLy8gSW4gQkIgbW9kZSBpdCByZXR1cm5zIGFsbCBzdWNjZXNzb3JzIG9mIHRoaXMgQmFzaWNCbG9jayBhcyBpdHMKKyAgICAvLyBzdWNjZXNzb3JzLgorICAgIEl0QkIsCisgICAgLy8gSW4gcmVnaW9uIG1vZGUgdGhlcmUgaXMgb25seSBvbmUgc3VjY2Vzc29yLCB0aGF0cyB0aGUgcmVnaW9ubm9kZSBtYXBwaW5nCisgICAgLy8gdG8gdGhlIGV4aXQgYmxvY2sgb2YgdGhlIHJlZ2lvbm5vZGUKKyAgICBJdFJnQmVnaW4sIC8vIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZ2lvbm5vZGUgc3VjY2Vzc29yLgorICAgIEl0UmdFbmQgICAgLy8gQXQgdGhlIGVuZCBvZiB0aGUgcmVnaW9ubm9kZSBzdWNjZXNzb3IuCisgIH07CisKKyAgLy8gVXNlIHR3byBiaXQgdG8gcmVwcmVzZW50IHRoZSBtb2RlIGl0ZXJhdG9yLgorICBQb2ludGVySW50UGFpcjxOb2RlVHlwZSosIDIsIGVudW0gSXRNb2RlPiBOb2RlOworCisgIC8vIFRoZSBibG9jayBzdWNjZXNzb3IgaXRlcmF0b3IuCisgIHN1Y2NfaXRlcmF0b3IgQkl0b3I7CisKKyAgLy8gYWR2YW5jZVJlZ2lvblN1Y2MgLSBBIHJlZ2lvbiBub2RlIGhhcyBvbmx5IG9uZSBzdWNjZXNzb3IuIEl0IHJlYWNoZXMgZW5kCisgIC8vIG9uY2Ugd2UgYWR2YW5jZSBpdC4KKyAgdm9pZCBhZHZhbmNlUmVnaW9uU3VjYygpIHsKKyAgICBhc3NlcnQoTm9kZS5nZXRJbnQoKSA9PSBJdFJnQmVnaW4gJiYgIkNhbm5vdCBhZHZhbmNlIHJlZ2lvbiBzdWNjZXNzb3IhIik7CisgICAgTm9kZS5zZXRJbnQoSXRSZ0VuZCk7CisgIH0KKworICBOb2RlVHlwZSogZ2V0Tm9kZSgpIGNvbnN0eyByZXR1cm4gTm9kZS5nZXRQb2ludGVyKCk7IH0KKworICAvLyBpc1JlZ2lvbk1vZGUgLSBJcyB0aGUgY3VycmVudCBpdGVyYXRvciBpbiByZWdpb24gbW9kZT8KKyAgYm9vbCBpc1JlZ2lvbk1vZGUoKSBjb25zdCB7IHJldHVybiBOb2RlLmdldEludCgpICE9IEl0QkI7IH0KKworICAvLyBHZXQgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3IuIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBhIEJhc2ljIEJsb2NrCisgIC8vIFJlZ2lvbk5vZGUgb3IgYSBzdWJyZWdpb24gUmVnaW9uTm9kZS4KKyAgUmVnaW9uTm9kZSogZ2V0SVN1Y2MoQmFzaWNCbG9jayogQkIpIGNvbnN0IHsKKyAgICBSZWdpb25Ob2RlICpzdWNjOworICAgIHN1Y2MgPSBnZXROb2RlKCktPmdldFBhcmVudCgpLT5nZXROb2RlKEJCKTsKKyAgICBhc3NlcnQoc3VjYyAmJiAiQkIgbm90IGluIFJlZ2lvbiBvciBlbnRlcmVkIHN1YnJlZ2lvbiEiKTsKKyAgICByZXR1cm4gc3VjYzsKKyAgfQorCisgIC8vIGdldFJlZ2lvblN1Y2MgLSBSZXR1cm4gdGhlIHN1Y2Nlc3NvciBiYXNpYyBibG9jayBvZiBhIFN1YlJlZ2lvbiBSZWdpb25Ob2RlLgorICBpbmxpbmUgQmFzaWNCbG9jayogZ2V0UmVnaW9uU3VjYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoTm9kZS5nZXRJbnQoKSA9PSBJdFJnQmVnaW4gJiYgIkNhbm5vdCBnZXQgdGhlIHJlZ2lvbiBzdWNjZXNzb3IhIik7CisgICAgcmV0dXJuIGdldE5vZGUoKS0+dGVtcGxhdGUgZ2V0Tm9kZUFzPFJlZ2lvbj4oKS0+Z2V0RXhpdCgpOworICB9CisKKyAgLy8gaXNFeGl0IC0gSXMgdGhpcyB0aGUgZXhpdCBCQiBvZiB0aGUgUmVnaW9uPworICBpbmxpbmUgYm9vbCBpc0V4aXQoQmFzaWNCbG9jayogQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Tm9kZSgpLT5nZXRQYXJlbnQoKS0+Z2V0RXhpdCgpID09IEJCOworICB9CitwdWJsaWM6CisgIHR5cGVkZWYgUk5TdWNjSXRlcmF0b3I8Tm9kZVR5cGU+IFNlbGY7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcjo6cG9pbnRlciBwb2ludGVyOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGJlZ2luIGl0ZXJhdG9yIG9mIGEgUmVnaW9uTm9kZS4KKyAgaW5saW5lIFJOU3VjY0l0ZXJhdG9yKE5vZGVUeXBlKiBub2RlKQorICAgIDogTm9kZShub2RlLCBub2RlLT5pc1N1YlJlZ2lvbigpID8gSXRSZ0JlZ2luIDogSXRCQiksCisgICAgQkl0b3Ioc3VjY19iZWdpbihub2RlLT5nZXRFbnRyeSgpKSkgeworCisKKyAgICAvLyBTa2lwIHRoZSBleGl0IGJsb2NrCisgICAgaWYgKCFpc1JlZ2lvbk1vZGUoKSkKKyAgICAgIHdoaWxlIChzdWNjX2VuZChub2RlLT5nZXRFbnRyeSgpKSAhPSBCSXRvciAmJiBpc0V4aXQoKkJJdG9yKSkKKyAgICAgICAgKytCSXRvcjsKKworICAgIGlmIChpc1JlZ2lvbk1vZGUoKSAmJiBpc0V4aXQoZ2V0UmVnaW9uU3VjYygpKSkKKyAgICAgIGFkdmFuY2VSZWdpb25TdWNjKCk7CisgIH0KKworICAvLy8gQGJyaWVmIENyZWF0ZSBhbiBlbmQgaXRlcmF0b3IuCisgIGlubGluZSBSTlN1Y2NJdGVyYXRvcihOb2RlVHlwZSogbm9kZSwgYm9vbCkKKyAgICA6IE5vZGUobm9kZSwgbm9kZS0+aXNTdWJSZWdpb24oKSA/IEl0UmdFbmQgOiBJdEJCKSwKKyAgICBCSXRvcihzdWNjX2VuZChub2RlLT5nZXRFbnRyeSgpKSkge30KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWdpb25Nb2RlKCkgPT0geC5pc1JlZ2lvbk1vZGUoKSAmJiAiQnJva2VuIGl0ZXJhdG9yISIpOworICAgIGlmIChpc1JlZ2lvbk1vZGUoKSkKKyAgICAgIHJldHVybiBOb2RlLmdldEludCgpID09IHguTm9kZS5nZXRJbnQoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQkl0b3IgPT0geC5CSXRvcjsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU2VsZiYgeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICBpbmxpbmUgcG9pbnRlciBvcGVyYXRvciooKSBjb25zdCB7CisgICAgQmFzaWNCbG9jayogQkIgPSBpc1JlZ2lvbk1vZGUoKSA/IGdldFJlZ2lvblN1Y2MoKSA6ICpCSXRvcjsKKyAgICBhc3NlcnQoIWlzRXhpdChCQikgJiYgIkl0ZXJhdG9yIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0SVN1Y2MoQkIpOworICB9CisKKyAgaW5saW5lIFNlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgaWYoaXNSZWdpb25Nb2RlKCkpIHsKKyAgICAgIC8vIFRoZSBSZWdpb24gb25seSBoYXMgMSBzdWNjZXNzb3IuCisgICAgICBhZHZhbmNlUmVnaW9uU3VjYygpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTa2lwIHRoZSBleGl0LgorICAgICAgZG8KKyAgICAgICAgKytCSXRvcjsKKyAgICAgIHdoaWxlIChCSXRvciAhPSBzdWNjX2VuZChnZXROb2RlKCktPmdldEVudHJ5KCkpCisgICAgICAgICAgJiYgaXNFeGl0KCpCSXRvcikpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIFNlbGYgdG1wID0gKnRoaXM7CisgICAgKysqdGhpczsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyAgaW5saW5lIGNvbnN0IFNlbGYgJm9wZXJhdG9yPShjb25zdCBTZWxmICZJKSB7CisgICAgaWYgKHRoaXMgIT0gJkkpIHsKKyAgICAgIGFzc2VydChnZXROb2RlKCktPmdldFBhcmVudCgpID09IEkuZ2V0Tm9kZSgpLT5nZXRQYXJlbnQoKQorICAgICAgICAgICAgICYmICJDYW5ub3QgYXNzaWduIGl0ZXJhdG9ycyBvZiB0d28gZGlmZmVyZW50IHJlZ2lvbnMhIik7CisgICAgICBOb2RlID0gSS5Ob2RlOworICAgICAgQkl0b3IgPSBJLkJJdG9yOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBAYnJpZWYgRmxhdCBSZWdpb25Ob2RlIGl0ZXJhdG9yLgorLy8vCisvLy8gVGhlIEZsYXQgUmVnaW9uIGl0ZXJhdG9yIHdpbGwgaXRlcmF0ZSBvdmVyIGFsbCBCYXNpY0Jsb2NrIFJlZ2lvbk5vZGVzIHRoYXQKKy8vLyBhcmUgY29udGFpbmVkIGluIHRoZSBSZWdpb24gYW5kIGl0cyBzdWJyZWdpb25zLiBUaGlzIGlzIGNsb3NlIHRvIGEgdmlydHVhbAorLy8vIGNvbnRyb2wgZmxvdyBncmFwaCBvZiB0aGUgUmVnaW9uLgordGVtcGxhdGU8Y2xhc3MgTm9kZVR5cGU+CitjbGFzcyBSTlN1Y2NJdGVyYXRvcjxGbGF0SXQ8Tm9kZVR5cGU+ID4KKyAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBOb2RlVHlwZSwgcHRyZGlmZl90PgoreworICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgTm9kZVR5cGUsIHB0cmRpZmZfdD4gc3VwZXI7CisgIE5vZGVUeXBlKiBOb2RlOworICBzdWNjX2l0ZXJhdG9yIEl0b3I7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBSTlN1Y2NJdGVyYXRvcjxGbGF0SXQ8Tm9kZVR5cGU+ID4gU2VsZjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcjo6cG9pbnRlciBwb2ludGVyOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIHRoZSBpdGVyYXRvciBmcm9tIGEgUmVnaW9uTm9kZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIGluY29taW5nIG5vZGUgbXVzdCBiZSBhIGJiIG5vZGUsIG90aGVyd2lzZSBpdCB3aWxsIHRyaWdnZXIKKyAgLy8vIGFuIGFzc2VydGlvbiB3aGVuIHdlIHRyeSB0byBnZXQgYSBCYXNpY0Jsb2NrLgorICBpbmxpbmUgUk5TdWNjSXRlcmF0b3IoTm9kZVR5cGUqIG5vZGUpIDogTm9kZShub2RlKSwKKyAgICBJdG9yKHN1Y2NfYmVnaW4obm9kZS0+Z2V0RW50cnkoKSkpIHsKKyAgICAgIGFzc2VydCghTm9kZS0+aXNTdWJSZWdpb24oKQorICAgICAgICAgICAgICYmICJTdWJyZWdpb24gbm9kZSBub3QgYWxsb3dlZCBpbiBmbGF0IGl0ZXJhdGluZyBtb2RlISIpOworICAgICAgYXNzZXJ0KE5vZGUtPmdldFBhcmVudCgpICYmICJBIEJCIG5vZGUgbXVzdCBoYXZlIGEgcGFyZW50ISIpOworCisgICAgICAvLyBTa2lwIHRoZSBleGl0IGJsb2NrIG9mIHRoZSBpdGVyYXRpbmcgcmVnaW9uLgorICAgICAgd2hpbGUgKHN1Y2NfZW5kKE5vZGUtPmdldEVudHJ5KCkpICE9IEl0b3IKKyAgICAgICAgICAmJiBOb2RlLT5nZXRQYXJlbnQoKS0+Z2V0RXhpdCgpID09ICpJdG9yKQorICAgICAgICArK0l0b3I7CisgIH0KKyAgLy8vIEBicmllZiBDcmVhdGUgYW4gZW5kIGl0ZXJhdG9yCisgIGlubGluZSBSTlN1Y2NJdGVyYXRvcihOb2RlVHlwZSogbm9kZSwgYm9vbCkgOiBOb2RlKG5vZGUpLAorICAgIEl0b3Ioc3VjY19lbmQobm9kZS0+Z2V0RW50cnkoKSkpIHsKKyAgICAgIGFzc2VydCghTm9kZS0+aXNTdWJSZWdpb24oKQorICAgICAgICAgICAgICYmICJTdWJyZWdpb24gbm9kZSBub3QgYWxsb3dlZCBpbiBmbGF0IGl0ZXJhdGluZyBtb2RlISIpOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTZWxmJiB4KSBjb25zdCB7CisgICAgYXNzZXJ0KE5vZGUtPmdldFBhcmVudCgpID09IHguTm9kZS0+Z2V0UGFyZW50KCkKKyAgICAgICAgICAgJiYgIkNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgcmVnaW9ucyEiKTsKKworICAgIHJldHVybiBJdG9yID09IHguSXRvciAmJiBOb2RlID09IHguTm9kZTsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU2VsZiYgeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICBpbmxpbmUgcG9pbnRlciBvcGVyYXRvciooKSBjb25zdCB7CisgICAgQmFzaWNCbG9jayogQkIgPSAqSXRvcjsKKworICAgIC8vIEdldCB0aGUgaXRlcmF0aW5nIHJlZ2lvbi4KKyAgICBSZWdpb24qIFBhcmVudCA9IE5vZGUtPmdldFBhcmVudCgpOworCisgICAgLy8gVGhlIG9ubHkgY2FzZSB0aGF0IHRoZSBzdWNjZXNzb3IgcmVhY2hlcyBvdXQgb2YgdGhlIHJlZ2lvbiBpcyBpdCByZWFjaGVzCisgICAgLy8gdGhlIGV4aXQgb2YgdGhlIHJlZ2lvbi4KKyAgICBhc3NlcnQoUGFyZW50LT5nZXRFeGl0KCkgIT0gQkIgJiYgIml0ZXJhdG9yIG91dCBvZiByYW5nZSEiKTsKKworICAgIHJldHVybiBQYXJlbnQtPmdldEJCTm9kZShCQik7CisgIH0KKworICBpbmxpbmUgU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICAvLyBTa2lwIHRoZSBleGl0IGJsb2NrIG9mIHRoZSBpdGVyYXRpbmcgcmVnaW9uLgorICAgIGRvCisgICAgICArK0l0b3I7CisgICAgd2hpbGUgKEl0b3IgIT0gc3VjY19lbmQoTm9kZS0+Z2V0RW50cnkoKSkKKyAgICAgICAgJiYgTm9kZS0+Z2V0UGFyZW50KCktPmdldEV4aXQoKSA9PSAqSXRvcik7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIFNlbGYgdG1wID0gKnRoaXM7CisgICAgKysqdGhpczsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyAgaW5saW5lIGNvbnN0IFNlbGYgJm9wZXJhdG9yPShjb25zdCBTZWxmICZJKSB7CisgICAgaWYgKHRoaXMgIT0gJkkpIHsKKyAgICAgIGFzc2VydChOb2RlLT5nZXRQYXJlbnQoKSA9PSBJLk5vZGUtPmdldFBhcmVudCgpCisgICAgICAgICAgICAgJiYgIkNhbm5vdCBhc3NpZ24gaXRlcmF0b3JzIHRvIHR3byBkaWZmZXJlbnQgcmVnaW9ucyEiKTsKKyAgICAgIE5vZGUgPSBJLk5vZGU7CisgICAgICBJdG9yID0gSS5JdG9yOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIE5vZGVUeXBlPgoraW5saW5lIFJOU3VjY0l0ZXJhdG9yPE5vZGVUeXBlPiBzdWNjX2JlZ2luKE5vZGVUeXBlKiBOb2RlKSB7CisgIHJldHVybiBSTlN1Y2NJdGVyYXRvcjxOb2RlVHlwZT4oTm9kZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIE5vZGVUeXBlPgoraW5saW5lIFJOU3VjY0l0ZXJhdG9yPE5vZGVUeXBlPiBzdWNjX2VuZChOb2RlVHlwZSogTm9kZSkgeworICByZXR1cm4gUk5TdWNjSXRlcmF0b3I8Tm9kZVR5cGU+KE5vZGUsIHRydWUpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJlZ2lvbk5vZGUgR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb24gc28gdGhlIGJicyBpbiB0aGUgcmVnaW9uIGNhbiBiZQorLy8gaXRlcmF0ZSBieSBnZW5lcmljIGdyYXBoIGl0ZXJhdG9ycy4KKy8vCisvLyBOb2RlVCBjYW4gZWl0aGVyIGJlIHJlZ2lvbiBub2RlIG9yIGNvbnN0IHJlZ2lvbiBub2RlLCBvdGhlcndpc2UgY2hpbGRfYmVnaW4KKy8vIGFuZCBjaGlsZF9lbmQgZmFpbC4KKworI2RlZmluZSBSZWdpb25Ob2RlR3JhcGhUcmFpdHMoTm9kZVQpIFwKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Tm9kZVQqPiB7IFwKKyAgdHlwZWRlZiBOb2RlVCBOb2RlVHlwZTsgXAorICB0eXBlZGVmIFJOU3VjY0l0ZXJhdG9yPE5vZGVUeXBlPiBDaGlsZEl0ZXJhdG9yVHlwZTsgXAorICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShOb2RlVHlwZSogTikgeyByZXR1cm4gTjsgfSBcCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsgXAorICAgIHJldHVybiBSTlN1Y2NJdGVyYXRvcjxOb2RlVHlwZT4oTik7IFwKKyAgfSBcCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7IFwKKyAgICByZXR1cm4gUk5TdWNjSXRlcmF0b3I8Tm9kZVR5cGU+KE4sIHRydWUpOyBcCisgIH0gXAorfTsgXAordGVtcGxhdGU8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8RmxhdEl0PE5vZGVUKj4gPiB7IFwKKyAgdHlwZWRlZiBOb2RlVCBOb2RlVHlwZTsgXAorICB0eXBlZGVmIFJOU3VjY0l0ZXJhdG9yPEZsYXRJdDxOb2RlVD4gPiBDaGlsZEl0ZXJhdG9yVHlwZTsgXAorICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShOb2RlVHlwZSogTikgeyByZXR1cm4gTjsgfSBcCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsgXAorICAgIHJldHVybiBSTlN1Y2NJdGVyYXRvcjxGbGF0SXQ8Tm9kZVR5cGU+ID4oTik7IFwKKyAgfSBcCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7IFwKKyAgICByZXR1cm4gUk5TdWNjSXRlcmF0b3I8RmxhdEl0PE5vZGVUeXBlPiA+KE4sIHRydWUpOyBcCisgIH0gXAorfQorCisjZGVmaW5lIFJlZ2lvbkdyYXBoVHJhaXRzKFJlZ2lvblQsIE5vZGVUKSBcCit0ZW1wbGF0ZTw+IHN0cnVjdCBHcmFwaFRyYWl0czxSZWdpb25UKj4gXAorICA6IHB1YmxpYyBHcmFwaFRyYWl0czxOb2RlVCo+IHsgXAorICB0eXBlZGVmIGRmX2l0ZXJhdG9yPE5vZGVUeXBlKj4gbm9kZXNfaXRlcmF0b3I7IFwKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoUmVnaW9uVCogUikgeyBcCisgICAgcmV0dXJuIFItPmdldE5vZGUoUi0+Z2V0RW50cnkoKSk7IFwKKyAgfSBcCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihSZWdpb25UKiBSKSB7IFwKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3I6OmJlZ2luKGdldEVudHJ5Tm9kZShSKSk7IFwKKyAgfSBcCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoUmVnaW9uVCogUikgeyBcCisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yOjplbmQoZ2V0RW50cnlOb2RlKFIpKTsgXAorICB9IFwKK307IFwKK3RlbXBsYXRlPD4gc3RydWN0IEdyYXBoVHJhaXRzPEZsYXRJdDxSZWdpb25UKj4gPiBcCisgIDogcHVibGljIEdyYXBoVHJhaXRzPEZsYXRJdDxOb2RlVCo+ID4geyBcCisgIHR5cGVkZWYgZGZfaXRlcmF0b3I8Tm9kZVR5cGUqLCBTbWFsbFB0clNldDxOb2RlVHlwZSosIDg+LCBmYWxzZSwgXAorICBHcmFwaFRyYWl0czxGbGF0SXQ8Tm9kZVR5cGUqPiA+ID4gbm9kZXNfaXRlcmF0b3I7IFwKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoUmVnaW9uVCogUikgeyBcCisgICAgcmV0dXJuIFItPmdldEJCTm9kZShSLT5nZXRFbnRyeSgpKTsgXAorICB9IFwKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKFJlZ2lvblQqIFIpIHsgXAorICAgIHJldHVybiBub2Rlc19pdGVyYXRvcjo6YmVnaW4oZ2V0RW50cnlOb2RlKFIpKTsgXAorICB9IFwKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChSZWdpb25UKiBSKSB7IFwKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3I6OmVuZChnZXRFbnRyeU5vZGUoUikpOyBcCisgIH0gXAorfQorCitSZWdpb25Ob2RlR3JhcGhUcmFpdHMoUmVnaW9uTm9kZSk7CitSZWdpb25Ob2RlR3JhcGhUcmFpdHMoY29uc3QgUmVnaW9uTm9kZSk7CisKK1JlZ2lvbkdyYXBoVHJhaXRzKFJlZ2lvbiwgUmVnaW9uTm9kZSk7CitSZWdpb25HcmFwaFRyYWl0cyhjb25zdCBSZWdpb24sIGNvbnN0IFJlZ2lvbk5vZGUpOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8UmVnaW9uSW5mbyo+CisgIDogcHVibGljIEdyYXBoVHJhaXRzPEZsYXRJdDxSZWdpb25Ob2RlKj4gPiB7CisgIHR5cGVkZWYgZGZfaXRlcmF0b3I8Tm9kZVR5cGUqLCBTbWFsbFB0clNldDxOb2RlVHlwZSosIDg+LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxGbGF0SXQ8Tm9kZVR5cGUqPiA+ID4gbm9kZXNfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoUmVnaW9uSW5mbyAqUkkpIHsKKyAgICByZXR1cm4gR3JhcGhUcmFpdHM8RmxhdEl0PFJlZ2lvbio+ID46OmdldEVudHJ5Tm9kZShSSS0+Z2V0VG9wTGV2ZWxSZWdpb24oKSk7CisgIH0KKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKFJlZ2lvbkluZm8qIFJJKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yOjpiZWdpbihnZXRFbnRyeU5vZGUoUkkpKTsKKyAgfQorICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKFJlZ2lvbkluZm8gKlJJKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yOjplbmQoZ2V0RW50cnlOb2RlKFJJKSk7CisgIH0KK307CisKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvblByaW50ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25QcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NzQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25QcmludGVyLmgKQEAgLTAsMCArMSwyNiBAQAorLy89PT0tLSBSZWdpb25QcmludGVyLmggLSBSZWdpb24gcHJpbnRlciBleHRlcm5hbCBpbnRlcmZhY2UgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBleHRlcm5hbCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGV4cGxpY2l0bHkKKy8vIGluc3RhbnRpYXRlIHRoZSByZWdpb24gcHJpbnRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUkVHSU9OUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUkVHSU9OUFJJTlRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVJlZ2lvblZpZXdlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVSZWdpb25Pbmx5Vmlld2VyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVJlZ2lvblByaW50ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUmVnaW9uT25seVByaW50ZXJQYXNzKCk7Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDg0ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5oCkBAIC0wLDAgKzEsNjczIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCAtIFNjYWxhciBFdm9sdXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBTY2FsYXJFdm9sdXRpb24gY2xhc3MgaXMgYW4gTExWTSBwYXNzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFuYWx5emUgYW5kCisvLyBjYXRlZ29yaXplIHNjYWxhciBleHByZXNzaW9ucyBpbiBsb29wcy4gIEl0IHNwZWNpYWxpemVzIGluIHJlY29nbml6aW5nCisvLyBnZW5lcmFsIGluZHVjdGlvbiB2YXJpYWJsZXMsIHJlcHJlc2VudGluZyB0aGVtIHdpdGggdGhlIGFic3RyYWN0IGFuZCBvcGFxdWUKKy8vIFNDRVYgY2xhc3MuICBHaXZlbiB0aGlzIGFuYWx5c2lzLCB0cmlwIGNvdW50cyBvZiBsb29wcyBhbmQgb3RoZXIgaW1wb3J0YW50CisvLyBwcm9wZXJ0aWVzIGNhbiBiZSBvYnRhaW5lZC4KKy8vCisvLyBUaGlzIGFuYWx5c2lzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGluZHVjdGlvbiB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYW5kCisvLyBzdHJlbmd0aCByZWR1Y3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1NDQUxBUkVWT0xVVElPTl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29uc3RhbnRSYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBUEludDsKKyAgY2xhc3MgQ29uc3RhbnQ7CisgIGNsYXNzIENvbnN0YW50SW50OworICBjbGFzcyBEb21pbmF0b3JUcmVlOworICBjbGFzcyBUeXBlOworICBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisgIGNsYXNzIFRhcmdldERhdGE7CisgIGNsYXNzIExMVk1Db250ZXh0OworICBjbGFzcyBMb29wOworICBjbGFzcyBMb29wSW5mbzsKKyAgY2xhc3MgT3BlcmF0b3I7CisgIGNsYXNzIFNDRVZVbmtub3duOworCisgIC8vLyBTQ0VWIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFuYWx5emVkIGV4cHJlc3Npb24gaW4gdGhlIHByb2dyYW0uICBUaGVzZQorICAvLy8gYXJlIG9wYXF1ZSBvYmplY3RzIHRoYXQgdGhlIGNsaWVudCBpcyBub3QgYWxsb3dlZCB0byBkbyBtdWNoIHdpdGgKKyAgLy8vIGRpcmVjdGx5LgorICAvLy8KKyAgY2xhc3MgU0NFViA6IHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CisgICAgLy8vIEZhc3RJRCAtIEEgcmVmZXJlbmNlIHRvIGFuIEludGVybmVkIEZvbGRpbmdTZXROb2RlSUQgZm9yIHRoaXMgbm9kZS4KKyAgICAvLy8gVGhlIFNjYWxhckV2b2x1dGlvbidzIEJ1bXBQdHJBbGxvY2F0b3IgaG9sZHMgdGhlIGRhdGEuCisgICAgRm9sZGluZ1NldE5vZGVJRFJlZiBGYXN0SUQ7CisKKyAgICAvLyBUaGUgU0NFViBiYXNlY2xhc3MgdGhpcyBub2RlIGNvcnJlc3BvbmRzIHRvCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU0NFVlR5cGU7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBTdWJjbGFzc0RhdGEgLSBUaGlzIGZpZWxkIGlzIGluaXRpYWxpemVkIHRvIHplcm8gYW5kIG1heSBiZSB1c2VkIGluCisgICAgLy8vIHN1YmNsYXNzZXMgdG8gc3RvcmUgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbi4KKyAgICB1bnNpZ25lZCBzaG9ydCBTdWJjbGFzc0RhdGE7CisKKyAgcHJpdmF0ZToKKyAgICBTQ0VWKGNvbnN0IFNDRVYgJik7ICAgICAgICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNDRVYgJik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5TQ0VWKCk7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTQ0VWKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsIHVuc2lnbmVkIFNDRVZUeSkgOgorICAgICAgRmFzdElEKElEKSwgU0NFVlR5cGUoU0NFVlR5KSwgU3ViY2xhc3NEYXRhKDApIHt9CisKKyAgICB1bnNpZ25lZCBnZXRTQ0VWVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFNDRVZUeXBlOyB9CisKKyAgICAvLy8gUHJvZmlsZSAtIEZvbGRpbmdTZXQgc3VwcG9ydC4KKyAgICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgSUQpIHsgSUQgPSBGYXN0SUQ7IH0KKworICAgIC8vLyBpc0xvb3BJbnZhcmlhbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBTQ0VWIGlzIHVuY2hhbmdpbmcgaW4KKyAgICAvLy8gdGhlIHNwZWNpZmllZCBsb29wLgorICAgIHZpcnR1YWwgYm9vbCBpc0xvb3BJbnZhcmlhbnQoY29uc3QgTG9vcCAqTCkgY29uc3QgPSAwOworCisgICAgLy8vIGhhc0NvbXB1dGFibGVMb29wRXZvbHV0aW9uIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBTQ0VWIGNoYW5nZXMgdmFsdWUgaW4gYQorICAgIC8vLyBrbm93biB3YXkgaW4gdGhlIHNwZWNpZmllZCBsb29wLiAgVGhpcyBwcm9wZXJ0eSBiZWluZyB0cnVlIGltcGxpZXMgdGhhdAorICAgIC8vLyB0aGUgdmFsdWUgaXMgdmFyaWFudCBpbiB0aGUgbG9vcCBBTkQgdGhhdCB3ZSBjYW4gZW1pdCBhbiBleHByZXNzaW9uIHRvCisgICAgLy8vIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGF0IGFueSBwYXJ0aWN1bGFyIGxvb3AgaXRlcmF0aW9uLgorICAgIHZpcnR1YWwgYm9vbCBoYXNDb21wdXRhYmxlTG9vcEV2b2x1dGlvbihjb25zdCBMb29wICpMKSBjb25zdCA9IDA7CisKKyAgICAvLy8gZ2V0VHlwZSAtIFJldHVybiB0aGUgTExWTSB0eXBlIG9mIHRoaXMgU0NFViBleHByZXNzaW9uLgorICAgIC8vLworICAgIHZpcnR1YWwgY29uc3QgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0ID0gMDsKKworICAgIC8vLyBpc1plcm8gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhIGNvbnN0YW50IHplcm8uCisgICAgLy8vCisgICAgYm9vbCBpc1plcm8oKSBjb25zdDsKKworICAgIC8vLyBpc09uZSAtIFJldHVybiB0cnVlIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgY29uc3RhbnQgb25lLgorICAgIC8vLworICAgIGJvb2wgaXNPbmUoKSBjb25zdDsKKworICAgIC8vLyBpc0FsbE9uZXNWYWx1ZSAtIFJldHVybiB0cnVlIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgY29uc3RhbnQKKyAgICAvLy8gYWxsLW9uZXMgdmFsdWUuCisgICAgLy8vCisgICAgYm9vbCBpc0FsbE9uZXNWYWx1ZSgpIGNvbnN0OworCisgICAgLy8vIGhhc09wZXJhbmQgLSBUZXN0IHdoZXRoZXIgdGhpcyBTQ0VWIGhhcyBPcCBhcyBhIGRpcmVjdCBvcgorICAgIC8vLyBpbmRpcmVjdCBvcGVyYW5kLgorICAgIHZpcnR1YWwgYm9vbCBoYXNPcGVyYW5kKGNvbnN0IFNDRVYgKk9wKSBjb25zdCA9IDA7CisKKyAgICAvLy8gZG9taW5hdGVzIC0gUmV0dXJuIHRydWUgaWYgZWxlbWVudHMgdGhhdCBtYWtlcyB1cCB0aGlzIFNDRVYgZG9taW5hdGVzCisgICAgLy8vIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2suCisgICAgdmlydHVhbCBib29sIGRvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0ID0gMDsKKworICAgIC8vLyBwcm9wZXJseURvbWluYXRlcyAtIFJldHVybiB0cnVlIGlmIGVsZW1lbnRzIHRoYXQgbWFrZXMgdXAgdGhpcyBTQ0VWCisgICAgLy8vIHByb3Blcmx5IGRvbWluYXRlIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2suCisgICAgdmlydHVhbCBib29sIHByb3Blcmx5RG9taW5hdGVzKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCkgY29uc3QgPSAwOworCisgICAgLy8vIHByaW50IC0gUHJpbnQgb3V0IHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNjYWxhciB0byB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIHN0cmVhbS4gIFRoaXMgc2hvdWxkIHJlYWxseSBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZworICAgIC8vLyBwdXJwb3Nlcy4KKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCA9IDA7CisKKyAgICAvLy8gZHVtcCAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGRlYnVnZ2luZy4KKyAgICAvLy8KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTQ0VWICZTKSB7CisgICAgUy5wcmludChPUyk7CisgICAgcmV0dXJuIE9TOworICB9CisKKyAgLy8vIFNDRVZDb3VsZE5vdENvbXB1dGUgLSBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyByZXR1cm5lZCBieSBxdWVyaWVzIHRoYXQKKyAgLy8vIGNvdWxkIG5vdCBiZSBhbnN3ZXJlZC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXNrIGZvciB0aGUgbnVtYmVyIG9mCisgIC8vLyBpdGVyYXRpb25zIG9mIGEgbGlua2VkLWxpc3QgdHJhdmVyc2FsIGxvb3AsIHlvdSB3aWxsIGdldCBvbmUgb2YgdGhlc2UuCisgIC8vLyBOb25lIG9mIHRoZSBzdGFuZGFyZCBTQ0VWIG9wZXJhdGlvbnMgYXJlIHZhbGlkIG9uIHRoaXMgY2xhc3MsIGl0IGlzIGp1c3QgYQorICAvLy8gbWFya2VyLgorICBzdHJ1Y3QgU0NFVkNvdWxkTm90Q29tcHV0ZSA6IHB1YmxpYyBTQ0VWIHsKKyAgICBTQ0VWQ291bGROb3RDb21wdXRlKCk7CisKKyAgICAvLyBOb25lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGZvciB0aGlzIG9iamVjdC4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMb29wSW52YXJpYW50KGNvbnN0IExvb3AgKkwpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBoYXNDb21wdXRhYmxlTG9vcEV2b2x1dGlvbihjb25zdCBMb29wICpMKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzT3BlcmFuZChjb25zdCBTQ0VWICpPcCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgZG9taW5hdGVzKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCkgY29uc3QgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHByb3Blcmx5RG9taW5hdGVzKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCkgY29uc3QgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgU0NFVkNvdWxkTm90Q29tcHV0ZSAqUykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUyk7CisgIH07CisKKyAgLy8vIFNjYWxhckV2b2x1dGlvbiAtIFRoaXMgY2xhc3MgaXMgdGhlIG1haW4gc2NhbGFyIGV2b2x1dGlvbiBkcml2ZXIuICBCZWNhdXNlCisgIC8vLyBjbGllbnQgY29kZSAoaW50ZW50aW9uYWxseSkgY2FuJ3QgZG8gbXVjaCB3aXRoIHRoZSBTQ0VWIG9iamVjdHMgZGlyZWN0bHksCisgIC8vLyB0aGV5IG11c3QgYXNrIHRoaXMgY2xhc3MgZm9yIHNlcnZpY2VzLgorICAvLy8KKyAgY2xhc3MgU2NhbGFyRXZvbHV0aW9uIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgICAgLy8vIFNDRVZDYWxsYmFja1ZIIC0gQSBDYWxsYmFja1ZIIHRvIGFycmFuZ2UgZm9yIFNjYWxhckV2b2x1dGlvbiB0byBiZQorICAgIC8vLyBub3RpZmllZCB3aGVuZXZlciBhIFZhbHVlIGlzIGRlbGV0ZWQuCisgICAgY2xhc3MgU0NFVkNhbGxiYWNrVkggOiBwdWJsaWMgQ2FsbGJhY2tWSCB7CisgICAgICBTY2FsYXJFdm9sdXRpb24gKlNFOworICAgICAgdmlydHVhbCB2b2lkIGRlbGV0ZWQoKTsKKyAgICAgIHZpcnR1YWwgdm9pZCBhbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICpOZXcpOworICAgIHB1YmxpYzoKKyAgICAgIFNDRVZDYWxsYmFja1ZIKFZhbHVlICpWLCBTY2FsYXJFdm9sdXRpb24gKlNFID0gMCk7CisgICAgfTsKKworICAgIGZyaWVuZCBjbGFzcyBTQ0VWQ2FsbGJhY2tWSDsKKyAgICBmcmllbmQgY2xhc3MgU0NFVkV4cGFuZGVyOworICAgIGZyaWVuZCBjbGFzcyBTQ0VWVW5rbm93bjsKKworICAgIC8vLyBGIC0gVGhlIGZ1bmN0aW9uIHdlIGFyZSBhbmFseXppbmcuCisgICAgLy8vCisgICAgRnVuY3Rpb24gKkY7CisKKyAgICAvLy8gTEkgLSBUaGUgbG9vcCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIHdlIGFyZSBjdXJyZW50bHkgYW5hbHl6aW5nLgorICAgIC8vLworICAgIExvb3BJbmZvICpMSTsKKworICAgIC8vLyBURCAtIFRoZSB0YXJnZXQgZGF0YSBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhcmdldCB3ZSBhcmUgdGFyZ2V0aW5nLgorICAgIC8vLworICAgIFRhcmdldERhdGEgKlREOworCisgICAgLy8vIERUIC0gVGhlIGRvbWluYXRvciB0cmVlLgorICAgIC8vLworICAgIERvbWluYXRvclRyZWUgKkRUOworCisgICAgLy8vIENvdWxkTm90Q29tcHV0ZSAtIFRoaXMgU0NFViBpcyB1c2VkIHRvIHJlcHJlc2VudCB1bmtub3duIHRyaXAKKyAgICAvLy8gY291bnRzIGFuZCB0aGluZ3MuCisgICAgU0NFVkNvdWxkTm90Q29tcHV0ZSBDb3VsZE5vdENvbXB1dGU7CisKKyAgICAvLy8gU2NhbGFycyAtIFRoaXMgaXMgYSBjYWNoZSBvZiB0aGUgc2NhbGFycyB3ZSBoYXZlIGFuYWx5emVkIHNvIGZhci4KKyAgICAvLy8KKyAgICBzdGQ6Om1hcDxTQ0VWQ2FsbGJhY2tWSCwgY29uc3QgU0NFViAqPiBTY2FsYXJzOworCisgICAgLy8vIEJhY2tlZGdlVGFrZW5JbmZvIC0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhY2tlZGdlLXRha2VuIGNvdW50CisgICAgLy8vIG9mIGEgbG9vcC4gVGhpcyBjdXJyZW50bHkgaW5jbHVkZXMgYW4gZXhhY3QgY291bnQgYW5kIGEgbWF4aW11bSBjb3VudC4KKyAgICAvLy8KKyAgICBzdHJ1Y3QgQmFja2VkZ2VUYWtlbkluZm8geworICAgICAgLy8vIEV4YWN0IC0gQW4gZXhwcmVzc2lvbiBpbmRpY2F0aW5nIHRoZSBleGFjdCBiYWNrZWRnZS10YWtlbiBjb3VudCBvZgorICAgICAgLy8vIHRoZSBsb29wIGlmIGl0IGlzIGtub3duLCBvciBhIFNDRVZDb3VsZE5vdENvbXB1dGUgb3RoZXJ3aXNlLgorICAgICAgY29uc3QgU0NFViAqRXhhY3Q7CisKKyAgICAgIC8vLyBNYXggLSBBbiBleHByZXNzaW9uIGluZGljYXRpbmcgdGhlIGxlYXN0IG1heGltdW0gYmFja2VkZ2UtdGFrZW4KKyAgICAgIC8vLyBjb3VudCBvZiB0aGUgbG9vcCB0aGF0IGlzIGtub3duLCBvciBhIFNDRVZDb3VsZE5vdENvbXB1dGUuCisgICAgICBjb25zdCBTQ0VWICpNYXg7CisKKyAgICAgIC8qaW1wbGljaXQqLyBCYWNrZWRnZVRha2VuSW5mbyhjb25zdCBTQ0VWICpleGFjdCkgOgorICAgICAgICBFeGFjdChleGFjdCksIE1heChleGFjdCkge30KKworICAgICAgQmFja2VkZ2VUYWtlbkluZm8oY29uc3QgU0NFViAqZXhhY3QsIGNvbnN0IFNDRVYgKm1heCkgOgorICAgICAgICBFeGFjdChleGFjdCksIE1heChtYXgpIHt9CisKKyAgICAgIC8vLyBoYXNBbnlJbmZvIC0gVGVzdCB3aGV0aGVyIHRoaXMgQmFja2VkZ2VUYWtlbkluZm8gY29udGFpbnMgYW55CisgICAgICAvLy8gY29tcHV0ZWQgaW5mb3JtYXRpb24sIG9yIHdoZXRoZXIgaXQncyBhbGwgU0NFVkNvdWxkTm90Q29tcHV0ZQorICAgICAgLy8vIHZhbHVlcy4KKyAgICAgIGJvb2wgaGFzQW55SW5mbygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oRXhhY3QpIHx8CisgICAgICAgICAgICAgICAhaXNhPFNDRVZDb3VsZE5vdENvbXB1dGU+KE1heCk7CisgICAgICB9CisgICAgfTsKKworICAgIC8vLyBCYWNrZWRnZVRha2VuQ291bnRzIC0gQ2FjaGUgdGhlIGJhY2tlZGdlLXRha2VuIGNvdW50IG9mIHRoZSBsb29wcyBmb3IKKyAgICAvLy8gdGhpcyBmdW5jdGlvbiBhcyB0aGV5IGFyZSBjb21wdXRlZC4KKyAgICBzdGQ6Om1hcDxjb25zdCBMb29wKiwgQmFja2VkZ2VUYWtlbkluZm8+IEJhY2tlZGdlVGFrZW5Db3VudHM7CisKKyAgICAvLy8gQ29uc3RhbnRFdm9sdXRpb25Mb29wRXhpdFZhbHVlIC0gVGhpcyBtYXAgY29udGFpbnMgZW50cmllcyBmb3IgYWxsIG9mCisgICAgLy8vIHRoZSBQSEkgaW5zdHJ1Y3Rpb25zIHRoYXQgd2UgYXR0ZW1wdCB0byBjb21wdXRlIGNvbnN0YW50IGV2b2x1dGlvbnMgZm9yLgorICAgIC8vLyBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUgcmVjb21wdXRhdGlvbiBvZiB0aGVzZQorICAgIC8vLyBwcm9wZXJ0aWVzLiAgQW4gaW5zdHJ1Y3Rpb24gbWFwcyB0byBudWxsIGlmIHdlIGFyZSB1bmFibGUgdG8gY29tcHV0ZSBpdHMKKyAgICAvLy8gZXhpdCB2YWx1ZS4KKyAgICBzdGQ6Om1hcDxQSElOb2RlKiwgQ29uc3RhbnQqPiBDb25zdGFudEV2b2x1dGlvbkxvb3BFeGl0VmFsdWU7CisKKyAgICAvLy8gVmFsdWVzQXRTY29wZXMgLSBUaGlzIG1hcCBjb250YWlucyBlbnRyaWVzIGZvciBhbGwgdGhlIGV4cHJlc3Npb25zCisgICAgLy8vIHRoYXQgd2UgYXR0ZW1wdCB0byBjb21wdXRlIGdldFNDRVZBdFNjb3BlIGluZm9ybWF0aW9uIGZvciwgd2hpY2ggY2FuCisgICAgLy8vIGJlIGV4cGVuc2l2ZSBpbiBleHRyZW1lIGNhc2VzLgorICAgIHN0ZDo6bWFwPGNvbnN0IFNDRVYgKiwKKyAgICAgICAgICAgICBzdGQ6Om1hcDxjb25zdCBMb29wICosIGNvbnN0IFNDRVYgKj4gPiBWYWx1ZXNBdFNjb3BlczsKKworICAgIC8vLyBjcmVhdGVTQ0VWIC0gV2Uga25vdyB0aGF0IHRoZXJlIGlzIG5vIFNDRVYgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgLy8vIEFuYWx5emUgdGhlIGV4cHJlc3Npb24uCisgICAgY29uc3QgU0NFViAqY3JlYXRlU0NFVihWYWx1ZSAqVik7CisKKyAgICAvLy8gY3JlYXRlTm9kZUZvclBISSAtIFByb3ZpZGUgdGhlIHNwZWNpYWwgaGFuZGxpbmcgd2UgbmVlZCB0byBhbmFseXplIFBISQorICAgIC8vLyBTQ0VWcy4KKyAgICBjb25zdCBTQ0VWICpjcmVhdGVOb2RlRm9yUEhJKFBISU5vZGUgKlBOKTsKKworICAgIC8vLyBjcmVhdGVOb2RlRm9yR0VQIC0gUHJvdmlkZSB0aGUgc3BlY2lhbCBoYW5kbGluZyB3ZSBuZWVkIHRvIGFuYWx5emUgR0VQCisgICAgLy8vIFNDRVZzLgorICAgIGNvbnN0IFNDRVYgKmNyZWF0ZU5vZGVGb3JHRVAoR0VQT3BlcmF0b3IgKkdFUCk7CisKKyAgICAvLy8gY29tcHV0ZVNDRVZBdFNjb3BlIC0gSW1wbGVtZW50YXRpb24gY29kZSBmb3IgZ2V0U0NFVkF0U2NvcGU7IGNhbGxlZAorICAgIC8vLyBhdCBtb3N0IG9uY2UgZm9yIGVhY2ggU0NFVitMb29wIHBhaXIuCisgICAgLy8vCisgICAgY29uc3QgU0NFViAqY29tcHV0ZVNDRVZBdFNjb3BlKGNvbnN0IFNDRVYgKlMsIGNvbnN0IExvb3AgKkwpOworCisgICAgLy8vIEZvcmdldFN5bWJvbGljVmFsdWUgLSBUaGlzIGxvb2tzIHVwIGNvbXB1dGVkIFNDRVYgdmFsdWVzIGZvciBhbGwKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgZGVwZW5kIG9uIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBhbmQgcmVtb3ZlcyB0aGVtIGZyb20KKyAgICAvLy8gdGhlIFNjYWxhcnMgbWFwIGlmIHRoZXkgcmVmZXJlbmNlIFN5bU5hbWUuIFRoaXMgaXMgdXNlZCBkdXJpbmcgUEhJCisgICAgLy8vIHJlc29sdXRpb24uCisgICAgdm9pZCBGb3JnZXRTeW1ib2xpY05hbWUoSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFNDRVYgKlN5bU5hbWUpOworCisgICAgLy8vIGdldEJFQ291bnQgLSBTdWJ0cmFjdCB0aGUgZW5kIGFuZCBzdGFydCB2YWx1ZXMgYW5kIGRpdmlkZSBieSB0aGUgc3RlcCwKKyAgICAvLy8gcm91bmRpbmcgdXAsIHRvIGdldCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBiYWNrZWRnZSBpcyBleGVjdXRlZC4gUmV0dXJuCisgICAgLy8vIENvdWxkTm90Q29tcHV0ZSBpZiBhbiBpbnRlcm1lZGlhdGUgY29tcHV0YXRpb24gb3ZlcmZsb3dzLgorICAgIGNvbnN0IFNDRVYgKmdldEJFQ291bnQoY29uc3QgU0NFViAqU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb1dyYXApOworCisgICAgLy8vIGdldEJhY2tlZGdlVGFrZW5JbmZvIC0gUmV0dXJuIHRoZSBCYWNrZWRnZVRha2VuSW5mbyBmb3IgdGhlIGdpdmVuCisgICAgLy8vIGxvb3AsIGxhemlseSBjb21wdXRpbmcgbmV3IHZhbHVlcyBpZiB0aGUgbG9vcCBoYXNuJ3QgYmVlbiBhbmFseXplZAorICAgIC8vLyB5ZXQuCisgICAgY29uc3QgQmFja2VkZ2VUYWtlbkluZm8gJmdldEJhY2tlZGdlVGFrZW5JbmZvKGNvbnN0IExvb3AgKkwpOworCisgICAgLy8vIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnQgLSBDb21wdXRlIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNwZWNpZmllZAorICAgIC8vLyBsb29wIHdpbGwgaXRlcmF0ZS4KKyAgICBCYWNrZWRnZVRha2VuSW5mbyBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50KGNvbnN0IExvb3AgKkwpOworCisgICAgLy8vIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRGcm9tRXhpdCAtIENvbXB1dGUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUKKyAgICAvLy8gYmFja2VkZ2Ugb2YgdGhlIHNwZWNpZmllZCBsb29wIHdpbGwgZXhlY3V0ZSBpZiBpdCBleGl0cyB2aWEgdGhlCisgICAgLy8vIHNwZWNpZmllZCBibG9jay4KKyAgICBCYWNrZWRnZVRha2VuSW5mbyBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RnJvbUV4aXQoY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkV4aXRpbmdCbG9jayk7CisKKyAgICAvLy8gQ29tcHV0ZUJhY2tlZGdlVGFrZW5Db3VudEZyb21FeGl0Q29uZCAtIENvbXB1dGUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUKKyAgICAvLy8gYmFja2VkZ2Ugb2YgdGhlIHNwZWNpZmllZCBsb29wIHdpbGwgZXhlY3V0ZSBpZiBpdHMgZXhpdCBjb25kaXRpb24KKyAgICAvLy8gd2VyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaCBvZiBFeGl0Q29uZCwgVEJCLCBhbmQgRkJCLgorICAgIEJhY2tlZGdlVGFrZW5JbmZvCisgICAgICBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RnJvbUV4aXRDb25kKGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpFeGl0Q29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpGQkIpOworCisgICAgLy8vIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRGcm9tRXhpdENvbmRJQ21wIC0gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mCisgICAgLy8vIHRpbWVzIHRoZSBiYWNrZWRnZSBvZiB0aGUgc3BlY2lmaWVkIGxvb3Agd2lsbCBleGVjdXRlIGlmIGl0cyBleGl0CisgICAgLy8vIGNvbmRpdGlvbiB3ZXJlIGEgY29uZGl0aW9uYWwgYnJhbmNoIG9mIHRoZSBJQ21wSW5zdCBFeGl0Q29uZCwgVEJCLAorICAgIC8vLyBhbmQgRkJCLgorICAgIEJhY2tlZGdlVGFrZW5JbmZvCisgICAgICBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RnJvbUV4aXRDb25kSUNtcChjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3QgKkV4aXRDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqRkJCKTsKKworICAgIC8vLyBDb21wdXRlTG9hZENvbnN0YW50Q29tcGFyZUJhY2tlZGdlVGFrZW5Db3VudCAtIEdpdmVuIGFuIGV4aXQgY29uZGl0aW9uCisgICAgLy8vIG9mICdpY21wIG9wIGxvYWQgWCwgY3N0JywgdHJ5IHRvIHNlZSBpZiB3ZSBjYW4gY29tcHV0ZSB0aGUKKyAgICAvLy8gYmFja2VkZ2UtdGFrZW4gY291bnQuCisgICAgQmFja2VkZ2VUYWtlbkluZm8KKyAgICAgIENvbXB1dGVMb2FkQ29uc3RhbnRDb21wYXJlQmFja2VkZ2VUYWtlbkNvdW50KExvYWRJbnN0ICpMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBwKTsKKworICAgIC8vLyBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RXhoYXVzdGl2ZWx5IC0gSWYgdGhlIGxvb3AgaXMga25vd24gdG8gZXhlY3V0ZQorICAgIC8vLyBhIGNvbnN0YW50IG51bWJlciBvZiB0aW1lcyAodGhlIGNvbmRpdGlvbiBldm9sdmVzIG9ubHkgZnJvbSBjb25zdGFudHMpLAorICAgIC8vLyB0cnkgdG8gZXZhbHVhdGUgYSBmZXcgaXRlcmF0aW9ucyBvZiB0aGUgbG9vcCB1bnRpbCB3ZSBnZXQgdGhlIGV4aXQKKyAgICAvLy8gY29uZGl0aW9uIGdldHMgYSB2YWx1ZSBvZiBFeGl0V2hlbiAodHJ1ZSBvciBmYWxzZSkuICBJZiB3ZSBjYW5ub3QKKyAgICAvLy8gZXZhbHVhdGUgdGhlIGJhY2tlZGdlLXRha2VuIGNvdW50IG9mIHRoZSBsb29wLCByZXR1cm4gQ291bGROb3RDb21wdXRlLgorICAgIGNvbnN0IFNDRVYgKkNvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRFeGhhdXN0aXZlbHkoY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeGl0V2hlbik7CisKKyAgICAvLy8gSG93RmFyVG9aZXJvIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgYSBiYWNrZWRnZSBjb21wYXJpbmcgdGhlCisgICAgLy8vIHNwZWNpZmllZCB2YWx1ZSB0byB6ZXJvIHdpbGwgZXhlY3V0ZS4gIElmIG5vdCBjb21wdXRhYmxlLCByZXR1cm4KKyAgICAvLy8gQ291bGROb3RDb21wdXRlLgorICAgIEJhY2tlZGdlVGFrZW5JbmZvIEhvd0ZhclRvWmVybyhjb25zdCBTQ0VWICpWLCBjb25zdCBMb29wICpMKTsKKworICAgIC8vLyBIb3dGYXJUb05vblplcm8gLSBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBhIGJhY2tlZGdlIGNoZWNraW5nIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgdmFsdWUgZm9yIG5vbnplcm8gd2lsbCBleGVjdXRlLiAgSWYgbm90IGNvbXB1dGFibGUsIHJldHVybgorICAgIC8vLyBDb3VsZE5vdENvbXB1dGUuCisgICAgQmFja2VkZ2VUYWtlbkluZm8gSG93RmFyVG9Ob25aZXJvKGNvbnN0IFNDRVYgKlYsIGNvbnN0IExvb3AgKkwpOworCisgICAgLy8vIEhvd01hbnlMZXNzVGhhbnMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBhIGJhY2tlZGdlIGNvbnRhaW5pbmcgdGhlCisgICAgLy8vIHNwZWNpZmllZCBsZXNzLXRoYW4gY29tcGFyaXNvbiB3aWxsIGV4ZWN1dGUuICBJZiBub3QgY29tcHV0YWJsZSwgcmV0dXJuCisgICAgLy8vIENvdWxkTm90Q29tcHV0ZS4gaXNTaWduZWQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGxlc3MtdGhhbiBpcyBzaWduZWQuCisgICAgQmFja2VkZ2VUYWtlbkluZm8gSG93TWFueUxlc3NUaGFucyhjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwsIGJvb2wgaXNTaWduZWQpOworCisgICAgLy8vIGdldFByZWRlY2Vzc29yV2l0aFVuaXF1ZVN1Y2Nlc3NvckZvckJCIC0gUmV0dXJuIGEgcHJlZGVjZXNzb3Igb2YgQkIKKyAgICAvLy8gKHdoaWNoIG1heSBub3QgYmUgYW4gaW1tZWRpYXRlIHByZWRlY2Vzc29yKSB3aGljaCBoYXMgZXhhY3RseSBvbmUKKyAgICAvLy8gc3VjY2Vzc29yIGZyb20gd2hpY2ggQkIgaXMgcmVhY2hhYmxlLCBvciBudWxsIGlmIG5vIHN1Y2ggYmxvY2sgaXMKKyAgICAvLy8gZm91bmQuCisgICAgc3RkOjpwYWlyPEJhc2ljQmxvY2sgKiwgQmFzaWNCbG9jayAqPgorICAgIGdldFByZWRlY2Vzc29yV2l0aFVuaXF1ZVN1Y2Nlc3NvckZvckJCKEJhc2ljQmxvY2sgKkJCKTsKKworICAgIC8vLyBpc0ltcGxpZWRDb25kIC0gVGVzdCB3aGV0aGVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsIExIUywgYW5kCisgICAgLy8vIFJIUyBpcyB0cnVlIHdoZW5ldmVyIHRoZSBnaXZlbiBGb3VuZENvbmRWYWx1ZSB2YWx1ZSBldmFsdWF0ZXMgdG8gdHJ1ZS4KKyAgICBib29sIGlzSW1wbGllZENvbmQoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkZvdW5kQ29uZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIEludmVyc2UpOworCisgICAgLy8vIGlzSW1wbGllZENvbmRPcGVyYW5kcyAtIFRlc3Qgd2hldGhlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLAorICAgIC8vLyBMSFMsIGFuZCBSSFMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBGb3VuZExIUywKKyAgICAvLy8gYW5kIEZvdW5kUkhTIGlzIHRydWUuCisgICAgYm9vbCBpc0ltcGxpZWRDb25kT3BlcmFuZHMoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkZvdW5kTEhTLCBjb25zdCBTQ0VWICpGb3VuZFJIUyk7CisKKyAgICAvLy8gaXNJbXBsaWVkQ29uZE9wZXJhbmRzSGVscGVyIC0gVGVzdCB3aGV0aGVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5CisgICAgLy8vIFByZWQsIExIUywgYW5kIFJIUyBpcyB0cnVlIHdoZW5ldmVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsCisgICAgLy8vIEZvdW5kTEhTLCBhbmQgRm91bmRSSFMgaXMgdHJ1ZS4KKyAgICBib29sIGlzSW1wbGllZENvbmRPcGVyYW5kc0hlbHBlcihJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRm91bmRMSFMsIGNvbnN0IFNDRVYgKkZvdW5kUkhTKTsKKworICAgIC8vLyBnZXRDb25zdGFudEV2b2x1dGlvbkxvb3BFeGl0VmFsdWUgLSBJZiB3ZSBrbm93IHRoYXQgdGhlIHNwZWNpZmllZCBQaGkgaXMKKyAgICAvLy8gaW4gdGhlIGhlYWRlciBvZiBpdHMgY29udGFpbmluZyBsb29wLCB3ZSBrbm93IHRoZSBsb29wIGV4ZWN1dGVzIGEKKyAgICAvLy8gY29uc3RhbnQgbnVtYmVyIG9mIHRpbWVzLCBhbmQgdGhlIFBISSBub2RlIGlzIGp1c3QgYSByZWN1cnJlbmNlCisgICAgLy8vIGludm9sdmluZyBjb25zdGFudHMsIGZvbGQgaXQuCisgICAgQ29uc3RhbnQgKmdldENvbnN0YW50RXZvbHV0aW9uTG9vcEV4aXRWYWx1ZShQSElOb2RlICpQTiwgY29uc3QgQVBJbnQmIEJFcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwpOworCisgICAgLy8vIGlzS25vd25QcmVkaWNhdGVXaXRoUmFuZ2VzIC0gVGVzdCBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBrbm93biB0bworICAgIC8vLyBzYXRpc2Z5IHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQgYW5kIHRoZSBrbm93biBjb25zdGFudCByYW5nZXMKKyAgICAvLy8gb2YgTEhTIGFuZCBSSFMuCisgICAgLy8vCisgICAgYm9vbCBpc0tub3duUHJlZGljYXRlV2l0aFJhbmdlcyhJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgU2NhbGFyRXZvbHV0aW9uKCk7CisKKyAgICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIEYtPmdldENvbnRleHQoKTsgfQorCisgICAgLy8vIGlzU0NFVmFibGUgLSBUZXN0IGlmIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdHlwZSBhcmUgYW5hbHl6YWJsZSB3aXRoaW4KKyAgICAvLy8gdGhlIFNDRVYgZnJhbWV3b3JrLiBUaGlzIHByaW1hcmlseSBpbmNsdWRlcyBpbnRlZ2VyIHR5cGVzLCBhbmQgaXQKKyAgICAvLy8gY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSBwb2ludGVyIHR5cGVzIGlmIHRoZSBTY2FsYXJFdm9sdXRpb24gY2xhc3MKKyAgICAvLy8gaGFzIGFjY2VzcyB0byB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgICAgYm9vbCBpc1NDRVZhYmxlKGNvbnN0IFR5cGUgKlR5KSBjb25zdDsKKworICAgIC8vLyBnZXRUeXBlU2l6ZUluQml0cyAtIFJldHVybiB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSwKKyAgICAvLy8gZm9yIHdoaWNoIGlzU0NFVmFibGUgbXVzdCByZXR1cm4gdHJ1ZS4KKyAgICB1aW50NjRfdCBnZXRUeXBlU2l6ZUluQml0cyhjb25zdCBUeXBlICpUeSkgY29uc3Q7CisKKyAgICAvLy8gZ2V0RWZmZWN0aXZlU0NFVlR5cGUgLSBSZXR1cm4gYSB0eXBlIHdpdGggdGhlIHNhbWUgYml0d2lkdGggYXMKKyAgICAvLy8gdGhlIGdpdmVuIHR5cGUgYW5kIHdoaWNoIHJlcHJlc2VudHMgaG93IFNDRVYgd2lsbCB0cmVhdCB0aGUgZ2l2ZW4KKyAgICAvLy8gdHlwZSwgZm9yIHdoaWNoIGlzU0NFVmFibGUgbXVzdCByZXR1cm4gdHJ1ZS4gRm9yIHBvaW50ZXIgdHlwZXMsCisgICAgLy8vIHRoaXMgaXMgdGhlIHBvaW50ZXItc2l6ZWQgaW50ZWdlciB0eXBlLgorICAgIGNvbnN0IFR5cGUgKmdldEVmZmVjdGl2ZVNDRVZUeXBlKGNvbnN0IFR5cGUgKlR5KSBjb25zdDsKKworICAgIC8vLyBnZXRTQ0VWIC0gUmV0dXJuIGEgU0NFViBleHByZXNzaW9uIGZvciB0aGUgZnVsbCBnZW5lcmFsaXR5IG9mIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgZXhwcmVzc2lvbi4KKyAgICBjb25zdCBTQ0VWICpnZXRTQ0VWKFZhbHVlICpWKTsKKworICAgIGNvbnN0IFNDRVYgKmdldENvbnN0YW50KENvbnN0YW50SW50ICpWKTsKKyAgICBjb25zdCBTQ0VWICpnZXRDb25zdGFudChjb25zdCBBUEludCYgVmFsKTsKKyAgICBjb25zdCBTQ0VWICpnZXRDb25zdGFudChjb25zdCBUeXBlICpUeSwgdWludDY0X3QgViwgYm9vbCBpc1NpZ25lZCA9IGZhbHNlKTsKKyAgICBjb25zdCBTQ0VWICpnZXRUcnVuY2F0ZUV4cHIoY29uc3QgU0NFViAqT3AsIGNvbnN0IFR5cGUgKlR5KTsKKyAgICBjb25zdCBTQ0VWICpnZXRaZXJvRXh0ZW5kRXhwcihjb25zdCBTQ0VWICpPcCwgY29uc3QgVHlwZSAqVHkpOworICAgIGNvbnN0IFNDRVYgKmdldFNpZ25FeHRlbmRFeHByKGNvbnN0IFNDRVYgKk9wLCBjb25zdCBUeXBlICpUeSk7CisgICAgY29uc3QgU0NFViAqZ2V0QW55RXh0ZW5kRXhwcihjb25zdCBTQ0VWICpPcCwgY29uc3QgVHlwZSAqVHkpOworICAgIGNvbnN0IFNDRVYgKmdldEFkZEV4cHIoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpOworICAgIGNvbnN0IFNDRVYgKmdldEFkZEV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSB7CisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDI+IE9wczsKKyAgICAgIE9wcy5wdXNoX2JhY2soTEhTKTsKKyAgICAgIE9wcy5wdXNoX2JhY2soUkhTKTsKKyAgICAgIHJldHVybiBnZXRBZGRFeHByKE9wcywgSGFzTlVXLCBIYXNOU1cpOworICAgIH0KKyAgICBjb25zdCBTQ0VWICpnZXRBZGRFeHByKGNvbnN0IFNDRVYgKk9wMCwgY29uc3QgU0NFViAqT3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqT3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgeworICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAzPiBPcHM7CisgICAgICBPcHMucHVzaF9iYWNrKE9wMCk7CisgICAgICBPcHMucHVzaF9iYWNrKE9wMSk7CisgICAgICBPcHMucHVzaF9iYWNrKE9wMik7CisgICAgICByZXR1cm4gZ2V0QWRkRXhwcihPcHMsIEhhc05VVywgSGFzTlNXKTsKKyAgICB9CisgICAgY29uc3QgU0NFViAqZ2V0TXVsRXhwcihTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSk7CisgICAgY29uc3QgU0NFViAqZ2V0TXVsRXhwcihjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gT3BzOworICAgICAgT3BzLnB1c2hfYmFjayhMSFMpOworICAgICAgT3BzLnB1c2hfYmFjayhSSFMpOworICAgICAgcmV0dXJuIGdldE11bEV4cHIoT3BzLCBIYXNOVVcsIEhhc05TVyk7CisgICAgfQorICAgIGNvbnN0IFNDRVYgKmdldFVEaXZFeHByKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKyAgICBjb25zdCBTQ0VWICpnZXRBZGRSZWNFeHByKGNvbnN0IFNDRVYgKlN0YXJ0LCBjb25zdCBTQ0VWICpTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpOworICAgIGNvbnN0IFNDRVYgKmdldEFkZFJlY0V4cHIoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpOworICAgIGNvbnN0IFNDRVYgKmdldEFkZFJlY0V4cHIoY29uc3QgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gTmV3T3AoT3BlcmFuZHMuYmVnaW4oKSwgT3BlcmFuZHMuZW5kKCkpOworICAgICAgcmV0dXJuIGdldEFkZFJlY0V4cHIoTmV3T3AsIEwsIEhhc05VVywgSGFzTlNXKTsKKyAgICB9CisgICAgY29uc3QgU0NFViAqZ2V0U01heEV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworICAgIGNvbnN0IFNDRVYgKmdldFNNYXhFeHByKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcGVyYW5kcyk7CisgICAgY29uc3QgU0NFViAqZ2V0VU1heEV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworICAgIGNvbnN0IFNDRVYgKmdldFVNYXhFeHByKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcGVyYW5kcyk7CisgICAgY29uc3QgU0NFViAqZ2V0U01pbkV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworICAgIGNvbnN0IFNDRVYgKmdldFVNaW5FeHByKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKyAgICBjb25zdCBTQ0VWICpnZXRVbmtub3duKFZhbHVlICpWKTsKKyAgICBjb25zdCBTQ0VWICpnZXRDb3VsZE5vdENvbXB1dGUoKTsKKworICAgIC8vLyBnZXRTaXplT2ZFeHByIC0gUmV0dXJuIGFuIGV4cHJlc3Npb24gZm9yIHNpemVvZiBvbiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAvLy8KKyAgICBjb25zdCBTQ0VWICpnZXRTaXplT2ZFeHByKGNvbnN0IFR5cGUgKkFsbG9jVHkpOworCisgICAgLy8vIGdldEFsaWduT2ZFeHByIC0gUmV0dXJuIGFuIGV4cHJlc3Npb24gZm9yIGFsaWdub2Ygb24gdGhlIGdpdmVuIHR5cGUuCisgICAgLy8vCisgICAgY29uc3QgU0NFViAqZ2V0QWxpZ25PZkV4cHIoY29uc3QgVHlwZSAqQWxsb2NUeSk7CisKKyAgICAvLy8gZ2V0T2Zmc2V0T2ZFeHByIC0gUmV0dXJuIGFuIGV4cHJlc3Npb24gZm9yIG9mZnNldG9mIG9uIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAvLy8KKyAgICBjb25zdCBTQ0VWICpnZXRPZmZzZXRPZkV4cHIoY29uc3QgU3RydWN0VHlwZSAqU1R5LCB1bnNpZ25lZCBGaWVsZE5vKTsKKworICAgIC8vLyBnZXRPZmZzZXRPZkV4cHIgLSBSZXR1cm4gYW4gZXhwcmVzc2lvbiBmb3Igb2Zmc2V0b2Ygb24gdGhlIGdpdmVuIGZpZWxkLgorICAgIC8vLworICAgIGNvbnN0IFNDRVYgKmdldE9mZnNldE9mRXhwcihjb25zdCBUeXBlICpDVHksIENvbnN0YW50ICpGaWVsZE5vKTsKKworICAgIC8vLyBnZXROZWdhdGl2ZVNDRVYgLSBSZXR1cm4gdGhlIFNDRVYgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gLVYuCisgICAgLy8vCisgICAgY29uc3QgU0NFViAqZ2V0TmVnYXRpdmVTQ0VWKGNvbnN0IFNDRVYgKlYpOworCisgICAgLy8vIGdldE5vdFNDRVYgLSBSZXR1cm4gdGhlIFNDRVYgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gflYuCisgICAgLy8vCisgICAgY29uc3QgU0NFViAqZ2V0Tm90U0NFVihjb25zdCBTQ0VWICpWKTsKKworICAgIC8vLyBnZXRNaW51c1NDRVYgLSBSZXR1cm4gTEhTLVJIUy4KKyAgICAvLy8KKyAgICBjb25zdCBTQ0VWICpnZXRNaW51c1NDRVYoY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMpOworCisgICAgLy8vIGdldFRydW5jYXRlT3JaZXJvRXh0ZW5kIC0gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbgorICAgIC8vLyBvZiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiAgSWYgdGhlIHR5cGUgbXVzdCBiZQorICAgIC8vLyBleHRlbmRlZCwgaXQgaXMgemVybyBleHRlbmRlZC4KKyAgICBjb25zdCBTQ0VWICpnZXRUcnVuY2F0ZU9yWmVyb0V4dGVuZChjb25zdCBTQ0VWICpWLCBjb25zdCBUeXBlICpUeSk7CisKKyAgICAvLy8gZ2V0VHJ1bmNhdGVPclNpZ25FeHRlbmQgLSBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uCisgICAgLy8vIG9mIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuICBJZiB0aGUgdHlwZSBtdXN0IGJlCisgICAgLy8vIGV4dGVuZGVkLCBpdCBpcyBzaWduIGV4dGVuZGVkLgorICAgIGNvbnN0IFNDRVYgKmdldFRydW5jYXRlT3JTaWduRXh0ZW5kKGNvbnN0IFNDRVYgKlYsIGNvbnN0IFR5cGUgKlR5KTsKKworICAgIC8vLyBnZXROb29wT3JaZXJvRXh0ZW5kIC0gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbiBvZgorICAgIC8vLyB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiAgSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwKKyAgICAvLy8gaXQgaXMgemVybyBleHRlbmRlZC4gIFRoZSBjb252ZXJzaW9uIG11c3Qgbm90IGJlIG5hcnJvd2luZy4KKyAgICBjb25zdCBTQ0VWICpnZXROb29wT3JaZXJvRXh0ZW5kKGNvbnN0IFNDRVYgKlYsIGNvbnN0IFR5cGUgKlR5KTsKKworICAgIC8vLyBnZXROb29wT3JTaWduRXh0ZW5kIC0gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbiBvZgorICAgIC8vLyB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiAgSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwKKyAgICAvLy8gaXQgaXMgc2lnbiBleHRlbmRlZC4gIFRoZSBjb252ZXJzaW9uIG11c3Qgbm90IGJlIG5hcnJvd2luZy4KKyAgICBjb25zdCBTQ0VWICpnZXROb29wT3JTaWduRXh0ZW5kKGNvbnN0IFNDRVYgKlYsIGNvbnN0IFR5cGUgKlR5KTsKKworICAgIC8vLyBnZXROb29wT3JBbnlFeHRlbmQgLSBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uIG9mCisgICAgLy8vIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuIElmIHRoZSB0eXBlIG11c3QgYmUgZXh0ZW5kZWQsCisgICAgLy8vIGl0IGlzIGV4dGVuZGVkIHdpdGggdW5zcGVjaWZpZWQgYml0cy4gVGhlIGNvbnZlcnNpb24gbXVzdCBub3QgYmUKKyAgICAvLy8gbmFycm93aW5nLgorICAgIGNvbnN0IFNDRVYgKmdldE5vb3BPckFueUV4dGVuZChjb25zdCBTQ0VWICpWLCBjb25zdCBUeXBlICpUeSk7CisKKyAgICAvLy8gZ2V0VHJ1bmNhdGVPck5vb3AgLSBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uIG9mIHRoZQorICAgIC8vLyBpbnB1dCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuICBUaGUgY29udmVyc2lvbiBtdXN0IG5vdCBiZQorICAgIC8vLyB3aWRlbmluZy4KKyAgICBjb25zdCBTQ0VWICpnZXRUcnVuY2F0ZU9yTm9vcChjb25zdCBTQ0VWICpWLCBjb25zdCBUeXBlICpUeSk7CisKKyAgICAvLy8gZ2V0VU1heEZyb21NaXNtYXRjaGVkVHlwZXMgLSBQcm9tb3RlIHRoZSBvcGVyYW5kcyB0byB0aGUgd2lkZXIgb2YKKyAgICAvLy8gdGhlIHR5cGVzIHVzaW5nIHplcm8tZXh0ZW5zaW9uLCBhbmQgdGhlbiBwZXJmb3JtIGEgdW1heCBvcGVyYXRpb24KKyAgICAvLy8gd2l0aCB0aGVtLgorICAgIGNvbnN0IFNDRVYgKmdldFVNYXhGcm9tTWlzbWF0Y2hlZFR5cGVzKGNvbnN0IFNDRVYgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMpOworCisgICAgLy8vIGdldFVNaW5Gcm9tTWlzbWF0Y2hlZFR5cGVzIC0gUHJvbW90ZSB0aGUgb3BlcmFuZHMgdG8gdGhlIHdpZGVyIG9mCisgICAgLy8vIHRoZSB0eXBlcyB1c2luZyB6ZXJvLWV4dGVuc2lvbiwgYW5kIHRoZW4gcGVyZm9ybSBhIHVtaW4gb3BlcmF0aW9uCisgICAgLy8vIHdpdGggdGhlbS4KKyAgICBjb25zdCBTQ0VWICpnZXRVTWluRnJvbU1pc21hdGNoZWRUeXBlcyhjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUkhTKTsKKworICAgIC8vLyBnZXRTQ0VWQXRTY29wZSAtIFJldHVybiBhIFNDRVYgZXhwcmVzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAgIC8vLyBhdCB0aGUgc3BlY2lmaWVkIHNjb3BlIGluIHRoZSBwcm9ncmFtLiAgVGhlIEwgdmFsdWUgc3BlY2lmaWVzIGEgbG9vcAorICAgIC8vLyBuZXN0IHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGF0LCB3aGVyZSBudWxsIGlzIHRoZSB0b3AtbGV2ZWwgb3IgYQorICAgIC8vLyBzcGVjaWZpZWQgbG9vcCBpcyBpbW1lZGlhdGVseSBpbnNpZGUgb2YgdGhlIGxvb3AuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGV4aXQgdmFsdWUgZm9yIGEgdmFyaWFibGUgZGVmaW5lZAorICAgIC8vLyBpbiBhIGxvb3AgYnkgcXVlcnlpbmcgd2hhdCB0aGUgdmFsdWUgd2lsbCBob2xkIGluIHRoZSBwYXJlbnQgbG9vcC4KKyAgICAvLy8KKyAgICAvLy8gSW4gdGhlIGNhc2UgdGhhdCBhIHJlbGV2YW50IGxvb3AgZXhpdCB2YWx1ZSBjYW5ub3QgYmUgY29tcHV0ZWQsIHRoZQorICAgIC8vLyBvcmlnaW5hbCB2YWx1ZSBWIGlzIHJldHVybmVkLgorICAgIGNvbnN0IFNDRVYgKmdldFNDRVZBdFNjb3BlKGNvbnN0IFNDRVYgKlMsIGNvbnN0IExvb3AgKkwpOworCisgICAgLy8vIGdldFNDRVZBdFNjb3BlIC0gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHdoaWNoIGRvZXMKKyAgICAvLy8gZ2V0U0NFVkF0U2NvcGUoZ2V0U0NFVihWKSwgTCkuCisgICAgY29uc3QgU0NFViAqZ2V0U0NFVkF0U2NvcGUoVmFsdWUgKlYsIGNvbnN0IExvb3AgKkwpOworCisgICAgLy8vIGlzTG9vcEVudHJ5R3VhcmRlZEJ5Q29uZCAtIFRlc3Qgd2hldGhlciBlbnRyeSB0byB0aGUgbG9vcCBpcyBwcm90ZWN0ZWQKKyAgICAvLy8gYnkgYSBjb25kaXRpb25hbCBiZXR3ZWVuIExIUyBhbmQgUkhTLiAgVGhpcyBpcyB1c2VkIHRvIGhlbHAgYXZvaWQgbWF4CisgICAgLy8vIGV4cHJlc3Npb25zIGluIGxvb3AgdHJpcCBjb3VudHMsIGFuZCB0byBlbGltaW5hdGUgY2FzdHMuCisgICAgYm9vbCBpc0xvb3BFbnRyeUd1YXJkZWRCeUNvbmQoY29uc3QgTG9vcCAqTCwgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICAgIC8vLyBpc0xvb3BCYWNrZWRnZUd1YXJkZWRCeUNvbmQgLSBUZXN0IHdoZXRoZXIgdGhlIGJhY2tlZGdlIG9mIHRoZSBsb29wIGlzCisgICAgLy8vIHByb3RlY3RlZCBieSBhIGNvbmRpdGlvbmFsIGJldHdlZW4gTEhTIGFuZCBSSFMuICBUaGlzIGlzIHVzZWQgdG8KKyAgICAvLy8gdG8gZWxpbWluYXRlIGNhc3RzLgorICAgIGJvb2wgaXNMb29wQmFja2VkZ2VHdWFyZGVkQnlDb25kKGNvbnN0IExvb3AgKkwsIElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgICAvLy8gZ2V0QmFja2VkZ2VUYWtlbkNvdW50IC0gSWYgdGhlIHNwZWNpZmllZCBsb29wIGhhcyBhIHByZWRpY3RhYmxlCisgICAgLy8vIGJhY2tlZGdlLXRha2VuIGNvdW50LCByZXR1cm4gaXQsIG90aGVyd2lzZSByZXR1cm4gYSBTQ0VWQ291bGROb3RDb21wdXRlCisgICAgLy8vIG9iamVjdC4gVGhlIGJhY2tlZGdlLXRha2VuIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGxvb3AgaGVhZGVyCisgICAgLy8vIHdpbGwgYmUgYnJhbmNoZWQgdG8gZnJvbSB3aXRoaW4gdGhlIGxvb3AuIFRoaXMgaXMgb25lIGxlc3MgdGhhbiB0aGUKKyAgICAvLy8gdHJpcCBjb3VudCBvZiB0aGUgbG9vcCwgc2luY2UgaXQgZG9lc24ndCBjb3VudCB0aGUgZmlyc3QgaXRlcmF0aW9uLAorICAgIC8vLyB3aGVuIHRoZSBoZWFkZXIgaXMgYnJhbmNoZWQgdG8gZnJvbSBvdXRzaWRlIHRoZSBsb29wLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgaXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgdGhpcyBtZXRob2Qgb24gYSBsb29wIHdpdGhvdXQgYQorICAgIC8vLyBsb29wLWludmFyaWFudCBiYWNrZWRnZS10YWtlbiBjb3VudCAoc2VlCisgICAgLy8vIGhhc0xvb3BJbnZhcmlhbnRCYWNrZWRnZVRha2VuQ291bnQpLgorICAgIC8vLworICAgIGNvbnN0IFNDRVYgKmdldEJhY2tlZGdlVGFrZW5Db3VudChjb25zdCBMb29wICpMKTsKKworICAgIC8vLyBnZXRNYXhCYWNrZWRnZVRha2VuQ291bnQgLSBTaW1pbGFyIHRvIGdldEJhY2tlZGdlVGFrZW5Db3VudCwgZXhjZXB0CisgICAgLy8vIHJldHVybiB0aGUgbGVhc3QgU0NFViB2YWx1ZSB0aGF0IGlzIGtub3duIG5ldmVyIHRvIGJlIGxlc3MgdGhhbiB0aGUKKyAgICAvLy8gYWN0dWFsIGJhY2tlZGdlIHRha2VuIGNvdW50LgorICAgIGNvbnN0IFNDRVYgKmdldE1heEJhY2tlZGdlVGFrZW5Db3VudChjb25zdCBMb29wICpMKTsKKworICAgIC8vLyBoYXNMb29wSW52YXJpYW50QmFja2VkZ2VUYWtlbkNvdW50IC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBsb29wCisgICAgLy8vIGhhcyBhbiBhbmFseXphYmxlIGxvb3AtaW52YXJpYW50IGJhY2tlZGdlLXRha2VuIGNvdW50LgorICAgIGJvb2wgaGFzTG9vcEludmFyaWFudEJhY2tlZGdlVGFrZW5Db3VudChjb25zdCBMb29wICpMKTsKKworICAgIC8vLyBmb3JnZXRMb29wIC0gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgY2xpZW50IHdoZW4gaXQgaGFzCisgICAgLy8vIGNoYW5nZWQgYSBsb29wIGluIGEgd2F5IHRoYXQgbWF5IGVmZmVjdCBTY2FsYXJFdm9sdXRpb24ncyBhYmlsaXR5IHRvCisgICAgLy8vIGNvbXB1dGUgYSB0cmlwIGNvdW50LCBvciBpZiB0aGUgbG9vcCBpcyBkZWxldGVkLgorICAgIHZvaWQgZm9yZ2V0TG9vcChjb25zdCBMb29wICpMKTsKKworICAgIC8vLyBmb3JnZXRWYWx1ZSAtIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNsaWVudCB3aGVuIGl0IGhhcworICAgIC8vLyBjaGFuZ2VkIGEgdmFsdWUgaW4gYSB3YXkgdGhhdCBtYXkgZWZmZWN0IGl0cyB2YWx1ZSwgb3Igd2hpY2ggbWF5CisgICAgLy8vIGRpc2Nvbm5lY3QgaXQgZnJvbSBhIGRlZi11c2UgY2hhaW4gbGlua2luZyBpdCB0byBhIGxvb3AuCisgICAgdm9pZCBmb3JnZXRWYWx1ZShWYWx1ZSAqVik7CisKKyAgICAvLy8gR2V0TWluVHJhaWxpbmdaZXJvcyAtIERldGVybWluZSB0aGUgbWluaW11bSBudW1iZXIgb2YgemVybyBiaXRzIHRoYXQgUworICAgIC8vLyBpcyBndWFyYW50ZWVkIHRvIGVuZCBpbiAoYXQgZXZlcnkgbG9vcCBpdGVyYXRpb24pLiAgSXQgaXMsIGF0IHRoZSBzYW1lCisgICAgLy8vIHRpbWUsIHRoZSBtaW5pbXVtIG51bWJlciBvZiB0aW1lcyBTIGlzIGRpdmlzaWJsZSBieSAyLiAgRm9yIGV4YW1wbGUsCisgICAgLy8vIGdpdmVuIHs0LCssOH0gaXQgcmV0dXJucyAyLiAgSWYgUyBpcyBndWFyYW50ZWVkIHRvIGJlIDAsIGl0IHJldHVybnMgdGhlCisgICAgLy8vIGJpdHdpZHRoIG9mIFMuCisgICAgdWludDMyX3QgR2V0TWluVHJhaWxpbmdaZXJvcyhjb25zdCBTQ0VWICpTKTsKKworICAgIC8vLyBnZXRVbnNpZ25lZFJhbmdlIC0gRGV0ZXJtaW5lIHRoZSB1bnNpZ25lZCByYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIFNDRVYuCisgICAgLy8vCisgICAgQ29uc3RhbnRSYW5nZSBnZXRVbnNpZ25lZFJhbmdlKGNvbnN0IFNDRVYgKlMpOworCisgICAgLy8vIGdldFNpZ25lZFJhbmdlIC0gRGV0ZXJtaW5lIHRoZSBzaWduZWQgcmFuZ2UgZm9yIGEgcGFydGljdWxhciBTQ0VWLgorICAgIC8vLworICAgIENvbnN0YW50UmFuZ2UgZ2V0U2lnbmVkUmFuZ2UoY29uc3QgU0NFViAqUyk7CisKKyAgICAvLy8gaXNLbm93bk5lZ2F0aXZlIC0gVGVzdCBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBrbm93biB0byBiZSBuZWdhdGl2ZS4KKyAgICAvLy8KKyAgICBib29sIGlzS25vd25OZWdhdGl2ZShjb25zdCBTQ0VWICpTKTsKKworICAgIC8vLyBpc0tub3duUG9zaXRpdmUgLSBUZXN0IGlmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIGtub3duIHRvIGJlIHBvc2l0aXZlLgorICAgIC8vLworICAgIGJvb2wgaXNLbm93blBvc2l0aXZlKGNvbnN0IFNDRVYgKlMpOworCisgICAgLy8vIGlzS25vd25Ob25OZWdhdGl2ZSAtIFRlc3QgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMga25vd24gdG8gYmUKKyAgICAvLy8gbm9uLW5lZ2F0aXZlLgorICAgIC8vLworICAgIGJvb2wgaXNLbm93bk5vbk5lZ2F0aXZlKGNvbnN0IFNDRVYgKlMpOworCisgICAgLy8vIGlzS25vd25Ob25Qb3NpdGl2ZSAtIFRlc3QgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMga25vd24gdG8gYmUKKyAgICAvLy8gbm9uLXBvc2l0aXZlLgorICAgIC8vLworICAgIGJvb2wgaXNLbm93bk5vblBvc2l0aXZlKGNvbnN0IFNDRVYgKlMpOworCisgICAgLy8vIGlzS25vd25Ob25aZXJvIC0gVGVzdCBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBrbm93biB0byBiZQorICAgIC8vLyBub24temVyby4KKyAgICAvLy8KKyAgICBib29sIGlzS25vd25Ob25aZXJvKGNvbnN0IFNDRVYgKlMpOworCisgICAgLy8vIGlzS25vd25QcmVkaWNhdGUgLSBUZXN0IGlmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIGtub3duIHRvIHNhdGlzZnkKKyAgICAvLy8gdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgTEhTLCBhbmQgUkhTLgorICAgIC8vLworICAgIGJvb2wgaXNLbm93blByZWRpY2F0ZShJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICAgIC8vLyBTaW1wbGlmeUlDbXBPcGVyYW5kcyAtIFNpbXBsaWZ5IExIUyBhbmQgUkhTIGluIGEgY29tcGFyaXNvbiB3aXRoCisgICAgLy8vIHByZWRpY2F0ZSBQcmVkLiBSZXR1cm4gdHJ1ZSBpZmYgYW55IGNoYW5nZXMgd2VyZSBtYWRlLiBJZiB0aGUKKyAgICAvLy8gb3BlcmFuZHMgYXJlIHByb3ZhYmx5IGVxdWFsIG9yIGluZXF1YWwsIExIUyBhbmQgUkhTIGFyZSBzZXQgdG8KKyAgICAvLy8gdGhlIHNhbWUgdmFsdWUgYW5kIFByZWQgaXMgc2V0IHRvIGVpdGhlciBJQ01QX0VRIG9yIElDTVBfTkUuCisgICAgLy8vCisgICAgYm9vbCBTaW1wbGlmeUlDbXBPcGVyYW5kcyhJQ21wSW5zdDo6UHJlZGljYXRlICZQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKiZSSFMpOworCisgICAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSogPSAwKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIEZvbGRpbmdTZXQ8U0NFVj4gVW5pcXVlU0NFVnM7CisgICAgQnVtcFB0ckFsbG9jYXRvciBTQ0VWQWxsb2NhdG9yOworCisgICAgLy8vIEZpcnN0VW5rbm93biAtIFRoZSBoZWFkIG9mIGEgbGlua2VkIGxpc3Qgb2YgYWxsIFNDRVZVbmtub3duCisgICAgLy8vIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQuIFRoaXMgaXMgdXNlZCBieSByZWxlYXNlTWVtb3J5CisgICAgLy8vIHRvIGxvY2F0ZSB0aGVtIGFsbCBhbmQgY2FsbCB0aGVpciBkZXN0cnVjdG9ycy4KKyAgICBTQ0VWVW5rbm93biAqRmlyc3RVbmtub3duOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHBhbmRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cGFuZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1NjU1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHBhbmRlci5oCkBAIC0wLDAgKzEsMjA5IEBACisvLz09PS0tLS0gbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHBhbmRlci5oIC0gU0NFViBFeHBycyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjbGFzc2VzIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSBmcm9tIHNjYWxhciBleHByZXNzaW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9OX0VYUEFOREVSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05fRVhQQU5ERVJfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGFyZ2V0Rm9sZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vLyBTQ0VWRXhwYW5kZXIgLSBUaGlzIGNsYXNzIHVzZXMgaW5mb3JtYXRpb24gYWJvdXQgYW5hbHl6ZSBzY2FsYXJzIHRvCisgIC8vLyByZXdyaXRlIGV4cHJlc3Npb25zIGluIGNhbm9uaWNhbCBmb3JtLgorICAvLy8KKyAgLy8vIENsaWVudHMgc2hvdWxkIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdoZW4gcmV3cml0aW5nIGlzIG5lZWRlZCwKKyAgLy8vIGFuZCBkZXN0cm95IGl0IHdoZW4gZmluaXNoZWQgdG8gYWxsb3cgdGhlIHJlbGVhc2Ugb2YgdGhlIGFzc29jaWF0ZWQKKyAgLy8vIG1lbW9yeS4KKyAgY2xhc3MgU0NFVkV4cGFuZGVyIDogcHVibGljIFNDRVZWaXNpdG9yPFNDRVZFeHBhbmRlciwgVmFsdWUqPiB7CisgICAgU2NhbGFyRXZvbHV0aW9uICZTRTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLCBJbnN0cnVjdGlvbiAqPiwgQXNzZXJ0aW5nVkg8VmFsdWU+ID4KKyAgICAgIEluc2VydGVkRXhwcmVzc2lvbnM7CisgICAgc3RkOjpzZXQ8QXNzZXJ0aW5nVkg8VmFsdWU+ID4gSW5zZXJ0ZWRWYWx1ZXM7CisgICAgc3RkOjpzZXQ8QXNzZXJ0aW5nVkg8VmFsdWU+ID4gSW5zZXJ0ZWRQb3N0SW5jVmFsdWVzOworCisgICAgLy8vIFBvc3RJbmNMb29wcyAtIEFkZHJlY3MgcmVmZXJyaW5nIHRvIGFueSBvZiB0aGUgZ2l2ZW4gbG9vcHMgYXJlIGV4cGFuZGVkCisgICAgLy8vIGluIHBvc3QtaW5jIG1vZGUuIEZvciBleGFtcGxlLCBleHBhbmRpbmcgezEsKywxfTxMPiBpbiBwb3N0LWluYyBtb2RlCisgICAgLy8vIHJldHVybnMgdGhlIGFkZCBpbnN0cnVjdGlvbiB0aGF0IGFkZHMgb25lIHRvIHRoZSBwaGkgZm9yIHswLCssMX08TD4sCisgICAgLy8vIGFzIG9wcG9zZWQgdG8gYSBuZXcgcGhpIHN0YXJ0aW5nIGF0IDEuIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgaW4KKyAgICAvLy8gbm9uLWNhbm9uaWNhbCBtb2RlLgorICAgIFBvc3RJbmNMb29wU2V0IFBvc3RJbmNMb29wczsKKworICAgIC8vLyBJVkluY0luc2VydFBvcyAtIFdoZW4gdGhpcyBpcyBub24tbnVsbCwgYWRkcmVjcyBleHBhbmRlZCBpbiB0aGUKKyAgICAvLy8gbG9vcCBpdCBpbmRpY2F0ZXMgc2hvdWxkIGJlIGluc2VydGVkIHdpdGggaW5jcmVtZW50cyBhdAorICAgIC8vLyBJVkluY0luc2VydFBvcy4KKyAgICBjb25zdCBMb29wICpJVkluY0luc2VydExvb3A7CisKKyAgICAvLy8gSVZJbmNJbnNlcnRQb3MgLSBXaGVuIGV4cGFuZGluZyBhZGRyZWNzIGluIHRoZSBJVkluY0luc2VydExvb3AgbG9vcCwKKyAgICAvLy8gaW5zZXJ0IHRoZSBJViBpbmNyZW1lbnQgYXQgdGhpcyBwb3NpdGlvbi4KKyAgICBJbnN0cnVjdGlvbiAqSVZJbmNJbnNlcnRQb3M7CisKKyAgICAvLy8gQ2Fub25pY2FsTW9kZSAtIFdoZW4gdHJ1ZSwgZXhwcmVzc2lvbnMgYXJlIGV4cGFuZGVkIGluICJjYW5vbmljYWwiCisgICAgLy8vIGZvcm0uIEluIHBhcnRpY3VsYXIsIGFkZHJlY3MgYXJlIGV4cGFuZGVkIGFzIGFyaXRobWV0aWMgYmFzZWQgb24KKyAgICAvLy8gYSBjYW5vbmljYWwgaW5kdWN0aW9uIHZhcmlhYmxlLiBXaGVuIGZhbHNlLCBleHByZXNzaW9uIGFyZSBleHBhbmRlZAorICAgIC8vLyBpbiBhIG1vcmUgbGl0ZXJhbCBmb3JtLgorICAgIGJvb2wgQ2Fub25pY2FsTW9kZTsKKworICAgIHR5cGVkZWYgSVJCdWlsZGVyPFRhcmdldEZvbGRlcj4gQnVpbGRlclR5cGU7CisgICAgQnVpbGRlclR5cGUgQnVpbGRlcjsKKworICAgIGZyaWVuZCBzdHJ1Y3QgU0NFVlZpc2l0b3I8U0NFVkV4cGFuZGVyLCBWYWx1ZSo+OworCisgIHB1YmxpYzoKKyAgICAvLy8gU0NFVkV4cGFuZGVyIC0gQ29uc3RydWN0IGEgU0NFVkV4cGFuZGVyIGluICJjYW5vbmljYWwiIG1vZGUuCisgICAgZXhwbGljaXQgU0NFVkV4cGFuZGVyKFNjYWxhckV2b2x1dGlvbiAmc2UpCisgICAgICA6IFNFKHNlKSwgSVZJbmNJbnNlcnRMb29wKDApLCBDYW5vbmljYWxNb2RlKHRydWUpLAorICAgICAgICBCdWlsZGVyKHNlLmdldENvbnRleHQoKSwgVGFyZ2V0Rm9sZGVyKHNlLlREKSkge30KKworICAgIC8vLyBjbGVhciAtIEVyYXNlIHRoZSBjb250ZW50cyBvZiB0aGUgSW5zZXJ0ZWRFeHByZXNzaW9ucyBtYXAgc28gdGhhdCB1c2VycworICAgIC8vLyB0cnlpbmcgdG8gZXhwYW5kIHRoZSBzYW1lIGV4cHJlc3Npb24gaW50byBtdWx0aXBsZSBCYXNpY0Jsb2NrcyBvcgorICAgIC8vLyBkaWZmZXJlbnQgcGxhY2VzIHdpdGhpbiB0aGUgc2FtZSBCYXNpY0Jsb2NrIGNhbiBkbyBzby4KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgSW5zZXJ0ZWRFeHByZXNzaW9ucy5jbGVhcigpOworICAgICAgSW5zZXJ0ZWRWYWx1ZXMuY2xlYXIoKTsKKyAgICAgIEluc2VydGVkUG9zdEluY1ZhbHVlcy5jbGVhcigpOworICAgIH0KKworICAgIC8vLyBnZXRPckluc2VydENhbm9uaWNhbEluZHVjdGlvblZhcmlhYmxlIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUKKyAgICAvLy8gY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gbG9vcCAoaW5zZXJ0aW5nIG9uZSBpZiB0aGVyZSBpcyBub25lKS4gIEEgY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZQorICAgIC8vLyBzdGFydHMgYXQgemVybyBhbmQgc3RlcHMgYnkgb25lIG9uIGVhY2ggaXRlcmF0aW9uLgorICAgIFBISU5vZGUgKmdldE9ySW5zZXJ0Q2Fub25pY2FsSW5kdWN0aW9uVmFyaWFibGUoY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KTsKKworICAgIC8vLyBleHBhbmRDb2RlRm9yIC0gSW5zZXJ0IGNvZGUgdG8gZGlyZWN0bHkgY29tcHV0ZSB0aGUgc3BlY2lmaWVkIFNDRVYKKyAgICAvLy8gZXhwcmVzc2lvbiBpbnRvIHRoZSBwcm9ncmFtLiAgVGhlIGluc2VydGVkIGNvZGUgaXMgaW5zZXJ0ZWQgaW50byB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGJsb2NrLgorICAgIFZhbHVlICpleHBhbmRDb2RlRm9yKGNvbnN0IFNDRVYgKlNILCBjb25zdCBUeXBlICpUeSwgSW5zdHJ1Y3Rpb24gKkkpOworCisgICAgLy8vIHNldElWSW5jSW5zZXJ0UG9zIC0gU2V0IHRoZSBjdXJyZW50IElWIGluY3JlbWVudCBsb29wIGFuZCBwb3NpdGlvbi4KKyAgICB2b2lkIHNldElWSW5jSW5zZXJ0UG9zKGNvbnN0IExvb3AgKkwsIEluc3RydWN0aW9uICpQb3MpIHsKKyAgICAgIGFzc2VydCghQ2Fub25pY2FsTW9kZSAmJgorICAgICAgICAgICAgICJJViBpbmNyZW1lbnQgcG9zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIENhbm9uaWNhbE1vZGUiKTsKKyAgICAgIElWSW5jSW5zZXJ0TG9vcCA9IEw7CisgICAgICBJVkluY0luc2VydFBvcyA9IFBvczsKKyAgICB9CisKKyAgICAvLy8gc2V0UG9zdEluYyAtIEVuYWJsZSBwb3N0LWluYyBleHBhbnNpb24gZm9yIGFkZHJlY3MgcmVmZXJyaW5nIHRvIHRoZQorICAgIC8vLyBnaXZlbiBsb29wcy4gUG9zdC1pbmMgZXhwYW5zaW9uIGlzIG9ubHkgc3VwcG9ydGVkIGluIG5vbi1jYW5vbmljYWwKKyAgICAvLy8gbW9kZS4KKyAgICB2b2lkIHNldFBvc3RJbmMoY29uc3QgUG9zdEluY0xvb3BTZXQgJkwpIHsKKyAgICAgIGFzc2VydCghQ2Fub25pY2FsTW9kZSAmJgorICAgICAgICAgICAgICJQb3N0LWluYyBleHBhbnNpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBDYW5vbmljYWxNb2RlIik7CisgICAgICBQb3N0SW5jTG9vcHMgPSBMOworICAgIH0KKworICAgIC8vLyBjbGVhclBvc3RJbmMgLSBEaXNhYmxlIGFsbCBwb3N0LWluYyBleHBhbnNpb24uCisgICAgdm9pZCBjbGVhclBvc3RJbmMoKSB7CisgICAgICBQb3N0SW5jTG9vcHMuY2xlYXIoKTsKKworICAgICAgLy8gV2hlbiB3ZSBjaGFuZ2UgdGhlIHBvc3QtaW5jIGxvb3Agc2V0LCBjYWNoZWQgZXhwYW5zaW9ucyBtYXkgbm8KKyAgICAgIC8vIGxvbmdlciBiZSB2YWxpZC4KKyAgICAgIEluc2VydGVkUG9zdEluY1ZhbHVlcy5jbGVhcigpOworICAgIH0KKworICAgIC8vLyBkaXNhYmxlQ2Fub25pY2FsTW9kZSAtIERpc2FibGUgdGhlIGJlaGF2aW9yIG9mIGV4cGFuZGluZyBleHByZXNzaW9ucyBpbgorICAgIC8vLyBjYW5vbmljYWwgZm9ybSByYXRoZXIgdGhhbiBpbiBhIG1vcmUgbGl0ZXJhbCBmb3JtLiBOb24tY2Fub25pY2FsIG1vZGUKKyAgICAvLy8gaXMgdXNlZnVsIGZvciBsYXRlIG9wdGltaXphdGlvbiBwYXNzZXMuCisgICAgdm9pZCBkaXNhYmxlQ2Fub25pY2FsTW9kZSgpIHsgQ2Fub25pY2FsTW9kZSA9IGZhbHNlOyB9CisKKyAgICAvLy8gY2xlYXJJbnNlcnRQb2ludCAtIENsZWFyIHRoZSBjdXJyZW50IGluc2VydGlvbiBwb2ludC4gVGhpcyBpcyB1c2VmdWwKKyAgICAvLy8gaWYgdGhlIGluc3RydWN0aW9uIHRoYXQgaGFkIGJlZW4gc2VydmluZyBhcyB0aGUgaW5zZXJ0aW9uIHBvaW50IG1heQorICAgIC8vLyBoYXZlIGJlZW4gZGVsZXRlZC4KKyAgICB2b2lkIGNsZWFySW5zZXJ0UG9pbnQoKSB7CisgICAgICBCdWlsZGVyLkNsZWFySW5zZXJ0aW9uUG9pbnQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIFNFLmdldENvbnRleHQoKTsgfQorCisgICAgLy8vIEluc2VydEJpbm9wIC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgYmluYXJ5IG9wZXJhdG9yLCBkb2luZyBhIHNtYWxsIGFtb3VudAorICAgIC8vLyBvZiB3b3JrIHRvIGF2b2lkIGluc2VydGluZyBhbiBvYnZpb3VzbHkgcmVkdW5kYW50IG9wZXJhdGlvbi4KKyAgICBWYWx1ZSAqSW5zZXJ0Qmlub3AoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBPcGNvZGUsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMpOworCisgICAgLy8vIFJldXNlT3JDcmVhdGVDYXN0IC0gQXJhbmdlIGZvciB0aGVyZSB0byBiZSBhIGNhc3Qgb2YgViB0byBUeSBhdCBJUCwKKyAgICAvLy8gcmV1c2luZyBhbiBleGlzdGluZyBjYXN0IGlmIGEgc3VpdGFibGUgb25lIGV4aXN0cywgbW92aW5nIGFuIGV4aXN0aW5nCisgICAgLy8vIGNhc3QgaWYgYSBzdWl0YWJsZSBvbmUgZXhpc3RzIGJ1dCBpc24ndCBpbiB0aGUgcmlnaHQgcGxhY2UsIG9yCisgICAgLy8vIG9yIGNyZWF0aW5nIGEgbmV3IG9uZS4KKyAgICBWYWx1ZSAqUmV1c2VPckNyZWF0ZUNhc3QoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVApOworCisgICAgLy8vIEluc2VydE5vb3BDYXN0T2ZUbyAtIEluc2VydCBhIGNhc3Qgb2YgViB0byB0aGUgc3BlY2lmaWVkIHR5cGUsCisgICAgLy8vIHdoaWNoIG11c3QgYmUgcG9zc2libGUgd2l0aCBhIG5vb3AgY2FzdCwgZG9pbmcgd2hhdCB3ZSBjYW4gdG8KKyAgICAvLy8gc2hhcmUgdGhlIGNhc3RzLgorICAgIFZhbHVlICpJbnNlcnROb29wQ2FzdE9mVG8oVmFsdWUgKlYsIGNvbnN0IFR5cGUgKlR5KTsKKworICAgIC8vLyBleHBhbmRBZGRUb0dFUCAtIEV4cGFuZCBhIFNDRVZBZGRFeHByIHdpdGggYSBwb2ludGVyIHR5cGUgaW50byBhIEdFUAorICAgIC8vLyBpbnN0ZWFkIG9mIHVzaW5nIHB0cnRvaW50K2FyaXRobWV0aWMraW50dG9wdHIuCisgICAgVmFsdWUgKmV4cGFuZEFkZFRvR0VQKGNvbnN0IFNDRVYgKmNvbnN0ICpvcF9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqY29uc3QgKm9wX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlclR5cGUgKlBUeSwgY29uc3QgVHlwZSAqVHksIFZhbHVlICpWKTsKKworICAgIFZhbHVlICpleHBhbmQoY29uc3QgU0NFViAqUyk7CisKKyAgICAvLy8gZXhwYW5kQ29kZUZvciAtIEluc2VydCBjb2RlIHRvIGRpcmVjdGx5IGNvbXB1dGUgdGhlIHNwZWNpZmllZCBTQ0VWCisgICAgLy8vIGV4cHJlc3Npb24gaW50byB0aGUgcHJvZ3JhbS4gIFRoZSBpbnNlcnRlZCBjb2RlIGlzIGluc2VydGVkIGludG8gdGhlCisgICAgLy8vIFNDRVZFeHBhbmRlcidzIGN1cnJlbnQgaW5zZXJ0aW9uIHBvaW50LiBJZiBhIHR5cGUgaXMgc3BlY2lmaWVkLCB0aGUKKyAgICAvLy8gcmVzdWx0IHdpbGwgYmUgZXhwYW5kZWQgdG8gaGF2ZSB0aGF0IHR5cGUsIHdpdGggYSBjYXN0IGlmIG5lY2Vzc2FyeS4KKyAgICBWYWx1ZSAqZXhwYW5kQ29kZUZvcihjb25zdCBTQ0VWICpTSCwgY29uc3QgVHlwZSAqVHkgPSAwKTsKKworICAgIC8vLyBpc0luc2VydGVkSW5zdHJ1Y3Rpb24gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHdhcworICAgIC8vLyBpbnNlcnRlZCBieSB0aGUgY29kZSByZXdyaXRlci4gIElmIHNvLCB0aGUgY2xpZW50IHNob3VsZCBub3QgbW9kaWZ5IHRoZQorICAgIC8vLyBpbnN0cnVjdGlvbi4KKyAgICBib29sIGlzSW5zZXJ0ZWRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSkgY29uc3QgeworICAgICAgcmV0dXJuIEluc2VydGVkVmFsdWVzLmNvdW50KEkpIHx8IEluc2VydGVkUG9zdEluY1ZhbHVlcy5jb3VudChJKTsKKyAgICB9CisKKyAgICBWYWx1ZSAqdmlzaXRDb25zdGFudChjb25zdCBTQ0VWQ29uc3RhbnQgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIFZhbHVlICp2aXNpdFRydW5jYXRlRXhwcihjb25zdCBTQ0VWVHJ1bmNhdGVFeHByICpTKTsKKworICAgIFZhbHVlICp2aXNpdFplcm9FeHRlbmRFeHByKGNvbnN0IFNDRVZaZXJvRXh0ZW5kRXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRTaWduRXh0ZW5kRXhwcihjb25zdCBTQ0VWU2lnbkV4dGVuZEV4cHIgKlMpOworCisgICAgVmFsdWUgKnZpc2l0QWRkRXhwcihjb25zdCBTQ0VWQWRkRXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRNdWxFeHByKGNvbnN0IFNDRVZNdWxFeHByICpTKTsKKworICAgIFZhbHVlICp2aXNpdFVEaXZFeHByKGNvbnN0IFNDRVZVRGl2RXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRBZGRSZWNFeHByKGNvbnN0IFNDRVZBZGRSZWNFeHByICpTKTsKKworICAgIFZhbHVlICp2aXNpdFNNYXhFeHByKGNvbnN0IFNDRVZTTWF4RXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRVTWF4RXhwcihjb25zdCBTQ0VWVU1heEV4cHIgKlMpOworCisgICAgVmFsdWUgKnZpc2l0VW5rbm93bihjb25zdCBTQ0VWVW5rbm93biAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCByZW1lbWJlckluc3RydWN0aW9uKFZhbHVlICpJKTsKKworICAgIHZvaWQgcmVzdG9yZUluc2VydFBvaW50KEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrOjppdGVyYXRvciBJKTsKKworICAgIFZhbHVlICpleHBhbmRBZGRSZWNFeHByTGl0ZXJhbGx5KGNvbnN0IFNDRVZBZGRSZWNFeHByICopOworICAgIFBISU5vZGUgKmdldEFkZFJlY0V4cHJQSElMaXRlcmFsbHkoY29uc3QgU0NFVkFkZFJlY0V4cHIgKk5vcm1hbGl6ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqRXhwYW5kVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpJbnRUeSk7CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwcmVzc2lvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTg0NmUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmgKQEAgLTAsMCArMSw2MjIgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmggLSBTQ0VWIEV4cHJzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNsYXNzZXMgdXNlZCB0byByZXByZXNlbnQgYW5kIGJ1aWxkIHNjYWxhciBleHByZXNzaW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9OX0VYUFJFU1NJT05TX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05fRVhQUkVTU0lPTlNfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIENvbnN0YW50SW50OworICBjbGFzcyBDb25zdGFudFJhbmdlOworICBjbGFzcyBEb21pbmF0b3JUcmVlOworCisgIGVudW0gU0NFVlR5cGVzIHsKKyAgICAvLyBUaGVzZSBzaG91bGQgYmUgb3JkZXJlZCBpbiB0ZXJtcyBvZiBpbmNyZWFzaW5nIGNvbXBsZXhpdHkgdG8gbWFrZSB0aGUKKyAgICAvLyBmb2xkZXJzIHNpbXBsZXIuCisgICAgc2NDb25zdGFudCwgc2NUcnVuY2F0ZSwgc2NaZXJvRXh0ZW5kLCBzY1NpZ25FeHRlbmQsIHNjQWRkRXhwciwgc2NNdWxFeHByLAorICAgIHNjVURpdkV4cHIsIHNjQWRkUmVjRXhwciwgc2NVTWF4RXhwciwgc2NTTWF4RXhwciwKKyAgICBzY1Vua25vd24sIHNjQ291bGROb3RDb21wdXRlCisgIH07CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBTQ0VWQ29uc3RhbnQgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjb25zdGFudCBpbnRlZ2VyIHZhbHVlLgorICAvLy8KKyAgY2xhc3MgU0NFVkNvbnN0YW50IDogcHVibGljIFNDRVYgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBDb25zdGFudEludCAqVjsKKyAgICBTQ0VWQ29uc3RhbnQoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwgQ29uc3RhbnRJbnQgKnYpIDoKKyAgICAgIFNDRVYoSUQsIHNjQ29uc3RhbnQpLCBWKHYpIHt9CisgIHB1YmxpYzoKKyAgICBDb25zdGFudEludCAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNMb29wSW52YXJpYW50KGNvbnN0IExvb3AgKkwpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBoYXNDb21wdXRhYmxlTG9vcEV2b2x1dGlvbihjb25zdCBMb29wICpMKSBjb25zdCB7CisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBOb3QgbG9vcCB2YXJpYW50CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBUeXBlICpnZXRUeXBlKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgaGFzT3BlcmFuZChjb25zdCBTQ0VWICopIGNvbnN0IHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGRvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoQmFzaWNCbG9jayAqQkIsIERvbWluYXRvclRyZWUgKkRUKSBjb25zdCB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVZDb25zdGFudCAqUykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjQ29uc3RhbnQ7CisgICAgfQorICB9OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gU0NFVkNhc3RFeHByIC0gVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgdW5hcnkgY2FzdCBvcGVyYXRvciBjbGFzc2VzLgorICAvLy8KKyAgY2xhc3MgU0NFVkNhc3RFeHByIDogcHVibGljIFNDRVYgeworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgU0NFViAqT3A7CisgICAgY29uc3QgVHlwZSAqVHk7CisKKyAgICBTQ0VWQ2FzdEV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgU0NFVlR5LCBjb25zdCBTQ0VWICpvcCwgY29uc3QgVHlwZSAqdHkpOworCisgIHB1YmxpYzoKKyAgICBjb25zdCBTQ0VWICpnZXRPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gT3A7IH0KKyAgICB2aXJ0dWFsIGNvbnN0IFR5cGUgKmdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeTsgfQorCisgICAgdmlydHVhbCBib29sIGlzTG9vcEludmFyaWFudChjb25zdCBMb29wICpMKSBjb25zdCB7CisgICAgICByZXR1cm4gT3AtPmlzTG9vcEludmFyaWFudChMKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaGFzQ29tcHV0YWJsZUxvb3BFdm9sdXRpb24oY29uc3QgTG9vcCAqTCkgY29uc3QgeworICAgICAgcmV0dXJuIE9wLT5oYXNDb21wdXRhYmxlTG9vcEV2b2x1dGlvbihMKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaGFzT3BlcmFuZChjb25zdCBTQ0VWICpPKSBjb25zdCB7CisgICAgICByZXR1cm4gT3AgPT0gTyB8fCBPcC0+aGFzT3BlcmFuZChPKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZG9taW5hdGVzKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoQmFzaWNCbG9jayAqQkIsIERvbWluYXRvclRyZWUgKkRUKSBjb25zdDsKKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVZDYXN0RXhwciAqUykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjVHJ1bmNhdGUgfHwKKyAgICAgICAgICAgICBTLT5nZXRTQ0VWVHlwZSgpID09IHNjWmVyb0V4dGVuZCB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NTaWduRXh0ZW5kOworICAgIH0KKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNDRVZUcnVuY2F0ZUV4cHIgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB0cnVuY2F0aW9uIG9mIGFuIGludGVnZXIgdmFsdWUKKyAgLy8vIHRvIGEgc21hbGxlciBpbnRlZ2VyIHZhbHVlLgorICAvLy8KKyAgY2xhc3MgU0NFVlRydW5jYXRlRXhwciA6IHB1YmxpYyBTQ0VWQ2FzdEV4cHIgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBTQ0VWVHJ1bmNhdGVFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpvcCwgY29uc3QgVHlwZSAqdHkpOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVZUcnVuY2F0ZUV4cHIgKlMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1RydW5jYXRlOworICAgIH0KKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNDRVZaZXJvRXh0ZW5kRXhwciAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHplcm8gZXh0ZW5zaW9uIG9mIGEgc21hbGwKKyAgLy8vIGludGVnZXIgdmFsdWUgdG8gYSBsYXJnZXIgaW50ZWdlciB2YWx1ZS4KKyAgLy8vCisgIGNsYXNzIFNDRVZaZXJvRXh0ZW5kRXhwciA6IHB1YmxpYyBTQ0VWQ2FzdEV4cHIgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBTQ0VWWmVyb0V4dGVuZEV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqb3AsIGNvbnN0IFR5cGUgKnR5KTsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWWmVyb0V4dGVuZEV4cHIgKlMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1plcm9FeHRlbmQ7CisgICAgfQorICB9OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gU0NFVlNpZ25FeHRlbmRFeHByIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2lnbiBleHRlbnNpb24gb2YgYSBzbWFsbAorICAvLy8gaW50ZWdlciB2YWx1ZSB0byBhIGxhcmdlciBpbnRlZ2VyIHZhbHVlLgorICAvLy8KKyAgY2xhc3MgU0NFVlNpZ25FeHRlbmRFeHByIDogcHVibGljIFNDRVZDYXN0RXhwciB7CisgICAgZnJpZW5kIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworICAgIFNDRVZTaWduRXh0ZW5kRXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpvcCwgY29uc3QgVHlwZSAqdHkpOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVZTaWduRXh0ZW5kRXhwciAqUykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjU2lnbkV4dGVuZDsKKyAgICB9CisgIH07CisKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNDRVZOQXJ5RXhwciAtIFRoaXMgbm9kZSBpcyBhIGJhc2UgY2xhc3MgcHJvdmlkaW5nIGNvbW1vbgorICAvLy8gZnVuY3Rpb25hbGl0eSBmb3Igbidhcnkgb3BlcmF0b3JzLgorICAvLy8KKyAgY2xhc3MgU0NFVk5BcnlFeHByIDogcHVibGljIFNDRVYgeworICBwcm90ZWN0ZWQ6CisgICAgLy8gU2luY2UgU0NFVnMgYXJlIGltbXV0YWJsZSwgU2NhbGFyRXZvbHV0aW9uIGFsbG9jYXRlcyBvcGVyYW5kCisgICAgLy8gYXJyYXlzIHdpdGggaXRzIFNDRVZBbGxvY2F0b3IsIHNvIHRoaXMgY2xhc3MganVzdCBuZWVkcyBhIHNpbXBsZQorICAgIC8vIHBvaW50ZXIgcmF0aGVyIHRoYW4gYSBtb3JlIGVsYWJvcmF0ZSB2ZWN0b3ItbGlrZSBkYXRhIHN0cnVjdHVyZS4KKyAgICAvLyBUaGlzIGFsc28gYXZvaWRzIHRoZSBuZWVkIGZvciBhIG5vbi10cml2aWFsIGRlc3RydWN0b3IuCisgICAgY29uc3QgU0NFViAqY29uc3QgKk9wZXJhbmRzOworICAgIHNpemVfdCBOdW1PcGVyYW5kczsKKworICAgIFNDRVZOQXJ5RXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICBlbnVtIFNDRVZUeXBlcyBULCBjb25zdCBTQ0VWICpjb25zdCAqTywgc2l6ZV90IE4pCisgICAgICA6IFNDRVYoSUQsIFQpLCBPcGVyYW5kcyhPKSwgTnVtT3BlcmFuZHMoTikge30KKworICBwdWJsaWM6CisgICAgc2l6ZV90IGdldE51bU9wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gTnVtT3BlcmFuZHM7IH0KKyAgICBjb25zdCBTQ0VWICpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpIDwgTnVtT3BlcmFuZHMgJiYgIk9wZXJhbmQgaW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgICAgcmV0dXJuIE9wZXJhbmRzW2ldOworICAgIH0KKworICAgIHR5cGVkZWYgY29uc3QgU0NFViAqY29uc3QgKm9wX2l0ZXJhdG9yOworICAgIG9wX2l0ZXJhdG9yIG9wX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHM7IH0KKyAgICBvcF9pdGVyYXRvciBvcF9lbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kcyArIE51bU9wZXJhbmRzOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNMb29wSW52YXJpYW50KGNvbnN0IExvb3AgKkwpIGNvbnN0IHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKCFnZXRPcGVyYW5kKGkpLT5pc0xvb3BJbnZhcmlhbnQoTCkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIGhhc0NvbXB1dGFibGVMb29wRXZvbHV0aW9uIC0gTi1hcnkgZXhwcmVzc2lvbnMgaGF2ZSBjb21wdXRhYmxlIGxvb3AKKyAgICAvLyBldm9sdXRpb25zIGlmZiB0aGV5IGhhdmUgYXQgbGVhc3Qgb25lIG9wZXJhbmQgdGhhdCB2YXJpZXMgd2l0aCB0aGUgbG9vcCwKKyAgICAvLyBidXQgdGhhdCBhbGwgdmFyeWluZyBvcGVyYW5kcyBhcmUgY29tcHV0YWJsZS4KKyAgICB2aXJ0dWFsIGJvb2wgaGFzQ29tcHV0YWJsZUxvb3BFdm9sdXRpb24oY29uc3QgTG9vcCAqTCkgY29uc3QgeworICAgICAgYm9vbCBIYXNWYXJ5aW5nID0gZmFsc2U7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmICghZ2V0T3BlcmFuZChpKS0+aXNMb29wSW52YXJpYW50KEwpKSB7CisgICAgICAgICAgaWYgKGdldE9wZXJhbmQoaSktPmhhc0NvbXB1dGFibGVMb29wRXZvbHV0aW9uKEwpKQorICAgICAgICAgICAgSGFzVmFyeWluZyA9IHRydWU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICByZXR1cm4gSGFzVmFyeWluZzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaGFzT3BlcmFuZChjb25zdCBTQ0VWICpPKSBjb25zdCB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChPID09IGdldE9wZXJhbmQoaSkgfHwgZ2V0T3BlcmFuZChpKS0+aGFzT3BlcmFuZChPKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGRvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0OworCisgICAgYm9vbCBwcm9wZXJseURvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0OworCisgICAgdmlydHVhbCBjb25zdCBUeXBlICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpOyB9CisKKyAgICBib29sIGhhc05vVW5zaWduZWRXcmFwKCkgY29uc3QgeyByZXR1cm4gU3ViY2xhc3NEYXRhICYgKDEgPDwgMCk7IH0KKyAgICB2b2lkIHNldEhhc05vVW5zaWduZWRXcmFwKGJvb2wgQikgeworICAgICAgU3ViY2xhc3NEYXRhID0gKFN1YmNsYXNzRGF0YSAmIH4oMSA8PCAwKSkgfCAoQiA8PCAwKTsKKyAgICB9CisgICAgYm9vbCBoYXNOb1NpZ25lZFdyYXAoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGEgJiAoMSA8PCAxKTsgfQorICAgIHZvaWQgc2V0SGFzTm9TaWduZWRXcmFwKGJvb2wgQikgeworICAgICAgU3ViY2xhc3NEYXRhID0gKFN1YmNsYXNzRGF0YSAmIH4oMSA8PCAxKSkgfCAoQiA8PCAxKTsKKyAgICB9CisKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWTkFyeUV4cHIgKlMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY0FkZEV4cHIgfHwKKyAgICAgICAgICAgICBTLT5nZXRTQ0VWVHlwZSgpID09IHNjTXVsRXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NTTWF4RXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NVTWF4RXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NBZGRSZWNFeHByOworICAgIH0KKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNDRVZDb21tdXRhdGl2ZUV4cHIgLSBUaGlzIG5vZGUgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG4nYXJ5IGNvbW11dGF0aXZlCisgIC8vLyBvcGVyYXRvcnMuCisgIC8vLworICBjbGFzcyBTQ0VWQ29tbXV0YXRpdmVFeHByIDogcHVibGljIFNDRVZOQXJ5RXhwciB7CisgIHByb3RlY3RlZDoKKyAgICBTQ0VWQ29tbXV0YXRpdmVFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFNDRVZUeXBlcyBULCBjb25zdCBTQ0VWICpjb25zdCAqTywgc2l6ZV90IE4pCisgICAgICA6IFNDRVZOQXJ5RXhwcihJRCwgVCwgTywgTikge30KKworICBwdWJsaWM6CisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRPcGVyYXRpb25TdHIoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVZDb21tdXRhdGl2ZUV4cHIgKlMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY0FkZEV4cHIgfHwKKyAgICAgICAgICAgICBTLT5nZXRTQ0VWVHlwZSgpID09IHNjTXVsRXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NTTWF4RXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NVTWF4RXhwcjsKKyAgICB9CisgIH07CisKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNDRVZBZGRFeHByIC0gVGhpcyBub2RlIHJlcHJlc2VudHMgYW4gYWRkaXRpb24gb2Ygc29tZSBudW1iZXIgb2YgU0NFVnMuCisgIC8vLworICBjbGFzcyBTQ0VWQWRkRXhwciA6IHB1YmxpYyBTQ0VWQ29tbXV0YXRpdmVFeHByIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgU0NFVkFkZEV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpjb25zdCAqTywgc2l6ZV90IE4pCisgICAgICA6IFNDRVZDb21tdXRhdGl2ZUV4cHIoSUQsIHNjQWRkRXhwciwgTywgTikgeworICAgIH0KKworICBwdWJsaWM6CisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRPcGVyYXRpb25TdHIoKSBjb25zdCB7IHJldHVybiAiICsgIjsgfQorCisgICAgdmlydHVhbCBjb25zdCBUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgICAgLy8gVXNlIHRoZSB0eXBlIG9mIHRoZSBsYXN0IG9wZXJhbmQsIHdoaWNoIGlzIGxpa2VseSB0byBiZSBhIHBvaW50ZXIKKyAgICAgIC8vIHR5cGUsIGlmIHRoZXJlIGlzIG9uZS4gVGhpcyBkb2Vzbid0IHVzdWFsbHkgbWF0dGVyLCBidXQgaXQgY2FuIGhlbHAKKyAgICAgIC8vIHJlZHVjZSBjYXN0cyB3aGVuIHRoZSBleHByZXNzaW9ucyBhcmUgZXhwYW5kZWQuCisgICAgICByZXR1cm4gZ2V0T3BlcmFuZChnZXROdW1PcGVyYW5kcygpIC0gMSktPmdldFR5cGUoKTsKKyAgICB9CisKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWQWRkRXhwciAqUykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjQWRkRXhwcjsKKyAgICB9CisgIH07CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBTQ0VWTXVsRXhwciAtIFRoaXMgbm9kZSByZXByZXNlbnRzIG11bHRpcGxpY2F0aW9uIG9mIHNvbWUgbnVtYmVyIG9mIFNDRVZzLgorICAvLy8KKyAgY2xhc3MgU0NFVk11bEV4cHIgOiBwdWJsaWMgU0NFVkNvbW11dGF0aXZlRXhwciB7CisgICAgZnJpZW5kIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworICAgIFNDRVZNdWxFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqY29uc3QgKk8sIHNpemVfdCBOKQorICAgICAgOiBTQ0VWQ29tbXV0YXRpdmVFeHByKElELCBzY011bEV4cHIsIE8sIE4pIHsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0T3BlcmF0aW9uU3RyKCkgY29uc3QgeyByZXR1cm4gIiAqICI7IH0KKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVZNdWxFeHByICpTKSB7IHJldHVybiB0cnVlOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NNdWxFeHByOworICAgIH0KKyAgfTsKKworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gU0NFVlVEaXZFeHByIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgYmluYXJ5IHVuc2lnbmVkIGRpdmlzaW9uIG9wZXJhdGlvbi4KKyAgLy8vCisgIGNsYXNzIFNDRVZVRGl2RXhwciA6IHB1YmxpYyBTQ0VWIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgY29uc3QgU0NFViAqTEhTOworICAgIGNvbnN0IFNDRVYgKlJIUzsKKyAgICBTQ0VWVURpdkV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwgY29uc3QgU0NFViAqbGhzLCBjb25zdCBTQ0VWICpyaHMpCisgICAgICA6IFNDRVYoSUQsIHNjVURpdkV4cHIpLCBMSFMobGhzKSwgUkhTKHJocykge30KKworICBwdWJsaWM6CisgICAgY29uc3QgU0NFViAqZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gTEhTOyB9CisgICAgY29uc3QgU0NFViAqZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gUkhTOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNMb29wSW52YXJpYW50KGNvbnN0IExvb3AgKkwpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMSFMtPmlzTG9vcEludmFyaWFudChMKSAmJiBSSFMtPmlzTG9vcEludmFyaWFudChMKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaGFzQ29tcHV0YWJsZUxvb3BFdm9sdXRpb24oY29uc3QgTG9vcCAqTCkgY29uc3QgeworICAgICAgcmV0dXJuIExIUy0+aGFzQ29tcHV0YWJsZUxvb3BFdm9sdXRpb24oTCkgJiYKKyAgICAgICAgICAgICBSSFMtPmhhc0NvbXB1dGFibGVMb29wRXZvbHV0aW9uKEwpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBoYXNPcGVyYW5kKGNvbnN0IFNDRVYgKk8pIGNvbnN0IHsKKyAgICAgIHJldHVybiBPID09IExIUyB8fCBPID09IFJIUyB8fCBMSFMtPmhhc09wZXJhbmQoTykgfHwgUkhTLT5oYXNPcGVyYW5kKE8pOworICAgIH0KKworICAgIGJvb2wgZG9taW5hdGVzKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCkgY29uc3Q7CisKKyAgICBib29sIHByb3Blcmx5RG9taW5hdGVzKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGNvbnN0IFR5cGUgKmdldFR5cGUoKSBjb25zdDsKKworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVZVRGl2RXhwciAqUykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjVURpdkV4cHI7CisgICAgfQorICB9OworCisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBTQ0VWQWRkUmVjRXhwciAtIFRoaXMgbm9kZSByZXByZXNlbnRzIGEgcG9seW5vbWlhbCByZWN1cnJlbmNlIG9uIHRoZSB0cmlwCisgIC8vLyBjb3VudCBvZiB0aGUgc3BlY2lmaWVkIGxvb3AuICBUaGlzIGlzIHRoZSBwcmltYXJ5IGZvY3VzIG9mIHRoZQorICAvLy8gU2NhbGFyRXZvbHV0aW9uIGZyYW1ld29yazsgYWxsIHRoZSBvdGhlciBTQ0VWIHN1YmNsYXNzZXMgYXJlIG1vc3RseSBqdXN0CisgIC8vLyBzdXBwb3J0aW5nIGluZnJhc3RydWN0dXJlIHRvIGFsbG93IFNDRVZBZGRSZWNFeHByIGV4cHJlc3Npb25zIHRvIGJlCisgIC8vLyBjcmVhdGVkIGFuZCBhbmFseXplZC4KKyAgLy8vCisgIC8vLyBBbGwgb3BlcmFuZHMgb2YgYW4gQWRkUmVjIGFyZSByZXF1aXJlZCB0byBiZSBsb29wIGludmFyaWFudC4KKyAgLy8vCisgIGNsYXNzIFNDRVZBZGRSZWNFeHByIDogcHVibGljIFNDRVZOQXJ5RXhwciB7CisgICAgZnJpZW5kIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworICAgIGNvbnN0IExvb3AgKkw7CisKKyAgICBTQ0VWQWRkUmVjRXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKmNvbnN0ICpPLCBzaXplX3QgTiwgY29uc3QgTG9vcCAqbCkKKyAgICAgIDogU0NFVk5BcnlFeHByKElELCBzY0FkZFJlY0V4cHIsIE8sIE4pLCBMKGwpIHsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTnVtT3BlcmFuZHM7IGkgIT0gZTsgKytpKQorICAgICAgICBhc3NlcnQoT3BlcmFuZHNbaV0tPmlzTG9vcEludmFyaWFudChsKSAmJgorICAgICAgICAgICAgICAgIk9wZXJhbmRzIG9mIEFkZFJlYyBtdXN0IGJlIGxvb3AtaW52YXJpYW50ISIpOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgU0NFViAqZ2V0U3RhcnQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kc1swXTsgfQorICAgIGNvbnN0IExvb3AgKmdldExvb3AoKSBjb25zdCB7IHJldHVybiBMOyB9CisKKyAgICAvLy8gZ2V0U3RlcFJlY3VycmVuY2UgLSBUaGlzIG1ldGhvZCBjb25zdHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSByZWN1cnJlbmNlCisgICAgLy8vIGluZGljYXRpbmcgaG93IG11Y2ggdGhpcyBleHByZXNzaW9uIHN0ZXBzIGJ5LiAgSWYgdGhpcyBpcyBhIHBvbHlub21pYWwKKyAgICAvLy8gb2YgZGVncmVlIE4sIGl0IHJldHVybnMgYSBjaHJlYyBvZiBkZWdyZWUgTi0xLgorICAgIGNvbnN0IFNDRVYgKmdldFN0ZXBSZWN1cnJlbmNlKFNjYWxhckV2b2x1dGlvbiAmU0UpIGNvbnN0IHsKKyAgICAgIGlmIChpc0FmZmluZSgpKSByZXR1cm4gZ2V0T3BlcmFuZCgxKTsKKyAgICAgIHJldHVybiBTRS5nZXRBZGRSZWNFeHByKFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMz4ob3BfYmVnaW4oKSsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9lbmQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb29wKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBoYXNDb21wdXRhYmxlTG9vcEV2b2x1dGlvbihjb25zdCBMb29wICpRTCkgY29uc3QgeworICAgICAgcmV0dXJuIEwgPT0gUUw7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzTG9vcEludmFyaWFudChjb25zdCBMb29wICpRdWVyeUxvb3ApIGNvbnN0OworCisgICAgYm9vbCBkb21pbmF0ZXMoQmFzaWNCbG9jayAqQkIsIERvbWluYXRvclRyZWUgKkRUKSBjb25zdDsKKworICAgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoQmFzaWNCbG9jayAqQkIsIERvbWluYXRvclRyZWUgKkRUKSBjb25zdDsKKworICAgIC8vLyBpc0FmZmluZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gYWZmaW5lIEFkZFJlYyAoaS5lLiwgaXQgcmVwcmVzZW50cworICAgIC8vLyBhbiBleHByZXNzaW9ucyBBK0IqeCB3aGVyZSBBIGFuZCBCIGFyZSBsb29wIGludmFyaWFudCB2YWx1ZXMuCisgICAgYm9vbCBpc0FmZmluZSgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgc3RhcnQgdmFsdWUgaXMgaW52YXJpYW50LiAgVGhpcyBleHByZXNzaW9uIGlzIHRodXMKKyAgICAgIC8vIGFmZmluZSBpZmYgdGhlIHN0ZXAgaXMgYWxzbyBpbnZhcmlhbnQuCisgICAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA9PSAyOworICAgIH0KKworICAgIC8vLyBpc1F1YWRyYXRpYyAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gcXVhZHJhdGljIEFkZFJlYyAoaS5lLiwgaXQKKyAgICAvLy8gcmVwcmVzZW50cyBhbiBleHByZXNzaW9ucyBBK0IqeCtDKnheMiB3aGVyZSBBLCBCIGFuZCBDIGFyZSBsb29wCisgICAgLy8vIGludmFyaWFudCB2YWx1ZXMuICBUaGlzIGNvcnJlc3BvbmRzIHRvIGFuIGFkZHJlYyBvZiB0aGUgZm9ybSB7TCwrLE0sKyxOfQorICAgIGJvb2wgaXNRdWFkcmF0aWMoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA9PSAzOworICAgIH0KKworICAgIC8vLyBldmFsdWF0ZUF0SXRlcmF0aW9uIC0gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGNoYWluIG9mIHJlY3VycmVuY2VzIGF0CisgICAgLy8vIHRoZSBzcGVjaWZpZWQgaXRlcmF0aW9uIG51bWJlci4KKyAgICBjb25zdCBTQ0VWICpldmFsdWF0ZUF0SXRlcmF0aW9uKGNvbnN0IFNDRVYgKkl0LCBTY2FsYXJFdm9sdXRpb24gJlNFKSBjb25zdDsKKworICAgIC8vLyBnZXROdW1JdGVyYXRpb25zSW5SYW5nZSAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgdGhpcyBsb29wCisgICAgLy8vIHRoYXQgcHJvZHVjZSB2YWx1ZXMgaW4gdGhlIHNwZWNpZmllZCBjb25zdGFudCByYW5nZS4gIEFub3RoZXIgd2F5IG9mCisgICAgLy8vIGxvb2tpbmcgYXQgdGhpcyBpcyB0aGF0IGl0IHJldHVybnMgdGhlIGZpcnN0IGl0ZXJhdGlvbiBudW1iZXIgd2hlcmUgdGhlCisgICAgLy8vIHZhbHVlIGlzIG5vdCBpbiB0aGUgY29uZGl0aW9uLCB0aHVzIGNvbXB1dGluZyB0aGUgZXhpdCBjb3VudC4gIElmIHRoZQorICAgIC8vLyBpdGVyYXRpb24gY291bnQgY2FuJ3QgYmUgY29tcHV0ZWQsIGFuIGluc3RhbmNlIG9mIFNDRVZDb3VsZE5vdENvbXB1dGUgaXMKKyAgICAvLy8gcmV0dXJuZWQuCisgICAgY29uc3QgU0NFViAqZ2V0TnVtSXRlcmF0aW9uc0luUmFuZ2UoQ29uc3RhbnRSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UpIGNvbnN0OworCisgICAgLy8vIGdldFBvc3RJbmNFeHByIC0gUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZgorICAgIC8vLyB0aGlzIGV4cHJlc3Npb24gb25lIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCBhaGVhZC4KKyAgICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqZ2V0UG9zdEluY0V4cHIoU2NhbGFyRXZvbHV0aW9uICZTRSkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8U0NFVkFkZFJlY0V4cHI+KFNFLmdldEFkZEV4cHIodGhpcywgZ2V0U3RlcFJlY3VycmVuY2UoU0UpKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWQWRkUmVjRXhwciAqUykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjQWRkUmVjRXhwcjsKKyAgICB9CisgIH07CisKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNDRVZTTWF4RXhwciAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNpZ25lZCBtYXhpbXVtIHNlbGVjdGlvbi4KKyAgLy8vCisgIGNsYXNzIFNDRVZTTWF4RXhwciA6IHB1YmxpYyBTQ0VWQ29tbXV0YXRpdmVFeHByIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgU0NFVlNNYXhFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKmNvbnN0ICpPLCBzaXplX3QgTikKKyAgICAgIDogU0NFVkNvbW11dGF0aXZlRXhwcihJRCwgc2NTTWF4RXhwciwgTywgTikgeworICAgICAgLy8gTWF4IG5ldmVyIG92ZXJmbG93cy4KKyAgICAgIHNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICAgICAgc2V0SGFzTm9TaWduZWRXcmFwKHRydWUpOworICAgIH0KKworICBwdWJsaWM6CisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRPcGVyYXRpb25TdHIoKSBjb25zdCB7IHJldHVybiAiIHNtYXggIjsgfQorCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgU0NFVlNNYXhFeHByICpTKSB7IHJldHVybiB0cnVlOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NTTWF4RXhwcjsKKyAgICB9CisgIH07CisKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNDRVZVTWF4RXhwciAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiB1bnNpZ25lZCBtYXhpbXVtIHNlbGVjdGlvbi4KKyAgLy8vCisgIGNsYXNzIFNDRVZVTWF4RXhwciA6IHB1YmxpYyBTQ0VWQ29tbXV0YXRpdmVFeHByIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgU0NFVlVNYXhFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKmNvbnN0ICpPLCBzaXplX3QgTikKKyAgICAgIDogU0NFVkNvbW11dGF0aXZlRXhwcihJRCwgc2NVTWF4RXhwciwgTywgTikgeworICAgICAgLy8gTWF4IG5ldmVyIG92ZXJmbG93cy4KKyAgICAgIHNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICAgICAgc2V0SGFzTm9TaWduZWRXcmFwKHRydWUpOworICAgIH0KKworICBwdWJsaWM6CisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRPcGVyYXRpb25TdHIoKSBjb25zdCB7IHJldHVybiAiIHVtYXggIjsgfQorCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgU0NFVlVNYXhFeHByICpTKSB7IHJldHVybiB0cnVlOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NVTWF4RXhwcjsKKyAgICB9CisgIH07CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBTQ0VWVW5rbm93biAtIFRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGFuIGVudGlyZWx5IHVua25vd24gU0NFVgorICAvLy8gdmFsdWUsIGFuZCBvbmx5IHJlcHJlc2VudCBpdCBhcyBpdHMgTExWTSBWYWx1ZS4gIFRoaXMgaXMgdGhlICJib3R0b20iCisgIC8vLyB2YWx1ZSBmb3IgdGhlIGFuYWx5c2lzLgorICAvLy8KKyAgY2xhc3MgU0NFVlVua25vd24gOiBwdWJsaWMgU0NFViwgcHJpdmF0ZSBDYWxsYmFja1ZIIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgLy8gSW1wbGVtZW50IENhbGxiYWNrVkguCisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWxsVXNlc1JlcGxhY2VkV2l0aChWYWx1ZSAqTmV3KTsKKworICAgIC8vLyBTRSAtIFRoZSBwYXJlbnQgU2NhbGFyRXZvbHV0aW9uIHZhbHVlLiBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlCisgICAgLy8vIHRoZSBwYXJlbnQncyBtYXBzIHdoZW4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIFNDRVZVbmtub3duCisgICAgLy8vIGlzIGRlbGV0ZWQgb3IgUkFVVydkLgorICAgIFNjYWxhckV2b2x1dGlvbiAqU0U7CisKKyAgICAvLy8gTmV4dCAtIFRoZSBuZXh0IHBvaW50ZXIgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGFsbAorICAgIC8vLyBTQ0VWVW5rbm93biBpbnN0YW5jZXMgb3duZWQgYnkgYSBTY2FsYXJFdm9sdXRpb24uCisgICAgU0NFVlVua25vd24gKk5leHQ7CisKKyAgICBTQ0VWVW5rbm93bihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELCBWYWx1ZSAqViwKKyAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gKnNlLCBTQ0VWVW5rbm93biAqbmV4dCkgOgorICAgICAgU0NFVihJRCwgc2NVbmtub3duKSwgQ2FsbGJhY2tWSChWKSwgU0Uoc2UpLCBOZXh0KG5leHQpIHt9CisKKyAgcHVibGljOgorICAgIFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFZhbFB0cigpOyB9CisKKyAgICAvLy8gaXNTaXplT2YsIGlzQWxpZ25PZiwgaXNPZmZzZXRPZiAtIFRlc3Qgd2hldGhlciB0aGlzIGlzIGEgc3BlY2lhbAorICAgIC8vLyBjb25zdGFudCByZXByZXNlbnRpbmcgYSB0eXBlIHNpemUsIGFsaWdubWVudCwgb3IgZmllbGQgb2Zmc2V0IGluCisgICAgLy8vIGEgdGFyZ2V0LWluZGVwZW5kZW50IG1hbm5lciwgYW5kIGhhc24ndCBoYXBwZW5lZCB0byBoYXZlIGJlZW4KKyAgICAvLy8gZm9sZGVkIHdpdGggb3RoZXIgb3BlcmF0aW9ucyBpbnRvIHNvbWV0aGluZyB1bnJlY29nbml6YWJsZS4gVGhpcworICAgIC8vLyBpcyBtYWlubHkgb25seSB1c2VmdWwgZm9yIHByZXR0eS1wcmludGluZyBhbmQgb3RoZXIgc2l0dWF0aW9ucworICAgIC8vLyB3aGVyZSBpdCBpc24ndCBhYnNvbHV0ZWx5IHJlcXVpcmVkIGZvciB0aGVzZSB0byBzdWNjZWVkLgorICAgIGJvb2wgaXNTaXplT2YoY29uc3QgVHlwZSAqJkFsbG9jVHkpIGNvbnN0OworICAgIGJvb2wgaXNBbGlnbk9mKGNvbnN0IFR5cGUgKiZBbGxvY1R5KSBjb25zdDsKKyAgICBib29sIGlzT2Zmc2V0T2YoY29uc3QgVHlwZSAqJlNUeSwgQ29uc3RhbnQgKiZGaWVsZE5vKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBpc0xvb3BJbnZhcmlhbnQoY29uc3QgTG9vcCAqTCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGhhc0NvbXB1dGFibGVMb29wRXZvbHV0aW9uKGNvbnN0IExvb3AgKlFMKSBjb25zdCB7CisgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBjb21wdXRhYmxlCisgICAgfQorCisgICAgdmlydHVhbCBib29sIGhhc09wZXJhbmQoY29uc3QgU0NFViAqKSBjb25zdCB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBkb21pbmF0ZXMoQmFzaWNCbG9jayAqQkIsIERvbWluYXRvclRyZWUgKkRUKSBjb25zdDsKKworICAgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoQmFzaWNCbG9jayAqQkIsIERvbWluYXRvclRyZWUgKkRUKSBjb25zdDsKKworICAgIHZpcnR1YWwgY29uc3QgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWVW5rbm93biAqUykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjVW5rbm93bjsKKyAgICB9CisgIH07CisKKyAgLy8vIFNDRVZWaXNpdG9yIC0gVGhpcyBjbGFzcyBkZWZpbmVzIGEgc2ltcGxlIHZpc2l0b3IgY2xhc3MgdGhhdCBtYXkgYmUgdXNlZAorICAvLy8gZm9yIHZhcmlvdXMgU0NFViBhbmFseXNpcyBwdXJwb3Nlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU0MsIHR5cGVuYW1lIFJldFZhbD12b2lkPgorICBzdHJ1Y3QgU0NFVlZpc2l0b3IgeworICAgIFJldFZhbCB2aXNpdChjb25zdCBTQ0VWICpTKSB7CisgICAgICBzd2l0Y2ggKFMtPmdldFNDRVZUeXBlKCkpIHsKKyAgICAgIGNhc2Ugc2NDb25zdGFudDoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdENvbnN0YW50KChjb25zdCBTQ0VWQ29uc3RhbnQqKVMpOworICAgICAgY2FzZSBzY1RydW5jYXRlOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0VHJ1bmNhdGVFeHByKChjb25zdCBTQ0VWVHJ1bmNhdGVFeHByKilTKTsKKyAgICAgIGNhc2Ugc2NaZXJvRXh0ZW5kOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0WmVyb0V4dGVuZEV4cHIoKGNvbnN0IFNDRVZaZXJvRXh0ZW5kRXhwciopUyk7CisgICAgICBjYXNlIHNjU2lnbkV4dGVuZDoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdFNpZ25FeHRlbmRFeHByKChjb25zdCBTQ0VWU2lnbkV4dGVuZEV4cHIqKVMpOworICAgICAgY2FzZSBzY0FkZEV4cHI6CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRBZGRFeHByKChjb25zdCBTQ0VWQWRkRXhwciopUyk7CisgICAgICBjYXNlIHNjTXVsRXhwcjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdE11bEV4cHIoKGNvbnN0IFNDRVZNdWxFeHByKilTKTsKKyAgICAgIGNhc2Ugc2NVRGl2RXhwcjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdFVEaXZFeHByKChjb25zdCBTQ0VWVURpdkV4cHIqKVMpOworICAgICAgY2FzZSBzY0FkZFJlY0V4cHI6CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRBZGRSZWNFeHByKChjb25zdCBTQ0VWQWRkUmVjRXhwciopUyk7CisgICAgICBjYXNlIHNjU01heEV4cHI6CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRTTWF4RXhwcigoY29uc3QgU0NFVlNNYXhFeHByKilTKTsKKyAgICAgIGNhc2Ugc2NVTWF4RXhwcjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdFVNYXhFeHByKChjb25zdCBTQ0VWVU1heEV4cHIqKVMpOworICAgICAgY2FzZSBzY1Vua25vd246CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRVbmtub3duKChjb25zdCBTQ0VWVW5rbm93biopUyk7CisgICAgICBjYXNlIHNjQ291bGROb3RDb21wdXRlOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0Q291bGROb3RDb21wdXRlKChjb25zdCBTQ0VWQ291bGROb3RDb21wdXRlKilTKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gU0NFViB0eXBlISIpOworICAgICAgfQorICAgIH0KKworICAgIFJldFZhbCB2aXNpdENvdWxkTm90Q29tcHV0ZShjb25zdCBTQ0VWQ291bGROb3RDb21wdXRlICpTKSB7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHVzZSBvZiBTQ0VWQ291bGROb3RDb21wdXRlISIpOworICAgICAgcmV0dXJuIFJldFZhbCgpOworICAgIH0KKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbk5vcm1hbGl6YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJlNTkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbk5vcm1hbGl6YXRpb24uaApAQCAtMCwwICsxLDc4IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25Ob3JtYWxpemF0aW9uLmggLSBTZWUgYmVsb3cgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoICJub3JtYWxpemVkIiBTY2FsYXJFdm9sdXRpb24KKy8vIGV4cHJlc3Npb25zLgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBwb3N0LWluY3JlbWVudCB1c2VzIGFuZCBob3cgbm9ybWFsaXplZAorLy8gZXhwcmVzc2lvbnMgaGVscC4KKy8vCisvLyAgIGZvciAoaT0wOyBpIT1uOyArK2kpIHsKKy8vICAgICAuLi4KKy8vICAgfQorLy8gICB1c2UoaSk7CisvLworLy8gV2hpbGUgdGhlIGV4cHJlc3Npb24gZm9yIG1vc3QgdXNlcyBvZiBpIGluc2lkZSB0aGUgbG9vcCBpcyB7MCwrLDF9PCVMPiwgdGhlCisvLyBleHByZXNzaW9uIGZvciB0aGUgdXNlIG9mIGkgb3V0c2lkZSB0aGUgbG9vcCBpcyB7MSwrLDF9PCVMPiwgc2luY2UgaSBpcworLy8gaW5jcmVtZW50ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCBib2R5LiBUaGlzIGlzIGluY29udmVpZW50LCBzaW5jZSBpdAorLy8gc3VnZ2VzdHMgdGhhdCB3ZSBuZWVkIHR3byBkaWZmZXJlbnQgaW5kdWN0aW9uIHZhcmlhYmxlcywgb25lIHRoYXQgc3RhcnRzCisvLyBhdCAwIGFuZCBvbmUgdGhhdCBzdGFydHMgYXQgMS4gV2UnZCBwcmVmZXIgdG8gYmUgYWJsZSB0byB0aGluayBvZiB0aGVzZSBhcworLy8gdGhlIHNhbWUgaW5kdWN0aW9uIHZhcmlhYmxlLCB3aXRoIHVzZXMgaW5zaWRlIHRoZSBsb29wIHVzaW5nIHRoZQorLy8gInByZS1pbmNyZW1lbnRlZCIgdmFsdWUsIGFuZCB1c2VzIGFmdGVyIHRoZSBsb29wIHVzaW5nIHRoZQorLy8gInBvc3QtaW5jcmVtZW50ZWQiIHZhbHVlLgorLy8KKy8vIEV4cHJlc3Npb25zIGZvciBwb3N0LWluY3JlbWVudGVkIHVzZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGV4cHJlc3Npb24KKy8vIHBhaXJlZCB3aXRoIGEgc2V0IG9mIGxvb3BzIGZvciB3aGljaCB0aGUgZXhwcmVzc2lvbiBpcyBpbiAicG9zdC1pbmNyZW1lbnQiCisvLyBtb2RlICh0aGVyZSBtYXkgYmUgbXVsdGlwbGUgbG9vcHMpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05fTk9STUFMSVpBVElPTl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9OX05PUk1BTElaQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBMb29wOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgU0NFVjsKK2NsYXNzIFZhbHVlOworCisvLy8gVHJhbnNmb3JtS2luZCAtIERpZmZlcmVudCB0eXBlcyBvZiB0cmFuc2Zvcm1hdGlvbnMgdGhhdAorLy8vIFRyYW5zZm9ybUZvclBvc3RJbmNVc2UgY2FuIGRvLgorZW51bSBUcmFuc2Zvcm1LaW5kIHsKKyAgLy8vIE5vcm1hbGl6ZSAtIE5vcm1hbGl6ZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGxvb3BzLgorICBOb3JtYWxpemUsCisgIC8vLyBOb3JtYWxpemVBdXRvZGV0ZWN0IC0gRGV0ZWN0IHBvc3QtaW5jIG9wcG9ydHVuaXRpZXMgb24gbmV3IGV4cHJlc3Npb25zLAorICAvLy8gdXBkYXRlIHRoZSBnaXZlbiBsb29wIHNldCwgYW5kIG5vcm1hbGl6ZS4KKyAgTm9ybWFsaXplQXV0b2RldGVjdCwKKyAgLy8vIERlbm9ybWFsaXplIC0gUGVyZm9ybSB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gb24gdGhlIGV4cHJlc3Npb24gd2l0aCB0aGUKKyAgLy8vIGdpdmVuIGxvb3Agc2V0LgorICBEZW5vcm1hbGl6ZQorfTsKKworLy8vIFBvc3RJbmNMb29wU2V0IC0gQSBzZXQgb2YgbG9vcHMuCit0eXBlZGVmIFNtYWxsUHRyU2V0PGNvbnN0IExvb3AgKiwgMj4gUG9zdEluY0xvb3BTZXQ7CisKKy8vLyBUcmFuc2Zvcm1Gb3JQb3N0SW5jVXNlIC0gVHJhbnNmb3JtIHRoZSBnaXZlbiBleHByZXNzaW9uIGFjY29yZGluZyB0byB0aGUKKy8vLyBnaXZlbiB0cmFuc2Zvcm1hdGlvbiBraW5kLgorY29uc3QgU0NFViAqVHJhbnNmb3JtRm9yUG9zdEluY1VzZShUcmFuc2Zvcm1LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpVc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqT3BlcmFuZFZhbFRvUmVwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zdEluY0xvb3BTZXQgJkxvb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICZEVCk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU3BhcnNlUHJvcGFnYXRpb24uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TcGFyc2VQcm9wYWdhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzJmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU3BhcnNlUHJvcGFnYXRpb24uaApAQCAtMCwwICsxLDIwNiBAQAorLy89PT0tIFNwYXJzZVByb3BhZ2F0aW9uLmggLSBTcGFyc2UgQ29uZGl0aW9uYWwgUHJvcGVydHkgUHJvcGFnYXRpb24gLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhbiBhYnN0cmFjdCBzcGFyc2UgY29uZGl0aW9uYWwgcHJvcGFnYXRpb24gYWxnb3JpdGhtLAorLy8gbW9kZWxlZCBhZnRlciBTQ0NQLCBidXQgd2l0aCBhIGN1c3RvbWl6YWJsZSBsYXR0aWNlIGZ1bmN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19TUEFSU0VfUFJPUEFHQVRJT05fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1NQQVJTRV9QUk9QQUdBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBWYWx1ZTsKKyAgY2xhc3MgQ29uc3RhbnQ7CisgIGNsYXNzIEFyZ3VtZW50OworICBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgY2xhc3MgUEhJTm9kZTsKKyAgY2xhc3MgVGVybWluYXRvckluc3Q7CisgIGNsYXNzIEJhc2ljQmxvY2s7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBTcGFyc2VTb2x2ZXI7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKyAgCisvLy8gQWJzdHJhY3RMYXR0aWNlRnVuY3Rpb24gLSBUaGlzIGNsYXNzIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhZmxvdyBpbnN0YW5jZQorLy8vIHRvIHNwZWNpZnkgd2hhdCB0aGUgbGF0dGljZSB2YWx1ZXMgYXJlIGFuZCBob3cgdGhleSBoYW5kbGUgbWVyZ2VzIGV0Yy4KKy8vLyBUaGlzIGdpdmVzIHRoZSBjbGllbnQgdGhlIHBvd2VyIHRvIGNvbXB1dGUgbGF0dGljZSB2YWx1ZXMgZnJvbSBpbnN0cnVjdGlvbnMsCisvLy8gY29uc3RhbnRzLCBldGMuICBUaGUgcmVxdWlyZW1lbnQgaXMgdGhhdCBsYXR0aWNlIHZhbHVlcyBtdXN0IGFsbCBmaXQgaW50bworLy8vIGEgdm9pZCouICBJZiBhIHZvaWQqIGlzIG5vdCBzdWZmaWNpZW50LCB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHVzZSB0aGlzCisvLy8gcG9pbnRlciB0byBiZSBhIHBvaW50ZXIgaW50byBhIHVuaXF1aW5nIHNldCBvciBzb21ldGhpbmcuCisvLy8KK2NsYXNzIEFic3RyYWN0TGF0dGljZUZ1bmN0aW9uIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB2b2lkICpMYXR0aWNlVmFsOworcHJpdmF0ZToKKyAgTGF0dGljZVZhbCBVbmRlZlZhbCwgT3ZlcmRlZmluZWRWYWwsIFVudHJhY2tlZFZhbDsKK3B1YmxpYzoKKyAgQWJzdHJhY3RMYXR0aWNlRnVuY3Rpb24oTGF0dGljZVZhbCB1bmRlZlZhbCwgTGF0dGljZVZhbCBvdmVyZGVmaW5lZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0dGljZVZhbCB1bnRyYWNrZWRWYWwpIHsKKyAgICBVbmRlZlZhbCA9IHVuZGVmVmFsOworICAgIE92ZXJkZWZpbmVkVmFsID0gb3ZlcmRlZmluZWRWYWw7CisgICAgVW50cmFja2VkVmFsID0gdW50cmFja2VkVmFsOworICB9CisgIHZpcnR1YWwgfkFic3RyYWN0TGF0dGljZUZ1bmN0aW9uKCk7CisgIAorICBMYXR0aWNlVmFsIGdldFVuZGVmVmFsKCkgICAgICAgY29uc3QgeyByZXR1cm4gVW5kZWZWYWw7IH0KKyAgTGF0dGljZVZhbCBnZXRPdmVyZGVmaW5lZFZhbCgpIGNvbnN0IHsgcmV0dXJuIE92ZXJkZWZpbmVkVmFsOyB9CisgIExhdHRpY2VWYWwgZ2V0VW50cmFja2VkVmFsKCkgICBjb25zdCB7IHJldHVybiBVbnRyYWNrZWRWYWw7IH0KKyAgCisgIC8vLyBJc1VudHJhY2tlZFZhbHVlIC0gSWYgdGhlIHNwZWNpZmllZCBWYWx1ZSBpcyBzb21ldGhpbmcgdGhhdCBpcyBvYnZpb3VzbHkKKyAgLy8vIHVuaW50ZXJlc3RpbmcgdG8gdGhlIGFuYWx5c2lzIChhbmQgd291bGQgYWx3YXlzIHJldHVybiBVbnRyYWNrZWRWYWwpLAorICAvLy8gdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIHRydWUgdG8gYXZvaWQgcG9pbnRsZXNzIHdvcmsuCisgIHZpcnR1YWwgYm9vbCBJc1VudHJhY2tlZFZhbHVlKFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLy8gQ29tcHV0ZUNvbnN0YW50IC0gR2l2ZW4gYSBjb25zdGFudCB2YWx1ZSwgY29tcHV0ZSBhbmQgcmV0dXJuIGEgbGF0dGljZQorICAvLy8gdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNvbnN0YW50LgorICB2aXJ0dWFsIExhdHRpY2VWYWwgQ29tcHV0ZUNvbnN0YW50KENvbnN0YW50ICpDKSB7CisgICAgcmV0dXJuIGdldE92ZXJkZWZpbmVkVmFsKCk7IC8vIGFsd2F5cyBzYWZlCisgIH0KKworICAvLy8gSXNTcGVjaWFsQ2FzZWRQSEkgLSBHaXZlbiBhIFBISSBub2RlLCBkZXRlcm1pbmUgd2hldGhlciB0aGlzIFBISSBub2RlIGlzCisgIC8vLyBvbmUgdGhhdCB0aGUgd2Ugd2FudCB0byBoYW5kbGUgdGhyb3VnaCBDb21wdXRlSW5zdHJ1Y3Rpb25TdGF0ZS4KKyAgdmlydHVhbCBib29sIElzU3BlY2lhbENhc2VkUEhJKFBISU5vZGUgKlBOKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLy8gR2V0Q29uc3RhbnQgLSBJZiB0aGUgc3BlY2lmaWVkIGxhdHRpY2UgdmFsdWUgaXMgcmVwcmVzZW50YWJsZSBhcyBhbiBMTFZNCisgIC8vLyBjb25zdGFudCB2YWx1ZSwgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlIHJldHVybiBudWxsLiAgVGhlIHJldHVybmVkIHZhbHVlCisgIC8vLyBtdXN0IGJlIGluIHRoZSBzYW1lIExMVk0gdHlwZSBhcyBWYWwuCisgIHZpcnR1YWwgQ29uc3RhbnQgKkdldENvbnN0YW50KExhdHRpY2VWYWwgTFYsIFZhbHVlICpWYWwsIFNwYXJzZVNvbHZlciAmU1MpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBDb21wdXRlQXJndW1lbnQgLSBHaXZlbiBhIGZvcm1hbCBhcmd1bWVudCB2YWx1ZSwgY29tcHV0ZSBhbmQgcmV0dXJuIGEKKyAgLy8vIGxhdHRpY2UgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgorICB2aXJ0dWFsIExhdHRpY2VWYWwgQ29tcHV0ZUFyZ3VtZW50KEFyZ3VtZW50ICpJKSB7CisgICAgcmV0dXJuIGdldE92ZXJkZWZpbmVkVmFsKCk7IC8vIGFsd2F5cyBzYWZlCisgIH0KKyAgCisgIC8vLyBNZXJnZVZhbHVlcyAtIENvbXB1dGUgYW5kIHJldHVybiB0aGUgbWVyZ2Ugb2YgdGhlIHR3byBzcGVjaWZpZWQgbGF0dGljZQorICAvLy8gdmFsdWVzLiAgTWVyZ2luZyBzaG91bGQgb25seSBtb3ZlIG9uZSBkaXJlY3Rpb24gZG93biB0aGUgbGF0dGljZSB0bworICAvLy8gZ3VhcmFudGVlIGNvbnZlcmdlbmNlICh0b3dhcmQgb3ZlcmRlZmluZWQpLgorICB2aXJ0dWFsIExhdHRpY2VWYWwgTWVyZ2VWYWx1ZXMoTGF0dGljZVZhbCBYLCBMYXR0aWNlVmFsIFkpIHsKKyAgICByZXR1cm4gZ2V0T3ZlcmRlZmluZWRWYWwoKTsgLy8gYWx3YXlzIHNhZmUsIG5ldmVyIHVzZWZ1bC4KKyAgfQorICAKKyAgLy8vIENvbXB1dGVJbnN0cnVjdGlvblN0YXRlIC0gR2l2ZW4gYW4gaW5zdHJ1Y3Rpb24gYW5kIGEgdmVjdG9yIG9mIGl0cyBvcGVyYW5kCisgIC8vLyB2YWx1ZXMsIGNvbXB1dGUgdGhlIHJlc3VsdCB2YWx1ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIHZpcnR1YWwgTGF0dGljZVZhbCBDb21wdXRlSW5zdHJ1Y3Rpb25TdGF0ZShJbnN0cnVjdGlvbiAmSSwgU3BhcnNlU29sdmVyICZTUykgeworICAgIHJldHVybiBnZXRPdmVyZGVmaW5lZFZhbCgpOyAvLyBhbHdheXMgc2FmZSwgbmV2ZXIgdXNlZnVsLgorICB9CisgIAorICAvLy8gUHJpbnRWYWx1ZSAtIFJlbmRlciB0aGUgc3BlY2lmaWVkIGxhdHRpY2UgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBQcmludFZhbHVlKExhdHRpY2VWYWwgViwgcmF3X29zdHJlYW0gJk9TKTsKK307CisKKyAgCisvLy8gU3BhcnNlU29sdmVyIC0gVGhpcyBjbGFzcyBpcyBhIGdlbmVyYWwgcHVycG9zZSBzb2x2ZXIgZm9yIFNwYXJzZSBDb25kaXRpb25hbAorLy8vIFByb3BhZ2F0aW9uIHdpdGggYSBwcm9ncmFtbWFibGUgbGF0dGljZSBmdW5jdGlvbi4KKy8vLworY2xhc3MgU3BhcnNlU29sdmVyIHsKKyAgdHlwZWRlZiBBYnN0cmFjdExhdHRpY2VGdW5jdGlvbjo6TGF0dGljZVZhbCBMYXR0aWNlVmFsOworICAKKyAgLy8vIExhdHRpY2VGdW5jIC0gVGhpcyBpcyB0aGUgb2JqZWN0IHRoYXQga25vd3MgdGhlIGxhdHRpY2UgYW5kIGhvdyB0byBkbworICAvLy8gY29tcHV0ZSB0cmFuc2ZlciBmdW5jdGlvbnMuCisgIEFic3RyYWN0TGF0dGljZUZ1bmN0aW9uICpMYXR0aWNlRnVuYzsKKyAgCisgIERlbnNlTWFwPFZhbHVlKiwgTGF0dGljZVZhbD4gVmFsdWVTdGF0ZTsgIC8vIFRoZSBzdGF0ZSBlYWNoIHZhbHVlIGlzIGluLgorICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgMTY+IEJCRXhlY3V0YWJsZTsgICAvLyBUaGUgYmJzIHRoYXQgYXJlIGV4ZWN1dGFibGUuCisgIAorICBzdGQ6OnZlY3RvcjxJbnN0cnVjdGlvbio+IEluc3RXb3JrTGlzdDsgICAvLyBXb3JrbGlzdCBvZiBpbnN0cyB0byBwcm9jZXNzLgorICAKKyAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+IEJCV29ya0xpc3Q7ICAvLyBUaGUgQmFzaWNCbG9jayB3b3JrIGxpc3QKKyAgCisgIC8vLyBLbm93bkZlYXNpYmxlRWRnZXMgLSBFbnRyaWVzIGluIHRoaXMgc2V0IGFyZSBlZGdlcyB3aGljaCBoYXZlIGFscmVhZHkgaGFkCisgIC8vLyBQSEkgbm9kZXMgcmV0cmlnZ2VyZWQuCisgIHR5cGVkZWYgc3RkOjpwYWlyPEJhc2ljQmxvY2sqLEJhc2ljQmxvY2sqPiBFZGdlOworICBzdGQ6OnNldDxFZGdlPiBLbm93bkZlYXNpYmxlRWRnZXM7CisgIAorICBTcGFyc2VTb2x2ZXIoY29uc3QgU3BhcnNlU29sdmVyJik7ICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU3BhcnNlU29sdmVyJik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwdWJsaWM6CisgIGV4cGxpY2l0IFNwYXJzZVNvbHZlcihBYnN0cmFjdExhdHRpY2VGdW5jdGlvbiAqTGF0dGljZSkKKyAgICA6IExhdHRpY2VGdW5jKExhdHRpY2UpIHt9CisgIH5TcGFyc2VTb2x2ZXIoKSB7CisgICAgZGVsZXRlIExhdHRpY2VGdW5jOworICB9CisgIAorICAvLy8gU29sdmUgLSBTb2x2ZSBmb3IgY29uc3RhbnRzIGFuZCBleGVjdXRhYmxlIGJsb2Nrcy4KKyAgLy8vCisgIHZvaWQgU29sdmUoRnVuY3Rpb24gJkYpOworICAKKyAgdm9pZCBQcmludChGdW5jdGlvbiAmRiwgcmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gZ2V0TGF0dGljZVN0YXRlIC0gUmV0dXJuIHRoZSBMYXR0aWNlVmFsIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQorICAvLy8gdmFsdWUuICBJZiBhbiB2YWx1ZSBpcyBub3QgaW4gdGhlIG1hcCwgaXQgaXMgcmV0dXJuZWQgYXMgdW50cmFja2VkLAorICAvLy8gdW5saWtlIHRoZSBnZXRPckluaXRWYWx1ZVN0YXRlIG1ldGhvZC4KKyAgTGF0dGljZVZhbCBnZXRMYXR0aWNlU3RhdGUoVmFsdWUgKlYpIGNvbnN0IHsKKyAgICBEZW5zZU1hcDxWYWx1ZSosIExhdHRpY2VWYWw+Ojpjb25zdF9pdGVyYXRvciBJID0gVmFsdWVTdGF0ZS5maW5kKFYpOworICAgIHJldHVybiBJICE9IFZhbHVlU3RhdGUuZW5kKCkgPyBJLT5zZWNvbmQgOiBMYXR0aWNlRnVuYy0+Z2V0VW50cmFja2VkVmFsKCk7CisgIH0KKyAgCisgIC8vLyBnZXRPckluaXRWYWx1ZVN0YXRlIC0gUmV0dXJuIHRoZSBMYXR0aWNlVmFsIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQorICAvLy8gdmFsdWUsIGluaXRpYWxpemluZyB0aGUgdmFsdWUncyBzdGF0ZSBpZiBpdCBoYXNuJ3QgYmVlbiBlbnRlcmVkIGludG8gdGhlCisgIC8vLyBtYXAgeWV0LiAgIFRoaXMgZnVuY3Rpb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugbm90IGFsbCB2YWx1ZXMgc2hvdWxkIHN0YXJ0CisgIC8vLyBvdXQgaW4gdGhlIHVuZGVyZGVmaW5lZCBzdGF0ZS4uLiBBcmd1bWVudHMgc2hvdWxkIGJlIG92ZXJkZWZpbmVkLCBhbmQKKyAgLy8vIGNvbnN0YW50cyBzaG91bGQgYmUgbWFya2VkIGFzIGNvbnN0YW50cy4KKyAgLy8vCisgIExhdHRpY2VWYWwgZ2V0T3JJbml0VmFsdWVTdGF0ZShWYWx1ZSAqVik7CisgIAorICAvLy8gaXNFZGdlRmVhc2libGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29udHJvbCBmbG93IGVkZ2UgZnJvbSB0aGUgJ0Zyb20nCisgIC8vLyBiYXNpYyBibG9jayB0byB0aGUgJ1RvJyBiYXNpYyBibG9jayBpcyBjdXJyZW50bHkgZmVhc2libGUuICBJZgorICAvLy8gQWdncmVzc2l2ZVVuZGVmIGlzIHRydWUsIHRoZW4gdGhpcyB0cmVhdHMgdmFsdWVzIHdpdGggdW5rbm93biBsYXR0aWNlCisgIC8vLyB2YWx1ZXMgYXMgdW5kZWZpbmVkLiAgVGhpcyBpcyBnZW5lcmFsbHkgb25seSB1c2VmdWwgd2hlbiBzb2x2aW5nIHRoZQorICAvLy8gbGF0dGljZSwgbm90IHdoZW4gcXVlcnlpbmcgaXQuCisgIGJvb2wgaXNFZGdlRmVhc2libGUoQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8sCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZ2dyZXNzaXZlVW5kZWYgPSBmYWxzZSk7CisKKyAgLy8vIGlzQmxvY2tFeGVjdXRhYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSBrbm93biBmZWFzaWJsZQorICAvLy8gZWRnZXMgaW50byB0aGUgYmFzaWMgYmxvY2suICBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCB3aGVuCisgIC8vLyBxdWVyeWluZyB0aGUgbGF0dGljZS4KKyAgYm9vbCBpc0Jsb2NrRXhlY3V0YWJsZShCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBCQkV4ZWN1dGFibGUuY291bnQoQkIpOworICB9CisgIAorcHJpdmF0ZToKKyAgLy8vIFVwZGF0ZVN0YXRlIC0gV2hlbiB0aGUgc3RhdGUgZm9yIHNvbWUgaW5zdHJ1Y3Rpb24gaXMgcG90ZW50aWFsbHkgdXBkYXRlZCwKKyAgLy8vIHRoaXMgZnVuY3Rpb24gbm90aWNlcyBhbmQgYWRkcyBJIHRvIHRoZSB3b3JrbGlzdCBpZiBuZWVkZWQuCisgIHZvaWQgVXBkYXRlU3RhdGUoSW5zdHJ1Y3Rpb24gJkluc3QsIExhdHRpY2VWYWwgVik7CisgIAorICAvLy8gTWFya0Jsb2NrRXhlY3V0YWJsZSAtIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gbWFyayBhbGwgb2YKKyAgLy8vIHRoZSBibG9ja3MgdGhhdCBhcmUga25vd24gdG8gYmUgaW50cmluc2ljYWxseSBsaXZlIGluIHRoZSBwcm9jZXNzZWQgdW5pdC4KKyAgdm9pZCBNYXJrQmxvY2tFeGVjdXRhYmxlKEJhc2ljQmxvY2sgKkJCKTsKKyAgCisgIC8vLyBtYXJrRWRnZUV4ZWN1dGFibGUgLSBNYXJrIGEgYmFzaWMgYmxvY2sgYXMgZXhlY3V0YWJsZSwgYWRkaW5nIGl0IHRvIHRoZSBCQgorICAvLy8gd29yayBsaXN0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IGV4ZWN1dGFibGUuCisgIHZvaWQgbWFya0VkZ2VFeGVjdXRhYmxlKEJhc2ljQmxvY2sgKlNvdXJjZSwgQmFzaWNCbG9jayAqRGVzdCk7CisgIAorICAvLy8gZ2V0RmVhc2libGVTdWNjZXNzb3JzIC0gUmV0dXJuIGEgdmVjdG9yIG9mIGJvb2xlYW5zIHRvIGluZGljYXRlIHdoaWNoCisgIC8vLyBzdWNjZXNzb3JzIGFyZSByZWFjaGFibGUgZnJvbSBhIGdpdmVuIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgZ2V0RmVhc2libGVTdWNjZXNzb3JzKFRlcm1pbmF0b3JJbnN0ICZUSSwgU21hbGxWZWN0b3JJbXBsPGJvb2w+ICZTdWNjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZ2dyZXNzaXZlVW5kZWYpOworICAKKyAgdm9pZCB2aXNpdEluc3QoSW5zdHJ1Y3Rpb24gJkkpOworICB2b2lkIHZpc2l0UEhJTm9kZShQSElOb2RlICZJKTsKKyAgdm9pZCB2aXNpdFRlcm1pbmF0b3JJbnN0KFRlcm1pbmF0b3JJbnN0ICZUSSk7CisKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX1NQQVJTRV9QUk9QQUdBVElPTl9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVHJhY2UuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UcmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NjUxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVHJhY2UuaApAQCAtMCwwICsxLDExOSBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvVHJhY2UuaCAtIFJlcHJlc2VudCBvbmUgdHJhY2Ugb2YgTExWTSBjb2RlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGUgdHJhY2Ugb2YgTExWTSBiYXNpYyBibG9ja3MuICBBIHRyYWNlIGlzIGEKKy8vIHNpbmdsZSBlbnRyeSwgbXVsdGlwbGUgZXhpdCwgcmVnaW9uIG9mIGNvZGUgdGhhdCBpcyBvZnRlbiBob3QuICBUcmFjZS1iYXNlZAorLy8gb3B0aW1pemF0aW9ucyB0cmVhdCB0cmFjZXMgYWxtb3N0IGxpa2UgdGhleSBhcmUgYSBsYXJnZSwgc3RyYW5nZSwgYmFzaWMKKy8vIGJsb2NrOiBiZWNhdXNlIHRoZSB0cmFjZSBwYXRoIGlzIGFzc3VtZWQgdG8gYmUgaG90LCBvcHRpbWl6YXRpb25zIGZvciB0aGUKKy8vIGZhbGwtdGhyb3VnaCBwYXRoIGFyZSBtYWRlIGF0IHRoZSBleHBlbnNlIG9mIHRoZSBub24tZmFsbC10aHJvdWdoIHBhdGhzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19UUkFDRV9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVFJBQ0VfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQmFzaWNCbG9jazsKKyAgY2xhc3MgRnVuY3Rpb247CisgIGNsYXNzIE1vZHVsZTsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIFRyYWNlIHsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrICo+IEJhc2ljQmxvY2tMaXN0VHlwZTsKKyAgQmFzaWNCbG9ja0xpc3RUeXBlIEJhc2ljQmxvY2tzOworCitwdWJsaWM6CisgIC8vLyBUcmFjZSBjdG9yIC0gTWFrZSBhIG5ldyB0cmFjZSBmcm9tIGEgdmVjdG9yIG9mIGJhc2ljIGJsb2NrcywKKyAgLy8vIHJlc2lkaW5nIGluIHRoZSBmdW5jdGlvbiB3aGljaCBpcyB0aGUgcGFyZW50IG9mIHRoZSBmaXJzdAorICAvLy8gYmFzaWMgYmxvY2sgaW4gdGhlIHZlY3Rvci4KKyAgLy8vCisgIFRyYWNlKGNvbnN0IHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sgKj4gJnZCQikgOiBCYXNpY0Jsb2NrcyAodkJCKSB7fQorCisgIC8vLyBnZXRFbnRyeUJhc2ljQmxvY2sgLSBSZXR1cm4gdGhlIGVudHJ5IGJhc2ljIGJsb2NrIChmaXJzdCBibG9jaykKKyAgLy8vIG9mIHRoZSB0cmFjZS4KKyAgLy8vCisgIEJhc2ljQmxvY2sgKmdldEVudHJ5QmFzaWNCbG9jayAoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrc1swXTsgfQorCisgIC8vLyBvcGVyYXRvcltdL2dldEJsb2NrIC0gUmV0dXJuIGJhc2ljIGJsb2NrIE4gaW4gdGhlIHRyYWNlLgorICAvLy8KKyAgQmFzaWNCbG9jayAqb3BlcmF0b3JbXSh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrc1tpXTsgfQorICBCYXNpY0Jsb2NrICpnZXRCbG9jayh1bnNpZ25lZCBpKSAgIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzW2ldOyB9CisKKyAgLy8vIGdldEZ1bmN0aW9uIC0gUmV0dXJuIHRoaXMgdHJhY2UncyBwYXJlbnQgZnVuY3Rpb24uCisgIC8vLworICBGdW5jdGlvbiAqZ2V0RnVuY3Rpb24gKCkgY29uc3Q7CisKKyAgLy8vIGdldE1vZHVsZSAtIFJldHVybiB0aGlzIE1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoaXMgdHJhY2UncyBwYXJlbnQKKyAgLy8vIGZ1bmN0aW9uLgorICAvLy8KKyAgTW9kdWxlICpnZXRNb2R1bGUgKCkgY29uc3Q7CisKKyAgLy8vIGdldEJsb2NrSW5kZXggLSBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sgaW4gdGhlCisgIC8vLyB0cmFjZSwgb3IgLTEgaWYgaXQgaXMgbm90IGluIHRoZSB0cmFjZS4KKyAgaW50IGdldEJsb2NrSW5kZXgoY29uc3QgQmFzaWNCbG9jayAqWCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCYXNpY0Jsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKEJhc2ljQmxvY2tzW2ldID09IFgpCisgICAgICAgIHJldHVybiBpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBjb250YWlucyAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRyYWNlIGNvbnRhaW5zIHRoZSBnaXZlbiBiYXNpYworICAvLy8gYmxvY2suCisgIC8vLworICBib29sIGNvbnRhaW5zKGNvbnN0IEJhc2ljQmxvY2sgKlgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QmxvY2tJbmRleChYKSAhPSAtMTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgQjEgb2NjdXJzIGJlZm9yZSBCMiBpbiB0aGUgdHJhY2UsIG9yIGlmIGl0IGlzIHRoZSBzYW1lCisgIC8vLyBibG9jayBhcyBCMi4uICBCb3RoIGJsb2NrcyBtdXN0IGJlIGluIHRoZSB0cmFjZS4KKyAgLy8vCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IEJhc2ljQmxvY2sgKkIxLCBjb25zdCBCYXNpY0Jsb2NrICpCMikgY29uc3QgeworICAgIGludCBCMUlkeCA9IGdldEJsb2NrSW5kZXgoQjEpLCBCMklkeCA9IGdldEJsb2NrSW5kZXgoQjIpOworICAgIGFzc2VydChCMUlkeCAhPSAtMSAmJiBCMklkeCAhPSAtMSAmJiAiQmxvY2sgaXMgbm90IGluIHRoZSB0cmFjZSEiKTsKKyAgICByZXR1cm4gQjFJZHggPD0gQjJJZHg7CisgIH0KKworICAvLyBCYXNpY0Jsb2NrIGl0ZXJhdG9ycy4uLgorICB0eXBlZGVmIEJhc2ljQmxvY2tMaXN0VHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgQmFzaWNCbG9ja0xpc3RUeXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgZW5kICAoKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lbmQoKTsgICB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW5kKCk7ICAgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgcmJlZ2luKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MucmJlZ2luKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5yYmVnaW4oKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJlbmQgICgpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJlbmQoKTsgICB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCAgKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MucmVuZCgpOyAgIH0KKworICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLnNpemUoKTsgfQorICBib29sICAgICAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVtcHR5KCk7IH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBxKSAgICAgICAgICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVyYXNlIChxKTsgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBxMSwgaXRlcmF0b3IgcTIpIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVyYXNlIChxMSwgcTIpOyB9CisKKyAgLy8vIHByaW50IC0gV3JpdGUgdHJhY2UgdG8gb3V0cHV0IHN0cmVhbS4KKyAgLy8vCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworCisgIC8vLyBkdW1wIC0gRGVidWdnZXIgY29udmVuaWVuY2UgbWV0aG9kOyB3cml0ZXMgdHJhY2UgdG8gc3RhbmRhcmQgZXJyb3IKKyAgLy8vIG91dHB1dCBzdHJlYW0uCisgIC8vLworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBUUkFDRV9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVmFsdWVUcmFja2luZy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTYzNGYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuaApAQCAtMCwwICsxLDEzNCBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvVmFsdWVUcmFja2luZy5oIC0gV2FsayBjb21wdXRhdGlvbnMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdGhhdCBoZWxwIGFuYWx5emUgcHJvcGVydGllcyB0aGF0IGNoYWlucyBvZgorLy8gY29tcHV0YXRpb25zIGhhdmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1ZBTFVFVFJBQ0tJTkdfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1ZBTFVFVFJBQ0tJTkdfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CisgIGNsYXNzIFZhbHVlOworICBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgY2xhc3MgQVBJbnQ7CisgIGNsYXNzIFRhcmdldERhdGE7CisgIAorICAvLy8gQ29tcHV0ZU1hc2tlZEJpdHMgLSBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGJpdHMgc3BlY2lmaWVkIGluIE1hc2sgYXJlCisgIC8vLyBrbm93biB0byBiZSBlaXRoZXIgemVybyBvciBvbmUgYW5kIHJldHVybiB0aGVtIGluIHRoZSBLbm93blplcm8vS25vd25PbmUKKyAgLy8vIGJpdCBzZXRzLiAgVGhpcyBjb2RlIG9ubHkgYW5hbHl6ZXMgYml0cyBpbiBNYXNrLCBpbiBvcmRlciB0byBzaG9ydC1jaXJjdWl0CisgIC8vLyBwcm9jZXNzaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBvbiB2YWx1ZXMgd2l0aCBpbnRlZ2VyIHR5cGUsIHZhbHVlcyB3aXRoIHBvaW50ZXIKKyAgLy8vIHR5cGUgKGJ1dCBvbmx5IGlmIFREIGlzIG5vbi1udWxsKSwgYW5kIHZlY3RvcnMgb2YgaW50ZWdlcnMuICBJbiB0aGUgY2FzZQorICAvLy8gd2hlcmUgViBpcyBhIHZlY3RvciwgdGhlIG1hc2ssIGtub3duIHplcm8sIGFuZCBrbm93biBvbmUgdmFsdWVzIGFyZSB0aGUKKyAgLy8vIHNhbWUgd2lkdGggYXMgdGhlIHZlY3RvciBlbGVtZW50LCBhbmQgdGhlIGJpdCBpcyBzZXQgb25seSBpZiBpdCBpcyB0cnVlCisgIC8vLyBmb3IgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICB2b2lkIENvbXB1dGVNYXNrZWRCaXRzKFZhbHVlICpWLCBjb25zdCBBUEludCAmTWFzaywgQVBJbnQgJktub3duWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25PbmUsIGNvbnN0IFRhcmdldERhdGEgKlREID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApOworICAKKyAgLy8vIE1hc2tlZFZhbHVlSXNaZXJvIC0gUmV0dXJuIHRydWUgaWYgJ1YgJiBNYXNrJyBpcyBrbm93biB0byBiZSB6ZXJvLiAgV2UgdXNlCisgIC8vLyB0aGlzIHByZWRpY2F0ZSB0byBzaW1wbGlmeSBvcGVyYXRpb25zIGRvd25zdHJlYW0uICBNYXNrIGlzIGtub3duIHRvIGJlCisgIC8vLyB6ZXJvIGZvciBiaXRzIHRoYXQgViBjYW5ub3QgaGF2ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgb24gdmFsdWVzIHdpdGggaW50ZWdlciB0eXBlLCB2YWx1ZXMgd2l0aCBwb2ludGVyCisgIC8vLyB0eXBlIChidXQgb25seSBpZiBURCBpcyBub24tbnVsbCksIGFuZCB2ZWN0b3JzIG9mIGludGVnZXJzLiAgSW4gdGhlIGNhc2UKKyAgLy8vIHdoZXJlIFYgaXMgYSB2ZWN0b3IsIHRoZSBtYXNrLCBrbm93biB6ZXJvLCBhbmQga25vd24gb25lIHZhbHVlcyBhcmUgdGhlCisgIC8vLyBzYW1lIHdpZHRoIGFzIHRoZSB2ZWN0b3IgZWxlbWVudCwgYW5kIHRoZSBiaXQgaXMgc2V0IG9ubHkgaWYgaXQgaXMgdHJ1ZQorICAvLy8gZm9yIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgYm9vbCBNYXNrZWRWYWx1ZUlzWmVybyhWYWx1ZSAqViwgY29uc3QgQVBJbnQgJk1hc2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREID0gMCwgdW5zaWduZWQgRGVwdGggPSAwKTsKKworICAKKyAgLy8vIENvbXB1dGVOdW1TaWduQml0cyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzaWduIGJpdCBvZiB0aGUKKyAgLy8vIHJlZ2lzdGVyIGlzIHJlcGxpY2F0ZWQgaW50byB0aGUgb3RoZXIgYml0cy4gIFdlIGtub3cgdGhhdCBhdCBsZWFzdCAxIGJpdAorICAvLy8gaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBzaWduIGJpdCAoaXRzZWxmKSwgYnV0IG90aGVyIGNhc2VzIGNhbiBnaXZlIHVzCisgIC8vLyBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBpbW1lZGlhdGVseSBhZnRlciBhbiAiYXNociBYLCAyIiwgd2Uga25vdyB0aGF0CisgIC8vLyB0aGUgdG9wIDMgYml0cyBhcmUgYWxsIGVxdWFsIHRvIGVhY2ggb3RoZXIsIHNvIHdlIHJldHVybiAzLgorICAvLy8KKyAgLy8vICdPcCcgbXVzdCBoYXZlIGEgc2NhbGFyIGludGVnZXIgdHlwZS4KKyAgLy8vCisgIHVuc2lnbmVkIENvbXB1dGVOdW1TaWduQml0cyhWYWx1ZSAqT3AsIGNvbnN0IFRhcmdldERhdGEgKlREID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCk7CisKKyAgLy8vIENvbXB1dGVNdWx0aXBsZSAtIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGludGVnZXIgbXVsdGlwbGUgb2YgQmFzZSB0aGF0CisgIC8vLyBlcXVhbHMgVi4gIElmIHN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgdHJ1ZSBhbmQgcmV0dXJucyB0aGUgbXVsdGlwbGUgaW4KKyAgLy8vIE11bHRpcGxlLiAgSWYgdW5zdWNjZXNzZnVsLCBpdCByZXR1cm5zIGZhbHNlLiAgQWxzbywgaWYgViBjYW4gYmUKKyAgLy8vIHNpbXBsaWZpZWQgdG8gYW4gaW50ZWdlciwgdGhlbiB0aGUgc2ltcGxpZmllZCBWIGlzIHJldHVybmVkIGluIFZhbC4gIExvb2sKKyAgLy8vIHRocm91Z2ggc2V4dCBvbmx5IGlmIExvb2tUaHJvdWdoU0V4dD10cnVlLgorICBib29sIENvbXB1dGVNdWx0aXBsZShWYWx1ZSAqViwgdW5zaWduZWQgQmFzZSwgVmFsdWUgKiZNdWx0aXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaFNFeHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKTsKKworICAvLy8gQ2Fubm90QmVOZWdhdGl2ZVplcm8gLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gcHJvdmUgdGhhdCB0aGUgc3BlY2lmaWVkIEZQIAorICAvLy8gdmFsdWUgaXMgbmV2ZXIgZXF1YWwgdG8gLTAuMC4KKyAgLy8vCisgIGJvb2wgQ2Fubm90QmVOZWdhdGl2ZVplcm8oY29uc3QgVmFsdWUgKlYsIHVuc2lnbmVkIERlcHRoID0gMCk7CisKKyAgLy8vIERlY29tcG9zZUdFUEV4cHJlc3Npb24gLSBJZiBWIGlzIGEgc3ltYm9saWMgcG9pbnRlciBleHByZXNzaW9uLCBkZWNvbXBvc2UKKyAgLy8vIGl0IGludG8gYSBiYXNlIHBvaW50ZXIgd2l0aCBhIGNvbnN0YW50IG9mZnNldCBhbmQgYSBudW1iZXIgb2Ygc2NhbGVkCisgIC8vLyBzeW1ib2xpYyBvZmZzZXRzLgorICAvLy8KKyAgLy8vIFRoZSBzY2FsZWQgc3ltYm9saWMgb2Zmc2V0cyAocmVwcmVzZW50ZWQgYnkgcGFpcnMgb2YgYSBWYWx1ZSogYW5kIGEgc2NhbGUKKyAgLy8vIGluIHRoZSBWYXJJbmRpY2VzIHZlY3RvcikgYXJlIFZhbHVlKidzIHRoYXQgYXJlIGtub3duIHRvIGJlIHNjYWxlZCBieSB0aGUKKyAgLy8vIHNwZWNpZmllZCBhbW91bnQsIGJ1dCB3aGljaCBtYXkgaGF2ZSBvdGhlciB1bnJlcHJlc2VudGVkIGhpZ2ggYml0cy4gQXMKKyAgLy8vIHN1Y2gsIHRoZSBnZXAgY2Fubm90IG5lY2Vzc2FyaWx5IGJlIHJlY29uc3RydWN0ZWQgZnJvbSBpdHMgZGVjb21wb3NlZAorICAvLy8gZm9ybS4KKyAgLy8vCisgIC8vLyBXaGVuIFRhcmdldERhdGEgaXMgYXJvdW5kLCB0aGlzIGZ1bmN0aW9uIGlzIGNhcGFibGUgb2YgYW5hbHl6aW5nCisgIC8vLyBldmVyeXRoaW5nIHRoYXQgVmFsdWU6OmdldFVuZGVybHlpbmdPYmplY3QoKSBjYW4gbG9vayB0aHJvdWdoLiAgV2hlbiBub3QsCisgIC8vLyBpdCBqdXN0IGxvb2tzIHRocm91Z2ggcG9pbnRlciBjYXN0cy4KKyAgLy8vCisgIGNvbnN0IFZhbHVlICpEZWNvbXBvc2VHRVBFeHByZXNzaW9uKGNvbnN0IFZhbHVlICpWLCBpbnQ2NF90ICZCYXNlT2ZmcywKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxjb25zdCBWYWx1ZSosIGludDY0X3Q+ID4gJlZhckluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKTsKKyAgICAKKyAgCisgIAorICAvLy8gRmluZEluc2VydGVkVmFsdWUgLSBHaXZlbiBhbiBhZ2dyZWdyYXRlIGFuZCBhbiBzZXF1ZW5jZSBvZiBpbmRpY2VzLCBzZWUgaWYKKyAgLy8vIHRoZSBzY2FsYXIgdmFsdWUgaW5kZXhlZCBpcyBhbHJlYWR5IGFyb3VuZCBhcyBhIHJlZ2lzdGVyLCBmb3IgZXhhbXBsZSBpZgorICAvLy8gaXQgd2VyZSBpbnNlcnRlZCBkaXJlY3RseSBpbnRvIHRoZSBhZ2dyZWdyYXRlLgorICAvLy8KKyAgLy8vIElmIEluc2VydEJlZm9yZSBpcyBub3QgbnVsbCwgdGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSAobW9kaWZpZWQpCisgIC8vLyBpbnNlcnR2YWx1ZXMgd2hlbiBhIHBhcnQgb2YgYSBuZXN0ZWQgc3RydWN0IGlzIGV4dHJhY3RlZC4KKyAgVmFsdWUgKkZpbmRJbnNlcnRlZFZhbHVlKFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKmlkeF9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICppZHhfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworCisgIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlciBmb3IgZmluZGluZyB2YWx1ZXMgaW5kZXhlZCBieSBhIHNpbmdsZSBpbmRleAorICAvLy8gb25seS4KKyAgaW5saW5lIFZhbHVlICpGaW5kSW5zZXJ0ZWRWYWx1ZShWYWx1ZSAqViwgY29uc3QgdW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKSB7CisgICAgY29uc3QgdW5zaWduZWQgSWR4c1sxXSA9IHsgSWR4IH07CisgICAgcmV0dXJuIEZpbmRJbnNlcnRlZFZhbHVlKFYsICZJZHhzWzBdLCAmSWR4c1sxXSwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorICAKKyAgLy8vIEdldENvbnN0YW50U3RyaW5nSW5mbyAtIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGxlbmd0aCBvZiBhCisgIC8vLyBudWxsLXRlcm1pbmF0ZWQgQyBzdHJpbmcgcG9pbnRlZCB0byBieSBWLiAgSWYgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyB0cnVlCisgIC8vLyBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIGluIFN0ci4gIElmIHVuc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyBmYWxzZS4gIElmCisgIC8vLyBTdG9wQXROdWwgaXMgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlIHJldHVybmVkIHN0cmluZyBpcyB0cnVuY2F0ZWQKKyAgLy8vIGJ5IGEgbnVsIGNoYXJhY3RlciBpbiB0aGUgZ2xvYmFsLiAgSWYgU3RvcEF0TnVsIGlzIGZhbHNlLCB0aGUgbnVsCisgIC8vLyBjaGFyYWN0ZXIgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdCBzdHJpbmcuCisgIGJvb2wgR2V0Q29uc3RhbnRTdHJpbmdJbmZvKGNvbnN0IFZhbHVlICpWLCBzdGQ6OnN0cmluZyAmU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN0b3BBdE51bCA9IHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8vLyBHZXRTdHJpbmdMZW5ndGggLSBJZiB3ZSBjYW4gY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieQorICAvLy8gdGhlIHNwZWNpZmllZCBwb2ludGVyLCByZXR1cm4gJ2xlbisxJy4gIElmIHdlIGNhbid0LCByZXR1cm4gMC4KKyAgdWludDY0X3QgR2V0U3RyaW5nTGVuZ3RoKFZhbHVlICpWKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZlcmlmaWVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVmVyaWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThhZWVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZlcmlmaWVyLmgKQEAgLTAsMCArMSw3NSBAQAorLy89PT0tLSBsbHZtL0FuYWx5c2lzL1ZlcmlmaWVyLmggLSBMTFZNIElSIFZlcmlmaWVyIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZnVuY3Rpb24gdmVyaWZpZXIgaW50ZXJmYWNlLCB0aGF0IGNhbiBiZSB1c2VkIGZvciBzb21lCisvLyBzYW5pdHkgY2hlY2tpbmcgb2YgaW5wdXQgdG8gdGhlIHN5c3RlbSwgYW5kIGZvciBjaGVja2luZyB0aGF0IHRyYW5zZm9ybWF0aW9ucworLy8gaGF2ZW4ndCBkb25lIHNvbWV0aGluZyBiYWQuCisvLworLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgcHJvdmlkZSBmdWxsICdqYXZhIHN0eWxlJyBzZWN1cml0eSBhbmQgdmVyaWZpY2F0aW9ucywKKy8vIGluc3RlYWQgaXQganVzdCB0cmllcyB0byBlbnN1cmUgdGhhdCBjb2RlIGlzIHdlbGwgZm9ybWVkLgorLy8KKy8vIFRvIHNlZSB3aGF0IHNwZWNpZmljYWxseSBpcyBjaGVja2VkLCBsb29rIGF0IHRoZSB0b3Agb2YgVmVyaWZpZXIuY3BwCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1ZFUklGSUVSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19WRVJJRklFUl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb25QYXNzOworY2xhc3MgTW9kdWxlOworY2xhc3MgRnVuY3Rpb247CisKKy8vLyBAYnJpZWYgQW4gZW51bWVyYXRpb24gdG8gc3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIGlmIGVycm9ycyBmb3VuZC4KKy8vLworLy8vIFRoaXMgZW51bWVyYXRpb24gaXMgdXNlZCBpbiB0aGUgZnVuY3Rpb25zIGJlbG93IHRvIGluZGljYXRlIHdoYXQgc2hvdWxkCisvLy8gaGFwcGVuIGlmIHRoZSB2ZXJpZmllciBmaW5kcyBlcnJvcnMuIEVhY2ggb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IHVzZXMKKy8vLyB0aGlzIGVudW1lcmF0aW9uIGFzIGFuIGFyZ3VtZW50IHByb3ZpZGVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgaXQuIFRoZQorLy8vIGFjdGlvbnMgYXJlIGxpc3RlZCBiZWxvdy4KK2VudW0gVmVyaWZpZXJGYWlsdXJlQWN0aW9uIHsKKyAgQWJvcnRQcm9jZXNzQWN0aW9uLCAgIC8vLzwgdmVyaWZ5TW9kdWxlIHdpbGwgcHJpbnQgdG8gc3RkZXJyIGFuZCBhYm9ydCgpCisgIFByaW50TWVzc2FnZUFjdGlvbiwgICAvLy88IHZlcmlmeU1vZHVsZSB3aWxsIHByaW50IHRvIHN0ZGVyciBhbmQgcmV0dXJuIHRydWUKKyAgUmV0dXJuU3RhdHVzQWN0aW9uICAgIC8vLzwgdmVyaWZ5TW9kdWxlIHdpbGwganVzdCByZXR1cm4gdHJ1ZQorfTsKKworLy8vIEBicmllZiBDcmVhdGUgYSB2ZXJpZmllciBwYXNzLgorLy8vCisvLy8gQ2hlY2sgYSBtb2R1bGUgb3IgZnVuY3Rpb24gZm9yIHZhbGlkaXR5LiAgV2hlbiB0aGUgcGFzcyBpcyB1c2VkLCB0aGUKKy8vLyBhY3Rpb24gaW5kaWNhdGVkIGJ5IHRoZSBccCBhY3Rpb24gYXJndW1lbnQgd2lsbCBiZSB1c2VkIGlmIGVycm9ycyBhcmUKKy8vLyBmb3VuZC4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlVmVyaWZpZXJQYXNzKAorICBWZXJpZmllckZhaWx1cmVBY3Rpb24gYWN0aW9uID0gQWJvcnRQcm9jZXNzQWN0aW9uIC8vLzwgQWN0aW9uIHRvIHRha2UKKyk7CisKKy8vLyBAYnJpZWYgQ2hlY2sgYSBtb2R1bGUgZm9yIGVycm9ycy4KKy8vLworLy8vIElmIHRoZXJlIGFyZSBubyBlcnJvcnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLiBJZiBhbiBlcnJvciBpcyBmb3VuZCwKKy8vLyB0aGUgYWN0aW9uIHRha2VuIGRlcGVuZHMgb24gdGhlIFxwIGFjdGlvbiBwYXJhbWV0ZXIuCisvLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcsIGJlY2F1c2UgaXQgcGxheXMgZ2FtZXMgd2l0aAorLy8vIFBhc3NNYW5hZ2VycyBhbmQgc3R1ZmYuCisKK2Jvb2wgdmVyaWZ5TW9kdWxlKAorICBjb25zdCBNb2R1bGUgJk0sICAvLy88IFRoZSBtb2R1bGUgdG8gYmUgdmVyaWZpZWQKKyAgVmVyaWZpZXJGYWlsdXJlQWN0aW9uIGFjdGlvbiA9IEFib3J0UHJvY2Vzc0FjdGlvbiwgLy8vPCBBY3Rpb24gdG8gdGFrZQorICBzdGQ6OnN0cmluZyAqRXJyb3JJbmZvID0gMCAgICAgIC8vLzwgSW5mb3JtYXRpb24gYWJvdXQgZmFpbHVyZXMuCispOworCisvLyB2ZXJpZnlGdW5jdGlvbiAtIENoZWNrIGEgZnVuY3Rpb24gZm9yIGVycm9ycywgdXNlZnVsIGZvciB1c2Ugd2hlbiBkZWJ1Z2dpbmcgYQorLy8gcGFzcy4KK2Jvb2wgdmVyaWZ5RnVuY3Rpb24oCisgIGNvbnN0IEZ1bmN0aW9uICZGLCAgLy8vPCBUaGUgZnVuY3Rpb24gdG8gYmUgdmVyaWZpZWQKKyAgVmVyaWZpZXJGYWlsdXJlQWN0aW9uIGFjdGlvbiA9IEFib3J0UHJvY2Vzc0FjdGlvbiAvLy88IEFjdGlvbiB0byB0YWtlCispOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Bcmd1bWVudC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0FyZ3VtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwOGJiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Bcmd1bWVudC5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LS0gbGx2bS9Bcmd1bWVudC5oIC0gRGVmaW5pdGlvbiBvZiB0aGUgQXJndW1lbnQgY2xhc3MgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBBcmd1bWVudCBjbGFzcy4gCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FSR1VNRU5UX0gKKyNkZWZpbmUgTExWTV9BUkdVTUVOVF9ICisKKyNpbmNsdWRlICJsbHZtL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVTdWJDbGFzcywgdHlwZW5hbWUgSXRlbVBhcmVudENsYXNzPgorICBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM7CisKKy8vLyBBIGNsYXNzIHRvIHJlcHJlc2VudCBhbiBpbmNvbWluZyBmb3JtYWwgYXJndW1lbnQgdG8gYSBGdW5jdGlvbi4gQW4gYXJndW1lbnQKKy8vLyBpcyBhIHZlcnkgc2ltcGxlIFZhbHVlLiBJdCBpcyBlc3NlbnRpYWxseSBhIG5hbWVkIChvcHRpb25hbCkgdHlwZS4gV2hlbiB1c2VkCisvLy8gaW4gdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiwgaXQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgdGhlIGFjdHVhbCBhcmd1bWVudAorLy8vIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkIHdpdGguCisvLy8gQGJyaWVmIExMVk0gQXJndW1lbnQgcmVwcmVzZW50YXRpb24gIAorY2xhc3MgQXJndW1lbnQgOiBwdWJsaWMgVmFsdWUsIHB1YmxpYyBpbGlzdF9ub2RlPEFyZ3VtZW50PiB7CisgIEZ1bmN0aW9uICpQYXJlbnQ7CisKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxBcmd1bWVudCwgRnVuY3Rpb24+OworICB2b2lkIHNldFBhcmVudChGdW5jdGlvbiAqcGFyZW50KTsKKworcHVibGljOgorICAvLy8gQXJndW1lbnQgY3RvciAtIElmIEZ1bmN0aW9uIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgdGhpcyBhcmd1bWVudCBpcworICAvLy8gaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIGZ1bmN0aW9uLgorICAvLy8KKyAgZXhwbGljaXQgQXJndW1lbnQoY29uc3QgVHlwZSAqVHksIEZ1bmN0aW9uICpGID0gMCk7CisKKyAgaW5saW5lIGNvbnN0IEZ1bmN0aW9uICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKyAgaW5saW5lICAgICAgIEZ1bmN0aW9uICpnZXRQYXJlbnQoKSAgICAgICB7IHJldHVybiBQYXJlbnQ7IH0KKworICAvLy8gZ2V0QXJnTm8gLSBSZXR1cm4gdGhlIGluZGV4IG9mIHRoaXMgZm9ybWFsIGFyZ3VtZW50IGluIGl0cyBjb250YWluaW5nCisgIC8vLyBmdW5jdGlvbi4gIEZvciBleGFtcGxlIGluICJ2b2lkIGZvbyhpbnQgYSwgZmxvYXQgYikiIGEgaXMgMCBhbmQgYiBpcyAxLiAKKyAgdW5zaWduZWQgZ2V0QXJnTm8oKSBjb25zdDsKKyAgCisgIC8vLyBoYXNCeVZhbEF0dHIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgYnl2YWwgYXR0cmlidXRlIG9uIGl0CisgIC8vLyBpbiBpdHMgY29udGFpbmluZyBmdW5jdGlvbi4KKyAgYm9vbCBoYXNCeVZhbEF0dHIoKSBjb25zdDsKKworICAvLy8gaGFzTmVzdEF0dHIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgbmVzdCBhdHRyaWJ1dGUgb24KKyAgLy8vIGl0IGluIGl0cyBjb250YWluaW5nIGZ1bmN0aW9uLgorICBib29sIGhhc05lc3RBdHRyKCkgY29uc3Q7CisKKyAgLy8vIGhhc05vQWxpYXNBdHRyIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIG5vYWxpYXMgYXR0cmlidXRlIG9uCisgIC8vLyBpdCBpbiBpdHMgY29udGFpbmluZyBmdW5jdGlvbi4KKyAgYm9vbCBoYXNOb0FsaWFzQXR0cigpIGNvbnN0OworICAKKyAgLy8vIGhhc05vQ2FwdHVyZUF0dHIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgbm9jYXB0dXJlCisgIC8vLyBhdHRyaWJ1dGUgb24gaXQgaW4gaXRzIGNvbnRhaW5pbmcgZnVuY3Rpb24uCisgIGJvb2wgaGFzTm9DYXB0dXJlQXR0cigpIGNvbnN0OworICAKKyAgLy8vIGhhc1NSZXRBdHRyIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIHNyZXQgYXR0cmlidXRlIG9uIGl0IGluCisgIC8vLyBpdHMgY29udGFpbmluZyBmdW5jdGlvbi4KKyAgYm9vbCBoYXNTdHJ1Y3RSZXRBdHRyKCkgY29uc3Q7CisKKyAgLy8vIGFkZEF0dHIgLSBBZGQgYSBBdHRyaWJ1dGUgdG8gYW4gYXJndW1lbnQKKyAgdm9pZCBhZGRBdHRyKEF0dHJpYnV0ZXMpOworICAKKyAgLy8vIHJlbW92ZUF0dHIgLSBSZW1vdmUgYSBBdHRyaWJ1dGUgZnJvbSBhbiBhcmd1bWVudAorICB2b2lkIHJlbW92ZUF0dHIoQXR0cmlidXRlcyk7CisKKyAgLy8vIGNsYXNzb2YgLSBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kCisgIC8vLyBkeW5fY2FzdDoKKyAgLy8vCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEFyZ3VtZW50ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IEFyZ3VtZW50VmFsOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Bc3NlbWJseS9Bc21Bbm5vdGF0aW9uV3JpdGVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQXNzZW1ibHkvQXNtQW5ub3RhdGlvbldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzU3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQXNzZW1ibHkvQXNtQW5ub3RhdGlvbldyaXRlci5oCkBAIC0wLDAgKzEsNTggQEAKKy8vPT09LS0gQXNtQW5ub3RhdGlvbldyaXRlci5oIC0gSXRmIGZvciBhbm5vdGF0aW9uIC5sbCBmaWxlcyAtIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ2xpZW50cyBvZiB0aGUgYXNzZW1ibHkgd3JpdGVyIGNhbiB1c2UgdGhpcyBpbnRlcmZhY2UgdG8gYWRkIHRoZWlyIG93bgorLy8gc3BlY2lhbC1wdXJwb3NlIGFubm90YXRpb25zIHRvIExMVk0gYXNzZW1ibHkgbGFuZ3VhZ2UgcHJpbnRvdXRzLiAgTm90ZSB0aGF0CisvLyB0aGUgYXNzZW1ibHkgcGFyc2VyIHdvbid0IGJlIGFibGUgdG8gcGFyc2UgdGhlc2UsIGluIGdlbmVyYWwsIHNvCisvLyBpbXBsZW1lbnRhdGlvbnMgYXJlIGFkdmlzZWQgdG8gcHJpbnQgc3R1ZmYgYXMgTExWTSBjb21tZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQVNTRU1CTFlfQVNNQU5OT1RBVElPTldSSVRFUl9ICisjZGVmaW5lIExMVk1fQVNTRU1CTFlfQVNNQU5OT1RBVElPTldSSVRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKworY2xhc3MgQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyIHsKK3B1YmxpYzoKKworICB2aXJ0dWFsIH5Bc3NlbWJseUFubm90YXRpb25Xcml0ZXIoKTsKKworICAvLy8gZW1pdEZ1bmN0aW9uQW5ub3QgLSBUaGlzIG1heSBiZSBpbXBsZW1lbnRlZCB0byBlbWl0IGEgc3RyaW5nIHJpZ2h0IGJlZm9yZQorICAvLy8gdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBlbWl0RnVuY3Rpb25Bbm5vdChjb25zdCBGdW5jdGlvbiAqRiwgcmF3X29zdHJlYW0gJk9TKSB7fQorCisgIC8vLyBlbWl0QmFzaWNCbG9ja1N0YXJ0QW5ub3QgLSBUaGlzIG1heSBiZSBpbXBsZW1lbnRlZCB0byBlbWl0IGEgc3RyaW5nIHJpZ2h0CisgIC8vLyBhZnRlciB0aGUgYmFzaWMgYmxvY2sgbGFiZWwsIGJ1dCBiZWZvcmUgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZSBibG9jay4KKyAgdmlydHVhbCB2b2lkIGVtaXRCYXNpY0Jsb2NrU3RhcnRBbm5vdChjb25zdCBCYXNpY0Jsb2NrICpCQiwgcmF3X29zdHJlYW0gJk9TKXsKKyAgfQorCisgIC8vLyBlbWl0QmFzaWNCbG9ja0VuZEFubm90IC0gVGhpcyBtYXkgYmUgaW1wbGVtZW50ZWQgdG8gZW1pdCBhIHN0cmluZyByaWdodAorICAvLy8gYWZ0ZXIgdGhlIGJhc2ljIGJsb2NrLgorICB2aXJ0dWFsIHZvaWQgZW1pdEJhc2ljQmxvY2tFbmRBbm5vdChjb25zdCBCYXNpY0Jsb2NrICpCQiwgcmF3X29zdHJlYW0gJk9TKXsKKyAgfQorCisgIC8vLyBlbWl0SW5zdHJ1Y3Rpb25Bbm5vdCAtIFRoaXMgbWF5IGJlIGltcGxlbWVudGVkIHRvIGVtaXQgYSBzdHJpbmcgcmlnaHQKKyAgLy8vIGJlZm9yZSBhbiBpbnN0cnVjdGlvbiBpcyBlbWl0dGVkLgorICB2aXJ0dWFsIHZvaWQgZW1pdEluc3RydWN0aW9uQW5ub3QoY29uc3QgSW5zdHJ1Y3Rpb24gKkksIHJhd19vc3RyZWFtICZPUykge30KKworICAvLy8gcHJpbnRJbmZvQ29tbWVudCAtIFRoaXMgbWF5IGJlIGltcGxlbWVudGVkIHRvIGVtaXQgYSBjb21tZW50IHRvIHRoZQorICAvLy8gcmlnaHQgb2YgYW4gaW5zdHJ1Y3Rpb24gb3IgZ2xvYmFsIHZhbHVlLgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbmZvQ29tbWVudChjb25zdCBWYWx1ZSAmViwgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZPUykge30KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0Fzc2VtYmx5L1BhcnNlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0Fzc2VtYmx5L1BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWM2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQXNzZW1ibHkvUGFyc2VyLmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tLSBsbHZtL0Fzc2VtYmx5L1BhcnNlci5oIC0gUGFyc2VyIGZvciBWTSBhc3NlbWJseSBmaWxlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhlc2UgY2xhc3NlcyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIGxpYi9Bc21QYXJzZXIgbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQVNTRU1CTFlfUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9BU1NFTUJMWV9QQVJTRVJfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKK2NsYXNzIFNNRGlhZ25vc3RpYzsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgTExWTUNvbnRleHQ7CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byB0aGUgTExWTSBBc3NlbWJseSBQYXJzZXIuIEl0IHBhcnNlcworLy8vIGFuIEFTQ0lJIGZpbGUgdGhhdCAocHJlc3VtYWJseSkgY29udGFpbnMgTExWTSBBc3NlbWJseSBjb2RlLiBJdCByZXR1cm5zIGEKKy8vLyBNb2R1bGUgKGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbikgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlcy4gTm90ZQorLy8vIHRoYXQgdGhpcyBkb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGUgZ2VuZXJhdGVkIE1vZHVsZSBpcyB2YWxpZCwgc28geW91IHNob3VsZAorLy8vIHJ1biB0aGUgdmVyaWZpZXIgYWZ0ZXIgcGFyc2luZyB0aGUgZmlsZSB0byBjaGVjayB0aGF0IGl0IGlzIG9rYXkuCisvLy8gQGJyaWVmIFBhcnNlIExMVk0gQXNzZW1ibHkgZnJvbSBhIGZpbGUKK01vZHVsZSAqUGFyc2VBc3NlbWJseUZpbGUoCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZGaWxlbmFtZSwgLy8vPCBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBwYXJzZQorICBTTURpYWdub3N0aWMgJkVycm9yLCAgICAgICAgIC8vLzwgRXJyb3IgcmVzdWx0IGluZm8uCisgIExMVk1Db250ZXh0ICZDb250ZXh0ICAgICAgICAgLy8vPCBDb250ZXh0IGluIHdoaWNoIHRvIGFsbG9jYXRlIGdsb2JhbHMgaW5mby4KKyk7CisKKy8vLyBUaGUgZnVuY3Rpb24gaXMgYSBzZWNvbmRhcnkgaW50ZXJmYWNlIHRvIHRoZSBMTFZNIEFzc2VtYmx5IFBhcnNlci4gSXQgcGFyc2VzCisvLy8gYW4gQVNDSUkgc3RyaW5nIHRoYXQgKHByZXN1bWFibHkpIGNvbnRhaW5zIExMVk0gQXNzZW1ibHkgY29kZS4gSXQgcmV0dXJucyBhCisvLy8gTW9kdWxlIChpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24pIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZXMuIE5vdGUKKy8vLyB0aGF0IHRoaXMgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIGdlbmVyYXRlZCBNb2R1bGUgaXMgdmFsaWQsIHNvIHlvdSBzaG91bGQKKy8vLyBydW4gdGhlIHZlcmlmaWVyIGFmdGVyIHBhcnNpbmcgdGhlIGZpbGUgdG8gY2hlY2sgdGhhdCBpdCBpcyBva2F5LgorLy8vIEBicmllZiBQYXJzZSBMTFZNIEFzc2VtYmx5IGZyb20gYSBzdHJpbmcKK01vZHVsZSAqUGFyc2VBc3NlbWJseVN0cmluZygKKyAgY29uc3QgY2hhciAqQXNtU3RyaW5nLCAvLy88IFRoZSBzdHJpbmcgY29udGFpbmluZyBhc3NlbWJseQorICBNb2R1bGUgKk0sICAgICAgICAgICAgIC8vLzwgQSBtb2R1bGUgdG8gYWRkIHRoZSBhc3NlbWJseSB0b28uCisgIFNNRGlhZ25vc3RpYyAmRXJyb3IsICAgLy8vPCBFcnJvciByZXN1bHQgaW5mby4KKyAgTExWTUNvbnRleHQgJkNvbnRleHQKKyk7CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBMTFZNIEFzc2VtYmx5IFBhcnNlci4KKy8vLyBQYXJzZUFzc2VtYmx5RmlsZSBhbmQgUGFyc2VBc3NlbWJseVN0cmluZyBhcmUgd3JhcHBlcnMgYXJvdW5kIHRoaXMgZnVuY3Rpb24uCisvLy8gQGJyaWVmIFBhcnNlIExMVk0gQXNzZW1ibHkgZnJvbSBhIE1lbW9yeUJ1ZmZlci4gVGhpcyBmdW5jdGlvbiAqYWx3YXlzKgorLy8vIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgTWVtb3J5QnVmZmVyLgorTW9kdWxlICpQYXJzZUFzc2VtYmx5KAorICAgIE1lbW9yeUJ1ZmZlciAqRiwgICAgIC8vLzwgVGhlIE1lbW9yeUJ1ZmZlciBjb250YWluaW5nIGFzc2VtYmx5CisgICAgTW9kdWxlICpNLCAgICAgICAgICAgLy8vPCBBIG1vZHVsZSB0byBhZGQgdGhlIGFzc2VtYmx5IHRvby4KKyAgICBTTURpYWdub3N0aWMgJkVyciwgICAvLy88IEVycm9yIHJlc3VsdCBpbmZvLgorICAgIExMVk1Db250ZXh0ICZDb250ZXh0CispOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Bc3NlbWJseS9QcmludE1vZHVsZVBhc3MuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Bc3NlbWJseS9QcmludE1vZHVsZVBhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzlmYmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0Fzc2VtYmx5L1ByaW50TW9kdWxlUGFzcy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LSBsbHZtL0Fzc2VtYmx5L1ByaW50TW9kdWxlUGFzcy5oIC0gUHJpbnRpbmcgUGFzcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdHdvIHBhc3NlcyB0byBwcmludCBvdXQgYSBtb2R1bGUuICBUaGUgUHJpbnRNb2R1bGVQYXNzIHBhc3MKKy8vIHNpbXBseSBwcmludHMgb3V0IHRoZSBlbnRpcmUgbW9kdWxlIHdoZW4gaXQgaXMgZXhlY3V0ZWQuICBUaGUKKy8vIFByaW50RnVuY3Rpb25QYXNzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIHBpcGVsaW5lZCB3aXRoIG90aGVyCisvLyBGdW5jdGlvblBhc3MncywgYW5kIHByaW50cyBvdXQgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgbW9kdWxlIGFzIHRoZXkgYXJlCisvLyBwcm9jZXNzZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FTU0VNQkxZX1BSSU5UTU9EVUxFUEFTU19ICisjZGVmaW5lIExMVk1fQVNTRU1CTFlfUFJJTlRNT0RVTEVQQVNTX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBGdW5jdGlvblBhc3M7CisgIGNsYXNzIE1vZHVsZVBhc3M7CisgIGNsYXNzIHJhd19vc3RyZWFtOworICAKKyAgLy8vIGNyZWF0ZVByaW50TW9kdWxlUGFzcyAtIENyZWF0ZSBhbmQgcmV0dXJuIGEgcGFzcyB0aGF0IHdyaXRlcyB0aGUKKyAgLy8vIG1vZHVsZSB0byB0aGUgc3BlY2lmaWVkIHJhd19vc3RyZWFtLgorICBNb2R1bGVQYXNzICpjcmVhdGVQcmludE1vZHVsZVBhc3MocmF3X29zdHJlYW0gKk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxldGVTdHJlYW09ZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyID0gIiIpOworICAKKyAgLy8vIGNyZWF0ZVByaW50RnVuY3Rpb25QYXNzIC0gQ3JlYXRlIGFuZCByZXR1cm4gYSBwYXNzIHRoYXQgcHJpbnRzCisgIC8vLyBmdW5jdGlvbnMgdG8gdGhlIHNwZWNpZmllZCByYXdfb3N0cmVhbSBhcyB0aGV5IGFyZSBwcm9jZXNzZWQuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUHJpbnRGdW5jdGlvblBhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAqT1MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVsZXRlU3RyZWFtPWZhbHNlKTsgIAorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Bc3NlbWJseS9Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIyMzkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0Fzc2VtYmx5L1dyaXRlci5oCkBAIC0wLDAgKzEsNzggQEAKKy8vPT09LS0gbGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCAtIFByaW50ZXIgZm9yIExMVk0gYXNzZW1ibHkgZmlsZXMgLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGltcGxlbWVudGVkIGJ5IGxpYi9WTUNvcmUvQXNtV3JpdGVyLmNwcC4KKy8vIFRoaXMgbGlicmFyeSBpcyB1c2VkIHRvIHByaW50IExMVk0gYXNzZW1ibHkgbGFuZ3VhZ2UgZmlsZXMgdG8gYW4gaW9zdHJlYW0uIEl0CisvLyBjYW4gcHJpbnQgTExWTSBjb2RlIGF0IGEgdmFyaWV0eSBvZiBncmFudWxhcml0aWVzLCBpbmNsdWRpbmcgTW9kdWxlcywKKy8vIEJhc2ljQmxvY2tzLCBhbmQgSW5zdHJ1Y3Rpb25zLiAgVGhpcyBtYWtlcyBpdCB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQVNTRU1CTFlfV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9BU1NFTUJMWV9XUklURVJfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFR5cGU7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBWYWx1ZTsKK2NsYXNzIHJhd19vc3RyZWFtOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKyAgCisvLy8gVHlwZVByaW50aW5nIC0gVHlwZSBwcmludGluZyBtYWNoaW5lcnkuCitjbGFzcyBUeXBlUHJpbnRpbmcgeworICB2b2lkICpUeXBlTmFtZXM7ICAvLyBBIG1hcCB0byByZW1lbWJlciB0eXBlIG5hbWVzLgorICBUeXBlUHJpbnRpbmcoY29uc3QgVHlwZVByaW50aW5nICYpOyAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZVByaW50aW5nJik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwdWJsaWM6CisgIFR5cGVQcmludGluZygpOworICB+VHlwZVByaW50aW5nKCk7CisgIAorICB2b2lkIGNsZWFyKCk7CisgIAorICB2b2lkIHByaW50KGNvbnN0IFR5cGUgKlR5LCByYXdfb3N0cmVhbSAmT1MsIGJvb2wgSWdub3JlVG9wTGV2ZWxOYW1lID0gZmFsc2UpOworICAKKyAgdm9pZCBwcmludEF0TGVhc3RPbmVMZXZlbChjb25zdCBUeXBlICpUeSwgcmF3X29zdHJlYW0gJk9TKSB7CisgICAgcHJpbnQoVHksIE9TLCB0cnVlKTsKKyAgfQorICAKKyAgLy8vIGhhc1R5cGVOYW1lIC0gUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaGFzIGEgbmFtZSBpbiBUeXBlTmFtZXMsIGZhbHNlCisgIC8vLyBvdGhlcndpc2UuCisgIGJvb2wgaGFzVHlwZU5hbWUoY29uc3QgVHlwZSAqVHkpIGNvbnN0OworICAKKyAgLy8vIGFkZFR5cGVOYW1lIC0gQWRkIGEgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlCisgIC8vLyBvbmUuICBUaGlzIG5hbWUgd2lsbCBiZSBwcmludGVkIGluc3RlYWQgb2YgdGhlIHN0cnVjdHVyYWwgdmVyc2lvbiBvZiB0aGUKKyAgLy8vIHR5cGUgaW4gb3JkZXIgdG8gbWFrZSB0aGUgb3V0cHV0IG1vcmUgY29uY2lzZS4KKyAgdm9pZCBhZGRUeXBlTmFtZShjb25zdCBUeXBlICpUeSwgY29uc3Qgc3RkOjpzdHJpbmcgJk4pOworICAKK3ByaXZhdGU6CisgIHZvaWQgQ2FsY1R5cGVOYW1lKGNvbnN0IFR5cGUgKlR5LCBTbWFsbFZlY3RvckltcGw8Y29uc3QgVHlwZSAqPiAmVHlwZVN0YWNrLAorICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MsIGJvb2wgSWdub3JlVG9wTGV2ZWxOYW1lID0gZmFsc2UpOworfTsKKworLy8gV3JpdGVUeXBlU3ltYm9saWMgLSBUaGlzIGF0dGVtcHRzIHRvIHdyaXRlIHRoZSBzcGVjaWZpZWQgdHlwZSBhcyBhIHN5bWJvbGljCisvLyB0eXBlLCBpZiB0aGVyZSBpcyBhbiBlbnRyeSBpbiB0aGUgTW9kdWxlJ3Mgc3ltYm9sIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkCisvLyB0eXBlIG9yIG9uZSBvZiBpdHMgY29tcG9uZW50IHR5cGVzLgorLy8KK3ZvaWQgV3JpdGVUeXBlU3ltYm9saWMocmF3X29zdHJlYW0gJiwgY29uc3QgVHlwZSAqLCBjb25zdCBNb2R1bGUgKk0pOworCisvLyBXcml0ZUFzT3BlcmFuZCAtIFdyaXRlIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3V0IHRvIHRoZSBzcGVjaWZpZWQKKy8vIG9zdHJlYW0uICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3UganVzdCB3YW50IHRvIHByaW50IGludCAlcmVnMTI2LCBub3QgdGhlCisvLyB3aG9sZSBpbnN0cnVjdGlvbiB0aGF0IGdlbmVyYXRlZCBpdC4gIElmIHlvdSBzcGVjaWZ5IGEgTW9kdWxlIGZvciBjb250ZXh0LAorLy8gdGhlbiBldmVuIGNvbnN0YW50cyBnZXQgcHJldHR5LXByaW50ZWQ7IGZvciBleGFtcGxlLCB0aGUgdHlwZSBvZiBhIG51bGwKKy8vIHBvaW50ZXIgaXMgcHJpbnRlZCBzeW1ib2xpY2FsbHkuCisvLwordm9pZCBXcml0ZUFzT3BlcmFuZChyYXdfb3N0cmVhbSAmLCBjb25zdCBWYWx1ZSAqLCBib29sIFByaW50VHkgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkNvbnRleHQgPSAwKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQXR0cmlidXRlcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0F0dHJpYnV0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk2ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0F0dHJpYnV0ZXMuaApAQCAtMCwwICsxLDI4NyBAQAorLy89PT0tLSBsbHZtL0F0dHJpYnV0ZXMuaCAtIENvbnRhaW5lciBmb3IgQXR0cmlidXRlcyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSB0eXBlcyBuZWNlc3NhcnkgdG8gcmVwcmVzZW50IHRoZQorLy8gYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggZnVuY3Rpb25zIGFuZCB0aGVpciBjYWxscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQVRUUklCVVRFU19ICisjZGVmaW5lIExMVk1fQVRUUklCVVRFU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBUeXBlOworCisvLy8gQXR0cmlidXRlcyAtIEEgYml0c2V0IG9mIGF0dHJpYnV0ZXMuCit0eXBlZGVmIHVuc2lnbmVkIEF0dHJpYnV0ZXM7CisKK25hbWVzcGFjZSBBdHRyaWJ1dGUgeworCisvLy8gRnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBjYW4gaGF2ZSBhdHRyaWJ1dGVzIHRvIGluZGljYXRlIGhvdyB0aGV5CisvLy8gc2hvdWxkIGJlIHRyZWF0ZWQgYnkgb3B0aW1pemF0aW9ucyBhbmQgY29kZSBnZW5lcmF0aW9uLiBUaGlzIGVudW1lcmF0aW9uCisvLy8gbGlzdHMgdGhlIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHBhcmFtZXRlcnMsIGZ1bmN0aW9uCisvLy8gcmVzdWx0cyBvciB0aGUgZnVuY3Rpb24gaXRzZWxmLgorLy8vIEBicmllZiBGdW5jdGlvbiBhdHRyaWJ1dGVzLgorCitjb25zdCBBdHRyaWJ1dGVzIE5vbmUgICAgICA9IDA7ICAgICAvLy88IE5vIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldAorY29uc3QgQXR0cmlidXRlcyBaRXh0ICAgICAgPSAxPDwwOyAgLy8vPCBaZXJvIGV4dGVuZGVkIGJlZm9yZS9hZnRlciBjYWxsCitjb25zdCBBdHRyaWJ1dGVzIFNFeHQgICAgICA9IDE8PDE7ICAvLy88IFNpZ24gZXh0ZW5kZWQgYmVmb3JlL2FmdGVyIGNhbGwKK2NvbnN0IEF0dHJpYnV0ZXMgTm9SZXR1cm4gID0gMTw8MjsgIC8vLzwgTWFyayB0aGUgZnVuY3Rpb24gYXMgbm90IHJldHVybmluZworY29uc3QgQXR0cmlidXRlcyBJblJlZyAgICAgPSAxPDwzOyAgLy8vPCBGb3JjZSBhcmd1bWVudCB0byBiZSBwYXNzZWQgaW4gcmVnaXN0ZXIKK2NvbnN0IEF0dHJpYnV0ZXMgU3RydWN0UmV0ID0gMTw8NDsgIC8vLzwgSGlkZGVuIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIHJldHVybgorY29uc3QgQXR0cmlidXRlcyBOb1Vud2luZCAgPSAxPDw1OyAgLy8vPCBGdW5jdGlvbiBkb2Vzbid0IHVud2luZCBzdGFjaworY29uc3QgQXR0cmlidXRlcyBOb0FsaWFzICAgPSAxPDw2OyAgLy8vPCBDb25zaWRlcmVkIHRvIG5vdCBhbGlhcyBhZnRlciBjYWxsCitjb25zdCBBdHRyaWJ1dGVzIEJ5VmFsICAgICA9IDE8PDc7ICAvLy88IFBhc3Mgc3RydWN0dXJlIGJ5IHZhbHVlCitjb25zdCBBdHRyaWJ1dGVzIE5lc3QgICAgICA9IDE8PDg7ICAvLy88IE5lc3RlZCBmdW5jdGlvbiBzdGF0aWMgY2hhaW4KK2NvbnN0IEF0dHJpYnV0ZXMgUmVhZE5vbmUgID0gMTw8OTsgIC8vLzwgRnVuY3Rpb24gZG9lcyBub3QgYWNjZXNzIG1lbW9yeQorY29uc3QgQXR0cmlidXRlcyBSZWFkT25seSAgPSAxPDwxMDsgLy8vPCBGdW5jdGlvbiBvbmx5IHJlYWRzIGZyb20gbWVtb3J5Citjb25zdCBBdHRyaWJ1dGVzIE5vSW5saW5lICAgICAgICA9IDE8PDExOyAvLy88IGlubGluZT1uZXZlcgorY29uc3QgQXR0cmlidXRlcyBBbHdheXNJbmxpbmUgICAgPSAxPDwxMjsgLy8vPCBpbmxpbmU9YWx3YXlzCitjb25zdCBBdHRyaWJ1dGVzIE9wdGltaXplRm9yU2l6ZSA9IDE8PDEzOyAvLy88IG9wdF9zaXplCitjb25zdCBBdHRyaWJ1dGVzIFN0YWNrUHJvdGVjdCAgICA9IDE8PDE0OyAvLy88IFN0YWNrIHByb3RlY3Rpb24uCitjb25zdCBBdHRyaWJ1dGVzIFN0YWNrUHJvdGVjdFJlcSA9IDE8PDE1OyAvLy88IFN0YWNrIHByb3RlY3Rpb24gcmVxdWlyZWQuCitjb25zdCBBdHRyaWJ1dGVzIEFsaWdubWVudCA9IDMxPDwxNjsgLy8vPCBBbGlnbm1lbnQgb2YgcGFyYW1ldGVyICg1IGJpdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmVkIGFzIGxvZzIgb2YgYWxpZ25tZW50IHdpdGggKzEgYmlhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgbWVhbnMgdW5hbGlnbmVkIGRpZmZlcmVudCBmcm9tIGFsaWduIDEKK2NvbnN0IEF0dHJpYnV0ZXMgTm9DYXB0dXJlID0gMTw8MjE7IC8vLzwgRnVuY3Rpb24gY3JlYXRlcyBubyBhbGlhc2VzIG9mIHBvaW50ZXIKK2NvbnN0IEF0dHJpYnV0ZXMgTm9SZWRab25lID0gMTw8MjI7IC8vLyBkaXNhYmxlIHJlZHpvbmUKK2NvbnN0IEF0dHJpYnV0ZXMgTm9JbXBsaWNpdEZsb2F0ID0gMTw8MjM7IC8vLyBkaXNhYmxlIGltcGxpY2l0IGZsb2F0aW5nIHBvaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gaW5zdHJ1Y3Rpb25zLgorY29uc3QgQXR0cmlidXRlcyBOYWtlZCAgICAgICAgICAgPSAxPDwyNDsgLy8vPCBOYWtlZCBmdW5jdGlvbgorY29uc3QgQXR0cmlidXRlcyBJbmxpbmVIaW50ICAgICAgPSAxPDwyNTsgLy8vPCBzb3VyY2Ugc2FpZCBpbmxpbmluZyB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vL2Rlc2lyYWJsZQorY29uc3QgQXR0cmlidXRlcyBTdGFja0FsaWdubWVudCAgPSA3PDwyNjsgLy8vPCBBbGlnbm1lbnQgb2Ygc3RhY2sgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy9mdW5jdGlvbiAoMyBiaXRzKSBzdG9yZWQgYXMgbG9nMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vb2YgYWxpZ25tZW50IHdpdGggKzEgYmlhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vMCBtZWFucyB1bmFsaWduZWQgKGRpZmZlcmVudCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy9hbGlnbnN0YWNrKDEpKQorCisvLy8gQGJyaWVmIEF0dHJpYnV0ZXMgdGhhdCBvbmx5IGFwcGx5IHRvIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCitjb25zdCBBdHRyaWJ1dGVzIFBhcmFtZXRlck9ubHkgPSBCeVZhbCB8IE5lc3QgfCBTdHJ1Y3RSZXQgfCBOb0NhcHR1cmU7CisKKy8vLyBAYnJpZWYgQXR0cmlidXRlcyB0aGF0IG1heSBiZSBhcHBsaWVkIHRvIHRoZSBmdW5jdGlvbiBpdHNlbGYuICBUaGVzZSBjYW5ub3QKKy8vLyBiZSB1c2VkIG9uIHJldHVybiB2YWx1ZXMgb3IgZnVuY3Rpb24gcGFyYW1ldGVycy4KK2NvbnN0IEF0dHJpYnV0ZXMgRnVuY3Rpb25Pbmx5ID0gTm9SZXR1cm4gfCBOb1Vud2luZCB8IFJlYWROb25lIHwgUmVhZE9ubHkgfAorICBOb0lubGluZSB8IEFsd2F5c0lubGluZSB8IE9wdGltaXplRm9yU2l6ZSB8IFN0YWNrUHJvdGVjdCB8IFN0YWNrUHJvdGVjdFJlcSB8CisgIE5vUmVkWm9uZSB8IE5vSW1wbGljaXRGbG9hdCB8IE5ha2VkIHwgSW5saW5lSGludCB8IFN0YWNrQWxpZ25tZW50OworCisvLy8gQGJyaWVmIFBhcmFtZXRlciBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IGFwcGx5IHRvIHZhcmFyZyBjYWxsIGFyZ3VtZW50cy4KK2NvbnN0IEF0dHJpYnV0ZXMgVmFyQXJnc0luY29tcGF0aWJsZSA9IFN0cnVjdFJldDsKKworLy8vIEBicmllZiBBdHRyaWJ1dGVzIHRoYXQgYXJlIG11dHVhbGx5IGluY29tcGF0aWJsZS4KK2NvbnN0IEF0dHJpYnV0ZXMgTXV0dWFsbHlJbmNvbXBhdGlibGVbNF0gPSB7CisgIEJ5VmFsIHwgSW5SZWcgfCBOZXN0IHwgU3RydWN0UmV0LAorICBaRXh0ICB8IFNFeHQsCisgIFJlYWROb25lIHwgUmVhZE9ubHksCisgIE5vSW5saW5lIHwgQWx3YXlzSW5saW5lCit9OworCisvLy8gQGJyaWVmIFdoaWNoIGF0dHJpYnV0ZXMgY2Fubm90IGJlIGFwcGxpZWQgdG8gYSB0eXBlLgorQXR0cmlidXRlcyB0eXBlSW5jb21wYXRpYmxlKGNvbnN0IFR5cGUgKlR5KTsKKworLy8vIFRoaXMgdHVybnMgYW4gaW50IGFsaWdubWVudCAoYSBwb3dlciBvZiAyLCBub3JtYWxseSkgaW50byB0aGUKKy8vLyBmb3JtIHVzZWQgaW50ZXJuYWxseSBpbiBBdHRyaWJ1dGVzLgoraW5saW5lIEF0dHJpYnV0ZXMgY29uc3RydWN0QWxpZ25tZW50RnJvbUludCh1bnNpZ25lZCBpKSB7CisgIC8vIERlZmF1bHQgYWxpZ25tZW50LCBhbGxvdyB0aGUgdGFyZ2V0IHRvIGRlZmluZSBob3cgdG8gYWxpZ24gaXQuCisgIGlmIChpID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgYXNzZXJ0KGlzUG93ZXJPZjJfMzIoaSkgJiYgIkFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLiIpOworICBhc3NlcnQoaSA8PSAweDQwMDAwMDAwICYmICJBbGlnbm1lbnQgdG9vIGxhcmdlLiIpOworICByZXR1cm4gKExvZzJfMzIoaSkrMSkgPDwgMTY7Cit9CisKKy8vLyBUaGlzIHJldHVybnMgdGhlIGFsaWdubWVudCBmaWVsZCBvZiBhbiBhdHRyaWJ1dGUgYXMgYSBieXRlIGFsaWdubWVudCB2YWx1ZS4KK2lubGluZSB1bnNpZ25lZCBnZXRBbGlnbm1lbnRGcm9tQXR0cnMoQXR0cmlidXRlcyBBKSB7CisgIEF0dHJpYnV0ZXMgQWxpZ24gPSBBICYgQXR0cmlidXRlOjpBbGlnbm1lbnQ7CisgIGlmIChBbGlnbiA9PSAwKQorICAgIHJldHVybiAwOworCisgIHJldHVybiAxVSA8PCAoKEFsaWduID4+IDE2KSAtIDEpOworfQorCisvLy8gVGhpcyB0dXJucyBhbiBpbnQgc3RhY2sgYWxpZ25tZW50ICh3aGljaCBtdXN0IGJlIGEgcG93ZXIgb2YgMikgaW50bworLy8vIHRoZSBmb3JtIHVzZWQgaW50ZXJuYWxseSBpbiBBdHRyaWJ1dGVzLgoraW5saW5lIEF0dHJpYnV0ZXMgY29uc3RydWN0U3RhY2tBbGlnbm1lbnRGcm9tSW50KHVuc2lnbmVkIGkpIHsKKyAgLy8gRGVmYXVsdCBhbGlnbm1lbnQsIGFsbG93IHRoZSB0YXJnZXQgdG8gZGVmaW5lIGhvdyB0byBhbGlnbiBpdC4KKyAgaWYgKGkgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBhc3NlcnQoaXNQb3dlck9mMl8zMihpKSAmJiAiQWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiB0d28uIik7CisgIGFzc2VydChpIDw9IDB4MTAwICYmICJBbGlnbm1lbnQgdG9vIGxhcmdlLiIpOworICByZXR1cm4gKExvZzJfMzIoaSkrMSkgPDwgMjY7Cit9CisKKy8vLyBUaGlzIHJldHVybnMgdGhlIHN0YWNrIGFsaWdubWVudCBmaWVsZCBvZiBhbiBhdHRyaWJ1dGUgYXMgYSBieXRlIGFsaWdubWVudAorLy8vIHZhbHVlLgoraW5saW5lIHVuc2lnbmVkIGdldFN0YWNrQWxpZ25tZW50RnJvbUF0dHJzKEF0dHJpYnV0ZXMgQSkgeworICBBdHRyaWJ1dGVzIFN0YWNrQWxpZ24gPSBBICYgQXR0cmlidXRlOjpTdGFja0FsaWdubWVudDsKKyAgaWYgKFN0YWNrQWxpZ24gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gMVUgPDwgKChTdGFja0FsaWduID4+IDI2KSAtIDEpOworfQorCisKKy8vLyBUaGUgc2V0IG9mIEF0dHJpYnV0ZXMgc2V0IGluIEF0dHJpYnV0ZXMgaXMgY29udmVydGVkIHRvIGEKKy8vLyBzdHJpbmcgb2YgZXF1aXZhbGVudCBtbmVtb25pY3MuIFRoaXMgaXMsIHByZXN1bWFibHksIGZvciB3cml0aW5nIG91dAorLy8vIHRoZSBtbmVtb25pY3MgZm9yIHRoZSBhc3NlbWJseSB3cml0ZXIuCisvLy8gQGJyaWVmIENvbnZlcnQgYXR0cmlidXRlIGJpdHMgdG8gdGV4dAorc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoQXR0cmlidXRlcyBBdHRycyk7Cit9IC8vIGVuZCBuYW1lc3BhY2UgQXR0cmlidXRlCisKKy8vLyBUaGlzIGlzIGp1c3QgYSBwYWlyIG9mIHZhbHVlcyB0byBhc3NvY2lhdGUgYSBzZXQgb2YgYXR0cmlidXRlcworLy8vIHdpdGggYW4gaW5kZXguCitzdHJ1Y3QgQXR0cmlidXRlV2l0aEluZGV4IHsKKyAgQXR0cmlidXRlcyBBdHRyczsgLy8vPCBUaGUgYXR0cmlidXRlcyB0aGF0IGFyZSBzZXQsIG9yJ2QgdG9nZXRoZXIuCisgIHVuc2lnbmVkIEluZGV4OyAvLy88IEluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgZm9yIHdoaWNoIHRoZSBhdHRyaWJ1dGVzIGFwcGx5LgorICAgICAgICAgICAgICAgICAgLy8vPCBJbmRleCAwIGlzIHVzZWQgZm9yIHJldHVybiB2YWx1ZSBhdHRyaWJ1dGVzLgorICAgICAgICAgICAgICAgICAgLy8vPCBJbmRleCB+MFUgaXMgdXNlZCBmb3IgZnVuY3Rpb24gYXR0cmlidXRlcy4KKworICBzdGF0aWMgQXR0cmlidXRlV2l0aEluZGV4IGdldCh1bnNpZ25lZCBJZHgsIEF0dHJpYnV0ZXMgQXR0cnMpIHsKKyAgICBBdHRyaWJ1dGVXaXRoSW5kZXggUDsKKyAgICBQLkluZGV4ID0gSWR4OworICAgIFAuQXR0cnMgPSBBdHRyczsKKyAgICByZXR1cm4gUDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEF0dHJMaXN0UHRyIFNtYXJ0IFBvaW50ZXIKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIEF0dHJpYnV0ZUxpc3RJbXBsOworCisvLy8gQXR0ckxpc3RQdHIgLSBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIHJlZiBjb3VudCBmb3IgdGhlIG9wYXF1ZQorLy8vIEF0dHJpYnV0ZUxpc3RJbXBsIG9iamVjdCBhbmQgcHJvdmlkZXMgYWNjZXNzb3JzIGZvciBpdC4KK2NsYXNzIEF0dHJMaXN0UHRyIHsKKyAgLy8vIEF0dHJMaXN0IC0gVGhlIGF0dHJpYnV0ZXMgdGhhdCB3ZSBhcmUgbWFuYWdpbmcuICBUaGlzIGNhbiBiZSBudWxsCisgIC8vLyB0byByZXByZXNlbnQgdGhlIGVtcHR5IGF0dHJpYnV0ZXMgbGlzdC4KKyAgQXR0cmlidXRlTGlzdEltcGwgKkF0dHJMaXN0OworcHVibGljOgorICBBdHRyTGlzdFB0cigpIDogQXR0ckxpc3QoMCkge30KKyAgQXR0ckxpc3RQdHIoY29uc3QgQXR0ckxpc3RQdHIgJlApOworICBjb25zdCBBdHRyTGlzdFB0ciAmb3BlcmF0b3I9KGNvbnN0IEF0dHJMaXN0UHRyICZSSFMpOworICB+QXR0ckxpc3RQdHIoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQXR0cmlidXRlIExpc3QgQ29uc3RydWN0aW9uIGFuZCBNdXRhdGlvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gZ2V0IC0gUmV0dXJuIGEgQXR0cmlidXRlcyBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaW4gaXQuCisgIHN0YXRpYyBBdHRyTGlzdFB0ciBnZXQoY29uc3QgQXR0cmlidXRlV2l0aEluZGV4ICpBdHRyLCB1bnNpZ25lZCBOdW1BdHRycyk7CisKKyAgLy8vIGdldCAtIFJldHVybiBhIEF0dHJpYnV0ZSBsaXN0IHdpdGggdGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGJ5IHRoZQorICAvLy8gY29uc2VjdXRpdmUgcmFuZG9tIGFjY2VzcyBpdGVyYXRvciByYW5nZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CisgIHN0YXRpYyBBdHRyTGlzdFB0ciBnZXQoY29uc3QgSXRlciAmSSwgY29uc3QgSXRlciAmRSkgeworICAgIGlmIChJID09IEUpIHJldHVybiBBdHRyTGlzdFB0cigpOyAgLy8gRW1wdHkgbGlzdC4KKyAgICByZXR1cm4gZ2V0KCYqSSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEUtSSkpOworICB9CisKKyAgLy8vIGFkZEF0dHIgLSBBZGQgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGlzCisgIC8vLyBhdHRyaWJ1dGUgbGlzdC4gIFNpbmNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLCB0aGlzCisgIC8vLyByZXR1cm5zIHRoZSBuZXcgbGlzdC4KKyAgQXR0ckxpc3RQdHIgYWRkQXR0cih1bnNpZ25lZCBJZHgsIEF0dHJpYnV0ZXMgQXR0cnMpIGNvbnN0OworCisgIC8vLyByZW1vdmVBdHRyIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbQorICAvLy8gdGhpcyBhdHRyaWJ1dGUgbGlzdC4gIFNpbmNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLCB0aGlzCisgIC8vLyByZXR1cm5zIHRoZSBuZXcgbGlzdC4KKyAgQXR0ckxpc3RQdHIgcmVtb3ZlQXR0cih1bnNpZ25lZCBJZHgsIEF0dHJpYnV0ZXMgQXR0cnMpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBdHRyaWJ1dGUgTGlzdCBBY2Nlc3NvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBnZXRQYXJhbUF0dHJpYnV0ZXMgLSBUaGUgYXR0cmlidXRlcyBmb3IgdGhlIHNwZWNpZmllZCBpbmRleCBhcmUKKyAgLy8vIHJldHVybmVkLgorICBBdHRyaWJ1dGVzIGdldFBhcmFtQXR0cmlidXRlcyh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQgKElkeCAmJiBJZHggIT0gfjBVICYmICJJbnZhbGlkIHBhcmFtZXRlciBpbmRleCEiKTsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlcyhJZHgpOworICB9CisKKyAgLy8vIGdldFJldEF0dHJpYnV0ZXMgLSBUaGUgYXR0cmlidXRlcyBmb3IgdGhlIHJldCB2YWx1ZSBhcmUKKyAgLy8vIHJldHVybmVkLgorICBBdHRyaWJ1dGVzIGdldFJldEF0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoMCk7CisgIH0KKworICAvLy8gZ2V0Rm5BdHRyaWJ1dGVzIC0gVGhlIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgYXJlIHJldHVybmVkLgorICBBdHRyaWJ1dGVzIGdldEZuQXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlcyh+MFUpOworICB9CisKKyAgLy8vIHBhcmFtSGFzQXR0ciAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGluZGV4IGhhcyB0aGUKKyAgLy8vIHNwZWNpZmllZCBhdHRyaWJ1dGUgc2V0LgorICBib29sIHBhcmFtSGFzQXR0cih1bnNpZ25lZCBJZHgsIEF0dHJpYnV0ZXMgQXR0cikgY29uc3QgeworICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKElkeCkgJiBBdHRyOworICB9CisKKyAgLy8vIGdldFBhcmFtQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBhbGlnbm1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24KKyAgLy8vIHBhcmFtZXRlci4KKyAgdW5zaWduZWQgZ2V0UGFyYW1BbGlnbm1lbnQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZTo6Z2V0QWxpZ25tZW50RnJvbUF0dHJzKGdldEF0dHJpYnV0ZXMoSWR4KSk7CisgIH0KKworICAvLy8gaGFzQXR0clNvbWV3aGVyZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGlzIHNldCBmb3IgYXQKKyAgLy8vIGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgZm9yIHRoZSByZXR1cm4gdmFsdWUuCisgIGJvb2wgaGFzQXR0clNvbWV3aGVyZShBdHRyaWJ1dGVzIEF0dHIpIGNvbnN0OworCisgIC8vLyBvcGVyYXRvcj09LyE9IC0gUHJvdmlkZSBlcXVhbGl0eSBwcmVkaWNhdGVzLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQXR0ckxpc3RQdHIgJlJIUykgY29uc3QKKyAgeyByZXR1cm4gQXR0ckxpc3QgPT0gUkhTLkF0dHJMaXN0OyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBdHRyTGlzdFB0ciAmUkhTKSBjb25zdAorICB7IHJldHVybiBBdHRyTGlzdCAhPSBSSFMuQXR0ckxpc3Q7IH0KKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQXR0cmlidXRlIExpc3QgSW50cm9zcGVjdGlvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gZ2V0UmF3UG9pbnRlciAtIFJldHVybiBhIHJhdyBwb2ludGVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzCisgIC8vLyBhdHRyaWJ1dGUgbGlzdC4KKyAgdm9pZCAqZ2V0UmF3UG9pbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0ckxpc3Q7CisgIH0KKworICAvLyBBdHRyaWJ1dGVzIGFyZSBzdG9yZWQgYXMgYSBkZW5zZSBzZXQgb2Ygc2xvdHMsIHdoZXJlIHRoZXJlIGlzIG9uZQorICAvLyBzbG90IGZvciBlYWNoIGFyZ3VtZW50IHRoYXQgaGFzIGFuIGF0dHJpYnV0ZS4gIFRoaXMgYWxsb3dzIHdhbGtpbmcgb3ZlciB0aGUKKyAgLy8gZGVuc2Ugc2V0IGluc3RlYWQgb2Ygd2Fsa2luZyB0aGUgc3BhcnNlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKworICAvLy8gaXNFbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzLgorICAvLy8KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBBdHRyTGlzdCA9PSAwOworICB9CisKKyAgLy8vIGdldE51bVNsb3RzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2xvdHMgdXNlZCBpbiB0aGlzIGF0dHJpYnV0ZSBsaXN0LgorICAvLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IGhhdmUgYW4gYXR0cmlidXRlIHNldCBvbiB0aGVtCisgIC8vLyAoaW5jbHVkaW5nIHRoZSBmdW5jdGlvbiBpdHNlbGYpLgorICB1bnNpZ25lZCBnZXROdW1TbG90cygpIGNvbnN0OworCisgIC8vLyBnZXRTbG90IC0gUmV0dXJuIHRoZSBBdHRyaWJ1dGVXaXRoSW5kZXggYXQgdGhlIHNwZWNpZmllZCBzbG90LiAgVGhpcworICAvLy8gaG9sZHMgYSBpbmRleCBudW1iZXIgcGx1cyBhIHNldCBvZiBhdHRyaWJ1dGVzLgorICBjb25zdCBBdHRyaWJ1dGVXaXRoSW5kZXggJmdldFNsb3QodW5zaWduZWQgU2xvdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGV4cGxpY2l0IEF0dHJMaXN0UHRyKEF0dHJpYnV0ZUxpc3RJbXBsICpMKTsKKworICAvLy8gZ2V0QXR0cmlidXRlcyAtIFRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGFyZQorICAvLy8gcmV0dXJuZWQuICBBdHRyaWJ1dGVzIGZvciB0aGUgcmVzdWx0IGFyZSBkZW5vdGVkIHdpdGggSWR4ID0gMC4KKyAgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKHVuc2lnbmVkIElkeCkgY29uc3Q7CisKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0F1dG9VcGdyYWRlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQXV0b1VwZ3JhZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTgxYzgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0F1dG9VcGdyYWRlLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tLSBsbHZtL0F1dG9VcGdyYWRlLmggLSBBdXRvVXBncmFkZSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhlc2UgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBieSBsaWIvVk1Db3JlL0F1dG9VcGdyYWRlLmNwcC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQVVUT1VQR1JBREVfSAorI2RlZmluZSBMTFZNX0FVVE9VUEdSQURFX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNb2R1bGU7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBDYWxsSW5zdDsKKworICAvLy8gVGhpcyBpcyBhIG1vcmUgZ3JhbnVsYXIgZnVuY3Rpb24gdGhhdCBzaW1wbHkgY2hlY2tzIGFuIGludHJpbnNpYyBmdW5jdGlvbiAKKyAgLy8vIGZvciB1cGdyYWRpbmcsIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgcmVxdWlyZXMgdXBncmFkaW5nLiBJdCBtYXkgcmV0dXJuCisgIC8vLyBudWxsIGluIE5ld0ZuIGlmIHRoZSBhbGwgY2FsbHMgdG8gdGhlIG9yaWdpbmFsIGludHJpbnNpYyBmdW5jdGlvbgorICAvLy8gc2hvdWxkIGJlIHRyYW5zZm9ybWVkIHRvIG5vbi1mdW5jdGlvbi1jYWxsIGluc3RydWN0aW9ucy4KKyAgYm9vbCBVcGdyYWRlSW50cmluc2ljRnVuY3Rpb24oRnVuY3Rpb24gKkYsIEZ1bmN0aW9uIComTmV3Rm4pOworCisgIC8vLyBUaGlzIGlzIHRoZSBjb21wbGVtZW50IHRvIHRoZSBhYm92ZSwgcmVwbGFjaW5nIGEgc3BlY2lmaWMgY2FsbCB0byBhbiAKKyAgLy8vIGludHJpbnNpYyBmdW5jdGlvbiB3aXRoIGEgY2FsbCB0byB0aGUgc3BlY2lmaWVkIG5ldyBmdW5jdGlvbi4KKyAgdm9pZCBVcGdyYWRlSW50cmluc2ljQ2FsbChDYWxsSW5zdCAqQ0ksIEZ1bmN0aW9uICpOZXdGbik7CisgIAorICAvLy8gVGhpcyBpcyBhbiBhdXRvLXVwZ3JhZGUgaG9vayBmb3IgYW55IG9sZCBpbnRyaW5zaWMgZnVuY3Rpb24gc3ludGF4ZXMgCisgIC8vLyB3aGljaCBuZWVkIHRvIGhhdmUgYm90aCB0aGUgZnVuY3Rpb24gdXBkYXRlZCBhcyB3ZWxsIGFzIGFsbCBjYWxscyB1cGRhdGVkIAorICAvLy8gdG8gdGhlIG5ldyBmdW5jdGlvbi4gVGhpcyBzaG91bGQgb25seSBiZSBydW4gaW4gYSBwb3N0LXByb2Nlc3NpbmcgZmFzaGlvbiAKKyAgLy8vIHNvIHRoYXQgaXQgY2FuIHVwZGF0ZSBhbGwgY2FsbHMgdG8gdGhlIG9sZCBmdW5jdGlvbi4KKyAgdm9pZCBVcGdyYWRlQ2FsbHNUb0ludHJpbnNpYyhGdW5jdGlvbiogRik7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGRlYnVnIGluZm8gaW50cmluc2ljcy4gSWYgYW4gaW50cmluc2ljIGlzIGludmFsaWQKKyAgLy8vIHRoZW4gdGhpcyBmdW5jdGlvbiBzaW1wbHkgcmVtb3ZlcyB0aGUgaW50cmluc2ljLiAKKyAgdm9pZCBDaGVja0RlYnVnSW5mb0ludHJpbnNpY3MoTW9kdWxlICpNKTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0Jhc2ljQmxvY2suaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CYXNpY0Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyYTRhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CYXNpY0Jsb2NrLmgKQEAgLTAsMCArMSwyNjkgQEAKKy8vPT09LS0gbGx2bS9CYXNpY0Jsb2NrLmggLSBSZXByZXNlbnQgYSBiYXNpYyBibG9jayBpbiB0aGUgVk0gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgQmFzaWNCbG9jayBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQkFTSUNCTE9DS19ICisjZGVmaW5lIExMVk1fQkFTSUNCTE9DS19ICisKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVGVybWluYXRvckluc3Q7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIEJsb2NrQWRkcmVzczsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgaWxpc3RfdHJhaXRzPEluc3RydWN0aW9uPgorICA6IHB1YmxpYyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8SW5zdHJ1Y3Rpb24sIEJhc2ljQmxvY2s+IHsKKyAgLy8gY3JlYXRlU2VudGluZWwgaXMgdXNlZCB0byBnZXQgaG9sZCBvZiBhIG5vZGUgdGhhdCBtYXJrcyB0aGUgZW5kIG9mCisgIC8vIHRoZSBsaXN0Li4uCisgIC8vIFRoZSBzZW50aW5lbCBpcyByZWxhdGl2ZSB0byB0aGlzIGluc3RhbmNlLCBzbyB3ZSB1c2UgYSBub24tc3RhdGljCisgIC8vIG1ldGhvZC4KKyAgSW5zdHJ1Y3Rpb24gKmNyZWF0ZVNlbnRpbmVsKCkgY29uc3QgeworICAgIC8vIHNpbmNlIGkocClsaXN0cyBhbHdheXMgcHVibGljbHkgZGVyaXZlIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyB0cmFpdHMsIHBsYWNpbmcgYSBkYXRhIG1lbWJlciBpbiB0aGlzIGNsYXNzIHdpbGwgYXVnbWVudCBpKHApbGlzdC4KKyAgICAvLyBCdXQgc2luY2UgdGhlIE5vZGVUeSBpcyBleHBlY3RlZCB0byBwdWJsaWNseSBkZXJpdmUgZnJvbQorICAgIC8vIGlsaXN0X25vZGU8Tm9kZVR5PiwgdGhlcmUgaXMgYSBsZWdhbCB2aWFibGUgZG93bmNhc3QgZnJvbSBpdAorICAgIC8vIHRvIE5vZGVUeS4gV2UgdXNlIHRoaXMgdHJpY2sgdG8gc3VwZXJwb3NlIGkocClsaXN0IHdpdGggYSAiZ2hvc3RseSIKKyAgICAvLyBOb2RlVHksIHdoaWNoIGJlY29tZXMgdGhlIHNlbnRpbmVsLiBEZXJlZmVyZW5jaW5nIHRoZSBzZW50aW5lbCBpcworICAgIC8vIGZvcmJpZGRlbiAoc2F2ZSB0aGUgaWxpc3Rfbm9kZTxOb2RlVHk+KSBzbyBubyBvbmUgd2lsbCBldmVyIG5vdGljZQorICAgIC8vIHRoZSBzdXBlcnBvc2l0aW9uLgorICAgIHJldHVybiBzdGF0aWNfY2FzdDxJbnN0cnVjdGlvbio+KCZTZW50aW5lbCk7CisgIH0KKyAgc3RhdGljIHZvaWQgZGVzdHJveVNlbnRpbmVsKEluc3RydWN0aW9uKikge30KKworICBJbnN0cnVjdGlvbiAqcHJvdmlkZUluaXRpYWxIZWFkKCkgY29uc3QgeyByZXR1cm4gY3JlYXRlU2VudGluZWwoKTsgfQorICBJbnN0cnVjdGlvbiAqZW5zdXJlSGVhZChJbnN0cnVjdGlvbiopIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7IH0KKyAgc3RhdGljIHZvaWQgbm90ZUhlYWQoSW5zdHJ1Y3Rpb24qLCBJbnN0cnVjdGlvbiopIHt9Citwcml2YXRlOgorICBtdXRhYmxlIGlsaXN0X2hhbGZfbm9kZTxJbnN0cnVjdGlvbj4gU2VudGluZWw7Cit9OworCisvLy8gVGhpcyByZXByZXNlbnRzIGEgc2luZ2xlIGJhc2ljIGJsb2NrIGluIExMVk0uIEEgYmFzaWMgYmxvY2sgaXMgc2ltcGx5IGEKKy8vLyBjb250YWluZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgZXhlY3V0ZSBzZXF1ZW50aWFsbHkuIEJhc2ljIGJsb2NrcyBhcmUgVmFsdWVzCisvLy8gYmVjYXVzZSB0aGV5IGFyZSByZWZlcmVuY2VkIGJ5IGluc3RydWN0aW9ucyBzdWNoIGFzIGJyYW5jaGVzIGFuZCBzd2l0Y2gKKy8vLyB0YWJsZXMuIFRoZSB0eXBlIG9mIGEgQmFzaWNCbG9jayBpcyAiVHlwZTo6TGFiZWxUeSIgYmVjYXVzZSB0aGUgYmFzaWMgYmxvY2sKKy8vLyByZXByZXNlbnRzIGEgbGFiZWwgdG8gd2hpY2ggYSBicmFuY2ggY2FuIGp1bXAuCisvLy8KKy8vLyBBIHdlbGwgZm9ybWVkIGJhc2ljIGJsb2NrIGlzIGZvcm1lZCBvZiBhIGxpc3Qgb2Ygbm9uLXRlcm1pbmF0aW5nIAorLy8vIGluc3RydWN0aW9ucyBmb2xsb3dlZCBieSBhIHNpbmdsZSBUZXJtaW5hdG9ySW5zdCBpbnN0cnVjdGlvbi4gIAorLy8vIFRlcm1pbmF0b3JJbnN0J3MgbWF5IG5vdCBvY2N1ciBpbiB0aGUgbWlkZGxlIG9mIGJhc2ljIGJsb2NrcywgYW5kIG11c3QgCisvLy8gdGVybWluYXRlIHRoZSBibG9ja3MuIFRoZSBCYXNpY0Jsb2NrIGNsYXNzIGFsbG93cyBtYWxmb3JtZWQgYmFzaWMgYmxvY2tzIHRvCisvLy8gb2NjdXIgYmVjYXVzZSBpdCBtYXkgYmUgdXNlZnVsIGluIHRoZSBpbnRlcm1lZGlhdGUgc3RhZ2Ugb2YgY29uc3RydWN0aW5nIG9yCisvLy8gbW9kaWZ5aW5nIGEgcHJvZ3JhbS4gSG93ZXZlciwgdGhlIHZlcmlmaWVyIHdpbGwgZW5zdXJlIHRoYXQgYmFzaWMgYmxvY2tzCisvLy8gYXJlICJ3ZWxsIGZvcm1lZCIuCisvLy8gQGJyaWVmIExMVk0gQmFzaWMgQmxvY2sgUmVwcmVzZW50YXRpb24KK2NsYXNzIEJhc2ljQmxvY2sgOiBwdWJsaWMgVmFsdWUsIC8vIEJhc2ljIGJsb2NrcyBhcmUgZGF0YSBvYmplY3RzIGFsc28KKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgaWxpc3Rfbm9kZTxCYXNpY0Jsb2NrPiB7CisgIGZyaWVuZCBjbGFzcyBCbG9ja0FkZHJlc3M7CitwdWJsaWM6CisgIHR5cGVkZWYgaXBsaXN0PEluc3RydWN0aW9uPiBJbnN0TGlzdFR5cGU7Citwcml2YXRlOgorICBJbnN0TGlzdFR5cGUgSW5zdExpc3Q7CisgIEZ1bmN0aW9uICpQYXJlbnQ7CisKKyAgdm9pZCBzZXRQYXJlbnQoRnVuY3Rpb24gKnBhcmVudCk7CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8QmFzaWNCbG9jaywgRnVuY3Rpb24+OworCisgIEJhc2ljQmxvY2soY29uc3QgQmFzaWNCbG9jayAmKTsgICAgIC8vIERvIG5vdCBpbXBsZW1lbnQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQmFzaWNCbG9jayAmKTsgLy8gRG8gbm90IGltcGxlbWVudAorCisgIC8vLyBCYXNpY0Jsb2NrIGN0b3IgLSBJZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgdGhlIGJhc2ljIGJsb2NrCisgIC8vLyBpcyBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGF0IGVpdGhlciB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAoaWYKKyAgLy8vIEluc2VydEJlZm9yZSBpcyBudWxsKSwgb3IgYmVmb3JlIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2suCisgIC8vLworICBleHBsaWNpdCBCYXNpY0Jsb2NrKExMVk1Db250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICpQYXJlbnQgPSAwLCBCYXNpY0Jsb2NrICpJbnNlcnRCZWZvcmUgPSAwKTsKK3B1YmxpYzoKKyAgLy8vIGdldENvbnRleHQgLSBHZXQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhpcyBiYXNpYyBibG9jayBsaXZlcy4KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdDsKKyAgCisgIC8vLyBJbnN0cnVjdGlvbiBpdGVyYXRvcnMuLi4KKyAgdHlwZWRlZiBJbnN0TGlzdFR5cGU6Oml0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgIHR5cGVkZWYgSW5zdExpc3RUeXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBDcmVhdGUgLSBDcmVhdGVzIGEgbmV3IEJhc2ljQmxvY2suIElmIHRoZSBQYXJlbnQgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwKKyAgLy8vIHRoZSBiYXNpYyBibG9jayBpcyBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGF0IGVpdGhlciB0aGUgZW5kIG9mIHRoZQorICAvLy8gZnVuY3Rpb24gKGlmIEluc2VydEJlZm9yZSBpcyAwKSwgb3IgYmVmb3JlIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2suCisgIHN0YXRpYyBCYXNpY0Jsb2NrICpDcmVhdGUoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gKlBhcmVudCA9IDAsQmFzaWNCbG9jayAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIHJldHVybiBuZXcgQmFzaWNCbG9jayhDb250ZXh0LCBQYXJlbnQsIEluc2VydEJlZm9yZSk7CisgIH0KKyAgfkJhc2ljQmxvY2soKTsKKworICAvLy8gZ2V0UGFyZW50IC0gUmV0dXJuIHRoZSBlbmNsb3NpbmcgbWV0aG9kLCBvciBudWxsIGlmIG5vbmUKKyAgLy8vCisgIGNvbnN0IEZ1bmN0aW9uICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKyAgICAgICAgRnVuY3Rpb24gKmdldFBhcmVudCgpICAgICAgIHsgcmV0dXJuIFBhcmVudDsgfQorCisgIC8vLyB1c2VfYmFjayAtIFNwZWNpYWxpemUgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiBWYWx1ZSwgYXMgd2Uga25vdyB0aGF0IGFuCisgIC8vLyBCYXNpY0Jsb2NrIGNhbiBvbmx5IGJlIHVzZWQgYnkgVXNlcnMgKHNwZWNpZmljYWxseSBQSEkgbm9kZXMsIHRlcm1pbmF0b3JzLAorICAvLy8gYW5kIEJsb2NrQWRkcmVzcydzKS4KKyAgVXNlciAgICAgICAqdXNlX2JhY2soKSAgICAgICB7IHJldHVybiBjYXN0PFVzZXI+KCp1c2VfYmVnaW4oKSk7fQorICBjb25zdCBVc2VyICp1c2VfYmFjaygpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8VXNlcj4oKnVzZV9iZWdpbigpKTt9CisgIAorICAvLy8gZ2V0VGVybWluYXRvcigpIC0gSWYgdGhpcyBpcyBhIHdlbGwgZm9ybWVkIGJhc2ljIGJsb2NrLCB0aGVuIHRoaXMgcmV0dXJucworICAvLy8gYSBwb2ludGVyIHRvIHRoZSB0ZXJtaW5hdG9yIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgbm90LCB0aGVuIHlvdSBnZXQgYQorICAvLy8gbnVsbCBwb2ludGVyIGJhY2suCisgIC8vLworICBUZXJtaW5hdG9ySW5zdCAqZ2V0VGVybWluYXRvcigpOworICBjb25zdCBUZXJtaW5hdG9ySW5zdCAqZ2V0VGVybWluYXRvcigpIGNvbnN0OworICAKKyAgLy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBpbnN0cnVjdG9uIGluIHRoaXMgYmxvY2sgdGhhdCBpcyBub3QgYSAKKyAgLy8vIFBISU5vZGUgaW5zdHJ1Y3Rpb24uIFdoZW4gYWRkaW5nIGluc3RydWN0aW9uIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIC8vLyBiYXNpYyBibG9jaywgdGhleSBzaG91bGQgYmUgYWRkZWQgYmVmb3JlIHRoZSByZXR1cm5lZCB2YWx1ZSwgbm90IGJlZm9yZQorICAvLy8gdGhlIGZpcnN0IGluc3RydWN0aW9uLCB3aGljaCBtaWdodCBiZSBQSEkuCisgIC8vLyBSZXR1cm5zIDAgaXMgdGhlcmUncyBubyBub24tUEhJIGluc3RydWN0aW9uLgorICBJbnN0cnVjdGlvbiogZ2V0Rmlyc3ROb25QSEkoKTsKKyAgY29uc3QgSW5zdHJ1Y3Rpb24qIGdldEZpcnN0Tm9uUEhJKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEJhc2ljQmxvY2sqPih0aGlzKS0+Z2V0Rmlyc3ROb25QSEkoKTsKKyAgfQorCisgIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCBhbHNvIHNraXAgZGVidWcgaW50cmluc2ljcy4KKyAgSW5zdHJ1Y3Rpb24qIGdldEZpcnN0Tm9uUEhJT3JEYmcoKTsKKyAgY29uc3QgSW5zdHJ1Y3Rpb24qIGdldEZpcnN0Tm9uUEhJT3JEYmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QmFzaWNCbG9jayo+KHRoaXMpLT5nZXRGaXJzdE5vblBISU9yRGJnKCk7CisgIH0KKyAgCisgIC8vLyByZW1vdmVGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZworICAvLy8gZnVuY3Rpb24sIGJ1dCBkb2VzIG5vdCBkZWxldGUgaXQuCisgIC8vLworICB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gZXJhc2VGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBmdW5jdGlvbgorICAvLy8gYW5kIGRlbGV0ZXMgaXQuCisgIC8vLworICB2b2lkIGVyYXNlRnJvbVBhcmVudCgpOworICAKKyAgLy8vIG1vdmVCZWZvcmUgLSBVbmxpbmsgdGhpcyBiYXNpYyBibG9jayBmcm9tIGl0cyBjdXJyZW50IGZ1bmN0aW9uIGFuZAorICAvLy8gaW5zZXJ0IGl0IGludG8gdGhlIGZ1bmN0aW9uIHRoYXQgTW92ZVBvcyBsaXZlcyBpbiwgcmlnaHQgYmVmb3JlIE1vdmVQb3MuCisgIHZvaWQgbW92ZUJlZm9yZShCYXNpY0Jsb2NrICpNb3ZlUG9zKTsKKyAgCisgIC8vLyBtb3ZlQWZ0ZXIgLSBVbmxpbmsgdGhpcyBiYXNpYyBibG9jayBmcm9tIGl0cyBjdXJyZW50IGZ1bmN0aW9uIGFuZAorICAvLy8gaW5zZXJ0IGl0IGludG8gdGhlIGZ1bmN0aW9uIHRoYXQgTW92ZVBvcyBsaXZlcyBpbiwgcmlnaHQgYWZ0ZXIgTW92ZVBvcy4KKyAgdm9pZCBtb3ZlQWZ0ZXIoQmFzaWNCbG9jayAqTW92ZVBvcyk7CisgIAorCisgIC8vLyBnZXRTaW5nbGVQcmVkZWNlc3NvciAtIElmIHRoaXMgYmFzaWMgYmxvY2sgaGFzIGEgc2luZ2xlIHByZWRlY2Vzc29yIGJsb2NrLAorICAvLy8gcmV0dXJuIHRoZSBibG9jaywgb3RoZXJ3aXNlIHJldHVybiBhIG51bGwgcG9pbnRlci4KKyAgQmFzaWNCbG9jayAqZ2V0U2luZ2xlUHJlZGVjZXNzb3IoKTsKKyAgY29uc3QgQmFzaWNCbG9jayAqZ2V0U2luZ2xlUHJlZGVjZXNzb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QmFzaWNCbG9jayo+KHRoaXMpLT5nZXRTaW5nbGVQcmVkZWNlc3NvcigpOworICB9CisKKyAgLy8vIGdldFVuaXF1ZVByZWRlY2Vzc29yIC0gSWYgdGhpcyBiYXNpYyBibG9jayBoYXMgYSB1bmlxdWUgcHJlZGVjZXNzb3IgYmxvY2ssCisgIC8vLyByZXR1cm4gdGhlIGJsb2NrLCBvdGhlcndpc2UgcmV0dXJuIGEgbnVsbCBwb2ludGVyLgorICAvLy8gTm90ZSB0aGF0IHVuaXF1ZSBwcmVkZWNlc3NvciBkb2Vzbid0IG1lYW4gc2luZ2xlIGVkZ2UsIHRoZXJlIGNhbiBiZSAKKyAgLy8vIG11bHRpcGxlIGVkZ2VzIGZyb20gdGhlIHVuaXF1ZSBwcmVkZWNlc3NvciB0byB0aGlzIGJsb2NrIChmb3IgZXhhbXBsZSAKKyAgLy8vIGEgc3dpdGNoIHN0YXRlbWVudCB3aXRoIG11bHRpcGxlIGNhc2VzIGhhdmluZyB0aGUgc2FtZSBkZXN0aW5hdGlvbikuCisgIEJhc2ljQmxvY2sgKmdldFVuaXF1ZVByZWRlY2Vzc29yKCk7CisgIGNvbnN0IEJhc2ljQmxvY2sgKmdldFVuaXF1ZVByZWRlY2Vzc29yKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEJhc2ljQmxvY2sqPih0aGlzKS0+Z2V0VW5pcXVlUHJlZGVjZXNzb3IoKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gSW5zdHJ1Y3Rpb24gaXRlcmF0b3IgbWV0aG9kcworICAvLy8KKyAgaW5saW5lIGl0ZXJhdG9yICAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgeyByZXR1cm4gSW5zdExpc3QuYmVnaW4oKTsgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgICAgICAgICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBJbnN0TGlzdC5iZWdpbigpOyB9CisgIGlubGluZSBpdGVyYXRvciAgICAgICAgICAgICAgICBlbmQgICgpICAgICAgIHsgcmV0dXJuIEluc3RMaXN0LmVuZCgpOyAgIH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gSW5zdExpc3QuZW5kKCk7ICAgfQorCisgIGlubGluZSBzaXplX3QgICAgICAgICAgICAgICAgICAgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEluc3RMaXN0LnNpemUoKTsgIH0KKyAgaW5saW5lIGJvb2wgICAgICAgICAgICAgICAgICAgIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gSW5zdExpc3QuZW1wdHkoKTsgfQorICBpbmxpbmUgY29uc3QgSW5zdHJ1Y3Rpb24gICAgICAmZnJvbnQoKSBjb25zdCB7IHJldHVybiBJbnN0TGlzdC5mcm9udCgpOyB9CisgIGlubGluZSAgICAgICBJbnN0cnVjdGlvbiAgICAgICZmcm9udCgpICAgICAgIHsgcmV0dXJuIEluc3RMaXN0LmZyb250KCk7IH0KKyAgaW5saW5lIGNvbnN0IEluc3RydWN0aW9uICAgICAgICZiYWNrKCkgY29uc3QgeyByZXR1cm4gSW5zdExpc3QuYmFjaygpOyAgfQorICBpbmxpbmUgICAgICAgSW5zdHJ1Y3Rpb24gICAgICAgJmJhY2soKSAgICAgICB7IHJldHVybiBJbnN0TGlzdC5iYWNrKCk7ICB9CisKKyAgLy8vIGdldEluc3RMaXN0KCkgLSBSZXR1cm4gdGhlIHVuZGVybHlpbmcgaW5zdHJ1Y3Rpb24gbGlzdCBjb250YWluZXIuICBZb3UKKyAgLy8vIG5lZWQgdG8gYWNjZXNzIGl0IGRpcmVjdGx5IGlmIHlvdSB3YW50IHRvIG1vZGlmeSBpdCBjdXJyZW50bHkuCisgIC8vLworICBjb25zdCBJbnN0TGlzdFR5cGUgJmdldEluc3RMaXN0KCkgY29uc3QgeyByZXR1cm4gSW5zdExpc3Q7IH0KKyAgICAgICAgSW5zdExpc3RUeXBlICZnZXRJbnN0TGlzdCgpICAgICAgIHsgcmV0dXJuIEluc3RMaXN0OyB9CisKKyAgLy8vIGdldFN1Ymxpc3RBY2Nlc3MoKSAtIHJldHVybnMgcG9pbnRlciB0byBtZW1iZXIgb2YgaW5zdHJ1Y3Rpb24gbGlzdAorICBzdGF0aWMgaXBsaXN0PEluc3RydWN0aW9uPiBCYXNpY0Jsb2NrOjoqZ2V0U3VibGlzdEFjY2VzcyhJbnN0cnVjdGlvbiopIHsKKyAgICByZXR1cm4gJkJhc2ljQmxvY2s6Okluc3RMaXN0OworICB9CisKKyAgLy8vIGdldFZhbHVlU3ltYm9sVGFibGUoKSAtIHJldHVybnMgcG9pbnRlciB0byBzeW1ib2wgdGFibGUgKGlmIGFueSkKKyAgVmFsdWVTeW1ib2xUYWJsZSAqZ2V0VmFsdWVTeW1ib2xUYWJsZSgpOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBCYXNpY0Jsb2NrICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpCYXNpY0Jsb2NrVmFsOworICB9CisKKyAgLy8vIGRyb3BBbGxSZWZlcmVuY2VzKCkgLSBUaGlzIGZ1bmN0aW9uIGNhdXNlcyBhbGwgdGhlIHN1Ymluc3RydWN0aW9ucyB0byAibGV0CisgIC8vLyBnbyIgb2YgYWxsIHJlZmVyZW5jZXMgdGhhdCB0aGV5IGFyZSBtYWludGFpbmluZy4gIFRoaXMgYWxsb3dzIG9uZSB0bworICAvLy8gJ2RlbGV0ZScgYSB3aG9sZSBjbGFzcyBhdCBhIHRpbWUsIGV2ZW4gdGhvdWdoIHRoZXJlIG1heSBiZSBjaXJjdWxhcgorICAvLy8gcmVmZXJlbmNlcy4uLiBmaXJzdCBhbGwgcmVmZXJlbmNlcyBhcmUgZHJvcHBlZCwgYW5kIGFsbCB1c2UgY291bnRzIGdvIHRvCisgIC8vLyB6ZXJvLiAgVGhlbiBldmVyeXRoaW5nIGlzIGRlbGV0ZSdkIGZvciByZWFsLiAgTm90ZSB0aGF0IG5vIG9wZXJhdGlvbnMgYXJlCisgIC8vLyB2YWxpZCBvbiBhbiBvYmplY3QgdGhhdCBoYXMgImRyb3BwZWQgYWxsIHJlZmVyZW5jZXMiLCBleGNlcHQgb3BlcmF0b3IKKyAgLy8vIGRlbGV0ZS4KKyAgLy8vCisgIHZvaWQgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKworICAvLy8gcmVtb3ZlUHJlZGVjZXNzb3IgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIG5vdGlmeSBhIEJhc2ljQmxvY2sgdGhhdCB0aGUKKyAgLy8vIHNwZWNpZmllZCBQcmVkZWNlc3NvciBvZiB0aGUgYmxvY2sgaXMgbm8gbG9uZ2VyIGFibGUgdG8gcmVhY2ggaXQuICBUaGlzIGlzCisgIC8vLyBhY3R1YWxseSBub3QgdXNlZCB0byB1cGRhdGUgdGhlIFByZWRlY2Vzc29yIGxpc3QsIGJ1dCBpcyBhY3R1YWxseSB1c2VkIHRvCisgIC8vLyB1cGRhdGUgdGhlIFBISSBub2RlcyB0aGF0IHJlc2lkZSBpbiB0aGUgYmxvY2suICBOb3RlIHRoYXQgdGhpcyBzaG91bGQgYmUKKyAgLy8vIGNhbGxlZCB3aGlsZSB0aGUgcHJlZGVjZXNzb3Igc3RpbGwgcmVmZXJzIHRvIHRoaXMgYmxvY2suCisgIC8vLworICB2b2lkIHJlbW92ZVByZWRlY2Vzc29yKEJhc2ljQmxvY2sgKlByZWQsIGJvb2wgRG9udERlbGV0ZVVzZWxlc3NQSElzID0gZmFsc2UpOworCisgIC8vLyBzcGxpdEJhc2ljQmxvY2sgLSBUaGlzIHNwbGl0cyBhIGJhc2ljIGJsb2NrIGludG8gdHdvIGF0IHRoZSBzcGVjaWZpZWQKKyAgLy8vIGluc3RydWN0aW9uLiAgTm90ZSB0aGF0IGFsbCBpbnN0cnVjdGlvbnMgQkVGT1JFIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKKyAgLy8vIHN0YXkgYXMgcGFydCBvZiB0aGUgb3JpZ2luYWwgYmFzaWMgYmxvY2ssIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIGlzIGFkZGVkCisgIC8vLyB0byB0aGUgb3JpZ2luYWwgQkIsIGFuZCB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBCQiBhcmUgbW92ZWQKKyAgLy8vIHRvIHRoZSBuZXcgQkIsIGluY2x1ZGluZyB0aGUgb2xkIHRlcm1pbmF0b3IuICBUaGUgbmV3bHkgZm9ybWVkIEJhc2ljQmxvY2sKKyAgLy8vIGlzIHJldHVybmVkLiAgVGhpcyBmdW5jdGlvbiBpbnZhbGlkYXRlcyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgb24gd2VsbCBmb3JtZWQgYmFzaWMgYmxvY2tzIChtdXN0IGhhdmUgYQorICAvLy8gdGVybWluYXRvciksIGFuZCAnSScgbXVzdCBub3QgYmUgdGhlIGVuZCBvZiBpbnN0cnVjdGlvbiBsaXN0ICh3aGljaCB3b3VsZAorICAvLy8gY2F1c2UgYSBkZWdlbmVyYXRlIGJhc2ljIGJsb2NrIHRvIGJlIGZvcm1lZCwgaGF2aW5nIGEgdGVybWluYXRvciBpbnNpZGUgb2YKKyAgLy8vIHRoZSBiYXNpYyBibG9jaykuCisgIC8vLworICAvLy8gQWxzbyBub3RlIHRoYXQgdGhpcyBkb2Vzbid0IHByZXNlcnZlIGFueSBwYXNzZXMuIFRvIHNwbGl0IGJsb2NrcyB3aGlsZQorICAvLy8ga2VlcGluZyBsb29wIGluZm9ybWF0aW9uIGNvbnNpc3RlbnQsIHVzZSB0aGUgU3BsaXRCbG9jayB1dGlsaXR5IGZ1bmN0aW9uLgorICAvLy8KKyAgQmFzaWNCbG9jayAqc3BsaXRCYXNpY0Jsb2NrKGl0ZXJhdG9yIEkpOworCisgIC8vLyBoYXNBZGRyZXNzVGFrZW4gLSByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSB1c2VzIG9mIHRoaXMgYmFzaWMgYmxvY2sKKyAgLy8vIG90aGVyIHRoYW4gZGlyZWN0IGJyYW5jaGVzLCBzd2l0Y2hlcywgZXRjLiB0byBpdC4KKyAgYm9vbCBoYXNBZGRyZXNzVGFrZW4oKSBjb25zdCB7IHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAhPSAwOyB9CisgICAgICAgICAgICAgICAgICAgICAKK3ByaXZhdGU6CisgIC8vLyBBZGp1c3RCbG9ja0FkZHJlc3NSZWZDb3VudCAtIEJhc2ljQmxvY2sgc3RvcmVzIHRoZSBudW1iZXIgb2YgQmxvY2tBZGRyZXNzCisgIC8vLyBvYmplY3RzIHVzaW5nIGl0LiAgVGhpcyBpcyBhbG1vc3QgYWx3YXlzIDAsIHNvbWV0aW1lcyBvbmUsIHBvc3NpYmx5IGJ1dAorICAvLy8gYWxtb3N0IG5ldmVyIDIsIGFuZCBpbmNvbmNlaXZhYmx5IDMgb3IgbW9yZS4KKyAgdm9pZCBBZGp1c3RCbG9ja0FkZHJlc3NSZWZDb3VudChpbnQgQW10KSB7CisgICAgc2V0VmFsdWVTdWJjbGFzc0RhdGEoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkrQW10KTsKKyAgICBhc3NlcnQoKGludCkoc2lnbmVkIGNoYXIpZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgPj0gMCAmJgorICAgICAgICAgICAiUmVmY291bnQgd3JhcC1hcm91bmQiKTsKKyAgfQorICAvLyBTaGFkb3cgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcgbWV0aG9kIHNvIHRoYXQKKyAgLy8gYW55IGZ1dHVyZSBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldFZhbHVlU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBWYWx1ZTo6c2V0VmFsdWVTdWJjbGFzc0RhdGEoRCk7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0JpdGNvZGUvQXJjaGl2ZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0JpdGNvZGUvQXJjaGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYTM3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQml0Y29kZS9BcmNoaXZlLmgKQEAgLTAsMCArMSw1NDggQEAKKy8vPT09LS0gbGx2bS9CaXRjb2RlL0FyY2hpdmUuaCAtIExMVk0gQml0Y29kZSBBcmNoaXZlIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyB0aGUgQXJjaGl2ZSBhbmQgQXJjaGl2ZU1lbWJlciBjbGFzc2VzIHRoYXQgcHJvdmlkZQorLy8gbWFuaXB1bGF0aW9uIG9mIExMVk0gQXJjaGl2ZSBmaWxlcy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCBieSB0aGUKKy8vIGxpYi9CaXRjb2RlL0FyY2hpdmUgbGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlCisvLyBhcmNoaXZlICgqLmEpIGZpbGVzIHRoYXQgY29udGFpbiBMTFZNIGJpdGNvZGUgZmlsZXMgKG9yIG90aGVycykuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJVENPREVfQVJDSElWRV9ICisjZGVmaW5lIExMVk1fQklUQ09ERV9BUkNISVZFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1BhdGguaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1lbW9yeUJ1ZmZlcjsKKworLy8gRm9yd2FyZCBkZWNsYXJlIGNsYXNzZXMKK2NsYXNzIE1vZHVsZTsgICAgICAgICAgICAgIC8vIEZyb20gVk1Db3JlCitjbGFzcyBBcmNoaXZlOyAgICAgICAgICAgICAvLyBEZWNsYXJlZCBiZWxvdworY2xhc3MgQXJjaGl2ZU1lbWJlckhlYWRlcjsgLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gY2xhc3MKK2NsYXNzIExMVk1Db250ZXh0OyAgICAgICAgIC8vIEdsb2JhbCBkYXRhCisKKy8vLyBUaGlzIGNsYXNzIGlzIHRoZSBtYWluIGNsYXNzIG1hbmlwdWxhdGVkIGJ5IHVzZXJzIG9mIHRoZSBBcmNoaXZlIGNsYXNzLiBJdAorLy8vIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBtZW1iZXIgb2YgdGhlIEFyY2hpdmUuIEl0IGlzIGFsc28gdGhlIGVsZW1lbnQKKy8vLyBzdG9yZWQgYnkgdGhlIEFyY2hpdmUncyBpbGlzdCwgdGhlIEFyY2hpdmUncyBtYWluIGFic3RyYWN0aW9uLiBCZWNhdXNlIG9mCisvLy8gdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIGFyY2hpdmUgZmlsZXMsIHVzZXJzIGFyZSBub3QgcGVybWl0dGVkIHRvCisvLy8gY29uc3RydWN0IEFyY2hpdmVNZW1iZXIgaW5zdGFuY2VzLiBZb3Ugc2hvdWxkIG9idGFpbiB0aGVtIGZyb20gdGhlIG1ldGhvZHMKKy8vLyBvZiB0aGUgQXJjaGl2ZSBjbGFzcyBpbnN0ZWFkLgorLy8vIEBicmllZiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGUgYXJjaGl2ZSBtZW1iZXIuCitjbGFzcyBBcmNoaXZlTWVtYmVyIDogcHVibGljIGlsaXN0X25vZGU8QXJjaGl2ZU1lbWJlcj4geworICAvLy8gQG5hbWUgVHlwZXMKKyAgLy8vIEB7CisgIHB1YmxpYzoKKyAgICAvLy8gVGhlc2UgZmxhZ3MgYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgYXJjaGl2ZSBtZW1iZXIgdG8gc3BlY2lmeSB2YXJpb3VzCisgICAgLy8vIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgbWVtYmVyLiBUaGUgdmFyaW91cyAiaXMiIG1ldGhvZHMgYmVsb3cgcHJvdmlkZQorICAgIC8vLyBhY2Nlc3MgdG8gdGhlIGZsYWdzLiBUaGUgZmxhZ3MgYXJlIG5vdCB1c2VyIHNldHRhYmxlLgorICAgIGVudW0gRmxhZ3MgeworICAgICAgQ29tcHJlc3NlZEZsYWcgPSAxLCAgICAgICAgICAvLy88IE1lbWJlciBpcyBhIG5vcm1hbCBjb21wcmVzc2VkIGZpbGUKKyAgICAgIFNWUjRTeW1ib2xUYWJsZUZsYWcgPSAyLCAgICAgLy8vPCBNZW1iZXIgaXMgYSBTVlI0IHN5bWJvbCB0YWJsZQorICAgICAgQlNENFN5bWJvbFRhYmxlRmxhZyA9IDQsICAgICAvLy88IE1lbWJlciBpcyBhIEJTRDQgc3ltYm9sIHRhYmxlCisgICAgICBMTFZNU3ltYm9sVGFibGVGbGFnID0gOCwgICAgIC8vLzwgTWVtYmVyIGlzIGFuIExMVk0gc3ltYm9sIHRhYmxlCisgICAgICBCaXRjb2RlRmxhZyA9IDE2LCAgICAgICAgICAgIC8vLzwgTWVtYmVyIGlzIGJpdGNvZGUKKyAgICAgIEhhc1BhdGhGbGFnID0gNjQsICAgICAgICAgICAgLy8vPCBNZW1iZXIgaGFzIGEgZnVsbCBvciBwYXJ0aWFsIHBhdGgKKyAgICAgIEhhc0xvbmdGaWxlbmFtZUZsYWcgPSAxMjgsICAgLy8vPCBNZW1iZXIgdXNlcyB0aGUgbG9uZyBmaWxlbmFtZSBzeW50YXgKKyAgICAgIFN0cmluZ1RhYmxlRmxhZyA9IDI1NiAgICAgICAgLy8vPCBNZW1iZXIgaXMgYW4gYXIoMSkgZm9ybWF0IHN0cmluZyB0YWJsZQorICAgIH07CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisgIHB1YmxpYzoKKyAgICAvLy8gQHJldHVybnMgdGhlIHBhcmVudCBBcmNoaXZlIGluc3RhbmNlCisgICAgLy8vIEBicmllZiBHZXQgdGhlIGFyY2hpdmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVtYmVyCisgICAgQXJjaGl2ZSogZ2V0QXJjaGl2ZSgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIHBhcmVudDsgfQorCisgICAgLy8vIEByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBBcmNoaXZlJ3MgZmlsZQorICAgIC8vLyBAYnJpZWYgR2V0IHRoZSBwYXRoIHRvIHRoZSBhcmNoaXZlIG1lbWJlcgorICAgIGNvbnN0IHN5czo6UGF0aCYgZ2V0UGF0aCgpIGNvbnN0ICAgICB7IHJldHVybiBwYXRoOyB9CisKKyAgICAvLy8gVGhlICJ1c2VyIiBpcyB0aGUgb3duZXIgb2YgdGhlIGZpbGUgcGVyIFVuaXggc2VjdXJpdHkuIFRoaXMgbWF5IG5vdAorICAgIC8vLyBoYXZlIGFueSBhcHBsaWNhYmlsaXR5IG9uIG5vbi1Vbml4IHN5c3RlbXMgYnV0IGlzIGEgcmVxdWlyZWQgY29tcG9uZW50CisgICAgLy8vIG9mIHRoZSAiYXIiIGZpbGUgZm9ybWF0LgorICAgIC8vLyBAYnJpZWYgR2V0IHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFyY2hpdmUgbWVtYmVyLgorICAgIHVuc2lnbmVkIGdldFVzZXIoKSBjb25zdCAgICAgICAgICAgICB7IHJldHVybiBpbmZvLmdldFVzZXIoKTsgfQorCisgICAgLy8vIFRoZSAiZ3JvdXAiIGlzIHRoZSBvd25pbmcgZ3JvdXAgb2YgdGhlIGZpbGUgcGVyIFVuaXggc2VjdXJpdHkuIFRoaXMKKyAgICAvLy8gbWF5IG5vdCBoYXZlIGFueSBhcHBsaWNhYmlsaXR5IG9uIG5vbi1Vbml4IHN5c3RlbXMgYnV0IGlzIGEgcmVxdWlyZWQKKyAgICAvLy8gY29tcG9uZW50IG9mIHRoZSAiYXIiIGZpbGUgZm9ybWF0LgorICAgIC8vLyBAYnJpZWYgR2V0IHRoZSBncm91cCBhc3NvY2lhdGVkIHdpdGggdGhpcyBhcmNoaXZlIG1lbWJlci4KKyAgICB1bnNpZ25lZCBnZXRHcm91cCgpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gaW5mby5nZXRHcm91cCgpOyB9CisKKyAgICAvLy8gVGhlICJtb2RlIiBzcGVjaWZpZXMgdGhlIGFjY2VzcyBwZXJtaXNzaW9ucyBmb3IgdGhlIGZpbGUgcGVyIFVuaXgKKyAgICAvLy8gc2VjdXJpdHkuIFRoaXMgbWF5IG5vdCBoYXZlIGFueSBhcHBsaWNhYmlpdHkgb24gbm9uLVVuaXggc3lzdGVtcyBidXQgaXMKKyAgICAvLy8gYSByZXF1aXJlZCBjb21wb25lbnQgb2YgdGhlICJhciIgZmlsZSBmb3JtYXQuCisgICAgLy8vIEBicmllZiBHZXQgdGhlIHBlcm1pc3Npb24gbW9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhcmNoaXZlIG1lbWJlci4KKyAgICB1bnNpZ25lZCBnZXRNb2RlKCkgY29uc3QgICAgICAgICAgICAgeyByZXR1cm4gaW5mby5nZXRNb2RlKCk7IH0KKworICAgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBhcmNoaXZlIG1lbWJlciB3YXMgbGFzdAorICAgIC8vLyBtb2RpZmllZCB3aGVuIGl0IHdhcyBub3QgaW4gdGhlIGFyY2hpdmUuCisgICAgLy8vIEBicmllZiBHZXQgdGhlIHRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24gb2YgdGhlIGFyY2hpdmUgbWVtYmVyLgorICAgIHN5czo6VGltZVZhbHVlIGdldE1vZFRpbWUoKSBjb25zdCAgICB7IHJldHVybiBpbmZvLmdldFRpbWVzdGFtcCgpOyB9CisKKyAgICAvLy8gQHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGFyY2hpdmUgbWVtYmVyIGluIGJ5dGVzLgorICAgIC8vLyBAYnJpZWYgR2V0IHRoZSBzaXplIG9mIHRoZSBhcmNoaXZlIG1lbWJlci4KKyAgICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgICAgICAgICAgICAgeyByZXR1cm4gaW5mby5nZXRTaXplKCk7IH0KKworICAgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBhcmNoaXZlIG1lbWJlciBhcyBpdAorICAgIC8vLyBhcHBlYXJzIG9uIGRpc2suIFRoaXMgaW5jbHVkZXMgdGhlIGZpbGUgY29udGVudCwgdGhlIGhlYWRlciwgdGhlCisgICAgLy8vIGxvbmcgZmlsZSBuYW1lIGlmIGFueSwgYW5kIHRoZSBwYWRkaW5nLgorICAgIC8vLyBAYnJpZWYgR2V0IHRvdGFsIG9uLWRpc2sgbWVtYmVyIHNpemUuCisgICAgdW5zaWduZWQgZ2V0TWVtYmVyU2l6ZSgpIGNvbnN0OworCisgICAgLy8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgaW4tbWVtb3J5IGNvbnRlbnQgb2YgdGhlCisgICAgLy8vIGFyY2hpdmUgbWVtYmVyLCBpZiBpdCBpcyBhdmFpbGFibGUuIElmIHRoZSBkYXRhIGhhcyBub3QgYmVlbiBsb2FkZWQKKyAgICAvLy8gaW50byBtZW1vcnksIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBudWxsLgorICAgIC8vLyBAcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1lbWJlcidzIGRhdGEuCisgICAgLy8vIEBicmllZiBHZXQgdGhlIGRhdGEgY29udGVudCBvZiB0aGUgYXJjaGl2ZSBtZW1iZXIKKyAgICBjb25zdCBjaGFyKiBnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gZGF0YTsgfQorCisgICAgLy8vIFRoaXMgbWV0aG9kIGRldGVybWluZXMgaWYgdGhlIG1lbWJlciBpcyBhIHJlZ3VsYXIgY29tcHJlc3NlZCBmaWxlLgorICAgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGUgYXJjaGl2ZSBtZW1iZXIgaXMgYSBjb21wcmVzc2VkIHJlZ3VsYXIgZmlsZS4KKyAgICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgbWVtYmVyIGlzIGEgY29tcHJlc3NlZCByZWd1bGFyIGZpbGUuCisgICAgYm9vbCBpc0NvbXByZXNzZWQoKSBjb25zdCB7IHJldHVybiBmbGFncyZDb21wcmVzc2VkRmxhZzsgfQorCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWZmIHRoZSBtZW1iZXIgaXMgYSBTVlI0IChub24tTExWTSkgc3ltYm9sIHRhYmxlCisgICAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBtZW1iZXIgaXMgYSBTVlI0IHN5bWJvbCB0YWJsZS4KKyAgICBib29sIGlzU1ZSNFN5bWJvbFRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmxhZ3MmU1ZSNFN5bWJvbFRhYmxlRmxhZzsgfQorCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWZmIHRoZSBtZW1iZXIgaXMgYSBCU0Q0LjQgKG5vbi1MTFZNKSBzeW1ib2wgdGFibGUKKyAgICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIG1lbWJlciBpcyBhIEJTRDQuNCBzeW1ib2wgdGFibGUuCisgICAgYm9vbCBpc0JTRDRTeW1ib2xUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzJkJTRDRTeW1ib2xUYWJsZUZsYWc7IH0KKworICAgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGUgYXJjaGl2ZSBtZW1iZXIgaXMgdGhlIExMVk0gc3ltYm9sIHRhYmxlCisgICAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBtZW1iZXIgaXMgdGhlIExMVk0gc3ltYm9sIHRhYmxlLgorICAgIGJvb2wgaXNMTFZNU3ltYm9sVGFibGUoKSBjb25zdCB7IHJldHVybiBmbGFncyZMTFZNU3ltYm9sVGFibGVGbGFnOyB9CisKKyAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIGFyY2hpdmUgbWVtYmVyIGlzIHRoZSBhcigxKSBzdHJpbmcgdGFibGUKKyAgICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIG1lbWJlciBpcyB0aGUgYXIoMSkgc3RyaW5nIHRhYmxlLgorICAgIGJvb2wgaXNTdHJpbmdUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzJlN0cmluZ1RhYmxlRmxhZzsgfQorCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWZmIHRoZSBhcmNoaXZlIG1lbWJlciBpcyBhIGJpdGNvZGUgZmlsZS4KKyAgICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIG1lbWJlciBpcyBhIGJpdGNvZGUgZmlsZS4KKyAgICBib29sIGlzQml0Y29kZSgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzJkJpdGNvZGVGbGFnOyB9CisKKyAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIGZpbGUgbmFtZSBjb250YWlucyBhIHBhdGggKGRpcmVjdG9yeSkgY29tcG9uZW50LgorICAgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBtZW1iZXIgaGFzIGEgcGF0aAorICAgIGJvb2wgaGFzUGF0aCgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzJkhhc1BhdGhGbGFnOyB9CisKKyAgICAvLy8gTG9uZyBmaWxlbmFtZXMgYXJlIGFuIGFydGlmYWN0IG9mIHRoZSBhcigxKSBmaWxlIGZvcm1hdCB3aGljaCBhbGxvd3MKKyAgICAvLy8gdXAgdG8gc2l4dGVlbiBjaGFyYWN0ZXJzIGluIGl0cyBoZWFkZXIgYW5kIGRvZXNuJ3QgYWxsb3cgYSBwYXRoCisgICAgLy8vIHNlcGFyYXRvciBjaGFyYWN0ZXIgKC8pLiBUbyBhdm9pZCB0aGlzLCBhICJsb25nIGZvcm1hdCIgbWVtYmVyIG5hbWUgaXMKKyAgICAvLy8gYWxsb3dlZCB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGlzIHJlc3RyaWN0aW9uLiBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIGlmCisgICAgLy8vIHRoYXQgImxvbmcgZm9ybWF0IiBpcyB1c2VkIGZvciB0aGlzIG1lbWJlci4KKyAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIGZpbGUgbmFtZSB1c2VzIHRoZSBsb25nIGZvcm0KKyAgICAvLy8gQGJyaWVmIERldGVybWluIGlmIHRoZSBtZW1iZXIgaGFzIGEgbG9uZyBmaWxlIG5hbWUKKyAgICBib29sIGhhc0xvbmdGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzJkhhc0xvbmdGaWxlbmFtZUZsYWc7IH0KKworICAgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzdGF0dXMgaW5mbyAobGlrZSBVbml4IHN0YXQoMikpIGZvciB0aGUgYXJjaGl2ZQorICAgIC8vLyBtZW1iZXIuIFRoZSBzdGF0dXMgaW5mbyBwcm92aWRlcyB0aGUgZmlsZSdzIHNpemUsIHBlcm1pc3Npb25zLCBhbmQKKyAgICAvLy8gbW9kaWZpY2F0aW9uIHRpbWUuIFRoZSBjb250ZW50cyBvZiB0aGUgUGF0aDo6U3RhdHVzSW5mbyBzdHJ1Y3R1cmUsIG90aGVyCisgICAgLy8vIHRoYW4gdGhlIHNpemUgYW5kIG1vZGlmaWNhdGlvbiB0aW1lLCBtYXkgbm90IGhhdmUgdXRpbGl0eSBvbiBub24tVW5peAorICAgIC8vLyBzeXN0ZW1zLgorICAgIC8vLyBAcmV0dXJucyB0aGUgc3RhdHVzIGluZm8gZm9yIHRoZSBhcmNoaXZlIG1lbWJlcgorICAgIC8vLyBAYnJpZWYgT2J0YWluIHRoZSBzdGF0dXMgaW5mbyBmb3IgdGhlIGFyY2hpdmUgbWVtYmVyCisgICAgY29uc3Qgc3lzOjpGaWxlU3RhdHVzICZnZXRGaWxlU3RhdHVzKCkgY29uc3QgeyByZXR1cm4gaW5mbzsgfQorCisgICAgLy8vIFRoaXMgbWV0aG9kIGNhdXNlcyB0aGUgYXJjaGl2ZSBtZW1iZXIgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgY29udGVudHMKKyAgICAvLy8gb2YgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IFxwIEZpbGUuIFRoZSBjb250ZW50cyBvZiBccCB0aGlzIHdpbGwgYmUKKyAgICAvLy8gdXBkYXRlZCB0byByZWZsZWN0IHRoZSBuZXcgZGF0YSBmcm9tIFxwIEZpbGUuIFRoZSBccCBGaWxlIG11c3QgZXhpc3QgYW5kCisgICAgLy8vIGJlIHJlYWRhYmxlIG9uIGVudHJ5IHRvIHRoaXMgbWV0aG9kLgorICAgIC8vLyBAcmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAvLy8gQGJyaWVmIFJlcGxhY2UgY29udGVudHMgb2YgYXJjaGl2ZSBtZW1iZXIgd2l0aCBhIG5ldyBmaWxlLgorICAgIGJvb2wgcmVwbGFjZVdpdGgoY29uc3Qgc3lzOjpQYXRoICZhRmlsZSwgc3RkOjpzdHJpbmcqIEVyck1zZyk7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBEYXRhCisgIC8vLyBAeworICBwcml2YXRlOgorICAgIEFyY2hpdmUqICAgICAgICAgICAgcGFyZW50OyAgIC8vLzwgUG9pbnRlciB0byBwYXJlbnQgYXJjaGl2ZQorICAgIHN5czo6UGF0aFdpdGhTdGF0dXMgcGF0aDsgICAgIC8vLzwgUGF0aCBvZiBmaWxlIGNvbnRhaW5pbmcgdGhlIG1lbWJlcgorICAgIHN5czo6RmlsZVN0YXR1cyAgICAgaW5mbzsgICAgIC8vLzwgU3RhdHVzIGluZm8gKHNpemUsbW9kZSxkYXRlKQorICAgIHVuc2lnbmVkICAgICAgICAgICAgZmxhZ3M7ICAgIC8vLzwgRmxhZ3MgYWJvdXQgdGhlIGFyY2hpdmUgbWVtYmVyCisgICAgY29uc3QgY2hhciogICAgICAgICBkYXRhOyAgICAgLy8vPCBEYXRhIGZvciB0aGUgbWVtYmVyCisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKyAgLy8vIEB7CisgIHB1YmxpYzoKKyAgICAvLy8gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgb25seSB1c2VkIGJ5IHRoZSBBcmNoaXZlJ3MgaXBsaXN0IHdoZW4gaXQKKyAgICAvLy8gY29uc3RydWN0cyB0aGUgbGlzdCdzIHNlbnRyeSBub2RlLgorICAgIEFyY2hpdmVNZW1iZXIoKTsKKworICBwcml2YXRlOgorICAgIC8vLyBVc2VkIGludGVybmFsbHkgYnkgdGhlIEFyY2hpdmUgY2xhc3MgdG8gY29uc3RydWN0IGFuIEFyY2hpdmVNZW1iZXIuCisgICAgLy8vIFRoZSBjb250ZW50cyBvZiB0aGUgQXJjaGl2ZU1lbWJlciBhcmUgZmlsbGVkIG91dCBieSB0aGUgQXJjaGl2ZSBjbGFzcy4KKyAgICBleHBsaWNpdCBBcmNoaXZlTWVtYmVyKEFyY2hpdmUgKlBBUik7CisKKyAgICAvLyBTbyBBcmNoaXZlIGNhbiBjb25zdHJ1Y3QgYW4gQXJjaGl2ZU1lbWJlcgorICAgIGZyaWVuZCBjbGFzcyBsbHZtOjpBcmNoaXZlOworICAvLy8gQH0KK307CisKKy8vLyBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byBMTFZNIEFyY2hpdmUgZmlsZXMuIFRoZSBBcmNoaXZlIGNsYXNzCisvLy8gcHJlc2VudHMgdGhlIGFyY2hpdmUgZmlsZSBhcyBhbiBpbGlzdCBvZiBBcmNoaXZlTWVtYmVyIG9iamVjdHMuIFRoZSBtZW1iZXJzCisvLy8gY2FuIGJlIHJlYXJyYW5nZWQgaW4gYW55IGZhc2hpb24gZWl0aGVyIGJ5IGRpcmVjdGx5IGVkaXRpbmcgdGhlIGlsaXN0IG9yIGJ5CisvLy8gdXNpbmcgZWRpdGluZyBtZXRob2RzIG9uIHRoZSBBcmNoaXZlIGNsYXNzIChyZWNvbW1lbmRlZCkuIFRoZSBBcmNoaXZlCisvLy8gY2xhc3MgYWxzbyBwcm92aWRlcyBzZXZlcmFsIHdheXMgb2YgYWNjZXNzaW5nIHRoZSBhcmNoaXZlIGZpbGUgZm9yIHZhcmlvdXMKKy8vLyBwdXJwb3NlcyBzdWNoIGFzIGVkaXRpbmcgYW5kIGxpbmtpbmcuICBGdWxsIHN5bWJvbCB0YWJsZSBzdXBwb3J0IGlzIHByb3ZpZGVkCisvLy8gZm9yIGxvYWRpbmcgb25seSB0aG9zZSBmaWxlcyB0aGF0IHJlc29sdmUgc3ltYm9scy4gTm90ZSB0aGF0IHJlYWQKKy8vLyBwZXJmb3JtYW5jZSBvZiB0aGlzIGxpYnJhcnkgaXMgX2NydWNpYWxfIGZvciBwZXJmb3JtYW5jZSBvZiBKSVQgdHlwZQorLy8vIGFwcGxpY2F0aW9ucyBhbmQgdGhlIGxpbmtlcnMuIENvbnNlcXVlbnRseSwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGFzcworLy8vIGlzIG9wdGltaXplZCBmb3IgcmVhZGluZy4KK2NsYXNzIEFyY2hpdmUgeworCisgIC8vLyBAbmFtZSBUeXBlcworICAvLy8gQHsKKyAgcHVibGljOgorICAgIC8vLyBUaGlzIGlzIHRoZSBpbGlzdCB0eXBlIG92ZXIgd2hpY2ggdXNlcnMgbWF5IGl0ZXJhdGUgdG8gZXhhbWluZQorICAgIC8vLyB0aGUgY29udGVudHMgb2YgdGhlIGFyY2hpdmUKKyAgICAvLy8gQGJyaWVmIFRoZSBpbGlzdCB0eXBlIG9mIEFyY2hpdmVNZW1iZXJzIHRoYXQgQXJjaGl2ZSBjb250YWlucy4KKyAgICB0eXBlZGVmIGlwbGlzdDxBcmNoaXZlTWVtYmVyPiBNZW1iZXJzTGlzdDsKKworICAgIC8vLyBAYnJpZWYgRm9yd2FyZCBtdXRhYmxlIGl0ZXJhdG9yIG92ZXIgQXJjaGl2ZU1lbWJlcgorICAgIHR5cGVkZWYgTWVtYmVyc0xpc3Q6Oml0ZXJhdG9yIGl0ZXJhdG9yOworCisgICAgLy8vIEBicmllZiBGb3J3YXJkIGltbXV0YWJsZSBpdGVyYXRvciBvdmVyIEFyY2hpdmVNZW1iZXIKKyAgICB0eXBlZGVmIE1lbWJlcnNMaXN0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgIC8vLyBAYnJpZWYgUmV2ZXJzZSBtdXRhYmxlIGl0ZXJhdG9yIG92ZXIgQXJjaGl2ZU1lbWJlcgorICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOworCisgICAgLy8vIEBicmllZiBSZXZlcnNlIGltbXV0YWJsZSBpdGVyYXRvciBvdmVyIEFyY2hpdmVNZW1iZXIKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIC8vLyBAYnJpZWYgVGhlIGluLW1lbW9yeSB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wgdGFibGUKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLHVuc2lnbmVkPiBTeW1UYWJUeXBlOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgaWxpc3QgYWNjZXNzb3IgbWV0aG9kcworICAvLy8gQHsKKyAgcHVibGljOgorICAgIGlubGluZSBpdGVyYXRvciAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgIHsgcmV0dXJuIG1lbWJlcnMuYmVnaW4oKTsgIH0KKyAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgICAgICAgICBiZWdpbigpICBjb25zdCB7IHJldHVybiBtZW1iZXJzLmJlZ2luKCk7ICB9CisgICAgaW5saW5lIGl0ZXJhdG9yICAgICAgICAgICAgICAgZW5kICAoKSAgICAgICAgeyByZXR1cm4gbWVtYmVycy5lbmQoKTsgICAgfQorICAgIGlubGluZSBjb25zdF9pdGVyYXRvciAgICAgICAgIGVuZCAgKCkgIGNvbnN0IHsgcmV0dXJuIG1lbWJlcnMuZW5kKCk7ICAgIH0KKworICAgIGlubGluZSByZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJiZWdpbigpICAgICAgIHsgcmV0dXJuIG1lbWJlcnMucmJlZ2luKCk7IH0KKyAgICBpbmxpbmUgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBtZW1iZXJzLnJiZWdpbigpOyB9CisgICAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3IgICAgICAgcmVuZCAgKCkgICAgICAgeyByZXR1cm4gbWVtYmVycy5yZW5kKCk7ICAgfQorICAgIGlubGluZSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQgICgpIGNvbnN0IHsgcmV0dXJuIG1lbWJlcnMucmVuZCgpOyAgIH0KKworICAgIGlubGluZSBzaXplX3QgICAgICAgICAgICAgICAgIHNpemUoKSAgIGNvbnN0IHsgcmV0dXJuIG1lbWJlcnMuc2l6ZSgpOyAgIH0KKyAgICBpbmxpbmUgYm9vbCAgICAgICAgICAgICAgICAgICBlbXB0eSgpICBjb25zdCB7IHJldHVybiBtZW1iZXJzLmVtcHR5KCk7ICB9CisgICAgaW5saW5lIGNvbnN0IEFyY2hpdmVNZW1iZXImICAgZnJvbnQoKSAgY29uc3QgeyByZXR1cm4gbWVtYmVycy5mcm9udCgpOyAgfQorICAgIGlubGluZSAgICAgICBBcmNoaXZlTWVtYmVyJiAgIGZyb250KCkgICAgICAgIHsgcmV0dXJuIG1lbWJlcnMuZnJvbnQoKTsgIH0KKyAgICBpbmxpbmUgY29uc3QgQXJjaGl2ZU1lbWJlciYgICBiYWNrKCkgICBjb25zdCB7IHJldHVybiBtZW1iZXJzLmJhY2soKTsgICB9CisgICAgaW5saW5lICAgICAgIEFyY2hpdmVNZW1iZXImICAgYmFjaygpICAgICAgICAgeyByZXR1cm4gbWVtYmVycy5iYWNrKCk7ICAgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgaWxpc3QgbXV0YXRvciBtZXRob2RzCisgIC8vLyBAeworICBwdWJsaWM6CisgICAgLy8vIFRoaXMgbWV0aG9kIHNwbGljZXMgYSBccCBzcmMgbWVtYmVyIGZyb20gYW4gYXJjaGl2ZSAocG9zc2libHkgXHAgdGhpcyksCisgICAgLy8vIHRvIGEgcG9zaXRpb24ganVzdCBiZWZvcmUgdGhlIG1lbWJlciBnaXZlbiBieSBccCBkZXN0IGluIFxwIHRoaXMuIFdoZW4KKyAgICAvLy8gdGhlIGFyY2hpdmUgaXMgd3JpdHRlbiwgXHAgc3JjIHdpbGwgYmUgd3JpdHRlbiBpbiBpdHMgbmV3IGxvY2F0aW9uLgorICAgIC8vLyBAYnJpZWYgTW92ZSBhIG1lbWJlciB0byBhIG5ldyBsb2NhdGlvbgorICAgIGlubGluZSB2b2lkIHNwbGljZShpdGVyYXRvciBkZXN0LCBBcmNoaXZlJiBhcmNoLCBpdGVyYXRvciBzcmMpCisgICAgICB7IHJldHVybiBtZW1iZXJzLnNwbGljZShkZXN0LGFyY2gubWVtYmVycyxzcmMpOyB9CisKKyAgICAvLy8gVGhpcyBtZXRob2QgZXJhc2VzIGEgXHAgdGFyZ2V0IG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlLiBXaGVuIHRoZQorICAgIC8vLyBhcmNoaXZlIGlzIHdyaXR0ZW4sIGl0IHdpbGwgbm8gbG9uZ2VyIGNvbnRhaW4gXHAgdGFyZ2V0LiBUaGUgYXNzb2NpYXRlZAorICAgIC8vLyBBcmNoaXZlTWVtYmVyIGlzIGRlbGV0ZWQuCisgICAgLy8vIEBicmllZiBFcmFzZSBhIG1lbWJlci4KKyAgICBpbmxpbmUgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgdGFyZ2V0KSB7IHJldHVybiBtZW1iZXJzLmVyYXNlKHRhcmdldCk7IH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIENvbnN0cnVjdG9ycworICAvLy8gQHsKKyAgcHVibGljOgorICAgIC8vLyBDcmVhdGUgYW4gZW1wdHkgYXJjaGl2ZSBmaWxlIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgXHAgRmlsZW5hbWUuIFRoaXMKKyAgICAvLy8gbWV0aG9kIGRvZXMgbm90IGFjdHVhbGx5IGNyZWF0ZSB0aGUgYXJjaGl2ZSBkaXNrIGZpbGUuIEl0IGNyZWF0ZXMgYW4KKyAgICAvLy8gZW1wdHkgQXJjaGl2ZSBvYmplY3QuIElmIHRoZSB3cml0ZVRvRGlzayBtZXRob2QgaXMgY2FsbGVkLCB0aGUgYXJjaGl2ZQorICAgIC8vLyBmaWxlIFxwIEZpbGVuYW1lIHdpbGwgYmUgY3JlYXRlZCBhdCB0aGF0IHBvaW50LCB3aXRoIHdoYXRldmVyIGNvbnRlbnQKKyAgICAvLy8gdGhlIHJldHVybmVkIEFyY2hpdmUgb2JqZWN0IGhhcyBhdCB0aGF0IHRpbWUuCisgICAgLy8vIEByZXR1cm5zIEFuIEFyY2hpdmUqIHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IGFyY2hpdmUgZmlsZS4KKyAgICAvLy8gQGJyaWVmIENyZWF0ZSBhbiBlbXB0eSBBcmNoaXZlLgorICAgIHN0YXRpYyBBcmNoaXZlKiBDcmVhdGVFbXB0eSgKKyAgICAgIGNvbnN0IHN5czo6UGF0aCYgRmlsZW5hbWUsLy8vPCBOYW1lIG9mIHRoZSBhcmNoaXZlIHRvIChldmVudHVhbGx5KSBjcmVhdGUuCisgICAgICBMTFZNQ29udGV4dCYgQyAgICAgICAgICAgIC8vLzwgQ29udGV4dCB0byB1c2UgZm9yIGdsb2JhbCBpbmZvcm1hdGlvbgorICAgICk7CisKKyAgICAvLy8gT3BlbiBhbiBleGlzdGluZyBhcmNoaXZlIGFuZCBsb2FkIGl0cyBjb250ZW50cyBpbiBwcmVwYXJhdGlvbiBmb3IKKyAgICAvLy8gZWRpdGluZy4gQWZ0ZXIgdGhpcyBjYWxsLCB0aGUgbWVtYmVyIGlsaXN0IGlzIGNvbXBsZXRlbHkgcG9wdWxhdGVkIGJhc2VkCisgICAgLy8vIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBmaWxlLiBZb3Ugc2hvdWxkIHVzZSB0aGlzIGZvcm0gb2Ygb3BlbiBpZgorICAgIC8vLyB5b3UgaW50ZW5kIHRvIG1vZGlmeSB0aGUgYXJjaGl2ZSBvciB0cmF2ZXJzZSBpdHMgY29udGVudHMgKGUuZy4gZm9yCisgICAgLy8vIHByaW50aW5nKS4KKyAgICAvLy8gQGJyaWVmIE9wZW4gYW5kIGxvYWQgYW4gYXJjaGl2ZSBmaWxlCisgICAgc3RhdGljIEFyY2hpdmUqIE9wZW5BbmRMb2FkKAorICAgICAgY29uc3Qgc3lzOjpQYXRoJiBmaWxlUGF0aCwgIC8vLzwgVGhlIGZpbGUgcGF0aCB0byBvcGVuIGFuZCBsb2FkCisgICAgICBMTFZNQ29udGV4dCYgQywgICAgICAgLy8vPCBUaGUgY29udGV4dCB0byB1c2UgZm9yIGdsb2JhbCBpbmZvcm1hdGlvbgorICAgICAgc3RkOjpzdHJpbmcqIEVycm9yTWVzc2FnZSAgIC8vLzwgQW4gb3B0aW9uYWwgZXJyb3Igc3RyaW5nCisgICAgKTsKKworICAgIC8vLyBUaGlzIG1ldGhvZCBvcGVucyBhbiBleGlzdGluZyBhcmNoaXZlIGZpbGUgZnJvbSBccCBGaWxlbmFtZSBhbmQgcmVhZHMgaW4KKyAgICAvLy8gaXRzIHN5bWJvbCB0YWJsZSB3aXRob3V0IHJlYWRpbmcgaW4gYW55IG9mIHRoZSBhcmNoaXZlJ3MgbWVtYmVycy4gVGhpcworICAgIC8vLyByZWR1Y2VzIGJvdGggSS9PIGFuZCBjcHUgdGltZSBpbiBvcGVuaW5nIHRoZSBhcmNoaXZlIGlmIGl0IGlzIHRvIGJlIHVzZWQKKyAgICAvLy8gc29sZWx5IGZvciBzeW1ib2wgbG9va3VwIChlLmcuIGR1cmluZyBsaW5raW5nKS4gIFRoZSBccCBGaWxlbmFtZSBtdXN0CisgICAgLy8vIGV4aXN0IGFuZCBiZSBhbiBhcmNoaXZlIGZpbGUgb3IgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBUaGlzIGZvcm0KKyAgICAvLy8gb2Ygb3BlbmluZyB0aGUgYXJjaGl2ZSBpcyBpbnRlbmRlZCBmb3IgcmVhZC1vbmx5IG9wZXJhdGlvbnMgdGhhdCBuZWVkIHRvCisgICAgLy8vIGxvY2F0ZSBtZW1iZXJzIHZpYSB0aGUgc3ltYm9sIHRhYmxlIGZvciBsaW5rIGVkaXRpbmcuICBTaW5jZSB0aGUgYXJjaHZlCisgICAgLy8vIG1lbWJlcnMgYXJlIG5vdCByZWFkIGJ5IHRoaXMgbWV0aG9kLCB0aGUgYXJjaGl2ZSB3aWxsIGFwcGVhciBlbXB0eSB1cG9uCisgICAgLy8vIHJldHVybi4gSWYgZWRpdGluZyBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlIGFyY2hpdmUsIHRoZXkgd2lsbAorICAgIC8vLyBjb21wbGV0ZWx5IHJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlISBJdCBpcyByZWNvbW1lbmRlZCB0aGF0CisgICAgLy8vIGlmIHRoaXMgZm9ybSBvZiBvcGVuaW5nIHRoZSBhcmNoaXZlIGlzIHVzZWQgdGhhdCBvbmx5IHRoZSBzeW1ib2wgdGFibGUKKyAgICAvLy8gbG9va3VwIG1ldGhvZHMgKGdldFN5bWJvbFRhYmxlLCBmaW5kTW9kdWxlRGVmaW5pbmdTeW1ib2wsIGFuZAorICAgIC8vLyBmaW5kTW9kdWxlc0RlZmluaW5nU3ltYm9scykgYmUgdXNlZC4KKyAgICAvLy8gQHRocm93cyBzdGQ6OnN0cmluZyBpZiBhbiBlcnJvciBvY2N1cnMgb3BlbmluZyB0aGUgZmlsZQorICAgIC8vLyBAcmV0dXJucyBhbiBBcmNoaXZlKiB0aGF0IHJlcHJlc2VudHMgdGhlIGFyY2hpdmUgZmlsZS4KKyAgICAvLy8gQGJyaWVmIE9wZW4gYW4gZXhpc3RpbmcgYXJjaGl2ZSBhbmQgbG9hZCBpdHMgc3ltYm9scy4KKyAgICBzdGF0aWMgQXJjaGl2ZSogT3BlbkFuZExvYWRTeW1ib2xzKAorICAgICAgY29uc3Qgc3lzOjpQYXRoJiBGaWxlbmFtZSwgICAvLy88IE5hbWUgb2YgdGhlIGFyY2hpdmUgZmlsZSB0byBvcGVuCisgICAgICBMTFZNQ29udGV4dCYgQywgICAgICAgICAgICAgIC8vLzwgVGhlIGNvbnRleHQgdG8gdXNlIGZvciBnbG9iYWwgaW5mbworICAgICAgc3RkOjpzdHJpbmcqIEVycm9yTWVzc2FnZT0wICAvLy88IEFuIG9wdGlvbmFsIGVycm9yIHN0cmluZworICAgICk7CisKKyAgICAvLy8gVGhpcyBkZXN0cnVjdG9yIGNsZWFucyB1cCB0aGUgQXJjaGl2ZSBvYmplY3QsIHJlbGVhc2VzIGFsbCBtZW1vcnksIGFuZAorICAgIC8vLyBjbG9zZXMgZmlsZXMuIEl0IGRvZXMgbm90aGluZyB3aXRoIHRoZSBhcmNoaXZlIGZpbGUgb24gZGlzay4gSWYgeW91CisgICAgLy8vIGhhdmVuJ3QgdXNlZCB0aGUgd3JpdGVUb0Rpc2sgbWV0aG9kIGJ5IHRoZSB0aW1lIHRoZSBkZXN0cnVjdG9yIGlzCisgICAgLy8vIGNhbGxlZCwgYWxsIGNoYW5nZXMgdG8gdGhlIGFyY2hpdmUgd2lsbCBiZSBsb3N0LgorICAgIC8vLyBAdGhyb3dzIHN0ZDo6c3RyaW5nIGlmIGFuIGVycm9yIG9jY3VycworICAgIC8vLyBAYnJpZWYgRGVzdHJ1Y3QgaW4tbWVtb3J5IGFyY2hpdmUKKyAgICB+QXJjaGl2ZSgpOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworICBwdWJsaWM6CisgICAgLy8vIEByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBhcmNoaXZlIGZpbGUuCisgICAgLy8vIEBicmllZiBHZXQgdGhlIGFyY2hpdmUgcGF0aC4KKyAgICBjb25zdCBzeXM6OlBhdGgmIGdldFBhdGgoKSB7IHJldHVybiBhcmNoUGF0aDsgfQorCisgICAgLy8vIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIHNvIHRoYXQgZWRpdGluZyBtZXRob2RzIGNhbiBiZSBpbnZva2VkIGRpcmVjdGx5CisgICAgLy8vIG9uIHRoZSBBcmNoaXZlJ3MgaXBsaXN0IG9mIEFyY2hpdmVNZW1iZXIuIEhvd2V2ZXIsIGl0IGlzIHJlY29tbWVuZGVkCisgICAgLy8vIHRoYXQgdGhlIHVzdWFsIFNUTCBzdHlsZSBpdGVyYXRvciBpbnRlcmZhY2UgYmUgdXNlZCBpbnN0ZWFkLgorICAgIC8vLyBAcmV0dXJucyB0aGUgaXBsaXN0IG9mIEFyY2hpdmVNZW1iZXIKKyAgICAvLy8gQGJyaWVmIEdldCB0aGUgaXBsaXN0IG9mIHRoZSBtZW1iZXJzCisgICAgTWVtYmVyc0xpc3QmIGdldE1lbWJlcnMoKSB7IHJldHVybiBtZW1iZXJzOyB9CisKKyAgICAvLy8gVGhpcyBtZXRob2QgYWxsb3dzIGRpcmVjdCBxdWVyeSBvZiB0aGUgQXJjaGl2ZSdzIHN5bWJvbCB0YWJsZS4gVGhlCisgICAgLy8vIHN5bWJvbCB0YWJsZSBpcyBhIHN0ZDo6bWFwIG9mIHN0ZDo6c3RyaW5nICh0aGUgc3ltYm9sKSB0byB1bnNpZ25lZCAodGhlCisgICAgLy8vIGZpbGUgb2Zmc2V0KS4gTm90ZSB0aGF0IGZvciBlZmZpY2llbmN5IHJlYXNvbnMsIHRoZSBvZmZzZXQgc3RvcmVkIGluCisgICAgLy8vIHRoZSBzeW1ib2wgdGFibGUgaXMgbm90IHRoZSBhY3R1YWwgb2Zmc2V0LiBJdCBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlCisgICAgLy8vIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QgInJlYWwiIGZpbGUgbWVtYmVyIChhZnRlciB0aGUgc3ltYm9sIHRhYmxlKS4gVXNlCisgICAgLy8vIHRoZSBnZXRGaXJzdEZpbGVPZmZzZXQoKSB0byBvYnRhaW4gdGhhdCBvZmZzZXQgYW5kIGFkZCB0aGlzIHZhbHVlIHRvIHRoZQorICAgIC8vLyBvZmZzZXQgaW4gdGhlIHN5bWJvbCB0YWJsZSB0byBvYnRhaW4gdGhlIHJlYWwgZmlsZSBvZmZzZXQuIE5vdGUgdGhhdAorICAgIC8vLyB0aGVyZSBpcyBwdXJwb3NlZnVsbHkgbm8gaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IEFyY2hpdmUgdG8gbG9vayB1cAorICAgIC8vLyBtZW1iZXJzIGJ5IHRoZWlyIG9mZnNldC4gVXNlIHRoZSBmaW5kTW9kdWxlc0RlZmluaW5nU3ltYm9scyBhbmQKKyAgICAvLy8gZmluZE1vZHVsZURlZmluaW5nU3ltYm9sIG1ldGhvZHMgaW5zdGVhZC4KKyAgICAvLy8gQHJldHVybnMgdGhlIEFyY2hpdmUncyBzeW1ib2wgdGFibGUuCisgICAgLy8vIEBicmllZiBHZXQgdGhlIGFyY2hpdmUncyBzeW1ib2wgdGFibGUKKyAgICBjb25zdCBTeW1UYWJUeXBlJiBnZXRTeW1ib2xUYWJsZSgpIHsgcmV0dXJuIHN5bVRhYjsgfQorCisgICAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG9mZnNldCBpbiB0aGUgYXJjaGl2ZSBmaWxlIHRvIHRoZSBmaXJzdCAicmVhbCIKKyAgICAvLy8gZmlsZSBtZW1iZXIuIEFyY2hpdmUgZmlsZXMsIG9uIGRpc2ssIGhhdmUgYSBzaWduYXR1cmUgYW5kIG1pZ2h0IGhhdmUgYQorICAgIC8vLyBzeW1ib2wgdGFibGUgdGhhdCBwcmVjZWRlcyB0aGUgZmlyc3QgYWN0dWFsIGZpbGUgbWVtYmVyLiBUaGlzIG1ldGhvZAorICAgIC8vLyBhbGxvd3MgeW91IHRvIGRldGVybWluZSB3aGF0IHRoZSBzaXplIG9mIHRob3NlIGZpZWxkcyBhcmUuCisgICAgLy8vIEByZXR1cm5zIHRoZSBvZmZzZXQgdG8gdGhlIGZpcnN0ICJyZWFsIiBmaWxlIG1lbWJlciAgaW4gdGhlIGFyY2hpdmUuCisgICAgLy8vIEBicmllZiBHZXQgdGhlIG9mZnNldCB0byB0aGUgZmlyc3QgInJlYWwiIGZpbGUgbWVtYmVyICBpbiB0aGUgYXJjaGl2ZS4KKyAgICB1bnNpZ25lZCBnZXRGaXJzdEZpbGVPZmZzZXQoKSB7IHJldHVybiBmaXJzdEZpbGVPZmZzZXQ7IH0KKworICAgIC8vLyBUaGlzIG1ldGhvZCB3aWxsIHNjYW4gdGhlIGFyY2hpdmUgZm9yIGJpdGNvZGUgbW9kdWxlcywgaW50ZXJwcmV0IHRoZW0KKyAgICAvLy8gYW5kIHJldHVybiBhIHZlY3RvciBvZiB0aGUgaW5zdGFudGlhdGVkIG1vZHVsZXMgaW4gXHAgTW9kdWxlcy4gSWYgYW4KKyAgICAvLy8gZXJyb3Igb2NjdXJzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlLiBJZiBccCBFcnJNZXNzYWdlIGlzIG5vdCBudWxsCisgICAgLy8vIGFuZCBhbiBlcnJvciBvY2N1cnMsIFxwICpFcnJNZXNzYWdlIHdpbGwgYmUgc2V0IHRvIGEgc3RyaW5nIGV4cGxhaW5pbmcKKyAgICAvLy8gdGhlIGVycm9yIHRoYXQgb2NjdXJyZWQuCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICAvLy8gQGJyaWVmIEluc3RhbnRpYXRlIGFsbCB0aGUgYml0Y29kZSBtb2R1bGVzIGxvY2F0ZWQgaW4gdGhlIGFyY2hpdmUKKyAgICBib29sIGdldEFsbE1vZHVsZXMoc3RkOjp2ZWN0b3I8TW9kdWxlKj4mIE1vZHVsZXMsIHN0ZDo6c3RyaW5nKiBFcnJNZXNzYWdlKTsKKworICAgIC8vLyBUaGlzIGFjY2Vzc29yIGxvb2tzIHVwIHRoZSBccCBzeW1ib2wgaW4gdGhlIGFyY2hpdmUncyBzeW1ib2wgdGFibGUgYW5kCisgICAgLy8vIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgbW9kdWxlIHRoYXQgZGVmaW5lcyB0aGF0IHN5bWJvbC4gVGhpcyBtZXRob2QgY2FuCisgICAgLy8vIGJlIGNhbGxlZCBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeS4gVGhpcyBpcyBoYW5keSBmb3IgbGlua2luZyB0aGUKKyAgICAvLy8gYXJjaGl2ZSBpbnRvIGFub3RoZXIgbW9kdWxlIGJhc2VkIG9uIHVucmVzb2x2ZWQgc3ltYm9scy4gTm90ZSB0aGF0IHRoZQorICAgIC8vLyBNb2R1bGUgcmV0dXJuZWQgYnkgdGhpcyBhY2Nlc3NvciBzaG91bGQgbm90IGJlIGRlbGV0ZWQgYnkgdGhlIGNhbGxlci4gSXQKKyAgICAvLy8gaXMgbWFuYWdlZCBpbnRlcm5hbGx5IGJ5IHRoZSBBcmNoaXZlIGNsYXNzLiBJdCBpcyBwb3NzaWJsZSB0aGF0IG11bHRpcGxlCisgICAgLy8vIGNhbGxzIHRvIHRoaXMgYWNjZXNzb3Igd2lsbCByZXR1cm4gdGhlIHNhbWUgTW9kdWxlIGluc3RhbmNlIGJlY2F1c2UgdGhlCisgICAgLy8vIGFzc29jaWF0ZWQgbW9kdWxlIGRlZmluZXMgbXVsdGlwbGUgc3ltYm9scy4KKyAgICAvLy8gQHJldHVybnMgVGhlIE1vZHVsZSogZm91bmQgb3IgbnVsbCBpZiB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBjb250YWluIGEKKyAgICAvLy8gbW9kdWxlIHRoYXQgZGVmaW5lcyB0aGUgXHAgc3ltYm9sLgorICAgIC8vLyBAYnJpZWYgTG9vayB1cCBhIG1vZHVsZSBieSBzeW1ib2wgbmFtZS4KKyAgICBNb2R1bGUqIGZpbmRNb2R1bGVEZWZpbmluZ1N5bWJvbCgKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2wsICAvLy88IFN5bWJvbCB0byBiZSBzb3VnaHQKKyAgICAgIHN0ZDo6c3RyaW5nKiBFcnJNZXNzYWdlICAgICAvLy88IEVycm9yIG1lc3NhZ2Ugc3RvcmFnZSwgaWYgbm9uLXplcm8KKyAgICApOworCisgICAgLy8vIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gZmluZE1vZHVsZURlZmluaW5nU3ltYm9sIGJ1dCBhbGxvd3MgbG9va3VwIG9mCisgICAgLy8vIG1vcmUgdGhhbiBvbmUgc3ltYm9sIGF0IGEgdGltZS4gSWYgXHAgc3ltYm9scyBjb250YWlucyBhIGxpc3Qgb2YKKyAgICAvLy8gdW5kZWZpbmVkIHN5bWJvbHMgaW4gc29tZSBtb2R1bGUsIHRoZW4gY2FsbGluZyB0aGlzIG1ldGhvZCBpcyBsaWtlCisgICAgLy8vIG1ha2luZyBvbmUgY29tcGxldGUgcGFzcyB0aHJvdWdoIHRoZSBhcmNoaXZlIHRvIHJlc29sdmUgc3ltYm9scyBidXQgaXMKKyAgICAvLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBsb29raW5nIGF0IHRoZSBpbmRpdmlkdWFsIG1lbWJlcnMuIE5vdGUgdGhhdCBvbgorICAgIC8vLyBleGl0LCB0aGUgc3ltYm9scyByZXNvbHZlZCBieSB0aGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBccAorICAgIC8vLyBzeW1ib2xzIHRvIGVuc3VyZSB0aGV5IGFyZSBub3QgcmUtc2VhcmNoZWQgb24gYSBzdWJzZXF1ZW50IGNhbGwuIElmCisgICAgLy8vIHlvdSBuZWVkIHRvIHJldGFpbiB0aGUgbGlzdCBvZiBzeW1ib2xzLCBtYWtlIGEgY29weS4KKyAgICAvLy8gQGJyaWVmIExvb2sgdXAgbXVsdGlwbGUgc3ltYm9scyBpbiB0aGUgYXJjaGl2ZS4KKyAgICBib29sIGZpbmRNb2R1bGVzRGVmaW5pbmdTeW1ib2xzKAorICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBzeW1ib2xzLCAgICAgLy8vPCBTeW1ib2xzIHRvIGJlIHNvdWdodAorICAgICAgc3RkOjpzZXQ8TW9kdWxlKj4mIG1vZHVsZXMsICAgICAgICAgLy8vPCBUaGUgbW9kdWxlcyBtYXRjaGluZyBccCBzeW1ib2xzCisgICAgICBzdGQ6OnN0cmluZyogRXJyTWVzc2FnZSAgICAgICAgICAgICAvLy88IEVycm9yIG1zZyBzdG9yYWdlLCBpZiBub24temVybworICAgICk7CisKKyAgICAvLy8gVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhcmNoaXZlIGlzIGEgcHJvcGVybHkgZm9ybWVkIGxsdm0KKyAgICAvLy8gYml0Y29kZSBhcmNoaXZlLiAgSXQgZmlyc3QgbWFrZXMgc3VyZSB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIGxvYWRlZAorICAgIC8vLyBhbmQgaGFzIGEgbm9uLXplcm8gc2l6ZS4gIElmIGl0IGRvZXMsIHRoZW4gaXQgaXMgYW4gYXJjaGl2ZS4gIElmIG5vdCwKKyAgICAvLy8gdGhlbiBpdCB0cmllcyB0byBsb2FkIGFsbCB0aGUgYml0Y29kZSBtb2R1bGVzIG9mIHRoZSBhcmNoaXZlLiAgRmluYWxseSwKKyAgICAvLy8gaXQgcmV0dXJucyB3aGV0aGVyIGl0IHdhcyBzdWNjZXNzZnVsbC4KKyAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJjaGl2ZSBpcyBhIHByb3BlciBsbHZtIGJpdGNvZGUgYXJjaGl2ZQorICAgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyY2hpdmUgaXMgYSBwcm9wZXIgbGx2bSBiaXRjb2RlIGFyY2hpdmUuCisgICAgYm9vbCBpc0JpdGNvZGVBcmNoaXZlKCk7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBNdXRhdG9ycworICAvLy8gQHsKKyAgcHVibGljOgorICAgIC8vLyBUaGlzIG1ldGhvZCBpcyB0aGUgb25seSB3YXkgdG8gZ2V0IHRoZSBhcmNoaXZlIHdyaXR0ZW4gdG8gZGlzay4gSXQKKyAgICAvLy8gY3JlYXRlcyBvciBvdmVyd3JpdGVzIHRoZSBmaWxlIHNwZWNpZmllZCB3aGVuIFxwIHRoaXMgd2FzIGNyZWF0ZWQKKyAgICAvLy8gb3Igb3BlbmVkLiBUaGUgYXJndW1lbnRzIHByb3ZpZGUgb3B0aW9ucyBmb3Igd3JpdGluZyB0aGUgYXJjaGl2ZS4gSWYKKyAgICAvLy8gXHAgQ3JlYXRlU3ltYm9sVGFibGUgaXMgdHJ1ZSwgdGhlIGFyY2hpdmUgaXMgc2Nhbm5lZCBmb3IgYml0Y29kZSBmaWxlcworICAgIC8vLyBhbmQgYSBzeW1ib2wgdGFibGUgb2YgdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbiBhbmQgZ2xvYmFsCisgICAgLy8vIHZhcmlhYmxlIG5hbWVzIGlzIGNyZWF0ZWQuIElmIFxwIFRydW5jYXRlTmFtZXMgaXMgdHJ1ZSwgdGhlIG5hbWVzIG9mIHRoZQorICAgIC8vLyBhcmNoaXZlIG1lbWJlcnMgd2lsbCBoYXZlIHRoZWlyIHBhdGggY29tcG9uZW50IHN0cmlwcGVkIGFuZCB0aGUgZmlsZQorICAgIC8vLyBuYW1lIHdpbGwgYmUgdHJ1bmNhdGVkIGF0IDE1IGNoYXJhY3RlcnMuIElmIFxwIENvbXByZXNzIGlzIHNwZWNpZmllZCwKKyAgICAvLy8gYWxsIGFyY2hpdmUgbWVtYmVycyB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGJlaW5nIHdyaXR0ZW4uIElmCisgICAgLy8vIFxwIFByaW50U3ltVGFiIGlzIHRydWUsIHRoZSBzeW1ib2wgdGFibGUgd2lsbCBiZSBwcmludGVkIHRvIHN0ZDo6Y291dC4KKyAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgXHAgZXJyb3Igc2V0IHRvIGVycm9yIG1lc3NhZ2UKKyAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgdGhlIHdyaXRpbmcgc3VjY2VlZGVkLgorICAgIC8vLyBAYnJpZWYgV3JpdGUgKHBvc3NpYmx5IG1vZGlmaWVkKSBhcmNoaXZlIGNvbnRlbnRzIHRvIGRpc2sKKyAgICBib29sIHdyaXRlVG9EaXNrKAorICAgICAgYm9vbCBDcmVhdGVTeW1ib2xUYWJsZT1mYWxzZSwgICAvLy88IENyZWF0ZSBTeW1ib2wgdGFibGUKKyAgICAgIGJvb2wgVHJ1bmNhdGVOYW1lcz1mYWxzZSwgICAgICAgLy8vPCBUcnVuY2F0ZSB0aGUgZmlsZW5hbWUgdG8gMTUgY2hhcnMKKyAgICAgIGJvb2wgQ29tcHJlc3M9ZmFsc2UsICAgICAgICAgICAgLy8vPCBDb21wcmVzcyBmaWxlcworICAgICAgc3RkOjpzdHJpbmcqIEVyck1lc3NhZ2U9MCAgICAgICAvLy88IElmIG5vbi1udWxsLCB3aGVyZSBlcnJvciBtc2cgaXMgc2V0CisgICAgKTsKKworICAgIC8vLyBUaGlzIG1ldGhvZCBhZGRzIGEgbmV3IGZpbGUgdG8gdGhlIGFyY2hpdmUuIFRoZSBccCBmaWxlbmFtZSBpcyBleGFtaW5lZAorICAgIC8vLyB0byBkZXRlcm1pbmUganVzdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gY3JlYXRlIGFuIEFyY2hpdmVNZW1iZXIgb2JqZWN0CisgICAgLy8vIHdoaWNoIGlzIHRoZW4gaW5zZXJ0ZWQgaW50byB0aGUgQXJjaGl2ZSBvYmplY3QncyBpbGlzdCBhdCB0aGUgbG9jYXRpb24KKyAgICAvLy8gZ2l2ZW4gYnkgXHAgd2hlcmUuCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgLy8vIEBicmllZiBBZGQgYSBmaWxlIHRvIHRoZSBhcmNoaXZlLgorICAgIGJvb2wgYWRkRmlsZUJlZm9yZSgKKyAgICAgIGNvbnN0IHN5czo6UGF0aCYgZmlsZW5hbWUsIC8vLzwgVGhlIGZpbGUgdG8gYmUgYWRkZWQKKyAgICAgIGl0ZXJhdG9yIHdoZXJlLCAgICAgICAgICAgIC8vLzwgSW5zZXJ0aW9uIHBvaW50CisgICAgICBzdGQ6OnN0cmluZyogRXJyTXNnICAgICAgICAvLy88IE9wdGlvbmFsIGVycm9yIG1lc3NhZ2UgbG9jYXRpb24KKyAgICApOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgSW1wbGVtZW50YXRpb24KKyAgLy8vIEB7CisgIHByb3RlY3RlZDoKKyAgICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhbiBBcmNoaXZlIGZvciBccCBmaWxlbmFtZSBhbmQgb3B0aW9uYWxseSAgbWFwIGl0CisgICAgLy8vIGludG8gbWVtb3J5LgorICAgIGV4cGxpY2l0IEFyY2hpdmUoY29uc3Qgc3lzOjpQYXRoJiBmaWxlbmFtZSwgTExWTUNvbnRleHQmIEMpOworCisgICAgLy8vIEBwYXJhbSBkYXRhIFRoZSBzeW1ib2wgdGFibGUgZGF0YSB0byBiZSBwYXJzZWQKKyAgICAvLy8gQHBhcmFtIGxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgc3ltYm9sIHRhYmxlIGRhdGEKKyAgICAvLy8gQHBhcmFtIGVycm9yIFNldCB0byBhZGRyZXNzIG9mIGEgc3RkOjpzdHJpbmcgdG8gZ2V0IGVycm9yIG1lc3NhZ2VzCisgICAgLy8vIEByZXR1cm5zIGZhbHNlIG9uIGVycm9yCisgICAgLy8vIEBicmllZiBQYXJzZSB0aGUgc3ltYm9sIHRhYmxlIGF0IFxwIGRhdGEuCisgICAgYm9vbCBwYXJzZVN5bWJvbFRhYmxlKGNvbnN0IHZvaWQqIGRhdGEsdW5zaWduZWQgbGVuLHN0ZDo6c3RyaW5nKiBlcnJvcik7CisKKyAgICAvLy8gQHJldHVybnMgQSBmdWxseSBwb3B1bGF0ZWQgQXJjaGl2ZU1lbWJlciBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICAgIC8vLyBAYnJpZWYgUGFyc2UgdGhlIGhlYWRlciBvZiBhIG1lbWJlciBzdGFydGluZyBhdCBccCBBdAorICAgIEFyY2hpdmVNZW1iZXIqIHBhcnNlTWVtYmVySGVhZGVyKAorICAgICAgY29uc3QgY2hhciomQXQsICAgIC8vLzwgVGhlIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHdlJ3JlIHBhcnNpbmcKKyAgICAgIGNvbnN0IGNoYXIqRW5kLCAgICAvLy88IFRoZSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUKKyAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvciAvLy88IE9wdGlvbmFsIGVycm9yIG1lc3NhZ2UgY2F0Y2hlcgorICAgICk7CisKKyAgICAvLy8gQHBhcmFtIEVyck1lc3NhZ2UgU2V0IHRvIGFkZHJlc3Mgb2YgYSBzdGQ6OnN0cmluZyB0byBnZXQgZXJyb3IgbWVzc2FnZXMKKyAgICAvLy8gQHJldHVybnMgZmFsc2Ugb24gZXJyb3IKKyAgICAvLy8gQGJyaWVmIENoZWNrIHRoYXQgdGhlIGFyY2hpdmUgc2lnbmF0dXJlIGlzIGNvcnJlY3QKKyAgICBib29sIGNoZWNrU2lnbmF0dXJlKHN0ZDo6c3RyaW5nKiBFcnJNZXNzYWdlKTsKKworICAgIC8vLyBAcGFyYW0gRXJyTWVzc2FnZSBTZXQgdG8gYWRkcmVzcyBvZiBhIHN0ZDo6c3RyaW5nIHRvIGdldCBlcnJvciBtZXNzYWdlcworICAgIC8vLyBAcmV0dXJucyBmYWxzZSBvbiBlcnJvcgorICAgIC8vLyBAYnJpZWYgTG9hZCB0aGUgZW50aXJlIGFyY2hpdmUuCisgICAgYm9vbCBsb2FkQXJjaGl2ZShzdGQ6OnN0cmluZyogRXJyTWVzc2FnZSk7CisKKyAgICAvLy8gQHBhcmFtIEVyck1lc3NhZ2UgU2V0IHRvIGFkZHJlc3Mgb2YgYSBzdGQ6OnN0cmluZyB0byBnZXQgZXJyb3IgbWVzc2FnZXMKKyAgICAvLy8gQHJldHVybnMgZmFsc2Ugb24gZXJyb3IKKyAgICAvLy8gQGJyaWVmIExvYWQganVzdCB0aGUgc3ltYm9sIHRhYmxlLgorICAgIGJvb2wgbG9hZFN5bWJvbFRhYmxlKHN0ZDo6c3RyaW5nKiBFcnJNZXNzYWdlKTsKKworICAgIC8vLyBAYnJpZWYgV3JpdGUgdGhlIHN5bWJvbCB0YWJsZSB0byBhbiBvZnN0cmVhbS4KKyAgICB2b2lkIHdyaXRlU3ltYm9sVGFibGUoc3RkOjpvZnN0cmVhbSYgQVJGaWxlKTsKKworICAgIC8vLyBXcml0ZXMgb25lIEFyY2hpdmVNZW1iZXIgdG8gYW4gb2ZzdHJlYW0uIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJucworICAgIC8vLyBmYWxzZSwgb3RoZXJ3aXNlIHRydWUuIElmIGFuIGVycm9yIG9jY3VycyBhbmQgZXJyb3IgaXMgbm9uLW51bGwgdGhlbgorICAgIC8vLyBpdCB3aWxsIGJlIHNldCB0byBhbiBlcnJvciBtZXNzYWdlLgorICAgIC8vLyBAcmV0dXJucyBmYWxzZSBXcml0aW5nIG1lbWJlciBzdWNjZWVkZWQKKyAgICAvLy8gQHJldHVybnMgdHJ1ZSBXcml0aW5nIG1lbWJlciBmYWlsZWQsIFxwIGVycm9yIHNldCB0byBlcnJvciBtZXNzYWdlCisgICAgYm9vbCB3cml0ZU1lbWJlcigKKyAgICAgIGNvbnN0IEFyY2hpdmVNZW1iZXImIG1lbWJlciwgLy8vPCBUaGUgbWVtYmVyIHRvIGJlIHdyaXR0ZW4KKyAgICAgIHN0ZDo6b2ZzdHJlYW0mIEFSRmlsZSwgICAgICAgLy8vPCBUaGUgZmlsZSB0byB3cml0ZSBtZW1iZXIgb250bworICAgICAgYm9vbCBDcmVhdGVTeW1ib2xUYWJsZSwgICAgICAvLy88IFNob3VsZCBzeW1ib2wgdGFibGUgYmUgY3JlYXRlZD8KKyAgICAgIGJvb2wgVHJ1bmNhdGVOYW1lcywgICAgICAgICAgLy8vPCBTaG91bGQgbmFtZXMgYmUgdHJ1bmNhdGVkIHRvIDExIGNoYXJzPworICAgICAgYm9vbCBTaG91bGRDb21wcmVzcywgICAgICAgICAvLy88IFNob3VsZCB0aGUgbWVtYmVyIGJlIGNvbXByZXNzZWQ/CisgICAgICBzdGQ6OnN0cmluZyogRXJyTWVzc2FnZSAgICAgIC8vLzwgSWYgbm9uLW51bGwsIHBsYWNlIHdlcmUgZXJyb3IgbXNnIGlzIHNldAorICAgICk7CisKKyAgICAvLy8gQGJyaWVmIEZpbGwgaW4gYW4gQXJjaGl2ZU1lbWJlckhlYWRlciBmcm9tIEFyY2hpdmVNZW1iZXIuCisgICAgYm9vbCBmaWxsSGVhZGVyKGNvbnN0IEFyY2hpdmVNZW1iZXImbWJyLAorICAgICAgICAgICAgICAgICAgICBBcmNoaXZlTWVtYmVySGVhZGVyJiBoZHIsaW50IHN6LCBib29sIFRydW5jYXRlTmFtZXMpIGNvbnN0OworCisgICAgLy8vIEBicmllZiBNYXBzIGFyY2hpdmUgaW50byBtZW1vcnkKKyAgICBib29sIG1hcFRvTWVtb3J5KHN0ZDo6c3RyaW5nKiBFcnJNc2cpOworCisgICAgLy8vIEBicmllZiBGcmVlcyBhbGwgdGhlIG1lbWJlcnMgYW5kIHVubWFwcyB0aGUgYXJjaGl2ZSBmaWxlLgorICAgIHZvaWQgY2xlYW5VcE1lbW9yeSgpOworCisgICAgLy8vIFRoaXMgdHlwZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYml0Y29kZSBtb2R1bGVzIGxvYWRlZCBmcm9tIHRoZQorICAgIC8vLyBzeW1ib2wgdGFibGUuIEl0IG1hcHMgdGhlIGZpbGUgb2Zmc2V0IHRvIGEgcGFpciB0aGF0IGNvbnNpc3RzIG9mIHRoZQorICAgIC8vLyBhc3NvY2lhdGVkIEFyY2hpdmVNZW1iZXIgYW5kIHRoZSBNb2R1bGUuCisgICAgLy8vIEBicmllZiBNb2R1bGUgbWFwcGluZyB0eXBlCisgICAgdHlwZWRlZiBzdGQ6Om1hcDx1bnNpZ25lZCxzdGQ6OnBhaXI8TW9kdWxlKixBcmNoaXZlTWVtYmVyKj4gPgorICAgICAgTW9kdWxlTWFwOworCisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBEYXRhCisgIC8vLyBAeworICBwcm90ZWN0ZWQ6CisgICAgc3lzOjpQYXRoIGFyY2hQYXRoOyAgICAgICAvLy88IFBhdGggdG8gdGhlIGFyY2hpdmUgZmlsZSB3ZSByZWFkL3dyaXRlCisgICAgTWVtYmVyc0xpc3QgbWVtYmVyczsgICAgICAvLy88IFRoZSBpbGlzdCBvZiBBcmNoaXZlTWVtYmVyCisgICAgTWVtb3J5QnVmZmVyICptYXBmaWxlOyAgICAvLy88IFJhdyBBcmNoaXZlIGNvbnRlbnRzIG1hcHBlZCBpbnRvIG1lbW9yeQorICAgIGNvbnN0IGNoYXIqIGJhc2U7ICAgICAgICAgLy8vPCBCYXNlIG9mIHRoZSBtZW1vcnkgbWFwcGVkIGZpbGUgZGF0YQorICAgIFN5bVRhYlR5cGUgc3ltVGFiOyAgICAgICAgLy8vPCBUaGUgc3ltYm9sIHRhYmxlCisgICAgc3RkOjpzdHJpbmcgc3RydGFiOyAgICAgICAvLy88IFRoZSBzdHJpbmcgdGFibGUgZm9yIGxvbmcgZmlsZSBuYW1lcworICAgIHVuc2lnbmVkIHN5bVRhYlNpemU7ICAgICAgLy8vPCBTaXplIGluIGJ5dGVzIG9mIHN5bWJvbCB0YWJsZQorICAgIHVuc2lnbmVkIGZpcnN0RmlsZU9mZnNldDsgLy8vPCBPZmZzZXQgdG8gZmlyc3Qgbm9ybWFsIGZpbGUuCisgICAgTW9kdWxlTWFwIG1vZHVsZXM7ICAgICAgICAvLy88IFRoZSBtb2R1bGVzIGxvYWRlZCB2aWEgc3ltYm9sIGxvb2t1cC4KKyAgICBBcmNoaXZlTWVtYmVyKiBmb3JlaWduU1Q7IC8vLzwgVGhpcyBob2xkcyB0aGUgZm9yZWlnbiBzeW1ib2wgdGFibGUuCisgICAgTExWTUNvbnRleHQmIENvbnRleHQ7ICAgICAvLy88IFRoaXMgaG9sZHMgZ2xvYmFsIGRhdGEuCisgIC8vLyBAfQorICAvLy8gQG5hbWUgSGlkZGVuCisgIC8vLyBAeworICBwcml2YXRlOgorICAgIEFyY2hpdmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG8gbm90IGltcGxlbWVudAorICAgIEFyY2hpdmUoY29uc3QgQXJjaGl2ZSYpOyAgICAgICAgICAgIC8vLzwgRG8gbm90IGltcGxlbWVudAorICAgIEFyY2hpdmUmIG9wZXJhdG9yPShjb25zdCBBcmNoaXZlJik7IC8vLzwgRG8gbm90IGltcGxlbWVudAorICAvLy8gQH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0Q29kZXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdENvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhMmU2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdENvZGVzLmgKQEAgLTAsMCArMSwxODUgQEAKKy8vPT09LSBCaXRDb2Rlcy5oIC0gRW51bSB2YWx1ZXMgZm9yIHRoZSBiaXRjb2RlIGZvcm1hdCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgQml0Y29kZSBlbnVtIHZhbHVlcy4KKy8vCisvLyBUaGUgZW51bSB2YWx1ZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGVybWFuZW50LiAgSWYKKy8vIG5ldyBmZWF0dXJlcyBhcmUgYWRkZWQsIHRoZXkgc2hvdWxkIGhhdmUgdmFsdWVzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlCisvLyByZXNwZWN0aXZlIGxpc3RzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSVRDT0RFX0JJVENPREVTX0gKKyNkZWZpbmUgTExWTV9CSVRDT0RFX0JJVENPREVTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGJpdGMgeworICBlbnVtIFN0YW5kYXJkV2lkdGhzIHsKKyAgICBCbG9ja0lEV2lkdGggPSA4LCAgLy8gV2UgdXNlIFZCUi04IGZvciBibG9jayBJRHMuCisgICAgQ29kZUxlbldpZHRoID0gNCwgIC8vIENvZGVsZW4gYXJlIFZCUi00LgorICAgIEJsb2NrU2l6ZVdpZHRoID0gMzIgIC8vIEJsb2NrU2l6ZSB1cCB0byAyXjMyIDMyLWJpdCB3b3JkcyA9IDE2R0IgcGVyIGJsb2NrLgorICB9OworCisgIC8vIFRoZSBzdGFuZGFyZCBhYmJyZXYgbmFtZXNwYWNlIGFsd2F5cyBoYXMgYSB3YXkgdG8gZXhpdCBhIGJsb2NrLCBlbnRlciBhCisgIC8vIG5lc3RlZCBibG9jaywgZGVmaW5lIGFiYnJldnMsIGFuZCBkZWZpbmUgYW4gdW5hYmJyZXZpYXRlZCByZWNvcmQuCisgIGVudW0gRml4ZWRBYmJyZXZJRHMgeworICAgIEVORF9CTE9DSyA9IDAsICAvLyBNdXN0IGJlIHplcm8gdG8gZ3VhcmFudGVlIHRlcm1pbmF0aW9uIGZvciBicm9rZW4gYml0Y29kZS4KKyAgICBFTlRFUl9TVUJCTE9DSyA9IDEsCisKKyAgICAvLy8gREVGSU5FX0FCQlJFViAtIERlZmluZXMgYW4gYWJicmV2IGZvciB0aGUgY3VycmVudCBibG9jay4gIEl0IGNvbnNpc3RzCisgICAgLy8vIG9mIGEgdmJyNSBmb3IgIyBvcGVyYW5kIGluZm9zLiAgRWFjaCBvcGVyYW5kIGluZm8gaXMgZW1pdHRlZCB3aXRoIGEKKyAgICAvLy8gc2luZ2xlIGJpdCB0byBpbmRpY2F0ZSBpZiBpdCBpcyBhIGxpdGVyYWwgZW5jb2RpbmcuICBJZiBzbywgdGhlIHZhbHVlIGlzCisgICAgLy8vIGVtaXR0ZWQgd2l0aCBhIHZicjguICBJZiBub3QsIHRoZSBlbmNvZGluZyBpcyBlbWl0dGVkIGFzIDMgYml0cyBmb2xsb3dlZAorICAgIC8vLyBieSB0aGUgaW5mbyB2YWx1ZSBhcyBhIHZicjUgaWYgbmVlZGVkLgorICAgIERFRklORV9BQkJSRVYgPSAyLAorCisgICAgLy8gVU5BQkJSRVZfUkVDT1JEcyBhcmUgZW1pdHRlZCB3aXRoIGEgdmJyNiBmb3IgdGhlIHJlY29yZCBjb2RlLCBmb2xsb3dlZCBieQorICAgIC8vIGEgdmJyNiBmb3IgdGhlICMgb3BlcmFuZHMsIGZvbGxvd2VkIGJ5IHZicjYncyBmb3IgZWFjaCBvcGVyYW5kLgorICAgIFVOQUJCUkVWX1JFQ09SRCA9IDMsCisKKyAgICAvLyBUaGlzIGlzIG5vdCBhIGNvZGUsIHRoaXMgaXMgYSBtYXJrZXIgZm9yIHRoZSBmaXJzdCBhYmJyZXYgYXNzaWdubWVudC4KKyAgICBGSVJTVF9BUFBMSUNBVElPTl9BQkJSRVYgPSA0CisgIH07CisKKyAgLy8vIFN0YW5kYXJkQmxvY2tJRHMgLSBBbGwgYml0Y29kZSBmaWxlcyBjYW4gb3B0aW9uYWxseSBpbmNsdWRlIGEgQkxPQ0tJTkZPCisgIC8vLyBibG9jaywgd2hpY2ggY29udGFpbnMgbWV0YWRhdGEgYWJvdXQgb3RoZXIgYmxvY2tzIGluIHRoZSBmaWxlLgorICBlbnVtIFN0YW5kYXJkQmxvY2tJRHMgeworICAgIC8vLyBCTE9DS0lORk9fQkxPQ0sgaXMgdXNlZCB0byBkZWZpbmUgbWV0YWRhdGEgYWJvdXQgYmxvY2tzLCBmb3IgZXhhbXBsZSwKKyAgICAvLy8gc3RhbmRhcmQgYWJicmV2cyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgdG8gYWxsIGJsb2NrcyBvZiBhIHNwZWNpZmllZAorICAgIC8vLyBJRC4KKyAgICBCTE9DS0lORk9fQkxPQ0tfSUQgPSAwLAorCisgICAgLy8gQmxvY2sgSURzIDEtNyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24uCisgICAgRklSU1RfQVBQTElDQVRJT05fQkxPQ0tJRCA9IDgKKyAgfTsKKworICAvLy8gQmxvY2tJbmZvQ29kZXMgLSBUaGUgYmxvY2tpbmZvIGJsb2NrIGNvbnRhaW5zIG1ldGFkYXRhIGFib3V0IHVzZXItZGVmaW5lZAorICAvLy8gYmxvY2tzLgorICBlbnVtIEJsb2NrSW5mb0NvZGVzIHsKKyAgICAvLyBERUZJTkVfQUJCUkVWIGhhcyBtYWdpYyBzZW1hbnRpY3MgaGVyZSwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgU0VUQklEJ2QKKyAgICAvLyBibG9jaywgaW5zdGVhZCBvZiB0aGUgQmxvY2tJbmZvIGJsb2NrLgorICAgIAorICAgIEJMT0NLSU5GT19DT0RFX1NFVEJJRCA9IDEsICAgICAgIC8vIFNFVEJJRDogW2Jsb2NraWQjXQorICAgIEJMT0NLSU5GT19DT0RFX0JMT0NLTkFNRSA9IDIsICAgIC8vIEJMT0NLTkFNRTogW25hbWVdCisgICAgQkxPQ0tJTkZPX0NPREVfU0VUUkVDT1JETkFNRSA9IDMgLy8gQkxPQ0tJTkZPX0NPREVfU0VUUkVDT1JETkFNRTogW2lkLCBuYW1lXQorICB9OworCit9IC8vIEVuZCBiaXRjIG5hbWVzcGFjZQorCisvLy8gQml0Q29kZUFiYnJldk9wIC0gVGhpcyBkZXNjcmliZXMgb25lIG9yIG1vcmUgb3BlcmFuZHMgaW4gYW4gYWJicmV2aWF0aW9uLgorLy8vIFRoaXMgaXMgYWN0dWFsbHkgYSB1bmlvbiBvZiB0d28gZGlmZmVyZW50IHRoaW5nczoKKy8vLyAgIDEuIEl0IGNvdWxkIGJlIGEgbGl0ZXJhbCBpbnRlZ2VyIHZhbHVlICgidGhlIG9wZXJhbmQgaXMgYWx3YXlzIDE3IikuCisvLy8gICAyLiBJdCBjb3VsZCBiZSBhbiBlbmNvZGluZyBzcGVjaWZpY2F0aW9uICgidGhpcyBvcGVyYW5kIGVuY29kZWQgbGlrZSBzbyIpLgorLy8vCitjbGFzcyBCaXRDb2RlQWJicmV2T3AgeworICB1aW50NjRfdCBWYWw7ICAgICAgICAgICAvLyBBIGxpdGVyYWwgdmFsdWUgb3IgZGF0YSBmb3IgYW4gZW5jb2RpbmcuCisgIGJvb2wgSXNMaXRlcmFsIDogMTsgICAgIC8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhIGxpdGVyYWwgdmFsdWUgb3Igbm90LgorICB1bnNpZ25lZCBFbmMgICA6IDM7ICAgICAvLyBUaGUgZW5jb2RpbmcgdG8gdXNlLgorcHVibGljOgorICBlbnVtIEVuY29kaW5nIHsKKyAgICBGaXhlZCA9IDEsICAvLyBBIGZpeGVkIHdpZHRoIGZpZWxkLCBWYWwgc3BlY2lmaWVzIG51bWJlciBvZiBiaXRzLgorICAgIFZCUiAgID0gMiwgIC8vIEEgVkJSIGZpZWxkIHdoZXJlIFZhbCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIGVhY2ggY2h1bmsuCisgICAgQXJyYXkgPSAzLCAgLy8gQSBzZXF1ZW5jZSBvZiBmaWVsZHMsIG5leHQgZmllbGQgc3BlY2llcyBlbHQgZW5jb2RpbmcuCisgICAgQ2hhcjYgPSA0LCAgLy8gQSA2LWJpdCBmaXhlZCBmaWVsZCB3aGljaCBtYXBzIHRvIFthLXpBLVowLTkuX10uCisgICAgQmxvYiAgPSA1ICAgLy8gMzItYml0IGFsaWduZWQgYXJyYXkgb2YgOC1iaXQgY2hhcmFjdGVycy4KKyAgfTsKKworICBleHBsaWNpdCBCaXRDb2RlQWJicmV2T3AodWludDY0X3QgVikgOiAgVmFsKFYpLCBJc0xpdGVyYWwodHJ1ZSkge30KKyAgZXhwbGljaXQgQml0Q29kZUFiYnJldk9wKEVuY29kaW5nIEUsIHVpbnQ2NF90IERhdGEgPSAwKQorICAgIDogVmFsKERhdGEpLCBJc0xpdGVyYWwoZmFsc2UpLCBFbmMoRSkge30KKworICBib29sIGlzTGl0ZXJhbCgpIGNvbnN0IHsgcmV0dXJuIElzTGl0ZXJhbDsgfQorICBib29sIGlzRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiAhSXNMaXRlcmFsOyB9CisKKyAgLy8gQWNjZXNzb3JzIGZvciBsaXRlcmFscy4KKyAgdWludDY0X3QgZ2V0TGl0ZXJhbFZhbHVlKCkgY29uc3QgeyBhc3NlcnQoaXNMaXRlcmFsKCkpOyByZXR1cm4gVmFsOyB9CisKKyAgLy8gQWNjZXNzb3JzIGZvciBlbmNvZGluZyBpbmZvLgorICBFbmNvZGluZyBnZXRFbmNvZGluZygpIGNvbnN0IHsgYXNzZXJ0KGlzRW5jb2RpbmcoKSk7IHJldHVybiAoRW5jb2RpbmcpRW5jOyB9CisgIHVpbnQ2NF90IGdldEVuY29kaW5nRGF0YSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNFbmNvZGluZygpICYmIGhhc0VuY29kaW5nRGF0YSgpKTsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgYm9vbCBoYXNFbmNvZGluZ0RhdGEoKSBjb25zdCB7IHJldHVybiBoYXNFbmNvZGluZ0RhdGEoZ2V0RW5jb2RpbmcoKSk7IH0KKyAgc3RhdGljIGJvb2wgaGFzRW5jb2RpbmdEYXRhKEVuY29kaW5nIEUpIHsKKyAgICBzd2l0Y2ggKEUpIHsKKyAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biBlbmNvZGluZyIpOworICAgIGNhc2UgRml4ZWQ6CisgICAgY2FzZSBWQlI6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEFycmF5OgorICAgIGNhc2UgQ2hhcjY6CisgICAgY2FzZSBCbG9iOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vLyBpc0NoYXI2IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBjaGFyYWN0ZXIgaXMgbGVnYWwgaW4gdGhlIENoYXI2IGVuY29kaW5nLgorICBzdGF0aWMgYm9vbCBpc0NoYXI2KGNoYXIgQykgeworICAgIGlmIChDID49ICdhJyAmJiBDIDw9ICd6JykgcmV0dXJuIHRydWU7CisgICAgaWYgKEMgPj0gJ0EnICYmIEMgPD0gJ1onKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoQyA+PSAnMCcgJiYgQyA8PSAnOScpIHJldHVybiB0cnVlOworICAgIGlmIChDID09ICcuJyB8fCBDID09ICdfJykgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBFbmNvZGVDaGFyNihjaGFyIEMpIHsKKyAgICBpZiAoQyA+PSAnYScgJiYgQyA8PSAneicpIHJldHVybiBDLSdhJzsKKyAgICBpZiAoQyA+PSAnQScgJiYgQyA8PSAnWicpIHJldHVybiBDLSdBJysyNjsKKyAgICBpZiAoQyA+PSAnMCcgJiYgQyA8PSAnOScpIHJldHVybiBDLScwJysyNisyNjsKKyAgICBpZiAoQyA9PSAnLicpIHJldHVybiA2MjsKKyAgICBpZiAoQyA9PSAnXycpIHJldHVybiA2MzsKKyAgICBhc3NlcnQoMCAmJiAiTm90IGEgdmFsdWUgQ2hhcjYgY2hhcmFjdGVyISIpOworICAgIHJldHVybiAwOworICB9CisKKyAgc3RhdGljIGNoYXIgRGVjb2RlQ2hhcjYodW5zaWduZWQgVikgeworICAgIGFzc2VydCgoViAmIH42MykgPT0gMCAmJiAiTm90IGEgQ2hhcjYgZW5jb2RlZCBjaGFyYWN0ZXIhIik7CisgICAgaWYgKFYgPCAyNikgcmV0dXJuIFYrJ2EnOworICAgIGlmIChWIDwgMjYrMjYpIHJldHVybiBWLTI2KydBJzsKKyAgICBpZiAoViA8IDI2KzI2KzEwKSByZXR1cm4gVi0yNi0yNisnMCc7CisgICAgaWYgKFYgPT0gNjIpIHJldHVybiAnLic7CisgICAgaWYgKFYgPT0gNjMpIHJldHVybiAnXyc7CisgICAgYXNzZXJ0KDAgJiYgIk5vdCBhIHZhbHVlIENoYXI2IGNoYXJhY3RlciEiKTsKKyAgICByZXR1cm4gJyAnOworICB9CisKK307CisKKy8vLyBCaXRDb2RlQWJicmV2IC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFiYnJldmlhdGlvbiByZWNvcmQuICBBbgorLy8vIGFiYnJldmlhdGlvbiBhbGxvd3MgYSBjb21wbGV4IHJlY29yZCB0aGF0IGhhcyByZWR1bmRhbmN5IHRvIGJlIHN0b3JlZCBpbiBhCisvLy8gc3BlY2lhbGl6ZWQgZm9ybWF0IGluc3RlYWQgb2YgdGhlIGZ1bGx5LWdlbmVyYWwsIGZ1bGx5LXZiciwgZm9ybWF0LgorY2xhc3MgQml0Q29kZUFiYnJldiB7CisgIFNtYWxsVmVjdG9yPEJpdENvZGVBYmJyZXZPcCwgOD4gT3BlcmFuZExpc3Q7CisgIHVuc2lnbmVkIGNoYXIgUmVmQ291bnQ7IC8vIE51bWJlciBvZiB0aGluZ3MgdXNpbmcgdGhpcy4KKyAgfkJpdENvZGVBYmJyZXYoKSB7fQorcHVibGljOgorICBCaXRDb2RlQWJicmV2KCkgOiBSZWZDb3VudCgxKSB7fQorCisgIHZvaWQgYWRkUmVmKCkgeyArK1JlZkNvdW50OyB9CisgIHZvaWQgZHJvcFJlZigpIHsgaWYgKC0tUmVmQ291bnQgPT0gMCkgZGVsZXRlIHRoaXM7IH0KKworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kSW5mb3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihPcGVyYW5kTGlzdC5zaXplKCkpOworICB9CisgIGNvbnN0IEJpdENvZGVBYmJyZXZPcCAmZ2V0T3BlcmFuZEluZm8odW5zaWduZWQgTikgY29uc3QgeworICAgIHJldHVybiBPcGVyYW5kTGlzdFtOXTsKKyAgfQorCisgIHZvaWQgQWRkKGNvbnN0IEJpdENvZGVBYmJyZXZPcCAmT3BJbmZvKSB7CisgICAgT3BlcmFuZExpc3QucHVzaF9iYWNrKE9wSW5mbyk7CisgIH0KK307Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdHN0cmVhbVJlYWRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0c3RyZWFtUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5ZWY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdHN0cmVhbVJlYWRlci5oCkBAIC0wLDAgKzEsNjQyIEBACisvLz09PS0gQml0c3RyZWFtUmVhZGVyLmggLSBMb3ctbGV2ZWwgYml0c3RyZWFtIHJlYWRlciBpbnRlcmZhY2UgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEJpdHN0cmVhbVJlYWRlciBjbGFzcy4gIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8KKy8vIHJlYWQgYW4gYXJiaXRyYXJ5IGJpdHN0cmVhbSwgcmVnYXJkbGVzcyBvZiBpdHMgY29udGVudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBCSVRTVFJFQU1fUkVBREVSX0gKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9ICisKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvQml0Q29kZXMuaCIKKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBEZXNlcmlhbGl6ZXI7CisKK2NsYXNzIEJpdHN0cmVhbVJlYWRlciB7CitwdWJsaWM6CisgIC8vLyBCbG9ja0luZm8gLSBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGVtaXR0ZWQgdG8gQkxPQ0tJTkZPX0JMT0NLIGJsb2Nrcy4KKyAgLy8vIFRoZXNlIGRlc2NyaWJlIGFiYnJldmlhdGlvbnMgdGhhdCBhbGwgYmxvY2tzIG9mIHRoZSBzcGVjaWZpZWQgSUQgaW5oZXJpdC4KKyAgc3RydWN0IEJsb2NrSW5mbyB7CisgICAgdW5zaWduZWQgQmxvY2tJRDsKKyAgICBzdGQ6OnZlY3RvcjxCaXRDb2RlQWJicmV2Kj4gQWJicmV2czsKKyAgICBzdGQ6OnN0cmluZyBOYW1lOworICAgIAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgc3RkOjpzdHJpbmc+ID4gUmVjb3JkTmFtZXM7CisgIH07Citwcml2YXRlOgorICAvLy8gRmlyc3RDaGFyL0xhc3RDaGFyIC0gVGhpcyByZW1lbWJlcnMgdGhlIGZpcnN0IGFuZCBsYXN0IGJ5dGVzIG9mIHRoZQorICAvLy8gc3RyZWFtLgorICBjb25zdCB1bnNpZ25lZCBjaGFyICpGaXJzdENoYXIsICpMYXN0Q2hhcjsKKyAgCisgIHN0ZDo6dmVjdG9yPEJsb2NrSW5mbz4gQmxvY2tJbmZvUmVjb3JkczsKKworICAvLy8gSWdub3JlQmxvY2tJbmZvTmFtZXMgLSBUaGlzIGlzIHNldCB0byB0cnVlIGlmIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlCisgIC8vLyBibG9jay9yZWNvcmQgbmFtZSBpbmZvcm1hdGlvbiBpbiB0aGUgQmxvY2tJbmZvIGJsb2NrLiBPbmx5IGxsdm0tYmNhbmFseXplcgorICAvLy8gdXNlcyB0aGlzLgorICBib29sIElnbm9yZUJsb2NrSW5mb05hbWVzOworICAKKyAgQml0c3RyZWFtUmVhZGVyKGNvbnN0IEJpdHN0cmVhbVJlYWRlciYpOyAgLy8gTk9UIElNUExFTUVOVEVECisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEJpdHN0cmVhbVJlYWRlciYpOyAgLy8gTk9UIElNUExFTUVOVEVECitwdWJsaWM6CisgIEJpdHN0cmVhbVJlYWRlcigpIDogRmlyc3RDaGFyKDApLCBMYXN0Q2hhcigwKSwgSWdub3JlQmxvY2tJbmZvTmFtZXModHJ1ZSkgeworICB9CisKKyAgQml0c3RyZWFtUmVhZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKlN0YXJ0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpFbmQpIHsKKyAgICBJZ25vcmVCbG9ja0luZm9OYW1lcyA9IHRydWU7CisgICAgaW5pdChTdGFydCwgRW5kKTsKKyAgfQorCisgIHZvaWQgaW5pdChjb25zdCB1bnNpZ25lZCBjaGFyICpTdGFydCwgY29uc3QgdW5zaWduZWQgY2hhciAqRW5kKSB7CisgICAgRmlyc3RDaGFyID0gU3RhcnQ7CisgICAgTGFzdENoYXIgPSBFbmQ7CisgICAgYXNzZXJ0KCgoRW5kLVN0YXJ0KSAmIDMpID09IDAgJiYiQml0Y29kZSBzdHJlYW0gbm90IGEgbXVsdGlwbGUgb2YgNCBieXRlcyIpOworICB9CisKKyAgfkJpdHN0cmVhbVJlYWRlcigpIHsKKyAgICAvLyBGcmVlIHRoZSBCbG9ja0luZm9SZWNvcmRzLgorICAgIHdoaWxlICghQmxvY2tJbmZvUmVjb3Jkcy5lbXB0eSgpKSB7CisgICAgICBCbG9ja0luZm8gJkluZm8gPSBCbG9ja0luZm9SZWNvcmRzLmJhY2soKTsKKyAgICAgIC8vIEZyZWUgYmxvY2tpbmZvIGFiYnJldiBpbmZvLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihJbmZvLkFiYnJldnMuc2l6ZSgpKTsKKyAgICAgICAgICAgaSAhPSBlOyArK2kpCisgICAgICAgIEluZm8uQWJicmV2c1tpXS0+ZHJvcFJlZigpOworICAgICAgQmxvY2tJbmZvUmVjb3Jkcy5wb3BfYmFjaygpOworICAgIH0KKyAgfQorICAKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZ2V0Rmlyc3RDaGFyKCkgY29uc3QgeyByZXR1cm4gRmlyc3RDaGFyOyB9CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmdldExhc3RDaGFyKCkgY29uc3QgeyByZXR1cm4gTGFzdENoYXI7IH0KKworICAvLy8gQ29sbGVjdEJsb2NrSW5mb05hbWVzIC0gVGhpcyBpcyBjYWxsZWQgYnkgY2xpZW50cyB0aGF0IHdhbnQgYmxvY2svcmVjb3JkCisgIC8vLyBuYW1lIGluZm9ybWF0aW9uLgorICB2b2lkIENvbGxlY3RCbG9ja0luZm9OYW1lcygpIHsgSWdub3JlQmxvY2tJbmZvTmFtZXMgPSBmYWxzZTsgfQorICBib29sIGlzSWdub3JpbmdCbG9ja0luZm9OYW1lcygpIHsgcmV0dXJuIElnbm9yZUJsb2NrSW5mb05hbWVzOyB9CisgIAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQmxvY2sgTWFuaXB1bGF0aW9uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBoYXNCbG9ja0luZm9SZWNvcmRzIC0gUmV0dXJuIHRydWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIGFuZCBwcm9jZXNzZWQgdGhlCisgIC8vLyBibG9jayBpbmZvIGJsb2NrIGZvciB0aGlzIEJpdHN0cmVhbS4gIFdlIG9ubHkgcHJvY2VzcyBpdCBmb3IgdGhlIGZpcnN0CisgIC8vLyBjdXJzb3IgdGhhdCB3YWxrcyBvdmVyIGl0LgorICBib29sIGhhc0Jsb2NrSW5mb1JlY29yZHMoKSBjb25zdCB7IHJldHVybiAhQmxvY2tJbmZvUmVjb3Jkcy5lbXB0eSgpOyB9CisgIAorICAvLy8gZ2V0QmxvY2tJbmZvIC0gSWYgdGhlcmUgaXMgYmxvY2sgaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBJRCwgcmV0dXJuIGl0LAorICAvLy8gb3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBjb25zdCBCbG9ja0luZm8gKmdldEJsb2NrSW5mbyh1bnNpZ25lZCBCbG9ja0lEKSBjb25zdCB7CisgICAgLy8gQ29tbW9uIGNhc2UsIHRoZSBtb3N0IHJlY2VudCBlbnRyeSBtYXRjaGVzIEJsb2NrSUQuCisgICAgaWYgKCFCbG9ja0luZm9SZWNvcmRzLmVtcHR5KCkgJiYgQmxvY2tJbmZvUmVjb3Jkcy5iYWNrKCkuQmxvY2tJRCA9PSBCbG9ja0lEKQorICAgICAgcmV0dXJuICZCbG9ja0luZm9SZWNvcmRzLmJhY2soKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQmxvY2tJbmZvUmVjb3Jkcy5zaXplKCkpOworICAgICAgICAgaSAhPSBlOyArK2kpCisgICAgICBpZiAoQmxvY2tJbmZvUmVjb3Jkc1tpXS5CbG9ja0lEID09IEJsb2NrSUQpCisgICAgICAgIHJldHVybiAmQmxvY2tJbmZvUmVjb3Jkc1tpXTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIEJsb2NrSW5mbyAmZ2V0T3JDcmVhdGVCbG9ja0luZm8odW5zaWduZWQgQmxvY2tJRCkgeworICAgIGlmIChjb25zdCBCbG9ja0luZm8gKkJJID0gZ2V0QmxvY2tJbmZvKEJsb2NrSUQpKQorICAgICAgcmV0dXJuICpjb25zdF9jYXN0PEJsb2NrSW5mbyo+KEJJKTsKKworICAgIC8vIE90aGVyd2lzZSwgYWRkIGEgbmV3IHJlY29yZC4KKyAgICBCbG9ja0luZm9SZWNvcmRzLnB1c2hfYmFjayhCbG9ja0luZm8oKSk7CisgICAgQmxvY2tJbmZvUmVjb3Jkcy5iYWNrKCkuQmxvY2tJRCA9IEJsb2NrSUQ7CisgICAgcmV0dXJuIEJsb2NrSW5mb1JlY29yZHMuYmFjaygpOworICB9CisKK307CisKK2NsYXNzIEJpdHN0cmVhbUN1cnNvciB7CisgIGZyaWVuZCBjbGFzcyBEZXNlcmlhbGl6ZXI7CisgIEJpdHN0cmVhbVJlYWRlciAqQml0U3RyZWFtOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpOZXh0Q2hhcjsKKyAgCisgIC8vLyBDdXJXb3JkIC0gVGhpcyBpcyB0aGUgY3VycmVudCBkYXRhIHdlIGhhdmUgcHVsbGVkIGZyb20gdGhlIHN0cmVhbSBidXQgaGF2ZQorICAvLy8gbm90IHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgIHVpbnQzMl90IEN1cldvcmQ7CisgIAorICAvLy8gQml0c0luQ3VyV29yZCAtIFRoaXMgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluIEN1cldvcmQgdGhhdCBhcmUgdmFsaWQuIFRoaXMKKyAgLy8vIGlzIGFsd2F5cyBmcm9tIFswLi4uMzFdIGluY2x1c2l2ZS4KKyAgdW5zaWduZWQgQml0c0luQ3VyV29yZDsKKyAgCisgIC8vIEN1ckNvZGVTaXplIC0gVGhpcyBpcyB0aGUgZGVjbGFyZWQgc2l6ZSBvZiBjb2RlIHZhbHVlcyB1c2VkIGZvciB0aGUgY3VycmVudAorICAvLyBibG9jaywgaW4gYml0cy4KKyAgdW5zaWduZWQgQ3VyQ29kZVNpemU7CisgIAorICAvLy8gQ3VyQWJicmV2cyAtIEFiYnJldnMgaW5zdGFsbGVkIGF0IGluIHRoaXMgYmxvY2suCisgIHN0ZDo6dmVjdG9yPEJpdENvZGVBYmJyZXYqPiBDdXJBYmJyZXZzOworICAKKyAgc3RydWN0IEJsb2NrIHsKKyAgICB1bnNpZ25lZCBQcmV2Q29kZVNpemU7CisgICAgc3RkOjp2ZWN0b3I8Qml0Q29kZUFiYnJldio+IFByZXZBYmJyZXZzOworICAgIGV4cGxpY2l0IEJsb2NrKHVuc2lnbmVkIFBDUykgOiBQcmV2Q29kZVNpemUoUENTKSB7fQorICB9OworICAKKyAgLy8vIEJsb2NrU2NvcGUgLSBUaGlzIHRyYWNrcyB0aGUgY29kZXNpemUgb2YgcGFyZW50IGJsb2Nrcy4KKyAgU21hbGxWZWN0b3I8QmxvY2ssIDg+IEJsb2NrU2NvcGU7CisgIAorcHVibGljOgorICBCaXRzdHJlYW1DdXJzb3IoKSA6IEJpdFN0cmVhbSgwKSwgTmV4dENoYXIoMCkgeworICB9CisgIEJpdHN0cmVhbUN1cnNvcihjb25zdCBCaXRzdHJlYW1DdXJzb3IgJlJIUykgOiBCaXRTdHJlYW0oMCksIE5leHRDaGFyKDApIHsKKyAgICBvcGVyYXRvcj0oUkhTKTsKKyAgfQorICAKKyAgZXhwbGljaXQgQml0c3RyZWFtQ3Vyc29yKEJpdHN0cmVhbVJlYWRlciAmUikgOiBCaXRTdHJlYW0oJlIpIHsKKyAgICBOZXh0Q2hhciA9IFIuZ2V0Rmlyc3RDaGFyKCk7CisgICAgYXNzZXJ0KE5leHRDaGFyICYmICJCaXRzdHJlYW0gbm90IGluaXRpYWxpemVkIHlldCIpOworICAgIEN1cldvcmQgPSAwOworICAgIEJpdHNJbkN1cldvcmQgPSAwOworICAgIEN1ckNvZGVTaXplID0gMjsKKyAgfQorICAKKyAgdm9pZCBpbml0KEJpdHN0cmVhbVJlYWRlciAmUikgeworICAgIGZyZWVTdGF0ZSgpOworICAgIAorICAgIEJpdFN0cmVhbSA9ICZSOworICAgIE5leHRDaGFyID0gUi5nZXRGaXJzdENoYXIoKTsKKyAgICBhc3NlcnQoTmV4dENoYXIgJiYgIkJpdHN0cmVhbSBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgQ3VyV29yZCA9IDA7CisgICAgQml0c0luQ3VyV29yZCA9IDA7CisgICAgQ3VyQ29kZVNpemUgPSAyOworICB9CisgIAorICB+Qml0c3RyZWFtQ3Vyc29yKCkgeworICAgIGZyZWVTdGF0ZSgpOworICB9CisgIAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBCaXRzdHJlYW1DdXJzb3IgJlJIUykgeworICAgIGZyZWVTdGF0ZSgpOworICAgIAorICAgIEJpdFN0cmVhbSA9IFJIUy5CaXRTdHJlYW07CisgICAgTmV4dENoYXIgPSBSSFMuTmV4dENoYXI7CisgICAgQ3VyV29yZCA9IFJIUy5DdXJXb3JkOworICAgIEJpdHNJbkN1cldvcmQgPSBSSFMuQml0c0luQ3VyV29yZDsKKyAgICBDdXJDb2RlU2l6ZSA9IFJIUy5DdXJDb2RlU2l6ZTsKKyAgICAKKyAgICAvLyBDb3B5IGFiYnJldmlhdGlvbnMsIGFuZCBidW1wIHJlZiBjb3VudHMuCisgICAgQ3VyQWJicmV2cyA9IFJIUy5DdXJBYmJyZXZzOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQ3VyQWJicmV2cy5zaXplKCkpOworICAgICAgICAgaSAhPSBlOyArK2kpCisgICAgICBDdXJBYmJyZXZzW2ldLT5hZGRSZWYoKTsKKyAgICAKKyAgICAvLyBDb3B5IGJsb2NrIHNjb3BlIGFuZCBidW1wIHJlZiBjb3VudHMuCisgICAgZm9yICh1bnNpZ25lZCBTID0gMCwgZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihCbG9ja1Njb3BlLnNpemUoKSk7CisgICAgICAgICBTICE9IGU7ICsrUykgeworICAgICAgc3RkOjp2ZWN0b3I8Qml0Q29kZUFiYnJldio+ICZBYmJyZXZzID0gQmxvY2tTY29wZVtTXS5QcmV2QWJicmV2czsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQWJicmV2cy5zaXplKCkpOworICAgICAgICAgICBpICE9IGU7ICsraSkKKyAgICAgICAgQWJicmV2c1tpXS0+YWRkUmVmKCk7CisgICAgfQorICB9CisgIAorICB2b2lkIGZyZWVTdGF0ZSgpIHsKKyAgICAvLyBGcmVlIGFsbCB0aGUgQWJicmV2cy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEN1ckFiYnJldnMuc2l6ZSgpKTsKKyAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgQ3VyQWJicmV2c1tpXS0+ZHJvcFJlZigpOworICAgIEN1ckFiYnJldnMuY2xlYXIoKTsKKyAgICAKKyAgICAvLyBGcmVlIGFsbCB0aGUgQWJicmV2cyBpbiB0aGUgYmxvY2sgc2NvcGUuCisgICAgZm9yICh1bnNpZ25lZCBTID0gMCwgZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihCbG9ja1Njb3BlLnNpemUoKSk7CisgICAgICAgICBTICE9IGU7ICsrUykgeworICAgICAgc3RkOjp2ZWN0b3I8Qml0Q29kZUFiYnJldio+ICZBYmJyZXZzID0gQmxvY2tTY29wZVtTXS5QcmV2QWJicmV2czsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQWJicmV2cy5zaXplKCkpOworICAgICAgICAgICBpICE9IGU7ICsraSkKKyAgICAgICAgQWJicmV2c1tpXS0+ZHJvcFJlZigpOworICAgIH0KKyAgICBCbG9ja1Njb3BlLmNsZWFyKCk7CisgIH0KKyAgCisgIC8vLyBHZXRBYmJyZXZJRFdpZHRoIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGVuY29kZSBhbiBhYmJyZXYgIy4KKyAgdW5zaWduZWQgR2V0QWJicmV2SURXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIEN1ckNvZGVTaXplOyB9CisgIAorICBib29sIEF0RW5kT2ZTdHJlYW0oKSBjb25zdCB7CisgICAgcmV0dXJuIE5leHRDaGFyID09IEJpdFN0cmVhbS0+Z2V0TGFzdENoYXIoKSAmJiBCaXRzSW5DdXJXb3JkID09IDA7CisgIH0KKyAgCisgIC8vLyBHZXRDdXJyZW50Qml0Tm8gLSBSZXR1cm4gdGhlIGJpdCAjIG9mIHRoZSBiaXQgd2UgYXJlIHJlYWRpbmcuCisgIHVpbnQ2NF90IEdldEN1cnJlbnRCaXRObygpIGNvbnN0IHsKKyAgICByZXR1cm4gKE5leHRDaGFyLUJpdFN0cmVhbS0+Z2V0Rmlyc3RDaGFyKCkpKkNIQVJfQklUIC0gQml0c0luQ3VyV29yZDsKKyAgfQorICAKKyAgQml0c3RyZWFtUmVhZGVyICpnZXRCaXRTdHJlYW1SZWFkZXIoKSB7CisgICAgcmV0dXJuIEJpdFN0cmVhbTsKKyAgfQorICBjb25zdCBCaXRzdHJlYW1SZWFkZXIgKmdldEJpdFN0cmVhbVJlYWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0U3RyZWFtOworICB9CisgIAorICAKKyAgLy8vIEp1bXBUb0JpdCAtIFJlc2V0IHRoZSBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZCBiaXQgbnVtYmVyLgorICB2b2lkIEp1bXBUb0JpdCh1aW50NjRfdCBCaXRObykgeworICAgIHVpbnRwdHJfdCBCeXRlTm8gPSB1aW50cHRyX3QoQml0Tm8vOCkgJiB+MzsKKyAgICB1aW50cHRyX3QgV29yZEJpdE5vID0gdWludHB0cl90KEJpdE5vKSAmIDMxOworICAgIGFzc2VydChCeXRlTm8gPD0gKHVpbnRwdHJfdCkoQml0U3RyZWFtLT5nZXRMYXN0Q2hhcigpLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0U3RyZWFtLT5nZXRGaXJzdENoYXIoKSkgJiYKKyAgICAgICAgICAgIkludmFsaWQgbG9jYXRpb24iKTsKKyAgICAKKyAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHJpZ2h0IHdvcmQuCisgICAgTmV4dENoYXIgPSBCaXRTdHJlYW0tPmdldEZpcnN0Q2hhcigpK0J5dGVObzsKKyAgICBCaXRzSW5DdXJXb3JkID0gMDsKKyAgICBDdXJXb3JkID0gMDsKKyAgICAKKyAgICAvLyBTa2lwIG92ZXIgYW55IGJpdHMgdGhhdCBhcmUgYWxyZWFkeSBjb25zdW1lZC4KKyAgICBpZiAoV29yZEJpdE5vKQorICAgICAgUmVhZChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oV29yZEJpdE5vKSk7CisgIH0KKyAgCisgIAorICB1aW50MzJfdCBSZWFkKHVuc2lnbmVkIE51bUJpdHMpIHsKKyAgICBhc3NlcnQoTnVtQml0cyA8PSAzMiAmJiAiQ2Fubm90IHJldHVybiBtb3JlIHRoYW4gMzIgYml0cyEiKTsKKyAgICAvLyBJZiB0aGUgZmllbGQgaXMgZnVsbHkgY29udGFpbmVkIGJ5IEN1cldvcmQsIHJldHVybiBpdCBxdWlja2x5LgorICAgIGlmIChCaXRzSW5DdXJXb3JkID49IE51bUJpdHMpIHsKKyAgICAgIHVpbnQzMl90IFIgPSBDdXJXb3JkICYgKCgxVSA8PCBOdW1CaXRzKS0xKTsKKyAgICAgIEN1cldvcmQgPj49IE51bUJpdHM7CisgICAgICBCaXRzSW5DdXJXb3JkIC09IE51bUJpdHM7CisgICAgICByZXR1cm4gUjsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBydW4gb3V0IG9mIGRhdGEsIHN0b3AgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICAgIGlmIChOZXh0Q2hhciA9PSBCaXRTdHJlYW0tPmdldExhc3RDaGFyKCkpIHsKKyAgICAgIEN1cldvcmQgPSAwOworICAgICAgQml0c0luQ3VyV29yZCA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBSID0gQ3VyV29yZDsKKworICAgIC8vIFJlYWQgdGhlIG5leHQgd29yZCBmcm9tIHRoZSBzdHJlYW0uCisgICAgQ3VyV29yZCA9IChOZXh0Q2hhclswXSA8PCAgMCkgfCAoTmV4dENoYXJbMV0gPDwgOCkgfAorICAgICAgICAgICAgICAoTmV4dENoYXJbMl0gPDwgMTYpIHwgKE5leHRDaGFyWzNdIDw8IDI0KTsKKyAgICBOZXh0Q2hhciArPSA0OworCisgICAgLy8gRXh0cmFjdCBOdW1CaXRzLUJpdHNJbkN1cldvcmQgZnJvbSB3aGF0IHdlIGp1c3QgcmVhZC4KKyAgICB1bnNpZ25lZCBCaXRzTGVmdCA9IE51bUJpdHMtQml0c0luQ3VyV29yZDsKKworICAgIC8vIEJlIGNhcmVmdWwgaGVyZSwgQml0c0xlZnQgaXMgaW4gdGhlIHJhbmdlIFsxLi4zMl0gaW5jbHVzaXZlLgorICAgIFIgfD0gKEN1cldvcmQgJiAofjBVID4+ICgzMi1CaXRzTGVmdCkpKSA8PCBCaXRzSW5DdXJXb3JkOworCisgICAgLy8gQml0c0xlZnQgYml0cyBoYXZlIGp1c3QgYmVlbiB1c2VkIHVwIGZyb20gQ3VyV29yZC4KKyAgICBpZiAoQml0c0xlZnQgIT0gMzIpCisgICAgICBDdXJXb3JkID4+PSBCaXRzTGVmdDsKKyAgICBlbHNlCisgICAgICBDdXJXb3JkID0gMDsKKyAgICBCaXRzSW5DdXJXb3JkID0gMzItQml0c0xlZnQ7CisgICAgcmV0dXJuIFI7CisgIH0KKworICB1aW50NjRfdCBSZWFkNjQodW5zaWduZWQgTnVtQml0cykgeworICAgIGlmIChOdW1CaXRzIDw9IDMyKSByZXR1cm4gUmVhZChOdW1CaXRzKTsKKworICAgIHVpbnQ2NF90IFYgPSBSZWFkKDMyKTsKKyAgICByZXR1cm4gViB8ICh1aW50NjRfdClSZWFkKE51bUJpdHMtMzIpIDw8IDMyOworICB9CisKKyAgdWludDMyX3QgUmVhZFZCUih1bnNpZ25lZCBOdW1CaXRzKSB7CisgICAgdWludDMyX3QgUGllY2UgPSBSZWFkKE51bUJpdHMpOworICAgIGlmICgoUGllY2UgJiAoMVUgPDwgKE51bUJpdHMtMSkpKSA9PSAwKQorICAgICAgcmV0dXJuIFBpZWNlOworCisgICAgdWludDMyX3QgUmVzdWx0ID0gMDsKKyAgICB1bnNpZ25lZCBOZXh0Qml0ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgUmVzdWx0IHw9IChQaWVjZSAmICgoMVUgPDwgKE51bUJpdHMtMSkpLTEpKSA8PCBOZXh0Qml0OworCisgICAgICBpZiAoKFBpZWNlICYgKDFVIDw8IChOdW1CaXRzLTEpKSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKworICAgICAgTmV4dEJpdCArPSBOdW1CaXRzLTE7CisgICAgICBQaWVjZSA9IFJlYWQoTnVtQml0cyk7CisgICAgfQorICB9CisKKyAgLy8gUmVhZFZCUjY0IC0gUmVhZCBhIFZCUiB0aGF0IG1heSBoYXZlIGEgdmFsdWUgdXAgdG8gNjQtYml0cyBpbiBzaXplLiAgVGhlCisgIC8vIGNodW5rIHNpemUgb2YgdGhlIFZCUiBtdXN0IHN0aWxsIGJlIDw9IDMyIGJpdHMgdGhvdWdoLgorICB1aW50NjRfdCBSZWFkVkJSNjQodW5zaWduZWQgTnVtQml0cykgeworICAgIHVpbnQzMl90IFBpZWNlID0gUmVhZChOdW1CaXRzKTsKKyAgICBpZiAoKFBpZWNlICYgKDFVIDw8IChOdW1CaXRzLTEpKSkgPT0gMCkKKyAgICAgIHJldHVybiB1aW50NjRfdChQaWVjZSk7CisKKyAgICB1aW50NjRfdCBSZXN1bHQgPSAwOworICAgIHVuc2lnbmVkIE5leHRCaXQgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICBSZXN1bHQgfD0gdWludDY0X3QoUGllY2UgJiAoKDFVIDw8IChOdW1CaXRzLTEpKS0xKSkgPDwgTmV4dEJpdDsKKworICAgICAgaWYgKChQaWVjZSAmICgxVSA8PCAoTnVtQml0cy0xKSkpID09IDApCisgICAgICAgIHJldHVybiBSZXN1bHQ7CisKKyAgICAgIE5leHRCaXQgKz0gTnVtQml0cy0xOworICAgICAgUGllY2UgPSBSZWFkKE51bUJpdHMpOworICAgIH0KKyAgfQorCisgIHZvaWQgU2tpcFRvV29yZCgpIHsKKyAgICBCaXRzSW5DdXJXb3JkID0gMDsKKyAgICBDdXJXb3JkID0gMDsKKyAgfQorCisgIHVuc2lnbmVkIFJlYWRDb2RlKCkgeworICAgIHJldHVybiBSZWFkKEN1ckNvZGVTaXplKTsKKyAgfQorCisKKyAgLy8gQmxvY2sgaGVhZGVyOgorICAvLyAgICBbRU5URVJfU1VCQkxPQ0ssIGJsb2NraWQsIG5ld2NvZGVsZW4sIDxhbGlnbjRieXRlcz4sIGJsb2NrbGVuXQorCisgIC8vLyBSZWFkU3ViQmxvY2tJRCAtIEhhdmluZyByZWFkIHRoZSBFTlRFUl9TVUJCTE9DSyBjb2RlLCByZWFkIHRoZSBCbG9ja0lEIGZvcgorICAvLy8gdGhlIGJsb2NrLgorICB1bnNpZ25lZCBSZWFkU3ViQmxvY2tJRCgpIHsKKyAgICByZXR1cm4gUmVhZFZCUihiaXRjOjpCbG9ja0lEV2lkdGgpOworICB9CisKKyAgLy8vIFNraXBCbG9jayAtIEhhdmluZyByZWFkIHRoZSBFTlRFUl9TVUJCTE9DSyBhYmJyZXZpZCBhbmQgYSBCbG9ja0lELCBza2lwCisgIC8vLyBvdmVyIHRoZSBib2R5IG9mIHRoaXMgYmxvY2suICBJZiB0aGUgYmxvY2sgcmVjb3JkIGlzIG1hbGZvcm1lZCwgcmV0dXJuCisgIC8vLyB0cnVlLgorICBib29sIFNraXBCbG9jaygpIHsKKyAgICAvLyBSZWFkIGFuZCBpZ25vcmUgdGhlIGNvZGVsZW4gdmFsdWUuICBTaW5jZSB3ZSBhcmUgc2tpcHBpbmcgdGhpcyBibG9jaywgd2UKKyAgICAvLyBkb24ndCBjYXJlIHdoYXQgY29kZSB3aWR0aHMgYXJlIHVzZWQgaW5zaWRlIG9mIGl0LgorICAgIFJlYWRWQlIoYml0Yzo6Q29kZUxlbldpZHRoKTsKKyAgICBTa2lwVG9Xb3JkKCk7CisgICAgdW5zaWduZWQgTnVtV29yZHMgPSBSZWFkKGJpdGM6OkJsb2NrU2l6ZVdpZHRoKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIGJsb2NrIHdhc24ndCBwYXJ0aWFsbHkgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIG9mZnNldCBpc24ndAorICAgIC8vIGJvZ3VzLgorICAgIGlmIChBdEVuZE9mU3RyZWFtKCkgfHwgTmV4dENoYXIrTnVtV29yZHMqNCA+IEJpdFN0cmVhbS0+Z2V0TGFzdENoYXIoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgTmV4dENoYXIgKz0gTnVtV29yZHMqNDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gRW50ZXJTdWJCbG9jayAtIEhhdmluZyByZWFkIHRoZSBFTlRFUl9TVUJCTE9DSyBhYmJyZXZpZCwgZW50ZXIKKyAgLy8vIHRoZSBibG9jaywgYW5kIHJldHVybiB0cnVlIGlmIHRoZSBibG9jayBpcyB2YWxpZC4KKyAgYm9vbCBFbnRlclN1YkJsb2NrKHVuc2lnbmVkIEJsb2NrSUQsIHVuc2lnbmVkICpOdW1Xb3Jkc1AgPSAwKSB7CisgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBibG9jaydzIHN0YXRlIG9uIEJsb2NrU2NvcGUuCisgICAgQmxvY2tTY29wZS5wdXNoX2JhY2soQmxvY2soQ3VyQ29kZVNpemUpKTsKKyAgICBCbG9ja1Njb3BlLmJhY2soKS5QcmV2QWJicmV2cy5zd2FwKEN1ckFiYnJldnMpOworCisgICAgLy8gQWRkIHRoZSBhYmJyZXZzIHNwZWNpZmljIHRvIHRoaXMgYmxvY2sgdG8gdGhlIEN1ckFiYnJldnMgbGlzdC4KKyAgICBpZiAoY29uc3QgQml0c3RyZWFtUmVhZGVyOjpCbG9ja0luZm8gKkluZm8gPQorICAgICAgICAgIEJpdFN0cmVhbS0+Z2V0QmxvY2tJbmZvKEJsb2NrSUQpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEluZm8tPkFiYnJldnMuc2l6ZSgpKTsKKyAgICAgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgQ3VyQWJicmV2cy5wdXNoX2JhY2soSW5mby0+QWJicmV2c1tpXSk7CisgICAgICAgIEN1ckFiYnJldnMuYmFjaygpLT5hZGRSZWYoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGNvZGVzaXplIG9mIHRoaXMgYmxvY2suCisgICAgQ3VyQ29kZVNpemUgPSBSZWFkVkJSKGJpdGM6OkNvZGVMZW5XaWR0aCk7CisgICAgU2tpcFRvV29yZCgpOworICAgIHVuc2lnbmVkIE51bVdvcmRzID0gUmVhZChiaXRjOjpCbG9ja1NpemVXaWR0aCk7CisgICAgaWYgKE51bVdvcmRzUCkgKk51bVdvcmRzUCA9IE51bVdvcmRzOworCisgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIGJsb2NrIGlzIHNhbmUuCisgICAgaWYgKEN1ckNvZGVTaXplID09IDAgfHwgQXRFbmRPZlN0cmVhbSgpIHx8CisgICAgICAgIE5leHRDaGFyK051bVdvcmRzKjQgPiBCaXRTdHJlYW0tPmdldExhc3RDaGFyKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgUmVhZEJsb2NrRW5kKCkgeworICAgIGlmIChCbG9ja1Njb3BlLmVtcHR5KCkpIHJldHVybiB0cnVlOworCisgICAgLy8gQmxvY2sgdGFpbDoKKyAgICAvLyAgICBbRU5EX0JMT0NLLCA8YWxpZ240Ynl0ZXM+XQorICAgIFNraXBUb1dvcmQoKTsKKworICAgIFBvcEJsb2NrU2NvcGUoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBQb3BCbG9ja1Njb3BlKCkgeworICAgIEN1ckNvZGVTaXplID0gQmxvY2tTY29wZS5iYWNrKCkuUHJldkNvZGVTaXplOworCisgICAgLy8gRGVsZXRlIGFiYnJldnMgZnJvbSBwb3BwZWQgc2NvcGUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihDdXJBYmJyZXZzLnNpemUoKSk7CisgICAgICAgICBpICE9IGU7ICsraSkKKyAgICAgIEN1ckFiYnJldnNbaV0tPmRyb3BSZWYoKTsKKworICAgIEJsb2NrU2NvcGUuYmFjaygpLlByZXZBYmJyZXZzLnN3YXAoQ3VyQWJicmV2cyk7CisgICAgQmxvY2tTY29wZS5wb3BfYmFjaygpOworICB9CisKKyAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUmVjb3JkIFByb2Nlc3NpbmcKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ByaXZhdGU6CisgIHZvaWQgUmVhZEFiYnJldmlhdGVkTGl0ZXJhbChjb25zdCBCaXRDb2RlQWJicmV2T3AgJk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVpbnQ2NF90PiAmVmFscykgeworICAgIGFzc2VydChPcC5pc0xpdGVyYWwoKSAmJiAiTm90IGEgbGl0ZXJhbCIpOworICAgIC8vIElmIHRoZSBhYmJyZXYgc3BlY2lmaWVzIHRoZSBsaXRlcmFsIHZhbHVlIHRvIHVzZSwgdXNlIGl0LgorICAgIFZhbHMucHVzaF9iYWNrKE9wLmdldExpdGVyYWxWYWx1ZSgpKTsKKyAgfQorICAKKyAgdm9pZCBSZWFkQWJicmV2aWF0ZWRGaWVsZChjb25zdCBCaXRDb2RlQWJicmV2T3AgJk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1aW50NjRfdD4gJlZhbHMpIHsKKyAgICBhc3NlcnQoIU9wLmlzTGl0ZXJhbCgpICYmICJVc2UgUmVhZEFiYnJldmlhdGVkTGl0ZXJhbCBmb3IgbGl0ZXJhbHMhIik7CisgICAgCisgICAgLy8gRGVjb2RlIHRoZSB2YWx1ZSBhcyB3ZSBhcmUgY29tbWFuZGVkLgorICAgIHN3aXRjaCAoT3AuZ2V0RW5jb2RpbmcoKSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIGVuY29kaW5nISIpOworICAgIGNhc2UgQml0Q29kZUFiYnJldk9wOjpGaXhlZDoKKyAgICAgIFZhbHMucHVzaF9iYWNrKFJlYWQoKHVuc2lnbmVkKU9wLmdldEVuY29kaW5nRGF0YSgpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpdENvZGVBYmJyZXZPcDo6VkJSOgorICAgICAgVmFscy5wdXNoX2JhY2soUmVhZFZCUjY0KCh1bnNpZ25lZClPcC5nZXRFbmNvZGluZ0RhdGEoKSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaXRDb2RlQWJicmV2T3A6OkNoYXI2OgorICAgICAgVmFscy5wdXNoX2JhY2soQml0Q29kZUFiYnJldk9wOjpEZWNvZGVDaGFyNihSZWFkKDYpKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK3B1YmxpYzoKKworICAvLy8gZ2V0QWJicmV2IC0gUmV0dXJuIHRoZSBhYmJyZXZpYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQWJicmV2SWQuIAorICBjb25zdCBCaXRDb2RlQWJicmV2ICpnZXRBYmJyZXYodW5zaWduZWQgQWJicmV2SUQpIHsKKyAgICB1bnNpZ25lZCBBYmJyZXZObyA9IEFiYnJldklELWJpdGM6OkZJUlNUX0FQUExJQ0FUSU9OX0FCQlJFVjsKKyAgICBhc3NlcnQoQWJicmV2Tm8gPCBDdXJBYmJyZXZzLnNpemUoKSAmJiAiSW52YWxpZCBhYmJyZXYgIyEiKTsKKyAgICByZXR1cm4gQ3VyQWJicmV2c1tBYmJyZXZOb107CisgIH0KKyAgCisgIHVuc2lnbmVkIFJlYWRSZWNvcmQodW5zaWduZWQgQWJicmV2SUQsIFNtYWxsVmVjdG9ySW1wbDx1aW50NjRfdD4gJlZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKkJsb2JTdGFydCA9IDAsIHVuc2lnbmVkICpCbG9iTGVuID0gMCkgeworICAgIGlmIChBYmJyZXZJRCA9PSBiaXRjOjpVTkFCQlJFVl9SRUNPUkQpIHsKKyAgICAgIHVuc2lnbmVkIENvZGUgPSBSZWFkVkJSKDYpOworICAgICAgdW5zaWduZWQgTnVtRWx0cyA9IFJlYWRWQlIoNik7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUVsdHM7ICsraSkKKyAgICAgICAgVmFscy5wdXNoX2JhY2soUmVhZFZCUjY0KDYpKTsKKyAgICAgIHJldHVybiBDb2RlOworICAgIH0KKworICAgIGNvbnN0IEJpdENvZGVBYmJyZXYgKkFiYnYgPSBnZXRBYmJyZXYoQWJicmV2SUQpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFiYnYtPmdldE51bU9wZXJhbmRJbmZvcygpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgQml0Q29kZUFiYnJldk9wICZPcCA9IEFiYnYtPmdldE9wZXJhbmRJbmZvKGkpOworICAgICAgaWYgKE9wLmlzTGl0ZXJhbCgpKSB7CisgICAgICAgIFJlYWRBYmJyZXZpYXRlZExpdGVyYWwoT3AsIFZhbHMpOyAKKyAgICAgIH0gZWxzZSBpZiAoT3AuZ2V0RW5jb2RpbmcoKSA9PSBCaXRDb2RlQWJicmV2T3A6OkFycmF5KSB7CisgICAgICAgIC8vIEFycmF5IGNhc2UuICBSZWFkIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgYSB2YnI2LgorICAgICAgICB1bnNpZ25lZCBOdW1FbHRzID0gUmVhZFZCUig2KTsKKworICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgZW5jb2RpbmcuCisgICAgICAgIGFzc2VydChpKzIgPT0gZSAmJiAiYXJyYXkgb3Agbm90IHNlY29uZCB0byBsYXN0PyIpOworICAgICAgICBjb25zdCBCaXRDb2RlQWJicmV2T3AgJkVsdEVuYyA9IEFiYnYtPmdldE9wZXJhbmRJbmZvKCsraSk7CisKKyAgICAgICAgLy8gUmVhZCBhbGwgdGhlIGVsZW1lbnRzLgorICAgICAgICBmb3IgKDsgTnVtRWx0czsgLS1OdW1FbHRzKQorICAgICAgICAgIFJlYWRBYmJyZXZpYXRlZEZpZWxkKEVsdEVuYywgVmFscyk7CisgICAgICB9IGVsc2UgaWYgKE9wLmdldEVuY29kaW5nKCkgPT0gQml0Q29kZUFiYnJldk9wOjpCbG9iKSB7CisgICAgICAgIC8vIEJsb2IgY2FzZS4gIFJlYWQgdGhlIG51bWJlciBvZiBieXRlcyBhcyBhIHZicjYuCisgICAgICAgIHVuc2lnbmVkIE51bUVsdHMgPSBSZWFkVkJSKDYpOworICAgICAgICBTa2lwVG9Xb3JkKCk7ICAvLyAzMi1iaXQgYWxpZ25tZW50CisKKyAgICAgICAgLy8gRmlndXJlIG91dCB3aGVyZSB0aGUgZW5kIG9mIHRoaXMgYmxvYiB3aWxsIGJlIGluY2x1ZGluZyB0YWlsIHBhZGRpbmcuCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKk5ld0VuZCA9IE5leHRDaGFyKygoTnVtRWx0cyszKSZ+Myk7CisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGlzIHdvdWxkIHJlYWQgb2ZmIHRoZSBlbmQgb2YgdGhlIGJpdGNvZGUgZmlsZSwganVzdCBzZXQgdGhlCisgICAgICAgIC8vIHJlY29yZCB0byBlbXB0eSBhbmQgcmV0dXJuLgorICAgICAgICBpZiAoTmV3RW5kID4gQml0U3RyZWFtLT5nZXRMYXN0Q2hhcigpKSB7CisgICAgICAgICAgVmFscy5hcHBlbmQoTnVtRWx0cywgMCk7CisgICAgICAgICAgTmV4dENoYXIgPSBCaXRTdHJlYW0tPmdldExhc3RDaGFyKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE90aGVyd2lzZSwgcmVhZCB0aGUgbnVtYmVyIG9mIGJ5dGVzLiAgSWYgd2UgY2FuIHJldHVybiBhIHJlZmVyZW5jZSB0bworICAgICAgICAvLyB0aGUgZGF0YSwgZG8gc28gdG8gYXZvaWQgY29weWluZyBpdC4KKyAgICAgICAgaWYgKEJsb2JTdGFydCkgeworICAgICAgICAgICpCbG9iU3RhcnQgPSAoY29uc3QgY2hhciopTmV4dENoYXI7CisgICAgICAgICAgKkJsb2JMZW4gPSBOdW1FbHRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoOyBOdW1FbHRzOyArK05leHRDaGFyLCAtLU51bUVsdHMpCisgICAgICAgICAgICBWYWxzLnB1c2hfYmFjaygqTmV4dENoYXIpOworICAgICAgICB9CisgICAgICAgIC8vIFNraXAgb3ZlciB0YWlsIHBhZGRpbmcuCisgICAgICAgIE5leHRDaGFyID0gTmV3RW5kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUmVhZEFiYnJldmlhdGVkRmllbGQoT3AsIFZhbHMpOworICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIENvZGUgPSAodW5zaWduZWQpVmFsc1swXTsKKyAgICBWYWxzLmVyYXNlKFZhbHMuYmVnaW4oKSk7CisgICAgcmV0dXJuIENvZGU7CisgIH0KKworICB1bnNpZ25lZCBSZWFkUmVjb3JkKHVuc2lnbmVkIEFiYnJldklELCBTbWFsbFZlY3RvckltcGw8dWludDY0X3Q+ICZWYWxzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZCbG9iU3RhcnQsIHVuc2lnbmVkICZCbG9iTGVuKSB7CisgICAgcmV0dXJuIFJlYWRSZWNvcmQoQWJicmV2SUQsIFZhbHMsICZCbG9iU3RhcnQsICZCbG9iTGVuKTsKKyAgfQorCisgIAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQWJicmV2IFByb2Nlc3NpbmcKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdm9pZCBSZWFkQWJicmV2UmVjb3JkKCkgeworICAgIEJpdENvZGVBYmJyZXYgKkFiYnYgPSBuZXcgQml0Q29kZUFiYnJldigpOworICAgIHVuc2lnbmVkIE51bU9wSW5mbyA9IFJlYWRWQlIoNSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcEluZm87ICsraSkgeworICAgICAgYm9vbCBJc0xpdGVyYWwgPSBSZWFkKDEpID8gdHJ1ZSA6IGZhbHNlOworICAgICAgaWYgKElzTGl0ZXJhbCkgeworICAgICAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKFJlYWRWQlI2NCg4KSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgQml0Q29kZUFiYnJldk9wOjpFbmNvZGluZyBFID0gKEJpdENvZGVBYmJyZXZPcDo6RW5jb2RpbmcpUmVhZCgzKTsKKyAgICAgIGlmIChCaXRDb2RlQWJicmV2T3A6Omhhc0VuY29kaW5nRGF0YShFKSkKKyAgICAgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChFLCBSZWFkVkJSNjQoNSkpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChFKSk7CisgICAgfQorICAgIEN1ckFiYnJldnMucHVzaF9iYWNrKEFiYnYpOworICB9CisgIAorcHVibGljOgorCisgIGJvb2wgUmVhZEJsb2NrSW5mb0Jsb2NrKCkgeworICAgIC8vIElmIHRoaXMgaXMgdGhlIHNlY29uZCBzdHJlYW0gdG8gZ2V0IHRvIHRoZSBibG9jayBpbmZvIGJsb2NrLCBza2lwIGl0LgorICAgIGlmIChCaXRTdHJlYW0tPmhhc0Jsb2NrSW5mb1JlY29yZHMoKSkKKyAgICAgIHJldHVybiBTa2lwQmxvY2soKTsKKyAgICAKKyAgICBpZiAoRW50ZXJTdWJCbG9jayhiaXRjOjpCTE9DS0lORk9fQkxPQ0tfSUQpKSByZXR1cm4gdHJ1ZTsKKworICAgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA2ND4gUmVjb3JkOworICAgIEJpdHN0cmVhbVJlYWRlcjo6QmxvY2tJbmZvICpDdXJCbG9ja0luZm8gPSAwOworCisgICAgLy8gUmVhZCBhbGwgdGhlIHJlY29yZHMgZm9yIHRoaXMgbW9kdWxlLgorICAgIHdoaWxlICgxKSB7CisgICAgICB1bnNpZ25lZCBDb2RlID0gUmVhZENvZGUoKTsKKyAgICAgIGlmIChDb2RlID09IGJpdGM6OkVORF9CTE9DSykKKyAgICAgICAgcmV0dXJuIFJlYWRCbG9ja0VuZCgpOworICAgICAgaWYgKENvZGUgPT0gYml0Yzo6RU5URVJfU1VCQkxPQ0spIHsKKyAgICAgICAgUmVhZFN1YkJsb2NrSUQoKTsKKyAgICAgICAgaWYgKFNraXBCbG9jaygpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFJlYWQgYWJicmV2IHJlY29yZHMsIGFzc29jaWF0ZSB0aGVtIHdpdGggQ3VyQklELgorICAgICAgaWYgKENvZGUgPT0gYml0Yzo6REVGSU5FX0FCQlJFVikgeworICAgICAgICBpZiAoIUN1ckJsb2NrSW5mbykgcmV0dXJuIHRydWU7CisgICAgICAgIFJlYWRBYmJyZXZSZWNvcmQoKTsKKworICAgICAgICAvLyBSZWFkQWJicmV2UmVjb3JkIGluc3RhbGxzIHRoZSBhYmJyZXYgaW4gQ3VyQWJicmV2cy4gIE1vdmUgaXQgdG8gdGhlCisgICAgICAgIC8vIGFwcHJvcHJpYXRlIEJsb2NrSW5mby4KKyAgICAgICAgQml0Q29kZUFiYnJldiAqQWJidiA9IEN1ckFiYnJldnMuYmFjaygpOworICAgICAgICBDdXJBYmJyZXZzLnBvcF9iYWNrKCk7CisgICAgICAgIEN1ckJsb2NrSW5mby0+QWJicmV2cy5wdXNoX2JhY2soQWJidik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBSZWFkIGEgcmVjb3JkLgorICAgICAgUmVjb3JkLmNsZWFyKCk7CisgICAgICBzd2l0Y2ggKFJlYWRSZWNvcmQoQ29kZSwgUmVjb3JkKSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7ICAvLyBEZWZhdWx0IGJlaGF2aW9yLCBpZ25vcmUgdW5rbm93biBjb250ZW50LgorICAgICAgY2FzZSBiaXRjOjpCTE9DS0lORk9fQ09ERV9TRVRCSUQ6CisgICAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMSkgcmV0dXJuIHRydWU7CisgICAgICAgIEN1ckJsb2NrSW5mbyA9ICZCaXRTdHJlYW0tPmdldE9yQ3JlYXRlQmxvY2tJbmZvKCh1bnNpZ25lZClSZWNvcmRbMF0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYml0Yzo6QkxPQ0tJTkZPX0NPREVfQkxPQ0tOQU1FOiB7CisgICAgICAgIGlmICghQ3VyQmxvY2tJbmZvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKEJpdFN0cmVhbS0+aXNJZ25vcmluZ0Jsb2NrSW5mb05hbWVzKCkpIGJyZWFrOyAgLy8gSWdub3JlIG5hbWUuCisgICAgICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWNvcmQuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBOYW1lICs9IChjaGFyKVJlY29yZFtpXTsKKyAgICAgICAgQ3VyQmxvY2tJbmZvLT5OYW1lID0gTmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGJpdGM6OkJMT0NLSU5GT19DT0RFX1NFVFJFQ09SRE5BTUU6IHsKKyAgICAgICAgaWYgKCFDdXJCbG9ja0luZm8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAoQml0U3RyZWFtLT5pc0lnbm9yaW5nQmxvY2tJbmZvTmFtZXMoKSkgYnJlYWs7ICAvLyBJZ25vcmUgbmFtZS4KKyAgICAgICAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFJlY29yZC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIE5hbWUgKz0gKGNoYXIpUmVjb3JkW2ldOworICAgICAgICBDdXJCbG9ja0luZm8tPlJlY29yZE5hbWVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigodW5zaWduZWQpUmVjb3JkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfTsKKyAgCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdHN0cmVhbVdyaXRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0c3RyZWFtV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkNTEzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdHN0cmVhbVdyaXRlci5oCkBAIC0wLDAgKzEsNTMxIEBACisvLz09PS0gQml0c3RyZWFtV3JpdGVyLmggLSBMb3ctbGV2ZWwgYml0c3RyZWFtIHdyaXRlciBpbnRlcmZhY2UgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEJpdHN0cmVhbVdyaXRlciBjbGFzcy4gIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8KKy8vIHdyaXRlIGFuIGFyYml0cmFyeSBiaXRzdHJlYW0sIHJlZ2FyZGxlc3Mgb2YgaXRzIGNvbnRlbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQklUU1RSRUFNX1dSSVRFUl9ICisjZGVmaW5lIEJJVFNUUkVBTV9XUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0JpdENvZGVzLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJpdHN0cmVhbVdyaXRlciB7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+ICZPdXQ7CisKKyAgLy8vIEN1ckJpdCAtIEFsd2F5cyBiZXR3ZWVuIDAgYW5kIDMxIGluY2x1c2l2ZSwgc3BlY2lmaWVzIHRoZSBuZXh0IGJpdCB0byB1c2UuCisgIHVuc2lnbmVkIEN1ckJpdDsKKworICAvLy8gQ3VyVmFsdWUgLSBUaGUgY3VycmVudCB2YWx1ZS4gIE9ubHkgYml0cyA8IEN1ckJpdCBhcmUgdmFsaWQuCisgIHVpbnQzMl90IEN1clZhbHVlOworCisgIC8vLyBDdXJDb2RlU2l6ZSAtIFRoaXMgaXMgdGhlIGRlY2xhcmVkIHNpemUgb2YgY29kZSB2YWx1ZXMgdXNlZCBmb3IgdGhlCisgIC8vLyBjdXJyZW50IGJsb2NrLCBpbiBiaXRzLgorICB1bnNpZ25lZCBDdXJDb2RlU2l6ZTsKKworICAvLy8gQmxvY2tJbmZvQ3VyQklEIC0gV2hlbiBlbWl0dGluZyBhIEJMT0NLSU5GT19CTE9DSywgdGhpcyBpcyB0aGUgY3VycmVudGx5CisgIC8vLyBzZWxlY3RlZCBCTE9DSyBJRC4KKyAgdW5zaWduZWQgQmxvY2tJbmZvQ3VyQklEOworCisgIC8vLyBDdXJBYmJyZXZzIC0gQWJicmV2cyBpbnN0YWxsZWQgYXQgaW4gdGhpcyBibG9jay4KKyAgc3RkOjp2ZWN0b3I8Qml0Q29kZUFiYnJldio+IEN1ckFiYnJldnM7CisKKyAgc3RydWN0IEJsb2NrIHsKKyAgICB1bnNpZ25lZCBQcmV2Q29kZVNpemU7CisgICAgdW5zaWduZWQgU3RhcnRTaXplV29yZDsKKyAgICBzdGQ6OnZlY3RvcjxCaXRDb2RlQWJicmV2Kj4gUHJldkFiYnJldnM7CisgICAgQmxvY2sodW5zaWduZWQgUENTLCB1bnNpZ25lZCBTU1cpIDogUHJldkNvZGVTaXplKFBDUyksIFN0YXJ0U2l6ZVdvcmQoU1NXKSB7fQorICB9OworCisgIC8vLyBCbG9ja1Njb3BlIC0gVGhpcyB0cmFja3MgdGhlIGN1cnJlbnQgYmxvY2tzIHRoYXQgd2UgaGF2ZSBlbnRlcmVkLgorICBzdGQ6OnZlY3RvcjxCbG9jaz4gQmxvY2tTY29wZTsKKworICAvLy8gQmxvY2tJbmZvIC0gVGhpcyBjb250YWlucyBpbmZvcm1hdGlvbiBlbWl0dGVkIHRvIEJMT0NLSU5GT19CTE9DSyBibG9ja3MuCisgIC8vLyBUaGVzZSBkZXNjcmliZSBhYmJyZXZpYXRpb25zIHRoYXQgYWxsIGJsb2NrcyBvZiB0aGUgc3BlY2lmaWVkIElEIGluaGVyaXQuCisgIHN0cnVjdCBCbG9ja0luZm8geworICAgIHVuc2lnbmVkIEJsb2NrSUQ7CisgICAgc3RkOjp2ZWN0b3I8Qml0Q29kZUFiYnJldio+IEFiYnJldnM7CisgIH07CisgIHN0ZDo6dmVjdG9yPEJsb2NrSW5mbz4gQmxvY2tJbmZvUmVjb3JkczsKKworcHVibGljOgorICBleHBsaWNpdCBCaXRzdHJlYW1Xcml0ZXIoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gJk8pCisgICAgOiBPdXQoTyksIEN1ckJpdCgwKSwgQ3VyVmFsdWUoMCksIEN1ckNvZGVTaXplKDIpIHt9CisKKyAgfkJpdHN0cmVhbVdyaXRlcigpIHsKKyAgICBhc3NlcnQoQ3VyQml0ID09IDAgJiYgIlVuZmx1c2VkIGRhdGEgcmVtYWluaW5nIik7CisgICAgYXNzZXJ0KEJsb2NrU2NvcGUuZW1wdHkoKSAmJiBDdXJBYmJyZXZzLmVtcHR5KCkgJiYgIkJsb2NrIGltYmFsYW5jZSIpOworCisgICAgLy8gRnJlZSB0aGUgQmxvY2tJbmZvUmVjb3Jkcy4KKyAgICB3aGlsZSAoIUJsb2NrSW5mb1JlY29yZHMuZW1wdHkoKSkgeworICAgICAgQmxvY2tJbmZvICZJbmZvID0gQmxvY2tJbmZvUmVjb3Jkcy5iYWNrKCk7CisgICAgICAvLyBGcmVlIGJsb2NraW5mbyBhYmJyZXYgaW5mby4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oSW5mby5BYmJyZXZzLnNpemUoKSk7CisgICAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgICBJbmZvLkFiYnJldnNbaV0tPmRyb3BSZWYoKTsKKyAgICAgIEJsb2NrSW5mb1JlY29yZHMucG9wX2JhY2soKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiAmZ2V0QnVmZmVyKCkgeyByZXR1cm4gT3V0OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLCBpbiBiaXRzLgorICB1aW50NjRfdCBHZXRDdXJyZW50Qml0Tm8oKSBjb25zdCB7IHJldHVybiBPdXQuc2l6ZSgpICogOCArIEN1ckJpdDsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCYXNpYyBQcmltaXRpdmVzIGZvciBlbWl0dGluZyBiaXRzIHRvIHRoZSBzdHJlYW0uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHZvaWQgRW1pdCh1aW50MzJfdCBWYWwsIHVuc2lnbmVkIE51bUJpdHMpIHsKKyAgICBhc3NlcnQoTnVtQml0cyA8PSAzMiAmJiAiSW52YWxpZCB2YWx1ZSBzaXplISIpOworICAgIGFzc2VydCgoVmFsICYgfih+MFUgPj4gKDMyLU51bUJpdHMpKSkgPT0gMCAmJiAiSGlnaCBiaXRzIHNldCEiKTsKKyAgICBDdXJWYWx1ZSB8PSBWYWwgPDwgQ3VyQml0OworICAgIGlmIChDdXJCaXQgKyBOdW1CaXRzIDwgMzIpIHsKKyAgICAgIEN1ckJpdCArPSBOdW1CaXRzOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFkZCB0aGUgY3VycmVudCB3b3JkLgorICAgIHVuc2lnbmVkIFYgPSBDdXJWYWx1ZTsKKyAgICBPdXQucHVzaF9iYWNrKCh1bnNpZ25lZCBjaGFyKShWID4+ICAwKSk7CisgICAgT3V0LnB1c2hfYmFjaygodW5zaWduZWQgY2hhcikoViA+PiAgOCkpOworICAgIE91dC5wdXNoX2JhY2soKHVuc2lnbmVkIGNoYXIpKFYgPj4gMTYpKTsKKyAgICBPdXQucHVzaF9iYWNrKCh1bnNpZ25lZCBjaGFyKShWID4+IDI0KSk7CisKKyAgICBpZiAoQ3VyQml0KQorICAgICAgQ3VyVmFsdWUgPSBWYWwgPj4gKDMyLUN1ckJpdCk7CisgICAgZWxzZQorICAgICAgQ3VyVmFsdWUgPSAwOworICAgIEN1ckJpdCA9IChDdXJCaXQrTnVtQml0cykgJiAzMTsKKyAgfQorCisgIHZvaWQgRW1pdDY0KHVpbnQ2NF90IFZhbCwgdW5zaWduZWQgTnVtQml0cykgeworICAgIGlmIChOdW1CaXRzIDw9IDMyKQorICAgICAgRW1pdCgodWludDMyX3QpVmFsLCBOdW1CaXRzKTsKKyAgICBlbHNlIHsKKyAgICAgIEVtaXQoKHVpbnQzMl90KVZhbCwgMzIpOworICAgICAgRW1pdCgodWludDMyX3QpKFZhbCA+PiAzMiksIE51bUJpdHMtMzIpOworICAgIH0KKyAgfQorCisgIHZvaWQgRmx1c2hUb1dvcmQoKSB7CisgICAgaWYgKEN1ckJpdCkgeworICAgICAgdW5zaWduZWQgViA9IEN1clZhbHVlOworICAgICAgT3V0LnB1c2hfYmFjaygodW5zaWduZWQgY2hhcikoViA+PiAgMCkpOworICAgICAgT3V0LnB1c2hfYmFjaygodW5zaWduZWQgY2hhcikoViA+PiAgOCkpOworICAgICAgT3V0LnB1c2hfYmFjaygodW5zaWduZWQgY2hhcikoViA+PiAxNikpOworICAgICAgT3V0LnB1c2hfYmFjaygodW5zaWduZWQgY2hhcikoViA+PiAyNCkpOworICAgICAgQ3VyQml0ID0gMDsKKyAgICAgIEN1clZhbHVlID0gMDsKKyAgICB9CisgIH0KKworICB2b2lkIEVtaXRWQlIodWludDMyX3QgVmFsLCB1bnNpZ25lZCBOdW1CaXRzKSB7CisgICAgdWludDMyX3QgVGhyZXNob2xkID0gMVUgPDwgKE51bUJpdHMtMSk7CisKKyAgICAvLyBFbWl0IHRoZSBiaXRzIHdpdGggVkJSIGVuY29kaW5nLCBOdW1CaXRzLTEgYml0cyBhdCBhIHRpbWUuCisgICAgd2hpbGUgKFZhbCA+PSBUaHJlc2hvbGQpIHsKKyAgICAgIEVtaXQoKFZhbCAmICgoMSA8PCAoTnVtQml0cy0xKSktMSkpIHwgKDEgPDwgKE51bUJpdHMtMSkpLCBOdW1CaXRzKTsKKyAgICAgIFZhbCA+Pj0gTnVtQml0cy0xOworICAgIH0KKworICAgIEVtaXQoVmFsLCBOdW1CaXRzKTsKKyAgfQorCisgIHZvaWQgRW1pdFZCUjY0KHVpbnQ2NF90IFZhbCwgdW5zaWduZWQgTnVtQml0cykgeworICAgIGlmICgodWludDMyX3QpVmFsID09IFZhbCkKKyAgICAgIHJldHVybiBFbWl0VkJSKCh1aW50MzJfdClWYWwsIE51bUJpdHMpOworCisgICAgdWludDY0X3QgVGhyZXNob2xkID0gMVUgPDwgKE51bUJpdHMtMSk7CisKKyAgICAvLyBFbWl0IHRoZSBiaXRzIHdpdGggVkJSIGVuY29kaW5nLCBOdW1CaXRzLTEgYml0cyBhdCBhIHRpbWUuCisgICAgd2hpbGUgKFZhbCA+PSBUaHJlc2hvbGQpIHsKKyAgICAgIEVtaXQoKCh1aW50MzJfdClWYWwgJiAoKDEgPDwgKE51bUJpdHMtMSkpLTEpKSB8CisgICAgICAgICAgICgxIDw8IChOdW1CaXRzLTEpKSwgTnVtQml0cyk7CisgICAgICBWYWwgPj49IE51bUJpdHMtMTsKKyAgICB9CisKKyAgICBFbWl0KCh1aW50MzJfdClWYWwsIE51bUJpdHMpOworICB9CisKKyAgLy8vIEVtaXRDb2RlIC0gRW1pdCB0aGUgc3BlY2lmaWVkIGNvZGUuCisgIHZvaWQgRW1pdENvZGUodW5zaWduZWQgVmFsKSB7CisgICAgRW1pdChWYWwsIEN1ckNvZGVTaXplKTsKKyAgfQorCisgIC8vIEJhY2twYXRjaFdvcmQgLSBCYWNrcGF0Y2ggYSAzMi1iaXQgd29yZCBpbiB0aGUgb3V0cHV0IHdpdGggdGhlIHNwZWNpZmllZAorICAvLyB2YWx1ZS4KKyAgdm9pZCBCYWNrcGF0Y2hXb3JkKHVuc2lnbmVkIEJ5dGVObywgdW5zaWduZWQgTmV3V29yZCkgeworICAgIE91dFtCeXRlTm8rK10gPSAodW5zaWduZWQgY2hhcikoTmV3V29yZCA+PiAgMCk7CisgICAgT3V0W0J5dGVObysrXSA9ICh1bnNpZ25lZCBjaGFyKShOZXdXb3JkID4+ICA4KTsKKyAgICBPdXRbQnl0ZU5vKytdID0gKHVuc2lnbmVkIGNoYXIpKE5ld1dvcmQgPj4gMTYpOworICAgIE91dFtCeXRlTm8gIF0gPSAodW5zaWduZWQgY2hhcikoTmV3V29yZCA+PiAyNCk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQmxvY2sgTWFuaXB1bGF0aW9uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBnZXRCbG9ja0luZm8gLSBJZiB0aGVyZSBpcyBibG9jayBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIElELCByZXR1cm4gaXQsCisgIC8vLyBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIEJsb2NrSW5mbyAqZ2V0QmxvY2tJbmZvKHVuc2lnbmVkIEJsb2NrSUQpIHsKKyAgICAvLyBDb21tb24gY2FzZSwgdGhlIG1vc3QgcmVjZW50IGVudHJ5IG1hdGNoZXMgQmxvY2tJRC4KKyAgICBpZiAoIUJsb2NrSW5mb1JlY29yZHMuZW1wdHkoKSAmJiBCbG9ja0luZm9SZWNvcmRzLmJhY2soKS5CbG9ja0lEID09IEJsb2NrSUQpCisgICAgICByZXR1cm4gJkJsb2NrSW5mb1JlY29yZHMuYmFjaygpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihCbG9ja0luZm9SZWNvcmRzLnNpemUoKSk7CisgICAgICAgICBpICE9IGU7ICsraSkKKyAgICAgIGlmIChCbG9ja0luZm9SZWNvcmRzW2ldLkJsb2NrSUQgPT0gQmxvY2tJRCkKKyAgICAgICAgcmV0dXJuICZCbG9ja0luZm9SZWNvcmRzW2ldOworICAgIHJldHVybiAwOworICB9CisKKyAgdm9pZCBFbnRlclN1YmJsb2NrKHVuc2lnbmVkIEJsb2NrSUQsIHVuc2lnbmVkIENvZGVMZW4pIHsKKyAgICAvLyBCbG9jayBoZWFkZXI6CisgICAgLy8gICAgW0VOVEVSX1NVQkJMT0NLLCBibG9ja2lkLCBuZXdjb2RlbGVuLCA8YWxpZ240Ynl0ZXM+LCBibG9ja2xlbl0KKyAgICBFbWl0Q29kZShiaXRjOjpFTlRFUl9TVUJCTE9DSyk7CisgICAgRW1pdFZCUihCbG9ja0lELCBiaXRjOjpCbG9ja0lEV2lkdGgpOworICAgIEVtaXRWQlIoQ29kZUxlbiwgYml0Yzo6Q29kZUxlbldpZHRoKTsKKyAgICBGbHVzaFRvV29yZCgpOworCisgICAgdW5zaWduZWQgQmxvY2tTaXplV29yZExvYyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihPdXQuc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBPbGRDb2RlU2l6ZSA9IEN1ckNvZGVTaXplOworCisgICAgLy8gRW1pdCBhIHBsYWNlaG9sZGVyLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIHdoZW4gdGhlIGJsb2NrIGlzIHBvcHBlZC4KKyAgICBFbWl0KDAsIGJpdGM6OkJsb2NrU2l6ZVdpZHRoKTsKKworICAgIEN1ckNvZGVTaXplID0gQ29kZUxlbjsKKworICAgIC8vIFB1c2ggdGhlIG91dGVyIGJsb2NrJ3MgYWJicmV2IHNldCBvbnRvIHRoZSBzdGFjaywgc3RhcnQgb3V0IHdpdGggYW4KKyAgICAvLyBlbXB0eSBhYmJyZXYgc2V0LgorICAgIEJsb2NrU2NvcGUucHVzaF9iYWNrKEJsb2NrKE9sZENvZGVTaXplLCBCbG9ja1NpemVXb3JkTG9jLzQpKTsKKyAgICBCbG9ja1Njb3BlLmJhY2soKS5QcmV2QWJicmV2cy5zd2FwKEN1ckFiYnJldnMpOworCisgICAgLy8gSWYgdGhlcmUgaXMgYSBibG9ja2luZm8gZm9yIHRoaXMgQmxvY2tJRCwgYWRkIGFsbCB0aGUgcHJlZGVmaW5lZCBhYmJyZXZzCisgICAgLy8gdG8gdGhlIGFiYnJldiBsaXN0LgorICAgIGlmIChCbG9ja0luZm8gKkluZm8gPSBnZXRCbG9ja0luZm8oQmxvY2tJRCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oSW5mby0+QWJicmV2cy5zaXplKCkpOworICAgICAgICAgICBpICE9IGU7ICsraSkgeworICAgICAgICBDdXJBYmJyZXZzLnB1c2hfYmFjayhJbmZvLT5BYmJyZXZzW2ldKTsKKyAgICAgICAgSW5mby0+QWJicmV2c1tpXS0+YWRkUmVmKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBFeGl0QmxvY2soKSB7CisgICAgYXNzZXJ0KCFCbG9ja1Njb3BlLmVtcHR5KCkgJiYgIkJsb2NrIHNjb3BlIGltYmFsYW5jZSEiKTsKKworICAgIC8vIERlbGV0ZSBhbGwgYWJicmV2cy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEN1ckFiYnJldnMuc2l6ZSgpKTsKKyAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgQ3VyQWJicmV2c1tpXS0+ZHJvcFJlZigpOworCisgICAgY29uc3QgQmxvY2sgJkIgPSBCbG9ja1Njb3BlLmJhY2soKTsKKworICAgIC8vIEJsb2NrIHRhaWw6CisgICAgLy8gICAgW0VORF9CTE9DSywgPGFsaWduNGJ5dGVzPl0KKyAgICBFbWl0Q29kZShiaXRjOjpFTkRfQkxPQ0spOworICAgIEZsdXNoVG9Xb3JkKCk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBibG9jaywgaW4gd29yZHMsIG5vdCBjb3VudGluZyB0aGUgc2l6ZSBmaWVsZC4KKyAgICB1bnNpZ25lZCBTaXplSW5Xb3Jkcz0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KE91dC5zaXplKCkpLzQtQi5TdGFydFNpemVXb3JkLTE7CisgICAgdW5zaWduZWQgQnl0ZU5vID0gQi5TdGFydFNpemVXb3JkKjQ7CisKKyAgICAvLyBVcGRhdGUgdGhlIGJsb2NrIHNpemUgZmllbGQgaW4gdGhlIGhlYWRlciBvZiB0aGlzIHN1Yi1ibG9jay4KKyAgICBCYWNrcGF0Y2hXb3JkKEJ5dGVObywgU2l6ZUluV29yZHMpOworCisgICAgLy8gUmVzdG9yZSB0aGUgaW5uZXIgYmxvY2sncyBjb2RlIHNpemUgYW5kIGFiYnJldiB0YWJsZS4KKyAgICBDdXJDb2RlU2l6ZSA9IEIuUHJldkNvZGVTaXplOworICAgIEJsb2NrU2NvcGUuYmFjaygpLlByZXZBYmJyZXZzLnN3YXAoQ3VyQWJicmV2cyk7CisgICAgQmxvY2tTY29wZS5wb3BfYmFjaygpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFJlY29yZCBFbWlzc2lvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHJpdmF0ZToKKyAgLy8vIEVtaXRBYmJyZXZpYXRlZExpdGVyYWwgLSBFbWl0IGEgbGl0ZXJhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gaXRzIGFiYnJldgorICAvLy8gcmVjb3JkLiAgVGhpcyBpcyBhIG5vLW9wLCBzaW5jZSB0aGUgYWJicmV2IHNwZWNpZmllcyB0aGUgbGl0ZXJhbCB0byB1c2UuIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSB1aW50dHk+CisgIHZvaWQgRW1pdEFiYnJldmlhdGVkTGl0ZXJhbChjb25zdCBCaXRDb2RlQWJicmV2T3AgJk9wLCB1aW50dHkgVikgeworICAgIGFzc2VydChPcC5pc0xpdGVyYWwoKSAmJiAiTm90IGEgbGl0ZXJhbCIpOworICAgIC8vIElmIHRoZSBhYmJyZXYgc3BlY2lmaWVzIHRoZSBsaXRlcmFsIHZhbHVlIHRvIHVzZSwgZG9uJ3QgZW1pdAorICAgIC8vIGFueXRoaW5nLgorICAgIGFzc2VydChWID09IE9wLmdldExpdGVyYWxWYWx1ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIGFiYnJldiBmb3IgcmVjb3JkISIpOworICB9CisgIAorICAvLy8gRW1pdEFiYnJldmlhdGVkRmllbGQgLSBFbWl0IGEgc2luZ2xlIHNjYWxhciBmaWVsZCB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGVuY29kaW5nLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSB1aW50dHk+CisgIHZvaWQgRW1pdEFiYnJldmlhdGVkRmllbGQoY29uc3QgQml0Q29kZUFiYnJldk9wICZPcCwgdWludHR5IFYpIHsKKyAgICBhc3NlcnQoIU9wLmlzTGl0ZXJhbCgpICYmICJMaXRlcmFscyBzaG91bGQgdXNlIEVtaXRBYmJyZXZpYXRlZExpdGVyYWwhIik7CisgICAgCisgICAgLy8gRW5jb2RlIHRoZSB2YWx1ZSBhcyB3ZSBhcmUgY29tbWFuZGVkLgorICAgIHN3aXRjaCAoT3AuZ2V0RW5jb2RpbmcoKSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIGVuY29kaW5nISIpOworICAgIGNhc2UgQml0Q29kZUFiYnJldk9wOjpGaXhlZDoKKyAgICAgIEVtaXQoKHVuc2lnbmVkKVYsICh1bnNpZ25lZClPcC5nZXRFbmNvZGluZ0RhdGEoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpdENvZGVBYmJyZXZPcDo6VkJSOgorICAgICAgRW1pdFZCUjY0KFYsICh1bnNpZ25lZClPcC5nZXRFbmNvZGluZ0RhdGEoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpdENvZGVBYmJyZXZPcDo6Q2hhcjY6CisgICAgICBFbWl0KEJpdENvZGVBYmJyZXZPcDo6RW5jb2RlQ2hhcjYoKGNoYXIpViksIDYpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIAorICAvLy8gRW1pdFJlY29yZFdpdGhBYmJyZXZJbXBsIC0gVGhpcyBpcyB0aGUgY29yZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVjb3JkCisgIC8vLyBlbWlzc2lvbiBjb2RlLiAgSWYgQmxvYkRhdGEgaXMgbm9uLW51bGwsIHRoZW4gaXQgc3BlY2lmaWVzIGFuIGFycmF5IG9mCisgIC8vLyBkYXRhIHRoYXQgc2hvdWxkIGJlIGVtaXR0ZWQgYXMgcGFydCBvZiB0aGUgQmxvYiBvciBBcnJheSBvcGVyYW5kIHRoYXQgaXMKKyAgLy8vIGtub3duIHRvIGV4aXN0IGF0IHRoZSBlbmQgb2YgdGhlIHJlY29yZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgdWludHR5PgorICB2b2lkIEVtaXRSZWNvcmRXaXRoQWJicmV2SW1wbCh1bnNpZ25lZCBBYmJyZXYsIFNtYWxsVmVjdG9ySW1wbDx1aW50dHk+ICZWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQmxvYikgeworICAgIGNvbnN0IGNoYXIgKkJsb2JEYXRhID0gQmxvYi5kYXRhKCk7CisgICAgdW5zaWduZWQgQmxvYkxlbiA9ICh1bnNpZ25lZCkgQmxvYi5zaXplKCk7CisgICAgdW5zaWduZWQgQWJicmV2Tm8gPSBBYmJyZXYtYml0Yzo6RklSU1RfQVBQTElDQVRJT05fQUJCUkVWOworICAgIGFzc2VydChBYmJyZXZObyA8IEN1ckFiYnJldnMuc2l6ZSgpICYmICJJbnZhbGlkIGFiYnJldiAjISIpOworICAgIEJpdENvZGVBYmJyZXYgKkFiYnYgPSBDdXJBYmJyZXZzW0FiYnJldk5vXTsKKworICAgIEVtaXRDb2RlKEFiYnJldik7CisKKyAgICB1bnNpZ25lZCBSZWNvcmRJZHggPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQWJidi0+Z2V0TnVtT3BlcmFuZEluZm9zKCkpOworICAgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IEJpdENvZGVBYmJyZXZPcCAmT3AgPSBBYmJ2LT5nZXRPcGVyYW5kSW5mbyhpKTsKKyAgICAgIGlmIChPcC5pc0xpdGVyYWwoKSkgeworICAgICAgICBhc3NlcnQoUmVjb3JkSWR4IDwgVmFscy5zaXplKCkgJiYgIkludmFsaWQgYWJicmV2L3JlY29yZCIpOworICAgICAgICBFbWl0QWJicmV2aWF0ZWRMaXRlcmFsKE9wLCBWYWxzW1JlY29yZElkeF0pOworICAgICAgICArK1JlY29yZElkeDsKKyAgICAgIH0gZWxzZSBpZiAoT3AuZ2V0RW5jb2RpbmcoKSA9PSBCaXRDb2RlQWJicmV2T3A6OkFycmF5KSB7CisgICAgICAgIC8vIEFycmF5IGNhc2UuCisgICAgICAgIGFzc2VydChpKzIgPT0gZSAmJiAiYXJyYXkgb3Agbm90IHNlY29uZCB0byBsYXN0PyIpOworICAgICAgICBjb25zdCBCaXRDb2RlQWJicmV2T3AgJkVsdEVuYyA9IEFiYnYtPmdldE9wZXJhbmRJbmZvKCsraSk7CisKKyAgICAgICAgLy8gSWYgdGhpcyByZWNvcmQgaGFzIGJsb2IgZGF0YSwgZW1pdCBpdCwgb3RoZXJ3aXNlIHdlIG11c3QgaGF2ZSByZWNvcmQKKyAgICAgICAgLy8gZW50cmllcyB0byBlbmNvZGUgdGhpcyB3YXkuCisgICAgICAgIGlmIChCbG9iRGF0YSkgeworICAgICAgICAgIGFzc2VydChSZWNvcmRJZHggPT0gVmFscy5zaXplKCkgJiYKKyAgICAgICAgICAgICAgICAgIkJsb2IgZGF0YSBhbmQgcmVjb3JkIGVudHJpZXMgc3BlY2lmaWVkIGZvciBhcnJheSEiKTsKKyAgICAgICAgICAvLyBFbWl0IGEgdmJyNiB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHByZXNlbnQuCisgICAgICAgICAgRW1pdFZCUihzdGF0aWNfY2FzdDx1aW50MzJfdD4oQmxvYkxlbiksIDYpOworICAgICAgICAgIAorICAgICAgICAgIC8vIEVtaXQgZWFjaCBmaWVsZC4KKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IEJsb2JMZW47ICsraSkKKyAgICAgICAgICAgIEVtaXRBYmJyZXZpYXRlZEZpZWxkKEVsdEVuYywgKHVuc2lnbmVkIGNoYXIpQmxvYkRhdGFbaV0pOworICAgICAgICAgIAorICAgICAgICAgIC8vIEtub3cgdGhhdCBibG9iIGRhdGEgaXMgY29uc3VtZWQgZm9yIGFzc2VydGlvbiBiZWxvdy4KKyAgICAgICAgICBCbG9iRGF0YSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRW1pdCBhIHZicjYgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBwcmVzZW50LgorICAgICAgICAgIEVtaXRWQlIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFZhbHMuc2l6ZSgpLVJlY29yZElkeCksIDYpOworCisgICAgICAgICAgLy8gRW1pdCBlYWNoIGZpZWxkLgorICAgICAgICAgIGZvciAodW5zaWduZWQgZSA9IFZhbHMuc2l6ZSgpOyBSZWNvcmRJZHggIT0gZTsgKytSZWNvcmRJZHgpCisgICAgICAgICAgICBFbWl0QWJicmV2aWF0ZWRGaWVsZChFbHRFbmMsIFZhbHNbUmVjb3JkSWR4XSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoT3AuZ2V0RW5jb2RpbmcoKSA9PSBCaXRDb2RlQWJicmV2T3A6OkJsb2IpIHsKKyAgICAgICAgLy8gSWYgdGhpcyByZWNvcmQgaGFzIGJsb2IgZGF0YSwgZW1pdCBpdCwgb3RoZXJ3aXNlIHdlIG11c3QgaGF2ZSByZWNvcmQKKyAgICAgICAgLy8gZW50cmllcyB0byBlbmNvZGUgdGhpcyB3YXkuCisgICAgICAgIAorICAgICAgICAvLyBFbWl0IGEgdmJyNiB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHByZXNlbnQuCisgICAgICAgIGlmIChCbG9iRGF0YSkgeworICAgICAgICAgIEVtaXRWQlIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEJsb2JMZW4pLCA2KTsKKyAgICAgICAgICBhc3NlcnQoUmVjb3JkSWR4ID09IFZhbHMuc2l6ZSgpICYmCisgICAgICAgICAgICAgICAgICJCbG9iIGRhdGEgYW5kIHJlY29yZCBlbnRyaWVzIHNwZWNpZmllZCBmb3IgYmxvYiBvcGVyYW5kISIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVtaXRWQlIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFZhbHMuc2l6ZSgpLVJlY29yZElkeCksIDYpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGbHVzaCB0byBhIDMyLWJpdCBhbGlnbm1lbnQgYm91bmRhcnkuCisgICAgICAgIEZsdXNoVG9Xb3JkKCk7CisgICAgICAgIGFzc2VydCgoT3V0LnNpemUoKSAmIDMpID09IDAgJiYgIk5vdCAzMi1iaXQgYWxpZ25lZCIpOworCisgICAgICAgIC8vIEVtaXQgZWFjaCBmaWVsZCBhcyBhIGxpdGVyYWwgYnl0ZS4KKyAgICAgICAgaWYgKEJsb2JEYXRhKSB7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBCbG9iTGVuOyArK2kpCisgICAgICAgICAgICBPdXQucHVzaF9iYWNrKCh1bnNpZ25lZCBjaGFyKUJsb2JEYXRhW2ldKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBLbm93IHRoYXQgYmxvYiBkYXRhIGlzIGNvbnN1bWVkIGZvciBhc3NlcnRpb24gYmVsb3cuCisgICAgICAgICAgQmxvYkRhdGEgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAodW5zaWduZWQgZSA9IFZhbHMuc2l6ZSgpOyBSZWNvcmRJZHggIT0gZTsgKytSZWNvcmRJZHgpIHsKKyAgICAgICAgICAgIGFzc2VydChWYWxzW1JlY29yZElkeF0gPCAyNTYgJiYgIlZhbHVlIHRvbyBsYXJnZSB0byBlbWl0IGFzIGJsb2IiKTsKKyAgICAgICAgICAgIE91dC5wdXNoX2JhY2soKHVuc2lnbmVkIGNoYXIpVmFsc1tSZWNvcmRJZHhdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxpZ24gZW5kIHRvIDMyLWJpdHMuCisgICAgICAgIHdoaWxlIChPdXQuc2l6ZSgpICYgMykKKyAgICAgICAgICBPdXQucHVzaF9iYWNrKDApOworICAgICAgICAKKyAgICAgIH0gZWxzZSB7ICAvLyBTaW5nbGUgc2NhbGFyIGZpZWxkLgorICAgICAgICBhc3NlcnQoUmVjb3JkSWR4IDwgVmFscy5zaXplKCkgJiYgIkludmFsaWQgYWJicmV2L3JlY29yZCIpOworICAgICAgICBFbWl0QWJicmV2aWF0ZWRGaWVsZChPcCwgVmFsc1tSZWNvcmRJZHhdKTsKKyAgICAgICAgKytSZWNvcmRJZHg7CisgICAgICB9CisgICAgfQorICAgIGFzc2VydChSZWNvcmRJZHggPT0gVmFscy5zaXplKCkgJiYgIk5vdCBhbGwgcmVjb3JkIG9wZXJhbmRzIGVtaXR0ZWQhIik7CisgICAgYXNzZXJ0KEJsb2JEYXRhID09IDAgJiYKKyAgICAgICAgICAgIkJsb2IgZGF0YSBzcGVjaWZpZWQgZm9yIHJlY29yZCB0aGF0IGRvZXNuJ3QgdXNlIGl0ISIpOworICB9CisgIAorcHVibGljOgorCisgIC8vLyBFbWl0UmVjb3JkIC0gRW1pdCB0aGUgc3BlY2lmaWVkIHJlY29yZCB0byB0aGUgc3RyZWFtLCB1c2luZyBhbiBhYmJyZXYgaWYKKyAgLy8vIHdlIGhhdmUgb25lIHRvIGNvbXByZXNzIHRoZSBvdXRwdXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIHVpbnR0eT4KKyAgdm9pZCBFbWl0UmVjb3JkKHVuc2lnbmVkIENvZGUsIFNtYWxsVmVjdG9ySW1wbDx1aW50dHk+ICZWYWxzLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWJicmV2ID0gMCkgeworICAgIGlmICghQWJicmV2KSB7CisgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIGFiYnJldiB0byB1c2UsIGVtaXQgdGhpcyBpbiBpdHMgZnVsbHkgdW5hYmJyZXZpYXRlZAorICAgICAgLy8gZm9ybS4KKyAgICAgIEVtaXRDb2RlKGJpdGM6OlVOQUJCUkVWX1JFQ09SRCk7CisgICAgICBFbWl0VkJSKENvZGUsIDYpOworICAgICAgRW1pdFZCUihzdGF0aWNfY2FzdDx1aW50MzJfdD4oVmFscy5zaXplKCkpLCA2KTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oVmFscy5zaXplKCkpOyBpICE9IGU7ICsraSkKKyAgICAgICAgRW1pdFZCUjY0KFZhbHNbaV0sIDYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluc2VydCB0aGUgY29kZSBpbnRvIFZhbHMgdG8gdHJlYXQgaXQgdW5pZm9ybWx5LgorICAgIFZhbHMuaW5zZXJ0KFZhbHMuYmVnaW4oKSwgQ29kZSk7CisgICAgCisgICAgRW1pdFJlY29yZFdpdGhBYmJyZXYoQWJicmV2LCBWYWxzKTsKKyAgfQorICAKKyAgLy8vIEVtaXRSZWNvcmRXaXRoQWJicmV2IC0gRW1pdCBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgYWJicmV2aWF0aW9uLgorICAvLy8gVW5saWtlIEVtaXRSZWNvcmQsIHRoZSBjb2RlIGZvciB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBWYWxzIGFzCisgIC8vLyB0aGUgZmlyc3QgZW50cnkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIHVpbnR0eT4KKyAgdm9pZCBFbWl0UmVjb3JkV2l0aEFiYnJldih1bnNpZ25lZCBBYmJyZXYsIFNtYWxsVmVjdG9ySW1wbDx1aW50dHk+ICZWYWxzKSB7CisgICAgRW1pdFJlY29yZFdpdGhBYmJyZXZJbXBsKEFiYnJldiwgVmFscywgU3RyaW5nUmVmKCkpOworICB9CisgIAorICAvLy8gRW1pdFJlY29yZFdpdGhCbG9iIC0gRW1pdCB0aGUgc3BlY2lmaWVkIHJlY29yZCB0byB0aGUgc3RyZWFtLCB1c2luZyBhbgorICAvLy8gYWJicmV2IHRoYXQgaW5jbHVkZXMgYSBibG9iIGF0IHRoZSBlbmQuICBUaGUgYmxvYiBkYXRhIHRvIGVtaXQgaXMKKyAgLy8vIHNwZWNpZmllZCBieSB0aGUgcG9pbnRlciBhbmQgbGVuZ3RoIHNwZWNpZmllZCBhdCB0aGUgZW5kLiAgSW4gY29udHJhc3QgdG8KKyAgLy8vIEVtaXRSZWNvcmQsIHRoaXMgcm91dGluZSBleHBlY3RzIHRoYXQgdGhlIGZpcnN0IGVudHJ5IGluIFZhbHMgaXMgdGhlIGNvZGUKKyAgLy8vIG9mIHRoZSByZWNvcmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIHVpbnR0eT4KKyAgdm9pZCBFbWl0UmVjb3JkV2l0aEJsb2IodW5zaWduZWQgQWJicmV2LCBTbWFsbFZlY3RvckltcGw8dWludHR5PiAmVmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEJsb2IpIHsKKyAgICBFbWl0UmVjb3JkV2l0aEFiYnJldkltcGwoQWJicmV2LCBWYWxzLCBCbG9iKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSB1aW50dHk+CisgIHZvaWQgRW1pdFJlY29yZFdpdGhCbG9iKHVuc2lnbmVkIEFiYnJldiwgU21hbGxWZWN0b3JJbXBsPHVpbnR0eT4gJlZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJsb2JEYXRhLCB1bnNpZ25lZCBCbG9iTGVuKSB7CisgICAgcmV0dXJuIEVtaXRSZWNvcmRXaXRoQWJicmV2SW1wbChBYmJyZXYsIFZhbHMsIFN0cmluZ1JlZihCbG9iRGF0YSwgQmxvYkxlbikpOworICB9CisKKyAgLy8vIEVtaXRSZWNvcmRXaXRoQXJyYXkgLSBKdXN0IGxpa2UgRW1pdFJlY29yZFdpdGhCbG9iLCB3b3JrcyB3aXRoIHJlY29yZHMKKyAgLy8vIHRoYXQgZW5kIHdpdGggYW4gYXJyYXkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIHVpbnR0eT4KKyAgdm9pZCBFbWl0UmVjb3JkV2l0aEFycmF5KHVuc2lnbmVkIEFiYnJldiwgU21hbGxWZWN0b3JJbXBsPHVpbnR0eT4gJlZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBBcnJheSkgeworICAgIEVtaXRSZWNvcmRXaXRoQWJicmV2SW1wbChBYmJyZXYsIFZhbHMsIEFycmF5KTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSB1aW50dHk+CisgIHZvaWQgRW1pdFJlY29yZFdpdGhBcnJheSh1bnNpZ25lZCBBYmJyZXYsIFNtYWxsVmVjdG9ySW1wbDx1aW50dHk+ICZWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpBcnJheURhdGEsIHVuc2lnbmVkIEFycmF5TGVuKSB7CisgICAgcmV0dXJuIEVtaXRSZWNvcmRXaXRoQWJicmV2SW1wbChBYmJyZXYsIFZhbHMsIFN0cmluZ1JlZihBcnJheURhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMZW4pKTsKKyAgfQorICAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFiYnJldiBFbWlzc2lvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHJpdmF0ZToKKyAgLy8gRW1pdCB0aGUgYWJicmV2aWF0aW9uIGFzIGEgREVGSU5FX0FCQlJFViByZWNvcmQuCisgIHZvaWQgRW5jb2RlQWJicmV2KEJpdENvZGVBYmJyZXYgKkFiYnYpIHsKKyAgICBFbWl0Q29kZShiaXRjOjpERUZJTkVfQUJCUkVWKTsKKyAgICBFbWl0VkJSKEFiYnYtPmdldE51bU9wZXJhbmRJbmZvcygpLCA1KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEFiYnYtPmdldE51bU9wZXJhbmRJbmZvcygpKTsKKyAgICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBCaXRDb2RlQWJicmV2T3AgJk9wID0gQWJidi0+Z2V0T3BlcmFuZEluZm8oaSk7CisgICAgICBFbWl0KE9wLmlzTGl0ZXJhbCgpLCAxKTsKKyAgICAgIGlmIChPcC5pc0xpdGVyYWwoKSkgeworICAgICAgICBFbWl0VkJSNjQoT3AuZ2V0TGl0ZXJhbFZhbHVlKCksIDgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRW1pdChPcC5nZXRFbmNvZGluZygpLCAzKTsKKyAgICAgICAgaWYgKE9wLmhhc0VuY29kaW5nRGF0YSgpKQorICAgICAgICAgIEVtaXRWQlI2NChPcC5nZXRFbmNvZGluZ0RhdGEoKSwgNSk7CisgICAgICB9CisgICAgfQorICB9CitwdWJsaWM6CisKKyAgLy8vIEVtaXRBYmJyZXYgLSBUaGlzIGVtaXRzIGFuIGFiYnJldmlhdGlvbiB0byB0aGUgc3RyZWFtLiAgTm90ZSB0aGF0IHRoaXMKKyAgLy8vIG1ldGhvZCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHNwZWNpZmllZCBhYmJyZXYuCisgIHVuc2lnbmVkIEVtaXRBYmJyZXYoQml0Q29kZUFiYnJldiAqQWJidikgeworICAgIC8vIEVtaXQgdGhlIGFiYnJldmlhdGlvbiBhcyBhIHJlY29yZC4KKyAgICBFbmNvZGVBYmJyZXYoQWJidik7CisgICAgQ3VyQWJicmV2cy5wdXNoX2JhY2soQWJidik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihDdXJBYmJyZXZzLnNpemUoKSktMSArCisgICAgICBiaXRjOjpGSVJTVF9BUFBMSUNBVElPTl9BQkJSRVY7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQmxvY2tJbmZvIEJsb2NrIEVtaXNzaW9uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBFbnRlckJsb2NrSW5mb0Jsb2NrIC0gU3RhcnQgZW1pdHRpbmcgdGhlIEJMT0NLSU5GT19CTE9DSy4KKyAgdm9pZCBFbnRlckJsb2NrSW5mb0Jsb2NrKHVuc2lnbmVkIENvZGVXaWR0aCkgeworICAgIEVudGVyU3ViYmxvY2soYml0Yzo6QkxPQ0tJTkZPX0JMT0NLX0lELCBDb2RlV2lkdGgpOworICAgIEJsb2NrSW5mb0N1ckJJRCA9IC0xVTsKKyAgfQorcHJpdmF0ZToKKyAgLy8vIFN3aXRjaFRvQmxvY2tJRCAtIElmIHdlIGFyZW4ndCBhbHJlYWR5IHRhbGtpbmcgYWJvdXQgdGhlIHNwZWNpZmllZCBibG9jaworICAvLy8gSUQsIGVtaXQgYSBCTE9DS0lORk9fQ09ERV9TRVRCSUQgcmVjb3JkLgorICB2b2lkIFN3aXRjaFRvQmxvY2tJRCh1bnNpZ25lZCBCbG9ja0lEKSB7CisgICAgaWYgKEJsb2NrSW5mb0N1ckJJRCA9PSBCbG9ja0lEKSByZXR1cm47CisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IFY7CisgICAgVi5wdXNoX2JhY2soQmxvY2tJRCk7CisgICAgRW1pdFJlY29yZChiaXRjOjpCTE9DS0lORk9fQ09ERV9TRVRCSUQsIFYpOworICAgIEJsb2NrSW5mb0N1ckJJRCA9IEJsb2NrSUQ7CisgIH0KKworICBCbG9ja0luZm8gJmdldE9yQ3JlYXRlQmxvY2tJbmZvKHVuc2lnbmVkIEJsb2NrSUQpIHsKKyAgICBpZiAoQmxvY2tJbmZvICpCSSA9IGdldEJsb2NrSW5mbyhCbG9ja0lEKSkKKyAgICAgIHJldHVybiAqQkk7CisKKyAgICAvLyBPdGhlcndpc2UsIGFkZCBhIG5ldyByZWNvcmQuCisgICAgQmxvY2tJbmZvUmVjb3Jkcy5wdXNoX2JhY2soQmxvY2tJbmZvKCkpOworICAgIEJsb2NrSW5mb1JlY29yZHMuYmFjaygpLkJsb2NrSUQgPSBCbG9ja0lEOworICAgIHJldHVybiBCbG9ja0luZm9SZWNvcmRzLmJhY2soKTsKKyAgfQorCitwdWJsaWM6CisKKyAgLy8vIEVtaXRCbG9ja0luZm9BYmJyZXYgLSBFbWl0IGEgREVGSU5FX0FCQlJFViByZWNvcmQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIEJsb2NrSUQuCisgIHVuc2lnbmVkIEVtaXRCbG9ja0luZm9BYmJyZXYodW5zaWduZWQgQmxvY2tJRCwgQml0Q29kZUFiYnJldiAqQWJidikgeworICAgIFN3aXRjaFRvQmxvY2tJRChCbG9ja0lEKTsKKyAgICBFbmNvZGVBYmJyZXYoQWJidik7CisKKyAgICAvLyBBZGQgdGhlIGFiYnJldiB0byB0aGUgc3BlY2lmaWVkIGJsb2NrIHJlY29yZC4KKyAgICBCbG9ja0luZm8gJkluZm8gPSBnZXRPckNyZWF0ZUJsb2NrSW5mbyhCbG9ja0lEKTsKKyAgICBJbmZvLkFiYnJldnMucHVzaF9iYWNrKEFiYnYpOworCisgICAgcmV0dXJuIEluZm8uQWJicmV2cy5zaXplKCktMStiaXRjOjpGSVJTVF9BUFBMSUNBVElPTl9BQkJSRVY7CisgIH0KK307CisKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQml0Y29kZS9MTFZNQml0Q29kZXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0xMVk1CaXRDb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOWI2NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQml0Y29kZS9MTFZNQml0Q29kZXMuaApAQCAtMCwwICsxLDI1MSBAQAorLy89PT0tIExMVk1CaXRDb2Rlcy5oIC0gRW51bSB2YWx1ZXMgZm9yIHRoZSBMTFZNIGJpdGNvZGUgZm9ybWF0IC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIEJpdGNvZGUgZW51bSB2YWx1ZXMgZm9yIExMVk0gSVIgYml0Y29kZSBmaWxlcy4KKy8vCisvLyBUaGUgZW51bSB2YWx1ZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGVybWFuZW50LiAgSWYKKy8vIG5ldyBmZWF0dXJlcyBhcmUgYWRkZWQsIHRoZXkgc2hvdWxkIGhhdmUgdmFsdWVzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlCisvLyByZXNwZWN0aXZlIGxpc3RzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSVRDT0RFX0xMVk1CSVRDT0RFU19ICisjZGVmaW5lIExMVk1fQklUQ09ERV9MTFZNQklUQ09ERVNfSAorCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0JpdENvZGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBiaXRjIHsKKyAgLy8gVGhlIG9ubHkgdG9wLWxldmVsIGJsb2NrIHR5cGUgZGVmaW5lZCBpcyBmb3IgYSBtb2R1bGUuCisgIGVudW0gQmxvY2tJRHMgeworICAgIC8vIEJsb2NrcworICAgIE1PRFVMRV9CTE9DS19JRCAgICAgICAgICA9IEZJUlNUX0FQUExJQ0FUSU9OX0JMT0NLSUQsCisKKyAgICAvLyBNb2R1bGUgc3ViLWJsb2NrIGlkJ3MuCisgICAgUEFSQU1BVFRSX0JMT0NLX0lELAorICAgIFRZUEVfQkxPQ0tfSUQsCisgICAgQ09OU1RBTlRTX0JMT0NLX0lELAorICAgIEZVTkNUSU9OX0JMT0NLX0lELAorICAgIFRZUEVfU1lNVEFCX0JMT0NLX0lELAorICAgIFZBTFVFX1NZTVRBQl9CTE9DS19JRCwKKyAgICBNRVRBREFUQV9CTE9DS19JRCwKKyAgICBNRVRBREFUQV9BVFRBQ0hNRU5UX0lECisgIH07CisKKworICAvLy8gTU9EVUxFIGJsb2NrcyBoYXZlIGEgbnVtYmVyIG9mIG9wdGlvbmFsIGZpZWxkcyBhbmQgc3ViYmxvY2tzLgorICBlbnVtIE1vZHVsZUNvZGVzIHsKKyAgICBNT0RVTEVfQ09ERV9WRVJTSU9OICAgICA9IDEsICAgIC8vIFZFUlNJT046ICAgICBbdmVyc2lvbiNdCisgICAgTU9EVUxFX0NPREVfVFJJUExFICAgICAgPSAyLCAgICAvLyBUUklQTEU6ICAgICAgW3N0cmNociB4IE5dCisgICAgTU9EVUxFX0NPREVfREFUQUxBWU9VVCAgPSAzLCAgICAvLyBEQVRBTEFZT1VUOiAgW3N0cmNociB4IE5dCisgICAgTU9EVUxFX0NPREVfQVNNICAgICAgICAgPSA0LCAgICAvLyBBU006ICAgICAgICAgW3N0cmNociB4IE5dCisgICAgTU9EVUxFX0NPREVfU0VDVElPTk5BTUUgPSA1LCAgICAvLyBTRUNUSU9OTkFNRTogW3N0cmNociB4IE5dCisgICAgTU9EVUxFX0NPREVfREVQTElCICAgICAgPSA2LCAgICAvLyBERVBMSUI6ICAgICAgW3N0cmNociB4IE5dCisKKyAgICAvLyBHTE9CQUxWQVI6IFtwb2ludGVyIHR5cGUsIGlzY29uc3QsIGluaXRpZCwKKyAgICAvLyAgICAgICAgICAgICBsaW5rYWdlLCBhbGlnbm1lbnQsIHNlY3Rpb24sIHZpc2liaWxpdHksIHRocmVhZGxvY2FsXQorICAgIE1PRFVMRV9DT0RFX0dMT0JBTFZBUiAgID0gNywKKworICAgIC8vIEZVTkNUSU9OOiAgW3R5cGUsIGNhbGxpbmdjb252LCBpc3Byb3RvLCBsaW5rYWdlLCBwYXJhbWF0dHJzLCBhbGlnbm1lbnQsCisgICAgLy8gICAgICAgICAgICAgc2VjdGlvbiwgdmlzaWJpbGl0eV0KKyAgICBNT0RVTEVfQ09ERV9GVU5DVElPTiAgICA9IDgsCisKKyAgICAvLyBBTElBUzogW2FsaWFzIHR5cGUsIGFsaWFzZWUgdmFsIywgbGlua2FnZV0KKyAgICBNT0RVTEVfQ09ERV9BTElBUyAgICAgICA9IDksCisKKyAgICAvLy8gTU9EVUxFX0NPREVfUFVSR0VWQUxTOiBbbnVtdmFsc10KKyAgICBNT0RVTEVfQ09ERV9QVVJHRVZBTFMgICA9IDEwLAorCisgICAgTU9EVUxFX0NPREVfR0NOQU1FICAgICAgPSAxMSAgIC8vIEdDTkFNRTogW3N0cmNociB4IE5dCisgIH07CisKKyAgLy8vIFBBUkFNQVRUUiBibG9ja3MgaGF2ZSBjb2RlIGZvciBkZWZpbmluZyBhIHBhcmFtZXRlciBhdHRyaWJ1dGUgc2V0LgorICBlbnVtIEF0dHJpYnV0ZUNvZGVzIHsKKyAgICBQQVJBTUFUVFJfQ09ERV9FTlRSWSA9IDEgICAvLyBFTlRSWTogW3BhcmFtaWR4MCwgYXR0cjAsIHBhcmFtaWR4MSwgYXR0cjEuLi5dCisgIH07CisKKyAgLy8vIFRZUEUgYmxvY2tzIGhhdmUgY29kZXMgZm9yIGVhY2ggdHlwZSBwcmltaXRpdmUgdGhleSB1c2UuCisgIGVudW0gVHlwZUNvZGVzIHsKKyAgICBUWVBFX0NPREVfTlVNRU5UUlkgPSAgMSwgICAvLyBOVU1FTlRSWTogW251bWVudHJpZXNdCisKKyAgICAvLyBUeXBlIENvZGVzCisgICAgVFlQRV9DT0RFX1ZPSUQgICAgID0gIDIsICAgLy8gVk9JRAorICAgIFRZUEVfQ09ERV9GTE9BVCAgICA9ICAzLCAgIC8vIEZMT0FUCisgICAgVFlQRV9DT0RFX0RPVUJMRSAgID0gIDQsICAgLy8gRE9VQkxFCisgICAgVFlQRV9DT0RFX0xBQkVMICAgID0gIDUsICAgLy8gTEFCRUwKKyAgICBUWVBFX0NPREVfT1BBUVVFICAgPSAgNiwgICAvLyBPUEFRVUUKKyAgICBUWVBFX0NPREVfSU5URUdFUiAgPSAgNywgICAvLyBJTlRFR0VSOiBbd2lkdGhdCisgICAgVFlQRV9DT0RFX1BPSU5URVIgID0gIDgsICAgLy8gUE9JTlRFUjogW3BvaW50ZWUgdHlwZV0KKyAgICBUWVBFX0NPREVfRlVOQ1RJT04gPSAgOSwgICAvLyBGVU5DVElPTjogW3ZhcmFyZywgcmV0dHksIHBhcmFtdHkgeCBOXQorICAgIFRZUEVfQ09ERV9TVFJVQ1QgICA9IDEwLCAgIC8vIFNUUlVDVDogW2lzcGFja2VkLCBlbHR0eSB4IE5dCisgICAgVFlQRV9DT0RFX0FSUkFZICAgID0gMTEsICAgLy8gQVJSQVk6IFtudW1lbHRzLCBlbHR0eV0KKyAgICBUWVBFX0NPREVfVkVDVE9SICAgPSAxMiwgICAvLyBWRUNUT1I6IFtudW1lbHRzLCBlbHR0eV0KKworICAgIC8vIFRoZXNlIGFyZSBub3Qgd2l0aCB0aGUgb3RoZXIgZmxvYXRpbmcgcG9pbnQgdHlwZXMgYmVjYXVzZSB0aGV5J3JlCisgICAgLy8gYSBsYXRlIGFkZGl0aW9uLCBhbmQgcHV0dGluZyB0aGVtIGluIHRoZSByaWdodCBwbGFjZSBicmVha3MKKyAgICAvLyBiaW5hcnkgY29tcGF0aWJpbGl0eS4KKyAgICBUWVBFX0NPREVfWDg2X0ZQODAgPSAxMywgICAvLyBYODYgTE9ORyBET1VCTEUKKyAgICBUWVBFX0NPREVfRlAxMjggICAgPSAxNCwgICAvLyBMT05HIERPVUJMRSAoMTEyIGJpdCBtYW50aXNzYSkKKyAgICBUWVBFX0NPREVfUFBDX0ZQMTI4PSAxNSwgICAvLyBQUEMgTE9ORyBET1VCTEUgKDIgZG91YmxlcykKKworICAgIFRZUEVfQ09ERV9NRVRBREFUQSA9IDE2LCAgIC8vIE1FVEFEQVRBCisgICAgVFlQRV9DT0RFX1VOSU9OICAgID0gMTcgICAgLy8gVU5JT046IFtlbHR0eSB4IE5dCisgIH07CisKKyAgLy8gVGhlIHR5cGUgc3ltYm9sIHRhYmxlIG9ubHkgaGFzIG9uZSBjb2RlIChUU1RfRU5UUllfQ09ERSkuCisgIGVudW0gVHlwZVN5bXRhYkNvZGVzIHsKKyAgICBUU1RfQ09ERV9FTlRSWSA9IDEgICAgIC8vIFRTVF9FTlRSWTogW3R5cGVpZCwgbmFtZWNoYXIgeCBOXQorICB9OworCisgIC8vIFRoZSB2YWx1ZSBzeW1ib2wgdGFibGUgb25seSBoYXMgb25lIGNvZGUgKFZTVF9FTlRSWV9DT0RFKS4KKyAgZW51bSBWYWx1ZVN5bXRhYkNvZGVzIHsKKyAgICBWU1RfQ09ERV9FTlRSWSAgID0gMSwgIC8vIFZTVF9FTlRSWTogW3ZhbGlkLCBuYW1lY2hhciB4IE5dCisgICAgVlNUX0NPREVfQkJFTlRSWSA9IDIgICAvLyBWU1RfQkJFTlRSWTogW2JiaWQsIG5hbWVjaGFyIHggTl0KKyAgfTsKKworICBlbnVtIE1ldGFkYXRhQ29kZXMgeworICAgIE1FVEFEQVRBX1NUUklORyAgICAgICAgPSAxLCAgIC8vIE1EU1RSSU5HOiAgICAgIFt2YWx1ZXNdCisgICAgTUVUQURBVEFfTk9ERSAgICAgICAgICA9IDIsICAgLy8gTUROT0RFOiAgICAgICAgW24geCAodHlwZSBudW0sIHZhbHVlIG51bSldCisgICAgTUVUQURBVEFfRk5fTk9ERSAgICAgICA9IDMsICAgLy8gRk5fTUROT0RFOiAgICAgW24geCAodHlwZSBudW0sIHZhbHVlIG51bSldCisgICAgTUVUQURBVEFfTkFNRSAgICAgICAgICA9IDQsICAgLy8gU1RSSU5HOiAgICAgICAgW3ZhbHVlc10KKyAgICBNRVRBREFUQV9OQU1FRF9OT0RFICAgID0gNSwgICAvLyBOQU1FRE1ETk9ERTogICBbbiB4IG1kbm9kZXNdCisgICAgTUVUQURBVEFfS0lORCAgICAgICAgICA9IDYsICAgLy8gW24geCBbaWQsIG5hbWVdXQorICAgIE1FVEFEQVRBX0FUVEFDSE1FTlQgICAgPSA3ICAgIC8vIFttIHggW3ZhbHVlLCBbbiB4IFtpZCwgbWRub2RlXV1dCisgIH07CisgIC8vIFRoZSBjb25zdGFudHMgYmxvY2sgKENPTlNUQU5UU19CTE9DS19JRCkgZGVzY3JpYmVzIGVtaXNzaW9uIGZvciBlYWNoCisgIC8vIGNvbnN0YW50IGFuZCBtYWludGFpbnMgYW4gaW1wbGljaXQgY3VycmVudCB0eXBlIHZhbHVlLgorICBlbnVtIENvbnN0YW50c0NvZGVzIHsKKyAgICBDU1RfQ09ERV9TRVRUWVBFICAgICAgID0gIDEsICAvLyBTRVRUWVBFOiAgICAgICBbdHlwZWlkXQorICAgIENTVF9DT0RFX05VTEwgICAgICAgICAgPSAgMiwgIC8vIE5VTEwKKyAgICBDU1RfQ09ERV9VTkRFRiAgICAgICAgID0gIDMsICAvLyBVTkRFRgorICAgIENTVF9DT0RFX0lOVEVHRVIgICAgICAgPSAgNCwgIC8vIElOVEVHRVI6ICAgICAgIFtpbnR2YWxdCisgICAgQ1NUX0NPREVfV0lERV9JTlRFR0VSICA9ICA1LCAgLy8gV0lERV9JTlRFR0VSOiAgW24geCBpbnR2YWxdCisgICAgQ1NUX0NPREVfRkxPQVQgICAgICAgICA9ICA2LCAgLy8gRkxPQVQ6ICAgICAgICAgW2ZwdmFsXQorICAgIENTVF9DT0RFX0FHR1JFR0FURSAgICAgPSAgNywgIC8vIEFHR1JFR0FURTogICAgIFtuIHggdmFsdWUgbnVtYmVyXQorICAgIENTVF9DT0RFX1NUUklORyAgICAgICAgPSAgOCwgIC8vIFNUUklORzogICAgICAgIFt2YWx1ZXNdCisgICAgQ1NUX0NPREVfQ1NUUklORyAgICAgICA9ICA5LCAgLy8gQ1NUUklORzogICAgICAgW3ZhbHVlc10KKyAgICBDU1RfQ09ERV9DRV9CSU5PUCAgICAgID0gMTAsICAvLyBDRV9CSU5PUDogICAgICBbb3Bjb2RlLCBvcHZhbCwgb3B2YWxdCisgICAgQ1NUX0NPREVfQ0VfQ0FTVCAgICAgICA9IDExLCAgLy8gQ0VfQ0FTVDogICAgICAgW29wY29kZSwgb3B0eSwgb3B2YWxdCisgICAgQ1NUX0NPREVfQ0VfR0VQICAgICAgICA9IDEyLCAgLy8gQ0VfR0VQOiAgICAgICAgW24geCBvcGVyYW5kc10KKyAgICBDU1RfQ09ERV9DRV9TRUxFQ1QgICAgID0gMTMsICAvLyBDRV9TRUxFQ1Q6ICAgICBbb3B2YWwsIG9wdmFsLCBvcHZhbF0KKyAgICBDU1RfQ09ERV9DRV9FWFRSQUNURUxUID0gMTQsICAvLyBDRV9FWFRSQUNURUxUOiBbb3B0eSwgb3B2YWwsIG9wdmFsXQorICAgIENTVF9DT0RFX0NFX0lOU0VSVEVMVCAgPSAxNSwgIC8vIENFX0lOU0VSVEVMVDogIFtvcHZhbCwgb3B2YWwsIG9wdmFsXQorICAgIENTVF9DT0RFX0NFX1NIVUZGTEVWRUMgPSAxNiwgIC8vIENFX1NIVUZGTEVWRUM6IFtvcHZhbCwgb3B2YWwsIG9wdmFsXQorICAgIENTVF9DT0RFX0NFX0NNUCAgICAgICAgPSAxNywgIC8vIENFX0NNUDogICAgICAgIFtvcHR5LCBvcHZhbCwgb3B2YWwsIHByZWRdCisgICAgQ1NUX0NPREVfSU5MSU5FQVNNICAgICA9IDE4LCAgLy8gSU5MSU5FQVNNOiAgICAgW3NpZGVlZmZlY3QsYXNtc3RyLGNvbnN0c3RyXQorICAgIENTVF9DT0RFX0NFX1NIVUZWRUNfRVggPSAxOSwgIC8vIFNIVUZWRUNfRVg6ICAgIFtvcHR5LCBvcHZhbCwgb3B2YWwsIG9wdmFsXQorICAgIENTVF9DT0RFX0NFX0lOQk9VTkRTX0dFUCA9IDIwLC8vIElOQk9VTkRTX0dFUDogIFtuIHggb3BlcmFuZHNdCisgICAgQ1NUX0NPREVfQkxPQ0tBRERSRVNTICA9IDIxICAgLy8gQ1NUX0NPREVfQkxPQ0tBRERSRVNTIFtmbnR5LCBmbnZhbCwgYmIjXQorICB9OworCisgIC8vLyBDYXN0T3Bjb2RlcyAtIFRoZXNlIGFyZSB2YWx1ZXMgdXNlZCBpbiB0aGUgYml0Y29kZSBmaWxlcyB0byBlbmNvZGUgd2hpY2gKKyAgLy8vIGNhc3QgYSBDU1RfQ09ERV9DRV9DQVNUIG9yIGEgWFhYIHJlZmVycyB0by4gIFRoZSB2YWx1ZXMgb2YgdGhlc2UgZW51bXMKKyAgLy8vIGhhdmUgbm8gZml4ZWQgcmVsYXRpb24gdG8gdGhlIExMVk0gSVIgZW51bSB2YWx1ZXMuICBDaGFuZ2luZyB0aGVzZSB3aWxsCisgIC8vLyBicmVhayBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpbGVzLgorICBlbnVtIENhc3RPcGNvZGVzIHsKKyAgICBDQVNUX1RSVU5DICAgID0gIDAsCisgICAgQ0FTVF9aRVhUICAgICA9ICAxLAorICAgIENBU1RfU0VYVCAgICAgPSAgMiwKKyAgICBDQVNUX0ZQVE9VSSAgID0gIDMsCisgICAgQ0FTVF9GUFRPU0kgICA9ICA0LAorICAgIENBU1RfVUlUT0ZQICAgPSAgNSwKKyAgICBDQVNUX1NJVE9GUCAgID0gIDYsCisgICAgQ0FTVF9GUFRSVU5DICA9ICA3LAorICAgIENBU1RfRlBFWFQgICAgPSAgOCwKKyAgICBDQVNUX1BUUlRPSU5UID0gIDksCisgICAgQ0FTVF9JTlRUT1BUUiA9IDEwLAorICAgIENBU1RfQklUQ0FTVCAgPSAxMQorICB9OworCisgIC8vLyBCaW5hcnlPcGNvZGVzIC0gVGhlc2UgYXJlIHZhbHVlcyB1c2VkIGluIHRoZSBiaXRjb2RlIGZpbGVzIHRvIGVuY29kZSB3aGljaAorICAvLy8gYmlub3AgYSBDU1RfQ09ERV9DRV9CSU5PUCBvciBhIFhYWCByZWZlcnMgdG8uICBUaGUgdmFsdWVzIG9mIHRoZXNlIGVudW1zCisgIC8vLyBoYXZlIG5vIGZpeGVkIHJlbGF0aW9uIHRvIHRoZSBMTFZNIElSIGVudW0gdmFsdWVzLiAgQ2hhbmdpbmcgdGhlc2Ugd2lsbAorICAvLy8gYnJlYWsgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBmaWxlcy4KKyAgZW51bSBCaW5hcnlPcGNvZGVzIHsKKyAgICBCSU5PUF9BREQgID0gIDAsCisgICAgQklOT1BfU1VCICA9ICAxLAorICAgIEJJTk9QX01VTCAgPSAgMiwKKyAgICBCSU5PUF9VRElWID0gIDMsCisgICAgQklOT1BfU0RJViA9ICA0LCAgICAvLyBvdmVybG9hZGVkIGZvciBGUAorICAgIEJJTk9QX1VSRU0gPSAgNSwKKyAgICBCSU5PUF9TUkVNID0gIDYsICAgIC8vIG92ZXJsb2FkZWQgZm9yIEZQCisgICAgQklOT1BfU0hMICA9ICA3LAorICAgIEJJTk9QX0xTSFIgPSAgOCwKKyAgICBCSU5PUF9BU0hSID0gIDksCisgICAgQklOT1BfQU5EICA9IDEwLAorICAgIEJJTk9QX09SICAgPSAxMSwKKyAgICBCSU5PUF9YT1IgID0gMTIKKyAgfTsKKworICAvLy8gT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvck9wdGlvbmFsRmxhZ3MgLSBGbGFncyBmb3Igc2VyaWFsaXppbmcKKyAgLy8vIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3IncyBTdWJjbGFzc09wdGlvbmFsRGF0YSBjb250ZW50cy4KKyAgZW51bSBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yT3B0aW9uYWxGbGFncyB7CisgICAgT0JPX05PX1VOU0lHTkVEX1dSQVAgPSAwLAorICAgIE9CT19OT19TSUdORURfV1JBUCA9IDEKKyAgfTsKKworICAvLy8gU0Rpdk9wZXJhdG9yT3B0aW9uYWxGbGFncyAtIEZsYWdzIGZvciBzZXJpYWxpemluZyBTRGl2T3BlcmF0b3IncworICAvLy8gU3ViY2xhc3NPcHRpb25hbERhdGEgY29udGVudHMuCisgIGVudW0gU0Rpdk9wZXJhdG9yT3B0aW9uYWxGbGFncyB7CisgICAgU0RJVl9FWEFDVCA9IDAKKyAgfTsKKworICAvLyBUaGUgZnVuY3Rpb24gYm9keSBibG9jayAoRlVOQ1RJT05fQkxPQ0tfSUQpIGRlc2NyaWJlcyBmdW5jdGlvbiBib2RpZXMuICBJdAorICAvLyBjYW4gY29udGFpbiBhIGNvbnN0YW50IGJsb2NrIChDT05TVEFOVFNfQkxPQ0tfSUQpLgorICBlbnVtIEZ1bmN0aW9uQ29kZXMgeworICAgIEZVTkNfQ09ERV9ERUNMQVJFQkxPQ0tTICAgID0gIDEsIC8vIERFQ0xBUkVCTE9DS1M6IFtuXQorCisgICAgRlVOQ19DT0RFX0lOU1RfQklOT1AgICAgICAgPSAgMiwgLy8gQklOT1A6ICAgICAgW29wY29kZSwgdHksIG9wdmFsLCBvcHZhbF0KKyAgICBGVU5DX0NPREVfSU5TVF9DQVNUICAgICAgICA9ICAzLCAvLyBDQVNUOiAgICAgICBbb3Bjb2RlLCB0eSwgb3B0eSwgb3B2YWxdCisgICAgRlVOQ19DT0RFX0lOU1RfR0VQICAgICAgICAgPSAgNCwgLy8gR0VQOiAgICAgICAgW24geCBvcGVyYW5kc10KKyAgICBGVU5DX0NPREVfSU5TVF9TRUxFQ1QgICAgICA9ICA1LCAvLyBTRUxFQ1Q6ICAgICBbdHksIG9wdmFsLCBvcHZhbCwgb3B2YWxdCisgICAgRlVOQ19DT0RFX0lOU1RfRVhUUkFDVEVMVCAgPSAgNiwgLy8gRVhUUkFDVEVMVDogW29wdHksIG9wdmFsLCBvcHZhbF0KKyAgICBGVU5DX0NPREVfSU5TVF9JTlNFUlRFTFQgICA9ICA3LCAvLyBJTlNFUlRFTFQ6ICBbdHksIG9wdmFsLCBvcHZhbCwgb3B2YWxdCisgICAgRlVOQ19DT0RFX0lOU1RfU0hVRkZMRVZFQyAgPSAgOCwgLy8gU0hVRkZMRVZFQzogW3R5LCBvcHZhbCwgb3B2YWwsIG9wdmFsXQorICAgIEZVTkNfQ09ERV9JTlNUX0NNUCAgICAgICAgID0gIDksIC8vIENNUDogICAgICAgIFtvcHR5LCBvcHZhbCwgb3B2YWwsIHByZWRdCisKKyAgICBGVU5DX0NPREVfSU5TVF9SRVQgICAgICAgICA9IDEwLCAvLyBSRVQ6ICAgICAgICBbb3B0eSxvcHZhbDxib3RoIG9wdGlvbmFsPl0KKyAgICBGVU5DX0NPREVfSU5TVF9CUiAgICAgICAgICA9IDExLCAvLyBCUjogICAgICAgICBbYmIjLCBiYiMsIGNvbmRdIG9yIFtiYiNdCisgICAgRlVOQ19DT0RFX0lOU1RfU1dJVENIICAgICAgPSAxMiwgLy8gU1dJVENIOiAgICAgW29wdHksIG9wMCwgb3AxLCAuLi5dCisgICAgRlVOQ19DT0RFX0lOU1RfSU5WT0tFICAgICAgPSAxMywgLy8gSU5WT0tFOiAgICAgW2F0dHIsIGZudHksIG9wMCxvcDEsIC4uLl0KKyAgICBGVU5DX0NPREVfSU5TVF9VTldJTkQgICAgICA9IDE0LCAvLyBVTldJTkQKKyAgICBGVU5DX0NPREVfSU5TVF9VTlJFQUNIQUJMRSA9IDE1LCAvLyBVTlJFQUNIQUJMRQorCisgICAgRlVOQ19DT0RFX0lOU1RfUEhJICAgICAgICAgPSAxNiwgLy8gUEhJOiAgICAgICAgW3R5LCB2YWwwLGJiMCwgLi4uXQorICAgIEZVTkNfQ09ERV9JTlNUX01BTExPQyAgICAgID0gMTcsIC8vIE1BTExPQzogICAgIFtpbnN0dHksIG9wLCBhbGlnbl0KKyAgICBGVU5DX0NPREVfSU5TVF9GUkVFICAgICAgICA9IDE4LCAvLyBGUkVFOiAgICAgICBbb3B0eSwgb3BdCisgICAgRlVOQ19DT0RFX0lOU1RfQUxMT0NBICAgICAgPSAxOSwgLy8gQUxMT0NBOiAgICAgW2luc3R0eSwgb3AsIGFsaWduXQorICAgIEZVTkNfQ09ERV9JTlNUX0xPQUQgICAgICAgID0gMjAsIC8vIExPQUQ6ICAgICAgIFtvcHR5LCBvcCwgYWxpZ24sIHZvbF0KKyAgICAvLyBGSVhNRTogUmVtb3ZlIFNUT1JFIGluIGZhdm9yIG9mIFNUT1JFMiBpbiBMTFZNIDMuMAorICAgIEZVTkNfQ09ERV9JTlNUX1NUT1JFICAgICAgID0gMjEsIC8vIFNUT1JFOiAgICAgIFt2YWx0eSx2YWwscHRyLCBhbGlnbiwgdm9sXQorICAgIEZVTkNfQ09ERV9JTlNUX0NBTEwgICAgICAgID0gMjIsIC8vIENBTEw6ICAgICAgIFthdHRyLCBmbnR5LCBmbmlkLCBhcmdzLi4uXQorICAgIEZVTkNfQ09ERV9JTlNUX1ZBQVJHICAgICAgID0gMjMsIC8vIFZBQVJHOiAgICAgIFt2YWxpc3R0eSwgdmFsaXN0LCBpbnN0dHldCisgICAgLy8gVGhpcyBzdG9yZSBjb2RlIGVuY29kZXMgdGhlIHBvaW50ZXIgdHlwZSwgcmF0aGVyIHRoYW4gdGhlIHZhbHVlIHR5cGUKKyAgICAvLyB0aGlzIGlzIHNvIGluZm9ybWF0aW9uIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBwb2ludGVyIHR5cGUgKGUuZy4gYWRkcmVzcworICAgIC8vIHNwYWNlcykgaXMgcmV0YWluZWQuCisgICAgRlVOQ19DT0RFX0lOU1RfU1RPUkUyICAgICAgPSAyNCwgLy8gU1RPUkU6ICAgICAgW3B0cnR5LHB0cix2YWwsIGFsaWduLCB2b2xdCisgICAgLy8gRklYTUU6IFJlbW92ZSBHRVRSRVNVTFQgaW4gZmF2b3Igb2YgRVhUUkFDVFZBTCBpbiBMTFZNIDMuMAorICAgIEZVTkNfQ09ERV9JTlNUX0dFVFJFU1VMVCAgID0gMjUsIC8vIEdFVFJFU1VMVDogIFt0eSwgb3B2YWwsIG5dCisgICAgRlVOQ19DT0RFX0lOU1RfRVhUUkFDVFZBTCAgPSAyNiwgLy8gRVhUUkFDVFZBTDogW24geCBvcGVyYW5kc10KKyAgICBGVU5DX0NPREVfSU5TVF9JTlNFUlRWQUwgICA9IDI3LCAvLyBJTlNFUlRWQUw6ICBbbiB4IG9wZXJhbmRzXQorICAgIC8vIGZjbXAvaWNtcCByZXR1cm5pbmcgSW50MVRZIG9yIHZlY3RvciBvZiBJbnQxVHkuIFNhbWUgYXMgQ01QLCBleGlzdHMgdG8KKyAgICAvLyBzdXBwb3J0IGxlZ2FjeSB2aWNtcC92ZmNtcCBpbnN0cnVjdGlvbnMuCisgICAgRlVOQ19DT0RFX0lOU1RfQ01QMiAgICAgICAgPSAyOCwgLy8gQ01QMjogICAgICAgW29wdHksIG9wdmFsLCBvcHZhbCwgcHJlZF0KKyAgICAvLyBuZXcgc2VsZWN0IG9uIGkxIG9yIFtOIHggaTFdCisgICAgRlVOQ19DT0RFX0lOU1RfVlNFTEVDVCAgICAgPSAyOSwgLy8gVlNFTEVDVDogICAgW3R5LG9wdmFsLG9wdmFsLHByZWR0eSxwcmVkXQorICAgIEZVTkNfQ09ERV9JTlNUX0lOQk9VTkRTX0dFUD0gMzAsIC8vIElOQk9VTkRTX0dFUDogW24geCBvcGVyYW5kc10KKyAgICBGVU5DX0NPREVfSU5TVF9JTkRJUkVDVEJSICA9IDMxLCAvLyBJTkRJUkVDVEJSOiBbb3B0eSwgb3AwLCBvcDEsIC4uLl0KKyAgICAKKyAgICBGVU5DX0NPREVfREVCVUdfTE9DICAgICAgICA9IDMyLCAvLyBERUJVR19MT0M6IFtMaW5lLENvbCxTY29wZVZhbCwgSUFWYWxdCisgICAgRlVOQ19DT0RFX0RFQlVHX0xPQ19BR0FJTiAgPSAzMyAgLy8gREVCVUdfTE9DX0FHQUlOCisgIH07Cit9IC8vIEVuZCBiaXRjIG5hbWVzcGFjZQorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQml0Y29kZS9SZWFkZXJXcml0ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9CaXRjb2RlL1JlYWRlcldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODY5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQml0Y29kZS9SZWFkZXJXcml0ZXIuaApAQCAtMCwwICsxLDEzNiBAQAorLy89PT0tLSBsbHZtL0JpdGNvZGUvUmVhZGVyV3JpdGVyLmggLSBCaXRjb2RlIHJlYWRlci93cml0ZXJzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIGludGVyZmFjZXMgdG8gcmVhZCBhbmQgd3JpdGUgTExWTSBiaXRjb2RlIGZpbGVzL3N0cmVhbXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJVENPREVfSAorI2RlZmluZSBMTFZNX0JJVENPREVfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1vZHVsZTsKKyAgY2xhc3MgTWVtb3J5QnVmZmVyOworICBjbGFzcyBNb2R1bGVQYXNzOworICBjbGFzcyBCaXRzdHJlYW1Xcml0ZXI7CisgIGNsYXNzIExMVk1Db250ZXh0OworICBjbGFzcyByYXdfb3N0cmVhbTsKKyAgCisgIC8vLyBnZXRMYXp5Qml0Y29kZU1vZHVsZSAtIFJlYWQgdGhlIGhlYWRlciBvZiB0aGUgc3BlY2lmaWVkIGJpdGNvZGUgYnVmZmVyCisgIC8vLyBhbmQgcHJlcGFyZSBmb3IgbGF6eSBkZXNlcmlhbGl6YXRpb24gb2YgZnVuY3Rpb24gYm9kaWVzLiAgSWYgc3VjY2Vzc2Z1bCwKKyAgLy8vIHRoaXMgdGFrZXMgb3duZXJzaGlwIG9mICdidWZmZXInIGFuZCByZXR1cm5zIGEgbm9uLW51bGwgcG9pbnRlci4gIE9uCisgIC8vLyBlcnJvciwgdGhpcyByZXR1cm5zIG51bGwsICpkb2VzIG5vdCogdGFrZSBvd25lcnNoaXAgb2YgQnVmZmVyLCBhbmQgZmlsbHMKKyAgLy8vIGluICpFcnJNc2cgd2l0aCBhbiBlcnJvciBkZXNjcmlwdGlvbiBpZiBFcnJNc2cgaXMgbm9uLW51bGwuCisgIE1vZHVsZSAqZ2V0TGF6eUJpdGNvZGVNb2R1bGUoTWVtb3J5QnVmZmVyICpCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQmIENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZyA9IDApOworCisgIC8vLyBQYXJzZUJpdGNvZGVGaWxlIC0gUmVhZCB0aGUgc3BlY2lmaWVkIGJpdGNvZGUgZmlsZSwgcmV0dXJuaW5nIHRoZSBtb2R1bGUuCisgIC8vLyBJZiBhbiBlcnJvciBvY2N1cnMsIHRoaXMgcmV0dXJucyBudWxsIGFuZCBmaWxscyBpbiAqRXJyTXNnIGlmIGl0IGlzCisgIC8vLyBub24tbnVsbC4gIFRoaXMgbWV0aG9kICpuZXZlciogdGFrZXMgb3duZXJzaGlwIG9mIEJ1ZmZlci4KKyAgTW9kdWxlICpQYXJzZUJpdGNvZGVGaWxlKE1lbW9yeUJ1ZmZlciAqQnVmZmVyLCBMTFZNQ29udGV4dCYgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJNc2cgPSAwKTsKKworICAvLy8gV3JpdGVCaXRjb2RlVG9GaWxlIC0gV3JpdGUgdGhlIHNwZWNpZmllZCBtb2R1bGUgdG8gdGhlIHNwZWNpZmllZAorICAvLy8gcmF3IG91dHB1dCBzdHJlYW0uICBGb3Igc3RyZWFtcyB3aGVyZSBpdCBtYXR0ZXJzLCB0aGUgZ2l2ZW4gc3RyZWFtCisgIC8vLyBzaG91bGQgYmUgaW4gImJpbmFyeSIgbW9kZS4KKyAgdm9pZCBXcml0ZUJpdGNvZGVUb0ZpbGUoY29uc3QgTW9kdWxlICpNLCByYXdfb3N0cmVhbSAmT3V0KTsKKworICAvLy8gV3JpdGVCaXRjb2RlVG9TdHJlYW0gLSBXcml0ZSB0aGUgc3BlY2lmaWVkIG1vZHVsZSB0byB0aGUgc3BlY2lmaWVkCisgIC8vLyByYXcgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBXcml0ZUJpdGNvZGVUb1N0cmVhbShjb25zdCBNb2R1bGUgKk0sIEJpdHN0cmVhbVdyaXRlciAmU3RyZWFtKTsKKworICAvLy8gY3JlYXRlQml0Y29kZVdyaXRlclBhc3MgLSBDcmVhdGUgYW5kIHJldHVybiBhIHBhc3MgdGhhdCB3cml0ZXMgdGhlIG1vZHVsZQorICAvLy8gdG8gdGhlIHNwZWNpZmllZCBvc3RyZWFtLgorICBNb2R1bGVQYXNzICpjcmVhdGVCaXRjb2RlV3JpdGVyUGFzcyhyYXdfb3N0cmVhbSAmU3RyKTsKKyAgCisgIAorICAvLy8gaXNCaXRjb2RlV3JhcHBlciAtIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlcyBhcmUgdGhlIG1hZ2ljIGJ5dGVzCisgIC8vLyBmb3IgYW4gTExWTSBJUiBiaXRjb2RlIHdyYXBwZXIuCisgIC8vLworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNCaXRjb2RlV3JhcHBlcihjb25zdCB1bnNpZ25lZCBjaGFyICpCdWZQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1ZkVuZCkgeworICAgIC8vIFNlZSBpZiB5b3UgY2FuIGZpbmQgdGhlIGhpZGRlbiBtZXNzYWdlIGluIHRoZSBtYWdpYyBieXRlcyA6LSkuCisgICAgLy8gKEhpbnQ6IGl0J3MgYSBsaXR0bGUtZW5kaWFuIGVuY29kaW5nLikKKyAgICByZXR1cm4gQnVmUHRyICE9IEJ1ZkVuZCAmJgorICAgICAgICAgICBCdWZQdHJbMF0gPT0gMHhERSAmJgorICAgICAgICAgICBCdWZQdHJbMV0gPT0gMHhDMCAmJgorICAgICAgICAgICBCdWZQdHJbMl0gPT0gMHgxNyAmJgorICAgICAgICAgICBCdWZQdHJbM10gPT0gMHgwQjsKKyAgfQorCisgIC8vLyBpc1Jhd0JpdGNvZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZXMgYXJlIHRoZSBtYWdpYyBieXRlcyBmb3IKKyAgLy8vIHJhdyBMTFZNIElSIGJpdGNvZGUgKHdpdGhvdXQgYSB3cmFwcGVyKS4KKyAgLy8vCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1Jhd0JpdGNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqQnVmUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1ZkVuZCkgeworICAgIC8vIFRoZXNlIGJ5dGVzIHNvcnQgb2YgaGF2ZSBhIGhpZGRlbiBtZXNzYWdlLCBidXQgaXQncyBub3QgaW4KKyAgICAvLyBsaXR0bGUtZW5kaWFuIHRoaXMgdGltZSwgYW5kIGl0J3MgYSBsaXR0bGUgcmVkdW5kYW50LgorICAgIHJldHVybiBCdWZQdHIgIT0gQnVmRW5kICYmCisgICAgICAgICAgIEJ1ZlB0clswXSA9PSAnQicgJiYKKyAgICAgICAgICAgQnVmUHRyWzFdID09ICdDJyAmJgorICAgICAgICAgICBCdWZQdHJbMl0gPT0gMHhjMCAmJgorICAgICAgICAgICBCdWZQdHJbM10gPT0gMHhkZTsKKyAgfQorCisgIC8vLyBpc0JpdGNvZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZXMgYXJlIHRoZSBtYWdpYyBieXRlcyBmb3IKKyAgLy8vIExMVk0gSVIgYml0Y29kZSwgZWl0aGVyIHdpdGggb3Igd2l0aG91dCBhIHdyYXBwZXIuCisgIC8vLworICBzdGF0aWMgYm9vbCBpbmxpbmUgaXNCaXRjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1ZlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpCdWZFbmQpIHsKKyAgICByZXR1cm4gaXNCaXRjb2RlV3JhcHBlcihCdWZQdHIsIEJ1ZkVuZCkgfHwKKyAgICAgICAgICAgaXNSYXdCaXRjb2RlKEJ1ZlB0ciwgQnVmRW5kKTsKKyAgfQorCisgIC8vLyBTa2lwQml0Y29kZVdyYXBwZXJIZWFkZXIgLSBTb21lIHN5c3RlbXMgd3JhcCBiYyBmaWxlcyB3aXRoIGEgc3BlY2lhbAorICAvLy8gaGVhZGVyIGZvciBwYWRkaW5nIG9yIG90aGVyIHJlYXNvbnMuICBUaGUgZm9ybWF0IG9mIHRoaXMgaGVhZGVyIGlzOgorICAvLy8KKyAgLy8vIHN0cnVjdCBiY19oZWFkZXIgeworICAvLy8gICB1aW50MzJfdCBNYWdpYzsgICAgICAgICAvLyAweDBCMTdDMERFCisgIC8vLyAgIHVpbnQzMl90IFZlcnNpb247ICAgICAgIC8vIFZlcnNpb24sIGN1cnJlbnRseSBhbHdheXMgMC4KKyAgLy8vICAgdWludDMyX3QgQml0Y29kZU9mZnNldDsgLy8gT2Zmc2V0IHRvIHRyYWRpdGlvbmFsIGJpdGNvZGUgZmlsZS4KKyAgLy8vICAgdWludDMyX3QgQml0Y29kZVNpemU7ICAgLy8gU2l6ZSBvZiB0cmFkaXRpb25hbCBiaXRjb2RlIGZpbGUuCisgIC8vLyAgIC4uLiBwb3RlbnRpYWxseSBvdGhlciBndW5rIC4uLgorICAvLy8gfTsKKyAgLy8vIAorICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBmaW5kIGEgZmlsZSB3aXRoIGEgbWF0Y2hpbmcgbWFnaWMgbnVtYmVyLgorICAvLy8gSW4gdGhpcyBjYXNlLCBza2lwIGRvd24gdG8gdGhlIHN1YnNlY3Rpb24gb2YgdGhlIGZpbGUgdGhhdCBpcyBhY3R1YWxseSBhCisgIC8vLyBCQyBmaWxlLgorICBzdGF0aWMgaW5saW5lIGJvb2wgU2tpcEJpdGNvZGVXcmFwcGVySGVhZGVyKHVuc2lnbmVkIGNoYXIgKiZCdWZQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqJkJ1ZkVuZCkgeworICAgIGVudW0geworICAgICAgS25vd25IZWFkZXJTaXplID0gNCo0LCAgLy8gU2l6ZSBvZiBoZWFkZXIgd2UgcmVhZC4KKyAgICAgIE9mZnNldEZpZWxkID0gMio0LCAgICAgIC8vIE9mZnNldCBpbiBieXRlcyB0byBPZmZzZXQgZmllbGQuCisgICAgICBTaXplRmllbGQgPSAzKjQgICAgICAgICAvLyBPZmZzZXQgaW4gYnl0ZXMgdG8gU2l6ZSBmaWVsZC4KKyAgICB9OworICAgIAorICAgIC8vIE11c3QgY29udGFpbiB0aGUgaGVhZGVyIQorICAgIGlmIChCdWZFbmQtQnVmUHRyIDwgS25vd25IZWFkZXJTaXplKSByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICB1bnNpZ25lZCBPZmZzZXQgPSAoIEJ1ZlB0cltPZmZzZXRGaWVsZCAgXSAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAoQnVmUHRyW09mZnNldEZpZWxkKzFdIDw8IDgpICB8CisgICAgICAgICAgICAgICAgICAgICAgIChCdWZQdHJbT2Zmc2V0RmllbGQrMl0gPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKEJ1ZlB0cltPZmZzZXRGaWVsZCszXSA8PCAyNCkpOworICAgIHVuc2lnbmVkIFNpemUgICA9ICggQnVmUHRyW1NpemVGaWVsZCAgICBdICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIChCdWZQdHJbU2l6ZUZpZWxkICArMV0gPDwgOCkgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKEJ1ZlB0cltTaXplRmllbGQgICsyXSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAoQnVmUHRyW1NpemVGaWVsZCAgKzNdIDw8IDI0KSk7CisgICAgCisgICAgLy8gVmVyaWZ5IHRoYXQgT2Zmc2V0K1NpemUgZml0cyBpbiB0aGUgZmlsZS4KKyAgICBpZiAoT2Zmc2V0K1NpemUgPiB1bnNpZ25lZChCdWZFbmQtQnVmUHRyKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIEJ1ZlB0ciArPSBPZmZzZXQ7CisgICAgQnVmRW5kID0gQnVmUHRyK1NpemU7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTRmNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTkgQEAKK3NldChMTFZNX1RBUkdFVF9ERUZJTklUSU9OUyBJbnRyaW5zaWNzLnRkKQorCit0YWJsZWdlbihJbnRyaW5zaWNzLmdlbiAtZ2VuLWludHJpbnNpYykKKworYWRkX2N1c3RvbV90YXJnZXQoaW50cmluc2ljc19nZW4gQUxMCisgIERFUEVORFMgJHtsbHZtX2J1aWxkZWRfaW5jc19kaXJ9L0ludHJpbnNpY3MuZ2VuKQorCitzZXQoTExWTV9DT01NT05fREVQRU5EUyAke0xMVk1fQ09NTU9OX0RFUEVORFN9IGludHJpbnNpY3NfZ2VuIFBBUkVOVF9TQ09QRSkKKworaWYoIE1TVkNfSURFIE9SIFhDT0RFICkKKyAgIyBDcmVhdGVzIGEgZHVtbXkgdGFyZ2V0IGNvbnRhaW5pbmcgYWxsIGhlYWRlcnMgZm9yIHRoZSBiZW5lZml0IG9mCisgICMgVmlzdWFsIFN0dWRpbyB1c2Vycy4KKyAgZmlsZShHTE9CX1JFQ1VSU0UgaGVhZGVycyAqLmgpCisgIGFkZF90ZF9zb3VyY2VzKGhlYWRlcnMpCisgIGFkZF9saWJyYXJ5KGxsdm1faGVhZGVyc19kb19ub3RfYnVpbGQgRVhDTFVERV9GUk9NX0FMTAorICAgICMgV2UgbmVlZCBhdCBsZWFzdCBvbmUgc291cmNlIGZpbGU6CisgICAgJHtMTFZNX01BSU5fU1JDX0RJUn0vbGliL1RyYW5zZm9ybXMvSGVsbG8vSGVsbG8uY3BwCisgICAgJHtoZWFkZXJzfSkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9DYWxsR3JhcGhTQ0NQYXNzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ2FsbEdyYXBoU0NDUGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNTRhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ2FsbEdyYXBoU0NDUGFzcy5oCkBAIC0wLDAgKzEsMTA0IEBACisvLz09PS0gQ2FsbEdyYXBoU0NDUGFzcy5oIC0gUGFzcyB0aGF0IG9wZXJhdGVzIEJVIG9uIGNhbGwgZ3JhcGggLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDYWxsR3JhcGhTQ0NQYXNzIGNsYXNzLCB3aGljaCBpcyB1c2VkIGZvciBwYXNzZXMgd2hpY2gKKy8vIGFyZSBpbXBsZW1lbnRlZCBhcyBib3R0b20tdXAgdHJhdmVyc2FscyBvbiB0aGUgY2FsbCBncmFwaC4gIEJlY2F1c2UgdGhlcmUgbWF5CisvLyBiZSBjeWNsZXMgaW4gdGhlIGNhbGwgZ3JhcGgsIHBhc3NlcyBvZiB0aGlzIHR5cGUgb3BlcmF0ZSBvbiB0aGUgY2FsbC1ncmFwaCBpbgorLy8gU0NDIG9yZGVyOiB0aGF0IGlzLCB0aGV5IHByb2Nlc3MgZnVuY3Rpb24gYm90dG9tLXVwLCBleGNlcHQgZm9yIHJlY3Vyc2l2ZQorLy8gZnVuY3Rpb25zLCB3aGljaCB0aGV5IHByb2Nlc3MgYWxsIGF0IG9uY2UuCisvLworLy8gVGhlc2UgcGFzc2VzIGFyZSBpbmhlcmVudGx5IGludGVycHJvY2VkdXJhbCwgYW5kIGFyZSByZXF1aXJlZCB0byBrZWVwIHRoZQorLy8gY2FsbCBncmFwaCB1cC10by1kYXRlIGlmIHRoZXkgZG8gYW55dGhpbmcgd2hpY2ggY291bGQgbW9kaWZ5IGl0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DQUxMX0dSQVBIX1NDQ19QQVNTX0gKKyNkZWZpbmUgTExWTV9DQUxMX0dSQVBIX1NDQ19QQVNTX0gKKworI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ2FsbEdyYXBoTm9kZTsKK2NsYXNzIENhbGxHcmFwaDsKK2NsYXNzIFBNU3RhY2s7CitjbGFzcyBDYWxsR3JhcGhTQ0M7CisgIAorY2xhc3MgQ2FsbEdyYXBoU0NDUGFzcyA6IHB1YmxpYyBQYXNzIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ2FsbEdyYXBoU0NDUGFzcyhjaGFyICZwaWQpIDogUGFzcyhQVF9DYWxsR3JhcGhTQ0MsIHBpZCkge30KKworICAvLy8gY3JlYXRlUHJpbnRlclBhc3MgLSBHZXQgYSBwYXNzIHRoYXQgcHJpbnRzIHRoZSBNb2R1bGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gYSBDYWxsR3JhcGguCisgIFBhc3MgKmNyZWF0ZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPLCBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSBjb25zdDsKKworICAvLy8gZG9Jbml0aWFsaXphdGlvbiAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIFNDQydzIG9mIHRoZSBwcm9ncmFtCisgIC8vLyBoYXMgYmVlbiBwcm9jZXNzZWQsIGFsbG93aW5nIHRoZSBwYXNzIHRvIGRvIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oQ2FsbEdyYXBoICZDRykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBydW5PblNDQyAtIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc3ViY2xhc3MgdG8gcGVyZm9ybQorICAvLy8gd2hhdGV2ZXIgYWN0aW9uIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHNwZWNpZmllZCBTQ0MuICBOb3RlIHRoYXQKKyAgLy8vIG5vbi1yZWN1cnNpdmUgKG9yIG9ubHkgc2VsZi1yZWN1cnNpdmUpIGZ1bmN0aW9ucyB3aWxsIGhhdmUgYW4gU0NDIHNpemUgb2YKKyAgLy8vIDEsIHdoZXJlIHJlY3Vyc2l2ZSBwb3J0aW9ucyBvZiB0aGUgY2FsbCBncmFwaCB3aWxsIGhhdmUgU0NDIHNpemUgPiAxLgorICAvLy8KKyAgLy8vIFNDQyBwYXNzZXMgdGhhdCBhZGQgb3IgZGVsZXRlIGZ1bmN0aW9ucyB0byB0aGUgU0NDIGFyZSByZXF1aXJlZCB0byB1cGRhdGUKKyAgLy8vIHRoZSBTQ0MgbGlzdCwgb3RoZXJ3aXNlIHN0YWxlIHBvaW50ZXJzIG1heSBiZSBkZXJlZmVyZW5jZWQuCisgIC8vLworICB2aXJ0dWFsIGJvb2wgcnVuT25TQ0MoQ2FsbEdyYXBoU0NDICZTQ0MpID0gMDsKKworICAvLy8gZG9GaW5hbGl6YXRpb24gLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIFNDQydzIG9mIHRoZSBwcm9ncmFtIGhhcworICAvLy8gYmVlbiBwcm9jZXNzZWQsIGFsbG93aW5nIHRoZSBwYXNzIHRvIGRvIGZpbmFsIGNsZWFudXAgYXMgbmVjZXNzYXJ5LgorICB2aXJ0dWFsIGJvb2wgZG9GaW5hbGl6YXRpb24oQ2FsbEdyYXBoICZDRykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBBc3NpZ24gcGFzcyBtYW5hZ2VyIHRvIG1hbmFnZXIgdGhpcyBwYXNzCisgIHZpcnR1YWwgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTWFuYWdlclR5cGUgUE1UKTsKKworICAvLy8gIFJldHVybiB3aGF0IGtpbmQgb2YgUGFzcyBNYW5hZ2VyIGNhbiBtYW5hZ2UgdGhpcyBwYXNzLgorICB2aXJ0dWFsIFBhc3NNYW5hZ2VyVHlwZSBnZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFBNVF9DYWxsR3JhcGhQYXNzTWFuYWdlcjsKKyAgfQorCisgIC8vLyBnZXRBbmFseXNpc1VzYWdlIC0gRm9yIHRoaXMgY2xhc3MsIHdlIGRlY2xhcmUgdGhhdCB3ZSByZXF1aXJlIGFuZCBwcmVzZXJ2ZQorICAvLy8gdGhlIGNhbGwgZ3JhcGguICBJZiB0aGUgZGVyaXZlZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBleHBsaWNpdGx5IGNhbGwgdGhlIGltcGxlbWVudGF0aW9uIGhlcmUuCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0OworfTsKKworLy8vIENhbGxHcmFwaFNDQyAtIFRoaXMgaXMgYSBzaW5nbGUgU0NDIHRoYXQgYSBDYWxsR3JhcGhTQ0NQYXNzIGlzIHJ1biBvbi4gCitjbGFzcyBDYWxsR3JhcGhTQ0MgeworICB2b2lkICpDb250ZXh0OyAvLyBUaGUgQ0dQYXNzTWFuYWdlciBvYmplY3QgdGhhdCBpcyB2ZW5kaW5nIHRoaXMuCisgIHN0ZDo6dmVjdG9yPENhbGxHcmFwaE5vZGUqPiBOb2RlczsKK3B1YmxpYzoKKyAgQ2FsbEdyYXBoU0NDKHZvaWQgKmNvbnRleHQpIDogQ29udGV4dChjb250ZXh0KSB7fQorICAKKyAgdm9pZCBpbml0aWFsaXplKENhbGxHcmFwaE5vZGUqY29uc3QqSSwgQ2FsbEdyYXBoTm9kZSpjb25zdCpFKSB7CisgICAgTm9kZXMuYXNzaWduKEksIEUpOworICB9CisgIAorICBib29sIGlzU2luZ3VsYXIoKSBjb25zdCB7IHJldHVybiBOb2Rlcy5zaXplKCkgPT0gMTsgfQorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTm9kZXMuc2l6ZSgpOyB9CisgIAorICAvLy8gUmVwbGFjZU5vZGUgLSBUaGlzIGluZm9ybXMgdGhlIFNDQyBhbmQgdGhlIHBhc3MgbWFuYWdlciB0aGF0IHRoZSBzcGVjaWZpZWQKKyAgLy8vIE9sZCBub2RlIGhhcyBiZWVuIGRlbGV0ZWQsIGFuZCBOZXcgaXMgdG8gYmUgdXNlZCBpbiBpdHMgcGxhY2UuCisgIHZvaWQgUmVwbGFjZU5vZGUoQ2FsbEdyYXBoTm9kZSAqT2xkLCBDYWxsR3JhcGhOb2RlICpOZXcpOworICAKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDYWxsR3JhcGhOb2RlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIE5vZGVzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gTm9kZXMuZW5kKCk7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NhbGxpbmdDb252LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ2FsbGluZ0NvbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQ4MWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NhbGxpbmdDb252LmgKQEAgLTAsMCArMSw4OCBAQAorLy89PT0tLSBsbHZtL0NhbGxpbmdDb252LmggLSBMTFZNIENhbGxpbmcgQ29udmVudGlvbnMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBMTFZNJ3Mgc2V0IG9mIGNhbGxpbmcgY29udmVudGlvbnMuIAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DQUxMSU5HQ09OVl9ICisjZGVmaW5lIExMVk1fQ0FMTElOR0NPTlZfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBDYWxsaW5nQ29udiBOYW1lc3BhY2UgLSBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBhbiBlbnVtIHdpdGggYSB2YWx1ZSBmb3IKKy8vLyB0aGUgd2VsbC1rbm93biBjYWxsaW5nIGNvbnZlbnRpb25zLgorLy8vCituYW1lc3BhY2UgQ2FsbGluZ0NvbnYgeworICAvLy8gQSBzZXQgb2YgZW51bXMgd2hpY2ggc3BlY2lmeSB0aGUgYXNzaWduZWQgbnVtZXJpYyB2YWx1ZXMgZm9yIGtub3duIGxsdm0gCisgIC8vLyBjYWxsaW5nIGNvbnZlbnRpb25zLgorICAvLy8gQGJyaWVmIExMVk0gQ2FsbGluZyBDb252ZW50aW9uIFJlcHJlc2VudGF0aW9uCisgIGVudW0gSUQgeworICAgIC8vLyBDIC0gVGhlIGRlZmF1bHQgbGx2bSBjYWxsaW5nIGNvbnZlbnRpb24sIGNvbXBhdGlibGUgd2l0aCBDLiAgVGhpcworICAgIC8vLyBjb252ZW50aW9uIGlzIHRoZSBvbmx5IGNhbGxpbmcgY29udmVudGlvbiB0aGF0IHN1cHBvcnRzIHZhcmFyZ3MgY2FsbHMuCisgICAgLy8vIEFzIHdpdGggdHlwaWNhbCBDIGNhbGxpbmcgY29udmVudGlvbnMsIHRoZSBjYWxsZWUvY2FsbGVyIGhhdmUgdG8gCisgICAgLy8vIHRvbGVyYXRlIGNlcnRhaW4gYW1vdW50cyBvZiBwcm90b3R5cGUgbWlzbWF0Y2guCisgICAgQyA9IDAsCisgICAgCisgICAgLy8gR2VuZXJpYyBMTFZNIGNhbGxpbmcgY29udmVudGlvbnMuICBOb25lIG9mIHRoZXNlIGNhbGxpbmcgY29udmVudGlvbnMKKyAgICAvLyBzdXBwb3J0IHZhcmFyZ3MgY2FsbHMsIGFuZCBhbGwgYXNzdW1lIHRoYXQgdGhlIGNhbGxlciBhbmQgY2FsbGVlCisgICAgLy8gcHJvdG90eXBlIGV4YWN0bHkgbWF0Y2guCisKKyAgICAvLy8gRmFzdCAtIFRoaXMgY2FsbGluZyBjb252ZW50aW9uIGF0dGVtcHRzIHRvIG1ha2UgY2FsbHMgYXMgZmFzdCBhcyAKKyAgICAvLy8gcG9zc2libGUgKGUuZy4gYnkgcGFzc2luZyB0aGluZ3MgaW4gcmVnaXN0ZXJzKS4KKyAgICBGYXN0ID0gOCwKKworICAgIC8vIENvbGQgLSBUaGlzIGNhbGxpbmcgY29udmVudGlvbiBhdHRlbXB0cyB0byBtYWtlIGNvZGUgaW4gdGhlIGNhbGxlciBhcworICAgIC8vIGVmZmljaWVudCBhcyBwb3NzaWJsZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBjYWxsIGlzIG5vdCBjb21tb25seQorICAgIC8vIGV4ZWN1dGVkLiAgQXMgc3VjaCwgdGhlc2UgY2FsbHMgb2Z0ZW4gcHJlc2VydmUgYWxsIHJlZ2lzdGVycyBzbyB0aGF0IHRoZQorICAgIC8vIGNhbGwgZG9lcyBub3QgYnJlYWsgYW55IGxpdmUgcmFuZ2VzIGluIHRoZSBjYWxsZXIgc2lkZS4KKyAgICBDb2xkID0gOSwKKworICAgIC8vIEdIQyAtIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IHRoZSBHbGFzZ293IEhhc2tlbGwgQ29tcGlsZXIgKEdIQykuCisgICAgR0hDID0gMTAsCisKKyAgICAvLyBUYXJnZXQgLSBUaGlzIGlzIHRoZSBzdGFydCBvZiB0aGUgdGFyZ2V0LXNwZWNpZmljIGNhbGxpbmcgY29udmVudGlvbnMsCisgICAgLy8gZS5nLiBmYXN0Y2FsbCBhbmQgdGhpc2NhbGwgb24gWDg2LgorICAgIEZpcnN0VGFyZ2V0Q0MgPSA2NCwKKworICAgIC8vLyBYODZfU3RkQ2FsbCAtIHN0ZGNhbGwgaXMgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgbW9zdGx5IHVzZWQgYnkgdGhlCisgICAgLy8vIFdpbjMyIEFQSS4gSXQgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHRoZSBDIGNvbnZlbnRpb24gd2l0aCB0aGUKKyAgICAvLy8gZGlmZmVyZW5jZSBpbiB0aGF0IHRoZSBjYWxsZWUgaXMgcmVzcG9uc2libGUgZm9yIHBvcHBpbmcgdGhlIGFyZ3VtZW50cworICAgIC8vLyBmcm9tIHRoZSBzdGFjay4KKyAgICBYODZfU3RkQ2FsbCA9IDY0LAorCisgICAgLy8vIFg4Nl9GYXN0Q2FsbCAtICdmYXN0JyBhbmFsb2cgb2YgWDg2X1N0ZENhbGwuIFBhc3NlcyBmaXJzdCB0d28gYXJndW1lbnRzCisgICAgLy8vIGluIEVDWDpFRFggcmVnaXN0ZXJzLCBvdGhlcnMgLSB2aWEgc3RhY2suIENhbGxlZSBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAvLy8gc3RhY2sgY2xlYW5pbmcuCisgICAgWDg2X0Zhc3RDYWxsID0gNjUsCisKKyAgICAvLy8gQVJNX0FQQ1MgLSBBUk0gUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uIChvYnNvbGV0ZSwKKyAgICAvLy8gYnV0IHN0aWxsIHVzZWQgb24gc29tZSB0YXJnZXRzKS4KKyAgICBBUk1fQVBDUyA9IDY2LAorCisgICAgLy8vIEFSTV9BQVBDUyAtIEFSTSBBcmNoaXRlY3R1cmUgUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQgY2FsbGluZworICAgIC8vLyBjb252ZW50aW9uIChha2EgRUFCSSkuIFNvZnQgZmxvYXQgdmFyaWFudC4KKyAgICBBUk1fQUFQQ1MgPSA2NywKKworICAgIC8vLyBBUk1fQUFQQ1NfVkZQIC0gU2FtZSBhcyBBUk1fQUFQQ1MsIGJ1dCB1c2VzIGhhcmQgZmxvYXRpbmcgcG9pbnQgQUJJLgorICAgIEFSTV9BQVBDU19WRlAgPSA2OCwKKworICAgIC8vLyBNU1A0MzBfSU5UUiAtIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBNU1A0MzAgaW50ZXJydXB0IHJvdXRpbmVzLgorICAgIE1TUDQzMF9JTlRSID0gNjksCisKKyAgICAvLy8gWDg2X1RoaXNDYWxsIC0gU2ltaWxhciB0byBYODZfU3RkQ2FsbC4gUGFzc2VzIGZpcnN0IGFyZ3VtZW50IGluIEVDWCwKKyAgICAvLy8gb3RoZXJzIHZpYSBzdGFjay4gQ2FsbGVlIGlzIHJlc3BvbnNpYmxlIGZvciBzdGFjayBjbGVhbmluZy4gTVNWQyB1c2VzCisgICAgLy8vIHRoaXMgYnkgZGVmYXVsdCBmb3IgbWV0aG9kcyBpbiBpdHMgQUJJLgorICAgIFg4Nl9UaGlzQ2FsbCA9IDcwCisgIH07Cit9IC8vIEVuZCBDYWxsaW5nQ29udiBuYW1lc3BhY2UKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9BbmFseXNpcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNhOWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vQW5hbHlzaXMuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0gQ29kZUdlbi9BbmFseXNpcy5oIC0gQ29kZUdlbiBMTFZNIElSIEFuYWx5c2lzIFV0aWxpdGllcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBzZXZlcmFsIENvZGVHZW4tc3BlY2lmaWMgTExWTSBJUiBhbmFseXNpcyB1dGlsdGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9BTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9BTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW5saW5lQXNtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVGFyZ2V0TG93ZXJpbmc7CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKKworLy8vIENvbXB1dGVMaW5lYXJJbmRleCAtIEdpdmVuIGFuIExMVk0gSVIgYWdncmVnYXRlIHR5cGUgYW5kIGEgc2VxdWVuY2UKKy8vLyBvZiBpbnNlcnR2YWx1ZSBvciBleHRyYWN0dmFsdWUgaW5kaWNlcyB0aGF0IGlkZW50aWZ5IGEgbWVtYmVyLCByZXR1cm4KKy8vLyB0aGUgbGluZWFyaXplZCBpbmRleCBvZiB0aGUgc3RhcnQgb2YgdGhlIG1lbWJlci4KKy8vLwordW5zaWduZWQgQ29tcHV0ZUxpbmVhckluZGV4KGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEksIGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpJbmRpY2VzRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEN1ckluZGV4ID0gMCk7CisKKy8vLyBDb21wdXRlVmFsdWVWVHMgLSBHaXZlbiBhbiBMTFZNIElSIHR5cGUsIGNvbXB1dGUgYSBzZXF1ZW5jZSBvZgorLy8vIEVWVHMgdGhhdCByZXByZXNlbnQgYWxsIHRoZSBpbmRpdmlkdWFsIHVuZGVybHlpbmcKKy8vLyBub24tYWdncmVnYXRlIHR5cGVzIHRoYXQgY29tcHJpc2UgaXQuCisvLy8KKy8vLyBJZiBPZmZzZXRzIGlzIG5vbi1udWxsLCBpdCBwb2ludHMgdG8gYSB2ZWN0b3IgdG8gYmUgZmlsbGVkIGluCisvLy8gd2l0aCB0aGUgaW4tbWVtb3J5IG9mZnNldHMgb2YgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbCB2YWx1ZXMuCisvLy8KK3ZvaWQgQ29tcHV0ZVZhbHVlVlRzKGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEksIGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEVWVD4gJlZhbHVlVlRzLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVpbnQ2NF90PiAqT2Zmc2V0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTdGFydGluZ09mZnNldCA9IDApOworCisvLy8gRXh0cmFjdFR5cGVJbmZvIC0gUmV0dXJucyB0aGUgdHlwZSBpbmZvLCBwb3NzaWJseSBiaXRjYXN0LCBlbmNvZGVkIGluIFYuCitHbG9iYWxWYXJpYWJsZSAqRXh0cmFjdFR5cGVJbmZvKFZhbHVlICpWKTsKKworLy8vIGhhc0lubGluZUFzbU1lbUNvbnN0cmFpbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5saW5lIGFzbSBpbnN0cnVjdGlvbiBiZWluZworLy8vIHByb2Nlc3NlZCB1c2VzIGEgbWVtb3J5ICdtJyBjb25zdHJhaW50LgorYm9vbCBoYXNJbmxpbmVBc21NZW1Db25zdHJhaW50KHN0ZDo6dmVjdG9yPElubGluZUFzbTo6Q29uc3RyYWludEluZm8+ICZDSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSk7CisKKy8vLyBnZXRGQ21wQ29uZENvZGUgLSBSZXR1cm4gdGhlIElTRCBjb25kaXRpb24gY29kZSBjb3JyZXNwb25kaW5nIHRvCisvLy8gdGhlIGdpdmVuIExMVk0gSVIgZmxvYXRpbmctcG9pbnQgY29uZGl0aW9uIGNvZGUuICBUaGlzIGluY2x1ZGVzCisvLy8gY29uc2lkZXJhdGlvbiBvZiBnbG9iYWwgZmxvYXRpbmctcG9pbnQgbWF0aCBmbGFncy4KKy8vLworSVNEOjpDb25kQ29kZSBnZXRGQ21wQ29uZENvZGUoRkNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKTsKKworLy8vIGdldElDbXBDb25kQ29kZSAtIFJldHVybiB0aGUgSVNEIGNvbmRpdGlvbiBjb2RlIGNvcnJlc3BvbmRpbmcgdG8KKy8vLyB0aGUgZ2l2ZW4gTExWTSBJUiBpbnRlZ2VyIGNvbmRpdGlvbiBjb2RlLgorLy8vCitJU0Q6OkNvbmRDb2RlIGdldElDbXBDb25kQ29kZShJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpOworCisvLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gaXMgaW4gYSBwb3NpdGlvbiB0byBiZSBvcHRpbWl6ZWQKKy8vLyB3aXRoIGEgdGFpbC1jYWxsLiBUaGlzIHJvdWdobHkgbWVhbnMgdGhhdCBpdCdzIGluIGEgYmxvY2sgd2l0aAorLy8vIGEgcmV0dXJuIGFuZCB0aGVyZSdzIG5vdGhpbmcgdGhhdCBuZWVkcyB0byBiZSBzY2hlZHVsZWQKKy8vLyBiZXR3ZWVuIGl0IGFuZCB0aGUgcmV0dXJuLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBvbmx5IHRlc3RzIHRhcmdldC1pbmRlcGVuZGVudCByZXF1aXJlbWVudHMuCitib29sIGlzSW5UYWlsQ2FsbFBvc2l0aW9uKEltbXV0YWJsZUNhbGxTaXRlIENTLCBBdHRyaWJ1dGVzIENhbGxlZVJldEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmExOGZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vQXNtUHJpbnRlci5oCkBAIC0wLDAgKzEsNDU0IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9Bc21QcmludGVyLmggLSBBc21QcmludGVyIEZyYW1ld29yayAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIGNsYXNzIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIHRhcmdldCBzcGVjaWZpYworLy8gYXNtIHdyaXRlcnMuICBUaGlzIGNsYXNzIHByaW1hcmlseSBoYW5kbGVzIGNvbW1vbiBmdW5jdGlvbmFsaXR5IHVzZWQgYnkKKy8vIGFsbCBhc20gd3JpdGVycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9BU01QUklOVEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0FTTVBSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWdMb2MuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBCbG9ja0FkZHJlc3M7CisgIGNsYXNzIEdDU3RyYXRlZ3k7CisgIGNsYXNzIENvbnN0YW50OworICBjbGFzcyBDb25zdGFudEFycmF5OworICBjbGFzcyBDb25zdGFudEZQOworICBjbGFzcyBDb25zdGFudEludDsKKyAgY2xhc3MgQ29uc3RhbnRTdHJ1Y3Q7CisgIGNsYXNzIENvbnN0YW50VmVjdG9yOworICBjbGFzcyBHQ01ldGFkYXRhUHJpbnRlcjsKKyAgY2xhc3MgR2xvYmFsVmFsdWU7CisgIGNsYXNzIEdsb2JhbFZhcmlhYmxlOworICBjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIE1hY2hpbmVMb2NhdGlvbjsKKyAgY2xhc3MgTWFjaGluZUxvb3BJbmZvOworICBjbGFzcyBNYWNoaW5lTG9vcDsKKyAgY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbDsKKyAgY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5OworICBjbGFzcyBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWU7CisgIGNsYXNzIE1hY2hpbmVKdW1wVGFibGVJbmZvOworICBjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKKyAgY2xhc3MgTWFjaGluZU1vdmU7CisgIGNsYXNzIE1DQXNtSW5mbzsKKyAgY2xhc3MgTUNJbnN0OworICBjbGFzcyBNQ0NvbnRleHQ7CisgIGNsYXNzIE1DU2VjdGlvbjsKKyAgY2xhc3MgTUNTdHJlYW1lcjsKKyAgY2xhc3MgTUNTeW1ib2w7CisgIGNsYXNzIER3YXJmRGVidWc7CisgIGNsYXNzIER3YXJmRXhjZXB0aW9uOworICBjbGFzcyBNYW5nbGVyOworICBjbGFzcyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGU7CisgIGNsYXNzIFRhcmdldERhdGE7CisgIGNsYXNzIFRhcmdldE1hY2hpbmU7CisgIGNsYXNzIFR3aW5lOworICBjbGFzcyBUeXBlOworCisgIC8vLyBBc21QcmludGVyIC0gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgZHJpdmluZyBjbGFzcyBmb3IgYWxsCisgIC8vLyBhc20gd3JpdGVycy4KKyAgY2xhc3MgQXNtUHJpbnRlciA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgcHVibGljOgorICAgIC8vLyBUYXJnZXQgbWFjaGluZSBkZXNjcmlwdGlvbi4KKyAgICAvLy8KKyAgICBUYXJnZXRNYWNoaW5lICZUTTsKKworICAgIC8vLyBUYXJnZXQgQXNtIFByaW50ZXIgaW5mb3JtYXRpb24uCisgICAgLy8vCisgICAgY29uc3QgTUNBc21JbmZvICpNQUk7CisKKyAgICAvLy8gT3V0Q29udGV4dCAtIFRoaXMgaXMgdGhlIGNvbnRleHQgZm9yIHRoZSBvdXRwdXQgZmlsZSB0aGF0IHdlIGFyZQorICAgIC8vLyBzdHJlYW1pbmcuICBUaGlzIG93bnMgYWxsIG9mIHRoZSBnbG9iYWwgTUMtcmVsYXRlZCBvYmplY3RzIGZvciB0aGUKKyAgICAvLy8gZ2VuZXJhdGVkIHRyYW5zbGF0aW9uIHVuaXQuCisgICAgTUNDb250ZXh0ICZPdXRDb250ZXh0OworCisgICAgLy8vIE91dFN0cmVhbWVyIC0gVGhpcyBpcyB0aGUgTUNTdHJlYW1lciBvYmplY3QgZm9yIHRoZSBmaWxlIHdlIGFyZQorICAgIC8vLyBnZW5lcmF0aW5nLiAgVGhpcyBjb250YWlucyB0aGUgdHJhbnNpZW50IHN0YXRlIGZvciB0aGUgY3VycmVudAorICAgIC8vLyB0cmFuc2xhdGlvbiB1bml0IHRoYXQgd2UgYXJlIGdlbmVyYXRpbmcgKHN1Y2ggYXMgdGhlIGN1cnJlbnQgc2VjdGlvbgorICAgIC8vLyBldGMpLgorICAgIE1DU3RyZWFtZXIgJk91dFN0cmVhbWVyOworCisgICAgLy8vIFRoZSBjdXJyZW50IG1hY2hpbmUgZnVuY3Rpb24uCisgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRjsKKworICAgIC8vLyBNTUkgLSBUaGlzIGlzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBNYWNoaW5lTW9kdWxlSW5mby4KKyAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JOworCisgICAgLy8vIE5hbWUtbWFuZ2xlciBmb3IgZ2xvYmFsIG5hbWVzLgorICAgIC8vLworICAgIE1hbmdsZXIgKk1hbmc7CisKKyAgICAvLy8gVGhlIHN5bWJvbCBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIFRoaXMgaXMgcmVjYWxjdWxhdGVkIGF0IHRoZQorICAgIC8vLyBiZWdpbm5pbmcgb2YgZWFjaCBjYWxsIHRvIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKCkuCisgICAgLy8vCisgICAgTUNTeW1ib2wgKkN1cnJlbnRGblN5bTsKKworICBwcml2YXRlOgorICAgIC8vIEdDTWV0YWRhdGFQcmludGVycyAtIFRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gbWV0YWRhdGEgcHJpbnRlciB0YWJsZS4KKyAgICB2b2lkICpHQ01ldGFkYXRhUHJpbnRlcnM7ICAvLyBSZWFsbHkgYSBEZW5zZU1hcC4KKworICAgIC8vLyBWZXJib3NlQXNtIC0gRW1pdCBjb21tZW50cyBpbiBhc3NlbWJseSBvdXRwdXQgaWYgdGhpcyBpcyB0cnVlLgorICAgIC8vLworICAgIGJvb2wgVmVyYm9zZUFzbTsKKyAgICBzdGF0aWMgY2hhciBJRDsKKworICAgIC8vLyBJZiBWZXJib3NlQXNtIGlzIHNldCwgYSBwb2ludGVyIHRvIHRoZSBsb29wIGluZm8gZm9yIHRoaXMKKyAgICAvLy8gZnVuY3Rpb24uCisgICAgTWFjaGluZUxvb3BJbmZvICpMSTsKKworICAgIC8vLyBERCAtIElmIHRoZSB0YXJnZXQgc3VwcG9ydHMgZHdhcmYgZGVidWcgaW5mbywgdGhpcyBwb2ludGVyIGlzIG5vbi1udWxsLgorICAgIER3YXJmRGVidWcgKkREOworCisgICAgLy8vIERFIC0gSWYgdGhlIHRhcmdldCBzdXBwb3J0cyBkd2FyZiBleGNlcHRpb24gaW5mbywgdGhpcyBwb2ludGVyIGlzCisgICAgLy8vIG5vbi1udWxsLgorICAgIER3YXJmRXhjZXB0aW9uICpERTsKKworICBwcm90ZWN0ZWQ6CisgICAgZXhwbGljaXQgQXNtUHJpbnRlcihUYXJnZXRNYWNoaW5lICZUTSwgTUNTdHJlYW1lciAmU3RyZWFtZXIpOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5Bc21QcmludGVyKCk7CisKKyAgICAvLy8gaXNWZXJib3NlIC0gUmV0dXJuIHRydWUgaWYgYXNzZW1ibHkgb3V0cHV0IHNob3VsZCBjb250YWluIGNvbW1lbnRzLgorICAgIC8vLworICAgIGJvb2wgaXNWZXJib3NlKCkgY29uc3QgeyByZXR1cm4gVmVyYm9zZUFzbTsgfQorCisgICAgLy8vIGdldEZ1bmN0aW9uTnVtYmVyIC0gUmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBnZXRGdW5jdGlvbk51bWJlcigpIGNvbnN0OworCisgICAgLy8vIGdldE9iakZpbGVMb3dlcmluZyAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3QgZmlsZSBsb3dlcmluZy4KKyAgICBjb25zdCBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgJmdldE9iakZpbGVMb3dlcmluZygpIGNvbnN0OworCisgICAgLy8vIGdldFRhcmdldERhdGEgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgZGF0YSBsYXlvdXQuCisgICAgY29uc3QgVGFyZ2V0RGF0YSAmZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0OworCisgICAgLy8vIGdldEN1cnJlbnRTZWN0aW9uKCkgLSBSZXR1cm4gdGhlIGN1cnJlbnQgc2VjdGlvbiB3ZSBhcmUgZW1pdHRpbmcgdG8uCisgICAgY29uc3QgTUNTZWN0aW9uICpnZXRDdXJyZW50U2VjdGlvbigpIGNvbnN0OworCisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gTWFjaGluZUZ1bmN0aW9uUGFzcyBJbXBsZW1lbnRhdGlvbi4KKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgICAvLy8gZ2V0QW5hbHlzaXNVc2FnZSAtIFJlY29yZCBhbmFseXNpcyB1c2FnZS4KKyAgICAvLy8KKyAgICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0OworCisgICAgLy8vIGRvSW5pdGlhbGl6YXRpb24gLSBTZXQgdXAgdGhlIEFzbVByaW50ZXIgd2hlbiB3ZSBhcmUgd29ya2luZyBvbiBhIG5ldworICAgIC8vLyBtb2R1bGUuICBJZiB5b3VyIHBhc3Mgb3ZlcnJpZGVzIHRoaXMsIGl0IG11c3QgbWFrZSBzdXJlIHRvIGV4cGxpY2l0bHkKKyAgICAvLy8gY2FsbCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgIGJvb2wgZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJk0pOworCisgICAgLy8vIGRvRmluYWxpemF0aW9uIC0gU2h1dCBkb3duIHRoZSBhc21wcmludGVyLiAgSWYgeW91IG92ZXJyaWRlIHRoaXMgaW4geW91cgorICAgIC8vLyBwYXNzLCB5b3UgbXVzdCBtYWtlIHN1cmUgdG8gY2FsbCBpdCBleHBsaWNpdGx5LgorICAgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKTsKKworICAgIC8vLyBydW5Pbk1hY2hpbmVGdW5jdGlvbiAtIEVtaXQgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBvdXQgdG8gdGhlCisgICAgLy8vIE91dFN0cmVhbWVyLgorICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgICAgICBTZXR1cE1hY2hpbmVGdW5jdGlvbihNRik7CisgICAgICBFbWl0RnVuY3Rpb25IZWFkZXIoKTsKKyAgICAgIEVtaXRGdW5jdGlvbkJvZHkoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gQ29hcnNlIGdyYWluZWQgSVIgbG93ZXJpbmcgcm91dGluZXMuCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgICAgLy8vIFNldHVwTWFjaGluZUZ1bmN0aW9uIC0gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBuZXcgTWFjaGluZUZ1bmN0aW9uCisgICAgLy8vIGlzIGJlaW5nIHByb2Nlc3NlZCBmcm9tIHJ1bk9uTWFjaGluZUZ1bmN0aW9uLgorICAgIHZvaWQgU2V0dXBNYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgICAvLy8gRW1pdEZ1bmN0aW9uSGVhZGVyIC0gVGhpcyBtZXRob2QgZW1pdHMgdGhlIGhlYWRlciBmb3IgdGhlIGN1cnJlbnQKKyAgICAvLy8gZnVuY3Rpb24uCisgICAgdm9pZCBFbWl0RnVuY3Rpb25IZWFkZXIoKTsKKworICAgIC8vLyBFbWl0RnVuY3Rpb25Cb2R5IC0gVGhpcyBtZXRob2QgZW1pdHMgdGhlIGJvZHkgYW5kIHRyYWlsZXIgZm9yIGEKKyAgICAvLy8gZnVuY3Rpb24uCisgICAgdm9pZCBFbWl0RnVuY3Rpb25Cb2R5KCk7CisKKyAgICAvLy8gRW1pdENvbnN0YW50UG9vbCAtIFByaW50IHRvIHRoZSBjdXJyZW50IG91dHB1dCBzdHJlYW0gYXNzZW1ibHkKKyAgICAvLy8gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBjb25zdGFudHMgaW4gdGhlIGNvbnN0YW50IHBvb2wgTUNQLiBUaGlzIGlzCisgICAgLy8vIHVzZWQgdG8gcHJpbnQgb3V0IGNvbnN0YW50cyB3aGljaCBoYXZlIGJlZW4gInNwaWxsZWQgdG8gbWVtb3J5IiBieQorICAgIC8vLyB0aGUgY29kZSBnZW5lcmF0b3IuCisgICAgLy8vCisgICAgdmlydHVhbCB2b2lkIEVtaXRDb25zdGFudFBvb2woKTsKKworICAgIC8vLyBFbWl0SnVtcFRhYmxlSW5mbyAtIFByaW50IGFzc2VtYmx5IHJlcHJlc2VudGF0aW9ucyBvZiB0aGUganVtcCB0YWJsZXMKKyAgICAvLy8gdXNlZCBieSB0aGUgY3VycmVudCBmdW5jdGlvbiB0byB0aGUgY3VycmVudCBvdXRwdXQgc3RyZWFtLgorICAgIC8vLworICAgIHZvaWQgRW1pdEp1bXBUYWJsZUluZm8oKTsKKworICAgIC8vLyBFbWl0R2xvYmFsVmFyaWFibGUgLSBFbWl0IHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhcmlhYmxlIHRvIHRoZSAucyBmaWxlLgorICAgIHZpcnR1YWwgdm9pZCBFbWl0R2xvYmFsVmFyaWFibGUoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKTsKKworICAgIC8vLyBFbWl0U3BlY2lhbExMVk1HbG9iYWwgLSBDaGVjayB0byBzZWUgaWYgdGhlIHNwZWNpZmllZCBnbG9iYWwgaXMgYQorICAgIC8vLyBzcGVjaWFsIGdsb2JhbCB1c2VkIGJ5IExMVk0uICBJZiBzbywgZW1pdCBpdCBhbmQgcmV0dXJuIHRydWUsIG90aGVyd2lzZQorICAgIC8vLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZmFsc2UuCisgICAgYm9vbCBFbWl0U3BlY2lhbExMVk1HbG9iYWwoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKTsKKworICAgIC8vLyBFbWl0QWxpZ25tZW50IC0gRW1pdCBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlIHRvIHRoZSBzcGVjaWZpZWQgcG93ZXIgb2YKKyAgICAvLy8gdHdvIGJvdW5kYXJ5LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBwYXNzIGluIDMgaGVyZSwgeW91IHdpbGwgZ2V0IGFuIDgKKyAgICAvLy8gYnl0ZSBhbGlnbm1lbnQuICBJZiBhIGdsb2JhbCB2YWx1ZSBpcyBzcGVjaWZpZWQsIGFuZCBpZiB0aGF0IGdsb2JhbCBoYXMKKyAgICAvLy8gYW4gZXhwbGljaXQgYWxpZ25tZW50IHJlcXVlc3RlZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgYWxpZ25tZW50IHJlcXVlc3QKKyAgICAvLy8gaWYgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLgorICAgIC8vLworICAgIHZvaWQgRW1pdEFsaWdubWVudCh1bnNpZ25lZCBOdW1CaXRzLCBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSAwKSBjb25zdDsKKworICAgIC8vLyBFbWl0QmFzaWNCbG9ja1N0YXJ0IC0gVGhpcyBtZXRob2QgcHJpbnRzIHRoZSBsYWJlbCBmb3IgdGhlIHNwZWNpZmllZAorICAgIC8vLyBNYWNoaW5lQmFzaWNCbG9jaywgYW4gYWxpZ25tZW50IChpZiBwcmVzZW50KSBhbmQgYSBjb21tZW50IGRlc2NyaWJpbmcKKyAgICAvLy8gaXQgaWYgYXBwcm9wcmlhdGUuCisgICAgdm9pZCBFbWl0QmFzaWNCbG9ja1N0YXJ0KGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgICAgLy8vIEVtaXRHbG9iYWxDb25zdGFudCAtIFByaW50IGEgZ2VuZXJhbCBMTFZNIGNvbnN0YW50IHRvIHRoZSAucyBmaWxlLgorICAgIHZvaWQgRW1pdEdsb2JhbENvbnN0YW50KGNvbnN0IENvbnN0YW50ICpDViwgdW5zaWduZWQgQWRkclNwYWNlID0gMCk7CisKKworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgICAvLyBPdmVycmlkYWJsZSBIb29rcworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAgIC8vIFRhcmdldHMgY2FuLCBvciBpbiB0aGUgY2FzZSBvZiBFbWl0SW5zdHJ1Y3Rpb24sIG11c3QgaW1wbGVtZW50IHRoZXNlIHRvCisgICAgLy8gY3VzdG9taXplIG91dHB1dC4KKworICAgIC8vLyBFbWl0U3RhcnRPZkFzbUZpbGUgLSBUaGlzIHZpcnR1YWwgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRhcmdldHMKKyAgICAvLy8gdGhhdCB3YW50IHRvIGVtaXQgc29tZXRoaW5nIGF0IHRoZSBzdGFydCBvZiB0aGVpciBmaWxlLgorICAgIHZpcnR1YWwgdm9pZCBFbWl0U3RhcnRPZkFzbUZpbGUoTW9kdWxlICYpIHt9CisKKyAgICAvLy8gRW1pdEVuZE9mQXNtRmlsZSAtIFRoaXMgdmlydHVhbCBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGFyZ2V0cyB0aGF0CisgICAgLy8vIHdhbnQgdG8gZW1pdCBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiB0aGVpciBmaWxlLgorICAgIHZpcnR1YWwgdm9pZCBFbWl0RW5kT2ZBc21GaWxlKE1vZHVsZSAmKSB7fQorCisgICAgLy8vIEVtaXRGdW5jdGlvbkJvZHlTdGFydCAtIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZW1pdCBzdHVmZiBiZWZvcmUKKyAgICAvLy8gdGhlIGZpcnN0IGJhc2ljIGJsb2NrIGluIHRoZSBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uQm9keVN0YXJ0KCkge30KKworICAgIC8vLyBFbWl0RnVuY3Rpb25Cb2R5RW5kIC0gVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBlbWl0IHN0dWZmIGFmdGVyCisgICAgLy8vIHRoZSBsYXN0IGJhc2ljIGJsb2NrIGluIHRoZSBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uQm9keUVuZCgpIHt9CisKKyAgICAvLy8gRW1pdEluc3RydWN0aW9uIC0gVGFyZ2V0cyBzaG91bGQgaW1wbGVtZW50IHRoaXMgdG8gZW1pdCBpbnN0cnVjdGlvbnMuCisgICAgdmlydHVhbCB2b2lkIEVtaXRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKikgeworICAgICAgYXNzZXJ0KDAgJiYgIkVtaXRJbnN0cnVjdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uRW50cnlMYWJlbCgpOworCisgICAgdmlydHVhbCB2b2lkIEVtaXRNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUoTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpNQ1BWKTsKKworICAgIC8vLyBpc0Jsb2NrT25seVJlYWNoYWJsZUJ5RmFsbHRob3VnaCAtIFJldHVybiB0cnVlIGlmIHRoZSBiYXNpYyBibG9jayBoYXMKKyAgICAvLy8gZXhhY3RseSBvbmUgcHJlZGVjZXNzb3IgYW5kIHRoZSBjb250cm9sIHRyYW5zZmVyIG1lY2hhbmlzbSBiZXR3ZWVuCisgICAgLy8vIHRoZSBwcmVkZWNlc3NvciBhbmQgdGhpcyBibG9jayBpcyBhIGZhbGwtdGhyb3VnaC4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBpc0Jsb2NrT25seVJlYWNoYWJsZUJ5RmFsbHRocm91Z2goY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gU3ltYm9sIExvd2VyaW5nIFJvdXRpbmVzLgorICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgcHVibGljOgorCisgICAgLy8vIEdldFRlbXBTeW1ib2wgLSBSZXR1cm4gdGhlIE1DU3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFzc2VtYmxlcgorICAgIC8vLyB0ZW1wb3JhcnkgbGFiZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHN0ZW0gYW5kIHVuaXF1ZSBJRC4KKyAgICBNQ1N5bWJvbCAqR2V0VGVtcFN5bWJvbChTdHJpbmdSZWYgTmFtZSwgdW5zaWduZWQgSUQpIGNvbnN0OworCisgICAgLy8vIEdldFRlbXBTeW1ib2wgLSBSZXR1cm4gYW4gYXNzZW1ibGVyIHRlbXBvcmFyeSBsYWJlbCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gc3RlbS4KKyAgICBNQ1N5bWJvbCAqR2V0VGVtcFN5bWJvbChTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CisKKworICAgIC8vLyBHZXRTeW1ib2xXaXRoR2xvYmFsVmFsdWVCYXNlIC0gUmV0dXJuIHRoZSBNQ1N5bWJvbCBmb3IgYSBzeW1ib2wgd2l0aAorICAgIC8vLyBnbG9iYWwgdmFsdWUgbmFtZSBhcyBpdHMgYmFzZSwgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgYW5kIHdoZXJlIHRoZQorICAgIC8vLyBzeW1ib2wgaXMgZm9yY2VkIHRvIGhhdmUgcHJpdmF0ZSBsaW5rYWdlIGlmIEZvcmNlUHJpdmF0ZSBpcyB0cnVlLgorICAgIE1DU3ltYm9sICpHZXRTeW1ib2xXaXRoR2xvYmFsVmFsdWVCYXNlKGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yY2VQcml2YXRlID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvLy8gR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2wgLSBSZXR1cm4gdGhlIE1DU3ltYm9sIGZvciB0aGUgc3BlY2lmaWVkCisgICAgLy8vIEV4dGVybmFsU3ltYm9sLgorICAgIE1DU3ltYm9sICpHZXRFeHRlcm5hbFN5bWJvbFN5bWJvbChTdHJpbmdSZWYgU3ltKSBjb25zdDsKKworICAgIC8vLyBHZXRDUElTeW1ib2wgLSBSZXR1cm4gdGhlIHN5bWJvbCBmb3IgdGhlIHNwZWNpZmllZCBjb25zdGFudCBwb29sIGVudHJ5LgorICAgIE1DU3ltYm9sICpHZXRDUElTeW1ib2wodW5zaWduZWQgQ1BJRCkgY29uc3Q7CisKKyAgICAvLy8gR2V0SlRJU3ltYm9sIC0gUmV0dXJuIHRoZSBzeW1ib2wgZm9yIHRoZSBzcGVjaWZpZWQganVtcCB0YWJsZSBlbnRyeS4KKyAgICBNQ1N5bWJvbCAqR2V0SlRJU3ltYm9sKHVuc2lnbmVkIEpUSUQsIGJvb2wgaXNMaW5rZXJQcml2YXRlID0gZmFsc2UpIGNvbnN0OworCisgICAgLy8vIEdldEpUU2V0U3ltYm9sIC0gUmV0dXJuIHRoZSBzeW1ib2wgZm9yIHRoZSBzcGVjaWZpZWQganVtcCB0YWJsZSAuc2V0CisgICAgLy8vIEZJWE1FOiBwcml2YXRpemUgdG8gQXNtUHJpbnRlci4KKyAgICBNQ1N5bWJvbCAqR2V0SlRTZXRTeW1ib2wodW5zaWduZWQgVUlELCB1bnNpZ25lZCBNQkJJRCkgY29uc3Q7CisKKyAgICAvLy8gR2V0QmxvY2tBZGRyZXNzU3ltYm9sIC0gUmV0dXJuIHRoZSBNQ1N5bWJvbCB1c2VkIHRvIHNhdGlzZnkgQmxvY2tBZGRyZXNzCisgICAgLy8vIHVzZXMgb2YgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jay4KKyAgICBNQ1N5bWJvbCAqR2V0QmxvY2tBZGRyZXNzU3ltYm9sKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEpIGNvbnN0OworICAgIE1DU3ltYm9sICpHZXRCbG9ja0FkZHJlc3NTeW1ib2woY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vIEVtaXNzaW9uIEhlbHBlciBSb3V0aW5lcy4KKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIHB1YmxpYzoKKyAgICAvLy8gcHJpbnRPZmZzZXQgLSBUaGlzIGlzIGp1c3QgY29udmVuaWVudCBoYW5kbGVyIGZvciBwcmludGluZyBvZmZzZXRzLgorICAgIHZvaWQgcHJpbnRPZmZzZXQoaW50NjRfdCBPZmZzZXQsIHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gRW1pdEludDggLSBFbWl0IGEgYnl0ZSBkaXJlY3RpdmUgYW5kIHZhbHVlLgorICAgIC8vLworICAgIHZvaWQgRW1pdEludDgoaW50IFZhbHVlKSBjb25zdDsKKworICAgIC8vLyBFbWl0SW50MTYgLSBFbWl0IGEgc2hvcnQgZGlyZWN0aXZlIGFuZCB2YWx1ZS4KKyAgICAvLy8KKyAgICB2b2lkIEVtaXRJbnQxNihpbnQgVmFsdWUpIGNvbnN0OworCisgICAgLy8vIEVtaXRJbnQzMiAtIEVtaXQgYSBsb25nIGRpcmVjdGl2ZSBhbmQgdmFsdWUuCisgICAgLy8vCisgICAgdm9pZCBFbWl0SW50MzIoaW50IFZhbHVlKSBjb25zdDsKKworICAgIC8vLyBFbWl0TGFiZWxEaWZmZXJlbmNlIC0gRW1pdCBzb21ldGhpbmcgbGlrZSAiLmxvbmcgSGktTG8iIHdoZXJlIHRoZSBzaXplCisgICAgLy8vIGluIGJ5dGVzIG9mIHRoZSBkaXJlY3RpdmUgaXMgc3BlY2lmaWVkIGJ5IFNpemUgYW5kIEhpL0xvIHNwZWNpZnkgdGhlCisgICAgLy8vIGxhYmVscy4gIFRoaXMgaW1wbGljaXRseSB1c2VzIC5zZXQgaWYgaXQgaXMgYXZhaWxhYmxlLgorICAgIHZvaWQgRW1pdExhYmVsRGlmZmVyZW5jZShjb25zdCBNQ1N5bWJvbCAqSGksIGNvbnN0IE1DU3ltYm9sICpMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgY29uc3Q7CisKKyAgICAvLy8gRW1pdExhYmVsT2Zmc2V0RGlmZmVyZW5jZSAtIEVtaXQgc29tZXRoaW5nIGxpa2UgIi5sb25nIEhpK09mZnNldC1MbyIKKyAgICAvLy8gd2hlcmUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRpcmVjdGl2ZSBpcyBzcGVjaWZpZWQgYnkgU2l6ZSBhbmQgSGkvTG8KKyAgICAvLy8gc3BlY2lmeSB0aGUgbGFiZWxzLiAgVGhpcyBpbXBsaWNpdGx5IHVzZXMgLnNldCBpZiBpdCBpcyBhdmFpbGFibGUuCisgICAgdm9pZCBFbWl0TGFiZWxPZmZzZXREaWZmZXJlbmNlKGNvbnN0IE1DU3ltYm9sICpIaSwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqTG8sIHVuc2lnbmVkIFNpemUpIGNvbnN0OworCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vIER3YXJmIEVtaXNzaW9uIEhlbHBlciBSb3V0aW5lcworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAgIC8vLyBFbWl0U0xFQjEyOCAtIGVtaXQgdGhlIHNwZWNpZmllZCBzaWduZWQgbGViMTI4IHZhbHVlLgorICAgIHZvaWQgRW1pdFNMRUIxMjgoaW50IFZhbHVlLCBjb25zdCBjaGFyICpEZXNjID0gMCkgY29uc3Q7CisKKyAgICAvLy8gRW1pdFVMRUIxMjggLSBlbWl0IHRoZSBzcGVjaWZpZWQgdW5zaWduZWQgbGViMTI4IHZhbHVlLgorICAgIHZvaWQgRW1pdFVMRUIxMjgodW5zaWduZWQgVmFsdWUsIGNvbnN0IGNoYXIgKkRlc2MgPSAwLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUGFkVG8gPSAwKSBjb25zdDsKKworICAgIC8vLyBFbWl0Q0ZBQnl0ZSAtIEVtaXQgYSAuYnl0ZSA0MiBkaXJlY3RpdmUgZm9yIGEgRFdfQ0ZBX3h4eCB2YWx1ZS4KKyAgICB2b2lkIEVtaXRDRkFCeXRlKHVuc2lnbmVkIFZhbCkgY29uc3Q7CisKKyAgICAvLy8gRW1pdEVuY29kaW5nQnl0ZSAtIEVtaXQgYSAuYnl0ZSA0MiBkaXJlY3RpdmUgdGhhdCBjb3JyZXNwb25kcyB0byBhbgorICAgIC8vLyBlbmNvZGluZy4gIElmIHZlcmJvc2UgYXNzZW1ibHkgb3V0cHV0IGlzIGVuYWJsZWQsIHdlIG91dHB1dCBjb21tZW50cworICAgIC8vLyBkZXNjcmliaW5nIHRoZSBlbmNvZGluZy4gIERlc2MgaXMgYSBzdHJpbmcgc2F5aW5nIHdoYXQgdGhlIGVuY29kaW5nIGlzCisgICAgLy8vIHNwZWNpZnlpbmcgKGUuZy4gIkxTREEiKS4KKyAgICB2b2lkIEVtaXRFbmNvZGluZ0J5dGUodW5zaWduZWQgVmFsLCBjb25zdCBjaGFyICpEZXNjID0gMCkgY29uc3Q7CisKKyAgICAvLy8gR2V0U2l6ZU9mRW5jb2RlZFZhbHVlIC0gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBlbmNvZGluZyBpbiBieXRlcy4KKyAgICB1bnNpZ25lZCBHZXRTaXplT2ZFbmNvZGVkVmFsdWUodW5zaWduZWQgRW5jb2RpbmcpIGNvbnN0OworCisgICAgLy8vIEVtaXRSZWZlcmVuY2UgLSBFbWl0IGEgcmVmZXJlbmNlIHRvIGEgbGFiZWwgd2l0aCBhIHNwZWNpZmllZCBlbmNvZGluZy4KKyAgICAvLy8KKyAgICB2b2lkIEVtaXRSZWZlcmVuY2UoY29uc3QgTUNTeW1ib2wgKlN5bSwgdW5zaWduZWQgRW5jb2RpbmcpIGNvbnN0OworICAgIHZvaWQgRW1pdFJlZmVyZW5jZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIHVuc2lnbmVkIEVuY29kaW5nKSBjb25zdDsKKworICAgIC8vLyBFbWl0U2VjdGlvbk9mZnNldCAtIEVtaXQgdGhlIDQtYnl0ZSBvZmZzZXQgb2YgTGFiZWwgZnJvbSB0aGUgc3RhcnQgb2YKKyAgICAvLy8gaXRzIHNlY3Rpb24uICBUaGlzIGNhbiBiZSBkb25lIHdpdGggYSBzcGVjaWFsIGRpcmVjdGl2ZSBpZiB0aGUgdGFyZ2V0CisgICAgLy8vIHN1cHBvcnRzIGl0IChlLmcuIGN5Z3dpbikgb3IgYnkgZW1pdHRpbmcgaXQgYXMgYW4gb2Zmc2V0IGZyb20gYSBsYWJlbCBhdAorICAgIC8vLyB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uCisgICAgLy8vCisgICAgLy8vIFNlY3Rpb25MYWJlbCBpcyBhIHRlbXBvcmFyeSBsYWJlbCBlbWl0dGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbgorICAgIC8vLyB0aGF0IExhYmVsIGxpdmVzIGluLgorICAgIHZvaWQgRW1pdFNlY3Rpb25PZmZzZXQoY29uc3QgTUNTeW1ib2wgKkxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKlNlY3Rpb25MYWJlbCkgY29uc3Q7CisKKyAgICAvLy8gZ2V0RGVidWdWYWx1ZUxvY2F0aW9uIC0gR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uIGVuY29kZWQgYnkgREJHX1ZBTFVFCisgICAgLy8vIG9wZXJhbmRzLgorICAgIHZpcnR1YWwgTWFjaGluZUxvY2F0aW9uIGdldERlYnVnVmFsdWVMb2NhdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdDsKKworICAgIC8vLyBnZXRJU0FFbmNvZGluZyAtIEdldCB0aGUgdmFsdWUgZm9yIERXX0FUX0FQUExFX2lzYS4gWmVybyBpZiBubyBpc2EKKyAgICAvLy8gZW5jb2Rpbmcgc3BlY2lmaWVkLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SVNBRW5jb2RpbmcoKSB7IHJldHVybiAwOyB9CisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gRHdhcmYgTG93ZXJpbmcgUm91dGluZXMKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgICAvLy8gRW1pdEZyYW1lTW92ZXMgLSBFbWl0IGZyYW1lIGluc3RydWN0aW9ucyB0byBkZXNjcmliZSB0aGUgbGF5b3V0IG9mIHRoZQorICAgIC8vLyBmcmFtZS4KKyAgICB2b2lkIEVtaXRGcmFtZU1vdmVzKGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVNb3ZlPiAmTW92ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbCAqQmFzZUxhYmVsLCBib29sIGlzRUgpIGNvbnN0OworCisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gSW5saW5lIEFzbSBTdXBwb3J0CisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICBwdWJsaWM6CisgICAgLy8gVGhlc2UgYXJlIGhvb2tzIHRoYXQgdGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdG8gaW1wbGVtZW50IGlubGluZSBhc20KKyAgICAvLyBzdXBwb3J0LiAgVGhlc2Ugc2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIG91dCBvZiBBc21QcmludGVyIHNvbWVkYXkuCisKKyAgICAvLy8gUHJpbnRTcGVjaWFsIC0gUHJpbnQgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHIKKyAgICAvLy8gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgb3BlcmFuZCwgYW5kIG1heSBiZSBpbmRlcGVuZGVudCBvZiB0aGUgaW5zdHIKKyAgICAvLy8gaXRzZWxmLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBwb3J0YWJseSBlbmNvZGluZyB0aGUgY29tbWVudCBjaGFyYWN0ZXIKKyAgICAvLy8gb3Igb3RoZXIgYml0cyBvZiB0YXJnZXQtc3BlY2lmaWMga25vd2xlZGdlIGludG8gdGhlIGFzbXN0cmluZ3MuICBUaGUKKyAgICAvLy8gc3ludGF4IHVzZWQgaXMgJHs6Y29tbWVudH0uICBUYXJnZXRzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGFkZCBzdXBwb3J0CisgICAgLy8vIGZvciB0aGVpciBvd24gc3RyYW5nZSBjb2Rlcy4KKyAgICB2aXJ0dWFsIHZvaWQgUHJpbnRTcGVjaWFsKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkNvZGUpIGNvbnN0OworCisgICAgLy8vIFByaW50QXNtT3BlcmFuZCAtIFByaW50IHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBvZiBNSSwgYW4gSU5MSU5FQVNNCisgICAgLy8vIGluc3RydWN0aW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkIGFzc2VtYmxlciB2YXJpYW50LiAgVGFyZ2V0cyBzaG91bGQKKyAgICAvLy8gb3ZlcnJpZGUgdGhpcyB0byBmb3JtYXQgYXMgYXBwcm9wcmlhdGUuICBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIHRydWUgaWYKKyAgICAvLy8gdGhlIG9wZXJhbmQgaXMgZXJyb25lb3VzLgorICAgIHZpcnR1YWwgYm9vbCBQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7CisKKyAgICAvLy8gUHJpbnRBc21NZW1vcnlPcGVyYW5kIC0gUHJpbnQgdGhlIHNwZWNpZmllZCBvcGVyYW5kIG9mIE1JLCBhbiBJTkxJTkVBU00KKyAgICAvLy8gaW5zdHJ1Y3Rpb24sIHVzaW5nIHRoZSBzcGVjaWZpZWQgYXNzZW1ibGVyIHZhcmlhbnQgYXMgYW4gYWRkcmVzcy4KKyAgICAvLy8gVGFyZ2V0cyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBmb3JtYXQgYXMgYXBwcm9wcmlhdGUuICBUaGlzIG1ldGhvZCBjYW4KKyAgICAvLy8gcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhbmQgaXMgZXJyb25lb3VzLgorICAgIHZpcnR1YWwgYm9vbCBQcmludEFzbU1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpOworCisgIHByaXZhdGU6CisgICAgLy8vIFByaXZhdGUgc3RhdGUgZm9yIFByaW50U3BlY2lhbCgpCisgICAgLy8gQXNzaWduIGEgdW5pcXVlIElEIHRvIHRoaXMgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgICBtdXRhYmxlIGNvbnN0IE1hY2hpbmVJbnN0ciAqTGFzdE1JOworICAgIG11dGFibGUgdW5zaWduZWQgTGFzdEZuOworICAgIG11dGFibGUgdW5zaWduZWQgQ291bnRlcjsKKyAgICBtdXRhYmxlIHVuc2lnbmVkIFNldENvdW50ZXI7CisKKyAgICAvLy8gRW1pdElubGluZUFzbSAtIEVtaXQgYSBibG9iIG9mIGlubGluZSBhc20gdG8gdGhlIG91dHB1dCBzdHJlYW1lci4KKyAgICB2b2lkIEVtaXRJbmxpbmVBc20oU3RyaW5nUmVmIFN0ciwgdW5zaWduZWQgTG9jQ29va2llKSBjb25zdDsKKworICAgIC8vLyBFbWl0SW5saW5lQXNtIC0gVGhpcyBtZXRob2QgZm9ybWF0cyBhbmQgZW1pdHMgdGhlIHNwZWNpZmllZCBtYWNoaW5lCisgICAgLy8vIGluc3RydWN0aW9uIHRoYXQgaXMgYW4gaW5saW5lIGFzbS4KKyAgICB2b2lkIEVtaXRJbmxpbmVBc20oY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3Q7CisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gSW50ZXJuYWwgSW1wbGVtZW50YXRpb24gRGV0YWlscworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAgIC8vLyBFbWl0VmlzaWJpbGl0eSAtIFRoaXMgZW1pdHMgdmlzaWJpbGl0eSBpbmZvcm1hdGlvbiBhYm91dCBzeW1ib2wsIGlmCisgICAgLy8vIHRoaXMgaXMgc3Vwb3J0ZWQgYnkgdGhlIHRhcmdldC4KKyAgICB2b2lkIEVtaXRWaXNpYmlsaXR5KE1DU3ltYm9sICpTeW0sIHVuc2lnbmVkIFZpc2liaWxpdHkpIGNvbnN0OworCisgICAgdm9pZCBFbWl0TGlua2FnZSh1bnNpZ25lZCBMaW5rYWdlLCBNQ1N5bWJvbCAqR1ZTeW0pIGNvbnN0OworCisgICAgdm9pZCBFbWl0SnVtcFRhYmxlRW50cnkoY29uc3QgTWFjaGluZUp1bXBUYWJsZUluZm8gKk1KVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1aWQpIGNvbnN0OworICAgIHZvaWQgRW1pdExMVk1Vc2VkTGlzdChDb25zdGFudCAqTGlzdCk7CisgICAgdm9pZCBFbWl0WFhTdHJ1Y3Rvckxpc3QoQ29uc3RhbnQgKkxpc3QpOworICAgIEdDTWV0YWRhdGFQcmludGVyICpHZXRPckNyZWF0ZUdDUHJpbnRlcihHQ1N0cmF0ZWd5ICpDKTsKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9CaW5hcnlPYmplY3QuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0JpbmFyeU9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGU3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9CaW5hcnlPYmplY3QuaApAQCAtMCwwICsxLDM1MyBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vQmluYXJ5T2JqZWN0LmggLSBCaW5hcnkgT2JqZWN0LiAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgQmluYXJ5IE9iamVjdCBBa2EuICJibG9iIiBmb3IgaG9sZGluZyBkYXRhIGZyb20gY29kZQorLy8gZ2VuZXJhdG9ycywgcmVhZHkgZm9yIGRhdGEgdG8gdGhlIG9iamVjdCBtb2R1bGUgY29kZSB3cml0dGVycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9CSU5BUllPQkpFQ1RfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fQklOQVJZT0JKRUNUX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVsb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEJpbmFyeURhdGE7CisKK2NsYXNzIEJpbmFyeU9iamVjdCB7Citwcm90ZWN0ZWQ6CisgIHN0ZDo6c3RyaW5nIE5hbWU7CisgIGJvb2wgSXNMaXR0bGVFbmRpYW47CisgIGJvb2wgSXM2NEJpdDsKKyAgQmluYXJ5RGF0YSBEYXRhOworICBzdGQ6OnZlY3RvcjxNYWNoaW5lUmVsb2NhdGlvbj4gUmVsb2NhdGlvbnM7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcgorICBCaW5hcnlPYmplY3QoKSB7fQorCisgIEJpbmFyeU9iamVjdChib29sIGlzTGl0dGxlRW5kaWFuLCBib29sIGlzNjRCaXQpCisgICAgOiBJc0xpdHRsZUVuZGlhbihpc0xpdHRsZUVuZGlhbiksIElzNjRCaXQoaXM2NEJpdCkge30KKworICBCaW5hcnlPYmplY3QoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGJvb2wgaXNMaXR0bGVFbmRpYW4sIGJvb2wgaXM2NEJpdCkKKyAgICA6IE5hbWUobmFtZSksIElzTGl0dGxlRW5kaWFuKGlzTGl0dGxlRW5kaWFuKSwgSXM2NEJpdChpczY0Qml0KSB7fQorCisgIH5CaW5hcnlPYmplY3QoKSB7fQorCisgIC8vLyBnZXROYW1lIC0gZ2V0IG5hbWUgb2YgQmluYXJ5T2JqZWN0CisgIGlubGluZSBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIC8vLyBnZXQgc2l6ZSBvZiBiaW5hcnkgZGF0YQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGF0YS5zaXplKCk7CisgIH0KKworICAvLy8gZ2V0IGJpbmFyeSBkYXRhCisgIEJpbmFyeURhdGEmIGdldERhdGEoKSB7CisgICAgcmV0dXJuIERhdGE7CisgIH0KKworICAvLy8gZ2V0IG1hY2hpbmUgcmVsb2NhdGlvbnMKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZVJlbG9jYXRpb24+JiBnZXRSZWxvY2F0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVsb2NhdGlvbnM7CisgIH0KKworICAvLy8gaGFzUmVsb2NhdGlvbnMgLSBSZXR1cm4gdHJ1ZSBpZiAnUmVsb2NhdGlvbnMnIGlzIG5vdCBlbXB0eQorICBib29sIGhhc1JlbG9jYXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiAhUmVsb2NhdGlvbnMuZW1wdHkoKTsKKyAgfQorCisgIC8vLyBlbWl0WmVyb3MgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgdG8gZW1pdCBhIGFyYml0cmFyeSBudW1iZXIgCisgIC8vLyBvZiB6ZXJvIGJ5dGVzIHRvIHRoZSBkYXRhIHN0cmVhbS4KKyAgaW5saW5lIHZvaWQgZW1pdFplcm9zKHVuc2lnbmVkIFNpemUpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGk9MDsgaSA8IFNpemU7ICsraSkKKyAgICAgIGVtaXRCeXRlKDApOworICB9CisKKyAgLy8vIGVtaXRCeXRlIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSBieXRlIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbS4KKyAgaW5saW5lIHZvaWQgZW1pdEJ5dGUodWludDhfdCBCKSB7CisgICAgRGF0YS5wdXNoX2JhY2soQik7CisgIH0KKworICAvLy8gZW1pdFdvcmQxNiAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgMTYtYml0IHdvcmQgbmVlZHMgdG8gYmUKKyAgLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtIGluIGNvcnJlY3QgZW5kaWFuIGZvcm1hdCBhbmQgY29ycmVjdCBzaXplLgorICBpbmxpbmUgdm9pZCBlbWl0V29yZDE2KHVpbnQxNl90IFcpIHsKKyAgICBpZiAoSXNMaXR0bGVFbmRpYW4pCisgICAgICBlbWl0V29yZDE2TEUoVyk7CisgICAgZWxzZQorICAgICAgZW1pdFdvcmQxNkJFKFcpOworICB9CisKKyAgLy8vIGVtaXRXb3JkMTZMRSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgMTYtYml0IHdvcmQgbmVlZHMgdG8gYmUKKyAgLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtIGluIGNvcnJlY3QgZW5kaWFuIGZvcm1hdCBhbmQgY29ycmVjdCBzaXplLgorICBpbmxpbmUgdm9pZCBlbWl0V29yZDE2TEUodWludDE2X3QgVykgeworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+IDApKTsKKyAgICBEYXRhLnB1c2hfYmFjaygodWludDhfdCkoVyA+PiA4KSk7CisgIH0KKworICAvLy8gZW1pdFdvcmQxNkJFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAxNi1iaXQgd29yZCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0gaW4gY29ycmVjdCBlbmRpYW4gZm9ybWF0IGFuZCBjb3JyZWN0IHNpemUuCisgIGlubGluZSB2b2lkIGVtaXRXb3JkMTZCRSh1aW50MTZfdCBXKSB7CisgICAgRGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKFcgPj4gOCkpOworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+IDApKTsKKyAgfQorCisgIC8vLyBlbWl0V29yZCAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgd29yZCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0gaW4gY29ycmVjdCBlbmRpYW4gZm9ybWF0IGFuZCBjb3JyZWN0IHNpemUuCisgIGlubGluZSB2b2lkIGVtaXRXb3JkKHVpbnQ2NF90IFcpIHsKKyAgICBpZiAoIUlzNjRCaXQpCisgICAgICBlbWl0V29yZDMyKFcpOworICAgIGVsc2UKKyAgICAgIGVtaXRXb3JkNjQoVyk7CisgIH0KKworICAvLy8gZW1pdFdvcmQzMiAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgMzItYml0IHdvcmQgbmVlZHMgdG8gYmUKKyAgLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtIGluIGNvcnJlY3QgZW5kaWFuIGZvcm1hdC4KKyAgaW5saW5lIHZvaWQgZW1pdFdvcmQzMih1aW50MzJfdCBXKSB7CisgICAgaWYgKElzTGl0dGxlRW5kaWFuKQorICAgICAgZW1pdFdvcmRMRShXKTsKKyAgICBlbHNlCisgICAgICBlbWl0V29yZEJFKFcpOworICB9CisKKyAgLy8vIGVtaXRXb3JkNjQgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDMyLWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSBpbiBjb3JyZWN0IGVuZGlhbiBmb3JtYXQuCisgIGlubGluZSB2b2lkIGVtaXRXb3JkNjQodWludDY0X3QgVykgeworICAgIGlmIChJc0xpdHRsZUVuZGlhbikKKyAgICAgIGVtaXREV29yZExFKFcpOworICAgIGVsc2UKKyAgICAgIGVtaXREV29yZEJFKFcpOworICB9CisKKyAgLy8vIGVtaXRXb3JkNjQgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIHg4Nl9mcDgwIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSBpbiBjb3JyZWN0IGVuZGlhbiBmb3JtYXQuCisgIGlubGluZSB2b2lkIGVtaXRXb3JkRlA4MChjb25zdCB1aW50NjRfdCAqVywgdW5zaWduZWQgUGFkU2l6ZSkgeworICAgIGlmIChJc0xpdHRsZUVuZGlhbikgeworICAgICAgZW1pdFdvcmQ2NChXWzBdKTsKKyAgICAgIGVtaXRXb3JkMTYoV1sxXSk7ICAKKyAgICB9IGVsc2UgeworICAgICAgZW1pdFdvcmQxNihXWzFdKTsgIAorICAgICAgZW1pdFdvcmQ2NChXWzBdKTsKKyAgICB9CisgICAgZW1pdFplcm9zKFBhZFNpemUpOworICB9CisKKyAgLy8vIGVtaXRXb3JkTEUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDMyLWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKyAgaW5saW5lIHZvaWQgZW1pdFdvcmRMRSh1aW50MzJfdCBXKSB7CisgICAgRGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKFcgPj4gIDApKTsKKyAgICBEYXRhLnB1c2hfYmFjaygodWludDhfdCkoVyA+PiAgOCkpOworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+IDE2KSk7CisgICAgRGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKFcgPj4gMjQpKTsKKyAgfQorCisgIC8vLyBlbWl0V29yZEJFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAzMi1iaXQgd29yZCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0gaW4gYmlnLWVuZGlhbiBmb3JtYXQuCisgIC8vLworICBpbmxpbmUgdm9pZCBlbWl0V29yZEJFKHVpbnQzMl90IFcpIHsKKyAgICBEYXRhLnB1c2hfYmFjaygodWludDhfdCkoVyA+PiAyNCkpOworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+IDE2KSk7CisgICAgRGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKFcgPj4gIDgpKTsKKyAgICBEYXRhLnB1c2hfYmFjaygodWludDhfdCkoVyA+PiAgMCkpOworICB9CisKKyAgLy8vIGVtaXREV29yZExFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSA2NC1iaXQgd29yZCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0gaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisgIGlubGluZSB2b2lkIGVtaXREV29yZExFKHVpbnQ2NF90IFcpIHsKKyAgICBEYXRhLnB1c2hfYmFjaygodWludDhfdCkoVyA+PiAgMCkpOworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+ICA4KSk7CisgICAgRGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKFcgPj4gMTYpKTsKKyAgICBEYXRhLnB1c2hfYmFjaygodWludDhfdCkoVyA+PiAyNCkpOworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+IDMyKSk7CisgICAgRGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKFcgPj4gNDApKTsKKyAgICBEYXRhLnB1c2hfYmFjaygodWludDhfdCkoVyA+PiA0OCkpOworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+IDU2KSk7CisgIH0KKworICAvLy8gZW1pdERXb3JkQkUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDY0LWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSBpbiBiaWctZW5kaWFuIGZvcm1hdC4KKyAgaW5saW5lIHZvaWQgZW1pdERXb3JkQkUodWludDY0X3QgVykgeworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+IDU2KSk7CisgICAgRGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKFcgPj4gNDgpKTsKKyAgICBEYXRhLnB1c2hfYmFjaygodWludDhfdCkoVyA+PiA0MCkpOworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+IDMyKSk7CisgICAgRGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKFcgPj4gMjQpKTsKKyAgICBEYXRhLnB1c2hfYmFjaygodWludDhfdCkoVyA+PiAxNikpOworICAgIERhdGEucHVzaF9iYWNrKCh1aW50OF90KShXID4+ICA4KSk7CisgICAgRGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKFcgPj4gIDApKTsKKyAgfQorCisgIC8vLyBmaXhCeXRlIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSBieXRlIG5lZWRzIHRvIGJlCisgIC8vLyBmaXh1cCB0aGUgYnVmZmVyLgorICBpbmxpbmUgdm9pZCBmaXhCeXRlKHVpbnQ4X3QgQiwgdWludDMyX3Qgb2Zmc2V0KSB7CisgICAgRGF0YVtvZmZzZXRdID0gQjsKKyAgfQorCisgIC8vLyBmaXhXb3JkMTYgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDE2LWJpdCB3b3JkIG5lZWRzIHRvCisgIC8vLyBmaXh1cCB0aGUgZGF0YSBzdHJlYW0gaW4gY29ycmVjdCBlbmRpYW4gZm9ybWF0LgorICBpbmxpbmUgdm9pZCBmaXhXb3JkMTYodWludDE2X3QgVywgdWludDMyX3Qgb2Zmc2V0KSB7CisgICAgaWYgKElzTGl0dGxlRW5kaWFuKQorICAgICAgZml4V29yZDE2TEUoVywgb2Zmc2V0KTsKKyAgICBlbHNlCisgICAgICBmaXhXb3JkMTZCRShXLCBvZmZzZXQpOworICB9CisKKyAgLy8vIGVtaXRXb3JkMTZMRSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgMTYtYml0IHdvcmQgbmVlZHMgdG8KKyAgLy8vIGZpeHVwIHRoZSBkYXRhIHN0cmVhbSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKyAgaW5saW5lIHZvaWQgZml4V29yZDE2TEUodWludDE2X3QgVywgdWludDMyX3Qgb2Zmc2V0KSB7CisgICAgRGF0YVtvZmZzZXRdICAgPSAodWludDhfdCkoVyA+PiAwKTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDgpOworICB9CisKKyAgLy8vIGZpeFdvcmQxNkJFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAxNi1iaXQgd29yZCBuZWVkcyB0bworICAvLy8gZml4dXAgZGF0YSBzdHJlYW0gaW4gYmlnIGVuZGlhbiBmb3JtYXQuCisgIGlubGluZSB2b2lkIGZpeFdvcmQxNkJFKHVpbnQxNl90IFcsIHVpbnQzMl90IG9mZnNldCkgeworICAgIERhdGFbb2Zmc2V0XSAgID0gKHVpbnQ4X3QpKFcgPj4gOCk7CisgICAgRGF0YVsrK29mZnNldF0gPSAodWludDhfdCkoVyA+PiAwKTsKKyAgfQorCisgIC8vLyBlbWl0V29yZCAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgd29yZCBuZWVkcyB0bworICAvLy8gZml4dXAgdGhlIGRhdGEgaW4gY29ycmVjdCBlbmRpYW4gZm9ybWF0IGFuZCBjb3JyZWN0IHNpemUuCisgIGlubGluZSB2b2lkIGZpeFdvcmQodWludDY0X3QgVywgdWludDMyX3Qgb2Zmc2V0KSB7CisgICAgaWYgKCFJczY0Qml0KQorICAgICAgZml4V29yZDMyKFcsIG9mZnNldCk7CisgICAgZWxzZQorICAgICAgZml4V29yZDY0KFcsIG9mZnNldCk7CisgIH0KKworICAvLy8gZml4V29yZDMyIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAzMi1iaXQgd29yZCBuZWVkcyB0bworICAvLy8gZml4dXAgdGhlIGRhdGEgaW4gY29ycmVjdCBlbmRpYW4gZm9ybWF0LgorICBpbmxpbmUgdm9pZCBmaXhXb3JkMzIodWludDMyX3QgVywgdWludDMyX3Qgb2Zmc2V0KSB7CisgICAgaWYgKElzTGl0dGxlRW5kaWFuKQorICAgICAgZml4V29yZDMyTEUoVywgb2Zmc2V0KTsKKyAgICBlbHNlCisgICAgICBmaXhXb3JkMzJCRShXLCBvZmZzZXQpOworICB9CisKKyAgLy8vIGZpeFdvcmQzMkxFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAzMi1iaXQgd29yZCBuZWVkcyB0bworICAvLy8gZml4dXAgdGhlIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuCisgIGlubGluZSB2b2lkIGZpeFdvcmQzMkxFKHVpbnQzMl90IFcsIHVpbnQzMl90IG9mZnNldCkgeworICAgIERhdGFbb2Zmc2V0XSAgID0gKHVpbnQ4X3QpKFcgPj4gIDApOworICAgIERhdGFbKytvZmZzZXRdID0gKHVpbnQ4X3QpKFcgPj4gIDgpOworICAgIERhdGFbKytvZmZzZXRdID0gKHVpbnQ4X3QpKFcgPj4gMTYpOworICAgIERhdGFbKytvZmZzZXRdID0gKHVpbnQ4X3QpKFcgPj4gMjQpOworICB9CisKKyAgLy8vIGZpeFdvcmQzMkJFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAzMi1iaXQgd29yZCBuZWVkcyB0bworICAvLy8gZml4dXAgdGhlIGRhdGEgaW4gYmlnIGVuZGlhbiBmb3JtYXQuCisgIGlubGluZSB2b2lkIGZpeFdvcmQzMkJFKHVpbnQzMl90IFcsIHVpbnQzMl90IG9mZnNldCkgeworICAgIERhdGFbb2Zmc2V0XSAgID0gKHVpbnQ4X3QpKFcgPj4gMjQpOworICAgIERhdGFbKytvZmZzZXRdID0gKHVpbnQ4X3QpKFcgPj4gMTYpOworICAgIERhdGFbKytvZmZzZXRdID0gKHVpbnQ4X3QpKFcgPj4gIDgpOworICAgIERhdGFbKytvZmZzZXRdID0gKHVpbnQ4X3QpKFcgPj4gIDApOworICB9CisKKyAgLy8vIGZpeFdvcmQ2NCAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgNjQtYml0IHdvcmQgbmVlZHMgdG8KKyAgLy8vIGZpeHVwIHRoZSBkYXRhIGluIGNvcnJlY3QgZW5kaWFuIGZvcm1hdC4KKyAgaW5saW5lIHZvaWQgZml4V29yZDY0KHVpbnQ2NF90IFcsIHVpbnQzMl90IG9mZnNldCkgeworICAgIGlmIChJc0xpdHRsZUVuZGlhbikKKyAgICAgIGZpeFdvcmQ2NExFKFcsIG9mZnNldCk7CisgICAgZWxzZQorICAgICAgZml4V29yZDY0QkUoVywgb2Zmc2V0KTsKKyAgfQorCisgIC8vLyBmaXhXb3JkNjRCRSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgNjQtYml0IHdvcmQgbmVlZHMgdG8KKyAgLy8vIGZpeHVwIHRoZSBkYXRhIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LgorICBpbmxpbmUgdm9pZCBmaXhXb3JkNjRMRSh1aW50NjRfdCBXLCB1aW50MzJfdCBvZmZzZXQpIHsKKyAgICBEYXRhW29mZnNldF0gICA9ICh1aW50OF90KShXID4+ICAwKTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+ICA4KTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDE2KTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDI0KTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDMyKTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDQwKTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDQ4KTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDU2KTsKKyAgfQorCisgIC8vLyBmaXhXb3JkNjRCRSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgNjQtYml0IHdvcmQgbmVlZHMgdG8KKyAgLy8vIGZpeHVwIHRoZSBkYXRhIGluIGJpZyBlbmRpYW4gZm9ybWF0LgorICBpbmxpbmUgdm9pZCBmaXhXb3JkNjRCRSh1aW50NjRfdCBXLCB1aW50MzJfdCBvZmZzZXQpIHsKKyAgICBEYXRhW29mZnNldF0gICA9ICh1aW50OF90KShXID4+IDU2KTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDQ4KTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDQwKTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDMyKTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDI0KTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+IDE2KTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+ICA4KTsKKyAgICBEYXRhWysrb2Zmc2V0XSA9ICh1aW50OF90KShXID4+ICAwKTsKKyAgfQorCisgIC8vLyBlbWl0QWxpZ25tZW50IC0gUGFkIHRoZSBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgYWxpZ25tZW50LgorICB2b2lkIGVtaXRBbGlnbm1lbnQodW5zaWduZWQgQWxpZ25tZW50LCB1aW50OF90IGZpbGwgPSAwKSB7CisgICAgaWYgKEFsaWdubWVudCA8PSAxKSByZXR1cm47CisgICAgdW5zaWduZWQgUGFkU2l6ZSA9IC1EYXRhLnNpemUoKSAmIChBbGlnbm1lbnQtMSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaTxQYWRTaXplOyArK2kpCisgICAgICBEYXRhLnB1c2hfYmFjayhmaWxsKTsKKyAgfQorCisgIC8vLyBlbWl0VUxFQjEyOEJ5dGVzIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSBVTEVCMTI4IG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbS4KKyAgdm9pZCBlbWl0VUxFQjEyOEJ5dGVzKHVpbnQ2NF90IFZhbHVlKSB7CisgICAgZG8geworICAgICAgdWludDhfdCBCeXRlID0gKHVpbnQ4X3QpKFZhbHVlICYgMHg3Zik7CisgICAgICBWYWx1ZSA+Pj0gNzsKKyAgICAgIGlmIChWYWx1ZSkgQnl0ZSB8PSAweDgwOworICAgICAgZW1pdEJ5dGUoQnl0ZSk7CisgICAgfSB3aGlsZSAoVmFsdWUpOworICB9CisKKyAgLy8vIGVtaXRTTEVCMTI4Qnl0ZXMgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIFNMRUIxMjggbmVlZHMgdG8gYmUKKyAgLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtLgorICB2b2lkIGVtaXRTTEVCMTI4Qnl0ZXMoaW50NjRfdCBWYWx1ZSkgeworICAgIGludCBTaWduID0gVmFsdWUgPj4gKDggKiBzaXplb2YoVmFsdWUpIC0gMSk7CisgICAgYm9vbCBJc01vcmU7CisKKyAgICBkbyB7CisgICAgICB1aW50OF90IEJ5dGUgPSAodWludDhfdCkoVmFsdWUgJiAweDdmKTsKKyAgICAgIFZhbHVlID4+PSA3OworICAgICAgSXNNb3JlID0gVmFsdWUgIT0gU2lnbiB8fCAoKEJ5dGUgXiBTaWduKSAmIDB4NDApICE9IDA7CisgICAgICBpZiAoSXNNb3JlKSBCeXRlIHw9IDB4ODA7CisgICAgICBlbWl0Qnl0ZShCeXRlKTsKKyAgICB9IHdoaWxlIChJc01vcmUpOworICB9CisKKyAgLy8vIGVtaXRTdHJpbmcgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIFN0cmluZyBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0uCisgIHZvaWQgZW1pdFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmU3RyaW5nKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgTiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihTdHJpbmcuc2l6ZSgpKTsgaTxOOyArK2kpIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgQyA9IFN0cmluZ1tpXTsKKyAgICAgIGVtaXRCeXRlKEMpOworICAgIH0KKyAgICBlbWl0Qnl0ZSgwKTsKKyAgfQorCisgIC8vLyBnZXRDdXJyZW50UENPZmZzZXQgLSBSZXR1cm4gdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZW1pdHRlZAorICAvLy8gYnVmZmVyIHRoYXQgd2UgYXJlIGN1cnJlbnRseSB3cml0aW5nIHRvLgorICB1aW50cHRyX3QgZ2V0Q3VycmVudFBDT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBEYXRhLnNpemUoKTsKKyAgfQorCisgIC8vLyBhZGRSZWxvY2F0aW9uIC0gV2hlbmV2ZXIgYSByZWxvY2F0YWJsZSBhZGRyZXNzIGlzIG5lZWRlZCwgaXQgc2hvdWxkIGJlCisgIC8vLyBub3RlZCB3aXRoIHRoaXMgaW50ZXJmYWNlLgorICB2b2lkIGFkZFJlbG9jYXRpb24oY29uc3QgTWFjaGluZVJlbG9jYXRpb24mIHJlbG9jYXRpb24pIHsKKyAgICBSZWxvY2F0aW9ucy5wdXNoX2JhY2socmVsb2NhdGlvbik7CisgIH0KKworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGNTcGlsbFdlaWdodHMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGNTcGlsbFdlaWdodHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDA3MzRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vQ2FsY1NwaWxsV2VpZ2h0cy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLSBsaWIvQ29kZUdlbi9DYWxjU3BpbGxXZWlnaHRzLmggLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX0NPREVHRU5fQ0FMQ1NQSUxMV0VJR0hUU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9DQUxDU1BJTExXRUlHSFRTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIExpdmVJbnRlcnZhbDsKKyAgY2xhc3MgTGl2ZUludGVydmFsczsKKyAgY2xhc3MgTWFjaGluZUxvb3BJbmZvOworCisgIC8vLyBWaXJ0UmVnQXV4SW5mbyAtIENhbGN1bGF0ZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gZm9yIGEgdmlydHVhbAorICAvLy8gcmVnaXN0ZXIgc3VjaCBhcyBpdHMgc3BpbGwgd2VpZ2h0IGFuZCBhbGxvY2F0aW9uIGhpbnQuCisgIGNsYXNzIFZpcnRSZWdBdXhJbmZvIHsKKyAgICBNYWNoaW5lRnVuY3Rpb24gJm1mXzsKKyAgICBMaXZlSW50ZXJ2YWxzICZsaXNfOworICAgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAmbG9vcHNfOworICAgIERlbnNlTWFwPHVuc2lnbmVkLCBmbG9hdD4gaGludF87CisgIHB1YmxpYzoKKyAgICBWaXJ0UmVnQXV4SW5mbyhNYWNoaW5lRnVuY3Rpb24gJm1mLCBMaXZlSW50ZXJ2YWxzICZsaXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUxvb3BJbmZvICZsb29wcykgOgorICAgICAgbWZfKG1mKSwgbGlzXyhsaXMpLCBsb29wc18obG9vcHMpIHt9CisKKyAgICAvLy8gQ2FsY3VsYXRlUmVnQ2xhc3MgLSByZWNvbXB1dGUgdGhlIHJlZ2lzdGVyIGNsYXNzIGZvciByZWcgZnJvbSBpdHMgdXNlcy4KKyAgICAvLy8gU2luY2UgdGhlIHJlZ2lzdGVyIGNsYXNzIGNhbiBhZmZlY3QgdGhlIGFsbG9jYXRpb24gaGludCwgdGhpcyBmdW5jdGlvbgorICAgIC8vLyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBDYWxjdWxhdGVXZWlnaHRBbmRIaW50IGlmIGJvdGggYXJlIGNhbGxlZC4KKyAgICB2b2lkIENhbGN1bGF0ZVJlZ0NsYXNzKHVuc2lnbmVkIHJlZyk7CisKKyAgICAvLy8gQ2FsY3VsYXRlV2VpZ2h0QW5kSGludCAtIChyZSljb21wdXRlIGxpJ3Mgc3BpbGwgd2VpZ2h0IGFuZCBhbGxvY2F0aW9uCisgICAgLy8vIGhpbnQuCisgICAgdm9pZCBDYWxjdWxhdGVXZWlnaHRBbmRIaW50KExpdmVJbnRlcnZhbCAmbGkpOworICB9OworCisgIC8vLyBDYWxjdWxhdGVTcGlsbFdlaWdodHMgLSBDb21wdXRlIHNwaWxsIHdlaWdodHMgZm9yIGFsbCB2aXJ0dWFsIHJlZ2lzdGVyCisgIC8vLyBsaXZlIGludGVydmFscy4KKyAgY2xhc3MgQ2FsY3VsYXRlU3BpbGxXZWlnaHRzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisKKyAgICBDYWxjdWxhdGVTcGlsbFdlaWdodHMoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZhdSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZmbik7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBsaXZlIGludGVydmFsIGlzIHplcm8gbGVuZ3RoLgorICAgIGJvb2wgaXNaZXJvTGVuZ3RoSW50ZXJ2YWwoTGl2ZUludGVydmFsICpsaSkgY29uc3Q7CisgIH07CisKK30KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9DQUxDU1BJTExXRUlHSFRTX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmI4NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oCkBAIC0wLDAgKzEsMzAwIEBACisvLz09PS0tIGxsdm0vQ2FsbGluZ0NvbnZMb3dlci5oIC0gQ2FsbGluZyBDb252ZW50aW9ucyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgQ0NTdGF0ZSBhbmQgQ0NWYWxBc3NpZ24gY2xhc3NlcywgdXNlZCBmb3IgbG93ZXJpbmcKKy8vIGFuZCBpbXBsZW1lbnRpbmcgY2FsbGluZyBjb252ZW50aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9DQUxMSU5HQ09OVkxPV0VSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0NBTExJTkdDT05WTE9XRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldENhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKyAgY2xhc3MgVGFyZ2V0TWFjaGluZTsKKyAgY2xhc3MgQ0NTdGF0ZTsKKworLy8vIENDVmFsQXNzaWduIC0gUmVwcmVzZW50IGFzc2lnbm1lbnQgb2Ygb25lIGFyZy9yZXR2YWwgdG8gYSBsb2NhdGlvbi4KK2NsYXNzIENDVmFsQXNzaWduIHsKK3B1YmxpYzoKKyAgZW51bSBMb2NJbmZvIHsKKyAgICBGdWxsLCAgIC8vIFRoZSB2YWx1ZSBmaWxscyB0aGUgZnVsbCBsb2NhdGlvbi4KKyAgICBTRXh0LCAgIC8vIFRoZSB2YWx1ZSBpcyBzaWduIGV4dGVuZGVkIGluIHRoZSBsb2NhdGlvbi4KKyAgICBaRXh0LCAgIC8vIFRoZSB2YWx1ZSBpcyB6ZXJvIGV4dGVuZGVkIGluIHRoZSBsb2NhdGlvbi4KKyAgICBBRXh0LCAgIC8vIFRoZSB2YWx1ZSBpcyBleHRlbmRlZCB3aXRoIHVuZGVmaW5lZCB1cHBlciBiaXRzLgorICAgIEJDdnQsICAgLy8gVGhlIHZhbHVlIGlzIGJpdC1jb252ZXJ0ZWQgaW4gdGhlIGxvY2F0aW9uLgorICAgIFZFeHQsICAgLy8gVGhlIHZhbHVlIGlzIHZlY3Rvci13aWRlbmVkIGluIHRoZSBsb2NhdGlvbi4KKyAgICAgICAgICAgIC8vIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiBDb2RlIHRoYXQgdXNlcyBBRXh0IHRvIG1lYW4KKyAgICAgICAgICAgIC8vIHZlY3Rvci13aWRlbiBzaG91bGQgYmUgZml4ZWQgdG8gdXNlIFZFeHQgaW5zdGVhZC4KKyAgICBJbmRpcmVjdCAvLyBUaGUgbG9jYXRpb24gY29udGFpbnMgcG9pbnRlciB0byB0aGUgdmFsdWUuCisgICAgLy8gVE9ETzogYSBzdWJzZXQgb2YgdGhlIHZhbHVlIGlzIGluIHRoZSBsb2NhdGlvbi4KKyAgfTsKK3ByaXZhdGU6CisgIC8vLyBWYWxObyAtIFRoaXMgaXMgdGhlIHZhbHVlIG51bWJlciBiZWdpbiBhc3NpZ25lZCAoZS5nLiBhbiBhcmd1bWVudCBudW1iZXIpLgorICB1bnNpZ25lZCBWYWxObzsKKworICAvLy8gTG9jIGlzIGVpdGhlciBhIHN0YWNrIG9mZnNldCBvciBhIHJlZ2lzdGVyIG51bWJlci4KKyAgdW5zaWduZWQgTG9jOworCisgIC8vLyBpc01lbSAtIFRydWUgaWYgdGhpcyBpcyBhIG1lbW9yeSBsb2MsIGZhbHNlIGlmIGl0IGlzIGEgcmVnaXN0ZXIgbG9jLgorICBib29sIGlzTWVtIDogMTsKKworICAvLy8gaXNDdXN0b20gLSBUcnVlIGlmIHRoaXMgYXJnL3JldHZhbCByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLgorICBib29sIGlzQ3VzdG9tIDogMTsKKworICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSB2YWx1ZSBpcyBhc3NpZ25lZC4KKyAgTG9jSW5mbyBIVFAgOiA2OworCisgIC8vLyBWYWxWVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBhc3NpZ25lZC4KKyAgRVZUIFZhbFZUOworCisgIC8vLyBMb2NWVCAtIFRoZSB0eXBlIG9mIHRoZSBsb2NhdGlvbiBiZWluZyBhc3NpZ25lZCB0by4KKyAgRVZUIExvY1ZUOworcHVibGljOgorCisgIHN0YXRpYyBDQ1ZhbEFzc2lnbiBnZXRSZWcodW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWdObywgRVZUIExvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY0luZm8gSFRQKSB7CisgICAgQ0NWYWxBc3NpZ24gUmV0OworICAgIFJldC5WYWxObyA9IFZhbE5vOworICAgIFJldC5Mb2MgPSBSZWdObzsKKyAgICBSZXQuaXNNZW0gPSBmYWxzZTsKKyAgICBSZXQuaXNDdXN0b20gPSBmYWxzZTsKKyAgICBSZXQuSFRQID0gSFRQOworICAgIFJldC5WYWxWVCA9IFZhbFZUOworICAgIFJldC5Mb2NWVCA9IExvY1ZUOworICAgIHJldHVybiBSZXQ7CisgIH0KKworICBzdGF0aWMgQ0NWYWxBc3NpZ24gZ2V0Q3VzdG9tUmVnKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnTm8sIEVWVCBMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NJbmZvIEhUUCkgeworICAgIENDVmFsQXNzaWduIFJldDsKKyAgICBSZXQgPSBnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWdObywgTG9jVlQsIEhUUCk7CisgICAgUmV0LmlzQ3VzdG9tID0gdHJ1ZTsKKyAgICByZXR1cm4gUmV0OworICB9CisKKyAgc3RhdGljIENDVmFsQXNzaWduIGdldE1lbSh1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9mZnNldCwgRVZUIExvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY0luZm8gSFRQKSB7CisgICAgQ0NWYWxBc3NpZ24gUmV0OworICAgIFJldC5WYWxObyA9IFZhbE5vOworICAgIFJldC5Mb2MgPSBPZmZzZXQ7CisgICAgUmV0LmlzTWVtID0gdHJ1ZTsKKyAgICBSZXQuaXNDdXN0b20gPSBmYWxzZTsKKyAgICBSZXQuSFRQID0gSFRQOworICAgIFJldC5WYWxWVCA9IFZhbFZUOworICAgIFJldC5Mb2NWVCA9IExvY1ZUOworICAgIHJldHVybiBSZXQ7CisgIH0KKworICBzdGF0aWMgQ0NWYWxBc3NpZ24gZ2V0Q3VzdG9tTWVtKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT2Zmc2V0LCBFVlQgTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jSW5mbyBIVFApIHsKKyAgICBDQ1ZhbEFzc2lnbiBSZXQ7CisgICAgUmV0ID0gZ2V0TWVtKFZhbE5vLCBWYWxWVCwgT2Zmc2V0LCBMb2NWVCwgSFRQKTsKKyAgICBSZXQuaXNDdXN0b20gPSB0cnVlOworICAgIHJldHVybiBSZXQ7CisgIH0KKworICB1bnNpZ25lZCBnZXRWYWxObygpIGNvbnN0IHsgcmV0dXJuIFZhbE5vOyB9CisgIEVWVCBnZXRWYWxWVCgpIGNvbnN0IHsgcmV0dXJuIFZhbFZUOyB9CisKKyAgYm9vbCBpc1JlZ0xvYygpIGNvbnN0IHsgcmV0dXJuICFpc01lbTsgfQorICBib29sIGlzTWVtTG9jKCkgY29uc3QgeyByZXR1cm4gaXNNZW07IH0KKworICBib29sIG5lZWRzQ3VzdG9tKCkgY29uc3QgeyByZXR1cm4gaXNDdXN0b207IH0KKworICB1bnNpZ25lZCBnZXRMb2NSZWcoKSBjb25zdCB7IGFzc2VydChpc1JlZ0xvYygpKTsgcmV0dXJuIExvYzsgfQorICB1bnNpZ25lZCBnZXRMb2NNZW1PZmZzZXQoKSBjb25zdCB7IGFzc2VydChpc01lbUxvYygpKTsgcmV0dXJuIExvYzsgfQorICBFVlQgZ2V0TG9jVlQoKSBjb25zdCB7IHJldHVybiBMb2NWVDsgfQorCisgIExvY0luZm8gZ2V0TG9jSW5mbygpIGNvbnN0IHsgcmV0dXJuIEhUUDsgfQorICBib29sIGlzRXh0SW5Mb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIChIVFAgPT0gQUV4dCB8fCBIVFAgPT0gU0V4dCB8fCBIVFAgPT0gWkV4dCk7CisgIH0KKworfTsKKworLy8vIENDQXNzaWduRm4gLSBUaGlzIGZ1bmN0aW9uIGFzc2lnbnMgYSBsb2NhdGlvbiBmb3IgVmFsLCB1cGRhdGluZyBTdGF0ZSB0bworLy8vIHJlZmxlY3QgdGhlIGNoYW5nZS4KK3R5cGVkZWYgYm9vbCBDQ0Fzc2lnbkZuKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKTsKKworLy8vIENDQ3VzdG9tRm4gLSBUaGlzIGZ1bmN0aW9uIGFzc2lnbnMgYSBsb2NhdGlvbiBmb3IgVmFsLCBwb3NzaWJseSB1cGRhdGluZworLy8vIGFsbCBhcmdzIHRvIHJlZmxlY3QgY2hhbmdlcyBhbmQgaW5kaWNhdGVzIGlmIGl0IGhhbmRsZWQgaXQuIEl0IG11c3Qgc2V0CisvLy8gaXNDdXN0b20gaWYgaXQgaGFuZGxlcyB0aGUgYXJnIGFuZCByZXR1cm5zIHRydWUuCit0eXBlZGVmIGJvb2wgQ0NDdXN0b21Gbih1bnNpZ25lZCAmVmFsTm8sIEVWVCAmVmFsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQgJkxvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyAmTG9jSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSAmQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKTsKKworLy8vIENDU3RhdGUgLSBUaGlzIGNsYXNzIGhvbGRzIGluZm9ybWF0aW9uIG5lZWRlZCB3aGlsZSBsb3dlcmluZyBhcmd1bWVudHMgYW5kCisvLy8gcmV0dXJuIHZhbHVlcy4gIEl0IGNhcHR1cmVzIHdoaWNoIHJlZ2lzdGVycyBhcmUgYWxyZWFkeSBhc3NpZ25lZCBhbmQgd2hpY2gKKy8vLyBzdGFjayBzbG90cyBhcmUgdXNlZC4gIEl0IHByb3ZpZGVzIGFjY2Vzc29ycyB0byBhbGxvY2F0ZSB0aGVzZSB2YWx1ZXMuCitjbGFzcyBDQ1N0YXRlIHsKKyAgQ2FsbGluZ0NvbnY6OklEIENhbGxpbmdDb252OworICBib29sIElzVmFyQXJnOworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkk7CisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gJkxvY3M7CisgIExMVk1Db250ZXh0ICZDb250ZXh0OworCisgIHVuc2lnbmVkIFN0YWNrT2Zmc2V0OworICBTbWFsbFZlY3Rvcjx1aW50MzJfdCwgMTY+IFVzZWRSZWdzOworcHVibGljOgorICBDQ1N0YXRlKENhbGxpbmdDb252OjpJRCBDQywgYm9vbCBpc1ZhckFyZywgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiAmbG9jcywgTExWTUNvbnRleHQgJkMpOworCisgIHZvaWQgYWRkTG9jKGNvbnN0IENDVmFsQXNzaWduICZWKSB7CisgICAgTG9jcy5wdXNoX2JhY2soVik7CisgIH0KKworICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmZ2V0VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gVE07IH0KKyAgQ2FsbGluZ0NvbnY6OklEIGdldENhbGxpbmdDb252KCkgY29uc3QgeyByZXR1cm4gQ2FsbGluZ0NvbnY7IH0KKyAgYm9vbCBpc1ZhckFyZygpIGNvbnN0IHsgcmV0dXJuIElzVmFyQXJnOyB9CisKKyAgdW5zaWduZWQgZ2V0TmV4dFN0YWNrT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gU3RhY2tPZmZzZXQ7IH0KKworICAvLy8gaXNBbGxvY2F0ZWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIChvciBhbiBhbGlhcykgaXMKKyAgLy8vIGFsbG9jYXRlZC4KKyAgYm9vbCBpc0FsbG9jYXRlZCh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlZFJlZ3NbUmVnLzMyXSAmICgxIDw8IChSZWcmMzEpKTsKKyAgfQorCisgIC8vLyBBbmFseXplRm9ybWFsQXJndW1lbnRzIC0gQW5hbHl6ZSBhbiBhcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMsCisgIC8vLyBpbmNvcnBvcmF0aW5nIGluZm8gYWJvdXQgdGhlIGZvcm1hbHMgaW50byB0aGlzIHN0YXRlLgorICB2b2lkIEFuYWx5emVGb3JtYWxBcmd1bWVudHMoY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnbkZuIEZuKTsKKworICAvLy8gQW5hbHl6ZVJldHVybiAtIEFuYWx5emUgdGhlIHJldHVybmVkIHZhbHVlcyBvZiBhIHJldHVybiwKKyAgLy8vIGluY29ycG9yYXRpbmcgaW5mbyBhYm91dCB0aGUgcmVzdWx0IHZhbHVlcyBpbnRvIHRoaXMgc3RhdGUuCisgIHZvaWQgQW5hbHl6ZVJldHVybihjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbik7CisKKyAgLy8vIENoZWNrUmV0dXJuIC0gQW5hbHl6ZSB0aGUgcmV0dXJuIHZhbHVlcyBvZiBhIGZ1bmN0aW9uLCByZXR1cm5pbmcKKyAgLy8vIHRydWUgaWYgdGhlIHJldHVybiBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgc3JldC1kZW1vdGlvbiwgYW5kCisgIC8vLyBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgQ2hlY2tSZXR1cm4oY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmQXJnc0ZsYWdzLAorICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBBbmFseXplQ2FsbE9wZXJhbmRzIC0gQW5hbHl6ZSB0aGUgb3V0Z29pbmcgYXJndW1lbnRzIHRvIGEgY2FsbCwKKyAgLy8vIGluY29ycG9yYXRpbmcgaW5mbyBhYm91dCB0aGUgcGFzc2VkIHZhbHVlcyBpbnRvIHRoaXMgc3RhdGUuCisgIHZvaWQgQW5hbHl6ZUNhbGxPcGVyYW5kcyhjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbik7CisKKyAgLy8vIEFuYWx5emVDYWxsT3BlcmFuZHMgLSBTYW1lIGFzIGFib3ZlIGV4Y2VwdCBpdCB0YWtlcyB2ZWN0b3JzIG9mIHR5cGVzCisgIC8vLyBhbmQgYXJndW1lbnQgZmxhZ3MuCisgIHZvaWQgQW5hbHl6ZUNhbGxPcGVyYW5kcyhTbWFsbFZlY3RvckltcGw8RVZUPiAmQXJnVlRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPElTRDo6QXJnRmxhZ3NUeT4gJkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbik7CisKKyAgLy8vIEFuYWx5emVDYWxsUmVzdWx0IC0gQW5hbHl6ZSB0aGUgcmV0dXJuIHZhbHVlcyBvZiBhIGNhbGwsCisgIC8vLyBpbmNvcnBvcmF0aW5nIGluZm8gYWJvdXQgdGhlIHBhc3NlZCB2YWx1ZXMgaW50byB0aGlzIHN0YXRlLgorICB2b2lkIEFuYWx5emVDYWxsUmVzdWx0KGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBBbmFseXplQ2FsbFJlc3VsdCAtIFNhbWUgYXMgYWJvdmUgZXhjZXB0IGl0J3Mgc3BlY2lhbGl6ZWQgZm9yIGNhbGxzIHdoaWNoCisgIC8vLyBwcm9kdWNlIGEgc2luZ2xlIHZhbHVlLgorICB2b2lkIEFuYWx5emVDYWxsUmVzdWx0KEVWVCBWVCwgQ0NBc3NpZ25GbiBGbik7CisKKyAgLy8vIGdldEZpcnN0VW5hbGxvY2F0ZWQgLSBSZXR1cm4gdGhlIGZpcnN0IHVuYWxsb2NhdGVkIHJlZ2lzdGVyIGluIHRoZSBzZXQsIG9yCisgIC8vLyBOdW1SZWdzIGlmIHRoZXkgYXJlIGFsbCBhbGxvY2F0ZWQuCisgIHVuc2lnbmVkIGdldEZpcnN0VW5hbGxvY2F0ZWQoY29uc3QgdW5zaWduZWQgKlJlZ3MsIHVuc2lnbmVkIE51bVJlZ3MpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVJlZ3M7ICsraSkKKyAgICAgIGlmICghaXNBbGxvY2F0ZWQoUmVnc1tpXSkpCisgICAgICAgIHJldHVybiBpOworICAgIHJldHVybiBOdW1SZWdzOworICB9CisKKyAgLy8vIEFsbG9jYXRlUmVnIC0gQXR0ZW1wdCB0byBhbGxvY2F0ZSBvbmUgcmVnaXN0ZXIuICBJZiBpdCBpcyBub3QgYXZhaWxhYmxlLAorICAvLy8gcmV0dXJuIHplcm8uICBPdGhlcndpc2UsIHJldHVybiB0aGUgcmVnaXN0ZXIsIG1hcmtpbmcgaXQgYW5kIGFueSBhbGlhc2VzCisgIC8vLyBhcyBhbGxvY2F0ZWQuCisgIHVuc2lnbmVkIEFsbG9jYXRlUmVnKHVuc2lnbmVkIFJlZykgeworICAgIGlmIChpc0FsbG9jYXRlZChSZWcpKSByZXR1cm4gMDsKKyAgICBNYXJrQWxsb2NhdGVkKFJlZyk7CisgICAgcmV0dXJuIFJlZzsKKyAgfQorCisgIC8vLyBWZXJzaW9uIG9mIEFsbG9jYXRlUmVnIHdpdGggZXh0cmEgcmVnaXN0ZXIgdG8gYmUgc2hhZG93ZWQuCisgIHVuc2lnbmVkIEFsbG9jYXRlUmVnKHVuc2lnbmVkIFJlZywgdW5zaWduZWQgU2hhZG93UmVnKSB7CisgICAgaWYgKGlzQWxsb2NhdGVkKFJlZykpIHJldHVybiAwOworICAgIE1hcmtBbGxvY2F0ZWQoUmVnKTsKKyAgICBNYXJrQWxsb2NhdGVkKFNoYWRvd1JlZyk7CisgICAgcmV0dXJuIFJlZzsKKyAgfQorCisgIC8vLyBBbGxvY2F0ZVJlZyAtIEF0dGVtcHQgdG8gYWxsb2NhdGUgb25lIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXJzLiAgSWYgbm9uZQorICAvLy8gYXJlIGF2YWlsYWJsZSwgcmV0dXJuIHplcm8uICBPdGhlcndpc2UsIHJldHVybiB0aGUgZmlyc3Qgb25lIGF2YWlsYWJsZSwKKyAgLy8vIG1hcmtpbmcgaXQgYW5kIGFueSBhbGlhc2VzIGFzIGFsbG9jYXRlZC4KKyAgdW5zaWduZWQgQWxsb2NhdGVSZWcoY29uc3QgdW5zaWduZWQgKlJlZ3MsIHVuc2lnbmVkIE51bVJlZ3MpIHsKKyAgICB1bnNpZ25lZCBGaXJzdFVuYWxsb2MgPSBnZXRGaXJzdFVuYWxsb2NhdGVkKFJlZ3MsIE51bVJlZ3MpOworICAgIGlmIChGaXJzdFVuYWxsb2MgPT0gTnVtUmVncykKKyAgICAgIHJldHVybiAwOyAgICAvLyBEaWRuJ3QgZmluZCB0aGUgcmVnLgorCisgICAgLy8gTWFyayB0aGUgcmVnaXN0ZXIgYW5kIGFueSBhbGlhc2VzIGFzIGFsbG9jYXRlZC4KKyAgICB1bnNpZ25lZCBSZWcgPSBSZWdzW0ZpcnN0VW5hbGxvY107CisgICAgTWFya0FsbG9jYXRlZChSZWcpOworICAgIHJldHVybiBSZWc7CisgIH0KKworICAvLy8gVmVyc2lvbiBvZiBBbGxvY2F0ZVJlZyB3aXRoIGxpc3Qgb2YgcmVnaXN0ZXJzIHRvIGJlIHNoYWRvd2VkLgorICB1bnNpZ25lZCBBbGxvY2F0ZVJlZyhjb25zdCB1bnNpZ25lZCAqUmVncywgY29uc3QgdW5zaWduZWQgKlNoYWRvd1JlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlZ3MpIHsKKyAgICB1bnNpZ25lZCBGaXJzdFVuYWxsb2MgPSBnZXRGaXJzdFVuYWxsb2NhdGVkKFJlZ3MsIE51bVJlZ3MpOworICAgIGlmIChGaXJzdFVuYWxsb2MgPT0gTnVtUmVncykKKyAgICAgIHJldHVybiAwOyAgICAvLyBEaWRuJ3QgZmluZCB0aGUgcmVnLgorCisgICAgLy8gTWFyayB0aGUgcmVnaXN0ZXIgYW5kIGFueSBhbGlhc2VzIGFzIGFsbG9jYXRlZC4KKyAgICB1bnNpZ25lZCBSZWcgPSBSZWdzW0ZpcnN0VW5hbGxvY10sIFNoYWRvd1JlZyA9IFNoYWRvd1JlZ3NbRmlyc3RVbmFsbG9jXTsKKyAgICBNYXJrQWxsb2NhdGVkKFJlZyk7CisgICAgTWFya0FsbG9jYXRlZChTaGFkb3dSZWcpOworICAgIHJldHVybiBSZWc7CisgIH0KKworICAvLy8gQWxsb2NhdGVTdGFjayAtIEFsbG9jYXRlIGEgY2h1bmsgb2Ygc3RhY2sgc3BhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUKKyAgLy8vIGFuZCBhbGlnbm1lbnQuCisgIHVuc2lnbmVkIEFsbG9jYXRlU3RhY2sodW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgQWxpZ24pIHsKKyAgICBhc3NlcnQoQWxpZ24gJiYgKChBbGlnbi0xKSAmIEFsaWduKSA9PSAwKTsgLy8gQWxpZ24gaXMgcG93ZXIgb2YgMi4KKyAgICBTdGFja09mZnNldCA9ICgoU3RhY2tPZmZzZXQgKyBBbGlnbi0xKSAmIH4oQWxpZ24tMSkpOworICAgIHVuc2lnbmVkIFJlc3VsdCA9IFN0YWNrT2Zmc2V0OworICAgIFN0YWNrT2Zmc2V0ICs9IFNpemU7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vLyBWZXJzaW9uIG9mIEFsbG9jYXRlU3RhY2sgd2l0aCBleHRyYSByZWdpc3RlciB0byBiZSBzaGFkb3dlZC4KKyAgdW5zaWduZWQgQWxsb2NhdGVTdGFjayh1bnNpZ25lZCBTaXplLCB1bnNpZ25lZCBBbGlnbiwgdW5zaWduZWQgU2hhZG93UmVnKSB7CisgICAgTWFya0FsbG9jYXRlZChTaGFkb3dSZWcpOworICAgIHJldHVybiBBbGxvY2F0ZVN0YWNrKFNpemUsIEFsaWduKTsKKyAgfQorCisgIC8vIEhhbmRsZUJ5VmFsIC0gQWxsb2NhdGUgYSBzdGFjayBzbG90IGxhcmdlIGVub3VnaCB0byBwYXNzIGFuIGFyZ3VtZW50IGJ5CisgIC8vIHZhbHVlLiBUaGUgc2l6ZSBhbmQgYWxpZ25tZW50IGluZm9ybWF0aW9uIG9mIHRoZSBhcmd1bWVudCBpcyBlbmNvZGVkIGluIGl0cworICAvLyBwYXJhbWV0ZXIgYXR0cmlidXRlLgorICB2b2lkIEhhbmRsZUJ5VmFsKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsCisgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLAorICAgICAgICAgICAgICAgICAgIGludCBNaW5TaXplLCBpbnQgTWluQWxpZ24sIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncyk7CisKK3ByaXZhdGU6CisgIC8vLyBNYXJrQWxsb2NhdGVkIC0gTWFyayBhIHJlZ2lzdGVyIGFuZCBhbGwgb2YgaXRzIGFsaWFzZXMgYXMgYWxsb2NhdGVkLgorICB2b2lkIE1hcmtBbGxvY2F0ZWQodW5zaWduZWQgUmVnKTsKK307CisKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Zhc3RJU2VsLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9GYXN0SVNlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YjE1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9GYXN0SVNlbC5oCkBAIC0wLDAgKzEsMzQxIEBACisvLz09PS0tIEZhc3RJU2VsLmggLSBEZWZpbml0aW9uIG9mIHRoZSBGYXN0SVNlbCBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBGYXN0SVNlbCBjbGFzcy4KKy8vICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIAorI2lmbmRlZiBMTFZNX0NPREVHRU5fRkFTVElTRUxfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fRkFTVElTRUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNlbmRpZgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxsb2NhSW5zdDsKK2NsYXNzIENvbnN0YW50RlA7CitjbGFzcyBGdW5jdGlvbkxvd2VyaW5nSW5mbzsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lQ29uc3RhbnRQb29sOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZUZyYW1lSW5mbzsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBUYXJnZXREYXRhOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVGFyZ2V0TG93ZXJpbmc7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworLy8vIEZhc3RJU2VsIC0gVGhpcyBpcyBhIGZhc3QtcGF0aCBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gY2xhc3MgdGhhdAorLy8vIGdlbmVyYXRlcyBwb29yIGNvZGUgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBpbGxlZ2FsIHR5cGVzIG9yIG5vbi10cml2aWFsCisvLy8gbG93ZXJpbmcsIGJ1dCBydW5zIHF1aWNrbHkuCitjbGFzcyBGYXN0SVNlbCB7Citwcm90ZWN0ZWQ6CisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIHVuc2lnbmVkPiBMb2NhbFZhbHVlTWFwOworICBGdW5jdGlvbkxvd2VyaW5nSW5mbyAmRnVuY0luZm87CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSTsKKyAgTWFjaGluZUZyYW1lSW5mbyAmTUZJOworICBNYWNoaW5lQ29uc3RhbnRQb29sICZNQ1A7CisgIERlYnVnTG9jIERMOworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKyAgY29uc3QgVGFyZ2V0RGF0YSAmVEQ7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSTsKKyAgTWFjaGluZUluc3RyICpMYXN0TG9jYWxWYWx1ZTsKKworcHVibGljOgorICAvLy8gZ2V0TGFzdExvY2FsVmFsdWUgLSBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGluc3RydWN0aW9uCisgIC8vLyBlbWl0dGVkIGZvciBtYXRlcmlhbGl6aW5nIGNvbnN0YW50cyBmb3IgdXNlIGluIHRoZSBjdXJyZW50IGJsb2NrLgorICBNYWNoaW5lSW5zdHIgKmdldExhc3RMb2NhbFZhbHVlKCkgeyByZXR1cm4gTGFzdExvY2FsVmFsdWU7IH0KKworICAvLy8gc2V0TGFzdExvY2FsVmFsdWUgLSBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGluc3RydWN0aW9uCisgIC8vLyBlbWl0dGVkIGZvciBtYXRlcmlhbGl6aW5nIGNvbnN0YW50cyBmb3IgdXNlIGluIHRoZSBjdXJyZW50IGJsb2NrLgorICB2b2lkIHNldExhc3RMb2NhbFZhbHVlKE1hY2hpbmVJbnN0ciAqSSkgeyBMYXN0TG9jYWxWYWx1ZSA9IEk7IH0KKworICAvLy8gc3RhcnROZXdCbG9jayAtIFNldCB0aGUgY3VycmVudCBibG9jayB0byB3aGljaCBnZW5lcmF0ZWQgbWFjaGluZQorICAvLy8gaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgYXBwZW5kZWQsIGFuZCBjbGVhciB0aGUgbG9jYWwgQ1NFIG1hcC4KKyAgLy8vCisgIHZvaWQgc3RhcnROZXdCbG9jaygpOworCisgIC8vLyBnZXRDdXJEZWJ1Z0xvYygpIC0gUmV0dXJuIGN1cnJlbnQgZGVidWcgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIERlYnVnTG9jIGdldEN1ckRlYnVnTG9jKCkgY29uc3QgeyByZXR1cm4gREw7IH0KKworICAvLy8gU2VsZWN0SW5zdHJ1Y3Rpb24gLSBEbyAiZmFzdCIgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGZvciB0aGUgZ2l2ZW4KKyAgLy8vIExMVk0gSVIgaW5zdHJ1Y3Rpb24sIGFuZCBhcHBlbmQgZ2VuZXJhdGVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHRvCisgIC8vLyB0aGUgY3VycmVudCBibG9jay4gUmV0dXJuIHRydWUgaWYgc2VsZWN0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAvLy8KKyAgYm9vbCBTZWxlY3RJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiAqSSk7CisKKyAgLy8vIFNlbGVjdE9wZXJhdG9yIC0gRG8gImZhc3QiIGluc3RydWN0aW9uIHNlbGVjdGlvbiBmb3IgdGhlIGdpdmVuCisgIC8vLyBMTFZNIElSIG9wZXJhdG9yIChJbnN0cnVjdGlvbiBvciBDb25zdGFudEV4cHIpLCBhbmQgYXBwZW5kCisgIC8vLyBnZW5lcmF0ZWQgbWFjaGluZSBpbnN0cnVjdGlvbnMgdG8gdGhlIGN1cnJlbnQgYmxvY2suIFJldHVybiB0cnVlCisgIC8vLyBpZiBzZWxlY3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgIC8vLworICBib29sIFNlbGVjdE9wZXJhdG9yKGNvbnN0IFVzZXIgKkksIHVuc2lnbmVkIE9wY29kZSk7CisKKyAgLy8vIGdldFJlZ0ZvclZhbHVlIC0gQ3JlYXRlIGEgdmlydHVhbCByZWdpc3RlciBhbmQgYXJyYW5nZSBmb3IgaXQgdG8KKyAgLy8vIGJlIGFzc2lnbmVkIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIExMVk0gdmFsdWUuCisgIHVuc2lnbmVkIGdldFJlZ0ZvclZhbHVlKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gbG9va1VwUmVnRm9yVmFsdWUgLSBMb29rIHVwIHRoZSB2YWx1ZSB0byBzZWUgaWYgaXRzIHZhbHVlIGlzIGFscmVhZHkKKyAgLy8vIGNhY2hlZCBpbiBhIHJlZ2lzdGVyLiBJdCBtYXkgYmUgZGVmaW5lZCBieSBpbnN0cnVjdGlvbnMgYWNyb3NzIGJsb2NrcyBvcgorICAvLy8gZGVmaW5lZCBsb2NhbGx5LgorICB1bnNpZ25lZCBsb29rVXBSZWdGb3JWYWx1ZShjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIGdldFJlZ0ZvckdFUEluZGV4IC0gVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIGdldFJlZ0ZvclZhbHVlIHRoYXQgYWxzbworICAvLy8gdGFrZXMgY2FyZSBvZiB0cnVuY2F0aW5nIG9yIHNpZ24tZXh0ZW5kaW5nIHRoZSBnaXZlbiBnZXRlbGVtZW50cHRyCisgIC8vLyBpbmRleCB2YWx1ZS4KKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCBib29sPiBnZXRSZWdGb3JHRVBJbmRleChjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIHJlY29tcHV0ZUluc2VydFB0IC0gUmVzZXQgSW5zZXJ0UHQgdG8gcHJlcGFyZSBmb3IgaW5zdGVydGluZyBpbnN0cnVjdGlvbnMKKyAgLy8vIGludG8gdGhlIGN1cnJlbnQgYmxvY2suCisgIHZvaWQgcmVjb21wdXRlSW5zZXJ0UHQoKTsKKworICBzdHJ1Y3QgU2F2ZVBvaW50IHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQ7CisgICAgRGVidWdMb2MgREw7CisgIH07CisKKyAgLy8vIGVudGVyTG9jYWxWYWx1ZUFyZWEgLSBQcmVwYXJlIEluc2VydFB0IHRvIGJlZ2luIGluc2VydGluZyBpbnN0cnVjdGlvbnMKKyAgLy8vIGludG8gdGhlIGxvY2FsIHZhbHVlIGFyZWEgYW5kIHJldHVybiB0aGUgb2xkIGluc2VydCBwb3NpdGlvbi4KKyAgU2F2ZVBvaW50IGVudGVyTG9jYWxWYWx1ZUFyZWEoKTsKKworICAvLy8gbGVhdmVMb2NhbFZhbHVlQXJlYSAtIFJlc2V0IEluc2VydFB0IHRvIHRoZSBnaXZlbiBvbGQgaW5zZXJ0IHBvc2l0aW9uLgorICB2b2lkIGxlYXZlTG9jYWxWYWx1ZUFyZWEoU2F2ZVBvaW50IE9sZCk7CisKKyAgdmlydHVhbCB+RmFzdElTZWwoKTsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBGYXN0SVNlbChGdW5jdGlvbkxvd2VyaW5nSW5mbyAmZnVuY0luZm8pOworCisgIC8vLyBUYXJnZXRTZWxlY3RJbnN0cnVjdGlvbiAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0YXJnZXQtaW5kZXBlbmRlbnQKKyAgLy8vIGNvZGUgd2hlbiB0aGUgbm9ybWFsIEZhc3RJU2VsIHByb2Nlc3MgZmFpbHMgdG8gc2VsZWN0IGFuIGluc3RydWN0aW9uLgorICAvLy8gVGhpcyBnaXZlcyB0YXJnZXRzIGEgY2hhbmNlIHRvIGVtaXQgY29kZSBmb3IgYW55dGhpbmcgdGhhdCBkb2Vzbid0CisgIC8vLyBmaXQgaW50byBGYXN0SVNlbCdzIGZyYW1ld29yay4gSXQgcmV0dXJucyB0cnVlIGlmIGl0IHdhcyBzdWNjZXNzZnVsLgorICAvLy8KKyAgdmlydHVhbCBib29sCisgIFRhcmdldFNlbGVjdEluc3RydWN0aW9uKGNvbnN0IEluc3RydWN0aW9uICpJKSA9IDA7CisKKyAgLy8vIEZhc3RFbWl0X3IgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUKKyAgLy8vIHRvIHJlcXVlc3QgdGhhdCBhbiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBvcGNvZGUKKyAgLy8vIGJlIGVtaXR0ZWQuCisgIHZpcnR1YWwgdW5zaWduZWQgRmFzdEVtaXRfKE1WVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUIFJldFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGNvZGUpOworCisgIC8vLyBGYXN0RW1pdF9yIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRhcmdldC1pbmRlcGVuZGVudCBjb2RlCisgIC8vLyB0byByZXF1ZXN0IHRoYXQgYW4gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgZ2l2ZW4gdHlwZSwgb3Bjb2RlLCBhbmQKKyAgLy8vIHJlZ2lzdGVyIG9wZXJhbmQgYmUgZW1pdHRlZC4KKyAgLy8vCisgIHZpcnR1YWwgdW5zaWduZWQgRmFzdEVtaXRfcihNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQgUmV0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKTsKKworICAvLy8gRmFzdEVtaXRfcnIgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUKKyAgLy8vIHRvIHJlcXVlc3QgdGhhdCBhbiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlLCBvcGNvZGUsIGFuZAorICAvLy8gcmVnaXN0ZXIgb3BlcmFuZHMgYmUgZW1pdHRlZC4KKyAgLy8vCisgIHZpcnR1YWwgdW5zaWduZWQgRmFzdEVtaXRfcnIoTVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVCBSZXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKTsKKworICAvLy8gRmFzdEVtaXRfcmkgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUKKyAgLy8vIHRvIHJlcXVlc3QgdGhhdCBhbiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlLCBvcGNvZGUsIGFuZAorICAvLy8gcmVnaXN0ZXIgYW5kIGltbWVkaWF0ZSBvcGVyYW5kcyBiZSBlbWl0dGVkLgorICAvLy8KKyAgdmlydHVhbCB1bnNpZ25lZCBGYXN0RW1pdF9yaShNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUIFJldFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEltbSk7CisKKyAgLy8vIEZhc3RFbWl0X3JmIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRhcmdldC1pbmRlcGVuZGVudCBjb2RlCisgIC8vLyB0byByZXF1ZXN0IHRoYXQgYW4gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgZ2l2ZW4gdHlwZSwgb3Bjb2RlLCBhbmQKKyAgLy8vIHJlZ2lzdGVyIGFuZCBmbG9hdGluZy1wb2ludCBpbW1lZGlhdGUgb3BlcmFuZHMgYmUgZW1pdHRlZC4KKyAgLy8vCisgIHZpcnR1YWwgdW5zaWduZWQgRmFzdEVtaXRfcmYoTVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVCBSZXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudEZQICpGUEltbSk7CisKKyAgLy8vIEZhc3RFbWl0X3JyaSAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZQorICAvLy8gdG8gcmVxdWVzdCB0aGF0IGFuIGluc3RydWN0aW9uIHdpdGggdGhlIGdpdmVuIHR5cGUsIG9wY29kZSwgYW5kCisgIC8vLyByZWdpc3RlciBhbmQgaW1tZWRpYXRlIG9wZXJhbmRzIGJlIGVtaXR0ZWQuCisgIC8vLworICB2aXJ0dWFsIHVuc2lnbmVkIEZhc3RFbWl0X3JyaShNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVCBSZXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBJbW0pOworCisgIC8vLyBGYXN0RW1pdF9yaV8gLSBUaGlzIG1ldGhvZCBpcyBhIHdyYXBwZXIgb2YgRmFzdEVtaXRfcmkuIEl0IGZpcnN0IHRyaWVzCisgIC8vLyB0byBlbWl0IGFuIGluc3RydWN0aW9uIHdpdGggYW4gaW1tZWRpYXRlIG9wZXJhbmQgdXNpbmcgRmFzdEVtaXRfcmkuCisgIC8vLyBJZiB0aGF0IGZhaWxzLCBpdCBtYXRlcmlhbGl6ZXMgdGhlIGltbWVkaWF0ZSBpbnRvIGEgcmVnaXN0ZXIgYW5kIHRyeQorICAvLy8gRmFzdEVtaXRfcnIgaW5zdGVhZC4KKyAgdW5zaWduZWQgRmFzdEVtaXRfcmlfKE1WVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBJbW0sIE1WVCBJbW1UeXBlKTsKKyAgCisgIC8vLyBGYXN0RW1pdF9yZl8gLSBUaGlzIG1ldGhvZCBpcyBhIHdyYXBwZXIgb2YgRmFzdEVtaXRfcmYuIEl0IGZpcnN0IHRyaWVzCisgIC8vLyB0byBlbWl0IGFuIGluc3RydWN0aW9uIHdpdGggYW4gaW1tZWRpYXRlIG9wZXJhbmQgdXNpbmcgRmFzdEVtaXRfcmYuCisgIC8vLyBJZiB0aGF0IGZhaWxzLCBpdCBtYXRlcmlhbGl6ZXMgdGhlIGltbWVkaWF0ZSBpbnRvIGEgcmVnaXN0ZXIgYW5kIHRyeQorICAvLy8gRmFzdEVtaXRfcnIgaW5zdGVhZC4KKyAgdW5zaWduZWQgRmFzdEVtaXRfcmZfKE1WVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudEZQICpGUEltbSwgTVZUIEltbVR5cGUpOworICAKKyAgLy8vIEZhc3RFbWl0X2kgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUKKyAgLy8vIHRvIHJlcXVlc3QgdGhhdCBhbiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlLCBvcGNvZGUsIGFuZAorICAvLy8gaW1tZWRpYXRlIG9wZXJhbmQgYmUgZW1pdHRlZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBGYXN0RW1pdF9pKE1WVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVCBSZXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEltbSk7CisKKyAgLy8vIEZhc3RFbWl0X2YgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUKKyAgLy8vIHRvIHJlcXVlc3QgdGhhdCBhbiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlLCBvcGNvZGUsIGFuZAorICAvLy8gZmxvYXRpbmctcG9pbnQgaW1tZWRpYXRlIG9wZXJhbmQgYmUgZW1pdHRlZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBGYXN0RW1pdF9mKE1WVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVCBSZXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50RlAgKkZQSW1tKTsKKworICAvLy8gRmFzdEVtaXRJbnN0XyAtIEVtaXQgYSBNYWNoaW5lSW5zdHIgd2l0aCBubyBvcGVyYW5kcyBhbmQgYQorICAvLy8gcmVzdWx0IHJlZ2lzdGVyIGluIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcy4KKyAgLy8vCisgIHVuc2lnbmVkIEZhc3RFbWl0SW5zdF8odW5zaWduZWQgTWFjaGluZUluc3RPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpOworCisgIC8vLyBGYXN0RW1pdEluc3RfciAtIEVtaXQgYSBNYWNoaW5lSW5zdHIgd2l0aCBvbmUgcmVnaXN0ZXIgb3BlcmFuZAorICAvLy8gYW5kIGEgcmVzdWx0IHJlZ2lzdGVyIGluIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcy4KKyAgLy8vCisgIHVuc2lnbmVkIEZhc3RFbWl0SW5zdF9yKHVuc2lnbmVkIE1hY2hpbmVJbnN0T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCk7CisKKyAgLy8vIEZhc3RFbWl0SW5zdF9yciAtIEVtaXQgYSBNYWNoaW5lSW5zdHIgd2l0aCB0d28gcmVnaXN0ZXIgb3BlcmFuZHMKKyAgLy8vIGFuZCBhIHJlc3VsdCByZWdpc3RlciBpbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MuCisgIC8vLworICB1bnNpZ25lZCBGYXN0RW1pdEluc3RfcnIodW5zaWduZWQgTWFjaGluZUluc3RPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKTsKKworICAvLy8gRmFzdEVtaXRJbnN0X3JpIC0gRW1pdCBhIE1hY2hpbmVJbnN0ciB3aXRoIHR3byByZWdpc3RlciBvcGVyYW5kcworICAvLy8gYW5kIGEgcmVzdWx0IHJlZ2lzdGVyIGluIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcy4KKyAgLy8vCisgIHVuc2lnbmVkIEZhc3RFbWl0SW5zdF9yaSh1bnNpZ25lZCBNYWNoaW5lSW5zdE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEltbSk7CisKKyAgLy8vIEZhc3RFbWl0SW5zdF9yZiAtIEVtaXQgYSBNYWNoaW5lSW5zdHIgd2l0aCB0d28gcmVnaXN0ZXIgb3BlcmFuZHMKKyAgLy8vIGFuZCBhIHJlc3VsdCByZWdpc3RlciBpbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MuCisgIC8vLworICB1bnNpZ25lZCBGYXN0RW1pdEluc3RfcmYodW5zaWduZWQgTWFjaGluZUluc3RPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudEZQICpGUEltbSk7CisKKyAgLy8vIEZhc3RFbWl0SW5zdF9ycmkgLSBFbWl0IGEgTWFjaGluZUluc3RyIHdpdGggdHdvIHJlZ2lzdGVyIG9wZXJhbmRzLAorICAvLy8gYW4gaW1tZWRpYXRlLCBhbmQgYSByZXN1bHQgcmVnaXN0ZXIgaW4gdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzLgorICAvLy8KKyAgdW5zaWduZWQgRmFzdEVtaXRJbnN0X3JyaSh1bnNpZ25lZCBNYWNoaW5lSW5zdE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgSW1tKTsKKyAgCisgIC8vLyBGYXN0RW1pdEluc3RfaSAtIEVtaXQgYSBNYWNoaW5lSW5zdHIgd2l0aCBhIHNpbmdsZSBpbW1lZGlhdGUKKyAgLy8vIG9wZXJhbmQsIGFuZCBhIHJlc3VsdCByZWdpc3RlciBpbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MuCisgIHVuc2lnbmVkIEZhc3RFbWl0SW5zdF9pKHVuc2lnbmVkIE1hY2hpbmVJbnN0ck9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEltbSk7CisKKyAgLy8vIEZhc3RFbWl0SW5zdF9leHRyYWN0c3VicmVnIC0gRW1pdCBhIE1hY2hpbmVJbnN0ciBmb3IgYW4gZXh0cmFjdF9zdWJyZWcKKyAgLy8vIGZyb20gYSBzcGVjaWZpZWQgaW5kZXggb2YgYSBzdXBlcnJlZ2lzdGVyIHRvIGEgc3BlY2lmaWVkIHR5cGUuCisgIHVuc2lnbmVkIEZhc3RFbWl0SW5zdF9leHRyYWN0c3VicmVnKE1WVCBSZXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSWR4KTsKKworICAvLy8gRmFzdEVtaXRaRXh0RnJvbUkxIC0gRW1pdCBNYWNoaW5lSW5zdHJzIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIE9wCisgIC8vLyB3aXRoIGFsbCBidXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBzZXQgdG8gemVyby4KKyAgdW5zaWduZWQgRmFzdEVtaXRaRXh0RnJvbUkxKE1WVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpOworCisgIC8vLyBGYXN0RW1pdEJyYW5jaCAtIEVtaXQgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gdGhlIGdpdmVuIGJsb2NrLAorICAvLy8gdW5sZXNzIGl0IGlzIHRoZSBpbW1lZGlhdGUgKGZhbGwtdGhyb3VnaCkgc3VjY2Vzc29yLCBhbmQgdXBkYXRlCisgIC8vLyB0aGUgQ0ZHLgorICB2b2lkIEZhc3RFbWl0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIERlYnVnTG9jIERMKTsKKworICB1bnNpZ25lZCBVcGRhdGVWYWx1ZU1hcChjb25zdCBWYWx1ZSogSSwgdW5zaWduZWQgUmVnKTsKKworICB1bnNpZ25lZCBjcmVhdGVSZXN1bHRSZWcoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpOworICAKKyAgLy8vIFRhcmdldE1hdGVyaWFsaXplQ29uc3RhbnQgLSBFbWl0IGEgY29uc3RhbnQgaW4gYSByZWdpc3RlciB1c2luZyAKKyAgLy8vIHRhcmdldC1zcGVjaWZpYyBsb2dpYywgc3VjaCBhcyBjb25zdGFudCBwb29sIGxvYWRzLgorICB2aXJ0dWFsIHVuc2lnbmVkIFRhcmdldE1hdGVyaWFsaXplQ29uc3RhbnQoY29uc3QgQ29uc3RhbnQqIEMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBUYXJnZXRNYXRlcmlhbGl6ZUFsbG9jYSAtIEVtaXQgYW4gYWxsb2NhIGFkZHJlc3MgaW4gYSByZWdpc3RlciB1c2luZworICAvLy8gdGFyZ2V0LXNwZWNpZmljIGxvZ2ljLgorICB2aXJ0dWFsIHVuc2lnbmVkIFRhcmdldE1hdGVyaWFsaXplQWxsb2NhKGNvbnN0IEFsbG9jYUluc3QqIEMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCitwcml2YXRlOgorICBib29sIFNlbGVjdEJpbmFyeU9wKGNvbnN0IFVzZXIgKkksIHVuc2lnbmVkIElTRE9wY29kZSk7CisKKyAgYm9vbCBTZWxlY3RGTmVnKGNvbnN0IFVzZXIgKkkpOworCisgIGJvb2wgU2VsZWN0R2V0RWxlbWVudFB0cihjb25zdCBVc2VyICpJKTsKKworICBib29sIFNlbGVjdENhbGwoY29uc3QgVXNlciAqSSk7CisKKyAgYm9vbCBTZWxlY3RCaXRDYXN0KGNvbnN0IFVzZXIgKkkpOworICAKKyAgYm9vbCBTZWxlY3RDYXN0KGNvbnN0IFVzZXIgKkksIHVuc2lnbmVkIE9wY29kZSk7CisKKyAgLy8vIEhhbmRsZVBISU5vZGVzSW5TdWNjZXNzb3JCbG9ja3MgLSBIYW5kbGUgUEhJIG5vZGVzIGluIHN1Y2Nlc3NvciBibG9ja3MuCisgIC8vLyBFbWl0IGNvZGUgdG8gZW5zdXJlIGNvbnN0YW50cyBhcmUgY29waWVkIGludG8gcmVnaXN0ZXJzIHdoZW4gbmVlZGVkLgorICAvLy8gUmVtZW1iZXIgdGhlIHZpcnR1YWwgcmVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgTWFjaGluZSBQSEkKKyAgLy8vIG5vZGVzIGFzIGlucHV0LiAgV2UgY2Fubm90IGp1c3QgZGlyZWN0bHkgYWRkIHRoZW0sIGJlY2F1c2UgZXhwYW5zaW9uCisgIC8vLyBtaWdodCByZXN1bHQgaW4gbXVsdGlwbGUgTUJCJ3MgZm9yIG9uZSBCQi4gIEFzIHN1Y2gsIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8vIEJCIG1pZ2h0IGNvcnJlc3BvbmQgdG8gYSBkaWZmZXJlbnQgTUJCIHRoYW4gdGhlIGVuZC4KKyAgYm9vbCBIYW5kbGVQSElOb2Rlc0luU3VjY2Vzc29yQmxvY2tzKGNvbnN0IEJhc2ljQmxvY2sgKkxMVk1CQik7CisKKyAgLy8vIG1hdGVyaWFsaXplUmVnRm9yVmFsdWUgLSBIZWxwZXIgZm9yIGdldFJlZ0ZvclZhbGUuIFRoaXMgZnVuY3Rpb24gaXMKKyAgLy8vIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBpc24ndCBhbHJlYWR5IGF2YWlsYWJsZSBpbiBhIHJlZ2lzdGVyIGFuZCBtdXN0CisgIC8vLyBiZSBtYXRlcmlhbGl6ZWQgd2l0aCBuZXcgaW5zdHJ1Y3Rpb25zLgorICB1bnNpZ25lZCBtYXRlcmlhbGl6ZVJlZ0ZvclZhbHVlKGNvbnN0IFZhbHVlICpWLCBNVlQgVlQpOworCisgIC8vLyBoYXNUcml2aWFsS2lsbCAtIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaGFzIGV4YWN0bHkgb25lIHVzZS4KKyAgYm9vbCBoYXNUcml2aWFsS2lsbChjb25zdCBWYWx1ZSAqVikgY29uc3Q7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vRnVuY3Rpb25Mb3dlcmluZ0luZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Z1bmN0aW9uTG93ZXJpbmdJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1OTc5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Z1bmN0aW9uTG93ZXJpbmdJbmZvLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8vPT09LS0gRnVuY3Rpb25Mb3dlcmluZ0luZm8uaCAtIExvd2VyIGZ1bmN0aW9ucyBmcm9tIExMVk0gSVIgdG8gQ29kZUdlbiAtLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIHJvdXRpbmVzIGZvciB0cmFuc2xhdGluZyBmdW5jdGlvbnMgZnJvbSBMTFZNIElSIGludG8KKy8vIE1hY2hpbmUgSVIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fRlVOQ1RJT05MT1dFUklOR0lORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fRlVOQ1RJT05MT1dFUklOR0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2VuZGlmCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGxvY2FJbnN0OworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBUYXJnZXRMb3dlcmluZzsKK2NsYXNzIFZhbHVlOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGdW5jdGlvbkxvd2VyaW5nSW5mbyAtIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24gdGhhdCBpcyBnbG9iYWwgdG8gYQorLy8vIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIGxvd2VyaW5nIGEgcmVnaW9uIG9mIHRoZSBmdW5jdGlvbi4KKy8vLworY2xhc3MgRnVuY3Rpb25Mb3dlcmluZ0luZm8geworcHVibGljOgorICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJOworICBjb25zdCBGdW5jdGlvbiAqRm47CisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gKlJlZ0luZm87CisKKyAgLy8vIENhbkxvd2VyUmV0dXJuIC0gdHJ1ZSBpZmYgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGNhbiBiZSBsb3dlcmVkIHRvCisgIC8vLyByZWdpc3RlcnMuCisgIGJvb2wgQ2FuTG93ZXJSZXR1cm47CisKKyAgLy8vIERlbW90ZVJlZ2lzdGVyIC0gaWYgQ2FuTG93ZXJSZXR1cm4gaXMgZmFsc2UsIERlbW90ZVJlZ2lzdGVyIGlzIGEgdnJlZworICAvLy8gYWxsb2NhdGVkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBoaWRkZW4gc3JldCBwYXJhbWV0ZXIuCisgIHVuc2lnbmVkIERlbW90ZVJlZ2lzdGVyOworCisgIC8vLyBNQkJNYXAgLSBBIG1hcHBpbmcgZnJvbSBMTFZNIGJhc2ljIGJsb2NrcyB0byB0aGVpciBtYWNoaW5lIGNvZGUgZW50cnkuCisgIERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sqLCBNYWNoaW5lQmFzaWNCbG9jayAqPiBNQkJNYXA7CisKKyAgLy8vIFZhbHVlTWFwIC0gU2luY2Ugd2UgZW1pdCBjb2RlIGZvciB0aGUgZnVuY3Rpb24gYSBiYXNpYyBibG9jayBhdCBhIHRpbWUsCisgIC8vLyB3ZSBtdXN0IHJlbWVtYmVyIHdoaWNoIHZpcnR1YWwgcmVnaXN0ZXJzIGhvbGQgdGhlIHZhbHVlcyBmb3IKKyAgLy8vIGNyb3NzLWJhc2ljLWJsb2NrIHZhbHVlcy4KKyAgRGVuc2VNYXA8Y29uc3QgVmFsdWUqLCB1bnNpZ25lZD4gVmFsdWVNYXA7CisKKyAgLy8vIFN0YXRpY0FsbG9jYU1hcCAtIEtlZXAgdHJhY2sgb2YgZnJhbWUgaW5kaWNlcyBmb3IgZml4ZWQgc2l6ZWQgYWxsb2NhcyBpbgorICAvLy8gdGhlIGVudHJ5IGJsb2NrLiAgVGhpcyBhbGxvd3MgdGhlIGFsbG9jYXMgdG8gYmUgZWZmaWNpZW50bHkgcmVmZXJlbmNlZAorICAvLy8gYW55d2hlcmUgaW4gdGhlIGZ1bmN0aW9uLgorICBEZW5zZU1hcDxjb25zdCBBbGxvY2FJbnN0KiwgaW50PiBTdGF0aWNBbGxvY2FNYXA7CisKKyAgLy8vIEFyZ0RiZ1ZhbHVlcyAtIEEgbGlzdCBvZiBEQkdfVkFMVUUgaW5zdHJ1Y3Rpb25zIGNyZWF0ZWQgZHVyaW5nIGlzZWwgZm9yCisgIC8vLyBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBhcmUgaW5zZXJ0ZWQgYWZ0ZXIgc2NoZWR1bGluZyBpcyBjb21wbGV0ZWQuCisgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDg+IEFyZ0RiZ1ZhbHVlczsKKworICAvLy8gUmVnRml4dXBzIC0gUmVnaXN0ZXJzIHdoaWNoIG5lZWQgdG8gYmUgcmVwbGFjZWQgYWZ0ZXIgaXNlbCBpcyBkb25lLgorICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+IFJlZ0ZpeHVwczsKKworICAvLy8gTUJCIC0gVGhlIGN1cnJlbnQgYmxvY2suCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkI7CisKKyAgLy8vIE1CQiAtIFRoZSBjdXJyZW50IGluc2VydCBwb3NpdGlvbiBpbnNpZGUgdGhlIGN1cnJlbnQgYmxvY2suCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdDsKKworI2lmbmRlZiBOREVCVUcKKyAgU21hbGxTZXQ8Y29uc3QgSW5zdHJ1Y3Rpb24gKiwgOD4gQ2F0Y2hJbmZvTG9zdDsKKyAgU21hbGxTZXQ8Y29uc3QgSW5zdHJ1Y3Rpb24gKiwgOD4gQ2F0Y2hJbmZvRm91bmQ7CisjZW5kaWYKKworICBzdHJ1Y3QgTGl2ZU91dEluZm8geworICAgIHVuc2lnbmVkIE51bVNpZ25CaXRzOworICAgIEFQSW50IEtub3duT25lLCBLbm93blplcm87CisgICAgTGl2ZU91dEluZm8oKSA6IE51bVNpZ25CaXRzKDApLCBLbm93bk9uZSgxLCAwKSwgS25vd25aZXJvKDEsIDApIHt9CisgIH07CisgIAorICAvLy8gTGl2ZU91dFJlZ0luZm8gLSBJbmZvcm1hdGlvbiBhYm91dCBsaXZlIG91dCB2cmVncywgaW5kZXhlZCBieSB0aGVpcgorICAvLy8gcmVnaXN0ZXIgbnVtYmVyIG9mZnNldCBieSAnRmlyc3RWaXJ0dWFsUmVnaXN0ZXInLgorICBzdGQ6OnZlY3RvcjxMaXZlT3V0SW5mbz4gTGl2ZU91dFJlZ0luZm87CisKKyAgLy8vIFBISU5vZGVzVG9VcGRhdGUgLSBBIGxpc3Qgb2YgcGhpIGluc3RydWN0aW9ucyB3aG9zZSBvcGVyYW5kIGxpc3Qgd2lsbAorICAvLy8gYmUgdXBkYXRlZCBhZnRlciBwcm9jZXNzaW5nIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrLgorICAvLy8gVE9ETzogVGhpcyBpc24ndCBwZXItZnVuY3Rpb24gc3RhdGUsIGl0J3MgcGVyLWJhc2ljLWJsb2NrIHN0YXRlLiBCdXQKKyAgLy8vIHRoZXJlJ3Mgbm8gb3RoZXIgY29udmVuaWVudCBwbGFjZSBmb3IgaXQgdG8gbGl2ZSByaWdodCBub3cuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD4gPiBQSElOb2Rlc1RvVXBkYXRlOworCisgIGV4cGxpY2l0IEZ1bmN0aW9uTG93ZXJpbmdJbmZvKGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpOworCisgIC8vLyBzZXQgLSBJbml0aWFsaXplIHRoaXMgRnVuY3Rpb25Mb3dlcmluZ0luZm8gd2l0aCB0aGUgZ2l2ZW4gRnVuY3Rpb24KKyAgLy8vIGFuZCBpdHMgYXNzb2NpYXRlZCBNYWNoaW5lRnVuY3Rpb24uCisgIC8vLworICB2b2lkIHNldChjb25zdCBGdW5jdGlvbiAmRm4sIE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisgIC8vLyBjbGVhciAtIENsZWFyIG91dCBhbGwgdGhlIGZ1bmN0aW9uLXNwZWNpZmljIHN0YXRlLiBUaGlzIHJldHVybnMgdGhpcworICAvLy8gRnVuY3Rpb25Mb3dlcmluZ0luZm8gdG8gYW4gZW1wdHkgc3RhdGUsIHJlYWR5IHRvIGJlIHVzZWQgZm9yIGEKKyAgLy8vIGRpZmZlcmVudCBmdW5jdGlvbi4KKyAgdm9pZCBjbGVhcigpOworCisgIC8vLyBpc0V4cG9ydGVkSW5zdCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gaW5zdHJ1Y3Rpb24KKyAgLy8vIGV4cG9ydGVkIGZyb20gaXRzIGJsb2NrLgorICBib29sIGlzRXhwb3J0ZWRJbnN0KGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFZhbHVlTWFwLmNvdW50KFYpOworICB9CisKKyAgdW5zaWduZWQgQ3JlYXRlUmVnKEVWVCBWVCk7CisgIAorICB1bnNpZ25lZCBDcmVhdGVSZWdzKGNvbnN0IFR5cGUgKlR5KTsKKyAgCisgIHVuc2lnbmVkIEluaXRpYWxpemVSZWdGb3JWYWx1ZShjb25zdCBWYWx1ZSAqVikgeworICAgIHVuc2lnbmVkICZSID0gVmFsdWVNYXBbVl07CisgICAgYXNzZXJ0KFIgPT0gMCAmJiAiQWxyZWFkeSBpbml0aWFsaXplZCB0aGlzIHZhbHVlIHJlZ2lzdGVyISIpOworICAgIHJldHVybiBSID0gQ3JlYXRlUmVncyhWLT5nZXRUeXBlKCkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDTWV0YWRhdGEuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDTWV0YWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDAxMDY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NNZXRhZGF0YS5oCkBAIC0wLDAgKzEsMTkwIEBACisvLz09PS0tIEdDTWV0YWRhdGEuaCAtIEdhcmJhZ2UgY29sbGVjdG9yIG1ldGFkYXRhIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgR0NGdW5jdGlvbkluZm8gYW5kIEdDTW9kdWxlSW5mbyBjbGFzc2VzLCB3aGljaCBhcmUKKy8vIHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgZnJvbSB0aGUgdGFyZ2V0IGNvZGUgZ2VuZXJhdG9yIHRvIHRoZSB0YXJnZXQKKy8vIGdhcmJhZ2UgY29sbGVjdG9ycy4gVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGNvZGUgZ2VuZXJhdG9ycyBhbmQgZ2FyYmFnZQorLy8gY29sbGVjdG9ycyB0byBiZSBkZXZlbG9wZWQgaW5kZXBlbmRlbnRseS4KKy8vCisvLyBUaGUgR0NGdW5jdGlvbkluZm8gY2xhc3MgbG9ncyB0aGUgZGF0YSBuZWNlc3NhcnkgdG8gYnVpbGQgYSB0eXBlIGFjY3VyYXRlCisvLyBzdGFjayBtYXAuIFRoZSBjb2RlIGdlbmVyYXRvciBvdXRwdXRzOgorLy8KKy8vICAgLSBTYWZlIHBvaW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEdDU3RyYXRlZ3kncyBOZWVkZWRTYWZlUG9pbnRzLgorLy8gICAtIFN0YWNrIG9mZnNldHMgZm9yIEdDIHJvb3RzLCBhcyBzcGVjaWZpZWQgYnkgY2FsbHMgdG8gbGx2bS5nY3Jvb3QKKy8vCisvLyBBcyBhIHJlZmluZW1lbnQsIGxpdmVuZXNzIGFuYWx5c2lzIGNhbGN1bGF0ZXMgdGhlIHNldCBvZiBsaXZlIHJvb3RzIGF0IGVhY2gKKy8vIHNhZmUgcG9pbnQuIExpdmVuZXNzIGFuYWx5c2lzIGlzIG5vdCBwcmVzZW50bHkgcGVyZm9ybWVkIGJ5IHRoZSBjb2RlCisvLyBnZW5lcmF0b3IsIHNvIGFsbCByb290cyBhcmUgYXNzdW1lZCBsaXZlLgorLy8KKy8vIEdDTW9kdWxlSW5mbyBzaW1wbHkgY29sbGVjdHMgR0NGdW5jdGlvbkluZm8gaW5zdGFuY2VzIGZvciBlYWNoIEZ1bmN0aW9uIGFzCisvLyB0aGV5IGFyZSBjb21waWxlZC4gVGhpcyBhY2NyZXRpb24gaXMgbmVjZXNzYXJ5IGZvciBjb2xsZWN0b3JzIHdoaWNoIG11c3QgZW1pdAorLy8gYSBzdGFjayBtYXAgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGFzIGEgd2hvbGUuIFRoZXJlZm9yZSwgR0NGdW5jdGlvbkluZm8KKy8vIG91dGxpdmVzIHRoZSBNYWNoaW5lRnVuY3Rpb24gZnJvbSB3aGljaCBpdCBpcyBkZXJpdmVkIGFuZCBtdXN0IG5vdCByZWZlciB0bworLy8gYW55IGNvZGUgZ2VuZXJhdG9yIGRhdGEgc3RydWN0dXJlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HQ01FVEFEQVRBX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dDTUVUQURBVEFfSAorCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBc21QcmludGVyOworICBjbGFzcyBHQ1N0cmF0ZWd5OworICBjbGFzcyBDb25zdGFudDsKKyAgY2xhc3MgTUNTeW1ib2w7CisKKyAgbmFtZXNwYWNlIEdDIHsKKyAgICAvLy8gUG9pbnRLaW5kIC0gVGhlIHR5cGUgb2YgYSBjb2xsZWN0b3Itc2FmZSBwb2ludC4KKyAgICAvLy8KKyAgICBlbnVtIFBvaW50S2luZCB7CisgICAgICBMb29wLCAgICAvLzwgSW5zdHIgaXMgYSBsb29wIChiYWNrd2FyZHMgYnJhbmNoKS4KKyAgICAgIFJldHVybiwgIC8vPCBJbnN0ciBpcyBhIHJldHVybiBpbnN0cnVjdGlvbi4KKyAgICAgIFByZUNhbGwsIC8vPCBJbnN0ciBpcyBhIGNhbGwgaW5zdHJ1Y3Rpb24uCisgICAgICBQb3N0Q2FsbCAvLzwgSW5zdHIgaXMgdGhlIHJldHVybiBhZGRyZXNzIG9mIGEgY2FsbC4KKyAgICB9OworICB9CisKKyAgLy8vIEdDUG9pbnQgLSBNZXRhZGF0YSBmb3IgYSBjb2xsZWN0b3Itc2FmZSBwb2ludCBpbiBtYWNoaW5lIGNvZGUuCisgIC8vLworICBzdHJ1Y3QgR0NQb2ludCB7CisgICAgR0M6OlBvaW50S2luZCBLaW5kOyAvLzwgVGhlIGtpbmQgb2YgdGhlIHNhZmUgcG9pbnQuCisgICAgTUNTeW1ib2wgKkxhYmVsOyAgICAvLzwgQSBsYWJlbC4KKworICAgIEdDUG9pbnQoR0M6OlBvaW50S2luZCBLLCBNQ1N5bWJvbCAqTCkgOiBLaW5kKEspLCBMYWJlbChMKSB7fQorICB9OworCisgIC8vLyBHQ1Jvb3QgLSBNZXRhZGF0YSBmb3IgYSBwb2ludGVyIHRvIGFuIG9iamVjdCBtYW5hZ2VkIGJ5IHRoZSBnYXJiYWdlCisgIC8vLyBjb2xsZWN0b3IuCisgIHN0cnVjdCBHQ1Jvb3QgeworICAgIGludCBOdW07ICAgICAgICAgICAgLy88IFVzdWFsbHkgYSBmcmFtZSBpbmRleC4KKyAgICBpbnQgU3RhY2tPZmZzZXQ7ICAgIC8vPCBPZmZzZXQgZnJvbSB0aGUgc3RhY2sgcG9pbnRlci4KKyAgICBjb25zdCBDb25zdGFudCAqTWV0YWRhdGE7Ly88IE1ldGFkYXRhIHN0cmFpZ2h0IGZyb20gdGhlIGNhbGwgdG8gbGx2bS5nY3Jvb3QuCisKKyAgICBHQ1Jvb3QoaW50IE4sIGNvbnN0IENvbnN0YW50ICpNRCkgOiBOdW0oTiksIFN0YWNrT2Zmc2V0KC0xKSwgTWV0YWRhdGEoTUQpIHt9CisgIH07CisKKworICAvLy8gR0NGdW5jdGlvbkluZm8gLSBHYXJiYWdlIGNvbGxlY3Rpb24gbWV0YWRhdGEgZm9yIGEgc2luZ2xlIGZ1bmN0aW9uLgorICAvLy8KKyAgY2xhc3MgR0NGdW5jdGlvbkluZm8geworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxHQ1BvaW50Pjo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxHQ1Jvb3Q+OjppdGVyYXRvciByb290c19pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEdDUm9vdD46OmNvbnN0X2l0ZXJhdG9yIGxpdmVfaXRlcmF0b3I7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBGdW5jdGlvbiAmRjsKKyAgICBHQ1N0cmF0ZWd5ICZTOworICAgIHVpbnQ2NF90IEZyYW1lU2l6ZTsKKyAgICBzdGQ6OnZlY3RvcjxHQ1Jvb3Q+IFJvb3RzOworICAgIHN0ZDo6dmVjdG9yPEdDUG9pbnQ+IFNhZmVQb2ludHM7CisKKyAgICAvLyBGSVhNRTogTGl2ZW5lc3MuIEEgMkQgQml0VmVjdG9yLCBwZXJoYXBzPworICAgIC8vCisgICAgLy8gICBCaXRWZWN0b3IgTGl2ZW5lc3M7CisgICAgLy8KKyAgICAvLyAgIGJvb2wgaXNsaXZlKGludCBwb2ludCwgaW50IHJvb3QpID0KKyAgICAvLyAgICAgTGl2ZW5lc3NbcG9pbnQgKiBTYWZlUG9pbnRzLnNpemUoKSArIHJvb3RdCisgICAgLy8KKyAgICAvLyBUaGUgYml0IHZlY3RvciBpcyB0aGUgbW9yZSBjb21wYWN0IHJlcHJlc2VudGF0aW9uIHdoZXJlID4zLjIlIG9mIHJvb3RzCisgICAgLy8gYXJlIGxpdmUgcGVyIHNhZmUgcG9pbnQgKDEuNSUgb24gNjQtYml0IGhvc3RzKS4KKworICBwdWJsaWM6CisgICAgR0NGdW5jdGlvbkluZm8oY29uc3QgRnVuY3Rpb24gJkYsIEdDU3RyYXRlZ3kgJlMpOworICAgIH5HQ0Z1bmN0aW9uSW5mbygpOworCisgICAgLy8vIGdldEZ1bmN0aW9uIC0gUmV0dXJuIHRoZSBmdW5jdGlvbiB0byB3aGljaCB0aGlzIG1ldGFkYXRhIGFwcGxpZXMuCisgICAgLy8vCisgICAgY29uc3QgRnVuY3Rpb24gJmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gRjsgfQorCisgICAgLy8vIGdldFN0cmF0ZWd5IC0gUmV0dXJuIHRoZSBHQyBzdHJhdGVneSBmb3IgdGhlIGZ1bmN0aW9uLgorICAgIC8vLworICAgIEdDU3RyYXRlZ3kgJmdldFN0cmF0ZWd5KCkgeyByZXR1cm4gUzsgfQorCisgICAgLy8vIGFkZFN0YWNrUm9vdCAtIFJlZ2lzdGVycyBhIHJvb3QgdGhhdCBsaXZlcyBvbiB0aGUgc3RhY2suIE51bSBpcyB0aGUKKyAgICAvLy8gICAgICAgICAgICAgICAgc3RhY2sgb2JqZWN0IElEIGZvciB0aGUgYWxsb2NhIChpZiB0aGUgY29kZSBnZW5lcmF0b3IgaXMKKyAgICAvLyAgICAgICAgICAgICAgICAgdXNpbmcgIE1hY2hpbmVGcmFtZUluZm8pLgorICAgIHZvaWQgYWRkU3RhY2tSb290KGludCBOdW0sIGNvbnN0IENvbnN0YW50ICpNZXRhZGF0YSkgeworICAgICAgUm9vdHMucHVzaF9iYWNrKEdDUm9vdChOdW0sIE1ldGFkYXRhKSk7CisgICAgfQorCisgICAgLy8vIGFkZFNhZmVQb2ludCAtIE5vdGVzIHRoZSBleGlzdGVuY2Ugb2YgYSBzYWZlIHBvaW50LiBOdW0gaXMgdGhlIElEIG9mIHRoZQorICAgIC8vLyBsYWJlbCBqdXN0IHByaW9yIHRvIHRoZSBzYWZlIHBvaW50IChpZiB0aGUgY29kZSBnZW5lcmF0b3IgaXMgdXNpbmcKKyAgICAvLy8gTWFjaGluZU1vZHVsZUluZm8pLgorICAgIHZvaWQgYWRkU2FmZVBvaW50KEdDOjpQb2ludEtpbmQgS2luZCwgTUNTeW1ib2wgKkxhYmVsKSB7CisgICAgICBTYWZlUG9pbnRzLnB1c2hfYmFjayhHQ1BvaW50KEtpbmQsIExhYmVsKSk7CisgICAgfQorCisgICAgLy8vIGdldEZyYW1lU2l6ZS9zZXRGcmFtZVNpemUgLSBSZWNvcmRzIHRoZSBmdW5jdGlvbidzIGZyYW1lIHNpemUuCisgICAgLy8vCisgICAgdWludDY0X3QgZ2V0RnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gRnJhbWVTaXplOyB9CisgICAgdm9pZCBzZXRGcmFtZVNpemUodWludDY0X3QgUykgeyBGcmFtZVNpemUgPSBTOyB9CisKKyAgICAvLy8gYmVnaW4vZW5kIC0gSXRlcmF0b3JzIGZvciBzYWZlIHBvaW50cy4KKyAgICAvLy8KKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIFNhZmVQb2ludHMuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gU2FmZVBvaW50cy5lbmQoKTsgICB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBTYWZlUG9pbnRzLnNpemUoKTsgfQorCisgICAgLy8vIHJvb3RzX2JlZ2luL3Jvb3RzX2VuZCAtIEl0ZXJhdG9ycyBmb3IgYWxsIHJvb3RzIGluIHRoZSBmdW5jdGlvbi4KKyAgICAvLy8KKyAgICByb290c19pdGVyYXRvciByb290c19iZWdpbigpIHsgcmV0dXJuIFJvb3RzLmJlZ2luKCk7IH0KKyAgICByb290c19pdGVyYXRvciByb290c19lbmQgICgpIHsgcmV0dXJuIFJvb3RzLmVuZCgpOyAgIH0KKyAgICBzaXplX3Qgcm9vdHNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJvb3RzLnNpemUoKTsgfQorCisgICAgLy8vIGxpdmVfYmVnaW4vbGl2ZV9lbmQgLSBJdGVyYXRvcnMgZm9yIGxpdmUgcm9vdHMgYXQgYSBnaXZlbiBzYWZlIHBvaW50LgorICAgIC8vLworICAgIGxpdmVfaXRlcmF0b3IgbGl2ZV9iZWdpbihjb25zdCBpdGVyYXRvciAmcCkgeyByZXR1cm4gcm9vdHNfYmVnaW4oKTsgfQorICAgIGxpdmVfaXRlcmF0b3IgbGl2ZV9lbmQgIChjb25zdCBpdGVyYXRvciAmcCkgeyByZXR1cm4gcm9vdHNfZW5kKCk7ICAgfQorICAgIHNpemVfdCBsaXZlX3NpemUoY29uc3QgaXRlcmF0b3IgJnApIGNvbnN0IHsgcmV0dXJuIHJvb3RzX3NpemUoKTsgfQorICB9OworCisKKyAgLy8vIEdDTW9kdWxlSW5mbyAtIEdhcmJhZ2UgY29sbGVjdGlvbiBtZXRhZGF0YSBmb3IgYSB3aG9sZSBtb2R1bGUuCisgIC8vLworICBjbGFzcyBHQ01vZHVsZUluZm8gOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgICAgdHlwZWRlZiBTdHJpbmdNYXA8R0NTdHJhdGVneSo+IHN0cmF0ZWd5X21hcF90eXBlOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8R0NTdHJhdGVneSo+IGxpc3RfdHlwZTsKKyAgICB0eXBlZGVmIERlbnNlTWFwPGNvbnN0IEZ1bmN0aW9uKixHQ0Z1bmN0aW9uSW5mbyo+IGZpbmZvX21hcF90eXBlOworCisgICAgc3RyYXRlZ3lfbWFwX3R5cGUgU3RyYXRlZ3lNYXA7CisgICAgbGlzdF90eXBlIFN0cmF0ZWd5TGlzdDsKKyAgICBmaW5mb19tYXBfdHlwZSBGSW5mb01hcDsKKworICAgIEdDU3RyYXRlZ3kgKmdldE9yQ3JlYXRlU3RyYXRlZ3koY29uc3QgTW9kdWxlICpNLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSk7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgbGlzdF90eXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKworICAgIHN0YXRpYyBjaGFyIElEOworCisgICAgR0NNb2R1bGVJbmZvKCk7CisgICAgfkdDTW9kdWxlSW5mbygpOworCisgICAgLy8vIGNsZWFyIC0gUmVzZXRzIHRoZSBwYXNzLiBUaGUgbWV0YWRhdGEgZGVsZXRlciBwYXNzIGNhbGxzIHRoaXMuCisgICAgLy8vCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLy8vIGJlZ2luL2VuZCAtIEl0ZXJhdG9ycyBmb3IgdXNlZCBzdHJhdGVnaWVzLgorICAgIC8vLworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gU3RyYXRlZ3lMaXN0LmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIFN0cmF0ZWd5TGlzdC5lbmQoKTsgICB9CisKKyAgICAvLy8gZ2V0IC0gTG9vayB1cCBmdW5jdGlvbiBtZXRhZGF0YS4KKyAgICAvLy8KKyAgICBHQ0Z1bmN0aW9uSW5mbyAmZ2V0RnVuY3Rpb25JbmZvKGNvbnN0IEZ1bmN0aW9uICZGKTsKKyAgfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDTWV0YWRhdGFQcmludGVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ01ldGFkYXRhUHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTI2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ01ldGFkYXRhUHJpbnRlci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL0dDTWV0YWRhdGFQcmludGVyLmggLSBQcmludHMgYXNtIEdDIHRhYmxlcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgR0NNZXRhZGF0YVByaW50ZXIgc3VwcG9ydHMgd3JpdGluZyBHQyBtZXRhZGF0YSB0YWJsZXMKKy8vIGFzIGFzc2VtYmx5IGNvZGUuIFRoaXMgaXMgYSBzZXBhcmF0ZSBjbGFzcyBmcm9tIEdDU3RyYXRlZ3kgaW4gb3JkZXIgdG8gYWxsb3cKKy8vIHVzZXJzIG9mIHRoZSBMTFZNIEpJVCB0byBhdm9pZCBsaW5raW5nIHdpdGggdGhlIEFzbVdyaXRlci4KKy8vCisvLyBTdWJjbGFzc2VzIG9mIEdDTWV0YWRhdGFQcmludGVyIG11c3QgYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUKKy8vIEdDTWV0YWRhdGFQcmludGVyUmVnaXN0cnkuIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgR0NTdHJhdGVneSBpdHNlbGYKKy8vIGJlY2F1c2UgdGhlc2Ugc3ViY2xhc3NlcyBhcmUgbG9naWNhbGx5IHBsdWdpbnMgZm9yIHRoZSBBc21Xcml0ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0NNRVRBREFUQVBSSU5URVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0NNRVRBREFUQVBSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dDTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR0NTdHJhdGVneS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWdpc3RyeS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgR0NNZXRhZGF0YVByaW50ZXI7CisKKyAgLy8vIEdDTWV0YWRhdGFQcmludGVyUmVnaXN0cnkgLSBUaGUgR0MgYXNzZW1ibHkgcHJpbnRlciByZWdpc3RyeSB1c2VzIGFsbCB0aGUKKyAgLy8vIGRlZmF1bHRzIGZyb20gUmVnaXN0cnkuCisgIHR5cGVkZWYgUmVnaXN0cnk8R0NNZXRhZGF0YVByaW50ZXI+IEdDTWV0YWRhdGFQcmludGVyUmVnaXN0cnk7CisKKyAgLy8vIEdDTWV0YWRhdGFQcmludGVyIC0gRW1pdHMgR0MgbWV0YWRhdGEgYXMgYXNzZW1ibHkgY29kZS4KKyAgLy8vCisgIGNsYXNzIEdDTWV0YWRhdGFQcmludGVyIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgR0NTdHJhdGVneTo6bGlzdF90eXBlIGxpc3RfdHlwZTsKKyAgICB0eXBlZGVmIEdDU3RyYXRlZ3k6Oml0ZXJhdG9yIGl0ZXJhdG9yOworCisgIHByaXZhdGU6CisgICAgR0NTdHJhdGVneSAqUzsKKworICAgIGZyaWVuZCBjbGFzcyBBc21QcmludGVyOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBNYXkgb25seSBiZSBzdWJjbGFzc2VkLgorICAgIEdDTWV0YWRhdGFQcmludGVyKCk7CisKKyAgICAvLyBEbyBub3QgaW1wbGVtZW50LgorICAgIEdDTWV0YWRhdGFQcmludGVyKGNvbnN0IEdDTWV0YWRhdGFQcmludGVyICYpOworICAgIEdDTWV0YWRhdGFQcmludGVyICZvcGVyYXRvcj0oY29uc3QgR0NNZXRhZGF0YVByaW50ZXIgJik7CisKKyAgcHVibGljOgorICAgIEdDU3RyYXRlZ3kgJmdldFN0cmF0ZWd5KCkgeyByZXR1cm4gKlM7IH0KKyAgICBjb25zdCBNb2R1bGUgJmdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIFMtPmdldE1vZHVsZSgpOyB9CisKKyAgICAvLy8gYmVnaW4vZW5kIC0gSXRlcmF0ZSBvdmVyIHRoZSBjb2xsZWN0ZWQgZnVuY3Rpb24gbWV0YWRhdGEuCisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBTLT5iZWdpbigpOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiBTLT5lbmQoKTsgICB9CisKKyAgICAvLy8gYmVnaW5Bc3NlbWJseS9maW5pc2hBc3NlbWJseSAtIEVtaXQgbW9kdWxlIG1ldGFkYXRhIGFzIGFzc2VtYmx5IGNvZGUuCisgICAgdmlydHVhbCB2b2lkIGJlZ2luQXNzZW1ibHkoQXNtUHJpbnRlciAmQVApOworCisgICAgdmlydHVhbCB2b2lkIGZpbmlzaEFzc2VtYmx5KEFzbVByaW50ZXIgJkFQKTsKKworICAgIHZpcnR1YWwgfkdDTWV0YWRhdGFQcmludGVyKCk7CisgIH07CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ1N0cmF0ZWd5LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ1N0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlZDE5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDU3RyYXRlZ3kuaApAQCAtMCwwICsxLDE0MSBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vR0NTdHJhdGVneS5oIC0gR2FyYmFnZSBjb2xsZWN0aW9uIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBHQ1N0cmF0ZWd5IGNvb3JkaW5hdGVzIGNvZGUgZ2VuZXJhdGlvbiBhbGdvcml0aG1zIGFuZCBpbXBsZW1lbnRzIHNvbWUgaXRzZWxmCisvLyBpbiBvcmRlciB0byBnZW5lcmF0ZSBjb2RlIGNvbXBhdGlibGUgd2l0aCBhIHRhcmdldCBjb2RlIGdlbmVyYXRvciBhcworLy8gc3BlY2lmaWVkIGluIGEgZnVuY3Rpb24ncyAnZ2MnIGF0dHJpYnV0ZS4gQWxnb3JpdGhtcyBhcmUgZW5hYmxlZCBieSBzZXR0aW5nCisvLyBmbGFncyBpbiBhIHN1YmNsYXNzJ3MgY29uc3RydWN0b3IsIGFuZCBzb21lIHZpcnR1YWwgbWV0aG9kcyBjYW4gYmUKKy8vIG92ZXJyaWRkZW4uCisvLyAKKy8vIFdoZW4gcmVxdWVzdGVkLCB0aGUgR0NTdHJhdGVneSB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGRhdGEgYWJvdXQgZWFjaAorLy8gZnVuY3Rpb24gd2hpY2ggdXNlcyBpdC4gU3BlY2lmaWNhbGx5OgorLy8gCisvLyAtIFNhZmUgcG9pbnRzCisvLyAgIEdhcmJhZ2UgY29sbGVjdGlvbiBpcyBnZW5lcmFsbHkgb25seSBwb3NzaWJsZSBhdCBjZXJ0YWluIHBvaW50cyBpbiBjb2RlLgorLy8gICBHQ1N0cmF0ZWd5IGNhbiByZXF1ZXN0IHRoYXQgdGhlIGNvbGxlY3RvciBpbnNlcnQgc3VjaCBwb2ludHM6CisvLworLy8gICAgIC0gQXQgYW5kIGFmdGVyIGFueSBjYWxsIHRvIGEgc3Vicm91dGluZQorLy8gICAgIC0gQmVmb3JlIHJldHVybmluZyBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uCisvLyAgICAgLSBCZWZvcmUgYmFja3dhcmRzIGJyYW5jaGVzIChsb29wcykKKy8vIAorLy8gLSBSb290cworLy8gICBXaGVuIGEgcmVmZXJlbmNlIHRvIGEgR0MtYWxsb2NhdGVkIG9iamVjdCBleGlzdHMgb24gdGhlIHN0YWNrLCBpdCBtdXN0IGJlCisvLyAgIHN0b3JlZCBpbiBhbiBhbGxvY2EgcmVnaXN0ZXJlZCB3aXRoIGxsdm0uZ2Nvb3QuCisvLworLy8gVGhpcyBpbmZvcm1hdGlvbiBjYW4gdXNlZCB0byBlbWl0IHRoZSBtZXRhZGF0YSB0YWJsZXMgd2hpY2ggYXJlIHJlcXVpcmVkIGJ5CisvLyB0aGUgdGFyZ2V0IGdhcmJhZ2UgY29sbGVjdG9yIHJ1bnRpbWUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0NTVFJBVEVHWV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HQ1NUUkFURUdZX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HQ01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlZ2lzdHJ5LmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisgIAorICBjbGFzcyBHQ1N0cmF0ZWd5OworICAKKyAgLy8vIFRoZSBHQyBzdHJhdGVneSByZWdpc3RyeSB1c2VzIGFsbCB0aGUgZGVmYXVsdHMgZnJvbSBSZWdpc3RyeS4KKyAgLy8vIAorICB0eXBlZGVmIFJlZ2lzdHJ5PEdDU3RyYXRlZ3k+IEdDUmVnaXN0cnk7CisgIAorICAvLy8gR0NTdHJhdGVneSBkZXNjcmliZXMgYSBnYXJiYWdlIGNvbGxlY3RvciBhbGdvcml0aG0ncyBjb2RlIGdlbmVyYXRpb24KKyAgLy8vIHJlcXVpcmVtZW50cywgYW5kIHByb3ZpZGVzIG92ZXJyaWRhYmxlIGhvb2tzIGZvciB0aG9zZSBuZWVkcyB3aGljaCBjYW5ub3QKKyAgLy8vIGJlIGFic3RyYWN0bHkgZGVzY3JpYmVkLgorICBjbGFzcyBHQ1N0cmF0ZWd5IHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8R0NGdW5jdGlvbkluZm8qPiBsaXN0X3R5cGU7CisgICAgdHlwZWRlZiBsaXN0X3R5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgIAorICBwcml2YXRlOgorICAgIGNvbnN0IE1vZHVsZSAqTTsKKyAgICBzdGQ6OnN0cmluZyBOYW1lOworICAgIAorICAgIGxpc3RfdHlwZSBGdW5jdGlvbnM7CisgICAgCisgIHByb3RlY3RlZDoKKyAgICB1bnNpZ25lZCBOZWVkZWRTYWZlUG9pbnRzOyAvLzwgQml0bWFzayBvZiByZXF1aXJlZCBzYWZlIHBvaW50cy4KKyAgICBib29sIEN1c3RvbVJlYWRCYXJyaWVyczsgICAvLzwgRGVmYXVsdCBpcyB0byBpbnNlcnQgbG9hZHMuCisgICAgYm9vbCBDdXN0b21Xcml0ZUJhcnJpZXJzOyAgLy88IERlZmF1bHQgaXMgdG8gaW5zZXJ0IHN0b3Jlcy4KKyAgICBib29sIEN1c3RvbVJvb3RzOyAgICAgICAgICAvLzwgRGVmYXVsdCBpcyB0byBwYXNzIHRocm91Z2ggdG8gYmFja2VuZC4KKyAgICBib29sIEluaXRSb290czsgICAgICAgICAgICAvLzwgSWYgc2V0LCByb290cyBhcmUgbnVsbGVkIGR1cmluZyBsb3dlcmluZy4KKyAgICBib29sIFVzZXNNZXRhZGF0YTsgICAgICAgICAvLzwgSWYgc2V0LCBiYWNrZW5kIG11c3QgZW1pdCBtZXRhZGF0YSB0YWJsZXMuCisgICAgCisgIHB1YmxpYzoKKyAgICBHQ1N0cmF0ZWd5KCk7CisgICAgCisgICAgdmlydHVhbCB+R0NTdHJhdGVneSgpOworICAgIAorICAgIAorICAgIC8vLyBnZXROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIEdDIHN0cmF0ZWd5LCBmb3IgZGVidWdnaW5nLgorICAgIC8vLyAKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAgIC8vLyBnZXRNb2R1bGUgLSBUaGUgbW9kdWxlIHdpdGhpbiB3aGljaCB0aGUgR0Mgc3RyYXRlZ3kgaXMgb3BlcmF0aW5nLgorICAgIC8vLyAKKyAgICBjb25zdCBNb2R1bGUgJmdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuICpNOyB9CisKKyAgICAvLy8gbmVlZHNTYWZlUG9pdG5zIC0gVHJ1ZSBpZiBzYWZlIHBvaW50cyBvZiBhbnkga2luZCBhcmUgcmVxdWlyZWQuIEJ5CisgICAgLy8gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQsIG5vbmUgYXJlIHJlY29yZGVkLgorICAgIGJvb2wgbmVlZHNTYWZlUG9pbnRzKCkgY29uc3QgeyByZXR1cm4gTmVlZGVkU2FmZVBvaW50cyAhPSAwOyB9CisgICAgCisgICAgLy8vIG5lZWRzU2FmZVBvaW50KEtpbmQpIC0gVHJ1ZSBpZiB0aGUgZ2l2ZW4ga2luZCBvZiBzYWZlIHBvaW50IGlzCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLiBCeSBkZWZhdWx0LCBub25lIGFyZSByZWNvcmRlZC4KKyAgICBib29sIG5lZWRzU2FmZVBvaW50KEdDOjpQb2ludEtpbmQgS2luZCkgY29uc3QgeworICAgICAgcmV0dXJuIChOZWVkZWRTYWZlUG9pbnRzICYgMSA8PCBLaW5kKSAhPSAwOworICAgIH0KKyAgICAKKyAgICAvLy8gY3VzdG9tV3JpdGVCYXJyaWVyIC0gQnkgZGVmYXVsdCwgd3JpdGUgYmFycmllcnMgYXJlIHJlcGxhY2VkIHdpdGggc2ltcGxlCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIGluc3RydWN0aW9ucy4gSWYgdHJ1ZSwgdGhlbgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtQ3VzdG9tTG93ZXJpbmcgbXVzdCBpbnN0ZWFkIGxvd2VyIHRoZW0uCisgICAgYm9vbCBjdXN0b21Xcml0ZUJhcnJpZXIoKSBjb25zdCB7IHJldHVybiBDdXN0b21Xcml0ZUJhcnJpZXJzOyB9CisgICAgCisgICAgLy8vIGN1c3RvbVJlYWRCYXJyaWVyIC0gQnkgZGVmYXVsdCwgcmVhZCBiYXJyaWVycyBhcmUgcmVwbGFjZWQgd2l0aCBzaW1wbGUKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICBsb2FkIGluc3RydWN0aW9ucy4gSWYgdHJ1ZSwgdGhlbgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1DdXN0b21Mb3dlcmluZyBtdXN0IGluc3RlYWQgbG93ZXIgdGhlbS4KKyAgICBib29sIGN1c3RvbVJlYWRCYXJyaWVyKCkgY29uc3QgeyByZXR1cm4gQ3VzdG9tUmVhZEJhcnJpZXJzOyB9CisgICAgCisgICAgLy8vIGN1c3RvbVJvb3RzIC0gQnkgZGVmYXVsdCwgcm9vdHMgYXJlIGxlZnQgZm9yIHRoZSBjb2RlIGdlbmVyYXRvciBzbyBpdAorICAgIC8vLyAgICAgICAgICAgICAgIGNhbiBnZW5lcmF0ZSBhIHN0YWNrIG1hcC4gSWYgdHJ1ZSwgdGhlbgorICAgIC8vICAgICAgICAgICAgICAgIHBlcmZvcm1DdXN0b21Mb3dlcmluZyBtdXN0IGRlbGV0ZSB0aGVtLgorICAgIGJvb2wgY3VzdG9tUm9vdHMoKSBjb25zdCB7IHJldHVybiBDdXN0b21Sb290czsgfQorICAgIAorICAgIC8vLyBpbml0aWFsaXplUm9vdHMgLSBJZiBzZXQsIGdjcm9vdCBpbnRyaW5zaWNzIHNob3VsZCBpbml0aWFsaXplIHRoZWlyCisgICAgLy8gICAgICAgICAgICAgICAgICAgIGFsbG9jYXMgdG8gbnVsbCBiZWZvcmUgdGhlIGZpcnN0IHVzZS4gVGhpcyBpcworICAgIC8vICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcnkgZm9yIG1vc3QgR0NzIGFuZCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCisgICAgYm9vbCBpbml0aWFsaXplUm9vdHMoKSBjb25zdCB7IHJldHVybiBJbml0Um9vdHM7IH0KKyAgICAKKyAgICAvLy8gdXNlc01ldGFkYXRhIC0gSWYgc2V0LCBhcHByb3ByaWF0ZSBtZXRhZGF0YSB0YWJsZXMgbXVzdCBiZSBlbWl0dGVkIGJ5CisgICAgLy8vICAgICAgICAgICAgICAgIHRoZSBiYWNrLWVuZCAoYXNzZW1ibGVyLCBKSVQsIG9yIG90aGVyd2lzZSkuCisgICAgYm9vbCB1c2VzTWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBVc2VzTWV0YWRhdGE7IH0KKyAgICAKKyAgICAvLy8gYmVnaW4vZW5kIC0gSXRlcmF0b3JzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4KKyAgICAvLy8gCisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBGdW5jdGlvbnMuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gRnVuY3Rpb25zLmVuZCgpOyAgIH0KKworICAgIC8vLyBpbnNlcnRGdW5jdGlvbk1ldGFkYXRhIC0gQ3JlYXRlcyBtZXRhZGF0YSBmb3IgYSBmdW5jdGlvbi4KKyAgICAvLy8gCisgICAgR0NGdW5jdGlvbkluZm8gKmluc2VydEZ1bmN0aW9uSW5mbyhjb25zdCBGdW5jdGlvbiAmRik7CisKKyAgICAvLy8gaW5pdGlhbGl6ZUN1c3RvbUxvd2VyaW5nL3BlcmZvcm1DdXN0b21Mb3dlcmluZyAtIElmIGFueSBvZiB0aGUgYWN0aW9ucworICAgIC8vLyBhcmUgc2V0IHRvIGN1c3RvbSwgcGVyZm9ybUN1c3RvbUxvd2VyaW5nIG11c3QgYmUgb3ZlcnJpZGVuIHRvIHRyYW5zZm9ybQorICAgIC8vLyB0aGUgY29ycmVzcG9uZGluZyBhY3Rpb25zIHRvIExMVk0gSVIuIGluaXRpYWxpemVDdXN0b21Mb3dlcmluZyBpcworICAgIC8vLyBvcHRpb25hbCB0byBvdmVycmlkZS4gVGhlc2UgYXJlIHRoZSBvbmx5IEdDU3RyYXRlZ3kgbWV0aG9kcyB0aHJvdWdoCisgICAgLy8vIHdoaWNoIHRoZSBMTFZNIElSIGNhbiBiZSBtb2RpZmllZC4KKyAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6ZUN1c3RvbUxvd2VyaW5nKE1vZHVsZSAmRik7CisgICAgdmlydHVhbCBib29sIHBlcmZvcm1DdXN0b21Mb3dlcmluZyhGdW5jdGlvbiAmRik7CisgIH07CisgIAorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwN2I2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDcy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LS0gR0NzLmggLSBHYXJiYWdlIGNvbGxlY3RvciBsaW5rYWdlIGhhY2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGhhY2sgZnVuY3Rpb25zIHRvIGZvcmNlIGxpbmtpbmcgaW4gdGhlIEdDIGNvbXBvbmVudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0NTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dDU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgR0NTdHJhdGVneTsKKyAgY2xhc3MgR0NNZXRhZGF0YVByaW50ZXI7CisgIAorICAvLy8gRklYTUU6IENvbGxlY3RvciBpbnN0YW5jZXMgYXJlIG5vdCB1c2VmdWwgb24gdGhlaXIgb3duLiBUaGVzZSBubyBsb25nZXIKKyAgLy8vICAgICAgICBzZXJ2ZSBhbnkgcHVycG9zZSBleGNlcHQgdG8gbGluayBpbiB0aGUgcGx1Z2lucy4KKyAgCisgIC8vLyBDcmVhdGVzIGFuIG9jYW1sLWNvbXBhdGlibGUgZ2FyYmFnZSBjb2xsZWN0b3IuCisgIHZvaWQgbGlua09jYW1sR0MoKTsKKyAgCisgIC8vLyBDcmVhdGVzIGFuIG9jYW1sLWNvbXBhdGlibGUgbWV0YWRhdGEgcHJpbnRlci4KKyAgdm9pZCBsaW5rT2NhbWxHQ1ByaW50ZXIoKTsKKyAgCisgIC8vLyBDcmVhdGVzIGEgc2hhZG93IHN0YWNrIGdhcmJhZ2UgY29sbGVjdG9yLiBUaGlzIGNvbGxlY3RvciByZXF1aXJlcyBubyBjb2RlCisgIC8vLyBnZW5lcmF0b3Igc3VwcG9ydC4KKyAgdm9pZCBsaW5rU2hhZG93U3RhY2tHQygpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0lTRE9wY29kZXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0lTRE9wY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUyYmVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oCkBAIC0wLDAgKzEsNzMxIEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmggLSBDb2RlR2VuIG9wY29kZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBjb2RlZ2VuIG9wY29kZXMgYW5kIHJlbGF0ZWQgdXRpbGl0aWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0lTRE9QQ09ERVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fSVNET1BDT0RFU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIElTRCBuYW1lc3BhY2UgLSBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBhbiBlbnVtIHdoaWNoIHJlcHJlc2VudHMgYWxsIG9mIHRoZQorLy8vIFNlbGVjdGlvbkRBRyBub2RlIHR5cGVzIGFuZCB2YWx1ZSB0eXBlcy4KKy8vLworbmFtZXNwYWNlIElTRCB7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBJU0Q6Ok5vZGVUeXBlIGVudW0gLSBUaGlzIGVudW0gZGVmaW5lcyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IG9wZXJhdG9ycworICAvLy8gZm9yIGEgU2VsZWN0aW9uREFHLgorICAvLy8KKyAgLy8vIFRhcmdldHMgbWF5IGFsc28gZGVmaW5lIHRhcmdldC1kZXBlbmRlbnQgb3BlcmF0b3IgY29kZXMgZm9yIFNETm9kZXMuIEZvcgorICAvLy8gZXhhbXBsZSwgb24geDg2LCB0aGVzZSBhcmUgdGhlIGVudW0gdmFsdWVzIGluIHRoZSBYODZJU0QgbmFtZXNwYWNlLgorICAvLy8gVGFyZ2V0cyBzaG91bGQgYWltIHRvIHVzZSB0YXJnZXQtaW5kZXBlbmRlbnQgb3BlcmF0b3JzIHRvIG1vZGVsIHRoZWlyCisgIC8vLyBpbnN0cnVjdGlvbiBzZXRzIGFzIG11Y2ggYXMgcG9zc2libGUsIGFuZCBvbmx5IHVzZSB0YXJnZXQtZGVwZW5kZW50CisgIC8vLyBvcGVyYXRvcnMgd2hlbiB0aGV5IGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMuCisgIC8vLworICAvLy8gRmluYWxseSwgZHVyaW5nIGFuZCBhZnRlciBzZWxlY3Rpb24gcHJvcGVyLCBTTm9kZXMgbWF5IHVzZSBzcGVjaWFsCisgIC8vLyBvcGVyYXRvciBjb2RlcyB0aGF0IGNvcnJlc3BvbmQgZGlyZWN0bHkgd2l0aCBNYWNoaW5lSW5zdHIgb3Bjb2Rlcy4gVGhlc2UKKyAgLy8vIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBzZWxlY3RlZCBpbnN0cnVjdGlvbnMuIFNlZSB0aGUgaXNNYWNoaW5lT3Bjb2RlKCkKKyAgLy8vIGFuZCBnZXRNYWNoaW5lT3Bjb2RlKCkgbWVtYmVyIGZ1bmN0aW9ucyBvZiBTRE5vZGUuCisgIC8vLworICBlbnVtIE5vZGVUeXBlIHsKKyAgICAvLyBERUxFVEVEX05PREUgLSBUaGlzIGlzIGFuIGlsbGVnYWwgdmFsdWUgdGhhdCBpcyB1c2VkIHRvIGNhdGNoCisgICAgLy8gZXJyb3JzLiAgVGhpcyBvcGNvZGUgaXMgbm90IGEgbGVnYWwgb3Bjb2RlIGZvciBhbnkgbm9kZS4KKyAgICBERUxFVEVEX05PREUsCisKKyAgICAvLyBFbnRyeVRva2VuIC0gVGhpcyBpcyB0aGUgbWFya2VyIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24uCisgICAgRW50cnlUb2tlbiwKKworICAgIC8vIFRva2VuRmFjdG9yIC0gVGhpcyBub2RlIHRha2VzIG11bHRpcGxlIHRva2VucyBhcyBpbnB1dCBhbmQgcHJvZHVjZXMgYQorICAgIC8vIHNpbmdsZSB0b2tlbiByZXN1bHQuICBUaGlzIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBmYWN0IHRoYXQgdGhlIG9wZXJhbmQKKyAgICAvLyBvcGVyYXRvcnMgYXJlIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuCisgICAgVG9rZW5GYWN0b3IsCisKKyAgICAvLyBBc3NlcnRTZXh0LCBBc3NlcnRaZXh0IC0gVGhlc2Ugbm9kZXMgcmVjb3JkIGlmIGEgcmVnaXN0ZXIgY29udGFpbnMgYQorICAgIC8vIHZhbHVlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiB6ZXJvIG9yIHNpZ24gZXh0ZW5kZWQgZnJvbSBhIG5hcnJvd2VyIHR5cGUuCisgICAgLy8gVGhlc2Ugbm9kZXMgdGFrZSB0d28gb3BlcmFuZHMuICBUaGUgZmlyc3QgaXMgdGhlIG5vZGUgdGhhdCBoYXMgYWxyZWFkeQorICAgIC8vIGJlZW4gZXh0ZW5kZWQsIGFuZCB0aGUgc2Vjb25kIGlzIGEgdmFsdWUgdHlwZSBub2RlIGluZGljYXRpbmcgdGhlIHdpZHRoCisgICAgLy8gb2YgdGhlIGV4dGVuc2lvbgorICAgIEFzc2VydFNleHQsIEFzc2VydFpleHQsCisKKyAgICAvLyBWYXJpb3VzIGxlYWYgbm9kZXMuCisgICAgQmFzaWNCbG9jaywgVkFMVUVUWVBFLCBDT05EQ09ERSwgUmVnaXN0ZXIsCisgICAgQ29uc3RhbnQsIENvbnN0YW50RlAsCisgICAgR2xvYmFsQWRkcmVzcywgR2xvYmFsVExTQWRkcmVzcywgRnJhbWVJbmRleCwKKyAgICBKdW1wVGFibGUsIENvbnN0YW50UG9vbCwgRXh0ZXJuYWxTeW1ib2wsIEJsb2NrQWRkcmVzcywKKworICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSBHT1QKKyAgICBHTE9CQUxfT0ZGU0VUX1RBQkxFLAorCisgICAgLy8gRlJBTUVBRERSLCBSRVRVUk5BRERSIC0gVGhlc2Ugbm9kZXMgcmVwcmVzZW50IGxsdm0uZnJhbWVhZGRyZXNzIGFuZAorICAgIC8vIGxsdm0ucmV0dXJuYWRkcmVzcyBvbiB0aGUgREFHLiAgVGhlc2Ugbm9kZXMgdGFrZSBvbmUgb3BlcmFuZCwgdGhlIGluZGV4CisgICAgLy8gb2YgdGhlIGZyYW1lIG9yIHJldHVybiBhZGRyZXNzIHRvIHJldHVybi4gIEFuIGluZGV4IG9mIHplcm8gY29ycmVzcG9uZHMKKyAgICAvLyB0byB0aGUgY3VycmVudCBmdW5jdGlvbidzIGZyYW1lIG9yIHJldHVybiBhZGRyZXNzLCBhbiBpbmRleCBvZiBvbmUgdG8gdGhlCisgICAgLy8gcGFyZW50J3MgZnJhbWUgb3IgcmV0dXJuIGFkZHJlc3MsIGFuZCBzbyBvbi4KKyAgICBGUkFNRUFERFIsIFJFVFVSTkFERFIsCisKKyAgICAvLyBGUkFNRV9UT19BUkdTX09GRlNFVCAtIFRoaXMgbm9kZSByZXByZXNlbnRzIG9mZnNldCBmcm9tIGZyYW1lIHBvaW50ZXIgdG8KKyAgICAvLyBmaXJzdCAocG9zc2libGUpIG9uLXN0YWNrIGFyZ3VtZW50LiBUaGlzIGlzIG5lZWRlZCBmb3IgY29ycmVjdCBzdGFjaworICAgIC8vIGFkanVzdG1lbnQgZHVyaW5nIHVud2luZC4KKyAgICBGUkFNRV9UT19BUkdTX09GRlNFVCwKKworICAgIC8vIFJFU1VMVCwgT1VUQ0hBSU4gPSBMU0RBQUREUihJTkNIQUlOKSAtIFRoaXMgbm9kZSByZXByZXNlbnRzIHRoZQorICAgIC8vIGFkZHJlc3Mgb2YgdGhlIExhbmd1YWdlIFNwZWNpZmljIERhdGEgQXJlYSBmb3IgdGhlIGVuY2xvc2luZyBmdW5jdGlvbi4KKyAgICBMU0RBQUREUiwKKworICAgIC8vIFRhcmdldENvbnN0YW50KiAtIExpa2UgQ29uc3RhbnQqLCBidXQgdGhlIERBRyBkb2VzIG5vdCBkbyBhbnkgZm9sZGluZywKKyAgICAvLyBzaW1wbGlmaWNhdGlvbiwgb3IgbG93ZXJpbmcgb2YgdGhlIGNvbnN0YW50LiBUaGV5IGFyZSB1c2VkIGZvciBjb25zdGFudHMKKyAgICAvLyB3aGljaCBhcmUga25vd24gdG8gZml0IGluIHRoZSBpbW1lZGlhdGUgZmllbGRzIG9mIHRoZWlyIHVzZXJzLCBvciBmb3IKKyAgICAvLyBjYXJyeWluZyBtYWdpYyBudW1iZXJzIHdoaWNoIGFyZSBub3QgdmFsdWVzIHdoaWNoIG5lZWQgdG8gYmUgbWF0ZXJpYWxpemVkCisgICAgLy8gaW4gcmVnaXN0ZXJzLgorICAgIFRhcmdldENvbnN0YW50LAorICAgIFRhcmdldENvbnN0YW50RlAsCisKKyAgICAvLyBUYXJnZXRHbG9iYWxBZGRyZXNzIC0gTGlrZSBHbG9iYWxBZGRyZXNzLCBidXQgdGhlIERBRyBkb2VzIG5vIGZvbGRpbmcgb3IKKyAgICAvLyBhbnl0aGluZyBlbHNlIHdpdGggdGhpcyBub2RlLCBhbmQgdGhpcyBpcyB2YWxpZCBpbiB0aGUgdGFyZ2V0LXNwZWNpZmljCisgICAgLy8gZGFnLCB0dXJuaW5nIGludG8gYSBHbG9iYWxBZGRyZXNzIG9wZXJhbmQuCisgICAgVGFyZ2V0R2xvYmFsQWRkcmVzcywKKyAgICBUYXJnZXRHbG9iYWxUTFNBZGRyZXNzLAorICAgIFRhcmdldEZyYW1lSW5kZXgsCisgICAgVGFyZ2V0SnVtcFRhYmxlLAorICAgIFRhcmdldENvbnN0YW50UG9vbCwKKyAgICBUYXJnZXRFeHRlcm5hbFN5bWJvbCwKKyAgICBUYXJnZXRCbG9ja0FkZHJlc3MsCisKKyAgICAvLy8gUkVTVUxUID0gSU5UUklOU0lDX1dPX0NIQUlOKElOVFJJTlNJQ0lELCBhcmcxLCBhcmcyLCAuLi4pCisgICAgLy8vIFRoaXMgbm9kZSByZXByZXNlbnRzIGEgdGFyZ2V0IGludHJpbnNpYyBmdW5jdGlvbiB3aXRoIG5vIHNpZGUgZWZmZWN0cy4KKyAgICAvLy8gVGhlIGZpcnN0IG9wZXJhbmQgaXMgdGhlIElEIG51bWJlciBvZiB0aGUgaW50cmluc2ljIGZyb20gdGhlCisgICAgLy8vIGxsdm06OkludHJpbnNpYyBuYW1lc3BhY2UuICBUaGUgb3BlcmFuZHMgdG8gdGhlIGludHJpbnNpYyBmb2xsb3cuICBUaGUKKyAgICAvLy8gbm9kZSByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludHJpbnNpYy4KKyAgICBJTlRSSU5TSUNfV09fQ0hBSU4sCisKKyAgICAvLy8gUkVTVUxULE9VVENIQUlOID0gSU5UUklOU0lDX1dfQ0hBSU4oSU5DSEFJTiwgSU5UUklOU0lDSUQsIGFyZzEsIC4uLikKKyAgICAvLy8gVGhpcyBub2RlIHJlcHJlc2VudHMgYSB0YXJnZXQgaW50cmluc2ljIGZ1bmN0aW9uIHdpdGggc2lkZSBlZmZlY3RzIHRoYXQKKyAgICAvLy8gcmV0dXJucyBhIHJlc3VsdC4gIFRoZSBmaXJzdCBvcGVyYW5kIGlzIGEgY2hhaW4gcG9pbnRlci4gIFRoZSBzZWNvbmQgaXMKKyAgICAvLy8gdGhlIElEIG51bWJlciBvZiB0aGUgaW50cmluc2ljIGZyb20gdGhlIGxsdm06OkludHJpbnNpYyBuYW1lc3BhY2UuICBUaGUKKyAgICAvLy8gb3BlcmFuZHMgdG8gdGhlIGludHJpbnNpYyBmb2xsb3cuICBUaGUgbm9kZSBoYXMgdHdvIHJlc3VsdHMsIHRoZSByZXN1bHQKKyAgICAvLy8gb2YgdGhlIGludHJpbnNpYyBhbmQgYW4gb3V0cHV0IGNoYWluLgorICAgIElOVFJJTlNJQ19XX0NIQUlOLAorCisgICAgLy8vIE9VVENIQUlOID0gSU5UUklOU0lDX1ZPSUQoSU5DSEFJTiwgSU5UUklOU0lDSUQsIGFyZzEsIGFyZzIsIC4uLikKKyAgICAvLy8gVGhpcyBub2RlIHJlcHJlc2VudHMgYSB0YXJnZXQgaW50cmluc2ljIGZ1bmN0aW9uIHdpdGggc2lkZSBlZmZlY3RzIHRoYXQKKyAgICAvLy8gZG9lcyBub3QgcmV0dXJuIGEgcmVzdWx0LiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMgYSBjaGFpbiBwb2ludGVyLiAgVGhlCisgICAgLy8vIHNlY29uZCBpcyB0aGUgSUQgbnVtYmVyIG9mIHRoZSBpbnRyaW5zaWMgZnJvbSB0aGUgbGx2bTo6SW50cmluc2ljCisgICAgLy8vIG5hbWVzcGFjZS4gIFRoZSBvcGVyYW5kcyB0byB0aGUgaW50cmluc2ljIGZvbGxvdy4KKyAgICBJTlRSSU5TSUNfVk9JRCwKKworICAgIC8vIENvcHlUb1JlZyAtIFRoaXMgbm9kZSBoYXMgdGhyZWUgb3BlcmFuZHM6IGEgY2hhaW4sIGEgcmVnaXN0ZXIgbnVtYmVyIHRvCisgICAgLy8gc2V0IHRvIHRoaXMgdmFsdWUsIGFuZCBhIHZhbHVlLgorICAgIENvcHlUb1JlZywKKworICAgIC8vIENvcHlGcm9tUmVnIC0gVGhpcyBub2RlIGluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCB2YWx1ZSBpcyBhIHZpcnR1YWwgb3IKKyAgICAvLyBwaHlzaWNhbCByZWdpc3RlciB0aGF0IGlzIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YgdGhpcworICAgIC8vIFNlbGVjdGlvbkRBRy4gIFRoZSByZWdpc3RlciBpcyBhdmFpbGFibGUgZnJvbSB0aGUgUmVnaXN0ZXJTRE5vZGUgb2JqZWN0LgorICAgIENvcHlGcm9tUmVnLAorCisgICAgLy8gVU5ERUYgLSBBbiB1bmRlZmluZWQgbm9kZQorICAgIFVOREVGLAorCisgICAgLy8gRVhUUkFDVF9FTEVNRU5UIC0gVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgbG93ZXIgb3IgdXBwZXIgKGRldGVybWluZWQgYnkKKyAgICAvLyBhIENvbnN0YW50LCB3aGljaCBpcyByZXF1aXJlZCB0byBiZSBvcGVyYW5kICMxKSBoYWxmIG9mIHRoZSBpbnRlZ2VyIG9yCisgICAgLy8gZmxvYXQgdmFsdWUgc3BlY2lmaWVkIGFzIG9wZXJhbmQgIzAuICBUaGlzIGlzIG9ubHkgZm9yIHVzZSBiZWZvcmUKKyAgICAvLyBsZWdhbGl6YXRpb24sIGZvciB2YWx1ZXMgdGhhdCB3aWxsIGJlIGJyb2tlbiBpbnRvIG11bHRpcGxlIHJlZ2lzdGVycy4KKyAgICBFWFRSQUNUX0VMRU1FTlQsCisKKyAgICAvLyBCVUlMRF9QQUlSIC0gVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgRVhUUkFDVF9FTEVNRU5UIGluIHNvbWUgd2F5cy4gIEdpdmVuCisgICAgLy8gdHdvIHZhbHVlcyBvZiB0aGUgc2FtZSBpbnRlZ2VyIHZhbHVlIHR5cGUsIHRoaXMgcHJvZHVjZXMgYSB2YWx1ZSB0d2ljZSBhcworICAgIC8vIGJpZy4gIExpa2UgRVhUUkFDVF9FTEVNRU5ULCB0aGlzIGNhbiBvbmx5IGJlIHVzZWQgYmVmb3JlIGxlZ2FsaXphdGlvbi4KKyAgICBCVUlMRF9QQUlSLAorCisgICAgLy8gTUVSR0VfVkFMVUVTIC0gVGhpcyBub2RlIHRha2VzIG11bHRpcGxlIGRpc2NyZXRlIG9wZXJhbmRzIGFuZCByZXR1cm5zCisgICAgLy8gdGhlbSBhbGwgYXMgaXRzIGluZGl2aWR1YWwgcmVzdWx0cy4gIFRoaXMgbm9kZXMgaGFzIGV4YWN0bHkgdGhlIHNhbWUKKyAgICAvLyBudW1iZXIgb2YgaW5wdXRzIGFuZCBvdXRwdXRzLiBUaGlzIG5vZGUgaXMgdXNlZnVsIGZvciBzb21lIHBpZWNlcyBvZiB0aGUKKyAgICAvLyBjb2RlIGdlbmVyYXRvciB0aGF0IHdhbnQgdG8gdGhpbmsgYWJvdXQgYSBzaW5nbGUgbm9kZSB3aXRoIG11bHRpcGxlCisgICAgLy8gcmVzdWx0cywgbm90IG11bHRpcGxlIG5vZGVzLgorICAgIE1FUkdFX1ZBTFVFUywKKworICAgIC8vIFNpbXBsZSBpbnRlZ2VyIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdG9ycy4KKyAgICBBREQsIFNVQiwgTVVMLCBTRElWLCBVRElWLCBTUkVNLCBVUkVNLAorCisgICAgLy8gU01VTF9MT0hJL1VNVUxfTE9ISSAtIE11bHRpcGx5IHR3byBpbnRlZ2VycyBvZiB0eXBlIGlOLCBwcm9kdWNpbmcKKyAgICAvLyBhIHNpZ25lZC91bnNpZ25lZCB2YWx1ZSBvZiB0eXBlIGlbMipOXSwgYW5kIHJldHVybiB0aGUgZnVsbCB2YWx1ZSBhcworICAgIC8vIHR3byByZXN1bHRzLCBlYWNoIG9mIHR5cGUgaU4uCisgICAgU01VTF9MT0hJLCBVTVVMX0xPSEksCisKKyAgICAvLyBTRElWUkVNL1VESVZSRU0gLSBEaXZpZGUgdHdvIGludGVnZXJzIGFuZCBwcm9kdWNlIGJvdGggYSBxdW90aWVudCBhbmQKKyAgICAvLyByZW1haW5kZXIgcmVzdWx0LgorICAgIFNESVZSRU0sIFVESVZSRU0sCisKKyAgICAvLyBDQVJSWV9GQUxTRSAtIFRoaXMgbm9kZSBpcyB1c2VkIHdoZW4gZm9sZGluZyBvdGhlciBub2RlcywKKyAgICAvLyBsaWtlIEFEREMvU1VCQywgd2hpY2ggaW5kaWNhdGUgdGhlIGNhcnJ5IHJlc3VsdCBpcyBhbHdheXMgZmFsc2UuCisgICAgQ0FSUllfRkFMU0UsCisKKyAgICAvLyBDYXJyeS1zZXR0aW5nIG5vZGVzIGZvciBtdWx0aXBsZSBwcmVjaXNpb24gYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uLgorICAgIC8vIFRoZXNlIG5vZGVzIHRha2UgdHdvIG9wZXJhbmRzIG9mIHRoZSBzYW1lIHZhbHVlIHR5cGUsIGFuZCBwcm9kdWNlIHR3bworICAgIC8vIHJlc3VsdHMuICBUaGUgZmlyc3QgcmVzdWx0IGlzIHRoZSBub3JtYWwgYWRkIG9yIHN1YiByZXN1bHQsIHRoZSBzZWNvbmQKKyAgICAvLyByZXN1bHQgaXMgdGhlIGNhcnJ5IGZsYWcgcmVzdWx0LgorICAgIEFEREMsIFNVQkMsCisKKyAgICAvLyBDYXJyeS11c2luZyBub2RlcyBmb3IgbXVsdGlwbGUgcHJlY2lzaW9uIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbi4gIFRoZXNlCisgICAgLy8gbm9kZXMgdGFrZSB0aHJlZSBvcGVyYW5kczogVGhlIGZpcnN0IHR3byBhcmUgdGhlIG5vcm1hbCBsaHMgYW5kIHJocyB0bworICAgIC8vIHRoZSBhZGQgb3Igc3ViLCBhbmQgdGhlIHRoaXJkIGlzIHRoZSBpbnB1dCBjYXJyeSBmbGFnLiAgVGhlc2Ugbm9kZXMKKyAgICAvLyBwcm9kdWNlIHR3byByZXN1bHRzOyB0aGUgbm9ybWFsIHJlc3VsdCBvZiB0aGUgYWRkIG9yIHN1YiwgYW5kIHRoZSBvdXRwdXQKKyAgICAvLyBjYXJyeSBmbGFnLiAgVGhlc2Ugbm9kZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhIGNhcnJ5IGZsYWcgdG8gYWxsb3cgdGhlbQorICAgIC8vIHRvIHRoZW0gdG8gYmUgY2hhaW5lZCB0b2dldGhlciBmb3IgYWRkIGFuZCBzdWIgb2YgYXJiaXRyYXJpbHkgbGFyZ2UKKyAgICAvLyB2YWx1ZXMuCisgICAgQURERSwgU1VCRSwKKworICAgIC8vIFJFU1VMVCwgQk9PTCA9IFtTVV1BRERPKExIUywgUkhTKSAtIE92ZXJmbG93LWF3YXJlIG5vZGVzIGZvciBhZGRpdGlvbi4KKyAgICAvLyBUaGVzZSBub2RlcyB0YWtlIHR3byBvcGVyYW5kczogdGhlIG5vcm1hbCBMSFMgYW5kIFJIUyB0byB0aGUgYWRkLiBUaGV5CisgICAgLy8gcHJvZHVjZSB0d28gcmVzdWx0czogdGhlIG5vcm1hbCByZXN1bHQgb2YgdGhlIGFkZCwgYW5kIGEgYm9vbGVhbiB0aGF0CisgICAgLy8gaW5kaWNhdGVzIGlmIGFuIG92ZXJmbG93IG9jY3VyZWQgKCpub3QqIGEgZmxhZywgYmVjYXVzZSBpdCBtYXkgYmUgc3RvcmVkCisgICAgLy8gdG8gbWVtb3J5LCBldGMuKS4gIElmIHRoZSB0eXBlIG9mIHRoZSBib29sZWFuIGlzIG5vdCBpMSB0aGVuIHRoZSBoaWdoCisgICAgLy8gYml0cyBjb25mb3JtIHRvIGdldEJvb2xlYW5Db250ZW50cy4KKyAgICAvLyBUaGVzZSBub2RlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIGxsdm0uW3N1XWFkZC53aXRoLm92ZXJmbG93IGludHJpbnNpY3MuCisgICAgU0FERE8sIFVBRERPLAorCisgICAgLy8gU2FtZSBmb3Igc3VidHJhY3Rpb24KKyAgICBTU1VCTywgVVNVQk8sCisKKyAgICAvLyBTYW1lIGZvciBtdWx0aXBsaWNhdGlvbgorICAgIFNNVUxPLCBVTVVMTywKKworICAgIC8vIFNpbXBsZSBiaW5hcnkgZmxvYXRpbmcgcG9pbnQgb3BlcmF0b3JzLgorICAgIEZBREQsIEZTVUIsIEZNVUwsIEZESVYsIEZSRU0sCisKKyAgICAvLyBGQ09QWVNJR04oWCwgWSkgLSBSZXR1cm4gdGhlIHZhbHVlIG9mIFggd2l0aCB0aGUgc2lnbiBvZiBZLiAgTk9URTogVGhpcworICAgIC8vIERBRyBub2RlIGRvZXMgbm90IHJlcXVpcmUgdGhhdCBYIGFuZCBZIGhhdmUgdGhlIHNhbWUgdHlwZSwganVzdCB0aGF0IHRoZXkKKyAgICAvLyBhcmUgYm90aCBmbG9hdGluZyBwb2ludC4gIFggYW5kIHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUuCisgICAgLy8gRkNPUFlTSUdOKGYzMiwgZjY0KSBpcyBhbGxvd2VkLgorICAgIEZDT1BZU0lHTiwKKworICAgIC8vIElOVCA9IEZHRVRTSUdOKEZQKSAtIFJldHVybiB0aGUgc2lnbiBiaXQgb2YgdGhlIHNwZWNpZmllZCBmbG9hdGluZyBwb2ludAorICAgIC8vIHZhbHVlIGFzIGFuIGludGVnZXIgMC8xIHZhbHVlLgorICAgIEZHRVRTSUdOLAorCisgICAgLy8vIEJVSUxEX1ZFQ1RPUihFTFQwLCBFTFQxLCBFTFQyLCBFTFQzLC4uLikgLSBSZXR1cm4gYSB2ZWN0b3Igd2l0aCB0aGUKKyAgICAvLy8gc3BlY2lmaWVkLCBwb3NzaWJseSB2YXJpYWJsZSwgZWxlbWVudHMuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGlzCisgICAgLy8vIHJlcXVpcmVkIHRvIGJlIGEgcG93ZXIgb2YgdHdvLiAgVGhlIHR5cGVzIG9mIHRoZSBvcGVyYW5kcyBtdXN0IGFsbCBiZQorICAgIC8vLyB0aGUgc2FtZSBhbmQgbXVzdCBtYXRjaCB0aGUgdmVjdG9yIGVsZW1lbnQgdHlwZSwgZXhjZXB0IHRoYXQgaW50ZWdlcgorICAgIC8vLyB0eXBlcyBhcmUgYWxsb3dlZCB0byBiZSBsYXJnZXIgdGhhbiB0aGUgZWxlbWVudCB0eXBlLCBpbiB3aGljaCBjYXNlCisgICAgLy8vIHRoZSBvcGVyYW5kcyBhcmUgaW1wbGljaXRseSB0cnVuY2F0ZWQuCisgICAgQlVJTERfVkVDVE9SLAorCisgICAgLy8vIElOU0VSVF9WRUNUT1JfRUxUKFZFQ1RPUiwgVkFMLCBJRFgpIC0gUmV0dXJucyBWRUNUT1Igd2l0aCB0aGUgZWxlbWVudAorICAgIC8vLyBhdCBJRFggcmVwbGFjZWQgd2l0aCBWQUwuICBJZiB0aGUgdHlwZSBvZiBWQUwgaXMgbGFyZ2VyIHRoYW4gdGhlIHZlY3RvcgorICAgIC8vLyBlbGVtZW50IHR5cGUgdGhlbiBWQUwgaXMgdHJ1bmNhdGVkIGJlZm9yZSByZXBsYWNlbWVudC4KKyAgICBJTlNFUlRfVkVDVE9SX0VMVCwKKworICAgIC8vLyBFWFRSQUNUX1ZFQ1RPUl9FTFQoVkVDVE9SLCBJRFgpIC0gUmV0dXJucyBhIHNpbmdsZSBlbGVtZW50IGZyb20gVkVDVE9SCisgICAgLy8vIGlkZW50aWZpZWQgYnkgdGhlIChwb3RlbnRpYWxseSB2YXJpYWJsZSkgZWxlbWVudCBudW1iZXIgSURYLiAgSWYgdGhlCisgICAgLy8vIHJldHVybiB0eXBlIGlzIGFuIGludGVnZXIgdHlwZSBsYXJnZXIgdGhhbiB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZQorICAgIC8vLyB2ZWN0b3IsIHRoZSByZXN1bHQgaXMgZXh0ZW5kZWQgdG8gdGhlIHdpZHRoIG9mIHRoZSByZXR1cm4gdHlwZS4KKyAgICBFWFRSQUNUX1ZFQ1RPUl9FTFQsCisKKyAgICAvLy8gQ09OQ0FUX1ZFQ1RPUlMoVkVDVE9SMCwgVkVDVE9SMSwgLi4uKSAtIEdpdmVuIGEgbnVtYmVyIG9mIHZhbHVlcyBvZgorICAgIC8vLyB2ZWN0b3IgdHlwZSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhbmQgZWxlbWVudCB0eXBlLCB0aGlzIHByb2R1Y2VzIGEKKyAgICAvLy8gY29uY2F0ZW5hdGVkIHZlY3RvciByZXN1bHQgdmFsdWUsIHdpdGggbGVuZ3RoIGVxdWFsIHRvIHRoZSBzdW0gb2YgdGhlCisgICAgLy8vIGxlbmd0aHMgb2YgdGhlIGlucHV0IHZlY3RvcnMuCisgICAgQ09OQ0FUX1ZFQ1RPUlMsCisKKyAgICAvLy8gRVhUUkFDVF9TVUJWRUNUT1IoVkVDVE9SLCBJRFgpIC0gUmV0dXJucyBhIHN1YnZlY3RvciBmcm9tIFZFQ1RPUiAoYW4KKyAgICAvLy8gdmVjdG9yIHZhbHVlKSBzdGFydGluZyB3aXRoIHRoZSAocG90ZW50aWFsbHkgdmFyaWFibGUpIGVsZW1lbnQgbnVtYmVyCisgICAgLy8vIElEWCwgd2hpY2ggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSByZXN1bHQgdmVjdG9yIGxlbmd0aC4KKyAgICBFWFRSQUNUX1NVQlZFQ1RPUiwKKworICAgIC8vLyBWRUNUT1JfU0hVRkZMRShWRUMxLCBWRUMyKSAtIFJldHVybnMgYSB2ZWN0b3IsIG9mIHRoZSBzYW1lIHR5cGUgYXMgCisgICAgLy8vIFZFQzEvVkVDMi4gIEEgVkVDVE9SX1NIVUZGTEUgbm9kZSBhbHNvIGNvbnRhaW5zIGFuIGFycmF5IG9mIGNvbnN0YW50IGludAorICAgIC8vLyB2YWx1ZXMgdGhhdCBpbmRpY2F0ZSB3aGljaCB2YWx1ZSAob3IgdW5kZWYpIGVhY2ggcmVzdWx0IGVsZW1lbnQgd2lsbAorICAgIC8vLyBnZXQuICBUaGVzZSBjb25zdGFudCBpbnRzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIAorICAgIC8vLyBTaHVmZmxlVmVjdG9yU0ROb2RlIGNsYXNzLiAgVGhpcyBpcyBxdWl0ZSBzaW1pbGFyIHRvIHRoZSBBbHRpdmVjIAorICAgIC8vLyAndnBlcm0nIGluc3RydWN0aW9uLCBleGNlcHQgdGhhdCB0aGUgaW5kaWNlcyBtdXN0IGJlIGNvbnN0YW50cyBhbmQgYXJlCisgICAgLy8vIGluIHRlcm1zIG9mIHRoZSBlbGVtZW50IHNpemUgb2YgVkVDMS9WRUMyLCBub3QgaW4gdGVybXMgb2YgYnl0ZXMuCisgICAgVkVDVE9SX1NIVUZGTEUsCisKKyAgICAvLy8gU0NBTEFSX1RPX1ZFQ1RPUihWQUwpIC0gVGhpcyByZXByZXNlbnRzIHRoZSBvcGVyYXRpb24gb2YgbG9hZGluZyBhCisgICAgLy8vIHNjYWxhciB2YWx1ZSBpbnRvIGVsZW1lbnQgMCBvZiB0aGUgcmVzdWx0YW50IHZlY3RvciB0eXBlLiAgVGhlIHRvcAorICAgIC8vLyBlbGVtZW50cyAxIHRvIE4tMSBvZiB0aGUgTi1lbGVtZW50IHZlY3RvciBhcmUgdW5kZWZpbmVkLiAgVGhlIHR5cGUKKyAgICAvLy8gb2YgdGhlIG9wZXJhbmQgbXVzdCBtYXRjaCB0aGUgdmVjdG9yIGVsZW1lbnQgdHlwZSwgZXhjZXB0IHdoZW4gdGhleQorICAgIC8vLyBhcmUgaW50ZWdlciB0eXBlcy4gIEluIHRoaXMgY2FzZSB0aGUgb3BlcmFuZCBpcyBhbGxvd2VkIHRvIGJlIHdpZGVyCisgICAgLy8vIHRoYW4gdGhlIHZlY3RvciBlbGVtZW50IHR5cGUsIGFuZCBpcyBpbXBsaWNpdGx5IHRydW5jYXRlZCB0byBpdC4KKyAgICBTQ0FMQVJfVE9fVkVDVE9SLAorCisgICAgLy8gTVVMSFUvTVVMSFMgLSBNdWx0aXBseSBoaWdoIC0gTXVsdGlwbHkgdHdvIGludGVnZXJzIG9mIHR5cGUgaU4sIHByb2R1Y2luZworICAgIC8vIGFuIHVuc2lnbmVkL3NpZ25lZCB2YWx1ZSBvZiB0eXBlIGlbMipOXSwgdGhlbiByZXR1cm4gdGhlIHRvcCBwYXJ0LgorICAgIE1VTEhVLCBNVUxIUywKKworICAgIC8vIEJpdHdpc2Ugb3BlcmF0b3JzIC0gbG9naWNhbCBhbmQsIGxvZ2ljYWwgb3IsIGxvZ2ljYWwgeG9yLCBzaGlmdCBsZWZ0LAorICAgIC8vIHNoaWZ0IHJpZ2h0IGFsZ2VicmFpYyAoc2hpZnQgaW4gc2lnbiBiaXRzKSwgc2hpZnQgcmlnaHQgbG9naWNhbCAoc2hpZnQgaW4KKyAgICAvLyB6ZXJvZXMpLCByb3RhdGUgbGVmdCwgcm90YXRlIHJpZ2h0LCBhbmQgYnl0ZXN3YXAuCisgICAgQU5ELCBPUiwgWE9SLCBTSEwsIFNSQSwgU1JMLCBST1RMLCBST1RSLCBCU1dBUCwKKworICAgIC8vIENvdW50aW5nIG9wZXJhdG9ycworICAgIENUVFosIENUTFosIENUUE9QLAorCisgICAgLy8gU2VsZWN0KENPTkQsIFRSVUVWQUwsIEZBTFNFVkFMKS4gIElmIHRoZSB0eXBlIG9mIHRoZSBib29sZWFuIENPTkQgaXMgbm90CisgICAgLy8gaTEgdGhlbiB0aGUgaGlnaCBiaXRzIG11c3QgY29uZm9ybSB0byBnZXRCb29sZWFuQ29udGVudHMuCisgICAgU0VMRUNULAorCisgICAgLy8gU2VsZWN0IHdpdGggY29uZGl0aW9uIG9wZXJhdG9yIC0gVGhpcyBzZWxlY3RzIGJldHdlZW4gYSB0cnVlIHZhbHVlIGFuZAorICAgIC8vIGEgZmFsc2UgdmFsdWUgKG9wcyAjMiBhbmQgIzMpIGJhc2VkIG9uIHRoZSBib29sZWFuIHJlc3VsdCBvZiBjb21wYXJpbmcKKyAgICAvLyB0aGUgbGhzIGFuZCByaHMgKG9wcyAjMCBhbmQgIzEpIG9mIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiB3aXRoIHRoZQorICAgIC8vIGNvbmRpdGlvbiBjb2RlIGluIG9wICM0LCBhIENvbmRDb2RlU0ROb2RlLgorICAgIFNFTEVDVF9DQywKKworICAgIC8vIFNldENDIG9wZXJhdG9yIC0gVGhpcyBldmFsdWF0ZXMgdG8gYSB0cnVlIHZhbHVlIGlmZiB0aGUgY29uZGl0aW9uIGlzCisgICAgLy8gdHJ1ZS4gIElmIHRoZSByZXN1bHQgdmFsdWUgdHlwZSBpcyBub3QgaTEgdGhlbiB0aGUgaGlnaCBiaXRzIGNvbmZvcm0KKyAgICAvLyB0byBnZXRCb29sZWFuQ29udGVudHMuICBUaGUgb3BlcmFuZHMgdG8gdGhpcyBhcmUgdGhlIGxlZnQgYW5kIHJpZ2h0CisgICAgLy8gb3BlcmFuZHMgdG8gY29tcGFyZSAob3BzICMwLCBhbmQgIzEpIGFuZCB0aGUgY29uZGl0aW9uIGNvZGUgdG8gY29tcGFyZQorICAgIC8vIHRoZW0gd2l0aCAob3AgIzIpIGFzIGEgQ29uZENvZGVTRE5vZGUuCisgICAgU0VUQ0MsCisKKyAgICAvLyBSRVNVTFQgPSBWU0VUQ0MoTEhTLCBSSFMsIENPTkQpIG9wZXJhdG9yIC0gVGhpcyBldmFsdWF0ZXMgdG8gYSB2ZWN0b3Igb2YKKyAgICAvLyBpbnRlZ2VyIGVsZW1lbnRzIHdpdGggYWxsIGJpdHMgb2YgdGhlIHJlc3VsdCBlbGVtZW50cyBzZXQgdG8gdHJ1ZSBpZiB0aGUKKyAgICAvLyBjb21wYXJpc29uIGlzIHRydWUgb3IgYWxsIGNsZWFyZWQgaWYgdGhlIGNvbXBhcmlzb24gaXMgZmFsc2UuICBUaGUKKyAgICAvLyBvcGVyYW5kcyB0byB0aGlzIGFyZSB0aGUgbGVmdCBhbmQgcmlnaHQgb3BlcmFuZHMgdG8gY29tcGFyZSAoTEhTL1JIUykgYW5kCisgICAgLy8gdGhlIGNvbmRpdGlvbiBjb2RlIHRvIGNvbXBhcmUgdGhlbSB3aXRoIChDT05EKSBhcyBhIENvbmRDb2RlU0ROb2RlLgorICAgIFZTRVRDQywKKworICAgIC8vIFNITF9QQVJUUy9TUkFfUEFSVFMvU1JMX1BBUlRTIC0gVGhlc2Ugb3BlcmF0b3JzIGFyZSB1c2VkIGZvciBleHBhbmRlZAorICAgIC8vIGludGVnZXIgc2hpZnQgb3BlcmF0aW9ucywganVzdCBsaWtlIEFERC9TVUJfUEFSVFMuICBUaGUgb3BlcmF0aW9uCisgICAgLy8gb3JkZXJpbmcgaXM6CisgICAgLy8gICAgICAgW0xvLEhpXSA9IG9wIFtMb0xIUyxIaUxIU10sIEFtdAorICAgIFNITF9QQVJUUywgU1JBX1BBUlRTLCBTUkxfUEFSVFMsCisKKyAgICAvLyBDb252ZXJzaW9uIG9wZXJhdG9ycy4gIFRoZXNlIGFyZSBhbGwgc2luZ2xlIGlucHV0IHNpbmdsZSBvdXRwdXQKKyAgICAvLyBvcGVyYXRpb25zLiAgRm9yIGFsbCBvZiB0aGVzZSwgdGhlIHJlc3VsdCB0eXBlIG11c3QgYmUgc3RyaWN0bHkKKyAgICAvLyB3aWRlciBvciBuYXJyb3dlciAoZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRpb24pIHRoYW4gdGhlIHNvdXJjZQorICAgIC8vIHR5cGUuCisKKyAgICAvLyBTSUdOX0VYVEVORCAtIFVzZWQgZm9yIGludGVnZXIgdHlwZXMsIHJlcGxpY2F0aW5nIHRoZSBzaWduIGJpdAorICAgIC8vIGludG8gbmV3IGJpdHMuCisgICAgU0lHTl9FWFRFTkQsCisKKyAgICAvLyBaRVJPX0VYVEVORCAtIFVzZWQgZm9yIGludGVnZXIgdHlwZXMsIHplcm9pbmcgdGhlIG5ldyBiaXRzLgorICAgIFpFUk9fRVhURU5ELAorCisgICAgLy8gQU5ZX0VYVEVORCAtIFVzZWQgZm9yIGludGVnZXIgdHlwZXMuICBUaGUgaGlnaCBiaXRzIGFyZSB1bmRlZmluZWQuCisgICAgQU5ZX0VYVEVORCwKKworICAgIC8vIFRSVU5DQVRFIC0gQ29tcGxldGVseSBkcm9wIHRoZSBoaWdoIGJpdHMuCisgICAgVFJVTkNBVEUsCisKKyAgICAvLyBbU1VdSU5UX1RPX0ZQIC0gVGhlc2Ugb3BlcmF0b3JzIGNvbnZlcnQgaW50ZWdlcnMgKHdob3NlIGludGVycHJldGVkIHNpZ24KKyAgICAvLyBkZXBlbmRzIG9uIHRoZSBmaXJzdCBsZXR0ZXIpIHRvIGZsb2F0aW5nIHBvaW50LgorICAgIFNJTlRfVE9fRlAsCisgICAgVUlOVF9UT19GUCwKKworICAgIC8vIFNJR05fRVhURU5EX0lOUkVHIC0gVGhpcyBvcGVyYXRvciBhdG9taWNhbGx5IHBlcmZvcm1zIGEgU0hML1NSQSBwYWlyIHRvCisgICAgLy8gc2lnbiBleHRlbmQgYSBzbWFsbCB2YWx1ZSBpbiBhIGxhcmdlIGludGVnZXIgcmVnaXN0ZXIgKGUuZy4gc2lnbgorICAgIC8vIGV4dGVuZGluZyB0aGUgbG93IDggYml0cyBvZiBhIDMyLWJpdCByZWdpc3RlciB0byBmaWxsIHRoZSB0b3AgMjQgYml0cworICAgIC8vIHdpdGggdGhlIDd0aCBiaXQpLiAgVGhlIHNpemUgb2YgdGhlIHNtYWxsZXIgdHlwZSBpcyBpbmRpY2F0ZWQgYnkgdGhlIDF0aAorICAgIC8vIG9wZXJhbmQsIGEgVmFsdWVUeXBlIG5vZGUuCisgICAgU0lHTl9FWFRFTkRfSU5SRUcsCisKKyAgICAvLy8gRlBfVE9fW1VTXUlOVCAtIENvbnZlcnQgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBhIHNpZ25lZCBvciB1bnNpZ25lZAorICAgIC8vLyBpbnRlZ2VyLgorICAgIEZQX1RPX1NJTlQsCisgICAgRlBfVE9fVUlOVCwKKworICAgIC8vLyBYID0gRlBfUk9VTkQoWSwgVFJVTkMpIC0gUm91bmRpbmcgJ1knIGZyb20gYSBsYXJnZXIgZmxvYXRpbmcgcG9pbnQgdHlwZQorICAgIC8vLyBkb3duIHRvIHRoZSBwcmVjaXNpb24gb2YgdGhlIGRlc3RpbmF0aW9uIFZULiAgVFJVTkMgaXMgYSBmbGFnLCB3aGljaCBpcworICAgIC8vLyBhbHdheXMgYW4gaW50ZWdlciB0aGF0IGlzIHplcm8gb3Igb25lLiAgSWYgVFJVTkMgaXMgMCwgdGhpcyBpcyBhCisgICAgLy8vIG5vcm1hbCByb3VuZGluZywgaWYgaXQgaXMgMSwgdGhpcyBGUF9ST1VORCBpcyBrbm93biB0byBub3QgY2hhbmdlIHRoZQorICAgIC8vLyB2YWx1ZSBvZiBZLgorICAgIC8vLworICAgIC8vLyBUaGUgVFJVTkMgPSAxIGNhc2UgaXMgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZSBrbm93IHRoYXQgdGhlIHZhbHVlIHdpbGwKKyAgICAvLy8gbm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBub2RlLCBiZWNhdXNlIFkgaXMgbm90IHVzaW5nIGFueSBvZiB0aGUgZXh0cmEKKyAgICAvLy8gcHJlY2lzaW9uIG9mIHNvdXJjZSB0eXBlLiAgVGhpcyBhbGxvd3MgY2VydGFpbiB0cmFuc2Zvcm1hdGlvbnMgbGlrZQorICAgIC8vLyBGUF9FWFRFTkQoRlBfUk9VTkQoWCwxKSkgLT4gWCB3aGljaCBhcmUgbm90IHNhZmUgZm9yCisgICAgLy8vIEZQX0VYVEVORChGUF9ST1VORChYLDApKSBiZWNhdXNlIHRoZSBleHRyYSBiaXRzIGFyZW4ndCByZW1vdmVkLgorICAgIEZQX1JPVU5ELAorCisgICAgLy8gRkxUX1JPVU5EU18gLSBSZXR1cm5zIGN1cnJlbnQgcm91bmRpbmcgbW9kZToKKyAgICAvLyAtMSBVbmRlZmluZWQKKyAgICAvLyAgMCBSb3VuZCB0byAwCisgICAgLy8gIDEgUm91bmQgdG8gbmVhcmVzdAorICAgIC8vICAyIFJvdW5kIHRvICtpbmYKKyAgICAvLyAgMyBSb3VuZCB0byAtaW5mCisgICAgRkxUX1JPVU5EU18sCisKKyAgICAvLy8gWCA9IEZQX1JPVU5EX0lOUkVHKFksIFZUKSAtIFRoaXMgb3BlcmF0b3IgdGFrZXMgYW4gRlAgcmVnaXN0ZXIsIGFuZAorICAgIC8vLyByb3VuZHMgaXQgdG8gYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4gIEl0IHRoZW4gcHJvbW90ZXMgaXQgYW5kIHJldHVybnMgaXQKKyAgICAvLy8gaW4gYSByZWdpc3RlciBvZiB0aGUgc2FtZSBzaXplLiAgVGhpcyBvcGVyYXRpb24gZWZmZWN0aXZlbHkganVzdAorICAgIC8vLyBkaXNjYXJkcyBleGNlc3MgcHJlY2lzaW9uLiAgVGhlIHR5cGUgdG8gcm91bmQgZG93biB0byBpcyBzcGVjaWZpZWQgYnkKKyAgICAvLy8gdGhlIFZUIG9wZXJhbmQsIGEgVlRTRE5vZGUuCisgICAgRlBfUk9VTkRfSU5SRUcsCisKKyAgICAvLy8gWCA9IEZQX0VYVEVORChZKSAtIEV4dGVuZCBhIHNtYWxsZXIgRlAgdHlwZSBpbnRvIGEgbGFyZ2VyIEZQIHR5cGUuCisgICAgRlBfRVhURU5ELAorCisgICAgLy8gQklUX0NPTlZFUlQgLSBUaGlzIG9wZXJhdG9yIGNvbnZlcnRzIGJldHdlZW4gaW50ZWdlciwgdmVjdG9yIGFuZCBGUAorICAgIC8vIHZhbHVlcywgYXMgaWYgdGhlIHZhbHVlIHdhcyBzdG9yZWQgdG8gbWVtb3J5IHdpdGggb25lIHR5cGUgYW5kIGxvYWRlZAorICAgIC8vIGZyb20gdGhlIHNhbWUgYWRkcmVzcyB3aXRoIHRoZSBvdGhlciB0eXBlIChvciBlcXVpdmFsZW50bHkgZm9yIHZlY3RvcgorICAgIC8vIGZvcm1hdCBjb252ZXJzaW9ucywgZXRjKS4gIFRoZSBzb3VyY2UgYW5kIHJlc3VsdCBhcmUgcmVxdWlyZWQgdG8gaGF2ZQorICAgIC8vIHRoZSBzYW1lIGJpdCBzaXplIChlLmcuICBmMzIgPC0+IGkzMikuICBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgZm9yCisgICAgLy8gaW50LXRvLWludCBvciBmcC10by1mcCBjb252ZXJzaW9ucywgYnV0IHRoYXQgaXMgYSBub29wLCBkZWxldGVkIGJ5CisgICAgLy8gZ2V0Tm9kZSgpLgorICAgIEJJVF9DT05WRVJULAorCisgICAgLy8gQ09OVkVSVF9STkRTQVQgLSBUaGlzIG9wZXJhdG9yIGlzIHVzZWQgdG8gc3VwcG9ydCB2YXJpb3VzIGNvbnZlcnNpb25zCisgICAgLy8gYmV0d2VlbiB2YXJpb3VzIHR5cGVzIChmbG9hdCwgc2lnbmVkLCB1bnNpZ25lZCBhbmQgdmVjdG9ycyBvZiB0aG9zZQorICAgIC8vIHR5cGVzKSB3aXRoIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uLiBOT1RFOiBBdm9pZCB1c2luZyB0aGlzIG9wZXJhdG9yIGFzCisgICAgLy8gbW9zdCB0YXJnZXQgZG9uJ3Qgc3VwcG9ydCBpdCBhbmQgdGhlIG9wZXJhdG9yIG1pZ2h0IGJlIHJlbW92ZWQgaW4gdGhlCisgICAgLy8gZnV0dXJlLiBJdCB0YWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyAgICAvLyAgIDApIHZhbHVlCisgICAgLy8gICAxKSBkZXN0IHR5cGUgKHR5cGUgdG8gY29udmVydCB0bykKKyAgICAvLyAgIDIpIHNyYyB0eXBlICh0eXBlIHRvIGNvbnZlcnQgZnJvbSkKKyAgICAvLyAgIDMpIHJvdW5kaW5nIGltbQorICAgIC8vICAgNCkgc2F0dXJhdGlvbiBpbW0KKyAgICAvLyAgIDUpIElTRDo6Q3Z0Q29kZSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGNvbnZlcnNpb24gdG8gZG8KKyAgICBDT05WRVJUX1JORFNBVCwKKworICAgIC8vIEZQMTZfVE9fRlAzMiwgRlAzMl9UT19GUDE2IC0gVGhlc2Ugb3BlcmF0b3JzIGFyZSB1c2VkIHRvIHBlcmZvcm0KKyAgICAvLyBwcm9tb3Rpb25zIGFuZCB0cnVuY2F0aW9uIGZvciBoYWxmLXByZWNpc2lvbiAoMTYgYml0KSBmbG9hdGluZworICAgIC8vIG51bWJlcnMuIFdlIG5lZWQgc3BlY2lhbCBub2RlcyBzaW5jZSBGUDE2IGlzIGEgc3RvcmFnZS1vbmx5IHR5cGUgd2l0aAorICAgIC8vIHNwZWNpYWwgc2VtYW50aWNzIG9mIG9wZXJhdGlvbnMuCisgICAgRlAxNl9UT19GUDMyLCBGUDMyX1RPX0ZQMTYsCisKKyAgICAvLyBGTkVHLCBGQUJTLCBGU1FSVCwgRlNJTiwgRkNPUywgRlBPV0ksIEZQT1csCisgICAgLy8gRkxPRywgRkxPRzIsIEZMT0cxMCwgRkVYUCwgRkVYUDIsCisgICAgLy8gRkNFSUwsIEZUUlVOQywgRlJJTlQsIEZORUFSQllJTlQsIEZGTE9PUiAtIFBlcmZvcm0gdmFyaW91cyB1bmFyeSBmbG9hdGluZworICAgIC8vIHBvaW50IG9wZXJhdGlvbnMuIFRoZXNlIGFyZSBpbnNwaXJlZCBieSBsaWJtLgorICAgIEZORUcsIEZBQlMsIEZTUVJULCBGU0lOLCBGQ09TLCBGUE9XSSwgRlBPVywKKyAgICBGTE9HLCBGTE9HMiwgRkxPRzEwLCBGRVhQLCBGRVhQMiwKKyAgICBGQ0VJTCwgRlRSVU5DLCBGUklOVCwgRk5FQVJCWUlOVCwgRkZMT09SLAorCisgICAgLy8gTE9BRCBhbmQgU1RPUkUgaGF2ZSB0b2tlbiBjaGFpbnMgYXMgdGhlaXIgZmlyc3Qgb3BlcmFuZCwgdGhlbiB0aGUgc2FtZQorICAgIC8vIG9wZXJhbmRzIGFzIGFuIExMVk0gbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiwgdGhlbiBhbiBvZmZzZXQgbm9kZSB0aGF0CisgICAgLy8gaXMgYWRkZWQgLyBzdWJ0cmFjdGVkIGZyb20gdGhlIGJhc2UgcG9pbnRlciB0byBmb3JtIHRoZSBhZGRyZXNzIChmb3IKKyAgICAvLyBpbmRleGVkIG1lbW9yeSBvcHMpLgorICAgIExPQUQsIFNUT1JFLAorCisgICAgLy8gRFlOQU1JQ19TVEFDS0FMTE9DIC0gQWxsb2NhdGUgc29tZSBudW1iZXIgb2YgYnl0ZXMgb24gdGhlIHN0YWNrIGFsaWduZWQKKyAgICAvLyB0byBhIHNwZWNpZmllZCBib3VuZGFyeS4gIFRoaXMgbm9kZSBhbHdheXMgaGFzIHR3byByZXR1cm4gdmFsdWVzOiBhIG5ldworICAgIC8vIHN0YWNrIHBvaW50ZXIgdmFsdWUgYW5kIGEgY2hhaW4uIFRoZSBmaXJzdCBvcGVyYW5kIGlzIHRoZSB0b2tlbiBjaGFpbiwKKyAgICAvLyB0aGUgc2Vjb25kIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUsIGFuZCB0aGUgdGhpcmQgaXMgdGhlCisgICAgLy8gYWxpZ25tZW50IGJvdW5kYXJ5LiAgVGhlIHNpemUgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG11bHRpcGxlIG9mIHRoZSBzdGFjaworICAgIC8vIGFsaWdubWVudCwgYW5kIHRoZSBhbGlnbm1lbnQgaXMgZ3VhcmFudGVlZCB0byBiZSBiaWdnZXIgdGhhbiB0aGUgc3RhY2sKKyAgICAvLyBhbGlnbm1lbnQgKGlmIHJlcXVpcmVkKSBvciAwIHRvIGdldCBzdGFuZGFyZCBzdGFjayBhbGlnbm1lbnQuCisgICAgRFlOQU1JQ19TVEFDS0FMTE9DLAorCisgICAgLy8gQ29udHJvbCBmbG93IGluc3RydWN0aW9ucy4gIFRoZXNlIGFsbCBoYXZlIHRva2VuIGNoYWlucy4KKworICAgIC8vIEJSIC0gVW5jb25kaXRpb25hbCBicmFuY2guICBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgY2hhaW4KKyAgICAvLyBvcGVyYW5kLCB0aGUgc2Vjb25kIGlzIHRoZSBNQkIgdG8gYnJhbmNoIHRvLgorICAgIEJSLAorCisgICAgLy8gQlJJTkQgLSBJbmRpcmVjdCBicmFuY2guICBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgY2hhaW4sIHRoZSBzZWNvbmQKKyAgICAvLyBpcyB0aGUgdmFsdWUgdG8gYnJhbmNoIHRvLCB3aGljaCBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHRhcmdldCdzCisgICAgLy8gcG9pbnRlciB0eXBlLgorICAgIEJSSU5ELAorCisgICAgLy8gQlJfSlQgLSBKdW1wdGFibGUgYnJhbmNoLiBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgY2hhaW4sIHRoZSBzZWNvbmQKKyAgICAvLyBpcyB0aGUganVtcHRhYmxlIGluZGV4LCB0aGUgbGFzdCBvbmUgaXMgdGhlIGp1bXB0YWJsZSBlbnRyeSBpbmRleC4KKyAgICBCUl9KVCwKKworICAgIC8vIEJSQ09ORCAtIENvbmRpdGlvbmFsIGJyYW5jaC4gIFRoZSBmaXJzdCBvcGVyYW5kIGlzIHRoZSBjaGFpbiwgdGhlCisgICAgLy8gc2Vjb25kIGlzIHRoZSBjb25kaXRpb24sIHRoZSB0aGlyZCBpcyB0aGUgYmxvY2sgdG8gYnJhbmNoIHRvIGlmIHRoZQorICAgIC8vIGNvbmRpdGlvbiBpcyB0cnVlLiAgSWYgdGhlIHR5cGUgb2YgdGhlIGNvbmRpdGlvbiBpcyBub3QgaTEsIHRoZW4gdGhlCisgICAgLy8gaGlnaCBiaXRzIG11c3QgY29uZm9ybSB0byBnZXRCb29sZWFuQ29udGVudHMuCisgICAgQlJDT05ELAorCisgICAgLy8gQlJfQ0MgLSBDb25kaXRpb25hbCBicmFuY2guICBUaGUgYmVoYXZpb3IgaXMgbGlrZSB0aGF0IG9mIFNFTEVDVF9DQywgaW4KKyAgICAvLyB0aGF0IHRoZSBjb25kaXRpb24gaXMgcmVwcmVzZW50ZWQgYXMgY29uZGl0aW9uIGNvZGUsIGFuZCB0d28gbm9kZXMgdG8KKyAgICAvLyBjb21wYXJlLCByYXRoZXIgdGhhbiBhcyBhIGNvbWJpbmVkIFNldENDIG5vZGUuICBUaGUgb3BlcmFuZHMgaW4gb3JkZXIgYXJlCisgICAgLy8gY2hhaW4sIGNjLCBsaHMsIHJocywgYmxvY2sgdG8gYnJhbmNoIHRvIGlmIGNvbmRpdGlvbiBpcyB0cnVlLgorICAgIEJSX0NDLAorCisgICAgLy8gU1RBQ0tTQVZFIC0gU1RBQ0tTQVZFIGhhcyBvbmUgb3BlcmFuZCwgYW4gaW5wdXQgY2hhaW4uICBJdCBwcm9kdWNlcyBhCisgICAgLy8gdmFsdWUsIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHBvaW50ZXIgdHlwZSBmb3IgdGhlIHN5c3RlbSwgYW5kIGFuIG91dHB1dAorICAgIC8vIGNoYWluLgorICAgIFNUQUNLU0FWRSwKKworICAgIC8vIFNUQUNLUkVTVE9SRSBoYXMgdHdvIG9wZXJhbmRzLCBhbiBpbnB1dCBjaGFpbiBhbmQgYSBwb2ludGVyIHRvIHJlc3RvcmUgdG8KKyAgICAvLyBpdCByZXR1cm5zIGFuIG91dHB1dCBjaGFpbi4KKyAgICBTVEFDS1JFU1RPUkUsCisKKyAgICAvLyBDQUxMU0VRX1NUQVJUL0NBTExTRVFfRU5EIC0gVGhlc2Ugb3BlcmF0b3JzIG1hcmsgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mCisgICAgLy8gYSBjYWxsIHNlcXVlbmNlLCBhbmQgY2FycnkgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIHRoYXQgdGFyZ2V0IG1pZ2h0IHdhbnQKKyAgICAvLyB0byBrbm93LiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMgYSBjaGFpbiwgdGhlIHJlc3QgYXJlIHNwZWNpZmllZCBieSB0aGUKKyAgICAvLyB0YXJnZXQgYW5kIG5vdCB0b3VjaGVkIGJ5IHRoZSBEQUcgb3B0aW1pemVycy4KKyAgICAvLyBDQUxMU0VRX1NUQVJULi5DQUxMU0VRX0VORCBwYWlycyBtYXkgbm90IGJlIG5lc3RlZC4KKyAgICBDQUxMU0VRX1NUQVJULCAgLy8gQmVnaW5uaW5nIG9mIGEgY2FsbCBzZXF1ZW5jZQorICAgIENBTExTRVFfRU5ELCAgICAvLyBFbmQgb2YgYSBjYWxsIHNlcXVlbmNlCisKKyAgICAvLyBWQUFSRyAtIFZBQVJHIGhhcyBmb3VyIG9wZXJhbmRzOiBhbiBpbnB1dCBjaGFpbiwgYSBwb2ludGVyLCBhIFNSQ1ZBTFVFLAorICAgIC8vIGFuZCB0aGUgYWxpZ25tZW50LiBJdCByZXR1cm5zIGEgcGFpciBvZiB2YWx1ZXM6IHRoZSB2YWFyZyB2YWx1ZSBhbmQgYQorICAgIC8vIG5ldyBjaGFpbi4KKyAgICBWQUFSRywKKworICAgIC8vIFZBQ09QWSAtIFZBQ09QWSBoYXMgZml2ZSBvcGVyYW5kczogYW4gaW5wdXQgY2hhaW4sIGEgZGVzdGluYXRpb24gcG9pbnRlciwKKyAgICAvLyBhIHNvdXJjZSBwb2ludGVyLCBhIFNSQ1ZBTFVFIGZvciB0aGUgZGVzdGluYXRpb24sIGFuZCBhIFNSQ1ZBTFVFIGZvciB0aGUKKyAgICAvLyBzb3VyY2UuCisgICAgVkFDT1BZLAorCisgICAgLy8gVkFFTkQsIFZBU1RBUlQgLSBWQUVORCBhbmQgVkFTVEFSVCBoYXZlIHRocmVlIG9wZXJhbmRzOiBhbiBpbnB1dCBjaGFpbiwgYQorICAgIC8vIHBvaW50ZXIsIGFuZCBhIFNSQ1ZBTFVFLgorICAgIFZBRU5ELCBWQVNUQVJULAorCisgICAgLy8gU1JDVkFMVUUgLSBUaGlzIGlzIGEgbm9kZSB0eXBlIHRoYXQgaG9sZHMgYSBWYWx1ZSogdGhhdCBpcyB1c2VkIHRvCisgICAgLy8gbWFrZSByZWZlcmVuY2UgdG8gYSB2YWx1ZSBpbiB0aGUgTExWTSBJUi4KKyAgICBTUkNWQUxVRSwKKyAgICAKKyAgICAvLyBNRE5PREVfU0ROT0RFIC0gVGhpcyBpcyBhIG5vZGUgdGhhdCBob2xkZXMgYW4gTUROb2RlKiwgd2hpY2ggaXMgdXNlZCB0bworICAgIC8vIHJlZmVyZW5jZSBtZXRhZGF0YSBpbiB0aGUgSVIuCisgICAgTUROT0RFX1NETk9ERSwKKworICAgIC8vIFBDTUFSS0VSIC0gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgcGNtYXJrZXIgaW50cmluc2ljLgorICAgIFBDTUFSS0VSLAorCisgICAgLy8gUkVBRENZQ0xFQ09VTlRFUiAtIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHJlYWRjeWNsZWNvdW50ZXIgaW50cmluc2ljLgorICAgIC8vIFRoZSBvbmx5IG9wZXJhbmQgaXMgYSBjaGFpbiBhbmQgYSB2YWx1ZSBhbmQgYSBjaGFpbiBhcmUgcHJvZHVjZWQuICBUaGUKKyAgICAvLyB2YWx1ZSBpcyB0aGUgY29udGVudHMgb2YgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjeWNsZSBjb3VudGVyIGxpa2UKKyAgICAvLyByZWdpc3RlciAob3Igb3RoZXIgaGlnaCBhY2N1cmFjeSBsb3cgbGF0ZW5jeSBjbG9jayBzb3VyY2UpCisgICAgUkVBRENZQ0xFQ09VTlRFUiwKKworICAgIC8vIEhBTkRMRU5PREUgbm9kZSAtIFVzZWQgYXMgYSBoYW5kbGUgZm9yIHZhcmlvdXMgcHVycG9zZXMuCisgICAgSEFORExFTk9ERSwKKworICAgIC8vIFRSQU1QT0xJTkUgLSBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0X3RyYW1wb2xpbmUgaW50cmluc2ljLgorICAgIC8vIEl0IHRha2VzIGFzIGlucHV0IGEgdG9rZW4gY2hhaW4sIHRoZSBwb2ludGVyIHRvIHRoZSB0cmFtcG9saW5lLAorICAgIC8vIHRoZSBwb2ludGVyIHRvIHRoZSBuZXN0ZWQgZnVuY3Rpb24sIHRoZSBwb2ludGVyIHRvIHBhc3MgZm9yIHRoZQorICAgIC8vICduZXN0JyBwYXJhbWV0ZXIsIGEgU1JDVkFMVUUgZm9yIHRoZSB0cmFtcG9saW5lIGFuZCBhbm90aGVyIGZvcgorICAgIC8vIHRoZSBuZXN0ZWQgZnVuY3Rpb24gKGFsbG93aW5nIHRhcmdldHMgdG8gYWNjZXNzIHRoZSBvcmlnaW5hbAorICAgIC8vIEZ1bmN0aW9uKikuICBJdCBwcm9kdWNlcyB0aGUgcmVzdWx0IG9mIHRoZSBpbnRyaW5zaWMgYW5kIGEgdG9rZW4KKyAgICAvLyBjaGFpbiBhcyBvdXRwdXQuCisgICAgVFJBTVBPTElORSwKKworICAgIC8vIFRSQVAgLSBUcmFwcGluZyBpbnN0cnVjdGlvbgorICAgIFRSQVAsCisKKyAgICAvLyBQUkVGRVRDSCAtIFRoaXMgY29ycmVzcG9uZHMgdG8gYSBwcmVmZXRjaCBpbnRyaW5zaWMuIEl0IHRha2VzIGNoYWlucyBhcmUKKyAgICAvLyB0aGVpciBmaXJzdCBvcGVyYW5kLiBUaGUgb3RoZXIgb3BlcmFuZHMgYXJlIHRoZSBhZGRyZXNzIHRvIHByZWZldGNoLAorICAgIC8vIHJlYWQgLyB3cml0ZSBzcGVjaWZpZXIsIGFuZCBsb2NhbGl0eSBzcGVjaWZpZXIuCisgICAgUFJFRkVUQ0gsCisKKyAgICAvLyBPVVRDSEFJTiA9IE1FTUJBUlJJRVIoSU5DSEFJTiwgbG9hZC1sb2FkLCBsb2FkLXN0b3JlLCBzdG9yZS1sb2FkLAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS1zdG9yZSwgZGV2aWNlKQorICAgIC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIG1lbW9yeS5iYXJyaWVyIGludHJpbnNpYy4KKyAgICAvLyBpdCB0YWtlcyBhbiBpbnB1dCBjaGFpbiwgNCBvcGVyYW5kcyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGJhcnJpZXIsIGFuCisgICAgLy8gb3BlcmFuZCBzcGVjaWZ5aW5nIGlmIHRoZSBiYXJyaWVyIGFwcGxpZXMgdG8gZGV2aWNlIGFuZCB1bmNhY2hlZCBtZW1vcnkKKyAgICAvLyBhbmQgcHJvZHVjZXMgYW4gb3V0cHV0IGNoYWluLgorICAgIE1FTUJBUlJJRVIsCisKKyAgICAvLyBWYWwsIE9VVENIQUlOID0gQVRPTUlDX0NNUF9TV0FQKElOQ0hBSU4sIHB0ciwgY21wLCBzd2FwKQorICAgIC8vIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGF0b21pYy5sY3MgaW50cmluc2ljLgorICAgIC8vIGNtcCBpcyBjb21wYXJlZCB0byAqcHRyLCBhbmQgaWYgZXF1YWwsIHN3YXAgaXMgc3RvcmVkIGluICpwdHIuCisgICAgLy8gdGhlIHJldHVybiBpcyBhbHdheXMgdGhlIG9yaWdpbmFsIHZhbHVlIGluICpwdHIKKyAgICBBVE9NSUNfQ01QX1NXQVAsCisKKyAgICAvLyBWYWwsIE9VVENIQUlOID0gQVRPTUlDX1NXQVAoSU5DSEFJTiwgcHRyLCBhbXQpCisgICAgLy8gdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYXRvbWljLnN3YXAgaW50cmluc2ljLgorICAgIC8vIGFtdCBpcyBzdG9yZWQgdG8gKnB0ciBhdG9taWNhbGx5LgorICAgIC8vIHRoZSByZXR1cm4gaXMgYWx3YXlzIHRoZSBvcmlnaW5hbCB2YWx1ZSBpbiAqcHRyCisgICAgQVRPTUlDX1NXQVAsCisKKyAgICAvLyBWYWwsIE9VVENIQUlOID0gQVRPTUlDX0xPQURfW09wTmFtZV0oSU5DSEFJTiwgcHRyLCBhbXQpCisgICAgLy8gdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYXRvbWljLmxvYWQuW09wTmFtZV0gaW50cmluc2ljLgorICAgIC8vIG9wKCpwdHIsIGFtdCkgaXMgc3RvcmVkIHRvICpwdHIgYXRvbWljYWxseS4KKyAgICAvLyB0aGUgcmV0dXJuIGlzIGFsd2F5cyB0aGUgb3JpZ2luYWwgdmFsdWUgaW4gKnB0cgorICAgIEFUT01JQ19MT0FEX0FERCwKKyAgICBBVE9NSUNfTE9BRF9TVUIsCisgICAgQVRPTUlDX0xPQURfQU5ELAorICAgIEFUT01JQ19MT0FEX09SLAorICAgIEFUT01JQ19MT0FEX1hPUiwKKyAgICBBVE9NSUNfTE9BRF9OQU5ELAorICAgIEFUT01JQ19MT0FEX01JTiwKKyAgICBBVE9NSUNfTE9BRF9NQVgsCisgICAgQVRPTUlDX0xPQURfVU1JTiwKKyAgICBBVE9NSUNfTE9BRF9VTUFYLAorCisgICAgLy8vIEJVSUxUSU5fT1BfRU5EIC0gVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGVudW0gdmFsdWUgaW4gdGhpcyBsaXN0LgorICAgIC8vLyBUaGUgdGFyZ2V0LXNwZWNpZmljIHByZS1pc2VsIG9wY29kZSB2YWx1ZXMgc3RhcnQgaGVyZS4KKyAgICBCVUlMVElOX09QX0VORAorICB9OworCisgIC8vLyBGSVJTVF9UQVJHRVRfTUVNT1JZX09QQ09ERSAtIFRhcmdldC1zcGVjaWZpYyBwcmUtaXNlbCBvcGVyYXRpb25zCisgIC8vLyB3aGljaCBkbyBub3QgcmVmZXJlbmNlIGEgc3BlY2lmaWMgbWVtb3J5IGxvY2F0aW9uIHNob3VsZCBiZSBsZXNzIHRoYW4KKyAgLy8vIHRoaXMgdmFsdWUuIFRob3NlIHRoYXQgZG8gbXVzdCBub3QgYmUgbGVzcyB0aGFuIHRoaXMgdmFsdWUsIGFuZCBjYW4KKyAgLy8vIGJlIHVzZWQgd2l0aCBTZWxlY3Rpb25EQUc6OmdldE1lbUludHJpbnNpY05vZGUuCisgIHN0YXRpYyBjb25zdCBpbnQgRklSU1RfVEFSR0VUX01FTU9SWV9PUENPREUgPSBCVUlMVElOX09QX0VORCsxMDA7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBNZW1JbmRleGVkTW9kZSBlbnVtIC0gVGhpcyBlbnVtIGRlZmluZXMgdGhlIGxvYWQgLyBzdG9yZSBpbmRleGVkCisgIC8vLyBhZGRyZXNzaW5nIG1vZGVzLgorICAvLy8KKyAgLy8vIFVOSU5ERVhFRCAgICAiTm9ybWFsIiBsb2FkIC8gc3RvcmUuIFRoZSBlZmZlY3RpdmUgYWRkcmVzcyBpcyBhbHJlYWR5CisgIC8vLyAgICAgICAgICAgICAgY29tcHV0ZWQgYW5kIGlzIGF2YWlsYWJsZSBpbiB0aGUgYmFzZSBwb2ludGVyLiBUaGUgb2Zmc2V0CisgIC8vLyAgICAgICAgICAgICAgb3BlcmFuZCBpcyBhbHdheXMgdW5kZWZpbmVkLiBJbiBhZGRpdGlvbiB0byBwcm9kdWNpbmcgYQorICAvLy8gICAgICAgICAgICAgIGNoYWluLCBhbiB1bmluZGV4ZWQgbG9hZCBwcm9kdWNlcyBvbmUgdmFsdWUgKHJlc3VsdCBvZiB0aGUKKyAgLy8vICAgICAgICAgICAgICBsb2FkKTsgYW4gdW5pbmRleGVkIHN0b3JlIGRvZXMgbm90IHByb2R1Y2UgYSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBQUkVfSU5DICAgICAgU2ltaWxhciB0byB0aGUgdW5pbmRleGVkIG1vZGUgd2hlcmUgdGhlIGVmZmVjdGl2ZSBhZGRyZXNzIGlzCisgIC8vLyBQUkVfREVDICAgICAgdGhlIHZhbHVlIG9mIHRoZSBiYXNlIHBvaW50ZXIgYWRkIC8gc3VidHJhY3QgdGhlIG9mZnNldC4KKyAgLy8vICAgICAgICAgICAgICBJdCBjb25zaWRlcnMgdGhlIGNvbXB1dGF0aW9uIGFzIGJlaW5nIGZvbGRlZCBpbnRvIHRoZSBsb2FkIC8KKyAgLy8vICAgICAgICAgICAgICBzdG9yZSBvcGVyYXRpb24gKGkuZS4gdGhlIGxvYWQgLyBzdG9yZSBkb2VzIHRoZSBhZGRyZXNzCisgIC8vLyAgICAgICAgICAgICAgY29tcHV0YXRpb24gYXMgd2VsbCBhcyBwZXJmb3JtaW5nIHRoZSBtZW1vcnkgdHJhbnNhY3Rpb24pLgorICAvLy8gICAgICAgICAgICAgIFRoZSBiYXNlIG9wZXJhbmQgaXMgYWx3YXlzIHVuZGVmaW5lZC4gSW4gYWRkaXRpb24gdG8KKyAgLy8vICAgICAgICAgICAgICBwcm9kdWNpbmcgYSBjaGFpbiwgcHJlLWluZGV4ZWQgbG9hZCBwcm9kdWNlcyB0d28gdmFsdWVzCisgIC8vLyAgICAgICAgICAgICAgKHJlc3VsdCBvZiB0aGUgbG9hZCBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgYWRkcmVzcworICAvLy8gICAgICAgICAgICAgIGNvbXB1dGF0aW9uKTsgYSBwcmUtaW5kZXhlZCBzdG9yZSBwcm9kdWNlcyBvbmUgdmFsdWUgKHJlc3VsdAorICAvLy8gICAgICAgICAgICAgIG9mIHRoZSBhZGRyZXNzIGNvbXB1dGF0aW9uKS4KKyAgLy8vCisgIC8vLyBQT1NUX0lOQyAgICAgVGhlIGVmZmVjdGl2ZSBhZGRyZXNzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgYmFzZSBwb2ludGVyLiBUaGUKKyAgLy8vIFBPU1RfREVDICAgICB2YWx1ZSBvZiB0aGUgb2Zmc2V0IG9wZXJhbmQgaXMgdGhlbiBhZGRlZCB0byAvIHN1YnRyYWN0ZWQKKyAgLy8vICAgICAgICAgICAgICBmcm9tIHRoZSBiYXNlIGFmdGVyIG1lbW9yeSB0cmFuc2FjdGlvbi4gSW4gYWRkaXRpb24gdG8KKyAgLy8vICAgICAgICAgICAgICBwcm9kdWNpbmcgYSBjaGFpbiwgcG9zdC1pbmRleGVkIGxvYWQgcHJvZHVjZXMgdHdvIHZhbHVlcworICAvLy8gICAgICAgICAgICAgICh0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBiYXNlICsvLSBvZmZzZXQKKyAgLy8vICAgICAgICAgICAgICBjb21wdXRhdGlvbik7IGEgcG9zdC1pbmRleGVkIHN0b3JlIHByb2R1Y2VzIG9uZSB2YWx1ZSAodGhlCisgIC8vLyAgICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgYmFzZSArLy0gb2Zmc2V0IGNvbXB1dGF0aW9uKS4KKyAgLy8vCisgIGVudW0gTWVtSW5kZXhlZE1vZGUgeworICAgIFVOSU5ERVhFRCA9IDAsCisgICAgUFJFX0lOQywKKyAgICBQUkVfREVDLAorICAgIFBPU1RfSU5DLAorICAgIFBPU1RfREVDLAorICAgIExBU1RfSU5ERVhFRF9NT0RFCisgIH07CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBMb2FkRXh0VHlwZSBlbnVtIC0gVGhpcyBlbnVtIGRlZmluZXMgdGhlIHRocmVlIHZhcmlhbnRzIG9mIExPQURFWFQKKyAgLy8vIChsb2FkIHdpdGggZXh0ZW5zaW9uKS4KKyAgLy8vCisgIC8vLyBTRVhUTE9BRCBsb2FkcyB0aGUgaW50ZWdlciBvcGVyYW5kIGFuZCBzaWduIGV4dGVuZHMgaXQgdG8gYSBsYXJnZXIKKyAgLy8vICAgICAgICAgIGludGVnZXIgcmVzdWx0IHR5cGUuCisgIC8vLyBaRVhUTE9BRCBsb2FkcyB0aGUgaW50ZWdlciBvcGVyYW5kIGFuZCB6ZXJvIGV4dGVuZHMgaXQgdG8gYSBsYXJnZXIKKyAgLy8vICAgICAgICAgIGludGVnZXIgcmVzdWx0IHR5cGUuCisgIC8vLyBFWFRMT0FEICBpcyB1c2VkIGZvciB0aHJlZSB0aGluZ3M6IGZsb2F0aW5nIHBvaW50IGV4dGVuZGluZyBsb2FkcywKKyAgLy8vICAgICAgICAgIGludGVnZXIgZXh0ZW5kaW5nIGxvYWRzIFt0aGUgdG9wIGJpdHMgYXJlIHVuZGVmaW5lZF0sIGFuZCB2ZWN0b3IKKyAgLy8vICAgICAgICAgIGV4dGVuZGluZyBsb2FkcyBbbG9hZCBpbnRvIGxvdyBlbHRdLgorICAvLy8KKyAgZW51bSBMb2FkRXh0VHlwZSB7CisgICAgTk9OX0VYVExPQUQgPSAwLAorICAgIEVYVExPQUQsCisgICAgU0VYVExPQUQsCisgICAgWkVYVExPQUQsCisgICAgTEFTVF9MT0FERVhUX1RZUEUKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIElTRDo6Q29uZENvZGUgZW51bSAtIFRoZXNlIGFyZSBvcmRlcmVkIGNhcmVmdWxseSB0byBtYWtlIHRoZSBiaXRmaWVsZHMKKyAgLy8vIGJlbG93IHdvcmsgb3V0LCB3aGVuIGNvbnNpZGVyaW5nIFNFVEZBTFNFIChzb21ldGhpbmcgdGhhdCBuZXZlciBleGlzdHMKKyAgLy8vIGR5bmFtaWNhbGx5KSBhcyAwLiAgIlUiIC0+IFVuc2lnbmVkIChmb3IgaW50ZWdlciBvcGVyYW5kcykgb3IgVW5vcmRlcmVkCisgIC8vLyAoZm9yIGZsb2F0aW5nIHBvaW50KSwgIkwiIC0+IExlc3MgdGhhbiwgIkciIC0+IEdyZWF0ZXIgdGhhbiwgIkUiIC0+IEVxdWFsCisgIC8vLyB0by4gIElmIHRoZSAiTiIgY29sdW1uIGlzIDEsIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgdW5kZWZpbmVkIGlmCisgIC8vLyB0aGUgaW5wdXQgaXMgYSBOQU4uCisgIC8vLworICAvLy8gQWxsIG9mIHRoZXNlIChleGNlcHQgZm9yIHRoZSAnYWx3YXlzIGZvbGRlZCBvcHMnKSBzaG91bGQgYmUgaGFuZGxlZCBmb3IKKyAgLy8vIGZsb2F0aW5nIHBvaW50LiAgRm9yIGludGVnZXIsIG9ubHkgdGhlIFNFVEVRLFNFVE5FLFNFVExULFNFVExFLFNFVEdULAorICAvLy8gU0VUR0UsU0VUVUxULFNFVFVMRSxTRVRVR1QsIGFuZCBTRVRVR0Ugb3Bjb2RlcyBhcmUgdXNlZC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlc2UgYXJlIGxhaWQgb3V0IGluIGEgc3BlY2lmaWMgb3JkZXIgdG8gYWxsb3cgYml0LXR3aWRkbGluZworICAvLy8gdG8gdHJhbnNmb3JtIGNvbmRpdGlvbnMuCisgIGVudW0gQ29uZENvZGUgeworICAgIC8vIE9wY29kZSAgICAgICAgICBOIFUgTCBHIEUgICAgICAgSW50dWl0aXZlIG9wZXJhdGlvbgorICAgIFNFVEZBTFNFLCAgICAgIC8vICAgIDAgMCAwIDAgICAgICAgQWx3YXlzIGZhbHNlIChhbHdheXMgZm9sZGVkKQorICAgIFNFVE9FUSwgICAgICAgIC8vICAgIDAgMCAwIDEgICAgICAgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBlcXVhbAorICAgIFNFVE9HVCwgICAgICAgIC8vICAgIDAgMCAxIDAgICAgICAgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBncmVhdGVyIHRoYW4KKyAgICBTRVRPR0UsICAgICAgICAvLyAgICAwIDAgMSAxICAgICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgU0VUT0xULCAgICAgICAgLy8gICAgMCAxIDAgMCAgICAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGxlc3MgdGhhbgorICAgIFNFVE9MRSwgICAgICAgIC8vICAgIDAgMSAwIDEgICAgICAgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwKKyAgICBTRVRPTkUsICAgICAgICAvLyAgICAwIDEgMSAwICAgICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgb3BlcmFuZHMgYXJlIHVuZXF1YWwKKyAgICBTRVRPLCAgICAgICAgICAvLyAgICAwIDEgMSAxICAgICAgIFRydWUgaWYgb3JkZXJlZCAobm8gbmFucykKKyAgICBTRVRVTywgICAgICAgICAvLyAgICAxIDAgMCAwICAgICAgIFRydWUgaWYgdW5vcmRlcmVkOiBpc25hbihYKSB8IGlzbmFuKFkpCisgICAgU0VUVUVRLCAgICAgICAgLy8gICAgMSAwIDAgMSAgICAgICBUcnVlIGlmIHVub3JkZXJlZCBvciBlcXVhbAorICAgIFNFVFVHVCwgICAgICAgIC8vICAgIDEgMCAxIDAgICAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgZ3JlYXRlciB0aGFuCisgICAgU0VUVUdFLCAgICAgICAgLy8gICAgMSAwIDEgMSAgICAgICBUcnVlIGlmIHVub3JkZXJlZCwgZ3JlYXRlciB0aGFuLCBvciBlcXVhbAorICAgIFNFVFVMVCwgICAgICAgIC8vICAgIDEgMSAwIDAgICAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgbGVzcyB0aGFuCisgICAgU0VUVUxFLCAgICAgICAgLy8gICAgMSAxIDAgMSAgICAgICBUcnVlIGlmIHVub3JkZXJlZCwgbGVzcyB0aGFuLCBvciBlcXVhbAorICAgIFNFVFVORSwgICAgICAgIC8vICAgIDEgMSAxIDAgICAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQgb3Igbm90IGVxdWFsCisgICAgU0VUVFJVRSwgICAgICAgLy8gICAgMSAxIDEgMSAgICAgICBBbHdheXMgdHJ1ZSAoYWx3YXlzIGZvbGRlZCkKKyAgICAvLyBEb24ndCBjYXJlIG9wZXJhdGlvbnM6IHVuZGVmaW5lZCBpZiB0aGUgaW5wdXQgaXMgYSBuYW4uCisgICAgU0VURkFMU0UyLCAgICAgLy8gIDEgWCAwIDAgMCAgICAgICBBbHdheXMgZmFsc2UgKGFsd2F5cyBmb2xkZWQpCisgICAgU0VURVEsICAgICAgICAgLy8gIDEgWCAwIDAgMSAgICAgICBUcnVlIGlmIGVxdWFsCisgICAgU0VUR1QsICAgICAgICAgLy8gIDEgWCAwIDEgMCAgICAgICBUcnVlIGlmIGdyZWF0ZXIgdGhhbgorICAgIFNFVEdFLCAgICAgICAgIC8vICAxIFggMCAxIDEgICAgICAgVHJ1ZSBpZiBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKyAgICBTRVRMVCwgICAgICAgICAvLyAgMSBYIDEgMCAwICAgICAgIFRydWUgaWYgbGVzcyB0aGFuCisgICAgU0VUTEUsICAgICAgICAgLy8gIDEgWCAxIDAgMSAgICAgICBUcnVlIGlmIGxlc3MgdGhhbiBvciBlcXVhbAorICAgIFNFVE5FLCAgICAgICAgIC8vICAxIFggMSAxIDAgICAgICAgVHJ1ZSBpZiBub3QgZXF1YWwKKyAgICBTRVRUUlVFMiwgICAgICAvLyAgMSBYIDEgMSAxICAgICAgIEFsd2F5cyB0cnVlIChhbHdheXMgZm9sZGVkKQorCisgICAgU0VUQ0NfSU5WQUxJRCAgICAgICAvLyBNYXJrZXIgdmFsdWUuCisgIH07CisKKyAgLy8vIGlzU2lnbmVkSW50U2V0Q0MgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc2V0Y2MgaW5zdHJ1Y3Rpb24gdGhhdAorICAvLy8gcGVyZm9ybXMgYSBzaWduZWQgY29tcGFyaXNvbiB3aGVuIHVzZWQgd2l0aCBpbnRlZ2VyIG9wZXJhbmRzLgorICBpbmxpbmUgYm9vbCBpc1NpZ25lZEludFNldENDKENvbmRDb2RlIENvZGUpIHsKKyAgICByZXR1cm4gQ29kZSA9PSBTRVRHVCB8fCBDb2RlID09IFNFVEdFIHx8IENvZGUgPT0gU0VUTFQgfHwgQ29kZSA9PSBTRVRMRTsKKyAgfQorCisgIC8vLyBpc1Vuc2lnbmVkSW50U2V0Q0MgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc2V0Y2MgaW5zdHJ1Y3Rpb24gdGhhdAorICAvLy8gcGVyZm9ybXMgYW4gdW5zaWduZWQgY29tcGFyaXNvbiB3aGVuIHVzZWQgd2l0aCBpbnRlZ2VyIG9wZXJhbmRzLgorICBpbmxpbmUgYm9vbCBpc1Vuc2lnbmVkSW50U2V0Q0MoQ29uZENvZGUgQ29kZSkgeworICAgIHJldHVybiBDb2RlID09IFNFVFVHVCB8fCBDb2RlID09IFNFVFVHRSB8fCBDb2RlID09IFNFVFVMVCB8fCBDb2RlID09IFNFVFVMRTsKKyAgfQorCisgIC8vLyBpc1RydWVXaGVuRXF1YWwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiByZXR1cm5zIHRydWUgaWYKKyAgLy8vIHRoZSB0d28gb3BlcmFuZHMgdG8gdGhlIGNvbmRpdGlvbiBhcmUgZXF1YWwuICBOb3RlIHRoYXQgaWYgb25lIG9mIHRoZSB0d28KKyAgLy8vIG9wZXJhbmRzIGlzIGEgTmFOLCB0aGlzIHZhbHVlIGlzIG1lYW5pbmdsZXNzLgorICBpbmxpbmUgYm9vbCBpc1RydWVXaGVuRXF1YWwoQ29uZENvZGUgQ29uZCkgeworICAgIHJldHVybiAoKGludClDb25kICYgMSkgIT0gMDsKKyAgfQorCisgIC8vLyBnZXRVbm9yZGVyZWRGbGF2b3IgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgY29uZGl0aW9uIGlzIGFsd2F5cworICAvLy8gZmFsc2UgaWYgYW4gb3BlcmFuZCBpcyBhIE5hTiwgMSBpZiB0aGUgY29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIGlmIHRoZQorICAvLy8gb3BlcmFuZCBpcyBhIE5hTiwgYW5kIDIgaWYgdGhlIGNvbmRpdGlvbiBpcyB1bmRlZmluZWQgaWYgdGhlIG9wZXJhbmQgaXMgYQorICAvLy8gTmFOLgorICBpbmxpbmUgdW5zaWduZWQgZ2V0VW5vcmRlcmVkRmxhdm9yKENvbmRDb2RlIENvbmQpIHsKKyAgICByZXR1cm4gKChpbnQpQ29uZCA+PiAzKSAmIDM7CisgIH0KKworICAvLy8gZ2V0U2V0Q0NJbnZlcnNlIC0gUmV0dXJuIHRoZSBvcGVyYXRpb24gY29ycmVzcG9uZGluZyB0byAhKFggb3AgWSksIHdoZXJlCisgIC8vLyAnb3AnIGlzIGEgdmFsaWQgU2V0Q0Mgb3BlcmF0aW9uLgorICBDb25kQ29kZSBnZXRTZXRDQ0ludmVyc2UoQ29uZENvZGUgT3BlcmF0aW9uLCBib29sIGlzSW50ZWdlcik7CisKKyAgLy8vIGdldFNldENDU3dhcHBlZE9wZXJhbmRzIC0gUmV0dXJuIHRoZSBvcGVyYXRpb24gY29ycmVzcG9uZGluZyB0byAoWSBvcCBYKQorICAvLy8gd2hlbiBnaXZlbiB0aGUgb3BlcmF0aW9uIGZvciAoWCBvcCBZKS4KKyAgQ29uZENvZGUgZ2V0U2V0Q0NTd2FwcGVkT3BlcmFuZHMoQ29uZENvZGUgT3BlcmF0aW9uKTsKKworICAvLy8gZ2V0U2V0Q0NPck9wZXJhdGlvbiAtIFJldHVybiB0aGUgcmVzdWx0IG9mIGEgbG9naWNhbCBPUiBiZXR3ZWVuIGRpZmZlcmVudAorICAvLy8gY29tcGFyaXNvbnMgb2YgaWRlbnRpY2FsIHZhbHVlczogKChYIG9wMSBZKSB8IChYIG9wMiBZKSkuICBUaGlzCisgIC8vLyBmdW5jdGlvbiByZXR1cm5zIFNFVENDX0lOVkFMSUQgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUKKyAgLy8vIHJlc3VsdGFudCBjb21wYXJpc29uLgorICBDb25kQ29kZSBnZXRTZXRDQ09yT3BlcmF0aW9uKENvbmRDb2RlIE9wMSwgQ29uZENvZGUgT3AyLCBib29sIGlzSW50ZWdlcik7CisKKyAgLy8vIGdldFNldENDQW5kT3BlcmF0aW9uIC0gUmV0dXJuIHRoZSByZXN1bHQgb2YgYSBsb2dpY2FsIEFORCBiZXR3ZWVuCisgIC8vLyBkaWZmZXJlbnQgY29tcGFyaXNvbnMgb2YgaWRlbnRpY2FsIHZhbHVlczogKChYIG9wMSBZKSAmIChYIG9wMiBZKSkuICBUaGlzCisgIC8vLyBmdW5jdGlvbiByZXR1cm5zIFNFVENDX0lOVkFMSUQgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUKKyAgLy8vIHJlc3VsdGFudCBjb21wYXJpc29uLgorICBDb25kQ29kZSBnZXRTZXRDQ0FuZE9wZXJhdGlvbihDb25kQ29kZSBPcDEsIENvbmRDb2RlIE9wMiwgYm9vbCBpc0ludGVnZXIpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gQ3Z0Q29kZSBlbnVtIC0gVGhpcyBlbnVtIGRlZmluZXMgdGhlIHZhcmlvdXMgY29udmVydHMgQ09OVkVSVF9STkRTQVQKKyAgLy8vIHN1cHBvcnRzLgorICBlbnVtIEN2dENvZGUgeworICAgIENWVF9GRiwgICAgIC8vIEZsb2F0IGZyb20gRmxvYXQKKyAgICBDVlRfRlMsICAgICAvLyBGbG9hdCBmcm9tIFNpZ25lZAorICAgIENWVF9GVSwgICAgIC8vIEZsb2F0IGZyb20gVW5zaWduZWQKKyAgICBDVlRfU0YsICAgICAvLyBTaWduZWQgZnJvbSBGbG9hdAorICAgIENWVF9VRiwgICAgIC8vIFVuc2lnbmVkIGZyb20gRmxvYXQKKyAgICBDVlRfU1MsICAgICAvLyBTaWduZWQgZnJvbSBTaWduZWQKKyAgICBDVlRfU1UsICAgICAvLyBTaWduZWQgZnJvbSBVbnNpZ25lZAorICAgIENWVF9VUywgICAgIC8vIFVuc2lnbmVkIGZyb20gU2lnbmVkCisgICAgQ1ZUX1VVLCAgICAgLy8gVW5zaWduZWQgZnJvbSBVbnNpZ25lZAorICAgIENWVF9JTlZBTElEIC8vIE1hcmtlciAtIEludmFsaWQgb3Bjb2RlCisgIH07CisKK30gLy8gZW5kIGxsdm06OklTRCBuYW1lc3BhY2UKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9JbnRyaW5zaWNMb3dlcmluZy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vSW50cmluc2ljTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWZiYzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vSW50cmluc2ljTG93ZXJpbmcuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0tIEludHJpbnNpY0xvd2VyaW5nLmggLSBJbnRyaW5zaWMgRnVuY3Rpb24gTG93ZXJpbmcgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBJbnRyaW5zaWNMb3dlcmluZyBpbnRlcmZhY2UuICBUaGlzIGludGVyZmFjZSBhbGxvd3MKKy8vIGFkZGl0aW9uIG9mIGRvbWFpbi1zcGVjaWZpYyBvciBmcm9udC1lbmQgc3BlY2lmaWMgaW50cmluc2ljcyB0byBMTFZNIHdpdGhvdXQKKy8vIGhhdmluZyB0byBtb2RpZnkgYWxsIG9mIHRoZSBDIGJhY2tlbmQgb3IgaW50ZXJwcmV0ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fSU5UUklOU0lDTE9XRVJJTkdfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fSU5UUklOU0lDTE9XRVJJTkdfSAorCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQ2FsbEluc3Q7CisgIGNsYXNzIE1vZHVsZTsKKyAgY2xhc3MgVGFyZ2V0RGF0YTsKKworICBjbGFzcyBJbnRyaW5zaWNMb3dlcmluZyB7CisgICAgY29uc3QgVGFyZ2V0RGF0YSYgVEQ7CisKKyAgICAKKyAgICBib29sIFdhcm5lZDsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEludHJpbnNpY0xvd2VyaW5nKGNvbnN0IFRhcmdldERhdGEgJnRkKSA6CisgICAgICBURCh0ZCksIFdhcm5lZChmYWxzZSkge30KKworICAgIC8vLyBBZGRQcm90b3R5cGVzIC0gVGhpcyBtZXRob2QsIGlmIGNhbGxlZCwgY2F1c2VzIGFsbCBvZiB0aGUgcHJvdG90eXBlcworICAgIC8vLyB0aGF0IG1pZ2h0IGJlIG5lZWRlZCBieSBhbiBpbnRyaW5zaWMgbG93ZXJpbmcgaW1wbGVtZW50YXRpb24gdG8gYmUKKyAgICAvLy8gaW5zZXJ0ZWQgaW50byB0aGUgbW9kdWxlIHNwZWNpZmllZC4KKyAgICB2b2lkIEFkZFByb3RvdHlwZXMoTW9kdWxlICZNKTsKKworICAgIC8vLyBMb3dlckludHJpbnNpY0NhbGwgLSBUaGlzIG1ldGhvZCByZXBsYWNlcyBhIGNhbGwgd2l0aCB0aGUgTExWTSBmdW5jdGlvbgorICAgIC8vLyB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHNwZWNpZmllZCBpbnRyaW5zaWMgZnVuY3Rpb24gY2FsbC4KKyAgICAvLy8gSWYgYW4gaW50cmluc2ljIGZ1bmN0aW9uIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIAorICAgIC8vLyAoc3VjaCBhcyB2YV9zdGFydCksIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHByaW50IGEgbWVzc2FnZSBhbmQgYWJvcnQuCisgICAgLy8vCisgICAgLy8vIE90aGVyd2lzZSwgaWYgYW4gaW50cmluc2ljIGZ1bmN0aW9uIGNhbGwgY2FuIGJlIGxvd2VyZWQsIHRoZSBjb2RlIHRvCisgICAgLy8vIGltcGxlbWVudCBpdCAob2Z0ZW4gYSBjYWxsIHRvIGEgbm9uLWludHJpbnNpYyBmdW5jdGlvbikgaXMgaW5zZXJ0ZWQKKyAgICAvLy8gX2FmdGVyXyB0aGUgY2FsbCBpbnN0cnVjdGlvbiBhbmQgdGhlIGNhbGwgaXMgZGVsZXRlZC4gIFRoZSBjYWxsZXIgbXVzdAorICAgIC8vLyBiZSBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoaXMga2luZCBvZiBjaGFuZ2UuCisgICAgLy8vCisgICAgdm9pZCBMb3dlckludHJpbnNpY0NhbGwoQ2FsbEluc3QgKkNJKTsKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9KSVRDb2RlRW1pdHRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vSklUQ29kZUVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjM3M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vSklUQ29kZUVtaXR0ZXIuaApAQCAtMCwwICsxLDM0MyBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vSklUQ29kZUVtaXR0ZXIuaCAtIENvZGUgZW1pc3Npb24gLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGFic3RyYWN0IGludGVyZmFjZSB0aGF0IGlzIHVzZWQgYnkgdGhlIG1hY2hpbmUgY29kZQorLy8gZW1pc3Npb24gZnJhbWV3b3JrIHRvIG91dHB1dCB0aGUgY29kZS4gIFRoaXMgYWxsb3dzIG1hY2hpbmUgY29kZSBlbWlzc2lvbiB0bworLy8gYmUgc2VwYXJhdGVkIGZyb20gY29uY2VybnMgc3VjaCBhcyByZXNvbHV0aW9uIG9mIGNhbGwgdGFyZ2V0cywgYW5kIHdoZXJlIHRoZQorLy8gbWFjaGluZSBjb2RlIHdpbGwgYmUgd3JpdHRlbiAobWVtb3J5IG9yIGRpc2ssIGYuZS4pLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0pJVENPREVFTUlUVEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0pJVENPREVFTUlUVEVSX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29kZUVtaXR0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbDsKK2NsYXNzIE1hY2hpbmVKdW1wVGFibGVJbmZvOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZU1vZHVsZUluZm87CitjbGFzcyBNYWNoaW5lUmVsb2NhdGlvbjsKK2NsYXNzIFZhbHVlOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBGdW5jdGlvbjsKKyAgCisvLy8gSklUQ29kZUVtaXR0ZXIgLSBUaGlzIGNsYXNzIGRlZmluZXMgdHdvIHNvcnRzIG9mIG1ldGhvZHM6IHRob3NlIGZvcgorLy8vIGVtaXR0aW5nIHRoZSBhY3R1YWwgYnl0ZXMgb2YgbWFjaGluZSBjb2RlLCBhbmQgdGhvc2UgZm9yIGVtaXR0aW5nIGF1eGlsbGFyeQorLy8vIHN0cnVjdHVyZXMsIHN1Y2ggYXMganVtcCB0YWJsZXMsIHJlbG9jYXRpb25zLCBldGMuCisvLy8KKy8vLyBFbWlzc2lvbiBvZiBtYWNoaW5lIGNvZGUgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB3ZSBkb24ndCAoaW4KKy8vLyBnZW5lcmFsKSBrbm93IHRoZSBzaXplIG9mIHRoZSBtYWNoaW5lIGNvZGUgdGhhdCB3ZSdyZSBhYm91dCB0byBlbWl0IGJlZm9yZQorLy8vIHdlIGVtaXQgaXQuICBBcyBzdWNoLCB3ZSBwcmVhbGxvY2F0ZSBhIGNlcnRhaW4gYW1vdW50IG9mIG1lbW9yeSwgYW5kIHNldCB0aGUKKy8vLyBCdWZmZXJCZWdpbi9CdWZmZXJFbmQgcG9pbnRlcnMgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGJ1ZmZlci4gIEFzIHdlCisvLy8gZW1pdCBtYWNoaW5lIGluc3RydWN0aW9ucywgd2UgYWR2YW5jZSB0aGUgQ3VyQnVmZmVyUHRyIHRvIGluZGljYXRlIHRoZQorLy8vIGxvY2F0aW9uIG9mIHRoZSBuZXh0IGJ5dGUgdG8gZW1pdC4gIEluIHRoZSBjYXNlIG9mIGEgYnVmZmVyIG92ZXJmbG93ICh3ZQorLy8vIG5lZWQgdG8gZW1pdCBtb3JlIG1hY2hpbmUgY29kZSB0aGFuIHdlIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvciksIHRoZQorLy8vIEN1ckJ1ZmZlclB0ciB3aWxsIHNhdHVyYXRlIHRvIEJ1ZmZlckVuZCBhbmQgaWdub3JlIHN0b3Jlcy4gIE9uY2UgdGhlIGVudGlyZQorLy8vIGZ1bmN0aW9uIGhhcyBiZWVuIGVtaXR0ZWQsIHRoZSBvdmVyZmxvdyBjb25kaXRpb24gaXMgY2hlY2tlZCwgYW5kIGlmIGl0IGhhcworLy8vIG9jY3VycmVkLCBtb3JlIG1lbW9yeSBpcyBhbGxvY2F0ZWQsIGFuZCB3ZSByZWVtaXQgdGhlIGNvZGUgaW50byBpdC4KKy8vLyAKK2NsYXNzIEpJVENvZGVFbWl0dGVyIDogcHVibGljIE1hY2hpbmVDb2RlRW1pdHRlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkpJVENvZGVFbWl0dGVyKCkge30KKworICAvLy8gc3RhcnRGdW5jdGlvbiAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaXMKKyAgLy8vIGFib3V0IHRvIGJlIGNvZGUgZ2VuZXJhdGVkLiAgVGhpcyBpbml0aWFsaXplcyB0aGUgQnVmZmVyQmVnaW4vRW5kL1B0cgorICAvLy8gZmllbGRzLgorICAvLy8KKyAgdmlydHVhbCB2b2lkIHN0YXJ0RnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSA9IDA7CisKKyAgLy8vIGZpbmlzaEZ1bmN0aW9uIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBoYXMKKyAgLy8vIGZpbmlzaGVkIGNvZGUgZ2VuZXJhdGlvbi4gIElmIGEgYnVmZmVyIG92ZXJmbG93IGhhcyBvY2N1cnJlZCwgdGhpcyBtZXRob2QKKyAgLy8vIHJldHVybnMgdHJ1ZSAodGhlIGNhbGxlZSBpcyByZXF1aXJlZCB0byB0cnkgYWdhaW4pLCBvdGhlcndpc2UgaXQgcmV0dXJucworICAvLy8gZmFsc2UuCisgIC8vLworICB2aXJ0dWFsIGJvb2wgZmluaXNoRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSA9IDA7CisgIAorICAvLy8gYWxsb2NJbmRpcmVjdEdWIC0gQWxsb2NhdGVzIGFuZCBmaWxscyBzdG9yYWdlIGZvciBhbiBpbmRpcmVjdAorICAvLy8gR2xvYmFsVmFsdWUsIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzLgorICB2aXJ0dWFsIHZvaWQgKmFsbG9jSW5kaXJlY3RHVihjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKkJ1ZmZlciwgc2l6ZV90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCkgPSAwOworCisgIC8vLyBlbWl0Qnl0ZSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgYnl0ZSBuZWVkcyB0byBiZSB3cml0dGVuIHRvIHRoZQorICAvLy8gb3V0cHV0IHN0cmVhbS4KKyAgLy8vCisgIHZvaWQgZW1pdEJ5dGUodWludDhfdCBCKSB7CisgICAgaWYgKEN1ckJ1ZmZlclB0ciAhPSBCdWZmZXJFbmQpCisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSBCOworICB9CisKKyAgLy8vIGVtaXRXb3JkTEUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDMyLWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorICAvLy8KKyAgdm9pZCBlbWl0V29yZExFKHVpbnQzMl90IFcpIHsKKyAgICBpZiAoNCA8PSBCdWZmZXJFbmQtQ3VyQnVmZmVyUHRyKSB7CisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSAodWludDhfdCkoVyA+PiAgMCk7CisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSAodWludDhfdCkoVyA+PiAgOCk7CisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSAodWludDhfdCkoVyA+PiAxNik7CisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSAodWludDhfdCkoVyA+PiAyNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEN1ckJ1ZmZlclB0ciA9IEJ1ZmZlckVuZDsKKyAgICB9CisgIH0KKyAgCisgIC8vLyBlbWl0V29yZEJFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAzMi1iaXQgd29yZCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBiaWctZW5kaWFuIGZvcm1hdC4KKyAgLy8vCisgIHZvaWQgZW1pdFdvcmRCRSh1aW50MzJfdCBXKSB7CisgICAgaWYgKDQgPD0gQnVmZmVyRW5kLUN1ckJ1ZmZlclB0cikgeworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gMjQpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gMTYpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gIDgpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gIDApOworICAgIH0gZWxzZSB7CisgICAgICBDdXJCdWZmZXJQdHIgPSBCdWZmZXJFbmQ7CisgICAgfQorICB9CisKKyAgLy8vIGVtaXREV29yZExFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSA2NC1iaXQgd29yZCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKyAgLy8vCisgIHZvaWQgZW1pdERXb3JkTEUodWludDY0X3QgVykgeworICAgIGlmICg4IDw9IEJ1ZmZlckVuZC1DdXJCdWZmZXJQdHIpIHsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+ICAwKTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+ICA4KTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDE2KTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDI0KTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDMyKTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDQwKTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDQ4KTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDU2KTsKKyAgICB9IGVsc2UgeworICAgICAgQ3VyQnVmZmVyUHRyID0gQnVmZmVyRW5kOworICAgIH0KKyAgfQorICAKKyAgLy8vIGVtaXREV29yZEJFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSA2NC1iaXQgd29yZCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBiaWctZW5kaWFuIGZvcm1hdC4KKyAgLy8vCisgIHZvaWQgZW1pdERXb3JkQkUodWludDY0X3QgVykgeworICAgIGlmICg4IDw9IEJ1ZmZlckVuZC1DdXJCdWZmZXJQdHIpIHsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDU2KTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDQ4KTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDQwKTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDMyKTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDI0KTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+IDE2KTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+ICA4KTsKKyAgICAgICpDdXJCdWZmZXJQdHIrKyA9ICh1aW50OF90KShXID4+ICAwKTsKKyAgICB9IGVsc2UgeworICAgICAgQ3VyQnVmZmVyUHRyID0gQnVmZmVyRW5kOworICAgIH0KKyAgfQorCisgIC8vLyBlbWl0QWxpZ25tZW50IC0gTW92ZSB0aGUgQ3VyQnVmZmVyUHRyIHBvaW50ZXIgdXAgdG8gdGhlIHNwZWNpZmllZAorICAvLy8gYWxpZ25tZW50IChzYXR1cmF0ZWQgdG8gQnVmZmVyRW5kIG9mIGNvdXJzZSkuCisgIHZvaWQgZW1pdEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgICBpZiAoQWxpZ25tZW50ID09IDApIEFsaWdubWVudCA9IDE7CisgICAgdWludDhfdCAqTmV3UHRyID0gKHVpbnQ4X3QqKVJvdW5kVXBUb0FsaWdubWVudCgodWludHB0cl90KUN1ckJ1ZmZlclB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCk7CisgICAgQ3VyQnVmZmVyUHRyID0gc3RkOjptaW4oTmV3UHRyLCBCdWZmZXJFbmQpOworICB9CisKKyAgLy8vIGVtaXRBbGlnbm1lbnRXaXRoRmlsbCAtIFNpbWlsYXIgdG8gZW1pdEFsaWdubWVudCwgZXhjZXB0IHRoYXQgdGhlCisgIC8vLyBleHRyYSBieXRlcyBhcmUgZmlsbGVkIHdpdGggdGhlIHByb3ZpZGVkIGJ5dGUuCisgIHZvaWQgZW1pdEFsaWdubWVudFdpdGhGaWxsKHVuc2lnbmVkIEFsaWdubWVudCwgdWludDhfdCBGaWxsKSB7CisgICAgaWYgKEFsaWdubWVudCA9PSAwKSBBbGlnbm1lbnQgPSAxOworICAgIHVpbnQ4X3QgKk5ld1B0ciA9ICh1aW50OF90KilSb3VuZFVwVG9BbGlnbm1lbnQoKHVpbnRwdHJfdClDdXJCdWZmZXJQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQpOworICAgIC8vIEZhaWwgaWYgd2UgZG9uJ3QgaGF2ZSByb29tLgorICAgIGlmIChOZXdQdHIgPiBCdWZmZXJFbmQpIHsKKyAgICAgIEN1ckJ1ZmZlclB0ciA9IEJ1ZmZlckVuZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUgKEN1ckJ1ZmZlclB0ciA8IE5ld1B0cikgeworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gRmlsbDsKKyAgICB9CisgIH0KKworICAvLy8gZW1pdFVMRUIxMjhCeXRlcyAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgVUxFQjEyOCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBlbWl0VUxFQjEyOEJ5dGVzKHVpbnQ2NF90IFZhbHVlLCB1bnNpZ25lZCBQYWRUbyA9IDApIHsKKyAgICBkbyB7CisgICAgICB1aW50OF90IEJ5dGUgPSBWYWx1ZSAmIDB4N2Y7CisgICAgICBWYWx1ZSA+Pj0gNzsKKyAgICAgIGlmIChWYWx1ZSB8fCBQYWRUbyAhPSAwKSBCeXRlIHw9IDB4ODA7CisgICAgICBlbWl0Qnl0ZShCeXRlKTsKKyAgICB9IHdoaWxlIChWYWx1ZSk7CisKKyAgICBpZiAoUGFkVG8pIHsKKyAgICAgIGRvIHsKKyAgICAgICAgdWludDhfdCBCeXRlID0gKFBhZFRvID4gMSkgPyAweDgwIDogMHgwOworICAgICAgICBlbWl0Qnl0ZShCeXRlKTsKKyAgICAgIH0gd2hpbGUgKC0tUGFkVG8pOworICAgIH0KKyAgfQorICAKKyAgLy8vIGVtaXRTTEVCMTI4Qnl0ZXMgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIFNMRUIxMjggbmVlZHMgdG8gYmUKKyAgLy8vIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCisgIHZvaWQgZW1pdFNMRUIxMjhCeXRlcyhpbnQ2NF90IFZhbHVlKSB7CisgICAgaW50MzJfdCBTaWduID0gVmFsdWUgPj4gKDggKiBzaXplb2YoVmFsdWUpIC0gMSk7CisgICAgYm9vbCBJc01vcmU7CisgIAorICAgIGRvIHsKKyAgICAgIHVpbnQ4X3QgQnl0ZSA9IFZhbHVlICYgMHg3ZjsKKyAgICAgIFZhbHVlID4+PSA3OworICAgICAgSXNNb3JlID0gVmFsdWUgIT0gU2lnbiB8fCAoKEJ5dGUgXiBTaWduKSAmIDB4NDApICE9IDA7CisgICAgICBpZiAoSXNNb3JlKSBCeXRlIHw9IDB4ODA7CisgICAgICBlbWl0Qnl0ZShCeXRlKTsKKyAgICB9IHdoaWxlIChJc01vcmUpOworICB9CisKKyAgLy8vIGVtaXRTdHJpbmcgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIFN0cmluZyBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBlbWl0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHJpbmcpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBOID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFN0cmluZy5zaXplKCkpOworICAgICAgICAgaSA8IE47ICsraSkgeworICAgICAgdWludDhfdCBDID0gU3RyaW5nW2ldOworICAgICAgZW1pdEJ5dGUoQyk7CisgICAgfQorICAgIGVtaXRCeXRlKDApOworICB9CisgIAorICAvLy8gZW1pdEludDMyIC0gRW1pdCBhIGludDMyIGRpcmVjdGl2ZS4KKyAgdm9pZCBlbWl0SW50MzIodWludDMyX3QgVmFsdWUpIHsKKyAgICBpZiAoNCA8PSBCdWZmZXJFbmQtQ3VyQnVmZmVyUHRyKSB7CisgICAgICAqKCh1aW50MzJfdCopQ3VyQnVmZmVyUHRyKSA9IFZhbHVlOworICAgICAgQ3VyQnVmZmVyUHRyICs9IDQ7CisgICAgfSBlbHNlIHsKKyAgICAgIEN1ckJ1ZmZlclB0ciA9IEJ1ZmZlckVuZDsKKyAgICB9CisgIH0KKworICAvLy8gZW1pdEludDY0IC0gRW1pdCBhIGludDY0IGRpcmVjdGl2ZS4KKyAgdm9pZCBlbWl0SW50NjQodWludDY0X3QgVmFsdWUpIHsKKyAgICBpZiAoOCA8PSBCdWZmZXJFbmQtQ3VyQnVmZmVyUHRyKSB7CisgICAgICAqKCh1aW50NjRfdCopQ3VyQnVmZmVyUHRyKSA9IFZhbHVlOworICAgICAgQ3VyQnVmZmVyUHRyICs9IDg7CisgICAgfSBlbHNlIHsKKyAgICAgIEN1ckJ1ZmZlclB0ciA9IEJ1ZmZlckVuZDsKKyAgICB9CisgIH0KKyAgCisgIC8vLyBlbWl0SW50MzJBdCAtIEVtaXQgdGhlIEludDMyIFZhbHVlIGluIEFkZHIuCisgIHZvaWQgZW1pdEludDMyQXQodWludHB0cl90ICpBZGRyLCB1aW50cHRyX3QgVmFsdWUpIHsKKyAgICBpZiAoQWRkciA+PSAodWludHB0cl90KilCdWZmZXJCZWdpbiAmJiBBZGRyIDwgKHVpbnRwdHJfdCopQnVmZmVyRW5kKQorICAgICAgKCoodWludDMyX3QqKUFkZHIpID0gKHVpbnQzMl90KVZhbHVlOworICB9CisgIAorICAvLy8gZW1pdEludDY0QXQgLSBFbWl0IHRoZSBJbnQ2NCBWYWx1ZSBpbiBBZGRyLgorICB2b2lkIGVtaXRJbnQ2NEF0KHVpbnRwdHJfdCAqQWRkciwgdWludHB0cl90IFZhbHVlKSB7CisgICAgaWYgKEFkZHIgPj0gKHVpbnRwdHJfdCopQnVmZmVyQmVnaW4gJiYgQWRkciA8ICh1aW50cHRyX3QqKUJ1ZmZlckVuZCkKKyAgICAgICgqKHVpbnQ2NF90KilBZGRyKSA9ICh1aW50NjRfdClWYWx1ZTsKKyAgfQorICAKKyAgCisgIC8vLyBlbWl0TGFiZWwgLSBFbWl0cyBhIGxhYmVsCisgIHZpcnR1YWwgdm9pZCBlbWl0TGFiZWwoTUNTeW1ib2wgKkxhYmVsKSA9IDA7CisKKyAgLy8vIGFsbG9jYXRlU3BhY2UgLSBBbGxvY2F0ZSBhIGJsb2NrIG9mIHNwYWNlIGluIHRoZSBjdXJyZW50IG91dHB1dCBidWZmZXIsCisgIC8vLyByZXR1cm5pbmcgbnVsbCAoYW5kIHNldHRpbmcgY29uZGl0aW9ucyB0byBpbmRpY2F0ZSBidWZmZXIgb3ZlcmZsb3cpIG9uCisgIC8vLyBmYWlsdXJlLiAgQWxpZ25tZW50IGlzIHRoZSBhbGlnbm1lbnQgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciBkZXNpcmVkLgorICB2aXJ0dWFsIHZvaWQgKmFsbG9jYXRlU3BhY2UodWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCkgeworICAgIGVtaXRBbGlnbm1lbnQoQWxpZ25tZW50KTsKKyAgICB2b2lkICpSZXN1bHQ7CisgICAgCisgICAgLy8gQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdy4KKyAgICBpZiAoU2l6ZSA+PSAodWludHB0cl90KShCdWZmZXJFbmQtQ3VyQnVmZmVyUHRyKSkgeworICAgICAgQ3VyQnVmZmVyUHRyID0gQnVmZmVyRW5kOworICAgICAgUmVzdWx0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQWxsb2NhdGUgdGhlIHNwYWNlLgorICAgICAgUmVzdWx0ID0gQ3VyQnVmZmVyUHRyOworICAgICAgQ3VyQnVmZmVyUHRyICs9IFNpemU7CisgICAgfQorICAgIAorICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gYWxsb2NhdGVHbG9iYWwgLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgZ2xvYmFsLiAgVW5saWtlIGFsbG9jYXRlU3BhY2UsCisgIC8vLyB0aGlzIG1ldGhvZCBkb2VzIG5vdCBhbGxvY2F0ZSBtZW1vcnkgaW4gdGhlIGN1cnJlbnQgb3V0cHV0IGJ1ZmZlciwKKyAgLy8vIGJlY2F1c2UgYSBnbG9iYWwgbWF5IGxpdmUgbG9uZ2VyIHRoYW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIHZpcnR1YWwgdm9pZCAqYWxsb2NhdGVHbG9iYWwodWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCkgPSAwOworCisgIC8vLyBTdGFydE1hY2hpbmVCYXNpY0Jsb2NrIC0gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSB0YXJnZXQgd2hlbiBhIG5ldworICAvLy8gYmFzaWMgYmxvY2sgaXMgYWJvdXQgdG8gYmUgZW1pdHRlZC4gIFRoaXMgd2F5IHRoZSBNQ0Uga25vd3Mgd2hlcmUgdGhlCisgIC8vLyBzdGFydCBvZiB0aGUgYmxvY2sgaXMsIGFuZCBjYW4gaW1wbGVtZW50IGdldE1hY2hpbmVCYXNpY0Jsb2NrQWRkcmVzcy4KKyAgdmlydHVhbCB2b2lkIFN0YXJ0TWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgPSAwOworICAKKyAgLy8vIGdldEN1cnJlbnRQQ1ZhbHVlIC0gVGhpcyByZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgdGhlIG5leHQgZW1pdHRlZCBieXRlCisgIC8vLyB3aWxsIGJlIG91dHB1dCB0by4KKyAgLy8vCisgIHZpcnR1YWwgdWludHB0cl90IGdldEN1cnJlbnRQQ1ZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiAodWludHB0cl90KUN1ckJ1ZmZlclB0cjsKKyAgfQorCisgIC8vLyBnZXRDdXJyZW50UENPZmZzZXQgLSBSZXR1cm4gdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZW1pdHRlZAorICAvLy8gYnVmZmVyIHRoYXQgd2UgYXJlIGN1cnJlbnRseSB3cml0aW5nIHRvLgorICB1aW50cHRyX3QgZ2V0Q3VycmVudFBDT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBDdXJCdWZmZXJQdHItQnVmZmVyQmVnaW47CisgIH0KKworICAvLy8gZWFybHlSZXNvbHZlQWRkcmVzc2VzIC0gVHJ1ZSBpZiB0aGUgY29kZSBlbWl0dGVyIGNhbiB1c2Ugc3ltYm9sIGFkZHJlc3NlcyAKKyAgLy8vIGR1cmluZyBjb2RlIGVtaXNzaW9uIHRpbWUuIFRoZSBKSVQgaXMgY2FwYWJsZSBvZiBkb2luZyB0aGlzIGJlY2F1c2UgaXQKKyAgLy8vIGNyZWF0ZXMganVtcCB0YWJsZXMgb3IgY29uc3RhbnQgcG9vbHMgaW4gbWVtb3J5IG9uIHRoZSBmbHkgd2hpbGUgdGhlCisgIC8vLyBvYmplY3QgY29kZSBlbWl0dGVycyByZWx5IG9uIGEgbGlua2VyIHRvIGhhdmUgcmVhbCBhZGRyZXNzZXMgYW5kIHNob3VsZAorICAvLy8gdXNlIHJlbG9jYXRpb25zIGluc3RlYWQuCisgIGJvb2wgZWFybHlSZXNvbHZlQWRkcmVzc2VzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBhZGRSZWxvY2F0aW9uIC0gV2hlbmV2ZXIgYSByZWxvY2F0YWJsZSBhZGRyZXNzIGlzIG5lZWRlZCwgaXQgc2hvdWxkIGJlCisgIC8vLyBub3RlZCB3aXRoIHRoaXMgaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgYWRkUmVsb2NhdGlvbihjb25zdCBNYWNoaW5lUmVsb2NhdGlvbiAmTVIpID0gMDsKKyAgCisgIC8vLyBGSVhNRTogVGhlc2Ugc2hvdWxkIGFsbCBiZSBoYW5kbGVkIHdpdGggcmVsb2NhdGlvbnMhCisgIAorICAvLy8gZ2V0Q29uc3RhbnRQb29sRW50cnlBZGRyZXNzIC0gUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSAnSW5kZXgnIGVudHJ5IGluCisgIC8vLyB0aGUgY29uc3RhbnQgcG9vbCB0aGF0IHdhcyBsYXN0IGVtaXR0ZWQgd2l0aCB0aGUgZW1pdENvbnN0YW50UG9vbCBtZXRob2QuCisgIC8vLworICB2aXJ0dWFsIHVpbnRwdHJfdCBnZXRDb25zdGFudFBvb2xFbnRyeUFkZHJlc3ModW5zaWduZWQgSW5kZXgpIGNvbnN0ID0gMDsKKworICAvLy8gZ2V0SnVtcFRhYmxlRW50cnlBZGRyZXNzIC0gUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBqdW1wIHRhYmxlIHdpdGggaW5kZXgKKyAgLy8vICdJbmRleCcgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgbGFzdCBjYWxsZWQgaW5pdEp1bXBUYWJsZUluZm8uCisgIC8vLworICB2aXJ0dWFsIHVpbnRwdHJfdCBnZXRKdW1wVGFibGVFbnRyeUFkZHJlc3ModW5zaWduZWQgSW5kZXgpIGNvbnN0ID0gMDsKKyAgCisgIC8vLyBnZXRNYWNoaW5lQmFzaWNCbG9ja0FkZHJlc3MgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZAorICAvLy8gTWFjaGluZUJhc2ljQmxvY2ssIG9ubHkgdXNhYmxlIGFmdGVyIHRoZSBsYWJlbCBmb3IgdGhlIE1CQiBoYXMgYmVlbgorICAvLy8gZW1pdHRlZC4KKyAgLy8vCisgIHZpcnR1YWwgdWludHB0cl90IGdldE1hY2hpbmVCYXNpY0Jsb2NrQWRkcmVzcyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdD0gMDsKKworICAvLy8gZ2V0TGFiZWxBZGRyZXNzIC0gUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgTGFiZWwsIG9ubHkgdXNhYmxlCisgIC8vLyBhZnRlciB0aGUgTGFiZWwgaGFzIGJlZW4gZW1pdHRlZC4KKyAgLy8vCisgIHZpcnR1YWwgdWludHB0cl90IGdldExhYmVsQWRkcmVzcyhNQ1N5bWJvbCAqTGFiZWwpIGNvbnN0ID0gMDsKKyAgCisgIC8vLyBTcGVjaWZpZXMgdGhlIE1hY2hpbmVNb2R1bGVJbmZvIG9iamVjdC4gVGhpcyBpcyB1c2VkIGZvciBleGNlcHRpb24gaGFuZGxpbmcKKyAgLy8vIHB1cnBvc2VzLgorICB2aXJ0dWFsIHZvaWQgc2V0TW9kdWxlSW5mbyhNYWNoaW5lTW9kdWxlSW5mbyogSW5mbykgPSAwOworCisgIC8vLyBnZXRMYWJlbExvY2F0aW9ucyAtIFJldHVybiB0aGUgbGFiZWwgbG9jYXRpb25zIG1hcCBvZiB0aGUgbGFiZWwgSURzIHRvCisgIC8vLyB0aGVpciBhZGRyZXNzLgorICB2aXJ0dWFsIERlbnNlTWFwPE1DU3ltYm9sKiwgdWludHB0cl90PiAqZ2V0TGFiZWxMb2NhdGlvbnMoKSB7IHJldHVybiAwOyB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xhdGVuY3lQcmlvcml0eVF1ZXVlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MYXRlbmN5UHJpb3JpdHlRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2ViZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MYXRlbmN5UHJpb3JpdHlRdWV1ZS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8vPT09LS0tLSBMYXRlbmN5UHJpb3JpdHlRdWV1ZS5oIC0gQSBsYXRlbmN5LW9yaWVudGVkIHByaW9yaXR5IHF1ZXVlIC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBMYXRlbmN5UHJpb3JpdHlRdWV1ZSBjbGFzcywgd2hpY2ggaXMgYQorLy8gU2NoZWR1bGluZ1ByaW9yaXR5UXVldWUgdGhhdCBzY2hlZHVsZXMgdXNpbmcgbGF0ZW5jeSBpbmZvcm1hdGlvbiB0bworLy8gcmVkdWNlIHRoZSBsZW5ndGggb2YgdGhlIGNyaXRpY2FsIHBhdGggdGhyb3VnaCB0aGUgYmFzaWMgYmxvY2suCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMQVRFTkNZX1BSSU9SSVRZX1FVRVVFX0gKKyNkZWZpbmUgTEFURU5DWV9QUklPUklUWV9RVUVVRV9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBMYXRlbmN5UHJpb3JpdHlRdWV1ZTsKKyAgCisgIC8vLyBTb3J0aW5nIGZ1bmN0aW9ucyBmb3IgdGhlIEF2YWlsYWJsZSBxdWV1ZS4KKyAgc3RydWN0IGxhdGVuY3lfc29ydCA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxTVW5pdCosIFNVbml0KiwgYm9vbD4geworICAgIExhdGVuY3lQcmlvcml0eVF1ZXVlICpQUTsKKyAgICBleHBsaWNpdCBsYXRlbmN5X3NvcnQoTGF0ZW5jeVByaW9yaXR5UXVldWUgKnBxKSA6IFBRKHBxKSB7fQorICAgIAorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBTVW5pdCogbGVmdCwgY29uc3QgU1VuaXQqIHJpZ2h0KSBjb25zdDsKKyAgfTsKKworICBjbGFzcyBMYXRlbmN5UHJpb3JpdHlRdWV1ZSA6IHB1YmxpYyBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSB7CisgICAgLy8gU1VuaXRzIC0gVGhlIFNVbml0cyBmb3IgdGhlIGN1cnJlbnQgZ3JhcGguCisgICAgc3RkOjp2ZWN0b3I8U1VuaXQ+ICpTVW5pdHM7CisgICAgCisgICAgLy8vIE51bU5vZGVzU29sZWx5QmxvY2tpbmcgLSBUaGlzIHZlY3RvciBjb250YWlucywgZm9yIGV2ZXJ5IG5vZGUgaW4gdGhlCisgICAgLy8vIFF1ZXVlLCB0aGUgbnVtYmVyIG9mIG5vZGVzIHRoYXQgdGhlIG5vZGUgaXMgdGhlIHNvbGUgdW5zY2hlZHVsZWQKKyAgICAvLy8gcHJlZGVjZXNzb3IgZm9yLiAgVGhpcyBpcyB1c2VkIGFzIGEgdGllLWJyZWFrZXIgaGV1cmlzdGljIGZvciBiZXR0ZXIKKyAgICAvLy8gbW9iaWxpdHkuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IE51bU5vZGVzU29sZWx5QmxvY2tpbmc7CisgICAgCisgICAgLy8vIFF1ZXVlIC0gVGhlIHF1ZXVlLgorICAgIHN0ZDo6dmVjdG9yPFNVbml0Kj4gUXVldWU7CisgICAgbGF0ZW5jeV9zb3J0IFBpY2tlcjsKKworICBwdWJsaWM6CisgICAgTGF0ZW5jeVByaW9yaXR5UXVldWUoKSA6IFBpY2tlcih0aGlzKSB7CisgICAgfQorCisgICAgdm9pZCBpbml0Tm9kZXMoc3RkOjp2ZWN0b3I8U1VuaXQ+ICZzdW5pdHMpIHsKKyAgICAgIFNVbml0cyA9ICZzdW5pdHM7CisgICAgICBOdW1Ob2Rlc1NvbGVseUJsb2NraW5nLnJlc2l6ZShTVW5pdHMtPnNpemUoKSwgMCk7CisgICAgfQorCisgICAgdm9pZCBhZGROb2RlKGNvbnN0IFNVbml0ICpTVSkgeworICAgICAgTnVtTm9kZXNTb2xlbHlCbG9ja2luZy5yZXNpemUoU1VuaXRzLT5zaXplKCksIDApOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlTm9kZShjb25zdCBTVW5pdCAqU1UpIHsKKyAgICB9CisKKyAgICB2b2lkIHJlbGVhc2VTdGF0ZSgpIHsKKyAgICAgIFNVbml0cyA9IDA7CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIGdldExhdGVuY3kodW5zaWduZWQgTm9kZU51bSkgY29uc3QgeworICAgICAgYXNzZXJ0KE5vZGVOdW0gPCAoKlNVbml0cykuc2l6ZSgpKTsKKyAgICAgIHJldHVybiAoKlNVbml0cylbTm9kZU51bV0uZ2V0SGVpZ2h0KCk7CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIGdldE51bVNvbGVseUJsb2NrTm9kZXModW5zaWduZWQgTm9kZU51bSkgY29uc3QgeworICAgICAgYXNzZXJ0KE5vZGVOdW0gPCBOdW1Ob2Rlc1NvbGVseUJsb2NraW5nLnNpemUoKSk7CisgICAgICByZXR1cm4gTnVtTm9kZXNTb2xlbHlCbG9ja2luZ1tOb2RlTnVtXTsKKyAgICB9CisgICAgCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFF1ZXVlLmVtcHR5KCk7IH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgcHVzaChTVW5pdCAqVSk7CisgICAgCisgICAgdmlydHVhbCBTVW5pdCAqcG9wKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKFNVbml0ICpTVSk7CisKKyAgICAvLyBTY2hlZHVsZWROb2RlIC0gQXMgbm9kZXMgYXJlIHNjaGVkdWxlZCwgd2UgbG9vayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueQorICAgIC8vIHN1Y2Nlc3NvciBub2RlcyB0aGF0IGhhdmUgYSBzaW5nbGUgdW5zY2hlZHVsZWQgcHJlZGVjZXNzb3IuICBJZiBzbywgdGhhdAorICAgIC8vIHNpbmdsZSBwcmVkZWNlc3NvciBoYXMgYSBoaWdoZXIgcHJpb3JpdHksIHNpbmNlIHNjaGVkdWxpbmcgaXQgd2lsbCBtYWtlCisgICAgLy8gdGhlIG5vZGUgYXZhaWxhYmxlLgorICAgIHZvaWQgU2NoZWR1bGVkTm9kZShTVW5pdCAqTm9kZSk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBBZGp1c3RQcmlvcml0eU9mVW5zY2hlZHVsZWRQcmVkcyhTVW5pdCAqU1UpOworICAgIFNVbml0ICpnZXRTaW5nbGVVbnNjaGVkdWxlZFByZWQoU1VuaXQgKlNVKTsKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaW5rQWxsQXNtV3JpdGVyQ29tcG9uZW50cy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGlua0FsbEFzbVdyaXRlckNvbXBvbmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDFiMWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGlua0FsbEFzbVdyaXRlckNvbXBvbmVudHMuaApAQCAtMCwwICsxLDM3IEBACisvLz09PS0gbGx2bS9Db2RlZ2VuL0xpbmtBbGxBc21Xcml0ZXJDb21wb25lbnRzLmggLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIHB1bGxzIGluIGFsbCBhc3NlbWJsZXIgd3JpdGVyIHJlbGF0ZWQgcGFzc2VzIGZvciB0b29scyBsaWtlCisvLyBsbGMgdGhhdCBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSU5LQUxMQVNNV1JJVEVSQ09NUE9ORU5UU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MSU5LQUxMQVNNV1JJVEVSQ09NUE9ORU5UU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR0NzLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEZvcmNlQXNtV3JpdGVyTGlua2luZyB7CisgICAgRm9yY2VBc21Xcml0ZXJMaW5raW5nKCkgeworICAgICAgLy8gV2UgbXVzdCByZWZlcmVuY2UgdGhlIHBsdWctaW5zIGluIHN1Y2ggYSB3YXkgdGhhdCBjb21waWxlcnMgd2lsbCBub3QKKyAgICAgIC8vIGRlbGV0ZSBpdCBhbGwgYXMgZGVhZCBjb2RlLCBldmVuIHdpdGggd2hvbGUgcHJvZ3JhbSBvcHRpbWl6YXRpb24sCisgICAgICAvLyB5ZXQgaXMgZWZmZWN0aXZlbHkgYSBOTy1PUC4gQXMgdGhlIGNvbXBpbGVyIGlzbid0IHNtYXJ0IGVub3VnaAorICAgICAgLy8gdG8ga25vdyB0aGF0IGdldGVudigpIG5ldmVyIHJldHVybnMgLTEsIHRoaXMgd2lsbCBkbyB0aGUgam9iLgorICAgICAgaWYgKHN0ZDo6Z2V0ZW52KCJiYXIiKSAhPSAoY2hhciopIC0xKQorICAgICAgICByZXR1cm47CisKKyAgICAgIGxsdm06OmxpbmtPY2FtbEdDUHJpbnRlcigpOworCisgICAgfQorICB9IEZvcmNlQXNtV3JpdGVyTGlua2luZzsgLy8gRm9yY2UgbGluayBieSBjcmVhdGluZyBhIGdsb2JhbCBkZWZpbml0aW9uLgorfQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0xJTktBTExBU01XUklURVJDT01QT05FTlRTX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpbmtBbGxDb2RlZ2VuQ29tcG9uZW50cy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGlua0FsbENvZGVnZW5Db21wb25lbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4MjkzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpbmtBbGxDb2RlZ2VuQ29tcG9uZW50cy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vPT09LSBsbHZtL0NvZGVnZW4vTGlua0FsbENvZGVnZW5Db21wb25lbnRzLmggLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgcHVsbHMgaW4gYWxsIGNvZGVnZW4gcmVsYXRlZCBwYXNzZXMgZm9yIHRvb2xzIGxpa2UgbGxpIGFuZAorLy8gbGxjIHRoYXQgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElOS0FMTENPREVHRU5DT01QT05FTlRTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJTktBTExDT0RFR0VOQ09NUE9ORU5UU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlclJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dDcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRm9yY2VDb2RlZ2VuTGlua2luZyB7CisgICAgRm9yY2VDb2RlZ2VuTGlua2luZygpIHsKKyAgICAgIC8vIFdlIG11c3QgcmVmZXJlbmNlIHRoZSBwYXNzZXMgaW4gc3VjaCBhIHdheSB0aGF0IGNvbXBpbGVycyB3aWxsIG5vdAorICAgICAgLy8gZGVsZXRlIGl0IGFsbCBhcyBkZWFkIGNvZGUsIGV2ZW4gd2l0aCB3aG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiwKKyAgICAgIC8vIHlldCBpcyBlZmZlY3RpdmVseSBhIE5PLU9QLiBBcyB0aGUgY29tcGlsZXIgaXNuJ3Qgc21hcnQgZW5vdWdoCisgICAgICAvLyB0byBrbm93IHRoYXQgZ2V0ZW52KCkgbmV2ZXIgcmV0dXJucyAtMSwgdGhpcyB3aWxsIGRvIHRoZSBqb2IuCisgICAgICBpZiAoc3RkOjpnZXRlbnYoImJhciIpICE9IChjaGFyKikgLTEpCisgICAgICAgIHJldHVybjsKKworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltUGFzcygpOworCisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRmFzdFJlZ2lzdGVyQWxsb2NhdG9yKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTGluZWFyU2NhblJlZ2lzdGVyQWxsb2NhdG9yKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUEJRUFJlZ2lzdGVyQWxsb2NhdG9yKCk7CisKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTaW1wbGVSZWdpc3RlckNvYWxlc2NlcigpOworICAgICAgCisgICAgICBsbHZtOjpsaW5rT2NhbWxHQygpOworICAgICAgbGx2bTo6bGlua1NoYWRvd1N0YWNrR0MoKTsKKyAgICAgIAorICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJVUlJMaXN0REFHU2NoZWR1bGVyKE5VTEwsIGxsdm06OkNvZGVHZW5PcHQ6OkRlZmF1bHQpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVREUlJMaXN0REFHU2NoZWR1bGVyKE5VTEwsIGxsdm06OkNvZGVHZW5PcHQ6OkRlZmF1bHQpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNvdXJjZUxpc3REQUdTY2hlZHVsZXIoTlVMTCxsbHZtOjpDb2RlR2VuT3B0OjpEZWZhdWx0KTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVIeWJyaWRMaXN0REFHU2NoZWR1bGVyKE5VTEwsbGx2bTo6Q29kZUdlbk9wdDo6RGVmYXVsdCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlVERMaXN0REFHU2NoZWR1bGVyKE5VTEwsIGxsdm06OkNvZGVHZW5PcHQ6OkRlZmF1bHQpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUZhc3REQUdTY2hlZHVsZXIoTlVMTCwgbGx2bTo6Q29kZUdlbk9wdDo6RGVmYXVsdCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGVmYXVsdFNjaGVkdWxlcihOVUxMLCBsbHZtOjpDb2RlR2VuT3B0OjpEZWZhdWx0KTsKKworICAgIH0KKyAgfSBGb3JjZUNvZGVnZW5MaW5raW5nOyAvLyBGb3JjZSBsaW5rIGJ5IGNyZWF0aW5nIGEgZ2xvYmFsIGRlZmluaXRpb24uCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGUwNjhiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsLmgKQEAgLTAsMCArMSw1NzMgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbC5oIC0gSW50ZXJ2YWwgcmVwcmVzZW50YXRpb24gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExpdmVSYW5nZSBhbmQgTGl2ZUludGVydmFsIGNsYXNzZXMuICBHaXZlbiBzb21lCisvLyBudW1iZXJpbmcgb2YgZWFjaCB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbnMgYW4gaW50ZXJ2YWwgW2ksIGopIGlzIHNhaWQgdG8gYmUgYQorLy8gbGl2ZSBpbnRlcnZhbCBmb3IgcmVnaXN0ZXIgdiBpZiB0aGVyZSBpcyBubyBpbnN0cnVjdGlvbiB3aXRoIG51bWJlciBqJyA+PSBqCisvLyBzdWNoIHRoYXQgdiBpcyBsaXZlIGF0IGonIGFuZCB0aGVyZSBpcyBubyBpbnN0cnVjdGlvbiB3aXRoIG51bWJlciBpJyA8IGkgc3VjaAorLy8gdGhhdCB2IGlzIGxpdmUgYXQgaScuIEluIHRoaXMgaW1wbGVtZW50YXRpb24gaW50ZXJ2YWxzIGNhbiBoYXZlIGhvbGVzLAorLy8gaS5lLiBhbiBpbnRlcnZhbCBtaWdodCBsb29rIGxpa2UgWzEsMjApLCBbNTAsNjUpLCBbMTAwMCwxMDAxKS4gIEVhY2gKKy8vIGluZGl2aWR1YWwgcmFuZ2UgaXMgcmVwcmVzZW50ZWQgYXMgYW4gaW5zdGFuY2Ugb2YgTGl2ZVJhbmdlLCBhbmQgdGhlIHdob2xlCisvLyBpbnRlcnZhbCBpcyByZXByZXNlbnRlZCBhcyBhbiBpbnN0YW5jZSBvZiBMaXZlSW50ZXJ2YWwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElWRUlOVEVSVkFMX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJVkVJTlRFUlZBTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBMaXZlSW50ZXJ2YWxzOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisgIGNsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisKKyAgLy8vIFZOSW5mbyAtIFZhbHVlIE51bWJlciBJbmZvcm1hdGlvbi4KKyAgLy8vIFRoaXMgY2xhc3MgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBtYWNoaW5lIGxldmVsIHZhbHVlcywgaW5jbHVkaW5nCisgIC8vLyBkZWZpbml0aW9uIGFuZCB1c2UgcG9pbnRzLgorICAvLy8KKyAgLy8vIENhcmUgbXVzdCBiZSB0YWtlbiBpbiBpbnRlcnByZXRpbmcgdGhlIGRlZiBpbmRleCBvZiB0aGUgdmFsdWUuIFRoZSAKKyAgLy8vIGZvbGxvd2luZyBydWxlcyBhcHBseToKKyAgLy8vCisgIC8vLyBJZiB0aGUgaXNEZWZBY2N1cmF0ZSgpIG1ldGhvZCByZXR1cm5zIGZhbHNlIHRoZW4gZGVmIGRvZXMgbm90IGNvbnRhaW4gdGhlCisgIC8vLyBpbmRleCBvZiB0aGUgZGVmaW5pbmcgTWFjaGluZUluc3RyLCBvciBldmVuIChuZWNlc3NhcmlseSkgdG8gYQorICAvLy8gTWFjaGluZUluc3RyIGF0IGFsbC4gSW4gZ2VuZXJhbCBzdWNoIGEgZGVmIGluZGV4IGlzIG5vdCBtZWFuaW5nZnVsCisgIC8vLyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiBUaGUgZXhjZXB0aW9uIGlzIHRoYXQsIGZvciB2YWx1ZXMgb3JpZ2luYWxseQorICAvLy8gZGVmaW5lZCBieSBQSEkgaW5zdHJ1Y3Rpb25zLCBhZnRlciBQSEkgZWxpbWluYXRpb24gZGVmIHdpbGwgY29udGFpbiB0aGUKKyAgLy8vIGluZGV4IG9mIHRoZSBNQkIgaW4gd2hpY2ggdGhlIFBISSBvcmlnaW5hbGx5IGV4aXN0ZWQuIFRoaXMgY2FuIGJlIHVzZWQKKyAgLy8vIHRvIGluc2VydCBjb2RlIChzcGlsbHMgb3IgY29waWVzKSB3aGljaCBkZWFscyB3aXRoIHRoZSB2YWx1ZSwgd2hpY2ggd2lsbAorICAvLy8gYmUgbGl2ZSBpbiB0byB0aGUgYmxvY2suCisgIGNsYXNzIFZOSW5mbyB7CisgIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICBIQVNfUEhJX0tJTEwgICAgPSAxLAorICAgICAgUkVERUZfQllfRUMgICAgID0gMSA8PCAxLAorICAgICAgSVNfUEhJX0RFRiAgICAgID0gMSA8PCAyLAorICAgICAgSVNfVU5VU0VEICAgICAgID0gMSA8PCAzLAorICAgICAgSVNfREVGX0FDQ1VSQVRFID0gMSA8PCA0CisgICAgfTsKKworICAgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CisgICAgdW5pb24geworICAgICAgTWFjaGluZUluc3RyICpjb3B5OworICAgICAgdW5zaWduZWQgcmVnOworICAgIH0gY3I7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgQnVtcFB0ckFsbG9jYXRvciBBbGxvY2F0b3I7CisKKyAgICAvLy8gVGhlIElEIG51bWJlciBvZiB0aGlzIHZhbHVlLgorICAgIHVuc2lnbmVkIGlkOworCisgICAgLy8vIFRoZSBpbmRleCBvZiB0aGUgZGVmaW5pbmcgaW5zdHJ1Y3Rpb24gKGlmIGlzRGVmQWNjdXJhdGUoKSByZXR1cm5zIHRydWUpLgorICAgIFNsb3RJbmRleCBkZWY7CisKKyAgICAvLy8gVk5JbmZvIGNvbnN0cnVjdG9yLgorICAgIC8vLyBkIGlzIHByZXN1bWVkIHRvIHBvaW50IHRvIHRoZSBhY3R1YWwgZGVmaW5pbmcgaW5zdHIuIElmIGl0IGRvZXNuJ3QKKyAgICAvLy8gc2V0SXNEZWZBY2N1cmF0ZShmYWxzZSkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjb25zdHJ1Y3Rpb24uCisgICAgVk5JbmZvKHVuc2lnbmVkIGksIFNsb3RJbmRleCBkLCBNYWNoaW5lSW5zdHIgKmMpCisgICAgICA6IGZsYWdzKElTX0RFRl9BQ0NVUkFURSksIGlkKGkpLCBkZWYoZCkgeyBjci5jb3B5ID0gYzsgfQorCisgICAgLy8vIFZOSW5mbyBjb25zdHJ1dG9yLCBjb3BpZXMgdmFsdWVzIGZyb20gb3JpZywgZXhjZXB0IGZvciB0aGUgdmFsdWUgbnVtYmVyLgorICAgIFZOSW5mbyh1bnNpZ25lZCBpLCBjb25zdCBWTkluZm8gJm9yaWcpCisgICAgICA6IGZsYWdzKG9yaWcuZmxhZ3MpLCBjcihvcmlnLmNyKSwgaWQoaSksIGRlZihvcmlnLmRlZikKKyAgICB7IH0KKworICAgIC8vLyBDb3B5IGZyb20gdGhlIHBhcmFtZXRlciBpbnRvIHRoaXMgVk5JbmZvLgorICAgIHZvaWQgY29weUZyb20oVk5JbmZvICZzcmMpIHsKKyAgICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgICAgY3IgPSBzcmMuY3I7CisgICAgICBkZWYgPSBzcmMuZGVmOworICAgIH0KKworICAgIC8vLyBVc2VkIGZvciBjb3B5aW5nIHZhbHVlIG51bWJlciBpbmZvLgorICAgIHVuc2lnbmVkIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gZmxhZ3M7IH0KKyAgICB2b2lkIHNldEZsYWdzKHVuc2lnbmVkIGZsYWdzKSB7IHRoaXMtPmZsYWdzID0gZmxhZ3M7IH0KKworICAgIC8vLyBGb3IgYSByZWdpc3RlciBpbnRlcnZhbCwgaWYgdGhpcyBWTiB3YXMgZGVmaW5pZWQgYnkgYSBjb3B5IGluc3RyCisgICAgLy8vIGdldENvcHkoKSByZXR1cm5zIGEgcG9pbnRlciB0byBpdCwgb3RoZXJ3aXNlIHJldHVybnMgMC4KKyAgICAvLy8gRm9yIGEgc3RhY2sgaW50ZXJ2YWwgdGhlIGJlaGF2aW91ciBvZiB0aGlzIG1ldGhvZCBpcyB1bmRlZmluZWQuCisgICAgTWFjaGluZUluc3RyKiBnZXRDb3B5KCkgY29uc3QgeyByZXR1cm4gY3IuY29weTsgfQorICAgIC8vLyBGb3IgYSByZWdpc3RlciBpbnRlcnZhbCwgc2V0IHRoZSBjb3B5IG1lbWJlci4KKyAgICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gc3RhY2sgaW50ZXJ2YWxzIGFzIGl0IG1heSBsZWFkIHRvCisgICAgLy8vIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICB2b2lkIHNldENvcHkoTWFjaGluZUluc3RyICpjKSB7IGNyLmNvcHkgPSBjOyB9CisKKyAgICAvLy8gRm9yIGEgc3RhY2sgaW50ZXJ2YWwsIHJldHVybnMgdGhlIHJlZyB3aGljaCB0aGlzIHN0YWNrIGludGVydmFsIHdhcworICAgIC8vLyBkZWZpbmVkIGZyb20uCisgICAgLy8vIEZvciBhIHJlZ2lzdGVyIGludGVydmFsIHRoZSBiZWhhdmlvdXIgb2YgdGhpcyBtZXRob2QgaXMgdW5kZWZpbmVkLiAKKyAgICB1bnNpZ25lZCBnZXRSZWcoKSBjb25zdCB7IHJldHVybiBjci5yZWc7IH0KKyAgICAvLy8gRm9yIGEgc3RhY2sgaW50ZXJ2YWwsIHNldCB0aGUgZGVmaW5pbmcgcmVnaXN0ZXIuCisgICAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIHJlZ2lzdGVyIGludGVydmFscyBhcyBpdCBtYXkgbGVhZAorICAgIC8vLyB0byB1bmRlZmluZWQgYmVoYXZpb3VyLgorICAgIHZvaWQgc2V0UmVnKHVuc2lnbmVkIHJlZykgeyBjci5yZWcgPSByZWc7IH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgb25lIG9yIG1vcmUga2lsbHMgYXJlIFBISSBub2Rlcy4KKyAgICBib29sIGhhc1BISUtpbGwoKSBjb25zdCB7IHJldHVybiBmbGFncyAmIEhBU19QSElfS0lMTDsgfQorICAgIC8vLyBTZXQgdGhlIFBISSBraWxsIGZsYWcgb24gdGhpcyB2YWx1ZS4KKyAgICB2b2lkIHNldEhhc1BISUtpbGwoYm9vbCBoYXNLaWxsKSB7CisgICAgICBpZiAoaGFzS2lsbCkKKyAgICAgICAgZmxhZ3MgfD0gSEFTX1BISV9LSUxMOworICAgICAgZWxzZQorICAgICAgICBmbGFncyAmPSB+SEFTX1BISV9LSUxMOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSBpcyByZS1kZWZpbmVkIGJ5IGFuIGVhcmx5IGNsb2JiZXIgc29tZXdoZXJlCisgICAgLy8vIGR1cmluZyB0aGUgbGl2ZSByYW5nZS4KKyAgICBib29sIGhhc1JlZGVmQnlFQygpIGNvbnN0IHsgcmV0dXJuIGZsYWdzICYgUkVERUZfQllfRUM7IH0KKyAgICAvLy8gU2V0IHRoZSAicmVkZWYgYnkgZWFybHkgY2xvYmJlciIgZmxhZyBvbiB0aGlzIHZhbHVlLgorICAgIHZvaWQgc2V0SGFzUmVkZWZCeUVDKGJvb2wgaGFzUmVkZWYpIHsKKyAgICAgIGlmIChoYXNSZWRlZikKKyAgICAgICAgZmxhZ3MgfD0gUkVERUZfQllfRUM7CisgICAgICBlbHNlCisgICAgICAgIGZsYWdzICY9IH5SRURFRl9CWV9FQzsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgaXMgZGVmaW5lZCBieSBhIFBISSBpbnN0cnVjdGlvbiAob3Igd2FzLAorICAgIC8vLyBQSEkgaW5zdHJ1Y2lvbnMgbWF5IGhhdmUgYmVlbiBlbGltaW5hdGVkKS4KKyAgICBib29sIGlzUEhJRGVmKCkgY29uc3QgeyByZXR1cm4gZmxhZ3MgJiBJU19QSElfREVGOyB9CisgICAgLy8vIFNldCB0aGUgInBoaSBkZWYiIGZsYWcgb24gdGhpcyB2YWx1ZS4KKyAgICB2b2lkIHNldElzUEhJRGVmKGJvb2wgcGhpRGVmKSB7CisgICAgICBpZiAocGhpRGVmKQorICAgICAgICBmbGFncyB8PSBJU19QSElfREVGOworICAgICAgZWxzZQorICAgICAgICBmbGFncyAmPSB+SVNfUEhJX0RFRjsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgaXMgdW51c2VkLgorICAgIGJvb2wgaXNVbnVzZWQoKSBjb25zdCB7IHJldHVybiBmbGFncyAmIElTX1VOVVNFRDsgfQorICAgIC8vLyBTZXQgdGhlICJpcyB1bnVzZWQiIGZsYWcgb24gdGhpcyB2YWx1ZS4KKyAgICB2b2lkIHNldElzVW51c2VkKGJvb2wgdW51c2VkKSB7CisgICAgICBpZiAodW51c2VkKQorICAgICAgICBmbGFncyB8PSBJU19VTlVTRUQ7CisgICAgICBlbHNlCisgICAgICAgIGZsYWdzICY9IH5JU19VTlVTRUQ7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVmIGlzIGFjY3VyYXRlLgorICAgIGJvb2wgaXNEZWZBY2N1cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzICYgSVNfREVGX0FDQ1VSQVRFOyB9CisgICAgLy8vIFNldCB0aGUgImlzIGRlZiBhY2N1cmF0ZSIgZmxhZyBvbiB0aGlzIHZhbHVlLgorICAgIHZvaWQgc2V0SXNEZWZBY2N1cmF0ZShib29sIGRlZkFjY3VyYXRlKSB7CisgICAgICBpZiAoZGVmQWNjdXJhdGUpCisgICAgICAgIGZsYWdzIHw9IElTX0RFRl9BQ0NVUkFURTsKKyAgICAgIGVsc2UKKyAgICAgICAgZmxhZ3MgJj0gfklTX0RFRl9BQ0NVUkFURTsKKyAgICB9CisgIH07CisKKyAgLy8vIExpdmVSYW5nZSBzdHJ1Y3R1cmUgLSBUaGlzIHJlcHJlc2VudHMgYSBzaW1wbGUgcmVnaXN0ZXIgcmFuZ2UgaW4gdGhlCisgIC8vLyBwcm9ncmFtLCB3aXRoIGFuIGluY2x1c2l2ZSBzdGFydCBwb2ludCBhbmQgYW4gZXhjbHVzaXZlIGVuZCBwb2ludC4KKyAgLy8vIFRoZXNlIHJhbmdlcyBhcmUgcmVuZGVyZWQgYXMgW3N0YXJ0LGVuZCkuCisgIHN0cnVjdCBMaXZlUmFuZ2UgeworICAgIFNsb3RJbmRleCBzdGFydDsgIC8vIFN0YXJ0IHBvaW50IG9mIHRoZSBpbnRlcnZhbCAoaW5jbHVzaXZlKQorICAgIFNsb3RJbmRleCBlbmQ7ICAgIC8vIEVuZCBwb2ludCBvZiB0aGUgaW50ZXJ2YWwgKGV4Y2x1c2l2ZSkKKyAgICBWTkluZm8gKnZhbG5vOyAgIC8vIGlkZW50aWZpZXIgZm9yIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhpcyBpbnRlcnZhbC4KKworICAgIExpdmVSYW5nZShTbG90SW5kZXggUywgU2xvdEluZGV4IEUsIFZOSW5mbyAqVikKKyAgICAgIDogc3RhcnQoUyksIGVuZChFKSwgdmFsbm8oVikgeworCisgICAgICBhc3NlcnQoUyA8IEUgJiYgIkNhbm5vdCBjcmVhdGUgZW1wdHkgb3IgYmFja3dhcmRzIHJhbmdlIik7CisgICAgfQorCisgICAgLy8vIGNvbnRhaW5zIC0gUmV0dXJuIHRydWUgaWYgdGhlIGluZGV4IGlzIGNvdmVyZWQgYnkgdGhpcyByYW5nZS4KKyAgICAvLy8KKyAgICBib29sIGNvbnRhaW5zKFNsb3RJbmRleCBJKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RhcnQgPD0gSSAmJiBJIDwgZW5kOworICAgIH0KKworICAgIC8vLyBjb250YWluc1JhbmdlIC0gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHJhbmdlLCBbUywgRSksIGlzIGNvdmVyZWQgYnkKKyAgICAvLy8gdGhpcyByYW5nZS4gCisgICAgYm9vbCBjb250YWluc1JhbmdlKFNsb3RJbmRleCBTLCBTbG90SW5kZXggRSkgY29uc3QgeworICAgICAgYXNzZXJ0KChTIDwgRSkgJiYgIkJhY2t3YXJkcyBpbnRlcnZhbD8iKTsKKyAgICAgIHJldHVybiAoc3RhcnQgPD0gUyAmJiBTIDwgZW5kKSAmJiAoc3RhcnQgPCBFICYmIEUgPD0gZW5kKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBMaXZlUmFuZ2UgJkxSKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RhcnQgPCBMUi5zdGFydCB8fCAoc3RhcnQgPT0gTFIuc3RhcnQgJiYgZW5kIDwgTFIuZW5kKTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IExpdmVSYW5nZSAmTFIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGFydCA9PSBMUi5zdGFydCAmJiBlbmQgPT0gTFIuZW5kOworICAgIH0KKworICAgIHZvaWQgZHVtcCgpIGNvbnN0OworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIExpdmVSYW5nZSgpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisgIH07CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxMaXZlUmFuZ2U+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHJhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtJiBvcywgY29uc3QgTGl2ZVJhbmdlICZMUik7CisKKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoU2xvdEluZGV4IFYsIGNvbnN0IExpdmVSYW5nZSAmTFIpIHsKKyAgICByZXR1cm4gViA8IExSLnN0YXJ0OworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExpdmVSYW5nZSAmTFIsIFNsb3RJbmRleCBWKSB7CisgICAgcmV0dXJuIExSLnN0YXJ0IDwgVjsKKyAgfQorCisgIC8vLyBMaXZlSW50ZXJ2YWwgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgc29tZSBudW1iZXIgb2YgbGl2ZSByYW5nZXMgZm9yIGEKKyAgLy8vIHJlZ2lzdGVyIG9yIHZhbHVlLiAgVGhpcyBjbGFzcyBhbHNvIGNvbnRhaW5zIGEgYml0IG9mIHJlZ2lzdGVyIGFsbG9jYXRvcgorICAvLy8gc3RhdGUuCisgIGNsYXNzIExpdmVJbnRlcnZhbCB7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgU21hbGxWZWN0b3I8TGl2ZVJhbmdlLDQ+IFJhbmdlczsKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9yPFZOSW5mbyosND4gVk5JbmZvTGlzdDsKKworICAgIHVuc2lnbmVkIHJlZzsgICAgICAgIC8vIHRoZSByZWdpc3RlciBvciBzdGFjayBzbG90IG9mIHRoaXMgaW50ZXJ2YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdG9wIGJpdHMgaXMgc2V0LCBpdCByZXByZXNlbnRzIGEgc3RhY2sgc2xvdC4KKyAgICBmbG9hdCB3ZWlnaHQ7ICAgICAgICAvLyB3ZWlnaHQgb2YgdGhpcyBpbnRlcnZhbAorICAgIFJhbmdlcyByYW5nZXM7ICAgICAgIC8vIHRoZSByYW5nZXMgaW4gd2hpY2ggdGhpcyByZWdpc3RlciBpcyBsaXZlCisgICAgVk5JbmZvTGlzdCB2YWxub3M7ICAgLy8gdmFsdWUjJ3MKKyAgICAKKyAgICBzdHJ1Y3QgSW5zdHJTbG90cyB7CisgICAgICBlbnVtIHsKKyAgICAgICAgTE9BRCAgPSAwLAorICAgICAgICBVU0UgICA9IDEsCisgICAgICAgIERFRiAgID0gMiwKKyAgICAgICAgU1RPUkUgPSAzLAorICAgICAgICBOVU0gICA9IDQKKyAgICAgIH07CisKKyAgICB9OworCisgICAgTGl2ZUludGVydmFsKHVuc2lnbmVkIFJlZywgZmxvYXQgV2VpZ2h0LCBib29sIElzU1MgPSBmYWxzZSkKKyAgICAgIDogcmVnKFJlZyksIHdlaWdodChXZWlnaHQpIHsKKyAgICAgIGlmIChJc1NTKQorICAgICAgICByZWcgPSByZWcgfCAoMVUgPDwgKHNpemVvZih1bnNpZ25lZCkqQ0hBUl9CSVQtMSkpOworICAgIH0KKworICAgIHR5cGVkZWYgUmFuZ2VzOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIHJhbmdlcy5iZWdpbigpOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiByYW5nZXMuZW5kKCk7IH0KKworICAgIHR5cGVkZWYgUmFuZ2VzOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHJhbmdlcy5iZWdpbigpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgIHsgcmV0dXJuIHJhbmdlcy5lbmQoKTsgfQorCisgICAgdHlwZWRlZiBWTkluZm9MaXN0OjppdGVyYXRvciB2bmlfaXRlcmF0b3I7CisgICAgdm5pX2l0ZXJhdG9yIHZuaV9iZWdpbigpIHsgcmV0dXJuIHZhbG5vcy5iZWdpbigpOyB9CisgICAgdm5pX2l0ZXJhdG9yIHZuaV9lbmQoKSB7IHJldHVybiB2YWxub3MuZW5kKCk7IH0KKworICAgIHR5cGVkZWYgVk5JbmZvTGlzdDo6Y29uc3RfaXRlcmF0b3IgY29uc3Rfdm5pX2l0ZXJhdG9yOworICAgIGNvbnN0X3ZuaV9pdGVyYXRvciB2bmlfYmVnaW4oKSBjb25zdCB7IHJldHVybiB2YWxub3MuYmVnaW4oKTsgfQorICAgIGNvbnN0X3ZuaV9pdGVyYXRvciB2bmlfZW5kKCkgY29uc3QgeyByZXR1cm4gdmFsbm9zLmVuZCgpOyB9CisKKyAgICAvLy8gYWR2YW5jZVRvIC0gQWR2YW5jZSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHRvIHBvaW50IHRvIHRoZSBMaXZlUmFuZ2UKKyAgICAvLy8gY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLCBvciBlbmQoKSBpZiB0aGUgcG9zaXRpb24gaXMgcGFzdCB0aGUKKyAgICAvLy8gZW5kIG9mIHRoZSBpbnRlcnZhbC4gIElmIG5vIExpdmVSYW5nZSBjb250YWlucyB0aGlzIHBvc2l0aW9uLCBidXQgdGhlCisgICAgLy8vIHBvc2l0aW9uIGlzIGluIGEgaG9sZSwgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUKKyAgICAvLy8gTGl2ZVJhbmdlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBob2xlLgorICAgIGl0ZXJhdG9yIGFkdmFuY2VUbyhpdGVyYXRvciBJLCBTbG90SW5kZXggUG9zKSB7CisgICAgICBpZiAoUG9zID49IGVuZEluZGV4KCkpCisgICAgICAgIHJldHVybiBlbmQoKTsKKyAgICAgIHdoaWxlIChJLT5lbmQgPD0gUG9zKSArK0k7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisgICAgCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIHZhbG5vcy5jbGVhcigpOworICAgICAgcmFuZ2VzLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8vIGlzU3RhY2tTbG90IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHN0YWNrIHNsb3QgaW50ZXJ2YWwuCisgICAgLy8vCisgICAgYm9vbCBpc1N0YWNrU2xvdCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWcgJiAoMVUgPDwgKHNpemVvZih1bnNpZ25lZCkqQ0hBUl9CSVQtMSkpOworICAgIH0KKworICAgIC8vLyBnZXRTdGFja1Nsb3RJbmRleCAtIFJldHVybiBzdGFjayBzbG90IGluZGV4IGlmIHRoaXMgaXMgYSBzdGFjayBzbG90CisgICAgLy8vIGludGVydmFsLgorICAgIGludCBnZXRTdGFja1Nsb3RJbmRleCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc1N0YWNrU2xvdCgpICYmICJJbnRlcnZhbCBpcyBub3QgYSBzdGFjayBzbG90IGludGVydmFsISIpOworICAgICAgcmV0dXJuIHJlZyAmIH4oMVUgPDwgKHNpemVvZih1bnNpZ25lZCkqQ0hBUl9CSVQtMSkpOworICAgIH0KKworICAgIGJvb2wgaGFzQXRMZWFzdE9uZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gIXZhbG5vcy5lbXB0eSgpOyB9CisKKyAgICBib29sIGNvbnRhaW5zT25lVmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWxub3Muc2l6ZSgpID09IDE7IH0KKworICAgIHVuc2lnbmVkIGdldE51bVZhbE51bXMoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpdmFsbm9zLnNpemUoKTsgfQorICAgIAorICAgIC8vLyBnZXRWYWxOdW1JbmZvIC0gUmV0dXJucyBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgdmFsIy4KKyAgICAvLy8KKyAgICBpbmxpbmUgVk5JbmZvICpnZXRWYWxOdW1JbmZvKHVuc2lnbmVkIFZhbE5vKSB7CisgICAgICByZXR1cm4gdmFsbm9zW1ZhbE5vXTsKKyAgICB9CisgICAgaW5saW5lIGNvbnN0IFZOSW5mbyAqZ2V0VmFsTnVtSW5mbyh1bnNpZ25lZCBWYWxObykgY29uc3QgeworICAgICAgcmV0dXJuIHZhbG5vc1tWYWxOb107CisgICAgfQorCisgICAgLy8vIGdldE5leHRWYWx1ZSAtIENyZWF0ZSBhIG5ldyB2YWx1ZSBudW1iZXIgYW5kIHJldHVybiBpdC4gIE1JSWR4IHNwZWNpZmllcworICAgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIHRoZSB2YWx1ZSBudW1iZXIuCisgICAgVk5JbmZvICpnZXROZXh0VmFsdWUoU2xvdEluZGV4IGRlZiwgTWFjaGluZUluc3RyICpDb3B5TUksCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZWZBY2N1cmF0ZSwgVk5JbmZvOjpBbGxvY2F0b3IgJlZOSW5mb0FsbG9jYXRvcikgeworICAgICAgVk5JbmZvICpWTkkgPQorICAgICAgICBuZXcgKFZOSW5mb0FsbG9jYXRvcikgVk5JbmZvKCh1bnNpZ25lZCl2YWxub3Muc2l6ZSgpLCBkZWYsIENvcHlNSSk7CisgICAgICBWTkktPnNldElzRGVmQWNjdXJhdGUoaXNEZWZBY2N1cmF0ZSk7CisgICAgICB2YWxub3MucHVzaF9iYWNrKFZOSSk7CisgICAgICByZXR1cm4gVk5JOworICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIG5ldyB2YWx1ZSB3aWxsIGJlIGlkZW50aWNhbCBleGNlcHQKKyAgICAvLy8gZm9yIHRoZSBWYWx1ZSBudW1iZXIuCisgICAgVk5JbmZvICpjcmVhdGVWYWx1ZUNvcHkoY29uc3QgVk5JbmZvICpvcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOSW5mbzo6QWxsb2NhdG9yICZWTkluZm9BbGxvY2F0b3IpIHsKKyAgICAgIFZOSW5mbyAqVk5JID0KKyAgICAgICAgbmV3IChWTkluZm9BbGxvY2F0b3IpIFZOSW5mbygodW5zaWduZWQpdmFsbm9zLnNpemUoKSwgKm9yaWcpOworICAgICAgdmFsbm9zLnB1c2hfYmFjayhWTkkpOworICAgICAgcmV0dXJuIFZOSTsKKyAgICB9CisKKyAgICAvLy8gUmVudW1iZXJWYWx1ZXMgLSBSZW51bWJlciBhbGwgdmFsdWVzIGluIG9yZGVyIG9mIGFwcGVhcmFuY2UgYW5kIHJlbW92ZQorICAgIC8vLyB1bnVzZWQgdmFsdWVzLgorICAgIHZvaWQgUmVudW1iZXJWYWx1ZXMoKTsKKworICAgIC8vLyBpc09ubHlMUk9mVmFsTm8gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGxpdmUgcmFuZ2UgaXMgdGhlIG9ubHkKKyAgICAvLy8gb25lIGRlZmluZWQgYnkgdGhlIGl0cyB2YWwjLgorICAgIGJvb2wgaXNPbmx5TFJPZlZhbE5vKGNvbnN0IExpdmVSYW5nZSAqTFIpIHsKKyAgICAgIGZvciAoY29uc3RfaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgY29uc3QgTGl2ZVJhbmdlICpUbXAgPSBJOworICAgICAgICBpZiAoVG1wICE9IExSICYmIFRtcC0+dmFsbm8gPT0gTFItPnZhbG5vKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICAvLy8gTWVyZ2VWYWx1ZU51bWJlckludG8gLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0d28gdmFsdWUgbnVibWVycworICAgIC8vLyBhcmUgZm91bmQgdG8gYmUgZXF1aXZhbGVudC4gIFRoaXMgZWxpbWluYXRlcyBWMSwgcmVwbGFjaW5nIGFsbAorICAgIC8vLyBMaXZlUmFuZ2VzIHdpdGggdGhlIFYxIHZhbHVlIG51bWJlciB3aXRoIHRoZSBWMiB2YWx1ZSBudW1iZXIuICBUaGlzIGNhbgorICAgIC8vLyBjYXVzZSBtZXJnaW5nIG9mIFYxL1YyIHZhbHVlcyBudW1iZXJzIGFuZCBjb21wYWN0aW9uIG9mIHRoZSB2YWx1ZSBzcGFjZS4KKyAgICBWTkluZm8qIE1lcmdlVmFsdWVOdW1iZXJJbnRvKFZOSW5mbyAqVjEsIFZOSW5mbyAqVjIpOworCisgICAgLy8vIE1lcmdlSW5DbG9iYmVyUmFuZ2VzIC0gRm9yIGFueSBsaXZlIHJhbmdlcyB0aGF0IGFyZSBub3QgZGVmaW5lZCBpbiB0aGUKKyAgICAvLy8gY3VycmVudCBpbnRlcnZhbCwgYnV0IGFyZSBkZWZpbmVkIGluIHRoZSBDbG9iYmVycyBpbnRlcnZhbCwgbWFyayB0aGVtCisgICAgLy8vIHVzZWQgd2l0aCBhbiB1bmtub3duIGRlZmluaXRpb24gdmFsdWUuIENhbGxlciBtdXN0IHBhc3MgaW4gcmVmZXJlbmNlIHRvCisgICAgLy8vIFZOSW5mb0FsbG9jYXRvciBzaW5jZSBpdCB3aWxsIGNyZWF0ZSBhIG5ldyB2YWwjLgorICAgIHZvaWQgTWVyZ2VJbkNsb2JiZXJSYW5nZXMoTGl2ZUludGVydmFscyAmbGlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGl2ZUludGVydmFsICZDbG9iYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOSW5mbzo6QWxsb2NhdG9yICZWTkluZm9BbGxvY2F0b3IpOworCisgICAgLy8vIE1lcmdlSW5DbG9iYmVyUmFuZ2UgLSBTYW1lIGFzIE1lcmdlSW5DbG9iYmVyUmFuZ2VzIGV4Y2VwdCBpdCBtZXJnZSBpbiBhCisgICAgLy8vIHNpbmdsZSBMaXZlUmFuZ2Ugb25seS4KKyAgICB2b2lkIE1lcmdlSW5DbG9iYmVyUmFuZ2UoTGl2ZUludGVydmFscyAmbGlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RJbmRleCBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOSW5mbzo6QWxsb2NhdG9yICZWTkluZm9BbGxvY2F0b3IpOworCisgICAgLy8vIE1lcmdlVmFsdWVJbkFzVmFsdWUgLSBNZXJnZSBhbGwgb2YgdGhlIGxpdmUgcmFuZ2VzIG9mIGEgc3BlY2lmaWMgdmFsIworICAgIC8vLyBpbiBSSFMgaW50byB0aGlzIGxpdmUgaW50ZXJ2YWwgYXMgdGhlIHNwZWNpZmllZCB2YWx1ZSBudW1iZXIuCisgICAgLy8vIFRoZSBMaXZlUmFuZ2VzIGluIFJIUyBhcmUgYWxsb3dlZCB0byBvdmVybGFwIHdpdGggTGl2ZVJhbmdlcyBpbiB0aGUKKyAgICAvLy8gY3VycmVudCBpbnRlcnZhbCwgaXQgd2lsbCByZXBsYWNlIHRoZSB2YWx1ZSBudW1iZXJzIG9mIHRoZSBvdmVybGFwZWQKKyAgICAvLy8gbGl2ZSByYW5nZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIG51bWJlci4KKyAgICB2b2lkIE1lcmdlUmFuZ2VzSW5Bc1ZhbHVlKGNvbnN0IExpdmVJbnRlcnZhbCAmUkhTLCBWTkluZm8gKkxIU1ZhbE5vKTsKKworICAgIC8vLyBNZXJnZVZhbHVlSW5Bc1ZhbHVlIC0gTWVyZ2UgYWxsIG9mIHRoZSBsaXZlIHJhbmdlcyBvZiBhIHNwZWNpZmljIHZhbCMKKyAgICAvLy8gaW4gUkhTIGludG8gdGhpcyBsaXZlIGludGVydmFsIGFzIHRoZSBzcGVjaWZpZWQgdmFsdWUgbnVtYmVyLgorICAgIC8vLyBUaGUgTGl2ZVJhbmdlcyBpbiBSSFMgYXJlIGFsbG93ZWQgdG8gb3ZlcmxhcCB3aXRoIExpdmVSYW5nZXMgaW4gdGhlCisgICAgLy8vIGN1cnJlbnQgaW50ZXJ2YWwsIGJ1dCBvbmx5IGlmIHRoZSBvdmVybGFwcGluZyBMaXZlUmFuZ2VzIGhhdmUgdGhlCisgICAgLy8vIHNwZWNpZmllZCB2YWx1ZSBudW1iZXIuCisgICAgdm9pZCBNZXJnZVZhbHVlSW5Bc1ZhbHVlKGNvbnN0IExpdmVJbnRlcnZhbCAmUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWTkluZm8gKlJIU1ZhbE5vLCBWTkluZm8gKkxIU1ZhbE5vKTsKKworICAgIC8vLyBDb3B5IC0gQ29weSB0aGUgc3BlY2lmaWVkIGxpdmUgaW50ZXJ2YWwuIFRoaXMgY29waWVzIGFsbCB0aGUgZmllbGRzCisgICAgLy8vIGV4Y2VwdCBmb3IgdGhlIHJlZ2lzdGVyIG9mIHRoZSBpbnRlcnZhbC4KKyAgICB2b2lkIENvcHkoY29uc3QgTGl2ZUludGVydmFsICZSSFMsIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSwKKyAgICAgICAgICAgICAgVk5JbmZvOjpBbGxvY2F0b3IgJlZOSW5mb0FsbG9jYXRvcik7CisgICAgCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHJhbmdlcy5lbXB0eSgpOyB9CisKKyAgICAvLy8gYmVnaW5JbmRleCAtIFJldHVybiB0aGUgbG93ZXN0IG51bWJlcmVkIHNsb3QgY292ZXJlZCBieSBpbnRlcnZhbC4KKyAgICBTbG90SW5kZXggYmVnaW5JbmRleCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2FsbCB0byBiZWdpbkluZGV4KCkgb24gZW1wdHkgaW50ZXJ2YWwuIik7CisgICAgICByZXR1cm4gcmFuZ2VzLmZyb250KCkuc3RhcnQ7CisgICAgfQorCisgICAgLy8vIGVuZE51bWJlciAtIHJldHVybiB0aGUgbWF4aW11bSBwb2ludCBvZiB0aGUgaW50ZXJ2YWwgb2YgdGhlIHdob2xlLAorICAgIC8vLyBleGNsdXNpdmUuCisgICAgU2xvdEluZGV4IGVuZEluZGV4KCkgY29uc3QgeworICAgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJDYWxsIHRvIGVuZEluZGV4KCkgb24gZW1wdHkgaW50ZXJ2YWwuIik7CisgICAgICByZXR1cm4gcmFuZ2VzLmJhY2soKS5lbmQ7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVkQXQoU2xvdEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXggPj0gZW5kSW5kZXgoKTsKKyAgICB9CisKKyAgICBib29sIGxpdmVBdChTbG90SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgLy8gbGl2ZUJlZm9yZUFuZEF0IC0gQ2hlY2sgaWYgdGhlIGludGVydmFsIGlzIGxpdmUgYXQgdGhlIGluZGV4IGFuZCB0aGUKKyAgICAvLyBpbmRleCBqdXN0IGJlZm9yZSBpdC4gSWYgaW5kZXggaXMgbGl2ZUF0LCBjaGVjayBpZiBpdCBzdGFydHMgYSBuZXcgbGl2ZQorICAgIC8vIHJhbmdlLklmIGl0IGRvZXMsIHRoZW4gY2hlY2sgaWYgdGhlIHByZXZpb3VzIGxpdmUgcmFuZ2UgZW5kcyBhdCBpbmRleC0xLgorICAgIGJvb2wgbGl2ZUJlZm9yZUFuZEF0KFNsb3RJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAvLy8ga2lsbGVkQXQgLSBSZXR1cm4gdHJ1ZSBpZiBhIGxpdmUgcmFuZ2UgZW5kcyBhdCBpbmRleC4gTm90ZSB0aGF0IHRoZSBraWxsCisgICAgLy8vIHBvaW50IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGhhbGYtb3BlbiBsaXZlIHJhbmdlLiBJdCBpcyB1c3VhbGx5IHRoZQorICAgIC8vLyBnZXREZWZJbmRleCgpIHNsb3QgZm9sbG93aW5nIGl0cyBsYXN0IHVzZS4KKyAgICBib29sIGtpbGxlZEF0KFNsb3RJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAvLy8ga2lsbGVkSW5SYW5nZSAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnRlcnZhbCBoYXMga2lsbHMgaW4gW1N0YXJ0LEVuZCkuCisgICAgLy8vIE5vdGUgdGhhdCB0aGUga2lsbCBwb2ludCBpcyBjb25zaWRlcmVkIHRoZSBlbmQgb2YgYSBsaXZlIHJhbmdlLCBzbyBpdCBpcworICAgIC8vLyBub3QgY29udGFpbmVkIGluIHRoZSBsaXZlIHJhbmdlLiBJZiBhIGxpdmUgcmFuZ2UgZW5kcyBhdCBFbmQsIGl0IHdvbid0CisgICAgLy8vIGJlIGNvdW50ZWQgYXMgYSBraWxsIGJ5IHRoaXMgbWV0aG9kLgorICAgIGJvb2wga2lsbGVkSW5SYW5nZShTbG90SW5kZXggU3RhcnQsIFNsb3RJbmRleCBFbmQpIGNvbnN0OworCisgICAgLy8vIGdldExpdmVSYW5nZUNvbnRhaW5pbmcgLSBSZXR1cm4gdGhlIGxpdmUgcmFuZ2UgdGhhdCBjb250YWlucyB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGluZGV4LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCisgICAgY29uc3QgTGl2ZVJhbmdlICpnZXRMaXZlUmFuZ2VDb250YWluaW5nKFNsb3RJbmRleCBJZHgpIGNvbnN0IHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIEkgPSBGaW5kTGl2ZVJhbmdlQ29udGFpbmluZyhJZHgpOworICAgICAgcmV0dXJuIEkgPT0gZW5kKCkgPyAwIDogJipJOworICAgIH0KKworICAgIC8vLyBnZXRMaXZlUmFuZ2VDb250YWluaW5nIC0gUmV0dXJuIHRoZSBsaXZlIHJhbmdlIHRoYXQgY29udGFpbnMgdGhlCisgICAgLy8vIHNwZWNpZmllZCBpbmRleCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICAgIExpdmVSYW5nZSAqZ2V0TGl2ZVJhbmdlQ29udGFpbmluZyhTbG90SW5kZXggSWR4KSB7CisgICAgICBpdGVyYXRvciBJID0gRmluZExpdmVSYW5nZUNvbnRhaW5pbmcoSWR4KTsKKyAgICAgIHJldHVybiBJID09IGVuZCgpID8gMCA6ICYqSTsKKyAgICB9CisKKyAgICAvLy8gZ2V0Vk5JbmZvQXQgLSBSZXR1cm4gdGhlIFZOSW5mbyB0aGF0IGlzIGxpdmUgYXQgSWR4LCBvciBOVUxMLgorICAgIFZOSW5mbyAqZ2V0Vk5JbmZvQXQoU2xvdEluZGV4IElkeCkgY29uc3QgeworICAgICAgY29uc3RfaXRlcmF0b3IgSSA9IEZpbmRMaXZlUmFuZ2VDb250YWluaW5nKElkeCk7CisgICAgICByZXR1cm4gSSA9PSBlbmQoKSA/IDAgOiBJLT52YWxubzsKKyAgICB9CisKKyAgICAvLy8gRmluZExpdmVSYW5nZUNvbnRhaW5pbmcgLSBSZXR1cm4gYW4gaXRlcmF0b3IgdG8gdGhlIGxpdmUgcmFuZ2UgdGhhdAorICAgIC8vLyBjb250YWlucyB0aGUgc3BlY2lmaWVkIGluZGV4LCBvciBlbmQoKSBpZiB0aGVyZSBpcyBub25lLgorICAgIGNvbnN0X2l0ZXJhdG9yIEZpbmRMaXZlUmFuZ2VDb250YWluaW5nKFNsb3RJbmRleCBJZHgpIGNvbnN0OworCisgICAgLy8vIEZpbmRMaXZlUmFuZ2VDb250YWluaW5nIC0gUmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBsaXZlIHJhbmdlIHRoYXQKKyAgICAvLy8gY29udGFpbnMgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgZW5kKCkgaWYgdGhlcmUgaXMgbm9uZS4KKyAgICBpdGVyYXRvciBGaW5kTGl2ZVJhbmdlQ29udGFpbmluZyhTbG90SW5kZXggSWR4KTsKKworICAgIC8vLyBmaW5kRGVmaW5lZFZOSW5mbyAtIEZpbmQgdGhlIGJ5IHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gaW5kZXggKHJlZ2lzdGVyIGludGVydmFsKSBvciBkZWZpbmVkIAorICAgIFZOSW5mbyAqZmluZERlZmluZWRWTkluZm9Gb3JSZWdJbnQoU2xvdEluZGV4IElkeCkgY29uc3Q7CisKKyAgICAvLy8gZmluZERlZmluZWRWTkluZm8gLSBGaW5kIHRoZSBWTkluZm8gdGhhdCdzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZAorICAgIC8vLyByZWdpc3RlciAoc3RhY2sgaW50ZXZhbCBvbmx5KS4KKyAgICBWTkluZm8gKmZpbmREZWZpbmVkVk5JbmZvRm9yU3RhY2tJbnQodW5zaWduZWQgUmVnKSBjb25zdDsKKworICAgIAorICAgIC8vLyBvdmVybGFwcyAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaXZlIGludGVydmFscyBpcworICAgIC8vLyBub3QgZW1wdHkuCisgICAgYm9vbCBvdmVybGFwcyhjb25zdCBMaXZlSW50ZXJ2YWwmIG90aGVyKSBjb25zdCB7CisgICAgICBpZiAob3RoZXIuZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIG92ZXJsYXBzRnJvbShvdGhlciwgb3RoZXIuYmVnaW4oKSk7CisgICAgfQorCisgICAgLy8vIG92ZXJsYXBzIC0gUmV0dXJuIHRydWUgaWYgdGhlIGxpdmUgaW50ZXJ2YWwgb3ZlcmxhcHMgYSByYW5nZSBzcGVjaWZpZWQKKyAgICAvLy8gYnkgW1N0YXJ0LCBFbmQpLgorICAgIGJvb2wgb3ZlcmxhcHMoU2xvdEluZGV4IFN0YXJ0LCBTbG90SW5kZXggRW5kKSBjb25zdDsKKworICAgIC8vLyBvdmVybGFwc0Zyb20gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGl2ZSBpbnRlcnZhbHMKKyAgICAvLy8gaXMgbm90IGVtcHR5LiAgVGhlIHNwZWNpZmllZCBpdGVyYXRvciBpcyBhIGhpbnQgdGhhdCB3ZSBjYW4gYmVnaW4KKyAgICAvLy8gc2Nhbm5pbmcgdGhlIE90aGVyIGludGVydmFsIHN0YXJ0aW5nIGF0IEkuCisgICAgYm9vbCBvdmVybGFwc0Zyb20oY29uc3QgTGl2ZUludGVydmFsJiBvdGhlciwgY29uc3RfaXRlcmF0b3IgSSkgY29uc3Q7CisKKyAgICAvLy8gYWRkUmFuZ2UgLSBBZGQgdGhlIHNwZWNpZmllZCBMaXZlUmFuZ2UgdG8gdGhpcyBpbnRlcnZhbCwgbWVyZ2luZworICAgIC8vLyBpbnRlcnZhbHMgYXMgYXBwcm9wcmlhdGUuICBUaGlzIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGluc2VydGVkIGxpdmUKKyAgICAvLy8gcmFuZ2UgKHdoaWNoIG1heSBoYXZlIGdyb3duIHNpbmNlIGl0IHdhcyBpbnNlcnRlZC4KKyAgICB2b2lkIGFkZFJhbmdlKExpdmVSYW5nZSBMUikgeworICAgICAgYWRkUmFuZ2VGcm9tKExSLCByYW5nZXMuYmVnaW4oKSk7CisgICAgfQorCisgICAgLy8vIGpvaW4gLSBKb2luIHR3byBsaXZlIGludGVydmFscyAodGhpcywgYW5kIG90aGVyKSB0b2dldGhlci4gIFRoaXMgYXBwbGllcworICAgIC8vLyBtYXBwaW5ncyB0byB0aGUgdmFsdWUgbnVtYmVycyBpbiB0aGUgTEhTL1JIUyBpbnRlcnZhbHMgYXMgc3BlY2lmaWVkLiAgSWYKKyAgICAvLy8gdGhlIGludGVydmFscyBhcmUgbm90IGpvaW5hYmxlLCB0aGlzIGFib3J0cy4KKyAgICB2b2lkIGpvaW4oTGl2ZUludGVydmFsICZPdGhlciwKKyAgICAgICAgICAgICAgY29uc3QgaW50ICpWYWxOb0Fzc2lnbm1lbnRzLAorICAgICAgICAgICAgICBjb25zdCBpbnQgKlJIU1ZhbE5vQXNzaWdubWVudHMsCisgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPFZOSW5mbyosIDE2PiAmTmV3Vk5JbmZvLAorICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkkpOworCisgICAgLy8vIGlzSW5PbmVMaXZlUmFuZ2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGlzIGVudGlyZWx5IGluIHRoZQorICAgIC8vLyBhIHNpbmdsZSBMaXZlUmFuZ2Ugb2YgdGhlIGxpdmUgaW50ZXJ2YWwuCisgICAgYm9vbCBpc0luT25lTGl2ZVJhbmdlKFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCk7CisKKyAgICAvLy8gcmVtb3ZlUmFuZ2UgLSBSZW1vdmUgdGhlIHNwZWNpZmllZCByYW5nZSBmcm9tIHRoaXMgaW50ZXJ2YWwuICBOb3RlIHRoYXQKKyAgICAvLy8gdGhlIHJhbmdlIG11c3QgYmUgYSBzaW5nbGUgTGl2ZVJhbmdlIGluIGl0cyBlbnRpcmV0eS4KKyAgICB2b2lkIHJlbW92ZVJhbmdlKFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVtb3ZlRGVhZFZhbE5vID0gZmFsc2UpOworCisgICAgdm9pZCByZW1vdmVSYW5nZShMaXZlUmFuZ2UgTFIsIGJvb2wgUmVtb3ZlRGVhZFZhbE5vID0gZmFsc2UpIHsKKyAgICAgIHJlbW92ZVJhbmdlKExSLnN0YXJ0LCBMUi5lbmQsIFJlbW92ZURlYWRWYWxObyk7CisgICAgfQorCisgICAgLy8vIHJlbW92ZVZhbE5vIC0gUmVtb3ZlIGFsbCB0aGUgcmFuZ2VzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSMuCisgICAgLy8vIEFsc28gcmVtb3ZlIHRoZSB2YWx1ZSMgZnJvbSB2YWx1ZSMgbGlzdC4KKyAgICB2b2lkIHJlbW92ZVZhbE5vKFZOSW5mbyAqVmFsTm8pOworCisgICAgLy8vIGdldFNpemUgLSBSZXR1cm5zIHRoZSBzdW0gb2Ygc2l6ZXMgb2YgYWxsIHRoZSBMaXZlUmFuZ2Uncy4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBnZXRTaXplKCkgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsaXZlIGludGVydmFsIGlzIHplcm8gbGVuZ3RoLCBpLmUuIG5vIGxpdmUgcmFuZ2VzCisgICAgLy8vIHNwYW4gaW5zdHJ1Y3Rpb25zLiBJdCBkb2Vzbid0IHBheSB0byBzcGlsbCBzdWNoIGFuIGludGVydmFsLgorICAgIGJvb2wgaXNaZXJvTGVuZ3RoKCkgY29uc3QgeworICAgICAgZm9yIChjb25zdF9pdGVyYXRvciBpID0gYmVnaW4oKSwgZSA9IGVuZCgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKGktPmVuZC5nZXRQcmV2SW5kZXgoKSA+IGktPnN0YXJ0KQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBpc1NwaWxsYWJsZSAtIENhbiB0aGlzIGludGVydmFsIGJlIHNwaWxsZWQ/CisgICAgYm9vbCBpc1NwaWxsYWJsZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB3ZWlnaHQgIT0gSFVHRV9WQUxGOworICAgIH0KKworICAgIC8vLyBtYXJrTm90U3BpbGxhYmxlIC0gTWFyayBpbnRlcnZhbCBhcyBub3Qgc3BpbGxhYmxlCisgICAgdm9pZCBtYXJrTm90U3BpbGxhYmxlKCkgeworICAgICAgd2VpZ2h0ID0gSFVHRV9WQUxGOworICAgIH0KKworICAgIC8vLyBDb21wdXRlSm9pbmVkV2VpZ2h0IC0gU2V0IHRoZSB3ZWlnaHQgb2YgYSBsaXZlIGludGVydmFsIGFmdGVyCisgICAgLy8vIE90aGVyIGhhcyBiZWVuIG1lcmdlZCBpbnRvIGl0LgorICAgIHZvaWQgQ29tcHV0ZUpvaW5lZFdlaWdodChjb25zdCBMaXZlSW50ZXJ2YWwgJk90aGVyKTsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExpdmVJbnRlcnZhbCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFNsb3RJbmRleCAmdGhpc0luZGV4ID0gYmVnaW5JbmRleCgpOworICAgICAgY29uc3QgU2xvdEluZGV4ICZvdGhlckluZGV4ID0gb3RoZXIuYmVnaW5JbmRleCgpOworICAgICAgcmV0dXJuICh0aGlzSW5kZXggPCBvdGhlckluZGV4IHx8CisgICAgICAgICAgICAgICh0aGlzSW5kZXggPT0gb3RoZXJJbmRleCAmJiByZWcgPCBvdGhlci5yZWcpKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSAwKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICBwcml2YXRlOgorCisgICAgUmFuZ2VzOjppdGVyYXRvciBhZGRSYW5nZUZyb20oTGl2ZVJhbmdlIExSLCBSYW5nZXM6Oml0ZXJhdG9yIEZyb20pOworICAgIHZvaWQgZXh0ZW5kSW50ZXJ2YWxFbmRUbyhSYW5nZXM6Oml0ZXJhdG9yIEksIFNsb3RJbmRleCBOZXdFbmQpOworICAgIFJhbmdlczo6aXRlcmF0b3IgZXh0ZW5kSW50ZXJ2YWxTdGFydFRvKFJhbmdlczo6aXRlcmF0b3IgSSwgU2xvdEluZGV4IE5ld1N0cik7CisgICAgdm9pZCBtYXJrVmFsTm9Gb3JEZWxldGlvbihWTkluZm8gKlYpOworCisgICAgTGl2ZUludGVydmFsJiBvcGVyYXRvcj0oY29uc3QgTGl2ZUludGVydmFsJiByaHMpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisKKyAgfTsKKworICBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBMaXZlSW50ZXJ2YWwgJkxJKSB7CisgICAgTEkucHJpbnQoT1MpOworICAgIHJldHVybiBPUzsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbEFuYWx5c2lzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDc3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5oCkBAIC0wLDAgKzEsNDU2IEBACisvLz09PS0tIExpdmVJbnRlcnZhbEFuYWx5c2lzLmggLSBMaXZlIEludGVydmFsIEFuYWx5c2lzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBMaXZlSW50ZXJ2YWwgYW5hbHlzaXMgcGFzcy4gIEdpdmVuIHNvbWUgbnVtYmVyaW5nIG9mCisvLyBlYWNoIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyAoaW4gdGhpcyBpbXBsZW1lbnRpb24gZGVwdGgtZmlyc3Qgb3JkZXIpIGFuCisvLyBpbnRlcnZhbCBbaSwgaikgaXMgc2FpZCB0byBiZSBhIGxpdmUgaW50ZXJ2YWwgZm9yIHJlZ2lzdGVyIHYgaWYgdGhlcmUgaXMgbm8KKy8vIGluc3RydWN0aW9uIHdpdGggbnVtYmVyIGonID4gaiBzdWNoIHRoYXQgdiBpcyBsaXZlIGF0IGonIGFuZCB0aGVyZSBpcyBubworLy8gaW5zdHJ1Y3Rpb24gd2l0aCBudW1iZXIgaScgPCBpIHN1Y2ggdGhhdCB2IGlzIGxpdmUgYXQgaScuIEluIHRoaXMKKy8vIGltcGxlbWVudGF0aW9uIGludGVydmFscyBjYW4gaGF2ZSBob2xlcywgaS5lLiBhbiBpbnRlcnZhbCBtaWdodCBsb29rIGxpa2UKKy8vIFsxLDIwKSwgWzUwLDY1KSwgWzEwMDAsMTAwMSkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElWRUlOVEVSVkFMX0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJVkVJTlRFUlZBTF9BTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBBbGlhc0FuYWx5c2lzOworICBjbGFzcyBMaXZlVmFyaWFibGVzOworICBjbGFzcyBNYWNoaW5lTG9vcEluZm87CisgIGNsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKyAgY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKKyAgY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworICBjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworICBjbGFzcyBWaXJ0UmVnTWFwOworICAKKyAgY2xhc3MgTGl2ZUludGVydmFscyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBNYWNoaW5lRnVuY3Rpb24qIG1mXzsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvKiBtcmlfOworICAgIGNvbnN0IFRhcmdldE1hY2hpbmUqIHRtXzsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8qIHRyaV87CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvKiB0aWlfOworICAgIEFsaWFzQW5hbHlzaXMgKmFhXzsKKyAgICBMaXZlVmFyaWFibGVzKiBsdl87CisgICAgU2xvdEluZGV4ZXMqIGluZGV4ZXNfOworCisgICAgLy8vIFNwZWNpYWwgcG9vbCBhbGxvY2F0b3IgZm9yIFZOSW5mbydzIChMaXZlSW50ZXJ2YWwgdmFsIykuCisgICAgLy8vCisgICAgVk5JbmZvOjpBbGxvY2F0b3IgVk5JbmZvQWxsb2NhdG9yOworCisgICAgdHlwZWRlZiBEZW5zZU1hcDx1bnNpZ25lZCwgTGl2ZUludGVydmFsKj4gUmVnMkludGVydmFsTWFwOworICAgIFJlZzJJbnRlcnZhbE1hcCByMmlNYXBfOworCisgICAgLy8vIGFsbG9jYXRhYmxlUmVnc18gLSBBIGJpdCB2ZWN0b3Igb2YgYWxsb2NhdGFibGUgcmVnaXN0ZXJzLgorICAgIEJpdFZlY3RvciBhbGxvY2F0YWJsZVJlZ3NfOworCisgICAgLy8vIENsb25lTUlzIC0gQSBsaXN0IG9mIGNsb25lcyBhcyByZXN1bHQgb2YgcmUtbWF0ZXJpYWxpemF0aW9uLgorICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVJbnN0cio+IENsb25lTUlzOworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIExpdmVJbnRlcnZhbHMoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIHNwaWxsIHdlaWdodCB0byBhc3NpZ24gdG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgICAgc3RhdGljIGZsb2F0IGdldFNwaWxsV2VpZ2h0KGJvb2wgaXNEZWYsIGJvb2wgaXNVc2UsIHVuc2lnbmVkIGxvb3BEZXB0aCk7CisKKyAgICAvLyBBZnRlciBzdW1taW5nIHRoZSBzcGlsbCB3ZWlnaHRzIG9mIGFsbCBkZWZzIGFuZCB1c2VzLCB0aGUgZmluYWwgd2VpZ2h0CisgICAgLy8gc2hvdWxkIGJlIG5vcm1hbGl6ZWQsIGRpdmlkaW5nIHRoZSB3ZWlnaHQgb2YgdGhlIGludGVydmFsIGJ5IGl0cyBzaXplLgorICAgIC8vIFRoaXMgZW5jb3VyYWdlcyBzcGlsbGluZyBvZiBpbnRlcnZhbHMgdGhhdCBhcmUgbGFyZ2UgYW5kIGhhdmUgZmV3IHVzZXMsCisgICAgLy8gYW5kIGRpc2NvdXJhZ2VzIHNwaWxsaW5nIG9mIHNtYWxsIGludGVydmFscyB3aXRoIG1hbnkgdXNlcy4KKyAgICB2b2lkIG5vcm1hbGl6ZVNwaWxsV2VpZ2h0KExpdmVJbnRlcnZhbCAmbGkpIHsKKyAgICAgIGxpLndlaWdodCAvPSBnZXRBcHByb3hpbWF0ZUluc3RydWN0aW9uQ291bnQobGkpICsgMjU7CisgICAgfQorCisgICAgdHlwZWRlZiBSZWcySW50ZXJ2YWxNYXA6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgUmVnMkludGVydmFsTWFwOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHIyaU1hcF8uYmVnaW4oKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHIyaU1hcF8uZW5kKCk7IH0KKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIHIyaU1hcF8uYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIHIyaU1hcF8uZW5kKCk7IH0KKyAgICB1bnNpZ25lZCBnZXROdW1JbnRlcnZhbHMoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpcjJpTWFwXy5zaXplKCk7IH0KKworICAgIExpdmVJbnRlcnZhbCAmZ2V0SW50ZXJ2YWwodW5zaWduZWQgcmVnKSB7CisgICAgICBSZWcySW50ZXJ2YWxNYXA6Oml0ZXJhdG9yIEkgPSByMmlNYXBfLmZpbmQocmVnKTsKKyAgICAgIGFzc2VydChJICE9IHIyaU1hcF8uZW5kKCkgJiYgIkludGVydmFsIGRvZXMgbm90IGV4aXN0IGZvciByZWdpc3RlciIpOworICAgICAgcmV0dXJuICpJLT5zZWNvbmQ7CisgICAgfQorCisgICAgY29uc3QgTGl2ZUludGVydmFsICZnZXRJbnRlcnZhbCh1bnNpZ25lZCByZWcpIGNvbnN0IHsKKyAgICAgIFJlZzJJbnRlcnZhbE1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IHIyaU1hcF8uZmluZChyZWcpOworICAgICAgYXNzZXJ0KEkgIT0gcjJpTWFwXy5lbmQoKSAmJiAiSW50ZXJ2YWwgZG9lcyBub3QgZXhpc3QgZm9yIHJlZ2lzdGVyIik7CisgICAgICByZXR1cm4gKkktPnNlY29uZDsKKyAgICB9CisKKyAgICBib29sIGhhc0ludGVydmFsKHVuc2lnbmVkIHJlZykgY29uc3QgeworICAgICAgcmV0dXJuIHIyaU1hcF8uY291bnQocmVnKTsKKyAgICB9CisKKyAgICAvLy8gaXNBbGxvY2F0YWJsZSAtIGlzIHRoZSBwaHlzaWNhbCByZWdpc3RlciByZWcgYWxsb2NhdGFibGUgaW4gdGhlIGN1cnJlbnQKKyAgICAvLy8gZnVuY3Rpb24/CisgICAgYm9vbCBpc0FsbG9jYXRhYmxlKHVuc2lnbmVkIHJlZykgY29uc3QgeworICAgICAgcmV0dXJuIGFsbG9jYXRhYmxlUmVnc18udGVzdChyZWcpOworICAgIH0KKworICAgIC8vLyBnZXRTY2FsZWRJbnRlcnZhbFNpemUgLSBnZXQgdGhlIHNpemUgb2YgYW4gaW50ZXJ2YWwgaW4gInVuaXRzLCIKKyAgICAvLy8gd2hlcmUgZXZlcnkgZnVuY3Rpb24gaXMgY29tcG9zZWQgb2Ygb25lIHRob3VzYW5kIHVuaXRzLiAgVGhpcworICAgIC8vLyBtZWFzdXJlIHNjYWxlcyBwcm9wZXJseSB3aXRoIGVtcHR5IGluZGV4IHNsb3RzIGluIHRoZSBmdW5jdGlvbi4KKyAgICBkb3VibGUgZ2V0U2NhbGVkSW50ZXJ2YWxTaXplKExpdmVJbnRlcnZhbCYgSSkgeworICAgICAgcmV0dXJuICgxMDAwLjAgKiBJLmdldFNpemUoKSkgLyBpbmRleGVzXy0+Z2V0SW5kZXhlc0xlbmd0aCgpOworICAgIH0KKworICAgIC8vLyBnZXRGdW5jSW5zdHJ1Y3Rpb25Db3VudCAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUKKyAgICAvLy8gY3VycmVudCBmdW5jdGlvbi4KKyAgICB1bnNpZ25lZCBnZXRGdW5jSW5zdHJ1Y3Rpb25Db3VudCgpIHsKKyAgICAgIHJldHVybiBpbmRleGVzXy0+Z2V0RnVuY3Rpb25TaXplKCk7CisgICAgfQorICAgIAorICAgIC8vLyBnZXRBcHByb3hpbWF0ZUluc3RydWN0aW9uQ291bnQgLSBjb21wdXRlcyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyCisgICAgLy8vIG9mIGluc3RydWN0aW9ucyBpbiBhIGdpdmVuIExpdmVJbnRlcnZhbC4KKyAgICB1bnNpZ25lZCBnZXRBcHByb3hpbWF0ZUluc3RydWN0aW9uQ291bnQoTGl2ZUludGVydmFsJiBJKSB7CisgICAgICBkb3VibGUgSW50ZXJ2YWxQZXJjZW50YWdlID0gZ2V0U2NhbGVkSW50ZXJ2YWxTaXplKEkpIC8gMTAwMC4wOworICAgICAgcmV0dXJuICh1bnNpZ25lZCkoSW50ZXJ2YWxQZXJjZW50YWdlICogaW5kZXhlc18tPmdldEZ1bmN0aW9uU2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLy8gY29uZmxpY3RzV2l0aFBoeXNSZWcgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBpcyB1c2VkIG9yCisgICAgLy8vIGRlZmluZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGludGVydmFsLiBDb3BpZXMgdG8gYW5kCisgICAgLy8vIGZyb20gbGkucmVnIGFyZSBhbGxvd2VkLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGFibGUgdG8gYW5hbHl6ZSBzaW1wbGUKKyAgICAvLy8gcmFuZ2VzIHRoYXQgc3RheSB3aXRoaW4gYSBzaW5nbGUgYmFzaWMgYmxvY2suIEFueXRoaW5nIGVsc2UgaXMKKyAgICAvLy8gY29uc2lkZXJlZCBhIGNvbmZsaWN0LgorICAgIGJvb2wgY29uZmxpY3RzV2l0aFBoeXNSZWcoY29uc3QgTGl2ZUludGVydmFsICZsaSwgVmlydFJlZ01hcCAmdnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVnKTsKKworICAgIC8vLyBjb25mbGljdHNXaXRoQWxpYXNSZWYgLSBTaW1pbGFyIHRvIGNvbmZsaWN0c1dpdGhQaHlzUmVnUmVmIGV4Y2VwdAorICAgIC8vLyBpdCBjaGVja3MgZm9yIGFsaWFzIHVzZXMgYW5kIGRlZnMuCisgICAgYm9vbCBjb25mbGljdHNXaXRoQWxpYXNSZWYoTGl2ZUludGVydmFsICZsaSwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLDMyPiAmSm9pbmVkQ29waWVzKTsKKworICAgIC8vIEludGVydmFsIGNyZWF0aW9uCisgICAgTGl2ZUludGVydmFsICZnZXRPckNyZWF0ZUludGVydmFsKHVuc2lnbmVkIHJlZykgeworICAgICAgUmVnMkludGVydmFsTWFwOjppdGVyYXRvciBJID0gcjJpTWFwXy5maW5kKHJlZyk7CisgICAgICBpZiAoSSA9PSByMmlNYXBfLmVuZCgpKQorICAgICAgICBJID0gcjJpTWFwXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIocmVnLCBjcmVhdGVJbnRlcnZhbChyZWcpKSkuZmlyc3Q7CisgICAgICByZXR1cm4gKkktPnNlY29uZDsKKyAgICB9CisKKyAgICAvLy8gZHVwSW50ZXJ2YWwgLSBEdXBsaWNhdGUgYSBsaXZlIGludGVydmFsLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgIC8vLyBtYW5hZ2luZyB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKyAgICBMaXZlSW50ZXJ2YWwgKmR1cEludGVydmFsKExpdmVJbnRlcnZhbCAqbGkpOworICAgIAorICAgIC8vLyBhZGRMaXZlUmFuZ2VUb0VuZE9mQmxvY2sgLSBHaXZlbiBhIHJlZ2lzdGVyIGFuZCBhbiBpbnN0cnVjdGlvbiwKKyAgICAvLy8gYWRkcyBhIGxpdmUgcmFuZ2UgZnJvbSB0aGF0IGluc3RydWN0aW9uIHRvIHRoZSBlbmQgb2YgaXRzIE1CQi4KKyAgICBMaXZlUmFuZ2UgYWRkTGl2ZVJhbmdlVG9FbmRPZkJsb2NrKHVuc2lnbmVkIHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciogc3RhcnRJbnN0KTsKKworICAgIC8vIEludGVydmFsIHJlbW92YWwKKworICAgIHZvaWQgcmVtb3ZlSW50ZXJ2YWwodW5zaWduZWQgUmVnKSB7CisgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgTGl2ZUludGVydmFsKj46Oml0ZXJhdG9yIEkgPSByMmlNYXBfLmZpbmQoUmVnKTsKKyAgICAgIGRlbGV0ZSBJLT5zZWNvbmQ7CisgICAgICByMmlNYXBfLmVyYXNlKEkpOworICAgIH0KKworICAgIFNsb3RJbmRleCBnZXRaZXJvSW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXhlc18tPmdldFplcm9JbmRleCgpOworICAgIH0KKworICAgIFNsb3RJbmRleCBnZXRJbnZhbGlkSW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXhlc18tPmdldEludmFsaWRJbmRleCgpOworICAgIH0KKworICAgIC8vLyBpc05vdEluTUlNYXAgLSByZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RyIGhhcyBiZWVuCisgICAgLy8vIHJlbW92ZWQgb3Igd2FzIG5ldmVyIGVudGVyZWQgaW4gdGhlIG1hcC4KKyAgICBib29sIGlzTm90SW5NSU1hcChjb25zdCBNYWNoaW5lSW5zdHIqIEluc3RyKSBjb25zdCB7CisgICAgICByZXR1cm4gIWluZGV4ZXNfLT5oYXNJbmRleChJbnN0cik7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGJhc2UgaW5kZXggb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLgorICAgIFNsb3RJbmRleCBnZXRJbnN0cnVjdGlvbkluZGV4KGNvbnN0IE1hY2hpbmVJbnN0ciAqaW5zdHIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpbmRleGVzXy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleChpbnN0cik7CisgICAgfQorICAgIAorICAgIC8vLyBSZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGluZGV4LgorICAgIE1hY2hpbmVJbnN0ciogZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoU2xvdEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXhlc18tPmdldEluc3RydWN0aW9uRnJvbUluZGV4KGluZGV4KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBpbiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgICAgU2xvdEluZGV4IGdldE1CQlN0YXJ0SWR4KGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICptYmIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpbmRleGVzXy0+Z2V0TUJCU3RhcnRJZHgobWJiKTsKKyAgICB9IAorCisgICAgLy8vIFJldHVybiB0aGUgbGFzdCBpbmRleCBpbiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgICAgU2xvdEluZGV4IGdldE1CQkVuZElkeChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXhlc18tPmdldE1CQkVuZElkeChtYmIpOworICAgIH0gCisKKyAgICBib29sIGlzTGl2ZUluVG9NQkIoY29uc3QgTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKm1iYikgY29uc3QgeworICAgICAgcmV0dXJuIGxpLmxpdmVBdChnZXRNQkJTdGFydElkeChtYmIpKTsKKyAgICB9CisKKyAgICBMaXZlUmFuZ2UqIGZpbmRFbnRlcmluZ1JhbmdlKExpdmVJbnRlcnZhbCAmbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSB7CisgICAgICByZXR1cm4gbGkuZ2V0TGl2ZVJhbmdlQ29udGFpbmluZyhnZXRNQkJTdGFydElkeChtYmIpKTsKKyAgICB9CisKKyAgICBib29sIGlzTGl2ZU91dE9mTUJCKGNvbnN0IExpdmVJbnRlcnZhbCAmbGksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSBjb25zdCB7CisgICAgICByZXR1cm4gbGkubGl2ZUF0KGdldE1CQkVuZElkeChtYmIpLmdldFByZXZTbG90KCkpOworICAgIH0KKworICAgIExpdmVSYW5nZSogZmluZEV4aXRpbmdSYW5nZShMaXZlSW50ZXJ2YWwgJmxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSB7CisgICAgICByZXR1cm4gbGkuZ2V0TGl2ZVJhbmdlQ29udGFpbmluZyhnZXRNQkJFbmRJZHgobWJiKS5nZXRQcmV2U2xvdCgpKTsKKyAgICB9CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogZ2V0TUJCRnJvbUluZGV4KFNsb3RJbmRleCBpbmRleCkgY29uc3QgeworICAgICAgcmV0dXJuIGluZGV4ZXNfLT5nZXRNQkJGcm9tSW5kZXgoaW5kZXgpOworICAgIH0KKworICAgIFNsb3RJbmRleCBnZXRNQkJUZXJtaW5hdG9yR2FwKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICptYmIpIHsKKyAgICAgIHJldHVybiBpbmRleGVzXy0+Z2V0VGVybWluYXRvckdhcChtYmIpOworICAgIH0KKworICAgIFNsb3RJbmRleCBJbnNlcnRNYWNoaW5lSW5zdHJJbk1hcHMoTWFjaGluZUluc3RyICpNSSkgeworICAgICAgcmV0dXJuIGluZGV4ZXNfLT5pbnNlcnRNYWNoaW5lSW5zdHJJbk1hcHMoTUkpOworICAgIH0KKworICAgIHZvaWQgUmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoTWFjaGluZUluc3RyICpNSSkgeworICAgICAgaW5kZXhlc18tPnJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKE1JKTsKKyAgICB9CisKKyAgICB2b2lkIFJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHMoTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUluc3RyICpOZXdNSSkgeworICAgICAgaW5kZXhlc18tPnJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHMoTUksIE5ld01JKTsKKyAgICB9CisKKyAgICB2b2lkIEluc2VydE1CQkluTWFwcyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgICAgICBpbmRleGVzXy0+aW5zZXJ0TUJCSW5NYXBzKE1CQik7CisgICAgfQorCisgICAgYm9vbCBmaW5kTGl2ZUluTUJCcyhTbG90SW5kZXggU3RhcnQsIFNsb3RJbmRleCBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUJhc2ljQmxvY2sqPiAmTUJCcykgY29uc3QgeworICAgICAgcmV0dXJuIGluZGV4ZXNfLT5maW5kTGl2ZUluTUJCcyhTdGFydCwgRW5kLCBNQkJzKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbnVtYmVyKCkgeworICAgICAgaW5kZXhlc18tPnJlbnVtYmVySW5kZXhlcygpOworICAgIH0KKworICAgIFZOSW5mbzo6QWxsb2NhdG9yJiBnZXRWTkluZm9BbGxvY2F0b3IoKSB7IHJldHVybiBWTkluZm9BbGxvY2F0b3I7IH0KKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworCisgICAgLy8vIHJ1bk9uTWFjaGluZUZ1bmN0aW9uIC0gcGFzcyBlbnRyeSBwb2ludAorICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24mKTsKKworICAgIC8vLyBwcmludCAtIEltcGxlbWVudCB0aGUgZHVtcCBtZXRob2QuCisgICAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUqID0gMCkgY29uc3Q7CisKKyAgICAvLy8gYWRkSW50ZXJ2YWxzRm9yU3BpbGxzIC0gQ3JlYXRlIG5ldyBpbnRlcnZhbHMgZm9yIHNwaWxsZWQgZGVmcyAvIHVzZXMgb2YKKyAgICAvLy8gdGhlIGdpdmVuIGludGVydmFsLiBGSVhNRTogSXQgYWxzbyByZXR1cm5zIHRoZSB3ZWlnaHQgb2YgdGhlIHNwaWxsIHNsb3QKKyAgICAvLy8gKGlmIGFueSBpcyBjcmVhdGVkKSBieSByZWZlcmVuY2UuIFRoaXMgaXMgdGVtcG9yYXJ5LgorICAgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+CisgICAgYWRkSW50ZXJ2YWxzRm9yU3BpbGxzKGNvbnN0IExpdmVJbnRlcnZhbCYgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPExpdmVJbnRlcnZhbCo+ICZTcGlsbElzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8gKmxvb3BJbmZvLCBWaXJ0UmVnTWFwJiB2cm0pOworCisgICAgLy8vIHNwaWxsUGh5c1JlZ0Fyb3VuZFJlZ0RlZnNVc2VzIC0gU3BpbGwgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3RlcgorICAgIC8vLyBhcm91bmQgYWxsIGRlZnMgYW5kIHVzZXMgb2YgdGhlIHNwZWNpZmllZCBpbnRlcnZhbC4gUmV0dXJuIHRydWUgaWYgaXQKKyAgICAvLy8gd2FzIGFibGUgdG8gY3V0IGl0cyBpbnRlcnZhbC4KKyAgICBib29sIHNwaWxsUGh5c1JlZ0Fyb3VuZFJlZ0RlZnNVc2VzKGNvbnN0IExpdmVJbnRlcnZhbCAmbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQaHlzUmVnLCBWaXJ0UmVnTWFwICZ2cm0pOworCisgICAgLy8vIGlzUmVNYXRlcmlhbGl6YWJsZSAtIFJldHVybnMgdHJ1ZSBpZiBldmVyeSBkZWZpbml0aW9uIG9mIE1JIG9mIGV2ZXJ5CisgICAgLy8vIHZhbCMgb2YgdGhlIHNwZWNpZmllZCBpbnRlcnZhbCBpcyByZS1tYXRlcmlhbGl6YWJsZS4gQWxzbyByZXR1cm5zIHRydWUKKyAgICAvLy8gYnkgcmVmZXJlbmNlIGlmIGFsbCBvZiB0aGUgZGVmcyBhcmUgbG9hZCBpbnN0cnVjdGlvbnMuCisgICAgYm9vbCBpc1JlTWF0ZXJpYWxpemFibGUoY29uc3QgTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TGl2ZUludGVydmFsKj4gJlNwaWxsSXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNMb2FkKTsKKworICAgIC8vLyBpc1JlTWF0ZXJpYWxpemFibGUgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGRlZmluaXRpb24gTUkgb2YgdGhlIHNwZWNpZmllZAorICAgIC8vLyB2YWwjIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwgaXMgcmUtbWF0ZXJpYWxpemFibGUuCisgICAgYm9vbCBpc1JlTWF0ZXJpYWxpemFibGUoY29uc3QgTGl2ZUludGVydmFsICZsaSwgY29uc3QgVk5JbmZvICpWYWxObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk1JKTsKKworICAgIC8vLyBnZXRSZXByZXNlbnRhdGl2ZVJlZyAtIEZpbmQgdGhlIGxhcmdlc3Qgc3VwZXIgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZAorICAgIC8vLyBwaHlzaWNhbCByZWdpc3Rlci4KKyAgICB1bnNpZ25lZCBnZXRSZXByZXNlbnRhdGl2ZVJlZyh1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgICAgLy8vIGdldE51bUNvbmZsaWN0c1dpdGhQaHlzUmVnIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlcyBhbmQgZGVmcyBvZiB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGludGVydmFsIHRoYXQgY29uZmxpY3RzIHdpdGggdGhlIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3Rlci4KKyAgICB1bnNpZ25lZCBnZXROdW1Db25mbGljdHNXaXRoUGh5c1JlZyhjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0OworCisgICAgLy8vIGludGVydmFsSXNJbk9uZU1CQiAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGludGVydmFsIGlzIGVudGlyZWx5CisgICAgLy8vIHdpdGhpbiBhIHNpbmdsZSBiYXNpYyBibG9jay4KKyAgICBib29sIGludGVydmFsSXNJbk9uZU1CQihjb25zdCBMaXZlSW50ZXJ2YWwgJmxpKSBjb25zdDsKKworICBwcml2YXRlOiAgICAgIAorICAgIC8vLyBjb21wdXRlSW50ZXJ2YWxzIC0gQ29tcHV0ZSBsaXZlIGludGVydmFscy4KKyAgICB2b2lkIGNvbXB1dGVJbnRlcnZhbHMoKTsKKworICAgIC8vLyBoYW5kbGVSZWdpc3RlckRlZiAtIHVwZGF0ZSBpbnRlcnZhbHMgZm9yIGEgcmVnaXN0ZXIgZGVmCisgICAgLy8vIChjYWxscyBoYW5kbGVQaHlzaWNhbFJlZ2lzdGVyRGVmIGFuZAorICAgIC8vLyBoYW5kbGVWaXJ0dWFsUmVnaXN0ZXJEZWYpCisgICAgdm9pZCBoYW5kbGVSZWdpc3RlckRlZihNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IE1JSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU9wZXJhbmQmIE1PLCB1bnNpZ25lZCBNT0lkeCk7CisKKyAgICAvLy8gaXNQYXJ0aWFsUmVkZWYgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGRlZiBhdCB0aGUgc3BlY2lmaWMgaW5kZXgKKyAgICAvLy8gaXMgcGFydGlhbGx5IHJlLWRlZmluaW5nIHRoZSBzcGVjaWZpZWQgbGl2ZSBpbnRlcnZhbC4gQSBjb21tb24gY2FzZSBvZgorICAgIC8vLyB0aGlzIGlzIGEgZGVmaW5pdGlvbiBvZiB0aGUgc3ViLXJlZ2lzdGVyLiAKKyAgICBib29sIGlzUGFydGlhbFJlZGVmKFNsb3RJbmRleCBNSUlkeCwgTWFjaGluZU9wZXJhbmQgJk1PLAorICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFsICZpbnRlcnZhbCk7CisKKyAgICAvLy8gaGFuZGxlVmlydHVhbFJlZ2lzdGVyRGVmIC0gdXBkYXRlIGludGVydmFscyBmb3IgYSB2aXJ0dWFsCisgICAgLy8vIHJlZ2lzdGVyIGRlZgorICAgIHZvaWQgaGFuZGxlVmlydHVhbFJlZ2lzdGVyRGVmKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RJbmRleCBNSUlkeCwgTWFjaGluZU9wZXJhbmQmIE1PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1PSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlcnZhbCYgaW50ZXJ2YWwpOworCisgICAgLy8vIGhhbmRsZVBoeXNpY2FsUmVnaXN0ZXJEZWYgLSB1cGRhdGUgaW50ZXJ2YWxzIGZvciBhIHBoeXNpY2FsIHJlZ2lzdGVyCisgICAgLy8vIGRlZi4KKyAgICB2b2lkIGhhbmRsZVBoeXNpY2FsUmVnaXN0ZXJEZWYoTWFjaGluZUJhc2ljQmxvY2sqIG1iYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIG1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggTUlJZHgsIE1hY2hpbmVPcGVyYW5kJiBNTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFsICZpbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpDb3B5TUkpOworCisgICAgLy8vIGhhbmRsZUxpdmVJblJlZ2lzdGVyIC0gQ3JlYXRlIGludGVydmFsIGZvciBhIGxpdmVpbiByZWdpc3Rlci4KKyAgICB2b2lkIGhhbmRsZUxpdmVJblJlZ2lzdGVyKE1hY2hpbmVCYXNpY0Jsb2NrKiBtYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggTUlJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWwgJmludGVydmFsLCBib29sIGlzQWxpYXMgPSBmYWxzZSk7CisKKyAgICAvLy8gZ2V0UmVNYXRJbXBsaWNpdFVzZSAtIElmIHRoZSByZW1hdCBkZWZpbml0aW9uIE1JIGhhcyBvbmUgKGZvciBub3csIHdlCisgICAgLy8vIG9ubHkgYWxsb3cgb25lKSB2aXJ0dWFsIHJlZ2lzdGVyIG9wZXJhbmQsIHRoZW4gaXRzIHVzZXMgYXJlIGltcGxpY2l0bHkKKyAgICAvLy8gdXNpbmcgdGhlIHJlZ2lzdGVyLiBSZXR1cm5zIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIHVuc2lnbmVkIGdldFJlTWF0SW1wbGljaXRVc2UoY29uc3QgTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0OworCisgICAgLy8vIGlzVmFsTm9BdmFpbGFibGVBdCAtIFJldHVybiB0cnVlIGlmIHRoZSB2YWwjIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwKKyAgICAvLy8gd2hpY2ggcmVhY2hlcyB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gYWxzbyByZWFjaGVzIHRoZSBzcGVjaWZpZWQgdXNlCisgICAgLy8vIGluZGV4LgorICAgIGJvb2wgaXNWYWxOb0F2YWlsYWJsZUF0KGNvbnN0IExpdmVJbnRlcnZhbCAmbGksIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IFVzZUlkeCkgY29uc3Q7CisKKyAgICAvLy8gaXNSZU1hdGVyaWFsaXphYmxlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBkZWZpbml0aW9uIE1JIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gdmFsIyBvZiB0aGUgc3BlY2lmaWVkIGludGVydmFsIGlzIHJlLW1hdGVyaWFsaXphYmxlLiBBbHNvIHJldHVybnMgdHJ1ZQorICAgIC8vLyBieSByZWZlcmVuY2UgaWYgdGhlIGRlZiBpcyBhIGxvYWQuCisgICAgYm9vbCBpc1JlTWF0ZXJpYWxpemFibGUoY29uc3QgTGl2ZUludGVydmFsICZsaSwgY29uc3QgVk5JbmZvICpWYWxObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxMaXZlSW50ZXJ2YWwqPiAmU3BpbGxJcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc0xvYWQpOworCisgICAgLy8vIHRyeUZvbGRNZW1vcnlPcGVyYW5kIC0gQXR0ZW1wdHMgdG8gZm9sZCBlaXRoZXIgYSBzcGlsbCAvIHJlc3RvcmUgZnJvbQorICAgIC8vLyBzbG90IC8gdG8gcmVnIG9yIGFueSByZW1hdGVyaWFsaXplZCBsb2FkIGludG8gaXRoIG9wZXJhbmQgb2Ygc3BlY2lmaWVkCisgICAgLy8vIE1JLiBJZiBpdCBpcyBzdWNjZXNzdWwsIE1JIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBNSSBhbmQKKyAgICAvLy8gcmV0dXJucyB0cnVlLgorICAgIGJvb2wgdHJ5Rm9sZE1lbW9yeU9wZXJhbmQoTWFjaGluZUluc3RyKiAmTUksIFZpcnRSZWdNYXAgJnZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqRGVmTUksIFNsb3RJbmRleCBJbnN0cklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NTLCBpbnQgRnJhbWVJbmRleCwgdW5zaWduZWQgUmVnKTsKKworICAgIC8vLyBjYW5Gb2xkTWVtb3J5T3BlcmFuZCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbG9hZCAvIHN0b3JlCisgICAgLy8vIGZvbGRpbmcgaXMgcG9zc2libGUuCisgICAgYm9vbCBjYW5Gb2xkTWVtb3J5T3BlcmFuZChNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlTWF0TG9hZFNTKSBjb25zdDsKKworICAgIC8vLyBhbnlLaWxsSW5NQkJBZnRlcklkeCAtIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIGtpbGwgb2YgdGhlIHNwZWNpZmllZAorICAgIC8vLyBWTkluZm8gdGhhdCdzIGFmdGVyIHRoZSBzcGVjaWZpZWQgaW5kZXggYnV0IGlzIHdpdGhpbiB0aGUgYmFzaWMgYmxvY2suCisgICAgYm9vbCBhbnlLaWxsSW5NQkJBZnRlcklkeChjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLCBjb25zdCBWTkluZm8gKlZOSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggSWR4KSBjb25zdDsKKworICAgIC8vLyBoYXNBbGxvY2F0YWJsZVN1cGVyUmVnIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3RlcgorICAgIC8vLyBoYXMgYW55IHN1cGVyIHJlZ2lzdGVyIHRoYXQncyBhbGxvY2F0YWJsZS4KKyAgICBib29sIGhhc0FsbG9jYXRhYmxlU3VwZXJSZWcodW5zaWduZWQgUmVnKSBjb25zdDsKKworICAgIC8vLyBTUkluZm8gLSBTcGlsbCAvIHJlc3RvcmUgaW5mby4KKyAgICBzdHJ1Y3QgU1JJbmZvIHsKKyAgICAgIFNsb3RJbmRleCBpbmRleDsKKyAgICAgIHVuc2lnbmVkIHZyZWc7CisgICAgICBib29sIGNhbkZvbGQ7CisgICAgICBTUkluZm8oU2xvdEluZGV4IGksIHVuc2lnbmVkIHZyLCBib29sIGYpCisgICAgICAgIDogaW5kZXgoaSksIHZyZWcodnIpLCBjYW5Gb2xkKGYpIHt9CisgICAgfTsKKworICAgIGJvb2wgYWxzb0ZvbGRBUmVzdG9yZShpbnQgSWQsIFNsb3RJbmRleCBpbmRleCwgdW5zaWduZWQgdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmUmVzdG9yZU1CQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLHN0ZDo6dmVjdG9yPFNSSW5mbz4gPiZSZXN0b3JlSWR4ZXMpOworICAgIHZvaWQgZXJhc2VSZXN0b3JlSW5mbyhpbnQgSWQsIFNsb3RJbmRleCBpbmRleCwgdW5zaWduZWQgdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmUmVzdG9yZU1CQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLHN0ZDo6dmVjdG9yPFNSSW5mbz4gPiZSZXN0b3JlSWR4ZXMpOworCisgICAgLy8vIGhhbmRsZVNwaWxsZWRJbXBEZWZzIC0gUmVtb3ZlIElNUExJQ0lUX0RFRiBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIGJlaW5nCisgICAgLy8vIHNwaWxsZWQgYW5kIGNyZWF0ZSBlbXB0eSBpbnRlcnZhbHMgZm9yIHRoZWlyIHVzZXMuCisgICAgdm9pZCBoYW5kbGVTcGlsbGVkSW1wRGVmcyhjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLCBWaXJ0UmVnTWFwICZ2cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiByYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+ICZOZXdMSXMpOworCisgICAgLy8vIHJld3JpdGVJbXBsaWNpdE9wcyAtIFJld3JpdGUgaW1wbGljaXQgdXNlIG9wZXJhbmRzIG9mIE1JIChpLmUuIHVzZXMgb2YKKyAgICAvLy8gaW50ZXJ2YWwgb24gdG8tYmUgcmUtbWF0ZXJpYWxpemVkIG9wZXJhbmRzIG9mIE1JKSB3aXRoIG5ldyByZWdpc3Rlci4KKyAgICB2b2lkIHJld3JpdGVJbXBsaWNpdE9wcyhjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgTmV3VlJlZywgVmlydFJlZ01hcCAmdnJtKTsKKworICAgIC8vLyByZXdyaXRlSW5zdHJ1Y3Rpb25Gb3JTcGlsbHMsIHJld3JpdGVJbnN0cnVjdGlvbnNGb3JTcGlsbHMgLSBIZWxwZXIKKyAgICAvLy8gZnVuY3Rpb25zIGZvciBhZGRJbnRlcnZhbHNGb3JTcGlsbHMgdG8gcmV3cml0ZSB1c2VzIC8gZGVmcyBmb3IgdGhlIGdpdmVuCisgICAgLy8vIGxpdmUgcmFuZ2UuCisgICAgYm9vbCByZXdyaXRlSW5zdHJ1Y3Rpb25Gb3JTcGlsbHMoY29uc3QgTGl2ZUludGVydmFsICZsaSwgY29uc3QgVk5JbmZvICpWTkksCisgICAgICAgIGJvb2wgVHJ5U3BsaXQsIFNsb3RJbmRleCBpbmRleCwgU2xvdEluZGV4IGVuZCwKKyAgICAgICAgTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUluc3RyICpPcmlnRGVmTUksIE1hY2hpbmVJbnN0ciAqRGVmTUksCisgICAgICAgIHVuc2lnbmVkIFNsb3QsIGludCBMZFNsb3QsCisgICAgICAgIGJvb2wgaXNMb2FkLCBib29sIGlzTG9hZFNTLCBib29sIERlZklzUmVNYXQsIGJvb2wgQ2FuRGVsZXRlLAorICAgICAgICBWaXJ0UmVnTWFwICZ2cm0sIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIHJjLAorICAgICAgICBTbWFsbFZlY3RvcjxpbnQsIDQ+ICZSZU1hdElkcywgY29uc3QgTWFjaGluZUxvb3BJbmZvICpsb29wSW5mbywKKyAgICAgICAgdW5zaWduZWQgJk5ld1ZSZWcsIHVuc2lnbmVkIEltcFVzZSwgYm9vbCAmSGFzRGVmLCBib29sICZIYXNVc2UsCisgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLHVuc2lnbmVkPiAmTUJCVlJlZ3NNYXAsCisgICAgICAgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+ICZOZXdMSXMpOworICAgIHZvaWQgcmV3cml0ZUluc3RydWN0aW9uc0ZvclNwaWxscyhjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLCBib29sIFRyeVNwbGl0LAorICAgICAgICBMaXZlSW50ZXJ2YWw6OlJhbmdlczo6Y29uc3RfaXRlcmF0b3IgJkksCisgICAgICAgIE1hY2hpbmVJbnN0ciAqT3JpZ0RlZk1JLCBNYWNoaW5lSW5zdHIgKkRlZk1JLCB1bnNpZ25lZCBTbG90LCBpbnQgTGRTbG90LAorICAgICAgICBib29sIGlzTG9hZCwgYm9vbCBpc0xvYWRTUywgYm9vbCBEZWZJc1JlTWF0LCBib29sIENhbkRlbGV0ZSwKKyAgICAgICAgVmlydFJlZ01hcCAmdnJtLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiByYywKKyAgICAgICAgU21hbGxWZWN0b3I8aW50LCA0PiAmUmVNYXRJZHMsIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAqbG9vcEluZm8sCisgICAgICAgIEJpdFZlY3RvciAmU3BpbGxNQkJzLAorICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCxzdGQ6OnZlY3RvcjxTUkluZm8+ID4gJlNwaWxsSWR4ZXMsCisgICAgICAgIEJpdFZlY3RvciAmUmVzdG9yZU1CQnMsCisgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLHN0ZDo6dmVjdG9yPFNSSW5mbz4gPiAmUmVzdG9yZUlkeGVzLAorICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCx1bnNpZ25lZD4gJk1CQlZSZWdzTWFwLAorICAgICAgICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiAmTmV3TElzKTsKKworICAgIC8vIE5vcm1hbGl6ZSB0aGUgc3BpbGwgd2VpZ2h0IG9mIGFsbCB0aGUgaW50ZXJ2YWxzIGluIE5ld0xJcy4KKyAgICB2b2lkIG5vcm1hbGl6ZVNwaWxsV2VpZ2h0cyhzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiAmTmV3TElzKTsKKworICAgIHN0YXRpYyBMaXZlSW50ZXJ2YWwqIGNyZWF0ZUludGVydmFsKHVuc2lnbmVkIFJlZyk7CisKKyAgICB2b2lkIHByaW50SW5zdHJzKHJhd19vc3RyZWFtICZPKSBjb25zdDsKKyAgICB2b2lkIGR1bXBJbnN0cnMoKSBjb25zdDsKKyAgfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVN0YWNrQW5hbHlzaXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVTdGFja0FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5ODRkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVTdGFja0FuYWx5c2lzLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vPT09LS0gTGl2ZVN0YWNrQW5hbHlzaXMuaCAtIExpdmUgU3RhY2sgU2xvdCBBbmFseXNpcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGxpdmUgc3RhY2sgc2xvdCBhbmFseXNpcyBwYXNzLiBJdCBpcyBhbmFsb2dvdXMgdG8KKy8vIGxpdmUgaW50ZXJ2YWwgYW5hbHlzaXMgZXhjZXB0IGl0J3MgYW5hbHl6aW5nIGxpdmVuZXNzIG9mIHN0YWNrIHNsb3RzIHJhdGhlcgorLy8gdGhhbiByZWdpc3RlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElWRVNUQUNLX0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJVkVTVEFDS19BTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWwuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgTGl2ZVN0YWNrcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICAvLy8gU3BlY2lhbCBwb29sIGFsbG9jYXRvciBmb3IgVk5JbmZvJ3MgKExpdmVJbnRlcnZhbCB2YWwjKS4KKyAgICAvLy8KKyAgICBWTkluZm86OkFsbG9jYXRvciBWTkluZm9BbGxvY2F0b3I7CisKKyAgICAvLy8gUzJJTWFwIC0gU3RhY2sgc2xvdCBpbmRpY2VzIHRvIGxpdmUgaW50ZXJ2YWwgbWFwcGluZy4KKyAgICAvLy8KKyAgICB0eXBlZGVmIHN0ZDo6bWFwPGludCwgTGl2ZUludGVydmFsPiBTUzJJbnRlcnZhbE1hcDsKKyAgICBTUzJJbnRlcnZhbE1hcCBTMklNYXA7CisKKyAgICAvLy8gUzJSQ01hcCAtIFN0YWNrIHNsb3QgaW5kaWNlcyB0byByZWdpc3RlciBjbGFzcyBtYXBwaW5nLgorICAgIHN0ZDo6bWFwPGludCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+IFMyUkNNYXA7CisgICAgCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIExpdmVTdGFja3MoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB0eXBlZGVmIFNTMkludGVydmFsTWFwOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIFNTMkludGVydmFsTWFwOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFMySU1hcC5iZWdpbigpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gUzJJTWFwLmVuZCgpOyB9CisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBTMklNYXAuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIFMySU1hcC5lbmQoKTsgfQorCisgICAgdW5zaWduZWQgZ2V0TnVtSW50ZXJ2YWxzKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKVMySU1hcC5zaXplKCk7IH0KKworICAgIExpdmVJbnRlcnZhbCAmZ2V0T3JDcmVhdGVJbnRlcnZhbChpbnQgU2xvdCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIHsKKyAgICAgIGFzc2VydChTbG90ID49IDAgJiYgIlNwaWxsIHNsb3QgaW5kaWNlIG11c3QgYmUgPj0gMCIpOworICAgICAgU1MySW50ZXJ2YWxNYXA6Oml0ZXJhdG9yIEkgPSBTMklNYXAuZmluZChTbG90KTsKKyAgICAgIGlmIChJID09IFMySU1hcC5lbmQoKSkgeworICAgICAgICBJID0gUzJJTWFwLmluc2VydChJLHN0ZDo6bWFrZV9wYWlyKFNsb3QsIExpdmVJbnRlcnZhbChTbG90LDAuMEYsdHJ1ZSkpKTsKKyAgICAgICAgUzJSQ01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoU2xvdCwgUkMpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSB0aGUgbGFyZ2VzdCBjb21tb24gc3ViY2xhc3MgcmVnaXN0ZXIgY2xhc3MuCisgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKk9sZFJDID0gUzJSQ01hcFtTbG90XTsKKyAgICAgICAgUzJSQ01hcFtTbG90XSA9IGdldENvbW1vblN1YkNsYXNzKE9sZFJDLCBSQyk7CisgICAgICB9CisgICAgICByZXR1cm4gSS0+c2Vjb25kOworICAgIH0KKworICAgIExpdmVJbnRlcnZhbCAmZ2V0SW50ZXJ2YWwoaW50IFNsb3QpIHsKKyAgICAgIGFzc2VydChTbG90ID49IDAgJiYgIlNwaWxsIHNsb3QgaW5kaWNlIG11c3QgYmUgPj0gMCIpOworICAgICAgU1MySW50ZXJ2YWxNYXA6Oml0ZXJhdG9yIEkgPSBTMklNYXAuZmluZChTbG90KTsKKyAgICAgIGFzc2VydChJICE9IFMySU1hcC5lbmQoKSAmJiAiSW50ZXJ2YWwgZG9lcyBub3QgZXhpc3QgZm9yIHN0YWNrIHNsb3QiKTsKKyAgICAgIHJldHVybiBJLT5zZWNvbmQ7CisgICAgfQorCisgICAgY29uc3QgTGl2ZUludGVydmFsICZnZXRJbnRlcnZhbChpbnQgU2xvdCkgY29uc3QgeworICAgICAgYXNzZXJ0KFNsb3QgPj0gMCAmJiAiU3BpbGwgc2xvdCBpbmRpY2UgbXVzdCBiZSA+PSAwIik7CisgICAgICBTUzJJbnRlcnZhbE1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IFMySU1hcC5maW5kKFNsb3QpOworICAgICAgYXNzZXJ0KEkgIT0gUzJJTWFwLmVuZCgpICYmICJJbnRlcnZhbCBkb2VzIG5vdCBleGlzdCBmb3Igc3RhY2sgc2xvdCIpOworICAgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgICB9CisKKyAgICBib29sIGhhc0ludGVydmFsKGludCBTbG90KSBjb25zdCB7CisgICAgICByZXR1cm4gUzJJTWFwLmNvdW50KFNsb3QpOworICAgIH0KKworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldEludGVydmFsUmVnQ2xhc3MoaW50IFNsb3QpIGNvbnN0IHsKKyAgICAgIGFzc2VydChTbG90ID49IDAgJiYgIlNwaWxsIHNsb3QgaW5kaWNlIG11c3QgYmUgPj0gMCIpOworICAgICAgc3RkOjptYXA8aW50LCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgIEkgPSBTMlJDTWFwLmZpbmQoU2xvdCk7CisgICAgICBhc3NlcnQoSSAhPSBTMlJDTWFwLmVuZCgpICYmCisgICAgICAgICAgICAgIlJlZ2lzdGVyIGNsYXNzIGluZm8gZG9lcyBub3QgZXhpc3QgZm9yIHN0YWNrIHNsb3QiKTsKKyAgICAgIHJldHVybiBJLT5zZWNvbmQ7CisgICAgfQorCisgICAgVk5JbmZvOjpBbGxvY2F0b3ImIGdldFZOSW5mb0FsbG9jYXRvcigpIHsgcmV0dXJuIFZOSW5mb0FsbG9jYXRvcjsgfQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisKKyAgICAvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24gLSBwYXNzIGVudHJ5IHBvaW50CisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiYpOworCisgICAgLy8vIHByaW50IC0gSW1wbGVtZW50IHRoZSBkdW1wIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8sIGNvbnN0IE1vZHVsZSogPSAwKSBjb25zdDsKKyAgfTsKK30KKworI2VuZGlmIC8qIExMVk1fQ09ERUdFTl9MSVZFU1RBQ0tfQU5BTFlTSVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTgyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlVmFyaWFibGVzLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL0xpdmVWYXJpYWJsZXMuaCAtIExpdmUgVmFyaWFibGUgQW5hbHlzaXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExpdmVWYXJpYWJsZXMgYW5hbHlzaXMgcGFzcy4gIEZvciBlYWNoIG1hY2hpbmUKKy8vIGluc3RydWN0aW9uIGluIHRoZSBmdW5jdGlvbiwgdGhpcyBwYXNzIGNhbGN1bGF0ZXMgdGhlIHNldCBvZiByZWdpc3RlcnMgdGhhdAorLy8gYXJlIGltbWVkaWF0ZWx5IGRlYWQgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gY2FsY3VsYXRlcworLy8gdGhlIHZhbHVlLCBidXQgaXQgaXMgbmV2ZXIgdXNlZCkgYW5kIHRoZSBzZXQgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHVzZWQgYnkKKy8vIHRoZSBpbnN0cnVjdGlvbiwgYnV0IGFyZSBuZXZlciB1c2VkIGFmdGVyIHRoZSBpbnN0cnVjdGlvbiAoaS5lLiwgdGhleSBhcmUKKy8vIGtpbGxlZCkuCisvLworLy8gVGhpcyBjbGFzcyBjb21wdXRlcyBsaXZlIHZhcmlhYmxlcyB1c2luZyBhIHNwYXJzZSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbgorLy8gdGhlIG1hY2hpbmUgY29kZSBTU0EgZm9ybS4gIFRoaXMgY2xhc3MgY29tcHV0ZXMgbGl2ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiBmb3IKKy8vIGVhY2ggdmlydHVhbCBhbmQgX3JlZ2lzdGVyIGFsbG9jYXRhYmxlXyBwaHlzaWNhbCByZWdpc3RlciBpbiBhIGZ1bmN0aW9uLiAgSXQKKy8vIHVzZXMgdGhlIGRvbWluYW5jZSBwcm9wZXJ0aWVzIG9mIFNTQSBmb3JtIHRvIGVmZmljaWVudGx5IGNvbXB1dGUgbGl2ZQorLy8gdmFyaWFibGVzIGZvciB2aXJ0dWFsIHJlZ2lzdGVycywgYW5kIGFzc3VtZXMgdGhhdCBwaHlzaWNhbCByZWdpc3RlcnMgYXJlIG9ubHkKKy8vIGxpdmUgd2l0aGluIGEgc2luZ2xlIGJhc2ljIGJsb2NrIChhbGxvd2luZyBpdCB0byBkbyBhIHNpbmdsZSBsb2NhbCBhbmFseXNpcworLy8gdG8gcmVzb2x2ZSBwaHlzaWNhbCByZWdpc3RlciBsaWZldGltZXMgaW4gZWFjaCBiYXNpYyBibG9jaykuICBJZiBhIHBoeXNpY2FsCisvLyByZWdpc3RlciBpcyBub3QgcmVnaXN0ZXIgYWxsb2NhdGFibGUsIGl0IGlzIG5vdCB0cmFja2VkLiAgVGhpcyBpcyB1c2VmdWwgZm9yCisvLyB0aGluZ3MgbGlrZSB0aGUgc3RhY2sgcG9pbnRlciBhbmQgY29uZGl0aW9uIGNvZGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xJVkVWQVJJQUJMRVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTElWRVZBUklBQkxFU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TcGFyc2VCaXRWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCitjbGFzcyBMaXZlVmFyaWFibGVzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICBMaXZlVmFyaWFibGVzKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgIC8vLyBWYXJJbmZvIC0gVGhpcyByZXByZXNlbnRzIHRoZSByZWdpb25zIHdoZXJlIGEgdmlydHVhbCByZWdpc3RlciBpcyBsaXZlIGluCisgIC8vLyB0aGUgcHJvZ3JhbS4gIFdlIHJlcHJlc2VudCB0aGlzIHdpdGggdGhyZWUgZGlmZmVyZW50IHBpZWNlcyBvZgorICAvLy8gaW5mb3JtYXRpb246IHRoZSBzZXQgb2YgYmxvY2tzIGluIHdoaWNoIHRoZSBpbnN0cnVjdGlvbiBpcyBsaXZlCisgIC8vLyB0aHJvdWdob3V0LCB0aGUgc2V0IG9mIGJsb2NrcyBpbiB3aGljaCB0aGUgaW5zdHJ1Y3Rpb24gaXMgYWN0dWFsbHkgdXNlZCwKKyAgLy8vIGFuZCB0aGUgc2V0IG9mIG5vbi1waGkgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHRoZSBsYXN0IHVzZXJzIG9mIHRoZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBJbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYSB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBraWxsZWQgaW4gdGhlIHNhbWUgYmxvY2ssCisgIC8vLyBUaGVyZSBpcyBvbmUga2lsbGluZyBpbnN0cnVjdGlvbiwgYW5kIEFsaXZlQmxvY2tzIGlzIGVtcHR5LgorICAvLy8KKyAgLy8vIE90aGVyd2lzZSwgdGhlIHZhbHVlIGlzIGxpdmUgb3V0IG9mIHRoZSBibG9jay4gIElmIHRoZSB2YWx1ZSBpcyBsaXZlCisgIC8vLyB0aHJvdWdob3V0IGFueSBibG9ja3MsIHRoZXNlIGJsb2NrcyBhcmUgbGlzdGVkIGluIEFsaXZlQmxvY2tzLiAgQmxvY2tzCisgIC8vLyB3aGVyZSB0aGUgbGl2ZW5lc3MgcmFuZ2UgZW5kcyBhcmUgbm90IGluY2x1ZGVkIGluIEFsaXZlQmxvY2tzLCBpbnN0ZWFkCisgIC8vLyBiZWluZyBjYXB0dXJlZCBieSB0aGUgS2lsbHMgc2V0LiAgSW4gdGhlc2UgYmxvY2tzLCB0aGUgdmFsdWUgaXMgbGl2ZSBpbnRvCisgIC8vLyB0aGUgYmxvY2sgKHVubGVzcyB0aGUgdmFsdWUgaXMgZGVmaW5lZCBhbmQga2lsbGVkIGluIHRoZSBzYW1lIGJsb2NrKSBhbmQKKyAgLy8vIGxpdmVzIHVudGlsIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgdGhlcmUgY2Fubm90IGV2ZXIgYmUgYQorICAvLy8gdmFsdWUgd2hvc2UgS2lsbHMgc2V0IGNvbnRhaW5zIHR3byBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgc2FtZSBiYXNpYyBibG9jay4KKyAgLy8vCisgIC8vLyBQSEkgbm9kZXMgY29tcGxpY2F0ZSB0aGluZ3MgYSBiaXQuICBJZiBhIFBISSBub2RlIGlzIHRoZSBsYXN0IHVzZXIgb2YgYQorICAvLy8gdmFsdWUgaW4gb25lIG9mIGl0cyBwcmVkZWNlc3NvciBibG9ja3MsIGl0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtpbGxzIHNldCwKKyAgLy8vIGJ1dCBkb2VzIGluY2x1ZGUgdGhlIHByZWRlY2Vzc29yIGJsb2NrIGluIHRoZSBBbGl2ZUJsb2NrcyBzZXQgKHVubGVzcyB0aGF0CisgIC8vLyBibG9jayBhbHNvIGRlZmluZXMgdGhlIHZhbHVlKS4gIFRoaXMgbGVhZHMgdG8gdGhlIChwZXJmZWN0bHkgc2Vuc2ljYWwpCisgIC8vLyBzaXR1YXRpb24gd2hlcmUgYSB2YWx1ZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGFuZCB0aGUgbGFzdCB1c2UgaXMgYSBwaGkKKyAgLy8vIG5vZGUgaW4gdGhlIHN1Y2Nlc3Nvci4gIEluIHRoaXMgY2FzZSwgQWxpdmVCbG9ja3MgaXMgZW1wdHkgKHRoZSB2YWx1ZSBpcworICAvLy8gbm90IGxpdmUgYWNyb3NzIGFueSAgYmxvY2tzKSBhbmQgS2lsbHMgaXMgZW1wdHkgKHBoaSBub2RlcyBhcmUgbm90CisgIC8vLyBpbmNsdWRlZCkuIFRoaXMgaXMgc2Vuc2ljYWwgYmVjYXVzZSB0aGUgdmFsdWUgbXVzdCBiZSBsaXZlIHRvIHRoZSBlbmQgb2YKKyAgLy8vIHRoZSBibG9jaywgYnV0IGlzIG5vdCBsaXZlIGluIGFueSBzdWNjZXNzb3IgYmxvY2tzLgorICBzdHJ1Y3QgVmFySW5mbyB7CisgICAgLy8vIEFsaXZlQmxvY2tzIC0gU2V0IG9mIGJsb2NrcyBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIGFsaXZlIGNvbXBsZXRlbHkKKyAgICAvLy8gdGhyb3VnaC4gIFRoaXMgaXMgYSBiaXQgc2V0IHdoaWNoIHVzZXMgdGhlIGJhc2ljIGJsb2NrIG51bWJlciBhcyBhbgorICAgIC8vLyBpbmRleC4KKyAgICAvLy8KKyAgICBTcGFyc2VCaXRWZWN0b3I8PiBBbGl2ZUJsb2NrczsKKworICAgIC8vLyBOdW1Vc2VzIC0gTnVtYmVyIG9mIHVzZXMgb2YgdGhpcyByZWdpc3RlciBhY3Jvc3MgdGhlIGVudGlyZSBmdW5jdGlvbi4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBOdW1Vc2VzOworCisgICAgLy8vIEtpbGxzIC0gTGlzdCBvZiBNYWNoaW5lSW5zdHJ1Y3Rpb24ncyB3aGljaCBhcmUgdGhlIGxhc3QgdXNlIG9mIHRoaXMKKyAgICAvLy8gdmlydHVhbCByZWdpc3RlciAoa2lsbCBpdCkgaW4gdGhlaXIgYmFzaWMgYmxvY2suCisgICAgLy8vCisgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyKj4gS2lsbHM7CisKKyAgICBWYXJJbmZvKCkgOiBOdW1Vc2VzKDApIHt9CisKKyAgICAvLy8gcmVtb3ZlS2lsbCAtIERlbGV0ZSBhIGtpbGwgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICAgLy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYSBraWxsCisgICAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpbnN0cnVjdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgcmVtb3ZlS2lsbChNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPjo6aXRlcmF0b3IKKyAgICAgICAgSSA9IHN0ZDo6ZmluZChLaWxscy5iZWdpbigpLCBLaWxscy5lbmQoKSwgTUkpOworICAgICAgaWYgKEkgPT0gS2lsbHMuZW5kKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIEtpbGxzLmVyYXNlKEkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8vIGZpbmRLaWxsIC0gRmluZCBhIGtpbGwgaW5zdHJ1Y3Rpb24gaW4gTUJCLiBSZXR1cm4gTlVMTCBpZiBub25lIGlzIGZvdW5kLgorICAgIE1hY2hpbmVJbnN0ciAqZmluZEtpbGwoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgICAvLy8gaXNMaXZlSW4gLSBJcyBSZWcgbGl2ZSBpbiB0byBNQkI/IFRoaXMgbWVhbnMgdGhhdCBSZWcgaXMgbGl2ZSB0aHJvdWdoCisgICAgLy8vIE1CQiwgb3IgaXQgaXMga2lsbGVkIGluIE1CQi4gSWYgUmVnIGlzIG9ubHkgdXNlZCBieSBQSEkgaW5zdHJ1Y3Rpb25zIGluCisgICAgLy8vIE1CQiwgaXQgaXMgbm90IGNvbnNpZGVyZWQgbGl2ZSBpbi4KKyAgICBib29sIGlzTGl2ZUluKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpOworCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBWaXJ0UmVnSW5mbyAtIFRoaXMgbGlzdCBpcyBhIG1hcHBpbmcgZnJvbSB2aXJ0dWFsIHJlZ2lzdGVyIG51bWJlciB0bworICAvLy8gdmFyaWFibGUgaW5mb3JtYXRpb24uICBGaXJzdFZpcnR1YWxSZWdpc3RlciBpcyBzdWJ0cmFjdGVkIGZyb20gdGhlIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVyIG51bWJlciBiZWZvcmUgaW5kZXhpbmcgaW50byB0aGlzIGxpc3QuCisgIC8vLworICBzdGQ6OnZlY3RvcjxWYXJJbmZvPiBWaXJ0UmVnSW5mbzsKKworICAvLy8gUEhJSm9pbnMgLSBsaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzIHRoYXQgYXJlIFBISSBqb2lucy4gVGhlc2UgcmVnaXN0ZXJzCisgIC8vLyBtYXkgaGF2ZSBtdWx0aXBsZSBkZWZpbml0aW9ucywgYW5kIHRoZXkgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nIHdoZW4KKyAgLy8vIGJ1aWxkaW5nIGxpdmUgaW50ZXJ2YWxzLgorICBTcGFyc2VCaXRWZWN0b3I8PiBQSElKb2luczsKKworICAvLy8gUmVzZXJ2ZWRSZWdpc3RlcnMgLSBUaGlzIHZlY3RvciBrZWVwcyB0cmFjayBvZiB3aGljaCByZWdpc3RlcnMKKyAgLy8vIGFyZSByZXNlcnZlZCByZWdpc3RlciB3aGljaCBhcmUgbm90IGFsbG9jYXRhYmxlIGJ5IHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgLy8vIFdlIGNhbiBub3QgdHJhY2sgbGl2ZW5lc3MgZm9yIHZhbHVlcyB0aGF0IGFyZSBpbiB0aGlzIHNldC4KKyAgLy8vCisgIEJpdFZlY3RvciBSZXNlcnZlZFJlZ2lzdGVyczsKKworcHJpdmF0ZTogICAvLyBJbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmVzCisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyogTVJJOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworCisgIC8vIFBoeXNSZWdJbmZvIC0gS2VlcCB0cmFjayBvZiB3aGljaCBpbnN0cnVjdGlvbiB3YXMgdGhlIGxhc3QgZGVmIG9mIGEKKyAgLy8gcGh5c2ljYWwgcmVnaXN0ZXIuIFRoaXMgaXMgYSBwdXJlbHkgbG9jYWwgcHJvcGVydHksIGJlY2F1c2UgYWxsIHBoeXNpY2FsCisgIC8vIHJlZ2lzdGVyIHJlZmVyZW5jZXMgYXJlIHByZXN1bWVkIGRlYWQgYWNyb3NzIGJhc2ljIGJsb2Nrcy4KKyAgTWFjaGluZUluc3RyICoqUGh5c1JlZ0RlZjsKKworICAvLyBQaHlzUmVnSW5mbyAtIEtlZXAgdHJhY2sgb2Ygd2hpY2ggaW5zdHJ1Y3Rpb24gd2FzIHRoZSBsYXN0IHVzZSBvZiBhCisgIC8vIHBoeXNpY2FsIHJlZ2lzdGVyLiBUaGlzIGlzIGEgcHVyZWx5IGxvY2FsIHByb3BlcnR5LCBiZWNhdXNlIGFsbCBwaHlzaWNhbAorICAvLyByZWdpc3RlciByZWZlcmVuY2VzIGFyZSBwcmVzdW1lZCBkZWFkIGFjcm9zcyBiYXNpYyBibG9ja3MuCisgIE1hY2hpbmVJbnN0ciAqKlBoeXNSZWdVc2U7CisKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+ICpQSElWYXJJbmZvOworCisgIC8vIERpc3RhbmNlTWFwIC0gS2VlcCB0cmFjayB0aGUgZGlzdGFuY2Ugb2YgYSBNSSBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gY3VycmVudCBiYXNpYyBibG9jay4KKyAgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+IERpc3RhbmNlTWFwOworCisgIC8vLyBIYW5kbGVQaHlzUmVnS2lsbCAtIEFkZCBraWxscyBvZiBSZWcgYW5kIGl0cyBzdWItcmVnaXN0ZXJzIHRvIHRoZQorICAvLy8gdXNlcy4gUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHRoZSBzdWItcmVnaXN0ZXIgdXNlcyB3aGljaCBtYXkgY29tZSBiZWxvdworICAvLy8gdGhlIGxhc3QgdXNlIG9mIHRoZSB3aG9sZSByZWdpc3Rlci4KKyAgYm9vbCBIYW5kbGVQaHlzUmVnS2lsbCh1bnNpZ25lZCBSZWcsIE1hY2hpbmVJbnN0ciAqTUkpOworCisgIHZvaWQgSGFuZGxlUGh5c1JlZ1VzZSh1bnNpZ25lZCBSZWcsIE1hY2hpbmVJbnN0ciAqTUkpOworICB2b2lkIEhhbmRsZVBoeXNSZWdEZWYodW5zaWduZWQgUmVnLCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+ICZEZWZzKTsKKyAgdm9pZCBVcGRhdGVQaHlzUmVnRGVmcyhNYWNoaW5lSW5zdHIgKk1JLCBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gJkRlZnMpOworCisgIC8vLyBGaW5kTGFzdFJlZk9yUGFydFJlZiAtIFJldHVybiB0aGUgbGFzdCByZWZlcmVuY2Ugb3IgcGFydGlhbCByZWZlcmVuY2Ugb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIE1hY2hpbmVJbnN0ciAqRmluZExhc3RSZWZPclBhcnRSZWYodW5zaWduZWQgUmVnKTsKKworICAvLy8gRmluZExhc3RQYXJ0aWFsRGVmIC0gUmV0dXJuIHRoZSBsYXN0IHBhcnRpYWwgZGVmIG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyLiBBbHNvIHJldHVybnMgdGhlIHN1Yi1yZWdpc3RlcnMgdGhhdCdyZSBkZWZpbmVkIGJ5IHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ciAqRmluZExhc3RQYXJ0aWFsRGVmKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxTZXQ8dW5zaWduZWQsND4gJlBhcnREZWZSZWdzKTsKKworICAvLy8gYW5hbHl6ZVBISU5vZGVzIC0gR2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBQSEkgbm9kZXMgaW4gaGVyZS4gSW4KKyAgLy8vIHBhcnRpY3VsYXIsIHdlIHdhbnQgdG8gbWFwIHRoZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiBvZiBhIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVyIHdoaWNoIGlzIHVzZWQgaW4gYSBQSEkgbm9kZS4gV2UgbWFwIHRoYXQgdG8gdGhlIEJCIHRoZSB2cmVnCisgIC8vLyBpcyBjb21pbmcgZnJvbS4KKyAgdm9pZCBhbmFseXplUEhJTm9kZXMoY29uc3QgTWFjaGluZUZ1bmN0aW9uJiBGbik7CitwdWJsaWM6CisKKyAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisgIC8vLyBSZWdpc3RlckRlZklzRGVhZCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gZGVmaW5lcyB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3RlciwgYnV0IHRoYXQgZGVmaW5pdGlvbiBpcyBkZWFkLgorICBib29sIFJlZ2lzdGVyRGVmSXNEZWFkKE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vICBBUEkgdG8gdXBkYXRlIGxpdmUgdmFyaWFibGUgaW5mb3JtYXRpb24KKworICAvLy8gcmVwbGFjZUtpbGxJbnN0cnVjdGlvbiAtIFVwZGF0ZSByZWdpc3RlciBraWxsIGluZm8gYnkgcmVwbGFjaW5nIGEga2lsbAorICAvLy8gaW5zdHJ1Y3Rpb24gd2l0aCBhIG5ldyBvbmUuCisgIHZvaWQgcmVwbGFjZUtpbGxJbnN0cnVjdGlvbih1bnNpZ25lZCBSZWcsIE1hY2hpbmVJbnN0ciAqT2xkTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk5ld01JKTsKKworICAvLy8gYWRkVmlydHVhbFJlZ2lzdGVyS2lsbGVkIC0gQWRkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWN0IHRoYXQgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIgaXMga2lsbGVkIGFmdGVyIGJlaW5nIHVzZWQgYnkgdGhlIHNwZWNpZmllZAorICAvLy8gaW5zdHJ1Y3Rpb24uIElmIEFkZElmTm90Rm91bmQgaXMgdHJ1ZSwgYWRkIGEgaW1wbGljaXQgb3BlcmFuZCBpZiBpdCdzCisgIC8vLyBub3QgZm91bmQuCisgIHZvaWQgYWRkVmlydHVhbFJlZ2lzdGVyS2lsbGVkKHVuc2lnbmVkIEluY29taW5nUmVnLCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFkZElmTm90Rm91bmQgPSBmYWxzZSkgeworICAgIGlmIChNSS0+YWRkUmVnaXN0ZXJLaWxsZWQoSW5jb21pbmdSZWcsIFRSSSwgQWRkSWZOb3RGb3VuZCkpCisgICAgICBnZXRWYXJJbmZvKEluY29taW5nUmVnKS5LaWxscy5wdXNoX2JhY2soTUkpOyAKKyAgfQorCisgIC8vLyByZW1vdmVWaXJ0dWFsUmVnaXN0ZXJLaWxsZWQgLSBSZW1vdmUgdGhlIHNwZWNpZmllZCBraWxsIG9mIHRoZSB2aXJ0dWFsCisgIC8vLyByZWdpc3RlciBmcm9tIHRoZSBsaXZlIHZhcmlhYmxlIGluZm9ybWF0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlCisgIC8vLyB2YXJpYWJsZSB3YXMgbWFya2VkIGFzIGtpbGxlZCBieSB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLAorICAvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHJlbW92ZVZpcnR1YWxSZWdpc3RlcktpbGxlZCh1bnNpZ25lZCByZWcsIE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgICBpZiAoIWdldFZhckluZm8ocmVnKS5yZW1vdmVLaWxsKE1JKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgUmVtb3ZlZCA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNLaWxsKCkgJiYgTU8uZ2V0UmVnKCkgPT0gcmVnKSB7CisgICAgICAgIE1PLnNldElzS2lsbChmYWxzZSk7CisgICAgICAgIFJlbW92ZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoUmVtb3ZlZCAmJiAiUmVnaXN0ZXIgaXMgbm90IHVzZWQgYnkgdGhpcyBpbnN0cnVjdGlvbiEiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyByZW1vdmVWaXJ0dWFsUmVnaXN0ZXJzS2lsbGVkIC0gUmVtb3ZlIGFsbCBraWxsZWQgaW5mbyBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIHZvaWQgcmVtb3ZlVmlydHVhbFJlZ2lzdGVyc0tpbGxlZChNYWNoaW5lSW5zdHIgKk1JKTsKKworICAvLy8gYWRkVmlydHVhbFJlZ2lzdGVyRGVhZCAtIEFkZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmFjdCB0aGF0IHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyIGlzIGRlYWQgYWZ0ZXIgYmVpbmcgdXNlZCBieSB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLiBJZgorICAvLy8gQWRkSWZOb3RGb3VuZCBpcyB0cnVlLCBhZGQgYSBpbXBsaWNpdCBvcGVyYW5kIGlmIGl0J3Mgbm90IGZvdW5kLgorICB2b2lkIGFkZFZpcnR1YWxSZWdpc3RlckRlYWQodW5zaWduZWQgSW5jb21pbmdSZWcsIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFkZElmTm90Rm91bmQgPSBmYWxzZSkgeworICAgIGlmIChNSS0+YWRkUmVnaXN0ZXJEZWFkKEluY29taW5nUmVnLCBUUkksIEFkZElmTm90Rm91bmQpKQorICAgICAgZ2V0VmFySW5mbyhJbmNvbWluZ1JlZykuS2lsbHMucHVzaF9iYWNrKE1JKTsKKyAgfQorCisgIC8vLyByZW1vdmVWaXJ0dWFsUmVnaXN0ZXJEZWFkIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQga2lsbCBvZiB0aGUgdmlydHVhbAorICAvLy8gcmVnaXN0ZXIgZnJvbSB0aGUgbGl2ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbi4gUmV0dXJucyB0cnVlIGlmIHRoZQorICAvLy8gdmFyaWFibGUgd2FzIG1hcmtlZCBkZWFkIGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24sIGZhbHNlCisgIC8vLyBvdGhlcndpc2UuCisgIGJvb2wgcmVtb3ZlVmlydHVhbFJlZ2lzdGVyRGVhZCh1bnNpZ25lZCByZWcsIE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgICBpZiAoIWdldFZhckluZm8ocmVnKS5yZW1vdmVLaWxsKE1JKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgUmVtb3ZlZCA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNEZWYoKSAmJiBNTy5nZXRSZWcoKSA9PSByZWcpIHsKKyAgICAgICAgTU8uc2V0SXNEZWFkKGZhbHNlKTsKKyAgICAgICAgUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoUmVtb3ZlZCAmJiAiUmVnaXN0ZXIgaXMgbm90IGRlZmluZWQgYnkgdGhpcyBpbnN0cnVjdGlvbiEiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpIHsKKyAgICBWaXJ0UmVnSW5mby5jbGVhcigpOworICB9CisKKyAgLy8vIGdldFZhckluZm8gLSBSZXR1cm4gdGhlIFZhckluZm8gc3RydWN0dXJlIGZvciB0aGUgc3BlY2lmaWVkIFZJUlRVQUwKKyAgLy8vIHJlZ2lzdGVyLgorICBWYXJJbmZvICZnZXRWYXJJbmZvKHVuc2lnbmVkIFJlZ0lkeCk7CisKKyAgdm9pZCBNYXJrVmlydFJlZ0FsaXZlSW5CbG9jayhWYXJJbmZvJiBWUkluZm8sIE1hY2hpbmVCYXNpY0Jsb2NrKiBEZWZCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIpOworICB2b2lkIE1hcmtWaXJ0UmVnQWxpdmVJbkJsb2NrKFZhckluZm8mIFZSSW5mbywgTWFjaGluZUJhc2ljQmxvY2sqIERlZkJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+ICZXb3JrTGlzdCk7CisgIHZvaWQgSGFuZGxlVmlydFJlZ0RlZih1bnNpZ25lZCByZWcsIE1hY2hpbmVJbnN0ciAqTUkpOworICB2b2lkIEhhbmRsZVZpcnRSZWdVc2UodW5zaWduZWQgcmVnLCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSk7CisKKyAgYm9vbCBpc0xpdmVJbih1bnNpZ25lZCBSZWcsIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIHsKKyAgICByZXR1cm4gZ2V0VmFySW5mbyhSZWcpLmlzTGl2ZUluKE1CQiwgUmVnLCAqTVJJKTsKKyAgfQorCisgIC8vLyBpc0xpdmVPdXQgLSBEZXRlcm1pbmUgaWYgUmVnIGlzIGxpdmUgb3V0IGZyb20gTUJCLCB3aGVuIG5vdCBjb25zaWRlcmluZworICAvLy8gUEhJIG5vZGVzLiBUaGlzIG1lYW5zIHRoYXQgUmVnIGlzIGVpdGhlciBraWxsZWQgYnkgYSBzdWNjZXNzb3IgYmxvY2sgb3IKKyAgLy8vIHBhc3NlZCB0aHJvdWdoIG9uZS4KKyAgYm9vbCBpc0xpdmVPdXQodW5zaWduZWQgUmVnLCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAvLy8gYWRkTmV3QmxvY2sgLSBBZGQgYSBuZXcgYmFzaWMgYmxvY2sgQkIgYmV0d2VlbiBEb21CQiBhbmQgU3VjY0JCLiBBbGwKKyAgLy8vIHZhcmlhYmxlcyB0aGF0IGFyZSBsaXZlIG91dCBvZiBEb21CQiBhbmQgbGl2ZSBpbnRvIFN1Y2NCQiB3aWxsIGJlIG1hcmtlZAorICAvLy8gYXMgcGFzc2luZyBsaXZlIHRocm91Z2ggQkIuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgbWFjaGluZSBjb2RlIGlzCisgIC8vLyBzdGlsbCBpbiBTU0EgZm9ybS4KKyAgdm9pZCBhZGROZXdCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkRvbUJCLAorICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjQkIpOworCisgIC8vLyBpc1BISUpvaW4gLSBSZXR1cm4gdHJ1ZSBpZiBSZWcgaXMgYSBwaGkgam9pbiByZWdpc3Rlci4KKyAgYm9vbCBpc1BISUpvaW4odW5zaWduZWQgUmVnKSB7IHJldHVybiBQSElKb2lucy50ZXN0KFJlZyk7IH0KKworICAvLy8gc2V0UEhJSm9pbiAtIE1hcmsgUmVnIGFzIGEgcGhpIGpvaW4gcmVnaXN0ZXIuCisgIHZvaWQgc2V0UEhJSm9pbih1bnNpZ25lZCBSZWcpIHsgUEhJSm9pbnMuc2V0KFJlZyk7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaE9SZWxvY2F0aW9uLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoT1JlbG9jYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzMwNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaE9SZWxvY2F0aW9uLmgKQEAgLTAsMCArMSw1NiBAQAorLy89PT0gTWFjaE9SZWxvY2F0aW9uLmggLSBNYWNoLU8gUmVsb2NhdGlvbiBJbmZvIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTWFjaE9SZWxvY2F0aW9uIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSE9fUkVMT0NBVElPTl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNIT19SRUxPQ0FUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIE1hY2hPUmVsb2NhdGlvbiAtIFRoaXMgc3RydWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVsb2NhdGlvbgorICAvLy8gdGhhdCBuZWVkcyB0byBiZSBlbWl0dGVkIHRvIHRoZSBmaWxlLgorICAvLy8gc2VlIDxtYWNoLW8vcmVsb2MuaD4KKyAgY2xhc3MgTWFjaE9SZWxvY2F0aW9uIHsKKyAgICB1aW50MzJfdCByX2FkZHJlc3M7ICAgLy8gb2Zmc2V0IGluIHRoZSBzZWN0aW9uIHRvIHdoYXQgaXMgYmVpbmcgIHJlbG9jYXRlZAorICAgIHVpbnQzMl90IHJfc3ltYm9sbnVtOyAvLyBzeW1ib2wgaW5kZXggaWYgcl9leHRlcm4gPT0gMSBlbHNlIHNlY3Rpb24gaW5kZXgKKyAgICBib29sICAgICByX3BjcmVsOyAgICAgLy8gd2FzIHJlbG9jYXRlZCBwYy1yZWxhdGl2ZSBhbHJlYWR5CisgICAgdWludDhfdCAgcl9sZW5ndGg7ICAgIC8vIGxlbmd0aCA9IDIgXiByX2xlbmd0aAorICAgIGJvb2wgICAgIHJfZXh0ZXJuOyAgICAvLyAKKyAgICB1aW50OF90ICByX3R5cGU7ICAgICAgLy8gaWYgbm90IDAsIG1hY2hpbmUtc3BlY2lmaWMgcmVsb2NhdGlvbiB0eXBlLgorICAgIGJvb2wgICAgIHJfc2NhdHRlcmVkOyAvLyAxID0gc2NhdHRlcmVkLCAwID0gbm9uLXNjYXR0ZXJlZAorICAgIGludDMyX3QgIHJfdmFsdWU7ICAgICAvLyB0aGUgdmFsdWUgdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkIGlzIHJlZmVycmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0by4KKyAgcHVibGljOiAgICAgIAorICAgIHVpbnQzMl90IGdldFBhY2tlZEZpZWxkcygpIGNvbnN0IHsKKyAgICAgIGlmIChyX3NjYXR0ZXJlZCkKKyAgICAgICAgcmV0dXJuICgxIDw8IDMxKSB8IChyX3BjcmVsIDw8IDMwKSB8ICgocl9sZW5ndGggJiAzKSA8PCAyOCkgfCAKKyAgICAgICAgICAoKHJfdHlwZSAmIDE1KSA8PCAyNCkgfCAocl9hZGRyZXNzICYgMHgwMEZGRkZGRik7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAocl9zeW1ib2xudW0gPDwgOCkgfCAocl9wY3JlbCA8PCA3KSB8ICgocl9sZW5ndGggJiAzKSA8PCA1KSB8CisgICAgICAgICAgKHJfZXh0ZXJuIDw8IDQpIHwgKHJfdHlwZSAmIDE1KTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIHJfc2NhdHRlcmVkID8gcl92YWx1ZSA6IHJfYWRkcmVzczsgfQorICAgIHVpbnQzMl90IGdldFJhd0FkZHJlc3MoKSBjb25zdCB7IHJldHVybiByX2FkZHJlc3M7IH0KKworICAgIE1hY2hPUmVsb2NhdGlvbih1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBpbmRleCwgYm9vbCBwY3JlbCwgdWludDhfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0LCB1aW50OF90IHR5cGUsIGJvb2wgc2NhdHRlcmVkID0gZmFsc2UsIAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gMCkgOiAKKyAgICAgIHJfYWRkcmVzcyhhZGRyKSwgcl9zeW1ib2xudW0oaW5kZXgpLCByX3BjcmVsKHBjcmVsKSwgcl9sZW5ndGgobGVuKSwKKyAgICAgIHJfZXh0ZXJuKGV4dCksIHJfdHlwZSh0eXBlKSwgcl9zY2F0dGVyZWQoc2NhdHRlcmVkKSwgcl92YWx1ZSh2YWx1ZSkge30KKyAgfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNIT19SRUxPQ0FUSU9OX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTU3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oCkBAIC0wLDAgKzEsNDU1IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbGxlY3QgdGhlIHNlcXVlbmNlIG9mIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGZvciBhIGJhc2ljIGJsb2NrLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVCQVNJQ0JMT0NLX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVCQVNJQ0JMT0NLX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFBhc3M7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyByYXdfb3N0cmVhbTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBpbGlzdF90cmFpdHM8TWFjaGluZUluc3RyPiA6IHB1YmxpYyBpbGlzdF9kZWZhdWx0X3RyYWl0czxNYWNoaW5lSW5zdHI+IHsKK3ByaXZhdGU6CisgIG11dGFibGUgaWxpc3RfaGFsZl9ub2RlPE1hY2hpbmVJbnN0cj4gU2VudGluZWw7CisKKyAgLy8gdGhpcyBpcyBvbmx5IHNldCBieSB0aGUgTWFjaGluZUJhc2ljQmxvY2sgb3duaW5nIHRoZSBMaXZlTGlzdAorICBmcmllbmQgY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CisgIE1hY2hpbmVCYXNpY0Jsb2NrKiBQYXJlbnQ7CisKK3B1YmxpYzoKKyAgTWFjaGluZUluc3RyICpjcmVhdGVTZW50aW5lbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWFjaGluZUluc3RyKj4oJlNlbnRpbmVsKTsKKyAgfQorICB2b2lkIGRlc3Ryb3lTZW50aW5lbChNYWNoaW5lSW5zdHIgKikgY29uc3Qge30KKworICBNYWNoaW5lSW5zdHIgKnByb3ZpZGVJbml0aWFsSGVhZCgpIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7IH0KKyAgTWFjaGluZUluc3RyICplbnN1cmVIZWFkKE1hY2hpbmVJbnN0ciopIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7IH0KKyAgc3RhdGljIHZvaWQgbm90ZUhlYWQoTWFjaGluZUluc3RyKiwgTWFjaGluZUluc3RyKikge30KKworICB2b2lkIGFkZE5vZGVUb0xpc3QoTWFjaGluZUluc3RyKiBOKTsKKyAgdm9pZCByZW1vdmVOb2RlRnJvbUxpc3QoTWFjaGluZUluc3RyKiBOKTsKKyAgdm9pZCB0cmFuc2Zlck5vZGVzRnJvbUxpc3QoaWxpc3RfdHJhaXRzICZTcmNUcmFpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsaXN0X2l0ZXJhdG9yPE1hY2hpbmVJbnN0cj4gZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsaXN0X2l0ZXJhdG9yPE1hY2hpbmVJbnN0cj4gbGFzdCk7CisgIHZvaWQgZGVsZXRlTm9kZShNYWNoaW5lSW5zdHIgKk4pOworcHJpdmF0ZToKKyAgdm9pZCBjcmVhdGVOb2RlKGNvbnN0IE1hY2hpbmVJbnN0ciAmKTsKK307CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrIDogcHVibGljIGlsaXN0X25vZGU8TWFjaGluZUJhc2ljQmxvY2s+IHsKKyAgdHlwZWRlZiBpbGlzdDxNYWNoaW5lSW5zdHI+IEluc3RydWN0aW9uczsKKyAgSW5zdHJ1Y3Rpb25zIEluc3RzOworICBjb25zdCBCYXNpY0Jsb2NrICpCQjsKKyAgaW50IE51bWJlcjsKKyAgTWFjaGluZUZ1bmN0aW9uICp4UGFyZW50OworICAKKyAgLy8vIFByZWRlY2Vzc29ycy9TdWNjZXNzb3JzIC0gS2VlcCB0cmFjayBvZiB0aGUgcHJlZGVjZXNzb3IgLyBzdWNjZXNzb3IKKyAgLy8vIGJhc2ljYmxvY2tzLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPiBQcmVkZWNlc3NvcnM7CisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+IFN1Y2Nlc3NvcnM7CisKKyAgLy8vIExpdmVJbnMgLSBLZWVwIHRyYWNrIG9mIHRoZSBwaHlzaWNhbCByZWdpc3RlcnMgdGhhdCBhcmUgbGl2ZWluIG9mCisgIC8vLyB0aGUgYmFzaWNibG9jay4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IExpdmVJbnM7CisKKyAgLy8vIEFsaWdubWVudCAtIEFsaWdubWVudCBvZiB0aGUgYmFzaWMgYmxvY2suIFplcm8gaWYgdGhlIGJhc2ljIGJsb2NrIGRvZXMKKyAgLy8vIG5vdCBuZWVkIHRvIGJlIGFsaWduZWQuCisgIHVuc2lnbmVkIEFsaWdubWVudDsKKworICAvLy8gQWRkcmVzc1Rha2VuIC0gSW5kaWNhdGUgdGhhdCB0aGlzIGJhc2ljIGJsb2NrIGlzIHBvdGVudGlhbGx5IHRoZQorICAvLy8gdGFyZ2V0IG9mIGFuIGluZGlyZWN0IGJyYW5jaC4KKyAgYm9vbCBBZGRyZXNzVGFrZW47CisKKyAgLy8gSW50cnVzaXZlIGxpc3Qgc3VwcG9ydAorICBNYWNoaW5lQmFzaWNCbG9jaygpIHt9CisKKyAgZXhwbGljaXQgTWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUZ1bmN0aW9uICZtZiwgY29uc3QgQmFzaWNCbG9jayAqYmIpOworCisgIH5NYWNoaW5lQmFzaWNCbG9jaygpOworCisgIC8vIE1hY2hpbmVCYXNpY0Jsb2NrcyBhcmUgYWxsb2NhdGVkIGFuZCBvd25lZCBieSBNYWNoaW5lRnVuY3Rpb24uCisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisKK3B1YmxpYzoKKyAgLy8vIGdldEJhc2ljQmxvY2sgLSBSZXR1cm4gdGhlIExMVk0gYmFzaWMgYmxvY2sgdGhhdCB0aGlzIGluc3RhbmNlCisgIC8vLyBjb3JyZXNwb25kZWQgdG8gb3JpZ2luYWxseS4gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIE5VTEwgaWYgdGhpcyBpbnN0YW5jZQorICAvLy8gZG9lcyBub3QgY29ycmVzcG9uZCBkaXJlY3RseSB0byBhbiBMTFZNIGJhc2ljIGJsb2NrLgorICAvLy8KKyAgY29uc3QgQmFzaWNCbG9jayAqZ2V0QmFzaWNCbG9jaygpIGNvbnN0IHsgcmV0dXJuIEJCOyB9CisKKyAgLy8vIGdldE5hbWUgLSBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgTExWTSBiYXNpYyBibG9jaywgb3IKKyAgLy8vICIobnVsbCkiLgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworCisgIC8vLyBoYXNBZGRyZXNzVGFrZW4gLSBUZXN0IHdoZXRoZXIgdGhpcyBibG9jayBpcyBwb3RlbnRpYWxseSB0aGUgdGFyZ2V0CisgIC8vLyBvZiBhbiBpbmRpcmVjdCBicmFuY2guCisgIGJvb2wgaGFzQWRkcmVzc1Rha2VuKCkgY29uc3QgeyByZXR1cm4gQWRkcmVzc1Rha2VuOyB9CisKKyAgLy8vIHNldEhhc0FkZHJlc3NUYWtlbiAtIFNldCB0aGlzIGJsb2NrIHRvIHJlZmxlY3QgdGhhdCBpdCBwb3RlbnRpYWxseQorICAvLy8gaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdCBicmFuY2guCisgIHZvaWQgc2V0SGFzQWRkcmVzc1Rha2VuKCkgeyBBZGRyZXNzVGFrZW4gPSB0cnVlOyB9CisKKyAgLy8vIGdldFBhcmVudCAtIFJldHVybiB0aGUgTWFjaGluZUZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhpcyBiYXNpYyBibG9jay4KKyAgLy8vCisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4geFBhcmVudDsgfQorICBNYWNoaW5lRnVuY3Rpb24gKmdldFBhcmVudCgpIHsgcmV0dXJuIHhQYXJlbnQ7IH0KKworICB0eXBlZGVmIEluc3RydWN0aW9uczo6aXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgdHlwZWRlZiBJbnN0cnVjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKUluc3RzLnNpemUoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gSW5zdHMuZW1wdHkoKTsgfQorCisgIE1hY2hpbmVJbnN0ciYgZnJvbnQoKSB7IHJldHVybiBJbnN0cy5mcm9udCgpOyB9CisgIE1hY2hpbmVJbnN0ciYgYmFjaygpICB7IHJldHVybiBJbnN0cy5iYWNrKCk7IH0KKyAgY29uc3QgTWFjaGluZUluc3RyJiBmcm9udCgpIGNvbnN0IHsgcmV0dXJuIEluc3RzLmZyb250KCk7IH0KKyAgY29uc3QgTWFjaGluZUluc3RyJiBiYWNrKCkgIGNvbnN0IHsgcmV0dXJuIEluc3RzLmJhY2soKTsgfQorCisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgeyByZXR1cm4gSW5zdHMuYmVnaW4oKTsgIH0KKyAgY29uc3RfaXRlcmF0b3IgICAgICAgICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBJbnN0cy5iZWdpbigpOyAgfQorICBpdGVyYXRvciAgICAgICAgICAgICAgICAgIGVuZCgpICAgICAgIHsgcmV0dXJuIEluc3RzLmVuZCgpOyAgICB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgZW5kKCkgY29uc3QgeyByZXR1cm4gSW5zdHMuZW5kKCk7ICAgIH0KKyAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByYmVnaW4oKSAgICAgICB7IHJldHVybiBJbnN0cy5yYmVnaW4oKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluc3RzLnJiZWdpbigpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgcmVuZCAgKCkgICAgICAgeyByZXR1cm4gSW5zdHMucmVuZCgpOyAgIH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kICAoKSBjb25zdCB7IHJldHVybiBJbnN0cy5yZW5kKCk7ICAgfQorCisgIC8vIE1hY2hpbmUtQ0ZHIGl0ZXJhdG9ycworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+OjppdGVyYXRvciAgICAgICBwcmVkX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9wcmVkX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+OjppdGVyYXRvciAgICAgICBzdWNjX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9zdWNjX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+OjpyZXZlcnNlX2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkX3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3ByZWRfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPjo6cmV2ZXJzZV9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY19yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9zdWNjX3JldmVyc2VfaXRlcmF0b3I7CisKKyAgcHJlZF9pdGVyYXRvciAgICAgICAgcHJlZF9iZWdpbigpICAgICAgIHsgcmV0dXJuIFByZWRlY2Vzc29ycy5iZWdpbigpOyB9CisgIGNvbnN0X3ByZWRfaXRlcmF0b3IgIHByZWRfYmVnaW4oKSBjb25zdCB7IHJldHVybiBQcmVkZWNlc3NvcnMuYmVnaW4oKTsgfQorICBwcmVkX2l0ZXJhdG9yICAgICAgICBwcmVkX2VuZCgpICAgICAgICAgeyByZXR1cm4gUHJlZGVjZXNzb3JzLmVuZCgpOyAgIH0KKyAgY29uc3RfcHJlZF9pdGVyYXRvciAgcHJlZF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIFByZWRlY2Vzc29ycy5lbmQoKTsgICB9CisgIHByZWRfcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgcHJlZF9yYmVnaW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gUHJlZGVjZXNzb3JzLnJiZWdpbigpO30KKyAgY29uc3RfcHJlZF9yZXZlcnNlX2l0ZXJhdG9yICBwcmVkX3JiZWdpbigpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBQcmVkZWNlc3NvcnMucmJlZ2luKCk7fQorICBwcmVkX3JldmVyc2VfaXRlcmF0b3IgICAgICAgIHByZWRfcmVuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBQcmVkZWNlc3NvcnMucmVuZCgpOyAgfQorICBjb25zdF9wcmVkX3JldmVyc2VfaXRlcmF0b3IgIHByZWRfcmVuZCgpICAgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFByZWRlY2Vzc29ycy5yZW5kKCk7ICB9CisgIHVuc2lnbmVkICAgICAgICAgICAgIHByZWRfc2l6ZSgpICBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZClQcmVkZWNlc3NvcnMuc2l6ZSgpOworICB9CisgIGJvb2wgICAgICAgICAgICAgICAgIHByZWRfZW1wdHkoKSBjb25zdCB7IHJldHVybiBQcmVkZWNlc3NvcnMuZW1wdHkoKTsgfQorICBzdWNjX2l0ZXJhdG9yICAgICAgICBzdWNjX2JlZ2luKCkgICAgICAgeyByZXR1cm4gU3VjY2Vzc29ycy5iZWdpbigpOyAgIH0KKyAgY29uc3Rfc3VjY19pdGVyYXRvciAgc3VjY19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFN1Y2Nlc3NvcnMuYmVnaW4oKTsgICB9CisgIHN1Y2NfaXRlcmF0b3IgICAgICAgIHN1Y2NfZW5kKCkgICAgICAgICB7IHJldHVybiBTdWNjZXNzb3JzLmVuZCgpOyAgICAgfQorICBjb25zdF9zdWNjX2l0ZXJhdG9yICBzdWNjX2VuZCgpICAgY29uc3QgeyByZXR1cm4gU3VjY2Vzc29ycy5lbmQoKTsgICAgIH0KKyAgc3VjY19yZXZlcnNlX2l0ZXJhdG9yICAgICAgICBzdWNjX3JiZWdpbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBTdWNjZXNzb3JzLnJiZWdpbigpOyAgfQorICBjb25zdF9zdWNjX3JldmVyc2VfaXRlcmF0b3IgIHN1Y2NfcmJlZ2luKCkgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFN1Y2Nlc3NvcnMucmJlZ2luKCk7ICB9CisgIHN1Y2NfcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgc3VjY19yZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFN1Y2Nlc3NvcnMucmVuZCgpOyAgICB9CisgIGNvbnN0X3N1Y2NfcmV2ZXJzZV9pdGVyYXRvciAgc3VjY19yZW5kKCkgICBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gU3VjY2Vzc29ycy5yZW5kKCk7ICAgIH0KKyAgdW5zaWduZWQgICAgICAgICAgICAgc3VjY19zaXplKCkgIGNvbnN0IHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKVN1Y2Nlc3NvcnMuc2l6ZSgpOworICB9CisgIGJvb2wgICAgICAgICAgICAgICAgIHN1Y2NfZW1wdHkoKSBjb25zdCB7IHJldHVybiBTdWNjZXNzb3JzLmVtcHR5KCk7ICAgfQorCisgIC8vIExpdmVJbiBtYW5hZ2VtZW50IG1ldGhvZHMuCisKKyAgLy8vIGFkZExpdmVJbiAtIEFkZCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGFzIGEgbGl2ZSBpbi4gIE5vdGUgdGhhdCBpdAorICAvLy8gaXMgYW4gZXJyb3IgdG8gYWRkIHRoZSBzYW1lIHJlZ2lzdGVyIHRvIHRoZSBzYW1lIHNldCBtb3JlIHRoYW4gb25jZS4KKyAgdm9pZCBhZGRMaXZlSW4odW5zaWduZWQgUmVnKSAgeyBMaXZlSW5zLnB1c2hfYmFjayhSZWcpOyB9CisKKyAgLy8vIHJlbW92ZUxpdmVJbiAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGZyb20gdGhlIGxpdmUgaW4gc2V0LgorICAvLy8KKyAgdm9pZCByZW1vdmVMaXZlSW4odW5zaWduZWQgUmVnKTsKKworICAvLy8gaXNMaXZlSW4gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGlzIGluIHRoZSBsaXZlIGluIHNldC4KKyAgLy8vCisgIGJvb2wgaXNMaXZlSW4odW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLyBJdGVyYXRpb24gc3VwcG9ydCBmb3IgbGl2ZSBpbiBzZXRzLiAgVGhlc2Ugc2V0cyBhcmUga2VwdCBpbiBzb3J0ZWQKKyAgLy8gb3JkZXIgYnkgdGhlaXIgcmVnaXN0ZXIgbnVtYmVyLgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3IgbGl2ZWluX2l0ZXJhdG9yOworICBsaXZlaW5faXRlcmF0b3IgbGl2ZWluX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gTGl2ZUlucy5iZWdpbigpOyB9CisgIGxpdmVpbl9pdGVyYXRvciBsaXZlaW5fZW5kKCkgICBjb25zdCB7IHJldHVybiBMaXZlSW5zLmVuZCgpOyB9CisgIGJvb2wgICAgICAgICAgICBsaXZlaW5fZW1wdHkoKSBjb25zdCB7IHJldHVybiBMaXZlSW5zLmVtcHR5KCk7IH0KKworICAvLy8gZ2V0QWxpZ25tZW50IC0gUmV0dXJuIGFsaWdubWVudCBvZiB0aGUgYmFzaWMgYmxvY2suCisgIC8vLworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBBbGlnbm1lbnQ7IH0KKworICAvLy8gc2V0QWxpZ25tZW50IC0gU2V0IGFsaWdubWVudCBvZiB0aGUgYmFzaWMgYmxvY2suCisgIC8vLworICB2b2lkIHNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeyBBbGlnbm1lbnQgPSBBbGlnbjsgfQorCisgIC8vIENvZGUgTGF5b3V0IG1ldGhvZHMuCisgIAorICAvLy8gbW92ZUJlZm9yZS9tb3ZlQWZ0ZXIgLSBtb3ZlICd0aGlzJyBibG9jayBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHNwZWNpZmllZAorICAvLy8gYmxvY2suICBUaGlzIG9ubHkgbW92ZXMgdGhlIGJsb2NrLCBpdCBkb2VzIG5vdCBtb2RpZnkgdGhlIENGRyBvciBhZGp1c3QKKyAgLy8vIHBvdGVudGlhbCBmYWxsLXRocm91Z2hzIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorICB2b2lkIG1vdmVCZWZvcmUoTWFjaGluZUJhc2ljQmxvY2sgKk5ld0FmdGVyKTsKKyAgdm9pZCBtb3ZlQWZ0ZXIoTWFjaGluZUJhc2ljQmxvY2sgKk5ld0JlZm9yZSk7CisKKyAgLy8vIHVwZGF0ZVRlcm1pbmF0b3IgLSBVcGRhdGUgdGhlIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb25zIGluIGJsb2NrIHRvIGFjY291bnQKKyAgLy8vIGZvciBjaGFuZ2VzIHRvIHRoZSBsYXlvdXQuIElmIHRoZSBibG9jayBwcmV2aW91c2x5IHVzZWQgYSBmYWxsdGhyb3VnaCwKKyAgLy8vIGl0IG1heSBub3cgbmVlZCBhIGJyYW5jaCwgYW5kIGlmIGl0IHByZXZpb3VzbHkgdXNlZCBicmFuY2hpbmcgaXQgbWF5IG5vdworICAvLy8gYmUgYWJsZSB0byB1c2UgYSBmYWxsdGhyb3VnaC4KKyAgdm9pZCB1cGRhdGVUZXJtaW5hdG9yKCk7CisKKyAgLy8gTWFjaGluZS1DRkcgbXV0YXRvcnMKKyAgCisgIC8vLyBhZGRTdWNjZXNzb3IgLSBBZGQgc3VjYyBhcyBhIHN1Y2Nlc3NvciBvZiB0aGlzIE1hY2hpbmVCYXNpY0Jsb2NrLgorICAvLy8gVGhlIFByZWRlY2Vzc29ycyBsaXN0IG9mIHN1Y2MgaXMgYXV0b21hdGljYWxseSB1cGRhdGVkLgorICAvLy8KKyAgdm9pZCBhZGRTdWNjZXNzb3IoTWFjaGluZUJhc2ljQmxvY2sgKnN1Y2MpOworCisgIC8vLyByZW1vdmVTdWNjZXNzb3IgLSBSZW1vdmUgc3VjY2Vzc29yIGZyb20gdGhlIHN1Y2Nlc3NvcnMgbGlzdCBvZiB0aGlzCisgIC8vLyBNYWNoaW5lQmFzaWNCbG9jay4gVGhlIFByZWRlY2Vzc29ycyBsaXN0IG9mIHN1Y2MgaXMgYXV0b21hdGljYWxseSB1cGRhdGVkLgorICAvLy8KKyAgdm9pZCByZW1vdmVTdWNjZXNzb3IoTWFjaGluZUJhc2ljQmxvY2sgKnN1Y2MpOworCisgIC8vLyByZW1vdmVTdWNjZXNzb3IgLSBSZW1vdmUgc3BlY2lmaWVkIHN1Y2Nlc3NvciBmcm9tIHRoZSBzdWNjZXNzb3JzIGxpc3Qgb2YKKyAgLy8vIHRoaXMgTWFjaGluZUJhc2ljQmxvY2suIFRoZSBQcmVkZWNlc3NvcnMgbGlzdCBvZiBzdWNjIGlzIGF1dG9tYXRpY2FsbHkKKyAgLy8vIHVwZGF0ZWQuICBSZXR1cm4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBvbmUgcmVtb3ZlZC4KKyAgLy8vCisgIHN1Y2NfaXRlcmF0b3IgcmVtb3ZlU3VjY2Vzc29yKHN1Y2NfaXRlcmF0b3IgSSk7CisgIAorICAvLy8gdHJhbnNmZXJTdWNjZXNzb3JzIC0gVHJhbnNmZXJzIGFsbCB0aGUgc3VjY2Vzc29ycyBmcm9tIE1CQiB0byB0aGlzCisgIC8vLyBtYWNoaW5lIGJhc2ljIGJsb2NrIChpLmUuLCBjb3BpZXMgYWxsIHRoZSBzdWNjZXNzb3JzIGZyb21NQkIgYW5kCisgIC8vLyByZW1vdmUgYWxsIHRoZSBzdWNjZXNzb3JzIGZyb20gZnJvbU1CQikuCisgIHZvaWQgdHJhbnNmZXJTdWNjZXNzb3JzKE1hY2hpbmVCYXNpY0Jsb2NrICpmcm9tTUJCKTsKKworICAvLy8gdHJhbnNmZXJTdWNjZXNzb3JzQW5kVXBkYXRlUEhJcyAtIFRyYW5zZmVycyBhbGwgdGhlIHN1Y2Nlc3NvcnMsIGFzCisgIC8vLyBpbiB0cmFuc2ZlclN1Y2Nlc3NvcnMsIGFuZCB1cGRhdGUgUEhJIG9wZXJhbmRzIGluIHRoZSBzdWNjZXNzb3IgYmxvY2tzCisgIC8vLyB3aGljaCByZWZlciB0byBmcm9tTUJCIHRvIHJlZmVyIHRvIHRoaXMuCisgIHZvaWQgdHJhbnNmZXJTdWNjZXNzb3JzQW5kVXBkYXRlUEhJcyhNYWNoaW5lQmFzaWNCbG9jayAqZnJvbU1CQik7CisgIAorICAvLy8gaXNTdWNjZXNzb3IgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIE1CQiBpcyBhIHN1Y2Nlc3NvciBvZiB0aGlzCisgIC8vLyBibG9jay4KKyAgYm9vbCBpc1N1Y2Nlc3Nvcihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAvLy8gaXNMYXlvdXRTdWNjZXNzb3IgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIE1CQiB3aWxsIGJlIGVtaXR0ZWQKKyAgLy8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgYmxvY2ssIHN1Y2ggdGhhdCBpZiB0aGlzIGJsb2NrIGV4aXRzIGJ5CisgIC8vLyBmYWxsaW5nIHRocm91Z2gsIGNvbnRyb2wgd2lsbCB0cmFuc2ZlciB0byB0aGUgc3BlY2lmaWVkIE1CQi4gTm90ZQorICAvLy8gdGhhdCBNQkIgbmVlZCBub3QgYmUgYSBzdWNjZXNzb3IgYXQgYWxsLCBmb3IgZXhhbXBsZSBpZiB0aGlzIGJsb2NrCisgIC8vLyBlbmRzIHdpdGggYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gc29tZSBvdGhlciBibG9jay4KKyAgYm9vbCBpc0xheW91dFN1Y2Nlc3Nvcihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAvLy8gY2FuRmFsbFRocm91Z2ggLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgY2FuIGltcGxpY2l0bHkgdHJhbnNmZXIKKyAgLy8vIGNvbnRyb2wgdG8gdGhlIGJsb2NrIGFmdGVyIGl0IGJ5IGZhbGxpbmcgb2ZmIHRoZSBlbmQgb2YgaXQuICBUaGlzIHNob3VsZAorICAvLy8gcmV0dXJuIGZhbHNlIGlmIGl0IGNhbiByZWFjaCB0aGUgYmxvY2sgYWZ0ZXIgaXQsIGJ1dCBpdCB1c2VzIGFuIGV4cGxpY2l0CisgIC8vLyBicmFuY2ggdG8gZG8gc28gKGUuZy4sIGEgdGFibGUganVtcCkuICBUcnVlIGlzIGEgY29uc2VydmF0aXZlIGFuc3dlci4KKyAgYm9vbCBjYW5GYWxsVGhyb3VnaCgpOworCisgIC8vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgaW5zdHJ1Y3RvbiBpbiB0aGlzIGJsb2NrIHRoYXQgaXMgbm90IGEgCisgIC8vLyBQSElOb2RlIGluc3RydWN0aW9uLiBXaGVuIGFkZGluZyBpbnN0cnVjdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAvLy8gYmFzaWMgYmxvY2ssIHRoZXkgc2hvdWxkIGJlIGFkZGVkIGJlZm9yZSB0aGUgcmV0dXJuZWQgdmFsdWUsIG5vdCBiZWZvcmUKKyAgLy8vIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiwgd2hpY2ggbWlnaHQgYmUgUEhJLgorICAvLy8gUmV0dXJucyBlbmQoKSBpcyB0aGVyZSdzIG5vIG5vbi1QSEkgaW5zdHJ1Y3Rpb24uCisgIGl0ZXJhdG9yIGdldEZpcnN0Tm9uUEhJKCk7CisKKyAgLy8vIGdldEZpcnN0VGVybWluYXRvciAtIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IHRlcm1pbmF0b3IKKyAgLy8vIGluc3RydWN0aW9uIG9mIHRoaXMgYmFzaWMgYmxvY2suIElmIGEgdGVybWluYXRvciBkb2VzIG5vdCBleGlzdCwKKyAgLy8vIGl0IHJldHVybnMgZW5kKCkKKyAgaXRlcmF0b3IgZ2V0Rmlyc3RUZXJtaW5hdG9yKCk7CisKKyAgLy8vIFNwbGl0Q3JpdGljYWxFZGdlIC0gU3BsaXQgdGhlIGNyaXRpY2FsIGVkZ2UgZnJvbSB0aGlzIGJsb2NrIHRvIHRoZQorICAvLy8gZ2l2ZW4gc3VjY2Vzc29yIGJsb2NrLCBhbmQgcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGJsb2NrLCBvciBudWxsCisgIC8vLyBpZiBzcGxpdHRpbmcgaXMgbm90IHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBMaXZlVmFyaWFibGVzLCBNYWNoaW5lRG9taW5hdG9yVHJlZSwgYW5kCisgIC8vLyBNYWNoaW5lTG9vcEluZm8sIGFzIGFwcGxpY2FibGUuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpTcGxpdENyaXRpY2FsRWRnZShNYWNoaW5lQmFzaWNCbG9jayAqU3VjYywgUGFzcyAqUCk7CisKKyAgdm9pZCBwb3BfZnJvbnQoKSB7IEluc3RzLnBvcF9mcm9udCgpOyB9CisgIHZvaWQgcG9wX2JhY2soKSB7IEluc3RzLnBvcF9iYWNrKCk7IH0KKyAgdm9pZCBwdXNoX2JhY2soTWFjaGluZUluc3RyICpNSSkgeyBJbnN0cy5wdXNoX2JhY2soTUkpOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIElUPgorICB2b2lkIGluc2VydChpdGVyYXRvciBJLCBJVCBTLCBJVCBFKSB7IEluc3RzLmluc2VydChJLCBTLCBFKTsgfQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgTWFjaGluZUluc3RyICpNKSB7IHJldHVybiBJbnN0cy5pbnNlcnQoSSwgTSk7IH0KKworICAvLyBlcmFzZSAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgb3IgcmFuZ2UgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gbGlzdC4KKyAgLy8gVGhlc2UgZnVuY3Rpb25zIGRlbGV0ZSBhbnkgaW5zdHJ1Y3Rpb25zIHJlbW92ZWQuCisgIC8vCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIEkpICAgICAgICAgICAgIHsgcmV0dXJuIEluc3RzLmVyYXNlKEkpOyB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIEksIGl0ZXJhdG9yIEUpIHsgcmV0dXJuIEluc3RzLmVyYXNlKEksIEUpOyB9CisgIE1hY2hpbmVJbnN0ciAqcmVtb3ZlKE1hY2hpbmVJbnN0ciAqSSkgIHsgcmV0dXJuIEluc3RzLnJlbW92ZShJKTsgfQorICB2b2lkIGNsZWFyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEluc3RzLmNsZWFyKCk7IH0KKworICAvLy8gc3BsaWNlIC0gVGFrZSBhbiBpbnN0cnVjdGlvbiBmcm9tIE1CQiAnT3RoZXInIGF0IHRoZSBwb3NpdGlvbiBGcm9tLAorICAvLy8gYW5kIGluc2VydCBpdCBpbnRvIHRoaXMgTUJCIHJpZ2h0IGJlZm9yZSAnd2hlcmUnLgorICB2b2lkIHNwbGljZShpdGVyYXRvciB3aGVyZSwgTWFjaGluZUJhc2ljQmxvY2sgKk90aGVyLCBpdGVyYXRvciBGcm9tKSB7CisgICAgSW5zdHMuc3BsaWNlKHdoZXJlLCBPdGhlci0+SW5zdHMsIEZyb20pOworICB9CisKKyAgLy8vIHNwbGljZSAtIFRha2UgYSBibG9jayBvZiBpbnN0cnVjdGlvbnMgZnJvbSBNQkIgJ090aGVyJyBpbiB0aGUgcmFuZ2UgW0Zyb20sCisgIC8vLyBUbyksIGFuZCBpbnNlcnQgdGhlbSBpbnRvIHRoaXMgTUJCIHJpZ2h0IGJlZm9yZSAnd2hlcmUnLgorICB2b2lkIHNwbGljZShpdGVyYXRvciB3aGVyZSwgTWFjaGluZUJhc2ljQmxvY2sgKk90aGVyLCBpdGVyYXRvciBGcm9tLAorICAgICAgICAgICAgICBpdGVyYXRvciBUbykgeworICAgIEluc3RzLnNwbGljZSh3aGVyZSwgT3RoZXItPkluc3RzLCBGcm9tLCBUbyk7CisgIH0KKworICAvLy8gcmVtb3ZlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcKKyAgLy8vIGZ1bmN0aW9uLCBhbmQgcmV0dXJucyBpdCwgYnV0IGRvZXMgbm90IGRlbGV0ZSBpdC4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgCisgIC8vLyBlcmFzZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nCisgIC8vLyBmdW5jdGlvbiBhbmQgZGVsZXRlcyBpdC4KKyAgdm9pZCBlcmFzZUZyb21QYXJlbnQoKTsKKworICAvLy8gUmVwbGFjZVVzZXNPZkJsb2NrV2l0aCAtIEdpdmVuIGEgbWFjaGluZSBiYXNpYyBibG9jayB0aGF0IGJyYW5jaGVkIHRvCisgIC8vLyAnT2xkJywgY2hhbmdlIHRoZSBjb2RlIGFuZCBDRkcgc28gdGhhdCBpdCBicmFuY2hlcyB0byAnTmV3JyBpbnN0ZWFkLgorICB2b2lkIFJlcGxhY2VVc2VzT2ZCbG9ja1dpdGgoTWFjaGluZUJhc2ljQmxvY2sgKk9sZCwgTWFjaGluZUJhc2ljQmxvY2sgKk5ldyk7CisKKyAgLy8vIENvcnJlY3RFeHRyYUNGR0VkZ2VzIC0gVmFyaW91cyBwaWVjZXMgb2YgY29kZSBjYW4gY2F1c2UgZXhjZXNzIGVkZ2VzIGluCisgIC8vLyB0aGUgQ0ZHIHRvIGJlIGluc2VydGVkLiAgSWYgd2UgaGF2ZSBwcm92ZW4gdGhhdCBNQkIgY2FuIG9ubHkgYnJhbmNoIHRvCisgIC8vLyBEZXN0QSBhbmQgRGVzdEIsIHJlbW92ZSBhbnkgb3RoZXIgTUJCIHN1Y2Nlc3NvcnMgZnJvbSB0aGUgQ0ZHLiBEZXN0QSBhbmQKKyAgLy8vIERlc3RCIGNhbiBiZSBudWxsLiBCZXNpZGVzIERlc3RBIGFuZCBEZXN0QiwgcmV0YWluIG90aGVyIGVkZ2VzIGxlYWRpbmcKKyAgLy8vIHRvIExhbmRpbmdQYWRzIChjdXJyZW50bHkgdGhlcmUgY2FuIGJlIG9ubHkgb25lOyB3ZSBkb24ndCBjaGVjayBvciByZXF1aXJlCisgIC8vLyB0aGF0IGhlcmUpLiBOb3RlIGl0IGlzIHBvc3NpYmxlIHRoYXQgRGVzdEEgYW5kL29yIERlc3RCIGFyZSBMYW5kaW5nUGFkcy4KKyAgYm9vbCBDb3JyZWN0RXh0cmFDRkdFZGdlcyhNYWNoaW5lQmFzaWNCbG9jayAqRGVzdEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkRlc3RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNDb25kKTsKKworICAvLy8gZmluZERlYnVnTG9jIC0gZmluZCB0aGUgbmV4dCB2YWxpZCBEZWJ1Z0xvYyBzdGFydGluZyBhdCBNQkJJLCBza2lwcGluZworICAvLy8gYW55IERCR19WQUxVRSBpbnN0cnVjdGlvbnMuICBSZXR1cm4gVW5rbm93bkxvYyBpZiB0aGVyZSBpcyBub25lLgorICBEZWJ1Z0xvYyBmaW5kRGVidWdMb2MoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJKTsKKworICAvLyBEZWJ1Z2dpbmcgbWV0aG9kcy4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gZ2V0TnVtYmVyIC0gTWFjaGluZUJhc2ljQmxvY2tzIGFyZSB1bmlxdWVseSBudW1iZXJlZCBhdCB0aGUgZnVuY3Rpb24KKyAgLy8vIGxldmVsLCB1bmxlc3MgdGhleSdyZSBub3QgaW4gYSBNYWNoaW5lRnVuY3Rpb24geWV0LCBpbiB3aGljaCBjYXNlIHRoaXMKKyAgLy8vIHdpbGwgcmV0dXJuIC0xLgorICAvLy8KKyAgaW50IGdldE51bWJlcigpIGNvbnN0IHsgcmV0dXJuIE51bWJlcjsgfQorICB2b2lkIHNldE51bWJlcihpbnQgTikgeyBOdW1iZXIgPSBOOyB9CisKKyAgLy8vIGdldFN5bWJvbCAtIFJldHVybiB0aGUgTUNTeW1ib2wgZm9yIHRoaXMgYmFzaWMgYmxvY2suCisgIC8vLworICBNQ1N5bWJvbCAqZ2V0U3ltYm9sKCkgY29uc3Q7CisgIAorcHJpdmF0ZTogICAvLyBNZXRob2RzIHVzZWQgdG8gbWFpbnRhaW4gZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGJsb2Nrcy4uLgorICBmcmllbmQgc3RydWN0IGlsaXN0X3RyYWl0czxNYWNoaW5lQmFzaWNCbG9jaz47CisKKyAgLy8gTWFjaGluZS1DRkcgbXV0YXRvcnMKKworICAvLy8gYWRkUHJlZGVjZXNzb3IgLSBSZW1vdmUgcHJlZCBhcyBhIHByZWRlY2Vzc29yIG9mIHRoaXMgTWFjaGluZUJhc2ljQmxvY2suCisgIC8vLyBEb24ndCBkbyB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZywgYmVjYXVzZSBpdCBkb2Vzbid0CisgIC8vLyB1cGRhdGUgcHJlZCdzIHN1Y2Nlc3NvcnMgbGlzdC4gVXNlIHByZWQtPmFkZFN1Y2Nlc3NvciBpbnN0ZWFkLgorICAvLy8KKyAgdm9pZCBhZGRQcmVkZWNlc3NvcihNYWNoaW5lQmFzaWNCbG9jayAqcHJlZCk7CisKKyAgLy8vIHJlbW92ZVByZWRlY2Vzc29yIC0gUmVtb3ZlIHByZWQgYXMgYSBwcmVkZWNlc3NvciBvZiB0aGlzCisgIC8vLyBNYWNoaW5lQmFzaWNCbG9jay4gRG9uJ3QgZG8gdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUKKyAgLy8vIGRvaW5nLCBiZWNhdXNlIGl0IGRvZXNuJ3QgdXBkYXRlIHByZWQncyBzdWNjZXNzb3JzIGxpc3QuIFVzZQorICAvLy8gcHJlZC0+cmVtb3ZlU3VjY2Vzc29yIGluc3RlYWQuCisgIC8vLworICB2b2lkIHJlbW92ZVByZWRlY2Vzc29yKE1hY2hpbmVCYXNpY0Jsb2NrICpwcmVkKTsKK307CisKK3Jhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKK3ZvaWQgV3JpdGVBc09wZXJhbmQocmF3X29zdHJlYW0gJiwgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqLCBib29sIHQpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdyYXBoVHJhaXRzIHNwZWNpYWxpemF0aW9ucyBmb3IgbWFjaGluZSBiYXNpYyBibG9jayBncmFwaHMgKG1hY2hpbmUtQ0ZHcykKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEKKy8vIE1hY2hpbmVGdW5jdGlvbiBhcyBhIGdyYXBoIG9mIE1hY2hpbmVCYXNpY0Jsb2Nrcy4uLgorLy8KKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPE1hY2hpbmVCYXNpY0Jsb2NrICo+IHsKKyAgdHlwZWRlZiBNYWNoaW5lQmFzaWNCbG9jayBOb2RlVHlwZTsKKyAgdHlwZWRlZiBNYWNoaW5lQmFzaWNCbG9jazo6c3VjY19pdGVyYXRvciBDaGlsZEl0ZXJhdG9yVHlwZTsKKworICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShNYWNoaW5lQmFzaWNCbG9jayAqQkIpIHsgcmV0dXJuIEJCOyB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTi0+c3VjY19iZWdpbigpOworICB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPnN1Y2NfZW5kKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqPiB7CisgIHR5cGVkZWYgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgTm9kZVR5cGU7CisgIHR5cGVkZWYgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSB7IHJldHVybiBCQjsgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPnN1Y2NfYmVnaW4oKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBOLT5zdWNjX2VuZCgpOworICB9Cit9OworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEKKy8vIE1hY2hpbmVGdW5jdGlvbiBhcyBhIGdyYXBoIG9mIE1hY2hpbmVCYXNpY0Jsb2Nrcy4uLiBhbmQgdG8gd2FsayBpdAorLy8gaW4gaW52ZXJzZSBvcmRlci4gIEludmVyc2Ugb3JkZXIgZm9yIGEgZnVuY3Rpb24gaXMgY29uc2lkZXJlZAorLy8gdG8gYmUgd2hlbiB0cmF2ZXJzaW5nIHRoZSBwcmVkZWNlc3NvciBlZGdlcyBvZiBhIE1CQgorLy8gaW5zdGVhZCBvZiB0aGUgc3VjY2Vzc29yIGVkZ2VzLgorLy8KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPE1hY2hpbmVCYXNpY0Jsb2NrKj4gPiB7CisgIHR5cGVkZWYgTWFjaGluZUJhc2ljQmxvY2sgTm9kZVR5cGU7CisgIHR5cGVkZWYgTWFjaGluZUJhc2ljQmxvY2s6OnByZWRfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKEludmVyc2U8TWFjaGluZUJhc2ljQmxvY2sgKj4gRykgeworICAgIHJldHVybiBHLkdyYXBoOworICB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTi0+cHJlZF9iZWdpbigpOworICB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPnByZWRfZW5kKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKj4gPiB7CisgIHR5cGVkZWYgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgTm9kZVR5cGU7CisgIHR5cGVkZWYgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X3ByZWRfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKEludmVyc2U8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sqPiBHKSB7CisgICAgcmV0dXJuIEcuR3JhcGg7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBOLT5wcmVkX2JlZ2luKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTi0+cHJlZF9lbmQoKTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQ29kZUVtaXR0ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVDb2RlRW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmI0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQ29kZUVtaXR0ZXIuaApAQCAtMCwwICsxLDMzMiBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTWFjaGluZUNvZGVFbWl0dGVyLmggLSBDb2RlIGVtaXNzaW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBhYnN0cmFjdCBpbnRlcmZhY2UgdGhhdCBpcyB1c2VkIGJ5IHRoZSBtYWNoaW5lIGNvZGUKKy8vIGVtaXNzaW9uIGZyYW1ld29yayB0byBvdXRwdXQgdGhlIGNvZGUuICBUaGlzIGFsbG93cyBtYWNoaW5lIGNvZGUgZW1pc3Npb24gdG8KKy8vIGJlIHNlcGFyYXRlZCBmcm9tIGNvbmNlcm5zIHN1Y2ggYXMgcmVzb2x1dGlvbiBvZiBjYWxsIHRhcmdldHMsIGFuZCB3aGVyZSB0aGUKKy8vIG1hY2hpbmUgY29kZSB3aWxsIGJlIHdyaXR0ZW4gKG1lbW9yeSBvciBkaXNrLCBmLmUuKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FQ09ERUVNSVRURVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUNPREVFTUlUVEVSX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Z0xvYy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbDsKK2NsYXNzIE1hY2hpbmVKdW1wVGFibGVJbmZvOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZU1vZHVsZUluZm87CitjbGFzcyBNYWNoaW5lUmVsb2NhdGlvbjsKK2NsYXNzIFZhbHVlOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1DU3ltYm9sOworCisvLy8gTWFjaGluZUNvZGVFbWl0dGVyIC0gVGhpcyBjbGFzcyBkZWZpbmVzIHR3byBzb3J0cyBvZiBtZXRob2RzOiB0aG9zZSBmb3IKKy8vLyBlbWl0dGluZyB0aGUgYWN0dWFsIGJ5dGVzIG9mIG1hY2hpbmUgY29kZSwgYW5kIHRob3NlIGZvciBlbWl0dGluZyBhdXhpbGxhcnkKKy8vLyBzdHJ1Y3R1cmVzLCBzdWNoIGFzIGp1bXAgdGFibGVzLCByZWxvY2F0aW9ucywgZXRjLgorLy8vCisvLy8gRW1pc3Npb24gb2YgbWFjaGluZSBjb2RlIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgd2UgZG9uJ3QgKGluCisvLy8gZ2VuZXJhbCkga25vdyB0aGUgc2l6ZSBvZiB0aGUgbWFjaGluZSBjb2RlIHRoYXQgd2UncmUgYWJvdXQgdG8gZW1pdCBiZWZvcmUKKy8vLyB3ZSBlbWl0IGl0LiAgQXMgc3VjaCwgd2UgcHJlYWxsb2NhdGUgYSBjZXJ0YWluIGFtb3VudCBvZiBtZW1vcnksIGFuZCBzZXQgdGhlCisvLy8gQnVmZmVyQmVnaW4vQnVmZmVyRW5kIHBvaW50ZXJzIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBidWZmZXIuICBBcyB3ZQorLy8vIGVtaXQgbWFjaGluZSBpbnN0cnVjdGlvbnMsIHdlIGFkdmFuY2UgdGhlIEN1ckJ1ZmZlclB0ciB0byBpbmRpY2F0ZSB0aGUKKy8vLyBsb2NhdGlvbiBvZiB0aGUgbmV4dCBieXRlIHRvIGVtaXQuICBJbiB0aGUgY2FzZSBvZiBhIGJ1ZmZlciBvdmVyZmxvdyAod2UKKy8vLyBuZWVkIHRvIGVtaXQgbW9yZSBtYWNoaW5lIGNvZGUgdGhhbiB3ZSBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IpLCB0aGUKKy8vLyBDdXJCdWZmZXJQdHIgd2lsbCBzYXR1cmF0ZSB0byBCdWZmZXJFbmQgYW5kIGlnbm9yZSBzdG9yZXMuICBPbmNlIHRoZSBlbnRpcmUKKy8vLyBmdW5jdGlvbiBoYXMgYmVlbiBlbWl0dGVkLCB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uIGlzIGNoZWNrZWQsIGFuZCBpZiBpdCBoYXMKKy8vLyBvY2N1cnJlZCwgbW9yZSBtZW1vcnkgaXMgYWxsb2NhdGVkLCBhbmQgd2UgcmVlbWl0IHRoZSBjb2RlIGludG8gaXQuCisvLy8gCitjbGFzcyBNYWNoaW5lQ29kZUVtaXR0ZXIgeworcHJvdGVjdGVkOgorICAvLy8gQnVmZmVyQmVnaW4vQnVmZmVyRW5kIC0gUG9pbnRlcnMgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIG1lbW9yeQorICAvLy8gYWxsb2NhdGVkIGZvciB0aGlzIGNvZGUgYnVmZmVyLgorICB1aW50OF90ICpCdWZmZXJCZWdpbiwgKkJ1ZmZlckVuZDsKKyAgLy8vIEN1ckJ1ZmZlclB0ciAtIFBvaW50ZXIgdG8gdGhlIG5leHQgYnl0ZSBvZiBtZW1vcnkgdG8gZmlsbCB3aGVuIGVtaXR0aW5nCisgIC8vLyBjb2RlLiAgVGhpcyBpcyBndXJhbnRlZWQgdG8gYmUgaW4gdGhlIHJhbmdlIFtCdWZmZXJCZWdpbixCdWZmZXJFbmRdLiAgSWYKKyAgLy8vIHRoaXMgcG9pbnRlciBpcyBhdCBCdWZmZXJFbmQsIGl0IHdpbGwgbmV2ZXIgbW92ZSBkdWUgdG8gY29kZSBlbWlzc2lvbiwgYW5kCisgIC8vLyBhbGwgY29kZSBlbWlzc2lvbiByZXF1ZXN0cyB3aWxsIGJlIGlnbm9yZWQgKHRoaXMgaXMgdGhlIGJ1ZmZlciBvdmVyZmxvdworICAvLy8gY29uZGl0aW9uKS4KKyAgdWludDhfdCAqQ3VyQnVmZmVyUHRyOworCitwdWJsaWM6CisgIHZpcnR1YWwgfk1hY2hpbmVDb2RlRW1pdHRlcigpIHt9CisKKyAgLy8vIHN0YXJ0RnVuY3Rpb24gLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlzCisgIC8vLyBhYm91dCB0byBiZSBjb2RlIGdlbmVyYXRlZC4gIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIEJ1ZmZlckJlZ2luL0VuZC9QdHIKKyAgLy8vIGZpZWxkcy4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBzdGFydEZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRikgPSAwOworCisgIC8vLyBmaW5pc2hGdW5jdGlvbiAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaGFzCisgIC8vLyBmaW5pc2hlZCBjb2RlIGdlbmVyYXRpb24uICBJZiBhIGJ1ZmZlciBvdmVyZmxvdyBoYXMgb2NjdXJyZWQsIHRoaXMgbWV0aG9kCisgIC8vLyByZXR1cm5zIHRydWUgKHRoZSBjYWxsZWUgaXMgcmVxdWlyZWQgdG8gdHJ5IGFnYWluKSwgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAgLy8vIGZhbHNlLgorICAvLy8KKyAgdmlydHVhbCBib29sIGZpbmlzaEZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRikgPSAwOworCisgIC8vLyBlbWl0Qnl0ZSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgYnl0ZSBuZWVkcyB0byBiZSB3cml0dGVuIHRvIHRoZQorICAvLy8gb3V0cHV0IHN0cmVhbS4KKyAgLy8vCisgIHZvaWQgZW1pdEJ5dGUodWludDhfdCBCKSB7CisgICAgaWYgKEN1ckJ1ZmZlclB0ciAhPSBCdWZmZXJFbmQpCisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSBCOworICB9CisKKyAgLy8vIGVtaXRXb3JkTEUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDMyLWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorICAvLy8KKyAgdm9pZCBlbWl0V29yZExFKHVpbnQzMl90IFcpIHsKKyAgICBpZiAoNCA8PSBCdWZmZXJFbmQtQ3VyQnVmZmVyUHRyKSB7CisgICAgICBlbWl0V29yZExFSW50byhDdXJCdWZmZXJQdHIsIFcpOworICAgIH0gZWxzZSB7CisgICAgICBDdXJCdWZmZXJQdHIgPSBCdWZmZXJFbmQ7CisgICAgfQorICB9CisKKyAgLy8vIGVtaXRXb3JkTEVJbnRvIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAzMi1iaXQgd29yZCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byBhbiBhcmJpdHJhcnkgYnVmZmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiAgQnVmIG11c3QgaGF2ZSBhdAorICAvLy8gbGVhc3QgNCBieXRlcyBvZiBhdmFpbGFibGUgc3BhY2UuCisgIC8vLworICBzdGF0aWMgdm9pZCBlbWl0V29yZExFSW50byh1aW50OF90IComQnVmLCB1aW50MzJfdCBXKSB7CisgICAgKkJ1ZisrID0gKHVpbnQ4X3QpKFcgPj4gIDApOworICAgICpCdWYrKyA9ICh1aW50OF90KShXID4+ICA4KTsKKyAgICAqQnVmKysgPSAodWludDhfdCkoVyA+PiAxNik7CisgICAgKkJ1ZisrID0gKHVpbnQ4X3QpKFcgPj4gMjQpOworICB9CisKKyAgLy8vIGVtaXRXb3JkQkUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDMyLWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIGJpZy1lbmRpYW4gZm9ybWF0LgorICAvLy8KKyAgdm9pZCBlbWl0V29yZEJFKHVpbnQzMl90IFcpIHsKKyAgICBpZiAoNCA8PSBCdWZmZXJFbmQtQ3VyQnVmZmVyUHRyKSB7CisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSAodWludDhfdCkoVyA+PiAyNCk7CisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSAodWludDhfdCkoVyA+PiAxNik7CisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSAodWludDhfdCkoVyA+PiAgOCk7CisgICAgICAqQ3VyQnVmZmVyUHRyKysgPSAodWludDhfdCkoVyA+PiAgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEN1ckJ1ZmZlclB0ciA9IEJ1ZmZlckVuZDsKKyAgICB9CisgIH0KKworICAvLy8gZW1pdERXb3JkTEUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDY0LWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorICAvLy8KKyAgdm9pZCBlbWl0RFdvcmRMRSh1aW50NjRfdCBXKSB7CisgICAgaWYgKDggPD0gQnVmZmVyRW5kLUN1ckJ1ZmZlclB0cikgeworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gIDApOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gIDgpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gMTYpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gMjQpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gMzIpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gNDApOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gNDgpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gNTYpOworICAgIH0gZWxzZSB7CisgICAgICBDdXJCdWZmZXJQdHIgPSBCdWZmZXJFbmQ7CisgICAgfQorICB9CisgIAorICAvLy8gZW1pdERXb3JkQkUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDY0LWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIGJpZy1lbmRpYW4gZm9ybWF0LgorICAvLy8KKyAgdm9pZCBlbWl0RFdvcmRCRSh1aW50NjRfdCBXKSB7CisgICAgaWYgKDggPD0gQnVmZmVyRW5kLUN1ckJ1ZmZlclB0cikgeworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gNTYpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gNDgpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gNDApOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gMzIpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gMjQpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gMTYpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gIDgpOworICAgICAgKkN1ckJ1ZmZlclB0cisrID0gKHVpbnQ4X3QpKFcgPj4gIDApOworICAgIH0gZWxzZSB7CisgICAgICBDdXJCdWZmZXJQdHIgPSBCdWZmZXJFbmQ7CisgICAgfQorICB9CisKKyAgLy8vIGVtaXRBbGlnbm1lbnQgLSBNb3ZlIHRoZSBDdXJCdWZmZXJQdHIgcG9pbnRlciB1cCB0byB0aGUgc3BlY2lmaWVkCisgIC8vLyBhbGlnbm1lbnQgKHNhdHVyYXRlZCB0byBCdWZmZXJFbmQgb2YgY291cnNlKS4KKyAgdm9pZCBlbWl0QWxpZ25tZW50KHVuc2lnbmVkIEFsaWdubWVudCkgeworICAgIGlmIChBbGlnbm1lbnQgPT0gMCkgQWxpZ25tZW50ID0gMTsKKworICAgIGlmKEFsaWdubWVudCA8PSAodWludHB0cl90KShCdWZmZXJFbmQtQ3VyQnVmZmVyUHRyKSkgeworICAgICAgLy8gTW92ZSB0aGUgY3VycmVudCBidWZmZXIgcHRyIHVwIHRvIHRoZSBzcGVjaWZpZWQgYWxpZ25tZW50LgorICAgICAgQ3VyQnVmZmVyUHRyID0KKyAgICAgICAgKHVpbnQ4X3QqKSgoKHVpbnRwdHJfdClDdXJCdWZmZXJQdHIrQWxpZ25tZW50LTEpICYKKyAgICAgICAgICAgICAgICAgICB+KHVpbnRwdHJfdCkoQWxpZ25tZW50LTEpKTsKKyAgICB9IGVsc2UgeworICAgICAgQ3VyQnVmZmVyUHRyID0gQnVmZmVyRW5kOworICAgIH0KKyAgfQorICAKKworICAvLy8gZW1pdFVMRUIxMjhCeXRlcyAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgVUxFQjEyOCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBlbWl0VUxFQjEyOEJ5dGVzKHVpbnQ2NF90IFZhbHVlKSB7CisgICAgZG8geworICAgICAgdWludDhfdCBCeXRlID0gVmFsdWUgJiAweDdmOworICAgICAgVmFsdWUgPj49IDc7CisgICAgICBpZiAoVmFsdWUpIEJ5dGUgfD0gMHg4MDsKKyAgICAgIGVtaXRCeXRlKEJ5dGUpOworICAgIH0gd2hpbGUgKFZhbHVlKTsKKyAgfQorICAKKyAgLy8vIGVtaXRTTEVCMTI4Qnl0ZXMgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIFNMRUIxMjggbmVlZHMgdG8gYmUKKyAgLy8vIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCisgIHZvaWQgZW1pdFNMRUIxMjhCeXRlcyh1aW50NjRfdCBWYWx1ZSkgeworICAgIHVpbnQ2NF90IFNpZ24gPSBWYWx1ZSA+PiAoOCAqIHNpemVvZihWYWx1ZSkgLSAxKTsKKyAgICBib29sIElzTW9yZTsKKyAgCisgICAgZG8geworICAgICAgdWludDhfdCBCeXRlID0gVmFsdWUgJiAweDdmOworICAgICAgVmFsdWUgPj49IDc7CisgICAgICBJc01vcmUgPSBWYWx1ZSAhPSBTaWduIHx8ICgoQnl0ZSBeIFNpZ24pICYgMHg0MCkgIT0gMDsKKyAgICAgIGlmIChJc01vcmUpIEJ5dGUgfD0gMHg4MDsKKyAgICAgIGVtaXRCeXRlKEJ5dGUpOworICAgIH0gd2hpbGUgKElzTW9yZSk7CisgIH0KKworICAvLy8gZW1pdFN0cmluZyAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgU3RyaW5nIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICB2b2lkIGVtaXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJlN0cmluZykgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIE4gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oU3RyaW5nLnNpemUoKSk7CisgICAgICAgICBpIDwgTjsgKytpKSB7CisgICAgICB1aW50OF90IEMgPSBTdHJpbmdbaV07CisgICAgICBlbWl0Qnl0ZShDKTsKKyAgICB9CisgICAgZW1pdEJ5dGUoMCk7CisgIH0KKyAgCisgIC8vLyBlbWl0SW50MzIgLSBFbWl0IGEgaW50MzIgZGlyZWN0aXZlLgorICB2b2lkIGVtaXRJbnQzMihpbnQzMl90IFZhbHVlKSB7CisgICAgaWYgKDQgPD0gQnVmZmVyRW5kLUN1ckJ1ZmZlclB0cikgeworICAgICAgKigodWludDMyX3QqKUN1ckJ1ZmZlclB0cikgPSBWYWx1ZTsKKyAgICAgIEN1ckJ1ZmZlclB0ciArPSA0OworICAgIH0gZWxzZSB7CisgICAgICBDdXJCdWZmZXJQdHIgPSBCdWZmZXJFbmQ7CisgICAgfQorICB9CisKKyAgLy8vIGVtaXRJbnQ2NCAtIEVtaXQgYSBpbnQ2NCBkaXJlY3RpdmUuCisgIHZvaWQgZW1pdEludDY0KHVpbnQ2NF90IFZhbHVlKSB7CisgICAgaWYgKDggPD0gQnVmZmVyRW5kLUN1ckJ1ZmZlclB0cikgeworICAgICAgKigodWludDY0X3QqKUN1ckJ1ZmZlclB0cikgPSBWYWx1ZTsKKyAgICAgIEN1ckJ1ZmZlclB0ciArPSA4OworICAgIH0gZWxzZSB7CisgICAgICBDdXJCdWZmZXJQdHIgPSBCdWZmZXJFbmQ7CisgICAgfQorICB9CisgIAorICAvLy8gZW1pdEludDMyQXQgLSBFbWl0IHRoZSBJbnQzMiBWYWx1ZSBpbiBBZGRyLgorICB2b2lkIGVtaXRJbnQzMkF0KHVpbnRwdHJfdCAqQWRkciwgdWludHB0cl90IFZhbHVlKSB7CisgICAgaWYgKEFkZHIgPj0gKHVpbnRwdHJfdCopQnVmZmVyQmVnaW4gJiYgQWRkciA8ICh1aW50cHRyX3QqKUJ1ZmZlckVuZCkKKyAgICAgICgqKHVpbnQzMl90KilBZGRyKSA9ICh1aW50MzJfdClWYWx1ZTsKKyAgfQorICAKKyAgLy8vIGVtaXRJbnQ2NEF0IC0gRW1pdCB0aGUgSW50NjQgVmFsdWUgaW4gQWRkci4KKyAgdm9pZCBlbWl0SW50NjRBdCh1aW50cHRyX3QgKkFkZHIsIHVpbnRwdHJfdCBWYWx1ZSkgeworICAgIGlmIChBZGRyID49ICh1aW50cHRyX3QqKUJ1ZmZlckJlZ2luICYmIEFkZHIgPCAodWludHB0cl90KilCdWZmZXJFbmQpCisgICAgICAoKih1aW50NjRfdCopQWRkcikgPSAodWludDY0X3QpVmFsdWU7CisgIH0KKyAgCisgIC8vLyBwcm9jZXNzRGVidWdMb2MgLSBSZWNvcmRzIGRlYnVnIGxvY2F0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEKKyAgLy8vIE1hY2hpbmVJbnN0cnVjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBlbWl0dGluZyBhbnkgYnl0ZXMgYXNzb2NpYXRlZAorICAvLy8gd2l0aCB0aGUgaW5zdHJ1Y3Rpb24uICBFdmVuIGlmIHN1Y2Nlc3NpdmUgaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIHNhbWUgZGVidWcKKyAgLy8vIGxvY2F0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBvbmUuCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzRGVidWdMb2MoRGVidWdMb2MgREwsIGJvb2wgQmVmb3JlUHJpbnRpbnRJbnNuKSB7fQorCisgIC8vLyBlbWl0TGFiZWwgLSBFbWl0cyBhIGxhYmVsCisgIHZpcnR1YWwgdm9pZCBlbWl0TGFiZWwoTUNTeW1ib2wgKkxhYmVsKSA9IDA7CisKKyAgLy8vIGFsbG9jYXRlU3BhY2UgLSBBbGxvY2F0ZSBhIGJsb2NrIG9mIHNwYWNlIGluIHRoZSBjdXJyZW50IG91dHB1dCBidWZmZXIsCisgIC8vLyByZXR1cm5pbmcgbnVsbCAoYW5kIHNldHRpbmcgY29uZGl0aW9ucyB0byBpbmRpY2F0ZSBidWZmZXIgb3ZlcmZsb3cpIG9uCisgIC8vLyBmYWlsdXJlLiAgQWxpZ25tZW50IGlzIHRoZSBhbGlnbm1lbnQgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciBkZXNpcmVkLgorICB2aXJ0dWFsIHZvaWQgKmFsbG9jYXRlU3BhY2UodWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCkgeworICAgIGVtaXRBbGlnbm1lbnQoQWxpZ25tZW50KTsKKyAgICB2b2lkICpSZXN1bHQ7CisgICAgCisgICAgLy8gQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdy4KKyAgICBpZiAoU2l6ZSA+PSAodWludHB0cl90KShCdWZmZXJFbmQtQ3VyQnVmZmVyUHRyKSkgeworICAgICAgQ3VyQnVmZmVyUHRyID0gQnVmZmVyRW5kOworICAgICAgUmVzdWx0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQWxsb2NhdGUgdGhlIHNwYWNlLgorICAgICAgUmVzdWx0ID0gQ3VyQnVmZmVyUHRyOworICAgICAgQ3VyQnVmZmVyUHRyICs9IFNpemU7CisgICAgfQorICAgIAorICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gU3RhcnRNYWNoaW5lQmFzaWNCbG9jayAtIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgdGFyZ2V0IHdoZW4gYSBuZXcKKyAgLy8vIGJhc2ljIGJsb2NrIGlzIGFib3V0IHRvIGJlIGVtaXR0ZWQuICBUaGlzIHdheSB0aGUgTUNFIGtub3dzIHdoZXJlIHRoZQorICAvLy8gc3RhcnQgb2YgdGhlIGJsb2NrIGlzLCBhbmQgY2FuIGltcGxlbWVudCBnZXRNYWNoaW5lQmFzaWNCbG9ja0FkZHJlc3MuCisgIHZpcnR1YWwgdm9pZCBTdGFydE1hY2hpbmVCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpID0gMDsKKyAgCisgIC8vLyBnZXRDdXJyZW50UENWYWx1ZSAtIFRoaXMgcmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IHRoZSBuZXh0IGVtaXR0ZWQgYnl0ZQorICAvLy8gd2lsbCBiZSBvdXRwdXQgdG8uCisgIC8vLworICB2aXJ0dWFsIHVpbnRwdHJfdCBnZXRDdXJyZW50UENWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVpbnRwdHJfdClDdXJCdWZmZXJQdHI7CisgIH0KKworICAvLy8gZ2V0Q3VycmVudFBDT2Zmc2V0IC0gUmV0dXJuIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGVtaXR0ZWQKKyAgLy8vIGJ1ZmZlciB0aGF0IHdlIGFyZSBjdXJyZW50bHkgd3JpdGluZyB0by4KKyAgdmlydHVhbCB1aW50cHRyX3QgZ2V0Q3VycmVudFBDT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBDdXJCdWZmZXJQdHItQnVmZmVyQmVnaW47CisgIH0KKworICAvLy8gZWFybHlSZXNvbHZlQWRkcmVzc2VzIC0gVHJ1ZSBpZiB0aGUgY29kZSBlbWl0dGVyIGNhbiB1c2Ugc3ltYm9sIGFkZHJlc3NlcyAKKyAgLy8vIGR1cmluZyBjb2RlIGVtaXNzaW9uIHRpbWUuIFRoZSBKSVQgaXMgY2FwYWJsZSBvZiBkb2luZyB0aGlzIGJlY2F1c2UgaXQKKyAgLy8vIGNyZWF0ZXMganVtcCB0YWJsZXMgb3IgY29uc3RhbnQgcG9vbHMgaW4gbWVtb3J5IG9uIHRoZSBmbHkgd2hpbGUgdGhlCisgIC8vLyBvYmplY3QgY29kZSBlbWl0dGVycyByZWx5IG9uIGEgbGlua2VyIHRvIGhhdmUgcmVhbCBhZGRyZXNzZXMgYW5kIHNob3VsZAorICAvLy8gdXNlIHJlbG9jYXRpb25zIGluc3RlYWQuCisgIHZpcnR1YWwgYm9vbCBlYXJseVJlc29sdmVBZGRyZXNzZXMoKSBjb25zdCA9IDA7CisKKyAgLy8vIGFkZFJlbG9jYXRpb24gLSBXaGVuZXZlciBhIHJlbG9jYXRhYmxlIGFkZHJlc3MgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUKKyAgLy8vIG5vdGVkIHdpdGggdGhpcyBpbnRlcmZhY2UuCisgIHZpcnR1YWwgdm9pZCBhZGRSZWxvY2F0aW9uKGNvbnN0IE1hY2hpbmVSZWxvY2F0aW9uICZNUikgPSAwOworICAKKyAgLy8vIEZJWE1FOiBUaGVzZSBzaG91bGQgYWxsIGJlIGhhbmRsZWQgd2l0aCByZWxvY2F0aW9ucyEKKyAgCisgIC8vLyBnZXRDb25zdGFudFBvb2xFbnRyeUFkZHJlc3MgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlICdJbmRleCcgZW50cnkgaW4KKyAgLy8vIHRoZSBjb25zdGFudCBwb29sIHRoYXQgd2FzIGxhc3QgZW1pdHRlZCB3aXRoIHRoZSBlbWl0Q29uc3RhbnRQb29sIG1ldGhvZC4KKyAgLy8vCisgIHZpcnR1YWwgdWludHB0cl90IGdldENvbnN0YW50UG9vbEVudHJ5QWRkcmVzcyh1bnNpZ25lZCBJbmRleCkgY29uc3QgPSAwOworCisgIC8vLyBnZXRKdW1wVGFibGVFbnRyeUFkZHJlc3MgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGp1bXAgdGFibGUgd2l0aCBpbmRleAorICAvLy8gJ0luZGV4JyBpbiB0aGUgZnVuY3Rpb24gdGhhdCBsYXN0IGNhbGxlZCBpbml0SnVtcFRhYmxlSW5mby4KKyAgLy8vCisgIHZpcnR1YWwgdWludHB0cl90IGdldEp1bXBUYWJsZUVudHJ5QWRkcmVzcyh1bnNpZ25lZCBJbmRleCkgY29uc3QgPSAwOworICAKKyAgLy8vIGdldE1hY2hpbmVCYXNpY0Jsb2NrQWRkcmVzcyAtIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBNYWNoaW5lQmFzaWNCbG9jaywgb25seSB1c2FibGUgYWZ0ZXIgdGhlIGxhYmVsIGZvciB0aGUgTUJCIGhhcyBiZWVuCisgIC8vLyBlbWl0dGVkLgorICAvLy8KKyAgdmlydHVhbCB1aW50cHRyX3QgZ2V0TWFjaGluZUJhc2ljQmxvY2tBZGRyZXNzKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0PSAwOworCisgIC8vLyBnZXRMYWJlbEFkZHJlc3MgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBMYWJlbCwgb25seSB1c2FibGUKKyAgLy8vIGFmdGVyIHRoZSBMYWJlbElEIGhhcyBiZWVuIGVtaXR0ZWQuCisgIC8vLworICB2aXJ0dWFsIHVpbnRwdHJfdCBnZXRMYWJlbEFkZHJlc3MoTUNTeW1ib2wgKkxhYmVsKSBjb25zdCA9IDA7CisgIAorICAvLy8gU3BlY2lmaWVzIHRoZSBNYWNoaW5lTW9kdWxlSW5mbyBvYmplY3QuIFRoaXMgaXMgdXNlZCBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nCisgIC8vLyBwdXJwb3Nlcy4KKyAgdmlydHVhbCB2b2lkIHNldE1vZHVsZUluZm8oTWFjaGluZU1vZHVsZUluZm8qIEluZm8pID0gMDsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUNvZGVJbmZvLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQ29kZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzVjMDJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUNvZGVJbmZvLmgKQEAgLTAsMCArMSw1MyBAQAorLy89PT0tLSBNYWNoaW5lQ29kZUluZm8uaCAtIENsYXNzIHVzZWQgdG8gcmVwb3J0IEpJVCBpbmZvIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBNYWNoaW5lQ29kZUluZm8sIGEgY2xhc3MgdXNlZCBieSB0aGUgSklUIEV4ZWN1dGlvbkVuZ2luZQorLy8gdG8gcmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBnZW5lcmF0ZWQgbWFjaGluZSBjb2RlLgorLy8KKy8vIFNlZSBKSVQ6OnJ1bkpJVE9uRnVuY3Rpb24gZm9yIHVzYWdlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgRUVfTUFDSElORV9DT0RFX0lORk9fSAorI2RlZmluZSBFRV9NQUNISU5FX0NPREVfSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lQ29kZUluZm8geworcHJpdmF0ZToKKyAgc2l6ZV90IFNpemU7ICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1lbW9yeSB1c2VkCisgIHZvaWQgKkFkZHJlc3M7IC8vIFRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBpbiBtZW1vcnkKKworcHVibGljOgorICBNYWNoaW5lQ29kZUluZm8oKSA6IFNpemUoMCksIEFkZHJlc3MoMCkge30KKworICB2b2lkIHNldFNpemUoc2l6ZV90IHMpIHsKKyAgICBTaXplID0gczsKKyAgfQorCisgIHZvaWQgc2V0QWRkcmVzcyh2b2lkICphKSB7CisgICAgQWRkcmVzcyA9IGE7CisgIH0KKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2l6ZTsKKyAgfQorCisgIHZvaWQgKmFkZHJlc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEFkZHJlc3M7CisgIH0KKworfTsKKworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGY4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vPT09LS0gQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmggLSBBYnN0cmFjdCBDb25zdGFudCBQb29sIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIEBmaWxlCisvLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNYWNoaW5lQ29uc3RhbnRQb29sIGNsYXNzIHdoaWNoIGlzIGFuIGFic3RyYWN0CisvLy8gY29uc3RhbnQgcG9vbCB0byBrZWVwIHRyYWNrIG9mIGNvbnN0YW50cyByZWZlcmVuY2VkIGJ5IGEgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUNPTlNUQU5UUE9PTF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FQ09OU1RBTlRQT09MX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBGb2xkaW5nU2V0Tm9kZUlEOworY2xhc3MgVGFyZ2V0RGF0YTsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CitjbGFzcyBUeXBlOworY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbDsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG1hY2hpbmUgc3BlY2lmaWMgY29uc3RhbnRwb29sIHZhbHVlIHN1YmNsYXNzZXMuCisvLy8KK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSB7CisgIGNvbnN0IFR5cGUgKlR5OworCitwdWJsaWM6CisgIGV4cGxpY2l0IE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZShjb25zdCBUeXBlICp0eSkgOiBUeSh0eSkge30KKyAgdmlydHVhbCB+TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlKCkge30KKworICAvLy8gZ2V0VHlwZSAtIGdldCB0eXBlIG9mIHRoaXMgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlLgorICAvLy8KKyAgY29uc3QgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5OyB9CisKKyAgCisgIC8vLyBnZXRSZWxvY2F0aW9uSW5mbyAtIFRoaXMgbWV0aG9kIGNsYXNzaWZpZXMgdGhlIGVudHJ5IGFjY29yZGluZyB0bworICAvLy8gd2hldGhlciBvciBub3QgaXQgbWF5IGdlbmVyYXRlIGEgcmVsb2NhdGlvbiBlbnRyeS4gIFRoaXMgbXVzdCBiZQorICAvLy8gY29uc2VydmF0aXZlLCBzbyBpZiBpdCBtaWdodCBjb2RlZ2VuIHRvIGEgcmVsb2NhdGFibGUgZW50cnksIGl0IHNob3VsZCBzYXkKKyAgLy8vIHNvLiAgVGhlIHJldHVybiB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIENvbnN0YW50OjpnZXRSZWxvY2F0aW9uSW5mbygpLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFJlbG9jYXRpb25JbmZvKCkgY29uc3QgPSAwOworICAKKyAgdmlydHVhbCBpbnQgZ2V0RXhpc3RpbmdNYWNoaW5lQ1BWYWx1ZShNYWNoaW5lQ29uc3RhbnRQb29sICpDUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgQWRkU2VsZWN0aW9uREFHQ1NFSWQoRm9sZGluZ1NldE5vZGVJRCAmSUQpID0gMDsKKworICAvLy8gcHJpbnQgLSBJbXBsZW1lbnQgb3BlcmF0b3I8PAorICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0ID0gMDsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICZWKSB7CisgIFYucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisgIAorCisvLy8gVGhpcyBjbGFzcyBpcyBhIGRhdGEgY29udGFpbmVyIGZvciBvbmUgZW50cnkgaW4gYSBNYWNoaW5lQ29uc3RhbnRQb29sLgorLy8vIEl0IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgdmFsdWUgYW5kIGFuIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZgorLy8vIHRoZSBjb25zdGFudCBwb29sLgorLy8vIEBicmllZiBBbiBlbnRyeSBpbiBhIE1hY2hpbmVDb25zdGFudFBvb2wKK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeSB7CitwdWJsaWM6CisgIC8vLyBUaGUgY29uc3RhbnQgaXRzZWxmLgorICB1bmlvbiB7CisgICAgY29uc3QgQ29uc3RhbnQgKkNvbnN0VmFsOworICAgIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqTWFjaGluZUNQVmFsOworICB9IFZhbDsKKworICAvLy8gVGhlIHJlcXVpcmVkIGFsaWdubWVudCBmb3IgdGhpcyBlbnRyeS4gVGhlIHRvcCBiaXQgaXMgc2V0IHdoZW4gVmFsIGlzCisgIC8vLyBhIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZS4KKyAgdW5zaWduZWQgQWxpZ25tZW50OworCisgIE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeShjb25zdCBDb25zdGFudCAqViwgdW5zaWduZWQgQSkKKyAgICA6IEFsaWdubWVudChBKSB7CisgICAgVmFsLkNvbnN0VmFsID0gVjsKKyAgfQorICBNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpWLCB1bnNpZ25lZCBBKQorICAgIDogQWxpZ25tZW50KEEpIHsKKyAgICBWYWwuTWFjaGluZUNQVmFsID0gVjsgCisgICAgQWxpZ25tZW50IHw9IDFVIDw8IChzaXplb2YodW5zaWduZWQpKkNIQVJfQklULTEpOworICB9CisKKyAgYm9vbCBpc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGludClBbGlnbm1lbnQgPCAwOworICB9CisKKyAgaW50IGdldEFsaWdubWVudCgpIGNvbnN0IHsgCisgICAgcmV0dXJuIEFsaWdubWVudCAmIH4oMSA8PCAoc2l6ZW9mKHVuc2lnbmVkKSpDSEFSX0JJVC0xKSk7CisgIH0KKworICBjb25zdCBUeXBlICpnZXRUeXBlKCkgY29uc3Q7CisgIAorICAvLy8gZ2V0UmVsb2NhdGlvbkluZm8gLSBUaGlzIG1ldGhvZCBjbGFzc2lmaWVzIHRoZSBlbnRyeSBhY2NvcmRpbmcgdG8KKyAgLy8vIHdoZXRoZXIgb3Igbm90IGl0IG1heSBnZW5lcmF0ZSBhIHJlbG9jYXRpb24gZW50cnkuICBUaGlzIG11c3QgYmUKKyAgLy8vIGNvbnNlcnZhdGl2ZSwgc28gaWYgaXQgbWlnaHQgY29kZWdlbiB0byBhIHJlbG9jYXRhYmxlIGVudHJ5LCBpdCBzaG91bGQgc2F5CisgIC8vLyBzby4gIFRoZSByZXR1cm4gdmFsdWVzIGFyZToKKyAgLy8vIAorICAvLy8gIDA6IFRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeSBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGhhdmUgYSByZWxvY2F0aW9uCisgIC8vLyAgICAgYXBwbGllZCB0byBpdCAoYmVjYXVzZSBpdCBob2xkcyBhIHNpbXBsZSBjb25zdGFudCBsaWtlICc0JykuCisgIC8vLyAgMTogVGhpcyBlbnRyeSBoYXMgcmVsb2NhdGlvbnMsIGJ1dCB0aGUgZW50cmllcyBhcmUgZ3VhcmFudGVlZCB0byBiZQorICAvLy8gICAgIHJlc29sdmFibGUgYnkgdGhlIHN0YXRpYyBsaW5rZXIsIHNvIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIG5ldmVyIHNlZQorICAvLy8gICAgIHRoZW0uCisgIC8vLyAgMjogVGhpcyBlbnRyeSBtYXkgaGF2ZSBhcmJpdHJhcnkgcmVsb2NhdGlvbnMuIAorICB1bnNpZ25lZCBnZXRSZWxvY2F0aW9uSW5mbygpIGNvbnN0OworfTsKKyAgCisvLy8gVGhlIE1hY2hpbmVDb25zdGFudFBvb2wgY2xhc3Mga2VlcHMgdHJhY2sgb2YgY29uc3RhbnRzIHJlZmVyZW5jZWQgYnkgYQorLy8vIGZ1bmN0aW9uIHdoaWNoIG11c3QgYmUgc3BpbGxlZCB0byBtZW1vcnkuICBUaGlzIGlzIHVzZWQgZm9yIGNvbnN0YW50cyB3aGljaAorLy8vIGFyZSB1bmFibGUgdG8gYmUgdXNlZCBkaXJlY3RseSBhcyBvcGVyYW5kcyB0byBpbnN0cnVjdGlvbnMsIHdoaWNoIHR5cGljYWxseQorLy8vIGluY2x1ZGUgZmxvYXRpbmcgcG9pbnQgYW5kIGxhcmdlIGludGVnZXIgY29uc3RhbnRzLgorLy8vCisvLy8gSW5zdHJ1Y3Rpb25zIHJlZmVyZW5jZSB0aGUgYWRkcmVzcyBvZiB0aGVzZSBjb25zdGFudCBwb29sIGNvbnN0YW50cyB0aHJvdWdoCisvLy8gdGhlIHVzZSBvZiBNT19Db25zdGFudFBvb2xJbmRleCB2YWx1ZXMuICBXaGVuIGVtaXR0aW5nIGFzc2VtYmx5IG9yIG1hY2hpbmUKKy8vLyBjb2RlLCB0aGVzZSB2aXJ0dWFsIGFkZHJlc3MgcmVmZXJlbmNlcyBhcmUgY29udmVydGVkIHRvIHJlZmVyIHRvIHRoZQorLy8vIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNvbnN0YW50IHBvb2wgdmFsdWVzLgorLy8vIEBicmllZiBUaGUgbWFjaGluZSBjb25zdGFudCBwb29sLgorY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbCB7CisgIGNvbnN0IFRhcmdldERhdGEgKlREOyAgIC8vLzwgVGhlIG1hY2hpbmUncyBUYXJnZXREYXRhLgorICB1bnNpZ25lZCBQb29sQWxpZ25tZW50OyAvLy88IFRoZSBhbGlnbm1lbnQgZm9yIHRoZSBwb29sLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lQ29uc3RhbnRQb29sRW50cnk+IENvbnN0YW50czsgLy8vPCBUaGUgcG9vbCBvZiBjb25zdGFudHMuCitwdWJsaWM6CisgIC8vLyBAYnJpZWYgVGhlIG9ubHkgY29uc3RydWN0b3IuCisgIGV4cGxpY2l0IE1hY2hpbmVDb25zdGFudFBvb2woY29uc3QgVGFyZ2V0RGF0YSAqdGQpCisgICAgOiBURCh0ZCksIFBvb2xBbGlnbm1lbnQoMSkge30KKyAgfk1hY2hpbmVDb25zdGFudFBvb2woKTsKKyAgICAKKyAgLy8vIGdldENvbnN0YW50UG9vbEFsaWdubWVudCAtIFJldHVybiB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGJ5CisgIC8vLyB0aGUgd2hvbGUgY29uc3RhbnQgcG9vbCwgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgbXVzdCBiZSBhbGlnbmVkLgorICB1bnNpZ25lZCBnZXRDb25zdGFudFBvb2xBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBQb29sQWxpZ25tZW50OyB9CisgIAorICAvLy8gZ2V0Q29uc3RhbnRQb29sSW5kZXggLSBDcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wgb3IgcmV0dXJuCisgIC8vLyBhbiBleGlzdGluZyBvbmUuICBVc2VyIG11c3Qgc3BlY2lmeSB0aGUgbWluaW11bSByZXF1aXJlZCBhbGlnbm1lbnQgZm9yCisgIC8vLyB0aGUgb2JqZWN0LgorICB1bnNpZ25lZCBnZXRDb25zdGFudFBvb2xJbmRleChjb25zdCBDb25zdGFudCAqQywgdW5zaWduZWQgQWxpZ25tZW50KTsKKyAgdW5zaWduZWQgZ2V0Q29uc3RhbnRQb29sSW5kZXgoTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpWLHVuc2lnbmVkIEFsaWdubWVudCk7CisgIAorICAvLy8gaXNFbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoaXMgY29uc3RhbnQgcG9vbCBjb250YWlucyBubyBjb25zdGFudHMuCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIENvbnN0YW50cy5lbXB0eSgpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUNvbnN0YW50UG9vbEVudHJ5PiAmZ2V0Q29uc3RhbnRzKCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudHM7CisgIH0KKworICAvLy8gcHJpbnQgLSBVc2VkIGJ5IHRoZSBNYWNoaW5lRnVuY3Rpb24gcHJpbnRlciB0byBwcmludCBpbmZvcm1hdGlvbiBhYm91dAorICAvLy8gY29uc3RhbnQgcG9vbCBvYmplY3RzLiAgSW1wbGVtZW50ZWQgaW4gTWFjaGluZUZ1bmN0aW9uLmNwcAorICAvLy8KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBkdW1wIC0gQ2FsbCBwcmludChjZXJyKSB0byBiZSBjYWxsZWQgZnJvbSB0aGUgZGVidWdnZXIuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODY5NWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaApAQCAtMCwwICsxLDIwMiBAQAorLy89LSBsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCAtIE1hY2hpbmUgRG9tIENhbGN1bGF0aW9uIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjbGFzc2VzIG1pcnJvcmluZyB0aG9zZSBpbiBsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCwKKy8vIGJ1dCBmb3IgdGFyZ2V0LXNwZWNpZmljIGNvZGUgcmF0aGVyIHRoYW4gdGFyZ2V0LWluZGVwZW5kZW50IElSLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVET01JTkFUT1JTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVET01JTkFUT1JTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hdG9ySW50ZXJuYWxzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgRG9taW5hdG9yVHJlZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+OjphZGRSb290KE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIpIHsKKyAgdGhpcy0+Um9vdHMucHVzaF9iYWNrKE1CQik7Cit9CisKK0VYVEVSTl9URU1QTEFURV9JTlNUQU5USUFUSU9OKGNsYXNzIERvbVRyZWVOb2RlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaz4pOworRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgRG9taW5hdG9yVHJlZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+KTsKKwordHlwZWRlZiBEb21UcmVlTm9kZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+IE1hY2hpbmVEb21UcmVlTm9kZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gRG9taW5hdG9yVHJlZSBDbGFzcyAtIENvbmNyZXRlIHN1YmNsYXNzIG9mIERvbWluYXRvclRyZWVCYXNlIHRoYXQgaXMgdXNlZCB0bworLy8vIGNvbXB1dGUgYSBub3JtYWwgZG9taW5hdG9yIHRyZWUuCisvLy8KK2NsYXNzIE1hY2hpbmVEb21pbmF0b3JUcmVlIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBJRCwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICBEb21pbmF0b3JUcmVlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaz4qIERUOworICAKKyAgTWFjaGluZURvbWluYXRvclRyZWUoKTsKKyAgCisgIH5NYWNoaW5lRG9taW5hdG9yVHJlZSgpOworICAKKyAgRG9taW5hdG9yVHJlZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+JiBnZXRCYXNlKCkgeyByZXR1cm4gKkRUOyB9CisgIAorICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Q7CisgIAorICAvLy8gZ2V0Um9vdHMgLSAgUmV0dXJuIHRoZSByb290IGJsb2NrcyBvZiB0aGUgY3VycmVudCBDRkcuICBUaGlzIG1heSBpbmNsdWRlCisgIC8vLyBtdWx0aXBsZSBibG9ja3MgaWYgd2UgYXJlIGNvbXB1dGluZyBwb3N0IGRvbWluYXRvcnMuICBGb3IgZm9yd2FyZAorICAvLy8gZG9taW5hdG9ycywgdGhpcyB3aWxsIGFsd2F5cyBiZSBhIHNpbmdsZSBibG9jayAodGhlIGVudHJ5IG5vZGUpLgorICAvLy8KKyAgaW5saW5lIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gJmdldFJvb3RzKCkgY29uc3QgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdHMoKTsKKyAgfQorICAKKyAgaW5saW5lIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRSb290KCkgY29uc3QgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdCgpOworICB9CisgIAorICBpbmxpbmUgTWFjaGluZURvbVRyZWVOb2RlICpnZXRSb290Tm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldFJvb3ROb2RlKCk7CisgIH0KKyAgCisgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpOworICAKKyAgaW5saW5lIGJvb2wgZG9taW5hdGVzKE1hY2hpbmVEb21UcmVlTm9kZSogQSwgTWFjaGluZURvbVRyZWVOb2RlKiBCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5kb21pbmF0ZXMoQSwgQik7CisgIH0KKyAgCisgIGlubGluZSBib29sIGRvbWluYXRlcyhNYWNoaW5lQmFzaWNCbG9jayogQSwgTWFjaGluZUJhc2ljQmxvY2sqIEIpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmRvbWluYXRlcyhBLCBCKTsKKyAgfQorICAKKyAgLy8gZG9taW5hdGVzIC0gUmV0dXJuIHRydWUgaWYgQSBkb21pbmF0ZXMgQi4gVGhpcyBwZXJmb3JtcyB0aGUKKyAgLy8gc3BlY2lhbCBjaGVja3MgbmVjZXNzYXJ5IGlmIEEgYW5kIEIgYXJlIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrLgorICBib29sIGRvbWluYXRlcyhNYWNoaW5lSW5zdHIgKkEsIE1hY2hpbmVJbnN0ciAqQikgY29uc3QgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQkEgPSBBLT5nZXRQYXJlbnQoKSwgKkJCQiA9IEItPmdldFBhcmVudCgpOworICAgIGlmIChCQkEgIT0gQkJCKSByZXR1cm4gRFQtPmRvbWluYXRlcyhCQkEsIEJCQik7CisKKyAgICAvLyBMb29wIHRocm91Z2ggdGhlIGJhc2ljIGJsb2NrIHVudGlsIHdlIGZpbmQgQSBvciBCLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQkJBLT5iZWdpbigpOworICAgIGZvciAoOyAmKkkgIT0gQSAmJiAmKkkgIT0gQjsgKytJKSAvKmVtcHR5Ki87CisKKyAgICAvL2lmKCFEVC5Jc1Bvc3REb21pbmF0b3JzKSB7CisgICAgICAvLyBBIGRvbWluYXRlcyBCIGlmIGl0IGlzIGZvdW5kIGZpcnN0IGluIHRoZSBiYXNpYyBibG9jay4KKyAgICAgIHJldHVybiAmKkkgPT0gQTsKKyAgICAvL30gZWxzZSB7CisgICAgLy8gIC8vIEEgcG9zdC1kb21pbmF0ZXMgQiBpZiBCIGlzIGZvdW5kIGZpcnN0IGluIHRoZSBiYXNpYyBibG9jay4KKyAgICAvLyAgcmV0dXJuICYqSSA9PSBCOworICAgIC8vfQorICB9CisgIAorICBpbmxpbmUgYm9vbCBwcm9wZXJseURvbWluYXRlcyhjb25zdCBNYWNoaW5lRG9tVHJlZU5vZGUqIEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVEb21UcmVlTm9kZSogQikgY29uc3QgeworICAgIHJldHVybiBEVC0+cHJvcGVybHlEb21pbmF0ZXMoQSwgQik7CisgIH0KKyAgCisgIGlubGluZSBib29sIHByb3Blcmx5RG9taW5hdGVzKE1hY2hpbmVCYXNpY0Jsb2NrKiBBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogQikgY29uc3QgeworICAgIHJldHVybiBEVC0+cHJvcGVybHlEb21pbmF0ZXMoQSwgQik7CisgIH0KKyAgCisgIC8vLyBmaW5kTmVhcmVzdENvbW1vbkRvbWluYXRvciAtIEZpbmQgbmVhcmVzdCBjb21tb24gZG9taW5hdG9yIGJhc2ljIGJsb2NrCisgIC8vLyBmb3IgYmFzaWMgYmxvY2sgQSBhbmQgQi4gSWYgdGhlcmUgaXMgbm8gc3VjaCBibG9jayB0aGVuIHJldHVybiBOVUxMLgorICBpbmxpbmUgTWFjaGluZUJhc2ljQmxvY2sgKmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKE1hY2hpbmVCYXNpY0Jsb2NrICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCKSB7CisgICAgcmV0dXJuIERULT5maW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihBLCBCKTsKKyAgfQorICAKKyAgaW5saW5lIE1hY2hpbmVEb21UcmVlTm9kZSAqb3BlcmF0b3JbXShNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldE5vZGUoQkIpOworICB9CisgIAorICAvLy8gZ2V0Tm9kZSAtIHJldHVybiB0aGUgKFBvc3QpRG9taW5hdG9yVHJlZSBub2RlIGZvciB0aGUgc3BlY2lmaWVkIGJhc2ljCisgIC8vLyBibG9jay4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdXNpbmcgb3BlcmF0b3JbXSBvbiB0aGlzIGNsYXNzLgorICAvLy8KKyAgaW5saW5lIE1hY2hpbmVEb21UcmVlTm9kZSAqZ2V0Tm9kZShNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldE5vZGUoQkIpOworICB9CisgIAorICAvLy8gYWRkTmV3QmxvY2sgLSBBZGQgYSBuZXcgbm9kZSB0byB0aGUgZG9taW5hdG9yIHRyZWUgaW5mb3JtYXRpb24uICBUaGlzCisgIC8vLyBjcmVhdGVzIGEgbmV3IG5vZGUgYXMgYSBjaGlsZCBvZiBEb21CQiBkb21pbmF0b3Igbm9kZSxsaW5raW5nIGl0IGludG8gCisgIC8vLyB0aGUgY2hpbGRyZW4gbGlzdCBvZiB0aGUgaW1tZWRpYXRlIGRvbWluYXRvci4KKyAgaW5saW5lIE1hY2hpbmVEb21UcmVlTm9kZSAqYWRkTmV3QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRG9tQkIpIHsKKyAgICByZXR1cm4gRFQtPmFkZE5ld0Jsb2NrKEJCLCBEb21CQik7CisgIH0KKyAgCisgIC8vLyBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgZG9taW5hdG9yCisgIC8vLyB0cmVlIGluZm9ybWF0aW9uIHdoZW4gYSBub2RlJ3MgaW1tZWRpYXRlIGRvbWluYXRvciBjaGFuZ2VzLgorICAvLy8KKyAgaW5saW5lIHZvaWQgY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE1hY2hpbmVCYXNpY0Jsb2NrICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIE5ld0lEb20pIHsKKyAgICBEVC0+Y2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE4sIE5ld0lEb20pOworICB9CisgIAorICBpbmxpbmUgdm9pZCBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoTWFjaGluZURvbVRyZWVOb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZURvbVRyZWVOb2RlKiBOZXdJRG9tKSB7CisgICAgRFQtPmNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihOLCBOZXdJRG9tKTsKKyAgfQorICAKKyAgLy8vIGVyYXNlTm9kZSAtIFJlbW92ZXMgYSBub2RlIGZyb20gIHRoZSBkb21pbmF0b3IgdHJlZS4gQmxvY2sgbXVzdCBub3QKKyAgLy8vIGRvbWlhbnRlIGFueSBvdGhlciBibG9ja3MuIFJlbW92ZXMgbm9kZSBmcm9tIGl0cyBpbW1lZGlhdGUgZG9taW5hdG9yJ3MKKyAgLy8vIGNoaWxkcmVuIGxpc3QuIERlbGV0ZXMgZG9taW5hdG9yIG5vZGUgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIGJsb2NrIEJCLgorICBpbmxpbmUgdm9pZCBlcmFzZU5vZGUoTWFjaGluZUJhc2ljQmxvY2sgKkJCKSB7CisgICAgRFQtPmVyYXNlTm9kZShCQik7CisgIH0KKyAgCisgIC8vLyBzcGxpdEJsb2NrIC0gQkIgaXMgc3BsaXQgYW5kIG5vdyBpdCBoYXMgb25lIHN1Y2Nlc3Nvci4gVXBkYXRlIGRvbWluYXRvcgorICAvLy8gdHJlZSB0byByZWZsZWN0IHRoaXMgY2hhbmdlLgorICBpbmxpbmUgdm9pZCBzcGxpdEJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrKiBOZXdCQikgeworICAgIERULT5zcGxpdEJsb2NrKE5ld0JCKTsKKyAgfQorCisgIC8vLyBpc1JlYWNoYWJsZUZyb21FbnRyeSAtIFJldHVybiB0cnVlIGlmIEEgaXMgZG9taW5hdGVkIGJ5IHRoZSBlbnRyeQorICAvLy8gYmxvY2sgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgaXQuCisgIGJvb2wgaXNSZWFjaGFibGVGcm9tRW50cnkoTWFjaGluZUJhc2ljQmxvY2sgKkEpIHsKKyAgICByZXR1cm4gRFQtPmlzUmVhY2hhYmxlRnJvbUVudHJ5KEEpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKyAgCisgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSopIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gRG9taW5hdG9yVHJlZSBHcmFwaFRyYWl0cyBzcGVjaWFsaXphdGlvbiBzbyB0aGUgRG9taW5hdG9yVHJlZSBjYW4gYmUKKy8vLyBpdGVyYWJsZSBieSBnZW5lcmljIGdyYXBoIGl0ZXJhdG9ycy4KKy8vLworCit0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgR3JhcGhUcmFpdHM7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxNYWNoaW5lRG9tVHJlZU5vZGUgKj4geworICB0eXBlZGVmIE1hY2hpbmVEb21UcmVlTm9kZSBOb2RlVHlwZTsKKyAgdHlwZWRlZiBOb2RlVHlwZTo6aXRlcmF0b3IgIENoaWxkSXRlcmF0b3JUeXBlOworICAKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTjsKKyAgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlKiBOKSB7CisgICAgcmV0dXJuIE4tPmJlZ2luKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUqIE4pIHsKKyAgICByZXR1cm4gTi0+ZW5kKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxNYWNoaW5lRG9taW5hdG9yVHJlZSo+CisgIDogcHVibGljIEdyYXBoVHJhaXRzPE1hY2hpbmVEb21UcmVlTm9kZSAqPiB7CisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKE1hY2hpbmVEb21pbmF0b3JUcmVlICpEVCkgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdE5vZGUoKTsKKyAgfQorfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2ZmNmFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oCkBAIC0wLDAgKzEsNDgxIEBACisvLz09PS0tIENvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIC0gQWJzdHJhY3QgU3RhY2sgRnJhbWUgUmVwLiAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBmaWxlIGRlZmluZXMgdGhlIE1hY2hpbmVGcmFtZUluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUZSQU1FSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FRlJBTUVJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVGFyZ2V0RGF0YTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUeXBlOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBUYXJnZXRGcmFtZUluZm87CitjbGFzcyBCaXRWZWN0b3I7CisKKy8vLyBUaGUgQ2FsbGVlU2F2ZWRJbmZvIGNsYXNzIHRyYWNrcyB0aGUgaW5mb3JtYXRpb24gbmVlZCB0byBsb2NhdGUgd2hlcmUgYQorLy8vIGNhbGxlZSBzYXZlZCByZWdpc3RlciBpbiB0aGUgY3VycmVudCBmcmFtZS4gIAorY2xhc3MgQ2FsbGVlU2F2ZWRJbmZvIHsKKyAgdW5zaWduZWQgUmVnOworICBpbnQgRnJhbWVJZHg7CisgIAorcHVibGljOgorICBleHBsaWNpdCBDYWxsZWVTYXZlZEluZm8odW5zaWduZWQgUiwgaW50IEZJID0gMCkKKyAgOiBSZWcoUiksIEZyYW1lSWR4KEZJKSB7fQorICAKKyAgLy8gQWNjZXNzb3JzLgorICB1bnNpZ25lZCBnZXRSZWcoKSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIFJlZzsgfQorICBpbnQgZ2V0RnJhbWVJZHgoKSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIEZyYW1lSWR4OyB9CisgIHZvaWQgc2V0RnJhbWVJZHgoaW50IEZJKSAgICAgICAgICAgICAgICAgICAgICAgeyBGcmFtZUlkeCA9IEZJOyB9Cit9OworCisvLy8gVGhlIE1hY2hpbmVGcmFtZUluZm8gY2xhc3MgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBzdGFjayBmcmFtZSB1bnRpbAorLy8vIHByb2xvZy9lcGlsb2cgY29kZSBpcyBpbnNlcnRlZC4gIFRoaXMgY2xhc3MgaXMga2V5IHRvIGFsbG93aW5nIHN0YWNrIGZyYW1lCisvLy8gcmVwcmVzZW50YXRpb24gb3B0aW1pemF0aW9ucywgc3VjaCBhcyBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uLiAgSXQgYWxzbworLy8vIGFsbG93cyBtb3JlIG11bmRhbmUgKGJ1dCBzdGlsbCBpbXBvcnRhbnQpIG9wdGltaXphdGlvbnMsIHN1Y2ggYXMgcmVvcmRlcmluZworLy8vIG9mIGFic3RyYWN0IG9iamVjdHMgb24gdGhlIHN0YWNrIGZyYW1lLgorLy8vCisvLy8gVG8gc3VwcG9ydCB0aGlzLCB0aGUgY2xhc3MgYXNzaWducyB1bmlxdWUgaW50ZWdlciBpZGVudGlmaWVycyB0byBzdGFjaworLy8vIG9iamVjdHMgcmVxdWVzdGVkIGNsaWVudHMuICBUaGVzZSBpZGVudGlmaWVycyBhcmUgbmVnYXRpdmUgaW50ZWdlcnMgZm9yCisvLy8gZml4ZWQgc3RhY2sgb2JqZWN0cyAoc3VjaCBhcyBhcmd1bWVudHMgcGFzc2VkIG9uIHRoZSBzdGFjaykgb3Igbm9ubmVnYXRpdmUKKy8vLyBmb3Igb2JqZWN0cyB0aGF0IG1heSBiZSByZW9yZGVyZWQuICBJbnN0cnVjdGlvbnMgd2hpY2ggcmVmZXIgdG8gc3RhY2sKKy8vLyBvYmplY3RzIHVzZSBhIHNwZWNpYWwgTU9fRnJhbWVJbmRleCBvcGVyYW5kIHRvIHJlcHJlc2VudCB0aGVzZSBmcmFtZQorLy8vIGluZGV4ZXMuCisvLy8KKy8vLyBCZWNhdXNlIHRoaXMgY2xhc3Mga2VlcHMgdHJhY2sgb2YgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHN0YWNrIGZyYW1lLCBpdAorLy8vIGtub3dzIHdoZW4gYSB2YXJpYWJsZSBzaXplZCBvYmplY3QgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gIFRoaXMgaXMgdGhlCisvLy8gc29sZSBjb25kaXRpb24gd2hpY2ggcHJldmVudHMgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbiwgd2hpY2ggaXMgYW4KKy8vLyBpbXBvcnRhbnQgb3B0aW1pemF0aW9uIG9uIHJlZ2lzdGVyLXBvb3IgYXJjaGl0ZWN0dXJlcy4gIEJlY2F1c2Ugb3JpZ2luYWwKKy8vLyB2YXJpYWJsZSBzaXplZCBhbGxvY2EncyBpbiB0aGUgc291cmNlIHByb2dyYW0gYXJlIHRoZSBvbmx5IHNvdXJjZSBvZgorLy8vIHZhcmlhYmxlIHNpemVkIHN0YWNrIG9iamVjdHMsIGl0IGlzIHNhZmUgdG8gZGVjaWRlIHdoZXRoZXIgdGhlcmUgd2lsbCBiZQorLy8vIGFueSB2YXJpYWJsZSBzaXplZCBvYmplY3RzIGJlZm9yZSBhbGwgc3RhY2sgb2JqZWN0cyBhcmUga25vd24gKGZvcgorLy8vIGV4YW1wbGUsIHJlZ2lzdGVyIGFsbG9jYXRvciBzcGlsbCBjb2RlIG5ldmVyIG5lZWRzIHZhcmlhYmxlIHNpemVkCisvLy8gb2JqZWN0cykuCisvLy8KKy8vLyBXaGVuIHByb2xvZy9lcGlsb2cgY29kZSBlbWlzc2lvbiBpcyBwZXJmb3JtZWQsIHRoZSBmaW5hbCBzdGFjayBmcmFtZSBpcworLy8vIGJ1aWx0IGFuZCB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbnMgYXJlIG1vZGlmaWVkIHRvIHJlZmVyIHRvIHRoZSBhY3R1YWwKKy8vLyBzdGFjayBvZmZzZXRzIG9mIHRoZSBvYmplY3QsIGVsaW1pbmF0aW5nIGFsbCBNT19GcmFtZUluZGV4IG9wZXJhbmRzIGZyb20KKy8vLyB0aGUgcHJvZ3JhbS4KKy8vLworLy8vIEBicmllZiBBYnN0cmFjdCBTdGFjayBGcmFtZSBJbmZvcm1hdGlvbgorY2xhc3MgTWFjaGluZUZyYW1lSW5mbyB7CisKKyAgLy8gU3RhY2tPYmplY3QgLSBSZXByZXNlbnQgYSBzaW5nbGUgb2JqZWN0IGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgIHN0cnVjdCBTdGFja09iamVjdCB7CisgICAgLy8gU1BPZmZzZXQgLSBUaGUgb2Zmc2V0IG9mIHRoaXMgb2JqZWN0IGZyb20gdGhlIHN0YWNrIHBvaW50ZXIgb24gZW50cnkgdG8KKyAgICAvLyB0aGUgZnVuY3Rpb24uICBUaGlzIGZpZWxkIGhhcyBubyBtZWFuaW5nIGZvciBhIHZhcmlhYmxlIHNpemVkIGVsZW1lbnQuCisgICAgaW50NjRfdCBTUE9mZnNldDsKKyAgICAKKyAgICAvLyBUaGUgc2l6ZSBvZiB0aGlzIG9iamVjdCBvbiB0aGUgc3RhY2suIDAgbWVhbnMgYSB2YXJpYWJsZSBzaXplZCBvYmplY3QsCisgICAgLy8gfjBVTEwgbWVhbnMgYSBkZWFkIG9iamVjdC4KKyAgICB1aW50NjRfdCBTaXplOworCisgICAgLy8gQWxpZ25tZW50IC0gVGhlIHJlcXVpcmVkIGFsaWdubWVudCBvZiB0aGlzIHN0YWNrIHNsb3QuCisgICAgdW5zaWduZWQgQWxpZ25tZW50OworCisgICAgLy8gaXNJbW11dGFibGUgLSBJZiB0cnVlLCB0aGUgdmFsdWUgb2YgdGhlIHN0YWNrIG9iamVjdCBpcyBzZXQgYmVmb3JlCisgICAgLy8gZW50ZXJpbmcgdGhlIGZ1bmN0aW9uIGFuZCBpcyBub3QgbW9kaWZpZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gQnkKKyAgICAvLyBkZWZhdWx0LCBmaXhlZCBvYmplY3RzIGFyZSBpbW11dGFibGUgdW5sZXNzIG1hcmtlZCBvdGhlcndpc2UuCisgICAgYm9vbCBpc0ltbXV0YWJsZTsKKworICAgIC8vIGlzU3BpbGxTbG90IC0gSWYgdHJ1ZSB0aGUgc3RhY2sgb2JqZWN0IGlzIHVzZWQgYXMgc3BpbGwgc2xvdC4gSXQKKyAgICAvLyBjYW5ub3QgYWxpYXMgYW55IG90aGVyIG1lbW9yeSBvYmplY3RzLgorICAgIGJvb2wgaXNTcGlsbFNsb3Q7CisKKyAgICAvLyBNYXlOZWVkU1AgLSBJZiB0cnVlIHRoZSBzdGFjayBvYmplY3QgdHJpZ2dlcmVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3RhY2sKKyAgICAvLyBwcm90ZWN0b3IuIFdlIHNob3VsZCBhbGxvY2F0ZSB0aGlzIG9iamVjdCByaWdodCBhZnRlciB0aGUgc3RhY2sKKyAgICAvLyBwcm90ZWN0b3IuCisgICAgYm9vbCBNYXlOZWVkU1A7CisKKyAgICBTdGFja09iamVjdCh1aW50NjRfdCBTeiwgdW5zaWduZWQgQWwsIGludDY0X3QgU1AsIGJvb2wgSU0sCisgICAgICAgICAgICAgICAgYm9vbCBpc1NTLCBib29sIE5TUCkKKyAgICAgIDogU1BPZmZzZXQoU1ApLCBTaXplKFN6KSwgQWxpZ25tZW50KEFsKSwgaXNJbW11dGFibGUoSU0pLAorICAgICAgICBpc1NwaWxsU2xvdChpc1NTKSwgTWF5TmVlZFNQKE5TUCkge30KKyAgfTsKKworICAvLy8gT2JqZWN0cyAtIFRoZSBsaXN0IG9mIHN0YWNrIG9iamVjdHMgYWxsb2NhdGVkLi4uCisgIC8vLworICBzdGQ6OnZlY3RvcjxTdGFja09iamVjdD4gT2JqZWN0czsKKworICAvLy8gTnVtRml4ZWRPYmplY3RzIC0gVGhpcyBjb250YWlucyB0aGUgbnVtYmVyIG9mIGZpeGVkIG9iamVjdHMgY29udGFpbmVkIG9uCisgIC8vLyB0aGUgc3RhY2suICBCZWNhdXNlIGZpeGVkIG9iamVjdHMgYXJlIHN0b3JlZCBhdCBhIG5lZ2F0aXZlIGluZGV4IGluIHRoZQorICAvLy8gT2JqZWN0cyBsaXN0LCB0aGlzIGlzIGFsc28gdGhlIGluZGV4IHRvIHRoZSAwdGggb2JqZWN0IGluIHRoZSBsaXN0LgorICAvLy8KKyAgdW5zaWduZWQgTnVtRml4ZWRPYmplY3RzOworCisgIC8vLyBIYXNWYXJTaXplZE9iamVjdHMgLSBUaGlzIGJvb2xlYW4ga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBhbnkgdmFyaWFibGUKKyAgLy8vIHNpemVkIG9iamVjdHMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQuCisgIC8vLworICBib29sIEhhc1ZhclNpemVkT2JqZWN0czsKKworICAvLy8gRnJhbWVBZGRyZXNzVGFrZW4gLSBUaGlzIGJvb2xlYW4ga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGVyZSBpcyBhIGNhbGwKKyAgLy8vIHRvIGJ1aWx0aW4gXEBsbHZtLmZyYW1lYWRkcmVzcy4KKyAgYm9vbCBGcmFtZUFkZHJlc3NUYWtlbjsKKworICAvLy8gUmV0dXJuQWRkcmVzc1Rha2VuIC0gVGhpcyBib29sZWFuIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlcmUgaXMgYSBjYWxsCisgIC8vLyB0byBidWlsdGluIFxAbGx2bS5yZXR1cm5hZGRyZXNzLgorICBib29sIFJldHVybkFkZHJlc3NUYWtlbjsKKworICAvLy8gU3RhY2tTaXplIC0gVGhlIHByb2xvZy9lcGlsb2cgY29kZSBpbnNlcnRlciBjYWxjdWxhdGVzIHRoZSBmaW5hbCBzdGFjaworICAvLy8gb2Zmc2V0cyBmb3IgYWxsIG9mIHRoZSBmaXhlZCBzaXplIG9iamVjdHMsIHVwZGF0aW5nIHRoZSBPYmplY3RzIGxpc3QKKyAgLy8vIGFib3ZlLiAgSXQgdGhlbiB1cGRhdGVzIFN0YWNrU2l6ZSB0byBjb250YWluIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkCisgIC8vLyB0byBiZSBhbGxvY2F0ZWQgb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uLgorICAvLy8KKyAgdWludDY0X3QgU3RhY2tTaXplOworICAKKyAgLy8vIE9mZnNldEFkanVzdG1lbnQgLSBUaGUgYW1vdW50IHRoYXQgYSBmcmFtZSBvZmZzZXQgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgdG8KKyAgLy8vIGhhdmUgdGhlIGFjdHVhbCBvZmZzZXQgZnJvbSB0aGUgc3RhY2svZnJhbWUgcG9pbnRlci4gIFRoZSBleGFjdCB1c2FnZSBvZgorICAvLy8gdGhpcyBpcyB0YXJnZXQtZGVwZW5kZW50LCBidXQgaXQgaXMgdHlwaWNhbGx5IHVzZWQgdG8gYWRqdXN0IGJldHdlZW4KKyAgLy8vIFNQLXJlbGF0aXZlIGFuZCBGUC1yZWxhdGl2ZSBvZmZzZXRzLiAgRS5HLiwgaWYgb2JqZWN0cyBhcmUgYWNjZXNzZWQgdmlhCisgIC8vLyBTUCB0aGVuIE9mZnNldEFkanVzdG1lbnQgaXMgemVybzsgaWYgRlAgaXMgdXNlZCwgT2Zmc2V0QWRqdXN0bWVudCBpcyBzZXQKKyAgLy8vIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBpbml0aWFsIFNQIGFuZCB0aGUgdmFsdWUgaW4gRlAuICBGb3IgbWFueQorICAvLy8gdGFyZ2V0cywgdGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQgd2hlbiBnZW5lcmF0aW5nIGRlYnVnIGluZm8gKHZpYQorICAvLy8gVGFyZ2V0UmVnaXN0ZXJJbmZvOjpnZXRGcmFtZUluZGV4T2Zmc2V0KTsgd2hlbiBnZW5lcmF0aW5nIGNvZGUsIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyBhZGp1c3RtZW50cyBhcmUgcGVyZm9ybWVkIGRpcmVjdGx5LgorICBpbnQgT2Zmc2V0QWRqdXN0bWVudDsKKyAgCisgIC8vLyBNYXhBbGlnbm1lbnQgLSBUaGUgcHJvbG9nL2VwaWxvZyBjb2RlIGluc2VydGVyIG1heSBwcm9jZXNzIG9iamVjdHMgCisgIC8vLyB0aGF0IHJlcXVpcmUgZ3JlYXRlciBhbGlnbm1lbnQgdGhhbiB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgdGhlIHRhcmdldAorICAvLy8gcHJvdmlkZXMuIFRvIGhhbmRsZSB0aGlzLCBNYXhBbGlnbm1lbnQgaXMgc2V0IHRvIHRoZSBtYXhpbXVtIGFsaWdubWVudCAKKyAgLy8vIG5lZWRlZCBieSB0aGUgb2JqZWN0cyBvbiB0aGUgY3VycmVudCBmcmFtZS4gIElmIHRoaXMgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAvLy8gbmF0aXZlIGFsaWdubWVudCBtYWludGFpbmVkIGJ5IHRoZSBjb21waWxlciwgZHluYW1pYyBhbGlnbm1lbnQgY29kZSB3aWxsCisgIC8vLyBiZSBuZWVkZWQuCisgIC8vLworICB1bnNpZ25lZCBNYXhBbGlnbm1lbnQ7CisKKyAgLy8vIEFkanVzdHNTdGFjayAtIFNldCB0byB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gYWRqdXN0cyB0aGUgc3RhY2sgLS0gZS5nLiwKKyAgLy8vIHdoZW4gY2FsbGluZyBhbm90aGVyIGZ1bmN0aW9uLiBUaGlzIGlzIG9ubHkgdmFsaWQgZHVyaW5nIGFuZCBhZnRlcgorICAvLy8gcHJvbG9nL2VwaWxvZyBjb2RlIGluc2VydGlvbi4KKyAgYm9vbCBBZGp1c3RzU3RhY2s7CisKKyAgLy8vIEhhc0NhbGxzIC0gU2V0IHRvIHRydWUgaWYgdGhpcyBmdW5jdGlvbiBoYXMgYW55IGZ1bmN0aW9uIGNhbGxzLgorICBib29sIEhhc0NhbGxzOworCisgIC8vLyBTdGFja1Byb3RlY3RvcklkeCAtIFRoZSBmcmFtZSBpbmRleCBmb3IgdGhlIHN0YWNrIHByb3RlY3Rvci4KKyAgaW50IFN0YWNrUHJvdGVjdG9ySWR4OworCisgIC8vLyBNYXhDYWxsRnJhbWVTaXplIC0gVGhpcyBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjYWxsIGZyYW1lIGlmIHRoZQorICAvLy8gdGFyZ2V0IHVzZXMgZnJhbWUgc2V0dXAvZGVzdHJveSBwc2V1ZG8gaW5zdHJ1Y3Rpb25zIChhcyBkZWZpbmVkIGluIHRoZQorICAvLy8gVGFyZ2V0RnJhbWVJbmZvIGNsYXNzKS4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW1wb3J0YW50IGZvciBmcmFtZSBwb2ludGVyCisgIC8vLyBlbGltaW5hdGlvbi4gIElmIGlzIG9ubHkgdmFsaWQgZHVyaW5nIGFuZCBhZnRlciBwcm9sb2cvZXBpbG9nIGNvZGUKKyAgLy8vIGluc2VydGlvbi4KKyAgLy8vCisgIHVuc2lnbmVkIE1heENhbGxGcmFtZVNpemU7CisgIAorICAvLy8gQ1NJbmZvIC0gVGhlIHByb2xvZy9lcGlsb2cgY29kZSBpbnNlcnRlciBmaWxscyBpbiB0aGlzIHZlY3RvciB3aXRoIGVhY2gKKyAgLy8vIGNhbGxlZSBzYXZlZCByZWdpc3RlciBzYXZlZCBpbiB0aGUgZnJhbWUuICBCZXlvbmQgaXRzIHVzZSBieSB0aGUgcHJvbG9nLworICAvLy8gZXBpbG9nIGNvZGUgaW5zZXJ0ZXIsIHRoaXMgZGF0YSB1c2VkIGZvciBkZWJ1ZyBpbmZvIGFuZCBleGNlcHRpb24KKyAgLy8vIGhhbmRsaW5nLgorICBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+IENTSW5mbzsKKworICAvLy8gQ1NJVmFsaWQgLSBIYXMgQ1NJbmZvIGJlZW4gc2V0IHlldD8KKyAgYm9vbCBDU0lWYWxpZDsKKworICAvLy8gU3BpbGxPYmplY3RzIC0gQSB2ZWN0b3IgaW5kaWNhdGluZyB3aGljaCBmcmFtZSBpbmRpY2VzIHJlZmVyIHRvCisgIC8vLyBzcGlsbCBzbG90cy4KKyAgU21hbGxWZWN0b3I8Ym9vbCwgOD4gU3BpbGxPYmplY3RzOworCisgIC8vLyBUYXJnZXRGcmFtZUluZm8gLSBUYXJnZXQgaW5mb3JtYXRpb24gYWJvdXQgZnJhbWUgbGF5b3V0LgorICAvLy8KKyAgY29uc3QgVGFyZ2V0RnJhbWVJbmZvICZURkk7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTWFjaGluZUZyYW1lSW5mbyhjb25zdCBUYXJnZXRGcmFtZUluZm8gJnRmaSkgOiBURkkodGZpKSB7CisgICAgU3RhY2tTaXplID0gTnVtRml4ZWRPYmplY3RzID0gT2Zmc2V0QWRqdXN0bWVudCA9IE1heEFsaWdubWVudCA9IDA7CisgICAgSGFzVmFyU2l6ZWRPYmplY3RzID0gZmFsc2U7CisgICAgRnJhbWVBZGRyZXNzVGFrZW4gPSBmYWxzZTsKKyAgICBSZXR1cm5BZGRyZXNzVGFrZW4gPSBmYWxzZTsKKyAgICBBZGp1c3RzU3RhY2sgPSBmYWxzZTsKKyAgICBIYXNDYWxscyA9IGZhbHNlOworICAgIFN0YWNrUHJvdGVjdG9ySWR4ID0gLTE7CisgICAgTWF4Q2FsbEZyYW1lU2l6ZSA9IDA7CisgICAgQ1NJVmFsaWQgPSBmYWxzZTsKKyAgfQorCisgIC8vLyBoYXNTdGFja09iamVjdHMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHN0YWNrIG9iamVjdHMgaW4gdGhpcworICAvLy8gZnVuY3Rpb24uCisgIC8vLworICBib29sIGhhc1N0YWNrT2JqZWN0cygpIGNvbnN0IHsgcmV0dXJuICFPYmplY3RzLmVtcHR5KCk7IH0KKworICAvLy8gaGFzVmFyU2l6ZWRPYmplY3RzIC0gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhbnkgdGltZSBhZnRlciBpbnN0cnVjdGlvbgorICAvLy8gc2VsZWN0aW9uIGlzIGNvbXBsZXRlIHRvIGRldGVybWluZSBpZiB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoaXMgZnVuY3Rpb24KKyAgLy8vIGNvbnRhaW5zIGFueSB2YXJpYWJsZSBzaXplZCBvYmplY3RzLgorICAvLy8KKyAgYm9vbCBoYXNWYXJTaXplZE9iamVjdHMoKSBjb25zdCB7IHJldHVybiBIYXNWYXJTaXplZE9iamVjdHM7IH0KKworICAvLy8gZ2V0U3RhY2tQcm90ZWN0b3JJbmRleC9zZXRTdGFja1Byb3RlY3RvckluZGV4IC0gUmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlCisgIC8vLyBzdGFjayBwcm90ZWN0b3Igb2JqZWN0LgorICAvLy8KKyAgaW50IGdldFN0YWNrUHJvdGVjdG9ySW5kZXgoKSBjb25zdCB7IHJldHVybiBTdGFja1Byb3RlY3RvcklkeDsgfQorICB2b2lkIHNldFN0YWNrUHJvdGVjdG9ySW5kZXgoaW50IEkpIHsgU3RhY2tQcm90ZWN0b3JJZHggPSBJOyB9CisKKyAgLy8vIGlzRnJhbWVBZGRyZXNzVGFrZW4gLSBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGFueSB0aW1lIGFmdGVyIGluc3RydWN0aW9uCisgIC8vLyBzZWxlY3Rpb24gaXMgY29tcGxldGUgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgY2FsbCB0bworICAvLy8gXEBsbHZtLmZyYW1lYWRkcmVzcyBpbiB0aGlzIGZ1bmN0aW9uLgorICBib29sIGlzRnJhbWVBZGRyZXNzVGFrZW4oKSBjb25zdCB7IHJldHVybiBGcmFtZUFkZHJlc3NUYWtlbjsgfQorICB2b2lkIHNldEZyYW1lQWRkcmVzc0lzVGFrZW4oYm9vbCBUKSB7IEZyYW1lQWRkcmVzc1Rha2VuID0gVDsgfQorCisgIC8vLyBpc1JldHVybkFkZHJlc3NUYWtlbiAtIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYW55IHRpbWUgYWZ0ZXIgaW5zdHJ1Y3Rpb24KKyAgLy8vIHNlbGVjdGlvbiBpcyBjb21wbGV0ZSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBjYWxsIHRvCisgIC8vLyBcQGxsdm0ucmV0dXJuYWRkcmVzcyBpbiB0aGlzIGZ1bmN0aW9uLgorICBib29sIGlzUmV0dXJuQWRkcmVzc1Rha2VuKCkgY29uc3QgeyByZXR1cm4gUmV0dXJuQWRkcmVzc1Rha2VuOyB9CisgIHZvaWQgc2V0UmV0dXJuQWRkcmVzc0lzVGFrZW4oYm9vbCBzKSB7IFJldHVybkFkZHJlc3NUYWtlbiA9IHM7IH0KKworICAvLy8gZ2V0T2JqZWN0SW5kZXhCZWdpbiAtIFJldHVybiB0aGUgbWluaW11bSBmcmFtZSBvYmplY3QgaW5kZXguCisgIC8vLworICBpbnQgZ2V0T2JqZWN0SW5kZXhCZWdpbigpIGNvbnN0IHsgcmV0dXJuIC1OdW1GaXhlZE9iamVjdHM7IH0KKworICAvLy8gZ2V0T2JqZWN0SW5kZXhFbmQgLSBSZXR1cm4gb25lIHBhc3QgdGhlIG1heGltdW0gZnJhbWUgb2JqZWN0IGluZGV4LgorICAvLy8KKyAgaW50IGdldE9iamVjdEluZGV4RW5kKCkgY29uc3QgeyByZXR1cm4gKGludClPYmplY3RzLnNpemUoKS1OdW1GaXhlZE9iamVjdHM7IH0KKworICAvLy8gZ2V0TnVtRml4ZWRPYmplY3RzKCkgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBmaXhlZCBvYmplY3RzLgorICB1bnNpZ25lZCBnZXROdW1GaXhlZE9iamVjdHMoKSBjb25zdCB7IHJldHVybiBOdW1GaXhlZE9iamVjdHM7IH0KKworICAvLy8gZ2V0TnVtT2JqZWN0cygpIC0gUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE51bU9iamVjdHMoKSBjb25zdCB7IHJldHVybiBPYmplY3RzLnNpemUoKTsgfQorCisgIC8vLyBnZXRPYmplY3RTaXplIC0gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAvLy8KKyAgaW50NjRfdCBnZXRPYmplY3RTaXplKGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLlNpemU7CisgIH0KKworICAvLy8gc2V0T2JqZWN0U2l6ZSAtIENoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIHN0YWNrIG9iamVjdC4KKyAgdm9pZCBzZXRPYmplY3RTaXplKGludCBPYmplY3RJZHgsIGludDY0X3QgU2l6ZSkgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5TaXplID0gU2l6ZTsKKyAgfQorCisgIC8vLyBnZXRPYmplY3RBbGlnbm1lbnQgLSBSZXR1cm4gdGhlIGFsaWdubWVudCBvZiB0aGUgc3BlY2lmaWVkIHN0YWNrIG9iamVjdC4KKyAgdW5zaWduZWQgZ2V0T2JqZWN0QWxpZ25tZW50KGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLkFsaWdubWVudDsKKyAgfQorCisgIC8vLyBzZXRPYmplY3RBbGlnbm1lbnQgLSBDaGFuZ2UgdGhlIGFsaWdubWVudCBvZiB0aGUgc3BlY2lmaWVkIHN0YWNrIG9iamVjdC4KKyAgdm9pZCBzZXRPYmplY3RBbGlnbm1lbnQoaW50IE9iamVjdElkeCwgdW5zaWduZWQgQWxpZ24pIHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uQWxpZ25tZW50ID0gQWxpZ247CisgICAgTWF4QWxpZ25tZW50ID0gc3RkOjptYXgoTWF4QWxpZ25tZW50LCBBbGlnbik7CisgIH0KKworICAvLy8gTmVlZHNTdGFja1Byb3RlY3RvciAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IG1heSBuZWVkIHN0YWNrCisgIC8vLyBwcm90ZWN0b3JzLgorICBib29sIE1heU5lZWRTdGFja1Byb3RlY3RvcihpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICByZXR1cm4gT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5NYXlOZWVkU1A7CisgIH0KKworICAvLy8gZ2V0T2JqZWN0T2Zmc2V0IC0gUmV0dXJuIHRoZSBhc3NpZ25lZCBzdGFjayBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QKKyAgLy8vIGZyb20gdGhlIGluY29taW5nIHN0YWNrIHBvaW50ZXIuCisgIC8vLworICBpbnQ2NF90IGdldE9iamVjdE9mZnNldChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICBhc3NlcnQoIWlzRGVhZE9iamVjdEluZGV4KE9iamVjdElkeCkgJiYKKyAgICAgICAgICAgIkdldHRpbmcgZnJhbWUgb2Zmc2V0IGZvciBhIGRlYWQgb2JqZWN0PyIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLlNQT2Zmc2V0OworICB9CisKKyAgLy8vIHNldE9iamVjdE9mZnNldCAtIFNldCB0aGUgc3RhY2sgZnJhbWUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LiAgVGhlCisgIC8vLyBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YWNrIHBvaW50ZXIgb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uLgorICAvLy8KKyAgdm9pZCBzZXRPYmplY3RPZmZzZXQoaW50IE9iamVjdElkeCwgaW50NjRfdCBTUE9mZnNldCkgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgYXNzZXJ0KCFpc0RlYWRPYmplY3RJbmRleChPYmplY3RJZHgpICYmCisgICAgICAgICAgICJTZXR0aW5nIGZyYW1lIG9mZnNldCBmb3IgYSBkZWFkIG9iamVjdD8iKTsKKyAgICBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLlNQT2Zmc2V0ID0gU1BPZmZzZXQ7CisgIH0KKworICAvLy8gZ2V0U3RhY2tTaXplIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIGFsbG9jYXRlZCB0byBob2xkCisgIC8vLyBhbGwgb2YgdGhlIGZpeGVkIHNpemUgZnJhbWUgb2JqZWN0cy4gIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlcgorICAvLy8gUHJvbG9nL0VwaWxvZyBjb2RlIGluc2VydGlvbiBoYXMgZmluYWxpemVkIHRoZSBzdGFjayBmcmFtZSBsYXlvdXQuCisgIC8vLworICB1aW50NjRfdCBnZXRTdGFja1NpemUoKSBjb25zdCB7IHJldHVybiBTdGFja1NpemU7IH0KKworICAvLy8gc2V0U3RhY2tTaXplIC0gU2V0IHRoZSBzaXplIG9mIHRoZSBzdGFjay4uLgorICAvLy8KKyAgdm9pZCBzZXRTdGFja1NpemUodWludDY0X3QgU2l6ZSkgeyBTdGFja1NpemUgPSBTaXplOyB9CisgIAorICAvLy8gZ2V0T2Zmc2V0QWRqdXN0bWVudCAtIFJldHVybiB0aGUgY29ycmVjdGlvbiBmb3IgZnJhbWUgb2Zmc2V0cy4KKyAgLy8vCisgIGludCBnZXRPZmZzZXRBZGp1c3RtZW50KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0QWRqdXN0bWVudDsgfQorICAKKyAgLy8vIHNldE9mZnNldEFkanVzdG1lbnQgLSBTZXQgdGhlIGNvcnJlY3Rpb24gZm9yIGZyYW1lIG9mZnNldHMuCisgIC8vLworICB2b2lkIHNldE9mZnNldEFkanVzdG1lbnQoaW50IEFkaikgeyBPZmZzZXRBZGp1c3RtZW50ID0gQWRqOyB9CisKKyAgLy8vIGdldE1heEFsaWdubWVudCAtIFJldHVybiB0aGUgYWxpZ25tZW50IGluIGJ5dGVzIHRoYXQgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIAorICAvLy8gYWxpZ25lZCB0bywgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIHRoZSBkZWZhdWx0IHN0YWNrIGFsaWdubWVudCBwcm92aWRlZCBieSAKKyAgLy8vIHRoZSB0YXJnZXQuCisgIC8vLworICB1bnNpZ25lZCBnZXRNYXhBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBNYXhBbGlnbm1lbnQ7IH0KKyAgCisgIC8vLyBzZXRNYXhBbGlnbm1lbnQgLSBTZXQgdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQuCisgIC8vLworICB2b2lkIHNldE1heEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeyBNYXhBbGlnbm1lbnQgPSBBbGlnbjsgfQorCisgIC8vLyBBZGp1c3RzU3RhY2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGFkanVzdHMgdGhlIHN0YWNrIC0tIGUuZy4sCisgIC8vLyB3aGVuIGNhbGxpbmcgYW5vdGhlciBmdW5jdGlvbi4gVGhpcyBpcyBvbmx5IHZhbGlkIGR1cmluZyBhbmQgYWZ0ZXIKKyAgLy8vIHByb2xvZy9lcGlsb2cgY29kZSBpbnNlcnRpb24uCisgIGJvb2wgYWRqdXN0c1N0YWNrKCkgY29uc3QgeyByZXR1cm4gQWRqdXN0c1N0YWNrOyB9CisgIHZvaWQgc2V0QWRqdXN0c1N0YWNrKGJvb2wgVikgeyBBZGp1c3RzU3RhY2sgPSBWOyB9CisKKyAgLy8vIGhhc0NhbGxzIC0gUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaGFzIGFueSBmdW5jdGlvbiBjYWxscy4KKyAgYm9vbCBoYXNDYWxscygpIGNvbnN0IHsgcmV0dXJuIEhhc0NhbGxzOyB9CisgIHZvaWQgc2V0SGFzQ2FsbHMoYm9vbCBWKSB7IEhhc0NhbGxzID0gVjsgfQorCisgIC8vLyBnZXRNYXhDYWxsRnJhbWVTaXplIC0gUmV0dXJuIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBjYWxsIGZyYW1lIHRoYXQgbXVzdCBiZQorICAvLy8gYWxsb2NhdGVkIGZvciBhbiBvdXRnb2luZyBmdW5jdGlvbiBjYWxsLiAgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZgorICAvLy8gQ2FsbEZyYW1lU2V0dXAvRGVzdHJveSBwc2V1ZG8gaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIGJ5IHRoZSB0YXJnZXQsIGFuZAorICAvLy8gdGhlbiBvbmx5IGR1cmluZyBvciBhZnRlciBwcm9sb2cvZXBpbG9nIGNvZGUgaW5zZXJ0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0TWF4Q2FsbEZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE1heENhbGxGcmFtZVNpemU7IH0KKyAgdm9pZCBzZXRNYXhDYWxsRnJhbWVTaXplKHVuc2lnbmVkIFMpIHsgTWF4Q2FsbEZyYW1lU2l6ZSA9IFM7IH0KKworICAvLy8gQ3JlYXRlRml4ZWRPYmplY3QgLSBDcmVhdGUgYSBuZXcgb2JqZWN0IGF0IGEgZml4ZWQgbG9jYXRpb24gb24gdGhlIHN0YWNrLgorICAvLy8gQWxsIGZpeGVkIG9iamVjdHMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIG90aGVyIG9iamVjdHMgYXJlIGNyZWF0ZWQgZm9yCisgIC8vLyBlZmZpY2llbmN5LiBCeSBkZWZhdWx0LCBmaXhlZCBvYmplY3RzIGFyZSBpbW11dGFibGUuIFRoaXMgcmV0dXJucyBhbgorICAvLy8gaW5kZXggd2l0aCBhIG5lZ2F0aXZlIHZhbHVlLgorICAvLy8KKyAgaW50IENyZWF0ZUZpeGVkT2JqZWN0KHVpbnQ2NF90IFNpemUsIGludDY0X3QgU1BPZmZzZXQsIGJvb2wgSW1tdXRhYmxlKTsKKyAgCisgIAorICAvLy8gaXNGaXhlZE9iamVjdEluZGV4IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggY29ycmVzcG9uZHMgdG8gYQorICAvLy8gZml4ZWQgc3RhY2sgb2JqZWN0LgorICBib29sIGlzRml4ZWRPYmplY3RJbmRleChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgcmV0dXJuIE9iamVjdElkeCA8IDAgJiYgKE9iamVjdElkeCA+PSAtKGludClOdW1GaXhlZE9iamVjdHMpOworICB9CisKKyAgLy8vIGlzSW1tdXRhYmxlT2JqZWN0SW5kZXggLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBjb3JyZXNwb25kcworICAvLy8gdG8gYW4gaW1tdXRhYmxlIG9iamVjdC4KKyAgYm9vbCBpc0ltbXV0YWJsZU9iamVjdEluZGV4KGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzSW1tdXRhYmxlOworICB9CisKKyAgLy8vIGlzU3BpbGxTbG90T2JqZWN0SW5kZXggLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBjb3JyZXNwb25kcworICAvLy8gdG8gYSBzcGlsbCBzbG90Li4KKyAgYm9vbCBpc1NwaWxsU2xvdE9iamVjdEluZGV4KGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzU3BpbGxTbG90OzsKKyAgfQorCisgIC8vLyBpc0RlYWRPYmplY3RJbmRleCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGNvcnJlc3BvbmRzIHRvCisgIC8vLyBhIGRlYWQgb2JqZWN0LgorICBib29sIGlzRGVhZE9iamVjdEluZGV4KGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLlNpemUgPT0gfjBVTEw7CisgIH0KKworICAvLy8gQ3JlYXRlU3RhY2tPYmplY3QgLSBDcmVhdGUgYSBuZXcgc3RhdGljYWxseSBzaXplZCBzdGFjayBvYmplY3QsIHJldHVybmluZworICAvLy8gYSBub25uZWdhdGl2ZSBpZGVudGlmaWVyIHRvIHJlcHJlc2VudCBpdC4KKyAgLy8vCisgIGludCBDcmVhdGVTdGFja09iamVjdCh1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQsIGJvb2wgaXNTUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWF5TmVlZFNQID0gZmFsc2UpIHsKKyAgICBhc3NlcnQoU2l6ZSAhPSAwICYmICJDYW5ub3QgYWxsb2NhdGUgemVybyBzaXplIHN0YWNrIG9iamVjdHMhIik7CisgICAgT2JqZWN0cy5wdXNoX2JhY2soU3RhY2tPYmplY3QoU2l6ZSwgQWxpZ25tZW50LCAwLCBmYWxzZSwgaXNTUywgTWF5TmVlZFNQKSk7CisgICAgaW50IEluZGV4ID0gKGludClPYmplY3RzLnNpemUoKSAtIE51bUZpeGVkT2JqZWN0cyAtIDE7CisgICAgYXNzZXJ0KEluZGV4ID49IDAgJiYgIkJhZCBmcmFtZSBpbmRleCEiKTsKKyAgICBNYXhBbGlnbm1lbnQgPSBzdGQ6Om1heChNYXhBbGlnbm1lbnQsIEFsaWdubWVudCk7CisgICAgcmV0dXJuIEluZGV4OworICB9CisKKyAgLy8vIENyZWF0ZVNwaWxsU3RhY2tPYmplY3QgLSBDcmVhdGUgYSBuZXcgc3RhdGljYWxseSBzaXplZCBzdGFjayBvYmplY3QgdGhhdAorICAvLy8gcmVwcmVzZW50cyBhIHNwaWxsIHNsb3QsIHJldHVybmluZyBhIG5vbm5lZ2F0aXZlIGlkZW50aWZpZXIgdG8gcmVwcmVzZW50CisgIC8vLyBpdC4KKyAgLy8vCisgIGludCBDcmVhdGVTcGlsbFN0YWNrT2JqZWN0KHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCkgeworICAgIENyZWF0ZVN0YWNrT2JqZWN0KFNpemUsIEFsaWdubWVudCwgdHJ1ZSwgZmFsc2UpOworICAgIGludCBJbmRleCA9IChpbnQpT2JqZWN0cy5zaXplKCkgLSBOdW1GaXhlZE9iamVjdHMgLSAxOworICAgIE1heEFsaWdubWVudCA9IHN0ZDo6bWF4KE1heEFsaWdubWVudCwgQWxpZ25tZW50KTsKKyAgICByZXR1cm4gSW5kZXg7CisgIH0KKworICAvLy8gUmVtb3ZlU3RhY2tPYmplY3QgLSBSZW1vdmUgb3IgbWFyayBkZWFkIGEgc3RhdGljYWxseSBzaXplZCBzdGFjayBvYmplY3QuCisgIC8vLworICB2b2lkIFJlbW92ZVN0YWNrT2JqZWN0KGludCBPYmplY3RJZHgpIHsKKyAgICAvLyBNYXJrIGl0IGRlYWQuCisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5TaXplID0gfjBVTEw7CisgIH0KKworICAvLy8gQ3JlYXRlVmFyaWFibGVTaXplZE9iamVjdCAtIE5vdGlmeSB0aGUgTWFjaGluZUZyYW1lSW5mbyBvYmplY3QgdGhhdCBhCisgIC8vLyB2YXJpYWJsZSBzaXplZCBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZC4gIFRoaXMgbXVzdCBiZSBjcmVhdGVkIHdoZW5ldmVyIGEKKyAgLy8vIHZhcmlhYmxlIHNpemVkIG9iamVjdCBpcyBjcmVhdGVkLCB3aGV0aGVyIG9yIG5vdCB0aGUgaW5kZXggcmV0dXJuZWQgaXMKKyAgLy8vIGFjdHVhbGx5IHVzZWQuCisgIC8vLworICBpbnQgQ3JlYXRlVmFyaWFibGVTaXplZE9iamVjdCh1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgICBIYXNWYXJTaXplZE9iamVjdHMgPSB0cnVlOworICAgIE9iamVjdHMucHVzaF9iYWNrKFN0YWNrT2JqZWN0KDAsIEFsaWdubWVudCwgMCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7CisgICAgTWF4QWxpZ25tZW50ID0gc3RkOjptYXgoTWF4QWxpZ25tZW50LCBBbGlnbm1lbnQpOworICAgIHJldHVybiAoaW50KU9iamVjdHMuc2l6ZSgpLU51bUZpeGVkT2JqZWN0cy0xOworICB9CisKKyAgLy8vIGdldENhbGxlZVNhdmVkSW5mbyAtIFJldHVybnMgYSByZWZlcmVuY2UgdG8gY2FsbCBzYXZlZCBpbmZvIHZlY3RvciBmb3IgdGhlCisgIC8vLyBjdXJyZW50IGZ1bmN0aW9uLgorICBjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZnZXRDYWxsZWVTYXZlZEluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIENTSW5mbzsKKyAgfQorCisgIC8vLyBzZXRDYWxsZWVTYXZlZEluZm8gLSBVc2VkIGJ5IHByb2xvZy9lcGlsb2cgaW5zZXJ0ZXIgdG8gc2V0IHRoZSBmdW5jdGlvbidzCisgIC8vLyBjYWxsZWUgc2F2ZWQgaW5mb3JtYXRpb24uCisgIHZvaWQgc2V0Q2FsbGVlU2F2ZWRJbmZvKGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSkgeworICAgIENTSW5mbyA9IENTSTsKKyAgfQorCisgIC8vLyBpc0NhbGxlZVNhdmVkSW5mb1ZhbGlkIC0gSGFzIHRoZSBjYWxsZWUgc2F2ZWQgaW5mbyBiZWVuIGNhbGN1bGF0ZWQgeWV0PworICBib29sIGlzQ2FsbGVlU2F2ZWRJbmZvVmFsaWQoKSBjb25zdCB7IHJldHVybiBDU0lWYWxpZDsgfQorCisgIHZvaWQgc2V0Q2FsbGVlU2F2ZWRJbmZvVmFsaWQoYm9vbCB2KSB7IENTSVZhbGlkID0gdjsgfQorCisgIC8vLyBnZXRQcmlzdGluZVJlZ3MgLSBSZXR1cm4gYSBzZXQgb2YgcGh5c2ljYWwgcmVnaXN0ZXJzIHRoYXQgYXJlIHByaXN0aW5lIG9uCisgIC8vLyBlbnRyeSB0byB0aGUgTUJCLgorICAvLy8KKyAgLy8vIFByaXN0aW5lIHJlZ2lzdGVycyBob2xkIGEgdmFsdWUgdGhhdCBpcyB1c2VsZXNzIHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uLAorICAvLy8gYnV0IHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgLSB0aGV5IGFyZSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzIHRoYXQgaGF2ZSBub3QKKyAgLy8vIGJlZW4gc2F2ZWQgeWV0LgorICAvLy8KKyAgLy8vIEJlZm9yZSB0aGUgUHJvbG9ndWVFcGlsb2d1ZUluc2VydGVyIGhhcyBwbGFjZWQgdGhlIENTUiBzcGlsbCBjb2RlLCB0aGlzCisgIC8vLyBtZXRob2QgYWx3YXlzIHJldHVybnMgYW4gZW1wdHkgc2V0LgorICBCaXRWZWN0b3IgZ2V0UHJpc3RpbmVSZWdzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgIC8vLyBwcmludCAtIFVzZWQgYnkgdGhlIE1hY2hpbmVGdW5jdGlvbiBwcmludGVyIHRvIHByaW50IGluZm9ybWF0aW9uIGFib3V0CisgIC8vLyBzdGFjayBvYmplY3RzLiBJbXBsZW1lbnRlZCBpbiBNYWNoaW5lRnVuY3Rpb24uY3BwCisgIC8vLworICB2b2lkIHByaW50KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIGR1bXAgLSBQcmludCB0aGUgZnVuY3Rpb24gdG8gc3RkZXJyLgorICB2b2lkIGR1bXAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiNDUzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oCkBAIC0wLDAgKzEsNDY4IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbGxlY3QgbmF0aXZlIG1hY2hpbmUgY29kZSBmb3IgYSBmdW5jdGlvbi4gIFRoaXMgY2xhc3MgY29udGFpbnMgYSBsaXN0IG9mCisvLyBNYWNoaW5lQmFzaWNCbG9jayBpbnN0YW5jZXMgdGhhdCBtYWtlIHVwIHRoZSBjdXJyZW50IGNvbXBpbGVkIGZ1bmN0aW9uLgorLy8KKy8vIFRoaXMgY2xhc3MgYWxzbyBjb250YWlucyBwb2ludGVycyB0byB2YXJpb3VzIGNsYXNzZXMgd2hpY2ggaG9sZAorLy8gdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnZW5lcmF0ZWQgY29kZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FRlVOQ1RJT05fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUZVTkNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWN5Y2xlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFZhbHVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgTWFjaGluZUZyYW1lSW5mbzsKK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2w7CitjbGFzcyBNYWNoaW5lSnVtcFRhYmxlSW5mbzsKK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgUGFzczsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGlsaXN0X3RyYWl0czxNYWNoaW5lQmFzaWNCbG9jaz4KKyAgICA6IHB1YmxpYyBpbGlzdF9kZWZhdWx0X3RyYWl0czxNYWNoaW5lQmFzaWNCbG9jaz4geworICBtdXRhYmxlIGlsaXN0X2hhbGZfbm9kZTxNYWNoaW5lQmFzaWNCbG9jaz4gU2VudGluZWw7CitwdWJsaWM6CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpjcmVhdGVTZW50aW5lbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWFjaGluZUJhc2ljQmxvY2sqPigmU2VudGluZWwpOworICB9CisgIHZvaWQgZGVzdHJveVNlbnRpbmVsKE1hY2hpbmVCYXNpY0Jsb2NrICopIGNvbnN0IHt9CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKnByb3ZpZGVJbml0aWFsSGVhZCgpIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7IH0KKyAgTWFjaGluZUJhc2ljQmxvY2sgKmVuc3VyZUhlYWQoTWFjaGluZUJhc2ljQmxvY2sqKSBjb25zdCB7CisgICAgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7CisgIH0KKyAgc3RhdGljIHZvaWQgbm90ZUhlYWQoTWFjaGluZUJhc2ljQmxvY2sqLCBNYWNoaW5lQmFzaWNCbG9jayopIHt9CisKKyAgdm9pZCBhZGROb2RlVG9MaXN0KE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIpOworICB2b2lkIHJlbW92ZU5vZGVGcm9tTGlzdChNYWNoaW5lQmFzaWNCbG9jayogTUJCKTsKKyAgdm9pZCBkZWxldGVOb2RlKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworcHJpdmF0ZToKKyAgdm9pZCBjcmVhdGVOb2RlKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICYpOworfTsKKworLy8vIE1hY2hpbmVGdW5jdGlvbkluZm8gLSBUaGlzIGNsYXNzIGNhbiBiZSBkZXJpdmVkIGZyb20gYW5kIHVzZWQgYnkgdGFyZ2V0cyB0bworLy8vIGhvbGQgcHJpdmF0ZSB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGVhY2ggTWFjaGluZUZ1bmN0aW9uLiAgT2JqZWN0cworLy8vIG9mIHR5cGUgYXJlIGFjY2Vzc2VkL2NyZWF0ZWQgd2l0aCBNRjo6Z2V0SW5mbyBhbmQgZGVzdHJveWVkIHdoZW4gdGhlCisvLy8gTWFjaGluZUZ1bmN0aW9uIGlzIGRlc3Ryb3llZC4KK3N0cnVjdCBNYWNoaW5lRnVuY3Rpb25JbmZvIHsKKyAgdmlydHVhbCB+TWFjaGluZUZ1bmN0aW9uSW5mbygpOworfTsKKworY2xhc3MgTWFjaGluZUZ1bmN0aW9uIHsKKyAgY29uc3QgRnVuY3Rpb24gKkZuOworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUYXJnZXQ7CisgIE1DQ29udGV4dCAmQ3R4OworICBNYWNoaW5lTW9kdWxlSW5mbyAmTU1JOworICAKKyAgLy8gUmVnSW5mbyAtIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVnaXN0ZXIgaW4gdXNlIGluIHRoZSBmdW5jdGlvbi4KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqUmVnSW5mbzsKKworICAvLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGFyZ2V0LXNwZWNpZmljIHBlci1tYWNoaW5lIGZ1bmN0aW9uIGluZm9ybWF0aW9uIGZvcgorICAvLyB0aGUgdGFyZ2V0IGltcGxlbWVudGF0aW9uLgorICBNYWNoaW5lRnVuY3Rpb25JbmZvICpNRkluZm87CisKKyAgLy8gS2VlcCB0cmFjayBvZiBvYmplY3RzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgIE1hY2hpbmVGcmFtZUluZm8gKkZyYW1lSW5mbzsKKworICAvLyBLZWVwIHRyYWNrIG9mIGNvbnN0YW50cyB3aGljaCBhcmUgc3BpbGxlZCB0byBtZW1vcnkKKyAgTWFjaGluZUNvbnN0YW50UG9vbCAqQ29uc3RhbnRQb29sOworICAKKyAgLy8gS2VlcCB0cmFjayBvZiBqdW1wIHRhYmxlcyBmb3Igc3dpdGNoIGluc3RydWN0aW9ucworICBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqSnVtcFRhYmxlSW5mbzsKKworICAvLyBGdW5jdGlvbi1sZXZlbCB1bmlxdWUgbnVtYmVyaW5nIGZvciBNYWNoaW5lQmFzaWNCbG9ja3MuICBXaGVuIGEKKyAgLy8gTWFjaGluZUJhc2ljQmxvY2sgaXMgaW5zZXJ0ZWQgaW50byBhIE1hY2hpbmVGdW5jdGlvbiBpcyBpdCBhdXRvbWF0aWNhbGx5CisgIC8vIG51bWJlcmVkIGFuZCB0aGlzIHZlY3RvciBrZWVwcyB0cmFjayBvZiB0aGUgbWFwcGluZyBmcm9tIElEJ3MgdG8gTUJCJ3MuCisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gTUJCTnVtYmVyaW5nOworCisgIC8vIFBvb2wtYWxsb2NhdGUgTWFjaGluZUZ1bmN0aW9uLWxpZmV0aW1lIGFuZCBJUiBvYmplY3RzLgorICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKKworICAvLyBBbGxvY2F0aW9uIG1hbmFnZW1lbnQgZm9yIGluc3RydWN0aW9ucyBpbiBmdW5jdGlvbi4KKyAgUmVjeWNsZXI8TWFjaGluZUluc3RyPiBJbnN0cnVjdGlvblJlY3ljbGVyOworCisgIC8vIEFsbG9jYXRpb24gbWFuYWdlbWVudCBmb3IgYmFzaWMgYmxvY2tzIGluIGZ1bmN0aW9uLgorICBSZWN5Y2xlcjxNYWNoaW5lQmFzaWNCbG9jaz4gQmFzaWNCbG9ja1JlY3ljbGVyOworCisgIC8vIExpc3Qgb2YgbWFjaGluZSBiYXNpYyBibG9ja3MgaW4gZnVuY3Rpb24KKyAgdHlwZWRlZiBpbGlzdDxNYWNoaW5lQmFzaWNCbG9jaz4gQmFzaWNCbG9ja0xpc3RUeXBlOworICBCYXNpY0Jsb2NrTGlzdFR5cGUgQmFzaWNCbG9ja3M7CisKKyAgLy8vIEZ1bmN0aW9uTnVtYmVyIC0gVGhpcyBwcm92aWRlcyBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBmdW5jdGlvbiBlbWl0dGVkIGluCisgIC8vLyB0aGlzIHRyYW5zbGF0aW9uIHVuaXQuCisgIC8vLworICB1bnNpZ25lZCBGdW5jdGlvbk51bWJlcjsKKyAgCisgIC8vLyBBbGlnbm1lbnQgLSBUaGUgYWxpZ25tZW50IG9mIHRoZSBmdW5jdGlvbi4KKyAgdW5zaWduZWQgQWxpZ25tZW50OworCisgIC8vLyBDYWxsc1NldEptcCAtIFRydWUgaWYgdGhlIGZ1bmN0aW9uIGNhbGxzIHNldGptcCBvciBzaWdzZXRqbXAuIFRoaXMgaXMgdXNlZAorICAvLy8gdG8gbGltaXQgb3B0aW1pemF0aW9ucyB3aGljaCBjYW5ub3QgcmVhc29uIGFib3V0IHRoZSBjb250cm9sIGZsb3cgb2YKKyAgLy8vIHNldGptcC4KKyAgYm9vbCBDYWxsc1NldEptcDsKKworICBNYWNoaW5lRnVuY3Rpb24oY29uc3QgTWFjaGluZUZ1bmN0aW9uICYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiYpOyAgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3B1YmxpYzoKKyAgTWFjaGluZUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGbiwgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGdW5jdGlvbk51bSwgTWFjaGluZU1vZHVsZUluZm8gJk1NSSk7CisgIH5NYWNoaW5lRnVuY3Rpb24oKTsKKworICBNYWNoaW5lTW9kdWxlSW5mbyAmZ2V0TU1JKCkgY29uc3QgeyByZXR1cm4gTU1JOyB9CisgIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIEN0eDsgfQorICAKKyAgLy8vIGdldEZ1bmN0aW9uIC0gUmV0dXJuIHRoZSBMTFZNIGZ1bmN0aW9uIHRoYXQgdGhpcyBtYWNoaW5lIGNvZGUgcmVwcmVzZW50cworICAvLy8KKyAgY29uc3QgRnVuY3Rpb24gKmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gRm47IH0KKworICAvLy8gZ2V0RnVuY3Rpb25OdW1iZXIgLSBSZXR1cm4gYSB1bmlxdWUgSUQgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0RnVuY3Rpb25OdW1iZXIoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvbk51bWJlcjsgfQorICAKKyAgLy8vIGdldFRhcmdldCAtIFJldHVybiB0aGUgdGFyZ2V0IG1hY2hpbmUgdGhpcyBtYWNoaW5lIGNvZGUgaXMgY29tcGlsZWQgd2l0aAorICAvLy8KKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmZ2V0VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0OyB9CisKKyAgLy8vIGdldFJlZ0luZm8gLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZ2lzdGVycyBjdXJyZW50bHkgaW4gdXNlLgorICAvLy8KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmZ2V0UmVnSW5mbygpIHsgcmV0dXJuICpSZWdJbmZvOyB9CisgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJmdldFJlZ0luZm8oKSBjb25zdCB7IHJldHVybiAqUmVnSW5mbzsgfQorCisgIC8vLyBnZXRGcmFtZUluZm8gLSBSZXR1cm4gdGhlIGZyYW1lIGluZm8gb2JqZWN0IGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgLy8vIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IG9iamVjdHMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaworICAvLy8gZnJhbWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaW4gYW4gYWJzdHJhY3Qgd2F5LgorICAvLy8KKyAgTWFjaGluZUZyYW1lSW5mbyAqZ2V0RnJhbWVJbmZvKCkgeyByZXR1cm4gRnJhbWVJbmZvOyB9CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKmdldEZyYW1lSW5mbygpIGNvbnN0IHsgcmV0dXJuIEZyYW1lSW5mbzsgfQorCisgIC8vLyBnZXRKdW1wVGFibGVJbmZvIC0gUmV0dXJuIHRoZSBqdW1wIHRhYmxlIGluZm8gb2JqZWN0IGZvciB0aGUgY3VycmVudCAKKyAgLy8vIGZ1bmN0aW9uLiAgVGhpcyBvYmplY3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQganVtcCB0YWJsZXMgaW4gdGhlCisgIC8vLyBjdXJyZW50IGZ1bmN0aW9uLiAgSWYgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaGFzIG5vIGp1bXAgdGFibGVzLCB0aGlzIHdpbGwKKyAgLy8vIHJldHVybiBudWxsLgorICBjb25zdCBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqZ2V0SnVtcFRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEp1bXBUYWJsZUluZm87IH0KKyAgTWFjaGluZUp1bXBUYWJsZUluZm8gKmdldEp1bXBUYWJsZUluZm8oKSB7IHJldHVybiBKdW1wVGFibGVJbmZvOyB9CisKKyAgLy8vIGdldE9yQ3JlYXRlSnVtcFRhYmxlSW5mbyAtIEdldCB0aGUgSnVtcFRhYmxlSW5mbyBmb3IgdGhpcyBmdW5jdGlvbiwgaWYgaXQKKyAgLy8vIGRvZXMgYWxyZWFkeSBleGlzdCwgYWxsb2NhdGUgb25lLgorICBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqZ2V0T3JDcmVhdGVKdW1wVGFibGVJbmZvKHVuc2lnbmVkIEpURW50cnlLaW5kKTsKKworICAKKyAgLy8vIGdldENvbnN0YW50UG9vbCAtIFJldHVybiB0aGUgY29uc3RhbnQgcG9vbCBvYmplY3QgZm9yIHRoZSBjdXJyZW50CisgIC8vLyBmdW5jdGlvbi4KKyAgLy8vCisgIE1hY2hpbmVDb25zdGFudFBvb2wgKmdldENvbnN0YW50UG9vbCgpIHsgcmV0dXJuIENvbnN0YW50UG9vbDsgfQorICBjb25zdCBNYWNoaW5lQ29uc3RhbnRQb29sICpnZXRDb25zdGFudFBvb2woKSBjb25zdCB7IHJldHVybiBDb25zdGFudFBvb2w7IH0KKworICAvLy8gZ2V0QWxpZ25tZW50IC0gUmV0dXJuIHRoZSBhbGlnbm1lbnQgKGxvZzIsIG5vdCBieXRlcykgb2YgdGhlIGZ1bmN0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gQWxpZ25tZW50OyB9CisKKyAgLy8vIHNldEFsaWdubWVudCAtIFNldCB0aGUgYWxpZ25tZW50IChsb2cyLCBub3QgYnl0ZXMpIG9mIHRoZSBmdW5jdGlvbi4KKyAgLy8vCisgIHZvaWQgc2V0QWxpZ25tZW50KHVuc2lnbmVkIEEpIHsgQWxpZ25tZW50ID0gQTsgfQorCisgIC8vLyBFbnN1cmVBbGlnbm1lbnQgLSBNYWtlIHN1cmUgdGhlIGZ1bmN0aW9uIGlzIGF0IGxlYXN0ICdBJyBiaXRzIGFsaWduZWQuCisgIHZvaWQgRW5zdXJlQWxpZ25tZW50KHVuc2lnbmVkIEEpIHsKKyAgICBpZiAoQWxpZ25tZW50IDwgQSkgQWxpZ25tZW50ID0gQTsKKyAgfQorCisgIC8vLyBjYWxsc1NldEptcCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gY2FsbHMgc2V0am1wIG9yIHNpZ3NldGptcC4KKyAgYm9vbCBjYWxsc1NldEptcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FsbHNTZXRKbXA7CisgIH0KKworICAvLy8gc2V0Q2FsbHNTZXRKbXAgLSBTZXQgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZXJlJ3MgYSBjYWxsIHRvIHNldGptcCBvcgorICAvLy8gc2lnc2V0am1wLgorICB2b2lkIHNldENhbGxzU2V0Sm1wKGJvb2wgQikgeworICAgIENhbGxzU2V0Sm1wID0gQjsKKyAgfQorICAKKyAgLy8vIGdldEluZm8gLSBLZWVwIHRyYWNrIG9mIHZhcmlvdXMgcGVyLWZ1bmN0aW9uIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBmb3IKKyAgLy8vIGJhY2tlbmRzIHRoYXQgd291bGQgbGlrZSB0byBkbyBzby4KKyAgLy8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5PgorICBUeSAqZ2V0SW5mbygpIHsKKyAgICBpZiAoIU1GSW5mbykgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBqdXN0IGBuZXcgKEFsbG9jYXRvci5BbGxvY2F0ZTxUeT4oKSkgVHkoKnRoaXMpJywgYnV0CisgICAgICAgIC8vIHRoYXQgYXBwYXJlbnRseSBicmVha3MgR0NDIDMuMy4KKyAgICAgICAgVHkgKkxvYyA9IHN0YXRpY19jYXN0PFR5Kj4oQWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbk9mPFR5Pjo6QWxpZ25tZW50KSk7CisgICAgICAgIE1GSW5mbyA9IG5ldyAoTG9jKSBUeSgqdGhpcyk7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeSo+KE1GSW5mbyk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeT4KKyAgY29uc3QgVHkgKmdldEluZm8oKSBjb25zdCB7CisgICAgIHJldHVybiBjb25zdF9jYXN0PE1hY2hpbmVGdW5jdGlvbio+KHRoaXMpLT5nZXRJbmZvPFR5PigpOworICB9CisKKyAgLy8vIGdldEJsb2NrTnVtYmVyZWQgLSBNYWNoaW5lQmFzaWNCbG9ja3MgYXJlIGF1dG9tYXRpY2FsbHkgbnVtYmVyZWQgd2hlbiB0aGV5CisgIC8vLyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgbWFjaGluZSBmdW5jdGlvbi4gIFRoZSBibG9jayBudW1iZXIgZm9yIGEgbWFjaGluZQorICAvLy8gYmFzaWMgYmxvY2sgY2FuIGJlIGZvdW5kIGJ5IHVzaW5nIHRoZSBNQkI6OmdldEJsb2NrTnVtYmVyIG1ldGhvZCwgdGhpcworICAvLy8gbWV0aG9kIHByb3ZpZGVzIHRoZSBpbnZlcnNlIG1hcHBpbmcuCisgIC8vLworICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0QmxvY2tOdW1iZXJlZCh1bnNpZ25lZCBOKSBjb25zdCB7CisgICAgYXNzZXJ0KE4gPCBNQkJOdW1iZXJpbmcuc2l6ZSgpICYmICJJbGxlZ2FsIGJsb2NrIG51bWJlciIpOworICAgIGFzc2VydChNQkJOdW1iZXJpbmdbTl0gJiYgIkJsb2NrIHdhcyByZW1vdmVkIGZyb20gdGhlIG1hY2hpbmUgZnVuY3Rpb24hIik7CisgICAgcmV0dXJuIE1CQk51bWJlcmluZ1tOXTsKKyAgfQorCisgIC8vLyBnZXROdW1CbG9ja0lEcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIE1CQiBJRCdzIGFsbG9jYXRlZC4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE51bUJsb2NrSURzKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKU1CQk51bWJlcmluZy5zaXplKCk7IH0KKyAgCisgIC8vLyBSZW51bWJlckJsb2NrcyAtIFRoaXMgZGlzY2FyZHMgYWxsIG9mIHRoZSBNYWNoaW5lQmFzaWNCbG9jayBudW1iZXJzIGFuZAorICAvLy8gcmVjb21wdXRlcyB0aGVtLiAgVGhpcyBndWFyYW50ZWVzIHRoYXQgdGhlIE1CQiBudW1iZXJzIGFyZSBzZXF1ZW50aWFsLAorICAvLy8gZGVuc2UsIGFuZCBtYXRjaCB0aGUgb3JkZXJpbmcgb2YgdGhlIGJsb2NrcyB3aXRoaW4gdGhlIGZ1bmN0aW9uLiAgSWYgYQorICAvLy8gc3BlY2lmaWMgTWFjaGluZUJhc2ljQmxvY2sgaXMgc3BlY2lmaWVkLCBvbmx5IHRoYXQgYmxvY2sgYW5kIHRob3NlIGFmdGVyCisgIC8vLyBpdCBhcmUgcmVudW1iZXJlZC4KKyAgdm9pZCBSZW51bWJlckJsb2NrcyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCRnJvbSA9IDApOworICAKKyAgLy8vIHByaW50IC0gUHJpbnQgb3V0IHRoZSBNYWNoaW5lRnVuY3Rpb24gaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRlYnVnZ2luZworICAvLy8gdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCisgIC8vLworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIHZpZXdDRkcgLSBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IGZvciB1c2UgZnJvbSB0aGUgZGVidWdnZXIuICBZb3UgY2FuIGp1c3QKKyAgLy8vIHNheSAnY2FsbCBGLT52aWV3Q0ZHKCknIGFuZCBhIGdob3N0dmlldyB3aW5kb3cgc2hvdWxkIHBvcCB1cCBmcm9tIHRoZQorICAvLy8gcHJvZ3JhbSwgZGlzcGxheWluZyB0aGUgQ0ZHIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHdpdGggdGhlIGNvZGUgZm9yIGVhY2gKKyAgLy8vIGJhc2ljIGJsb2NrIGluc2lkZS4gIFRoaXMgZGVwZW5kcyBvbiB0aGVyZSBiZWluZyBhICdkb3QnIGFuZCAnZ3YnIHByb2dyYW0KKyAgLy8vIGluIHlvdXIgcGF0aC4KKyAgLy8vCisgIHZvaWQgdmlld0NGRygpIGNvbnN0OworCisgIC8vLyB2aWV3Q0ZHT25seSAtIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIHVzZSBmcm9tIHRoZSBkZWJ1Z2dlci4gIEl0IHdvcmtzCisgIC8vLyBqdXN0IGxpa2Ugdmlld0NGRywgYnV0IGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGNvbnRlbnRzIG9mIGJhc2ljIGJsb2NrcworICAvLy8gaW50byB0aGUgbm9kZXMsIGp1c3QgdGhlIGxhYmVsLiAgSWYgeW91IGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIENGRworICAvLy8gdGhpcyBjYW4gbWFrZSB0aGUgZ3JhcGggc21hbGxlci4KKyAgLy8vCisgIHZvaWQgdmlld0NGR09ubHkoKSBjb25zdDsKKworICAvLy8gZHVtcCAtIFByaW50IHRoZSBjdXJyZW50IE1hY2hpbmVGdW5jdGlvbiB0byBjZXJyLCB1c2VmdWwgZm9yIGRlYnVnZ2VyIHVzZS4KKyAgLy8vCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyB2ZXJpZnkgLSBSdW4gdGhlIGN1cnJlbnQgTWFjaGluZUZ1bmN0aW9uIHRocm91Z2ggdGhlIG1hY2hpbmUgY29kZQorICAvLy8gdmVyaWZpZXIsIHVzZWZ1bCBmb3IgZGVidWdnZXIgdXNlLgorICB2b2lkIHZlcmlmeShQYXNzICpwPU5VTEwpIGNvbnN0OworCisgIC8vIFByb3ZpZGUgYWNjZXNzb3JzIGZvciB0aGUgTWFjaGluZUJhc2ljQmxvY2sgbGlzdC4uLgorICB0eXBlZGVmIEJhc2ljQmxvY2tMaXN0VHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgQmFzaWNCbG9ja0xpc3RUeXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworCisgIC8vLyBhZGRMaXZlSW4gLSBBZGQgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3RlciBhcyBhIGxpdmUtaW4gdmFsdWUgYW5kCisgIC8vLyBjcmVhdGUgYSBjb3JyZXNwb25kaW5nIHZpcnR1YWwgcmVnaXN0ZXIgZm9yIGl0LgorICB1bnNpZ25lZCBhZGRMaXZlSW4odW5zaWduZWQgUFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCYXNpY0Jsb2NrIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAgLy8KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgICBlbmQgICgpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVuZCgpOyAgIH0KKyAgY29uc3RfaXRlcmF0b3IgICAgICAgICAgIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW5kKCk7ICAgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgIHJiZWdpbigpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJiZWdpbigpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgIHJlbmQgICgpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJlbmQoKTsgICB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgIHJlbmQgICgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJlbmQoKTsgICB9CisKKyAgdW5zaWduZWQgICAgICAgICAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKUJhc2ljQmxvY2tzLnNpemUoKTt9CisgIGJvb2wgICAgICAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVtcHR5KCk7IH0KKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJmZyb250KCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZnJvbnQoKTsgfQorICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmZnJvbnQoKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5mcm9udCgpOyB9CisgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICYgYmFjaygpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJhY2soKTsgfQorICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmIGJhY2soKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iYWNrKCk7IH0KKworICB2b2lkIHB1c2hfYmFjayAoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeyBCYXNpY0Jsb2Nrcy5wdXNoX2JhY2sgKE1CQik7IH0KKyAgdm9pZCBwdXNoX2Zyb250KE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsgQmFzaWNCbG9ja3MucHVzaF9mcm9udChNQkIpOyB9CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIE1CQkksIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgICBCYXNpY0Jsb2Nrcy5pbnNlcnQoTUJCSSwgTUJCKTsKKyAgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBJbnNlcnRQdCwgaXRlcmF0b3IgTUJCSSkgeworICAgIEJhc2ljQmxvY2tzLnNwbGljZShJbnNlcnRQdCwgQmFzaWNCbG9ja3MsIE1CQkkpOworICB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIEluc2VydFB0LCBpdGVyYXRvciBNQkJJLCBpdGVyYXRvciBNQkJFKSB7CisgICAgQmFzaWNCbG9ja3Muc3BsaWNlKEluc2VydFB0LCBCYXNpY0Jsb2NrcywgTUJCSSwgTUJCRSk7CisgIH0KKworICB2b2lkIHJlbW92ZShpdGVyYXRvciBNQkJJKSB7CisgICAgQmFzaWNCbG9ja3MucmVtb3ZlKE1CQkkpOworICB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgTUJCSSkgeworICAgIEJhc2ljQmxvY2tzLmVyYXNlKE1CQkkpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEludGVybmFsIGZ1bmN0aW9ucyB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgbnVtYmVyIE1hY2hpbmVCYXNpY0Jsb2NrcworICAvLworCisgIC8vLyBnZXROZXh0TUJCTnVtYmVyIC0gUmV0dXJucyB0aGUgbmV4dCB1bmlxdWUgbnVtYmVyIHRvIGJlIGFzc2lnbmVkCisgIC8vLyB0byBhIE1hY2hpbmVCYXNpY0Jsb2NrIGluIHRoaXMgTWFjaGluZUZ1bmN0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgYWRkVG9NQkJOdW1iZXJpbmcoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICAgIE1CQk51bWJlcmluZy5wdXNoX2JhY2soTUJCKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKU1CQk51bWJlcmluZy5zaXplKCktMTsKKyAgfQorCisgIC8vLyByZW1vdmVGcm9tTUJCTnVtYmVyaW5nIC0gUmVtb3ZlIHRoZSBzcGVjaWZpYyBtYWNoaW5lIGJhc2ljIGJsb2NrIGZyb20gb3VyCisgIC8vLyB0cmFja2VyLCB0aGlzIGlzIG9ubHkgcmVhbGx5IHRvIGJlIHVzZWQgYnkgdGhlIE1hY2hpbmVCYXNpY0Jsb2NrCisgIC8vLyBpbXBsZW1lbnRhdGlvbi4KKyAgdm9pZCByZW1vdmVGcm9tTUJCTnVtYmVyaW5nKHVuc2lnbmVkIE4pIHsKKyAgICBhc3NlcnQoTiA8IE1CQk51bWJlcmluZy5zaXplKCkgJiYgIklsbGVnYWwgYmFzaWMgYmxvY2sgIyIpOworICAgIE1CQk51bWJlcmluZ1tOXSA9IDA7CisgIH0KKworICAvLy8gQ3JlYXRlTWFjaGluZUluc3RyIC0gQWxsb2NhdGUgYSBuZXcgTWFjaGluZUluc3RyLiBVc2UgdGhpcyBpbnN0ZWFkCisgIC8vLyBvZiBgbmV3IE1hY2hpbmVJbnN0cicuCisgIC8vLworICBNYWNoaW5lSW5zdHIgKkNyZWF0ZU1hY2hpbmVJbnN0cihjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9JbXAgPSBmYWxzZSk7CisKKyAgLy8vIENsb25lTWFjaGluZUluc3RyIC0gQ3JlYXRlIGEgbmV3IE1hY2hpbmVJbnN0ciB3aGljaCBpcyBhIGNvcHkgb2YgdGhlCisgIC8vLyAnT3JpZycgaW5zdHJ1Y3Rpb24sIGlkZW50aWNhbCBpbiBhbGwgd2F5cyBleGNlcHQgdGhlIGluc3RydWN0aW9uCisgIC8vLyBoYXMgbm8gcGFyZW50LCBwcmV2LCBvciBuZXh0LgorICAvLy8KKyAgLy8vIFNlZSBhbHNvIFRhcmdldEluc3RySW5mbzo6ZHVwbGljYXRlKCkgZm9yIHRhcmdldC1zcGVjaWZpYyBmaXhlcyB0byBjbG9uZWQKKyAgLy8vIGluc3RydWN0aW9ucy4KKyAgTWFjaGluZUluc3RyICpDbG9uZU1hY2hpbmVJbnN0cihjb25zdCBNYWNoaW5lSW5zdHIgKk9yaWcpOworCisgIC8vLyBEZWxldGVNYWNoaW5lSW5zdHIgLSBEZWxldGUgdGhlIGdpdmVuIE1hY2hpbmVJbnN0ci4KKyAgLy8vCisgIHZvaWQgRGVsZXRlTWFjaGluZUluc3RyKE1hY2hpbmVJbnN0ciAqTUkpOworCisgIC8vLyBDcmVhdGVNYWNoaW5lQmFzaWNCbG9jayAtIEFsbG9jYXRlIGEgbmV3IE1hY2hpbmVCYXNpY0Jsb2NrLiBVc2UgdGhpcworICAvLy8gaW5zdGVhZCBvZiBgbmV3IE1hY2hpbmVCYXNpY0Jsb2NrJy4KKyAgLy8vCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpDcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpiYiA9IDApOworCisgIC8vLyBEZWxldGVNYWNoaW5lQmFzaWNCbG9jayAtIERlbGV0ZSB0aGUgZ2l2ZW4gTWFjaGluZUJhc2ljQmxvY2suCisgIC8vLworICB2b2lkIERlbGV0ZU1hY2hpbmVCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworCisgIC8vLyBnZXRNYWNoaW5lTWVtT3BlcmFuZCAtIEFsbG9jYXRlIGEgbmV3IE1hY2hpbmVNZW1PcGVyYW5kLgorICAvLy8gTWFjaGluZU1lbU9wZXJhbmRzIGFyZSBvd25lZCBieSB0aGUgTWFjaGluZUZ1bmN0aW9uIGFuZCBuZWVkIG5vdCBiZQorICAvLy8gZXhwbGljaXRseSBkZWFsbG9jYXRlZC4KKyAgTWFjaGluZU1lbU9wZXJhbmQgKmdldE1hY2hpbmVNZW1PcGVyYW5kKGNvbnN0IFZhbHVlICp2LCB1bnNpZ25lZCBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvLCB1aW50NjRfdCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmFzZV9hbGlnbm1lbnQpOworCisgIC8vLyBnZXRNYWNoaW5lTWVtT3BlcmFuZCAtIEFsbG9jYXRlIGEgbmV3IE1hY2hpbmVNZW1PcGVyYW5kIGJ5IGNvcHlpbmcKKyAgLy8vIGFuIGV4aXN0aW5nIG9uZSwgYWRqdXN0aW5nIGJ5IGFuIG9mZnNldCBhbmQgdXNpbmcgdGhlIGdpdmVuIHNpemUuCisgIC8vLyBNYWNoaW5lTWVtT3BlcmFuZHMgYXJlIG93bmVkIGJ5IHRoZSBNYWNoaW5lRnVuY3Rpb24gYW5kIG5lZWQgbm90IGJlCisgIC8vLyBleHBsaWNpdGx5IGRlYWxsb2NhdGVkLgorICBNYWNoaW5lTWVtT3BlcmFuZCAqZ2V0TWFjaGluZU1lbU9wZXJhbmQoY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgKk1NTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBTaXplKTsKKworICAvLy8gYWxsb2NhdGVNZW1SZWZzQXJyYXkgLSBBbGxvY2F0ZSBhbiBhcnJheSB0byBob2xkIE1hY2hpbmVNZW1PcGVyYW5kCisgIC8vLyBwb2ludGVycy4gIFRoaXMgYXJyYXkgaXMgb3duZWQgYnkgdGhlIE1hY2hpbmVGdW5jdGlvbi4KKyAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgYWxsb2NhdGVNZW1SZWZzQXJyYXkodW5zaWduZWQgbG9uZyBOdW0pOworCisgIC8vLyBleHRyYWN0TG9hZE1lbVJlZnMgLSBBbGxvY2F0ZSBhbiBhcnJheSBhbmQgcG9wdWxhdGUgaXQgd2l0aCBqdXN0IHRoZQorICAvLy8gbG9hZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBNYWNoaW5lTWVtT3BlcmFuZCBzZXF1ZW5jZS4KKyAgc3RkOjpwYWlyPE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yLAorICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3I+CisgICAgZXh0cmFjdExvYWRNZW1SZWZzKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBFbmQpOworCisgIC8vLyBleHRyYWN0U3RvcmVNZW1SZWZzIC0gQWxsb2NhdGUgYW4gYXJyYXkgYW5kIHBvcHVsYXRlIGl0IHdpdGgganVzdCB0aGUKKyAgLy8vIHN0b3JlIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIE1hY2hpbmVNZW1PcGVyYW5kIHNlcXVlbmNlLgorICBzdGQ6OnBhaXI8TWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IsCisgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvcj4KKyAgICBleHRyYWN0U3RvcmVNZW1SZWZzKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgRW5kKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTGFiZWwgTWFuaXB1bGF0aW9uLgorICAvLworICAKKyAgLy8vIGdldEpUSVN5bWJvbCAtIFJldHVybiB0aGUgTUNTeW1ib2wgZm9yIHRoZSBzcGVjaWZpZWQgbm9uLWVtcHR5IGp1bXAgdGFibGUuCisgIC8vLyBJZiBpc0xpbmtlclByaXZhdGUgaXMgc3BlY2lmaWVkLCBhbiAnbCcgbGFiZWwgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBhCisgIC8vLyBub3JtYWwgJ0wnIGxhYmVsIGlzIHJldHVybmVkLgorICBNQ1N5bWJvbCAqZ2V0SlRJU3ltYm9sKHVuc2lnbmVkIEpUSSwgTUNDb250ZXh0ICZDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNMaW5rZXJQcml2YXRlID0gZmFsc2UpIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBHcmFwaFRyYWl0cyBzcGVjaWFsaXphdGlvbnMgZm9yIGZ1bmN0aW9uIGJhc2ljIGJsb2NrIGdyYXBocyAoQ0ZHcykKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEKKy8vIG1hY2hpbmUgZnVuY3Rpb24gYXMgYSBncmFwaCBvZiBtYWNoaW5lIGJhc2ljIGJsb2Nrcy4uLiB0aGVzZSBhcmUKKy8vIHRoZSBzYW1lIGFzIHRoZSBtYWNoaW5lIGJhc2ljIGJsb2NrIGl0ZXJhdG9ycywgZXhjZXB0IHRoYXQgdGhlIHJvb3QKKy8vIG5vZGUgaXMgaW1wbGljaXRseSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZnVuY3Rpb24uCisvLwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPE1hY2hpbmVGdW5jdGlvbio+IDoKKyAgcHVibGljIEdyYXBoVHJhaXRzPE1hY2hpbmVCYXNpY0Jsb2NrKj4geworICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShNYWNoaW5lRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gJkYtPmZyb250KCk7CisgIH0KKworICAvLyBub2Rlc19pdGVyYXRvci9iZWdpbi9lbmQgLSBBbGxvdyBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoCisgIHR5cGVkZWYgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBub2Rlc19pdGVyYXRvcjsKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKE1hY2hpbmVGdW5jdGlvbiAqRikgeyByZXR1cm4gRi0+YmVnaW4oKTsgfQorICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kICAoTWFjaGluZUZ1bmN0aW9uICpGKSB7IHJldHVybiBGLT5lbmQoKTsgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBNYWNoaW5lRnVuY3Rpb24qPiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayo+IHsKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuICZGLT5mcm9udCgpOworICB9CisKKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB0eXBlZGVmIE1hY2hpbmVGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3Igbm9kZXNfaXRlcmF0b3I7CisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gRi0+YmVnaW4oKTsKKyAgfQorICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kICAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIEYtPmVuZCgpOworICB9Cit9OworCisKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYSBmdW5jdGlvbiBhcyBhCisvLyBncmFwaCBvZiBiYXNpYyBibG9ja3MuLi4gYW5kIHRvIHdhbGsgaXQgaW4gaW52ZXJzZSBvcmRlci4gIEludmVyc2Ugb3JkZXIgZm9yCisvLyBhIGZ1bmN0aW9uIGlzIGNvbnNpZGVyZWQgdG8gYmUgd2hlbiB0cmF2ZXJzaW5nIHRoZSBwcmVkZWNlc3NvciBlZGdlcyBvZiBhIEJCCisvLyBpbnN0ZWFkIG9mIHRoZSBzdWNjZXNzb3IgZWRnZXMuCisvLwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8TWFjaGluZUZ1bmN0aW9uKj4gPiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxJbnZlcnNlPE1hY2hpbmVCYXNpY0Jsb2NrKj4gPiB7CisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKEludmVyc2U8TWFjaGluZUZ1bmN0aW9uKj4gRykgeworICAgIHJldHVybiAmRy5HcmFwaC0+ZnJvbnQoKTsKKyAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IE1hY2hpbmVGdW5jdGlvbio+ID4gOgorICBwdWJsaWMgR3JhcGhUcmFpdHM8SW52ZXJzZTxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayo+ID4geworICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShJbnZlcnNlPGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqPiBHKSB7CisgICAgcmV0dXJuICZHLkdyYXBoLT5mcm9udCgpOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbkFuYWx5c2lzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25BbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZGJhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25BbmFseXNpcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vPT09LS0gTWFjaGluZUZ1bmN0aW9uQW5hbHlzaXMuaCAtIE93bmVyIG9mIE1hY2hpbmVGdW5jdGlvbnMgLS0tLSotQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNYWNoaW5lRnVuY3Rpb25BbmFseXNpcyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FX0ZVTkNUSU9OX0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVfRlVOQ1RJT05fQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKworLy8vIE1hY2hpbmVGdW5jdGlvbkFuYWx5c2lzIC0gVGhpcyBjbGFzcyBpcyBhIFBhc3MgdGhhdCBtYW5hZ2VzIGEKKy8vLyBNYWNoaW5lRnVuY3Rpb24gb2JqZWN0Lgorc3RydWN0IE1hY2hpbmVGdW5jdGlvbkFuYWx5c2lzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7Citwcml2YXRlOgorICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKyAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWw7CisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIHVuc2lnbmVkIE5leHRGbk51bTsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIGV4cGxpY2l0IE1hY2hpbmVGdW5jdGlvbkFuYWx5c2lzKGNvbnN0IFRhcmdldE1hY2hpbmUgJnRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPTCA9IENvZGVHZW5PcHQ6OkRlZmF1bHQpOworICB+TWFjaGluZUZ1bmN0aW9uQW5hbHlzaXMoKTsKKworICBNYWNoaW5lRnVuY3Rpb24gJmdldE1GKCkgY29uc3QgeyByZXR1cm4gKk1GOyB9CisgIENvZGVHZW5PcHQ6OkxldmVsIGdldE9wdExldmVsKCkgY29uc3QgeyByZXR1cm4gT3B0TGV2ZWw7IH0KKworcHJpdmF0ZToKKyAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKTsKKyAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Q7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2JmMGEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09LS0gTWFjaGluZUZ1bmN0aW9uUGFzcy5oIC0gUGFzcyBmb3IgTWFjaGluZUZ1bmN0aW9ucyAtLS0tLS0tLSotQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1hY2hpbmVGdW5jdGlvblBhc3MgY2xhc3MuICBNYWNoaW5lRnVuY3Rpb25QYXNzJ3MgYXJlCisvLyBqdXN0IEZ1bmN0aW9uUGFzcydzLCBleGNlcHQgdGhleSBvcGVyYXRlIG9uIG1hY2hpbmUgY29kZSBhcyBwYXJ0IG9mIGEgY29kZQorLy8gZ2VuZXJhdG9yLiAgQmVjYXVzZSB0aGV5IG9wZXJhdGUgb24gbWFjaGluZSBjb2RlLCBub3QgdGhlIExMVk0KKy8vIHJlcHJlc2VudGF0aW9uLCBNYWNoaW5lRnVuY3Rpb25QYXNzJ3MgYXJlIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgTExWTQorLy8gcmVwcmVzZW50YXRpb24uICBEdWUgdG8gdGhpcyBsaW1pdGF0aW9uLCB0aGUgTWFjaGluZUZ1bmN0aW9uUGFzcyBjbGFzcyB0YWtlcworLy8gY2FyZSBvZiBkZWNsYXJpbmcgdGhhdCBubyBMTFZNIHBhc3NlcyBhcmUgaW52YWxpZGF0ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORV9GVU5DVElPTl9QQVNTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVfRlVOQ1RJT05fUEFTU19ICisKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisKKy8vLyBNYWNoaW5lRnVuY3Rpb25QYXNzIC0gVGhpcyBjbGFzcyBhZGFwdHMgdGhlIEZ1bmN0aW9uUGFzcyBpbnRlcmZhY2UgdG8KKy8vLyBhbGxvdyBjb252ZW5pZW50IGNyZWF0aW9uIG9mIHBhc3NlcyB0aGF0IG9wZXJhdGUgb24gdGhlIE1hY2hpbmVGdW5jdGlvbgorLy8vIHJlcHJlc2VudGF0aW9uLiBJbnN0ZWFkIG9mIG92ZXJyaWRpbmcgcnVuT25GdW5jdGlvbiwgc3ViY2xhc3NlcworLy8vIG92ZXJyaWRlIHJ1bk9uTWFjaGluZUZ1bmN0aW9uLgorY2xhc3MgTWFjaGluZUZ1bmN0aW9uUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworcHJvdGVjdGVkOgorICBleHBsaWNpdCBNYWNoaW5lRnVuY3Rpb25QYXNzKGNoYXIgJklEKSA6IEZ1bmN0aW9uUGFzcyhJRCkge30KKworICAvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24gLSBUaGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJsb2FkZWQgdG8gcGVyZm9ybSB0aGUKKyAgLy8vIGRlc2lyZWQgbWFjaGluZSBjb2RlIHRyYW5zZm9ybWF0aW9uIG9yIGFuYWx5c2lzLgorICAvLy8KKyAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpID0gMDsKKworICAvLy8gZ2V0QW5hbHlzaXNVc2FnZSAtIFN1YmNsYXNzZXMgdGhhdCBvdmVycmlkZSBnZXRBbmFseXNpc1VzYWdlCisgIC8vLyBtdXN0IGNhbGwgdGhpcy4KKyAgLy8vCisgIC8vLyBGb3IgTWFjaGluZUZ1bmN0aW9uUGFzc2VzLCBjYWxsaW5nIEFVLnByZXNlcnZlc0NGRygpIGluZGljYXRlcyB0aGF0CisgIC8vLyB0aGUgcGFzcyBkb2VzIG5vdCBtb2RpZnkgdGhlIE1hY2hpbmVCYXNpY0Jsb2NrIENGRy4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKworcHJpdmF0ZToKKyAgLy8vIGNyZWF0ZVByaW50ZXJQYXNzIC0gR2V0IGEgbWFjaGluZSBmdW5jdGlvbiBwcmludGVyIHBhc3MuCisgIHZpcnR1YWwgUGFzcyAqY3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNDU3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaApAQCAtMCwwICsxLDUxNSBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmggLSBNYWNoaW5lSW5zdHIgY2xhc3MgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNYWNoaW5lSW5zdHIgY2xhc3MsIHdoaWNoIGlzIHRoZQorLy8gYmFzaWMgcmVwcmVzZW50YXRpb24gZm9yIGFsbCB0YXJnZXQgZGVwZW5kZW50IG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHVzZWQgYnkKKy8vIHRoZSBiYWNrIGVuZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FSU5TVFJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RyRGVzYy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wY29kZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWdMb2MuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK2NsYXNzIEFsaWFzQW5hbHlzaXM7CitjbGFzcyBUYXJnZXRJbnN0ckRlc2M7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lTWVtT3BlcmFuZDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBNYWNoaW5lSW5zdHIgLSBSZXByZXNlbnRhdGlvbiBvZiBlYWNoIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisvLy8KK2NsYXNzIE1hY2hpbmVJbnN0ciA6IHB1YmxpYyBpbGlzdF9ub2RlPE1hY2hpbmVJbnN0cj4geworcHVibGljOgorICB0eXBlZGVmIE1hY2hpbmVNZW1PcGVyYW5kICoqbW1vX2l0ZXJhdG9yOworCisgIC8vLyBGbGFncyB0byBzcGVjaWZ5IGRpZmZlcmVudCBraW5kcyBvZiBjb21tZW50cyB0byBvdXRwdXQgaW4KKyAgLy8vIGFzc2VtYmx5IGNvZGUuICBUaGVzZSBmbGFncyBjYXJyeSBzZW1hbnRpYyBpbmZvcm1hdGlvbiBub3QKKyAgLy8vIG90aGVyd2lzZSBlYXNpbHkgZGVyaXZhYmxlIGZyb20gdGhlIElSIHRleHQuCisgIC8vLworICBlbnVtIENvbW1lbnRGbGFnIHsKKyAgICBSZWxvYWRSZXVzZSA9IDB4MQorICB9OworICAKK3ByaXZhdGU6CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAqVElEOyAgICAgICAgICAgLy8gSW5zdHJ1Y3Rpb24gZGVzY3JpcHRvci4KKyAgdW5zaWduZWQgc2hvcnQgTnVtSW1wbGljaXRPcHM7ICAgICAgICAvLyBOdW1iZXIgb2YgaW1wbGljaXQgb3BlcmFuZHMgKHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGRldGVybWluZWQgYXQgY29uc3RydWN0aW9uIHRpbWUpLgorCisgIHVuc2lnbmVkIHNob3J0IEFzbVByaW50ZXJGbGFnczsgICAgICAgLy8gVmFyaW91cyBiaXRzIG9mIGluZm9ybWF0aW9uIHVzZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgQXNtUHJpbnRlciB0byBlbWl0IGhlbHBmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tZW50cy4gIFRoaXMgaXMgKm5vdCogc2VtYW50aWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbi4gIERvIG5vdCB1c2UgdGhpcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnl0aGluZyBvdGhlciB0aGFuIHRvIGNvbnZleSBjb21tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gdG8gQXNtUHJpbnRlci4KKworICBzdGQ6OnZlY3RvcjxNYWNoaW5lT3BlcmFuZD4gT3BlcmFuZHM7IC8vIHRoZSBvcGVyYW5kcworICBtbW9faXRlcmF0b3IgTWVtUmVmczsgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIG9uIG1lbW9yeSByZWZlcmVuY2VzCisgIG1tb19pdGVyYXRvciBNZW1SZWZzRW5kOworICBNYWNoaW5lQmFzaWNCbG9jayAqUGFyZW50OyAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIG93bmluZyBiYXNpYyBibG9jay4KKyAgRGVidWdMb2MgZGVidWdMb2M7ICAgICAgICAgICAgICAgICAgICAvLyBTb3VyY2UgbGluZSBpbmZvcm1hdGlvbi4KKworICAvLyBPcGVyYW5kQ29tcGxldGUgLSBSZXR1cm4gdHJ1ZSBpZiBpdCdzIGlsbGVnYWwgdG8gYWRkIGEgbmV3IG9wZXJhbmQKKyAgYm9vbCBPcGVyYW5kc0NvbXBsZXRlKCkgY29uc3Q7CisKKyAgTWFjaGluZUluc3RyKGNvbnN0IE1hY2hpbmVJbnN0ciYpOyAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWFjaGluZUluc3RyJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKworICAvLyBJbnRydXNpdmUgbGlzdCBzdXBwb3J0CisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3RfdHJhaXRzPE1hY2hpbmVJbnN0cj47CisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3RfdHJhaXRzPE1hY2hpbmVCYXNpY0Jsb2NrPjsKKyAgdm9pZCBzZXRQYXJlbnQoTWFjaGluZUJhc2ljQmxvY2sgKlApIHsgUGFyZW50ID0gUDsgfQorCisgIC8vLyBNYWNoaW5lSW5zdHIgY3RvciAtIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIGNvcHkgb2YgdGhlIGdpdmVuCisgIC8vLyBNYWNoaW5lSW5zdHIgaW4gdGhlIGdpdmVuIE1hY2hpbmVGdW5jdGlvbi4KKyAgTWFjaGluZUluc3RyKE1hY2hpbmVGdW5jdGlvbiAmLCBjb25zdCBNYWNoaW5lSW5zdHIgJik7CisKKyAgLy8vIE1hY2hpbmVJbnN0ciBjdG9yIC0gVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgZHVtbXkgTWFjaGluZUluc3RyIHdpdGgKKyAgLy8vIFRJRCBOVUxMIGFuZCBubyBvcGVyYW5kcy4KKyAgTWFjaGluZUluc3RyKCk7CisKKyAgLy8gVGhlIG5leHQgdHdvIGNvbnN0cnVjdG9ycyBoYXZlIERlYnVnTG9jIGFuZCBub24tRGVidWdMb2MgdmVyc2lvbnM7CisgIC8vIG92ZXIgdGltZSwgdGhlIG5vbi1EZWJ1Z0xvYyB2ZXJzaW9ucyBzaG91bGQgYmUgcGhhc2VkIG91dCBhbmQgZXZlbnR1YWxseQorICAvLyByZW1vdmVkLgorCisgIC8vLyBNYWNoaW5lSW5zdHIgY3RvciAtIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIE1hY2hpbmVJbnN0ciBhbmQgYWRkcyB0aGUKKyAgLy8vIGltcGxpY2l0IG9wZXJhbmRzLiAgSXQgcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgc3BlY2lmaWVkCisgIC8vLyBieSB0aGUgVGFyZ2V0SW5zdHJEZXNjLiAgVGhlIHZlcnNpb24gd2l0aCBhIERlYnVnTG9jIHNob3VsZCBiZSBwcmVmZXJyZWQuCisgIGV4cGxpY2l0IE1hY2hpbmVJbnN0cihjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCwgYm9vbCBOb0ltcCA9IGZhbHNlKTsKKworICAvLy8gTWFjaGluZUluc3RyIGN0b3IgLSBXb3JrIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGN0b3IgYWJvdmUsIGV4Y2VwdCB0aGF0CisgIC8vLyB0aGUgTWFjaGluZUluc3RyIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBiYXNpYworICAvLy8gYmxvY2suICBUaGUgdmVyc2lvbiB3aXRoIGEgRGVidWdMb2Mgc2hvdWxkIGJlIHByZWZlcnJlZC4KKyAgTWFjaGluZUluc3RyKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEKTsKKworICAvLy8gTWFjaGluZUluc3RyIGN0b3IgLSBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZSBhIE1hY2hpbmVJbnN0ciBhbmQgYWRkIHRoZQorICAvLy8gaW1wbGljaXQgb3BlcmFuZHMuICBJdCByZXNlcnZlcyBzcGFjZSBmb3IgbnVtYmVyIG9mIG9wZXJhbmRzIHNwZWNpZmllZCBieQorICAvLy8gVGFyZ2V0SW5zdHJEZXNjLiAgQW4gZXhwbGljaXQgRGVidWdMb2MgaXMgc3VwcGxpZWQuCisgIGV4cGxpY2l0IE1hY2hpbmVJbnN0cihjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCwgY29uc3QgRGVidWdMb2MgZGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb0ltcCA9IGZhbHNlKTsKKworICAvLy8gTWFjaGluZUluc3RyIGN0b3IgLSBXb3JrIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGN0b3IgYWJvdmUsIGV4Y2VwdCB0aGF0CisgIC8vLyB0aGUgTWFjaGluZUluc3RyIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBiYXNpYworICAvLy8gYmxvY2suCisgIE1hY2hpbmVJbnN0cihNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCBjb25zdCBEZWJ1Z0xvYyBkbCwgCisgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCk7CisKKyAgfk1hY2hpbmVJbnN0cigpOworCisgIC8vIE1hY2hpbmVJbnN0cnMgYXJlIHBvb2wtYWxsb2NhdGVkIGFuZCBvd25lZCBieSBNYWNoaW5lRnVuY3Rpb24uCisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisKK3B1YmxpYzoKKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqIGdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorICBNYWNoaW5lQmFzaWNCbG9jayogZ2V0UGFyZW50KCkgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8vIGdldEFzbVByaW50ZXJGbGFncyAtIFJldHVybiB0aGUgYXNtIHByaW50ZXIgZmxhZ3MgYml0dmVjdG9yLgorICAvLy8KKyAgdW5zaWduZWQgc2hvcnQgZ2V0QXNtUHJpbnRlckZsYWdzKCkgY29uc3QgeyByZXR1cm4gQXNtUHJpbnRlckZsYWdzOyB9CisKKyAgLy8vIGdldEFzbVByaW50ZXJGbGFnIC0gUmV0dXJuIHdoZXRoZXIgYW4gQXNtUHJpbnRlciBmbGFnIGlzIHNldC4KKyAgLy8vCisgIGJvb2wgZ2V0QXNtUHJpbnRlckZsYWcoQ29tbWVudEZsYWcgRmxhZykgY29uc3QgeworICAgIHJldHVybiBBc21QcmludGVyRmxhZ3MgJiBGbGFnOworICB9CisKKyAgLy8vIHNldEFzbVByaW50ZXJGbGFnIC0gU2V0IGEgZmxhZyBmb3IgdGhlIEFzbVByaW50ZXIuCisgIC8vLworICB2b2lkIHNldEFzbVByaW50ZXJGbGFnKENvbW1lbnRGbGFnIEZsYWcpIHsKKyAgICBBc21QcmludGVyRmxhZ3MgfD0gKHVuc2lnbmVkIHNob3J0KUZsYWc7CisgIH0KKworICAvLy8gZ2V0RGVidWdMb2MgLSBSZXR1cm5zIHRoZSBkZWJ1ZyBsb2NhdGlvbiBpZCBvZiB0aGlzIE1hY2hpbmVJbnN0ci4KKyAgLy8vCisgIERlYnVnTG9jIGdldERlYnVnTG9jKCkgY29uc3QgeyByZXR1cm4gZGVidWdMb2M7IH0KKyAgCisgIC8vLyBnZXREZXNjIC0gUmV0dXJucyB0aGUgdGFyZ2V0IGluc3RydWN0aW9uIGRlc2NyaXB0b3Igb2YgdGhpcworICAvLy8gTWFjaGluZUluc3RyLgorICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJmdldERlc2MoKSBjb25zdCB7IHJldHVybiAqVElEOyB9CisKKyAgLy8vIGdldE9wY29kZSAtIFJldHVybnMgdGhlIG9wY29kZSBvZiB0aGlzIE1hY2hpbmVJbnN0ci4KKyAgLy8vCisgIGludCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBUSUQtPk9wY29kZTsgfQorCisgIC8vLyBBY2Nlc3MgdG8gZXhwbGljaXQgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpT3BlcmFuZHMuc2l6ZSgpOyB9CisKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQmIGdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgZ2V0TnVtT3BlcmFuZHMoKSAmJiAiZ2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gT3BlcmFuZHNbaV07CisgIH0KKyAgTWFjaGluZU9wZXJhbmQmIGdldE9wZXJhbmQodW5zaWduZWQgaSkgeworICAgIGFzc2VydChpIDwgZ2V0TnVtT3BlcmFuZHMoKSAmJiAiZ2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gT3BlcmFuZHNbaV07CisgIH0KKworICAvLy8gZ2V0TnVtRXhwbGljaXRPcGVyYW5kcyAtIFJldHVybnMgdGhlIG51bWJlciBvZiBub24taW1wbGljaXQgb3BlcmFuZHMuCisgIC8vLworICB1bnNpZ25lZCBnZXROdW1FeHBsaWNpdE9wZXJhbmRzKCkgY29uc3Q7CisgIAorICAvLy8gQWNjZXNzIHRvIG1lbW9yeSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgbW1vX2l0ZXJhdG9yIG1lbW9wZXJhbmRzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gTWVtUmVmczsgfQorICBtbW9faXRlcmF0b3IgbWVtb3BlcmFuZHNfZW5kKCkgY29uc3QgeyByZXR1cm4gTWVtUmVmc0VuZDsgfQorICBib29sIG1lbW9wZXJhbmRzX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTWVtUmVmc0VuZCA9PSBNZW1SZWZzOyB9CisKKyAgLy8vIGhhc09uZU1lbU9wZXJhbmQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBleGFjdGx5IG9uZQorICAvLy8gTWFjaGluZU1lbU9wZXJhbmQuCisgIGJvb2wgaGFzT25lTWVtT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTWVtUmVmc0VuZCAtIE1lbVJlZnMgPT0gMTsKKyAgfQorCisgIGVudW0gTUlDaGVja1R5cGUgeworICAgIENoZWNrRGVmcywgICAgICAvLyBDaGVjayBhbGwgb3BlcmFuZHMgZm9yIGVxdWFsaXR5CisgICAgSWdub3JlRGVmcywgICAgIC8vIElnbm9yZSBhbGwgZGVmaW5pdGlvbnMKKyAgICBJZ25vcmVWUmVnRGVmcyAgLy8gSWdub3JlIHZpcnR1YWwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAgfTsKKworICAvLy8gaXNJZGVudGljYWxUbyAtIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgaWRlbnRpY2FsIHRvIChzYW1lCisgIC8vLyBvcGNvZGUgYW5kIHNhbWUgb3BlcmFuZHMgYXMpIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNJZGVudGljYWxUbyhjb25zdCBNYWNoaW5lSW5zdHIgKk90aGVyLAorICAgICAgICAgICAgICAgICAgICAgTUlDaGVja1R5cGUgQ2hlY2sgPSBDaGVja0RlZnMpIGNvbnN0OworCisgIC8vLyByZW1vdmVGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBiYXNpYworICAvLy8gYmxvY2ssIGFuZCByZXR1cm5zIGl0LCBidXQgZG9lcyBub3QgZGVsZXRlIGl0LgorICBNYWNoaW5lSW5zdHIgKnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgCisgIC8vLyBlcmFzZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGJhc2ljCisgIC8vLyBibG9jayBhbmQgZGVsZXRlcyBpdC4KKyAgdm9pZCBlcmFzZUZyb21QYXJlbnQoKTsKKworICAvLy8gaXNMYWJlbCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgTWFjaGluZUluc3RyIHJlcHJlc2VudHMgYSBsYWJlbC4KKyAgLy8vCisgIGJvb2wgaXNMYWJlbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpQUk9MT0dfTEFCRUwgfHwKKyAgICAgICAgICAgZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpFSF9MQUJFTCB8fAorICAgICAgICAgICBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkdDX0xBQkVMOworICB9CisgIAorICBib29sIGlzUHJvbG9nTGFiZWwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6UFJPTE9HX0xBQkVMOworICB9CisgIGJvb2wgaXNFSExhYmVsKCkgY29uc3QgeyByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpFSF9MQUJFTDsgfQorICBib29sIGlzR0NMYWJlbCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6R0NfTEFCRUw7IH0KKyAgYm9vbCBpc0RlYnVnVmFsdWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkRCR19WQUxVRTsgfQorICAKKyAgYm9vbCBpc1BISSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6UEhJOyB9CisgIGJvb2wgaXNLaWxsKCkgY29uc3QgeyByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpLSUxMOyB9CisgIGJvb2wgaXNJbXBsaWNpdERlZigpIGNvbnN0IHsgcmV0dXJuIGdldE9wY29kZSgpPT1UYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRjsgfQorICBib29sIGlzSW5zZXJ0U3VicmVnKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OklOU0VSVF9TVUJSRUc7CisgIH0KKyAgYm9vbCBpc1N1YnJlZ1RvUmVnKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OlNVQlJFR19UT19SRUc7CisgIH0KKyAgYm9vbCBpc1JlZ1NlcXVlbmNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OlJFR19TRVFVRU5DRTsKKyAgfQorICBib29sIGlzQ29weSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpDT1BZOworICB9CisKKyAgLy8vIGlzQ29weUxpa2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gYmVoYXZlcyBsaWtlIGEgY29weS4KKyAgLy8vIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBuYXRpdmUgY29weSBpbnN0cnVjdGlvbnMuCisgIGJvb2wgaXNDb3B5TGlrZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDb3B5KCkgfHwgaXNTdWJyZWdUb1JlZygpOworICB9CisKKyAgLy8vIGlzSWRlbnRpdHlDb3B5IC0gUmV0dXJuIHRydWUgaXMgdGhlIGluc3RydWN0aW9uIGlzIGFuIGlkZW50aXR5IGNvcHkuCisgIGJvb2wgaXNJZGVudGl0eUNvcHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ29weSgpICYmIGdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgPT0gZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKSAmJgorICAgICAgZ2V0T3BlcmFuZCgwKS5nZXRTdWJSZWcoKSA9PSBnZXRPcGVyYW5kKDEpLmdldFN1YlJlZygpOworICB9CisKKyAgLy8vIHJlYWRzUmVnaXN0ZXIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgTWFjaGluZUluc3RyIHJlYWRzIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyLiBJZiBUYXJnZXRSZWdpc3RlckluZm8gaXMgcGFzc2VkLCB0aGVuIGl0IGFsc28gY2hlY2tzIGlmIHRoZXJlCisgIC8vLyBpcyBhIHJlYWQgb2YgYSBzdXBlci1yZWdpc3Rlci4KKyAgLy8vIFRoaXMgZG9lcyBub3QgY291bnQgcGFydGlhbCByZWRlZmluZXMgb2YgdmlydHVhbCByZWdpc3RlcnMgYXMgcmVhZHM6CisgIC8vLyAgICVyZWcxMDI0OjYgPSBPUC4KKyAgYm9vbCByZWFkc1JlZ2lzdGVyKHVuc2lnbmVkIFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBOVUxMKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgoUmVnLCBmYWxzZSwgVFJJKSAhPSAtMTsKKyAgfQorCisgIC8vLyByZWFkc1ZpcnR1YWxSZWdpc3RlciAtIFJldHVybiB0cnVlIGlmIHRoZSBNYWNoaW5lSW5zdHIgcmVhZHMgdGhlIHNwZWNpZmllZAorICAvLy8gdmlydHVhbCByZWdpc3Rlci4gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBhIHBhcnRpYWwgZGVmaW5lIGlzIGEKKyAgLy8vIHJlYWQtbW9kaWZ5LXdyaXRlIG9wZXJhdGlvbi4KKyAgYm9vbCByZWFkc1ZpcnR1YWxSZWdpc3Rlcih1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVhZHNXcml0ZXNWaXJ0dWFsUmVnaXN0ZXIoUmVnKS5maXJzdDsKKyAgfQorCisgIC8vLyByZWFkc1dyaXRlc1ZpcnR1YWxSZWdpc3RlciAtIFJldHVybiBhIHBhaXIgb2YgYm9vbHMgKHJlYWRzLCB3cml0ZXMpCisgIC8vLyBpbmRpY2F0aW5nIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gcmVhZHMgb3Igd3JpdGVzIFJlZy4gVGhpcyBhbHNvIGNvbnNpZGVycworICAvLy8gcGFydGlhbCBkZWZpbmVzLgorICAvLy8gSWYgT3BzIGlzIG5vdCBudWxsLCBhbGwgb3BlcmFuZCBpbmRpY2VzIGZvciBSZWcgYXJlIGFkZGVkLgorICBzdGQ6OnBhaXI8Ym9vbCxib29sPiByZWFkc1dyaXRlc1ZpcnR1YWxSZWdpc3Rlcih1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gKk9wcyA9IDApIGNvbnN0OworCisgIC8vLyBraWxsc1JlZ2lzdGVyIC0gUmV0dXJuIHRydWUgaWYgdGhlIE1hY2hpbmVJbnN0ciBraWxscyB0aGUgc3BlY2lmaWVkCisgIC8vLyByZWdpc3Rlci4gSWYgVGFyZ2V0UmVnaXN0ZXJJbmZvIGlzIHBhc3NlZCwgdGhlbiBpdCBhbHNvIGNoZWNrcyBpZiB0aGVyZSBpcworICAvLy8gYSBraWxsIG9mIGEgc3VwZXItcmVnaXN0ZXIuCisgIGJvb2wga2lsbHNSZWdpc3Rlcih1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gTlVMTCkgY29uc3QgeworICAgIHJldHVybiBmaW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KFJlZywgdHJ1ZSwgVFJJKSAhPSAtMTsKKyAgfQorCisgIC8vLyBkZWZpbmVzUmVnaXN0ZXIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgTWFjaGluZUluc3RyIGZ1bGx5IGRlZmluZXMgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIuIElmIFRhcmdldFJlZ2lzdGVySW5mbyBpcyBwYXNzZWQsIHRoZW4gaXQgYWxzbyBjaGVja3MKKyAgLy8vIGlmIHRoZXJlIGlzIGEgZGVmIG9mIGEgc3VwZXItcmVnaXN0ZXIuCisgIC8vLyBOT1RFOiBJdCdzIGlnbm9yaW5nIHN1YnJlZyBpbmRpY2VzIG9uIHZpcnR1YWwgcmVnaXN0ZXJzLgorICBib29sIGRlZmluZXNSZWdpc3Rlcih1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJPU5VTEwpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeChSZWcsIGZhbHNlLCBmYWxzZSwgVFJJKSAhPSAtMTsKKyAgfQorCisgIC8vLyBtb2RpZmllc1JlZ2lzdGVyIC0gUmV0dXJuIHRydWUgaWYgdGhlIE1hY2hpbmVJbnN0ciBtb2RpZmllcyAoZnVsbHkgZGVmaW5lCisgIC8vLyBvciBwYXJ0aWFsbHkgZGVmaW5lKSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICAvLy8gTk9URTogSXQncyBpZ25vcmluZyBzdWJyZWcgaW5kaWNlcyBvbiB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgYm9vbCBtb2RpZmllc1JlZ2lzdGVyKHVuc2lnbmVkIFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeChSZWcsIGZhbHNlLCB0cnVlLCBUUkkpICE9IC0xOworICB9CisKKyAgLy8vIHJlZ2lzdGVyRGVmSXNEZWFkIC0gUmV0dXJucyB0cnVlIGlmIHRoZSByZWdpc3RlciBpcyBkZWFkIGluIHRoaXMgbWFjaGluZQorICAvLy8gaW5zdHJ1Y3Rpb24uIElmIFRhcmdldFJlZ2lzdGVySW5mbyBpcyBwYXNzZWQsIHRoZW4gaXQgYWxzbyBjaGVja3MKKyAgLy8vIGlmIHRoZXJlIGlzIGEgZGVhZCBkZWYgb2YgYSBzdXBlci1yZWdpc3Rlci4KKyAgYm9vbCByZWdpc3RlckRlZklzRGVhZCh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBOVUxMKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgoUmVnLCB0cnVlLCBmYWxzZSwgVFJJKSAhPSAtMTsKKyAgfQorCisgIC8vLyBmaW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KCkgLSBSZXR1cm5zIHRoZSBvcGVyYW5kIGluZGV4IHRoYXQgaXMgYSB1c2Ugb2YKKyAgLy8vIHRoZSBzcGVjaWZpYyByZWdpc3RlciBvciAtMSBpZiBpdCBpcyBub3QgZm91bmQuIEl0IGZ1cnRoZXIgdGlnaHRlbnMKKyAgLy8vIHRoZSBzZWFyY2ggY3JpdGVyaWEgdG8gYSB1c2UgdGhhdCBraWxscyB0aGUgcmVnaXN0ZXIgaWYgaXNLaWxsIGlzIHRydWUuCisgIGludCBmaW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KHVuc2lnbmVkIFJlZywgYm9vbCBpc0tpbGwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBOVUxMKSBjb25zdDsKKworICAvLy8gZmluZFJlZ2lzdGVyVXNlT3BlcmFuZCAtIFdyYXBwZXIgZm9yIGZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgsIGl0IHJldHVybnMKKyAgLy8vIGEgcG9pbnRlciB0byB0aGUgTWFjaGluZU9wZXJhbmQgcmF0aGVyIHRoYW4gYW4gaW5kZXguCisgIE1hY2hpbmVPcGVyYW5kICpmaW5kUmVnaXN0ZXJVc2VPcGVyYW5kKHVuc2lnbmVkIFJlZywgYm9vbCBpc0tpbGwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBOVUxMKSB7CisgICAgaW50IElkeCA9IGZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgoUmVnLCBpc0tpbGwsIFRSSSk7CisgICAgcmV0dXJuIChJZHggPT0gLTEpID8gTlVMTCA6ICZnZXRPcGVyYW5kKElkeCk7CisgIH0KKyAgCisgIC8vLyBmaW5kUmVnaXN0ZXJEZWZPcGVyYW5kSWR4KCkgLSBSZXR1cm5zIHRoZSBvcGVyYW5kIGluZGV4IHRoYXQgaXMgYSBkZWYgb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgb3IgLTEgaWYgaXQgaXMgbm90IGZvdW5kLiBJZiBpc0RlYWQgaXMgdHJ1ZSwgZGVmcworICAvLy8gdGhhdCBhcmUgbm90IGRlYWQgYXJlIHNraXBwZWQuIElmIE92ZXJsYXAgaXMgdHJ1ZSwgdGhlbiBpdCBhbHNvIGxvb2tzIGZvcgorICAvLy8gZGVmcyB0aGF0IG1lcmVseSBvdmVybGFwIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuIElmIFRhcmdldFJlZ2lzdGVySW5mbyBpcworICAvLy8gbm9uLW51bGwsIHRoZW4gaXQgYWxzbyBjaGVja3MgaWYgdGhlcmUgaXMgYSBkZWYgb2YgYSBzdXBlci1yZWdpc3Rlci4KKyAgaW50IGZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGVhZCA9IGZhbHNlLCBib29sIE92ZXJsYXAgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBOVUxMKSBjb25zdDsKKworICAvLy8gZmluZFJlZ2lzdGVyRGVmT3BlcmFuZCAtIFdyYXBwZXIgZm9yIGZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgsIGl0IHJldHVybnMKKyAgLy8vIGEgcG9pbnRlciB0byB0aGUgTWFjaGluZU9wZXJhbmQgcmF0aGVyIHRoYW4gYW4gaW5kZXguCisgIE1hY2hpbmVPcGVyYW5kICpmaW5kUmVnaXN0ZXJEZWZPcGVyYW5kKHVuc2lnbmVkIFJlZywgYm9vbCBpc0RlYWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBOVUxMKSB7CisgICAgaW50IElkeCA9IGZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgoUmVnLCBpc0RlYWQsIGZhbHNlLCBUUkkpOworICAgIHJldHVybiAoSWR4ID09IC0xKSA/IE5VTEwgOiAmZ2V0T3BlcmFuZChJZHgpOworICB9CisKKyAgLy8vIGZpbmRGaXJzdFByZWRPcGVyYW5kSWR4KCkgLSBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb3BlcmFuZCBpbiB0aGUKKyAgLy8vIG9wZXJhbmQgbGlzdCB0aGF0IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcmVkaWNhdGUuIEl0IHJldHVybnMgLTEgaWYKKyAgLy8vIG5vbmUgaXMgZm91bmQuCisgIGludCBmaW5kRmlyc3RQcmVkT3BlcmFuZElkeCgpIGNvbnN0OworICAKKyAgLy8vIGlzUmVnVGllZFRvVXNlT3BlcmFuZCAtIEdpdmVuIHRoZSBpbmRleCBvZiBhIHJlZ2lzdGVyIGRlZiBvcGVyYW5kLAorICAvLy8gY2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGRlZiBpcyB0aWVkIHRvIGEgc291cmNlIG9wZXJhbmQsIGR1ZSB0byBlaXRoZXIKKyAgLy8vIHR3by1hZGRyZXNzIGVsaW1pbmF0aW9uIG9yIGlubGluZSBhc3NlbWJseSBjb25zdHJhaW50cy4gUmV0dXJucyB0aGUKKyAgLy8vIGZpcnN0IHRpZWQgdXNlIG9wZXJhbmQgaW5kZXggYnkgcmVmZXJlbmNlIGlzIFVzZU9wSWR4IGlzIG5vdCBudWxsLgorICBib29sIGlzUmVnVGllZFRvVXNlT3BlcmFuZCh1bnNpZ25lZCBEZWZPcElkeCwgdW5zaWduZWQgKlVzZU9wSWR4ID0gMCkgY29uc3Q7CisKKyAgLy8vIGlzUmVnVGllZFRvRGVmT3BlcmFuZCAtIFJldHVybiB0cnVlIGlmIHRoZSB1c2Ugb3BlcmFuZCBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBpbmRleCBpcyB0aWVkIHRvIGFuIGRlZiBvcGVyYW5kLiBJdCBhbHNvIHJldHVybnMgdGhlIGRlZiBvcGVyYW5kIGluZGV4IGJ5CisgIC8vLyByZWZlcmVuY2UgaWYgRGVmT3BJZHggaXMgbm90IG51bGwuCisgIGJvb2wgaXNSZWdUaWVkVG9EZWZPcGVyYW5kKHVuc2lnbmVkIFVzZU9wSWR4LCB1bnNpZ25lZCAqRGVmT3BJZHggPSAwKSBjb25zdDsKKworICAvLy8gY2xlYXJLaWxsSW5mbyAtIENsZWFycyBraWxsIGZsYWdzIG9uIGFsbCBvcGVyYW5kcy4KKyAgLy8vCisgIHZvaWQgY2xlYXJLaWxsSW5mbygpOworCisgIC8vLyBjb3B5S2lsbERlYWRJbmZvIC0gQ29waWVzIGtpbGwgLyBkZWFkIG9wZXJhbmQgcHJvcGVydGllcyBmcm9tIE1JLgorICAvLy8KKyAgdm9pZCBjb3B5S2lsbERlYWRJbmZvKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworCisgIC8vLyBjb3B5UHJlZGljYXRlcyAtIENvcGllcyBwcmVkaWNhdGUgb3BlcmFuZChzKSBmcm9tIE1JLgorICB2b2lkIGNvcHlQcmVkaWNhdGVzKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworCisgIC8vLyBzdWJzdGl0dXRlUmVnaXN0ZXIgLSBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBGcm9tUmVnIHdpdGggVG9SZWc6U3ViSWR4LAorICAvLy8gcHJvcGVybHkgY29tcG9zaW5nIHN1YnJlZyBpbmRpY2VzIHdoZXJlIG5lY2Vzc2FyeS4KKyAgdm9pZCBzdWJzdGl0dXRlUmVnaXN0ZXIodW5zaWduZWQgRnJvbVJlZywgdW5zaWduZWQgVG9SZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZSZWdJbmZvKTsKKworICAvLy8gYWRkUmVnaXN0ZXJLaWxsZWQgLSBXZSBoYXZlIGRldGVybWluZWQgTUkga2lsbHMgYSByZWdpc3Rlci4gTG9vayBmb3IgdGhlCisgIC8vLyBvcGVyYW5kIHRoYXQgdXNlcyBpdCBhbmQgbWFyayBpdCBhcyBJc0tpbGwuIElmIEFkZElmTm90Rm91bmQgaXMgdHJ1ZSwKKyAgLy8vIGFkZCBhIGltcGxpY2l0IG9wZXJhbmQgaWYgaXQncyBub3QgZm91bmQuIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3BlcmFuZAorICAvLy8gZXhpc3RzIC8gaXMgYWRkZWQuCisgIGJvb2wgYWRkUmVnaXN0ZXJLaWxsZWQodW5zaWduZWQgSW5jb21pbmdSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSZWdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkSWZOb3RGb3VuZCA9IGZhbHNlKTsKKworICAvLy8gYWRkUmVnaXN0ZXJEZWFkIC0gV2UgaGF2ZSBkZXRlcm1pbmVkIE1JIGRlZmluZWQgYSByZWdpc3RlciB3aXRob3V0IGEgdXNlLgorICAvLy8gTG9vayBmb3IgdGhlIG9wZXJhbmQgdGhhdCBkZWZpbmVzIGl0IGFuZCBtYXJrIGl0IGFzIElzRGVhZC4gSWYKKyAgLy8vIEFkZElmTm90Rm91bmQgaXMgdHJ1ZSwgYWRkIGEgaW1wbGljaXQgb3BlcmFuZCBpZiBpdCdzIG5vdCBmb3VuZC4gUmV0dXJucworICAvLy8gdHJ1ZSBpZiB0aGUgb3BlcmFuZCBleGlzdHMgLyBpcyBhZGRlZC4KKyAgYm9vbCBhZGRSZWdpc3RlckRlYWQodW5zaWduZWQgSW5jb21pbmdSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUmVnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRJZk5vdEZvdW5kID0gZmFsc2UpOworCisgIC8vLyBhZGRSZWdpc3RlckRlZmluZWQgLSBXZSBoYXZlIGRldGVybWluZWQgTUkgZGVmaW5lcyBhIHJlZ2lzdGVyLiBNYWtlIHN1cmUKKyAgLy8vIHRoZXJlIGlzIGFuIG9wZXJhbmQgZGVmaW5pbmcgUmVnLgorICB2b2lkIGFkZFJlZ2lzdGVyRGVmaW5lZCh1bnNpZ25lZCBJbmNvbWluZ1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSZWdJbmZvID0gMCk7CisKKyAgLy8vIHNldFBoeXNSZWdzRGVhZEV4Y2VwdCAtIE1hcmsgZXZlcnkgcGh5c3JlZyB1c2VkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24gYXMgZGVhZAorICAvLy8gZXhjZXB0IHRob3NlIGluIHRoZSBVc2VkUmVncyBsaXN0LgorICB2b2lkIHNldFBoeXNSZWdzRGVhZEV4Y2VwdChjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZVc2VkUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpOworCisgIC8vLyBpc1NhZmVUb01vdmUgLSBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBzYWZlIHRvIG1vdmUgdGhpcyBpbnN0cnVjdGlvbi4gSWYKKyAgLy8vIFNhd1N0b3JlIGlzIHNldCB0byB0cnVlLCBpdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgc3RvcmUgKG9yIGNhbGwpIGJldHdlZW4KKyAgLy8vIHRoZSBpbnN0cnVjdGlvbidzIGxvY2F0aW9uIGFuZCBpdHMgaW50ZW5kZWQgZGVzdGluYXRpb24uCisgIGJvb2wgaXNTYWZlVG9Nb3ZlKGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLCBBbGlhc0FuYWx5c2lzICpBQSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAmU2F3U3RvcmUpIGNvbnN0OworCisgIC8vLyBpc1NhZmVUb1JlTWF0IC0gUmV0dXJuIHRydWUgaWYgaXQncyBzYWZlIHRvIHJlbWF0ZXJpYWxpemUgdGhlIHNwZWNpZmllZAorICAvLy8gaW5zdHJ1Y3Rpb24gd2hpY2ggZGVmaW5lZCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGluc3RlYWQgb2YgY29weWluZyBpdC4KKyAgYm9vbCBpc1NhZmVUb1JlTWF0KGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLCBBbGlhc0FuYWx5c2lzICpBQSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdFJlZykgY29uc3Q7CisKKyAgLy8vIGhhc1ZvbGF0aWxlTWVtb3J5UmVmIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBtYXkgaGF2ZSBhCisgIC8vLyB2b2xhdGlsZSBtZW1vcnkgcmVmZXJlbmNlLCBvciBpZiB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUKKyAgLy8vIG1lbW9yeSByZWZlcmVuY2UgaXMgbm90IGF2YWlsYWJsZS4gUmV0dXJuIGZhbHNlIGlmIGl0IGlzIGtub3duIHRvCisgIC8vLyBoYXZlIG5vIHZvbGF0aWxlIG1lbW9yeSByZWZlcmVuY2VzLgorICBib29sIGhhc1ZvbGF0aWxlTWVtb3J5UmVmKCkgY29uc3Q7CisKKyAgLy8vIGlzSW52YXJpYW50TG9hZCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgbG9hZGluZyBmcm9tIGEKKyAgLy8vIGxvY2F0aW9uIHdob3NlIHZhbHVlIGlzIGludmFyaWFudCBhY3Jvc3MgdGhlIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsCisgIC8vLyBsb2FkaW5nIGEgdmFsdWUgZnJvbSB0aGUgY29uc3RhbnQgcG9vbCBvciBmcm9tIHRoZSBhcmd1bWVudCBhcmVhIG9mCisgIC8vLyBhIGZ1bmN0aW9uIGlmIGl0IGRvZXMgbm90IGNoYW5nZS4gIFRoaXMgc2hvdWxkIG9ubHkgcmV0dXJuIHRydWUgb2YgKmFsbCoKKyAgLy8vIGxvYWRzIHRoZSBpbnN0cnVjdGlvbiBkb2VzIGFyZSBpbnZhcmlhbnQgKGlmIGl0IGRvZXMgbXVsdGlwbGUgbG9hZHMpLgorICBib29sIGlzSW52YXJpYW50TG9hZChBbGlhc0FuYWx5c2lzICpBQSkgY29uc3Q7CisKKyAgLy8vIGlzQ29uc3RhbnRWYWx1ZVBISSAtIElmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgYSBQSEkgdGhhdCBhbHdheXMKKyAgLy8vIG1lcmdlcyB0b2dldGhlciB0aGUgc2FtZSB2aXJ0dWFsIHJlZ2lzdGVyLCByZXR1cm4gdGhlIHJlZ2lzdGVyLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybiAwLgorICB1bnNpZ25lZCBpc0NvbnN0YW50VmFsdWVQSEkoKSBjb25zdDsKKworICAvLy8gYWxsRGVmc0FyZURlYWQgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgdGhlIGRlZnMgb2YgdGhpcyBpbnN0cnVjdGlvbiBhcmUgZGVhZC4KKyAgLy8vCisgIGJvb2wgYWxsRGVmc0FyZURlYWQoKSBjb25zdDsKKworICAvLworICAvLyBEZWJ1Z2dpbmcgc3VwcG9ydAorICAvLworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgVGFyZ2V0TWFjaGluZSAqVE0gPSAwKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFjY2Vzc29ycyB1c2VkIHRvIGJ1aWxkIHVwIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorCisgIC8vLyBhZGRPcGVyYW5kIC0gQWRkIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCB0byB0aGUgaW5zdHJ1Y3Rpb24uICBJZiBpdCBpcyBhbgorICAvLy8gaW1wbGljaXQgb3BlcmFuZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgb3BlcmFuZCBsaXN0LiAgSWYgaXQgaXMKKyAgLy8vIGFuIGV4cGxpY2l0IG9wZXJhbmQgaXQgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZXhwbGljaXQgb3BlcmFuZCBsaXN0CisgIC8vLyAoYmVmb3JlIHRoZSBmaXJzdCBpbXBsaWNpdCBvcGVyYW5kKS4gCisgIHZvaWQgYWRkT3BlcmFuZChjb25zdCBNYWNoaW5lT3BlcmFuZCAmT3ApOworICAKKyAgLy8vIHNldERlc2MgLSBSZXBsYWNlIHRoZSBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yICh0aHVzIG9wY29kZSkgb2YKKyAgLy8vIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHdpdGggYSBuZXcgb25lLgorICAvLy8KKyAgdm9pZCBzZXREZXNjKGNvbnN0IFRhcmdldEluc3RyRGVzYyAmdGlkKSB7IFRJRCA9ICZ0aWQ7IH0KKworICAvLy8gc2V0RGVidWdMb2MgLSBSZXBsYWNlIGN1cnJlbnQgc291cmNlIGluZm9ybWF0aW9uIHdpdGggbmV3IHN1Y2guCisgIC8vLyBBdm9pZCB1c2luZyB0aGlzLCB0aGUgY29uc3RydWN0b3IgYXJndW1lbnQgaXMgcHJlZmVyYWJsZS4KKyAgLy8vCisgIHZvaWQgc2V0RGVidWdMb2MoY29uc3QgRGVidWdMb2MgZGwpIHsgZGVidWdMb2MgPSBkbDsgfQorCisgIC8vLyBSZW1vdmVPcGVyYW5kIC0gRXJhc2UgYW4gb3BlcmFuZCAgZnJvbSBhbiBpbnN0cnVjdGlvbiwgbGVhdmluZyBpdCB3aXRoIG9uZQorICAvLy8gZmV3ZXIgb3BlcmFuZCB0aGFuIGl0IHN0YXJ0ZWQgd2l0aC4KKyAgLy8vCisgIHZvaWQgUmVtb3ZlT3BlcmFuZCh1bnNpZ25lZCBpKTsKKworICAvLy8gYWRkTWVtT3BlcmFuZCAtIEFkZCBhIE1hY2hpbmVNZW1PcGVyYW5kIHRvIHRoZSBtYWNoaW5lIGluc3RydWN0aW9uLgorICAvLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBvbmx5IG9jY2FzaW9uYWxseS4gVGhlIHNldE1lbVJlZnMgZnVuY3Rpb24KKyAgLy8vIGlzIHRoZSBwcmltYXJ5IG1ldGhvZCBmb3Igc2V0dGluZyB1cCBhIE1hY2hpbmVJbnN0cidzIE1lbVJlZnMgbGlzdC4KKyAgdm9pZCBhZGRNZW1PcGVyYW5kKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVNZW1PcGVyYW5kICpNTyk7CisKKyAgLy8vIHNldE1lbVJlZnMgLSBBc3NpZ24gdGhpcyBNYWNoaW5lSW5zdHIncyBtZW1vcnkgcmVmZXJlbmNlIGRlc2NyaXB0b3IKKyAgLy8vIGxpc3QuIFRoaXMgZG9lcyBub3QgdHJhbnNmZXIgb3duZXJzaGlwLgorICB2b2lkIHNldE1lbVJlZnMobW1vX2l0ZXJhdG9yIE5ld01lbVJlZnMsIG1tb19pdGVyYXRvciBOZXdNZW1SZWZzRW5kKSB7CisgICAgTWVtUmVmcyA9IE5ld01lbVJlZnM7CisgICAgTWVtUmVmc0VuZCA9IE5ld01lbVJlZnNFbmQ7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIGdldFJlZ0luZm8gLSBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGVtYmVkZGVkIGludG8gYSBNYWNoaW5lRnVuY3Rpb24sCisgIC8vLyByZXR1cm4gdGhlIE1hY2hpbmVSZWdpc3RlckluZm8gb2JqZWN0IGZvciB0aGUgY3VycmVudCBmdW5jdGlvbiwgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm4gbnVsbC4KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqZ2V0UmVnSW5mbygpOworCisgIC8vLyBhZGRJbXBsaWNpdERlZlVzZU9wZXJhbmRzIC0gQWRkIGFsbCBpbXBsaWNpdCBkZWYgYW5kIHVzZSBvcGVyYW5kcyB0bworICAvLy8gdGhpcyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBhZGRJbXBsaWNpdERlZlVzZU9wZXJhbmRzKCk7CisgIAorICAvLy8gUmVtb3ZlUmVnT3BlcmFuZHNGcm9tVXNlTGlzdHMgLSBVbmxpbmsgYWxsIG9mIHRoZSByZWdpc3RlciBvcGVyYW5kcyBpbgorICAvLy8gdGhpcyBpbnN0cnVjdGlvbiBmcm9tIHRoZWlyIHJlc3BlY3RpdmUgdXNlIGxpc3RzLiAgVGhpcyByZXF1aXJlcyB0aGF0IHRoZQorICAvLy8gb3BlcmFuZHMgYWxyZWFkeSBiZSBvbiB0aGVpciB1c2UgbGlzdHMuCisgIHZvaWQgUmVtb3ZlUmVnT3BlcmFuZHNGcm9tVXNlTGlzdHMoKTsKKyAgCisgIC8vLyBBZGRSZWdPcGVyYW5kc1RvVXNlTGlzdHMgLSBBZGQgYWxsIG9mIHRoZSByZWdpc3RlciBvcGVyYW5kcyBpbgorICAvLy8gdGhpcyBpbnN0cnVjdGlvbiBmcm9tIHRoZWlyIHJlc3BlY3RpdmUgdXNlIGxpc3RzLiAgVGhpcyByZXF1aXJlcyB0aGF0IHRoZQorICAvLy8gb3BlcmFuZHMgbm90IGJlIG9uIHRoZWlyIHVzZSBsaXN0cyB5ZXQuCisgIHZvaWQgQWRkUmVnT3BlcmFuZHNUb1VzZUxpc3RzKE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8pOworfTsKKworLy8vIE1hY2hpbmVJbnN0ckV4cHJlc3Npb25UcmFpdCAtIFNwZWNpYWwgRGVuc2VNYXBJbmZvIHRyYWl0cyB0byBjb21wYXJlCisvLy8gTWFjaGluZUluc3RyKiBieSAqdmFsdWUqIG9mIHRoZSBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiBieSBwb2ludGVyIHZhbHVlLgorLy8vIFRoZSBoYXNoaW5nIGFuZCBlcXVhbGl0eSB0ZXN0aW5nIGZ1bmN0aW9ucyBpZ25vcmUgZGVmaW5pdGlvbnMgc28gdGhpcyBpcworLy8vIHVzZWZ1bCBmb3IgQ1NFLCBldGMuCitzdHJ1Y3QgTWFjaGluZUluc3RyRXhwcmVzc2lvblRyYWl0IDogRGVuc2VNYXBJbmZvPE1hY2hpbmVJbnN0cio+IHsKKyAgc3RhdGljIGlubGluZSBNYWNoaW5lSW5zdHIgKmdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgc3RhdGljIGlubGluZSBNYWNoaW5lSW5zdHIgKmdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNYWNoaW5lSW5zdHIqPigtMSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciogY29uc3QgJk1JKTsKKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IE1hY2hpbmVJbnN0ciogY29uc3QgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIqIGNvbnN0ICZSSFMpIHsKKyAgICBpZiAoUkhTID09IGdldEVtcHR5S2V5KCkgfHwgUkhTID09IGdldFRvbWJzdG9uZUtleSgpIHx8CisgICAgICAgIExIUyA9PSBnZXRFbXB0eUtleSgpIHx8IExIUyA9PSBnZXRUb21ic3RvbmVLZXkoKSkKKyAgICAgIHJldHVybiBMSFMgPT0gUkhTOworICAgIHJldHVybiBMSFMtPmlzSWRlbnRpY2FsVG8oUkhTLCBNYWNoaW5lSW5zdHI6Oklnbm9yZVZSZWdEZWZzKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERlYnVnZ2luZyBTdXBwb3J0CisKK2lubGluZSByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgTUkucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YWMyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgKQEAgLTAsMCArMSwyMjcgQEAKKy8vPT09LS0gQ29kZUdlbi9NYWNoaW5lSW5zdEJ1aWxkZXIuaCAtIFNpbXBsaWZ5IGNyZWF0aW9uIG9mIE1JcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgYSBmdW5jdGlvbiBuYW1lZCBCdWlsZE1JLCB3aGljaCBpcyB1c2VmdWwgZm9yIGRyYW1hdGljYWxseQorLy8gc2ltcGxpZnlpbmcgaG93IE1hY2hpbmVJbnN0cidzIGFyZSBjcmVhdGVkLiAgSXQgYWxsb3dzIHVzZSBvZiBjb2RlIGxpa2UgdGhpczoKKy8vCisvLyAgIE0gPSBCdWlsZE1JKFg4Njo6QUREcnI4LCAyKS5hZGRSZWcoYXJnVmFsMSkuYWRkUmVnKGFyZ1ZhbDIpOworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVJTlNUUkJVSUxERVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVGFyZ2V0SW5zdHJEZXNjOworY2xhc3MgTUROb2RlOworCituYW1lc3BhY2UgUmVnU3RhdGUgeworICBlbnVtIHsKKyAgICBEZWZpbmUgICAgICAgICA9IDB4MiwKKyAgICBJbXBsaWNpdCAgICAgICA9IDB4NCwKKyAgICBLaWxsICAgICAgICAgICA9IDB4OCwKKyAgICBEZWFkICAgICAgICAgICA9IDB4MTAsCisgICAgVW5kZWYgICAgICAgICAgPSAweDIwLAorICAgIEVhcmx5Q2xvYmJlciAgID0gMHg0MCwKKyAgICBEZWJ1ZyAgICAgICAgICA9IDB4ODAsCisgICAgSW1wbGljaXREZWZpbmUgPSBJbXBsaWNpdCB8IERlZmluZSwKKyAgICBJbXBsaWNpdEtpbGwgICA9IEltcGxpY2l0IHwgS2lsbAorICB9OworfQorCitjbGFzcyBNYWNoaW5lSW5zdHJCdWlsZGVyIHsKKyAgTWFjaGluZUluc3RyICpNSTsKK3B1YmxpYzoKKyAgTWFjaGluZUluc3RyQnVpbGRlcigpIDogTUkoMCkge30KKyAgZXhwbGljaXQgTWFjaGluZUluc3RyQnVpbGRlcihNYWNoaW5lSW5zdHIgKm1pKSA6IE1JKG1pKSB7fQorCisgIC8vLyBBbGxvdyBhdXRvbWF0aWMgY29udmVyc2lvbiB0byB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbiB3ZSBhcmUgd29ya2luZyBvbi4KKyAgLy8vCisgIG9wZXJhdG9yIE1hY2hpbmVJbnN0ciooKSBjb25zdCB7IHJldHVybiBNSTsgfQorICBvcGVyYXRvciBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoKSBjb25zdCB7IHJldHVybiBNSTsgfQorCisgIC8vLyBhZGRSZWcgLSBBZGQgYSBuZXcgdmlydHVhbCByZWdpc3RlciBvcGVyYW5kLi4uCisgIC8vLworICBjb25zdAorICBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRSZWcodW5zaWduZWQgUmVnTm8sIHVuc2lnbmVkIGZsYWdzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YlJlZyA9IDApIGNvbnN0IHsKKyAgICBhc3NlcnQoKGZsYWdzICYgMHgxKSA9PSAwICYmCisgICAgICAgICAgICJQYXNzaW5nIGluICd0cnVlJyB0byBhZGRSZWcgaXMgZm9yYmlkZGVuISBVc2UgZW51bXMgaW5zdGVhZC4iKTsKKyAgICBNSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKFJlZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBSZWdTdGF0ZTo6RGVmaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBSZWdTdGF0ZTo6SW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIFJlZ1N0YXRlOjpLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBSZWdTdGF0ZTo6RGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUmVnU3RhdGU6OlVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBSZWdTdGF0ZTo6RWFybHlDbG9iYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBSZWdTdGF0ZTo6RGVidWcpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gYWRkSW1tIC0gQWRkIGEgbmV3IGltbWVkaWF0ZSBvcGVyYW5kLgorICAvLy8KKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkSW1tKGludDY0X3QgVmFsKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbShWYWwpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRGUEltbShjb25zdCBDb25zdGFudEZQICpWYWwpIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlRlBJbW0oVmFsKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkTUJCKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVNQkIoTUJCLCBUYXJnZXRGbGFncykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZEZyYW1lSW5kZXgodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUZJKElkeCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZENvbnN0YW50UG9vbEluZGV4KHVuc2lnbmVkIElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVDUEkoSWR4LCBPZmZzZXQsIFRhcmdldEZsYWdzKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkSnVtcFRhYmxlSW5kZXgodW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlSlRJKElkeCwgVGFyZ2V0RmxhZ3MpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRHbG9iYWxBZGRyZXNzKGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVHQShHViwgT2Zmc2V0LCBUYXJnZXRGbGFncykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZEV4dGVybmFsU3ltYm9sKGNvbnN0IGNoYXIgKkZuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUVTKEZuTmFtZSwgVGFyZ2V0RmxhZ3MpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRNZW1PcGVyYW5kKE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pIGNvbnN0IHsKKyAgICBNSS0+YWRkTWVtT3BlcmFuZCgqTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKSwgTU1PKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRPcGVyYW5kKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKE1PKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRNZXRhZGF0YShjb25zdCBNRE5vZGUgKk1EKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZU1ldGFkYXRhKE1EKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRTeW0oTUNTeW1ib2wgKlN5bSkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVNQ1N5bWJvbChTeW0pKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKKy8vLyBCdWlsZE1JIC0gQnVpbGRlciBpbnRlcmZhY2UuICBTcGVjaWZ5IGhvdyB0byBjcmVhdGUgdGhlIGluaXRpYWwgaW5zdHJ1Y3Rpb24KKy8vLyBpdHNlbGYuCisvLy8KK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEKSB7CisgIHJldHVybiBNYWNoaW5lSW5zdHJCdWlsZGVyKE1GLkNyZWF0ZU1hY2hpbmVJbnN0cihUSUQsIERMKSk7Cit9CisKKy8vLyBCdWlsZE1JIC0gVGhpcyB2ZXJzaW9uIG9mIHRoZSBidWlsZGVyIHNldHMgdXAgdGhlIGZpcnN0IG9wZXJhbmQgYXMgYQorLy8vIGRlc3RpbmF0aW9uIHZpcnR1YWwgcmVnaXN0ZXIuCisvLy8KK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnKSB7CisgIHJldHVybiBNYWNoaW5lSW5zdHJCdWlsZGVyKE1GLkNyZWF0ZU1hY2hpbmVJbnN0cihUSUQsIERMKSkKKyAgICAgICAgICAgLmFkZFJlZyhEZXN0UmVnLCBSZWdTdGF0ZTo6RGVmaW5lKTsKK30KKworLy8vIEJ1aWxkTUkgLSBUaGlzIHZlcnNpb24gb2YgdGhlIGJ1aWxkZXIgaW5zZXJ0cyB0aGUgbmV3bHktYnVpbHQKKy8vLyBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBnaXZlbiBNYWNoaW5lQmFzaWNCbG9jaywgYW5kCisvLy8gc2V0cyB1cCB0aGUgZmlyc3Qgb3BlcmFuZCBhcyBhIGRlc3RpbmF0aW9uIHZpcnR1YWwgcmVnaXN0ZXIuCisvLy8KK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUJhc2ljQmxvY2sgJkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnKSB7CisgIE1hY2hpbmVJbnN0ciAqTUkgPSBCQi5nZXRQYXJlbnQoKS0+Q3JlYXRlTWFjaGluZUluc3RyKFRJRCwgREwpOworICBCQi5pbnNlcnQoSSwgTUkpOworICByZXR1cm4gTWFjaGluZUluc3RyQnVpbGRlcihNSSkuYWRkUmVnKERlc3RSZWcsIFJlZ1N0YXRlOjpEZWZpbmUpOworfQorCisvLy8gQnVpbGRNSSAtIFRoaXMgdmVyc2lvbiBvZiB0aGUgYnVpbGRlciBpbnNlcnRzIHRoZSBuZXdseS1idWlsdAorLy8vIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGdpdmVuIE1hY2hpbmVCYXNpY0Jsb2NrLCBhbmQKKy8vLyBkb2VzIE5PVCB0YWtlIGEgZGVzdGluYXRpb24gcmVnaXN0ZXIuCisvLy8KK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUJhc2ljQmxvY2sgJkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEKSB7CisgIE1hY2hpbmVJbnN0ciAqTUkgPSBCQi5nZXRQYXJlbnQoKS0+Q3JlYXRlTWFjaGluZUluc3RyKFRJRCwgREwpOworICBCQi5pbnNlcnQoSSwgTUkpOworICByZXR1cm4gTWFjaGluZUluc3RyQnVpbGRlcihNSSk7Cit9CisKKy8vLyBCdWlsZE1JIC0gVGhpcyB2ZXJzaW9uIG9mIHRoZSBidWlsZGVyIGluc2VydHMgdGhlIG5ld2x5LWJ1aWx0CisvLy8gaW5zdHJ1Y3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gTWFjaGluZUJhc2ljQmxvY2ssIGFuZCBkb2VzIE5PVCB0YWtlIGEKKy8vLyBkZXN0aW5hdGlvbiByZWdpc3Rlci4KKy8vLworaW5saW5lIE1hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCkgeworICByZXR1cm4gQnVpbGRNSSgqQkIsIEJCLT5lbmQoKSwgREwsIFRJRCk7Cit9CisKKy8vLyBCdWlsZE1JIC0gVGhpcyB2ZXJzaW9uIG9mIHRoZSBidWlsZGVyIGluc2VydHMgdGhlIG5ld2x5LWJ1aWx0CisvLy8gaW5zdHJ1Y3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gTWFjaGluZUJhc2ljQmxvY2ssIGFuZCBzZXRzIHVwIHRoZSBmaXJzdAorLy8vIG9wZXJhbmQgYXMgYSBkZXN0aW5hdGlvbiB2aXJ0dWFsIHJlZ2lzdGVyLgorLy8vCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnKSB7CisgIHJldHVybiBCdWlsZE1JKCpCQiwgQkItPmVuZCgpLCBETCwgVElELCBEZXN0UmVnKTsKK30KKworaW5saW5lIHVuc2lnbmVkIGdldERlZlJlZ1N0YXRlKGJvb2wgQikgeworICByZXR1cm4gQiA/IFJlZ1N0YXRlOjpEZWZpbmUgOiAwOworfQoraW5saW5lIHVuc2lnbmVkIGdldEltcGxSZWdTdGF0ZShib29sIEIpIHsKKyAgcmV0dXJuIEIgPyBSZWdTdGF0ZTo6SW1wbGljaXQgOiAwOworfQoraW5saW5lIHVuc2lnbmVkIGdldEtpbGxSZWdTdGF0ZShib29sIEIpIHsKKyAgcmV0dXJuIEIgPyBSZWdTdGF0ZTo6S2lsbCA6IDA7Cit9CitpbmxpbmUgdW5zaWduZWQgZ2V0RGVhZFJlZ1N0YXRlKGJvb2wgQikgeworICByZXR1cm4gQiA/IFJlZ1N0YXRlOjpEZWFkIDogMDsKK30KK2lubGluZSB1bnNpZ25lZCBnZXRVbmRlZlJlZ1N0YXRlKGJvb2wgQikgeworICByZXR1cm4gQiA/IFJlZ1N0YXRlOjpVbmRlZiA6IDA7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUp1bXBUYWJsZUluZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2NDM0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8vPT09LS0gQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIC0gQWJzdHJhY3QgSnVtcCBUYWJsZXMgIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIE1hY2hpbmVKdW1wVGFibGVJbmZvIGNsYXNzIGtlZXBzIHRyYWNrIG9mIGp1bXAgdGFibGVzIHJlZmVyZW5jZWQgYnkKKy8vIGxvd2VyZWQgc3dpdGNoIGluc3RydWN0aW9ucyBpbiB0aGUgTWFjaGluZUZ1bmN0aW9uLgorLy8KKy8vIEluc3RydWN0aW9ucyByZWZlcmVuY2UgdGhlIGFkZHJlc3Mgb2YgdGhlc2UganVtcCB0YWJsZXMgdGhyb3VnaCB0aGUgdXNlIG9mIAorLy8gTU9fSnVtcFRhYmxlSW5kZXggdmFsdWVzLiAgV2hlbiBlbWl0dGluZyBhc3NlbWJseSBvciBtYWNoaW5lIGNvZGUsIHRoZXNlIAorLy8gdmlydHVhbCBhZGRyZXNzIHJlZmVyZW5jZXMgYXJlIGNvbnZlcnRlZCB0byByZWZlciB0byB0aGUgYWRkcmVzcyBvZiB0aGUgCisvLyBmdW5jdGlvbiBqdW1wIHRhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FSlVNUFRBQkxFSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FSlVNUFRBQkxFSU5GT19ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIFRhcmdldERhdGE7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIE1hY2hpbmVKdW1wVGFibGVFbnRyeSAtIE9uZSBqdW1wIHRhYmxlIGluIHRoZSBqdW1wIHRhYmxlIGluZm8uCisvLy8KK3N0cnVjdCBNYWNoaW5lSnVtcFRhYmxlRW50cnkgeworICAvLy8gTUJCcyAtIFRoZSB2ZWN0b3Igb2YgYmFzaWMgYmxvY2tzIGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSBqdW1wIHRhYmxlLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+IE1CQnM7CisgIAorICBleHBsaWNpdCBNYWNoaW5lSnVtcFRhYmxlRW50cnkoY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiAmTSkKKyAgOiBNQkJzKE0pIHt9Cit9OworICAKK2NsYXNzIE1hY2hpbmVKdW1wVGFibGVJbmZvIHsKK3B1YmxpYzoKKyAgLy8vIEpURW50cnlLaW5kIC0gVGhpcyBlbnVtIGluZGljYXRlcyBob3cgZWFjaCBlbnRyeSBvZiB0aGUganVtcCB0YWJsZSBpcworICAvLy8gcmVwcmVzZW50ZWQgYW5kIGVtaXR0ZWQuCisgIGVudW0gSlRFbnRyeUtpbmQgeworICAgIC8vLyBFS19CbG9ja0FkZHJlc3MgLSBFYWNoIGVudHJ5IGlzIGEgcGxhaW4gYWRkcmVzcyBvZiBibG9jaywgZS5nLjoKKyAgICAvLy8gICAgIC53b3JkIExCQjEyMworICAgIEVLX0Jsb2NrQWRkcmVzcywKKyAgICAKKyAgICAvLy8gRUtfR1BSZWwzMkJsb2NrQWRkcmVzcyAtIEVhY2ggZW50cnkgaXMgYW4gYWRkcmVzcyBvZiBibG9jaywgZW5jb2RlZAorICAgIC8vLyB3aXRoIGEgcmVsb2NhdGlvbiBhcyBncC1yZWxhdGl2ZSwgZS5nLjoKKyAgICAvLy8gICAgIC5ncHJlbDMyIExCQjEyMworICAgIEVLX0dQUmVsMzJCbG9ja0FkZHJlc3MsCisgICAgCisgICAgLy8vIEVLX0xhYmVsRGlmZmVyZW5jZTMyIC0gRWFjaCBlbnRyeSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgYmxvY2sgbWludXMKKyAgICAvLy8gdGhlIGFkZHJlc3Mgb2YgdGhlIGp1bXAgdGFibGUuICBUaGlzIGlzIHVzZWQgZm9yIFBJQyBqdW1wIHRhYmxlcyB3aGVyZQorICAgIC8vLyBncHJlbDMyIGlzIG5vdCBzdXBwb3J0ZWQuICBlLmcuOgorICAgIC8vLyAgICAgIC53b3JkIExCQjEyMyAtIExKVEkxXzIKKyAgICAvLy8gSWYgdGhlIC5zZXQgZGlyZWN0aXZlIGlzIHN1cHBvcnRlZCwgdGhpcyBpcyBlbWl0dGVkIGFzOgorICAgIC8vLyAgICAgIC5zZXQgTDRfNV9zZXRfMTIzLCBMQkIxMjMgLSBMSlRJMV8yCisgICAgLy8vICAgICAgLndvcmQgTDRfNV9zZXRfMTIzCisgICAgRUtfTGFiZWxEaWZmZXJlbmNlMzIsCisKKyAgICAvLy8gRUtfSW5saW5lIC0gSnVtcCB0YWJsZSBlbnRyaWVzIGFyZSBlbWl0dGVkIGlubGluZSBhdCB0aGVpciBwb2ludCBvZgorICAgIC8vLyB1c2UuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdGFyZ2V0IHRvIGVtaXQgdGhlIGVudHJpZXMuCisgICAgRUtfSW5saW5lLAorCisgICAgLy8vIEVLX0N1c3RvbTMyIC0gRWFjaCBlbnRyeSBpcyBhIDMyLWJpdCB2YWx1ZSB0aGF0IGlzIGN1c3RvbSBsb3dlcmVkIGJ5IHRoZQorICAgIC8vLyBUYXJnZXRMb3dlcmluZzo6TG93ZXJDdXN0b21KdW1wVGFibGVFbnRyeSBob29rLgorICAgIEVLX0N1c3RvbTMyCisgIH07Citwcml2YXRlOgorICBKVEVudHJ5S2luZCBFbnRyeUtpbmQ7CisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gSnVtcFRhYmxlczsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTWFjaGluZUp1bXBUYWJsZUluZm8oSlRFbnRyeUtpbmQgS2luZCk6IEVudHJ5S2luZChLaW5kKSB7fQorICAgIAorICBKVEVudHJ5S2luZCBnZXRFbnRyeUtpbmQoKSBjb25zdCB7IHJldHVybiBFbnRyeUtpbmQ7IH0KKworICAvLy8gZ2V0RW50cnlTaXplIC0gUmV0dXJuIHRoZSBzaXplIG9mIGVhY2ggZW50cnkgaW4gdGhlIGp1bXAgdGFibGUuCisgIHVuc2lnbmVkIGdldEVudHJ5U2l6ZShjb25zdCBUYXJnZXREYXRhICZURCkgY29uc3Q7CisgIC8vLyBnZXRFbnRyeUFsaWdubWVudCAtIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIGVhY2ggZW50cnkgaW4gdGhlIGp1bXAgdGFibGUuCisgIHVuc2lnbmVkIGdldEVudHJ5QWxpZ25tZW50KGNvbnN0IFRhcmdldERhdGEgJlREKSBjb25zdDsKKyAgCisgIC8vLyBjcmVhdGVKdW1wVGFibGVJbmRleCAtIENyZWF0ZSBhIG5ldyBqdW1wIHRhYmxlLgorICAvLy8KKyAgdW5zaWduZWQgY3JlYXRlSnVtcFRhYmxlSW5kZXgoY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiAmRGVzdEJCcyk7CisgIAorICAvLy8gaXNFbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBqdW1wIHRhYmxlcy4KKyAgLy8vCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEp1bXBUYWJsZXMuZW1wdHkoKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gJmdldEp1bXBUYWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEp1bXBUYWJsZXM7CisgIH0KKworICAvLy8gUmVtb3ZlSnVtcFRhYmxlIC0gTWFyayB0aGUgc3BlY2lmaWMgaW5kZXggYXMgYmVpbmcgZGVhZC4gIFRoaXMgd2lsbAorICAvLy8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGVtaXR0ZWQuCisgIHZvaWQgUmVtb3ZlSnVtcFRhYmxlKHVuc2lnbmVkIElkeCkgeworICAgIEp1bXBUYWJsZXNbSWR4XS5NQkJzLmNsZWFyKCk7CisgIH0KKyAgCisgIC8vLyBSZXBsYWNlTUJCSW5KdW1wVGFibGVzIC0gSWYgT2xkIGlzIHRoZSB0YXJnZXQgb2YgYW55IGp1bXAgdGFibGVzLCB1cGRhdGUKKyAgLy8vIHRoZSBqdW1wIHRhYmxlcyB0byBicmFuY2ggdG8gTmV3IGluc3RlYWQuCisgIGJvb2wgUmVwbGFjZU1CQkluSnVtcFRhYmxlcyhNYWNoaW5lQmFzaWNCbG9jayAqT2xkLCBNYWNoaW5lQmFzaWNCbG9jayAqTmV3KTsKKworICAvLy8gUmVwbGFjZU1CQkluSnVtcFRhYmxlIC0gSWYgT2xkIGlzIGEgdGFyZ2V0IG9mIHRoZSBqdW1wIHRhYmxlcywgdXBkYXRlCisgIC8vLyB0aGUganVtcCB0YWJsZSB0byBicmFuY2ggdG8gTmV3IGluc3RlYWQuCisgIGJvb2wgUmVwbGFjZU1CQkluSnVtcFRhYmxlKHVuc2lnbmVkIElkeCwgTWFjaGluZUJhc2ljQmxvY2sgKk9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk5ldyk7CisKKyAgLy8vIHByaW50IC0gVXNlZCBieSB0aGUgTWFjaGluZUZ1bmN0aW9uIHByaW50ZXIgdG8gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQKKyAgLy8vIGp1bXAgdGFibGVzLiAgSW1wbGVtZW50ZWQgaW4gTWFjaGluZUZ1bmN0aW9uLmNwcAorICAvLy8KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBkdW1wIC0gQ2FsbCB0byBzdGRlcnIuCisgIC8vLworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUxvY2F0aW9uLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWZjYjlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUxvY2F0aW9uLmgKQEAgLTAsMCArMSw5MyBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTWFjaGluZUxvY2F0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoZSBNYWNoaW5lTG9jYXRpb24gY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYSBzaW1wbGUgbG9jYXRpb24gaW4gYSBtYWNoaW5lCisvLyBmcmFtZS4gIExvY2F0aW9ucyB3aWxsIGJlIG9uZSBvZiB0d28gZm9ybXM7IGEgcmVnaXN0ZXIgb3IgYW4gYWRkcmVzcyBmb3JtZWQKKy8vIGZyb20gYSBiYXNlIGFkZHJlc3MgcGx1cyBhbiBvZmZzZXQuICBSZWdpc3RlciBpbmRpcmVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGJ5CisvLyB1c2luZyBhbiBvZmZzZXQgb2YgemVyby4KKy8vCisvLyBUaGUgTWFjaGluZU1vdmUgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYWJzdHJhY3QgbW92ZSBvcGVyYXRpb25zIGluIHRoZSAKKy8vIHByb2xvZy9lcGlsb2cgb2YgYSBjb21waWxlZCBmdW5jdGlvbi4gIEEgY29sbGVjdGlvbiBvZiB0aGVzZSBvYmplY3RzIGNhbiBiZQorLy8gdXNlZCBieSBhIGRlYnVnIGNvbnN1bWVyIHRvIHRyYWNrIHRoZSBsb2NhdGlvbiBvZiB2YWx1ZXMgd2hlbiB1bndpbmRpbmcgc3RhY2sKKy8vIGZyYW1lcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUxPQ0FUSU9OX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVMT0NBVElPTl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTUNTeW1ib2w7CisgIAorY2xhc3MgTWFjaGluZUxvY2F0aW9uIHsKK3ByaXZhdGU6CisgIGJvb2wgSXNSZWdpc3RlcjsgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZiBsb2NhdGlvbiBpcyBhIHJlZ2lzdGVyLgorICB1bnNpZ25lZCBSZWdpc3RlcjsgICAgICAgICAgICAgICAgICAgIC8vIGdjYy9nZGIgcmVnaXN0ZXIgbnVtYmVyLgorICBpbnQgT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc3BsYWNlbWVudCBpZiBub3QgcmVnaXN0ZXIuCitwdWJsaWM6CisgIGVudW0geworICAgIC8vIFRoZSB0YXJnZXQgcmVnaXN0ZXIgbnVtYmVyIGZvciBhbiBhYnN0cmFjdCBmcmFtZSBwb2ludGVyLiBUaGUgdmFsdWUgaXMKKyAgICAvLyBhbiBhcmJpdHJhcnkgdmFsdWUgZ3JlYXRlciB0aGFuIFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXIuCisgICAgVmlydHVhbEZQID0gfjBVCisgIH07CisgIE1hY2hpbmVMb2NhdGlvbigpCisgIDogSXNSZWdpc3RlcihmYWxzZSksIFJlZ2lzdGVyKDApLCBPZmZzZXQoMCkge30KKyAgZXhwbGljaXQgTWFjaGluZUxvY2F0aW9uKHVuc2lnbmVkIFIpCisgIDogSXNSZWdpc3Rlcih0cnVlKSwgUmVnaXN0ZXIoUiksIE9mZnNldCgwKSB7fQorICBNYWNoaW5lTG9jYXRpb24odW5zaWduZWQgUiwgaW50IE8pCisgIDogSXNSZWdpc3RlcihmYWxzZSksIFJlZ2lzdGVyKFIpLCBPZmZzZXQoTykge30KKyAgCisgIC8vIEFjY2Vzc29ycworICBib29sIGlzUmVnKCkgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIElzUmVnaXN0ZXI7IH0KKyAgdW5zaWduZWQgZ2V0UmVnKCkgICAgICBjb25zdCB7IHJldHVybiBSZWdpc3RlcjsgfQorICBpbnQgZ2V0T2Zmc2V0KCkgICAgICAgIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB2b2lkIHNldElzUmVnaXN0ZXIoYm9vbCBJcykgIHsgSXNSZWdpc3RlciA9IElzOyB9CisgIHZvaWQgc2V0UmVnaXN0ZXIodW5zaWduZWQgUikgeyBSZWdpc3RlciA9IFI7IH0KKyAgdm9pZCBzZXRPZmZzZXQoaW50IE8pICAgICAgICB7IE9mZnNldCA9IE87IH0KKyAgdm9pZCBzZXQodW5zaWduZWQgUikgeworICAgIElzUmVnaXN0ZXIgPSB0cnVlOworICAgIFJlZ2lzdGVyID0gUjsKKyAgICBPZmZzZXQgPSAwOworICB9CisgIHZvaWQgc2V0KHVuc2lnbmVkIFIsIGludCBPKSB7CisgICAgSXNSZWdpc3RlciA9IGZhbHNlOworICAgIFJlZ2lzdGVyID0gUjsKKyAgICBPZmZzZXQgPSBPOworICB9CisKKyNpZm5kZWYgTkRFQlVHCisgIHZvaWQgZHVtcCgpOworI2VuZGlmCit9OworCisvLy8gTWFjaGluZU1vdmUgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHNhdmUgb3IgcmVzdG9yZSBvZiBhIGNhbGxlZSBzYXZlZAorLy8vIHJlZ2lzdGVyIHRoYXQgZXhjZXB0aW9uIG9yIGRlYnVnIGluZm8gbmVlZHMgdG8ga25vdyBhYm91dC4KK2NsYXNzIE1hY2hpbmVNb3ZlIHsKK3ByaXZhdGU6CisgIC8vLyBMYWJlbCAtIFN5bWJvbCBmb3IgcG9zdC1pbnN0cnVjdGlvbiBhZGRyZXNzIHdoZW4gcmVzdWx0IG9mIG1vdmUgdGFrZXMKKyAgLy8vIGVmZmVjdC4KKyAgTUNTeW1ib2wgKkxhYmVsOworICAKKyAgLy8gTW92ZSB0byAmIGZyb20gbG9jYXRpb24uCisgIE1hY2hpbmVMb2NhdGlvbiBEZXN0aW5hdGlvbiwgU291cmNlOworcHVibGljOgorICBNYWNoaW5lTW92ZSgpIDogTGFiZWwoMCkge30KKworICBNYWNoaW5lTW92ZShNQ1N5bWJvbCAqbGFiZWwsIGNvbnN0IE1hY2hpbmVMb2NhdGlvbiAmRCwKKyAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUxvY2F0aW9uICZTKQorICA6IExhYmVsKGxhYmVsKSwgRGVzdGluYXRpb24oRCksIFNvdXJjZShTKSB7fQorICAKKyAgLy8gQWNjZXNzb3JzCisgIE1DU3ltYm9sICpnZXRMYWJlbCgpICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBMYWJlbDsgfQorICBjb25zdCBNYWNoaW5lTG9jYXRpb24gJmdldERlc3RpbmF0aW9uKCkgY29uc3QgeyByZXR1cm4gRGVzdGluYXRpb247IH0KKyAgY29uc3QgTWFjaGluZUxvY2F0aW9uICZnZXRTb3VyY2UoKSAgICAgIGNvbnN0IHsgcmV0dXJuIFNvdXJjZTsgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NjBlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaApAQCAtMCwwICsxLDE3NiBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCAtIE5hdHVyYWwgTG9vcCBDYWxjdWxhdG9yIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTWFjaGluZUxvb3BJbmZvIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSBuYXR1cmFsIAorLy8gbG9vcHMgYW5kIGRldGVybWluZSB0aGUgbG9vcCBkZXB0aCBvZiB2YXJpb3VzIG5vZGVzIG9mIHRoZSBDRkcuICBOb3RlIHRoYXQKKy8vIG5hdHVyYWwgbG9vcHMgbWF5IGFjdHVhbGx5IGJlIHNldmVyYWwgbG9vcHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBoZWFkZXIgbm9kZS4KKy8vCisvLyBUaGlzIGFuYWx5c2lzIGNhbGN1bGF0ZXMgdGhlIG5lc3Rpbmcgc3RydWN0dXJlIG9mIGxvb3BzIGluIGEgZnVuY3Rpb24uICBGb3IKKy8vIGVhY2ggbmF0dXJhbCBsb29wIGlkZW50aWZpZWQsIHRoaXMgYW5hbHlzaXMgaWRlbnRpZmllcyBuYXR1cmFsIGxvb3BzCisvLyBjb250YWluZWQgZW50aXJlbHkgd2l0aGluIHRoZSBsb29wIGFuZCB0aGUgYmFzaWMgYmxvY2tzIHRoZSBtYWtlIHVwIHRoZSBsb29wLgorLy8KKy8vIEl0IGNhbiBjYWxjdWxhdGUgb24gdGhlIGZseSB2YXJpb3VzIGJpdHMgb2YgaW5mb3JtYXRpb24sIGZvciBleGFtcGxlOgorLy8KKy8vICAqIHdoZXRoZXIgdGhlcmUgaXMgYSBwcmVoZWFkZXIgZm9yIHRoZSBsb29wCisvLyAgKiB0aGUgbnVtYmVyIG9mIGJhY2sgZWRnZXMgdG8gdGhlIGhlYWRlcgorLy8gICogd2hldGhlciBvciBub3QgYSBwYXJ0aWN1bGFyIGJsb2NrIGJyYW5jaGVzIG91dCBvZiB0aGUgbG9vcAorLy8gICogdGhlIHN1Y2Nlc3NvciBibG9ja3Mgb2YgdGhlIGxvb3AKKy8vICAqIHRoZSBsb29wIGRlcHRoCisvLyAgKiB0aGUgdHJpcCBjb3VudAorLy8gICogZXRjLi4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORV9MT09QX0lORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORV9MT09QX0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUxvb3AgOiBwdWJsaWMgTG9vcEJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPiB7CitwdWJsaWM6CisgIE1hY2hpbmVMb29wKCk7CisKKyAgLy8vIGdldFRvcEJsb2NrIC0gUmV0dXJuIHRoZSAidG9wIiBibG9jayBpbiB0aGUgbG9vcCwgd2hpY2ggaXMgdGhlIGZpcnN0CisgIC8vLyBibG9jayBpbiB0aGUgbGluZWFyIGxheW91dCwgaWdub3JpbmcgYW55IHBhcnRzIG9mIHRoZSBsb29wIG5vdAorICAvLy8gY29udGlndW91cyB3aXRoIHRoZSBwYXJ0IHRoZSBjb250YWlucyB0aGUgaGVhZGVyLgorICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0VG9wQmxvY2soKTsKKworICAvLy8gZ2V0Qm90dG9tQmxvY2sgLSBSZXR1cm4gdGhlICJib3R0b20iIGJsb2NrIGluIHRoZSBsb29wLCB3aGljaCBpcyB0aGUgbGFzdAorICAvLy8gYmxvY2sgaW4gdGhlIGxpbmVhciBsYXlvdXQsIGlnbm9yaW5nIGFueSBwYXJ0cyBvZiB0aGUgbG9vcCBub3QKKyAgLy8vIGNvbnRpZ3VvdXMgd2l0aCB0aGUgcGFydCB0aGUgY29udGFpbnMgdGhlIGhlYWRlci4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKmdldEJvdHRvbUJsb2NrKCk7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBMb29wSW5mb0Jhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPjsKKyAgZXhwbGljaXQgTWFjaGluZUxvb3AoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikKKyAgICA6IExvb3BCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD4oTUJCKSB7fQorfTsKKworY2xhc3MgTWFjaGluZUxvb3BJbmZvIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBMb29wSW5mb0Jhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPiBMSTsKKyAgZnJpZW5kIGNsYXNzIExvb3BCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD47CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWFjaGluZUxvb3BJbmZvICYpOyAgLy8gZG8gbm90IGltcGxlbWVudAorICBNYWNoaW5lTG9vcEluZm8oY29uc3QgTWFjaGluZUxvb3BJbmZvICYpOyAvLyBkbyBub3QgaW1wbGVtZW50CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICBNYWNoaW5lTG9vcEluZm8oKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgTG9vcEluZm9CYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD4mIGdldEJhc2UoKSB7IHJldHVybiBMSTsgfQorCisgIC8vLyBpdGVyYXRvci9iZWdpbi9lbmQgLSBUaGUgaW50ZXJmYWNlIHRvIHRoZSB0b3AtbGV2ZWwgbG9vcHMgaW4gdGhlIGN1cnJlbnQKKyAgLy8vIGZ1bmN0aW9uLgorICAvLy8KKyAgdHlwZWRlZiBMb29wSW5mb0Jhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPjo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIExJLmJlZ2luKCk7IH0KKyAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIExJLmVuZCgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBMSS5lbXB0eSgpOyB9CisKKyAgLy8vIGdldExvb3BGb3IgLSBSZXR1cm4gdGhlIGlubmVyIG1vc3QgbG9vcCB0aGF0IEJCIGxpdmVzIGluLiAgSWYgYSBiYXNpYworICAvLy8gYmxvY2sgaXMgaW4gbm8gbG9vcCAoZm9yIGV4YW1wbGUgdGhlIGVudHJ5IG5vZGUpLCBudWxsIGlzIHJldHVybmVkLgorICAvLy8KKyAgaW5saW5lIE1hY2hpbmVMb29wICpnZXRMb29wRm9yKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBMSS5nZXRMb29wRm9yKEJCKTsKKyAgfQorCisgIC8vLyBvcGVyYXRvcltdIC0gc2FtZSBhcyBnZXRMb29wRm9yLi4uCisgIC8vLworICBpbmxpbmUgY29uc3QgTWFjaGluZUxvb3AgKm9wZXJhdG9yW10oY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIExJLmdldExvb3BGb3IoQkIpOworICB9CisKKyAgLy8vIGdldExvb3BEZXB0aCAtIFJldHVybiB0aGUgbG9vcCBuZXN0aW5nIGxldmVsIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suLi4KKyAgLy8vCisgIGlubGluZSB1bnNpZ25lZCBnZXRMb29wRGVwdGgoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIExJLmdldExvb3BEZXB0aChCQik7CisgIH0KKworICAvLyBpc0xvb3BIZWFkZXIgLSBUcnVlIGlmIHRoZSBibG9jayBpcyBhIGxvb3AgaGVhZGVyIG5vZGUKKyAgaW5saW5lIGJvb2wgaXNMb29wSGVhZGVyKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBMSS5pc0xvb3BIZWFkZXIoQkIpOworICB9CisKKyAgLy8vIHJ1bk9uRnVuY3Rpb24gLSBDYWxjdWxhdGUgdGhlIG5hdHVyYWwgbG9vcCBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpOworCisgIHZpcnR1YWwgdm9pZCByZWxlYXNlTWVtb3J5KCkgeyBMSS5yZWxlYXNlTWVtb3J5KCk7IH0KKworICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Q7CisKKyAgLy8vIHJlbW92ZUxvb3AgLSBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCB0b3AtbGV2ZWwgbG9vcCBmcm9tIHRoaXMgbG9vcCBpbmZvCisgIC8vLyBvYmplY3QuICBUaGUgbG9vcCBpcyBub3QgZGVsZXRlZCwgYXMgaXQgd2lsbCBwcmVzdW1hYmx5IGJlIGluc2VydGVkIGludG8KKyAgLy8vIGFub3RoZXIgbG9vcC4KKyAgaW5saW5lIE1hY2hpbmVMb29wICpyZW1vdmVMb29wKGl0ZXJhdG9yIEkpIHsgcmV0dXJuIExJLnJlbW92ZUxvb3AoSSk7IH0KKworICAvLy8gY2hhbmdlTG9vcEZvciAtIENoYW5nZSB0aGUgdG9wLWxldmVsIGxvb3AgdGhhdCBjb250YWlucyBCQiB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCBsb29wLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBieSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCByZXN0cnVjdHVyZQorICAvLy8gdGhlIGxvb3AgaGllcmFyY2h5IHRyZWUuCisgIGlubGluZSB2b2lkIGNoYW5nZUxvb3BGb3IoTWFjaGluZUJhc2ljQmxvY2sgKkJCLCBNYWNoaW5lTG9vcCAqTCkgeworICAgIExJLmNoYW5nZUxvb3BGb3IoQkIsIEwpOworICB9CisKKyAgLy8vIGNoYW5nZVRvcExldmVsTG9vcCAtIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBsb29wIGluIHRoZSB0b3AtbGV2ZWwgbG9vcHMKKyAgLy8vIGxpc3Qgd2l0aCB0aGUgaW5kaWNhdGVkIGxvb3AuCisgIGlubGluZSB2b2lkIGNoYW5nZVRvcExldmVsTG9vcChNYWNoaW5lTG9vcCAqT2xkTG9vcCwgTWFjaGluZUxvb3AgKk5ld0xvb3ApIHsKKyAgICBMSS5jaGFuZ2VUb3BMZXZlbExvb3AoT2xkTG9vcCwgTmV3TG9vcCk7CisgIH0KKworICAvLy8gYWRkVG9wTGV2ZWxMb29wIC0gVGhpcyBhZGRzIHRoZSBzcGVjaWZpZWQgbG9vcCB0byB0aGUgY29sbGVjdGlvbiBvZgorICAvLy8gdG9wLWxldmVsIGxvb3BzLgorICBpbmxpbmUgdm9pZCBhZGRUb3BMZXZlbExvb3AoTWFjaGluZUxvb3AgKk5ldykgeworICAgIExJLmFkZFRvcExldmVsTG9vcChOZXcpOworICB9CisKKyAgLy8vIHJlbW92ZUJsb2NrIC0gVGhpcyBtZXRob2QgY29tcGxldGVseSByZW1vdmVzIEJCIGZyb20gYWxsIGRhdGEgc3RydWN0dXJlcywKKyAgLy8vIGluY2x1ZGluZyBhbGwgb2YgdGhlIExvb3Agb2JqZWN0cyBpdCBpcyBuZXN0ZWQgaW4gYW5kIG91ciBtYXBwaW5nIGZyb20KKyAgLy8vIE1hY2hpbmVCYXNpY0Jsb2NrcyB0byBsb29wcy4KKyAgdm9pZCByZW1vdmVCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIpIHsKKyAgICBMSS5yZW1vdmVCbG9jayhCQik7CisgIH0KK307CisKKworLy8gQWxsb3cgY2xpZW50cyB0byB3YWxrIHRoZSBsaXN0IG9mIG5lc3RlZCBsb29wcy4uLgordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IE1hY2hpbmVMb29wKj4geworICB0eXBlZGVmIGNvbnN0IE1hY2hpbmVMb29wIE5vZGVUeXBlOworICB0eXBlZGVmIE1hY2hpbmVMb29wSW5mbzo6aXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoY29uc3QgTWFjaGluZUxvb3AgKkwpIHsgcmV0dXJuIEw7IH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBOLT5iZWdpbigpOworICB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPmVuZCgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8TWFjaGluZUxvb3AqPiB7CisgIHR5cGVkZWYgTWFjaGluZUxvb3AgTm9kZVR5cGU7CisgIHR5cGVkZWYgTWFjaGluZUxvb3BJbmZvOjppdGVyYXRvciBDaGlsZEl0ZXJhdG9yVHlwZTsKKworICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShNYWNoaW5lTG9vcCAqTCkgeyByZXR1cm4gTDsgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPmJlZ2luKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTi0+ZW5kKCk7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1lbU9wZXJhbmQuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3MmFhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8vPT0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIC0gTWFjaGluZU1lbU9wZXJhbmQgY2xhc3MgLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTWFjaGluZU1lbU9wZXJhbmQgY2xhc3MsIHdoaWNoIGlzIGEKKy8vIGRlc2NyaXB0aW9uIG9mIGEgbWVtb3J5IHJlZmVyZW5jZS4gSXQgaXMgdXNlZCB0byBoZWxwIHRyYWNrIGRlcGVuZGVuY2llcworLy8gaW4gdGhlIGJhY2tlbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORU1FTU9QRVJBTkRfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORU1FTU9QRVJBTkRfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVmFsdWU7CitjbGFzcyBGb2xkaW5nU2V0Tm9kZUlEOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gTWFjaGluZU1lbU9wZXJhbmQgLSBBIGRlc2NyaXB0aW9uIG9mIGEgbWVtb3J5IHJlZmVyZW5jZSB1c2VkIGluIHRoZSBiYWNrZW5kLgorLy8vIEluc3RlYWQgb2YgaG9sZGluZyBhIFN0b3JlSW5zdCBvciBMb2FkSW5zdCwgdGhpcyBjbGFzcyBob2xkcyB0aGUgYWRkcmVzcworLy8vIFZhbHVlIG9mIHRoZSByZWZlcmVuY2UgYWxvbmcgd2l0aCBhIGJ5dGUgc2l6ZSBhbmQgb2Zmc2V0LiBUaGlzIGFsbG93cyBpdAorLy8vIHRvIGRlc2NyaWJlIGxvd2VyZWQgbG9hZHMgYW5kIHN0b3Jlcy4gQWxzbywgdGhlIHNwZWNpYWwgUHNldWRvU291cmNlVmFsdWUKKy8vLyBvYmplY3RzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBsb2FkcyBhbmQgc3RvcmVzIHRvIG1lbW9yeSBsb2NhdGlvbnMKKy8vLyB0aGF0IGFyZW4ndCBleHBsaWNpdCBpbiB0aGUgcmVndWxhciBMTFZNIElSLgorLy8vCitjbGFzcyBNYWNoaW5lTWVtT3BlcmFuZCB7CisgIGludDY0X3QgT2Zmc2V0OworICB1aW50NjRfdCBTaXplOworICBjb25zdCBWYWx1ZSAqVjsKKyAgdW5zaWduZWQgaW50IEZsYWdzOworCitwdWJsaWM6CisgIC8vLyBGbGFncyB2YWx1ZXMuIFRoZXNlIG1heSBiZSBvcidkIHRvZ2V0aGVyLgorICBlbnVtIE1lbU9wZXJhbmRGbGFncyB7CisgICAgLy8vIFRoZSBtZW1vcnkgYWNjZXNzIHJlYWRzIGRhdGEuCisgICAgTU9Mb2FkID0gMSwKKyAgICAvLy8gVGhlIG1lbW9yeSBhY2Nlc3Mgd3JpdGVzIGRhdGEuCisgICAgTU9TdG9yZSA9IDIsCisgICAgLy8vIFRoZSBtZW1vcnkgYWNjZXNzIGlzIHZvbGF0aWxlLgorICAgIE1PVm9sYXRpbGUgPSA0LAorICAgIC8vLyBUaGUgbWVtb3J5IGFjY2VzcyBpcyBub24tdGVtcG9yYWwuCisgICAgTU9Ob25UZW1wb3JhbCA9IDgsCisgICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgd2UgbmVlZCB0byByZXByZXNlbnQgZmxhZ3MuCisgICAgTU9NYXhCaXRzID0gNAorICB9OworCisgIC8vLyBNYWNoaW5lTWVtT3BlcmFuZCAtIENvbnN0cnVjdCBhbiBNYWNoaW5lTWVtT3BlcmFuZCBvYmplY3Qgd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCBhZGRyZXNzIFZhbHVlLCBmbGFncywgb2Zmc2V0LCBzaXplLCBhbmQgYmFzZSBhbGlnbm1lbnQuCisgIE1hY2hpbmVNZW1PcGVyYW5kKGNvbnN0IFZhbHVlICp2LCB1bnNpZ25lZCBpbnQgZiwgaW50NjRfdCBvLCB1aW50NjRfdCBzLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmFzZV9hbGlnbm1lbnQpOworCisgIC8vLyBnZXRWYWx1ZSAtIFJldHVybiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgYWNjZXNzLiBUaGlzIG1heSBlaXRoZXIKKyAgLy8vIGJlIGEgbm9ybWFsIExMVk0gSVIgVmFsdWUsIG9yIG9uZSBvZiB0aGUgc3BlY2lhbCB2YWx1ZXMgdXNlZCBpbiBDb2RlR2VuLgorICAvLy8gU3BlY2lhbCB2YWx1ZXMgYXJlIHRob3NlIG9idGFpbmVkIHZpYQorICAvLy8gUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soaW50KSwgUHNldWRvU291cmNlVmFsdWU6OmdldFN0YWNrLCBhbmQKKyAgLy8vIG90aGVyIFBzZXVkb1NvdXJjZVZhbHVlIG1lbWJlciBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIG9iamVjdHMgd2hpY2ggc3RhbmQKKyAgLy8vIGZvciBmcmFtZS9zdGFjayBwb2ludGVyIHJlbGF0aXZlIHJlZmVyZW5jZXMgYW5kIG90aGVyIHNwZWNpYWwgcmVmZXJlbmNlcworICAvLy8gd2hpY2ggYXJlIG5vdCByZXByZXNlbnRhYmxlIGluIHRoZSBoaWdoLWxldmVsIElSLgorICBjb25zdCBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWOyB9CisKKyAgLy8vIGdldEZsYWdzIC0gUmV0dXJuIHRoZSByYXcgZmxhZ3Mgb2YgdGhlIHNvdXJjZSB2YWx1ZSwgXHNlZSBNZW1PcGVyYW5kRmxhZ3MuCisgIHVuc2lnbmVkIGludCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKCgxIDw8IE1PTWF4Qml0cykgLSAxKTsgfQorCisgIC8vLyBnZXRPZmZzZXQgLSBGb3Igbm9ybWFsIHZhbHVlcywgdGhpcyBpcyBhIGJ5dGUgb2Zmc2V0IGFkZGVkIHRvIHRoZSBiYXNlCisgIC8vLyBhZGRyZXNzLiBGb3IgUHNldWRvU291cmNlVmFsdWU6OkZQUmVsIHZhbHVlcywgdGhpcyBpcyB0aGUgRnJhbWVJbmRleAorICAvLy8gbnVtYmVyLgorICBpbnQ2NF90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorCisgIC8vLyBnZXRTaXplIC0gUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgcmVmZXJlbmNlLgorICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIC8vLyBnZXRBbGlnbm1lbnQgLSBSZXR1cm4gdGhlIG1pbmltdW0ga25vd24gYWxpZ25tZW50IGluIGJ5dGVzIG9mIHRoZQorICAvLy8gYWN0dWFsIG1lbW9yeSByZWZlcmVuY2UuCisgIHVpbnQ2NF90IGdldEFsaWdubWVudCgpIGNvbnN0OworCisgIC8vLyBnZXRCYXNlQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBtaW5pbXVtIGtub3duIGFsaWdubWVudCBpbiBieXRlcyBvZiB0aGUKKyAgLy8vIGJhc2UgYWRkcmVzcywgd2l0aG91dCB0aGUgb2Zmc2V0LgorICB1aW50NjRfdCBnZXRCYXNlQWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gKDF1IDw8IChGbGFncyA+PiBNT01heEJpdHMpKSA+PiAxOyB9CisKKyAgYm9vbCBpc0xvYWQoKSBjb25zdCB7IHJldHVybiBGbGFncyAmIE1PTG9hZDsgfQorICBib29sIGlzU3RvcmUoKSBjb25zdCB7IHJldHVybiBGbGFncyAmIE1PU3RvcmU7IH0KKyAgYm9vbCBpc1ZvbGF0aWxlKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiBNT1ZvbGF0aWxlOyB9CisgIGJvb2wgaXNOb25UZW1wb3JhbCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgTU9Ob25UZW1wb3JhbDsgfQorCisgIC8vLyByZWZpbmVBbGlnbm1lbnQgLSBVcGRhdGUgdGhpcyBNYWNoaW5lTWVtT3BlcmFuZCB0byByZWZsZWN0IHRoZSBhbGlnbm1lbnQKKyAgLy8vIG9mIE1NTywgaWYgaXQgaGFzIGEgZ3JlYXRlciBhbGlnbm1lbnQuIFRoaXMgbXVzdCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUKKyAgLy8vIG5ldyBhbGlnbm1lbnQgYXBwbGllcyB0byBhbGwgdXNlcnMgb2YgdGhpcyBNYWNoaW5lTWVtT3BlcmFuZC4KKyAgdm9pZCByZWZpbmVBbGlnbm1lbnQoY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIHNldFZhbHVlIC0gQ2hhbmdlIHRoZSBTb3VyY2VWYWx1ZSBmb3IgdGhpcyBNYWNoaW5lTWVtT3BlcmFuZC4gVGhpcworICAvLy8gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGFuIG9iamVjdCBpcyBiZWluZyByZWxvY2F0ZWQgYW5kIGFsbCByZWZlcmVuY2VzCisgIC8vLyB0byBpdCBhcmUgYmVpbmcgdXBkYXRlZC4KKyAgdm9pZCBzZXRWYWx1ZShjb25zdCBWYWx1ZSAqTmV3U1YpIHsgViA9IE5ld1NWOyB9CisKKyAgLy8vIFByb2ZpbGUgLSBHYXRoZXIgdW5pcXVlIGRhdGEgZm9yIHRoZSBvYmplY3QuCisgIC8vLworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAmTVJPKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTBjMTNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaApAQCAtMCwwICsxLDI3OCBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb2xsZWN0IG1ldGEgaW5mb3JtYXRpb24gZm9yIGEgbW9kdWxlLiAgVGhpcyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgaW4gYQorLy8gbmV1dHJhbCBmb3JtIHRoYXQgY2FuIGJlIHVzZWQgYnkgZGlmZmVyZW50IGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nCisvLyBzY2hlbWVzLgorLy8KKy8vIFRoZSBvcmdhbml6YXRpb24gb2YgaW5mb3JtYXRpb24gaXMgcHJpbWFyaWx5IGNsdXN0ZXJlZCBhcm91bmQgdGhlIHNvdXJjZQorLy8gY29tcGlsZSB1bml0cy4gIFRoZSBtYWluIGV4Y2VwdGlvbiBpcyBzb3VyY2UgbGluZSBjb3JyZXNwb25kZW5jZSB3aGVyZQorLy8gaW5saW5pbmcgbWF5IGludGVybGVhdmUgY29kZSBmcm9tIHZhcmlvdXMgY29tcGlsZSB1bml0cy4KKy8vCisvLyBUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgTWFjaGluZU1vZHVsZUluZm8uCisvLworLy8gIC0tIFNvdXJjZSBkaXJlY3RvcmllcyAtIERpcmVjdG9yaWVzIGFyZSB1bmlxdWVkIGJhc2VkIG9uIHRoZWlyIGNhbm9uaWNhbAorLy8gICAgIHN0cmluZyBhbmQgYXNzaWduZWQgYSBzZXF1ZW50aWFsIG51bWVyaWMgSUQgKGJhc2UgMS4pCisvLyAgLS0gU291cmNlIGZpbGVzIC0gRmlsZXMgYXJlIGFsc28gdW5pcXVlZCBiYXNlZCBvbiB0aGVpciBuYW1lIGFuZCBkaXJlY3RvcnkKKy8vICAgICBJRC4gIEEgZmlsZSBJRCBpcyBzZXF1ZW50aWFsIG51bWJlciAoYmFzZSAxLikKKy8vICAtLSBTb3VyY2UgbGluZSBjb3JyZXNwb25kZW5jZSAtIEEgdmVjdG9yIG9mIGZpbGUgSUQsIGxpbmUjLCBjb2x1bW4jIHRyaXBsZXMuCisvLyAgICAgQSBERUJVR19MT0NBVElPTiBpbnN0cnVjdGlvbiBpcyBnZW5lcmF0ZWQgIGJ5IHRoZSBEQUcgTGVnYWxpemVyCisvLyAgICAgY29ycmVzcG9uZGluZyB0byBlYWNoIGVudHJ5IGluIHRoZSBzb3VyY2UgbGluZSBsaXN0LiAgVGhpcyBhbGxvd3MgYSBkZWJ1ZworLy8gICAgIGVtaXR0ZXIgdG8gZ2VuZXJhdGUgbGFiZWxzIHJlZmVyZW5jZWQgYnkgZGVidWcgaW5mb3JtYXRpb24gdGFibGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVNT0RVTEVJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVNT0RVTEVJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCitjbGFzcyBDb25zdGFudDsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgTUROb2RlOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNb2R1bGU7CitjbGFzcyBQb2ludGVyVHlwZTsKK2NsYXNzIFN0cnVjdFR5cGU7CisgIAorLy8vIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCAtIFRoaXMgY2xhc3MgY2FuIGJlIGRlcml2ZWQgZnJvbSBhbmQgdXNlZCBieSB0YXJnZXRzCisvLy8gdG8gaG9sZCBwcml2YXRlIHRhcmdldC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBNb2R1bGUuICBPYmplY3RzIG9mCisvLy8gdHlwZSBhcmUgYWNjZXNzZWQvY3JlYXRlZCB3aXRoIE1NSTo6Z2V0SW5mbyBhbmQgZGVzdHJveWVkIHdoZW4gdGhlCisvLy8gTWFjaGluZU1vZHVsZUluZm8gaXMgZGVzdHJveWVkLgorY2xhc3MgTWFjaGluZU1vZHVsZUluZm9JbXBsIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBQb2ludGVySW50UGFpcjxNQ1N5bWJvbCosIDEsIGJvb2w+IFN0dWJWYWx1ZVR5OworICB2aXJ0dWFsIH5NYWNoaW5lTW9kdWxlSW5mb0ltcGwoKTsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8TUNTeW1ib2wqLCBTdHViVmFsdWVUeT4gPiBTeW1ib2xMaXN0VHk7Citwcm90ZWN0ZWQ6CisgIHN0YXRpYyBTeW1ib2xMaXN0VHkgR2V0U29ydGVkU3R1YnMoY29uc3QgRGVuc2VNYXA8TUNTeW1ib2wqLCBTdHViVmFsdWVUeT4mKTsKK307CisKK2NsYXNzIE1NSUFkZHJMYWJlbE1hcDsKKyAgCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIE1hY2hpbmVNb2R1bGVJbmZvIC0gVGhpcyBjbGFzcyBjb250YWlucyBtZXRhIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEKKy8vLyBtb2R1bGUuICBRdWVyaWVzIGNhbiBiZSBtYWRlIGJ5IGRpZmZlcmVudCBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBoYW5kbGluZyAKKy8vLyBzY2hlbWVzIGFuZCByZWZvcm1hdGVkIGZvciBzcGVjaWZpYyB1c2UuCisvLy8KK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICAvLy8gQ29udGV4dCAtIFRoaXMgaXMgdGhlIE1DQ29udGV4dCB1c2VkIGZvciB0aGUgZW50aXJlIGNvZGUgZ2VuZXJhdG9yLgorICBNQ0NvbnRleHQgQ29udGV4dDsKKyAgCisgIC8vLyBUaGVNb2R1bGUgLSBUaGlzIGlzIHRoZSBMTFZNIE1vZHVsZSBiZWluZyB3b3JrZWQgb24uCisgIGNvbnN0IE1vZHVsZSAqVGhlTW9kdWxlOworICAKKyAgLy8vIE9iakZpbGVNTUkgLSBUaGlzIGlzIHRoZSBvYmplY3QtZmlsZS1mb3JtYXQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YKKyAgLy8vIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCwgd2hpY2ggbGV0cyB0YXJnZXRzIGFjY3VtdWxhdGUgd2hhdGV2ZXIgaW5mbyB0aGV5CisgIC8vLyB3YW50LgorICBNYWNoaW5lTW9kdWxlSW5mb0ltcGwgKk9iakZpbGVNTUk7CisKKyAgLy8gRnJhbWVNb3ZlcyAtIExpc3Qgb2YgbW92ZXMgZG9uZSBieSBhIGZ1bmN0aW9uJ3MgcHJvbG9nLiAgVXNlZCB0byBjb25zdHJ1Y3QKKyAgLy8gZnJhbWUgbWFwcyBieSBkZWJ1ZyBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nIGNvbnN1bWVycy4KKyAgc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+IEZyYW1lTW92ZXM7CisKKyAgLy8gTWFwIG9mIGludm9rZSBjYWxsIHNpdGUgaW5kZXggdmFsdWVzIHRvIGFzc29jaWF0ZWQgYmVnaW4gRUhfTEFCRUwgZm9yCisgIC8vIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBEZW5zZU1hcDxNQ1N5bWJvbCosIHVuc2lnbmVkPiBDYWxsU2l0ZU1hcDsKKworICAvLyBUaGUgY3VycmVudCBjYWxsIHNpdGUgaW5kZXggYmVpbmcgcHJvY2Vzc2VkLCBpZiBhbnkuIDAgaWYgbm9uZS4KKyAgdW5zaWduZWQgQ3VyQ2FsbFNpdGU7CisKKyAgLy8gVHlwZUluZm9zIC0gTGlzdCBvZiBDKysgVHlwZUluZm8gdXNlZCBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgLy8KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgR2xvYmFsVmFyaWFibGUgKj4gVHlwZUluZm9zOworCisgIC8vIEZpbHRlcklkcyAtIExpc3Qgb2YgdHlwZWlkcyBlbmNvZGluZyBmaWx0ZXJzIHVzZWQgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIC8vCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBGaWx0ZXJJZHM7CisKKyAgLy8gRmlsdGVyRW5kcyAtIExpc3Qgb2YgdGhlIGluZGljZXMgaW4gRmlsdGVySWRzIGNvcnJlc3BvbmRpbmcgdG8gZmlsdGVyCisgIC8vIHRlcm1pbmF0b3JzLgorICAvLworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gRmlsdGVyRW5kczsKKworICAvLy8gVXNlZEZ1bmN0aW9ucyAtIFRoZSBmdW5jdGlvbnMgaW4gdGhlIEBsbHZtLnVzZWQgbGlzdCBpbiBhIG1vcmUgZWFzaWx5CisgIC8vLyBzZWFyY2hhYmxlIGZvcm1hdC4gIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgZnVuY3Rpb25zIGluCisgIC8vLyBsbHZtLmNvbXBpbGVyLnVzZWQuCisgIFNtYWxsUHRyU2V0PGNvbnN0IEZ1bmN0aW9uICosIDMyPiBVc2VkRnVuY3Rpb25zOworCisgIAorICAvLy8gQWRkckxhYmVsU3ltYm9scyAtIFRoaXMgbWFwIGtlZXBzIHRyYWNrIG9mIHdoaWNoIHN5bWJvbCBpcyBiZWluZyB1c2VkIGZvcgorICAvLy8gdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jaydzIGFkZHJlc3Mgb2YgbGFiZWwuCisgIE1NSUFkZHJMYWJlbE1hcCAqQWRkckxhYmVsU3ltYm9sczsKKyAKKyAgLy8vIERiZ0luZm9BdmFpbGFibGUgLSBUcnVlIGlmIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKyAgLy8vIGluIHRoaXMgbW9kdWxlLgorICBib29sIERiZ0luZm9BdmFpbGFibGU7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICB0eXBlZGVmIHN0ZDo6cGFpcjx1bnNpZ25lZCwgRGVidWdMb2M+IFVuc2lnbmVkRGVidWdMb2NQYWlyOworICB0eXBlZGVmIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxUcmFja2luZ1ZIPE1ETm9kZT4sIFVuc2lnbmVkRGVidWdMb2NQYWlyPiwgND4KKyAgICBWYXJpYWJsZURiZ0luZm9NYXBUeTsKKyAgVmFyaWFibGVEYmdJbmZvTWFwVHkgVmFyaWFibGVEYmdJbmZvOworCisgIE1hY2hpbmVNb2R1bGVJbmZvKCk7ICAvLyBEVU1NWSBDT05TVFJVQ1RPUiwgRE8gTk9UIENBTEwuCisgIE1hY2hpbmVNb2R1bGVJbmZvKGNvbnN0IE1DQXNtSW5mbyAmTUFJKTsgIC8vIFJlYWwgY29uc3RydWN0b3IuCisgIH5NYWNoaW5lTW9kdWxlSW5mbygpOworICAKKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKCk7CisgIGJvb2wgZG9GaW5hbGl6YXRpb24oKTsKKworICAvLy8gRW5kRnVuY3Rpb24gLSBEaXNjYXJkIGZ1bmN0aW9uIG1ldGEgaW5mb3JtYXRpb24uCisgIC8vLworICB2b2lkIEVuZEZ1bmN0aW9uKCk7CisgIAorICBjb25zdCBNQ0NvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9CisgIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIHsgcmV0dXJuIENvbnRleHQ7IH0KKworICB2b2lkIHNldE1vZHVsZShjb25zdCBNb2R1bGUgKk0pIHsgVGhlTW9kdWxlID0gTTsgfQorICBjb25zdCBNb2R1bGUgKmdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIFRoZU1vZHVsZTsgfQorICAKKyAgLy8vIGdldEluZm8gLSBLZWVwIHRyYWNrIG9mIHZhcmlvdXMgcGVyLWZ1bmN0aW9uIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBmb3IKKyAgLy8vIGJhY2tlbmRzIHRoYXQgd291bGQgbGlrZSB0byBkbyBzby4KKyAgLy8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5PgorICBUeSAmZ2V0T2JqRmlsZUluZm8oKSB7CisgICAgaWYgKE9iakZpbGVNTUkgPT0gMCkKKyAgICAgIE9iakZpbGVNTUkgPSBuZXcgVHkoKnRoaXMpOworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8VHkqPihPYmpGaWxlTU1JKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHk+CisgIGNvbnN0IFR5ICZnZXRPYmpGaWxlSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNYWNoaW5lTW9kdWxlSW5mbyo+KHRoaXMpLT5nZXRPYmpGaWxlSW5mbzxUeT4oKTsKKyAgfQorICAKKyAgLy8vIEFuYWx5emVNb2R1bGUgLSBTY2FuIHRoZSBtb2R1bGUgZm9yIGdsb2JhbCBkZWJ1ZyBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIHZvaWQgQW5hbHl6ZU1vZHVsZShjb25zdCBNb2R1bGUgJk0pOworICAKKyAgLy8vIGhhc0RlYnVnSW5mbyAtIFJldHVybnMgdHJ1ZSBpZiB2YWxpZCBkZWJ1ZyBpbmZvIGlzIHByZXNlbnQuCisgIC8vLworICBib29sIGhhc0RlYnVnSW5mbygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZvaWQgc2V0RGVidWdJbmZvQXZhaWxhYmlsaXR5KGJvb2wgYXZhaWwpIHsgRGJnSW5mb0F2YWlsYWJsZSA9IHRydWU7IH0KKyAgCisgIC8vLyBnZXRGcmFtZU1vdmVzIC0gUmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGxpc3Qgb2YgbW92ZXMgZG9uZSBpbiB0aGUgY3VycmVudAorICAvLy8gZnVuY3Rpb24ncyBwcm9sb2d1ZS4gIFVzZWQgdG8gY29uc3RydWN0IGZyYW1lIG1hcHMgZm9yIGRlYnVnIGFuZCBleGNlcHRpb24KKyAgLy8vIGhhbmRsaW5nIGNvbXN1bWVycy4KKyAgc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+ICZnZXRGcmFtZU1vdmVzKCkgeyByZXR1cm4gRnJhbWVNb3ZlczsgfQorICAKKyAgLy8vIGdldEFkZHJMYWJlbFN5bWJvbCAtIFJldHVybiB0aGUgc3ltYm9sIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQgYmFzaWMKKyAgLy8vIGJsb2NrIHdoZW4gaXRzIGFkZHJlc3MgaXMgdGFrZW4uICBUaGlzIGNhbm5vdCBiZSBpdHMgbm9ybWFsIExCQiBsYWJlbAorICAvLy8gYmVjYXVzZSB0aGUgYmxvY2sgbWF5IGJlIGFjY2Vzc2VkIG91dHNpZGUgaXRzIGNvbnRhaW5pbmcgZnVuY3Rpb24uCisgIE1DU3ltYm9sICpnZXRBZGRyTGFiZWxTeW1ib2woY29uc3QgQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBnZXRBZGRyTGFiZWxTeW1ib2xUb0VtaXQgLSBSZXR1cm4gdGhlIHN5bWJvbCB0byBiZSB1c2VkIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBiYXNpYyBibG9jayB3aGVuIGl0cyBhZGRyZXNzIGlzIHRha2VuLiAgSWYgb3RoZXIgYmxvY2tzIHdlcmUgUkFVVydkIHRvCisgIC8vLyB0aGlzIG9uZSwgd2UgbWF5IGhhdmUgdG8gZW1pdCB0aGVtIGFzIHdlbGwsIHJldHVybiB0aGUgd2hvbGUgc2V0LgorICBzdGQ6OnZlY3RvcjxNQ1N5bWJvbCo+IGdldEFkZHJMYWJlbFN5bWJvbFRvRW1pdChjb25zdCBCYXNpY0Jsb2NrICpCQik7CisgIAorICAvLy8gdGFrZURlbGV0ZWRTeW1ib2xzRm9yRnVuY3Rpb24gLSBJZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGhhcyBoYWQgYW55CisgIC8vLyByZWZlcmVuY2VzIHRvIGFkZHJlc3MtdGFrZW4gYmxvY2tzIGdlbmVyYXRlZCwgYnV0IHRoZSBibG9jayBnb3QgZGVsZXRlZCwKKyAgLy8vIHJldHVybiB0aGUgc3ltYm9sIG5vdyBzbyB3ZSBjYW4gZW1pdCBpdC4gIFRoaXMgcHJldmVudHMgZW1pdHRpbmcgYQorICAvLy8gcmVmZXJlbmNlIHRvIGEgc3ltYm9sIHRoYXQgaGFzIG5vIGRlZmluaXRpb24uCisgIHZvaWQgdGFrZURlbGV0ZWRTeW1ib2xzRm9yRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKkYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4gJlJlc3VsdCk7CisKKyAgLy8vIGlzVXNlZEZ1bmN0aW9uIC0gUmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgbGx2bS51c2VkIGxpc3QuICBUaGlzCisgIC8vLyBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBmb3IgdGhpbmdzIGluIGxsdm0uY29tcGlsZXIudXNlZCB1bmxlc3MgdGhleSBhcmUgYWxzbworICAvLy8gaW4gbGx2bS51c2VkLgorICBib29sIGlzVXNlZEZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIFVzZWRGdW5jdGlvbnMuY291bnQoRik7CisgIH0KKworICAvLy8gYWRkQ2F0Y2hUeXBlSW5mbyAtIFByb3ZpZGUgdGhlIGNhdGNoIHR5cGVpbmZvIGZvciBhIGxhbmRpbmcgcGFkLgorICAvLy8KKyAgdm9pZCBhZGRDYXRjaFR5cGVJbmZvKE1hY2hpbmVCYXNpY0Jsb2NrICpMYW5kaW5nUGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgR2xvYmFsVmFyaWFibGUgKj4gJlR5SW5mbyk7CisKKyAgLy8vIGFkZEZpbHRlclR5cGVJbmZvIC0gUHJvdmlkZSB0aGUgZmlsdGVyIHR5cGVpbmZvIGZvciBhIGxhbmRpbmcgcGFkLgorICAvLy8KKyAgdm9pZCBhZGRGaWx0ZXJUeXBlSW5mbyhNYWNoaW5lQmFzaWNCbG9jayAqTGFuZGluZ1BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBHbG9iYWxWYXJpYWJsZSAqPiAmVHlJbmZvKTsKKworICAvLy8gYWRkQ2xlYW51cCAtIEFkZCBhIGNsZWFudXAgYWN0aW9uIGZvciBhIGxhbmRpbmcgcGFkLgorICAvLy8KKyAgdm9pZCBhZGRDbGVhbnVwKE1hY2hpbmVCYXNpY0Jsb2NrICpMYW5kaW5nUGFkKTsKKworICAvLy8gZ2V0VHlwZUlERm9yIC0gUmV0dXJuIHRoZSB0eXBlIGlkIGZvciB0aGUgc3BlY2lmaWVkIHR5cGVpbmZvLiAgVGhpcyBpcyAKKyAgLy8vIGZ1bmN0aW9uIHdpZGUuCisgIHVuc2lnbmVkIGdldFR5cGVJREZvcihjb25zdCBHbG9iYWxWYXJpYWJsZSAqVEkpOworCisgIC8vLyBnZXRGaWx0ZXJJREZvciAtIFJldHVybiB0aGUgaWQgb2YgdGhlIGZpbHRlciBlbmNvZGVkIGJ5IFR5SWRzLiAgVGhpcyBpcworICAvLy8gZnVuY3Rpb24gd2lkZS4KKyAgaW50IGdldEZpbHRlcklERm9yKHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmVHlJZHMpOworCisgIC8vLyBzZXRDYWxsU2l0ZUJlZ2luTGFiZWwgLSBNYXAgdGhlIGJlZ2luIGxhYmVsIGZvciBhIGNhbGwgc2l0ZQorICB2b2lkIHNldENhbGxTaXRlQmVnaW5MYWJlbChNQ1N5bWJvbCAqQmVnaW5MYWJlbCwgdW5zaWduZWQgU2l0ZSkgeworICAgIENhbGxTaXRlTWFwW0JlZ2luTGFiZWxdID0gU2l0ZTsKKyAgfQorCisgIC8vLyBnZXRDYWxsU2l0ZUJlZ2luTGFiZWwgLSBHZXQgdGhlIGNhbGwgc2l0ZSBudW1iZXIgZm9yIGEgYmVnaW4gbGFiZWwKKyAgdW5zaWduZWQgZ2V0Q2FsbFNpdGVCZWdpbkxhYmVsKE1DU3ltYm9sICpCZWdpbkxhYmVsKSB7CisgICAgYXNzZXJ0KENhbGxTaXRlTWFwLmNvdW50KEJlZ2luTGFiZWwpICYmCisgICAgICAgICAgICJNaXNzaW5nIGNhbGwgc2l0ZSBudW1iZXIgZm9yIEVIX0xBQkVMISIpOworICAgIHJldHVybiBDYWxsU2l0ZU1hcFtCZWdpbkxhYmVsXTsKKyAgfQorCisgIC8vLyBzZXRDdXJyZW50Q2FsbFNpdGUgLSBTZXQgdGhlIGNhbGwgc2l0ZSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLgorICB2b2lkIHNldEN1cnJlbnRDYWxsU2l0ZSh1bnNpZ25lZCBTaXRlKSB7IEN1ckNhbGxTaXRlID0gU2l0ZTsgfQorCisgIC8vLyBnZXRDdXJyZW50Q2FsbFNpdGUgLSBHZXQgdGhlIGNhbGwgc2l0ZSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLCBpZiBhbnkuCisgIC8vLyByZXR1cm4gemVybyBpZiBub25lLgorICB1bnNpZ25lZCBnZXRDdXJyZW50Q2FsbFNpdGUodm9pZCkgeyByZXR1cm4gQ3VyQ2FsbFNpdGU7IH0KKworICAvLy8gZ2V0VHlwZUluZm9zIC0gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBDKysgdHlwZWluZm8gZm9yIHRoZSBjdXJyZW50CisgIC8vLyBmdW5jdGlvbi4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgR2xvYmFsVmFyaWFibGUgKj4gJmdldFR5cGVJbmZvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUluZm9zOworICB9CisKKyAgLy8vIGdldEZpbHRlcklkcyAtIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZWlkcyBlbmNvZGluZyBmaWx0ZXJzIHVzZWQgaW4KKyAgLy8vIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJmdldEZpbHRlcklkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmlsdGVySWRzOworICB9CisKKyAgLy8vIGdldFBlcnNvbmFsaXR5IC0gUmV0dXJuIGEgcGVyc29uYWxpdHkgZnVuY3Rpb24gaWYgYXZhaWxhYmxlLiAgVGhlIHByZXNlbmNlCisgIC8vLyBvZiBvbmUgaXMgcmVxdWlyZWQgdG8gZW1pdCBleGNlcHRpb24gaGFuZGxpbmcgaW5mby4KKyAgY29uc3QgRnVuY3Rpb24gKmdldFBlcnNvbmFsaXR5KCkgY29uc3Q7CisKKyAgLy8vIHNldFZhcmlhYmxlRGJnSW5mbyAtIENvbGxlY3QgaW5mb3JtYXRpb24gdXNlZCB0byBlbWl0IGRlYnVnZ2luZworICAvLy8gaW5mb3JtYXRpb24gb2YgYSB2YXJpYWJsZS4KKyAgdm9pZCBzZXRWYXJpYWJsZURiZ0luZm8oTUROb2RlICpOLCB1bnNpZ25lZCBTbG90LCBEZWJ1Z0xvYyBMb2MpIHsKKyAgICBWYXJpYWJsZURiZ0luZm8ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE4sIHN0ZDo6bWFrZV9wYWlyKFNsb3QsIExvYykpKTsKKyAgfQorCisgIFZhcmlhYmxlRGJnSW5mb01hcFR5ICZnZXRWYXJpYWJsZURiZ0luZm8oKSB7IHJldHVybiBWYXJpYWJsZURiZ0luZm87IH0KKworfTsgLy8gRW5kIGNsYXNzIE1hY2hpbmVNb2R1bGVJbmZvCisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MDFmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mb0ltcGxzLmgKQEAgLTAsMCArMSw5NyBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBvYmplY3QtZmlsZSBmb3JtYXQgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mCisvLyBNYWNoaW5lTW9kdWxlSW5mb0ltcGwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORU1PRFVMRUlORk9JTVBMU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FTU9EVUxFSU5GT0lNUExTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1DU3ltYm9sOworCisgIC8vLyBNYWNoaW5lTW9kdWxlSW5mb01hY2hPIC0gVGhpcyBpcyBhIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCBpbXBsZW1lbnRhdGlvbgorICAvLy8gZm9yIE1hY2hPIHRhcmdldHMuCisgIGNsYXNzIE1hY2hpbmVNb2R1bGVJbmZvTWFjaE8gOiBwdWJsaWMgTWFjaGluZU1vZHVsZUluZm9JbXBsIHsKKyAgICAvLy8gRm5TdHVicyAtIERhcndpbiAnJHN0dWInIHN0dWJzLiAgVGhlIGtleSBpcyBzb21ldGhpbmcgbGlrZSAiTGZvbyRzdHViIiwKKyAgICAvLy8gdGhlIHZhbHVlIGlzIHNvbWV0aGluZyBsaWtlICJfZm9vIi4KKyAgICBEZW5zZU1hcDxNQ1N5bWJvbCosIFN0dWJWYWx1ZVR5PiBGblN0dWJzOworICAgIAorICAgIC8vLyBHVlN0dWJzIC0gRGFyd2luICckbm9uX2xhenlfcHRyJyBzdHVicy4gIFRoZSBrZXkgaXMgc29tZXRoaW5nIGxpa2UKKyAgICAvLy8gIkxmb28kbm9uX2xhenlfcHRyIiwgdGhlIHZhbHVlIGlzIHNvbWV0aGluZyBsaWtlICJfZm9vIi4gVGhlIGV4dHJhIGJpdAorICAgIC8vLyBpcyB0cnVlIGlmIHRoaXMgR1YgaXMgZXh0ZXJuYWwuCisgICAgRGVuc2VNYXA8TUNTeW1ib2wqLCBTdHViVmFsdWVUeT4gR1ZTdHViczsKKyAgICAKKyAgICAvLy8gSGlkZGVuR1ZTdHVicyAtIERhcndpbiAnJG5vbl9sYXp5X3B0cicgc3R1YnMuICBUaGUga2V5IGlzIHNvbWV0aGluZyBsaWtlCisgICAgLy8vICJMZm9vJG5vbl9sYXp5X3B0ciIsIHRoZSB2YWx1ZSBpcyBzb21ldGhpbmcgbGlrZSAiX2ZvbyIuICBVbmxpa2UgR1ZTdHVicworICAgIC8vLyB0aGVzZSBhcmUgZm9yIHRoaW5ncyB3aXRoIGhpZGRlbiB2aXNpYmlsaXR5LiBUaGUgZXh0cmEgYml0IGlzIHRydWUgaWYKKyAgICAvLy8gdGhpcyBHViBpcyBleHRlcm5hbC4KKyAgICBEZW5zZU1hcDxNQ1N5bWJvbCosIFN0dWJWYWx1ZVR5PiBIaWRkZW5HVlN0dWJzOworICAgIAorICAgIHZpcnR1YWwgdm9pZCBBbmNob3IoKTsgIC8vIE91dCBvZiBsaW5lIHZpcnR1YWwgbWV0aG9kLgorICBwdWJsaWM6CisgICAgTWFjaGluZU1vZHVsZUluZm9NYWNoTyhjb25zdCBNYWNoaW5lTW9kdWxlSW5mbyAmKSB7fQorICAgIAorICAgIFN0dWJWYWx1ZVR5ICZnZXRGblN0dWJFbnRyeShNQ1N5bWJvbCAqU3ltKSB7CisgICAgICBhc3NlcnQoU3ltICYmICJLZXkgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgIHJldHVybiBGblN0dWJzW1N5bV07CisgICAgfQorCisgICAgU3R1YlZhbHVlVHkgJmdldEdWU3R1YkVudHJ5KE1DU3ltYm9sICpTeW0pIHsKKyAgICAgIGFzc2VydChTeW0gJiYgIktleSBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgcmV0dXJuIEdWU3R1YnNbU3ltXTsKKyAgICB9CisKKyAgICBTdHViVmFsdWVUeSAmZ2V0SGlkZGVuR1ZTdHViRW50cnkoTUNTeW1ib2wgKlN5bSkgeworICAgICAgYXNzZXJ0KFN5bSAmJiAiS2V5IGNhbm5vdCBiZSBudWxsIik7CisgICAgICByZXR1cm4gSGlkZGVuR1ZTdHVic1tTeW1dOworICAgIH0KKworICAgIC8vLyBBY2Nlc3NvciBtZXRob2RzIHRvIHJldHVybiB0aGUgc2V0IG9mIHN0dWJzIGluIHNvcnRlZCBvcmRlci4KKyAgICBTeW1ib2xMaXN0VHkgR2V0Rm5TdHViTGlzdCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBHZXRTb3J0ZWRTdHVicyhGblN0dWJzKTsKKyAgICB9CisgICAgU3ltYm9sTGlzdFR5IEdldEdWU3R1Ykxpc3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gR2V0U29ydGVkU3R1YnMoR1ZTdHVicyk7CisgICAgfQorICAgIFN5bWJvbExpc3RUeSBHZXRIaWRkZW5HVlN0dWJMaXN0KCkgY29uc3QgeworICAgICAgcmV0dXJuIEdldFNvcnRlZFN0dWJzKEhpZGRlbkdWU3R1YnMpOworICAgIH0KKyAgfTsKKworICAvLy8gTWFjaGluZU1vZHVsZUluZm9FTEYgLSBUaGlzIGlzIGEgTWFjaGluZU1vZHVsZUluZm9JbXBsIGltcGxlbWVudGF0aW9uCisgIC8vLyBmb3IgRUxGIHRhcmdldHMuCisgIGNsYXNzIE1hY2hpbmVNb2R1bGVJbmZvRUxGIDogcHVibGljIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCB7CisgICAgLy8vIEdWU3R1YnMgLSBUaGVzZSBzdHVicyBhcmUgdXNlZCB0byBtYXRlcmlhbGl6ZSBnbG9iYWwgYWRkcmVzc2VzIGluIFBJQworICAgIC8vLyBtb2RlLgorICAgIERlbnNlTWFwPE1DU3ltYm9sKiwgU3R1YlZhbHVlVHk+IEdWU3R1YnM7CisKKyAgICB2aXJ0dWFsIHZvaWQgQW5jaG9yKCk7ICAvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZC4KKyAgcHVibGljOgorICAgIE1hY2hpbmVNb2R1bGVJbmZvRUxGKGNvbnN0IE1hY2hpbmVNb2R1bGVJbmZvICYpIHt9CisKKyAgICBTdHViVmFsdWVUeSAmZ2V0R1ZTdHViRW50cnkoTUNTeW1ib2wgKlN5bSkgeworICAgICAgYXNzZXJ0KFN5bSAmJiAiS2V5IGNhbm5vdCBiZSBudWxsIik7CisgICAgICByZXR1cm4gR1ZTdHVic1tTeW1dOworICAgIH0KKworICAgIC8vLyBBY2Nlc3NvciBtZXRob2RzIHRvIHJldHVybiB0aGUgc2V0IG9mIHN0dWJzIGluIHNvcnRlZCBvcmRlci4KKworICAgIFN5bWJvbExpc3RUeSBHZXRHVlN0dWJMaXN0KCkgY29uc3QgeworICAgICAgcmV0dXJuIEdldFNvcnRlZFN0dWJzKEdWU3R1YnMpOworICAgIH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lT3BlcmFuZC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU9wZXJhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmEyYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU9wZXJhbmQuaApAQCAtMCwwICsxLDU0MiBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTWFjaGluZU9wZXJhbmQuaCAtIE1hY2hpbmVPcGVyYW5kIGNsYXNzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNYWNoaW5lT3BlcmFuZCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FT1BFUkFORF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FT1BFUkFORF9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisgIAorY2xhc3MgQmxvY2tBZGRyZXNzOworY2xhc3MgQ29uc3RhbnRGUDsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgTUROb2RlOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgTUNTeW1ib2w7CisgIAorLy8vIE1hY2hpbmVPcGVyYW5kIGNsYXNzIC0gUmVwcmVzZW50YXRpb24gb2YgZWFjaCBtYWNoaW5lIGluc3RydWN0aW9uIG9wZXJhbmQuCisvLy8KK2NsYXNzIE1hY2hpbmVPcGVyYW5kIHsKK3B1YmxpYzoKKyAgZW51bSBNYWNoaW5lT3BlcmFuZFR5cGUgeworICAgIE1PX1JlZ2lzdGVyLCAgICAgICAgICAgICAgIC8vLzwgUmVnaXN0ZXIgb3BlcmFuZC4KKyAgICBNT19JbW1lZGlhdGUsICAgICAgICAgICAgICAvLy88IEltbWVkaWF0ZSBvcGVyYW5kCisgICAgTU9fRlBJbW1lZGlhdGUsICAgICAgICAgICAgLy8vPCBGbG9hdGluZy1wb2ludCBpbW1lZGlhdGUgb3BlcmFuZAorICAgIE1PX01hY2hpbmVCYXNpY0Jsb2NrLCAgICAgIC8vLzwgTWFjaGluZUJhc2ljQmxvY2sgcmVmZXJlbmNlCisgICAgTU9fRnJhbWVJbmRleCwgICAgICAgICAgICAgLy8vPCBBYnN0cmFjdCBTdGFjayBGcmFtZSBJbmRleAorICAgIE1PX0NvbnN0YW50UG9vbEluZGV4LCAgICAgIC8vLzwgQWRkcmVzcyBvZiBpbmRleGVkIENvbnN0YW50IGluIENvbnN0YW50IFBvb2wKKyAgICBNT19KdW1wVGFibGVJbmRleCwgICAgICAgICAvLy88IEFkZHJlc3Mgb2YgaW5kZXhlZCBKdW1wIFRhYmxlIGZvciBzd2l0Y2gKKyAgICBNT19FeHRlcm5hbFN5bWJvbCwgICAgICAgICAvLy88IE5hbWUgb2YgZXh0ZXJuYWwgZ2xvYmFsIHN5bWJvbAorICAgIE1PX0dsb2JhbEFkZHJlc3MsICAgICAgICAgIC8vLzwgQWRkcmVzcyBvZiBhIGdsb2JhbCB2YWx1ZQorICAgIE1PX0Jsb2NrQWRkcmVzcywgICAgICAgICAgIC8vLzwgQWRkcmVzcyBvZiBhIGJhc2ljIGJsb2NrCisgICAgTU9fTWV0YWRhdGEsICAgICAgICAgICAgICAgLy8vPCBNZXRhZGF0YSByZWZlcmVuY2UgKGZvciBkZWJ1ZyBpbmZvKQorICAgIE1PX01DU3ltYm9sICAgICAgICAgICAgICAgIC8vLzwgTUNTeW1ib2wgcmVmZXJlbmNlIChmb3IgZGVidWcvZWggaW5mbykKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIE9wS2luZCAtIFNwZWNpZnkgd2hhdCBraW5kIG9mIG9wZXJhbmQgdGhpcyBpcy4gIFRoaXMgZGlzY3JpbWluYXRlcyB0aGUKKyAgLy8vIHVuaW9uLgorICB1bnNpZ25lZCBjaGFyIE9wS2luZDsgLy8gTWFjaGluZU9wZXJhbmRUeXBlCisgIAorICAvLy8gU3ViUmVnIC0gU3VicmVnaXN0ZXIgbnVtYmVyLCBvbmx5IHZhbGlkIGZvciBNT19SZWdpc3Rlci4gIEEgdmFsdWUgb2YgMAorICAvLy8gaW5kaWNhdGVzIHRoZSBNT19SZWdpc3RlciBoYXMgbm8gc3ViUmVnLgorICB1bnNpZ25lZCBjaGFyIFN1YlJlZzsKKyAgCisgIC8vLyBUYXJnZXRGbGFncyAtIFRoaXMgaXMgYSBzZXQgb2YgdGFyZ2V0LXNwZWNpZmljIG9wZXJhbmQgZmxhZ3MuCisgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3M7CisgIAorICAvLy8gSXNEZWYvSXNJbXAvSXNLaWxsL0lzRGVhZCBmbGFncyAtIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciBNT19SZWdpc3RlcgorICAvLy8gb3BlcmFuZHMuCisgIAorICAvLy8gSXNEZWYgLSBUcnVlIGlmIHRoaXMgaXMgYSBkZWYsIGZhbHNlIGlmIHRoaXMgaXMgYSB1c2Ugb2YgdGhlIHJlZ2lzdGVyLgorICAvLy8KKyAgYm9vbCBJc0RlZiA6IDE7CisgIAorICAvLy8gSXNJbXAgLSBUcnVlIGlmIHRoaXMgaXMgYW4gaW1wbGljaXQgZGVmIG9yIHVzZSwgZmFsc2UgaWYgaXQgaXMgZXhwbGljaXQuCisgIC8vLworICBib29sIElzSW1wIDogMTsKKworICAvLy8gSXNLaWxsIC0gVHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIHRoZSBsYXN0IHVzZSBvZiB0aGUgcmVnaXN0ZXIgb24gdGhpcworICAvLy8gcGF0aCB0aHJvdWdoIHRoZSBmdW5jdGlvbi4gIFRoaXMgaXMgb25seSB2YWxpZCBvbiB1c2VzIG9mIHJlZ2lzdGVycy4KKyAgYm9vbCBJc0tpbGwgOiAxOworCisgIC8vLyBJc0RlYWQgLSBUcnVlIGlmIHRoaXMgcmVnaXN0ZXIgaXMgbmV2ZXIgdXNlZCBieSBhIHN1YnNlcXVlbnQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGlzIGlzIG9ubHkgdmFsaWQgb24gZGVmaW5pdGlvbnMgb2YgcmVnaXN0ZXJzLgorICBib29sIElzRGVhZCA6IDE7CisKKyAgLy8vIElzVW5kZWYgLSBUcnVlIGlmIHRoaXMgaXMgYSByZWdpc3RlciBkZWYgLyB1c2Ugb2YgInVuZGVmIiwgaS5lLiByZWdpc3RlcgorICAvLy8gZGVmaW5lZCBieSBhbiBJTVBMSUNJVF9ERUYuIFRoaXMgaXMgb25seSB2YWxpZCBvbiByZWdpc3RlcnMuCisgIGJvb2wgSXNVbmRlZiA6IDE7CisKKyAgLy8vIElzRWFybHlDbG9iYmVyIC0gVHJ1ZSBpZiB0aGlzIE1PX1JlZ2lzdGVyICdkZWYnIG9wZXJhbmQgaXMgd3JpdHRlbiB0bworICAvLy8gYnkgdGhlIE1hY2hpbmVJbnN0ciBiZWZvcmUgYWxsIGlucHV0IHJlZ2lzdGVycyBhcmUgcmVhZC4gIFRoaXMgaXMgdXNlZCB0bworICAvLy8gbW9kZWwgdGhlIEdDQyBpbmxpbmUgYXNtICcmJyBjb25zdHJhaW50IG1vZGlmaWVyLgorICBib29sIElzRWFybHlDbG9iYmVyIDogMTsKKworICAvLy8gSXNEZWJ1ZyAtIFRydWUgaWYgdGhpcyBNT19SZWdpc3RlciAndXNlJyBvcGVyYW5kIGlzIGluIGEgZGVidWcgcHNldWRvLAorICAvLy8gbm90IGEgcmVhbCBpbnN0cnVjdGlvbi4gIFN1Y2ggdXNlcyBzaG91bGQgYmUgaWdub3JlZCBkdXJpbmcgY29kZWdlbi4KKyAgYm9vbCBJc0RlYnVnIDogMTsKKworICAvLy8gUGFyZW50TUkgLSBUaGlzIGlzIHRoZSBpbnN0cnVjdGlvbiB0aGF0IHRoaXMgb3BlcmFuZCBpcyBlbWJlZGRlZCBpbnRvLiAKKyAgLy8vIFRoaXMgaXMgdmFsaWQgZm9yIGFsbCBvcGVyYW5kIHR5cGVzLCB3aGVuIHRoZSBvcGVyYW5kIGlzIGluIGFuIGluc3RyLgorICBNYWNoaW5lSW5zdHIgKlBhcmVudE1JOworCisgIC8vLyBDb250ZW50cyB1bmlvbiAtIFRoaXMgY29udGFpbnMgdGhlIHBheWxvYWQgZm9yIHRoZSB2YXJpb3VzIG9wZXJhbmQgdHlwZXMuCisgIHVuaW9uIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCOyAgIC8vIEZvciBNT19NYWNoaW5lQmFzaWNCbG9jay4KKyAgICBjb25zdCBDb25zdGFudEZQICpDRlA7ICAgIC8vIEZvciBNT19GUEltbWVkaWF0ZS4KKyAgICBpbnQ2NF90IEltbVZhbDsgICAgICAgICAgIC8vIEZvciBNT19JbW1lZGlhdGUuCisgICAgY29uc3QgTUROb2RlICpNRDsgICAgICAgICAvLyBGb3IgTU9fTWV0YWRhdGEuCisgICAgTUNTeW1ib2wgKlN5bTsgICAgICAgICAgICAvLyBGb3IgTU9fTUNTeW1ib2wKKworICAgIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgLy8gRm9yIE1PX1JlZ2lzdGVyLgorICAgICAgdW5zaWduZWQgUmVnTm87CisgICAgICBNYWNoaW5lT3BlcmFuZCAqKlByZXY7ICAvLyBBY2Nlc3MgbGlzdCBmb3IgcmVnaXN0ZXIuCisgICAgICBNYWNoaW5lT3BlcmFuZCAqTmV4dDsKKyAgICB9IFJlZzsKKyAgICAKKyAgICAvLy8gT2Zmc2V0ZWRJbmZvIC0gVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIG9mZnNldCBhbmQgYW4gb2JqZWN0IGlkZW50aWZpZXIuCisgICAgLy8vIHRoaXMgcmVwcmVzZW50IHRoZSBvYmplY3QgYXMgd2l0aCBhbiBvcHRpb25hbCBvZmZzZXQgZnJvbSBpdC4KKyAgICBzdHJ1Y3QgeworICAgICAgdW5pb24geworICAgICAgICBpbnQgSW5kZXg7ICAgICAgICAgICAgICAgIC8vIEZvciBNT18qSW5kZXggLSBUaGUgaW5kZXggaXRzZWxmLgorICAgICAgICBjb25zdCBjaGFyICpTeW1ib2xOYW1lOyAgIC8vIEZvciBNT19FeHRlcm5hbFN5bWJvbC4KKyAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWOyAgICAvLyBGb3IgTU9fR2xvYmFsQWRkcmVzcy4KKyAgICAgICAgY29uc3QgQmxvY2tBZGRyZXNzICpCQTsgICAvLyBGb3IgTU9fQmxvY2tBZGRyZXNzLgorICAgICAgfSBWYWw7CisgICAgICBpbnQ2NF90IE9mZnNldDsgICAgICAgICAgICAgLy8gQW4gb2Zmc2V0IGZyb20gdGhlIG9iamVjdC4KKyAgICB9IE9mZnNldGVkSW5mbzsKKyAgfSBDb250ZW50czsKKyAgCisgIGV4cGxpY2l0IE1hY2hpbmVPcGVyYW5kKE1hY2hpbmVPcGVyYW5kVHlwZSBLKSA6IE9wS2luZChLKSwgUGFyZW50TUkoMCkgeworICAgIFRhcmdldEZsYWdzID0gMDsKKyAgfQorcHVibGljOgorICAvLy8gZ2V0VHlwZSAtIFJldHVybnMgdGhlIE1hY2hpbmVPcGVyYW5kVHlwZSBmb3IgdGhpcyBvcGVyYW5kLgorICAvLy8KKyAgTWFjaGluZU9wZXJhbmRUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiAoTWFjaGluZU9wZXJhbmRUeXBlKU9wS2luZDsgfQorICAKKyAgdW5zaWduZWQgY2hhciBnZXRUYXJnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIFRhcmdldEZsYWdzOyB9CisgIHZvaWQgc2V0VGFyZ2V0RmxhZ3ModW5zaWduZWQgY2hhciBGKSB7IFRhcmdldEZsYWdzID0gRjsgfQorICB2b2lkIGFkZFRhcmdldEZsYWcodW5zaWduZWQgY2hhciBGKSB7IFRhcmdldEZsYWdzIHw9IEY7IH0KKyAgCisKKyAgLy8vIGdldFBhcmVudCAtIFJldHVybiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB0aGlzIG9wZXJhbmQgYmVsb25ncyB0by4KKyAgLy8vCisgIE1hY2hpbmVJbnN0ciAqZ2V0UGFyZW50KCkgeyByZXR1cm4gUGFyZW50TUk7IH0KKyAgY29uc3QgTWFjaGluZUluc3RyICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnRNSTsgfQorICAKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmb3MsIGNvbnN0IFRhcmdldE1hY2hpbmUgKlRNID0gMCkgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFjY2Vzc29ycyB0aGF0IHRlbGwgeW91IHdoYXQga2luZCBvZiBNYWNoaW5lT3BlcmFuZCB5b3UncmUgbG9va2luZyBhdC4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIGlzUmVnIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX1JlZ2lzdGVyIG9wZXJhbmQuCisgIGJvb2wgaXNSZWcoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fUmVnaXN0ZXI7IH0KKyAgLy8vIGlzSW1tIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX0ltbWVkaWF0ZSBvcGVyYW5kLgorICBib29sIGlzSW1tKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX0ltbWVkaWF0ZTsgfQorICAvLy8gaXNGUEltbSAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19GUEltbWVkaWF0ZSBvcGVyYW5kLgorICBib29sIGlzRlBJbW0oKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fRlBJbW1lZGlhdGU7IH0KKyAgLy8vIGlzTUJCIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX01hY2hpbmVCYXNpY0Jsb2NrIG9wZXJhbmQuCisgIGJvb2wgaXNNQkIoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fTWFjaGluZUJhc2ljQmxvY2s7IH0KKyAgLy8vIGlzRkkgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fRnJhbWVJbmRleCBvcGVyYW5kLgorICBib29sIGlzRkkoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fRnJhbWVJbmRleDsgfQorICAvLy8gaXNDUEkgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fQ29uc3RhbnRQb29sSW5kZXggb3BlcmFuZC4KKyAgYm9vbCBpc0NQSSgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19Db25zdGFudFBvb2xJbmRleDsgfQorICAvLy8gaXNKVEkgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fSnVtcFRhYmxlSW5kZXggb3BlcmFuZC4KKyAgYm9vbCBpc0pUSSgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19KdW1wVGFibGVJbmRleDsgfQorICAvLy8gaXNHbG9iYWwgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fR2xvYmFsQWRkcmVzcyBvcGVyYW5kLgorICBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX0dsb2JhbEFkZHJlc3M7IH0KKyAgLy8vIGlzU3ltYm9sIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX0V4dGVybmFsU3ltYm9sIG9wZXJhbmQuCisgIGJvb2wgaXNTeW1ib2woKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fRXh0ZXJuYWxTeW1ib2w7IH0KKyAgLy8vIGlzQmxvY2tBZGRyZXNzIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX0Jsb2NrQWRkcmVzcyBvcGVyYW5kLgorICBib29sIGlzQmxvY2tBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX0Jsb2NrQWRkcmVzczsgfQorICAvLy8gaXNNZXRhZGF0YSAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19NZXRhZGF0YSBvcGVyYW5kLgorICBib29sIGlzTWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fTWV0YWRhdGE7IH0KKyAgYm9vbCBpc01DU3ltYm9sKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX01DU3ltYm9sOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFjY2Vzc29ycyBmb3IgUmVnaXN0ZXIgT3BlcmFuZHMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIGdldFJlZyAtIFJldHVybnMgdGhlIHJlZ2lzdGVyIG51bWJlci4KKyAgdW5zaWduZWQgZ2V0UmVnKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJUaGlzIGlzIG5vdCBhIHJlZ2lzdGVyIG9wZXJhbmQhIik7CisgICAgcmV0dXJuIENvbnRlbnRzLlJlZy5SZWdObzsKKyAgfQorICAKKyAgdW5zaWduZWQgZ2V0U3ViUmVnKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiAodW5zaWduZWQpU3ViUmVnOworICB9CisgIAorICBib29sIGlzVXNlKCkgY29uc3QgeyAKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gIUlzRGVmOworICB9CisgIAorICBib29sIGlzRGVmKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc0RlZjsKKyAgfQorICAKKyAgYm9vbCBpc0ltcGxpY2l0KCkgY29uc3QgeyAKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gSXNJbXA7CisgIH0KKyAgCisgIGJvb2wgaXNEZWFkKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc0RlYWQ7CisgIH0KKyAgCisgIGJvb2wgaXNLaWxsKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc0tpbGw7CisgIH0KKyAgCisgIGJvb2wgaXNVbmRlZigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gSXNVbmRlZjsKKyAgfQorICAKKyAgYm9vbCBpc0Vhcmx5Q2xvYmJlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gSXNFYXJseUNsb2JiZXI7CisgIH0KKworICBib29sIGlzRGVidWcoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIElzRGVidWc7CisgIH0KKworICAvLy8gZ2V0TmV4dE9wZXJhbmRGb3JSZWcgLSBSZXR1cm4gdGhlIG5leHQgTWFjaGluZU9wZXJhbmQgaW4gdGhlIGZ1bmN0aW9uIHRoYXQKKyAgLy8vIHVzZXMgb3IgZGVmaW5lcyB0aGlzIHJlZ2lzdGVyLgorICBNYWNoaW5lT3BlcmFuZCAqZ2V0TmV4dE9wZXJhbmRGb3JSZWcoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIlRoaXMgaXMgbm90IGEgcmVnaXN0ZXIgb3BlcmFuZCEiKTsKKyAgICByZXR1cm4gQ29udGVudHMuUmVnLk5leHQ7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTXV0YXRvcnMgZm9yIFJlZ2lzdGVyIE9wZXJhbmRzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAKKyAgLy8vIENoYW5nZSB0aGUgcmVnaXN0ZXIgdGhpcyBvcGVyYW5kIGNvcnJlc3BvbmRzIHRvLgorICAvLy8KKyAgdm9pZCBzZXRSZWcodW5zaWduZWQgUmVnKTsKKyAgCisgIHZvaWQgc2V0U3ViUmVnKHVuc2lnbmVkIHN1YlJlZykgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIFN1YlJlZyA9ICh1bnNpZ25lZCBjaGFyKXN1YlJlZzsKKyAgfQorCisgIC8vLyBzdWJzdFZpcnRSZWcgLSBTdWJzdGl0dXRlIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHdpdGggdGhlIHZpcnR1YWwKKyAgLy8vIHN1YnJlZ2lzdGVyIFJlZzpTdWJSZWcuIFRha2UgYW55IGV4aXN0aW5nIFN1YlJlZyBpbmRleCBpbnRvIGFjY291bnQsCisgIC8vLyB1c2luZyBUYXJnZXRSZWdpc3RlckluZm8gdG8gY29tcG9zZSB0aGUgc3VicmVnIGluZGljZXMgaWYgbmVjZXNzYXJ5LgorICAvLy8gUmVnIG11c3QgYmUgYSB2aXJ0dWFsIHJlZ2lzdGVyLCBTdWJJZHggY2FuIGJlIDAuCisgIC8vLworICB2b2lkIHN1YnN0VmlydFJlZyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIFN1YklkeCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvJik7CisKKyAgLy8vIHN1YnN0UGh5c1JlZyAtIFN1YnN0aXR1dGUgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgd2l0aCB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIKKyAgLy8vIFJlZywgdGFraW5nIGFueSBleGlzdGluZyBTdWJSZWcgaW50byBhY2NvdW50LiBGb3IgaW5zdGFuY2UsCisgIC8vLyBzdWJzdFBoeXNSZWcoJUVBWCkgd2lsbCBjaGFuZ2UgJXJlZzEwMjQ6c3ViXzhiaXQgdG8gJUFMLgorICAvLy8KKyAgdm9pZCBzdWJzdFBoeXNSZWcodW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8mKTsKKworICB2b2lkIHNldElzVXNlKGJvb2wgVmFsID0gdHJ1ZSkgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIGFzc2VydCgoVmFsIHx8ICFpc0RlYnVnKCkpICYmICJNYXJraW5nIGEgZGVidWcgb3BlcmF0aW9uIGFzIGRlZiIpOworICAgIElzRGVmID0gIVZhbDsKKyAgfQorICAKKyAgdm9pZCBzZXRJc0RlZihib29sIFZhbCA9IHRydWUpIHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICBhc3NlcnQoKCFWYWwgfHwgIWlzRGVidWcoKSkgJiYgIk1hcmtpbmcgYSBkZWJ1ZyBvcGVyYXRpb24gYXMgZGVmIik7CisgICAgSXNEZWYgPSBWYWw7CisgIH0KKworICB2b2lkIHNldEltcGxpY2l0KGJvb2wgVmFsID0gdHJ1ZSkgeyAKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICBJc0ltcCA9IFZhbDsKKyAgfQorCisgIHZvaWQgc2V0SXNLaWxsKGJvb2wgVmFsID0gdHJ1ZSkgeworICAgIGFzc2VydChpc1JlZygpICYmICFJc0RlZiAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICBhc3NlcnQoKCFWYWwgfHwgIWlzRGVidWcoKSkgJiYgIk1hcmtpbmcgYSBkZWJ1ZyBvcGVyYXRpb24gYXMga2lsbCIpOworICAgIElzS2lsbCA9IFZhbDsKKyAgfQorICAKKyAgdm9pZCBzZXRJc0RlYWQoYm9vbCBWYWwgPSB0cnVlKSB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgSXNEZWYgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgSXNEZWFkID0gVmFsOworICB9CisKKyAgdm9pZCBzZXRJc1VuZGVmKGJvb2wgVmFsID0gdHJ1ZSkgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIElzVW5kZWYgPSBWYWw7CisgIH0KKyAgCisgIHZvaWQgc2V0SXNFYXJseUNsb2JiZXIoYm9vbCBWYWwgPSB0cnVlKSB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgSXNEZWYgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgSXNFYXJseUNsb2JiZXIgPSBWYWw7CisgIH0KKworICB2b2lkIHNldElzRGVidWcoYm9vbCBWYWwgPSB0cnVlKSB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgSXNEZWYgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgSXNEZWJ1ZyA9IFZhbDsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBY2Nlc3NvcnMgZm9yIHZhcmlvdXMgb3BlcmFuZCB0eXBlcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIAorICBpbnQ2NF90IGdldEltbSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbW0oKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuSW1tVmFsOworICB9CisgIAorICBjb25zdCBDb25zdGFudEZQICpnZXRGUEltbSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNGUEltbSgpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5DRlA7CisgIH0KKyAgCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRNQkIoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTUJCKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLk1CQjsKKyAgfQorCisgIGludCBnZXRJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGlzRkkoKSB8fCBpc0NQSSgpIHx8IGlzSlRJKCkpICYmCisgICAgICAgICAgICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5PZmZzZXRlZEluZm8uVmFsLkluZGV4OworICB9CisgIAorICBjb25zdCBHbG9iYWxWYWx1ZSAqZ2V0R2xvYmFsKCkgY29uc3QgeworICAgIGFzc2VydChpc0dsb2JhbCgpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5PZmZzZXRlZEluZm8uVmFsLkdWOworICB9CisKKyAgY29uc3QgQmxvY2tBZGRyZXNzICpnZXRCbG9ja0FkZHJlc3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQmxvY2tBZGRyZXNzKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLk9mZnNldGVkSW5mby5WYWwuQkE7CisgIH0KKworICBNQ1N5bWJvbCAqZ2V0TUNTeW1ib2woKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTUNTeW1ib2woKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuU3ltOworICB9CisgIAorICAvLy8gZ2V0T2Zmc2V0IC0gUmV0dXJuIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3ltYm9sIGluIHRoaXMgb3BlcmFuZC4gVGhpcyBhbHdheXMKKyAgLy8vIHJldHVybnMgMCBmb3IgRXh0ZXJuYWxTeW1ib2wgb3BlcmFuZHMuCisgIGludDY0X3QgZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgIGFzc2VydCgoaXNHbG9iYWwoKSB8fCBpc1N5bWJvbCgpIHx8IGlzQ1BJKCkgfHwgaXNCbG9ja0FkZHJlc3MoKSkgJiYKKyAgICAgICAgICAgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLk9mZnNldGVkSW5mby5PZmZzZXQ7CisgIH0KKyAgCisgIGNvbnN0IGNoYXIgKmdldFN5bWJvbE5hbWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU3ltYm9sKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLk9mZnNldGVkSW5mby5WYWwuU3ltYm9sTmFtZTsKKyAgfQorCisgIGNvbnN0IE1ETm9kZSAqZ2V0TWV0YWRhdGEoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTWV0YWRhdGEoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuTUQ7CisgIH0KKyAgCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNdXRhdG9ycyBmb3IgdmFyaW91cyBvcGVyYW5kIHR5cGVzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgCisgIHZvaWQgc2V0SW1tKGludDY0X3QgaW1tVmFsKSB7CisgICAgYXNzZXJ0KGlzSW1tKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIG11dGF0b3IiKTsKKyAgICBDb250ZW50cy5JbW1WYWwgPSBpbW1WYWw7CisgIH0KKworICB2b2lkIHNldE9mZnNldChpbnQ2NF90IE9mZnNldCkgeworICAgIGFzc2VydCgoaXNHbG9iYWwoKSB8fCBpc1N5bWJvbCgpIHx8IGlzQ1BJKCkgfHwgaXNCbG9ja0FkZHJlc3MoKSkgJiYKKyAgICAgICAgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgQ29udGVudHMuT2Zmc2V0ZWRJbmZvLk9mZnNldCA9IE9mZnNldDsKKyAgfQorICAKKyAgdm9pZCBzZXRJbmRleChpbnQgSWR4KSB7CisgICAgYXNzZXJ0KChpc0ZJKCkgfHwgaXNDUEkoKSB8fCBpc0pUSSgpKSAmJgorICAgICAgICAgICAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICBDb250ZW50cy5PZmZzZXRlZEluZm8uVmFsLkluZGV4ID0gSWR4OworICB9CisgIAorICB2b2lkIHNldE1CQihNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgICAgYXNzZXJ0KGlzTUJCKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgQ29udGVudHMuTUJCID0gTUJCOworICB9CisgIAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gT3RoZXIgbWV0aG9kcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIAorICAvLy8gaXNJZGVudGljYWxUbyAtIFJldHVybiB0cnVlIGlmIHRoaXMgb3BlcmFuZCBpcyBpZGVudGljYWwgdG8gdGhlIHNwZWNpZmllZAorICAvLy8gb3BlcmFuZC4gTm90ZTogVGhpcyBtZXRob2QgaWdub3JlcyBpc0tpbGwgYW5kIGlzRGVhZCBwcm9wZXJ0aWVzLgorICBib29sIGlzSWRlbnRpY2FsVG8oY29uc3QgTWFjaGluZU9wZXJhbmQgJk90aGVyKSBjb25zdDsKKyAgCisgIC8vLyBDaGFuZ2VUb0ltbWVkaWF0ZSAtIFJlcGxhY2UgdGhpcyBvcGVyYW5kIHdpdGggYSBuZXcgaW1tZWRpYXRlIG9wZXJhbmQgb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBJZiBhbiBvcGVyYW5kIGlzIGtub3duIHRvIGJlIGFuIGltbWVkaWF0ZSBhbHJlYWR5LAorICAvLy8gdGhlIHNldEltbSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQuCisgIHZvaWQgQ2hhbmdlVG9JbW1lZGlhdGUoaW50NjRfdCBJbW1WYWwpOworICAKKyAgLy8vIENoYW5nZVRvUmVnaXN0ZXIgLSBSZXBsYWNlIHRoaXMgb3BlcmFuZCB3aXRoIGEgbmV3IHJlZ2lzdGVyIG9wZXJhbmQgb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBJZiBhbiBvcGVyYW5kIGlzIGtub3duIHRvIGJlIGFuIHJlZ2lzdGVyIGFscmVhZHksCisgIC8vLyB0aGUgc2V0UmVnIG1ldGhvZCBzaG91bGQgYmUgdXNlZC4KKyAgdm9pZCBDaGFuZ2VUb1JlZ2lzdGVyKHVuc2lnbmVkIFJlZywgYm9vbCBpc0RlZiwgYm9vbCBpc0ltcCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0tpbGwgPSBmYWxzZSwgYm9vbCBpc0RlYWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNVbmRlZiA9IGZhbHNlLCBib29sIGlzRGVidWcgPSBmYWxzZSk7CisgIAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29uc3RydWN0aW9uIG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZUltbShpbnQ2NF90IFZhbCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGUpOworICAgIE9wLnNldEltbShWYWwpOworICAgIHJldHVybiBPcDsKKyAgfQorICAKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZUZQSW1tKGNvbnN0IENvbnN0YW50RlAgKkNGUCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19GUEltbWVkaWF0ZSk7CisgICAgT3AuQ29udGVudHMuQ0ZQID0gQ0ZQOworICAgIHJldHVybiBPcDsKKyAgfQorICAKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZVJlZyh1bnNpZ25lZCBSZWcsIGJvb2wgaXNEZWYsIGJvb2wgaXNJbXAgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzS2lsbCA9IGZhbHNlLCBib29sIGlzRGVhZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNVbmRlZiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFYXJseUNsb2JiZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWJSZWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZWJ1ZyA9IGZhbHNlKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyKTsKKyAgICBPcC5Jc0RlZiA9IGlzRGVmOworICAgIE9wLklzSW1wID0gaXNJbXA7CisgICAgT3AuSXNLaWxsID0gaXNLaWxsOworICAgIE9wLklzRGVhZCA9IGlzRGVhZDsKKyAgICBPcC5Jc1VuZGVmID0gaXNVbmRlZjsKKyAgICBPcC5Jc0Vhcmx5Q2xvYmJlciA9IGlzRWFybHlDbG9iYmVyOworICAgIE9wLklzRGVidWcgPSBpc0RlYnVnOworICAgIE9wLkNvbnRlbnRzLlJlZy5SZWdObyA9IFJlZzsKKyAgICBPcC5Db250ZW50cy5SZWcuUHJldiA9IDA7CisgICAgT3AuQ29udGVudHMuUmVnLk5leHQgPSAwOworICAgIE9wLlN1YlJlZyA9IFN1YlJlZzsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZU1CQihNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrKTsKKyAgICBPcC5zZXRNQkIoTUJCKTsKKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVGSSh1bnNpZ25lZCBJZHgpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fRnJhbWVJbmRleCk7CisgICAgT3Auc2V0SW5kZXgoSWR4KTsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZUNQSSh1bnNpZ25lZCBJZHgsIGludCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fQ29uc3RhbnRQb29sSW5kZXgpOworICAgIE9wLnNldEluZGV4KElkeCk7CisgICAgT3Auc2V0T2Zmc2V0KE9mZnNldCk7CisgICAgT3Auc2V0VGFyZ2V0RmxhZ3MoVGFyZ2V0RmxhZ3MpOworICAgIHJldHVybiBPcDsKKyAgfQorICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlSlRJKHVuc2lnbmVkIElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19KdW1wVGFibGVJbmRleCk7CisgICAgT3Auc2V0SW5kZXgoSWR4KTsKKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVHQShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIGludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fR2xvYmFsQWRkcmVzcyk7CisgICAgT3AuQ29udGVudHMuT2Zmc2V0ZWRJbmZvLlZhbC5HViA9IEdWOworICAgIE9wLnNldE9mZnNldChPZmZzZXQpOworICAgIE9wLnNldFRhcmdldEZsYWdzKFRhcmdldEZsYWdzKTsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZUVTKGNvbnN0IGNoYXIgKlN5bU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19FeHRlcm5hbFN5bWJvbCk7CisgICAgT3AuQ29udGVudHMuT2Zmc2V0ZWRJbmZvLlZhbC5TeW1ib2xOYW1lID0gU3ltTmFtZTsKKyAgICBPcC5zZXRPZmZzZXQoMCk7IC8vIE9mZnNldCBpcyBhbHdheXMgMC4KKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVCQShjb25zdCBCbG9ja0FkZHJlc3MgKkJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fQmxvY2tBZGRyZXNzKTsKKyAgICBPcC5Db250ZW50cy5PZmZzZXRlZEluZm8uVmFsLkJBID0gQkE7CisgICAgT3Auc2V0T2Zmc2V0KDApOyAvLyBPZmZzZXQgaXMgYWx3YXlzIDAuCisgICAgT3Auc2V0VGFyZ2V0RmxhZ3MoVGFyZ2V0RmxhZ3MpOworICAgIHJldHVybiBPcDsKKyAgfQorICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlTWV0YWRhdGEoY29uc3QgTUROb2RlICpNZXRhKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX01ldGFkYXRhKTsKKyAgICBPcC5Db250ZW50cy5NRCA9IE1ldGE7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZU1DU3ltYm9sKE1DU3ltYm9sICpTeW0pIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fTUNTeW1ib2wpOworICAgIE9wLkNvbnRlbnRzLlN5bSA9IFN5bTsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgCisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworcHJpdmF0ZToKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1ldGhvZHMgZm9yIGhhbmRsaW5nIHJlZ2lzdGVyIHVzZS9kZWYgbGlzdHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBpc09uUmVnVXNlTGlzdCAtIFJldHVybiB0cnVlIGlmIHRoaXMgb3BlcmFuZCBpcyBvbiBhIHJlZ2lzdGVyIHVzZS9kZWYgbGlzdAorICAvLy8gb3IgZmFsc2UgaWYgbm90LiAgVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgZm9yIHJlZ2lzdGVyIG9wZXJhbmRzIHRoYXQgYXJlCisgIC8vLyBwYXJ0IG9mIGEgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc09uUmVnVXNlTGlzdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiQ2FuIG9ubHkgYWRkIHJlZyBvcGVyYW5kIHRvIHVzZSBsaXN0cyIpOworICAgIHJldHVybiBDb250ZW50cy5SZWcuUHJldiAhPSAwOworICB9CisgIAorICAvLy8gQWRkUmVnT3BlcmFuZFRvUmVnSW5mbyAtIEFkZCB0aGlzIHJlZ2lzdGVyIG9wZXJhbmQgdG8gdGhlIHNwZWNpZmllZAorICAvLy8gTWFjaGluZVJlZ2lzdGVySW5mby4gIElmIGl0IGlzIG51bGwsIHRoZW4gdGhlIG5leHQvcHJldiBmaWVsZHMgc2hvdWxkIGJlCisgIC8vLyBleHBsaWNpdGx5IG51bGxlZCBvdXQuCisgIHZvaWQgQWRkUmVnT3BlcmFuZFRvUmVnSW5mbyhNYWNoaW5lUmVnaXN0ZXJJbmZvICpSZWdJbmZvKTsKKworICAvLy8gUmVtb3ZlUmVnT3BlcmFuZEZyb21SZWdJbmZvIC0gUmVtb3ZlIHRoaXMgcmVnaXN0ZXIgb3BlcmFuZCBmcm9tIHRoZQorICAvLy8gTWFjaGluZVJlZ2lzdGVySW5mbyBpdCBpcyBsaW5rZWQgd2l0aC4KKyAgdm9pZCBSZW1vdmVSZWdPcGVyYW5kRnJvbVJlZ0luZm8oKTsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1hY2hpbmVPcGVyYW5kJiBNTykgeworICBNTy5wcmludChPUywgMCk7CisgIHJldHVybiBPUzsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlMmU5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVQYXNzUmVnaXN0cnkuaApAQCAtMCwwICsxLDE1NiBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTWFjaGluZVBhc3NSZWdpc3RyeS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1lY2hhbmljcyBmb3IgbWFjaGluZSBmdW5jdGlvbiBwYXNzIHJlZ2lzdHJpZXMuICBBCisvLyBmdW5jdGlvbiBwYXNzIHJlZ2lzdHJ5IChNYWNoaW5lUGFzc1JlZ2lzdHJ5KSBpcyBhdXRvIGZpbGxlZCBieSB0aGUgc3RhdGljCisvLyBjb25zdHJ1Y3RvcnMgb2YgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUuICBGdXJ0aGVyIHRoZXJlIGlzIGEgY29tbWFuZCBsaW5lCisvLyBwYXJzZXIgKFJlZ2lzdGVyUGFzc1BhcnNlcikgd2hpY2ggbGlzdGVucyB0byBlYWNoIHJlZ2lzdHJ5IGZvciBhZGRpdGlvbnMKKy8vIGFuZCBkZWxldGlvbnMsIHNvIHRoYXQgdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQgb3B0aW9uIGlzIHVwZGF0ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORVBBU1NSRUdJU1RSWV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FUEFTU1JFR0lTVFJZX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCit0eXBlZGVmIHZvaWQgKigqTWFjaGluZVBhc3NDdG9yKSgpOworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vIAorLy8vCisvLy8gTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyIC0gTGlzdGVuZXIgdG8gYWRkcyBhbmQgcmVtb3ZhbHMgb2Ygbm9kZXMgaW4KKy8vLyByZWdpc3RyYXRpb24gbGlzdC4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIE1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lciB7CitwdWJsaWM6CisgIE1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lcigpIHt9CisgIHZpcnR1YWwgfk1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lcigpIHt9CisgIHZpcnR1YWwgdm9pZCBOb3RpZnlBZGQoY29uc3QgY2hhciAqTiwgTWFjaGluZVBhc3NDdG9yIEMsIGNvbnN0IGNoYXIgKkQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE5vdGlmeVJlbW92ZShjb25zdCBjaGFyICpOKSA9IDA7Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vIAorLy8vCisvLy8gTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgLSBNYWNoaW5lIHBhc3Mgbm9kZSBzdG9yZWQgaW4gcmVnaXN0cmF0aW9uIGxpc3QuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSB7CisKK3ByaXZhdGU6CisKKyAgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKk5leHQ7ICAgICAgICAvLyBOZXh0IGZ1bmN0aW9uIHBhc3MgaW4gbGlzdC4KKyAgY29uc3QgY2hhciAqTmFtZTsgICAgICAgICAgICAgICAgICAgICAvLyBOYW1lIG9mIGZ1bmN0aW9uIHBhc3MuCisgIGNvbnN0IGNoYXIgKkRlc2NyaXB0aW9uOyAgICAgICAgICAgICAgLy8gRGVzY3JpcHRpb24gc3RyaW5nLgorICBNYWNoaW5lUGFzc0N0b3IgQ3RvcjsgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIHBhc3MgY3JlYXRvci4KKyAgCitwdWJsaWM6CisKKyAgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUoY29uc3QgY2hhciAqTiwgY29uc3QgY2hhciAqRCwgTWFjaGluZVBhc3NDdG9yIEMpCisgIDogTmV4dChOVUxMKQorICAsIE5hbWUoTikKKyAgLCBEZXNjcmlwdGlvbihEKQorICAsIEN0b3IoQykKKyAge30KKworICAvLyBBY2Nlc3NvcnMKKyAgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKmdldE5leHQoKSAgICAgIGNvbnN0IHsgcmV0dXJuIE5leHQ7IH0KKyAgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKipnZXROZXh0QWRkcmVzcygpICAgIHsgcmV0dXJuICZOZXh0OyB9CisgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIGNvbnN0IGNoYXIgKmdldERlc2NyaXB0aW9uKCkgICAgICAgICAgICBjb25zdCB7IHJldHVybiBEZXNjcmlwdGlvbjsgfQorICBNYWNoaW5lUGFzc0N0b3IgZ2V0Q3RvcigpICAgICAgICAgICAgICAgY29uc3QgeyByZXR1cm4gQ3RvcjsgfQorICB2b2lkIHNldE5leHQoTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKk4pICAgICAgeyBOZXh0ID0gTjsgfQorICAKK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8gCisvLy8KKy8vLyBNYWNoaW5lUGFzc1JlZ2lzdHJ5IC0gVHJhY2sgdGhlIHJlZ2lzdHJhdGlvbiBvZiBtYWNoaW5lIHBhc3Nlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIE1hY2hpbmVQYXNzUmVnaXN0cnkgeworCitwcml2YXRlOgorCisgIE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlICpMaXN0OyAgICAgICAgLy8gTGlzdCBvZiByZWdpc3RyeSBub2Rlcy4KKyAgTWFjaGluZVBhc3NDdG9yIERlZmF1bHQ7ICAgICAgICAgICAgICAvLyBEZWZhdWx0IGZ1bmN0aW9uIHBhc3MgY3JlYXRvci4KKyAgTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyKiBMaXN0ZW5lcjsvLyBMaXN0ZW5lciBmb3IgbGlzdCBhZGRzIGFyZSByZW1vdmVzLgorICAKK3B1YmxpYzoKKworICAvLyBOTyBDT05TVFJVQ1RPUiAtIHdlIGRvbid0IHdhbnQgc3RhdGljIGNvbnN0cnVjdG9yIG9yZGVyaW5nIHRvIG1lc3MKKyAgLy8gd2l0aCB0aGUgcmVnaXN0cnkuCisKKyAgLy8gQWNjZXNzb3JzLgorICAvLworICBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSAqZ2V0TGlzdCgpICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBMaXN0OyB9CisgIE1hY2hpbmVQYXNzQ3RvciBnZXREZWZhdWx0KCkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIERlZmF1bHQ7IH0KKyAgdm9pZCBzZXREZWZhdWx0KE1hY2hpbmVQYXNzQ3RvciBDKSAgICAgICAgICAgICAgICAgICAgeyBEZWZhdWx0ID0gQzsgfQorICB2b2lkIHNldExpc3RlbmVyKE1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lciAqTCkgICAgICB7IExpc3RlbmVyID0gTDsgfQorCisgIC8vLyBBZGQgLSBBZGRzIGEgZnVuY3Rpb24gcGFzcyB0byB0aGUgcmVnaXN0cmF0aW9uIGxpc3QuCisgIC8vLworICB2b2lkIEFkZChNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSAqTm9kZSk7CisKKyAgLy8vIFJlbW92ZSAtIFJlbW92ZXMgYSBmdW5jdGlvbiBwYXNzIGZyb20gdGhlIHJlZ2lzdHJhdGlvbiBsaXN0LgorICAvLy8KKyAgdm9pZCBSZW1vdmUoTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKk5vZGUpOworCit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBSZWdpc3RlclBhc3NQYXJzZXIgY2xhc3MgLSBIYW5kbGUgdGhlIGFkZGl0aW9uIG9mIG5ldyBtYWNoaW5lIHBhc3Nlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK3RlbXBsYXRlPGNsYXNzIFJlZ2lzdHJ5Q2xhc3M+CitjbGFzcyBSZWdpc3RlclBhc3NQYXJzZXIgOiBwdWJsaWMgTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgIHB1YmxpYyBjbDo6cGFyc2VyPHR5cGVuYW1lIFJlZ2lzdHJ5Q2xhc3M6OkZ1bmN0aW9uUGFzc0N0b3I+IHsKK3B1YmxpYzoKKyAgUmVnaXN0ZXJQYXNzUGFyc2VyKCkge30KKyAgflJlZ2lzdGVyUGFzc1BhcnNlcigpIHsgUmVnaXN0cnlDbGFzczo6c2V0TGlzdGVuZXIoTlVMTCk7IH0KKworICB2b2lkIGluaXRpYWxpemUoY2w6Ok9wdGlvbiAmTykgeworICAgIGNsOjpwYXJzZXI8dHlwZW5hbWUgUmVnaXN0cnlDbGFzczo6RnVuY3Rpb25QYXNzQ3Rvcj46OmluaXRpYWxpemUoTyk7CisgICAgCisgICAgLy8gQWRkIGV4aXN0aW5nIHBhc3NlcyB0byBvcHRpb24uCisgICAgZm9yIChSZWdpc3RyeUNsYXNzICpOb2RlID0gUmVnaXN0cnlDbGFzczo6Z2V0TGlzdCgpOworICAgICAgICAgTm9kZTsgTm9kZSA9IE5vZGUtPmdldE5leHQoKSkgeworICAgICAgdGhpcy0+YWRkTGl0ZXJhbE9wdGlvbihOb2RlLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKHR5cGVuYW1lIFJlZ2lzdHJ5Q2xhc3M6OkZ1bmN0aW9uUGFzc0N0b3IpTm9kZS0+Z2V0Q3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXREZXNjcmlwdGlvbigpKTsKKyAgICB9CisgICAgCisgICAgLy8gTWFrZSBzdXJlIHdlIGxpc3RlbiBmb3IgbGlzdCBjaGFuZ2VzLgorICAgIFJlZ2lzdHJ5Q2xhc3M6OnNldExpc3RlbmVyKHRoaXMpOworICB9CisKKyAgLy8gSW1wbGVtZW50IHRoZSBNYWNoaW5lUGFzc1JlZ2lzdHJ5TGlzdGVuZXIgY2FsbGJhY2tzLgorICAvLworICB2aXJ0dWFsIHZvaWQgTm90aWZ5QWRkKGNvbnN0IGNoYXIgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBhc3NDdG9yIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRCkgeworICAgIHRoaXMtPmFkZExpdGVyYWxPcHRpb24oTiwgKHR5cGVuYW1lIFJlZ2lzdHJ5Q2xhc3M6OkZ1bmN0aW9uUGFzc0N0b3IpQywgRCk7CisgIH0KKyAgdmlydHVhbCB2b2lkIE5vdGlmeVJlbW92ZShjb25zdCBjaGFyICpOKSB7CisgICAgdGhpcy0+cmVtb3ZlTGl0ZXJhbE9wdGlvbihOKTsKKyAgfQorfTsKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjZjOTFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oCkBAIC0wLDAgKzEsNDA2IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWNoaW5lUmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVSRUdJU1RFUklORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORVJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgCisvLy8gTWFjaGluZVJlZ2lzdGVySW5mbyAtIEtlZXAgdHJhY2sgb2YgaW5mb3JtYXRpb24gZm9yIHZpcnR1YWwgYW5kIHBoeXNpY2FsCisvLy8gcmVnaXN0ZXJzLCBpbmNsdWRpbmcgdnJlZyByZWdpc3RlciBjbGFzc2VzLCB1c2UvZGVmIGNoYWlucyBmb3IgcmVnaXN0ZXJzLAorLy8vIGV0Yy4KK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm8geworICAvLy8gVlJlZ0luZm8gLSBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHZpcnR1YWwgcmVnaXN0ZXIuICBUaGUgZW50cmllcyBpbgorICAvLy8gdGhpcyB2ZWN0b3IgYXJlIGFjdHVhbGx5IGNvbnZlcnRlZCB0byB2cmVnIG51bWJlcnMgYnkgYWRkaW5nIHRoZSAKKyAgLy8vIFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXIgZGVsdGEgdG8gdGhlaXIgaW5kZXguCisgIC8vLworICAvLy8gRWFjaCBlbGVtZW50IGluIHRoaXMgbGlzdCBjb250YWlucyB0aGUgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIHZyZWcgYW5kIHRoZQorICAvLy8gc3RhcnQgb2YgdGhlIHVzZS9kZWYgbGlzdCBmb3IgdGhlIHJlZ2lzdGVyLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyosIE1hY2hpbmVPcGVyYW5kKj4gPiBWUmVnSW5mbzsKKworICAvLy8gUmVnQ2xhc3NWUmVnTWFwIC0gVGhpcyB2ZWN0b3IgYWN0cyBhcyBhIG1hcCBmcm9tIFRhcmdldFJlZ2lzdGVyQ2xhc3MgdG8KKyAgLy8vIHZpcnR1YWwgcmVnaXN0ZXJzLiBGb3IgZWFjaCB0YXJnZXQgcmVnaXN0ZXIgY2xhc3MsIGl0IGtlZXBzIGEgbGlzdCBvZgorICAvLy8gdmlydHVhbCByZWdpc3RlcnMgYmVsb25naW5nIHRvIHRoZSBjbGFzcy4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICpSZWdDbGFzczJWUmVnTWFwOworCisgIC8vLyBSZWdBbGxvY0hpbnRzIC0gVGhpcyB2ZWN0b3IgcmVjb3JkcyByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnRzIGZvciB2aXJ0dWFsCisgIC8vLyByZWdpc3RlcnMuIEZvciBlYWNoIHZpcnR1YWwgcmVnaXN0ZXIsIGl0IGtlZXBzIGEgcmVnaXN0ZXIgYW5kIGhpbnQgdHlwZQorICAvLy8gcGFpciBtYWtpbmcgdXAgdGhlIGFsbG9jYXRpb24gaGludC4gSGludCB0eXBlIGlzIHRhcmdldCBzcGVjaWZpYyBleGNlcHQKKyAgLy8vIGZvciB0aGUgdmFsdWUgMCB3aGljaCBtZWFucyB0aGUgc2Vjb25kIHZhbHVlIG9mIHRoZSBwYWlyIGlzIHRoZSBwcmVmZXJyZWQKKyAgLy8vIHJlZ2lzdGVyIGZvciBhbGxvY2F0aW9uLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGhpbnQgaXMgPDAsIDEwMjQ+LCBpdCBtZWFucworICAvLy8gdGhlIGFsbG9jYXRvciBzaG91bGQgcHJlZmVyIHRoZSBwaHlzaWNhbCByZWdpc3RlciBhbGxvY2F0ZWQgdG8gdGhlIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVyIG9mIHRoZSBoaW50LgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiA+IFJlZ0FsbG9jSGludHM7CisgIAorICAvLy8gUGh5c1JlZ1VzZURlZkxpc3RzIC0gVGhpcyBpcyBhbiBhcnJheSBvZiB0aGUgaGVhZCBvZiB0aGUgdXNlL2RlZiBsaXN0IGZvcgorICAvLy8gcGh5c2ljYWwgcmVnaXN0ZXJzLgorICBNYWNoaW5lT3BlcmFuZCAqKlBoeXNSZWdVc2VEZWZMaXN0czsgCisgIAorICAvLy8gVXNlZFBoeXNSZWdzIC0gVGhpcyBpcyBhIGJpdCB2ZWN0b3IgdGhhdCBpcyBjb21wdXRlZCBhbmQgc2V0IGJ5IHRoZQorICAvLy8gcmVnaXN0ZXIgYWxsb2NhdG9yLCBhbmQgbXVzdCBiZSBrZXB0IHVwIHRvIGRhdGUgYnkgcGFzc2VzIHRoYXQgcnVuIGFmdGVyCisgIC8vLyByZWdpc3RlciBhbGxvY2F0aW9uICh0aG91Z2ggbW9zdCBkb24ndCBtb2RpZnkgdGhpcykuICBUaGlzIGlzIHVzZWQKKyAgLy8vIHNvIHRoYXQgdGhlIGNvZGUgZ2VuZXJhdG9yIGtub3dzIHdoaWNoIGNhbGxlZSBzYXZlIHJlZ2lzdGVycyB0byBzYXZlIGFuZAorICAvLy8gZm9yIG90aGVyIHRhcmdldCBzcGVjaWZpYyB1c2VzLgorICBCaXRWZWN0b3IgVXNlZFBoeXNSZWdzOworICAKKyAgLy8vIExpdmVJbnMvTGl2ZU91dHMgLSBLZWVwIHRyYWNrIG9mIHRoZSBwaHlzaWNhbCByZWdpc3RlcnMgdGhhdCBhcmUKKyAgLy8vIGxpdmVpbi9saXZlb3V0IG9mIHRoZSBmdW5jdGlvbi4gIExpdmUgaW4gdmFsdWVzIGFyZSB0eXBpY2FsbHkgYXJndW1lbnRzIGluCisgIC8vLyByZWdpc3RlcnMsIGxpdmUgb3V0IHZhbHVlcyBhcmUgdHlwaWNhbGx5IHJldHVybiB2YWx1ZXMgaW4gcmVnaXN0ZXJzLgorICAvLy8gTGl2ZUluIHZhbHVlcyBhcmUgYWxsb3dlZCB0byBoYXZlIHZpcnR1YWwgcmVnaXN0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLAorICAvLy8gc3RvcmVkIGluIHRoZSBzZWNvbmQgZWxlbWVudC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gPiBMaXZlSW5zOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gTGl2ZU91dHM7CisgIAorICBNYWNoaW5lUmVnaXN0ZXJJbmZvKGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8mKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvJik7ICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorcHVibGljOgorICBleHBsaWNpdCBNYWNoaW5lUmVnaXN0ZXJJbmZvKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKTsKKyAgfk1hY2hpbmVSZWdpc3RlckluZm8oKTsKKyAgCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBSZWdpc3RlciBJbmZvCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyByZWdfYmVnaW4vcmVnX2VuZCAtIFByb3ZpZGUgaXRlcmF0aW9uIHN1cHBvcnQgdG8gd2FsayBvdmVyIGFsbCBkZWZpbml0aW9ucworICAvLy8gYW5kIHVzZXMgb2YgYSByZWdpc3RlciB3aXRoaW4gdGhlIE1hY2hpbmVGdW5jdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMKKyAgLy8vIE1hY2hpbmVSZWdpc3RlckluZm8gb2JqZWN0LgorICB0ZW1wbGF0ZTxib29sIFVzZXMsIGJvb2wgRGVmcywgYm9vbCBTa2lwRGVidWc+CisgIGNsYXNzIGRlZnVzZWNoYWluX2l0ZXJhdG9yOworCisgIC8vLyByZWdfaXRlcmF0b3IvcmVnX2JlZ2luL3JlZ19lbmQgLSBXYWxrIGFsbCBkZWZzIGFuZCB1c2VzIG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyLgorICB0eXBlZGVmIGRlZnVzZWNoYWluX2l0ZXJhdG9yPHRydWUsdHJ1ZSxmYWxzZT4gcmVnX2l0ZXJhdG9yOworICByZWdfaXRlcmF0b3IgcmVnX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHJlZ19pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyByZWdfaXRlcmF0b3IgcmVnX2VuZCgpIHsgcmV0dXJuIHJlZ19pdGVyYXRvcigwKTsgfQorCisgIC8vLyByZWdfZW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gaW5zdHJ1Y3Rpb25zIHVzaW5nIG9yIGRlZmluaW5nIHRoZQorICAvLy8gc3BlY2lmaWVkIHJlZ2lzdGVyIChpdCBtYXkgYmUgbGl2ZS1pbikuCisgIGJvb2wgcmVnX2VtcHR5KHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7IHJldHVybiByZWdfYmVnaW4oUmVnTm8pID09IHJlZ19lbmQoKTsgfQorCisgIC8vLyByZWdfbm9kYmdfaXRlcmF0b3IvcmVnX25vZGJnX2JlZ2luL3JlZ19ub2RiZ19lbmQgLSBXYWxrIGFsbCBkZWZzIGFuZCB1c2VzCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLCBza2lwcGluZyB0aG9zZSBtYXJrZWQgYXMgRGVidWcuCisgIHR5cGVkZWYgZGVmdXNlY2hhaW5faXRlcmF0b3I8dHJ1ZSx0cnVlLHRydWU+IHJlZ19ub2RiZ19pdGVyYXRvcjsKKyAgcmVnX25vZGJnX2l0ZXJhdG9yIHJlZ19ub2RiZ19iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiByZWdfbm9kYmdfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgcmVnX25vZGJnX2l0ZXJhdG9yIHJlZ19ub2RiZ19lbmQoKSB7IHJldHVybiByZWdfbm9kYmdfaXRlcmF0b3IoMCk7IH0KKworICAvLy8gcmVnX25vZGJnX2VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhlIG9ubHkgaW5zdHJ1Y3Rpb25zIHVzaW5nIG9yIGRlZmluaW5nCisgIC8vLyBSZWcgYXJlIERlYnVnIGluc3RydWN0aW9ucy4KKyAgYm9vbCByZWdfbm9kYmdfZW1wdHkodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gcmVnX25vZGJnX2JlZ2luKFJlZ05vKSA9PSByZWdfbm9kYmdfZW5kKCk7CisgIH0KKworICAvLy8gZGVmX2l0ZXJhdG9yL2RlZl9iZWdpbi9kZWZfZW5kIC0gV2FsayBhbGwgZGVmcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICB0eXBlZGVmIGRlZnVzZWNoYWluX2l0ZXJhdG9yPGZhbHNlLHRydWUsZmFsc2U+IGRlZl9pdGVyYXRvcjsKKyAgZGVmX2l0ZXJhdG9yIGRlZl9iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiBkZWZfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgZGVmX2l0ZXJhdG9yIGRlZl9lbmQoKSB7IHJldHVybiBkZWZfaXRlcmF0b3IoMCk7IH0KKworICAvLy8gZGVmX2VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG5vIGluc3RydWN0aW9ucyBkZWZpbmluZyB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3RlciAoaXQgbWF5IGJlIGxpdmUtaW4pLgorICBib29sIGRlZl9lbXB0eSh1bnNpZ25lZCBSZWdObykgY29uc3QgeyByZXR1cm4gZGVmX2JlZ2luKFJlZ05vKSA9PSBkZWZfZW5kKCk7IH0KKworICAvLy8gdXNlX2l0ZXJhdG9yL3VzZV9iZWdpbi91c2VfZW5kIC0gV2FsayBhbGwgdXNlcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICB0eXBlZGVmIGRlZnVzZWNoYWluX2l0ZXJhdG9yPHRydWUsZmFsc2UsZmFsc2U+IHVzZV9pdGVyYXRvcjsKKyAgdXNlX2l0ZXJhdG9yIHVzZV9iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiB1c2VfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgdXNlX2l0ZXJhdG9yIHVzZV9lbmQoKSB7IHJldHVybiB1c2VfaXRlcmF0b3IoMCk7IH0KKyAgCisgIC8vLyB1c2VfZW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gaW5zdHJ1Y3Rpb25zIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyLgorICBib29sIHVzZV9lbXB0eSh1bnNpZ25lZCBSZWdObykgY29uc3QgeyByZXR1cm4gdXNlX2JlZ2luKFJlZ05vKSA9PSB1c2VfZW5kKCk7IH0KKworICAvLy8gaGFzT25lVXNlIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIGJvb2wgaGFzT25lVXNlKHVuc2lnbmVkIFJlZ05vKSBjb25zdDsKKworICAvLy8gdXNlX25vZGJnX2l0ZXJhdG9yL3VzZV9ub2RiZ19iZWdpbi91c2Vfbm9kYmdfZW5kIC0gV2FsayBhbGwgdXNlcyBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3Rlciwgc2tpcHBpbmcgdGhvc2UgbWFya2VkIGFzIERlYnVnLgorICB0eXBlZGVmIGRlZnVzZWNoYWluX2l0ZXJhdG9yPHRydWUsZmFsc2UsdHJ1ZT4gdXNlX25vZGJnX2l0ZXJhdG9yOworICB1c2Vfbm9kYmdfaXRlcmF0b3IgdXNlX25vZGJnX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHVzZV9ub2RiZ19pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyB1c2Vfbm9kYmdfaXRlcmF0b3IgdXNlX25vZGJnX2VuZCgpIHsgcmV0dXJuIHVzZV9ub2RiZ19pdGVyYXRvcigwKTsgfQorICAKKyAgLy8vIHVzZV9ub2RiZ19lbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBub24tRGVidWcgaW5zdHJ1Y3Rpb25zCisgIC8vLyB1c2luZyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICBib29sIHVzZV9ub2RiZ19lbXB0eSh1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiB1c2Vfbm9kYmdfYmVnaW4oUmVnTm8pID09IHVzZV9ub2RiZ19lbmQoKTsKKyAgfQorCisgIC8vLyBoYXNPbmVOb25EQkdVc2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBub24tRGVidWcKKyAgLy8vIGluc3RydWN0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIGJvb2wgaGFzT25lTm9uREJHVXNlKHVuc2lnbmVkIFJlZ05vKSBjb25zdDsKKworICAvLy8gcmVwbGFjZVJlZ1dpdGggLSBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgRnJvbVJlZyB3aXRoIFRvUmVnIGluIHRoZQorICAvLy8gbWFjaGluZSBmdW5jdGlvbi4gIFRoaXMgaXMgbGlrZSBsbHZtLWxldmVsIFgtPnJlcGxhY2VBbGxVc2VzV2l0aChZKSwKKyAgLy8vIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hhbmdlcyBhbnkgZGVmaW5pdGlvbnMgb2YgdGhlIHJlZ2lzdGVyIGFzIHdlbGwuCisgIHZvaWQgcmVwbGFjZVJlZ1dpdGgodW5zaWduZWQgRnJvbVJlZywgdW5zaWduZWQgVG9SZWcpOworICAKKyAgLy8vIGdldFJlZ1VzZURlZkxpc3RIZWFkIC0gUmV0dXJuIHRoZSBoZWFkIHBvaW50ZXIgZm9yIHRoZSByZWdpc3RlciB1c2UvZGVmCisgIC8vLyBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgb3IgcGh5c2ljYWwgcmVnaXN0ZXIuCisgIE1hY2hpbmVPcGVyYW5kIComZ2V0UmVnVXNlRGVmTGlzdEhlYWQodW5zaWduZWQgUmVnTm8pIHsKKyAgICBpZiAoUmVnTm8gPCBUYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyKQorICAgICAgcmV0dXJuIFBoeXNSZWdVc2VEZWZMaXN0c1tSZWdOb107CisgICAgUmVnTm8gLT0gVGFyZ2V0UmVnaXN0ZXJJbmZvOjpGaXJzdFZpcnR1YWxSZWdpc3RlcjsKKyAgICByZXR1cm4gVlJlZ0luZm9bUmVnTm9dLnNlY29uZDsKKyAgfQorICAKKyAgTWFjaGluZU9wZXJhbmQgKmdldFJlZ1VzZURlZkxpc3RIZWFkKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgaWYgKFJlZ05vIDwgVGFyZ2V0UmVnaXN0ZXJJbmZvOjpGaXJzdFZpcnR1YWxSZWdpc3RlcikKKyAgICAgIHJldHVybiBQaHlzUmVnVXNlRGVmTGlzdHNbUmVnTm9dOworICAgIFJlZ05vIC09IFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXI7CisgICAgcmV0dXJuIFZSZWdJbmZvW1JlZ05vXS5zZWNvbmQ7CisgIH0KKworICAvLy8gZ2V0VlJlZ0RlZiAtIFJldHVybiB0aGUgbWFjaGluZSBpbnN0ciB0aGF0IGRlZmluZXMgdGhlIHNwZWNpZmllZCB2aXJ0dWFsCisgIC8vLyByZWdpc3RlciBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY29kZSBpcyBpbiBTU0EKKyAgLy8vIGZvcm0sIHNvIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBkZWZpbml0aW9uLgorICBNYWNoaW5lSW5zdHIgKmdldFZSZWdEZWYodW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gY2xlYXJLaWxsRmxhZ3MgLSBJdGVyYXRlIG92ZXIgYWxsIHRoZSB1c2VzIG9mIHRoZSBnaXZlbiByZWdpc3RlciBhbmQKKyAgLy8vIGNsZWFyIHRoZSBraWxsIGZsYWcgZnJvbSB0aGUgTWFjaGluZU9wZXJhbmQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieQorICAvLy8gb3B0aW1pemF0aW9uIHBhc3NlcyB3aGljaCBleHRlbmQgcmVnaXN0ZXIgbGlmZXRpbWVzIGFuZCBuZWVkIG9ubHkKKyAgLy8vIHByZXNlcnZlIGNvbnNlcnZhdGl2ZSBraWxsIGZsYWcgaW5mb3JtYXRpb24uCisgIHZvaWQgY2xlYXJLaWxsRmxhZ3ModW5zaWduZWQgUmVnKSBjb25zdDsKKyAgCisjaWZuZGVmIE5ERUJVRworICB2b2lkIGR1bXBVc2VzKHVuc2lnbmVkIFJlZ05vKSBjb25zdDsKKyNlbmRpZgorICAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFZpcnR1YWwgUmVnaXN0ZXIgSW5mbworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgCisgIC8vLyBnZXRSZWdDbGFzcyAtIFJldHVybiB0aGUgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyLgorICAvLy8KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3ModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgUmVnIC09IFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXI7CisgICAgYXNzZXJ0KFJlZyA8IFZSZWdJbmZvLnNpemUoKSAmJiAiSW52YWxpZCB2cmVnISIpOworICAgIHJldHVybiBWUmVnSW5mb1tSZWddLmZpcnN0OworICB9CisKKyAgLy8vIHNldFJlZ0NsYXNzIC0gU2V0IHRoZSByZWdpc3RlciBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLworICB2b2lkIHNldFJlZ0NsYXNzKHVuc2lnbmVkIFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpOworCisgIC8vLyBjcmVhdGVWaXJ0dWFsUmVnaXN0ZXIgLSBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB2aXJ0dWFsIHJlZ2lzdGVyIGluIHRoZQorICAvLy8gZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGNsYXNzLgorICAvLy8KKyAgdW5zaWduZWQgY3JlYXRlVmlydHVhbFJlZ2lzdGVyKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlZ0NsYXNzKTsKKworICAvLy8gZ2V0TGFzdFZpcnRSZWcgLSBSZXR1cm4gdGhlIGhpZ2hlc3QgY3VycmVudGx5IGFzc2lnbmVkIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLworICB1bnNpZ25lZCBnZXRMYXN0VmlydFJlZygpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKVZSZWdJbmZvLnNpemUoKStUYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyLTE7CisgIH0KKworICAvLy8gZ2V0UmVnQ2xhc3NWaXJ0UmVncyAtIFJldHVybiB0aGUgbGlzdCBvZiB2aXJ0dWFsIHJlZ2lzdGVycyBvZiB0aGUgZ2l2ZW4KKyAgLy8vIHRhcmdldCByZWdpc3RlciBjbGFzcy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICYKKyAgZ2V0UmVnQ2xhc3NWaXJ0UmVncyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIHJldHVybiBSZWdDbGFzczJWUmVnTWFwW1JDLT5nZXRJRCgpXTsKKyAgfQorCisgIC8vLyBzZXRSZWdBbGxvY2F0aW9uSGludCAtIFNwZWNpZnkgYSByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnQgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIuCisgIHZvaWQgc2V0UmVnQWxsb2NhdGlvbkhpbnQodW5zaWduZWQgUmVnLCB1bnNpZ25lZCBUeXBlLCB1bnNpZ25lZCBQcmVmUmVnKSB7CisgICAgUmVnIC09IFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXI7CisgICAgYXNzZXJ0KFJlZyA8IFZSZWdJbmZvLnNpemUoKSAmJiAiSW52YWxpZCB2cmVnISIpOworICAgIFJlZ0FsbG9jSGludHNbUmVnXS5maXJzdCAgPSBUeXBlOworICAgIFJlZ0FsbG9jSGludHNbUmVnXS5zZWNvbmQgPSBQcmVmUmVnOworICB9CisKKyAgLy8vIGdldFJlZ0FsbG9jYXRpb25IaW50IC0gUmV0dXJuIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnQgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+CisgIGdldFJlZ0FsbG9jYXRpb25IaW50KHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIFJlZyAtPSBUYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyOworICAgIGFzc2VydChSZWcgPCBWUmVnSW5mby5zaXplKCkgJiYgIkludmFsaWQgdnJlZyEiKTsKKyAgICByZXR1cm4gUmVnQWxsb2NIaW50c1tSZWddOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFBoeXNpY2FsIFJlZ2lzdGVyIFVzZSBJbmZvCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAKKyAgLy8vIGlzUGh5c1JlZ1VzZWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGlzIHVzZWQgaW4gdGhpcworICAvLy8gZnVuY3Rpb24uICBUaGlzIG9ubHkgd29ya3MgYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgYm9vbCBpc1BoeXNSZWdVc2VkKHVuc2lnbmVkIFJlZykgY29uc3QgeyByZXR1cm4gVXNlZFBoeXNSZWdzW1JlZ107IH0KKyAgCisgIC8vLyBzZXRQaHlzUmVnVXNlZCAtIE1hcmsgdGhlIHNwZWNpZmllZCByZWdpc3RlciB1c2VkIGluIHRoaXMgZnVuY3Rpb24uCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgYW5kIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIHZvaWQgc2V0UGh5c1JlZ1VzZWQodW5zaWduZWQgUmVnKSB7IFVzZWRQaHlzUmVnc1tSZWddID0gdHJ1ZTsgfQorCisgIC8vLyBhZGRQaHlzUmVnc1VzZWQgLSBNYXJrIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXJzIHVzZWQgaW4gdGhpcyBmdW5jdGlvbi4KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBhbmQgYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgdm9pZCBhZGRQaHlzUmVnc1VzZWQoY29uc3QgQml0VmVjdG9yICZSZWdzKSB7IFVzZWRQaHlzUmVncyB8PSBSZWdzOyB9CisKKyAgLy8vIHNldFBoeXNSZWdVbnVzZWQgLSBNYXJrIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdW51c2VkIGluIHRoaXMgZnVuY3Rpb24uCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgYW5kIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIHZvaWQgc2V0UGh5c1JlZ1VudXNlZCh1bnNpZ25lZCBSZWcpIHsgVXNlZFBoeXNSZWdzW1JlZ10gPSBmYWxzZTsgfQorCisgIC8vLyBjbG9zZVBoeXNSZWdzVXNlZCAtIEV4cGFuZCBVc2VkUGh5c1JlZ3MgdG8gaXRzIHRyYW5zaXRpdmUgY2xvc3VyZSBvdmVyCisgIC8vLyBzdWJyZWdpc3RlcnMuIFRoYXQgbWVhbnMgdGhhdCBpZiBSIGlzIHVzZWQsIHNvIGFyZSBhbGwgc3VicmVnaXN0ZXJzLgorICB2b2lkIGNsb3NlUGh5c1JlZ3NVc2VkKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyYpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBMaXZlSW4vTGl2ZU91dCBNYW5hZ2VtZW50CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAKKyAgLy8vIGFkZExpdmVJbi9PdXQgLSBBZGQgdGhlIHNwZWNpZmllZCByZWdpc3RlciBhcyBhIGxpdmUgaW4vb3V0LiAgTm90ZSB0aGF0IGl0CisgIC8vLyBpcyBhbiBlcnJvciB0byBhZGQgdGhlIHNhbWUgcmVnaXN0ZXIgdG8gdGhlIHNhbWUgc2V0IG1vcmUgdGhhbiBvbmNlLgorICB2b2lkIGFkZExpdmVJbih1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIHZyZWcgPSAwKSB7CisgICAgTGl2ZUlucy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUmVnLCB2cmVnKSk7CisgIH0KKyAgdm9pZCBhZGRMaXZlT3V0KHVuc2lnbmVkIFJlZykgeyBMaXZlT3V0cy5wdXNoX2JhY2soUmVnKTsgfQorICAKKyAgLy8gSXRlcmF0aW9uIHN1cHBvcnQgZm9yIGxpdmUgaW4vb3V0IHNldHMuICBUaGVzZSBzZXRzIGFyZSBrZXB0IGluIHNvcnRlZAorICAvLyBvcmRlciBieSB0aGVpciByZWdpc3RlciBudW1iZXIuCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLHVuc2lnbmVkPiA+Ojpjb25zdF9pdGVyYXRvcgorICBsaXZlaW5faXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBsaXZlb3V0X2l0ZXJhdG9yOworICBsaXZlaW5faXRlcmF0b3IgbGl2ZWluX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gTGl2ZUlucy5iZWdpbigpOyB9CisgIGxpdmVpbl9pdGVyYXRvciBsaXZlaW5fZW5kKCkgICBjb25zdCB7IHJldHVybiBMaXZlSW5zLmVuZCgpOyB9CisgIGJvb2wgICAgICAgICAgICBsaXZlaW5fZW1wdHkoKSBjb25zdCB7IHJldHVybiBMaXZlSW5zLmVtcHR5KCk7IH0KKyAgbGl2ZW91dF9pdGVyYXRvciBsaXZlb3V0X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gTGl2ZU91dHMuYmVnaW4oKTsgfQorICBsaXZlb3V0X2l0ZXJhdG9yIGxpdmVvdXRfZW5kKCkgICBjb25zdCB7IHJldHVybiBMaXZlT3V0cy5lbmQoKTsgfQorICBib29sICAgICAgICAgICAgIGxpdmVvdXRfZW1wdHkoKSBjb25zdCB7IHJldHVybiBMaXZlT3V0cy5lbXB0eSgpOyB9CisKKyAgYm9vbCBpc0xpdmVJbih1bnNpZ25lZCBSZWcpIGNvbnN0OworICBib29sIGlzTGl2ZU91dCh1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgIC8vLyBnZXRMaXZlSW5QaHlzUmVnIC0gSWYgVlJlZyBpcyBhIGxpdmUtaW4gdmlydHVhbCByZWdpc3RlciwgcmV0dXJuIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyBsaXZlLWluIHBoeXNpY2FsIHJlZ2lzdGVyLgorICB1bnNpZ25lZCBnZXRMaXZlSW5QaHlzUmVnKHVuc2lnbmVkIFZSZWcpIGNvbnN0OworCisgIC8vLyBnZXRMaXZlSW5WaXJ0UmVnIC0gSWYgUFJlZyBpcyBhIGxpdmUtaW4gcGh5c2ljYWwgcmVnaXN0ZXIsIHJldHVybiB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgbGl2ZS1pbiBwaHlzaWNhbCByZWdpc3Rlci4KKyAgdW5zaWduZWQgZ2V0TGl2ZUluVmlydFJlZyh1bnNpZ25lZCBQUmVnKSBjb25zdDsKKworICAvLy8gRW1pdExpdmVJbkNvcGllcyAtIEVtaXQgY29waWVzIHRvIGluaXRpYWxpemUgbGl2ZWluIHZpcnR1YWwgcmVnaXN0ZXJzCisgIC8vLyBpbnRvIHRoZSBnaXZlbiBlbnRyeSBibG9jay4KKyAgdm9pZCBFbWl0TGl2ZUluQ29waWVzKE1hY2hpbmVCYXNpY0Jsb2NrICpFbnRyeU1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkpOworCitwcml2YXRlOgorICB2b2lkIEhhbmRsZVZSZWdMaXN0UmVhbGxvY2F0aW9uKCk7CisgIAorcHVibGljOgorICAvLy8gZGVmdXNlY2hhaW5faXRlcmF0b3IgLSBUaGlzIGNsYXNzIHByb3ZpZGVzIGl0ZXJhdG9yIHN1cHBvcnQgZm9yIG1hY2hpbmUKKyAgLy8vIG9wZXJhbmRzIGluIHRoZSBmdW5jdGlvbiB0aGF0IHVzZSBvciBkZWZpbmUgYSBzcGVjaWZpYyByZWdpc3Rlci4gIElmCisgIC8vLyBSZXR1cm5Vc2VzIGlzIHRydWUgaXQgcmV0dXJucyB1c2VzIG9mIHJlZ2lzdGVycywgaWYgUmV0dXJuRGVmcyBpcyB0cnVlIGl0CisgIC8vLyByZXR1cm5zIGRlZnMuICBJZiBuZWl0aGVyIGFyZSB0cnVlIHRoZW4geW91IGFyZSBzaWxseSBhbmQgaXQgYWx3YXlzCisgIC8vLyByZXR1cm5zIGVuZCgpLiAgSWYgU2tpcERlYnVnIGlzIHRydWUgaXQgc2tpcHMgdXNlcyBtYXJrZWQgRGVidWcKKyAgLy8vIHdoZW4gaW5jcmVtZW50aW5nLgorICB0ZW1wbGF0ZTxib29sIFJldHVyblVzZXMsIGJvb2wgUmV0dXJuRGVmcywgYm9vbCBTa2lwRGVidWc+CisgIGNsYXNzIGRlZnVzZWNoYWluX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBNYWNoaW5lSW5zdHIsIHB0cmRpZmZfdD4geworICAgIE1hY2hpbmVPcGVyYW5kICpPcDsKKyAgICBleHBsaWNpdCBkZWZ1c2VjaGFpbl9pdGVyYXRvcihNYWNoaW5lT3BlcmFuZCAqb3ApIDogT3Aob3ApIHsKKyAgICAgIC8vIElmIHRoZSBmaXJzdCBub2RlIGlzbid0IG9uZSB3ZSdyZSBpbnRlcmVzdGVkIGluLCBhZHZhbmNlIHRvIG9uZSB0aGF0CisgICAgICAvLyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KKyAgICAgIGlmIChvcCkgeworICAgICAgICBpZiAoKCFSZXR1cm5Vc2VzICYmIG9wLT5pc1VzZSgpKSB8fAorICAgICAgICAgICAgKCFSZXR1cm5EZWZzICYmIG9wLT5pc0RlZigpKSB8fAorICAgICAgICAgICAgKFNraXBEZWJ1ZyAmJiBvcC0+aXNEZWJ1ZygpKSkKKyAgICAgICAgICArKyp0aGlzOworICAgICAgfQorICAgIH0KKyAgICBmcmllbmQgY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIsIHB0cmRpZmZfdD46OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciwgcHRyZGlmZl90Pjo6cG9pbnRlciBwb2ludGVyOworICAgIAorICAgIGRlZnVzZWNoYWluX2l0ZXJhdG9yKGNvbnN0IGRlZnVzZWNoYWluX2l0ZXJhdG9yICZJKSA6IE9wKEkuT3ApIHt9CisgICAgZGVmdXNlY2hhaW5faXRlcmF0b3IoKSA6IE9wKDApIHt9CisgICAgCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRlZnVzZWNoYWluX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgICByZXR1cm4gT3AgPT0geC5PcDsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGRlZnVzZWNoYWluX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oeCk7CisgICAgfQorICAgIAorICAgIC8vLyBhdEVuZCAtIHJldHVybiB0cnVlIGlmIHRoaXMgaXRlcmF0b3IgaXMgZXF1YWwgdG8gcmVnX2VuZCgpIG9uIHRoZSB2YWx1ZS4KKyAgICBib29sIGF0RW5kKCkgY29uc3QgeyByZXR1cm4gT3AgPT0gMDsgfQorICAgIAorICAgIC8vIEl0ZXJhdG9yIHRyYXZlcnNhbDogZm9yd2FyZCBpdGVyYXRpb24gb25seQorICAgIGRlZnVzZWNoYWluX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGluY3JlbWVudCBlbmQgaXRlcmF0b3IhIik7CisgICAgICBPcCA9IE9wLT5nZXROZXh0T3BlcmFuZEZvclJlZygpOworICAgICAgCisgICAgICAvLyBJZiB0aGlzIGlzIGFuIG9wZXJhbmQgd2UgZG9uJ3QgY2FyZSBhYm91dCwgc2tpcCBpdC4KKyAgICAgIHdoaWxlIChPcCAmJiAoKCFSZXR1cm5Vc2VzICYmIE9wLT5pc1VzZSgpKSB8fCAKKyAgICAgICAgICAgICAgICAgICAgKCFSZXR1cm5EZWZzICYmIE9wLT5pc0RlZigpKSB8fAorICAgICAgICAgICAgICAgICAgICAoU2tpcERlYnVnICYmIE9wLT5pc0RlYnVnKCkpKSkKKyAgICAgICAgT3AgPSBPcC0+Z2V0TmV4dE9wZXJhbmRGb3JSZWcoKTsKKyAgICAgIAorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBkZWZ1c2VjaGFpbl9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgICAgZGVmdXNlY2hhaW5faXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgICAgfQorCisgICAgLy8vIHNraXBJbnN0cnVjdGlvbiAtIG1vdmUgZm9yd2FyZCB1bnRpbCByZWFjaGluZyBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbi4KKyAgICAvLy8gUmV0dXJuIHRoZSBza2lwcGVkIGluc3RydWN0aW9uIHRoYXQgaXMgbm8gbG9uZ2VyIHBvaW50ZWQgdG8sIG9yIE5VTEwgaWYKKyAgICAvLy8gYWxyZWFkeSBwb2ludGluZyB0byBlbmQoKS4KKyAgICBNYWNoaW5lSW5zdHIgKnNraXBJbnN0cnVjdGlvbigpIHsKKyAgICAgIGlmICghT3ApIHJldHVybiAwOworICAgICAgTWFjaGluZUluc3RyICpNSSA9IE9wLT5nZXRQYXJlbnQoKTsKKyAgICAgIGRvICsrKnRoaXM7CisgICAgICB3aGlsZSAoT3AgJiYgT3AtPmdldFBhcmVudCgpID09IE1JKTsKKyAgICAgIHJldHVybiBNSTsKKyAgICB9CisKKyAgICBNYWNoaW5lT3BlcmFuZCAmZ2V0T3BlcmFuZCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGRlcmVmZXJlbmNlIGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIHJldHVybiAqT3A7CisgICAgfQorICAgIAorICAgIC8vLyBnZXRPcGVyYW5kTm8gLSBSZXR1cm4gdGhlIG9wZXJhbmQgIyBvZiB0aGlzIE1hY2hpbmVPcGVyYW5kIGluIGl0cworICAgIC8vLyBNYWNoaW5lSW5zdHIuCisgICAgdW5zaWduZWQgZ2V0T3BlcmFuZE5vKCkgY29uc3QgeworICAgICAgYXNzZXJ0KE9wICYmICJDYW5ub3QgZGVyZWZlcmVuY2UgZW5kIGl0ZXJhdG9yISIpOworICAgICAgcmV0dXJuIE9wIC0gJk9wLT5nZXRQYXJlbnQoKS0+Z2V0T3BlcmFuZCgwKTsKKyAgICB9CisgICAgCisgICAgLy8gUmV0cmlldmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgb3BlcmFuZC4KKyAgICBNYWNoaW5lSW5zdHIgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGRlcmVmZXJlbmNlIGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIHJldHVybiAqT3AtPmdldFBhcmVudCgpOworICAgIH0KKyAgICAKKyAgICBNYWNoaW5lSW5zdHIgKm9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBlbmQgaXRlcmF0b3IhIik7CisgICAgICByZXR1cm4gT3AtPmdldFBhcmVudCgpOworICAgIH0KKyAgfTsKKyAgCit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVSZWxvY2F0aW9uLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUmVsb2NhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTY3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUmVsb2NhdGlvbi5oCkBAIC0wLDAgKzEsMzQyIEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lUmVsb2NhdGlvbi5oIC0gVGFyZ2V0IFJlbG9jYXRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWNoaW5lUmVsb2NhdGlvbiBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FUkVMT0NBVElPTl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FUkVMT0NBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworCisvLy8gTWFjaGluZVJlbG9jYXRpb24gLSBUaGlzIHJlcHJlc2VudHMgYSB0YXJnZXQtc3BlY2lmaWMgcmVsb2NhdGlvbiB2YWx1ZSwKKy8vLyBwcm9kdWNlZCBieSB0aGUgY29kZSBlbWl0dGVyLiAgVGhpcyByZWxvY2F0aW9uIGlzIHJlc29sdmVkIGFmdGVyIHRoZSBoYXMKKy8vLyBiZWVuIGVtaXR0ZWQsIGVpdGhlciB0byBhbiBvYmplY3QgZmlsZSBvciB0byBtZW1vcnksIHdoZW4gdGhlIHRhcmdldCBvZiB0aGUKKy8vLyByZWxvY2F0aW9uIGNhbiBiZSByZXNvbHZlZC4KKy8vLworLy8vIEEgcmVsb2NhdGlvbiBpcyBtYWRlIHVwIG9mIHRoZSBmb2xsb3dpbmcgbG9naWNhbCBwb3J0aW9uczoKKy8vLyAgIDEuIEFuIG9mZnNldCBpbiB0aGUgbWFjaGluZSBjb2RlIGJ1ZmZlciwgdGhlIGxvY2F0aW9uIHRvIG1vZGlmeS4KKy8vLyAgIDIuIEEgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb24gdHlwZSAoYSBudW1iZXIgZnJvbSAwIHRvIDYzKS4KKy8vLyAgIDMuIEEgc3ltYm9sIGJlaW5nIHJlZmVyZW5jZWQsIGVpdGhlciBhcyBhIEdsb2JhbFZhbHVlKiBvciBhcyBhIHN0cmluZy4KKy8vLyAgIDQuIEFuIG9wdGlvbmFsIGNvbnN0YW50IHZhbHVlIHRvIGJlIGFkZGVkIHRvIHRoZSByZWZlcmVuY2UuCisvLy8gICA1LiBBIGJpdCwgQ2FuUmV3cml0ZSwgd2hpY2ggaW5kaWNhdGVzIHRvIHRoZSBKSVQgdGhhdCBhIGZ1bmN0aW9uIHN0dWIgaXMKKy8vLyAgICAgIG5vdCBuZWVkZWQgZm9yIHRoZSByZWxvY2F0aW9uLgorLy8vICAgNi4gQW4gaW5kZXggaW50byB0aGUgR09ULCBpZiB0aGUgdGFyZ2V0IHVzZXMgYSBHT1QKKy8vLworY2xhc3MgTWFjaGluZVJlbG9jYXRpb24geworICBlbnVtIEFkZHJlc3NUeXBlIHsKKyAgICBpc1Jlc3VsdCwgICAgICAgICAvLyBSZWxvY2F0aW9uIGhhcyBiZSB0cmFuc2Zvcm1lZCBpbnRvIGl0cyByZXN1bHQgcG9pbnRlci4KKyAgICBpc0dWLCAgICAgICAgICAgICAvLyBUaGUgVGFyZ2V0LkdWIGZpZWxkIGlzIHZhbGlkLgorICAgIGlzSW5kaXJlY3RTeW0sICAgIC8vIFJlbG9jYXRpb24gb2YgYW4gaW5kaXJlY3Qgc3ltYm9sLgorICAgIGlzQkIsICAgICAgICAgICAgIC8vIFJlbG9jYXRpb24gb2YgQkIgYWRkcmVzcy4KKyAgICBpc0V4dFN5bSwgICAgICAgICAvLyBUaGUgVGFyZ2V0LkV4dFN5bSBmaWVsZCBpcyB2YWxpZC4KKyAgICBpc0NvbnN0UG9vbCwgICAgICAvLyBSZWxvY2F0aW9uIG9mIGNvbnN0YW50IHBvb2wgYWRkcmVzcy4KKyAgICBpc0p1bXBUYWJsZSwgICAgICAvLyBSZWxvY2F0aW9uIG9mIGp1bXAgdGFibGUgYWRkcmVzcy4KKyAgICBpc0dPVEluZGV4ICAgICAgICAvLyBUaGUgVGFyZ2V0LkdPVEluZGV4IGZpZWxkIGlzIHZhbGlkLgorICB9OworICAKKyAgLy8vIE9mZnNldCAtIFRoaXMgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY29kZSBidWZmZXIgb2YgdGhlCisgIC8vLyByZWxvY2F0aW9uIHRvIHBlcmZvcm0uCisgIHVpbnRwdHJfdCBPZmZzZXQ7CisgIAorICAvLy8gQ29uc3RhbnRWYWwgLSBBIGZpZWxkIHRoYXQgbWF5IGJlIHVzZWQgYnkgdGhlIHRhcmdldCByZWxvY2F0aW9uIHR5cGUuCisgIGludHB0cl90IENvbnN0YW50VmFsOworCisgIHVuaW9uIHsKKyAgICB2b2lkICpSZXN1bHQ7ICAgICAgICAgICAvLyBJZiB0aGlzIGhhcyBiZWVuIHJlc29sdmVkIHRvIGEgcmVzb2x2ZWQgcG9pbnRlcgorICAgIEdsb2JhbFZhbHVlICpHVjsgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwb2ludGVyIHRvIGEgR1Ygb3IgYW4gaW5kaXJlY3QgcmVmLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkI7IC8vIElmIHRoaXMgaXMgYSBwb2ludGVyIHRvIGEgTExWTSBCQgorICAgIGNvbnN0IGNoYXIgKkV4dFN5bTsgICAgIC8vIElmIHRoaXMgaXMgYSBwb2ludGVyIHRvIGEgbmFtZWQgc3ltYm9sCisgICAgdW5zaWduZWQgSW5kZXg7ICAgICAgICAgLy8gQ29uc3RhbnQgcG9vbCAvIGp1bXAgdGFibGUgaW5kZXgKKyAgICB1bnNpZ25lZCBHT1RJbmRleDsgICAgICAvLyBJbmRleCBpbiB0aGUgR09UIG9mIHRoaXMgc3ltYm9sL2dsb2JhbAorICB9IFRhcmdldDsKKworICB1bnNpZ25lZCBUYXJnZXRSZWxvVHlwZSA6IDY7IC8vIFRoZSB0YXJnZXQgcmVsb2NhdGlvbiBJRAorICBBZGRyZXNzVHlwZSBBZGRyVHlwZSAgICA6IDQ7IC8vIFRoZSBmaWVsZCBvZiBUYXJnZXQgdG8gdXNlCisgIGJvb2wgTWF5TmVlZEZhclN0dWIgICAgIDogMTsgLy8gVHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gbWF5IHJlcXVpcmUgYSBmYXItc3R1YgorICBib29sIEdPVFJlbGF0aXZlICAgICAgICA6IDE7IC8vIFNob3VsZCB0aGlzIHJlbG9jYXRpb24gYmUgcmVsYXRpdmUgdG8gdGhlIEdPVD8KKyAgYm9vbCBUYXJnZXRSZXNvbHZlICAgICAgOiAxOyAvLyBUcnVlIGlmIHRhcmdldCBzaG91bGQgcmVzb2x2ZSB0aGUgYWRkcmVzcworCitwdWJsaWM6CisgLy8gUmVsb2NhdGlvbiB0eXBlcyB1c2VkIGluIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4gIEN1cnJlbnRseSwgcmVsb2NhdGlvbgorIC8vIGVudHJpZXMgZm9yIGFsbCB0aGluZ3MgdXNlIHRoZSBnZW5lcmljIFZBTklMTEEgdHlwZSB1bnRpbCB0aGV5IGFyZSByZWZpbmVkCisgLy8gaW50byB0YXJnZXQgcmVsb2NhdGlvbiB0eXBlcy4KKyAgZW51bSBSZWxvY2F0aW9uVHlwZSB7CisgICAgVkFOSUxMQQorICB9OworICAKKyAgLy8vIE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRHViAtIFJldHVybiBhIHJlbG9jYXRpb24gZW50cnkgZm9yIGEgR2xvYmFsVmFsdWUuCisgIC8vLworICBzdGF0aWMgTWFjaGluZVJlbG9jYXRpb24gZ2V0R1YodWludHB0cl90IG9mZnNldCwgdW5zaWduZWQgUmVsb2NhdGlvblR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWUgKkdWLCBpbnRwdHJfdCBjc3QgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNYXlOZWVkRmFyU3R1YiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEdPVHJlbGF0aXZlID0gMCkgeworICAgIGFzc2VydCgoUmVsb2NhdGlvblR5cGUgJiB+NjMpID09IDAgJiYgIlJlbG9jYXRpb24gdHlwZSB0b28gbGFyZ2UhIik7CisgICAgTWFjaGluZVJlbG9jYXRpb24gUmVzdWx0OworICAgIFJlc3VsdC5PZmZzZXQgPSBvZmZzZXQ7CisgICAgUmVzdWx0LkNvbnN0YW50VmFsID0gY3N0OworICAgIFJlc3VsdC5UYXJnZXRSZWxvVHlwZSA9IFJlbG9jYXRpb25UeXBlOworICAgIFJlc3VsdC5BZGRyVHlwZSA9IGlzR1Y7CisgICAgUmVzdWx0Lk1heU5lZWRGYXJTdHViID0gTWF5TmVlZEZhclN0dWI7CisgICAgUmVzdWx0LkdPVFJlbGF0aXZlID0gR09UcmVsYXRpdmU7CisgICAgUmVzdWx0LlRhcmdldFJlc29sdmUgPSBmYWxzZTsKKyAgICBSZXN1bHQuVGFyZ2V0LkdWID0gR1Y7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vLyBNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0SW5kaXJlY3RTeW1ib2wgLSBSZXR1cm4gYSByZWxvY2F0aW9uIGVudHJ5IGZvciBhbgorICAvLy8gaW5kaXJlY3Qgc3ltYm9sLgorICBzdGF0aWMgTWFjaGluZVJlbG9jYXRpb24gZ2V0SW5kaXJlY3RTeW1ib2wodWludHB0cl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlbG9jYXRpb25UeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlICpHViwgaW50cHRyX3QgY3N0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWF5TmVlZEZhclN0dWIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBHT1RyZWxhdGl2ZSA9IDApIHsKKyAgICBhc3NlcnQoKFJlbG9jYXRpb25UeXBlICYgfjYzKSA9PSAwICYmICJSZWxvY2F0aW9uIHR5cGUgdG9vIGxhcmdlISIpOworICAgIE1hY2hpbmVSZWxvY2F0aW9uIFJlc3VsdDsKKyAgICBSZXN1bHQuT2Zmc2V0ID0gb2Zmc2V0OworICAgIFJlc3VsdC5Db25zdGFudFZhbCA9IGNzdDsKKyAgICBSZXN1bHQuVGFyZ2V0UmVsb1R5cGUgPSBSZWxvY2F0aW9uVHlwZTsKKyAgICBSZXN1bHQuQWRkclR5cGUgPSBpc0luZGlyZWN0U3ltOworICAgIFJlc3VsdC5NYXlOZWVkRmFyU3R1YiA9IE1heU5lZWRGYXJTdHViOworICAgIFJlc3VsdC5HT1RSZWxhdGl2ZSA9IEdPVHJlbGF0aXZlOworICAgIFJlc3VsdC5UYXJnZXRSZXNvbHZlID0gZmFsc2U7CisgICAgUmVzdWx0LlRhcmdldC5HViA9IEdWOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gTWFjaGluZVJlbG9jYXRpb246OmdldEJCIC0gUmV0dXJuIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgYSBCQi4KKyAgLy8vCisgIHN0YXRpYyBNYWNoaW5lUmVsb2NhdGlvbiBnZXRCQih1aW50cHRyX3Qgb2Zmc2V0LHVuc2lnbmVkIFJlbG9jYXRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwgaW50cHRyX3QgY3N0ID0gMCkgeworICAgIGFzc2VydCgoUmVsb2NhdGlvblR5cGUgJiB+NjMpID09IDAgJiYgIlJlbG9jYXRpb24gdHlwZSB0b28gbGFyZ2UhIik7CisgICAgTWFjaGluZVJlbG9jYXRpb24gUmVzdWx0OworICAgIFJlc3VsdC5PZmZzZXQgPSBvZmZzZXQ7CisgICAgUmVzdWx0LkNvbnN0YW50VmFsID0gY3N0OworICAgIFJlc3VsdC5UYXJnZXRSZWxvVHlwZSA9IFJlbG9jYXRpb25UeXBlOworICAgIFJlc3VsdC5BZGRyVHlwZSA9IGlzQkI7CisgICAgUmVzdWx0Lk1heU5lZWRGYXJTdHViID0gZmFsc2U7CisgICAgUmVzdWx0LkdPVFJlbGF0aXZlID0gZmFsc2U7CisgICAgUmVzdWx0LlRhcmdldFJlc29sdmUgPSBmYWxzZTsKKyAgICBSZXN1bHQuVGFyZ2V0Lk1CQiA9IE1CQjsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRFeHRTeW0gLSBSZXR1cm4gYSByZWxvY2F0aW9uIGVudHJ5IGZvciBhbiBleHRlcm5hbAorICAvLy8gc3ltYm9sLCBsaWtlICJmcmVlIi4KKyAgLy8vCisgIHN0YXRpYyBNYWNoaW5lUmVsb2NhdGlvbiBnZXRFeHRTeW0odWludHB0cl90IG9mZnNldCwgdW5zaWduZWQgUmVsb2NhdGlvblR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkVTLCBpbnRwdHJfdCBjc3QgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgR09UcmVsYXRpdmUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTmVlZFN0dWIgPSB0cnVlKSB7CisgICAgYXNzZXJ0KChSZWxvY2F0aW9uVHlwZSAmIH42MykgPT0gMCAmJiAiUmVsb2NhdGlvbiB0eXBlIHRvbyBsYXJnZSEiKTsKKyAgICBNYWNoaW5lUmVsb2NhdGlvbiBSZXN1bHQ7CisgICAgUmVzdWx0Lk9mZnNldCA9IG9mZnNldDsKKyAgICBSZXN1bHQuQ29uc3RhbnRWYWwgPSBjc3Q7CisgICAgUmVzdWx0LlRhcmdldFJlbG9UeXBlID0gUmVsb2NhdGlvblR5cGU7CisgICAgUmVzdWx0LkFkZHJUeXBlID0gaXNFeHRTeW07CisgICAgUmVzdWx0Lk1heU5lZWRGYXJTdHViID0gTmVlZFN0dWI7CisgICAgUmVzdWx0LkdPVFJlbGF0aXZlID0gR09UcmVsYXRpdmU7CisgICAgUmVzdWx0LlRhcmdldFJlc29sdmUgPSBmYWxzZTsKKyAgICBSZXN1bHQuVGFyZ2V0LkV4dFN5bSA9IEVTOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gTWFjaGluZVJlbG9jYXRpb246OmdldENvbnN0UG9vbCAtIFJldHVybiBhIHJlbG9jYXRpb24gZW50cnkgZm9yIGEgY29uc3RhbnQKKyAgLy8vIHBvb2wgZW50cnkuCisgIC8vLworICBzdGF0aWMgTWFjaGluZVJlbG9jYXRpb24gZ2V0Q29uc3RQb29sKHVpbnRwdHJfdCBvZmZzZXQsdW5zaWduZWQgUmVsb2NhdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ1BJLCBpbnRwdHJfdCBjc3QgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGV0VGFyZ2V0UmVzb2x2ZSA9IGZhbHNlKSB7CisgICAgYXNzZXJ0KChSZWxvY2F0aW9uVHlwZSAmIH42MykgPT0gMCAmJiAiUmVsb2NhdGlvbiB0eXBlIHRvbyBsYXJnZSEiKTsKKyAgICBNYWNoaW5lUmVsb2NhdGlvbiBSZXN1bHQ7CisgICAgUmVzdWx0Lk9mZnNldCA9IG9mZnNldDsKKyAgICBSZXN1bHQuQ29uc3RhbnRWYWwgPSBjc3Q7CisgICAgUmVzdWx0LlRhcmdldFJlbG9UeXBlID0gUmVsb2NhdGlvblR5cGU7CisgICAgUmVzdWx0LkFkZHJUeXBlID0gaXNDb25zdFBvb2w7CisgICAgUmVzdWx0Lk1heU5lZWRGYXJTdHViID0gZmFsc2U7CisgICAgUmVzdWx0LkdPVFJlbGF0aXZlID0gZmFsc2U7CisgICAgUmVzdWx0LlRhcmdldFJlc29sdmUgPSBsZXRUYXJnZXRSZXNvbHZlOworICAgIFJlc3VsdC5UYXJnZXQuSW5kZXggPSBDUEk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vLyBNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0SnVtcFRhYmxlIC0gUmV0dXJuIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgYSBqdW1wCisgIC8vLyB0YWJsZSBlbnRyeS4KKyAgLy8vCisgIHN0YXRpYyBNYWNoaW5lUmVsb2NhdGlvbiBnZXRKdW1wVGFibGUodWludHB0cl90IG9mZnNldCx1bnNpZ25lZCBSZWxvY2F0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBKVEksIGludHB0cl90IGNzdCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsZXRUYXJnZXRSZXNvbHZlID0gZmFsc2UpIHsKKyAgICBhc3NlcnQoKFJlbG9jYXRpb25UeXBlICYgfjYzKSA9PSAwICYmICJSZWxvY2F0aW9uIHR5cGUgdG9vIGxhcmdlISIpOworICAgIE1hY2hpbmVSZWxvY2F0aW9uIFJlc3VsdDsKKyAgICBSZXN1bHQuT2Zmc2V0ID0gb2Zmc2V0OworICAgIFJlc3VsdC5Db25zdGFudFZhbCA9IGNzdDsKKyAgICBSZXN1bHQuVGFyZ2V0UmVsb1R5cGUgPSBSZWxvY2F0aW9uVHlwZTsKKyAgICBSZXN1bHQuQWRkclR5cGUgPSBpc0p1bXBUYWJsZTsKKyAgICBSZXN1bHQuTWF5TmVlZEZhclN0dWIgPSBmYWxzZTsKKyAgICBSZXN1bHQuR09UUmVsYXRpdmUgPSBmYWxzZTsKKyAgICBSZXN1bHQuVGFyZ2V0UmVzb2x2ZSA9IGxldFRhcmdldFJlc29sdmU7CisgICAgUmVzdWx0LlRhcmdldC5JbmRleCA9IEpUSTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIGdldE1hY2hpbmVDb2RlT2Zmc2V0IC0gUmV0dXJuIHRoZSBvZmZzZXQgaW50byB0aGUgY29kZSBidWZmZXIgdGhhdCB0aGUKKyAgLy8vIHJlbG9jYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4KKyAgaW50cHRyX3QgZ2V0TWFjaGluZUNvZGVPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIE9mZnNldDsKKyAgfQorCisgIC8vLyBnZXRSZWxvY2F0aW9uVHlwZSAtIFJldHVybiB0aGUgdGFyZ2V0LXNwZWNpZmljIHJlbG9jYXRpb24gSUQgZm9yIHRoaXMKKyAgLy8vIHJlbG9jYXRpb24uCisgIHVuc2lnbmVkIGdldFJlbG9jYXRpb25UeXBlKCkgY29uc3QgeworICAgIHJldHVybiBUYXJnZXRSZWxvVHlwZTsKKyAgfQorCisgIC8vLyBnZXRDb25zdGFudFZhbCAtIEdldCB0aGUgY29uc3RhbnQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsb2NhdGlvbi4KKyAgLy8vIFRoaXMgaXMgb2Z0ZW4gYW4gb2Zmc2V0IGZyb20gdGhlIHN5bWJvbC4KKyAgLy8vCisgIGludHB0cl90IGdldENvbnN0YW50VmFsKCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudFZhbDsKKyAgfQorCisgIC8vLyBzZXRDb25zdGFudFZhbCAtIFNldCB0aGUgY29uc3RhbnQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsb2NhdGlvbi4KKyAgLy8vIFRoaXMgaXMgb2Z0ZW4gYW4gb2Zmc2V0IGZyb20gdGhlIHN5bWJvbC4KKyAgLy8vCisgIHZvaWQgc2V0Q29uc3RhbnRWYWwoaW50cHRyX3QgdmFsKSB7CisgICAgQ29uc3RhbnRWYWwgPSB2YWw7CisgIH0KKworICAvLy8gaXNHbG9iYWxWYWx1ZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBpcyBhIEdsb2JhbFZhbHVlLCBhcworICAvLy8gb3Bwb3NlZCB0byBhIGNvbnN0YW50IHN0cmluZy4KKyAgYm9vbCBpc0dsb2JhbFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBBZGRyVHlwZSA9PSBpc0dWOworICB9CisKKyAgLy8vIGlzSW5kaXJlY3RTeW1ib2wgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gaXMgdGhlIGFkZHJlc3MgYW4KKyAgLy8vIGluZGlyZWN0IHN5bWJvbAorICBib29sIGlzSW5kaXJlY3RTeW1ib2woKSBjb25zdCB7CisgICAgcmV0dXJuIEFkZHJUeXBlID09IGlzSW5kaXJlY3RTeW07CisgIH0KKworICAvLy8gaXNCYXNpY0Jsb2NrIC0gUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIGlzIGEgYmFzaWMgYmxvY2sgcmVmZXJlbmNlLgorICAvLy8KKyAgYm9vbCBpc0Jhc2ljQmxvY2soKSBjb25zdCB7CisgICAgcmV0dXJuIEFkZHJUeXBlID09IGlzQkI7CisgIH0KKworICAvLy8gaXNFeHRlcm5hbFN5bWJvbCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBjb25zdGFudCBzdHJpbmcuCisgIC8vLworICBib29sIGlzRXh0ZXJuYWxTeW1ib2woKSBjb25zdCB7CisgICAgcmV0dXJuIEFkZHJUeXBlID09IGlzRXh0U3ltOworICB9CisKKyAgLy8vIGlzQ29uc3RhbnRQb29sSW5kZXggLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgY29uc3RhbnQgcG9vbCByZWZlcmVuY2UuCisgIC8vLworICBib29sIGlzQ29uc3RhbnRQb29sSW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIEFkZHJUeXBlID09IGlzQ29uc3RQb29sOworICB9CisKKyAgLy8vIGlzSnVtcFRhYmxlSW5kZXggLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEganVtcCB0YWJsZSByZWZlcmVuY2UuCisgIC8vLworICBib29sIGlzSnVtcFRhYmxlSW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIEFkZHJUeXBlID09IGlzSnVtcFRhYmxlOworICB9CisKKyAgLy8vIGlzR09UUmVsYXRpdmUgLSBSZXR1cm4gdHJ1ZSB0aGUgdGFyZ2V0IHdhbnRzIHRoZSBpbmRleCBpbnRvIHRoZSBHT1Qgb2YKKyAgLy8vIHRoZSBzeW1ib2wgcmF0aGVyIHRoYW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4KKyAgYm9vbCBpc0dPVFJlbGF0aXZlKCkgY29uc3QgeworICAgIHJldHVybiBHT1RSZWxhdGl2ZTsKKyAgfQorCisgIC8vLyBtYXlOZWVkRmFyU3R1YiAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBKSVQgZm9yIHRoaXMgdGFyZ2V0IG1heQorICAvLy8gbmVlZCBlaXRoZXIgYSBzdHViIGZ1bmN0aW9uIG9yIGFuIGluZGlyZWN0IGdsb2JhbC12YXJpYWJsZSBsb2FkIHRvIGhhbmRsZQorICAvLy8gdGhlIHJlbG9jYXRlZCBHbG9iYWxWYWx1ZSByZWZlcmVuY2UuICBGb3IgZXhhbXBsZSwgdGhlIHg4Ni02NCBjYWxsCisgIC8vLyBpbnN0cnVjdGlvbiBjYW4gb25seSBjYWxsIGZ1bmN0aW9ucyB3aXRoaW4gKy8tMkdCIG9mIHRoZSBjYWxsIHNpdGUuCisgIC8vLyBBbnl0aGluZyBmYXJ0aGVyIGF3YXkgbmVlZHMgYSBsb25nZXIgbW92K2NhbGwgc2VxdWVuY2UsIHdoaWNoIGNhbid0IGp1c3QKKyAgLy8vIGJlIHdyaXR0ZW4gb24gdG9wIG9mIHRoZSBleGlzdGluZyBjYWxsLgorICBib29sIG1heU5lZWRGYXJTdHViKCkgY29uc3QgeworICAgIHJldHVybiBNYXlOZWVkRmFyU3R1YjsKKyAgfQorCisgIC8vLyBsZXRUYXJnZXRSZXNvbHZlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBKSVRJbmZvIGlzIHVzdWFsbHkKKyAgLy8vIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvY2F0aW9uLgorICBib29sIGxldFRhcmdldFJlc29sdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIFRhcmdldFJlc29sdmU7CisgIH0KKworICAvLy8gZ2V0R2xvYmFsVmFsdWUgLSBJZiB0aGlzIGlzIGEgZ2xvYmFsIHZhbHVlIHJlZmVyZW5jZSwgcmV0dXJuIHRoZQorICAvLy8gcmVmZXJlbmNlZCBnbG9iYWwuCisgIEdsb2JhbFZhbHVlICpnZXRHbG9iYWxWYWx1ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGlzR2xvYmFsVmFsdWUoKSB8fCBpc0luZGlyZWN0U3ltYm9sKCkpICYmCisgICAgICAgICAgICJUaGlzIGlzIG5vdCBhIGdsb2JhbCB2YWx1ZSByZWZlcmVuY2UhIik7CisgICAgcmV0dXJuIFRhcmdldC5HVjsKKyAgfQorCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRCYXNpY0Jsb2NrKCkgY29uc3QgeworICAgIGFzc2VydChpc0Jhc2ljQmxvY2soKSAmJiAiVGhpcyBpcyBub3QgYSBiYXNpYyBibG9jayByZWZlcmVuY2UhIik7CisgICAgcmV0dXJuIFRhcmdldC5NQkI7CisgIH0KKworICAvLy8gZ2V0U3RyaW5nIC0gSWYgdGhpcyBpcyBhIHN0cmluZyB2YWx1ZSwgcmV0dXJuIHRoZSBzdHJpbmcgcmVmZXJlbmNlLgorICAvLy8KKyAgY29uc3QgY2hhciAqZ2V0RXh0ZXJuYWxTeW1ib2woKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzRXh0ZXJuYWxTeW1ib2woKSAmJiAiVGhpcyBpcyBub3QgYW4gZXh0ZXJuYWwgc3ltYm9sIHJlZmVyZW5jZSEiKTsKKyAgICByZXR1cm4gVGFyZ2V0LkV4dFN5bTsKKyAgfQorCisgIC8vLyBnZXRDb25zdGFudFBvb2xJbmRleCAtIElmIHRoaXMgaXMgYSBjb25zdCBwb29sIHJlZmVyZW5jZSwgcmV0dXJuCisgIC8vLyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbC4KKyAgdW5zaWduZWQgZ2V0Q29uc3RhbnRQb29sSW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29uc3RhbnRQb29sSW5kZXgoKSAmJiAiVGhpcyBpcyBub3QgYSBjb25zdGFudCBwb29sIHJlZmVyZW5jZSEiKTsKKyAgICByZXR1cm4gVGFyZ2V0LkluZGV4OworICB9CisKKyAgLy8vIGdldEp1bXBUYWJsZUluZGV4IC0gSWYgdGhpcyBpcyBhIGp1bXAgdGFibGUgcmVmZXJlbmNlLCByZXR1cm4KKyAgLy8vIHRoZSBpbmRleCBpbnRvIHRoZSBqdW1wIHRhYmxlLgorICB1bnNpZ25lZCBnZXRKdW1wVGFibGVJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNKdW1wVGFibGVJbmRleCgpICYmICJUaGlzIGlzIG5vdCBhIGp1bXAgdGFibGUgcmVmZXJlbmNlISIpOworICAgIHJldHVybiBUYXJnZXQuSW5kZXg7CisgIH0KKworICAvLy8gZ2V0UmVzdWx0UG9pbnRlciAtIE9uY2UgdGhpcyBoYXMgYmVlbiByZXNvbHZlZCB0byBwb2ludCB0byBhbiBhY3R1YWwKKyAgLy8vIGFkZHJlc3MsIHRoaXMgcmV0dXJucyB0aGUgcG9pbnRlci4KKyAgdm9pZCAqZ2V0UmVzdWx0UG9pbnRlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQWRkclR5cGUgPT0gaXNSZXN1bHQgJiYgIlJlc3VsdCBwb2ludGVyIGlzbid0IHNldCB5ZXQhIik7CisgICAgcmV0dXJuIFRhcmdldC5SZXN1bHQ7CisgIH0KKworICAvLy8gc2V0UmVzdWx0UG9pbnRlciAtIFNldCB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgcG9pbnRlciB2YWx1ZS4KKyAgLy8vCisgIHZvaWQgc2V0UmVzdWx0UG9pbnRlcih2b2lkICpQdHIpIHsKKyAgICBUYXJnZXQuUmVzdWx0ID0gUHRyOworICAgIEFkZHJUeXBlID0gaXNSZXN1bHQ7CisgIH0KKworICAvLy8gc2V0R09USW5kZXggLSBTZXQgdGhlIEdPVCBpbmRleCB0byBhIHNwZWNpZmljIHZhbHVlLgorICB2b2lkIHNldEdPVEluZGV4KHVuc2lnbmVkIGlkeCkgeworICAgIEFkZHJUeXBlID0gaXNHT1RJbmRleDsKKyAgICBUYXJnZXQuR09USW5kZXggPSBpZHg7CisgIH0KKworICAvLy8gZ2V0R09USW5kZXggLSBPbmNlIHRoaXMgaGFzIGJlZW4gcmVzb2x2ZWQgdG8gYW4gZW50cnkgaW4gdGhlIEdPVCwKKyAgLy8vIHRoaXMgcmV0dXJucyB0aGF0IGluZGV4LiAgVGhlIGluZGV4IGlzIGZyb20gdGhlIGxvd2VzdCBhZGRyZXNzIGVudHJ5CisgIC8vLyBpbiB0aGUgR09ULgorICB1bnNpZ25lZCBnZXRHT1RJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoQWRkclR5cGUgPT0gaXNHT1RJbmRleCk7CisgICAgcmV0dXJuIFRhcmdldC5HT1RJbmRleDsKKyAgfQorfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lU1NBVXBkYXRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVNTQVVwZGF0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmI0NWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVNTQVVwZGF0ZXIuaApAQCAtMCwwICsxLDExNSBAQAorLy89PT0tLSBNYWNoaW5lU1NBVXBkYXRlci5oIC0gVW5zdHJ1Y3R1cmVkIFNTQSBVcGRhdGUgVG9vbCAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1hY2hpbmVTU0FVcGRhdGVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVTU0FVUERBVEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVTU0FVUERBVEVSX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIE1hY2hpbmVPcGVyYW5kOworICBjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworICBjbGFzcyBUYXJnZXRJbnN0ckluZm87CisgIGNsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU1NBVXBkYXRlclRyYWl0czsKKyAgY2xhc3MgQnVtcFB0ckFsbG9jYXRvcjsKKworLy8vIE1hY2hpbmVTU0FVcGRhdGVyIC0gVGhpcyBjbGFzcyB1cGRhdGVzIFNTQSBmb3JtIGZvciBhIHNldCBvZiB2aXJ0dWFsCisvLy8gcmVnaXN0ZXJzIGRlZmluZWQgaW4gbXVsdGlwbGUgYmxvY2tzLiAgVGhpcyBpcyB1c2VkIHdoZW4gY29kZSBkdXBsaWNhdGlvbgorLy8vIG9yIGFub3RoZXIgdW5zdHJ1Y3R1cmVkIHRyYW5zZm9ybWF0aW9uIHdhbnRzIHRvIHJld3JpdGUgYSBzZXQgb2YgdXNlcyBvZiBvbmUKKy8vLyB2cmVnIHdpdGggdXNlcyBvZiBhIHNldCBvZiB2cmVncy4KK2NsYXNzIE1hY2hpbmVTU0FVcGRhdGVyIHsKKyAgZnJpZW5kIGNsYXNzIFNTQVVwZGF0ZXJUcmFpdHM8TWFjaGluZVNTQVVwZGF0ZXI+OworCitwcml2YXRlOgorICAvLy8gQXZhaWxhYmxlVmFscyAtIFRoaXMga2VlcHMgdHJhY2sgb2Ygd2hpY2ggdmFsdWUgdG8gdXNlIG9uIGEgcGVyLWJsb2NrCisgIC8vLyBiYXNpcy4gIFdoZW4gd2UgaW5zZXJ0IFBISSBub2Rlcywgd2Uga2VlcCB0cmFjayBvZiB0aGVtIGhlcmUuCisgIC8vdHlwZWRlZiBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIHVuc2lnbmVkID4gQXZhaWxhYmxlVmFsc1R5OworICB2b2lkICpBVjsKKworICAvLy8gVlIgLSBDdXJyZW50IHZpcnR1YWwgcmVnaXN0ZXIgd2hvc2UgdXNlcyBhcmUgYmVpbmcgdXBkYXRlZC4KKyAgdW5zaWduZWQgVlI7CisKKyAgLy8vIFZSQyAtIFJlZ2lzdGVyIGNsYXNzIG9mIHRoZSBjdXJyZW50IHZpcnR1YWwgcmVnaXN0ZXIuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlZSQzsKKworICAvLy8gSW5zZXJ0ZWRQSElzIC0gSWYgdGhpcyBpcyBub24tbnVsbCwgdGhlIE1hY2hpbmVTU0FVcGRhdGVyIGFkZHMgYWxsIFBISQorICAvLy8gbm9kZXMgdGhhdCBpdCBjcmVhdGVzIHRvIHRoZSB2ZWN0b3IuCisgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAqSW5zZXJ0ZWRQSElzOworCisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CitwdWJsaWM6CisgIC8vLyBNYWNoaW5lU1NBVXBkYXRlciBjb25zdHJ1Y3Rvci4gIElmIEluc2VydGVkUEhJcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUKKyAgLy8vIGZpbGxlZCBpbiB3aXRoIGFsbCBQSEkgTm9kZXMgY3JlYXRlZCBieSByZXdyaXRpbmcuCisgIGV4cGxpY2l0IE1hY2hpbmVTU0FVcGRhdGVyKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAqSW5zZXJ0ZWRQSElzID0gMCk7CisgIH5NYWNoaW5lU1NBVXBkYXRlcigpOworCisgIC8vLyBJbml0aWFsaXplIC0gUmVzZXQgdGhpcyBvYmplY3QgdG8gZ2V0IHJlYWR5IGZvciBhIG5ldyBzZXQgb2YgU1NBCisgIC8vLyB1cGRhdGVzLgorICB2b2lkIEluaXRpYWxpemUodW5zaWduZWQgVik7CisKKyAgLy8vIEFkZEF2YWlsYWJsZVZhbHVlIC0gSW5kaWNhdGUgdGhhdCBhIHJld3JpdHRlbiB2YWx1ZSBpcyBhdmFpbGFibGUgYXQgdGhlCisgIC8vLyBlbmQgb2YgdGhlIHNwZWNpZmllZCBibG9jayB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIHZvaWQgQWRkQXZhaWxhYmxlVmFsdWUoTWFjaGluZUJhc2ljQmxvY2sgKkJCLCB1bnNpZ25lZCBWKTsKKworICAvLy8gSGFzVmFsdWVGb3JCbG9jayAtIFJldHVybiB0cnVlIGlmIHRoZSBNYWNoaW5lU1NBVXBkYXRlciBhbHJlYWR5IGhhcyBhCisgIC8vLyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBibG9jay4KKyAgYm9vbCBIYXNWYWx1ZUZvckJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIEdldFZhbHVlQXRFbmRPZkJsb2NrIC0gQ29uc3RydWN0IFNTQSBmb3JtLCBtYXRlcmlhbGl6aW5nIGEgdmFsdWUgdGhhdCBpcworICAvLy8gbGl2ZSBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suCisgIHVuc2lnbmVkIEdldFZhbHVlQXRFbmRPZkJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIEdldFZhbHVlSW5NaWRkbGVPZkJsb2NrIC0gQ29uc3RydWN0IFNTQSBmb3JtLCBtYXRlcmlhbGl6aW5nIGEgdmFsdWUgdGhhdAorICAvLy8gaXMgbGl2ZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suCisgIC8vLworICAvLy8gR2V0VmFsdWVJbk1pZGRsZU9mQmxvY2sgaXMgdGhlIHNhbWUgYXMgR2V0VmFsdWVBdEVuZE9mQmxvY2sgZXhjZXB0IGluIG9uZQorICAvLy8gaW1wb3J0YW50IGNhc2U6IGlmIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBvZiB0aGUgcmV3cml0dGVuIHZhbHVlIGFmdGVyIHRoZQorICAvLy8gJ3VzZScgaW4gQkIuICBDb25zaWRlciBjb2RlIGxpa2UgdGhpczoKKyAgLy8vCisgIC8vLyAgICAgIFgxID0gLi4uCisgIC8vLyAgIFNvbWVCQjoKKyAgLy8vICAgICAgdXNlKFgpCisgIC8vLyAgICAgIFgyID0gLi4uCisgIC8vLyAgICAgIGJyIENvbmQsIFNvbWVCQiwgT3V0QkIKKyAgLy8vCisgIC8vLyBJbiB0aGlzIGNhc2UsIHRoZXJlIGFyZSB0d28gdmFsdWVzIChYMSBhbmQgWDIpIGFkZGVkIHRvIHRoZSBBdmFpbGFibGVWYWxzCisgIC8vLyBzZXQgYnkgdGhlIGNsaWVudCBvZiB0aGUgcmV3cml0ZXIsIGFuZCB0aG9zZSB2YWx1ZXMgYXJlIGJvdGggbGl2ZSBvdXQgb2YKKyAgLy8vIHRoZWlyIHJlc3BlY3RpdmUgYmxvY2tzLiAgSG93ZXZlciwgdGhlIHVzZSBvZiBYIGhhcHBlbnMgaW4gdGhlICptaWRkbGUqIG9mCisgIC8vLyBhIGJsb2NrLiAgQmVjYXVzZSBvZiB0aGlzLCB3ZSBuZWVkIHRvIGluc2VydCBhIG5ldyBQSEkgbm9kZSBpbiBTb21lQkIgdG8KKyAgLy8vIG1lcmdlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMsIGFuZCB0aGlzIHZhbHVlIGlzbid0IGxpdmUgb3V0IG9mIHRoZSBibG9jay4KKyAgLy8vCisgIHVuc2lnbmVkIEdldFZhbHVlSW5NaWRkbGVPZkJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFJld3JpdGVVc2UgLSBSZXdyaXRlIGEgdXNlIG9mIHRoZSBzeW1ib2xpYyB2YWx1ZS4gIFRoaXMgaGFuZGxlcyBQSEkgbm9kZXMsCisgIC8vLyB3aGljaCB1c2UgdGhlaXIgdmFsdWUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGVjZXNzb3IuICBOb3RlIHRoYXQgdGhpcworICAvLy8gd2lsbCBub3Qgd29yayBpZiB0aGUgdXNlIGlzIHN1cHBvc2VkIHRvIGJlIHJld3JpdHRlbiB0byBhIHZhbHVlIGRlZmluZWQgaW4KKyAgLy8vIHRoZSBzYW1lIGJsb2NrIGFzIHRoZSB1c2UsIGJ1dCBhYm92ZSBpdC4gIEFueSAnQWRkQXZhaWxhYmxlVmFsdWUncyBhZGRlZAorICAvLy8gZm9yIHRoZSB1c2UncyBibG9jayB3aWxsIGJlIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgaXQuCisgIHZvaWQgUmV3cml0ZVVzZShNYWNoaW5lT3BlcmFuZCAmVSk7CisKK3ByaXZhdGU6CisgIHZvaWQgUmVwbGFjZVJlZ1dpdGgodW5zaWduZWQgT2xkUmVnLCB1bnNpZ25lZCBOZXdSZWcpOworICB1bnNpZ25lZCBHZXRWYWx1ZUF0RW5kT2ZCbG9ja0ludGVybmFsKE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWFjaGluZVNTQVVwZGF0ZXImKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICBNYWNoaW5lU1NBVXBkYXRlcihjb25zdCBNYWNoaW5lU1NBVXBkYXRlciYpOyAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9PYmplY3RDb2RlRW1pdHRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vT2JqZWN0Q29kZUVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY2MjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vT2JqZWN0Q29kZUVtaXR0ZXIuaApAQCAtMCwwICsxLDE3MSBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vT2JqZWN0Q29kZUVtaXR0ZXIuaCAtIE9iamVjdCBDb2RlIEVtaXR0ZXIgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBHZW5lcmFsaXplZCBPYmplY3QgQ29kZSBFbWl0dGVyLCB3b3JrcyB3aXRoIE9iamVjdE1vZHVsZSBhbmQgQmluYXJ5T2JqZWN0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX09CSkVDVENPREVFTUlUVEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX09CSkVDVENPREVFTUlUVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29kZUVtaXR0ZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaW5hcnlPYmplY3Q7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVDb2RlRW1pdHRlcjsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2w7CitjbGFzcyBNYWNoaW5lSnVtcFRhYmxlSW5mbzsKK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvOworCitjbGFzcyBPYmplY3RDb2RlRW1pdHRlciA6IHB1YmxpYyBNYWNoaW5lQ29kZUVtaXR0ZXIgeworcHJvdGVjdGVkOgorCisgIC8vLyBCaW5hcnkgT2JqZWN0IChTZWN0aW9uIG9yIFNlZ21lbnQpIHdlIGFyZSBlbWl0dGluZyB0by4KKyAgQmluYXJ5T2JqZWN0ICpCTzsKKworICAvLy8gTUJCTG9jYXRpb25zIC0gVGhpcyB2ZWN0b3IgaXMgYSBtYXBwaW5nIGZyb20gTUJCIElEJ3MgdG8gdGhlaXIgYWRkcmVzcy4KKyAgLy8vIEl0IGlzIGZpbGxlZCBpbiBieSB0aGUgU3RhcnRNYWNoaW5lQmFzaWNCbG9jayBjYWxsYmFjayBhbmQgcXVlcmllZCBieQorICAvLy8gdGhlIGdldE1hY2hpbmVCYXNpY0Jsb2NrQWRkcmVzcyBjYWxsYmFjay4KKyAgc3RkOjp2ZWN0b3I8dWludHB0cl90PiBNQkJMb2NhdGlvbnM7CisKKyAgLy8vIExhYmVsTG9jYXRpb25zIC0gVGhpcyB2ZWN0b3IgaXMgYSBtYXBwaW5nIGZyb20gTGFiZWwgSUQncyB0byB0aGVpciAKKyAgLy8vIGFkZHJlc3MuCisgIHN0ZDo6dmVjdG9yPHVpbnRwdHJfdD4gTGFiZWxMb2NhdGlvbnM7CisKKyAgLy8vIENQTG9jYXRpb25zIC0gVGhpcyBpcyBhIG1hcCBvZiBjb25zdGFudCBwb29sIGluZGljZXMgdG8gb2Zmc2V0cyBmcm9tIHRoZQorICAvLy8gc3RhcnQgb2YgdGhlIHNlY3Rpb24gZm9yIHRoYXQgY29uc3RhbnQgcG9vbCBpbmRleC4KKyAgc3RkOjp2ZWN0b3I8dWludHB0cl90PiBDUExvY2F0aW9uczsKKworICAvLy8gQ1BTZWN0aW9ucyAtIFRoaXMgaXMgYSBtYXAgb2YgY29uc3RhbnQgcG9vbCBpbmRpY2VzIHRvIHRoZSBTZWN0aW9uCisgIC8vLyBjb250YWluaW5nIHRoZSBjb25zdGFudCBwb29sIGVudHJ5IGZvciB0aGF0IGluZGV4LgorICBzdGQ6OnZlY3Rvcjx1aW50cHRyX3Q+IENQU2VjdGlvbnM7CisKKyAgLy8vIEpUTG9jYXRpb25zIC0gVGhpcyBpcyBhIG1hcCBvZiBqdW1wIHRhYmxlIGluZGljZXMgdG8gb2Zmc2V0cyBmcm9tIHRoZQorICAvLy8gc3RhcnQgb2YgdGhlIHNlY3Rpb24gZm9yIHRoYXQganVtcCB0YWJsZSBpbmRleC4KKyAgc3RkOjp2ZWN0b3I8dWludHB0cl90PiBKVExvY2F0aW9uczsKKworcHVibGljOgorICBPYmplY3RDb2RlRW1pdHRlcigpOworICBPYmplY3RDb2RlRW1pdHRlcihCaW5hcnlPYmplY3QgKmJvKTsKKyAgdmlydHVhbCB+T2JqZWN0Q29kZUVtaXR0ZXIoKTsKKworICAvLy8gc2V0QmluYXJ5T2JqZWN0IC0gc2V0IHRoZSBCaW5hcnlPYmplY3Qgd2UgYXJlIHdyaXR0aW5nIHRvCisgIHZvaWQgc2V0QmluYXJ5T2JqZWN0KEJpbmFyeU9iamVjdCAqYm8pOworCisgIC8vLyBlbWl0Qnl0ZSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgYnl0ZSBuZWVkcyB0byBiZSAKKyAgLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtLCB3aXRob3V0IGJ1ZmZlciBvdmVyZmxvdyB0ZXN0aW5nLgorICB2b2lkIGVtaXRCeXRlKHVpbnQ4X3QgQik7CisKKyAgLy8vIGVtaXRXb3JkTEUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDMyLWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKyAgdm9pZCBlbWl0V29yZExFKHVpbnQzMl90IFcpOworCisgIC8vLyBlbWl0V29yZEJFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAzMi1iaXQgd29yZCBuZWVkcyB0byBiZQorICAvLy8gd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0gaW4gYmlnLWVuZGlhbiBmb3JtYXQuCisgIHZvaWQgZW1pdFdvcmRCRSh1aW50MzJfdCBXKTsKKworICAvLy8gZW1pdERXb3JkTEUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDY0LWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKyAgdm9pZCBlbWl0RFdvcmRMRSh1aW50NjRfdCBXKTsKKworICAvLy8gZW1pdERXb3JkQkUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIDY0LWJpdCB3b3JkIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSBpbiBiaWctZW5kaWFuIGZvcm1hdC4KKyAgdm9pZCBlbWl0RFdvcmRCRSh1aW50NjRfdCBXKTsKKworICAvLy8gZW1pdEFsaWdubWVudCAtIE1vdmUgdGhlIEN1ckJ1ZmZlclB0ciBwb2ludGVyIHVwIHRvIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGFsaWdubWVudCAoc2F0dXJhdGVkIHRvIEJ1ZmZlckVuZCBvZiBjb3Vyc2UpLgorICB2b2lkIGVtaXRBbGlnbm1lbnQodW5zaWduZWQgQWxpZ25tZW50ID0gMCwgdWludDhfdCBmaWxsID0gMCk7CisKKyAgLy8vIGVtaXRVTEVCMTI4Qnl0ZXMgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIFVMRUIxMjggbmVlZHMgdG8gYmUKKyAgLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtLgorICB2b2lkIGVtaXRVTEVCMTI4Qnl0ZXModWludDY0X3QgVmFsdWUpOworCisgIC8vLyBlbWl0U0xFQjEyOEJ5dGVzIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSBTTEVCMTI4IG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbS4KKyAgdm9pZCBlbWl0U0xFQjEyOEJ5dGVzKHVpbnQ2NF90IFZhbHVlKTsKKworICAvLy8gZW1pdFN0cmluZyAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgU3RyaW5nIG5lZWRzIHRvIGJlCisgIC8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbS4KKyAgdm9pZCBlbWl0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHJpbmcpOworCisgIC8vLyBnZXRDdXJyZW50UENWYWx1ZSAtIFRoaXMgcmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IHRoZSBuZXh0IGVtaXR0ZWQgYnl0ZQorICAvLy8gd2lsbCBiZSBvdXRwdXQgdG8uCisgIHVpbnRwdHJfdCBnZXRDdXJyZW50UENWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBnZXRDdXJyZW50UENPZmZzZXQgLSBSZXR1cm4gdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZW1pdHRlZAorICAvLy8gYnVmZmVyIHRoYXQgd2UgYXJlIGN1cnJlbnRseSB3cml0aW5nIHRvLgorICB1aW50cHRyX3QgZ2V0Q3VycmVudFBDT2Zmc2V0KCkgY29uc3Q7CisKKyAgLy8vIGFkZFJlbG9jYXRpb24gLSBXaGVuZXZlciBhIHJlbG9jYXRhYmxlIGFkZHJlc3MgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUKKyAgLy8vIG5vdGVkIHdpdGggdGhpcyBpbnRlcmZhY2UuCisgIHZvaWQgYWRkUmVsb2NhdGlvbihjb25zdCBNYWNoaW5lUmVsb2NhdGlvbiYgcmVsb2NhdGlvbik7CisKKyAgLy8vIGVhcmx5UmVzb2x2ZUFkZHJlc3NlcyAtIFRydWUgaWYgdGhlIGNvZGUgZW1pdHRlciBjYW4gdXNlIHN5bWJvbCBhZGRyZXNzZXMgCisgIC8vLyBkdXJpbmcgY29kZSBlbWlzc2lvbiB0aW1lLiBUaGUgSklUIGlzIGNhcGFibGUgb2YgZG9pbmcgdGhpcyBiZWNhdXNlIGl0CisgIC8vLyBjcmVhdGVzIGp1bXAgdGFibGVzIG9yIGNvbnN0YW50IHBvb2xzIGluIG1lbW9yeSBvbiB0aGUgZmx5IHdoaWxlIHRoZQorICAvLy8gb2JqZWN0IGNvZGUgZW1pdHRlcnMgcmVseSBvbiBhIGxpbmtlciB0byBoYXZlIHJlYWwgYWRkcmVzc2VzIGFuZCBzaG91bGQKKyAgLy8vIHVzZSByZWxvY2F0aW9ucyBpbnN0ZWFkLgorICBib29sIGVhcmx5UmVzb2x2ZUFkZHJlc3NlcygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIHN0YXJ0RnVuY3Rpb24gLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlzCisgIC8vLyBhYm91dCB0byBiZSBjb2RlIGdlbmVyYXRlZC4gIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIEJ1ZmZlckJlZ2luL0VuZC9QdHIKKyAgLy8vIGZpZWxkcy4KKyAgdmlydHVhbCB2b2lkIHN0YXJ0RnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSA9IDA7CisKKyAgLy8vIGZpbmlzaEZ1bmN0aW9uIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBoYXMKKyAgLy8vIGZpbmlzaGVkIGNvZGUgZ2VuZXJhdGlvbi4gIElmIGEgYnVmZmVyIG92ZXJmbG93IGhhcyBvY2N1cnJlZCwgdGhpcyBtZXRob2QKKyAgLy8vIHJldHVybnMgdHJ1ZSAodGhlIGNhbGxlZSBpcyByZXF1aXJlZCB0byB0cnkgYWdhaW4pLCBvdGhlcndpc2UgaXQgcmV0dXJucworICAvLy8gZmFsc2UuCisgIHZpcnR1YWwgYm9vbCBmaW5pc2hGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpID0gMDsKKworICAvLy8gU3RhcnRNYWNoaW5lQmFzaWNCbG9jayAtIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgdGFyZ2V0IHdoZW4gYSBuZXcKKyAgLy8vIGJhc2ljIGJsb2NrIGlzIGFib3V0IHRvIGJlIGVtaXR0ZWQuICBUaGlzIHdheSB0aGUgTUNFIGtub3dzIHdoZXJlIHRoZQorICAvLy8gc3RhcnQgb2YgdGhlIGJsb2NrIGlzLCBhbmQgY2FuIGltcGxlbWVudCBnZXRNYWNoaW5lQmFzaWNCbG9ja0FkZHJlc3MuCisgIHZpcnR1YWwgdm9pZCBTdGFydE1hY2hpbmVCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworCisgIC8vLyBnZXRNYWNoaW5lQmFzaWNCbG9ja0FkZHJlc3MgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZAorICAvLy8gTWFjaGluZUJhc2ljQmxvY2ssIG9ubHkgdXNhYmxlIGFmdGVyIHRoZSBsYWJlbCBmb3IgdGhlIE1CQiBoYXMgYmVlbgorICAvLy8gZW1pdHRlZC4KKyAgdmlydHVhbCB1aW50cHRyX3QgZ2V0TWFjaGluZUJhc2ljQmxvY2tBZGRyZXNzKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgIC8vLyBlbWl0SnVtcFRhYmxlcyAtIEVtaXQgYWxsIHRoZSBqdW1wIHRhYmxlcyBmb3IgYSBnaXZlbiBqdW1wIHRhYmxlIGluZm8KKyAgLy8vIHJlY29yZCB0byB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4KKyAgdmlydHVhbCB2b2lkIGVtaXRKdW1wVGFibGVzKE1hY2hpbmVKdW1wVGFibGVJbmZvICpNSlRJKSA9IDA7CisKKyAgLy8vIGdldEp1bXBUYWJsZUVudHJ5QWRkcmVzcyAtIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUganVtcCB0YWJsZSB3aXRoIGluZGV4CisgIC8vLyAnSW5kZXgnIGluIHRoZSBmdW5jdGlvbiB0aGF0IGxhc3QgY2FsbGVkIGluaXRKdW1wVGFibGVJbmZvLgorICB2aXJ0dWFsIHVpbnRwdHJfdCBnZXRKdW1wVGFibGVFbnRyeUFkZHJlc3ModW5zaWduZWQgSW5kZXgpIGNvbnN0OworCisgIC8vLyBlbWl0Q29uc3RhbnRQb29sIC0gRm9yIGVhY2ggY29uc3RhbnQgcG9vbCBlbnRyeSwgZmlndXJlIG91dCB3aGljaCBzZWN0aW9uCisgIC8vLyB0aGUgY29uc3RhbnQgc2hvdWxkIGxpdmUgaW4sIGFsbG9jYXRlIHNwYWNlIGZvciBpdCwgYW5kIGVtaXQgaXQgdG8gdGhlIAorICAvLy8gU2VjdGlvbiBkYXRhIGJ1ZmZlci4KKyAgdmlydHVhbCB2b2lkIGVtaXRDb25zdGFudFBvb2woTWFjaGluZUNvbnN0YW50UG9vbCAqTUNQKSA9IDA7CisKKyAgLy8vIGdldENvbnN0YW50UG9vbEVudHJ5QWRkcmVzcyAtIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgJ0luZGV4JyBlbnRyeSBpbgorICAvLy8gdGhlIGNvbnN0YW50IHBvb2wgdGhhdCB3YXMgbGFzdCBlbWl0dGVkIHdpdGggdGhlIGVtaXRDb25zdGFudFBvb2wgbWV0aG9kLgorICB2aXJ0dWFsIHVpbnRwdHJfdCBnZXRDb25zdGFudFBvb2xFbnRyeUFkZHJlc3ModW5zaWduZWQgSW5kZXgpIGNvbnN0OworCisgIC8vLyBnZXRDb25zdGFudFBvb2xFbnRyeVNlY3Rpb24gLSBSZXR1cm4gdGhlIHNlY3Rpb24gb2YgdGhlICdJbmRleCcgZW50cnkgaW4KKyAgLy8vIHRoZSBjb25zdGFudCBwb29sIHRoYXQgd2FzIGxhc3QgZW1pdHRlZCB3aXRoIHRoZSBlbWl0Q29uc3RhbnRQb29sIG1ldGhvZC4KKyAgdmlydHVhbCB1aW50cHRyX3QgZ2V0Q29uc3RhbnRQb29sRW50cnlTZWN0aW9uKHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKworICAvLy8gU3BlY2lmaWVzIHRoZSBNYWNoaW5lTW9kdWxlSW5mbyBvYmplY3QuIFRoaXMgaXMgdXNlZCBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nCisgIC8vLyBwdXJwb3Nlcy4KKyAgdmlydHVhbCB2b2lkIHNldE1vZHVsZUluZm8oTWFjaGluZU1vZHVsZUluZm8qIEluZm8pID0gMDsKKyAgLy8gdG8gYmUgaW1wbGVtZW50ZWQgb3IgZGVwcmVjaWF0ZWQgd2l0aCBNYWNoaW5lTW9kdWxlSW5mbworCit9OyAvLyBlbmQgY2xhc3MgT2JqZWN0Q29kZUVtaXR0ZXIKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vUGFzc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2YjNlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Bhc3Nlcy5oCkBAIC0wLDAgKzEsMjAzIEBACisvLz09PS0tIFBhc3Nlcy5oIC0gVGFyZ2V0IGluZGVwZW5kZW50IGNvZGUgZ2VuZXJhdGlvbiBwYXNzZXMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGludGVyZmFjZXMgdG8gYWNjZXNzIHRoZSB0YXJnZXQgaW5kZXBlbmRlbnQgY29kZSBnZW5lcmF0aW9uCisvLyBwYXNzZXMgcHJvdmlkZWQgYnkgdGhlIExMVk0gYmFja2VuZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QQVNTRVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEFTU0VTX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBGdW5jdGlvblBhc3M7CisgIGNsYXNzIE1hY2hpbmVGdW5jdGlvblBhc3M7CisgIGNsYXNzIFBhc3NJbmZvOworICBjbGFzcyBUYXJnZXRMb3dlcmluZzsKKyAgY2xhc3MgUmVnaXN0ZXJDb2FsZXNjZXI7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIC8vLyBjcmVhdGVVbnJlYWNoYWJsZUJsb2NrRWxpbWluYXRpb25QYXNzIC0gVGhlIExMVk0gY29kZSBnZW5lcmF0b3IgZG9lcyBub3QKKyAgLy8vIHdvcmsgd2VsbCB3aXRoIHVucmVhY2hhYmxlIGJhc2ljIGJsb2NrcyAod2hhdCBsaXZlIHJhbmdlcyBtYWtlIHNlbnNlIGZvciBhCisgIC8vLyBibG9jayB0aGF0IGNhbm5vdCBiZSByZWFjaGVkPykuICBBcyBzdWNoLCBhIGNvZGUgZ2VuZXJhdG9yIHNob3VsZCBlaXRoZXIKKyAgLy8vIG5vdCBpbnN0cnVjdGlvbiBzZWxlY3QgdW5yZWFjaGFibGUgYmxvY2tzLCBvciBydW4gdGhpcyBwYXNzIGFzIGl0cworICAvLy8gbGFzdCBMTFZNIG1vZGlmeWluZyBwYXNzIHRvIGNsZWFuIHVwIGJsb2NrcyB0aGF0IGFyZSBub3QgcmVhY2hhYmxlIGZyb20KKyAgLy8vIHRoZSBlbnRyeSBibG9jay4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVVbnJlYWNoYWJsZUJsb2NrRWxpbWluYXRpb25QYXNzKCk7CisKKyAgLy8vIE1hY2hpbmVGdW5jdGlvblByaW50ZXIgcGFzcyAtIFRoaXMgcGFzcyBwcmludHMgb3V0IHRoZSBtYWNoaW5lIGZ1bmN0aW9uIHRvCisgIC8vLyB0aGUgZ2l2ZW4gc3RyZWFtIGFzIGEgZGVidWdnaW5nIHRvb2wuCisgIE1hY2hpbmVGdW5jdGlvblBhc3MgKgorICBjcmVhdGVNYWNoaW5lRnVuY3Rpb25QcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIgPSIiKTsKKworICAvLy8gTWFjaGluZUxvb3BJbmZvIHBhc3MgLSBUaGlzIHBhc3MgaXMgYSBsb29wIGFuYWx5c2lzIHBhc3MuCisgIC8vLworICBleHRlcm4gY2hhciAmTWFjaGluZUxvb3BJbmZvSUQ7CisKKyAgLy8vIE1hY2hpbmVEb21pbmF0b3JzIHBhc3MgLSBUaGlzIHBhc3MgaXMgYSBtYWNoaW5lIGRvbWluYXRvcnMgYW5hbHlzaXMgcGFzcy4KKyAgLy8vCisgIGV4dGVybiBjaGFyICZNYWNoaW5lRG9taW5hdG9yc0lEOworCisgIC8vLyBQSElFbGltaW5hdGlvbiBwYXNzIC0gVGhpcyBwYXNzIGVsaW1pbmF0ZXMgbWFjaGluZSBpbnN0cnVjdGlvbiBQSEkgbm9kZXMKKyAgLy8vIGJ5IGluc2VydGluZyBjb3B5IGluc3RydWN0aW9ucy4gIFRoaXMgZGVzdHJveXMgU1NBIGluZm9ybWF0aW9uLCBidXQgaXMgdGhlCisgIC8vLyBkZXNpcmVkIGlucHV0IGZvciBzb21lIHJlZ2lzdGVyIGFsbG9jYXRvcnMuICBUaGlzIHBhc3MgaXMgInJlcXVpcmVkIiBieQorICAvLy8gdGhlc2UgcmVnaXN0ZXIgYWxsb2NhdG9yIGxpa2UgdGhpczogQVUuYWRkUmVxdWlyZWRJRChQSElFbGltaW5hdGlvbklEKTsKKyAgLy8vCisgIGV4dGVybiBjaGFyICZQSElFbGltaW5hdGlvbklEOworCisgIC8vLyBTdHJvbmdQSElFbGltaW5hdGlvbiBwYXNzIC0gVGhpcyBwYXNzIGVsaW1pbmF0ZXMgbWFjaGluZSBpbnN0cnVjdGlvbiBQSEkKKyAgLy8vIG5vZGVzIGJ5IGluc2VydGluZyBjb3B5IGluc3RydWN0aW9ucy4gIFRoaXMgZGVzdHJveXMgU1NBIGluZm9ybWF0aW9uLCBidXQKKyAgLy8vIGlzIHRoZSBkZXNpcmVkIGlucHV0IGZvciBzb21lIHJlZ2lzdGVyIGFsbG9jYXRvcnMuICBUaGlzIHBhc3MgaXMKKyAgLy8vICJyZXF1aXJlZCIgYnkgdGhlc2UgcmVnaXN0ZXIgYWxsb2NhdG9yIGxpa2UgdGhpczoKKyAgLy8vICAgIEFVLmFkZFJlcXVpcmVkSUQoUEhJRWxpbWluYXRpb25JRCk7CisgIC8vLyAgVGhpcyBwYXNzIGlzIHN0aWxsIGluIGRldmVsb3BtZW50CisgIGV4dGVybiBjaGFyICZTdHJvbmdQSElFbGltaW5hdGlvbklEOworCisgIGV4dGVybiBjaGFyICZQcmVBbGxvY1NwbGl0dGluZ0lEOworCisgIC8vLyBTaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcgcGFzcy4gIEFnZ3Jlc3NpdmVseSBjb2FsZXNjZXMgZXZlcnkgcmVnaXN0ZXIKKyAgLy8vIGNvcHkgaXQgY2FuLgorICAvLy8KKyAgZXh0ZXJuIGNoYXIgJlNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZ0lEOworCisgIC8vLyBUd29BZGRyZXNzSW5zdHJ1Y3Rpb24gcGFzcyAtIFRoaXMgcGFzcyByZWR1Y2VzIHR3by1hZGRyZXNzIGluc3RydWN0aW9ucyB0bworICAvLy8gdXNlIHR3byBvcGVyYW5kcy4gVGhpcyBkZXN0cm95cyBTU0EgaW5mb3JtYXRpb24gYnV0IGl0IGlzIGRlc2lyZWQgYnkKKyAgLy8vIHJlZ2lzdGVyIGFsbG9jYXRvcnMuCisgIGV4dGVybiBjaGFyICZUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzSUQ7CisKKyAgLy8vIFVucmVhY2hhYmxlTWFjaGluZUJsb2NrRWxpbWluYXRpb24gcGFzcyAtIFRoaXMgcGFzcyByZW1vdmVzIHVucmVhY2hhYmxlCisgIC8vLyBtYWNoaW5lIGJhc2ljIGJsb2Nrcy4KKyAgZXh0ZXJuIGNoYXIgJlVucmVhY2hhYmxlTWFjaGluZUJsb2NrRWxpbUlEOworCisgIC8vLyBEZWFkTWFjaGluZUluc3RydWN0aW9uRWxpbSBwYXNzIC0gVGhpcyBwYXNzIHJlbW92ZXMgZGVhZCBtYWNoaW5lCisgIC8vLyBpbnN0cnVjdGlvbnMuCisgIC8vLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZURlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltUGFzcygpOworCisgIC8vLyBDcmVhdGVzIGEgcmVnaXN0ZXIgYWxsb2NhdG9yIGFzIHRoZSB1c2VyIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvcgorICAvLy8gcGlja3Mgb25lIHRoYXQgbWF0Y2hlcyBPcHRMZXZlbC4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUmVnaXN0ZXJBbGxvY2F0b3IoQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworCisgIC8vLyBGYXN0UmVnaXN0ZXJBbGxvY2F0aW9uIFBhc3MgLSBUaGlzIHBhc3MgcmVnaXN0ZXIgYWxsb2NhdGVzIGFzIGZhc3QgYXMKKyAgLy8vIHBvc3NpYmxlLiBJdCBpcyBiZXN0IHN1aXRlZCBmb3IgZGVidWcgY29kZSB3aGVyZSBsaXZlIHJhbmdlcyBhcmUgc2hvcnQuCisgIC8vLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUZhc3RSZWdpc3RlckFsbG9jYXRvcigpOworCisgIC8vLyBMaW5lYXJTY2FuUmVnaXN0ZXJBbGxvY2F0aW9uIFBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyB0aGUgbGluZWFyIHNjYW4KKyAgLy8vIHJlZ2lzdGVyIGFsbG9jYXRpb24gYWxnb3JpdGhtLCBhIGdsb2JhbCByZWdpc3RlciBhbGxvY2F0b3IuCisgIC8vLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUxpbmVhclNjYW5SZWdpc3RlckFsbG9jYXRvcigpOworCisgIC8vLyBQQlFQUmVnaXN0ZXJBbGxvY2F0aW9uIFBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyB0aGUgUGFydGl0aW9uZWQgQm9vbGVhbgorICAvLy8gUXVhZHJhdGljIFByb2dyYWFtaW5nIChQQlFQKSBiYXNlZCByZWdpc3RlciBhbGxvY2F0b3IuCisgIC8vLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVBCUVBSZWdpc3RlckFsbG9jYXRvcigpOworCisgIC8vLyBTaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcgUGFzcyAtIENvYWxlc2NlIGFsbCBjb3BpZXMgcG9zc2libGUuICBDYW4gcnVuCisgIC8vLyBpbmRlcGVuZGVudGx5IG9mIHRoZSByZWdpc3RlciBhbGxvY2F0b3IuCisgIC8vLworICBSZWdpc3RlckNvYWxlc2NlciAqY3JlYXRlU2ltcGxlUmVnaXN0ZXJDb2FsZXNjZXIoKTsKKworICAvLy8gUHJvbG9nRXBpbG9nQ29kZUluc2VydGVyIFBhc3MgLSBUaGlzIHBhc3MgaW5zZXJ0cyBwcm9sb2cgYW5kIGVwaWxvZyBjb2RlLAorICAvLy8gYW5kIGVsaW1pbmF0ZXMgYWJzdHJhY3QgZnJhbWUgcmVmZXJlbmNlcy4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUHJvbG9nRXBpbG9nQ29kZUluc2VydGVyKCk7CisKKyAgLy8vIExvd2VyU3VicmVncyBQYXNzIC0gVGhpcyBwYXNzIGxvd2VycyBzdWJyZWdzIHRvIHJlZ2lzdGVyLXJlZ2lzdGVyIGNvcGllcworICAvLy8gd2hpY2ggeWllbGRzIHN1Ym9wdGltYWwsIGJ1dCBjb3JyZWN0IGNvZGUgaWYgdGhlIHJlZ2lzdGVyIGFsbG9jYXRvcgorICAvLy8gY2Fubm90IGNvYWxlc2NlIGFsbCBzdWJyZWcgb3BlcmF0aW9ucyBkdXJpbmcgYWxsb2NhdGlvbi4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlTG93ZXJTdWJyZWdzUGFzcygpOworCisgIC8vLyBjcmVhdGVQb3N0UkFTY2hlZHVsZXIgLSBUaGlzIHBhc3MgcGVyZm9ybXMgcG9zdCByZWdpc3RlciBhbGxvY2F0aW9uCisgIC8vLyBzY2hlZHVsaW5nLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVBvc3RSQVNjaGVkdWxlcihDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKKyAgLy8vIEJyYW5jaEZvbGRpbmcgUGFzcyAtIFRoaXMgcGFzcyBwZXJmb3JtcyBtYWNoaW5lIGNvZGUgQ0ZHIGJhc2VkCisgIC8vLyBvcHRpbWl6YXRpb25zIHRvIGRlbGV0ZSBicmFuY2hlcyB0byBicmFuY2hlcywgZWxpbWluYXRlIGJyYW5jaGVzIHRvCisgIC8vLyBzdWNjZXNzb3IgYmxvY2tzIChjcmVhdGluZyBmYWxsIHRocm91Z2hzKSwgYW5kIGVsaW1pbmF0aW5nIGJyYW5jaGVzIG92ZXIKKyAgLy8vIGJyYW5jaGVzLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZUJyYW5jaEZvbGRpbmdQYXNzKGJvb2wgRGVmYXVsdEVuYWJsZVRhaWxNZXJnZSk7CisKKyAgLy8vIFRhaWxEdXBsaWNhdGUgUGFzcyAtIER1cGxpY2F0ZSBibG9ja3Mgd2l0aCB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzCisgIC8vLyBpbnRvIHRhaWxzIG9mIHRoZWlyIHByZWRlY2Vzc29ycy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVUYWlsRHVwbGljYXRlUGFzcyhib29sIFByZVJlZ0FsbG9jID0gZmFsc2UpOworCisgIC8vLyBJZkNvbnZlcnRlciBQYXNzIC0gVGhpcyBwYXNzIHBlcmZvcm1zIG1hY2hpbmUgY29kZSBpZiBjb252ZXJzaW9uLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZUlmQ29udmVydGVyUGFzcygpOworCisgIC8vLyBDb2RlIFBsYWNlbWVudCBQYXNzIC0gVGhpcyBwYXNzIG9wdGltaXplIGNvZGUgcGxhY2VtZW50IGFuZCBhbGlnbnMgbG9vcAorICAvLy8gaGVhZGVycyB0byB0YXJnZXQgc3BlY2lmaWMgYWxpZ25tZW50IGJvdW5kYXJ5LgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZUNvZGVQbGFjZW1lbnRPcHRQYXNzKCk7CisKKyAgLy8vIEludHJpbnNpY0xvd2VyaW5nIFBhc3MgLSBQZXJmb3JtcyB0YXJnZXQtaW5kZXBlbmRlbnQgTExWTSBJUgorICAvLy8gdHJhbnNmb3JtYXRpb25zIGZvciBoaWdobHkgcG9ydGFibGUgc3RyYXRlZ2llcy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVHQ0xvd2VyaW5nUGFzcygpOworCisgIC8vLyBNYWNoaW5lQ29kZUFuYWx5c2lzIFBhc3MgLSBUYXJnZXQtaW5kZXBlbmRlbnQgcGFzcyB0byBtYXJrIHNhZmUgcG9pbnRzIGluCisgIC8vLyBtYWNoaW5lIGNvZGUuIE11c3QgYmUgYWRkZWQgdmVyeSBsYXRlIGR1cmluZyBjb2RlIGdlbmVyYXRpb24sIGp1c3QgcHJpb3IKKyAgLy8vIHRvIG91dHB1dCwgYW5kIGltcG9ydGFudGx5IGFmdGVyIGFsbCBDRkcgdHJhbnNmb3JtYXRpb25zIChzdWNoIGFzIGJyYW5jaAorICAvLy8gZm9sZGluZykuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlR0NNYWNoaW5lQ29kZUFuYWx5c2lzUGFzcygpOworCisgIC8vLyBEZWxldGVyIFBhc3MgLSBSZWxlYXNlcyBHQyBtZXRhZGF0YS4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlR0NJbmZvRGVsZXRlcigpOworCisgIC8vLyBDcmVhdGVzIGEgcGFzcyB0byBwcmludCBHQyBtZXRhZGF0YS4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlR0NJbmZvUHJpbnRlcihyYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBjcmVhdGVNYWNoaW5lQ1NFUGFzcyAtIFRoaXMgcGFzcyBwZXJmb3JtcyBnbG9iYWwgQ1NFIG9uIG1hY2hpbmUKKyAgLy8vIGluc3RydWN0aW9ucy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNYWNoaW5lQ1NFUGFzcygpOworCisgIC8vLyBjcmVhdGVNYWNoaW5lTElDTVBhc3MgLSBUaGlzIHBhc3MgcGVyZm9ybXMgTElDTSBvbiBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlTWFjaGluZUxJQ01QYXNzKGJvb2wgUHJlUmVnQWxsb2MgPSB0cnVlKTsKKworICAvLy8gY3JlYXRlTWFjaGluZVNpbmtpbmdQYXNzIC0gVGhpcyBwYXNzIHBlcmZvcm1zIHNpbmtpbmcgb24gbWFjaGluZQorICAvLy8gaW5zdHJ1Y3Rpb25zLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZU1hY2hpbmVTaW5raW5nUGFzcygpOworCisgIC8vLyBjcmVhdGVQZWVwaG9sZU9wdGltaXplclBhc3MgLSBUaGlzIHBhc3MgcGVyZm9ybXMgcGVlcGhvbGUgb3B0aW1pemF0aW9ucyAtCisgIC8vLyBsaWtlIGV4dGVuc2lvbiBhbmQgY29tcGFyaXNvbiBlbGltaW5hdGlvbnMuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUGVlcGhvbGVPcHRpbWl6ZXJQYXNzKCk7CisKKyAgLy8vIGNyZWF0ZU9wdGltaXplUEhJc1Bhc3MgLSBUaGlzIHBhc3Mgb3B0aW1pemVzIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gUEhJcworICAvLy8gdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygb3Bwb3J0dW5pdGllcyBjcmVhdGVkIGR1cmluZyBEQUcgbGVnYWxpemF0aW9uLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZU9wdGltaXplUEhJc1Bhc3MoKTsKKworICAvLy8gY3JlYXRlU3RhY2tTbG90Q29sb3JpbmdQYXNzIC0gVGhpcyBwYXNzIHBlcmZvcm1zIHN0YWNrIHNsb3QgY29sb3JpbmcuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlU3RhY2tTbG90Q29sb3JpbmdQYXNzKGJvb2wpOworCisgIC8vLyBjcmVhdGVTdGFja1Byb3RlY3RvclBhc3MgLSBUaGlzIHBhc3MgYWRkcyBzdGFjayBwcm90ZWN0b3JzIHRvIGZ1bmN0aW9ucy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVTdGFja1Byb3RlY3RvclBhc3MoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKnRsaSk7CisKKyAgLy8vIGNyZWF0ZU1hY2hpbmVWZXJpZmllclBhc3MgLSBUaGlzIHBhc3MgdmVyaWZpZXMgY2VuZXJhdGVkIG1hY2hpbmUgY29kZQorICAvLy8gaW5zdHJ1Y3Rpb25zIGZvciBjb3JyZWN0bmVzcy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNYWNoaW5lVmVyaWZpZXJQYXNzKCk7CisKKyAgLy8vIGNyZWF0ZUR3YXJmRUhQYXNzIC0gVGhpcyBwYXNzIG11bGNoZXMgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaW50byBhIGZvcm0KKyAgLy8vIGFkYXB0ZWQgdG8gY29kZSBnZW5lcmF0aW9uLiAgUmVxdWlyZWQgaWYgdXNpbmcgZHdhcmYgZXhjZXB0aW9uIGhhbmRsaW5nLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZUR3YXJmRUhQYXNzKGNvbnN0IFRhcmdldE1hY2hpbmUgKnRtLCBib29sIGZhc3QpOworCisgIC8vLyBjcmVhdGVTakxqRUhQYXNzIC0gVGhpcyBwYXNzIGFkYXB0cyBleGNlcHRpb24gaGFuZGxpbmcgY29kZSB0byB1c2UKKyAgLy8vIHRoZSBHQ0Mtc3R5bGUgYnVpbHRpbiBzZXRqbXAvbG9uZ2ptcCAoc2psaikgdG8gaGFuZGxpbmcgRUggY29udHJvbCBmbG93LgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVNqTGpFSFBhc3MoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKnRsaSk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vUG9zdFJBSGF6YXJkUmVjb2duaXplci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vUG9zdFJBSGF6YXJkUmVjb2duaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDczY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Qb3N0UkFIYXphcmRSZWNvZ25pemVyLmgKQEAgLTAsMCArMSw5NCBAQAorLy89LSBsbHZtL0NvZGVHZW4vUG9zdFJBSGF6YXJkUmVjb2duaXplci5oIC0gU2NoZWR1bGluZyBTdXBwb3J0IC0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFBvc3RSQUhhemFyZFJlY29nbml6ZXIgY2xhc3MsIHdoaWNoCisvLyBpbXBsZW1lbnRzIGhhemFyZC1hdm9pZGFuY2UgaGV1cmlzdGljcyBmb3Igc2NoZWR1bGluZywgYmFzZWQgb24gdGhlCisvLyBzY2hlZHVsaW5nIGl0aW5lcmFyaWVzIHNwZWNpZmllZCBmb3IgdGhlIHRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9FWEFDVEhBWkFSRFJFQ09HTklaRVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fRVhBQ1RIQVpBUkRSRUNPR05JWkVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgSW5zdHJJdGluZXJhcnlEYXRhOworY2xhc3MgU1VuaXQ7CisKK2NsYXNzIFBvc3RSQUhhemFyZFJlY29nbml6ZXIgOiBwdWJsaWMgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyIHsKKyAgLy8gU2NvcmVCb2FyZCB0byB0cmFjayBmdW5jdGlvbiB1bml0IHVzYWdlLiBTY29yZUJvYXJkWzBdIGlzIGEKKyAgLy8gbWFzayBvZiB0aGUgRlVzIGluIHVzZSBpbiB0aGUgY3ljbGUgY3VycmVudGx5IGJlaW5nCisgIC8vIHNjaGVkdWxlLiBTY29yZUJvYXJkWzFdIGlzIGEgbWFzayBmb3IgdGhlIG5leHQgY3ljbGUuIFRoZQorICAvLyBTY29yZUJvYXJkIGlzIHVzZWQgYXMgYSBjaXJjdWxhciBidWZmZXIgd2l0aCB0aGUgY3VycmVudCBjeWNsZQorICAvLyBpbmRpY2F0ZWQgYnkgSGVhZC4KKyAgY2xhc3MgU2NvcmVCb2FyZCB7CisgICAgdW5zaWduZWQgKkRhdGE7CisKKyAgICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgY3ljbGVzIG1vbml0b3JlZCBieSB0aGUgU2NvcmVib2FyZC4gVGhpcworICAgIC8vIHZhbHVlIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIHRhcmdldCBpdGluZXJhcmllcyB0byBlbnN1cmUKKyAgICAvLyB0aGF0IGFsbCBoYXphcmRzIGNhbiBiZSB0cmFja2VkLgorICAgIHNpemVfdCBEZXB0aDsKKyAgICAvLyBJbmRpY2VzIGludG8gdGhlIFNjb3JlYm9hcmQgdGhhdCByZXByZXNlbnQgdGhlIGN1cnJlbnQgY3ljbGUuCisgICAgc2l6ZV90IEhlYWQ7CisgIHB1YmxpYzoKKyAgICBTY29yZUJvYXJkKCk6RGF0YShOVUxMKSwgRGVwdGgoMCksIEhlYWQoMCkgeyB9CisgICAgflNjb3JlQm9hcmQoKSB7CisgICAgICBkZWxldGVbXSBEYXRhOworICAgIH0KKworICAgIHNpemVfdCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIERlcHRoOyB9CisgICAgdW5zaWduZWQmIG9wZXJhdG9yW10oc2l6ZV90IGlkeCkgY29uc3QgeworICAgICAgYXNzZXJ0KERlcHRoICYmICJTY29yZUJvYXJkIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkhIik7CisKKyAgICAgIHJldHVybiBEYXRhWyhIZWFkICsgaWR4KSAlIERlcHRoXTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KHNpemVfdCBkID0gMSkgeworICAgICAgaWYgKERhdGEgPT0gTlVMTCkgeworICAgICAgICBEZXB0aCA9IGQ7CisgICAgICAgIERhdGEgPSBuZXcgdW5zaWduZWRbRGVwdGhdOworICAgICAgfQorCisgICAgICBtZW1zZXQoRGF0YSwgMCwgRGVwdGggKiBzaXplb2YoRGF0YVswXSkpOworICAgICAgSGVhZCA9IDA7CisgICAgfQorCisgICAgdm9pZCBhZHZhbmNlKCkgeworICAgICAgSGVhZCA9IChIZWFkICsgMSkgJSBEZXB0aDsKKyAgICB9CisKKyAgICAvLyBQcmludCB0aGUgc2NvcmVib2FyZC4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICAvLyBJdGluZXJhcnkgZGF0YSBmb3IgdGhlIHRhcmdldC4KKyAgY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICZJdGluRGF0YTsKKworICBTY29yZUJvYXJkIFJlc2VydmVkU2NvcmVib2FyZDsKKyAgU2NvcmVCb2FyZCBSZXF1aXJlZFNjb3JlYm9hcmQ7CisKK3B1YmxpYzoKKyAgUG9zdFJBSGF6YXJkUmVjb2duaXplcihjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgJkl0aW5EYXRhKTsKKworICB2aXJ0dWFsIEhhemFyZFR5cGUgZ2V0SGF6YXJkVHlwZShTVW5pdCAqU1UpOworICB2aXJ0dWFsIHZvaWQgUmVzZXQoKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRJbnN0cnVjdGlvbihTVW5pdCAqU1UpOworICB2aXJ0dWFsIHZvaWQgQWR2YW5jZUN5Y2xlKCk7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vUHJvY2Vzc0ltcGxpY2l0RGVmcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vUHJvY2Vzc0ltcGxpY2l0RGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNzQzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Qcm9jZXNzSW1wbGljaXREZWZzLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLSBsbHZtL0NvZGVHZW4vUHJvY2Vzc0ltcGxpY2l0RGVmcy5oIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QUk9DRVNTSU1QTElDSVRERUZTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BST0NFU1NJTVBMSUNJVERFRlNfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgTWFjaGluZUluc3RyOworICBjbGFzcyBUYXJnZXRJbnN0ckluZm87CisKKyAgLy8vIFByb2Nlc3MgSU1QTElDSVRfREVGIGluc3RydWN0aW9ucyBhbmQgbWFrZSBzdXJlIHRoZXJlIGlzIG9uZSBpbXBsaWNpdF9kZWYKKyAgLy8vIGZvciBlYWNoIHVzZS4gQWRkIGlzVW5kZWYgbWFya2VyIHRvIGltcGxpY2l0X2RlZiBkZWZzIGFuZCB0aGVpciB1c2VzLgorICBjbGFzcyBQcm9jZXNzSW1wbGljaXREZWZzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBwcml2YXRlOgorCisgICAgYm9vbCBDYW5UdXJuSW50b0ltcGxpY2l0RGVmKE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BJZHgsIGNvbnN0IFRhcmdldEluc3RySW5mbyAqdGlpXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxTZXQ8dW5zaWduZWQsIDg+ICZJbXBEZWZSZWdzKTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisKKyAgICBQcm9jZXNzSW1wbGljaXREZWZzKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmYXUpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmZm4pOworICB9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUFJPQ0VTU0lNUExJQ0lUREVGU19ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNlNjMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaApAQCAtMCwwICsxLDExMiBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBQc2V1ZG9Tb3VyY2VWYWx1ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QU0VVRE9TT1VSQ0VWQUxVRV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9QU0VVRE9TT1VSQ0VWQUxVRV9ICisKKyNpbmNsdWRlICJsbHZtL1ZhbHVlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTWFjaGluZUZyYW1lSW5mbzsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisKKyAgLy8vIFBzZXVkb1NvdXJjZVZhbHVlIC0gU3BlY2lhbCB2YWx1ZSBzdXBwbGllZCBmb3IgbWFjaGluZSBsZXZlbCBhbGlhcworICAvLy8gYW5hbHlzaXMuIEl0IGluZGljYXRlcyB0aGF0IHRoZSBhIG1lbW9yeSBhY2Nlc3MgcmVmZXJlbmNlcyB0aGUgZnVuY3Rpb25zCisgIC8vLyBzdGFjayBmcmFtZSAoZS5nLiwgYSBzcGlsbCBzbG90KSwgYmVsb3cgdGhlIHN0YWNrIGZyYW1lIChlLmcuLCBhcmd1bWVudAorICAvLy8gc3BhY2UpLCBvciBjb25zdGFudCBwb29sLgorICBjbGFzcyBQc2V1ZG9Tb3VyY2VWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CisgIHByaXZhdGU6CisgICAgLy8vIHByaW50Q3VzdG9tIC0gSW1wbGVtZW50IHByaW50aW5nIGZvciBQc2V1ZG9Tb3VyY2VWYWx1ZS4gVGhpcyBpcyBjYWxsZWQKKyAgICAvLy8gZnJvbSBWYWx1ZTo6cHJpbnQgb3IgVmFsdWUncyBvcGVyYXRvcjw8LgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBwcmludEN1c3RvbShyYXdfb3N0cmVhbSAmTykgY29uc3Q7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFBzZXVkb1NvdXJjZVZhbHVlKGVudW0gVmFsdWVUeSBTdWJjbGFzcyA9IFBzZXVkb1NvdXJjZVZhbHVlVmFsKTsKKworICAgIC8vLyBpc0NvbnN0YW50IC0gVGVzdCB3aGV0aGVyIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGlzCisgICAgLy8vIFBzZXVkb1NvdXJjZVZhbHVlIGhhcyBhIGNvbnN0YW50IHZhbHVlLgorICAgIC8vLworICAgIHZpcnR1YWwgYm9vbCBpc0NvbnN0YW50KGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKikgY29uc3Q7CisKKyAgICAvLy8gaXNBbGlhc2VkIC0gVGVzdCB3aGV0aGVyIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGlzCisgICAgLy8vIFBzZXVkb1NvdXJjZVZhbHVlIG1heSBhbHNvIGJlIHBvaW50ZWQgdG8gYnkgYW4gTExWTSBJUiBWYWx1ZS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNBbGlhc2VkKGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKikgY29uc3Q7CisKKyAgICAvLy8gbWF5QWxpYXMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgdGhpcworICAgIC8vLyBQc2V1ZG9Tb3VyY2VWYWx1ZSBjYW4gZXZlciBhbGlhcyBhIExMVk0gSVIgVmFsdWUuCisgICAgdmlydHVhbCBib29sIG1heUFsaWFzKGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKikgY29uc3Q7CisKKyAgICAvLy8gY2xhc3NvZiAtIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQKKyAgICAvLy8gZHluX2Nhc3Q6CisgICAgLy8vCisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgUHNldWRvU291cmNlVmFsdWUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFBzZXVkb1NvdXJjZVZhbHVlVmFsIHx8CisgICAgICAgICAgICAgVi0+Z2V0VmFsdWVJRCgpID09IEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZVZhbDsKKyAgICB9CisKKyAgICAvLy8gQSBwc2V1ZG8gc291cmNlIHZhbHVlIHJlZmVyZW5jaW5nIGEgZml4ZWQgc3RhY2sgZnJhbWUgZW50cnksCisgICAgLy8vIGUuZy4sIGEgc3BpbGwgc2xvdC4KKyAgICBzdGF0aWMgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKmdldEZpeGVkU3RhY2soaW50IEZJKTsKKworICAgIC8vLyBBIHBzZXVkbyBzb3VyY2UgdmFsdWUgcmVmZXJlbmNpbmcgdGhlIGFyZWEgYmVsb3cgdGhlIHN0YWNrIGZyYW1lIG9mCisgICAgLy8vIGEgZnVuY3Rpb24sIGUuZy4sIHRoZSBhcmd1bWVudCBzcGFjZS4KKyAgICBzdGF0aWMgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKmdldFN0YWNrKCk7CisKKyAgICAvLy8gQSBwc2V1ZG8gc291cmNlIHZhbHVlIHJlZmVyZW5jaW5nIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlCisgICAgLy8vIChvciBzb21ldGhpbmcgdGhlIGxpa2UpLgorICAgIHN0YXRpYyBjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqZ2V0R09UKCk7CisKKyAgICAvLy8gQSBwc2V1ZG8gc291cmNlIHZhbHVlIHJlZmVyZW5jaW5nIHRoZSBjb25zdGFudCBwb29sLiBTaW5jZSBjb25zdGFudAorICAgIC8vLyBwb29scyBhcmUgY29uc3RhbnQsIHRoaXMgZG9lc24ndCBuZWVkIHRvIGlkZW50aWZ5IGEgc3BlY2lmaWMgY29uc3RhbnQKKyAgICAvLy8gcG9vbCBlbnRyeS4KKyAgICBzdGF0aWMgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKmdldENvbnN0YW50UG9vbCgpOworCisgICAgLy8vIEEgcHNldWRvIHNvdXJjZSB2YWx1ZSByZWZlcmVuY2luZyBhIGp1bXAgdGFibGUuIFNpbmNlIGp1bXAgdGFibGVzIGFyZQorICAgIC8vLyBjb25zdGFudCwgdGhpcyBkb2Vzbid0IG5lZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBqdW1wIHRhYmxlLgorICAgIHN0YXRpYyBjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqZ2V0SnVtcFRhYmxlKCk7CisgIH07CisKKyAgLy8vIEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZSAtIEEgc3BlY2lhbGl6ZWQgUHNldWRvU291cmNlVmFsdWUKKyAgLy8vIGZvciBob2xkaW5nIEZpeGVkU3RhY2sgdmFsdWVzLCB3aGljaCBtdXN0IGluY2x1ZGUgYSBmcmFtZQorICAvLy8gaW5kZXguCisgIGNsYXNzIEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZSA6IHB1YmxpYyBQc2V1ZG9Tb3VyY2VWYWx1ZSB7CisgICAgY29uc3QgaW50IEZJOworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRml4ZWRTdGFja1BzZXVkb1NvdXJjZVZhbHVlKGludCBmaSkgOgorICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZShGaXhlZFN0YWNrUHNldWRvU291cmNlVmFsdWVWYWwpLCBGSShmaSkge30KKworICAgIC8vLyBjbGFzc29mIC0gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZAorICAgIC8vLyBkeW5fY2FzdDoKKyAgICAvLy8KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBGaXhlZFN0YWNrUHNldWRvU291cmNlVmFsdWUgKikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZVZhbDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNDb25zdGFudChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIGlzQWxpYXNlZChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIG1heUFsaWFzKGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnRDdXN0b20ocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIGludCBnZXRGcmFtZUluZGV4KCkgY29uc3QgeyByZXR1cm4gRkk7IH0KKyAgfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnQWxsb2NSZWdpc3RyeS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnQWxsb2NSZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMGUzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdBbGxvY1JlZ2lzdHJ5LmgKQEAgLTAsMCArMSw2NiBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vUmVnQWxsb2NSZWdpc3RyeS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIGZvciByZWdpc3RlciBhbGxvY2F0b3IgZnVuY3Rpb24KKy8vIHBhc3MgcmVnaXN0cnkgKFJlZ2lzdGVyUmVnQWxsb2MpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOUkVHQUxMT0NSRUdJU1RSWV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTlJFR0FMTE9DUkVHSVNUUllfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVQYXNzUmVnaXN0cnkuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gUmVnaXN0ZXJSZWdBbGxvYyBjbGFzcyAtIFRyYWNrIHRoZSByZWdpc3RyYXRpb24gb2YgcmVnaXN0ZXIgYWxsb2NhdG9ycy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIFJlZ2lzdGVyUmVnQWxsb2MgOiBwdWJsaWMgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgeworCitwdWJsaWM6CisKKyAgdHlwZWRlZiBGdW5jdGlvblBhc3MgKigqRnVuY3Rpb25QYXNzQ3RvcikoKTsKKworICBzdGF0aWMgTWFjaGluZVBhc3NSZWdpc3RyeSBSZWdpc3RyeTsKKworICBSZWdpc3RlclJlZ0FsbG9jKGNvbnN0IGNoYXIgKk4sIGNvbnN0IGNoYXIgKkQsIEZ1bmN0aW9uUGFzc0N0b3IgQykKKyAgOiBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZShOLCBELCAoTWFjaGluZVBhc3NDdG9yKUMpCisgIHsgCisgICAgIFJlZ2lzdHJ5LkFkZCh0aGlzKTsgCisgIH0KKyAgflJlZ2lzdGVyUmVnQWxsb2MoKSB7IFJlZ2lzdHJ5LlJlbW92ZSh0aGlzKTsgfQorICAKKworICAvLyBBY2Nlc3NvcnMuCisgIC8vCisgIFJlZ2lzdGVyUmVnQWxsb2MgKmdldE5leHQoKSBjb25zdCB7CisgICAgcmV0dXJuIChSZWdpc3RlclJlZ0FsbG9jICopTWFjaGluZVBhc3NSZWdpc3RyeU5vZGU6OmdldE5leHQoKTsKKyAgfQorICBzdGF0aWMgUmVnaXN0ZXJSZWdBbGxvYyAqZ2V0TGlzdCgpIHsKKyAgICByZXR1cm4gKFJlZ2lzdGVyUmVnQWxsb2MgKilSZWdpc3RyeS5nZXRMaXN0KCk7CisgIH0KKyAgc3RhdGljIEZ1bmN0aW9uUGFzc0N0b3IgZ2V0RGVmYXVsdCgpIHsKKyAgICByZXR1cm4gKEZ1bmN0aW9uUGFzc0N0b3IpUmVnaXN0cnkuZ2V0RGVmYXVsdCgpOworICB9CisgIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoRnVuY3Rpb25QYXNzQ3RvciBDKSB7CisgICAgUmVnaXN0cnkuc2V0RGVmYXVsdCgoTWFjaGluZVBhc3NDdG9yKUMpOworICB9CisgIHN0YXRpYyB2b2lkIHNldExpc3RlbmVyKE1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lciAqTCkgeworICAgIFJlZ2lzdHJ5LnNldExpc3RlbmVyKEwpOworICB9CisgIAorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyQ29hbGVzY2VyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlckNvYWxlc2Nlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDQ0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlckNvYWxlc2Nlci5oCkBAIC0wLDAgKzEsMjQ0IEBACisvLz09PS0tIFJlZ2lzdGVyQ29hbGVzY2VyLmggLSBSZWdpc3RlciBDb2FsZXNjaW5nIEludGVyZmFjZSAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFic3RyYWN0IGludGVyZmFjZSBmb3IgcmVnaXN0ZXIgY29hbGVzY2VycywgCisvLyBhbGxvd2luZyB0aGVtIHRvIGludGVyYWN0IHdpdGggYW5kIHF1ZXJ5IHJlZ2lzdGVyIGFsbG9jYXRvcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0luY2x1ZGVGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1JFR0lTVEVSX0NPQUxFU0NFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9SRUdJU1RFUl9DT0FMRVNDRVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworICBjbGFzcyBSZWdhbGxvY1F1ZXJ5OworICBjbGFzcyBBbmFseXNpc1VzYWdlOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKyAgY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKKyAgY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworCisgIC8vLyBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHJlZ2lzdGVyIGNvYWxlc2NlcnMuICBDb2FsZXNjZXJzIG11c3QKKyAgLy8vIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBiZSBwYXJ0IG9mIHRoZSBjb2FsZXNjZXIgYW5hbHlzaXMKKyAgLy8vIGdyb3VwLgorICBjbGFzcyBSZWdpc3RlckNvYWxlc2NlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gQ2xhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaW5mbworICAgIFJlZ2lzdGVyQ29hbGVzY2VyKCkge30KKyAgICB2aXJ0dWFsIH5SZWdpc3RlckNvYWxlc2NlcigpOyAgLy8gV2Ugd2FudCB0byBiZSBzdWJjbGFzc2VkCisKKyAgICAvLy8gUnVuIHRoZSBjb2FsZXNjZXIgb24gdGhpcyBmdW5jdGlvbiwgcHJvdmlkaW5nIGludGVyZmVyZW5jZQorICAgIC8vLyBkYXRhIHRvIHF1ZXJ5LiAgUmV0dXJuIHdoZXRoZXIgd2UgcmVtb3ZlZCBhbnkgY29waWVzLgorICAgIHZpcnR1YWwgYm9vbCBjb2FsZXNjZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnYWxsb2NRdWVyeSAmaWZkKSA9IDA7CisKKyAgICAvLy8gUmVzZXQgc3RhdGUuICBDYW4gYmUgdXNlZCB0byBhbGxvdyBhIGNvYWxlc2NlciBydW4gYnkKKyAgICAvLy8gUGFzc01hbmFnZXIgdG8gYmUgcnVuIGFnYWluIGJ5IHRoZSByZWdpc3RlciBhbGxvY2F0b3IuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KE1hY2hpbmVGdW5jdGlvbiAmbWYpIHt9CisKKyAgICAvLy8gUmVnaXN0ZXIgYWxsb2NhdG9ycyBtdXN0IGNhbGwgdGhpcyBmcm9tIHRoZWlyIG93bgorICAgIC8vLyBnZXRBbmFseXNpc1VzYWdlIHRvIGNvdmVyIHRoZSBjYXNlIHdoZXJlIHRoZSBjb2FsZXNjZXIgaXMgbm90CisgICAgLy8vIGEgUGFzcyBpbiB0aGUgcHJvcGVyIHNlbnNlIGFuZCBpc24ndCBtYW5hZ2VkIGJ5IFBhc3NNYW5hZ2VyLgorICAgIC8vLyBQYXNzTWFuYWdlciBuZWVkcyB0byBrbm93IHdoaWNoIGFuYWx5c2VzIHRvIG1ha2UgYXZhaWxhYmxlIGFuZAorICAgIC8vLyB3aGljaCB0byBpbnZhbGlkYXRlIHdoZW4gcnVubmluZyB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIG9yIGFueQorICAgIC8vLyBwYXNzIHRoYXQgbWlnaHQgY2FsbCBjb2FsZXNjaW5nLiAgVGhlIGxvbmctdGVybSBzb2x1dGlvbiBpcyB0bworICAgIC8vLyBhbGxvdyBoaWVyYXJjaGllcyBvZiBQYXNzTWFuYWdlcnMuCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHt9CisgIH07IAorCisgIC8vLyBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHJlZ2lzdGVyIGFsbG9jYXRvcnMgdG8gaW50ZXJhY3Qgd2l0aAorICAvLy8gY29hbGVzY2VycworICAvLy8KKyAgLy8vIEV4YW1wbGU6CisgIC8vLworICAvLy8gVGhpcyBpcyBzaW1wbHkgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBSZWdhbGxvY1F1ZXJ5CisgIC8vLyBpbnRlcmZhY2UuICBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBpbiBwcm9kdWN0aW9uLgorICAvLy8KKyAgLy8vICAgY2xhc3MgTGluZWFyU2NhblJlZ2FsbG9jUXVlcnkgOiBwdWJsaWMgUmVnYWxsb2NRdWVyeSB7CisgIC8vLyAgIHByaXZhdGU6CisgIC8vLyAgICAgY29uc3QgTGl2ZUludGVydmFscyBcJmxpOworICAvLy8KKyAgLy8vICAgcHVibGljOgorICAvLy8gICAgIExpbmVhclNjYW5SZWdhbGxvY1F1ZXJ5KExpdmVJbnRlcnZhbHMgJmludGVydmFscykgCisgIC8vLyAgICAgICAgIDogbGkoaW50ZXJ2YWxzKSB7fQorICAvLy8KKyAgLy8vICAgICAvLy8gVGhpcyBpcyBwcmV0dHkgc2xvdyBhbmQgY29uc2VydmF0aXZlLCBidXQgc2luY2UgbGluZWFyIHNjYW4KKyAgLy8vICAgICAvLy8gYWxsb2NhdGlvbiBkb2Vzbid0IHByZS1jb21wdXRlIGludGVyZmVyZW5jZSBpbmZvcm1hdGlvbiBpdCdzCisgIC8vLyAgICAgLy8vIHRoZSBiZXN0IHdlIGNhbiBkby4gIENvYWxlc2NlcnMgYXJlIGFsd2F5cyBmcmVlIHRvIGlnbm9yZSB0aGlzCisgIC8vLyAgICAgLy8vIGFuZCBpbXBsZW1lbnQgdGhlaXIgb3duIGRpc2NvdmVyeSBzdHJhdGVneS4gIFNlZQorICAvLy8gICAgIC8vLyBTaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcgZm9yIGFuIGV4YW1wbGUuCisgIC8vLyAgICAgdm9pZCBnZXRJbnRlcmZlcmVuY2VzKEludGVydmFsU2V0ICZpbnRlcmZlcmVuY2VzLAorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaXZlSW50ZXJ2YWwgJmEpIGNvbnN0IHsKKyAgLy8vICAgICAgIGZvcihMaXZlSW50ZXJ2YWxzOjpjb25zdF9pdGVyYXRvciBpdiA9IGxpLmJlZ2luKCksCisgIC8vLyAgICAgICAgICAgICBpdmVuZCA9IGxpLmVuZCgpOworICAvLy8gICAgICAgICAgIGl2ICE9IGl2ZW5kOworICAvLy8gICAgICAgICAgICsraXYpIHsKKyAgLy8vICAgICAgICAgaWYgKGludGVyZmVyZShhLCBpdi0+c2Vjb25kKSkgeworICAvLy8gICAgICAgICAgIGludGVyZmVyZW5jZXMuaW5zZXJ0KCZpdi0+c2Vjb25kKTsKKyAgLy8vICAgICAgICAgfQorICAvLy8gICAgICAgfQorICAvLy8gICAgIH0KKyAgLy8vCisgIC8vLyAgICAgLy8vIFRoaXMgaXMgKnJlYWxseSogc2xvdyBhbmQgc3R1cGlkLiAgU2VlIGFib3ZlLgorICAvLy8gICAgIGludCBnZXROdW1iZXJPZkludGVyZmVyZW5jZXMoY29uc3QgTGl2ZUludGVydmFsICZhKSBjb25zdCB7CisgIC8vLyAgICAgICBJbnRlcnZhbFNldCBpbnRlcnZhbHM7CisgIC8vLyAgICAgICBnZXRJbnRlcmZlcmVuY2VzKGludGVydmFscywgYSk7CisgIC8vLyAgICAgICByZXR1cm4gaW50ZXJ2YWxzLnNpemUoKTsKKyAgLy8vICAgICB9CisgIC8vLyAgIH07ICAKKyAgLy8vCisgIC8vLyAgIEluIHRoZSBhbGxvY2F0b3I6CisgIC8vLworICAvLy8gICBSZWdpc3RlckNvYWxlc2NlciAmY29hbGVzY2VyID0gZ2V0QW5hbHlzaXM8UmVnaXN0ZXJDb2FsZXNjZXI+KCk7CisgIC8vLworICAvLy8gICAvLyBXZSBkb24ndCByZXNldCB0aGUgY29hbGVzY2VyIHNvIGlmIGl0J3MgYWxyZWFkeSBiZWVuIHJ1biB0aGlzCisgIC8vLyAgIC8vIHRha2VzIGFsbW9zdCBubyB0aW1lLgorICAvLy8gICBMaW5lYXJTY2FuUmVnYWxsb2NRdWVyeSBpZmQoKmxpXyk7CisgIC8vLyAgIGNvYWxlc2Nlci5jb2FsZXNjZUZ1bmN0aW9uKGZuLCBpZmQpOworICAvLy8KKyAgY2xhc3MgUmVnYWxsb2NRdWVyeSB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNtYWxsUHRyU2V0PGNvbnN0IExpdmVJbnRlcnZhbCAqLCA4PiBJbnRlcnZhbFNldDsKKworICAgIHZpcnR1YWwgflJlZ2FsbG9jUXVlcnkoKSB7fQorICAgIAorICAgIC8vLyBSZXR1cm4gd2hldGhlciB0d28gbGl2ZSByYW5nZXMgaW50ZXJmZXJlLgorICAgIHZpcnR1YWwgYm9vbCBpbnRlcmZlcmUoY29uc3QgTGl2ZUludGVydmFsICZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGl2ZUludGVydmFsICZiKSBjb25zdCB7CisgICAgICAvLyBBIG5haXZlIHRlc3QKKyAgICAgIHJldHVybiBhLm92ZXJsYXBzKGIpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIHNldCBvZiBpbnRlcnZhbHMgdGhhdCBpbnRlcmZlcmUgd2l0aCB0aGlzIG9uZS4KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0SW50ZXJmZXJlbmNlcyhJbnRlcnZhbFNldCAmaW50ZXJmZXJlbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaXZlSW50ZXJ2YWwgJmEpIGNvbnN0ID0gMDsKKworICAgIC8vLyBUaGlzIGNhbiBvZnRlbiBiZSBjaGVhcGVyIHRoYW4gYWN0dWFsbHkgcmV0dXJuaW5nIHRoZQorICAgIC8vLyBpbnRlcmZlcmVuY2VzLgorICAgIHZpcnR1YWwgaW50IGdldE51bWJlck9mSW50ZXJmZXJlbmNlcyhjb25zdCBMaXZlSW50ZXJ2YWwgJmEpIGNvbnN0ID0gMDsKKworICAgIC8vLyBNYWtlIGFueSBkYXRhIHN0cnVjdHVyZSB1cGRhdGVzIG5lY2Vzc2FyeSB0byByZWZsZWN0CisgICAgLy8vIGNvYWxlc2Npbmcgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucy4KKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRGF0YUZvck1lcmdlKGNvbnN0IExpdmVJbnRlcnZhbCAmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpdmVJbnRlcnZhbCAmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmY29weSkge30KKworICAgIC8vLyBBbGxvdyB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIHRvIGNvbW11bmljYXRlIHdoZW4gaXQgZG9lc24ndAorICAgIC8vLyB3YW50IGEgY29weSBjb2FsZXNjZWQuICBUaGlzIG1heSBiZSBkdWUgdG8gYXNzdW1wdGlvbnMgbWFkZSBieQorICAgIC8vLyB0aGUgYWxsb2NhdG9yIGFib3V0IHZhcmlvdXMgaW52YXJpYW50cyBhbmQgc28gdGhpcyBxdWVzdGlvbiBpcworICAgIC8vLyBhIG1hdHRlciBvZiBsZWdhbGl0eSwgbm90IHBlcmZvcm1hbmNlLiAgUGVyZm9ybWFuY2UgZGVjaXNpb25zCisgICAgLy8vIGFib3V0IHdoaWNoIGNvcGllcyB0byBjb2FsZXNjZSBzaG91bGQgYmUgbWFkZSBieSB0aGUKKyAgICAvLy8gY29hbGVzY2VyLgorICAgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsVG9Db2FsZXNjZShjb25zdCBNYWNoaW5lSW5zdHIgJmluc3QpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfTsKKworCisgIC8vLyBDb2FsZXNjZXJQYWlyIC0gQSBoZWxwZXIgY2xhc3MgZm9yIHJlZ2lzdGVyIGNvYWxlc2NlcnMuIFdoZW4gZGVjaWRpbmcgaWYKKyAgLy8vIHR3byByZWdpc3RlcnMgY2FuIGJlIGNvYWxlc2NlZCwgQ29hbGVzY2VyUGFpciBjYW4gZGV0ZXJtaW5lIGlmIGEgY29weQorICAvLy8gaW5zdHJ1Y3Rpb24gd291bGQgYmVjb21lIGFuIGlkZW50aXR5IGNvcHkgYWZ0ZXIgY29hbGVzY2luZy4KKyAgY2xhc3MgQ29hbGVzY2VyUGFpciB7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWlfOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmdHJpXzsKKworICAgIC8vLyBkc3RSZWdfIC0gVGhlIHJlZ2lzdGVyIHRoYXQgd2lsbCBiZSBsZWZ0IGFmdGVyIGNvYWxlc2NpbmcuIEl0IGNhbiBiZSBhCisgICAgLy8vIHZpcnR1YWwgb3IgcGh5c2ljYWwgcmVnaXN0ZXIuCisgICAgdW5zaWduZWQgZHN0UmVnXzsKKworICAgIC8vLyBzcmNSZWdfIC0gdGhlIHZpcnR1YWwgcmVnaXN0ZXIgdGhhdCB3aWxsIGJlIGNvYWxlc2NlZCBpbnRvIGRzdFJlZy4KKyAgICB1bnNpZ25lZCBzcmNSZWdfOworCisgICAgLy8vIHN1YlJlZ18gLSBUaGUgc3VicmVnaXN0ZXIgaW5kZXggb2Ygc3JjUmVnIGluIGRzdFJlZ18uIEl0IGlzIHBvc3NpYmxlIHRoZQorICAgIC8vLyBjb2FsZXNjZSBzcmNSZWdfIGludG8gYSBzdWJyZWcgb2YgdGhlIGxhcmdlciBkc3RSZWdfIHdoZW4gZHN0UmVnXyBpcyBhCisgICAgLy8vIHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgdW5zaWduZWQgc3ViSWR4XzsKKworICAgIC8vLyBwYXJ0aWFsXyAtIFRydWUgd2hlbiB0aGUgb3JpZ2luYWwgY29weSB3YXMgYSBwYXJ0aWFsIHN1YnJlZ2lzdGVyIGNvcHkuCisgICAgYm9vbCBwYXJ0aWFsXzsKKworICAgIC8vLyBjcm9zc0NsYXNzXyAtIFRydWUgd2hlbiBib3RoIHJlZ3MgYXJlIHZpcnR1YWwsIGFuZCBuZXdSQyBpcyBjb25zdHJhaW5lZC4KKyAgICBib29sIGNyb3NzQ2xhc3NfOworCisgICAgLy8vIGZsaXBwZWRfIC0gVHJ1ZSB3aGVuIERzdFJlZyBhbmQgU3JjUmVnIGFyZSByZXZlcnNlZCBmcm9tIHRoZSBvcmlpZ25hbCBjb3B5CisgICAgLy8vIGluc3RydWN0aW9uLgorICAgIGJvb2wgZmxpcHBlZF87CisKKyAgICAvLy8gbmV3UkNfIC0gVGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSBjb2FsZXNjZWQgcmVnaXN0ZXIsIG9yIE5VTEwgaWYgZHN0UmVnXworICAgIC8vLyBpcyBhIHBoeXNyZWcuCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqbmV3UkNfOworCisgICAgLy8vIGNvbXBvc2UgLSBDb21wb3NlIHN1YnJlZyBpbmRpY2VzIGEgYW5kIGIsIGVpdGhlciBtYXkgYmUgMC4KKyAgICB1bnNpZ25lZCBjb21wb3NlKHVuc2lnbmVkLCB1bnNpZ25lZCkgY29uc3Q7CisKKyAgICAvLy8gaXNNb3ZlSW5zdHIgLSBSZXR1cm4gdHJ1ZSBpZiBNSSBpcyBhIG1vdmUgb3Igc3VicmVnIGluc3RydWN0aW9uLgorICAgIGJvb2wgaXNNb3ZlSW5zdHIoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgJlNyYywgdW5zaWduZWQgJkRzdCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcmNTdWIsIHVuc2lnbmVkICZEc3RTdWIpIGNvbnN0OworCisgIHB1YmxpYzoKKyAgICBDb2FsZXNjZXJQYWlyKGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJnRyaSkKKyAgICAgIDogdGlpXyh0aWkpLCB0cmlfKHRyaSksIGRzdFJlZ18oMCksIHNyY1JlZ18oMCksIHN1YklkeF8oMCksCisgICAgICAgIHBhcnRpYWxfKGZhbHNlKSwgY3Jvc3NDbGFzc18oZmFsc2UpLCBmbGlwcGVkXyhmYWxzZSksIG5ld1JDXygwKSB7fQorCisgICAgLy8vIHNldFJlZ2lzdGVycyAtIHNldCByZWdpc3RlcnMgdG8gbWF0Y2ggdGhlIGNvcHkgaW5zdHJ1Y3Rpb24gTUkuIFJldHVybgorICAgIC8vLyBmYWxzZSBpZiBNSSBpcyBub3QgYSBjb2FsZXNjYWJsZSBjb3B5IGluc3RydWN0aW9uLgorICAgIGJvb2wgc2V0UmVnaXN0ZXJzKGNvbnN0IE1hY2hpbmVJbnN0ciopOworCisgICAgLy8vIGZsaXAgLSBTd2FwIHNyY1JlZ18gYW5kIGRzdFJlZ18uIFJldHVybiBmYWxzZSBpZiBzd2FwcGluZyBpcyBpbXBvc3NpYmxlCisgICAgLy8vIGJlY2F1c2UgZHN0UmVnXyBpcyBhIHBoeXNpY2FsIHJlZ2lzdGVyLCBvciBzdWJJZHhfIGlzIHNldC4KKyAgICBib29sIGZsaXAoKTsKKworICAgIC8vLyBpc0NvYWxlc2NhYmxlIC0gUmV0dXJuIHRydWUgaWYgTUkgaXMgYSBjb3B5IGluc3RydWN0aW9uIHRoYXQgd2lsbCBiZWNvbWUKKyAgICAvLy8gYW4gaWRlbnRpdHkgY29weSBhZnRlciBjb2FsZXNjaW5nLgorICAgIGJvb2wgaXNDb2FsZXNjYWJsZShjb25zdCBNYWNoaW5lSW5zdHIqKSBjb25zdDsKKworICAgIC8vLyBpc1BoeXMgLSBSZXR1cm4gdHJ1ZSBpZiBEc3RSZWcgaXMgYSBwaHlzaWNhbCByZWdpc3Rlci4KKyAgICBib29sIGlzUGh5cygpIGNvbnN0IHsgcmV0dXJuICFuZXdSQ187IH0KKworICAgIC8vLyBpc1BhcnRpYWwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgb3JpZ2luYWwgY29weSBpbnN0cnVjdGlvbiBkaWQgbm90IGNvcHkgdGhlCisgICAgLy8vIGZ1bGwgcmVnaXN0ZXIsIGJ1dCB3YXMgYSBzdWJyZWcgb3BlcmF0aW9uLgorICAgIGJvb2wgaXNQYXJ0aWFsKCkgY29uc3QgeyByZXR1cm4gcGFydGlhbF87IH0KKworICAgIC8vLyBpc0Nyb3NzQ2xhc3MgLSBSZXR1cm4gdHJ1ZSBpZiBEc3RSZWcgaXMgdmlydHVhbCBhbmQgTmV3UkMgaXMgYSBzbWFsbGVyIHJlZ2lzdGVyIGNsYXNzIHRoYW4gRHN0UmVnJ3MuCisgICAgYm9vbCBpc0Nyb3NzQ2xhc3MoKSBjb25zdCB7IHJldHVybiBjcm9zc0NsYXNzXzsgfQorCisgICAgLy8vIGlzRmxpcHBlZCAtIFJldHVybiB0cnVlIHdoZW4gZ2V0U3JjUmVnIGlzIHRoZSByZWdpc3RlciBiZWluZyBkZWZpbmVkIGJ5CisgICAgLy8vIHRoZSBvcmlnaW5hbCBjb3B5IGluc3RydWN0aW9uLgorICAgIGJvb2wgaXNGbGlwcGVkKCkgY29uc3QgeyByZXR1cm4gZmxpcHBlZF87IH0KKworICAgIC8vLyBnZXREc3RSZWcgLSBSZXR1cm4gdGhlIHJlZ2lzdGVyICh2aXJ0dWFsIG9yIHBoeXNpY2FsKSB0aGF0IHdpbGwgcmVtYWluCisgICAgLy8vIGFmdGVyIGNvYWxlc2NpbmcuCisgICAgdW5zaWduZWQgZ2V0RHN0UmVnKCkgY29uc3QgeyByZXR1cm4gZHN0UmVnXzsgfQorCisgICAgLy8vIGdldFNyY1JlZyAtIFJldHVybiB0aGUgdmlydHVhbCByZWdpc3RlciB0aGF0IHdpbGwgYmUgY29hbGVzY2VkIGF3YXkuCisgICAgdW5zaWduZWQgZ2V0U3JjUmVnKCkgY29uc3QgeyByZXR1cm4gc3JjUmVnXzsgfQorCisgICAgLy8vIGdldFN1YklkeCAtIFJldHVybiB0aGUgc3VicmVnaXN0ZXIgaW5kZXggaW4gRHN0UmVnIHRoYXQgU3JjUmVnIHdpbGwgYmUKKyAgICAvLy8gY29hbGVzY2VkIGludG8sIG9yIDAuCisgICAgdW5zaWduZWQgZ2V0U3ViSWR4KCkgY29uc3QgeyByZXR1cm4gc3ViSWR4XzsgfQorCisgICAgLy8vIGdldE5ld1JDIC0gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyBvZiB0aGUgY29hbGVzY2VkIHJlZ2lzdGVyLgorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldE5ld1JDKCkgY29uc3QgeyByZXR1cm4gbmV3UkNfOyB9CisgIH07Cit9CisKKy8vIEJlY2F1c2Ugb2YgdGhlIHdheSAuYSBmaWxlcyB3b3JrLCB3ZSBtdXN0IGZvcmNlIHRoZSBTaW1wbGVSQworLy8gaW1wbGVtZW50YXRpb24gdG8gYmUgcHVsbGVkIGluIGlmIHRoZSBSZWdpc3RlckNvYWxlc2NpbmcgaGVhZGVyIGlzCisvLyBpbmNsdWRlZC4gIE90aGVyd2lzZSB3ZSBydW4gdGhlIHJpc2sgb2YgUmVnaXN0ZXJDb2FsZXNjaW5nIGJlaW5nCisvLyB1c2VkLCBidXQgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbm90IGJlaW5nIGxpbmtlZCBpbnRvIHRoZSB0b29sCisvLyB0aGF0IHVzZXMgaXQuCitGT1JDRV9ERUZJTklOR19GSUxFX1RPX0JFX0xJTktFRChSZWdpc3RlckNvYWxlc2NlcikKK0ZPUkNFX0RFRklOSU5HX0ZJTEVfVE9fQkVfTElOS0VEKFNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyU2NhdmVuZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NjgzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaApAQCAtMCwwICsxLDE2OCBAQAorLy89PT0tLSBSZWdpc3RlclNjYXZlbmdpbmcuaCAtIE1hY2hpbmUgcmVnaXN0ZXIgc2NhdmVuZ2luZyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIG1hY2hpbmUgcmVnaXN0ZXIgc2NhdmVuZ2VyIGNsYXNzLiBJdCBjYW4gcHJvdmlkZQorLy8gaW5mb3JtYXRpb24gc3VjaCBhcyB1bnVzZWQgcmVnaXN0ZXIgYXQgYW55IHBvaW50IGluIGEgbWFjaGluZSBiYXNpYyBibG9jay4KKy8vIEl0IGFsc28gcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gbWFrZSByZWdpc3RlcnMgYXZhaWxiYWxlIGJ5IGV2aWN0aW5nIHRoZW0KKy8vIHRvIHNwaWxsIHNsb3RzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1JFR0lTVEVSX1NDQVZFTkdJTkdfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUkVHSVNURVJfU0NBVkVOR0lOR19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKKworY2xhc3MgUmVnU2NhdmVuZ2VyIHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvKiBNUkk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkI7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJOworICB1bnNpZ25lZCBOdW1QaHlzUmVnczsKKworICAvLy8gVHJhY2tpbmcgLSBUcnVlIGlmIFJlZ1NjYXZlbmdlciBpcyBjdXJyZW50bHkgdHJhY2tpbmcgdGhlIGxpdmVuZXNzIG9mIAorICAvLy8gcmVnaXN0ZXJzLgorICBib29sIFRyYWNraW5nOworCisgIC8vLyBTY2F2ZW5naW5nRnJhbWVJbmRleCAtIFNwZWNpYWwgc3BpbGwgc2xvdCB1c2VkIGZvciBzY2F2ZW5naW5nIGEgcmVnaXN0ZXIKKyAgLy8vIHBvc3QgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgaW50IFNjYXZlbmdpbmdGcmFtZUluZGV4OworCisgIC8vLyBTY2F2ZW5nZWRSZWcgLSBJZiBub25lIHplcm8sIHRoZSBzcGVjaWZpYyByZWdpc3RlciBpcyBjdXJyZW50bHkgYmVpbmcKKyAgLy8vIHNjYXZlbmdlZC4gVGhhdCBpcywgaXQgaXMgc3BpbGxlZCB0byB0aGUgc3BlY2lhbCBzY2F2ZW5naW5nIHN0YWNrIHNsb3QuCisgIHVuc2lnbmVkIFNjYXZlbmdlZFJlZzsKKworICAvLy8gU2NhdmVuZ2VkUkMgLSBSZWdpc3RlciBjbGFzcyBvZiB0aGUgc2NhdmVuZ2VkIHJlZ2lzdGVyLgorICAvLy8KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqU2NhdmVuZ2VkUkM7CisKKyAgLy8vIFNjYXZlbmdlUmVzdG9yZSAtIEluc3RydWN0aW9uIHRoYXQgcmVzdG9yZXMgdGhlIHNjYXZlbmdlZCByZWdpc3RlciBmcm9tCisgIC8vLyBzdGFjay4KKyAgY29uc3QgTWFjaGluZUluc3RyICpTY2F2ZW5nZVJlc3RvcmU7CisKKyAgLy8vIENhbGxlZVNhdmVkclJlZ3MgLSBBIGJpdHZlY3RvciBvZiBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzIGZvciB0aGUgdGFyZ2V0LgorICAvLy8KKyAgQml0VmVjdG9yIENhbGxlZVNhdmVkUmVnczsKKworICAvLy8gUmVzZXJ2ZWRSZWdzIC0gQSBiaXR2ZWN0b3Igb2YgcmVzZXJ2ZWQgcmVnaXN0ZXJzLgorICAvLy8KKyAgQml0VmVjdG9yIFJlc2VydmVkUmVnczsKKworICAvLy8gUmVnc0F2YWlsYWJsZSAtIFRoZSBjdXJyZW50IHN0YXRlIG9mIGFsbCB0aGUgcGh5c2ljYWwgcmVnaXN0ZXJzIGltbWVkaWF0ZWx5CisgIC8vLyBiZWZvcmUgTUJCSS4gT25lIGJpdCBwZXIgcGh5c2ljYWwgcmVnaXN0ZXIuIElmIGJpdCBpcyBzZXQgdGhhdCBtZWFucyBpdCdzCisgIC8vLyBhdmFpbGFibGUsIHVuc2V0IG1lYW5zIHRoZSByZWdpc3RlciBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZC4KKyAgQml0VmVjdG9yIFJlZ3NBdmFpbGFibGU7CisKK3B1YmxpYzoKKyAgUmVnU2NhdmVuZ2VyKCkKKyAgICA6IE1CQihOVUxMKSwgTnVtUGh5c1JlZ3MoMCksIFRyYWNraW5nKGZhbHNlKSwKKyAgICAgIFNjYXZlbmdpbmdGcmFtZUluZGV4KC0xKSwgU2NhdmVuZ2VkUmVnKDApLCBTY2F2ZW5nZWRSQyhOVUxMKSB7fQorCisgIC8vLyBlbnRlckJhc2ljQmxvY2sgLSBTdGFydCB0cmFja2luZyBsaXZlbmVzcyBmcm9tIHRoZSBiZWdpbiBvZiB0aGUgc3BlY2lmaWMKKyAgLy8vIGJhc2ljIGJsb2NrLgorICB2b2lkIGVudGVyQmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqbWJiKTsKKworICAvLy8gaW5pdFJlZ1N0YXRlIC0gYWxsb3cgcmVzZXR0aW5nIHJlZ2lzdGVyIHN0YXRlIGluZm8gZm9yIG11bHRpcGxlCisgIC8vLyBwYXNzZXMgb3Zlci93aXRoaW4gdGhlIHNhbWUgZnVuY3Rpb24uCisgIHZvaWQgaW5pdFJlZ1N0YXRlKCk7CisKKyAgLy8vIGZvcndhcmQgLSBNb3ZlIHRoZSBpbnRlcm5hbCBNQkIgaXRlcmF0b3IgYW5kIHVwZGF0ZSByZWdpc3RlciBzdGF0ZXMuCisgIHZvaWQgZm9yd2FyZCgpOworCisgIC8vLyBmb3J3YXJkIC0gTW92ZSB0aGUgaW50ZXJuYWwgTUJCIGl0ZXJhdG9yIGFuZCB1cGRhdGUgcmVnaXN0ZXIgc3RhdGVzIHVudGlsCisgIC8vLyBpdCBoYXMgcHJvY2Vzc2VkIHRoZSBzcGVjaWZpYyBpdGVyYXRvci4KKyAgdm9pZCBmb3J3YXJkKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSB7CisgICAgaWYgKCFUcmFja2luZyAmJiBNQkItPmJlZ2luKCkgIT0gSSkgZm9yd2FyZCgpOworICAgIHdoaWxlIChNQkJJICE9IEkpIGZvcndhcmQoKTsKKyAgfQorCisgIC8vLyBza2lwVG8gLSBNb3ZlIHRoZSBpbnRlcm5hbCBNQkIgaXRlcmF0b3IgYnV0IGRvIG5vdCB1cGRhdGUgcmVnaXN0ZXIgc3RhdGVzLgorICAvLy8KKyAgdm9pZCBza2lwVG8oTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsgTUJCSSA9IEk7IH0KKworICAvLy8gZ2V0UmVnc1VzZWQgLSByZXR1cm4gYWxsIHJlZ2lzdGVycyBjdXJyZW50bHkgaW4gdXNlIGluIHVzZWQuCisgIHZvaWQgZ2V0UmVnc1VzZWQoQml0VmVjdG9yICZ1c2VkLCBib29sIGluY2x1ZGVSZXNlcnZlZCk7CisKKyAgLy8vIGdldFJlZ3NBdmFpbGFibGUgLSBSZXR1cm4gYWxsIGF2YWlsYWJsZSByZWdpc3RlcnMgaW4gdGhlIHJlZ2lzdGVyIGNsYXNzCisgIC8vLyBpbiBNYXNrLgorICB2b2lkIGdldFJlZ3NBdmFpbGFibGUoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsIEJpdFZlY3RvciAmTWFzayk7CisKKyAgLy8vIEZpbmRVbnVzZWRSZWcgLSBGaW5kIGEgdW51c2VkIHJlZ2lzdGVyIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MuCisgIC8vLyBSZXR1cm4gMCBpZiBub25lIGlzIGZvdW5kLgorICB1bnNpZ25lZCBGaW5kVW51c2VkUmVnKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlZ0NsYXNzKSBjb25zdDsKKworICAvLy8gc2V0U2NhdmVuZ2luZ0ZyYW1lSW5kZXggLyBnZXRTY2F2ZW5naW5nRnJhbWVJbmRleCAtIGFjY2Vzc29yIGFuZCBzZXR0ZXIgb2YKKyAgLy8vIFNjYXZlbmdpbmdGcmFtZUluZGV4LgorICB2b2lkIHNldFNjYXZlbmdpbmdGcmFtZUluZGV4KGludCBGSSkgeyBTY2F2ZW5naW5nRnJhbWVJbmRleCA9IEZJOyB9CisgIGludCBnZXRTY2F2ZW5naW5nRnJhbWVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFNjYXZlbmdpbmdGcmFtZUluZGV4OyB9CisKKyAgLy8vIHNjYXZlbmdlUmVnaXN0ZXIgLSBNYWtlIGEgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmljIHJlZ2lzdGVyIGNsYXNzCisgIC8vLyBhdmFpbGFibGUgYW5kIGRvIHRoZSBhcHByb3ByaWF0ZSBib29ra2VlcGluZy4gU1BBZGogaXMgdGhlIHN0YWNrCisgIC8vLyBhZGp1c3RtZW50IGR1ZSB0byBjYWxsIGZyYW1lLCBpdCdzIHBhc3NlZCBhbG9uZyB0byBlbGltaW5hdGVGcmFtZUluZGV4KCkuCisgIC8vLyBSZXR1cm5zIHRoZSBzY2F2ZW5nZWQgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIHNjYXZlbmdlUmVnaXN0ZXIoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUmVnQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIGludCBTUEFkaik7CisgIHVuc2lnbmVkIHNjYXZlbmdlUmVnaXN0ZXIoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUmVnQ2xhc3MsIGludCBTUEFkaikgeworICAgIHJldHVybiBzY2F2ZW5nZVJlZ2lzdGVyKFJlZ0NsYXNzLCBNQkJJLCBTUEFkaik7CisgIH0KKworICAvLy8gc2V0VXNlZCAtIFRlbGwgdGhlIHNjYXZlbmdlciBhIHJlZ2lzdGVyIGlzIHVzZWQuCisgIC8vLworICB2b2lkIHNldFVzZWQodW5zaWduZWQgUmVnKTsKK3ByaXZhdGU6CisgIC8vLyBpc1Jlc2VydmVkIC0gUmV0dXJucyB0cnVlIGlmIGEgcmVnaXN0ZXIgaXMgcmVzZXJ2ZWQuIEl0IGlzIG5ldmVyICJ1bnVzZWQiLgorICBib29sIGlzUmVzZXJ2ZWQodW5zaWduZWQgUmVnKSBjb25zdCB7IHJldHVybiBSZXNlcnZlZFJlZ3MudGVzdChSZWcpOyB9CisKKyAgLy8vIGlzVXNlZCAvIGlzVW51c2VkIC0gVGVzdCBpZiBhIHJlZ2lzdGVyIGlzIGN1cnJlbnRseSBiZWluZyB1c2VkLgorICAvLy8KKyAgYm9vbCBpc1VzZWQodW5zaWduZWQgUmVnKSBjb25zdCAgIHsgcmV0dXJuICFSZWdzQXZhaWxhYmxlLnRlc3QoUmVnKTsgfQorICBib29sIGlzVW51c2VkKHVuc2lnbmVkIFJlZykgY29uc3QgeyByZXR1cm4gUmVnc0F2YWlsYWJsZS50ZXN0KFJlZyk7IH0KKworICAvLy8gaXNBbGlhc1VzZWQgLSBJcyBSZWcgb3IgYW4gYWxpYXMgY3VycmVudGx5IGluIHVzZT8KKyAgYm9vbCBpc0FsaWFzVXNlZCh1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgIC8vLyBzZXRVc2VkIC8gc2V0VW51c2VkIC0gTWFyayB0aGUgc3RhdGUgb2Ygb25lIG9yIGEgbnVtYmVyIG9mIHJlZ2lzdGVycy4KKyAgLy8vCisgIHZvaWQgc2V0VXNlZChCaXRWZWN0b3IgJlJlZ3MpIHsKKyAgICBSZWdzQXZhaWxhYmxlICY9IH5SZWdzOworICB9CisgIHZvaWQgc2V0VW51c2VkKEJpdFZlY3RvciAmUmVncykgeworICAgIFJlZ3NBdmFpbGFibGUgfD0gUmVnczsKKyAgfQorCisgIC8vLyBBZGQgUmVnIGFuZCBhbGwgaXRzIHN1Yi1yZWdpc3RlcnMgdG8gQlYuCisgIHZvaWQgYWRkUmVnV2l0aFN1YlJlZ3MoQml0VmVjdG9yICZCViwgdW5zaWduZWQgUmVnKTsKKworICAvLy8gQWRkIFJlZyBhbmQgaXRzIGFsaWFzZXMgdG8gQlYuCisgIHZvaWQgYWRkUmVnV2l0aEFsaWFzZXMoQml0VmVjdG9yICZCViwgdW5zaWduZWQgUmVnKTsKKworICAvLy8gZmluZFN1cnZpdm9yUmVnIC0gUmV0dXJuIHRoZSBjYW5kaWRhdGUgcmVnaXN0ZXIgdGhhdCBpcyB1bnVzZWQgZm9yIHRoZQorICAvLy8gbG9uZ2VzdCBhZnRlciBTdGFydE1JLiBVc2VNSSBpcyBzZXQgdG8gdGhlIGluc3RydWN0aW9uIHdoZXJlIHRoZSBzZWFyY2gKKyAgLy8vIHN0b3BwZWQuCisgIC8vLworICAvLy8gTm8gbW9yZSB0aGFuIEluc3RyTGltaXQgaW5zdHJ1Y3Rpb25zIGFyZSBpbnNwZWN0ZWQuCisgIHVuc2lnbmVkIGZpbmRTdXJ2aXZvclJlZyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgU3RhcnRNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmQ2FuZGlkYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluc3RyTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJlVzZU1JKTsKKworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SdW50aW1lTGliY2FsbHMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1J1bnRpbWVMaWJjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MWU4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SdW50aW1lTGliY2FsbHMuaApAQCAtMCwwICsxLDMxMyBAQAorLy89PT0tLSBDb2RlR2VuL1J1bnRpbWVMaWJjYWxsLmggLSBSdW50aW1lIExpYnJhcnkgQ2FsbHMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZW51bSByZXByZXNlbnRpbmcgdGhlIGxpc3Qgb2YgcnVudGltZSBsaWJyYXJ5IGNhbGxzCisvLyB0aGUgYmFja2VuZCBtYXkgZW1pdCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLCBhbmQgYWxzbyBzb21lIGhlbHBlciBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUlVOVElNRUxJQkNBTExTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1JVTlRJTUVMSUJDQUxMU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgUlRMSUIgeworICAvLy8gUlRMSUI6OkxpYmNhbGwgZW51bSAtIFRoaXMgZW51bSBkZWZpbmVzIGFsbCBvZiB0aGUgcnVudGltZSBsaWJyYXJ5IGNhbGxzCisgIC8vLyB0aGUgYmFja2VuZCBjYW4gZW1pdC4gIFRoZSB2YXJpb3VzIGxvbmcgZG91YmxlIHR5cGVzIGNhbm5vdCBiZSBtZXJnZWQsCisgIC8vLyBiZWNhdXNlIDgwLWJpdCBsaWJyYXJ5IGZ1bmN0aW9ucyB1c2UgInhmIiBhbmQgMTI4LWJpdCB1c2UgInRmIi4KKyAgLy8vIAorICAvLy8gV2hlbiBhZGRpbmcgUFBDRjEyOCBmdW5jdGlvbnMgaGVyZSwgbm90ZSB0aGF0IHRoZWlyIG5hbWVzIGdlbmVyYWxseSBuZWVkCisgIC8vLyB0byBiZSBvdmVycmlkZGVuIGZvciBEYXJ3aW4gd2l0aCB0aGUgeHh4JExEQkwxMjggZm9ybS4gIFNlZQorICAvLy8gUFBDSVNlbExvd2VyaW5nLmNwcC4KKyAgLy8vCisgIGVudW0gTGliY2FsbCB7CisgICAgLy8gSW50ZWdlcgorICAgIFNITF9JMTYsCisgICAgU0hMX0kzMiwKKyAgICBTSExfSTY0LAorICAgIFNITF9JMTI4LAorICAgIFNSTF9JMTYsCisgICAgU1JMX0kzMiwKKyAgICBTUkxfSTY0LAorICAgIFNSTF9JMTI4LAorICAgIFNSQV9JMTYsCisgICAgU1JBX0kzMiwKKyAgICBTUkFfSTY0LAorICAgIFNSQV9JMTI4LAorICAgIE1VTF9JOCwKKyAgICBNVUxfSTE2LAorICAgIE1VTF9JMzIsCisgICAgTVVMX0k2NCwKKyAgICBNVUxfSTEyOCwKKyAgICBTRElWX0k4LAorICAgIFNESVZfSTE2LAorICAgIFNESVZfSTMyLAorICAgIFNESVZfSTY0LAorICAgIFNESVZfSTEyOCwKKyAgICBVRElWX0k4LAorICAgIFVESVZfSTE2LAorICAgIFVESVZfSTMyLAorICAgIFVESVZfSTY0LAorICAgIFVESVZfSTEyOCwKKyAgICBTUkVNX0k4LAorICAgIFNSRU1fSTE2LAorICAgIFNSRU1fSTMyLAorICAgIFNSRU1fSTY0LAorICAgIFNSRU1fSTEyOCwKKyAgICBVUkVNX0k4LAorICAgIFVSRU1fSTE2LAorICAgIFVSRU1fSTMyLAorICAgIFVSRU1fSTY0LAorICAgIFVSRU1fSTEyOCwKKyAgICBORUdfSTMyLAorICAgIE5FR19JNjQsCisKKyAgICAvLyBGTE9BVElORyBQT0lOVAorICAgIEFERF9GMzIsCisgICAgQUREX0Y2NCwKKyAgICBBRERfRjgwLAorICAgIEFERF9QUENGMTI4LAorICAgIFNVQl9GMzIsCisgICAgU1VCX0Y2NCwKKyAgICBTVUJfRjgwLAorICAgIFNVQl9QUENGMTI4LAorICAgIE1VTF9GMzIsCisgICAgTVVMX0Y2NCwKKyAgICBNVUxfRjgwLAorICAgIE1VTF9QUENGMTI4LAorICAgIERJVl9GMzIsCisgICAgRElWX0Y2NCwKKyAgICBESVZfRjgwLAorICAgIERJVl9QUENGMTI4LAorICAgIFJFTV9GMzIsCisgICAgUkVNX0Y2NCwKKyAgICBSRU1fRjgwLAorICAgIFJFTV9QUENGMTI4LAorICAgIFBPV0lfRjMyLAorICAgIFBPV0lfRjY0LAorICAgIFBPV0lfRjgwLAorICAgIFBPV0lfUFBDRjEyOCwKKyAgICBTUVJUX0YzMiwKKyAgICBTUVJUX0Y2NCwKKyAgICBTUVJUX0Y4MCwKKyAgICBTUVJUX1BQQ0YxMjgsCisgICAgTE9HX0YzMiwKKyAgICBMT0dfRjY0LAorICAgIExPR19GODAsCisgICAgTE9HX1BQQ0YxMjgsCisgICAgTE9HMl9GMzIsCisgICAgTE9HMl9GNjQsCisgICAgTE9HMl9GODAsCisgICAgTE9HMl9QUENGMTI4LAorICAgIExPRzEwX0YzMiwKKyAgICBMT0cxMF9GNjQsCisgICAgTE9HMTBfRjgwLAorICAgIExPRzEwX1BQQ0YxMjgsCisgICAgRVhQX0YzMiwKKyAgICBFWFBfRjY0LAorICAgIEVYUF9GODAsCisgICAgRVhQX1BQQ0YxMjgsCisgICAgRVhQMl9GMzIsCisgICAgRVhQMl9GNjQsCisgICAgRVhQMl9GODAsCisgICAgRVhQMl9QUENGMTI4LAorICAgIFNJTl9GMzIsCisgICAgU0lOX0Y2NCwKKyAgICBTSU5fRjgwLAorICAgIFNJTl9QUENGMTI4LAorICAgIENPU19GMzIsCisgICAgQ09TX0Y2NCwKKyAgICBDT1NfRjgwLAorICAgIENPU19QUENGMTI4LAorICAgIFBPV19GMzIsCisgICAgUE9XX0Y2NCwKKyAgICBQT1dfRjgwLAorICAgIFBPV19QUENGMTI4LAorICAgIENFSUxfRjMyLAorICAgIENFSUxfRjY0LAorICAgIENFSUxfRjgwLAorICAgIENFSUxfUFBDRjEyOCwKKyAgICBUUlVOQ19GMzIsCisgICAgVFJVTkNfRjY0LAorICAgIFRSVU5DX0Y4MCwKKyAgICBUUlVOQ19QUENGMTI4LAorICAgIFJJTlRfRjMyLAorICAgIFJJTlRfRjY0LAorICAgIFJJTlRfRjgwLAorICAgIFJJTlRfUFBDRjEyOCwKKyAgICBORUFSQllJTlRfRjMyLAorICAgIE5FQVJCWUlOVF9GNjQsCisgICAgTkVBUkJZSU5UX0Y4MCwKKyAgICBORUFSQllJTlRfUFBDRjEyOCwKKyAgICBGTE9PUl9GMzIsCisgICAgRkxPT1JfRjY0LAorICAgIEZMT09SX0Y4MCwKKyAgICBGTE9PUl9QUENGMTI4LAorICAgIENPUFlTSUdOX0YzMiwKKyAgICBDT1BZU0lHTl9GNjQsCisgICAgQ09QWVNJR05fRjgwLAorICAgIENPUFlTSUdOX1BQQ0YxMjgsCisKKyAgICAvLyBDT05WRVJTSU9OCisgICAgRlBFWFRfRjMyX0Y2NCwKKyAgICBGUEVYVF9GMTZfRjMyLAorICAgIEZQUk9VTkRfRjMyX0YxNiwKKyAgICBGUFJPVU5EX0Y2NF9GMzIsCisgICAgRlBST1VORF9GODBfRjMyLAorICAgIEZQUk9VTkRfUFBDRjEyOF9GMzIsCisgICAgRlBST1VORF9GODBfRjY0LAorICAgIEZQUk9VTkRfUFBDRjEyOF9GNjQsCisgICAgRlBUT1NJTlRfRjMyX0k4LAorICAgIEZQVE9TSU5UX0YzMl9JMTYsCisgICAgRlBUT1NJTlRfRjMyX0kzMiwKKyAgICBGUFRPU0lOVF9GMzJfSTY0LAorICAgIEZQVE9TSU5UX0YzMl9JMTI4LAorICAgIEZQVE9TSU5UX0Y2NF9JOCwKKyAgICBGUFRPU0lOVF9GNjRfSTE2LAorICAgIEZQVE9TSU5UX0Y2NF9JMzIsCisgICAgRlBUT1NJTlRfRjY0X0k2NCwKKyAgICBGUFRPU0lOVF9GNjRfSTEyOCwKKyAgICBGUFRPU0lOVF9GODBfSTMyLAorICAgIEZQVE9TSU5UX0Y4MF9JNjQsCisgICAgRlBUT1NJTlRfRjgwX0kxMjgsCisgICAgRlBUT1NJTlRfUFBDRjEyOF9JMzIsCisgICAgRlBUT1NJTlRfUFBDRjEyOF9JNjQsCisgICAgRlBUT1NJTlRfUFBDRjEyOF9JMTI4LAorICAgIEZQVE9VSU5UX0YzMl9JOCwKKyAgICBGUFRPVUlOVF9GMzJfSTE2LAorICAgIEZQVE9VSU5UX0YzMl9JMzIsCisgICAgRlBUT1VJTlRfRjMyX0k2NCwKKyAgICBGUFRPVUlOVF9GMzJfSTEyOCwKKyAgICBGUFRPVUlOVF9GNjRfSTgsCisgICAgRlBUT1VJTlRfRjY0X0kxNiwKKyAgICBGUFRPVUlOVF9GNjRfSTMyLAorICAgIEZQVE9VSU5UX0Y2NF9JNjQsCisgICAgRlBUT1VJTlRfRjY0X0kxMjgsCisgICAgRlBUT1VJTlRfRjgwX0kzMiwKKyAgICBGUFRPVUlOVF9GODBfSTY0LAorICAgIEZQVE9VSU5UX0Y4MF9JMTI4LAorICAgIEZQVE9VSU5UX1BQQ0YxMjhfSTMyLAorICAgIEZQVE9VSU5UX1BQQ0YxMjhfSTY0LAorICAgIEZQVE9VSU5UX1BQQ0YxMjhfSTEyOCwKKyAgICBTSU5UVE9GUF9JMzJfRjMyLAorICAgIFNJTlRUT0ZQX0kzMl9GNjQsCisgICAgU0lOVFRPRlBfSTMyX0Y4MCwKKyAgICBTSU5UVE9GUF9JMzJfUFBDRjEyOCwKKyAgICBTSU5UVE9GUF9JNjRfRjMyLAorICAgIFNJTlRUT0ZQX0k2NF9GNjQsCisgICAgU0lOVFRPRlBfSTY0X0Y4MCwKKyAgICBTSU5UVE9GUF9JNjRfUFBDRjEyOCwKKyAgICBTSU5UVE9GUF9JMTI4X0YzMiwKKyAgICBTSU5UVE9GUF9JMTI4X0Y2NCwKKyAgICBTSU5UVE9GUF9JMTI4X0Y4MCwKKyAgICBTSU5UVE9GUF9JMTI4X1BQQ0YxMjgsCisgICAgVUlOVFRPRlBfSTMyX0YzMiwKKyAgICBVSU5UVE9GUF9JMzJfRjY0LAorICAgIFVJTlRUT0ZQX0kzMl9GODAsCisgICAgVUlOVFRPRlBfSTMyX1BQQ0YxMjgsCisgICAgVUlOVFRPRlBfSTY0X0YzMiwKKyAgICBVSU5UVE9GUF9JNjRfRjY0LAorICAgIFVJTlRUT0ZQX0k2NF9GODAsCisgICAgVUlOVFRPRlBfSTY0X1BQQ0YxMjgsCisgICAgVUlOVFRPRlBfSTEyOF9GMzIsCisgICAgVUlOVFRPRlBfSTEyOF9GNjQsCisgICAgVUlOVFRPRlBfSTEyOF9GODAsCisgICAgVUlOVFRPRlBfSTEyOF9QUENGMTI4LAorCisgICAgLy8gQ09NUEFSSVNPTgorICAgIE9FUV9GMzIsCisgICAgT0VRX0Y2NCwKKyAgICBVTkVfRjMyLAorICAgIFVORV9GNjQsCisgICAgT0dFX0YzMiwKKyAgICBPR0VfRjY0LAorICAgIE9MVF9GMzIsCisgICAgT0xUX0Y2NCwKKyAgICBPTEVfRjMyLAorICAgIE9MRV9GNjQsCisgICAgT0dUX0YzMiwKKyAgICBPR1RfRjY0LAorICAgIFVPX0YzMiwKKyAgICBVT19GNjQsCisgICAgT19GMzIsCisgICAgT19GNjQsCisKKyAgICAvLyBNRU1PUlkKKyAgICBNRU1DUFksCisgICAgTUVNU0VULAorICAgIE1FTU1PVkUsCisKKyAgICAvLyBFWENFUFRJT04gSEFORExJTkcKKyAgICBVTldJTkRfUkVTVU1FLAorCisgICAgLy8gRmFtaWx5IEFUT01JQ3MKKyAgICBTWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQXzEsCisgICAgU1lOQ19WQUxfQ09NUEFSRV9BTkRfU1dBUF8yLAorICAgIFNZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVBfNCwKKyAgICBTWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQXzgsCisgICAgU1lOQ19MT0NLX1RFU1RfQU5EX1NFVF8xLAorICAgIFNZTkNfTE9DS19URVNUX0FORF9TRVRfMiwKKyAgICBTWU5DX0xPQ0tfVEVTVF9BTkRfU0VUXzQsCisgICAgU1lOQ19MT0NLX1RFU1RfQU5EX1NFVF84LAorICAgIFNZTkNfRkVUQ0hfQU5EX0FERF8xLAorICAgIFNZTkNfRkVUQ0hfQU5EX0FERF8yLAorICAgIFNZTkNfRkVUQ0hfQU5EX0FERF80LAorICAgIFNZTkNfRkVUQ0hfQU5EX0FERF84LAorICAgIFNZTkNfRkVUQ0hfQU5EX1NVQl8xLAorICAgIFNZTkNfRkVUQ0hfQU5EX1NVQl8yLAorICAgIFNZTkNfRkVUQ0hfQU5EX1NVQl80LAorICAgIFNZTkNfRkVUQ0hfQU5EX1NVQl84LAorICAgIFNZTkNfRkVUQ0hfQU5EX0FORF8xLAorICAgIFNZTkNfRkVUQ0hfQU5EX0FORF8yLAorICAgIFNZTkNfRkVUQ0hfQU5EX0FORF80LAorICAgIFNZTkNfRkVUQ0hfQU5EX0FORF84LAorICAgIFNZTkNfRkVUQ0hfQU5EX09SXzEsCisgICAgU1lOQ19GRVRDSF9BTkRfT1JfMiwKKyAgICBTWU5DX0ZFVENIX0FORF9PUl80LAorICAgIFNZTkNfRkVUQ0hfQU5EX09SXzgsCisgICAgU1lOQ19GRVRDSF9BTkRfWE9SXzEsCisgICAgU1lOQ19GRVRDSF9BTkRfWE9SXzIsCisgICAgU1lOQ19GRVRDSF9BTkRfWE9SXzQsCisgICAgU1lOQ19GRVRDSF9BTkRfWE9SXzgsCisgICAgU1lOQ19GRVRDSF9BTkRfTkFORF8xLAorICAgIFNZTkNfRkVUQ0hfQU5EX05BTkRfMiwKKyAgICBTWU5DX0ZFVENIX0FORF9OQU5EXzQsCisgICAgU1lOQ19GRVRDSF9BTkRfTkFORF84LAorCisgICAgVU5LTk9XTl9MSUJDQUxMCisgIH07CisKKyAgLy8vIGdldEZQRVhUIC0gUmV0dXJuIHRoZSBGUEVYVF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKyAgLy8vIFVOS05PV05fTElCQ0FMTCBpZiB0aGVyZSBpcyBub25lLgorICBMaWJjYWxsIGdldEZQRVhUKEVWVCBPcFZULCBFVlQgUmV0VlQpOworCisgIC8vLyBnZXRGUFJPVU5EIC0gUmV0dXJuIHRoZSBGUFJPVU5EXypfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGVzLCBvcgorICAvLy8gVU5LTk9XTl9MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCisgIExpYmNhbGwgZ2V0RlBST1VORChFVlQgT3BWVCwgRVZUIFJldFZUKTsKKworICAvLy8gZ2V0RlBUT1NJTlQgLSBSZXR1cm4gdGhlIEZQVE9TSU5UXypfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGVzLCBvcgorICAvLy8gVU5LTk9XTl9MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCisgIExpYmNhbGwgZ2V0RlBUT1NJTlQoRVZUIE9wVlQsIEVWVCBSZXRWVCk7CisKKyAgLy8vIGdldEZQVE9VSU5UIC0gUmV0dXJuIHRoZSBGUFRPVUlOVF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKyAgLy8vIFVOS05PV05fTElCQ0FMTCBpZiB0aGVyZSBpcyBub25lLgorICBMaWJjYWxsIGdldEZQVE9VSU5UKEVWVCBPcFZULCBFVlQgUmV0VlQpOworCisgIC8vLyBnZXRTSU5UVE9GUCAtIFJldHVybiB0aGUgU0lOVFRPRlBfKl8qIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdHlwZXMsIG9yCisgIC8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRTSU5UVE9GUChFVlQgT3BWVCwgRVZUIFJldFZUKTsKKworICAvLy8gZ2V0VUlOVFRPRlAgLSBSZXR1cm4gdGhlIFVJTlRUT0ZQXypfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGVzLCBvcgorICAvLy8gVU5LTk9XTl9MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCisgIExpYmNhbGwgZ2V0VUlOVFRPRlAoRVZUIE9wVlQsIEVWVCBSZXRWVCk7Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2MjY4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgKQEAgLTAsMCArMSw2ODEgQEAKKy8vPT09LS0tLS0tLSBsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCAtIENvbW1vbiBCYXNlIENsYXNzLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNjaGVkdWxlREFHIGNsYXNzLCB3aGljaCBpcyB1c2VkIGFzIHRoZSBjb21tb24KKy8vIGJhc2UgY2xhc3MgZm9yIGluc3RydWN0aW9uIHNjaGVkdWxlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fU0NIRURVTEVEQUdfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fU0NIRURVTEVEQUdfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQWxpYXNBbmFseXNpczsKKyAgY2xhc3MgU1VuaXQ7CisgIGNsYXNzIE1hY2hpbmVDb25zdGFudFBvb2w7CisgIGNsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKyAgY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKKyAgY2xhc3MgTWFjaGluZUluc3RyOworICBjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisgIGNsYXNzIFNjaGVkdWxlREFHOworICBjbGFzcyBTRE5vZGU7CisgIGNsYXNzIFRhcmdldEluc3RySW5mbzsKKyAgY2xhc3MgVGFyZ2V0SW5zdHJEZXNjOworICBjbGFzcyBUYXJnZXRNYWNoaW5lOworICBjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworICB0ZW1wbGF0ZTxjbGFzcyBHcmFwaD4gY2xhc3MgR3JhcGhXcml0ZXI7CisKKyAgLy8vIFNEZXAgLSBTY2hlZHVsaW5nIGRlcGVuZGVuY3kuIFRoaXMgcmVwcmVzZW50cyBvbmUgZGlyZWN0aW9uIG9mIGFuCisgIC8vLyBlZGdlIGluIHRoZSBzY2hlZHVsaW5nIERBRy4KKyAgY2xhc3MgU0RlcCB7CisgIHB1YmxpYzoKKyAgICAvLy8gS2luZCAtIFRoZXNlIGFyZSB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIHNjaGVkdWxpbmcgZGVwZW5kZW5jaWVzLgorICAgIGVudW0gS2luZCB7CisgICAgICBEYXRhLCAgICAgICAgLy8vPCBSZWd1bGFyIGRhdGEgZGVwZW5kZW5jZSAoYWthIHRydWUtZGVwZW5kZW5jZSkuCisgICAgICBBbnRpLCAgICAgICAgLy8vPCBBIHJlZ2lzdGVyIGFudGktZGVwZW5kZWRlbmNlIChha2EgV0FSKS4KKyAgICAgIE91dHB1dCwgICAgICAvLy88IEEgcmVnaXN0ZXIgb3V0cHV0LWRlcGVuZGVuY2UgKGFrYSBXQVcpLgorICAgICAgT3JkZXIgICAgICAgIC8vLzwgQW55IG90aGVyIG9yZGVyaW5nIGRlcGVuZGVuY3kuCisgICAgfTsKKworICBwcml2YXRlOgorICAgIC8vLyBEZXAgLSBBIHBvaW50ZXIgdG8gdGhlIGRlcGVuZGluZy9kZXBlbmRlZC1vbiBTVW5pdCwgYW5kIGFuIGVudW0KKyAgICAvLy8gaW5kaWNhdGluZyB0aGUga2luZCBvZiB0aGUgZGVwZW5kZW5jeS4KKyAgICBQb2ludGVySW50UGFpcjxTVW5pdCAqLCAyLCBLaW5kPiBEZXA7CisKKyAgICAvLy8gQ29udGVudHMgLSBBIHVuaW9uIGRpc2NyaW1pbmF0ZWQgYnkgdGhlIGRlcGVuZGVuY2Uga2luZC4KKyAgICB1bmlvbiB7CisgICAgICAvLy8gUmVnIC0gRm9yIERhdGEsIEFudGksIGFuZCBPdXRwdXQgZGVwZW5kZW5jaWVzLCB0aGUgYXNzb2NpYXRlZAorICAgICAgLy8vIHJlZ2lzdGVyLiBGb3IgRGF0YSBkZXBlbmRlbmNpZXMgdGhhdCBkb24ndCBjdXJyZW50bHkgaGF2ZSBhIHJlZ2lzdGVyCisgICAgICAvLy8gYXNzaWduZWQsIHRoaXMgaXMgc2V0IHRvIHplcm8uCisgICAgICB1bnNpZ25lZCBSZWc7CisKKyAgICAgIC8vLyBPcmRlciAtIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgT3JkZXIgZGVwZW5kZW5jaWVzLgorICAgICAgc3RydWN0IHsKKyAgICAgICAgLy8vIGlzTm9ybWFsTWVtb3J5IC0gVHJ1ZSBpZiBib3RoIHNpZGVzIG9mIHRoZSBkZXBlbmRlbmNlCisgICAgICAgIC8vLyBhY2Nlc3MgbWVtb3J5IGluIG5vbi12b2xhdGlsZSBhbmQgZnVsbHkgbW9kZWxlZCB3YXlzLgorICAgICAgICBib29sIGlzTm9ybWFsTWVtb3J5IDogMTsKKworICAgICAgICAvLy8gaXNNdXN0QWxpYXMgLSBUcnVlIGlmIGJvdGggc2lkZXMgb2YgdGhlIGRlcGVuZGVuY2UgYXJlIGtub3duIHRvCisgICAgICAgIC8vLyBhY2Nlc3MgdGhlIHNhbWUgbWVtb3J5LgorICAgICAgICBib29sIGlzTXVzdEFsaWFzIDogMTsKKworICAgICAgICAvLy8gaXNBcnRpZmljaWFsIC0gVHJ1ZSBpZiB0aGlzIGlzIGFuIGFydGlmaWNpYWwgZGVwZW5kZW5jeSwgbWVhbmluZworICAgICAgICAvLy8gaXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgcHJvZ3JhbSBjb3JyZWN0bmVzcywgYW5kIG1heSBiZSBzYWZlbHkKKyAgICAgICAgLy8vIGRlbGV0ZWQgaWYgbmVjZXNzYXJ5LgorICAgICAgICBib29sIGlzQXJ0aWZpY2lhbCA6IDE7CisgICAgICB9IE9yZGVyOworICAgIH0gQ29udGVudHM7CisKKyAgICAvLy8gTGF0ZW5jeSAtIFRoZSB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkZ2UuIE9mdGVuIHRoaXMgaXMganVzdAorICAgIC8vLyB0aGUgdmFsdWUgb2YgdGhlIExhdGVuY3kgZmllbGQgb2YgdGhlIHByZWRlY2Vzc29yLCBob3dldmVyIGFkdmFuY2VkCisgICAgLy8vIG1vZGVscyBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGVkZ2VzLgorICAgIHVuc2lnbmVkIExhdGVuY3k7CisKKyAgcHVibGljOgorICAgIC8vLyBTRGVwIC0gQ29uc3RydWN0IGEgbnVsbCBTRGVwLiBUaGlzIGlzIG9ubHkgZm9yIHVzZSBieSBjb250YWluZXIKKyAgICAvLy8gY2xhc3NlcyB3aGljaCByZXF1aXJlIGRlZmF1bHQgY29uc3RydWN0b3JzLiBTVW5pdHMgbWF5IG5vdAorICAgIC8vLyBoYXZlIG51bGwgU0RlcCBlZGdlcy4KKyAgICBTRGVwKCkgOiBEZXAoMCwgRGF0YSkge30KKworICAgIC8vLyBTRGVwIC0gQ29uc3RydWN0IGFuIFNEZXAgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICBTRGVwKFNVbml0ICpTLCBLaW5kIGtpbmQsIHVuc2lnbmVkIGxhdGVuY3kgPSAxLCB1bnNpZ25lZCBSZWcgPSAwLAorICAgICAgICAgYm9vbCBpc05vcm1hbE1lbW9yeSA9IGZhbHNlLCBib29sIGlzTXVzdEFsaWFzID0gZmFsc2UsCisgICAgICAgICBib29sIGlzQXJ0aWZpY2lhbCA9IGZhbHNlKQorICAgICAgOiBEZXAoUywga2luZCksIENvbnRlbnRzKCksIExhdGVuY3kobGF0ZW5jeSkgeworICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICBjYXNlIEFudGk6CisgICAgICBjYXNlIE91dHB1dDoKKyAgICAgICAgYXNzZXJ0KFJlZyAhPSAwICYmCisgICAgICAgICAgICAgICAiU0RlcDo6QW50aSBhbmQgU0RlcDo6T3V0cHV0IG11c3QgdXNlIGEgbm9uLXplcm8gUmVnISIpOworICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgIGNhc2UgRGF0YToKKyAgICAgICAgYXNzZXJ0KCFpc011c3RBbGlhcyAmJiAiaXNNdXN0QWxpYXMgb25seSBhcHBsaWVzIHdpdGggU0RlcDo6T3JkZXIhIik7CisgICAgICAgIGFzc2VydCghaXNBcnRpZmljaWFsICYmICJpc0FydGlmaWNpYWwgb25seSBhcHBsaWVzIHdpdGggU0RlcDo6T3JkZXIhIik7CisgICAgICAgIENvbnRlbnRzLlJlZyA9IFJlZzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9yZGVyOgorICAgICAgICBhc3NlcnQoUmVnID09IDAgJiYgIlJlZyBnaXZlbiBmb3Igbm9uLXJlZ2lzdGVyIGRlcGVuZGVuY2UhIik7CisgICAgICAgIENvbnRlbnRzLk9yZGVyLmlzTm9ybWFsTWVtb3J5ID0gaXNOb3JtYWxNZW1vcnk7CisgICAgICAgIENvbnRlbnRzLk9yZGVyLmlzTXVzdEFsaWFzID0gaXNNdXN0QWxpYXM7CisgICAgICAgIENvbnRlbnRzLk9yZGVyLmlzQXJ0aWZpY2lhbCA9IGlzQXJ0aWZpY2lhbDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNEZXAgJk90aGVyKSBjb25zdCB7CisgICAgICBpZiAoRGVwICE9IE90aGVyLkRlcCB8fCBMYXRlbmN5ICE9IE90aGVyLkxhdGVuY3kpIHJldHVybiBmYWxzZTsKKyAgICAgIHN3aXRjaCAoRGVwLmdldEludCgpKSB7CisgICAgICBjYXNlIERhdGE6CisgICAgICBjYXNlIEFudGk6CisgICAgICBjYXNlIE91dHB1dDoKKyAgICAgICAgcmV0dXJuIENvbnRlbnRzLlJlZyA9PSBPdGhlci5Db250ZW50cy5SZWc7CisgICAgICBjYXNlIE9yZGVyOgorICAgICAgICByZXR1cm4gQ29udGVudHMuT3JkZXIuaXNOb3JtYWxNZW1vcnkgPT0KKyAgICAgICAgICAgICAgICAgT3RoZXIuQ29udGVudHMuT3JkZXIuaXNOb3JtYWxNZW1vcnkgJiYKKyAgICAgICAgICAgICAgIENvbnRlbnRzLk9yZGVyLmlzTXVzdEFsaWFzID09IE90aGVyLkNvbnRlbnRzLk9yZGVyLmlzTXVzdEFsaWFzICYmCisgICAgICAgICAgICAgICBDb250ZW50cy5PcmRlci5pc0FydGlmaWNpYWwgPT0gT3RoZXIuQ29udGVudHMuT3JkZXIuaXNBcnRpZmljaWFsOworICAgICAgfQorICAgICAgYXNzZXJ0KDAgJiYgIkludmFsaWQgZGVwZW5kZW5jeSBraW5kISIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTRGVwICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KE90aGVyKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0TGF0ZW5jeSAtIFJldHVybiB0aGUgbGF0ZW5jeSB2YWx1ZSBmb3IgdGhpcyBlZGdlLCB3aGljaCByb3VnaGx5CisgICAgLy8vIG1lYW5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjeWNsZXMgdGhhdCBtdXN0IGVsYXBzZSBiZXR3ZWVuIHRoZQorICAgIC8vLyBwcmVkZWNlc3NvciBhbmQgdGhlIHN1Y2Nlc3NvciwgZ2l2ZW4gdGhhdCB0aGV5IGhhdmUgdGhpcyBlZGdlCisgICAgLy8vIGJldHdlZW4gdGhlbS4KKyAgICB1bnNpZ25lZCBnZXRMYXRlbmN5KCkgY29uc3QgeworICAgICAgcmV0dXJuIExhdGVuY3k7CisgICAgfQorCisgICAgLy8vIHNldExhdGVuY3kgLSBTZXQgdGhlIGxhdGVuY3kgZm9yIHRoaXMgZWRnZS4KKyAgICB2b2lkIHNldExhdGVuY3kodW5zaWduZWQgTGF0KSB7CisgICAgICBMYXRlbmN5ID0gTGF0OworICAgIH0KKworICAgIC8vLy8gZ2V0U1VuaXQgLSBSZXR1cm4gdGhlIFNVbml0IHRvIHdoaWNoIHRoaXMgZWRnZSBwb2ludHMuCisgICAgU1VuaXQgKmdldFNVbml0KCkgY29uc3QgeworICAgICAgcmV0dXJuIERlcC5nZXRQb2ludGVyKCk7CisgICAgfQorCisgICAgLy8vLyBzZXRTVW5pdCAtIEFzc2lnbiB0aGUgU1VuaXQgdG8gd2hpY2ggdGhpcyBlZGdlIHBvaW50cy4KKyAgICB2b2lkIHNldFNVbml0KFNVbml0ICpTVSkgeworICAgICAgRGVwLnNldFBvaW50ZXIoU1UpOworICAgIH0KKworICAgIC8vLyBnZXRLaW5kIC0gUmV0dXJuIGFuIGVudW0gdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBraW5kIG9mIHRoZSBkZXBlbmRlbmNlLgorICAgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBEZXAuZ2V0SW50KCk7CisgICAgfQorCisgICAgLy8vIGlzQ3RybCAtIFNob3J0aGFuZCBmb3IgZ2V0S2luZCgpICE9IFNEZXA6OkRhdGEuCisgICAgYm9vbCBpc0N0cmwoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0S2luZCgpICE9IERhdGE7CisgICAgfQorCisgICAgLy8vIGlzTm9ybWFsTWVtb3J5IC0gVGVzdCBpZiB0aGlzIGlzIGFuIE9yZGVyIGRlcGVuZGVuY2UgYmV0d2VlbiB0d28KKyAgICAvLy8gbWVtb3J5IGFjY2Vzc2VzIHdoZXJlIGJvdGggc2lkZXMgb2YgdGhlIGRlcGVuZGVuY2UgYWNjZXNzIG1lbW9yeQorICAgIC8vLyBpbiBub24tdm9sYXRpbGUgYW5kIGZ1bGx5IG1vZGVsZWQgd2F5cy4KKyAgICBib29sIGlzTm9ybWFsTWVtb3J5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBPcmRlciAmJiBDb250ZW50cy5PcmRlci5pc05vcm1hbE1lbW9yeTsKKyAgICB9CisKKyAgICAvLy8gaXNNdXN0QWxpYXMgLSBUZXN0IGlmIHRoaXMgaXMgYW4gT3JkZXIgZGVwZW5kZW5jZSB0aGF0IGlzIG1hcmtlZAorICAgIC8vLyBhcyAibXVzdCBhbGlhcyIsIG1lYW5pbmcgdGhhdCB0aGUgU1VuaXRzIGF0IGVpdGhlciBlbmQgb2YgdGhlIGVkZ2UKKyAgICAvLy8gaGF2ZSBhIG1lbW9yeSBkZXBlbmRlbmNlIG9uIGEga25vd24gbWVtb3J5IGxvY2F0aW9uLgorICAgIGJvb2wgaXNNdXN0QWxpYXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0S2luZCgpID09IE9yZGVyICYmIENvbnRlbnRzLk9yZGVyLmlzTXVzdEFsaWFzOworICAgIH0KKworICAgIC8vLyBpc0FydGlmaWNpYWwgLSBUZXN0IGlmIHRoaXMgaXMgYW4gT3JkZXIgZGVwZW5kZW5jZSB0aGF0IGlzIG1hcmtlZAorICAgIC8vLyBhcyAiYXJ0aWZpY2lhbCIsIG1lYW5pbmcgaXQgaXNuJ3QgbmVjZXNzYXJ5IGZvciBjb3JyZWN0bmVzcy4KKyAgICBib29sIGlzQXJ0aWZpY2lhbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRLaW5kKCkgPT0gT3JkZXIgJiYgQ29udGVudHMuT3JkZXIuaXNBcnRpZmljaWFsOworICAgIH0KKworICAgIC8vLyBpc0Fzc2lnbmVkUmVnRGVwIC0gVGVzdCBpZiB0aGlzIGlzIGEgRGF0YSBkZXBlbmRlbmNlIHRoYXQgaXMKKyAgICAvLy8gYXNzb2NpYXRlZCB3aXRoIGEgcmVnaXN0ZXIuCisgICAgYm9vbCBpc0Fzc2lnbmVkUmVnRGVwKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBEYXRhICYmIENvbnRlbnRzLlJlZyAhPSAwOworICAgIH0KKworICAgIC8vLyBnZXRSZWcgLSBSZXR1cm4gdGhlIHJlZ2lzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkZ2UuIFRoaXMgaXMKKyAgICAvLy8gb25seSB2YWxpZCBvbiBEYXRhLCBBbnRpLCBhbmQgT3V0cHV0IGVkZ2VzLiBPbiBEYXRhIGVkZ2VzLCB0aGlzCisgICAgLy8vIHZhbHVlIG1heSBiZSB6ZXJvLCBtZWFuaW5nIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgcmVnaXN0ZXIuCisgICAgdW5zaWduZWQgZ2V0UmVnKCkgY29uc3QgeworICAgICAgYXNzZXJ0KChnZXRLaW5kKCkgPT0gRGF0YSB8fCBnZXRLaW5kKCkgPT0gQW50aSB8fCBnZXRLaW5kKCkgPT0gT3V0cHV0KSAmJgorICAgICAgICAgICAgICJnZXRSZWcgY2FsbGVkIG9uIG5vbi1yZWdpc3RlciBkZXBlbmRlbmNlIGVkZ2UhIik7CisgICAgICByZXR1cm4gQ29udGVudHMuUmVnOworICAgIH0KKworICAgIC8vLyBzZXRSZWcgLSBBc3NpZ24gdGhlIGFzc29jaWF0ZWQgcmVnaXN0ZXIgZm9yIHRoaXMgZWRnZS4gVGhpcyBpcworICAgIC8vLyBvbmx5IHZhbGlkIG9uIERhdGEsIEFudGksIGFuZCBPdXRwdXQgZWRnZXMuIE9uIEFudGkgYW5kIE91dHB1dAorICAgIC8vLyBlZGdlcywgdGhpcyB2YWx1ZSBtdXN0IG5vdCBiZSB6ZXJvLiBPbiBEYXRhIGVkZ2VzLCB0aGUgdmFsdWUgbWF5CisgICAgLy8vIGJlIHplcm8sIHdoaWNoIHdvdWxkIG1lYW4gdGhhdCBubyBzcGVjaWZpYyByZWdpc3RlciBpcyBhc3NvY2lhdGVkCisgICAgLy8vIHdpdGggdGhpcyBlZGdlLgorICAgIHZvaWQgc2V0UmVnKHVuc2lnbmVkIFJlZykgeworICAgICAgYXNzZXJ0KChnZXRLaW5kKCkgPT0gRGF0YSB8fCBnZXRLaW5kKCkgPT0gQW50aSB8fCBnZXRLaW5kKCkgPT0gT3V0cHV0KSAmJgorICAgICAgICAgICAgICJzZXRSZWcgY2FsbGVkIG9uIG5vbi1yZWdpc3RlciBkZXBlbmRlbmNlIGVkZ2UhIik7CisgICAgICBhc3NlcnQoKGdldEtpbmQoKSAhPSBBbnRpIHx8IFJlZyAhPSAwKSAmJgorICAgICAgICAgICAgICJTRGVwOjpBbnRpIGVkZ2UgY2Fubm90IHVzZSB0aGUgemVybyByZWdpc3RlciEiKTsKKyAgICAgIGFzc2VydCgoZ2V0S2luZCgpICE9IE91dHB1dCB8fCBSZWcgIT0gMCkgJiYKKyAgICAgICAgICAgICAiU0RlcDo6T3V0cHV0IGVkZ2UgY2Fubm90IHVzZSB0aGUgemVybyByZWdpc3RlciEiKTsKKyAgICAgIENvbnRlbnRzLlJlZyA9IFJlZzsKKyAgICB9CisgIH07CisKKyAgLy8vIFNVbml0IC0gU2NoZWR1bGluZyB1bml0LiBUaGlzIGlzIGEgbm9kZSBpbiB0aGUgc2NoZWR1bGluZyBEQUcuCisgIGNsYXNzIFNVbml0IHsKKyAgcHJpdmF0ZToKKyAgICBTRE5vZGUgKk5vZGU7ICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRhdGl2ZSBub2RlLgorICAgIE1hY2hpbmVJbnN0ciAqSW5zdHI7ICAgICAgICAgICAgICAgIC8vIEFsdGVybmF0aXZlbHksIGEgTWFjaGluZUluc3RyLgorICBwdWJsaWM6CisgICAgU1VuaXQgKk9yaWdOb2RlOyAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90IHRoaXMsIHRoZSBub2RlIGZyb20gd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG5vZGUgd2FzIGNsb25lZC4KKyAgICAKKyAgICAvLyBQcmVkcy9TdWNjcyAtIFRoZSBTVW5pdHMgYmVmb3JlL2FmdGVyIHVzIGluIHRoZSBncmFwaC4gIFRoZSBib29sZWFuIHZhbHVlCisgICAgLy8gaXMgdHJ1ZSBpZiB0aGUgZWRnZSBpcyBhIHRva2VuIGNoYWluIGVkZ2UsIGZhbHNlIGlmIGl0IGlzIGEgdmFsdWUgZWRnZS4gCisgICAgU21hbGxWZWN0b3I8U0RlcCwgND4gUHJlZHM7ICAvLyBBbGwgc3VuaXQgcHJlZGVjZXNzb3JzLgorICAgIFNtYWxsVmVjdG9yPFNEZXAsIDQ+IFN1Y2NzOyAgLy8gQWxsIHN1bml0IHN1Y2Nlc3NvcnMuCisKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9yPFNEZXAsIDQ+OjppdGVyYXRvciBwcmVkX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgU21hbGxWZWN0b3I8U0RlcCwgND46Oml0ZXJhdG9yIHN1Y2NfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBTbWFsbFZlY3RvcjxTRGVwLCA0Pjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfcHJlZF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9yPFNEZXAsIDQ+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9zdWNjX2l0ZXJhdG9yOworCisgICAgdW5zaWduZWQgTm9kZU51bTsgICAgICAgICAgICAgICAgICAgLy8gRW50cnkgIyBvZiBub2RlIGluIHRoZSBub2RlIHZlY3Rvci4KKyAgICB1bnNpZ25lZCBOb2RlUXVldWVJZDsgICAgICAgICAgICAgICAvLyBRdWV1ZSBpZCBvZiBub2RlLgorICAgIHVuc2lnbmVkIHNob3J0IExhdGVuY3k7ICAgICAgICAgICAgIC8vIE5vZGUgbGF0ZW5jeS4KKyAgICB1bnNpZ25lZCBOdW1QcmVkczsgICAgICAgICAgICAgICAgICAvLyAjIG9mIFNEZXA6OkRhdGEgcHJlZHMuCisgICAgdW5zaWduZWQgTnVtU3VjY3M7ICAgICAgICAgICAgICAgICAgLy8gIyBvZiBTRGVwOjpEYXRhIHN1Y3NzLgorICAgIHVuc2lnbmVkIE51bVByZWRzTGVmdDsgICAgICAgICAgICAgIC8vICMgb2YgcHJlZHMgbm90IHNjaGVkdWxlZC4KKyAgICB1bnNpZ25lZCBOdW1TdWNjc0xlZnQ7ICAgICAgICAgICAgICAvLyAjIG9mIHN1Y2NzIG5vdCBzY2hlZHVsZWQuCisgICAgYm9vbCBpc1R3b0FkZHJlc3MgICAgIDogMTsgICAgICAgICAgLy8gSXMgYSB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbi4KKyAgICBib29sIGlzQ29tbXV0YWJsZSAgICAgOiAxOyAgICAgICAgICAvLyBJcyBhIGNvbW11dGFibGUgaW5zdHJ1Y3Rpb24uCisgICAgYm9vbCBoYXNQaHlzUmVnRGVmcyAgIDogMTsgICAgICAgICAgLy8gSGFzIHBoeXNyZWcgZGVmcyB0aGF0IGFyZSBiZWluZyB1c2VkLgorICAgIGJvb2wgaGFzUGh5c1JlZ0Nsb2JiZXJzIDogMTsgICAgICAgIC8vIEhhcyBhbnkgcGh5c3JlZyBkZWZzLCB1c2VkIG9yIG5vdC4KKyAgICBib29sIGlzUGVuZGluZyAgICAgICAgOiAxOyAgICAgICAgICAvLyBUcnVlIG9uY2UgcGVuZGluZy4KKyAgICBib29sIGlzQXZhaWxhYmxlICAgICAgOiAxOyAgICAgICAgICAvLyBUcnVlIG9uY2UgYXZhaWxhYmxlLgorICAgIGJvb2wgaXNTY2hlZHVsZWQgICAgICA6IDE7ICAgICAgICAgIC8vIFRydWUgb25jZSBzY2hlZHVsZWQuCisgICAgYm9vbCBpc1NjaGVkdWxlSGlnaCAgIDogMTsgICAgICAgICAgLy8gVHJ1ZSBpZiBwcmVmZXJhYmxlIHRvIHNjaGVkdWxlIGhpZ2guCisgICAgYm9vbCBpc0Nsb25lZCAgICAgICAgIDogMTsgICAgICAgICAgLy8gVHJ1ZSBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gY2xvbmVkLgorICAgIFNjaGVkOjpQcmVmZXJlbmNlIFNjaGVkdWxpbmdQcmVmOyAgIC8vIFNjaGVkdWxpbmcgcHJlZmVyZW5jZS4KKworICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDQ+IERiZ0luc3RyTGlzdDsgLy8gZGJnX3ZhbHVlcyByZWZlcmVuY2luZyB0aGlzLgorICBwcml2YXRlOgorICAgIGJvb2wgaXNEZXB0aEN1cnJlbnQgICA6IDE7ICAgICAgICAgIC8vIFRydWUgaWYgRGVwdGggaXMgY3VycmVudC4KKyAgICBib29sIGlzSGVpZ2h0Q3VycmVudCAgOiAxOyAgICAgICAgICAvLyBUcnVlIGlmIEhlaWdodCBpcyBjdXJyZW50LgorICAgIHVuc2lnbmVkIERlcHRoOyAgICAgICAgICAgICAgICAgICAgIC8vIE5vZGUgZGVwdGguCisgICAgdW5zaWduZWQgSGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgLy8gTm9kZSBoZWlnaHQuCisgIHB1YmxpYzoKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpDb3B5RHN0UkM7IC8vIElzIGEgc3BlY2lhbCBjb3B5IG5vZGUgaWYgbm90IG51bGwuCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQ29weVNyY1JDOworICAgIAorICAgIC8vLyBTVW5pdCAtIENvbnN0cnVjdCBhbiBTVW5pdCBmb3IgcHJlLXJlZ2FsbG9jIHNjaGVkdWxpbmcgdG8gcmVwcmVzZW50CisgICAgLy8vIGFuIFNETm9kZSBhbmQgYW55IG5vZGVzIGZsYWdnZWQgdG8gaXQuCisgICAgU1VuaXQoU0ROb2RlICpub2RlLCB1bnNpZ25lZCBub2RlbnVtKQorICAgICAgOiBOb2RlKG5vZGUpLCBJbnN0cigwKSwgT3JpZ05vZGUoMCksIE5vZGVOdW0obm9kZW51bSksCisgICAgICAgIE5vZGVRdWV1ZUlkKDApLCAgTGF0ZW5jeSgwKSwgTnVtUHJlZHMoMCksIE51bVN1Y2NzKDApLCBOdW1QcmVkc0xlZnQoMCksCisgICAgICAgIE51bVN1Y2NzTGVmdCgwKSwgaXNUd29BZGRyZXNzKGZhbHNlKSwgaXNDb21tdXRhYmxlKGZhbHNlKSwKKyAgICAgICAgaGFzUGh5c1JlZ0RlZnMoZmFsc2UpLCBoYXNQaHlzUmVnQ2xvYmJlcnMoZmFsc2UpLAorICAgICAgICBpc1BlbmRpbmcoZmFsc2UpLCBpc0F2YWlsYWJsZShmYWxzZSksIGlzU2NoZWR1bGVkKGZhbHNlKSwKKyAgICAgICAgaXNTY2hlZHVsZUhpZ2goZmFsc2UpLCBpc0Nsb25lZChmYWxzZSksCisgICAgICAgIFNjaGVkdWxpbmdQcmVmKFNjaGVkOjpOb25lKSwKKyAgICAgICAgaXNEZXB0aEN1cnJlbnQoZmFsc2UpLCBpc0hlaWdodEN1cnJlbnQoZmFsc2UpLCBEZXB0aCgwKSwgSGVpZ2h0KDApLAorICAgICAgICBDb3B5RHN0UkMoTlVMTCksIENvcHlTcmNSQyhOVUxMKSB7fQorCisgICAgLy8vIFNVbml0IC0gQ29uc3RydWN0IGFuIFNVbml0IGZvciBwb3N0LXJlZ2FsbG9jIHNjaGVkdWxpbmcgdG8gcmVwcmVzZW50CisgICAgLy8vIGEgTWFjaGluZUluc3RyLgorICAgIFNVbml0KE1hY2hpbmVJbnN0ciAqaW5zdHIsIHVuc2lnbmVkIG5vZGVudW0pCisgICAgICA6IE5vZGUoMCksIEluc3RyKGluc3RyKSwgT3JpZ05vZGUoMCksIE5vZGVOdW0obm9kZW51bSksCisgICAgICAgIE5vZGVRdWV1ZUlkKDApLCBMYXRlbmN5KDApLCBOdW1QcmVkcygwKSwgTnVtU3VjY3MoMCksIE51bVByZWRzTGVmdCgwKSwKKyAgICAgICAgTnVtU3VjY3NMZWZ0KDApLCBpc1R3b0FkZHJlc3MoZmFsc2UpLCBpc0NvbW11dGFibGUoZmFsc2UpLAorICAgICAgICBoYXNQaHlzUmVnRGVmcyhmYWxzZSksIGhhc1BoeXNSZWdDbG9iYmVycyhmYWxzZSksCisgICAgICAgIGlzUGVuZGluZyhmYWxzZSksIGlzQXZhaWxhYmxlKGZhbHNlKSwgaXNTY2hlZHVsZWQoZmFsc2UpLAorICAgICAgICBpc1NjaGVkdWxlSGlnaChmYWxzZSksIGlzQ2xvbmVkKGZhbHNlKSwKKyAgICAgICAgU2NoZWR1bGluZ1ByZWYoU2NoZWQ6Ok5vbmUpLAorICAgICAgICBpc0RlcHRoQ3VycmVudChmYWxzZSksIGlzSGVpZ2h0Q3VycmVudChmYWxzZSksIERlcHRoKDApLCBIZWlnaHQoMCksCisgICAgICAgIENvcHlEc3RSQyhOVUxMKSwgQ29weVNyY1JDKE5VTEwpIHt9CisKKyAgICAvLy8gU1VuaXQgLSBDb25zdHJ1Y3QgYSBwbGFjZWhvbGRlciBTVW5pdC4KKyAgICBTVW5pdCgpCisgICAgICA6IE5vZGUoMCksIEluc3RyKDApLCBPcmlnTm9kZSgwKSwgTm9kZU51bSh+MHUpLAorICAgICAgICBOb2RlUXVldWVJZCgwKSwgTGF0ZW5jeSgwKSwgTnVtUHJlZHMoMCksIE51bVN1Y2NzKDApLCBOdW1QcmVkc0xlZnQoMCksCisgICAgICAgIE51bVN1Y2NzTGVmdCgwKSwgaXNUd29BZGRyZXNzKGZhbHNlKSwgaXNDb21tdXRhYmxlKGZhbHNlKSwKKyAgICAgICAgaGFzUGh5c1JlZ0RlZnMoZmFsc2UpLCBoYXNQaHlzUmVnQ2xvYmJlcnMoZmFsc2UpLAorICAgICAgICBpc1BlbmRpbmcoZmFsc2UpLCBpc0F2YWlsYWJsZShmYWxzZSksIGlzU2NoZWR1bGVkKGZhbHNlKSwKKyAgICAgICAgaXNTY2hlZHVsZUhpZ2goZmFsc2UpLCBpc0Nsb25lZChmYWxzZSksCisgICAgICAgIFNjaGVkdWxpbmdQcmVmKFNjaGVkOjpOb25lKSwKKyAgICAgICAgaXNEZXB0aEN1cnJlbnQoZmFsc2UpLCBpc0hlaWdodEN1cnJlbnQoZmFsc2UpLCBEZXB0aCgwKSwgSGVpZ2h0KDApLAorICAgICAgICBDb3B5RHN0UkMoTlVMTCksIENvcHlTcmNSQyhOVUxMKSB7fQorCisgICAgLy8vIHNldE5vZGUgLSBBc3NpZ24gdGhlIHJlcHJlc2VudGF0aXZlIFNETm9kZSBmb3IgdGhpcyBTVW5pdC4KKyAgICAvLy8gVGhpcyBtYXkgYmUgdXNlZCBkdXJpbmcgcHJlLXJlZ2FsbG9jIHNjaGVkdWxpbmcuCisgICAgdm9pZCBzZXROb2RlKFNETm9kZSAqTikgeworICAgICAgYXNzZXJ0KCFJbnN0ciAmJiAiU2V0dGluZyBTRE5vZGUgb2YgU1VuaXQgd2l0aCBNYWNoaW5lSW5zdHIhIik7CisgICAgICBOb2RlID0gTjsKKyAgICB9CisKKyAgICAvLy8gZ2V0Tm9kZSAtIFJldHVybiB0aGUgcmVwcmVzZW50YXRpdmUgU0ROb2RlIGZvciB0aGlzIFNVbml0LgorICAgIC8vLyBUaGlzIG1heSBiZSB1c2VkIGR1cmluZyBwcmUtcmVnYWxsb2Mgc2NoZWR1bGluZy4KKyAgICBTRE5vZGUgKmdldE5vZGUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIUluc3RyICYmICJSZWFkaW5nIFNETm9kZSBvZiBTVW5pdCB3aXRoIE1hY2hpbmVJbnN0ciEiKTsKKyAgICAgIHJldHVybiBOb2RlOworICAgIH0KKworICAgIC8vLyBzZXRJbnN0ciAtIEFzc2lnbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBTVW5pdC4KKyAgICAvLy8gVGhpcyBtYXkgYmUgdXNlZCBkdXJpbmcgcG9zdC1yZWdhbGxvYyBzY2hlZHVsaW5nLgorICAgIHZvaWQgc2V0SW5zdHIoTWFjaGluZUluc3RyICpNSSkgeworICAgICAgYXNzZXJ0KCFOb2RlICYmICJTZXR0aW5nIE1hY2hpbmVJbnN0ciBvZiBTVW5pdCB3aXRoIFNETm9kZSEiKTsKKyAgICAgIEluc3RyID0gTUk7CisgICAgfQorCisgICAgLy8vIGdldEluc3RyIC0gUmV0dXJuIHRoZSByZXByZXNlbnRhdGl2ZSBNYWNoaW5lSW5zdHIgZm9yIHRoaXMgU1VuaXQuCisgICAgLy8vIFRoaXMgbWF5IGJlIHVzZWQgZHVyaW5nIHBvc3QtcmVnYWxsb2Mgc2NoZWR1bGluZy4KKyAgICBNYWNoaW5lSW5zdHIgKmdldEluc3RyKCkgY29uc3QgeworICAgICAgYXNzZXJ0KCFOb2RlICYmICJSZWFkaW5nIE1hY2hpbmVJbnN0ciBvZiBTVW5pdCB3aXRoIFNETm9kZSEiKTsKKyAgICAgIHJldHVybiBJbnN0cjsKKyAgICB9CisKKyAgICAvLy8gYWRkUHJlZCAtIFRoaXMgYWRkcyB0aGUgc3BlY2lmaWVkIGVkZ2UgYXMgYSBwcmVkIG9mIHRoZSBjdXJyZW50IG5vZGUgaWYKKyAgICAvLy8gbm90IGFscmVhZHkuICBJdCBhbHNvIGFkZHMgdGhlIGN1cnJlbnQgbm9kZSBhcyBhIHN1Y2Nlc3NvciBvZiB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIG5vZGUuCisgICAgdm9pZCBhZGRQcmVkKGNvbnN0IFNEZXAgJkQpOworCisgICAgLy8vIHJlbW92ZVByZWQgLSBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBlZGdlIGFzIGEgcHJlZCBvZiB0aGUgY3VycmVudAorICAgIC8vLyBub2RlIGlmIGl0IGV4aXN0cy4gIEl0IGFsc28gcmVtb3ZlcyB0aGUgY3VycmVudCBub2RlIGFzIGEgc3VjY2Vzc29yIG9mCisgICAgLy8vIHRoZSBzcGVjaWZpZWQgbm9kZS4KKyAgICB2b2lkIHJlbW92ZVByZWQoY29uc3QgU0RlcCAmRCk7CisKKyAgICAvLy8gZ2V0RGVwdGggLSBSZXR1cm4gdGhlIGRlcHRoIG9mIHRoaXMgbm9kZSwgd2hpY2ggaXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAgICAvLy8gbWF4aW11bSBwYXRoIHVwIHRvIGFueSBub2RlIHdpdGggaGFzIG5vIHByZWRlY2Vzc29ycy4KKyAgICB1bnNpZ25lZCBnZXREZXB0aCgpIGNvbnN0IHsKKyAgICAgIGlmICghaXNEZXB0aEN1cnJlbnQpIAorICAgICAgICBjb25zdF9jYXN0PFNVbml0ICo+KHRoaXMpLT5Db21wdXRlRGVwdGgoKTsKKyAgICAgIHJldHVybiBEZXB0aDsKKyAgICB9CisKKyAgICAvLy8gZ2V0SGVpZ2h0IC0gUmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhpcyBub2RlLCB3aGljaCBpcyB0aGUgbGVuZ3RoIG9mIHRoZQorICAgIC8vLyBtYXhpbXVtIHBhdGggZG93biB0byBhbnkgbm9kZSB3aXRoIGhhcyBubyBzdWNjZXNzb3JzLgorICAgIHVuc2lnbmVkIGdldEhlaWdodCgpIGNvbnN0IHsKKyAgICAgIGlmICghaXNIZWlnaHRDdXJyZW50KSAKKyAgICAgICAgY29uc3RfY2FzdDxTVW5pdCAqPih0aGlzKS0+Q29tcHV0ZUhlaWdodCgpOworICAgICAgcmV0dXJuIEhlaWdodDsKKyAgICB9CisKKyAgICAvLy8gc2V0RGVwdGhUb0F0TGVhc3QgLSBJZiBOZXdEZXB0aCBpcyBncmVhdGVyIHRoYW4gdGhpcyBub2RlJ3MKKyAgICAvLy8gZGVwdGggdmFsdWUsIHNldCBpdCB0byBiZSB0aGUgbmV3IGRlcHRoIHZhbHVlLiBUaGlzIGFsc28KKyAgICAvLy8gcmVjdXJzaXZlbHkgbWFya3Mgc3VjY2Vzc29yIG5vZGVzIGRpcnR5LgorICAgIHZvaWQgc2V0RGVwdGhUb0F0TGVhc3QodW5zaWduZWQgTmV3RGVwdGgpOworCisgICAgLy8vIHNldERlcHRoVG9BdExlYXN0IC0gSWYgTmV3RGVwdGggaXMgZ3JlYXRlciB0aGFuIHRoaXMgbm9kZSdzCisgICAgLy8vIGRlcHRoIHZhbHVlLCBzZXQgaXQgdG8gYmUgdGhlIG5ldyBoZWlnaHQgdmFsdWUuIFRoaXMgYWxzbworICAgIC8vLyByZWN1cnNpdmVseSBtYXJrcyBwcmVkZWNlc3NvciBub2RlcyBkaXJ0eS4KKyAgICB2b2lkIHNldEhlaWdodFRvQXRMZWFzdCh1bnNpZ25lZCBOZXdIZWlnaHQpOworCisgICAgLy8vIHNldERlcHRoRGlydHkgLSBTZXQgYSBmbGFnIGluIHRoaXMgbm9kZSB0byBpbmRpY2F0ZSB0aGF0IGl0cworICAgIC8vLyBzdG9yZWQgRGVwdGggdmFsdWUgd2lsbCByZXF1aXJlIHJlY29tcHV0YXRpb24gdGhlIG5leHQgdGltZQorICAgIC8vLyBnZXREZXB0aCgpIGlzIGNhbGxlZC4KKyAgICB2b2lkIHNldERlcHRoRGlydHkoKTsKKworICAgIC8vLyBzZXRIZWlnaHREaXJ0eSAtIFNldCBhIGZsYWcgaW4gdGhpcyBub2RlIHRvIGluZGljYXRlIHRoYXQgaXRzCisgICAgLy8vIHN0b3JlZCBIZWlnaHQgdmFsdWUgd2lsbCByZXF1aXJlIHJlY29tcHV0YXRpb24gdGhlIG5leHQgdGltZQorICAgIC8vLyBnZXRIZWlnaHQoKSBpcyBjYWxsZWQuCisgICAgdm9pZCBzZXRIZWlnaHREaXJ0eSgpOworCisgICAgLy8vIGlzUHJlZCAtIFRlc3QgaWYgbm9kZSBOIGlzIGEgcHJlZGVjZXNzb3Igb2YgdGhpcyBub2RlLgorICAgIGJvb2wgaXNQcmVkKFNVbml0ICpOKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gKHVuc2lnbmVkKVByZWRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChQcmVkc1tpXS5nZXRTVW5pdCgpID09IE4pCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8vLyBpc1N1Y2MgLSBUZXN0IGlmIG5vZGUgTiBpcyBhIHN1Y2Nlc3NvciBvZiB0aGlzIG5vZGUuCisgICAgYm9vbCBpc1N1Y2MoU1VuaXQgKk4pIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSAodW5zaWduZWQpU3VjY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKFN1Y2NzW2ldLmdldFNVbml0KCkgPT0gTikKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoY29uc3QgU2NoZWR1bGVEQUcgKkcpIGNvbnN0OworICAgIHZvaWQgZHVtcEFsbChjb25zdCBTY2hlZHVsZURBRyAqRykgY29uc3Q7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTywgY29uc3QgU2NoZWR1bGVEQUcgKkcpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgdm9pZCBDb21wdXRlRGVwdGgoKTsKKyAgICB2b2lkIENvbXB1dGVIZWlnaHQoKTsKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNjaGVkdWxpbmdQcmlvcml0eVF1ZXVlIC0gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBwbHVnIGRpZmZlcmVudAorICAvLy8gcHJpb3JpdGllcyBjb21wdXRhdGlvbiBhbGdvcml0aG1zIGludG8gdGhlIGxpc3Qgc2NoZWR1bGVyLiBJdCBpbXBsZW1lbnRzCisgIC8vLyB0aGUgaW50ZXJmYWNlIG9mIGEgc3RhbmRhcmQgcHJpb3JpdHkgcXVldWUsIHdoZXJlIG5vZGVzIGFyZSBpbnNlcnRlZCBpbiAKKyAgLy8vIGFyYml0cmFyeSBvcmRlciBhbmQgcmV0dXJuZWQgaW4gcHJpb3JpdHkgb3JkZXIuICBUaGUgY29tcHV0YXRpb24gb2YgdGhlCisgIC8vLyBwcmlvcml0eSBhbmQgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWV1ZSBhcmUgdG90YWxseSB1cCB0byB0aGUKKyAgLy8vIGltcGxlbWVudGF0aW9uIHRvIGRlY2lkZS4KKyAgLy8vIAorICBjbGFzcyBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSB7CisgICAgdW5zaWduZWQgQ3VyQ3ljbGU7CisgIHB1YmxpYzoKKyAgICBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSgpIDogQ3VyQ3ljbGUoMCkge30KKyAgICB2aXJ0dWFsIH5TY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSgpIHt9CisgIAorICAgIHZpcnR1YWwgdm9pZCBpbml0Tm9kZXMoc3RkOjp2ZWN0b3I8U1VuaXQ+ICZTVW5pdHMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkTm9kZShjb25zdCBTVW5pdCAqU1UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTm9kZShjb25zdCBTVW5pdCAqU1UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVN0YXRlKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGVtcHR5KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBwdXNoKFNVbml0ICpVKSA9IDA7CisgIAorICAgIHZvaWQgcHVzaF9hbGwoY29uc3Qgc3RkOjp2ZWN0b3I8U1VuaXQgKj4gJk5vZGVzKSB7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPFNVbml0ICo+Ojpjb25zdF9pdGVyYXRvciBJID0gTm9kZXMuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE5vZGVzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgcHVzaCgqSSk7CisgICAgfQorCisgICAgdmlydHVhbCBTVW5pdCAqcG9wKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZShTVW5pdCAqU1UpID0gMDsKKworICAgIC8vLyBTY2hlZHVsZWROb2RlIC0gQXMgZWFjaCBub2RlIGlzIHNjaGVkdWxlZCwgdGhpcyBtZXRob2QgaXMgaW52b2tlZC4gIFRoaXMKKyAgICAvLy8gYWxsb3dzIHRoZSBwcmlvcml0eSBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIHByaW9yaXR5IG9mIHJlbGF0ZWQKKyAgICAvLy8gdW5zY2hlZHVsZWQgbm9kZXMsIGZvciBleGFtcGxlLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBTY2hlZHVsZWROb2RlKFNVbml0ICopIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgVW5zY2hlZHVsZWROb2RlKFNVbml0ICopIHt9CisKKyAgICB2b2lkIHNldEN1ckN5Y2xlKHVuc2lnbmVkIEN5Y2xlKSB7CisgICAgICBDdXJDeWNsZSA9IEN5Y2xlOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldEN1ckN5Y2xlKCkgY29uc3QgeworICAgICAgcmV0dXJuIEN1ckN5Y2xlOworICAgIH0gICAgCisgIH07CisKKyAgY2xhc3MgU2NoZWR1bGVEQUcgeworICBwdWJsaWM6CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCOyAgICAgICAgICAvLyBUaGUgYmxvY2sgaW4gd2hpY2ggdG8gaW5zZXJ0IGluc3RydWN0aW9ucworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQb3M7Ly8gVGhlIHBvc2l0aW9uIHRvIGluc2VydCBpbnN0cnVjdGlvbnMKKyAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsgICAgICAgICAgICAgIC8vIFRhcmdldCBwcm9jZXNzb3IKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsgICAgICAgICAgIC8vIFRhcmdldCBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbgorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOyAgICAgICAgLy8gVGFyZ2V0IHByb2Nlc3NvciByZWdpc3RlciBpbmZvCisgICAgTWFjaGluZUZ1bmN0aW9uICZNRjsgICAgICAgICAgICAgICAgICAvLyBNYWNoaW5lIGZ1bmN0aW9uCisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJOyAgICAgICAgICAgICAvLyBWaXJ0dWFsL3JlYWwgcmVnaXN0ZXIgbWFwCisgICAgc3RkOjp2ZWN0b3I8U1VuaXQqPiBTZXF1ZW5jZTsgICAgICAgICAvLyBUaGUgc2NoZWR1bGUuIE51bGwgU1VuaXQqJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudCBub29wIGluc3RydWN0aW9ucy4KKyAgICBzdGQ6OnZlY3RvcjxTVW5pdD4gU1VuaXRzOyAgICAgICAgICAgIC8vIFRoZSBzY2hlZHVsaW5nIHVuaXRzLgorICAgIFNVbml0IEVudHJ5U1U7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBub2RlIGZvciB0aGUgcmVnaW9uIGVudHJ5LgorICAgIFNVbml0IEV4aXRTVTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBub2RlIGZvciB0aGUgcmVnaW9uIGV4aXQuCisKKyAgICBleHBsaWNpdCBTY2hlZHVsZURBRyhNYWNoaW5lRnVuY3Rpb24gJm1mKTsKKworICAgIHZpcnR1YWwgflNjaGVkdWxlREFHKCk7CisKKyAgICAvLy8gdmlld0dyYXBoIC0gUG9wIHVwIGEgR3JhcGhWaXovZ3Ygd2luZG93IHdpdGggdGhlIFNjaGVkdWxlREFHIHJlbmRlcmVkCisgICAgLy8vIHVzaW5nICdkb3QnLgorICAgIC8vLworICAgIHZvaWQgdmlld0dyYXBoKCk7CisgIAorICAgIC8vLyBFbWl0U2NoZWR1bGUgLSBJbnNlcnQgTWFjaGluZUluc3RycyBpbnRvIHRoZSBNYWNoaW5lQmFzaWNCbG9jaworICAgIC8vLyBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIHNwZWNpZmllZCBpbiBTZXF1ZW5jZS4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIE1hY2hpbmVCYXNpY0Jsb2NrICpFbWl0U2NoZWR1bGUoKSA9IDA7CisKKyAgICB2b2lkIGR1bXBTY2hlZHVsZSgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGR1bXBOb2RlKGNvbnN0IFNVbml0ICpTVSkgY29uc3QgPSAwOworCisgICAgLy8vIGdldEdyYXBoTm9kZUxhYmVsIC0gUmV0dXJuIGEgbGFiZWwgZm9yIGFuIFNVbml0IG5vZGUgaW4gYSB2aXN1YWxpemF0aW9uCisgICAgLy8vIG9mIHRoZSBTY2hlZHVsZURBRy4KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEdyYXBoTm9kZUxhYmVsKGNvbnN0IFNVbml0ICpTVSkgY29uc3QgPSAwOworCisgICAgLy8vIGFkZEN1c3RvbUdyYXBoRmVhdHVyZXMgLSBBZGQgY3VzdG9tIGZlYXR1cmVzIGZvciBhIHZpc3VhbGl6YXRpb24gb2YKKyAgICAvLy8gdGhlIFNjaGVkdWxlREFHLgorICAgIHZpcnR1YWwgdm9pZCBhZGRDdXN0b21HcmFwaEZlYXR1cmVzKEdyYXBoV3JpdGVyPFNjaGVkdWxlREFHKj4gJikgY29uc3Qge30KKworI2lmbmRlZiBOREVCVUcKKyAgICAvLy8gVmVyaWZ5U2NoZWR1bGUgLSBWZXJpZnkgdGhhdCBhbGwgU1VuaXRzIHdlcmUgc2NoZWR1bGVkIGFuZCB0aGF0CisgICAgLy8vIHRoZWlyIHN0YXRlIGlzIGNvbnNpc3RlbnQuCisgICAgdm9pZCBWZXJpZnlTY2hlZHVsZShib29sIGlzQm90dG9tVXApOworI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBSdW4gLSBwZXJmb3JtIHNjaGVkdWxpbmcuCisgICAgLy8vCisgICAgdm9pZCBSdW4oTWFjaGluZUJhc2ljQmxvY2sgKmJiLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgaW5zZXJ0UG9zKTsKKworICAgIC8vLyBCdWlsZFNjaGVkR3JhcGggLSBCdWlsZCBTVW5pdHMgYW5kIHNldCB1cCB0aGVpciBQcmVkcyBhbmQgU3VjY3MKKyAgICAvLy8gdG8gZm9ybSB0aGUgc2NoZWR1bGluZyBkZXBlbmRlbmN5IGdyYXBoLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBCdWlsZFNjaGVkR3JhcGgoQWxpYXNBbmFseXNpcyAqQUEpID0gMDsKKworICAgIC8vLyBDb21wdXRlTGF0ZW5jeSAtIENvbXB1dGUgbm9kZSBsYXRlbmN5LgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBDb21wdXRlTGF0ZW5jeShTVW5pdCAqU1UpID0gMDsKKworICAgIC8vLyBDb21wdXRlT3BlcmFuZExhdGVuY3kgLSBPdmVycmlkZSBkZXBlbmRlbmNlIGVkZ2UgbGF0ZW5jeSB1c2luZworICAgIC8vLyBvcGVyYW5kIHVzZS9kZWYgaW5mb3JtYXRpb24KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgQ29tcHV0ZU9wZXJhbmRMYXRlbmN5KFNVbml0ICosIFNVbml0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRGVwJikgY29uc3QgeyB9CisKKyAgICAvLy8gU2NoZWR1bGUgLSBPcmRlciBub2RlcyBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgc3R5bGUsIGZpbGxpbmcKKyAgICAvLy8gaW4gdGhlIFNlcXVlbmNlIG1lbWJlci4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgU2NoZWR1bGUoKSA9IDA7CisKKyAgICAvLy8gRm9yY2VVbml0TGF0ZW5jaWVzIC0gUmV0dXJuIHRydWUgaWYgYWxsIHNjaGVkdWxpbmcgZWRnZXMgc2hvdWxkIGJlIGdpdmVuCisgICAgLy8vIGEgbGF0ZW5jeSB2YWx1ZSBvZiBvbmUuICBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gZmFsc2U7IHNjaGVkdWxlcnMgbWF5CisgICAgLy8vIG92ZXJyaWRlIHRoaXMgYXMgbmVlZGVkLgorICAgIHZpcnR1YWwgYm9vbCBGb3JjZVVuaXRMYXRlbmNpZXMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLy8vIEVtaXROb29wIC0gRW1pdCBhIG5vb3AgaW5zdHJ1Y3Rpb24uCisgICAgLy8vCisgICAgdm9pZCBFbWl0Tm9vcCgpOworCisgICAgdm9pZCBFbWl0UGh5c1JlZ0NvcHkoU1VuaXQgKlNVLCBEZW5zZU1hcDxTVW5pdCosIHVuc2lnbmVkPiAmVlJCYXNlTWFwKTsKKyAgfTsKKworICBjbGFzcyBTVW5pdEl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVbml0LCBwdHJkaWZmX3Q+IHsKKyAgICBTVW5pdCAqTm9kZTsKKyAgICB1bnNpZ25lZCBPcGVyYW5kOworCisgICAgU1VuaXRJdGVyYXRvcihTVW5pdCAqTiwgdW5zaWduZWQgT3ApIDogTm9kZShOKSwgT3BlcmFuZChPcCkge30KKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTVW5pdEl0ZXJhdG9yJiB4KSBjb25zdCB7CisgICAgICByZXR1cm4gT3BlcmFuZCA9PSB4Lk9wZXJhbmQ7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTVW5pdEl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgICAgY29uc3QgU1VuaXRJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IFNVbml0SXRlcmF0b3IgJkkpIHsKKyAgICAgIGFzc2VydChJLk5vZGU9PU5vZGUgJiYgIkNhbm5vdCBhc3NpZ24gaXRlcmF0b3JzIHRvIHR3byBkaWZmZXJlbnQgbm9kZXMhIik7CisgICAgICBPcGVyYW5kID0gSS5PcGVyYW5kOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgcmV0dXJuIE5vZGUtPlByZWRzW09wZXJhbmRdLmdldFNVbml0KCk7CisgICAgfQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisKKyAgICBTVW5pdEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgICAgICAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICAgICsrT3BlcmFuZDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgU1VuaXRJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgICBTVW5pdEl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICAgIH0KKworICAgIHN0YXRpYyBTVW5pdEl0ZXJhdG9yIGJlZ2luKFNVbml0ICpOKSB7IHJldHVybiBTVW5pdEl0ZXJhdG9yKE4sIDApOyB9CisgICAgc3RhdGljIFNVbml0SXRlcmF0b3IgZW5kICAoU1VuaXQgKk4pIHsKKyAgICAgIHJldHVybiBTVW5pdEl0ZXJhdG9yKE4sICh1bnNpZ25lZClOLT5QcmVkcy5zaXplKCkpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kOyB9CisgICAgY29uc3QgU1VuaXQgKmdldE5vZGUoKSBjb25zdCB7IHJldHVybiBOb2RlOyB9CisgICAgLy8vIGlzQ3RybERlcCAtIFRlc3QgaWYgdGhpcyBpcyBub3QgYW4gU0RlcDo6RGF0YSBkZXBlbmRlbmNlLgorICAgIGJvb2wgaXNDdHJsRGVwKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFNEZXAoKS5pc0N0cmwoKTsKKyAgICB9CisgICAgYm9vbCBpc0FydGlmaWNpYWxEZXAoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0U0RlcCgpLmlzQXJ0aWZpY2lhbCgpOworICAgIH0KKyAgICBjb25zdCBTRGVwICZnZXRTRGVwKCkgY29uc3QgeworICAgICAgcmV0dXJuIE5vZGUtPlByZWRzW09wZXJhbmRdOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8U1VuaXQqPiB7CisgICAgdHlwZWRlZiBTVW5pdCBOb2RlVHlwZTsKKyAgICB0eXBlZGVmIFNVbml0SXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisgICAgc3RhdGljIGlubGluZSBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKFNVbml0ICpOKSB7IHJldHVybiBOOyB9CisgICAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSAqTikgeworICAgICAgcmV0dXJuIFNVbml0SXRlcmF0b3I6OmJlZ2luKE4pOworICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlVHlwZSAqTikgeworICAgICAgcmV0dXJuIFNVbml0SXRlcmF0b3I6OmVuZChOKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFNjaGVkdWxlREFHKj4gOiBwdWJsaWMgR3JhcGhUcmFpdHM8U1VuaXQqPiB7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxTVW5pdD46Oml0ZXJhdG9yIG5vZGVzX2l0ZXJhdG9yOworICAgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihTY2hlZHVsZURBRyAqRykgeworICAgICAgcmV0dXJuIEctPlNVbml0cy5iZWdpbigpOworICAgIH0KKyAgICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKFNjaGVkdWxlREFHICpHKSB7CisgICAgICByZXR1cm4gRy0+U1VuaXRzLmVuZCgpOworICAgIH0KKyAgfTsKKworICAvLy8gU2NoZWR1bGVEQUdUb3BvbG9naWNhbFNvcnQgaXMgYSBjbGFzcyB0aGF0IGNvbXB1dGVzIGEgdG9wb2xvZ2ljYWwKKyAgLy8vIG9yZGVyaW5nIGZvciBTVW5pdHMgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGR5bmFtaWNhbGx5IHVwZGF0aW5nCisgIC8vLyB0aGUgb3JkZXJpbmcgYXMgbmV3IGVkZ2VzIGFyZSBhZGRlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGFsbG93cyBhIHZlcnkgZmFzdCBpbXBsZW1lbnRhdGlvbiBvZiBJc1JlYWNoYWJsZSwgZm9yIGV4YW1wbGUuCisgIC8vLworICBjbGFzcyBTY2hlZHVsZURBR1RvcG9sb2dpY2FsU29ydCB7CisgICAgLy8vIFNVbml0cyAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2hlZHVsZURBRydzIFNVbml0cy4KKyAgICBzdGQ6OnZlY3RvcjxTVW5pdD4gJlNVbml0czsKKworICAgIC8vLyBJbmRleDJOb2RlIC0gTWFwcyB0b3BvbG9naWNhbCBpbmRleCB0byB0aGUgbm9kZSBudW1iZXIuCisgICAgc3RkOjp2ZWN0b3I8aW50PiBJbmRleDJOb2RlOworICAgIC8vLyBOb2RlMkluZGV4IC0gTWFwcyB0aGUgbm9kZSBudW1iZXIgdG8gaXRzIHRvcG9sb2dpY2FsIGluZGV4LgorICAgIHN0ZDo6dmVjdG9yPGludD4gTm9kZTJJbmRleDsKKyAgICAvLy8gVmlzaXRlZCAtIGEgc2V0IG9mIG5vZGVzIHZpc2l0ZWQgZHVyaW5nIGEgREZTIHRyYXZlcnNhbC4KKyAgICBCaXRWZWN0b3IgVmlzaXRlZDsKKworICAgIC8vLyBERlMgLSBtYWtlIGEgREZTIHRyYXZlcnNhbCBhbmQgbWFyayBhbGwgbm9kZXMgYWZmZWN0ZWQgYnkgdGhlIAorICAgIC8vLyBlZGdlIGluc2VydGlvbi4gVGhlc2Ugbm9kZXMgd2lsbCBsYXRlciBnZXQgbmV3IHRvcG9sb2dpY2FsIGluZGV4ZXMKKyAgICAvLy8gYnkgbWVhbnMgb2YgdGhlIFNoaWZ0IG1ldGhvZC4KKyAgICB2b2lkIERGUyhjb25zdCBTVW5pdCAqU1UsIGludCBVcHBlckJvdW5kLCBib29sJiBIYXNMb29wKTsKKworICAgIC8vLyBTaGlmdCAtIHJlYXNzaWduIHRvcG9sb2dpY2FsIGluZGV4ZXMgZm9yIHRoZSBub2RlcyBpbiB0aGUgREFHCisgICAgLy8vIHRvIHByZXNlcnZlIHRoZSB0b3BvbG9naWNhbCBvcmRlcmluZy4KKyAgICB2b2lkIFNoaWZ0KEJpdFZlY3RvciYgVmlzaXRlZCwgaW50IExvd2VyQm91bmQsIGludCBVcHBlckJvdW5kKTsKKworICAgIC8vLyBBbGxvY2F0ZSAtIGFzc2lnbiB0aGUgdG9wb2xvZ2ljYWwgaW5kZXggdG8gdGhlIG5vZGUgbi4KKyAgICB2b2lkIEFsbG9jYXRlKGludCBuLCBpbnQgaW5kZXgpOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTY2hlZHVsZURBR1RvcG9sb2dpY2FsU29ydChzdGQ6OnZlY3RvcjxTVW5pdD4gJlNVbml0cyk7CisKKyAgICAvLy8gSW5pdERBR1RvcG9sb2dpY2FsU29ydGluZyAtIGNyZWF0ZSB0aGUgaW5pdGlhbCB0b3BvbG9naWNhbCAKKyAgICAvLy8gb3JkZXJpbmcgZnJvbSB0aGUgREFHIHRvIGJlIHNjaGVkdWxlZC4KKyAgICB2b2lkIEluaXREQUdUb3BvbG9naWNhbFNvcnRpbmcoKTsKKworICAgIC8vLyBJc1JlYWNoYWJsZSAtIENoZWNrcyBpZiBTVSBpcyByZWFjaGFibGUgZnJvbSBUYXJnZXRTVS4KKyAgICBib29sIElzUmVhY2hhYmxlKGNvbnN0IFNVbml0ICpTVSwgY29uc3QgU1VuaXQgKlRhcmdldFNVKTsKKworICAgIC8vLyBXaWxsQ3JlYXRlQ3ljbGUgLSBSZXR1cm5zIHRydWUgaWYgYWRkaW5nIGFuIGVkZ2UgZnJvbSBTVSB0byBUYXJnZXRTVQorICAgIC8vLyB3aWxsIGNyZWF0ZSBhIGN5Y2xlLgorICAgIGJvb2wgV2lsbENyZWF0ZUN5Y2xlKFNVbml0ICpTVSwgU1VuaXQgKlRhcmdldFNVKTsKKworICAgIC8vLyBBZGRQcmVkIC0gVXBkYXRlcyB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcgdG8gYWNjb21vZGF0ZSBhbiBlZGdlCisgICAgLy8vIHRvIGJlIGFkZGVkIGZyb20gU1VuaXQgWCB0byBTVW5pdCBZLgorICAgIHZvaWQgQWRkUHJlZChTVW5pdCAqWSwgU1VuaXQgKlgpOworCisgICAgLy8vIFJlbW92ZVByZWQgLSBVcGRhdGVzIHRoZSB0b3BvbG9naWNhbCBvcmRlcmluZyB0byBhY2NvbW9kYXRlIGFuCisgICAgLy8vIGFuIGVkZ2UgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzcGVjaWZpZWQgbm9kZSBOIGZyb20gdGhlIHByZWRlY2Vzc29ycworICAgIC8vLyBvZiB0aGUgY3VycmVudCBub2RlIE0uCisgICAgdm9pZCBSZW1vdmVQcmVkKFNVbml0ICpNLCBTVW5pdCAqTik7CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD46Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8aW50Pjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBJbmRleDJOb2RlLmJlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluZGV4Mk5vZGUuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEluZGV4Mk5vZGUuZW5kKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBJbmRleDJOb2RlLmVuZCgpOyB9CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD46OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIEluZGV4Mk5vZGUucmJlZ2luKCk7IH0KKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluZGV4Mk5vZGUucmJlZ2luKCk7IH0KKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBJbmRleDJOb2RlLnJlbmQoKTsgfQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIEluZGV4Mk5vZGUucmVuZCgpOyB9CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWUzZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyLmgKQEAgLTAsMCArMSw3MSBAQAorLy89LSBsbHZtL0NvZGVHZW4vU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyLmggLSBTY2hlZHVsaW5nIFN1cHBvcnQgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyIGNsYXNzLCB3aGljaCBpbXBsZW1lbnRzCisvLyBoYXphcmQtYXZvaWRhbmNlIGhldXJpc3RpY3MgZm9yIHNjaGVkdWxpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fU0NIRURVTEVIQVpBUkRSRUNPR05JWkVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NDSEVEVUxFSEFaQVJEUkVDT0dOSVpFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU1VuaXQ7CisKKy8vLyBIYXphcmRSZWNvZ25pemVyIC0gVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGluc3RydWN0aW9uIGNhbiBiZQorLy8vIGlzc3VlZCB0aGlzIGN5Y2xlLCBhbmQgd2hldGhlciBvciBub3QgYSBub29wIG5lZWRzIHRvIGJlIGluc2VydGVkIHRvIGhhbmRsZQorLy8vIHRoZSBoYXphcmQuCitjbGFzcyBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIoKTsKKworICBlbnVtIEhhemFyZFR5cGUgeworICAgIE5vSGF6YXJkLCAgICAgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gY2FuIGJlIGVtaXR0ZWQgYXQgdGhpcyBjeWNsZS4KKyAgICBIYXphcmQsICAgICAgICAvLyBUaGlzIGluc3RydWN0aW9uIGNhbid0IGJlIGVtaXR0ZWQgYXQgdGhpcyBjeWNsZS4KKyAgICBOb29wSGF6YXJkICAgICAvLyBUaGlzIGluc3RydWN0aW9uIGNhbid0IGJlIGVtaXR0ZWQsIGFuZCBuZWVkcyBub29wcy4KKyAgfTsKKworICAvLy8gZ2V0SGF6YXJkVHlwZSAtIFJldHVybiB0aGUgaGF6YXJkIHR5cGUgb2YgZW1pdHRpbmcgdGhpcyBub2RlLiAgVGhlcmUgYXJlCisgIC8vLyB0aHJlZSBwb3NzaWJsZSByZXN1bHRzLiAgRWl0aGVyOgorICAvLy8gICogTm9IYXphcmQ6IGl0IGlzIGxlZ2FsIHRvIGlzc3VlIHRoaXMgaW5zdHJ1Y3Rpb24gb24gdGhpcyBjeWNsZS4KKyAgLy8vICAqIEhhemFyZDogaXNzdWluZyB0aGlzIGluc3RydWN0aW9uIHdvdWxkIHN0YWxsIHRoZSBtYWNoaW5lLiAgSWYgc29tZQorICAvLy8gICAgIG90aGVyIGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSwgaXNzdWUgaXQgZmlyc3QuCisgIC8vLyAgKiBOb29wSGF6YXJkOiBpc3N1aW5nIHRoaXMgaW5zdHJ1Y3Rpb24gd291bGQgYnJlYWsgdGhlIHByb2dyYW0uICBJZgorICAvLy8gICAgIHNvbWUgb3RoZXIgaW5zdHJ1Y3Rpb24gY2FuIGJlIGlzc3VlZCwgZG8gc28sIG90aGVyd2lzZSBpc3N1ZSBhIG5vb3AuCisgIHZpcnR1YWwgSGF6YXJkVHlwZSBnZXRIYXphcmRUeXBlKFNVbml0ICopIHsKKyAgICByZXR1cm4gTm9IYXphcmQ7CisgIH0KKworICAvLy8gUmVzZXQgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIG5ldyBibG9jayBvZgorICAvLy8gaW5zdHJ1Y3Rpb25zIGlzIGFib3V0IHRvIGJlIHNjaGVkdWxlLiBUaGUgaGF6YXJkIHN0YXRlIHNob3VsZCBiZQorICAvLy8gc2V0IHRvIGFuIGluaXRpYWxpemVkIHN0YXRlLgorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSB7fQorCisgIC8vLyBFbWl0SW5zdHJ1Y3Rpb24gLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhbiBpbnN0cnVjdGlvbiBpcworICAvLy8gZW1pdHRlZCwgdG8gYWR2YW5jZSB0aGUgaGF6YXJkIHN0YXRlLgorICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKFNVbml0ICopIHt9CisKKyAgLy8vIEFkdmFuY2VDeWNsZSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIG5vIGluc3RydWN0aW9ucyBjYW4gYmUKKyAgLy8vIGlzc3VlZCBvbiB0aGlzIGN5Y2xlIHdpdGhvdXQgYSBoYXphcmQuICBUaGlzIHNob3VsZCBpbmNyZW1lbnQgdGhlCisgIC8vLyBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgaGF6YXJkIHJlY29nbml6ZXIgc28gdGhhdCBwcmV2aW91c2x5ICJIYXphcmQiCisgIC8vLyBpbnN0cnVjdGlvbnMgd2lsbCBub3cgbm90IGJlIGhhemFyZHMuCisgIHZpcnR1YWwgdm9pZCBBZHZhbmNlQ3ljbGUoKSB7fQorCisgIC8vLyBFbWl0Tm9vcCAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgbm9vcCB3YXMgYWRkZWQgdG8gdGhlCisgIC8vLyBpbnN0cnVjdGlvbiBzdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBFbWl0Tm9vcCgpIHsKKyAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uOiBjb3VudCBpdCBhcyBhIGN5Y2xlLgorICAgIEFkdmFuY2VDeWNsZSgpOworICB9Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVyUmVnaXN0cnkuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlclJlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1NzNkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlclJlZ2lzdHJ5LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1NjaGVkdWxlclJlZ2lzdHJ5LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gc2NoZWR1bGVyIGZ1bmN0aW9uCisvLyBwYXNzIHJlZ2lzdHJ5IChSZWdpc3RlclNjaGVkdWxlcikuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5TQ0hFRFVMRVJSRUdJU1RSWV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTlNDSEVEVUxFUlJFR0lTVFJZX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBSZWdpc3RlclNjaGVkdWxlciBjbGFzcyAtIFRyYWNrIHRoZSByZWdpc3RyYXRpb24gb2YgaW5zdHJ1Y3Rpb24gc2NoZWR1bGVycy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgU2VsZWN0aW9uREFHSVNlbDsKK2NsYXNzIFNjaGVkdWxlREFHU0ROb2RlczsKK2NsYXNzIFNlbGVjdGlvbkRBRzsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworCitjbGFzcyBSZWdpc3RlclNjaGVkdWxlciA6IHB1YmxpYyBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgU2NoZWR1bGVEQUdTRE5vZGVzICooKkZ1bmN0aW9uUGFzc0N0b3IpKFNlbGVjdGlvbkRBR0lTZWwqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCk7CisKKyAgc3RhdGljIE1hY2hpbmVQYXNzUmVnaXN0cnkgUmVnaXN0cnk7CisKKyAgUmVnaXN0ZXJTY2hlZHVsZXIoY29uc3QgY2hhciAqTiwgY29uc3QgY2hhciAqRCwgRnVuY3Rpb25QYXNzQ3RvciBDKQorICA6IE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlKE4sIEQsIChNYWNoaW5lUGFzc0N0b3IpQykKKyAgeyBSZWdpc3RyeS5BZGQodGhpcyk7IH0KKyAgflJlZ2lzdGVyU2NoZWR1bGVyKCkgeyBSZWdpc3RyeS5SZW1vdmUodGhpcyk7IH0KKyAgCisKKyAgLy8gQWNjZXNzb3JzLgorICAvLworICBSZWdpc3RlclNjaGVkdWxlciAqZ2V0TmV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFJlZ2lzdGVyU2NoZWR1bGVyICopTWFjaGluZVBhc3NSZWdpc3RyeU5vZGU6OmdldE5leHQoKTsKKyAgfQorICBzdGF0aWMgUmVnaXN0ZXJTY2hlZHVsZXIgKmdldExpc3QoKSB7CisgICAgcmV0dXJuIChSZWdpc3RlclNjaGVkdWxlciAqKVJlZ2lzdHJ5LmdldExpc3QoKTsKKyAgfQorICBzdGF0aWMgRnVuY3Rpb25QYXNzQ3RvciBnZXREZWZhdWx0KCkgeworICAgIHJldHVybiAoRnVuY3Rpb25QYXNzQ3RvcilSZWdpc3RyeS5nZXREZWZhdWx0KCk7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0RGVmYXVsdChGdW5jdGlvblBhc3NDdG9yIEMpIHsKKyAgICBSZWdpc3RyeS5zZXREZWZhdWx0KChNYWNoaW5lUGFzc0N0b3IpQyk7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0TGlzdGVuZXIoTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyICpMKSB7CisgICAgUmVnaXN0cnkuc2V0TGlzdGVuZXIoTCk7CisgIH0KK307CisKKy8vLyBjcmVhdGVCVVJSTGlzdERBR1NjaGVkdWxlciAtIFRoaXMgY3JlYXRlcyBhIGJvdHRvbSB1cCByZWdpc3RlciB1c2FnZQorLy8vIHJlZHVjdGlvbiBsaXN0IHNjaGVkdWxlci4KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlQlVSUkxpc3REQUdTY2hlZHVsZXIoU2VsZWN0aW9uREFHSVNlbCAqSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKworLy8vIGNyZWF0ZVREUlJMaXN0REFHU2NoZWR1bGVyIC0gVGhpcyBjcmVhdGVzIGEgdG9wIGRvd24gcmVnaXN0ZXIgdXNhZ2UKKy8vLyByZWR1Y3Rpb24gbGlzdCBzY2hlZHVsZXIuCitTY2hlZHVsZURBR1NETm9kZXMgKmNyZWF0ZVREUlJMaXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKKy8vLyBjcmVhdGVCVVJSTGlzdERBR1NjaGVkdWxlciAtIFRoaXMgY3JlYXRlcyBhIGJvdHRvbSB1cCBsaXN0IHNjaGVkdWxlciB0aGF0CisvLy8gc2NoZWR1bGVzIG5vZGVzIGluIHNvdXJjZSBjb2RlIG9yZGVyIHdoZW4gcG9zc2libGUuCitTY2hlZHVsZURBR1NETm9kZXMgKmNyZWF0ZVNvdXJjZUxpc3REQUdTY2hlZHVsZXIoU2VsZWN0aW9uREFHSVNlbCAqSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworCisvLy8gY3JlYXRlSHlicmlkTGlzdERBR1NjaGVkdWxlciAtIFRoaXMgY3JlYXRlcyBhIGJvdHRvbSB1cCByZWdpc3RlciBwcmVzc3VyZQorLy8vIGF3YXJlIGxpc3Qgc2NoZWR1bGVyIHRoYXQgbWFrZSB1c2Ugb2YgbGF0ZW5jeSBpbmZvcm1hdGlvbiB0byBhdm9pZCBzdGFsbHMKKy8vLyBmb3IgbG9uZyBsYXRlbmN5IGluc3RydWN0aW9ucyBpbiBsb3cgcmVnaXN0ZXIgcHJlc3N1cmUgbW9kZS4gSW4gaGlnaAorLy8vIHJlZ2lzdGVyIHByZXNzdXJlIG1vZGUgaXQgc2NoZWR1bGVzIHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZS4KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlSHlicmlkTGlzdERBR1NjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCk7CisKKy8vLyBjcmVhdGVJTFBMaXN0REFHU2NoZWR1bGVyIC0gVGhpcyBjcmVhdGVzIGEgYm90dG9tIHVwIHJlZ2lzdGVyIHByZXNzdXJlCisvLy8gYXdhcmUgbGlzdCBzY2hlZHVsZXIgdGhhdCB0cmllcyB0byBpbmNyZWFzZSBpbnN0cnVjdGlvbiBsZXZlbCBwYXJhbGxlbGlzbQorLy8vIGluIGxvdyByZWdpc3RlciBwcmVzc3VyZSBtb2RlLiBJbiBoaWdoIHJlZ2lzdGVyIHByZXNzdXJlIG1vZGUgaXQgc2NoZWR1bGVzCisvLy8gdG8gcmVkdWNlIHJlZ2lzdGVyIHByZXNzdXJlLgorU2NoZWR1bGVEQUdTRE5vZGVzICpjcmVhdGVJTFBMaXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsKTsKKy8vLyBjcmVhdGVURExpc3REQUdTY2hlZHVsZXIgLSBUaGlzIGNyZWF0ZXMgYSB0b3AtZG93biBsaXN0IHNjaGVkdWxlciB3aXRoCisvLy8gYSBoYXphcmQgcmVjb2duaXplci4KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlVERMaXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworCisvLy8gY3JlYXRlRmFzdERBR1NjaGVkdWxlciAtIFRoaXMgY3JlYXRlcyBhICJmYXN0IiBzY2hlZHVsZXIuCisvLy8KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlRmFzdERBR1NjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKKy8vLyBjcmVhdGVEZWZhdWx0U2NoZWR1bGVyIC0gVGhpcyBjcmVhdGVzIGFuIGluc3RydWN0aW9uIHNjaGVkdWxlciBhcHByb3ByaWF0ZQorLy8vIGZvciB0aGUgdGFyZ2V0LgorU2NoZWR1bGVEQUdTRE5vZGVzICpjcmVhdGVEZWZhdWx0U2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTZiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaApAQCAtMCwwICsxLDEwNDIgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIC0gSW5zdFNlbGVjdGlvbiBEQUcgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTZWxlY3Rpb25EQUcgY2xhc3MsIGFuZCB0cmFuc2l0aXZlbHkgZGVmaW5lcyB0aGUKKy8vIFNETm9kZSBjbGFzcyBhbmQgc3ViY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fU0VMRUNUSU9OREFHX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHTm9kZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVjeWNsaW5nQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxpYXNBbmFseXNpczsKK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZTsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIFNETm9kZU9yZGVyaW5nOworY2xhc3MgU0REYmdWYWx1ZTsKK2NsYXNzIFRhcmdldExvd2VyaW5nOworY2xhc3MgVGFyZ2V0U2VsZWN0aW9uREFHSW5mbzsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgaWxpc3RfdHJhaXRzPFNETm9kZT4gOiBwdWJsaWMgaWxpc3RfZGVmYXVsdF90cmFpdHM8U0ROb2RlPiB7Citwcml2YXRlOgorICBtdXRhYmxlIGlsaXN0X2hhbGZfbm9kZTxTRE5vZGU+IFNlbnRpbmVsOworcHVibGljOgorICBTRE5vZGUgKmNyZWF0ZVNlbnRpbmVsKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTRE5vZGUqPigmU2VudGluZWwpOworICB9CisgIHN0YXRpYyB2b2lkIGRlc3Ryb3lTZW50aW5lbChTRE5vZGUgKikge30KKworICBTRE5vZGUgKnByb3ZpZGVJbml0aWFsSGVhZCgpIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7IH0KKyAgU0ROb2RlICplbnN1cmVIZWFkKFNETm9kZSopIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7IH0KKyAgc3RhdGljIHZvaWQgbm90ZUhlYWQoU0ROb2RlKiwgU0ROb2RlKikge30KKworICBzdGF0aWMgdm9pZCBkZWxldGVOb2RlKFNETm9kZSAqKSB7CisgICAgYXNzZXJ0KDAgJiYgImlsaXN0X3RyYWl0czxTRE5vZGU+IHNob3VsZG4ndCBzZWUgYSBkZWxldGVOb2RlIGNhbGwhIik7CisgIH0KK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIGNyZWF0ZU5vZGUoY29uc3QgU0ROb2RlICYpOworfTsKKworLy8vIFNERGJnSW5mbyAtIEtlZXBzIHRyYWNrIG9mIGRiZ192YWx1ZSBpbmZvcm1hdGlvbiB0aHJvdWdoIFNESVNlbC4gIFdlIGRvCisvLy8gbm90IGJ1aWxkIFNETm9kZXMgZm9yIHRoZXNlIHNvIGFzIG5vdCB0byBwZXJ0dXJiIHRoZSBnZW5lcmF0ZWQgY29kZTsKKy8vLyBpbnN0ZWFkIHRoZSBpbmZvIGlzIGtlcHQgb2ZmIHRvIHRoZSBzaWRlIGluIHRoaXMgc3RydWN0dXJlLiBFYWNoIFNETm9kZSBtYXkKKy8vLyBoYXZlIG9uZSBvciBtb3JlIGFzc29jaWF0ZWQgZGJnX3ZhbHVlIGVudHJpZXMuIFRoaXMgaW5mb3JtYXRpb24gaXMga2VwdCBpbgorLy8vIERiZ1ZhbE1hcC4KKy8vLyBCeXZhbCBwYXJhbWV0ZXJzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgYmVjYXVzZSB0aGV5IGRvbid0IHVzZSBhbGxvY2EncywKKy8vLyB3aGljaCBidXN0cyB0aGUgbm9ybWFsIG1lY2hhbmlzbS4gIFRoZXJlIGlzIGdvb2QgcmVhc29uIGZvciBoYW5kbGluZyBhbGwKKy8vLyBwYXJhbWV0ZXJzIHNlcGFyYXRlbHk6ICB0aGV5IG1heSBub3QgaGF2ZSBjb2RlIGdlbmVyYXRlZCBmb3IgdGhlbSwgdGhleQorLy8vIHNob3VsZCBhbHdheXMgZ28gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24gcmVnYXJkbGVzcyBvZiBvdGhlciBjb2RlCisvLy8gbW90aW9uLCBhbmQgZGVidWcgaW5mbyBmb3IgdGhlbSBpcyBwb3RlbnRpYWxseSB1c2VmdWwgZXZlbiBpZiB0aGUgcGFyYW1ldGVyCisvLy8gaXMgdW51c2VkLiAgUmlnaHQgbm93IG9ubHkgYnl2YWwgcGFyYW1ldGVycyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgorY2xhc3MgU0REYmdJbmZvIHsKKyAgU21hbGxWZWN0b3I8U0REYmdWYWx1ZSosIDMyPiBEYmdWYWx1ZXM7CisgIFNtYWxsVmVjdG9yPFNERGJnVmFsdWUqLCAzMj4gQnl2YWxQYXJtRGJnVmFsdWVzOworICBEZW5zZU1hcDxjb25zdCBTRE5vZGUqLCBTbWFsbFZlY3RvcjxTRERiZ1ZhbHVlKiwgMj4gPiBEYmdWYWxNYXA7CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU0REYmdJbmZvJik7ICAgLy8gRG8gbm90IGltcGxlbWVudC4KKyAgU0REYmdJbmZvKGNvbnN0IFNERGJnSW5mbyYpOyAgIC8vIERvIG5vdCBpbXBsZW1lbnQuCitwdWJsaWM6CisgIFNERGJnSW5mbygpIHt9CisKKyAgdm9pZCBhZGQoU0REYmdWYWx1ZSAqViwgY29uc3QgU0ROb2RlICpOb2RlLCBib29sIGlzUGFyYW1ldGVyKSB7CisgICAgaWYgKGlzUGFyYW1ldGVyKSB7CisgICAgICBCeXZhbFBhcm1EYmdWYWx1ZXMucHVzaF9iYWNrKFYpOworICAgIH0gZWxzZSAgICAgRGJnVmFsdWVzLnB1c2hfYmFjayhWKTsKKyAgICBpZiAoTm9kZSkKKyAgICAgIERiZ1ZhbE1hcFtOb2RlXS5wdXNoX2JhY2soVik7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIERiZ1ZhbE1hcC5jbGVhcigpOworICAgIERiZ1ZhbHVlcy5jbGVhcigpOworICAgIEJ5dmFsUGFybURiZ1ZhbHVlcy5jbGVhcigpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGJnVmFsdWVzLmVtcHR5KCkgJiYgQnl2YWxQYXJtRGJnVmFsdWVzLmVtcHR5KCk7CisgIH0KKworICBTbWFsbFZlY3RvcjxTRERiZ1ZhbHVlKiwyPiAmZ2V0U0REYmdWYWx1ZXMoY29uc3QgU0ROb2RlICpOb2RlKSB7CisgICAgcmV0dXJuIERiZ1ZhbE1hcFtOb2RlXTsKKyAgfQorCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8U0REYmdWYWx1ZSosMzI+OjppdGVyYXRvciBEYmdJdGVyYXRvcjsKKyAgRGJnSXRlcmF0b3IgRGJnQmVnaW4oKSB7IHJldHVybiBEYmdWYWx1ZXMuYmVnaW4oKTsgfQorICBEYmdJdGVyYXRvciBEYmdFbmQoKSAgIHsgcmV0dXJuIERiZ1ZhbHVlcy5lbmQoKTsgfQorICBEYmdJdGVyYXRvciBCeXZhbFBhcm1EYmdCZWdpbigpIHsgcmV0dXJuIEJ5dmFsUGFybURiZ1ZhbHVlcy5iZWdpbigpOyB9CisgIERiZ0l0ZXJhdG9yIEJ5dmFsUGFybURiZ0VuZCgpICAgeyByZXR1cm4gQnl2YWxQYXJtRGJnVmFsdWVzLmVuZCgpOyB9Cit9OworCitlbnVtIENvbWJpbmVMZXZlbCB7CisgIFVucmVzdHJpY3RlZCwgICAvLyBDb21iaW5lIG1heSBjcmVhdGUgaWxsZWdhbCBvcGVyYXRpb25zIGFuZCBpbGxlZ2FsIHR5cGVzLgorICBOb0lsbGVnYWxUeXBlcywgLy8gQ29tYmluZSBtYXkgY3JlYXRlIGlsbGVnYWwgb3BlcmF0aW9ucyBidXQgbm8gaWxsZWdhbCB0eXBlcy4KKyAgTm9JbGxlZ2FsT3BlcmF0aW9ucyAvLyBDb21iaW5lIG1heSBvbmx5IGNyZWF0ZSBsZWdhbCBvcGVyYXRpb25zIGFuZCB0eXBlcy4KK307CisKK2NsYXNzIFNlbGVjdGlvbkRBRzsKK3ZvaWQgY2hlY2tGb3JDeWNsZXMoY29uc3QgU0ROb2RlICpOKTsKK3ZvaWQgY2hlY2tGb3JDeWNsZXMoY29uc3QgU2VsZWN0aW9uREFHICpEQUcpOworCisvLy8gU2VsZWN0aW9uREFHIGNsYXNzIC0gVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHBvcnRpb24gb2YgYW4gTExWTSBmdW5jdGlvbgorLy8vIGluIGEgbG93LWxldmVsIERhdGEgRGVwZW5kZW5jZSBEQUcgcmVwcmVzZW50YXRpb24gc3VpdGFibGUgZm9yIGluc3RydWN0aW9uCisvLy8gc2VsZWN0aW9uLiAgVGhpcyBEQUcgaXMgY29uc3RydWN0ZWQgYXMgdGhlIGZpcnN0IHN0ZXAgb2YgaW5zdHJ1Y3Rpb24KKy8vLyBzZWxlY3Rpb24gaW4gb3JkZXIgdG8gYWxsb3cgaW1wbGVtZW50YXRpb24gb2YgbWFjaGluZSBzcGVjaWZpYyBvcHRpbWl6YXRpb25zCisvLy8gYW5kIGNvZGUgc2ltcGxpZmljYXRpb25zLgorLy8vCisvLy8gVGhlIHJlcHJlc2VudGF0aW9uIHVzZWQgYnkgdGhlIFNlbGVjdGlvbkRBRyBpcyBhIHRhcmdldC1pbmRlcGVuZGVudAorLy8vIHJlcHJlc2VudGF0aW9uLCB3aGljaCBoYXMgc29tZSBzaW1pbGFyaXRpZXMgdG8gdGhlIEdDQyBSVEwgcmVwcmVzZW50YXRpb24sCisvLy8gYnV0IGlzIHNpZ25pZmljYW50bHkgbW9yZSBzaW1wbGUsIHBvd2VyZnVsLCBhbmQgaXMgYSBncmFwaCBmb3JtIGluc3RlYWQgb2YgYQorLy8vIGxpbmVhciBmb3JtLgorLy8vCitjbGFzcyBTZWxlY3Rpb25EQUcgeworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSTsKKyAgY29uc3QgVGFyZ2V0U2VsZWN0aW9uREFHSW5mbyAmVFNJOworICBNYWNoaW5lRnVuY3Rpb24gKk1GOworICBMTFZNQ29udGV4dCAqQ29udGV4dDsKKworICAvLy8gRW50cnlOb2RlIC0gVGhlIHN0YXJ0aW5nIHRva2VuLgorICBTRE5vZGUgRW50cnlOb2RlOworCisgIC8vLyBSb290IC0gVGhlIHJvb3Qgb2YgdGhlIGVudGlyZSBEQUcuCisgIFNEVmFsdWUgUm9vdDsKKworICAvLy8gQWxsTm9kZXMgLSBBIGxpbmtlZCBsaXN0IG9mIG5vZGVzIGluIHRoZSBjdXJyZW50IERBRy4KKyAgaWxpc3Q8U0ROb2RlPiBBbGxOb2RlczsKKworICAvLy8gTm9kZUFsbG9jYXRvclR5cGUgLSBUaGUgQWxsb2NhdG9yVHlwZSBmb3IgYWxsb2NhdGluZyBTRE5vZGVzLiBXZSB1c2UKKyAgLy8vIHBvb2wgYWxsb2NhdGlvbiB3aXRoIHJlY3ljbGluZy4KKyAgdHlwZWRlZiBSZWN5Y2xpbmdBbGxvY2F0b3I8QnVtcFB0ckFsbG9jYXRvciwgU0ROb2RlLCBzaXplb2YoTGFyZ2VzdFNETm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWduT2Y8TW9zdEFsaWduZWRTRE5vZGU+OjpBbGlnbm1lbnQ+CisgICAgTm9kZUFsbG9jYXRvclR5cGU7CisKKyAgLy8vIE5vZGVBbGxvY2F0b3IgLSBQb29sIGFsbG9jYXRpb24gZm9yIG5vZGVzLgorICBOb2RlQWxsb2NhdG9yVHlwZSBOb2RlQWxsb2NhdG9yOworCisgIC8vLyBDU0VNYXAgLSBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1lbW9pemUgbm9kZXMsIGF1dG9tYXRpY2FsbHkgcGVyZm9ybWluZworICAvLy8gQ1NFIHdpdGggZXhpc3Rpbmcgbm9kZXMgd2hlbiBhIGR1cGxpY2F0ZSBpcyByZXF1ZXN0ZWQuCisgIEZvbGRpbmdTZXQ8U0ROb2RlPiBDU0VNYXA7CisKKyAgLy8vIE9wZXJhbmRBbGxvY2F0b3IgLSBQb29sIGFsbG9jYXRpb24gZm9yIG1hY2hpbmUtb3Bjb2RlIFNETm9kZSBvcGVyYW5kcy4KKyAgQnVtcFB0ckFsbG9jYXRvciBPcGVyYW5kQWxsb2NhdG9yOworCisgIC8vLyBBbGxvY2F0b3IgLSBQb29sIGFsbG9jYXRpb24gZm9yIG1pc2MuIG9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCBvbmNlIHBlcgorICAvLy8gU2VsZWN0aW9uREFHLgorICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKKworICAvLy8gU0ROb2RlT3JkZXJpbmcgLSBUaGUgb3JkZXJpbmcgb2YgdGhlIFNETm9kZXMuIEl0IHJvdWdobHkgY29ycmVzcG9uZHMgdG8KKyAgLy8vIHRoZSBvcmRlcmluZyBvZiB0aGUgb3JpZ2luYWwgTExWTSBpbnN0cnVjdGlvbnMuCisgIFNETm9kZU9yZGVyaW5nICpPcmRlcmluZzsKKworICAvLy8gRGJnSW5mbyAtIFRyYWNrcyBkYmdfdmFsdWUgaW5mb3JtYXRpb24gdGhyb3VnaCBTRElTZWwuCisgIFNERGJnSW5mbyAqRGJnSW5mbzsKKworICAvLy8gVmVyaWZ5Tm9kZSAtIFNhbml0eSBjaGVjayB0aGUgZ2l2ZW4gbm9kZS4gIEFib3J0cyBpZiBpdCBpcyBpbnZhbGlkLgorICB2b2lkIFZlcmlmeU5vZGUoU0ROb2RlICpOKTsKKworICAvLy8gc2V0R3JhcGhDb2xvckhlbHBlciAtIEltcGxlbWVudGF0aW9uIG9mIHNldFN1YmdyYXBoQ29sb3IuCisgIC8vLyBSZXR1cm4gd2hldGhlciB3ZSBoYWQgdG8gdHJ1bmNhdGUgdGhlIHNlYXJjaC4KKyAgLy8vCisgIGJvb2wgc2V0U3ViZ3JhcGhDb2xvckhlbHBlcihTRE5vZGUgKk4sIGNvbnN0IGNoYXIgKkNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VTZXQ8U0ROb2RlICo+ICZ2aXNpdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLCBib29sICZwcmludGVkKTsKKworICB2b2lkIG9wZXJhdG9yPShjb25zdCBTZWxlY3Rpb25EQUcmKTsgLy8gRG8gbm90IGltcGxlbWVudC4KKyAgU2VsZWN0aW9uREFHKGNvbnN0IFNlbGVjdGlvbkRBRyYpOyAgIC8vIERvIG5vdCBpbXBsZW1lbnQuCisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU2VsZWN0aW9uREFHKGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKKyAgflNlbGVjdGlvbkRBRygpOworCisgIC8vLyBpbml0IC0gUHJlcGFyZSB0aGlzIFNlbGVjdGlvbkRBRyB0byBwcm9jZXNzIGNvZGUgaW4gdGhlIGdpdmVuCisgIC8vLyBNYWNoaW5lRnVuY3Rpb24uCisgIC8vLworICB2b2lkIGluaXQoTWFjaGluZUZ1bmN0aW9uICZtZik7CisKKyAgLy8vIGNsZWFyIC0gQ2xlYXIgc3RhdGUgYW5kIGZyZWUgbWVtb3J5IG5lY2Vzc2FyeSB0byBtYWtlIHRoaXMKKyAgLy8vIFNlbGVjdGlvbkRBRyByZWFkeSB0byBwcm9jZXNzIGEgbmV3IGJsb2NrLgorICAvLy8KKyAgdm9pZCBjbGVhcigpOworCisgIE1hY2hpbmVGdW5jdGlvbiAmZ2V0TWFjaGluZUZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gKk1GOyB9CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJmdldFRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIFRNOyB9CisgIGNvbnN0IFRhcmdldExvd2VyaW5nICZnZXRUYXJnZXRMb3dlcmluZ0luZm8oKSBjb25zdCB7IHJldHVybiBUTEk7IH0KKyAgY29uc3QgVGFyZ2V0U2VsZWN0aW9uREFHSW5mbyAmZ2V0U2VsZWN0aW9uREFHSW5mbygpIGNvbnN0IHsgcmV0dXJuIFRTSTsgfQorICBMTFZNQ29udGV4dCAqZ2V0Q29udGV4dCgpIGNvbnN0IHtyZXR1cm4gQ29udGV4dDsgfQorCisgIC8vLyB2aWV3R3JhcGggLSBQb3AgdXAgYSBHcmFwaFZpei9ndiB3aW5kb3cgd2l0aCB0aGUgREFHIHJlbmRlcmVkIHVzaW5nICdkb3QnLgorICAvLy8KKyAgdm9pZCB2aWV3R3JhcGgoY29uc3Qgc3RkOjpzdHJpbmcgJlRpdGxlKTsKKyAgdm9pZCB2aWV3R3JhcGgoKTsKKworI2lmbmRlZiBOREVCVUcKKyAgc3RkOjptYXA8Y29uc3QgU0ROb2RlICosIHN0ZDo6c3RyaW5nPiBOb2RlR3JhcGhBdHRyczsKKyNlbmRpZgorCisgIC8vLyBjbGVhckdyYXBoQXR0cnMgLSBDbGVhciBhbGwgcHJldmlvdXNseSBkZWZpbmVkIG5vZGUgZ3JhcGggYXR0cmlidXRlcy4KKyAgLy8vIEludGVuZGVkIHRvIGJlIHVzZWQgZnJvbSBhIGRlYnVnZ2luZyB0b29sIChlZy4gZ2RiKS4KKyAgdm9pZCBjbGVhckdyYXBoQXR0cnMoKTsKKworICAvLy8gc2V0R3JhcGhBdHRycyAtIFNldCBncmFwaCBhdHRyaWJ1dGVzIGZvciBhIG5vZGUuIChlZy4gImNvbG9yPXJlZCIuKQorICAvLy8KKyAgdm9pZCBzZXRHcmFwaEF0dHJzKGNvbnN0IFNETm9kZSAqTiwgY29uc3QgY2hhciAqQXR0cnMpOworCisgIC8vLyBnZXRHcmFwaEF0dHJzIC0gR2V0IGdyYXBoIGF0dHJpYnV0ZXMgZm9yIGEgbm9kZS4gKGVnLiAiY29sb3I9cmVkIi4pCisgIC8vLyBVc2VkIGZyb20gZ2V0Tm9kZUF0dHJpYnV0ZXMuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGdldEdyYXBoQXR0cnMoY29uc3QgU0ROb2RlICpOKSBjb25zdDsKKworICAvLy8gc2V0R3JhcGhDb2xvciAtIENvbnZlbmllbmNlIGZvciBzZXR0aW5nIG5vZGUgY29sb3IgYXR0cmlidXRlLgorICAvLy8KKyAgdm9pZCBzZXRHcmFwaENvbG9yKGNvbnN0IFNETm9kZSAqTiwgY29uc3QgY2hhciAqQ29sb3IpOworCisgIC8vLyBzZXRHcmFwaENvbG9yIC0gQ29udmVuaWVuY2UgZm9yIHNldHRpbmcgc3ViZ3JhcGggY29sb3IgYXR0cmlidXRlLgorICAvLy8KKyAgdm9pZCBzZXRTdWJncmFwaENvbG9yKFNETm9kZSAqTiwgY29uc3QgY2hhciAqQ29sb3IpOworCisgIHR5cGVkZWYgaWxpc3Q8U0ROb2RlPjo6Y29uc3RfaXRlcmF0b3IgYWxsbm9kZXNfY29uc3RfaXRlcmF0b3I7CisgIGFsbG5vZGVzX2NvbnN0X2l0ZXJhdG9yIGFsbG5vZGVzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQWxsTm9kZXMuYmVnaW4oKTsgfQorICBhbGxub2Rlc19jb25zdF9pdGVyYXRvciBhbGxub2Rlc19lbmQoKSBjb25zdCB7IHJldHVybiBBbGxOb2Rlcy5lbmQoKTsgfQorICB0eXBlZGVmIGlsaXN0PFNETm9kZT46Oml0ZXJhdG9yIGFsbG5vZGVzX2l0ZXJhdG9yOworICBhbGxub2Rlc19pdGVyYXRvciBhbGxub2Rlc19iZWdpbigpIHsgcmV0dXJuIEFsbE5vZGVzLmJlZ2luKCk7IH0KKyAgYWxsbm9kZXNfaXRlcmF0b3IgYWxsbm9kZXNfZW5kKCkgeyByZXR1cm4gQWxsTm9kZXMuZW5kKCk7IH0KKyAgaWxpc3Q8U0ROb2RlPjo6c2l6ZV90eXBlIGFsbG5vZGVzX3NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIEFsbE5vZGVzLnNpemUoKTsKKyAgfQorCisgIC8vLyBnZXRSb290IC0gUmV0dXJuIHRoZSByb290IHRhZyBvZiB0aGUgU2VsZWN0aW9uREFHLgorICAvLy8KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0Um9vdCgpIGNvbnN0IHsgcmV0dXJuIFJvb3Q7IH0KKworICAvLy8gZ2V0RW50cnlOb2RlIC0gUmV0dXJuIHRoZSB0b2tlbiBjaGFpbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnRyeSBvZiB0aGUKKyAgLy8vIGZ1bmN0aW9uLgorICBTRFZhbHVlIGdldEVudHJ5Tm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU0RWYWx1ZShjb25zdF9jYXN0PFNETm9kZSAqPigmRW50cnlOb2RlKSwgMCk7CisgIH0KKworICAvLy8gc2V0Um9vdCAtIFNldCB0aGUgY3VycmVudCByb290IHRhZyBvZiB0aGUgU2VsZWN0aW9uREFHLgorICAvLy8KKyAgY29uc3QgU0RWYWx1ZSAmc2V0Um9vdChTRFZhbHVlIE4pIHsKKyAgICBhc3NlcnQoKCFOLmdldE5vZGUoKSB8fCBOLmdldFZhbHVlVHlwZSgpID09IE1WVDo6T3RoZXIpICYmCisgICAgICAgICAgICJEQUcgcm9vdCB2YWx1ZSBpcyBub3QgYSBjaGFpbiEiKTsKKyAgICBpZiAoTi5nZXROb2RlKCkpCisgICAgICBjaGVja0ZvckN5Y2xlcyhOLmdldE5vZGUoKSk7CisgICAgUm9vdCA9IE47CisgICAgaWYgKE4uZ2V0Tm9kZSgpKQorICAgICAgY2hlY2tGb3JDeWNsZXModGhpcyk7CisgICAgcmV0dXJuIFJvb3Q7CisgIH0KKworICAvLy8gQ29tYmluZSAtIFRoaXMgaXRlcmF0ZXMgb3ZlciB0aGUgbm9kZXMgaW4gdGhlIFNlbGVjdGlvbkRBRywgZm9sZGluZworICAvLy8gY2VydGFpbiB0eXBlcyBvZiBub2RlcyB0b2dldGhlciwgb3IgZWxpbWluYXRpbmcgc3VwZXJmbHVvdXMgbm9kZXMuICBUaGUKKyAgLy8vIExldmVsIGFyZ3VtZW50IGNvbnRyb2xzIHdoZXRoZXIgQ29tYmluZSBpcyBhbGxvd2VkIHRvIHByb2R1Y2Ugbm9kZXMgYW5kCisgIC8vLyB0eXBlcyB0aGF0IGFyZSBpbGxlZ2FsIG9uIHRoZSB0YXJnZXQuCisgIHZvaWQgQ29tYmluZShDb21iaW5lTGV2ZWwgTGV2ZWwsIEFsaWFzQW5hbHlzaXMgJkFBLAorICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworCisgIC8vLyBMZWdhbGl6ZVR5cGVzIC0gVGhpcyB0cmFuc2Zvcm1zIHRoZSBTZWxlY3Rpb25EQUcgaW50byBhIFNlbGVjdGlvbkRBRyB0aGF0CisgIC8vLyBvbmx5IHVzZXMgdHlwZXMgbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQuICBSZXR1cm5zICJ0cnVlIiBpZiBpdAorICAvLy8gbWFkZSBhbnkgY2hhbmdlcy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBhbiBpbnZvbHZlZCBwcm9jZXNzIHRoYXQgbWF5IGludmFsaWRhdGUgcG9pbnRlcnMgaW50bworICAvLy8gdGhlIGdyYXBoLgorICBib29sIExlZ2FsaXplVHlwZXMoKTsKKworICAvLy8gTGVnYWxpemUgLSBUaGlzIHRyYW5zZm9ybXMgdGhlIFNlbGVjdGlvbkRBRyBpbnRvIGEgU2VsZWN0aW9uREFHIHRoYXQgaXMKKyAgLy8vIGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IGluc3RydWN0aW9uIHNlbGVjdG9yLCBhcyBpbmRpY2F0ZWQgYnkgdGhlCisgIC8vLyBUYXJnZXRMb3dlcmluZyBvYmplY3QuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYW4gaW52b2x2ZWQgcHJvY2VzcyB0aGF0IG1heSBpbnZhbGlkYXRlIHBvaW50ZXJzIGludG8KKyAgLy8vIHRoZSBncmFwaC4KKyAgdm9pZCBMZWdhbGl6ZShDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKKyAgLy8vIExlZ2FsaXplVmVjdG9ycyAtIFRoaXMgdHJhbnNmb3JtcyB0aGUgU2VsZWN0aW9uREFHIGludG8gYSBTZWxlY3Rpb25EQUcKKyAgLy8vIHRoYXQgb25seSB1c2VzIHZlY3RvciBtYXRoIG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQuICBUaGlzIGlzCisgIC8vLyBuZWNlc3NhcnkgYXMgYSBzZXBhcmF0ZSBzdGVwIGZyb20gTGVnYWxpemUgYmVjYXVzZSB1bnJvbGxpbmcgYSB2ZWN0b3IKKyAgLy8vIG9wZXJhdGlvbiBjYW4gaW50cm9kdWNlIGlsbGVnYWwgdHlwZXMsIHdoaWNoIHJlcXVpcmVzIHJ1bm5pbmcKKyAgLy8vIExlZ2FsaXplVHlwZXMgYWdhaW4uCisgIC8vLworICAvLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgaXQgbWFkZSBhbnkgY2hhbmdlczsgaW4gdGhhdCBjYXNlLCBMZWdhbGl6ZVR5cGVzCisgIC8vLyBpcyBjYWxsZWQgYWdhaW4gYmVmb3JlIExlZ2FsaXplLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGludm9sdmVkIHByb2Nlc3MgdGhhdCBtYXkgaW52YWxpZGF0ZSBwb2ludGVycyBpbnRvCisgIC8vLyB0aGUgZ3JhcGguCisgIGJvb2wgTGVnYWxpemVWZWN0b3JzKCk7CisKKyAgLy8vIFJlbW92ZURlYWROb2RlcyAtIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYWxsIHVucmVhY2hhYmxlIG5vZGVzIGluIHRoZQorICAvLy8gU2VsZWN0aW9uREFHLgorICB2b2lkIFJlbW92ZURlYWROb2RlcygpOworCisgIC8vLyBEZWxldGVOb2RlIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbm9kZSBmcm9tIHRoZSBzeXN0ZW0uICBUaGlzIG5vZGUgbXVzdAorICAvLy8gaGF2ZSBubyByZWZlcnJlcnMuCisgIHZvaWQgRGVsZXRlTm9kZShTRE5vZGUgKk4pOworCisgIC8vLyBnZXRWVExpc3QgLSBSZXR1cm4gYW4gU0RWVExpc3QgdGhhdCByZXByZXNlbnRzIHRoZSBsaXN0IG9mIHZhbHVlcworICAvLy8gc3BlY2lmaWVkLgorICBTRFZUTGlzdCBnZXRWVExpc3QoRVZUIFZUKTsKKyAgU0RWVExpc3QgZ2V0VlRMaXN0KEVWVCBWVDEsIEVWVCBWVDIpOworICBTRFZUTGlzdCBnZXRWVExpc3QoRVZUIFZUMSwgRVZUIFZUMiwgRVZUIFZUMyk7CisgIFNEVlRMaXN0IGdldFZUTGlzdChFVlQgVlQxLCBFVlQgVlQyLCBFVlQgVlQzLCBFVlQgVlQ0KTsKKyAgU0RWVExpc3QgZ2V0VlRMaXN0KGNvbnN0IEVWVCAqVlRzLCB1bnNpZ25lZCBOdW1WVHMpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBOb2RlIGNyZWF0aW9uIG1ldGhvZHMuCisgIC8vCisgIFNEVmFsdWUgZ2V0Q29uc3RhbnQodWludDY0X3QgVmFsLCBFVlQgVlQsIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0Q29uc3RhbnQoY29uc3QgQVBJbnQgJlZhbCwgRVZUIFZULCBib29sIGlzVGFyZ2V0ID0gZmFsc2UpOworICBTRFZhbHVlIGdldENvbnN0YW50KGNvbnN0IENvbnN0YW50SW50ICZWYWwsIEVWVCBWVCwgYm9vbCBpc1RhcmdldCA9IGZhbHNlKTsKKyAgU0RWYWx1ZSBnZXRJbnRQdHJDb25zdGFudCh1aW50NjRfdCBWYWwsIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0Q29uc3RhbnQodWludDY0X3QgVmFsLCBFVlQgVlQpIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoVmFsLCBWVCwgdHJ1ZSk7CisgIH0KKyAgU0RWYWx1ZSBnZXRUYXJnZXRDb25zdGFudChjb25zdCBBUEludCAmVmFsLCBFVlQgVlQpIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoVmFsLCBWVCwgdHJ1ZSk7CisgIH0KKyAgU0RWYWx1ZSBnZXRUYXJnZXRDb25zdGFudChjb25zdCBDb25zdGFudEludCAmVmFsLCBFVlQgVlQpIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoVmFsLCBWVCwgdHJ1ZSk7CisgIH0KKyAgLy8gVGhlIGZvcm1zIGJlbG93IHRoYXQgdGFrZSBhIGRvdWJsZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBzaW1wbGUKKyAgLy8gY29uc3RhbnRzIHRoYXQgY2FuIGJlIGV4YWN0bHkgcmVwcmVzZW50ZWQgaW4gVlQuICBObyBjaGVja3MgYXJlIG1hZGUuCisgIFNEVmFsdWUgZ2V0Q29uc3RhbnRGUChkb3VibGUgVmFsLCBFVlQgVlQsIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0Q29uc3RhbnRGUChjb25zdCBBUEZsb2F0JiBWYWwsIEVWVCBWVCwgYm9vbCBpc1RhcmdldCA9IGZhbHNlKTsKKyAgU0RWYWx1ZSBnZXRDb25zdGFudEZQKGNvbnN0IENvbnN0YW50RlAgJkNGLCBFVlQgVlQsIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0Q29uc3RhbnRGUChkb3VibGUgVmFsLCBFVlQgVlQpIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChWYWwsIFZULCB0cnVlKTsKKyAgfQorICBTRFZhbHVlIGdldFRhcmdldENvbnN0YW50RlAoY29uc3QgQVBGbG9hdCYgVmFsLCBFVlQgVlQpIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChWYWwsIFZULCB0cnVlKTsKKyAgfQorICBTRFZhbHVlIGdldFRhcmdldENvbnN0YW50RlAoY29uc3QgQ29uc3RhbnRGUCAmVmFsLCBFVlQgVlQpIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChWYWwsIFZULCB0cnVlKTsKKyAgfQorICBTRFZhbHVlIGdldEdsb2JhbEFkZHJlc3MoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBEZWJ1Z0xvYyBETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSAwLCBib29sIGlzVGFyZ2V0R0EgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRHbG9iYWxBZGRyZXNzKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgRGVidWdMb2MgREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSB7CisgICAgcmV0dXJuIGdldEdsb2JhbEFkZHJlc3MoR1YsIERMLCBWVCwgb2Zmc2V0LCB0cnVlLCBUYXJnZXRGbGFncyk7CisgIH0KKyAgU0RWYWx1ZSBnZXRGcmFtZUluZGV4KGludCBGSSwgRVZUIFZULCBib29sIGlzVGFyZ2V0ID0gZmFsc2UpOworICBTRFZhbHVlIGdldFRhcmdldEZyYW1lSW5kZXgoaW50IEZJLCBFVlQgVlQpIHsKKyAgICByZXR1cm4gZ2V0RnJhbWVJbmRleChGSSwgVlQsIHRydWUpOworICB9CisgIFNEVmFsdWUgZ2V0SnVtcFRhYmxlKGludCBKVEksIEVWVCBWVCwgYm9vbCBpc1RhcmdldCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0SnVtcFRhYmxlKGludCBKVEksIEVWVCBWVCwgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICByZXR1cm4gZ2V0SnVtcFRhYmxlKEpUSSwgVlQsIHRydWUsIFRhcmdldEZsYWdzKTsKKyAgfQorICBTRFZhbHVlIGdldENvbnN0YW50UG9vbChjb25zdCBDb25zdGFudCAqQywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiA9IDAsIGludCBPZmZzID0gMCwgYm9vbCBpc1Q9ZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRDb25zdGFudFBvb2woY29uc3QgQ29uc3RhbnQgKkMsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24gPSAwLCBpbnQgT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnRQb29sKEMsIFZULCBBbGlnbiwgT2Zmc2V0LCB0cnVlLCBUYXJnZXRGbGFncyk7CisgIH0KKyAgU0RWYWx1ZSBnZXRDb25zdGFudFBvb2woTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpDLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduID0gMCwgaW50IE9mZnMgPSAwLCBib29sIGlzVD1mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApOworICBTRFZhbHVlIGdldFRhcmdldENvbnN0YW50UG9vbChNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZULCB1bnNpZ25lZCBBbGlnbiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9mZnNldCA9IDAsIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3M9MCkgeworICAgIHJldHVybiBnZXRDb25zdGFudFBvb2woQywgVlQsIEFsaWduLCBPZmZzZXQsIHRydWUsIFRhcmdldEZsYWdzKTsKKyAgfQorICAvLyBXaGVuIGdlbmVyYXRpbmcgYSBicmFuY2ggdG8gYSBCQiwgd2UgZG9uJ3QgaW4gZ2VuZXJhbCBrbm93IGVub3VnaAorICAvLyB0byBwcm92aWRlIGRlYnVnIGluZm8gZm9yIHRoZSBCQiBhdCB0aGF0IHRpbWUsIHNvIGtlZXAgdGhpcyBvbmUgYXJvdW5kLgorICBTRFZhbHVlIGdldEJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisgIFNEVmFsdWUgZ2V0QmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCBEZWJ1Z0xvYyBkbCk7CisgIFNEVmFsdWUgZ2V0RXh0ZXJuYWxTeW1ib2woY29uc3QgY2hhciAqU3ltLCBFVlQgVlQpOworICBTRFZhbHVlIGdldEV4dGVybmFsU3ltYm9sKGNvbnN0IGNoYXIgKlN5bSwgRGVidWdMb2MgZGwsIEVWVCBWVCk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0RXh0ZXJuYWxTeW1ib2woY29uc3QgY2hhciAqU3ltLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApOworICBTRFZhbHVlIGdldFZhbHVlVHlwZShFVlQpOworICBTRFZhbHVlIGdldFJlZ2lzdGVyKHVuc2lnbmVkIFJlZywgRVZUIFZUKTsKKyAgU0RWYWx1ZSBnZXRCbG9ja0FkZHJlc3MoY29uc3QgQmxvY2tBZGRyZXNzICpCQSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFyZ2V0ID0gZmFsc2UsIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKworICBTRFZhbHVlIGdldENvcHlUb1JlZyhTRFZhbHVlIENoYWluLCBEZWJ1Z0xvYyBkbCwgdW5zaWduZWQgUmVnLCBTRFZhbHVlIE4pIHsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkNvcHlUb1JlZywgZGwsIE1WVDo6T3RoZXIsIENoYWluLAorICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyKFJlZywgTi5nZXRWYWx1ZVR5cGUoKSksIE4pOworICB9CisKKyAgLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBnZXRDb3B5VG9SZWcgbWV0aG9kIHRha2VzIGFuIGV4dHJhIG9wZXJhbmQsIHdoaWNoCisgIC8vIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIHBvdGVudGlhbGx5IGFuIGluY29taW5nIGZsYWcgdmFsdWUgKGlmIEZsYWcgaXMgbm90CisgIC8vIG51bGwpIGFuZCB0aGF0IHRoZXJlIHNob3VsZCBiZSBhIGZsYWcgcmVzdWx0LgorICBTRFZhbHVlIGdldENvcHlUb1JlZyhTRFZhbHVlIENoYWluLCBEZWJ1Z0xvYyBkbCwgdW5zaWduZWQgUmVnLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgRmxhZykgeworICAgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBnZXRSZWdpc3RlcihSZWcsIE4uZ2V0VmFsdWVUeXBlKCkpLCBOLCBGbGFnIH07CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpDb3B5VG9SZWcsIGRsLCBWVHMsIE9wcywgRmxhZy5nZXROb2RlKCkgPyA0IDogMyk7CisgIH0KKworICAvLyBTaW1pbGFyIHRvIGxhc3QgZ2V0Q29weVRvUmVnKCkgZXhjZXB0IHBhcmFtZXRlciBSZWcgaXMgYSBTRFZhbHVlCisgIFNEVmFsdWUgZ2V0Q29weVRvUmVnKFNEVmFsdWUgQ2hhaW4sIERlYnVnTG9jIGRsLCBTRFZhbHVlIFJlZywgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgRmxhZykgeworICAgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBSZWcsIE4sIEZsYWcgfTsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkNvcHlUb1JlZywgZGwsIFZUcywgT3BzLCBGbGFnLmdldE5vZGUoKSA/IDQgOiAzKTsKKyAgfQorCisgIFNEVmFsdWUgZ2V0Q29weUZyb21SZWcoU0RWYWx1ZSBDaGFpbiwgRGVidWdMb2MgZGwsIHVuc2lnbmVkIFJlZywgRVZUIFZUKSB7CisgICAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZULCBNVlQ6Ok90aGVyKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBDaGFpbiwgZ2V0UmVnaXN0ZXIoUmVnLCBWVCkgfTsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkNvcHlGcm9tUmVnLCBkbCwgVlRzLCBPcHMsIDIpOworICB9CisKKyAgLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBnZXRDb3B5RnJvbVJlZyBtZXRob2QgdGFrZXMgYW4gZXh0cmEgb3BlcmFuZCwgd2hpY2gKKyAgLy8gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgcG90ZW50aWFsbHkgYW4gaW5jb21pbmcgZmxhZyB2YWx1ZSAoaWYgRmxhZyBpcyBub3QKKyAgLy8gbnVsbCkgYW5kIHRoYXQgdGhlcmUgc2hvdWxkIGJlIGEgZmxhZyByZXN1bHQuCisgIFNEVmFsdWUgZ2V0Q29weUZyb21SZWcoU0RWYWx1ZSBDaGFpbiwgRGVidWdMb2MgZGwsIHVuc2lnbmVkIFJlZywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBGbGFnKSB7CisgICAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZULCBNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBnZXRSZWdpc3RlcihSZWcsIFZUKSwgRmxhZyB9OworICAgIHJldHVybiBnZXROb2RlKElTRDo6Q29weUZyb21SZWcsIGRsLCBWVHMsIE9wcywgRmxhZy5nZXROb2RlKCkgPyAzIDogMik7CisgIH0KKworICBTRFZhbHVlIGdldENvbmRDb2RlKElTRDo6Q29uZENvZGUgQ29uZCk7CisKKyAgLy8vIFJldHVybnMgdGhlIENvbnZlcnRSbmRTYXQgTm90ZTogQXZvaWQgdXNpbmcgdGhpcyBub2RlIGJlY2F1c2UgaXQgbWF5CisgIC8vLyBkaXNhcHBlYXIgaW4gdGhlIGZ1dHVyZSBhbmQgbW9zdCB0YXJnZXRzIGRvbid0IHN1cHBvcnQgaXQuCisgIFNEVmFsdWUgZ2V0Q29udmVydFJuZFNhdChFVlQgVlQsIERlYnVnTG9jIGRsLCBTRFZhbHVlIFZhbCwgU0RWYWx1ZSBEVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUm5kLCBTRFZhbHVlIFNhdCwgSVNEOjpDdnRDb2RlIENvZGUpOworICAKKyAgLy8vIGdldFZlY3RvclNodWZmbGUgLSBSZXR1cm4gYW4gSVNEOjpWRUNUT1JfU0hVRkZMRSBub2RlLiAgVGhlIG51bWJlciBvZgorICAvLy8gZWxlbWVudHMgaW4gVlQsIHdoaWNoIG11c3QgYmUgYSB2ZWN0b3IgdHlwZSwgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mCisgIC8vLyBtYXNrIGVsZW1lbnRzIE51bUVsdHMuICBBIGludGVnZXIgbWFzayBlbGVtZW50IGVxdWFsIHRvIC0xIGlzIHRyZWF0ZWQgYXMKKyAgLy8vIHVuZGVmaW5lZC4KKyAgU0RWYWx1ZSBnZXRWZWN0b3JTaHVmZmxlKEVWVCBWVCwgRGVidWdMb2MgZGwsIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpNYXNrRWx0cyk7CisKKyAgLy8vIGdldFNFeHRPclRydW5jIC0gQ29udmVydCBPcCwgd2hpY2ggbXVzdCBiZSBvZiBpbnRlZ2VyIHR5cGUsIHRvIHRoZQorICAvLy8gaW50ZWdlciB0eXBlIFZULCBieSBlaXRoZXIgc2lnbi1leHRlbmRpbmcgb3IgdHJ1bmNhdGluZyBpdC4KKyAgU0RWYWx1ZSBnZXRTRXh0T3JUcnVuYyhTRFZhbHVlIE9wLCBEZWJ1Z0xvYyBETCwgRVZUIFZUKTsKKworICAvLy8gZ2V0WkV4dE9yVHJ1bmMgLSBDb252ZXJ0IE9wLCB3aGljaCBtdXN0IGJlIG9mIGludGVnZXIgdHlwZSwgdG8gdGhlCisgIC8vLyBpbnRlZ2VyIHR5cGUgVlQsIGJ5IGVpdGhlciB6ZXJvLWV4dGVuZGluZyBvciB0cnVuY2F0aW5nIGl0LgorICBTRFZhbHVlIGdldFpFeHRPclRydW5jKFNEVmFsdWUgT3AsIERlYnVnTG9jIERMLCBFVlQgVlQpOworCisgIC8vLyBnZXRaZXJvRXh0ZW5kSW5SZWcgLSBSZXR1cm4gdGhlIGV4cHJlc3Npb24gcmVxdWlyZWQgdG8gemVybyBleHRlbmQgdGhlIE9wCisgIC8vLyB2YWx1ZSBhc3N1bWluZyBpdCB3YXMgdGhlIHNtYWxsZXIgU3JjVHkgdmFsdWUuCisgIFNEVmFsdWUgZ2V0WmVyb0V4dGVuZEluUmVnKFNEVmFsdWUgT3AsIERlYnVnTG9jIERMLCBFVlQgU3JjVHkpOworCisgIC8vLyBnZXROT1QgLSBDcmVhdGUgYSBiaXR3aXNlIE5PVCBvcGVyYXRpb24gYXMgKFhPUiBWYWwsIC0xKS4KKyAgU0RWYWx1ZSBnZXROT1QoRGVidWdMb2MgREwsIFNEVmFsdWUgVmFsLCBFVlQgVlQpOworCisgIC8vLyBnZXRDQUxMU0VRX1NUQVJUIC0gUmV0dXJuIGEgbmV3IENBTExTRVFfU1RBUlQgbm9kZSwgd2hpY2ggYWx3YXlzIG11c3QgaGF2ZQorICAvLy8gYSBmbGFnIHJlc3VsdCAodG8gZW5zdXJlIGl0J3Mgbm90IENTRSdkKS4gIENBTExTRVFfU1RBUlQgZG9lcyBub3QgaGF2ZSBhCisgIC8vLyB1c2VmdWwgRGVidWdMb2MuCisgIFNEVmFsdWUgZ2V0Q0FMTFNFUV9TVEFSVChTRFZhbHVlIENoYWluLCBTRFZhbHVlIE9wKSB7CisgICAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgQ2hhaW4sICBPcCB9OworICAgIHJldHVybiBnZXROb2RlKElTRDo6Q0FMTFNFUV9TVEFSVCwgRGVidWdMb2MoKSwgVlRzLCBPcHMsIDIpOworICB9CisKKyAgLy8vIGdldENBTExTRVFfRU5EIC0gUmV0dXJuIGEgbmV3IENBTExTRVFfRU5EIG5vZGUsIHdoaWNoIGFsd2F5cyBtdXN0IGhhdmUgYQorICAvLy8gZmxhZyByZXN1bHQgKHRvIGVuc3VyZSBpdCdzIG5vdCBDU0UnZCkuICBDQUxMU0VRX0VORCBkb2VzIG5vdCBoYXZlCisgIC8vLyBhIHVzZWZ1bCBEZWJ1Z0xvYy4KKyAgU0RWYWx1ZSBnZXRDQUxMU0VRX0VORChTRFZhbHVlIENoYWluLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEluRmxhZykgeworICAgIFNEVlRMaXN0IE5vZGVUeXMgPSBnZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBPcHM7CisgICAgT3BzLnB1c2hfYmFjayhDaGFpbik7CisgICAgT3BzLnB1c2hfYmFjayhPcDEpOworICAgIE9wcy5wdXNoX2JhY2soT3AyKTsKKyAgICBPcHMucHVzaF9iYWNrKEluRmxhZyk7CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpDQUxMU0VRX0VORCwgRGVidWdMb2MoKSwgTm9kZVR5cywgJk9wc1swXSwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpT3BzLnNpemUoKSAtIChJbkZsYWcuZ2V0Tm9kZSgpID09IDAgPyAxIDogMCkpOworICB9CisKKyAgLy8vIGdldFVOREVGIC0gUmV0dXJuIGFuIFVOREVGIG5vZGUuICBVTkRFRiBkb2VzIG5vdCBoYXZlIGEgdXNlZnVsIERlYnVnTG9jLgorICBTRFZhbHVlIGdldFVOREVGKEVWVCBWVCkgeworICAgIHJldHVybiBnZXROb2RlKElTRDo6VU5ERUYsIERlYnVnTG9jKCksIFZUKTsKKyAgfQorCisgIC8vLyBnZXRHTE9CQUxfT0ZGU0VUX1RBQkxFIC0gUmV0dXJuIGEgR0xPQkFMX09GRlNFVF9UQUJMRSBub2RlLiAgVGhpcyBkb2VzCisgIC8vLyBub3QgaGF2ZSBhIHVzZWZ1bCBEZWJ1Z0xvYy4KKyAgU0RWYWx1ZSBnZXRHTE9CQUxfT0ZGU0VUX1RBQkxFKEVWVCBWVCkgeworICAgIHJldHVybiBnZXROb2RlKElTRDo6R0xPQkFMX09GRlNFVF9UQUJMRSwgRGVidWdMb2MoKSwgVlQpOworICB9CisKKyAgLy8vIGdldE5vZGUgLSBHZXRzIG9yIGNyZWF0ZXMgdGhlIHNwZWNpZmllZCBub2RlLgorICAvLy8KKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIEVWVCBWVCk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBFVlQgVlQsIFNEVmFsdWUgTik7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBFVlQgVlQsIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMiwgU0RWYWx1ZSBOMyk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4xLCBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zLCBTRFZhbHVlIE40KTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMsIFNEVmFsdWUgTjQsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE41KTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcyk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpPcHMsIHVuc2lnbmVkIE51bU9wcyk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RVZUPiAmUmVzdWx0VHlzLAorICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgY29uc3QgRVZUICpWVHMsIHVuc2lnbmVkIE51bVZUcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIFNEVlRMaXN0IFZUcyk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBTRFZUTGlzdCBWVHMsIFNEVmFsdWUgTik7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4xLCBTRFZhbHVlIE4yKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMiwgU0RWYWx1ZSBOMywgU0RWYWx1ZSBONCk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4xLCBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zLCBTRFZhbHVlIE40LAorICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBONSk7CisKKyAgLy8vIGdldFN0YWNrQXJndW1lbnRUb2tlbkZhY3RvciAtIENvbXB1dGUgYSBUb2tlbkZhY3RvciB0byBmb3JjZSBhbGwKKyAgLy8vIHRoZSBpbmNvbWluZyBzdGFjayBhcmd1bWVudHMgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHN0YWNrLiBUaGlzIGlzCisgIC8vLyB1c2VkIGluIHRhaWwgY2FsbCBsb3dlcmluZyB0byBwcm90ZWN0IHN0YWNrIGFyZ3VtZW50cyBmcm9tIGJlaW5nCisgIC8vLyBjbG9iYmVyZWQuCisgIFNEVmFsdWUgZ2V0U3RhY2tBcmd1bWVudFRva2VuRmFjdG9yKFNEVmFsdWUgQ2hhaW4pOworCisgIFNEVmFsdWUgZ2V0TWVtY3B5KFNEVmFsdWUgQ2hhaW4sIERlYnVnTG9jIGRsLCBTRFZhbHVlIERzdCwgU0RWYWx1ZSBTcmMsCisgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU2l6ZSwgdW5zaWduZWQgQWxpZ24sIGJvb2wgaXNWb2wsIGJvb2wgQWx3YXlzSW5saW5lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqRHN0U1YsIHVpbnQ2NF90IERzdFNWT2ZmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqU3JjU1YsIHVpbnQ2NF90IFNyY1NWT2ZmKTsKKworICBTRFZhbHVlIGdldE1lbW1vdmUoU0RWYWx1ZSBDaGFpbiwgRGVidWdMb2MgZGwsIFNEVmFsdWUgRHN0LCBTRFZhbHVlIFNyYywKKyAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU2l6ZSwgdW5zaWduZWQgQWxpZ24sIGJvb2wgaXNWb2wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqRHN0U1YsIHVpbnQ2NF90IERzdE9TVmZmLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNyY1NWLCB1aW50NjRfdCBTcmNTVk9mZik7CisKKyAgU0RWYWx1ZSBnZXRNZW1zZXQoU0RWYWx1ZSBDaGFpbiwgRGVidWdMb2MgZGwsIFNEVmFsdWUgRHN0LCBTRFZhbHVlIFNyYywKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTaXplLCB1bnNpZ25lZCBBbGlnbiwgYm9vbCBpc1ZvbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkRzdFNWLCB1aW50NjRfdCBEc3RTVk9mZik7CisKKyAgLy8vIGdldFNldENDIC0gSGVscGVyIGZ1bmN0aW9uIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIFNldENDJ3MgaWYgeW91IGp1c3QKKyAgLy8vIGhhdmUgYW4gSVNEOjpDb25kQ29kZSBpbnN0ZWFkIG9mIGFuIFNEVmFsdWUuCisgIC8vLworICBTRFZhbHVlIGdldFNldENDKERlYnVnTG9jIERMLCBFVlQgVlQsIFNEVmFsdWUgTEhTLCBTRFZhbHVlIFJIUywKKyAgICAgICAgICAgICAgICAgICBJU0Q6OkNvbmRDb2RlIENvbmQpIHsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OlNFVENDLCBETCwgVlQsIExIUywgUkhTLCBnZXRDb25kQ29kZShDb25kKSk7CisgIH0KKworICAvLy8gZ2V0VlNldENDIC0gSGVscGVyIGZ1bmN0aW9uIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIFZTZXRDQydzIG5vZGVzCisgIC8vLyBpZiB5b3UganVzdCBoYXZlIGFuIElTRDo6Q29uZENvZGUgaW5zdGVhZCBvZiBhbiBTRFZhbHVlLgorICAvLy8KKyAgU0RWYWx1ZSBnZXRWU2V0Q0MoRGVidWdMb2MgREwsIEVWVCBWVCwgU0RWYWx1ZSBMSFMsIFNEVmFsdWUgUkhTLAorICAgICAgICAgICAgICAgICAgICBJU0Q6OkNvbmRDb2RlIENvbmQpIHsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OlZTRVRDQywgREwsIFZULCBMSFMsIFJIUywgZ2V0Q29uZENvZGUoQ29uZCkpOworICB9CisKKyAgLy8vIGdldFNlbGVjdENDIC0gSGVscGVyIGZ1bmN0aW9uIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIFNlbGVjdENDJ3MgaWYgeW91CisgIC8vLyBqdXN0IGhhdmUgYW4gSVNEOjpDb25kQ29kZSBpbnN0ZWFkIG9mIGFuIFNEVmFsdWUuCisgIC8vLworICBTRFZhbHVlIGdldFNlbGVjdENDKERlYnVnTG9jIERMLCBTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBUcnVlLCBTRFZhbHVlIEZhbHNlLCBJU0Q6OkNvbmRDb2RlIENvbmQpIHsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OlNFTEVDVF9DQywgREwsIFRydWUuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgTEhTLCBSSFMsIFRydWUsIEZhbHNlLCBnZXRDb25kQ29kZShDb25kKSk7CisgIH0KKworICAvLy8gZ2V0VkFBcmcgLSBWQUFyZyBwcm9kdWNlcyBhIHJlc3VsdCBhbmQgdG9rZW4gY2hhaW4sIGFuZCB0YWtlcyBhIHBvaW50ZXIKKyAgLy8vIGFuZCBhIHNvdXJjZSB2YWx1ZSBhcyBpbnB1dC4KKyAgU0RWYWx1ZSBnZXRWQUFyZyhFVlQgVlQsIERlYnVnTG9jIGRsLCBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwKKyAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNWLCB1bnNpZ25lZCBBbGlnbik7CisKKyAgLy8vIGdldEF0b21pYyAtIEdldHMgYSBub2RlIGZvciBhbiBhdG9taWMgb3AsIHByb2R1Y2VzIHJlc3VsdCBhbmQgY2hhaW4gYW5kCisgIC8vLyB0YWtlcyAzIG9wZXJhbmRzCisgIFNEVmFsdWUgZ2V0QXRvbWljKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBNZW1WVCwgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBQdHIsIFNEVmFsdWUgQ21wLCBTRFZhbHVlIFN3cCwgY29uc3QgVmFsdWUqIFB0clZhbCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50PTApOworICBTRFZhbHVlIGdldEF0b21pYyh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgTWVtVlQsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyLCBTRFZhbHVlIENtcCwgU0RWYWx1ZSBTd3AsCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworCisgIC8vLyBnZXRBdG9taWMgLSBHZXRzIGEgbm9kZSBmb3IgYW4gYXRvbWljIG9wLCBwcm9kdWNlcyByZXN1bHQgYW5kIGNoYWluIGFuZAorICAvLy8gdGFrZXMgMiBvcGVyYW5kcy4KKyAgU0RWYWx1ZSBnZXRBdG9taWModW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBkbCwgRVZUIE1lbVZULCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFB0ciwgU0RWYWx1ZSBWYWwsIGNvbnN0IFZhbHVlKiBQdHJWYWwsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCA9IDApOworICBTRFZhbHVlIGdldEF0b21pYyh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgTWVtVlQsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyLCBTRFZhbHVlIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIGdldE1lbUludHJpbnNpY05vZGUgLSBDcmVhdGVzIGEgTWVtSW50cmluc2ljTm9kZSB0aGF0IG1heSBwcm9kdWNlIGEKKyAgLy8vIHJlc3VsdCBhbmQgdGFrZXMgYSBsaXN0IG9mIG9wZXJhbmRzLiBPcGNvZGUgbWF5IGJlIElOVFJJTlNJQ19WT0lELAorICAvLy8gSU5UUklOU0lDX1dfQ0hBSU4sIG9yIGEgdGFyZ2V0LXNwZWNpZmljIG9wY29kZSB3aXRoIGEgdmFsdWUgbm90CisgIC8vLyBsZXNzIHRoYW4gRklSU1RfVEFSR0VUX01FTU9SWV9PUENPREUuCisgIFNEVmFsdWUgZ2V0TWVtSW50cmluc2ljTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZUICpWVHMsIHVuc2lnbmVkIE51bVZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIE1lbVZULCBjb25zdCBWYWx1ZSAqc3JjVmFsdWUsIGludCBTVk9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduID0gMCwgYm9vbCBWb2wgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVhZE1lbSA9IHRydWUsIGJvb2wgV3JpdGVNZW0gPSB0cnVlKTsKKworICBTRFZhbHVlIGdldE1lbUludHJpbnNpY05vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBkbCwgU0RWVExpc3QgVlRMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTWVtVlQsIGNvbnN0IFZhbHVlICpzcmNWYWx1ZSwgaW50IFNWT2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24gPSAwLCBib29sIFZvbCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWFkTWVtID0gdHJ1ZSwgYm9vbCBXcml0ZU1lbSA9IHRydWUpOworCisgIFNEVmFsdWUgZ2V0TWVtSW50cmluc2ljTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBTRFZUTGlzdCBWVExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBNZW1WVCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIGdldE1lcmdlVmFsdWVzIC0gQ3JlYXRlIGEgTUVSR0VfVkFMVUVTIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gb3BlcmFuZHMuCisgIFNEVmFsdWUgZ2V0TWVyZ2VWYWx1ZXMoY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsIERlYnVnTG9jIGRsKTsKKworICAvLy8gZ2V0TG9hZCAtIExvYWRzIGFyZSBub3Qgbm9ybWFsIGJpbmFyeSBvcGVyYXRvcnM6IHRoZWlyIHJlc3VsdCB0eXBlIGlzIG5vdAorICAvLy8gZGV0ZXJtaW5lZCBieSB0aGVpciBvcGVyYW5kcywgYW5kIHRoZXkgcHJvZHVjZSBhIHZhbHVlIEFORCBhIHRva2VuIGNoYWluLgorICAvLy8KKyAgU0RWYWx1ZSBnZXRMb2FkKEVWVCBWVCwgRGVidWdMb2MgZGwsIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgUHRyLAorICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNWLCBpbnQgU1ZPZmZzZXQsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgaXNOb25UZW1wb3JhbCwgdW5zaWduZWQgQWxpZ25tZW50KTsKKyAgU0RWYWx1ZSBnZXRFeHRMb2FkKElTRDo6TG9hZEV4dFR5cGUgRXh0VHlwZSwgRVZUIFZULCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgUHRyLCBjb25zdCBWYWx1ZSAqU1YsCisgICAgICAgICAgICAgICAgICAgICBpbnQgU1ZPZmZzZXQsIEVWVCBNZW1WVCwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc05vblRlbXBvcmFsLCB1bnNpZ25lZCBBbGlnbm1lbnQpOworICBTRFZhbHVlIGdldEluZGV4ZWRMb2FkKFNEVmFsdWUgT3JpZ0xvYWQsIERlYnVnTG9jIGRsLCBTRFZhbHVlIEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPZmZzZXQsIElTRDo6TWVtSW5kZXhlZE1vZGUgQU0pOworICBTRFZhbHVlIGdldExvYWQoSVNEOjpNZW1JbmRleGVkTW9kZSBBTSwgSVNEOjpMb2FkRXh0VHlwZSBFeHRUeXBlLAorICAgICAgICAgICAgICAgICAgRVZUIFZULCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgUHRyLCBTRFZhbHVlIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpTViwgaW50IFNWT2Zmc2V0LCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICBib29sIGlzVm9sYXRpbGUsIGJvb2wgaXNOb25UZW1wb3JhbCwgdW5zaWduZWQgQWxpZ25tZW50KTsKKyAgU0RWYWx1ZSBnZXRMb2FkKElTRDo6TWVtSW5kZXhlZE1vZGUgQU0sIElTRDo6TG9hZEV4dFR5cGUgRXh0VHlwZSwKKyAgICAgICAgICAgICAgICAgIEVWVCBWVCwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwgU0RWYWx1ZSBPZmZzZXQsCisgICAgICAgICAgICAgICAgICBFVlQgTWVtVlQsIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworCisgIC8vLyBnZXRTdG9yZSAtIEhlbHBlciBmdW5jdGlvbiB0byBidWlsZCBJU0Q6OlNUT1JFIG5vZGVzLgorICAvLy8KKyAgU0RWYWx1ZSBnZXRTdG9yZShTRFZhbHVlIENoYWluLCBEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBWYWwsIFNEVmFsdWUgUHRyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpTViwgaW50IFNWT2Zmc2V0LCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBpc05vblRlbXBvcmFsLCB1bnNpZ25lZCBBbGlnbm1lbnQpOworICBTRFZhbHVlIGdldFN0b3JlKFNEVmFsdWUgQ2hhaW4sIERlYnVnTG9jIGRsLCBTRFZhbHVlIFZhbCwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisgIFNEVmFsdWUgZ2V0VHJ1bmNTdG9yZShTRFZhbHVlIENoYWluLCBEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBWYWwsIFNEVmFsdWUgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNWLCBpbnQgU1ZPZmZzZXQsIEVWVCBUVlQsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTm9uVGVtcG9yYWwsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCk7CisgIFNEVmFsdWUgZ2V0VHJ1bmNTdG9yZShTRFZhbHVlIENoYWluLCBEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBWYWwsIFNEVmFsdWUgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFRWVCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisgIFNEVmFsdWUgZ2V0SW5kZXhlZFN0b3JlKFNEVmFsdWUgT3JpZ1N0b2UsIERlYnVnTG9jIGRsLCBTRFZhbHVlIEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9mZnNldCwgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSk7CisKKyAgLy8vIGdldFNyY1ZhbHVlIC0gQ29uc3RydWN0IGEgbm9kZSB0byB0cmFjayBhIFZhbHVlKiB0aHJvdWdoIHRoZSBiYWNrZW5kLgorICBTRFZhbHVlIGdldFNyY1ZhbHVlKGNvbnN0IFZhbHVlICp2KTsKKworICAvLy8gZ2V0TUROb2RlIC0gUmV0dXJuIGFuIE1ETm9kZVNETm9kZSB3aGljaCBob2xkcyBhbiBNRE5vZGUuCisgIFNEVmFsdWUgZ2V0TUROb2RlKGNvbnN0IE1ETm9kZSAqTUQpOworICAKKyAgLy8vIGdldFNoaWZ0QW1vdW50T3BlcmFuZCAtIFJldHVybiB0aGUgc3BlY2lmaWVkIHZhbHVlIGNhc3RlZCB0bworICAvLy8gdGhlIHRhcmdldCdzIGRlc2lyZWQgc2hpZnQgYW1vdW50IHR5cGUuCisgIFNEVmFsdWUgZ2V0U2hpZnRBbW91bnRPcGVyYW5kKFNEVmFsdWUgT3ApOworCisgIC8vLyBVcGRhdGVOb2RlT3BlcmFuZHMgLSAqTXV0YXRlKiB0aGUgc3BlY2lmaWVkIG5vZGUgaW4tcGxhY2UgdG8gaGF2ZSB0aGUKKyAgLy8vIHNwZWNpZmllZCBvcGVyYW5kcy4gIElmIHRoZSByZXN1bHRhbnQgbm9kZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgREFHLAorICAvLy8gdGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIHNwZWNpZmllZCBub2RlLCBpbnN0ZWFkIGl0IHJldHVybnMgdGhlIG5vZGUgdGhhdAorICAvLy8gYWxyZWFkeSBleGlzdHMuICBJZiB0aGUgcmVzdWx0YW50IG5vZGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIERBRywgdGhlCisgIC8vLyBpbnB1dCBub2RlIGlzIHJldHVybmVkLiAgQXMgYSBkZWdlbmVyYXRlIGNhc2UsIGlmIHlvdSBzcGVjaWZ5IHRoZSBzYW1lCisgIC8vLyBpbnB1dCBvcGVyYW5kcyBhcyB0aGUgbm9kZSBhbHJlYWR5IGhhcywgdGhlIGlucHV0IG5vZGUgaXMgcmV0dXJuZWQuCisgIFNETm9kZSAqVXBkYXRlTm9kZU9wZXJhbmRzKFNETm9kZSAqTiwgU0RWYWx1ZSBPcCk7CisgIFNETm9kZSAqVXBkYXRlTm9kZU9wZXJhbmRzKFNETm9kZSAqTiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyKTsKKyAgU0ROb2RlICpVcGRhdGVOb2RlT3BlcmFuZHMoU0ROb2RlICpOLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDMpOworICBTRE5vZGUgKlVwZGF0ZU5vZGVPcGVyYW5kcyhTRE5vZGUgKk4sIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMywgU0RWYWx1ZSBPcDQpOworICBTRE5vZGUgKlVwZGF0ZU5vZGVPcGVyYW5kcyhTRE5vZGUgKk4sIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMywgU0RWYWx1ZSBPcDQsIFNEVmFsdWUgT3A1KTsKKyAgU0ROb2RlICpVcGRhdGVOb2RlT3BlcmFuZHMoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKTsKKworICAvLy8gU2VsZWN0Tm9kZVRvIC0gVGhlc2UgYXJlIHVzZWQgZm9yIHRhcmdldCBzZWxlY3RvcnMgdG8gKm11dGF0ZSogdGhlCisgIC8vLyBzcGVjaWZpZWQgbm9kZSB0byBoYXZlIHRoZSBzcGVjaWZpZWQgcmV0dXJuIHR5cGUsIFRhcmdldCBvcGNvZGUsIGFuZAorICAvLy8gb3BlcmFuZHMuICBOb3RlIHRoYXQgdGFyZ2V0IG9wY29kZXMgYXJlIHN0b3JlZCBhcworICAvLy8gflRhcmdldE9wY29kZSBpbiB0aGUgbm9kZSBvcGNvZGUgZmllbGQuICBUaGUgcmVzdWx0YW50IG5vZGUgaXMgcmV0dXJuZWQuCisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZULCBTRFZhbHVlIE9wMSk7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMik7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwgU0RWYWx1ZSBPcDMpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpPcHMsIHVuc2lnbmVkIE51bU9wcyk7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQxLCBFVlQgVlQyKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBUYXJnZXRPcGMsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBUYXJnZXRPcGMsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIEVWVCBWVDMsIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBNYWNoaW5lT3BjLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBFVlQgVlQzLCBFVlQgVlQ0LCBjb25zdCBTRFZhbHVlICpPcHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bU9wcyk7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBTRFZhbHVlIE9wMSk7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMyk7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBFVlQgVlQzLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsIFNEVmFsdWUgT3AzKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBUYXJnZXRPcGMsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpOworCisgIC8vLyBNb3JwaE5vZGVUbyAtIFRoaXMgKm11dGF0ZXMqIHRoZSBzcGVjaWZpZWQgbm9kZSB0byBoYXZlIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJldHVybiB0eXBlLCBvcGNvZGUsIGFuZCBvcGVyYW5kcy4KKyAgU0ROb2RlICpNb3JwaE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIE9wYywgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKTsKKworICAvLy8gZ2V0TWFjaGluZU5vZGUgLSBUaGVzZSBhcmUgdXNlZCBmb3IgdGFyZ2V0IHNlbGVjdG9ycyB0byBjcmVhdGUgYSBuZXcgbm9kZQorICAvLy8gd2l0aCBzcGVjaWZpZWQgcmV0dXJuIHR5cGUocyksIE1hY2hpbmVJbnN0ciBvcGNvZGUsIGFuZCBvcGVyYW5kcy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZ2V0TWFjaGluZU5vZGUgcmV0dXJucyB0aGUgcmVzdWx0YW50IG5vZGUuICBJZiB0aGVyZSBpcyBhbHJlYWR5CisgIC8vLyBhIG5vZGUgb2YgdGhlIHNwZWNpZmllZCBvcGNvZGUgYW5kIG9wZXJhbmRzLCBpdCByZXR1cm5zIHRoYXQgbm9kZSBpbnN0ZWFkCisgIC8vLyBvZiB0aGUgY3VycmVudCBvbmUuCisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVCk7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDEpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMik7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsIFNEVmFsdWUgT3AzKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBkbCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBkbCwgRVZUIFZUMSwgRVZUIFZUMik7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVDEsIEVWVCBWVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDEpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMik7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMyk7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVDEsIEVWVCBWVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgVlQxLCBFVlQgVlQyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDMsIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMik7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVDEsIEVWVCBWVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMywgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMyk7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVDEsIEVWVCBWVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMywgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgVlQxLCBFVlQgVlQyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDMsIEVWVCBWVDQsIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxFVlQ+ICZSZXN1bHRUeXMsIGNvbnN0IFNEVmFsdWUgKk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1PcHMpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpOworCisgIC8vLyBnZXRUYXJnZXRFeHRyYWN0U3VicmVnIC0gQSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcKKyAgLy8vIFRhcmdldEluc3RySW5mbzo6RVhUUkFDVF9TVUJSRUcgbm9kZXMuCisgIFNEVmFsdWUgZ2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhpbnQgU1JJZHgsIERlYnVnTG9jIERMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wZXJhbmQpOworCisgIC8vLyBnZXRUYXJnZXRJbnNlcnRTdWJyZWcgLSBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjcmVhdGluZworICAvLy8gVGFyZ2V0SW5zdHJJbmZvOjpJTlNFUlRfU1VCUkVHIG5vZGVzLgorICBTRFZhbHVlIGdldFRhcmdldEluc2VydFN1YnJlZyhpbnQgU1JJZHgsIERlYnVnTG9jIERMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3BlcmFuZCwgU0RWYWx1ZSBTdWJyZWcpOworCisgIC8vLyBnZXROb2RlSWZFeGlzdHMgLSBHZXQgdGhlIHNwZWNpZmllZCBub2RlIGlmIGl0J3MgYWxyZWFkeSBhdmFpbGFibGUsIG9yCisgIC8vLyBlbHNlIHJldHVybiBOVUxMLgorICBTRE5vZGUgKmdldE5vZGVJZkV4aXN0cyh1bnNpZ25lZCBPcGNvZGUsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpOworCisgIC8vLyBnZXREYmdWYWx1ZSAtIENyZWF0ZXMgYSBTRERiZ1ZhbHVlIG5vZGUuCisgIC8vLworICBTRERiZ1ZhbHVlICpnZXREYmdWYWx1ZShNRE5vZGUgKk1EUHRyLCBTRE5vZGUgKk4sIHVuc2lnbmVkIFIsIHVpbnQ2NF90IE9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsIHVuc2lnbmVkIE8pOworICBTRERiZ1ZhbHVlICpnZXREYmdWYWx1ZShNRE5vZGUgKk1EUHRyLCBjb25zdCBWYWx1ZSAqQywgdWludDY0X3QgT2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBETCwgdW5zaWduZWQgTyk7CisgIFNERGJnVmFsdWUgKmdldERiZ1ZhbHVlKE1ETm9kZSAqTURQdHIsIHVuc2lnbmVkIEZJLCB1aW50NjRfdCBPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMLCB1bnNpZ25lZCBPKTsKKworICAvLy8gREFHVXBkYXRlTGlzdGVuZXIgLSBDbGllbnRzIG9mIHZhcmlvdXMgQVBJcyB0aGF0IGNhdXNlIGdsb2JhbCBlZmZlY3RzIG9uCisgIC8vLyB0aGUgREFHIGNhbiBvcHRpb25hbGx5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gIFRoaXMgYWxsb3dzIHRoZSBjbGllbnRzCisgIC8vLyB0byBoYW5kbGUgdGhlIHZhcmlvdXMgc29ydHMgb2YgdXBkYXRlcyB0aGF0IGhhcHBlbi4KKyAgY2xhc3MgREFHVXBkYXRlTGlzdGVuZXIgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+REFHVXBkYXRlTGlzdGVuZXIoKTsKKworICAgIC8vLyBOb2RlRGVsZXRlZCAtIFRoZSBub2RlIE4gdGhhdCB3YXMgZGVsZXRlZCBhbmQsIGlmIEUgaXMgbm90IG51bGwsIGFuCisgICAgLy8vIGVxdWl2YWxlbnQgbm9kZSBFIHRoYXQgcmVwbGFjZWQgaXQuCisgICAgdmlydHVhbCB2b2lkIE5vZGVEZWxldGVkKFNETm9kZSAqTiwgU0ROb2RlICpFKSA9IDA7CisKKyAgICAvLy8gTm9kZVVwZGF0ZWQgLSBUaGUgbm9kZSBOIHRoYXQgd2FzIHVwZGF0ZWQuCisgICAgdmlydHVhbCB2b2lkIE5vZGVVcGRhdGVkKFNETm9kZSAqTikgPSAwOworICB9OworCisgIC8vLyBSZW1vdmVEZWFkTm9kZSAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG5vZGUgZnJvbSB0aGUgc3lzdGVtLiBJZiBhbnkgb2YgaXRzCisgIC8vLyBvcGVyYW5kcyB0aGVuIGJlY29tZXMgZGVhZCwgcmVtb3ZlIHRoZW0gYXMgd2VsbC4gSW5mb3JtIFVwZGF0ZUxpc3RlbmVyCisgIC8vLyBmb3IgZWFjaCBub2RlIGRlbGV0ZWQuCisgIHZvaWQgUmVtb3ZlRGVhZE5vZGUoU0ROb2RlICpOLCBEQUdVcGRhdGVMaXN0ZW5lciAqVXBkYXRlTGlzdGVuZXIgPSAwKTsKKworICAvLy8gUmVtb3ZlRGVhZE5vZGVzIC0gVGhpcyBtZXRob2QgZGVsZXRlcyB0aGUgdW5yZWFjaGFibGUgbm9kZXMgaW4gdGhlCisgIC8vLyBnaXZlbiBsaXN0LCBhbmQgYW55IG5vZGVzIHRoYXQgYmVjb21lIHVucmVhY2hhYmxlIGFzIGEgcmVzdWx0LgorICB2b2lkIFJlbW92ZURlYWROb2RlcyhTbWFsbFZlY3RvckltcGw8U0ROb2RlICo+ICZEZWFkTm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgIERBR1VwZGF0ZUxpc3RlbmVyICpVcGRhdGVMaXN0ZW5lciA9IDApOworCisgIC8vLyBSZXBsYWNlQWxsVXNlc1dpdGggLSBNb2RpZnkgYW55dGhpbmcgdXNpbmcgJ0Zyb20nIHRvIHVzZSAnVG8nIGluc3RlYWQuCisgIC8vLyBUaGlzIGNhbiBjYXVzZSByZWN1cnNpdmUgbWVyZ2luZyBvZiBub2RlcyBpbiB0aGUgREFHLiAgVXNlIHRoZSBmaXJzdAorICAvLy8gdmVyc2lvbiBpZiAnRnJvbScgaXMga25vd24gdG8gaGF2ZSBhIHNpbmdsZSByZXN1bHQsIHVzZSB0aGUgc2Vjb25kCisgIC8vLyBpZiB5b3UgaGF2ZSB0d28gbm9kZXMgd2l0aCBpZGVudGljYWwgcmVzdWx0cyAob3IgaWYgJ1RvJyBoYXMgYSBzdXBlcnNldAorICAvLy8gb2YgdGhlIHJlc3VsdHMgb2YgJ0Zyb20nKSwgdXNlIHRoZSB0aGlyZCBvdGhlcndpc2UuCisgIC8vLworICAvLy8gVGhlc2UgbWV0aG9kcyBhbGwgdGFrZSBhbiBvcHRpb25hbCBVcGRhdGVMaXN0ZW5lciwgd2hpY2ggKGlmIG5vdCBudWxsKSBpcworICAvLy8gaW5mb3JtZWQgYWJvdXQgbm9kZXMgdGhhdCBhcmUgZGVsZXRlZCBhbmQgbW9kaWZpZWQgZHVlIHRvIHJlY3Vyc2l2ZQorICAvLy8gY2hhbmdlcyBpbiB0aGUgZGFnLgorICAvLy8KKyAgLy8vIFRoZXNlIGZ1bmN0aW9ucyBvbmx5IHJlcGxhY2UgYWxsIGV4aXN0aW5nIHVzZXMuIEl0J3MgcG9zc2libGUgdGhhdCBhcworICAvLy8gdGhlc2UgcmVwbGFjZW1lbnRzIGFyZSBiZWluZyBwZXJmb3JtZWQsIENTRSBtYXkgY2F1c2UgdGhlIEZyb20gbm9kZQorICAvLy8gdG8gYmUgZ2l2ZW4gbmV3IHVzZXMuIFRoZXNlIG5ldyB1c2VzIG9mIEZyb20gYXJlIGxlZnQgaW4gcGxhY2UsIGFuZAorICAvLy8gbm90IGF1dG9tYXRpY2FsbHkgdHJhbnNmZXJlZCB0byBUby4KKyAgLy8vCisgIHZvaWQgUmVwbGFjZUFsbFVzZXNXaXRoKFNEVmFsdWUgRnJvbSwgU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHVXBkYXRlTGlzdGVuZXIgKlVwZGF0ZUxpc3RlbmVyID0gMCk7CisgIHZvaWQgUmVwbGFjZUFsbFVzZXNXaXRoKFNETm9kZSAqRnJvbSwgU0ROb2RlICpUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHVXBkYXRlTGlzdGVuZXIgKlVwZGF0ZUxpc3RlbmVyID0gMCk7CisgIHZvaWQgUmVwbGFjZUFsbFVzZXNXaXRoKFNETm9kZSAqRnJvbSwgY29uc3QgU0RWYWx1ZSAqVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBR1VwZGF0ZUxpc3RlbmVyICpVcGRhdGVMaXN0ZW5lciA9IDApOworCisgIC8vLyBSZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoIC0gUmVwbGFjZSBhbnkgdXNlcyBvZiBGcm9tIHdpdGggVG8sIGxlYXZpbmcKKyAgLy8vIHVzZXMgb2Ygb3RoZXIgdmFsdWVzIHByb2R1Y2VkIGJ5IEZyb20uVmFsIGFsb25lLgorICB2b2lkIFJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZSBGcm9tLCBTRFZhbHVlIFRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHVXBkYXRlTGlzdGVuZXIgKlVwZGF0ZUxpc3RlbmVyID0gMCk7CisKKyAgLy8vIFJlcGxhY2VBbGxVc2VzT2ZWYWx1ZXNXaXRoIC0gTGlrZSBSZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoLCBidXQKKyAgLy8vIGZvciBtdWx0aXBsZSB2YWx1ZXMgYXQgb25jZS4gVGhpcyBjb3JyZWN0bHkgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZQorICAvLy8gdGhlcmUgaXMgYW4gb3ZlcmxhcCBiZXR3ZWVuIHRoZSBGcm9tIHZhbHVlcyBhbmQgdGhlIFRvIHZhbHVlcy4KKyAgdm9pZCBSZXBsYWNlQWxsVXNlc09mVmFsdWVzV2l0aChjb25zdCBTRFZhbHVlICpGcm9tLCBjb25zdCBTRFZhbHVlICpUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHVXBkYXRlTGlzdGVuZXIgKlVwZGF0ZUxpc3RlbmVyID0gMCk7CisKKyAgLy8vIEFzc2lnblRvcG9sb2dpY2FsT3JkZXIgLSBUb3BvbG9naWNhbC1zb3J0IHRoZSBBbGxOb2RlcyBsaXN0IGFuZCBhCisgIC8vLyBhc3NpZ24gYSB1bmlxdWUgbm9kZSBpZCBmb3IgZWFjaCBub2RlIGluIHRoZSBEQUcgYmFzZWQgb24gdGhlaXIKKyAgLy8vIHRvcG9sb2dpY2FsIG9yZGVyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMuCisgIHVuc2lnbmVkIEFzc2lnblRvcG9sb2dpY2FsT3JkZXIoKTsKKworICAvLy8gUmVwb3NpdGlvbk5vZGUgLSBNb3ZlIG5vZGUgTiBpbiB0aGUgQWxsTm9kZXMgbGlzdCB0byBiZSBpbW1lZGlhdGVseQorICAvLy8gYmVmb3JlIHRoZSBnaXZlbiBpdGVyYXRvciBQb3NpdGlvbi4gVGhpcyBtYXkgYmUgdXNlZCB0byB1cGRhdGUgdGhlCisgIC8vLyB0b3BvbG9naWNhbCBvcmRlcmluZyB3aGVuIHRoZSBsaXN0IG9mIG5vZGVzIGlzIG1vZGlmaWVkLgorICB2b2lkIFJlcG9zaXRpb25Ob2RlKGFsbG5vZGVzX2l0ZXJhdG9yIFBvc2l0aW9uLCBTRE5vZGUgKk4pIHsKKyAgICBBbGxOb2Rlcy5pbnNlcnQoUG9zaXRpb24sIEFsbE5vZGVzLnJlbW92ZShOKSk7CisgIH0KKworICAvLy8gaXNDb21tdXRhdGl2ZUJpbk9wIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBvcGNvZGUgaXMgYSBjb21tdXRhdGl2ZSBiaW5hcnkKKyAgLy8vIG9wZXJhdGlvbi4KKyAgc3RhdGljIGJvb2wgaXNDb21tdXRhdGl2ZUJpbk9wKHVuc2lnbmVkIE9wY29kZSkgeworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBnZXQgaXRzIGluZm8gZnJvbSB0aGUgdGQgZmlsZSwgc28gdGhhdCB3ZSBjYW4gaW5jbHVkZQorICAgIC8vIHRhcmdldCBpbmZvLgorICAgIHN3aXRjaCAoT3Bjb2RlKSB7CisgICAgY2FzZSBJU0Q6OkFERDoKKyAgICBjYXNlIElTRDo6TVVMOgorICAgIGNhc2UgSVNEOjpNVUxIVToKKyAgICBjYXNlIElTRDo6TVVMSFM6CisgICAgY2FzZSBJU0Q6OlNNVUxfTE9ISToKKyAgICBjYXNlIElTRDo6VU1VTF9MT0hJOgorICAgIGNhc2UgSVNEOjpGQUREOgorICAgIGNhc2UgSVNEOjpGTVVMOgorICAgIGNhc2UgSVNEOjpBTkQ6CisgICAgY2FzZSBJU0Q6Ok9SOgorICAgIGNhc2UgSVNEOjpYT1I6CisgICAgY2FzZSBJU0Q6OlNBRERPOgorICAgIGNhc2UgSVNEOjpVQURETzoKKyAgICBjYXNlIElTRDo6QUREQzoKKyAgICBjYXNlIElTRDo6QURERTogcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vLyBBc3NpZ25PcmRlcmluZyAtIEFzc2lnbiBhbiBvcmRlciB0byB0aGUgU0ROb2RlLgorICB2b2lkIEFzc2lnbk9yZGVyaW5nKGNvbnN0IFNETm9kZSAqU0QsIHVuc2lnbmVkIE9yZGVyKTsKKworICAvLy8gR2V0T3JkZXJpbmcgLSBHZXQgdGhlIG9yZGVyIGZvciB0aGUgU0ROb2RlLgorICB1bnNpZ25lZCBHZXRPcmRlcmluZyhjb25zdCBTRE5vZGUgKlNEKSBjb25zdDsKKworICAvLy8gQWRkRGJnVmFsdWUgLSBBZGQgYSBkYmdfdmFsdWUgU0ROb2RlLiBJZiBTRCBpcyBub24tbnVsbCB0aGF0IG1lYW5zIHRoZQorICAvLy8gdmFsdWUgaXMgcHJvZHVjZWQgYnkgU0QuCisgIHZvaWQgQWRkRGJnVmFsdWUoU0REYmdWYWx1ZSAqREIsIFNETm9kZSAqU0QsIGJvb2wgaXNQYXJhbWV0ZXIpOworCisgIC8vLyBHZXREYmdWYWx1ZXMgLSBHZXQgdGhlIGRlYnVnIHZhbHVlcyB3aGljaCByZWZlcmVuY2UgdGhlIGdpdmVuIFNETm9kZS4KKyAgU21hbGxWZWN0b3I8U0REYmdWYWx1ZSosMj4gJkdldERiZ1ZhbHVlcyhjb25zdCBTRE5vZGUqIFNEKSB7CisgICAgcmV0dXJuIERiZ0luZm8tPmdldFNERGJnVmFsdWVzKFNEKTsKKyAgfQorCisgIC8vLyBoYXNEZWJ1Z1ZhbHVlcyAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgU0REYmdWYWx1ZSBub2RlcyBhc3NvY2lhdGVkCisgIC8vLyB3aXRoIHRoaXMgU2VsZWN0aW9uREFHLgorICBib29sIGhhc0RlYnVnVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gIURiZ0luZm8tPmVtcHR5KCk7IH0KKworICBTRERiZ0luZm86OkRiZ0l0ZXJhdG9yIERiZ0JlZ2luKCkgeyByZXR1cm4gRGJnSW5mby0+RGJnQmVnaW4oKTsgfQorICBTRERiZ0luZm86OkRiZ0l0ZXJhdG9yIERiZ0VuZCgpICAgeyByZXR1cm4gRGJnSW5mby0+RGJnRW5kKCk7IH0KKyAgU0REYmdJbmZvOjpEYmdJdGVyYXRvciBCeXZhbFBhcm1EYmdCZWdpbigpIHsgCisgICAgcmV0dXJuIERiZ0luZm8tPkJ5dmFsUGFybURiZ0JlZ2luKCk7IAorICB9CisgIFNERGJnSW5mbzo6RGJnSXRlcmF0b3IgQnl2YWxQYXJtRGJnRW5kKCkgICB7IAorICAgIHJldHVybiBEYmdJbmZvLT5CeXZhbFBhcm1EYmdFbmQoKTsgCisgIH0KKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gQ3JlYXRlU3RhY2tUZW1wb3JhcnkgLSBDcmVhdGUgYSBzdGFjayB0ZW1wb3JhcnksIHN1aXRhYmxlIGZvciBob2xkaW5nIHRoZQorICAvLy8gc3BlY2lmaWVkIHZhbHVlIHR5cGUuICBJZiBtaW5BbGlnbiBpcyBzcGVjaWZpZWQsIHRoZSBzbG90IHNpemUgd2lsbCBoYXZlCisgIC8vLyBhdCBsZWFzdCB0aGF0IGFsaWdubWVudC4KKyAgU0RWYWx1ZSBDcmVhdGVTdGFja1RlbXBvcmFyeShFVlQgVlQsIHVuc2lnbmVkIG1pbkFsaWduID0gMSk7CisKKyAgLy8vIENyZWF0ZVN0YWNrVGVtcG9yYXJ5IC0gQ3JlYXRlIGEgc3RhY2sgdGVtcG9yYXJ5IHN1aXRhYmxlIGZvciBob2xkaW5nCisgIC8vLyBlaXRoZXIgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlcy4KKyAgU0RWYWx1ZSBDcmVhdGVTdGFja1RlbXBvcmFyeShFVlQgVlQxLCBFVlQgVlQyKTsKKworICAvLy8gRm9sZENvbnN0YW50QXJpdGhtZXRpYyAtCisgIFNEVmFsdWUgRm9sZENvbnN0YW50QXJpdGhtZXRpYyh1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudFNETm9kZSAqQ3N0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50U0ROb2RlICpDc3QyKTsKKworICAvLy8gRm9sZFNldENDIC0gQ29uc3RhbnQgZm9sZCBhIHNldGNjIHRvIHRydWUgb3IgZmFsc2UuCisgIFNEVmFsdWUgRm9sZFNldENDKEVWVCBWVCwgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMiwgSVNEOjpDb25kQ29kZSBDb25kLCBEZWJ1Z0xvYyBkbCk7CisKKyAgLy8vIFNpZ25CaXRJc1plcm8gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2lnbiBiaXQgb2YgT3AgaXMga25vd24gdG8gYmUgemVyby4gIFdlCisgIC8vLyB1c2UgdGhpcyBwcmVkaWNhdGUgdG8gc2ltcGxpZnkgb3BlcmF0aW9ucyBkb3duc3RyZWFtLgorICBib29sIFNpZ25CaXRJc1plcm8oU0RWYWx1ZSBPcCwgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAvLy8gTWFza2VkVmFsdWVJc1plcm8gLSBSZXR1cm4gdHJ1ZSBpZiAnT3AgJiBNYXNrJyBpcyBrbm93biB0byBiZSB6ZXJvLiAgV2UKKyAgLy8vIHVzZSB0aGlzIHByZWRpY2F0ZSB0byBzaW1wbGlmeSBvcGVyYXRpb25zIGRvd25zdHJlYW0uICBPcCBhbmQgTWFzayBhcmUKKyAgLy8vIGtub3duIHRvIGJlIHRoZSBzYW1lIHR5cGUuCisgIGJvb2wgTWFza2VkVmFsdWVJc1plcm8oU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJk1hc2ssIHVuc2lnbmVkIERlcHRoID0gMCkKKyAgICBjb25zdDsKKworICAvLy8gQ29tcHV0ZU1hc2tlZEJpdHMgLSBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGJpdHMgc3BlY2lmaWVkIGluIE1hc2sgYXJlCisgIC8vLyBrbm93biB0byBiZSBlaXRoZXIgemVybyBvciBvbmUgYW5kIHJldHVybiB0aGVtIGluIHRoZSBLbm93blplcm8vS25vd25PbmUKKyAgLy8vIGJpdHNldHMuICBUaGlzIGNvZGUgb25seSBhbmFseXplcyBiaXRzIGluIE1hc2ssIGluIG9yZGVyIHRvIHNob3J0LWNpcmN1aXQKKyAgLy8vIHByb2Nlc3NpbmcuICBUYXJnZXRzIGNhbiBpbXBsZW1lbnQgdGhlIGNvbXB1dGVNYXNrZWRCaXRzRm9yVGFyZ2V0Tm9kZQorICAvLy8gbWV0aG9kIGluIHRoZSBUYXJnZXRMb3dlcmluZyBjbGFzcyB0byBhbGxvdyB0YXJnZXQgbm9kZXMgdG8gYmUgdW5kZXJzdG9vZC4KKyAgdm9pZCBDb21wdXRlTWFza2VkQml0cyhTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmTWFzaywgQVBJbnQgJktub3duWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25PbmUsIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgLy8vIENvbXB1dGVOdW1TaWduQml0cyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzaWduIGJpdCBvZiB0aGUKKyAgLy8vIHJlZ2lzdGVyIGlzIHJlcGxpY2F0ZWQgaW50byB0aGUgb3RoZXIgYml0cy4gIFdlIGtub3cgdGhhdCBhdCBsZWFzdCAxIGJpdAorICAvLy8gaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBzaWduIGJpdCAoaXRzZWxmKSwgYnV0IG90aGVyIGNhc2VzIGNhbiBnaXZlIHVzCisgIC8vLyBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBpbW1lZGlhdGVseSBhZnRlciBhbiAiU1JBIFgsIDIiLCB3ZSBrbm93IHRoYXQKKyAgLy8vIHRoZSB0b3AgMyBiaXRzIGFyZSBhbGwgZXF1YWwgdG8gZWFjaCBvdGhlciwgc28gd2UgcmV0dXJuIDMuICBUYXJnZXRzIGNhbgorICAvLy8gaW1wbGVtZW50IHRoZSBDb21wdXRlTnVtU2lnbkJpdHNGb3JUYXJnZXQgbWV0aG9kIGluIHRoZSBUYXJnZXRMb3dlcmluZworICAvLy8gY2xhc3MgdG8gYWxsb3cgdGFyZ2V0IG5vZGVzIHRvIGJlIHVuZGVyc3Rvb2QuCisgIHVuc2lnbmVkIENvbXB1dGVOdW1TaWduQml0cyhTRFZhbHVlIE9wLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBpc0tub3duTmV2ZXJOYW4gLSBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIFNEVmFsdWUgaXMga25vd24gdG8gbmV2ZXIgYmUgTmFOLgorICBib29sIGlzS25vd25OZXZlck5hTihTRFZhbHVlIE9wKSBjb25zdDsKKworICAvLy8gaXNLbm93bk5ldmVyWmVybyAtIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gU0RWYWx1ZSBpcyBrbm93biB0byBuZXZlciBiZQorICAvLy8gcG9zaXRpdmUgb3IgbmVnYXRpdmUgWmVyby4KKyAgYm9vbCBpc0tub3duTmV2ZXJaZXJvKFNEVmFsdWUgT3ApIGNvbnN0OworCisgIC8vLyBpc0VxdWFsVG8gLSBUZXN0IHdoZXRoZXIgdHdvIFNEVmFsdWVzIGFyZSBrbm93biB0byBjb21wYXJlIGVxdWFsLiBUaGlzCisgIC8vLyBpcyB0cnVlIGlmIHRoZXkgYXJlIHRoZSBzYW1lIHZhbHVlLCBvciBpZiBvbmUgaXMgbmVnYXRpdmUgemVybyBhbmQgdGhlCisgIC8vLyBvdGhlciBwb3NpdGl2ZSB6ZXJvLgorICBib29sIGlzRXF1YWxUbyhTRFZhbHVlIEEsIFNEVmFsdWUgQikgY29uc3Q7CisKKyAgLy8vIGlzVmVyaWZpZWREZWJ1Z0luZm9EZXNjIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgU0RWYWx1ZSBoYXMKKyAgLy8vIGJlZW4gdmVyaWZpZWQgYXMgYSBkZWJ1ZyBpbmZvcm1hdGlvbiBkZXNjcmlwdG9yLgorICBib29sIGlzVmVyaWZpZWREZWJ1Z0luZm9EZXNjKFNEVmFsdWUgT3ApIGNvbnN0OworCisgIC8vLyBnZXRTaHVmZmxlU2NhbGFyRWx0IC0gUmV0dXJucyB0aGUgc2NhbGFyIGVsZW1lbnQgdGhhdCB3aWxsIG1ha2UgdXAgdGhlIGl0aAorICAvLy8gZWxlbWVudCBvZiB0aGUgcmVzdWx0IG9mIHRoZSB2ZWN0b3Igc2h1ZmZsZS4KKyAgU0RWYWx1ZSBnZXRTaHVmZmxlU2NhbGFyRWx0KGNvbnN0IFNodWZmbGVWZWN0b3JTRE5vZGUgKk4sIHVuc2lnbmVkIElkeCk7CisKKyAgLy8vIFVucm9sbFZlY3Rvck9wIC0gVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IGxlZ2FsaXplIGFuZCBsb3dlcmluZyB0bworICAvLy8gInVucm9sbCIgYSB2ZWN0b3Igb3BlcmF0aW9uIGJ5IHNwbGl0dGluZyBvdXQgdGhlIHNjYWxhcnMgYW5kIG9wZXJhdGluZworICAvLy8gb24gZWFjaCBlbGVtZW50IGluZGl2aWR1YWxseS4gIElmIHRoZSBSZXNORSBpcyAwLCBmdWxseSB1bnJvbGwgdGhlIHZlY3RvcgorICAvLy8gb3AuIElmIFJlc05FIGlzIGxlc3MgdGhhbiB0aGUgd2lkdGggb2YgdGhlIHZlY3RvciBvcCwgdW5yb2xsIHVwIHRvIFJlc05FLgorICAvLy8gSWYgdGhlICBSZXNORSBpcyBncmVhdGVyIHRoYW4gdGhlIHdpZHRoIG9mIHRoZSB2ZWN0b3Igb3AsIHVucm9sbCB0aGUKKyAgLy8vIHZlY3RvciBvcCBhbmQgZmlsbCB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yIHdpdGggVU5ERUZTLgorICBTRFZhbHVlIFVucm9sbFZlY3Rvck9wKFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTkUgPSAwKTsKKworICAvLy8gaXNDb25zZWN1dGl2ZUxvYWQgLSBSZXR1cm4gdHJ1ZSBpZiBMRCBpcyBsb2FkaW5nICdCeXRlcycgYnl0ZXMgZnJvbSBhIAorICAvLy8gbG9jYXRpb24gdGhhdCBpcyAnRGlzdCcgdW5pdHMgYXdheSBmcm9tIHRoZSBsb2NhdGlvbiB0aGF0IHRoZSAnQmFzZScgbG9hZCAKKyAgLy8vIGlzIGxvYWRpbmcgZnJvbS4KKyAgYm9vbCBpc0NvbnNlY3V0aXZlTG9hZChMb2FkU0ROb2RlICpMRCwgTG9hZFNETm9kZSAqQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlcywgaW50IERpc3QpIGNvbnN0OworCisgIC8vLyBJbmZlclB0ckFsaWdubWVudCAtIEluZmVyIGFsaWdubWVudCBvZiBhIGxvYWQgLyBzdG9yZSBhZGRyZXNzLiBSZXR1cm4gMCBpZgorICAvLy8gaXQgY2Fubm90IGJlIGluZmVycmVkLgorICB1bnNpZ25lZCBJbmZlclB0ckFsaWdubWVudChTRFZhbHVlIFB0cikgY29uc3Q7CisKK3ByaXZhdGU6CisgIGJvb2wgUmVtb3ZlTm9kZUZyb21DU0VNYXBzKFNETm9kZSAqTik7CisgIHZvaWQgQWRkTW9kaWZpZWROb2RlVG9DU0VNYXBzKFNETm9kZSAqTiwgREFHVXBkYXRlTGlzdGVuZXIgKlVwZGF0ZUxpc3RlbmVyKTsKKyAgU0ROb2RlICpGaW5kTW9kaWZpZWROb2RlU2xvdChTRE5vZGUgKk4sIFNEVmFsdWUgT3AsIHZvaWQgKiZJbnNlcnRQb3MpOworICBTRE5vZGUgKkZpbmRNb2RpZmllZE5vZGVTbG90KFNETm9kZSAqTiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiZJbnNlcnRQb3MpOworICBTRE5vZGUgKkZpbmRNb2RpZmllZE5vZGVTbG90KFNETm9kZSAqTiwgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqJkluc2VydFBvcyk7CisKKyAgdm9pZCBEZWxldGVOb2RlTm90SW5DU0VNYXBzKFNETm9kZSAqTik7CisgIHZvaWQgRGVhbGxvY2F0ZU5vZGUoU0ROb2RlICpOKTsKKworICB1bnNpZ25lZCBnZXRFVlRBbGlnbm1lbnQoRVZUIE1lbW9yeVZUKSBjb25zdDsKKworICB2b2lkIGFsbG5vZGVzX2NsZWFyKCk7CisKKyAgLy8vIFZUTGlzdCAtIExpc3Qgb2Ygbm9uLXNpbmdsZSB2YWx1ZSB0eXBlcy4KKyAgc3RkOjp2ZWN0b3I8U0RWVExpc3Q+IFZUTGlzdDsKKworICAvLy8gQ29uZENvZGVOb2RlcyAtIE1hcHMgdG8gYXV0by1DU0Ugb3BlcmF0aW9ucy4KKyAgc3RkOjp2ZWN0b3I8Q29uZENvZGVTRE5vZGUqPiBDb25kQ29kZU5vZGVzOworCisgIHN0ZDo6dmVjdG9yPFNETm9kZSo+IFZhbHVlVHlwZU5vZGVzOworICBzdGQ6Om1hcDxFVlQsIFNETm9kZSosIEVWVDo6Y29tcGFyZVJhd0JpdHM+IEV4dGVuZGVkVmFsdWVUeXBlTm9kZXM7CisgIFN0cmluZ01hcDxTRE5vZGUqPiBFeHRlcm5hbFN5bWJvbHM7CisgIAorICBzdGQ6Om1hcDxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHVuc2lnbmVkIGNoYXI+LFNETm9kZSo+IFRhcmdldEV4dGVybmFsU3ltYm9sczsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxTZWxlY3Rpb25EQUcqPiA6IHB1YmxpYyBHcmFwaFRyYWl0czxTRE5vZGUqPiB7CisgIHR5cGVkZWYgU2VsZWN0aW9uREFHOjphbGxub2Rlc19pdGVyYXRvciBub2Rlc19pdGVyYXRvcjsKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKFNlbGVjdGlvbkRBRyAqRykgeworICAgIHJldHVybiBHLT5hbGxub2Rlc19iZWdpbigpOworICB9CisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoU2VsZWN0aW9uREFHICpHKSB7CisgICAgcmV0dXJuIEctPmFsbG5vZGVzX2VuZCgpOworICB9Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzYmM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaApAQCAtMCwwICsxLDMxMSBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oIC0gQ29tbW9uIEJhc2UgQ2xhc3MtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU2VsZWN0aW9uREFHSVNlbCBjbGFzcywgd2hpY2ggaXMgdXNlZCBhcyB0aGUgY29tbW9uCisvLyBiYXNlIGNsYXNzIGZvciBTZWxlY3Rpb25EQUctYmFzZWQgaW5zdHJ1Y3Rpb24gc2VsZWN0b3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR19JU0VMX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR19JU0VMX0gKKworI2luY2x1ZGUgImxsdm0vQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZhc3RJU2VsOworICBjbGFzcyBTZWxlY3Rpb25EQUdCdWlsZGVyOworICBjbGFzcyBTRFZhbHVlOworICBjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworICBjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIFRhcmdldExvd2VyaW5nOworICBjbGFzcyBUYXJnZXRJbnN0ckluZm87CisgIGNsYXNzIEZ1bmN0aW9uTG93ZXJpbmdJbmZvOworICBjbGFzcyBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXI7CisgIGNsYXNzIEdDRnVuY3Rpb25JbmZvOworICBjbGFzcyBTY2hlZHVsZURBR1NETm9kZXM7CisgCisvLy8gU2VsZWN0aW9uREFHSVNlbCAtIFRoaXMgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIHVzZWQgZm9yIFNlbGVjdGlvbkRBRy1iYXNlZAorLy8vIHBhdHRlcm4tbWF0Y2hpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0b3JzLgorY2xhc3MgU2VsZWN0aW9uREFHSVNlbCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE07CisgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEk7CisgIEZ1bmN0aW9uTG93ZXJpbmdJbmZvICpGdW5jSW5mbzsKKyAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqUmVnSW5mbzsKKyAgU2VsZWN0aW9uREFHICpDdXJEQUc7CisgIFNlbGVjdGlvbkRBR0J1aWxkZXIgKlNEQjsKKyAgQWxpYXNBbmFseXNpcyAqQUE7CisgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsOworICBzdGF0aWMgY2hhciBJRDsKKworICBleHBsaWNpdCBTZWxlY3Rpb25EQUdJU2VsKGNvbnN0IFRhcmdldE1hY2hpbmUgJnRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9MID0gQ29kZUdlbk9wdDo6RGVmYXVsdCk7CisgIHZpcnR1YWwgflNlbGVjdGlvbkRBR0lTZWwoKTsKKyAgCisgIGNvbnN0IFRhcmdldExvd2VyaW5nICZnZXRUYXJnZXRMb3dlcmluZygpIHsgcmV0dXJuIFRMSTsgfQorCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRGdW5jdGlvbkVudHJ5Q29kZSgpIHt9CisgIAorICAvLy8gUHJlcHJvY2Vzc0lTZWxEQUcgLSBUaGlzIGhvb2sgYWxsb3dzIHRhcmdldHMgdG8gaGFjayBvbiB0aGUgZ3JhcGggYmVmb3JlCisgIC8vLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgUHJlcHJvY2Vzc0lTZWxEQUcoKSB7fQorICAKKyAgLy8vIFBvc3Rwcm9jZXNzSVNlbERBRygpIC0gVGhpcyBob29rIGFsbG93cyB0aGUgdGFyZ2V0IHRvIGhhY2sgb24gdGhlIGdyYXBoCisgIC8vLyByaWdodCBhZnRlciBzZWxlY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBQb3N0cHJvY2Vzc0lTZWxEQUcoKSB7fQorICAKKyAgLy8vIFNlbGVjdCAtIE1haW4gaG9vayB0YXJnZXRzIGltcGxlbWVudCB0byBzZWxlY3QgYSBub2RlLgorICB2aXJ0dWFsIFNETm9kZSAqU2VsZWN0KFNETm9kZSAqTikgPSAwOworICAKKyAgLy8vIFNlbGVjdElubGluZUFzbU1lbW9yeU9wZXJhbmQgLSBTZWxlY3QgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGFzIGEgdGFyZ2V0CisgIC8vLyBhZGRyZXNzaW5nIG1vZGUsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQgY29kZS4gIElmIHRoaXMgZG9lcworICAvLy8gbm90IG1hdGNoIG9yIGlzIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIHRydWUuICBUaGUgcmVzdWx0YW50IG9wZXJhbmRzCisgIC8vLyAod2hpY2ggd2lsbCBhcHBlYXIgaW4gdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24pIHNob3VsZCBiZSBhZGRlZCB0byB0aGUKKyAgLy8vIE91dE9wcyB2ZWN0b3IuCisgIHZpcnR1YWwgYm9vbCBTZWxlY3RJbmxpbmVBc21NZW1vcnlPcGVyYW5kKGNvbnN0IFNEVmFsdWUgJk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbnN0cmFpbnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3V0T3BzKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gSXNQcm9maXRhYmxlVG9Gb2xkIC0gUmV0dXJucyB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byBmb2xkIHRoZSBzcGVjaWZpYworICAvLy8gb3BlcmFuZCBub2RlIE4gb2YgVSBkdXJpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHRoYXQgc3RhcnRzIGF0IFJvb3QuCisgIHZpcnR1YWwgYm9vbCBJc1Byb2ZpdGFibGVUb0ZvbGQoU0RWYWx1ZSBOLCBTRE5vZGUgKlUsIFNETm9kZSAqUm9vdCkgY29uc3Q7CisKKyAgLy8vIElzTGVnYWxUb0ZvbGQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmljIG9wZXJhbmQgbm9kZSBOIG9mCisgIC8vLyBVIGNhbiBiZSBmb2xkZWQgZHVyaW5nIGluc3RydWN0aW9uIHNlbGVjdGlvbiB0aGF0IHN0YXJ0cyBhdCBSb290LgorICAvLy8gRklYTUU6IFRoaXMgaXMgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIFBJQzE2IHRhcmdldCwKKyAgLy8vIHdoaWNoIHVzZXMgaXQgZHVyaW5nIGxvd2VyaW5nLgorICBzdGF0aWMgYm9vbCBJc0xlZ2FsVG9Gb2xkKFNEVmFsdWUgTiwgU0ROb2RlICpVLCBTRE5vZGUgKlJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJZ25vcmVDaGFpbnMgPSBmYWxzZSk7CisKKyAgLy8vIENyZWF0ZVRhcmdldEhhemFyZFJlY29nbml6ZXIgLSBSZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgaGF6YXJkIHJlY29nbml6ZXIKKyAgLy8vIHRvIHVzZSBmb3IgdGhpcyB0YXJnZXQgd2hlbiBzY2hlZHVsaW5nIHRoZSBEQUcuCisgIHZpcnR1YWwgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICpDcmVhdGVUYXJnZXRIYXphcmRSZWNvZ25pemVyKCk7CisgIAorICAKKyAgLy8gT3Bjb2RlcyB1c2VkIGJ5IHRoZSBEQUcgc3RhdGUgbWFjaGluZToKKyAgZW51bSBCdWlsdGluT3Bjb2RlcyB7CisgICAgT1BDX1Njb3BlLAorICAgIE9QQ19SZWNvcmROb2RlLAorICAgIE9QQ19SZWNvcmRDaGlsZDAsIE9QQ19SZWNvcmRDaGlsZDEsIE9QQ19SZWNvcmRDaGlsZDIsIE9QQ19SZWNvcmRDaGlsZDMsIAorICAgIE9QQ19SZWNvcmRDaGlsZDQsIE9QQ19SZWNvcmRDaGlsZDUsIE9QQ19SZWNvcmRDaGlsZDYsIE9QQ19SZWNvcmRDaGlsZDcsCisgICAgT1BDX1JlY29yZE1lbVJlZiwKKyAgICBPUENfQ2FwdHVyZUZsYWdJbnB1dCwKKyAgICBPUENfTW92ZUNoaWxkLAorICAgIE9QQ19Nb3ZlUGFyZW50LAorICAgIE9QQ19DaGVja1NhbWUsCisgICAgT1BDX0NoZWNrUGF0dGVyblByZWRpY2F0ZSwKKyAgICBPUENfQ2hlY2tQcmVkaWNhdGUsCisgICAgT1BDX0NoZWNrT3Bjb2RlLAorICAgIE9QQ19Td2l0Y2hPcGNvZGUsCisgICAgT1BDX0NoZWNrVHlwZSwKKyAgICBPUENfU3dpdGNoVHlwZSwKKyAgICBPUENfQ2hlY2tDaGlsZDBUeXBlLCBPUENfQ2hlY2tDaGlsZDFUeXBlLCBPUENfQ2hlY2tDaGlsZDJUeXBlLAorICAgIE9QQ19DaGVja0NoaWxkM1R5cGUsIE9QQ19DaGVja0NoaWxkNFR5cGUsIE9QQ19DaGVja0NoaWxkNVR5cGUsCisgICAgT1BDX0NoZWNrQ2hpbGQ2VHlwZSwgT1BDX0NoZWNrQ2hpbGQ3VHlwZSwKKyAgICBPUENfQ2hlY2tJbnRlZ2VyLAorICAgIE9QQ19DaGVja0NvbmRDb2RlLAorICAgIE9QQ19DaGVja1ZhbHVlVHlwZSwKKyAgICBPUENfQ2hlY2tDb21wbGV4UGF0LAorICAgIE9QQ19DaGVja0FuZEltbSwgT1BDX0NoZWNrT3JJbW0sCisgICAgT1BDX0NoZWNrRm9sZGFibGVDaGFpbk5vZGUsCisgICAgCisgICAgT1BDX0VtaXRJbnRlZ2VyLAorICAgIE9QQ19FbWl0UmVnaXN0ZXIsCisgICAgT1BDX0VtaXRDb252ZXJ0VG9UYXJnZXQsCisgICAgT1BDX0VtaXRNZXJnZUlucHV0Q2hhaW5zLAorICAgIE9QQ19FbWl0TWVyZ2VJbnB1dENoYWluczFfMCwKKyAgICBPUENfRW1pdE1lcmdlSW5wdXRDaGFpbnMxXzEsCisgICAgT1BDX0VtaXRDb3B5VG9SZWcsCisgICAgT1BDX0VtaXROb2RlWEZvcm0sCisgICAgT1BDX0VtaXROb2RlLAorICAgIE9QQ19Nb3JwaE5vZGVUbywKKyAgICBPUENfTWFya0ZsYWdSZXN1bHRzLAorICAgIE9QQ19Db21wbGV0ZU1hdGNoCisgIH07CisgIAorICBlbnVtIHsKKyAgICBPUEZMX05vbmUgICAgICAgPSAwLCAgICAgLy8gTm9kZSBoYXMgbm8gY2hhaW4gb3IgZmxhZyBpbnB1dCBhbmQgaXNuJ3QgdmFyaWFkaWMuCisgICAgT1BGTF9DaGFpbiAgICAgID0gMSwgICAgIC8vIE5vZGUgaGFzIGEgY2hhaW4gaW5wdXQuCisgICAgT1BGTF9GbGFnSW5wdXQgID0gMiwgICAgIC8vIE5vZGUgaGFzIGEgZmxhZyBpbnB1dC4KKyAgICBPUEZMX0ZsYWdPdXRwdXQgPSA0LCAgICAgLy8gTm9kZSBoYXMgYSBmbGFnIG91dHB1dC4KKyAgICBPUEZMX01lbVJlZnMgICAgPSA4LCAgICAgLy8gTm9kZSBnZXRzIGFjY3VtdWxhdGVkIE1lbVJlZnMuCisgICAgT1BGTF9WYXJpYWRpYzAgID0gMTw8NCwgIC8vIE5vZGUgaXMgdmFyaWFkaWMsIHJvb3QgaGFzIDAgZml4ZWQgaW5wdXRzLgorICAgIE9QRkxfVmFyaWFkaWMxICA9IDI8PDQsICAvLyBOb2RlIGlzIHZhcmlhZGljLCByb290IGhhcyAxIGZpeGVkIGlucHV0cy4KKyAgICBPUEZMX1ZhcmlhZGljMiAgPSAzPDw0LCAgLy8gTm9kZSBpcyB2YXJpYWRpYywgcm9vdCBoYXMgMiBmaXhlZCBpbnB1dHMuCisgICAgT1BGTF9WYXJpYWRpYzMgID0gNDw8NCwgIC8vIE5vZGUgaXMgdmFyaWFkaWMsIHJvb3QgaGFzIDMgZml4ZWQgaW5wdXRzLgorICAgIE9QRkxfVmFyaWFkaWM0ICA9IDU8PDQsICAvLyBOb2RlIGlzIHZhcmlhZGljLCByb290IGhhcyA0IGZpeGVkIGlucHV0cy4KKyAgICBPUEZMX1ZhcmlhZGljNSAgPSA2PDw0LCAgLy8gTm9kZSBpcyB2YXJpYWRpYywgcm9vdCBoYXMgNSBmaXhlZCBpbnB1dHMuCisgICAgT1BGTF9WYXJpYWRpYzYgID0gNzw8NCwgIC8vIE5vZGUgaXMgdmFyaWFkaWMsIHJvb3QgaGFzIDYgZml4ZWQgaW5wdXRzLgorICAgIAorICAgIE9QRkxfVmFyaWFkaWNJbmZvID0gT1BGTF9WYXJpYWRpYzYKKyAgfTsKKyAgCisgIC8vLyBnZXROdW1GaXhlZEZyb21WYXJpYWRpY0luZm8gLSBUcmFuc2Zvcm0gYW4gRW1pdE5vZGUgZmxhZ3Mgd29yZCBpbnRvIHRoZQorICAvLy8gbnVtYmVyIG9mIGZpeGVkIGFyaXR5IHZhbHVlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIHdoZW4gY29weWluZyBmcm9tIHRoZQorICAvLy8gcm9vdC4KKyAgc3RhdGljIGlubGluZSBpbnQgZ2V0TnVtRml4ZWRGcm9tVmFyaWFkaWNJbmZvKHVuc2lnbmVkIEZsYWdzKSB7CisgICAgcmV0dXJuICgoRmxhZ3MmT1BGTF9WYXJpYWRpY0luZm8pID4+IDQpLTE7CisgIH0KKyAgCisgIAorcHJvdGVjdGVkOgorICAvLy8gREFHU2l6ZSAtIFNpemUgb2YgREFHIGJlaW5nIGluc3RydWN0aW9uIHNlbGVjdGVkLgorICAvLy8KKyAgdW5zaWduZWQgREFHU2l6ZTsKKyAgCisgIC8vLyBJU2VsUG9zaXRpb24gLSBOb2RlIGl0ZXJhdG9yIG1hcmtpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YKKyAgLy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBhcyBpdCBwcm9jZWRlcyB0aHJvdWdoIHRoZSB0b3BvbG9naWNhbGx5LXNvcnRlZAorICAvLy8gbm9kZSBsaXN0LgorICBTZWxlY3Rpb25EQUc6OmFsbG5vZGVzX2l0ZXJhdG9yIElTZWxQb3NpdGlvbjsKKworICAKKyAgLy8vIElTZWxVcGRhdGVyIC0gaGVscGVyIGNsYXNzIHRvIGhhbmRsZSB1cGRhdGVzIG9mIHRoZSAKKyAgLy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBncmFwaC4KKyAgY2xhc3MgSVNlbFVwZGF0ZXIgOiBwdWJsaWMgU2VsZWN0aW9uREFHOjpEQUdVcGRhdGVMaXN0ZW5lciB7CisgICAgU2VsZWN0aW9uREFHOjphbGxub2Rlc19pdGVyYXRvciAmSVNlbFBvc2l0aW9uOworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSVNlbFVwZGF0ZXIoU2VsZWN0aW9uREFHOjphbGxub2Rlc19pdGVyYXRvciAmaXNwKQorICAgICAgOiBJU2VsUG9zaXRpb24oaXNwKSB7fQorICAgIAorICAgIC8vLyBOb2RlRGVsZXRlZCAtIEhhbmRsZSBub2RlcyBkZWxldGVkIGZyb20gdGhlIGdyYXBoLiBJZiB0aGUKKyAgICAvLy8gbm9kZSBiZWluZyBkZWxldGVkIGlzIHRoZSBjdXJyZW50IElTZWxQb3NpdGlvbiBub2RlLCB1cGRhdGUKKyAgICAvLy8gSVNlbFBvc2l0aW9uLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBOb2RlRGVsZXRlZChTRE5vZGUgKk4sIFNETm9kZSAqRSkgeworICAgICAgaWYgKElTZWxQb3NpdGlvbiA9PSBTZWxlY3Rpb25EQUc6OmFsbG5vZGVzX2l0ZXJhdG9yKE4pKQorICAgICAgICArK0lTZWxQb3NpdGlvbjsKKyAgICB9CisgICAgCisgICAgLy8vIE5vZGVVcGRhdGVkIC0gSWdub3JlIHVwZGF0ZXMgZm9yIG5vdy4KKyAgICB2aXJ0dWFsIHZvaWQgTm9kZVVwZGF0ZWQoU0ROb2RlICpOKSB7fQorICB9OworICAKKyAgLy8vIFJlcGxhY2VVc2VzIC0gcmVwbGFjZSBhbGwgdXNlcyBvZiB0aGUgb2xkIG5vZGUgRiB3aXRoIHRoZSB1c2UKKyAgLy8vIG9mIHRoZSBuZXcgbm9kZSBULgorICB2b2lkIFJlcGxhY2VVc2VzKFNEVmFsdWUgRiwgU0RWYWx1ZSBUKSB7CisgICAgSVNlbFVwZGF0ZXIgSVNVKElTZWxQb3NpdGlvbik7CisgICAgQ3VyREFHLT5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKEYsIFQsICZJU1UpOworICB9CisgIAorICAvLy8gUmVwbGFjZVVzZXMgLSByZXBsYWNlIGFsbCB1c2VzIG9mIHRoZSBvbGQgbm9kZXMgRiB3aXRoIHRoZSB1c2UKKyAgLy8vIG9mIHRoZSBuZXcgbm9kZXMgVC4KKyAgdm9pZCBSZXBsYWNlVXNlcyhjb25zdCBTRFZhbHVlICpGLCBjb25zdCBTRFZhbHVlICpULCB1bnNpZ25lZCBOdW0pIHsKKyAgICBJU2VsVXBkYXRlciBJU1UoSVNlbFBvc2l0aW9uKTsKKyAgICBDdXJEQUctPlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZXNXaXRoKEYsIFQsIE51bSwgJklTVSk7CisgIH0KKyAgCisgIC8vLyBSZXBsYWNlVXNlcyAtIHJlcGxhY2UgYWxsIHVzZXMgb2YgdGhlIG9sZCBub2RlIEYgd2l0aCB0aGUgdXNlCisgIC8vLyBvZiB0aGUgbmV3IG5vZGUgVC4KKyAgdm9pZCBSZXBsYWNlVXNlcyhTRE5vZGUgKkYsIFNETm9kZSAqVCkgeworICAgIElTZWxVcGRhdGVyIElTVShJU2VsUG9zaXRpb24pOworICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNXaXRoKEYsIFQsICZJU1UpOworICB9CisgIAorCisgIC8vLyBTZWxlY3RJbmxpbmVBc21NZW1vcnlPcGVyYW5kcyAtIENhbGxzIHRvIHRoaXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgIC8vLyBieSB0YmxnZW4uICBPdGhlcnMgc2hvdWxkIG5vdCBjYWxsIGl0LgorICB2b2lkIFNlbGVjdElubGluZUFzbU1lbW9yeU9wZXJhbmRzKHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPcHMpOworCisgIAorcHVibGljOgorICAvLyBDYWxscyB0byB0aGVzZSBwcmVkaWNhdGVzIGFyZSBnZW5lcmF0ZWQgYnkgdGJsZ2VuLgorICBib29sIENoZWNrQW5kTWFzayhTRFZhbHVlIExIUywgQ29uc3RhbnRTRE5vZGUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBEZXNpcmVkTWFza1MpIGNvbnN0OworICBib29sIENoZWNrT3JNYXNrKFNEVmFsdWUgTEhTLCBDb25zdGFudFNETm9kZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IERlc2lyZWRNYXNrUykgY29uc3Q7CisgIAorICAKKyAgLy8vIENoZWNrUGF0dGVyblByZWRpY2F0ZSAtIFRoaXMgZnVuY3Rpb24gaXMgZ2VuZXJhdGVkIGJ5IHRibGdlbiBpbiB0aGUKKyAgLy8vIHRhcmdldC4gIEl0IHJ1bnMgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIHByZWRpY2F0ZSBhbmQgcmV0dXJucyB0cnVlIGlmIGl0CisgIC8vLyBzdWNjZWVkcyBvciBmYWxzZSBpZiBpdCBmYWlscy4gIFRoZSBudW1iZXIgaXMgYSBwcml2YXRlIGltcGxlbWVudGF0aW9uCisgIC8vLyBkZXRhaWwgdG8gdGhlIGNvZGUgdGJsZ2VuIHByb2R1Y2VzLgorICB2aXJ0dWFsIGJvb2wgQ2hlY2tQYXR0ZXJuUHJlZGljYXRlKHVuc2lnbmVkIFByZWRObykgY29uc3QgeworICAgIGFzc2VydCgwICYmICJUYmxnZW4gc2hvdWxkIGdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzISIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIENoZWNrTm9kZVByZWRpY2F0ZSAtIFRoaXMgZnVuY3Rpb24gaXMgZ2VuZXJhdGVkIGJ5IHRibGdlbiBpbiB0aGUgdGFyZ2V0LgorICAvLy8gSXQgcnVucyBub2RlIHByZWRpY2F0ZSBudW1iZXIgUHJlZE5vIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZHMgb3IKKyAgLy8vIGZhbHNlIGlmIGl0IGZhaWxzLiAgVGhlIG51bWJlciBpcyBhIHByaXZhdGUgaW1wbGVtZW50YXRpb24KKyAgLy8vIGRldGFpbCB0byB0aGUgY29kZSB0YmxnZW4gcHJvZHVjZXMuCisgIHZpcnR1YWwgYm9vbCBDaGVja05vZGVQcmVkaWNhdGUoU0ROb2RlICpOLCB1bnNpZ25lZCBQcmVkTm8pIGNvbnN0IHsKKyAgICBhc3NlcnQoMCAmJiAiVGJsZ2VuIHNob3VsZCBnZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyEiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgdmlydHVhbCBib29sIENoZWNrQ29tcGxleFBhdHRlcm4oU0ROb2RlICpSb290LCBTRFZhbHVlIE4sIHVuc2lnbmVkIFBhdHRlcm5ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZXN1bHQpIHsKKyAgICBhc3NlcnQoMCAmJiAiVGJsZ2VuIHNob3VsZCBnZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyEiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIHZpcnR1YWwgU0RWYWx1ZSBSdW5TRE5vZGVYRm9ybShTRFZhbHVlIFYsIHVuc2lnbmVkIFhGb3JtTm8pIHsKKyAgICBhc3NlcnQoMCAmJiAiVGJsZ2VuIHNob3VkbCBnZW5lcmF0ZSB0aGlzISIpOworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICBTRE5vZGUgKlNlbGVjdENvZGVDb21tb24oU0ROb2RlICpOb2RlVG9NYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKk1hdGNoZXJUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRhYmxlU2l6ZSk7CisgIAorcHJpdmF0ZToKKyAgCisgIC8vIENhbGxzIHRvIHRoZXNlIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRibGdlbi4KKyAgU0ROb2RlICpTZWxlY3RfVU5ERUYoU0ROb2RlICpOKTsKKyAgdm9pZCBDYW5ub3RZZXRTZWxlY3QoU0ROb2RlICpOKTsKKworcHJpdmF0ZToKKyAgdm9pZCBEb0luc3RydWN0aW9uU2VsZWN0aW9uKCk7CisgIFNETm9kZSAqTW9ycGhOb2RlKFNETm9kZSAqTm9kZSwgdW5zaWduZWQgVGFyZ2V0T3BjLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzLCB1bnNpZ25lZCBFbWl0Tm9kZUluZm8pOworICAKKyAgdm9pZCBTZWxlY3RBbGxCYXNpY0Jsb2Nrcyhjb25zdCBGdW5jdGlvbiAmRm4pOworICB2b2lkIEZpbmlzaEJhc2ljQmxvY2soKTsKKworICB2b2lkIFNlbGVjdEJhc2ljQmxvY2soQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYWRUYWlsQ2FsbCk7CisgIHZvaWQgQ29kZUdlbkFuZEVtaXREQUcoKTsKKyAgdm9pZCBMb3dlckFyZ3VtZW50cyhjb25zdCBCYXNpY0Jsb2NrICpCQik7CisgIAorICB2b2lkIENvbXB1dGVMaXZlT3V0VlJlZ0luZm8oKTsKKworICAvLy8gQ3JlYXRlIHRoZSBzY2hlZHVsZXIuIElmIGEgc3BlY2lmaWMgc2NoZWR1bGVyIHdhcyBzcGVjaWZpZWQKKyAgLy8vIHZpYSB0aGUgU2NoZWR1bGVyUmVnaXN0cnksIHVzZSBpdCwgb3RoZXJ3aXNlIHNlbGVjdCB0aGUKKyAgLy8vIG9uZSBwcmVmZXJyZWQgYnkgdGhlIHRhcmdldC4KKyAgLy8vCisgIFNjaGVkdWxlREFHU0ROb2RlcyAqQ3JlYXRlU2NoZWR1bGVyKCk7CisgIAorICAvLy8gT3Bjb2RlT2Zmc2V0IC0gVGhpcyBpcyBhIGNhY2hlIHVzZWQgdG8gZGlzcGF0Y2ggZWZmaWNpZW50bHkgaW50byBpc2VsCisgIC8vLyBzdGF0ZSBtYWNoaW5lcyB0aGF0IHN0YXJ0IHdpdGggYSBPUENfU3dpdGNoT3Bjb2RlIG5vZGUuCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBPcGNvZGVPZmZzZXQ7CisgIAorICB2b2lkIFVwZGF0ZUNoYWluc0FuZEZsYWdzKFNETm9kZSAqTm9kZVRvTWF0Y2gsIFNEVmFsdWUgSW5wdXRDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0ROb2RlKj4gJkNoYWluTm9kZXNNYXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgSW5wdXRGbGFnLGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRE5vZGUqPiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ycGhOb2RlVG8pOworICAgIAorfTsKKworfQorCisjZW5kaWYgLyogTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR19JU0VMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdOb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzY5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdOb2Rlcy5oCkBAIC0wLDAgKzEsMTc1NSBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHTm9kZXMuaCAtIFNlbGVjdGlvbkRBRyBOb2RlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFNETm9kZSBjbGFzcyBhbmQgZGVyaXZlZCBjbGFzc2VzLCB3aGljaCBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHRoZSBub2RlcyBhbmQgb3BlcmF0aW9ucyBwcmVzZW50IGluIGEgU2VsZWN0aW9uREFHLiAgVGhlc2Ugbm9kZXMKKy8vIGFuZCBvcGVyYXRpb25zIGFyZSBtYWNoaW5lIGNvZGUgbGV2ZWwgb3BlcmF0aW9ucywgd2l0aCBzb21lIHNpbWlsYXJpdGllcyB0bworLy8gdGhlIEdDQyBSVEwgcmVwcmVzZW50YXRpb24uCisvLworLy8gQ2xpZW50cyBzaG91bGQgaW5jbHVkZSB0aGUgU2VsZWN0aW9uREFHLmggZmlsZSBpbnN0ZWFkIG9mIHRoaXMgZmlsZSBkaXJlY3RseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdOT0RFU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdOT0RFU19ICisKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1lbU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU2VsZWN0aW9uREFHOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZTsKK2NsYXNzIFNETm9kZTsKK2NsYXNzIFZhbHVlOworY2xhc3MgTUNTeW1ib2w7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaWxpc3RfdHJhaXRzOworCit2b2lkIGNoZWNrRm9yQ3ljbGVzKGNvbnN0IFNETm9kZSAqTik7CisgIAorLy8vIFNEVlRMaXN0IC0gVGhpcyByZXByZXNlbnRzIGEgbGlzdCBvZiBWYWx1ZVR5cGUncyB0aGF0IGhhcyBiZWVuIGludGVybidkIGJ5CisvLy8gYSBTZWxlY3Rpb25EQUcuICBJbnN0YW5jZXMgb2YgdGhpcyBzaW1wbGUgdmFsdWUgY2xhc3MgYXJlIHJldHVybmVkIGJ5CisvLy8gU2VsZWN0aW9uREFHOjpnZXRWVExpc3QoLi4uKS4KKy8vLworc3RydWN0IFNEVlRMaXN0IHsKKyAgY29uc3QgRVZUICpWVHM7CisgIHVuc2lnbmVkIGludCBOdW1WVHM7Cit9OworCituYW1lc3BhY2UgSVNEIHsKKyAgLy8vIE5vZGUgcHJlZGljYXRlcworCisgIC8vLyBpc0J1aWxkVmVjdG9yQWxsT25lcyAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhCisgIC8vLyBCVUlMRF9WRUNUT1Igd2hlcmUgYWxsIG9mIHRoZSBlbGVtZW50cyBhcmUgfjAgb3IgdW5kZWYuCisgIGJvb2wgaXNCdWlsZFZlY3RvckFsbE9uZXMoY29uc3QgU0ROb2RlICpOKTsKKworICAvLy8gaXNCdWlsZFZlY3RvckFsbFplcm9zIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEKKyAgLy8vIEJVSUxEX1ZFQ1RPUiB3aGVyZSBhbGwgb2YgdGhlIGVsZW1lbnRzIGFyZSAwIG9yIHVuZGVmLgorICBib29sIGlzQnVpbGRWZWN0b3JBbGxaZXJvcyhjb25zdCBTRE5vZGUgKk4pOworCisgIC8vLyBpc1NjYWxhclRvVmVjdG9yIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEKKyAgLy8vIElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiBub2RlIG9yIGEgQlVJTERfVkVDVE9SIG5vZGUgd2hlcmUgb25seSB0aGUgbG93CisgIC8vLyBlbGVtZW50IGlzIG5vdCBhbiB1bmRlZi4KKyAgYm9vbCBpc1NjYWxhclRvVmVjdG9yKGNvbnN0IFNETm9kZSAqTik7Cit9ICAvLyBlbmQgbGx2bTpJU0QgbmFtZXNwYWNlCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gU0RWYWx1ZSAtIFVubGlrZSBMTFZNIHZhbHVlcywgU2VsZWN0aW9uIERBRyBub2RlcyBtYXkgcmV0dXJuIG11bHRpcGxlCisvLy8gdmFsdWVzIGFzIHRoZSByZXN1bHQgb2YgYSBjb21wdXRhdGlvbi4gIE1hbnkgbm9kZXMgcmV0dXJuIG11bHRpcGxlIHZhbHVlcywKKy8vLyBmcm9tIGxvYWRzICh3aGljaCBkZWZpbmUgYSB0b2tlbiBhbmQgYSByZXR1cm4gdmFsdWUpIHRvIEFEREMgKHdoaWNoIHJldHVybnMKKy8vLyBhIHJlc3VsdCBhbmQgYSBjYXJyeSB2YWx1ZSksIHRvIGNhbGxzICh3aGljaCBtYXkgcmV0dXJuIGFuIGFyYml0cmFyeSBudW1iZXIKKy8vLyBvZiB2YWx1ZXMpLgorLy8vCisvLy8gQXMgc3VjaCwgZWFjaCB1c2Ugb2YgYSBTZWxlY3Rpb25EQUcgY29tcHV0YXRpb24gbXVzdCBpbmRpY2F0ZSB0aGUgbm9kZSB0aGF0CisvLy8gY29tcHV0ZXMgaXQgYXMgd2VsbCBhcyB3aGljaCByZXR1cm4gdmFsdWUgdG8gdXNlIGZyb20gdGhhdCBub2RlLiAgVGhpcyBwYWlyCisvLy8gb2YgaW5mb3JtYXRpb24gaXMgcmVwcmVzZW50ZWQgd2l0aCB0aGUgU0RWYWx1ZSB2YWx1ZSB0eXBlLgorLy8vCitjbGFzcyBTRFZhbHVlIHsKKyAgU0ROb2RlICpOb2RlOyAgICAgICAvLyBUaGUgbm9kZSBkZWZpbmluZyB0aGUgdmFsdWUgd2UgYXJlIHVzaW5nLgorICB1bnNpZ25lZCBSZXNObzsgICAgIC8vIFdoaWNoIHJldHVybiB2YWx1ZSBvZiB0aGUgbm9kZSB3ZSBhcmUgdXNpbmcuCitwdWJsaWM6CisgIFNEVmFsdWUoKSA6IE5vZGUoMCksIFJlc05vKDApIHt9CisgIFNEVmFsdWUoU0ROb2RlICpub2RlLCB1bnNpZ25lZCByZXNubykgOiBOb2RlKG5vZGUpLCBSZXNObyhyZXNubykge30KKworICAvLy8gZ2V0IHRoZSBpbmRleCB3aGljaCBzZWxlY3RzIGEgc3BlY2lmaWMgcmVzdWx0IGluIHRoZSBTRE5vZGUKKyAgdW5zaWduZWQgZ2V0UmVzTm8oKSBjb25zdCB7IHJldHVybiBSZXNObzsgfQorCisgIC8vLyBnZXQgdGhlIFNETm9kZSB3aGljaCBob2xkcyB0aGUgZGVzaXJlZCByZXN1bHQKKyAgU0ROb2RlICpnZXROb2RlKCkgY29uc3QgeyByZXR1cm4gTm9kZTsgfQorCisgIC8vLyBzZXQgdGhlIFNETm9kZQorICB2b2lkIHNldE5vZGUoU0ROb2RlICpOKSB7IE5vZGUgPSBOOyB9CisKKyAgaW5saW5lIFNETm9kZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIE5vZGU7IH0KKyAgCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTRFZhbHVlICZPKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGUgPT0gTy5Ob2RlICYmIFJlc05vID09IE8uUmVzTm87CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNEVmFsdWUgJk8pIGNvbnN0IHsKKyAgICByZXR1cm4gIW9wZXJhdG9yPT0oTyk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU0RWYWx1ZSAmTykgY29uc3QgeworICAgIHJldHVybiBOb2RlIDwgTy5Ob2RlIHx8IChOb2RlID09IE8uTm9kZSAmJiBSZXNObyA8IE8uUmVzTm8pOworICB9CisKKyAgU0RWYWx1ZSBnZXRWYWx1ZSh1bnNpZ25lZCBSKSBjb25zdCB7CisgICAgcmV0dXJuIFNEVmFsdWUoTm9kZSwgUik7CisgIH0KKworICAvLyBpc09wZXJhbmRPZiAtIFJldHVybiB0cnVlIGlmIHRoaXMgbm9kZSBpcyBhbiBvcGVyYW5kIG9mIE4uCisgIGJvb2wgaXNPcGVyYW5kT2YoU0ROb2RlICpOKSBjb25zdDsKKworICAvLy8gZ2V0VmFsdWVUeXBlIC0gUmV0dXJuIHRoZSBWYWx1ZVR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgcmV0dXJuIHZhbHVlLgorICAvLy8KKyAgaW5saW5lIEVWVCBnZXRWYWx1ZVR5cGUoKSBjb25zdDsKKworICAvLy8gZ2V0VmFsdWVTaXplSW5CaXRzIC0gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgaW4gYml0cy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldFZhbHVlU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICB9CisKKyAgLy8gRm9yd2FyZGluZyBtZXRob2RzIC0gVGhlc2UgZm9yd2FyZCB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzIGluIFNETm9kZS4KKyAgaW5saW5lIHVuc2lnbmVkIGdldE9wY29kZSgpIGNvbnN0OworICBpbmxpbmUgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdDsKKyAgaW5saW5lIGNvbnN0IFNEVmFsdWUgJmdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3Q7CisgIGlubGluZSB1aW50NjRfdCBnZXRDb25zdGFudE9wZXJhbmRWYWwodW5zaWduZWQgaSkgY29uc3Q7CisgIGlubGluZSBib29sIGlzVGFyZ2V0TWVtb3J5T3Bjb2RlKCkgY29uc3Q7CisgIGlubGluZSBib29sIGlzVGFyZ2V0T3Bjb2RlKCkgY29uc3Q7CisgIGlubGluZSBib29sIGlzTWFjaGluZU9wY29kZSgpIGNvbnN0OworICBpbmxpbmUgdW5zaWduZWQgZ2V0TWFjaGluZU9wY29kZSgpIGNvbnN0OworICBpbmxpbmUgY29uc3QgRGVidWdMb2MgZ2V0RGVidWdMb2MoKSBjb25zdDsKKworCisgIC8vLyByZWFjaGVzQ2hhaW5XaXRob3V0U2lkZUVmZmVjdHMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wZXJhbmQgKHdoaWNoIG11c3QKKyAgLy8vIGJlIGEgY2hhaW4pIHJlYWNoZXMgdGhlIHNwZWNpZmllZCBvcGVyYW5kIHdpdGhvdXQgY3Jvc3NpbmcgYW55CisgIC8vLyBzaWRlLWVmZmVjdGluZyBpbnN0cnVjdGlvbnMuICBJbiBwcmFjdGljZSwgdGhpcyBsb29rcyB0aHJvdWdoIHRva2VuCisgIC8vLyBmYWN0b3JzIGFuZCBub24tdm9sYXRpbGUgbG9hZHMuICBJbiBvcmRlciB0byByZW1haW4gZWZmaWNpZW50LCB0aGlzIG9ubHkKKyAgLy8vIGxvb2tzIGEgY291cGxlIG9mIG5vZGVzIGluLCBpdCBkb2VzIG5vdCBkbyBhbiBleGhhdXN0aXZlIHNlYXJjaC4KKyAgYm9vbCByZWFjaGVzQ2hhaW5XaXRob3V0U2lkZUVmZmVjdHMoU0RWYWx1ZSBEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDIpIGNvbnN0OworCisgIC8vLyB1c2VfZW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gbm9kZXMgdXNpbmcgdmFsdWUgUmVzTm8KKyAgLy8vIG9mIE5vZGUuCisgIC8vLworICBpbmxpbmUgYm9vbCB1c2VfZW1wdHkoKSBjb25zdDsKKworICAvLy8gaGFzT25lVXNlIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgbm9kZSB1c2luZyB2YWx1ZQorICAvLy8gUmVzTm8gb2YgTm9kZS4KKyAgLy8vCisgIGlubGluZSBib29sIGhhc09uZVVzZSgpIGNvbnN0OworfTsKKworCit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88U0RWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIFNEVmFsdWUgZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIFNEVmFsdWUoKFNETm9kZSopLTEsIC0xVSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBTRFZhbHVlIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gU0RWYWx1ZSgoU0ROb2RlKiktMSwgMCk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBTRFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gKCh1bnNpZ25lZCkoKHVpbnRwdHJfdClWYWwuZ2V0Tm9kZSgpID4+IDQpIF4KKyAgICAgICAgICAgICh1bnNpZ25lZCkoKHVpbnRwdHJfdClWYWwuZ2V0Tm9kZSgpID4+IDkpKSArIFZhbC5nZXRSZXNObygpOworICB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgU0RWYWx1ZSAmTEhTLCBjb25zdCBTRFZhbHVlICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8U0RWYWx1ZT4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKworLy8vIHNpbXBsaWZ5X3R5cGUgc3BlY2lhbGl6YXRpb25zIC0gQWxsb3cgY2FzdGluZyBvcGVyYXRvcnMgdG8gd29yayBkaXJlY3RseSBvbgorLy8vIFNEVmFsdWVzIGFzIGlmIHRoZXkgd2VyZSBTRE5vZGUqJ3MuCit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPFNEVmFsdWU+IHsKKyAgdHlwZWRlZiBTRE5vZGUqIFNpbXBsZVR5cGU7CisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBTRFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U2ltcGxlVHlwZT4oVmFsLmdldE5vZGUoKSk7CisgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFNEVmFsdWU+IHsKKyAgdHlwZWRlZiBTRE5vZGUqIFNpbXBsZVR5cGU7CisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBTRFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U2ltcGxlVHlwZT4oVmFsLmdldE5vZGUoKSk7CisgIH0KK307CisKKy8vLyBTRFVzZSAtIFJlcHJlc2VudHMgYSB1c2Ugb2YgYSBTRE5vZGUuIFRoaXMgY2xhc3MgaG9sZHMgYW4gU0RWYWx1ZSwKKy8vLyB3aGljaCByZWNvcmRzIHRoZSBTRE5vZGUgYmVpbmcgdXNlZCBhbmQgdGhlIHJlc3VsdCBudW1iZXIsIGEKKy8vLyBwb2ludGVyIHRvIHRoZSBTRE5vZGUgdXNpbmcgdGhlIHZhbHVlLCBhbmQgTmV4dCBhbmQgUHJldiBwb2ludGVycywKKy8vLyB3aGljaCBsaW5rIHRvZ2V0aGVyIGFsbCB0aGUgdXNlcyBvZiBhbiBTRE5vZGUuCisvLy8KK2NsYXNzIFNEVXNlIHsKKyAgLy8vIFZhbCAtIFRoZSB2YWx1ZSBiZWluZyB1c2VkLgorICBTRFZhbHVlIFZhbDsKKyAgLy8vIFVzZXIgLSBUaGUgdXNlciBvZiB0aGlzIHZhbHVlLgorICBTRE5vZGUgKlVzZXI7CisgIC8vLyBQcmV2LCBOZXh0IC0gUG9pbnRlcnMgdG8gdGhlIHVzZXMgbGlzdCBvZiB0aGUgU0ROb2RlIHJlZmVycmVkIGJ5CisgIC8vLyB0aGlzIG9wZXJhbmQuCisgIFNEVXNlICoqUHJldiwgKk5leHQ7CisKKyAgU0RVc2UoY29uc3QgU0RVc2UgJlUpOyAgICAgICAgICAvLyBEbyBub3QgaW1wbGVtZW50CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNEVXNlICZVKTsgLy8gRG8gbm90IGltcGxlbWVudAorCitwdWJsaWM6CisgIFNEVXNlKCkgOiBWYWwoKSwgVXNlcihOVUxMKSwgUHJldihOVUxMKSwgTmV4dChOVUxMKSB7fQorCisgIC8vLyBOb3JtYWxseSBTRFVzZSB3aWxsIGp1c3QgaW1wbGljaXRseSBjb252ZXJ0IHRvIGFuIFNEVmFsdWUgdGhhdCBpdCBob2xkcy4KKyAgb3BlcmF0b3IgY29uc3QgU0RWYWx1ZSYoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICAvLy8gSWYgaW1wbGljaXQgY29udmVyc2lvbiB0byBTRFZhbHVlIGRvZXNuJ3Qgd29yaywgdGhlIGdldCgpIG1ldGhvZCByZXR1cm5zCisgIC8vLyB0aGUgU0RWYWx1ZS4KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0KCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisKKyAgLy8vIGdldFVzZXIgLSBUaGlzIHJldHVybnMgdGhlIFNETm9kZSB0aGF0IGNvbnRhaW5zIHRoaXMgVXNlLgorICBTRE5vZGUgKmdldFVzZXIoKSB7IHJldHVybiBVc2VyOyB9CisKKyAgLy8vIGdldE5leHQgLSBHZXQgdGhlIG5leHQgU0RVc2UgaW4gdGhlIHVzZSBsaXN0LgorICBTRFVzZSAqZ2V0TmV4dCgpIGNvbnN0IHsgcmV0dXJuIE5leHQ7IH0KKworICAvLy8gZ2V0Tm9kZSAtIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXQoKS5nZXROb2RlKCkuCisgIFNETm9kZSAqZ2V0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXROb2RlKCk7IH0KKyAgLy8vIGdldFJlc05vIC0gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdldCgpLmdldFJlc05vKCkuCisgIHVuc2lnbmVkIGdldFJlc05vKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldFJlc05vKCk7IH0KKyAgLy8vIGdldFZhbHVlVHlwZSAtIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXQoKS5nZXRWYWx1ZVR5cGUoKS4KKyAgRVZUIGdldFZhbHVlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRWYWx1ZVR5cGUoKTsgfQorCisgIC8vLyBvcGVyYXRvcj09IC0gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdldCgpLm9wZXJhdG9yPT0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNEVmFsdWUgJlYpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsID09IFY7CisgIH0KKworICAvLy8gb3BlcmF0b3IhPSAtIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXQoKS5vcGVyYXRvciE9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTRFZhbHVlICZWKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbCAhPSBWOworICB9CisKKyAgLy8vIG9wZXJhdG9yPCAtIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXQoKS5vcGVyYXRvcjwKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU0RWYWx1ZSAmVikgY29uc3QgeworICAgIHJldHVybiBWYWwgPCBWOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisgIGZyaWVuZCBjbGFzcyBTRE5vZGU7CisKKyAgdm9pZCBzZXRVc2VyKFNETm9kZSAqcCkgeyBVc2VyID0gcDsgfQorCisgIC8vLyBzZXQgLSBSZW1vdmUgdGhpcyB1c2UgZnJvbSBpdHMgZXhpc3RpbmcgdXNlIGxpc3QsIGFzc2lnbiBpdCB0aGUKKyAgLy8vIGdpdmVuIHZhbHVlLCBhbmQgYWRkIGl0IHRvIHRoZSBuZXcgdmFsdWUncyBub2RlJ3MgdXNlIGxpc3QuCisgIGlubGluZSB2b2lkIHNldChjb25zdCBTRFZhbHVlICZWKTsKKyAgLy8vIHNldEluaXRpYWwgLSBsaWtlIHNldCwgYnV0IG9ubHkgc3VwcG9ydHMgaW5pdGlhbGl6aW5nIGEgbmV3bHktYWxsb2NhdGVkCisgIC8vLyBTRFVzZSB3aXRoIGEgbm9uLW51bGwgdmFsdWUuCisgIGlubGluZSB2b2lkIHNldEluaXRpYWwoY29uc3QgU0RWYWx1ZSAmVik7CisgIC8vLyBzZXROb2RlIC0gbGlrZSBzZXQsIGJ1dCBvbmx5IHNldHMgdGhlIE5vZGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUsCisgIC8vLyBsZWF2aW5nIHRoZSBSZXNObyBwb3J0aW9uIHVubW9kaWZpZWQuCisgIGlubGluZSB2b2lkIHNldE5vZGUoU0ROb2RlICpOKTsKKworICB2b2lkIGFkZFRvTGlzdChTRFVzZSAqKkxpc3QpIHsKKyAgICBOZXh0ID0gKkxpc3Q7CisgICAgaWYgKE5leHQpIE5leHQtPlByZXYgPSAmTmV4dDsKKyAgICBQcmV2ID0gTGlzdDsKKyAgICAqTGlzdCA9IHRoaXM7CisgIH0KKworICB2b2lkIHJlbW92ZUZyb21MaXN0KCkgeworICAgICpQcmV2ID0gTmV4dDsKKyAgICBpZiAoTmV4dCkgTmV4dC0+UHJldiA9IFByZXY7CisgIH0KK307CisKKy8vLyBzaW1wbGlmeV90eXBlIHNwZWNpYWxpemF0aW9ucyAtIEFsbG93IGNhc3Rpbmcgb3BlcmF0b3JzIHRvIHdvcmsgZGlyZWN0bHkgb24KKy8vLyBTRFZhbHVlcyBhcyBpZiB0aGV5IHdlcmUgU0ROb2RlKidzLgordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxTRFVzZT4geworICB0eXBlZGVmIFNETm9kZSogU2ltcGxlVHlwZTsKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IFNEVXNlICZWYWwpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U2ltcGxlVHlwZT4oVmFsLmdldE5vZGUoKSk7CisgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFNEVXNlPiB7CisgIHR5cGVkZWYgU0ROb2RlKiBTaW1wbGVUeXBlOworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgU0RVc2UgJlZhbCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTaW1wbGVUeXBlPihWYWwuZ2V0Tm9kZSgpKTsKKyAgfQorfTsKKworCisvLy8gU0ROb2RlIC0gUmVwcmVzZW50cyBvbmUgbm9kZSBpbiB0aGUgU2VsZWN0aW9uREFHLgorLy8vCitjbGFzcyBTRE5vZGUgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUsIHB1YmxpYyBpbGlzdF9ub2RlPFNETm9kZT4geworcHJpdmF0ZToKKyAgLy8vIE5vZGVUeXBlIC0gVGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgbm9kZSBwZXJmb3Jtcy4KKyAgLy8vCisgIGludDE2X3QgTm9kZVR5cGU7CisKKyAgLy8vIE9wZXJhbmRzTmVlZERlbGV0ZSAtIFRoaXMgaXMgdHJ1ZSBpZiBPcGVyYW5kTGlzdCB3YXMgbmV3W10nZC4gIElmIHRydWUsCisgIC8vLyB0aGVuIHRoZXkgd2lsbCBiZSBkZWxldGVbXSdkIHdoZW4gdGhlIG5vZGUgaXMgZGVzdHJveWVkLgorICB1aW50MTZfdCBPcGVyYW5kc05lZWREZWxldGUgOiAxOworCisgIC8vLyBIYXNEZWJ1Z1ZhbHVlIC0gVGhpcyB0cmFja3Mgd2hldGhlciB0aGlzIG5vZGUgaGFzIG9uZSBvciBtb3JlIGRiZ192YWx1ZQorICAvLy8gbm9kZXMgY29ycmVzcG9uZGluZyB0byBpdC4KKyAgdWludDE2X3QgSGFzRGVidWdWYWx1ZSA6IDE7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFN1YmNsYXNzRGF0YSAtIFRoaXMgbWVtYmVyIGlzIGRlZmluZWQgYnkgdGhpcyBjbGFzcywgYnV0IGlzIG5vdCB1c2VkIGZvcgorICAvLy8gYW55dGhpbmcuICBTdWJjbGFzc2VzIGNhbiB1c2UgaXQgdG8gaG9sZCB3aGF0ZXZlciBzdGF0ZSB0aGV5IGZpbmQgdXNlZnVsLgorICAvLy8gVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCB0byB6ZXJvIGJ5IHRoZSBjdG9yLgorICB1aW50MTZfdCBTdWJjbGFzc0RhdGEgOiAxNDsKKworcHJpdmF0ZToKKyAgLy8vIE5vZGVJZCAtIFVuaXF1ZSBpZCBwZXIgU0ROb2RlIGluIHRoZSBEQUcuCisgIGludCBOb2RlSWQ7CisKKyAgLy8vIE9wZXJhbmRMaXN0IC0gVGhlIHZhbHVlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoaXMgb3BlcmF0aW9uLgorICAvLy8KKyAgU0RVc2UgKk9wZXJhbmRMaXN0OworCisgIC8vLyBWYWx1ZUxpc3QgLSBUaGUgdHlwZXMgb2YgdGhlIHZhbHVlcyB0aGlzIG5vZGUgZGVmaW5lcy4gIFNETm9kZSdzIG1heQorICAvLy8gZGVmaW5lIG11bHRpcGxlIHZhbHVlcyBzaW11bHRhbmVvdXNseS4KKyAgY29uc3QgRVZUICpWYWx1ZUxpc3Q7CisKKyAgLy8vIFVzZUxpc3QgLSBMaXN0IG9mIHVzZXMgZm9yIHRoaXMgU0ROb2RlLgorICBTRFVzZSAqVXNlTGlzdDsKKworICAvLy8gTnVtT3BlcmFuZHMvTnVtVmFsdWVzIC0gVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBPcGVyYW5kL1ZhbHVlIGxpc3QuCisgIHVuc2lnbmVkIHNob3J0IE51bU9wZXJhbmRzLCBOdW1WYWx1ZXM7CisKKyAgLy8vIGRlYnVnTG9jIC0gc291cmNlIGxpbmUgaW5mb3JtYXRpb24uCisgIERlYnVnTG9jIGRlYnVnTG9jOworCisgIC8vLyBnZXRWYWx1ZVR5cGVMaXN0IC0gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUuCisgIHN0YXRpYyBjb25zdCBFVlQgKmdldFZhbHVlVHlwZUxpc3QoRVZUIFZUKTsKKworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICBmcmllbmQgc3RydWN0IGlsaXN0X3RyYWl0czxTRE5vZGU+OworCitwdWJsaWM6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyAgQWNjZXNzb3JzCisgIC8vCisKKyAgLy8vIGdldE9wY29kZSAtIFJldHVybiB0aGUgU2VsZWN0aW9uREFHIG9wY29kZSB2YWx1ZSBmb3IgdGhpcyBub2RlLiBGb3IKKyAgLy8vIHByZS1pc2VsIG5vZGVzICh0aG9zZSBmb3Igd2hpY2ggaXNNYWNoaW5lT3Bjb2RlIHJldHVybnMgZmFsc2UpLCB0aGVzZQorICAvLy8gYXJlIHRoZSBvcGNvZGUgdmFsdWVzIGluIHRoZSBJU0QgYW5kIDx0YXJnZXQ+SVNEIG5hbWVzcGFjZXMuIEZvcgorICAvLy8gcG9zdC1pc2VsIG9wY29kZXMsIHNlZSBnZXRNYWNoaW5lT3Bjb2RlLgorICB1bnNpZ25lZCBnZXRPcGNvZGUoKSAgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkIHNob3J0KU5vZGVUeXBlOyB9CisKKyAgLy8vIGlzVGFyZ2V0T3Bjb2RlIC0gVGVzdCBpZiB0aGlzIG5vZGUgaGFzIGEgdGFyZ2V0LXNwZWNpZmljIG9wY29kZSAoaW4gdGhlCisgIC8vLyBcPHRhcmdldFw+SVNEIG5hbWVzcGFjZSkuCisgIGJvb2wgaXNUYXJnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBOb2RlVHlwZSA+PSBJU0Q6OkJVSUxUSU5fT1BfRU5EOyB9CisKKyAgLy8vIGlzVGFyZ2V0TWVtb3J5T3Bjb2RlIC0gVGVzdCBpZiB0aGlzIG5vZGUgaGFzIGEgdGFyZ2V0LXNwZWNpZmljIAorICAvLy8gbWVtb3J5LXJlZmVyZW5jaW5nIG9wY29kZSAoaW4gdGhlIFw8dGFyZ2V0XD5JU0QgbmFtZXNwYWNlIGFuZAorICAvLy8gZ3JlYXRlciB0aGFuIEZJUlNUX1RBUkdFVF9NRU1PUllfT1BDT0RFKS4KKyAgYm9vbCBpc1RhcmdldE1lbW9yeU9wY29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZVR5cGUgPj0gSVNEOjpGSVJTVF9UQVJHRVRfTUVNT1JZX09QQ09ERTsKKyAgfQorCisgIC8vLyBpc01hY2hpbmVPcGNvZGUgLSBUZXN0IGlmIHRoaXMgbm9kZSBoYXMgYSBwb3N0LWlzZWwgb3Bjb2RlLCBkaXJlY3RseQorICAvLy8gY29ycmVzcG9uZGluZyB0byBhIE1hY2hpbmVJbnN0ciBvcGNvZGUuCisgIGJvb2wgaXNNYWNoaW5lT3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gTm9kZVR5cGUgPCAwOyB9CisKKyAgLy8vIGdldE1hY2hpbmVPcGNvZGUgLSBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCBpZiBpc01hY2hpbmVPcGNvZGUgcmV0dXJucworICAvLy8gdHJ1ZS4gSXQgcmV0dXJucyB0aGUgTWFjaGluZUluc3RyIG9wY29kZSB2YWx1ZSB0aGF0IHRoZSBub2RlJ3Mgb3Bjb2RlCisgIC8vLyBjb3JyZXNwb25kcyB0by4KKyAgdW5zaWduZWQgZ2V0TWFjaGluZU9wY29kZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNNYWNoaW5lT3Bjb2RlKCkgJiYgIk5vdCBhIE1hY2hpbmVJbnN0ciBvcGNvZGUhIik7CisgICAgcmV0dXJuIH5Ob2RlVHlwZTsKKyAgfQorCisgIC8vLyBnZXRIYXNEZWJ1Z1ZhbHVlIC0gZ2V0IHRoaXMgYml0LgorICBib29sIGdldEhhc0RlYnVnVmFsdWUoKSBjb25zdCB7IHJldHVybiBIYXNEZWJ1Z1ZhbHVlOyB9CisKKyAgLy8vIHNldEhhc0RlYnVnVmFsdWUgLSBzZXQgdGhpcyBiaXQuCisgIHZvaWQgc2V0SGFzRGVidWdWYWx1ZShib29sIGIpIHsgSGFzRGVidWdWYWx1ZSA9IGI7IH0KKworICAvLy8gdXNlX2VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG5vIHVzZXMgb2YgdGhpcyBub2RlLgorICAvLy8KKyAgYm9vbCB1c2VfZW1wdHkoKSBjb25zdCB7IHJldHVybiBVc2VMaXN0ID09IE5VTEw7IH0KKworICAvLy8gaGFzT25lVXNlIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgdXNlIG9mIHRoaXMgbm9kZS4KKyAgLy8vCisgIGJvb2wgaGFzT25lVXNlKCkgY29uc3QgeworICAgIHJldHVybiAhdXNlX2VtcHR5KCkgJiYgbGx2bTo6bmV4dCh1c2VfYmVnaW4oKSkgPT0gdXNlX2VuZCgpOworICB9CisKKyAgLy8vIHVzZV9zaXplIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlcyBvZiB0aGlzIG5vZGUuIFRoaXMgbWV0aG9kIHRha2VzCisgIC8vLyB0aW1lIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIHVzZXMuCisgIC8vLworICBzaXplX3QgdXNlX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGQ6OmRpc3RhbmNlKHVzZV9iZWdpbigpLCB1c2VfZW5kKCkpOyB9CisKKyAgLy8vIGdldE5vZGVJZCAtIFJldHVybiB0aGUgdW5pcXVlIG5vZGUgaWQuCisgIC8vLworICBpbnQgZ2V0Tm9kZUlkKCkgY29uc3QgeyByZXR1cm4gTm9kZUlkOyB9CisKKyAgLy8vIHNldE5vZGVJZCAtIFNldCB1bmlxdWUgbm9kZSBpZC4KKyAgdm9pZCBzZXROb2RlSWQoaW50IElkKSB7IE5vZGVJZCA9IElkOyB9CisKKyAgLy8vIGdldERlYnVnTG9jIC0gUmV0dXJuIHRoZSBzb3VyY2UgbG9jYXRpb24gaW5mby4KKyAgY29uc3QgRGVidWdMb2MgZ2V0RGVidWdMb2MoKSBjb25zdCB7IHJldHVybiBkZWJ1Z0xvYzsgfQorCisgIC8vLyBzZXREZWJ1Z0xvYyAtIFNldCBzb3VyY2UgbG9jYXRpb24gaW5mby4gIFRyeSB0byBhdm9pZCB0aGlzLCBwdXR0aW5nCisgIC8vLyBpdCBpbiB0aGUgY29uc3RydWN0b3IgaXMgcHJlZmVyYWJsZS4KKyAgdm9pZCBzZXREZWJ1Z0xvYyhjb25zdCBEZWJ1Z0xvYyBkbCkgeyBkZWJ1Z0xvYyA9IGRsOyB9CisKKyAgLy8vIHVzZV9pdGVyYXRvciAtIFRoaXMgY2xhc3MgcHJvdmlkZXMgaXRlcmF0b3Igc3VwcG9ydCBmb3IgU0RVc2UKKyAgLy8vIG9wZXJhbmRzIHRoYXQgdXNlIGEgc3BlY2lmaWMgU0ROb2RlLgorICBjbGFzcyB1c2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFNEVXNlLCBwdHJkaWZmX3Q+IHsKKyAgICBTRFVzZSAqT3A7CisgICAgZXhwbGljaXQgdXNlX2l0ZXJhdG9yKFNEVXNlICpvcCkgOiBPcChvcCkgeworICAgIH0KKyAgICBmcmllbmQgY2xhc3MgU0ROb2RlOworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVXNlLCBwdHJkaWZmX3Q+OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFVzZSwgcHRyZGlmZl90Pjo6cG9pbnRlciBwb2ludGVyOworCisgICAgdXNlX2l0ZXJhdG9yKGNvbnN0IHVzZV9pdGVyYXRvciAmSSkgOiBPcChJLk9wKSB7fQorICAgIHVzZV9pdGVyYXRvcigpIDogT3AoMCkge30KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB1c2VfaXRlcmF0b3IgJngpIGNvbnN0IHsKKyAgICAgIHJldHVybiBPcCA9PSB4Lk9wOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgdXNlX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oeCk7CisgICAgfQorCisgICAgLy8vIGF0RW5kIC0gcmV0dXJuIHRydWUgaWYgdGhpcyBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHVzZXMgbGlzdC4KKyAgICBib29sIGF0RW5kKCkgY29uc3QgeyByZXR1cm4gT3AgPT0gMDsgfQorCisgICAgLy8gSXRlcmF0b3IgdHJhdmVyc2FsOiBmb3J3YXJkIGl0ZXJhdGlvbiBvbmx5LgorICAgIHVzZV9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgICAgT3AgPSBPcC0+Z2V0TmV4dCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHVzZV9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgICAgdXNlX2l0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICAgIH0KKworICAgIC8vLyBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdXNlciBub2RlLgorICAgIFNETm9kZSAqb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgYXNzZXJ0KE9wICYmICJDYW5ub3QgZGVyZWZlcmVuY2UgZW5kIGl0ZXJhdG9yISIpOworICAgICAgcmV0dXJuIE9wLT5nZXRVc2VyKCk7CisgICAgfQorCisgICAgU0ROb2RlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKworICAgIFNEVXNlICZnZXRVc2UoKSBjb25zdCB7IHJldHVybiAqT3A7IH0KKworICAgIC8vLyBnZXRPcGVyYW5kTm8gLSBSZXRyaWV2ZSB0aGUgb3BlcmFuZCAjIG9mIHRoaXMgdXNlIGluIGl0cyB1c2VyLgorICAgIC8vLworICAgIHVuc2lnbmVkIGdldE9wZXJhbmRObygpIGNvbnN0IHsKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGRlcmVmZXJlbmNlIGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIHJldHVybiAodW5zaWduZWQpKE9wIC0gT3AtPmdldFVzZXIoKS0+T3BlcmFuZExpc3QpOworICAgIH0KKyAgfTsKKworICAvLy8gdXNlX2JlZ2luL3VzZV9lbmQgLSBQcm92aWRlIGl0ZXJhdGlvbiBzdXBwb3J0IHRvIHdhbGsgb3ZlciBhbGwgdXNlcworICAvLy8gb2YgYW4gU0ROb2RlLgorCisgIHVzZV9pdGVyYXRvciB1c2VfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHVzZV9pdGVyYXRvcihVc2VMaXN0KTsKKyAgfQorCisgIHN0YXRpYyB1c2VfaXRlcmF0b3IgdXNlX2VuZCgpIHsgcmV0dXJuIHVzZV9pdGVyYXRvcigwKTsgfQorCisKKyAgLy8vIGhhc05Vc2VzT2ZWYWx1ZSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBleGFjdGx5IE5VU0VTIHVzZXMgb2YgdGhlCisgIC8vLyBpbmRpY2F0ZWQgdmFsdWUuICBUaGlzIG1ldGhvZCBpZ25vcmVzIHVzZXMgb2Ygb3RoZXIgdmFsdWVzIGRlZmluZWQgYnkgdGhpcworICAvLy8gb3BlcmF0aW9uLgorICBib29sIGhhc05Vc2VzT2ZWYWx1ZSh1bnNpZ25lZCBOVXNlcywgdW5zaWduZWQgVmFsdWUpIGNvbnN0OworCisgIC8vLyBoYXNBbnlVc2VPZlZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSB1c2Ugb2YgdGhlIGluZGljYXRlZAorICAvLy8gdmFsdWUuIFRoaXMgbWV0aG9kIGlnbm9yZXMgdXNlcyBvZiBvdGhlciB2YWx1ZXMgZGVmaW5lZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAgYm9vbCBoYXNBbnlVc2VPZlZhbHVlKHVuc2lnbmVkIFZhbHVlKSBjb25zdDsKKworICAvLy8gaXNPbmx5VXNlck9mIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGlzIHRoZSBvbmx5IHVzZSBvZiBOLgorICAvLy8KKyAgYm9vbCBpc09ubHlVc2VyT2YoU0ROb2RlICpOKSBjb25zdDsKKworICAvLy8gaXNPcGVyYW5kT2YgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG5vZGUgaXMgYW4gb3BlcmFuZCBvZiBOLgorICAvLy8KKyAgYm9vbCBpc09wZXJhbmRPZihTRE5vZGUgKk4pIGNvbnN0OworCisgIC8vLyBpc1ByZWRlY2Vzc29yT2YgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG5vZGUgaXMgYSBwcmVkZWNlc3NvciBvZiBOLiBUaGlzCisgIC8vLyBub2RlIGlzIGVpdGhlciBhbiBvcGVyYW5kIG9mIE4gb3IgaXQgY2FuIGJlIHJlYWNoZWQgYnkgcmVjdXJzaXZlbHkKKyAgLy8vIHRyYXZlcnNpbmcgdXAgdGhlIG9wZXJhbmRzLgorICAvLy8gTk9URTogdGhpcyBpcyBhbiBleHBlbnNpdmUgbWV0aG9kLiBVc2UgaXQgY2FyZWZ1bGx5LgorICBib29sIGlzUHJlZGVjZXNzb3JPZihTRE5vZGUgKk4pIGNvbnN0OworCisgIC8vLyBnZXROdW1PcGVyYW5kcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcyB1c2VkIGJ5IHRoaXMgb3BlcmF0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBOdW1PcGVyYW5kczsgfQorCisgIC8vLyBnZXRDb25zdGFudE9wZXJhbmRWYWwgLSBIZWxwZXIgbWV0aG9kIHJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgYQorICAvLy8gQ29uc3RhbnRTRE5vZGUgb3BlcmFuZC4KKyAgdWludDY0X3QgZ2V0Q29uc3RhbnRPcGVyYW5kVmFsKHVuc2lnbmVkIE51bSkgY29uc3Q7CisKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0T3BlcmFuZCh1bnNpZ25lZCBOdW0pIGNvbnN0IHsKKyAgICBhc3NlcnQoTnVtIDwgTnVtT3BlcmFuZHMgJiYgIkludmFsaWQgY2hpbGQgIyBvZiBTRE5vZGUhIik7CisgICAgcmV0dXJuIE9wZXJhbmRMaXN0W051bV07CisgIH0KKworICB0eXBlZGVmIFNEVXNlKiBvcF9pdGVyYXRvcjsKKyAgb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSBjb25zdCB7IHJldHVybiBPcGVyYW5kTGlzdDsgfQorICBvcF9pdGVyYXRvciBvcF9lbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kTGlzdCtOdW1PcGVyYW5kczsgfQorCisgIFNEVlRMaXN0IGdldFZUTGlzdCgpIGNvbnN0IHsKKyAgICBTRFZUTGlzdCBYID0geyBWYWx1ZUxpc3QsIE51bVZhbHVlcyB9OworICAgIHJldHVybiBYOworICB9CisKKyAgLy8vIGdldEZsYWdnZWROb2RlIC0gSWYgdGhpcyBub2RlIGhhcyBhIGZsYWcgb3BlcmFuZCwgcmV0dXJuIHRoZSBub2RlCisgIC8vLyB0byB3aGljaCB0aGUgZmxhZyBvcGVyYW5kIHBvaW50cy4gT3RoZXJ3aXNlIHJldHVybiBOVUxMLgorICBTRE5vZGUgKmdldEZsYWdnZWROb2RlKCkgY29uc3QgeworICAgIGlmIChnZXROdW1PcGVyYW5kcygpICE9IDAgJiYKKyAgICAgIGdldE9wZXJhbmQoZ2V0TnVtT3BlcmFuZHMoKS0xKS5nZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpID09IE1WVDo6RmxhZykKKyAgICAgIHJldHVybiBnZXRPcGVyYW5kKGdldE51bU9wZXJhbmRzKCktMSkuZ2V0Tm9kZSgpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gSWYgdGhpcyBpcyBhIHBzZXVkbyBvcCwgbGlrZSBjb3B5ZnJvbXJlZywgbG9vayB0byBzZWUgaWYgdGhlcmUgaXMgYQorICAvLyByZWFsIHRhcmdldCBub2RlIGZsYWdnZWQgdG8gaXQuICBJZiBzbywgcmV0dXJuIHRoZSB0YXJnZXQgbm9kZS4KKyAgY29uc3QgU0ROb2RlICpnZXRGbGFnZ2VkTWFjaGluZU5vZGUoKSBjb25zdCB7CisgICAgY29uc3QgU0ROb2RlICpGb3VuZE5vZGUgPSB0aGlzOworCisgICAgLy8gQ2xpbWIgdXAgZmxhZyBlZGdlcyB1bnRpbCBhIG1hY2hpbmUtb3Bjb2RlIG5vZGUgaXMgZm91bmQsIG9yIHRoZQorICAgIC8vIGVuZCBvZiB0aGUgY2hhaW4gaXMgcmVhY2hlZC4KKyAgICB3aGlsZSAoIUZvdW5kTm9kZS0+aXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICAgIGNvbnN0IFNETm9kZSAqTiA9IEZvdW5kTm9kZS0+Z2V0RmxhZ2dlZE5vZGUoKTsKKyAgICAgIGlmICghTikgYnJlYWs7CisgICAgICBGb3VuZE5vZGUgPSBOOworICAgIH0KKworICAgIHJldHVybiBGb3VuZE5vZGU7CisgIH0KKworICAvLy8gZ2V0RmxhZ2dlZFVzZXIgLSBJZiB0aGlzIG5vZGUgaGFzIGEgZmxhZyB2YWx1ZSB3aXRoIGEgdXNlciwgcmV0dXJuCisgIC8vLyB0aGUgdXNlciAodGhlcmUgaXMgYXQgbW9zdCBvbmUpLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCisgIFNETm9kZSAqZ2V0RmxhZ2dlZFVzZXIoKSBjb25zdCB7CisgICAgZm9yICh1c2VfaXRlcmF0b3IgVUkgPSB1c2VfYmVnaW4oKSwgVUUgPSB1c2VfZW5kKCk7IFVJICE9IFVFOyArK1VJKQorICAgICAgaWYgKFVJLmdldFVzZSgpLmdldCgpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6RmxhZykKKyAgICAgICAgcmV0dXJuICpVSTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXROdW1WYWx1ZXMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiB2YWx1ZXMgZGVmaW5lZC9yZXR1cm5lZCBieSB0aGlzCisgIC8vLyBvcGVyYXRvci4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE51bVZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIE51bVZhbHVlczsgfQorCisgIC8vLyBnZXRWYWx1ZVR5cGUgLSBSZXR1cm4gdGhlIHR5cGUgb2YgYSBzcGVjaWZpZWQgcmVzdWx0LgorICAvLy8KKyAgRVZUIGdldFZhbHVlVHlwZSh1bnNpZ25lZCBSZXNObykgY29uc3QgeworICAgIGFzc2VydChSZXNObyA8IE51bVZhbHVlcyAmJiAiSWxsZWdhbCByZXN1bHQgbnVtYmVyISIpOworICAgIHJldHVybiBWYWx1ZUxpc3RbUmVzTm9dOworICB9CisKKyAgLy8vIGdldFZhbHVlU2l6ZUluQml0cyAtIFJldHVybnMgTVZUOjpnZXRTaXplSW5CaXRzKGdldFZhbHVlVHlwZShSZXNObykpLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0VmFsdWVTaXplSW5CaXRzKHVuc2lnbmVkIFJlc05vKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbHVlVHlwZShSZXNObykuZ2V0U2l6ZUluQml0cygpOworICB9CisKKyAgdHlwZWRlZiBjb25zdCBFVlQqIHZhbHVlX2l0ZXJhdG9yOworICB2YWx1ZV9pdGVyYXRvciB2YWx1ZV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlTGlzdDsgfQorICB2YWx1ZV9pdGVyYXRvciB2YWx1ZV9lbmQoKSBjb25zdCB7IHJldHVybiBWYWx1ZUxpc3QrTnVtVmFsdWVzOyB9CisKKyAgLy8vIGdldE9wZXJhdGlvbk5hbWUgLSBSZXR1cm4gdGhlIG9wY29kZSBvZiB0aGlzIG9wZXJhdGlvbiBmb3IgcHJpbnRpbmcuCisgIC8vLworICBzdGQ6OnN0cmluZyBnZXRPcGVyYXRpb25OYW1lKGNvbnN0IFNlbGVjdGlvbkRBRyAqRyA9IDApIGNvbnN0OworICBzdGF0aWMgY29uc3QgY2hhciogZ2V0SW5kZXhlZE1vZGVOYW1lKElTRDo6TWVtSW5kZXhlZE1vZGUgQU0pOworICB2b2lkIHByaW50X3R5cGVzKHJhd19vc3RyZWFtICZPUywgY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdDsKKyAgdm9pZCBwcmludF9kZXRhaWxzKHJhd19vc3RyZWFtICZPUywgY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNlbGVjdGlvbkRBRyAqRyA9IDApIGNvbnN0OworICB2b2lkIHByaW50cihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNlbGVjdGlvbkRBRyAqRyA9IDApIGNvbnN0OworCisgIC8vLyBwcmludHJGdWxsIC0gUHJpbnQgYSBTZWxlY3Rpb25EQUcgbm9kZSBhbmQgYWxsIGNoaWxkcmVuIGRvd24gdG8KKyAgLy8vIHRoZSBsZWF2ZXMuICBUaGUgZ2l2ZW4gU2VsZWN0aW9uREFHIGFsbG93cyB0YXJnZXQtc3BlY2lmaWMgbm9kZXMKKyAgLy8vIHRvIGJlIHByaW50ZWQgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4gIFVubGlrZSBwcmludHIsIHRoaXMgd2lsbAorICAvLy8gcHJpbnQgdGhlIHdob2xlIERBRywgaW5jbHVkaW5nIGNoaWxkcmVuIHRoYXQgYXBwZWFyIG11bHRpcGxlCisgIC8vLyB0aW1lcy4KKyAgLy8vCisgIHZvaWQgcHJpbnRyRnVsbChyYXdfb3N0cmVhbSAmTywgY29uc3QgU2VsZWN0aW9uREFHICpHID0gMCkgY29uc3Q7CisKKyAgLy8vIHByaW50cldpdGhEZXB0aCAtIFByaW50IGEgU2VsZWN0aW9uREFHIG5vZGUgYW5kIGNoaWxkcmVuIHVwIHRvCisgIC8vLyBkZXB0aCAiZGVwdGguIiAgVGhlIGdpdmVuIFNlbGVjdGlvbkRBRyBhbGxvd3MgdGFyZ2V0LXNwZWNpZmljCisgIC8vLyBub2RlcyB0byBiZSBwcmludGVkIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uICBVbmxpa2UgcHJpbnRyLCB0aGlzCisgIC8vLyB3aWxsIHByaW50IGNoaWxkcmVuIHRoYXQgYXBwZWFyIG11bHRpcGxlIHRpbWVzIHdoZXJldmVyIHRoZXkgYXJlCisgIC8vLyB1c2VkLgorICAvLy8KKyAgdm9pZCBwcmludHJXaXRoRGVwdGgocmF3X29zdHJlYW0gJk8sIGNvbnN0IFNlbGVjdGlvbkRBRyAqRyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRlcHRoID0gMTAwKSBjb25zdDsKKworCisgIC8vLyBkdW1wIC0gRHVtcCB0aGlzIG5vZGUsIGZvciBkZWJ1Z2dpbmcuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBkdW1wciAtIER1bXAgKHJlY3Vyc2l2ZWx5KSB0aGlzIG5vZGUgYW5kIGl0cyB1c2UtZGVmIHN1YmdyYXBoLgorICB2b2lkIGR1bXByKCkgY29uc3Q7CisKKyAgLy8vIGR1bXAgLSBEdW1wIHRoaXMgbm9kZSwgZm9yIGRlYnVnZ2luZy4KKyAgLy8vIFRoZSBnaXZlbiBTZWxlY3Rpb25EQUcgYWxsb3dzIHRhcmdldC1zcGVjaWZpYyBub2RlcyB0byBiZSBwcmludGVkCisgIC8vLyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICB2b2lkIGR1bXAoY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdDsKKworICAvLy8gZHVtcHIgLSBEdW1wIChyZWN1cnNpdmVseSkgdGhpcyBub2RlIGFuZCBpdHMgdXNlLWRlZiBzdWJncmFwaC4KKyAgLy8vIFRoZSBnaXZlbiBTZWxlY3Rpb25EQUcgYWxsb3dzIHRhcmdldC1zcGVjaWZpYyBub2RlcyB0byBiZSBwcmludGVkCisgIC8vLyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICB2b2lkIGR1bXByKGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgY29uc3Q7CisKKyAgLy8vIGR1bXByRnVsbCAtIHByaW50ckZ1bGwgdG8gZGJncygpLiAgVGhlIGdpdmVuIFNlbGVjdGlvbkRBRyBhbGxvd3MKKyAgLy8vIHRhcmdldC1zcGVjaWZpYyBub2RlcyB0byBiZSBwcmludGVkIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uCisgIC8vLyBVbmxpa2UgZHVtcHIsIHRoaXMgd2lsbCBwcmludCB0aGUgd2hvbGUgREFHLCBpbmNsdWRpbmcgY2hpbGRyZW4KKyAgLy8vIHRoYXQgYXBwZWFyIG11bHRpcGxlIHRpbWVzLgorICAvLy8KKyAgdm9pZCBkdW1wckZ1bGwoY29uc3QgU2VsZWN0aW9uREFHICpHID0gMCkgY29uc3Q7CisKKyAgLy8vIGR1bXByV2l0aERlcHRoIC0gcHJpbnRyV2l0aERlcHRoIHRvIGRiZ3MoKS4gIFRoZSBnaXZlbgorICAvLy8gU2VsZWN0aW9uREFHIGFsbG93cyB0YXJnZXQtc3BlY2lmaWMgbm9kZXMgdG8gYmUgcHJpbnRlZCBpbgorICAvLy8gaHVtYW4tcmVhZGFibGUgZm9ybS4gIFVubGlrZSBkdW1wciwgdGhpcyB3aWxsIHByaW50IGNoaWxkcmVuCisgIC8vLyB0aGF0IGFwcGVhciBtdWx0aXBsZSB0aW1lcyB3aGVyZXZlciB0aGV5IGFyZSB1c2VkLgorICAvLy8KKyAgdm9pZCBkdW1wcldpdGhEZXB0aChjb25zdCBTZWxlY3Rpb25EQUcgKkcgPSAwLCB1bnNpZ25lZCBkZXB0aCA9IDEwMCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFByb2ZpbGUgLSBHYXRoZXIgdW5pcXVlIGRhdGEgZm9yIHRoZSBub2RlLgorICAvLy8KKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKworICAvLy8gYWRkVXNlIC0gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgU0RVc2UgY2xhc3MuCisgIC8vLworICB2b2lkIGFkZFVzZShTRFVzZSAmVSkgeyBVLmFkZFRvTGlzdCgmVXNlTGlzdCk7IH0KKworcHJvdGVjdGVkOgorICBzdGF0aWMgU0RWVExpc3QgZ2V0U0RWVExpc3QoRVZUIFZUKSB7CisgICAgU0RWVExpc3QgUmV0ID0geyBnZXRWYWx1ZVR5cGVMaXN0KFZUKSwgMSB9OworICAgIHJldHVybiBSZXQ7CisgIH0KKworICBTRE5vZGUodW5zaWduZWQgT3BjLCBjb25zdCBEZWJ1Z0xvYyBkbCwgU0RWVExpc3QgVlRzLCBjb25zdCBTRFZhbHVlICpPcHMsCisgICAgICAgICB1bnNpZ25lZCBOdW1PcHMpCisgICAgOiBOb2RlVHlwZShPcGMpLCBPcGVyYW5kc05lZWREZWxldGUodHJ1ZSksIEhhc0RlYnVnVmFsdWUoZmFsc2UpLAorICAgICAgU3ViY2xhc3NEYXRhKDApLCBOb2RlSWQoLTEpLAorICAgICAgT3BlcmFuZExpc3QoTnVtT3BzID8gbmV3IFNEVXNlW051bU9wc10gOiAwKSwKKyAgICAgIFZhbHVlTGlzdChWVHMuVlRzKSwgVXNlTGlzdChOVUxMKSwKKyAgICAgIE51bU9wZXJhbmRzKE51bU9wcyksIE51bVZhbHVlcyhWVHMuTnVtVlRzKSwKKyAgICAgIGRlYnVnTG9jKGRsKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHM7ICsraSkgeworICAgICAgT3BlcmFuZExpc3RbaV0uc2V0VXNlcih0aGlzKTsKKyAgICAgIE9wZXJhbmRMaXN0W2ldLnNldEluaXRpYWwoT3BzW2ldKTsKKyAgICB9CisgICAgY2hlY2tGb3JDeWNsZXModGhpcyk7CisgIH0KKworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBhZGRzIG5vIG9wZXJhbmRzIGl0c2VsZjsgb3BlcmFuZHMgY2FuIGJlCisgIC8vLyBzZXQgbGF0ZXIgd2l0aCBJbml0T3BlcmFuZHMuCisgIFNETm9kZSh1bnNpZ25lZCBPcGMsIGNvbnN0IERlYnVnTG9jIGRsLCBTRFZUTGlzdCBWVHMpCisgICAgOiBOb2RlVHlwZShPcGMpLCBPcGVyYW5kc05lZWREZWxldGUoZmFsc2UpLCBIYXNEZWJ1Z1ZhbHVlKGZhbHNlKSwKKyAgICAgIFN1YmNsYXNzRGF0YSgwKSwgTm9kZUlkKC0xKSwgT3BlcmFuZExpc3QoMCksIFZhbHVlTGlzdChWVHMuVlRzKSwKKyAgICAgIFVzZUxpc3QoTlVMTCksIE51bU9wZXJhbmRzKDApLCBOdW1WYWx1ZXMoVlRzLk51bVZUcyksCisgICAgICBkZWJ1Z0xvYyhkbCkge30KKworICAvLy8gSW5pdE9wZXJhbmRzIC0gSW5pdGlhbGl6ZSB0aGUgb3BlcmFuZHMgbGlzdCBvZiB0aGlzIHdpdGggMSBvcGVyYW5kLgorICB2b2lkIEluaXRPcGVyYW5kcyhTRFVzZSAqT3BzLCBjb25zdCBTRFZhbHVlICZPcDApIHsKKyAgICBPcHNbMF0uc2V0VXNlcih0aGlzKTsKKyAgICBPcHNbMF0uc2V0SW5pdGlhbChPcDApOworICAgIE51bU9wZXJhbmRzID0gMTsKKyAgICBPcGVyYW5kTGlzdCA9IE9wczsKKyAgICBjaGVja0ZvckN5Y2xlcyh0aGlzKTsKKyAgfQorCisgIC8vLyBJbml0T3BlcmFuZHMgLSBJbml0aWFsaXplIHRoZSBvcGVyYW5kcyBsaXN0IG9mIHRoaXMgd2l0aCAyIG9wZXJhbmRzLgorICB2b2lkIEluaXRPcGVyYW5kcyhTRFVzZSAqT3BzLCBjb25zdCBTRFZhbHVlICZPcDAsIGNvbnN0IFNEVmFsdWUgJk9wMSkgeworICAgIE9wc1swXS5zZXRVc2VyKHRoaXMpOworICAgIE9wc1swXS5zZXRJbml0aWFsKE9wMCk7CisgICAgT3BzWzFdLnNldFVzZXIodGhpcyk7CisgICAgT3BzWzFdLnNldEluaXRpYWwoT3AxKTsKKyAgICBOdW1PcGVyYW5kcyA9IDI7CisgICAgT3BlcmFuZExpc3QgPSBPcHM7CisgICAgY2hlY2tGb3JDeWNsZXModGhpcyk7CisgIH0KKworICAvLy8gSW5pdE9wZXJhbmRzIC0gSW5pdGlhbGl6ZSB0aGUgb3BlcmFuZHMgbGlzdCBvZiB0aGlzIHdpdGggMyBvcGVyYW5kcy4KKyAgdm9pZCBJbml0T3BlcmFuZHMoU0RVc2UgKk9wcywgY29uc3QgU0RWYWx1ZSAmT3AwLCBjb25zdCBTRFZhbHVlICZPcDEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgJk9wMikgeworICAgIE9wc1swXS5zZXRVc2VyKHRoaXMpOworICAgIE9wc1swXS5zZXRJbml0aWFsKE9wMCk7CisgICAgT3BzWzFdLnNldFVzZXIodGhpcyk7CisgICAgT3BzWzFdLnNldEluaXRpYWwoT3AxKTsKKyAgICBPcHNbMl0uc2V0VXNlcih0aGlzKTsKKyAgICBPcHNbMl0uc2V0SW5pdGlhbChPcDIpOworICAgIE51bU9wZXJhbmRzID0gMzsKKyAgICBPcGVyYW5kTGlzdCA9IE9wczsKKyAgICBjaGVja0ZvckN5Y2xlcyh0aGlzKTsKKyAgfQorCisgIC8vLyBJbml0T3BlcmFuZHMgLSBJbml0aWFsaXplIHRoZSBvcGVyYW5kcyBsaXN0IG9mIHRoaXMgd2l0aCA0IG9wZXJhbmRzLgorICB2b2lkIEluaXRPcGVyYW5kcyhTRFVzZSAqT3BzLCBjb25zdCBTRFZhbHVlICZPcDAsIGNvbnN0IFNEVmFsdWUgJk9wMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAmT3AyLCBjb25zdCBTRFZhbHVlICZPcDMpIHsKKyAgICBPcHNbMF0uc2V0VXNlcih0aGlzKTsKKyAgICBPcHNbMF0uc2V0SW5pdGlhbChPcDApOworICAgIE9wc1sxXS5zZXRVc2VyKHRoaXMpOworICAgIE9wc1sxXS5zZXRJbml0aWFsKE9wMSk7CisgICAgT3BzWzJdLnNldFVzZXIodGhpcyk7CisgICAgT3BzWzJdLnNldEluaXRpYWwoT3AyKTsKKyAgICBPcHNbM10uc2V0VXNlcih0aGlzKTsKKyAgICBPcHNbM10uc2V0SW5pdGlhbChPcDMpOworICAgIE51bU9wZXJhbmRzID0gNDsKKyAgICBPcGVyYW5kTGlzdCA9IE9wczsKKyAgICBjaGVja0ZvckN5Y2xlcyh0aGlzKTsKKyAgfQorCisgIC8vLyBJbml0T3BlcmFuZHMgLSBJbml0aWFsaXplIHRoZSBvcGVyYW5kcyBsaXN0IG9mIHRoaXMgd2l0aCBOIG9wZXJhbmRzLgorICB2b2lkIEluaXRPcGVyYW5kcyhTRFVzZSAqT3BzLCBjb25zdCBTRFZhbHVlICpWYWxzLCB1bnNpZ25lZCBOKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOOyArK2kpIHsKKyAgICAgIE9wc1tpXS5zZXRVc2VyKHRoaXMpOworICAgICAgT3BzW2ldLnNldEluaXRpYWwoVmFsc1tpXSk7CisgICAgfQorICAgIE51bU9wZXJhbmRzID0gTjsKKyAgICBPcGVyYW5kTGlzdCA9IE9wczsKKyAgICBjaGVja0ZvckN5Y2xlcyh0aGlzKTsKKyAgfQorCisgIC8vLyBEcm9wT3BlcmFuZHMgLSBSZWxlYXNlIHRoZSBvcGVyYW5kcyBhbmQgc2V0IHRoaXMgbm9kZSB0byBoYXZlCisgIC8vLyB6ZXJvIG9wZXJhbmRzLgorICB2b2lkIERyb3BPcGVyYW5kcygpOworfTsKKworCisvLyBEZWZpbmUgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoZSBTRFZhbHVlIGNsYXNzLgorCitpbmxpbmUgdW5zaWduZWQgU0RWYWx1ZTo6Z2V0T3Bjb2RlKCkgY29uc3QgeworICByZXR1cm4gTm9kZS0+Z2V0T3Bjb2RlKCk7Cit9CitpbmxpbmUgRVZUIFNEVmFsdWU6OmdldFZhbHVlVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmdldFZhbHVlVHlwZShSZXNObyk7Cit9CitpbmxpbmUgdW5zaWduZWQgU0RWYWx1ZTo6Z2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5nZXROdW1PcGVyYW5kcygpOworfQoraW5saW5lIGNvbnN0IFNEVmFsdWUgJlNEVmFsdWU6OmdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3QgeworICByZXR1cm4gTm9kZS0+Z2V0T3BlcmFuZChpKTsKK30KK2lubGluZSB1aW50NjRfdCBTRFZhbHVlOjpnZXRDb25zdGFudE9wZXJhbmRWYWwodW5zaWduZWQgaSkgY29uc3QgeworICByZXR1cm4gTm9kZS0+Z2V0Q29uc3RhbnRPcGVyYW5kVmFsKGkpOworfQoraW5saW5lIGJvb2wgU0RWYWx1ZTo6aXNUYXJnZXRPcGNvZGUoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5pc1RhcmdldE9wY29kZSgpOworfQoraW5saW5lIGJvb2wgU0RWYWx1ZTo6aXNUYXJnZXRNZW1vcnlPcGNvZGUoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5pc1RhcmdldE1lbW9yeU9wY29kZSgpOworfQoraW5saW5lIGJvb2wgU0RWYWx1ZTo6aXNNYWNoaW5lT3Bjb2RlKCkgY29uc3QgeworICByZXR1cm4gTm9kZS0+aXNNYWNoaW5lT3Bjb2RlKCk7Cit9CitpbmxpbmUgdW5zaWduZWQgU0RWYWx1ZTo6Z2V0TWFjaGluZU9wY29kZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmdldE1hY2hpbmVPcGNvZGUoKTsKK30KK2lubGluZSBib29sIFNEVmFsdWU6OnVzZV9lbXB0eSgpIGNvbnN0IHsKKyAgcmV0dXJuICFOb2RlLT5oYXNBbnlVc2VPZlZhbHVlKFJlc05vKTsKK30KK2lubGluZSBib29sIFNEVmFsdWU6Omhhc09uZVVzZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmhhc05Vc2VzT2ZWYWx1ZSgxLCBSZXNObyk7Cit9CitpbmxpbmUgY29uc3QgRGVidWdMb2MgU0RWYWx1ZTo6Z2V0RGVidWdMb2MoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5nZXREZWJ1Z0xvYygpOworfQorCisvLyBEZWZpbmUgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoZSBTRFVzZSBjbGFzcy4KKworaW5saW5lIHZvaWQgU0RVc2U6OnNldChjb25zdCBTRFZhbHVlICZWKSB7CisgIGlmIChWYWwuZ2V0Tm9kZSgpKSByZW1vdmVGcm9tTGlzdCgpOworICBWYWwgPSBWOworICBpZiAoVi5nZXROb2RlKCkpIFYuZ2V0Tm9kZSgpLT5hZGRVc2UoKnRoaXMpOworfQorCitpbmxpbmUgdm9pZCBTRFVzZTo6c2V0SW5pdGlhbChjb25zdCBTRFZhbHVlICZWKSB7CisgIFZhbCA9IFY7CisgIFYuZ2V0Tm9kZSgpLT5hZGRVc2UoKnRoaXMpOworfQorCitpbmxpbmUgdm9pZCBTRFVzZTo6c2V0Tm9kZShTRE5vZGUgKk4pIHsKKyAgaWYgKFZhbC5nZXROb2RlKCkpIHJlbW92ZUZyb21MaXN0KCk7CisgIFZhbC5zZXROb2RlKE4pOworICBpZiAoTikgTi0+YWRkVXNlKCp0aGlzKTsKK30KKworLy8vIFVuYXJ5U0ROb2RlIC0gVGhpcyBjbGFzcyBpcyB1c2VkIGZvciBzaW5nbGUtb3BlcmFuZCBTRE5vZGVzLiAgVGhpcyBpcyBzb2xlbHkKKy8vLyB0byBhbGxvdyBjby1hbGxvY2F0aW9uIG9mIG5vZGUgb3BlcmFuZHMgd2l0aCB0aGUgbm9kZSBpdHNlbGYuCitjbGFzcyBVbmFyeVNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBTRFVzZSBPcDsKK3B1YmxpYzoKKyAgVW5hcnlTRE5vZGUodW5zaWduZWQgT3BjLCBEZWJ1Z0xvYyBkbCwgU0RWVExpc3QgVlRzLCBTRFZhbHVlIFgpCisgICAgOiBTRE5vZGUoT3BjLCBkbCwgVlRzKSB7CisgICAgSW5pdE9wZXJhbmRzKCZPcCwgWCk7CisgIH0KK307CisKKy8vLyBCaW5hcnlTRE5vZGUgLSBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIHR3by1vcGVyYW5kIFNETm9kZXMuICBUaGlzIGlzIHNvbGVseQorLy8vIHRvIGFsbG93IGNvLWFsbG9jYXRpb24gb2Ygbm9kZSBvcGVyYW5kcyB3aXRoIHRoZSBub2RlIGl0c2VsZi4KK2NsYXNzIEJpbmFyeVNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBTRFVzZSBPcHNbMl07CitwdWJsaWM6CisgIEJpbmFyeVNETm9kZSh1bnNpZ25lZCBPcGMsIERlYnVnTG9jIGRsLCBTRFZUTGlzdCBWVHMsIFNEVmFsdWUgWCwgU0RWYWx1ZSBZKQorICAgIDogU0ROb2RlKE9wYywgZGwsIFZUcykgeworICAgIEluaXRPcGVyYW5kcyhPcHMsIFgsIFkpOworICB9Cit9OworCisvLy8gVGVybmFyeVNETm9kZSAtIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgdGhyZWUtb3BlcmFuZCBTRE5vZGVzLiBUaGlzIGlzIHNvbGVseQorLy8vIHRvIGFsbG93IGNvLWFsbG9jYXRpb24gb2Ygbm9kZSBvcGVyYW5kcyB3aXRoIHRoZSBub2RlIGl0c2VsZi4KK2NsYXNzIFRlcm5hcnlTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgU0RVc2UgT3BzWzNdOworcHVibGljOgorICBUZXJuYXJ5U0ROb2RlKHVuc2lnbmVkIE9wYywgRGVidWdMb2MgZGwsIFNEVlRMaXN0IFZUcywgU0RWYWx1ZSBYLCBTRFZhbHVlIFksCisgICAgICAgICAgICAgICAgU0RWYWx1ZSBaKQorICAgIDogU0ROb2RlKE9wYywgZGwsIFZUcykgeworICAgIEluaXRPcGVyYW5kcyhPcHMsIFgsIFksIFopOworICB9Cit9OworCisKKy8vLyBIYW5kbGVTRE5vZGUgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZm9ybSBhIGhhbmRsZSBhcm91bmQgYW5vdGhlciBub2RlIHRoYXQKKy8vLyBpcyBwZXJzaXN0YW50IGFuZCBpcyB1cGRhdGVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiByZXBsYWNlQWxsVXNlc1dpdGggb24gaXRzCisvLy8gb3BlcmFuZC4gIFRoaXMgbm9kZSBzaG91bGQgYmUgZGlyZWN0bHkgY3JlYXRlZCBieSBlbmQtdXNlcnMgYW5kIG5vdCBhZGRlZCB0bworLy8vIHRoZSBBbGxOb2RlcyBsaXN0LgorY2xhc3MgSGFuZGxlU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIFNEVXNlIE9wOworcHVibGljOgorICAvLyBGSVhNRTogUmVtb3ZlIHRoZSAibm9pbmxpbmUiIGF0dHJpYnV0ZSBvbmNlIDxyZGFyOi8vcHJvYmxlbS81ODUyNzQ2PiBpcworICAvLyBmaXhlZC4KKyNpZiBfX0dOVUNfXz09NCAmJiBfX0dOVUNfTUlOT1JfXz09MiAmJiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX19sbHZtX18pCisgIGV4cGxpY2l0IF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpIEhhbmRsZVNETm9kZShTRFZhbHVlIFgpCisjZWxzZQorICBleHBsaWNpdCBIYW5kbGVTRE5vZGUoU0RWYWx1ZSBYKQorI2VuZGlmCisgICAgOiBTRE5vZGUoSVNEOjpIQU5ETEVOT0RFLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChNVlQ6Ok90aGVyKSkgeworICAgIEluaXRPcGVyYW5kcygmT3AsIFgpOworICB9CisgIH5IYW5kbGVTRE5vZGUoKTsKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBPcDsgfQorfTsKKworLy8vIEFic3RhY3QgdmlydHVhbCBjbGFzcyBmb3Igb3BlcmF0aW9ucyBmb3IgbWVtb3J5IG9wZXJhdGlvbnMKK2NsYXNzIE1lbVNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworcHJpdmF0ZToKKyAgLy8gTWVtb3J5VlQgLSBWVCBvZiBpbi1tZW1vcnkgdmFsdWUuCisgIEVWVCBNZW1vcnlWVDsKKworcHJvdGVjdGVkOgorICAvLy8gTU1PIC0gTWVtb3J5IHJlZmVyZW5jZSBpbmZvcm1hdGlvbi4KKyAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTzsKKworcHVibGljOgorICBNZW1TRE5vZGUodW5zaWduZWQgT3BjLCBEZWJ1Z0xvYyBkbCwgU0RWVExpc3QgVlRzLCBFVlQgTWVtb3J5VlQsCisgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKTsKKworICBNZW1TRE5vZGUodW5zaWduZWQgT3BjLCBEZWJ1Z0xvYyBkbCwgU0RWVExpc3QgVlRzLCBjb25zdCBTRFZhbHVlICpPcHMsCisgICAgICAgICAgICB1bnNpZ25lZCBOdW1PcHMsIEVWVCBNZW1vcnlWVCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgYm9vbCByZWFkTWVtKCkgY29uc3QgeyByZXR1cm4gTU1PLT5pc0xvYWQoKTsgfQorICBib29sIHdyaXRlTWVtKCkgY29uc3QgeyByZXR1cm4gTU1PLT5pc1N0b3JlKCk7IH0KKworICAvLy8gUmV0dXJucyBhbGlnbm1lbnQgYW5kIHZvbGF0aWxpdHkgb2YgdGhlIG1lbW9yeSBhY2Nlc3MKKyAgdW5zaWduZWQgZ2V0T3JpZ2luYWxBbGlnbm1lbnQoKSBjb25zdCB7IAorICAgIHJldHVybiBNTU8tPmdldEJhc2VBbGlnbm1lbnQoKTsKKyAgfQorICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIE1NTy0+Z2V0QWxpZ25tZW50KCk7CisgIH0KKworICAvLy8gZ2V0UmF3U3ViY2xhc3NEYXRhIC0gUmV0dXJuIHRoZSBTdWJjbGFzc0RhdGEgdmFsdWUsIHdoaWNoIGNvbnRhaW5zIGFuCisgIC8vLyBlbmNvZGluZyBvZiB0aGUgdm9sYXRpbGUgZmxhZywgYXMgd2VsbCBhcyBiaXRzIHVzZWQgYnkgc3ViY2xhc3Nlcy4gVGhpcworICAvLy8gZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBjb21wdXRlIGEgRm9sZGluZ1NldE5vZGVJRCB2YWx1ZS4KKyAgdW5zaWduZWQgZ2V0UmF3U3ViY2xhc3NEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBTdWJjbGFzc0RhdGE7CisgIH0KKworICAvLyBXZSBhY2Nlc3Mgc3ViY2xhc3MgZGF0YSBoZXJlIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGNvbnNpc3RlbmN5CisgIC8vIHdpdGggTWFjaGluZU1lbU9wZXJhbmQgaW5mb3JtYXRpb24uCisgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsgcmV0dXJuIChTdWJjbGFzc0RhdGEgPj4gNSkgJiAxOyB9CisgIGJvb2wgaXNOb25UZW1wb3JhbCgpIGNvbnN0IHsgcmV0dXJuIChTdWJjbGFzc0RhdGEgPj4gNikgJiAxOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIFNyY1ZhbHVlIGFuZCBvZmZzZXQgdGhhdCBkZXNjcmliZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBhY2Nlc3MKKyAgY29uc3QgVmFsdWUgKmdldFNyY1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gTU1PLT5nZXRWYWx1ZSgpOyB9CisgIGludDY0X3QgZ2V0U3JjVmFsdWVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBNTU8tPmdldE9mZnNldCgpOyB9CisKKyAgLy8vIGdldE1lbW9yeVZUIC0gUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBpbi1tZW1vcnkgdmFsdWUuCisgIEVWVCBnZXRNZW1vcnlWVCgpIGNvbnN0IHsgcmV0dXJuIE1lbW9yeVZUOyB9CisKKyAgLy8vIGdldE1lbU9wZXJhbmQgLSBSZXR1cm4gYSBNYWNoaW5lTWVtT3BlcmFuZCBvYmplY3QgZGVzY3JpYmluZyB0aGUgbWVtb3J5CisgIC8vLyByZWZlcmVuY2UgcGVyZm9ybWVkIGJ5IG9wZXJhdGlvbi4KKyAgTWFjaGluZU1lbU9wZXJhbmQgKmdldE1lbU9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBNTU87IH0KKworICAvLy8gcmVmaW5lQWxpZ25tZW50IC0gVXBkYXRlIHRoaXMgTWVtU0ROb2RlJ3MgTWFjaGluZU1lbU9wZXJhbmQgaW5mb3JtYXRpb24KKyAgLy8vIHRvIHJlZmxlY3QgdGhlIGFsaWdubWVudCBvZiBOZXdNTU8sIGlmIGl0IGhhcyBhIGdyZWF0ZXIgYWxpZ25tZW50LgorICAvLy8gVGhpcyBtdXN0IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBuZXcgYWxpZ25tZW50IGFwcGxpZXMgdG8gYWxsIHVzZXJzIG9mCisgIC8vLyB0aGlzIE1hY2hpbmVNZW1PcGVyYW5kLgorICB2b2lkIHJlZmluZUFsaWdubWVudChjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqTmV3TU1PKSB7CisgICAgTU1PLT5yZWZpbmVBbGlnbm1lbnQoTmV3TU1PKTsKKyAgfQorCisgIGNvbnN0IFNEVmFsdWUgJmdldENoYWluKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBjb25zdCBTRFZhbHVlICZnZXRCYXNlUHRyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKGdldE9wY29kZSgpID09IElTRDo6U1RPUkUgPyAyIDogMSk7CisgIH0KKworICAvLyBNZXRob2RzIHRvIHN1cHBvcnQgaXNhIGFuZCBkeW5fY2FzdAorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVNETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgLy8gRm9yIHNvbWUgdGFyZ2V0cywgd2UgbG93ZXIgc29tZSB0YXJnZXQgaW50cmluc2ljcyB0byBhIE1lbUludHJpbnNpY05vZGUKKyAgICAvLyB3aXRoIGVpdGhlciBhbiBpbnRyaW5zaWMgb3IgYSB0YXJnZXQgb3Bjb2RlLgorICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkxPQUQgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTVE9SRSAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0NNUF9TV0FQICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19TV0FQICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9BREQgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfU1VCICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX0FORCAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9PUiAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfWE9SICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX05BTkQgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9NSU4gICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfTUFYICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX1VNSU4gICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9VTUFYICAgIHx8CisgICAgICAgICAgIE4tPmlzVGFyZ2V0TWVtb3J5T3Bjb2RlKCk7CisgIH0KK307CisKKy8vLyBBdG9taWNTRE5vZGUgLSBBIFNETm9kZSByZXByZW50aW5nIGF0b21pYyBvcGVyYXRpb25zLgorLy8vCitjbGFzcyBBdG9taWNTRE5vZGUgOiBwdWJsaWMgTWVtU0ROb2RlIHsKKyAgU0RVc2UgT3BzWzRdOworCitwdWJsaWM6CisgIC8vIE9wYzogICBvcGNvZGUgZm9yIGF0b21pYworICAvLyBWVEw6ICAgIHZhbHVlIHR5cGUgbGlzdAorICAvLyBDaGFpbjogIG1lbW9yeSBjaGFpbiBmb3Igb3BlcmFhbmQKKyAgLy8gUHRyOiAgICBhZGRyZXNzIHRvIHVwZGF0ZSBhcyBhIFNEVmFsdWUKKyAgLy8gQ21wOiAgICBjb21wYXJlIHZhbHVlCisgIC8vIFN3cDogICAgc3dhcCB2YWx1ZQorICAvLyBTcmNWYWw6IGFkZHJlc3MgdG8gdXBkYXRlIGFzIGEgVmFsdWUgKHVzZWQgZm9yIE1lbU9wZXJhbmQpCisgIC8vIEFsaWduOiAgYWxpZ25tZW50IG9mIG1lbW9yeQorICBBdG9taWNTRE5vZGUodW5zaWduZWQgT3BjLCBEZWJ1Z0xvYyBkbCwgU0RWVExpc3QgVlRMLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwKKyAgICAgICAgICAgICAgIFNEVmFsdWUgQ21wLCBTRFZhbHVlIFN3cCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykKKyAgICA6IE1lbVNETm9kZShPcGMsIGRsLCBWVEwsIE1lbVZULCBNTU8pIHsKKyAgICBhc3NlcnQocmVhZE1lbSgpICYmICJBdG9taWMgTWFjaGluZU1lbU9wZXJhbmQgaXMgbm90IGEgbG9hZCEiKTsKKyAgICBhc3NlcnQod3JpdGVNZW0oKSAmJiAiQXRvbWljIE1hY2hpbmVNZW1PcGVyYW5kIGlzIG5vdCBhIHN0b3JlISIpOworICAgIEluaXRPcGVyYW5kcyhPcHMsIENoYWluLCBQdHIsIENtcCwgU3dwKTsKKyAgfQorICBBdG9taWNTRE5vZGUodW5zaWduZWQgT3BjLCBEZWJ1Z0xvYyBkbCwgU0RWVExpc3QgVlRMLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwKKyAgICAgICAgICAgICAgIFNEVmFsdWUgVmFsLCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgIDogTWVtU0ROb2RlKE9wYywgZGwsIFZUTCwgTWVtVlQsIE1NTykgeworICAgIGFzc2VydChyZWFkTWVtKCkgJiYgIkF0b21pYyBNYWNoaW5lTWVtT3BlcmFuZCBpcyBub3QgYSBsb2FkISIpOworICAgIGFzc2VydCh3cml0ZU1lbSgpICYmICJBdG9taWMgTWFjaGluZU1lbU9wZXJhbmQgaXMgbm90IGEgc3RvcmUhIik7CisgICAgSW5pdE9wZXJhbmRzKE9wcywgQ2hhaW4sIFB0ciwgVmFsKTsKKyAgfQorCisgIGNvbnN0IFNEVmFsdWUgJmdldEJhc2VQdHIoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIGNvbnN0IFNEVmFsdWUgJmdldFZhbCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMik7IH0KKworICBib29sIGlzQ29tcGFyZUFuZFN3YXAoKSBjb25zdCB7CisgICAgdW5zaWduZWQgT3AgPSBnZXRPcGNvZGUoKTsKKyAgICByZXR1cm4gT3AgPT0gSVNEOjpBVE9NSUNfQ01QX1NXQVA7CisgIH0KKworICAvLyBNZXRob2RzIHRvIHN1cHBvcnQgaXNhIGFuZCBkeW5fY2FzdAorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0b21pY1NETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0NNUF9TV0FQICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19TV0FQICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9BREQgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfU1VCICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX0FORCAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9PUiAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfWE9SICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX05BTkQgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9NSU4gICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfTUFYICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX1VNSU4gICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9VTUFYOworICB9Cit9OworCisvLy8gTWVtSW50cmluc2ljU0ROb2RlIC0gVGhpcyBTRE5vZGUgaXMgdXNlZCBmb3IgdGFyZ2V0IGludHJpbnNpY3MgdGhhdCB0b3VjaAorLy8vIG1lbW9yeSBhbmQgbmVlZCBhbiBhc3NvY2lhdGVkIE1hY2hpbmVNZW1PcGVyYW5kLiBJdHMgb3Bjb2RlIG1heSBiZQorLy8vIElOVFJJTlNJQ19WT0lELCBJTlRSSU5TSUNfV19DSEFJTiwgb3IgYSB0YXJnZXQtc3BlY2lmaWMgb3Bjb2RlIHdpdGggYQorLy8vIHZhbHVlIG5vdCBsZXNzIHRoYW4gRklSU1RfVEFSR0VUX01FTU9SWV9PUENPREUuCitjbGFzcyBNZW1JbnRyaW5zaWNTRE5vZGUgOiBwdWJsaWMgTWVtU0ROb2RlIHsKK3B1YmxpYzoKKyAgTWVtSW50cmluc2ljU0ROb2RlKHVuc2lnbmVkIE9wYywgRGVidWdMb2MgZGwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICAgICAgICAgRVZUIE1lbW9yeVZULCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgIDogTWVtU0ROb2RlKE9wYywgZGwsIFZUcywgT3BzLCBOdW1PcHMsIE1lbW9yeVZULCBNTU8pIHsKKyAgfQorCisgIC8vIE1ldGhvZHMgdG8gc3VwcG9ydCBpc2EgYW5kIGR5bl9jYXN0CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtSW50cmluc2ljU0ROb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICAvLyBXZSBsb3dlciBzb21lIHRhcmdldCBpbnRyaW5zaWNzIHRvIHRoZWlyIHRhcmdldCBvcGNvZGUKKyAgICAvLyBlYXJseSBhIG5vZGUgd2l0aCBhIHRhcmdldCBvcGNvZGUgY2FuIGJlIG9mIHRoaXMgY2xhc3MKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpJTlRSSU5TSUNfV19DSEFJTiB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OklOVFJJTlNJQ19WT0lEIHx8CisgICAgICAgICAgIE4tPmlzVGFyZ2V0TWVtb3J5T3Bjb2RlKCk7CisgIH0KK307CisKKy8vLyBTaHVmZmxlVmVjdG9yU0ROb2RlIC0gVGhpcyBTRE5vZGUgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGNvZGUgZ2VuZXJhdG9yCisvLy8gc3VwcG9ydCBmb3IgdGhlIGxsdm0gSVIgc2h1ZmZsZXZlY3RvciBpbnN0cnVjdGlvbi4gIEl0IGNvbWJpbmVzIGVsZW1lbnRzCisvLy8gZnJvbSB0d28gaW5wdXQgdmVjdG9ycyBpbnRvIGEgbmV3IGlucHV0IHZlY3Rvciwgd2l0aCB0aGUgc2VsZWN0aW9uIGFuZAorLy8vIG9yZGVyaW5nIG9mIGVsZW1lbnRzIGRldGVybWluZWQgYnkgYW4gYXJyYXkgb2YgaW50ZWdlcnMsIHJlZmVycmVkIHRvIGFzCisvLy8gdGhlIHNodWZmbGUgbWFzay4gIEZvciBpbnB1dCB2ZWN0b3JzIG9mIHdpZHRoIE4sIG1hc2sgaW5kaWNlcyBvZiAwLi5OLTEKKy8vLyByZWZlciB0byBlbGVtZW50cyBmcm9tIHRoZSBMSFMgaW5wdXQsIGFuZCBpbmRpY2VzIGZyb20gTiB0byAyTi0xIHRoZSBSSFMuCisvLy8gQW4gaW5kZXggb2YgLTEgaXMgdHJlYXRlZCBhcyB1bmRlZiwgc3VjaCB0aGF0IHRoZSBjb2RlIGdlbmVyYXRvciBtYXkgcHV0CisvLy8gYW55IHZhbHVlIGluIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHJlc3VsdC4KK2NsYXNzIFNodWZmbGVWZWN0b3JTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgU0RVc2UgT3BzWzJdOworCisgIC8vIFRoZSBtZW1vcnkgZm9yIE1hc2sgaXMgb3duZWQgYnkgdGhlIFNlbGVjdGlvbkRBRydzIE9wZXJhbmRBbGxvY2F0b3IsIGFuZAorICAvLyBpcyBmcmVlZCB3aGVuIHRoZSBTZWxlY3Rpb25EQUcgb2JqZWN0IGlzIGRlc3Ryb3llZC4KKyAgY29uc3QgaW50ICpNYXNrOworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICBTaHVmZmxlVmVjdG9yU0ROb2RlKEVWVCBWVCwgRGVidWdMb2MgZGwsIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIsIAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqTSkKKyAgICA6IFNETm9kZShJU0Q6OlZFQ1RPUl9TSFVGRkxFLCBkbCwgZ2V0U0RWVExpc3QoVlQpKSwgTWFzayhNKSB7CisgICAgSW5pdE9wZXJhbmRzKE9wcywgTjEsIE4yKTsKKyAgfQorcHVibGljOgorCisgIHZvaWQgZ2V0TWFzayhTbWFsbFZlY3RvckltcGw8aW50PiAmTSkgY29uc3QgeworICAgIEVWVCBWVCA9IGdldFZhbHVlVHlwZSgwKTsKKyAgICBNLmNsZWFyKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgTS5wdXNoX2JhY2soTWFza1tpXSk7CisgIH0KKyAgaW50IGdldE1hc2tFbHQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KElkeCA8IGdldFZhbHVlVHlwZSgwKS5nZXRWZWN0b3JOdW1FbGVtZW50cygpICYmICJJZHggb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBNYXNrW0lkeF07CisgIH0KKyAgCisgIGJvb2wgaXNTcGxhdCgpIGNvbnN0IHsgcmV0dXJuIGlzU3BsYXRNYXNrKE1hc2ssIGdldFZhbHVlVHlwZSgwKSk7IH0KKyAgaW50ICBnZXRTcGxhdEluZGV4KCkgY29uc3QgeyAKKyAgICBhc3NlcnQoaXNTcGxhdCgpICYmICJDYW5ub3QgZ2V0IHNwbGF0IGluZGV4IGZvciBub24tc3BsYXQhIik7CisgICAgRVZUIFZUID0gZ2V0VmFsdWVUeXBlKDApOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKE1hc2tbaV0gIT0gLTEpCisgICAgICAgIHJldHVybiBNYXNrW2ldOworICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNTcGxhdE1hc2soY29uc3QgaW50ICpNYXNrLCBFVlQgVlQpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2h1ZmZsZVZlY3RvclNETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6VkVDVE9SX1NIVUZGTEU7CisgIH0KK307CisgIAorY2xhc3MgQ29uc3RhbnRTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgY29uc3QgQ29uc3RhbnRJbnQgKlZhbHVlOworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICBDb25zdGFudFNETm9kZShib29sIGlzVGFyZ2V0LCBjb25zdCBDb25zdGFudEludCAqdmFsLCBFVlQgVlQpCisgICAgOiBTRE5vZGUoaXNUYXJnZXQgPyBJU0Q6OlRhcmdldENvbnN0YW50IDogSVNEOjpDb25zdGFudCwKKyAgICAgICAgICAgICBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLCBWYWx1ZSh2YWwpIHsKKyAgfQorcHVibGljOgorCisgIGNvbnN0IENvbnN0YW50SW50ICpnZXRDb25zdGFudEludFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKyAgY29uc3QgQVBJbnQgJmdldEFQSW50VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+Z2V0VmFsdWUoKTsgfQorICB1aW50NjRfdCBnZXRaRXh0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+Z2V0WkV4dFZhbHVlKCk7IH0KKyAgaW50NjRfdCBnZXRTRXh0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+Z2V0U0V4dFZhbHVlKCk7IH0KKworICBib29sIGlzT25lKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmlzT25lKCk7IH0KKyAgYm9vbCBpc051bGxWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLT5pc051bGxWYWx1ZSgpOyB9CisgIGJvb2wgaXNBbGxPbmVzVmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+aXNBbGxPbmVzVmFsdWUoKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RhbnRTRE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50IHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnQ7CisgIH0KK307CisKK2NsYXNzIENvbnN0YW50RlBTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgY29uc3QgQ29uc3RhbnRGUCAqVmFsdWU7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisgIENvbnN0YW50RlBTRE5vZGUoYm9vbCBpc1RhcmdldCwgY29uc3QgQ29uc3RhbnRGUCAqdmFsLCBFVlQgVlQpCisgICAgOiBTRE5vZGUoaXNUYXJnZXQgPyBJU0Q6OlRhcmdldENvbnN0YW50RlAgOiBJU0Q6OkNvbnN0YW50RlAsCisgICAgICAgICAgICAgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoVlQpKSwgVmFsdWUodmFsKSB7CisgIH0KK3B1YmxpYzoKKworICBjb25zdCBBUEZsb2F0JiBnZXRWYWx1ZUFQRigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLT5nZXRWYWx1ZUFQRigpOyB9CisgIGNvbnN0IENvbnN0YW50RlAgKmdldENvbnN0YW50RlBWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgLy8vIGlzWmVybyAtIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZSB6ZXJvLgorICBib29sIGlzWmVybygpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLT5pc1plcm8oKTsgfQorCisgIC8vLyBpc05hTiAtIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIE5hTi4KKyAgYm9vbCBpc05hTigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLT5pc05hTigpOyB9CisKKyAgLy8vIGlzRXhhY3RseVZhbHVlIC0gV2UgZG9uJ3QgcmVseSBvbiBvcGVyYXRvcj09IHdvcmtpbmcgb24gZG91YmxlIHZhbHVlcywgYXMKKyAgLy8vIGl0IHJldHVybnMgdHJ1ZSBmb3IgdGhpbmdzIHRoYXQgYXJlIGNsZWFybHkgbm90IGVxdWFsLCBsaWtlIC0wLjAgYW5kIDAuMC4KKyAgLy8vIEFzIHN1Y2gsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRvIGFuIGV4YWN0IGJpdC1mb3ItYml0IGNvbXBhcmlzb24gb2YKKyAgLy8vIHR3byBmbG9hdGluZyBwb2ludCB2YWx1ZXMuCisKKyAgLy8vIFdlIGxlYXZlIHRoZSB2ZXJzaW9uIHdpdGggdGhlIGRvdWJsZSBhcmd1bWVudCBoZXJlIGJlY2F1c2UgaXQncyBqdXN0IHNvCisgIC8vLyBjb252ZW5pZW50IHRvIHdyaXRlICIyLjAiIGFuZCB0aGUgbGlrZS4gIFdpdGhvdXQgdGhpcyBmdW5jdGlvbiB3ZSdkCisgIC8vLyBoYXZlIHRvIGR1cGxpY2F0ZSBpdHMgbG9naWMgZXZlcnl3aGVyZSBpdCdzIGNhbGxlZC4KKyAgYm9vbCBpc0V4YWN0bHlWYWx1ZShkb3VibGUgVikgY29uc3QgeworICAgIGJvb2wgaWdub3JlZDsKKyAgICAvLyBjb252ZXJ0IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0eXBlCisgICAgaWYgKCZWYWx1ZS0+Z2V0VmFsdWVBUEYoKS5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6UFBDRG91YmxlRG91YmxlKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFQRmxvYXQgVG1wKFYpOworICAgIFRtcC5jb252ZXJ0KFZhbHVlLT5nZXRWYWx1ZUFQRigpLmdldFNlbWFudGljcygpLAorICAgICAgICAgICAgICAgIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4sICZpZ25vcmVkKTsKKyAgICByZXR1cm4gaXNFeGFjdGx5VmFsdWUoVG1wKTsKKyAgfQorICBib29sIGlzRXhhY3RseVZhbHVlKGNvbnN0IEFQRmxvYXQmIFYpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGlzVmFsdWVWYWxpZEZvclR5cGUoRVZUIFZULCBjb25zdCBBUEZsb2F0JiBWYWwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RhbnRGUFNETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnRGUCB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldENvbnN0YW50RlA7CisgIH0KK307CisKK2NsYXNzIEdsb2JhbEFkZHJlc3NTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgY29uc3QgR2xvYmFsVmFsdWUgKlRoZUdsb2JhbDsKKyAgaW50NjRfdCBPZmZzZXQ7CisgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3M7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisgIEdsb2JhbEFkZHJlc3NTRE5vZGUodW5zaWduZWQgT3BjLCBEZWJ1Z0xvYyBETCwgY29uc3QgR2xvYmFsVmFsdWUgKkdBLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvLCB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzKTsKK3B1YmxpYzoKKworICBjb25zdCBHbG9iYWxWYWx1ZSAqZ2V0R2xvYmFsKCkgY29uc3QgeyByZXR1cm4gVGhlR2xvYmFsOyB9CisgIGludDY0X3QgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VGFyZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBUYXJnZXRGbGFnczsgfQorICAvLyBSZXR1cm4gdGhlIGFkZHJlc3Mgc3BhY2UgdGhpcyBHbG9iYWxBZGRyZXNzIGJlbG9uZ3MgdG8uCisgIHVuc2lnbmVkIGdldEFkZHJlc3NTcGFjZSgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6R2xvYmFsQWRkcmVzcyB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpHbG9iYWxUTFNBZGRyZXNzIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsVExTQWRkcmVzczsKKyAgfQorfTsKKworY2xhc3MgRnJhbWVJbmRleFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBpbnQgRkk7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisgIEZyYW1lSW5kZXhTRE5vZGUoaW50IGZpLCBFVlQgVlQsIGJvb2wgaXNUYXJnKQorICAgIDogU0ROb2RlKGlzVGFyZyA/IElTRDo6VGFyZ2V0RnJhbWVJbmRleCA6IElTRDo6RnJhbWVJbmRleCwKKyAgICAgIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KFZUKSksIEZJKGZpKSB7CisgIH0KK3B1YmxpYzoKKworICBpbnQgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBGSTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRnJhbWVJbmRleFNETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6RnJhbWVJbmRleCB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEZyYW1lSW5kZXg7CisgIH0KK307CisKK2NsYXNzIEp1bXBUYWJsZVNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBpbnQgSlRJOworICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzOworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICBKdW1wVGFibGVTRE5vZGUoaW50IGp0aSwgRVZUIFZULCBib29sIGlzVGFyZywgdW5zaWduZWQgY2hhciBURikKKyAgICA6IFNETm9kZShpc1RhcmcgPyBJU0Q6OlRhcmdldEp1bXBUYWJsZSA6IElTRDo6SnVtcFRhYmxlLAorICAgICAgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoVlQpKSwgSlRJKGp0aSksIFRhcmdldEZsYWdzKFRGKSB7CisgIH0KK3B1YmxpYzoKKworICBpbnQgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBKVEk7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUYXJnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIFRhcmdldEZsYWdzOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBKdW1wVGFibGVTRE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Okp1bXBUYWJsZSB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEp1bXBUYWJsZTsKKyAgfQorfTsKKworY2xhc3MgQ29uc3RhbnRQb29sU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIHVuaW9uIHsKKyAgICBjb25zdCBDb25zdGFudCAqQ29uc3RWYWw7CisgICAgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpNYWNoaW5lQ1BWYWw7CisgIH0gVmFsOworICBpbnQgT2Zmc2V0OyAgLy8gSXQncyBhIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSBpZiB0b3AgYml0IGlzIHNldC4KKyAgdW5zaWduZWQgQWxpZ25tZW50OyAgLy8gTWluaW11bSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgQ1AgKG5vdCBsb2cyIHZhbHVlKS4KKyAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFnczsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKyAgQ29uc3RhbnRQb29sU0ROb2RlKGJvb2wgaXNUYXJnZXQsIGNvbnN0IENvbnN0YW50ICpjLCBFVlQgVlQsIGludCBvLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIHVuc2lnbmVkIGNoYXIgVEYpCisgICAgOiBTRE5vZGUoaXNUYXJnZXQgPyBJU0Q6OlRhcmdldENvbnN0YW50UG9vbCA6IElTRDo6Q29uc3RhbnRQb29sLAorICAgICAgICAgICAgIERlYnVnTG9jKCksCisgICAgICAgICAgICAgZ2V0U0RWVExpc3QoVlQpKSwgT2Zmc2V0KG8pLCBBbGlnbm1lbnQoQWxpZ24pLCBUYXJnZXRGbGFncyhURikgeworICAgIGFzc2VydCgoaW50KU9mZnNldCA+PSAwICYmICJPZmZzZXQgaXMgdG9vIGxhcmdlIik7CisgICAgVmFsLkNvbnN0VmFsID0gYzsKKyAgfQorICBDb25zdGFudFBvb2xTRE5vZGUoYm9vbCBpc1RhcmdldCwgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICp2LAorICAgICAgICAgICAgICAgICAgICAgRVZUIFZULCBpbnQgbywgdW5zaWduZWQgQWxpZ24sIHVuc2lnbmVkIGNoYXIgVEYpCisgICAgOiBTRE5vZGUoaXNUYXJnZXQgPyBJU0Q6OlRhcmdldENvbnN0YW50UG9vbCA6IElTRDo6Q29uc3RhbnRQb29sLAorICAgICAgICAgICAgIERlYnVnTG9jKCksCisgICAgICAgICAgICAgZ2V0U0RWVExpc3QoVlQpKSwgT2Zmc2V0KG8pLCBBbGlnbm1lbnQoQWxpZ24pLCBUYXJnZXRGbGFncyhURikgeworICAgIGFzc2VydCgoaW50KU9mZnNldCA+PSAwICYmICJPZmZzZXQgaXMgdG9vIGxhcmdlIik7CisgICAgVmFsLk1hY2hpbmVDUFZhbCA9IHY7CisgICAgT2Zmc2V0IHw9IDEgPDwgKHNpemVvZih1bnNpZ25lZCkqQ0hBUl9CSVQtMSk7CisgIH0KK3B1YmxpYzoKKyAgCisKKyAgYm9vbCBpc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGludClPZmZzZXQgPCAwOworICB9CisKKyAgY29uc3QgQ29uc3RhbnQgKmdldENvbnN0VmFsKCkgY29uc3QgeworICAgIGFzc2VydCghaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSAmJiAiV3JvbmcgY29uc3RhbnRwb29sIHR5cGUiKTsKKyAgICByZXR1cm4gVmFsLkNvbnN0VmFsOworICB9CisKKyAgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpnZXRNYWNoaW5lQ1BWYWwoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkgJiYgIldyb25nIGNvbnN0YW50cG9vbCB0eXBlIik7CisgICAgcmV0dXJuIFZhbC5NYWNoaW5lQ1BWYWw7CisgIH0KKworICBpbnQgZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBPZmZzZXQgJiB+KDEgPDwgKHNpemVvZih1bnNpZ25lZCkqQ0hBUl9CSVQtMSkpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgdGhpcyBjb25zdGFudCBwb29sIG9iamVjdCwgd2hpY2ggaXMgZWl0aGVyIDAgKGZvcgorICAvLyBkZWZhdWx0IGFsaWdubWVudCkgb3IgdGhlIGRlc2lyZWQgdmFsdWUuCisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIEFsaWdubWVudDsgfQorICB1bnNpZ25lZCBjaGFyIGdldFRhcmdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0RmxhZ3M7IH0KKworICBjb25zdCBUeXBlICpnZXRUeXBlKCkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudFBvb2xTRE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50UG9vbCB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldENvbnN0YW50UG9vbDsKKyAgfQorfTsKKworY2xhc3MgQmFzaWNCbG9ja1NETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCOworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICAvLy8gRGVidWcgaW5mbyBpcyBtZWFuaW5nZnVsIGFuZCBwb3RlbnRpYWxseSB1c2VmdWwgaGVyZSwgYnV0IHdlIGNyZWF0ZQorICAvLy8gYmxvY2tzIG91dCBvZiBvcmRlciB3aGVuIHRoZXkncmUganVtcGVkIHRvLCB3aGljaCBtYWtlcyBpdCBhIGJpdAorICAvLy8gaGFyZGVyLiAgTGV0J3Mgc2VlIGlmIHdlIG5lZWQgaXQgZmlyc3QuCisgIGV4cGxpY2l0IEJhc2ljQmxvY2tTRE5vZGUoTWFjaGluZUJhc2ljQmxvY2sgKm1iYikKKyAgICA6IFNETm9kZShJU0Q6OkJhc2ljQmxvY2ssIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KE1WVDo6T3RoZXIpKSwgTUJCKG1iYikgeworICB9CitwdWJsaWM6CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmdldEJhc2ljQmxvY2soKSBjb25zdCB7IHJldHVybiBNQkI7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEJhc2ljQmxvY2tTRE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJhc2ljQmxvY2s7CisgIH0KK307CisKKy8vLyBCdWlsZFZlY3RvclNETm9kZSAtIEEgInBzZXVkby1jbGFzcyIgd2l0aCBtZXRob2RzIGZvciBvcGVyYXRpbmcgb24KKy8vLyBCVUlMRF9WRUNUT1JzLgorY2xhc3MgQnVpbGRWZWN0b3JTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgLy8gVGhlc2UgYXJlIGNvbnN0cnVjdGVkIGFzIFNETm9kZXMgYW5kIHRoZW4gY2FzdCB0byBCdWlsZFZlY3RvclNETm9kZXMuCisgIGV4cGxpY2l0IEJ1aWxkVmVjdG9yU0ROb2RlKCk7ICAgICAgICAvLyBEbyBub3QgaW1wbGVtZW50CitwdWJsaWM6CisgIC8vLyBpc0NvbnN0YW50U3BsYXQgLSBDaGVjayBpZiB0aGlzIGlzIGEgY29uc3RhbnQgc3BsYXQsIGFuZCBpZiBzbywgZmluZCB0aGUKKyAgLy8vIHNtYWxsZXN0IGVsZW1lbnQgc2l6ZSB0aGF0IHNwbGF0cyB0aGUgdmVjdG9yLiAgSWYgTWluU3BsYXRCaXRzIGlzCisgIC8vLyBub256ZXJvLCB0aGUgZWxlbWVudCBzaXplIG11c3QgYmUgYXQgbGVhc3QgdGhhdCBsYXJnZS4gIE5vdGUgdGhhdCB0aGUKKyAgLy8vIHNwbGF0IGVsZW1lbnQgbWF5IGJlIHRoZSBlbnRpcmUgdmVjdG9yIChpLmUuLCBhIG9uZSBlbGVtZW50IHZlY3RvcikuCisgIC8vLyBSZXR1cm5zIHRoZSBzcGxhdCBlbGVtZW50IHZhbHVlIGluIFNwbGF0VmFsdWUuICBBbnkgdW5kZWZpbmVkIGJpdHMgaW4KKyAgLy8vIHRoYXQgdmFsdWUgYXJlIHplcm8sIGFuZCB0aGUgY29ycmVzcG9uZGluZyBiaXRzIGluIHRoZSBTcGxhdFVuZGVmIG1hc2sKKyAgLy8vIGFyZSBzZXQuICBUaGUgU3BsYXRCaXRTaXplIHZhbHVlIGlzIHNldCB0byB0aGUgc3BsYXQgZWxlbWVudCBzaXplIGluCisgIC8vLyBiaXRzLiAgSGFzQW55VW5kZWZzIGlzIHNldCB0byB0cnVlIGlmIGFueSBiaXRzIGluIHRoZSB2ZWN0b3IgYXJlCisgIC8vLyB1bmRlZmluZWQuICBpc0JpZ0VuZGlhbiBkZXNjcmliZXMgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhcmdldC4KKyAgYm9vbCBpc0NvbnN0YW50U3BsYXQoQVBJbnQgJlNwbGF0VmFsdWUsIEFQSW50ICZTcGxhdFVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmU3BsYXRCaXRTaXplLCBib29sICZIYXNBbnlVbmRlZnMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pblNwbGF0Qml0cyA9IDAsIGJvb2wgaXNCaWdFbmRpYW4gPSBmYWxzZSk7CisKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgQnVpbGRWZWN0b3JTRE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1I7CisgIH0KK307CisKKy8vLyBTcmNWYWx1ZVNETm9kZSAtIEFuIFNETm9kZSB0aGF0IGhvbGRzIGFuIGFyYml0cmFyeSBMTFZNIElSIFZhbHVlLiBUaGlzIGlzCisvLy8gdXNlZCB3aGVuIHRoZSBTZWxlY3Rpb25EQUcgbmVlZHMgdG8gbWFrZSBhIHNpbXBsZSByZWZlcmVuY2UgdG8gc29tZXRoaW5nCisvLy8gaW4gdGhlIExMVk0gSVIgcmVwcmVzZW50YXRpb24uCisvLy8KK2NsYXNzIFNyY1ZhbHVlU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGNvbnN0IFZhbHVlICpWOworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICAvLy8gQ3JlYXRlIGEgU3JjVmFsdWUgZm9yIGEgZ2VuZXJhbCB2YWx1ZS4KKyAgZXhwbGljaXQgU3JjVmFsdWVTRE5vZGUoY29uc3QgVmFsdWUgKnYpCisgICAgOiBTRE5vZGUoSVNEOjpTUkNWQUxVRSwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoTVZUOjpPdGhlcikpLCBWKHYpIHt9CisKK3B1YmxpYzoKKyAgLy8vIGdldFZhbHVlIC0gcmV0dXJuIHRoZSBjb250YWluZWQgVmFsdWUuCisgIGNvbnN0IFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFY7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNyY1ZhbHVlU0ROb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkNWQUxVRTsKKyAgfQorfTsKKyAgCitjbGFzcyBNRE5vZGVTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgY29uc3QgTUROb2RlICpNRDsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKyAgZXhwbGljaXQgTUROb2RlU0ROb2RlKGNvbnN0IE1ETm9kZSAqbWQpCisgIDogU0ROb2RlKElTRDo6TUROT0RFX1NETk9ERSwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoTVZUOjpPdGhlcikpLCBNRChtZCkge30KK3B1YmxpYzoKKyAgCisgIGNvbnN0IE1ETm9kZSAqZ2V0TUQoKSBjb25zdCB7IHJldHVybiBNRDsgfQorICAKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNRE5vZGVTRE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1ETk9ERV9TRE5PREU7CisgIH0KK307CisKKworY2xhc3MgUmVnaXN0ZXJTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgdW5zaWduZWQgUmVnOworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICBSZWdpc3RlclNETm9kZSh1bnNpZ25lZCByZWcsIEVWVCBWVCkKKyAgICA6IFNETm9kZShJU0Q6OlJlZ2lzdGVyLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLCBSZWcocmVnKSB7CisgIH0KK3B1YmxpYzoKKworICB1bnNpZ25lZCBnZXRSZWcoKSBjb25zdCB7IHJldHVybiBSZWc7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFJlZ2lzdGVyU0ROb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpSZWdpc3RlcjsKKyAgfQorfTsKKworY2xhc3MgQmxvY2tBZGRyZXNzU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGNvbnN0IEJsb2NrQWRkcmVzcyAqQkE7CisgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3M7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisgIEJsb2NrQWRkcmVzc1NETm9kZSh1bnNpZ25lZCBOb2RlVHksIEVWVCBWVCwgY29uc3QgQmxvY2tBZGRyZXNzICpiYSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRmxhZ3MpCisgICAgOiBTRE5vZGUoTm9kZVR5LCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLAorICAgICAgICAgICAgIEJBKGJhKSwgVGFyZ2V0RmxhZ3MoRmxhZ3MpIHsKKyAgfQorcHVibGljOgorICBjb25zdCBCbG9ja0FkZHJlc3MgKmdldEJsb2NrQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEJBOyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VGFyZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBUYXJnZXRGbGFnczsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQmxvY2tBZGRyZXNzU0ROb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpCbG9ja0FkZHJlc3MgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRCbG9ja0FkZHJlc3M7CisgIH0KK307CisKK2NsYXNzIEV4dGVybmFsU3ltYm9sU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGNvbnN0IGNoYXIgKlN5bWJvbDsKKyAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFnczsKKyAgCisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisgIEV4dGVybmFsU3ltYm9sU0ROb2RlKGJvb2wgaXNUYXJnZXQsIGNvbnN0IGNoYXIgKlN5bSwgdW5zaWduZWQgY2hhciBURiwgRVZUIFZUKQorICAgIDogU0ROb2RlKGlzVGFyZ2V0ID8gSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbCA6IElTRDo6RXh0ZXJuYWxTeW1ib2wsCisgICAgICAgICAgICAgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoVlQpKSwgU3ltYm9sKFN5bSksIFRhcmdldEZsYWdzKFRGKSB7CisgIH0KK3B1YmxpYzoKKworICBjb25zdCBjaGFyICpnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiBTeW1ib2w7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUYXJnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIFRhcmdldEZsYWdzOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHRlcm5hbFN5bWJvbFNETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6RXh0ZXJuYWxTeW1ib2wgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbDsKKyAgfQorfTsKKworY2xhc3MgQ29uZENvZGVTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgSVNEOjpDb25kQ29kZSBDb25kaXRpb247CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisgIGV4cGxpY2l0IENvbmRDb2RlU0ROb2RlKElTRDo6Q29uZENvZGUgQ29uZCkKKyAgICA6IFNETm9kZShJU0Q6OkNPTkRDT0RFLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChNVlQ6Ok90aGVyKSksCisgICAgICBDb25kaXRpb24oQ29uZCkgeworICB9CitwdWJsaWM6CisKKyAgSVNEOjpDb25kQ29kZSBnZXQoKSBjb25zdCB7IHJldHVybiBDb25kaXRpb247IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbmRDb2RlU0ROb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDT05EQ09ERTsKKyAgfQorfTsKKyAgCisvLy8gQ3Z0Um5kU2F0U0ROb2RlIC0gTk9URTogYXZvaWQgdXNpbmcgdGhpcyBub2RlIGFzIHRoaXMgbWF5IGRpc2FwcGVhciBpbiB0aGUKKy8vLyBmdXR1cmUgYW5kIG1vc3QgdGFyZ2V0cyBkb24ndCBzdXBwb3J0IGl0LgorY2xhc3MgQ3Z0Um5kU2F0U0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIElTRDo6Q3Z0Q29kZSBDdnRDb2RlOworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICBleHBsaWNpdCBDdnRSbmRTYXRTRE5vZGUoRVZUIFZULCBEZWJ1Z0xvYyBkbCwgY29uc3QgU0RWYWx1ZSAqT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtT3BzLCBJU0Q6OkN2dENvZGUgQ29kZSkKKyAgICA6IFNETm9kZShJU0Q6OkNPTlZFUlRfUk5EU0FULCBkbCwgZ2V0U0RWVExpc3QoVlQpLCBPcHMsIE51bU9wcyksCisgICAgICBDdnRDb2RlKENvZGUpIHsKKyAgICBhc3NlcnQoTnVtT3BzID09IDUgJiYgIndyb25nIG51bWJlciBvZiBvcGVyYXRpb25zIik7CisgIH0KK3B1YmxpYzoKKyAgSVNEOjpDdnRDb2RlIGdldEN2dENvZGUoKSBjb25zdCB7IHJldHVybiBDdnRDb2RlOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDdnRSbmRTYXRTRE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNPTlZFUlRfUk5EU0FUOworICB9Cit9OworCisvLy8gVlRTRE5vZGUgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IEVWVCdzLCB3aGljaCBhcmUgdXNlZAorLy8vIHRvIHBhcmFtZXRlcml6ZSBzb21lIG9wZXJhdGlvbnMuCitjbGFzcyBWVFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBFVlQgVmFsdWVUeXBlOworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICBleHBsaWNpdCBWVFNETm9kZShFVlQgVlQpCisgICAgOiBTRE5vZGUoSVNEOjpWQUxVRVRZUEUsIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KE1WVDo6T3RoZXIpKSwKKyAgICAgIFZhbHVlVHlwZShWVCkgeworICB9CitwdWJsaWM6CisKKyAgRVZUIGdldFZUKCkgY29uc3QgeyByZXR1cm4gVmFsdWVUeXBlOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWVFNETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6VkFMVUVUWVBFOworICB9Cit9OworCisvLy8gTFNCYXNlU0ROb2RlIC0gQmFzZSBjbGFzcyBmb3IgTG9hZFNETm9kZSBhbmQgU3RvcmVTRE5vZGUKKy8vLworY2xhc3MgTFNCYXNlU0ROb2RlIDogcHVibGljIE1lbVNETm9kZSB7CisgIC8vISBPcGVyYW5kIGFycmF5IGZvciBsb2FkIGFuZCBzdG9yZQorICAvKiEKKyAgICBcbm90ZSBNb3ZpbmcgdGhpcyBhcnJheSB0byB0aGUgYmFzZSBjbGFzcyBjYXB0dXJlcyBtb3JlCisgICAgY29tbW9uIGZ1bmN0aW9uYWxpdHkgc2hhcmVkIGJldHdlZW4gTG9hZFNETm9kZSBhbmQKKyAgICBTdG9yZVNETm9kZQorICAgKi8KKyAgU0RVc2UgT3BzWzRdOworcHVibGljOgorICBMU0Jhc2VTRE5vZGUoSVNEOjpOb2RlVHlwZSBOb2RlVHksIERlYnVnTG9jIGRsLCBTRFZhbHVlICpPcGVyYW5kcywKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bU9wZXJhbmRzLCBTRFZUTGlzdCBWVHMsIElTRDo6TWVtSW5kZXhlZE1vZGUgQU0sCisgICAgICAgICAgICAgICBFVlQgTWVtVlQsIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pCisgICAgOiBNZW1TRE5vZGUoTm9kZVR5LCBkbCwgVlRzLCBNZW1WVCwgTU1PKSB7CisgICAgU3ViY2xhc3NEYXRhIHw9IEFNIDw8IDI7CisgICAgYXNzZXJ0KGdldEFkZHJlc3NpbmdNb2RlKCkgPT0gQU0gJiYgIk1lbUluZGV4ZWRNb2RlIGVuY29kaW5nIGVycm9yISIpOworICAgIEluaXRPcGVyYW5kcyhPcHMsIE9wZXJhbmRzLCBudW1PcGVyYW5kcyk7CisgICAgYXNzZXJ0KChnZXRPZmZzZXQoKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGIHx8IGlzSW5kZXhlZCgpKSAmJgorICAgICAgICAgICAiT25seSBpbmRleGVkIGxvYWRzIGFuZCBzdG9yZXMgaGF2ZSBhIG5vbi11bmRlZiBvZmZzZXQgb3BlcmFuZCIpOworICB9CisKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKGdldE9wY29kZSgpID09IElTRDo6TE9BRCA/IDIgOiAzKTsKKyAgfQorCisgIC8vLyBnZXRBZGRyZXNzaW5nTW9kZSAtIFJldHVybiB0aGUgYWRkcmVzc2luZyBtb2RlIGZvciB0aGlzIGxvYWQgb3Igc3RvcmU6CisgIC8vLyB1bmluZGV4ZWQsIHByZS1pbmMsIHByZS1kZWMsIHBvc3QtaW5jLCBvciBwb3N0LWRlYy4KKyAgSVNEOjpNZW1JbmRleGVkTW9kZSBnZXRBZGRyZXNzaW5nTW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSVNEOjpNZW1JbmRleGVkTW9kZSgoU3ViY2xhc3NEYXRhID4+IDIpICYgNyk7CisgIH0KKworICAvLy8gaXNJbmRleGVkIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHByZS9wb3N0IGluYy9kZWMgbG9hZC9zdG9yZS4KKyAgYm9vbCBpc0luZGV4ZWQoKSBjb25zdCB7IHJldHVybiBnZXRBZGRyZXNzaW5nTW9kZSgpICE9IElTRDo6VU5JTkRFWEVEOyB9CisKKyAgLy8vIGlzVW5pbmRleGVkIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBOT1QgYSBwcmUvcG9zdCBpbmMvZGVjIGxvYWQvc3RvcmUuCisgIGJvb2wgaXNVbmluZGV4ZWQoKSBjb25zdCB7IHJldHVybiBnZXRBZGRyZXNzaW5nTW9kZSgpID09IElTRDo6VU5JTkRFWEVEOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBMU0Jhc2VTRE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkxPQUQgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTVE9SRTsKKyAgfQorfTsKKworLy8vIExvYWRTRE5vZGUgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IElTRDo6TE9BRCBub2Rlcy4KKy8vLworY2xhc3MgTG9hZFNETm9kZSA6IHB1YmxpYyBMU0Jhc2VTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICBMb2FkU0ROb2RlKFNEVmFsdWUgKkNoYWluUHRyT2ZmLCBEZWJ1Z0xvYyBkbCwgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgIElTRDo6TWVtSW5kZXhlZE1vZGUgQU0sIElTRDo6TG9hZEV4dFR5cGUgRVR5LCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykKKyAgICA6IExTQmFzZVNETm9kZShJU0Q6OkxPQUQsIGRsLCBDaGFpblB0ck9mZiwgMywKKyAgICAgICAgICAgICAgICAgICBWVHMsIEFNLCBNZW1WVCwgTU1PKSB7CisgICAgU3ViY2xhc3NEYXRhIHw9ICh1bnNpZ25lZCBzaG9ydClFVHk7CisgICAgYXNzZXJ0KGdldEV4dGVuc2lvblR5cGUoKSA9PSBFVHkgJiYgIkxvYWRFeHRUeXBlIGVuY29kaW5nIGVycm9yISIpOworICAgIGFzc2VydChyZWFkTWVtKCkgJiYgIkxvYWQgTWFjaGluZU1lbU9wZXJhbmQgaXMgbm90IGEgbG9hZCEiKTsKKyAgICBhc3NlcnQoIXdyaXRlTWVtKCkgJiYgIkxvYWQgTWFjaGluZU1lbU9wZXJhbmQgaXMgYSBzdG9yZSEiKTsKKyAgfQorcHVibGljOgorCisgIC8vLyBnZXRFeHRlbnNpb25UeXBlIC0gUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIG5vZGUsCisgIC8vLyBvciBvbmUgb2YgdGhlIHZhcmlldGllcyBvZiB2YWx1ZS1leHRlbmRpbmcgbG9hZHMuCisgIElTRDo6TG9hZEV4dFR5cGUgZ2V0RXh0ZW5zaW9uVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSVNEOjpMb2FkRXh0VHlwZShTdWJjbGFzc0RhdGEgJiAzKTsKKyAgfQorCisgIGNvbnN0IFNEVmFsdWUgJmdldEJhc2VQdHIoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIGNvbnN0IFNEVmFsdWUgJmdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMik7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IExvYWRTRE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkxPQUQ7CisgIH0KK307CisKKy8vLyBTdG9yZVNETm9kZSAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgSVNEOjpTVE9SRSBub2Rlcy4KKy8vLworY2xhc3MgU3RvcmVTRE5vZGUgOiBwdWJsaWMgTFNCYXNlU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKyAgU3RvcmVTRE5vZGUoU0RWYWx1ZSAqQ2hhaW5WYWx1ZVB0ck9mZiwgRGVidWdMb2MgZGwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSwgYm9vbCBpc1RydW5jLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pCisgICAgOiBMU0Jhc2VTRE5vZGUoSVNEOjpTVE9SRSwgZGwsIENoYWluVmFsdWVQdHJPZmYsIDQsCisgICAgICAgICAgICAgICAgICAgVlRzLCBBTSwgTWVtVlQsIE1NTykgeworICAgIFN1YmNsYXNzRGF0YSB8PSAodW5zaWduZWQgc2hvcnQpaXNUcnVuYzsKKyAgICBhc3NlcnQoaXNUcnVuY2F0aW5nU3RvcmUoKSA9PSBpc1RydW5jICYmICJpc1RydW5jIGVuY29kaW5nIGVycm9yISIpOworICAgIGFzc2VydCghcmVhZE1lbSgpICYmICJTdG9yZSBNYWNoaW5lTWVtT3BlcmFuZCBpcyBhIGxvYWQhIik7CisgICAgYXNzZXJ0KHdyaXRlTWVtKCkgJiYgIlN0b3JlIE1hY2hpbmVNZW1PcGVyYW5kIGlzIG5vdCBhIHN0b3JlISIpOworICB9CitwdWJsaWM6CisKKyAgLy8vIGlzVHJ1bmNhdGluZ1N0b3JlIC0gUmV0dXJuIHRydWUgaWYgdGhlIG9wIGRvZXMgYSB0cnVuY2F0aW9uIGJlZm9yZSBzdG9yZS4KKyAgLy8vIEZvciBpbnRlZ2VycyB0aGlzIGlzIHRoZSBzYW1lIGFzIGRvaW5nIGEgVFJVTkNBVEUgYW5kIHN0b3JpbmcgdGhlIHJlc3VsdC4KKyAgLy8vIEZvciBmbG9hdHMsIGl0IGlzIHRoZSBzYW1lIGFzIGRvaW5nIGFuIEZQX1JPVU5EIGFuZCBzdG9yaW5nIHRoZSByZXN1bHQuCisgIGJvb2wgaXNUcnVuY2F0aW5nU3RvcmUoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGEgJiAxOyB9CisKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIGNvbnN0IFNEVmFsdWUgJmdldEJhc2VQdHIoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDIpOyB9CisgIGNvbnN0IFNEVmFsdWUgJmdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMyk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0b3JlU0ROb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTVE9SRTsKKyAgfQorfTsKKworLy8vIE1hY2hpbmVTRE5vZGUgLSBBbiBTRE5vZGUgdGhhdCByZXByZXNlbnRzIGV2ZXJ5dGhpbmcgdGhhdCB3aWxsIGJlIG5lZWRlZAorLy8vIHRvIGNvbnN0cnVjdCBhIE1hY2hpbmVJbnN0ci4gVGhlc2Ugbm9kZXMgYXJlIGNyZWF0ZWQgZHVyaW5nIHRoZQorLy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBwcm9wZXIgcGhhc2UuCisvLy8KK2NsYXNzIE1hY2hpbmVTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBNYWNoaW5lTWVtT3BlcmFuZCAqKm1tb19pdGVyYXRvcjsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKyAgTWFjaGluZVNETm9kZSh1bnNpZ25lZCBPcGMsIGNvbnN0IERlYnVnTG9jIERMLCBTRFZUTGlzdCBWVHMpCisgICAgOiBTRE5vZGUoT3BjLCBETCwgVlRzKSwgTWVtUmVmcygwKSwgTWVtUmVmc0VuZCgwKSB7fQorCisgIC8vLyBMb2NhbE9wZXJhbmRzIC0gT3BlcmFuZHMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24sIGlmIHRoZXkgZml0IGhlcmUuIElmCisgIC8vLyB0aGV5IGRvbid0LCB0aGlzIGZpZWxkIGlzIHVudXNlZC4KKyAgU0RVc2UgTG9jYWxPcGVyYW5kc1s0XTsKKworICAvLy8gTWVtUmVmcyAtIE1lbW9yeSByZWZlcmVuY2UgZGVzY3JpcHRpb25zIGZvciB0aGlzIGluc3RydWN0aW9uLgorICBtbW9faXRlcmF0b3IgTWVtUmVmczsKKyAgbW1vX2l0ZXJhdG9yIE1lbVJlZnNFbmQ7CisKK3B1YmxpYzoKKyAgbW1vX2l0ZXJhdG9yIG1lbW9wZXJhbmRzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gTWVtUmVmczsgfQorICBtbW9faXRlcmF0b3IgbWVtb3BlcmFuZHNfZW5kKCkgY29uc3QgeyByZXR1cm4gTWVtUmVmc0VuZDsgfQorICBib29sIG1lbW9wZXJhbmRzX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTWVtUmVmc0VuZCA9PSBNZW1SZWZzOyB9CisKKyAgLy8vIHNldE1lbVJlZnMgLSBBc3NpZ24gdGhpcyBNYWNoaW5lU0ROb2RlcydzIG1lbW9yeSByZWZlcmVuY2UgZGVzY3JpcHRvcgorICAvLy8gbGlzdC4gVGhpcyBkb2VzIG5vdCB0cmFuc2ZlciBvd25lcnNoaXAuCisgIHZvaWQgc2V0TWVtUmVmcyhtbW9faXRlcmF0b3IgTmV3TWVtUmVmcywgbW1vX2l0ZXJhdG9yIE5ld01lbVJlZnNFbmQpIHsKKyAgICBNZW1SZWZzID0gTmV3TWVtUmVmczsKKyAgICBNZW1SZWZzRW5kID0gTmV3TWVtUmVmc0VuZDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWFjaGluZVNETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmlzTWFjaGluZU9wY29kZSgpOworICB9Cit9OworCitjbGFzcyBTRE5vZGVJdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETm9kZSwgcHRyZGlmZl90PiB7CisgIFNETm9kZSAqTm9kZTsKKyAgdW5zaWduZWQgT3BlcmFuZDsKKworICBTRE5vZGVJdGVyYXRvcihTRE5vZGUgKk4sIHVuc2lnbmVkIE9wKSA6IE5vZGUoTiksIE9wZXJhbmQoT3ApIHt9CitwdWJsaWM6CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTRE5vZGVJdGVyYXRvciYgeCkgY29uc3QgeworICAgIHJldHVybiBPcGVyYW5kID09IHguT3BlcmFuZDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU0ROb2RlSXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgY29uc3QgU0ROb2RlSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBTRE5vZGVJdGVyYXRvciAmSSkgeworICAgIGFzc2VydChJLk5vZGUgPT0gTm9kZSAmJiAiQ2Fubm90IGFzc2lnbiBpdGVyYXRvcnMgdG8gdHdvIGRpZmZlcmVudCBub2RlcyEiKTsKKyAgICBPcGVyYW5kID0gSS5PcGVyYW5kOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBOb2RlLT5nZXRPcGVyYW5kKE9wZXJhbmQpLmdldE5vZGUoKTsKKyAgfQorICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciooKTsgfQorCisgIFNETm9kZUl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgICAgICAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICArK09wZXJhbmQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFNETm9kZUl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICBTRE5vZGVJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorICBzaXplX3Qgb3BlcmF0b3ItKFNETm9kZUl0ZXJhdG9yIE90aGVyKSBjb25zdCB7CisgICAgYXNzZXJ0KE5vZGUgPT0gT3RoZXIuTm9kZSAmJgorICAgICAgICAgICAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIHR3byBkaWZmZXJlbnQgbm9kZXMhIik7CisgICAgcmV0dXJuIE9wZXJhbmQgLSBPdGhlci5PcGVyYW5kOworICB9CisKKyAgc3RhdGljIFNETm9kZUl0ZXJhdG9yIGJlZ2luKFNETm9kZSAqTikgeyByZXR1cm4gU0ROb2RlSXRlcmF0b3IoTiwgMCk7IH0KKyAgc3RhdGljIFNETm9kZUl0ZXJhdG9yIGVuZCAgKFNETm9kZSAqTikgeworICAgIHJldHVybiBTRE5vZGVJdGVyYXRvcihOLCBOLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kOyB9CisgIGNvbnN0IFNETm9kZSAqZ2V0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIE5vZGU7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxTRE5vZGUqPiB7CisgIHR5cGVkZWYgU0ROb2RlIE5vZGVUeXBlOworICB0eXBlZGVmIFNETm9kZUl0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworICBzdGF0aWMgaW5saW5lIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoU0ROb2RlICpOKSB7IHJldHVybiBOOyB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gU0ROb2RlSXRlcmF0b3I6OmJlZ2luKE4pOworICB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIFNETm9kZUl0ZXJhdG9yOjplbmQoTik7CisgIH0KK307CisKKy8vLyBMYXJnZXN0U0ROb2RlIC0gVGhlIGxhcmdlc3QgU0ROb2RlIGNsYXNzLgorLy8vCit0eXBlZGVmIExvYWRTRE5vZGUgTGFyZ2VzdFNETm9kZTsKKworLy8vIE1vc3RBbGlnbmVkU0ROb2RlIC0gVGhlIFNETm9kZSBjbGFzcyB3aXRoIHRoZSBncmVhdGVzdCBhbGlnbm1lbnQKKy8vLyByZXF1aXJlbWVudC4KKy8vLwordHlwZWRlZiBHbG9iYWxBZGRyZXNzU0ROb2RlIE1vc3RBbGlnbmVkU0ROb2RlOworCituYW1lc3BhY2UgSVNEIHsKKyAgLy8vIGlzTm9ybWFsTG9hZCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSBub24tZXh0ZW5kaW5nCisgIC8vLyBhbmQgdW5pbmRleGVkIGxvYWQuCisgIGlubGluZSBib29sIGlzTm9ybWFsTG9hZChjb25zdCBTRE5vZGUgKk4pIHsKKyAgICBjb25zdCBMb2FkU0ROb2RlICpMZCA9IGR5bl9jYXN0PExvYWRTRE5vZGU+KE4pOworICAgIHJldHVybiBMZCAmJiBMZC0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6Tk9OX0VYVExPQUQgJiYKKyAgICAgIExkLT5nZXRBZGRyZXNzaW5nTW9kZSgpID09IElTRDo6VU5JTkRFWEVEOworICB9CisKKyAgLy8vIGlzTk9OX0VYVExvYWQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgbm9uLWV4dGVuZGluZworICAvLy8gbG9hZC4KKyAgaW5saW5lIGJvb2wgaXNOT05fRVhUTG9hZChjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gaXNhPExvYWRTRE5vZGU+KE4pICYmCisgICAgICBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpOT05fRVhUTE9BRDsKKyAgfQorCisgIC8vLyBpc0VYVExvYWQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgRVhUTE9BRC4KKyAgLy8vCisgIGlubGluZSBib29sIGlzRVhUTG9hZChjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gaXNhPExvYWRTRE5vZGU+KE4pICYmCisgICAgICBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpFWFRMT0FEOworICB9CisKKyAgLy8vIGlzU0VYVExvYWQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgU0VYVExPQUQuCisgIC8vLworICBpbmxpbmUgYm9vbCBpc1NFWFRMb2FkKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBpc2E8TG9hZFNETm9kZT4oTikgJiYKKyAgICAgIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6OlNFWFRMT0FEOworICB9CisKKyAgLy8vIGlzWkVYVExvYWQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgWkVYVExPQUQuCisgIC8vLworICBpbmxpbmUgYm9vbCBpc1pFWFRMb2FkKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBpc2E8TG9hZFNETm9kZT4oTikgJiYKKyAgICAgIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6OlpFWFRMT0FEOworICB9CisKKyAgLy8vIGlzVU5JTkRFWEVETG9hZCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYW4gdW5pbmRleGVkIGxvYWQuCisgIC8vLworICBpbmxpbmUgYm9vbCBpc1VOSU5ERVhFRExvYWQoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIGlzYTxMb2FkU0ROb2RlPihOKSAmJgorICAgICAgY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0QWRkcmVzc2luZ01vZGUoKSA9PSBJU0Q6OlVOSU5ERVhFRDsKKyAgfQorCisgIC8vLyBpc05vcm1hbFN0b3JlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIG5vbi10cnVuY2F0aW5nCisgIC8vLyBhbmQgdW5pbmRleGVkIHN0b3JlLgorICBpbmxpbmUgYm9vbCBpc05vcm1hbFN0b3JlKGNvbnN0IFNETm9kZSAqTikgeworICAgIGNvbnN0IFN0b3JlU0ROb2RlICpTdCA9IGR5bl9jYXN0PFN0b3JlU0ROb2RlPihOKTsKKyAgICByZXR1cm4gU3QgJiYgIVN0LT5pc1RydW5jYXRpbmdTdG9yZSgpICYmCisgICAgICBTdC0+Z2V0QWRkcmVzc2luZ01vZGUoKSA9PSBJU0Q6OlVOSU5ERVhFRDsKKyAgfQorCisgIC8vLyBpc05PTl9UUlVOQ1N0b3JlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIG5vbi10cnVuY2F0aW5nCisgIC8vLyBzdG9yZS4KKyAgaW5saW5lIGJvb2wgaXNOT05fVFJVTkNTdG9yZShjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gaXNhPFN0b3JlU0ROb2RlPihOKSAmJiAhY2FzdDxTdG9yZVNETm9kZT4oTiktPmlzVHJ1bmNhdGluZ1N0b3JlKCk7CisgIH0KKworICAvLy8gaXNUUlVOQ1N0b3JlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIHRydW5jYXRpbmcKKyAgLy8vIHN0b3JlLgorICBpbmxpbmUgYm9vbCBpc1RSVU5DU3RvcmUoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIGlzYTxTdG9yZVNETm9kZT4oTikgJiYgY2FzdDxTdG9yZVNETm9kZT4oTiktPmlzVHJ1bmNhdGluZ1N0b3JlKCk7CisgIH0KKworICAvLy8gaXNVTklOREVYRURTdG9yZSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYW4KKyAgLy8vIHVuaW5kZXhlZCBzdG9yZS4KKyAgaW5saW5lIGJvb2wgaXNVTklOREVYRURTdG9yZShjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gaXNhPFN0b3JlU0ROb2RlPihOKSAmJgorICAgICAgY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldEFkZHJlc3NpbmdNb2RlKCkgPT0gSVNEOjpVTklOREVYRUQ7CisgIH0KK30KKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTNiMGUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaApAQCAtMCwwICsxLDgxNyBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIC0gU2xvdCBpbmRleGVzIHJlcHJlc2VudGF0aW9uIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBTbG90SW5kZXggYW5kIHJlbGF0ZWQgY2xhc3Nlcy4gVGhlIHB1cnB1c2Ugb2YgU2xvdEluZGV4CisvLyBpcyB0byBkZXNjcmliZSBhIHBvc2l0aW9uIGF0IHdoaWNoIGEgcmVnaXN0ZXIgY2FuIGJlY29tZSBsaXZlLCBvciBjZWFzZSB0bworLy8gYmUgbGl2ZS4KKy8vCisvLyBTbG90SW5kZXggaXMgbW9zdGx5IGEgcHJveHkgZm9yIGVudHJpZXMgb2YgdGhlIFNsb3RJbmRleExpc3QsIGEgY2xhc3Mgd2hpY2gKKy8vIGlzIGhlbGQgaXMgTGl2ZUludGVydmFscyBhbmQgcHJvdmlkZXMgdGhlIHJlYWwgbnVtYmVyaW5nLiBUaGlzIGFsbG93cworLy8gTGl2ZUludGVydmFscyB0byBwZXJmb3JtIGxhcmdlbHkgdHJhbnNwYXJlbnQgcmVudW1iZXJpbmcuIFRoZSBTbG90SW5kZXgKKy8vIGNsYXNzIGRvZXMgaG9sZCBhIFBISSBiaXQsIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGUgaW5kZXggcmVsYXRlcyB0byBhCisvLyBQSEkgdXNlIG9yIGRlZiBwb2ludCwgb3IgYW4gYWN0dWFsIGluc3RydWN0aW9uLiBTZWUgdGhlIFNsb3RJbmRleCBjbGFzcworLy8gZGVzY3JpcHRpb24gZm9yIGZ1dGhlciBpbmZvcm1hdGlvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NMT1RJTkRFWEVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NMT1RJTkRFWEVTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZW50cnkgaW4gdGhlIHNsb3QgaW5kZXggbGlzdCBoZWxkIGluIHRoZQorICAvLy8gU2xvdEluZGV4ZXMgcGFzcy4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LiBTZWUgdGhlCisgIC8vLyBTbG90SW5kZXggJiBTbG90SW5kZXhlcyBjbGFzc2VzIGZvciB0aGUgcHVibGljIGludGVyZmFjZSB0byB0aGlzCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgY2xhc3MgSW5kZXhMaXN0RW50cnkgeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBFTVBUWV9LRVlfSU5ERVggPSB+MFUgJiB+M1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRPTUJTVE9ORV9LRVlfSU5ERVggPSB+MFUgJiB+N1U7CisKKyAgICBJbmRleExpc3RFbnRyeSAqbmV4dCwgKnByZXY7CisgICAgTWFjaGluZUluc3RyICptaTsKKyAgICB1bnNpZ25lZCBpbmRleDsKKworICBwcm90ZWN0ZWQ6CisKKyAgICB0eXBlZGVmIGVudW0geyBFTVBUWV9LRVksIFRPTUJTVE9ORV9LRVkgfSBSZXNlcnZlZEVudHJ5VHlwZTsKKworICAgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgb25seSB0byBiZSB1c2VkIGJ5IGdldEVtcHR5S2V5RW50cnkKKyAgICAvLyAmIGdldFRvbWJzdG9uZUtleUVudHJ5LiBJdCBzZXRzIGluZGV4IHRvIHRoZSBnaXZlbgorICAgIC8vIHZhbHVlIGFuZCBtaSB0byB6ZXJvLgorICAgIEluZGV4TGlzdEVudHJ5KFJlc2VydmVkRW50cnlUeXBlIHIpIDogbWkoMCkgeworICAgICAgc3dpdGNoKHIpIHsKKyAgICAgICAgY2FzZSBFTVBUWV9LRVk6IGluZGV4ID0gRU1QVFlfS0VZX0lOREVYOyBicmVhazsKKyAgICAgICAgY2FzZSBUT01CU1RPTkVfS0VZOiBpbmRleCA9IFRPTUJTVE9ORV9LRVlfSU5ERVg7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UgJiYgIkludmFsaWQgdmFsdWUgZm9yIGNvbnN0cnVjdG9yLiIpOyAKKyAgICAgIH0KKyAgICAgIG5leHQgPSB0aGlzOworICAgICAgcHJldiA9IHRoaXM7CisgICAgfQorCisgIHB1YmxpYzoKKworICAgIEluZGV4TGlzdEVudHJ5KE1hY2hpbmVJbnN0ciAqbWksIHVuc2lnbmVkIGluZGV4KSA6IG1pKG1pKSwgaW5kZXgoaW5kZXgpIHsKKyAgICAgIGFzc2VydChpbmRleCAhPSBFTVBUWV9LRVlfSU5ERVggJiYgaW5kZXggIT0gVE9NQlNUT05FX0tFWV9JTkRFWCAmJgorICAgICAgICAgICAgICJBdHRlbXB0IHRvIGNyZWF0ZSBpbnZhbGlkIGluZGV4LiAiCisgICAgICAgICAgICAgIkF2YWlsYWJsZSBpbmRleGVzIG1heSBoYXZlIGJlZW4gZXhoYXVzdGVkPy4iKTsKKyAgICB9CisKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gKGluZGV4ICE9IEVNUFRZX0tFWV9JTkRFWCAmJiBpbmRleCAhPSBUT01CU1RPTkVfS0VZX0lOREVYKTsKKyAgICB9CisKKyAgICBNYWNoaW5lSW5zdHIqIGdldEluc3RyKCkgY29uc3QgeyByZXR1cm4gbWk7IH0KKyAgICB2b2lkIHNldEluc3RyKE1hY2hpbmVJbnN0ciAqbWkpIHsKKyAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkF0dGVtcHQgdG8gbW9kaWZ5IHJlc2VydmVkIGluZGV4LiIpOworICAgICAgdGhpcy0+bWkgPSBtaTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIGluZGV4OyB9CisgICAgdm9pZCBzZXRJbmRleCh1bnNpZ25lZCBpbmRleCkgeworICAgICAgYXNzZXJ0KGluZGV4ICE9IEVNUFRZX0tFWV9JTkRFWCAmJiBpbmRleCAhPSBUT01CU1RPTkVfS0VZX0lOREVYICYmCisgICAgICAgICAgICAgIkF0dGVtcHQgdG8gc2V0IGluZGV4IHRvIGludmFsaWQgdmFsdWUuIik7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJBdHRlbXB0IHRvIHJlc2V0IHJlc2VydmVkIGluZGV4IHZhbHVlLiIpOworICAgICAgdGhpcy0+aW5kZXggPSBpbmRleDsKKyAgICB9CisgICAgCisgICAgSW5kZXhMaXN0RW50cnkqIGdldE5leHQoKSB7IHJldHVybiBuZXh0OyB9CisgICAgY29uc3QgSW5kZXhMaXN0RW50cnkqIGdldE5leHQoKSBjb25zdCB7IHJldHVybiBuZXh0OyB9CisgICAgdm9pZCBzZXROZXh0KEluZGV4TGlzdEVudHJ5ICpuZXh0KSB7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJBdHRlbXB0IHRvIG1vZGlmeSByZXNlcnZlZCBpbmRleC4iKTsKKyAgICAgIHRoaXMtPm5leHQgPSBuZXh0OworICAgIH0KKworICAgIEluZGV4TGlzdEVudHJ5KiBnZXRQcmV2KCkgeyByZXR1cm4gcHJldjsgfQorICAgIGNvbnN0IEluZGV4TGlzdEVudHJ5KiBnZXRQcmV2KCkgY29uc3QgeyByZXR1cm4gcHJldjsgfQorICAgIHZvaWQgc2V0UHJldihJbmRleExpc3RFbnRyeSAqcHJldikgeworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiQXR0ZW1wdCB0byBtb2RpZnkgcmVzZXJ2ZWQgaW5kZXguIik7CisgICAgICB0aGlzLT5wcmV2ID0gcHJldjsKKyAgICB9CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGluZGV4IGxpc3QgZW50cnkgdGhhdCBpcyB0byBiZSB1c2VkIGZvciBlbXB0eQorICAgIC8vIFNsb3RJbmRleCBrZXlzLgorICAgIHN0YXRpYyBJbmRleExpc3RFbnRyeSogZ2V0RW1wdHlLZXlFbnRyeSgpOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbmRleCBsaXN0IGVudHJ5IHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IKKyAgICAvLyB0b21ic3RvbmUgU2xvdEluZGV4IGtleXMuCisgICAgc3RhdGljIEluZGV4TGlzdEVudHJ5KiBnZXRUb21ic3RvbmVLZXlFbnRyeSgpOworICB9OworCisgIC8vIFNwZWNpYWxpemUgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGZvciBJbmRleExpc3RFbnRyeS4KKyAgdGVtcGxhdGUgPD4KKyAgY2xhc3MgUG9pbnRlckxpa2VUeXBlVHJhaXRzPEluZGV4TGlzdEVudHJ5Kj4geyAKKyAgcHVibGljOgorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCogZ2V0QXNWb2lkUG9pbnRlcihJbmRleExpc3RFbnRyeSAqcCkgeworICAgICAgcmV0dXJuIHA7CisgICAgfQorICAgIHN0YXRpYyBpbmxpbmUgSW5kZXhMaXN0RW50cnkqIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpwKSB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW5kZXhMaXN0RW50cnkqPihwKTsKKyAgICB9CisgICAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAzIH07CisgIH07CisKKyAgLy8vIFNsb3RJbmRleCAtIEFuIG9wYXF1ZSB3cmFwcGVyIGFyb3VuZCBtYWNoaW5lIGluZGV4ZXMuCisgIGNsYXNzIFNsb3RJbmRleCB7CisgICAgZnJpZW5kIGNsYXNzIFNsb3RJbmRleGVzOworICAgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFNsb3RJbmRleD47CisKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUEhJX0JJVCA9IDEgPDwgMjsKKworICAgIFBvaW50ZXJJbnRQYWlyPEluZGV4TGlzdEVudHJ5KiwgMywgdW5zaWduZWQ+IGxpZTsKKworICAgIFNsb3RJbmRleChJbmRleExpc3RFbnRyeSAqZW50cnksIHVuc2lnbmVkIHBoaUFuZFNsb3QpCisgICAgICA6IGxpZShlbnRyeSwgcGhpQW5kU2xvdCkgeworICAgICAgYXNzZXJ0KGVudHJ5ICE9IDAgJiYgIkF0dGVtcHQgdG8gY29uc3RydWN0IGluZGV4IHdpdGggMCBwb2ludGVyLiIpOworICAgIH0KKworICAgIEluZGV4TGlzdEVudHJ5JiBlbnRyeSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAqbGllLmdldFBvaW50ZXIoKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0SW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gZW50cnkoKS5nZXRJbmRleCgpIHwgZ2V0U2xvdCgpOworICAgIH0KKworICAgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFNsb3RJbmRleCAmdikgeworICAgICAgSW5kZXhMaXN0RW50cnkgKnB0clZhbCA9ICZ2LmVudHJ5KCk7CisgICAgICByZXR1cm4gKHVuc2lnbmVkKChpbnRwdHJfdClwdHJWYWwpID4+IDQpIF4KKyAgICAgICAgICAgICAodW5zaWduZWQoKGludHB0cl90KXB0clZhbCkgPj4gOSk7CisgICAgfQorCisgIHB1YmxpYzoKKworICAgIC8vIEZJWE1FOiBVZ2guIFRoaXMgaXMgcHVibGljIGJlY2F1c2UgTGl2ZUludGVydmFsQW5hbHlzaXMgaXMgc3RpbGwgdXNpbmcgaXQKKyAgICAvLyBmb3Igc29tZSBzcGlsbCB3ZWlnaHQgc3R1ZmYuIEZpeCB0aGF0LCB0aGVuIG1ha2UgdGhpcyBwcml2YXRlLgorICAgIGVudW0gU2xvdCB7IExPQUQsIFVTRSwgREVGLCBTVE9SRSwgTlVNIH07CisKKyAgICBzdGF0aWMgaW5saW5lIFNsb3RJbmRleCBnZXRFbXB0eUtleSgpIHsKKyAgICAgIHJldHVybiBTbG90SW5kZXgoSW5kZXhMaXN0RW50cnk6OmdldEVtcHR5S2V5RW50cnkoKSwgMCk7CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSBTbG90SW5kZXggZ2V0VG9tYnN0b25lS2V5KCkgeworICAgICAgcmV0dXJuIFNsb3RJbmRleChJbmRleExpc3RFbnRyeTo6Z2V0VG9tYnN0b25lS2V5RW50cnkoKSwgMCk7CisgICAgfQorICAgIAorICAgIC8vLyBDb25zdHJ1Y3QgYW4gaW52YWxpZCBpbmRleC4KKyAgICBTbG90SW5kZXgoKSA6IGxpZShJbmRleExpc3RFbnRyeTo6Z2V0RW1wdHlLZXlFbnRyeSgpLCAwKSB7fQorCisgICAgLy8gQ29uc3RydWN0IGEgbmV3IHNsb3QgaW5kZXggZnJvbSB0aGUgZ2l2ZW4gb25lLCBzZXQgdGhlIHBoaSBmbGFnIG9uIHRoZQorICAgIC8vIG5ldyBpbmRleCB0byB0aGUgdmFsdWUgb2YgdGhlIHBoaSBwYXJhbWV0ZXIuCisgICAgU2xvdEluZGV4KGNvbnN0IFNsb3RJbmRleCAmbGksIGJvb2wgcGhpKQorICAgICAgOiBsaWUoJmxpLmVudHJ5KCksIHBoaSA/IFBISV9CSVQgfCBsaS5nZXRTbG90KCkgOiAodW5zaWduZWQpbGkuZ2V0U2xvdCgpKXsKKyAgICAgIGFzc2VydChsaWUuZ2V0UG9pbnRlcigpICE9IDAgJiYKKyAgICAgICAgICAgICAiQXR0ZW1wdCB0byBjb25zdHJ1Y3QgaW5kZXggd2l0aCAwIHBvaW50ZXIuIik7CisgICAgfQorCisgICAgLy8gQ29uc3RydWN0IGEgbmV3IHNsb3QgaW5kZXggZnJvbSB0aGUgZ2l2ZW4gb25lLCBzZXQgdGhlIHBoaSBmbGFnIG9uIHRoZQorICAgIC8vIG5ldyBpbmRleCB0byB0aGUgdmFsdWUgb2YgdGhlIHBoaSBwYXJhbWV0ZXIsIGFuZCB0aGUgc2xvdCB0byB0aGUgbmV3IHNsb3QuCisgICAgU2xvdEluZGV4KGNvbnN0IFNsb3RJbmRleCAmbGksIGJvb2wgcGhpLCBTbG90IHMpCisgICAgICA6IGxpZSgmbGkuZW50cnkoKSwgcGhpID8gUEhJX0JJVCB8IHMgOiAodW5zaWduZWQpcykgeworICAgICAgYXNzZXJ0KGxpZS5nZXRQb2ludGVyKCkgIT0gMCAmJgorICAgICAgICAgICAgICJBdHRlbXB0IHRvIGNvbnN0cnVjdCBpbmRleCB3aXRoIDAgcG9pbnRlci4iKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBpbmRleC4gSW52YWxpZCBpbmRpY2llcyBkbworICAgIC8vLyBub3QgcG9pbnQgaW50byBhbiBpbmRleCB0YWJsZSwgYW5kIGNhbm5vdCBiZSBjb21wYXJlZC4KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICBJbmRleExpc3RFbnRyeSAqZW50cnkgPSBsaWUuZ2V0UG9pbnRlcigpOworICAgICAgcmV0dXJuICgoZW50cnkhPSAwKSAmJiAoZW50cnktPmlzVmFsaWQoKSkpOworICAgIH0KKworICAgIC8vLyBQcmludCB0aGlzIGluZGV4IHRvIHRoZSBnaXZlbiByYXdfb3N0cmVhbS4KKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisKKyAgICAvLy8gRHVtcCB0aGlzIGluZGV4IHRvIHN0ZGVyci4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIC8vLyBDb21wYXJlIHR3byBTbG90SW5kZXggb2JqZWN0cyBmb3IgZXF1YWxpdHkuCisgICAgYm9vbCBvcGVyYXRvcj09KFNsb3RJbmRleCBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGdldEluZGV4KCkgPT0gb3RoZXIuZ2V0SW5kZXgoKTsKKyAgICB9CisgICAgLy8vIENvbXBhcmUgdHdvIFNsb3RJbmRleCBvYmplY3RzIGZvciBpbmVxdWFsaXR5LgorICAgIGJvb2wgb3BlcmF0b3IhPShTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRJbmRleCgpICE9IG90aGVyLmdldEluZGV4KCk7IAorICAgIH0KKyAgIAorICAgIC8vLyBDb21wYXJlIHR3byBTbG90SW5kZXggb2JqZWN0cy4gUmV0dXJuIHRydWUgaWYgdGhlIGZpcnN0IGluZGV4CisgICAgLy8vIGlzIHN0cmljdGx5IGxvd2VyIHRoYW4gdGhlIHNlY29uZC4KKyAgICBib29sIG9wZXJhdG9yPChTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRJbmRleCgpIDwgb3RoZXIuZ2V0SW5kZXgoKTsKKyAgICB9CisgICAgLy8vIENvbXBhcmUgdHdvIFNsb3RJbmRleCBvYmplY3RzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlyc3QgaW5kZXgKKyAgICAvLy8gaXMgbG93ZXIgdGhhbiwgb3IgZXF1YWwgdG8sIHRoZSBzZWNvbmQuCisgICAgYm9vbCBvcGVyYXRvcjw9KFNsb3RJbmRleCBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGdldEluZGV4KCkgPD0gb3RoZXIuZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICAvLy8gQ29tcGFyZSB0d28gU2xvdEluZGV4IG9iamVjdHMuIFJldHVybiB0cnVlIGlmIHRoZSBmaXJzdCBpbmRleAorICAgIC8vLyBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4KKyAgICBib29sIG9wZXJhdG9yPihTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRJbmRleCgpID4gb3RoZXIuZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICAvLy8gQ29tcGFyZSB0d28gU2xvdEluZGV4IG9iamVjdHMuIFJldHVybiB0cnVlIGlmIHRoZSBmaXJzdCBpbmRleAorICAgIC8vLyBpcyBncmVhdGVyIHRoYW4sIG9yIGVxdWFsIHRvLCB0aGUgc2Vjb25kLgorICAgIGJvb2wgb3BlcmF0b3I+PShTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRJbmRleCgpID49IG90aGVyLmdldEluZGV4KCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIGluZGV4IHRvIHRoZSBnaXZlbiBvbmUuCisgICAgaW50IGRpc3RhbmNlKFNsb3RJbmRleCBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIG90aGVyLmdldEluZGV4KCkgLSBnZXRJbmRleCgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBzbG90IGZvciB0aGlzIFNsb3RJbmRleC4KKyAgICBTbG90IGdldFNsb3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U2xvdD4obGllLmdldEludCgpICAmIH5QSElfQklUKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIFBISSBiaXQuCisgICAgYm9vbCBpc1BISSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsaWUuZ2V0SW50KCkgJiBQSElfQklUOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBiYXNlIGluZGV4IGZvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmRleC4gVGhlIGJhc2UgaW5kZXgKKyAgICAvLy8gaXMgdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhlIExPQUQgc2xvdCBmb3IgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQgdG8KKyAgICAvLy8gYnkgdGhpcyBpbmRleC4KKyAgICBTbG90SW5kZXggZ2V0QmFzZUluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldExvYWRJbmRleCgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBib3VuZGFyeSBpbmRleCBmb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5kZXguIFRoZSBib3VuZGFyeQorICAgIC8vLyBpbmRleCBpcyB0aGUgb25lIGFzc29jaWF0ZWQgd2l0aCB0aGUgTE9BRCBzbG90IGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gcG9pbnRlZCB0byBieSB0aGlzIGluZGV4LgorICAgIFNsb3RJbmRleCBnZXRCb3VuZGFyeUluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFN0b3JlSW5kZXgoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIExPQUQgc2xvdCBmb3IgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQgdG8gYnkKKyAgICAvLy8gdGhpcyBpbmRleC4KKyAgICBTbG90SW5kZXggZ2V0TG9hZEluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIFNsb3RJbmRleCgmZW50cnkoKSwgU2xvdEluZGV4OjpMT0FEKTsKKyAgICB9ICAgIAorCisgICAgLy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBVU0Ugc2xvdCBmb3IgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQgdG8gYnkKKyAgICAvLy8gdGhpcyBpbmRleC4KKyAgICBTbG90SW5kZXggZ2V0VXNlSW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gU2xvdEluZGV4KCZlbnRyeSgpLCBTbG90SW5kZXg6OlVTRSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBERUYgc2xvdCBmb3IgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQgdG8gYnkKKyAgICAvLy8gdGhpcyBpbmRleC4KKyAgICBTbG90SW5kZXggZ2V0RGVmSW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gU2xvdEluZGV4KCZlbnRyeSgpLCBTbG90SW5kZXg6OkRFRik7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBTVE9SRSBzbG90IGZvciB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlZCB0byBieQorICAgIC8vLyB0aGlzIGluZGV4LgorICAgIFNsb3RJbmRleCBnZXRTdG9yZUluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIFNsb3RJbmRleCgmZW50cnkoKSwgU2xvdEluZGV4OjpTVE9SRSk7CisgICAgfSAgICAKKworICAgIC8vLyBSZXR1cm5zIHRoZSBuZXh0IHNsb3QgaW4gdGhlIGluZGV4IGxpc3QuIFRoaXMgY291bGQgYmUgZWl0aGVyIHRoZQorICAgIC8vLyBuZXh0IHNsb3QgZm9yIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVkIHRvIGJ5IHRoaXMgaW5kZXggb3IsIGlmIHRoaXMKKyAgICAvLy8gaW5kZXggaXMgYSBTVE9SRSwgdGhlIGZpcnN0IHNsb3QgZm9yIHRoZSBuZXh0IGluc3RydWN0aW9uLgorICAgIC8vLyBXQVJOSU5HOiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgbW9yZSBleHBlbnNpdmUgdGhhbiB0aGUgbWV0aG9kcworICAgIC8vLyB0aGF0IHJldHVybiBzcGVjaWZpYyBzbG90cyAoZ2V0VXNlSW5kZXgoKSwgZXRjKS4gSWYgeW91IGNhbiAtIHBsZWFzZQorICAgIC8vLyB1c2Ugb25lIG9mIHRob3NlIG1ldGhvZHMuCisgICAgU2xvdEluZGV4IGdldE5leHRTbG90KCkgY29uc3QgeworICAgICAgU2xvdCBzID0gZ2V0U2xvdCgpOworICAgICAgaWYgKHMgPT0gU2xvdEluZGV4OjpTVE9SRSkgeworICAgICAgICByZXR1cm4gU2xvdEluZGV4KGVudHJ5KCkuZ2V0TmV4dCgpLCBTbG90SW5kZXg6OkxPQUQpOworICAgICAgfQorICAgICAgcmV0dXJuIFNsb3RJbmRleCgmZW50cnkoKSwgcyArIDEpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBuZXh0IGluZGV4LiBUaGlzIGlzIHRoZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aGlzCisgICAgLy8vIGluZGV4J3Mgc2xvdCwgYnV0IGZvciB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyAgICBTbG90SW5kZXggZ2V0TmV4dEluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIFNsb3RJbmRleChlbnRyeSgpLmdldE5leHQoKSwgZ2V0U2xvdCgpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgcHJldmlvdXMgc2xvdCBpbiB0aGUgaW5kZXggbGlzdC4gVGhpcyBjb3VsZCBiZSBlaXRoZXIgdGhlCisgICAgLy8vIHByZXZpb3VzIHNsb3QgZm9yIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVkIHRvIGJ5IHRoaXMgaW5kZXggb3IsIGlmIHRoaXMKKyAgICAvLy8gaW5kZXggaXMgYSBMT0FELCB0aGUgbGFzdCBzbG90IGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCisgICAgLy8vIFdBUk5JTkc6IFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyYWJseSBtb3JlIGV4cGVuc2l2ZSB0aGFuIHRoZSBtZXRob2RzCisgICAgLy8vIHRoYXQgcmV0dXJuIHNwZWNpZmljIHNsb3RzIChnZXRVc2VJbmRleCgpLCBldGMpLiBJZiB5b3UgY2FuIC0gcGxlYXNlCisgICAgLy8vIHVzZSBvbmUgb2YgdGhvc2UgbWV0aG9kcy4KKyAgICBTbG90SW5kZXggZ2V0UHJldlNsb3QoKSBjb25zdCB7CisgICAgICBTbG90IHMgPSBnZXRTbG90KCk7CisgICAgICBpZiAocyA9PSBTbG90SW5kZXg6OkxPQUQpIHsKKyAgICAgICAgcmV0dXJuIFNsb3RJbmRleChlbnRyeSgpLmdldFByZXYoKSwgU2xvdEluZGV4OjpTVE9SRSk7CisgICAgICB9CisgICAgICByZXR1cm4gU2xvdEluZGV4KCZlbnRyeSgpLCBzIC0gMSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHByZXZpb3VzIGluZGV4LiBUaGlzIGlzIHRoZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoaXMKKyAgICAvLy8gaW5kZXgncyBzbG90LCBidXQgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4KKyAgICBTbG90SW5kZXggZ2V0UHJldkluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIFNsb3RJbmRleChlbnRyeSgpLmdldFByZXYoKSwgZ2V0U2xvdCgpKTsKKyAgICB9CisKKyAgfTsKKworICAvLy8gRGVuc2VNYXBJbmZvIHNwZWNpYWxpemF0aW9uIGZvciBTbG90SW5kZXguCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBEZW5zZU1hcEluZm88U2xvdEluZGV4PiB7CisgICAgc3RhdGljIGlubGluZSBTbG90SW5kZXggZ2V0RW1wdHlLZXkoKSB7CisgICAgICByZXR1cm4gU2xvdEluZGV4OjpnZXRFbXB0eUtleSgpOworICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIFNsb3RJbmRleCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgICByZXR1cm4gU2xvdEluZGV4OjpnZXRUb21ic3RvbmVLZXkoKTsKKyAgICB9CisgICAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgU2xvdEluZGV4ICZ2KSB7CisgICAgICByZXR1cm4gU2xvdEluZGV4OjpnZXRIYXNoVmFsdWUodik7CisgICAgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0VxdWFsKGNvbnN0IFNsb3RJbmRleCAmTEhTLCBjb25zdCBTbG90SW5kZXggJlJIUykgeworICAgICAgcmV0dXJuIChMSFMgPT0gUkhTKTsKKyAgICB9CisgIH07CisgIAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNQb2RMaWtlPFNsb3RJbmRleD4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKworICBpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJm9zLCBTbG90SW5kZXggbGkpIHsKKyAgICBsaS5wcmludChvcyk7CisgICAgcmV0dXJuIG9zOworICB9CisKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8U2xvdEluZGV4LCBNYWNoaW5lQmFzaWNCbG9jayo+IElkeE1CQlBhaXI7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KFNsb3RJbmRleCBWLCBjb25zdCBJZHhNQkJQYWlyICZJTSkgeworICAgIHJldHVybiBWIDwgSU0uZmlyc3Q7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgSWR4TUJCUGFpciAmSU0sIFNsb3RJbmRleCBWKSB7CisgICAgcmV0dXJuIElNLmZpcnN0IDwgVjsKKyAgfQorCisgIHN0cnVjdCBJZHgyTUJCQ29tcGFyZSB7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IElkeE1CQlBhaXIgJkxIUywgY29uc3QgSWR4TUJCUGFpciAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gTEhTLmZpcnN0IDwgUkhTLmZpcnN0OworICAgIH0KKyAgfTsKKworICAvLy8gU2xvdEluZGV4ZXMgcGFzcy4KKyAgLy8vCisgIC8vLyBUaGlzIHBhc3MgYXNzaWducyBpbmRleGVzIHRvIGVhY2ggaW5zdHJ1Y3Rpb24uCisgIGNsYXNzIFNsb3RJbmRleGVzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBwcml2YXRlOgorCisgICAgTWFjaGluZUZ1bmN0aW9uICptZjsKKyAgICBJbmRleExpc3RFbnRyeSAqaW5kZXhMaXN0SGVhZDsKKyAgICB1bnNpZ25lZCBmdW5jdGlvblNpemU7CisKKyAgICB0eXBlZGVmIERlbnNlTWFwPGNvbnN0IE1hY2hpbmVJbnN0ciosIFNsb3RJbmRleD4gTWkySW5kZXhNYXA7CisgICAgTWkySW5kZXhNYXAgbWkyaU1hcDsKKworICAgIC8vLyBNQkIySWR4TWFwIC0gVGhlIGluZGV4ZXMgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IGluc3RydWN0aW9ucyBpbiB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGJhc2ljIGJsb2NrLgorICAgIHR5cGVkZWYgRGVuc2VNYXA8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sqLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPFNsb3RJbmRleCwgU2xvdEluZGV4PiA+IE1CQjJJZHhNYXA7CisgICAgTUJCMklkeE1hcCBtYmIySWR4TWFwOworCisgICAgLy8vIElkeDJNQkJNYXAgLSBTb3J0ZWQgbGlzdCBvZiBwYWlycyBvZiBpbmRleCBvZiBmaXJzdCBpbnN0cnVjdGlvbgorICAgIC8vLyBhbmQgTUJCIGlkLgorICAgIHN0ZDo6dmVjdG9yPElkeE1CQlBhaXI+IGlkeDJNQkJNYXA7CisKKyAgICB0eXBlZGVmIERlbnNlTWFwPGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKiwgU2xvdEluZGV4PiBUZXJtaW5hdG9yR2Fwc01hcDsKKyAgICBUZXJtaW5hdG9yR2Fwc01hcCB0ZXJtaW5hdG9yR2FwczsKKworICAgIC8vIEluZGV4TGlzdEVudHJ5IGFsbG9jYXRvci4KKyAgICBCdW1wUHRyQWxsb2NhdG9yIGlsZUFsbG9jYXRvcjsKKworICAgIEluZGV4TGlzdEVudHJ5KiBjcmVhdGVFbnRyeShNYWNoaW5lSW5zdHIgKm1pLCB1bnNpZ25lZCBpbmRleCkgeworICAgICAgSW5kZXhMaXN0RW50cnkgKmVudHJ5ID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8SW5kZXhMaXN0RW50cnkqPigKKyAgICAgICAgICBpbGVBbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZW9mKEluZGV4TGlzdEVudHJ5KSwKKyAgICAgICAgICBhbGlnbm9mPEluZGV4TGlzdEVudHJ5PigpKSk7CisKKyAgICAgIG5ldyAoZW50cnkpIEluZGV4TGlzdEVudHJ5KG1pLCBpbmRleCk7CisKKyAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9CisKKyAgICB2b2lkIGluaXRMaXN0KCkgeworICAgICAgYXNzZXJ0KGluZGV4TGlzdEhlYWQgPT0gMCAmJiAiWmVybyBlbnRyeSBub24tbnVsbCBhdCBpbml0aWFsaXNhdGlvbi4iKTsKKyAgICAgIGluZGV4TGlzdEhlYWQgPSBjcmVhdGVFbnRyeSgwLCB+MFUpOworICAgICAgaW5kZXhMaXN0SGVhZC0+c2V0TmV4dCgwKTsKKyAgICAgIGluZGV4TGlzdEhlYWQtPnNldFByZXYoaW5kZXhMaXN0SGVhZCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhckxpc3QoKSB7CisgICAgICBpbmRleExpc3RIZWFkID0gMDsKKyAgICAgIGlsZUFsbG9jYXRvci5SZXNldCgpOworICAgIH0KKworICAgIEluZGV4TGlzdEVudHJ5KiBnZXRUYWlsKCkgeworICAgICAgYXNzZXJ0KGluZGV4TGlzdEhlYWQgIT0gMCAmJiAiQ2FsbCB0byBnZXRUYWlsIG9uIHVuaW5pdGlhbGl6ZWQgbGlzdC4iKTsKKyAgICAgIHJldHVybiBpbmRleExpc3RIZWFkLT5nZXRQcmV2KCk7CisgICAgfQorCisgICAgY29uc3QgSW5kZXhMaXN0RW50cnkqIGdldFRhaWwoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaW5kZXhMaXN0SGVhZCAhPSAwICYmICJDYWxsIHRvIGdldFRhaWwgb24gdW5pbml0aWFsaXplZCBsaXN0LiIpOworICAgICAgcmV0dXJuIGluZGV4TGlzdEhlYWQtPmdldFByZXYoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGluZGV4IGxpc3QgaXMgZW1wdHkuCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIChpbmRleExpc3RIZWFkID09IGdldFRhaWwoKSk7IH0KKworICAgIEluZGV4TGlzdEVudHJ5KiBmcm9udCgpIHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSAmJiAiZnJvbnQoKSBjYWxsZWQgb24gZW1wdHkgaW5kZXggbGlzdC4iKTsKKyAgICAgIHJldHVybiBpbmRleExpc3RIZWFkOworICAgIH0KKworICAgIGNvbnN0IEluZGV4TGlzdEVudHJ5KiBmcm9udCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSAmJiAiZnJvbnQoKSBjYWxsZWQgb24gZW1wdHkgaW5kZXggbGlzdC4iKTsKKyAgICAgIHJldHVybiBpbmRleExpc3RIZWFkOworICAgIH0KKworICAgIEluZGV4TGlzdEVudHJ5KiBiYWNrKCkgeworICAgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJiYWNrKCkgY2FsbGVkIG9uIGVtcHR5IGluZGV4IGxpc3QuIik7CisgICAgICByZXR1cm4gZ2V0VGFpbCgpLT5nZXRQcmV2KCk7CisgICAgfQorCisgICAgY29uc3QgSW5kZXhMaXN0RW50cnkqIGJhY2soKSBjb25zdCB7CisgICAgICBhc3NlcnQoIWVtcHR5KCkgJiYgImJhY2soKSBjYWxsZWQgb24gZW1wdHkgaW5kZXggbGlzdC4iKTsKKyAgICAgIHJldHVybiBnZXRUYWlsKCktPmdldFByZXYoKTsKKyAgICB9CisKKyAgICAvLy8gSW5zZXJ0IGEgbmV3IGVudHJ5IGJlZm9yZSBpdHIuCisgICAgdm9pZCBpbnNlcnQoSW5kZXhMaXN0RW50cnkgKml0ciwgSW5kZXhMaXN0RW50cnkgKnZhbCkgeworICAgICAgYXNzZXJ0KGl0ciAhPSAwICYmICJpdHIgc2hvdWxkIG5vdCBiZSBudWxsLiIpOworICAgICAgSW5kZXhMaXN0RW50cnkgKnByZXYgPSBpdHItPmdldFByZXYoKTsKKyAgICAgIHZhbC0+c2V0TmV4dChpdHIpOworICAgICAgdmFsLT5zZXRQcmV2KHByZXYpOworICAgICAgCisgICAgICBpZiAoaXRyICE9IGluZGV4TGlzdEhlYWQpIHsKKyAgICAgICAgcHJldi0+c2V0TmV4dCh2YWwpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGluZGV4TGlzdEhlYWQgPSB2YWw7CisgICAgICB9CisgICAgICBpdHItPnNldFByZXYodmFsKTsKKyAgICB9CisKKyAgICAvLy8gUHVzaCBhIG5ldyBlbnRyeSBvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgIHZvaWQgcHVzaF9iYWNrKEluZGV4TGlzdEVudHJ5ICp2YWwpIHsKKyAgICAgIGluc2VydChnZXRUYWlsKCksIHZhbCk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKworICAgIFNsb3RJbmRleGVzKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwgaW5kZXhMaXN0SGVhZCgwKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmYXUpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlTWVtb3J5KCk7IAorCisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmZm4pOworCisgICAgLy8vIER1bXAgdGhlIGluZGV4ZXMuCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICAvLy8gUmVudW1iZXIgdGhlIGluZGV4IGxpc3QsIHByb3ZpZGluZyBzcGFjZSBmb3IgbmV3IGluc3RydWN0aW9ucy4KKyAgICB2b2lkIHJlbnVtYmVySW5kZXhlcygpOworCisgICAgLy8vIFJldHVybnMgdGhlIHplcm8gaW5kZXggZm9yIHRoaXMgYW5hbHlzaXMuCisgICAgU2xvdEluZGV4IGdldFplcm9JbmRleCgpIHsKKyAgICAgIGFzc2VydChmcm9udCgpLT5nZXRJbmRleCgpID09IDAgJiYgIkZpcnN0IGluZGV4IGlzIG5vdCAwPyIpOworICAgICAgcmV0dXJuIFNsb3RJbmRleChmcm9udCgpLCAwKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgYmFzZSBpbmRleCBvZiB0aGUgbGFzdCBzbG90IGluIHRoaXMgYW5hbHlzaXMuCisgICAgU2xvdEluZGV4IGdldExhc3RJbmRleCgpIHsKKyAgICAgIHJldHVybiBTbG90SW5kZXgoYmFjaygpLCAwKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaW52YWxpZCBpbmRleCBtYXJrZXIgZm9yIHRoaXMgYW5hbHlzaXMuCisgICAgU2xvdEluZGV4IGdldEludmFsaWRJbmRleCgpIHsKKyAgICAgIHJldHVybiBnZXRaZXJvSW5kZXgoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgaGlnaGVzdCBhbmQgbG93ZXN0IGluZGV4ZXMgYWxsb2NhdGVkCisgICAgLy8vIHNvIGZhci4KKyAgICB1bnNpZ25lZCBnZXRJbmRleGVzTGVuZ3RoKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGZyb250KCktPmdldEluZGV4KCkgPT0gMCAmJgorICAgICAgICAgICAgICJJbml0aWFsIGluZGV4IGlzbid0IHplcm8/Iik7CisKKyAgICAgIHJldHVybiBiYWNrKCktPmdldEluZGV4KCk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIGZ1bmN0aW9uLgorICAgIHVuc2lnbmVkIGdldEZ1bmN0aW9uU2l6ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBmdW5jdGlvblNpemU7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWFjaGluZSBpbnN0ciBpcyBtYXBwZWQgdG8gYW4gaW5kZXgsCisgICAgLy8vIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgaGFzSW5kZXgoY29uc3QgTWFjaGluZUluc3RyICppbnN0cikgY29uc3QgeworICAgICAgcmV0dXJuIChtaTJpTWFwLmZpbmQoaW5zdHIpICE9IG1pMmlNYXAuZW5kKCkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBiYXNlIGluZGV4IGZvciB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uCisgICAgU2xvdEluZGV4IGdldEluc3RydWN0aW9uSW5kZXgoY29uc3QgTWFjaGluZUluc3RyICppbnN0cikgY29uc3QgeworICAgICAgTWkySW5kZXhNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ciA9IG1pMmlNYXAuZmluZChpbnN0cik7CisgICAgICBhc3NlcnQoaXRyICE9IG1pMmlNYXAuZW5kKCkgJiYgIkluc3RydWN0aW9uIG5vdCBmb3VuZCBpbiBtYXBzLiIpOworICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGdpdmVuIGluZGV4LCBvciBudWxsIGlmIHRoZSBnaXZlbgorICAgIC8vLyBpbmRleCBoYXMgbm8gaW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgIE1hY2hpbmVJbnN0ciogZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoU2xvdEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXguZW50cnkoKS5nZXRJbnN0cigpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBuZXh0IG5vbi1udWxsIGluZGV4LgorICAgIFNsb3RJbmRleCBnZXROZXh0Tm9uTnVsbEluZGV4KFNsb3RJbmRleCBpbmRleCkgeworICAgICAgU2xvdEluZGV4IG5leHROb25OdWxsID0gaW5kZXguZ2V0TmV4dEluZGV4KCk7CisKKyAgICAgIHdoaWxlICgmbmV4dE5vbk51bGwuZW50cnkoKSAhPSBnZXRUYWlsKCkgJiYKKyAgICAgICAgICAgICBnZXRJbnN0cnVjdGlvbkZyb21JbmRleChuZXh0Tm9uTnVsbCkgPT0gMCkgeworICAgICAgICBuZXh0Tm9uTnVsbCA9IG5leHROb25OdWxsLmdldE5leHRJbmRleCgpOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV4dE5vbk51bGw7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGZpcnN0IGluZGV4IGluIHRoZSBnaXZlbiBiYXNpYyBibG9jay4KKyAgICBTbG90SW5kZXggZ2V0TUJCU3RhcnRJZHgoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKm1iYikgY29uc3QgeworICAgICAgTUJCMklkeE1hcDo6Y29uc3RfaXRlcmF0b3IgaXRyID0gbWJiMklkeE1hcC5maW5kKG1iYik7CisgICAgICBhc3NlcnQoaXRyICE9IG1iYjJJZHhNYXAuZW5kKCkgJiYgIk1CQiBub3QgZm91bmQgaW4gbWFwcy4iKTsKKyAgICAgIHJldHVybiBpdHItPnNlY29uZC5maXJzdDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbGFzdCBpbmRleCBpbiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgICAgU2xvdEluZGV4IGdldE1CQkVuZElkeChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSBjb25zdCB7CisgICAgICBNQkIySWR4TWFwOjpjb25zdF9pdGVyYXRvciBpdHIgPSBtYmIySWR4TWFwLmZpbmQobWJiKTsKKyAgICAgIGFzc2VydChpdHIgIT0gbWJiMklkeE1hcC5lbmQoKSAmJiAiTUJCIG5vdCBmb3VuZCBpbiBtYXBzLiIpOworICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kLnNlY29uZDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgdGVybWluYXRvciBnYXAgZm9yIHRoZSBnaXZlbiBpbmRleC4KKyAgICBTbG90SW5kZXggZ2V0VGVybWluYXRvckdhcChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSB7CisgICAgICBUZXJtaW5hdG9yR2Fwc01hcDo6aXRlcmF0b3IgaXRyID0gdGVybWluYXRvckdhcHMuZmluZChtYmIpOworICAgICAgYXNzZXJ0KGl0ciAhPSB0ZXJtaW5hdG9yR2Fwcy5lbmQoKSAmJgorICAgICAgICAgICAgICJBbGwgTUJCcyBzaG91bGQgaGF2ZSB0ZXJtaW5hdG9yIGdhcHMgaW4gdGhlaXIgaW5kZXhlcy4iKTsKKyAgICAgIHJldHVybiBpdHItPnNlY29uZDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgYmFzaWMgYmxvY2sgd2hpY2ggdGhlIGdpdmVuIGluZGV4IGZhbGxzIGluLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBnZXRNQkJGcm9tSW5kZXgoU2xvdEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICBzdGQ6OnZlY3RvcjxJZHhNQkJQYWlyPjo6Y29uc3RfaXRlcmF0b3IgSSA9CisgICAgICAgIHN0ZDo6bG93ZXJfYm91bmQoaWR4Mk1CQk1hcC5iZWdpbigpLCBpZHgyTUJCTWFwLmVuZCgpLCBpbmRleCk7CisgICAgICAvLyBUYWtlIHRoZSBwYWlyIGNvbnRhaW5pbmcgdGhlIGluZGV4CisgICAgICBzdGQ6OnZlY3RvcjxJZHhNQkJQYWlyPjo6Y29uc3RfaXRlcmF0b3IgSiA9CisgICAgICAgICgoSSAhPSBpZHgyTUJCTWFwLmVuZCgpICYmIEktPmZpcnN0ID4gaW5kZXgpIHx8CisgICAgICAgICAoSSA9PSBpZHgyTUJCTWFwLmVuZCgpICYmIGlkeDJNQkJNYXAuc2l6ZSgpPjApKSA/IChJLTEpOiBJOworCisgICAgICBhc3NlcnQoSiAhPSBpZHgyTUJCTWFwLmVuZCgpICYmIEotPmZpcnN0IDw9IGluZGV4ICYmCisgICAgICAgICAgICAgaW5kZXggPCBnZXRNQkJFbmRJZHgoSi0+c2Vjb25kKSAmJgorICAgICAgICAgICAgICJpbmRleCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuIE1CQiIpOworICAgICAgcmV0dXJuIEotPnNlY29uZDsKKyAgICB9CisKKyAgICBib29sIGZpbmRMaXZlSW5NQkJzKFNsb3RJbmRleCBzdGFydCwgU2xvdEluZGV4IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lQmFzaWNCbG9jayo+ICZtYmJzKSBjb25zdCB7CisgICAgICBzdGQ6OnZlY3RvcjxJZHhNQkJQYWlyPjo6Y29uc3RfaXRlcmF0b3IgaXRyID0KKyAgICAgICAgc3RkOjpsb3dlcl9ib3VuZChpZHgyTUJCTWFwLmJlZ2luKCksIGlkeDJNQkJNYXAuZW5kKCksIHN0YXJ0KTsKKyAgICAgIGJvb2wgcmVzVmFsID0gZmFsc2U7CisKKyAgICAgIHdoaWxlIChpdHIgIT0gaWR4Mk1CQk1hcC5lbmQoKSkgeworICAgICAgICBpZiAoaXRyLT5maXJzdCA+PSBlbmQpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIG1iYnMucHVzaF9iYWNrKGl0ci0+c2Vjb25kKTsKKyAgICAgICAgcmVzVmFsID0gdHJ1ZTsKKyAgICAgICAgKytpdHI7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzVmFsOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSBsaXN0IG9mIE1CQnMgdGhhdCBjYW4gYmUgcmVhY2ggdmlhIGFueSBicmFuY2hlcyBvcgorICAgIC8vLyBmYWxsLXRocm91Z2hzLgorICAgIGJvb2wgZmluZFJlYWNoYWJsZU1CQnMoU2xvdEluZGV4IHN0YXJ0LCBTbG90SW5kZXggZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVCYXNpY0Jsb2NrKj4gJm1iYnMpIGNvbnN0IHsKKyAgICAgIHN0ZDo6dmVjdG9yPElkeE1CQlBhaXI+Ojpjb25zdF9pdGVyYXRvciBpdHIgPQorICAgICAgICBzdGQ6Omxvd2VyX2JvdW5kKGlkeDJNQkJNYXAuYmVnaW4oKSwgaWR4Mk1CQk1hcC5lbmQoKSwgc3RhcnQpOworCisgICAgICBib29sIHJlc1ZhbCA9IGZhbHNlOworICAgICAgd2hpbGUgKGl0ciAhPSBpZHgyTUJCTWFwLmVuZCgpKSB7CisgICAgICAgIGlmIChpdHItPmZpcnN0ID4gZW5kKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqbWJiID0gaXRyLT5zZWNvbmQ7CisgICAgICAgIGlmIChnZXRNQkJFbmRJZHgobWJiKSA+IGVuZCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6c3VjY19pdGVyYXRvciBzaSA9IG1iYi0+c3VjY19iZWdpbigpLAorICAgICAgICAgICAgIHNlID0gbWJiLT5zdWNjX2VuZCgpOyBzaSAhPSBzZTsgKytzaSkKKyAgICAgICAgICBtYmJzLnB1c2hfYmFjaygqc2kpOworICAgICAgICByZXNWYWwgPSB0cnVlOworICAgICAgICArK2l0cjsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXNWYWw7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIE1CQiBjb3ZlcmluZyB0aGUgZ2l2ZW4gcmFuZ2UsIG9yIG51bGwgaWYgdGhlIHJhbmdlIGNvdmVycworICAgIC8vLyBtb3JlIHRoYW4gb25lIGJhc2ljIGJsb2NrLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBnZXRNQkJDb3ZlcmluZ1JhbmdlKFNsb3RJbmRleCBzdGFydCwgU2xvdEluZGV4IGVuZCkgY29uc3QgeworCisgICAgICBhc3NlcnQoc3RhcnQgPCBlbmQgJiYgIkJhY2t3YXJkcyByYW5nZXMgbm90IGFsbG93ZWQuIik7CisKKyAgICAgIHN0ZDo6dmVjdG9yPElkeE1CQlBhaXI+Ojpjb25zdF9pdGVyYXRvciBpdHIgPQorICAgICAgICBzdGQ6Omxvd2VyX2JvdW5kKGlkeDJNQkJNYXAuYmVnaW4oKSwgaWR4Mk1CQk1hcC5lbmQoKSwgc3RhcnQpOworCisgICAgICBpZiAoaXRyID09IGlkeDJNQkJNYXAuZW5kKCkpIHsKKyAgICAgICAgaXRyID0gcHJpb3IoaXRyKTsKKyAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOworICAgICAgfQorCisgICAgICAvLyBDaGVjayB0aGF0IHdlIGRvbid0IGNyb3NzIHRoZSBib3VuZGFyeSBpbnRvIHRoaXMgYmxvY2suCisgICAgICBpZiAoaXRyLT5maXJzdCA8IGVuZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIGl0ciA9IHByaW9yKGl0cik7CisKKyAgICAgIGlmIChpdHItPmZpcnN0IDw9IHN0YXJ0KQorICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vLyBJbnNlcnQgdGhlIGdpdmVuIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaW50byB0aGUgbWFwcGluZy4gUmV0dXJucyB0aGUKKyAgICAvLy8gYXNzaWduZWQgaW5kZXguCisgICAgU2xvdEluZGV4IGluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhNYWNoaW5lSW5zdHIgKm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRlZmVycmVkUmVudW1iZXIgPSAwKSB7CisgICAgICBhc3NlcnQobWkyaU1hcC5maW5kKG1pKSA9PSBtaTJpTWFwLmVuZCgpICYmICJJbnN0ciBhbHJlYWR5IGluZGV4ZWQuIik7CisKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICptYmIgPSBtaS0+Z2V0UGFyZW50KCk7CisKKyAgICAgIGFzc2VydChtYmIgIT0gMCAmJiAiSW5zdHIgbXVzdCBiZSBhZGRlZCB0byBmdW5jdGlvbi4iKTsKKworICAgICAgTUJCMklkeE1hcDo6aXRlcmF0b3IgbWJiUmFuZ2VJdHIgPSBtYmIySWR4TWFwLmZpbmQobWJiKTsKKworICAgICAgYXNzZXJ0KG1iYlJhbmdlSXRyICE9IG1iYjJJZHhNYXAuZW5kKCkgJiYKKyAgICAgICAgICAgICAiSW5zdHJ1Y3Rpb24ncyBwYXJlbnQgTUJCIGhhcyBub3QgYmVlbiBhZGRlZCB0byBTbG90SW5kZXhlcy4iKTsKKworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIG1pSXRyKG1pKTsKKyAgICAgIGJvb2wgbmVlZFJlbnVtYmVyID0gZmFsc2U7CisgICAgICBJbmRleExpc3RFbnRyeSAqbmV3RW50cnk7CisgICAgICAvLyBHZXQgcHJldmlvdXMgaW5kZXgsIGNvbnNpZGVyaW5nIHRoYXQgbm90IGFsbCBpbnN0cnVjdGlvbnMgYXJlIGluZGV4ZWQuCisgICAgICBJbmRleExpc3RFbnRyeSAqcHJldkVudHJ5OworICAgICAgZm9yICg7OykgeworICAgICAgICAvLyBJZiBtaSBpcyBhdCB0aGUgbWJiIGJlZ2lubmluZywgZ2V0IHRoZSBwcmV2IGluZGV4IGZyb20gdGhlIG1iYi4KKyAgICAgICAgaWYgKG1pSXRyID09IG1iYi0+YmVnaW4oKSkgeworICAgICAgICAgIHByZXZFbnRyeSA9ICZtYmJSYW5nZUl0ci0+c2Vjb25kLmZpcnN0LmVudHJ5KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gT3RoZXJ3aXNlIHJld2luZCB1bnRpbCB3ZSBmaW5kIGEgbWFwcGVkIGluc3RydWN0aW9uLgorICAgICAgICBNaTJJbmRleE1hcDo6Y29uc3RfaXRlcmF0b3IgaXRyID0gbWkyaU1hcC5maW5kKC0tbWlJdHIpOworICAgICAgICBpZiAoaXRyICE9IG1pMmlNYXAuZW5kKCkpIHsKKyAgICAgICAgICBwcmV2RW50cnkgPSAmaXRyLT5zZWNvbmQuZW50cnkoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBHZXQgbmV4dCBlbnRyeSBmcm9tIHByZXZpb3VzIGVudHJ5LgorICAgICAgSW5kZXhMaXN0RW50cnkgKm5leHRFbnRyeSA9IHByZXZFbnRyeS0+Z2V0TmV4dCgpOworCisgICAgICAvLyBHZXQgYSBudW1iZXIgZm9yIHRoZSBuZXcgaW5zdHIsIG9yIDAgaWYgdGhlcmUncyBubyByb29tIGN1cnJlbnRseS4KKyAgICAgIC8vIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSdsbCBmb3JjZSBhIHJlbnVtYmVyIGxhdGVyLgorICAgICAgdW5zaWduZWQgZGlzdCA9IG5leHRFbnRyeS0+Z2V0SW5kZXgoKSAtIHByZXZFbnRyeS0+Z2V0SW5kZXgoKTsKKyAgICAgIHVuc2lnbmVkIG5ld051bWJlciA9IGRpc3QgPiBTbG90SW5kZXg6Ok5VTSA/CisgICAgICAgIHByZXZFbnRyeS0+Z2V0SW5kZXgoKSArICgoZGlzdCA+PiAxKSAmIH4zVSkgOiAwOworCisgICAgICBpZiAobmV3TnVtYmVyID09IDApIHsKKyAgICAgICAgbmVlZFJlbnVtYmVyID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gSW5zZXJ0IGEgbmV3IGxpc3QgZW50cnkgZm9yIG1pLgorICAgICAgbmV3RW50cnkgPSBjcmVhdGVFbnRyeShtaSwgbmV3TnVtYmVyKTsKKyAgICAgIGluc2VydChuZXh0RW50cnksIG5ld0VudHJ5KTsKKyAgCisgICAgICBTbG90SW5kZXggbmV3SW5kZXgobmV3RW50cnksIFNsb3RJbmRleDo6TE9BRCk7CisgICAgICBtaTJpTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihtaSwgbmV3SW5kZXgpKTsKKworICAgICAgaWYgKG1pSXRyID09IG1iYi0+ZW5kKCkpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0ciBpbiB0aGUgTUJCIHRoZW4gd2UgbmVlZCB0byBmaXggdXAgdGhlIGJiCisgICAgICAgIC8vIHJhbmdlOgorICAgICAgICBtYmJSYW5nZUl0ci0+c2Vjb25kLnNlY29uZCA9IFNsb3RJbmRleChuZXdFbnRyeSwgU2xvdEluZGV4OjpTVE9SRSk7CisgICAgICB9CisKKyAgICAgIC8vIFJlbnVtYmVyIGlmIHdlIG5lZWQgdG8uCisgICAgICBpZiAobmVlZFJlbnVtYmVyKSB7CisgICAgICAgIGlmIChkZWZlcnJlZFJlbnVtYmVyID09IDApCisgICAgICAgICAgcmVudW1iZXJJbmRleGVzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqZGVmZXJyZWRSZW51bWJlciA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXdJbmRleDsKKyAgICB9CisKKyAgICAvLy8gQWRkIGFsbCBpbnN0cnVjdGlvbnMgaW4gdGhlIHZlY3RvciB0byB0aGUgaW5kZXggbGlzdC4gVGhpcyBtZXRob2Qgd2lsbAorICAgIC8vLyBkZWZlciByZW51bWJlcmluZyB1bnRpbCBhbGwgaW5zdHJzIGhhdmUgYmVlbiBhZGRlZCwgYW5kIHNob3VsZCBiZSAKKyAgICAvLy8gcHJlZmVycmVkIHdoZW4gYWRkaW5nIG11bHRpcGxlIGluc3Rycy4KKyAgICB2b2lkIGluc2VydE1hY2hpbmVJbnN0cnNJbk1hcHMoU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICZtaXMpIHsKKyAgICAgIGJvb2wgcmVudW1iZXIgPSBmYWxzZTsKKworICAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyKj46Oml0ZXJhdG9yCisgICAgICAgICAgIG1pSXRyID0gbWlzLmJlZ2luKCksIG1pRW5kID0gbWlzLmVuZCgpOworICAgICAgICAgICBtaUl0ciAhPSBtaUVuZDsgKyttaUl0cikgeworICAgICAgICBpbnNlcnRNYWNoaW5lSW5zdHJJbk1hcHMoKm1pSXRyLCAmcmVudW1iZXIpOworICAgICAgfQorCisgICAgICBpZiAocmVudW1iZXIpCisgICAgICAgIHJlbnVtYmVySW5kZXhlcygpOworICAgIH0KKworCisgICAgLy8vIFJlbW92ZSB0aGUgZ2l2ZW4gbWFjaGluZSBpbnN0cnVjdGlvbiBmcm9tIHRoZSBtYXBwaW5nLgorICAgIHZvaWQgcmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoTWFjaGluZUluc3RyICptaSkgeworICAgICAgLy8gcmVtb3ZlIGluZGV4IC0+IE1hY2hpbmVJbnN0ciBhbmQKKyAgICAgIC8vIE1hY2hpbmVJbnN0ciAtPiBpbmRleCBtYXBwaW5ncworICAgICAgTWkySW5kZXhNYXA6Oml0ZXJhdG9yIG1pMmlJdHIgPSBtaTJpTWFwLmZpbmQobWkpOworICAgICAgaWYgKG1pMmlJdHIgIT0gbWkyaU1hcC5lbmQoKSkgeworICAgICAgICBJbmRleExpc3RFbnRyeSAqbWlFbnRyeSgmbWkyaUl0ci0+c2Vjb25kLmVudHJ5KCkpOyAgICAgICAgCisgICAgICAgIGFzc2VydChtaUVudHJ5LT5nZXRJbnN0cigpID09IG1pICYmICJJbnN0cnVjdGlvbiBpbmRleGVzIGJyb2tlbi4iKTsKKyAgICAgICAgLy8gRklYTUU6IEV2ZW50dWFsbHkgd2Ugd2FudCB0byBhY3R1YWxseSBkZWxldGUgdGhlc2UgaW5kZXhlcy4KKyAgICAgICAgbWlFbnRyeS0+c2V0SW5zdHIoMCk7CisgICAgICAgIG1pMmlNYXAuZXJhc2UobWkyaUl0cik7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIFJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHMgLSBSZXBsYWNpbmcgYSBtYWNoaW5lIGluc3RyIHdpdGggYSBuZXcgb25lIGluCisgICAgLy8vIG1hcHMgdXNlZCBieSByZWdpc3RlciBhbGxvY2F0b3IuCisgICAgdm9pZCByZXBsYWNlTWFjaGluZUluc3RySW5NYXBzKE1hY2hpbmVJbnN0ciAqbWksIE1hY2hpbmVJbnN0ciAqbmV3TUkpIHsKKyAgICAgIE1pMkluZGV4TWFwOjppdGVyYXRvciBtaTJpSXRyID0gbWkyaU1hcC5maW5kKG1pKTsKKyAgICAgIGlmIChtaTJpSXRyID09IG1pMmlNYXAuZW5kKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIFNsb3RJbmRleCByZXBsYWNlQmFzZUluZGV4ID0gbWkyaUl0ci0+c2Vjb25kOworICAgICAgSW5kZXhMaXN0RW50cnkgKm1pRW50cnkoJnJlcGxhY2VCYXNlSW5kZXguZW50cnkoKSk7CisgICAgICBhc3NlcnQobWlFbnRyeS0+Z2V0SW5zdHIoKSA9PSBtaSAmJgorICAgICAgICAgICAgICJNaXNtYXRjaGVkIGluc3RydWN0aW9uIGluIGluZGV4IHRhYmxlcy4iKTsKKyAgICAgIG1pRW50cnktPnNldEluc3RyKG5ld01JKTsKKyAgICAgIG1pMmlNYXAuZXJhc2UobWkyaUl0cik7CisgICAgICBtaTJpTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihuZXdNSSwgcmVwbGFjZUJhc2VJbmRleCkpOworICAgIH0KKworICAgIC8vLyBBZGQgdGhlIGdpdmVuIE1hY2hpbmVCYXNpY0Jsb2NrIGludG8gdGhlIG1hcHMuCisgICAgdm9pZCBpbnNlcnRNQkJJbk1hcHMoTWFjaGluZUJhc2ljQmxvY2sgKm1iYikgeworICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBuZXh0TUJCID0KKyAgICAgICAgbGx2bTo6bmV4dChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKG1iYikpOworICAgICAgSW5kZXhMaXN0RW50cnkgKnN0YXJ0RW50cnkgPSBjcmVhdGVFbnRyeSgwLCAwKTsKKyAgICAgIEluZGV4TGlzdEVudHJ5ICp0ZXJtaW5hdG9yRW50cnkgPSBjcmVhdGVFbnRyeSgwLCAwKTsgCisgICAgICBJbmRleExpc3RFbnRyeSAqbmV4dEVudHJ5ID0gMDsKKworICAgICAgaWYgKG5leHRNQkIgPT0gbWJiLT5nZXRQYXJlbnQoKS0+ZW5kKCkpIHsKKyAgICAgICAgbmV4dEVudHJ5ID0gZ2V0VGFpbCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dEVudHJ5ID0gJmdldE1CQlN0YXJ0SWR4KG5leHRNQkIpLmVudHJ5KCk7CisgICAgICB9CisKKyAgICAgIGluc2VydChuZXh0RW50cnksIHN0YXJ0RW50cnkpOworICAgICAgaW5zZXJ0KG5leHRFbnRyeSwgdGVybWluYXRvckVudHJ5KTsKKworICAgICAgU2xvdEluZGV4IHN0YXJ0SWR4KHN0YXJ0RW50cnksIFNsb3RJbmRleDo6TE9BRCk7CisgICAgICBTbG90SW5kZXggdGVybWluYXRvcklkeCh0ZXJtaW5hdG9yRW50cnksIFNsb3RJbmRleDo6UEhJX0JJVCk7CisgICAgICBTbG90SW5kZXggZW5kSWR4KG5leHRFbnRyeSwgU2xvdEluZGV4OjpMT0FEKTsKKworICAgICAgdGVybWluYXRvckdhcHMuaW5zZXJ0KAorICAgICAgICBzdGQ6Om1ha2VfcGFpcihtYmIsIHRlcm1pbmF0b3JJZHgpKTsKKworICAgICAgbWJiMklkeE1hcC5pbnNlcnQoCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKG1iYiwgc3RkOjptYWtlX3BhaXIoc3RhcnRJZHgsIGVuZElkeCkpKTsKKworICAgICAgaWR4Mk1CQk1hcC5wdXNoX2JhY2soSWR4TUJCUGFpcihzdGFydElkeCwgbWJiKSk7CisKKyAgICAgIGlmIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKG1iYikgIT0gbWJiLT5nZXRQYXJlbnQoKS0+YmVnaW4oKSkgeworICAgICAgICAvLyBIYXZlIHRvIHVwZGF0ZSB0aGUgZW5kIGluZGV4IG9mIHRoZSBwcmV2aW91cyBibG9jay4KKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKnByaW9yTUJCID0KKyAgICAgICAgICBsbHZtOjpwcmlvcihNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKG1iYikpOworICAgICAgICBtYmIySWR4TWFwW3ByaW9yTUJCXS5zZWNvbmQgPSBzdGFydElkeDsKKyAgICAgIH0KKworICAgICAgcmVudW1iZXJJbmRleGVzKCk7CisgICAgICBzdGQ6OnNvcnQoaWR4Mk1CQk1hcC5iZWdpbigpLCBpZHgyTUJCTWFwLmVuZCgpLCBJZHgyTUJCQ29tcGFyZSgpKTsKKworICAgIH0KKworICB9OworCisKK30KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9MSVZFSU5ERVhfSCAKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJhMTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oCkBAIC0wLDAgKzEsNjg5IEBACisvLz09PS0gQ29kZUdlbi9WYWx1ZVR5cGVzLmggLSBMb3ctTGV2ZWwgVGFyZ2V0IGluZGVwZW5kLiB0eXBlcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzZXQgb2YgbG93LWxldmVsIHRhcmdldCBpbmRlcGVuZGVudCB0eXBlcyB3aGljaCB2YXJpb3VzCisvLyB2YWx1ZXMgaW4gdGhlIGNvZGUgZ2VuZXJhdG9yIGFyZS4gIFRoaXMgYWxsb3dzIHRoZSB0YXJnZXQgc3BlY2lmaWMgYmVoYXZpb3IKKy8vIG9mIGluc3RydWN0aW9ucyB0byBiZSBkZXNjcmliZWQgdG8gdGFyZ2V0IGluZGVwZW5kZW50IHBhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9WQUxVRVRZUEVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1ZBTFVFVFlQRVNfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBUeXBlOworICBjbGFzcyBMTFZNQ29udGV4dDsKKyAgc3RydWN0IEVWVDsKKworICBjbGFzcyBNVlQgeyAvLyBNVlQgPSBNYWNoaW5lIFZhbHVlIFR5cGUKKyAgcHVibGljOgorICAgIGVudW0gU2ltcGxlVmFsdWVUeXBlIHsKKyAgICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBudW1iZXJpbmcsIHlvdSBtdXN0IGNoYW5nZSB0aGUgdmFsdWVzIGluCisgICAgICAvLyBWYWx1ZVR5cGVzLnRkIGFzIHdlbGwhCisgICAgICBPdGhlciAgICAgICAgICA9ICAgMCwgICAvLyBUaGlzIGlzIGEgbm9uLXN0YW5kYXJkIHZhbHVlCisgICAgICBpMSAgICAgICAgICAgICA9ICAgMSwgICAvLyBUaGlzIGlzIGEgMSBiaXQgaW50ZWdlciB2YWx1ZQorICAgICAgaTggICAgICAgICAgICAgPSAgIDIsICAgLy8gVGhpcyBpcyBhbiA4IGJpdCBpbnRlZ2VyIHZhbHVlCisgICAgICBpMTYgICAgICAgICAgICA9ICAgMywgICAvLyBUaGlzIGlzIGEgMTYgYml0IGludGVnZXIgdmFsdWUKKyAgICAgIGkzMiAgICAgICAgICAgID0gICA0LCAgIC8vIFRoaXMgaXMgYSAzMiBiaXQgaW50ZWdlciB2YWx1ZQorICAgICAgaTY0ICAgICAgICAgICAgPSAgIDUsICAgLy8gVGhpcyBpcyBhIDY0IGJpdCBpbnRlZ2VyIHZhbHVlCisgICAgICBpMTI4ICAgICAgICAgICA9ICAgNiwgICAvLyBUaGlzIGlzIGEgMTI4IGJpdCBpbnRlZ2VyIHZhbHVlCisKKyAgICAgIEZJUlNUX0lOVEVHRVJfVkFMVUVUWVBFID0gaTEsCisgICAgICBMQVNUX0lOVEVHRVJfVkFMVUVUWVBFICA9IGkxMjgsCisKKyAgICAgIGYzMiAgICAgICAgICAgID0gICA3LCAgIC8vIFRoaXMgaXMgYSAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAgICAgIGY2NCAgICAgICAgICAgID0gICA4LCAgIC8vIFRoaXMgaXMgYSA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAgICAgIGY4MCAgICAgICAgICAgID0gICA5LCAgIC8vIFRoaXMgaXMgYSA4MCBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAgICAgIGYxMjggICAgICAgICAgID0gIDEwLCAgIC8vIFRoaXMgaXMgYSAxMjggYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisgICAgICBwcGNmMTI4ICAgICAgICA9ICAxMSwgICAvLyBUaGlzIGlzIGEgUFBDIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKworICAgICAgdjJpOCAgICAgICAgICAgPSAgMTIsICAgLy8gIDIgeCBpOAorICAgICAgdjRpOCAgICAgICAgICAgPSAgMTMsICAgLy8gIDQgeCBpOAorICAgICAgdjhpOCAgICAgICAgICAgPSAgMTQsICAgLy8gIDggeCBpOAorICAgICAgdjE2aTggICAgICAgICAgPSAgMTUsICAgLy8gMTYgeCBpOAorICAgICAgdjMyaTggICAgICAgICAgPSAgMTYsICAgLy8gMzIgeCBpOAorICAgICAgdjJpMTYgICAgICAgICAgPSAgMTcsICAgLy8gIDIgeCBpMTYKKyAgICAgIHY0aTE2ICAgICAgICAgID0gIDE4LCAgIC8vICA0IHggaTE2CisgICAgICB2OGkxNiAgICAgICAgICA9ICAxOSwgICAvLyAgOCB4IGkxNgorICAgICAgdjE2aTE2ICAgICAgICAgPSAgMjAsICAgLy8gMTYgeCBpMTYKKyAgICAgIHYyaTMyICAgICAgICAgID0gIDIxLCAgIC8vICAyIHggaTMyCisgICAgICB2NGkzMiAgICAgICAgICA9ICAyMiwgICAvLyAgNCB4IGkzMgorICAgICAgdjhpMzIgICAgICAgICAgPSAgMjMsICAgLy8gIDggeCBpMzIKKyAgICAgIHYxaTY0ICAgICAgICAgID0gIDI0LCAgIC8vICAxIHggaTY0CisgICAgICB2Mmk2NCAgICAgICAgICA9ICAyNSwgICAvLyAgMiB4IGk2NAorICAgICAgdjRpNjQgICAgICAgICAgPSAgMjYsICAgLy8gIDQgeCBpNjQKKyAgICAgIHY4aTY0ICAgICAgICAgID0gIDI3LCAgIC8vICA4IHggaTY0CisKKyAgICAgIHYyZjMyICAgICAgICAgID0gIDI4LCAgIC8vICAyIHggZjMyCisgICAgICB2NGYzMiAgICAgICAgICA9ICAyOSwgICAvLyAgNCB4IGYzMgorICAgICAgdjhmMzIgICAgICAgICAgPSAgMzAsICAgLy8gIDggeCBmMzIKKyAgICAgIHYyZjY0ICAgICAgICAgID0gIDMxLCAgIC8vICAyIHggZjY0CisgICAgICB2NGY2NCAgICAgICAgICA9ICAzMiwgICAvLyAgNCB4IGY2NAorCisgICAgICBGSVJTVF9WRUNUT1JfVkFMVUVUWVBFID0gdjJpOCwKKyAgICAgIExBU1RfVkVDVE9SX1ZBTFVFVFlQRSAgPSB2NGY2NCwKKworICAgICAgRmxhZyAgICAgICAgICAgPSAgMzMsICAgLy8gVGhpcyBnbHVlcyBub2RlcyB0b2dldGhlciBkdXJpbmcgcHJlLVJBIHNjaGVkCisKKyAgICAgIGlzVm9pZCAgICAgICAgID0gIDM0LCAgIC8vIFRoaXMgaGFzIG5vIHZhbHVlCisKKyAgICAgIExBU1RfVkFMVUVUWVBFID0gIDM1LCAgIC8vIFRoaXMgYWx3YXlzIHJlbWFpbnMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKworICAgICAgLy8gVGhpcyBpcyB0aGUgY3VycmVudCBtYXhpbXVtIGZvciBMQVNUX1ZBTFVFVFlQRS4KKyAgICAgIC8vIEVWVDo6TUFYX0FMTE9XRURfVkFMVUVUWVBFIGlzIHVzZWQgZm9yIGFzc2VydHMgYW5kIHRvIHNpemUgYml0IHZlY3RvcnMKKyAgICAgIC8vIFRoaXMgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLgorICAgICAgTUFYX0FMTE9XRURfVkFMVUVUWVBFID0gNjQsCisKKyAgICAgIC8vIE1ldGFkYXRhIC0gVGhpcyBpcyBNRE5vZGUgb3IgTURTdHJpbmcuCisgICAgICBNZXRhZGF0YSAgICAgICA9IDI1MCwKKworICAgICAgLy8gaVBUUkFueSAtIEFuIGludCB2YWx1ZSB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlciBvZiB0aGUgY3VycmVudAorICAgICAgLy8gdGFyZ2V0IHRvIGFueSBhZGRyZXNzIHNwYWNlLiBUaGlzIG11c3Qgb25seSBiZSB1c2VkIGludGVybmFsIHRvCisgICAgICAvLyB0YmxnZW4uIE90aGVyIHRoYW4gZm9yIG92ZXJsb2FkaW5nLCB3ZSB0cmVhdCBpUFRSQW55IHRoZSBzYW1lIGFzIGlQVFIuCisgICAgICBpUFRSQW55ICAgICAgICA9IDI1MSwKKworICAgICAgLy8gdkFueSAtIEEgdmVjdG9yIHdpdGggYW55IGxlbmd0aCBhbmQgZWxlbWVudCBzaXplLiBUaGlzIGlzIHVzZWQKKyAgICAgIC8vIGZvciBpbnRyaW5zaWNzIHRoYXQgaGF2ZSBvdmVybG9hZGluZ3MgYmFzZWQgb24gdmVjdG9yIHR5cGVzLgorICAgICAgLy8gVGhpcyBpcyBvbmx5IGZvciB0YmxnZW4ncyBjb25zdW1wdGlvbiEKKyAgICAgIHZBbnkgICAgICAgICAgID0gMjUyLAorCisgICAgICAvLyBmQW55IC0gQW55IGZsb2F0aW5nLXBvaW50IG9yIHZlY3RvciBmbG9hdGluZy1wb2ludCB2YWx1ZS4gVGhpcyBpcyB1c2VkCisgICAgICAvLyBmb3IgaW50cmluc2ljcyB0aGF0IGhhdmUgb3ZlcmxvYWRpbmdzIGJhc2VkIG9uIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorICAgICAgLy8gVGhpcyBpcyBvbmx5IGZvciB0YmxnZW4ncyBjb25zdW1wdGlvbiEKKyAgICAgIGZBbnkgICAgICAgICAgID0gMjUzLAorCisgICAgICAvLyBpQW55IC0gQW4gaW50ZWdlciBvciB2ZWN0b3IgaW50ZWdlciB2YWx1ZSBvZiBhbnkgYml0IHdpZHRoLiBUaGlzIGlzCisgICAgICAvLyB1c2VkIGZvciBpbnRyaW5zaWNzIHRoYXQgaGF2ZSBvdmVybG9hZGluZ3MgYmFzZWQgb24gaW50ZWdlciBiaXQgd2lkdGhzLgorICAgICAgLy8gVGhpcyBpcyBvbmx5IGZvciB0YmxnZW4ncyBjb25zdW1wdGlvbiEKKyAgICAgIGlBbnkgICAgICAgICAgID0gMjU0LAorCisgICAgICAvLyBpUFRSIC0gQW4gaW50IHZhbHVlIHRoZSBzaXplIG9mIHRoZSBwb2ludGVyIG9mIHRoZSBjdXJyZW50CisgICAgICAvLyB0YXJnZXQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW50ZXJuYWwgdG8gdGJsZ2VuIQorICAgICAgaVBUUiAgICAgICAgICAgPSAyNTUsCisKKyAgICAgIC8vIExhc3RTaW1wbGVWYWx1ZVR5cGUgLSBUaGUgZ3JlYXRlc3QgdmFsaWQgU2ltcGxlVmFsdWVUeXBlIHZhbHVlLgorICAgICAgTGFzdFNpbXBsZVZhbHVlVHlwZSA9IDI1NSwKKworICAgICAgLy8gSU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSAtIFNpbXBsZSB2YWx1ZSB0eXBlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKyAgICAgIC8vIHRvIHRoaXMgYXJlIGNvbnNpZGVyZWQgZXh0ZW5kZWQgdmFsdWUgdHlwZXMuCisgICAgICBJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFID0gTGFzdFNpbXBsZVZhbHVlVHlwZSArIDEKKyAgICB9OworCisgICAgU2ltcGxlVmFsdWVUeXBlIFNpbXBsZVR5OworCisgICAgTVZUKCkgOiBTaW1wbGVUeSgoU2ltcGxlVmFsdWVUeXBlKShJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFKSkge30KKyAgICBNVlQoU2ltcGxlVmFsdWVUeXBlIFNWVCkgOiBTaW1wbGVUeShTVlQpIHsgfQorICAgIAorICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE1WVCYgUykgIGNvbnN0IHsgcmV0dXJuIFNpbXBsZVR5ID4gIFMuU2ltcGxlVHk7IH0KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBNVlQmIFMpICBjb25zdCB7IHJldHVybiBTaW1wbGVUeSA8ICBTLlNpbXBsZVR5OyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1WVCYgUykgY29uc3QgeyByZXR1cm4gU2ltcGxlVHkgPT0gUy5TaW1wbGVUeTsgfQorICAgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBNVlQmIFMpIGNvbnN0IHsgcmV0dXJuIFNpbXBsZVR5ID49IFMuU2ltcGxlVHk7IH0KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgTVZUJiBTKSBjb25zdCB7IHJldHVybiBTaW1wbGVUeSA8PSBTLlNpbXBsZVR5OyB9CisgICAgCisgICAgLy8vIGlzRmxvYXRpbmdQb2ludCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBGUCwgb3IgYSB2ZWN0b3IgRlAgdHlwZS4KKyAgICBib29sIGlzRmxvYXRpbmdQb2ludCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoKFNpbXBsZVR5ID49IE1WVDo6ZjMyICYmIFNpbXBsZVR5IDw9IE1WVDo6cHBjZjEyOCkgfHwKKyAgICAgICAgKFNpbXBsZVR5ID49IE1WVDo6djJmMzIgJiYgU2ltcGxlVHkgPD0gTVZUOjp2NGY2NCkpOworICAgIH0KKworICAgIC8vLyBpc0ludGVnZXIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGludGVnZXIsIG9yIGEgdmVjdG9yIGludGVnZXIgdHlwZS4KKyAgICBib29sIGlzSW50ZWdlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoKFNpbXBsZVR5ID49IE1WVDo6RklSU1RfSU5URUdFUl9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgICAgIFNpbXBsZVR5IDw9IE1WVDo6TEFTVF9JTlRFR0VSX1ZBTFVFVFlQRSkgfHwKKyAgICAgICAgICAgICAgIChTaW1wbGVUeSA+PSBNVlQ6OnYyaTggJiYgU2ltcGxlVHkgPD0gTVZUOjp2OGk2NCkpOworICAgIH0KKworICAgIC8vLyBpc1ZlY3RvciAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB2ZWN0b3IgdmFsdWUgdHlwZS4KKyAgICBib29sIGlzVmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIChTaW1wbGVUeSA+PSBNVlQ6OkZJUlNUX1ZFQ1RPUl9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPD0gTVZUOjpMQVNUX1ZFQ1RPUl9WQUxVRVRZUEUpOworICAgIH0KKyAgICAKKyAgICAvLy8gaXNQb3cyVmVjdG9yVHlwZSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmVjdG9yIGlzIGEgcG93ZXIgb2YgMi4KKyAgICBib29sIGlzUG93MlZlY3RvclR5cGUoKSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBORWx0cyA9IGdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICByZXR1cm4gIShORWx0cyAmIChORWx0cyAtIDEpKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0UG93MlZlY3RvclR5cGUgLSBXaWRlbnMgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gdmVjdG9yIEVWVCB1cCB0bworICAgIC8vLyB0aGUgbmVhcmVzdCBwb3dlciBvZiAyIGFuZCByZXR1cm5zIHRoYXQgdHlwZS4KKyAgICBNVlQgZ2V0UG93MlZlY3RvclR5cGUoKSBjb25zdCB7CisgICAgICBpZiAoIWlzUG93MlZlY3RvclR5cGUoKSkgeworICAgICAgICB1bnNpZ25lZCBORWx0cyA9IGdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICAgIHVuc2lnbmVkIFBvdzJORWx0cyA9IDEgPDwgIExvZzJfMzJfQ2VpbChORWx0cyk7CisgICAgICAgIHJldHVybiBNVlQ6OmdldFZlY3RvclZUKGdldFZlY3RvckVsZW1lbnRUeXBlKCksIFBvdzJORWx0cyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBnZXRTY2FsYXJUeXBlIC0gSWYgdGhpcyBpcyBhIHZlY3RvciB0eXBlLCByZXR1cm4gdGhlIGVsZW1lbnQgdHlwZSwKKyAgICAvLy8gb3RoZXJ3aXNlIHJldHVybiB0aGlzLgorICAgIE1WVCBnZXRTY2FsYXJUeXBlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzVmVjdG9yKCkgPyBnZXRWZWN0b3JFbGVtZW50VHlwZSgpIDogKnRoaXM7CisgICAgfQorICAgIAorICAgIE1WVCBnZXRWZWN0b3JFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICAgIHN3aXRjaCAoU2ltcGxlVHkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE1WVDo6SU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSk7CisgICAgICBjYXNlIHYyaTggOgorICAgICAgY2FzZSB2NGk4IDoKKyAgICAgIGNhc2UgdjhpOCA6CisgICAgICBjYXNlIHYxNmk4OgorICAgICAgY2FzZSB2MzJpODogcmV0dXJuIGk4OworICAgICAgY2FzZSB2MmkxNjoKKyAgICAgIGNhc2UgdjRpMTY6CisgICAgICBjYXNlIHY4aTE2OgorICAgICAgY2FzZSB2MTZpMTY6IHJldHVybiBpMTY7CisgICAgICBjYXNlIHYyaTMyOgorICAgICAgY2FzZSB2NGkzMjoKKyAgICAgIGNhc2UgdjhpMzI6IHJldHVybiBpMzI7CisgICAgICBjYXNlIHYxaTY0OgorICAgICAgY2FzZSB2Mmk2NDoKKyAgICAgIGNhc2UgdjRpNjQ6CisgICAgICBjYXNlIHY4aTY0OiByZXR1cm4gaTY0OworICAgICAgY2FzZSB2MmYzMjoKKyAgICAgIGNhc2UgdjRmMzI6CisgICAgICBjYXNlIHY4ZjMyOiByZXR1cm4gZjMyOworICAgICAgY2FzZSB2MmY2NDoKKyAgICAgIGNhc2UgdjRmNjQ6IHJldHVybiBmNjQ7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIGdldFZlY3Rvck51bUVsZW1lbnRzKCkgY29uc3QgeworICAgICAgc3dpdGNoIChTaW1wbGVUeSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIH4wVTsKKyAgICAgIGNhc2UgdjMyaTg6IHJldHVybiAzMjsKKyAgICAgIGNhc2UgdjE2aTg6CisgICAgICBjYXNlIHYxNmkxNjogcmV0dXJuIDE2OworICAgICAgY2FzZSB2OGk4IDoKKyAgICAgIGNhc2UgdjhpMTY6CisgICAgICBjYXNlIHY4aTMyOgorICAgICAgY2FzZSB2OGk2NDoKKyAgICAgIGNhc2UgdjhmMzI6IHJldHVybiA4OworICAgICAgY2FzZSB2NGk4OgorICAgICAgY2FzZSB2NGkxNjoKKyAgICAgIGNhc2UgdjRpMzI6CisgICAgICBjYXNlIHY0aTY0OgorICAgICAgY2FzZSB2NGYzMjoKKyAgICAgIGNhc2UgdjRmNjQ6IHJldHVybiA0OworICAgICAgY2FzZSB2Mmk4OgorICAgICAgY2FzZSB2MmkxNjoKKyAgICAgIGNhc2UgdjJpMzI6CisgICAgICBjYXNlIHYyaTY0OgorICAgICAgY2FzZSB2MmYzMjoKKyAgICAgIGNhc2UgdjJmNjQ6IHJldHVybiAyOworICAgICAgY2FzZSB2MWk2NDogcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIGdldFNpemVJbkJpdHMoKSBjb25zdCB7CisgICAgICBzd2l0Y2ggKFNpbXBsZVR5KSB7CisgICAgICBjYXNlIGlQVFI6CisgICAgICAgIGFzc2VydCgwICYmICJWYWx1ZSB0eXBlIHNpemUgaXMgdGFyZ2V0LWRlcGVuZGVudC4gQXNrIFRMSS4iKTsKKyAgICAgIGNhc2UgaVBUUkFueToKKyAgICAgIGNhc2UgaUFueToKKyAgICAgIGNhc2UgZkFueToKKyAgICAgICAgYXNzZXJ0KDAgJiYgIlZhbHVlIHR5cGUgaXMgb3ZlcmxvYWRlZC4iKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCgwICYmICJnZXRTaXplSW5CaXRzIGNhbGxlZCBvbiBleHRlbmRlZCBNVlQuIik7CisgICAgICBjYXNlIGkxICA6ICByZXR1cm4gMTsKKyAgICAgIGNhc2UgaTggIDogIHJldHVybiA4OworICAgICAgY2FzZSBpMTYgOgorICAgICAgY2FzZSB2Mmk4OiAgcmV0dXJuIDE2OworICAgICAgY2FzZSBmMzIgOgorICAgICAgY2FzZSBpMzIgOgorICAgICAgY2FzZSB2NGk4OgorICAgICAgY2FzZSB2MmkxNjogcmV0dXJuIDMyOworICAgICAgY2FzZSBmNjQgOgorICAgICAgY2FzZSBpNjQgOgorICAgICAgY2FzZSB2OGk4OgorICAgICAgY2FzZSB2NGkxNjoKKyAgICAgIGNhc2UgdjJpMzI6CisgICAgICBjYXNlIHYxaTY0OgorICAgICAgY2FzZSB2MmYzMjogcmV0dXJuIDY0OworICAgICAgY2FzZSBmODAgOiAgcmV0dXJuIDgwOworICAgICAgY2FzZSBmMTI4OgorICAgICAgY2FzZSBwcGNmMTI4OgorICAgICAgY2FzZSBpMTI4OgorICAgICAgY2FzZSB2MTZpODoKKyAgICAgIGNhc2UgdjhpMTY6CisgICAgICBjYXNlIHY0aTMyOgorICAgICAgY2FzZSB2Mmk2NDoKKyAgICAgIGNhc2UgdjRmMzI6CisgICAgICBjYXNlIHYyZjY0OiByZXR1cm4gMTI4OworICAgICAgY2FzZSB2MzJpODoKKyAgICAgIGNhc2UgdjE2aTE2OgorICAgICAgY2FzZSB2OGkzMjoKKyAgICAgIGNhc2UgdjRpNjQ6CisgICAgICBjYXNlIHY4ZjMyOgorICAgICAgY2FzZSB2NGY2NDogcmV0dXJuIDI1NjsKKyAgICAgIGNhc2UgdjhpNjQ6IHJldHVybiA1MTI7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHN0YXRpYyBNVlQgZ2V0RmxvYXRpbmdQb2ludFZUKHVuc2lnbmVkIEJpdFdpZHRoKSB7CisgICAgICBzd2l0Y2ggKEJpdFdpZHRoKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoZmFsc2UgJiYgIkJhZCBiaXQgd2lkdGghIik7CisgICAgICBjYXNlIDMyOgorICAgICAgICByZXR1cm4gTVZUOjpmMzI7CisgICAgICBjYXNlIDY0OgorICAgICAgICByZXR1cm4gTVZUOjpmNjQ7CisgICAgICBjYXNlIDgwOgorICAgICAgICByZXR1cm4gTVZUOjpmODA7CisgICAgICBjYXNlIDEyODoKKyAgICAgICAgcmV0dXJuIE1WVDo6ZjEyODsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgc3RhdGljIE1WVCBnZXRJbnRlZ2VyVlQodW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICAgIHN3aXRjaCAoQml0V2lkdGgpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE1WVDo6SU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSk7CisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiBNVlQ6OmkxOworICAgICAgY2FzZSA4OgorICAgICAgICByZXR1cm4gTVZUOjppODsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIHJldHVybiBNVlQ6OmkxNjsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgIHJldHVybiBNVlQ6OmkzMjsKKyAgICAgIGNhc2UgNjQ6CisgICAgICAgIHJldHVybiBNVlQ6Omk2NDsKKyAgICAgIGNhc2UgMTI4OgorICAgICAgICByZXR1cm4gTVZUOjppMTI4OworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgTVZUIGdldFZlY3RvclZUKE1WVCBWVCwgdW5zaWduZWQgTnVtRWxlbWVudHMpIHsKKyAgICAgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6Omk4OgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6OnYyaTg7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6djRpODsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjp2OGk4OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTYpIHJldHVybiBNVlQ6OnYxNmk4OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMzIpIHJldHVybiBNVlQ6OnYzMmk4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppMTY6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6djJpMTY7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6djRpMTY7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6djhpMTY7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxNikgcmV0dXJuIE1WVDo6djE2aTE2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppMzI6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6djJpMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6djRpMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6djhpMzI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6Omk2NDoKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEpICByZXR1cm4gTVZUOjp2MWk2NDsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjp2Mmk2NDsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICByZXR1cm4gTVZUOjp2NGk2NDsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjp2OGk2NDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6ZjMyOgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6OnYyZjMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6OnY0ZjMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6OnY4ZjMyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6djJmNjQ7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6djRmNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFKTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIE1WVCBnZXRJbnRWZWN0b3JXaXRoTnVtRWxlbWVudHModW5zaWduZWQgTnVtRWx0cykgeworICAgICAgc3dpdGNoIChOdW1FbHRzKSB7CisgICAgICBkZWZhdWx0OiByZXR1cm4gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUpOworICAgICAgY2FzZSAgMTogcmV0dXJuIE1WVDo6djFpNjQ7CisgICAgICBjYXNlICAyOiByZXR1cm4gTVZUOjp2MmkzMjsKKyAgICAgIGNhc2UgIDQ6IHJldHVybiBNVlQ6OnY0aTE2OworICAgICAgY2FzZSAgODogcmV0dXJuIE1WVDo6djhpODsKKyAgICAgIGNhc2UgMTY6IHJldHVybiBNVlQ6OnYxNmk4OworICAgICAgfQorICAgIH0KKyAgfTsKKworICBzdHJ1Y3QgRVZUIHsgLy8gRVZUID0gRXh0ZW5kZWQgVmFsdWUgVHlwZQorICBwcml2YXRlOgorICAgIE1WVCBWOworICAgIGNvbnN0IFR5cGUgKkxMVk1UeTsKKworICBwdWJsaWM6CisgICAgRVZUKCkgOiBWKChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFKSksCisgICAgICAgICAgICBMTFZNVHkoMCkge30KKyAgICBFVlQoTVZUOjpTaW1wbGVWYWx1ZVR5cGUgU1ZUKSA6IFYoU1ZUKSwgTExWTVR5KDApIHsgfQorICAgIEVWVChNVlQgUykgOiBWKFMpLCBMTFZNVHkoMCkge30KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFVlQgVlQpIGNvbnN0IHsKKyAgICAgIGlmIChWLlNpbXBsZVR5ID09IFZULlYuU2ltcGxlVHkpIHsKKyAgICAgICAgaWYgKFYuU2ltcGxlVHkgPT0gTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFKQorICAgICAgICAgIHJldHVybiBMTFZNVHkgPT0gVlQuTExWTVR5OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKFYuU2ltcGxlVHkgPT0gVlQuVi5TaW1wbGVUeSkgeworICAgICAgICBpZiAoVi5TaW1wbGVUeSA9PSBNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUpCisgICAgICAgICAgcmV0dXJuIExMVk1UeSAhPSBWVC5MTFZNVHk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBnZXRGbG9hdGluZ1BvaW50VlQgLSBSZXR1cm5zIHRoZSBFVlQgdGhhdCByZXByZXNlbnRzIGEgZmxvYXRpbmcgcG9pbnQKKyAgICAvLy8gdHlwZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYml0cy4gIFRoZXJlIGFyZSB0d28gZmxvYXRpbmcgcG9pbnQgdHlwZXMKKyAgICAvLy8gd2l0aCAxMjggYml0cyAtIHRoaXMgcmV0dXJucyBmMTI4IHJhdGhlciB0aGFuIHBwY2YxMjguCisgICAgc3RhdGljIEVWVCBnZXRGbG9hdGluZ1BvaW50VlQodW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICAgIHJldHVybiBNVlQ6OmdldEZsb2F0aW5nUG9pbnRWVChCaXRXaWR0aCk7CisgICAgfQorCisgICAgLy8vIGdldEludGVnZXJWVCAtIFJldHVybnMgdGhlIEVWVCB0aGF0IHJlcHJlc2VudHMgYW4gaW50ZWdlciB3aXRoIHRoZSBnaXZlbgorICAgIC8vLyBudW1iZXIgb2YgYml0cy4KKyAgICBzdGF0aWMgRVZUIGdldEludGVnZXJWVChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICAgIE1WVCBNID0gTVZUOjpnZXRJbnRlZ2VyVlQoQml0V2lkdGgpOworICAgICAgaWYgKE0uU2ltcGxlVHkgPT0gTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFKQorICAgICAgICByZXR1cm4gZ2V0RXh0ZW5kZWRJbnRlZ2VyVlQoQ29udGV4dCwgQml0V2lkdGgpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTTsKKyAgICB9CisKKyAgICAvLy8gZ2V0VmVjdG9yVlQgLSBSZXR1cm5zIHRoZSBFVlQgdGhhdCByZXByZXNlbnRzIGEgdmVjdG9yIE51bUVsZW1lbnRzIGluCisgICAgLy8vIGxlbmd0aCwgd2hlcmUgZWFjaCBlbGVtZW50IGlzIG9mIHR5cGUgVlQuCisgICAgc3RhdGljIEVWVCBnZXRWZWN0b3JWVChMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZULCB1bnNpZ25lZCBOdW1FbGVtZW50cykgeworICAgICAgTVZUIE0gPSBNVlQ6OmdldFZlY3RvclZUKFZULlYsIE51bUVsZW1lbnRzKTsKKyAgICAgIGlmIChNLlNpbXBsZVR5ID09IE1WVDo6SU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSkKKyAgICAgICAgcmV0dXJuIGdldEV4dGVuZGVkVmVjdG9yVlQoQ29udGV4dCwgVlQsIE51bUVsZW1lbnRzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE07CisgICAgfQorCisgICAgLy8vIGdldEludFZlY3RvcldpdGhOdW1FbGVtZW50cyAtIFJldHVybiBhbnkgaW50ZWdlciB2ZWN0b3IgdHlwZSB0aGF0IGhhcworICAgIC8vLyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICBzdGF0aWMgRVZUIGdldEludFZlY3RvcldpdGhOdW1FbGVtZW50cyhMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgTnVtRWx0cykgeworICAgICAgTVZUIE0gPSBNVlQ6OmdldEludFZlY3RvcldpdGhOdW1FbGVtZW50cyhOdW1FbHRzKTsKKyAgICAgIGlmIChNLlNpbXBsZVR5ID09IE1WVDo6SU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSkKKyAgICAgICAgcmV0dXJuIGdldFZlY3RvclZUKEMsIE1WVDo6aTgsIE51bUVsdHMpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTTsKKyAgICB9CisKKyAgICAvLy8gaXNTaW1wbGUgLSBUZXN0IGlmIHRoZSBnaXZlbiBFVlQgaXMgc2ltcGxlIChhcyBvcHBvc2VkIHRvIGJlaW5nCisgICAgLy8vIGV4dGVuZGVkKS4KKyAgICBib29sIGlzU2ltcGxlKCkgY29uc3QgeworICAgICAgcmV0dXJuIFYuU2ltcGxlVHkgPD0gTVZUOjpMYXN0U2ltcGxlVmFsdWVUeXBlOworICAgIH0KKworICAgIC8vLyBpc0V4dGVuZGVkIC0gVGVzdCBpZiB0aGUgZ2l2ZW4gRVZUIGlzIGV4dGVuZGVkIChhcyBvcHBvc2VkIHRvCisgICAgLy8vIGJlaW5nIHNpbXBsZSkuCisgICAgYm9vbCBpc0V4dGVuZGVkKCkgY29uc3QgeworICAgICAgcmV0dXJuICFpc1NpbXBsZSgpOworICAgIH0KKworICAgIC8vLyBpc0Zsb2F0aW5nUG9pbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgRlAsIG9yIGEgdmVjdG9yIEZQIHR5cGUuCisgICAgYm9vbCBpc0Zsb2F0aW5nUG9pbnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTaW1wbGUoKSA/IFYuaXNGbG9hdGluZ1BvaW50KCkgOiBpc0V4dGVuZGVkRmxvYXRpbmdQb2ludCgpOworICAgIH0KKworICAgIC8vLyBpc0ludGVnZXIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGludGVnZXIsIG9yIGEgdmVjdG9yIGludGVnZXIgdHlwZS4KKyAgICBib29sIGlzSW50ZWdlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gVi5pc0ludGVnZXIoKSA6IGlzRXh0ZW5kZWRJbnRlZ2VyKCk7CisgICAgfQorCisgICAgLy8vIGlzVmVjdG9yIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHZlY3RvciB2YWx1ZSB0eXBlLgorICAgIGJvb2wgaXNWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTaW1wbGUoKSA/IFYuaXNWZWN0b3IoKSA6IGlzRXh0ZW5kZWRWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gaXM2NEJpdFZlY3RvciAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSA2NC1iaXQgdmVjdG9yIHR5cGUuCisgICAgYm9vbCBpczY0Qml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPworICAgICAgICAgICAgIChWPT1NVlQ6OnY4aTggfHwgVj09TVZUOjp2NGkxNiB8fCBWPT1NVlQ6OnYyaTMyIHx8CisgICAgICAgICAgICAgIFY9PU1WVDo6djFpNjQgfHwgVj09TVZUOjp2MmYzMikgOgorICAgICAgICAgICAgIGlzRXh0ZW5kZWQ2NEJpdFZlY3RvcigpOworICAgIH0KKworICAgIC8vLyBpczEyOEJpdFZlY3RvciAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAxMjgtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMxMjhCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTaW1wbGUoKSA/CisgICAgICAgICAgICAgKFY9PU1WVDo6djE2aTggfHwgVj09TVZUOjp2OGkxNiB8fCBWPT1NVlQ6OnY0aTMyIHx8CisgICAgICAgICAgICAgIFY9PU1WVDo6djJpNjQgfHwgVj09TVZUOjp2NGYzMiB8fCBWPT1NVlQ6OnYyZjY0KSA6CisgICAgICAgICAgICAgaXNFeHRlbmRlZDEyOEJpdFZlY3RvcigpOworICAgIH0KKworICAgIC8vLyBpczI1NkJpdFZlY3RvciAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAyNTYtYml0IHZlY3RvciB0eXBlLgorICAgIGlubGluZSBib29sIGlzMjU2Qml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkKKyAgICAgICAgPyAoVj09TVZUOjp2OGYzMiB8fCBWPT1NVlQ6OnY0ZjY0IHx8IFY9PU1WVDo6djMyaTggfHwKKyAgICAgICAgICAgVj09TVZUOjp2MTZpMTYgfHwgVj09TVZUOjp2OGkzMiB8fCBWPT1NVlQ6OnY0aTY0KQorICAgICAgICA6IGlzRXh0ZW5kZWQyNTZCaXRWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gaXM1MTJCaXRWZWN0b3IgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgNTEyLWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBpbmxpbmUgYm9vbCBpczUxMkJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gKFYgPT0gTVZUOjp2OGk2NCkgOiBpc0V4dGVuZGVkNTEyQml0VmVjdG9yKCk7CisgICAgfQorCisgICAgLy8vIGlzT3ZlcmxvYWRlZCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gb3ZlcmxvYWRlZCB0eXBlIGZvciBUYWJsZUdlbi4KKyAgICBib29sIGlzT3ZlcmxvYWRlZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoVj09TVZUOjppQW55IHx8IFY9PU1WVDo6ZkFueSB8fCBWPT1NVlQ6OnZBbnkgfHwgVj09TVZUOjppUFRSQW55KTsKKyAgICB9CisKKyAgICAvLy8gaXNCeXRlU2l6ZWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgYml0IHNpemUgaXMgYSBtdWx0aXBsZSBvZiA4LgorICAgIGJvb2wgaXNCeXRlU2l6ZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gKGdldFNpemVJbkJpdHMoKSAmIDcpID09IDA7CisgICAgfQorCisgICAgLy8vIGlzUm91bmQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2l6ZSBpcyBhIHBvd2VyLW9mLXR3byBudW1iZXIgb2YgYnl0ZXMuCisgICAgYm9vbCBpc1JvdW5kKCkgY29uc3QgeworICAgICAgdW5zaWduZWQgQml0U2l6ZSA9IGdldFNpemVJbkJpdHMoKTsKKyAgICAgIHJldHVybiBCaXRTaXplID49IDggJiYgIShCaXRTaXplICYgKEJpdFNpemUgLSAxKSk7CisgICAgfQorCisgICAgLy8vIGJpdHNFcSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBiaXRzIGFzIFZULgorICAgIGJvb2wgYml0c0VxKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA9PSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIGJpdHNHVCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIG1vcmUgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0dUKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBnZXRTaXplSW5CaXRzKCkgPiBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIGJpdHNHRSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIG5vIGxlc3MgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0dFKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA+PSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIGJpdHNMVCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIGxlc3MgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0xUKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBnZXRTaXplSW5CaXRzKCkgPCBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIGJpdHNMRSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIG5vIG1vcmUgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0xFKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA8PSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisKKyAgICAvLy8gZ2V0U2ltcGxlVlQgLSBSZXR1cm4gdGhlIFNpbXBsZVZhbHVlVHlwZSBoZWxkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gc2ltcGxlIEVWVC4KKyAgICBNVlQgZ2V0U2ltcGxlVlQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNTaW1wbGUoKSAmJiAiRXhwZWN0ZWQgYSBTaW1wbGVWYWx1ZVR5cGUhIik7CisgICAgICByZXR1cm4gVjsKKyAgICB9CisKKyAgICAvLy8gZ2V0U2NhbGFyVHlwZSAtIElmIHRoaXMgaXMgYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZSBlbGVtZW50IHR5cGUsCisgICAgLy8vIG90aGVyd2lzZSByZXR1cm4gdGhpcy4KKyAgICBFVlQgZ2V0U2NhbGFyVHlwZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1ZlY3RvcigpID8gZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSA6ICp0aGlzOworICAgIH0KKyAgICAKKyAgICAvLy8gZ2V0VmVjdG9yRWxlbWVudFR5cGUgLSBHaXZlbiBhIHZlY3RvciB0eXBlLCByZXR1cm4gdGhlIHR5cGUgb2YKKyAgICAvLy8gZWFjaCBlbGVtZW50LgorICAgIEVWVCBnZXRWZWN0b3JFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc1ZlY3RvcigpICYmICJJbnZhbGlkIHZlY3RvciB0eXBlISIpOworICAgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICAgIHJldHVybiBWLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBnZXRFeHRlbmRlZFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgfQorCisgICAgLy8vIGdldFZlY3Rvck51bUVsZW1lbnRzIC0gR2l2ZW4gYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZSBudW1iZXIgb2YKKyAgICAvLy8gZWxlbWVudHMgaXQgY29udGFpbnMuCisgICAgdW5zaWduZWQgZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNWZWN0b3IoKSAmJiAiSW52YWxpZCB2ZWN0b3IgdHlwZSEiKTsKKyAgICAgIGlmIChpc1NpbXBsZSgpKQorICAgICAgICByZXR1cm4gVi5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZ2V0RXh0ZW5kZWRWZWN0b3JOdW1FbGVtZW50cygpOworICAgIH0KKworICAgIC8vLyBnZXRTaXplSW5CaXRzIC0gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZSBpbiBiaXRzLgorICAgIHVuc2lnbmVkIGdldFNpemVJbkJpdHMoKSBjb25zdCB7CisgICAgICBpZiAoaXNTaW1wbGUoKSkKKyAgICAgICAgcmV0dXJuIFYuZ2V0U2l6ZUluQml0cygpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZ2V0RXh0ZW5kZWRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIGdldFN0b3JlU2l6ZSAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG92ZXJ3cml0dGVuIGJ5IGEgc3RvcmUKKyAgICAvLy8gb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlLgorICAgIHVuc2lnbmVkIGdldFN0b3JlU2l6ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoZ2V0U2l6ZUluQml0cygpICsgNykgLyA4OworICAgIH0KKworICAgIC8vLyBnZXRTdG9yZVNpemVJbkJpdHMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIG92ZXJ3cml0dGVuIGJ5IGEgc3RvcmUKKyAgICAvLy8gb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlLgorICAgIHVuc2lnbmVkIGdldFN0b3JlU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRTdG9yZVNpemUoKSAqIDg7CisgICAgfQorCisgICAgLy8vIGdldFJvdW5kSW50ZWdlclR5cGUgLSBSb3VuZHMgdGhlIGJpdC13aWR0aCBvZiB0aGUgZ2l2ZW4gaW50ZWdlciBFVlQgdXAKKyAgICAvLy8gdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgdHdvIChhbmQgYXQgbGVhc3QgdG8gZWlnaHQpLCBhbmQgcmV0dXJucyB0aGUKKyAgICAvLy8gaW50ZWdlciBFVlQgd2l0aCB0aGF0IG51bWJlciBvZiBiaXRzLgorICAgIEVWVCBnZXRSb3VuZEludGVnZXJUeXBlKExMVk1Db250ZXh0ICZDb250ZXh0KSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNJbnRlZ2VyKCkgJiYgIWlzVmVjdG9yKCkgJiYgIkludmFsaWQgaW50ZWdlciB0eXBlISIpOworICAgICAgdW5zaWduZWQgQml0V2lkdGggPSBnZXRTaXplSW5CaXRzKCk7CisgICAgICBpZiAoQml0V2lkdGggPD0gOCkKKyAgICAgICAgcmV0dXJuIEVWVChNVlQ6Omk4KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGdldEludGVnZXJWVChDb250ZXh0LCAxIDw8IExvZzJfMzJfQ2VpbChCaXRXaWR0aCkpOworICAgIH0KKworICAgIC8vLyBnZXRIYWxmU2l6ZWRJbnRlZ2VyVlQgLSBGaW5kcyB0aGUgc21hbGxlc3Qgc2ltcGxlIHZhbHVlIHR5cGUgdGhhdCBpcworICAgIC8vLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gaGFsZiB0aGUgd2lkdGggb2YgdGhpcyBFVlQuIElmIG5vIHNpbXBsZQorICAgIC8vLyB2YWx1ZSB0eXBlIGNhbiBiZSBmb3VuZCwgYW4gZXh0ZW5kZWQgaW50ZWdlciB2YWx1ZSB0eXBlIG9mIGhhbGYgdGhlCisgICAgLy8vIHNpemUgKHJvdW5kZWQgdXApIGlzIHJldHVybmVkLgorICAgIEVWVCBnZXRIYWxmU2l6ZWRJbnRlZ2VyVlQoTExWTUNvbnRleHQgJkNvbnRleHQpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc0ludGVnZXIoKSAmJiAhaXNWZWN0b3IoKSAmJiAiSW52YWxpZCBpbnRlZ2VyIHR5cGUhIik7CisgICAgICB1bnNpZ25lZCBFVlRTaXplID0gZ2V0U2l6ZUluQml0cygpOworICAgICAgZm9yICh1bnNpZ25lZCBJbnRWVCA9IE1WVDo6RklSU1RfSU5URUdFUl9WQUxVRVRZUEU7CisgICAgICAgICAgSW50VlQgPD0gTVZUOjpMQVNUX0lOVEVHRVJfVkFMVUVUWVBFOworICAgICAgICAgICsrSW50VlQpIHsKKyAgICAgICAgRVZUIEhhbGZWVCA9IEVWVCgoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpSW50VlQpOworICAgICAgICBpZihIYWxmVlQuZ2V0U2l6ZUluQml0cygpICogMiA+PSBFVlRTaXplKSB7IAorICAgICAgICAgIHJldHVybiBIYWxmVlQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBnZXRJbnRlZ2VyVlQoQ29udGV4dCwgKEVWVFNpemUgKyAxKSAvIDIpOworICAgIH0KKworICAgIC8vLyBpc1BvdzJWZWN0b3JUeXBlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2ZWN0b3IgaXMgYSBwb3dlciBvZiAyLgorICAgIGJvb2wgaXNQb3cyVmVjdG9yVHlwZSgpIGNvbnN0IHsKKyAgICAgIHVuc2lnbmVkIE5FbHRzID0gZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgIHJldHVybiAhKE5FbHRzICYgKE5FbHRzIC0gMSkpOworICAgIH0KKworICAgIC8vLyBnZXRQb3cyVmVjdG9yVHlwZSAtIFdpZGVucyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiB2ZWN0b3IgRVZUIHVwIHRvCisgICAgLy8vIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYW5kIHJldHVybnMgdGhhdCB0eXBlLgorICAgIEVWVCBnZXRQb3cyVmVjdG9yVHlwZShMTFZNQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICAgICAgaWYgKCFpc1BvdzJWZWN0b3JUeXBlKCkpIHsKKyAgICAgICAgdW5zaWduZWQgTkVsdHMgPSBnZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgICB1bnNpZ25lZCBQb3cyTkVsdHMgPSAxIDw8ICBMb2cyXzMyX0NlaWwoTkVsdHMpOworICAgICAgICByZXR1cm4gRVZUOjpnZXRWZWN0b3JWVChDb250ZXh0LCBnZXRWZWN0b3JFbGVtZW50VHlwZSgpLCBQb3cyTkVsdHMpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gZ2V0RVZUU3RyaW5nIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlIHR5cGUgYXMgYSBzdHJpbmcsCisgICAgLy8vIGUuZy4gImkzMiIuCisgICAgc3RkOjpzdHJpbmcgZ2V0RVZUU3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLy8gZ2V0VHlwZUZvckVWVCAtIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gTExWTSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgLy8vIHNwZWNpZmllZCBFVlQuICBGb3IgaW50ZWdlciB0eXBlcywgdGhpcyByZXR1cm5zIGFuIHVuc2lnbmVkIHR5cGUuICBOb3RlCisgICAgLy8vIHRoYXQgdGhpcyB3aWxsIGFib3J0IGZvciB0eXBlcyB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZC4KKyAgICBjb25zdCBUeXBlICpnZXRUeXBlRm9yRVZUKExMVk1Db250ZXh0ICZDb250ZXh0KSBjb25zdDsKKworICAgIC8vLyBnZXRFVlQgLSBSZXR1cm4gdGhlIHZhbHVlIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgLy8vIFRoaXMgcmV0dXJucyBhbGwgcG9pbnRlcnMgYXMgaVBUUi4gIElmIEhhbmRsZVVua25vd24gaXMgdHJ1ZSwgdW5rbm93bgorICAgIC8vLyB0eXBlcyBhcmUgcmV0dXJuZWQgYXMgT3RoZXIsIG90aGVyd2lzZSB0aGV5IGFyZSBpbnZhbGlkLgorICAgIHN0YXRpYyBFVlQgZ2V0RVZUKGNvbnN0IFR5cGUgKlR5LCBib29sIEhhbmRsZVVua25vd24gPSBmYWxzZSk7CisKKyAgICBpbnRwdHJfdCBnZXRSYXdCaXRzKCkgeworICAgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICAgIHJldHVybiBWLlNpbXBsZVR5OworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKGludHB0cl90KShMTFZNVHkpOworICAgIH0KKworICAgIC8vLyBjb21wYXJlUmF3Qml0cyAtIEEgbWVhbmluZ2xlc3MgYnV0IHdlbGwtYmVoYXZlZCBvcmRlciwgdXNlZnVsIGZvcgorICAgIC8vLyBjb25zdHJ1Y3RpbmcgY29udGFpbmVycy4KKyAgICBzdHJ1Y3QgY29tcGFyZVJhd0JpdHMgeworICAgICAgYm9vbCBvcGVyYXRvcigpKEVWVCBMLCBFVlQgUikgY29uc3QgeworICAgICAgICBpZiAoTC5WLlNpbXBsZVR5ID09IFIuVi5TaW1wbGVUeSkKKyAgICAgICAgICByZXR1cm4gTC5MTFZNVHkgPCBSLkxMVk1UeTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBMLlYuU2ltcGxlVHkgPCBSLlYuU2ltcGxlVHk7CisgICAgICB9CisgICAgfTsKKworICBwcml2YXRlOgorICAgIC8vIE1ldGhvZHMgZm9yIGhhbmRsaW5nIHRoZSBFeHRlbmRlZC10eXBlIGNhc2UgaW4gZnVuY3Rpb25zIGFib3ZlLgorICAgIC8vIFRoZXNlIGFyZSBhbGwgb3V0LW9mLWxpbmUgdG8gcHJldmVudCB1c2VycyBvZiB0aGlzIGhlYWRlciBmaWxlCisgICAgLy8gZnJvbSBoYXZpbmcgYSBkZXBlbmRlbmN5IG9uIFR5cGUuaC4KKyAgICBzdGF0aWMgRVZUIGdldEV4dGVuZGVkSW50ZWdlclZUKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBCaXRXaWR0aCk7CisgICAgc3RhdGljIEVWVCBnZXRFeHRlbmRlZFZlY3RvclZUKExMVk1Db250ZXh0ICZDLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUVsZW1lbnRzKTsKKyAgICBib29sIGlzRXh0ZW5kZWRGbG9hdGluZ1BvaW50KCkgY29uc3Q7CisgICAgYm9vbCBpc0V4dGVuZGVkSW50ZWdlcigpIGNvbnN0OworICAgIGJvb2wgaXNFeHRlbmRlZFZlY3RvcigpIGNvbnN0OworICAgIGJvb2wgaXNFeHRlbmRlZDY0Qml0VmVjdG9yKCkgY29uc3Q7CisgICAgYm9vbCBpc0V4dGVuZGVkMTI4Qml0VmVjdG9yKCkgY29uc3Q7CisgICAgYm9vbCBpc0V4dGVuZGVkMjU2Qml0VmVjdG9yKCkgY29uc3Q7CisgICAgYm9vbCBpc0V4dGVuZGVkNTEyQml0VmVjdG9yKCkgY29uc3Q7CisgICAgRVZUIGdldEV4dGVuZGVkVmVjdG9yRWxlbWVudFR5cGUoKSBjb25zdDsKKyAgICB1bnNpZ25lZCBnZXRFeHRlbmRlZFZlY3Rvck51bUVsZW1lbnRzKCkgY29uc3Q7CisgICAgdW5zaWduZWQgZ2V0RXh0ZW5kZWRTaXplSW5CaXRzKCkgY29uc3Q7CisgIH07CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy50ZCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmMzIzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMudGQKQEAgLTAsMCArMSw3NyBAQAorLy89PT0tIFZhbHVlVHlwZXMudGQgLSBWYWx1ZVR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFZhbHVlIHR5cGVzIC0gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHJlZ2lzdGVyIHR5cGVzIGRlZmluZWQgaW4gdGhlDQorLy8gVmFsdWVUeXBlcy5oIGZpbGUuICBJZiB5b3UgdXBkYXRlIGFueXRoaW5nIGhlcmUsIHlvdSBtdXN0IHVwZGF0ZSBpdCB0aGVyZSBhcw0KKy8vIHdlbGwhDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2NsYXNzIFZhbHVlVHlwZTxpbnQgc2l6ZSwgaW50IHZhbHVlPiB7DQorICBzdHJpbmcgTmFtZXNwYWNlID0gIk1WVCI7DQorICBpbnQgU2l6ZSA9IHNpemU7DQorICBpbnQgVmFsdWUgPSB2YWx1ZTsNCit9DQorDQorZGVmIE90aGVyVlQ6IFZhbHVlVHlwZTwwICAsICAwPjsgICAvLyAiT3RoZXIiIHZhbHVlDQorZGVmIGkxICAgICA6IFZhbHVlVHlwZTwxICAsICAxPjsgICAvLyBPbmUgYml0IGJvb2xlYW4gdmFsdWUNCitkZWYgaTggICAgIDogVmFsdWVUeXBlPDggICwgIDI+OyAgIC8vIDgtYml0IGludGVnZXIgdmFsdWUNCitkZWYgaTE2ICAgIDogVmFsdWVUeXBlPDE2ICwgIDM+OyAgIC8vIDE2LWJpdCBpbnRlZ2VyIHZhbHVlDQorZGVmIGkzMiAgICA6IFZhbHVlVHlwZTwzMiAsICA0PjsgICAvLyAzMi1iaXQgaW50ZWdlciB2YWx1ZQ0KK2RlZiBpNjQgICAgOiBWYWx1ZVR5cGU8NjQgLCAgNT47ICAgLy8gNjQtYml0IGludGVnZXIgdmFsdWUNCitkZWYgaTEyOCAgIDogVmFsdWVUeXBlPDEyOCwgIDY+OyAgIC8vIDEyOC1iaXQgaW50ZWdlciB2YWx1ZQ0KK2RlZiBmMzIgICAgOiBWYWx1ZVR5cGU8MzIgLCAgNz47ICAgLy8gMzItYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlDQorZGVmIGY2NCAgICA6IFZhbHVlVHlwZTw2NCAsICA4PjsgICAvLyA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUNCitkZWYgZjgwICAgIDogVmFsdWVUeXBlPDgwICwgIDk+OyAgIC8vIDgwLWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZQ0KK2RlZiBmMTI4ICAgOiBWYWx1ZVR5cGU8MTI4LCAxMD47ICAgLy8gMTI4LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZQ0KK2RlZiBwcGNmMTI4OiBWYWx1ZVR5cGU8MTI4LCAxMT47ICAgLy8gUFBDIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUNCisNCitkZWYgdjJpOCAgIDogVmFsdWVUeXBlPDE2ICwgMTI+OyAgIC8vICAyIHggaTggIHZlY3RvciB2YWx1ZQ0KK2RlZiB2NGk4ICAgOiBWYWx1ZVR5cGU8MzIgLCAxMz47ICAgLy8gIDQgeCBpOCAgdmVjdG9yIHZhbHVlDQorZGVmIHY4aTggICA6IFZhbHVlVHlwZTw2NCAsIDE0PjsgICAvLyAgOCB4IGk4ICB2ZWN0b3IgdmFsdWUNCitkZWYgdjE2aTggIDogVmFsdWVUeXBlPDEyOCwgMTU+OyAgIC8vIDE2IHggaTggIHZlY3RvciB2YWx1ZQ0KK2RlZiB2MzJpOCAgOiBWYWx1ZVR5cGU8MjU2LCAxNj47ICAgLy8gMzIgeCBpOCB2ZWN0b3IgdmFsdWUNCitkZWYgdjJpMTYgIDogVmFsdWVUeXBlPDMyICwgMTc+OyAgIC8vICAyIHggaTE2IHZlY3RvciB2YWx1ZQ0KK2RlZiB2NGkxNiAgOiBWYWx1ZVR5cGU8NjQgLCAxOD47ICAgLy8gIDQgeCBpMTYgdmVjdG9yIHZhbHVlDQorZGVmIHY4aTE2ICA6IFZhbHVlVHlwZTwxMjgsIDE5PjsgICAvLyAgOCB4IGkxNiB2ZWN0b3IgdmFsdWUNCitkZWYgdjE2aTE2IDogVmFsdWVUeXBlPDI1NiwgMjA+OyAgIC8vIDE2IHggaTE2IHZlY3RvciB2YWx1ZQ0KK2RlZiB2MmkzMiAgOiBWYWx1ZVR5cGU8NjQgLCAyMT47ICAgLy8gIDIgeCBpMzIgdmVjdG9yIHZhbHVlDQorZGVmIHY0aTMyICA6IFZhbHVlVHlwZTwxMjgsIDIyPjsgICAvLyAgNCB4IGkzMiB2ZWN0b3IgdmFsdWUNCitkZWYgdjhpMzIgIDogVmFsdWVUeXBlPDI1NiwgMjM+OyAgIC8vICA4IHggaTMyIHZlY3RvciB2YWx1ZQ0KK2RlZiB2MWk2NCAgOiBWYWx1ZVR5cGU8NjQgLCAyND47ICAgLy8gIDEgeCBpNjQgdmVjdG9yIHZhbHVlDQorZGVmIHYyaTY0ICA6IFZhbHVlVHlwZTwxMjgsIDI1PjsgICAvLyAgMiB4IGk2NCB2ZWN0b3IgdmFsdWUNCitkZWYgdjRpNjQgIDogVmFsdWVUeXBlPDI1NiwgMjY+OyAgIC8vICA0IHggZjY0IHZlY3RvciB2YWx1ZQ0KK2RlZiB2OGk2NCAgOiBWYWx1ZVR5cGU8NTEyLCAyNz47ICAgLy8gIDQgeCBmNjQgdmVjdG9yIHZhbHVlDQorDQorZGVmIHYyZjMyICA6IFZhbHVlVHlwZTw2NCwgIDI4PjsgICAvLyAgMiB4IGYzMiB2ZWN0b3IgdmFsdWUNCitkZWYgdjRmMzIgIDogVmFsdWVUeXBlPDEyOCwgMjk+OyAgIC8vICA0IHggZjMyIHZlY3RvciB2YWx1ZQ0KK2RlZiB2OGYzMiAgOiBWYWx1ZVR5cGU8MjU2LCAzMD47ICAgLy8gIDggeCBmMzIgdmVjdG9yIHZhbHVlDQorZGVmIHYyZjY0ICA6IFZhbHVlVHlwZTwxMjgsIDMxPjsgICAvLyAgMiB4IGY2NCB2ZWN0b3IgdmFsdWUNCitkZWYgdjRmNjQgIDogVmFsdWVUeXBlPDI1NiwgMzI+OyAgIC8vICA0IHggZjY0IHZlY3RvciB2YWx1ZQ0KKw0KK2RlZiBGbGFnVlQgOiBWYWx1ZVR5cGU8MCAgLCAzMz47ICAgLy8gUHJlLVJBIHNjaGVkIGdsdWUNCitkZWYgaXNWb2lkIDogVmFsdWVUeXBlPDAgICwgMzQ+OyAgIC8vIFByb2R1Y2VzIG5vIHZhbHVlDQorDQorZGVmIE1ldGFkYXRhVlQ6IFZhbHVlVHlwZTwwLCAyNTA+OyAvLyBNZXRhZGF0YQ0KKw0KKy8vIFBzZXVkbyB2YWx1ZXR5cGUgbWFwcGVkIHRvIHRoZSBjdXJyZW50IHBvaW50ZXIgc2l6ZSB0byBhbnkgYWRkcmVzcyBzcGFjZS4NCisvLyBTaG91bGQgb25seSBiZSB1c2VkIGluIFRhYmxlR2VuLg0KK2RlZiBpUFRSQW55ICAgOiBWYWx1ZVR5cGU8MCwgMjUxPjsNCisNCisvLyBQc2V1ZG8gdmFsdWV0eXBlIHRvIHJlcHJlc2VudCAidmVjdG9yIG9mIGFueSBzaXplIg0KK2RlZiB2QW55ICAgOiBWYWx1ZVR5cGU8MCAgLCAyNTI+Ow0KKw0KKy8vIFBzZXVkbyB2YWx1ZXR5cGUgdG8gcmVwcmVzZW50ICJmbG9hdCBvZiBhbnkgZm9ybWF0Ig0KK2RlZiBmQW55ICAgOiBWYWx1ZVR5cGU8MCAgLCAyNTM+Ow0KKw0KKy8vIFBzZXVkbyB2YWx1ZXR5cGUgdG8gcmVwcmVzZW50ICJpbnRlZ2VyIG9mIGFueSBiaXQgd2lkdGgiDQorZGVmIGlBbnkgICA6IFZhbHVlVHlwZTwwICAsIDI1ND47DQorDQorLy8gUHNldWRvIHZhbHVldHlwZSBtYXBwZWQgdG8gdGhlIGN1cnJlbnQgcG9pbnRlciBzaXplLg0KK2RlZiBpUFRSICAgOiBWYWx1ZVR5cGU8MCAgLCAyNTU+Ow0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9BY3Rpb24uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9BY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI3OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbXBpbGVyRHJpdmVyL0FjdGlvbi5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LS0tIEFjdGlvbi5oIC0gVGhlIExMVk0gQ29tcGlsZXIgRHJpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIEFjdGlvbiAtIGVuY2Fwc3VsYXRlcyBhIHNpbmdsZSBzaGVsbCBjb21tYW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTkNMVURFX0NPTVBJTEVSX0RSSVZFUl9BQ1RJT05fSAorI2RlZmluZSBMTFZNX0lOQ0xVREVfQ09NUElMRVJfRFJJVkVSX0FDVElPTl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bWMgeworCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFN0clZlY3RvcjsKKworICAvLy8gQWN0aW9uIC0gQSBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBhIHNpbmdsZSBzaGVsbCBjb21tYW5kLgorICBjbGFzcyBBY3Rpb24geworICAgIC8vLyBDb21tYW5kXyAtIFRoZSBhY3R1YWwgY29tbWFuZCAoZm9yIGV4YW1wbGUsICdscycpLgorICAgIHN0ZDo6c3RyaW5nIENvbW1hbmRfOworICAgIC8vLyBBcmdzXyAtIENvbW1hbmQgYXJndW1lbnRzLiBTdGRvdXQgcmVkaXJlY3Rpb24gKCI+IGZpbGUiKSBpcyBhbGxvd2VkLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcmdzXzsKKyAgICAvLy8gU3RvcENvbXBpbGF0aW9uXyAtIFNob3VsZCB3ZSBzdG9wIGNvbXBpbGF0aW9uIGFmdGVyIGV4ZWN1dGluZworICAgIC8vLyB0aGlzIGFjdGlvbj8KKyAgICBib29sIFN0b3BDb21waWxhdGlvbl87CisgICAgLy8vIE91dEZpbGVfIC0gVGhlIG91dHB1dCBmaWxlIG5hbWUuCisgICAgc3RkOjpzdHJpbmcgT3V0RmlsZV87CisKKyAgcHVibGljOgorICAgIHZvaWQgQ29uc3RydWN0IChjb25zdCBzdGQ6OnN0cmluZyYgQywgY29uc3QgU3RyVmVjdG9yJiBBLAorICAgICAgICAgICAgICAgICAgICBib29sIFMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBPKSB7CisgICAgICBDb21tYW5kXyA9IEM7CisgICAgICBBcmdzXyA9IEE7CisgICAgICBTdG9wQ29tcGlsYXRpb25fID0gUzsKKyAgICAgIE91dEZpbGVfID0gTzsKKyAgICB9CisgICAgYm9vbCBJc0NvbnN0cnVjdGVkICgpIHsgcmV0dXJuIChDb21tYW5kXy5zaXplKCkgIT0gMCk7fQorCisgICAgLy8vIEV4ZWN1dGUgLSBFeGVjdXRlcyB0aGUgY29tbWFuZC4gUmV0dXJucyAtMSBvbiBlcnJvci4KKyAgICBpbnQgRXhlY3V0ZSAoKSBjb25zdDsKKyAgICBib29sIFN0b3BDb21waWxhdGlvbiAoKSBjb25zdCB7IHJldHVybiBTdG9wQ29tcGlsYXRpb25fOyB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE91dEZpbGUoKSB7IHJldHVybiBPdXRGaWxlXzsgfQorICB9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX0lOQ0xVREVfQ09NUElMRVJfRFJJVkVSX0FDVElPTl9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29tcGlsZXJEcml2ZXIvQnVpbHRpbk9wdGlvbnMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9CdWlsdGluT3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWJiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29tcGlsZXJEcml2ZXIvQnVpbHRpbk9wdGlvbnMuaApAQCAtMCwwICsxLDM1IEBACisvLz09PS0tLSBCdWlsdGluT3B0aW9ucy5oIC0gVGhlIExMVk0gQ29tcGlsZXIgRHJpdmVyIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBEZWNsYXJhdGlvbnMgb2YgYWxsIGdsb2JhbCBjb21tYW5kLWxpbmUgb3B0aW9uIHZhcmlhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfQlVJTFRJTl9PUFRJT05TX0gKKyNkZWZpbmUgTExWTV9JTkNMVURFX0NPTVBJTEVSX0RSSVZFUl9CVUlMVElOX09QVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBTYXZlVGVtcHNFbnVtIHsgZW51bSBWYWx1ZXMgeyBDd2QsIE9iaiwgVW5zZXQgfTsgfQorCitleHRlcm4gbGx2bTo6Y2w6Omxpc3Q8c3RkOjpzdHJpbmc+IElucHV0RmlsZW5hbWVzOworZXh0ZXJuIGxsdm06OmNsOjpvcHQ8c3RkOjpzdHJpbmc+IE91dHB1dEZpbGVuYW1lOworZXh0ZXJuIGxsdm06OmNsOjpvcHQ8c3RkOjpzdHJpbmc+IFRlbXBEaXJuYW1lOworZXh0ZXJuIGxsdm06OmNsOjpsaXN0PHN0ZDo6c3RyaW5nPiBMYW5ndWFnZXM7CitleHRlcm4gbGx2bTo6Y2w6Om9wdDxib29sPiBEcnlSdW47CitleHRlcm4gbGx2bTo6Y2w6Om9wdDxib29sPiBUaW1lOworZXh0ZXJuIGxsdm06OmNsOjpvcHQ8Ym9vbD4gVmVyYm9zZU1vZGU7CitleHRlcm4gbGx2bTo6Y2w6Om9wdDxib29sPiBDaGVja0dyYXBoOworZXh0ZXJuIGxsdm06OmNsOjpvcHQ8Ym9vbD4gVmlld0dyYXBoOworZXh0ZXJuIGxsdm06OmNsOjpvcHQ8Ym9vbD4gV3JpdGVHcmFwaDsKK2V4dGVybiBsbHZtOjpjbDo6b3B0PFNhdmVUZW1wc0VudW06OlZhbHVlcz4gU2F2ZVRlbXBzOworCisjZW5kaWYgLy8gTExWTV9JTkNMVURFX0NPTVBJTEVSX0RSSVZFUl9CVUlMVElOX09QVElPTlNfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbXBpbGVyRHJpdmVyL0NvbW1vbi50ZCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9Db21tb24udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyN2FiNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9Db21tb24udGQKQEAgLTAsMCArMSwxNDggQEAKKy8vPT09LSBDb21tb24udGQgLSBDb21tb24gZGVmaW5pdGlvbnMgZm9yIExMVk1DMiAgLS0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBkZWZpbml0aW9ucyB1c2VkIGluIGxsdm1jIHRvb2wgZGVzY3JpcHRpb24gZmlsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgVG9vbDxsaXN0PGRhZz4gbD4geworICAgICAgbGlzdDxkYWc+IHByb3BlcnRpZXMgPSBsOworfQorCisvLyBQb3NzaWJsZSBUb29sIHByb3BlcnRpZXMuCisKK2RlZiBpbl9sYW5ndWFnZTsKK2RlZiBvdXRfbGFuZ3VhZ2U7CitkZWYgb3V0cHV0X3N1ZmZpeDsKK2RlZiBjb21tYW5kOworZGVmIG91dF9maWxlX29wdGlvbjsKK2RlZiBpbl9maWxlX29wdGlvbjsKK2RlZiBqb2luOworZGVmIHNpbms7CitkZWYgd29ya3Nfb25fZW1wdHk7CitkZWYgYWN0aW9uczsKKworLy8gUG9zc2libGUgb3B0aW9uIHR5cGVzLgorCitkZWYgYWxpYXNfb3B0aW9uOworZGVmIHN3aXRjaF9vcHRpb247CitkZWYgc3dpdGNoX2xpc3Rfb3B0aW9uOworZGVmIHBhcmFtZXRlcl9vcHRpb247CitkZWYgcGFyYW1ldGVyX2xpc3Rfb3B0aW9uOworZGVmIHByZWZpeF9vcHRpb247CitkZWYgcHJlZml4X2xpc3Rfb3B0aW9uOworCisvLyBQb3NzaWJsZSBvcHRpb24gcHJvcGVydGllcy4KKworZGVmIGV4dGVybjsKK2RlZiBoZWxwOworZGVmIGhpZGRlbjsKK2RlZiBpbml0OworZGVmIG11bHRpX3ZhbDsKK2RlZiBvbmVfb3JfbW9yZTsKK2RlZiB6ZXJvX29yX21vcmU7CitkZWYgb3B0aW9uYWw7CitkZWYgcmVhbGx5X2hpZGRlbjsKK2RlZiByZXF1aXJlZDsKK2RlZiBjb21tYV9zZXBhcmF0ZWQ7CitkZWYgZm9yd2FyZF9ub3Rfc3BsaXQ7CisKKy8vIFRoZSAnY2FzZScgY29uc3RydWN0LgorZGVmIGNhc2U7CisKKy8vIEJvb2xlYW4gY29uc3RhbnRzLgorZGVmIHRydWU7CitkZWYgZmFsc2U7CisKKy8vIEJvb2xlYW4gb3BlcmF0b3JzLgorZGVmIGFuZDsKK2RlZiBvcjsKK2RlZiBub3Q7CisKKy8vIFByaW1pdGl2ZSB0ZXN0cy4KK2RlZiBzd2l0Y2hfb247CitkZWYgcGFyYW1ldGVyX2VxdWFsczsKK2RlZiBlbGVtZW50X2luX2xpc3Q7CitkZWYgaW5wdXRfbGFuZ3VhZ2VzX2NvbnRhaW47CitkZWYgZW1wdHk7CitkZWYgbm90X2VtcHR5OworZGVmIGRlZmF1bHQ7CitkZWYgc2luZ2xlX2lucHV0X2ZpbGU7CitkZWYgbXVsdGlwbGVfaW5wdXRfZmlsZXM7CitkZWYgYW55X3N3aXRjaF9vbjsKK2RlZiBhbnlfbm90X2VtcHR5OworZGVmIGFueV9lbXB0eTsKKworLy8gUG9zc2libGUgYWN0aW9ucy4KKworZGVmIGFwcGVuZF9jbWQ7CitkZWYgZm9yd2FyZDsKK2RlZiBmb3J3YXJkX2FzOworZGVmIGZvcndhcmRfdmFsdWU7CitkZWYgZm9yd2FyZF90cmFuc2Zvcm1lZF92YWx1ZTsKK2RlZiBzdG9wX2NvbXBpbGF0aW9uOworZGVmIG5vX291dF9maWxlOworZGVmIHVucGFja192YWx1ZXM7CitkZWYgd2FybmluZzsKK2RlZiBlcnJvcjsKK2RlZiBzZXRfb3B0aW9uOworZGVmIHVuc2V0X29wdGlvbjsKKworLy8gSW5jcmVhc2UvZGVjcmVhc2UgdGhlIGVkZ2Ugd2VpZ2h0LgorZGVmIGluY193ZWlnaHQ7CitkZWYgZGVjX3dlaWdodDsKKworLy8gRW1wdHkgREFHIG1hcmtlci4KK2RlZiBlbXB0eV9kYWdfbWFya2VyOworCisvLyBVc2VkIHRvIHNwZWNpZnkgcGx1Z2luIHByaW9yaXR5LgorY2xhc3MgUGx1Z2luUHJpb3JpdHk8aW50IHA+IHsKKyAgICAgIGludCBwcmlvcml0eSA9IHA7Cit9CisKKy8vIE9wdGlvbiBsaXN0IC0gYSBzaW5nbGUgcGxhY2UgdG8gc3BlY2lmeSBvcHRpb25zLgorY2xhc3MgT3B0aW9uTGlzdDxsaXN0PGRhZz4gbD4geworICAgICAgbGlzdDxkYWc+IG9wdGlvbnMgPSBsOworfQorCisvLyBPcHRpb24gcHJlcHJvY2Vzc29yIC0gYWN0aW9ucyB0YWtlbiBkdXJpbmcgcGx1Z2luIGxvYWRpbmcuCitjbGFzcyBPcHRpb25QcmVwcm9jZXNzb3I8ZGFnIGQ+IHsKKyAgICAgIGRhZyBwcmVwcm9jZXNzb3IgPSBkOworfQorCisvLyBNYXAgZnJvbSBzdWZmaXhlcyB0byBsYW5ndWFnZSBuYW1lcworCitjbGFzcyBMYW5nVG9TdWZmaXhlczxzdHJpbmcgc3RyLCBsaXN0PHN0cmluZz4gbHN0PiB7CisgICAgICBzdHJpbmcgbGFuZyA9IHN0cjsKKyAgICAgIGxpc3Q8c3RyaW5nPiBzdWZmaXhlcyA9IGxzdDsKK30KKworY2xhc3MgTGFuZ3VhZ2VNYXA8bGlzdDxMYW5nVG9TdWZmaXhlcz4gbHN0PiB7CisgICAgICBsaXN0PExhbmdUb1N1ZmZpeGVzPiBtYXAgPSBsc3Q7Cit9CisKKy8vIENvbXBpbGF0aW9uIGdyYXBoCisKK2NsYXNzIEVkZ2VCYXNlPHN0cmluZyB0MSwgc3RyaW5nIHQyLCBkYWcgZD4geworICAgICAgc3RyaW5nIGEgPSB0MTsKKyAgICAgIHN0cmluZyBiID0gdDI7CisgICAgICBkYWcgd2VpZ2h0ID0gZDsKK30KKworY2xhc3MgRWRnZTxzdHJpbmcgdDEsIHN0cmluZyB0Mj4gOiBFZGdlQmFzZTx0MSwgdDIsIChlbXB0eV9kYWdfbWFya2VyKT47CisKKy8vIEVkZ2UgYW5kIFNpbXBsZUVkZ2UgYXJlIHN5bm9ueW1zLgorY2xhc3MgU2ltcGxlRWRnZTxzdHJpbmcgdDEsIHN0cmluZyB0Mj4gOiBFZGdlQmFzZTx0MSwgdDIsIChlbXB0eV9kYWdfbWFya2VyKT47CisKKy8vIE9wdGlvbmFsbHkgZW5hYmxlZCBlZGdlLgorY2xhc3MgT3B0aW9uYWxFZGdlPHN0cmluZyB0MSwgc3RyaW5nIHQyLCBkYWcgcHJvcHM+IDogRWRnZUJhc2U8dDEsIHQyLCBwcm9wcz47CisKK2NsYXNzIENvbXBpbGF0aW9uR3JhcGg8bGlzdDxFZGdlQmFzZT4gbHN0PiB7CisgICAgICBsaXN0PEVkZ2VCYXNlPiBlZGdlcyA9IGxzdDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9Db21waWxhdGlvbkdyYXBoLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29tcGlsZXJEcml2ZXIvQ29tcGlsYXRpb25HcmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjBjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29tcGlsZXJEcml2ZXIvQ29tcGlsYXRpb25HcmFwaC5oCkBAIC0wLDAgKzEsMzMwIEBACisvLz09PS0tLSBDb21waWxhdGlvbkdyYXBoLmggLSBUaGUgTExWTSBDb21waWxlciBEcml2ZXIgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBDb21waWxhdGlvbiBncmFwaCAtIGRlZmluaXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lOQ0xVREVfQ09NUElMRVJfRFJJVkVSX0NPTVBJTEFUSU9OX0dSQVBIX0gKKyNkZWZpbmUgTExWTV9JTkNMVURFX0NPTVBJTEVSX0RSSVZFUl9DT01QSUxBVElPTl9HUkFQSF9ICisKKyNpbmNsdWRlICJsbHZtL0NvbXBpbGVyRHJpdmVyL1Rvb2wuaCIKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9QYXRoLmgiCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm1jIHsKKworICBjbGFzcyBDb21waWxhdGlvbkdyYXBoOworICB0eXBlZGVmIGxsdm06OlN0cmluZ1NldDw+IElucHV0TGFuZ3VhZ2VzU2V0OworCisgIC8vLyBMYW5ndWFnZU1hcCAtIE1hcHMgZnJvbSBleHRlbnNpb25zIHRvIGxhbmd1YWdlIG5hbWVzLgorICBjbGFzcyBMYW5ndWFnZU1hcCA6IHB1YmxpYyBsbHZtOjpTdHJpbmdNYXA8c3RkOjpzdHJpbmc+IHsKKyAgcHVibGljOgorCisgICAgLy8vIEdldExhbmd1YWdlIC0gIEZpbmQgdGhlIGxhbmd1YWdlIG5hbWUgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGZpbGUuCisgICAgY29uc3Qgc3RkOjpzdHJpbmcqIEdldExhbmd1YWdlKGNvbnN0IGxsdm06OnN5czo6UGF0aCYpIGNvbnN0OworICB9OworCisgIC8vLyBFZGdlIC0gUmVwcmVzZW50cyBhbiBlZGdlIG9mIHRoZSBjb21waWxhdGlvbiBncmFwaC4KKyAgY2xhc3MgRWRnZSA6IHB1YmxpYyBsbHZtOjpSZWZDb3VudGVkQmFzZVZQVFI8RWRnZT4geworICBwdWJsaWM6CisgICAgRWRnZShjb25zdCBzdGQ6OnN0cmluZyYgVCkgOiBUb29sTmFtZV8oVCkge30KKyAgICB2aXJ0dWFsIH5FZGdlKCkge30KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBUb29sTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFRvb2xOYW1lXzsgfQorICAgIHZpcnR1YWwgdW5zaWduZWQgV2VpZ2h0KGNvbnN0IElucHV0TGFuZ3VhZ2VzU2V0JiBJbkxhbmdzKSBjb25zdCA9IDA7CisgIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgVG9vbE5hbWVfOworICB9OworCisgIC8vLyBTaW1wbGVFZGdlIC0gQW4gZWRnZSB0aGF0IGhhcyBubyBwcm9wZXJ0aWVzLgorICBjbGFzcyBTaW1wbGVFZGdlIDogcHVibGljIEVkZ2UgeworICBwdWJsaWM6CisgICAgU2ltcGxlRWRnZShjb25zdCBzdGQ6OnN0cmluZyYgVCkgOiBFZGdlKFQpIHt9CisgICAgdW5zaWduZWQgV2VpZ2h0KGNvbnN0IElucHV0TGFuZ3VhZ2VzU2V0JikgY29uc3QgeyByZXR1cm4gMTsgfQorICB9OworCisgIC8vLyBOb2RlIC0gQSBub2RlICh2ZXJ0ZXgpIG9mIHRoZSBjb21waWxhdGlvbiBncmFwaC4KKyAgc3RydWN0IE5vZGUgeworICAgIC8vIEEgTm9kZSBob2xkcyBhIGxpc3Qgb2YgdGhlIG91dHdhcmQgZWRnZXMuCisgICAgdHlwZWRlZiBsbHZtOjpTbWFsbFZlY3RvcjxsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8RWRnZT4sIDM+IGNvbnRhaW5lcl90eXBlOworICAgIHR5cGVkZWYgY29udGFpbmVyX3R5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgY29udGFpbmVyX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgTm9kZSgpIDogT3duaW5nR3JhcGgoMCksIEluRWRnZXMoMCkge30KKyAgICBOb2RlKENvbXBpbGF0aW9uR3JhcGgqIEcpIDogT3duaW5nR3JhcGgoRyksIEluRWRnZXMoMCkge30KKyAgICBOb2RlKENvbXBpbGF0aW9uR3JhcGgqIEcsIFRvb2wqIFQpIDoKKyAgICAgIE93bmluZ0dyYXBoKEcpLCBUb29sUHRyKFQpLCBJbkVkZ2VzKDApIHt9CisKKyAgICBib29sIEhhc0NoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gIU91dEVkZ2VzLmVtcHR5KCk7IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBOYW1lKCkgY29uc3QKKyAgICB7IHJldHVybiBUb29sUHRyID8gVG9vbFB0ci0+TmFtZSgpIDogInJvb3QiOyB9CisKKyAgICAvLyBJdGVyYXRpb24uCisgICAgaXRlcmF0b3IgRWRnZXNCZWdpbigpIHsgcmV0dXJuIE91dEVkZ2VzLmJlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBFZGdlc0JlZ2luKCkgY29uc3QgeyByZXR1cm4gT3V0RWRnZXMuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIEVkZ2VzRW5kKCkgeyByZXR1cm4gT3V0RWRnZXMuZW5kKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBFZGdlc0VuZCgpIGNvbnN0IHsgcmV0dXJuIE91dEVkZ2VzLmVuZCgpOyB9CisKKyAgICAvLy8gQWRkRWRnZSAtIEFkZCBhbiBvdXR3YXJkIGVkZ2UuIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgcHJvdmlkZWQKKyAgICAvLy8gRWRnZSBvYmplY3QuCisgICAgdm9pZCBBZGRFZGdlKEVkZ2UqIEUpOworCisgICAgLy8gSW53YXJkIGVkZ2UgY291bnRlci4gVXNlZCB0byBpbXBsZW1lbnQgdG9wb2xvZ2ljYWwgc29ydC4KKyAgICB2b2lkIEluY3JJbkVkZ2VzKCkgeyArK0luRWRnZXM7IH0KKyAgICB2b2lkIERlY3JJbkVkZ2VzKCkgeyAtLUluRWRnZXM7IH0KKyAgICBib29sIEhhc05vSW5FZGdlcygpIGNvbnN0IHsgcmV0dXJuIEluRWRnZXMgPT0gMDsgfQorCisgICAgLy8gTmVlZGVkIHRvIGltcGxlbWVudCBOb2RlQ2hpbGRJdGVyYXRvci9HcmFwaFRyYWl0cworICAgIENvbXBpbGF0aW9uR3JhcGgqIE93bmluZ0dyYXBoOworICAgIC8vIFRoZSBjb3JyZXNwb25kaW5nIFRvb2wuCisgICAgLy8gV0FSTklORzogVG9vbFB0ciBjYW4gYmUgTlVMTCAoZm9yIHRoZSByb290IG5vZGUpLgorICAgIGxsdm06OkludHJ1c2l2ZVJlZkNudFB0cjxUb29sPiBUb29sUHRyOworICAgIC8vIExpbmtzIHRvIGNoaWxkcmVuLgorICAgIGNvbnRhaW5lcl90eXBlIE91dEVkZ2VzOworICAgIC8vIElud2FyZCBlZGdlIGNvdW50ZXIuIFVwZGF0ZWQgaW4KKyAgICAvLyBDb21waWxhdGlvbkdyYXBoOjppbnNlcnRFZGdlKCkuIFVzZWQgZm9yIHRvcG9sb2dpY2FsIHNvcnRpbmcuCisgICAgdW5zaWduZWQgSW5FZGdlczsKKyAgfTsKKworICBjbGFzcyBOb2Rlc0l0ZXJhdG9yOworCisgIC8vLyBDb21waWxhdGlvbkdyYXBoIC0gVGhlIGNvbXBpbGF0aW9uIGdyYXBoIGl0c2VsZi4KKyAgY2xhc3MgQ29tcGlsYXRpb25HcmFwaCB7CisgICAgLy8vIG5vZGVzX21hcF90eXBlIC0gVGhlIG1haW4gZGF0YSBzdHJ1Y3R1cmUuCisgICAgdHlwZWRlZiBsbHZtOjpTdHJpbmdNYXA8Tm9kZT4gbm9kZXNfbWFwX3R5cGU7CisgICAgLy8vIHRvb2xzX3ZlY3Rvcl90eXBlLCB0b29sc19tYXBfdHlwZSAtIERhdGEgc3RydWN0dXJlcyB1c2VkIHRvCisgICAgLy8vIG1hcCBmcm9tIGxhbmd1YWdlIG5hbWVzIHRvIHRvb2xzLiAoV2UgY2FuIGhhdmUgc2V2ZXJhbCB0b29scworICAgIC8vLyBhc3NvY2lhdGVkIHdpdGggZWFjaCBsYW5ndWFnZSBuYW1lLCBoZW5jZSB0aGUgbmVlZCBmb3IgYQorICAgIC8vLyB2ZWN0b3IuKQorICAgIHR5cGVkZWYKKyAgICBsbHZtOjpTbWFsbFZlY3RvcjxsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8RWRnZT4sIDM+IHRvb2xzX3ZlY3Rvcl90eXBlOworICAgIHR5cGVkZWYgbGx2bTo6U3RyaW5nTWFwPHRvb2xzX3ZlY3Rvcl90eXBlPiB0b29sc19tYXBfdHlwZTsKKworICAgIC8vLyBUb29sc01hcCAtIE1hcCBmcm9tIGxhbmd1YWdlIG5hbWVzIHRvIGxpc3RzIG9mIHRvb2wgbmFtZXMuCisgICAgdG9vbHNfbWFwX3R5cGUgVG9vbHNNYXA7CisgICAgLy8vIE5vZGVzTWFwIC0gTWFwIGZyb20gdG9vbCBuYW1lcyB0byBUb29sIG9iamVjdHMuCisgICAgbm9kZXNfbWFwX3R5cGUgTm9kZXNNYXA7CisKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBub2Rlc19tYXBfdHlwZTo6aXRlcmF0b3Igbm9kZXNfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBub2Rlc19tYXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3Rfbm9kZXNfaXRlcmF0b3I7CisKKyAgICBDb21waWxhdGlvbkdyYXBoKCk7CisKKyAgICAvLy8gaW5zZXJ0Tm9kZSAtIEluc2VydCBhIG5ldyBub2RlIGludG8gdGhlIGdyYXBoLiBUYWtlcworICAgIC8vLyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdC4KKyAgICB2b2lkIGluc2VydE5vZGUoVG9vbCogVCk7CisKKyAgICAvLy8gaW5zZXJ0RWRnZSAtIEluc2VydCBhIG5ldyBlZGdlIGludG8gdGhlIGdyYXBoLiBUYWtlcyBvd25lcnNoaXAKKyAgICAvLy8gb2YgdGhlIEVkZ2Ugb2JqZWN0LiBSZXR1cm5zIG5vbi16ZXJvIHZhbHVlIG9uIGVycm9yLgorICAgIGludCBpbnNlcnRFZGdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBBLCBFZGdlKiBFKTsKKworICAgIC8vLyBCdWlsZCAtIEJ1aWxkIHRhcmdldChzKSBmcm9tIHRoZSBpbnB1dCBmaWxlIHNldC4gQ29tbWFuZC1saW5lIG9wdGlvbnMKKyAgICAvLy8gYXJlIHBhc3NlZCBpbXBsaWNpdGx5IGFzIGdsb2JhbCB2YXJpYWJsZXMuIFJldHVybnMgbm9uLXplcm8gdmFsdWUgb24KKyAgICAvLy8gZXJyb3IgKHVzdWFsbHkgdGhlIGZhaWxlZCBwcm9ncmFtJ3MgZXhpdCBjb2RlKS4KKyAgICBpbnQgQnVpbGQobGx2bTo6c3lzOjpQYXRoIGNvbnN0JiBUZW1wRGlyLCBjb25zdCBMYW5ndWFnZU1hcCYgTGFuZ01hcCk7CisKKyAgICAvLy8gQ2hlY2sgLSBDaGVjayB0aGUgY29tcGlsYXRpb24gZ3JhcGggZm9yIGNvbW1vbiBlcnJvcnMgbGlrZSBjeWNsZXMsCisgICAgLy8vIGlucHV0L291dHB1dCBsYW5ndWFnZSBtaXNtYXRjaCBhbmQgbXVsdGlwbGUgZGVmYXVsdCBlZGdlcy4gUHJpbnRzIGVycm9yCisgICAgLy8vIG1lc3NhZ2VzIGFuZCBpbiBjYXNlIGl0IGZpbmRzIGFueSBlcnJvcnMuCisgICAgaW50IENoZWNrKCk7CisKKyAgICAvLy8gZ2V0Tm9kZSAtIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB0b29sCisgICAgLy8vIG5hbWUuIFJldHVybnMgMCBvbiBlcnJvci4KKyAgICBOb2RlKiBnZXROb2RlKGNvbnN0IHN0ZDo6c3RyaW5nJiBUb29sTmFtZSk7CisgICAgY29uc3QgTm9kZSogZ2V0Tm9kZShjb25zdCBzdGQ6OnN0cmluZyYgVG9vbE5hbWUpIGNvbnN0OworCisgICAgLy8vIHZpZXdHcmFwaCAtIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIHVzZSBmcm9tIHRoZSBkZWJ1Z2dlci4gWW91IGNhbgorICAgIC8vLyBqdXN0IHNheSAnY2FsbCBHLT52aWV3R3JhcGgoKScgYW5kIGEgZ2hvc3R2aWV3IHdpbmRvdyBzaG91bGQgcG9wIHVwIGZyb20KKyAgICAvLy8gdGhlIHByb2dyYW0sIGRpc3BsYXlpbmcgdGhlIGNvbXBpbGF0aW9uIGdyYXBoLiBUaGlzIGRlcGVuZHMgb24gdGhlcmUKKyAgICAvLy8gYmVpbmcgYSAnZG90JyBhbmQgJ2d2JyBwcm9ncmFtIGluIHlvdXIgcGF0aC4KKyAgICB2b2lkIHZpZXdHcmFwaCgpOworCisgICAgLy8vIHdyaXRlR3JhcGggLSBXcml0ZSBHcmFwaHZpeiAuZG90IHNvdXJjZSBmaWxlIHRvIHRoZSBjdXJyZW50IGRpcmVjb3RyeS4KKyAgICBpbnQgd3JpdGVHcmFwaChjb25zdCBzdGQ6OnN0cmluZyYgT3V0cHV0RmlsZW5hbWUpOworCisgICAgLy8gR3JhcGhUcmFpdHMgc3VwcG9ydC4KKyAgICBmcmllbmQgTm9kZXNJdGVyYXRvciBHcmFwaEJlZ2luKENvbXBpbGF0aW9uR3JhcGgqKTsKKyAgICBmcmllbmQgTm9kZXNJdGVyYXRvciBHcmFwaEVuZChDb21waWxhdGlvbkdyYXBoKik7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb25zLgorCisgICAgLy8vIGdldFRvb2xzVmVjdG9yIC0gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXN0IG9mIHRvb2wgbmFtZXMKKyAgICAvLy8gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbmFtZS4gUmV0dXJucyAwIG9uIGVycm9yLgorICAgIGNvbnN0IHRvb2xzX3ZlY3Rvcl90eXBlKiBnZXRUb29sc1ZlY3Rvcihjb25zdCBzdGQ6OnN0cmluZyYgTGFuZ05hbWUpIGNvbnN0OworCisgICAgLy8vIFBhc3NUaHJvdWdoR3JhcGggLSBQYXNzIHRoZSBpbnB1dCBmaWxlIHRocm91Z2ggdGhlIHRvb2xjaGFpbiBzdGFydGluZyBhdAorICAgIC8vLyBTdGFydE5vZGUuCisgICAgaW50IFBhc3NUaHJvdWdoR3JhcGggKGNvbnN0IGxsdm06OnN5czo6UGF0aCYgSW4sIGNvbnN0IE5vZGUqIFN0YXJ0Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRMYW5ndWFnZXNTZXQmIEluTGFuZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OnN5czo6UGF0aCYgVGVtcERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ3VhZ2VNYXAmIExhbmdNYXApIGNvbnN0OworCisgICAgLy8vIEZpbmRUb29sQ2hhaW4gLSBGaW5kIGhlYWQgb2YgdGhlIHRvb2xjaGFpbiBjb3JyZXNwb25kaW5nIHRvCisgICAgLy8vIHRoZSBnaXZlbiBmaWxlLgorICAgIGNvbnN0IE5vZGUqIEZpbmRUb29sQ2hhaW4oY29uc3QgbGx2bTo6c3lzOjpQYXRoJiBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBGb3JjZUxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRMYW5ndWFnZXNTZXQmIEluTGFuZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5ndWFnZU1hcCYgTGFuZ01hcCkgY29uc3Q7CisKKyAgICAvLy8gQnVpbGRJbml0aWFsIC0gVHJhdmVyc2UgdGhlIGluaXRpYWwgcGFydHMgb2YgdGhlIHRvb2xjaGFpbnMuIFJldHVybnMKKyAgICAvLy8gbm9uLXplcm8gdmFsdWUgb24gZXJyb3IuCisgICAgaW50IEJ1aWxkSW5pdGlhbChJbnB1dExhbmd1YWdlc1NldCYgSW5MYW5ncywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OnN5czo6UGF0aCYgVGVtcERpciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmd1YWdlTWFwJiBMYW5nTWFwKTsKKworICAgIC8vLyBUb3BvbG9naWNhbFNvcnQgLSBTb3J0IHRoZSBub2RlcyBpbiB0b3BvbG9naWNhbCBvcmRlci4gUmV0dXJucyBub24temVybworICAgIC8vLyB2YWx1ZSBvbiBlcnJvci4KKyAgICBpbnQgVG9wb2xvZ2ljYWxTb3J0KHN0ZDo6dmVjdG9yPGNvbnN0IE5vZGUqPiYgT3V0KTsKKyAgICAvLy8gVG9wb2xvZ2ljYWxTb3J0RmlsdGVySm9pbk5vZGVzIC0gQ2FsbCBUb3BvbG9naWNhbFNvcnQgYW5kIGZpbHRlciB0aGUKKyAgICAvLy8gcmVzdWx0aW5nIGxpc3QgdG8gaW5jbHVkZSBvbmx5IEpvaW4gbm9kZXMuIFJldHVybnMgbm9uLXplcm8gdmFsdWUgb24KKyAgICAvLy8gZXJyb3IuCisgICAgaW50IFRvcG9sb2dpY2FsU29ydEZpbHRlckpvaW5Ob2RlcyhzdGQ6OnZlY3Rvcjxjb25zdCBOb2RlKj4mIE91dCk7CisKKyAgICAvLyBGdW5jdGlvbnMgdXNlZCB0byBpbXBsZW1lbnQgQ2hlY2soKS4KKworICAgIC8vLyBDaGVja0xhbmd1YWdlTmFtZXMgLSBDaGVjayB0aGF0IG91dHB1dC9pbnB1dCBsYW5ndWFnZSBuYW1lcyBtYXRjaCBmb3IKKyAgICAvLy8gYWxsIG5vZGVzLiBSZXR1cm5zIG5vbi16ZXJvIHZhbHVlIG9uIGVycm9yIChudW1iZXIgb2YgZXJyb3JzCisgICAgLy8vIGVuY291bnRlcmVkKS4KKyAgICBpbnQgQ2hlY2tMYW5ndWFnZU5hbWVzKCkgY29uc3Q7CisgICAgLy8vIENoZWNrTXVsdGlwbGVEZWZhdWx0RWRnZXMgLSBjaGVjayB0aGF0IHRoZXJlIGFyZSBubyBtdWx0aXBsZSBkZWZhdWx0CisgICAgLy8vIGRlZmF1bHQgZWRnZXMuIFJldHVybnMgbm9uLXplcm8gdmFsdWUgb24gZXJyb3IgKG51bWJlciBvZiBlcnJvcnMKKyAgICAvLy8gZW5jb3VudGVyZWQpLgorICAgIGludCBDaGVja011bHRpcGxlRGVmYXVsdEVkZ2VzKCkgY29uc3Q7CisgICAgLy8vIENoZWNrQ3ljbGVzIC0gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gY3ljbGVzIGluIHRoZSBncmFwaC4gUmV0dXJucworICAgIC8vLyBub24temVybyB2YWx1ZSBvbiBlcnJvciAobnVtYmVyIG9mIGVycm9ycyBlbmNvdW50ZXJlZCkuCisgICAgaW50IENoZWNrQ3ljbGVzKCk7CisKKyAgfTsKKworICAvLyBHcmFwaFRyYWl0cyBzdXBwb3J0IGNvZGUuCisKKyAgLy8vIE5vZGVzSXRlcmF0b3IgLSBBdXhpbGlhcnkgY2xhc3MgbmVlZGVkIHRvIGltcGxlbWVudCBHcmFwaFRyYWl0cworICAvLy8gc3VwcG9ydC4gQ2FuIGJlIGdlbmVyYWxpc2VkIHRvIHNvbWV0aGluZyBsaWtlIHZhbHVlX2l0ZXJhdG9yCisgIC8vLyBmb3IgbWFwLWxpa2UgY29udGFpbmVycy4KKyAgY2xhc3MgTm9kZXNJdGVyYXRvciA6IHB1YmxpYyBDb21waWxhdGlvbkdyYXBoOjpub2Rlc19pdGVyYXRvciB7CisgICAgdHlwZWRlZiBDb21waWxhdGlvbkdyYXBoOjpub2Rlc19pdGVyYXRvciBzdXBlcjsKKyAgICB0eXBlZGVmIE5vZGVzSXRlcmF0b3IgVGhpc1R5cGU7CisgICAgdHlwZWRlZiBOb2RlKiBwb2ludGVyOworICAgIHR5cGVkZWYgTm9kZSYgcmVmZXJlbmNlOworCisgIHB1YmxpYzoKKyAgICBOb2Rlc0l0ZXJhdG9yKHN1cGVyIEkpIDogc3VwZXIoSSkge30KKworICAgIGlubGluZSByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgcmV0dXJuIHN1cGVyOjpvcGVyYXRvci0+KCktPnNlY29uZDsKKyAgICB9CisgICAgaW5saW5lIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAmc3VwZXI6Om9wZXJhdG9yLT4oKS0+c2Vjb25kOworICAgIH0KKyAgfTsKKworICBpbmxpbmUgTm9kZXNJdGVyYXRvciBHcmFwaEJlZ2luKENvbXBpbGF0aW9uR3JhcGgqIEcpIHsKKyAgICByZXR1cm4gTm9kZXNJdGVyYXRvcihHLT5Ob2Rlc01hcC5iZWdpbigpKTsKKyAgfQorCisgIGlubGluZSBOb2Rlc0l0ZXJhdG9yIEdyYXBoRW5kKENvbXBpbGF0aW9uR3JhcGgqIEcpIHsKKyAgICByZXR1cm4gTm9kZXNJdGVyYXRvcihHLT5Ob2Rlc01hcC5lbmQoKSk7CisgIH0KKworCisgIC8vLyBOb2RlQ2hpbGRJdGVyYXRvciAtIEFub3RoZXIgYXV4aWxpYXJ5IGNsYXNzIG5lZWRlZCBieSBHcmFwaFRyYWl0cy4KKyAgY2xhc3MgTm9kZUNoaWxkSXRlcmF0b3IgOiBwdWJsaWMKKyAgICAgICAgICAgICAgIHN0ZDo6aXRlcmF0b3I8c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgTm9kZSwgcHRyZGlmZl90PiB7CisgICAgdHlwZWRlZiBOb2RlQ2hpbGRJdGVyYXRvciBUaGlzVHlwZTsKKyAgICB0eXBlZGVmIE5vZGU6OmNvbnRhaW5lcl90eXBlOjppdGVyYXRvciBpdGVyYXRvcjsKKworICAgIENvbXBpbGF0aW9uR3JhcGgqIE93bmluZ0dyYXBoOworICAgIGl0ZXJhdG9yIEVkZ2VJdGVyOworICBwdWJsaWM6CisgICAgdHlwZWRlZiBOb2RlKiBwb2ludGVyOworICAgIHR5cGVkZWYgTm9kZSYgcmVmZXJlbmNlOworCisgICAgTm9kZUNoaWxkSXRlcmF0b3IoTm9kZSogTiwgaXRlcmF0b3IgSSkgOgorICAgICAgT3duaW5nR3JhcGgoTi0+T3duaW5nR3JhcGgpLCBFZGdlSXRlcihJKSB7fQorCisgICAgY29uc3QgVGhpc1R5cGUmIG9wZXJhdG9yPShjb25zdCBUaGlzVHlwZSYgSSkgeworICAgICAgYXNzZXJ0KE93bmluZ0dyYXBoID09IEkuT3duaW5nR3JhcGgpOworICAgICAgRWRnZUl0ZXIgPSBJLkVkZ2VJdGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVGhpc1R5cGUmIEkpIGNvbnN0IHsKKyAgICAgIGFzc2VydChPd25pbmdHcmFwaCA9PSBJLk93bmluZ0dyYXBoKTsKKyAgICAgIHJldHVybiBFZGdlSXRlciA9PSBJLkVkZ2VJdGVyOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRoaXNUeXBlJiBJKSBjb25zdCB7CisgICAgICByZXR1cm4gIXRoaXMtPm9wZXJhdG9yPT0oSSk7CisgICAgfQorCisgICAgaW5saW5lIHBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgcmV0dXJuIE93bmluZ0dyYXBoLT5nZXROb2RlKCgqRWRnZUl0ZXIpLT5Ub29sTmFtZSgpKTsKKyAgICB9CisgICAgaW5saW5lIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0aGlzLT5vcGVyYXRvciooKTsKKyAgICB9CisKKyAgICBUaGlzVHlwZSYgb3BlcmF0b3IrKygpIHsgKytFZGdlSXRlcjsgcmV0dXJuICp0aGlzOyB9IC8vIFByZWluY3JlbWVudAorICAgIFRoaXNUeXBlIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIFRoaXNUeXBlIHRtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgaW5saW5lIFRoaXNUeXBlJiBvcGVyYXRvci0tKCkgeyAtLUVkZ2VJdGVyOyByZXR1cm4gKnRoaXM7IH0gIC8vIFByZWRlY3JlbWVudAorICAgIGlubGluZSBUaGlzVHlwZSBvcGVyYXRvci0tKGludCkgeyAvLyBQb3N0ZGVjcmVtZW50CisgICAgICBUaGlzVHlwZSB0bXAgPSAqdGhpczsKKyAgICAgIC0tKnRoaXM7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICB9OworfQorCituYW1lc3BhY2UgbGx2bSB7CisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBHcmFwaFRyYWl0czxsbHZtYzo6Q29tcGlsYXRpb25HcmFwaCo+IHsKKyAgICB0eXBlZGVmIGxsdm1jOjpDb21waWxhdGlvbkdyYXBoIEdyYXBoVHlwZTsKKyAgICB0eXBlZGVmIGxsdm1jOjpOb2RlIE5vZGVUeXBlOworICAgIHR5cGVkZWYgbGx2bWM6Ok5vZGVDaGlsZEl0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgICAgc3RhdGljIE5vZGVUeXBlKiBnZXRFbnRyeU5vZGUoR3JhcGhUeXBlKiBHKSB7CisgICAgICByZXR1cm4gRy0+Z2V0Tm9kZSgicm9vdCIpOworICAgIH0KKworICAgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSogTikgeworICAgICAgcmV0dXJuIENoaWxkSXRlcmF0b3JUeXBlKE4sIE4tPk91dEVkZ2VzLmJlZ2luKCkpOworICAgIH0KKyAgICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlKiBOKSB7CisgICAgICByZXR1cm4gQ2hpbGRJdGVyYXRvclR5cGUoTiwgTi0+T3V0RWRnZXMuZW5kKCkpOworICAgIH0KKworICAgIHR5cGVkZWYgbGx2bWM6Ok5vZGVzSXRlcmF0b3Igbm9kZXNfaXRlcmF0b3I7CisgICAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKEdyYXBoVHlwZSAqRykgeworICAgICAgcmV0dXJuIEdyYXBoQmVnaW4oRyk7CisgICAgfQorICAgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoR3JhcGhUeXBlICpHKSB7CisgICAgICByZXR1cm4gR3JhcGhFbmQoRyk7CisgICAgfQorICB9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX0lOQ0xVREVfQ09NUElMRVJfRFJJVkVSX0NPTVBJTEFUSU9OX0dSQVBIX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9FcnJvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbXBpbGVyRHJpdmVyL0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzMDk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9FcnJvci5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LS0tIEVycm9yLmggLSBUaGUgTExWTSBDb21waWxlciBEcml2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIEVycm9yIGhhbmRsaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTkNMVURFX0NPTVBJTEVSX0RSSVZFUl9FUlJPUl9ICisjZGVmaW5lIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfRVJST1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtYyB7CisKKyAgaW5saW5lIHZvaWQgUHJpbnRFcnJvcihsbHZtOjpTdHJpbmdSZWYgRXJyKSB7CisgICAgZXh0ZXJuIGNvbnN0IGNoYXIqIFByb2dyYW1OYW1lOworICAgIGxsdm06OmVycnMoKSA8PCBQcm9ncmFtTmFtZSA8PCAiOiAiIDw8IEVyciA8PCAnXG4nOworICB9CisKK30KKworI2VuZGlmIC8vIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfRVJST1JfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbXBpbGVyRHJpdmVyL0ZvcmNlTGlua2FnZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbXBpbGVyRHJpdmVyL0ZvcmNlTGlua2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMGMwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29tcGlsZXJEcml2ZXIvRm9yY2VMaW5rYWdlLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vPT09LS0tIEZvcmNlTGlua2FnZS5oIC0gVGhlIExMVk0gQ29tcGlsZXIgRHJpdmVyIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIEEgYml0IG9mIHByZXByb2Nlc3NvciBtYWdpYyB0byBmb3JjZSByZWZlcmVuY2VzIHRvIHN0YXRpYyBsaWJyYXJpZXMuIE5lZWRlZAorLy8gIGJlY2F1c2UgcGx1Z2luIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgdmlhIHN0YXRpYyB2YXJpYWJsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lOQ0xVREVfQ09NUElMRVJfRFJJVkVSX0ZPUkNFX0xJTktBR0VfSAorI2RlZmluZSBMTFZNX0lOQ0xVREVfQ09NUElMRVJfRFJJVkVSX0ZPUkNFX0xJTktBR0VfSAorCisjaW5jbHVkZSAibGx2bS9Db21waWxlckRyaXZlci9Gb3JjZUxpbmthZ2VNYWNyb3MuaCIKKworbmFtZXNwYWNlIGxsdm1jIHsKKworLy8gRGVjbGFyZSBhbGwgRm9yY2VMaW5rYWdlJChQbHVnaW5OYW1lKSBmdW5jdGlvbnMuCisKKyNpZmRlZiBMTFZNQ19CVUlMVElOX1BMVUdJTl8xCisgICAgICBMTFZNQ19GT1JDRV9MSU5LQUdFX0RFQ0woTExWTUNfQlVJTFRJTl9QTFVHSU5fMSk7CisjZW5kaWYKKworI2lmZGVmIExMVk1DX0JVSUxUSU5fUExVR0lOXzIKKyAgICAgIExMVk1DX0ZPUkNFX0xJTktBR0VfREVDTChMTFZNQ19CVUlMVElOX1BMVUdJTl8yKTsKKyNlbmRpZgorCisjaWZkZWYgTExWTUNfQlVJTFRJTl9QTFVHSU5fMworICAgICAgTExWTUNfRk9SQ0VfTElOS0FHRV9ERUNMKExMVk1DX0JVSUxUSU5fUExVR0lOXzMpOworI2VuZGlmCisKKyNpZmRlZiBMTFZNQ19CVUlMVElOX1BMVUdJTl80CisgICAgICBMTFZNQ19GT1JDRV9MSU5LQUdFX0RFQ0woTExWTUNfQlVJTFRJTl9QTFVHSU5fNCk7CisjZW5kaWYKKworI2lmZGVmIExMVk1DX0JVSUxUSU5fUExVR0lOXzUKKyAgICAgIExMVk1DX0ZPUkNFX0xJTktBR0VfREVDTChMTFZNQ19CVUlMVElOX1BMVUdJTl81KTsKKyNlbmRpZgorCisjaWZkZWYgTExWTUNfQlVJTFRJTl9QTFVHSU5fNgorICAgICAgTExWTUNfRk9SQ0VfTElOS0FHRV9ERUNMKExMVk1DX0JVSUxUSU5fUExVR0lOXzYpOworI2VuZGlmCisKKyNpZmRlZiBMTFZNQ19CVUlMVElOX1BMVUdJTl83CisgICAgICBMTFZNQ19GT1JDRV9MSU5LQUdFX0RFQ0woTExWTUNfQlVJTFRJTl9QTFVHSU5fNyk7CisjZW5kaWYKKworI2lmZGVmIExMVk1DX0JVSUxUSU5fUExVR0lOXzgKKyAgICAgIExMVk1DX0ZPUkNFX0xJTktBR0VfREVDTChMTFZNQ19CVUlMVElOX1BMVUdJTl84KTsKKyNlbmRpZgorCisjaWZkZWYgTExWTUNfQlVJTFRJTl9QTFVHSU5fOQorICAgICAgTExWTUNfRk9SQ0VfTElOS0FHRV9ERUNMKExMVk1DX0JVSUxUSU5fUExVR0lOXzkpOworI2VuZGlmCisKKyNpZmRlZiBMTFZNQ19CVUlMVElOX1BMVUdJTl8xMAorICAgICAgTExWTUNfRk9SQ0VfTElOS0FHRV9ERUNMKExMVk1DX0JVSUxUSU5fUExVR0lOXzEwKTsKKyNlbmRpZgorCituYW1lc3BhY2UgZm9yY2VfbGlua2FnZSB7CisKKyAgc3RydWN0IExpbmthZ2VGb3JjZXIgeworCisgICAgTGlua2FnZUZvcmNlcigpIHsKKworLy8gQ2FsbCBhbGwgRm9yY2VMaW5rYWdlJChQbHVnaW5OYW1lKSBmdW5jdGlvbnMuCisjaWZkZWYgTExWTUNfQlVJTFRJTl9QTFVHSU5fMQorICAgICAgTExWTUNfRk9SQ0VfTElOS0FHRV9DQUxMKExMVk1DX0JVSUxUSU5fUExVR0lOXzEpOworI2VuZGlmCisKKyNpZmRlZiBMTFZNQ19CVUlMVElOX1BMVUdJTl8yCisgICAgICBMTFZNQ19GT1JDRV9MSU5LQUdFX0NBTEwoTExWTUNfQlVJTFRJTl9QTFVHSU5fMik7CisjZW5kaWYKKworI2lmZGVmIExMVk1DX0JVSUxUSU5fUExVR0lOXzMKKyAgICAgIExMVk1DX0ZPUkNFX0xJTktBR0VfQ0FMTChMTFZNQ19CVUlMVElOX1BMVUdJTl8zKTsKKyNlbmRpZgorCisjaWZkZWYgTExWTUNfQlVJTFRJTl9QTFVHSU5fNAorICAgICAgTExWTUNfRk9SQ0VfTElOS0FHRV9DQUxMKExMVk1DX0JVSUxUSU5fUExVR0lOXzQpOworI2VuZGlmCisKKyNpZmRlZiBMTFZNQ19CVUlMVElOX1BMVUdJTl81CisgICAgICBMTFZNQ19GT1JDRV9MSU5LQUdFX0NBTEwoTExWTUNfQlVJTFRJTl9QTFVHSU5fNSk7CisjZW5kaWYKKworI2lmZGVmIExMVk1DX0JVSUxUSU5fUExVR0lOXzYKKyAgICAgIExMVk1DX0ZPUkNFX0xJTktBR0VfQ0FMTChMTFZNQ19CVUlMVElOX1BMVUdJTl82KTsKKyNlbmRpZgorCisjaWZkZWYgTExWTUNfQlVJTFRJTl9QTFVHSU5fNworICAgICAgTExWTUNfRk9SQ0VfTElOS0FHRV9DQUxMKExMVk1DX0JVSUxUSU5fUExVR0lOXzcpOworI2VuZGlmCisKKyNpZmRlZiBMTFZNQ19CVUlMVElOX1BMVUdJTl84CisgICAgICBMTFZNQ19GT1JDRV9MSU5LQUdFX0NBTEwoTExWTUNfQlVJTFRJTl9QTFVHSU5fOCk7CisjZW5kaWYKKworI2lmZGVmIExMVk1DX0JVSUxUSU5fUExVR0lOXzkKKyAgICAgIExMVk1DX0ZPUkNFX0xJTktBR0VfQ0FMTChMTFZNQ19CVUlMVElOX1BMVUdJTl85KTsKKyNlbmRpZgorCisjaWZkZWYgTExWTUNfQlVJTFRJTl9QTFVHSU5fMTAKKyAgICAgIExMVk1DX0ZPUkNFX0xJTktBR0VfQ0FMTChMTFZNQ19CVUlMVElOX1BMVUdJTl8xMCk7CisjZW5kaWYKKworICAgIH0KKyAgfTsKK30gLy8gRW5kIG5hbWVzcGFjZSBmb3JjZV9saW5rYWdlLgorCisvLyBUaGUgb25seSBleHRlcm5hbGx5IHVzZWQgYml0Lgordm9pZCBGb3JjZUxpbmthZ2UoKSB7CisgIGZvcmNlX2xpbmthZ2U6OkxpbmthZ2VGb3JjZXIgZHVtbXk7Cit9CisKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtYy4KKworI2VuZGlmIC8vIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfRk9SQ0VfTElOS0FHRV9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29tcGlsZXJEcml2ZXIvRm9yY2VMaW5rYWdlTWFjcm9zLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29tcGlsZXJEcml2ZXIvRm9yY2VMaW5rYWdlTWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2MmIwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9Gb3JjZUxpbmthZ2VNYWNyb3MuaApAQCAtMCwwICsxLDI5IEBACisvLz09PS0tLSBGb3JjZUxpbmthZ2VNYWNyb3MuaCAtIFRoZSBMTFZNIENvbXBpbGVyIERyaXZlciAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBQcmVwcm9jZXNzb3IgbWFnaWMgdGhhdCBmb3JjZXMgcmVmZXJlbmNlcyB0byBzdGF0aWMgbGlicmFyaWVzIC0gY29tbW9uCisvLyAgbWFjcm9zIHVzZWQgYnkgYm90aCBkcml2ZXIgYW5kIHBsdWdpbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lOQ0xVREVfQ09NUElMRVJfRFJJVkVSX0ZPUkNFX0xJTktBR0VfTUFDUk9TX0gKKyNkZWZpbmUgTExWTV9JTkNMVURFX0NPTVBJTEVSX0RSSVZFUl9GT1JDRV9MSU5LQUdFX01BQ1JPU19ICisKKyNkZWZpbmUgTExWTUNfRk9SQ0VfTElOS0FHRV9QUkVGSVgoUGx1Z2luTmFtZSkgRm9yY2VMaW5rYWdlICMjIFBsdWdpbk5hbWUKKworI2RlZmluZSBMTFZNQ19GT1JDRV9MSU5LQUdFX0ZVTihQbHVnaW5OYW1lKSBcCisgIExMVk1DX0ZPUkNFX0xJTktBR0VfUFJFRklYKFBsdWdpbk5hbWUpCisKKyNkZWZpbmUgTExWTUNfRk9SQ0VfTElOS0FHRV9ERUNMKFBsdWdpbk5hbWUpIFwKKyAgdm9pZCBMTFZNQ19GT1JDRV9MSU5LQUdFX0ZVTihQbHVnaW5OYW1lKSAoKQorCisjZGVmaW5lIExMVk1DX0ZPUkNFX0xJTktBR0VfQ0FMTChQbHVnaW5OYW1lKSBcCisgIExMVk1DX0ZPUkNFX0xJTktBR0VfRlVOKFBsdWdpbk5hbWUpICgpCisKKyNlbmRpZiAvLyBMTFZNX0lOQ0xVREVfQ09NUElMRVJfRFJJVkVSX0ZPUkNFX0xJTktBR0VfTUFDUk9TX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9NYWluLmluYyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9NYWluLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJiOGNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbXBpbGVyRHJpdmVyL01haW4uaW5jCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LS0tIE1haW4uaW5jIC0gVGhlIExMVk0gQ29tcGlsZXIgRHJpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgdG9vbCBwcm92aWRlcyBhIHNpbmdsZSBwb2ludCBvZiBhY2Nlc3MgdG8gdGhlIExMVk0KKy8vICBjb21waWxhdGlvbiB0b29scy4gIEl0IGhhcyBtYW55IG9wdGlvbnMuIFRvIGRpc2NvdmVyIHRoZSBvcHRpb25zCisvLyAgc3VwcG9ydGVkIHBsZWFzZSByZWZlciB0byB0aGUgdG9vbHMnIG1hbnVhbCBwYWdlIG9yIHJ1biB0aGUgdG9vbAorLy8gIHdpdGggdGhlIC1oZWxwIG9wdGlvbi4KKy8vCisvLyAgVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBkZWZhdWx0IGVudHJ5IHBvaW50IGZvciB0aGUgZHJpdmVyIGV4ZWN1dGFibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lOQ0xVREVfQ09NUElMRVJfRFJJVkVSX01BSU5fSU5DCisjZGVmaW5lIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfTUFJTl9JTkMKKworI2luY2x1ZGUgImxsdm0vQ29tcGlsZXJEcml2ZXIvRm9yY2VMaW5rYWdlLmgiCisKK25hbWVzcGFjZSBsbHZtYyB7CisgIGludCBNYWluKGludCBhcmdjLCBjaGFyKiogYXJndik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBsbHZtYzo6Rm9yY2VMaW5rYWdlKCk7CisgIHJldHVybiBsbHZtYzo6TWFpbihhcmdjLCBhcmd2KTsKK30KKworI2VuZGlmIC8vIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfTUFJTl9JTkMKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9QbHVnaW4uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWZkOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbXBpbGVyRHJpdmVyL1BsdWdpbi5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LS0tIFBsdWdpbi5oIC0gVGhlIExMVk0gQ29tcGlsZXIgRHJpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFBsdWdpbiBzdXBwb3J0IGZvciBsbHZtYy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfUExVR0lOX0gKKyNkZWZpbmUgTExWTV9JTkNMVURFX0NPTVBJTEVSX0RSSVZFUl9QTFVHSU5fSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlZ2lzdHJ5LmgiCisKK25hbWVzcGFjZSBsbHZtYyB7CisKKyAgY2xhc3MgTGFuZ3VhZ2VNYXA7CisgIGNsYXNzIENvbXBpbGF0aW9uR3JhcGg7CisKKyAgLy8vIEJhc2VQbHVnaW4gLSBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgTExWTUMgcGx1Z2lucy4KKyAgc3RydWN0IEJhc2VQbHVnaW4geworCisgICAgLy8vIFByaW9yaXR5IC0gUGx1Z2luIHByaW9yaXR5LCB1c2VmdWwgZm9yIGhhbmRsaW5nIGRlcGVuZGVuY2llcworICAgIC8vLyBiZXR3ZWVuIHBsdWdpbnMuIFBsdWdpbnMgd2l0aCBsb3dlciBwcmlvcml0aWVzIGFyZSBsb2FkZWQKKyAgICAvLy8gZmlyc3QuCisgICAgdmlydHVhbCBpbnQgUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgICAvLy8gUHJlcHJvY2Vzc09wdGlvbnMgLSBUaGUgYXV0by1nZW5lcmF0ZWQgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyB2YXJpb3VzCisgICAgLy8vIGNvbnNpc3RlbmN5IGNoZWNrcyBvbiBvcHRpb25zIChsaWtlIGVuc3VyaW5nIHRoYXQgLU8yIGFuZCAtTzMgYXJlIG5vdAorICAgIC8vLyB1c2VkIHRvZ2V0aGVyKS4KKyAgICB2aXJ0dWFsIGludCBQcmVwcm9jZXNzT3B0aW9ucygpIGNvbnN0ID0gMDsKKworICAgIC8vLyBQb3B1bGF0ZUxhbmd1YWdlTWFwIC0gVGhlIGF1dG8tZ2VuZXJhdGVkIGZ1bmN0aW9uIHRoYXQgZmlsbHMgaW4KKyAgICAvLy8gdGhlIGxhbmd1YWdlIG1hcCAobWFwIGZyb20gZmlsZSBleHRlbnNpb25zIHRvIGxhbmd1YWdlIG5hbWVzKS4KKyAgICB2aXJ0dWFsIGludCBQb3B1bGF0ZUxhbmd1YWdlTWFwKExhbmd1YWdlTWFwJikgY29uc3QgPSAwOworCisgICAgLy8vIFBvcHVsYXRlQ29tcGlsYXRpb25HcmFwaCAtIFRoZSBhdXRvLWdlbmVyYXRlZCBmdW5jdGlvbiB0aGF0CisgICAgLy8vIHBvcHVsYXRlcyB0aGUgY29tcGlsYXRpb24gZ3JhcGggd2l0aCBub2RlcyBhbmQgZWRnZXMuCisgICAgdmlydHVhbCBpbnQgUG9wdWxhdGVDb21waWxhdGlvbkdyYXBoKENvbXBpbGF0aW9uR3JhcGgmKSBjb25zdCA9IDA7CisKKyAgICAvLy8gTmVlZGVkIHRvIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZy4KKyAgICB2aXJ0dWFsIH5CYXNlUGx1Z2luKCkge30KKyAgfTsKKworICB0eXBlZGVmIGxsdm06OlJlZ2lzdHJ5PEJhc2VQbHVnaW4+IFBsdWdpblJlZ2lzdHJ5OworCisgIHRlbXBsYXRlIDxjbGFzcyBQPgorICBzdHJ1Y3QgUmVnaXN0ZXJQbHVnaW4KKyAgICA6IHB1YmxpYyBQbHVnaW5SZWdpc3RyeTo6QWRkPFA+IHsKKyAgICB0eXBlZGVmIFBsdWdpblJlZ2lzdHJ5OjpBZGQ8UD4gQmFzZTsKKworICAgIFJlZ2lzdGVyUGx1Z2luKGNvbnN0IGNoYXIqIE5hbWUgPSAiTmFtZWxlc3MiLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIERlc2MgPSAiQXV0by1nZW5lcmF0ZWQgcGx1Z2luIikKKyAgICAgIDogQmFzZShOYW1lLCBEZXNjKSB7fQorICB9OworCisKKyAgLy8vIFBsdWdpbkxvYWRlciAtIEhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBtYWluIHByb2dyYW0gZm9yCisgIC8vLyBsaWZldGltZSBtYW5hZ2VtZW50LgorICBzdHJ1Y3QgUGx1Z2luTG9hZGVyIHsKKyAgICBQbHVnaW5Mb2FkZXIoKTsKKyAgICB+UGx1Z2luTG9hZGVyKCk7CisKKyAgICAvLy8gUnVuSW5pdGlhbGl6YXRpb24gLSBDYWxscyBQcmVwcm9jZXNzT3B0aW9ucywgUG9wdWxhdGVMYW5ndWFnZU1hcCBhbmQKKyAgICAvLy8gUG9wdWxhdGVDb21waWxhdGlvbkdyYXBoIG1ldGhvZHMgb2YgYWxsIHBsdWdpbnMuIFRoaXMgcG9wdWxhdGVzIHRoZQorICAgIC8vLyBnbG9iYWwgbGFuZ3VhZ2UgbWFwIGFuZCB0aGUgY29tcGlsYXRpb24gZ3JhcGguCisgICAgaW50IFJ1bkluaXRpYWxpemF0aW9uKExhbmd1YWdlTWFwJiBsYW5nTWFwLCBDb21waWxhdGlvbkdyYXBoJiBncmFwaCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBub25jb3B5YWJsZQorICAgIFBsdWdpbkxvYWRlcihjb25zdCBQbHVnaW5Mb2FkZXImIG90aGVyKTsKKyAgICBjb25zdCBQbHVnaW5Mb2FkZXImIG9wZXJhdG9yPShjb25zdCBQbHVnaW5Mb2FkZXImIG90aGVyKTsKKyAgfTsKKworfQorCisjZW5kaWYgLy8gTExWTV9JTkNMVURFX0NPTVBJTEVSX0RSSVZFUl9QTFVHSU5fSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbXBpbGVyRHJpdmVyL1Rvb2wuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9Ub29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZjUwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db21waWxlckRyaXZlci9Ub29sLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vPT09LS0tIFRvb2wuaCAtIFRoZSBMTFZNIENvbXBpbGVyIERyaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRvb2wgYWJzdHJhY3QgYmFzZSBjbGFzcyAtIGFuIGludGVyZmFjZSB0byB0b29sIGRlc2NyaXB0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfVE9PTF9ICisjZGVmaW5lIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfVE9PTF9ICisKKyNpbmNsdWRlICJsbHZtL0NvbXBpbGVyRHJpdmVyL0FjdGlvbi5oIgorCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUGF0aC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bWMgeworCisgIGNsYXNzIExhbmd1YWdlTWFwOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgc3RkOjpzdHJpbmc+ID4gQXJnc1ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxsbHZtOjpzeXM6OlBhdGg+IFBhdGhWZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFN0clZlY3RvcjsKKyAgdHlwZWRlZiBsbHZtOjpTdHJpbmdTZXQ8PiBJbnB1dExhbmd1YWdlc1NldDsKKworICAvLy8gVG9vbCAtIFJlcHJlc2VudHMgYSBzaW5nbGUgdG9vbC4KKyAgY2xhc3MgVG9vbCA6IHB1YmxpYyBsbHZtOjpSZWZDb3VudGVkQmFzZVZQVFI8VG9vbD4geworICBwdWJsaWM6CisKKyAgICB2aXJ0dWFsIH5Ub29sKCkge30KKworICAgIC8vLyBHZW5lcmF0ZUFjdGlvbiAtIEdlbmVyYXRlIGFuIEFjdGlvbiBnaXZlbiBwYXJ0aWN1bGFyIGNvbW1hbmQtbGluZQorICAgIC8vLyBvcHRpb25zLiBSZXR1cm5zIG5vbi16ZXJvIHZhbHVlIG9uIGVycm9yLgorICAgIHZpcnR1YWwgaW50IEdlbmVyYXRlQWN0aW9uIChBY3Rpb24mIE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGF0aFZlY3RvciYgaW5GaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBIYXNDaGlsZHJlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6c3lzOjpQYXRoJiBUZW1wRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dExhbmd1YWdlc1NldCYgSW5MYW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ3VhZ2VNYXAmIExhbmdNYXApIGNvbnN0ID0gMDsKKworICAgIC8vLyBHZW5lcmF0ZUFjdGlvbiAtIEdlbmVyYXRlIGFuIEFjdGlvbiBnaXZlbiBwYXJ0aWN1bGFyIGNvbW1hbmQtbGluZQorICAgIC8vLyBvcHRpb25zLiBSZXR1cm5zIG5vbi16ZXJvIHZhbHVlIG9uIGVycm9yLgorICAgIHZpcnR1YWwgaW50IEdlbmVyYXRlQWN0aW9uIChBY3Rpb24mIE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6c3lzOjpQYXRoJiBpbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgSGFzQ2hpbGRyZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OnN5czo6UGF0aCYgVGVtcERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRMYW5ndWFnZXNTZXQmIEluTGFuZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmd1YWdlTWFwJiBMYW5nTWFwKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqICBOYW1lKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3QgY2hhcioqIElucHV0TGFuZ3VhZ2VzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3QgY2hhciogIE91dHB1dExhbmd1YWdlKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBib29sIElzSm9pbigpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgV29ya3NPbkVtcHR5KCkgY29uc3QgPSAwOworCisgIHByb3RlY3RlZDoKKyAgICAvLy8gT3V0RmlsZU5hbWUgLSBHZW5lcmF0ZSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KKyAgICBsbHZtOjpzeXM6OlBhdGggT3V0RmlsZW5hbWUoY29uc3QgbGx2bTo6c3lzOjpQYXRoJiBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6c3lzOjpQYXRoJiBUZW1wRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN0b3BDb21waWxhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogT3V0cHV0U3VmZml4KSBjb25zdDsKKworICAgIFN0clZlY3RvciBTb3J0QXJncyhBcmdzVmVjdG9yJiBBcmdzKSBjb25zdDsKKyAgfTsKKworICAvLy8gSm9pblRvb2wgLSBBIFRvb2wgdGhhdCBoYXMgYW4gYXNzb2NpYXRlZCBpbnB1dCBmaWxlIGxpc3QuCisgIGNsYXNzIEpvaW5Ub29sIDogcHVibGljIFRvb2wgeworICBwdWJsaWM6CisgICAgdm9pZCBBZGRUb0pvaW5MaXN0KGNvbnN0IGxsdm06OnN5czo6UGF0aCYgUCkgeyBKb2luTGlzdF8ucHVzaF9iYWNrKFApOyB9CisgICAgdm9pZCBDbGVhckpvaW5MaXN0KCkgeyBKb2luTGlzdF8uY2xlYXIoKTsgfQorICAgIGJvb2wgSm9pbkxpc3RFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEpvaW5MaXN0Xy5lbXB0eSgpOyB9CisKKyAgICBpbnQgR2VuZXJhdGVBY3Rpb24oQWN0aW9uJiBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgSGFzQ2hpbGRyZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OnN5czo6UGF0aCYgVGVtcERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRMYW5ndWFnZXNTZXQmIEluTGFuZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmd1YWdlTWFwJiBMYW5nTWFwKSBjb25zdCB7CisgICAgICByZXR1cm4gR2VuZXJhdGVBY3Rpb24oT3V0LCBKb2luTGlzdF8sIEhhc0NoaWxkcmVuLCBUZW1wRGlyLCBJbkxhbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmdNYXApOworICAgIH0KKyAgICAvLyBXZSBzaG91bGRuJ3Qgc2hhZG93IGJhc2UgY2xhc3MncyB2ZXJzaW9uIG9mIEdlbmVyYXRlQWN0aW9uLgorICAgIHVzaW5nIFRvb2w6OkdlbmVyYXRlQWN0aW9uOworCisgIHByaXZhdGU6CisgICAgUGF0aFZlY3RvciBKb2luTGlzdF87CisgIH07CisKK30KKworI2VuZGlmIC8vIExMVk1fSU5DTFVERV9DT01QSUxFUl9EUklWRVJfVE9PTF9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29uZmlnL0FzbVBhcnNlcnMuZGVmLmluIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QYXJzZXJzLmRlZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFhZjgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QYXJzZXJzLmRlZi5pbgpAQCAtMCwwICsxLDI5IEBACisvLz09PS0gbGx2bS9Db25maWcvQXNtUGFyc2Vycy5kZWYgLSBMTFZNIEFzc2VtYmx5IFBhcnNlcnMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBlbnVtZXJhdGVzIGFsbCBvZiB0aGUgYXNzZW1ibHktbGFuZ3VhZ2UgcGFyc2VycworLy8gc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQgb2YgTExWTS4gQ2xpZW50cyBvZiB0aGlzIGZpbGUgc2hvdWxkIGRlZmluZQorLy8gdGhlIExMVk1fQVNNX1BBUlNFUiBtYWNybyB0byBiZSBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gd2l0aCBhCisvLyBzaW5nbGUgcGFyYW1ldGVyICh0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHdob3NlIGFzc2VtYmx5IGNhbiBiZQorLy8gZ2VuZXJhdGVkKTsgaW5jbHVkaW5nIHRoaXMgZmlsZSB3aWxsIHRoZW4gZW51bWVyYXRlIGFsbCBvZiB0aGUKKy8vIHRhcmdldHMgd2l0aCBhc3NlbWJseSBwYXJzZXJzLgorLy8KKy8vIFRoZSBzZXQgb2YgdGFyZ2V0cyBzdXBwb3J0ZWQgYnkgTExWTSBpcyBnZW5lcmF0ZWQgYXQgY29uZmlndXJhdGlvbgorLy8gdGltZSwgYXQgd2hpY2ggcG9pbnQgdGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkLiBEbyBub3QgbW9kaWZ5IHRoaXMKKy8vIGhlYWRlciBkaXJlY3RseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQVNNX1BBUlNFUgorIyAgZXJyb3IgUGxlYXNlIGRlZmluZSB0aGUgbWFjcm8gTExWTV9BU01fUEFSU0VSKFRhcmdldE5hbWUpCisjZW5kaWYKKworQExMVk1fRU5VTV9BU01fUEFSU0VSU0AKKworI3VuZGVmIExMVk1fQVNNX1BBUlNFUgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QcmludGVycy5kZWYuaW4gYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29uZmlnL0FzbVByaW50ZXJzLmRlZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzI5YmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QcmludGVycy5kZWYuaW4KQEAgLTAsMCArMSwyOSBAQAorLy89PT0tIGxsdm0vQ29uZmlnL0FzbVByaW50ZXJzLmRlZiAtIExMVk0gQXNzZW1ibHkgUHJpbnRlcnMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZW51bWVyYXRlcyBhbGwgb2YgdGhlIGFzc2VtYmx5LWxhbmd1YWdlIHByaW50ZXJzCisvLyBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZCBvZiBMTFZNLiBDbGllbnRzIG9mIHRoaXMgZmlsZSBzaG91bGQgZGVmaW5lCisvLyB0aGUgTExWTV9BU01fUFJJTlRFUiBtYWNybyB0byBiZSBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gd2l0aCBhCisvLyBzaW5nbGUgcGFyYW1ldGVyICh0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHdob3NlIGFzc2VtYmx5IGNhbiBiZQorLy8gZ2VuZXJhdGVkKTsgaW5jbHVkaW5nIHRoaXMgZmlsZSB3aWxsIHRoZW4gZW51bWVyYXRlIGFsbCBvZiB0aGUKKy8vIHRhcmdldHMgd2l0aCBhc3NlbWJseSBwcmludGVycy4KKy8vCisvLyBUaGUgc2V0IG9mIHRhcmdldHMgc3VwcG9ydGVkIGJ5IExMVk0gaXMgZ2VuZXJhdGVkIGF0IGNvbmZpZ3VyYXRpb24KKy8vIHRpbWUsIGF0IHdoaWNoIHBvaW50IHRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZC4gRG8gbm90IG1vZGlmeSB0aGlzCisvLyBoZWFkZXIgZGlyZWN0bHkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FTTV9QUklOVEVSCisjICBlcnJvciBQbGVhc2UgZGVmaW5lIHRoZSBtYWNybyBMTFZNX0FTTV9QUklOVEVSKFRhcmdldE5hbWUpCisjZW5kaWYKKworQExMVk1fRU5VTV9BU01fUFJJTlRFUlNACisKKyN1bmRlZiBMTFZNX0FTTV9QUklOVEVSCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29uZmlnL0Rpc2Fzc2VtYmxlcnMuZGVmLmluIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9EaXNhc3NlbWJsZXJzLmRlZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjEzNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9EaXNhc3NlbWJsZXJzLmRlZi5pbgpAQCAtMCwwICsxLDI5IEBACisvLz09PS0gbGx2bS9Db25maWcvRGlzYXNzZW1ibGVycy5kZWYgLSBMTFZNIEFzc2VtYmx5IFBhcnNlcnMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBlbnVtZXJhdGVzIGFsbCBvZiB0aGUgYXNzZW1ibHktbGFuZ3VhZ2UgcGFyc2VycworLy8gc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQgb2YgTExWTS4gQ2xpZW50cyBvZiB0aGlzIGZpbGUgc2hvdWxkIGRlZmluZQorLy8gdGhlIExMVk1fQVNNX1BBUlNFUiBtYWNybyB0byBiZSBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gd2l0aCBhCisvLyBzaW5nbGUgcGFyYW1ldGVyICh0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHdob3NlIGFzc2VtYmx5IGNhbiBiZQorLy8gZ2VuZXJhdGVkKTsgaW5jbHVkaW5nIHRoaXMgZmlsZSB3aWxsIHRoZW4gZW51bWVyYXRlIGFsbCBvZiB0aGUKKy8vIHRhcmdldHMgd2l0aCBhc3NlbWJseSBwYXJzZXJzLgorLy8KKy8vIFRoZSBzZXQgb2YgdGFyZ2V0cyBzdXBwb3J0ZWQgYnkgTExWTSBpcyBnZW5lcmF0ZWQgYXQgY29uZmlndXJhdGlvbgorLy8gdGltZSwgYXQgd2hpY2ggcG9pbnQgdGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkLiBEbyBub3QgbW9kaWZ5IHRoaXMKKy8vIGhlYWRlciBkaXJlY3RseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRElTQVNTRU1CTEVSCisjICBlcnJvciBQbGVhc2UgZGVmaW5lIHRoZSBtYWNybyBMTFZNX0RJU0FTU0VNQkxFUihUYXJnZXROYW1lKQorI2VuZGlmCisKK0BMTFZNX0VOVU1fRElTQVNTRU1CTEVSU0AKKworI3VuZGVmIExMVk1fRElTQVNTRU1CTEVSCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29uZmlnL1RhcmdldHMuZGVmIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9UYXJnZXRzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDAyYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9UYXJnZXRzLmRlZgpAQCAtMCwwICsxLDI5IEBACisvKj09PS0gbGx2bS9Db25maWcvVGFyZ2V0cy5kZWYgLSBMTFZNIFRhcmdldCBBcmNoaXRlY3R1cmVzIC0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgZW51bWVyYXRlcyBhbGwgb2YgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmVzIHN1cHBvcnRlZCBieSAgICAgICAgICAqfAorfCogdGhpcyBidWlsZCBvZiBMTFZNLiBDbGllbnRzIG9mIHRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSAgICAgICAgICAgICAgICAgKnwKK3wqIExMVk1fVEFSR0VUIG1hY3JvIHRvIGJlIGEgZnVuY3Rpb24tbGlrZSBtYWNybyB3aXRoIGEgc2luZ2xlICAgICAgICAgICAgICAgICp8Cit8KiBwYXJhbWV0ZXIgKHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQpOyBpbmNsdWRpbmcgdGhpcyBmaWxlIHdpbGwgdGhlbiAgICAgICAgICAqfAorfCogZW51bWVyYXRlIGFsbCBvZiB0aGUgdGFyZ2V0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGUgc2V0IG9mIHRhcmdldHMgc3VwcG9ydGVkIGJ5IExMVk0gaXMgZ2VuZXJhdGVkIGF0IGNvbmZpZ3VyYXRpb24gICAgICAgICAqfAorfCogdGltZSwgYXQgd2hpY2ggcG9pbnQgdGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkLiBEbyBub3QgbW9kaWZ5IHRoaXMgICAgICAgICAgKnwKK3wqIGhlYWRlciBkaXJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX1RBUkdFVAorIyAgZXJyb3IgUGxlYXNlIGRlZmluZSB0aGUgbWFjcm8gTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkKKyNlbmRpZgorCitMTFZNX1RBUkdFVChYODYpCisKKworI3VuZGVmIExMVk1fVEFSR0VUCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29uZmlnL1RhcmdldHMuZGVmLmluIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9UYXJnZXRzLmRlZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg5ZWNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9UYXJnZXRzLmRlZi5pbgpAQCAtMCwwICsxLDI4IEBACisvKj09PS0gbGx2bS9Db25maWcvVGFyZ2V0cy5kZWYgLSBMTFZNIFRhcmdldCBBcmNoaXRlY3R1cmVzIC0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgZW51bWVyYXRlcyBhbGwgb2YgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmVzIHN1cHBvcnRlZCBieSAgICAgICAgICAqfAorfCogdGhpcyBidWlsZCBvZiBMTFZNLiBDbGllbnRzIG9mIHRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSAgICAgICAgICAgICAgICAgKnwKK3wqIExMVk1fVEFSR0VUIG1hY3JvIHRvIGJlIGEgZnVuY3Rpb24tbGlrZSBtYWNybyB3aXRoIGEgc2luZ2xlICAgICAgICAgICAgICAgICp8Cit8KiBwYXJhbWV0ZXIgKHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQpOyBpbmNsdWRpbmcgdGhpcyBmaWxlIHdpbGwgdGhlbiAgICAgICAgICAqfAorfCogZW51bWVyYXRlIGFsbCBvZiB0aGUgdGFyZ2V0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGUgc2V0IG9mIHRhcmdldHMgc3VwcG9ydGVkIGJ5IExMVk0gaXMgZ2VuZXJhdGVkIGF0IGNvbmZpZ3VyYXRpb24gICAgICAgICAqfAorfCogdGltZSwgYXQgd2hpY2ggcG9pbnQgdGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkLiBEbyBub3QgbW9kaWZ5IHRoaXMgICAgICAgICAgKnwKK3wqIGhlYWRlciBkaXJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX1RBUkdFVAorIyAgZXJyb3IgUGxlYXNlIGRlZmluZSB0aGUgbWFjcm8gTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkKKyNlbmRpZgorCitATExWTV9FTlVNX1RBUkdFVFNACisKKyN1bmRlZiBMTFZNX1RBUkdFVApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9jb25maWcuaC5jbWFrZSBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db25maWcvY29uZmlnLmguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlNmFiNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db25maWcvY29uZmlnLmguY21ha2UKQEAgLTAsMCArMSw2MzUgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBDcmVhdGVkIGJ5IEtldmluIGZyb20gY29uZmlnLmguaW4gKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBDT05GSUdfSAorI2RlZmluZSBDT05GSUdfSAorCisvKiBEZWZpbmUgaWYgZGxvcGVuKDApIHdpbGwgb3BlbiB0aGUgc3ltYm9scyBvZiB0aGUgcHJvZ3JhbSAqLworI3VuZGVmIENBTl9ETE9QRU5fU0VMRgorCisvKiBEZWZpbmUgaWYgQ0JFIGlzIGVuYWJsZWQgZm9yIHByaW50ZiAlYSBvdXRwdXQgKi8KKyN1bmRlZiBFTkFCTEVfQ0JFX1BSSU5URl9BCisKKy8qIERpcmVjdG9yaWVzIGNsYW5nIHdpbGwgc2VhcmNoIGZvciBoZWFkZXJzICovCisjZGVmaW5lIENfSU5DTFVERV9ESVJTICIke0NfSU5DTFVERV9ESVJTfSIKKworLyogRGlyZWN0b3J5IGNsYW5nIHdpbGwgc2VhcmNoIGZvciBsaWJzdGRjKysgaGVhZGVycyAqLworI2RlZmluZSBDWFhfSU5DTFVERV9ST09UICIke0NYWF9JTkNMVURFX1JPT1R9IgorCisvKiBBcmNoaXRlY3R1cmUgb2YgbGlic3RkYysrIGhlYWRlcnMgKi8KKyNkZWZpbmUgQ1hYX0lOQ0xVREVfQVJDSCAiJHtDWFhfSU5DTFVERV9BUkNIfSIKKworLyogMzIgYml0IG11bHRpbGliIGRpcmVjdG9yeSAqLworI2RlZmluZSBDWFhfSU5DTFVERV8zMkJJVF9ESVIgIiR7Q1hYX0lOQ0xVREVfMzJCSVRfRElSfSIKKworLyogNjQgYml0IG11bHRpbGliIGRpcmVjdG9yeSAqLworI2RlZmluZSBDWFhfSU5DTFVERV82NEJJVF9ESVIgIiR7Q1hYX0lOQ0xVREVfNjRCSVRfRElSfSIKKworLyogRGVmaW5lIGlmIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgaXMgZW5hYmxlZCAqLworI2NtYWtlZGVmaW5lIEVOQUJMRV9QSUMgJHtFTkFCTEVfUElDfQorCisvKiBEZWZpbmUgaWYgdGhyZWFkcyBlbmFibGVkICovCisjY21ha2VkZWZpbmUgRU5BQkxFX1RIUkVBRFMgJHtFTkFCTEVfVEhSRUFEU30KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhcmd6X2FwcGVuZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BUkdaX0FQUEVORAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyZ3pfY3JlYXRlX3NlcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BUkdaX0NSRUFURV9TRVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfQVJHWl9IICR7SEFWRV9BUkdaX0h9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXJnel9pbnNlcnQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQVJHWl9JTlNFUlQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhcmd6X25leHQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQVJHWl9ORVhUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXJnel9zdHJpbmdpZnknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQVJHWl9TVFJJTkdJRlkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhc3NlcnQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9BU1NFUlRfSCAke0hBVkVfQVNTRVJUX0h9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYmFja3RyYWNlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0JBQ0tUUkFDRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJjb3B5JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0JDT1BZCisKKy8qIERvZXMgbm90IGhhdmUgYmktZGlyZWN0aW9uYWwgaXRlcmF0b3IgKi8KKyN1bmRlZiBIQVZFX0JJX0lURVJBVE9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY2VpbGYnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfQ0VJTEYgJHtIQVZFX0NFSUxGfQorCisvKiBEZWZpbmUgaWYgdGhlIG5lYXQgcHJvZ3JhbSBpcyBhdmFpbGFibGUgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0NJUkNPICR7SEFWRV9DSVJDT30KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjbG9zZWRpcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9DTE9TRURJUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGN0eXBlLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQ1RZUEVfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuCisgICAqLworI2NtYWtlZGVmaW5lIEhBVkVfRElSRU5UX0ggJHtIQVZFX0RJUkVOVF9IfQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEdOVSBkbGQgbGlicmFyeS4gKi8KKyN1bmRlZiBIQVZFX0RMRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RMRF9IICR7SEFWRV9ETERfSH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBkbGVycm9yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0RMRVJST1IKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RMRkNOX0ggJHtIQVZFX0RMRkNOX0h9CisKKy8qIERlZmluZSBpZiBkbG9wZW4oKSBpcyBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4gKi8KKyN1bmRlZiBIQVZFX0RMT1BFTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfRExfSCAke0hBVkVfRExfSH0KKworLyogRGVmaW5lIGlmIHRoZSBkb3QgcHJvZ3JhbSBpcyBhdmFpbGFibGUgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RPVCAke0hBVkVfRE9UfQorCisvKiBEZWZpbmUgaWYgdGhlIGRvdHR5IHByb2dyYW0gaXMgYXZhaWxhYmxlICovCisjY21ha2VkZWZpbmUgSEFWRV9ET1RUWSAke0hBVkVfRE9UVFl9CisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX2R5bGRfZnVuY19sb29rdXAgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9EWUxECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9FUlJOT19IICR7SEFWRV9FUlJOT19IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgZXJyb3JfdCcuICovCisjdW5kZWYgSEFWRV9FUlJPUl9UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXhlY2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9FWEVDSU5GT19IICR7SEFWRV9FWEVDSU5GT19IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfRkNOVExfSCAke0hBVkVfRkNOVExfSH0KKworLyogRGVmaW5lIGlmIHRoZSBuZWF0IHByb2dyYW0gaXMgYXZhaWxhYmxlICovCisjY21ha2VkZWZpbmUgSEFWRV9GRFAgJHtIQVZFX0ZEUH0KKworLyogU2V0IHRvIDEgaWYgdGhlIGZpbml0ZSBmdW5jdGlvbiBpcyBmb3VuZCBpbiA8aWVlZWZwLmg+ICovCisjY21ha2VkZWZpbmUgSEFWRV9GSU5JVEVfSU5fSUVFRUZQX0ggJHtIQVZFX0ZJTklURV9JTl9JRUVFRlBfSH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbG9vcmYnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfRkxPT1JGICR7SEFWRV9GTE9PUkZ9CisKKy8qIERvZXMgbm90IGhhdmUgZm9yd2FyZCBpdGVyYXRvciAqLworI3VuZGVmIEhBVkVfRldEX0lURVJBVE9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Y3dkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVENXRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBhZ2VzaXplJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dFVFBBR0VTSVpFICR7SEFWRV9HRVRQQUdFU0laRX0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRybGltaXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUkxJTUlUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cnVzYWdlJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dFVFJVU0FHRSAke0hBVkVfR0VUUlVTQUdFfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHRpbWVvZmRheScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKKworLyogRG9lcyBub3QgaGF2ZSA8aGFzaF9tYXA+ICovCisjdW5kZWYgSEFWRV9HTE9CQUxfSEFTSF9NQVAKKworLyogRG9lcyBub3QgaGF2ZSBoYXNoX3NldCBpbiBnbG9iYWwgbmFtZXNwYWNlICovCisjdW5kZWYgSEFWRV9HTE9CQUxfSEFTSF9TRVQKKworLyogRG9lcyBub3QgaGF2ZSBleHQvaGFzaF9tYXAgKi8KKyN1bmRlZiBIQVZFX0dOVV9FWFRfSEFTSF9NQVAKKworLyogRG9lcyBub3QgaGF2ZSBoYXNoX3NldCBpbiBnbnUgbmFtZXNwYWNlICovCisjdW5kZWYgSEFWRV9HTlVfRVhUX0hBU0hfU0VUCisKKy8qIERlZmluZSBpZiB0aGUgR3JhcGh2aXogcHJvZ3JhbSBpcyBhdmFpbGFibGUgKi8KKyN1bmRlZiBIQVZFX0dSQVBIVklaCisKKy8qIERlZmluZSBpZiB0aGUgZ3YgcHJvZ3JhbSBpcyBhdmFpbGFibGUgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dWICR7SEFWRV9HVn0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbmRleCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9JTkRFWAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgaW50NjRfdCcuICovCisjdW5kZWYgSEFWRV9JTlQ2NF9UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9JTlRUWVBFU19IICR7SEFWRV9JTlRUWVBFU19IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzYXR0eScgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9JU0FUVFkgMQorCisvKiBTZXQgdG8gMSBpZiB0aGUgaXNpbmYgZnVuY3Rpb24gaXMgZm91bmQgaW4gPGNtYXRoPiAqLworI2NtYWtlZGVmaW5lIEhBVkVfSVNJTkZfSU5fQ01BVEggJHtIQVZFX0lTSU5GX0lOX0NNQVRIfQorCisvKiBTZXQgdG8gMSBpZiB0aGUgaXNpbmYgZnVuY3Rpb24gaXMgZm91bmQgaW4gPG1hdGguaD4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0lTSU5GX0lOX01BVEhfSCAke0hBVkVfSVNJTkZfSU5fTUFUSF9IfQorCisvKiBTZXQgdG8gMSBpZiB0aGUgaXNuYW4gZnVuY3Rpb24gaXMgZm91bmQgaW4gPGNtYXRoPiAqLworI2NtYWtlZGVmaW5lIEhBVkVfSVNOQU5fSU5fQ01BVEggJHtIQVZFX0lTTkFOX0lOX0NNQVRIfQorCisvKiBTZXQgdG8gMSBpZiB0aGUgaXNuYW4gZnVuY3Rpb24gaXMgZm91bmQgaW4gPG1hdGguaD4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0lTTkFOX0lOX01BVEhfSCAke0hBVkVfSVNOQU5fSU5fTUFUSF9IfQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGxpYmRsIGxpYnJhcnkgb3IgZXF1aXZhbGVudC4gKi8KKyN1bmRlZiBIQVZFX0xJQkRMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW1hZ2VobHAnIGxpYnJhcnkgKC1saW1hZ2VobHApLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElCSU1BR0VITFAgJHtIQVZFX0xJQklNQUdFSExQfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG0nIGxpYnJhcnkgKC1sbSkuICovCisjdW5kZWYgSEFWRV9MSUJNCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHNhcGknIGxpYnJhcnkgKC1scHNhcGkpLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElCUFNBUEkgJHtIQVZFX0xJQlBTQVBJfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB0aHJlYWQnIGxpYnJhcnkgKC1scHRocmVhZCkuICovCisjY21ha2VkZWZpbmUgSEFWRV9MSUJQVEhSRUFEICR7SEFWRV9MSUJQVEhSRUFEfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHVkaXM4NicgbGlicmFyeSAoLWx1ZGlzODYpLiAqLworI3VuZGVmIEhBVkVfTElCVURJUzg2CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElNSVRTX0ggJHtIQVZFX0xJTUlUU19IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbmsuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9MSU5LX0ggJHtIQVZFX0xJTktfSH0KKworLyogRGVmaW5lIGlmIHlvdSBjYW4gdXNlIC1XbCwtUi4gdG8gcGFzcyAtUi4gdG8gdGhlIGxpbmtlciwgaW4gb3JkZXIgdG8gYWRkCisgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIGR5bmFtaWMgbGlua2VyIHNlYXJjaCBwYXRoLiAqLworI3VuZGVmIEhBVkVfTElOS19SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9uZ2ptcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9MT05HSk1QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFjaC9tYWNoLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUFDSF9NQUNIX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoLW8vZHlsZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01BQ0hfT19EWUxEX0gKKworLyogRGVmaW5lIGlmIG1hbGxpbmZvKCkgaXMgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uICovCisjY21ha2VkZWZpbmUgSEFWRV9NQUxMSU5GTyAke0hBVkVfTUFMTElORk99CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTUFMTE9DX0ggJHtIQVZFX01BTExPQ19IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy9tYWxsb2MuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9NQUxMT0NfTUFMTE9DX0ggJHtIQVZFX01BTExPQ19NQUxMT0NfSH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtYWxsb2Nfem9uZV9zdGF0aXN0aWNzJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX01BTExPQ19aT05FX1NUQVRJU1RJQ1MgJHtIQVZFX01BTExPQ19aT05FX1NUQVRJU1RJQ1N9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtY3B5JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01FTUNQWQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTUVNTU9WRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX01FTU9SWV9IICR7SEFWRV9NRU1PUllfSH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBta2R0ZW1wJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX01LRFRFTVAgJHtIQVZFX01LRFRFTVB9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWtzdGVtcCcgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9NS1NURU1QICR7SEFWRV9NS1NURU1QfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rdGVtcCcgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9NS1RFTVAgJHtIQVZFX01LVEVNUH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIGlmIG1tYXAoKSB1c2VzIE1BUF9BTk9OWU1PVVMgdG8gbWFwIGFub255bW91cyBwYWdlcywgb3IgdW5kZWZpbmUgaWYKKyAgIGl0IHVzZXMgTUFQX0FOT04gKi8KKyN1bmRlZiBIQVZFX01NQVBfQU5PTllNT1VTCisKKy8qIERlZmluZSBpZiBtbWFwKCkgY2FuIG1hcCBmaWxlcyBpbnRvIG1lbW9yeSAqLworI3VuZGVmIEhBVkVfTU1BUF9GSUxFCisKKy8qIGRlZmluZSBpZiB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBuYW1lc3BhY2VzICovCisjdW5kZWYgSEFWRV9OQU1FU1BBQ0VTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORElSX0ggJHtIQVZFX05ESVJfSH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuZWFyYnlpbnRmJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX05FQVJCWUlOVEYgJHtIQVZFX05FQVJCWUlOVEZ9CisKKy8qIERlZmluZSBpZiB0aGUgbmVhdCBwcm9ncmFtIGlzIGF2YWlsYWJsZSAqLworI2NtYWtlZGVmaW5lIEhBVkVfTkVBVE8gJHtIQVZFX05FQVRPfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG9wZW5kaXInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfT1BFTkRJUgorCisvKiBEZWZpbmUgaWYgbGlidG9vbCBjYW4gZXh0cmFjdCBzeW1ib2wgbGlzdHMgZnJvbSBvYmplY3QgZmlsZXMuICovCisjdW5kZWYgSEFWRV9QUkVMT0FERURfU1lNQk9MUworCisvKiBEZWZpbmUgdG8gaGF2ZSB0aGUgJWEgZm9ybWF0IHN0cmluZyAqLworI3VuZGVmIEhBVkVfUFJJTlRGX0EKKworLyogSGF2ZSBwdGhyZWFkLmggKi8KKyNjbWFrZWRlZmluZSBIQVZFX1BUSFJFQURfSCAke0hBVkVfUFRIUkVBRF9IfQorCisvKiBIYXZlIHB0aHJlYWRfbXV0ZXhfbG9jayAqLworI2NtYWtlZGVmaW5lIEhBVkVfUFRIUkVBRF9NVVRFWF9MT0NLICR7SEFWRV9QVEhSRUFEX01VVEVYX0xPQ0t9CisKKy8qIEhhdmUgcHRocmVhZF9yd2xvY2tfaW5pdCAqLworI2NtYWtlZGVmaW5lIEhBVkVfUFRIUkVBRF9SV0xPQ0tfSU5JVCAke0hBVkVfUFRIUkVBRF9SV0xPQ0tfSU5JVH0KKworLyogSGF2ZSBwdGhyZWFkX2dldHNwZWNpZmljICovCisjY21ha2VkZWZpbmUgSEFWRV9QVEhSRUFEX0dFVFNQRUNJRklDICR7SEFWRV9QVEhSRUFEX0dFVFNQRUNJRklDfQorCisvKiBEZWZpbmUgdG8gMSBpZiBzcmFuZDQ4L2xyYW5kNDgvZHJhbmQ0OCBleGlzdCBpbiA8c3RkbGliLmg+ICovCisjdW5kZWYgSEFWRV9SQU5ENDgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByZWFkZGlyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1JFQURESVIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByZWFscGF0aCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9SRUFMUEFUSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJpbmRleCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9SSU5ERVgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByaW50ZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9SSU5URgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJvdW5kZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9ST1VOREYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByb3VuZCcgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9ST1VORCAke0hBVkVfUk9VTkR9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2JyaycgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9TQlJLICR7SEFWRV9TQlJLfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGVudicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9TRVRFTlYgJHtIQVZFX1NFVEVOVn0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRqbXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUSk1QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2V0am1wLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0VUSk1QX0ggJHtIQVZFX1NFVEpNUF9IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHJsaW1pdCcgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9TRVRSTElNSVQgJHtIQVZFX1NFVFJMSU1JVH0KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaGxfbG9hZCBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NITF9MT0FECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnbG9uZ2ptcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TSUdMT05HSk1QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2lnbmFsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0lHTkFMX0ggJHtIQVZFX1NJR05BTF9IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ3NldGptcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TSUdTRVRKTVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVERJTlRfSCAke0hBVkVfU1RESU5UX0h9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW8uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVERJT19IICR7SEFWRV9TVERJT19IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NURExJQl9IICR7SEFWRV9TVERMSUJfSH0KKworLyogRG9lcyBub3QgaGF2ZSBleHQvaGFzaF9tYXA+ICovCisjdW5kZWYgSEFWRV9TVERfRVhUX0hBU0hfTUFQCisKKy8qIERvZXMgbm90IGhhdmUgaGFzaF9zZXQgaW4gc3RkIG5hbWVzcGFjZSAqLworI3VuZGVmIEhBVkVfU1REX0VYVF9IQVNIX1NFVAorCisvKiBTZXQgdG8gMSBpZiB0aGUgc3RkOjppc2luZiBmdW5jdGlvbiBpcyBmb3VuZCBpbiA8Y21hdGg+ICovCisjdW5kZWYgSEFWRV9TVERfSVNJTkZfSU5fQ01BVEgKKworLyogU2V0IHRvIDEgaWYgdGhlIHN0ZDo6aXNuYW4gZnVuY3Rpb24gaXMgZm91bmQgaW4gPGNtYXRoPiAqLworI3VuZGVmIEhBVkVfU1REX0lTTkFOX0lOX0NNQVRICisKKy8qIERvZXMgbm90IGhhdmUgc3RkIG5hbWVzcGFjZSBpdGVyYXRvciAqLworI3VuZGVmIEhBVkVfU1REX0lURVJBVE9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2hyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNtcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJDTVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJkdXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSRFVQCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3InIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RSRVJST1IgJHtIQVZFX1NUUkVSUk9SfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yX3InIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RSRVJST1JfUiAke0hBVkVfU1RSRVJST1JfUn0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJlcnJvcl9zJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUkVSUk9SX1MgJHtIQVZFX1NUUkVSUk9SX1N9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUklOR19IICR7SEFWRV9TVFJJTkdfSH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJyY2hyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlJDSFIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2xsJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUlRPTEwgJHtIQVZFX1NUUlRPTEx9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9xJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlRPUQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN5c2NvbmYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1lTQ09ORgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLgorICAgKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19ESVJfSCAke0hBVkVfU1lTX0RJUl9IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19ETF9IICR7SEFWRV9TWVNfRExfSH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW9jdGwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfSU9DVExfSCAke0hBVkVfU1lTX0lPQ1RMX0h9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL21tYW4uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfTU1BTl9IICR7fQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4KKyAgICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfTkRJUl9IICR7SEFWRV9TWVNfTkRJUl9IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19QQVJBTV9IICR7SEFWRV9TWVNfUEFSQU1fSH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfUkVTT1VSQ0VfSCAke0hBVkVfU1lTX1JFU09VUkNFX0h9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU1RBVF9IICR7SEFWRV9TWVNfU1RBVF9IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAke0hBVkVfU1lTX1RJTUVfSH0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAke0hBVkVfU1lTX1RZUEVTX0h9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19XQUlUX0ggJHtIQVZFX1NZU19XQUlUX0h9CisKKy8qIERlZmluZSBpZiB0aGUgbmVhdCBwcm9ncmFtIGlzIGF2YWlsYWJsZSAqLworI2NtYWtlZGVmaW5lIEhBVkVfVFdPUEkgJHtIQVZFX1RXT1BJfQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgdWludDY0X3QnLiAqLworI3VuZGVmIEhBVkVfVUlOVDY0X1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0ZXJtaW9zLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfVEVSTUlPU19IICR7SEFWRV9URVJNSU9TX0h9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfVU5JU1REX0ggJHtIQVZFX1VOSVNURF9IfQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHV0aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfVVRJTUVfSCAke0hBVkVfVVRJTUVfSH0KKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVfaW50NjRfdCcuICovCisjdW5kZWYgSEFWRV9VX0lOVDY0X1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx2YWxncmluZC92YWxncmluZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1ZBTEdSSU5EX1ZBTEdSSU5EX0ggJHtIQVZFX1ZBTEdSSU5EX1ZBTEdSSU5EX0h9CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d2luZG93cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1dJTkRPV1NfSCAke0hBVkVfV0lORE9XU19IfQorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBiaW5hcnkgZXhlY3V0YWJsZXMgKi8KKyN1bmRlZiBMTFZNX0JJTkRJUgorCisvKiBUaW1lIGF0IHdoaWNoIExMVk0gd2FzIGNvbmZpZ3VyZWQgKi8KKyN1bmRlZiBMTFZNX0NPTkZJR1RJTUUKKworLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgZG9jdW1lbnRhdGlvbiAqLworI3VuZGVmIExMVk1fREFUQURJUgorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBjb25maWcgZmlsZXMgKi8KKyN1bmRlZiBMTFZNX0VUQ0RJUgorCisvKiBIb3N0IHRyaXBsZSB3ZSB3ZXJlIGJ1aWx0IG9uICovCisjY21ha2VkZWZpbmUgTExWTV9IT1NUVFJJUExFICIke0xMVk1fSE9TVFRSSVBMRX0iCisKKy8qIEluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGluY2x1ZGUgZmlsZXMgKi8KKyN1bmRlZiBMTFZNX0lOQ0xVREVESVIKKworLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgLmluZm8gZmlsZXMgKi8KKyN1bmRlZiBMTFZNX0lORk9ESVIKKworLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgbGlicmFyaWVzICovCisjdW5kZWYgTExWTV9MSUJESVIKKworLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgbWFuIHBhZ2VzICovCisjdW5kZWYgTExWTV9NQU5ESVIKKworLyogQnVpbGQgbXVsdGl0aHJlYWRpbmcgc3VwcG9ydCBpbnRvIExMVk0gKi8KKyNjbWFrZWRlZmluZSBMTFZNX01VTFRJVEhSRUFERUQgJHtMTFZNX01VTFRJVEhSRUFERUR9CisKKy8qIERlZmluZSBpZiB0aGlzIGlzIFVuaXhpc2ggcGxhdGZvcm0gKi8KKyNjbWFrZWRlZmluZSBMTFZNX09OX1VOSVggJHtMTFZNX09OX1VOSVh9CisKKy8qIERlZmluZSBpZiB0aGlzIGlzIFdpbjMyaXNoIHBsYXRmb3JtICovCisjY21ha2VkZWZpbmUgTExWTV9PTl9XSU4zMiAke0xMVk1fT05fV0lOMzJ9CisKKy8qIEFkZGVkIGJ5IEtldmluIC0tIE1heGltdW0gcGF0aCBsZW5ndGggKi8KKyNjbWFrZWRlZmluZSBNQVhQQVRITEVOICR7TUFYUEFUSExFTn0KKworLyogRGVmaW5lIHRvIHBhdGggdG8gY2lyY28gcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBjaXJjbycgb3RoZXJ3aXNlICovCisjY21ha2VkZWZpbmUgTExWTV9QQVRIX0NJUkNPICIke0xMVk1fUEFUSF9DSVJDT30iCisKKy8qIERlZmluZSB0byBwYXRoIHRvIGRvdCBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIGRvdCcgb3RoZXJ3aXNlICovCisjY21ha2VkZWZpbmUgTExWTV9QQVRIX0RPVCAiJHtMTFZNX1BBVEhfRE9UfSIKKworLyogRGVmaW5lIHRvIHBhdGggdG8gZG90dHkgcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBkb3R0eScgb3RoZXJ3aXNlICovCisjY21ha2VkZWZpbmUgTExWTV9QQVRIX0RPVFRZICIke0xMVk1fUEFUSF9ET1RUWX0iCisKKy8qIERlZmluZSB0byBwYXRoIHRvIGZkcCBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIGZkcCcgb3RoZXJ3aXNlICovCisjY21ha2VkZWZpbmUgTExWTV9QQVRIX0ZEUCAiJHtMTFZNX1BBVEhfRkRQfSIKKworLyogRGVmaW5lIHRvIHBhdGggdG8gR3JhcGh2aXogcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBHcmFwaHZpeicgb3RoZXJ3aXNlICovCisjdW5kZWYgTExWTV9QQVRIX0dSQVBIVklaCisKKy8qIERlZmluZSB0byBwYXRoIHRvIGd2IHByb2dyYW0gaWYgZm91bmQgb3IgJ2VjaG8gZ3YnIG90aGVyd2lzZSAqLworI2NtYWtlZGVmaW5lIExMVk1fUEFUSF9HViAiJHtMTFZNX1BBVEhfR1Z9IgorCisvKiBEZWZpbmUgdG8gcGF0aCB0byBuZWF0byBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIG5lYXRvJyBvdGhlcndpc2UgKi8KKyNjbWFrZWRlZmluZSBMTFZNX1BBVEhfTkVBVE8gIiR7TExWTV9QQVRIX05FQVRPfSIKKworLyogRGVmaW5lIHRvIHBhdGggdG8gdHdvcGkgcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyB0d29waScgb3RoZXJ3aXNlICovCisjY21ha2VkZWZpbmUgTExWTV9QQVRIX1RXT1BJICIke0xMVk1fUEFUSF9UV09QSX0iCisKKy8qIEluc3RhbGxhdGlvbiBwcmVmaXggZGlyZWN0b3J5ICovCisjY21ha2VkZWZpbmUgTExWTV9QUkVGSVggIiR7TExWTV9QUkVGSVh9IgorCisvKiBEZWZpbmUgaWYgdGhlIE9TIG5lZWRzIGhlbHAgdG8gbG9hZCBkZXBlbmRlbnQgbGlicmFyaWVzIGZvciBkbG9wZW4oKS4gKi8KKyNjbWFrZWRlZmluZSBMVERMX0RMT1BFTl9ERVBMSUJTICR7TFRETF9ETE9QRU5fREVQTElCU30KKworLyogRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy4KKyAgICovCisjdW5kZWYgTFRETF9PQkpESVIKKworLyogRGVmaW5lIHRvIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IGRldGVybWluZXMgdGhlIGR5bmFtaWMKKyAgIGxpYnJhcnkgc2VhcmNoIHBhdGguICovCisjY21ha2VkZWZpbmUgTFRETF9TSExJQlBBVEhfVkFSICIke0xURExfU0hMSUJQQVRIX1ZBUn0iCisKKy8qIERlZmluZSB0byB0aGUgZXh0ZW5zaW9uIHVzZWQgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHNheSwgIi5zbyIuICovCisjY21ha2VkZWZpbmUgTFRETF9TSExJQl9FWFQgIiR7TFRETF9TSExJQl9FWFR9IgorCisvKiBEZWZpbmUgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IGxpYnJhcnkgc2VhcmNoIHBhdGguICovCisjY21ha2VkZWZpbmUgTFRETF9TWVNTRUFSQ0hQQVRIICIke0xURExfU1lTU0VBUkNIUEFUSH0iCisKKy8qIERlZmluZSBpZiAvZGV2L3plcm8gc2hvdWxkIGJlIHVzZWQgd2hlbiBtYXBwaW5nIFJXWCBtZW1vcnksIG9yIHVuZGVmaW5lIGlmCisgICBpdHMgbm90IG5lY2Vzc2FyeSAqLworI3VuZGVmIE5FRURfREVWX1pFUk9fRk9SX01NQVAKKworLyogRGVmaW5lIGlmIGRsc3ltKCkgcmVxdWlyZXMgYSBsZWFkaW5nIHVuZGVyc2NvcmUgaW4gc3ltYm9sIG5hbWVzLiAqLworI3VuZGVmIE5FRURfVVNDT1JFCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIke1BBQ0tBR0VfQlVHUkVQT1JUfSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJHtQQUNLQUdFX05BTUV9IgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiR7UEFDS0FHRV9TVFJJTkd9IgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9UQVJOQU1FCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIke1BBQ0tBR0VfVkVSU0lPTn0iCisKKy8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChgaW50JyBvciBgdm9pZCcpLiAqLworI2NtYWtlZGVmaW5lIFJFVFNJR1RZUEUgJHtSRVRTSUdUWVBFfQorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bnRpbWUuCisJU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworCVNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcworCVNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBgU19JUyonIG1hY3JvcyBpbiA8c3lzL3N0YXQuaD4gZG8gbm90IHdvcmsgcHJvcGVybHkuICovCisjdW5kZWYgU1RBVF9NQUNST1NfQlJPS0VOCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gKi8KKyN1bmRlZiBUSU1FX1dJVEhfU1lTX1RJTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciA8c3lzL3RpbWUuaD4gZGVjbGFyZXMgYHN0cnVjdCB0bScuICovCisjdW5kZWYgVE1fSU5fU1lTX1RJTUUKKworLyogRGVmaW5lIGlmIHVzZSB1ZGlzODYgbGlicmFyeSAqLworI3VuZGVmIFVTRV9VRElTODYKKworLyogRGVmaW5lIHRvIDEgaWYgYGxleCcgZGVjbGFyZXMgYHl5dGV4dCcgYXMgYSBgY2hhciAqJyBieSBkZWZhdWx0LCBub3QgYQorICAgYGNoYXJbXScuICovCisjdW5kZWYgWVlURVhUX1BPSU5URVIKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIGBjb25zdCcgZG9lcyBub3QgY29uZm9ybSB0byBBTlNJIEMuICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIGEgdHlwZSB0byB1c2UgZm9yIGBlcnJvcl90JyBpZiBpdCBpcyBub3Qgb3RoZXJ3aXNlIGF2YWlsYWJsZS4gKi8KKyNjbWFrZWRlZmluZSBlcnJvcl90ICR7ZXJyb3JfdH0KKworLyogRGVmaW5lIHRvIGEgdHlwZSB0byB1c2UgZm9yIGBtb2RlX3QnIGlmIGl0IGlzIG5vdCBvdGhlcndpc2UgYXZhaWxhYmxlLiAqLworI2NtYWtlZGVmaW5lIG1vZGVfdCAke21vZGVfdH0KKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHBpZF90CisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBzaXplX3QKKworLyogRGVmaW5lIHRvIGEgZnVuY3Rpb24gcmVwbGFjaW5nIHN0cnRvbGwgKi8KKyNjbWFrZWRlZmluZSBzdHJ0b2xsICR7c3RydG9sbH0KKworLyogRGVmaW5lIHRvIGEgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHN0cnRvdWxsICovCisjY21ha2VkZWZpbmUgc3RydG91bGwgJHtzdHJ0b3VsbH0KKworLyogRGVmaW5lIHRvIGEgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHN0cmljbXAgKi8KKyNjbWFrZWRlZmluZSBzdHJpY21wICR7c3RyaWNtcH0KKworLyogRGVmaW5lIHRvIGEgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHN0cmR1cCAqLworI2NtYWtlZGVmaW5lIHN0cmR1cCAke3N0cmR1cH0KKworLyogTmF0aXZlIExMVk0gYXJjaGl0ZWN0dXJlICovCisjY21ha2VkZWZpbmUgTExWTV9OQVRJVkVfQVJDSCAke0xMVk1fTkFUSVZFX0FSQ0h9VGFyZ2V0CisKKy8qIE5hdGl2ZSBMTFZNIGFyY2hpdGVjdHVyZSwgc2hvcnQgbmFtZSAqLworI2NtYWtlZGVmaW5lIExMVk1fTkFUSVZFX0FSQ0hOQU1FICR7TExWTV9OQVRJVkVfQVJDSH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29uZmlnL2NvbmZpZy5oLmluIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9jb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGZiZmQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9jb25maWcuaC5pbgpAQCAtMCwwICsxLDYxNCBAQAorLyogaW5jbHVkZS9sbHZtL0NvbmZpZy9jb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGF1dG9jb25mL2NvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8NCisNCisjaWZuZGVmIENPTkZJR19IDQorI2RlZmluZSBDT05GSUdfSA0KKw0KKy8qIDMyIGJpdCBtdWx0aWxpYiBkaXJlY3RvcnkuICovDQorI3VuZGVmIENYWF9JTkNMVURFXzMyQklUX0RJUg0KKw0KKy8qIDY0IGJpdCBtdWx0aWxpYiBkaXJlY3RvcnkuICovDQorI3VuZGVmIENYWF9JTkNMVURFXzY0QklUX0RJUg0KKw0KKy8qIEFyY2ggdGhlIGxpYnN0ZGMrKyBoZWFkZXJzLiAqLw0KKyN1bmRlZiBDWFhfSU5DTFVERV9BUkNIDQorDQorLyogRGlyZWN0b3J5IHdpdGggdGhlIGxpYnN0ZGMrKyBoZWFkZXJzLiAqLw0KKyN1bmRlZiBDWFhfSU5DTFVERV9ST09UDQorDQorLyogRGlyZWN0b3JpZXMgY2xhbmcgd2lsbCBzZWFyY2ggZm9yIGhlYWRlcnMgKi8NCisjdW5kZWYgQ19JTkNMVURFX0RJUlMNCisNCisvKiBEZWZpbmUgaWYgQ0JFIGlzIGVuYWJsZWQgZm9yIHByaW50ZiAlYSBvdXRwdXQgKi8NCisjdW5kZWYgRU5BQkxFX0NCRV9QUklOVEZfQQ0KKw0KKy8qIERlZmluZSBpZiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIGlzIGVuYWJsZWQgKi8NCisjdW5kZWYgRU5BQkxFX1BJQw0KKw0KKy8qIERlZmluZSBpZiB0aHJlYWRzIGVuYWJsZWQgKi8NCisjdW5kZWYgRU5BQkxFX1RIUkVBRFMNCisNCisvKiBEZWZpbmUgaWYgdGltZXN0YW1wIGluZm9ybWF0aW9uIChlLmcuLCBfX0RBVEVfX18pIGlzIGFsbG93ZWQgKi8NCisjdW5kZWYgRU5BQkxFX1RJTUVTVEFNUFMNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyZ3pfYXBwZW5kJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9BUkdaX0FQUEVORA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXJnel9jcmVhdGVfc2VwJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9BUkdaX0NSRUFURV9TRVANCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICovDQorI3VuZGVmIEhBVkVfQVJHWl9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhcmd6X2luc2VydCcgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfQVJHWl9JTlNFUlQNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyZ3pfbmV4dCcgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfQVJHWl9ORVhUDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhcmd6X3N0cmluZ2lmeScgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfQVJHWl9TVFJJTkdJRlkNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFzc2VydC5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9BU1NFUlRfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYmFja3RyYWNlJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9CQUNLVFJBQ0UNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJjb3B5JyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9CQ09QWQ0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY2VpbGYnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX0NFSUxGDQorDQorLyogRGVmaW5lIGlmIHRoZSBuZWF0IHByb2dyYW0gaXMgYXZhaWxhYmxlICovDQorI3VuZGVmIEhBVkVfQ0lSQ08NCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNsb3NlZGlyJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9DTE9TRURJUg0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Q3Jhc2hSZXBvcnRlckNsaWVudC5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9DUkFTSFJFUE9SVEVSQ0xJRU5UX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGN0eXBlLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX0NUWVBFX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuDQorICAgKi8NCisjdW5kZWYgSEFWRV9ESVJFTlRfSA0KKw0KKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgR05VIGRsZCBsaWJyYXJ5LiAqLw0KKyN1bmRlZiBIQVZFX0RMRA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxkLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX0RMRF9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBkbGVycm9yJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9ETEVSUk9SDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9ETEZDTl9IDQorDQorLyogRGVmaW5lIGlmIGRsb3BlbigpIGlzIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLiAqLw0KKyN1bmRlZiBIQVZFX0RMT1BFTg0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGwuaD4gaGVhZGVyIGZpbGUuICovDQorI3VuZGVmIEhBVkVfRExfSA0KKw0KKy8qIERlZmluZSBpZiB0aGUgZG90IHByb2dyYW0gaXMgYXZhaWxhYmxlICovDQorI3VuZGVmIEhBVkVfRE9UDQorDQorLyogRGVmaW5lIGlmIHRoZSBkb3R0eSBwcm9ncmFtIGlzIGF2YWlsYWJsZSAqLw0KKyN1bmRlZiBIQVZFX0RPVFRZDQorDQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfZHlsZF9mdW5jX2xvb2t1cCBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9EWUxEDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9FUlJOT19IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGVycm9yX3QnLiAqLw0KKyN1bmRlZiBIQVZFX0VSUk9SX1QNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGV4ZWNpbmZvLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX0VYRUNJTkZPX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX0ZDTlRMX0gNCisNCisvKiBEZWZpbmUgaWYgdGhlIG5lYXQgcHJvZ3JhbSBpcyBhdmFpbGFibGUgKi8NCisjdW5kZWYgSEFWRV9GRFANCisNCisvKiBEZWZpbmUgaWYgbGliZmZpIGlzIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLiAqLw0KKyN1bmRlZiBIQVZFX0ZGSV9DQUxMDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmZmkvZmZpLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX0ZGSV9GRklfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmZpLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX0ZGSV9IDQorDQorLyogU2V0IHRvIDEgaWYgdGhlIGZpbml0ZSBmdW5jdGlvbiBpcyBmb3VuZCBpbiA8aWVlZWZwLmg+ICovDQorI3VuZGVmIEhBVkVfRklOSVRFX0lOX0lFRUVGUF9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbG9vcmYnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX0ZMT09SRg0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZm1vZGYnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX0ZNT0RGDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX0dFVENXRA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGFnZXNpemUnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRybGltaXQnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX0dFVFJMSU1JVA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cnVzYWdlJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UNCisNCisvKiBIYXZlIERhcndpbiBnZXRzZWN0KCkgc3VwcG9ydCAqLw0KKyN1bmRlZiBIQVZFX0dFVFNFQ1QNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHRpbWVvZmRheScgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZDQorDQorLyogRGVmaW5lIGlmIHRoZSBHcmFwaHZpeiBwcm9ncmFtIGlzIGF2YWlsYWJsZSAqLw0KKyN1bmRlZiBIQVZFX0dSQVBIVklaDQorDQorLyogRGVmaW5lIGlmIHRoZSBndiBwcm9ncmFtIGlzIGF2YWlsYWJsZSAqLw0KKyN1bmRlZiBIQVZFX0dWDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbmRleCcgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfSU5ERVgNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgaW50NjRfdCcuICovDQorI3VuZGVmIEhBVkVfSU5UNjRfVA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovDQorI3VuZGVmIEhBVkVfSU5UVFlQRVNfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNhdHR5JyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9JU0FUVFkNCisNCisvKiBTZXQgdG8gMSBpZiB0aGUgaXNpbmYgZnVuY3Rpb24gaXMgZm91bmQgaW4gPGNtYXRoPiAqLw0KKyN1bmRlZiBIQVZFX0lTSU5GX0lOX0NNQVRIDQorDQorLyogU2V0IHRvIDEgaWYgdGhlIGlzaW5mIGZ1bmN0aW9uIGlzIGZvdW5kIGluIDxtYXRoLmg+ICovDQorI3VuZGVmIEhBVkVfSVNJTkZfSU5fTUFUSF9IDQorDQorLyogU2V0IHRvIDEgaWYgdGhlIGlzbmFuIGZ1bmN0aW9uIGlzIGZvdW5kIGluIDxjbWF0aD4gKi8NCisjdW5kZWYgSEFWRV9JU05BTl9JTl9DTUFUSA0KKw0KKy8qIFNldCB0byAxIGlmIHRoZSBpc25hbiBmdW5jdGlvbiBpcyBmb3VuZCBpbiA8bWF0aC5oPiAqLw0KKyN1bmRlZiBIQVZFX0lTTkFOX0lOX01BVEhfSA0KKw0KKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbGliZGwgbGlicmFyeSBvciBlcXVpdmFsZW50LiAqLw0KKyN1bmRlZiBIQVZFX0xJQkRMDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbWFnZWhscCcgbGlicmFyeSAoLWxpbWFnZWhscCkuICovDQorI3VuZGVmIEhBVkVfTElCSU1BR0VITFANCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG0nIGxpYnJhcnkgKC1sbSkuICovDQorI3VuZGVmIEhBVkVfTElCTQ0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHNhcGknIGxpYnJhcnkgKC1scHNhcGkpLiAqLw0KKyN1bmRlZiBIQVZFX0xJQlBTQVBJDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwdGhyZWFkJyBsaWJyYXJ5ICgtbHB0aHJlYWQpLiAqLw0KKyN1bmRlZiBIQVZFX0xJQlBUSFJFQUQNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHVkaXM4NicgbGlicmFyeSAoLWx1ZGlzODYpLiAqLw0KKyN1bmRlZiBIQVZFX0xJQlVESVM4Ng0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX0xJTUlUU19IDQorDQorLyogRGVmaW5lIGlmIHlvdSBjYW4gdXNlIC1XbCwtZXhwb3J0LWR5bmFtaWMuICovDQorI3VuZGVmIEhBVkVfTElOS19FWFBPUlRfRFlOQU1JQw0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGluay5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9MSU5LX0gNCisNCisvKiBEZWZpbmUgaWYgeW91IGNhbiB1c2UgLVdsLC1SLiB0byBwYXNzIC1SLiB0byB0aGUgbGlua2VyLCBpbiBvcmRlciB0byBhZGQNCisgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIGR5bmFtaWMgbGlua2VyIHNlYXJjaCBwYXRoLiAqLw0KKyN1bmRlZiBIQVZFX0xJTktfUg0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9uZ2ptcCcgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfTE9OR0pNUA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFjaC9tYWNoLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX01BQ0hfTUFDSF9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoLW8vZHlsZC5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9NQUNIX09fRFlMRF9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoLW8vZ2V0c2VjdC5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9NQUNIX09fR0VUU0VDVF9IDQorDQorLyogRGVmaW5lIGlmIG1hbGxpbmZvKCkgaXMgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uICovDQorI3VuZGVmIEhBVkVfTUFMTElORk8NCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9NQUxMT0NfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jL21hbGxvYy5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9NQUxMT0NfTUFMTE9DX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1hbGxvY196b25lX3N0YXRpc3RpY3MnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX01BTExPQ19aT05FX1NUQVRJU1RJQ1MNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbWNweScgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfTUVNQ1BZDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1tb3ZlJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9NRU1NT1ZFDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovDQorI3VuZGVmIEhBVkVfTUVNT1JZX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rZHRlbXAnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX01LRFRFTVANCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rc3RlbXAnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX01LU1RFTVANCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rdGVtcCcgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfTUtURU1QDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gKi8NCisjdW5kZWYgSEFWRV9NTUFQDQorDQorLyogRGVmaW5lIGlmIG1tYXAoKSB1c2VzIE1BUF9BTk9OWU1PVVMgdG8gbWFwIGFub255bW91cyBwYWdlcywgb3IgdW5kZWZpbmUgaWYNCisgICBpdCB1c2VzIE1BUF9BTk9OICovDQorI3VuZGVmIEhBVkVfTU1BUF9BTk9OWU1PVVMNCisNCisvKiBEZWZpbmUgaWYgbW1hcCgpIGNhbiBtYXAgZmlsZXMgaW50byBtZW1vcnkgKi8NCisjdW5kZWYgSEFWRV9NTUFQX0ZJTEUNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLiAqLw0KKyN1bmRlZiBIQVZFX05ESVJfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbmVhcmJ5aW50ZicgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfTkVBUkJZSU5URg0KKw0KKy8qIERlZmluZSBpZiB0aGUgbmVhdCBwcm9ncmFtIGlzIGF2YWlsYWJsZSAqLw0KKyN1bmRlZiBIQVZFX05FQVRPDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvcGVuZGlyJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9PUEVORElSDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb3NpeF9zcGF3bicgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfUE9TSVhfU1BBV04NCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBvd2YnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX1BPV0YNCisNCisvKiBEZWZpbmUgaWYgbGlidG9vbCBjYW4gZXh0cmFjdCBzeW1ib2wgbGlzdHMgZnJvbSBvYmplY3QgZmlsZXMuICovDQorI3VuZGVmIEhBVkVfUFJFTE9BREVEX1NZTUJPTFMNCisNCisvKiBEZWZpbmUgdG8gaGF2ZSB0aGUgJWEgZm9ybWF0IHN0cmluZyAqLw0KKyN1bmRlZiBIQVZFX1BSSU5URl9BDQorDQorLyogSGF2ZSBwdGhyZWFkX2dldHNwZWNpZmljICovDQorI3VuZGVmIEhBVkVfUFRIUkVBRF9HRVRTUEVDSUZJQw0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cHRocmVhZC5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9QVEhSRUFEX0gNCisNCisvKiBIYXZlIHB0aHJlYWRfbXV0ZXhfbG9jayAqLw0KKyN1bmRlZiBIQVZFX1BUSFJFQURfTVVURVhfTE9DSw0KKw0KKy8qIEhhdmUgcHRocmVhZF9yd2xvY2tfaW5pdCAqLw0KKyN1bmRlZiBIQVZFX1BUSFJFQURfUldMT0NLX0lOSVQNCisNCisvKiBEZWZpbmUgdG8gMSBpZiBzcmFuZDQ4L2xyYW5kNDgvZHJhbmQ0OCBleGlzdCBpbiA8c3RkbGliLmg+ICovDQorI3VuZGVmIEhBVkVfUkFORDQ4DQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByZWFkZGlyJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9SRUFERElSDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByZWFscGF0aCcgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfUkVBTFBBVEgNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJpbmRleCcgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfUklOREVYDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByaW50ZicgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfUklOVEYNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJvdW5kJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9ST1VORA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcm91bmRmJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9ST1VOREYNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNicmsnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX1NCUksNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGVudicgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfU0VURU5WDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRqbXAnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX1NFVEpNUA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2V0am1wLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX1NFVEpNUF9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRybGltaXQnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX1NFVFJMSU1JVA0KKw0KKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2hsX2xvYWQgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfU0hMX0xPQUQNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ2xvbmdqbXAnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX1NJR0xPTkdKTVANCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9TSUdOQUxfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnc2V0am1wJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9TSUdTRVRKTVANCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9TVERJTlRfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW8uaD4gaGVhZGVyIGZpbGUuICovDQorI3VuZGVmIEhBVkVfU1RESU9fSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX1NURExJQl9IDQorDQorLyogU2V0IHRvIDEgaWYgdGhlIHN0ZDo6aXNpbmYgZnVuY3Rpb24gaXMgZm91bmQgaW4gPGNtYXRoPiAqLw0KKyN1bmRlZiBIQVZFX1NURF9JU0lORl9JTl9DTUFUSA0KKw0KKy8qIFNldCB0byAxIGlmIHRoZSBzdGQ6OmlzbmFuIGZ1bmN0aW9uIGlzIGZvdW5kIGluIDxjbWF0aD4gKi8NCisjdW5kZWYgSEFWRV9TVERfSVNOQU5fSU5fQ01BVEgNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNocicgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfU1RSQ0hSDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjbXAnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX1NUUkNNUA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZHVwJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9TVFJEVVANCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9TVFJFUlJPUg0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JfcicgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfU1RSRVJST1JfUg0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JfcycgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfU1RSRVJST1JfUw0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9TVFJJTkdfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RycmNocicgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfU1RSUkNIUg0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9mJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9TVFJUT0YNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbGwnIGZ1bmN0aW9uLiAqLw0KKyN1bmRlZiBIQVZFX1NUUlRPTEwNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvcScgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfU1RSVE9RDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzeXNjb25mJyBmdW5jdGlvbi4gKi8NCisjdW5kZWYgSEFWRV9TWVNDT05GDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4NCisgICAqLw0KKyN1bmRlZiBIQVZFX1NZU19ESVJfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2RsLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX1NZU19ETF9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW9jdGwuaD4gaGVhZGVyIGZpbGUuICovDQorI3VuZGVmIEhBVkVfU1lTX0lPQ1RMX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tbWFuLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX1NZU19NTUFOX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4NCisgICAqLw0KKyN1bmRlZiBIQVZFX1NZU19ORElSX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9TWVNfUEFSQU1fSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLw0KKyN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9TWVNfU1RBVF9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9TWVNfVElNRV9IDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovDQorI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuICovDQorI3VuZGVmIEhBVkVfU1lTX1dBSVRfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dGVybWlvcy5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9URVJNSU9TX0gNCisNCisvKiBEZWZpbmUgaWYgdGhlIG5lYXQgcHJvZ3JhbSBpcyBhdmFpbGFibGUgKi8NCisjdW5kZWYgSEFWRV9UV09QSQ0KKw0KKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1aW50NjRfdCcuICovDQorI3VuZGVmIEhBVkVfVUlOVDY0X1QNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9VTklTVERfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dXRpbWUuaD4gaGVhZGVyIGZpbGUuICovDQorI3VuZGVmIEhBVkVfVVRJTUVfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1X2ludDY0X3QnLiAqLw0KKyN1bmRlZiBIQVZFX1VfSU5UNjRfVA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dmFsZ3JpbmQvdmFsZ3JpbmQuaD4gaGVhZGVyIGZpbGUuICovDQorI3VuZGVmIEhBVkVfVkFMR1JJTkRfVkFMR1JJTkRfSA0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d2luZG93cy5oPiBoZWFkZXIgZmlsZS4gKi8NCisjdW5kZWYgSEFWRV9XSU5ET1dTX0gNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9fZHNvX2hhbmRsZScgZnVuY3Rpb24uICovDQorI3VuZGVmIEhBVkVfX19EU09fSEFORExFDQorDQorLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgYmluYXJ5IGV4ZWN1dGFibGVzICovDQorI3VuZGVmIExMVk1fQklORElSDQorDQorLyogVGltZSBhdCB3aGljaCBMTFZNIHdhcyBjb25maWd1cmVkICovDQorI3VuZGVmIExMVk1fQ09ORklHVElNRQ0KKw0KKy8qIEluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGRhdGEgZmlsZXMgKi8NCisjdW5kZWYgTExWTV9EQVRBRElSDQorDQorLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgZG9jdW1lbnRhdGlvbiAqLw0KKyN1bmRlZiBMTFZNX0RPQ1NESVINCisNCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBjb25maWcgZmlsZXMgKi8NCisjdW5kZWYgTExWTV9FVENESVINCisNCisvKiBIb3N0IHRyaXBsZSB3ZSB3ZXJlIGJ1aWx0IG9uICovDQorI3VuZGVmIExMVk1fSE9TVFRSSVBMRQ0KKw0KKy8qIEluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGluY2x1ZGUgZmlsZXMgKi8NCisjdW5kZWYgTExWTV9JTkNMVURFRElSDQorDQorLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgLmluZm8gZmlsZXMgKi8NCisjdW5kZWYgTExWTV9JTkZPRElSDQorDQorLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgbGlicmFyaWVzICovDQorI3VuZGVmIExMVk1fTElCRElSDQorDQorLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgbWFuIHBhZ2VzICovDQorI3VuZGVmIExMVk1fTUFORElSDQorDQorLyogQnVpbGQgbXVsdGl0aHJlYWRpbmcgc3VwcG9ydCBpbnRvIExMVk0gKi8NCisjdW5kZWYgTExWTV9NVUxUSVRIUkVBREVEDQorDQorLyogTExWTSBhcmNoaXRlY3R1cmUgbmFtZSBmb3IgdGhlIG5hdGl2ZSBhcmNoaXRlY3R1cmUsIGlmIGF2YWlsYWJsZSAqLw0KKyN1bmRlZiBMTFZNX05BVElWRV9BUkNIDQorDQorLyogU2hvcnQgTExWTSBhcmNoaXRlY3R1cmUgbmFtZSBmb3IgdGhlIG5hdGl2ZSBhcmNoaXRlY3R1cmUsIGlmIGF2YWlsYWJsZSAqLw0KKyN1bmRlZiBMTFZNX05BVElWRV9BUkNITkFNRQ0KKw0KKy8qIERlZmluZSBpZiB0aGlzIGlzIFVuaXhpc2ggcGxhdGZvcm0gKi8NCisjdW5kZWYgTExWTV9PTl9VTklYDQorDQorLyogRGVmaW5lIGlmIHRoaXMgaXMgV2luMzJpc2ggcGxhdGZvcm0gKi8NCisjdW5kZWYgTExWTV9PTl9XSU4zMg0KKw0KKy8qIERlZmluZSB0byBwYXRoIHRvIGNpcmNvIHByb2dyYW0gaWYgZm91bmQgb3IgJ2VjaG8gY2lyY28nIG90aGVyd2lzZSAqLw0KKyN1bmRlZiBMTFZNX1BBVEhfQ0lSQ08NCisNCisvKiBEZWZpbmUgdG8gcGF0aCB0byBkb3QgcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBkb3QnIG90aGVyd2lzZSAqLw0KKyN1bmRlZiBMTFZNX1BBVEhfRE9UDQorDQorLyogRGVmaW5lIHRvIHBhdGggdG8gZG90dHkgcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBkb3R0eScgb3RoZXJ3aXNlICovDQorI3VuZGVmIExMVk1fUEFUSF9ET1RUWQ0KKw0KKy8qIERlZmluZSB0byBwYXRoIHRvIGZkcCBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIGZkcCcgb3RoZXJ3aXNlICovDQorI3VuZGVmIExMVk1fUEFUSF9GRFANCisNCisvKiBEZWZpbmUgdG8gcGF0aCB0byBHcmFwaHZpeiBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIEdyYXBodml6JyBvdGhlcndpc2UgKi8NCisjdW5kZWYgTExWTV9QQVRIX0dSQVBIVklaDQorDQorLyogRGVmaW5lIHRvIHBhdGggdG8gZ3YgcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBndicgb3RoZXJ3aXNlICovDQorI3VuZGVmIExMVk1fUEFUSF9HVg0KKw0KKy8qIERlZmluZSB0byBwYXRoIHRvIG5lYXRvIHByb2dyYW0gaWYgZm91bmQgb3IgJ2VjaG8gbmVhdG8nIG90aGVyd2lzZSAqLw0KKyN1bmRlZiBMTFZNX1BBVEhfTkVBVE8NCisNCisvKiBEZWZpbmUgdG8gcGF0aCB0byB0d29waSBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIHR3b3BpJyBvdGhlcndpc2UgKi8NCisjdW5kZWYgTExWTV9QQVRIX1RXT1BJDQorDQorLyogSW5zdGFsbGF0aW9uIHByZWZpeCBkaXJlY3RvcnkgKi8NCisjdW5kZWYgTExWTV9QUkVGSVgNCisNCisvKiBEZWZpbmUgaWYgdGhlIE9TIG5lZWRzIGhlbHAgdG8gbG9hZCBkZXBlbmRlbnQgbGlicmFyaWVzIGZvciBkbG9wZW4oKS4gKi8NCisjdW5kZWYgTFRETF9ETE9QRU5fREVQTElCUw0KKw0KKy8qIERlZmluZSB0byB0aGUgc3ViLWRpcmVjdG9yeSBpbiB3aGljaCBsaWJ0b29sIHN0b3JlcyB1bmluc3RhbGxlZCBsaWJyYXJpZXMuDQorICAgKi8NCisjdW5kZWYgTFRETF9PQkpESVINCisNCisvKiBEZWZpbmUgdG8gdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgZHluYW1pYw0KKyAgIGxpYnJhcnkgc2VhcmNoIHBhdGguICovDQorI3VuZGVmIExURExfU0hMSUJQQVRIX1ZBUg0KKw0KKy8qIERlZmluZSB0byB0aGUgZXh0ZW5zaW9uIHVzZWQgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHNheSwgIi5zbyIuICovDQorI3VuZGVmIExURExfU0hMSUJfRVhUDQorDQorLyogRGVmaW5lIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAqLw0KKyN1bmRlZiBMVERMX1NZU1NFQVJDSFBBVEgNCisNCisvKiBEZWZpbmUgaWYgL2Rldi96ZXJvIHNob3VsZCBiZSB1c2VkIHdoZW4gbWFwcGluZyBSV1ggbWVtb3J5LCBvciB1bmRlZmluZSBpZg0KKyAgIGl0cyBub3QgbmVjZXNzYXJ5ICovDQorI3VuZGVmIE5FRURfREVWX1pFUk9fRk9SX01NQVANCisNCisvKiBEZWZpbmUgaWYgZGxzeW0oKSByZXF1aXJlcyBhIGxlYWRpbmcgdW5kZXJzY29yZSBpbiBzeW1ib2wgbmFtZXMuICovDQorI3VuZGVmIE5FRURfVVNDT1JFDQorDQorLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovDQorI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUDQorDQorLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLw0KKyN1bmRlZiBQQUNLQUdFX05BTUUNCisNCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovDQorI3VuZGVmIFBBQ0tBR0VfU1RSSU5HDQorDQorLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLw0KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUNCisNCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLw0KKyN1bmRlZiBQQUNLQUdFX1ZFUlNJT04NCisNCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoYGludCcgb3IgYHZvaWQnKS4gKi8NCisjdW5kZWYgUkVUU0lHVFlQRQ0KKw0KKy8qIERlZmluZSB0byAxIGlmIHRoZSBgU19JUyonIG1hY3JvcyBpbiA8c3lzL3N0YXQuaD4gZG8gbm90IHdvcmsgcHJvcGVybHkuICovDQorI3VuZGVmIFNUQVRfTUFDUk9TX0JST0tFTg0KKw0KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLw0KKyN1bmRlZiBTVERDX0hFQURFUlMNCisNCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gKi8NCisjdW5kZWYgVElNRV9XSVRIX1NZU19USU1FDQorDQorLyogRGVmaW5lIHRvIDEgaWYgeW91ciA8c3lzL3RpbWUuaD4gZGVjbGFyZXMgYHN0cnVjdCB0bScuICovDQorI3VuZGVmIFRNX0lOX1NZU19USU1FDQorDQorLyogRGVmaW5lIGlmIHdlIGhhdmUgdGhlIG9wcm9maWxlIEpJVC1zdXBwb3J0IGxpYnJhcnkgKi8NCisjdW5kZWYgVVNFX09QUk9GSUxFDQorDQorLyogRGVmaW5lIGlmIHVzZSB1ZGlzODYgbGlicmFyeSAqLw0KKyN1bmRlZiBVU0VfVURJUzg2DQorDQorLyogRGVmaW5lIHRvIGVtcHR5IGlmIGBjb25zdCcgZG9lcyBub3QgY29uZm9ybSB0byBBTlNJIEMuICovDQorI3VuZGVmIGNvbnN0DQorDQorLyogRGVmaW5lIHRvIGEgdHlwZSB0byB1c2UgZm9yIGBlcnJvcl90JyBpZiBpdCBpcyBub3Qgb3RoZXJ3aXNlIGF2YWlsYWJsZS4gKi8NCisjdW5kZWYgZXJyb3JfdA0KKw0KKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8NCisjdW5kZWYgcGlkX3QNCisNCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovDQorI3VuZGVmIHNpemVfdA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db25maWcvbGx2bS1jb25maWcuaC5pbiBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db25maWcvbGx2bS1jb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzU4NTllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oLmluCkBAIC0wLDAgKzEsOTEgQEAKKy8qPT09LS0gbGx2bS9jb25maWcvbGx2bS1jb25maWcuaCAtIGxsdm0gY29uZmlndXJlIHZhcmlhYmxlIC0tLS0tLS0qLSBDIC0qLT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqLworLyogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKiBUaGlzIGZpbGUgZW51bWVyYXRlcyBhbGwgb2YgdGhlIGxsdm0gdmFyaWFibGVzIGZyb20gY29uZmlndXJlIHNvIHRoYXQKKyAgIHRoZXkgY2FuIGJlIGluIGV4cG9ydGVkIGhlYWRlcnMgYW5kIHdvbid0IG92ZXJyaWRlIHBhY2thZ2Ugc3BlY2lmaWMKKyAgIGRpcmVjdGl2ZXMuICBUaGlzIGlzIGEgQyBmaWxlIHNvIHdlIGNhbiBpbmNsdWRlIGl0IGluIHRoZSBsbHZtLWMgaGVhZGVycy4gICovCisKKy8qIFRvIGF2b2lkIG11bHRpcGxlIGluY2x1c2lvbnMgb2YgdGhlc2UgdmFyaWFibGVzIHdoZW4gd2UgaW5jbHVkZSB0aGUgZXhwb3J0ZWQKKyAgIGhlYWRlcnMgYW5kIGNvbmZpZy5oLCBjb25kaXRpb25hbGx5IGluY2x1ZGUgdGhlc2UuICAqLworLyogVE9ETzogVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2suICAqLworI2lmbmRlZiBDT05GSUdfSAorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBiaW5hcnkgZXhlY3V0YWJsZXMgKi8KKyN1bmRlZiBMTFZNX0JJTkRJUgorCisvKiBUaW1lIGF0IHdoaWNoIExMVk0gd2FzIGNvbmZpZ3VyZWQgKi8KKyN1bmRlZiBMTFZNX0NPTkZJR1RJTUUKKworLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgZGF0YSBmaWxlcyAqLworI3VuZGVmIExMVk1fREFUQURJUgorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBkb2N1bWVudGF0aW9uICovCisjdW5kZWYgTExWTV9ET0NTRElSCisKKy8qIEluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGNvbmZpZyBmaWxlcyAqLworI3VuZGVmIExMVk1fRVRDRElSCisKKy8qIEhvc3QgdHJpcGxlIHdlIHdlcmUgYnVpbHQgb24gKi8KKyN1bmRlZiBMTFZNX0hPU1RUUklQTEUKKworLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgaW5jbHVkZSBmaWxlcyAqLworI3VuZGVmIExMVk1fSU5DTFVERURJUgorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciAuaW5mbyBmaWxlcyAqLworI3VuZGVmIExMVk1fSU5GT0RJUgorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBsaWJyYXJpZXMgKi8KKyN1bmRlZiBMTFZNX0xJQkRJUgorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBtYW4gcGFnZXMgKi8KKyN1bmRlZiBMTFZNX01BTkRJUgorCisvKiBCdWlsZCBtdWx0aXRocmVhZGluZyBzdXBwb3J0IGludG8gTExWTSAqLworI3VuZGVmIExMVk1fTVVMVElUSFJFQURFRAorCisvKiBMTFZNIGFyY2hpdGVjdHVyZSBuYW1lIGZvciB0aGUgbmF0aXZlIGFyY2hpdGVjdHVyZSwgaWYgYXZhaWxhYmxlICovCisjdW5kZWYgTExWTV9OQVRJVkVfQVJDSAorCisvKiBTaG9ydCBMTFZNIGFyY2hpdGVjdHVyZSBuYW1lIGZvciB0aGUgbmF0aXZlIGFyY2hpdGVjdHVyZSwgaWYgYXZhaWxhYmxlICovCisjdW5kZWYgTExWTV9OQVRJVkVfQVJDSE5BTUUKKworLyogRGVmaW5lIGlmIHRoaXMgaXMgVW5peGlzaCBwbGF0Zm9ybSAqLworI3VuZGVmIExMVk1fT05fVU5JWAorCisvKiBEZWZpbmUgaWYgdGhpcyBpcyBXaW4zMmlzaCBwbGF0Zm9ybSAqLworI3VuZGVmIExMVk1fT05fV0lOMzIKKworLyogRGVmaW5lIHRvIHBhdGggdG8gY2lyY28gcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBjaXJjbycgb3RoZXJ3aXNlICovCisjdW5kZWYgTExWTV9QQVRIX0NJUkNPCisKKy8qIERlZmluZSB0byBwYXRoIHRvIGRvdCBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIGRvdCcgb3RoZXJ3aXNlICovCisjdW5kZWYgTExWTV9QQVRIX0RPVAorCisvKiBEZWZpbmUgdG8gcGF0aCB0byBkb3R0eSBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIGRvdHR5JyBvdGhlcndpc2UgKi8KKyN1bmRlZiBMTFZNX1BBVEhfRE9UVFkKKworLyogRGVmaW5lIHRvIHBhdGggdG8gZmRwIHByb2dyYW0gaWYgZm91bmQgb3IgJ2VjaG8gZmRwJyBvdGhlcndpc2UgKi8KKyN1bmRlZiBMTFZNX1BBVEhfRkRQCisKKy8qIERlZmluZSB0byBwYXRoIHRvIEdyYXBodml6IHByb2dyYW0gaWYgZm91bmQgb3IgJ2VjaG8gR3JhcGh2aXonIG90aGVyd2lzZSAqLworI3VuZGVmIExMVk1fUEFUSF9HUkFQSFZJWgorCisvKiBEZWZpbmUgdG8gcGF0aCB0byBndiBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIGd2JyBvdGhlcndpc2UgKi8KKyN1bmRlZiBMTFZNX1BBVEhfR1YKKworLyogRGVmaW5lIHRvIHBhdGggdG8gbmVhdG8gcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBuZWF0bycgb3RoZXJ3aXNlICovCisjdW5kZWYgTExWTV9QQVRIX05FQVRPCisKKy8qIERlZmluZSB0byBwYXRoIHRvIHR3b3BpIHByb2dyYW0gaWYgZm91bmQgb3IgJ2VjaG8gdHdvcGknIG90aGVyd2lzZSAqLworI3VuZGVmIExMVk1fUEFUSF9UV09QSQorCisvKiBJbnN0YWxsYXRpb24gcHJlZml4IGRpcmVjdG9yeSAqLworI3VuZGVmIExMVk1fUFJFRklYCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbnN0YW50LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29uc3RhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjQ3Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0NvbnN0YW50LmgKQEAgLTAsMCArMSwxNTkgQEAKKy8vPT09LS0gbGx2bS9Db25zdGFudC5oIC0gQ29uc3RhbnQgY2xhc3MgZGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgQ29uc3RhbnQgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPTlNUQU5UX0gKKyNkZWZpbmUgTExWTV9DT05TVEFOVF9ICisKKyNpbmNsdWRlICJsbHZtL1VzZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBUEludDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CisgIGNsYXNzIExMVk1Db250ZXh0OworCisvLy8gVGhpcyBpcyBhbiBpbXBvcnRhbnQgYmFzZSBjbGFzcyBpbiBMTFZNLiBJdCBwcm92aWRlcyB0aGUgY29tbW9uIGZhY2lsaXRpZXMKKy8vLyBvZiBhbGwgY29uc3RhbnQgdmFsdWVzIGluIGFuIExMVk0gcHJvZ3JhbS4gQSBjb25zdGFudCBpcyBhIHZhbHVlIHRoYXQgaXMKKy8vLyBpbW11dGFibGUgYXQgcnVudGltZS4gRnVuY3Rpb25zIGFyZSBjb25zdGFudHMgYmVjYXVzZSB0aGVpciBhZGRyZXNzIGlzCisvLy8gaW1tdXRhYmxlLiBTYW1lIHdpdGggZ2xvYmFsIHZhcmlhYmxlcy4gCisvLy8gCisvLy8gQWxsIGNvbnN0YW50cyBzaGFyZSB0aGUgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuIEFsbCBjb25zdGFudHMKKy8vLyBjYW4gaGF2ZSBhIG51bGwgdmFsdWUuIFRoZXkgY2FuIGhhdmUgYW4gb3BlcmFuZCBsaXN0LiBDb25zdGFudHMgY2FuIGJlCisvLy8gc2ltcGxlIChpbnRlZ2VyIGFuZCBmbG9hdGluZyBwb2ludCB2YWx1ZXMpLCBjb21wbGV4IChhcnJheXMgYW5kIHN0cnVjdHVyZXMpLAorLy8vIG9yIGV4cHJlc3Npb24gYmFzZWQgKGNvbXB1dGF0aW9ucyB5aWVsZGluZyBhIGNvbnN0YW50IHZhbHVlIGNvbXBvc2VkIG9mIAorLy8vIG9ubHkgY2VydGFpbiBvcGVyYXRvcnMgYW5kIG90aGVyIGNvbnN0YW50IHZhbHVlcykuCisvLy8gCisvLy8gTm90ZSB0aGF0IENvbnN0YW50cyBhcmUgaW1tdXRhYmxlIChvbmNlIGNyZWF0ZWQgdGhleSBuZXZlciBjaGFuZ2UpIAorLy8vIGFuZCBhcmUgZnVsbHkgc2hhcmVkIGJ5IHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuICBUaGlzIG1lYW5zIHRoYXQgdHdvIAorLy8vIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGNvbnN0YW50cyB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIGFkZHJlc3MuICAKKy8vLyBDb25zdGFudHMgYXJlIGNyZWF0ZWQgb24gZGVtYW5kIGFzIG5lZWRlZCBhbmQgbmV2ZXIgZGVsZXRlZDogdGh1cyBjbGllbnRzIAorLy8vIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3RzLgorLy8vIEBicmllZiBMTFZNIENvbnN0YW50IFJlcHJlc2VudGF0aW9uCitjbGFzcyBDb25zdGFudCA6IHB1YmxpYyBVc2VyIHsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ29uc3RhbnQgJik7ICAgICAvLyBEbyBub3QgaW1wbGVtZW50CisgIENvbnN0YW50KGNvbnN0IENvbnN0YW50ICYpOyAgICAgICAgICAgLy8gRG8gbm90IGltcGxlbWVudAorICAKK3Byb3RlY3RlZDoKKyAgQ29uc3RhbnQoY29uc3QgVHlwZSAqdHksIFZhbHVlVHkgdnR5LCBVc2UgKk9wcywgdW5zaWduZWQgTnVtT3BzKQorICAgIDogVXNlcih0eSwgdnR5LCBPcHMsIE51bU9wcykge30KKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKyAgCisgIHZvaWQgc2V0T3BlcmFuZCh1bnNpZ25lZCBpLCBWYWx1ZSAqVikgeworICAgIFVzZXI6OnNldE9wZXJhbmQoaSwgVik7CisgIH0KK3B1YmxpYzoKKyAgLy8vIGlzTnVsbFZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieQorICAvLy8gZ2V0TnVsbFZhbHVlLgorICB2aXJ0dWFsIGJvb2wgaXNOdWxsVmFsdWUoKSBjb25zdCA9IDA7CisKKyAgLy8vIGlzTmVnYXRpdmVaZXJvVmFsdWUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgd2hhdCB3b3VsZCBiZSByZXR1cm5lZCAKKyAgLy8vIGJ5IGdldFplcm9WYWx1ZUZvck5lZ2F0aW9uLgorICB2aXJ0dWFsIGJvb2wgaXNOZWdhdGl2ZVplcm9WYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGlzTnVsbFZhbHVlKCk7IH0KKworICAvLy8gY2FuVHJhcCAtIFJldHVybiB0cnVlIGlmIGV2YWx1YXRpb24gb2YgdGhpcyBjb25zdGFudCBjb3VsZCB0cmFwLiAgVGhpcyBpcworICAvLy8gdHJ1ZSBmb3IgdGhpbmdzIGxpa2UgY29uc3RhbnQgZXhwcmVzc2lvbnMgdGhhdCBjb3VsZCBkaXZpZGUgYnkgemVyby4KKyAgYm9vbCBjYW5UcmFwKCkgY29uc3Q7CisKKyAgLy8vIGlzQ29uc3RhbnRVc2VkIC0gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0YW50IGhhcyB1c2VycyBvdGhlciB0aGFuIGNvbnN0YW50CisgIC8vLyBleHBycyBhbmQgb3RoZXIgZGFuZ2xpbmcgdGhpbmdzLgorICBib29sIGlzQ29uc3RhbnRVc2VkKCkgY29uc3Q7CisgIAorICBlbnVtIFBvc3NpYmxlUmVsb2NhdGlvbnNUeSB7CisgICAgTm9SZWxvY2F0aW9uID0gMCwKKyAgICBMb2NhbFJlbG9jYXRpb24gPSAxLAorICAgIEdsb2JhbFJlbG9jYXRpb25zID0gMgorICB9OworICAKKyAgLy8vIGdldFJlbG9jYXRpb25JbmZvIC0gVGhpcyBtZXRob2QgY2xhc3NpZmllcyB0aGUgZW50cnkgYWNjb3JkaW5nIHRvCisgIC8vLyB3aGV0aGVyIG9yIG5vdCBpdCBtYXkgZ2VuZXJhdGUgYSByZWxvY2F0aW9uIGVudHJ5LiAgVGhpcyBtdXN0IGJlCisgIC8vLyBjb25zZXJ2YXRpdmUsIHNvIGlmIGl0IG1pZ2h0IGNvZGVnZW4gdG8gYSByZWxvY2F0YWJsZSBlbnRyeSwgaXQgc2hvdWxkIHNheQorICAvLy8gc28uICBUaGUgcmV0dXJuIHZhbHVlcyBhcmU6CisgIC8vLyAKKyAgLy8vICBOb1JlbG9jYXRpb246IFRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeSBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGhhdmUgYQorICAvLy8gICAgIHJlbG9jYXRpb24gYXBwbGllZCB0byBpdCAoYmVjYXVzZSBpdCBob2xkcyBhIHNpbXBsZSBjb25zdGFudCBsaWtlCisgIC8vLyAgICAgJzQnKS4KKyAgLy8vICBMb2NhbFJlbG9jYXRpb246IFRoaXMgZW50cnkgaGFzIHJlbG9jYXRpb25zLCBidXQgdGhlIGVudHJpZXMgYXJlCisgIC8vLyAgICAgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZhYmxlIGJ5IHRoZSBzdGF0aWMgbGlua2VyLCBzbyB0aGUgZHluYW1pYworICAvLy8gICAgIGxpbmtlciB3aWxsIG5ldmVyIHNlZSB0aGVtLgorICAvLy8gIEdsb2JhbFJlbG9jYXRpb25zOiBUaGlzIGVudHJ5IG1heSBoYXZlIGFyYml0cmFyeSByZWxvY2F0aW9ucy4KKyAgLy8vCisgIC8vLyBGSVhNRTogVGhpcyByZWFsbHkgc2hvdWxkIG5vdCBiZSBpbiBWTUNvcmUuCisgIFBvc3NpYmxlUmVsb2NhdGlvbnNUeSBnZXRSZWxvY2F0aW9uSW5mbygpIGNvbnN0OworICAKKyAgLy8gU3BlY2lhbGl6ZSBnZXQvc2V0T3BlcmFuZCBmb3IgVXNlcnMgYXMgdGhlaXIgb3BlcmFuZHMgYXJlIGFsd2F5cworICAvLyBjb25zdGFudHMgb3IgQmFzaWNCbG9ja3MgYXMgd2VsbC4KKyAgVXNlciAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFVzZXIqPihVc2VyOjpnZXRPcGVyYW5kKGkpKTsKKyAgfQorICBjb25zdCBVc2VyICpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVXNlcio+KFVzZXI6OmdldE9wZXJhbmQoaSkpOworICB9CisgIAorICAvLy8gZ2V0VmVjdG9yRWxlbWVudHMgLSBUaGlzIG1ldGhvZCwgd2hpY2ggaXMgb25seSB2YWxpZCBvbiBjb25zdGFudCBvZiB2ZWN0b3IKKyAgLy8vIHR5cGUsIHJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSB2ZWN0b3IgaW4gdGhlIHNwZWNpZmllZCBzbWFsbHZlY3Rvci4KKyAgLy8vIFRoaXMgaGFuZGxlcyBicmVha2luZyBkb3duIGEgdmVjdG9yIHVuZGVmIGludG8gdW5kZWYgZWxlbWVudHMsIGV0Yy4gIEZvcgorICAvLy8gY29uc3RhbnQgZXhwcnMgYW5kIG90aGVyIGNhc2VzIHdlIGNhbid0IGhhbmRsZSwgd2UgcmV0dXJuIGFuIGVtcHR5IHZlY3Rvci4KKyAgdm9pZCBnZXRWZWN0b3JFbGVtZW50cyhTbWFsbFZlY3RvckltcGw8Q29uc3RhbnQqPiAmRWx0cykgY29uc3Q7CisKKyAgLy8vIGRlc3Ryb3lDb25zdGFudCAtIENhbGxlZCBpZiBzb21lIGVsZW1lbnQgb2YgdGhpcyBjb25zdGFudCBpcyBubyBsb25nZXIKKyAgLy8vIHZhbGlkLiAgQXQgdGhpcyBwb2ludCBvbmx5IG90aGVyIGNvbnN0YW50cyBtYXkgYmUgb24gdGhlIHVzZV9saXN0IGZvciB0aGlzCisgIC8vLyBjb25zdGFudC4gIEFueSBjb25zdGFudHMgb24gb3VyIFVzZSBsaXN0IG11c3QgYWxzbyBiZSBkZXN0cm95J2QuICBUaGUKKyAgLy8vIGltcGxlbWVudGF0aW9uIG11c3QgYmUgc3VyZSB0byByZW1vdmUgdGhlIGNvbnN0YW50IGZyb20gdGhlIGxpc3Qgb2YKKyAgLy8vIGF2YWlsYWJsZSBjYWNoZWQgY29uc3RhbnRzLiAgSW1wbGVtZW50YXRpb25zIHNob3VsZCBjYWxsCisgIC8vLyBkZXN0cm95Q29uc3RhbnRJbXBsIGFzIHRoZSBsYXN0IHRoaW5nIHRoZXkgZG8sIHRvIGRlc3Ryb3kgYWxsIHVzZXJzIGFuZAorICAvLy8gZGVsZXRlIHRoaXMuCisgIHZpcnR1YWwgdm9pZCBkZXN0cm95Q29uc3RhbnQoKSB7IGFzc2VydCgwICYmICJOb3QgcmVhY2hlZCEiKTsgfQorCisgIC8vLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RhbnQgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBHbG9iYWxWYWx1ZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA+PSBDb25zdGFudEZpcnN0VmFsICYmCisgICAgICAgICAgIFYtPmdldFZhbHVlSUQoKSA8PSBDb25zdGFudExhc3RWYWw7CisgIH0KKworICAvLy8gcmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50IC0gVGhpcyBtZXRob2QgaXMgYSBzcGVjaWFsIGZvcm0gb2YKKyAgLy8vIFVzZXI6OnJlcGxhY2VVc2VzT2ZXaXRoICh3aGljaCBkb2VzIG5vdCB3b3JrIG9uIGNvbnN0YW50cykgdGhhdCBkb2VzIHdvcmsKKyAgLy8vIG9uIGNvbnN0YW50cy4gIEJhc2ljYWxseSB0aGlzIG1ldGhvZCBnb2VzIHRocm91Z2ggdGhlIHRyb3VibGUgb2YgYnVpbGRpbmcKKyAgLy8vIGEgbmV3IGNvbnN0YW50IHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgY3VycmVudCBvbmUsIHdpdGggYWxsIHVzZXMgb2YKKyAgLy8vIEZyb20gcmVwbGFjZWQgd2l0aCB1c2VzIG9mIFRvLiAgQWZ0ZXIgdGhpcyBjb25zdHJ1Y3Rpb24gaXMgY29tcGxldGVkLCBhbGwKKyAgLy8vIG9mIHRoZSB1c2VycyBvZiAndGhpcycgYXJlIHJlcGxhY2VkIHRvIHVzZSB0aGUgbmV3IGNvbnN0YW50LCBhbmQgdGhlbgorICAvLy8gJ3RoaXMnIGlzIGRlbGV0ZWQuICBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLCBpbnN0ZWFkLAorICAvLy8gdXNlIFZhbHVlOjpyZXBsYWNlQWxsVXNlc1dpdGgsIHdoaWNoIGF1dG9tYXRpY2FsbHkgZGlzcGF0Y2hlcyB0byB0aGlzCisgIC8vLyBtZXRob2QgYXMgbmVlZGVkLgorICAvLy8KKyAgdmlydHVhbCB2b2lkIHJlcGxhY2VVc2VzT2ZXaXRoT25Db25zdGFudChWYWx1ZSAqLCBWYWx1ZSAqLCBVc2UgKikgeworICAgIC8vIFByb3ZpZGUgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBjb25zdGFudHMgKGxpa2UgaW50ZWdlcnMpIHRoYXQKKyAgICAvLyBjYW5ub3QgdXNlIGFueSBvdGhlciB2YWx1ZXMuICBUaGlzIGNhbm5vdCBiZSBjYWxsZWQgYXQgcnVudGltZSwgYnV0IG5lZWRzCisgICAgLy8gdG8gYmUgaGVyZSB0byBhdm9pZCBsaW5rIGVycm9ycy4KKyAgICBhc3NlcnQoZ2V0TnVtT3BlcmFuZHMoKSA9PSAwICYmICJyZXBsYWNlVXNlc09mV2l0aE9uQ29uc3RhbnQgbXVzdCBiZSAiCisgICAgICAgICAgICJpbXBsZW1lbnRlZCBmb3IgYWxsIGNvbnN0YW50cyB0aGF0IGhhdmUgb3BlcmFuZHMhIik7CisgICAgYXNzZXJ0KDAgJiYgIkNvbnN0YW50cyB0aGF0IGRvIG5vdCBoYXZlIG9wZXJhbmRzIGNhbm5vdCBiZSB1c2luZyAnRnJvbSchIik7CisgIH0KKyAgCisgIHN0YXRpYyBDb25zdGFudCogZ2V0TnVsbFZhbHVlKGNvbnN0IFR5cGUqIFR5KTsKKyAgCisgIC8vLyBAcmV0dXJucyB0aGUgdmFsdWUgZm9yIGFuIGludGVnZXIgY29uc3RhbnQgb2YgdGhlIGdpdmVuIHR5cGUgdGhhdCBoYXMgYWxsCisgIC8vLyBpdHMgYml0cyBzZXQgdG8gdHJ1ZS4KKyAgLy8vIEBicmllZiBHZXQgdGhlIGFsbCBvbmVzIHZhbHVlCisgIHN0YXRpYyBDb25zdGFudCogZ2V0QWxsT25lc1ZhbHVlKGNvbnN0IFR5cGUqIFR5KTsKKworICAvLy8gZ2V0SW50ZWdlclZhbHVlIC0gUmV0dXJuIHRoZSB2YWx1ZSBmb3IgYW4gaW50ZWdlciBvciBwb2ludGVyIGNvbnN0YW50LAorICAvLy8gb3IgYSB2ZWN0b3IgdGhlcmVvZiwgd2l0aCB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlLgorICBzdGF0aWMgQ29uc3RhbnQqIGdldEludGVnZXJWYWx1ZShjb25zdCBUeXBlKiBUeSwgY29uc3QgQVBJbnQgJlYpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29uc3RhbnRzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vQ29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhODQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Db25zdGFudHMuaApAQCAtMCwwICsxLDk2NCBAQAorLy89PT0tLSBsbHZtL0NvbnN0YW50cy5oIC0gQ29uc3RhbnQgY2xhc3Mgc3ViY2xhc3MgZGVmaW5pdGlvbnMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQGZpbGUKKy8vLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHN1YmNsYXNzZXMgb2YgQ29uc3RhbnQsIAorLy8vIHdoaWNoIHJlcHJlc2VudCB0aGUgZGlmZmVyZW50IGZsYXZvcnMgb2YgY29uc3RhbnQgdmFsdWVzIHRoYXQgbGl2ZSBpbiBMTFZNLgorLy8vIE5vdGUgdGhhdCBDb25zdGFudHMgYXJlIGltbXV0YWJsZSAob25jZSBjcmVhdGVkIHRoZXkgbmV2ZXIgY2hhbmdlKSBhbmQgYXJlIAorLy8vIGZ1bGx5IHNoYXJlZCBieSBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLiAgVGhpcyBtZWFucyB0aGF0IHR3byBzdHJ1Y3R1cmFsbHkKKy8vLyBlcXVpdmFsZW50IGNvbnN0YW50cyB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIGFkZHJlc3MuICBDb25zdGFudCdzIGFyZQorLy8vIGNyZWF0ZWQgb24gZGVtYW5kIGFzIG5lZWRlZCBhbmQgbmV2ZXIgZGVsZXRlZDogdGh1cyBjbGllbnRzIGRvbid0IGhhdmUgdG8KKy8vLyB3b3JyeSBhYm91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIG9iamVjdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPTlNUQU5UU19ICisjZGVmaW5lIExMVk1fQ09OU1RBTlRTX0gKKworI2luY2x1ZGUgImxsdm0vQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL09wZXJhbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQRmxvYXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBcnJheVR5cGU7CitjbGFzcyBJbnRlZ2VyVHlwZTsKK2NsYXNzIFN0cnVjdFR5cGU7CitjbGFzcyBVbmlvblR5cGU7CitjbGFzcyBQb2ludGVyVHlwZTsKK2NsYXNzIFZlY3RvclR5cGU7CisKK3RlbXBsYXRlPGNsYXNzIENvbnN0YW50Q2xhc3MsIGNsYXNzIFR5cGVDbGFzcywgY2xhc3MgVmFsVHlwZT4KK3N0cnVjdCBDb25zdGFudENyZWF0b3I7Cit0ZW1wbGF0ZTxjbGFzcyBDb25zdGFudENsYXNzLCBjbGFzcyBUeXBlQ2xhc3M+CitzdHJ1Y3QgQ29udmVydENvbnN0YW50VHlwZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUaGlzIGlzIHRoZSBzaGFyZWQgY2xhc3Mgb2YgYm9vbGVhbiBhbmQgaW50ZWdlciBjb25zdGFudHMuIFRoaXMgY2xhc3MgCisvLy8gcmVwcmVzZW50cyBib3RoIGJvb2xlYW4gYW5kIGludGVncmFsIGNvbnN0YW50cy4KKy8vLyBAYnJpZWYgQ2xhc3MgZm9yIGNvbnN0YW50IGludGVnZXJzLgorY2xhc3MgQ29uc3RhbnRJbnQgOiBwdWJsaWMgQ29uc3RhbnQgeworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCB1bnNpZ25lZCk7ICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIENvbnN0YW50SW50KGNvbnN0IENvbnN0YW50SW50ICYpOyAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgQ29uc3RhbnRJbnQoY29uc3QgSW50ZWdlclR5cGUgKlR5LCBjb25zdCBBUEludCYgVik7CisgIEFQSW50IFZhbDsKK3Byb3RlY3RlZDoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgemVybyBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDApOworICB9CitwdWJsaWM6CisgIHN0YXRpYyBDb25zdGFudEludCAqZ2V0VHJ1ZShMTFZNQ29udGV4dCAmQ29udGV4dCk7CisgIHN0YXRpYyBDb25zdGFudEludCAqZ2V0RmFsc2UoTExWTUNvbnRleHQgJkNvbnRleHQpOworICAKKyAgLy8vIElmIFR5IGlzIGEgdmVjdG9yIHR5cGUsIHJldHVybiBhIENvbnN0YW50IHdpdGggYSBzcGxhdCBvZiB0aGUgZ2l2ZW4KKyAgLy8vIHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIGEgQ29uc3RhbnRJbnQgZm9yIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIENvbnN0YW50ICpnZXQoY29uc3QgVHlwZSAqVHksIHVpbnQ2NF90IFYsIGJvb2wgaXNTaWduZWQgPSBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgLy8vIFJldHVybiBhIENvbnN0YW50SW50IHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyB0eXBlLiBJZiB0aGUgdHlwZSBpcyB3aWRlciB0aGFuIDY0IGJpdHMsIHRoZSB2YWx1ZSB3aWxsIGJlIHplcm8tZXh0ZW5kZWQKKyAgLy8vIHRvIGZpdCB0aGUgdHlwZSwgdW5sZXNzIGlzU2lnbmVkIGlzIHRydWUsIGluIHdoaWNoIGNhc2UgdGhlIHZhbHVlIHdpbGwKKyAgLy8vIGJlIGludGVycHJldGVkIGFzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFuZCBzaWduLWV4dGVuZGVkIHRvIGZpdAorICAvLy8gdGhlIHR5cGUuCisgIC8vLyBAYnJpZWYgR2V0IGEgQ29uc3RhbnRJbnQgZm9yIGEgc3BlY2lmaWMgdmFsdWUuCisgIHN0YXRpYyBDb25zdGFudEludCAqZ2V0KGNvbnN0IEludGVnZXJUeXBlICpUeSwgdWludDY0X3QgViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCA9IGZhbHNlKTsKKworICAvLy8gUmV0dXJuIGEgQ29uc3RhbnRJbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuIFRoZQorICAvLy8gdmFsdWUgViB3aWxsIGJlIGNhbm9uaWNhbGl6ZWQgdG8gYSBhbiB1bnNpZ25lZCBBUEludC4gQWNjZXNzaW5nIGl0IHdpdGgKKyAgLy8vIGVpdGhlciBnZXRTRXh0VmFsdWUoKSBvciBnZXRaRXh0VmFsdWUoKSB3aWxsIHlpZWxkIGEgY29ycmVjdGx5IHNpemVkIGFuZAorICAvLy8gc2lnbmVkIHZhbHVlIGZvciB0aGUgdHlwZSBUeS4KKyAgLy8vIEBicmllZiBHZXQgYSBDb25zdGFudEludCBmb3IgYSBzcGVjaWZpYyBzaWduZWQgdmFsdWUuCisgIHN0YXRpYyBDb25zdGFudEludCAqZ2V0U2lnbmVkKGNvbnN0IEludGVnZXJUeXBlICpUeSwgaW50NjRfdCBWKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTaWduZWQoY29uc3QgVHlwZSAqVHksIGludDY0X3QgVik7CisgIAorICAvLy8gUmV0dXJuIGEgQ29uc3RhbnRJbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBhbiBpbXBsaWVkIFR5cGUuIFRoZQorICAvLy8gdHlwZSBpcyB0aGUgaW50ZWdlciB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGJpdCB3aWR0aCBvZiB0aGUgdmFsdWUuCisgIHN0YXRpYyBDb25zdGFudEludCAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBjb25zdCBBUEludCAmVik7CisKKyAgLy8vIFJldHVybiBhIENvbnN0YW50SW50IGNvbnN0cnVjdGVkIGZyb20gdGhlIHN0cmluZyBzdHJTdGFydCB3aXRoIHRoZSBnaXZlbgorICAvLy8gcmFkaXguIAorICBzdGF0aWMgQ29uc3RhbnRJbnQgKmdldChjb25zdCBJbnRlZ2VyVHlwZSAqVHksIFN0cmluZ1JlZiBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmFkaXgpOworICAKKyAgLy8vIElmIFR5IGlzIGEgdmVjdG9yIHR5cGUsIHJldHVybiBhIENvbnN0YW50IHdpdGggYSBzcGxhdCBvZiB0aGUgZ2l2ZW4KKyAgLy8vIHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIGEgQ29uc3RhbnRJbnQgZm9yIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIENvbnN0YW50ICpnZXQoY29uc3QgVHlwZSogVHksIGNvbnN0IEFQSW50JiBWKTsKKyAgCisgIC8vLyBSZXR1cm4gdGhlIGNvbnN0YW50IGFzIGFuIEFQSW50IHZhbHVlIHJlZmVyZW5jZS4gVGhpcyBhbGxvd3MgY2xpZW50cyB0bworICAvLy8gb2J0YWluIGEgY29weSBvZiB0aGUgdmFsdWUsIHdpdGggYWxsIGl0cyBwcmVjaXNpb24gaW4gdGFjdC4KKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGNvbnN0YW50J3MgdmFsdWUuCisgIGlubGluZSBjb25zdCBBUEludCAmZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbDsKKyAgfQorICAKKyAgLy8vIGdldEJpdFdpZHRoIC0gUmV0dXJuIHRoZSBiaXR3aWR0aCBvZiB0aGlzIGNvbnN0YW50LgorICB1bnNpZ25lZCBnZXRCaXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRCaXRXaWR0aCgpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgY29uc3RhbnQgYXMgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciB2YWx1ZSBhZnRlciBpdAorICAvLy8gaGFzIGJlZW4gemVybyBleHRlbmRlZCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUgb2YgdGhpcyBjb25zdGFudC4gTm90ZQorICAvLy8gdGhhdCB0aGlzIG1ldGhvZCBjYW4gYXNzZXJ0IGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBmaXQgaW4gNjQgYml0cy4KKyAgLy8vIEBkZXByZWNhdGVkCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSB6ZXJvIGV4dGVuZGVkIHZhbHVlLgorICBpbmxpbmUgdWludDY0X3QgZ2V0WkV4dFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBWYWwuZ2V0WkV4dFZhbHVlKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBjb25zdGFudCBhcyBhIDY0LWJpdCBpbnRlZ2VyIHZhbHVlIGFmdGVyIGl0IGhhcyBiZWVuIHNpZ24KKyAgLy8vIGV4dGVuZGVkIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgdHlwZSBvZiB0aGlzIGNvbnN0YW50LiBOb3RlIHRoYXQKKyAgLy8vIHRoaXMgbWV0aG9kIGNhbiBhc3NlcnQgaWYgdGhlIHZhbHVlIGRvZXMgbm90IGZpdCBpbiA2NCBiaXRzLgorICAvLy8gQGRlcHJlY2F0ZWQKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIHNpZ24gZXh0ZW5kZWQgdmFsdWUuCisgIGlubGluZSBpbnQ2NF90IGdldFNFeHRWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsLmdldFNFeHRWYWx1ZSgpOworICB9CisKKyAgLy8vIEEgaGVscGVyIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29uc3RhbnQgY29udGFpbmVkIAorICAvLy8gd2l0aGluIGlzIGVxdWFsIHRvIGEgY29uc3RhbnQuICBUaGlzIG9ubHkgd29ya3MgZm9yIHZlcnkgc21hbGwgdmFsdWVzLCAKKyAgLy8vIGJlY2F1c2UgdGhpcyBpcyBhbGwgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgd2l0aCBhbGwgdHlwZXMuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgY29uc3RhbnQncyB2YWx1ZSBpcyBzYW1lIGFzIGFuIHVuc2lnbmVkIGNoYXIuCisgIGJvb2wgZXF1YWxzSW50KHVpbnQ2NF90IFYpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsID09IFY7CisgIH0KKworICAvLy8gZ2V0VHlwZSAtIFNwZWNpYWxpemUgdGhlIGdldFR5cGUoKSBtZXRob2QgdG8gYWx3YXlzIHJldHVybiBhbiBJbnRlZ2VyVHlwZSwKKyAgLy8vIHdoaWNoIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBjYXN0aW5nIG5lZWRlZCBpbiBwYXJ0cyBvZiB0aGUgY29tcGlsZXIuCisgIC8vLworICBpbmxpbmUgY29uc3QgSW50ZWdlclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgSW50ZWdlclR5cGUqPihWYWx1ZTo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIFR5IGlzIGJpZyBlbm91Z2ggdG8gCisgIC8vLyByZXByZXNlbnQgdGhlIHZhbHVlIFYuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgaGF2aW5nIHRoZSBnZXQgbWV0aG9kIAorICAvLy8gYXNzZXJ0IHdoZW4gViBpcyBsYXJnZXIgdGhhbiBUeSBjYW4gcmVwcmVzZW50LiBOb3RlIHRoYXQgdGhlcmUgYXJlIHR3bworICAvLy8gdmVyc2lvbnMgb2YgdGhpcyBtZXRob2QsIG9uZSBmb3IgdW5zaWduZWQgYW5kIG9uZSBmb3Igc2lnbmVkIGludGVnZXJzLgorICAvLy8gQWx0aG91Z2ggQ29uc3RhbnRJbnQgY2Fub25pY2FsaXplcyBldmVyeXRoaW5nIHRvIGFuIHVuc2lnbmVkIGludGVnZXIsIAorICAvLy8gdGhlIHNpZ25lZCB2ZXJzaW9uIGF2b2lkcyBjYWxsZXJzIGhhdmluZyB0byBjb252ZXJ0IGEgc2lnbmVkIHF1YW50aXR5CisgIC8vLyB0byB0aGUgYXBwcm9wcmlhdGUgdW5zaWduZWQgdHlwZSBiZWZvcmUgY2FsbGluZyB0aGUgbWV0aG9kLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiBWIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHR5cGUgVHkKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIGluIHJhbmdlIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNWYWx1ZVZhbGlkRm9yVHlwZShjb25zdCBUeXBlICpUeSwgdWludDY0X3QgVik7CisgIHN0YXRpYyBib29sIGlzVmFsdWVWYWxpZEZvclR5cGUoY29uc3QgVHlwZSAqVHksIGludDY0X3QgVik7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCByZXByZXNlbnRzIHRoZSAibnVsbCIKKyAgLy8vIHZhbHVlIHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgdGhlIGdldE51bGxWYWx1ZSBtZXRob2QuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIG51bGwgaW50ZWdlciB2YWx1ZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIG51bGwuCisgIHZpcnR1YWwgYm9vbCBpc051bGxWYWx1ZSgpIGNvbnN0IHsgCisgICAgcmV0dXJuIFZhbCA9PSAwOyAKKyAgfQorCisgIC8vLyBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gbWFrZSBjbGllbnQgY29kZSBzbWFsbGVyIGZvciBhCisgIC8vLyBjb21tb24gY29kZS4gSXQgYWxzbyBjb3JyZWN0bHkgcGVyZm9ybXMgdGhlIGNvbXBhcmlzb24gd2l0aG91dCB0aGUKKyAgLy8vIHBvdGVudGlhbCBmb3IgYW4gYXNzZXJ0aW9uIGZyb20gZ2V0WkV4dFZhbHVlKCkuCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeworICAgIHJldHVybiBWYWwgPT0gMDsKKyAgfQorCisgIC8vLyBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gbWFrZSBjbGllbnQgY29kZSBzbWFsbGVyIGZvciBhIAorICAvLy8gY29tbW9uIGNhc2UuIEl0IGFsc28gY29ycmVjdGx5IHBlcmZvcm1zIHRoZSBjb21wYXJpc29uIHdpdGhvdXQgdGhlCisgIC8vLyBwb3RlbnRpYWwgZm9yIGFuIGFzc2VydGlvbiBmcm9tIGdldFpFeHRWYWx1ZSgpLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgb25lLgorICBib29sIGlzT25lKCkgY29uc3QgeworICAgIHJldHVybiBWYWwgPT0gMTsKKyAgfQorCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgaWZmIGV2ZXJ5IGJpdCBpbiB0aGlzIGNvbnN0YW50IGlzIHNldAorICAvLy8gdG8gdHJ1ZS4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWZmIHRoaXMgY29uc3RhbnQncyBiaXRzIGFyZSBhbGwgc2V0IHRvIHRydWUuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBhbGwgb25lcy4KKyAgYm9vbCBpc0FsbE9uZXNWYWx1ZSgpIGNvbnN0IHsgCisgICAgcmV0dXJuIFZhbC5pc0FsbE9uZXNWYWx1ZSgpOworICB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCByZXByZXNlbnRzIHRoZSBsYXJnZXN0CisgIC8vLyB2YWx1ZSB0aGF0IG1heSBiZSByZXByZXNlbnRlZCBieSB0aGUgY29uc3RhbnQncyB0eXBlLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyB0aGUgbGFyZ2VzdCB2YWx1ZSB0aGF0IG1heSBiZSByZXByZXNlbnRlZCAKKyAgLy8vIGJ5IHRoaXMgdHlwZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIG1heGltYWwuCisgIGJvb2wgaXNNYXhWYWx1ZShib29sIGlzU2lnbmVkKSBjb25zdCB7CisgICAgaWYgKGlzU2lnbmVkKSAKKyAgICAgIHJldHVybiBWYWwuaXNNYXhTaWduZWRWYWx1ZSgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBWYWwuaXNNYXhWYWx1ZSgpOworICB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCByZXByZXNlbnRzIHRoZSBzbWFsbGVzdAorICAvLy8gdmFsdWUgdGhhdCBtYXkgYmUgcmVwcmVzZW50ZWQgYnkgdGhpcyBjb25zdGFudCdzIHR5cGUuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNtYWxsZXN0IHZhbHVlIHRoYXQgbWF5IGJlIHJlcHJlc2VudGVkIGJ5IAorICAvLy8gdGhpcyB0eXBlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgbWluaW1hbC4KKyAgYm9vbCBpc01pblZhbHVlKGJvb2wgaXNTaWduZWQpIGNvbnN0IHsKKyAgICBpZiAoaXNTaWduZWQpIAorICAgICAgcmV0dXJuIFZhbC5pc01pblNpZ25lZFZhbHVlKCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFZhbC5pc01pblZhbHVlKCk7CisgIH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIGlmZiB0aGlzIGNvbnN0YW50IHJlcHJlc2VudHMgYSB2YWx1ZSB3aXRoCisgIC8vLyBhY3RpdmUgYml0cyBiaWdnZXIgdGhhbiA2NCBiaXRzIG9yIGEgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiB1aW50NjRfdAorICAvLy8gdmFsdWUuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGlzIGNvbnN0YW50IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci4KKyAgYm9vbCB1Z2UodWludDY0X3QgTnVtKSB7CisgICAgcmV0dXJuIFZhbC5nZXRBY3RpdmVCaXRzKCkgPiA2NCB8fCBWYWwuZ2V0WkV4dFZhbHVlKCkgPj0gTnVtOworICB9CisKKyAgLy8vIGdldExpbWl0ZWRWYWx1ZSAtIElmIHRoZSB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsaW1pdCwKKyAgLy8vIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbGltaXQgdmFsdWUuICBUaGlzIGNhdXNlcyB0aGUgdmFsdWUKKyAgLy8vIHRvIHNhdHVyYXRlIHRvIHRoZSBsaW1pdC4KKyAgLy8vIEByZXR1cm5zIHRoZSBtaW4gb2YgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCBhbmQgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAvLy8gQGJyaWVmIEdldCB0aGUgY29uc3RhbnQncyB2YWx1ZSB3aXRoIGEgc2F0dXJhdGlvbiBsaW1pdAorICB1aW50NjRfdCBnZXRMaW1pdGVkVmFsdWUodWludDY0X3QgTGltaXQgPSB+MFVMTCkgY29uc3QgeworICAgIHJldHVybiBWYWwuZ2V0TGltaXRlZFZhbHVlKExpbWl0KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgTWV0aG9kcyB0byBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0LgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudEludCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50SW50VmFsOworICB9Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29uc3RhbnRGUCAtIEZsb2F0aW5nIFBvaW50IFZhbHVlcyBbZmxvYXQsIGRvdWJsZV0KKy8vLworY2xhc3MgQ29uc3RhbnRGUCA6IHB1YmxpYyBDb25zdGFudCB7CisgIEFQRmxvYXQgVmFsOworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCB1bnNpZ25lZCk7Ly8gRE8gTk9UIElNUExFTUVOVAorICBDb25zdGFudEZQKGNvbnN0IENvbnN0YW50RlAgJik7ICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworcHJvdGVjdGVkOgorICBDb25zdGFudEZQKGNvbnN0IFR5cGUgKlR5LCBjb25zdCBBUEZsb2F0JiBWKTsKK3Byb3RlY3RlZDoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgemVybyBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDApOworICB9CitwdWJsaWM6CisgIC8vLyBGbG9hdGluZyBwb2ludCBuZWdhdGlvbiBtdXN0IGJlIGltcGxlbWVudGVkIHdpdGggZih4KSA9IC0wLjAgLSB4LiBUaGlzCisgIC8vLyBtZXRob2QgcmV0dXJucyB0aGUgbmVnYXRpdmUgemVybyBjb25zdGFudCBmb3IgZmxvYXRpbmcgcG9pbnQgb3IgdmVjdG9yCisgIC8vLyBmbG9hdGluZyBwb2ludCB0eXBlczsgZm9yIGFsbCBvdGhlciB0eXBlcywgaXQgcmV0dXJucyB0aGUgbnVsbCB2YWx1ZS4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRaZXJvVmFsdWVGb3JOZWdhdGlvbihjb25zdCBUeXBlICpUeSk7CisgIAorICAvLy8gZ2V0KCkgLSBUaGlzIHJldHVybnMgYSBDb25zdGFudEZQLCBvciBhIHZlY3RvciBjb250YWluaW5nIGEgc3BsYXQgb2YgYQorICAvLy8gQ29uc3RhbnRGUCwgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCB0eXBlLiAgVGhpcyBzaG91bGQKKyAgLy8vIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIGNvbnN0YW50IHZhbHVlcyBsaWtlIDIuMC8xLjAgZXRjLCB0aGF0IGFyZQorICAvLy8ga25vd24tdmFsaWQgYm90aCBhcyBob3N0IGRvdWJsZSBhbmQgYXMgdGhlIHRhcmdldCBmb3JtYXQuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KGNvbnN0IFR5cGUqIFR5LCBkb3VibGUgVik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KGNvbnN0IFR5cGUqIFR5LCBTdHJpbmdSZWYgU3RyKTsKKyAgc3RhdGljIENvbnN0YW50RlAgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgY29uc3QgQVBGbG9hdCAmVik7CisgIHN0YXRpYyBDb25zdGFudEZQICpnZXROZWdhdGl2ZVplcm8oY29uc3QgVHlwZSogVHkpOworICBzdGF0aWMgQ29uc3RhbnRGUCAqZ2V0SW5maW5pdHkoY29uc3QgVHlwZSAqVHksIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSk7CisgIAorICAvLy8gaXNWYWx1ZVZhbGlkRm9yVHlwZSAtIHJldHVybiB0cnVlIGlmIFR5IGlzIGJpZyBlbm91Z2ggdG8gcmVwcmVzZW50IFYuCisgIHN0YXRpYyBib29sIGlzVmFsdWVWYWxpZEZvclR5cGUoY29uc3QgVHlwZSAqVHksIGNvbnN0IEFQRmxvYXQgJlYpOworICBpbmxpbmUgY29uc3QgQVBGbG9hdCYgZ2V0VmFsdWVBUEYoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICAvLy8gaXNOdWxsVmFsdWUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSB2YWx1ZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5CisgIC8vLyBnZXROdWxsVmFsdWUuICBEb24ndCBkZXBlbmQgb24gPT0gZm9yIGRvdWJsZXMgdG8gdGVsbCB1cyBpdCdzIHplcm8sIGl0CisgIC8vLyBjb25zaWRlcnMgLTAuMCB0byBiZSBudWxsIGFzIHdlbGwgYXMgMC4wLiAgOigKKyAgdmlydHVhbCBib29sIGlzTnVsbFZhbHVlKCkgY29uc3Q7CisgIAorICAvLy8gaXNOZWdhdGl2ZVplcm9WYWx1ZSAtIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyB3aGF0IHdvdWxkIGJlIHJldHVybmVkIAorICAvLy8gYnkgZ2V0WmVyb1ZhbHVlRm9yTmVnYXRpb24uCisgIHZpcnR1YWwgYm9vbCBpc05lZ2F0aXZlWmVyb1ZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBWYWwuaXNaZXJvKCkgJiYgVmFsLmlzTmVnYXRpdmUoKTsKKyAgfQorCisgIC8vLyBpc1plcm8gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgemVyby4KKyAgYm9vbCBpc1plcm8oKSBjb25zdCB7IHJldHVybiBWYWwuaXNaZXJvKCk7IH0KKworICAvLy8gaXNOYU4gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBOYU4uCisgIGJvb2wgaXNOYU4oKSBjb25zdCB7IHJldHVybiBWYWwuaXNOYU4oKTsgfQorCisgIC8vLyBpc0V4YWN0bHlWYWx1ZSAtIFdlIGRvbid0IHJlbHkgb24gb3BlcmF0b3I9PSB3b3JraW5nIG9uIGRvdWJsZSB2YWx1ZXMsIGFzCisgIC8vLyBpdCByZXR1cm5zIHRydWUgZm9yIHRoaW5ncyB0aGF0IGFyZSBjbGVhcmx5IG5vdCBlcXVhbCwgbGlrZSAtMC4wIGFuZCAwLjAuCisgIC8vLyBBcyBzdWNoLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkbyBhbiBleGFjdCBiaXQtZm9yLWJpdCBjb21wYXJpc29uIG9mCisgIC8vLyB0d28gZmxvYXRpbmcgcG9pbnQgdmFsdWVzLiAgVGhlIHZlcnNpb24gd2l0aCBhIGRvdWJsZSBvcGVyYW5kIGlzIHJldGFpbmVkCisgIC8vLyBiZWNhdXNlIGl0J3Mgc28gY29udmVuaWVudCB0byB3cml0ZSBpc0V4YWN0bHlWYWx1ZSgyLjApLCBidXQgcGxlYXNlIHVzZQorICAvLy8gaXQgb25seSBmb3Igc2ltcGxlIGNvbnN0YW50cy4KKyAgYm9vbCBpc0V4YWN0bHlWYWx1ZShjb25zdCBBUEZsb2F0ICZWKSBjb25zdDsKKworICBib29sIGlzRXhhY3RseVZhbHVlKGRvdWJsZSBWKSBjb25zdCB7CisgICAgYm9vbCBpZ25vcmVkOworICAgIC8vIGNvbnZlcnQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHR5cGUKKyAgICBpZiAoJlZhbC5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6UFBDRG91YmxlRG91YmxlKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFQRmxvYXQgRlYoVik7CisgICAgRlYuY29udmVydChWYWwuZ2V0U2VtYW50aWNzKCksIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4sICZpZ25vcmVkKTsKKyAgICByZXR1cm4gaXNFeGFjdGx5VmFsdWUoRlYpOworICB9CisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudEZQICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnRGUFZhbDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBDb25zdGFudEFnZ3JlZ2F0ZVplcm8gLSBBbGwgemVybyBhZ2dyZWdhdGUgdmFsdWUKKy8vLworY2xhc3MgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvIDogcHVibGljIENvbnN0YW50IHsKKyAgZnJpZW5kIHN0cnVjdCBDb25zdGFudENyZWF0b3I8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvLCBUeXBlLCBjaGFyPjsKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdW5zaWduZWQpOyAgICAgICAgICAgICAgICAgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIENvbnN0YW50QWdncmVnYXRlWmVybyhjb25zdCBDb25zdGFudEFnZ3JlZ2F0ZVplcm8gJik7ICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorcHJvdGVjdGVkOgorICBleHBsaWNpdCBDb25zdGFudEFnZ3JlZ2F0ZVplcm8oY29uc3QgVHlwZSAqdHkpCisgICAgOiBDb25zdGFudCh0eSwgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvVmFsLCAwLCAwKSB7fQorcHJvdGVjdGVkOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB6ZXJvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMCk7CisgIH0KK3B1YmxpYzoKKyAgc3RhdGljIENvbnN0YW50QWdncmVnYXRlWmVybyogZ2V0KGNvbnN0IFR5cGUgKlR5KTsKKyAgCisgIC8vLyBpc051bGxWYWx1ZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkKKyAgLy8vIGdldE51bGxWYWx1ZS4KKyAgdmlydHVhbCBib29sIGlzTnVsbFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZpcnR1YWwgdm9pZCBkZXN0cm95Q29uc3RhbnQoKTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgLy8vCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnRBZ2dyZWdhdGVaZXJvVmFsOworICB9Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29uc3RhbnRBcnJheSAtIENvbnN0YW50IEFycmF5IERlY2xhcmF0aW9ucworLy8vCitjbGFzcyBDb25zdGFudEFycmF5IDogcHVibGljIENvbnN0YW50IHsKKyAgZnJpZW5kIHN0cnVjdCBDb25zdGFudENyZWF0b3I8Q29uc3RhbnRBcnJheSwgQXJyYXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiA+OworICBDb25zdGFudEFycmF5KGNvbnN0IENvbnN0YW50QXJyYXkgJik7ICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorcHJvdGVjdGVkOgorICBDb25zdGFudEFycmF5KGNvbnN0IEFycmF5VHlwZSAqVCwgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiAmVmFsKTsKK3B1YmxpYzoKKyAgLy8gQ29uc3RhbnRBcnJheSBhY2Nlc3NvcnMKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoY29uc3QgQXJyYXlUeXBlICpULCBjb25zdCBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICZWKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoY29uc3QgQXJyYXlUeXBlICpULCBDb25zdGFudCAqY29uc3QgKlZhbHMsIAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1WYWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8vLyBUaGlzIG1ldGhvZCBjb25zdHJ1Y3RzIGEgQ29uc3RhbnRBcnJheSBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCBhIHRleHQKKyAgLy8vIHN0cmluZy4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgKEFkZE51bGw9PXRydWUpIGNhdXNlcyBhIG51bGwgdGVybWluYXRvciB0bworICAvLy8gYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LiBUaGlzIGVmZmVjdGl2ZWx5IGluY3JlYXNlcyB0aGUgbGVuZ3RoCisgIC8vLyBvZiB0aGUgYXJyYXkgYnkgb25lICh5b3UndmUgYmVlbiB3YXJuZWQpLiAgSG93ZXZlciwgaW4gc29tZSBzaXR1YXRpb25zIAorICAvLy8gdGhpcyBpcyBub3QgZGVzaXJlZCBzbyBpZiBBZGROdWxsPT1mYWxzZSB0aGVuIHRoZSBzdHJpbmcgaXMgY29waWVkIHdpdGhvdXQKKyAgLy8vIG51bGwgdGVybWluYXRpb24uCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgSW5pdGlhbGl6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkTnVsbCA9IHRydWUpOworICAKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQ29uc3RhbnQpOworCisgIC8vLyBnZXRUeXBlIC0gU3BlY2lhbGl6ZSB0aGUgZ2V0VHlwZSgpIG1ldGhvZCB0byBhbHdheXMgcmV0dXJuIGFuIEFycmF5VHlwZSwKKyAgLy8vIHdoaWNoIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBjYXN0aW5nIG5lZWRlZCBpbiBwYXJ0cyBvZiB0aGUgY29tcGlsZXIuCisgIC8vLworICBpbmxpbmUgY29uc3QgQXJyYXlUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEFycmF5VHlwZSo+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIGlzU3RyaW5nIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBvZiBpOCBhbmQKKyAgLy8vIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgYXJlIGFsbCBDb25zdGFudEludCdzLgorICBib29sIGlzU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8vIGlzQ1N0cmluZyAtIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJyYXkgaXMgYSBzdHJpbmcgKHNlZQorICAvLy8gQHZlcmJhdGltCisgIC8vLyBpc1N0cmluZykgYW5kIGl0IGVuZHMgaW4gYSBudWxsIGJ5dGUgXDAgYW5kIGRvZXMgbm90IGNvbnRhaW5zIGFueSBvdGhlcgorICAvLy8gQGVuZHZlcmJhdGltCisgIC8vLyBudWxsIGJ5dGVzIGV4Y2VwdCBpdHMgdGVybWluYXRvci4KKyAgYm9vbCBpc0NTdHJpbmcoKSBjb25zdDsKKworICAvLy8gZ2V0QXNTdHJpbmcgLSBJZiB0aGlzIGFycmF5IGlzIGlzU3RyaW5nKCksIHRoZW4gdGhpcyBtZXRob2QgY29udmVydHMgdGhlCisgIC8vLyBhcnJheSB0byBhbiBzdGQ6OnN0cmluZyBhbmQgcmV0dXJucyBpdC4gIE90aGVyd2lzZSwgaXQgYXNzZXJ0cyBvdXQuCisgIC8vLworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OworCisgIC8vLyBpc051bGxWYWx1ZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkKKyAgLy8vIGdldE51bGxWYWx1ZS4gIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UgYmVjYXVzZSB6ZXJvIGFycmF5cyBhcmUgYWx3YXlzCisgIC8vLyBjcmVhdGVkIGFzIENvbnN0YW50QWdncmVnYXRlWmVybyBvYmplY3RzLgorICB2aXJ0dWFsIGJvb2wgaXNOdWxsVmFsdWUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIHZpcnR1YWwgdm9pZCBkZXN0cm95Q29uc3RhbnQoKTsKKyAgdmlydHVhbCB2b2lkIHJlcGxhY2VVc2VzT2ZXaXRoT25Db25zdGFudChWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvLCBVc2UgKlUpOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudEFycmF5ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnRBcnJheVZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPENvbnN0YW50QXJyYXk+IDogcHVibGljIFZhcmlhZGljT3BlcmFuZFRyYWl0czw+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9DQVNURURfT1BFUkFORF9BQ0NFU1NPUlMoQ29uc3RhbnRBcnJheSwgQ29uc3RhbnQpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDb25zdGFudFN0cnVjdCAtIENvbnN0YW50IFN0cnVjdCBEZWNsYXJhdGlvbnMKKy8vCitjbGFzcyBDb25zdGFudFN0cnVjdCA6IHB1YmxpYyBDb25zdGFudCB7CisgIGZyaWVuZCBzdHJ1Y3QgQ29uc3RhbnRDcmVhdG9yPENvbnN0YW50U3RydWN0LCBTdHJ1Y3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiA+OworICBDb25zdGFudFN0cnVjdChjb25zdCBDb25zdGFudFN0cnVjdCAmKTsgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCitwcm90ZWN0ZWQ6CisgIENvbnN0YW50U3RydWN0KGNvbnN0IFN0cnVjdFR5cGUgKlQsIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJlZhbCk7CitwdWJsaWM6CisgIC8vIENvbnN0YW50U3RydWN0IGFjY2Vzc29ycworICBzdGF0aWMgQ29uc3RhbnQgKmdldChjb25zdCBTdHJ1Y3RUeXBlICpULCBjb25zdCBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICZWKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICZWLCBib29sIFBhY2tlZCk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqY29uc3QgKlZhbHMsIHVuc2lnbmVkIE51bVZhbHMsIGJvb2wgUGFja2VkKTsKKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDb25zdGFudCk7CisKKyAgLy8vIGdldFR5cGUoKSBzcGVjaWFsaXphdGlvbiAtIFJlZHVjZSBhbW91bnQgb2YgY2FzdGluZy4uLgorICAvLy8KKyAgaW5saW5lIGNvbnN0IFN0cnVjdFR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU3RydWN0VHlwZSo+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIGlzTnVsbFZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieQorICAvLy8gZ2V0TnVsbFZhbHVlLiAgVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZSBiZWNhdXNlIHplcm8gc3RydWN0cyBhcmUgYWx3YXlzCisgIC8vLyBjcmVhdGVkIGFzIENvbnN0YW50QWdncmVnYXRlWmVybyBvYmplY3RzLgorICB2aXJ0dWFsIGJvb2wgaXNOdWxsVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCB2b2lkIGRlc3Ryb3lDb25zdGFudCgpOworICB2aXJ0dWFsIHZvaWQgcmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50KFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8sIFVzZSAqVSk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50U3RydWN0ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnRTdHJ1Y3RWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxDb25zdGFudFN0cnVjdD4gOiBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPD4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX0NBU1RFRF9PUEVSQU5EX0FDQ0VTU09SUyhDb25zdGFudFN0cnVjdCwgQ29uc3RhbnQpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDb25zdGFudFVuaW9uIC0gQ29uc3RhbnQgVW5pb24gRGVjbGFyYXRpb25zCisvLworY2xhc3MgQ29uc3RhbnRVbmlvbiA6IHB1YmxpYyBDb25zdGFudCB7CisgIGZyaWVuZCBzdHJ1Y3QgQ29uc3RhbnRDcmVhdG9yPENvbnN0YW50VW5pb24sIFVuaW9uVHlwZSwgQ29uc3RhbnQqPjsKKyAgQ29uc3RhbnRVbmlvbihjb25zdCBDb25zdGFudFVuaW9uICYpOyAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3Byb3RlY3RlZDoKKyAgQ29uc3RhbnRVbmlvbihjb25zdCBVbmlvblR5cGUgKlQsIENvbnN0YW50KiBWYWwpOworcHVibGljOgorICAvLyBDb25zdGFudFVuaW9uIGFjY2Vzc29ycworICBzdGF0aWMgQ29uc3RhbnQgKmdldChjb25zdCBVbmlvblR5cGUgKlQsIENvbnN0YW50KiBWKTsKKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDb25zdGFudCk7CisgIAorICAvLy8gZ2V0VHlwZSgpIHNwZWNpYWxpemF0aW9uIC0gUmVkdWNlIGFtb3VudCBvZiBjYXN0aW5nLi4uCisgIC8vLworICBpbmxpbmUgY29uc3QgVW5pb25UeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFVuaW9uVHlwZSo+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIGlzTnVsbFZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieQorICAvLy8gZ2V0TnVsbFZhbHVlLiAgVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZSBiZWNhdXNlIHplcm8gc3RydWN0cyBhcmUgYWx3YXlzCisgIC8vLyBjcmVhdGVkIGFzIENvbnN0YW50QWdncmVnYXRlWmVybyBvYmplY3RzLgorICB2aXJ0dWFsIGJvb2wgaXNOdWxsVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCB2b2lkIGRlc3Ryb3lDb25zdGFudCgpOworICB2aXJ0dWFsIHZvaWQgcmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50KFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8sIFVzZSAqVSk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50VW5pb24gKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBDb25zdGFudFVuaW9uVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8Q29uc3RhbnRVbmlvbj4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDE+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9DQVNURURfT1BFUkFORF9BQ0NFU1NPUlMoQ29uc3RhbnRVbmlvbiwgQ29uc3RhbnQpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29uc3RhbnRWZWN0b3IgLSBDb25zdGFudCBWZWN0b3IgRGVjbGFyYXRpb25zCisvLy8KK2NsYXNzIENvbnN0YW50VmVjdG9yIDogcHVibGljIENvbnN0YW50IHsKKyAgZnJpZW5kIHN0cnVjdCBDb25zdGFudENyZWF0b3I8Q29uc3RhbnRWZWN0b3IsIFZlY3RvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ID47CisgIENvbnN0YW50VmVjdG9yKGNvbnN0IENvbnN0YW50VmVjdG9yICYpOyAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3Byb3RlY3RlZDoKKyAgQ29uc3RhbnRWZWN0b3IoY29uc3QgVmVjdG9yVHlwZSAqVCwgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiAmVmFsKTsKK3B1YmxpYzoKKyAgLy8gQ29uc3RhbnRWZWN0b3IgYWNjZXNzb3JzCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KGNvbnN0IFZlY3RvclR5cGUgKlQsIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJlYpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldChjb25zdCBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICZWKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoQ29uc3RhbnQgKmNvbnN0ICpWYWxzLCB1bnNpZ25lZCBOdW1WYWxzKTsKKyAgCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENvbnN0YW50KTsKKworICAvLy8gZ2V0VHlwZSAtIFNwZWNpYWxpemUgdGhlIGdldFR5cGUoKSBtZXRob2QgdG8gYWx3YXlzIHJldHVybiBhIFZlY3RvclR5cGUsCisgIC8vLyB3aGljaCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgY2FzdGluZyBuZWVkZWQgaW4gcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICAvLy8KKyAgaW5saW5lIGNvbnN0IFZlY3RvclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmVjdG9yVHlwZSo+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisgIAorICAvLy8gaXNOdWxsVmFsdWUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSB2YWx1ZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5CisgIC8vLyBnZXROdWxsVmFsdWUuICBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlIGJlY2F1c2UgemVybyB2ZWN0b3JzIGFyZSBhbHdheXMKKyAgLy8vIGNyZWF0ZWQgYXMgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvIG9iamVjdHMuCisgIHZpcnR1YWwgYm9vbCBpc051bGxWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZmYgZXZlcnkgZWxlbWVudCBpbiB0aGlzIHZlY3RvciBjb25zdGFudAorICAvLy8gaXMgc2V0IHRvIGFsbCBvbmVzLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCdzIGVtZW1lbnRzIGFyZSBhbGwgc2V0IHRvIGFsbCBvbmVzLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgYWxsIG9uZXMuCisgIGJvb2wgaXNBbGxPbmVzVmFsdWUoKSBjb25zdDsKKworICAvLy8gZ2V0U3BsYXRWYWx1ZSAtIElmIHRoaXMgaXMgYSBzcGxhdCBjb25zdGFudCwgbWVhbmluZyB0aGF0IGFsbCBvZiB0aGUKKyAgLy8vIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgdmFsdWUsIHJldHVybiB0aGF0IHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCisgIENvbnN0YW50ICpnZXRTcGxhdFZhbHVlKCk7CisKKyAgdmlydHVhbCB2b2lkIGRlc3Ryb3lDb25zdGFudCgpOworICB2aXJ0dWFsIHZvaWQgcmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50KFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8sIFVzZSAqVSk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50VmVjdG9yICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnRWZWN0b3JWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxDb25zdGFudFZlY3Rvcj4gOiBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPD4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX0NBU1RFRF9PUEVSQU5EX0FDQ0VTU09SUyhDb25zdGFudFZlY3RvciwgQ29uc3RhbnQpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29uc3RhbnRQb2ludGVyTnVsbCAtIGEgY29uc3RhbnQgcG9pbnRlciB2YWx1ZSB0aGF0IHBvaW50cyB0byBudWxsCisvLy8KK2NsYXNzIENvbnN0YW50UG9pbnRlck51bGwgOiBwdWJsaWMgQ29uc3RhbnQgeworICBmcmllbmQgc3RydWN0IENvbnN0YW50Q3JlYXRvcjxDb25zdGFudFBvaW50ZXJOdWxsLCBQb2ludGVyVHlwZSwgY2hhcj47CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKTsgICAgICAgICAgICAgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIENvbnN0YW50UG9pbnRlck51bGwoY29uc3QgQ29uc3RhbnRQb2ludGVyTnVsbCAmKTsgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IENvbnN0YW50UG9pbnRlck51bGwoY29uc3QgUG9pbnRlclR5cGUgKlQpCisgICAgOiBDb25zdGFudChyZWludGVycHJldF9jYXN0PGNvbnN0IFR5cGUqPihUKSwKKyAgICAgICAgICAgICAgIFZhbHVlOjpDb25zdGFudFBvaW50ZXJOdWxsVmFsLCAwLCAwKSB7fQorCitwcm90ZWN0ZWQ6CisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHplcm8gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAwKTsKKyAgfQorcHVibGljOgorICAvLy8gZ2V0KCkgLSBTdGF0aWMgZmFjdG9yeSBtZXRob2RzIC0gUmV0dXJuIG9iamVjdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZQorICBzdGF0aWMgQ29uc3RhbnRQb2ludGVyTnVsbCAqZ2V0KGNvbnN0IFBvaW50ZXJUeXBlICpUKTsKKworICAvLy8gaXNOdWxsVmFsdWUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSB2YWx1ZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5CisgIC8vLyBnZXROdWxsVmFsdWUuCisgIHZpcnR1YWwgYm9vbCBpc051bGxWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICB2aXJ0dWFsIHZvaWQgZGVzdHJveUNvbnN0YW50KCk7CisKKyAgLy8vIGdldFR5cGUgLSBTcGVjaWFsaXplIHRoZSBnZXRUeXBlKCkgbWV0aG9kIHRvIGFsd2F5cyByZXR1cm4gYW4gUG9pbnRlclR5cGUsCisgIC8vLyB3aGljaCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgY2FzdGluZyBuZWVkZWQgaW4gcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICAvLy8KKyAgaW5saW5lIGNvbnN0IFBvaW50ZXJUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFBvaW50ZXJUeXBlKj4oVmFsdWU6OmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RhbnRQb2ludGVyTnVsbCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50UG9pbnRlck51bGxWYWw7CisgIH0KK307CisKKy8vLyBCbG9ja0FkZHJlc3MgLSBUaGUgYWRkcmVzcyBvZiBhIGJhc2ljIGJsb2NrLgorLy8vCitjbGFzcyBCbG9ja0FkZHJlc3MgOiBwdWJsaWMgQ29uc3RhbnQgeworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCB1bnNpZ25lZCk7ICAgICAgICAgICAgICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAyKTsgfQorICBCbG9ja0FkZHJlc3MoRnVuY3Rpb24gKkYsIEJhc2ljQmxvY2sgKkJCKTsKK3B1YmxpYzoKKyAgLy8vIGdldCAtIFJldHVybiBhIEJsb2NrQWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBhbmQgYmFzaWMgYmxvY2suCisgIHN0YXRpYyBCbG9ja0FkZHJlc3MgKmdldChGdW5jdGlvbiAqRiwgQmFzaWNCbG9jayAqQkIpOworICAKKyAgLy8vIGdldCAtIFJldHVybiBhIEJsb2NrQWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jay4gIFRoZSBiYXNpYworICAvLy8gYmxvY2sgbXVzdCBiZSBlbWJlZGRlZCBpbnRvIGEgZnVuY3Rpb24uCisgIHN0YXRpYyBCbG9ja0FkZHJlc3MgKmdldChCYXNpY0Jsb2NrICpCQik7CisgIAorICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisgIAorICBGdW5jdGlvbiAqZ2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiAoRnVuY3Rpb24qKU9wPDA+KCkuZ2V0KCk7IH0KKyAgQmFzaWNCbG9jayAqZ2V0QmFzaWNCbG9jaygpIGNvbnN0IHsgcmV0dXJuIChCYXNpY0Jsb2NrKilPcDwxPigpLmdldCgpOyB9CisgIAorICAvLy8gaXNOdWxsVmFsdWUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSB2YWx1ZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5CisgIC8vLyBnZXROdWxsVmFsdWUuCisgIHZpcnR1YWwgYm9vbCBpc051bGxWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIAorICB2aXJ0dWFsIHZvaWQgZGVzdHJveUNvbnN0YW50KCk7CisgIHZpcnR1YWwgdm9pZCByZXBsYWNlVXNlc09mV2l0aE9uQ29uc3RhbnQoVmFsdWUgKkZyb20sIFZhbHVlICpUbywgVXNlICpVKTsKKyAgCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBCbG9ja0FkZHJlc3MgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQmxvY2tBZGRyZXNzVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8QmxvY2tBZGRyZXNzPiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8Mj4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX0NBU1RFRF9PUEVSQU5EX0FDQ0VTU09SUyhCbG9ja0FkZHJlc3MsIFZhbHVlKQorICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29uc3RhbnRFeHByIC0gYSBjb25zdGFudCB2YWx1ZSB0aGF0IGlzIGluaXRpYWxpemVkIHdpdGggYW4gZXhwcmVzc2lvbiB1c2luZworLy8vIG90aGVyIGNvbnN0YW50IHZhbHVlcy4KKy8vLworLy8vIFRoaXMgY2xhc3MgdXNlcyB0aGUgc3RhbmRhcmQgSW5zdHJ1Y3Rpb24gb3Bjb2RlcyB0byBkZWZpbmUgdGhlIHZhcmlvdXMKKy8vLyBjb25zdGFudCBleHByZXNzaW9ucy4gIFRoZSBPcGNvZGUgZmllbGQgZm9yIHRoZSBDb25zdGFudEV4cHIgY2xhc3MgaXMKKy8vLyBtYWludGFpbmVkIGluIHRoZSBWYWx1ZTo6U3ViY2xhc3NEYXRhIGZpZWxkLgorY2xhc3MgQ29uc3RhbnRFeHByIDogcHVibGljIENvbnN0YW50IHsKKyAgZnJpZW5kIHN0cnVjdCBDb25zdGFudENyZWF0b3I8Q29uc3RhbnRFeHByLFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ID4gPjsKKyAgZnJpZW5kIHN0cnVjdCBDb252ZXJ0Q29uc3RhbnRUeXBlPENvbnN0YW50RXhwciwgVHlwZT47CisKK3Byb3RlY3RlZDoKKyAgQ29uc3RhbnRFeHByKGNvbnN0IFR5cGUgKnR5LCB1bnNpZ25lZCBPcGNvZGUsIFVzZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpCisgICAgOiBDb25zdGFudCh0eSwgQ29uc3RhbnRFeHByVmFsLCBPcHMsIE51bU9wcykgeworICAgIC8vIE9wZXJhdGlvbiB0eXBlIChhbiBJbnN0cnVjdGlvbiBvcGNvZGUpIGlzIHN0b3JlZCBhcyB0aGUgU3ViY2xhc3NEYXRhLgorICAgIHNldFZhbHVlU3ViY2xhc3NEYXRhKE9wY29kZSk7CisgIH0KKworICAvLyBUaGVzZSBwcml2YXRlIG1ldGhvZHMgYXJlIHVzZWQgYnkgdGhlIHR5cGUgcmVzb2x1dGlvbiBjb2RlIHRvIGNyZWF0ZQorICAvLyBDb25zdGFudEV4cHJzIGluIGludGVybWVkaWF0ZSBmb3Jtcy4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRUeShjb25zdCBUeXBlICpUeSwgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzID0gMCk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Q29tcGFyZVR5KHVuc2lnbmVkIHNob3J0IHByZWQsIENvbnN0YW50ICpDMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTZWxlY3RUeShjb25zdCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMiwgQ29uc3RhbnQgKkMzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRHZXRFbGVtZW50UHRyVHkoY29uc3QgVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSogY29uc3QgKklkeHMsIHVuc2lnbmVkIE51bUlkeHMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEluQm91bmRzR2V0RWxlbWVudFB0clR5KGNvbnN0IFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSogY29uc3QgKklkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4cyk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RXh0cmFjdEVsZW1lbnRUeShjb25zdCBUeXBlICpUeSwgQ29uc3RhbnQgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEluc2VydEVsZW1lbnRUeShjb25zdCBUeXBlICpUeSwgQ29uc3RhbnQgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkVsdCwgQ29uc3RhbnQgKklkeCk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U2h1ZmZsZVZlY3RvclR5KGNvbnN0IFR5cGUgKlR5LCBDb25zdGFudCAqVjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpWMiwgQ29uc3RhbnQgKk1hc2spOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEV4dHJhY3RWYWx1ZVR5KGNvbnN0IFR5cGUgKlR5LCBDb25zdGFudCAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpJZHhzLCB1bnNpZ25lZCBOdW1JZHhzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbnNlcnRWYWx1ZVR5KGNvbnN0IFR5cGUgKlR5LCBDb25zdGFudCAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpJZHhzLCB1bnNpZ25lZCBOdW1JZHhzKTsKKworcHVibGljOgorICAvLyBTdGF0aWMgbWV0aG9kcyB0byBjb25zdHJ1Y3QgYSBDb25zdGFudEV4cHIgb2YgZGlmZmVyZW50IGtpbmRzLiAgTm90ZSB0aGF0CisgIC8vIHRoZXNlIG1ldGhvZHMgbWF5IHJldHVybiBhIG9iamVjdCB0aGF0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUKKyAgLy8gQ29uc3RhbnRFeHByIGNsYXNzLCBiZWNhdXNlIHRoZXkgd2lsbCBhdHRlbXB0IHRvIGZvbGQgdGhlIGNvbnN0YW50CisgIC8vIGV4cHJlc3Npb24gaW50byBzb21ldGhpbmcgc2ltcGxlciBpZiBwb3NzaWJsZS4KKworICAvLy8gZ2V0QWxpZ25PZiBjb25zdGFudCBleHByIC0gY29tcHV0ZXMgdGhlIGFsaWdubWVudCBvZiBhIHR5cGUgaW4gYSB0YXJnZXQKKyAgLy8vIGluZGVwZW5kZW50IHdheSAoTm90ZTogdGhlIHJldHVybiB0eXBlIGlzIGFuIGk2NCkuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0QWxpZ25PZihjb25zdCBUeXBlKiBUeSk7CisgIAorICAvLy8gZ2V0U2l6ZU9mIGNvbnN0YW50IGV4cHIgLSBjb21wdXRlcyB0aGUgKGFsbG9jKSBzaXplIG9mIGEgdHlwZSAoaW4KKyAgLy8vIGFkZHJlc3MtdW5pdHMsIG5vdCBiaXRzKSBpbiBhIHRhcmdldCBpbmRlcGVuZGVudCB3YXkgKE5vdGU6IHRoZSByZXR1cm4KKyAgLy8vIHR5cGUgaXMgYW4gaTY0KS4KKyAgLy8vCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U2l6ZU9mKGNvbnN0IFR5cGUqIFR5KTsKKworICAvLy8gZ2V0T2Zmc2V0T2YgY29uc3RhbnQgZXhwciAtIGNvbXB1dGVzIHRoZSBvZmZzZXQgb2YgYSBzdHJ1Y3QgZmllbGQgaW4gYSAKKyAgLy8vIHRhcmdldCBpbmRlcGVuZGVudCB3YXkgKE5vdGU6IHRoZSByZXR1cm4gdHlwZSBpcyBhbiBpNjQpLgorICAvLy8KKyAgc3RhdGljIENvbnN0YW50ICpnZXRPZmZzZXRPZihjb25zdCBTdHJ1Y3RUeXBlKiBTVHksIHVuc2lnbmVkIEZpZWxkTm8pOworCisgIC8vLyBnZXRPZmZzZXRPZiBjb25zdGFudCBleHByIC0gVGhpcyBpcyBhIGdlbmVyYWxpemVkIGZvcm0gb2YgZ2V0T2Zmc2V0T2YsCisgIC8vLyB3aGljaCBzdXBwb3J0cyBhbnkgYWdncmVnYXRlIHR5cGUsIGFuZCBhbnkgQ29uc3RhbnQgaW5kZXguCisgIC8vLworICBzdGF0aWMgQ29uc3RhbnQgKmdldE9mZnNldE9mKGNvbnN0IFR5cGUqIFR5LCBDb25zdGFudCAqRmllbGRObyk7CisgIAorICBzdGF0aWMgQ29uc3RhbnQgKmdldE5lZyhDb25zdGFudCAqQyk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Rk5lZyhDb25zdGFudCAqQyk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Tm90KENvbnN0YW50ICpDKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRBZGQoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZBZGQoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFN1YihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlN1YihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TXVsKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGTXVsKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRVRGl2KENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTRGl2KENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGRGl2KENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRVUmVtKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTUmVtKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUmVtKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRBbmQoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldE9yKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRYb3IoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFNobChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TFNocihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0QVNocihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0VHJ1bmMgICAoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKlR5KTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTRXh0ICAgIChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFpFeHQgICAgKENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpUeSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlBUcnVuYyAoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKlR5KTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUEV4dGVuZChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFVJVG9GUCAgKENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpUeSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U0lUb0ZQICAoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKlR5KTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUFRvVUkgIChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZQVG9TSSAgKENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpUeSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0UHRyVG9JbnQoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKlR5KTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbnRUb1B0cihDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEJpdENhc3QgKENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpUeSk7CisKKyAgc3RhdGljIENvbnN0YW50ICpnZXROU1dOZWcoQ29uc3RhbnQgKkMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5VV05lZyhDb25zdGFudCAqQyk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlNXQWRkKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXROVVdBZGQoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5TV1N1YihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlVXU3ViKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXROU1dNdWwoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5VV011bChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RXhhY3RTRGl2KENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDb25zdGFudCk7CisKKyAgLy8gQGJyaWVmIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIG9uZSBvZiB0aGUgY2FzdGluZyBvcGVyYXRpb25zCisgIC8vIHVzaW5nIGEgQ2FzdE9wcyBvcGNvZGUuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Q2FzdCgKKyAgICB1bnNpZ25lZCBvcHMsICAvLy88IFRoZSBvcGNvZGUgZm9yIHRoZSBjb252ZXJzaW9uCisgICAgQ29uc3RhbnQgKkMsICAgLy8vPCBUaGUgY29uc3RhbnQgdG8gYmUgY29udmVydGVkCisgICAgY29uc3QgVHlwZSAqVHkgLy8vPCBUaGUgdHlwZSB0byB3aGljaCB0aGUgY29uc3RhbnQgaXMgY29udmVydGVkCisgICk7CisKKyAgLy8gQGJyaWVmIENyZWF0ZSBhIFpFeHQgb3IgQml0Q2FzdCBjYXN0IGNvbnN0YW50IGV4cHJlc3Npb24KKyAgc3RhdGljIENvbnN0YW50ICpnZXRaRXh0T3JCaXRDYXN0KAorICAgIENvbnN0YW50ICpDLCAgIC8vLzwgVGhlIGNvbnN0YW50IHRvIHpleHQgb3IgYml0Y2FzdAorICAgIGNvbnN0IFR5cGUgKlR5IC8vLzwgVGhlIHR5cGUgdG8gemV4dCBvciBiaXRjYXN0IEMgdG8KKyAgKTsKKworICAvLyBAYnJpZWYgQ3JlYXRlIGEgU0V4dCBvciBCaXRDYXN0IGNhc3QgY29uc3RhbnQgZXhwcmVzc2lvbiAKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTRXh0T3JCaXRDYXN0KAorICAgIENvbnN0YW50ICpDLCAgIC8vLzwgVGhlIGNvbnN0YW50IHRvIHNleHQgb3IgYml0Y2FzdAorICAgIGNvbnN0IFR5cGUgKlR5IC8vLzwgVGhlIHR5cGUgdG8gc2V4dCBvciBiaXRjYXN0IEMgdG8KKyAgKTsKKworICAvLyBAYnJpZWYgQ3JlYXRlIGEgVHJ1bmMgb3IgQml0Q2FzdCBjYXN0IGNvbnN0YW50IGV4cHJlc3Npb24KKyAgc3RhdGljIENvbnN0YW50ICpnZXRUcnVuY09yQml0Q2FzdCgKKyAgICBDb25zdGFudCAqQywgICAvLy88IFRoZSBjb25zdGFudCB0byB0cnVuYyBvciBiaXRjYXN0CisgICAgY29uc3QgVHlwZSAqVHkgLy8vPCBUaGUgdHlwZSB0byB0cnVuYyBvciBiaXRjYXN0IEMgdG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIEJpdENhc3Qgb3IgYSBQdHJUb0ludCBjYXN0IGNvbnN0YW50IGV4cHJlc3Npb24KKyAgc3RhdGljIENvbnN0YW50ICpnZXRQb2ludGVyQ2FzdCgKKyAgICBDb25zdGFudCAqQywgICAvLy88IFRoZSBwb2ludGVyIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIGNvbnN0IFR5cGUgKlR5IC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgWkV4dCwgQml0Y2FzdCBvciBUcnVuYyBmb3IgaW50ZWdlciAtPiBpbnRlZ2VyIGNhc3RzCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW50ZWdlckNhc3QoCisgICAgQ29uc3RhbnQgKkMsICAgIC8vLzwgVGhlIGludGVnZXIgY29uc3RhbnQgdG8gYmUgY2FzdGVkIAorICAgIGNvbnN0IFR5cGUgKlR5LCAvLy88IFRoZSBpbnRlZ2VyIHR5cGUgdG8gY2FzdCB0bworICAgIGJvb2wgaXNTaWduZWQgICAvLy88IFdoZXRoZXIgQyBzaG91bGQgYmUgdHJlYXRlZCBhcyBzaWduZWQgb3Igbm90CisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBGUEV4dCwgQml0Y2FzdCBvciBGUFRydW5jIGZvciBmcCAtPiBmcCBjYXN0cworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZQQ2FzdCgKKyAgICBDb25zdGFudCAqQywgICAgLy8vPCBUaGUgaW50ZWdlciBjb25zdGFudCB0byBiZSBjYXN0ZWQgCisgICAgY29uc3QgVHlwZSAqVHkgLy8vPCBUaGUgaW50ZWdlciB0eXBlIHRvIGNhc3QgdG8KKyAgKTsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBjb252ZXJ0IGNvbnN0YW50IGV4cHJlc3Npb24KKyAgYm9vbCBpc0Nhc3QoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBjb21wYXJlIGNvbnN0YW50IGV4cHJlc3Npb24KKyAgYm9vbCBpc0NvbXBhcmUoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW5zZXJ0dmFsdWUgb3IgZXh0cmFjdHZhbHVlIGV4cHJlc3Npb24sCisgIC8vLyBhbmQgdGhlIGdldEluZGljZXMoKSBtZXRob2QgbWF5IGJlIHVzZWQuCisgIGJvb2wgaGFzSW5kaWNlcygpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGdldGVsZW1lbnRwdHIgZXhwcmVzc2lvbiBhbmQgYWxsCisgIC8vLyB0aGUgaW5kZXggb3BlcmFuZHMgYXJlIGNvbXBpbGUtdGltZSBrbm93biBpbnRlZ2VycyB3aXRoaW4gdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIG5vdGlvbmFsIHN0YXRpYyBhcnJheSBleHRlbnRzLiBOb3RlIHRoYXQgdGhpcyBpcworICAvLy8gbm90IGVxdWl2YWxhbnQgdG8sIGEgc3Vic2V0IG9mLCBvciBhIHN1cGVyc2V0IG9mIHRoZSAiaW5ib3VuZHMiCisgIC8vLyBwcm9wZXJ0eS4KKyAgYm9vbCBpc0dFUFdpdGhOb05vdGlvbmFsT3ZlckluZGV4aW5nKCkgY29uc3Q7CisKKyAgLy8vIFNlbGVjdCBjb25zdGFudCBleHByCisgIC8vLworICBzdGF0aWMgQ29uc3RhbnQgKmdldFNlbGVjdChDb25zdGFudCAqQywgQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIpIHsKKyAgICByZXR1cm4gZ2V0U2VsZWN0VHkoVjEtPmdldFR5cGUoKSwgQywgVjEsIFYyKTsKKyAgfQorCisgIC8vLyBnZXQgLSBSZXR1cm4gYSBiaW5hcnkgb3Igc2hpZnQgb3BlcmF0b3IgY29uc3RhbnQgZXhwcmVzc2lvbiwKKyAgLy8vIGZvbGRpbmcgaWYgcG9zc2libGUuCisgIC8vLworICBzdGF0aWMgQ29uc3RhbnQgKmdldCh1bnNpZ25lZCBPcGNvZGUsIENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncyA9IDApOworCisgIC8vLyBAYnJpZWYgUmV0dXJuIGFuIElDbXAgb3IgRkNtcCBjb21wYXJpc29uIG9wZXJhdG9yIGNvbnN0YW50IGV4cHJlc3Npb24uCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Q29tcGFyZSh1bnNpZ25lZCBzaG9ydCBwcmVkLCBDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisKKyAgLy8vIGdldCogLSBSZXR1cm4gc29tZSBjb21tb24gY29uc3RhbnRzIHdpdGhvdXQgaGF2aW5nIHRvCisgIC8vLyBzcGVjaWZ5IHRoZSBmdWxsIEluc3RydWN0aW9uOjpPUENPREUgaWRlbnRpZmllci4KKyAgLy8vCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SUNtcCh1bnNpZ25lZCBzaG9ydCBwcmVkLCBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGQ21wKHVuc2lnbmVkIHNob3J0IHByZWQsIENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpOworCisgIC8vLyBHZXRlbGVtZW50cHRyIGZvcm0uICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGlzIG9ubHkgYWNjZXB0ZWQgZm9yIGNvbnZlbmllbmNlOgorICAvLy8gYWxsIGVsZW1lbnRzIG11c3QgYmUgQ29uc3RhbnQncy4KKyAgLy8vCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0R2V0RWxlbWVudFB0cihDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpjb25zdCAqSWR4TGlzdCwgdW5zaWduZWQgTnVtSWR4KTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRHZXRFbGVtZW50UHRyKENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUqIGNvbnN0ICpJZHhMaXN0LCB1bnNpZ25lZCBOdW1JZHgpOworCisgIC8vLyBDcmVhdGUgYW4gImluYm91bmRzIiBnZXRlbGVtZW50cHRyLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQorICAvLy8gImluYm91bmRzIiBmbGFnIGluIExhbmdSZWYuaHRtbCBmb3IgZGV0YWlscy4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbkJvdW5kc0dldEVsZW1lbnRQdHIoQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpjb25zdCAqSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4KTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbkJvdW5kc0dldEVsZW1lbnRQdHIoQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBjb25zdCAqSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4KTsKKworICBzdGF0aWMgQ29uc3RhbnQgKmdldEV4dHJhY3RFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpJZHgpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEluc2VydEVsZW1lbnQoQ29uc3RhbnQgKlZlYywgQ29uc3RhbnQgKkVsdCxDb25zdGFudCAqSWR4KTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTaHVmZmxlVmVjdG9yKENvbnN0YW50ICpWMSwgQ29uc3RhbnQgKlYyLCBDb25zdGFudCAqTWFzayk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RXh0cmFjdFZhbHVlKENvbnN0YW50ICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpJZHhMaXN0LCB1bnNpZ25lZCBOdW1JZHgpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEluc2VydFZhbHVlKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKklkeExpc3QsIHVuc2lnbmVkIE51bUlkeCk7CisKKyAgLy8vIGlzTnVsbFZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieQorICAvLy8gZ2V0TnVsbFZhbHVlLgorICB2aXJ0dWFsIGJvb2wgaXNOdWxsVmFsdWUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBnZXRPcGNvZGUgLSBSZXR1cm4gdGhlIG9wY29kZSBhdCB0aGUgcm9vdCBvZiB0aGlzIGNvbnN0YW50IGV4cHJlc3Npb24KKyAgdW5zaWduZWQgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCk7IH0KKworICAvLy8gZ2V0UHJlZGljYXRlIC0gUmV0dXJuIHRoZSBJQ01QIG9yIEZDTVAgcHJlZGljYXRlIHZhbHVlLiBBc3NlcnQgaWYgdGhpcyBpcworICAvLy8gbm90IGFuIElDTVAgb3IgRkNNUCBjb25zdGFudCBleHByZXNzaW9uLgorICB1bnNpZ25lZCBnZXRQcmVkaWNhdGUoKSBjb25zdDsKKworICAvLy8gZ2V0SW5kaWNlcyAtIEFzc2VydCB0aGF0IHRoaXMgaXMgYW4gaW5zZXJ0dmFsdWUgb3IgZXhhY3R2YWx1ZQorICAvLy8gZXhwcmVzc2lvbiBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIGluZGljZXMuCisgIGNvbnN0IFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmZ2V0SW5kaWNlcygpIGNvbnN0OworCisgIC8vLyBnZXRPcGNvZGVOYW1lIC0gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBhbiBvcGNvZGUuCisgIGNvbnN0IGNoYXIgKmdldE9wY29kZU5hbWUoKSBjb25zdDsKKworICAvLy8gZ2V0V2l0aE9wZXJhbmRSZXBsYWNlZCAtIFJldHVybiBhIGNvbnN0YW50IGV4cHJlc3Npb24gaWRlbnRpY2FsIHRvIHRoaXMKKyAgLy8vIG9uZSwgYnV0IHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYW5kIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICBDb25zdGFudCAqZ2V0V2l0aE9wZXJhbmRSZXBsYWNlZCh1bnNpZ25lZCBPcE5vLCBDb25zdGFudCAqT3ApIGNvbnN0OworICAKKyAgLy8vIGdldFdpdGhPcGVyYW5kcyAtIFRoaXMgcmV0dXJucyB0aGUgY3VycmVudCBjb25zdGFudCBleHByZXNzaW9uIHdpdGggdGhlCisgIC8vLyBvcGVyYW5kcyByZXBsYWNlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiAgVGhlIHNwZWNpZmllZCBvcGVyYW5kcyBtdXN0CisgIC8vLyBtYXRjaCBjb3VudCBhbmQgdHlwZSB3aXRoIHRoZSBleGlzdGluZyBvbmVzLgorICBDb25zdGFudCAqZ2V0V2l0aE9wZXJhbmRzKGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJk9wcykgY29uc3QgeworICAgIHJldHVybiBnZXRXaXRoT3BlcmFuZHMoJk9wc1swXSwgKHVuc2lnbmVkKU9wcy5zaXplKCkpOworICB9CisgIENvbnN0YW50ICpnZXRXaXRoT3BlcmFuZHMoQ29uc3RhbnQgKmNvbnN0ICpPcHMsIHVuc2lnbmVkIE51bU9wcykgY29uc3Q7CisgIAorICB2aXJ0dWFsIHZvaWQgZGVzdHJveUNvbnN0YW50KCk7CisgIHZpcnR1YWwgdm9pZCByZXBsYWNlVXNlc09mV2l0aE9uQ29uc3RhbnQoVmFsdWUgKkZyb20sIFZhbHVlICpUbywgVXNlICpVKTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RhbnRFeHByICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50RXhwclZhbDsKKyAgfQorICAKK3ByaXZhdGU6CisgIC8vIFNoYWRvdyBWYWx1ZTo6c2V0VmFsdWVTdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZyBtZXRob2Qgc28gdGhhdAorICAvLyBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldFZhbHVlU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBWYWx1ZTo6c2V0VmFsdWVTdWJjbGFzc0RhdGEoRCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxDb25zdGFudEV4cHI+IDogcHVibGljIFZhcmlhZGljT3BlcmFuZFRyYWl0czwxPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfQ0FTVEVEX09QRVJBTkRfQUNDRVNTT1JTKENvbnN0YW50RXhwciwgQ29uc3RhbnQpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVW5kZWZWYWx1ZSAtICd1bmRlZicgdmFsdWVzIGFyZSB0aGluZ3MgdGhhdCBkbyBub3QgaGF2ZSBzcGVjaWZpZWQgY29udGVudHMuCisvLy8gVGhlc2UgYXJlIHVzZWQgZm9yIGEgdmFyaWV0eSBvZiBwdXJwb3NlcywgaW5jbHVkaW5nIGdsb2JhbCB2YXJpYWJsZQorLy8vIGluaXRpYWxpemVycyBhbmQgb3BlcmFuZHMgdG8gaW5zdHJ1Y3Rpb25zLiAgJ3VuZGVmJyB2YWx1ZXMgY2FuIG9jY3VyIHdpdGgKKy8vLyBhbnkgZmlyc3QtY2xhc3MgdHlwZS4KKy8vLworLy8vIFVuZGVmIHZhbHVlcyBhcmVuJ3QgZXhhY3RseSBjb25zdGFudHM7IGlmIHRoZXkgaGF2ZSBtdWx0aXBsZSB1c2VzLCB0aGV5CisvLy8gY2FuIGFwcGVhciB0byBoYXZlIGRpZmZlcmVudCBiaXQgcGF0dGVybnMgYXQgZWFjaCB1c2UuIFNlZQorLy8vIExhbmdSZWYuaHRtbCN1bmRlZnZhbHVlcyBmb3IgZGV0YWlscy4KKy8vLworY2xhc3MgVW5kZWZWYWx1ZSA6IHB1YmxpYyBDb25zdGFudCB7CisgIGZyaWVuZCBzdHJ1Y3QgQ29uc3RhbnRDcmVhdG9yPFVuZGVmVmFsdWUsIFR5cGUsIGNoYXI+OworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCB1bnNpZ25lZCk7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgVW5kZWZWYWx1ZShjb25zdCBVbmRlZlZhbHVlICYpOyAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgVW5kZWZWYWx1ZShjb25zdCBUeXBlICpUKSA6IENvbnN0YW50KFQsIFVuZGVmVmFsdWVWYWwsIDAsIDApIHt9Citwcm90ZWN0ZWQ6CisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHplcm8gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAwKTsKKyAgfQorcHVibGljOgorICAvLy8gZ2V0KCkgLSBTdGF0aWMgZmFjdG9yeSBtZXRob2RzIC0gUmV0dXJuIGFuICd1bmRlZicgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHR5cGUuCisgIC8vLworICBzdGF0aWMgVW5kZWZWYWx1ZSAqZ2V0KGNvbnN0IFR5cGUgKlQpOworCisgIC8vLyBpc051bGxWYWx1ZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkKKyAgLy8vIGdldE51bGxWYWx1ZS4KKyAgdmlydHVhbCBib29sIGlzTnVsbFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICB2aXJ0dWFsIHZvaWQgZGVzdHJveUNvbnN0YW50KCk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFVuZGVmVmFsdWUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBVbmRlZlZhbHVlVmFsOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9EZXJpdmVkVHlwZXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9EZXJpdmVkVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY0ZWEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0Rlcml2ZWRUeXBlcy5oCkBAIC0wLDAgKzEsNTcyIEBACisvLz09PS0tIGxsdm0vRGVyaXZlZFR5cGVzLmggLSBDbGFzc2VzIGZvciBoYW5kbGluZyBkYXRhIHR5cGVzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgImRlcml2ZWQKKy8vIHR5cGVzIi4gIFRoZXNlIGFyZSB0aGluZ3MgbGlrZSAiYXJyYXlzIG9mIHgiIG9yICJzdHJ1Y3R1cmUgb2YgeCwgeSwgeiIgb3IKKy8vICJtZXRob2QgcmV0dXJuaW5nIHggdGFraW5nICh5LHopIGFzIHBhcmFtZXRlcnMiLCBldGMuLi4KKy8vCisvLyBUaGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIGNsYXNzZXMgbGl2ZSBpbiB0aGUgVHlwZS5jcHAgZmlsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVSSVZFRF9UWVBFU19ICisjZGVmaW5lIExMVk1fREVSSVZFRF9UWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBWYWx1ZTsKK3RlbXBsYXRlPGNsYXNzIFZhbFR5cGUsIGNsYXNzIFR5cGVDbGFzcz4gY2xhc3MgVHlwZU1hcDsKK2NsYXNzIEZ1bmN0aW9uVmFsVHlwZTsKK2NsYXNzIEFycmF5VmFsVHlwZTsKK2NsYXNzIFN0cnVjdFZhbFR5cGU7CitjbGFzcyBVbmlvblZhbFR5cGU7CitjbGFzcyBQb2ludGVyVmFsVHlwZTsKK2NsYXNzIFZlY3RvclZhbFR5cGU7CitjbGFzcyBJbnRlZ2VyVmFsVHlwZTsKK2NsYXNzIEFQSW50OworY2xhc3MgTExWTUNvbnRleHQ7CisKK2NsYXNzIERlcml2ZWRUeXBlIDogcHVibGljIFR5cGUgeworICBmcmllbmQgY2xhc3MgVHlwZTsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBEZXJpdmVkVHlwZShMTFZNQ29udGV4dCAmQywgVHlwZUlEIGlkKSA6IFR5cGUoQywgaWQpIHt9CisKKyAgLy8vIG5vdGlmeVVzZXNUaGF0VHlwZUJlY2FtZUNvbmNyZXRlIC0gTm90aWZ5IEFic3RyYWN0VHlwZVVzZXJzIG9mIHRoaXMgdHlwZQorICAvLy8gdGhhdCB0aGUgY3VycmVudCB0eXBlIGhhcyB0cmFuc2l0aW9uZWQgZnJvbSBiZWluZyBhYnN0cmFjdCB0byBiZWluZworICAvLy8gY29uY3JldGUuCisgIC8vLworICB2b2lkIG5vdGlmeVVzZXNUaGF0VHlwZUJlY2FtZUNvbmNyZXRlKCk7CisKKyAgLy8vIGRyb3BBbGxUeXBlVXNlcyAtIFdoZW4gdGhpcyAoYWJzdHJhY3QpIHR5cGUgaXMgcmVzb2x2ZWQgdG8gYmUgZXF1YWwgdG8KKyAgLy8vIGFub3RoZXIgKG1vcmUgY29uY3JldGUpIHR5cGUsIHdlIG11c3QgZWxpbWluYXRlIGFsbCByZWZlcmVuY2VzIHRvIG90aGVyCisgIC8vLyB0eXBlcywgdG8gYXZvaWQgc29tZSBjaXJjdWxhciByZWZlcmVuY2UgcHJvYmxlbXMuCisgIC8vLworICB2b2lkIGRyb3BBbGxUeXBlVXNlcygpOworCitwdWJsaWM6CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFic3RyYWN0IFR5cGUgaGFuZGxpbmcgbWV0aG9kcyAtIFRoZXNlIHR5cGVzIGhhdmUgc3BlY2lhbCBsaWZldGltZXMsIHdoaWNoCisgIC8vIGFyZSBtYW5hZ2VkIGJ5IChhZGR8cmVtb3ZlKUFic3RyYWN0VHlwZVVzZXIuIFNlZSBjb21tZW50cyBpbgorICAvLyBBYnN0cmFjdFR5cGVVc2VyLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgLy8vIHJlZmluZUFic3RyYWN0VHlwZVRvIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdoZW4gaXQgaXMgZGlzY292ZXJlZCB0aGF0CisgIC8vLyB0aGUgJ3RoaXMnIGFic3RyYWN0IHR5cGUgaXMgYWN0dWFsbHkgZXF1aXZhbGVudCB0byB0aGUgTmV3VHlwZSBzcGVjaWZpZWQuCisgIC8vLyBUaGlzIGNhdXNlcyBhbGwgdXNlcnMgb2YgJ3RoaXMnIHRvIHN3aXRjaCB0byByZWZlcmVuY2UgdGhlIG1vcmUgY29uY3JldGUKKyAgLy8vIHR5cGUgTmV3VHlwZSBhbmQgZm9yICd0aGlzJyB0byBiZSBkZWxldGVkLgorICAvLy8KKyAgdm9pZCByZWZpbmVBYnN0cmFjdFR5cGVUbyhjb25zdCBUeXBlICpOZXdUeXBlKTsKKworICB2b2lkIGR1bXAoKSBjb25zdCB7IFR5cGU6OmR1bXAoKTsgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IERlcml2ZWRUeXBlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5pc0Rlcml2ZWRUeXBlKCk7CisgIH0KK307CisKKy8vLyBDbGFzcyB0byByZXByZXNlbnQgaW50ZWdlciB0eXBlcy4gTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgYWxzbyB1c2VkIHRvCisvLy8gcmVwcmVzZW50IHRoZSBidWlsdC1pbiBpbnRlZ2VyIHR5cGVzOiBJbnQxVHksIEludDhUeSwgSW50MTZUeSwgSW50MzJUeSBhbmQKKy8vLyBJbnQ2NFR5LgorLy8vIEBicmllZiBJbnRlZ2VyIHJlcHJlc2VudGF0aW9uIHR5cGUKK2NsYXNzIEludGVnZXJUeXBlIDogcHVibGljIERlcml2ZWRUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEludGVnZXJUeXBlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBOdW1CaXRzKSA6IAorICAgICAgRGVyaXZlZFR5cGUoQywgSW50ZWdlclR5SUQpIHsKKyAgICBzZXRTdWJjbGFzc0RhdGEoTnVtQml0cyk7CisgIH0KKyAgZnJpZW5kIGNsYXNzIFR5cGVNYXA8SW50ZWdlclZhbFR5cGUsIEludGVnZXJUeXBlPjsKK3B1YmxpYzoKKyAgLy8vIFRoaXMgZW51bSBpcyBqdXN0IHVzZWQgdG8gaG9sZCBjb25zdGFudHMgd2UgbmVlZCBmb3IgSW50ZWdlclR5cGUuCisgIGVudW0geworICAgIE1JTl9JTlRfQklUUyA9IDEsICAgICAgICAvLy88IE1pbmltdW0gbnVtYmVyIG9mIGJpdHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkCisgICAgTUFYX0lOVF9CSVRTID0gKDE8PDIzKS0xIC8vLzwgTWF4aW11bSBudW1iZXIgb2YgYml0cyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQKKyAgICAgIC8vLzwgTm90ZSB0aGF0IGJpdCB3aWR0aCBpcyBzdG9yZWQgaW4gdGhlIFR5cGUgY2xhc3NlcyBTdWJjbGFzc0RhdGEgZmllbGQKKyAgICAgIC8vLzwgd2hpY2ggaGFzIDIzIGJpdHMuIFRoaXMgeWllbGRzIGEgbWF4aW11bSBiaXQgd2lkdGggb2YgOCwzODgsNjA3IGJpdHMuCisgIH07CisKKyAgLy8vIFRoaXMgc3RhdGljIG1ldGhvZCBpcyB0aGUgcHJpbWFyeSB3YXkgb2YgY29uc3RydWN0aW5nIGFuIEludGVnZXJUeXBlLgorICAvLy8gSWYgYW4gSW50ZWdlclR5cGUgd2l0aCB0aGUgc2FtZSBOdW1CaXRzIHZhbHVlIHdhcyBwcmV2aW91c2x5IGluc3RhbnRpYXRlZCwKKyAgLy8vIHRoYXQgaW5zdGFuY2Ugd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlIGEgbmV3IG9uZSB3aWxsIGJlIGNyZWF0ZWQuIE9ubHkKKyAgLy8vIG9uZSBpbnN0YW5jZSB3aXRoIGEgZ2l2ZW4gTnVtQml0cyB2YWx1ZSBpcyBldmVyIGNyZWF0ZWQuCisgIC8vLyBAYnJpZWYgR2V0IG9yIGNyZWF0ZSBhbiBJbnRlZ2VyVHlwZSBpbnN0YW5jZS4KKyAgc3RhdGljIGNvbnN0IEludGVnZXJUeXBlKiBnZXQoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIE51bUJpdHMpOworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGlzIEludGVnZXJUeXBlCisgIHVuc2lnbmVkIGdldEJpdFdpZHRoKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhKCk7IH0KKworICAvLy8gZ2V0Qml0TWFzayAtIFJldHVybiBhIGJpdG1hc2sgd2l0aCBvbmVzIHNldCBmb3IgYWxsIG9mIHRoZSBiaXRzCisgIC8vLyB0aGF0IGNhbiBiZSBzZXQgYnkgYW4gdW5zaWduZWQgdmVyc2lvbiBvZiB0aGlzIHR5cGUuICBUaGlzIGlzIDB4RkYgZm9yCisgIC8vLyBpOCwgMHhGRkZGIGZvciBpMTYsIGV0Yy4KKyAgdWludDY0X3QgZ2V0Qml0TWFzaygpIGNvbnN0IHsKKyAgICByZXR1cm4gfnVpbnQ2NF90KDBVTCkgPj4gKDY0LWdldEJpdFdpZHRoKCkpOworICB9CisKKyAgLy8vIGdldFNpZ25CaXQgLSBSZXR1cm4gYSB1aW50NjRfdCB3aXRoIGp1c3QgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldCAodGhlCisgIC8vLyBzaWduIGJpdCwgaWYgdGhlIHZhbHVlIGlzIHRyZWF0ZWQgYXMgYSBzaWduZWQgbnVtYmVyKS4KKyAgdWludDY0X3QgZ2V0U2lnbkJpdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gMVVMTCA8PCAoZ2V0Qml0V2lkdGgoKS0xKTsKKyAgfQorCisgIC8vLyBGb3IgZXhhbXBsZSwgdGhpcyBpcyAweEZGIGZvciBhbiA4IGJpdCBpbnRlZ2VyLCAweEZGRkYgZm9yIGkxNiwgZXRjLgorICAvLy8gQHJldHVybnMgYSBiaXQgbWFzayB3aXRoIG9uZXMgc2V0IGZvciBhbGwgdGhlIGJpdHMgb2YgdGhpcyB0eXBlLgorICAvLy8gQGJyaWVmIEdldCBhIGJpdCBtYXNrIGZvciB0aGlzIHR5cGUuCisgIEFQSW50IGdldE1hc2soKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyBpZiB0aGUgd2lkdGggb2YgdGhpcyBJbnRlZ2VyVHlwZSBpcyBhIHBvd2VyLW9mLTIKKyAgLy8vIGluIHRlcm1zIG9mIDggYml0IGJ5dGVzLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgcG93ZXItb2YtMiBieXRlIHdpZHRoLgorICAvLy8gQGJyaWVmIElzIHRoaXMgYSBwb3dlci1vZi0yIGJ5dGUtd2lkdGggSW50ZWdlclR5cGUgPworICBib29sIGlzUG93ZXJPZjJCeXRlV2lkdGgoKSBjb25zdDsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnRlZ2VyVHlwZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUlEKCkgPT0gSW50ZWdlclR5SUQ7CisgIH0KK307CisKKworLy8vIEZ1bmN0aW9uVHlwZSAtIENsYXNzIHRvIHJlcHJlc2VudCBmdW5jdGlvbiB0eXBlcworLy8vCitjbGFzcyBGdW5jdGlvblR5cGUgOiBwdWJsaWMgRGVyaXZlZFR5cGUgeworICBmcmllbmQgY2xhc3MgVHlwZU1hcDxGdW5jdGlvblZhbFR5cGUsIEZ1bmN0aW9uVHlwZT47CisgIGJvb2wgaXNWYXJBcmdzOworCisgIEZ1bmN0aW9uVHlwZShjb25zdCBGdW5jdGlvblR5cGUgJik7ICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBpbXBsZW1lbnQKKyAgY29uc3QgRnVuY3Rpb25UeXBlICZvcGVyYXRvcj0oY29uc3QgRnVuY3Rpb25UeXBlICYpOyAgLy8gRG8gbm90IGltcGxlbWVudAorICBGdW5jdGlvblR5cGUoY29uc3QgVHlwZSAqUmVzdWx0LCBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gJlBhcmFtcywKKyAgICAgICAgICAgICAgIGJvb2wgSXNWYXJBcmdzKTsKKworcHVibGljOgorICAvLy8gRnVuY3Rpb25UeXBlOjpnZXQgLSBUaGlzIHN0YXRpYyBtZXRob2QgaXMgdGhlIHByaW1hcnkgd2F5IG9mIGNvbnN0cnVjdGluZworICAvLy8gYSBGdW5jdGlvblR5cGUuCisgIC8vLworICBzdGF0aWMgRnVuY3Rpb25UeXBlICpnZXQoCisgICAgY29uc3QgVHlwZSAqUmVzdWx0LCAvLy88IFRoZSByZXN1bHQgdHlwZQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiAmUGFyYW1zLCAvLy88IFRoZSB0eXBlcyBvZiB0aGUgcGFyYW1ldGVycworICAgIGJvb2wgaXNWYXJBcmcgIC8vLzwgV2hldGhlciB0aGlzIGlzIGEgdmFyaWFibGUgYXJndW1lbnQgbGVuZ3RoIGZ1bmN0aW9uCisgICk7CisKKyAgLy8vIEZ1bmN0aW9uVHlwZTo6Z2V0IC0gQ3JlYXRlIGEgRnVuY3Rpb25UeXBlIHRha2luZyBubyBwYXJhbWV0ZXJzLgorICAvLy8KKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KAorICAgIGNvbnN0IFR5cGUgKlJlc3VsdCwgLy8vPCBUaGUgcmVzdWx0IHR5cGUKKyAgICBib29sIGlzVmFyQXJnICAvLy88IFdoZXRoZXIgdGhpcyBpcyBhIHZhcmlhYmxlIGFyZ3VtZW50IGxlbmd0aCBmdW5jdGlvbgorICApIHsKKyAgICByZXR1cm4gZ2V0KFJlc3VsdCwgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSAqPigpLCBpc1ZhckFyZyk7CisgIH0KKworICAvLy8gaXNWYWxpZFJldHVyblR5cGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgdmFsaWQgYXMgYSByZXR1cm4KKyAgLy8vIHR5cGUuCisgIHN0YXRpYyBib29sIGlzVmFsaWRSZXR1cm5UeXBlKGNvbnN0IFR5cGUgKlJldFR5KTsKKworICAvLy8gaXNWYWxpZEFyZ3VtZW50VHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhbgorICAvLy8gYXJndW1lbnQgdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNWYWxpZEFyZ3VtZW50VHlwZShjb25zdCBUeXBlICpBcmdUeSk7CisKKyAgaW5saW5lIGJvb2wgaXNWYXJBcmcoKSBjb25zdCB7IHJldHVybiBpc1ZhckFyZ3M7IH0KKyAgaW5saW5lIGNvbnN0IFR5cGUgKmdldFJldHVyblR5cGUoKSBjb25zdCB7IHJldHVybiBDb250YWluZWRUeXNbMF07IH0KKworICB0eXBlZGVmIFR5cGU6OnN1YnR5cGVfaXRlcmF0b3IgcGFyYW1faXRlcmF0b3I7CisgIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQ29udGFpbmVkVHlzICsgMTsgfQorICBwYXJhbV9pdGVyYXRvciBwYXJhbV9lbmQoKSBjb25zdCB7IHJldHVybiAmQ29udGFpbmVkVHlzW051bUNvbnRhaW5lZFR5c107IH0KKworICAvLyBQYXJhbWV0ZXIgdHlwZSBhY2Nlc3NvcnMuLi4KKyAgY29uc3QgVHlwZSAqZ2V0UGFyYW1UeXBlKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIENvbnRhaW5lZFR5c1tpKzFdOyB9CisKKyAgLy8vIGdldE51bVBhcmFtcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpeGVkIHBhcmFtZXRlcnMgdGhpcyBmdW5jdGlvbiB0eXBlCisgIC8vLyByZXF1aXJlcy4gIFRoaXMgZG9lcyBub3QgY29uc2lkZXIgdmFyYXJncy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE51bVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIE51bUNvbnRhaW5lZFR5cyAtIDE7IH0KKworICAvLyBJbXBsZW1lbnQgdGhlIEFic3RyYWN0VHlwZVVzZXIgaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgcmVmaW5lQWJzdHJhY3RUeXBlKGNvbnN0IERlcml2ZWRUeXBlICpPbGRUeSwgY29uc3QgVHlwZSAqTmV3VHkpOworICB2aXJ0dWFsIHZvaWQgdHlwZUJlY2FtZUNvbmNyZXRlKGNvbnN0IERlcml2ZWRUeXBlICpBYnNUeSk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgRnVuY3Rpb25UeXBlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBGdW5jdGlvblR5SUQ7CisgIH0KK307CisKKworLy8vIENvbXBvc2l0ZVR5cGUgLSBDb21tb24gc3VwZXIgY2xhc3Mgb2YgQXJyYXlUeXBlLCBTdHJ1Y3RUeXBlLCBQb2ludGVyVHlwZQorLy8vIGFuZCBWZWN0b3JUeXBlCitjbGFzcyBDb21wb3NpdGVUeXBlIDogcHVibGljIERlcml2ZWRUeXBlIHsKK3Byb3RlY3RlZDoKKyAgaW5saW5lIGV4cGxpY2l0IENvbXBvc2l0ZVR5cGUoTExWTUNvbnRleHQgJkMsIFR5cGVJRCBpZCkgOgorICAgIERlcml2ZWRUeXBlKEMsIGlkKSB7IH0KK3B1YmxpYzoKKworICAvLy8gZ2V0VHlwZUF0SW5kZXggLSBHaXZlbiBhbiBpbmRleCB2YWx1ZSBpbnRvIHRoZSB0eXBlLCByZXR1cm4gdGhlIHR5cGUgb2YKKyAgLy8vIHRoZSBlbGVtZW50LgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBUeXBlICpnZXRUeXBlQXRJbmRleChjb25zdCBWYWx1ZSAqVikgY29uc3QgPSAwOworICB2aXJ0dWFsIGNvbnN0IFR5cGUgKmdldFR5cGVBdEluZGV4KHVuc2lnbmVkIElkeCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaW5kZXhWYWxpZChjb25zdCBWYWx1ZSAqVikgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaW5kZXhWYWxpZCh1bnNpZ25lZCBJZHgpIGNvbnN0ID0gMDsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDb21wb3NpdGVUeXBlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBBcnJheVR5SUQgfHwKKyAgICAgICAgICAgVC0+Z2V0VHlwZUlEKCkgPT0gU3RydWN0VHlJRCB8fAorICAgICAgICAgICBULT5nZXRUeXBlSUQoKSA9PSBQb2ludGVyVHlJRCB8fAorICAgICAgICAgICBULT5nZXRUeXBlSUQoKSA9PSBWZWN0b3JUeUlEIHx8CisgICAgICAgICAgIFQtPmdldFR5cGVJRCgpID09IFVuaW9uVHlJRDsKKyAgfQorfTsKKworCisvLy8gU3RydWN0VHlwZSAtIENsYXNzIHRvIHJlcHJlc2VudCBzdHJ1Y3QgdHlwZXMKKy8vLworY2xhc3MgU3RydWN0VHlwZSA6IHB1YmxpYyBDb21wb3NpdGVUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIFR5cGVNYXA8U3RydWN0VmFsVHlwZSwgU3RydWN0VHlwZT47CisgIFN0cnVjdFR5cGUoY29uc3QgU3RydWN0VHlwZSAmKTsgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGltcGxlbWVudAorICBjb25zdCBTdHJ1Y3RUeXBlICZvcGVyYXRvcj0oY29uc3QgU3RydWN0VHlwZSAmKTsgIC8vIERvIG5vdCBpbXBsZW1lbnQKKyAgU3RydWN0VHlwZShMTFZNQ29udGV4dCAmQywKKyAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gJlR5cGVzLCBib29sIGlzUGFja2VkKTsKK3B1YmxpYzoKKyAgLy8vIFN0cnVjdFR5cGU6OmdldCAtIFRoaXMgc3RhdGljIG1ldGhvZCBpcyB0aGUgcHJpbWFyeSB3YXkgdG8gY3JlYXRlIGEKKyAgLy8vIFN0cnVjdFR5cGUuCisgIC8vLworICBzdGF0aWMgU3RydWN0VHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gJlBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUGFja2VkPWZhbHNlKTsKKworICAvLy8gU3RydWN0VHlwZTo6Z2V0IC0gQ3JlYXRlIGFuIGVtcHR5IHN0cnVjdHVyZSB0eXBlLgorICAvLy8KKyAgc3RhdGljIFN0cnVjdFR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgYm9vbCBpc1BhY2tlZD1mYWxzZSkgeworICAgIHJldHVybiBnZXQoQ29udGV4dCwgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+KCksIGlzUGFja2VkKTsKKyAgfQorCisgIC8vLyBTdHJ1Y3RUeXBlOjpnZXQgLSBUaGlzIHN0YXRpYyBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yCisgIC8vLyBjcmVhdGluZyBzdHJ1Y3R1cmUgdHlwZXMgYnkgc3BlY2lmeWluZyB0aGUgZWxlbWVudHMgYXMgYXJndW1lbnRzLgorICAvLy8gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGEgbm9uLXBhY2tlZCBzdHJ1Y3QuICBUbyBnZXQKKyAgLy8vIGFuIGVtcHR5IHN0cnVjdCwgcGFzcyBOVUxMLCBOVUxMLgorICBzdGF0aWMgU3RydWN0VHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICp0eXBlLCAuLi4pIEVORF9XSVRIX05VTEw7CisKKyAgLy8vIGlzVmFsaWRFbGVtZW50VHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhCisgIC8vLyBlbGVtZW50IHR5cGUuCisgIHN0YXRpYyBib29sIGlzVmFsaWRFbGVtZW50VHlwZShjb25zdCBUeXBlICpFbGVtVHkpOworCisgIC8vIEl0ZXJhdG9yIGFjY2VzcyB0byB0aGUgZWxlbWVudHMKKyAgdHlwZWRlZiBUeXBlOjpzdWJ0eXBlX2l0ZXJhdG9yIGVsZW1lbnRfaXRlcmF0b3I7CisgIGVsZW1lbnRfaXRlcmF0b3IgZWxlbWVudF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIENvbnRhaW5lZFR5czsgfQorICBlbGVtZW50X2l0ZXJhdG9yIGVsZW1lbnRfZW5kKCkgY29uc3QgeyByZXR1cm4gJkNvbnRhaW5lZFR5c1tOdW1Db250YWluZWRUeXNdO30KKworICAvLyBSYW5kb20gYWNjZXNzIHRvIHRoZSBlbGVtZW50cworICB1bnNpZ25lZCBnZXROdW1FbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIE51bUNvbnRhaW5lZFR5czsgfQorICBjb25zdCBUeXBlICpnZXRFbGVtZW50VHlwZSh1bnNpZ25lZCBOKSBjb25zdCB7CisgICAgYXNzZXJ0KE4gPCBOdW1Db250YWluZWRUeXMgJiYgIkVsZW1lbnQgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gQ29udGFpbmVkVHlzW05dOworICB9CisKKyAgLy8vIGdldFR5cGVBdEluZGV4IC0gR2l2ZW4gYW4gaW5kZXggdmFsdWUgaW50byB0aGUgdHlwZSwgcmV0dXJuIHRoZSB0eXBlIG9mCisgIC8vLyB0aGUgZWxlbWVudC4gIEZvciBhIHN0cnVjdHVyZSB0eXBlLCB0aGlzIG11c3QgYmUgYSBjb25zdGFudCB2YWx1ZS4uLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBUeXBlICpnZXRUeXBlQXRJbmRleChjb25zdCBWYWx1ZSAqVikgY29uc3Q7CisgIHZpcnR1YWwgY29uc3QgVHlwZSAqZ2V0VHlwZUF0SW5kZXgodW5zaWduZWQgSWR4KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGluZGV4VmFsaWQoY29uc3QgVmFsdWUgKlYpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaW5kZXhWYWxpZCh1bnNpZ25lZCBJZHgpIGNvbnN0OworCisgIC8vIEltcGxlbWVudCB0aGUgQWJzdHJhY3RUeXBlVXNlciBpbnRlcmZhY2UuCisgIHZpcnR1YWwgdm9pZCByZWZpbmVBYnN0cmFjdFR5cGUoY29uc3QgRGVyaXZlZFR5cGUgKk9sZFR5LCBjb25zdCBUeXBlICpOZXdUeSk7CisgIHZpcnR1YWwgdm9pZCB0eXBlQmVjYW1lQ29uY3JldGUoY29uc3QgRGVyaXZlZFR5cGUgKkFic1R5KTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTdHJ1Y3RUeXBlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBTdHJ1Y3RUeUlEOworICB9CisKKyAgYm9vbCBpc1BhY2tlZCgpIGNvbnN0IHsgcmV0dXJuICgwICE9IGdldFN1YmNsYXNzRGF0YSgpKSA/IHRydWUgOiBmYWxzZTsgfQorfTsKKworCisvLy8gVW5pb25UeXBlIC0gQ2xhc3MgdG8gcmVwcmVzZW50IHVuaW9uIHR5cGVzLiBBIHVuaW9uIHR5cGUgaXMgc2ltaWxhciB0bworLy8vIGEgc3RydWN0dXJlLCBleGNlcHQgdGhhdCBhbGwgbWVtYmVyIGZpZWxkcyBiZWdpbiBhdCBvZmZzZXQgMC4KKy8vLworY2xhc3MgVW5pb25UeXBlIDogcHVibGljIENvbXBvc2l0ZVR5cGUgeworICBmcmllbmQgY2xhc3MgVHlwZU1hcDxVbmlvblZhbFR5cGUsIFVuaW9uVHlwZT47CisgIFVuaW9uVHlwZShjb25zdCBVbmlvblR5cGUgJik7ICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBpbXBsZW1lbnQKKyAgY29uc3QgVW5pb25UeXBlICZvcGVyYXRvcj0oY29uc3QgVW5pb25UeXBlICYpOyAgLy8gRG8gbm90IGltcGxlbWVudAorICBVbmlvblR5cGUoTExWTUNvbnRleHQgJkMsIGNvbnN0IFR5cGUqIGNvbnN0KiBUeXBlcywgdW5zaWduZWQgTnVtVHlwZXMpOworcHVibGljOgorICAvLy8gVW5pb25UeXBlOjpnZXQgLSBUaGlzIHN0YXRpYyBtZXRob2QgaXMgdGhlIHByaW1hcnkgd2F5IHRvIGNyZWF0ZSBhCisgIC8vLyBVbmlvblR5cGUuCisgIHN0YXRpYyBVbmlvblR5cGUgKmdldChjb25zdCBUeXBlKiBjb25zdCogVHlwZXMsIHVuc2lnbmVkIE51bVR5cGVzKTsKKworICAvLy8gVW5pb25UeXBlOjpnZXQgLSBUaGlzIHN0YXRpYyBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yCisgIC8vLyBjcmVhdGluZyB1bmlvbiB0eXBlcyBieSBzcGVjaWZ5aW5nIHRoZSBlbGVtZW50cyBhcyBhcmd1bWVudHMuCisgIHN0YXRpYyBVbmlvblR5cGUgKmdldChjb25zdCBUeXBlICp0eXBlLCAuLi4pIEVORF9XSVRIX05VTEw7CisKKyAgLy8vIGlzVmFsaWRFbGVtZW50VHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhCisgIC8vLyBlbGVtZW50IHR5cGUuCisgIHN0YXRpYyBib29sIGlzVmFsaWRFbGVtZW50VHlwZShjb25zdCBUeXBlICpFbGVtVHkpOworICAKKyAgLy8vIEdpdmVuIGFuIGVsZW1lbnQgdHlwZSwgcmV0dXJuIHRoZSBtZW1iZXIgaW5kZXggb2YgdGhhdCB0eXBlLCBvciAtMQorICAvLy8gaWYgdGhlcmUgaXMgbm8gc3VjaCBtZW1iZXIgdHlwZS4KKyAgaW50IGdldEVsZW1lbnRUeXBlSW5kZXgoY29uc3QgVHlwZSAqRWxlbVR5KSBjb25zdDsKKworICAvLyBJdGVyYXRvciBhY2Nlc3MgdG8gdGhlIGVsZW1lbnRzCisgIHR5cGVkZWYgVHlwZTo6c3VidHlwZV9pdGVyYXRvciBlbGVtZW50X2l0ZXJhdG9yOworICBlbGVtZW50X2l0ZXJhdG9yIGVsZW1lbnRfYmVnaW4oKSBjb25zdCB7IHJldHVybiBDb250YWluZWRUeXM7IH0KKyAgZWxlbWVudF9pdGVyYXRvciBlbGVtZW50X2VuZCgpIGNvbnN0IHsgcmV0dXJuICZDb250YWluZWRUeXNbTnVtQ29udGFpbmVkVHlzXTt9CisKKyAgLy8gUmFuZG9tIGFjY2VzcyB0byB0aGUgZWxlbWVudHMKKyAgdW5zaWduZWQgZ2V0TnVtRWxlbWVudHMoKSBjb25zdCB7IHJldHVybiBOdW1Db250YWluZWRUeXM7IH0KKyAgY29uc3QgVHlwZSAqZ2V0RWxlbWVudFR5cGUodW5zaWduZWQgTikgY29uc3QgeworICAgIGFzc2VydChOIDwgTnVtQ29udGFpbmVkVHlzICYmICJFbGVtZW50IG51bWJlciBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIENvbnRhaW5lZFR5c1tOXTsKKyAgfQorCisgIC8vLyBnZXRUeXBlQXRJbmRleCAtIEdpdmVuIGFuIGluZGV4IHZhbHVlIGludG8gdGhlIHR5cGUsIHJldHVybiB0aGUgdHlwZSBvZgorICAvLy8gdGhlIGVsZW1lbnQuICBGb3IgYSB1bmlvbiB0eXBlLCB0aGlzIG11c3QgYmUgYSBjb25zdGFudCB2YWx1ZS4uLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBUeXBlICpnZXRUeXBlQXRJbmRleChjb25zdCBWYWx1ZSAqVikgY29uc3Q7CisgIHZpcnR1YWwgY29uc3QgVHlwZSAqZ2V0VHlwZUF0SW5kZXgodW5zaWduZWQgSWR4KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGluZGV4VmFsaWQoY29uc3QgVmFsdWUgKlYpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaW5kZXhWYWxpZCh1bnNpZ25lZCBJZHgpIGNvbnN0OworCisgIC8vIEltcGxlbWVudCB0aGUgQWJzdHJhY3RUeXBlVXNlciBpbnRlcmZhY2UuCisgIHZpcnR1YWwgdm9pZCByZWZpbmVBYnN0cmFjdFR5cGUoY29uc3QgRGVyaXZlZFR5cGUgKk9sZFR5LCBjb25zdCBUeXBlICpOZXdUeSk7CisgIHZpcnR1YWwgdm9pZCB0eXBlQmVjYW1lQ29uY3JldGUoY29uc3QgRGVyaXZlZFR5cGUgKkFic1R5KTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBVbmlvblR5cGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVJRCgpID09IFVuaW9uVHlJRDsKKyAgfQorfTsKKworCisvLy8gU2VxdWVudGlhbFR5cGUgLSBUaGlzIGlzIHRoZSBzdXBlcmNsYXNzIG9mIHRoZSBhcnJheSwgcG9pbnRlciBhbmQgdmVjdG9yCisvLy8gdHlwZSBjbGFzc2VzLiAgQWxsIG9mIHRoZXNlIHJlcHJlc2VudCAiYXJyYXlzIiBpbiBtZW1vcnkuICBUaGUgYXJyYXkgdHlwZQorLy8vIHJlcHJlc2VudHMgYSBzcGVjaWZpY2FsbHkgc2l6ZWQgYXJyYXksIHBvaW50ZXIgdHlwZXMgYXJlIHVuc2l6ZWQvdW5rbm93bgorLy8vIHNpemUgYXJyYXlzLCB2ZWN0b3IgdHlwZXMgcmVwcmVzZW50IHNwZWNpZmljYWxseSBzaXplZCBhcnJheXMgdGhhdAorLy8vIGFsbG93IGZvciB1c2Ugb2YgU0lNRCBpbnN0cnVjdGlvbnMuICBTZXF1ZW50aWFsVHlwZSBob2xkcyB0aGUgY29tbW9uCisvLy8gZmVhdHVyZXMgb2YgYWxsLCB3aGljaCBzdGVtIGZyb20gdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgbGF5IHRoZWlyCisvLy8gY29tcG9uZW50cyBvdXQgaW4gbWVtb3J5IGlkZW50aWNhbGx5LgorLy8vCitjbGFzcyBTZXF1ZW50aWFsVHlwZSA6IHB1YmxpYyBDb21wb3NpdGVUeXBlIHsKKyAgUEFUeXBlSGFuZGxlIENvbnRhaW5lZFR5cGU7IC8vLzwgU3RvcmFnZSBmb3IgdGhlIHNpbmdsZSBjb250YWluZWQgdHlwZQorICBTZXF1ZW50aWFsVHlwZShjb25zdCBTZXF1ZW50aWFsVHlwZSAmKTsgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgaW1wbGVtZW50IQorICBjb25zdCBTZXF1ZW50aWFsVHlwZSAmb3BlcmF0b3I9KGNvbnN0IFNlcXVlbnRpYWxUeXBlICYpOyAvLyBEbyBub3QgaW1wbGVtZW50IQorCisgIC8vIGF2b2lkaW5nIHdhcm5pbmc6ICd0aGlzJyA6IHVzZWQgaW4gYmFzZSBtZW1iZXIgaW5pdGlhbGl6ZXIgbGlzdAorICBTZXF1ZW50aWFsVHlwZSogdGhpc18oKSB7IHJldHVybiB0aGlzOyB9Citwcm90ZWN0ZWQ6CisgIFNlcXVlbnRpYWxUeXBlKFR5cGVJRCBUSUQsIGNvbnN0IFR5cGUgKkVsVHlwZSkKKyAgICA6IENvbXBvc2l0ZVR5cGUoRWxUeXBlLT5nZXRDb250ZXh0KCksIFRJRCksIENvbnRhaW5lZFR5cGUoRWxUeXBlLCB0aGlzXygpKSB7CisgICAgQ29udGFpbmVkVHlzID0gJkNvbnRhaW5lZFR5cGU7CisgICAgTnVtQ29udGFpbmVkVHlzID0gMTsKKyAgfQorCitwdWJsaWM6CisgIGlubGluZSBjb25zdCBUeXBlICpnZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIENvbnRhaW5lZFR5c1swXTsgfQorCisgIHZpcnR1YWwgYm9vbCBpbmRleFZhbGlkKGNvbnN0IFZhbHVlICpWKSBjb25zdDsKKyAgdmlydHVhbCBib29sIGluZGV4VmFsaWQodW5zaWduZWQpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBnZXRUeXBlQXRJbmRleCAtIEdpdmVuIGFuIGluZGV4IHZhbHVlIGludG8gdGhlIHR5cGUsIHJldHVybiB0aGUgdHlwZSBvZgorICAvLy8gdGhlIGVsZW1lbnQuICBGb3Igc2VxdWVudGlhbCB0eXBlcywgdGhlcmUgaXMgb25seSBvbmUgc3VidHlwZS4uLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBUeXBlICpnZXRUeXBlQXRJbmRleChjb25zdCBWYWx1ZSAqKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnRhaW5lZFR5c1swXTsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IFR5cGUgKmdldFR5cGVBdEluZGV4KHVuc2lnbmVkKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnRhaW5lZFR5c1swXTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFNlcXVlbnRpYWxUeXBlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBBcnJheVR5SUQgfHwKKyAgICAgICAgICAgVC0+Z2V0VHlwZUlEKCkgPT0gUG9pbnRlclR5SUQgfHwKKyAgICAgICAgICAgVC0+Z2V0VHlwZUlEKCkgPT0gVmVjdG9yVHlJRDsKKyAgfQorfTsKKworCisvLy8gQXJyYXlUeXBlIC0gQ2xhc3MgdG8gcmVwcmVzZW50IGFycmF5IHR5cGVzCisvLy8KK2NsYXNzIEFycmF5VHlwZSA6IHB1YmxpYyBTZXF1ZW50aWFsVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBUeXBlTWFwPEFycmF5VmFsVHlwZSwgQXJyYXlUeXBlPjsKKyAgdWludDY0X3QgTnVtRWxlbWVudHM7CisKKyAgQXJyYXlUeXBlKGNvbnN0IEFycmF5VHlwZSAmKTsgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGltcGxlbWVudAorICBjb25zdCBBcnJheVR5cGUgJm9wZXJhdG9yPShjb25zdCBBcnJheVR5cGUgJik7ICAvLyBEbyBub3QgaW1wbGVtZW50CisgIEFycmF5VHlwZShjb25zdCBUeXBlICpFbFR5cGUsIHVpbnQ2NF90IE51bUVsKTsKK3B1YmxpYzoKKyAgLy8vIEFycmF5VHlwZTo6Z2V0IC0gVGhpcyBzdGF0aWMgbWV0aG9kIGlzIHRoZSBwcmltYXJ5IHdheSB0byBjb25zdHJ1Y3QgYW4KKyAgLy8vIEFycmF5VHlwZQorICAvLy8KKyAgc3RhdGljIEFycmF5VHlwZSAqZ2V0KGNvbnN0IFR5cGUgKkVsZW1lbnRUeXBlLCB1aW50NjRfdCBOdW1FbGVtZW50cyk7CisKKyAgLy8vIGlzVmFsaWRFbGVtZW50VHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhCisgIC8vLyBlbGVtZW50IHR5cGUuCisgIHN0YXRpYyBib29sIGlzVmFsaWRFbGVtZW50VHlwZShjb25zdCBUeXBlICpFbGVtVHkpOworCisgIGlubGluZSB1aW50NjRfdCBnZXROdW1FbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIE51bUVsZW1lbnRzOyB9CisKKyAgLy8gSW1wbGVtZW50IHRoZSBBYnN0cmFjdFR5cGVVc2VyIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIHJlZmluZUFic3RyYWN0VHlwZShjb25zdCBEZXJpdmVkVHlwZSAqT2xkVHksIGNvbnN0IFR5cGUgKk5ld1R5KTsKKyAgdmlydHVhbCB2b2lkIHR5cGVCZWNhbWVDb25jcmV0ZShjb25zdCBEZXJpdmVkVHlwZSAqQWJzVHkpOworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEFycmF5VHlwZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUlEKCkgPT0gQXJyYXlUeUlEOworICB9Cit9OworCisvLy8gVmVjdG9yVHlwZSAtIENsYXNzIHRvIHJlcHJlc2VudCB2ZWN0b3IgdHlwZXMKKy8vLworY2xhc3MgVmVjdG9yVHlwZSA6IHB1YmxpYyBTZXF1ZW50aWFsVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBUeXBlTWFwPFZlY3RvclZhbFR5cGUsIFZlY3RvclR5cGU+OworICB1bnNpZ25lZCBOdW1FbGVtZW50czsKKworICBWZWN0b3JUeXBlKGNvbnN0IFZlY3RvclR5cGUgJik7ICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBpbXBsZW1lbnQKKyAgY29uc3QgVmVjdG9yVHlwZSAmb3BlcmF0b3I9KGNvbnN0IFZlY3RvclR5cGUgJik7ICAvLyBEbyBub3QgaW1wbGVtZW50CisgIFZlY3RvclR5cGUoY29uc3QgVHlwZSAqRWxUeXBlLCB1bnNpZ25lZCBOdW1FbCk7CitwdWJsaWM6CisgIC8vLyBWZWN0b3JUeXBlOjpnZXQgLSBUaGlzIHN0YXRpYyBtZXRob2QgaXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnN0cnVjdCBhbgorICAvLy8gVmVjdG9yVHlwZQorICAvLy8KKyAgc3RhdGljIFZlY3RvclR5cGUgKmdldChjb25zdCBUeXBlICpFbGVtZW50VHlwZSwgdW5zaWduZWQgTnVtRWxlbWVudHMpOworCisgIC8vLyBWZWN0b3JUeXBlOjpnZXRJbnRlZ2VyIC0gVGhpcyBzdGF0aWMgbWV0aG9kIGdldHMgYSBWZWN0b3JUeXBlIHdpdGggdGhlCisgIC8vLyBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyB0aGUgaW5wdXQgdHlwZSwgYW5kIHRoZSBlbGVtZW50IHR5cGUgaXMgYW4KKyAgLy8vIGludGVnZXIgdHlwZSBvZiB0aGUgc2FtZSB3aWR0aCBhcyB0aGUgaW5wdXQgZWxlbWVudCB0eXBlLgorICAvLy8KKyAgc3RhdGljIFZlY3RvclR5cGUgKmdldEludGVnZXIoY29uc3QgVmVjdG9yVHlwZSAqVlR5KSB7CisgICAgdW5zaWduZWQgRWx0Qml0cyA9IFZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworICAgIGNvbnN0IFR5cGUgKkVsdFR5ID0gSW50ZWdlclR5cGU6OmdldChWVHktPmdldENvbnRleHQoKSwgRWx0Qml0cyk7CisgICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChFbHRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgfQorCisgIC8vLyBWZWN0b3JUeXBlOjpnZXRFeHRlbmRlZEVsZW1lbnRWZWN0b3JUeXBlIC0gVGhpcyBzdGF0aWMgbWV0aG9kIGlzIGxpa2UKKyAgLy8vIGdldEludGVnZXIgZXhjZXB0IHRoYXQgdGhlIGVsZW1lbnQgdHlwZXMgYXJlIHR3aWNlIGFzIHdpZGUgYXMgdGhlCisgIC8vLyBlbGVtZW50cyBpbiB0aGUgaW5wdXQgdHlwZS4KKyAgLy8vCisgIHN0YXRpYyBWZWN0b3JUeXBlICpnZXRFeHRlbmRlZEVsZW1lbnRWZWN0b3JUeXBlKGNvbnN0IFZlY3RvclR5cGUgKlZUeSkgeworICAgIHVuc2lnbmVkIEVsdEJpdHMgPSBWVHktPmdldEVsZW1lbnRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKTsKKyAgICBjb25zdCBUeXBlICpFbHRUeSA9IEludGVnZXJUeXBlOjpnZXQoVlR5LT5nZXRDb250ZXh0KCksIEVsdEJpdHMgKiAyKTsKKyAgICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KEVsdFR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOworICB9CisKKyAgLy8vIFZlY3RvclR5cGU6OmdldFRydW5jYXRlZEVsZW1lbnRWZWN0b3JUeXBlIC0gVGhpcyBzdGF0aWMgbWV0aG9kIGlzIGxpa2UKKyAgLy8vIGdldEludGVnZXIgZXhjZXB0IHRoYXQgdGhlIGVsZW1lbnQgdHlwZXMgYXJlIGhhbGYgYXMgd2lkZSBhcyB0aGUKKyAgLy8vIGVsZW1lbnRzIGluIHRoZSBpbnB1dCB0eXBlLgorICAvLy8KKyAgc3RhdGljIFZlY3RvclR5cGUgKmdldFRydW5jYXRlZEVsZW1lbnRWZWN0b3JUeXBlKGNvbnN0IFZlY3RvclR5cGUgKlZUeSkgeworICAgIHVuc2lnbmVkIEVsdEJpdHMgPSBWVHktPmdldEVsZW1lbnRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKTsKKyAgICBhc3NlcnQoKEVsdEJpdHMgJiAxKSA9PSAwICYmCisgICAgICAgICAgICJDYW5ub3QgdHJ1bmNhdGUgdmVjdG9yIGVsZW1lbnQgd2l0aCBvZGQgYml0LXdpZHRoIik7CisgICAgY29uc3QgVHlwZSAqRWx0VHkgPSBJbnRlZ2VyVHlwZTo6Z2V0KFZUeS0+Z2V0Q29udGV4dCgpLCBFbHRCaXRzIC8gMik7CisgICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChFbHRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgfQorCisgIC8vLyBpc1ZhbGlkRWxlbWVudFR5cGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgdmFsaWQgYXMgYQorICAvLy8gZWxlbWVudCB0eXBlLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkRWxlbWVudFR5cGUoY29uc3QgVHlwZSAqRWxlbVR5KTsKKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBWZWN0b3IgdHlwZS4KKyAgaW5saW5lIHVuc2lnbmVkIGdldE51bUVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gTnVtRWxlbWVudHM7IH0KKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIFZlY3RvciB0eXBlLgorICBpbmxpbmUgdW5zaWduZWQgZ2V0Qml0V2lkdGgoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bUVsZW1lbnRzICogZ2V0RWxlbWVudFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworICB9CisKKyAgLy8gSW1wbGVtZW50IHRoZSBBYnN0cmFjdFR5cGVVc2VyIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIHJlZmluZUFic3RyYWN0VHlwZShjb25zdCBEZXJpdmVkVHlwZSAqT2xkVHksIGNvbnN0IFR5cGUgKk5ld1R5KTsKKyAgdmlydHVhbCB2b2lkIHR5cGVCZWNhbWVDb25jcmV0ZShjb25zdCBEZXJpdmVkVHlwZSAqQWJzVHkpOworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZlY3RvclR5cGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVJRCgpID09IFZlY3RvclR5SUQ7CisgIH0KK307CisKKworLy8vIFBvaW50ZXJUeXBlIC0gQ2xhc3MgdG8gcmVwcmVzZW50IHBvaW50ZXJzCisvLy8KK2NsYXNzIFBvaW50ZXJUeXBlIDogcHVibGljIFNlcXVlbnRpYWxUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIFR5cGVNYXA8UG9pbnRlclZhbFR5cGUsIFBvaW50ZXJUeXBlPjsKKyAgdW5zaWduZWQgQWRkcmVzc1NwYWNlOworCisgIFBvaW50ZXJUeXBlKGNvbnN0IFBvaW50ZXJUeXBlICYpOyAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgaW1wbGVtZW50CisgIGNvbnN0IFBvaW50ZXJUeXBlICZvcGVyYXRvcj0oY29uc3QgUG9pbnRlclR5cGUgJik7ICAvLyBEbyBub3QgaW1wbGVtZW50CisgIGV4cGxpY2l0IFBvaW50ZXJUeXBlKGNvbnN0IFR5cGUgKkVsVHlwZSwgdW5zaWduZWQgQWRkclNwYWNlKTsKK3B1YmxpYzoKKyAgLy8vIFBvaW50ZXJUeXBlOjpnZXQgLSBUaGlzIGNvbnN0cnVjdHMgYSBwb2ludGVyIHRvIGFuIG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyB0eXBlIGluIGEgbnVtYmVyZWQgYWRkcmVzcyBzcGFjZS4KKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXQoY29uc3QgVHlwZSAqRWxlbWVudFR5cGUsIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSk7CisKKyAgLy8vIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwgLSBUaGlzIGNvbnN0cnVjdHMgYSBwb2ludGVyIHRvIGFuIG9iamVjdCBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlIGluIHRoZSBnZW5lcmljIGFkZHJlc3Mgc3BhY2UgKGFkZHJlc3Mgc3BhY2UgemVybykuCisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0VW5xdWFsKGNvbnN0IFR5cGUgKkVsZW1lbnRUeXBlKSB7CisgICAgcmV0dXJuIFBvaW50ZXJUeXBlOjpnZXQoRWxlbWVudFR5cGUsIDApOworICB9CisKKyAgLy8vIGlzVmFsaWRFbGVtZW50VHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhCisgIC8vLyBlbGVtZW50IHR5cGUuCisgIHN0YXRpYyBib29sIGlzVmFsaWRFbGVtZW50VHlwZShjb25zdCBUeXBlICpFbGVtVHkpOworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBQb2ludGVyIHR5cGUuCisgIGlubGluZSB1bnNpZ25lZCBnZXRBZGRyZXNzU3BhY2UoKSBjb25zdCB7IHJldHVybiBBZGRyZXNzU3BhY2U7IH0KKworICAvLyBJbXBsZW1lbnQgdGhlIEFic3RyYWN0VHlwZVVzZXIgaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgcmVmaW5lQWJzdHJhY3RUeXBlKGNvbnN0IERlcml2ZWRUeXBlICpPbGRUeSwgY29uc3QgVHlwZSAqTmV3VHkpOworICB2aXJ0dWFsIHZvaWQgdHlwZUJlY2FtZUNvbmNyZXRlKGNvbnN0IERlcml2ZWRUeXBlICpBYnNUeSk7CisKKyAgLy8gSW1wbGVtZW50IHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFBvaW50ZXJUeXBlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBQb2ludGVyVHlJRDsKKyAgfQorfTsKKworCisvLy8gT3BhcXVlVHlwZSAtIENsYXNzIHRvIHJlcHJlc2VudCBhYnN0cmFjdCB0eXBlcworLy8vCitjbGFzcyBPcGFxdWVUeXBlIDogcHVibGljIERlcml2ZWRUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgT3BhcXVlVHlwZShjb25zdCBPcGFxdWVUeXBlICYpOyAgICAgICAgICAgICAgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIGNvbnN0IE9wYXF1ZVR5cGUgJm9wZXJhdG9yPShjb25zdCBPcGFxdWVUeXBlICYpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorICBPcGFxdWVUeXBlKExMVk1Db250ZXh0ICZDKTsKK3B1YmxpYzoKKyAgLy8vIE9wYXF1ZVR5cGU6OmdldCAtIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBmb3IgdGhlIE9wYXF1ZVR5cGUgY2xhc3MuLi4KKyAgLy8vCisgIHN0YXRpYyBPcGFxdWVUeXBlICpnZXQoTExWTUNvbnRleHQgJkMpOworCisgIC8vIEltcGxlbWVudCBzdXBwb3J0IGZvciB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgT3BhcXVlVHlwZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUlEKCkgPT0gT3BhcXVlVHlJRDsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0V4ZWN1dGlvbkVuZ2luZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTA3NDQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaApAQCAtMCwwICsxLDUwMiBAQAorLy89PT0tIEV4ZWN1dGlvbkVuZ2luZS5oIC0gQWJzdHJhY3QgRXhlY3V0aW9uIEVuZ2luZSBJbnRlcmZhY2UgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgYWJzdHJhY3QgaW50ZXJmYWNlIHRoYXQgaW1wbGVtZW50cyBleGVjdXRpb24gc3VwcG9ydAorLy8gZm9yIExMVk0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTl9FTkdJTkVfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTl9FTkdJTkVfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9WYWx1ZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL011dGV4LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBHZW5lcmljVmFsdWU7CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIEV4ZWN1dGlvbkVuZ2luZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIEpJVEV2ZW50TGlzdGVuZXI7CitjbGFzcyBKSVRNZW1vcnlNYW5hZ2VyOworY2xhc3MgTWFjaGluZUNvZGVJbmZvOworY2xhc3MgTW9kdWxlOworY2xhc3MgTXV0ZXhHdWFyZDsKK2NsYXNzIFRhcmdldERhdGE7CitjbGFzcyBUeXBlOworCitjbGFzcyBFeGVjdXRpb25FbmdpbmVTdGF0ZSB7CitwdWJsaWM6CisgIHN0cnVjdCBBZGRyZXNzTWFwQ29uZmlnIDogcHVibGljIFZhbHVlTWFwQ29uZmlnPGNvbnN0IEdsb2JhbFZhbHVlKj4geworICAgIHR5cGVkZWYgRXhlY3V0aW9uRW5naW5lU3RhdGUgKkV4dHJhRGF0YTsKKyAgICBzdGF0aWMgc3lzOjpNdXRleCAqZ2V0TXV0ZXgoRXhlY3V0aW9uRW5naW5lU3RhdGUgKkVFUyk7CisgICAgc3RhdGljIHZvaWQgb25EZWxldGUoRXhlY3V0aW9uRW5naW5lU3RhdGUgKkVFUywgY29uc3QgR2xvYmFsVmFsdWUgKk9sZCk7CisgICAgc3RhdGljIHZvaWQgb25SQVVXKEV4ZWN1dGlvbkVuZ2luZVN0YXRlICosIGNvbnN0IEdsb2JhbFZhbHVlICosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICopOworICB9OworCisgIHR5cGVkZWYgVmFsdWVNYXA8Y29uc3QgR2xvYmFsVmFsdWUgKiwgdm9pZCAqLCBBZGRyZXNzTWFwQ29uZmlnPgorICAgICAgR2xvYmFsQWRkcmVzc01hcFR5OworCitwcml2YXRlOgorICBFeGVjdXRpb25FbmdpbmUgJkVFOworCisgIC8vLyBHbG9iYWxBZGRyZXNzTWFwIC0gQSBtYXBwaW5nIGJldHdlZW4gTExWTSBnbG9iYWwgdmFsdWVzIGFuZCB0aGVpcgorICAvLy8gYWN0dWFsaXplZCB2ZXJzaW9uLi4uCisgIEdsb2JhbEFkZHJlc3NNYXBUeSBHbG9iYWxBZGRyZXNzTWFwOworCisgIC8vLyBHbG9iYWxBZGRyZXNzUmV2ZXJzZU1hcCAtIFRoaXMgaXMgdGhlIHJldmVyc2UgbWFwcGluZyBvZiBHbG9iYWxBZGRyZXNzTWFwLAorICAvLy8gdXNlZCB0byBjb252ZXJ0IHJhdyBhZGRyZXNzZXMgaW50byB0aGUgTExWTSBnbG9iYWwgdmFsdWUgdGhhdCBpcyBlbWl0dGVkCisgIC8vLyBhdCB0aGUgYWRkcmVzcy4gIFRoaXMgbWFwIGlzIG5vdCBjb21wdXRlZCB1bmxlc3MgZ2V0R2xvYmFsVmFsdWVBdEFkZHJlc3MKKyAgLy8vIGlzIGNhbGxlZCBhdCBzb21lIHBvaW50LgorICBzdGQ6Om1hcDx2b2lkICosIEFzc2VydGluZ1ZIPGNvbnN0IEdsb2JhbFZhbHVlPiA+IEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwOworCitwdWJsaWM6CisgIEV4ZWN1dGlvbkVuZ2luZVN0YXRlKEV4ZWN1dGlvbkVuZ2luZSAmRUUpOworCisgIEdsb2JhbEFkZHJlc3NNYXBUeSAmCisgIGdldEdsb2JhbEFkZHJlc3NNYXAoY29uc3QgTXV0ZXhHdWFyZCAmKSB7CisgICAgcmV0dXJuIEdsb2JhbEFkZHJlc3NNYXA7CisgIH0KKworICBzdGQ6Om1hcDx2b2lkKiwgQXNzZXJ0aW5nVkg8Y29uc3QgR2xvYmFsVmFsdWU+ID4gJgorICBnZXRHbG9iYWxBZGRyZXNzUmV2ZXJzZU1hcChjb25zdCBNdXRleEd1YXJkICYpIHsKKyAgICByZXR1cm4gR2xvYmFsQWRkcmVzc1JldmVyc2VNYXA7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBhZGRyZXNzIFRvVW5tYXAgd2FzIG1hcHBlZCB0by4KKyAgdm9pZCAqUmVtb3ZlTWFwcGluZyhjb25zdCBNdXRleEd1YXJkICYsIGNvbnN0IEdsb2JhbFZhbHVlICpUb1VubWFwKTsKK307CisKKworY2xhc3MgRXhlY3V0aW9uRW5naW5lIHsKKyAgY29uc3QgVGFyZ2V0RGF0YSAqVEQ7CisgIEV4ZWN1dGlvbkVuZ2luZVN0YXRlIEVFU3RhdGU7CisgIGJvb2wgQ29tcGlsaW5nTGF6aWx5OworICBib29sIEdWQ29tcGlsYXRpb25EaXNhYmxlZDsKKyAgYm9vbCBTeW1ib2xTZWFyY2hpbmdEaXNhYmxlZDsKKworICBmcmllbmQgY2xhc3MgRW5naW5lQnVpbGRlcjsgIC8vIFRvIGFsbG93IGFjY2VzcyB0byBKSVRDdG9yIGFuZCBJbnRlcnBDdG9yLgorCitwcm90ZWN0ZWQ6CisgIC8vLyBNb2R1bGVzIC0gVGhpcyBpcyBhIGxpc3Qgb2YgTW9kdWxlcyB0aGF0IHdlIGFyZSBKSVQnaW5nIGZyb20uICBXZSB1c2UgYQorICAvLy8gc21hbGx2ZWN0b3IgdG8gb3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG9ubHkgb25lIG1vZHVsZS4KKyAgU21hbGxWZWN0b3I8TW9kdWxlKiwgMT4gTW9kdWxlczsKKyAgCisgIHZvaWQgc2V0VGFyZ2V0RGF0YShjb25zdCBUYXJnZXREYXRhICp0ZCkgeworICAgIFREID0gdGQ7CisgIH0KKyAgCisgIC8vLyBnZXRNZW1vcnlmb3JHViAtIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBnbG9iYWwgdmFyaWFibGUuCisgIHZpcnR1YWwgY2hhciogZ2V0TWVtb3J5Rm9yR1YoY29uc3QgR2xvYmFsVmFyaWFibGUqIEdWKTsKKworICAvLyBUbyBhdm9pZCBoYXZpbmcgbGliZXhlY3V0aW9uZW5naW5lIGRlcGVuZCBvbiB0aGUgSklUIGFuZCBpbnRlcnByZXRlcgorICAvLyBsaWJyYXJpZXMsIHRoZSBKSVQgYW5kIEludGVycHJldGVyIHNldCB0aGVzZSBmdW5jdGlvbnMgdG8gY3RvciBwb2ludGVycworICAvLyBhdCBzdGFydHVwIHRpbWUgaWYgdGhleSBhcmUgbGlua2VkIGluLgorICBzdGF0aWMgRXhlY3V0aW9uRW5naW5lICooKkpJVEN0b3IpKAorICAgIE1vZHVsZSAqTSwKKyAgICBzdGQ6OnN0cmluZyAqRXJyb3JTdHIsCisgICAgSklUTWVtb3J5TWFuYWdlciAqSk1NLAorICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgIGJvb2wgR1ZzV2l0aENvZGUsCisgICAgQ29kZU1vZGVsOjpNb2RlbCBDTU0sCisgICAgU3RyaW5nUmVmIE1BcmNoLAorICAgIFN0cmluZ1JlZiBNQ1BVLAorICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnN0cmluZz4mIE1BdHRycyk7CisgIHN0YXRpYyBFeGVjdXRpb25FbmdpbmUgKigqSW50ZXJwQ3RvcikoTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJvclN0cik7CisKKyAgLy8vIExhenlGdW5jdGlvbkNyZWF0b3IgLSBJZiBhbiB1bmtub3duIGZ1bmN0aW9uIGlzIG5lZWRlZCwgdGhpcyBmdW5jdGlvbgorICAvLy8gcG9pbnRlciBpcyBpbnZva2VkIHRvIGNyZWF0ZSBpdC4gSWYgdGhpcyByZXR1cm5zIG51bGwsIHRoZSBKSVQgd2lsbCBhYm9ydC4KKyAgdm9pZCogKCpMYXp5RnVuY3Rpb25DcmVhdG9yKShjb25zdCBzdGQ6OnN0cmluZyAmKTsKKworcHVibGljOgorICAvLy8gbG9jayAtIFRoaXMgbG9jayBpcyBwcm90ZWN0cyB0aGUgRXhlY3V0aW9uRW5naW5lLCBKSVQsIEpJVFJlc29sdmVyIGFuZAorICAvLy8gSklURW1pdHRlciBjbGFzc2VzLiAgSXQgbXVzdCBiZSBoZWxkIHdoaWxlIGNoYW5naW5nIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZgorICAvLy8gYW55IG9mIHRob3NlIGNsYXNzZXMuCisgIHN5czo6TXV0ZXggbG9jazsgLy8gVXNlZCB0byBtYWtlIHRoaXMgY2xhc3MgYW5kIHN1YmNsYXNzZXMgdGhyZWFkLXNhZmUKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gIEV4ZWN1dGlvbkVuZ2luZSBTdGFydHVwCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHZpcnR1YWwgfkV4ZWN1dGlvbkVuZ2luZSgpOworCisgIC8vLyBjcmVhdGUgLSBUaGlzIGlzIHRoZSBmYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gZXhlY3V0aW9uIGVuZ2luZSB3aGljaAorICAvLy8gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IG1hY2hpbmUuICBUaGlzIHRha2VzIG93bmVyc2hpcCBvZiB0aGUKKyAgLy8vIG1vZHVsZS4KKyAgc3RhdGljIEV4ZWN1dGlvbkVuZ2luZSAqY3JlYXRlKE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yY2VJbnRlcnByZXRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVycm9yU3RyID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6RGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRpbmcgZ2xvYmFscyB3aXRoIGNvZGUgYnJlYWtzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVlTWFjaGluZUNvZGVGb3JGdW5jdGlvbiBhbmQgaXMgcHJvYmFibHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuc2FmZSBhbmQgYmFkIGZvciBwZXJmb3JtYW5jZS4gIEhvd2V2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGNsaWVudHMgd2hvIGRlcGVuZCBvbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWhhdmlvciwgc28gd2UgbXVzdCBzdXBwb3J0IGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnR1YWxseSwgd2hlbiB3ZSdyZSB3aWxsaW5nIHRvIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5LCB0aGlzIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBmbGlwcGVkIHRvIGZhbHNlLCBzbyB0aGF0IGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uIHdvcmtzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBHVnNXaXRoQ29kZSA9IHRydWUpOworCisgIC8vLyBjcmVhdGVKSVQgLSBUaGlzIGlzIHRoZSBmYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBKSVQgZm9yIHRoZSBjdXJyZW50CisgIC8vLyBtYWNoaW5lLCBpdCBkb2VzIG5vdCBmYWxsIGJhY2sgdG8gdGhlIGludGVycHJldGVyLiAgVGhpcyB0YWtlcyBvd25lcnNoaXAKKyAgLy8vIG9mIHRoZSBNb2R1bGUgYW5kIEpJVE1lbW9yeU1hbmFnZXIgaWYgc3VjY2Vzc2Z1bC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIHNob3VsZCBtYWtlIHN1cmUgdG8gaW5pdGlhbGl6ZSB0YXJnZXRzIHByaW9yIHRvIGNhbGxpbmcgdGhpcworICAvLy8gZnVuY3Rpb24uCisgIHN0YXRpYyBFeGVjdXRpb25FbmdpbmUgKmNyZWF0ZUpJVChNb2R1bGUgKk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyb3JTdHIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUTWVtb3J5TWFuYWdlciAqSk1NID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6RGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgR1ZzV2l0aENvZGUgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZU1vZGVsOjpNb2RlbCBDTU0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlTW9kZWw6OkRlZmF1bHQpOworCisgIC8vLyBhZGRNb2R1bGUgLSBBZGQgYSBNb2R1bGUgdG8gdGhlIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IHdlIGNhbiBKSVQgZnJvbS4KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgTW9kdWxlOiB3aGVuIHRoZSBFeGVjdXRpb25FbmdpbmUgaXMKKyAgLy8vIGRlc3Ryb3llZCwgaXQgZGVzdHJveXMgdGhlIE1vZHVsZSBhcyB3ZWxsLgorICB2aXJ0dWFsIHZvaWQgYWRkTW9kdWxlKE1vZHVsZSAqTSkgeworICAgIE1vZHVsZXMucHVzaF9iYWNrKE0pOworICB9CisgIAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIGNvbnN0IFRhcmdldERhdGEgKmdldFRhcmdldERhdGEoKSBjb25zdCB7IHJldHVybiBURDsgfQorCisKKyAgLy8vIHJlbW92ZU1vZHVsZSAtIFJlbW92ZSBhIE1vZHVsZSBmcm9tIHRoZSBsaXN0IG9mIG1vZHVsZXMuICBSZXR1cm5zIHRydWUgaWYKKyAgLy8vIE0gaXMgZm91bmQuCisgIHZpcnR1YWwgYm9vbCByZW1vdmVNb2R1bGUoTW9kdWxlICpNKTsKKworICAvLy8gRmluZEZ1bmN0aW9uTmFtZWQgLSBTZWFyY2ggYWxsIG9mIHRoZSBhY3RpdmUgbW9kdWxlcyB0byBmaW5kIHRoZSBvbmUgdGhhdAorICAvLy8gZGVmaW5lcyBGbk5hbWUuICBUaGlzIGlzIHZlcnkgc2xvdyBvcGVyYXRpb24gYW5kIHNob3VsZG4ndCBiZSB1c2VkIGZvcgorICAvLy8gZ2VuZXJhbCBjb2RlLgorICBGdW5jdGlvbiAqRmluZEZ1bmN0aW9uTmFtZWQoY29uc3QgY2hhciAqRm5OYW1lKTsKKyAgCisgIC8vLyBydW5GdW5jdGlvbiAtIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLAorICAvLy8gYW5kIHJldHVybiB0aGUgcmVzdWx0LgorICAvLy8KKyAgdmlydHVhbCBHZW5lcmljVmFsdWUgcnVuRnVuY3Rpb24oRnVuY3Rpb24gKkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJkFyZ1ZhbHVlcykgPSAwOworCisgIC8vLyBydW5TdGF0aWNDb25zdHJ1Y3RvcnNEZXN0cnVjdG9ycyAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZXhlY3V0ZSBhbGwgb2YKKyAgLy8vIHRoZSBzdGF0aWMgY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzIGZvciBhIHByb2dyYW0sIGRlcGVuZGluZyBvbiB0aGUKKyAgLy8vIHZhbHVlIG9mIGlzRHRvcnMuCisgIHZvaWQgcnVuU3RhdGljQ29uc3RydWN0b3JzRGVzdHJ1Y3RvcnMoYm9vbCBpc0R0b3JzKTsKKyAgLy8vIHJ1blN0YXRpY0NvbnN0cnVjdG9yc0Rlc3RydWN0b3JzIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBleGVjdXRlIGFsbCBvZgorICAvLy8gdGhlIHN0YXRpYyBjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMgZm9yIGEgbW9kdWxlLCBkZXBlbmRpbmcgb24gdGhlCisgIC8vLyB2YWx1ZSBvZiBpc0R0b3JzLgorICB2b2lkIHJ1blN0YXRpY0NvbnN0cnVjdG9yc0Rlc3RydWN0b3JzKE1vZHVsZSAqbW9kdWxlLCBib29sIGlzRHRvcnMpOworICAKKyAgCisgIC8vLyBydW5GdW5jdGlvbkFzTWFpbiAtIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggd3JhcHMgcnVuRnVuY3Rpb24gdG8KKyAgLy8vIGhhbmRsZSB0aGUgY29tbW9uIHRhc2sgb2Ygc3RhcnRpbmcgdXAgbWFpbiB3aXRoIHRoZSBzcGVjaWZpZWQgYXJnYywgYXJndiwKKyAgLy8vIGFuZCBlbnZwIHBhcmFtZXRlcnMuCisgIGludCBydW5GdW5jdGlvbkFzTWFpbihGdW5jdGlvbiAqRm4sIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqIGVudnApOworCisKKyAgLy8vIGFkZEdsb2JhbE1hcHBpbmcgLSBUZWxsIHRoZSBleGVjdXRpb24gZW5naW5lIHRoYXQgdGhlIHNwZWNpZmllZCBnbG9iYWwgaXMKKyAgLy8vIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBhcyBmdW5jdGlvbnMgYXJlIEpJVCdkCisgIC8vLyBhbmQgYXMgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbGFpZCBvdXQgaW4gbWVtb3J5LiAgSXQgY2FuIGFuZCBzaG91bGQgYWxzbyBiZQorICAvLy8gdXNlZCBieSBjbGllbnRzIG9mIHRoZSBFRSB0aGF0IHdhbnQgdG8gaGF2ZSBhbiBMTFZNIGdsb2JhbCBvdmVybGF5CisgIC8vLyBleGlzdGluZyBkYXRhIGluIG1lbW9yeS4gIE1hcHBpbmdzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGVpcgorICAvLy8gR2xvYmFsVmFsdWUgaXMgZGVzdHJveWVkLgorICB2b2lkIGFkZEdsb2JhbE1hcHBpbmcoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCB2b2lkICpBZGRyKTsKKyAgCisgIC8vLyBjbGVhckFsbEdsb2JhbE1hcHBpbmdzIC0gQ2xlYXIgYWxsIGdsb2JhbCBtYXBwaW5ncyBhbmQgc3RhcnQgb3ZlciBhZ2FpbgorICAvLy8gdXNlIGluIGR5bmFtaWMgY29tcGlsYXRpb24gc2NlbmFyaW9zIHdoZW4geW91IHdhbnQgdG8gbW92ZSBnbG9iYWxzCisgIHZvaWQgY2xlYXJBbGxHbG9iYWxNYXBwaW5ncygpOworICAKKyAgLy8vIGNsZWFyR2xvYmFsTWFwcGluZ3NGcm9tTW9kdWxlIC0gQ2xlYXIgYWxsIGdsb2JhbCBtYXBwaW5ncyB0aGF0IGNhbWUgZnJvbSBhCisgIC8vLyBwYXJ0aWN1bGFyIG1vZHVsZSwgYmVjYXVzZSBpdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIEpJVC4KKyAgdm9pZCBjbGVhckdsb2JhbE1hcHBpbmdzRnJvbU1vZHVsZShNb2R1bGUgKk0pOworICAKKyAgLy8vIHVwZGF0ZUdsb2JhbE1hcHBpbmcgLSBSZXBsYWNlIGFuIGV4aXN0aW5nIG1hcHBpbmcgZm9yIEdWIHdpdGggYSBuZXcKKyAgLy8vIGFkZHJlc3MuICBUaGlzIHVwZGF0ZXMgYm90aCBtYXBzIGFzIHJlcXVpcmVkLiAgSWYgIkFkZHIiIGlzIG51bGwsIHRoZQorICAvLy8gZW50cnkgZm9yIHRoZSBnbG9iYWwgaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXBwaW5ncy4gIFRoaXMgcmV0dXJucyB0aGUgb2xkCisgIC8vLyB2YWx1ZSBvZiB0aGUgcG9pbnRlciwgb3IgbnVsbCBpZiBpdCB3YXMgbm90IGluIHRoZSBtYXAuCisgIHZvaWQgKnVwZGF0ZUdsb2JhbE1hcHBpbmcoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCB2b2lkICpBZGRyKTsKKyAgCisgIC8vLyBnZXRQb2ludGVyVG9HbG9iYWxJZkF2YWlsYWJsZSAtIFRoaXMgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBnbG9iYWwgdmFsdWUgaWYgaXQgaXMgaGFzIGFscmVhZHkgYmVlbiBjb2RlZ2VuJ2QsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgIC8vLyBudWxsLgorICAvLy8KKyAgdm9pZCAqZ2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoY29uc3QgR2xvYmFsVmFsdWUgKkdWKTsKKworICAvLy8gZ2V0UG9pbnRlclRvR2xvYmFsIC0gVGhpcyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgZ2xvYmFsCisgIC8vLyB2YWx1ZS4gIFRoaXMgbWF5IGludm9sdmUgY29kZSBnZW5lcmF0aW9uIGlmIGl0J3MgYSBmdW5jdGlvbi4KKyAgLy8vCisgIHZvaWQgKmdldFBvaW50ZXJUb0dsb2JhbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YpOworCisgIC8vLyBnZXRQb2ludGVyVG9GdW5jdGlvbiAtIFRoZSBkaWZmZXJlbnQgRUUncyByZXByZXNlbnQgZnVuY3Rpb24gYm9kaWVzIGluCisgIC8vLyBkaWZmZXJlbnQgd2F5cy4gIFRoZXkgc2hvdWxkIGVhY2ggaW1wbGVtZW50IHRoaXMgdG8gc2F5IHdoYXQgYSBmdW5jdGlvbgorICAvLy8gcG9pbnRlciBzaG91bGQgbG9vayBsaWtlLiAgV2hlbiBGIGlzIGRlc3Ryb3llZCwgdGhlIEV4ZWN1dGlvbkVuZ2luZSB3aWxsCisgIC8vLyByZW1vdmUgaXRzIGdsb2JhbCBtYXBwaW5nIGFuZCBmcmVlIGFueSBtYWNoaW5lIGNvZGUuICBCZSBzdXJlIG5vIHRocmVhZHMKKyAgLy8vIGFyZSBydW5uaW5nIGluc2lkZSBGIHdoZW4gdGhhdCBoYXBwZW5zLgorICAvLy8KKyAgdmlydHVhbCB2b2lkICpnZXRQb2ludGVyVG9GdW5jdGlvbihGdW5jdGlvbiAqRikgPSAwOworCisgIC8vLyBnZXRQb2ludGVyVG9CYXNpY0Jsb2NrIC0gVGhlIGRpZmZlcmVudCBFRSdzIHJlcHJlc2VudCBiYXNpYyBibG9ja3MgaW4KKyAgLy8vIGRpZmZlcmVudCB3YXlzLiAgUmV0dXJuIHRoZSByZXByZXNlbnRhdGlvbiBmb3IgYSBibG9ja2FkZHJlc3Mgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgYmxvY2suCisgIC8vLworICB2aXJ0dWFsIHZvaWQgKmdldFBvaW50ZXJUb0Jhc2ljQmxvY2soQmFzaWNCbG9jayAqQkIpID0gMDsKKyAgCisgIC8vLyBnZXRQb2ludGVyVG9GdW5jdGlvbk9yU3R1YiAtIElmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaGFzIGJlZW4KKyAgLy8vIGNvZGUtZ2VuJ2QsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgSWYgbm90LCBjb21waWxlIGl0LCBvciB1c2UKKyAgLy8vIGEgc3R1YiB0byBpbXBsZW1lbnQgbGF6eSBjb21waWxhdGlvbiBpZiBhdmFpbGFibGUuICBTZWUKKyAgLy8vIGdldFBvaW50ZXJUb0Z1bmN0aW9uIGZvciB0aGUgcmVxdWlyZW1lbnRzIG9uIGRlc3Ryb3lpbmcgRi4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCAqZ2V0UG9pbnRlclRvRnVuY3Rpb25PclN0dWIoRnVuY3Rpb24gKkYpIHsKKyAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uLCBqdXN0IGNvZGVnZW4gdGhlIGZ1bmN0aW9uLgorICAgIHJldHVybiBnZXRQb2ludGVyVG9GdW5jdGlvbihGKTsKKyAgfQorCisgIC8vIFRoZSBKSVQgb3ZlcnJpZGVzIGEgdmVyc2lvbiB0aGF0IGFjdHVhbGx5IGRvZXMgdGhpcy4KKyAgdmlydHVhbCB2b2lkIHJ1bkpJVE9uRnVuY3Rpb24oRnVuY3Rpb24gKiwgTWFjaGluZUNvZGVJbmZvICogPSAwKSB7IH0KKworICAvLy8gZ2V0R2xvYmFsVmFsdWVBdEFkZHJlc3MgLSBSZXR1cm4gdGhlIExMVk0gZ2xvYmFsIHZhbHVlIG9iamVjdCB0aGF0IHN0YXJ0cworICAvLy8gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICAvLy8KKyAgY29uc3QgR2xvYmFsVmFsdWUgKmdldEdsb2JhbFZhbHVlQXRBZGRyZXNzKHZvaWQgKkFkZHIpOworCisKKyAgdm9pZCBTdG9yZVZhbHVlVG9NZW1vcnkoY29uc3QgR2VuZXJpY1ZhbHVlICZWYWwsIEdlbmVyaWNWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSk7CisgIHZvaWQgSW5pdGlhbGl6ZU1lbW9yeShjb25zdCBDb25zdGFudCAqSW5pdCwgdm9pZCAqQWRkcik7CisKKyAgLy8vIHJlY29tcGlsZUFuZFJlbGlua0Z1bmN0aW9uIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmb3JjZSBhIGZ1bmN0aW9uCisgIC8vLyB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGNvbXBpbGVkIHRvIGJlIGNvbXBpbGVkIGFnYWluLCBwb3NzaWJseQorICAvLy8gYWZ0ZXIgaXQgaGFzIGJlZW4gbW9kaWZpZWQuIFRoZW4gdGhlIGVudHJ5IHRvIHRoZSBvbGQgY29weSBpcyBvdmVyd3JpdHRlbgorICAvLy8gd2l0aCBhIGJyYW5jaCB0byB0aGUgbmV3IGNvcHkuIElmIHRoZXJlIHdhcyBubyBvbGQgY29weSwgdGhpcyBhY3RzCisgIC8vLyBqdXN0IGxpa2UgVk06OmdldFBvaW50ZXJUb0Z1bmN0aW9uKCkuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgKnJlY29tcGlsZUFuZFJlbGlua0Z1bmN0aW9uKEZ1bmN0aW9uICpGKSA9IDA7CisKKyAgLy8vIGZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uIC0gUmVsZWFzZSBtZW1vcnkgaW4gdGhlIEV4ZWN1dGlvbkVuZ2luZQorICAvLy8gY29ycmVzcG9uZGluZyB0byB0aGUgbWFjaGluZSBjb2RlIGVtaXR0ZWQgdG8gZXhlY3V0ZSB0aGlzIGZ1bmN0aW9uLCB1c2VmdWwKKyAgLy8vIGZvciBnYXJiYWdlLWNvbGxlY3RpbmcgZ2VuZXJhdGVkIGNvZGUuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgZnJlZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24oRnVuY3Rpb24gKkYpID0gMDsKKworICAvLy8gZ2V0T3JFbWl0R2xvYmFsVmFyaWFibGUgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBnbG9iYWwKKyAgLy8vIHZhcmlhYmxlLCBwb3NzaWJseSBlbWl0dGluZyBpdCB0byBtZW1vcnkgaWYgbmVlZGVkLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZQorICAvLy8gRW1pdHRlci4KKyAgdmlydHVhbCB2b2lkICpnZXRPckVtaXRHbG9iYWxWYXJpYWJsZShjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlclRvR2xvYmFsKChHbG9iYWxWYWx1ZSopR1YpOworICB9CisKKyAgLy8vIFJlZ2lzdGVycyBhIGxpc3RlbmVyIHRvIGJlIGNhbGxlZCBiYWNrIG9uIHZhcmlvdXMgZXZlbnRzIHdpdGhpbgorICAvLy8gdGhlIEpJVC4gIFNlZSBKSVRFdmVudExpc3RlbmVyLmggZm9yIG1vcmUgZGV0YWlscy4gIERvZXMgbm90CisgIC8vLyB0YWtlIG93bmVyc2hpcCBvZiB0aGUgYXJndW1lbnQuICBUaGUgYXJndW1lbnQgbWF5IGJlIE5VTEwsIGluCisgIC8vLyB3aGljaCBjYXNlIHRoZXNlIGZ1bmN0aW9ucyBkbyBub3RoaW5nLgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJKSVRFdmVudExpc3RlbmVyKEpJVEV2ZW50TGlzdGVuZXIgKikge30KKyAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXJKSVRFdmVudExpc3RlbmVyKEpJVEV2ZW50TGlzdGVuZXIgKikge30KKworICAvLy8gRGlzYWJsZUxhenlDb21waWxhdGlvbiAtIFdoZW4gbGF6eSBjb21waWxhdGlvbiBpcyBvZmYgKHRoZSBkZWZhdWx0KSwgdGhlCisgIC8vLyBKSVQgd2lsbCBlYWdlcmx5IGNvbXBpbGUgZXZlcnkgZnVuY3Rpb24gcmVhY2hhYmxlIGZyb20gdGhlIGFyZ3VtZW50IHRvCisgIC8vLyBnZXRQb2ludGVyVG9GdW5jdGlvbi4gIElmIGxhenkgY29tcGlsYXRpb24gaXMgdHVybmVkIG9uLCB0aGUgSklUIHdpbGwgb25seQorICAvLy8gY29tcGlsZSB0aGUgb25lIGZ1bmN0aW9uIGFuZCBlbWl0IHN0dWJzIHRvIGNvbXBpbGUgdGhlIHJlc3Qgd2hlbiB0aGV5J3JlCisgIC8vLyBmaXJzdCBjYWxsZWQuICBJZiBsYXp5IGNvbXBpbGF0aW9uIGlzIHR1cm5lZCBvZmYgYWdhaW4gd2hpbGUgc29tZSBsYXp5CisgIC8vLyBzdHVicyBhcmUgc3RpbGwgYXJvdW5kLCBhbmQgb25lIG9mIHRob3NlIHN0dWJzIGlzIGNhbGxlZCwgdGhlIHByb2dyYW0gd2lsbAorICAvLy8gYWJvcnQuCisgIC8vLworICAvLy8gSW4gb3JkZXIgdG8gc2FmZWx5IGNvbXBpbGUgbGF6aWx5IGluIGEgdGhyZWFkZWQgcHJvZ3JhbSwgdGhlIHVzZXIgbXVzdAorICAvLy8gZW5zdXJlIHRoYXQgMSkgb25seSBvbmUgdGhyZWFkIGF0IGEgdGltZSBjYW4gY2FsbCBhbnkgcGFydGljdWxhciBsYXp5CisgIC8vLyBzdHViLCBhbmQgMikgYW55IHRocmVhZCBtb2RpZnlpbmcgTExWTSBJUiBtdXN0IGhvbGQgdGhlIEpJVCdzIGxvY2sKKyAgLy8vIChFeGVjdXRpb25FbmdpbmU6OmxvY2spIG9yIG90aGVyd2lzZSBlbnN1cmUgdGhhdCBubyBvdGhlciB0aHJlYWQgY2FsbHMgYQorICAvLy8gbGF6eSBzdHViLiAgU2VlIGh0dHA6Ly9sbHZtLm9yZy9QUjUxODQgZm9yIGRldGFpbHMuCisgIHZvaWQgRGlzYWJsZUxhenlDb21waWxhdGlvbihib29sIERpc2FibGVkID0gdHJ1ZSkgeworICAgIENvbXBpbGluZ0xhemlseSA9ICFEaXNhYmxlZDsKKyAgfQorICBib29sIGlzQ29tcGlsaW5nTGF6aWx5KCkgY29uc3QgeworICAgIHJldHVybiBDb21waWxpbmdMYXppbHk7CisgIH0KKyAgLy8gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBpc0NvbXBpbGluZ0xhemlseSAodG8gcmVkdWNlIGRvdWJsZS1uZWdhdGl2ZXMpLgorICAvLyBSZW1vdmUgdGhpcyBpbiBMTFZNIDIuOC4KKyAgYm9vbCBpc0xhenlDb21waWxhdGlvbkRpc2FibGVkKCkgY29uc3QgeworICAgIHJldHVybiAhQ29tcGlsaW5nTGF6aWx5OworICB9CisKKyAgLy8vIERpc2FibGVHVkNvbXBpbGF0aW9uIC0gSWYgY2FsbGVkLCB0aGUgSklUIHdpbGwgYWJvcnQgaWYgaXQncyBhc2tlZCB0bworICAvLy8gYWxsb2NhdGUgc3BhY2UgYW5kIHBvcHVsYXRlIGEgR2xvYmFsVmFyaWFibGUgdGhhdCBpcyBub3QgaW50ZXJuYWwgdG8KKyAgLy8vIHRoZSBtb2R1bGUuCisgIHZvaWQgRGlzYWJsZUdWQ29tcGlsYXRpb24oYm9vbCBEaXNhYmxlZCA9IHRydWUpIHsKKyAgICBHVkNvbXBpbGF0aW9uRGlzYWJsZWQgPSBEaXNhYmxlZDsKKyAgfQorICBib29sIGlzR1ZDb21waWxhdGlvbkRpc2FibGVkKCkgY29uc3QgeworICAgIHJldHVybiBHVkNvbXBpbGF0aW9uRGlzYWJsZWQ7CisgIH0KKworICAvLy8gRGlzYWJsZVN5bWJvbFNlYXJjaGluZyAtIElmIGNhbGxlZCwgdGhlIEpJVCB3aWxsIG5vdCB0cnkgdG8gbG9va3VwIHVua25vd24KKyAgLy8vIHN5bWJvbHMgd2l0aCBkbHN5bS4gIEEgY2xpZW50IGNhbiBzdGlsbCB1c2UgSW5zdGFsbExhenlGdW5jdGlvbkNyZWF0b3IgdG8KKyAgLy8vIHJlc29sdmUgc3ltYm9scyBpbiBhIGN1c3RvbSB3YXkuCisgIHZvaWQgRGlzYWJsZVN5bWJvbFNlYXJjaGluZyhib29sIERpc2FibGVkID0gdHJ1ZSkgeworICAgIFN5bWJvbFNlYXJjaGluZ0Rpc2FibGVkID0gRGlzYWJsZWQ7CisgIH0KKyAgYm9vbCBpc1N5bWJvbFNlYXJjaGluZ0Rpc2FibGVkKCkgY29uc3QgeworICAgIHJldHVybiBTeW1ib2xTZWFyY2hpbmdEaXNhYmxlZDsKKyAgfQorCisgIC8vLyBJbnN0YWxsTGF6eUZ1bmN0aW9uQ3JlYXRvciAtIElmIGFuIHVua25vd24gZnVuY3Rpb24gaXMgbmVlZGVkLCB0aGUKKyAgLy8vIHNwZWNpZmllZCBmdW5jdGlvbiBwb2ludGVyIGlzIGludm9rZWQgdG8gY3JlYXRlIGl0LiAgSWYgaXQgcmV0dXJucyBudWxsLAorICAvLy8gdGhlIEpJVCB3aWxsIGFib3J0LgorICB2b2lkIEluc3RhbGxMYXp5RnVuY3Rpb25DcmVhdG9yKHZvaWQqICgqUCkoY29uc3Qgc3RkOjpzdHJpbmcgJikpIHsKKyAgICBMYXp5RnVuY3Rpb25DcmVhdG9yID0gUDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEV4ZWN1dGlvbkVuZ2luZShNb2R1bGUgKk0pOworCisgIHZvaWQgZW1pdEdsb2JhbHMoKTsKKworICAvLyBFbWl0R2xvYmFsVmFyaWFibGUgLSBUaGlzIG1ldGhvZCBlbWl0cyB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZSB0byB0aGUKKyAgLy8gYWRkcmVzcyBzcGVjaWZpZWQgaW4gR2xvYmFsQWRkcmVzc2VzLCBvciBhbGxvY2F0ZXMgbmV3IG1lbW9yeSBpZiBpdCdzIG5vdAorICAvLyBhbHJlYWR5IGluIHRoZSBtYXAuCisgIHZvaWQgRW1pdEdsb2JhbFZhcmlhYmxlKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVik7CisKKyAgR2VuZXJpY1ZhbHVlIGdldENvbnN0YW50VmFsdWUoY29uc3QgQ29uc3RhbnQgKkMpOworICB2b2lkIExvYWRWYWx1ZUZyb21NZW1vcnkoR2VuZXJpY1ZhbHVlICZSZXN1bHQsIEdlbmVyaWNWYWx1ZSAqUHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KTsKK307CisKK25hbWVzcGFjZSBFbmdpbmVLaW5kIHsKKyAgLy8gVGhlc2UgYXJlIGFjdHVhbGx5IGJpdG1hc2tzIHRoYXQgZ2V0IG9yLWVkIHRvZ2V0aGVyLgorICBlbnVtIEtpbmQgeworICAgIEpJVCAgICAgICAgID0gMHgxLAorICAgIEludGVycHJldGVyID0gMHgyCisgIH07CisgIGNvbnN0IHN0YXRpYyBLaW5kIEVpdGhlciA9IChLaW5kKShKSVQgfCBJbnRlcnByZXRlcik7Cit9CisKKy8vLyBFbmdpbmVCdWlsZGVyIC0gQnVpbGRlciBjbGFzcyBmb3IgRXhlY3V0aW9uRW5naW5lcy4gIFVzZSB0aGlzIGJ5CisvLy8gc3RhY2stYWxsb2NhdGluZyBhIGJ1aWxkZXIsIGNoYWluaW5nIHRoZSB2YXJpb3VzIHNldCogbWV0aG9kcywgYW5kCisvLy8gdGVybWluYXRpbmcgaXQgd2l0aCBhIC5jcmVhdGUoKSBjYWxsLgorY2xhc3MgRW5naW5lQnVpbGRlciB7CisKKyBwcml2YXRlOgorICBNb2R1bGUgKk07CisgIEVuZ2luZUtpbmQ6OktpbmQgV2hpY2hFbmdpbmU7CisgIHN0ZDo6c3RyaW5nICpFcnJvclN0cjsKKyAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWw7CisgIEpJVE1lbW9yeU1hbmFnZXIgKkpNTTsKKyAgYm9vbCBBbGxvY2F0ZUdWc1dpdGhDb2RlOworICBDb2RlTW9kZWw6Ok1vZGVsIENNTW9kZWw7CisgIHN0ZDo6c3RyaW5nIE1BcmNoOworICBzdGQ6OnN0cmluZyBNQ1BVOworICBTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgND4gTUF0dHJzOworCisgIC8vLyBJbml0RW5naW5lIC0gRG9lcyB0aGUgY29tbW9uIGluaXRpYWxpemF0aW9uIG9mIGRlZmF1bHQgb3B0aW9ucy4KKyAgLy8vCisgIHZvaWQgSW5pdEVuZ2luZSgpIHsKKyAgICBXaGljaEVuZ2luZSA9IEVuZ2luZUtpbmQ6OkVpdGhlcjsKKyAgICBFcnJvclN0ciA9IE5VTEw7CisgICAgT3B0TGV2ZWwgPSBDb2RlR2VuT3B0OjpEZWZhdWx0OworICAgIEpNTSA9IE5VTEw7CisgICAgQWxsb2NhdGVHVnNXaXRoQ29kZSA9IGZhbHNlOworICAgIENNTW9kZWwgPSBDb2RlTW9kZWw6OkRlZmF1bHQ7CisgIH0KKworIHB1YmxpYzoKKyAgLy8vIEVuZ2luZUJ1aWxkZXIgLSBDb25zdHJ1Y3RvciBmb3IgRW5naW5lQnVpbGRlci4gIElmIGNyZWF0ZSgpIGlzIGNhbGxlZCBhbmQKKyAgLy8vIGlzIHN1Y2Nlc3NmdWwsIHRoZSBjcmVhdGVkIGVuZ2luZSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIG1vZHVsZS4KKyAgRW5naW5lQnVpbGRlcihNb2R1bGUgKm0pIDogTShtKSB7CisgICAgSW5pdEVuZ2luZSgpOworICB9CisKKyAgLy8vIHNldEVuZ2luZUtpbmQgLSBDb250cm9scyB3aGV0aGVyIHRoZSB1c2VyIHdhbnRzIHRoZSBpbnRlcnByZXRlciwgdGhlIEpJVCwKKyAgLy8vIG9yIHdoaWNoZXZlciBlbmdpbmUgd29ya3MuICBUaGlzIG9wdGlvbiBkZWZhdWx0cyB0byBFbmdpbmVLaW5kOjpFaXRoZXIuCisgIEVuZ2luZUJ1aWxkZXIgJnNldEVuZ2luZUtpbmQoRW5naW5lS2luZDo6S2luZCB3KSB7CisgICAgV2hpY2hFbmdpbmUgPSB3OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBzZXRKSVRNZW1vcnlNYW5hZ2VyIC0gU2V0cyB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gdXNlLiAgVGhpcyBhbGxvd3MKKyAgLy8vIGNsaWVudHMgdG8gY3VzdG9taXplIHRoZWlyIG1lbW9yeSBhbGxvY2F0aW9uIHBvbGljaWVzLiAgSWYgY3JlYXRlKCkgaXMKKyAgLy8vIGNhbGxlZCBhbmQgaXMgc3VjY2Vzc2Z1bCwgdGhlIGNyZWF0ZWQgZW5naW5lIHRha2VzIG93bmVyc2hpcCBvZiB0aGUKKyAgLy8vIG1lbW9yeSBtYW5hZ2VyLiAgVGhpcyBvcHRpb24gZGVmYXVsdHMgdG8gTlVMTC4KKyAgRW5naW5lQnVpbGRlciAmc2V0SklUTWVtb3J5TWFuYWdlcihKSVRNZW1vcnlNYW5hZ2VyICpqbW0pIHsKKyAgICBKTU0gPSBqbW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldEVycm9yU3RyIC0gU2V0IHRoZSBlcnJvciBzdHJpbmcgdG8gd3JpdGUgdG8gb24gZXJyb3IuICBUaGlzIG9wdGlvbgorICAvLy8gZGVmYXVsdHMgdG8gTlVMTC4KKyAgRW5naW5lQnVpbGRlciAmc2V0RXJyb3JTdHIoc3RkOjpzdHJpbmcgKmUpIHsKKyAgICBFcnJvclN0ciA9IGU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldE9wdExldmVsIC0gU2V0IHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwgZm9yIHRoZSBKSVQuICBUaGlzIG9wdGlvbgorICAvLy8gZGVmYXVsdHMgdG8gQ29kZUdlbk9wdDo6RGVmYXVsdC4KKyAgRW5naW5lQnVpbGRlciAmc2V0T3B0TGV2ZWwoQ29kZUdlbk9wdDo6TGV2ZWwgbCkgeworICAgIE9wdExldmVsID0gbDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc2V0Q29kZU1vZGVsIC0gU2V0IHRoZSBDb2RlTW9kZWwgdGhhdCB0aGUgRXhlY3V0aW9uRW5naW5lIHRhcmdldAorICAvLy8gZGF0YSBpcyB1c2luZy4gRGVmYXVsdHMgdG8gdGFyZ2V0IHNwZWNpZmljIGRlZmF1bHQgIkNvZGVNb2RlbDo6RGVmYXVsdCIuCisgIEVuZ2luZUJ1aWxkZXIgJnNldENvZGVNb2RlbChDb2RlTW9kZWw6Ok1vZGVsIE0pIHsKKyAgICBDTU1vZGVsID0gTTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc2V0QWxsb2NhdGVHVnNXaXRoQ29kZSAtIFNldHMgd2hldGhlciBnbG9iYWwgdmFsdWVzIHNob3VsZCBiZSBhbGxvY2F0ZWQKKyAgLy8vIGludG8gdGhlIHNhbWUgYnVmZmVyIGFzIGNvZGUuICBGb3IgbW9zdCBhcHBsaWNhdGlvbnMgdGhpcyBzaG91bGQgYmUgc2V0CisgIC8vLyB0byBmYWxzZS4gIEFsbG9jYXRpbmcgZ2xvYmFscyB3aXRoIGNvZGUgYnJlYWtzIGZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uCisgIC8vLyBhbmQgaXMgcHJvYmFibHkgdW5zYWZlIGFuZCBiYWQgZm9yIHBlcmZvcm1hbmNlLiAgSG93ZXZlciwgd2UgaGF2ZSBjbGllbnRzCisgIC8vLyB3aG8gZGVwZW5kIG9uIHRoaXMgYmVoYXZpb3IsIHNvIHdlIG11c3Qgc3VwcG9ydCBpdC4gIFRoaXMgb3B0aW9uIGRlZmF1bHRzCisgIC8vLyB0byBmYWxzZSBzbyB0aGF0IHVzZXJzIG9mIHRoZSBuZXcgQVBJIGNhbiBzYWZlbHkgdXNlIHRoZSBuZXcgbWVtb3J5CisgIC8vLyBtYW5hZ2VyIGFuZCBmcmVlIG1hY2hpbmUgY29kZS4KKyAgRW5naW5lQnVpbGRlciAmc2V0QWxsb2NhdGVHVnNXaXRoQ29kZShib29sIGEpIHsKKyAgICBBbGxvY2F0ZUdWc1dpdGhDb2RlID0gYTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc2V0TUFyY2ggLSBPdmVycmlkZSB0aGUgYXJjaGl0ZWN0dXJlIHNldCBieSB0aGUgTW9kdWxlJ3MgdHJpcGxlLgorICBFbmdpbmVCdWlsZGVyICZzZXRNQXJjaChTdHJpbmdSZWYgbWFyY2gpIHsKKyAgICBNQXJjaC5hc3NpZ24obWFyY2guYmVnaW4oKSwgbWFyY2guZW5kKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBzZXRNQ1BVIC0gVGFyZ2V0IGEgc3BlY2lmaWMgY3B1IHR5cGUuCisgIEVuZ2luZUJ1aWxkZXIgJnNldE1DUFUoU3RyaW5nUmVmIG1jcHUpIHsKKyAgICBNQ1BVLmFzc2lnbihtY3B1LmJlZ2luKCksIG1jcHUuZW5kKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBzZXRNQXR0cnMgLSBTZXQgY3B1LXNwZWNpZmljIGF0dHJpYnV0ZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZ1NlcXVlbmNlPgorICBFbmdpbmVCdWlsZGVyICZzZXRNQXR0cnMoY29uc3QgU3RyaW5nU2VxdWVuY2UgJm1hdHRycykgeworICAgIE1BdHRycy5jbGVhcigpOworICAgIE1BdHRycy5hcHBlbmQobWF0dHJzLmJlZ2luKCksIG1hdHRycy5lbmQoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgRXhlY3V0aW9uRW5naW5lICpjcmVhdGUoKTsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9HZW5lcmljVmFsdWUuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvR2VuZXJpY1ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwMTMyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvR2VuZXJpY1ZhbHVlLmgKQEAgLTAsMCArMSw0NCBAQAorLy89PT0tLSBHZW5lcmljVmFsdWUuaCAtIFJlcHJlc2VudCBhbnkgdHlwZSBvZiBMTFZNIHZhbHVlIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgR2VuZXJpY1ZhbHVlIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IGFuIExMVk0gdmFsdWUgb2YgYXJiaXRyYXJ5IHR5cGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEdFTkVSSUNfVkFMVUVfSAorI2RlZmluZSBHRU5FUklDX1ZBTFVFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordHlwZWRlZiB2b2lkKiBQb2ludGVyVHk7CitjbGFzcyBBUEludDsKKworc3RydWN0IEdlbmVyaWNWYWx1ZSB7CisgIHVuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgRG91YmxlVmFsOworICAgIGZsb2F0ICAgICAgICAgICBGbG9hdFZhbDsKKyAgICBQb2ludGVyVHkgICAgICAgUG9pbnRlclZhbDsKKyAgICBzdHJ1Y3QgeyB1bnNpZ25lZCBpbnQgZmlyc3Q7IHVuc2lnbmVkIGludCBzZWNvbmQ7IH0gVUludFBhaXJWYWw7CisgICAgdW5zaWduZWQgY2hhciAgIFVudHlwZWRbOF07CisgIH07CisgIEFQSW50IEludFZhbDsgICAvLyBhbHNvIHVzZWQgZm9yIGxvbmcgZG91YmxlcworCisgIEdlbmVyaWNWYWx1ZSgpIDogRG91YmxlVmFsKDAuMCksIEludFZhbCgxLDApIHt9CisgIGV4cGxpY2l0IEdlbmVyaWNWYWx1ZSh2b2lkICpWKSA6IFBvaW50ZXJWYWwoViksIEludFZhbCgxLDApIHsgfQorfTsKKworaW5saW5lIEdlbmVyaWNWYWx1ZSBQVE9HVih2b2lkICpQKSB7IHJldHVybiBHZW5lcmljVmFsdWUoUCk7IH0KK2lubGluZSB2b2lkKiBHVlRPUChjb25zdCBHZW5lcmljVmFsdWUgJkdWKSB7IHJldHVybiBHVi5Qb2ludGVyVmFsOyB9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDI1Y2RiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LS0gSW50ZXJwcmV0ZXIuaCAtIEFic3RyYWN0IEV4ZWN1dGlvbiBFbmdpbmUgSW50ZXJmYWNlIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGZvcmNlcyB0aGUgaW50ZXJwcmV0ZXIgdG8gbGluayBpbiBvbiBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorLy8gKFdpbmRvd3MpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgRVhFQ1VUSU9OX0VOR0lORV9JTlRFUlBSRVRFUl9ICisjZGVmaW5lIEVYRUNVVElPTl9FTkdJTkVfSU5URVJQUkVURVJfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworZXh0ZXJuICJDIiB2b2lkIExMVk1MaW5rSW5JbnRlcnByZXRlcigpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRm9yY2VJbnRlcnByZXRlckxpbmtpbmcgeworICAgIEZvcmNlSW50ZXJwcmV0ZXJMaW5raW5nKCkgeworICAgICAgLy8gV2UgbXVzdCByZWZlcmVuY2UgdGhlIHBhc3NlcyBpbiBzdWNoIGEgd2F5IHRoYXQgY29tcGlsZXJzIHdpbGwgbm90CisgICAgICAvLyBkZWxldGUgaXQgYWxsIGFzIGRlYWQgY29kZSwgZXZlbiB3aXRoIHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uLAorICAgICAgLy8geWV0IGlzIGVmZmVjdGl2ZWx5IGEgTk8tT1AuIEFzIHRoZSBjb21waWxlciBpc24ndCBzbWFydCBlbm91Z2gKKyAgICAgIC8vIHRvIGtub3cgdGhhdCBnZXRlbnYoKSBuZXZlciByZXR1cm5zIC0xLCB0aGlzIHdpbGwgZG8gdGhlIGpvYi4KKyAgICAgIGlmIChzdGQ6OmdldGVudigiYmFyIikgIT0gKGNoYXIqKSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBMTFZNTGlua0luSW50ZXJwcmV0ZXIoKTsKKyAgICB9CisgIH0gRm9yY2VJbnRlcnByZXRlckxpbmtpbmc7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVQuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSklULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxM2RiNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSklULmgKQEAgLTAsMCArMSwzOCBAQAorLy89PT0tLSBKSVQuaCAtIEFic3RyYWN0IEV4ZWN1dGlvbiBFbmdpbmUgSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZm9yY2VzIHRoZSBKSVQgdG8gbGluayBpbiBvbiBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorLy8gKFdpbmRvd3MpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05fRU5HSU5FX0pJVF9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9OX0VOR0lORV9KSVRfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworZXh0ZXJuICJDIiB2b2lkIExMVk1MaW5rSW5KSVQoKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEZvcmNlSklUTGlua2luZyB7CisgICAgRm9yY2VKSVRMaW5raW5nKCkgeworICAgICAgLy8gV2UgbXVzdCByZWZlcmVuY2UgdGhlIHBhc3NlcyBpbiBzdWNoIGEgd2F5IHRoYXQgY29tcGlsZXJzIHdpbGwgbm90CisgICAgICAvLyBkZWxldGUgaXQgYWxsIGFzIGRlYWQgY29kZSwgZXZlbiB3aXRoIHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uLAorICAgICAgLy8geWV0IGlzIGVmZmVjdGl2ZWx5IGEgTk8tT1AuIEFzIHRoZSBjb21waWxlciBpc24ndCBzbWFydCBlbm91Z2gKKyAgICAgIC8vIHRvIGtub3cgdGhhdCBnZXRlbnYoKSBuZXZlciByZXR1cm5zIC0xLCB0aGlzIHdpbGwgZG8gdGhlIGpvYi4KKyAgICAgIGlmIChzdGQ6OmdldGVudigiYmFyIikgIT0gKGNoYXIqKSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBMTFZNTGlua0luSklUKCk7CisgICAgfQorICB9IEZvcmNlSklUTGlua2luZzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0pJVEV2ZW50TGlzdGVuZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSklURXZlbnRMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzY2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0pJVEV2ZW50TGlzdGVuZXIuaApAQCAtMCwwICsxLDc4IEBACisvLz09PS0gSklURXZlbnRMaXN0ZW5lci5oIC0gRXhwb3NlcyBldmVudHMgZnJvbSBKSVQgY29tcGlsYXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBKSVRFdmVudExpc3RlbmVyIGludGVyZmFjZSwgd2hpY2ggbGV0cyB1c2VycyBnZXQKKy8vIGNhbGxiYWNrcyB3aGVuIHNpZ25pZmljYW50IGV2ZW50cyBoYXBwZW4gZHVyaW5nIHRoZSBKSVQgY29tcGlsYXRpb24gcHJvY2Vzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9OX0VOR0lORV9KSVRfRVZFTlRMSVNURU5FUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9OX0VOR0lORV9KSVRfRVZFTlRMSVNURU5FUl9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWdMb2MuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisKKy8vLyBFbXB0eSBmb3Igbm93LCBidXQgdGhpcyBvYmplY3Qgd2lsbCBjb250YWluIGFsbCBkZXRhaWxzIGFib3V0IHRoZQorLy8vIGdlbmVyYXRlZCBtYWNoaW5lIGNvZGUgdGhhdCBhIExpc3RlbmVyIG1pZ2h0IGNhcmUgYWJvdXQuCitzdHJ1Y3QgSklURXZlbnRfRW1pdHRlZEZ1bmN0aW9uRGV0YWlscyB7CisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUY7CisKKyAgc3RydWN0IExpbmVTdGFydCB7CisgICAgLy8gVGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhlIGN1cnJlbnQgbGluZSBjaGFuZ2VzLgorICAgIHVpbnRwdHJfdCBBZGRyZXNzOworICAgIC8vIFRoZSBuZXcgbG9jYXRpb24gaW5mb3JtYXRpb24uICBUaGVzZSBjYW4gYmUgdHJhbnNsYXRlZCB0bworICAgIC8vIERlYnVnTG9jVHVwbGVzIHVzaW5nIE1GLT5nZXREZWJ1Z0xvY1R1cGxlKCkuCisgICAgRGVidWdMb2MgTG9jOworICB9OworICAvLyBUaGlzIGhvbGRzIGxpbmUgYm91bmRhcnkgaW5mb3JtYXRpb24gc29ydGVkIGJ5IGFkZHJlc3MuCisgIHN0ZDo6dmVjdG9yPExpbmVTdGFydD4gTGluZVN0YXJ0czsKK307CisKKy8vLyBKSVRFdmVudExpc3RlbmVyIC0gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgSklUIHRvIG5vdGlmeSBjbGllbnRzIGFib3V0CisvLy8gc2lnbmlmaWNhbnQgZXZlbnRzIGR1cmluZyBjb21waWxhdGlvbi4gIEZvciBleGFtcGxlLCB3ZSBjb3VsZCBoYXZlCisvLy8gaW1wbGVtZW50YXRpb25zIGZvciBwcm9maWxlcnMgYW5kIGRlYnVnZ2VycyB0aGF0IG5lZWQgdG8ga25vdyB3aGVyZQorLy8vIGZ1bmN0aW9ucyBoYXZlIGJlZW4gZW1pdHRlZC4KKy8vLworLy8vIEVhY2ggbWV0aG9kIGRlZmF1bHRzIHRvIGRvaW5nIG5vdGhpbmcsIHNvIHlvdSBvbmx5IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIG9uZXMKKy8vLyB5b3UgY2FyZSBhYm91dC4KK2NsYXNzIEpJVEV2ZW50TGlzdGVuZXIgeworcHVibGljOgorICBKSVRFdmVudExpc3RlbmVyKCkge30KKyAgdmlydHVhbCB+SklURXZlbnRMaXN0ZW5lcigpOyAgLy8gRGVmaW5lZCBpbiBKSVQuY3BwLgorCisgIHR5cGVkZWYgSklURXZlbnRfRW1pdHRlZEZ1bmN0aW9uRGV0YWlscyBFbWl0dGVkRnVuY3Rpb25EZXRhaWxzOworICAvLy8gTm90aWZ5RnVuY3Rpb25FbWl0dGVkIC0gQ2FsbGVkIGFmdGVyIGEgZnVuY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisgIC8vLyBlbWl0dGVkIHRvIG1lbW9yeS4gIFRoZSBmdW5jdGlvbiBzdGlsbCBoYXMgaXRzIE1hY2hpbmVGdW5jdGlvbiBhdHRhY2hlZCwKKyAgLy8vIGlmIHlvdSBzaG91bGQgaGFwcGVuIHRvIG5lZWQgdGhhdC4KKyAgdmlydHVhbCB2b2lkIE5vdGlmeUZ1bmN0aW9uRW1pdHRlZChjb25zdCBGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb2RlLCBzaXplX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbWl0dGVkRnVuY3Rpb25EZXRhaWxzICZEZXRhaWxzKSB7fQorCisgIC8vLyBOb3RpZnlGcmVlaW5nTWFjaGluZUNvZGUgLSBUaGlzIGlzIGNhbGxlZCBpbnNpZGUgb2YKKyAgLy8vIGZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uKCksIGFmdGVyIHRoZSBnbG9iYWwgbWFwcGluZyBpcyByZW1vdmVkLCBidXQKKyAgLy8vIGJlZm9yZSB0aGUgbWFjaGluZSBjb2RlIGlzIHJldHVybmVkIHRvIHRoZSBhbGxvY2F0b3IuICBPbGRQdHIgaXMgdGhlCisgIC8vLyBhZGRyZXNzIG9mIHRoZSBtYWNoaW5lIGNvZGUgYW5kIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIENvZGUgcGFyYW1ldGVyIHRvCisgIC8vLyBhIHByZXZpb3VzIE5vdGlmeUZ1bmN0aW9uRW1pdHRlZCBjYWxsLiAgVGhlIEZ1bmN0aW9uIHBhc3NlZCB0bworICAvLy8gTm90aWZ5RnVuY3Rpb25FbWl0dGVkIG1heSBoYXZlIGJlZW4gZGVzdHJveWVkIGJ5IHRoZSB0aW1lIG9mIHRoZSBtYXRjaGluZworICAvLy8gTm90aWZ5RnJlZWluZ01hY2hpbmVDb2RlIGNhbGwuCisgIHZpcnR1YWwgdm9pZCBOb3RpZnlGcmVlaW5nTWFjaGluZUNvZGUodm9pZCAqT2xkUHRyKSB7fQorfTsKKworLy8gVGhpcyByZXR1cm5zIE5VTEwgaWYgc3VwcG9ydCBpc24ndCBhdmFpbGFibGUuCitKSVRFdmVudExpc3RlbmVyICpjcmVhdGVPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRNZW1vcnlNYW5hZ2VyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0pJVE1lbW9yeU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDE1OTMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRNZW1vcnlNYW5hZ2VyLmgKQEAgLTAsMCArMSwxODUgQEAKKy8vPT09LS0gSklUTWVtb3J5TWFuYWdlci5oIC0gSW50ZXJmYWNlIEpJVCB1c2VzIHRvIEFsbG9jYXRlIE1lbSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEpJVE1lbW9yeU1hbmFnZXJJbnRlcmZhY2UKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9OX0VOR0lORV9KSVRfTUVNTUFOQUdFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9OX0VOR0lORV9KSVRfTUVNTUFOQUdFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBGdW5jdGlvbjsKKyAgY2xhc3MgR2xvYmFsVmFsdWU7CisKKy8vLyBKSVRNZW1vcnlNYW5hZ2VyIC0gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgSklUIHRvIGFsbG9jYXRlIGFuZCBtYW5hZ2UKKy8vLyBtZW1vcnkgZm9yIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgSklULiAgVGhpcyBjYW4gYmUgcmVpbXBsZW1lbnRlZCBieQorLy8vIGNsaWVudHMgdGhhdCBoYXZlIGEgc3Ryb25nIGRlc2lyZSB0byBjb250cm9sIGhvdyB0aGUgbGF5b3V0IG9mIEpJVCdkIG1lbW9yeQorLy8vIHdvcmtzLgorY2xhc3MgSklUTWVtb3J5TWFuYWdlciB7Citwcm90ZWN0ZWQ6CisgIGJvb2wgSGFzR09UOworcHVibGljOgorCisgIEpJVE1lbW9yeU1hbmFnZXIoKSA6IEhhc0dPVChmYWxzZSkge30KKyAgdmlydHVhbCB+SklUTWVtb3J5TWFuYWdlcigpOworICAKKyAgLy8vIENyZWF0ZURlZmF1bHRNZW1NYW5hZ2VyIC0gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZGVmYXVsdAorICAvLy8gSklUIE1lbW9yeSBNYW5hZ2VyIGlmIHRoZSBjbGllbnQgZG9lcyBub3QgcHJvdmlkZSBvbmUgdG8gdGhlIEpJVC4KKyAgc3RhdGljIEpJVE1lbW9yeU1hbmFnZXIgKkNyZWF0ZURlZmF1bHRNZW1NYW5hZ2VyKCk7CisgIAorICAvLy8gc2V0TWVtb3J5V3JpdGFibGUgLSBXaGVuIGNvZGUgZ2VuZXJhdGlvbiBpcyBpbiBwcm9ncmVzcywKKyAgLy8vIHRoZSBjb2RlIHBhZ2VzIG1heSBuZWVkIHBlcm1pc3Npb25zIGNoYW5nZWQuCisgIHZpcnR1YWwgdm9pZCBzZXRNZW1vcnlXcml0YWJsZSgpID0gMDsKKworICAvLy8gc2V0TWVtb3J5RXhlY3V0YWJsZSAtIFdoZW4gY29kZSBnZW5lcmF0aW9uIGlzIGRvbmUgYW5kIHdlJ3JlIHJlYWR5IHRvCisgIC8vLyBzdGFydCBleGVjdXRpb24sIHRoZSBjb2RlIHBhZ2VzIG1heSBuZWVkIHBlcm1pc3Npb25zIGNoYW5nZWQuCisgIHZpcnR1YWwgdm9pZCBzZXRNZW1vcnlFeGVjdXRhYmxlKCkgPSAwOworCisgIC8vLyBzZXRQb2lzb25NZW1vcnkgLSBTZXR0aW5nIHRoaXMgZmxhZyB0byB0cnVlIG1ha2VzIHRoZSBtZW1vcnkgbWFuYWdlcgorICAvLy8gZ2FyYmFnZSB2YWx1ZXMgb3ZlciBmcmVlZCBtZW1vcnkuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBhbmQKKyAgLy8vIGRlYnVnZ2luZywgYW5kIGlzIGJlIHR1cm5lZCBvbiBieSBkZWZhdWx0IGluIGRlYnVnIG1vZGUuCisgIHZpcnR1YWwgdm9pZCBzZXRQb2lzb25NZW1vcnkoYm9vbCBwb2lzb24pID0gMDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gR2xvYmFsIE9mZnNldCBUYWJsZSBNYW5hZ2VtZW50CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBBbGxvY2F0ZUdPVCAtIElmIHRoZSBjdXJyZW50IHRhYmxlIHJlcXVpcmVzIGEgR2xvYmFsIE9mZnNldCBUYWJsZSwgdGhpcworICAvLy8gbWV0aG9kIGlzIGludm9rZWQgdG8gYWxsb2NhdGUgaXQuICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCB0byBzZXQgSGFzR09UCisgIC8vLyB0byB0cnVlLgorICB2aXJ0dWFsIHZvaWQgQWxsb2NhdGVHT1QoKSA9IDA7CisgIAorICAvLy8gaXNNYW5hZ2luZ0dPVCAtIFJldHVybiB0cnVlIGlmIHRoZSBBbGxvY2F0ZUdPVCBtZXRob2QgaXMgY2FsbGVkLgorICAvLy8KKyAgYm9vbCBpc01hbmFnaW5nR09UKCkgY29uc3QgeworICAgIHJldHVybiBIYXNHT1Q7CisgIH0KKyAgCisgIC8vLyBnZXRHT1RCYXNlIC0gSWYgdGhpcyBpcyBtYW5hZ2luZyBhIEdsb2JhbCBPZmZzZXQgVGFibGUsIHRoaXMgbWV0aG9kIHNob3VsZAorICAvLy8gcmV0dXJuIGEgcG9pbnRlciB0byBpdHMgYmFzZS4KKyAgdmlydHVhbCB1aW50OF90ICpnZXRHT1RCYXNlKCkgY29uc3QgPSAwOworICAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1haW4gQWxsb2NhdGlvbiBGdW5jdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIHN0YXJ0RnVuY3Rpb25Cb2R5IC0gV2hlbiB3ZSBzdGFydCBKSVRpbmcgYSBmdW5jdGlvbiwgdGhlIEpJVCBjYWxscyB0aGlzCisgIC8vLyBtZXRob2QgdG8gYWxsb2NhdGUgYSBibG9jayBvZiBmcmVlIFJXWCBtZW1vcnksIHdoaWNoIHJldHVybnMgYSBwb2ludGVyIHRvCisgIC8vLyBpdC4gIElmIHRoZSBKSVQgd2FudHMgdG8gcmVxdWVzdCBhIGJsb2NrIG9mIG1lbW9yeSBvZiBhdCBsZWFzdCBhIGNlcnRhaW4KKyAgLy8vIHNpemUsIGl0IHBhc3NlcyB0aGF0IHZhbHVlIGFzIEFjdHVhbFNpemUsIGFuZCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgYmxvY2sKKyAgLy8vIHdpdGggYXQgbGVhc3QgdGhhdCBtdWNoIHNwYWNlLiAgSWYgdGhlIEpJVCBkb2Vzbid0IGtub3cgYWhlYWQgb2YgdGltZSBob3cKKyAgLy8vIG11Y2ggc3BhY2UgaXQgd2lsbCBuZWVkIHRvIGVtaXQgdGhlIGZ1bmN0aW9uLCBpdCBwYXNzZXMgMCBmb3IgdGhlCisgIC8vLyBBY3R1YWxTaXplLiAgSW4gZWl0aGVyIGNhc2UsIHRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIHRvIHBhc3MgYmFjayB0aGUgc2l6ZQorICAvLy8gb2YgdGhlIGFsbG9jYXRlZCBibG9jayB0aHJvdWdoIEFjdHVhbFNpemUuICBUaGUgSklUIHdpbGwgYmUgY2FyZWZ1bCB0bworICAvLy8gbm90IHdyaXRlIG1vcmUgdGhhbiB0aGUgcmV0dXJuZWQgQWN0dWFsU2l6ZSBieXRlcyBvZiBtZW1vcnkuCisgIHZpcnR1YWwgdWludDhfdCAqc3RhcnRGdW5jdGlvbkJvZHkoY29uc3QgRnVuY3Rpb24gKkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90ICZBY3R1YWxTaXplKSA9IDA7CisKKyAgLy8vIGFsbG9jYXRlU3R1YiAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgSklUIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBhCisgIC8vLyBmdW5jdGlvbiBzdHViICh1c2VkIHRvIGhhbmRsZSBsaW1pdGVkIGJyYW5jaCBkaXNwbGFjZW1lbnRzKSB3aGlsZSBpdCBpcworICAvLy8gSklUIGNvbXBpbGluZyBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGlmIGZvbyBjYWxscyBiYXIsIGFuZCBpZiBiYXIKKyAgLy8vIGVpdGhlciBuZWVkcyB0byBiZSBsYXppbHkgY29tcGlsZWQgb3IgaXMgYSBuYXRpdmUgZnVuY3Rpb24gdGhhdCBleGlzdHMgdG9vCisgIC8vLyBmYXIgYXdheSBmcm9tIHRoZSBjYWxsIHNpdGUgdG8gd29yaywgdGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIG1ha2UgYQorICAvLy8gdGh1bmsgZm9yIGl0LiAgVGhlIHN0dWIgc2hvdWxkIGJlICJjbG9zZSIgdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24gYm9keSwKKyAgLy8vIGJ1dCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSAnYWN0dWFsc2l6ZScgcmV0dXJuZWQgYnkKKyAgLy8vIHN0YXJ0RnVuY3Rpb25Cb2R5LgorICB2aXJ0dWFsIHVpbnQ4X3QgKmFsbG9jYXRlU3R1Yihjb25zdCBHbG9iYWxWYWx1ZSogRiwgdW5zaWduZWQgU3R1YlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCkgPSAwOworICAKKyAgLy8vIGVuZEZ1bmN0aW9uQm9keSAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBKSVQgaXMgZG9uZSBjb2RlZ2VuJ2luZworICAvLy8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbi4gIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgSklUCisgIC8vLyBjb21waWxlZCBmdW5jdGlvbi4gIFRoaXMgcGFzc2VzIGluIEZ1bmN0aW9uU3RhcnQgKHdoaWNoIHdhcyByZXR1cm5lZCBieQorICAvLy8gdGhlIHN0YXJ0RnVuY3Rpb25Cb2R5IG1ldGhvZCkgYW5kIEZ1bmN0aW9uRW5kIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgCisgIC8vLyBhY3R1YWwgZW5kIG9mIHRoZSBmdW5jdGlvbi4gIFRoaXMgbWV0aG9kIHNob3VsZCBtYXJrIHRoZSBzcGFjZSBhbGxvY2F0ZWQKKyAgLy8vIGFuZCByZW1lbWJlciB3aGVyZSBpdCBpcyBpbiBjYXNlIHRoZSBjbGllbnQgd2FudHMgdG8gZGVhbGxvY2F0ZSBpdC4KKyAgdmlydHVhbCB2b2lkIGVuZEZ1bmN0aW9uQm9keShjb25zdCBGdW5jdGlvbiAqRiwgdWludDhfdCAqRnVuY3Rpb25TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpGdW5jdGlvbkVuZCkgPSAwOworCisgIC8vLyBhbGxvY2F0ZVNwYWNlIC0gQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgb2YgdGhlIGdpdmVuIHNpemUuICBUaGlzIG1ldGhvZAorICAvLy8gY2Fubm90IGJlIGNhbGxlZCBiZXR3ZWVuIGNhbGxzIHRvIHN0YXJ0RnVuY3Rpb25Cb2R5IGFuZCBlbmRGdW5jdGlvbkJvZHkuCisgIHZpcnR1YWwgdWludDhfdCAqYWxsb2NhdGVTcGFjZShpbnRwdHJfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQpID0gMDsKKworICAvLy8gYWxsb2NhdGVHbG9iYWwgLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgZ2xvYmFsLgorICAvLy8KKyAgdmlydHVhbCB1aW50OF90ICphbGxvY2F0ZUdsb2JhbCh1aW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50KSA9IDA7CisKKyAgLy8vIGRlYWxsb2NhdGVGdW5jdGlvbkJvZHkgLSBGcmVlIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gYm9keS4gIFRoZSBhcmd1bWVudAorICAvLy8gbXVzdCBiZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsIHRvIHN0YXJ0RnVuY3Rpb25Cb2R5KCkgdGhhdCBoYXNuJ3QKKyAgLy8vIGJlZW4gZGVhbGxvY2F0ZWQgeWV0LiAgVGhpcyBpcyBuZXZlciBjYWxsZWQgd2hlbiB0aGUgSklUIGlzIGN1cnJlbnRseQorICAvLy8gZW1pdHRpbmcgYSBmdW5jdGlvbi4KKyAgdmlydHVhbCB2b2lkIGRlYWxsb2NhdGVGdW5jdGlvbkJvZHkodm9pZCAqQm9keSkgPSAwOworICAKKyAgLy8vIHN0YXJ0RXhjZXB0aW9uVGFibGUgLSBXaGVuIHdlIGZpbmlzaGVkIEpJVGluZyB0aGUgZnVuY3Rpb24sIGlmIGV4Y2VwdGlvbgorICAvLy8gaGFuZGxpbmcgaXMgc2V0LCB3ZSBlbWl0IHRoZSBleGNlcHRpb24gdGFibGUuCisgIHZpcnR1YWwgdWludDhfdCogc3RhcnRFeGNlcHRpb25UYWJsZShjb25zdCBGdW5jdGlvbiogRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAmQWN0dWFsU2l6ZSkgPSAwOworICAKKyAgLy8vIGVuZEV4Y2VwdGlvblRhYmxlIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIEpJVCBpcyBkb25lIGVtaXR0aW5nCisgIC8vLyB0aGUgZXhjZXB0aW9uIHRhYmxlLgorICB2aXJ0dWFsIHZvaWQgZW5kRXhjZXB0aW9uVGFibGUoY29uc3QgRnVuY3Rpb24gKkYsIHVpbnQ4X3QgKlRhYmxlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpUYWJsZUVuZCwgdWludDhfdCogRnJhbWVSZWdpc3RlcikgPSAwOworCisgIC8vLyBkZWFsbG9jYXRlRXhjZXB0aW9uVGFibGUgLSBGcmVlIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIHRhYmxlJ3MgbWVtb3J5LgorICAvLy8gVGhlIGFyZ3VtZW50IG11c3QgYmUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbCB0byBzdGFydEV4Y2VwdGlvblRhYmxlKCkKKyAgLy8vIHRoYXQgaGFzbid0IGJlZW4gZGVhbGxvY2F0ZWQgeWV0LiAgVGhpcyBpcyBuZXZlciBjYWxsZWQgd2hlbiB0aGUgSklUIGlzCisgIC8vLyBjdXJyZW50bHkgZW1pdHRpbmcgYW4gZXhjZXB0aW9uIHRhYmxlLgorICB2aXJ0dWFsIHZvaWQgZGVhbGxvY2F0ZUV4Y2VwdGlvblRhYmxlKHZvaWQgKkVUKSA9IDA7CisKKyAgLy8vIENoZWNrSW52YXJpYW50cyAtIEZvciB0ZXN0aW5nIG9ubHkuICBSZXR1cm4gdHJ1ZSBpZiBhbGwgaW50ZXJuYWwKKyAgLy8vIGludmFyaWFudHMgYXJlIHByZXNlcnZlZCwgb3IgcmV0dXJuIGZhbHNlIGFuZCBzZXQgRXJyb3JTdHIgdG8gYSBoZWxwZnVsCisgIC8vLyBlcnJvciBtZXNzYWdlLgorICB2aXJ0dWFsIGJvb2wgQ2hlY2tJbnZhcmlhbnRzKHN0ZDo6c3RyaW5nICYpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBHZXREZWZhdWx0Q29kZVNsYWJTaXplIC0gRm9yIHRlc3Rpbmcgb25seS4gIFJldHVybnMgRGVmYXVsdENvZGVTbGFiU2l6ZQorICAvLy8gZnJvbSBEZWZhdWx0SklUTWVtb3J5TWFuYWdlci4KKyAgdmlydHVhbCBzaXplX3QgR2V0RGVmYXVsdENvZGVTbGFiU2l6ZSgpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBHZXREZWZhdWx0RGF0YVNsYWJTaXplIC0gRm9yIHRlc3Rpbmcgb25seS4gIFJldHVybnMgRGVmYXVsdENvZGVTbGFiU2l6ZQorICAvLy8gZnJvbSBEZWZhdWx0SklUTWVtb3J5TWFuYWdlci4KKyAgdmlydHVhbCBzaXplX3QgR2V0RGVmYXVsdERhdGFTbGFiU2l6ZSgpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBHZXREZWZhdWx0U3R1YlNsYWJTaXplIC0gRm9yIHRlc3Rpbmcgb25seS4gIFJldHVybnMgRGVmYXVsdENvZGVTbGFiU2l6ZQorICAvLy8gZnJvbSBEZWZhdWx0SklUTWVtb3J5TWFuYWdlci4KKyAgdmlydHVhbCBzaXplX3QgR2V0RGVmYXVsdFN0dWJTbGFiU2l6ZSgpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBHZXROdW1Db2RlU2xhYnMgLSBGb3IgdGVzdGluZyBvbmx5LiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIE1lbW9yeUJsb2NrcworICAvLy8gYWxsb2NhdGVkIGZvciBjb2RlLgorICB2aXJ0dWFsIHVuc2lnbmVkIEdldE51bUNvZGVTbGFicygpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBHZXROdW1EYXRhU2xhYnMgLSBGb3IgdGVzdGluZyBvbmx5LiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIE1lbW9yeUJsb2NrcworICAvLy8gYWxsb2NhdGVkIGZvciBkYXRhLgorICB2aXJ0dWFsIHVuc2lnbmVkIEdldE51bURhdGFTbGFicygpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBHZXROdW1TdHViU2xhYnMgLSBGb3IgdGVzdGluZyBvbmx5LiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIE1lbW9yeUJsb2NrcworICAvLy8gYWxsb2NhdGVkIGZvciBmdW5jdGlvbiBzdHVicy4KKyAgdmlydHVhbCB1bnNpZ25lZCBHZXROdW1TdHViU2xhYnMoKSB7CisgICAgcmV0dXJuIDA7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9GdW5jdGlvbi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0Z1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0ZDE2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9GdW5jdGlvbi5oCkBAIC0wLDAgKzEsNDI1IEBACisvLz09PS0tIGxsdm0vRnVuY3Rpb24uaCAtIENsYXNzIHRvIHJlcHJlc2VudCBhIHNpbmdsZSBmdW5jdGlvbiAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIEZ1bmN0aW9uIGNsYXNzLCB3aGljaCByZXByZXNlbnRzIGEKKy8vIHNpbmdsZSBmdW5jdGlvbi9wcm9jZWR1cmUgaW4gTExWTS4KKy8vCisvLyBBIGZ1bmN0aW9uIGJhc2ljYWxseSBjb25zaXN0cyBvZiBhIGxpc3Qgb2YgYmFzaWMgYmxvY2tzLCBhIGxpc3Qgb2YgYXJndW1lbnRzLAorLy8gYW5kIGEgc3ltYm9sIHRhYmxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9GVU5DVElPTl9ICisjZGVmaW5lIExMVk1fRlVOQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0FyZ3VtZW50LmgiCisjaW5jbHVkZSAibGx2bS9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb25UeXBlOworY2xhc3MgTExWTUNvbnRleHQ7CisKKy8vIFRyYWl0cyBmb3IgaW50cnVzaXZlIGxpc3Qgb2YgYmFzaWMgYmxvY2tzLi4uCit0ZW1wbGF0ZTw+IHN0cnVjdCBpbGlzdF90cmFpdHM8QmFzaWNCbG9jaz4KKyAgOiBwdWJsaWMgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEJhc2ljQmxvY2ssIEZ1bmN0aW9uPiB7CisKKyAgLy8gY3JlYXRlU2VudGluZWwgaXMgdXNlZCB0byBnZXQgaG9sZCBvZiB0aGUgbm9kZSB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgdGhlCisgIC8vIGxpc3QuLi4gKHNhbWUgdHJpY2sgdXNlZCBoZXJlIGFzIGluIGlsaXN0X3RyYWl0czxJbnN0cnVjdGlvbj4pCisgIEJhc2ljQmxvY2sgKmNyZWF0ZVNlbnRpbmVsKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxCYXNpY0Jsb2NrKj4oJlNlbnRpbmVsKTsKKyAgfQorICBzdGF0aWMgdm9pZCBkZXN0cm95U2VudGluZWwoQmFzaWNCbG9jayopIHt9CisKKyAgQmFzaWNCbG9jayAqcHJvdmlkZUluaXRpYWxIZWFkKCkgY29uc3QgeyByZXR1cm4gY3JlYXRlU2VudGluZWwoKTsgfQorICBCYXNpY0Jsb2NrICplbnN1cmVIZWFkKEJhc2ljQmxvY2sqKSBjb25zdCB7IHJldHVybiBjcmVhdGVTZW50aW5lbCgpOyB9CisgIHN0YXRpYyB2b2lkIG5vdGVIZWFkKEJhc2ljQmxvY2sqLCBCYXNpY0Jsb2NrKikge30KKworICBzdGF0aWMgVmFsdWVTeW1ib2xUYWJsZSAqZ2V0U3ltVGFiKEZ1bmN0aW9uICpJdGVtUGFyZW50KTsKK3ByaXZhdGU6CisgIG11dGFibGUgaWxpc3RfaGFsZl9ub2RlPEJhc2ljQmxvY2s+IFNlbnRpbmVsOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgaWxpc3RfdHJhaXRzPEFyZ3VtZW50PgorICA6IHB1YmxpYyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8QXJndW1lbnQsIEZ1bmN0aW9uPiB7CisKKyAgQXJndW1lbnQgKmNyZWF0ZVNlbnRpbmVsKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxBcmd1bWVudCo+KCZTZW50aW5lbCk7CisgIH0KKyAgc3RhdGljIHZvaWQgZGVzdHJveVNlbnRpbmVsKEFyZ3VtZW50Kikge30KKworICBBcmd1bWVudCAqcHJvdmlkZUluaXRpYWxIZWFkKCkgY29uc3QgeyByZXR1cm4gY3JlYXRlU2VudGluZWwoKTsgfQorICBBcmd1bWVudCAqZW5zdXJlSGVhZChBcmd1bWVudCopIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7IH0KKyAgc3RhdGljIHZvaWQgbm90ZUhlYWQoQXJndW1lbnQqLCBBcmd1bWVudCopIHt9CisKKyAgc3RhdGljIFZhbHVlU3ltYm9sVGFibGUgKmdldFN5bVRhYihGdW5jdGlvbiAqSXRlbVBhcmVudCk7Citwcml2YXRlOgorICBtdXRhYmxlIGlsaXN0X2hhbGZfbm9kZTxBcmd1bWVudD4gU2VudGluZWw7Cit9OworCitjbGFzcyBGdW5jdGlvbiA6IHB1YmxpYyBHbG9iYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgcHVibGljIGlsaXN0X25vZGU8RnVuY3Rpb24+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBpcGxpc3Q8QXJndW1lbnQ+IEFyZ3VtZW50TGlzdFR5cGU7CisgIHR5cGVkZWYgaXBsaXN0PEJhc2ljQmxvY2s+IEJhc2ljQmxvY2tMaXN0VHlwZTsKKworICAvLyBCYXNpY0Jsb2NrIGl0ZXJhdG9ycy4uLgorICB0eXBlZGVmIEJhc2ljQmxvY2tMaXN0VHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgQmFzaWNCbG9ja0xpc3RUeXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICB0eXBlZGVmIEFyZ3VtZW50TGlzdFR5cGU6Oml0ZXJhdG9yIGFyZ19pdGVyYXRvcjsKKyAgdHlwZWRlZiBBcmd1bWVudExpc3RUeXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9hcmdfaXRlcmF0b3I7CisKK3ByaXZhdGU6CisgIC8vIEltcG9ydGFudCB0aGluZ3MgdGhhdCBtYWtlIHVwIGEgZnVuY3Rpb24hCisgIEJhc2ljQmxvY2tMaXN0VHlwZSAgQmFzaWNCbG9ja3M7ICAgICAgICAvLy88IFRoZSBiYXNpYyBibG9ja3MKKyAgbXV0YWJsZSBBcmd1bWVudExpc3RUeXBlIEFyZ3VtZW50TGlzdDsgIC8vLzwgVGhlIGZvcm1hbCBhcmd1bWVudHMKKyAgVmFsdWVTeW1ib2xUYWJsZSAqU3ltVGFiOyAgICAgICAgICAgICAgIC8vLzwgU3ltYm9sIHRhYmxlIG9mIGFyZ3MvaW5zdHJ1Y3Rpb25zCisgIEF0dHJMaXN0UHRyIEF0dHJpYnV0ZUxpc3Q7ICAgICAgICAgICAgICAvLy88IFBhcmFtZXRlciBhdHRyaWJ1dGVzCisKKyAgLy8gSGFzTGF6eUFyZ3VtZW50cyBpcyBzdG9yZWQgaW4gVmFsdWU6OlN1YmNsYXNzRGF0YS4KKyAgLypib29sIEhhc0xhenlBcmd1bWVudHM7Ki8KKyAgICAgICAgICAgICAgICAgICAKKyAgLy8gVGhlIENhbGxpbmcgQ29udmVudGlvbiBpcyBzdG9yZWQgaW4gVmFsdWU6OlN1YmNsYXNzRGF0YS4KKyAgLypDYWxsaW5nQ29udjo6SUQgQ2FsbGluZ0NvbnZlbnRpb247Ki8KKworICB1bnNpZ25lZCBpbnRyaW5zaWNJRDsgICAgICAgICAgICAgICAgICAgLy8vPCBJRCBvZiBpbnRyaW5zaWMsIDAgb3RoZXJ3aXNlCisKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxGdW5jdGlvbiwgTW9kdWxlPjsKKworICB2b2lkIHNldFBhcmVudChNb2R1bGUgKnBhcmVudCk7CisKKyAgLy8vIGhhc0xhenlBcmd1bWVudHMvQ2hlY2tMYXp5QXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50IGxpc3Qgb2YgYSBmdW5jdGlvbiBpcworICAvLy8gYnVpbHQgb24gZGVtYW5kLCBzbyB0aGF0IHRoZSBsaXN0IGlzbid0IGFsbG9jYXRlZCB1bnRpbCB0aGUgZmlyc3QgY2xpZW50CisgIC8vLyBuZWVkcyBpdC4gIFRoZSBoYXNMYXp5QXJndW1lbnRzIHByZWRpY2F0ZSByZXR1cm5zIHRydWUgaWYgdGhlIGFyZyBsaXN0CisgIC8vLyBoYXNuJ3QgYmVlbiBzZXQgdXAgeWV0LgorICBib29sIGhhc0xhenlBcmd1bWVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICYgMTsKKyAgfQorICB2b2lkIENoZWNrTGF6eUFyZ3VtZW50cygpIGNvbnN0IHsKKyAgICBpZiAoaGFzTGF6eUFyZ3VtZW50cygpKQorICAgICAgQnVpbGRMYXp5QXJndW1lbnRzKCk7CisgIH0KKyAgdm9pZCBCdWlsZExhenlBcmd1bWVudHMoKSBjb25zdDsKKworICB1bnNpZ25lZCBpbml0SW50cmluc2ljSUQoKSBjb25zdDsKKyAgCisgIEZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRnVuY3Rpb24mKTsgLy8gRE8gTk9UIElNUExFTUVOVAorCisgIC8vLyBGdW5jdGlvbiBjdG9yIC0gSWYgdGhlIChvcHRpb25hbCkgTW9kdWxlIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgdGhlCisgIC8vLyBmdW5jdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGludG8gdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gbGlzdCBmb3IKKyAgLy8vIHRoZSBtb2R1bGUuCisgIC8vLworICBGdW5jdGlvbihjb25zdCBGdW5jdGlvblR5cGUgKlR5LCBMaW5rYWdlVHlwZXMgTGlua2FnZSwKKyAgICAgICAgICAgY29uc3QgVHdpbmUgJk4gPSAiIiwgTW9kdWxlICpNID0gMCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uICpDcmVhdGUoY29uc3QgRnVuY3Rpb25UeXBlICpUeSwgTGlua2FnZVR5cGVzIExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOID0gIiIsIE1vZHVsZSAqTSA9IDApIHsKKyAgICByZXR1cm4gbmV3KDApIEZ1bmN0aW9uKFR5LCBMaW5rYWdlLCBOLCBNKTsKKyAgfQorCisgIH5GdW5jdGlvbigpOworCisgIGNvbnN0IFR5cGUgKmdldFJldHVyblR5cGUoKSBjb25zdDsgICAgICAgICAgIC8vIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmV0IHZhbAorICBjb25zdCBGdW5jdGlvblR5cGUgKmdldEZ1bmN0aW9uVHlwZSgpIGNvbnN0OyAvLyBSZXR1cm4gdGhlIEZ1bmN0aW9uVHlwZSBmb3IgbWUKKworICAvLy8gZ2V0Q29udGV4dCAtIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIExMVk1Db250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIAorICAvLy8gZnVuY3Rpb24sIG9yIE5VTEwgaWYgdGhpcyBmdW5jdGlvbiBpcyBub3QgYm91bmQgdG8gYSBjb250ZXh0IHlldC4KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdDsKKworICAvLy8gaXNWYXJBcmcgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mCisgIC8vLyBhcmd1bWVudHMuCisgIGJvb2wgaXNWYXJBcmcoKSBjb25zdDsKKworICAvLy8gaXNEZWNsYXJhdGlvbiAtIElzIHRoZSBib2R5IG9mIHRoaXMgZnVuY3Rpb24gdW5rbm93bj8gKFRoZSBiYXNpYyBibG9jayAKKyAgLy8vIGxpc3QgaXMgZW1wdHkgaWYgc28uKSBUaGlzIGlzIHRydWUgZm9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgYnV0IG5vdCAKKyAgLy8vIHRydWUgZm9yIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorICAvLy8KKyAgdmlydHVhbCBib29sIGlzRGVjbGFyYXRpb24oKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lbXB0eSgpOyB9CisKKyAgLy8vIGdldEludHJpbnNpY0lEIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgbnVtYmVyIG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGZ1bmN0aW9uLCBvciBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWMgaWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBhbgorICAvLy8gaW5zdHJpbnNpYywgb3IgaWYgdGhlIHBvaW50ZXIgaXMgbnVsbC4gIFRoaXMgdmFsdWUgaXMgYWx3YXlzIGRlZmluZWQgdG8gYmUKKyAgLy8vIHplcm8gdG8gYWxsb3cgZWFzeSBjaGVja2luZyBmb3Igd2hldGhlciBhIGZ1bmN0aW9uIGlzIGludHJpbnNpYyBvciBub3QuCisgIC8vLyBUaGUgcGFydGljdWxhciBpbnRyaW5zaWMgZnVuY3Rpb25zIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhpcyB2YWx1ZSBhcmUKKyAgLy8vIGRlZmluZWQgaW4gbGx2bS9JbnRyaW5zaWNzLmguCisgIC8vLworICB1bnNpZ25lZCBnZXRJbnRyaW5zaWNJRCgpIGNvbnN0IHsgcmV0dXJuIGludHJpbnNpY0lEOyB9CisgIGJvb2wgaXNJbnRyaW5zaWMoKSBjb25zdCB7IHJldHVybiBpbnRyaW5zaWNJRCAhPSAwOyB9CisKKyAgLy8vIGdldENhbGxpbmdDb252KCkvc2V0Q2FsbGluZ0NvbnYoQ0MpIC0gVGhlc2UgbWV0aG9kIGdldCBhbmQgc2V0IHRoZQorICAvLy8gY2FsbGluZyBjb252ZW50aW9uIG9mIHRoaXMgZnVuY3Rpb24uICBUaGUgZW51bSB2YWx1ZXMgZm9yIHRoZSBrbm93bgorICAvLy8gY2FsbGluZyBjb252ZW50aW9ucyBhcmUgZGVmaW5lZCBpbiBDYWxsaW5nQ29udi5oLgorICBDYWxsaW5nQ29udjo6SUQgZ2V0Q2FsbGluZ0NvbnYoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENhbGxpbmdDb252OjpJRD4oZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgPj4gMSk7CisgIH0KKyAgdm9pZCBzZXRDYWxsaW5nQ29udihDYWxsaW5nQ29udjo6SUQgQ0MpIHsKKyAgICBzZXRWYWx1ZVN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiAxKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVuc2lnbmVkPihDQykgPDwgMSkpOworICB9CisgIAorICAvLy8gZ2V0QXR0cmlidXRlcyAtIFJldHVybiB0aGUgYXR0cmlidXRlIGxpc3QgZm9yIHRoaXMgRnVuY3Rpb24uCisgIC8vLworICBjb25zdCBBdHRyTGlzdFB0ciAmZ2V0QXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q7IH0KKworICAvLy8gc2V0QXR0cmlidXRlcyAtIFNldCB0aGUgYXR0cmlidXRlIGxpc3QgZm9yIHRoaXMgRnVuY3Rpb24uCisgIC8vLworICB2b2lkIHNldEF0dHJpYnV0ZXMoY29uc3QgQXR0ckxpc3RQdHIgJmF0dHJzKSB7IEF0dHJpYnV0ZUxpc3QgPSBhdHRyczsgfQorCisgIC8vLyBoYXNGbkF0dHIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGhhcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLgorICBib29sIGhhc0ZuQXR0cihBdHRyaWJ1dGVzIE4pIGNvbnN0IHsKKyAgICAvLyBGdW5jdGlvbiBBdHRyaWJ1dGVzIGFyZSBzdG9yZWQgYXQgfjAgaW5kZXggCisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3QucGFyYW1IYXNBdHRyKH4wVSwgTik7CisgIH0KKworICAvLy8gYWRkRm5BdHRyIC0gQWRkIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgdG8gdGhpcyBmdW5jdGlvbi4KKyAgLy8vCisgIHZvaWQgYWRkRm5BdHRyKEF0dHJpYnV0ZXMgTikgeyAKKyAgICAvLyBGdW5jdGlvbiBBdHRyaWJ1dGVzIGFyZSBzdG9yZWQgYXQgfjAgaW5kZXggCisgICAgYWRkQXR0cmlidXRlKH4wVSwgTik7CisgIH0KKworICAvLy8gcmVtb3ZlRm5BdHRyIC0gUmVtb3ZlIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICAvLy8KKyAgdm9pZCByZW1vdmVGbkF0dHIoQXR0cmlidXRlcyBOKSB7CisgICAgLy8gRnVuY3Rpb24gQXR0cmlidXRlcyBhcmUgc3RvcmVkIGF0IH4wIGluZGV4IAorICAgIHJlbW92ZUF0dHJpYnV0ZSh+MFUsIE4pOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZnVuY3Rpb24gaGFzIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCisgIGJvb2wgcGFyYW1IYXNBdHRyKHVuc2lnbmVkIGksIEF0dHJpYnV0ZXMgYXR0cikgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0LnBhcmFtSGFzQXR0cihpLCBhdHRyKTsKKyAgfQorCisgIC8vLyBhZGRBdHRyaWJ1dGUgLSBhZGRzIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCBhZGRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlcyBhdHRyKTsKKyAgCisgIC8vLyByZW1vdmVBdHRyaWJ1dGUgLSByZW1vdmVzIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIHJlbW92ZUF0dHJpYnV0ZSh1bnNpZ25lZCBpLCBBdHRyaWJ1dGVzIGF0dHIpOworCisgIC8vLyBAYnJpZWYgRXh0cmFjdCB0aGUgYWxpZ25tZW50IGZvciBhIGNhbGwgb3IgcGFyYW1ldGVyICgwPXVua25vd24pLgorICB1bnNpZ25lZCBnZXRQYXJhbUFsaWdubWVudCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3QuZ2V0UGFyYW1BbGlnbm1lbnQoaSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXNzIG1lbW9yeS4KKyAgYm9vbCBkb2VzTm90QWNjZXNzTWVtb3J5KCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpSZWFkTm9uZSk7CisgIH0KKyAgdm9pZCBzZXREb2VzTm90QWNjZXNzTWVtb3J5KGJvb2wgRG9lc05vdEFjY2Vzc01lbW9yeSA9IHRydWUpIHsKKyAgICBpZiAoRG9lc05vdEFjY2Vzc01lbW9yeSkgYWRkRm5BdHRyKEF0dHJpYnV0ZTo6UmVhZE5vbmUpOworICAgIGVsc2UgcmVtb3ZlRm5BdHRyKEF0dHJpYnV0ZTo6UmVhZE5vbmUpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VzcyBvciBvbmx5IHJlYWRzIG1lbW9yeS4KKyAgYm9vbCBvbmx5UmVhZHNNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIGRvZXNOb3RBY2Nlc3NNZW1vcnkoKSB8fCBoYXNGbkF0dHIoQXR0cmlidXRlOjpSZWFkT25seSk7CisgIH0KKyAgdm9pZCBzZXRPbmx5UmVhZHNNZW1vcnkoYm9vbCBPbmx5UmVhZHNNZW1vcnkgPSB0cnVlKSB7CisgICAgaWYgKE9ubHlSZWFkc01lbW9yeSkgYWRkRm5BdHRyKEF0dHJpYnV0ZTo6UmVhZE9ubHkpOworICAgIGVsc2UgcmVtb3ZlRm5BdHRyKEF0dHJpYnV0ZTo6UmVhZE9ubHkgfCBBdHRyaWJ1dGU6OlJlYWROb25lKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuLgorICBib29sIGRvZXNOb3RSZXR1cm4oKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5vUmV0dXJuKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RSZXR1cm4oYm9vbCBEb2VzTm90UmV0dXJuID0gdHJ1ZSkgeworICAgIGlmIChEb2VzTm90UmV0dXJuKSBhZGRGbkF0dHIoQXR0cmlidXRlOjpOb1JldHVybik7CisgICAgZWxzZSByZW1vdmVGbkF0dHIoQXR0cmlidXRlOjpOb1JldHVybik7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHN0cnVjdHVyZSB0aHJvdWdoIGZpcnN0IAorICAvLy8gcG9pbnRlciBhcmd1bWVudC4KKyAgYm9vbCBoYXNTdHJ1Y3RSZXRBdHRyKCkgY29uc3QgeworICAgIHJldHVybiBwYXJhbUhhc0F0dHIoMSwgQXR0cmlidXRlOjpTdHJ1Y3RSZXQpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBhbGlhcyBvdGhlciBwYXJhbWV0ZXJzLgorICAvLy8gQHBhcmFtIG4gVGhlIHBhcmFtZXRlciB0byBjaGVjay4gMSBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCAwIGlzIHRoZSByZXR1cm4KKyAgYm9vbCBkb2VzTm90QWxpYXModW5zaWduZWQgbikgY29uc3QgeworICAgIHJldHVybiBwYXJhbUhhc0F0dHIobiwgQXR0cmlidXRlOjpOb0FsaWFzKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RBbGlhcyh1bnNpZ25lZCBuLCBib29sIERvZXNOb3RBbGlhcyA9IHRydWUpIHsKKyAgICBpZiAoRG9lc05vdEFsaWFzKSBhZGRBdHRyaWJ1dGUobiwgQXR0cmlidXRlOjpOb0FsaWFzKTsKKyAgICBlbHNlIHJlbW92ZUF0dHJpYnV0ZShuLCBBdHRyaWJ1dGU6Ok5vQWxpYXMpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHBhcmFtZXRlciBjYW4gYmUgY2FwdHVyZWQuCisgIC8vLyBAcGFyYW0gbiBUaGUgcGFyYW1ldGVyIHRvIGNoZWNrLiAxIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIDAgaXMgdGhlIHJldHVybgorICBib29sIGRvZXNOb3RDYXB0dXJlKHVuc2lnbmVkIG4pIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1IYXNBdHRyKG4sIEF0dHJpYnV0ZTo6Tm9DYXB0dXJlKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RDYXB0dXJlKHVuc2lnbmVkIG4sIGJvb2wgRG9lc05vdENhcHR1cmUgPSB0cnVlKSB7CisgICAgaWYgKERvZXNOb3RDYXB0dXJlKSBhZGRBdHRyaWJ1dGUobiwgQXR0cmlidXRlOjpOb0NhcHR1cmUpOworICAgIGVsc2UgcmVtb3ZlQXR0cmlidXRlKG4sIEF0dHJpYnV0ZTo6Tm9DYXB0dXJlKTsKKyAgfQorCisgIC8vLyBjb3B5QXR0cmlidXRlc0Zyb20gLSBjb3B5IGFsbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKHRob3NlIG5vdCBuZWVkZWQgdG8KKyAgLy8vIGNyZWF0ZSBhIEZ1bmN0aW9uKSBmcm9tIHRoZSBGdW5jdGlvbiBTcmMgdG8gdGhpcyBvbmUuCisgIHZvaWQgY29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEdsb2JhbFZhbHVlICpTcmMpOworCisgIC8vLyBkZWxldGVCb2R5IC0gVGhpcyBtZXRob2QgZGVsZXRlcyB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIGFuZCBjb252ZXJ0cworICAvLy8gdGhlIGxpbmthZ2UgdG8gZXh0ZXJuYWwuCisgIC8vLworICB2b2lkIGRlbGV0ZUJvZHkoKSB7CisgICAgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKyAgICBzZXRMaW5rYWdlKEV4dGVybmFsTGlua2FnZSk7CisgIH0KKworICAvLy8gcmVtb3ZlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlLAorICAvLy8gYnV0IGRvZXMgbm90IGRlbGV0ZSBpdC4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgLy8vIGVyYXNlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlCisgIC8vLyBhbmQgZGVsZXRlcyBpdC4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBlcmFzZUZyb21QYXJlbnQoKTsKKworCisgIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgZWxlbWVudHMgb2YgdGhlIEZ1bmN0aW9uLi4uIHRoZSBiYXNpYyBibG9jayBsaXN0IGlzCisgIC8vLyBlbXB0eSBmb3IgZXh0ZXJuYWwgZnVuY3Rpb25zLgorICAvLy8KKyAgY29uc3QgQXJndW1lbnRMaXN0VHlwZSAmZ2V0QXJndW1lbnRMaXN0KCkgY29uc3QgeworICAgIENoZWNrTGF6eUFyZ3VtZW50cygpOworICAgIHJldHVybiBBcmd1bWVudExpc3Q7CisgIH0KKyAgQXJndW1lbnRMaXN0VHlwZSAmZ2V0QXJndW1lbnRMaXN0KCkgeworICAgIENoZWNrTGF6eUFyZ3VtZW50cygpOworICAgIHJldHVybiBBcmd1bWVudExpc3Q7CisgIH0KKyAgc3RhdGljIGlwbGlzdDxBcmd1bWVudD4gRnVuY3Rpb246OipnZXRTdWJsaXN0QWNjZXNzKEFyZ3VtZW50KikgeworICAgIHJldHVybiAmRnVuY3Rpb246OkFyZ3VtZW50TGlzdDsKKyAgfQorCisgIGNvbnN0IEJhc2ljQmxvY2tMaXN0VHlwZSAmZ2V0QmFzaWNCbG9ja0xpc3QoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2NrczsgfQorICAgICAgICBCYXNpY0Jsb2NrTGlzdFR5cGUgJmdldEJhc2ljQmxvY2tMaXN0KCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3M7IH0KKyAgc3RhdGljIGlwbGlzdDxCYXNpY0Jsb2NrPiBGdW5jdGlvbjo6KmdldFN1Ymxpc3RBY2Nlc3MoQmFzaWNCbG9jayopIHsKKyAgICByZXR1cm4gJkZ1bmN0aW9uOjpCYXNpY0Jsb2NrczsKKyAgfQorCisgIGNvbnN0IEJhc2ljQmxvY2sgICAgICAgJmdldEVudHJ5QmxvY2soKSBjb25zdCAgIHsgcmV0dXJuIGZyb250KCk7IH0KKyAgICAgICAgQmFzaWNCbG9jayAgICAgICAmZ2V0RW50cnlCbG9jaygpICAgICAgICAgeyByZXR1cm4gZnJvbnQoKTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBTeW1ib2wgVGFibGUgQWNjZXNzaW5nIGZ1bmN0aW9ucy4uLgorCisgIC8vLyBnZXRTeW1ib2xUYWJsZSgpIC0gUmV0dXJuIHRoZSBzeW1ib2wgdGFibGUuLi4KKyAgLy8vCisgIGlubGluZSAgICAgICBWYWx1ZVN5bWJvbFRhYmxlICZnZXRWYWx1ZVN5bWJvbFRhYmxlKCkgICAgICAgeyByZXR1cm4gKlN5bVRhYjsgfQorICBpbmxpbmUgY29uc3QgVmFsdWVTeW1ib2xUYWJsZSAmZ2V0VmFsdWVTeW1ib2xUYWJsZSgpIGNvbnN0IHsgcmV0dXJuICpTeW1UYWI7IH0KKworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCYXNpY0Jsb2NrIGl0ZXJhdG9yIGZvcndhcmRpbmcgZnVuY3Rpb25zCisgIC8vCisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgZW5kICAoKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lbmQoKTsgICB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW5kKCk7ICAgfQorCisgIHNpemVfdCAgICAgICAgICAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3Muc2l6ZSgpOyAgfQorICBib29sICAgICAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVtcHR5KCk7IH0KKyAgY29uc3QgQmFzaWNCbG9jayAgICAgICAmZnJvbnQoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5mcm9udCgpOyB9CisgICAgICAgIEJhc2ljQmxvY2sgICAgICAgJmZyb250KCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuZnJvbnQoKTsgfQorICBjb25zdCBCYXNpY0Jsb2NrICAgICAgICAmYmFjaygpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJhY2soKTsgIH0KKyAgICAgICAgQmFzaWNCbG9jayAgICAgICAgJmJhY2soKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iYWNrKCk7ICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFyZ3VtZW50IGl0ZXJhdG9yIGZvcndhcmRpbmcgZnVuY3Rpb25zCisgIC8vCisgIGFyZ19pdGVyYXRvciBhcmdfYmVnaW4oKSB7CisgICAgQ2hlY2tMYXp5QXJndW1lbnRzKCk7CisgICAgcmV0dXJuIEFyZ3VtZW50TGlzdC5iZWdpbigpOworICB9CisgIGNvbnN0X2FyZ19pdGVyYXRvciBhcmdfYmVnaW4oKSBjb25zdCB7CisgICAgQ2hlY2tMYXp5QXJndW1lbnRzKCk7CisgICAgcmV0dXJuIEFyZ3VtZW50TGlzdC5iZWdpbigpOworICB9CisgIGFyZ19pdGVyYXRvciBhcmdfZW5kKCkgeworICAgIENoZWNrTGF6eUFyZ3VtZW50cygpOworICAgIHJldHVybiBBcmd1bWVudExpc3QuZW5kKCk7CisgIH0KKyAgY29uc3RfYXJnX2l0ZXJhdG9yIGFyZ19lbmQoKSBjb25zdCB7CisgICAgQ2hlY2tMYXp5QXJndW1lbnRzKCk7CisgICAgcmV0dXJuIEFyZ3VtZW50TGlzdC5lbmQoKTsKKyAgfQorCisgIHNpemVfdCBhcmdfc2l6ZSgpIGNvbnN0OworICBib29sIGFyZ19lbXB0eSgpIGNvbnN0OworCisgIC8vLyB2aWV3Q0ZHIC0gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgdXNlIGZyb20gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiBqdXN0CisgIC8vLyBzYXkgJ2NhbGwgRi0+dmlld0NGRygpJyBhbmQgYSBnaG9zdHZpZXcgd2luZG93IHNob3VsZCBwb3AgdXAgZnJvbSB0aGUKKyAgLy8vIHByb2dyYW0sIGRpc3BsYXlpbmcgdGhlIENGRyBvZiB0aGUgY3VycmVudCBmdW5jdGlvbiB3aXRoIHRoZSBjb2RlIGZvciBlYWNoCisgIC8vLyBiYXNpYyBibG9jayBpbnNpZGUuICBUaGlzIGRlcGVuZHMgb24gdGhlcmUgYmVpbmcgYSAnZG90JyBhbmQgJ2d2JyBwcm9ncmFtCisgIC8vLyBpbiB5b3VyIHBhdGguCisgIC8vLworICB2b2lkIHZpZXdDRkcoKSBjb25zdDsKKworICAvLy8gdmlld0NGR09ubHkgLSBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IGZvciB1c2UgZnJvbSB0aGUgZGVidWdnZXIuICBJdCB3b3JrcworICAvLy8ganVzdCBsaWtlIHZpZXdDRkcsIGJ1dCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBjb250ZW50cyBvZiBiYXNpYyBibG9ja3MKKyAgLy8vIGludG8gdGhlIG5vZGVzLCBqdXN0IHRoZSBsYWJlbC4gIElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBDRkcKKyAgLy8vIHRoaXMgY2FuIG1ha2UgdGhlIGdyYXBoIHNtYWxsZXIuCisgIC8vLworICB2b2lkIHZpZXdDRkdPbmx5KCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEZ1bmN0aW9uICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpGdW5jdGlvblZhbDsKKyAgfQorCisgIC8vLyBkcm9wQWxsUmVmZXJlbmNlcygpIC0gVGhpcyBtZXRob2QgY2F1c2VzIGFsbCB0aGUgc3ViaW5zdHJ1Y3Rpb25zIHRvICJsZXQKKyAgLy8vIGdvIiBvZiBhbGwgcmVmZXJlbmNlcyB0aGF0IHRoZXkgYXJlIG1haW50YWluaW5nLiAgVGhpcyBhbGxvd3Mgb25lIHRvCisgIC8vLyAnZGVsZXRlJyBhIHdob2xlIG1vZHVsZSBhdCBhIHRpbWUsIGV2ZW4gdGhvdWdoIHRoZXJlIG1heSBiZSBjaXJjdWxhcgorICAvLy8gcmVmZXJlbmNlcy4uLiBmaXJzdCBhbGwgcmVmZXJlbmNlcyBhcmUgZHJvcHBlZCwgYW5kIGFsbCB1c2UgY291bnRzIGdvIHRvCisgIC8vLyB6ZXJvLiAgVGhlbiBldmVyeXRoaW5nIGlzIGRlbGV0ZWQgZm9yIHJlYWwuICBOb3RlIHRoYXQgbm8gb3BlcmF0aW9ucyBhcmUKKyAgLy8vIHZhbGlkIG9uIGFuIG9iamVjdCB0aGF0IGhhcyAiZHJvcHBlZCBhbGwgcmVmZXJlbmNlcyIsIGV4Y2VwdCBvcGVyYXRvcgorICAvLy8gZGVsZXRlLgorICAvLy8KKyAgLy8vIFNpbmNlIG5vIG90aGVyIG9iamVjdCBpbiB0aGUgbW9kdWxlIGNhbiBoYXZlIHJlZmVyZW5jZXMgaW50byB0aGUgYm9keSBvZiBhCisgIC8vLyBmdW5jdGlvbiwgZHJvcHBpbmcgYWxsIHJlZmVyZW5jZXMgZGVsZXRlcyB0aGUgZW50aXJlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLAorICAvLy8gaW5jbHVkaW5nIGFueSBjb250YWluZWQgYmFzaWMgYmxvY2tzLgorICAvLy8KKyAgdm9pZCBkcm9wQWxsUmVmZXJlbmNlcygpOworCisgIC8vLyBoYXNBZGRyZXNzVGFrZW4gLSByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSB1c2VzIG9mIHRoaXMgZnVuY3Rpb24KKyAgLy8vIG90aGVyIHRoYW4gZGlyZWN0IGNhbGxzIG9yIGludm9rZXMgdG8gaXQuIE9wdGlvbmFsbHkgcGFzc2VzIGJhY2sgdGhlCisgIC8vLyBvZmZlbmRpbmcgdXNlciBmb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy4KKyAgLy8vCisgIGJvb2wgaGFzQWRkcmVzc1Rha2VuKGNvbnN0IFVzZXIqKiA9IDApIGNvbnN0OworCitwcml2YXRlOgorICAvLyBTaGFkb3cgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcgbWV0aG9kIHNvIHRoYXQKKyAgLy8gc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRWYWx1ZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhKEQpOworICB9Cit9OworCitpbmxpbmUgVmFsdWVTeW1ib2xUYWJsZSAqCitpbGlzdF90cmFpdHM8QmFzaWNCbG9jaz46OmdldFN5bVRhYihGdW5jdGlvbiAqRikgeworICByZXR1cm4gRiA/ICZGLT5nZXRWYWx1ZVN5bWJvbFRhYmxlKCkgOiAwOworfQorCitpbmxpbmUgVmFsdWVTeW1ib2xUYWJsZSAqCitpbGlzdF90cmFpdHM8QXJndW1lbnQ+OjpnZXRTeW1UYWIoRnVuY3Rpb24gKkYpIHsKKyAgcmV0dXJuIEYgPyAmRi0+Z2V0VmFsdWVTeW1ib2xUYWJsZSgpIDogMDsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vR1ZNYXRlcmlhbGl6ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9HVk1hdGVyaWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDM1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vR1ZNYXRlcmlhbGl6ZXIuaApAQCAtMCwwICsxLDY2IEBACisvLz09PS0tIGxsdm0vR1ZNYXRlcmlhbGl6ZXIuaCAtIEludGVyZmFjZSBmb3IgR1YgbWF0ZXJpYWxpemVycyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGxvYWRpbmcgYSBtb2R1bGUgZnJvbSBzb21lCisvLyBwbGFjZS4gIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBpbmNyZW1lbnRhbCBvciByYW5kb20gYWNjZXNzIGxvYWRpbmcgb2YKKy8vIGZ1bmN0aW9ucyBmcm9tIHRoZSBmaWxlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGFwcGxpY2F0aW9ucyBsaWtlIEpJVCBjb21waWxlcnMKKy8vIG9yIGludGVycHJvY2VkdXJhbCBvcHRpbWl6ZXJzIHRoYXQgZG8gbm90IG5lZWQgdGhlIGVudGlyZSBwcm9ncmFtIGluIG1lbW9yeQorLy8gYXQgdGhlIHNhbWUgdGltZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEdWTUFURVJJQUxJWkVSX0gKKyNkZWZpbmUgR1ZNQVRFUklBTElaRVJfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBNb2R1bGU7CisKK2NsYXNzIEdWTWF0ZXJpYWxpemVyIHsKK3Byb3RlY3RlZDoKKyAgR1ZNYXRlcmlhbGl6ZXIoKSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgfkdWTWF0ZXJpYWxpemVyKCk7CisKKyAgLy8vIGlzTWF0ZXJpYWxpemFibGUgLSBUcnVlIGlmIEdWIGNhbiBiZSBtYXRlcmlhbGl6ZWQgZnJvbSB3aGF0ZXZlciBiYWNraW5nCisgIC8vLyBzdG9yZSB0aGlzIEdWTWF0ZXJpYWxpemVyIHVzZXMgYW5kIGhhcyBub3QgYmVlbiBtYXRlcmlhbGl6ZWQgeWV0LgorICB2aXJ0dWFsIGJvb2wgaXNNYXRlcmlhbGl6YWJsZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0ID0gMDsKKworICAvLy8gaXNEZW1hdGVyaWFsaXphYmxlIC0gVHJ1ZSBpZiBHViBoYXMgYmVlbiBtYXRlcmlhbGl6ZWQgYW5kIGNhbiBiZQorICAvLy8gZGVtYXRlcmlhbGl6ZWQgYmFjayB0byB3aGF0ZXZlciBiYWNraW5nIHN0b3JlIHRoaXMgR1ZNYXRlcmlhbGl6ZXIgdXNlcy4KKyAgdmlydHVhbCBib29sIGlzRGVtYXRlcmlhbGl6YWJsZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0ID0gMDsKKworICAvLy8gTWF0ZXJpYWxpemUgLSBtYWtlIHN1cmUgdGhlIGdpdmVuIEdsb2JhbFZhbHVlIGlzIGZ1bGx5IHJlYWQuICBJZiB0aGUKKyAgLy8vIG1vZHVsZSBpcyBjb3JydXB0LCB0aGlzIHJldHVybnMgdHJ1ZSBhbmQgZmlsbHMgaW4gdGhlIG9wdGlvbmFsIHN0cmluZyB3aXRoCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvYmxlbS4gIElmIHN1Y2Nlc3NmdWwsIHRoaXMgcmV0dXJucyBmYWxzZS4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBNYXRlcmlhbGl6ZShHbG9iYWxWYWx1ZSAqR1YsIHN0ZDo6c3RyaW5nICpFcnJJbmZvID0gMCkgPSAwOworCisgIC8vLyBEZW1hdGVyaWFsaXplIC0gSWYgdGhlIGdpdmVuIEdsb2JhbFZhbHVlIGlzIHJlYWQgaW4sIGFuZCBpZiB0aGUKKyAgLy8vIEdWTWF0ZXJpYWxpemVyIHN1cHBvcnRzIGl0LCByZWxlYXNlIHRoZSBtZW1vcnkgZm9yIHRoZSBHViwgYW5kIHNldCBpdCB1cAorICAvLy8gdG8gYmUgbWF0ZXJpYWxpemVkIGxhemlseS4gIElmIHRoZSBNYXRlcmlhbGl6ZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMKKyAgLy8vIGNhcGFiaWxpdHksIHRoaXMgbWV0aG9kIGlzIGEgbm9vcC4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBEZW1hdGVyaWFsaXplKEdsb2JhbFZhbHVlICopIHt9CisKKyAgLy8vIE1hdGVyaWFsaXplTW9kdWxlIC0gbWFrZSBzdXJlIHRoZSBlbnRpcmUgTW9kdWxlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVhZC4KKyAgLy8vIE9uIGVycm9yLCB0aGlzIHJldHVybnMgdHJ1ZSBhbmQgZmlsbHMgaW4gdGhlIG9wdGlvbmFsIHN0cmluZyB3aXRoCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvYmxlbS4gIElmIHN1Y2Nlc3NmdWwsIHRoaXMgcmV0dXJucyBmYWxzZS4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBNYXRlcmlhbGl6ZU1vZHVsZShNb2R1bGUgKk0sIHN0ZDo6c3RyaW5nICpFcnJJbmZvID0gMCkgPSAwOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vR2xvYmFsQWxpYXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9HbG9iYWxBbGlhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjdjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vR2xvYmFsQWxpYXMuaApAQCAtMCwwICsxLDk5IEBACisvLz09PS0tLS0tLS0tIGxsdm0vR2xvYmFsQWxpYXMuaCAtIEdsb2JhbEFsaWFzIGNsYXNzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIEdsb2JhbEFsaWFzIGNsYXNzLCB3aGljaAorLy8gcmVwcmVzZW50cyBhIHNpbmdsZSBmdW5jdGlvbiBvciB2YXJpYWJsZSBhbGlhcyBpbiB0aGUgSVIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0dMT0JBTF9BTElBU19ICisjZGVmaW5lIExMVk1fR0xPQkFMX0FMSUFTX0gKKworI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL09wZXJhbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CitjbGFzcyBDb25zdGFudDsKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlU3ViQ2xhc3MsIHR5cGVuYW1lIEl0ZW1QYXJlbnRDbGFzcz4KKyAgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzOworCitjbGFzcyBHbG9iYWxBbGlhcyA6IHB1YmxpYyBHbG9iYWxWYWx1ZSwgcHVibGljIGlsaXN0X25vZGU8R2xvYmFsQWxpYXM+IHsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxHbG9iYWxBbGlhcywgTW9kdWxlPjsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgR2xvYmFsQWxpYXMgJik7ICAgICAvLyBEbyBub3QgaW1wbGVtZW50CisgIEdsb2JhbEFsaWFzKGNvbnN0IEdsb2JhbEFsaWFzICYpOyAgICAgLy8gRG8gbm90IGltcGxlbWVudAorCisgIHZvaWQgc2V0UGFyZW50KE1vZHVsZSAqcGFyZW50KTsKKworcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSBvbmUgb3BlcmFuZAorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDEpOworICB9CisgIC8vLyBHbG9iYWxBbGlhcyBjdG9yIC0gSWYgYSBwYXJlbnQgbW9kdWxlIGlzIHNwZWNpZmllZCwgdGhlIGFsaWFzIGlzCisgIC8vLyBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGludG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZSdzIGFsaWFzIGxpc3QuCisgIEdsb2JhbEFsaWFzKGNvbnN0IFR5cGUgKlR5LCBMaW5rYWdlVHlwZXMgTGlua2FnZSwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgQ29uc3RhbnQqIEFsaWFzZWUgPSAwLCBNb2R1bGUgKlBhcmVudCA9IDApOworCisgIC8vLyBQcm92aWRlIGZhc3Qgb3BlcmFuZCBhY2Nlc3NvcnMKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIGlzRGVjbGFyYXRpb24gLSBJcyB0aGlzIGdsb2JhbCB2YXJpYWJsZSBsYWNraW5nIGFuIGluaXRpYWxpemVyPyAgSWYgc28sIAorICAvLy8gdGhlIGdsb2JhbCB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIHNvbWUgb3RoZXIgdHJhbnNsYXRpb24gdW5pdCwgYW5kIGlzIHRodXMKKyAgLy8vIG9ubHkgYSBkZWNsYXJhdGlvbiBoZXJlLgorICB2aXJ0dWFsIGJvb2wgaXNEZWNsYXJhdGlvbigpIGNvbnN0OworCisgIC8vLyByZW1vdmVGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUsCisgIC8vLyBidXQgZG9lcyBub3QgZGVsZXRlIGl0LgorICAvLy8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gZXJhc2VGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUKKyAgLy8vIGFuZCBkZWxldGVzIGl0LgorICAvLy8KKyAgdmlydHVhbCB2b2lkIGVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vLyBzZXQvZ2V0QWxpYXNlZSAtIFRoZXNlIG1ldGhvZHMgcmV0cml2ZSBhbmQgc2V0IGFsaWFzIHRhcmdldC4KKyAgdm9pZCBzZXRBbGlhc2VlKENvbnN0YW50KiBHVik7CisgIGNvbnN0IENvbnN0YW50KiBnZXRBbGlhc2VlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8Q29uc3RhbnQ+KGdldE9wZXJhbmQoMCkpOworICB9CisgIENvbnN0YW50KiBnZXRBbGlhc2VlKCkgeworICAgIHJldHVybiBjYXN0X29yX251bGw8Q29uc3RhbnQ+KGdldE9wZXJhbmQoMCkpOworICB9CisgIC8vLyBnZXRBbGlhc2VkR2xvYmFsKCkgLSBBbGlhc2VlIGNhbiBiZSBlaXRoZXIgZ2xvYmFsIG9yIGJpdGNhc3Qgb2YKKyAgLy8vIGdsb2JhbC4gVGhpcyBtZXRob2QgcmV0cml2ZXMgdGhlIGdsb2JhbCBmb3IgYm90aCBhbGlhc2VlIGZsYXZvdXJzLgorICBjb25zdCBHbG9iYWxWYWx1ZSogZ2V0QWxpYXNlZEdsb2JhbCgpIGNvbnN0OworCisgIC8vLyByZXNvbHZlQWxpYXNlZEdsb2JhbCgpIC0gVGhpcyBtZXRob2QgdHJpZXMgdG8gdWx0aW1hdGVseSByZXNvbHZlIHRoZSBhbGlhcworICAvLy8gYnkgZ29pbmcgdGhyb3VnaCB0aGUgYWxpYXNpbmcgY2hhaW4gYW5kIHRyeWluZyB0byBmaW5kIHRoZSB2ZXJ5IGxhc3QKKyAgLy8vIGdsb2JhbC4gUmV0dXJucyBOVUxMIGlmIGEgY3ljbGUgd2FzIGZvdW5kLiBJZiBzdG9wT25XZWFrIGlzIGZhbHNlLCB0aGVuCisgIC8vLyB0aGUgd2hvbGUgY2hhaW4gYWxpYXNpbmcgY2hhaW4gaXMgdHJhdmVyc2VkLCBvdGhlcndpc2UgLSBvbmx5IHN0cm9uZworICAvLy8gYWxpYXNlcy4KKyAgY29uc3QgR2xvYmFsVmFsdWUqIHJlc29sdmVBbGlhc2VkR2xvYmFsKGJvb2wgc3RvcE9uV2VhayA9IHRydWUpIGNvbnN0OworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEdsb2JhbEFsaWFzICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxBbGlhc1ZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEdsb2JhbEFsaWFzPiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8MT4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEdsb2JhbEFsaWFzLCBWYWx1ZSkKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vR2xvYmFsVmFsdWUuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9HbG9iYWxWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YmVlODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vR2xvYmFsVmFsdWUuaApAQCAtMCwwICsxLDI4NCBAQAorLy89PT0tLSBsbHZtL0dsb2JhbFZhbHVlLmggLSBDbGFzcyB0byByZXByZXNlbnQgYSBnbG9iYWwgdmFsdWUgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgYSBjb21tb24gYmFzZSBjbGFzcyBvZiBhbGwgZ2xvYmFsbHkgZGVmaW5hYmxlIG9iamVjdHMuICBBcyBzdWNoLAorLy8gaXQgaXMgc3ViY2xhc3NlZCBieSBHbG9iYWxWYXJpYWJsZSwgR2xvYmFsQWxpYXMgYW5kIGJ5IEZ1bmN0aW9uLiAgVGhpcyBpcworLy8gdXNlZCBiZWNhdXNlIHlvdSBjYW4gZG8gY2VydGFpbiB0aGluZ3Mgd2l0aCB0aGVzZSBnbG9iYWwgb2JqZWN0cyB0aGF0IHlvdQorLy8gY2FuJ3QgZG8gdG8gYW55dGhpbmcgZWxzZS4gIEZvciBleGFtcGxlLCB1c2UgdGhlIGFkZHJlc3Mgb2Ygb25lIGFzIGEKKy8vIGNvbnN0YW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9HTE9CQUxWQUxVRV9ICisjZGVmaW5lIExMVk1fR0xPQkFMVkFMVUVfSAorCisjaW5jbHVkZSAibGx2bS9Db25zdGFudC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFBvaW50ZXJUeXBlOworY2xhc3MgTW9kdWxlOworCitjbGFzcyBHbG9iYWxWYWx1ZSA6IHB1YmxpYyBDb25zdGFudCB7CisgIEdsb2JhbFZhbHVlKGNvbnN0IEdsb2JhbFZhbHVlICYpOyAgICAgICAgICAgICAvLyBkbyBub3QgaW1wbGVtZW50CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQW4gZW51bWVyYXRpb24gZm9yIHRoZSBraW5kcyBvZiBsaW5rYWdlIGZvciBnbG9iYWwgdmFsdWVzLgorICBlbnVtIExpbmthZ2VUeXBlcyB7CisgICAgRXh0ZXJuYWxMaW5rYWdlID0gMCwvLy88IEV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbgorICAgIEF2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlLCAvLy88IEF2YWlsYWJsZSBmb3IgaW5zcGVjdGlvbiwgbm90IGVtaXNzaW9uLgorICAgIExpbmtPbmNlQW55TGlua2FnZSwgLy8vPCBLZWVwIG9uZSBjb3B5IG9mIGZ1bmN0aW9uIHdoZW4gbGlua2luZyAoaW5saW5lKQorICAgIExpbmtPbmNlT0RSTGlua2FnZSwgLy8vPCBTYW1lLCBidXQgb25seSByZXBsYWNlZCBieSBzb21ldGhpbmcgZXF1aXZhbGVudC4KKyAgICBXZWFrQW55TGlua2FnZSwgICAgIC8vLzwgS2VlcCBvbmUgY29weSBvZiBuYW1lZCBmdW5jdGlvbiB3aGVuIGxpbmtpbmcgKHdlYWspCisgICAgV2Vha09EUkxpbmthZ2UsICAgICAvLy88IFNhbWUsIGJ1dCBvbmx5IHJlcGxhY2VkIGJ5IHNvbWV0aGluZyBlcXVpdmFsZW50LgorICAgIEFwcGVuZGluZ0xpbmthZ2UsICAgLy8vPCBTcGVjaWFsIHB1cnBvc2UsIG9ubHkgYXBwbGllcyB0byBnbG9iYWwgYXJyYXlzCisgICAgSW50ZXJuYWxMaW5rYWdlLCAgICAvLy88IFJlbmFtZSBjb2xsaXNpb25zIHdoZW4gbGlua2luZyAoc3RhdGljIGZ1bmN0aW9ucykuCisgICAgUHJpdmF0ZUxpbmthZ2UsICAgICAvLy88IExpa2UgSW50ZXJuYWwsIGJ1dCBvbWl0IGZyb20gc3ltYm9sIHRhYmxlLgorICAgIExpbmtlclByaXZhdGVMaW5rYWdlLCAvLy88IExpa2UgUHJpdmF0ZSwgYnV0IGxpbmtlciByZW1vdmVzLgorICAgIExpbmtlclByaXZhdGVXZWFrTGlua2FnZSwgLy8vPCBMaWtlIExpbmtlclByaXZhdGUsIGJ1dCB3ZWFrLgorICAgIERMTEltcG9ydExpbmthZ2UsICAgLy8vPCBGdW5jdGlvbiB0byBiZSBpbXBvcnRlZCBmcm9tIERMTAorICAgIERMTEV4cG9ydExpbmthZ2UsICAgLy8vPCBGdW5jdGlvbiB0byBiZSBhY2Nlc3NpYmxlIGZyb20gRExMLgorICAgIEV4dGVybmFsV2Vha0xpbmthZ2UsLy8vPCBFeHRlcm5hbFdlYWsgbGlua2FnZSBkZXNjcmlwdGlvbi4KKyAgICBDb21tb25MaW5rYWdlICAgICAgIC8vLzwgVGVudGF0aXZlIGRlZmluaXRpb25zLgorICB9OworCisgIC8vLyBAYnJpZWYgQW4gZW51bWVyYXRpb24gZm9yIHRoZSBraW5kcyBvZiB2aXNpYmlsaXR5IG9mIGdsb2JhbCB2YWx1ZXMuCisgIGVudW0gVmlzaWJpbGl0eVR5cGVzIHsKKyAgICBEZWZhdWx0VmlzaWJpbGl0eSA9IDAsICAvLy88IFRoZSBHViBpcyB2aXNpYmxlCisgICAgSGlkZGVuVmlzaWJpbGl0eSwgICAgICAgLy8vPCBUaGUgR1YgaXMgaGlkZGVuCisgICAgUHJvdGVjdGVkVmlzaWJpbGl0eSAgICAgLy8vPCBUaGUgR1YgaXMgcHJvdGVjdGVkCisgIH07CisKK3Byb3RlY3RlZDoKKyAgR2xvYmFsVmFsdWUoY29uc3QgVHlwZSAqdHksIFZhbHVlVHkgdnR5LCBVc2UgKk9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICBMaW5rYWdlVHlwZXMgbGlua2FnZSwgY29uc3QgVHdpbmUgJk5hbWUpCisgICAgOiBDb25zdGFudCh0eSwgdnR5LCBPcHMsIE51bU9wcyksIFBhcmVudCgwKSwKKyAgICAgIExpbmthZ2UobGlua2FnZSksIFZpc2liaWxpdHkoRGVmYXVsdFZpc2liaWxpdHkpLCBBbGlnbm1lbnQoMCkgeworICAgIHNldE5hbWUoTmFtZSk7CisgIH0KKworICBNb2R1bGUgKlBhcmVudDsKKyAgLy8gTm90ZTogVkMrKyB0cmVhdHMgZW51bXMgYXMgc2lnbmVkLCBzbyBhbiBleHRyYSBiaXQgaXMgcmVxdWlyZWQgdG8gcHJldmVudAorICAvLyBMaW5rYWdlIGFuZCBWaXNpYmlsaXR5IGZyb20gdHVybmluZyBpbnRvIG5lZ2F0aXZlIHZhbHVlcy4KKyAgTGlua2FnZVR5cGVzIExpbmthZ2UgOiA1OyAgIC8vIFRoZSBsaW5rYWdlIG9mIHRoaXMgZ2xvYmFsCisgIHVuc2lnbmVkIFZpc2liaWxpdHkgOiAyOyAgICAvLyBUaGUgdmlzaWJpbGl0eSBzdHlsZSBvZiB0aGlzIGdsb2JhbAorICB1bnNpZ25lZCBBbGlnbm1lbnQgOiAxNjsgICAgLy8gQWxpZ25tZW50IG9mIHRoaXMgc3ltYm9sLCBtdXN0IGJlIHBvd2VyIG9mIHR3bworICBzdGQ6OnN0cmluZyBTZWN0aW9uOyAgICAgICAgLy8gU2VjdGlvbiB0byBlbWl0IHRoaXMgaW50bywgZW1wdHkgbWVhbiBkZWZhdWx0CitwdWJsaWM6CisgIH5HbG9iYWxWYWx1ZSgpIHsKKyAgICByZW1vdmVEZWFkQ29uc3RhbnRVc2VycygpOyAgIC8vIHJlbW92ZSBhbnkgZGVhZCBjb25zdGFudHMgdXNpbmcgdGhpcy4KKyAgfQorCisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKDF1IDw8IEFsaWdubWVudCkgPj4gMTsKKyAgfQorICB2b2lkIHNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbik7CisKKyAgVmlzaWJpbGl0eVR5cGVzIGdldFZpc2liaWxpdHkoKSBjb25zdCB7IHJldHVybiBWaXNpYmlsaXR5VHlwZXMoVmlzaWJpbGl0eSk7IH0KKyAgYm9vbCBoYXNEZWZhdWx0VmlzaWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIFZpc2liaWxpdHkgPT0gRGVmYXVsdFZpc2liaWxpdHk7IH0KKyAgYm9vbCBoYXNIaWRkZW5WaXNpYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gVmlzaWJpbGl0eSA9PSBIaWRkZW5WaXNpYmlsaXR5OyB9CisgIGJvb2wgaGFzUHJvdGVjdGVkVmlzaWJpbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmlzaWJpbGl0eSA9PSBQcm90ZWN0ZWRWaXNpYmlsaXR5OworICB9CisgIHZvaWQgc2V0VmlzaWJpbGl0eShWaXNpYmlsaXR5VHlwZXMgVikgeyBWaXNpYmlsaXR5ID0gVjsgfQorICAKKyAgYm9vbCBoYXNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gIVNlY3Rpb24uZW1wdHkoKTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0U2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb247IH0KKyAgdm9pZCBzZXRTZWN0aW9uKFN0cmluZ1JlZiBTKSB7IFNlY3Rpb24gPSBTOyB9CisgIAorICAvLy8gSWYgdGhlIHVzYWdlIGlzIGVtcHR5IChleGNlcHQgdHJhbnNpdGl2ZWx5IGRlYWQgY29uc3RhbnRzKSwgdGhlbiB0aGlzCisgIC8vLyBnbG9iYWwgdmFsdWUgY2FuIGJlIHNhZmVseSBkZWxldGVkIHNpbmNlIHRoZSBkZXN0cnVjdG9yIHdpbGwKKyAgLy8vIGRlbGV0ZSB0aGUgZGVhZCBjb25zdGFudHMgYXMgd2VsbC4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHVzYWdlIG9mIHRoaXMgZ2xvYmFsIHZhbHVlIGlzIGVtcHR5IGV4Y2VwdAorICAvLy8gZm9yIHRyYW5zaXRpdmVseSBkZWFkIGNvbnN0YW50cy4KKyAgYm9vbCB1c2VfZW1wdHlfZXhjZXB0X2NvbnN0YW50cygpOworCisgIC8vLyBnZXRUeXBlIC0gR2xvYmFsIHZhbHVlcyBhcmUgYWx3YXlzIHBvaW50ZXJzLgorICBpbmxpbmUgY29uc3QgUG9pbnRlclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUG9pbnRlclR5cGUqPihVc2VyOjpnZXRUeXBlKCkpOworICB9CisKKyAgc3RhdGljIExpbmthZ2VUeXBlcyBnZXRMaW5rT25jZUxpbmthZ2UoYm9vbCBPRFIpIHsKKyAgICByZXR1cm4gT0RSID8gTGlua09uY2VPRFJMaW5rYWdlIDogTGlua09uY2VBbnlMaW5rYWdlOworICB9CisgIHN0YXRpYyBMaW5rYWdlVHlwZXMgZ2V0V2Vha0xpbmthZ2UoYm9vbCBPRFIpIHsKKyAgICByZXR1cm4gT0RSID8gV2Vha09EUkxpbmthZ2UgOiBXZWFrQW55TGlua2FnZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gRXh0ZXJuYWxMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0xpbmtPbmNlTGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBMaW5rYWdlID09IExpbmtPbmNlQW55TGlua2FnZSB8fCBMaW5rYWdlID09IExpbmtPbmNlT0RSTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc1dlYWtMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gV2Vha0FueUxpbmthZ2UgfHwgTGlua2FnZSA9PSBXZWFrT0RSTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0FwcGVuZGluZ0xpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBBcHBlbmRpbmdMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzSW50ZXJuYWxMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gSW50ZXJuYWxMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzUHJpdmF0ZUxpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBQcml2YXRlTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0xpbmtlclByaXZhdGVMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gTGlua2VyUHJpdmF0ZUxpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNMaW5rZXJQcml2YXRlV2Vha0xpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBMaW5rZXJQcml2YXRlV2Vha0xpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNMb2NhbExpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gaXNJbnRlcm5hbExpbmthZ2UoTGlua2FnZSkgfHwgaXNQcml2YXRlTGlua2FnZShMaW5rYWdlKSB8fAorICAgICAgaXNMaW5rZXJQcml2YXRlTGlua2FnZShMaW5rYWdlKSB8fCBpc0xpbmtlclByaXZhdGVXZWFrTGlua2FnZShMaW5rYWdlKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0RMTEltcG9ydExpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBETExJbXBvcnRMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzRExMRXhwb3J0TGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBMaW5rYWdlID09IERMTEV4cG9ydExpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFeHRlcm5hbFdlYWtMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gRXh0ZXJuYWxXZWFrTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0NvbW1vbkxpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBDb21tb25MaW5rYWdlOworICB9CisKKyAgLy8vIG1heUJlT3ZlcnJpZGRlbiAtIFdoZXRoZXIgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBnbG9iYWwgbWF5IGJlIHJlcGxhY2VkCisgIC8vLyBieSBzb21ldGhpbmcgbm9uLWVxdWl2YWxlbnQgYXQgbGluayB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIGEgZnVuY3Rpb24gaGFzCisgIC8vLyB3ZWFrIGxpbmthZ2UgdGhlbiB0aGUgY29kZSBkZWZpbmluZyBpdCBtYXkgYmUgcmVwbGFjZWQgYnkgZGlmZmVyZW50IGNvZGUuCisgIHN0YXRpYyBib29sIG1heUJlT3ZlcnJpZGRlbihMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiAoTGlua2FnZSA9PSBXZWFrQW55TGlua2FnZSB8fAorICAgICAgICAgICAgTGlua2FnZSA9PSBMaW5rT25jZUFueUxpbmthZ2UgfHwKKyAgICAgICAgICAgIExpbmthZ2UgPT0gQ29tbW9uTGlua2FnZSB8fAorICAgICAgICAgICAgTGlua2FnZSA9PSBFeHRlcm5hbFdlYWtMaW5rYWdlIHx8CisgICAgICAgICAgICBMaW5rYWdlID09IExpbmtlclByaXZhdGVXZWFrTGlua2FnZSk7CisgIH0KKworICAvLy8gaXNXZWFrRm9yTGlua2VyIC0gV2hldGhlciB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGdsb2JhbCBtYXkgYmUgcmVwbGFjZWQgYXQKKyAgLy8vIGxpbmsgdGltZS4KKyAgc3RhdGljIGJvb2wgaXNXZWFrRm9yTGlua2VyKExpbmthZ2VUeXBlcyBMaW5rYWdlKSAgeworICAgIHJldHVybiAoTGlua2FnZSA9PSBBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSB8fAorICAgICAgICAgICAgTGlua2FnZSA9PSBXZWFrQW55TGlua2FnZSB8fAorICAgICAgICAgICAgTGlua2FnZSA9PSBXZWFrT0RSTGlua2FnZSB8fAorICAgICAgICAgICAgTGlua2FnZSA9PSBMaW5rT25jZUFueUxpbmthZ2UgfHwKKyAgICAgICAgICAgIExpbmthZ2UgPT0gTGlua09uY2VPRFJMaW5rYWdlIHx8CisgICAgICAgICAgICBMaW5rYWdlID09IENvbW1vbkxpbmthZ2UgfHwKKyAgICAgICAgICAgIExpbmthZ2UgPT0gRXh0ZXJuYWxXZWFrTGlua2FnZSB8fAorICAgICAgICAgICAgTGlua2FnZSA9PSBMaW5rZXJQcml2YXRlV2Vha0xpbmthZ2UpOworICB9CisKKyAgYm9vbCBoYXNFeHRlcm5hbExpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc0V4dGVybmFsTGlua2FnZShMaW5rYWdlKTsgfQorICBib29sIGhhc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBpc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKExpbmthZ2UpOworICB9CisgIGJvb2wgaGFzTGlua09uY2VMaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBpc0xpbmtPbmNlTGlua2FnZShMaW5rYWdlKTsKKyAgfQorICBib29sIGhhc1dlYWtMaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBpc1dlYWtMaW5rYWdlKExpbmthZ2UpOworICB9CisgIGJvb2wgaGFzQXBwZW5kaW5nTGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzQXBwZW5kaW5nTGlua2FnZShMaW5rYWdlKTsgfQorICBib29sIGhhc0ludGVybmFsTGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzSW50ZXJuYWxMaW5rYWdlKExpbmthZ2UpOyB9CisgIGJvb2wgaGFzUHJpdmF0ZUxpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc1ByaXZhdGVMaW5rYWdlKExpbmthZ2UpOyB9CisgIGJvb2wgaGFzTGlua2VyUHJpdmF0ZUxpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc0xpbmtlclByaXZhdGVMaW5rYWdlKExpbmthZ2UpOyB9CisgIGJvb2wgaGFzTGlua2VyUHJpdmF0ZVdlYWtMaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBpc0xpbmtlclByaXZhdGVXZWFrTGlua2FnZShMaW5rYWdlKTsKKyAgfQorICBib29sIGhhc0xvY2FsTGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzTG9jYWxMaW5rYWdlKExpbmthZ2UpOyB9CisgIGJvb2wgaGFzRExMSW1wb3J0TGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzRExMSW1wb3J0TGlua2FnZShMaW5rYWdlKTsgfQorICBib29sIGhhc0RMTEV4cG9ydExpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc0RMTEV4cG9ydExpbmthZ2UoTGlua2FnZSk7IH0KKyAgYm9vbCBoYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gaXNFeHRlcm5hbFdlYWtMaW5rYWdlKExpbmthZ2UpOyB9CisgIGJvb2wgaGFzQ29tbW9uTGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzQ29tbW9uTGlua2FnZShMaW5rYWdlKTsgfQorCisgIHZvaWQgc2V0TGlua2FnZShMaW5rYWdlVHlwZXMgTFQpIHsgTGlua2FnZSA9IExUOyB9CisgIExpbmthZ2VUeXBlcyBnZXRMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gTGlua2FnZTsgfQorCisgIGJvb2wgbWF5QmVPdmVycmlkZGVuKCkgY29uc3QgeyByZXR1cm4gbWF5QmVPdmVycmlkZGVuKExpbmthZ2UpOyB9CisKKyAgYm9vbCBpc1dlYWtGb3JMaW5rZXIoKSBjb25zdCB7IHJldHVybiBpc1dlYWtGb3JMaW5rZXIoTGlua2FnZSk7IH0KKworICAvLy8gY29weUF0dHJpYnV0ZXNGcm9tIC0gY29weSBhbGwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzICh0aG9zZSBub3QgbmVlZGVkIHRvCisgIC8vLyBjcmVhdGUgYSBHbG9iYWxWYWx1ZSkgZnJvbSB0aGUgR2xvYmFsVmFsdWUgU3JjIHRvIHRoaXMgb25lLgorICB2aXJ0dWFsIHZvaWQgY29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEdsb2JhbFZhbHVlICpTcmMpOworCisvLy8gQG5hbWUgTWF0ZXJpYWxpemF0aW9uCisvLy8gTWF0ZXJpYWxpemF0aW9uIGlzIHVzZWQgdG8gY29uc3RydWN0IGZ1bmN0aW9ucyBvbmx5IGFzIHRoZXkncmUgbmVlZGVkLiBUaGlzCisvLy8gaXMgdXNlZnVsIHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UgaW4gTExWTSBvciBwYXJzaW5nIHdvcmsgZG9uZSBieSB0aGUKKy8vLyBCaXRjb2RlUmVhZGVyIHRvIGxvYWQgdGhlIE1vZHVsZS4KKy8vLyBAeworCisgIC8vLyBpc01hdGVyaWFsaXphYmxlIC0gSWYgdGhpcyBmdW5jdGlvbidzIE1vZHVsZSBpcyBiZWluZyBsYXppbHkgc3RyZWFtZWQgaW4KKyAgLy8vIGZ1bmN0aW9ucyBmcm9tIGRpc2sgb3Igc29tZSBvdGhlciBzb3VyY2UsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgIC8vLyB0byBzZWUgaWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIHJlYWQgaW4geWV0IG9yIG5vdC4KKyAgYm9vbCBpc01hdGVyaWFsaXphYmxlKCkgY29uc3Q7CisKKyAgLy8vIGlzRGVtYXRlcmlhbGl6YWJsZSAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIHdhcyBsb2FkZWQgZnJvbSBhCisgIC8vLyBHVk1hdGVyaWFsaXplciB0aGF0J3Mgc3RpbGwgYXR0YWNoZWQgdG8gaXRzIE1vZHVsZSBhbmQgdGhhdCBrbm93cyBob3cgdG8KKyAgLy8vIGRlbWF0ZXJpYWxpemUgdGhlIGZ1bmN0aW9uLgorICBib29sIGlzRGVtYXRlcmlhbGl6YWJsZSgpIGNvbnN0OworCisgIC8vLyBNYXRlcmlhbGl6ZSAtIG1ha2Ugc3VyZSB0aGlzIEdsb2JhbFZhbHVlIGlzIGZ1bGx5IHJlYWQuICBJZiB0aGUgbW9kdWxlIGlzCisgIC8vLyBjb3JydXB0LCB0aGlzIHJldHVybnMgdHJ1ZSBhbmQgZmlsbHMgaW4gdGhlIG9wdGlvbmFsIHN0cmluZyB3aXRoCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvYmxlbS4gIElmIHN1Y2Nlc3NmdWwsIHRoaXMgcmV0dXJucyBmYWxzZS4KKyAgYm9vbCBNYXRlcmlhbGl6ZShzdGQ6OnN0cmluZyAqRXJySW5mbyA9IDApOworCisgIC8vLyBEZW1hdGVyaWFsaXplIC0gSWYgdGhpcyBHbG9iYWxWYWx1ZSBpcyByZWFkIGluLCBhbmQgaWYgdGhlIEdWTWF0ZXJpYWxpemVyCisgIC8vLyBzdXBwb3J0cyBpdCwgcmVsZWFzZSB0aGUgbWVtb3J5IGZvciB0aGUgZnVuY3Rpb24sIGFuZCBzZXQgaXQgdXAgdG8gYmUKKyAgLy8vIG1hdGVyaWFsaXplZCBsYXppbHkuICBJZiAhaXNEZW1hdGVyaWFsaXphYmxlKCksIHRoaXMgbWV0aG9kIGlzIGEgbm9vcC4KKyAgdm9pZCBEZW1hdGVyaWFsaXplKCk7CisKKy8vLyBAfQorCisgIC8vLyBPdmVycmlkZSBmcm9tIENvbnN0YW50IGNsYXNzLiBObyBHbG9iYWxWYWx1ZSdzIGFyZSBudWxsIHZhbHVlcyBzbyB0aGlzCisgIC8vLyBhbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgdmlydHVhbCBib29sIGlzTnVsbFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gT3ZlcnJpZGUgZnJvbSBDb25zdGFudCBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIGRlc3Ryb3lDb25zdGFudCgpOworCisgIC8vLyBpc0RlY2xhcmF0aW9uIC0gUmV0dXJuIHRydWUgaWYgdGhlIHByaW1hcnkgZGVmaW5pdGlvbiBvZiB0aGlzIGdsb2JhbCAKKyAgLy8vIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4uLgorICB2aXJ0dWFsIGJvb2wgaXNEZWNsYXJhdGlvbigpIGNvbnN0ID0gMDsKKworICAvLy8gcmVtb3ZlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlLAorICAvLy8gYnV0IGRvZXMgbm90IGRlbGV0ZSBpdC4KKyAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKSA9IDA7CisKKyAgLy8vIGVyYXNlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlCisgIC8vLyBhbmQgZGVsZXRlcyBpdC4KKyAgdmlydHVhbCB2b2lkIGVyYXNlRnJvbVBhcmVudCgpID0gMDsKKworICAvLy8gZ2V0UGFyZW50IC0gR2V0IHRoZSBtb2R1bGUgdGhhdCB0aGlzIGdsb2JhbCB2YWx1ZSBpcyBjb250YWluZWQgaW5zaWRlCisgIC8vLyBvZi4uLgorICBpbmxpbmUgTW9kdWxlICpnZXRQYXJlbnQoKSB7IHJldHVybiBQYXJlbnQ7IH0KKyAgaW5saW5lIGNvbnN0IE1vZHVsZSAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8vIHJlbW92ZURlYWRDb25zdGFudFVzZXJzIC0gSWYgdGhlcmUgYXJlIGFueSBkZWFkIGNvbnN0YW50IHVzZXJzIGRhbmdsaW5nCisgIC8vLyBvZmYgb2YgdGhpcyBnbG9iYWwgdmFsdWUsIHJlbW92ZSB0aGVtLiAgVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBjbGllbnRzCisgIC8vLyB0aGF0IHdhbnQgdG8gY2hlY2sgdG8gc2VlIGlmIGEgZ2xvYmFsIGlzIHVudXNlZCwgYnV0IGRvbid0IHdhbnQgdG8gZGVhbAorICAvLy8gd2l0aCBwb3RlbnRpYWxseSBkZWFkIGNvbnN0YW50cyBoYW5naW5nIG9mZiBvZiB0aGUgZ2xvYmFscy4KKyAgdm9pZCByZW1vdmVEZWFkQ29uc3RhbnRVc2VycygpIGNvbnN0OworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEdsb2JhbFZhbHVlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpGdW5jdGlvblZhbCB8fAorICAgICAgICAgICBWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okdsb2JhbFZhcmlhYmxlVmFsIHx8CisgICAgICAgICAgIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsQWxpYXNWYWw7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0dsb2JhbFZhcmlhYmxlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vR2xvYmFsVmFyaWFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNlOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0dsb2JhbFZhcmlhYmxlLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8vPT09LS0gbGx2bS9HbG9iYWxWYXJpYWJsZS5oIC0gR2xvYmFsVmFyaWFibGUgY2xhc3MgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgR2xvYmFsVmFyaWFibGUgY2xhc3MsIHdoaWNoCisvLyByZXByZXNlbnRzIGEgc2luZ2xlIGdsb2JhbCB2YXJpYWJsZSAob3IgY29uc3RhbnQpIGluIHRoZSBWTS4KKy8vCisvLyBHbG9iYWwgdmFyaWFibGVzIGFyZSBjb25zdGFudCBwb2ludGVycyB0aGF0IHJlZmVyIHRvIGh1bmtzIG9mIHNwYWNlIHRoYXQgYXJlCisvLyBhbGxvY2F0ZWQgYnkgZWl0aGVyIHRoZSBWTSwgb3IgYnkgdGhlIGxpbmtlciBpbiBhIHN0YXRpYyBjb21waWxlci4gIEEgZ2xvYmFsCisvLyB2YXJpYWJsZSBtYXkgaGF2ZSBhbiBpbnRpYWwgdmFsdWUsIHdoaWNoIGlzIGNvcGllZCBpbnRvIHRoZSBleGVjdXRhYmxlcyAuZGF0YQorLy8gYXJlYS4gIEdsb2JhbCBDb25zdGFudHMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgaW5pdGlhbGl6ZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9HTE9CQUxfVkFSSUFCTEVfSAorI2RlZmluZSBMTFZNX0dMT0JBTF9WQVJJQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9PcGVyYW5kVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworY2xhc3MgQ29uc3RhbnQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVN1YkNsYXNzLCB0eXBlbmFtZSBJdGVtUGFyZW50Q2xhc3M+CisgIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czsKKworY2xhc3MgR2xvYmFsVmFyaWFibGUgOiBwdWJsaWMgR2xvYmFsVmFsdWUsIHB1YmxpYyBpbGlzdF9ub2RlPEdsb2JhbFZhcmlhYmxlPiB7CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsVmFyaWFibGUsIE1vZHVsZT47CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKTsgICAgICAgLy8gRG8gbm90IGltcGxlbWVudAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBHbG9iYWxWYXJpYWJsZSAmKTsgICAgIC8vIERvIG5vdCBpbXBsZW1lbnQKKyAgR2xvYmFsVmFyaWFibGUoY29uc3QgR2xvYmFsVmFyaWFibGUgJik7ICAgICAvLyBEbyBub3QgaW1wbGVtZW50CisKKyAgdm9pZCBzZXRQYXJlbnQoTW9kdWxlICpwYXJlbnQpOworCisgIGJvb2wgaXNDb25zdGFudEdsb2JhbCA6IDE7ICAgICAgICAgICAvLyBJcyB0aGlzIGEgZ2xvYmFsIGNvbnN0YW50PworICBib29sIGlzVGhyZWFkTG9jYWxTeW1ib2wgOiAxOyAgICAgICAgLy8gSXMgdGhpcyBzeW1ib2wgIlRocmVhZCBMb2NhbCI/CisKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgb25lIG9wZXJhbmQKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAxKTsKKyAgfQorICAvLy8gR2xvYmFsVmFyaWFibGUgY3RvciAtIElmIGEgcGFyZW50IG1vZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBnbG9iYWwgaXMKKyAgLy8vIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW50byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgbW9kdWxlcyBnbG9iYWwgbGlzdC4KKyAgR2xvYmFsVmFyaWFibGUoY29uc3QgVHlwZSAqVHksIGJvb2wgaXNDb25zdGFudCwgTGlua2FnZVR5cGVzIExpbmthZ2UsCisgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJbml0aWFsaXplciA9IDAsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgIGJvb2wgVGhyZWFkTG9jYWwgPSBmYWxzZSwgdW5zaWduZWQgQWRkcmVzc1NwYWNlID0gMCk7CisgIC8vLyBHbG9iYWxWYXJpYWJsZSBjdG9yIC0gVGhpcyBjcmVhdGVzIGEgZ2xvYmFsIGFuZCBpbnNlcnRzIGl0IGJlZm9yZSB0aGUKKyAgLy8vIHNwZWNpZmllZCBvdGhlciBnbG9iYWwuCisgIEdsb2JhbFZhcmlhYmxlKE1vZHVsZSAmTSwgY29uc3QgVHlwZSAqVHksIGJvb2wgaXNDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgTGlua2FnZVR5cGVzIExpbmthZ2UsIENvbnN0YW50ICpJbml0aWFsaXplciwKKyAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgIEdsb2JhbFZhcmlhYmxlICpJbnNlcnRCZWZvcmUgPSAwLCBib29sIFRocmVhZExvY2FsID0gZmFsc2UsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSA9IDApOworCisgIH5HbG9iYWxWYXJpYWJsZSgpIHsKKyAgICBOdW1PcGVyYW5kcyA9IDE7IC8vIEZJWE1FOiBuZWVkZWQgYnkgb3BlcmF0b3IgZGVsZXRlCisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vLyBpc0RlY2xhcmF0aW9uIC0gSXMgdGhpcyBnbG9iYWwgdmFyaWFibGUgbGFja2luZyBhbiBpbml0aWFsaXplcj8gIElmIHNvLCAKKyAgLy8vIHRoZSBnbG9iYWwgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiBzb21lIG90aGVyIHRyYW5zbGF0aW9uIHVuaXQsIGFuZCBpcyB0aHVzCisgIC8vLyBvbmx5IGEgZGVjbGFyYXRpb24gaGVyZS4KKyAgdmlydHVhbCBib29sIGlzRGVjbGFyYXRpb24oKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpID09IDA7IH0KKworICAvLy8gaGFzSW5pdGlhbGl6ZXIgLSBVbmxlc3MgYSBnbG9iYWwgdmFyaWFibGUgaXNFeHRlcm5hbCgpLCBpdCBoYXMgYW4KKyAgLy8vIGluaXRpYWxpemVyLiAgVGhlIGluaXRpYWxpemVyIGZvciB0aGUgZ2xvYmFsIHZhcmlhYmxlL2NvbnN0YW50IGlzIGhlbGQgYnkKKyAgLy8vIEluaXRpYWxpemVyIGlmIGFuIGluaXRpYWxpemVyIGlzIHNwZWNpZmllZC4KKyAgLy8vCisgIGlubGluZSBib29sIGhhc0luaXRpYWxpemVyKCkgY29uc3QgeyByZXR1cm4gIWlzRGVjbGFyYXRpb24oKTsgfQorCisgIC8vLyBoYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIgLSBXaGV0aGVyIHRoZSBnbG9iYWwgdmFyaWFibGUgaGFzIGFuIGluaXRpYWxpemVyLAorICAvLy8gYW5kIHRoaXMgaXMgdGhlIGluaXRpYWxpemVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBmaW5hbCBleGVjdXRhYmxlLgorICBpbmxpbmUgYm9vbCBoYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0luaXRpYWxpemVyKCkgJiYKKyAgICAgIC8vIFRoZSBpbml0aWFsaXplciBvZiBhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHdlYWsgbGlua2FnZSBtYXkgY2hhbmdlIGF0CisgICAgICAvLyBsaW5rIHRpbWUuCisgICAgICAhbWF5QmVPdmVycmlkZGVuKCk7CisgIH0KKworICAvLy8gZ2V0SW5pdGlhbGl6ZXIgLSBSZXR1cm4gdGhlIGluaXRpYWxpemVyIGZvciB0aGlzIGdsb2JhbCB2YXJpYWJsZS4gIEl0IGlzCisgIC8vLyBpbGxlZ2FsIHRvIGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIGdsb2JhbCBpcyBleHRlcm5hbCwgYmVjYXVzZSB3ZSBjYW5ub3QKKyAgLy8vIHRlbGwgd2hhdCB0aGUgdmFsdWUgaXMgaW5pdGlhbGl6ZWQgdG8hCisgIC8vLworICBpbmxpbmUgLypjb25zdCBGSVhNRSovIENvbnN0YW50ICpnZXRJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzSW5pdGlhbGl6ZXIoKSAmJiAiR1YgZG9lc24ndCBoYXZlIGluaXRpYWxpemVyISIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb25zdGFudCo+KE9wPDA+KCkuZ2V0KCkpOworICB9CisgIGlubGluZSBDb25zdGFudCAqZ2V0SW5pdGlhbGl6ZXIoKSB7CisgICAgYXNzZXJ0KGhhc0luaXRpYWxpemVyKCkgJiYgIkdWIGRvZXNuJ3QgaGF2ZSBpbml0aWFsaXplciEiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29uc3RhbnQqPihPcDwwPigpLmdldCgpKTsKKyAgfQorICAvLy8gc2V0SW5pdGlhbGl6ZXIgLSBTZXRzIHRoZSBpbml0aWFsaXplciBmb3IgdGhpcyBnbG9iYWwgdmFyaWFibGUsIHJlbW92aW5nCisgIC8vLyBhbnkgZXhpc3RpbmcgaW5pdGlhbGl6ZXIgaWYgSW5pdFZhbD09TlVMTC4gIElmIHRoaXMgR1YgaGFzIHR5cGUgVCosIHRoZQorICAvLy8gaW5pdGlhbGl6ZXIgbXVzdCBoYXZlIHR5cGUgVC4KKyAgdm9pZCBzZXRJbml0aWFsaXplcihDb25zdGFudCAqSW5pdFZhbCk7CisKKyAgLy8vIElmIHRoZSB2YWx1ZSBpcyBhIGdsb2JhbCBjb25zdGFudCwgaXRzIHZhbHVlIGlzIGltbXV0YWJsZSB0aHJvdWdob3V0IHRoZQorICAvLy8gcnVudGltZSBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0uICBBc3NpZ25pbmcgYSB2YWx1ZSBpbnRvIHRoZSBjb25zdGFudAorICAvLy8gbGVhZHMgdG8gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAvLy8KKyAgYm9vbCBpc0NvbnN0YW50KCkgY29uc3QgeyByZXR1cm4gaXNDb25zdGFudEdsb2JhbDsgfQorICB2b2lkIHNldENvbnN0YW50KGJvb2wgVmFsKSB7IGlzQ29uc3RhbnRHbG9iYWwgPSBWYWw7IH0KKworICAvLy8gSWYgdGhlIHZhbHVlIGlzICJUaHJlYWQgTG9jYWwiLCBpdHMgdmFsdWUgaXNuJ3Qgc2hhcmVkIGJ5IHRoZSB0aHJlYWRzLgorICBib29sIGlzVGhyZWFkTG9jYWwoKSBjb25zdCB7IHJldHVybiBpc1RocmVhZExvY2FsU3ltYm9sOyB9CisgIHZvaWQgc2V0VGhyZWFkTG9jYWwoYm9vbCBWYWwpIHsgaXNUaHJlYWRMb2NhbFN5bWJvbCA9IFZhbDsgfQorCisgIC8vLyBjb3B5QXR0cmlidXRlc0Zyb20gLSBjb3B5IGFsbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKHRob3NlIG5vdCBuZWVkZWQgdG8KKyAgLy8vIGNyZWF0ZSBhIEdsb2JhbFZhcmlhYmxlKSBmcm9tIHRoZSBHbG9iYWxWYXJpYWJsZSBTcmMgdG8gdGhpcyBvbmUuCisgIHZvaWQgY29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEdsb2JhbFZhbHVlICpTcmMpOworCisgIC8vLyByZW1vdmVGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUsCisgIC8vLyBidXQgZG9lcyBub3QgZGVsZXRlIGl0LgorICAvLy8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gZXJhc2VGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUKKyAgLy8vIGFuZCBkZWxldGVzIGl0LgorICAvLy8KKyAgdmlydHVhbCB2b2lkIGVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vLyBPdmVycmlkZSBDb25zdGFudCdzIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNvIHdlIGNhbgorICAvLy8gcmVwbGFjZSBjb25zdGFudCBpbml0aWFsaXplcnMuCisgIHZpcnR1YWwgdm9pZCByZXBsYWNlVXNlc09mV2l0aE9uQ29uc3RhbnQoVmFsdWUgKkZyb20sIFZhbHVlICpUbywgVXNlICpVKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBHbG9iYWxWYXJpYWJsZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsVmFyaWFibGVWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxHbG9iYWxWYXJpYWJsZT4gOiBwdWJsaWMgT3B0aW9uYWxPcGVyYW5kVHJhaXRzPD4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEdsb2JhbFZhcmlhYmxlLCBWYWx1ZSkKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW5saW5lQXNtLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW5saW5lQXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1YjFiYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9JbmxpbmVBc20uaApAQCAtMCwwICsxLDIxMyBAQAorLy89PT0tLSBsbHZtL0lubGluZUFzbS5oIC0gQ2xhc3MgdG8gcmVwcmVzZW50IGlubGluZSBhc20gc3RyaW5ncy0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGlubGluZSBhc20gc3RyaW5ncywgd2hpY2ggYXJlIFZhbHVlKidzIHRoYXQgYXJlCisvLyB1c2VkIGFzIHRoZSBjYWxsZWUgb3BlcmFuZCBvZiBjYWxsIGluc3RydWN0aW9ucy4gIElubGluZUFzbSdzIGFyZSB1bmlxdWVkCisvLyBsaWtlIGNvbnN0YW50cywgYW5kIGNyZWF0ZWQgdmlhIElubGluZUFzbTo6Z2V0KC4uLikuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lOTElORUFTTV9ICisjZGVmaW5lIExMVk1fSU5MSU5FQVNNX0gKKworI2luY2x1ZGUgImxsdm0vVmFsdWUuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUG9pbnRlclR5cGU7CitjbGFzcyBGdW5jdGlvblR5cGU7CitjbGFzcyBNb2R1bGU7CitzdHJ1Y3QgSW5saW5lQXNtS2V5VHlwZTsKK3RlbXBsYXRlPGNsYXNzIFZhbFR5cGUsIGNsYXNzIFR5cGVDbGFzcywgY2xhc3MgQ29uc3RhbnRDbGFzcywgYm9vbCBIYXNMYXJnZUtleT4KK2NsYXNzIENvbnN0YW50VW5pcXVlTWFwOwordGVtcGxhdGU8Y2xhc3MgQ29uc3RhbnRDbGFzcywgY2xhc3MgVHlwZUNsYXNzLCBjbGFzcyBWYWxUeXBlPgorc3RydWN0IENvbnN0YW50Q3JlYXRvcjsKKworY2xhc3MgSW5saW5lQXNtIDogcHVibGljIFZhbHVlIHsKKyAgZnJpZW5kIHN0cnVjdCBDb25zdGFudENyZWF0b3I8SW5saW5lQXNtLCBQb2ludGVyVHlwZSwgSW5saW5lQXNtS2V5VHlwZT47CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudFVuaXF1ZU1hcDxJbmxpbmVBc21LZXlUeXBlLCBQb2ludGVyVHlwZSwgSW5saW5lQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U+OworCisgIElubGluZUFzbShjb25zdCBJbmxpbmVBc20gJik7ICAgICAgICAgICAgIC8vIGRvIG5vdCBpbXBsZW1lbnQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSW5saW5lQXNtJik7ICAgICAgICAgLy8gZG8gbm90IGltcGxlbWVudAorCisgIHN0ZDo6c3RyaW5nIEFzbVN0cmluZywgQ29uc3RyYWludHM7CisgIGJvb2wgSGFzU2lkZUVmZmVjdHM7CisgIGJvb2wgSXNBbGlnblN0YWNrOworICAKKyAgSW5saW5lQXNtKGNvbnN0IFBvaW50ZXJUeXBlICpUeSwgY29uc3Qgc3RkOjpzdHJpbmcgJkFzbVN0cmluZywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50cywgYm9vbCBoYXNTaWRlRWZmZWN0cywKKyAgICAgICAgICAgIGJvb2wgaXNBbGlnblN0YWNrKTsKKyAgdmlydHVhbCB+SW5saW5lQXNtKCk7CisKKyAgLy8vIFdoZW4gdGhlIENvbnN0YW50VW5pcXVlTWFwIG1lcmdlcyB0d28gdHlwZXMgYW5kIG1ha2VzIHR3byBJbmxpbmVBc21zCisgIC8vLyBpZGVudGljYWwsIGl0IGRlc3Ryb3lzIG9uZSBvZiB0aGVtIHdpdGggdGhpcyBtZXRob2QuCisgIHZvaWQgZGVzdHJveUNvbnN0YW50KCk7CitwdWJsaWM6CisKKyAgLy8vIElubGluZUFzbTo6Z2V0IC0gUmV0dXJuIHRoZSBzcGVjaWZpZWQgdW5pcXVlZCBpbmxpbmUgYXNtIHN0cmluZy4KKyAgLy8vCisgIHN0YXRpYyBJbmxpbmVBc20gKmdldChjb25zdCBGdW5jdGlvblR5cGUgKlR5LCBTdHJpbmdSZWYgQXNtU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvbnN0cmFpbnRzLCBib29sIGhhc1NpZGVFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0FsaWduU3RhY2sgPSBmYWxzZSk7CisgIAorICBib29sIGhhc1NpZGVFZmZlY3RzKCkgY29uc3QgeyByZXR1cm4gSGFzU2lkZUVmZmVjdHM7IH0KKyAgYm9vbCBpc0FsaWduU3RhY2soKSBjb25zdCB7IHJldHVybiBJc0FsaWduU3RhY2s7IH0KKyAgCisgIC8vLyBnZXRUeXBlIC0gSW5saW5lQXNtJ3MgYXJlIGFsd2F5cyBwb2ludGVycy4KKyAgLy8vCisgIGNvbnN0IFBvaW50ZXJUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFBvaW50ZXJUeXBlKj4oVmFsdWU6OmdldFR5cGUoKSk7CisgIH0KKyAgCisgIC8vLyBnZXRGdW5jdGlvblR5cGUgLSBJbmxpbmVBc20ncyBhcmUgYWx3YXlzIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucy4KKyAgLy8vCisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0RnVuY3Rpb25UeXBlKCkgY29uc3Q7CisgIAorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0QXNtU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gQXNtU3RyaW5nOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRDb25zdHJhaW50U3RyaW5nKCkgY29uc3QgeyByZXR1cm4gQ29uc3RyYWludHM7IH0KKworICAvLy8gVmVyaWZ5IC0gVGhpcyBzdGF0aWMgbWV0aG9kIGNhbiBiZSB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gY2hlY2sgdG8gc2VlIGlmCisgIC8vLyB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQgc3RyaW5nIGlzIGxlZ2FsIGZvciB0aGUgdHlwZS4gIFRoaXMgcmV0dXJucyB0cnVlCisgIC8vLyBpZiBsZWdhbCwgZmFsc2UgaWYgbm90LgorICAvLy8KKyAgc3RhdGljIGJvb2wgVmVyaWZ5KGNvbnN0IEZ1bmN0aW9uVHlwZSAqVHksIFN0cmluZ1JlZiBDb25zdHJhaW50cyk7CisKKyAgLy8gQ29uc3RyYWludCBTdHJpbmcgUGFyc2luZyAKKyAgZW51bSBDb25zdHJhaW50UHJlZml4IHsKKyAgICBpc0lucHV0LCAgICAgICAgICAgIC8vICd4JworICAgIGlzT3V0cHV0LCAgICAgICAgICAgLy8gJz14JworICAgIGlzQ2xvYmJlciAgICAgICAgICAgLy8gJ354JworICB9OworICAKKyAgc3RydWN0IENvbnN0cmFpbnRJbmZvIHsKKyAgICAvLy8gVHlwZSAtIFRoZSBiYXNpYyB0eXBlIG9mIHRoZSBjb25zdHJhaW50OiBpbnB1dC9vdXRwdXQvY2xvYmJlcgorICAgIC8vLworICAgIENvbnN0cmFpbnRQcmVmaXggVHlwZTsKKyAgICAKKyAgICAvLy8gaXNFYXJseUNsb2JiZXIgLSAiJiI6IG91dHB1dCBvcGVyYW5kIHdyaXRlcyByZXN1bHQgYmVmb3JlIGlucHV0cyBhcmUgYWxsCisgICAgLy8vIHJlYWQuICBUaGlzIGlzIG9ubHkgZXZlciBzZXQgZm9yIGFuIG91dHB1dCBvcGVyYW5kLgorICAgIGJvb2wgaXNFYXJseUNsb2JiZXI7IAorICAgIAorICAgIC8vLyBNYXRjaGluZ0lucHV0IC0gSWYgdGhpcyBpcyBub3QgLTEsIHRoaXMgaXMgYW4gb3V0cHV0IGNvbnN0cmFpbnQgd2hlcmUgYW4KKyAgICAvLy8gaW5wdXQgY29uc3RyYWludCBpcyByZXF1aXJlZCB0byBtYXRjaCBpdCAoZS5nLiAiMCIpLiAgVGhlIHZhbHVlIGlzIHRoZQorICAgIC8vLyBjb25zdHJhaW50IG51bWJlciB0aGF0IG1hdGNoZXMgdGhpcyBvbmUgKGZvciBleGFtcGxlLCBpZiB0aGlzIGlzCisgICAgLy8vIGNvbnN0cmFpbnQgIzAgYW5kIGNvbnN0cmFpbnQgIzQgaGFzIHRoZSB2YWx1ZSAiMCIsIHRoaXMgd2lsbCBiZSA0KS4KKyAgICBzaWduZWQgY2hhciBNYXRjaGluZ0lucHV0OworICAgIAorICAgIC8vLyBoYXNNYXRjaGluZ0lucHV0IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBvdXRwdXQgY29uc3RyYWludCB0aGF0IGhhcworICAgIC8vLyBhIG1hdGNoaW5nIGlucHV0IGNvbnN0cmFpbnQuCisgICAgYm9vbCBoYXNNYXRjaGluZ0lucHV0KCkgY29uc3QgeyByZXR1cm4gTWF0Y2hpbmdJbnB1dCAhPSAtMTsgfQorICAgIAorICAgIC8vLyBpc0NvbW11dGF0aXZlIC0gVGhpcyBpcyBzZXQgdG8gdHJ1ZSBmb3IgYSBjb25zdHJhaW50IHRoYXQgaXMgY29tbXV0YXRpdmUKKyAgICAvLy8gd2l0aCB0aGUgbmV4dCBvcGVyYW5kLgorICAgIGJvb2wgaXNDb21tdXRhdGl2ZTsKKyAgICAKKyAgICAvLy8gaXNJbmRpcmVjdCAtIFRydWUgaWYgdGhpcyBvcGVyYW5kIGlzIGFuIGluZGlyZWN0IG9wZXJhbmQuICBUaGlzIG1lYW5zCisgICAgLy8vIHRoYXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBpcyBwcmVzZW50IGluIHRoZSBjYWxsCisgICAgLy8vIGluc3RydWN0aW9uLCBpbnN0ZWFkIG9mIGl0IGJlaW5nIHJldHVybmVkIG9yIHBhc3NlZCBpbiBleHBsaWNpdGx5LiAgVGhpcworICAgIC8vLyBpcyByZXByZXNlbnRlZCB3aXRoIGEgJyonIGluIHRoZSBhc20gc3RyaW5nLgorICAgIGJvb2wgaXNJbmRpcmVjdDsKKyAgICAKKyAgICAvLy8gQ29kZSAtIFRoZSBjb25zdHJhaW50IGNvZGUsIGVpdGhlciB0aGUgcmVnaXN0ZXIgbmFtZSAoaW4gYnJhY2VzKSBvciB0aGUKKyAgICAvLy8gY29uc3RyYWludCBsZXR0ZXIvbnVtYmVyLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDb2RlczsKKyAgICAKKyAgICAvLy8gUGFyc2UgLSBBbmFseXplIHRoZSBzcGVjaWZpZWQgc3RyaW5nIChlLmcuICI9KiZ7ZWF4fSIpIGFuZCBmaWxsIGluIHRoZQorICAgIC8vLyBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3R1cmUuICBJZiB0aGUgY29uc3RyYWludCBzdHJpbmcgaXMgbm90IHVuZGVyc3Rvb2QsCisgICAgLy8vIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICAgIGJvb2wgUGFyc2UoU3RyaW5nUmVmIFN0ciwgCisgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJbmxpbmVBc206OkNvbnN0cmFpbnRJbmZvPiAmQ29uc3RyYWludHNTb0Zhcik7CisgIH07CisgIAorICAvLy8gUGFyc2VDb25zdHJhaW50cyAtIFNwbGl0IHVwIHRoZSBjb25zdHJhaW50IHN0cmluZyBpbnRvIHRoZSBzcGVjaWZpYworICAvLy8gY29uc3RyYWludHMgYW5kIHRoZWlyIHByZWZpeGVzLiAgSWYgdGhpcyByZXR1cm5zIGFuIGVtcHR5IHZlY3RvciwgYW5kIGlmCisgIC8vLyB0aGUgY29uc3RyYWludCBzdHJpbmcgaXRzZWxmIGlzbid0IGVtcHR5LCB0aGVyZSB3YXMgYW4gZXJyb3IgcGFyc2luZy4KKyAgc3RhdGljIHN0ZDo6dmVjdG9yPENvbnN0cmFpbnRJbmZvPiAKKyAgICBQYXJzZUNvbnN0cmFpbnRzKFN0cmluZ1JlZiBDb25zdHJhaW50U3RyaW5nKTsKKyAgCisgIC8vLyBQYXJzZUNvbnN0cmFpbnRzIC0gUGFyc2UgdGhlIGNvbnN0cmFpbnRzIG9mIHRoaXMgaW5saW5lYXNtIG9iamVjdCwgCisgIC8vLyByZXR1cm5pbmcgdGhlbSB0aGUgc2FtZSB3YXkgdGhhdCBQYXJzZUNvbnN0cmFpbnRzKHN0cikgZG9lcy4KKyAgc3RkOjp2ZWN0b3I8Q29uc3RyYWludEluZm8+IAorICBQYXJzZUNvbnN0cmFpbnRzKCkgY29uc3QgeworICAgIHJldHVybiBQYXJzZUNvbnN0cmFpbnRzKENvbnN0cmFpbnRzKTsKKyAgfQorICAKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5saW5lQXNtICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpJbmxpbmVBc21WYWw7CisgIH0KKworICAKKyAgLy8gVGhlc2UgYXJlIGhlbHBlciBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggZmxhZ3MgaW4gdGhlIElOTElORUFTTSBTRE5vZGUKKyAgLy8gaW4gdGhlIGJhY2tlbmQuCisgIAorICBlbnVtIHsKKyAgICBPcF9JbnB1dENoYWluID0gMCwKKyAgICBPcF9Bc21TdHJpbmcgPSAxLAorICAgIE9wX01ETm9kZSA9IDIsCisgICAgT3BfSXNBbGlnblN0YWNrID0gMywKKyAgICBPcF9GaXJzdE9wZXJhbmQgPSA0LAorICAgIAorICAgIEtpbmRfUmVnVXNlID0gMSwKKyAgICBLaW5kX1JlZ0RlZiA9IDIsCisgICAgS2luZF9JbW0gPSAzLAorICAgIEtpbmRfTWVtID0gNCwKKyAgICBLaW5kX1JlZ0RlZkVhcmx5Q2xvYmJlciA9IDYsCisgICAgCisgICAgRmxhZ19NYXRjaGluZ09wZXJhbmQgPSAweDgwMDAwMDAwCisgIH07CisgIAorICBzdGF0aWMgdW5zaWduZWQgZ2V0RmxhZ1dvcmQodW5zaWduZWQgS2luZCwgdW5zaWduZWQgTnVtT3BzKSB7CisgICAgYXNzZXJ0KCgoTnVtT3BzIDw8IDMpICYgfjB4ZmZmZikgPT0gMCAmJiAiVG9vIG1hbnkgaW5saW5lIGFzbSBvcGVyYW5kcyEiKTsKKyAgICByZXR1cm4gS2luZCB8IChOdW1PcHMgPDwgMyk7CisgIH0KKyAgCisgIC8vLyBnZXRGbGFnV29yZEZvck1hdGNoaW5nT3AgLSBBdWdtZW50IGFuIGV4aXN0aW5nIGZsYWcgd29yZCByZXR1cm5lZCBieQorICAvLy8gZ2V0RmxhZ1dvcmQgd2l0aCBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpbnB1dCBvcGVyYW5kIGlzIHRpZWQgCisgIC8vLyB0byBhIHByZXZpb3VzIG91dHB1dCBvcGVyYW5kLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0RmxhZ1dvcmRGb3JNYXRjaGluZ09wKHVuc2lnbmVkIElucHV0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXRjaGVkT3BlcmFuZE5vKSB7CisgICAgcmV0dXJuIElucHV0RmxhZyB8IEZsYWdfTWF0Y2hpbmdPcGVyYW5kIHwgKE1hdGNoZWRPcGVyYW5kTm8gPDwgMTYpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEtpbmQodW5zaWduZWQgRmxhZ3MpIHsKKyAgICByZXR1cm4gRmxhZ3MgJiA3OworICB9CisKKyAgc3RhdGljIGJvb2wgaXNSZWdEZWZLaW5kKHVuc2lnbmVkIEZsYWcpeyByZXR1cm4gZ2V0S2luZChGbGFnKSA9PSBLaW5kX1JlZ0RlZjt9CisgIHN0YXRpYyBib29sIGlzSW1tS2luZCh1bnNpZ25lZCBGbGFnKSB7IHJldHVybiBnZXRLaW5kKEZsYWcpID09IEtpbmRfSW1tOyB9CisgIHN0YXRpYyBib29sIGlzTWVtS2luZCh1bnNpZ25lZCBGbGFnKSB7IHJldHVybiBnZXRLaW5kKEZsYWcpID09IEtpbmRfTWVtOyB9CisgIHN0YXRpYyBib29sIGlzUmVnRGVmRWFybHlDbG9iYmVyS2luZCh1bnNpZ25lZCBGbGFnKSB7CisgICAgcmV0dXJuIGdldEtpbmQoRmxhZykgPT0gS2luZF9SZWdEZWZFYXJseUNsb2JiZXI7CisgIH0KKyAgCisgIC8vLyBnZXROdW1PcGVyYW5kUmVnaXN0ZXJzIC0gRXh0cmFjdCB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBmaWVsZCBmcm9tIHRoZQorICAvLy8gaW5saW5lIGFzbSBvcGVyYW5kIGZsYWcuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXROdW1PcGVyYW5kUmVnaXN0ZXJzKHVuc2lnbmVkIEZsYWcpIHsKKyAgICByZXR1cm4gKEZsYWcgJiAweGZmZmYpID4+IDM7CisgIH0KKworICAvLy8gaXNVc2VPcGVyYW5kVGllZFRvRGVmIC0gUmV0dXJuIHRydWUgaWYgdGhlIGZsYWcgb2YgdGhlIGlubGluZSBhc20KKyAgLy8vIG9wZXJhbmQgaW5kaWNhdGVzIGl0IGlzIGFuIHVzZSBvcGVyYW5kIHRoYXQncyBtYXRjaGVkIHRvIGEgZGVmIG9wZXJhbmQuCisgIHN0YXRpYyBib29sIGlzVXNlT3BlcmFuZFRpZWRUb0RlZih1bnNpZ25lZCBGbGFnLCB1bnNpZ25lZCAmSWR4KSB7CisgICAgaWYgKChGbGFnICYgRmxhZ19NYXRjaGluZ09wZXJhbmQpID09IDApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgSWR4ID0gKEZsYWcgJiB+RmxhZ19NYXRjaGluZ09wZXJhbmQpID4+IDE2OworICAgIHJldHVybiB0cnVlOworICB9CisKKworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW5zdHJUeXBlcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0luc3RyVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM2ZTgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0luc3RyVHlwZXMuaApAQCAtMCwwICsxLDg4NSBAQAorLy89PT0tLSBsbHZtL0luc3RyVHlwZXMuaCAtIEltcG9ydGFudCBJbnN0cnVjdGlvbiBzdWJjbGFzc2VzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB2YXJpb3VzIG1ldGEgY2xhc3NlcyBvZiBpbnN0cnVjdGlvbnMgdGhhdCBleGlzdCBpbiB0aGUgVk0KKy8vIHJlcHJlc2VudGF0aW9uLiAgU3BlY2lmaWMgY29uY3JldGUgc3ViY2xhc3NlcyBvZiB0aGVzZSBtYXkgYmUgZm91bmQgaW4gdGhlCisvLyBpKi5oIGZpbGVzLi4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lOU1RSVUNUSU9OX1RZUEVTX0gKKyNkZWZpbmUgTExWTV9JTlNUUlVDVElPTl9UWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9PcGVyYW5kVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMTFZNQ29udGV4dDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlcm1pbmF0b3JJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGVybWluYXRvckluc3QgLSBTdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MgYXJlIGFsbCBhYmxlIHRvIHRlcm1pbmF0ZSBhIGJhc2ljCisvLy8gYmxvY2suICBUaHVzLCB0aGVzZSBhcmUgYWxsIHRoZSBmbG93IGNvbnRyb2wgdHlwZSBvZiBvcGVyYXRpb25zLgorLy8vCitjbGFzcyBUZXJtaW5hdG9ySW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIFRlcm1pbmF0b3JJbnN0KGNvbnN0IFR5cGUgKlR5LCBJbnN0cnVjdGlvbjo6VGVybU9wcyBpVHlwZSwKKyAgICAgICAgICAgICAgICAgVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApCisgICAgOiBJbnN0cnVjdGlvbihUeSwgaVR5cGUsIE9wcywgTnVtT3BzLCBJbnNlcnRCZWZvcmUpIHt9CisKKyAgVGVybWluYXRvckluc3QoY29uc3QgVHlwZSAqVHksIEluc3RydWN0aW9uOjpUZXJtT3BzIGlUeXBlLAorICAgICAgICAgICAgICAgICBVc2UgKk9wcywgdW5zaWduZWQgTnVtT3BzLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgICA6IEluc3RydWN0aW9uKFR5LCBpVHlwZSwgT3BzLCBOdW1PcHMsIEluc2VydEF0RW5kKSB7fQorCisgIC8vIE91dCBvZiBsaW5lIHZpcnR1YWwgbWV0aG9kLCBzbyB0aGUgdnRhYmxlLCBldGMgaGFzIGEgaG9tZS4KKyAgflRlcm1pbmF0b3JJbnN0KCk7CisKKyAgLy8vIFZpcnR1YWwgbWV0aG9kcyAtIFRlcm1pbmF0b3JzIHNob3VsZCBvdmVybG9hZCB0aGVzZSBhbmQgcHJvdmlkZSBpbmxpbmUKKyAgLy8vIG92ZXJyaWRlcyBvZiBub24tViBtZXRob2RzLgorICB2aXJ0dWFsIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3NvclYodW5zaWduZWQgaWR4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29yc1YoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBzZXRTdWNjZXNzb3JWKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqQikgPSAwOworICB2aXJ0dWFsIFRlcm1pbmF0b3JJbnN0ICpjbG9uZV9pbXBsKCkgY29uc3QgPSAwOworcHVibGljOgorCisgIC8vLyBnZXROdW1TdWNjZXNzb3JzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc29ycyB0aGF0IHRoaXMgdGVybWluYXRvcgorICAvLy8gaGFzLgorICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1TdWNjZXNzb3JzVigpOworICB9CisKKyAgLy8vIGdldFN1Y2Nlc3NvciAtIFJldHVybiB0aGUgc3BlY2lmaWVkIHN1Y2Nlc3Nvci4KKyAgLy8vCisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3VjY2Vzc29yVihpZHgpOworICB9CisKKyAgLy8vIHNldFN1Y2Nlc3NvciAtIFVwZGF0ZSB0aGUgc3BlY2lmaWVkIHN1Y2Nlc3NvciB0byBwb2ludCBhdCB0aGUgcHJvdmlkZWQKKyAgLy8vIGJsb2NrLgorICB2b2lkIHNldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgsIEJhc2ljQmxvY2sgKkIpIHsKKyAgICBzZXRTdWNjZXNzb3JWKGlkeCwgQik7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBUZXJtaW5hdG9ySW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmlzVGVybWluYXRvcigpOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBVbmFyeUluc3RydWN0aW9uIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBVbmFyeUluc3RydWN0aW9uIDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdW5zaWduZWQpOyAgICAgIC8vIERvIG5vdCBpbXBsZW1lbnQKKworcHJvdGVjdGVkOgorICBVbmFyeUluc3RydWN0aW9uKGNvbnN0IFR5cGUgKlR5LCB1bnNpZ25lZCBpVHlwZSwgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKklCID0gMCkKKyAgICA6IEluc3RydWN0aW9uKFR5LCBpVHlwZSwgJk9wPDA+KCksIDEsIElCKSB7CisgICAgT3A8MD4oKSA9IFY7CisgIH0KKyAgVW5hcnlJbnN0cnVjdGlvbihjb25zdCBUeXBlICpUeSwgdW5zaWduZWQgaVR5cGUsIFZhbHVlICpWLCBCYXNpY0Jsb2NrICpJQUUpCisgICAgOiBJbnN0cnVjdGlvbihUeSwgaVR5cGUsICZPcDwwPigpLCAxLCBJQUUpIHsKKyAgICBPcDwwPigpID0gVjsKKyAgfQorcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSBvbmUgb3BlcmFuZAorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDEpOworICB9CisKKyAgLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QsIHNvIHRoZSB2dGFibGUsIGV0YyBoYXMgYSBob21lLgorICB+VW5hcnlJbnN0cnVjdGlvbigpOworCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBVbmFyeUluc3RydWN0aW9uICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFsbG9jYSB8fAorICAgICAgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TG9hZCB8fAorICAgICAgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RXh0cmFjdFZhbHVlIHx8CisgICAgICAgICAgIChJLT5nZXRPcGNvZGUoKSA+PSBDYXN0T3BzQmVnaW4gJiYgSS0+Z2V0T3Bjb2RlKCkgPCBDYXN0T3BzRW5kKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8VW5hcnlJbnN0cnVjdGlvbj4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDE+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhVbmFyeUluc3RydWN0aW9uLCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIEJpbmFyeU9wZXJhdG9yIDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdW5zaWduZWQpOyAvLyBEbyBub3QgaW1wbGVtZW50Citwcm90ZWN0ZWQ6CisgIHZvaWQgaW5pdChCaW5hcnlPcHMgaVR5cGUpOworICBCaW5hcnlPcGVyYXRvcihCaW5hcnlPcHMgaVR5cGUsIFZhbHVlICpTMSwgVmFsdWUgKlMyLCBjb25zdCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIEJpbmFyeU9wZXJhdG9yKEJpbmFyeU9wcyBpVHlwZSwgVmFsdWUgKlMxLCBWYWx1ZSAqUzIsIGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIHZpcnR1YWwgQmluYXJ5T3BlcmF0b3IgKmNsb25lX2ltcGwoKSBjb25zdDsKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgdHdvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMik7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIENyZWF0ZSgpIC0gQ29uc3RydWN0IGEgYmluYXJ5IGluc3RydWN0aW9uLCBnaXZlbiB0aGUgb3Bjb2RlIGFuZCB0aGUgdHdvCisgIC8vLyBvcGVyYW5kcy4gIE9wdGlvbmFsbHkgKGlmIEluc3RCZWZvcmUgaXMgc3BlY2lmaWVkKSBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgIC8vLyBpbnRvIGEgQmFzaWNCbG9jayByaWdodCBiZWZvcmUgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4gIFRoZSBzcGVjaWZpZWQKKyAgLy8vIEluc3RydWN0aW9uIGlzIGFsbG93ZWQgdG8gYmUgYSBkZXJlZmVyZW5jZWQgZW5kIGl0ZXJhdG9yLgorICAvLy8KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUoQmluYXJ5T3BzIE9wLCBWYWx1ZSAqUzEsIFZhbHVlICpTMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworCisgIC8vLyBDcmVhdGUoKSAtIENvbnN0cnVjdCBhIGJpbmFyeSBpbnN0cnVjdGlvbiwgZ2l2ZW4gdGhlIG9wY29kZSBhbmQgdGhlIHR3bworICAvLy8gb3BlcmFuZHMuICBBbHNvIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IHRoaXMgaW5zdHJ1Y3Rpb24gdG8gdGhlIGVuZCBvZiB0aGUKKyAgLy8vIEJhc2ljQmxvY2sgc3BlY2lmaWVkLgorICAvLy8KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUoQmluYXJ5T3BzIE9wLCBWYWx1ZSAqUzEsIFZhbHVlICpTMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vLyBDcmVhdGUqIC0gVGhlc2UgbWV0aG9kcyBqdXN0IGZvcndhcmQgdG8gQ3JlYXRlLCBhbmQgYXJlIHVzZWZ1bCB3aGVuIHlvdQorICAvLy8gc3RhdGljYWxseSBrbm93IHdoYXQgdHlwZSBvZiBpbnN0cnVjdGlvbiB5b3UncmUgZ29pbmcgdG8gY3JlYXRlLiAgVGhlc2UKKyAgLy8vIGhlbHBlcnMganVzdCBzYXZlIHNvbWUgdHlwaW5nLgorI2RlZmluZSBIQU5ETEVfQklOQVJZX0lOU1QoTiwgT1BDLCBDTEFTUykgXAorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZSMjT1BDKFZhbHVlICpWMSwgVmFsdWUgKlYyKSB7XAorICAgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246Ok9QQywgVjEsIFYyKTtcCisgIH0KKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmRlZiIKKyNkZWZpbmUgSEFORExFX0JJTkFSWV9JTlNUKE4sIE9QQywgQ0xBU1MpIFwKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUjI09QQyhWYWx1ZSAqVjEsIFZhbHVlICpWMiwgQmFzaWNCbG9jayAqQkIpIHtcCisgICAgcmV0dXJuIENyZWF0ZShJbnN0cnVjdGlvbjo6T1BDLCBWMSwgVjIsIEJCKTtcCisgIH0KKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmRlZiIKKyNkZWZpbmUgSEFORExFX0JJTkFSWV9JTlNUKE4sIE9QQywgQ0xBU1MpIFwKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUjI09QQyhWYWx1ZSAqVjEsIFZhbHVlICpWMiwgSW5zdHJ1Y3Rpb24gKkkpIHtcCisgICAgcmV0dXJuIENyZWF0ZShJbnN0cnVjdGlvbjo6T1BDLCBWMSwgVjIsIEkpO1wKKyAgfQorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb24uZGVmIgorCisKKyAgLy8vIENyZWF0ZU5TV0FkZCAtIENyZWF0ZSBhbiBBZGQgb3BlcmF0b3Igd2l0aCB0aGUgTlNXIGZsYWcgc2V0LgorICAvLy8KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOU1dBZGQoVmFsdWUgKlYxLCBWYWx1ZSAqVjIpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGVBZGQoVjEsIFYyKTsKKyAgICBCTy0+c2V0SGFzTm9TaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5TV0FkZChWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQikgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZUFkZChWMSwgVjIsIEJCKTsKKyAgICBCTy0+c2V0SGFzTm9TaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5TV0FkZChWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGVBZGQoVjEsIFYyLCBJKTsKKyAgICBCTy0+c2V0SGFzTm9TaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIC8vLyBDcmVhdGVOVVdBZGQgLSBDcmVhdGUgYW4gQWRkIG9wZXJhdG9yIHdpdGggdGhlIE5VVyBmbGFnIHNldC4KKyAgLy8vCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlVXQWRkKFZhbHVlICpWMSwgVmFsdWUgKlYyKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlQWRkKFYxLCBWMik7CisgICAgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5VV0FkZChWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlQWRkKFYxLCBWMiwgQkIpOworICAgIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOVVdBZGQoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlQWRkKFYxLCBWMiwgSSk7CisgICAgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIC8vLyBDcmVhdGVOU1dTdWIgLSBDcmVhdGUgYW4gU3ViIG9wZXJhdG9yIHdpdGggdGhlIE5TVyBmbGFnIHNldC4KKyAgLy8vCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlNXU3ViKFZhbHVlICpWMSwgVmFsdWUgKlYyKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlU3ViKFYxLCBWMik7CisgICAgQk8tPnNldEhhc05vU2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOU1dTdWIoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlU3ViKFYxLCBWMiwgQkIpOworICAgIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlNXU3ViKFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSSkgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZVN1YihWMSwgVjIsIEkpOworICAgIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisKKyAgLy8vIENyZWF0ZU5VV1N1YiAtIENyZWF0ZSBhbiBTdWIgb3BlcmF0b3Igd2l0aCB0aGUgTlVXIGZsYWcgc2V0LgorICAvLy8KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOVVdTdWIoVmFsdWUgKlYxLCBWYWx1ZSAqVjIpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGVTdWIoVjEsIFYyKTsKKyAgICBCTy0+c2V0SGFzTm9VbnNpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlVXU3ViKFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQikgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZVN1YihWMSwgVjIsIEJCKTsKKyAgICBCTy0+c2V0SGFzTm9VbnNpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlVXU3ViKFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSSkgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZVN1YihWMSwgVjIsIEkpOworICAgIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKworICAvLy8gQ3JlYXRlTlNXTXVsIC0gQ3JlYXRlIGEgTXVsIG9wZXJhdG9yIHdpdGggdGhlIE5TVyBmbGFnIHNldC4KKyAgLy8vCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlNXTXVsKFZhbHVlICpWMSwgVmFsdWUgKlYyKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlTXVsKFYxLCBWMik7CisgICAgQk8tPnNldEhhc05vU2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOU1dNdWwoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlTXVsKFYxLCBWMiwgQkIpOworICAgIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlNXTXVsKFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSSkgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZU11bChWMSwgVjIsIEkpOworICAgIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisKKyAgLy8vIENyZWF0ZU5VV011bCAtIENyZWF0ZSBhIE11bCBvcGVyYXRvciB3aXRoIHRoZSBOVVcgZmxhZyBzZXQuCisgIC8vLworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5VV011bChWYWx1ZSAqVjEsIFZhbHVlICpWMikgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZU11bChWMSwgVjIpOworICAgIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOVVdNdWwoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlTXVsKFYxLCBWMiwgQkIpOworICAgIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOVVdNdWwoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlTXVsKFYxLCBWMiwgSSk7CisgICAgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIC8vLyBDcmVhdGVFeGFjdFNEaXYgLSBDcmVhdGUgYW4gU0RpdiBvcGVyYXRvciB3aXRoIHRoZSBleGFjdCBmbGFnIHNldC4KKyAgLy8vCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRXhhY3RTRGl2KFZhbHVlICpWMSwgVmFsdWUgKlYyKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlU0RpdihWMSwgVjIpOworICAgIEJPLT5zZXRJc0V4YWN0KHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZUV4YWN0U0RpdihWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqQkIpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGVTRGl2KFYxLCBWMiwgQkIpOworICAgIEJPLT5zZXRJc0V4YWN0KHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZUV4YWN0U0RpdihWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGVTRGl2KFYxLCBWMiwgSSk7CisgICAgQk8tPnNldElzRXhhY3QodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbnMgdG8gY29uc3RydWN0IGFuZCBpbnNwZWN0IHVuYXJ5IG9wZXJhdGlvbnMgKE5FRyBhbmQgTk9UKQorICAvLy8gdmlhIGJpbmFyeSBvcGVyYXRvcnMgU1VCIGFuZCBYT1I6CisgIC8vLworICAvLy8gQ3JlYXRlTmVnLCBDcmVhdGVOb3QgLSBDcmVhdGUgdGhlIE5FRyBhbmQgTk9UCisgIC8vLyAgICAgaW5zdHJ1Y3Rpb25zIG91dCBvZiBTVUIgYW5kIFhPUiBpbnN0cnVjdGlvbnMuCisgIC8vLworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5lZyhWYWx1ZSAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKTsKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlNXTmVnKFZhbHVlICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5TV05lZyhWYWx1ZSAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOVVdOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCk7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlVXTmVnKFZhbHVlICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZUZOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZUZOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5vdChWYWx1ZSAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKTsKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOb3QoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8vIGlzTmVnLCBpc0ZOZWcsIGlzTm90IC0gQ2hlY2sgaWYgdGhlIGdpdmVuIFZhbHVlIGlzIGEKKyAgLy8vIE5FRywgRk5lZywgb3IgTk9UIGluc3RydWN0aW9uLgorICAvLy8KKyAgc3RhdGljIGJvb2wgaXNOZWcoY29uc3QgVmFsdWUgKlYpOworICBzdGF0aWMgYm9vbCBpc0ZOZWcoY29uc3QgVmFsdWUgKlYpOworICBzdGF0aWMgYm9vbCBpc05vdChjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIGdldE5lZ0FyZ3VtZW50LCBnZXROb3RBcmd1bWVudCAtIEhlbHBlciBmdW5jdGlvbnMgdG8gZXh0cmFjdCB0aGUKKyAgLy8vICAgICB1bmFyeSBhcmd1bWVudCBvZiBhIE5FRywgRk5FRyBvciBOT1Qgb3BlcmF0aW9uIGltcGxlbWVudGVkIHZpYQorICAvLy8gICAgIFN1YiwgRlN1Yiwgb3IgWG9yLgorICAvLy8KKyAgc3RhdGljIGNvbnN0IFZhbHVlICpnZXROZWdBcmd1bWVudChjb25zdCBWYWx1ZSAqQmluT3ApOworICBzdGF0aWMgICAgICAgVmFsdWUgKmdldE5lZ0FyZ3VtZW50KCAgICAgIFZhbHVlICpCaW5PcCk7CisgIHN0YXRpYyBjb25zdCBWYWx1ZSAqZ2V0Rk5lZ0FyZ3VtZW50KGNvbnN0IFZhbHVlICpCaW5PcCk7CisgIHN0YXRpYyAgICAgICBWYWx1ZSAqZ2V0Rk5lZ0FyZ3VtZW50KCAgICAgIFZhbHVlICpCaW5PcCk7CisgIHN0YXRpYyBjb25zdCBWYWx1ZSAqZ2V0Tm90QXJndW1lbnQoY29uc3QgVmFsdWUgKkJpbk9wKTsKKyAgc3RhdGljICAgICAgIFZhbHVlICpnZXROb3RBcmd1bWVudCggICAgICBWYWx1ZSAqQmluT3ApOworCisgIEJpbmFyeU9wcyBnZXRPcGNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEJpbmFyeU9wcz4oSW5zdHJ1Y3Rpb246OmdldE9wY29kZSgpKTsKKyAgfQorCisgIC8vLyBzd2FwT3BlcmFuZHMgLSBFeGNoYW5nZSB0aGUgdHdvIG9wZXJhbmRzIHRvIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGlzIGluc3RydWN0aW9uIGlzIHNhZmUgdG8gdXNlIG9uIGFueSBiaW5hcnkgaW5zdHJ1Y3Rpb24gYW5kCisgIC8vLyBkb2VzIG5vdCBtb2RpZnkgdGhlIHNlbWFudGljcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIGNhbm5vdCBiZSByZXZlcnNlZCAoaWUsIGl0J3MgYSBEaXYpLCB0aGVuIHJldHVybiB0cnVlLgorICAvLy8KKyAgYm9vbCBzd2FwT3BlcmFuZHMoKTsKKworICAvLy8gc2V0SGFzTm9VbnNpZ25lZFdyYXAgLSBTZXQgb3IgY2xlYXIgdGhlIG5zdyBmbGFnIG9uIHRoaXMgaW5zdHJ1Y3Rpb24sCisgIC8vLyB3aGljaCBtdXN0IGJlIGFuIG9wZXJhdG9yIHdoaWNoIHN1cHBvcnRzIHRoaXMgZmxhZy4gU2VlIExhbmdSZWYuaHRtbAorICAvLy8gZm9yIHRoZSBtZWFuaW5nIG9mIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRIYXNOb1Vuc2lnbmVkV3JhcChib29sIGIgPSB0cnVlKTsKKworICAvLy8gc2V0SGFzTm9TaWduZWRXcmFwIC0gU2V0IG9yIGNsZWFyIHRoZSBuc3cgZmxhZyBvbiB0aGlzIGluc3RydWN0aW9uLAorICAvLy8gd2hpY2ggbXVzdCBiZSBhbiBvcGVyYXRvciB3aGljaCBzdXBwb3J0cyB0aGlzIGZsYWcuIFNlZSBMYW5nUmVmLmh0bWwKKyAgLy8vIGZvciB0aGUgbWVhbmluZyBvZiB0aGlzIGZsYWcuCisgIHZvaWQgc2V0SGFzTm9TaWduZWRXcmFwKGJvb2wgYiA9IHRydWUpOworCisgIC8vLyBzZXRJc0V4YWN0IC0gU2V0IG9yIGNsZWFyIHRoZSBleGFjdCBmbGFnIG9uIHRoaXMgaW5zdHJ1Y3Rpb24sCisgIC8vLyB3aGljaCBtdXN0IGJlIGFuIG9wZXJhdG9yIHdoaWNoIHN1cHBvcnRzIHRoaXMgZmxhZy4gU2VlIExhbmdSZWYuaHRtbAorICAvLy8gZm9yIHRoZSBtZWFuaW5nIG9mIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRJc0V4YWN0KGJvb2wgYiA9IHRydWUpOworCisgIC8vLyBoYXNOb1Vuc2lnbmVkV3JhcCAtIERldGVybWluZSB3aGV0aGVyIHRoZSBubyB1bnNpZ25lZCB3cmFwIGZsYWcgaXMgc2V0LgorICBib29sIGhhc05vVW5zaWduZWRXcmFwKCkgY29uc3Q7CisKKyAgLy8vIGhhc05vU2lnbmVkV3JhcCAtIERldGVybWluZSB3aGV0aGVyIHRoZSBubyBzaWduZWQgd3JhcCBmbGFnIGlzIHNldC4KKyAgYm9vbCBoYXNOb1NpZ25lZFdyYXAoKSBjb25zdDsKKworICAvLy8gaXNFeGFjdCAtIERldGVybWluZSB3aGV0aGVyIHRoZSBleGFjdCBmbGFnIGlzIHNldC4KKyAgYm9vbCBpc0V4YWN0KCkgY29uc3Q7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgQmluYXJ5T3BlcmF0b3IgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5pc0JpbmFyeU9wKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEJpbmFyeU9wZXJhdG9yPiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8Mj4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEJpbmFyeU9wZXJhdG9yLCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQ2FzdEluc3QgLSBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgaW5zdHJ1Y3Rpb25zIHRoYXQgcGVyZm9ybSBkYXRhCisvLy8gY2FzdHMuIEl0IGlzIHNpbXBseSBwcm92aWRlZCBzbyB0aGF0IGluc3RydWN0aW9uIGNhdGVnb3J5IHRlc3RpbmcKKy8vLyBjYW4gYmUgcGVyZm9ybWVkIHdpdGggY29kZSBsaWtlOgorLy8vCisvLy8gaWYgKGlzYTxDYXN0SW5zdD4oSW5zdHIpKSB7IC4uLiB9CisvLy8gQGJyaWVmIEJhc2UgY2xhc3Mgb2YgY2FzdGluZyBpbnN0cnVjdGlvbnMuCitjbGFzcyBDYXN0SW5zdCA6IHB1YmxpYyBVbmFyeUluc3RydWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzIGZvciBzdWJjbGFzc2VzCisgIENhc3RJbnN0KGNvbnN0IFR5cGUgKlR5LCB1bnNpZ25lZCBpVHlwZSwgVmFsdWUgKlMsCisgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKQorICAgIDogVW5hcnlJbnN0cnVjdGlvbihUeSwgaVR5cGUsIFMsIEluc2VydEJlZm9yZSkgeworICB9CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcyBmb3Igc3ViY2xhc3NlcworICBDYXN0SW5zdChjb25zdCBUeXBlICpUeSwgdW5zaWduZWQgaVR5cGUsIFZhbHVlICpTLAorICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oVHksIGlUeXBlLCBTLCBJbnNlcnRBdEVuZCkgeworICB9CitwdWJsaWM6CisgIC8vLyBQcm92aWRlcyBhIHdheSB0byBjb25zdHJ1Y3QgYW55IG9mIHRoZSBDYXN0SW5zdCBzdWJjbGFzc2VzIHVzaW5nIGFuCisgIC8vLyBvcGNvZGUgaW5zdGVhZCBvZiB0aGUgc3ViY2xhc3MncyBjb25zdHJ1Y3Rvci4gVGhlIG9wY29kZSBtdXN0IGJlIGluIHRoZQorICAvLy8gQ2FzdE9wcyBjYXRlZ29yeSAoSW5zdHJ1Y3Rpb246OmlzQ2FzdChvcGNvZGUpIHJldHVybnMgdHJ1ZSkuIFRoaXMKKyAgLy8vIGNvbnN0cnVjdG9yIGhhcyBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcyB0byBhdXRvbWF0aWNhbGx5CisgIC8vLyBpbnNlcnQgdGhlIG5ldyBDYXN0SW5zdCBiZWZvcmUgSW5zZXJ0QmVmb3JlIChpZiBpdCBpcyBub24tbnVsbCkuCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFueSBvZiB0aGUgQ2FzdEluc3Qgc3ViY2xhc3NlcworICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZSgKKyAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcywgICAgLy8vPCBUaGUgb3Bjb2RlIG9mIHRoZSBjYXN0IGluc3RydWN0aW9uCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIGNhc3Qgc2hvdWxkIGJlIG1hZGUKKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCAvLy88IFBsYWNlIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24KKyAgKTsKKyAgLy8vIFByb3ZpZGVzIGEgd2F5IHRvIGNvbnN0cnVjdCBhbnkgb2YgdGhlIENhc3RJbnN0IHN1YmNsYXNzZXMgdXNpbmcgYW4KKyAgLy8vIG9wY29kZSBpbnN0ZWFkIG9mIHRoZSBzdWJjbGFzcydzIGNvbnN0cnVjdG9yLiBUaGUgb3Bjb2RlIG11c3QgYmUgaW4gdGhlCisgIC8vLyBDYXN0T3BzIGNhdGVnb3J5LiBUaGlzIGNvbnN0cnVjdG9yIGhhcyBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICAvLy8gdG8gYXV0b21hdGljYWxseSBpbnNlcnQgdGhlIG5ldyBDYXN0SW5zdCBhdCB0aGUgZW5kIG9mIEluc2VydEF0RW5kIChpZgorICAvLy8gaXRzIG5vbi1udWxsKS4KKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW55IG9mIHRoZSBDYXN0SW5zdCBzdWJjbGFzc2VzCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlKAorICAgIEluc3RydWN0aW9uOjpDYXN0T3BzLCAgICAvLy88IFRoZSBvcGNvZGUgZm9yIHRoZSBjYXN0IGluc3RydWN0aW9uCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgWkV4dCBvciBCaXRDYXN0IGNhc3QgaW5zdHJ1Y3Rpb24KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVaRXh0T3JCaXRDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBjYXN0IHNob3VsZCBiZSBtYWRlCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDAgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBaRXh0IG9yIEJpdENhc3QgY2FzdCBpbnN0cnVjdGlvbgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVpFeHRPckJpdENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgU0V4dCBvciBCaXRDYXN0IGNhc3QgaW5zdHJ1Y3Rpb24KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVTRXh0T3JCaXRDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBjYXN0IHNob3VsZCBiZSBtYWRlCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDAgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBTRXh0IG9yIEJpdENhc3QgY2FzdCBpbnN0cnVjdGlvbgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVNFeHRPckJpdENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgQml0Q2FzdCBvciBhIFB0clRvSW50IGNhc3QgaW5zdHJ1Y3Rpb24KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVQb2ludGVyQ2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgcG9pbnRlciB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBvcGVyYW5kIGlzIGNhc3RlZAorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIEJpdENhc3Qgb3IgYSBQdHJUb0ludCBjYXN0IGluc3RydWN0aW9uCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlUG9pbnRlckNhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHBvaW50ZXIgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwIC8vLzwgUGxhY2UgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgWkV4dCwgQml0Q2FzdCwgb3IgVHJ1bmMgZm9yIGludCAtPiBpbnQgY2FzdHMuCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlSW50ZWdlckNhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHBvaW50ZXIgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIGJvb2wgaXNTaWduZWQsICAgICAgICAgICAvLy88IFdoZXRoZXIgdG8gcmVnYXJkIFMgYXMgc2lnbmVkIG9yIG5vdAorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwIC8vLzwgUGxhY2UgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgWkV4dCwgQml0Q2FzdCwgb3IgVHJ1bmMgZm9yIGludCAtPiBpbnQgY2FzdHMuCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlSW50ZWdlckNhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIGludGVnZXIgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIGludGVnZXIgdHlwZSB0byB3aGljaCBvcGVyYW5kIGlzIGNhc3RlZAorICAgIGJvb2wgaXNTaWduZWQsICAgICAgICAgICAvLy88IFdoZXRoZXIgdG8gcmVnYXJkIFMgYXMgc2lnbmVkIG9yIG5vdAorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhbiBGUEV4dCwgQml0Q2FzdCwgb3IgRlBUcnVuYyBmb3IgZnAgLT4gZnAgY2FzdHMKKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVGUENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIGJlIGNhc3RlZAorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSBmbG9hdGluZyBwb2ludCB0eXBlIHRvIGNhc3QgdG8KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCAvLy88IFBsYWNlIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhbiBGUEV4dCwgQml0Q2FzdCwgb3IgRlBUcnVuYyBmb3IgZnAgLT4gZnAgY2FzdHMKKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVGUENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIGJlIGNhc3RlZAorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSBmbG9hdGluZyBwb2ludCB0eXBlIHRvIGNhc3QgdG8KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBUcnVuYyBvciBCaXRDYXN0IGNhc3QgaW5zdHJ1Y3Rpb24KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVUcnVuY09yQml0Q2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwIC8vLzwgUGxhY2UgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgVHJ1bmMgb3IgQml0Q2FzdCBjYXN0IGluc3RydWN0aW9uCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlVHJ1bmNPckJpdENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgQ2hlY2sgd2hldGhlciBpdCBpcyB2YWxpZCB0byBjYWxsIGdldENhc3RPcGNvZGUgZm9yIHRoZXNlIHR5cGVzLgorICBzdGF0aWMgYm9vbCBpc0Nhc3RhYmxlKAorICAgIGNvbnN0IFR5cGUgKlNyY1R5LCAvLy88IFRoZSBUeXBlIGZyb20gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBjYXN0LgorICAgIGNvbnN0IFR5cGUgKkRlc3RUeSAvLy88IFRoZSBUeXBlIHRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgY2FzdC4KKyAgKTsKKworICAvLy8gUmV0dXJucyB0aGUgb3Bjb2RlIG5lY2Vzc2FyeSB0byBjYXN0IFZhbCBpbnRvIFR5IHVzaW5nIHVzdWFsIGNhc3RpbmcKKyAgLy8vIHJ1bGVzLgorICAvLy8gQGJyaWVmIEluZmVyIHRoZSBvcGNvZGUgZm9yIGNhc3Qgb3BlcmFuZCBhbmQgdHlwZQorICBzdGF0aWMgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgZ2V0Q2FzdE9wY29kZSgKKyAgICBjb25zdCBWYWx1ZSAqVmFsLCAvLy88IFRoZSB2YWx1ZSB0byBjYXN0CisgICAgYm9vbCBTcmNJc1NpZ25lZCwgLy8vPCBXaGV0aGVyIHRvIHRyZWF0IHRoZSBzb3VyY2UgYXMgc2lnbmVkCisgICAgY29uc3QgVHlwZSAqVHksICAgLy8vPCBUaGUgVHlwZSB0byB3aGljaCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNhc3RlZAorICAgIGJvb2wgRHN0SXNTaWduZWQgIC8vLzwgV2hldGhlciB0byB0cmVhdGUgdGhlIGRlc3QuIGFzIHNpZ25lZAorICApOworCisgIC8vLyBUaGVyZSBhcmUgc2V2ZXJhbCBwbGFjZXMgd2hlcmUgd2UgbmVlZCB0byBrbm93IGlmIGEgY2FzdCBpbnN0cnVjdGlvbgorICAvLy8gb25seSBkZWFscyB3aXRoIGludGVnZXIgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0eXBlcy4gVG8gc2ltcGxpZnkgdGhhdAorICAvLy8gbG9naWMsIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIGNhc3QgaGFzIG9ubHkgaW50ZWdyYWwgdHlwZWQgb3BlcmFuZCBhbmQgZGVzdCB0eXBlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIGFuIGludGVnZXItb25seSBjYXN0LgorICBib29sIGlzSW50ZWdlckNhc3QoKSBjb25zdDsKKworICAvLy8gQSBsb3NzbGVzcyBjYXN0IGlzIG9uZSB0aGF0IGRvZXMgbm90IGFsdGVyIHRoZSBiYXNpYyB2YWx1ZS4gSXQgaW1wbGllcworICAvLy8gYSBuby1vcCBjYXN0IGJ1dCBpcyBtb3JlIHN0cmluZ2VudCwgcHJldmVudGluZyB0aGluZ3MgbGlrZSBpbnQtPmZsb2F0LAorICAvLy8gbG9uZy0+ZG91YmxlLCBvciBpbnQtPnB0ci4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWZmIHRoZSBjYXN0IGlzIGxvc3NsZXNzLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIGEgbG9zc2xlc3MgY2FzdC4KKyAgYm9vbCBpc0xvc3NsZXNzQ2FzdCgpIGNvbnN0OworCisgIC8vLyBBIG5vLW9wIGNhc3QgaXMgb25lIHRoYXQgY2FuIGJlIGVmZmVjdGVkIHdpdGhvdXQgY2hhbmdpbmcgYW55IGJpdHMuCisgIC8vLyBJdCBpbXBsaWVzIHRoYXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdHlwZXMgYXJlIHRoZSBzYW1lIHNpemUuIFRoZQorICAvLy8gSW50UHRyVHkgYXJndW1lbnQgaXMgdXNlZCB0byBtYWtlIGFjY3VyYXRlIGRldGVybWluYXRpb25zIGZvciBjYXN0cworICAvLy8gaW52b2x2aW5nIEludGVnZXIgYW5kIFBvaW50ZXIgdHlwZXMuIFRoZXkgYXJlIG5vLW9wIGNhc3RzIGlmIHRoZSBpbnRlZ2VyCisgIC8vLyBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBwb2ludGVyLiBIb3dldmVyLCBwb2ludGVyIHNpemUgdmFyaWVzIHdpdGgKKyAgLy8vIHBsYXRmb3JtLiBHZW5lcmFsbHksIHRoZSByZXN1bHQgb2YgVGFyZ2V0RGF0YTo6Z2V0SW50UHRyVHlwZSgpIHNob3VsZCBiZQorICAvLy8gcGFzc2VkIGluLiBJZiB0aGF0J3Mgbm90IGF2YWlsYWJsZSwgdXNlIFR5cGU6OkludDY0VHksIHdoaWNoIHdpbGwgbWFrZQorICAvLy8gdGhlIGlzTm9vcENhc3QgY2FsbCBjb25zZXJ2YXRpdmUuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBkZXNjcmliZWQgY2FzdCBpcyBhIG5vLW9wIGNhc3QuCisgIHN0YXRpYyBib29sIGlzTm9vcENhc3QoCisgICAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgT3Bjb2RlLCAgLy8vPCBPcGNvZGUgb2YgY2FzdAorICAgIGNvbnN0IFR5cGUgKlNyY1R5LCAgIC8vLzwgU3JjVHkgb2YgY2FzdAorICAgIGNvbnN0IFR5cGUgKkRzdFR5LCAgIC8vLzwgRHN0VHkgb2YgY2FzdAorICAgIGNvbnN0IFR5cGUgKkludFB0clR5IC8vLzwgSW50ZWdlciB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gUHRyIHR5cGVzLCBvciBudWxsCisgICk7CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBjYXN0IGlzIGEgbm8tb3AgY2FzdC4KKyAgYm9vbCBpc05vb3BDYXN0KAorICAgIGNvbnN0IFR5cGUgKkludFB0clR5IC8vLzwgSW50ZWdlciB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gcG9pbnRlcgorICApIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgaG93IGEgcGFpciBvZiBjYXN0cyBjYW4gYmUgZWxpbWluYXRlZCwgaWYgdGhleSBjYW4gYmUgYXQgYWxsLgorICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgYm90aCBDYXN0SW5zdCBhbmQgQ29uc3RhbnRFeHByLgorICAvLy8gQHJldHVybnMgMCBpZiB0aGUgQ2FzdEluc3QgcGFpciBjYW4ndCBiZSBlbGltaW5hdGVkCisgIC8vLyBAcmV0dXJucyBJbnN0cnVjdGlvbjo6Q2FzdE9wcyB2YWx1ZSBmb3IgYSBjYXN0IHRoYXQgY2FuIHJlcGxhY2UKKyAgLy8vIHRoZSBwYWlyLCBjYXN0aW5nIFNyY1R5IHRvIERzdFR5LgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiBhIGNhc3QgcGFpciBpcyBlbGltaW5hYmxlCisgIHN0YXRpYyB1bnNpZ25lZCBpc0VsaW1pbmFibGVDYXN0UGFpcigKKyAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBmaXJzdE9wY29kZSwgIC8vLzwgT3Bjb2RlIG9mIGZpcnN0IGNhc3QKKyAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBzZWNvbmRPcGNvZGUsIC8vLzwgT3Bjb2RlIG9mIHNlY29uZCBjYXN0CisgICAgY29uc3QgVHlwZSAqU3JjVHksIC8vLzwgU3JjVHkgb2YgMXN0IGNhc3QKKyAgICBjb25zdCBUeXBlICpNaWRUeSwgLy8vPCBEc3RUeSBvZiAxc3QgY2FzdCAmIFNyY1R5IG9mIDJuZCBjYXN0CisgICAgY29uc3QgVHlwZSAqRHN0VHksIC8vLzwgRHN0VHkgb2YgMm5kIGNhc3QKKyAgICBjb25zdCBUeXBlICpJbnRQdHJUeSAvLy88IEludGVnZXIgdHlwZSBjb3JyZXNwb25kaW5nIHRvIFB0ciB0eXBlcywgb3IgbnVsbAorICApOworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBvcGNvZGUgb2YgdGhpcyBDYXN0SW5zdAorICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBnZXRPcGNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEluc3RydWN0aW9uOjpDYXN0T3BzKEluc3RydWN0aW9uOjpnZXRPcGNvZGUoKSk7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgc291cmNlIHR5cGUsIGFzIGEgY29udmVuaWVuY2UKKyAgY29uc3QgVHlwZSogZ2V0U3JjVHkoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7IH0KKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGRlc3RpbmF0aW9uIHR5cGUsIGFzIGEgY29udmVuaWVuY2UKKyAgY29uc3QgVHlwZSogZ2V0RGVzdFR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZSgpOyB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNhc3QgZnJvbSBTIHRvIERzdFR5IHVzaW5nCisgIC8vLyBPcGNvZGUgb3AgaXMgdmFsaWQgb3Igbm90LgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIHByb3Bvc2VkIGNhc3QgaXMgdmFsaWQuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIGEgY2FzdCBpcyB2YWxpZCB3aXRob3V0IGNyZWF0aW5nIG9uZS4KKyAgc3RhdGljIGJvb2wgY2FzdElzVmFsaWQoSW5zdHJ1Y3Rpb246OkNhc3RPcHMgb3AsIFZhbHVlICpTLCBjb25zdCBUeXBlICpEc3RUeSk7CisKKyAgLy8vIEBicmllZiBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDYXN0SW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmlzQ2FzdCgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLgorLy8vIEBicmllZiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLgorY2xhc3MgQ21wSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgQ21wSW5zdCgpOyAvLyBkbyBub3QgaW1wbGVtZW50Citwcm90ZWN0ZWQ6CisgIENtcEluc3QoY29uc3QgVHlwZSAqdHksIEluc3RydWN0aW9uOjpPdGhlck9wcyBvcCwgdW5zaWduZWQgc2hvcnQgcHJlZCwKKyAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKTsKKworICBDbXBJbnN0KGNvbnN0IFR5cGUgKnR5LCBJbnN0cnVjdGlvbjo6T3RoZXJPcHMgb3AsIHVuc2lnbmVkIHNob3J0IHByZWQsCisgICAgICAgICAgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgdmlydHVhbCB2b2lkIEFuY2hvcigpIGNvbnN0OyAvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZC4KK3B1YmxpYzoKKyAgLy8vIFRoaXMgZW51bWVyYXRpb24gbGlzdHMgdGhlIHBvc3NpYmxlIHByZWRpY2F0ZXMgZm9yIENtcEluc3Qgc3ViY2xhc3Nlcy4KKyAgLy8vIFZhbHVlcyBpbiB0aGUgcmFuZ2UgMC0zMSBhcmUgcmVzZXJ2ZWQgZm9yIEZDbXBJbnN0LCB3aGlsZSB2YWx1ZXMgaW4gdGhlCisgIC8vLyByYW5nZSAzMi02NCBhcmUgcmVzZXJ2ZWQgZm9yIElDbXBJbnN0LiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlCisgIC8vLyBwcmVkaWNhdGUgdmFsdWVzIGFyZSBub3Qgb3ZlcmxhcHBpbmcgYmV0d2VlbiB0aGUgY2xhc3Nlcy4KKyAgZW51bSBQcmVkaWNhdGUgeworICAgIC8vIE9wY29kZSAgICAgICAgICAgICAgVSBMIEcgRSAgICBJbnR1aXRpdmUgb3BlcmF0aW9uCisgICAgRkNNUF9GQUxTRSA9ICAwLCAgLy8vPCAwIDAgMCAwICAgIEFsd2F5cyBmYWxzZSAoYWx3YXlzIGZvbGRlZCkKKyAgICBGQ01QX09FUSAgID0gIDEsICAvLy88IDAgMCAwIDEgICAgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBlcXVhbAorICAgIEZDTVBfT0dUICAgPSAgMiwgIC8vLzwgMCAwIDEgMCAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGdyZWF0ZXIgdGhhbgorICAgIEZDTVBfT0dFICAgPSAgMywgIC8vLzwgMCAwIDEgMSAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgIEZDTVBfT0xUICAgPSAgNCwgIC8vLzwgMCAxIDAgMCAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGxlc3MgdGhhbgorICAgIEZDTVBfT0xFICAgPSAgNSwgIC8vLzwgMCAxIDAgMSAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGxlc3MgdGhhbiBvciBlcXVhbAorICAgIEZDTVBfT05FICAgPSAgNiwgIC8vLzwgMCAxIDEgMCAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIG9wZXJhbmRzIGFyZSB1bmVxdWFsCisgICAgRkNNUF9PUkQgICA9ICA3LCAgLy8vPCAwIDEgMSAxICAgIFRydWUgaWYgb3JkZXJlZCAobm8gbmFucykKKyAgICBGQ01QX1VOTyAgID0gIDgsICAvLy88IDEgMCAwIDAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQ6IGlzbmFuKFgpIHwgaXNuYW4oWSkKKyAgICBGQ01QX1VFUSAgID0gIDksICAvLy88IDEgMCAwIDEgICAgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgZXF1YWwKKyAgICBGQ01QX1VHVCAgID0gMTAsICAvLy88IDEgMCAxIDAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgZ3JlYXRlciB0aGFuCisgICAgRkNNUF9VR0UgICA9IDExLCAgLy8vPCAxIDAgMSAxICAgIFRydWUgaWYgdW5vcmRlcmVkLCBncmVhdGVyIHRoYW4sIG9yIGVxdWFsCisgICAgRkNNUF9VTFQgICA9IDEyLCAgLy8vPCAxIDEgMCAwICAgIFRydWUgaWYgdW5vcmRlcmVkIG9yIGxlc3MgdGhhbgorICAgIEZDTVBfVUxFICAgPSAxMywgIC8vLzwgMSAxIDAgMSAgICBUcnVlIGlmIHVub3JkZXJlZCwgbGVzcyB0aGFuLCBvciBlcXVhbAorICAgIEZDTVBfVU5FICAgPSAxNCwgIC8vLzwgMSAxIDEgMCAgICBUcnVlIGlmIHVub3JkZXJlZCBvciBub3QgZXF1YWwKKyAgICBGQ01QX1RSVUUgID0gMTUsICAvLy88IDEgMSAxIDEgICAgQWx3YXlzIHRydWUgKGFsd2F5cyBmb2xkZWQpCisgICAgRklSU1RfRkNNUF9QUkVESUNBVEUgPSBGQ01QX0ZBTFNFLAorICAgIExBU1RfRkNNUF9QUkVESUNBVEUgPSBGQ01QX1RSVUUsCisgICAgQkFEX0ZDTVBfUFJFRElDQVRFID0gRkNNUF9UUlVFICsgMSwKKyAgICBJQ01QX0VRICAgID0gMzIsICAvLy88IGVxdWFsCisgICAgSUNNUF9ORSAgICA9IDMzLCAgLy8vPCBub3QgZXF1YWwKKyAgICBJQ01QX1VHVCAgID0gMzQsICAvLy88IHVuc2lnbmVkIGdyZWF0ZXIgdGhhbgorICAgIElDTVBfVUdFICAgPSAzNSwgIC8vLzwgdW5zaWduZWQgZ3JlYXRlciBvciBlcXVhbAorICAgIElDTVBfVUxUICAgPSAzNiwgIC8vLzwgdW5zaWduZWQgbGVzcyB0aGFuCisgICAgSUNNUF9VTEUgICA9IDM3LCAgLy8vPCB1bnNpZ25lZCBsZXNzIG9yIGVxdWFsCisgICAgSUNNUF9TR1QgICA9IDM4LCAgLy8vPCBzaWduZWQgZ3JlYXRlciB0aGFuCisgICAgSUNNUF9TR0UgICA9IDM5LCAgLy8vPCBzaWduZWQgZ3JlYXRlciBvciBlcXVhbAorICAgIElDTVBfU0xUICAgPSA0MCwgIC8vLzwgc2lnbmVkIGxlc3MgdGhhbgorICAgIElDTVBfU0xFICAgPSA0MSwgIC8vLzwgc2lnbmVkIGxlc3Mgb3IgZXF1YWwKKyAgICBGSVJTVF9JQ01QX1BSRURJQ0FURSA9IElDTVBfRVEsCisgICAgTEFTVF9JQ01QX1BSRURJQ0FURSA9IElDTVBfU0xFLAorICAgIEJBRF9JQ01QX1BSRURJQ0FURSA9IElDTVBfU0xFICsgMQorICB9OworCisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHR3byBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDIpOworICB9CisgIC8vLyBDb25zdHJ1Y3QgYSBjb21wYXJlIGluc3RydWN0aW9uLCBnaXZlbiB0aGUgb3Bjb2RlLCB0aGUgcHJlZGljYXRlIGFuZAorICAvLy8gdGhlIHR3byBvcGVyYW5kcy4gIE9wdGlvbmFsbHkgKGlmIEluc3RCZWZvcmUgaXMgc3BlY2lmaWVkKSBpbnNlcnQgdGhlCisgIC8vLyBpbnN0cnVjdGlvbiBpbnRvIGEgQmFzaWNCbG9jayByaWdodCBiZWZvcmUgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoZSBzcGVjaWZpZWQgSW5zdHJ1Y3Rpb24gaXMgYWxsb3dlZCB0byBiZSBhIGRlcmVmZXJlbmNlZCBlbmQgaXRlcmF0b3IuCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgQ21wSW5zdAorICBzdGF0aWMgQ21wSW5zdCAqQ3JlYXRlKE90aGVyT3BzIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHByZWRpY2F0ZSwgVmFsdWUgKlMxLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpTMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCk7CisKKyAgLy8vIENvbnN0cnVjdCBhIGNvbXBhcmUgaW5zdHJ1Y3Rpb24sIGdpdmVuIHRoZSBvcGNvZGUsIHRoZSBwcmVkaWNhdGUgYW5kIHRoZQorICAvLy8gdHdvIG9wZXJhbmRzLiAgQWxzbyBhdXRvbWF0aWNhbGx5IGluc2VydCB0aGlzIGluc3RydWN0aW9uIHRvIHRoZSBlbmQgb2YKKyAgLy8vIHRoZSBCYXNpY0Jsb2NrIHNwZWNpZmllZC4KKyAgLy8vIEBicmllZiBDcmVhdGUgYSBDbXBJbnN0CisgIHN0YXRpYyBDbXBJbnN0ICpDcmVhdGUoT3RoZXJPcHMgT3AsIHVuc2lnbmVkIHNob3J0IHByZWRpY2F0ZSwgVmFsdWUgKlMxLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpTMixCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIAorICAvLy8gQGJyaWVmIEdldCB0aGUgb3Bjb2RlIGNhc3RlZCB0byB0aGUgcmlnaHQgdHlwZQorICBPdGhlck9wcyBnZXRPcGNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE90aGVyT3BzPihJbnN0cnVjdGlvbjo6Z2V0T3Bjb2RlKCkpOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIHByZWRpY2F0ZSBmb3IgdGhpcyBpbnN0cnVjdGlvbi4KKyAgUHJlZGljYXRlIGdldFByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZGljYXRlKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgU2V0IHRoZSBwcmVkaWNhdGUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgdm9pZCBzZXRQcmVkaWNhdGUoUHJlZGljYXRlIFApIHsgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoUCk7IH0KKworICBzdGF0aWMgYm9vbCBpc0ZQUHJlZGljYXRlKFByZWRpY2F0ZSBQKSB7CisgICAgcmV0dXJuIFAgPj0gRklSU1RfRkNNUF9QUkVESUNBVEUgJiYgUCA8PSBMQVNUX0ZDTVBfUFJFRElDQVRFOworICB9CisgIAorICBzdGF0aWMgYm9vbCBpc0ludFByZWRpY2F0ZShQcmVkaWNhdGUgUCkgeworICAgIHJldHVybiBQID49IEZJUlNUX0lDTVBfUFJFRElDQVRFICYmIFAgPD0gTEFTVF9JQ01QX1BSRURJQ0FURTsKKyAgfQorICAKKyAgYm9vbCBpc0ZQUHJlZGljYXRlKCkgY29uc3QgeyByZXR1cm4gaXNGUFByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7IH0KKyAgYm9vbCBpc0ludFByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIGlzSW50UHJlZGljYXRlKGdldFByZWRpY2F0ZSgpKTsgfQorICAKKyAgCisgIC8vLyBGb3IgZXhhbXBsZSwgRVEgLT4gTkUsIFVHVCAtPiBVTEUsIFNMVCAtPiBTR0UsCisgIC8vLyAgICAgICAgICAgICAgT0VRIC0+IFVORSwgVUdUIC0+IE9MRSwgT0xUIC0+IFVHRSwgZXRjLgorICAvLy8gQHJldHVybnMgdGhlIGludmVyc2UgcHJlZGljYXRlIGZvciB0aGUgaW5zdHJ1Y3Rpb24ncyBjdXJyZW50IHByZWRpY2F0ZS4KKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGludmVyc2Ugb2YgdGhlIGluc3RydWN0aW9uJ3MgcHJlZGljYXRlLgorICBQcmVkaWNhdGUgZ2V0SW52ZXJzZVByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW52ZXJzZVByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gRm9yIGV4YW1wbGUsIEVRIC0+IE5FLCBVR1QgLT4gVUxFLCBTTFQgLT4gU0dFLAorICAvLy8gICAgICAgICAgICAgIE9FUSAtPiBVTkUsIFVHVCAtPiBPTEUsIE9MVCAtPiBVR0UsIGV0Yy4KKyAgLy8vIEByZXR1cm5zIHRoZSBpbnZlcnNlIHByZWRpY2F0ZSBmb3IgcHJlZGljYXRlIHByb3ZpZGVkIGluIFxwIHByZWQuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBpbnZlcnNlIG9mIGEgZ2l2ZW4gcHJlZGljYXRlCisgIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW52ZXJzZVByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIEZvciBleGFtcGxlLCBFUS0+RVEsIFNMRS0+U0dFLCBVTFQtPlVHVCwKKyAgLy8vICAgICAgICAgICAgICBPRVEtPk9FUSwgVUxFLT5VR0UsIE9MVC0+T0dULCBldGMuCisgIC8vLyBAcmV0dXJucyB0aGUgcHJlZGljYXRlIHRoYXQgd291bGQgYmUgdGhlIHJlc3VsdCBvZiBleGNoYW5naW5nIHRoZSB0d28KKyAgLy8vIG9wZXJhbmRzIG9mIHRoZSBDbXBJbnN0IGluc3RydWN0aW9uIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHJlc3VsdAorICAvLy8gcHJvZHVjZWQuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBwcmVkaWNhdGUgYXMgaWYgdGhlIG9wZXJhbmRzIHdlcmUgc3dhcHBlZAorICBQcmVkaWNhdGUgZ2V0U3dhcHBlZFByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3dhcHBlZFByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gVGhpcyBpcyBhIHN0YXRpYyB2ZXJzaW9uIHRoYXQgeW91IGNhbiB1c2Ugd2l0aG91dCBhbiBpbnN0cnVjdGlvbgorICAvLy8gYXZhaWxhYmxlLgorICAvLy8gQGJyaWVmIFJldHVybiB0aGUgcHJlZGljYXRlIGFzIGlmIHRoZSBvcGVyYW5kcyB3ZXJlIHN3YXBwZWQuCisgIHN0YXRpYyBQcmVkaWNhdGUgZ2V0U3dhcHBlZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIEBicmllZiBQcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIHRoYXQgZGlzcGF0Y2hlcyB0byB0aGUgc3ViY2xhc3Nlcy4KKyAgLy8vIEBicmllZiBTd2FwIHRoZSBvcGVyYW5kcyBhbmQgYWRqdXN0IHByZWRpY2F0ZSBhY2NvcmRpbmdseSB0byByZXRhaW4KKyAgLy8vIHRoZSBzYW1lIGNvbXBhcmlzb24uCisgIHZvaWQgc3dhcE9wZXJhbmRzKCk7CisKKyAgLy8vIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIHRoYXQgZGlzcGF0Y2hlcyB0byB0aGUgc3ViY2xhc3Nlcy4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBDbXBJbnN0IGlzIGNvbW11dGF0aXZlLgorICBib29sIGlzQ29tbXV0YXRpdmUoKTsKKworICAvLy8gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgdGhhdCBkaXNwYXRjaGVzIHRvIHRoZSBzdWJjbGFzc2VzLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIGFuIGVxdWFscy9ub3QgZXF1YWxzIHByZWRpY2F0ZS4KKyAgYm9vbCBpc0VxdWFsaXR5KCk7CisKKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBhcmlzb24gaXMgc2lnbmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgdXNpbmcgYSBzaWduZWQgY29tcGFyaXNvbi4KKyAgYm9vbCBpc1NpZ25lZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNTaWduZWQoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBhcmlzb24gaXMgdW5zaWduZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyB1c2luZyBhbiB1bnNpZ25lZCBjb21wYXJpc29uLgorICBib29sIGlzVW5zaWduZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVW5zaWduZWQoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIHRydWUgd2hlbiBib3RoIG9wZXJhbmRzIGFyZSB0aGUgc2FtZS4KKyAgYm9vbCBpc1RydWVXaGVuRXF1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVHJ1ZVdoZW5FcXVhbChnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaXMgZmFsc2Ugd2hlbiBib3RoIG9wZXJhbmRzIGFyZSB0aGUgc2FtZS4KKyAgYm9vbCBpc0ZhbHNlV2hlbkVxdWFsKCkgY29uc3QgeworICAgIHJldHVybiBpc0ZhbHNlV2hlbkVxdWFsKGdldFByZWRpY2F0ZSgpKTsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgaXMgdW5zaWduZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHByZWRpY2F0ZSBpcyBhbiB1bnNpZ25lZCBvcGVyYXRpb24uCisgIHN0YXRpYyBib29sIGlzVW5zaWduZWQodW5zaWduZWQgc2hvcnQgcHJlZGljYXRlKTsKKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIGlzIHNpZ25lZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgcHJlZGljYXRlIGlzIGFuIHNpZ25lZCBvcGVyYXRpb24uCisgIHN0YXRpYyBib29sIGlzU2lnbmVkKHVuc2lnbmVkIHNob3J0IHByZWRpY2F0ZSk7CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHByZWRpY2F0ZSBpcyBhbiBvcmRlcmVkIG9wZXJhdGlvbi4KKyAgc3RhdGljIGJvb2wgaXNPcmRlcmVkKHVuc2lnbmVkIHNob3J0IHByZWRpY2F0ZSk7CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHByZWRpY2F0ZSBpcyBhbiB1bm9yZGVyZWQgb3BlcmF0aW9uLgorICBzdGF0aWMgYm9vbCBpc1Vub3JkZXJlZCh1bnNpZ25lZCBzaG9ydCBwcmVkaWNhdGUpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIHByZWRpY2F0ZSBpcyB0cnVlIHdoZW4gY29tcGFyaW5nIGEgdmFsdWUgd2l0aCBpdHNlbGYuCisgIHN0YXRpYyBib29sIGlzVHJ1ZVdoZW5FcXVhbCh1bnNpZ25lZCBzaG9ydCBwcmVkaWNhdGUpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIHByZWRpY2F0ZSBpcyBmYWxzZSB3aGVuIGNvbXBhcmluZyBhIHZhbHVlIHdpdGggaXRzZWxmLgorICBzdGF0aWMgYm9vbCBpc0ZhbHNlV2hlbkVxdWFsKHVuc2lnbmVkIHNob3J0IHByZWRpY2F0ZSk7CisKKyAgLy8vIEBicmllZiBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDbXBJbnN0ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OklDbXAgfHwKKyAgICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZDbXA7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorICAKKyAgLy8vIEBicmllZiBDcmVhdGUgYSByZXN1bHQgdHlwZSBmb3IgZmNtcC9pY21wCisgIHN0YXRpYyBjb25zdCBUeXBlKiBtYWtlQ21wUmVzdWx0VHlwZShjb25zdCBUeXBlKiBvcG5kX3R5cGUpIHsKKyAgICBpZiAoY29uc3QgVmVjdG9yVHlwZSogdnQgPSBkeW5fY2FzdDxjb25zdCBWZWN0b3JUeXBlPihvcG5kX3R5cGUpKSB7CisgICAgICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEludDFUeShvcG5kX3R5cGUtPmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0LT5nZXROdW1FbGVtZW50cygpKTsKKyAgICB9CisgICAgcmV0dXJuIFR5cGU6OmdldEludDFUeShvcG5kX3R5cGUtPmdldENvbnRleHQoKSk7CisgIH0KK3ByaXZhdGU6CisgIC8vIFNoYWRvdyBWYWx1ZTo6c2V0VmFsdWVTdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZyBtZXRob2Qgc28gdGhhdAorICAvLyBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldFZhbHVlU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBWYWx1ZTo6c2V0VmFsdWVTdWJjbGFzc0RhdGEoRCk7CisgIH0KK307CisKKworLy8gRklYTUU6IHRoZXNlIGFyZSByZWR1bmRhbnQgaWYgQ21wSW5zdCA8IEJpbmFyeU9wZXJhdG9yCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8Q21wSW5zdD4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDI+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDbXBJbnN0LCBWYWx1ZSkKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW5zdHJ1Y3Rpb24uZGVmIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0luc3RydWN0aW9uLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWM5ZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0luc3RydWN0aW9uLmRlZgpAQCAtMCwwICsxLDE5NiBAQAorLy89PT0tLSBsbHZtL0luc3RydWN0aW9uLmRlZiAtIEZpbGUgdGhhdCBkZXNjcmliZXMgSW5zdHJ1Y3Rpb25zIC0qLSBDKysgLSotPT09Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgdGhlIHZhcmlvdXMgTExWTSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzCisvLyB1c2VkIGFzIGEgY2VudHJhbCBwbGFjZSBmb3IgZW51bWVyYXRpbmcgdGhlIGRpZmZlcmVudCBpbnN0cnVjdGlvbnMgYW5kIAorLy8gc2hvdWxkIGV2ZW50dWFsbHkgYmUgdGhlIHBsYWNlIHRvIHB1dCBjb21tZW50cyBhYm91dCB0aGUgaW5zdHJ1Y3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE5PVEU6IE5PIElOQ0xVREUgR1VBUkQgREVTSVJFRCEKKworLy8gUHJvdmlkZSBkZWZpbml0aW9ucyBvZiBtYWNyb3Mgc28gdGhhdCB1c2VycyBvZiB0aGlzIGZpbGUgZG8gbm90IGhhdmUgdG8gCisvLyBkZWZpbmUgZXZlcnl0aGluZyB0byB1c2UgaXQuLi4KKy8vCisjaWZuZGVmIEZJUlNUX1RFUk1fSU5TVAorI2RlZmluZSBGSVJTVF9URVJNX0lOU1QobnVtKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9URVJNX0lOU1QKKyNpZm5kZWYgSEFORExFX0lOU1QKKyNkZWZpbmUgSEFORExFX1RFUk1fSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZWxzZQorI2RlZmluZSBIQU5ETEVfVEVSTV9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykgSEFORExFX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTEFTVF9URVJNX0lOU1QKKyNkZWZpbmUgTEFTVF9URVJNX0lOU1QobnVtKQorI2VuZGlmCisKKyNpZm5kZWYgRklSU1RfQklOQVJZX0lOU1QKKyNkZWZpbmUgRklSU1RfQklOQVJZX0lOU1QobnVtKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9CSU5BUllfSU5TVAorI2lmbmRlZiBIQU5ETEVfSU5TVAorI2RlZmluZSBIQU5ETEVfQklOQVJZX0lOU1QobnVtLCBvcGNvZGUsIGluc3RjbGFzcykKKyNlbHNlCisjZGVmaW5lIEhBTkRMRV9CSU5BUllfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpIEhBTkRMRV9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExBU1RfQklOQVJZX0lOU1QKKyNkZWZpbmUgTEFTVF9CSU5BUllfSU5TVChudW0pCisjZW5kaWYKKworI2lmbmRlZiBGSVJTVF9NRU1PUllfSU5TVAorI2RlZmluZSBGSVJTVF9NRU1PUllfSU5TVChudW0pCisjZW5kaWYKKyNpZm5kZWYgSEFORExFX01FTU9SWV9JTlNUCisjaWZuZGVmIEhBTkRMRV9JTlNUCisjZGVmaW5lIEhBTkRMRV9NRU1PUllfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZWxzZQorI2RlZmluZSBIQU5ETEVfTUVNT1JZX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKSBIQU5ETEVfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMQVNUX01FTU9SWV9JTlNUCisjZGVmaW5lIExBU1RfTUVNT1JZX0lOU1QobnVtKQorI2VuZGlmCisKKyNpZm5kZWYgRklSU1RfQ0FTVF9JTlNUCisjZGVmaW5lIEZJUlNUX0NBU1RfSU5TVChudW0pCisjZW5kaWYKKyNpZm5kZWYgSEFORExFX0NBU1RfSU5TVAorI2lmbmRlZiBIQU5ETEVfSU5TVAorI2RlZmluZSBIQU5ETEVfQ0FTVF9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykKKyNlbHNlCisjZGVmaW5lIEhBTkRMRV9DQVNUX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKSBIQU5ETEVfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMQVNUX0NBU1RfSU5TVAorI2RlZmluZSBMQVNUX0NBU1RfSU5TVChudW0pCisjZW5kaWYKKworI2lmbmRlZiBGSVJTVF9PVEhFUl9JTlNUCisjZGVmaW5lIEZJUlNUX09USEVSX0lOU1QobnVtKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9PVEhFUl9JTlNUCisjaWZuZGVmIEhBTkRMRV9JTlNUCisjZGVmaW5lIEhBTkRMRV9PVEhFUl9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykKKyNlbHNlCisjZGVmaW5lIEhBTkRMRV9PVEhFUl9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykgSEFORExFX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTEFTVF9PVEhFUl9JTlNUCisjZGVmaW5lIExBU1RfT1RIRVJfSU5TVChudW0pCisjZW5kaWYKKworCisvLyBUZXJtaW5hdG9yIEluc3RydWN0aW9ucyAtIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgdXNlZCB0byB0ZXJtaW5hdGUgYSBiYXNpYworLy8gYmxvY2sgb2YgdGhlIHByb2dyYW0uICAgRXZlcnkgYmFzaWMgYmxvY2sgbXVzdCBlbmQgd2l0aCBvbmUgb2YgdGhlc2UKKy8vIGluc3RydWN0aW9ucyBmb3IgaXQgdG8gYmUgYSB3ZWxsIGZvcm1lZCBiYXNpYyBibG9jay4KKy8vCisgRklSU1RfVEVSTV9JTlNUICAoIDEpCitIQU5ETEVfVEVSTV9JTlNUICAoIDEsIFJldCAgICAgICAgLCBSZXR1cm5JbnN0KQorSEFORExFX1RFUk1fSU5TVCAgKCAyLCBCciAgICAgICAgICwgQnJhbmNoSW5zdCkKK0hBTkRMRV9URVJNX0lOU1QgICggMywgU3dpdGNoICAgICAsIFN3aXRjaEluc3QpCitIQU5ETEVfVEVSTV9JTlNUICAoIDQsIEluZGlyZWN0QnIgLCBJbmRpcmVjdEJySW5zdCkKKy8vSEFORExFX1RFUk1fSU5TVCAgKCA1LCBJbnZva2UgICAgICwgSW52b2tlSW5zdCkKKy8vSEFORExFX1RFUk1fSU5TVCAgKCA2LCBVbndpbmQgICAgICwgVW53aW5kSW5zdCkKK0hBTkRMRV9URVJNX0lOU1QgICggNywgVW5yZWFjaGFibGUsIFVucmVhY2hhYmxlSW5zdCkKKyAgTEFTVF9URVJNX0lOU1QgICggNykKKworLy8gU3RhbmRhcmQgYmluYXJ5IG9wZXJhdG9ycy4uLgorIEZJUlNUX0JJTkFSWV9JTlNUKCA4KQorSEFORExFX0JJTkFSWV9JTlNUKCA4LCBBZGQgICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoIDksIEZBZGQgICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMTAsIFN1YiAgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgxMSwgRlN1YiAgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgxMiwgTXVsICAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDEzLCBGTXVsICAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDE0LCBVRGl2ICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMTUsIFNEaXYgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgxNiwgRkRpdiAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDE3LCBVUmVtICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMTgsIFNSZW0gLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgxOSwgRlJlbSAsIEJpbmFyeU9wZXJhdG9yKQorCisvLyBMb2dpY2FsIG9wZXJhdG9ycyAoaW50ZWdlciBvcGVyYW5kcykKK0hBTkRMRV9CSU5BUllfSU5TVCgyMCwgU2hsICAsIEJpbmFyeU9wZXJhdG9yKSAvLyBTaGlmdCBsZWZ0ICAobG9naWNhbCkKK0hBTkRMRV9CSU5BUllfSU5TVCgyMSwgTFNociAsIEJpbmFyeU9wZXJhdG9yKSAvLyBTaGlmdCByaWdodCAobG9naWNhbCkKK0hBTkRMRV9CSU5BUllfSU5TVCgyMiwgQVNociAsIEJpbmFyeU9wZXJhdG9yKSAvLyBTaGlmdCByaWdodCAoYXJpdGhtZXRpYykKK0hBTkRMRV9CSU5BUllfSU5TVCgyMywgQW5kICAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDI0LCBPciAgICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMjUsIFhvciAgLCBCaW5hcnlPcGVyYXRvcikKKyAgTEFTVF9CSU5BUllfSU5TVCgyNSkKKworLy8gTWVtb3J5IG9wZXJhdG9ycy4uLgorIEZJUlNUX01FTU9SWV9JTlNUKDI2KQorSEFORExFX01FTU9SWV9JTlNUKDI2LCBBbGxvY2EsIEFsbG9jYUluc3QpICAvLyBTdGFjayBtYW5hZ2VtZW50CitIQU5ETEVfTUVNT1JZX0lOU1QoMjcsIExvYWQgICwgTG9hZEluc3QgICkgIC8vIE1lbW9yeSBtYW5pcHVsYXRpb24gaW5zdHJzCitIQU5ETEVfTUVNT1JZX0lOU1QoMjgsIFN0b3JlICwgU3RvcmVJbnN0ICkKK0hBTkRMRV9NRU1PUllfSU5TVCgyOSwgR2V0RWxlbWVudFB0ciwgR2V0RWxlbWVudFB0ckluc3QpCisgIExBU1RfTUVNT1JZX0lOU1QoMjkpCisKKy8vIENhc3Qgb3BlcmF0b3JzIC4uLgorLy8gTk9URTogVGhlIG9yZGVyIG1hdHRlcnMgaGVyZSBiZWNhdXNlIENhc3RJbnN0Ojppc0VsaW1pbmFibGVDYXN0UGFpciAKKy8vIE5PVEU6IChzZWUgSW5zdHJ1Y3Rpb25zLmNwcCkgZW5jb2RlcyBhIHRhYmxlIGJhc2VkIG9uIHRoaXMgb3JkZXJpbmcuCisgRklSU1RfQ0FTVF9JTlNUKDMwKQorSEFORExFX0NBU1RfSU5TVCgzMCwgVHJ1bmMgICAsIFRydW5jSW5zdCAgICkgIC8vIFRydW5jYXRlIGludGVnZXJzCitIQU5ETEVfQ0FTVF9JTlNUKDMxLCBaRXh0ICAgICwgWkV4dEluc3QgICAgKSAgLy8gWmVybyBleHRlbmQgaW50ZWdlcnMKK0hBTkRMRV9DQVNUX0lOU1QoMzIsIFNFeHQgICAgLCBTRXh0SW5zdCAgICApICAvLyBTaWduIGV4dGVuZCBpbnRlZ2VycworSEFORExFX0NBU1RfSU5TVCgzMywgRlBUb1VJICAsIEZQVG9VSUluc3QgICkgIC8vIGZsb2F0aW5nIHBvaW50IC0+IFVJbnQKK0hBTkRMRV9DQVNUX0lOU1QoMzQsIEZQVG9TSSAgLCBGUFRvU0lJbnN0ICApICAvLyBmbG9hdGluZyBwb2ludCAtPiBTSW50CitIQU5ETEVfQ0FTVF9JTlNUKDM1LCBVSVRvRlAgICwgVUlUb0ZQSW5zdCAgKSAgLy8gVUludCAtPiBmbG9hdGluZyBwb2ludAorSEFORExFX0NBU1RfSU5TVCgzNiwgU0lUb0ZQICAsIFNJVG9GUEluc3QgICkgIC8vIFNJbnQgLT4gZmxvYXRpbmcgcG9pbnQKK0hBTkRMRV9DQVNUX0lOU1QoMzcsIEZQVHJ1bmMgLCBGUFRydW5jSW5zdCApICAvLyBUcnVuY2F0ZSBmbG9hdGluZyBwb2ludAorSEFORExFX0NBU1RfSU5TVCgzOCwgRlBFeHQgICAsIEZQRXh0SW5zdCAgICkgIC8vIEV4dGVuZCBmbG9hdGluZyBwb2ludAorSEFORExFX0NBU1RfSU5TVCgzOSwgUHRyVG9JbnQsIFB0clRvSW50SW5zdCkgIC8vIFBvaW50ZXIgLT4gSW50ZWdlcgorSEFORExFX0NBU1RfSU5TVCg0MCwgSW50VG9QdHIsIEludFRvUHRySW5zdCkgIC8vIEludGVnZXIgLT4gUG9pbnRlcgorSEFORExFX0NBU1RfSU5TVCg0MSwgQml0Q2FzdCAsIEJpdENhc3RJbnN0ICkgIC8vIFR5cGUgY2FzdAorICBMQVNUX0NBU1RfSU5TVCg0MSkKKworLy8gT3RoZXIgb3BlcmF0b3JzLi4uCisgRklSU1RfT1RIRVJfSU5TVCg0MikKK0hBTkRMRV9PVEhFUl9JTlNUKDQyLCBJQ21wICAgLCBJQ21wSW5zdCAgICkgIC8vIEludGVnZXIgY29tcGFyaXNvbiBpbnN0cnVjdGlvbgorSEFORExFX09USEVSX0lOU1QoNDMsIEZDbXAgICAsIEZDbXBJbnN0ICAgKSAgLy8gRmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbiBpbnN0ci4KK0hBTkRMRV9PVEhFUl9JTlNUKDQ0LCBQSEkgICAgLCBQSElOb2RlICAgICkgIC8vIFBISSBub2RlIGluc3RydWN0aW9uCitIQU5ETEVfT1RIRVJfSU5TVCg0NSwgQ2FsbCAgICwgQ2FsbEluc3QgICApICAvLyBDYWxsIGEgZnVuY3Rpb24KK0hBTkRMRV9PVEhFUl9JTlNUKDQ2LCBTZWxlY3QgLCBTZWxlY3RJbnN0ICkgIC8vIHNlbGVjdCBpbnN0cnVjdGlvbgorSEFORExFX09USEVSX0lOU1QoNDcsIFVzZXJPcDEsIEluc3RydWN0aW9uKSAgLy8gTWF5IGJlIHVzZWQgaW50ZXJuYWxseSBpbiBhIHBhc3MKK0hBTkRMRV9PVEhFUl9JTlNUKDQ4LCBVc2VyT3AyLCBJbnN0cnVjdGlvbikgIC8vIEludGVybmFsIHRvIHBhc3NlcyBvbmx5CisvL0hBTkRMRV9PVEhFUl9JTlNUKDQ5LCBWQUFyZyAgLCBWQUFyZ0luc3QgICkgIC8vIHZhYXJnIGluc3RydWN0aW9uCitIQU5ETEVfT1RIRVJfSU5TVCg1MCwgRXh0cmFjdEVsZW1lbnQsIEV4dHJhY3RFbGVtZW50SW5zdCkvLyBleHRyYWN0IGZyb20gdmVjdG9yCitIQU5ETEVfT1RIRVJfSU5TVCg1MSwgSW5zZXJ0RWxlbWVudCwgSW5zZXJ0RWxlbWVudEluc3QpICAvLyBpbnNlcnQgaW50byB2ZWN0b3IKK0hBTkRMRV9PVEhFUl9JTlNUKDUyLCBTaHVmZmxlVmVjdG9yLCBTaHVmZmxlVmVjdG9ySW5zdCkgIC8vIHNodWZmbGUgdHdvIHZlY3RvcnMuCitIQU5ETEVfT1RIRVJfSU5TVCg1MywgRXh0cmFjdFZhbHVlLCBFeHRyYWN0VmFsdWVJbnN0KS8vIGV4dHJhY3QgZnJvbSBhZ2dyZWdhdGUKK0hBTkRMRV9PVEhFUl9JTlNUKDU0LCBJbnNlcnRWYWx1ZSwgSW5zZXJ0VmFsdWVJbnN0KSAgLy8gaW5zZXJ0IGludG8gYWdncmVnYXRlCisKKyAgTEFTVF9PVEhFUl9JTlNUKDU0KQorCisjdW5kZWYgIEZJUlNUX1RFUk1fSU5TVAorI3VuZGVmIEhBTkRMRV9URVJNX0lOU1QKKyN1bmRlZiAgIExBU1RfVEVSTV9JTlNUCisKKyN1bmRlZiAgRklSU1RfQklOQVJZX0lOU1QKKyN1bmRlZiBIQU5ETEVfQklOQVJZX0lOU1QKKyN1bmRlZiAgIExBU1RfQklOQVJZX0lOU1QKKworI3VuZGVmICBGSVJTVF9NRU1PUllfSU5TVAorI3VuZGVmIEhBTkRMRV9NRU1PUllfSU5TVAorI3VuZGVmICAgTEFTVF9NRU1PUllfSU5TVAorCisjdW5kZWYgIEZJUlNUX0NBU1RfSU5TVAorI3VuZGVmIEhBTkRMRV9DQVNUX0lOU1QKKyN1bmRlZiAgIExBU1RfQ0FTVF9JTlNUCisKKyN1bmRlZiAgRklSU1RfT1RIRVJfSU5TVAorI3VuZGVmIEhBTkRMRV9PVEhFUl9JTlNUCisjdW5kZWYgICBMQVNUX09USEVSX0lOU1QKKworI2lmZGVmIEhBTkRMRV9JTlNUCisjdW5kZWYgSEFORExFX0lOU1QKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0luc3RydWN0aW9uLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW5zdHJ1Y3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGRhNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0luc3RydWN0aW9uLmgKQEAgLTAsMCArMSwzODcgQEAKKy8vPT09LS0gbGx2bS9JbnN0cnVjdGlvbi5oIC0gSW5zdHJ1Y3Rpb24gY2xhc3MgZGVmaW5pdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgSW5zdHJ1Y3Rpb24gY2xhc3MsIHdoaWNoIGlzIHRoZQorLy8gYmFzZSBjbGFzcyBmb3IgYWxsIG9mIHRoZSBMTFZNIGluc3RydWN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSU5TVFJVQ1RJT05fSAorI2RlZmluZSBMTFZNX0lOU1RSVUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vVXNlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWdMb2MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIE1ETm9kZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVTdWJDbGFzcywgdHlwZW5hbWUgSXRlbVBhcmVudENsYXNzPgorICBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM7CisKK2NsYXNzIEluc3RydWN0aW9uIDogcHVibGljIFVzZXIsIHB1YmxpYyBpbGlzdF9ub2RlPEluc3RydWN0aW9uPiB7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEluc3RydWN0aW9uICYpOyAgICAgLy8gRG8gbm90IGltcGxlbWVudAorICBJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiAmKTsgICAgICAgIC8vIERvIG5vdCBpbXBsZW1lbnQKKworICBCYXNpY0Jsb2NrICpQYXJlbnQ7CisgIERlYnVnTG9jIERiZ0xvYzsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2RiZycgTWV0YWRhdGEgY2FjaGUuCisgIAorICBlbnVtIHsKKyAgICAvLy8gSGFzTWV0YWRhdGFCaXQgLSBUaGlzIGlzIGEgYml0IHN0b3JlZCBpbiB0aGUgU3ViQ2xhc3NEYXRhIGZpZWxkIHdoaWNoCisgICAgLy8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIG1ldGFkYXRhIGF0dGFjaGVkIHRvIGl0IG9yIG5vdC4KKyAgICBIYXNNZXRhZGF0YUJpdCA9IDEgPDwgMTUKKyAgfTsKK3B1YmxpYzoKKyAgLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QsIHNvIHRoZSB2dGFibGUsIGV0YyBoYXMgYSBob21lLgorICB+SW5zdHJ1Y3Rpb24oKTsKKyAgCisgIC8vLyB1c2VfYmFjayAtIFNwZWNpYWxpemUgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiBWYWx1ZSwgYXMgd2Uga25vdyB0aGF0IGFuCisgIC8vLyBpbnN0cnVjdGlvbiBjYW4gb25seSBiZSB1c2VkIGJ5IG90aGVyIGluc3RydWN0aW9ucy4KKyAgSW5zdHJ1Y3Rpb24gICAgICAgKnVzZV9iYWNrKCkgICAgICAgeyByZXR1cm4gY2FzdDxJbnN0cnVjdGlvbj4oKnVzZV9iZWdpbigpKTt9CisgIGNvbnN0IEluc3RydWN0aW9uICp1c2VfYmFjaygpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8SW5zdHJ1Y3Rpb24+KCp1c2VfYmVnaW4oKSk7fQorICAKKyAgaW5saW5lIGNvbnN0IEJhc2ljQmxvY2sgKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorICBpbmxpbmUgICAgICAgQmFzaWNCbG9jayAqZ2V0UGFyZW50KCkgICAgICAgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8vIHJlbW92ZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGJhc2ljCisgIC8vLyBibG9jaywgYnV0IGRvZXMgbm90IGRlbGV0ZSBpdC4KKyAgLy8vCisgIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOworCisgIC8vLyBlcmFzZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGJhc2ljCisgIC8vLyBibG9jayBhbmQgZGVsZXRlcyBpdC4KKyAgLy8vCisgIHZvaWQgZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIGluc2VydEJlZm9yZSAtIEluc2VydCBhbiB1bmxpbmtlZCBpbnN0cnVjdGlvbnMgaW50byBhIGJhc2ljIGJsb2NrCisgIC8vLyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgdm9pZCBpbnNlcnRCZWZvcmUoSW5zdHJ1Y3Rpb24gKkluc2VydFBvcyk7CisKKyAgLy8vIGluc2VydEFmdGVyIC0gSW5zZXJ0IGFuIHVubGlua2VkIGluc3RydWN0aW9ucyBpbnRvIGEgYmFzaWMgYmxvY2sKKyAgLy8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgaW5zZXJ0QWZ0ZXIoSW5zdHJ1Y3Rpb24gKkluc2VydFBvcyk7CisKKyAgLy8vIG1vdmVCZWZvcmUgLSBVbmxpbmsgdGhpcyBpbnN0cnVjdGlvbiBmcm9tIGl0cyBjdXJyZW50IGJhc2ljIGJsb2NrIGFuZAorICAvLy8gaW5zZXJ0IGl0IGludG8gdGhlIGJhc2ljIGJsb2NrIHRoYXQgTW92ZVBvcyBsaXZlcyBpbiwgcmlnaHQgYmVmb3JlCisgIC8vLyBNb3ZlUG9zLgorICB2b2lkIG1vdmVCZWZvcmUoSW5zdHJ1Y3Rpb24gKk1vdmVQb3MpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBTdWJjbGFzcyBjbGFzc2lmaWNhdGlvbi4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIAorICAvLy8gZ2V0T3Bjb2RlKCkgcmV0dXJucyBhIG1lbWJlciBvZiBvbmUgb2YgdGhlIGVudW1zIGxpa2UgSW5zdHJ1Y3Rpb246OkFkZC4KKyAgdW5zaWduZWQgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsdWVJRCgpIC0gSW5zdHJ1Y3Rpb25WYWw7IH0KKyAgCisgIGNvbnN0IGNoYXIgKmdldE9wY29kZU5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGVOYW1lKGdldE9wY29kZSgpKTsgfQorICBib29sIGlzVGVybWluYXRvcigpIGNvbnN0IHsgcmV0dXJuIGlzVGVybWluYXRvcihnZXRPcGNvZGUoKSk7IH0KKyAgYm9vbCBpc0JpbmFyeU9wKCkgY29uc3QgeyByZXR1cm4gaXNCaW5hcnlPcChnZXRPcGNvZGUoKSk7IH0KKyAgYm9vbCBpc1NoaWZ0KCkgeyByZXR1cm4gaXNTaGlmdChnZXRPcGNvZGUoKSk7IH0KKyAgYm9vbCBpc0Nhc3QoKSBjb25zdCB7IHJldHVybiBpc0Nhc3QoZ2V0T3Bjb2RlKCkpOyB9CisgIAorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0T3Bjb2RlTmFtZSh1bnNpZ25lZCBPcENvZGUpOworCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1Rlcm1pbmF0b3IodW5zaWduZWQgT3BDb2RlKSB7CisgICAgcmV0dXJuIE9wQ29kZSA+PSBUZXJtT3BzQmVnaW4gJiYgT3BDb2RlIDwgVGVybU9wc0VuZDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0JpbmFyeU9wKHVuc2lnbmVkIE9wY29kZSkgeworICAgIHJldHVybiBPcGNvZGUgPj0gQmluYXJ5T3BzQmVnaW4gJiYgT3Bjb2RlIDwgQmluYXJ5T3BzRW5kOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIE9wY29kZSBpcyBvbmUgb2YgdGhlIHNoaWZ0IGluc3RydWN0aW9ucy4KKyAgc3RhdGljIGlubGluZSBib29sIGlzU2hpZnQodW5zaWduZWQgT3Bjb2RlKSB7CisgICAgcmV0dXJuIE9wY29kZSA+PSBTaGwgJiYgT3Bjb2RlIDw9IEFTaHI7CisgIH0KKworICAvLy8gaXNMb2dpY2FsU2hpZnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgbG9naWNhbCBzaGlmdCBsZWZ0IG9yIGEgbG9naWNhbAorICAvLy8gc2hpZnQgcmlnaHQuCisgIGlubGluZSBib29sIGlzTG9naWNhbFNoaWZ0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBTaGwgfHwgZ2V0T3Bjb2RlKCkgPT0gTFNocjsKKyAgfQorCisgIC8vLyBpc0FyaXRobWV0aWNTaGlmdCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gYXJpdGhtZXRpYyBzaGlmdCByaWdodC4KKyAgaW5saW5lIGJvb2wgaXNBcml0aG1ldGljU2hpZnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wY29kZSgpID09IEFTaHI7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgT3BDb2RlIGlzIG9uZSBvZiB0aGUgQ2FzdEluc3QgaW5zdHJ1Y3Rpb25zLgorICBzdGF0aWMgaW5saW5lIGJvb2wgaXNDYXN0KHVuc2lnbmVkIE9wQ29kZSkgeworICAgIHJldHVybiBPcENvZGUgPj0gQ2FzdE9wc0JlZ2luICYmIE9wQ29kZSA8IENhc3RPcHNFbmQ7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWV0YWRhdGEgbWFuaXB1bGF0aW9uLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgCisgIC8vLyBoYXNNZXRhZGF0YSgpIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgYW55IG1ldGFkYXRhIGF0dGFjaGVkCisgIC8vLyB0byBpdC4KKyAgYm9vbCBoYXNNZXRhZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIURiZ0xvYy5pc1Vua25vd24oKSB8fCBoYXNNZXRhZGF0YUhhc2hFbnRyeSgpOworICB9CisgIAorICAvLy8gaGFzTWV0YWRhdGFPdGhlclRoYW5EZWJ1Z0xvYyAtIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzCisgIC8vLyBtZXRhZGF0YSBhdHRhY2hlZCB0byBpdCBvdGhlciB0aGFuIGEgZGVidWcgbG9jYXRpb24uCisgIGJvb2wgaGFzTWV0YWRhdGFPdGhlclRoYW5EZWJ1Z0xvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzTWV0YWRhdGFIYXNoRW50cnkoKTsKKyAgfQorICAKKyAgLy8vIGdldE1ldGFkYXRhIC0gR2V0IHRoZSBtZXRhZGF0YSBvZiBnaXZlbiBraW5kIGF0dGFjaGVkIHRvIHRoaXMgSW5zdHJ1Y3Rpb24uCisgIC8vLyBJZiB0aGUgbWV0YWRhdGEgaXMgbm90IGZvdW5kIHRoZW4gcmV0dXJuIG51bGwuCisgIE1ETm9kZSAqZ2V0TWV0YWRhdGEodW5zaWduZWQgS2luZElEKSBjb25zdCB7CisgICAgaWYgKCFoYXNNZXRhZGF0YSgpKSByZXR1cm4gMDsKKyAgICByZXR1cm4gZ2V0TWV0YWRhdGFJbXBsKEtpbmRJRCk7CisgIH0KKyAgCisgIC8vLyBnZXRNZXRhZGF0YSAtIEdldCB0aGUgbWV0YWRhdGEgb2YgZ2l2ZW4ga2luZCBhdHRhY2hlZCB0byB0aGlzIEluc3RydWN0aW9uLgorICAvLy8gSWYgdGhlIG1ldGFkYXRhIGlzIG5vdCBmb3VuZCB0aGVuIHJldHVybiBudWxsLgorICBNRE5vZGUgKmdldE1ldGFkYXRhKGNvbnN0IGNoYXIgKktpbmQpIGNvbnN0IHsKKyAgICBpZiAoIWhhc01ldGFkYXRhKCkpIHJldHVybiAwOworICAgIHJldHVybiBnZXRNZXRhZGF0YUltcGwoS2luZCk7CisgIH0KKyAgCisgIC8vLyBnZXRBbGxNZXRhZGF0YSAtIEdldCBhbGwgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyBJbnN0cnVjdGlvbi4gIFRoZSBmaXJzdAorICAvLy8gZWxlbWVudCBvZiBlYWNoIHBhaXIgcmV0dXJuZWQgaXMgdGhlIEtpbmRJRCwgdGhlIHNlY29uZCBlbGVtZW50IGlzIHRoZQorICAvLy8gbWV0YWRhdGEgdmFsdWUuICBUaGlzIGxpc3QgaXMgcmV0dXJuZWQgc29ydGVkIGJ5IHRoZSBLaW5kSUQuCisgIHZvaWQgZ2V0QWxsTWV0YWRhdGEoU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTUROb2RlKj4gPiAmTURzKWNvbnN0eworICAgIGlmIChoYXNNZXRhZGF0YSgpKQorICAgICAgZ2V0QWxsTWV0YWRhdGFJbXBsKE1Ecyk7CisgIH0KKyAgCisgIC8vLyBnZXRBbGxNZXRhZGF0YU90aGVyVGhhbkRlYnVnTG9jIC0gVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzCisgIC8vLyBnZXRBbGxNZXRhZGF0YSwgZXhjZXB0IHRoYXQgaXQgZmlsdGVycyBvdXQgdGhlIGRlYnVnIGxvY2F0aW9uLgorICB2b2lkIGdldEFsbE1ldGFkYXRhT3RoZXJUaGFuRGVidWdMb2MoU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSo+ID4gJk1EcykgY29uc3QgeworICAgIGlmIChoYXNNZXRhZGF0YU90aGVyVGhhbkRlYnVnTG9jKCkpCisgICAgICBnZXRBbGxNZXRhZGF0YU90aGVyVGhhbkRlYnVnTG9jSW1wbChNRHMpOworICB9CisgIAorICAvLy8gc2V0TWV0YWRhdGEgLSBTZXQgdGhlIG1ldGFkYXRhIG9mIHRoZSBzcGVjaWZpZWQga2luZCB0byB0aGUgc3BlY2lmaWVkCisgIC8vLyBub2RlLiAgVGhpcyB1cGRhdGVzL3JlcGxhY2VzIG1ldGFkYXRhIGlmIGFscmVhZHkgcHJlc2VudCwgb3IgcmVtb3ZlcyBpdCBpZgorICAvLy8gTm9kZSBpcyBudWxsLgorICB2b2lkIHNldE1ldGFkYXRhKHVuc2lnbmVkIEtpbmRJRCwgTUROb2RlICpOb2RlKTsKKyAgdm9pZCBzZXRNZXRhZGF0YShjb25zdCBjaGFyICpLaW5kLCBNRE5vZGUgKk5vZGUpOworCisgIC8vLyBzZXREZWJ1Z0xvYyAtIFNldCB0aGUgZGVidWcgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0RGVidWdMb2MoY29uc3QgRGVidWdMb2MgJkxvYykgeyBEYmdMb2MgPSBMb2M7IH0KKyAgCisgIC8vLyBnZXREZWJ1Z0xvYyAtIFJldHVybiB0aGUgZGVidWcgbG9jYXRpb24gZm9yIHRoaXMgbm9kZSBhcyBhIERlYnVnTG9jLgorICBjb25zdCBEZWJ1Z0xvYyAmZ2V0RGVidWdMb2MoKSBjb25zdCB7IHJldHVybiBEYmdMb2M7IH0KKyAgCitwcml2YXRlOgorICAvLy8gaGFzTWV0YWRhdGFIYXNoRW50cnkgLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGFuIGVudHJ5IGluIHRoZSBvbi10aGUtc2lkZQorICAvLy8gbWV0YWRhdGEgaGFzaC4KKyAgYm9vbCBoYXNNZXRhZGF0YUhhc2hFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICYgSGFzTWV0YWRhdGFCaXQpICE9IDA7CisgIH0KKyAgCisgIC8vIFRoZXNlIGFyZSBhbGwgaW1wbGVtZW50ZWQgaW4gTWV0YWRhdGEuY3BwLgorICBNRE5vZGUgKmdldE1ldGFkYXRhSW1wbCh1bnNpZ25lZCBLaW5kSUQpIGNvbnN0OworICBNRE5vZGUgKmdldE1ldGFkYXRhSW1wbChjb25zdCBjaGFyICpLaW5kKSBjb25zdDsKKyAgdm9pZCBnZXRBbGxNZXRhZGF0YUltcGwoU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCxNRE5vZGUqPiA+ICYpY29uc3Q7CisgIHZvaWQgZ2V0QWxsTWV0YWRhdGFPdGhlclRoYW5EZWJ1Z0xvY0ltcGwoU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUqPiA+ICYpIGNvbnN0OworICB2b2lkIGNsZWFyTWV0YWRhdGFIYXNoRW50cmllcygpOworcHVibGljOgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUHJlZGljYXRlcyBhbmQgaGVscGVyIG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAKKyAgCisgIC8vLyBpc0Fzc29jaWF0aXZlIC0gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGFzc29jaWF0aXZlOgorICAvLy8KKyAgLy8vICAgQXNzb2NpYXRpdmUgb3BlcmF0b3JzIHNhdGlzZnk6ICB4IG9wICh5IG9wIHopID09PSAoeCBvcCB5KSBvcCB6CisgIC8vLworICAvLy8gSW4gTExWTSwgdGhlIEFkZCwgTXVsLCBBbmQsIE9yLCBhbmQgWG9yIG9wZXJhdG9ycyBhcmUgYXNzb2NpYXRpdmUsIHdoZW4KKyAgLy8vIG5vdCBhcHBsaWVkIHRvIGZsb2F0aW5nIHBvaW50IHR5cGVzLgorICAvLy8KKyAgYm9vbCBpc0Fzc29jaWF0aXZlKCkgY29uc3QgeyByZXR1cm4gaXNBc3NvY2lhdGl2ZShnZXRPcGNvZGUoKSwgZ2V0VHlwZSgpKTsgfQorICBzdGF0aWMgYm9vbCBpc0Fzc29jaWF0aXZlKHVuc2lnbmVkIG9wLCBjb25zdCBUeXBlICpUeSk7CisKKyAgLy8vIGlzQ29tbXV0YXRpdmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgY29tbXV0YXRpdmU6CisgIC8vLworICAvLy8gICBDb21tdXRhdGl2ZSBvcGVyYXRvcnMgc2F0aXNmeTogKHggb3AgeSkgPT09ICh5IG9wIHgpCisgIC8vLworICAvLy8gSW4gTExWTSwgdGhlc2UgYXJlIHRoZSBhc3NvY2lhdGl2ZSBvcGVyYXRvcnMsIHBsdXMgU2V0RVEgYW5kIFNldE5FLCB3aGVuCisgIC8vLyBhcHBsaWVkIHRvIGFueSB0eXBlLgorICAvLy8KKyAgYm9vbCBpc0NvbW11dGF0aXZlKCkgY29uc3QgeyByZXR1cm4gaXNDb21tdXRhdGl2ZShnZXRPcGNvZGUoKSk7IH0KKyAgc3RhdGljIGJvb2wgaXNDb21tdXRhdGl2ZSh1bnNpZ25lZCBvcCk7CisKKyAgLy8vIG1heVdyaXRlVG9NZW1vcnkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIG1heSBtb2RpZnkgbWVtb3J5LgorICAvLy8KKyAgYm9vbCBtYXlXcml0ZVRvTWVtb3J5KCkgY29uc3Q7CisKKyAgLy8vIG1heVJlYWRGcm9tTWVtb3J5IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBtYXkgcmVhZCBtZW1vcnkuCisgIC8vLworICBib29sIG1heVJlYWRGcm9tTWVtb3J5KCkgY29uc3Q7CisKKyAgLy8vIG1heUhhdmVTaWRlRWZmZWN0cyAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgY29uc2lkZXIgbWFsbG9jIGFuZCBhbGxvY2EgdG8gaGF2ZSBzaWRlCisgIC8vLyBlZmZlY3RzIGJlY2F1c2UgdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgaXMgY29tcGxldGVseSBpbnZpc2libGUgdG8KKyAgLy8vIGluc3RydWN0aW9ucyB3aGljaCBkb24ndCB1c2VkIHRoZSByZXR1cm5lZCB2YWx1ZS4gIEZvciBjYXNlcyB3aGVyZSB0aGlzCisgIC8vLyBtYXR0ZXJzLCBpc1NhZmVUb1NwZWN1bGF0aXZlbHlFeGVjdXRlIG1heSBiZSBtb3JlIGFwcHJvcHJpYXRlLgorICBib29sIG1heUhhdmVTaWRlRWZmZWN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF5V3JpdGVUb01lbW9yeSgpOworICB9CisKKyAgLy8vIGlzU2FmZVRvU3BlY3VsYXRpdmVseUV4ZWN1dGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QKKyAgLy8vIGhhdmUgYW55IGVmZmVjdHMgYmVzaWRlcyBjYWxjdWxhdGluZyB0aGUgcmVzdWx0IGFuZCBkb2VzIG5vdCBoYXZlCisgIC8vLyB1bmRlZmluZWQgYmVoYXZpb3IuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyB0cnVlIGZvciBhbiBpbnN0cnVjdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBmb3IKKyAgLy8vIG1heUhhdmVTaWRlRWZmZWN0czsgaG93ZXZlciwgdGhpcyBtZXRob2QgYWxzbyBkb2VzIHNvbWUgb3RoZXIgY2hlY2tzIGluCisgIC8vLyBhZGRpdGlvbi4gSXQgY2hlY2tzIGZvciB1bmRlZmluZWQgYmVoYXZpb3IsIGxpa2UgZGl2aWRpbmcgYnkgemVybyBvcgorICAvLy8gbG9hZGluZyBmcm9tIGFuIGludmFsaWQgcG9pbnRlciAoYnV0IG5vdCBmb3IgdW5kZWZpbmVkIHJlc3VsdHMsIGxpa2UgYQorICAvLy8gc2hpZnQgd2l0aCBhIHNoaWZ0IGFtb3VudCBsYXJnZXIgdGhhbiB0aGUgd2lkdGggb2YgdGhlIHJlc3VsdCkuIEl0IGNoZWNrcworICAvLy8gZm9yIG1hbGxvYyBhbmQgYWxsb2NhIGJlY2F1c2Ugc3BlY3VsYXRpdmVseSBleGVjdXRpbmcgdGhlbSBtaWdodCBjYXVzZSBhCisgIC8vLyBtZW1vcnkgbGVhay4gSXQgYWxzbyByZXR1cm5zIGZhbHNlIGZvciBpbnN0cnVjdGlvbnMgcmVsYXRlZCB0byBjb250cm9sCisgIC8vLyBmbG93LCBzcGVjaWZpY2FsbHkgdGVybWluYXRvcnMgYW5kIFBISSBub2Rlcy4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBvbmx5IGxvb2tzIGF0IHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYgYW5kIGl0cyBvcGVyYW5kcywgc28gaWYKKyAgLy8vIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaXQgaXMgc2FmZSB0byBtb3ZlIHRoZSBpbnN0cnVjdGlvbiBhcyBsb25nIGFzCisgIC8vLyB0aGUgY29ycmVjdCBkb21pbmFuY2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIG9wZXJhbmRzIGFuZCB1c2VycyBob2xkLgorICAvLy8gSG93ZXZlciwgdGhpcyBtZXRob2QgY2FuIHJldHVybiB0cnVlIGZvciBpbnN0cnVjdGlvbnMgdGhhdCByZWFkIG1lbW9yeTsKKyAgLy8vIGZvciBzdWNoIGluc3RydWN0aW9ucywgbW92aW5nIHRoZW0gbWF5IGNoYW5nZSB0aGUgcmVzdWx0aW5nIHZhbHVlLgorICBib29sIGlzU2FmZVRvU3BlY3VsYXRpdmVseUV4ZWN1dGUoKSBjb25zdDsKKworICAvLy8gY2xvbmUoKSAtIENyZWF0ZSBhIGNvcHkgb2YgJ3RoaXMnIGluc3RydWN0aW9uIHRoYXQgaXMgaWRlbnRpY2FsIGluIGFsbAorICAvLy8gd2F5cyBleGNlcHQgdGhlIGZvbGxvd2luZzoKKyAgLy8vICAgKiBUaGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIHBhcmVudAorICAvLy8gICAqIFRoZSBpbnN0cnVjdGlvbiBoYXMgbm8gbmFtZQorICAvLy8KKyAgSW5zdHJ1Y3Rpb24gKmNsb25lKCkgY29uc3Q7CisgIAorICAvLy8gaXNJZGVudGljYWxUbyAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgZXhhY3RseQorICAvLy8gaWRlbnRpY2FsIHRvIHRoZSBjdXJyZW50IG9uZS4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgb3BlcmFuZHMgbWF0Y2ggYW5kIGFueQorICAvLy8gZXh0cmEgaW5mb3JtYXRpb24gKGUuZy4gbG9hZCBpcyB2b2xhdGlsZSkgYWdyZWUuCisgIGJvb2wgaXNJZGVudGljYWxUbyhjb25zdCBJbnN0cnVjdGlvbiAqSSkgY29uc3Q7CisgIAorICAvLy8gaXNJZGVudGljYWxUb1doZW5EZWZpbmVkIC0gVGhpcyBpcyBsaWtlIGlzSWRlbnRpY2FsVG8sIGV4Y2VwdCB0aGF0IGl0CisgIC8vLyBpZ25vcmVzIHRoZSBTdWJjbGFzc09wdGlvbmFsRGF0YSBmbGFncywgd2hpY2ggc3BlY2lmeSBjb25kaXRpb25zCisgIC8vLyB1bmRlciB3aGljaCB0aGUgaW5zdHJ1Y3Rpb24ncyByZXN1bHQgaXMgdW5kZWZpbmVkLgorICBib29sIGlzSWRlbnRpY2FsVG9XaGVuRGVmaW5lZChjb25zdCBJbnN0cnVjdGlvbiAqSSkgY29uc3Q7CisgIAorICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gZXhlY3V0ZXMgdGhlIHNhbWUKKyAgLy8vIG9wZXJhdGlvbiBhcyB0aGUgY3VycmVudCBvbmUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgb3Bjb2RlcywgdHlwZSwgb3BlcmFuZAorICAvLy8gdHlwZXMgYW5kIGFueSBvdGhlciBmYWN0b3JzIGFmZmVjdGluZyB0aGUgb3BlcmF0aW9uIG11c3QgYmUgdGhlIHNhbWUuIFRoaXMKKyAgLy8vIGlzIHNpbWlsYXIgdG8gaXNJZGVudGljYWxUbyBleGNlcHQgdGhlIG9wZXJhbmRzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSB0bworICAvLy8gYmUgaWRlbnRpY2FsLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcworICAvLy8gdGhlIGN1cnJlbnQgb25lLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiBvbmUgaW5zdHJ1Y3Rpb24gaXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzIGFub3RoZXIuCisgIGJvb2wgaXNTYW1lT3BlcmF0aW9uQXMoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0OworICAKKyAgLy8vIGlzVXNlZE91dHNpZGVPZkJsb2NrIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSB1c2VzIG9mIHRoaXMKKyAgLy8vIGluc3RydWN0aW9uIGluIGJsb2NrcyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgYmxvY2suICBOb3RlIHRoYXQgUEhJIG5vZGVzCisgIC8vLyBhcmUgY29uc2lkZXJlZCB0byBldmFsdWF0ZSB0aGVpciBvcGVyYW5kcyBpbiB0aGUgY29ycmVzcG9uZGluZyBwcmVkZWNlc3NvcgorICAvLy8gYmxvY2suCisgIGJvb2wgaXNVc2VkT3V0c2lkZU9mQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworICAKKyAgCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA+PSBWYWx1ZTo6SW5zdHJ1Y3Rpb25WYWw7CisgIH0KKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRXhwb3J0ZWQgZW51bWVyYXRpb25zLgorICAvLworICBlbnVtIFRlcm1PcHMgeyAgICAgICAvLyBUaGVzZSB0ZXJtaW5hdGUgYmFzaWMgYmxvY2tzCisjZGVmaW5lICBGSVJTVF9URVJNX0lOU1QoTikgICAgICAgICAgICAgVGVybU9wc0JlZ2luID0gTiwKKyNkZWZpbmUgSEFORExFX1RFUk1fSU5TVChOLCBPUEMsIENMQVNTKSBPUEMgPSBOLAorI2RlZmluZSAgIExBU1RfVEVSTV9JTlNUKE4pICAgICAgICAgICAgIFRlcm1PcHNFbmQgPSBOKzEKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmRlZiIKKyAgfTsKKworICBlbnVtIEJpbmFyeU9wcyB7CisjZGVmaW5lICBGSVJTVF9CSU5BUllfSU5TVChOKSAgICAgICAgICAgICBCaW5hcnlPcHNCZWdpbiA9IE4sCisjZGVmaW5lIEhBTkRMRV9CSU5BUllfSU5TVChOLCBPUEMsIENMQVNTKSBPUEMgPSBOLAorI2RlZmluZSAgIExBU1RfQklOQVJZX0lOU1QoTikgICAgICAgICAgICAgQmluYXJ5T3BzRW5kID0gTisxCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbi5kZWYiCisgIH07CisKKyAgZW51bSBNZW1vcnlPcHMgeworI2RlZmluZSAgRklSU1RfTUVNT1JZX0lOU1QoTikgICAgICAgICAgICAgTWVtb3J5T3BzQmVnaW4gPSBOLAorI2RlZmluZSBIQU5ETEVfTUVNT1JZX0lOU1QoTiwgT1BDLCBDTEFTUykgT1BDID0gTiwKKyNkZWZpbmUgICBMQVNUX01FTU9SWV9JTlNUKE4pICAgICAgICAgICAgIE1lbW9yeU9wc0VuZCA9IE4rMQorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb24uZGVmIgorICB9OworCisgIGVudW0gQ2FzdE9wcyB7CisjZGVmaW5lICBGSVJTVF9DQVNUX0lOU1QoTikgICAgICAgICAgICAgQ2FzdE9wc0JlZ2luID0gTiwKKyNkZWZpbmUgSEFORExFX0NBU1RfSU5TVChOLCBPUEMsIENMQVNTKSBPUEMgPSBOLAorI2RlZmluZSAgIExBU1RfQ0FTVF9JTlNUKE4pICAgICAgICAgICAgIENhc3RPcHNFbmQgPSBOKzEKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmRlZiIKKyAgfTsKKworICBlbnVtIE90aGVyT3BzIHsKKyNkZWZpbmUgIEZJUlNUX09USEVSX0lOU1QoTikgICAgICAgICAgICAgT3RoZXJPcHNCZWdpbiA9IE4sCisjZGVmaW5lIEhBTkRMRV9PVEhFUl9JTlNUKE4sIE9QQywgQ0xBU1MpIE9QQyA9IE4sCisjZGVmaW5lICAgTEFTVF9PVEhFUl9JTlNUKE4pICAgICAgICAgICAgIE90aGVyT3BzRW5kID0gTisxCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbi5kZWYiCisgIH07Citwcml2YXRlOgorICAvLyBTaGFkb3cgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcgbWV0aG9kIHNvIHRoYXQKKyAgLy8gc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRWYWx1ZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhKEQpOworICB9CisgIHVuc2lnbmVkIHNob3J0IGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWU6OmdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpOworICB9CisgIAorICB2b2lkIHNldEhhc01ldGFkYXRhSGFzaEVudHJ5KGJvb2wgVikgeworICAgIHNldFZhbHVlU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmIH5IYXNNZXRhZGF0YUJpdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIChWID8gSGFzTWV0YWRhdGFCaXQgOiAwKSk7CisgIH0KKyAgCisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8SW5zdHJ1Y3Rpb24sIEJhc2ljQmxvY2s+OworICB2b2lkIHNldFBhcmVudChCYXNpY0Jsb2NrICpQKTsKK3Byb3RlY3RlZDoKKyAgLy8gSW5zdHJ1Y3Rpb24gc3ViY2xhc3NlcyBjYW4gc3RpY2sgdXAgdG8gMTUgYml0cyBvZiBzdHVmZiBpbnRvIHRoZQorICAvLyBTdWJjbGFzc0RhdGEgZmllbGQgb2YgaW5zdHJ1Y3Rpb24gd2l0aCB0aGVzZSBtZW1iZXJzLgorICAKKyAgLy8gVmVyaWZ5IHRoYXQgb25seSB0aGUgbG93IDE1IGJpdHMgYXJlIHVzZWQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIGFzc2VydCgoRCAmIEhhc01ldGFkYXRhQml0KSA9PSAwICYmICJPdXQgb2YgcmFuZ2UgdmFsdWUgcHV0IGludG8gZmllbGQiKTsKKyAgICBzZXRWYWx1ZVN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiBIYXNNZXRhZGF0YUJpdCkgfCBEKTsKKyAgfQorICAKKyAgdW5zaWduZWQgZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmIH5IYXNNZXRhZGF0YUJpdDsKKyAgfQorICAKKyAgSW5zdHJ1Y3Rpb24oY29uc3QgVHlwZSAqVHksIHVuc2lnbmVkIGlUeXBlLCBVc2UgKk9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCk7CisgIEluc3RydWN0aW9uKGNvbnN0IFR5cGUgKlR5LCB1bnNpZ25lZCBpVHlwZSwgVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICB2aXJ0dWFsIEluc3RydWN0aW9uICpjbG9uZV9pbXBsKCkgY29uc3QgPSAwOworICAKK307CisKKy8vIEluc3RydWN0aW9uKiBpcyBvbmx5IDQtYnl0ZSBhbGlnbmVkLgordGVtcGxhdGU8PgorY2xhc3MgUG9pbnRlckxpa2VUeXBlVHJhaXRzPEluc3RydWN0aW9uKj4geworICB0eXBlZGVmIEluc3RydWN0aW9uKiBQVDsKK3B1YmxpYzoKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFBUIFApIHsgcmV0dXJuIFA7IH0KKyAgc3RhdGljIGlubGluZSBQVCBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQVD4oUCk7CisgIH0KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAyIH07Cit9OworICAKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0luc3RydWN0aW9ucy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0luc3RydWN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTUxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW5zdHJ1Y3Rpb25zLmgKQEAgLTAsMCArMSwyNzM2IEBACisvLz09PS0tIGxsdm0vSW5zdHJ1Y3Rpb25zLmggLSBJbnN0cnVjdGlvbiBzdWJjbGFzcyBkZWZpbml0aW9ucyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBleHBvc2VzIHRoZSBjbGFzcyBkZWZpbml0aW9ucyBvZiBhbGwgb2YgdGhlIHN1YmNsYXNzZXMgb2YgdGhlCisvLyBJbnN0cnVjdGlvbiBjbGFzcy4gIFRoaXMgaXMgbWVhbnQgdG8gYmUgYW4gZWFzeSB3YXkgdG8gZ2V0IGFjY2VzcyB0byBhbGwKKy8vIGluc3RydWN0aW9uIHN1YmNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lOU1RSVUNUSU9OU19ICisjZGVmaW5lIExMVk1fSU5TVFJVQ1RJT05TX0gKKworI2luY2x1ZGUgImxsdm0vSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29uc3RhbnRJbnQ7CitjbGFzcyBDb25zdGFudFJhbmdlOworY2xhc3MgQVBJbnQ7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIERvbWluYXRvclRyZWU7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEFsbG9jYUluc3QgLSBhbiBpbnN0cnVjdGlvbiB0byBhbGxvY2F0ZSBtZW1vcnkgb24gdGhlIHN0YWNrCisvLy8KK2NsYXNzIEFsbG9jYUluc3QgOiBwdWJsaWMgVW5hcnlJbnN0cnVjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgQWxsb2NhSW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworcHVibGljOgorICBleHBsaWNpdCBBbGxvY2FJbnN0KGNvbnN0IFR5cGUgKlR5LCBWYWx1ZSAqQXJyYXlTaXplID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCk7CisgIEFsbG9jYUluc3QoY29uc3QgVHlwZSAqVHksIFZhbHVlICpBcnJheVNpemUsIAorICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICBBbGxvY2FJbnN0KGNvbnN0IFR5cGUgKlR5LCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCk7CisgIEFsbG9jYUluc3QoY29uc3QgVHlwZSAqVHksIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICBBbGxvY2FJbnN0KGNvbnN0IFR5cGUgKlR5LCBWYWx1ZSAqQXJyYXlTaXplLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCk7CisgIEFsbG9jYUluc3QoY29uc3QgVHlwZSAqVHksIFZhbHVlICpBcnJheVNpemUsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZCwgc28gdGhlIHZ0YWJsZSwgZXRjLiBoYXMgYSBob21lLgorICB2aXJ0dWFsIH5BbGxvY2FJbnN0KCk7CisKKyAgLy8vIGlzQXJyYXlBbGxvY2F0aW9uIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW4gYWxsb2NhdGlvbiBzaXplIHBhcmFtZXRlcgorICAvLy8gdG8gdGhlIGFsbG9jYXRpb24gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBub3QgMS4KKyAgLy8vCisgIGJvb2wgaXNBcnJheUFsbG9jYXRpb24oKSBjb25zdDsKKworICAvLy8gZ2V0QXJyYXlTaXplIC0gR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWxsb2NhdGVkLiBGb3IgYSBzaW1wbGUKKyAgLy8vIGFsbG9jYXRpb24gb2YgYSBzaW5nbGUgZWxlbWVudCwgdGhpcyB3aWxsIHJldHVybiBhIGNvbnN0YW50IDEgdmFsdWUuCisgIC8vLworICBjb25zdCBWYWx1ZSAqZ2V0QXJyYXlTaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBWYWx1ZSAqZ2V0QXJyYXlTaXplKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorCisgIC8vLyBnZXRUeXBlIC0gT3ZlcmxvYWQgdG8gcmV0dXJuIG1vc3Qgc3BlY2lmaWMgcG9pbnRlciB0eXBlCisgIC8vLworICBjb25zdCBQb2ludGVyVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQb2ludGVyVHlwZSo+KEluc3RydWN0aW9uOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIGdldEFsbG9jYXRlZFR5cGUgLSBSZXR1cm4gdGhlIHR5cGUgdGhhdCBpcyBiZWluZyBhbGxvY2F0ZWQgYnkgdGhlCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIGNvbnN0IFR5cGUgKmdldEFsbG9jYXRlZFR5cGUoKSBjb25zdDsKKworICAvLy8gZ2V0QWxpZ25tZW50IC0gUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgdGhlIG1lbW9yeSB0aGF0IGlzIGJlaW5nIGFsbG9jYXRlZAorICAvLy8gYnkgdGhlIGluc3RydWN0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiAoMXUgPDwgZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkpID4+IDE7CisgIH0KKyAgdm9pZCBzZXRBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pOworCisgIC8vLyBpc1N0YXRpY0FsbG9jYSAtIFJldHVybiB0cnVlIGlmIHRoaXMgYWxsb2NhIGlzIGluIHRoZSBlbnRyeSBibG9jayBvZiB0aGUKKyAgLy8vIGZ1bmN0aW9uIGFuZCBpcyBhIGNvbnN0YW50IHNpemUuICBJZiBzbywgdGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZm9sZCBpdAorICAvLy8gaW50byB0aGUgcHJvbG9nL2VwaWxvZyBjb2RlLCBzbyBpdCBpcyBiYXNpY2FsbHkgZnJlZS4KKyAgYm9vbCBpc1N0YXRpY0FsbG9jYSgpIGNvbnN0OworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEFsbG9jYUluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFsbG9jYSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorcHJpdmF0ZToKKyAgLy8gU2hhZG93IEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nCisgIC8vIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShEKTsKKyAgfQorfTsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gTG9hZEluc3QgLSBhbiBpbnN0cnVjdGlvbiBmb3IgcmVhZGluZyBmcm9tIG1lbW9yeS4gIFRoaXMgdXNlcyB0aGUKKy8vLyBTdWJjbGFzc0RhdGEgZmllbGQgaW4gVmFsdWUgdG8gc3RvcmUgd2hldGhlciBvciBub3QgdGhlIGxvYWQgaXMgdm9sYXRpbGUuCisvLy8KK2NsYXNzIExvYWRJbnN0IDogcHVibGljIFVuYXJ5SW5zdHJ1Y3Rpb24geworICB2b2lkIEFzc2VydE9LKCk7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgTG9hZEluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKK3B1YmxpYzoKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIExvYWRJbnN0KFZhbHVlICpQdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgZXhwbGljaXQgTG9hZEluc3QoVmFsdWUgKlB0ciwgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsCisgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKTsKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vLyBpc1ZvbGF0aWxlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGxvYWQgZnJvbSBhIHZvbGF0aWxlIG1lbW9yeQorICAvLy8gbG9jYXRpb24uCisgIC8vLworICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7IHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDE7IH0KKworICAvLy8gc2V0Vm9sYXRpbGUgLSBTcGVjaWZ5IHdoZXRoZXIgdGhpcyBpcyBhIHZvbGF0aWxlIGxvYWQgb3Igbm90LgorICAvLy8KKyAgdm9pZCBzZXRWb2xhdGlsZShib29sIFYpIHsKKyAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+MSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWID8gMSA6IDApKTsKKyAgfQorCisgIC8vLyBnZXRBbGlnbm1lbnQgLSBSZXR1cm4gdGhlIGFsaWdubWVudCBvZiB0aGUgYWNjZXNzIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkCisgIC8vLworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuICgxIDw8IChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSA+PiAxKSkgPj4gMTsKKyAgfQorCisgIHZvaWQgc2V0QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKTsKKworICBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIGNvbnN0IFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldFBvaW50ZXJPcGVyYW5kSW5kZXgoKSB7IHJldHVybiAwVTsgfQorCisgIHVuc2lnbmVkIGdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KGdldFBvaW50ZXJPcGVyYW5kKCktPmdldFR5cGUoKSktPmdldEFkZHJlc3NTcGFjZSgpOworICB9CisgIAorICAKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTG9hZEluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TG9hZDsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Citwcml2YXRlOgorICAvLyBTaGFkb3cgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcKKyAgLy8gbWV0aG9kIHNvIHRoYXQgc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKEQpOworICB9Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gU3RvcmVJbnN0IC0gYW4gaW5zdHJ1Y3Rpb24gZm9yIHN0b3JpbmcgdG8gbWVtb3J5CisvLy8KK2NsYXNzIFN0b3JlSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBBc3NlcnRPSygpOworcHJvdGVjdGVkOgorICB2aXJ0dWFsIFN0b3JlSW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0d28gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAyKTsKKyAgfQorICBTdG9yZUluc3QoVmFsdWUgKlZhbCwgVmFsdWUgKlB0ciwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIFN0b3JlSW5zdChWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIFN0b3JlSW5zdChWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUgPSBmYWxzZSwKKyAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKTsKKyAgU3RvcmVJbnN0KFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCk7CisgIFN0b3JlSW5zdChWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgU3RvcmVJbnN0KFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKworICAvLy8gaXNWb2xhdGlsZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBsb2FkIGZyb20gYSB2b2xhdGlsZSBtZW1vcnkKKyAgLy8vIGxvY2F0aW9uLgorICAvLy8KKyAgYm9vbCBpc1ZvbGF0aWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAxOyB9CisKKyAgLy8vIHNldFZvbGF0aWxlIC0gU3BlY2lmeSB3aGV0aGVyIHRoaXMgaXMgYSB2b2xhdGlsZSBsb2FkIG9yIG5vdC4KKyAgLy8vCisgIHZvaWQgc2V0Vm9sYXRpbGUoYm9vbCBWKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoViA/IDEgOiAwKSk7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIGdldEFsaWdubWVudCAtIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIHRoZSBhY2Nlc3MgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQKKyAgLy8vCisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKDEgPDwgKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpID4+IDEpKSA+PiAxOworICB9CisKKyAgdm9pZCBzZXRBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pOworCisgIFZhbHVlICpnZXRWYWx1ZU9wZXJhbmQoKSB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIGNvbnN0IFZhbHVlICpnZXRWYWx1ZU9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIAorICBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIGNvbnN0IFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldFBvaW50ZXJPcGVyYW5kSW5kZXgoKSB7IHJldHVybiAxVTsgfQorCisgIHVuc2lnbmVkIGdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KGdldFBvaW50ZXJPcGVyYW5kKCktPmdldFR5cGUoKSktPmdldEFkZHJlc3NTcGFjZSgpOworICB9CisgIAorICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTdG9yZUluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U3RvcmU7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorcHJpdmF0ZToKKyAgLy8gU2hhZG93IEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nCisgIC8vIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShEKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPFN0b3JlSW5zdD4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDI+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhTdG9yZUluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEVsZW1lbnRQdHJJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBjaGVja1R5cGUgLSBTaW1wbGUgd3JhcHBlciBmdW5jdGlvbiB0byBnaXZlIGEgYmV0dGVyIGFzc2VydGlvbiBmYWlsdXJlCisvLyBtZXNzYWdlIG9uIGJhZCBpbmRleGVzIGZvciBhIGdlcCBpbnN0cnVjdGlvbi4KKy8vCitzdGF0aWMgaW5saW5lIGNvbnN0IFR5cGUgKmNoZWNrVHlwZShjb25zdCBUeXBlICpUeSkgeworICBhc3NlcnQoVHkgJiYgIkludmFsaWQgR2V0RWxlbWVudFB0ckluc3QgaW5kaWNlcyBmb3IgdHlwZSEiKTsKKyAgcmV0dXJuIFR5OworfQorCisvLy8gR2V0RWxlbWVudFB0ckluc3QgLSBhbiBpbnN0cnVjdGlvbiBmb3IgdHlwZS1zYWZlIHBvaW50ZXIgYXJpdGhtZXRpYyB0bworLy8vIGFjY2VzcyBlbGVtZW50cyBvZiBhcnJheXMgYW5kIHN0cnVjdHMKKy8vLworY2xhc3MgR2V0RWxlbWVudFB0ckluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICBHZXRFbGVtZW50UHRySW5zdChjb25zdCBHZXRFbGVtZW50UHRySW5zdCAmR0VQSSk7CisgIHZvaWQgaW5pdChWYWx1ZSAqUHRyLCBWYWx1ZSogY29uc3QgKklkeCwgdW5zaWduZWQgTnVtSWR4KTsKKyAgdm9pZCBpbml0KFZhbHVlICpQdHIsIFZhbHVlICpJZHgpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5pdChWYWx1ZSAqUHRyLCBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLCBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgIC8vIFRoaXMgYXJndW1lbnQgZW5zdXJlcyB0aGF0IHdlIGhhdmUgYW4gaXRlcmF0b3Igd2UgY2FuCisgICAgICAgICAgICAvLyBkbyBhcml0aG1ldGljIG9uIGluIGNvbnN0YW50IHRpbWUKKyAgICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpIHsKKyAgICB1bnNpZ25lZCBOdW1JZHggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc3RkOjpkaXN0YW5jZShJZHhCZWdpbiwgSWR4RW5kKSk7CisKKyAgICBpZiAoTnVtSWR4ID4gMCkgeworICAgICAgLy8gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBpdGVyYXRvciBwb2ludHMgdG8gY29udGlndW91cyBtZW1vcnkuCisgICAgICBpbml0KFB0ciwgJipJZHhCZWdpbiwgTnVtSWR4KTsgLy8gRklYTUU6IGZvciB0aGUgZ2VuZXJhbCBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBidWlsZCBhbiBhcnJheSBoZXJlCisgICAgfQorICAgIGVsc2UgeworICAgICAgaW5pdChQdHIsIDAsIE51bUlkeCk7CisgICAgfQorICB9CisKKyAgLy8vIGdldEluZGV4ZWRUeXBlIC0gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIGxvYWRlZCB3aXRoCisgIC8vLyBhIGxvYWQgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgIC8vLworICAvLy8gTnVsbCBpcyByZXR1cm5lZCBpZiB0aGUgaW5kaWNlcyBhcmUgaW52YWxpZCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlciB0eXBlLgorICAvLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldEluZGV4ZWRUeXBlKGNvbnN0IFR5cGUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYXJndW1lbnQgZW5zdXJlcyB0aGF0IHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIGFuIGl0ZXJhdG9yIHdlIGNhbiBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJpdGhtZXRpYyBvbiBpbiBjb25zdGFudCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKSB7CisgICAgdW5zaWduZWQgTnVtSWR4ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHN0ZDo6ZGlzdGFuY2UoSWR4QmVnaW4sIElkeEVuZCkpOworCisgICAgaWYgKE51bUlkeCA+IDApCisgICAgICAvLyBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGl0ZXJhdG9yIHBvaW50cyB0byBjb250aWd1b3VzIG1lbW9yeS4KKyAgICAgIHJldHVybiBnZXRJbmRleGVkVHlwZShQdHIsICYqSWR4QmVnaW4sIE51bUlkeCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGdldEluZGV4ZWRUeXBlKFB0ciwgKFZhbHVlICpjb25zdCopMCwgTnVtSWR4KTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3RvcnMgLSBDcmVhdGUgYSBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9uIHdpdGggYSBiYXNlIHBvaW50ZXIgYW4KKyAgLy8vIGxpc3Qgb2YgaW5kaWNlcy4gIFRoZSBmaXJzdCBjdG9yIGNhbiBvcHRpb25hbGx5IGluc2VydCBiZWZvcmUgYW4gZXhpc3RpbmcKKyAgLy8vIGluc3RydWN0aW9uLCB0aGUgc2Vjb25kIGFwcGVuZHMgdGhlIG5ldyBpbnN0cnVjdGlvbiB0byB0aGUgc3BlY2lmaWVkCisgIC8vLyBCYXNpY0Jsb2NrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICBpbmxpbmUgR2V0RWxlbWVudFB0ckluc3QoVmFsdWUgKlB0ciwgSW5wdXRJdGVyYXRvciBJZHhCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgIGlubGluZSBHZXRFbGVtZW50UHRySW5zdChWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhCZWdpbiwgSW5wdXRJdGVyYXRvciBJZHhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8vIENvbnN0cnVjdG9ycyAtIFRoZXNlIHR3byBjb25zdHJ1Y3RvcnMgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgYmVjYXVzZSBvbmUKKyAgLy8vIGFuZCB0d28gaW5kZXggZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbnMgYXJlIHNvIGNvbW1vbi4KKyAgR2V0RWxlbWVudFB0ckluc3QoVmFsdWUgKlB0ciwgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworICBHZXRFbGVtZW50UHRySW5zdChWYWx1ZSAqUHRyLCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgR2V0RWxlbWVudFB0ckluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKK3B1YmxpYzoKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgc3RhdGljIEdldEVsZW1lbnRQdHJJbnN0ICpDcmVhdGUoVmFsdWUgKlB0ciwgSW5wdXRJdGVyYXRvciBJZHhCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKSB7CisgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBWYWx1ZXMgPQorICAgICAgMSArIHN0ZDo6ZGlzdGFuY2UoSWR4QmVnaW4sIElkeEVuZCk7CisgICAgcmV0dXJuIG5ldyhWYWx1ZXMpCisgICAgICBHZXRFbGVtZW50UHRySW5zdChQdHIsIElkeEJlZ2luLCBJZHhFbmQsIFZhbHVlcywgSW5zZXJ0QmVmb3JlKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICBzdGF0aWMgR2V0RWxlbWVudFB0ckluc3QgKkNyZWF0ZShWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLCBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIFZhbHVlcyA9CisgICAgICAxICsgc3RkOjpkaXN0YW5jZShJZHhCZWdpbiwgSWR4RW5kKTsKKyAgICByZXR1cm4gbmV3KFZhbHVlcykKKyAgICAgIEdldEVsZW1lbnRQdHJJbnN0KFB0ciwgSWR4QmVnaW4sIElkeEVuZCwgVmFsdWVzLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gQ29uc3RydWN0b3JzIC0gVGhlc2UgdHdvIGNyZWF0b3JzIGFyZSBjb252ZW5pZW5jZSBtZXRob2RzIGJlY2F1c2Ugb25lCisgIC8vLyBpbmRleCBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9ucyBhcmUgc28gY29tbW9uLgorICBzdGF0aWMgR2V0RWxlbWVudFB0ckluc3QgKkNyZWF0ZShWYWx1ZSAqUHRyLCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIHJldHVybiBuZXcoMikgR2V0RWxlbWVudFB0ckluc3QoUHRyLCBJZHgsIEluc2VydEJlZm9yZSk7CisgIH0KKyAgc3RhdGljIEdldEVsZW1lbnRQdHJJbnN0ICpDcmVhdGUoVmFsdWUgKlB0ciwgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KDIpIEdldEVsZW1lbnRQdHJJbnN0KFB0ciwgSWR4LCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gQ3JlYXRlIGFuICJpbmJvdW5kcyIgZ2V0ZWxlbWVudHB0ci4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKKyAgLy8vICJpbmJvdW5kcyIgZmxhZyBpbiBMYW5nUmVmLmh0bWwgZm9yIGRldGFpbHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgIHN0YXRpYyBHZXRFbGVtZW50UHRySW5zdCAqQ3JlYXRlSW5Cb3VuZHMoVmFsdWUgKlB0ciwgSW5wdXRJdGVyYXRvciBJZHhCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBDcmVhdGUoUHRyLCBJZHhCZWdpbiwgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKTsKKyAgICBHRVAtPnNldElzSW5Cb3VuZHModHJ1ZSk7CisgICAgcmV0dXJuIEdFUDsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICBzdGF0aWMgR2V0RWxlbWVudFB0ckluc3QgKkNyZWF0ZUluQm91bmRzKFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBDcmVhdGUoUHRyLCBJZHhCZWdpbiwgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0QXRFbmQpOworICAgIEdFUC0+c2V0SXNJbkJvdW5kcyh0cnVlKTsKKyAgICByZXR1cm4gR0VQOworICB9CisgIHN0YXRpYyBHZXRFbGVtZW50UHRySW5zdCAqQ3JlYXRlSW5Cb3VuZHMoVmFsdWUgKlB0ciwgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBDcmVhdGUoUHRyLCBJZHgsIEluc2VydEJlZm9yZSk7CisgICAgR0VQLT5zZXRJc0luQm91bmRzKHRydWUpOworICAgIHJldHVybiBHRVA7CisgIH0KKyAgc3RhdGljIEdldEVsZW1lbnRQdHJJbnN0ICpDcmVhdGVJbkJvdW5kcyhWYWx1ZSAqUHRyLCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgR2V0RWxlbWVudFB0ckluc3QgKkdFUCA9IENyZWF0ZShQdHIsIElkeCwgSW5zZXJ0QXRFbmQpOworICAgIEdFUC0+c2V0SXNJbkJvdW5kcyh0cnVlKTsKKyAgICByZXR1cm4gR0VQOworICB9CisKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vIGdldFR5cGUgLSBPdmVybG9hZCB0byByZXR1cm4gbW9zdCBzcGVjaWZpYyBwb2ludGVyIHR5cGUuLi4KKyAgY29uc3QgUG9pbnRlclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUG9pbnRlclR5cGUqPihJbnN0cnVjdGlvbjo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBnZXRJbmRleGVkVHlwZSAtIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQgdGhhdCB3b3VsZCBiZSBsb2FkZWQgd2l0aAorICAvLy8gYSBsb2FkIGluc3RydWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIE51bGwgaXMgcmV0dXJuZWQgaWYgdGhlIGluZGljZXMgYXJlIGludmFsaWQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHBvaW50ZXIgdHlwZS4KKyAgLy8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXRJbmRleGVkVHlwZShjb25zdCBUeXBlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhFbmQpIHsKKyAgICByZXR1cm4gZ2V0SW5kZXhlZFR5cGUoUHRyLCBJZHhCZWdpbiwgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJbnB1dEl0ZXJhdG9yPjo6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5KCkpOworICB9CisKKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldEluZGV4ZWRUeXBlKGNvbnN0IFR5cGUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBjb25zdCAqSWR4LCB1bnNpZ25lZCBOdW1JZHgpOworCisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXRJbmRleGVkVHlwZShjb25zdCBUeXBlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb25zdCAqSWR4LCB1bnNpZ25lZCBOdW1JZHgpOworCisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXRJbmRleGVkVHlwZShjb25zdCBUeXBlICpQdHIsIFZhbHVlICpJZHgpOworCisgIGlubGluZSBvcF9pdGVyYXRvciAgICAgICBpZHhfYmVnaW4oKSAgICAgICB7IHJldHVybiBvcF9iZWdpbigpKzE7IH0KKyAgaW5saW5lIGNvbnN0X29wX2l0ZXJhdG9yIGlkeF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIG9wX2JlZ2luKCkrMTsgfQorICBpbmxpbmUgb3BfaXRlcmF0b3IgICAgICAgaWR4X2VuZCgpICAgICAgICAgeyByZXR1cm4gb3BfZW5kKCk7IH0KKyAgaW5saW5lIGNvbnN0X29wX2l0ZXJhdG9yIGlkeF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIG9wX2VuZCgpOyB9CisKKyAgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIGNvbnN0IFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0UG9pbnRlck9wZXJhbmRJbmRleCgpIHsKKyAgICByZXR1cm4gMFU7ICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBmb3IgbW9kaWZ5aW5nIGNvcnJlY3Qgb3BlcmFuZAorICB9CisgIAorICB1bnNpZ25lZCBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFBvaW50ZXJUeXBlPihnZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIC8vLyBnZXRQb2ludGVyT3BlcmFuZFR5cGUgLSBNZXRob2QgdG8gcmV0dXJuIHRoZSBwb2ludGVyIG9wZXJhbmQgYXMgYQorICAvLy8gUG9pbnRlclR5cGUuCisgIGNvbnN0IFBvaW50ZXJUeXBlICpnZXRQb2ludGVyT3BlcmFuZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUG9pbnRlclR5cGUqPihnZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCkpOworICB9CisKKworICB1bnNpZ25lZCBnZXROdW1JbmRpY2VzKCkgY29uc3QgeyAgLy8gTm90ZTogYWx3YXlzIG5vbi1uZWdhdGl2ZQorICAgIHJldHVybiBnZXROdW1PcGVyYW5kcygpIC0gMTsKKyAgfQorCisgIGJvb2wgaGFzSW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA+IDE7CisgIH0KKworICAvLy8gaGFzQWxsWmVyb0luZGljZXMgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIGluZGljZXMgb2YgdGhpcyBHRVAgYXJlCisgIC8vLyB6ZXJvcy4gIElmIHNvLCB0aGUgcmVzdWx0IHBvaW50ZXIgYW5kIHRoZSBmaXJzdCBvcGVyYW5kIGhhdmUgdGhlIHNhbWUKKyAgLy8vIHZhbHVlLCBqdXN0IHBvdGVudGlhbGx5IGRpZmZlcmVudCB0eXBlcy4KKyAgYm9vbCBoYXNBbGxaZXJvSW5kaWNlcygpIGNvbnN0OworCisgIC8vLyBoYXNBbGxDb25zdGFudEluZGljZXMgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIGluZGljZXMgb2YgdGhpcyBHRVAgYXJlCisgIC8vLyBjb25zdGFudCBpbnRlZ2Vycy4gIElmIHNvLCB0aGUgcmVzdWx0IHBvaW50ZXIgYW5kIHRoZSBmaXJzdCBvcGVyYW5kIGhhdmUKKyAgLy8vIGEgY29uc3RhbnQgb2Zmc2V0IGJldHdlZW4gdGhlbS4KKyAgYm9vbCBoYXNBbGxDb25zdGFudEluZGljZXMoKSBjb25zdDsKKworICAvLy8gc2V0SXNJbkJvdW5kcyAtIFNldCBvciBjbGVhciB0aGUgaW5ib3VuZHMgZmxhZyBvbiB0aGlzIEdFUCBpbnN0cnVjdGlvbi4KKyAgLy8vIFNlZSBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mIGluYm91bmRzIG9uIGEgZ2V0ZWxlbWVudHB0ci4KKyAgdm9pZCBzZXRJc0luQm91bmRzKGJvb2wgYiA9IHRydWUpOworCisgIC8vLyBpc0luQm91bmRzIC0gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIEdFUCBoYXMgdGhlIGluYm91bmRzIGZsYWcuCisgIGJvb2wgaXNJbkJvdW5kcygpIGNvbnN0OworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEdldEVsZW1lbnRQdHJJbnN0ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8R2V0RWxlbWVudFB0ckluc3Q+IDogcHVibGljIFZhcmlhZGljT3BlcmFuZFRyYWl0czwxPiB7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorR2V0RWxlbWVudFB0ckluc3Q6OkdldEVsZW1lbnRQdHJJbnN0KFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgOiBJbnN0cnVjdGlvbihQb2ludGVyVHlwZTo6Z2V0KGNoZWNrVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5kZXhlZFR5cGUoUHRyLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkeEJlZ2luLCBJZHhFbmQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldEFkZHJlc3NTcGFjZSgpKSwKKyAgICAgICAgICAgICAgICBHZXRFbGVtZW50UHRyLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8R2V0RWxlbWVudFB0ckluc3Q+OjpvcF9lbmQodGhpcykgLSBWYWx1ZXMsCisgICAgICAgICAgICAgICAgVmFsdWVzLCBJbnNlcnRCZWZvcmUpIHsKKyAgaW5pdChQdHIsIElkeEJlZ2luLCBJZHhFbmQsCisgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SW5wdXRJdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5KCkpOworfQordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KK0dldEVsZW1lbnRQdHJJbnN0OjpHZXRFbGVtZW50UHRySW5zdChWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IEluc3RydWN0aW9uKFBvaW50ZXJUeXBlOjpnZXQoY2hlY2tUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmRleGVkVHlwZShQdHItPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4QmVnaW4sIElkeEVuZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0QWRkcmVzc1NwYWNlKCkpLAorICAgICAgICAgICAgICAgIEdldEVsZW1lbnRQdHIsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxHZXRFbGVtZW50UHRySW5zdD46Om9wX2VuZCh0aGlzKSAtIFZhbHVlcywKKyAgICAgICAgICAgICAgICBWYWx1ZXMsIEluc2VydEF0RW5kKSB7CisgIGluaXQoUHRyLCBJZHhCZWdpbiwgSWR4RW5kLAorICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPElucHV0SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSgpKTsKK30KKworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoR2V0RWxlbWVudFB0ckluc3QsIFZhbHVlKQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgaW5zdHJ1Y3Rpb24gY29tcGFyZXMgaXRzIG9wZXJhbmRzIGFjY29yZGluZyB0byB0aGUgcHJlZGljYXRlIGdpdmVuCisvLy8gdG8gdGhlIGNvbnN0cnVjdG9yLiBJdCBvbmx5IG9wZXJhdGVzIG9uIGludGVnZXJzIG9yIHBvaW50ZXJzLiBUaGUgb3BlcmFuZHMKKy8vLyBtdXN0IGJlIGlkZW50aWNhbCB0eXBlcy4KKy8vLyBAYnJpZWYgUmVwcmVzZW50IGFuIGludGVnZXIgY29tcGFyaXNvbiBvcGVyYXRvci4KK2NsYXNzIElDbXBJbnN0OiBwdWJsaWMgQ21wSW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vLyBAYnJpZWYgQ2xvbmUgYW4gaW5kZW50aWNhbCBJQ21wSW5zdAorICB2aXJ0dWFsIElDbXBJbnN0ICpjbG9uZV9pbXBsKCkgY29uc3Q7ICAKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzLgorICBJQ21wSW5zdCgKKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlLCAgLy8vPCBXaGVyZSB0byBpbnNlcnQKKyAgICBQcmVkaWNhdGUgcHJlZCwgIC8vLzwgVGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHRoZSBjb21wYXJpc29uCisgICAgVmFsdWUgKkxIUywgICAgICAvLy88IFRoZSBsZWZ0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICAgIFZhbHVlICpSSFMgICAgICAgLy8vPCBUaGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICkgOiBDbXBJbnN0KG1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OklDbXAsIHByZWQsIExIUywgUkhTLAorICAgICAgICAgICAgICBJbnNlcnRCZWZvcmUpIHsKKyAgICBhc3NlcnQocHJlZCA+PSBDbXBJbnN0OjpGSVJTVF9JQ01QX1BSRURJQ0FURSAmJgorICAgICAgICAgICBwcmVkIDw9IENtcEluc3Q6OkxBU1RfSUNNUF9QUkVESUNBVEUgJiYKKyAgICAgICAgICAgIkludmFsaWQgSUNtcCBwcmVkaWNhdGUgdmFsdWUiKTsKKyAgICBhc3NlcnQoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IGdldE9wZXJhbmQoMSktPmdldFR5cGUoKSAmJgorICAgICAgICAgICJCb3RoIG9wZXJhbmRzIHRvIElDbXAgaW5zdHJ1Y3Rpb24gYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlISIpOworICAgIC8vIENoZWNrIHRoYXQgdGhlIG9wZXJhbmRzIGFyZSB0aGUgcmlnaHQgdHlwZQorICAgIGFzc2VydCgoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSB8fAorICAgICAgICAgICAgZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgICAiSW52YWxpZCBvcGVyYW5kIHR5cGVzIGZvciBJQ21wIGluc3RydWN0aW9uIik7CisgIH0KKworICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZCBzZW1hbnRpY3MuCisgIElDbXBJbnN0KAorICAgIEJhc2ljQmxvY2sgJkluc2VydEF0RW5kLCAvLy88IEJsb2NrIHRvIGluc2VydCBpbnRvLgorICAgIFByZWRpY2F0ZSBwcmVkLCAgLy8vPCBUaGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICBWYWx1ZSAqTEhTLCAgICAgIC8vLzwgVGhlIGxlZnQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgVmFsdWUgKlJIUyAgICAgICAvLy88IFRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgKSA6IENtcEluc3QobWFrZUNtcFJlc3VsdFR5cGUoTEhTLT5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6SUNtcCwgcHJlZCwgTEhTLCBSSFMsCisgICAgICAgICAgICAgICZJbnNlcnRBdEVuZCkgeworICAgIGFzc2VydChwcmVkID49IENtcEluc3Q6OkZJUlNUX0lDTVBfUFJFRElDQVRFICYmCisgICAgICAgICAgcHJlZCA8PSBDbXBJbnN0OjpMQVNUX0lDTVBfUFJFRElDQVRFICYmCisgICAgICAgICAgIkludmFsaWQgSUNtcCBwcmVkaWNhdGUgdmFsdWUiKTsKKyAgICBhc3NlcnQoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IGdldE9wZXJhbmQoMSktPmdldFR5cGUoKSAmJgorICAgICAgICAgICJCb3RoIG9wZXJhbmRzIHRvIElDbXAgaW5zdHJ1Y3Rpb24gYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlISIpOworICAgIC8vIENoZWNrIHRoYXQgdGhlIG9wZXJhbmRzIGFyZSB0aGUgcmlnaHQgdHlwZQorICAgIGFzc2VydCgoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSB8fAorICAgICAgICAgICAgZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgICAiSW52YWxpZCBvcGVyYW5kIHR5cGVzIGZvciBJQ21wIGluc3RydWN0aW9uIik7CisgIH0KKworICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggbm8taW5zZXJ0aW9uIHNlbWFudGljcworICBJQ21wSW5zdCgKKyAgICBQcmVkaWNhdGUgcHJlZCwgLy8vPCBUaGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICBWYWx1ZSAqTEhTLCAgICAgLy8vPCBUaGUgbGVmdC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgICBWYWx1ZSAqUkhTICAgICAgLy8vPCBUaGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICkgOiBDbXBJbnN0KG1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OklDbXAsIHByZWQsIExIUywgUkhTKSB7CisgICAgYXNzZXJ0KHByZWQgPj0gQ21wSW5zdDo6RklSU1RfSUNNUF9QUkVESUNBVEUgJiYKKyAgICAgICAgICAgcHJlZCA8PSBDbXBJbnN0OjpMQVNUX0lDTVBfUFJFRElDQVRFICYmCisgICAgICAgICAgICJJbnZhbGlkIElDbXAgcHJlZGljYXRlIHZhbHVlIik7CisgICAgYXNzZXJ0KGdldE9wZXJhbmQoMCktPmdldFR5cGUoKSA9PSBnZXRPcGVyYW5kKDEpLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAiQm90aCBvcGVyYW5kcyB0byBJQ21wIGluc3RydWN0aW9uIGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZSEiKTsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBvcGVyYW5kcyBhcmUgdGhlIHJpZ2h0IHR5cGUKKyAgICBhc3NlcnQoKGdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkgfHwKKyAgICAgICAgICAgIGdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgICAgIkludmFsaWQgb3BlcmFuZCB0eXBlcyBmb3IgSUNtcCBpbnN0cnVjdGlvbiIpOworICB9CisKKyAgLy8vIEZvciBleGFtcGxlLCBFUS0+RVEsIFNMRS0+U0xFLCBVR1QtPlNHVCwgZXRjLgorICAvLy8gQHJldHVybnMgdGhlIHByZWRpY2F0ZSB0aGF0IHdvdWxkIGJlIHRoZSByZXN1bHQgaWYgdGhlIG9wZXJhbmQgd2VyZQorICAvLy8gcmVnYXJkZWQgYXMgc2lnbmVkLgorICAvLy8gQGJyaWVmIFJldHVybiB0aGUgc2lnbmVkIHZlcnNpb24gb2YgdGhlIHByZWRpY2F0ZQorICBQcmVkaWNhdGUgZ2V0U2lnbmVkUHJlZGljYXRlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTaWduZWRQcmVkaWNhdGUoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIFRoaXMgaXMgYSBzdGF0aWMgdmVyc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHdpdGhvdXQgYW4gaW5zdHJ1Y3Rpb24uCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBzaWduZWQgdmVyc2lvbiBvZiB0aGUgcHJlZGljYXRlLgorICBzdGF0aWMgUHJlZGljYXRlIGdldFNpZ25lZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIEZvciBleGFtcGxlLCBFUS0+RVEsIFNMRS0+VUxFLCBVR1QtPlVHVCwgZXRjLgorICAvLy8gQHJldHVybnMgdGhlIHByZWRpY2F0ZSB0aGF0IHdvdWxkIGJlIHRoZSByZXN1bHQgaWYgdGhlIG9wZXJhbmQgd2VyZQorICAvLy8gcmVnYXJkZWQgYXMgdW5zaWduZWQuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIHRoZSBwcmVkaWNhdGUKKyAgUHJlZGljYXRlIGdldFVuc2lnbmVkUHJlZGljYXRlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVbnNpZ25lZFByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gVGhpcyBpcyBhIHN0YXRpYyB2ZXJzaW9uIHRoYXQgeW91IGNhbiB1c2Ugd2l0aG91dCBhbiBpbnN0cnVjdGlvbi4KKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgdGhlIHByZWRpY2F0ZS4KKyAgc3RhdGljIFByZWRpY2F0ZSBnZXRVbnNpZ25lZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIGlzRXF1YWxpdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHByZWRpY2F0ZSBpcyBlaXRoZXIgRVEgb3IgTkUuICBUaGlzIGFsc28KKyAgLy8vIHRlc3RzIGZvciBjb21tdXRhdGl2aXR5LgorICBzdGF0aWMgYm9vbCBpc0VxdWFsaXR5KFByZWRpY2F0ZSBQKSB7CisgICAgcmV0dXJuIFAgPT0gSUNNUF9FUSB8fCBQID09IElDTVBfTkU7CisgIH0KKworICAvLy8gaXNFcXVhbGl0eSAtIFJldHVybiB0cnVlIGlmIHRoaXMgcHJlZGljYXRlIGlzIGVpdGhlciBFUSBvciBORS4gIFRoaXMgYWxzbworICAvLy8gdGVzdHMgZm9yIGNvbW11dGF0aXZpdHkuCisgIGJvb2wgaXNFcXVhbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNFcXVhbGl0eShnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIG9mIHRoaXMgSUNtcEluc3QgaXMgY29tbXV0YXRpdmUKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyByZWxhdGlvbiBpcyBjb21tdXRhdGl2ZS4KKyAgYm9vbCBpc0NvbW11dGF0aXZlKCkgY29uc3QgeyByZXR1cm4gaXNFcXVhbGl0eSgpOyB9CisKKyAgLy8vIGlzUmVsYXRpb25hbCAtIFJldHVybiB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgaXMgcmVsYXRpb25hbCAobm90IEVRIG9yIE5FKS4KKyAgLy8vCisgIGJvb2wgaXNSZWxhdGlvbmFsKCkgY29uc3QgeworICAgIHJldHVybiAhaXNFcXVhbGl0eSgpOworICB9CisKKyAgLy8vIGlzUmVsYXRpb25hbCAtIFJldHVybiB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgaXMgcmVsYXRpb25hbCAobm90IEVRIG9yIE5FKS4KKyAgLy8vCisgIHN0YXRpYyBib29sIGlzUmVsYXRpb25hbChQcmVkaWNhdGUgUCkgeworICAgIHJldHVybiAhaXNFcXVhbGl0eShQKTsKKyAgfQorCisgIC8vLyBJbml0aWFsaXplIGEgc2V0IG9mIHZhbHVlcyB0aGF0IGFsbCBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgd2l0aCBDLgorICAvLy8gQGJyaWVmIE1ha2UgYSBDb25zdGFudFJhbmdlIGZvciBhIHJlbGF0aW9uIHdpdGggYSBjb25zdGFudCB2YWx1ZS4KKyAgc3RhdGljIENvbnN0YW50UmFuZ2UgbWFrZUNvbnN0YW50UmFuZ2UoUHJlZGljYXRlIHByZWQsIGNvbnN0IEFQSW50ICZDKTsKKworICAvLy8gRXhjaGFuZ2UgdGhlIHR3byBvcGVyYW5kcyB0byB0aGlzIGluc3RydWN0aW9uIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBkb2VzCisgIC8vLyBub3QgbW9kaWZ5IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGluc3RydWN0aW9uLiBUaGUgcHJlZGljYXRlIHZhbHVlIG1heSBiZQorICAvLy8gY2hhbmdlZCB0byByZXRhaW4gdGhlIHNhbWUgcmVzdWx0IGlmIHRoZSBwcmVkaWNhdGUgaXMgb3JkZXIgZGVwZW5kZW50CisgIC8vLyAoZS5nLiB1bHQpLgorICAvLy8gQGJyaWVmIFN3YXAgb3BlcmFuZHMgYW5kIGFkanVzdCBwcmVkaWNhdGUuCisgIHZvaWQgc3dhcE9wZXJhbmRzKCkgeworICAgIHNldFByZWRpY2F0ZShnZXRTd2FwcGVkUHJlZGljYXRlKCkpOworICAgIE9wPDA+KCkuc3dhcChPcDwxPigpKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IElDbXBJbnN0ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OklDbXA7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkNtcEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGluc3RydWN0aW9uIGNvbXBhcmVzIGl0cyBvcGVyYW5kcyBhY2NvcmRpbmcgdG8gdGhlIHByZWRpY2F0ZSBnaXZlbgorLy8vIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSXQgb25seSBvcGVyYXRlcyBvbiBmbG9hdGluZyBwb2ludCB2YWx1ZXMgb3IgcGFja2VkCisvLy8gdmVjdG9ycyBvZiBmbG9hdGluZyBwb2ludCB2YWx1ZXMuIFRoZSBvcGVyYW5kcyBtdXN0IGJlIGlkZW50aWNhbCB0eXBlcy4KKy8vLyBAYnJpZWYgUmVwcmVzZW50cyBhIGZsb2F0aW5nIHBvaW50IGNvbXBhcmlzb24gb3BlcmF0b3IuCitjbGFzcyBGQ21wSW5zdDogcHVibGljIENtcEluc3QgeworcHJvdGVjdGVkOgorICAvLy8gQGJyaWVmIENsb25lIGFuIGluZGVudGljYWwgRkNtcEluc3QKKyAgdmlydHVhbCBGQ21wSW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MuCisgIEZDbXBJbnN0KAorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUsIC8vLzwgV2hlcmUgdG8gaW5zZXJ0CisgICAgUHJlZGljYXRlIHByZWQsICAvLy88IFRoZSBwcmVkaWNhdGUgdG8gdXNlIGZvciB0aGUgY29tcGFyaXNvbgorICAgIFZhbHVlICpMSFMsICAgICAgLy8vPCBUaGUgbGVmdC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgICBWYWx1ZSAqUkhTICAgICAgIC8vLzwgVGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICApIDogQ21wSW5zdChtYWtlQ21wUmVzdWx0VHlwZShMSFMtPmdldFR5cGUoKSksCisgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpGQ21wLCBwcmVkLCBMSFMsIFJIUywKKyAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKSB7CisgICAgYXNzZXJ0KHByZWQgPD0gRkNtcEluc3Q6OkxBU1RfRkNNUF9QUkVESUNBVEUgJiYKKyAgICAgICAgICAgIkludmFsaWQgRkNtcCBwcmVkaWNhdGUgdmFsdWUiKTsKKyAgICBhc3NlcnQoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IGdldE9wZXJhbmQoMSktPmdldFR5cGUoKSAmJgorICAgICAgICAgICAiQm90aCBvcGVyYW5kcyB0byBGQ21wIGluc3RydWN0aW9uIGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZSEiKTsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBvcGVyYW5kcyBhcmUgdGhlIHJpZ2h0IHR5cGUKKyAgICBhc3NlcnQoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgb3BlcmFuZCB0eXBlcyBmb3IgRkNtcCBpbnN0cnVjdGlvbiIpOworICB9CisgIAorICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZCBzZW1hbnRpY3MuCisgIEZDbXBJbnN0KAorICAgIEJhc2ljQmxvY2sgJkluc2VydEF0RW5kLCAvLy88IEJsb2NrIHRvIGluc2VydCBpbnRvLgorICAgIFByZWRpY2F0ZSBwcmVkLCAgLy8vPCBUaGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICBWYWx1ZSAqTEhTLCAgICAgIC8vLzwgVGhlIGxlZnQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgVmFsdWUgKlJIUyAgICAgICAvLy88IFRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgKSA6IENtcEluc3QobWFrZUNtcFJlc3VsdFR5cGUoTEhTLT5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6RkNtcCwgcHJlZCwgTEhTLCBSSFMsCisgICAgICAgICAgICAgICZJbnNlcnRBdEVuZCkgeworICAgIGFzc2VydChwcmVkIDw9IEZDbXBJbnN0OjpMQVNUX0ZDTVBfUFJFRElDQVRFICYmCisgICAgICAgICAgICJJbnZhbGlkIEZDbXAgcHJlZGljYXRlIHZhbHVlIik7CisgICAgYXNzZXJ0KGdldE9wZXJhbmQoMCktPmdldFR5cGUoKSA9PSBnZXRPcGVyYW5kKDEpLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIkJvdGggb3BlcmFuZHMgdG8gRkNtcCBpbnN0cnVjdGlvbiBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUhIik7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgb3BlcmFuZHMgYXJlIHRoZSByaWdodCB0eXBlCisgICAgYXNzZXJ0KGdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIG9wZXJhbmQgdHlwZXMgZm9yIEZDbXAgaW5zdHJ1Y3Rpb24iKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBuby1pbnNlcnRpb24gc2VtYW50aWNzCisgIEZDbXBJbnN0KAorICAgIFByZWRpY2F0ZSBwcmVkLCAvLy88IFRoZSBwcmVkaWNhdGUgdG8gdXNlIGZvciB0aGUgY29tcGFyaXNvbgorICAgIFZhbHVlICpMSFMsICAgICAvLy88IFRoZSBsZWZ0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICAgIFZhbHVlICpSSFMgICAgICAvLy88IFRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgKSA6IENtcEluc3QobWFrZUNtcFJlc3VsdFR5cGUoTEhTLT5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6RkNtcCwgcHJlZCwgTEhTLCBSSFMpIHsKKyAgICBhc3NlcnQocHJlZCA8PSBGQ21wSW5zdDo6TEFTVF9GQ01QX1BSRURJQ0FURSAmJgorICAgICAgICAgICAiSW52YWxpZCBGQ21wIHByZWRpY2F0ZSB2YWx1ZSIpOworICAgIGFzc2VydChnZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgPT0gZ2V0T3BlcmFuZCgxKS0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICJCb3RoIG9wZXJhbmRzIHRvIEZDbXAgaW5zdHJ1Y3Rpb24gYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlISIpOworICAgIC8vIENoZWNrIHRoYXQgdGhlIG9wZXJhbmRzIGFyZSB0aGUgcmlnaHQgdHlwZQorICAgIGFzc2VydChnZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmlzRlBPckZQVmVjdG9yVHkoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBvcGVyYW5kIHR5cGVzIGZvciBGQ21wIGluc3RydWN0aW9uIik7CisgIH0KKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgRVEgb3IgTkUuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYW4gZXF1YWxpdHkgcHJlZGljYXRlLgorICBib29sIGlzRXF1YWxpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWRpY2F0ZSgpID09IEZDTVBfT0VRIHx8IGdldFByZWRpY2F0ZSgpID09IEZDTVBfT05FIHx8CisgICAgICAgICAgIGdldFByZWRpY2F0ZSgpID09IEZDTVBfVUVRIHx8IGdldFByZWRpY2F0ZSgpID09IEZDTVBfVU5FOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIHByZWRpY2F0ZSBvZiB0aGlzIGluc3RydWN0aW9uIGlzIGNvbW11dGF0aXZlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIGEgY29tbXV0YXRpdmUgcHJlZGljYXRlLgorICBib29sIGlzQ29tbXV0YXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRXF1YWxpdHkoKSB8fAorICAgICAgICAgICBnZXRQcmVkaWNhdGUoKSA9PSBGQ01QX0ZBTFNFIHx8CisgICAgICAgICAgIGdldFByZWRpY2F0ZSgpID09IEZDTVBfVFJVRSB8fAorICAgICAgICAgICBnZXRQcmVkaWNhdGUoKSA9PSBGQ01QX09SRCB8fAorICAgICAgICAgICBnZXRQcmVkaWNhdGUoKSA9PSBGQ01QX1VOTzsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgaXMgcmVsYXRpb25hbCAobm90IEVRIG9yIE5FKS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBhIHJlbGF0aW9uYWwgcHJlZGljYXRlLgorICBib29sIGlzUmVsYXRpb25hbCgpIGNvbnN0IHsgcmV0dXJuICFpc0VxdWFsaXR5KCk7IH0KKworICAvLy8gRXhjaGFuZ2UgdGhlIHR3byBvcGVyYW5kcyB0byB0aGlzIGluc3RydWN0aW9uIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBkb2VzCisgIC8vLyBub3QgbW9kaWZ5IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGluc3RydWN0aW9uLiBUaGUgcHJlZGljYXRlIHZhbHVlIG1heSBiZQorICAvLy8gY2hhbmdlZCB0byByZXRhaW4gdGhlIHNhbWUgcmVzdWx0IGlmIHRoZSBwcmVkaWNhdGUgaXMgb3JkZXIgZGVwZW5kZW50CisgIC8vLyAoZS5nLiB1bHQpLgorICAvLy8gQGJyaWVmIFN3YXAgb3BlcmFuZHMgYW5kIGFkanVzdCBwcmVkaWNhdGUuCisgIHZvaWQgc3dhcE9wZXJhbmRzKCkgeworICAgIHNldFByZWRpY2F0ZShnZXRTd2FwcGVkUHJlZGljYXRlKCkpOworICAgIE9wPDA+KCkuc3dhcChPcDwxPigpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgRkNtcEluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkNtcDsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIENhbGxJbnN0IC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgZnVuY3Rpb24gY2FsbCwgYWJzdHJhY3RpbmcgYSB0YXJnZXQKKy8vLyBtYWNoaW5lJ3MgY2FsbGluZyBjb252ZW50aW9uLiAgVGhpcyBjbGFzcyB1c2VzIGxvdyBiaXQgb2YgdGhlIFN1YkNsYXNzRGF0YQorLy8vIGZpZWxkIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSB0YWlsIGNhbGwuICBUaGUgcmVzdCBvZiB0aGUgYml0cworLy8vIGhvbGQgdGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiB0aGUgY2FsbC4KKy8vLworY2xhc3MgQ2FsbEluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICBBdHRyTGlzdFB0ciBBdHRyaWJ1dGVMaXN0OyAvLy88IHBhcmFtZXRlciBhdHRyaWJ1dGVzIGZvciBjYWxsCisgIENhbGxJbnN0KGNvbnN0IENhbGxJbnN0ICZDSSk7CisgIHZvaWQgaW5pdChWYWx1ZSAqRnVuYywgVmFsdWUqIGNvbnN0ICpQYXJhbXMsIHVuc2lnbmVkIE51bVBhcmFtcyk7CisgIHZvaWQgaW5pdChWYWx1ZSAqRnVuYywgVmFsdWUgKkFjdHVhbDEsIFZhbHVlICpBY3R1YWwyKTsKKyAgdm9pZCBpbml0KFZhbHVlICpGdW5jLCBWYWx1ZSAqQWN0dWFsKTsKKyAgdm9pZCBpbml0KFZhbHVlICpGdW5jKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluaXQoVmFsdWUgKkZ1bmMsIElucHV0SXRlcmF0b3IgQXJnQmVnaW4sIElucHV0SXRlcmF0b3IgQXJnRW5kLAorICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAvLyBUaGlzIGFyZ3VtZW50IGVuc3VyZXMgdGhhdCB3ZSBoYXZlIGFuIGl0ZXJhdG9yIHdlIGNhbgorICAgICAgICAgICAgLy8gZG8gYXJpdGhtZXRpYyBvbiBpbiBjb25zdGFudCB0aW1lCisgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKSB7CisgICAgdW5zaWduZWQgTnVtQXJncyA9ICh1bnNpZ25lZClzdGQ6OmRpc3RhbmNlKEFyZ0JlZ2luLCBBcmdFbmQpOworCisgICAgLy8gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBpdGVyYXRvciBwb2ludHMgdG8gY29udGlndW91cyBtZW1vcnkuCisgICAgaW5pdChGdW5jLCBOdW1BcmdzID8gJipBcmdCZWdpbiA6IDAsIE51bUFyZ3MpOworICAgIHNldE5hbWUoTmFtZVN0cik7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGEgQ2FsbEluc3QgZ2l2ZW4gYSByYW5nZSBvZiBhcmd1bWVudHMuICBJbnB1dEl0ZXJhdG9yCisgIC8vLyBtdXN0IGJlIGEgcmFuZG9tLWFjY2VzcyBpdGVyYXRvciBwb2ludGluZyB0byBjb250aWd1b3VzIHN0b3JhZ2UKKyAgLy8vIChlLmcuIGEgc3RkOjp2ZWN0b3I8Pjo6aXRlcmF0b3IpLiAgQ2hlY2tzIGFyZSBtYWRlIGZvcgorICAvLy8gcmFuZG9tLWFjY2Vzc25lc3MgYnV0IG5vdCBmb3IgY29udGlndW91cyBzdG9yYWdlIGFzIHRoYXQgd291bGQKKyAgLy8vIGluY3VyIHJ1bnRpbWUgb3ZlcmhlYWQuCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgQ2FsbEluc3QgZnJvbSBhIHJhbmdlIG9mIGFyZ3VtZW50cworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICBDYWxsSW5zdChWYWx1ZSAqRnVuYywgSW5wdXRJdGVyYXRvciBBcmdCZWdpbiwgSW5wdXRJdGVyYXRvciBBcmdFbmQsCisgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKworICAvLy8gQ29uc3RydWN0IGEgQ2FsbEluc3QgZ2l2ZW4gYSByYW5nZSBvZiBhcmd1bWVudHMuICBJbnB1dEl0ZXJhdG9yCisgIC8vLyBtdXN0IGJlIGEgcmFuZG9tLWFjY2VzcyBpdGVyYXRvciBwb2ludGluZyB0byBjb250aWd1b3VzIHN0b3JhZ2UKKyAgLy8vIChlLmcuIGEgc3RkOjp2ZWN0b3I8Pjo6aXRlcmF0b3IpLiAgQ2hlY2tzIGFyZSBtYWRlIGZvcgorICAvLy8gcmFuZG9tLWFjY2Vzc25lc3MgYnV0IG5vdCBmb3IgY29udGlndW91cyBzdG9yYWdlIGFzIHRoYXQgd291bGQKKyAgLy8vIGluY3VyIHJ1bnRpbWUgb3ZlcmhlYWQuCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgQ2FsbEluc3QgZnJvbSBhIHJhbmdlIG9mIGFyZ3VtZW50cworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICBpbmxpbmUgQ2FsbEluc3QoVmFsdWUgKkZ1bmMsIElucHV0SXRlcmF0b3IgQXJnQmVnaW4sIElucHV0SXRlcmF0b3IgQXJnRW5kLAorICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICBDYWxsSW5zdChWYWx1ZSAqRiwgVmFsdWUgKkFjdHVhbCwgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworICBDYWxsSW5zdChWYWx1ZSAqRiwgVmFsdWUgKkFjdHVhbCwgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgZXhwbGljaXQgQ2FsbEluc3QoVmFsdWUgKkYsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgQ2FsbEluc3QoVmFsdWUgKkYsIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgQ2FsbEluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKK3B1YmxpYzoKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoVmFsdWUgKkZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgQXJnQmVnaW4sIElucHV0SXRlcmF0b3IgQXJnRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIHJldHVybiBuZXcodW5zaWduZWQoQXJnRW5kIC0gQXJnQmVnaW4gKyAxKSkKKyAgICAgIENhbGxJbnN0KEZ1bmMsIEFyZ0JlZ2luLCBBcmdFbmQsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoVmFsdWUgKkZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgQXJnQmVnaW4sIElucHV0SXRlcmF0b3IgQXJnRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KHVuc2lnbmVkKEFyZ0VuZCAtIEFyZ0JlZ2luICsgMSkpCisgICAgICBDYWxsSW5zdChGdW5jLCBBcmdCZWdpbiwgQXJnRW5kLCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoVmFsdWUgKkYsIFZhbHVlICpBY3R1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKSB7CisgICAgcmV0dXJuIG5ldygyKSBDYWxsSW5zdChGLCBBY3R1YWwsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoVmFsdWUgKkYsIFZhbHVlICpBY3R1YWwsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoMikgQ2FsbEluc3QoRiwgQWN0dWFsLCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoVmFsdWUgKkYsIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKSB7CisgICAgcmV0dXJuIG5ldygxKSBDYWxsSW5zdChGLCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisgIHN0YXRpYyBDYWxsSW5zdCAqQ3JlYXRlKFZhbHVlICpGLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KDEpIENhbGxJbnN0KEYsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorICAvLy8gQ3JlYXRlTWFsbG9jIC0gR2VuZXJhdGUgdGhlIElSIGZvciBhIGNhbGwgdG8gbWFsbG9jOgorICAvLy8gMS4gQ29tcHV0ZSB0aGUgbWFsbG9jIGNhbGwncyBhcmd1bWVudCBhcyB0aGUgc3BlY2lmaWVkIHR5cGUncyBzaXplLAorICAvLy8gICAgcG9zc2libHkgbXVsdGlwbGllZCBieSB0aGUgYXJyYXkgc2l6ZSBpZiB0aGUgYXJyYXkgc2l6ZSBpcyBub3QKKyAgLy8vICAgIGNvbnN0YW50IDEuCisgIC8vLyAyLiBDYWxsIG1hbGxvYyB3aXRoIHRoYXQgYXJndW1lbnQuCisgIC8vLyAzLiBCaXRjYXN0IHRoZSByZXN1bHQgb2YgdGhlIG1hbGxvYyBjYWxsIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgc3RhdGljIEluc3RydWN0aW9uICpDcmVhdGVNYWxsb2MoSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqSW50UHRyVHksIGNvbnN0IFR5cGUgKkFsbG9jVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBbGxvY1NpemUsIFZhbHVlICpBcnJheVNpemUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiogTWFsbG9jRiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpOworICBzdGF0aWMgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU1hbGxvYyhCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqSW50UHRyVHksIGNvbnN0IFR5cGUgKkFsbG9jVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBbGxvY1NpemUsIFZhbHVlICpBcnJheVNpemUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiogTWFsbG9jRiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpOworICAvLy8gQ3JlYXRlRnJlZSAtIEdlbmVyYXRlIHRoZSBJUiBmb3IgYSBjYWxsIHRvIHRoZSBidWlsdGluIGZyZWUgZnVuY3Rpb24uCisgIHN0YXRpYyBJbnN0cnVjdGlvbiogQ3JlYXRlRnJlZShWYWx1ZSogU291cmNlLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgc3RhdGljIEluc3RydWN0aW9uKiBDcmVhdGVGcmVlKFZhbHVlKiBTb3VyY2UsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICB+Q2FsbEluc3QoKTsKKworICBib29sIGlzVGFpbENhbGwoKSBjb25zdCB7IHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDE7IH0KKyAgdm9pZCBzZXRUYWlsQ2FsbChib29sIGlzVEMgPSB0cnVlKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZChpc1RDKSk7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vLyBnZXROdW1BcmdPcGVyYW5kcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGNhbGwgYXJndW1lbnRzLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0TnVtQXJnT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpIC0gMTsgfQorCisgIC8vLyBnZXRBcmdPcGVyYW5kL3NldEFyZ09wZXJhbmQgLSBSZXR1cm4vc2V0IHRoZSBpLXRoIGNhbGwgYXJndW1lbnQuCisgIC8vLworICBWYWx1ZSAqZ2V0QXJnT3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKGkpOyB9CisgIHZvaWQgc2V0QXJnT3BlcmFuZCh1bnNpZ25lZCBpLCBWYWx1ZSAqdikgeyBzZXRPcGVyYW5kKGksIHYpOyB9CisKKyAgLy8vIGdldENhbGxpbmdDb252L3NldENhbGxpbmdDb252IC0gR2V0IG9yIHNldCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIHRoaXMKKyAgLy8vIGZ1bmN0aW9uIGNhbGwuCisgIENhbGxpbmdDb252OjpJRCBnZXRDYWxsaW5nQ29udigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FsbGluZ0NvbnY6OklEPihnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSA+PiAxKTsKKyAgfQorICB2b2lkIHNldENhbGxpbmdDb252KENhbGxpbmdDb252OjpJRCBDQykgeworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KENDKSA8PCAxKSk7CisgIH0KKworICAvLy8gZ2V0QXR0cmlidXRlcyAtIFJldHVybiB0aGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgZm9yIHRoaXMgY2FsbC4KKyAgLy8vCisgIGNvbnN0IEF0dHJMaXN0UHRyICZnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gQXR0cmlidXRlTGlzdDsgfQorCisgIC8vLyBzZXRBdHRyaWJ1dGVzIC0gU2V0IHRoZSBwYXJhbWV0ZXIgYXR0cmlidXRlcyBmb3IgdGhpcyBjYWxsLgorICAvLy8KKyAgdm9pZCBzZXRBdHRyaWJ1dGVzKGNvbnN0IEF0dHJMaXN0UHRyICZBdHRycykgeyBBdHRyaWJ1dGVMaXN0ID0gQXR0cnM7IH0KKworICAvLy8gYWRkQXR0cmlidXRlIC0gYWRkcyB0aGUgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgYWRkQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZXMgYXR0cik7CisKKyAgLy8vIHJlbW92ZUF0dHJpYnV0ZSAtIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZXMgYXR0cik7CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgY2FsbCBvciB0aGUgY2FsbGVlIGhhcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLgorICBib29sIHBhcmFtSGFzQXR0cih1bnNpZ25lZCBpLCBBdHRyaWJ1dGVzIGF0dHIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgRXh0cmFjdCB0aGUgYWxpZ25tZW50IGZvciBhIGNhbGwgb3IgcGFyYW1ldGVyICgwPXVua25vd24pLgorICB1bnNpZ25lZCBnZXRQYXJhbUFsaWdubWVudCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3QuZ2V0UGFyYW1BbGlnbm1lbnQoaSk7CisgIH0KKyAgCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGNhbGwgc2hvdWxkIG5vdCBiZSBpbmxpbmVkLgorICBib29sIGlzTm9JbmxpbmUoKSBjb25zdCB7IHJldHVybiBwYXJhbUhhc0F0dHIofjAsIEF0dHJpYnV0ZTo6Tm9JbmxpbmUpOyB9CisgIHZvaWQgc2V0SXNOb0lubGluZShib29sIFZhbHVlID0gdHJ1ZSkgeworICAgIGlmIChWYWx1ZSkgYWRkQXR0cmlidXRlKH4wLCBBdHRyaWJ1dGU6Ok5vSW5saW5lKTsKKyAgICBlbHNlIHJlbW92ZUF0dHJpYnV0ZSh+MCwgQXR0cmlidXRlOjpOb0lubGluZSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgY2FsbCBkb2VzIG5vdCBhY2Nlc3MgbWVtb3J5LgorICBib29sIGRvZXNOb3RBY2Nlc3NNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtSGFzQXR0cih+MCwgQXR0cmlidXRlOjpSZWFkTm9uZSk7CisgIH0KKyAgdm9pZCBzZXREb2VzTm90QWNjZXNzTWVtb3J5KGJvb2wgTm90QWNjZXNzTWVtb3J5ID0gdHJ1ZSkgeworICAgIGlmIChOb3RBY2Nlc3NNZW1vcnkpIGFkZEF0dHJpYnV0ZSh+MCwgQXR0cmlidXRlOjpSZWFkTm9uZSk7CisgICAgZWxzZSByZW1vdmVBdHRyaWJ1dGUofjAsIEF0dHJpYnV0ZTo6UmVhZE5vbmUpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgZG9lcyBub3QgYWNjZXNzIG9yIG9ubHkgcmVhZHMgbWVtb3J5LgorICBib29sIG9ubHlSZWFkc01lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9lc05vdEFjY2Vzc01lbW9yeSgpIHx8IHBhcmFtSGFzQXR0cih+MCwgQXR0cmlidXRlOjpSZWFkT25seSk7CisgIH0KKyAgdm9pZCBzZXRPbmx5UmVhZHNNZW1vcnkoYm9vbCBPbmx5UmVhZHNNZW1vcnkgPSB0cnVlKSB7CisgICAgaWYgKE9ubHlSZWFkc01lbW9yeSkgYWRkQXR0cmlidXRlKH4wLCBBdHRyaWJ1dGU6OlJlYWRPbmx5KTsKKyAgICBlbHNlIHJlbW92ZUF0dHJpYnV0ZSh+MCwgQXR0cmlidXRlOjpSZWFkT25seSB8IEF0dHJpYnV0ZTo6UmVhZE5vbmUpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgY2Fubm90IHJldHVybi4KKyAgYm9vbCBkb2VzTm90UmV0dXJuKCkgY29uc3QgeyByZXR1cm4gcGFyYW1IYXNBdHRyKH4wLCBBdHRyaWJ1dGU6Ok5vUmV0dXJuKTsgfQorICB2b2lkIHNldERvZXNOb3RSZXR1cm4oYm9vbCBEb2VzTm90UmV0dXJuID0gdHJ1ZSkgeworICAgIGlmIChEb2VzTm90UmV0dXJuKSBhZGRBdHRyaWJ1dGUofjAsIEF0dHJpYnV0ZTo6Tm9SZXR1cm4pOworICAgIGVsc2UgcmVtb3ZlQXR0cmlidXRlKH4wLCBBdHRyaWJ1dGU6Ok5vUmV0dXJuKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIHJldHVybnMgYSBzdHJ1Y3R1cmUgdGhyb3VnaCBmaXJzdAorICAvLy8gcG9pbnRlciBhcmd1bWVudC4KKyAgYm9vbCBoYXNTdHJ1Y3RSZXRBdHRyKCkgY29uc3QgeworICAgIC8vIEJlIGZyaWVuZGx5IGFuZCBhbHNvIGNoZWNrIHRoZSBjYWxsZWUuCisgICAgcmV0dXJuIHBhcmFtSGFzQXR0cigxLCBBdHRyaWJ1dGU6OlN0cnVjdFJldCk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiBhbnkgY2FsbCBhcmd1bWVudCBpcyBhbiBhZ2dyZWdhdGUgcGFzc2VkIGJ5IHZhbHVlLgorICBib29sIGhhc0J5VmFsQXJndW1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3QuaGFzQXR0clNvbWV3aGVyZShBdHRyaWJ1dGU6OkJ5VmFsKTsKKyAgfQorCisgIC8vLyBnZXRDYWxsZWRGdW5jdGlvbiAtIFJldHVybiB0aGUgZnVuY3Rpb24gY2FsbGVkLCBvciBudWxsIGlmIHRoaXMgaXMgYW4KKyAgLy8vIGluZGlyZWN0IGZ1bmN0aW9uIGludm9jYXRpb24uCisgIC8vLworICBGdW5jdGlvbiAqZ2V0Q2FsbGVkRnVuY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0PEZ1bmN0aW9uPihPcDwtMT4oKSk7CisgIH0KKworICAvLy8gZ2V0Q2FsbGVkVmFsdWUgLSBHZXQgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgYnkgdGhpcworICAvLy8gaW5zdHJ1Y3Rpb24uCisgIGNvbnN0IFZhbHVlICpnZXRDYWxsZWRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIE9wPC0xPigpOyB9CisgICAgICAgIFZhbHVlICpnZXRDYWxsZWRWYWx1ZSgpICAgICAgIHsgcmV0dXJuIE9wPC0xPigpOyB9CisKKyAgLy8vIHNldENhbGxlZEZ1bmN0aW9uIC0gU2V0IHRoZSBmdW5jdGlvbiBjYWxsZWQuCisgIHZvaWQgc2V0Q2FsbGVkRnVuY3Rpb24oVmFsdWUqIEZuKSB7CisgICAgT3A8LTE+KCkgPSBGbjsKKyAgfQorICAKKyAgLy8vIGlzSW5saW5lQXNtIC0gQ2hlY2sgaWYgdGhpcyBjYWxsIGlzIGFuIGlubGluZSBhc20gc3RhdGVtZW50LgorICBib29sIGlzSW5saW5lQXNtKCkgY29uc3QgeworICAgIHJldHVybiBpc2E8SW5saW5lQXNtPihPcDwtMT4oKSk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDYWxsSW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpDYWxsOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK3ByaXZhdGU6CisgIC8vIFNoYWRvdyBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZworICAvLyBtZXRob2Qgc28gdGhhdCBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoRCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxDYWxsSW5zdD4gOiBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPDE+IHsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CitDYWxsSW5zdDo6Q2FsbEluc3QoVmFsdWUgKkZ1bmMsIElucHV0SXRlcmF0b3IgQXJnQmVnaW4sIElucHV0SXRlcmF0b3IgQXJnRW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgOiBJbnN0cnVjdGlvbihjYXN0PEZ1bmN0aW9uVHlwZT4oY2FzdDxQb2ludGVyVHlwZT4oRnVuYy0+Z2V0VHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldEVsZW1lbnRUeXBlKCkpLT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkNhbGwsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxDYWxsSW5zdD46Om9wX2VuZCh0aGlzKSAtIChBcmdFbmQgLSBBcmdCZWdpbiArIDEpLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkKEFyZ0VuZCAtIEFyZ0JlZ2luICsgMSksIEluc2VydEF0RW5kKSB7CisgIGluaXQoRnVuYywgQXJnQmVnaW4sIEFyZ0VuZCwgTmFtZVN0ciwKKyAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJbnB1dEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CitDYWxsSW5zdDo6Q2FsbEluc3QoVmFsdWUgKkZ1bmMsIElucHV0SXRlcmF0b3IgQXJnQmVnaW4sIElucHV0SXRlcmF0b3IgQXJnRW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICA6IEluc3RydWN0aW9uKGNhc3Q8RnVuY3Rpb25UeXBlPihjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0RWxlbWVudFR5cGUoKSktPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6Q2FsbCwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPENhbGxJbnN0Pjo6b3BfZW5kKHRoaXMpIC0gKEFyZ0VuZCAtIEFyZ0JlZ2luICsgMSksCisgICAgICAgICAgICAgICAgdW5zaWduZWQoQXJnRW5kIC0gQXJnQmVnaW4gKyAxKSwgSW5zZXJ0QmVmb3JlKSB7CisgIGluaXQoRnVuYywgQXJnQmVnaW4sIEFyZ0VuZCwgTmFtZVN0ciwKKyAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJbnB1dEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKKworLy8gTm90ZTogaWYgeW91IGdldCBjb21waWxlIGVycm9ycyBhYm91dCBwcml2YXRlIG1ldGhvZHMgdGhlbgorLy8gICAgICAgcGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHRoZSBoaWdoLWxldmVsIG9wZXJhbmQKKy8vICAgICAgIGludGVyZmFjZXMuIFNlZSBsaW5lIDk0MyBhYm92ZS4KK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDYWxsSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gU2VsZWN0SW5zdCAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgTExWTSAnc2VsZWN0JyBpbnN0cnVjdGlvbi4KKy8vLworY2xhc3MgU2VsZWN0SW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIHZvaWQgaW5pdChWYWx1ZSAqQywgVmFsdWUgKlMxLCBWYWx1ZSAqUzIpIHsKKyAgICBhc3NlcnQoIWFyZUludmFsaWRPcGVyYW5kcyhDLCBTMSwgUzIpICYmICJJbnZhbGlkIG9wZXJhbmRzIGZvciBzZWxlY3QiKTsKKyAgICBPcDwwPigpID0gQzsKKyAgICBPcDwxPigpID0gUzE7CisgICAgT3A8Mj4oKSA9IFMyOworICB9CisKKyAgU2VsZWN0SW5zdChWYWx1ZSAqQywgVmFsdWUgKlMxLCBWYWx1ZSAqUzIsCisgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgICA6IEluc3RydWN0aW9uKFMxLT5nZXRUeXBlKCksIEluc3RydWN0aW9uOjpTZWxlY3QsCisgICAgICAgICAgICAgICAgICAmT3A8MD4oKSwgMywgSW5zZXJ0QmVmb3JlKSB7CisgICAgaW5pdChDLCBTMSwgUzIpOworICB9CisgIFNlbGVjdEluc3QoVmFsdWUgKkMsIFZhbHVlICpTMSwgVmFsdWUgKlMyLAorICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICAgIDogSW5zdHJ1Y3Rpb24oUzEtPmdldFR5cGUoKSwgSW5zdHJ1Y3Rpb246OlNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICZPcDwwPigpLCAzLCBJbnNlcnRBdEVuZCkgeworICAgIGluaXQoQywgUzEsIFMyKTsKKyAgfQorcHJvdGVjdGVkOgorICB2aXJ0dWFsIFNlbGVjdEluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKK3B1YmxpYzoKKyAgc3RhdGljIFNlbGVjdEluc3QgKkNyZWF0ZShWYWx1ZSAqQywgVmFsdWUgKlMxLCBWYWx1ZSAqUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApIHsKKyAgICByZXR1cm4gbmV3KDMpIFNlbGVjdEluc3QoQywgUzEsIFMyLCBJbnNlcnRCZWZvcmUpOworICB9CisgIHN0YXRpYyBTZWxlY3RJbnN0ICpDcmVhdGUoVmFsdWUgKkMsIFZhbHVlICpTMSwgVmFsdWUgKlMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldygzKSBTZWxlY3RJbnN0KEMsIFMxLCBTMiwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgY29uc3QgVmFsdWUgKmdldENvbmRpdGlvbigpIGNvbnN0IHsgcmV0dXJuIE9wPDA+KCk7IH0KKyAgY29uc3QgVmFsdWUgKmdldFRydWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIE9wPDE+KCk7IH0KKyAgY29uc3QgVmFsdWUgKmdldEZhbHNlVmFsdWUoKSBjb25zdCB7IHJldHVybiBPcDwyPigpOyB9CisgIFZhbHVlICpnZXRDb25kaXRpb24oKSB7IHJldHVybiBPcDwwPigpOyB9CisgIFZhbHVlICpnZXRUcnVlVmFsdWUoKSB7IHJldHVybiBPcDwxPigpOyB9CisgIFZhbHVlICpnZXRGYWxzZVZhbHVlKCkgeyByZXR1cm4gT3A8Mj4oKTsgfQorICAKKyAgLy8vIGFyZUludmFsaWRPcGVyYW5kcyAtIFJldHVybiBhIHN0cmluZyBpZiB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzIGFyZSBpbnZhbGlkCisgIC8vLyBmb3IgYSBzZWxlY3Qgb3BlcmF0aW9uLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIHN0YXRpYyBjb25zdCBjaGFyICphcmVJbnZhbGlkT3BlcmFuZHMoVmFsdWUgKkNvbmQsIFZhbHVlICpUcnVlLCBWYWx1ZSAqRmFsc2UpOworCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICBPdGhlck9wcyBnZXRPcGNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE90aGVyT3BzPihJbnN0cnVjdGlvbjo6Z2V0T3Bjb2RlKCkpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgU2VsZWN0SW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTZWxlY3Q7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPFNlbGVjdEluc3Q+IDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czwzPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoU2VsZWN0SW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEVsZW1lbnRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRXh0cmFjdEVsZW1lbnRJbnN0IC0gVGhpcyBpbnN0cnVjdGlvbiBleHRyYWN0cyBhIHNpbmdsZSAoc2NhbGFyKQorLy8vIGVsZW1lbnQgZnJvbSBhIFZlY3RvclR5cGUgdmFsdWUKKy8vLworY2xhc3MgRXh0cmFjdEVsZW1lbnRJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgRXh0cmFjdEVsZW1lbnRJbnN0KFZhbHVlICpWZWMsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCk7CisgIEV4dHJhY3RFbGVtZW50SW5zdChWYWx1ZSAqVmVjLCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworcHJvdGVjdGVkOgorICB2aXJ0dWFsIEV4dHJhY3RFbGVtZW50SW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIHN0YXRpYyBFeHRyYWN0RWxlbWVudEluc3QgKkNyZWF0ZShWYWx1ZSAqVmVjLCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIHJldHVybiBuZXcoMikgRXh0cmFjdEVsZW1lbnRJbnN0KFZlYywgSWR4LCBJbnNlcnRCZWZvcmUpOworICB9CisgIHN0YXRpYyBFeHRyYWN0RWxlbWVudEluc3QgKkNyZWF0ZShWYWx1ZSAqVmVjLCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoMikgRXh0cmFjdEVsZW1lbnRJbnN0KFZlYywgSWR4LCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gaXNWYWxpZE9wZXJhbmRzIC0gUmV0dXJuIHRydWUgaWYgYW4gZXh0cmFjdGVsZW1lbnQgaW5zdHJ1Y3Rpb24gY2FuIGJlCisgIC8vLyBmb3JtZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkT3BlcmFuZHMoY29uc3QgVmFsdWUgKlZlYywgY29uc3QgVmFsdWUgKklkeCk7CisKKyAgVmFsdWUgKmdldFZlY3Rvck9wZXJhbmQoKSB7IHJldHVybiBPcDwwPigpOyB9CisgIFZhbHVlICpnZXRJbmRleE9wZXJhbmQoKSB7IHJldHVybiBPcDwxPigpOyB9CisgIGNvbnN0IFZhbHVlICpnZXRWZWN0b3JPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gT3A8MD4oKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0SW5kZXhPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gT3A8MT4oKTsgfQorICAKKyAgY29uc3QgVmVjdG9yVHlwZSAqZ2V0VmVjdG9yT3BlcmFuZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmVjdG9yVHlwZSo+KGdldFZlY3Rvck9wZXJhbmQoKS0+Z2V0VHlwZSgpKTsKKyAgfQorICAKKyAgCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBFeHRyYWN0RWxlbWVudEluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RXh0cmFjdEVsZW1lbnQ7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEV4dHJhY3RFbGVtZW50SW5zdD4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDI+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhFeHRyYWN0RWxlbWVudEluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydEVsZW1lbnRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gSW5zZXJ0RWxlbWVudEluc3QgLSBUaGlzIGluc3RydWN0aW9uIGluc2VydHMgYSBzaW5nbGUgKHNjYWxhcikKKy8vLyBlbGVtZW50IGludG8gYSBWZWN0b3JUeXBlIHZhbHVlCisvLy8KK2NsYXNzIEluc2VydEVsZW1lbnRJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgSW5zZXJ0RWxlbWVudEluc3QoVmFsdWUgKlZlYywgVmFsdWUgKk5ld0VsdCwgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworICBJbnNlcnRFbGVtZW50SW5zdChWYWx1ZSAqVmVjLCBWYWx1ZSAqTmV3RWx0LCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgSW5zZXJ0RWxlbWVudEluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgSW5zZXJ0RWxlbWVudEluc3QgKkNyZWF0ZShWYWx1ZSAqVmVjLCBWYWx1ZSAqTmV3RWx0LCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIHJldHVybiBuZXcoMykgSW5zZXJ0RWxlbWVudEluc3QoVmVjLCBOZXdFbHQsIElkeCwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorICBzdGF0aWMgSW5zZXJ0RWxlbWVudEluc3QgKkNyZWF0ZShWYWx1ZSAqVmVjLCBWYWx1ZSAqTmV3RWx0LCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoMykgSW5zZXJ0RWxlbWVudEluc3QoVmVjLCBOZXdFbHQsIElkeCwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIGlzVmFsaWRPcGVyYW5kcyAtIFJldHVybiB0cnVlIGlmIGFuIGluc2VydGVsZW1lbnQgaW5zdHJ1Y3Rpb24gY2FuIGJlCisgIC8vLyBmb3JtZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkT3BlcmFuZHMoY29uc3QgVmFsdWUgKlZlYywgY29uc3QgVmFsdWUgKk5ld0VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpJZHgpOworCisgIC8vLyBnZXRUeXBlIC0gT3ZlcmxvYWQgdG8gcmV0dXJuIG1vc3Qgc3BlY2lmaWMgdmVjdG9yIHR5cGUuCisgIC8vLworICBjb25zdCBWZWN0b3JUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFZlY3RvclR5cGUqPihJbnN0cnVjdGlvbjo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnNlcnRFbGVtZW50SW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50OworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxJbnNlcnRFbGVtZW50SW5zdD4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDM+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhJbnNlcnRFbGVtZW50SW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNodWZmbGVWZWN0b3JJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gU2h1ZmZsZVZlY3Rvckluc3QgLSBUaGlzIGluc3RydWN0aW9uIGNvbnN0cnVjdHMgYSBmaXhlZCBwZXJtdXRhdGlvbiBvZiB0d28KKy8vLyBpbnB1dCB2ZWN0b3JzLgorLy8vCitjbGFzcyBTaHVmZmxlVmVjdG9ySW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgU2h1ZmZsZVZlY3Rvckluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0aHJlZSBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDMpOworICB9CisgIFNodWZmbGVWZWN0b3JJbnN0KFZhbHVlICpWMSwgVmFsdWUgKlYyLCBWYWx1ZSAqTWFzaywKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yID0gMCk7CisgIFNodWZmbGVWZWN0b3JJbnN0KFZhbHVlICpWMSwgVmFsdWUgKlYyLCBWYWx1ZSAqTWFzaywKKyAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vLyBpc1ZhbGlkT3BlcmFuZHMgLSBSZXR1cm4gdHJ1ZSBpZiBhIHNodWZmbGV2ZWN0b3IgaW5zdHJ1Y3Rpb24gY2FuIGJlCisgIC8vLyBmb3JtZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkT3BlcmFuZHMoY29uc3QgVmFsdWUgKlYxLCBjb25zdCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqTWFzayk7CisKKyAgLy8vIGdldFR5cGUgLSBPdmVybG9hZCB0byByZXR1cm4gbW9zdCBzcGVjaWZpYyB2ZWN0b3IgdHlwZS4KKyAgLy8vCisgIGNvbnN0IFZlY3RvclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmVjdG9yVHlwZSo+KEluc3RydWN0aW9uOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vLyBnZXRNYXNrVmFsdWUgLSBSZXR1cm4gdGhlIGluZGV4IGZyb20gdGhlIHNodWZmbGUgbWFzayBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gb3V0cHV0IHJlc3VsdC4gIFRoaXMgaXMgZWl0aGVyIC0xIGlmIHRoZSBlbGVtZW50IGlzIHVuZGVmIG9yIGEgbnVtYmVyIGxlc3MKKyAgLy8vIHRoYW4gMipudW1lbGVtZW50cy4KKyAgaW50IGdldE1hc2tWYWx1ZSh1bnNpZ25lZCBpKSBjb25zdDsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTaHVmZmxlVmVjdG9ySW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaHVmZmxlVmVjdG9yOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxTaHVmZmxlVmVjdG9ySW5zdD4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDM+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhTaHVmZmxlVmVjdG9ySW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdFZhbHVlSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEV4dHJhY3RWYWx1ZUluc3QgLSBUaGlzIGluc3RydWN0aW9uIGV4dHJhY3RzIGEgc3RydWN0IG1lbWJlciBvciBhcnJheQorLy8vIGVsZW1lbnQgdmFsdWUgZnJvbSBhbiBhZ2dyZWdhdGUgdmFsdWUuCisvLy8KK2NsYXNzIEV4dHJhY3RWYWx1ZUluc3QgOiBwdWJsaWMgVW5hcnlJbnN0cnVjdGlvbiB7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJbmRpY2VzOworCisgIEV4dHJhY3RWYWx1ZUluc3QoY29uc3QgRXh0cmFjdFZhbHVlSW5zdCAmRVZJKTsKKyAgdm9pZCBpbml0KGNvbnN0IHVuc2lnbmVkICpJZHgsIHVuc2lnbmVkIE51bUlkeCk7CisgIHZvaWQgaW5pdCh1bnNpZ25lZCBJZHgpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5pdChJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLCBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgIC8vIFRoaXMgYXJndW1lbnQgZW5zdXJlcyB0aGF0IHdlIGhhdmUgYW4gaXRlcmF0b3Igd2UgY2FuCisgICAgICAgICAgICAvLyBkbyBhcml0aG1ldGljIG9uIGluIGNvbnN0YW50IHRpbWUKKyAgICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpIHsKKyAgICB1bnNpZ25lZCBOdW1JZHggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc3RkOjpkaXN0YW5jZShJZHhCZWdpbiwgSWR4RW5kKSk7CisKKyAgICAvLyBUaGVyZSdzIG5vIGZ1bmRhbWVudGFsIHJlYXNvbiB3aHkgd2UgcmVxdWlyZSBhdCBsZWFzdCBvbmUgaW5kZXgKKyAgICAvLyAob3RoZXIgdGhhbiB3ZWlyZG5lc3Mgd2l0aCAmKklkeEJlZ2luIGJlaW5nIGludmFsaWQ7IHNlZQorICAgIC8vIGdldGVsZW1lbnRwdHIncyBpbml0IHJvdXRpbmUgZm9yIGV4YW1wbGUpLiBCdXQgdGhlcmUncyBubworICAgIC8vIHByZXNlbnQgbmVlZCB0byBzdXBwb3J0IGl0LgorICAgIGFzc2VydChOdW1JZHggPiAwICYmICJFeHRyYWN0VmFsdWVJbnN0IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgaW5kZXgiKTsKKworICAgIC8vIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgaXRlcmF0b3IgcG9pbnRzIHRvIGNvbnRpZ3VvdXMgbWVtb3J5LgorICAgIGluaXQoJipJZHhCZWdpbiwgTnVtSWR4KTsgLy8gRklYTUU6IGZvciB0aGUgZ2VuZXJhbCBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gYnVpbGQgYW4gYXJyYXkgaGVyZQorICB9CisKKyAgLy8vIGdldEluZGV4ZWRUeXBlIC0gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIGV4dHJhY3RlZAorICAvLy8gd2l0aCBhbiBleHRyYWN0dmFsdWUgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgIC8vLworICAvLy8gTnVsbCBpcyByZXR1cm5lZCBpZiB0aGUgaW5kaWNlcyBhcmUgaW52YWxpZCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlciB0eXBlLgorICAvLy8KKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldEluZGV4ZWRUeXBlKGNvbnN0IFR5cGUgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpJZHgsIHVuc2lnbmVkIE51bUlkeCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldEluZGV4ZWRUeXBlKGNvbnN0IFR5cGUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYXJndW1lbnQgZW5zdXJlcyB0aGF0IHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIGFuIGl0ZXJhdG9yIHdlIGNhbiBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJpdGhtZXRpYyBvbiBpbiBjb25zdGFudCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKSB7CisgICAgdW5zaWduZWQgTnVtSWR4ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHN0ZDo6ZGlzdGFuY2UoSWR4QmVnaW4sIElkeEVuZCkpOworCisgICAgaWYgKE51bUlkeCA+IDApCisgICAgICAvLyBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGl0ZXJhdG9yIHBvaW50cyB0byBjb250aWd1b3VzIG1lbW9yeS4KKyAgICAgIHJldHVybiBnZXRJbmRleGVkVHlwZShQdHIsICYqSWR4QmVnaW4sIE51bUlkeCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGdldEluZGV4ZWRUeXBlKFB0ciwgKGNvbnN0IHVuc2lnbmVkICopMCwgTnVtSWR4KTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3RvcnMgLSBDcmVhdGUgYSBleHRyYWN0dmFsdWUgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhc2UgYWdncmVnYXRlCisgIC8vLyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGluZGljZXMuICBUaGUgZmlyc3QgY3RvciBjYW4gb3B0aW9uYWxseSBpbnNlcnQgYmVmb3JlCisgIC8vLyBhbiBleGlzdGluZyBpbnN0cnVjdGlvbiwgdGhlIHNlY29uZCBhcHBlbmRzIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgQmFzaWNCbG9jay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgaW5saW5lIEV4dHJhY3RWYWx1ZUluc3QoVmFsdWUgKkFnZywgSW5wdXRJdGVyYXRvciBJZHhCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICBpbmxpbmUgRXh0cmFjdFZhbHVlSW5zdChWYWx1ZSAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLCBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IG9uZSBvcGVyYW5kCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMSk7CisgIH0KK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBFeHRyYWN0VmFsdWVJbnN0ICpjbG9uZV9pbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgc3RhdGljIEV4dHJhY3RWYWx1ZUluc3QgKkNyZWF0ZShWYWx1ZSAqQWdnLCBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKSB7CisgICAgcmV0dXJuIG5ldworICAgICAgRXh0cmFjdFZhbHVlSW5zdChBZ2csIElkeEJlZ2luLCBJZHhFbmQsIEluc2VydEJlZm9yZSk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgc3RhdGljIEV4dHJhY3RWYWx1ZUluc3QgKkNyZWF0ZShWYWx1ZSAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sIElucHV0SXRlcmF0b3IgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldyBFeHRyYWN0VmFsdWVJbnN0KEFnZywgSWR4QmVnaW4sIElkeEVuZCwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIENvbnN0cnVjdG9ycyAtIFRoZXNlIHR3byBjcmVhdG9ycyBhcmUgY29udmVuaWVuY2UgbWV0aG9kcyBiZWNhdXNlIG9uZQorICAvLy8gaW5kZXggZXh0cmFjdHZhbHVlIGluc3RydWN0aW9ucyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuIHRob3NlIHdpdGgKKyAgLy8vIG1vcmUgdGhhbiBvbmUuCisgIHN0YXRpYyBFeHRyYWN0VmFsdWVJbnN0ICpDcmVhdGUoVmFsdWUgKkFnZywgdW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKSB7CisgICAgdW5zaWduZWQgSWR4c1sxXSA9IHsgSWR4IH07CisgICAgcmV0dXJuIG5ldyBFeHRyYWN0VmFsdWVJbnN0KEFnZywgSWR4cywgSWR4cyArIDEsIEluc2VydEJlZm9yZSk7CisgIH0KKyAgc3RhdGljIEV4dHJhY3RWYWx1ZUluc3QgKkNyZWF0ZShWYWx1ZSAqQWdnLCB1bnNpZ25lZCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICB1bnNpZ25lZCBJZHhzWzFdID0geyBJZHggfTsKKyAgICByZXR1cm4gbmV3IEV4dHJhY3RWYWx1ZUluc3QoQWdnLCBJZHhzLCBJZHhzICsgMSwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIGdldEluZGV4ZWRUeXBlIC0gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIGV4dHJhY3RlZAorICAvLy8gd2l0aCBhbiBleHRyYWN0dmFsdWUgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgIC8vLworICAvLy8gTnVsbCBpcyByZXR1cm5lZCBpZiB0aGUgaW5kaWNlcyBhcmUgaW52YWxpZCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlciB0eXBlLgorICAvLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldEluZGV4ZWRUeXBlKGNvbnN0IFR5cGUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEVuZCkgeworICAgIHJldHVybiBnZXRJbmRleGVkVHlwZShQdHIsIElkeEJlZ2luLCBJZHhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPElucHV0SXRlcmF0b3I+OjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnkoKSk7CisgIH0KKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldEluZGV4ZWRUeXBlKGNvbnN0IFR5cGUgKlB0ciwgdW5zaWduZWQgSWR4KTsKKworICB0eXBlZGVmIGNvbnN0IHVuc2lnbmVkKiBpZHhfaXRlcmF0b3I7CisgIGlubGluZSBpZHhfaXRlcmF0b3IgaWR4X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5kaWNlcy5iZWdpbigpOyB9CisgIGlubGluZSBpZHhfaXRlcmF0b3IgaWR4X2VuZCgpICAgY29uc3QgeyByZXR1cm4gSW5kaWNlcy5lbmQoKTsgfQorCisgIFZhbHVlICpnZXRBZ2dyZWdhdGVPcGVyYW5kKCkgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIGNvbnN0IFZhbHVlICpnZXRBZ2dyZWdhdGVPcGVyYW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRBZ2dyZWdhdGVPcGVyYW5kSW5kZXgoKSB7CisgICAgcmV0dXJuIDBVOyAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaW5kZXggZm9yIG1vZGlmeWluZyBjb3JyZWN0IG9wZXJhbmQKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUluZGljZXMoKSBjb25zdCB7ICAvLyBOb3RlOiBhbHdheXMgbm9uLW5lZ2F0aXZlCisgICAgcmV0dXJuICh1bnNpZ25lZClJbmRpY2VzLnNpemUoKTsKKyAgfQorCisgIGJvb2wgaGFzSW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEV4dHJhY3RWYWx1ZUluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RXh0cmFjdFZhbHVlOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CitFeHRyYWN0VmFsdWVJbnN0OjpFeHRyYWN0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oY2hlY2tUeXBlKGdldEluZGV4ZWRUeXBlKEFnZy0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkeEJlZ2luLCBJZHhFbmQpKSwKKyAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RWYWx1ZSwgQWdnLCBJbnNlcnRCZWZvcmUpIHsKKyAgaW5pdChJZHhCZWdpbiwgSWR4RW5kLAorICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPElucHV0SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSgpKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CitFeHRyYWN0VmFsdWVJbnN0OjpFeHRyYWN0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgOiBVbmFyeUluc3RydWN0aW9uKGNoZWNrVHlwZShnZXRJbmRleGVkVHlwZShBZ2ctPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZHhCZWdpbiwgSWR4RW5kKSksCisgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0VmFsdWUsIEFnZywgSW5zZXJ0QXRFbmQpIHsKKyAgaW5pdChJZHhCZWdpbiwgSWR4RW5kLAorICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPElucHV0SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSgpKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydFZhbHVlSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEluc2VydFZhbHVlSW5zdCAtIFRoaXMgaW5zdHJ1Y3Rpb24gaW5zZXJ0cyBhIHN0cnVjdCBmaWVsZCBvZiBhcnJheSBlbGVtZW50CisvLy8gdmFsdWUgaW50byBhbiBhZ2dyZWdhdGUgdmFsdWUuCisvLy8KK2NsYXNzIEluc2VydFZhbHVlSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJbmRpY2VzOworCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKTsgLy8gRG8gbm90IGltcGxlbWVudAorICBJbnNlcnRWYWx1ZUluc3QoY29uc3QgSW5zZXJ0VmFsdWVJbnN0ICZJVkkpOworICB2b2lkIGluaXQoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwgY29uc3QgdW5zaWduZWQgKklkeCwgdW5zaWduZWQgTnVtSWR4KTsKKyAgdm9pZCBpbml0KFZhbHVlICpBZ2csIFZhbHVlICpWYWwsIHVuc2lnbmVkIElkeCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbml0KFZhbHVlICpBZ2csIFZhbHVlICpWYWwsCisgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLCBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgIC8vIFRoaXMgYXJndW1lbnQgZW5zdXJlcyB0aGF0IHdlIGhhdmUgYW4gaXRlcmF0b3Igd2UgY2FuCisgICAgICAgICAgICAvLyBkbyBhcml0aG1ldGljIG9uIGluIGNvbnN0YW50IHRpbWUKKyAgICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpIHsKKyAgICB1bnNpZ25lZCBOdW1JZHggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc3RkOjpkaXN0YW5jZShJZHhCZWdpbiwgSWR4RW5kKSk7CisKKyAgICAvLyBUaGVyZSdzIG5vIGZ1bmRhbWVudGFsIHJlYXNvbiB3aHkgd2UgcmVxdWlyZSBhdCBsZWFzdCBvbmUgaW5kZXgKKyAgICAvLyAob3RoZXIgdGhhbiB3ZWlyZG5lc3Mgd2l0aCAmKklkeEJlZ2luIGJlaW5nIGludmFsaWQ7IHNlZQorICAgIC8vIGdldGVsZW1lbnRwdHIncyBpbml0IHJvdXRpbmUgZm9yIGV4YW1wbGUpLiBCdXQgdGhlcmUncyBubworICAgIC8vIHByZXNlbnQgbmVlZCB0byBzdXBwb3J0IGl0LgorICAgIGFzc2VydChOdW1JZHggPiAwICYmICJJbnNlcnRWYWx1ZUluc3QgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBpbmRleCIpOworCisgICAgLy8gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBpdGVyYXRvciBwb2ludHMgdG8gY29udGlndW91cyBtZW1vcnkuCisgICAgaW5pdChBZ2csIFZhbCwgJipJZHhCZWdpbiwgTnVtSWR4KTsgLy8gRklYTUU6IGZvciB0aGUgZ2VuZXJhbCBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBidWlsZCBhbiBhcnJheSBoZXJlCisgIH0KKworICAvLy8gQ29uc3RydWN0b3JzIC0gQ3JlYXRlIGEgaW5zZXJ0dmFsdWUgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhc2UgYWdncmVnYXRlCisgIC8vLyB2YWx1ZSwgYSB2YWx1ZSB0byBpbnNlcnQsIGFuZCBhIGxpc3Qgb2YgaW5kaWNlcy4gIFRoZSBmaXJzdCBjdG9yIGNhbgorICAvLy8gb3B0aW9uYWxseSBpbnNlcnQgYmVmb3JlIGFuIGV4aXN0aW5nIGluc3RydWN0aW9uLCB0aGUgc2Vjb25kIGFwcGVuZHMKKyAgLy8vIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gdG8gdGhlIHNwZWNpZmllZCBCYXNpY0Jsb2NrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICBpbmxpbmUgSW5zZXJ0VmFsdWVJbnN0KFZhbHVlICpBZ2csIFZhbHVlICpWYWwsIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgIGlubGluZSBJbnNlcnRWYWx1ZUluc3QoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLCBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8vIENvbnN0cnVjdG9ycyAtIFRoZXNlIHR3byBjb25zdHJ1Y3RvcnMgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgYmVjYXVzZSBvbmUKKyAgLy8vIGFuZCB0d28gaW5kZXggaW5zZXJ0dmFsdWUgaW5zdHJ1Y3Rpb25zIGFyZSBzbyBjb21tb24uCisgIEluc2VydFZhbHVlSW5zdChWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworICBJbnNlcnRWYWx1ZUluc3QoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwgdW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworcHJvdGVjdGVkOgorICB2aXJ0dWFsIEluc2VydFZhbHVlSW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0d28gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAyKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgIHN0YXRpYyBJbnNlcnRWYWx1ZUluc3QgKkNyZWF0ZShWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLCBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIHJldHVybiBuZXcgSW5zZXJ0VmFsdWVJbnN0KEFnZywgVmFsLCBJZHhCZWdpbiwgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZSk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgc3RhdGljIEluc2VydFZhbHVlSW5zdCAqQ3JlYXRlKFZhbHVlICpBZ2csIFZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLCBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldyBJbnNlcnRWYWx1ZUluc3QoQWdnLCBWYWwsIElkeEJlZ2luLCBJZHhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIENvbnN0cnVjdG9ycyAtIFRoZXNlIHR3byBjcmVhdG9ycyBhcmUgY29udmVuaWVuY2UgbWV0aG9kcyBiZWNhdXNlIG9uZQorICAvLy8gaW5kZXggaW5zZXJ0dmFsdWUgaW5zdHJ1Y3Rpb25zIGFyZSBtdWNoIG1vcmUgY29tbW9uIHRoYW4gdGhvc2Ugd2l0aAorICAvLy8gbW9yZSB0aGFuIG9uZS4KKyAgc3RhdGljIEluc2VydFZhbHVlSW5zdCAqQ3JlYXRlKFZhbHVlICpBZ2csIFZhbHVlICpWYWwsIHVuc2lnbmVkIElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKSB7CisgICAgcmV0dXJuIG5ldyBJbnNlcnRWYWx1ZUluc3QoQWdnLCBWYWwsIElkeCwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorICBzdGF0aWMgSW5zZXJ0VmFsdWVJbnN0ICpDcmVhdGUoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwgdW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3IEluc2VydFZhbHVlSW5zdChBZ2csIFZhbCwgSWR4LCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgdHlwZWRlZiBjb25zdCB1bnNpZ25lZCogaWR4X2l0ZXJhdG9yOworICBpbmxpbmUgaWR4X2l0ZXJhdG9yIGlkeF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluZGljZXMuYmVnaW4oKTsgfQorICBpbmxpbmUgaWR4X2l0ZXJhdG9yIGlkeF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIEluZGljZXMuZW5kKCk7IH0KKworICBWYWx1ZSAqZ2V0QWdncmVnYXRlT3BlcmFuZCgpIHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorICBjb25zdCBWYWx1ZSAqZ2V0QWdncmVnYXRlT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0QWdncmVnYXRlT3BlcmFuZEluZGV4KCkgeworICAgIHJldHVybiAwVTsgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGluZGV4IGZvciBtb2RpZnlpbmcgY29ycmVjdCBvcGVyYW5kCisgIH0KKworICBWYWx1ZSAqZ2V0SW5zZXJ0ZWRWYWx1ZU9wZXJhbmQoKSB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMSk7CisgIH0KKyAgY29uc3QgVmFsdWUgKmdldEluc2VydGVkVmFsdWVPcGVyYW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDEpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRJbnNlcnRlZFZhbHVlT3BlcmFuZEluZGV4KCkgeworICAgIHJldHVybiAxVTsgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGluZGV4IGZvciBtb2RpZnlpbmcgY29ycmVjdCBvcGVyYW5kCisgIH0KKworICB1bnNpZ25lZCBnZXROdW1JbmRpY2VzKCkgY29uc3QgeyAgLy8gTm90ZTogYWx3YXlzIG5vbi1uZWdhdGl2ZQorICAgIHJldHVybiAodW5zaWduZWQpSW5kaWNlcy5zaXplKCk7CisgIH0KKworICBib29sIGhhc0luZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnNlcnRWYWx1ZUluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW5zZXJ0VmFsdWU7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEluc2VydFZhbHVlSW5zdD4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDI+IHsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CitJbnNlcnRWYWx1ZUluc3Q6Okluc2VydFZhbHVlSW5zdChWYWx1ZSAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgIDogSW5zdHJ1Y3Rpb24oQWdnLT5nZXRUeXBlKCksIEluc2VydFZhbHVlLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8SW5zZXJ0VmFsdWVJbnN0Pjo6b3BfYmVnaW4odGhpcyksCisgICAgICAgICAgICAgICAgMiwgSW5zZXJ0QmVmb3JlKSB7CisgIGluaXQoQWdnLCBWYWwsIElkeEJlZ2luLCBJZHhFbmQsCisgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SW5wdXRJdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5KCkpOworfQordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KK0luc2VydFZhbHVlSW5zdDo6SW5zZXJ0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBJZHhCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgIDogSW5zdHJ1Y3Rpb24oQWdnLT5nZXRUeXBlKCksIEluc2VydFZhbHVlLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8SW5zZXJ0VmFsdWVJbnN0Pjo6b3BfYmVnaW4odGhpcyksCisgICAgICAgICAgICAgICAgMiwgSW5zZXJ0QXRFbmQpIHsKKyAgaW5pdChBZ2csIFZhbCwgSWR4QmVnaW4sIElkeEVuZCwKKyAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJbnB1dEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhJbnNlcnRWYWx1ZUluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhJTm9kZSBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUEhJTm9kZSAtIFRoZSBQSElOb2RlIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBtYWdpY2FsIG15c3RpY2FsIFBISQorLy8gbm9kZSwgdGhhdCBjYW4gbm90IGV4aXN0IGluIG5hdHVyZSwgYnV0IGNhbiBiZSBzeW50aGVzaXplZCBpbiBhIGNvbXB1dGVyCisvLyBzY2llbnRpc3QncyBvdmVyYWN0aXZlIGltYWdpbmF0aW9uLgorLy8KK2NsYXNzIFBISU5vZGUgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCB1bnNpZ25lZCk7ICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIC8vLyBSZXNlcnZlZFNwYWNlIC0gVGhlIG51bWJlciBvZiBvcGVyYW5kcyBhY3R1YWxseSBhbGxvY2F0ZWQuICBOdW1PcGVyYW5kcyBpcworICAvLy8gdGhlIG51bWJlciBhY3R1YWxseSBpbiB1c2UuCisgIHVuc2lnbmVkIFJlc2VydmVkU3BhY2U7CisgIFBISU5vZGUoY29uc3QgUEhJTm9kZSAmUE4pOworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB6ZXJvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMCk7CisgIH0KKyAgZXhwbGljaXQgUEhJTm9kZShjb25zdCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkKKyAgICA6IEluc3RydWN0aW9uKFR5LCBJbnN0cnVjdGlvbjo6UEhJLCAwLCAwLCBJbnNlcnRCZWZvcmUpLAorICAgICAgUmVzZXJ2ZWRTcGFjZSgwKSB7CisgIH0KKworICBQSElOb2RlKGNvbnN0IFR5cGUgKlR5LCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgICA6IEluc3RydWN0aW9uKFR5LCBJbnN0cnVjdGlvbjo6UEhJLCAwLCAwLCBJbnNlcnRBdEVuZCksCisgICAgICBSZXNlcnZlZFNwYWNlKDApIHsKKyAgfQorcHJvdGVjdGVkOgorICB2aXJ0dWFsIFBISU5vZGUgKmNsb25lX2ltcGwoKSBjb25zdDsKK3B1YmxpYzoKKyAgc3RhdGljIFBISU5vZGUgKkNyZWF0ZShjb25zdCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIHJldHVybiBuZXcgUEhJTm9kZShUeSwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorICBzdGF0aWMgUEhJTm9kZSAqQ3JlYXRlKGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldyBQSElOb2RlKFR5LCBJbnNlcnRBdEVuZCk7CisgIH0KKyAgflBISU5vZGUoKTsKKworICAvLy8gcmVzZXJ2ZU9wZXJhbmRTcGFjZSAtIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGF2b2lkIHJlcGVhdGVkCisgIC8vLyByZWFsbG9jYXRpb24gb2YgUEhJIG9wZXJhbmQgbGlzdHMgYnkgcmVzZXJ2aW5nIHNwYWNlIGZvciB0aGUgY29ycmVjdAorICAvLy8gbnVtYmVyIG9mIG9wZXJhbmRzIGJlZm9yZSBhZGRpbmcgdGhlbS4gIFVubGlrZSBub3JtYWwgdmVjdG9yIHJlc2VydmVzLAorICAvLy8gdGhpcyBtZXRob2QgY2FuIGFsc28gYmUgdXNlZCB0byB0cmltIHRoZSBvcGVyYW5kIHNwYWNlLgorICB2b2lkIHJlc2VydmVPcGVyYW5kU3BhY2UodW5zaWduZWQgTnVtVmFsdWVzKSB7CisgICAgcmVzaXplT3BlcmFuZHMoTnVtVmFsdWVzKjIpOworICB9CisKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gZ2V0TnVtSW5jb21pbmdWYWx1ZXMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBpbmNvbWluZyBlZGdlcworICAvLy8KKyAgdW5zaWduZWQgZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpLzI7IH0KKworICAvLy8gZ2V0SW5jb21pbmdWYWx1ZSAtIFJldHVybiBpbmNvbWluZyB2YWx1ZSBudW1iZXIgeAorICAvLy8KKyAgVmFsdWUgKmdldEluY29taW5nVmFsdWUodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpKjIgPCBnZXROdW1PcGVyYW5kcygpICYmICJJbnZhbGlkIHZhbHVlIG51bWJlciEiKTsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZChpKjIpOworICB9CisgIHZvaWQgc2V0SW5jb21pbmdWYWx1ZSh1bnNpZ25lZCBpLCBWYWx1ZSAqVikgeworICAgIGFzc2VydChpKjIgPCBnZXROdW1PcGVyYW5kcygpICYmICJJbnZhbGlkIHZhbHVlIG51bWJlciEiKTsKKyAgICBzZXRPcGVyYW5kKGkqMiwgVik7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldE9wZXJhbmROdW1Gb3JJbmNvbWluZ1ZhbHVlKHVuc2lnbmVkIGkpIHsKKyAgICByZXR1cm4gaSoyOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRJbmNvbWluZ1ZhbHVlTnVtRm9yT3BlcmFuZCh1bnNpZ25lZCBpKSB7CisgICAgYXNzZXJ0KGkgJSAyID09IDAgJiYgIkludmFsaWQgaW5jb21pbmctdmFsdWUgb3BlcmFuZCBpbmRleCEiKTsKKyAgICByZXR1cm4gaS8yOworICB9CisKKyAgLy8vIGdldEluY29taW5nQmxvY2sgLSBSZXR1cm4gaW5jb21pbmcgYmFzaWMgYmxvY2sgbnVtYmVyIEBwIGkuCisgIC8vLworICBCYXNpY0Jsb2NrICpnZXRJbmNvbWluZ0Jsb2NrKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxCYXNpY0Jsb2NrPihnZXRPcGVyYW5kKGkqMisxKSk7CisgIH0KKyAgCisgIC8vLyBnZXRJbmNvbWluZ0Jsb2NrIC0gUmV0dXJuIGluY29taW5nIGJhc2ljIGJsb2NrIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHRvIGFuIG9wZXJhbmQgb2YgdGhlIFBISS4KKyAgLy8vCisgIEJhc2ljQmxvY2sgKmdldEluY29taW5nQmxvY2soY29uc3QgVXNlICZVKSBjb25zdCB7CisgICAgYXNzZXJ0KHRoaXMgPT0gVS5nZXRVc2VyKCkgJiYgIkl0ZXJhdG9yIGRvZXNuJ3QgcG9pbnQgdG8gUEhJJ3MgVXNlcz8iKTsKKyAgICByZXR1cm4gY2FzdDxCYXNpY0Jsb2NrPigoJlUgKyAxKS0+Z2V0KCkpOworICB9CisgIAorICAvLy8gZ2V0SW5jb21pbmdCbG9jayAtIFJldHVybiBpbmNvbWluZyBiYXNpYyBibG9jayBjb3JyZXNwb25kaW5nCisgIC8vLyB0byB2YWx1ZSB1c2UgaXRlcmF0b3IuCisgIC8vLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgQmFzaWNCbG9jayAqZ2V0SW5jb21pbmdCbG9jayh2YWx1ZV91c2VfaXRlcmF0b3I8VT4gSSkgY29uc3QgeworICAgIHJldHVybiBnZXRJbmNvbWluZ0Jsb2NrKEkuZ2V0VXNlKCkpOworICB9CisgIAorICAKKyAgdm9pZCBzZXRJbmNvbWluZ0Jsb2NrKHVuc2lnbmVkIGksIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgc2V0T3BlcmFuZChpKjIrMSwgKFZhbHVlKilCQik7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldE9wZXJhbmROdW1Gb3JJbmNvbWluZ0Jsb2NrKHVuc2lnbmVkIGkpIHsKKyAgICByZXR1cm4gaSoyKzE7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEluY29taW5nQmxvY2tOdW1Gb3JPcGVyYW5kKHVuc2lnbmVkIGkpIHsKKyAgICBhc3NlcnQoaSAlIDIgPT0gMSAmJiAiSW52YWxpZCBpbmNvbWluZy1ibG9jayBvcGVyYW5kIGluZGV4ISIpOworICAgIHJldHVybiBpLzI7CisgIH0KKworICAvLy8gYWRkSW5jb21pbmcgLSBBZGQgYW4gaW5jb21pbmcgdmFsdWUgdG8gdGhlIGVuZCBvZiB0aGUgUEhJIGxpc3QKKyAgLy8vCisgIHZvaWQgYWRkSW5jb21pbmcoVmFsdWUgKlYsIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgYXNzZXJ0KFYgJiYgIlBISSBub2RlIGdvdCBhIG51bGwgdmFsdWUhIik7CisgICAgYXNzZXJ0KEJCICYmICJQSEkgbm9kZSBnb3QgYSBudWxsIGJhc2ljIGJsb2NrISIpOworICAgIGFzc2VydChnZXRUeXBlKCkgPT0gVi0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICJBbGwgb3BlcmFuZHMgdG8gUEhJIG5vZGUgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSBQSEkgbm9kZSEiKTsKKyAgICB1bnNpZ25lZCBPcE5vID0gTnVtT3BlcmFuZHM7CisgICAgaWYgKE9wTm8rMiA+IFJlc2VydmVkU3BhY2UpCisgICAgICByZXNpemVPcGVyYW5kcygwKTsgIC8vIEdldCBtb3JlIHNwYWNlIQorICAgIC8vIEluaXRpYWxpemUgc29tZSBuZXcgb3BlcmFuZHMuCisgICAgTnVtT3BlcmFuZHMgPSBPcE5vKzI7CisgICAgT3BlcmFuZExpc3RbT3BOb10gPSBWOworICAgIE9wZXJhbmRMaXN0W09wTm8rMV0gPSAoVmFsdWUqKUJCOworICB9CisKKyAgLy8vIHJlbW92ZUluY29taW5nVmFsdWUgLSBSZW1vdmUgYW4gaW5jb21pbmcgdmFsdWUuICBUaGlzIGlzIHVzZWZ1bCBpZiBhCisgIC8vLyBwcmVkZWNlc3NvciBiYXNpYyBibG9jayBpcyBkZWxldGVkLiAgVGhlIHZhbHVlIHJlbW92ZWQgaXMgcmV0dXJuZWQuCisgIC8vLworICAvLy8gSWYgdGhlIGxhc3QgaW5jb21pbmcgdmFsdWUgZm9yIGEgUEhJIG5vZGUgaXMgcmVtb3ZlZCAoYW5kIERlbGV0ZVBISUlmRW1wdHkKKyAgLy8vIGlzIHRydWUpLCB0aGUgUEhJIG5vZGUgaXMgZGVzdHJveWVkIGFuZCBhbnkgdXNlcyBvZiBpdCBhcmUgcmVwbGFjZWQgd2l0aAorICAvLy8gZHVtbXkgdmFsdWVzLiAgVGhlIG9ubHkgdGltZSB0aGVyZSBzaG91bGQgYmUgemVybyBpbmNvbWluZyB2YWx1ZXMgdG8gYSBQSEkKKyAgLy8vIG5vZGUgaXMgd2hlbiB0aGUgYmxvY2sgaXMgZGVhZCwgc28gdGhpcyBzdHJhdGVneSBpcyBzb3VuZC4KKyAgLy8vCisgIFZhbHVlICpyZW1vdmVJbmNvbWluZ1ZhbHVlKHVuc2lnbmVkIElkeCwgYm9vbCBEZWxldGVQSElJZkVtcHR5ID0gdHJ1ZSk7CisKKyAgVmFsdWUgKnJlbW92ZUluY29taW5nVmFsdWUoY29uc3QgQmFzaWNCbG9jayAqQkIsIGJvb2wgRGVsZXRlUEhJSWZFbXB0eT10cnVlKSB7CisgICAgaW50IElkeCA9IGdldEJhc2ljQmxvY2tJbmRleChCQik7CisgICAgYXNzZXJ0KElkeCA+PSAwICYmICJJbnZhbGlkIGJhc2ljIGJsb2NrIGFyZ3VtZW50IHRvIHJlbW92ZSEiKTsKKyAgICByZXR1cm4gcmVtb3ZlSW5jb21pbmdWYWx1ZShJZHgsIERlbGV0ZVBISUlmRW1wdHkpOworICB9CisKKyAgLy8vIGdldEJhc2ljQmxvY2tJbmRleCAtIFJldHVybiB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBiYXNpYworICAvLy8gYmxvY2sgaW4gdGhlIHZhbHVlIGxpc3QgZm9yIHRoaXMgUEhJLiAgUmV0dXJucyAtMSBpZiBubyBpbnN0YW5jZS4KKyAgLy8vCisgIGludCBnZXRCYXNpY0Jsb2NrSW5kZXgoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBVc2UgKk9MID0gT3BlcmFuZExpc3Q7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgaSArPSAyKQorICAgICAgaWYgKE9MW2krMV0uZ2V0KCkgPT0gKGNvbnN0IFZhbHVlKilCQikgcmV0dXJuIGkvMjsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBWYWx1ZSAqZ2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluY29taW5nVmFsdWUoZ2V0QmFzaWNCbG9ja0luZGV4KEJCKSk7CisgIH0KKworICAvLy8gaGFzQ29uc3RhbnRWYWx1ZSAtIElmIHRoZSBzcGVjaWZpZWQgUEhJIG5vZGUgYWx3YXlzIG1lcmdlcyB0b2dldGhlciB0aGUKKyAgLy8vIHNhbWUgdmFsdWUsIHJldHVybiB0aGUgdmFsdWUsIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgUEhJIGhhcyB1bmRlZiBvcGVyYW5kcywgYnV0IGFsbCB0aGUgcmVzdCBvZiB0aGUgb3BlcmFuZHMgYXJlCisgIC8vLyBzb21lIHVuaXF1ZSB2YWx1ZSwgcmV0dXJuIHRoYXQgdmFsdWUgaWYgaXQgY2FuIGJlIHByb3ZlZCB0aGF0IHRoZQorICAvLy8gdmFsdWUgZG9taW5hdGVzIHRoZSBQSEkuIElmIERUIGlzIG51bGwsIHVzZSBhIGNvbnNlcnZhdGl2ZSBjaGVjaywKKyAgLy8vIG90aGVyd2lzZSB1c2UgRFQgdG8gdGVzdCBmb3IgZG9taW5hbmNlLgorICAvLy8KKyAgVmFsdWUgKmhhc0NvbnN0YW50VmFsdWUoRG9taW5hdG9yVHJlZSAqRFQgPSAwKSBjb25zdDsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgUEhJTm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpQSEk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorIHByaXZhdGU6CisgIHZvaWQgcmVzaXplT3BlcmFuZHModW5zaWduZWQgTnVtT3BlcmFuZHMpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPFBISU5vZGU+IDogcHVibGljIEh1bmdvZmZPcGVyYW5kVHJhaXRzPDI+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhQSElOb2RlLCBWYWx1ZSkKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBSZXR1cm5JbnN0IC0gUmV0dXJuIGEgdmFsdWUgKHBvc3NpYmx5IHZvaWQpLCBmcm9tIGEgZnVuY3Rpb24uICBFeGVjdXRpb24KKy8vLyBkb2VzIG5vdCBjb250aW51ZSBpbiB0aGlzIGZ1bmN0aW9uIGFueSBsb25nZXIuCisvLy8KK2NsYXNzIFJldHVybkluc3QgOiBwdWJsaWMgVGVybWluYXRvckluc3QgeworICBSZXR1cm5JbnN0KGNvbnN0IFJldHVybkluc3QgJlJJKTsKKworcHJpdmF0ZToKKyAgLy8gUmV0dXJuSW5zdCBjb25zdHJ1Y3RvcnM6CisgIC8vIFJldHVybkluc3QoKSAgICAgICAgICAgICAgICAgIC0gJ3JldCB2b2lkJyBpbnN0cnVjdGlvbgorICAvLyBSZXR1cm5JbnN0KCAgICBudWxsKSAgICAgICAgICAtICdyZXQgdm9pZCcgaW5zdHJ1Y3Rpb24KKyAgLy8gUmV0dXJuSW5zdChWYWx1ZSogWCkgICAgICAgICAgLSAncmV0IFgnICAgIGluc3RydWN0aW9uCisgIC8vIFJldHVybkluc3QoICAgIG51bGwsIEluc3QgKkkpIC0gJ3JldCB2b2lkJyBpbnN0cnVjdGlvbiwgaW5zZXJ0IGJlZm9yZSBJCisgIC8vIFJldHVybkluc3QoVmFsdWUqIFgsIEluc3QgKkkpIC0gJ3JldCBYJyAgICBpbnN0cnVjdGlvbiwgaW5zZXJ0IGJlZm9yZSBJCisgIC8vIFJldHVybkluc3QoICAgIG51bGwsIEJCICpCKSAgIC0gJ3JldCB2b2lkJyBpbnN0cnVjdGlvbiwgaW5zZXJ0IEAgZW5kIG9mIEIKKyAgLy8gUmV0dXJuSW5zdChWYWx1ZSogWCwgQkIgKkIpICAgLSAncmV0IFgnICAgIGluc3RydWN0aW9uLCBpbnNlcnQgQCBlbmQgb2YgQgorICAvLworICAvLyBOT1RFOiBJZiB0aGUgVmFsdWUqIHBhc3NlZCBpcyBvZiB0eXBlIHZvaWQgdGhlbiB0aGUgY29uc3RydWN0b3IgYmVoYXZlcyBhcworICAvLyBpZiBpdCB3YXMgcGFzc2VkIE5VTEwuCisgIGV4cGxpY2l0IFJldHVybkluc3QoTExWTUNvbnRleHQgJkMsIFZhbHVlICpyZXRWYWwgPSAwLAorICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKTsKKyAgUmV0dXJuSW5zdChMTFZNQ29udGV4dCAmQywgVmFsdWUgKnJldFZhbCwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBleHBsaWNpdCBSZXR1cm5JbnN0KExMVk1Db250ZXh0ICZDLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgUmV0dXJuSW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworcHVibGljOgorICBzdGF0aWMgUmV0dXJuSW5zdCogQ3JlYXRlKExMVk1Db250ZXh0ICZDLCBWYWx1ZSAqcmV0VmFsID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIHJldHVybiBuZXcoISFyZXRWYWwpIFJldHVybkluc3QoQywgcmV0VmFsLCBJbnNlcnRCZWZvcmUpOworICB9CisgIHN0YXRpYyBSZXR1cm5JbnN0KiBDcmVhdGUoTExWTUNvbnRleHQgJkMsIFZhbHVlICpyZXRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KCEhcmV0VmFsKSBSZXR1cm5JbnN0KEMsIHJldFZhbCwgSW5zZXJ0QXRFbmQpOworICB9CisgIHN0YXRpYyBSZXR1cm5JbnN0KiBDcmVhdGUoTExWTUNvbnRleHQgJkMsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldygwKSBSZXR1cm5JbnN0KEMsIEluc2VydEF0RW5kKTsKKyAgfQorICB2aXJ0dWFsIH5SZXR1cm5JbnN0KCk7CisKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gQ29udmVuaWVuY2UgYWNjZXNzb3IKKyAgVmFsdWUgKmdldFJldHVyblZhbHVlKHVuc2lnbmVkIG4gPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIG4gPCBnZXROdW1PcGVyYW5kcygpCisgICAgICA/IGdldE9wZXJhbmQobikKKyAgICAgIDogMDsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgUmV0dXJuSW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6UmV0KTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisgcHJpdmF0ZToKKyAgdmlydHVhbCBCYXNpY0Jsb2NrICpnZXRTdWNjZXNzb3JWKHVuc2lnbmVkIGlkeCkgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29yc1YoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHNldFN1Y2Nlc3NvclYodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpCKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxSZXR1cm5JbnN0PiA6IHB1YmxpYyBWYXJpYWRpY09wZXJhbmRUcmFpdHM8PiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoUmV0dXJuSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcmFuY2hJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIEJyYW5jaEluc3QgLSBDb25kaXRpb25hbCBvciBVbmNvbmRpdGlvbmFsIEJyYW5jaCBpbnN0cnVjdGlvbi4KKy8vLworY2xhc3MgQnJhbmNoSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7CisgIC8vLyBPcHMgbGlzdCAtIEJyYW5jaGVzIGFyZSBzdHJhbmdlLiAgVGhlIG9wZXJhbmRzIGFyZSBvcmRlcmVkOgorICAvLy8gIFtDb25kLCBGYWxzZURlc3QsXSBUcnVlRGVzdC4gIFRoaXMgbWFrZXMgc29tZSBhY2Nlc3NvcnMgZmFzdGVyIGJlY2F1c2UKKyAgLy8vIHRoZXkgZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IgY29uZC91bmNvbmQgYnJhbmNobmVzcy4gVGhlc2UgYXJlIG1vc3RseQorICAvLy8gYWNjZXNzZWQgcmVsYXRpdmUgZnJvbSBvcF9lbmQoKS4KKyAgQnJhbmNoSW5zdChjb25zdCBCcmFuY2hJbnN0ICZCSSk7CisgIHZvaWQgQXNzZXJ0T0soKTsKKyAgLy8gQnJhbmNoSW5zdCBjb25zdHJ1Y3RvcnMgKHdoZXJlIHtCLCBULCBGfSBhcmUgYmxvY2tzLCBhbmQgQyBpcyBhIGNvbmRpdGlvbik6CisgIC8vIEJyYW5jaEluc3QoQkIgKkIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAnYnIgQicKKyAgLy8gQnJhbmNoSW5zdChCQiogVCwgQkIgKkYsIFZhbHVlICpDKSAgICAgICAgICAtICdiciBDLCBULCBGJworICAvLyBCcmFuY2hJbnN0KEJCKiBCLCBJbnN0ICpJKSAgICAgICAgICAgICAgICAgIC0gJ2JyIEInICAgICAgICBpbnNlcnQgYmVmb3JlIEkKKyAgLy8gQnJhbmNoSW5zdChCQiogVCwgQkIgKkYsIFZhbHVlICpDLCBJbnN0ICpJKSAtICdiciBDLCBULCBGJywgaW5zZXJ0IGJlZm9yZSBJCisgIC8vIEJyYW5jaEluc3QoQkIqIEIsIEJCICpJKSAgICAgICAgICAgICAgICAgICAgLSAnYnIgQicgICAgICAgIGluc2VydCBhdCBlbmQKKyAgLy8gQnJhbmNoSW5zdChCQiogVCwgQkIgKkYsIFZhbHVlICpDLCBCQiAqSSkgICAtICdiciBDLCBULCBGJywgaW5zZXJ0IGF0IGVuZAorICBleHBsaWNpdCBCcmFuY2hJbnN0KEJhc2ljQmxvY2sgKklmVHJ1ZSwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworICBCcmFuY2hJbnN0KEJhc2ljQmxvY2sgKklmVHJ1ZSwgQmFzaWNCbG9jayAqSWZGYWxzZSwgVmFsdWUgKkNvbmQsCisgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworICBCcmFuY2hJbnN0KEJhc2ljQmxvY2sgKklmVHJ1ZSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBCcmFuY2hJbnN0KEJhc2ljQmxvY2sgKklmVHJ1ZSwgQmFzaWNCbG9jayAqSWZGYWxzZSwgVmFsdWUgKkNvbmQsCisgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworcHJvdGVjdGVkOgorICB2aXJ0dWFsIEJyYW5jaEluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKK3B1YmxpYzoKKyAgc3RhdGljIEJyYW5jaEluc3QgKkNyZWF0ZShCYXNpY0Jsb2NrICpJZlRydWUsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwKSB7CisgICAgcmV0dXJuIG5ldygxLCB0cnVlKSBCcmFuY2hJbnN0KElmVHJ1ZSwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorICBzdGF0aWMgQnJhbmNoSW5zdCAqQ3JlYXRlKEJhc2ljQmxvY2sgKklmVHJ1ZSwgQmFzaWNCbG9jayAqSWZGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQ29uZCwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApIHsKKyAgICByZXR1cm4gbmV3KDMpIEJyYW5jaEluc3QoSWZUcnVlLCBJZkZhbHNlLCBDb25kLCBJbnNlcnRCZWZvcmUpOworICB9CisgIHN0YXRpYyBCcmFuY2hJbnN0ICpDcmVhdGUoQmFzaWNCbG9jayAqSWZUcnVlLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoMSwgdHJ1ZSkgQnJhbmNoSW5zdChJZlRydWUsIEluc2VydEF0RW5kKTsKKyAgfQorICBzdGF0aWMgQnJhbmNoSW5zdCAqQ3JlYXRlKEJhc2ljQmxvY2sgKklmVHJ1ZSwgQmFzaWNCbG9jayAqSWZGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQ29uZCwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KDMpIEJyYW5jaEluc3QoSWZUcnVlLCBJZkZhbHNlLCBDb25kLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICB+QnJhbmNoSW5zdCgpOworCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICBib29sIGlzVW5jb25kaXRpb25hbCgpIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgPT0gMTsgfQorICBib29sIGlzQ29uZGl0aW9uYWwoKSAgIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgPT0gMzsgfQorCisgIFZhbHVlICpnZXRDb25kaXRpb24oKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29uZGl0aW9uYWwoKSAmJiAiQ2Fubm90IGdldCBjb25kaXRpb24gb2YgYW4gdW5jb25kIGJyYW5jaCEiKTsKKyAgICByZXR1cm4gT3A8LTM+KCk7CisgIH0KKworICB2b2lkIHNldENvbmRpdGlvbihWYWx1ZSAqVikgeworICAgIGFzc2VydChpc0NvbmRpdGlvbmFsKCkgJiYgIkNhbm5vdCBzZXQgY29uZGl0aW9uIG9mIHVuY29uZGl0aW9uYWwgYnJhbmNoISIpOworICAgIE9wPC0zPigpID0gVjsKKyAgfQorCisgIC8vIHNldFVuY29uZGl0aW9uYWxEZXN0IC0gQ2hhbmdlIHRoZSBjdXJyZW50IGJyYW5jaCB0byBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaAorICAvLyB0YXJnZXRpbmcgdGhlIHNwZWNpZmllZCBibG9jay4KKyAgLy8gRklYTUU6IEVsaW1pbmF0ZSB0aGlzIHVnbHkgbWV0aG9kLgorICB2b2lkIHNldFVuY29uZGl0aW9uYWxEZXN0KEJhc2ljQmxvY2sgKkRlc3QpIHsKKyAgICBPcDwtMT4oKSA9IChWYWx1ZSopRGVzdDsKKyAgICBpZiAoaXNDb25kaXRpb25hbCgpKSB7ICAvLyBDb252ZXJ0IHRoaXMgdG8gYW4gdW5jb25kIGJyYW5jaC4KKyAgICAgIE9wPC0yPigpID0gMDsKKyAgICAgIE9wPC0zPigpID0gMDsKKyAgICAgIE51bU9wZXJhbmRzID0gMTsKKyAgICAgIE9wZXJhbmRMaXN0ID0gb3BfYmVnaW4oKTsKKyAgICB9CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gMStpc0NvbmRpdGlvbmFsKCk7IH0KKworICBCYXNpY0Jsb2NrICpnZXRTdWNjZXNzb3IodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgZ2V0TnVtU3VjY2Vzc29ycygpICYmICJTdWNjZXNzb3IgIyBvdXQgb2YgcmFuZ2UgZm9yIEJyYW5jaCEiKTsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPEJhc2ljQmxvY2s+KCgmT3A8LTE+KCkgLSBpKS0+Z2V0KCkpOworICB9CisKKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpOZXdTdWNjKSB7CisgICAgYXNzZXJ0KGlkeCA8IGdldE51bVN1Y2Nlc3NvcnMoKSAmJiAiU3VjY2Vzc29yICMgb3V0IG9mIHJhbmdlIGZvciBCcmFuY2ghIik7CisgICAgKigmT3A8LTE+KCkgLSBpZHgpID0gKFZhbHVlKilOZXdTdWNjOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgQnJhbmNoSW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QnIpOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK3ByaXZhdGU6CisgIHZpcnR1YWwgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yVih1bnNpZ25lZCBpZHgpIGNvbnN0OworICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnNWKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBzZXRTdWNjZXNzb3JWKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqQik7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8QnJhbmNoSW5zdD4gOiBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPDE+IHt9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQnJhbmNoSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIFN3aXRjaEluc3QgLSBNdWx0aXdheSBzd2l0Y2gKKy8vLworY2xhc3MgU3dpdGNoSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdW5zaWduZWQgUmVzZXJ2ZWRTcGFjZTsKKyAgLy8gT3BlcmFuZFswXSAgICA9IFZhbHVlIHRvIHN3aXRjaCBvbgorICAvLyBPcGVyYW5kWzFdICAgID0gRGVmYXVsdCBiYXNpYyBibG9jayBkZXN0aW5hdGlvbgorICAvLyBPcGVyYW5kWzJuICBdID0gVmFsdWUgdG8gbWF0Y2gKKyAgLy8gT3BlcmFuZFsybisxXSA9IEJhc2ljQmxvY2sgdG8gZ28gdG8gb24gbWF0Y2gKKyAgU3dpdGNoSW5zdChjb25zdCBTd2l0Y2hJbnN0ICZTSSk7CisgIHZvaWQgaW5pdChWYWx1ZSAqVmFsdWUsIEJhc2ljQmxvY2sgKkRlZmF1bHQsIHVuc2lnbmVkIE51bUNhc2VzKTsKKyAgdm9pZCByZXNpemVPcGVyYW5kcyh1bnNpZ25lZCBObyk7CisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHplcm8gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAwKTsKKyAgfQorICAvLy8gU3dpdGNoSW5zdCBjdG9yIC0gQ3JlYXRlIGEgbmV3IHN3aXRjaCBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhIHZhbHVlIHRvCisgIC8vLyBzd2l0Y2ggb24gYW5kIGEgZGVmYXVsdCBkZXN0aW5hdGlvbi4gIFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBjYXNlcyBjYW4KKyAgLy8vIGJlIHNwZWNpZmllZCBoZXJlIHRvIG1ha2UgbWVtb3J5IGFsbG9jYXRpb24gbW9yZSBlZmZpY2llbnQuICBUaGlzCisgIC8vLyBjb25zdHJ1Y3RvciBjYW4gYWxzbyBhdXRvaW5zZXJ0IGJlZm9yZSBhbm90aGVyIGluc3RydWN0aW9uLgorICBTd2l0Y2hJbnN0KFZhbHVlICpWYWx1ZSwgQmFzaWNCbG9jayAqRGVmYXVsdCwgdW5zaWduZWQgTnVtQ2FzZXMsCisgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisKKyAgLy8vIFN3aXRjaEluc3QgY3RvciAtIENyZWF0ZSBhIG5ldyBzd2l0Y2ggaW5zdHJ1Y3Rpb24sIHNwZWNpZnlpbmcgYSB2YWx1ZSB0bworICAvLy8gc3dpdGNoIG9uIGFuZCBhIGRlZmF1bHQgZGVzdGluYXRpb24uICBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY2FzZXMgY2FuCisgIC8vLyBiZSBzcGVjaWZpZWQgaGVyZSB0byBtYWtlIG1lbW9yeSBhbGxvY2F0aW9uIG1vcmUgZWZmaWNpZW50LiAgVGhpcworICAvLy8gY29uc3RydWN0b3IgYWxzbyBhdXRvaW5zZXJ0cyBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgQmFzaWNCbG9jay4KKyAgU3dpdGNoSW5zdChWYWx1ZSAqVmFsdWUsIEJhc2ljQmxvY2sgKkRlZmF1bHQsIHVuc2lnbmVkIE51bUNhc2VzLAorICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBTd2l0Y2hJbnN0ICpjbG9uZV9pbXBsKCkgY29uc3Q7CitwdWJsaWM6CisgIHN0YXRpYyBTd2l0Y2hJbnN0ICpDcmVhdGUoVmFsdWUgKlZhbHVlLCBCYXNpY0Jsb2NrICpEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNhc2VzLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCkgeworICAgIHJldHVybiBuZXcgU3dpdGNoSW5zdChWYWx1ZSwgRGVmYXVsdCwgTnVtQ2FzZXMsIEluc2VydEJlZm9yZSk7CisgIH0KKyAgc3RhdGljIFN3aXRjaEluc3QgKkNyZWF0ZShWYWx1ZSAqVmFsdWUsIEJhc2ljQmxvY2sgKkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2FzZXMsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldyBTd2l0Y2hJbnN0KFZhbHVlLCBEZWZhdWx0LCBOdW1DYXNlcywgSW5zZXJ0QXRFbmQpOworICB9CisgIH5Td2l0Y2hJbnN0KCk7CisKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLyBBY2Nlc3NvciBNZXRob2RzIGZvciBTd2l0Y2ggc3RtdAorICBWYWx1ZSAqZ2V0Q29uZGl0aW9uKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICB2b2lkIHNldENvbmRpdGlvbihWYWx1ZSAqVikgeyBzZXRPcGVyYW5kKDAsIFYpOyB9CisKKyAgQmFzaWNCbG9jayAqZ2V0RGVmYXVsdERlc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oZ2V0T3BlcmFuZCgxKSk7CisgIH0KKworICAvLy8gZ2V0TnVtQ2FzZXMgLSByZXR1cm4gdGhlIG51bWJlciBvZiAnY2FzZXMnIGluIHRoaXMgc3dpdGNoIGluc3RydWN0aW9uLgorICAvLy8gTm90ZSB0aGF0IGNhc2UgIzAgaXMgYWx3YXlzIHRoZSBkZWZhdWx0IGNhc2UuCisgIHVuc2lnbmVkIGdldE51bUNhc2VzKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1PcGVyYW5kcygpLzI7CisgIH0KKworICAvLy8gZ2V0Q2FzZVZhbHVlIC0gUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2FzZSB2YWx1ZS4gIE5vdGUgdGhhdCBjYXNlICMwLCB0aGUKKyAgLy8vIGRlZmF1bHQgZGVzdGluYXRpb24sIGRvZXMgbm90IGhhdmUgYSBjYXNlIHZhbHVlLgorICBDb25zdGFudEludCAqZ2V0Q2FzZVZhbHVlKHVuc2lnbmVkIGkpIHsKKyAgICBhc3NlcnQoaSAmJiBpIDwgZ2V0TnVtQ2FzZXMoKSAmJiAiSWxsZWdhbCBjYXNlIHZhbHVlIHRvIGdldCEiKTsKKyAgICByZXR1cm4gZ2V0U3VjY2Vzc29yVmFsdWUoaSk7CisgIH0KKworICAvLy8gZ2V0Q2FzZVZhbHVlIC0gUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2FzZSB2YWx1ZS4gIE5vdGUgdGhhdCBjYXNlICMwLCB0aGUKKyAgLy8vIGRlZmF1bHQgZGVzdGluYXRpb24sIGRvZXMgbm90IGhhdmUgYSBjYXNlIHZhbHVlLgorICBjb25zdCBDb25zdGFudEludCAqZ2V0Q2FzZVZhbHVlKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSAmJiBpIDwgZ2V0TnVtQ2FzZXMoKSAmJiAiSWxsZWdhbCBjYXNlIHZhbHVlIHRvIGdldCEiKTsKKyAgICByZXR1cm4gZ2V0U3VjY2Vzc29yVmFsdWUoaSk7CisgIH0KKworICAvLy8gZmluZENhc2VWYWx1ZSAtIFNlYXJjaCBhbGwgb2YgdGhlIGNhc2UgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN0YW50LgorICAvLy8gSWYgaXQgaXMgZXhwbGljaXRseSBoYW5kbGVkLCByZXR1cm4gdGhlIGNhc2UgbnVtYmVyIG9mIGl0LCBvdGhlcndpc2UKKyAgLy8vIHJldHVybiAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgaGFuZGxlZCBieSB0aGUgZGVmYXVsdCBoYW5kbGVyLgorICB1bnNpZ25lZCBmaW5kQ2FzZVZhbHVlKGNvbnN0IENvbnN0YW50SW50ICpDKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IGdldE51bUNhc2VzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKGdldENhc2VWYWx1ZShpKSA9PSBDKQorICAgICAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBmaW5kQ2FzZURlc3QgLSBGaW5kcyB0aGUgdW5pcXVlIGNhc2UgdmFsdWUgZm9yIGEgZ2l2ZW4gc3VjY2Vzc29yLiBSZXR1cm5zCisgIC8vLyBudWxsIGlmIHRoZSBzdWNjZXNzb3IgaXMgbm90IGZvdW5kLCBub3QgdW5pcXVlLCBvciBpcyB0aGUgZGVmYXVsdCBjYXNlLgorICBDb25zdGFudEludCAqZmluZENhc2VEZXN0KEJhc2ljQmxvY2sgKkJCKSB7CisgICAgaWYgKEJCID09IGdldERlZmF1bHREZXN0KCkpIHJldHVybiBOVUxMOworCisgICAgQ29uc3RhbnRJbnQgKkNJID0gTlVMTDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gZ2V0TnVtQ2FzZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChnZXRTdWNjZXNzb3IoaSkgPT0gQkIpIHsKKyAgICAgICAgaWYgKENJKSByZXR1cm4gTlVMTDsgICAvLyBNdWx0aXBsZSBjYXNlcyBsZWFkIHRvIEJCLgorICAgICAgICBlbHNlIENJID0gZ2V0Q2FzZVZhbHVlKGkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ0k7CisgIH0KKworICAvLy8gYWRkQ2FzZSAtIEFkZCBhbiBlbnRyeSB0byB0aGUgc3dpdGNoIGluc3RydWN0aW9uLi4uCisgIC8vLworICB2b2lkIGFkZENhc2UoQ29uc3RhbnRJbnQgKk9uVmFsLCBCYXNpY0Jsb2NrICpEZXN0KTsKKworICAvLy8gcmVtb3ZlQ2FzZSAtIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBzdWNjZXNzb3IgZnJvbSB0aGUgc3dpdGNoCisgIC8vLyBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgZGVmYXVsdAorICAvLy8gZGVzdGluYXRpb24gKHN1Y2Nlc3NvciAjMCkuCisgIC8vLworICB2b2lkIHJlbW92ZUNhc2UodW5zaWduZWQgaWR4KTsKKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKS8yOyB9CisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaWR4IDwgZ2V0TnVtU3VjY2Vzc29ycygpICYmIlN1Y2Nlc3NvciBpZHggb3V0IG9mIHJhbmdlIGZvciBzd2l0Y2ghIik7CisgICAgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oZ2V0T3BlcmFuZChpZHgqMisxKSk7CisgIH0KKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpOZXdTdWNjKSB7CisgICAgYXNzZXJ0KGlkeCA8IGdldE51bVN1Y2Nlc3NvcnMoKSAmJiAiU3VjY2Vzc29yICMgb3V0IG9mIHJhbmdlIGZvciBzd2l0Y2ghIik7CisgICAgc2V0T3BlcmFuZChpZHgqMisxLCAoVmFsdWUqKU5ld1N1Y2MpOworICB9CisKKyAgLy8gZ2V0U3VjY2Vzc29yVmFsdWUgLSBSZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vIHN1Y2Nlc3Nvci4KKyAgQ29uc3RhbnRJbnQgKmdldFN1Y2Nlc3NvclZhbHVlKHVuc2lnbmVkIGlkeCkgY29uc3QgeworICAgIGFzc2VydChpZHggPCBnZXROdW1TdWNjZXNzb3JzKCkgJiYgIlN1Y2Nlc3NvciAjIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDb25zdGFudEludCo+KGdldE9wZXJhbmQoaWR4KjIpKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFN3aXRjaEluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U3dpdGNoOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK3ByaXZhdGU6CisgIHZpcnR1YWwgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yVih1bnNpZ25lZCBpZHgpIGNvbnN0OworICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnNWKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBzZXRTdWNjZXNzb3JWKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqQik7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8U3dpdGNoSW5zdD4gOiBwdWJsaWMgSHVuZ29mZk9wZXJhbmRUcmFpdHM8Mj4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFN3aXRjaEluc3QsIFZhbHVlKQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaXJlY3RCckluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gSW5kaXJlY3RCckluc3QgLSBJbmRpcmVjdCBCcmFuY2ggSW5zdHJ1Y3Rpb24uCisvLy8KK2NsYXNzIEluZGlyZWN0QnJJbnN0IDogcHVibGljIFRlcm1pbmF0b3JJbnN0IHsKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdW5zaWduZWQpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorICB1bnNpZ25lZCBSZXNlcnZlZFNwYWNlOworICAvLyBPcGVyYW5kWzBdICAgID0gVmFsdWUgdG8gc3dpdGNoIG9uCisgIC8vIE9wZXJhbmRbMV0gICAgPSBEZWZhdWx0IGJhc2ljIGJsb2NrIGRlc3RpbmF0aW9uCisgIC8vIE9wZXJhbmRbMm4gIF0gPSBWYWx1ZSB0byBtYXRjaAorICAvLyBPcGVyYW5kWzJuKzFdID0gQmFzaWNCbG9jayB0byBnbyB0byBvbiBtYXRjaAorICBJbmRpcmVjdEJySW5zdChjb25zdCBJbmRpcmVjdEJySW5zdCAmSUJJKTsKKyAgdm9pZCBpbml0KFZhbHVlICpBZGRyZXNzLCB1bnNpZ25lZCBOdW1EZXN0cyk7CisgIHZvaWQgcmVzaXplT3BlcmFuZHModW5zaWduZWQgTm8pOworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB6ZXJvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMCk7CisgIH0KKyAgLy8vIEluZGlyZWN0QnJJbnN0IGN0b3IgLSBDcmVhdGUgYSBuZXcgaW5kaXJlY3RiciBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhbgorICAvLy8gQWRkcmVzcyB0byBqdW1wIHRvLiAgVGhlIG51bWJlciBvZiBleHBlY3RlZCBkZXN0aW5hdGlvbnMgY2FuIGJlIHNwZWNpZmllZAorICAvLy8gaGVyZSB0byBtYWtlIG1lbW9yeSBhbGxvY2F0aW9uIG1vcmUgZWZmaWNpZW50LiAgVGhpcyBjb25zdHJ1Y3RvciBjYW4gYWxzbworICAvLy8gYXV0b2luc2VydCBiZWZvcmUgYW5vdGhlciBpbnN0cnVjdGlvbi4KKyAgSW5kaXJlY3RCckluc3QoVmFsdWUgKkFkZHJlc3MsIHVuc2lnbmVkIE51bURlc3RzLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgCisgIC8vLyBJbmRpcmVjdEJySW5zdCBjdG9yIC0gQ3JlYXRlIGEgbmV3IGluZGlyZWN0YnIgaW5zdHJ1Y3Rpb24sIHNwZWNpZnlpbmcgYW4KKyAgLy8vIEFkZHJlc3MgdG8ganVtcCB0by4gIFRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZGVzdGluYXRpb25zIGNhbiBiZSBzcGVjaWZpZWQKKyAgLy8vIGhlcmUgdG8gbWFrZSBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmljaWVudC4gIFRoaXMgY29uc3RydWN0b3IgYWxzbworICAvLy8gYXV0b2luc2VydHMgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIEJhc2ljQmxvY2suCisgIEluZGlyZWN0QnJJbnN0KFZhbHVlICpBZGRyZXNzLCB1bnNpZ25lZCBOdW1EZXN0cywgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworcHJvdGVjdGVkOgorICB2aXJ0dWFsIEluZGlyZWN0QnJJbnN0ICpjbG9uZV9pbXBsKCkgY29uc3Q7CitwdWJsaWM6CisgIHN0YXRpYyBJbmRpcmVjdEJySW5zdCAqQ3JlYXRlKFZhbHVlICpBZGRyZXNzLCB1bnNpZ25lZCBOdW1EZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApIHsKKyAgICByZXR1cm4gbmV3IEluZGlyZWN0QnJJbnN0KEFkZHJlc3MsIE51bURlc3RzLCBJbnNlcnRCZWZvcmUpOworICB9CisgIHN0YXRpYyBJbmRpcmVjdEJySW5zdCAqQ3JlYXRlKFZhbHVlICpBZGRyZXNzLCB1bnNpZ25lZCBOdW1EZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3IEluZGlyZWN0QnJJbnN0KEFkZHJlc3MsIE51bURlc3RzLCBJbnNlcnRBdEVuZCk7CisgIH0KKyAgfkluZGlyZWN0QnJJbnN0KCk7CisgIAorICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKyAgCisgIC8vIEFjY2Vzc29yIE1ldGhvZHMgZm9yIEluZGlyZWN0QnJJbnN0IGluc3RydWN0aW9uLgorICBWYWx1ZSAqZ2V0QWRkcmVzcygpIHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgY29uc3QgVmFsdWUgKmdldEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIHZvaWQgc2V0QWRkcmVzcyhWYWx1ZSAqVikgeyBzZXRPcGVyYW5kKDAsIFYpOyB9CisgIAorICAKKyAgLy8vIGdldE51bURlc3RpbmF0aW9ucyAtIHJldHVybiB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIGRlc3RpbmF0aW9ucyBpbiB0aGlzCisgIC8vLyBpbmRpcmVjdGJyIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBnZXROdW1EZXN0aW5hdGlvbnMoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpLTE7IH0KKyAgCisgIC8vLyBnZXREZXN0aW5hdGlvbiAtIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uLgorICBCYXNpY0Jsb2NrICpnZXREZXN0aW5hdGlvbih1bnNpZ25lZCBpKSB7IHJldHVybiBnZXRTdWNjZXNzb3IoaSk7IH0KKyAgY29uc3QgQmFzaWNCbG9jayAqZ2V0RGVzdGluYXRpb24odW5zaWduZWQgaSkgY29uc3QgeyByZXR1cm4gZ2V0U3VjY2Vzc29yKGkpOyB9CisgIAorICAvLy8gYWRkRGVzdGluYXRpb24gLSBBZGQgYSBkZXN0aW5hdGlvbi4KKyAgLy8vCisgIHZvaWQgYWRkRGVzdGluYXRpb24oQmFzaWNCbG9jayAqRGVzdCk7CisgIAorICAvLy8gcmVtb3ZlRGVzdGluYXRpb24gLSBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yIGZyb20gdGhlCisgIC8vLyBpbmRpcmVjdGJyIGluc3RydWN0aW9uLgorICB2b2lkIHJlbW92ZURlc3RpbmF0aW9uKHVuc2lnbmVkIGkpOworICAKKyAgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRzKCktMTsgfQorICBCYXNpY0Jsb2NrICpnZXRTdWNjZXNzb3IodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEJhc2ljQmxvY2s+KGdldE9wZXJhbmQoaSsxKSk7CisgIH0KKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgaSwgQmFzaWNCbG9jayAqTmV3U3VjYykgeworICAgIHNldE9wZXJhbmQoaSsxLCAoVmFsdWUqKU5ld1N1Y2MpOworICB9CisgIAorICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbmRpcmVjdEJySW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJbmRpcmVjdEJyOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK3ByaXZhdGU6CisgIHZpcnR1YWwgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yVih1bnNpZ25lZCBpZHgpIGNvbnN0OworICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnNWKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBzZXRTdWNjZXNzb3JWKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqQik7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8SW5kaXJlY3RCckluc3Q+IDogcHVibGljIEh1bmdvZmZPcGVyYW5kVHJhaXRzPDE+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhJbmRpcmVjdEJySW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmVhY2hhYmxlSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBVbnJlYWNoYWJsZUluc3QgLSBUaGlzIGZ1bmN0aW9uIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IuICBJbiBwYXJ0aWN1bGFyLCB0aGUKKy8vLyBwcmVzZW5jZSBvZiB0aGlzIGluc3RydWN0aW9uIGluZGljYXRlcyBzb21lIGhpZ2hlciBsZXZlbCBrbm93bGVkZ2UgdGhhdCB0aGUKKy8vLyBlbmQgb2YgdGhlIGJsb2NrIGNhbm5vdCBiZSByZWFjaGVkLgorLy8vCitjbGFzcyBVbnJlYWNoYWJsZUluc3QgOiBwdWJsaWMgVGVybWluYXRvckluc3QgeworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCB1bnNpZ25lZCk7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgVW5yZWFjaGFibGVJbnN0ICpjbG9uZV9pbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgemVybyBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDApOworICB9CisgIGV4cGxpY2l0IFVucmVhY2hhYmxlSW5zdChMTFZNQ29udGV4dCAmQywgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDApOworICBleHBsaWNpdCBVbnJlYWNoYWJsZUluc3QoTExWTUNvbnRleHQgJkMsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFVucmVhY2hhYmxlSW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpVbnJlYWNoYWJsZTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Citwcml2YXRlOgorICB2aXJ0dWFsIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3NvclYodW5zaWduZWQgaWR4KSBjb25zdDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzVigpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgc2V0U3VjY2Vzc29yVih1bnNpZ25lZCBpZHgsIEJhc2ljQmxvY2sgKkIpOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1bmNJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQGJyaWVmIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHRydW5jYXRpb24gb2YgaW50ZWdlciB0eXBlcy4KK2NsYXNzIFRydW5jSW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vLyBAYnJpZWYgQ2xvbmUgYW4gaWRlbnRpY2FsIFRydW5jSW5zdAorICB2aXJ0dWFsIFRydW5jSW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBUcnVuY0luc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgdHJ1bmNhdGVkCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgICAgICAgLy8vPCBUaGUgKHNtYWxsZXIpIHR5cGUgdG8gdHJ1bmNhdGUgdG8KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIFRydW5jSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSB0cnVuY2F0ZWQKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgICAgICAvLy88IFRoZSAoc21hbGxlcikgdHlwZSB0byB0cnVuY2F0ZSB0bworICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVHJ1bmNJbnN0ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gVHJ1bmM7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkV4dEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBAYnJpZWYgVGhpcyBjbGFzcyByZXByZXNlbnRzIHplcm8gZXh0ZW5zaW9uIG9mIGludGVnZXIgdHlwZXMuCitjbGFzcyBaRXh0SW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vLyBAYnJpZWYgQ2xvbmUgYW4gaWRlbnRpY2FsIFpFeHRJbnN0CisgIHZpcnR1YWwgWkV4dEluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgWkV4dEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgemVybyBleHRlbmRlZAorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gemVybyBleHRlbmQgdG8KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQgc2VtYW50aWNzLgorICBaRXh0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSB6ZXJvIGV4dGVuZGVkCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB6ZXJvIGV4dGVuZCB0bworICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgWkV4dEluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBaRXh0OworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFeHRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQGJyaWVmIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNpZ24gZXh0ZW5zaW9uIG9mIGludGVnZXIgdHlwZXMuCitjbGFzcyBTRXh0SW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vLyBAYnJpZWYgQ2xvbmUgYW4gaWRlbnRpY2FsIFNFeHRJbnN0CisgIHZpcnR1YWwgU0V4dEluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgU0V4dEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgc2lnbiBleHRlbmRlZAorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gc2lnbiBleHRlbmQgdG8KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIFNFeHRJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIHNpZ24gZXh0ZW5kZWQKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHNpZ24gZXh0ZW5kIHRvCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTRXh0SW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IFNFeHQ7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBUcnVuY0luc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBAYnJpZWYgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdHJ1bmNhdGlvbiBvZiBmbG9hdGluZyBwb2ludCB0eXBlcy4KK2NsYXNzIEZQVHJ1bmNJbnN0IDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8vIEBicmllZiBDbG9uZSBhbiBpZGVudGljYWwgRlBUcnVuY0luc3QKKyAgdmlydHVhbCBGUFRydW5jSW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBGUFRydW5jSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSB0cnVuY2F0ZWQKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHRydW5jYXRlIHRvCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDAgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBGUFRydW5jSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSB0cnVuY2F0ZWQKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHRydW5jYXRlIHRvCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBGUFRydW5jSW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEZQVHJ1bmM7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBFeHRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQGJyaWVmIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gb2YgZmxvYXRpbmcgcG9pbnQgdHlwZXMuCitjbGFzcyBGUEV4dEluc3QgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLy8gQGJyaWVmIENsb25lIGFuIGlkZW50aWNhbCBGUEV4dEluc3QKKyAgdmlydHVhbCBGUEV4dEluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgRlBFeHRJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGV4dGVuZGVkCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBleHRlbmQgdG8KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIEZQRXh0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBleHRlbmRlZAorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gZXh0ZW5kIHRvCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBGUEV4dEluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBGUEV4dDsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSVRvRlBJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQGJyaWVmIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNhc3QgdW5zaWduZWQgaW50ZWdlciB0byBmbG9hdGluZyBwb2ludC4KK2NsYXNzIFVJVG9GUEluc3QgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLy8gQGJyaWVmIENsb25lIGFuIGlkZW50aWNhbCBVSVRvRlBJbnN0CisgIHZpcnR1YWwgVUlUb0ZQSW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBVSVRvRlBJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgVUlUb0ZQSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgICAgICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFVJVG9GUEluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBVSVRvRlA7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lUb0ZQSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEBicmllZiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjYXN0IGZyb20gc2lnbmVkIGludGVnZXIgdG8gZmxvYXRpbmcgcG9pbnQuCitjbGFzcyBTSVRvRlBJbnN0IDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8vIEBicmllZiBDbG9uZSBhbiBpZGVudGljYWwgU0lUb0ZQSW5zdAorICB2aXJ0dWFsIFNJVG9GUEluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgU0lUb0ZQSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIFNJVG9GUEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTSVRvRlBJbnN0ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gU0lUb0ZQOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQVG9VSUluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBAYnJpZWYgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY2FzdCBmcm9tIGZsb2F0aW5nIHBvaW50IHRvIHVuc2lnbmVkIGludGVnZXIKK2NsYXNzIEZQVG9VSUluc3QgIDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8vIEBicmllZiBDbG9uZSBhbiBpZGVudGljYWwgRlBUb1VJSW5zdAorICB2aXJ0dWFsIEZQVG9VSUluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgRlBUb1VJSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIEZQVG9VSUluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgRlBUb1VJSW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEZQVG9VSTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFRvU0lJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQGJyaWVmIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNhc3QgZnJvbSBmbG9hdGluZyBwb2ludCB0byBzaWduZWQgaW50ZWdlci4KK2NsYXNzIEZQVG9TSUluc3QgIDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8vIEBicmllZiBDbG9uZSBhbiBpZGVudGljYWwgRlBUb1NJSW5zdAorICB2aXJ0dWFsIEZQVG9TSUluc3QgKmNsb25lX2ltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgRlBUb1NJSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gMCAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIEZQVG9TSUluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBGUFRvU0lJbnN0ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gRlBUb1NJOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFRvUHRySW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEBicmllZiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjYXN0IGZyb20gYW4gaW50ZWdlciB0byBhIHBvaW50ZXIuCitjbGFzcyBJbnRUb1B0ckluc3QgOiBwdWJsaWMgQ2FzdEluc3QgeworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgSW50VG9QdHJJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgSW50VG9QdHJJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIGNvbnN0IFR5cGUgKlR5LCAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgQ2xvbmUgYW4gaWRlbnRpY2FsIEludFRvUHRySW5zdAorICB2aXJ0dWFsIEludFRvUHRySW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEludFRvUHRySW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEludFRvUHRyOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clRvSW50SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEBicmllZiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjYXN0IGZyb20gYSBwb2ludGVyIHRvIGFuIGludGVnZXIKK2NsYXNzIFB0clRvSW50SW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vLyBAYnJpZWYgQ2xvbmUgYW4gaWRlbnRpY2FsIFB0clRvSW50SW5zdAorICB2aXJ0dWFsIFB0clRvSW50SW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBQdHJUb0ludEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IDAgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICBQdHJUb0ludEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgUHRyVG9JbnRJbnN0ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gUHRyVG9JbnQ7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRDYXN0SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEBicmllZiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBuby1vcCBjYXN0IGZyb20gb25lIHR5cGUgdG8gYW5vdGhlci4KK2NsYXNzIEJpdENhc3RJbnN0IDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8vIEBicmllZiBDbG9uZSBhbiBpZGVudGljYWwgQml0Q2FzdEluc3QKKyAgdmlydHVhbCBCaXRDYXN0SW5zdCAqY2xvbmVfaW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBCaXRDYXN0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQKKyAgICBjb25zdCBUeXBlICpUeSwgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNhc3RlZCB0bworICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSAwIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgQml0Q2FzdEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkCisgICAgY29uc3QgVHlwZSAqVHksICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjYXN0ZWQgdG8KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgICAgICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBCaXRDYXN0SW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEJpdENhc3Q7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljSW5zdC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY0luc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmU2YjFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY0luc3QuaApAQCAtMCwwICsxLDIzNiBAQAorLy89PT0tLSBsbHZtL0ludHJpbnNpY0luc3QuaCAtIEludHJpbnNpYyBJbnN0cnVjdGlvbiBXcmFwcGVycyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjbGFzc2VzIHRoYXQgbWFrZSBpdCByZWFsbHkgZWFzeSB0byBkZWFsIHdpdGggaW50cmluc2ljCisvLyBmdW5jdGlvbnMgd2l0aCB0aGUgaXNhL2R5bmNhc3QgZmFtaWx5IG9mIGZ1bmN0aW9ucy4gIEluIHBhcnRpY3VsYXIsIHRoaXMKKy8vIGFsbG93cyB5b3UgdG8gZG8gdGhpbmdzIGxpa2U6CisvLworLy8gICAgIGlmIChNZW1DcHlJbnN0ICpNQ0kgPSBkeW5fY2FzdDxNZW1DcHlJbnN0PihJbnN0KSkKKy8vICAgICAgICAuLi4gTUNJLT5nZXREZXN0KCkgLi4uIE1DSS0+Z2V0U291cmNlKCkgLi4uCisvLworLy8gQWxsIGludHJpbnNpYyBmdW5jdGlvbiBjYWxscyBhcmUgaW5zdGFuY2VzIG9mIHRoZSBjYWxsIGluc3RydWN0aW9uLCBzbyB0aGVzZQorLy8gYXJlIGFsbCBzdWJjbGFzc2VzIG9mIHRoZSBDYWxsSW5zdCBjbGFzcy4gIE5vdGUgdGhhdCBub25lIG9mIHRoZXNlIGNsYXNzZXMKKy8vIGhhcyBzdGF0ZSBvciB2aXJ0dWFsIG1ldGhvZHMsIHdoaWNoIGlzIGFuIGltcG9ydGFudCBwYXJ0IG9mIHRoaXMgZ3Jvc3MvbmVhdAorLy8gaGFjayB3b3JraW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTlRSSU5TSUNJTlNUX0gKKyNkZWZpbmUgTExWTV9JTlRSSU5TSUNJTlNUX0gKKworI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgLy8vIEludHJpbnNpY0luc3QgLSBBIHVzZWZ1bCB3cmFwcGVyIGNsYXNzIGZvciBpbnNwZWN0aW5nIGNhbGxzIHRvIGludHJpbnNpYworICAvLy8gZnVuY3Rpb25zLiAgVGhpcyBhbGxvd3MgdGhlIHN0YW5kYXJkIGlzYS9keW5jYXN0L2Nhc3QgZnVuY3Rpb25hbGl0eSB0bworICAvLy8gd29yayB3aXRoIGNhbGxzIHRvIGludHJpbnNpYyBmdW5jdGlvbnMuCisgIGNsYXNzIEludHJpbnNpY0luc3QgOiBwdWJsaWMgQ2FsbEluc3QgeworICAgIEludHJpbnNpY0luc3QoKTsgICAgICAgICAgICAgICAgICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICAgIEludHJpbnNpY0luc3QoY29uc3QgSW50cmluc2ljSW5zdCYpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEludHJpbnNpY0luc3QmKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICBwdWJsaWM6CisgICAgLy8vIGdldEludHJpbnNpY0lEIC0gUmV0dXJuIHRoZSBpbnRyaW5zaWMgSUQgb2YgdGhpcyBpbnRyaW5zaWMuCisgICAgLy8vCisgICAgSW50cmluc2ljOjpJRCBnZXRJbnRyaW5zaWNJRCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoSW50cmluc2ljOjpJRClnZXRDYWxsZWRGdW5jdGlvbigpLT5nZXRJbnRyaW5zaWNJRCgpOworICAgIH0KKworICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgQ2FsbEluc3QgKkkpIHsKKyAgICAgIGlmIChjb25zdCBGdW5jdGlvbiAqQ0YgPSBJLT5nZXRDYWxsZWRGdW5jdGlvbigpKQorICAgICAgICByZXR1cm4gQ0YtPmdldEludHJpbnNpY0lEKCkgIT0gMDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8Q2FsbEluc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxDYWxsSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gTWVtSW50cmluc2ljIC0gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIG1lbXNldC9tZW1jcHkvbWVtbW92ZS4KKyAgLy8vCisgIGNsYXNzIE1lbUludHJpbnNpYyA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKKyAgcHVibGljOgorICAgIFZhbHVlICpnZXRSYXdEZXN0KCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KGdldEFyZ09wZXJhbmQoMCkpOyB9CisKKyAgICBWYWx1ZSAqZ2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KGdldEFyZ09wZXJhbmQoMikpOyB9CisgICAgQ29uc3RhbnRJbnQgKmdldEFsaWdubWVudENzdCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50Pihjb25zdF9jYXN0PFZhbHVlKj4oZ2V0QXJnT3BlcmFuZCgzKSkpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRBbGlnbm1lbnRDc3QoKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgfQorCisgICAgQ29uc3RhbnRJbnQgKmdldFZvbGF0aWxlQ3N0KCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KGNvbnN0X2Nhc3Q8VmFsdWUqPihnZXRBcmdPcGVyYW5kKDQpKSk7CisgICAgfQorICAgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhZ2V0Vm9sYXRpbGVDc3QoKS0+aXNaZXJvKCk7CisgICAgfQorCisgICAgLy8vIGdldERlc3QgLSBUaGlzIGlzIGp1c3QgbGlrZSBnZXRSYXdEZXN0LCBidXQgaXQgc3RyaXBzIG9mZiBhbnkgY2FzdAorICAgIC8vLyBpbnN0cnVjdGlvbnMgdGhhdCBmZWVkIGl0LCBnaXZpbmcgdGhlIG9yaWdpbmFsIGlucHV0LiAgVGhlIHJldHVybmVkCisgICAgLy8vIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBwb2ludGVyLgorICAgIFZhbHVlICpnZXREZXN0KCkgY29uc3QgeyByZXR1cm4gZ2V0UmF3RGVzdCgpLT5zdHJpcFBvaW50ZXJDYXN0cygpOyB9CisKKyAgICAvLy8gc2V0KiAtIFNldCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgLy8vCisgICAgdm9pZCBzZXREZXN0KFZhbHVlICpQdHIpIHsKKyAgICAgIGFzc2VydChnZXRSYXdEZXN0KCktPmdldFR5cGUoKSA9PSBQdHItPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgICJzZXREZXN0IGNhbGxlZCB3aXRoIHBvaW50ZXIgb2Ygd3JvbmcgdHlwZSEiKTsKKyAgICAgIHNldEFyZ09wZXJhbmQoMCwgUHRyKTsKKyAgICB9CisKKyAgICB2b2lkIHNldExlbmd0aChWYWx1ZSAqTCkgeworICAgICAgYXNzZXJ0KGdldExlbmd0aCgpLT5nZXRUeXBlKCkgPT0gTC0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAgInNldExlbmd0aCBjYWxsZWQgd2l0aCB2YWx1ZSBvZiB3cm9uZyB0eXBlISIpOworICAgICAgc2V0QXJnT3BlcmFuZCgyLCBMKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEFsaWdubWVudChDb25zdGFudCogQSkgeworICAgICAgc2V0QXJnT3BlcmFuZCgzLCBBKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFZvbGF0aWxlKENvbnN0YW50KiBWKSB7CisgICAgICBzZXRBcmdPcGVyYW5kKDQsIFYpOworICAgIH0KKworICAgIGNvbnN0IFR5cGUgKmdldEFsaWdubWVudFR5cGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0QXJnT3BlcmFuZCgzKS0+Z2V0VHlwZSgpOworICAgIH0KKworICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWVtSW50cmluc2ljICopIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICBzd2l0Y2ggKEktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHk6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtbW92ZToKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1zZXQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gTWVtU2V0SW5zdCAtIFRoaXMgY2xhc3Mgd3JhcHMgdGhlIGxsdm0ubWVtc2V0IGludHJpbnNpYy4KKyAgLy8vCisgIGNsYXNzIE1lbVNldEluc3QgOiBwdWJsaWMgTWVtSW50cmluc2ljIHsKKyAgcHVibGljOgorICAgIC8vLyBnZXQqIC0gUmV0dXJuIHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLgorICAgIC8vLworICAgIFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPihnZXRBcmdPcGVyYW5kKDEpKTsgfQorCisgICAgdm9pZCBzZXRWYWx1ZShWYWx1ZSAqVmFsKSB7CisgICAgICBhc3NlcnQoZ2V0VmFsdWUoKS0+Z2V0VHlwZSgpID09IFZhbC0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAgInNldFZhbHVlIGNhbGxlZCB3aXRoIHZhbHVlIG9mIHdyb25nIHR5cGUhIik7CisgICAgICBzZXRBcmdPcGVyYW5kKDEsIFZhbCk7CisgICAgfQorCisgICAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNZW1TZXRJbnN0ICopIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Om1lbXNldDsKKyAgICB9CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIE1lbVRyYW5zZmVySW5zdCAtIFRoaXMgY2xhc3Mgd3JhcHMgdGhlIGxsdm0ubWVtY3B5L21lbW1vdmUgaW50cmluc2ljcy4KKyAgLy8vCisgIGNsYXNzIE1lbVRyYW5zZmVySW5zdCA6IHB1YmxpYyBNZW1JbnRyaW5zaWMgeworICBwdWJsaWM6CisgICAgLy8vIGdldCogLSBSZXR1cm4gdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgLy8vCisgICAgVmFsdWUgKmdldFJhd1NvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPihnZXRBcmdPcGVyYW5kKDEpKTsgfQorCisgICAgLy8vIGdldFNvdXJjZSAtIFRoaXMgaXMganVzdCBsaWtlIGdldFJhd1NvdXJjZSwgYnV0IGl0IHN0cmlwcyBvZmYgYW55IGNhc3QKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgZmVlZCBpdCwgZ2l2aW5nIHRoZSBvcmlnaW5hbCBpbnB1dC4gIFRoZSByZXR1cm5lZAorICAgIC8vLyB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIGEgcG9pbnRlci4KKyAgICBWYWx1ZSAqZ2V0U291cmNlKCkgY29uc3QgeyByZXR1cm4gZ2V0UmF3U291cmNlKCktPnN0cmlwUG9pbnRlckNhc3RzKCk7IH0KKworICAgIHZvaWQgc2V0U291cmNlKFZhbHVlICpQdHIpIHsKKyAgICAgIGFzc2VydChnZXRSYXdTb3VyY2UoKS0+Z2V0VHlwZSgpID09IFB0ci0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAgInNldFNvdXJjZSBjYWxsZWQgd2l0aCBwb2ludGVyIG9mIHdyb25nIHR5cGUhIik7CisgICAgICBzZXRBcmdPcGVyYW5kKDEsIFB0cik7CisgICAgfQorCisgICAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNZW1UcmFuc2Zlckluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bWVtY3B5IHx8CisgICAgICAgICAgICAgSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Om1lbW1vdmU7CisgICAgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisKKyAgLy8vIE1lbUNweUluc3QgLSBUaGlzIGNsYXNzIHdyYXBzIHRoZSBsbHZtLm1lbWNweSBpbnRyaW5zaWMuCisgIC8vLworICBjbGFzcyBNZW1DcHlJbnN0IDogcHVibGljIE1lbVRyYW5zZmVySW5zdCB7CisgIHB1YmxpYzoKKyAgICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1lbUNweUluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bWVtY3B5OworICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gTWVtTW92ZUluc3QgLSBUaGlzIGNsYXNzIHdyYXBzIHRoZSBsbHZtLm1lbW1vdmUgaW50cmluc2ljLgorICAvLy8KKyAgY2xhc3MgTWVtTW92ZUluc3QgOiBwdWJsaWMgTWVtVHJhbnNmZXJJbnN0IHsKKyAgcHVibGljOgorICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWVtTW92ZUluc3QgKikgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bWVtbW92ZTsKKyAgICB9CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIE1lbW9yeVVzZUludHJpbnNpYyAtIFRoaXMgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciB0aGUgbWVtb3J5IHVzZQorICAvLy8gbWFya2VyIGludHJpbnNpY3MuCisgIC8vLworICBjbGFzcyBNZW1vcnlVc2VJbnRyaW5zaWMgOiBwdWJsaWMgSW50cmluc2ljSW5zdCB7CisgIHB1YmxpYzoKKworICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWVtb3J5VXNlSW50cmluc2ljICopIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICBzd2l0Y2ggKEktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGNhc2UgSW50cmluc2ljOjpsaWZldGltZV9zdGFydDoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpsaWZldGltZV9lbmQ6CisgICAgICBjYXNlIEludHJpbnNpYzo6aW52YXJpYW50X3N0YXJ0OgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmludmFyaWFudF9lbmQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9JbnRyaW5zaWNzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZmU1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljcy5oCkBAIC0wLDAgKzEsODAgQEAKKy8vPT09LS0gbGx2bS9JbnN0cmluc2ljcy5oIC0gTExWTSBJbnRyaW5zaWMgRnVuY3Rpb24gSGFuZGxpbmcgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBzZXQgb2YgZW51bXMgd2hpY2ggYWxsb3cgcHJvY2Vzc2luZyBvZiBpbnRyaW5zaWMKKy8vIGZ1bmN0aW9ucy4gIFZhbHVlcyBvZiB0aGVzZSBlbnVtIHR5cGVzIGFyZSByZXR1cm5lZCBieQorLy8gRnVuY3Rpb246OmdldEludHJpbnNpY0lELgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTlRSSU5TSUNTX0gKKyNkZWZpbmUgTExWTV9JTlRSSU5TSUNTX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUeXBlOworY2xhc3MgRnVuY3Rpb25UeXBlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIEF0dHJMaXN0UHRyOworCisvLy8gSW50cmluc2ljIE5hbWVzcGFjZSAtIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIGFuIGVudW0gd2l0aCBhIHZhbHVlIGZvcgorLy8vIGV2ZXJ5IGludHJpbnNpYy9idWlsdGluIGZ1bmN0aW9uIGtub3duIGJ5IExMVk0uICBUaGVzZSBlbnVtIHZhbHVlcyBhcmUKKy8vLyByZXR1cm5lZCBieSBGdW5jdGlvbjo6Z2V0SW50cmluc2ljSUQoKS4KKy8vLworbmFtZXNwYWNlIEludHJpbnNpYyB7CisgIGVudW0gSUQgeworICAgIG5vdF9pbnRyaW5zaWMgPSAwLCAgIC8vIE11c3QgYmUgemVybworCisgICAgLy8gR2V0IHRoZSBpbnRyaW5zaWMgZW51bXMgZ2VuZXJhdGVkIGZyb20gSW50cmluc2ljcy50ZAorI2RlZmluZSBHRVRfSU5UUklOU0lDX0VOVU1fVkFMVUVTCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmdlbiIgICAgCisjdW5kZWYgR0VUX0lOVFJJTlNJQ19FTlVNX1ZBTFVFUworICAgICwgbnVtX2ludHJpbnNpY3MKKyAgfTsKKyAgCisgIC8vLyBJbnRyaW5zaWM6OmdldE5hbWUoSUQpIC0gUmV0dXJuIHRoZSBMTFZNIG5hbWUgZm9yIGFuIGludHJpbnNpYywgc3VjaCBhcworICAvLy8gImxsdm0ucHBjLmFsdGl2ZWMubHZ4Ii4KKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZShJRCBpZCwgY29uc3QgVHlwZSAqKlR5cyA9IDAsIHVuc2lnbmVkIG51bVR5cyA9IDApOworICAKKyAgLy8vIEludHJpbnNpYzo6Z2V0VHlwZShJRCkgLSBSZXR1cm4gdGhlIGZ1bmN0aW9uIHR5cGUgZm9yIGFuIGludHJpbnNpYy4KKyAgLy8vCisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0VHlwZShMTFZNQ29udGV4dCAmQ29udGV4dCwgSUQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICoqVHlzID0gMCwgdW5zaWduZWQgbnVtVHlzID0gMCk7CisKKyAgLy8vIEludHJpbnNpYzo6aXNPdmVybG9hZGVkKElEKSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW50cmluc2ljIGNhbiBiZQorICAvLy8gb3ZlcmxvYWRlZC4KKyAgYm9vbCBpc092ZXJsb2FkZWQoSUQgaWQpOworCisgIC8vLyBJbnRyaW5zaWM6OmdldEF0dHJpYnV0ZXMoSUQpIC0gUmV0dXJuIHRoZSBhdHRyaWJ1dGVzIGZvciBhbiBpbnRyaW5zaWMuCisgIC8vLworICBBdHRyTGlzdFB0ciBnZXRBdHRyaWJ1dGVzKElEIGlkKTsKKworICAvLy8gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihNLCBJRCkgLSBDcmVhdGUgb3IgaW5zZXJ0IGFuIExMVk0gRnVuY3Rpb24KKyAgLy8vIGRlY2xhcmF0aW9uIGZvciBhbiBpbnRyaW5zaWMsIGFuZCByZXR1cm4gaXQuCisgIC8vLworICAvLy8gVGhlIFR5cyBhbmQgbnVtVHlzIHBhcmFtZXRlcnMgYXJlIGZvciBpbnRyaW5zaWNzIHdpdGggb3ZlcmxvYWRlZCB0eXBlcworICAvLy8gKGUuZy4sIHRob3NlIHVzaW5nIGlBbnksIGZBbnksIHZBbnksIG9yIGlQVFJBbnkpLiBGb3IgYSBkZWNsYXJhdGlvbiBmb3IgYW4KKyAgLy8vIG92ZXJsb2FkZWQgaW50cmluc2ljLCBUeXMgc2hvdWxkIHBvaW50IHRvIGFuIGFycmF5IG9mIG51bVR5cyBwb2ludGVycyB0bworICAvLy8gVHlwZSwgYW5kIG11c3QgcHJvdmlkZSBleGFjdGx5IG9uZSB0eXBlIGZvciBlYWNoIG92ZXJsb2FkZWQgdHlwZSBpbiB0aGUKKyAgLy8vIGludHJpbnNpYy4KKyAgRnVuY3Rpb24gKmdldERlY2xhcmF0aW9uKE1vZHVsZSAqTSwgSUQgaWQsIGNvbnN0IFR5cGUgKipUeXMgPSAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bVR5cyA9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8vLyBNYXAgYSBHQ0MgYnVpbHRpbiBuYW1lIHRvIGFuIGludHJpbnNpYyBJRC4KKyAgSUQgZ2V0SW50cmluc2ljRm9yR0NDQnVpbHRpbihjb25zdCBjaGFyICpQcmVmaXgsIGNvbnN0IGNoYXIgKkJ1aWx0aW5OYW1lKTsKKyAgCit9IC8vIEVuZCBJbnRyaW5zaWMgbmFtZXNwYWNlCisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3MudGQgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljcy50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTQ2MWFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3MudGQKQEAgLTAsMCArMSw0MzEgQEAKKy8vPT09LSBJbnRyaW5zaWNzLnRkIC0gRGVmaW5lcyBhbGwgTExWTSBpbnRyaW5zaWNzIC0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vDQorLy8NCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGRlZmluZXMgcHJvcGVydGllcyBvZiBhbGwgTExWTSBpbnRyaW5zaWNzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBQcm9wZXJ0aWVzIHdlIGtlZXAgdHJhY2sgb2YgZm9yIGludHJpbnNpY3MuDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitjbGFzcyBJbnRyaW5zaWNQcm9wZXJ0eTsNCisNCisvLyBJbnRyKk1lbSAtIE1lbW9yeSBwcm9wZXJ0aWVzLiAgQW4gaW50cmluc2ljIGlzIGFsbG93ZWQgdG8gaGF2ZSBhdCBtb3N0IG9uZSBvZg0KKy8vIHRoZXNlIHByb3BlcnRpZXMgc2V0LiAgVGhleSBhcmUgbGlzdGVkIGZyb20gdGhlIG1vc3QgYWdncmVzc2l2ZSAoYmVzdCB0byB1c2UNCisvLyBpZiBjb3JyZWN0KSB0byB0aGUgbGVhc3QgYWdncmVzc2l2ZS4gIElmIG5vIHByb3BlcnR5IGlzIHNldCwgdGhlIHdvcnN0IGNhc2UNCisvLyBpcyBhc3N1bWVkIChpdCBtYXkgcmVhZCBhbmQgd3JpdGUgYW55IG1lbW9yeSBpdCBjYW4gZ2V0IGFjY2VzcyB0byBhbmQgaXQgbWF5DQorLy8gaGF2ZSBvdGhlciBzaWRlIGVmZmVjdHMpLg0KKw0KKy8vIEludHJOb01lbSAtIFRoZSBpbnRyaW5zaWMgZG9lcyBub3QgYWNjZXNzIG1lbW9yeSBvciBoYXZlIGFueSBvdGhlciBzaWRlDQorLy8gZWZmZWN0cy4gIEl0IG1heSBiZSBDU0UnZCBkZWxldGVkIGlmIGRlYWQsIGV0Yy4NCitkZWYgSW50ck5vTWVtIDogSW50cmluc2ljUHJvcGVydHk7DQorDQorLy8gSW50clJlYWRBcmdNZW0gLSBUaGlzIGludHJpbnNpYyByZWFkcyBvbmx5IGZyb20gbWVtb3J5IHRoYXQgb25lIG9mIGl0cw0KKy8vIGFyZ3VtZW50cyBwb2ludHMgdG8sIGJ1dCBtYXkgcmVhZCBhbiB1bnNwZWNpZmllZCBhbW91bnQuDQorZGVmIEludHJSZWFkQXJnTWVtIDogSW50cmluc2ljUHJvcGVydHk7DQorDQorLy8gSW50clJlYWRNZW0gLSBUaGlzIGludHJpbnNpYyByZWFkcyBmcm9tIHVuc3BlY2lmaWVkIG1lbW9yeSwgc28gaXQgY2Fubm90IGJlDQorLy8gbW92ZWQgYWNyb3NzIHN0b3Jlcy4gIEhvd2V2ZXIsIGl0IGNhbiBiZSByZW9yZGVyZWQgb3RoZXJ3aXNlIGFuZCBjYW4gYmUNCisvLyBkZWxldGVkIGlmIGRlYWQuDQorZGVmIEludHJSZWFkTWVtIDogSW50cmluc2ljUHJvcGVydHk7DQorDQorLy8gSW50clJlYWRXcml0ZUFyZ01lbSAtIFRoaXMgaW50cmluc2ljIHJlYWRzIGFuZCB3cml0ZXMgb25seSBmcm9tIG1lbW9yeSB0aGF0DQorLy8gb25lIG9mIGl0cyBhcmd1bWVudHMgcG9pbnRzIHRvLCBidXQgbWF5IGFjY2VzcyBhbiB1bnNwZWNpZmllZCBhbW91bnQuICBUaGUNCisvLyByZWFkcyBhbmQgd3JpdGVzIG1heSBiZSB2b2xhdGlsZSwgYnV0IGV4Y2VwdCBmb3IgdGhpcyBpdCBoYXMgbm8gb3RoZXIgc2lkZQ0KKy8vIGVmZmVjdHMuDQorZGVmIEludHJSZWFkV3JpdGVBcmdNZW0gOiBJbnRyaW5zaWNQcm9wZXJ0eTsNCisNCisvLyBDb21tdXRhdGl2ZSAtIFRoaXMgaW50cmluc2ljIGlzIGNvbW11dGF0aXZlOiBYIG9wIFkgPT0gWSBvcCBYLg0KK2RlZiBDb21tdXRhdGl2ZSA6IEludHJpbnNpY1Byb3BlcnR5Ow0KKw0KKy8vIE5vQ2FwdHVyZSAtIFRoZSBzcGVjaWZpZWQgYXJndW1lbnQgcG9pbnRlciBpcyBub3QgY2FwdHVyZWQgYnkgdGhlIGludHJpbnNpYy4NCitjbGFzcyBOb0NhcHR1cmU8aW50IGFyZ05vPiA6IEludHJpbnNpY1Byb3BlcnR5IHsNCisgIGludCBBcmdObyA9IGFyZ05vOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFR5cGVzIHVzZWQgYnkgaW50cmluc2ljcy4NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2NsYXNzIExMVk1UeXBlPFZhbHVlVHlwZSB2dD4gew0KKyAgVmFsdWVUeXBlIFZUID0gdnQ7DQorfQ0KKw0KK2NsYXNzIExMVk1Qb2ludGVyVHlwZTxMTFZNVHlwZSBlbHR5Pg0KKyAgOiBMTFZNVHlwZTxpUFRSPnsNCisgIExMVk1UeXBlIEVsVHkgPSBlbHR5Ow0KK30NCisNCitjbGFzcyBMTFZNQW55UG9pbnRlclR5cGU8TExWTVR5cGUgZWx0eT4NCisgIDogTExWTVR5cGU8aVBUUkFueT57DQorICBMTFZNVHlwZSBFbFR5ID0gZWx0eTsNCit9DQorDQorLy8gTWF0Y2ggdGhlIHR5cGUgb2YgYW5vdGhlciBpbnRyaW5zaWMgcGFyYW1ldGVyLiAgTnVtYmVyIGlzIGFuIGluZGV4IGludG8gdGhlDQorLy8gbGlzdCBvZiBvdmVybG9hZGVkIHR5cGVzIGZvciB0aGUgaW50cmluc2ljLCBleGNsdWRpbmcgYWxsIHRoZSBmaXhlZCB0eXBlcy4NCisvLyBUaGUgTnVtYmVyIHZhbHVlIG11c3QgcmVmZXIgdG8gYSBwcmV2aW91c2x5IGxpc3RlZCB0eXBlLiAgRm9yIGV4YW1wbGU6DQorLy8gICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2FueWZsb2F0X3R5LCBMTFZNTWF0Y2hUeXBlPDA+XT4NCisvLyBoYXMgdHdvIG92ZXJsb2FkZWQgdHlwZXMsIHRoZSAybmQgYW5kIDNyZCBhcmd1bWVudHMuICBMTFZNTWF0Y2hUeXBlPDA+DQorLy8gcmVmZXJzIHRvIHRoZSBmaXJzdCBvdmVybG9hZGVkIHR5cGUsIHdoaWNoIGlzIHRoZSAybmQgYXJndW1lbnQuDQorY2xhc3MgTExWTU1hdGNoVHlwZTxpbnQgbnVtPg0KKyAgOiBMTFZNVHlwZTxPdGhlclZUPnsNCisgIGludCBOdW1iZXIgPSBudW07DQorfQ0KKw0KKy8vIE1hdGNoIHRoZSB0eXBlIG9mIGFub3RoZXIgaW50cmluc2ljIHBhcmFtZXRlciB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlDQorLy8gYW4gaW50ZWdyYWwgdmVjdG9yIHR5cGUsIGJ1dCBjaGFuZ2UgdGhlIGVsZW1lbnQgc2l6ZSB0byBiZSB0d2ljZSBhcyB3aWRlDQorLy8gb3IgaGFsZiBhcyB3aWRlIGFzIHRoZSBvdGhlciB0eXBlLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCB3aGVuIHRoZSBpbnRyaW5zaWMNCisvLyBpcyBvdmVybG9hZGVkLCBzbyB0aGUgbWF0Y2hlZCB0eXBlIHNob3VsZCBiZSBkZWNsYXJlZCBhcyBpQW55Lg0KK2NsYXNzIExMVk1FeHRlbmRlZEVsZW1lbnRWZWN0b3JUeXBlPGludCBudW0+IDogTExWTU1hdGNoVHlwZTxudW0+Ow0KK2NsYXNzIExMVk1UcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZTxpbnQgbnVtPiA6IExMVk1NYXRjaFR5cGU8bnVtPjsNCisNCitkZWYgbGx2bV92b2lkX3R5ICAgICAgIDogTExWTVR5cGU8aXNWb2lkPjsNCitkZWYgbGx2bV9hbnlpbnRfdHkgICAgIDogTExWTVR5cGU8aUFueT47DQorZGVmIGxsdm1fYW55ZmxvYXRfdHkgICA6IExMVk1UeXBlPGZBbnk+Ow0KK2RlZiBsbHZtX2FueXZlY3Rvcl90eSAgOiBMTFZNVHlwZTx2QW55PjsNCitkZWYgbGx2bV9pMV90eSAgICAgICAgIDogTExWTVR5cGU8aTE+Ow0KK2RlZiBsbHZtX2k4X3R5ICAgICAgICAgOiBMTFZNVHlwZTxpOD47DQorZGVmIGxsdm1faTE2X3R5ICAgICAgICA6IExMVk1UeXBlPGkxNj47DQorZGVmIGxsdm1faTMyX3R5ICAgICAgICA6IExMVk1UeXBlPGkzMj47DQorZGVmIGxsdm1faTY0X3R5ICAgICAgICA6IExMVk1UeXBlPGk2ND47DQorZGVmIGxsdm1fZmxvYXRfdHkgICAgICA6IExMVk1UeXBlPGYzMj47DQorZGVmIGxsdm1fZG91YmxlX3R5ICAgICA6IExMVk1UeXBlPGY2ND47DQorZGVmIGxsdm1fZjgwX3R5ICAgICAgICA6IExMVk1UeXBlPGY4MD47DQorZGVmIGxsdm1fZjEyOF90eSAgICAgICA6IExMVk1UeXBlPGYxMjg+Ow0KK2RlZiBsbHZtX3BwY2YxMjhfdHkgICAgOiBMTFZNVHlwZTxwcGNmMTI4PjsNCitkZWYgbGx2bV9wdHJfdHkgICAgICAgIDogTExWTVBvaW50ZXJUeXBlPGxsdm1faThfdHk+OyAgICAgICAgICAgICAvLyBpOCoNCitkZWYgbGx2bV9wdHJwdHJfdHkgICAgIDogTExWTVBvaW50ZXJUeXBlPGxsdm1fcHRyX3R5PjsgICAgICAgICAgICAvLyBpOCoqDQorZGVmIGxsdm1fYW55cHRyX3R5ICAgICA6IExMVk1BbnlQb2ludGVyVHlwZTxsbHZtX2k4X3R5PjsgICAgICAgICAgLy8gKHNwYWNlKWk4Kg0KK2RlZiBsbHZtX2VtcHR5X3R5ICAgICAgOiBMTFZNVHlwZTxPdGhlclZUPjsgICAgICAgICAgICAgICAgICAgICAgIC8vIHsgfQ0KK2RlZiBsbHZtX2Rlc2NyaXB0b3JfdHkgOiBMTFZNUG9pbnRlclR5cGU8bGx2bV9lbXB0eV90eT47ICAgICAgICAgIC8vIHsgfSoNCitkZWYgbGx2bV9tZXRhZGF0YV90eSAgIDogTExWTVR5cGU8TWV0YWRhdGFWVD47ICAgICAgICAgICAgICAgICAgICAvLyAhey4uLn0NCisNCitkZWYgbGx2bV92Mmk4X3R5ICAgICAgIDogTExWTVR5cGU8djJpOD47ICAgICAvLyAgMiB4IGk4DQorZGVmIGxsdm1fdjRpOF90eSAgICAgICA6IExMVk1UeXBlPHY0aTg+OyAgICAgLy8gIDQgeCBpOA0KK2RlZiBsbHZtX3Y4aThfdHkgICAgICAgOiBMTFZNVHlwZTx2OGk4PjsgICAgIC8vICA4IHggaTgNCitkZWYgbGx2bV92MTZpOF90eSAgICAgIDogTExWTVR5cGU8djE2aTg+OyAgICAvLyAxNiB4IGk4DQorZGVmIGxsdm1fdjMyaThfdHkgICAgICA6IExMVk1UeXBlPHYzMmk4PjsgICAgLy8gMzIgeCBpOA0KK2RlZiBsbHZtX3YyaTE2X3R5ICAgICAgOiBMTFZNVHlwZTx2MmkxNj47ICAgIC8vICA0IHggaTE2DQorZGVmIGxsdm1fdjRpMTZfdHkgICAgICA6IExMVk1UeXBlPHY0aTE2PjsgICAgLy8gIDQgeCBpMTYNCitkZWYgbGx2bV92OGkxNl90eSAgICAgIDogTExWTVR5cGU8djhpMTY+OyAgICAvLyAgOCB4IGkxNg0KK2RlZiBsbHZtX3YxNmkxNl90eSAgICAgOiBMTFZNVHlwZTx2MTZpMTY+OyAgIC8vIDE2IHggaTE2DQorZGVmIGxsdm1fdjJpMzJfdHkgICAgICA6IExMVk1UeXBlPHYyaTMyPjsgICAgLy8gIDIgeCBpMzINCitkZWYgbGx2bV92NGkzMl90eSAgICAgIDogTExWTVR5cGU8djRpMzI+OyAgICAvLyAgNCB4IGkzMg0KK2RlZiBsbHZtX3Y4aTMyX3R5ICAgICAgOiBMTFZNVHlwZTx2OGkzMj47ICAgIC8vICA4IHggaTMyDQorZGVmIGxsdm1fdjFpNjRfdHkgICAgICA6IExMVk1UeXBlPHYxaTY0PjsgICAgLy8gIDEgeCBpNjQNCitkZWYgbGx2bV92Mmk2NF90eSAgICAgIDogTExWTVR5cGU8djJpNjQ+OyAgICAvLyAgMiB4IGk2NA0KK2RlZiBsbHZtX3Y0aTY0X3R5ICAgICAgOiBMTFZNVHlwZTx2NGk2ND47ICAgIC8vICA0IHggaTY0DQorDQorZGVmIGxsdm1fdjJmMzJfdHkgICAgICA6IExMVk1UeXBlPHYyZjMyPjsgICAgLy8gIDIgeCBmbG9hdA0KK2RlZiBsbHZtX3Y0ZjMyX3R5ICAgICAgOiBMTFZNVHlwZTx2NGYzMj47ICAgIC8vICA0IHggZmxvYXQNCitkZWYgbGx2bV92OGYzMl90eSAgICAgIDogTExWTVR5cGU8djhmMzI+OyAgICAvLyAgOCB4IGZsb2F0DQorZGVmIGxsdm1fdjJmNjRfdHkgICAgICA6IExMVk1UeXBlPHYyZjY0PjsgICAgLy8gIDIgeCBkb3VibGUNCitkZWYgbGx2bV92NGY2NF90eSAgICAgIDogTExWTVR5cGU8djRmNjQ+OyAgICAvLyAgNCB4IGRvdWJsZQ0KKw0KK2RlZiBsbHZtX3ZhcmFyZ190eSAgICAgOiBMTFZNVHlwZTxpc1ZvaWQ+OyAgIC8vIHRoaXMgbWVhbnMgdmFyYXJnIGhlcmUNCisNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEludHJpbnNpYyBEZWZpbml0aW9ucy4NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIEludHJpbnNpYyBjbGFzcyAtIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgb25lIExMVk0gaW50cmluc2ljLiAgVGhlIG5hbWUgb2YgdGhlDQorLy8gaW50cmluc2ljIGRlZmluaXRpb24gc2hvdWxkIHN0YXJ0IHdpdGggImludF8iLCB0aGVuIG1hdGNoIHRoZSBMTFZNIGludHJpbnNpYw0KKy8vIG5hbWUgd2l0aCB0aGUgImxsdm0uIiBwcmVmaXggcmVtb3ZlZCwgYW5kIGFsbCAiLiJzIHR1cm5lZCBpbnRvICJfInMuICBGb3INCisvLyBleGFtcGxlLCBsbHZtLmJzd2FwLmkxNiAtPiBpbnRfYnN3YXBfaTE2Lg0KKy8vDQorLy8gICogUmV0VHlwZXMgaXMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJldHVybiB0eXBlcyBleHBlY3RlZCBmb3IgdGhlDQorLy8gICAgaW50cmluc2ljLg0KKy8vICAqIFBhcmFtVHlwZXMgaXMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlciB0eXBlcyBleHBlY3RlZCBmb3IgdGhlDQorLy8gICAgaW50cmluc2ljLg0KKy8vICAqIFByb3BlcnRpZXMgY2FuIGJlIHNldCB0byBkZXNjcmliZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGludHJpbnNpYy4NCisvLw0KK2NsYXNzIEludHJpbnNpYzxsaXN0PExMVk1UeXBlPiByZXRfdHlwZXMsDQorICAgICAgICAgICAgICAgIGxpc3Q8TExWTVR5cGU+IHBhcmFtX3R5cGVzID0gW10sDQorICAgICAgICAgICAgICAgIGxpc3Q8SW50cmluc2ljUHJvcGVydHk+IHByb3BlcnRpZXMgPSBbXSwNCisgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSAiIj4gew0KKyAgc3RyaW5nIExMVk1OYW1lID0gbmFtZTsNCisgIHN0cmluZyBUYXJnZXRQcmVmaXggPSAiIjsgICAvLyBTZXQgdG8gYSBwcmVmaXggZm9yIHRhcmdldC1zcGVjaWZpYyBpbnRyaW5zaWNzLg0KKyAgbGlzdDxMTFZNVHlwZT4gUmV0VHlwZXMgPSByZXRfdHlwZXM7DQorICBsaXN0PExMVk1UeXBlPiBQYXJhbVR5cGVzID0gcGFyYW1fdHlwZXM7DQorICBsaXN0PEludHJpbnNpY1Byb3BlcnR5PiBQcm9wZXJ0aWVzID0gcHJvcGVydGllczsNCisNCisgIGJpdCBpc1RhcmdldCA9IDA7DQorfQ0KKw0KKy8vLyBHQ0NCdWlsdGluIC0gSWYgdGhpcyBpbnRyaW5zaWMgZXhhY3RseSBjb3JyZXNwb25kcyB0byBhIEdDQyBidWlsdGluLCB0aGlzDQorLy8vIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgYnVpbHRpbi4gIFRoaXMgcHJvdmlkZXMgYXV0b21hdGljIENCRSBhbmQgQ0ZFDQorLy8vIHN1cHBvcnQuDQorY2xhc3MgR0NDQnVpbHRpbjxzdHJpbmcgbmFtZT4gew0KKyAgc3RyaW5nIEdDQ0J1aWx0aW5OYW1lID0gbmFtZTsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29kZSBHZW5lcmF0b3IgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KK2RlZiBpbnRfcmV0dXJuYWRkcmVzcyA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47DQorZGVmIGludF9mcmFtZWFkZHJlc3MgIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisvLyBOb3RlOiB3ZSB0cmVhdCBzdGFja3NhdmUvc3RhY2tyZXN0b3JlIGFzIHdyaXRlbWVtIGJlY2F1c2Ugd2UgZG9uJ3Qgb3RoZXJ3aXNlDQorLy8gbW9kZWwgdGhlaXIgZGVwZW5kZW5jaWVzIG9uIGFsbG9jYXMuDQorZGVmIGludF9zdGFja3NhdmUgICAgIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zdGFja19zYXZlIj47DQorZGVmIGludF9zdGFja3Jlc3RvcmUgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldPiwNCisgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc3RhY2tfcmVzdG9yZSI+Ow0KKw0KKy8vIEludHJSZWFkV3JpdGVBcmdNZW0gaXMgbW9yZSBwZXNzaW1pc3RpYyB0aGFuIHN0cmljdGx5IG5lY2Vzc2FyeSBmb3IgcHJlZmV0Y2gsDQorLy8gaG93ZXZlciBpdCBkb2VzIGNvbnZlbmllbnRseSBwcmV2ZW50IHRoZSBwcmVmZXRjaCBmcm9tIGJlaW5nIHJlb3JkZXJlZA0KKy8vIHdpdGggcmVzcGVjdCB0byBuZWFyYnkgYWNjZXNzZXMgdG8gdGhlIHNhbWUgbWVtb3J5Lg0KK2RlZiBpbnRfcHJlZmV0Y2ggICAgICA6IEludHJpbnNpYzxbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbSwgTm9DYXB0dXJlPDA+XT47DQorZGVmIGludF9wY21hcmtlciAgICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsNCisNCitkZWYgaW50X3JlYWRjeWNsZWNvdW50ZXIgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XT47DQorDQorLy8gU3RhY2sgUHJvdGVjdG9yIEludHJpbnNpYyAtIFRoZSBzdGFja3Byb3RlY3RvciBpbnRyaW5zaWMgd3JpdGVzIHRoZSBzdGFjaw0KKy8vIGd1YXJkIHRvIHRoZSBjb3JyZWN0IHBsYWNlIG9uIHRoZSBzdGFjayBmcmFtZS4NCitkZWYgaW50X3N0YWNrcHJvdGVjdG9yIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fcHRycHRyX3R5XSwgW10+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLSBTdGFuZGFyZCBDIExpYnJhcnkgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisNCitkZWYgaW50X21lbWNweSAgOiBJbnRyaW5zaWM8W10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55cHRyX3R5LCBsbHZtX2FueWludF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMV90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZFdyaXRlQXJnTWVtLCBOb0NhcHR1cmU8MD4sIE5vQ2FwdHVyZTwxPl0+Ow0KK2RlZiBpbnRfbWVtbW92ZSA6IEludHJpbnNpYzxbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2FueXB0cl90eSwgbGx2bV9hbnlpbnRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMV90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZFdyaXRlQXJnTWVtLCBOb0NhcHR1cmU8MD4sIE5vQ2FwdHVyZTwxPl0+Ow0KK2RlZiBpbnRfbWVtc2V0ICA6IEludHJpbnNpYzxbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2FueWludF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkV3JpdGVBcmdNZW0sIE5vQ2FwdHVyZTwwPl0+Ow0KKw0KKy8vIFRoZXNlIGZ1bmN0aW9ucyBkbyBub3QgYWN0dWFsbHkgcmVhZCBtZW1vcnksIGJ1dCB0aGV5IGFyZSBzZW5zaXRpdmUgdG8gdGhlDQorLy8gcm91bmRpbmcgbW9kZS4gIFRoaXMgbmVlZHMgdG8gYmUgbW9kZWxsZWQgc2VwYXJhdGVseTsgaW4gdGhlIG1lYW50aW1lDQorLy8gZGVjbGFyaW5nIHRoZW0gYXMgcmVhZGluZyBtZW1vcnkgaXMgY29uc2VydmF0aXZlbHkgY29ycmVjdC4NCitsZXQgUHJvcGVydGllcyA9IFtJbnRyUmVhZE1lbV0gaW4gew0KKyAgZGVmIGludF9zcXJ0IDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsNCisgIGRlZiBpbnRfcG93aSA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kzMl90eV0+Ow0KKyAgZGVmIGludF9zaW4gIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsNCisgIGRlZiBpbnRfY29zICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47DQorICBkZWYgaW50X3BvdyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XT47DQorICBkZWYgaW50X2xvZyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+Ow0KKyAgZGVmIGludF9sb2cxMDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsNCisgIGRlZiBpbnRfbG9nMiA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47DQorICBkZWYgaW50X2V4cCAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+Ow0KKyAgZGVmIGludF9leHAyIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsNCit9DQorDQorLy8gTk9URTogdGhlc2UgYXJlIGludGVybmFsIGludGVyZmFjZXMuDQorZGVmIGludF9zZXRqbXAgICAgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sICBbbGx2bV9wdHJfdHldPjsNCitkZWYgaW50X2xvbmdqbXAgICAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldPjsNCitkZWYgaW50X3NpZ3NldGptcCAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSAsIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldPjsNCitkZWYgaW50X3NpZ2xvbmdqbXAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldPjsNCisNCisvLyBJbnRlcm5hbCBpbnRlcmZhY2UgZm9yIG9iamVjdCBzaXplIGNoZWNraW5nDQorZGVmIGludF9vYmplY3RzaXplIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pMV90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZEFyZ01lbV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fb2JqZWN0X3NpemUiPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJpdCBNYW5pcHVsYXRpb24gSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorDQorLy8gTm9uZSBvZiB0aGVzZSBpbnRyaW5zaWNzIGFjY2Vzc2VzIG1lbW9yeSBhdCBhbGwuDQorbGV0IFByb3BlcnRpZXMgPSBbSW50ck5vTWVtXSBpbiB7DQorICBkZWYgaW50X2Jzd2FwOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsNCisgIGRlZiBpbnRfY3Rwb3A6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+Ow0KKyAgZGVmIGludF9jdGx6IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47DQorICBkZWYgaW50X2N0dHogOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tIEdlbmVyaWMgVmFyaWFibGUgQXR0cmlidXRlIEludHJpbnNpY3MtLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KK2RlZiBpbnRfdmFyX2Fubm90YXRpb24gOiBJbnRyaW5zaWM8W10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgImxsdm0udmFyLmFubm90YXRpb24iPjsNCitkZWYgaW50X3B0cl9hbm5vdGF0aW9uIDogSW50cmluc2ljPFtMTFZNQW55UG9pbnRlclR5cGU8bGx2bV9hbnlpbnRfdHk+XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX3B0cl90eSwgbGx2bV9wdHJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sICJsbHZtLnB0ci5hbm5vdGF0aW9uIj47DQorZGVmIGludF9hbm5vdGF0aW9uIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX3B0cl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCAibGx2bS5hbm5vdGF0aW9uIj47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhbXBvbGluZSBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KK2RlZiBpbnRfaW5pdF90cmFtcG9saW5lIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV9wdHJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZFdyaXRlQXJnTWVtXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faW5pdF90cmFtcG9saW5lIj47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3ZlcmZsb3cgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKw0KKy8vIEV4cG9zZSB0aGUgY2FycnkgZmxhZyBmcm9tIGFkZCBvcGVyYXRpb25zIG9uIHR3byBpbnRlZ3JhbHMuDQorZGVmIGludF9zYWRkX3dpdGhfb3ZlcmZsb3cgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5LCBsbHZtX2kxX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KK2RlZiBpbnRfdWFkZF93aXRoX292ZXJmbG93IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eSwgbGx2bV9pMV90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisNCitkZWYgaW50X3NzdWJfd2l0aF9vdmVyZmxvdyA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHksIGxsdm1faTFfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorZGVmIGludF91c3ViX3dpdGhfb3ZlcmZsb3cgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5LCBsbHZtX2kxX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKw0KK2RlZiBpbnRfc211bF93aXRoX292ZXJmbG93IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eSwgbGx2bV9pMV90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCitkZWYgaW50X3VtdWxfd2l0aF9vdmVyZmxvdyA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHksIGxsdm1faTFfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0b21pYyBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KK2RlZiBpbnRfbWVtb3J5X2JhcnJpZXIgOiBJbnRyaW5zaWM8W10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMV90eSwgbGx2bV9pMV90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxX3R5LCBsbHZtX2kxX3R5LCBsbHZtX2kxX3R5XSwgW10+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9sbHZtX21lbW9yeV9iYXJyaWVyIj47DQorDQorZGVmIGludF9hdG9taWNfY21wX3N3YXAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbSwgTm9DYXB0dXJlPDA+XT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwIj47DQorZGVmIGludF9hdG9taWNfbG9hZF9hZGQgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbSwgTm9DYXB0dXJlPDA+XT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19zeW5jX2ZldGNoX2FuZF9hZGQiPjsNCitkZWYgaW50X2F0b21pY19zd2FwICAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZFdyaXRlQXJnTWVtLCBOb0NhcHR1cmU8MD5dPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQiPjsNCitkZWYgaW50X2F0b21pY19sb2FkX3N1YiA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZFdyaXRlQXJnTWVtLCBOb0NhcHR1cmU8MD5dPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX3N5bmNfZmV0Y2hfYW5kX3N1YiI+Ow0KK2RlZiBpbnRfYXRvbWljX2xvYWRfYW5kIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+PiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkV3JpdGVBcmdNZW0sIE5vQ2FwdHVyZTwwPl0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fc3luY19mZXRjaF9hbmRfYW5kIj47DQorZGVmIGludF9hdG9taWNfbG9hZF9vciAgIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkV3JpdGVBcmdNZW0sIE5vQ2FwdHVyZTwwPl0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fc3luY19mZXRjaF9hbmRfb3IiPjsNCitkZWYgaW50X2F0b21pY19sb2FkX3hvciA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZFdyaXRlQXJnTWVtLCBOb0NhcHR1cmU8MD5dPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX3N5bmNfZmV0Y2hfYW5kX3hvciI+Ow0KK2RlZiBpbnRfYXRvbWljX2xvYWRfbmFuZCA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZFdyaXRlQXJnTWVtLCBOb0NhcHR1cmU8MD5dPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX3N5bmNfZmV0Y2hfYW5kX25hbmQiPjsNCitkZWYgaW50X2F0b21pY19sb2FkX21pbiAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+PiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbSwgTm9DYXB0dXJlPDA+XT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19zeW5jX2ZldGNoX2FuZF9taW4iPjsNCitkZWYgaW50X2F0b21pY19sb2FkX21heCAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+PiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbSwgTm9DYXB0dXJlPDA+XT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19zeW5jX2ZldGNoX2FuZF9tYXgiPjsNCitkZWYgaW50X2F0b21pY19sb2FkX3VtaW4gOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+PiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbSwgTm9DYXB0dXJlPDA+XT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19zeW5jX2ZldGNoX2FuZF91bWluIj47DQorZGVmIGludF9hdG9taWNfbG9hZF91bWF4IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkV3JpdGVBcmdNZW0sIE5vQ2FwdHVyZTwwPl0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fc3luY19mZXRjaF9hbmRfdW1heCI+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNZW1vcnkgVXNlIE1hcmtlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCitkZWYgaW50X2xpZmV0aW1lX3N0YXJ0ICA6IEludHJpbnNpYzxbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fcHRyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbSwgTm9DYXB0dXJlPDE+XT47DQorZGVmIGludF9saWZldGltZV9lbmQgICAgOiBJbnRyaW5zaWM8W10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX3B0cl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkV3JpdGVBcmdNZW0sIE5vQ2FwdHVyZTwxPl0+Ow0KK2RlZiBpbnRfaW52YXJpYW50X3N0YXJ0IDogSW50cmluc2ljPFtsbHZtX2Rlc2NyaXB0b3JfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9wdHJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZEFyZ01lbSwgTm9DYXB0dXJlPDE+XT47DQorZGVmIGludF9pbnZhcmlhbnRfZW5kICAgOiBJbnRyaW5zaWM8W10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZGVzY3JpcHRvcl90eSwgbGx2bV9pNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbSwgTm9DYXB0dXJlPDI+XT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdGhlciBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KK2RlZiBpbnRfZmx0X3JvdW5kcyA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldPiwNCisgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fZmx0X3JvdW5kcyI+Ow0KK2RlZiBpbnRfdHJhcCA6IEludHJpbnNpYzxbXT4sDQorICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX3RyYXAiPjsNCisNCisvLyBJbnRyaXNpY3MgdG8gc3VwcG9ydCBoYWxmIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBmb3JtYXQNCitsZXQgUHJvcGVydGllcyA9IFtJbnRyTm9NZW1dIGluIHsNCitkZWYgaW50X2NvbnZlcnRfdG9fZnAxNiAgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sIFtsbHZtX2Zsb2F0X3R5XT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fZ251X2YyaF9pZWVlIj47DQorZGVmIGludF9jb252ZXJ0X2Zyb21fZnAxNiA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2kxNl90eV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2dudV9oMmZfaWVlZSI+Ow0KK30NCisNCisvLyBUaGVzZSBjb252ZXJ0IGludHJpbnNpY3MgYXJlIHRvIHN1cHBvcnQgdmFyaW91cyBjb252ZXJzaW9ucyBiZXR3ZWVuDQorLy8gdmFyaW91cyB0eXBlcyB3aXRoIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uLiBOT1RFOiBhdm9pZCB1c2luZyB0aGVzZQ0KKy8vIGludHJpbnNpY3MgYXMgdGhleSBtaWdodCBiZSByZW1vdmVkIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUgYW5kDQorLy8gbW9zdCB0YXJnZXRzIGRvbid0IHN1cHBvcnQgdGhlbS4NCitkZWYgaW50X2NvbnZlcnRmZiAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlmbG9hdF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XT47DQorZGVmIGludF9jb252ZXJ0ZnNpIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55aW50X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldPjsNCitkZWYgaW50X2NvbnZlcnRmdWkgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlpbnRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0+Ow0KK2RlZiBpbnRfY29udmVydHNpZiA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlmbG9hdF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XT47DQorZGVmIGludF9jb252ZXJ0dWlmIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueWZsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldPjsNCitkZWYgaW50X2NvbnZlcnRzcyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55aW50X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldPjsNCitkZWYgaW50X2NvbnZlcnRzdSAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55aW50X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldPjsNCitkZWYgaW50X2NvbnZlcnR1cyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55aW50X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldPjsNCitkZWYgaW50X2NvbnZlcnR1dSAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55aW50X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFRhcmdldC1zcGVjaWZpYyBpbnRyaW5zaWNzDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvL2luY2x1ZGUgImxsdm0vSW50cmluc2ljc1Bvd2VyUEMudGQiDQoraW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzWDg2LnRkIg0KKy8vaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzQVJNLnRkIg0KKy8vaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzQ2VsbFNQVS50ZCINCisvL2luY2x1ZGUgImxsdm0vSW50cmluc2ljc0FscGhhLnRkIg0KKy8vaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzWENvcmUudGQiDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NBUk0udGQgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljc0FSTS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE4MGJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NBUk0udGQKQEAgLTAsMCArMSw0MDUgQEAKKy8vPT09LSBJbnRyaW5zaWNzQVJNLnRkIC0gRGVmaW5lcyBBUk0gaW50cmluc2ljcyAtLS0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIEFSTS1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRMUworCitsZXQgVGFyZ2V0UHJlZml4ID0gImFybSIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5hcm0uIi4KKyAgZGVmIGludF9hcm1fdGhyZWFkX3BvaW50ZXIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdGhyZWFkX3BvaW50ZXIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtdLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTYXR1cmF0aW5nIEFyaXRobWVudGljCisKK2xldCBUYXJnZXRQcmVmaXggPSAiYXJtIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLmFybS4iLgorICBkZWYgaW50X2FybV9xYWRkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9xYWRkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfYXJtX3FzdWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3FzdWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfYXJtX3NzYXQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NzYXQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfYXJtX3VzYXQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VzYXQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBWRlAKKworbGV0IFRhcmdldFByZWZpeCA9ICJhcm0iIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0uYXJtLiIuCisgIGRlZiBpbnRfYXJtX2dldF9mcHNjciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fZ2V0X2Zwc2NyIj4sIAorICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X2FybV9zZXRfZnBzY3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NldF9mcHNjciI+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF9hcm1fdmN2dHIgICAgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X2FybV92Y3Z0cnUgICAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9hbnlmbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBZHZhbmNlZCBTSU1EIChORU9OKQorCitsZXQgVGFyZ2V0UHJlZml4ID0gImFybSIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5hcm0uIi4KKworICAvLyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgZG8gbm90IGNvcnJlc3BvbmQgZGlyZWN0bHkgdG8gR0NDIGJ1aWx0aW5zLgorICBjbGFzcyBOZW9uXzFBcmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIE5lb25fMUFyZ19OYXJyb3dfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTUV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGU8MD5dLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIE5lb25fMUFyZ19Mb25nX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW0xMVk1UcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgTmVvbl8yQXJnX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIE5lb25fMkFyZ19OYXJyb3dfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTUV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGU8MD4sCisgICAgICAgICAgICAgICAgIExMVk1FeHRlbmRlZEVsZW1lbnRWZWN0b3JUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIE5lb25fMkFyZ19Mb25nX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW0xMVk1UcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgTExWTVRydW5jYXRlZEVsZW1lbnRWZWN0b3JUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIE5lb25fMkFyZ19XaWRlX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1UcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBOZW9uXzNBcmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBOZW9uXzNBcmdfTG9uZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBMTFZNVHJ1bmNhdGVkRWxlbWVudFZlY3RvclR5cGU8MD4sCisgICAgICAgICAgICAgICAgIExMVk1UcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBOZW9uX0N2dEZ4VG9GUF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtsbHZtX2FueWludF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIE5lb25fQ3Z0RlBUb0Z4X0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtsbHZtX2FueWZsb2F0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBUaGUgdGFibGUgb3BlcmFuZHMgZm9yIFZUQkwgYW5kIFZUQlggY29uc2lzdCBvZiAxIHRvIDQgdjhpOCB2ZWN0b3JzLgorICAvLyBCZXNpZGVzIHRoZSB0YWJsZSwgVlRCTCBoYXMgb25lIG90aGVyIHY4aTggYXJndW1lbnQgYW5kIFZUQlggaGFzIHR3by4KKyAgLy8gT3ZlcmFsbCwgdGhlIGNsYXNzZXMgcmFuZ2UgZnJvbSAyIHRvIDYgdjhpOCBhcmd1bWVudHMuCisgIGNsYXNzIE5lb25fVGJsMkFyZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwKKyAgICAgICAgICAgICAgICBbbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHldLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIE5lb25fVGJsM0FyZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwKKyAgICAgICAgICAgICAgICBbbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgTmVvbl9UYmw0QXJnX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX3Y4aThfdHldLAorICAgICAgICAgICAgICAgIFtsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgTmVvbl9UYmw1QXJnX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX3Y4aThfdHldLAorICAgICAgICAgICAgICAgIFtsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHksCisgICAgICAgICAgICAgICAgIGxsdm1fdjhpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgTmVvbl9UYmw2QXJnX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX3Y4aThfdHldLAorICAgICAgICAgICAgICAgIFtsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHksCisgICAgICAgICAgICAgICAgIGxsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBBcml0aG1ldGljIG9wcworCitsZXQgUHJvcGVydGllcyA9IFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXSBpbiB7CisKKyAgLy8gVmVjdG9yIEFkZC4KKyAgZGVmIGludF9hcm1fbmVvbl92aGFkZHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZoYWRkdSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnJoYWRkcyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnJoYWRkdSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnFhZGRzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92cWFkZHUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZhZGRobiA6IE5lb25fMkFyZ19OYXJyb3dfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZyYWRkaG4gOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92YWRkbHMgOiBOZW9uXzJBcmdfTG9uZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdmFkZGx1IDogTmVvbl8yQXJnX0xvbmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZhZGR3cyA6IE5lb25fMkFyZ19XaWRlX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92YWRkd3UgOiBOZW9uXzJBcmdfV2lkZV9JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIE11bHRpcGx5LgorICBkZWYgaW50X2FybV9uZW9uX3ZtdWxwIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92cWRtdWxoIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92cXJkbXVsaCA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdm11bGxzIDogTmVvbl8yQXJnX0xvbmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZtdWxsdSA6IE5lb25fMkFyZ19Mb25nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92bXVsbHAgOiBOZW9uXzJBcmdfTG9uZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnFkbXVsbCA6IE5lb25fMkFyZ19Mb25nX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgTXVsdGlwbHkgYW5kIEFjY3VtdWxhdGUvU3VidHJhY3QuCisgIGRlZiBpbnRfYXJtX25lb25fdm1sYWxzIDogTmVvbl8zQXJnX0xvbmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZtbGFsdSA6IE5lb25fM0FyZ19Mb25nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92bWxzbHMgOiBOZW9uXzNBcmdfTG9uZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdm1sc2x1IDogTmVvbl8zQXJnX0xvbmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZxZG1sYWwgOiBOZW9uXzNBcmdfTG9uZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnFkbWxzbCA6IE5lb25fM0FyZ19Mb25nX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgTWF4aW11bS4KKyAgZGVmIGludF9hcm1fbmVvbl92bWF4cyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdm1heHUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBNaW5pbXVtLgorICBkZWYgaW50X2FybV9uZW9uX3ZtaW5zIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92bWludSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFJlY2lwcm9jYWwgU3RlcC4KKyAgZGVmIGludF9hcm1fbmVvbl92cmVjcHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBSZWNpcHJvY2FsIFNxdWFyZSBSb290IFN0ZXAuCisgIGRlZiBpbnRfYXJtX25lb25fdnJzcXJ0cyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7Cit9CisKKy8vIFZlY3RvciBTdWJ0cmFjdC4KK2RlZiBpbnRfYXJtX25lb25fdmhzdWJzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmhzdWJ1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzdWJzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzdWJ1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnN1YmhuIDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Zyc3ViaG4gOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnN1YmxzIDogTmVvbl8yQXJnX0xvbmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92c3VibHUgOiBOZW9uXzJBcmdfTG9uZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZzdWJ3cyA6IE5lb25fMkFyZ19XaWRlX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnN1Ynd1IDogTmVvbl8yQXJnX1dpZGVfSW50cmluc2ljOworCisvLyBWZWN0b3IgQWJzb2x1dGUgQ29tcGFyZS4KK2xldCBUYXJnZXRQcmVmaXggPSAiYXJtIiBpbiB7CisgIGRlZiBpbnRfYXJtX25lb25fdmFjZ2VkIDogSW50cmluc2ljPFtsbHZtX3YyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmMzJfdHksIGxsdm1fdjJmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfYXJtX25lb25fdmFjZ2VxIDogSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfYXJtX25lb25fdmFjZ3RkIDogSW50cmluc2ljPFtsbHZtX3YyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmMzJfdHksIGxsdm1fdjJmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfYXJtX25lb25fdmFjZ3RxIDogSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBBYnNvbHV0ZSBEaWZmZXJlbmNlcy4KK2RlZiBpbnRfYXJtX25lb25fdmFiZHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92YWJkdSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZhYmRscyA6IE5lb25fMkFyZ19Mb25nX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmFiZGx1IDogTmVvbl8yQXJnX0xvbmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgQWJzb2x1dGUgRGlmZmVyZW5jZSBhbmQgQWNjdW11bGF0ZS4KK2RlZiBpbnRfYXJtX25lb25fdmFiYXMgOiBOZW9uXzNBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92YWJhdSA6IE5lb25fM0FyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZhYmFscyA6IE5lb25fM0FyZ19Mb25nX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmFiYWx1IDogTmVvbl8zQXJnX0xvbmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgUGFpcndpc2UgQWRkLgorZGVmIGludF9hcm1fbmVvbl92cGFkZCA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBQYWlyd2lzZSBBZGQgTG9uZy4KKy8vIE5vdGU6IFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIG90aGVyICJsb25nIiBORU9OIGludHJpbnNpY3MgYmVjYXVzZQorLy8gdGhlIHJlc3VsdCB2ZWN0b3IgaGFzIGhhbGYgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgc291cmNlIHZlY3Rvci4KKy8vIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHZlY3RvciB0eXBlcyBtdXN0IGJlIHNwZWNpZmllZCBzZXBhcmF0ZWx5LgorbGV0IFRhcmdldFByZWZpeCA9ICJhcm0iIGluIHsKKyAgZGVmIGludF9hcm1fbmVvbl92cGFkZGxzIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfYXJtX25lb25fdnBhZGRsdSA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgUGFpcndpc2UgQWRkIGFuZCBBY2N1bXVsYXRlIExvbmcuCisvLyBOb3RlOiBUaGlzIGlzIHNpbWlsYXIgdG8gdnBhZGRsIGJ1dCB0aGUgZGVzdGluYXRpb24gdmVjdG9yIGFsc28gYXBwZWFycworLy8gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgorbGV0IFRhcmdldFByZWZpeCA9ICJhcm0iIGluIHsKKyAgZGVmIGludF9hcm1fbmVvbl92cGFkYWxzIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X2FybV9uZW9uX3ZwYWRhbHUgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBQYWlyd2lzZSBNYXhpbXVtIGFuZCBNaW5pbXVtLgorZGVmIGludF9hcm1fbmVvbl92cG1heHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cG1heHUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cG1pbnMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cG1pbnUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgU2hpZnRzOgorLy8KKy8vIFRoZSB2YXJpb3VzIHNhdHVyYXRpbmcgYW5kIHJvdW5kaW5nIHZlY3RvciBzaGlmdCBvcGVyYXRpb25zIG5lZWQgdG8gYmUKKy8vIHJlcHJlc2VudGVkIGJ5IGludHJpbnNpY3MgaW4gTExWTSwgYW5kIGV2ZW4gdGhlIGJhc2ljIFZTSEwgdmFyaWFibGUgc2hpZnQKKy8vIG9wZXJhdGlvbiBjYW5ub3QgYmUgc2FmZWx5IHRyYW5zbGF0ZWQgdG8gTExWTSdzIHNoaWZ0IG9wZXJhdG9ycy4gIFZTSEwgY2FuCisvLyBiZSB1c2VkIGZvciBib3RoIGxlZnQgYW5kIHJpZ2h0IHNoaWZ0cywgb3IgZXZlbiBjb21iaW5hdGlvbnMgb2YgdGhlIHR3bywKKy8vIGRlcGVuZGluZyBvbiB0aGUgc2lnbnMgb2YgdGhlIHNoaWZ0IGFtb3VudHMuICBJdCBhbHNvIGhhcyB3ZWxsLWRlZmluZWQKKy8vIGJlaGF2aW9yIGZvciBzaGlmdCBhbW91bnRzIHRoYXQgTExWTSBsZWF2ZXMgdW5kZWZpbmVkLiAgT25seSBiYXNpYyBzaGlmdHMKKy8vIGJ5IGNvbnN0YW50cyBjYW4gYmUgcmVwcmVzZW50ZWQgd2l0aCBMTFZNJ3Mgc2hpZnQgb3BlcmF0b3JzLgorLy8KKy8vIFRoZSBzaGlmdCBjb3VudHMgZm9yIHRoZXNlIGludHJpbnNpY3MgYXJlIGFsd2F5cyB2ZWN0b3JzLCBldmVuIGZvciBjb25zdGFudAorLy8gc2hpZnRzLCB3aGVyZSB0aGUgY29uc3RhbnQgaXMgcmVwbGljYXRlZC4gIEZvciBjb25zaXN0ZW5jeSB3aXRoIFZTSEwgKGFuZAorLy8gb3RoZXIgdmFyaWFibGUgc2hpZnQgaW5zdHJ1Y3Rpb25zKSwgbGVmdCBzaGlmdHMgaGF2ZSBwb3NpdGl2ZSBzaGlmdCBjb3VudHMKKy8vIGFuZCByaWdodCBzaGlmdHMgaGF2ZSBuZWdhdGl2ZSBzaGlmdCBjb3VudHMuICBUaGlzIGNvbnZlbnRpb24gaXMgYWxzbyB1c2VkCisvLyBmb3IgY29uc3RhbnQgcmlnaHQgc2hpZnQgaW50cmluc2ljcywgYW5kIHRvIGhlbHAgcHJlc2VydmUgc2FuaXR5LCB0aGUKKy8vIGludHJpbnNpYyBuYW1lcyB1c2UgInNoaWZ0IiBpbnN0ZWFkIG9mIGVpdGhlciAic2hsIiBvciAic2hyIi4gIFdoZXJlCisvLyBhcHBsaWNhYmxlLCBzaWduZWQgYW5kIHVuc2lnbmVkIHZlcnNpb25zIG9mIHRoZSBpbnRyaW5zaWNzIGFyZQorLy8gZGlzdGluZ3Vpc2hlZCB3aXRoICJzIiBhbmQgInUiIHN1ZmZpeGVzLiAgQSBmZXcgTkVPTiBzaGlmdCBpbnN0cnVjdGlvbnMsCisvLyBzdWNoIGFzIFZRU0hMVSwgdGFrZSBzaWduZWQgb3BlcmFuZHMgYnV0IHByb2R1Y2UgdW5zaWduZWQgcmVzdWx0czsgdGhlc2UKKy8vIHVzZSBhICJzdSIgc3VmZml4LgorCisvLyBWZWN0b3IgU2hpZnQuCitkZWYgaW50X2FybV9uZW9uX3ZzaGlmdHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92c2hpZnR1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnNoaWZ0bHMgOiBOZW9uXzJBcmdfTG9uZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZzaGlmdGx1IDogTmVvbl8yQXJnX0xvbmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92c2hpZnRuIDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBSb3VuZGluZyBTaGlmdC4KK2RlZiBpbnRfYXJtX25lb25fdnJzaGlmdHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cnNoaWZ0dSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Zyc2hpZnRuIDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBTYXR1cmF0aW5nIFNoaWZ0LgorZGVmIGludF9hcm1fbmVvbl92cXNoaWZ0cyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Zxc2hpZnR1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzaGlmdHN1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzaGlmdG5zIDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Zxc2hpZnRudSA6IE5lb25fMkFyZ19OYXJyb3dfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXNoaWZ0bnN1IDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBTYXR1cmF0aW5nIFJvdW5kaW5nIFNoaWZ0LgorZGVmIGludF9hcm1fbmVvbl92cXJzaGlmdHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXJzaGlmdHUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXJzaGlmdG5zIDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZxcnNoaWZ0bnUgOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFyc2hpZnRuc3UgOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFNoaWZ0IGFuZCBJbnNlcnQuCitkZWYgaW50X2FybV9uZW9uX3ZzaGlmdGlucyA6IE5lb25fM0FyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBBYnNvbHV0ZSBWYWx1ZSBhbmQgU2F0dXJhdGluZyBBYnNvbHV0ZSBWYWx1ZS4KK2RlZiBpbnRfYXJtX25lb25fdmFicyA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZxYWJzIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFNhdHVyYXRpbmcgTmVnYXRlLgorZGVmIGludF9hcm1fbmVvbl92cW5lZyA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBDb3VudCBMZWFkaW5nIFNpZ24vWmVybyBCaXRzLgorZGVmIGludF9hcm1fbmVvbl92Y2xzIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmNseiA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBDb3VudCBPbmUgQml0cy4KK2RlZiBpbnRfYXJtX25lb25fdmNudCA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBSZWNpcHJvY2FsIEVzdGltYXRlLgorZGVmIGludF9hcm1fbmVvbl92cmVjcGUgOiBOZW9uXzFBcmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgUmVjaXByb2NhbCBTcXVhcmUgUm9vdCBFc3RpbWF0ZS4KK2RlZiBpbnRfYXJtX25lb25fdnJzcXJ0ZSA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBDb252ZXJzaW9ucyBCZXR3ZWVuIEZsb2F0aW5nLXBvaW50IGFuZCBGaXhlZC1wb2ludC4KK2RlZiBpbnRfYXJtX25lb25fdmN2dGZwMmZ4cyA6IE5lb25fQ3Z0RlBUb0Z4X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dGZwMmZ4dSA6IE5lb25fQ3Z0RlBUb0Z4X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dGZ4czJmcCA6IE5lb25fQ3Z0RnhUb0ZQX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dGZ4dTJmcCA6IE5lb25fQ3Z0RnhUb0ZQX0ludHJpbnNpYzsKKworLy8gTmFycm93aW5nIGFuZCBMZW5ndGhlbmluZyBWZWN0b3IgTW92ZXMuCitkZWYgaW50X2FybV9uZW9uX3Ztb3ZuIDogTmVvbl8xQXJnX05hcnJvd19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZxbW92bnMgOiBOZW9uXzFBcmdfTmFycm93X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFtb3ZudSA6IE5lb25fMUFyZ19OYXJyb3dfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cW1vdm5zdSA6IE5lb25fMUFyZ19OYXJyb3dfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92bW92bHMgOiBOZW9uXzFBcmdfTG9uZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Ztb3ZsdSA6IE5lb25fMUFyZ19Mb25nX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFRhYmxlIExvb2t1cC4KKy8vIFRoZSBmaXJzdCAxLTQgYXJndW1lbnRzIGFyZSB0aGUgdGFibGUuCitkZWYgaW50X2FybV9uZW9uX3Z0YmwxIDogTmVvbl9UYmwyQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnRibDIgOiBOZW9uX1RibDNBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92dGJsMyA6IE5lb25fVGJsNEFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Z0Ymw0IDogTmVvbl9UYmw1QXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFRhYmxlIEV4dGVuc2lvbi4KKy8vIFNvbWUgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3RvciBtYXkgbm90IGJlIHVwZGF0ZWQsIHNvIHRoZSBvcmlnaW5hbAorLy8gdmFsdWUgb2YgdGhhdCB2ZWN0b3IgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4gIFRoZSBuZXh0IDEtNAorLy8gYXJndW1lbnRzIGFmdGVyIHRoYXQgYXJlIHRoZSB0YWJsZS4KK2RlZiBpbnRfYXJtX25lb25fdnRieDEgOiBOZW9uX1RibDNBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92dGJ4MiA6IE5lb25fVGJsNEFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Z0YngzIDogTmVvbl9UYmw1QXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnRieDQgOiBOZW9uX1RibDZBcmdfSW50cmluc2ljOworCitsZXQgVGFyZ2V0UHJlZml4ID0gImFybSIgaW4geworCisgIC8vIERlLWludGVybGVhdmluZyB2ZWN0b3IgbG9hZHMgZnJvbSBOLWVsZW1lbnQgc3RydWN0dXJlcy4KKyAgZGVmIGludF9hcm1fbmVvbl92bGQxIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRBcmdNZW1dPjsKKyAgZGVmIGludF9hcm1fbmVvbl92bGQyIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRBcmdNZW1dPjsKKyAgZGVmIGludF9hcm1fbmVvbl92bGQzIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZEFyZ01lbV0+OworICBkZWYgaW50X2FybV9uZW9uX3ZsZDQgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkQXJnTWVtXT47CisKKyAgLy8gVmVjdG9yIGxvYWQgTi1lbGVtZW50IHN0cnVjdHVyZSB0byBvbmUgbGFuZS4KKyAgZGVmIGludF9hcm1fbmVvbl92bGQybGFuZSA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZEFyZ01lbV0+OworICBkZWYgaW50X2FybV9uZW9uX3ZsZDNsYW5lIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyUmVhZEFyZ01lbV0+OworICBkZWYgaW50X2FybV9uZW9uX3ZsZDRsYW5lIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkQXJnTWVtXT47CisKKyAgLy8gSW50ZXJsZWF2aW5nIHZlY3RvciBzdG9yZXMgZnJvbSBOLWVsZW1lbnQgc3RydWN0dXJlcy4KKyAgZGVmIGludF9hcm1fbmVvbl92c3QxIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbV0+OworICBkZWYgaW50X2FybV9uZW9uX3ZzdDIgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLCBbSW50clJlYWRXcml0ZUFyZ01lbV0+OworICBkZWYgaW50X2FybV9uZW9uX3ZzdDMgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZFdyaXRlQXJnTWVtXT47CisgIGRlZiBpbnRfYXJtX25lb25fdnN0NCA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJSZWFkV3JpdGVBcmdNZW1dPjsKKworICAvLyBWZWN0b3Igc3RvcmUgTi1lbGVtZW50IHN0cnVjdHVyZSBmcm9tIG9uZSBsYW5lLgorICBkZWYgaW50X2FybV9uZW9uX3ZzdDJsYW5lIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRXcml0ZUFyZ01lbV0+OworICBkZWYgaW50X2FybV9uZW9uX3ZzdDNsYW5lIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJSZWFkV3JpdGVBcmdNZW1dPjsKKyAgZGVmIGludF9hcm1fbmVvbl92c3Q0bGFuZSA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkV3JpdGVBcmdNZW1dPjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9JbnRyaW5zaWNzQWxwaGEudGQgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljc0FscGhhLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODY1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljc0FscGhhLnRkCkBAIC0wLDAgKzEsMTggQEAKKy8vPT09LSBJbnRyaW5zaWNzQWxwaGEudGQgLSBEZWZpbmVzIEFscGhhIGludHJpbnNpY3MgLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIEFscGhhLXNwZWNpZmljIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCitsZXQgVGFyZ2V0UHJlZml4ID0gImFscGhhIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLmFscGhhLiIuCisgIGRlZiBpbnRfYWxwaGFfdW11bGggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWxwaGFfdW11bGgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljc0JsYWNrZmluLnRkIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NCbGFja2Zpbi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODhlMThjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NCbGFja2Zpbi50ZApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gSW50cmluc2ljc0JsYWNrZmluLnRkIC0gRGVmaW5lcyBCbGFja2ZpbiBpbnRyaW5zaWNzIC0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgYmxhY2tmaW4tc3BlY2lmaWMgaW50cmluc2ljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29yZSBzeW5jaHJvbmlzYXRpb24gZXRjLgorLy8KKy8vIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBzaWRlZWZmZWN0cy4gRWFjaCByZXByZXNlbnQgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24sIGJ1dAorLy8gd29ya2Fyb3VuZHMgYXJlIHNvbWV0aW1lcyByZXF1aXJlZCBkZXBlbmRpbmcgb24gdGhlIGNwdS4KKworbGV0IFRhcmdldFByZWZpeCA9ICJiZmluIiBpbiB7CisKKyAgLy8gRXhlY3V0ZSBjc3luYyBpbnN0cnVjdGlvbiB3aXRoIHdvcmthcm91bmRzCisgIGRlZiBpbnRfYmZpbl9jc3luYyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9iZmluX2NzeW5jIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3ZvaWRfdHldPjsKKworICAvLyBFeGVjdXRlIHNzeW5jIGluc3RydWN0aW9uIHdpdGggd29ya2Fyb3VuZHMKKyAgZGVmIGludF9iZmluX3NzeW5jIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2JmaW5fc3N5bmMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdm9pZF90eV0+OworCisgIC8vIEV4ZWN1dGUgaWRsZSBpbnN0cnVjdGlvbiB3aXRoIHdvcmthcm91bmRzCisgIGRlZiBpbnRfYmZpbl9pZGxlIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2JmaW5faWRsZSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92b2lkX3R5XT47CisKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9JbnRyaW5zaWNzQ2VsbFNQVS50ZCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9JbnRyaW5zaWNzQ2VsbFNQVS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTMxMWJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NDZWxsU1BVLnRkCkBAIC0wLDAgKzEsMjQyIEBACisvLz09LSBJbnRyaW5zaWNzQ2VsbFNQVS50ZCAtIENlbGwgU0RLIGludHJpbnNpY3MgICAgICAgICAgIC0qLSB0YWJsZWdlbiAtKi09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIERlcGFydG1lbnQgYXQgVGhlIEFlcm9zcGFjZSBDb3Jwb3JhdGlvbiBhbmQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDZWxsIFNQVSBJbnN0cnVjdGlvbnM6CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVE9ETyBJdGVtcyAobm90IHVyZ2VudCB0b2RheSwgYnV0IHdvdWxkIGJlIG5pY2UsIGxvdyBwcmlvcml0eSkKKy8vCisvLyBBTkRCSSwgT1JCSTogU1BVIGNvbnN0cnVjdHMgYSA0LWJ5dGUgY29uc3RhbnQgZm9yIHRoZXNlIGluc3RydWN0aW9ucyBieQorLy8gY29uY2F0ZW5hdGluZyB0aGUgYnl0ZSBhcmd1bWVudCBiIGFzICJiYmJiIi4gQ291bGQgcmVjb2duaXplIHRoaXMgYml0IHBhdHRlcm4KKy8vIGluIDE2LWJpdCBhbmQgMzItYml0IGNvbnN0YW50cyBhbmQgcmVkdWNlIGluc3RydWN0aW9uIGNvdW50LgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gNy1iaXQgaW50ZWdlciB0eXBlLCB1c2VkIGFzIGFuIGltbWVkaWF0ZToKK2RlZiBjZWxsX2k3X3R5OiBMTFZNVHlwZTxpOD47CitkZWYgY2VsbF9pOF90eTogTExWTVR5cGU8aTg+OworCisvLyBLZWVwIHRoaXMgaGVyZSB1bnRpbCBpdCdzIGFjdHVhbGx5IHN1cHBvcnRlZDoKK2RlZiBsbHZtX2kxMjhfdHkgOiBMTFZNVHlwZTxpMTI4PjsKKworY2xhc3MgdjE2aThfdTdpbW08c3RyaW5nIGJ1aWx0aW5fc3VmZml4PiA6CisgIEdDQ0J1aWx0aW48IXN0cmNvbmNhdCgiX19idWlsdGluX3NpXyIsIGJ1aWx0aW5fc3VmZml4KT4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBjZWxsX2k3X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgdjE2aThfdThpbW08c3RyaW5nIGJ1aWx0aW5fc3VmZml4PiA6CisgIEdDQ0J1aWx0aW48IXN0cmNvbmNhdCgiX19idWlsdGluX3NpXyIsIGJ1aWx0aW5fc3VmZml4KT4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgdjE2aThfczEwaW1tPHN0cmluZyBidWlsdGluX3N1ZmZpeD4gOgorICBHQ0NCdWlsdGluPCFzdHJjb25jYXQoIl9fYnVpbHRpbl9zaV8iLCBidWlsdGluX3N1ZmZpeCk+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitjbGFzcyB2MTZpOF91MTZpbW08c3RyaW5nIGJ1aWx0aW5fc3VmZml4PiA6CisgIEdDQ0J1aWx0aW48IXN0cmNvbmNhdCgiX19idWlsdGluX3NpXyIsIGJ1aWx0aW5fc3VmZml4KT4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2NsYXNzIHYxNmk4X3JyPHN0cmluZyBidWlsdGluX3N1ZmZpeD4gOgorICBHQ0NCdWlsdGluPCFzdHJjb25jYXQoIl9fYnVpbHRpbl9zaV8iLCBidWlsdGluX3N1ZmZpeCk+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2NsYXNzIHY4aTE2X3MxMGltbTxzdHJpbmcgYnVpbHRpbl9zdWZmaXg+IDoKKyAgR0NDQnVpbHRpbjwhc3RyY29uY2F0KCJfX2J1aWx0aW5fc2lfIiwgYnVpbHRpbl9zdWZmaXgpPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgdjhpMTZfdTE2aW1tPHN0cmluZyBidWlsdGluX3N1ZmZpeD4gOgorICBHQ0NCdWlsdGluPCFzdHJjb25jYXQoIl9fYnVpbHRpbl9zaV8iLCBidWlsdGluX3N1ZmZpeCk+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitjbGFzcyB2OGkxNl9ycjxzdHJpbmcgYnVpbHRpbl9zdWZmaXg+IDoKKyAgR0NDQnVpbHRpbjwhc3RyY29uY2F0KCJfX2J1aWx0aW5fc2lfIiwgYnVpbHRpbl9zdWZmaXgpPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitjbGFzcyB2NGkzMl9ycjxzdHJpbmcgYnVpbHRpbl9zdWZmaXg+IDoKKyAgR0NDQnVpbHRpbjwhc3RyY29uY2F0KCJfX2J1aWx0aW5fc2lfIiwgYnVpbHRpbl9zdWZmaXgpPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitjbGFzcyB2NGkzMl91N2ltbTxzdHJpbmcgYnVpbHRpbl9zdWZmaXg+IDoKKyAgR0NDQnVpbHRpbjwhc3RyY29uY2F0KCJfX2J1aWx0aW5fc2lfIiwgYnVpbHRpbl9zdWZmaXgpPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGNlbGxfaTdfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitjbGFzcyB2NGkzMl9zMTBpbW08c3RyaW5nIGJ1aWx0aW5fc3VmZml4PiA6CisgIEdDQ0J1aWx0aW48IXN0cmNvbmNhdCgiX19idWlsdGluX3NpXyIsIGJ1aWx0aW5fc3VmZml4KT4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2NsYXNzIHY0aTMyX3UxNmltbTxzdHJpbmcgYnVpbHRpbl9zdWZmaXg+IDoKKyAgR0NDQnVpbHRpbjwhc3RyY29uY2F0KCJfX2J1aWx0aW5fc2lfIiwgYnVpbHRpbl9zdWZmaXgpPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgdjRmMzJfcnI8c3RyaW5nIGJ1aWx0aW5fc3VmZml4PiA6CisgIEdDQ0J1aWx0aW48IXN0cmNvbmNhdCgiX19idWlsdGluX3NpXyIsIGJ1aWx0aW5fc3VmZml4KT4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgdjRmMzJfcnJyPHN0cmluZyBidWlsdGluX3N1ZmZpeD4gOgorICBHQ0NCdWlsdGluPCFzdHJjb25jYXQoIl9fYnVpbHRpbl9zaV8iLCBidWlsdGluX3N1ZmZpeCk+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2NsYXNzIHYyZjY0X3JyPHN0cmluZyBidWlsdGluX3N1ZmZpeD4gOgorICBHQ0NCdWlsdGluPCFzdHJjb25jYXQoIl9fYnVpbHRpbl9zaV8iLCBidWlsdGluX3N1ZmZpeCk+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIEFsbCBDZWxsIFNQVSBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0uc3B1LiIuCitsZXQgVGFyZ2V0UHJlZml4ID0gInNwdSIgaW4geworICBkZWYgaW50X3NwdV9zaV9mc21iaSAgOiB2OGkxNl91MTZpbW08ImZzbWJpIj47CisgIGRlZiBpbnRfc3B1X3NpX2FoICAgICA6IHY4aTE2X3JyPCJhaCI+OworICBkZWYgaW50X3NwdV9zaV9haGkgICAgOiB2OGkxNl9zMTBpbW08ImFoaSI+OworICBkZWYgaW50X3NwdV9zaV9hICAgICAgOiB2NGkzMl9ycjwiYSI+OworICBkZWYgaW50X3NwdV9zaV9haSAgICAgOiB2NGkzMl9zMTBpbW08ImFpIj47CisgIGRlZiBpbnRfc3B1X3NpX3NmaCAgICA6IHY4aTE2X3JyPCJzZmgiPjsKKyAgZGVmIGludF9zcHVfc2lfc2ZoaSAgIDogdjhpMTZfczEwaW1tPCJzZmhpIj47CisgIGRlZiBpbnRfc3B1X3NpX3NmICAgICA6IHY0aTMyX3JyPCJzZiI+OworICBkZWYgaW50X3NwdV9zaV9zZmkgICAgOiB2NGkzMl9zMTBpbW08InNmaSI+OworICBkZWYgaW50X3NwdV9zaV9hZGR4ICAgOiB2NGkzMl9ycjwiYWRkeCI+OworICBkZWYgaW50X3NwdV9zaV9jZyAgICAgOiB2NGkzMl9ycjwiY2ciPjsKKyAgZGVmIGludF9zcHVfc2lfY2d4ICAgIDogdjRpMzJfcnI8ImNneCI+OworICBkZWYgaW50X3NwdV9zaV9zZnggICAgOiB2NGkzMl9ycjwic2Z4Ij47CisgIGRlZiBpbnRfc3B1X3NpX2JnICAgICA6IHY0aTMyX3JyPCJiZyI+OworICBkZWYgaW50X3NwdV9zaV9iZ3ggICAgOiB2NGkzMl9ycjwiYmd4Ij47CisgIGRlZiBpbnRfc3B1X3NpX21weSAgICA6IC8vIFRoaXMgaXMgc3BlY2lhbDoKKyAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2lfbXB5Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfc3B1X3NpX21weXUgICA6IC8vIFRoaXMgaXMgc3BlY2lhbDoKKyAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2lfbXB5dSI+LAorICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3NwdV9zaV9tcHlpICAgOiAvLyBUaGlzIGlzIHNwZWNpYWw6CisgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX3NpX21weWkiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfc3B1X3NpX21weXVpICA6IC8vIFRoaXMgaXMgc3BlY2lhbDoKKyAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2lfbXB5dWkiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfc3B1X3NpX21weWEgICA6IC8vIFRoaXMgaXMgc3BlY2lhbDoKKyAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2lfbXB5YSI+LAorICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3NwdV9zaV9tcHloICAgOiAvLyBUaGlzIGlzIHNwZWNpYWw6CisgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX3NpX21weWgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9zcHVfc2lfbXB5cyAgIDogLy8gVGhpcyBpcyBzcGVjaWFsOgorICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zaV9tcHlzIj4sCisgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfc3B1X3NpX21weWhoICA6IC8vIFRoaXMgaXMgc3BlY2lhbDoKKyAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2lfbXB5aGgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9zcHVfc2lfbXB5aGhhIDogLy8gVGhpcyBpcyBzcGVjaWFsOgorICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zaV9tcHloaGEiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9zcHVfc2lfbXB5aGh1IDogLy8gVGhpcyBpcyBzcGVjaWFsOgorICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zaV9tcHloaHUiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9zcHVfc2lfbXB5aGhhdSA6IC8vIFRoaXMgaXMgc3BlY2lhbDoKKyAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2lfbXB5aGhhdSI+LAorICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfc3B1X3NpX3NobGk6ICAgICAgICAgIHY0aTMyX3U3aW1tPCJzaGxpIj47CisKKyAgZGVmIGludF9zcHVfc2lfc2hscWJpOgorICAgIEdDQ0J1aWx0aW48IXN0cmNvbmNhdCgiX19idWlsdGluX3NpXyIsICJzaGxxYmkiKT4sCisgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfc3B1X3NpX3NobHFiaWk6ICAgICAgIHYxNmk4X3U3aW1tPCJzaGxxYmlpIj47CisgIGRlZiBpbnRfc3B1X3NpX3NobHFieToKKyAgICBHQ0NCdWlsdGluPCFzdHJjb25jYXQoIl9fYnVpbHRpbl9zaV8iLCAic2hscWJ5Iik+LAorICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9zcHVfc2lfc2hscWJ5aTogICAgICAgdjE2aThfdTdpbW08InNobHFieWkiPjsKKyAgCisgIGRlZiBpbnRfc3B1X3NpX2NlcTogICAgICAgICAgIHY0aTMyX3JyPCJjZXEiPjsKKyAgZGVmIGludF9zcHVfc2lfY2VxaTogICAgICAgICAgdjRpMzJfczEwaW1tPCJjZXFpIj47CisgIGRlZiBpbnRfc3B1X3NpX2NlcWI6ICAgICAgICAgIHYxNmk4X3JyPCJjZXFiIj47CisgIGRlZiBpbnRfc3B1X3NpX2NlcWJpOiAgICAgICAgIHYxNmk4X3U4aW1tPCJjZXFiaSI+OworICBkZWYgaW50X3NwdV9zaV9jZXFoOiAgICAgICAgICB2OGkxNl9ycjwiY2VxaCI+OworICBkZWYgaW50X3NwdV9zaV9jZXFoaTogICAgICAgICB2OGkxNl9zMTBpbW08ImNlcWhpIj47CisgIGRlZiBpbnRfc3B1X3NpX2NndDogICAgICAgICAgIHY0aTMyX3JyPCJjZ3QiPjsKKyAgZGVmIGludF9zcHVfc2lfY2d0aTogICAgICAgICAgdjRpMzJfczEwaW1tPCJjZ3RpIj47CisgIGRlZiBpbnRfc3B1X3NpX2NndGI6ICAgICAgICAgIHYxNmk4X3JyPCJjZ3RiIj47CisgIGRlZiBpbnRfc3B1X3NpX2NndGJpOiAgICAgICAgIHYxNmk4X3U4aW1tPCJjZ3RiaSI+OworICBkZWYgaW50X3NwdV9zaV9jZ3RoOiAgICAgICAgICB2OGkxNl9ycjwiY2d0aCI+OworICBkZWYgaW50X3NwdV9zaV9jZ3RoaTogICAgICAgICB2OGkxNl9zMTBpbW08ImNndGhpIj47CisgIGRlZiBpbnRfc3B1X3NpX2NsZ3RiOiAgICAgICAgIHYxNmk4X3JyPCJjbGd0YiI+OworICBkZWYgaW50X3NwdV9zaV9jbGd0Ymk6ICAgICAgICB2MTZpOF91OGltbTwiY2xndGJpIj47CisgIGRlZiBpbnRfc3B1X3NpX2NsZ3RoOiAgICAgICAgIHY4aTE2X3JyPCJjbGd0aCI+OworICBkZWYgaW50X3NwdV9zaV9jbGd0aGk6ICAgICAgICB2OGkxNl9zMTBpbW08ImNsZ3RoaSI+OworICBkZWYgaW50X3NwdV9zaV9jbGd0OiAgICAgICAgICB2NGkzMl9ycjwiY2xndCI+OworICBkZWYgaW50X3NwdV9zaV9jbGd0aTogICAgICAgICB2NGkzMl9zMTBpbW08ImNsZ3RpIj47CisgIAorICBkZWYgaW50X3NwdV9zaV9hbmQ6ICAgICAgICAgICB2NGkzMl9ycjwiYW5kIj47CisgIGRlZiBpbnRfc3B1X3NpX2FuZGJpOiAgICAgICAgIHYxNmk4X3U4aW1tPCJhbmRiaSI+OworICBkZWYgaW50X3NwdV9zaV9hbmRjOiAgICAgICAgICB2NGkzMl9ycjwiYW5kYyI+OworICBkZWYgaW50X3NwdV9zaV9hbmRoaTogICAgICAgICB2OGkxNl9zMTBpbW08ImFuZGhpIj47CisgIGRlZiBpbnRfc3B1X3NpX2FuZGk6ICAgICAgICAgIHY0aTMyX3MxMGltbTwiYW5kaSI+OworICAKKyAgZGVmIGludF9zcHVfc2lfb3I6ICAgICAgICAgICAgdjRpMzJfcnI8Im9yIj47CisgIGRlZiBpbnRfc3B1X3NpX29yYmk6ICAgICAgICAgIHYxNmk4X3U4aW1tPCJvcmJpIj47CisgIGRlZiBpbnRfc3B1X3NpX29yYzogICAgICAgICAgIHY0aTMyX3JyPCJvcmMiPjsKKyAgZGVmIGludF9zcHVfc2lfb3JoaTogICAgICAgICAgdjhpMTZfczEwaW1tPCJvcmhpIj47CisgIGRlZiBpbnRfc3B1X3NpX29yaTogICAgICAgICAgIHY0aTMyX3MxMGltbTwib3JpIj47CisgIAorICBkZWYgaW50X3NwdV9zaV94b3I6ICAgICAgICAgICB2NGkzMl9ycjwieG9yIj47CisgIGRlZiBpbnRfc3B1X3NpX3hvcmJpOiAgICAgICAgIHYxNmk4X3U4aW1tPCJ4b3JiaSI+OworICBkZWYgaW50X3NwdV9zaV94b3JoaTogICAgICAgICB2OGkxNl9zMTBpbW08InhvcmhpIj47CisgIGRlZiBpbnRfc3B1X3NpX3hvcmk6ICAgICAgICAgIHY0aTMyX3MxMGltbTwieG9yaSI+OworCisgIGRlZiBpbnRfc3B1X3NpX25vcjogICAgICAgICAgIHY0aTMyX3JyPCJub3IiPjsKKyAgZGVmIGludF9zcHVfc2lfbmFuZDogICAgICAgICAgdjRpMzJfcnI8Im5hbmQiPjsKKyAgCisgIGRlZiBpbnRfc3B1X3NpX2ZhOiAgICAgICAgICAgIHY0ZjMyX3JyPCJmYSI+OworICBkZWYgaW50X3NwdV9zaV9mczogICAgICAgICAgICB2NGYzMl9ycjwiZnMiPjsKKyAgZGVmIGludF9zcHVfc2lfZm06ICAgICAgICAgICAgdjRmMzJfcnI8ImZtIj47CisgIAorICBkZWYgaW50X3NwdV9zaV9mY2VxOiAgICAgICAgICB2NGYzMl9ycjwiZmNlcSI+OworICBkZWYgaW50X3NwdV9zaV9mY21lcTogICAgICAgICB2NGYzMl9ycjwiZmNtZXEiPjsKKyAgZGVmIGludF9zcHVfc2lfZmNndDogICAgICAgICAgdjRmMzJfcnI8ImZjZ3QiPjsKKyAgZGVmIGludF9zcHVfc2lfZmNtZ3Q6ICAgICAgICAgdjRmMzJfcnI8ImZjbWd0Ij47CisgIAorICBkZWYgaW50X3NwdV9zaV9mbWE6ICAgICAgICAgICB2NGYzMl9ycnI8ImZtYSI+OworICBkZWYgaW50X3NwdV9zaV9mbm1zOiAgICAgICAgICB2NGYzMl9ycnI8ImZubXMiPjsKKyAgZGVmIGludF9zcHVfc2lfZm1zOiAgICAgICAgICAgdjRmMzJfcnJyPCJmbXMiPjsKKworICBkZWYgaW50X3NwdV9zaV9kZmE6ICAgICAgICAgICB2MmY2NF9ycjwiZGZhIj47CisgIGRlZiBpbnRfc3B1X3NpX2RmczogICAgICAgICAgIHYyZjY0X3JyPCJkZnMiPjsKKyAgZGVmIGludF9zcHVfc2lfZGZtOiAgICAgICAgICAgdjJmNjRfcnI8ImRmbSI+OworICAKKy8vZGVmIGludF9zcHVfc2lfZGZjZXE6ICAgICAgICAgdjJmNjRfcnI8ImRmY2VxIj47CisvL2RlZiBpbnRfc3B1X3NpX2RmY21lcTogICAgICAgIHYyZjY0X3JyPCJkZmNtZXEiPjsKKy8vZGVmIGludF9zcHVfc2lfZGZjZ3Q6ICAgICAgICAgdjJmNjRfcnI8ImRmY2d0Ij47CisvL2RlZiBpbnRfc3B1X3NpX2RmY21ndDogICAgICAgIHYyZjY0X3JyPCJkZmNtZ3QiPjsKKyAgCisgIGRlZiBpbnRfc3B1X3NpX2Rmbm1hOiAgICAgICAgIHYyZjY0X3JyPCJkZm5tYSI+OworICBkZWYgaW50X3NwdV9zaV9kZm1hOiAgICAgICAgICB2MmY2NF9ycjwiZGZtYSI+OworICBkZWYgaW50X3NwdV9zaV9kZm5tczogICAgICAgICB2MmY2NF9ycjwiZGZubXMiPjsKKyAgZGVmIGludF9zcHVfc2lfZGZtczogICAgICAgICAgdjJmNjRfcnI8ImRmbXMiPjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9JbnRyaW5zaWNzUG93ZXJQQy50ZCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9JbnRyaW5zaWNzUG93ZXJQQy50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzk5NGRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NQb3dlclBDLnRkCkBAIC0wLDAgKzEsNDY1IEBACisvLz09PS0gSW50cmluc2ljc1Bvd2VyUEMudGQgLSBEZWZpbmVzIFBvd2VyUEMgaW50cmluc2ljcyAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBQb3dlclBDLXNwZWNpZmljIGludHJpbnNpY3MuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRGVmaW5pdGlvbnMgZm9yIGFsbCBQb3dlclBDIGludHJpbnNpY3MuDQorLy8NCisNCisvLyBOb24tYWx0aXZlYyBpbnRyaW5zaWNzLg0KK2xldCBUYXJnZXRQcmVmaXggPSAicHBjIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLg0KKyAgLy8gZGNiYS9kY2JmL2RjYmkvZGNic3QvZGNidC9kY2J6L2RjYnpsKFBQQzk3MCkgaW5zdHJ1Y3Rpb25zLg0KKyAgZGVmIGludF9wcGNfZGNiYSAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsNCisgIGRlZiBpbnRfcHBjX2RjYmYgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47DQorICBkZWYgaW50X3BwY19kY2JpICA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+Ow0KKyAgZGVmIGludF9wcGNfZGNic3QgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsNCisgIGRlZiBpbnRfcHBjX2RjYnQgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47DQorICBkZWYgaW50X3BwY19kY2J0c3Q6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+Ow0KKyAgZGVmIGludF9wcGNfZGNieiAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsNCisgIGRlZiBpbnRfcHBjX2RjYnpsIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47DQorDQorICAvLyBzeW5jIGluc3RydWN0aW9uDQorICBkZWYgaW50X3BwY19zeW5jIDogSW50cmluc2ljPFtdLCBbXSwgW10+Ow0KK30NCisNCisNCitsZXQgVGFyZ2V0UHJlZml4ID0gInBwYyIgaW4geyAgLy8gQWxsIFBQQyBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuDQorICAvLy8gUG93ZXJQQ19WZWNfSW50cmluc2ljIC0gQmFzZSBjbGFzcyBmb3IgYWxsIGFsdGl2ZWMgaW50cmluc2ljcy4NCisgIGNsYXNzIFBvd2VyUENfVmVjX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4LCBsaXN0PExMVk1UeXBlPiByZXRfdHlwZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxMTFZNVHlwZT4gcGFyYW1fdHlwZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxJbnRyaW5zaWNQcm9wZXJ0eT4gcHJvcGVydGllcz4NCisgICAgOiBHQ0NCdWlsdGluPCFzdHJjb25jYXQoIl9fYnVpbHRpbl9hbHRpdmVjXyIsIEdDQ0ludFN1ZmZpeCk+LA0KKyAgICAgIEludHJpbnNpYzxyZXRfdHlwZXMsIHBhcmFtX3R5cGVzLCBwcm9wZXJ0aWVzPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBQb3dlclBDIEFsdGl2ZWMgSW50cmluc2ljIENsYXNzIERlZmluaXRpb25zLg0KKy8vDQorDQorLy8vIFBvd2VyUENfVmVjX0ZGX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyBvbmUgdjRmMzINCisvLy8gdmVjdG9yIGFuZCByZXR1cm5zIG9uZS4gIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuDQorY2xhc3MgUG93ZXJQQ19WZWNfRkZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+DQorICA6IFBvd2VyUENfVmVjX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKy8vLyBQb3dlclBDX1ZlY19GRkZfSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIHR3byB2NGYzMg0KKy8vLyB2ZWN0b3JzIGFuZCByZXR1cm5zIG9uZS4gIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuDQorY2xhc3MgUG93ZXJQQ19WZWNfRkZGX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4Pg0KKyAgOiBQb3dlclBDX1ZlY19JbnRyaW5zaWM8R0NDSW50U3VmZml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorDQorLy8vIFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHYxNmY4DQorLy8vIHZlY3RvcnMgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4NCitjbGFzcyBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+IA0KKyAgOiBQb3dlclBDX1ZlY19JbnRyaW5zaWM8R0NDSW50U3VmZml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorDQorLy8vIFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHY4aTE2DQorLy8vIHZlY3RvcnMgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4NCitjbGFzcyBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+IA0KKyAgOiBQb3dlclBDX1ZlY19JbnRyaW5zaWM8R0NDSW50U3VmZml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorDQorLy8vIFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHY0aTMyDQorLy8vIHZlY3RvcnMgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4NCitjbGFzcyBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+IA0KKyAgOiBQb3dlclBDX1ZlY19JbnRyaW5zaWM8R0NDSW50U3VmZml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBQb3dlclBDIEFsdGl2ZWMgSW50cmluc2ljIERlZmluaXRpb25zLg0KKw0KK2xldCBUYXJnZXRQcmVmaXggPSAicHBjIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLg0KKyAgLy8gRGF0YSBTdHJlYW0gQ29udHJvbC4NCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfZHNzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfZHNzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfZHNzYWxsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfZHNzYWxsIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX2RzdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2RzdCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX2RzdHQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY19kc3R0Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sDQorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfZHN0c3QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY19kc3RzdCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX2RzdHN0dCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2RzdHN0dCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbXT47DQorDQorICAvLyBWU0NSIGFjY2Vzcy4NCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbWZ2c2NyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfbWZ2c2NyIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbXSwgW0ludHJSZWFkTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX210dnNjciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX210dnNjciI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92NGkzMl90eV0sIFtdPjsNCisNCisNCisgIC8vIExvYWRzLiAgVGhlc2UgZG9uJ3QgbWFwIGRpcmVjdGx5IHRvIEdDQyBidWlsdGlucyBiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHRoZQ0KKyAgLy8gc291cmNlIGFkZHJlc3Mgd2l0aCBhIHNpbmdsZSBwb2ludGVyLg0KKyAgZGVmIGludF9wcGNfYWx0aXZlY19sdnggOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX2x2eGwgOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX2x2ZWJ4IDoNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY19sdmVoeCA6DQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbHZld3ggOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtXT47DQorDQorICAvLyBTdG9yZXMuICBUaGVzZSBkb24ndCBtYXAgZGlyZWN0bHkgdG8gR0NDIGJ1aWx0aW5zIGJlY2F1c2UgdGhleSByZXByZXNlbnQgdGhlDQorICAvLyBzb3VyY2UgYWRkcmVzcyB3aXRoIGEgc2luZ2xlIHBvaW50ZXIuDQorICBkZWYgaW50X3BwY19hbHRpdmVjX3N0dnggOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHldLCBbXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3N0dnhsIDoNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY19zdHZlYnggOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92MTZpOF90eSwgbGx2bV9wdHJfdHldLCBbXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3N0dmVoeCA6DQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3B0cl90eV0sIFtdPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfc3R2ZXd4IDoNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+Ow0KKw0KKyAgLy8gQ29tcGFyaXNvbnMgc2V0dGluZyBhIHZlY3Rvci4NCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGJmcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBiZnAiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcWZwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxZnAiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBnZWZwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGdlZnAiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndGZwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnAiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICAgICAgICAgICAgICAgICAgICAgICAgDQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXV3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHN3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3ciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHV3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICAgICAgICAgICAgICAgICAgICAgICAgDQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXVoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHNoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2giPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHVoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXViIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWIiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHNiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2IiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHViIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWIiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorDQorICAvLyBQcmVkaWNhdGUgQ29tcGFyaXNvbnMuICBUaGUgZmlyc3Qgb3BlcmFuZCBzcGVjaWZpZXMgaW50ZXJwcmV0YXRpb24gb2YgQ1I2Lg0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wYmZwX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wYmZwX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0ZjMyX3R5LGxsdm1fdjRmMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxZnBfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcWZwX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0ZjMyX3R5LGxsdm1fdjRmMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGdlZnBfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBnZWZwX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0ZjMyX3R5LGxsdm1fdjRmMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0ZnBfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndGZwX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0ZjMyX3R5LGxsdm1fdjRmMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgICAgICAgICAgICAgICAgICAgICAgICANCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxdXdfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0aTMyX3R5LGxsdm1fdjRpMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0c3dfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3X3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0aTMyX3R5LGxsdm1fdjRpMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0dXdfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0aTMyX3R5LGxsdm1fdjRpMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgICAgICAgICAgICAgICAgICAgICAgICANCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxdWhfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y4aTE2X3R5LGxsdm1fdjhpMTZfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0c2hfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNoX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y4aTE2X3R5LGxsdm1fdjhpMTZfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0dWhfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y4aTE2X3R5LGxsdm1fdjhpMTZfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxdWJfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YxNmk4X3R5LGxsdm1fdjE2aThfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0c2JfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNiX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YxNmk4X3R5LGxsdm1fdjE2aThfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0dWJfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YxNmk4X3R5LGxsdm1fdjE2aThfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gVmVjdG9yIGF2ZXJhZ2UuDQorZGVmIGludF9wcGNfYWx0aXZlY192YXZnc2IgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2YXZnc2IiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZhdmdzaCA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZhdmdzaCI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmF2Z3N3IDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidmF2Z3N3Ij47DQorZGVmIGludF9wcGNfYWx0aXZlY192YXZndWIgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2YXZndWIiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3Zhdmd1aCA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZhdmd1aCI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmF2Z3V3IDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidmF2Z3V3Ij47DQorDQorLy8gVmVjdG9yIG1heGltdW0uDQorZGVmIGludF9wcGNfYWx0aXZlY192bWF4ZnAgOiBQb3dlclBDX1ZlY19GRkZfSW50cmluc2ljPCJ2bWF4ZnAiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZtYXhzYiA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZtYXhzYiI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1heHNoIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidm1heHNoIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192bWF4c3cgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2bWF4c3ciPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZtYXh1YiA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZtYXh1YiI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1heHVoIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidm1heHVoIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192bWF4dXcgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2bWF4dXciPjsNCisNCisvLyBWZWN0b3IgbWluaW11bS4NCitkZWYgaW50X3BwY19hbHRpdmVjX3ZtaW5mcCA6IFBvd2VyUENfVmVjX0ZGRl9JbnRyaW5zaWM8InZtaW5mcCI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1pbnNiIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidm1pbnNiIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192bWluc2ggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2bWluc2giPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZtaW5zdyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZtaW5zdyI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1pbnViIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidm1pbnViIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192bWludWggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2bWludWgiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZtaW51dyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZtaW51dyI+Ow0KKw0KKy8vIFNhdHVyYXRpbmcgYWRkcy4NCitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGR1YnMgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2YWRkdWJzIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192YWRkc2JzIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidmFkZHNicyI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmFkZHVocyA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZhZGR1aHMiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGRzaHMgOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2YWRkc2hzIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192YWRkdXdzIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidmFkZHV3cyI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmFkZHN3cyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZhZGRzd3MiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGRjdXcgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2YWRkY3V3Ij47DQorDQorLy8gU2F0dXJhdGluZyBzdWJzLg0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YnVicyA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZzdWJ1YnMiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJzYnMgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c3Vic2JzIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192c3VidWhzIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidnN1YnVocyI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YnNocyA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZzdWJzaHMiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJ1d3MgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2c3VidXdzIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192c3Vic3dzIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnN1YnN3cyI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YmN1dyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzdWJjdXciPjsNCisNCitsZXQgVGFyZ2V0UHJlZml4ID0gInBwYyIgaW4geyAgLy8gQWxsIFBQQyBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuDQorICAvLyBTYXR1cmF0aW5nIG11bHRpcGx5LWFkZHMuDQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtaGFkZHNocyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtaGFkZHNocyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtaHJhZGRzaHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bWhyYWRkc2hzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1hZGRmcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtYWRkZnAiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192bm1zdWJmcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZubXN1YmZwIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIC8vIFZlY3RvciBNdWx0aXBseSBTdW0gSW50cnVjdGlvbnMuDQorICBkZWYgaW50X3BwY19hbHRpdmVjX3Ztc3VtbWJtIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1zdW1tYm0iPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3Ztc3Vtc2htIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1zdW1zaG0iPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3Ztc3Vtc2hzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1zdW1zaHMiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgDQorICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXN1bXVibSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWJtIj4sDQorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1zdW11aG0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXN1bXVobSI+LA0KKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1zdW11aHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXN1bXVocyI+LA0KKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIC8vIFZlY3RvciBNdWx0aXBseSBJbnRydWN0aW9ucy4NCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bGVzYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxlc2IiPiwNCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsZXNoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bGVzaCI+LA0KKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sDQorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxldWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsZXViIj4sDQorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwNCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bGV1aCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxldWgiPiwNCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKw0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsb3NiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bG9zYiI+LA0KKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sDQorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxvc2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsb3NoIj4sDQorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwNCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bG91YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvdWIiPiwNCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsb3VoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bG91aCI+LA0KKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sDQorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorDQorICAvLyBWZWN0b3IgU3VtIEludHJ1Y3Rpb25zLg0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192c3Vtc3dzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnN1bXN3cyI+LA0KKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192c3VtMnN3cyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZzdW0yc3dzIj4sDQorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZzdW00c2JzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnN1bTRzYnMiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92NGkzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1bTRzaHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192c3VtNHNocyI+LA0KKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y0aTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192c3VtNHVicyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZzdW00dWJzIj4sDQorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjRpMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorDQorICAvLyBPdGhlciBtdWx0aXBsaWVzLg0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192bWxhZGR1aG0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bWxhZGR1aG0iPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgDQorICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKyAgLy8gUGFja3MuDQorICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3B4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrcHgiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnBrc2hzcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Zwa3Noc3MiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnBrc2h1cyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Zwa3NodXMiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnBrc3dzcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Zwa3N3c3MiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnBrc3d1cyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Zwa3N3dXMiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIC8vIHZwa3VodW0gaXMgbG93ZXJlZCB0byBhIHNodWZmbGUuDQorICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3VodXMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGt1aHVzIj4sDQorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICAvLyB2cGt1d3VtIGlzIGxvd2VyZWQgdG8gYSBzaHVmZmxlLg0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGt1d3VzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrdXd1cyI+LA0KKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKw0KKyAgLy8gVW5wYWNrcy4NCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2hweCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtocHgiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2hzYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2IiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2hzaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2giPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2xweCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtscHgiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2xzYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2IiPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2xzaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2giPiwNCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisNCisgIC8vIEZQIDwtPiBpbnRlZ2VyIGNvbnZlcnNpb24uDQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjZnN4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNmc3giPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y2Z1eCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjZnV4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmN0c3hzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmN0c3hzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmN0dXhzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmN0dXhzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnJmaW0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cmZpbSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZyZmluIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnJmaW4iPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192cmZpcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZyZmlwIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnJmaXogOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cmZpeiI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNsICAgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2c2wiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzbG8gIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNsbyI+Ow0KKw0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNsYiAgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c2xiIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192c2xoICA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZzbGgiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzbHcgIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNsdyI+Ow0KKw0KKy8vIFJpZ2h0IFNoaWZ0cy4NCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzciAgIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNyIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192c3JvICA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzcm8iPjsNCisgIA0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNyYiAgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c3JiIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192c3JoICA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZzcmgiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzcncgIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNydyI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNyYWIgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c3JhYiI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNyYWggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2c3JhaCI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNyYXcgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2c3JhdyI+Ow0KKw0KKy8vIFJvdGF0ZXMuDQorZGVmIGludF9wcGNfYWx0aXZlY192cmxiICA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZybGIiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZybGggIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidnJsaCI+Ow0KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJsdyAgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2cmx3Ij47DQorDQorbGV0IFRhcmdldFByZWZpeCA9ICJwcGMiIGluIHsgIC8vIEFsbCBQUEMgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLg0KKyAgLy8gTWlzY2VsbGFuZW91cy4NCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbHZzbCA6DQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3BwY19hbHRpdmVjX2x2c3IgOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGVybSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF9wcGNfYWx0aXZlY192c2VsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnNlbF80c2kiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCANCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorZGVmIGludF9wcGNfYWx0aXZlY192ZXhwdGVmcCAgOiBQb3dlclBDX1ZlY19GRl9JbnRyaW5zaWM8InZleHB0ZWZwIj47DQorZGVmIGludF9wcGNfYWx0aXZlY192bG9nZWZwICAgOiBQb3dlclBDX1ZlY19GRl9JbnRyaW5zaWM8InZsb2dlZnAiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3ZyZWZwICAgICA6IFBvd2VyUENfVmVjX0ZGX0ludHJpbnNpYzwidnJlZnAiPjsNCitkZWYgaW50X3BwY19hbHRpdmVjX3Zyc3FydGVmcCA6IFBvd2VyUENfVmVjX0ZGX0ludHJpbnNpYzwidnJzcXJ0ZWZwIj47DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NYODYudGQgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljc1g4Ni50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTMyMDFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NYODYudGQKQEAgLTAsMCArMSwxNTMyIEBACisvLz09PS0gSW50cmluc2ljc1g4Ni50ZCAtIERlZmluZXMgWDg2IGludHJpbnNpY3MgLS0tLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLw0KKy8vDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgWDg2LXNwZWNpZmljIGludHJpbnNpY3MuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMQ0KKw0KKy8vIEFyaXRobWV0aWMgb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2VfYWRkX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWRkc3MiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX3N1Yl9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3N1YnNzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZV9tdWxfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tdWxzcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfZGl2X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZGl2c3MiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX3NxcnRfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0c3MiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2Vfc3FydF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZV9yY3Bfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3BzcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZV9yY3BfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3BwcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZV9yc3FydF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0c3MiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfcnNxcnRfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydHBzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX21pbl9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnNzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZV9taW5fcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9taW5wcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfbWF4X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4c3MiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX21heF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21heHBzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gQ29tcGFyaXNvbiBvcHMNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZV9jbXBfc3MgOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfY21wX3BzIDoNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX2NvbWllcV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbWllcSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX2NvbWlsdF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbWlsdCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX2NvbWlsZV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbWlsZSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX2NvbWlndF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbWlndCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX2NvbWlnZV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbWlnZSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX2NvbWluZXFfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pbmVxIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfdWNvbWllcV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pZXEiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZV91Y29taWx0X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWlsdCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX3Vjb21pbGVfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taWxlIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfdWNvbWlndF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pZ3QiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZV91Y29taWdlX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWlnZSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX3Vjb21pbmVxX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWluZXEiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorDQorLy8gQ29udmVyc2lvbiBvcHMNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZV9jdnRzczJzaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfY3Z0c3Myc2k2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpNjQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZV9jdnR0c3Myc2kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0c3Myc2kiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZV9jdnR0c3Myc2k2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRzczJzaTY0Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfY3Z0c2kyc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRzaTJzcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX2N2dHNpNjQyc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRzaTY0MnNzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfY3Z0cHMycGkgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJwaSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfY3Z0dHBzMnBpOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMycGkiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX2N2dHBpMnBzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGkycHMiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBTSU1EIGxvYWQgb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2VfbG9hZHVfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9sb2FkdXBzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW1dPjsNCit9DQorDQorLy8gU0lNRCBzdG9yZSBvcHMNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZV9zdG9yZXVfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zdG9yZXVwcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbXT47DQorfQ0KKw0KKy8vIENhY2hlYWJpbGl0eSBzdXBwb3J0IG9wcw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NlX21vdm50X3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW92bnRwcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbXT47DQorICBkZWYgaW50X3g4Nl9zc2Vfc2ZlbmNlIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2ZlbmNlIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47DQorfQ0KKw0KKy8vIENvbnRyb2wgcmVnaXN0ZXIuDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2Vfc3RteGNzciA6DQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsNCisgIGRlZiBpbnRfeDg2X3NzZV9sZG14Y3NyIDoNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+Ow0KK30NCisNCisvLyBNaXNjLg0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NlX21vdm1za19wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21vdm1za3BzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMg0KKw0KKy8vIEZQIGFyaXRobWV0aWMgb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2UyX2FkZF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZHNkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfc3ViX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3Vic2QiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9tdWxfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tdWxzZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX2Rpdl9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2RpdnNkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfc3FydF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRzZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfc3FydF9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfbWluX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWluc2QiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9taW5fcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9taW5wZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX21heF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21heHNkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfbWF4X3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4cGQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBGUCBjb21wYXJpc29uIG9wcw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NlMl9jbXBfc2QgOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX2NtcF9wZCA6DQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWVxX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkZXEiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWx0X3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkbHQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWxlX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkbGUiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWd0X3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkZ3QiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWdlX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkZ2UiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY29taW5lcV9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbWlzZG5lcSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl91Y29taWVxX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWlzZGVxIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3Vjb21pbHRfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taXNkbHQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfdWNvbWlsZV9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pc2RsZSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl91Y29taWd0X3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWlzZGd0Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3Vjb21pZ2Vfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taXNkZ2UiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfdWNvbWluZXFfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taXNkbmVxIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIEludGVnZXIgYXJpdGhtZXRpYyBvcHMuDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2UyX3BhZGRzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkc2IxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcGFkZHNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGRzdzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wYWRkdXNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGR1c2IxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcGFkZHVzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkdXN3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BzdWJzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Vic2IxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wc3Vic193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnN3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHN1YnVzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidXNiMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHN1YnVzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidXN3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcG11bGh1X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHV3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BtdWxoX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHcxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcG11bHVfZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsdWRxMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BtYWRkX3dkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1hZGR3ZDEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wYXZnX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYXZnYjEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wYXZnX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYXZndzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wbWF4dV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1heHViMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BtYXhzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWF4c3cxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcG1pbnVfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtaW51YjEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wbWluc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1pbnN3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BzYWRfYncgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2FkYncxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YxNmk4X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCit9DQorDQorLy8gSW50ZWdlciBzaGlmdCBvcHMuDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2UyX3BzbGxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNsbF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbGQxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wc2xsX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xscTEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BzcmxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNybF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybGQxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wc3JsX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JscTEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BzcmFfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNyYV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYWQxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKyAgZGVmIGludF94ODZfc3NlMl9wc2xsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHdpMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BzbGxpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsZGkxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNsbGlfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxxaTEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wc3JsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHdpMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BzcmxpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsZGkxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNybGlfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxxaTEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wc3JhaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXdpMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BzcmFpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhZGkxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNsbF9kcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxkcWkxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNybF9kcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxkcWkxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNsbF9kcV9icyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxkcWkxMjhfYnl0ZXNoaWZ0Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BzcmxfZHFfYnMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsZHFpMTI4X2J5dGVzaGlmdCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBJbnRlZ2VyIGNvbXBhcmlzb24gb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2UyX3BjbXBlcV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVxYjEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BjbXBlcV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVxdzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BjbXBlcV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVxZDEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BjbXBndF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGd0YjEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BjbXBndF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGd0dzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BjbXBndF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGd0ZDEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIENvbnZlcnNpb24gb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2UyX2N2dGRxMnBkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0ZHEycGQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9jdnRkcTJwcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0cGQyZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJkcSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX2N2dHRwZDJkcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJkcSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX2N2dHBkMnBzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQycHMiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9jdnRwczJkcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0dHBzMmRxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0cHMycGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJwZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX2N2dHNkMnNpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0c2Qyc2kiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0c2Qyc2k2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNkMnNpNjQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0dHNkMnNpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHNkMnNpIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX2N2dHRzZDJzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHNkMnNpNjQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0c2kyc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRzaTJzZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9jdnRzaTY0MnNkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0c2k2NDJzZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9jdnRzZDJzcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNkMnNzIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0c3Myc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRzczJzZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfY3Z0cGQycGkgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJwaSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTMyX3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2VfY3Z0dHBkMnBpOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQycGkiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmkzMl90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlX2N2dHBpMnBkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGkycGQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyaTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBTSU1EIGxvYWQgb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2UyX2xvYWR1X3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbG9hZHVwZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX2xvYWR1X2RxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbG9hZGRxdSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtXT47DQorfQ0KKw0KKy8vIFNJTUQgc3RvcmUgb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2UyX3N0b3JldV9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3N0b3JldXBkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfc3RvcmV1X2RxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3RvcmVkcXUiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW10+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9zdG9yZWxfZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zdG9yZWx2NHNpIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtdPjsNCit9DQorDQorLy8gQ2FjaGVhYmlsaXR5IHN1cHBvcnQgb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2UyX21vdm50X2RxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW92bnRkcSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX21vdm50X3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW92bnRwZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX21vdm50X2kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb3ZudGkiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtdPjsNCit9DQorDQorLy8gTWlzYy4NCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZTJfcGFja3Nzd2JfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3Nzd2IxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3Y4aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9wYWNrc3Nkd18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjRpMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UyX3BhY2t1c3diXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfbW92bXNrX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW92bXNrcGQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfcG1vdm1za2JfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdm1za2IxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfbWFza21vdl9kcXUgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbW92ZHF1Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3YxNmk4X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBsbHZtX3B0cl90eV0sIFtdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfY2xmbHVzaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NsZmx1c2giPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+Ow0KKyAgZGVmIGludF94ODZfc3NlMl9sZmVuY2UgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9sZmVuY2UiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTJfbWZlbmNlIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWZlbmNlIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMw0KKw0KKy8vIEFkZGl0aW9uIC8gc3VidHJhY3Rpb24gb3BzLg0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NlM19hZGRzdWJfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRzdWJwcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UzX2FkZHN1Yl9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZHN1YnBkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gSG9yaXpvbnRhbCBvcHMuDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2UzX2hhZGRfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9oYWRkcHMiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlM19oYWRkX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaGFkZHBkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTNfaHN1Yl9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hzdWJwcyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2UzX2hzdWJfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9oc3VicGQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBTcGVjaWFsaXplZCB1bmFsaWduZWQgbG9hZC4NCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZTNfbGR1X2RxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbGRkcXUiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbV0+Ow0KK30NCisNCisvLyBUaHJlYWQgc3luY2hyb25pemF0aW9uIG9wcy4NCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZTNfbW9uaXRvciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21vbml0b3IiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47DQorICBkZWYgaW50X3g4Nl9zc2UzX213YWl0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbXdhaXQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtdPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU1NFMw0KKw0KKy8vIEhvcml6b250YWwgYXJpdGhtZXRpYyBvcHMNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BoYWRkX3cgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BoYWRkdyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTE2X3R5XSwgW2xsdm1fdjRpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc3NlM19waGFkZF93XzEyOCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waGFkZHcxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKyAgZGVmIGludF94ODZfc3NzZTNfcGhhZGRfZCAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhhZGRkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpMzJfdHldLCBbbGx2bV92MmkzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BoYWRkX2RfMTI4ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BoYWRkZDEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9zc3NlM19waGFkZF9zdyAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waGFkZHN3Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BoYWRkX3N3XzEyOCAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BoYWRkc3cxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKyAgZGVmIGludF94ODZfc3NzZTNfcGhzdWJfdyAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhzdWJ3Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3Boc3ViX3dfMTI4ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Boc3VidzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9zc3NlM19waHN1Yl9kICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waHN1YmQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmkzMl90eV0sIFtsbHZtX3YyaTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NzZTNfcGhzdWJfZF8xMjggICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhzdWJkMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3Boc3ViX3N3ICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Boc3Vic3ciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxNl90eV0sIFtsbHZtX3Y0aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTE2X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NzZTNfcGhzdWJfc3dfMTI4ICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhzdWJzdzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9zc3NlM19wbWFkZF91Yl9zdyAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWFkZHVic3ciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxNl90eV0sIFtsbHZtX3Y0aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTE2X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NzZTNfcG1hZGRfdWJfc3dfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1hZGR1YnN3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gUGFja2VkIG11bHRpcGx5IGhpZ2ggd2l0aCByb3VuZCBhbmQgc2NhbGUNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BtdWxfaHJfc3cgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxocnN3Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9zc3NlM19wbXVsX2hyX3N3XzEyOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KK30NCisNCisvLyBTaHVmZmxlIG9wcw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NzZTNfcHNodWZfYiAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNodWZiIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpOF90eV0sIFtsbHZtX3Y4aThfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpOF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BzaHVmX2JfMTI4ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaHVmYjEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFNpZ24gb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc3NlM19wc2lnbl9iICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2lnbmIiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwgW2xsdm1fdjhpOF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NzZTNfcHNpZ25fYl8xMjggICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNpZ25iMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BzaWduX3cgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaWdudyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTE2X3R5XSwgW2xsdm1fdjRpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc3NlM19wc2lnbl93XzEyOCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2lnbncxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKyAgZGVmIGludF94ODZfc3NzZTNfcHNpZ25fZCAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNpZ25kIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpMzJfdHldLCBbbGx2bV92MmkzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BzaWduX2RfMTI4ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaWduZDEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIEFic29sdXRlIHZhbHVlIG9wcw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NzZTNfcGFic19iICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhYnNiIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpOF90eV0sIFtsbHZtX3Y4aThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc3NlM19wYWJzX2JfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFic2IxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKyAgZGVmIGludF94ODZfc3NzZTNfcGFic193ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhYnN3Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BhYnNfd18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWJzdzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9zc3NlM19wYWJzX2QgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFic2QiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmkzMl90eV0sIFtsbHZtX3YyaTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NzZTNfcGFic19kXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhYnNkMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0U0LjENCisNCisvLyBGUCByb3VuZGluZyBvcHMNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZTQxX3JvdW5kX3NzICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JvdW5kc3MiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3JvdW5kX3BzICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JvdW5kcHMiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3JvdW5kX3NkICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JvdW5kc2QiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3JvdW5kX3BkICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JvdW5kcGQiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gVmVjdG9yIHNpZ24gYW5kIHplcm8gZXh0ZW5kDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2U0MV9wbW92c3hiZCAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3hiZDEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjE2aThfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3Btb3ZzeGJxICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzeGJxMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MTZpOF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfcG1vdnN4YncgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnN4YncxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9wbW92c3hkcSAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3hkcTEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3Btb3ZzeHdkICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzeHdkMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfcG1vdnN4d3EgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnN4d3ExMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y4aTE2X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9wbW92enhiZCAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92enhiZDEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjE2aThfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3Btb3Z6eGJxICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJxMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MTZpOF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfcG1vdnp4YncgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnp4YncxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9wbW92enhkcSAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92enhkcTEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3Btb3Z6eHdkICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdkMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfcG1vdnp4d3EgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnp4d3ExMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y4aTE2X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFZlY3RvciBtaW4gZWxlbWVudA0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NlNDFfcGhtaW5wb3N1dyAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waG1pbnBvc3V3MTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBWZWN0b3IgY29tcGFyZSwgbWluLCBtYXgNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZTQxX3BjbXBlcXEgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlcXEiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGd0cSAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGd0cSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3BtYXhzYiAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYXhzYjEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9wbWF4c2QgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWF4c2QxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfcG1heHVkICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1heHVkMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3BtYXh1dyAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYXh1dzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9wbWluc2IgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWluc2IxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfcG1pbnNkICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1pbnNkMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3BtaW51ZCAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtaW51ZDEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9wbWludXcgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWludXcxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KK30NCisNCisvLyBBZHZhbmNlZCBFbmNyeXB0aW9uIFN0YW5kYXJkIChBRVMpIEluc3RydWN0aW9ucw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYWVzbmlfYWVzaW1jICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWVzaW1jMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYWVzbmlfYWVzZW5jICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWVzZW5jMTI4Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYWVzbmlfYWVzZW5jbGFzdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2VuY2xhc3QxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNkZWMgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNkZWMxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNkZWNsYXN0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWVzZGVjbGFzdDEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2tleWdlbmFzc2lzdCA6DQorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNrZXlnZW5hc3Npc3QxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFZlY3RvciBwYWNrDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2U0MV9wYWNrdXNkdyAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzEyOCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gVmVjdG9yIG11bHRpcGx5DQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2U0MV9wbXVsZHEgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsZHExMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KK30NCisNCisvLyBWZWN0b3IgZXh0cmFjdA0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NlNDFfcGV4dHJiICAgICAgICAgOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfcGV4dHJkICAgICAgICAgOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfcGV4dHJxICAgICAgICAgOg0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfZXh0cmFjdHBzICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHRyYWN0cHMxMjgiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gVmVjdG9yIGluc2VydA0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NlNDFfaW5zZXJ0cHMgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9pbnNlcnRwczEyOCI+LA0KKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSxsbHZtX2kzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFZlY3RvciBibGVuZA0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NlNDFfcGJsZW5kdmIgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BibGVuZHZiMTI4Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSxsbHZtX3YxNmk4X3R5XSwNCisgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9wYmxlbmR3ICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGJsZW5kdzEyOCI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9ibGVuZHBkICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYmxlbmRwZCI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9ibGVuZHBzICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYmxlbmRwcyI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5XSwNCisgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0MV9ibGVuZHZwZCAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYmxlbmR2cGQiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LGxsdm1fdjJmNjRfdHldLA0KKyAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX2JsZW5kdnBzICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ibGVuZHZwcyI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksbGx2bV92NGYzMl90eV0sDQorICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBWZWN0b3IgZG90IHByb2R1Y3QNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZTQxX2RwcGQgICAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2RwcGQiPiwNCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksbGx2bV9pMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX2RwcHMgICAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2RwcHMiPiwNCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksbGx2bV9pMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCit9DQorDQorLy8gVmVjdG9yIHN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfc3NlNDFfbXBzYWRidyAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbXBzYWRidzEyOCI+LA0KKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSxsbHZtX2kzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KK30NCisNCisvLyBDYWNoZWFiaWxpdHkgc3VwcG9ydCBvcHMNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZTQxX21vdm50ZHFhICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21vdm50ZHFhIj4sDQorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbV0+Ow0KK30NCisNCisvLyBUZXN0IGluc3RydWN0aW9uIHdpdGggYml0d2lzZSBjb21wYXJpc29uLg0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7IC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9zc2U0MV9wdGVzdHogICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVzdHoxMjgiPiwNCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQxX3B0ZXN0YyAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXN0YzEyOCI+LA0KKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLA0KKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDFfcHRlc3RuemMgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlc3RuemMxMjgiPiwNCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwNCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0U0LjINCisNCisvLyBNaXNjZWxsYW5lb3VzDQorLy8gQ1JDIEluc3RydWN0aW9uDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZTQyX2NyYzMyXzggICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NyYzMycWkiPiwNCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sDQorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0Ml9jcmMzMl8xNiAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3JjMzJoaSI+LA0KKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sDQorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0Ml9jcmMzMl8zMiAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3JjMzJzaSI+LA0KKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sDQorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0Ml9jcmM2NF84ICAgICAgICAgOg0KKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k4X3R5XSwNCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX2NyYzY0XzY0ICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jcmMzMmRpIj4sDQorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwNCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gU3RyaW5nL3RleHQgcHJvY2Vzc2luZyBvcHMuDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RybTEyOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cm0xMjgiPiwNCisJICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLA0KKwkJICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwNCisJCSAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21waXN0cmkxMjggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGlzdHJpMTI4Ij4sDQorCSAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sDQorCQkgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLA0KKwkJICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaWExMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cmlhMTI4Ij4sDQorCSAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sDQorCQkgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLA0KKwkJICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaWMxMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cmljMTI4Ij4sDQorCSAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sDQorCQkgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLA0KKwkJICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaW8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cmlvMTI4Ij4sDQorCSAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sDQorCQkgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLA0KKwkJICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaXMxMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cmlzMTI4Ij4sDQorCSAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sDQorCQkgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLA0KKwkJICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaXoxMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cml6MTI4Ij4sDQorCSAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sDQorCQkgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLA0KKwkJICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBlc3RybTEyOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZXN0cm0xMjgiPiwNCisJICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLA0KKwkJICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksDQorCQkgICAgIGxsdm1faThfdHldLA0KKwkJICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaTEyOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZXN0cmkxMjgiPiwNCisJICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwNCisJCSAgICBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LA0KKwkJICAgICBsbHZtX2k4X3R5XSwNCisJCSAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21wZXN0cmlhMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVzdHJpYTEyOCI+LA0KKwkgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLA0KKwkJICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksDQorCQkgICAgIGxsdm1faThfdHldLA0KKwkJICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaWMxMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZXN0cmljMTI4Ij4sDQorCSAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sDQorCQkgICAgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwNCisJCSAgICAgbGx2bV9pOF90eV0sDQorCQkgICAgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGVzdHJpbzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaW8xMjgiPiwNCisJICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwNCisJCSAgICBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LA0KKwkJICAgICBsbHZtX2k4X3R5XSwNCisJCSAgICBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21wZXN0cmlzMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVzdHJpczEyOCI+LA0KKwkgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLA0KKwkJICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksDQorCQkgICAgIGxsdm1faThfdHldLA0KKwkJICAgIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaXoxMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZXN0cml6MTI4Ij4sDQorCSAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sDQorCQkgICAgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwNCisJCSAgICAgbGx2bV9pOF90eV0sDQorCQkgICAgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEFWWA0KKw0KKy8vIEFyaXRobWV0aWMgb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9hdnhfYWRkc3ViX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZHN1YnBkMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X2FkZHN1Yl9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRzdWJwczI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9tYXhfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4cGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfbWF4X3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21heHBzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X21pbl9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9taW5wZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9taW5fcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWlucHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9hdnhfc3FydF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0cGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3NxcnRfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3FydHBzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X2F2eF9zcXJ0X3BzX25yXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwc19ucjI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9hdnhfcnNxcnRfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnRwczI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfcnNxcnRfcHNfbnJfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnRwc19ucjI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9hdnhfcmNwX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JjcHBzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X2F2eF9yb3VuZF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yb3VuZHBkMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9yb3VuZF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yb3VuZHBzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gSG9yaXpvbnRhbCBvcHMNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X2F2eF9oYWRkX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hhZGRwZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9oc3ViX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hzdWJwczI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9oc3ViX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hzdWJwZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9oYWRkX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hhZGRwczI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gVmVjdG9yIHBlcm11dGF0aW9uDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9hdnhfdnBlcm1pbHZhcl9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZCI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF92cGVybWlsdmFyX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBzIj4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKyAgZGVmIGludF94ODZfYXZ4X3ZwZXJtaWx2YXJfcGRfMjU2IDoNCisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRpNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdnBlcm1pbHZhcl9wc18yNTYgOg0KKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwgbGx2bV92OGkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X2F2eF92cGVybTJmMTI4X3BkXzI1NiA6DQorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybTJmMTI4X3BkMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3ZwZXJtMmYxMjhfcHNfMjU2IDoNCisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfcHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdnBlcm0yZjEyOF9zaV8yNTYgOg0KKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm0yZjEyOF9zaTI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X2F2eF92cGVybWlsX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pbHBkIj4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3ZwZXJtaWxfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlscHMiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9hdnhfdnBlcm1pbF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlscGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdnBlcm1pbF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlscHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFZlY3RvciBibGVuZA0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X2JsZW5kX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2JsZW5kcGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X2JsZW5kX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2JsZW5kcHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X2JsZW5kdl9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ibGVuZHZwZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9ibGVuZHZfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYmxlbmR2cHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFZlY3RvciBkb3QgcHJvZHVjdA0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X2RwX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2RwcHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBWZWN0b3IgY29tcGFyZQ0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X2NtcF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jbXBwZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9jbXBfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY21wcHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFZlY3RvciBleHRyYWN0IGFuZCBpbnNlcnQNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X2F2eF92ZXh0cmFjdGYxMjhfcGRfMjU2IDoNCisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZleHRyYWN0ZjEyOF9wZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdmV4dHJhY3RmMTI4X3BzXzI1NiA6DQorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92ZXh0cmFjdGYxMjhfcHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3ZleHRyYWN0ZjEyOF9zaV8yNTYgOg0KKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmV4dHJhY3RmMTI4X3NpMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X2F2eF92aW5zZXJ0ZjEyOF9wZF8yNTYgOg0KKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmluc2VydGYxMjhfcGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdmluc2VydGYxMjhfcHNfMjU2IDoNCisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZpbnNlcnRmMTI4X3BzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3ZpbnNlcnRmMTI4X3NpXzI1NiA6DQorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92aW5zZXJ0ZjEyOF9zaTI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gVmVjdG9yIGNvbnZlcnQNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X2F2eF9jdnRkcTJfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0ZHEycGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X2N2dGRxMl9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRkcTJwczI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhpMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfY3Z0X3BkMl9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJwczI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfY3Z0X3BzMmRxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9jdnRfcHMyX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMnBkMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9jdnR0X3BkMmRxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJkcTI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfY3Z0X3BkMmRxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9jdnR0X3BzMmRxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfc2lfMjU2X3NpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2kyNTZfc2kiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3BzXzI1Nl9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzMjU2X3BzIj4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9wZF8yNTZfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZDI1Nl9wZCI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfc2lfc2lfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2lfc2kyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3BzX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzX3BzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9wZF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZF9wZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFZlY3RvciB1bnBhY2sgYW5kIGludGVybGVhdmUNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X2F2eF91bnBja2hfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdW5wY2tocGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdW5wY2tsX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3VucGNrbHBkMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3VucGNraF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91bnBja2hwczI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF91bnBja2xfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdW5wY2tscHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFZlY3RvciBiaXQgdGVzdA0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0el9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkIj4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdGNfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdGNwZCI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdnRlc3RuemNfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BkIj4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdHpfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdHpwcyI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdnRlc3RjX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3RjcHMiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0bnpjX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3RuemNwcyI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdnRlc3R6X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdGNfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3RjcGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGY2NF90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0bnpjX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGY2NF90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0el9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdHpwczI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdnRlc3RjX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjhmMzJfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdG56Y19wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjhmMzJfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9wdGVzdHpfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlc3R6MjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9wdGVzdGNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlc3RjMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpNjRfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9wdGVzdG56Y18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVzdG56YzI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0aTY0X3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIFZlY3RvciBleHRyYWN0IHNpZ24gbWFzaw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X21vdm1za19wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb3Ztc2twZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X21vdm1za19wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb3Ztc2twczI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBWZWN0b3IgemVybw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X3Z6ZXJvYWxsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnplcm9hbGwiPiwNCisgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsNCisgIGRlZiBpbnRfeDg2X2F2eF92emVyb3VwcGVyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnplcm91cHBlciI+LA0KKyAgICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+Ow0KK30NCisNCisvLyBWZWN0b3IgbG9hZCB3aXRoIGJyb2FkY2FzdA0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X3Zicm9hZGNhc3RzcyA6DQorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0c3MiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3Zicm9hZGNhc3Rfc2RfMjU2IDoNCisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3RzZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdmJyb2FkY2FzdHNzXzI1NiA6DQorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0c3MyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3Zicm9hZGNhc3RmMTI4X3BkXzI1NiA6DQorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0ZjEyOF9wZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfdmJyb2FkY2FzdGYxMjhfcHNfMjU2IDoNCisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3RmMTI4X3BzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW1dPjsNCit9DQorDQorLy8gU0lNRCBsb2FkIG9wcw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X2xvYWR1X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2xvYWR1cGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X2xvYWR1X3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2xvYWR1cHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X2xvYWR1X2RxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2xvYWRkcXUyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbV0+Ow0KKyAgZGVmIGludF94ODZfYXZ4X2xkdV9kcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9sZGRxdTI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtXT47DQorfQ0KKw0KKy8vIFNJTUQgc3RvcmUgb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9hdnhfc3RvcmV1X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3N0b3JldXBkMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92NGY2NF90eV0sIFtdPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9zdG9yZXVfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3RvcmV1cHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4ZjMyX3R5XSwgW10+Ow0KKyAgZGVmIGludF94ODZfYXZ4X3N0b3JldV9kcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zdG9yZWRxdTI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjMyaThfdHldLCBbXT47DQorfQ0KKw0KKy8vIENhY2hlYWJpbGl0eSBzdXBwb3J0IG9wcw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X21vdm50X2RxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21vdm50ZHEyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5XSwgW10+Ow0KKyAgZGVmIGludF94ODZfYXZ4X21vdm50X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21vdm50cGQyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0ZjY0X3R5XSwgW10+Ow0KKyAgZGVmIGludF94ODZfYXZ4X21vdm50X3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21vdm50cHMyNTYiPiwNCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4ZjMyX3R5XSwgW10+Ow0KK30NCisNCisvLyBDb25kaXRpb25hbCBsb2FkIG9wcw0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgZGVmIGludF94ODZfYXZ4X21hc2tsb2FkX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza2xvYWRwZCI+LA0KKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJSZWFkTWVtXT47DQorICBkZWYgaW50X3g4Nl9hdnhfbWFza2xvYWRfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBzIj4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50clJlYWRNZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9tYXNrbG9hZF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBkMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjRmNjRfdHldLCBbSW50clJlYWRNZW1dPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9tYXNrbG9hZF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjhmMzJfdHldLCBbSW50clJlYWRNZW1dPjsNCit9DQorDQorLy8gQ29uZGl0aW9uYWwgc3RvcmUgb3BzDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICBkZWYgaW50X3g4Nl9hdnhfbWFza3N0b3JlX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza3N0b3JlcGQiPiwNCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbXT47DQorICBkZWYgaW50X3g4Nl9hdnhfbWFza3N0b3JlX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza3N0b3JlcHMiPiwNCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LA0KKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbXT47DQorICBkZWYgaW50X3g4Nl9hdnhfbWFza3N0b3JlX3BkXzI1NiA6DQorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwZDI1NiI+LA0KKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksDQorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eV0sIFtdPjsNCisgIGRlZiBpbnRfeDg2X2F2eF9tYXNrc3RvcmVfcHNfMjU2IDoNCisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBzMjU2Ij4sDQorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwNCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5XSwgW10+Ow0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIE1NWA0KKw0KKy8vIEVtcHR5IE1NWCBzdGF0ZSBvcC4NCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X21teF9lbW1zICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2VtbXMiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsNCisgIGRlZiBpbnRfeDg2X21teF9mZW1tcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZlbW1zIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47DQorfQ0KKw0KKy8vIEludGVnZXIgYXJpdGhtZXRpYyBvcHMuDQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuDQorICAvLyBBZGRpdGlvbg0KKyAgZGVmIGludF94ODZfbW14X3BhZGRzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkc2IiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwgW2xsdm1fdjhpOF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCisgIGRlZiBpbnRfeDg2X21teF9wYWRkc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHN3Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorDQorICBkZWYgaW50X3g4Nl9tbXhfcGFkZHVzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkdXNiIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpOF90eV0sIFtsbHZtX3Y4aThfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpOF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9tbXhfcGFkZHVzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkdXN3Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorDQorICAvLyBTdWJ0cmFjdGlvbg0KKyAgZGVmIGludF94ODZfbW14X3BzdWJzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Vic2IiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwgW2xsdm1fdjhpOF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BzdWJzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Vic3ciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxNl90eV0sIFtsbHZtX3Y0aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTE2X3R5XSwgW0ludHJOb01lbV0+Ow0KKw0KKyAgZGVmIGludF94ODZfbW14X3BzdWJ1c19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnVzYiI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aThfdHldLCBbbGx2bV92OGk4X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aThfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9tbXhfcHN1YnVzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidXN3Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIC8vIE11bHRpcGxpY2F0aW9uDQorICBkZWYgaW50X3g4Nl9tbXhfcG11bGhfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxodyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTE2X3R5XSwgW2xsdm1fdjRpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BtdWxodV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bGh1dyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTE2X3R5XSwgW2xsdm1fdjRpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BtdWx1X2RxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bHVkcSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTMyX3R5XSwgW2xsdm1fdjJpMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpMzJfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BtYWRkX3dkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1hZGR3ZCI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTMyX3R5XSwgW2xsdm1fdjRpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKw0KKyAgLy8gQXZlcmFnZXMNCisgIGRlZiBpbnRfeDg2X21teF9wYXZnX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYXZnYiI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aThfdHldLCBbbGx2bV92OGk4X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aThfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BhdmdfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bhdmd3Ij4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorDQorICAvLyBNYXhpbXVtDQorICBkZWYgaW50X3g4Nl9tbXhfcG1heHVfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYXh1YiI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aThfdHldLCBbbGx2bV92OGk4X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aThfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BtYXhzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWF4c3ciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxNl90eV0sIFtsbHZtX3Y0aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsNCisNCisgIC8vIE1pbmltdW0NCisgIGRlZiBpbnRfeDg2X21teF9wbWludV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1pbnViIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpOF90eV0sIFtsbHZtX3Y4aThfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpOF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorICBkZWYgaW50X3g4Nl9tbXhfcG1pbnNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtaW5zdyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTE2X3R5XSwgW2xsdm1fdjRpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+Ow0KKw0KKyAgLy8gUGFja2VkIHN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcw0KKyAgZGVmIGludF94ODZfbW14X3BzYWRfYncgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2FkYnciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxNl90eV0sIFtsbHZtX3Y4aThfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpOF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47DQorfQ0KKw0KKy8vIEludGVnZXIgc2hpZnQgb3BzLg0KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLg0KKyAgLy8gU2hpZnQgbGVmdCBsb2dpY2FsDQorICBkZWYgaW50X3g4Nl9tbXhfcHNsbF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxNl90eV0sIFtsbHZtX3Y0aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxaTY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BzbGxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpMzJfdHldLCBbbGx2bV92MmkzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MWk2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X21teF9wc2xsX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xscSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxaTY0X3R5XSwgW2xsdm1fdjFpNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjFpNjRfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9tbXhfcHNybF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxNl90eV0sIFtsbHZtX3Y0aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxaTY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BzcmxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpMzJfdHldLCBbbGx2bV92MmkzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MWk2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisgIGRlZiBpbnRfeDg2X21teF9wc3JsX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JscSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxaTY0X3R5XSwgW2xsdm1fdjFpNjRfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjFpNjRfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9tbXhfcHNyYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxNl90eV0sIFtsbHZtX3Y0aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxaTY0X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BzcmFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpMzJfdHldLCBbbGx2bV92MmkzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MWk2NF90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X21teF9wc2xsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHdpIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9tbXhfcHNsbGlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxkaSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTMyX3R5XSwgW2xsdm1fdjJpMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BzbGxpX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xscWkiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MWk2NF90eV0sIFtsbHZtX3YxaTY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X21teF9wc3JsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHdpIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9tbXhfcHNybGlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxkaSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTMyX3R5XSwgW2xsdm1fdjJpMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BzcmxpX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JscWkiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MWk2NF90eV0sIFtsbHZtX3YxaTY0X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X21teF9wc3JhaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXdpIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGkxNl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9tbXhfcHNyYWlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFkaSI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTMyX3R5XSwgW2xsdm1fdjJpMzJfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KK30NCisNCisvLyBQYWNrIG9wcy4NCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X21teF9wYWNrc3N3YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2tzc3diIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpOF90eV0sIFtsbHZtX3Y0aTE2X3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTE2X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BhY2tzc2R3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3NzZHciPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxNl90eV0sIFtsbHZtX3YyaTMyX3R5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTMyX3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BhY2t1c3diIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3Vzd2IiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwgW2xsdm1fdjRpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtXT47DQorfQ0KKw0KKy8vIEludGVnZXIgY29tcGFyaXNvbiBvcHMNCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X21teF9wY21wZXFfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlcWIiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwgW2xsdm1fdjhpOF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BjbXBlcV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVxdyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTE2X3R5XSwgW2xsdm1fdjRpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9tbXhfcGNtcGVxX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZXFkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpMzJfdHldLCBbbGx2bV92MmkzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCisNCisgIGRlZiBpbnRfeDg2X21teF9wY21wZ3RfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBndGIiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwgW2xsdm1fdjhpOF90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk4X3R5XSwgW0ludHJOb01lbV0+Ow0KKyAgZGVmIGludF94ODZfbW14X3BjbXBndF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGd0dyI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTE2X3R5XSwgW2xsdm1fdjRpMTZfdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtXT47DQorICBkZWYgaW50X3g4Nl9tbXhfcGNtcGd0X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZ3RkIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpMzJfdHldLCBbbGx2bV92MmkzMl90eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmkzMl90eV0sIFtJbnRyTm9NZW1dPjsNCit9DQorDQorLy8gTWlzYy4NCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4NCisgIGRlZiBpbnRfeDg2X21teF9tYXNrbW92cSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2ttb3ZxIj4sDQorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwgbGx2bV9wdHJfdHldLCBbXT47DQorDQorICBkZWYgaW50X3g4Nl9tbXhfcG1vdm1za2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92bXNrYiI+LA0KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y4aThfdHldLCBbSW50ck5vTWVtXT47DQorDQorICBkZWYgaW50X3g4Nl9tbXhfbW92bnRfZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb3ZudHEiPiwNCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YxaTY0X3R5XSwgW10+Ow0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vSW50cmluc2ljc1hDb3JlLnRkIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NYQ29yZS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODZjZGEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0ludHJpbnNpY3NYQ29yZS50ZApAQCAtMCwwICsxLDE0IEBACisvLz09LSBJbnRyaW5zaWNzWENvcmUudGQgLSBYQ29yZSBpbnRyaW5zaWNzICAgICAgICAgICAgICAgICAtKi0gdGFibGVnZW4gLSotPT0vLworLy8gCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggWE1PUworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBYQ29yZS1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBUYXJnZXRQcmVmaXggPSAieGNvcmUiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueGNvcmUuIi4KKyAgZGVmIGludF94Y29yZV9iaXRyZXYgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHldLFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94Y29yZV9nZXRpZCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtdLFtJbnRyTm9NZW1dPjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9MTFZNQ29udGV4dC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0xMVk1Db250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiNjU3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9MTFZNQ29udGV4dC5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LS0gbGx2bS9MTFZNQ29udGV4dC5oIC0gQ2xhc3MgZm9yIG1hbmFnaW5nICJnbG9iYWwiIHN0YXRlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIExMVk1Db250ZXh0LCBhIGNvbnRhaW5lciBvZiAiZ2xvYmFsIiBzdGF0ZSBpbiBMTFZNLCBzdWNoCisvLyBhcyB0aGUgZ2xvYmFsIHR5cGUgYW5kIGNvbnN0YW50IHVuaXF1aW5nIHRhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTExWTUNPTlRFWFRfSAorI2RlZmluZSBMTFZNX0xMVk1DT05URVhUX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMTFZNQ29udGV4dEltcGw7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBJbnN0cnVjdGlvbjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CisKKy8vLyBUaGlzIGlzIGFuIGltcG9ydGFudCBjbGFzcyBmb3IgdXNpbmcgTExWTSBpbiBhIHRocmVhZGVkIGNvbnRleHQuICBJdAorLy8vIChvcGFxdWVseSkgb3ducyBhbmQgbWFuYWdlcyB0aGUgY29yZSAiZ2xvYmFsIiBkYXRhIG9mIExMVk0ncyBjb3JlIAorLy8vIGluZnJhc3RydWN0dXJlLCBpbmNsdWRpbmcgdGhlIHR5cGUgYW5kIGNvbnN0YW50IHVuaXF1aW5nIHRhYmxlcy4KKy8vLyBMTFZNQ29udGV4dCBpdHNlbGYgcHJvdmlkZXMgbm8gbG9ja2luZyBndWFyYW50ZWVzLCBzbyB5b3Ugc2hvdWxkIGJlIGNhcmVmdWwKKy8vLyB0byBoYXZlIG9uZSBjb250ZXh0IHBlciB0aHJlYWQuCitjbGFzcyBMTFZNQ29udGV4dCB7CisgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgTExWTUNvbnRleHQoTExWTUNvbnRleHQmKTsKKyAgdm9pZCBvcGVyYXRvcj0oTExWTUNvbnRleHQmKTsKKworcHVibGljOgorICBMTFZNQ29udGV4dEltcGwgKmNvbnN0IHBJbXBsOworICBMTFZNQ29udGV4dCgpOworICB+TExWTUNvbnRleHQoKTsKKyAgCisgIC8vIFBpbm5lZCBtZXRhZGF0YSBuYW1lcywgd2hpY2ggYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUuICBUaGlzIGlzIGEKKyAgLy8gY29tcGlsZS10aW1lIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgbm90IGEgY29ycmVjdG5lc3Mgb3B0aW1pemF0aW9uLgorICBlbnVtIHsKKyAgICBNRF9kYmcgPSAwICAgLy8gImRiZyIKKyAgfTsKKyAgCisgIC8vLyBnZXRNREtpbmRJRCAtIFJldHVybiBhIHVuaXF1ZSBub24temVybyBJRCBmb3IgdGhlIHNwZWNpZmllZCBtZXRhZGF0YSBraW5kLgorICAvLy8gVGhpcyBJRCBpcyB1bmlxdWVkIGFjcm9zcyBtb2R1bGVzIGluIHRoZSBjdXJyZW50IExMVk1Db250ZXh0LgorICB1bnNpZ25lZCBnZXRNREtpbmRJRChTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CisgIAorICAvLy8gZ2V0TURLaW5kTmFtZXMgLSBQb3B1bGF0ZSBjbGllbnQgc3VwcGxpZWQgU21hbGxWZWN0b3Igd2l0aCB0aGUgbmFtZSBmb3IKKyAgLy8vIGN1c3RvbSBtZXRhZGF0YSBJRHMgcmVnaXN0ZXJlZCBpbiB0aGlzIExMVk1Db250ZXh0LgorICB2b2lkIGdldE1ES2luZE5hbWVzKFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZSZXN1bHQpIGNvbnN0OworICAKKyAgLy8vIHNldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyIC0gVGhpcyBtZXRob2Qgc2V0cyBhIGhhbmRsZXIgdGhhdCBpcyBpbnZva2VkCisgIC8vLyB3aGVuIHByb2JsZW1zIHdpdGggaW5saW5lIGFzbSBhcmUgZGV0ZWN0ZWQgYnkgdGhlIGJhY2tlbmQuICBUaGUgZmlyc3QKKyAgLy8vIGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24gcG9pbnRlciAob2YgdHlwZSBTb3VyY2VNZ3I6OkRpYWdIYW5kbGVyVHkpIGFuZCB0aGUKKyAgLy8vIHNlY29uZCBpcyBhIGNvbnRleHQgcG9pbnRlciB0aGF0IGdldHMgcGFzc2VkIGludG8gdGhlIERpYWdIYW5kbGVyLgorICAvLy8KKyAgLy8vIExMVk1Db250ZXh0IGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb3IgaW50ZXJwcmV0ZXIgZWl0aGVyIG9mIHRoZXNlCisgIC8vLyBwb2ludGVycy4KKyAgdm9pZCBzZXRJbmxpbmVBc21EaWFnbm9zdGljSGFuZGxlcih2b2lkICpEaWFnSGFuZGxlciwgdm9pZCAqRGlhZ0NvbnRleHQgPSAwKTsKKworICAvLy8gZ2V0SW5saW5lQXNtRGlhZ25vc3RpY0hhbmRsZXIgLSBSZXR1cm4gdGhlIGRpYWdub3N0aWMgaGFuZGxlciBzZXQgYnkKKyAgLy8vIHNldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyLgorICB2b2lkICpnZXRJbmxpbmVBc21EaWFnbm9zdGljSGFuZGxlcigpIGNvbnN0OworCisgIC8vLyBnZXRJbmxpbmVBc21EaWFnbm9zdGljQ29udGV4dCAtIFJldHVybiB0aGUgZGlhZ25vc3RpYyBjb250ZXh0IHNldCBieQorICAvLy8gc2V0SW5saW5lQXNtRGlhZ25vc3RpY0hhbmRsZXIuCisgIHZvaWQgKmdldElubGluZUFzbURpYWdub3N0aWNDb250ZXh0KCkgY29uc3Q7CisgIAorICAKKyAgLy8vIGVtaXRFcnJvciAtIEVtaXQgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgY3VycmVudGx5IGluc3RhbGxlZCBlcnJvciBoYW5kbGVyCisgIC8vLyB3aXRoIG9wdGlvbmFsIGxvY2F0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zLCBzbyBjb2RlIHNob3VsZAorICAvLy8gYmUgcHJlcGFyZWQgdG8gZHJvcCB0aGUgZXJyb25lb3VzIGNvbnN0cnVjdCBvbiB0aGUgZmxvb3IgYW5kICJub3QgY3Jhc2giLgorICAvLy8gVGhlIGdlbmVyYXRlZCBjb2RlIG5lZWQgbm90IGJlIGNvcnJlY3QuICBUaGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlCisgIC8vLyBpbXBsaWNpdGx5IHByZWZpeGVkIHdpdGggImVycm9yOiAiIGFuZCBzaG91bGQgbm90IGVuZCB3aXRoIGEgIi4iLgorICB2b2lkIGVtaXRFcnJvcih1bnNpZ25lZCBMb2NDb29raWUsIFN0cmluZ1JlZiBFcnJvclN0cik7CisgIHZvaWQgZW1pdEVycm9yKGNvbnN0IEluc3RydWN0aW9uICpJLCBTdHJpbmdSZWYgRXJyb3JTdHIpOworICB2b2lkIGVtaXRFcnJvcihTdHJpbmdSZWYgRXJyb3JTdHIpOworfTsKKworLy8vIGdldEdsb2JhbENvbnRleHQgLSBSZXR1cm5zIGEgZ2xvYmFsIGNvbnRleHQuICBUaGlzIGlzIGZvciBMTFZNIGNsaWVudHMgdGhhdAorLy8vIG9ubHkgY2FyZSBhYm91dCBvcGVyYXRpbmcgb24gYSBzaW5nbGUgdGhyZWFkLgorZXh0ZXJuIExMVk1Db250ZXh0ICZnZXRHbG9iYWxDb250ZXh0KCk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTGlua0FsbFBhc3Nlcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0xpbmtBbGxQYXNzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDVkYjRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0xpbmtBbGxQYXNzZXMuaApAQCAtMCwwICsxLDE2NCBAQAorLy89PT0tIGxsdm0vTGlua0FsbFBhc3Nlcy5oIC0tLS0tLS0tLS0tLSBSZWZlcmVuY2UgQWxsIFBhc3NlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBwdWxscyBpbiBhbGwgdHJhbnNmb3JtYXRpb24gYW5kIGFuYWx5c2lzIHBhc3NlcyBmb3IgdG9vbHMgCisvLyBsaWtlIG9wdCBhbmQgYnVncG9pbnQgdGhhdCBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTElOS0FMTFBBU1NFU19ICisjZGVmaW5lIExMVk1fTElOS0FMTFBBU1NFU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzU2V0VHJhY2tlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9tUHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRmluZFVzZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvSW50ZXJ2YWxQYXJ0aXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUG9pbnRlclRyYWNraW5nLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Qb3N0RG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUmVnaW9uUHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9MaW50LmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9QcmludE1vZHVsZVBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9VbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEZvcmNlUGFzc0xpbmtpbmcgeworICAgIEZvcmNlUGFzc0xpbmtpbmcoKSB7CisgICAgICAvLyBXZSBtdXN0IHJlZmVyZW5jZSB0aGUgcGFzc2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBjb21waWxlcnMgd2lsbCBub3QKKyAgICAgIC8vIGRlbGV0ZSBpdCBhbGwgYXMgZGVhZCBjb2RlLCBldmVuIHdpdGggd2hvbGUgcHJvZ3JhbSBvcHRpbWl6YXRpb24sCisgICAgICAvLyB5ZXQgaXMgZWZmZWN0aXZlbHkgYSBOTy1PUC4gQXMgdGhlIGNvbXBpbGVyIGlzbid0IHNtYXJ0IGVub3VnaAorICAgICAgLy8gdG8ga25vdyB0aGF0IGdldGVudigpIG5ldmVyIHJldHVybnMgLTEsIHRoaXMgd2lsbCBkbyB0aGUgam9iLgorICAgICAgaWYgKHN0ZDo6Z2V0ZW52KCJiYXIiKSAhPSAoY2hhciopIC0xKQorICAgICAgICByZXR1cm47CisKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVBQUV2YWxQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQWdncmVzc2l2ZURDRVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVBbGlhc0FuYWx5c2lzQ291bnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVBbGlhc0RlYnVnZ2VyKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQXJndW1lbnRQcm9tb3Rpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU3RydWN0UmV0UHJvbW90aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJhc2ljQWxpYXNBbmFseXNpc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMaWJDYWxsQWxpYXNBbmFseXNpc1Bhc3MoMCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU2NhbGFyRXZvbHV0aW9uQWxpYXNBbmFseXNpc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVUeXBlQmFzZWRBbGlhc0FuYWx5c2lzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJsb2NrUGxhY2VtZW50UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJyZWFrQ3JpdGljYWxFZGdlc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDb25zdGFudE1lcmdlUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNvbnN0YW50UHJvcGFnYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGVhZEFyZ0VsaW1pbmF0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURlYWRDb2RlRWxpbWluYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGVhZEluc3RFbGltaW5hdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEZWFkU3RvcmVFbGltaW5hdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEZWFkVHlwZUVsaW1pbmF0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURvbU9ubHlQcmludGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURvbVByaW50ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRG9tT25seVZpZXdlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEb21WaWV3ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRWRnZVByb2ZpbGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU9wdGltYWxFZGdlUHJvZmlsZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRnVuY3Rpb25JbmxpbmluZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVBbHdheXNJbmxpbmVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUdsb2JhbERDRVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVHbG9iYWxPcHRpbWl6ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlR2xvYmFsc01vZFJlZlBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJUENvbnN0YW50UHJvcGFnYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSVBTQ0NQUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUluZFZhclNpbXBsaWZ5UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUludGVybmFsaXplUGFzcyhmYWxzZSk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTENTU0FQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTElDTVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMYXp5VmFsdWVJbmZvUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxpdmVWYWx1ZXNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcERlcGVuZGVuY2VBbmFseXNpc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wRXh0cmFjdG9yUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BTaW1wbGlmeVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wU3RyZW5ndGhSZWR1Y2VQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFVucm9sbFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wVW5zd2l0Y2hQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFJvdGF0ZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wSW5kZXhTcGxpdFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb3dlckludm9rZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb3dlclNldEptcFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb3dlclN3aXRjaFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVOb0FBUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU5vUHJvZmlsZUluZm9QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUHJvZmlsZUVzdGltYXRvclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQcm9maWxlVmVyaWZpZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUHJvZmlsZUxvYWRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQcm9tb3RlTWVtb3J5VG9SZWdpc3RlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEZW1vdGVSZWdpc3RlclRvTWVtb3J5UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBydW5lRUhQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUG9zdERvbU9ubHlQcmludGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBvc3REb21QcmludGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBvc3REb21Pbmx5Vmlld2VyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBvc3REb21WaWV3ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUmVhc3NvY2lhdGVQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUmVnaW9uSW5mb1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVSZWdpb25Pbmx5UHJpbnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVSZWdpb25Pbmx5Vmlld2VyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVJlZ2lvblByaW50ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUmVnaW9uVmlld2VyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNDQ1BQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU2NhbGFyUmVwbEFnZ3JlZ2F0ZXNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU2ltcGxpZnlMaWJDYWxsc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTaW1wbGlmeUhhbGZQb3dyTGliQ2FsbHNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU2luZ2xlTG9vcEV4dHJhY3RvclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTdHJpcFN5bWJvbHNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU3RyaXBOb25EZWJ1Z1N5bWJvbHNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU3RyaXBEZWFkRGVidWdJbmZvUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVN0cmlwRGVhZFByb3RvdHlwZXNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlVGFpbENhbGxFbGltaW5hdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVUYWlsRHVwbGljYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSnVtcFRocmVhZGluZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUluc3RDb3VudFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDb2RlR2VuUHJlcGFyZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVHVk5QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTWVtQ3B5T3B0UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BEZWxldGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQb3N0RG9tVHJlZSgpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBvc3REb21Gcm9udGllcigpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUluc3RydWN0aW9uTmFtZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUZ1bmN0aW9uQXR0cnNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTWVyZ2VGdW5jdGlvbnNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUHJpbnRNb2R1bGVQYXNzKDApOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVByaW50RnVuY3Rpb25QYXNzKCIiLCAwKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEYmdJbmZvUHJpbnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVNb2R1bGVEZWJ1Z0luZm9QcmludGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBhcnRpYWxJbmxpbmluZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTU0lQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU1NJRXZlcnl0aGluZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVHRVBTcGxpdHRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVBQkNEUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxpbnRQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU2lua2luZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb3dlckF0b21pY1Bhc3MoKTsKKworICAgICAgKHZvaWQpbmV3IGxsdm06OkludGVydmFsUGFydGl0aW9uKCk7CisgICAgICAodm9pZCluZXcgbGx2bTo6RmluZFVzZWRUeXBlcygpOworICAgICAgKHZvaWQpbmV3IGxsdm06OlNjYWxhckV2b2x1dGlvbigpOworICAgICAgKHZvaWQpbmV3IGxsdm06OlBvaW50ZXJUcmFja2luZygpOworICAgICAgKChsbHZtOjpGdW5jdGlvbiopMCktPnZpZXdDRkdPbmx5KCk7CisgICAgICBsbHZtOjpBbGlhc1NldFRyYWNrZXIgWCgqKGxsdm06OkFsaWFzQW5hbHlzaXMqKTApOworICAgICAgWC5hZGQoKGxsdm06OlZhbHVlKikwLCAwKTsgIC8vIGZvciAtcHJpbnQtYWxpYXMtc2V0cworICAgIH0KKyAgfSBGb3JjZVBhc3NMaW5raW5nOyAvLyBGb3JjZSBsaW5rIGJ5IGNyZWF0aW5nIGEgZ2xvYmFsIGRlZmluaXRpb24uCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0xpbmtBbGxWTUNvcmUuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9MaW5rQWxsVk1Db3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmMmM0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9MaW5rQWxsVk1Db3JlLmgKQEAgLTAsMCArMSw1NSBAQAorLy89PT0tIExpbmtBbGxWTUNvcmUuaCAtIFJlZmVyZW5jZSBBbGwgVk1Db3JlIENvZGUgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBwdWxscyBpbiBhbGwgdGhlIG9iamVjdCBtb2R1bGVzIG9mIHRoZSBWTUNvcmUgbGlicmFyeSBzbworLy8gdGhhdCB0b29scyBsaWtlIGxsYywgb3B0LCBhbmQgbGxpIGNhbiBlbnN1cmUgdGhleSBhcmUgbGlua2VkIHdpdGggYWxsIHN5bWJvbHMKKy8vIGZyb20gbGliVk1Db3JlLmEgSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmcm9tIGEgdG9vbCdzIG1haW4gcHJvZ3JhbS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTElOS0FMTFZNQ09SRV9ICisjZGVmaW5lIExMVk1fTElOS0FMTFZNQ09SRV9ICisKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vSW5saW5lQXNtLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9WZXJpZmllci5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0FsYXJtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRHluYW1pY0xpYnJhcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NZW1vcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NdXRleC5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9Qcm9jZXNzLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUHJvZ3JhbS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1NpZ25hbHMuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaW1lVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TbG93T3BlcmF0aW9uSW5mb3JtZXIuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRm9yY2VWTUNvcmVMaW5raW5nIHsKKyAgICBGb3JjZVZNQ29yZUxpbmtpbmcoKSB7CisgICAgICAvLyBXZSBtdXN0IHJlZmVyZW5jZSBWTUNvcmUgaW4gc3VjaCBhIHdheSB0aGF0IGNvbXBpbGVycyB3aWxsIG5vdAorICAgICAgLy8gZGVsZXRlIGl0IGFsbCBhcyBkZWFkIGNvZGUsIGV2ZW4gd2l0aCB3aG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiwKKyAgICAgIC8vIHlldCBpcyBlZmZlY3RpdmVseSBhIE5PLU9QLiBBcyB0aGUgY29tcGlsZXIgaXNuJ3Qgc21hcnQgZW5vdWdoCisgICAgICAvLyB0byBrbm93IHRoYXQgZ2V0ZW52KCkgbmV2ZXIgcmV0dXJucyAtMSwgdGhpcyB3aWxsIGRvIHRoZSBqb2IuCisgICAgICBpZiAoc3RkOjpnZXRlbnYoImJhciIpICE9IChjaGFyKikgLTEpCisgICAgICAgIHJldHVybjsKKyAgICAgICh2b2lkKW5ldyBsbHZtOjpNb2R1bGUoIiIsIGxsdm06OmdldEdsb2JhbENvbnRleHQoKSk7CisgICAgICAodm9pZCluZXcgbGx2bTo6VW5yZWFjaGFibGVJbnN0KGxsdm06OmdldEdsb2JhbENvbnRleHQoKSk7CisgICAgICAodm9pZCkgICAgbGx2bTo6Y3JlYXRlVmVyaWZpZXJQYXNzKCk7IAorICAgIH0KKyAgfSBGb3JjZVZNQ29yZUxpbmtpbmc7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0xpbmtlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL0xpbmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2JmODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTGlua2VyLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8vPT09LSBsbHZtL0xpbmtlci5oIC0gTW9kdWxlIExpbmtlciBJbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUgbW9kdWxlL2ZpbGUvYXJjaGl2ZSBsaW5rZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xJTktFUl9ICisjZGVmaW5lIExMVk1fTElOS0VSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgbmFtZXNwYWNlIHN5cyB7IGNsYXNzIFBhdGg7IH0KKworY2xhc3MgTW9kdWxlOworY2xhc3MgTExWTUNvbnRleHQ7CisKKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgb2YgbGlua2luZyBpbiBMTFZNLiBJdCByZXRhaW5zIGEKKy8vLyBNb2R1bGUgb2JqZWN0IHdoaWNoIGlzIHRoZSBjb21wb3NpdGUgb2YgdGhlIG1vZHVsZXMgYW5kIGxpYnJhcmllcyBsaW5rZWQKKy8vLyBpbnRvIGl0LiBUaGUgY29tcG9zaXRlIE1vZHVsZSBjYW4gYmUgcmV0cmlldmVkIHZpYSB0aGUgZ2V0TW9kdWxlKCkgbWV0aG9kLgorLy8vIEluIHRoaXMgY2FzZSB0aGUgTGlua2VyIHN0aWxsIHJldGFpbnMgb3duZXJzaGlwIG9mIHRoZSBNb2R1bGUuIElmIHRoZQorLy8vIHJlbGVhc2VNb2R1bGUoKSBtZXRob2QgaXMgdXNlZCwgdGhlIG93bmVyc2hpcCBvZiB0aGUgTW9kdWxlIGlzIHRyYW5zZmVycmVkCisvLy8gdG8gdGhlIGNhbGxlciBhbmQgdGhlIExpbmtlciBvYmplY3QgaXMgb25seSBzdWl0YWJsZSBmb3IgZGVzdHJ1Y3Rpb24uCisvLy8gVGhlIExpbmtlciBjYW4gbGluayBNb2R1bGVzIGZyb20gbWVtb3J5LCBiaXRjb2RlIGZpbGVzLCBvciBiaXRjb2RlCisvLy8gYXJjaGl2ZXMuICBJdCByZXRhaW5zIGEgc2V0IG9mIHNlYXJjaCBwYXRocyBpbiB3aGljaCB0byBmaW5kIGFueSBsaWJyYXJpZXMKKy8vLyBwcmVzZW50ZWQgdG8gaXQuIEJ5IGRlZmF1bHQsIHRoZSBsaW5rZXIgd2lsbCBnZW5lcmF0ZSBlcnJvciBhbmQgd2FybmluZworLy8vIG1lc3NhZ2VzIHRvIHN0ZGVyciBidXQgdGhpcyBjYXBhYmlsaXR5IGNhbiBiZSB0dXJuZWQgb2ZmIHdpdGggdGhlCisvLy8gUXVpZXRXYXJuaW5ncyBhbmQgUXVpZXRFcnJvcnMgZmxhZ3MuIEl0IGNhbiBhbHNvIGJlIGluc3RydWN0ZWQgdG8gdmVyYm9zZWx5CisvLy8gcHJpbnQgb3V0IHRoZSBsaW5raW5nIGFjdGlvbnMgaXQgaXMgdGFraW5nIHdpdGggdGhlIFZlcmJvc2UgZmxhZy4KKy8vLyBAYnJpZWYgVGhlIExMVk0gTGlua2VyLgorY2xhc3MgTGlua2VyIHsKKworICAvLy8gQG5hbWUgVHlwZXMKKyAgLy8vIEB7CisgIHB1YmxpYzoKKyAgICAvLy8gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcGFzcyB0aGUgbGlua2FnZSBpdGVtcyAobGlicmFyaWVzIGFuZCBmaWxlcykgdG8KKyAgICAvLy8gdGhlIExpbmtJdGVtcyBmdW5jdGlvbi4gSXQgaXMgY29tcG9zZWQgb2Ygc3RyaW5nL2Jvb2wgcGFpcnMuIFRoZSBzdHJpbmcKKyAgICAvLy8gcHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgb3IgbGlicmFyeSAoYXMgd2l0aCB0aGUgLWwgb3B0aW9uKS4gVGhlCisgICAgLy8vIGJvb2wgc2hvdWxkIGJlIHRydWUgZm9yIGxpYnJhcmllcyBhbmQgZmFsc2UgZm9yIGZpbGVzLCBzaWduaWZ5aW5nCisgICAgLy8vICJpc0xpYnJhcnkiLgorICAgIC8vLyBAYnJpZWYgQSBsaXN0IG9mIGxpbmthZ2UgaXRlbXMKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZyxib29sPiA+IEl0ZW1MaXN0OworCisgICAgLy8vIFRoaXMgZW51bWVyYXRpb24gaXMgdXNlZCB0byBjb250cm9sIHZhcmlvdXMgb3B0aW9uYWwgZmVhdHVyZXMgb2YgdGhlCisgICAgLy8vIGxpbmtlci4KKyAgICBlbnVtIENvbnRyb2xGbGFncyB7CisgICAgICBWZXJib3NlICAgICAgID0gMSwgLy8vPCBQcmludCB0byBzdGRlcnIgd2hhdCBzdGVwcyB0aGUgbGlua2VyIGlzIHRha2luZworICAgICAgUXVpZXRXYXJuaW5ncyA9IDIsIC8vLzwgRG9uJ3QgcHJpbnQgd2FybmluZ3MgdG8gc3RkZXJyLgorICAgICAgUXVpZXRFcnJvcnMgICA9IDQgIC8vLzwgRG9uJ3QgcHJpbnQgZXJyb3JzIHRvIHN0ZGVyci4KKyAgICB9OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgIC8vLyBAeworICBwdWJsaWM6CisgICAgLy8vIENvbnN0cnVjdCB0aGUgTGlua2VyIHdpdGggYW4gZW1wdHkgbW9kdWxlIHdoaWNoIHdpbGwgYmUgZ2l2ZW4gdGhlCisgICAgLy8vIG5hbWUgXHAgcHJvZ25hbWUuIFxwIHByb2duYW1lIHdpbGwgYWxzbyBiZSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KKyAgICAvLy8gQGJyaWVmIENvbnN0cnVjdCB3aXRoIGVtcHR5IG1vZHVsZQorICAgIExpbmtlcihTdHJpbmdSZWYgcHJvZ25hbWUsIC8vLzwgbmFtZSBvZiB0b29sIHJ1bm5pbmcgbGlua2VyCisgICAgICAgICAgIFN0cmluZ1JlZiBtb2R1bGVuYW1lLCAvLy88IG5hbWUgb2YgbGlua2VyJ3MgZW5kLXJlc3VsdCBtb2R1bGUKKyAgICAgICAgICAgTExWTUNvbnRleHQgJkMsIC8vLzwgQ29udGV4dCBmb3IgZ2xvYmFsIGluZm8KKyAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MgPSAwICAvLy88IENvbnRyb2xGbGFncyAob25lIG9yIG1vcmUgfCdkIHRvZ2V0aGVyKQorICAgICk7CisKKyAgICAvLy8gQ29uc3RydWN0IHRoZSBMaW5rZXIgd2l0aCBhIHByZXZpb3VzbHkgZGVmaW5lZCBtb2R1bGUsIFxwIGFNb2R1bGUuIFVzZQorICAgIC8vLyBccCBwcm9nbmFtZSBmb3IgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gaW4gZXJyb3IgbWVzc2FnZXMuCisgICAgLy8vIEBicmllZiBDb25zdHJ1Y3Qgd2l0aCBleGlzdGluZyBtb2R1bGUKKyAgICBMaW5rZXIoU3RyaW5nUmVmIHByb2duYW1lLCBNb2R1bGUqIGFNb2R1bGUsIHVuc2lnbmVkIEZsYWdzID0gMCk7CisKKyAgICAvLy8gRGVzdHJ1Y3QgdGhlIExpbmtlci4KKyAgICAvLy8gQGJyaWVmIERlc3RydWN0b3IKKyAgICB+TGlua2VyKCk7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisgIHB1YmxpYzoKKyAgICAvLy8gVGhpcyBtZXRob2QgZ2V0cyB0aGUgY29tcG9zaXRlIG1vZHVsZSBpbnRvIHdoaWNoIGxpbmtpbmcgaXMgYmVpbmcKKyAgICAvLy8gZG9uZS4gVGhlIENvbXBvc2l0ZSBtb2R1bGUgc3RhcnRzIG91dCBlbXB0eSBhbmQgYWNjdW11bGF0ZXMgbW9kdWxlcworICAgIC8vLyBsaW5rZWQgaW50byBpdCB2aWEgdGhlIHZhcmlvdXMgTGlua0luKiBtZXRob2RzLiBUaGlzIG1ldGhvZCBkb2VzIG5vdAorICAgIC8vLyByZWxlYXNlIHRoZSBNb2R1bGUgdG8gdGhlIGNhbGxlci4gVGhlIExpbmtlciByZXRhaW5zIG93bmVyc2hpcCBhbmQgd2lsbAorICAgIC8vLyBkZXN0cnVjdCB0aGUgTW9kdWxlIHdoZW4gdGhlIExpbmtlciBpcyBkZXN0cnVjdGVkLgorICAgIC8vLyBAc2VlIHJlbGVhc2VNb2R1bGUKKyAgICAvLy8gQGJyaWVmIEdldCB0aGUgbGlua2VkL2NvbXBvc2l0ZSBtb2R1bGUuCisgICAgTW9kdWxlKiBnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBDb21wb3NpdGU7IH0KKworICAgIC8vLyBUaGlzIG1ldGhvZCByZWxlYXNlcyB0aGUgY29tcG9zaXRlIE1vZHVsZSBpbnRvIHdoaWNoIGxpbmtpbmcgaXMgYmVpbmcKKyAgICAvLy8gZG9uZS4gT3duZXJzaGlwIG9mIHRoZSBjb21wb3NpdGUgTW9kdWxlIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIgd2hvCisgICAgLy8vIG11c3QgYXJyYW5nZSBmb3IgaXRzIGRlc3RydWN0LiBBZnRlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBMaW5rZXIKKyAgICAvLy8gdGVybWluYXRlcyB0aGUgbGlua2luZyBzZXNzaW9uIGZvciB0aGUgcmV0dXJuZWQgTW9kdWxlLiBJdCB3aWxsIG5vCisgICAgLy8vIGxvbmdlciB1dGlsaXplIHRoZSByZXR1cm5lZCBNb2R1bGUgYnV0IGluc3RlYWQgcmVzZXRzIGl0c2VsZiBmb3IKKyAgICAvLy8gc3Vic2VxdWVudCBsaW5raW5nIGFzIGlmIHRoZSBjb25zdHJ1Y3RvciBoYWQgYmVlbiBjYWxsZWQuIFRoZSBMaW5rZXIncworICAgIC8vLyBMaWJQYXRocyBhbmQgZmxhZ3MgdG8gYmUgcmVzZXQsIGFuZCBtZW1vcnkgd2lsbCBiZSByZWxlYXNlZC4KKyAgICAvLy8gQGJyaWVmIFJlbGVhc2UgdGhlIGxpbmtlZC9jb21wb3NpdGUgbW9kdWxlLgorICAgIE1vZHVsZSogcmVsZWFzZU1vZHVsZSgpOworCisgICAgLy8vIFRoaXMgbWV0aG9kIGdldHMgdGhlIGxpc3Qgb2YgbGlicmFyaWVzIHRoYXQgZm9ybSB0aGUgcGF0aCB0aGF0IHRoZQorICAgIC8vLyBMaW5rZXIgd2lsbCBzZWFyY2ggd2hlbiBpdCBpcyBwcmVzZW50ZWQgd2l0aCBhIGxpYnJhcnkgbmFtZS4KKyAgICAvLy8gQGJyaWVmIEdldCB0aGUgTGlua2VycyBsaWJyYXJ5IHBhdGgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzeXM6OlBhdGg+JiBnZXRMaWJQYXRocygpIGNvbnN0IHsgcmV0dXJuIExpYlBhdGhzOyB9CisKKyAgICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhbiBlcnJvciBzdHJpbmcgc3VpdGFibGUgZm9yIHByaW50aW5nIHRvIHRoZSB1c2VyLgorICAgIC8vLyBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgZW1wdHkgdW5sZXNzIGFuIGVycm9yIG9jY3VycmVkIGluIG9uZSBvZiB0aGUKKyAgICAvLy8gTGlua0luKiBtZXRob2RzLiBJbiB0aG9zZSBjYXNlcywgdGhlIExpbmtJbiogbWV0aG9kcyB3aWxsIGhhdmUgcmV0dXJuZWQKKyAgICAvLy8gdHJ1ZSwgaW5kaWNhdGluZyBhbiBlcnJvciBvY2N1cnJlZC4gQXQgbW9zdCBvbmUgZXJyb3IgaXMgcmV0YWluZWQgc28KKyAgICAvLy8gdGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCBlcnJvciB0aGF0IG9jY3VycmVkLiBOb3RlIHRoYXQgaWYKKyAgICAvLy8gdGhlIFF1aWV0IGNvbnRyb2wgZmxhZyBpcyBub3Qgc2V0LCB0aGUgZXJyb3Igc3RyaW5nIHdpbGwgaGF2ZSBhbHJlYWR5CisgICAgLy8vIGJlZW4gcHJpbnRlZCB0byBzdGRlcnIuCisgICAgLy8vIEBicmllZiBHZXQgdGhlIHRleHQgb2YgdGhlIGxhc3QgZXJyb3IgdGhhdCBvY2N1cnJlZC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TGFzdEVycm9yKCkgY29uc3QgeyByZXR1cm4gRXJyb3I7IH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIE11dGF0b3JzCisgIC8vLyBAeworICBwdWJsaWM6CisgICAgLy8vIEFkZCBhIHBhdGggdG8gdGhlIGxpc3Qgb2YgcGF0aHMgdGhhdCB0aGUgTGlua2VyIHdpbGwgc2VhcmNoLiBUaGUgTGlua2VyCisgICAgLy8vIGFjY3VtdWxhdGVzIHRoZSBzZXQgb2YgbGlicmFyaWVzIGFkZGVkCisgICAgLy8vIGxpYnJhcnkgcGF0aHMgZm9yIHRoZSB0YXJnZXQgcGxhdGZvcm0uIFRoZSBzdGFuZGFyZCBsaWJyYXJpZXMgd2lsbAorICAgIC8vLyBhbHdheXMgYmUgc2VhcmNoZWQgbGFzdC4gVGhlIGFkZGVkIGxpYnJhcmllcyB3aWxsIGJlIHNlYXJjaGVkIGluIHRoZQorICAgIC8vLyBvcmRlciBhZGRlZC4KKyAgICAvLy8gQGJyaWVmIEFkZCBhIHBhdGguCisgICAgdm9pZCBhZGRQYXRoKGNvbnN0IHN5czo6UGF0aCYgcGF0aCk7CisKKyAgICAvLy8gQWRkIGEgc2V0IG9mIHBhdGhzIHRvIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgdGhlIGxpbmtlciB3aWxsIHNlYXJjaC4gVGhlCisgICAgLy8vIExpbmtlciBhY2N1bXVsYXRlcyB0aGUgc2V0IG9mIGxpYnJhcmllcyBhZGRlZC4gVGhlIFxwIHBhdGhzIHdpbGwgYmUKKyAgICAvLy8gYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgTGlua2VyJ3MgbGlzdC4gT3JkZXIgd2lsbCBiZSByZXRhaW5lZC4KKyAgICAvLy8gQGJyaWVmIEFkZCBhIHNldCBvZiBwYXRocy4KKyAgICB2b2lkIGFkZFBhdGhzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGF0aHMpOworCisgICAgLy8vIFRoaXMgbWV0aG9kIGF1Z21lbnRzIHRoZSBMaW5rZXIncyBsaXN0IG9mIGxpYnJhcnkgcGF0aHMgd2l0aCB0aGUgc3lzdGVtCisgICAgLy8vIHBhdGhzIG9mIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0sIGluY2x1ZGUgTExWTV9MSUJfU0VBUkNIX1BBVEguCisgICAgLy8vIEBicmllZiBBZGQgdGhlIHN5c3RlbSBwYXRocy4KKyAgICB2b2lkIGFkZFN5c3RlbVBhdGhzKCk7CisKKyAgICAvLy8gQ29udHJvbCBvcHRpb25hbCBsaW5rZXIgYmVoYXZpb3IgYnkgc2V0dGluZyBhIGdyb3VwIG9mIGZsYWdzLiBUaGUgZmxhZ3MKKyAgICAvLy8gYXJlIGRlZmluZWQgaW4gdGhlIENvbnRyb2xGbGFncyBlbnVtZXJhdGlvbi4KKyAgICAvLy8gQHNlZSBDb250cm9sRmxhZ3MKKyAgICAvLy8gQGJyaWVmIFNldCBjb250cm9sIGZsYWdzLgorICAgIHZvaWQgc2V0RmxhZ3ModW5zaWduZWQgZmxhZ3MpIHsgRmxhZ3MgPSBmbGFnczsgfQorCisgICAgLy8vIFRoaXMgbWV0aG9kIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byB0aGUgbGlua2VyLiBJdCBjYW4gYmUgdXNlZCB0bworICAgIC8vLyBsaW5rIGEgc2V0IG9mIGxpbmthZ2UgaXRlbXMgaW50byBhIG1vZHVsZS4gQSBsaW5rYWdlIGl0ZW0gaXMgZWl0aGVyIGEKKyAgICAvLy8gZmlsZSBuYW1lIHdpdGggZnVsbHkgcXVhbGlmaWVkIHBhdGgsIG9yIGEgbGlicmFyeSBmb3Igd2hpY2ggdGhlIExpbmtlcidzCisgICAgLy8vIExpYnJhcnlQYXRoIHdpbGwgYmUgdXRpbGl6ZWQgdG8gbG9jYXRlIHRoZSBsaWJyYXJ5LiBUaGUgYm9vbCB2YWx1ZSBpbgorICAgIC8vLyB0aGUgTGlua0l0ZW1LaW5kIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBmb3IgbGlicmFyaWVzLiAgVGhpcyBmdW5jdGlvbgorICAgIC8vLyBhbGxvd3MgbGlua2luZyB0byBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2Ygc3BlY2lmaWNhdGlvbiBhc3NvY2lhdGVkIHdpdGgKKyAgICAvLy8gdGhlIGNvbW1hbmQgbGluZSwgb3IgZm9yIG90aGVyIHB1cnBvc2VzLiBFYWNoIGl0ZW0gd2lsbCBiZSBsaW5rZWQgaW4KKyAgICAvLy8gdHVybiBhcyBpdCBvY2N1cnMgaW4gXHAgSXRlbXMuCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZQorICAgIC8vLyBAc2VlIExpbmtJdGVtS2luZAorICAgIC8vLyBAc2VlIGdldExhc3RFcnJvcgorICAgIC8vLyBAdGhyb3dzIG5vdGhpbmcKKyAgICBib29sIExpbmtJbkl0ZW1zICgKKyAgICAgIGNvbnN0IEl0ZW1MaXN0JiBJdGVtcywgLy8vPCBTZXQgb2YgbGlicmFyaWVzL2ZpbGVzIHRvIGxpbmsgaW4KKyAgICAgIEl0ZW1MaXN0JiBOYXRpdmVJdGVtcyAgLy8vPCBPdXRwdXQgbGlzdCBvZiBuYXRpdmUgZmlsZXMvbGlicworICAgICk7CisKKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBsaW5rcyB0aGUgYml0Y29kZSBccCBGaWxlcyBpbnRvIHRoZSBjb21wb3NpdGUgbW9kdWxlLgorICAgIC8vLyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBkbyBhbnkgbGlua2luZyBvZiB1bnJlc29sdmVkIHN5bWJvbHMuIFRoZSBccAorICAgIC8vLyBGaWxlcyBhcmUgYWxsIGNvbXBsZXRlbHkgbGlua2VkIGludG8gXHAgSGVhZE1vZHVsZSByZWdhcmRsZXNzIG9mCisgICAgLy8vIHVucmVzb2x2ZWQgc3ltYm9scy4gVGhpcyBmdW5jdGlvbiBqdXN0IGxvYWRzIGVhY2ggYml0Y29kZSBmaWxlIGFuZAorICAgIC8vLyBjYWxscyBMaW5rSW5Nb2R1bGUgb24gdGhlbS4KKyAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnMsIGZhbHNlIG90aGVyd2lzZQorICAgIC8vLyBAc2VlIGdldExhc3RFcnJvcgorICAgIC8vLyBAYnJpZWYgTGluayBpbiBtdWx0aXBsZSBmaWxlcy4KKyAgICBib29sIExpbmtJbkZpbGVzICgKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN5czo6UGF0aD4gJiBGaWxlcyAvLy88IEZpbGVzIHRvIGxpbmsgaW4KKyAgICApOworCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gbGlua3MgYSBzaW5nbGUgYml0Y29kZSBmaWxlLCBccCBGaWxlLCBpbnRvIHRoZSBjb21wb3NpdGUKKyAgICAvLy8gbW9kdWxlLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhdHRlbXB0IHRvIHJlc29sdmUgc3ltYm9scy4gVGhpcyBtZXRob2QKKyAgICAvLy8ganVzdCBsb2FkcyB0aGUgYml0Y29kZSBmaWxlIGFuZCBjYWxscyBMaW5rSW5Nb2R1bGUgb24gaXQuIElmIGFuIGVycm9yCisgICAgLy8vIG9jY3VycywgdGhlIExpbmtlcidzIGVycm9yIHN0cmluZyBpcyBzZXQuCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJzLCBmYWxzZSBvdGhlcndpc2UKKyAgICAvLy8gQHNlZSBnZXRMYXN0RXJyb3IKKyAgICAvLy8gQGJyaWVmIExpbmsgaW4gYSBzaW5nbGUgZmlsZS4KKyAgICBib29sIExpbmtJbkZpbGUoCisgICAgICBjb25zdCBzeXM6OlBhdGgmIEZpbGUsIC8vLzwgRmlsZSB0byBsaW5rIGluLgorICAgICAgYm9vbCAmaXNfbmF0aXZlICAgICAgICAvLy88IEluZGljYXRlcyBpZiB0aGUgZmlsZSBpcyBuYXRpdmUgb2JqZWN0IGZpbGUKKyAgICApOworCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3YXkgdG8gc2VsZWN0aXZlbHkgbGluayBpbiBhIHNldCBvZiBtb2R1bGVzLAorICAgIC8vLyBmb3VuZCBpbiBsaWJyYXJpZXMsIGJhc2VkIG9uIHRoZSB1bnJlc29sdmVkIHN5bWJvbHMgaW4gdGhlIGNvbXBvc2l0ZQorICAgIC8vLyBtb2R1bGUuIEVhY2ggaXRlbSBpbiBccCBMaWJyYXJpZXMgc2hvdWxkIGJlIHRoZSBiYXNlIG5hbWUgb2YgYSBsaWJyYXJ5LAorICAgIC8vLyBhcyBpZiBnaXZlbiB3aXRoIHRoZSAtbCBvcHRpb24gb2YgYSBsaW5rZXIgdG9vbC4gIFRoZSBMaW5rZXIncyBMaWJQYXRocworICAgIC8vLyBhcmUgc2VhcmNoZWQgZm9yIHRoZSBccCBMaWJyYXJpZXMgYW5kIGFueSBmb3VuZCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoCisgICAgLy8vIExpbmtJbkFyY2hpdmUuICBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBMaW5rZXIncyBlcnJvciBzdHJpbmcgaXMgc2V0LgorICAgIC8vLyBAc2VlIExpbmtJbkFyY2hpdmUKKyAgICAvLy8gQHNlZSBnZXRMYXN0RXJyb3IKKyAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnMsIGZhbHNlIG90aGVyd2lzZQorICAgIC8vLyBAYnJpZWYgTGluayBsaWJyYXJpZXMgaW50byB0aGUgbW9kdWxlCisgICAgYm9vbCBMaW5rSW5MaWJyYXJpZXMgKAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICYgTGlicmFyaWVzIC8vLzwgTGlicmFyaWVzIHRvIGxpbmsgaW4KKyAgICApOworCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3YXkgdG8gc2VsZWN0aXZlbHkgbGluayBpbiBhIHNldCBvZiBtb2R1bGVzLAorICAgIC8vLyBmb3VuZCBpbiBvbmUgbGlicmFyeSwgYmFzZWQgb24gdGhlIHVucmVzb2x2ZWQgc3ltYm9scyBpbiB0aGUgY29tcG9zaXRlCisgICAgLy8vIG1vZHVsZS5UaGUgXHAgTGlicmFyeSBzaG91bGQgYmUgdGhlIGJhc2UgbmFtZSBvZiBhIGxpYnJhcnksIGFzIGlmIGdpdmVuCisgICAgLy8vIHdpdGggdGhlIC1sIG9wdGlvbiBvZiBhIGxpbmtlciB0b29sLiBUaGUgTGlua2VyJ3MgTGliUGF0aHMgYXJlIHNlYXJjaGVkCisgICAgLy8vIGZvciB0aGUgXHAgTGlicmFyeSBhbmQgaWYgZm91bmQsIGl0IHdpbGwgYmUgbGlua2VkIGluIHdpdGggdmlhIHRoZQorICAgIC8vLyBMaW5rSW5BcmNoaXZlIG1ldGhvZC4gSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgTGlua2VyJ3MgZXJyb3Igc3RyaW5nIGlzCisgICAgLy8vIHNldC4KKyAgICAvLy8gQHNlZSBMaW5rSW5BcmNoaXZlCisgICAgLy8vIEBzZWUgZ2V0TGFzdEVycm9yCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJzLCBmYWxzZSBvdGhlcndpc2UKKyAgICAvLy8gQGJyaWVmIExpbmsgb25lIGxpYnJhcnkgaW50byB0aGUgbW9kdWxlCisgICAgYm9vbCBMaW5rSW5MaWJyYXJ5ICgKKyAgICAgIFN0cmluZ1JlZiBMaWJyYXJ5LCAvLy88IFRoZSBsaWJyYXJ5IHRvIGxpbmsgaW4KKyAgICAgIGJvb2wmIGlzX25hdGl2ZSAgICAvLy88IEluZGljYXRlcyBpZiBsaWIgYSBuYXRpdmUgbGlicmFyeQorICAgICk7CisKKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBsaW5rcyBvbmUgYml0Y29kZSBhcmNoaXZlLCBccCBGaWxlbmFtZSwgaW50byB0aGUgbW9kdWxlLgorICAgIC8vLyBUaGUgYXJjaGl2ZSBpcyBzZWFyY2hlZCB0byByZXNvbHZlIG91dHN0YW5kaW5nIHN5bWJvbHMuIEFueSBtb2R1bGVzIGluCisgICAgLy8vIHRoZSBhcmNoaXZlIHRoYXQgcmVzb2x2ZSBvdXRzdGFuZGluZyBzeW1ib2xzIHdpbGwgYmUgbGlua2VkIGluLiBUaGUKKyAgICAvLy8gbGlicmFyeSBpcyBzZWFyY2hlZCByZXBlYXRlZGx5IHVudGlsIG5vIG1vcmUgbW9kdWxlcyB0aGF0IHJlc29sdmUKKyAgICAvLy8gc3ltYm9scyBjYW4gYmUgZm91bmQuIElmIGFuIGVycm9yIG9jY3VycywgdGhlIGVycm9yIHN0cmluZyBpcyAgc2V0LgorICAgIC8vLyBUbyBzcGVlZCB1cCB0aGlzIGZ1bmN0aW9uLCBlbnN1cmUgdGhlIGFyY2hpdmUgaGFzIGJlZW4gcHJvY2Vzc2VkCisgICAgLy8vIGxsdm0tcmFubGliIG9yIHRoZSBTIG9wdGlvbiB3YXMgZ2l2ZW4gdG8gbGx2bS1hciB3aGVuIHRoZSBhcmNoaXZlIHdhcworICAgIC8vLyBjcmVhdGVkLiBUaGVzZSB0b29scyBhZGQgYSBzeW1ib2wgdGFibGUgdG8gdGhlIGFyY2hpdmUgd2hpY2ggbWFrZXMgdGhlCisgICAgLy8vIHNlYXJjaCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMgbXVjaCBmYXN0ZXIuCisgICAgLy8vIEBzZWUgZ2V0TGFzdEVycm9yCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJzLCBvdGhlcndpc2UgZmFsc2UuCisgICAgLy8vIEBicmllZiBMaW5rIGluIG9uZSBhcmNoaXZlLgorICAgIGJvb2wgTGlua0luQXJjaGl2ZSgKKyAgICAgIGNvbnN0IHN5czo6UGF0aCYgRmlsZW5hbWUsIC8vLzwgRmlsZW5hbWUgb2YgdGhlIGFyY2hpdmUgdG8gbGluaworICAgICAgYm9vbCYgaXNfbmF0aXZlICAgICAgICAgICAgLy8vPCAgSW5kaWNhdGVzIGlmIGFyY2hpdmUgaXMgYSBuYXRpdmUgYXJjaGl2ZQorICAgICk7CisKKyAgICAvLy8gVGhpcyBtZXRob2QgbGlua3MgdGhlIFxwIFNyYyBtb2R1bGUgaW50byB0aGUgTGlua2VyJ3MgQ29tcG9zaXRlIG1vZHVsZQorICAgIC8vLyBieSBjYWxsaW5nIExpbmtNb2R1bGVzLiAgQWxsIHRoZSBvdGhlciBMaW5rSW4qIG1ldGhvZHMgZXZlbnR1YWxseQorICAgIC8vLyByZXN1bHQgaW4gY2FsbGluZyB0aGlzIG1ldGhvZCB0byBsaW5rIGEgTW9kdWxlIGludG8gdGhlIExpbmtlcidzCisgICAgLy8vIGNvbXBvc2l0ZS4KKyAgICAvLy8gQHNlZSBMaW5rTW9kdWxlcworICAgIC8vLyBAcmV0dXJucyBUcnVlIGlmIGFuIGVycm9yIG9jY3VycywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIC8vLyBAYnJpZWYgTGluayBpbiBhIG1vZHVsZS4KKyAgICBib29sIExpbmtJbk1vZHVsZSgKKyAgICAgIE1vZHVsZSogU3JjLCAgICAgICAgICAgICAgLy8vPCBNb2R1bGUgbGlua2VkIGludG8gXHAgRGVzdAorICAgICAgc3RkOjpzdHJpbmcqIEVycm9yTXNnID0gMCAvLy8gRXJyb3IvZGlhZ25vc3RpYyBzdHJpbmcKKyAgICApIHsgCisgICAgICByZXR1cm4gTGlua01vZHVsZXMoQ29tcG9zaXRlLCBTcmMsIEVycm9yTXNnICk7IAorICAgIH0KKworICAgIC8vLyBUaGlzIGlzIHRoZSBoZWFydCBvZiB0aGUgbGlua2VyLiBUaGlzIG1ldGhvZCB3aWxsIHRha2UgdW5jb25kaXRpb25hbAorICAgIC8vLyBjb250cm9sIG9mIHRoZSBccCBTcmMgbW9kdWxlIGFuZCBsaW5rIGl0IGludG8gdGhlIFxwIERlc3QgbW9kdWxlLiBUaGUKKyAgICAvLy8gXHAgU3JjIG1vZHVsZSB3aWxsIGJlIGRlc3RydWN0ZWQgb3Igc3Vic3VtZWQgYnkgdGhpcyBtZXRob2QuIEluIGVpdGhlcgorICAgIC8vLyBjYXNlIGl0IGlzIG5vdCB1c2FibGUgYnkgdGhlIGNhbGxlciBhZnRlciB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLiBPbmx5CisgICAgLy8vIHRoZSBccCBEZXN0IG1vZHVsZSB3aWxsIHJlbWFpbi4gVGhlIFxwIFNyYyBtb2R1bGUgaXMgbGlua2VkIGludG8gdGhlCisgICAgLy8vIExpbmtlcidzIGNvbXBvc2l0ZSBtb2R1bGUgc3VjaCB0aGF0IHR5cGVzLCBnbG9iYWwgdmFyaWFibGVzLCBmdW5jdGlvbnMsCisgICAgLy8vIGFuZCBldGMuIGFyZSBtYXRjaGVkIGFuZCByZXNvbHZlZC4gIElmIGFuIGVycm9yIG9jY3VycywgdGhpcyBmdW5jdGlvbgorICAgIC8vLyByZXR1cm5zIHRydWUgYW5kIEVycm9yTXNnIGlzIHNldCB0byBhIGRlc2NyaXB0aXZlIG1lc3NhZ2UgYWJvdXQgdGhlCisgICAgLy8vIGVycm9yLgorICAgIC8vLyBAcmV0dXJucyBUcnVlIGlmIGFuIGVycm9yIG9jY3VycywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIC8vLyBAYnJpZWYgR2VuZXJpY2FsbHkgbGluayB0d28gbW9kdWxlcyB0b2dldGhlci4KKyAgICBzdGF0aWMgYm9vbCBMaW5rTW9kdWxlcyhNb2R1bGUqIERlc3QsIE1vZHVsZSogU3JjLCBzdGQ6OnN0cmluZyogRXJyb3JNc2cpOworCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gbG9va3MgdGhyb3VnaCB0aGUgTGlua2VyJ3MgTGliUGF0aHMgdG8gZmluZCBhIGxpYnJhcnkgd2l0aAorICAgIC8vLyB0aGUgbmFtZSBccCBGaWxlbmFtZS4gSWYgdGhlIGxpYnJhcnkgY2Fubm90IGJlIGZvdW5kLCB0aGUgcmV0dXJuZWQgcGF0aAorICAgIC8vLyB3aWxsIGJlIGVtcHR5IChpLmUuIHN5czo6UGF0aDo6aXNFbXB0eSgpIHdpbGwgcmV0dXJuIHRydWUpLgorICAgIC8vLyBAcmV0dXJucyBBIHN5czo6UGF0aCB0byB0aGUgZm91bmQgbGlicmFyeQorICAgIC8vLyBAYnJpZWYgRmluZCBhIGxpYnJhcnkgZnJvbSBpdHMgc2hvcnQgbmFtZS4KKyAgICBzeXM6OlBhdGggRmluZExpYihTdHJpbmdSZWYgRmlsZW5hbWUpOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgSW1wbGVtZW50YXRpb24KKyAgLy8vIEB7CisgIHByaXZhdGU6CisgICAgLy8vIFJlYWQgaW4gYW5kIHBhcnNlIHRoZSBiaXRjb2RlIGZpbGUgbmFtZWQgYnkgRk4gYW5kIHJldHVybiB0aGUKKyAgICAvLy8gTW9kdWxlIGl0IGNvbnRhaW5zICh3cmFwcGVkIGluIGFuIGF1dG9fcHRyKSwgb3IgMCBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgc3RkOjphdXRvX3B0cjxNb2R1bGU+IExvYWRPYmplY3QoY29uc3Qgc3lzOjpQYXRoJiBGTik7CisKKyAgICBib29sIHdhcm5pbmcoU3RyaW5nUmVmIG1lc3NhZ2UpOworICAgIGJvb2wgZXJyb3IoU3RyaW5nUmVmIG1lc3NhZ2UpOworICAgIHZvaWQgdmVyYm9zZShTdHJpbmdSZWYgbWVzc2FnZSk7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBEYXRhCisgIC8vLyBAeworICBwcml2YXRlOgorICAgIExMVk1Db250ZXh0JiBDb250ZXh0OyAvLy88IFRoZSBjb250ZXh0IGZvciBnbG9iYWwgaW5mb3JtYXRpb24KKyAgICBNb2R1bGUqIENvbXBvc2l0ZTsgLy8vPCBUaGUgY29tcG9zaXRlIG1vZHVsZSBsaW5rZWQgdG9nZXRoZXIKKyAgICBzdGQ6OnZlY3RvcjxzeXM6OlBhdGg+IExpYlBhdGhzOyAvLy88IFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRocworICAgIHVuc2lnbmVkIEZsYWdzOyAgICAvLy88IEZsYWdzIHRvIGNvbnRyb2wgb3B0aW9uYWwgYmVoYXZpb3IuCisgICAgc3RkOjpzdHJpbmcgRXJyb3I7IC8vLzwgVGV4dCBvZiBlcnJvciB0aGF0IG9jY3VycmVkLgorICAgIHN0ZDo6c3RyaW5nIFByb2dyYW1OYW1lOyAvLy88IE5hbWUgb2YgdGhlIHByb2dyYW0gYmVpbmcgbGlua2VkCisgIC8vLyBAfQorCit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9FREluc3RJbmZvLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvRURJbnN0SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZWQyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvRURJbnN0SW5mby5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LS0gbGx2bS9NQy9FREluc3RJbmZvLmggLSBFRGlzIGluc3RydWN0aW9uIGluZm8gLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIEVESU5TVElORk9fSAorI2RlZmluZSBFRElOU1RJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIAorI2RlZmluZSBFRElTX01BWF9PUEVSQU5EUyAxMworI2RlZmluZSBFRElTX01BWF9TWU5UQVhFUyAyCisKK3N0cnVjdCBFREluc3RJbmZvIHsKKyAgdWludDhfdCAgICAgICBpbnN0cnVjdGlvblR5cGU7CisgIHVpbnQ4X3QgICAgICAgbnVtT3BlcmFuZHM7CisgIHVpbnQ4X3QgICAgICAgb3BlcmFuZFR5cGVzW0VESVNfTUFYX09QRVJBTkRTXTsKKyAgdWludDhfdCAgICAgICBvcGVyYW5kRmxhZ3NbRURJU19NQVhfT1BFUkFORFNdOworICBjb25zdCBjaGFyICAgIG9wZXJhbmRPcmRlcnNbRURJU19NQVhfU1lOVEFYRVNdW0VESVNfTUFYX09QRVJBTkRTXTsKK307CisgIAorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE2ZGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mby5oCkBAIC0wLDAgKzEsNDI2IEBACisvLz09PS0tIGxsdm0vTUMvTUNBc21JbmZvLmggLSBBc20gaW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIGNsYXNzIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2lzIGZvciB0YXJnZXQgc3BlY2lmaWMKKy8vIGFzbSB3cml0ZXJzLiAgVGhpcyBjbGFzcyBwcmltYXJpbHkgdGFrZXMgY2FyZSBvZiBnbG9iYWwgcHJpbnRpbmcgY29uc3RhbnRzLAorLy8gd2hpY2ggYXJlIHVzZWQgaW4gdmVyeSBzaW1pbGFyIHdheXMgYWNyb3NzIGFsbCB0YXJnZXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfQVNNX0lORk9fSAorI2RlZmluZSBMTFZNX1RBUkdFVF9BU01fSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL01DL01DRGlyZWN0aXZlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTUNTZWN0aW9uOworICBjbGFzcyBNQ0NvbnRleHQ7CisgIAorICAvLy8gTUNBc21JbmZvIC0gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgYXNtCisgIC8vLyBwcm9wZXJ0aWVzIGFuZCBmZWF0dXJlcyBzcGVjaWZpYyB0byB0aGUgdGFyZ2V0LgorICBuYW1lc3BhY2UgRXhjZXB0aW9uSGFuZGxpbmcgeyBlbnVtIEV4Y2VwdGlvbnNUeXBlIHsgTm9uZSwgRHdhcmYsIFNqTGogfTsgfQorCisgIGNsYXNzIE1DQXNtSW5mbyB7CisgIHByb3RlY3RlZDoKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gUHJvcGVydGllcyB0byBiZSBzZXQgYnkgdGhlIHRhcmdldCB3cml0ZXIsIHVzZWQgdG8gY29uZmlndXJlIGFzbSBwcmludGVyLgorICAgIC8vCisKKyAgICAvLy8gSGFzU3Vic2VjdGlvbnNWaWFTeW1ib2xzIC0gVHJ1ZSBpZiB0aGlzIHRhcmdldCBoYXMgdGhlIE1hY2hPCisgICAgLy8vIC5zdWJzZWN0aW9uc192aWFfc3ltYm9scyBkaXJlY3RpdmUuCisgICAgYm9vbCBIYXNTdWJzZWN0aW9uc1ZpYVN5bWJvbHM7ICAgICAgICAgICAvLyBEZWZhdWx0IGlzIGZhbHNlLgorICAgIAorICAgIC8vLyBIYXNNYWNob1plcm9GaWxsRGlyZWN0aXZlIC0gVHJ1ZSBpZiB0aGlzIGlzIGEgTWFjaE8gdGFyZ2V0IHRoYXQgc3VwcG9ydHMKKyAgICAvLy8gdGhlIG1hY2hvLXNwZWNpZmljIC56ZXJvZmlsbCBkaXJlY3RpdmUgZm9yIGVtaXR0aW5nIEJTUyBTeW1ib2xzLgorICAgIGJvb2wgSGFzTWFjaG9aZXJvRmlsbERpcmVjdGl2ZTsgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIGZhbHNlLgorICAgIAorICAgIC8vLyBIYXNNYWNob1RCU1NEaXJlY3RpdmUgLSBUcnVlIGlmIHRoaXMgaXMgYSBNYWNoTyB0YXJnZXQgdGhhdCBzdXBwb3J0cworICAgIC8vLyB0aGUgbWFjaG8tc3BlY2lmaWMgLnRic3MgZGlyZWN0aXZlIGZvciBlbWl0dGluZyB0aHJlYWQgbG9jYWwgQlNTIFN5bWJvbHMKKyAgICBib29sIEhhc01hY2hvVEJTU0RpcmVjdGl2ZTsgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgZmFsc2UuCisgICAgCisgICAgLy8vIEhhc1N0YXRpY0N0b3JEdG9yUmVmZXJlbmNlSW5TdGF0aWNNb2RlIC0gVHJ1ZSBpZiB0aGUgY29tcGlsZXIgc2hvdWxkCisgICAgLy8vIGVtaXQgYSAiLnJlZmVyZW5jZSAuY29uc3RydWN0b3JzX3VzZWQiIG9yICIucmVmZXJlbmNlIC5kZXN0cnVjdG9yc191c2VkIgorICAgIC8vLyBkaXJlY3RpdmUgYWZ0ZXIgdGhlIGEgc3RhdGljIGN0b3IvZHRvciBsaXN0LiAgVGhpcyBkaXJlY3RpdmUgaXMgb25seQorICAgIC8vLyBlbWl0dGVkIGluIFN0YXRpYyByZWxvY2F0aW9uIG1vZGVsLgorICAgIGJvb2wgSGFzU3RhdGljQ3RvckR0b3JSZWZlcmVuY2VJblN0YXRpY01vZGU7ICAvLyBEZWZhdWx0IGlzIGZhbHNlLgorICAgIAorICAgIC8vLyBNYXhJbnN0TGVuZ3RoIC0gVGhpcyBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24sCisgICAgLy8vIHdoaWNoIGlzIG5lZWRlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIGFuIGlubGluZSBhc20uCisgICAgdW5zaWduZWQgTWF4SW5zdExlbmd0aDsgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byA0LgorICAgIAorICAgIC8vLyBQQ1N5bWJvbCAtIFRoZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIGN1cnJlbnQgUEMuICBVc2VkIGluIFBDCisgICAgLy8vIHJlbGF0aXZlIGV4cHJlc3Npb25zLgorICAgIGNvbnN0IGNoYXIgKlBDU3ltYm9sOyAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gIiQiLgorCisgICAgLy8vIFNlcGFyYXRvckNoYXIgLSBUaGlzIGNoYXJhY3RlciwgaWYgc3BlY2lmaWVkLCBpcyB1c2VkIHRvIHNlcGFyYXRlCisgICAgLy8vIGluc3RydWN0aW9ucyBmcm9tIGVhY2ggb3RoZXIgd2hlbiBvbiB0aGUgc2FtZSBsaW5lLiAgVGhpcyBpcyB1c2VkIHRvCisgICAgLy8vIG1lYXN1cmUgaW5saW5lIGFzbSBpbnN0cnVjdGlvbnMuCisgICAgY2hhciBTZXBhcmF0b3JDaGFyOyAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byAnOycKKworICAgIC8vLyBDb21tZW50Q29sdW1uIC0gVGhpcyBpbmRpY2F0ZXMgdGhlIGNvbW1lbnQgbnVtICh6ZXJvLWJhc2VkKSBhdAorICAgIC8vLyB3aGljaCBhc20gY29tbWVudHMgc2hvdWxkIGJlIHByaW50ZWQuCisgICAgdW5zaWduZWQgQ29tbWVudENvbHVtbjsgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byA0MAorCisgICAgLy8vIENvbW1lbnRTdHJpbmcgLSBUaGlzIGluZGljYXRlcyB0aGUgY29tbWVudCBjaGFyYWN0ZXIgdXNlZCBieSB0aGUKKyAgICAvLy8gYXNzZW1ibGVyLgorICAgIGNvbnN0IGNoYXIgKkNvbW1lbnRTdHJpbmc7ICAgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gIiMiCisKKyAgICAvLy8gR2xvYmFsUHJlZml4IC0gSWYgdGhpcyBpcyBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nLCBpdCBpcyBwcmVwZW5kZWQKKyAgICAvLy8gb250byBhbGwgZ2xvYmFsIHN5bWJvbHMuICBUaGlzIGlzIG9mdGVuIHVzZWQgZm9yICJfIiBvciAiLiIuCisgICAgY29uc3QgY2hhciAqR2xvYmFsUHJlZml4OyAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byAiIgorCisgICAgLy8vIFByaXZhdGVHbG9iYWxQcmVmaXggLSBUaGlzIHByZWZpeCBpcyB1c2VkIGZvciBnbG9iYWxzIGxpa2UgY29uc3RhbnQKKyAgICAvLy8gcG9vbCBlbnRyaWVzIHRoYXQgYXJlIGNvbXBsZXRlbHkgcHJpdmF0ZSB0byB0aGUgLnMgZmlsZSBhbmQgc2hvdWxkIG5vdAorICAgIC8vLyBoYXZlIG5hbWVzIGluIHRoZSAubyBmaWxlLiAgVGhpcyBpcyBvZnRlbiAiLiIgb3IgIkwiLgorICAgIGNvbnN0IGNoYXIgKlByaXZhdGVHbG9iYWxQcmVmaXg7ICAgICAgICAgLy8gRGVmYXVsdHMgdG8gIi4iCisgICAgCisgICAgLy8vIExpbmtlclByaXZhdGVHbG9iYWxQcmVmaXggLSBUaGlzIHByZWZpeCBpcyB1c2VkIGZvciBzeW1ib2xzIHRoYXQgc2hvdWxkCisgICAgLy8vIGJlIHBhc3NlZCB0aHJvdWdoIHRoZSBhc3NlbWJsZXIgYnV0IGJlIHJlbW92ZWQgYnkgdGhlIGxpbmtlci4gIFRoaXMKKyAgICAvLy8gaXMgImwiIG9uIERhcndpbiwgY3VycmVudGx5IHVzZWQgZm9yIHNvbWUgT2JqQyBtZXRhZGF0YS4KKyAgICBjb25zdCBjaGFyICpMaW5rZXJQcml2YXRlR2xvYmFsUHJlZml4OyAgIC8vIERlZmF1bHRzIHRvICIiCisgICAgCisgICAgLy8vIElubGluZUFzbVN0YXJ0L0VuZCAtIElmIHRoZXNlIGFyZSBub25lbXB0eSwgdGhleSBjb250YWluIGEgZGlyZWN0aXZlIHRvCisgICAgLy8vIGVtaXQgYmVmb3JlIGFuZCBhZnRlciBhbiBpbmxpbmUgYXNzZW1ibHkgc3RhdGVtZW50LgorICAgIGNvbnN0IGNoYXIgKklubGluZUFzbVN0YXJ0OyAgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gIiNBUFBcbiIKKyAgICBjb25zdCBjaGFyICpJbmxpbmVBc21FbmQ7ICAgICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvICIjTk9fQVBQXG4iCisKKyAgICAvLy8gQXNzZW1ibGVyRGlhbGVjdCAtIFdoaWNoIGRpYWxlY3Qgb2YgYW4gYXNzZW1ibGVyIHZhcmlhbnQgdG8gdXNlLgorICAgIHVuc2lnbmVkIEFzc2VtYmxlckRpYWxlY3Q7ICAgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gMAorCisgICAgLy8vIEFsbG93UXVvdGVzSW5OYW1lIC0gVGhpcyBpcyB0cnVlIGlmIHRoZSBhc3NlbWJsZXIgYWxsb3dzIGZvciBjb21wbGV4CisgICAgLy8vIHN5bWJvbCBuYW1lcyB0byBiZSBzdXJyb3VuZGVkIGluIHF1b3Rlcy4gIFRoaXMgZGVmYXVsdHMgdG8gZmFsc2UuCisgICAgYm9vbCBBbGxvd1F1b3Rlc0luTmFtZTsKKworICAgIC8vLyBBbGxvd05hbWVUb1N0YXJ0V2l0aERpZ2l0IC0gVGhpcyBpcyB0cnVlIGlmIHRoZSBhc3NlbWJsZXIgYWxsb3dzIHN5bWJvbAorICAgIC8vLyBuYW1lcyB0byBzdGFydCB3aXRoIGEgZGlnaXQgKGUuZy4sICIweDAwMjEiKS4gIFRoaXMgZGVmYXVsdHMgdG8gZmFsc2UuCisgICAgYm9vbCBBbGxvd05hbWVUb1N0YXJ0V2l0aERpZ2l0OworCisgICAgLy8vIEFsbG93UGVyaW9kc0luTmFtZSAtIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgYXNzZW1ibGVyIGFsbG93cyBwZXJpb2RzIGluCisgICAgLy8vIHN5bWJvbCBuYW1lcy4gIFRoaXMgZGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICBib29sIEFsbG93UGVyaW9kc0luTmFtZTsKKworICAgIC8vPT09LS0tIERhdGEgRW1pc3Npb24gRGlyZWN0aXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAgIC8vLyBaZXJvRGlyZWN0aXZlIC0gdGhpcyBzaG91bGQgYmUgc2V0IHRvIHRoZSBkaXJlY3RpdmUgdXNlZCB0byBnZXQgc29tZQorICAgIC8vLyBudW1iZXIgb2YgemVybyBieXRlcyBlbWl0dGVkIHRvIHRoZSBjdXJyZW50IHNlY3Rpb24uICBDb21tb24gY2FzZXMgYXJlCisgICAgLy8vICJcdC56ZXJvXHQiIGFuZCAiXHQuc3BhY2VcdCIuICBJZiB0aGlzIGlzIHNldCB0byBudWxsLCB0aGUKKyAgICAvLy8gRGF0YSpiaXRzRGlyZWN0aXZlJ3Mgd2lsbCBiZSB1c2VkIHRvIGVtaXQgemVybyBieXRlcy4KKyAgICBjb25zdCBjaGFyICpaZXJvRGlyZWN0aXZlOyAgICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvICJcdC56ZXJvXHQiCisKKyAgICAvLy8gQXNjaWlEaXJlY3RpdmUgLSBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgZW1pc3Npb24gb2YgYW4gYXNjaWkgc3RyaW5nIHdpdGgKKyAgICAvLy8gdGhlIHN0YW5kYXJkIEMgZXNjYXBlIGNoYXJhY3RlcnMgZW1iZWRkZWQgaW50byBpdC4KKyAgICBjb25zdCBjaGFyICpBc2NpaURpcmVjdGl2ZTsgICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvICJcdC5hc2NpaVx0IgorICAgIAorICAgIC8vLyBBc2NpekRpcmVjdGl2ZSAtIElmIG5vdCBudWxsLCB0aGlzIGFsbG93cyBmb3Igc3BlY2lhbCBoYW5kbGluZyBvZgorICAgIC8vLyB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5ncyBvbiB0aGlzIHRhcmdldC4gIFRoaXMgaXMgY29tbW9ubHkgc3VwcG9ydGVkIGFzCisgICAgLy8vICIuYXNjaXoiLiAgSWYgYSB0YXJnZXQgZG9lc24ndCBzdXBwb3J0IHRoaXMsIGl0IGNhbiBiZSBzZXQgdG8gbnVsbC4KKyAgICBjb25zdCBjaGFyICpBc2NpekRpcmVjdGl2ZTsgICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvICJcdC5hc2Npelx0IgorCisgICAgLy8vIERhdGFEaXJlY3RpdmVzIC0gVGhlc2UgZGlyZWN0aXZlcyBhcmUgdXNlZCB0byBvdXRwdXQgc29tZSB1bml0IG9mCisgICAgLy8vIGludGVnZXIgZGF0YSB0byB0aGUgY3VycmVudCBzZWN0aW9uLiAgSWYgYSBkYXRhIGRpcmVjdGl2ZSBpcyBzZXQgdG8KKyAgICAvLy8gbnVsbCwgc21hbGxlciBkYXRhIGRpcmVjdGl2ZXMgd2lsbCBiZSB1c2VkIHRvIGVtaXQgdGhlIGxhcmdlIHNpemVzLgorICAgIGNvbnN0IGNoYXIgKkRhdGE4Yml0c0RpcmVjdGl2ZTsgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gIlx0LmJ5dGVcdCIKKyAgICBjb25zdCBjaGFyICpEYXRhMTZiaXRzRGlyZWN0aXZlOyAgICAgICAgIC8vIERlZmF1bHRzIHRvICJcdC5zaG9ydFx0IgorICAgIGNvbnN0IGNoYXIgKkRhdGEzMmJpdHNEaXJlY3RpdmU7ICAgICAgICAgLy8gRGVmYXVsdHMgdG8gIlx0LmxvbmdcdCIKKyAgICBjb25zdCBjaGFyICpEYXRhNjRiaXRzRGlyZWN0aXZlOyAgICAgICAgIC8vIERlZmF1bHRzIHRvICJcdC5xdWFkXHQiCisKKyAgICAvLy8gR1BSZWwzMkRpcmVjdGl2ZSAtIGlmIG5vbi1udWxsLCBhIGRpcmVjdGl2ZSB0aGF0IGlzIHVzZWQgdG8gZW1pdCBhIHdvcmQKKyAgICAvLy8gd2hpY2ggc2hvdWxkIGJlIHJlbG9jYXRlZCBhcyBhIDMyLWJpdCBHUC1yZWxhdGl2ZSBvZmZzZXQsIGUuZy4gLmdwd29yZAorICAgIC8vLyBvbiBNaXBzIG9yIC5ncHJlbDMyIG9uIEFscGhhLgorICAgIGNvbnN0IGNoYXIgKkdQUmVsMzJEaXJlY3RpdmU7ICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gTlVMTC4KKyAgICAKKyAgICAvLy8gZ2V0RGF0YUFTRGlyZWN0aXZlIC0gUmV0dXJuIHRoZSBkaXJlY3RpdmUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBlbWl0CisgICAgLy8vIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBzaXplIHRvIHRoZSBzcGVjaWZpZWQgbnVtZXJpYyBhZGRyZXNzIHNwYWNlLgorICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0RGF0YUFTRGlyZWN0aXZlKHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIEFTKSBjb25zdCB7CisgICAgICBhc3NlcnQoQVMgIT0gMCAmJiAiRG9uJ3Qga25vdyB0aGUgZGlyZWN0aXZlcyBmb3IgZGVmYXVsdCBhZGRyIHNwYWNlIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLy8gU3VuU3R5bGVFTEZTZWN0aW9uU3dpdGNoU3ludGF4IC0gVGhpcyBpcyB0cnVlIGlmIHRoaXMgdGFyZ2V0IHVzZXMgIlN1bgorICAgIC8vLyBTdHlsZSIgc3ludGF4IGZvciBzZWN0aW9uIHN3aXRjaGluZyAoIiNhbGxvYywjd3JpdGUiIGV0YykgaW5zdGVhZCBvZiB0aGUKKyAgICAvLy8gbm9ybWFsIEVMRiBzeW50YXggKCwiYSx3IikgaW4gLnNlY3Rpb24gZGlyZWN0aXZlcy4KKyAgICBib29sIFN1blN0eWxlRUxGU2VjdGlvblN3aXRjaFN5bnRheDsgICAgIC8vIERlZmF1bHRzIHRvIGZhbHNlLgorCisgICAgLy8vIFVzZXNFTEZTZWN0aW9uRGlyZWN0aXZlRm9yQlNTIC0gVGhpcyBpcyB0cnVlIGlmIHRoaXMgdGFyZ2V0IHVzZXMgRUxGCisgICAgLy8vICcuc2VjdGlvbicgZGlyZWN0aXZlIGJlZm9yZSB0aGUgJy5ic3MnIG9uZS4gSXQncyB1c2VkIGZvciBQUEMvTGludXggCisgICAgLy8vIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgJy5ic3MnIGRpcmVjdGl2ZSBvbmx5LgorICAgIGJvb2wgVXNlc0VMRlNlY3Rpb25EaXJlY3RpdmVGb3JCU1M7ICAgICAgLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgCisgICAgLy8vIEhhc01pY3Jvc29mdEZhc3RTdGRDYWxsTWFuZ2xpbmcgLSBUcnVlIGlmIHRoaXMgdGFyZ2V0IHVzZXMgbWljcm9zb2Z0CisgICAgLy8vIHN0eWxlIG1hbmdsaW5nIGZvciBmdW5jdGlvbnMgd2l0aCBYODZfU3RkQ2FsbC9YODZfRmFzdENhbGwgY2FsbGluZworICAgIC8vLyBjb252ZW50aW9uLgorICAgIGJvb2wgSGFzTWljcm9zb2Z0RmFzdFN0ZENhbGxNYW5nbGluZzsgICAgLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgCisgICAgLy89PT0tLS0gQWxpZ25tZW50IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgICAgLy8vIEFsaWduRGlyZWN0aXZlIC0gVGhlIGRpcmVjdGl2ZSB1c2VkIHRvIGVtaXQgcm91bmQgdXAgdG8gYW4gYWxpZ25tZW50CisgICAgLy8vIGJvdW5kYXJ5LgorICAgIC8vLworICAgIGNvbnN0IGNoYXIgKkFsaWduRGlyZWN0aXZlOyAgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gIlx0LmFsaWduXHQiCisKKyAgICAvLy8gQWxpZ25tZW50SXNJbkJ5dGVzIC0gSWYgdGhpcyBpcyB0cnVlICh0aGUgZGVmYXVsdCkgdGhlbiB0aGUgYXNtcHJpbnRlcgorICAgIC8vLyBlbWl0cyAiLmFsaWduIE4iIGRpcmVjdGl2ZXMsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGlnbiB0by4KKyAgICAvLy8gT3RoZXJ3aXNlLCBpdCBlbWl0cyAiLmFsaWduIGxvZzIoTikiLCBlLmcuIDMgdG8gYWxpZ24gdG8gYW4gOCBieXRlCisgICAgLy8vIGJvdW5kYXJ5LgorICAgIGJvb2wgQWxpZ25tZW50SXNJbkJ5dGVzOyAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gdHJ1ZQorCisgICAgLy8vIFRleHRBbGlnbkZpbGxWYWx1ZSAtIElmIG5vbi16ZXJvLCB0aGlzIGlzIHVzZWQgdG8gZmlsbCB0aGUgZXhlY3V0YWJsZQorICAgIC8vLyBzcGFjZSBjcmVhdGVkIGFzIHRoZSByZXN1bHQgb2YgYSBhbGlnbm1lbnQgZGlyZWN0aXZlLgorICAgIHVuc2lnbmVkIFRleHRBbGlnbkZpbGxWYWx1ZTsgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gMAorCisgICAgLy89PT0tLS0gR2xvYmFsIFZhcmlhYmxlIEVtaXNzaW9uIERpcmVjdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIAorICAgIC8vLyBHbG9iYWxEaXJlY3RpdmUgLSBUaGlzIGlzIHRoZSBkaXJlY3RpdmUgdXNlZCB0byBkZWNsYXJlIGEgZ2xvYmFsIGVudGl0eS4KKyAgICAvLy8KKyAgICBjb25zdCBjaGFyICpHbG9iYWxEaXJlY3RpdmU7ICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvIE5VTEwuCisKKyAgICAvLy8gRXh0ZXJuRGlyZWN0aXZlIC0gVGhpcyBpcyB0aGUgZGlyZWN0aXZlIHVzZWQgdG8gZGVjbGFyZSBleHRlcm5hbCAKKyAgICAvLy8gZ2xvYmFscy4KKyAgICAvLy8KKyAgICBjb25zdCBjaGFyICpFeHRlcm5EaXJlY3RpdmU7ICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvIE5VTEwuCisgICAgCisgICAgLy8vIEhhc1NldERpcmVjdGl2ZSAtIFRydWUgaWYgdGhlIGFzc2VtYmxlciBzdXBwb3J0cyB0aGUgLnNldCBkaXJlY3RpdmUuCisgICAgYm9vbCBIYXNTZXREaXJlY3RpdmU7ICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byB0cnVlLgorICAgIAorICAgIC8vLyBIYXNMQ09NTURpcmVjdGl2ZSAtIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIHRoZSAubGNvbW0KKyAgICAvLy8gZGlyZWN0aXZlLgorICAgIGJvb2wgSGFzTENPTU1EaXJlY3RpdmU7ICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgCisgICAgLy8vIENPTU1EaXJlY3RpdmVBbGlnbm1lbnRJc0luQnl0ZXMgLSBUcnVlIGlzIENPTU1EaXJlY3RpdmUncyBvcHRpb25hbAorICAgIC8vLyBhbGlnbm1lbnQgaXMgdG8gYmUgc3BlY2lmaWVkIGluIGJ5dGVzIGluc3RlYWQgb2YgbG9nMihuKS4KKyAgICBib29sIENPTU1EaXJlY3RpdmVBbGlnbm1lbnRJc0luQnl0ZXM7ICAgIC8vIERlZmF1bHRzIHRvIHRydWU7CisgICAgCisgICAgLy8vIEhhc0RvdFR5cGVEb3RTaXplRGlyZWN0aXZlIC0gVHJ1ZSBpZiB0aGUgdGFyZ2V0IGhhcyAudHlwZSBhbmQgLnNpemUKKyAgICAvLy8gZGlyZWN0aXZlcywgdGhpcyBpcyB0cnVlIGZvciBtb3N0IEVMRiB0YXJnZXRzLgorICAgIGJvb2wgSGFzRG90VHlwZURvdFNpemVEaXJlY3RpdmU7ICAgICAgICAgLy8gRGVmYXVsdHMgdG8gdHJ1ZS4KKworICAgIC8vLyBIYXNTaW5nbGVQYXJhbWV0ZXJEb3RGaWxlIC0gVHJ1ZSBpZiB0aGUgdGFyZ2V0IGhhcyBhIHNpbmdsZSBwYXJhbWV0ZXIKKyAgICAvLy8gLmZpbGUgZGlyZWN0aXZlLCB0aGlzIGlzIHRydWUgZm9yIEVMRiB0YXJnZXRzLgorICAgIGJvb2wgSGFzU2luZ2xlUGFyYW1ldGVyRG90RmlsZTsgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gdHJ1ZS4KKworICAgIC8vLyBIYXNOb0RlYWRTdHJpcCAtIFRydWUgaWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgdGhlIE1hY2hPIC5ub19kZWFkX3N0cmlwCisgICAgLy8vIGRpcmVjdGl2ZS4KKyAgICBib29sIEhhc05vRGVhZFN0cmlwOyAgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvIGZhbHNlLgorCisgICAgLy8vIFdlYWtSZWZEaXJlY3RpdmUgLSBUaGlzIGRpcmVjdGl2ZSwgaWYgbm9uLW51bGwsIGlzIHVzZWQgdG8gZGVjbGFyZSBhCisgICAgLy8vIGdsb2JhbCBhcyBiZWluZyBhIHdlYWsgdW5kZWZpbmVkIHN5bWJvbC4KKyAgICBjb25zdCBjaGFyICpXZWFrUmVmRGlyZWN0aXZlOyAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvIE5VTEwuCisgICAgCisgICAgLy8vIFdlYWtEZWZEaXJlY3RpdmUgLSBUaGlzIGRpcmVjdGl2ZSwgaWYgbm9uLW51bGwsIGlzIHVzZWQgdG8gZGVjbGFyZSBhCisgICAgLy8vIGdsb2JhbCBhcyBiZWluZyBhIHdlYWsgZGVmaW5lZCBzeW1ib2wuCisgICAgY29uc3QgY2hhciAqV2Vha0RlZkRpcmVjdGl2ZTsgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byBOVUxMLgorCisgICAgLy8vIExpbmtPbmNlRGlyZWN0aXZlIC0gVGhpcyBkaXJlY3RpdmUsIGlmIG5vbi1udWxsIGlzIHVzZWQgdG8gZGVjbGFyZSBhCisgICAgLy8vIGdsb2JhbCBhcyBiZWluZyBhIHdlYWsgZGVmaW5lZCBzeW1ib2wuICBUaGlzIGlzIHVzZWQgb24gY3lnd2luL21pbmd3LgorICAgIGNvbnN0IGNoYXIgKkxpbmtPbmNlRGlyZWN0aXZlOyAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gTlVMTC4KKyAgICAKKyAgICAvLy8gSGlkZGVuVmlzaWJpbGl0eUF0dHIgLSBUaGlzIGF0dHJpYnV0ZSwgaWYgbm90IE1DU0FfSW52YWxpZCwgaXMgdXNlZCB0bworICAgIC8vLyBkZWNsYXJlIGEgc3ltYm9sIGFzIGhhdmluZyBoaWRkZW4gdmlzaWJpbGl0eS4KKyAgICBNQ1N5bWJvbEF0dHIgSGlkZGVuVmlzaWJpbGl0eUF0dHI7ICAgICAgIC8vIERlZmF1bHRzIHRvIE1DU0FfSGlkZGVuLgorCisgICAgLy8vIFByb3RlY3RlZFZpc2liaWxpdHlBdHRyIC0gVGhpcyBhdHRyaWJ1dGUsIGlmIG5vdCBNQ1NBX0ludmFsaWQsIGlzIHVzZWQKKyAgICAvLy8gdG8gZGVjbGFyZSBhIHN5bWJvbCBhcyBoYXZpbmcgcHJvdGVjdGVkIHZpc2liaWxpdHkuCisgICAgTUNTeW1ib2xBdHRyIFByb3RlY3RlZFZpc2liaWxpdHlBdHRyOyAgICAvLyBEZWZhdWx0cyB0byBNQ1NBX1Byb3RlY3RlZAorCisgICAgLy89PT0tLS0gRHdhcmYgRW1pc3Npb24gRGlyZWN0aXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgICAvLy8gSGFzTEVCMTI4IC0gVHJ1ZSBpZiB0YXJnZXQgYXNtIHN1cHBvcnRzIGxlYjEyOCBkaXJlY3RpdmVzLgorICAgIGJvb2wgSGFzTEVCMTI4OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisKKyAgICAvLy8gaGFzRG90TG9jQW5kRG90RmlsZSAtIFRydWUgaWYgdGFyZ2V0IGFzbSBzdXBwb3J0cyAubG9jIGFuZCAuZmlsZQorICAgIC8vLyBkaXJlY3RpdmVzIGZvciBlbWl0dGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgICAgYm9vbCBIYXNEb3RMb2NBbmREb3RGaWxlOyAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byBmYWxzZS4KKworICAgIC8vLyBTdXBwb3J0c0RlYnVnSW5mb3JtYXRpb24gLSBUcnVlIGlmIHRhcmdldCBzdXBwb3J0cyBlbWlzc2lvbiBvZiBkZWJ1Z2dpbmcKKyAgICAvLy8gaW5mb3JtYXRpb24uCisgICAgYm9vbCBTdXBwb3J0c0RlYnVnSW5mb3JtYXRpb247ICAgICAgICAgICAvLyBEZWZhdWx0cyB0byBmYWxzZS4KKworICAgIC8vLyBTdXBwb3J0c0V4Y2VwdGlvbkhhbmRsaW5nIC0gVHJ1ZSBpZiB0YXJnZXQgc3VwcG9ydHMgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgIEV4Y2VwdGlvbkhhbmRsaW5nOjpFeGNlcHRpb25zVHlwZSBFeGNlcHRpb25zVHlwZTsgLy8gRGVmYXVsdHMgdG8gTm9uZQorCisgICAgLy8vIFJlcXVpcmVzRnJhbWVTZWN0aW9uIC0gdHJ1ZSBpZiB0aGUgRHdhcmYyIG91dHB1dCBuZWVkcyBhIGZyYW1lIHNlY3Rpb24KKyAgICBib29sIER3YXJmUmVxdWlyZXNGcmFtZVNlY3Rpb247ICAgICAgICAgIC8vIERlZmF1bHRzIHRvIHRydWUuCisKKyAgICAvLy8gRHdhcmZVc2VzSW5saW5lSW5mb1NlY3Rpb24gLSBUcnVlIGlmIER3YXJmRGVidWdJbmxpbmVTZWN0aW9uIGlzIHVzZWQgdG8KKyAgICAvLy8gZW5jb2RlIGlubGluZSBzdWJyb3V0aW5lIGluZm9ybWF0aW9uLgorICAgIGJvb2wgRHdhcmZVc2VzSW5saW5lSW5mb1NlY3Rpb247ICAgICAgICAgLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisKKyAgICAvLy8gRHdhcmZTZWN0aW9uT2Zmc2V0RGlyZWN0aXZlIC0gU3BlY2lhbCBzZWN0aW9uIG9mZnNldCBkaXJlY3RpdmUuCisgICAgY29uc3QgY2hhciogRHdhcmZTZWN0aW9uT2Zmc2V0RGlyZWN0aXZlOyAvLyBEZWZhdWx0cyB0byBOVUxMCisgICAgCisgICAgLy89PT0tLS0gQ0JFIEFzbSBUcmFuc2xhdGlvbiBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgICBjb25zdCBjaGFyICpjb25zdCAqQXNtVHJhbnNDQkU7ICAgICAgICAgIC8vIERlZmF1bHRzIHRvIGVtcHR5CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IE1DQXNtSW5mbygpOworICAgIHZpcnR1YWwgfk1DQXNtSW5mbygpOworCisgICAgLy8gRklYTUU6IG1vdmUgdGhlc2UgbWV0aG9kcyB0byBEd2FyZlByaW50ZXIgd2hlbiB0aGUgSklUIHN0b3BzIHVzaW5nIHRoZW0uCisgICAgc3RhdGljIHVuc2lnbmVkIGdldFNMRUIxMjhTaXplKGludCBWYWx1ZSk7CisgICAgc3RhdGljIHVuc2lnbmVkIGdldFVMRUIxMjhTaXplKHVuc2lnbmVkIFZhbHVlKTsKKworICAgIGJvb2wgaGFzU3Vic2VjdGlvbnNWaWFTeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gSGFzU3Vic2VjdGlvbnNWaWFTeW1ib2xzOyB9CisgICAgCisgICAgLy8gRGF0YSBkaXJlY3RpdmUgYWNjZXNzb3JzLgorICAgIC8vCisgICAgY29uc3QgY2hhciAqZ2V0RGF0YThiaXRzRGlyZWN0aXZlKHVuc2lnbmVkIEFTID0gMCkgY29uc3QgeworICAgICAgcmV0dXJuIEFTID09IDAgPyBEYXRhOGJpdHNEaXJlY3RpdmUgOiBnZXREYXRhQVNEaXJlY3RpdmUoOCwgQVMpOworICAgIH0KKyAgICBjb25zdCBjaGFyICpnZXREYXRhMTZiaXRzRGlyZWN0aXZlKHVuc2lnbmVkIEFTID0gMCkgY29uc3QgeworICAgICAgcmV0dXJuIEFTID09IDAgPyBEYXRhMTZiaXRzRGlyZWN0aXZlIDogZ2V0RGF0YUFTRGlyZWN0aXZlKDE2LCBBUyk7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKmdldERhdGEzMmJpdHNEaXJlY3RpdmUodW5zaWduZWQgQVMgPSAwKSBjb25zdCB7CisgICAgICByZXR1cm4gQVMgPT0gMCA/IERhdGEzMmJpdHNEaXJlY3RpdmUgOiBnZXREYXRhQVNEaXJlY3RpdmUoMzIsIEFTKTsKKyAgICB9CisgICAgY29uc3QgY2hhciAqZ2V0RGF0YTY0Yml0c0RpcmVjdGl2ZSh1bnNpZ25lZCBBUyA9IDApIGNvbnN0IHsKKyAgICAgIHJldHVybiBBUyA9PSAwID8gRGF0YTY0Yml0c0RpcmVjdGl2ZSA6IGdldERhdGFBU0RpcmVjdGl2ZSg2NCwgQVMpOworICAgIH0KKyAgICBjb25zdCBjaGFyICpnZXRHUFJlbDMyRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gR1BSZWwzMkRpcmVjdGl2ZTsgfQorCisgICAgLy8vIGdldE5vbmV4ZWN1dGFibGVTdGFja1NlY3Rpb24gLSBUYXJnZXRzIGNhbiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8KKyAgICAvLy8gc3BlY2lmeSBhIHNlY3Rpb24gdG8gc3dpdGNoIHRvIGlmIHRoZSB0cmFuc2xhdGlvbiB1bml0IGRvZXNuJ3QgaGF2ZSBhbnkKKyAgICAvLy8gdHJhbXBvbGluZXMgdGhhdCByZXF1aXJlIGFuIGV4ZWN1dGFibGUgc3RhY2suCisgICAgdmlydHVhbCBjb25zdCBNQ1NlY3Rpb24gKmdldE5vbmV4ZWN1dGFibGVTdGFja1NlY3Rpb24oTUNDb250ZXh0ICZDdHgpIGNvbnN0eworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIGJvb2wgdXNlc1N1blN0eWxlRUxGU2VjdGlvblN3aXRjaFN5bnRheCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdW5TdHlsZUVMRlNlY3Rpb25Td2l0Y2hTeW50YXg7CisgICAgfQorICAgIAorICAgIGJvb2wgdXNlc0VMRlNlY3Rpb25EaXJlY3RpdmVGb3JCU1MoKSBjb25zdCB7CisgICAgICByZXR1cm4gVXNlc0VMRlNlY3Rpb25EaXJlY3RpdmVGb3JCU1M7CisgICAgfQorCisgICAgYm9vbCBoYXNNaWNyb3NvZnRGYXN0U3RkQ2FsbE1hbmdsaW5nKCkgY29uc3QgeworICAgICAgcmV0dXJuIEhhc01pY3Jvc29mdEZhc3RTdGRDYWxsTWFuZ2xpbmc7CisgICAgfQorICAgIAorICAgIC8vIEFjY2Vzc29ycy4KKyAgICAvLworICAgIGJvb2wgaGFzTWFjaG9aZXJvRmlsbERpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEhhc01hY2hvWmVyb0ZpbGxEaXJlY3RpdmU7IH0KKyAgICBib29sIGhhc01hY2hvVEJTU0RpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEhhc01hY2hvVEJTU0RpcmVjdGl2ZTsgfQorICAgIGJvb2wgaGFzU3RhdGljQ3RvckR0b3JSZWZlcmVuY2VJblN0YXRpY01vZGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gSGFzU3RhdGljQ3RvckR0b3JSZWZlcmVuY2VJblN0YXRpY01vZGU7CisgICAgfQorICAgIHVuc2lnbmVkIGdldE1heEluc3RMZW5ndGgoKSBjb25zdCB7CisgICAgICByZXR1cm4gTWF4SW5zdExlbmd0aDsKKyAgICB9CisgICAgY29uc3QgY2hhciAqZ2V0UENTeW1ib2woKSBjb25zdCB7CisgICAgICByZXR1cm4gUENTeW1ib2w7CisgICAgfQorICAgIGNoYXIgZ2V0U2VwYXJhdG9yQ2hhcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTZXBhcmF0b3JDaGFyOworICAgIH0KKyAgICB1bnNpZ25lZCBnZXRDb21tZW50Q29sdW1uKCkgY29uc3QgeworICAgICAgcmV0dXJuIENvbW1lbnRDb2x1bW47CisgICAgfQorICAgIGNvbnN0IGNoYXIgKmdldENvbW1lbnRTdHJpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gQ29tbWVudFN0cmluZzsKKyAgICB9CisgICAgY29uc3QgY2hhciAqZ2V0R2xvYmFsUHJlZml4KCkgY29uc3QgeworICAgICAgcmV0dXJuIEdsb2JhbFByZWZpeDsKKyAgICB9CisgICAgY29uc3QgY2hhciAqZ2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBQcml2YXRlR2xvYmFsUHJlZml4OworICAgIH0KKyAgICBjb25zdCBjaGFyICpnZXRMaW5rZXJQcml2YXRlR2xvYmFsUHJlZml4KCkgY29uc3QgeworICAgICAgcmV0dXJuIExpbmtlclByaXZhdGVHbG9iYWxQcmVmaXg7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKmdldElubGluZUFzbVN0YXJ0KCkgY29uc3QgeworICAgICAgcmV0dXJuIElubGluZUFzbVN0YXJ0OworICAgIH0KKyAgICBjb25zdCBjaGFyICpnZXRJbmxpbmVBc21FbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gSW5saW5lQXNtRW5kOworICAgIH0KKyAgICB1bnNpZ25lZCBnZXRBc3NlbWJsZXJEaWFsZWN0KCkgY29uc3QgeworICAgICAgcmV0dXJuIEFzc2VtYmxlckRpYWxlY3Q7CisgICAgfQorICAgIGJvb2wgZG9lc0FsbG93UXVvdGVzSW5OYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuIEFsbG93UXVvdGVzSW5OYW1lOworICAgIH0KKyAgICBib29sIGRvZXNBbGxvd05hbWVUb1N0YXJ0V2l0aERpZ2l0KCkgY29uc3QgeworICAgICAgcmV0dXJuIEFsbG93TmFtZVRvU3RhcnRXaXRoRGlnaXQ7CisgICAgfQorICAgIGJvb2wgZG9lc0FsbG93UGVyaW9kc0luTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBBbGxvd1BlcmlvZHNJbk5hbWU7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKmdldFplcm9EaXJlY3RpdmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gWmVyb0RpcmVjdGl2ZTsKKyAgICB9CisgICAgY29uc3QgY2hhciAqZ2V0QXNjaWlEaXJlY3RpdmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gQXNjaWlEaXJlY3RpdmU7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKmdldEFzY2l6RGlyZWN0aXZlKCkgY29uc3QgeworICAgICAgcmV0dXJuIEFzY2l6RGlyZWN0aXZlOworICAgIH0KKyAgICBjb25zdCBjaGFyICpnZXRBbGlnbkRpcmVjdGl2ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBBbGlnbkRpcmVjdGl2ZTsKKyAgICB9CisgICAgYm9vbCBnZXRBbGlnbm1lbnRJc0luQnl0ZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gQWxpZ25tZW50SXNJbkJ5dGVzOworICAgIH0KKyAgICB1bnNpZ25lZCBnZXRUZXh0QWxpZ25GaWxsVmFsdWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gVGV4dEFsaWduRmlsbFZhbHVlOworICAgIH0KKyAgICBjb25zdCBjaGFyICpnZXRHbG9iYWxEaXJlY3RpdmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gR2xvYmFsRGlyZWN0aXZlOworICAgIH0KKyAgICBjb25zdCBjaGFyICpnZXRFeHRlcm5EaXJlY3RpdmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gRXh0ZXJuRGlyZWN0aXZlOworICAgIH0KKyAgICBib29sIGhhc1NldERpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEhhc1NldERpcmVjdGl2ZTsgfQorICAgIGJvb2wgaGFzTENPTU1EaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBIYXNMQ09NTURpcmVjdGl2ZTsgfQorICAgIGJvb2wgaGFzRG90VHlwZURvdFNpemVEaXJlY3RpdmUoKSBjb25zdCB7cmV0dXJuIEhhc0RvdFR5cGVEb3RTaXplRGlyZWN0aXZlO30KKyAgICBib29sIGdldENPTU1EaXJlY3RpdmVBbGlnbm1lbnRJc0luQnl0ZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gQ09NTURpcmVjdGl2ZUFsaWdubWVudElzSW5CeXRlczsKKyAgICB9CisgICAgYm9vbCBoYXNTaW5nbGVQYXJhbWV0ZXJEb3RGaWxlKCkgY29uc3QgeyByZXR1cm4gSGFzU2luZ2xlUGFyYW1ldGVyRG90RmlsZTsgfQorICAgIGJvb2wgaGFzTm9EZWFkU3RyaXAoKSBjb25zdCB7IHJldHVybiBIYXNOb0RlYWRTdHJpcDsgfQorICAgIGNvbnN0IGNoYXIgKmdldFdlYWtSZWZEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBXZWFrUmVmRGlyZWN0aXZlOyB9CisgICAgY29uc3QgY2hhciAqZ2V0V2Vha0RlZkRpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIFdlYWtEZWZEaXJlY3RpdmU7IH0KKyAgICBjb25zdCBjaGFyICpnZXRMaW5rT25jZURpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIExpbmtPbmNlRGlyZWN0aXZlOyB9CisgICAgCisgICAgTUNTeW1ib2xBdHRyIGdldEhpZGRlblZpc2liaWxpdHlBdHRyKCkgY29uc3QgeyByZXR1cm4gSGlkZGVuVmlzaWJpbGl0eUF0dHI7fQorICAgIE1DU3ltYm9sQXR0ciBnZXRQcm90ZWN0ZWRWaXNpYmlsaXR5QXR0cigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBQcm90ZWN0ZWRWaXNpYmlsaXR5QXR0cjsKKyAgICB9CisgICAgYm9vbCBoYXNMRUIxMjgoKSBjb25zdCB7CisgICAgICByZXR1cm4gSGFzTEVCMTI4OworICAgIH0KKyAgICBib29sIGhhc0RvdExvY0FuZERvdEZpbGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gSGFzRG90TG9jQW5kRG90RmlsZTsKKyAgICB9CisgICAgYm9vbCBkb2VzU3VwcG9ydERlYnVnSW5mb3JtYXRpb24oKSBjb25zdCB7CisgICAgICByZXR1cm4gU3VwcG9ydHNEZWJ1Z0luZm9ybWF0aW9uOworICAgIH0KKyAgICBib29sIGRvZXNTdXBwb3J0RXhjZXB0aW9uSGFuZGxpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gRXhjZXB0aW9uc1R5cGUgIT0gRXhjZXB0aW9uSGFuZGxpbmc6Ok5vbmU7CisgICAgfQorICAgIEV4Y2VwdGlvbkhhbmRsaW5nOjpFeGNlcHRpb25zVHlwZSBnZXRFeGNlcHRpb25IYW5kbGluZ1R5cGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gRXhjZXB0aW9uc1R5cGU7CisgICAgfQorICAgIGJvb2wgZG9lc0R3YXJmUmVxdWlyZUZyYW1lU2VjdGlvbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBEd2FyZlJlcXVpcmVzRnJhbWVTZWN0aW9uOworICAgIH0KKyAgICBib29sIGRvZXNEd2FyZlVzZXNJbmxpbmVJbmZvU2VjdGlvbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBEd2FyZlVzZXNJbmxpbmVJbmZvU2VjdGlvbjsKKyAgICB9CisgICAgY29uc3QgY2hhciAqZ2V0RHdhcmZTZWN0aW9uT2Zmc2V0RGlyZWN0aXZlKCkgY29uc3QgeworICAgICAgcmV0dXJuIER3YXJmU2VjdGlvbk9mZnNldERpcmVjdGl2ZTsKKyAgICB9CisgICAgY29uc3QgY2hhciAqY29uc3QgKmdldEFzbUNCRSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBBc21UcmFuc0NCRTsKKyAgICB9CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0NPRkYuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9DT0ZGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlZTE1OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9DT0ZGLmgKQEAgLTAsMCArMSwyNCBAQAorLy89PT0tLSBNQ0FzbUluZm9DT0ZGLmggLSBDT0ZGIGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPRkZfVEFSR0VUX0FTTV9JTkZPX0gKKyNkZWZpbmUgTExWTV9DT0ZGX1RBUkdFVF9BU01fSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1DQXNtSW5mb0NPRkYgOiBwdWJsaWMgTUNBc21JbmZvIHsKKyAgcHJvdGVjdGVkOgorICAgIGV4cGxpY2l0IE1DQXNtSW5mb0NPRkYoKTsKKyAgICAgIAorICB9OworfQorCisKKyNlbmRpZiAvLyBMTFZNX0NPRkZfVEFSR0VUX0FTTV9JTkZPX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9EYXJ3aW4uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9EYXJ3aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVhYTNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0Rhcndpbi5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LS0tLSBNQ0FzbUluZm9EYXJ3aW4uaCAtIERhcndpbiBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGFyZ2V0IGFzbSBwcm9wZXJ0aWVzIHJlbGF0ZWQgd2hhdCBmb3JtIGFzbSBzdGF0ZW1lbnRzCisvLyBzaG91bGQgdGFrZSBpbiBnZW5lcmFsIG9uIERhcndpbi1iYXNlZCB0YXJnZXRzCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RBUldJTl9UQVJHRVRfQVNNX0lORk9fSAorI2RlZmluZSBMTFZNX0RBUldJTl9UQVJHRVRfQVNNX0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBHbG9iYWxWYWx1ZTsKKyAgY2xhc3MgR2xvYmFsVmFyaWFibGU7CisgIGNsYXNzIFR5cGU7CisgIGNsYXNzIE1hbmdsZXI7CisKKyAgc3RydWN0IE1DQXNtSW5mb0RhcndpbiA6IHB1YmxpYyBNQ0FzbUluZm8geworICAgIGV4cGxpY2l0IE1DQXNtSW5mb0RhcndpbigpOworICB9OworfQorCisKKyNlbmRpZiAvLyBMTFZNX0RBUldJTl9UQVJHRVRfQVNNX0lORk9fSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DQXNtTGF5b3V0LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNBc21MYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTU2NWJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DQXNtTGF5b3V0LmgKQEAgLTAsMCArMSwxMzUgQEAKKy8vPT09LSBNQ0FzbUxheW91dC5oIC0gQXNzZW1ibHkgTGF5b3V0IE9iamVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0FTTUxBWU9VVF9ICisjZGVmaW5lIExMVk1fTUNfTUNBU01MQVlPVVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNBc3NlbWJsZXI7CitjbGFzcyBNQ0ZyYWdtZW50OworY2xhc3MgTUNTZWN0aW9uRGF0YTsKK2NsYXNzIE1DU3ltYm9sRGF0YTsKKworLy8vIEVuY2Fwc3VsYXRlcyB0aGUgbGF5b3V0IG9mIGFuIGFzc2VtYmx5IGZpbGUgYXQgYSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuCisvLy8KKy8vLyBBc3NlbWJseSBtYXkgcmVxdWlyaW5nIGNvbXB1dGUgbXVsdGlwbGUgbGF5b3V0cyBmb3IgYSBwYXJ0aWN1bGFyIGFzc2VtYmx5CisvLy8gZmlsZSBhcyBwYXJ0IG9mIHRoZSByZWxheGF0aW9uIHByb2Nlc3MuIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBsYXlvdXQKKy8vLyBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBpcyBhbHdheXMgcG9zc2libGUgdG8KKy8vLyBlZmZpY2llbnRseSBjb21wdXRlIHRoZSBleGFjdCBhZGRyZXNzZXMgb2YgYW55IHN5bWJvbCBpbiB0aGUgYXNzZW1ibHkgZmlsZSwKKy8vLyBldmVuIGR1cmluZyB0aGUgcmVsYXhhdGlvbiBwcm9jZXNzLgorY2xhc3MgTUNBc21MYXlvdXQgeworcHVibGljOgorICB0eXBlZGVmIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxNQ1NlY3Rpb25EYXRhKj46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxNQ1NlY3Rpb25EYXRhKj46Oml0ZXJhdG9yIGl0ZXJhdG9yOworCitwcml2YXRlOgorICBNQ0Fzc2VtYmxlciAmQXNzZW1ibGVyOworCisgIC8vLyBMaXN0IG9mIHNlY3Rpb25zIGluIGxheW91dCBvcmRlci4KKyAgbGx2bTo6U21hbGxWZWN0b3I8TUNTZWN0aW9uRGF0YSosIDE2PiBTZWN0aW9uT3JkZXI7CisKKyAgLy8vIFRoZSBsYXN0IGZyYWdtZW50IHdoaWNoIHdhcyBsYXllZCBvdXQsIG9yIDAgaWYgbm90aGluZyBoYXMgYmVlbiBsYXllZAorICAvLy8gb3V0LiBGcmFnbWVudHMgYXJlIGFsd2F5cyBsYXllZCBvdXQgaW4gb3JkZXIsIHNvIGFsbCBmcmFnbWVudHMgd2l0aCBhCisgIC8vLyBsb3dlciBvcmRpbmFsIHdpbGwgYmUgdXAgdG8gZGF0ZS4KKyAgbXV0YWJsZSBNQ0ZyYWdtZW50ICpMYXN0VmFsaWRGcmFnbWVudDsKKworICAvLy8gXGJyaWVmIE1ha2Ugc3VyZSB0aGF0IHRoZSBsYXlvdXQgZm9yIHRoZSBnaXZlbiBmcmFnbWVudCBpcyB2YWxpZCwgbGF6aWx5CisgIC8vLyBjb21wdXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICB2b2lkIEVuc3VyZVZhbGlkKGNvbnN0IE1DRnJhZ21lbnQgKkYpIGNvbnN0OworCisgIGJvb2wgaXNTZWN0aW9uVXBUb0RhdGUoY29uc3QgTUNTZWN0aW9uRGF0YSAqU0QpIGNvbnN0OworICBib29sIGlzRnJhZ21lbnRVcFRvRGF0ZShjb25zdCBNQ0ZyYWdtZW50ICpGKSBjb25zdDsKKworcHVibGljOgorICBNQ0FzbUxheW91dChNQ0Fzc2VtYmxlciAmX0Fzc2VtYmxlcik7CisKKyAgLy8vIEdldCB0aGUgYXNzZW1ibGVyIG9iamVjdCB0aGlzIGlzIGEgbGF5b3V0IGZvci4KKyAgTUNBc3NlbWJsZXIgJmdldEFzc2VtYmxlcigpIGNvbnN0IHsgcmV0dXJuIEFzc2VtYmxlcjsgfQorCisgIC8vLyBcYnJpZWYgVXBkYXRlIHRoZSBsYXlvdXQgYmVjYXVzZSBhIGZyYWdtZW50IGhhcyBiZWVuIHJlc2l6ZWQuIFRoZQorICAvLy8gZnJhZ21lbnRzIHNpemUgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHVwZGF0ZWQsIHRoZSBcYXJnIFNsaWRlQW1vdW50IGlzCisgIC8vLyB0aGUgZGVsdGEgZnJvbSB0aGUgb2xkIHNpemUuCisgIHZvaWQgVXBkYXRlRm9yU2xpZGUoTUNGcmFnbWVudCAqRiwgaW50IFNsaWRlQW1vdW50KTsKKworICAvLy8gXGJyaWVmIFVwZGF0ZSB0aGUgbGF5b3V0IGJlY2F1c2UgYSBmcmFnbWVudCBoYXMgYmVlbiByZXBsYWNlZC4KKyAgdm9pZCBGcmFnbWVudFJlcGxhY2VkKE1DRnJhZ21lbnQgKlNyYywgTUNGcmFnbWVudCAqRHN0KTsKKworICAvLy8gXGJyaWVmIFBlcmZvcm0gYSBmdWxsIGxheW91dC4KKyAgdm9pZCBMYXlvdXRGaWxlKCk7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGxheW91dCBmb3IgYSBzaW5nbGUgZnJhZ21lbnQsIGFzc3VtaW5nIHRoYXQgdGhlIHByZXZpb3VzCisgIC8vLyBmcmFnbWVudCBoYXMgYWxyZWFkeSBiZWVuIGxheWVkIG91dCBjb3JyZWN0bHksIGFuZCB0aGUgcGFyZW50IHNlY3Rpb24gaGFzCisgIC8vLyBiZWVuIGluaXRpYWxpemVkLgorICB2b2lkIExheW91dEZyYWdtZW50KE1DRnJhZ21lbnQgKkZyYWdtZW50KTsKKworICAvLy8gXGJyaWVmIFBlcmZvcm1zIGluaXRpYWwgbGF5b3V0IGZvciBhIHNpbmdsZSBzZWN0aW9uLCBhc3N1bWluZyB0aGF0IHRoZQorICAvLy8gcHJldmlvdXMgc2VjdGlvbiAoaW5jbHVkaW5nIGl0cyBmcmFnbWVudHMpIGhhcyBhbHJlYWR5IGJlZW4gbGF5ZWQgb3V0CisgIC8vLyBjb3JyZWN0bHkuCisgIHZvaWQgTGF5b3V0U2VjdGlvbihNQ1NlY3Rpb25EYXRhICpTRCk7CisKKyAgLy8vIEBuYW1lIFNlY3Rpb24gQWNjZXNzIChpbiBsYXlvdXQgb3JkZXIpCisgIC8vLyBAeworCisgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxNQ1NlY3Rpb25EYXRhKj4gJmdldFNlY3Rpb25PcmRlcigpIHsKKyAgICByZXR1cm4gU2VjdGlvbk9yZGVyOworICB9CisgIGNvbnN0IGxsdm06OlNtYWxsVmVjdG9ySW1wbDxNQ1NlY3Rpb25EYXRhKj4gJmdldFNlY3Rpb25PcmRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VjdGlvbk9yZGVyOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBGcmFnbWVudCBMYXlvdXQgRGF0YQorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgZWZmZWN0aXZlIHNpemUgb2YgdGhlIGdpdmVuIGZyYWdtZW50LCBhcyBjb21wdXRlZCBpbiB0aGUKKyAgLy8vIGN1cnJlbnQgbGF5b3V0LgorICB1aW50NjRfdCBnZXRGcmFnbWVudEVmZmVjdGl2ZVNpemUoY29uc3QgTUNGcmFnbWVudCAqRikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG9mZnNldCBvZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgaW5zaWRlIGl0cyBjb250YWluaW5nIHNlY3Rpb24uCisgIHVpbnQ2NF90IGdldEZyYWdtZW50T2Zmc2V0KGNvbnN0IE1DRnJhZ21lbnQgKkYpIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgU2VjdGlvbiBMYXlvdXQgRGF0YQorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgY29tcHV0ZWQgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gc2VjdGlvbi4KKyAgdWludDY0X3QgZ2V0U2VjdGlvbkFkZHJlc3MoY29uc3QgTUNTZWN0aW9uRGF0YSAqU0QpIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgVXRpbGl0eSBGdW5jdGlvbnMKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIGZyYWdtZW50LCBhcyBjb21wdXRlZCBpbiB0aGUgY3VycmVudAorICAvLy8gbGF5b3V0LgorICB1aW50NjRfdCBnZXRGcmFnbWVudEFkZHJlc3MoY29uc3QgTUNGcmFnbWVudCAqRikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGFkZHJlc3Mgc3BhY2Ugc2l6ZSBvZiB0aGUgZ2l2ZW4gc2VjdGlvbiwgYXMgaXQgZWZmZWN0cworICAvLy8gbGF5b3V0LiBUaGlzIG1heSBkaWZmZXIgZnJvbSB0aGUgc2l6ZSByZXBvcnRlZCBieSBcc2VlIGdldFNlY3Rpb25TaXplKCkgYnkKKyAgLy8vIG5vdCBpbmNsdWRpbmcgc2VjdGlvbiB0YWlsIHBhZGRpbmcuCisgIHVpbnQ2NF90IGdldFNlY3Rpb25BZGRyZXNzU2l6ZShjb25zdCBNQ1NlY3Rpb25EYXRhICpTRCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGRhdGEgc2l6ZSBvZiB0aGUgZ2l2ZW4gc2VjdGlvbiwgYXMgZW1pdHRlZCB0byB0aGUgb2JqZWN0CisgIC8vLyBmaWxlLiBUaGlzIG1heSBpbmNsdWRlIGFkZGl0aW9uYWwgcGFkZGluZywgb3IgYmUgMCBmb3IgdmlydHVhbCBzZWN0aW9ucy4KKyAgdWludDY0X3QgZ2V0U2VjdGlvbkZpbGVTaXplKGNvbnN0IE1DU2VjdGlvbkRhdGEgKlNEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbG9naWNhbCBkYXRhIHNpemUgb2YgdGhlIGdpdmVuIHNlY3Rpb24uCisgIHVpbnQ2NF90IGdldFNlY3Rpb25TaXplKGNvbnN0IE1DU2VjdGlvbkRhdGEgKlNEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gc3ltYm9sLCBhcyBjb21wdXRlZCBpbiB0aGUgY3VycmVudAorICAvLy8gbGF5b3V0LgorICB1aW50NjRfdCBnZXRTeW1ib2xBZGRyZXNzKGNvbnN0IE1DU3ltYm9sRGF0YSAqU0QpIGNvbnN0OworCisgIC8vLyBAfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNBc3NlbWJsZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0Fzc2VtYmxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2I3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNBc3NlbWJsZXIuaApAQCAtMCwwICsxLDc4OSBAQAorLy89PT0tIE1DQXNzZW1ibGVyLmggLSBPYmplY3QgRmlsZSBHZW5lcmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQVNTRU1CTEVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0FTU0VNQkxFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRml4dXAuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPHZlY3Rvcj4gLy8gRklYTUU6IFNob3VsZG4ndCBiZSBuZWVkZWQuCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgTUNBc21MYXlvdXQ7CitjbGFzcyBNQ0Fzc2VtYmxlcjsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DQ29kZUVtaXR0ZXI7CitjbGFzcyBNQ0V4cHI7CitjbGFzcyBNQ0ZyYWdtZW50OworY2xhc3MgTUNPYmplY3RXcml0ZXI7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1NlY3Rpb25EYXRhOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBNQ1N5bWJvbERhdGE7CitjbGFzcyBNQ1ZhbHVlOworY2xhc3MgVGFyZ2V0QXNtQmFja2VuZDsKKworY2xhc3MgTUNGcmFnbWVudCA6IHB1YmxpYyBpbGlzdF9ub2RlPE1DRnJhZ21lbnQ+IHsKKyAgZnJpZW5kIGNsYXNzIE1DQXNtTGF5b3V0OworCisgIE1DRnJhZ21lbnQoY29uc3QgTUNGcmFnbWVudCYpOyAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBNQ0ZyYWdtZW50Jik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKworcHVibGljOgorICBlbnVtIEZyYWdtZW50VHlwZSB7CisgICAgRlRfQWxpZ24sCisgICAgRlRfRGF0YSwKKyAgICBGVF9GaWxsLAorICAgIEZUX0luc3QsCisgICAgRlRfT3JnCisgIH07CisKK3ByaXZhdGU6CisgIEZyYWdtZW50VHlwZSBLaW5kOworCisgIC8vLyBQYXJlbnQgLSBUaGUgZGF0YSBmb3IgdGhlIHNlY3Rpb24gdGhpcyBmcmFnbWVudCBpcyBpbi4KKyAgTUNTZWN0aW9uRGF0YSAqUGFyZW50OworCisgIC8vLyBBdG9tIC0gVGhlIGF0b20gdGhpcyBmcmFnbWVudCBpcyBpbiwgYXMgcmVwcmVzZW50ZWQgYnkgaXQncyBkZWZpbmluZworICAvLy8gc3ltYm9sLiBBdG9tJ3MgYXJlIG9ubHkgdXNlZCBieSBiYWNrZW5kcyB3aGljaCBzZXQKKyAgLy8vIFxzZWUgTUNBc21CYWNrZW5kOjpoYXNSZWxpYWJsZVN5bWJvbERpZmZlcmVuY2UoKS4KKyAgTUNTeW1ib2xEYXRhICpBdG9tOworCisgIC8vLyBAbmFtZSBBc3NlbWJsZXIgQmFja2VuZCBEYXRhCisgIC8vLyBAeworICAvLworICAvLyBGSVhNRTogVGhpcyBjb3VsZCBhbGwgYmUga2VwdCBwcml2YXRlIHRvIHRoZSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24uCisKKyAgLy8vIE9mZnNldCAtIFRoZSBvZmZzZXQgb2YgdGhpcyBmcmFnbWVudCBpbiBpdHMgc2VjdGlvbi4gVGhpcyBpcyB+MCB1bnRpbAorICAvLy8gaW5pdGlhbGl6ZWQuCisgIHVpbnQ2NF90IE9mZnNldDsKKworICAvLy8gRWZmZWN0aXZlU2l6ZSAtIFRoZSBjb21wdXRlIHNpemUgb2YgdGhpcyBzZWN0aW9uLiBUaGlzIGlzIH4wIHVudGlsCisgIC8vLyBpbml0aWFsaXplZC4KKyAgdWludDY0X3QgRWZmZWN0aXZlU2l6ZTsKKworICAvLy8gTGF5b3V0T3JkZXIgLSBUaGUgZ2xvYmFsIGxheW91dCBvcmRlciBvZiB0aGlzIGZyYWdtZW50LiBUaGlzIGlzIHRoZSBpbmRleAorICAvLy8gYWNyb3NzIGFsbCBmcmFnbWVudHMgaW4gdGhlIGZpbGUsIG5vdCBqdXN0IHdpdGhpbiB0aGUgc2VjdGlvbi4KKyAgdW5zaWduZWQgTGF5b3V0T3JkZXI7CisKKyAgLy8vIEB9CisKK3Byb3RlY3RlZDoKKyAgTUNGcmFnbWVudChGcmFnbWVudFR5cGUgX0tpbmQsIE1DU2VjdGlvbkRhdGEgKl9QYXJlbnQgPSAwKTsKKworcHVibGljOgorICAvLyBPbmx5IGZvciBzZW50aW5lbC4KKyAgTUNGcmFnbWVudCgpOworICB2aXJ0dWFsIH5NQ0ZyYWdtZW50KCk7CisKKyAgRnJhZ21lbnRUeXBlIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgTUNTZWN0aW9uRGF0YSAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisgIHZvaWQgc2V0UGFyZW50KE1DU2VjdGlvbkRhdGEgKlZhbHVlKSB7IFBhcmVudCA9IFZhbHVlOyB9CisKKyAgTUNTeW1ib2xEYXRhICpnZXRBdG9tKCkgY29uc3QgeyByZXR1cm4gQXRvbTsgfQorICB2b2lkIHNldEF0b20oTUNTeW1ib2xEYXRhICpWYWx1ZSkgeyBBdG9tID0gVmFsdWU7IH0KKworICB1bnNpZ25lZCBnZXRMYXlvdXRPcmRlcigpIGNvbnN0IHsgcmV0dXJuIExheW91dE9yZGVyOyB9CisgIHZvaWQgc2V0TGF5b3V0T3JkZXIodW5zaWduZWQgVmFsdWUpIHsgTGF5b3V0T3JkZXIgPSBWYWx1ZTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNGcmFnbWVudCAqTykgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZvaWQgZHVtcCgpOworfTsKKworY2xhc3MgTUNEYXRhRnJhZ21lbnQgOiBwdWJsaWMgTUNGcmFnbWVudCB7CisgIFNtYWxsU3RyaW5nPDMyPiBDb250ZW50czsKKworICAvLy8gRml4dXBzIC0gVGhlIGxpc3Qgb2YgZml4dXBzIGluIHRoaXMgZnJhZ21lbnQuCisgIHN0ZDo6dmVjdG9yPE1DRml4dXA+IEZpeHVwczsKKworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE1DRml4dXA+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9maXh1cF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxNQ0ZpeHVwPjo6aXRlcmF0b3IgZml4dXBfaXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgTUNEYXRhRnJhZ21lbnQoTUNTZWN0aW9uRGF0YSAqU0QgPSAwKSA6IE1DRnJhZ21lbnQoRlRfRGF0YSwgU0QpIHt9CisKKyAgLy8vIEBuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICBTbWFsbFN0cmluZzwzMj4gJmdldENvbnRlbnRzKCkgeyByZXR1cm4gQ29udGVudHM7IH0KKyAgY29uc3QgU21hbGxTdHJpbmc8MzI+ICZnZXRDb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIENvbnRlbnRzOyB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBGaXh1cCBBY2Nlc3MKKyAgLy8vIEB7CisKKyAgdm9pZCBhZGRGaXh1cChNQ0ZpeHVwIEZpeHVwKSB7CisgICAgLy8gRW5mb3JjZSBpbnZhcmlhbnQgdGhhdCBmaXh1cHMgYXJlIGluIG9mZnNldCBvcmRlci4KKyAgICBhc3NlcnQoKEZpeHVwcy5lbXB0eSgpIHx8IEZpeHVwLmdldE9mZnNldCgpID4gRml4dXBzLmJhY2soKS5nZXRPZmZzZXQoKSkgJiYKKyAgICAgICAgICAgIkZpeHVwcyBtdXN0IGJlIGFkZGVkIGluIG9yZGVyISIpOworICAgIEZpeHVwcy5wdXNoX2JhY2soRml4dXApOworICB9CisKKyAgc3RkOjp2ZWN0b3I8TUNGaXh1cD4gJmdldEZpeHVwcygpIHsgcmV0dXJuIEZpeHVwczsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxNQ0ZpeHVwPiAmZ2V0Rml4dXBzKCkgY29uc3QgeyByZXR1cm4gRml4dXBzOyB9CisKKyAgZml4dXBfaXRlcmF0b3IgZml4dXBfYmVnaW4oKSB7IHJldHVybiBGaXh1cHMuYmVnaW4oKTsgfQorICBjb25zdF9maXh1cF9pdGVyYXRvciBmaXh1cF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEZpeHVwcy5iZWdpbigpOyB9CisKKyAgZml4dXBfaXRlcmF0b3IgZml4dXBfZW5kKCkge3JldHVybiBGaXh1cHMuZW5kKCk7fQorICBjb25zdF9maXh1cF9pdGVyYXRvciBmaXh1cF9lbmQoKSBjb25zdCB7cmV0dXJuIEZpeHVwcy5lbmQoKTt9CisKKyAgc2l6ZV90IGZpeHVwX3NpemUoKSBjb25zdCB7IHJldHVybiBGaXh1cHMuc2l6ZSgpOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9EYXRhOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNEYXRhRnJhZ21lbnQgKikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8gRklYTUU6IFRoaXMgY3VycmVudCBpbmNhcm5hdGlvbiBvZiBNQ0luc3RGcmFnbWVudCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSwgYXMKKy8vIGl0IGlzIGFsbW9zdCBlbnRpcmVseSBhIGR1cGxpY2F0ZSBvZiBNQ0RhdGFGcmFnbWVudC4gSWYgd2UgZGVjaWRlIHRvIHN0aWNrCisvLyB3aXRoIHRoaXMgYXBwcm9hY2ggKGFzIG9wcG9zZWQgdG8gbWFraW5nIE1DSW5zdEZyYWdtZW50IGEgdmVyeSBsaWdodCB3ZWlnaHQKKy8vIG9iamVjdCB3aXRoIGp1c3QgdGhlIE1DSW5zdCBhbmQgYSBjb2RlIHNpemUsIHRoZW4gd2Ugc2hvdWxkIGp1c3QgY2hhbmdlCisvLyBNQ0RhdGFGcmFnbWVudCB0byBoYXZlIGFuIG9wdGlvbmFsIE1DSW5zdCBhdCBpdHMgZW5kLgorY2xhc3MgTUNJbnN0RnJhZ21lbnQgOiBwdWJsaWMgTUNGcmFnbWVudCB7CisgIC8vLyBJbnN0IC0gVGhlIGluc3RydWN0aW9uIHRoaXMgaXMgYSBmcmFnbWVudCBmb3IuCisgIE1DSW5zdCBJbnN0OworCisgIC8vLyBJbnN0U2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBjdXJyZW50bHkgZW5jb2RlZCBpbnN0cnVjdGlvbi4KKyAgU21hbGxTdHJpbmc8OD4gQ29kZTsKKworICAvLy8gRml4dXBzIC0gVGhlIGxpc3Qgb2YgZml4dXBzIGluIHRoaXMgZnJhZ21lbnQuCisgIFNtYWxsVmVjdG9yPE1DRml4dXAsIDE+IEZpeHVwczsKKworcHVibGljOgorICB0eXBlZGVmIFNtYWxsVmVjdG9ySW1wbDxNQ0ZpeHVwPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfZml4dXBfaXRlcmF0b3I7CisgIHR5cGVkZWYgU21hbGxWZWN0b3JJbXBsPE1DRml4dXA+OjppdGVyYXRvciBmaXh1cF9pdGVyYXRvcjsKKworcHVibGljOgorICBNQ0luc3RGcmFnbWVudChNQ0luc3QgX0luc3QsIE1DU2VjdGlvbkRhdGEgKlNEID0gMCkKKyAgICA6IE1DRnJhZ21lbnQoRlRfSW5zdCwgU0QpLCBJbnN0KF9JbnN0KSB7CisgIH0KKworICAvLy8gQG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmZ2V0Q29kZSgpIHsgcmV0dXJuIENvZGU7IH0KKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZnZXRDb2RlKCkgY29uc3QgeyByZXR1cm4gQ29kZTsgfQorCisgIHVuc2lnbmVkIGdldEluc3RTaXplKCkgY29uc3QgeyByZXR1cm4gQ29kZS5zaXplKCk7IH0KKworICBNQ0luc3QgJmdldEluc3QoKSB7IHJldHVybiBJbnN0OyB9CisgIGNvbnN0IE1DSW5zdCAmZ2V0SW5zdCgpIGNvbnN0IHsgcmV0dXJuIEluc3Q7IH0KKworICB2b2lkIHNldEluc3QoTUNJbnN0IFZhbHVlKSB7IEluc3QgPSBWYWx1ZTsgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgRml4dXAgQWNjZXNzCisgIC8vLyBAeworCisgIFNtYWxsVmVjdG9ySW1wbDxNQ0ZpeHVwPiAmZ2V0Rml4dXBzKCkgeyByZXR1cm4gRml4dXBzOyB9CisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNQ0ZpeHVwPiAmZ2V0Rml4dXBzKCkgY29uc3QgeyByZXR1cm4gRml4dXBzOyB9CisKKyAgZml4dXBfaXRlcmF0b3IgZml4dXBfYmVnaW4oKSB7IHJldHVybiBGaXh1cHMuYmVnaW4oKTsgfQorICBjb25zdF9maXh1cF9pdGVyYXRvciBmaXh1cF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEZpeHVwcy5iZWdpbigpOyB9CisKKyAgZml4dXBfaXRlcmF0b3IgZml4dXBfZW5kKCkge3JldHVybiBGaXh1cHMuZW5kKCk7fQorICBjb25zdF9maXh1cF9pdGVyYXRvciBmaXh1cF9lbmQoKSBjb25zdCB7cmV0dXJuIEZpeHVwcy5lbmQoKTt9CisKKyAgc2l6ZV90IGZpeHVwX3NpemUoKSBjb25zdCB7IHJldHVybiBGaXh1cHMuc2l6ZSgpOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9JbnN0OworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNJbnN0RnJhZ21lbnQgKikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworY2xhc3MgTUNBbGlnbkZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gQWxpZ25tZW50IC0gVGhlIGFsaWdubWVudCB0byBlbnN1cmUsIGluIGJ5dGVzLgorICB1bnNpZ25lZCBBbGlnbm1lbnQ7CisKKyAgLy8vIFZhbHVlIC0gVmFsdWUgdG8gdXNlIGZvciBmaWxsaW5nIHBhZGRpbmcgYnl0ZXMuCisgIGludDY0X3QgVmFsdWU7CisKKyAgLy8vIFZhbHVlU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBpbnRlZ2VyIChpbiBieXRlcykgb2YgXGFyZyBWYWx1ZS4KKyAgdW5zaWduZWQgVmFsdWVTaXplOworCisgIC8vLyBNYXhCeXRlc1RvRW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBlbWl0OyBpZiB0aGUgYWxpZ25tZW50CisgIC8vLyBjYW5ub3QgYmUgc2F0aXNmaWVkIGluIHRoaXMgd2lkdGggdGhlbiB0aGlzIGZyYWdtZW50IGlzIGlnbm9yZWQuCisgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0OworCisgIC8vLyBFbWl0Tm9wcyAtIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCAob3B0aW1hbCkgTk9QcyBzaG91bGQgYmUgZW1pdHRlZCBpbnN0ZWFkCisgIC8vLyBvZiB1c2luZyB0aGUgcHJvdmlkZWQgdmFsdWUuIFRoZSBleGFjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGZsYWcgaXMKKyAgLy8vIHRhcmdldCBkZXBlbmRlbnQuCisgIGJvb2wgRW1pdE5vcHMgOiAxOworCisgIC8vLyBPbmx5QWxpZ25BZGRyZXNzIC0gRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgYWxpZ24gaXMgb25seSB1c2VkIHRvIGFkanVzdAorICAvLy8gdGhlIGFkZHJlc3Mgc3BhY2Ugc2l6ZSBvZiBhIHNlY3Rpb24gYW5kIHRoYXQgaXQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBhcworICAvLy8gcGFydCBvZiB0aGUgc2VjdGlvbiBzaXplLiBUaGlzIGZsYWcgY2FuIG9ubHkgYmUgdXNlZCBvbiB0aGUgbGFzdCBmcmFnbWVudAorICAvLy8gaW4gYSBzZWN0aW9uLgorICBib29sIE9ubHlBbGlnbkFkZHJlc3MgOiAxOworCitwdWJsaWM6CisgIE1DQWxpZ25GcmFnbWVudCh1bnNpZ25lZCBfQWxpZ25tZW50LCBpbnQ2NF90IF9WYWx1ZSwgdW5zaWduZWQgX1ZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9NYXhCeXRlc1RvRW1pdCwgTUNTZWN0aW9uRGF0YSAqU0QgPSAwKQorICAgIDogTUNGcmFnbWVudChGVF9BbGlnbiwgU0QpLCBBbGlnbm1lbnQoX0FsaWdubWVudCksCisgICAgICBWYWx1ZShfVmFsdWUpLFZhbHVlU2l6ZShfVmFsdWVTaXplKSwKKyAgICAgIE1heEJ5dGVzVG9FbWl0KF9NYXhCeXRlc1RvRW1pdCksIEVtaXROb3BzKGZhbHNlKSwKKyAgICAgIE9ubHlBbGlnbkFkZHJlc3MoZmFsc2UpIHt9CisKKyAgLy8vIEBuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBBbGlnbm1lbnQ7IH0KKworICBpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICB1bnNpZ25lZCBnZXRWYWx1ZVNpemUoKSBjb25zdCB7IHJldHVybiBWYWx1ZVNpemU7IH0KKworICB1bnNpZ25lZCBnZXRNYXhCeXRlc1RvRW1pdCgpIGNvbnN0IHsgcmV0dXJuIE1heEJ5dGVzVG9FbWl0OyB9CisKKyAgYm9vbCBoYXNFbWl0Tm9wcygpIGNvbnN0IHsgcmV0dXJuIEVtaXROb3BzOyB9CisgIHZvaWQgc2V0RW1pdE5vcHMoYm9vbCBWYWx1ZSkgeyBFbWl0Tm9wcyA9IFZhbHVlOyB9CisKKyAgYm9vbCBoYXNPbmx5QWxpZ25BZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gT25seUFsaWduQWRkcmVzczsgfQorICB2b2lkIHNldE9ubHlBbGlnbkFkZHJlc3MoYm9vbCBWYWx1ZSkgeyBPbmx5QWxpZ25BZGRyZXNzID0gVmFsdWU7IH0KKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX0FsaWduOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNBbGlnbkZyYWdtZW50ICopIHsgcmV0dXJuIHRydWU7IH0KK307CisKK2NsYXNzIE1DRmlsbEZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gVmFsdWUgLSBWYWx1ZSB0byB1c2UgZm9yIGZpbGxpbmcgYnl0ZXMuCisgIGludDY0X3QgVmFsdWU7CisKKyAgLy8vIFZhbHVlU2l6ZSAtIFRoZSBzaXplIChpbiBieXRlcykgb2YgXGFyZyBWYWx1ZSB0byB1c2Ugd2hlbiBmaWxsaW5nLCBvciAwIGlmCisgIC8vLyB0aGlzIGlzIGEgdmlydHVhbCBmaWxsIGZyYWdtZW50LgorICB1bnNpZ25lZCBWYWx1ZVNpemU7CisKKyAgLy8vIFNpemUgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGluc2VydC4KKyAgdWludDY0X3QgU2l6ZTsKKworcHVibGljOgorICBNQ0ZpbGxGcmFnbWVudChpbnQ2NF90IF9WYWx1ZSwgdW5zaWduZWQgX1ZhbHVlU2l6ZSwgdWludDY0X3QgX1NpemUsCisgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkRhdGEgKlNEID0gMCkKKyAgICA6IE1DRnJhZ21lbnQoRlRfRmlsbCwgU0QpLAorICAgICAgVmFsdWUoX1ZhbHVlKSwgVmFsdWVTaXplKF9WYWx1ZVNpemUpLCBTaXplKF9TaXplKSB7CisgICAgYXNzZXJ0KCghVmFsdWVTaXplIHx8IChTaXplICUgVmFsdWVTaXplKSA9PSAwKSAmJgorICAgICAgICAgICAiRmlsbCBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgdmFsdWUgc2l6ZSEiKTsKKyAgfQorCisgIC8vLyBAbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgdW5zaWduZWQgZ2V0VmFsdWVTaXplKCkgY29uc3QgeyByZXR1cm4gVmFsdWVTaXplOyB9CisKKyAgdWludDY0X3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX0ZpbGw7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZpbGxGcmFnbWVudCAqKSB7IHJldHVybiB0cnVlOyB9Cit9OworCitjbGFzcyBNQ09yZ0ZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gT2Zmc2V0IC0gVGhlIG9mZnNldCB0aGlzIGZyYWdtZW50IHNob3VsZCBzdGFydCBhdC4KKyAgY29uc3QgTUNFeHByICpPZmZzZXQ7CisKKyAgLy8vIFZhbHVlIC0gVmFsdWUgdG8gdXNlIGZvciBmaWxsaW5nIGJ5dGVzLgorICBpbnQ4X3QgVmFsdWU7CisKK3B1YmxpYzoKKyAgTUNPcmdGcmFnbWVudChjb25zdCBNQ0V4cHIgJl9PZmZzZXQsIGludDhfdCBfVmFsdWUsIE1DU2VjdGlvbkRhdGEgKlNEID0gMCkKKyAgICA6IE1DRnJhZ21lbnQoRlRfT3JnLCBTRCksCisgICAgICBPZmZzZXQoJl9PZmZzZXQpLCBWYWx1ZShfVmFsdWUpIHt9CisKKyAgLy8vIEBuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICBjb25zdCBNQ0V4cHIgJmdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuICpPZmZzZXQ7IH0KKworICB1aW50OF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX09yZzsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DT3JnRnJhZ21lbnQgKikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8gRklYTUU6IFNob3VsZCB0aGlzIGJlIGEgc2VwYXJhdGUgY2xhc3MsIG9yIGp1c3QgbWVyZ2VkIGludG8gTUNTZWN0aW9uPyBTaW5jZQorLy8gd2UgYW50aWNpcGF0ZSB0aGUgZmFzdCBwYXRoIGJlaW5nIHRocm91Z2ggYW4gTUNBc3NlbWJsZXIsIHRoZSBvbmx5IHJlYXNvbiB0bworLy8ga2VlcCBpdCBvdXQgaXMgZm9yIEFQSSBhYnN0cmFjdGlvbi4KK2NsYXNzIE1DU2VjdGlvbkRhdGEgOiBwdWJsaWMgaWxpc3Rfbm9kZTxNQ1NlY3Rpb25EYXRhPiB7CisgIGZyaWVuZCBjbGFzcyBNQ0FzbUxheW91dDsKKworICBNQ1NlY3Rpb25EYXRhKGNvbnN0IE1DU2VjdGlvbkRhdGEmKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTUNTZWN0aW9uRGF0YSYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisKK3B1YmxpYzoKKyAgdHlwZWRlZiBpcGxpc3Q8TUNGcmFnbWVudD4gRnJhZ21lbnRMaXN0VHlwZTsKKworICB0eXBlZGVmIEZyYWdtZW50TGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIEZyYWdtZW50TGlzdFR5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworCisgIHR5cGVkZWYgRnJhZ21lbnRMaXN0VHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIEZyYWdtZW50TGlzdFR5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKworcHJpdmF0ZToKKyAgRnJhZ21lbnRMaXN0VHlwZSBGcmFnbWVudHM7CisgIGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbjsKKworICAvLy8gT3JkaW5hbCAtIFRoZSBzZWN0aW9uIGluZGV4IGluIHRoZSBhc3NlbWJsZXJzIHNlY3Rpb24gbGlzdC4KKyAgdW5zaWduZWQgT3JkaW5hbDsKKworICAvLy8gTGF5b3V0T3JkZXIgLSBUaGUgaW5kZXggb2YgdGhpcyBzZWN0aW9uIGluIHRoZSBsYXlvdXQgb3JkZXIuCisgIHVuc2lnbmVkIExheW91dE9yZGVyOworCisgIC8vLyBBbGlnbm1lbnQgLSBUaGUgbWF4aW11bSBhbGlnbm1lbnQgc2VlbiBpbiB0aGlzIHNlY3Rpb24uCisgIHVuc2lnbmVkIEFsaWdubWVudDsKKworICAvLy8gQG5hbWUgQXNzZW1ibGVyIEJhY2tlbmQgRGF0YQorICAvLy8gQHsKKyAgLy8KKyAgLy8gRklYTUU6IFRoaXMgY291bGQgYWxsIGJlIGtlcHQgcHJpdmF0ZSB0byB0aGUgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLgorCisgIC8vLyBBZGRyZXNzIC0gVGhlIGNvbXB1dGVkIGFkZHJlc3Mgb2YgdGhpcyBzZWN0aW9uLiBUaGlzIGlzIH4wIHVudGlsCisgIC8vLyBpbml0aWFsaXplZC4KKyAgdWludDY0X3QgQWRkcmVzczsKKworICAvLy8gSGFzSW5zdHJ1Y3Rpb25zIC0gV2hldGhlciB0aGlzIHNlY3Rpb24gaGFzIGhhZCBpbnN0cnVjdGlvbnMgZW1pdHRlZCBpbnRvCisgIC8vLyBpdC4KKyAgdW5zaWduZWQgSGFzSW5zdHJ1Y3Rpb25zIDogMTsKKworICAvLy8gQH0KKworcHVibGljOgorICAvLyBPbmx5IGZvciB1c2UgYXMgc2VudGluZWwuCisgIE1DU2VjdGlvbkRhdGEoKTsKKyAgTUNTZWN0aW9uRGF0YShjb25zdCBNQ1NlY3Rpb24gJlNlY3Rpb24sIE1DQXNzZW1ibGVyICpBID0gMCk7CisKKyAgY29uc3QgTUNTZWN0aW9uICZnZXRTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gKlNlY3Rpb247IH0KKworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBBbGlnbm1lbnQ7IH0KKyAgdm9pZCBzZXRBbGlnbm1lbnQodW5zaWduZWQgVmFsdWUpIHsgQWxpZ25tZW50ID0gVmFsdWU7IH0KKworICBib29sIGhhc0luc3RydWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIEhhc0luc3RydWN0aW9uczsgfQorICB2b2lkIHNldEhhc0luc3RydWN0aW9ucyhib29sIFZhbHVlKSB7IEhhc0luc3RydWN0aW9ucyA9IFZhbHVlOyB9CisKKyAgdW5zaWduZWQgZ2V0T3JkaW5hbCgpIGNvbnN0IHsgcmV0dXJuIE9yZGluYWw7IH0KKyAgdm9pZCBzZXRPcmRpbmFsKHVuc2lnbmVkIFZhbHVlKSB7IE9yZGluYWwgPSBWYWx1ZTsgfQorCisgIHVuc2lnbmVkIGdldExheW91dE9yZGVyKCkgY29uc3QgeyByZXR1cm4gTGF5b3V0T3JkZXI7IH0KKyAgdm9pZCBzZXRMYXlvdXRPcmRlcih1bnNpZ25lZCBWYWx1ZSkgeyBMYXlvdXRPcmRlciA9IFZhbHVlOyB9CisKKyAgLy8vIEBuYW1lIEZyYWdtZW50IEFjY2VzcworICAvLy8gQHsKKworICBjb25zdCBGcmFnbWVudExpc3RUeXBlICZnZXRGcmFnbWVudExpc3QoKSBjb25zdCB7IHJldHVybiBGcmFnbWVudHM7IH0KKyAgRnJhZ21lbnRMaXN0VHlwZSAmZ2V0RnJhZ21lbnRMaXN0KCkgeyByZXR1cm4gRnJhZ21lbnRzOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBGcmFnbWVudHMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEZyYWdtZW50cy5iZWdpbigpOyB9CisKKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gRnJhZ21lbnRzLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEZyYWdtZW50cy5lbmQoKTsgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gRnJhZ21lbnRzLnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gRnJhZ21lbnRzLnJiZWdpbigpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gRnJhZ21lbnRzLnJlbmQoKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBGcmFnbWVudHMucmVuZCgpOyB9CisKKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBGcmFnbWVudHMuc2l6ZSgpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEZyYWdtZW50cy5lbXB0eSgpOyB9CisKKyAgdm9pZCBkdW1wKCk7CisKKyAgLy8vIEB9Cit9OworCisvLyBGSVhNRTogU2FtZSBjb25jZXJucyBhcyB3aXRoIFNlY3Rpb25EYXRhLgorY2xhc3MgTUNTeW1ib2xEYXRhIDogcHVibGljIGlsaXN0X25vZGU8TUNTeW1ib2xEYXRhPiB7CitwdWJsaWM6CisgIGNvbnN0IE1DU3ltYm9sICpTeW1ib2w7CisKKyAgLy8vIEZyYWdtZW50IC0gVGhlIGZyYWdtZW50IHRoaXMgc3ltYm9sJ3MgdmFsdWUgaXMgcmVsYXRpdmUgdG8sIGlmIGFueS4KKyAgTUNGcmFnbWVudCAqRnJhZ21lbnQ7CisKKyAgLy8vIE9mZnNldCAtIFRoZSBvZmZzZXQgdG8gYXBwbHkgdG8gdGhlIGZyYWdtZW50IGFkZHJlc3MgdG8gZm9ybSB0aGlzIHN5bWJvbCdzCisgIC8vLyB2YWx1ZS4KKyAgdWludDY0X3QgT2Zmc2V0OworCisgIC8vLyBJc0V4dGVybmFsIC0gVHJ1ZSBpZiB0aGlzIHN5bWJvbCBpcyB2aXNpYmxlIG91dHNpZGUgdGhpcyB0cmFuc2xhdGlvbgorICAvLy8gdW5pdC4KKyAgdW5zaWduZWQgSXNFeHRlcm5hbCA6IDE7CisKKyAgLy8vIElzUHJpdmF0ZUV4dGVybiAtIFRydWUgaWYgdGhpcyBzeW1ib2wgaXMgcHJpdmF0ZSBleHRlcm4uCisgIHVuc2lnbmVkIElzUHJpdmF0ZUV4dGVybiA6IDE7CisKKyAgLy8vIENvbW1vblNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sLCBpZiBpdCBpcyAnY29tbW9uJywgb3IgMC4KKyAgLy8KKyAgLy8gRklYTUU6IFBhY2sgdGhpcyBpbiB3aXRoIG90aGVyIGZpZWxkcz8gV2UgY291bGQgcHV0IGl0IGluIG9mZnNldCwgc2luY2UgYQorICAvLyBjb21tb24gc3ltYm9sIGNhbiBuZXZlciBnZXQgYSBkZWZpbml0aW9uLgorICB1aW50NjRfdCBDb21tb25TaXplOworCisgIC8vLyBDb21tb25BbGlnbiAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHN5bWJvbCwgaWYgaXQgaXMgJ2NvbW1vbicuCisgIC8vCisgIC8vIEZJWE1FOiBQYWNrIHRoaXMgaW4gd2l0aCBvdGhlciBmaWVsZHM/CisgIHVuc2lnbmVkIENvbW1vbkFsaWduOworCisgIC8vLyBGbGFncyAtIFRoZSBGbGFncyBmaWVsZCBpcyB1c2VkIGJ5IG9iamVjdCBmaWxlIGltcGxlbWVudGF0aW9ucyB0byBzdG9yZQorICAvLy8gYWRkaXRpb25hbCBwZXIgc3ltYm9sIGluZm9ybWF0aW9uIHdoaWNoIGlzIG5vdCBlYXNpbHkgY2xhc3NpZmllZC4KKyAgdWludDMyX3QgRmxhZ3M7CisKKyAgLy8vIEluZGV4IC0gSW5kZXggZmllbGQsIGZvciB1c2UgYnkgdGhlIG9iamVjdCBmaWxlIGltcGxlbWVudGF0aW9uLgorICB1aW50NjRfdCBJbmRleDsKKworcHVibGljOgorICAvLyBPbmx5IGZvciB1c2UgYXMgc2VudGluZWwuCisgIE1DU3ltYm9sRGF0YSgpOworICBNQ1N5bWJvbERhdGEoY29uc3QgTUNTeW1ib2wgJl9TeW1ib2wsIE1DRnJhZ21lbnQgKl9GcmFnbWVudCwgdWludDY0X3QgX09mZnNldCwKKyAgICAgICAgICAgICAgIE1DQXNzZW1ibGVyICpBID0gMCk7CisKKyAgLy8vIEBuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICBjb25zdCBNQ1N5bWJvbCAmZ2V0U3ltYm9sKCkgY29uc3QgeyByZXR1cm4gKlN5bWJvbDsgfQorCisgIE1DRnJhZ21lbnQgKmdldEZyYWdtZW50KCkgY29uc3QgeyByZXR1cm4gRnJhZ21lbnQ7IH0KKyAgdm9pZCBzZXRGcmFnbWVudChNQ0ZyYWdtZW50ICpWYWx1ZSkgeyBGcmFnbWVudCA9IFZhbHVlOyB9CisKKyAgdWludDY0X3QgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIHZvaWQgc2V0T2Zmc2V0KHVpbnQ2NF90IFZhbHVlKSB7IE9mZnNldCA9IFZhbHVlOyB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBTeW1ib2wgQXR0cmlidXRlcworICAvLy8gQHsKKworICBib29sIGlzRXh0ZXJuYWwoKSBjb25zdCB7IHJldHVybiBJc0V4dGVybmFsOyB9CisgIHZvaWQgc2V0RXh0ZXJuYWwoYm9vbCBWYWx1ZSkgeyBJc0V4dGVybmFsID0gVmFsdWU7IH0KKworICBib29sIGlzUHJpdmF0ZUV4dGVybigpIGNvbnN0IHsgcmV0dXJuIElzUHJpdmF0ZUV4dGVybjsgfQorICB2b2lkIHNldFByaXZhdGVFeHRlcm4oYm9vbCBWYWx1ZSkgeyBJc1ByaXZhdGVFeHRlcm4gPSBWYWx1ZTsgfQorCisgIC8vLyBpc0NvbW1vbiAtIElzIHRoaXMgYSAnY29tbW9uJyBzeW1ib2wuCisgIGJvb2wgaXNDb21tb24oKSBjb25zdCB7IHJldHVybiBDb21tb25TaXplICE9IDA7IH0KKworICAvLy8gc2V0Q29tbW9uIC0gTWFyayB0aGlzIHN5bWJvbCBhcyBiZWluZyAnY29tbW9uJy4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wuCisgIC8vLyBccGFyYW0gQWxpZ24gLSBUaGUgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wuCisgIHZvaWQgc2V0Q29tbW9uKHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEFsaWduKSB7CisgICAgQ29tbW9uU2l6ZSA9IFNpemU7CisgICAgQ29tbW9uQWxpZ24gPSBBbGlnbjsKKyAgfQorCisgIC8vLyBnZXRDb21tb25TaXplIC0gUmV0dXJuIHRoZSBzaXplIG9mIGEgJ2NvbW1vbicgc3ltYm9sLgorICB1aW50NjRfdCBnZXRDb21tb25TaXplKCkgY29uc3QgeworICAgIGFzc2VydChpc0NvbW1vbigpICYmICJOb3QgYSAnY29tbW9uJyBzeW1ib2whIik7CisgICAgcmV0dXJuIENvbW1vblNpemU7CisgIH0KKworICAvLy8gZ2V0Q29tbW9uQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgYSAnY29tbW9uJyBzeW1ib2wuCisgIHVuc2lnbmVkIGdldENvbW1vbkFsaWdubWVudCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb21tb24oKSAmJiAiTm90IGEgJ2NvbW1vbicgc3ltYm9sISIpOworICAgIHJldHVybiBDb21tb25BbGlnbjsKKyAgfQorCisgIC8vLyBnZXRGbGFncyAtIEdldCB0aGUgKGltcGxlbWVudGF0aW9uIGRlZmluZWQpIHN5bWJvbCBmbGFncy4KKyAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorCisgIC8vLyBzZXRGbGFncyAtIFNldCB0aGUgKGltcGxlbWVudGF0aW9uIGRlZmluZWQpIHN5bWJvbCBmbGFncy4KKyAgdm9pZCBzZXRGbGFncyh1aW50MzJfdCBWYWx1ZSkgeyBGbGFncyA9IFZhbHVlOyB9CisKKyAgLy8vIG1vZGlmeUZsYWdzIC0gTW9kaWZ5IHRoZSBmbGFncyB2aWEgYSBtYXNrCisgIHZvaWQgbW9kaWZ5RmxhZ3ModWludDMyX3QgVmFsdWUsIHVpbnQzMl90IE1hc2spIHsKKyAgICBGbGFncyA9IChGbGFncyAmIH5NYXNrKSB8IFZhbHVlOworICB9CisKKyAgLy8vIGdldEluZGV4IC0gR2V0IHRoZSAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCkgaW5kZXguCisgIHVpbnQ2NF90IGdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKworICAvLy8gc2V0SW5kZXggLSBTZXQgdGhlIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkKSBpbmRleC4KKyAgdm9pZCBzZXRJbmRleCh1aW50NjRfdCBWYWx1ZSkgeyBJbmRleCA9IFZhbHVlOyB9CisKKyAgLy8vIEB9CisKKyAgdm9pZCBkdW1wKCk7Cit9OworCisvLyBGSVhNRTogVGhpcyByZWFsbHkgZG9lc24ndCBiZWxvbmcgaGVyZS4gU2VlIGNvbW1lbnRzIGJlbG93Lgorc3RydWN0IEluZGlyZWN0U3ltYm9sRGF0YSB7CisgIE1DU3ltYm9sICpTeW1ib2w7CisgIE1DU2VjdGlvbkRhdGEgKlNlY3Rpb25EYXRhOworfTsKKworY2xhc3MgTUNBc3NlbWJsZXIgeworICBmcmllbmQgY2xhc3MgTUNBc21MYXlvdXQ7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBpcGxpc3Q8TUNTZWN0aW9uRGF0YT4gU2VjdGlvbkRhdGFMaXN0VHlwZTsKKyAgdHlwZWRlZiBpcGxpc3Q8TUNTeW1ib2xEYXRhPiBTeW1ib2xEYXRhTGlzdFR5cGU7CisKKyAgdHlwZWRlZiBTZWN0aW9uRGF0YUxpc3RUeXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBTZWN0aW9uRGF0YUxpc3RUeXBlOjppdGVyYXRvciBpdGVyYXRvcjsKKworICB0eXBlZGVmIFN5bWJvbERhdGFMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3Rfc3ltYm9sX2l0ZXJhdG9yOworICB0eXBlZGVmIFN5bWJvbERhdGFMaXN0VHlwZTo6aXRlcmF0b3Igc3ltYm9sX2l0ZXJhdG9yOworCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8SW5kaXJlY3RTeW1ib2xEYXRhPjo6Y29uc3RfaXRlcmF0b3IKKyAgICBjb25zdF9pbmRpcmVjdF9zeW1ib2xfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8SW5kaXJlY3RTeW1ib2xEYXRhPjo6aXRlcmF0b3IgaW5kaXJlY3Rfc3ltYm9sX2l0ZXJhdG9yOworCitwcml2YXRlOgorICBNQ0Fzc2VtYmxlcihjb25zdCBNQ0Fzc2VtYmxlciYpOyAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1DQXNzZW1ibGVyJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKworICBNQ0NvbnRleHQgJkNvbnRleHQ7CisKKyAgVGFyZ2V0QXNtQmFja2VuZCAmQmFja2VuZDsKKworICBNQ0NvZGVFbWl0dGVyICZFbWl0dGVyOworCisgIHJhd19vc3RyZWFtICZPUzsKKworICBpcGxpc3Q8TUNTZWN0aW9uRGF0YT4gU2VjdGlvbnM7CisKKyAgaXBsaXN0PE1DU3ltYm9sRGF0YT4gU3ltYm9sczsKKworICAvLy8gVGhlIG1hcCBvZiBzZWN0aW9ucyB0byB0aGVpciBhc3NvY2lhdGVkIGFzc2VtYmxlciBiYWNrZW5kIGRhdGEuCisgIC8vCisgIC8vIEZJWE1FOiBBdm9pZCB0aGlzIGluZGlyZWN0aW9uPworICBEZW5zZU1hcDxjb25zdCBNQ1NlY3Rpb24qLCBNQ1NlY3Rpb25EYXRhKj4gU2VjdGlvbk1hcDsKKworICAvLy8gVGhlIG1hcCBvZiBzeW1ib2xzIHRvIHRoZWlyIGFzc29jaWF0ZWQgYXNzZW1ibGVyIGJhY2tlbmQgZGF0YS4KKyAgLy8KKyAgLy8gRklYTUU6IEF2b2lkIHRoaXMgaW5kaXJlY3Rpb24/CisgIERlbnNlTWFwPGNvbnN0IE1DU3ltYm9sKiwgTUNTeW1ib2xEYXRhKj4gU3ltYm9sTWFwOworCisgIHN0ZDo6dmVjdG9yPEluZGlyZWN0U3ltYm9sRGF0YT4gSW5kaXJlY3RTeW1ib2xzOworCisgIHVuc2lnbmVkIFJlbGF4QWxsIDogMTsKKyAgdW5zaWduZWQgU3Vic2VjdGlvbnNWaWFTeW1ib2xzIDogMTsKKworcHJpdmF0ZToKKyAgLy8vIEV2YWx1YXRlIGEgZml4dXAgdG8gYSByZWxvY2F0YWJsZSBleHByZXNzaW9uIGFuZCB0aGUgdmFsdWUgd2hpY2ggc2hvdWxkIGJlCisgIC8vLyBwbGFjZWQgaW50byB0aGUgZml4dXAuCisgIC8vLworICAvLy8gXHBhcmFtIExheW91dCBUaGUgbGF5b3V0IHRvIHVzZSBmb3IgZXZhbHVhdGlvbi4KKyAgLy8vIFxwYXJhbSBGaXh1cCBUaGUgZml4dXAgdG8gZXZhbHVhdGUuCisgIC8vLyBccGFyYW0gREYgVGhlIGZyYWdtZW50IHRoZSBmaXh1cCBpcyBpbnNpZGUuCisgIC8vLyBccGFyYW0gVGFyZ2V0IFtvdXRdIE9uIHJldHVybiwgdGhlIHJlbG9jYXRhYmxlIGV4cHJlc3Npb24gdGhlIGZpeHVwCisgIC8vLyBldmFsdWF0ZXMgdG8uCisgIC8vLyBccGFyYW0gVmFsdWUgW291dF0gT24gcmV0dXJuLCB0aGUgdmFsdWUgb2YgdGhlIGZpeHVwIGFzIGN1cnJlbnRseSBsYXllZAorICAvLy8gb3V0LgorICAvLy8gXHJldHVybiBXaGV0aGVyIHRoZSBmaXh1cCB2YWx1ZSB3YXMgZnVsbHkgcmVzb2x2ZWQuIFRoaXMgaXMgdHJ1ZSBpZiB0aGUKKyAgLy8vIFxhcmcgVmFsdWUgcmVzdWx0IGlzIGZpeGVkLCBvdGhlcndpc2UgdGhlIHZhbHVlIG1heSBjaGFuZ2UgZHVlIHRvCisgIC8vLyByZWxvY2F0aW9uLgorICBib29sIEV2YWx1YXRlRml4dXAoY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwLCBjb25zdCBNQ0ZyYWdtZW50ICpERiwKKyAgICAgICAgICAgICAgICAgICAgIE1DVmFsdWUgJlRhcmdldCwgdWludDY0X3QgJlZhbHVlKSBjb25zdDsKKworICAvLy8gQ2hlY2sgd2hldGhlciBhIGZpeHVwIGNhbiBiZSBzYXRpc2ZpZWQsIG9yIHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgcmVsYXhlZAorICAvLy8gKGluY3JlYXNlZCBpbiBzaXplLCBpbiBvcmRlciB0byBob2xkIGl0cyB2YWx1ZSBjb3JyZWN0bHkpLgorICBib29sIEZpeHVwTmVlZHNSZWxheGF0aW9uKGNvbnN0IE1DRml4dXAgJkZpeHVwLCBjb25zdCBNQ0ZyYWdtZW50ICpERiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gZnJhZ21lbnQgbmVlZHMgcmVsYXhhdGlvbi4KKyAgYm9vbCBGcmFnbWVudE5lZWRzUmVsYXhhdGlvbihjb25zdCBNQ0luc3RGcmFnbWVudCAqSUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgLy8vIENvbXB1dGUgdGhlIGVmZmVjdGl2ZSBmcmFnbWVudCBzaXplIGFzc3VtaW5nIGl0IGlzIGxheWVkIG91dCBhdCB0aGUgZ2l2ZW4KKyAgLy8vIFxhcmcgU2VjdGlvbkFkZHJlc3MgYW5kIFxhcmcgRnJhZ21lbnRPZmZzZXQuCisgIHVpbnQ2NF90IENvbXB1dGVGcmFnbWVudFNpemUoTUNBc21MYXlvdXQgJkxheW91dCwgY29uc3QgTUNGcmFnbWVudCAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTZWN0aW9uQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBGcmFnbWVudE9mZnNldCkgY29uc3Q7CisKKyAgLy8vIExheW91dE9uY2UgLSBQZXJmb3JtIG9uZSBsYXlvdXQgaXRlcmF0aW9uIGFuZCByZXR1cm4gdHJ1ZSBpZiBhbnkgb2Zmc2V0cworICAvLy8gd2VyZSBhZGp1c3RlZC4KKyAgYm9vbCBMYXlvdXRPbmNlKE1DQXNtTGF5b3V0ICZMYXlvdXQpOworCisgIC8vLyBGaW5pc2hMYXlvdXQgLSBGaW5hbGl6ZSBhIGxheW91dCwgaW5jbHVkaW5nIGZyYWdtZW50IGxvd2VyaW5nLgorICB2b2lkIEZpbmlzaExheW91dChNQ0FzbUxheW91dCAmTGF5b3V0KTsKKworcHVibGljOgorICAvLy8gRmluZCB0aGUgc3ltYm9sIHdoaWNoIGRlZmluZXMgdGhlIGF0b20gY29udGFpbmluZyB0aGUgZ2l2ZW4gc3ltYm9sLCBvcgorICAvLy8gbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHN5bWJvbC4KKyAgY29uc3QgTUNTeW1ib2xEYXRhICpnZXRBdG9tKGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbERhdGEgKlN5bWJvbCkgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHN5bWJvbCBpcyB2aXNpYmxlIHRvIHRoZSBsaW5rZXIgYW5kIGlzIHJlcXVpcmVkCisgIC8vLyBpbiB0aGUgc3ltYm9sIHRhYmxlLCBvciB3aGV0aGVyIGl0IGNhbiBiZSBkaXNjYXJkZWQgYnkgdGhlIGFzc2VtYmxlci4gVGhpcworICAvLy8gYWxzbyBlZmZlY3RzIHdoZXRoZXIgdGhlIGFzc2VtYmxlciB0cmVhdHMgdGhlIGxhYmVsIGFzIHBvdGVudGlhbGx5CisgIC8vLyBkZWZpbmluZyBhIHNlcGFyYXRlIGF0b20uCisgIGJvb2wgaXNTeW1ib2xMaW5rZXJWaXNpYmxlKGNvbnN0IE1DU3ltYm9sICZTRCkgY29uc3Q7CisKKyAgLy8vIEVtaXQgdGhlIHNlY3Rpb24gY29udGVudHMgdXNpbmcgdGhlIGdpdmVuIG9iamVjdCB3cml0ZXIuCisgIC8vCisgIC8vIEZJWE1FOiBTaG91bGQgTUNBc3NlbWJsZXIgYWx3YXlzIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB3cml0ZXI/CisgIHZvaWQgV3JpdGVTZWN0aW9uRGF0YShjb25zdCBNQ1NlY3Rpb25EYXRhICpTZWN0aW9uLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgTUNPYmplY3RXcml0ZXIgKk9XKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0IGEgbmV3IGFzc2VtYmxlciBpbnN0YW5jZS4KKyAgLy8vCisgIC8vLyBcYXJnIE9TIC0gVGhlIHN0cmVhbSB0byBvdXRwdXQgdG8uCisgIC8vCisgIC8vIEZJWE1FOiBIb3cgYXJlIHdlIGdvaW5nIHRvIHBhcmFtZXRlcml6ZSB0aGlzPyBUd28gb2J2aW91cyBvcHRpb25zIGFyZSBzdGF5CisgIC8vIGNvbmNyZXRlIGFuZCByZXF1aXJlIGNsaWVudHMgdG8gcGFzcyBpbiBhIHRhcmdldCBsaWtlIG9iamVjdC4gVGhlIG90aGVyCisgIC8vIG9wdGlvbiBpcyB0byBtYWtlIHRoaXMgYWJzdHJhY3QsIGFuZCBoYXZlIHRhcmdldHMgcHJvdmlkZSBjb25jcmV0ZQorICAvLyBpbXBsZW1lbnRhdGlvbnMgYXMgd2UgZG8gd2l0aCBBc21QYXJzZXIuCisgIE1DQXNzZW1ibGVyKE1DQ29udGV4dCAmX0NvbnRleHQsIFRhcmdldEFzbUJhY2tlbmQgJl9CYWNrZW5kLAorICAgICAgICAgICAgICBNQ0NvZGVFbWl0dGVyICZfRW1pdHRlciwgcmF3X29zdHJlYW0gJk9TKTsKKyAgfk1DQXNzZW1ibGVyKCk7CisKKyAgTUNDb250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIFRhcmdldEFzbUJhY2tlbmQgJmdldEJhY2tlbmQoKSBjb25zdCB7IHJldHVybiBCYWNrZW5kOyB9CisKKyAgTUNDb2RlRW1pdHRlciAmZ2V0RW1pdHRlcigpIGNvbnN0IHsgcmV0dXJuIEVtaXR0ZXI7IH0KKworICAvLy8gRmluaXNoIC0gRG8gZmluYWwgcHJvY2Vzc2luZyBhbmQgd3JpdGUgdGhlIG9iamVjdCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgLy8vIFxhcmcgV3JpdGVyIGlzIHVzZWQgZm9yIGN1c3RvbSBvYmplY3Qgd3JpdGVyIChhcyB0aGUgTUNKSVQgZG9lcyksCisgIC8vLyBpZiBub3Qgc3BlY2lmaWVkIGl0IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmcm9tIGJhY2tlbmQuCisgIHZvaWQgRmluaXNoKE1DT2JqZWN0V3JpdGVyICpXcml0ZXIgPSAwKTsKKworICAvLyBGSVhNRTogVGhpcyBkb2VzIG5vdCBiZWxvbmcgaGVyZS4KKyAgYm9vbCBnZXRTdWJzZWN0aW9uc1ZpYVN5bWJvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YnNlY3Rpb25zVmlhU3ltYm9sczsKKyAgfQorICB2b2lkIHNldFN1YnNlY3Rpb25zVmlhU3ltYm9scyhib29sIFZhbHVlKSB7CisgICAgU3Vic2VjdGlvbnNWaWFTeW1ib2xzID0gVmFsdWU7CisgIH0KKworICBib29sIGdldFJlbGF4QWxsKCkgY29uc3QgeyByZXR1cm4gUmVsYXhBbGw7IH0KKyAgdm9pZCBzZXRSZWxheEFsbChib29sIFZhbHVlKSB7IFJlbGF4QWxsID0gVmFsdWU7IH0KKworICAvLy8gQG5hbWUgU2VjdGlvbiBMaXN0IEFjY2VzcworICAvLy8gQHsKKworICBjb25zdCBTZWN0aW9uRGF0YUxpc3RUeXBlICZnZXRTZWN0aW9uTGlzdCgpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb25zOyB9CisgIFNlY3Rpb25EYXRhTGlzdFR5cGUgJmdldFNlY3Rpb25MaXN0KCkgeyByZXR1cm4gU2VjdGlvbnM7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIFNlY3Rpb25zLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBTZWN0aW9ucy5iZWdpbigpOyB9CisKKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gU2VjdGlvbnMuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbnMuZW5kKCk7IH0KKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb25zLnNpemUoKTsgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgU3ltYm9sIExpc3QgQWNjZXNzCisgIC8vLyBAeworCisgIGNvbnN0IFN5bWJvbERhdGFMaXN0VHlwZSAmZ2V0U3ltYm9sTGlzdCgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbHM7IH0KKyAgU3ltYm9sRGF0YUxpc3RUeXBlICZnZXRTeW1ib2xMaXN0KCkgeyByZXR1cm4gU3ltYm9sczsgfQorCisgIHN5bWJvbF9pdGVyYXRvciBzeW1ib2xfYmVnaW4oKSB7IHJldHVybiBTeW1ib2xzLmJlZ2luKCk7IH0KKyAgY29uc3Rfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbHMuYmVnaW4oKTsgfQorCisgIHN5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgeyByZXR1cm4gU3ltYm9scy5lbmQoKTsgfQorICBjb25zdF9zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbHMuZW5kKCk7IH0KKworICBzaXplX3Qgc3ltYm9sX3NpemUoKSBjb25zdCB7IHJldHVybiBTeW1ib2xzLnNpemUoKTsgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgSW5kaXJlY3QgU3ltYm9sIExpc3QgQWNjZXNzCisgIC8vLyBAeworCisgIC8vIEZJWE1FOiBUaGlzIGlzIGEgdG90YWwgaGFjaywgdGhpcyBzaG91bGQgbm90IGJlIGhlcmUuIE9uY2UgdGhpbmdzIGFyZQorICAvLyBmYWN0b3JlZCBzbyB0aGF0IHRoZSBzdHJlYW1lciBoYXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgLm8gd3JpdGVyLCBpdCBjYW4KKyAgLy8gZGlzYXBwZWFyLgorICBzdGQ6OnZlY3RvcjxJbmRpcmVjdFN5bWJvbERhdGE+ICZnZXRJbmRpcmVjdFN5bWJvbHMoKSB7CisgICAgcmV0dXJuIEluZGlyZWN0U3ltYm9sczsKKyAgfQorCisgIGluZGlyZWN0X3N5bWJvbF9pdGVyYXRvciBpbmRpcmVjdF9zeW1ib2xfYmVnaW4oKSB7CisgICAgcmV0dXJuIEluZGlyZWN0U3ltYm9scy5iZWdpbigpOworICB9CisgIGNvbnN0X2luZGlyZWN0X3N5bWJvbF9pdGVyYXRvciBpbmRpcmVjdF9zeW1ib2xfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEluZGlyZWN0U3ltYm9scy5iZWdpbigpOworICB9CisKKyAgaW5kaXJlY3Rfc3ltYm9sX2l0ZXJhdG9yIGluZGlyZWN0X3N5bWJvbF9lbmQoKSB7CisgICAgcmV0dXJuIEluZGlyZWN0U3ltYm9scy5lbmQoKTsKKyAgfQorICBjb25zdF9pbmRpcmVjdF9zeW1ib2xfaXRlcmF0b3IgaW5kaXJlY3Rfc3ltYm9sX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5kaXJlY3RTeW1ib2xzLmVuZCgpOworICB9CisKKyAgc2l6ZV90IGluZGlyZWN0X3N5bWJvbF9zaXplKCkgY29uc3QgeyByZXR1cm4gSW5kaXJlY3RTeW1ib2xzLnNpemUoKTsgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQmFja2VuZCBEYXRhIEFjY2VzcworICAvLy8gQHsKKworICBNQ1NlY3Rpb25EYXRhICZnZXRTZWN0aW9uRGF0YShjb25zdCBNQ1NlY3Rpb24gJlNlY3Rpb24pIGNvbnN0IHsKKyAgICBNQ1NlY3Rpb25EYXRhICpFbnRyeSA9IFNlY3Rpb25NYXAubG9va3VwKCZTZWN0aW9uKTsKKyAgICBhc3NlcnQoRW50cnkgJiYgIk1pc3Npbmcgc2VjdGlvbiBkYXRhISIpOworICAgIHJldHVybiAqRW50cnk7CisgIH0KKworICBNQ1NlY3Rpb25EYXRhICZnZXRPckNyZWF0ZVNlY3Rpb25EYXRhKGNvbnN0IE1DU2VjdGlvbiAmU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpDcmVhdGVkID0gMCkgeworICAgIE1DU2VjdGlvbkRhdGEgKiZFbnRyeSA9IFNlY3Rpb25NYXBbJlNlY3Rpb25dOworCisgICAgaWYgKENyZWF0ZWQpICpDcmVhdGVkID0gIUVudHJ5OworICAgIGlmICghRW50cnkpCisgICAgICBFbnRyeSA9IG5ldyBNQ1NlY3Rpb25EYXRhKFNlY3Rpb24sIHRoaXMpOworCisgICAgcmV0dXJuICpFbnRyeTsKKyAgfQorCisgIE1DU3ltYm9sRGF0YSAmZ2V0U3ltYm9sRGF0YShjb25zdCBNQ1N5bWJvbCAmU3ltYm9sKSBjb25zdCB7CisgICAgTUNTeW1ib2xEYXRhICpFbnRyeSA9IFN5bWJvbE1hcC5sb29rdXAoJlN5bWJvbCk7CisgICAgYXNzZXJ0KEVudHJ5ICYmICJNaXNzaW5nIHN5bWJvbCBkYXRhISIpOworICAgIHJldHVybiAqRW50cnk7CisgIH0KKworICBNQ1N5bWJvbERhdGEgJmdldE9yQ3JlYXRlU3ltYm9sRGF0YShjb25zdCBNQ1N5bWJvbCAmU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpDcmVhdGVkID0gMCkgeworICAgIE1DU3ltYm9sRGF0YSAqJkVudHJ5ID0gU3ltYm9sTWFwWyZTeW1ib2xdOworCisgICAgaWYgKENyZWF0ZWQpICpDcmVhdGVkID0gIUVudHJ5OworICAgIGlmICghRW50cnkpCisgICAgICBFbnRyeSA9IG5ldyBNQ1N5bWJvbERhdGEoU3ltYm9sLCAwLCAwLCB0aGlzKTsKKworICAgIHJldHVybiAqRW50cnk7CisgIH0KKworICAvLy8gQH0KKworICB2b2lkIGR1bXAoKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DQ29kZUVtaXR0ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVFbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwYTJlNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVFbWl0dGVyLmgKQEAgLTAsMCArMSw4MCBAQAorLy89PT0tLSBsbHZtL01DL01DQ29kZUVtaXR0ZXIuaCAtIEluc3RydWN0aW9uIEVuY29kaW5nIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQ09ERUVNSVRURVJfSAorI2RlZmluZSBMTFZNX01DX01DQ09ERUVNSVRURVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0ZpeHVwLmgiCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ0V4cHI7CitjbGFzcyBNQ0luc3Q7CitjbGFzcyByYXdfb3N0cmVhbTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKworLy8vIE1DRml4dXBLaW5kSW5mbyAtIFRhcmdldCBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiBvbiBhIGZpeHVwIGtpbmQuCitzdHJ1Y3QgTUNGaXh1cEtpbmRJbmZvIHsKKyAgZW51bSBGaXh1cEtpbmRGbGFncyB7CisgICAgLy8vIElzIHRoaXMgZml4dXAga2luZCBQQ3JlbGF0aXZlLiBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciBiYWNrZW5kIHRvCisgICAgLy8vIGV2YWx1YXRlIGZpeHVwIHZhbHVlcyBpbiBhIHRhcmdldCBpbmRlcGVuZGVudCBtYW5uZXIgd2hlbiBwb3NzaWJsZS4KKyAgICBGS0ZfSXNQQ1JlbCA9ICgxIDw8IDApCisgIH07CisKKyAgLy8vIEEgdGFyZ2V0IHNwZWNpZmljIG5hbWUgZm9yIHRoZSBmaXh1cCBraW5kLiBUaGUgbmFtZXMgd2lsbCBiZSB1bmlxdWUgZm9yCisgIC8vLyBkaXN0aW5jdCBraW5kcyBvbiBhbnkgZ2l2ZW4gdGFyZ2V0LgorICBjb25zdCBjaGFyICpOYW1lOworCisgIC8vLyBUaGUgYml0IG9mZnNldCB0byB3cml0ZSB0aGUgcmVsb2NhdGlvbiBpbnRvLgorICAvLworICAvLyBGSVhNRTogVGhlc2UgdHdvIGZpZWxkcyBhcmUgdW5kZXItc3BlY2lmaWVkIGFuZCBub3QgZ2VuZXJhbCBlbm91Z2gsIGJ1dCBpdAorICAvLyBpcyBjb3ZlcnMgbWFueSB0aGluZ3MsIGFuZCBpcyBlbm91Z2ggdG8gbGV0IHRoZSBBc21TdHJlYW1lciBwcmV0dHktcHJpbnQKKyAgLy8gdGhlIGVuY29kaW5nLgorICB1bnNpZ25lZCBUYXJnZXRPZmZzZXQ7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgYml0cyB3cml0dGVuIGJ5IHRoaXMgZml4dXAuIFRoZSBiaXRzIGFyZSBhc3N1bWVkIHRvIGJlCisgIC8vLyBjb250aWd1b3VzLgorICB1bnNpZ25lZCBUYXJnZXRTaXplOworCisgIC8vLyBGbGFncyBkZXNjcmliaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhpcyBmaXh1cCBraW5kLgorICB1bnNpZ25lZCBGbGFnczsKK307CisKKy8vLyBNQ0NvZGVFbWl0dGVyIC0gR2VuZXJpYyBpbnN0cnVjdGlvbiBlbmNvZGluZyBpbnRlcmZhY2UuCitjbGFzcyBNQ0NvZGVFbWl0dGVyIHsKK3ByaXZhdGU6CisgIE1DQ29kZUVtaXR0ZXIoY29uc3QgTUNDb2RlRW1pdHRlciAmKTsgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1DQ29kZUVtaXR0ZXIgJik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBNQ0NvZGVFbWl0dGVyKCk7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+TUNDb2RlRW1pdHRlcigpOworCisgIC8vLyBAbmFtZSBUYXJnZXQgSW5kZXBlbmRlbnQgRml4dXAgSW5mb3JtYXRpb24KKyAgLy8vIEB7CisKKyAgLy8vIGdldE51bUZpeHVwS2luZHMgLSBHZXQgdGhlIG51bWJlciBvZiB0YXJnZXQgc3BlY2lmaWMgZml4dXAga2luZHMuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtRml4dXBLaW5kcygpIGNvbnN0ID0gMDsKKworICAvLy8gZ2V0Rml4dXBLaW5kSW5mbyAtIEdldCBpbmZvcm1hdGlvbiBvbiBhIGZpeHVwIGtpbmQuCisgIHZpcnR1YWwgY29uc3QgTUNGaXh1cEtpbmRJbmZvICZnZXRGaXh1cEtpbmRJbmZvKE1DRml4dXBLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBAfQorCisgIC8vLyBFbmNvZGVJbnN0cnVjdGlvbiAtIEVuY29kZSB0aGUgZ2l2ZW4gXGFyZyBJbnN0IHRvIGJ5dGVzIG9uIHRoZSBvdXRwdXQKKyAgLy8vIHN0cmVhbSBcYXJnIE9TLgorICB2aXJ0dWFsIHZvaWQgRW5jb2RlSW5zdHJ1Y3Rpb24oY29uc3QgTUNJbnN0ICZJbnN0LCByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TUNGaXh1cD4gJkZpeHVwcykgY29uc3QgPSAwOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNDb250ZXh0LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiMDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0NvbnRleHQuaApAQCAtMCwwICsxLDI1MiBAQAorLy89PT0tIE1DQ29udGV4dC5oIC0gTWFjaGluZSBDb2RlIENvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQ09OVEVYVF9ICisjZGVmaW5lIExMVk1fTUNfTUNDT05URVhUX0gKKworI2luY2x1ZGUgImxsdm0vTUMvU2VjdGlvbktpbmQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDx2ZWN0b3I+IC8vIEZJWE1FOiBTaG91bGRuJ3QgYmUgbmVlZGVkLgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1DQXNtSW5mbzsKKyAgY2xhc3MgTUNFeHByOworICBjbGFzcyBNQ1NlY3Rpb247CisgIGNsYXNzIE1DU3ltYm9sOworICBjbGFzcyBNQ0xhYmVsOworICBjbGFzcyBNQ0R3YXJmRmlsZTsKKyAgY2xhc3MgU3RyaW5nUmVmOworICBjbGFzcyBUd2luZTsKKyAgY2xhc3MgTUNTZWN0aW9uTWFjaE87CisKKyAgLy8vIE1DQ29udGV4dCAtIENvbnRleHQgb2JqZWN0IGZvciBtYWNoaW5lIGNvZGUgb2JqZWN0cy4gIFRoaXMgY2xhc3Mgb3ducyBhbGwKKyAgLy8vIG9mIHRoZSBzZWN0aW9ucyB0aGF0IGl0IGNyZWF0ZXMuCisgIC8vLworICBjbGFzcyBNQ0NvbnRleHQgeworICAgIE1DQ29udGV4dChjb25zdCBNQ0NvbnRleHQmKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICAgIE1DQ29udGV4dCAmb3BlcmF0b3I9KGNvbnN0IE1DQ29udGV4dCYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisKKyAgICAvLy8gVGhlIE1DQXNtSW5mbyBmb3IgdGhpcyB0YXJnZXQuCisgICAgY29uc3QgTUNBc21JbmZvICZNQUk7CisKKyAgICAvLy8gU3ltYm9scyAtIEJpbmRpbmdzIG9mIG5hbWVzIHRvIHN5bWJvbHMuCisgICAgU3RyaW5nTWFwPE1DU3ltYm9sKj4gU3ltYm9sczsKKworICAgIC8vLyBOZXh0VW5pcXVlSUQgLSBUaGUgbmV4dCBJRCB0byBkb2xlIG91dCB0byBhbiB1bm5hbWVkIGFzc2VtYmxlciB0ZW1wb3JhcnkKKyAgICAvLy8gc3ltYm9sLgorICAgIHVuc2lnbmVkIE5leHRVbmlxdWVJRDsKKworICAgIC8vLyBJbnN0YW5jZXMgb2YgZGlyZWN0aW9uYWwgbG9jYWwgbGFiZWxzLgorICAgIERlbnNlTWFwPHVuc2lnbmVkLCBNQ0xhYmVsICo+IEluc3RhbmNlczsKKyAgICAvLy8gTmV4dEluc3RhbmNlKCkgY3JlYXRlcyB0aGUgbmV4dCBpbnN0YW5jZSBvZiB0aGUgZGlyZWN0aW9uYWwgbG9jYWwgbGFiZWwKKyAgICAvLy8gZm9yIHRoZSBMb2NhbExhYmVsVmFsIGFuZCBhZGRzIGl0IHRvIHRoZSBtYXAgaWYgbmVlZGVkLgorICAgIHVuc2lnbmVkIE5leHRJbnN0YW5jZShpbnQ2NF90IExvY2FsTGFiZWxWYWwpOworICAgIC8vLyBHZXRJbnN0YW5jZSgpIGdldHMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGRpcmVjdGlvbmFsIGxvY2FsIGxhYmVsCisgICAgLy8vIGZvciB0aGUgTG9jYWxMYWJlbFZhbCBhbmQgYWRkcyBpdCB0byB0aGUgbWFwIGlmIG5lZWRlZC4KKyAgICB1bnNpZ25lZCBHZXRJbnN0YW5jZShpbnQ2NF90IExvY2FsTGFiZWxWYWwpOworICAgIAorICAgIC8vLyBUaGUgZmlsZSBuYW1lIG9mIHRoZSBsb2cgZmlsZSBmcm9tIHRoZSBlbnZpcm9tbWVudCB2YXJpYWJsZQorICAgIC8vLyBBU19TRUNVUkVfTE9HX0ZJTEUuICBXaGljaCBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIC5zZWN1cmVfbG9nX3VuaXF1ZQorICAgIC8vLyBkaXJlY3RpdmUgaXMgdXNlZCBvciBpdCBpcyBhbiBlcnJvci4KKyAgICBjaGFyICpTZWN1cmVMb2dGaWxlOworICAgIC8vLyBUaGUgc3RyZWFtIHRoYXQgZ2V0cyB3cml0dGVuIHRvIGZvciB0aGUgLnNlY3VyZV9sb2dfdW5pcXVlIGRpcmVjdGl2ZS4KKyAgICByYXdfb3N0cmVhbSAqU2VjdXJlTG9nOworICAgIC8vLyBCb29sZWFuIHRvZ2dsZWQgd2hlbiAuc2VjdXJlX2xvZ191bmlxdWUgLyAuc2VjdXJlX2xvZ19yZXNldCBpcyBzZWVuIHRvCisgICAgLy8vIGNhdGNoIGVycm9ycyBpZiAuc2VjdXJlX2xvZ191bmlxdWUgYXBwZWFycyB0d2ljZSB3aXRob3V0CisgICAgLy8vIC5zZWN1cmVfbG9nX3Jlc2V0IGFwcGVhcmluZyBiZXR3ZWVuIHRoZW0uCisgICAgYm9vbCBTZWN1cmVMb2dVc2VkOworCisgICAgLy8vIFRoZSBkd2FyZiBmaWxlIGFuZCBkaXJlY3RvcnkgdGFibGVzIGZyb20gdGhlIGR3YXJmIC5maWxlIGRpcmVjdGl2ZS4KKyAgICBzdGQ6OnZlY3RvcjxNQ0R3YXJmRmlsZSAqPiBNQ0R3YXJmRmlsZXM7CisgICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBNQ0R3YXJmRGlyczsKKworICAgIC8vLyBBbGxvY2F0b3IgLSBBbGxvY2F0b3Igb2JqZWN0IHVzZWQgZm9yIGNyZWF0aW5nIG1hY2hpbmUgY29kZSBvYmplY3RzLgorICAgIC8vLworICAgIC8vLyBXZSB1c2UgYSBidW1wIHBvaW50ZXIgYWxsb2NhdG9yIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHRyYWNrIGFsbCBhbGxvY2F0ZWQKKyAgICAvLy8gb2JqZWN0cy4KKyAgICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKKyAgICAKKyAgICB2b2lkICpNYWNoT1VuaXF1aW5nTWFwLCAqRUxGVW5pcXVpbmdNYXAsICpDT0ZGVW5pcXVpbmdNYXA7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBNQ0NvbnRleHQoY29uc3QgTUNBc21JbmZvICZNQUkpOworICAgIH5NQ0NvbnRleHQoKTsKKyAgICAKKyAgICBjb25zdCBNQ0FzbUluZm8gJmdldEFzbUluZm8oKSBjb25zdCB7IHJldHVybiBNQUk7IH0KKworICAgIC8vLyBAbmFtZSBTeW1ib2wgTWFuYWdtZW50CisgICAgLy8vIEB7CisgICAgCisgICAgLy8vIENyZWF0ZVRlbXBTeW1ib2wgLSBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBhc3NlbWJsZXIgdGVtcG9yYXJ5IHN5bWJvbAorICAgIC8vLyB3aXRoIGEgdW5pcXVlIGJ1dCB1bnNwZWNpZmllZCBuYW1lLgorICAgIE1DU3ltYm9sICpDcmVhdGVUZW1wU3ltYm9sKCk7CisKKyAgICAvLy8gQ3JlYXRlRGlyZWN0aW9uYWxMb2NhbFN5bWJvbCAtIENyZWF0ZSB0aGUgZGVmaW50aW9uIG9mIGEgZGlyZWN0aW9uYWwKKyAgICAvLy8gbG9jYWwgc3ltYm9sIGZvciBudW1iZXJlZCBsYWJlbCAodXNlZCBmb3IgIjE6IiBkZWZpbnRpb25zKS4KKyAgICBNQ1N5bWJvbCAqQ3JlYXRlRGlyZWN0aW9uYWxMb2NhbFN5bWJvbChpbnQ2NF90IExvY2FsTGFiZWxWYWwpOworCisgICAgLy8vIEdldERpcmVjdGlvbmFsTG9jYWxTeW1ib2wgLSBDcmVhdGUgYW5kIHJldHVybiBhIGRpcmVjdGlvbmFsIGxvY2FsCisgICAgLy8vIHN5bWJvbCBmb3IgbnVtYmVyZWQgbGFiZWwgKHVzZWQgZm9yICIxYiIgb3IgMWYiIHJlZmVyZW5jZXMpLgorICAgIE1DU3ltYm9sICpHZXREaXJlY3Rpb25hbExvY2FsU3ltYm9sKGludDY0X3QgTG9jYWxMYWJlbFZhbCwgaW50IGJPUmYpOworCisgICAgLy8vIEdldE9yQ3JlYXRlU3ltYm9sIC0gTG9va3VwIHRoZSBzeW1ib2wgaW5zaWRlIHdpdGggdGhlIHNwZWNpZmllZAorICAgIC8vLyBAcCBOYW1lLiAgSWYgaXQgZXhpc3RzLCByZXR1cm4gaXQuICBJZiBub3QsIGNyZWF0ZSBhIGZvcndhcmQKKyAgICAvLy8gcmVmZXJlbmNlIGFuZCByZXR1cm4gaXQuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBOYW1lIC0gVGhlIHN5bWJvbCBuYW1lLCB3aGljaCBtdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIHN5bWJvbHMuCisgICAgTUNTeW1ib2wgKkdldE9yQ3JlYXRlU3ltYm9sKFN0cmluZ1JlZiBOYW1lKTsKKyAgICBNQ1N5bWJvbCAqR2V0T3JDcmVhdGVTeW1ib2woY29uc3QgVHdpbmUgJk5hbWUpOworCisgICAgLy8vIExvb2t1cFN5bWJvbCAtIEdldCB0aGUgc3ltYm9sIGZvciBccCBOYW1lLCBvciBudWxsLgorICAgIE1DU3ltYm9sICpMb29rdXBTeW1ib2woU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgICAgLy8vIEB9CisgICAgCisgICAgLy8vIEBuYW1lIFNlY3Rpb24gTWFuYWdtZW50CisgICAgLy8vIEB7CisKKyAgICAvLy8gZ2V0TWFjaE9TZWN0aW9uIC0gUmV0dXJuIHRoZSBNQ1NlY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgbWFjaC1vIHNlY3Rpb24uCisgICAgLy8vIFRoaXMgcmVxdWlyZXMgdGhlIG9wZXJhbmRzIHRvIGJlIHZhbGlkLgorICAgIGNvbnN0IE1DU2VjdGlvbk1hY2hPICpnZXRNYWNoT1NlY3Rpb24oU3RyaW5nUmVmIFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFR5cGVBbmRBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVzZXJ2ZWQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQgSyk7CisgICAgY29uc3QgTUNTZWN0aW9uTWFjaE8gKmdldE1hY2hPU2VjdGlvbihTdHJpbmdSZWYgU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVHlwZUFuZEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLKSB7CisgICAgICByZXR1cm4gZ2V0TWFjaE9TZWN0aW9uKFNlZ21lbnQsIFNlY3Rpb24sIFR5cGVBbmRBdHRyaWJ1dGVzLCAwLCBLKTsKKyAgICB9CisgICAgCisgICAgY29uc3QgTUNTZWN0aW9uICpnZXRFTEZTZWN0aW9uKFN0cmluZ1JlZiBTZWN0aW9uLCB1bnNpZ25lZCBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncywgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0V4cGxpY2l0ID0gZmFsc2UpOworCisgICAgY29uc3QgTUNTZWN0aW9uICpnZXRDT0ZGU2VjdGlvbihTdHJpbmdSZWYgU2VjdGlvbiwgdW5zaWduZWQgQ2hhcmFjdGVyaXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNlbGVjdGlvbiwgU2VjdGlvbktpbmQgS2luZCk7CisKKyAgICBjb25zdCBNQ1NlY3Rpb24gKmdldENPRkZTZWN0aW9uKFN0cmluZ1JlZiBTZWN0aW9uLCB1bnNpZ25lZCBDaGFyYWN0ZXJpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kKSB7CisgICAgICByZXR1cm4gZ2V0Q09GRlNlY3Rpb24gKFNlY3Rpb24sIENoYXJhY3RlcmlzdGljcywgMCwgS2luZCk7CisgICAgfQorCisgICAgCisgICAgLy8vIEB9CisKKyAgICAvLy8gQG5hbWUgRHdhcmYgTWFuYWdtZW50CisgICAgLy8vIEB7CisKKyAgICAvLy8gR2V0RHdhcmZGaWxlIC0gY3JlYXRlcyBhbiBlbnRyeSBpbiB0aGUgZHdhcmYgZmlsZSBhbmQgZGlyZWN0b3J5IHRhYmxlcy4KKyAgICB1bnNpZ25lZCBHZXREd2FyZkZpbGUoU3RyaW5nUmVmIEZpbGVOYW1lLCB1bnNpZ25lZCBGaWxlTnVtYmVyKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1DRHdhcmZGaWxlICo+ICZnZXRNQ0R3YXJmRmlsZXMoKSB7CisgICAgICByZXR1cm4gTUNEd2FyZkZpbGVzOworICAgIH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZnZXRNQ0R3YXJmRGlycygpIHsKKyAgICAgIHJldHVybiBNQ0R3YXJmRGlyczsKKyAgICB9CisKKyAgICAvLy8gQH0KKworICAgIGNoYXIgKmdldFNlY3VyZUxvZ0ZpbGUoKSB7IHJldHVybiBTZWN1cmVMb2dGaWxlOyB9CisgICAgcmF3X29zdHJlYW0gKmdldFNlY3VyZUxvZygpIHsgcmV0dXJuIFNlY3VyZUxvZzsgfQorICAgIGJvb2wgZ2V0U2VjdXJlTG9nVXNlZCgpIHsgcmV0dXJuIFNlY3VyZUxvZ1VzZWQ7IH0KKyAgICB2b2lkIHNldFNlY3VyZUxvZyhyYXdfb3N0cmVhbSAqVmFsdWUpIHsKKyAgICAgIFNlY3VyZUxvZyA9IFZhbHVlOworICAgIH0KKyAgICB2b2lkIHNldFNlY3VyZUxvZ1VzZWQoYm9vbCBWYWx1ZSkgeworICAgICAgU2VjdXJlTG9nVXNlZCA9IFZhbHVlOworICAgIH0KKworICAgIHZvaWQgKkFsbG9jYXRlKHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIEFsaWduID0gOCkgeworICAgICAgcmV0dXJuIEFsbG9jYXRvci5BbGxvY2F0ZShTaXplLCBBbGlnbik7CisgICAgfQorICAgIHZvaWQgRGVhbGxvY2F0ZSh2b2lkICpQdHIpIHsKKyAgICB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKy8vIG9wZXJhdG9yIG5ldyBhbmQgZGVsZXRlIGFyZW4ndCBhbGxvd2VkIGluc2lkZSBuYW1lc3BhY2VzLgorLy8gVGhlIHRocm93IHNwZWNpZmljYXRpb25zIGFyZSBtYW5kYXRlZCBieSB0aGUgc3RhbmRhcmQuCisvLy8gQGJyaWVmIFBsYWNlbWVudCBuZXcgZm9yIHVzaW5nIHRoZSBNQ0NvbnRleHQncyBhbGxvY2F0b3IuCisvLy8KKy8vLyBUaGlzIHBsYWNlbWVudCBmb3JtIG9mIG9wZXJhdG9yIG5ldyB1c2VzIHRoZSBNQ0NvbnRleHQncyBhbGxvY2F0b3IgZm9yCisvLy8gb2J0YWluaW5nIG1lbW9yeS4gSXQgaXMgYSBub24tdGhyb3dpbmcgbmV3LCB3aGljaCBtZWFucyB0aGF0IGl0IHJldHVybnMKKy8vLyBudWxsIG9uIGVycm9yLiAoSWYgdGhhdCBpcyB3aGF0IHRoZSBhbGxvY2F0b3IgZG9lcy4gVGhlIGN1cnJlbnQgZG9lcywgc28gaWYKKy8vLyB0aGlzIGV2ZXIgY2hhbmdlcywgdGhpcyBvcGVyYXRvciB3aWxsIGhhdmUgdG8gYmUgY2hhbmdlZCwgdG9vLikKKy8vLyBVc2FnZSBsb29rcyBsaWtlIHRoaXMgKGFzc3VtaW5nIHRoZXJlJ3MgYW4gTUNDb250ZXh0ICdDb250ZXh0JyBpbiBzY29wZSk6CisvLy8gQGNvZGUKKy8vLyAvLyBEZWZhdWx0IGFsaWdubWVudCAoMTYpCisvLy8gSW50ZWdlckxpdGVyYWwgKkV4ID0gbmV3IChDb250ZXh0KSBJbnRlZ2VyTGl0ZXJhbChhcmd1bWVudHMpOworLy8vIC8vIFNwZWNpZmljIGFsaWdubWVudAorLy8vIEludGVnZXJMaXRlcmFsICpFeDIgPSBuZXcgKENvbnRleHQsIDgpIEludGVnZXJMaXRlcmFsKGFyZ3VtZW50cyk7CisvLy8gQGVuZGNvZGUKKy8vLyBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIGRlbGV0ZSBvbiB0aGUgcG9pbnRlcjsgaXQgbXVzdCBiZQorLy8vIGRlYWxsb2NhdGVkIHVzaW5nIGFuIGV4cGxpY2l0IGRlc3RydWN0b3IgY2FsbCBmb2xsb3dlZCBieQorLy8vIEBjIENvbnRleHQuRGVhbGxvY2F0ZShQdHIpLgorLy8vCisvLy8gQHBhcmFtIEJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUuIENhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyLgorLy8vIEBwYXJhbSBDIFRoZSBNQ0NvbnRleHQgdGhhdCBwcm92aWRlcyB0aGUgYWxsb2NhdG9yLgorLy8vIEBwYXJhbSBBbGlnbm1lbnQgVGhlIGFsaWdubWVudCBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAoaWYgdGhlIHVuZGVybHlpbmcKKy8vLyAgICAgICAgICAgICAgICAgIGFsbG9jYXRvciBzdXBwb3J0cyBpdCkuCisvLy8gQHJldHVybiBUaGUgYWxsb2NhdGVkIG1lbW9yeS4gQ291bGQgYmUgTlVMTC4KK2lubGluZSB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IEJ5dGVzLCBsbHZtOjpNQ0NvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBBbGlnbm1lbnQgPSAxNikgdGhyb3cgKCkgeworICByZXR1cm4gQy5BbGxvY2F0ZShCeXRlcywgQWxpZ25tZW50KTsKK30KKy8vLyBAYnJpZWYgUGxhY2VtZW50IGRlbGV0ZSBjb21wYW5pb24gdG8gdGhlIG5ldyBhYm92ZS4KKy8vLworLy8vIFRoaXMgb3BlcmF0b3IgaXMganVzdCBhIGNvbXBhbmlvbiB0byB0aGUgbmV3IGFib3ZlLiBUaGVyZSBpcyBubyB3YXkgb2YKKy8vLyBpbnZva2luZyBpdCBkaXJlY3RseTsgc2VlIHRoZSBuZXcgb3BlcmF0b3IgZm9yIG1vcmUgZGV0YWlscy4gVGhpcyBvcGVyYXRvcgorLy8vIGlzIGNhbGxlZCBpbXBsaWNpdGx5IGJ5IHRoZSBjb21waWxlciBpZiBhIHBsYWNlbWVudCBuZXcgZXhwcmVzc2lvbiB1c2luZworLy8vIHRoZSBNQ0NvbnRleHQgdGhyb3dzIGluIHRoZSBvYmplY3QgY29uc3RydWN0b3IuCitpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqUHRyLCBsbHZtOjpNQ0NvbnRleHQgJkMsIHNpemVfdCkKKyAgICAgICAgICAgICAgdGhyb3cgKCkgeworICBDLkRlYWxsb2NhdGUoUHRyKTsKK30KKworLy8vIFRoaXMgcGxhY2VtZW50IGZvcm0gb2Ygb3BlcmF0b3IgbmV3W10gdXNlcyB0aGUgTUNDb250ZXh0J3MgYWxsb2NhdG9yIGZvcgorLy8vIG9idGFpbmluZyBtZW1vcnkuIEl0IGlzIGEgbm9uLXRocm93aW5nIG5ld1tdLCB3aGljaCBtZWFucyB0aGF0IGl0IHJldHVybnMKKy8vLyBudWxsIG9uIGVycm9yLgorLy8vIFVzYWdlIGxvb2tzIGxpa2UgdGhpcyAoYXNzdW1pbmcgdGhlcmUncyBhbiBNQ0NvbnRleHQgJ0NvbnRleHQnIGluIHNjb3BlKToKKy8vLyBAY29kZQorLy8vIC8vIERlZmF1bHQgYWxpZ25tZW50ICgxNikKKy8vLyBjaGFyICpkYXRhID0gbmV3IChDb250ZXh0KSBjaGFyWzEwXTsKKy8vLyAvLyBTcGVjaWZpYyBhbGlnbm1lbnQKKy8vLyBjaGFyICpkYXRhID0gbmV3IChDb250ZXh0LCA4KSBjaGFyWzEwXTsKKy8vLyBAZW5kY29kZQorLy8vIFBsZWFzZSBub3RlIHRoYXQgeW91IGNhbm5vdCB1c2UgZGVsZXRlIG9uIHRoZSBwb2ludGVyOyBpdCBtdXN0IGJlCisvLy8gZGVhbGxvY2F0ZWQgdXNpbmcgYW4gZXhwbGljaXQgZGVzdHJ1Y3RvciBjYWxsIGZvbGxvd2VkIGJ5CisvLy8gQGMgQ29udGV4dC5EZWFsbG9jYXRlKFB0cikuCisvLy8KKy8vLyBAcGFyYW0gQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZS4gQ2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIuCisvLy8gQHBhcmFtIEMgVGhlIE1DQ29udGV4dCB0aGF0IHByb3ZpZGVzIHRoZSBhbGxvY2F0b3IuCisvLy8gQHBhcmFtIEFsaWdubWVudCBUaGUgYWxpZ25tZW50IG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IChpZiB0aGUgdW5kZXJseWluZworLy8vICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yIHN1cHBvcnRzIGl0KS4KKy8vLyBAcmV0dXJuIFRoZSBhbGxvY2F0ZWQgbWVtb3J5LiBDb3VsZCBiZSBOVUxMLgoraW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCBCeXRlcywgbGx2bTo6TUNDb250ZXh0JiBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBBbGlnbm1lbnQgPSAxNikgdGhyb3cgKCkgeworICByZXR1cm4gQy5BbGxvY2F0ZShCeXRlcywgQWxpZ25tZW50KTsKK30KKworLy8vIEBicmllZiBQbGFjZW1lbnQgZGVsZXRlW10gY29tcGFuaW9uIHRvIHRoZSBuZXdbXSBhYm92ZS4KKy8vLworLy8vIFRoaXMgb3BlcmF0b3IgaXMganVzdCBhIGNvbXBhbmlvbiB0byB0aGUgbmV3W10gYWJvdmUuIFRoZXJlIGlzIG5vIHdheSBvZgorLy8vIGludm9raW5nIGl0IGRpcmVjdGx5OyBzZWUgdGhlIG5ld1tdIG9wZXJhdG9yIGZvciBtb3JlIGRldGFpbHMuIFRoaXMgb3BlcmF0b3IKKy8vLyBpcyBjYWxsZWQgaW1wbGljaXRseSBieSB0aGUgY29tcGlsZXIgaWYgYSBwbGFjZW1lbnQgbmV3W10gZXhwcmVzc2lvbiB1c2luZworLy8vIHRoZSBNQ0NvbnRleHQgdGhyb3dzIGluIHRoZSBvYmplY3QgY29uc3RydWN0b3IuCitpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkICpQdHIsIGxsdm06Ok1DQ29udGV4dCAmQykgdGhyb3cgKCkgeworICBDLkRlYWxsb2NhdGUoUHRyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNEaXJlY3RpdmVzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNEaXJlY3RpdmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzYjA5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0RpcmVjdGl2ZXMuaApAQCAtMCwwICsxLDUxIEBACisvLz09PS0gTUNEaXJlY3RpdmVzLmggLSBFbnVtcyBmb3IgZGlyZWN0aXZlcyBvbiB2YXJpb3VzIHRhcmdldHMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHZhcmlvdXMgZW51bXMgdGhhdCByZXByZXNlbnQgdGFyZ2V0LXNwZWNpZmljIGRpcmVjdGl2ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DRElSRUNUSVZFU19ICisjZGVmaW5lIExMVk1fTUNfTUNESVJFQ1RJVkVTX0gKKworbmFtZXNwYWNlIGxsdm0geworCitlbnVtIE1DU3ltYm9sQXR0ciB7CisgIE1DU0FfSW52YWxpZCA9IDAsICAgIC8vLzwgTm90IGEgdmFsaWQgZGlyZWN0aXZlLgorCisgIC8vIFZhcmlvdXMgZGlyZWN0aXZlcyBpbiBhbHBoYWJldGljYWwgb3JkZXIuCisgIE1DU0FfRUxGX1R5cGVGdW5jdGlvbiwgICAgLy8vPCAudHlwZSBfZm9vLCBTVFRfRlVOQyAgIyBha2EgQGZ1bmN0aW9uCisgIE1DU0FfRUxGX1R5cGVJbmRGdW5jdGlvbiwgLy8vPCAudHlwZSBfZm9vLCBTVFRfR05VX0lGVU5DCisgIE1DU0FfRUxGX1R5cGVPYmplY3QsICAgICAgLy8vPCAudHlwZSBfZm9vLCBTVFRfT0JKRUNUICAjIGFrYSBAb2JqZWN0CisgIE1DU0FfRUxGX1R5cGVUTFMsICAgICAgICAgLy8vPCAudHlwZSBfZm9vLCBTVFRfVExTICAgICAjIGFrYSBAdGxzX29iamVjdAorICBNQ1NBX0VMRl9UeXBlQ29tbW9uLCAgICAgIC8vLzwgLnR5cGUgX2ZvbywgU1RUX0NPTU1PTiAgIyBha2EgQGNvbW1vbgorICBNQ1NBX0VMRl9UeXBlTm9UeXBlLCAgICAgIC8vLzwgLnR5cGUgX2ZvbywgU1RUX05PVFlQRSAgIyBha2EgQG5vdHlwZQorICBNQ1NBX0dsb2JhbCwgICAgICAgICAgICAgIC8vLzwgLmdsb2JsCisgIE1DU0FfSGlkZGVuLCAgICAgICAgICAgICAgLy8vPCAuaGlkZGVuIChFTEYpCisgIE1DU0FfSW5kaXJlY3RTeW1ib2wsICAgICAgLy8vPCAuaW5kaXJlY3Rfc3ltYm9sIChNYWNoTykKKyAgTUNTQV9JbnRlcm5hbCwgICAgICAgICAgICAvLy88IC5pbnRlcm5hbCAoRUxGKQorICBNQ1NBX0xhenlSZWZlcmVuY2UsICAgICAgIC8vLzwgLmxhenlfcmVmZXJlbmNlIChNYWNoTykKKyAgTUNTQV9Mb2NhbCwgICAgICAgICAgICAgICAvLy88IC5sb2NhbCAoRUxGKQorICBNQ1NBX05vRGVhZFN0cmlwLCAgICAgICAgIC8vLzwgLm5vX2RlYWRfc3RyaXAgKE1hY2hPKQorICBNQ1NBX1ByaXZhdGVFeHRlcm4sICAgICAgIC8vLzwgLnByaXZhdGVfZXh0ZXJuIChNYWNoTykKKyAgTUNTQV9Qcm90ZWN0ZWQsICAgICAgICAgICAvLy88IC5wcm90ZWN0ZWQgKEVMRikKKyAgTUNTQV9SZWZlcmVuY2UsICAgICAgICAgICAvLy88IC5yZWZlcmVuY2UgKE1hY2hPKQorICBNQ1NBX1dlYWssICAgICAgICAgICAgICAgIC8vLzwgLndlYWsKKyAgTUNTQV9XZWFrRGVmaW5pdGlvbiwgICAgICAvLy88IC53ZWFrX2RlZmluaXRpb24gKE1hY2hPKQorICBNQ1NBX1dlYWtSZWZlcmVuY2UsICAgICAgIC8vLzwgLndlYWtfcmVmZXJlbmNlIChNYWNoTykKKyAgTUNTQV9XZWFrRGVmQXV0b1ByaXZhdGUgICAvLy88IC53ZWFrX2RlZl9jYW5fYmVfaGlkZGVuIChNYWNoTykKK307CisKK2VudW0gTUNBc3NlbWJsZXJGbGFnIHsKKyAgTUNBRl9TdWJzZWN0aW9uc1ZpYVN5bWJvbHMgIC8vLzwgLnN1YnNlY3Rpb25zX3ZpYV9zeW1ib2xzIChNYWNoTykKK307CisgIAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjhlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIuaApAQCAtMCwwICsxLDYwIEBACisvLz09PS0tIGxsdm0vTUMvTUNEaXNhc3NlbWJsZXIuaCAtIERpc2Fzc2VtYmxlciBpbnRlcmZhY2UgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBNQ0RJU0FTU0VNQkxFUl9ICisjZGVmaW5lIE1DRElTQVNTRU1CTEVSX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIAorY2xhc3MgTUNJbnN0OworY2xhc3MgTWVtb3J5T2JqZWN0OworY2xhc3MgcmF3X29zdHJlYW07CisgIAorc3RydWN0IEVESW5zdEluZm87CisKKy8vLyBNQ0Rpc2Fzc2VtYmxlciAtIFN1cGVyY2xhc3MgZm9yIGFsbCBkaXNhc3NlbWJsZXJzLiAgQ29uc3VtZXMgYSBtZW1vcnkgcmVnaW9uCisvLy8gICBhbmQgcHJvdmlkZXMgYW4gYXJyYXkgb2YgYXNzZW1ibHkgaW5zdHJ1Y3Rpb25zLgorY2xhc3MgTUNEaXNhc3NlbWJsZXIgeworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3IgICAgIC0gUGVyZm9ybXMgaW5pdGlhbCBzZXR1cCBmb3IgdGhlIGRpc2Fzc2VtYmxlci4KKyAgTUNEaXNhc3NlbWJsZXIoKSB7fQorICAKKyAgdmlydHVhbCB+TUNEaXNhc3NlbWJsZXIoKTsKKyAgCisgIC8vLyBnZXRJbnN0cnVjdGlvbiAgLSBSZXR1cm5zIHRoZSBkaXNhc3NlbWJseSBvZiBhIHNpbmdsZSBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gaW5zdHIgICAgLSBBbiBNQ0luc3QgdG8gcG9wdWxhdGUgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIAorICAvLy8gICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uCisgIC8vLyBAcGFyYW0gc2l6ZSAgICAgLSBBIHZhbHVlIHRvIHBvcHVsYXRlIHdpdGggdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uLCBvcgorICAvLy8gICAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGRlY29kZQorICAvLy8gICAgICAgICAgICAgICAgICAgYW4gaW52YWxpZCBpbnN0cnVjdGlvbi4KKyAgLy8vIEBwYXJhbSByZWdpb24gICAtIFRoZSBtZW1vcnkgb2JqZWN0IHRvIHVzZSBhcyBhIHNvdXJjZSBmb3IgbWFjaGluZSBjb2RlLgorICAvLy8gQHBhcmFtIGFkZHJlc3MgIC0gVGhlIGFkZHJlc3MsIGluIHRoZSBtZW1vcnkgc3BhY2Ugb2YgcmVnaW9uLCBvZiB0aGUgZmlyc3QKKyAgLy8vICAgICAgICAgICAgICAgICAgIGJ5dGUgb2YgdGhlIGluc3RydWN0aW9uLgorICAvLy8gQHBhcmFtIHZTdHJlYW0gIC0gVGhlIHN0cmVhbSB0byBwcmludCB3YXJuaW5ncyBhbmQgZGlhZ25vc3RpYyBtZXNzYWdlcyBvbi4KKyAgLy8vIEByZXR1cm4gICAgICAgICAtIFRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIHZhbGlkOyBmYWxzZSBvdGhlcndpc2UuCisgIHZpcnR1YWwgYm9vbCAgICAgICAgICBnZXRJbnN0cnVjdGlvbihNQ0luc3QmIGluc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlPYmplY3QgJnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmdlN0cmVhbSkgY29uc3QgPSAwOworCisgIC8vLyBnZXRFREluZm8gLSBSZXR1cm5zIHRoZSBlbmhhbmNlZCBpbnN0dXJjdGlvbiBpbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvCisgIC8vLyAgIHRoZSBkaXNhc3NlbWJsZXIuCisgIC8vLworICAvLy8gQHJldHVybiAgICAgICAgIC0gQW4gYXJyYXkgb2YgaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24sIHdpdGggb25lIGVudHJ5IGZvcgorICAvLy8gICAgICAgICAgICAgICAgICAgZWFjaCBNQ0luc3Qgb3Bjb2RlIHRoaXMgZGlzYXNzZW1ibGVyIHJldHVybnMuCisgIC8vLyAgICAgICAgICAgICAgICAgICBOVUxMIGlmIHRoZXJlIGlzIG5vIGluZm8gZm9yIHRoaXMgdGFyZ2V0LgorICB2aXJ0dWFsIEVESW5zdEluZm8gICAqZ2V0RURJbmZvKCkgY29uc3QgeyByZXR1cm4gKEVESW5zdEluZm8qKTA7IH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNEd2FyZi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DRHdhcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjFiNDJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DRHdhcmYuaApAQCAtMCwwICsxLDY2IEBACisvLz09PS0gTUNEd2FyZi5oIC0gTWFjaGluZSBDb2RlIER3YXJmIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1DRHdhcmZGaWxlIHRvIHN1cHBvcnQgdGhlIGR3YXJmCisvLyAuZmlsZSBkaXJlY3RpdmUuCisvLyBUT0RPOiBhZGQgdGhlIHN1cHBvcnQgbmVlZGVkIGZvciB0aGUgLmxvYyBkaXJlY3RpdmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DRFdBUkZfSAorI2RlZmluZSBMTFZNX01DX01DRFdBUkZfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTUNDb250ZXh0OworICBjbGFzcyByYXdfb3N0cmVhbTsKKworICAvLy8gTUNEd2FyZkZpbGUgLSBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgdGhlIG5hbWUgb2YgdGhlIGR3YXJmCisgIC8vLyAuZmlsZSBkaXJlY3RpdmUgYW5kIGl0cyBhc3NvY2lhdGVkIGR3YXJmIGZpbGUgbnVtYmVyIGluIHRoZSBNQyBmaWxlLAorICAvLy8gYW5kIE1DRHdhcmZGaWxlJ3MgYXJlIGNyZWF0ZWQgYW5kIHVuaXF1ZSdkIGJ5IHRoZSBNQ0NvbnRleHQgY2xhc3Mgd2hlcmUKKyAgLy8vIHRoZSBmaWxlIG51bWJlciBmb3IgZWFjaCBpcyBpdHMgaW5kZXggaW50byB0aGUgdmVjdG9yIG9mIER3YXJmRmlsZXMgKG5vdGUKKyAgLy8vIGluZGV4IDAgaXMgbm90IHVzZWQgYW5kIG5vdCBhIHZhbGlkIGR3YXJmIGZpbGUgbnVtYmVyKS4KKyAgY2xhc3MgTUNEd2FyZkZpbGUgeworICAgIC8vIE5hbWUgLSB0aGUgYmFzZSBuYW1lIG9mIHRoZSBmaWxlIHdpdGhvdXQgaXRzIGRpcmVjdG9yeSBwYXRoLgorICAgIC8vIFRoZSBTdHJpbmdSZWYgcmVmZXJlbmNlcyBtZW1vcnkgYWxsb2NhdGVkIGluIHRoZSBNQ0NvbnRleHQuCisgICAgU3RyaW5nUmVmIE5hbWU7CisKKyAgICAvLyBEaXJJbmRleCAtIHRoZSBpbmRleCBpbnRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yeSBuYW1lcyBmb3IgdGhpcyBmaWxlIG5hbWUuCisgICAgdW5zaWduZWQgRGlySW5kZXg7CisKKyAgcHJpdmF0ZTogIC8vIE1DQ29udGV4dCBjcmVhdGVzIGFuZCB1bmlxdWVzIHRoZXNlLgorICAgIGZyaWVuZCBjbGFzcyBNQ0NvbnRleHQ7CisgICAgTUNEd2FyZkZpbGUoU3RyaW5nUmVmIG5hbWUsIHVuc2lnbmVkIGRpckluZGV4KQorICAgICAgOiBOYW1lKG5hbWUpLCBEaXJJbmRleChkaXJJbmRleCkge30KKworICAgIE1DRHdhcmZGaWxlKGNvbnN0IE1DRHdhcmZGaWxlJik7ICAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBNQ0R3YXJmRmlsZSYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHB1YmxpYzoKKyAgICAvLy8gZ2V0TmFtZSAtIEdldCB0aGUgYmFzZSBuYW1lIG9mIHRoaXMgTUNEd2FyZkZpbGUuCisgICAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgICAvLy8gZ2V0RGlySW5kZXggLSBHZXQgdGhlIGRpckluZGV4IG9mIHRoaXMgTUNEd2FyZkZpbGUuCisgICAgdW5zaWduZWQgZ2V0RGlySW5kZXgoKSBjb25zdCB7IHJldHVybiBEaXJJbmRleDsgfQorCisKKyAgICAvLy8gcHJpbnQgLSBQcmludCB0aGUgdmFsdWUgdG8gdGhlIHN0cmVhbSBcYXJnIE9TLgorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBkdW1wIC0gUHJpbnQgdGhlIHZhbHVlIHRvIHN0ZGVyci4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ0R3YXJmRmlsZSAmRHdhcmZGaWxlKXsKKyAgICBEd2FyZkZpbGUucHJpbnQoT1MpOworICAgIHJldHVybiBPUzsKKyAgfQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNFeHByLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNFeHByLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5YjhmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0V4cHIuaApAQCAtMCwwICsxLDQwNCBAQAorLy89PT0tIE1DRXhwci5oIC0gQXNzZW1ibHkgTGV2ZWwgRXhwcmVzc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DRVhQUl9ICisjZGVmaW5lIExMVk1fTUNfTUNFWFBSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIE1DQXNtTGF5b3V0OworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBNQ1ZhbHVlOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBTdHJpbmdSZWY7CisKKy8vLyBNQ0V4cHIgLSBCYXNlIGNsYXNzIGZvciB0aGUgZnVsbCByYW5nZSBvZiBhc3NlbWJsZXIgZXhwcmVzc2lvbnMgd2hpY2ggYXJlCisvLy8gbmVlZGVkIGZvciBwYXJzaW5nLgorY2xhc3MgTUNFeHByIHsKK3B1YmxpYzoKKyAgZW51bSBFeHByS2luZCB7CisgICAgQmluYXJ5LCAgICAvLy88IEJpbmFyeSBleHByZXNzaW9ucy4KKyAgICBDb25zdGFudCwgIC8vLzwgQ29uc3RhbnQgZXhwcmVzc2lvbnMuCisgICAgU3ltYm9sUmVmLCAvLy88IFJlZmVyZW5jZXMgdG8gbGFiZWxzIGFuZCBhc3NpZ25lZCBleHByZXNzaW9ucy4KKyAgICBVbmFyeSwgICAgIC8vLzwgVW5hcnkgZXhwcmVzc2lvbnMuCisgICAgVGFyZ2V0ICAgICAvLy88IFRhcmdldCBzcGVjaWZpYyBleHByZXNzaW9uLgorICB9OworCitwcml2YXRlOgorICBFeHByS2luZCBLaW5kOworCisgIE1DRXhwcihjb25zdCBNQ0V4cHImKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBNQ0V4cHImKTsgLy8gRE8gTk9UIElNUExFTUVOVAorCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1DRXhwcihFeHByS2luZCBfS2luZCkgOiBLaW5kKF9LaW5kKSB7fQorCitwdWJsaWM6CisgIC8vLyBAbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgRXhwcktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFV0aWxpdHkgTWV0aG9kcworICAvLy8gQHsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgRXhwcmVzc2lvbiBFdmFsdWF0aW9uCisgIC8vLyBAeworCisgIC8vLyBFdmFsdWF0ZUFzQWJzb2x1dGUgLSBUcnkgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gdG8gYW4gYWJzb2x1dGUgdmFsdWUuCisgIC8vLworICAvLy8gQHBhcmFtIFJlcyAtIFRoZSBhYnNvbHV0ZSB2YWx1ZSwgaWYgZXZhbHVhdGlvbiBzdWNjZWVkcy4KKyAgLy8vIEBwYXJhbSBMYXlvdXQgLSBUaGUgYXNzZW1ibGVyIGxheW91dCBvYmplY3QgdG8gdXNlIGZvciBldmFsdWF0aW5nIHN5bWJvbAorICAvLy8gdmFsdWVzLiBJZiBub3QgZ2l2ZW4sIHRoZW4gb25seSBub24tc3ltYm9saWMgZXhwcmVzc2lvbnMgd2lsbCBiZQorICAvLy8gZXZhbHVhdGVkLgorICAvLy8gQHJlc3VsdCAtIFRydWUgb24gc3VjY2Vzcy4KKyAgYm9vbCBFdmFsdWF0ZUFzQWJzb2x1dGUoaW50NjRfdCAmUmVzLCBjb25zdCBNQ0FzbUxheW91dCAqTGF5b3V0ID0gMCkgY29uc3Q7CisKKyAgLy8vIEV2YWx1YXRlQXNSZWxvY2F0YWJsZSAtIFRyeSB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiB0byBhIHJlbG9jYXRhYmxlCisgIC8vLyB2YWx1ZSwgaS5lLiBhbiBleHByZXNzaW9uIG9mIHRoZSBmaXhlZCBmb3JtIChhIC0gYiArIGNvbnN0YW50KS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUmVzIC0gVGhlIHJlbG9jYXRhYmxlIHZhbHVlLCBpZiBldmFsdWF0aW9uIHN1Y2NlZWRzLgorICAvLy8gQHBhcmFtIExheW91dCAtIFRoZSBhc3NlbWJsZXIgbGF5b3V0IG9iamVjdCB0byB1c2UgZm9yIGV2YWx1YXRpbmcgdmFsdWVzLgorICAvLy8gQHJlc3VsdCAtIFRydWUgb24gc3VjY2Vzcy4KKyAgYm9vbCBFdmFsdWF0ZUFzUmVsb2NhdGFibGUoTUNWYWx1ZSAmUmVzLCBjb25zdCBNQ0FzbUxheW91dCAqTGF5b3V0ID0gMCkgY29uc3Q7CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0V4cHIgKikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNFeHByICZFKSB7CisgIEUucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vLy8gTUNDb25zdGFudEV4cHIgLSBSZXByZXNlbnQgYSBjb25zdGFudCBpbnRlZ2VyIGV4cHJlc3Npb24uCitjbGFzcyBNQ0NvbnN0YW50RXhwciA6IHB1YmxpYyBNQ0V4cHIgeworICBpbnQ2NF90IFZhbHVlOworCisgIGV4cGxpY2l0IE1DQ29uc3RhbnRFeHByKGludDY0X3QgX1ZhbHVlKQorICAgIDogTUNFeHByKE1DRXhwcjo6Q29uc3RhbnQpLCBWYWx1ZShfVmFsdWUpIHt9CisKK3B1YmxpYzoKKyAgLy8vIEBuYW1lIENvbnN0cnVjdGlvbgorICAvLy8gQHsKKworICBzdGF0aWMgY29uc3QgTUNDb25zdGFudEV4cHIgKkNyZWF0ZShpbnQ2NF90IFZhbHVlLCBNQ0NvbnRleHQgJkN0eCk7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0V4cHIgKkUpIHsKKyAgICByZXR1cm4gRS0+Z2V0S2luZCgpID09IE1DRXhwcjo6Q29uc3RhbnQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0NvbnN0YW50RXhwciAqKSB7IHJldHVybiB0cnVlOyB9Cit9OworCisvLy8gTUNTeW1ib2xSZWZFeHByIC0gUmVwcmVzZW50IGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGZyb20gaW5zaWRlIGFuCisvLy8gZXhwcmVzc2lvbi4KKy8vLworLy8vIEEgc3ltYm9sIHJlZmVyZW5jZSBpbiBhbiBleHByZXNzaW9uIG1heSBiZSBhIHVzZSBvZiBhIGxhYmVsLCBhIHVzZSBvZiBhbgorLy8vIGFzc2VtYmxlciB2YXJpYWJsZSAoZGVmaW5lZCBjb25zdGFudCksIG9yIGNvbnN0aXR1dGUgYW4gaW1wbGljaXQgZGVmaW5pdGlvbgorLy8vIG9mIHRoZSBzeW1ib2wgYXMgZXh0ZXJuYWwuCitjbGFzcyBNQ1N5bWJvbFJlZkV4cHIgOiBwdWJsaWMgTUNFeHByIHsKK3B1YmxpYzoKKyAgZW51bSBWYXJpYW50S2luZCB7CisgICAgVktfTm9uZSwKKyAgICBWS19JbnZhbGlkLAorCisgICAgVktfR09ULAorICAgIFZLX0dPVE9GRiwKKyAgICBWS19HT1RQQ1JFTCwKKyAgICBWS19HT1RUUE9GRiwKKyAgICBWS19JTkROVFBPRkYsCisgICAgVktfTlRQT0ZGLAorICAgIFZLX1BMVCwKKyAgICBWS19UTFNHRCwKKyAgICBWS19UUE9GRiwKKyAgICBWS19BUk1fSEkxNiwgLy8gVGhlIFJfQVJNX01PVlRfQUJTIHJlbG9jYXRpb24gKDp1cHBlcjE2OiBpbiB0aGUgYXNtIGZpbGUpCisgICAgVktfQVJNX0xPMTYsIC8vIFRoZSBSX0FSTV9NT1ZXX0FCU19OQyByZWxvY2F0aW9uICg6bG93ZXIxNjogaW4gdGhlIGFzbSBmaWxlKQorICAgIFZLX1RMVlAgLy8gTWFjaC1PIHRocmVhZCBsb2NhbCB2YXJpYWJsZSByZWxvY2F0aW9uCisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgc3ltYm9sIGJlaW5nIHJlZmVyZW5jZWQuCisgIGNvbnN0IE1DU3ltYm9sICpTeW1ib2w7CisKKyAgLy8vIFRoZSBzeW1ib2wgcmVmZXJlbmNlIG1vZGlmaWVyLgorICBjb25zdCBWYXJpYW50S2luZCBLaW5kOworCisgIGV4cGxpY2l0IE1DU3ltYm9sUmVmRXhwcihjb25zdCBNQ1N5bWJvbCAqX1N5bWJvbCwgVmFyaWFudEtpbmQgX0tpbmQpCisgICAgOiBNQ0V4cHIoTUNFeHByOjpTeW1ib2xSZWYpLCBTeW1ib2woX1N5bWJvbCksIEtpbmQoX0tpbmQpIHt9CisKK3B1YmxpYzoKKyAgLy8vIEBuYW1lIENvbnN0cnVjdGlvbgorICAvLy8gQHsKKworICBzdGF0aWMgY29uc3QgTUNTeW1ib2xSZWZFeHByICpDcmVhdGUoY29uc3QgTUNTeW1ib2wgKlN5bWJvbCwgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoU3ltYm9sLCBWS19Ob25lLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqQ3JlYXRlKGNvbnN0IE1DU3ltYm9sICpTeW1ib2wsIFZhcmlhbnRLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCk7CisgIHN0YXRpYyBjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKkNyZWF0ZShTdHJpbmdSZWYgTmFtZSwgVmFyaWFudEtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KTsKKyAgCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIGNvbnN0IE1DU3ltYm9sICZnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiAqU3ltYm9sOyB9CisKKyAgVmFyaWFudEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN0YXRpYyBVdGlsaXR5IEZ1bmN0aW9ucworICAvLy8gQHsKKworICBzdGF0aWMgU3RyaW5nUmVmIGdldFZhcmlhbnRLaW5kTmFtZShWYXJpYW50S2luZCBLaW5kKTsKKworICBzdGF0aWMgVmFyaWFudEtpbmQgZ2V0VmFyaWFudEtpbmRGb3JOYW1lKFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRXhwciAqRSkgeworICAgIHJldHVybiBFLT5nZXRLaW5kKCkgPT0gTUNFeHByOjpTeW1ib2xSZWY7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8vIE1DVW5hcnlFeHByIC0gVW5hcnkgYXNzZW1ibGVyIGV4cHJlc3Npb25zLgorY2xhc3MgTUNVbmFyeUV4cHIgOiBwdWJsaWMgTUNFeHByIHsKK3B1YmxpYzoKKyAgZW51bSBPcGNvZGUgeworICAgIExOb3QsICAvLy88IExvZ2ljYWwgbmVnYXRpb24uCisgICAgTWludXMsIC8vLzwgVW5hcnkgbWludXMuCisgICAgTm90LCAgIC8vLzwgQml0d2lzZSBuZWdhdGlvbi4KKyAgICBQbHVzICAgLy8vPCBVbmFyeSBwbHVzLgorICB9OworCitwcml2YXRlOgorICBPcGNvZGUgT3A7CisgIGNvbnN0IE1DRXhwciAqRXhwcjsKKworICBNQ1VuYXJ5RXhwcihPcGNvZGUgX09wLCBjb25zdCBNQ0V4cHIgKl9FeHByKQorICAgIDogTUNFeHByKE1DRXhwcjo6VW5hcnkpLCBPcChfT3ApLCBFeHByKF9FeHByKSB7fQorCitwdWJsaWM6CisgIC8vLyBAbmFtZSBDb25zdHJ1Y3Rpb24KKyAgLy8vIEB7CisKKyAgc3RhdGljIGNvbnN0IE1DVW5hcnlFeHByICpDcmVhdGUoT3Bjb2RlIE9wLCBjb25zdCBNQ0V4cHIgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KTsKKyAgc3RhdGljIGNvbnN0IE1DVW5hcnlFeHByICpDcmVhdGVMTm90KGNvbnN0IE1DRXhwciAqRXhwciwgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gQ3JlYXRlKExOb3QsIEV4cHIsIEN0eCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IE1DVW5hcnlFeHByICpDcmVhdGVNaW51cyhjb25zdCBNQ0V4cHIgKkV4cHIsIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShNaW51cywgRXhwciwgQ3R4KTsKKyAgfQorICBzdGF0aWMgY29uc3QgTUNVbmFyeUV4cHIgKkNyZWF0ZU5vdChjb25zdCBNQ0V4cHIgKkV4cHIsIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShOb3QsIEV4cHIsIEN0eCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IE1DVW5hcnlFeHByICpDcmVhdGVQbHVzKGNvbnN0IE1DRXhwciAqRXhwciwgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gQ3JlYXRlKFBsdXMsIEV4cHIsIEN0eCk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICAvLy8gZ2V0T3Bjb2RlIC0gR2V0IHRoZSBraW5kIG9mIHRoaXMgdW5hcnkgZXhwcmVzc2lvbi4KKyAgT3Bjb2RlIGdldE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIE9wOyB9CisKKyAgLy8vIGdldFN1YkV4cHIgLSBHZXQgdGhlIGNoaWxkIG9mIHRoaXMgdW5hcnkgZXhwcmVzc2lvbi4KKyAgY29uc3QgTUNFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gRXhwcjsgfQorCisgIC8vLyBAfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNFeHByICpFKSB7CisgICAgcmV0dXJuIEUtPmdldEtpbmQoKSA9PSBNQ0V4cHI6OlVuYXJ5OworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNVbmFyeUV4cHIgKikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8vIE1DQmluYXJ5RXhwciAtIEJpbmFyeSBhc3NlbWJsZXIgZXhwcmVzc2lvbnMuCitjbGFzcyBNQ0JpbmFyeUV4cHIgOiBwdWJsaWMgTUNFeHByIHsKK3B1YmxpYzoKKyAgZW51bSBPcGNvZGUgeworICAgIEFkZCwgIC8vLzwgQWRkaXRpb24uCisgICAgQW5kLCAgLy8vPCBCaXR3aXNlIGFuZC4KKyAgICBEaXYsICAvLy88IFNpZ25lZCBkaXZpc2lvbi4KKyAgICBFUSwgICAvLy88IEVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAgR1QsICAgLy8vPCBTaWduZWQgZ3JlYXRlciB0aGFuIGNvbXBhcmlzb24gKHJlc3VsdCBpcyBlaXRoZXIgMCBvciBzb21lCisgICAgICAgICAgLy8vPCB0YXJnZXQtc3BlY2lmaWMgbm9uLXplcm8gdmFsdWUpCisgICAgR1RFLCAgLy8vPCBTaWduZWQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKHJlc3VsdCBpcyBlaXRoZXIgMCBvcgorICAgICAgICAgIC8vLzwgc29tZSB0YXJnZXQtc3BlY2lmaWMgbm9uLXplcm8gdmFsdWUpLgorICAgIExBbmQsIC8vLzwgTG9naWNhbCBhbmQuCisgICAgTE9yLCAgLy8vPCBMb2dpY2FsIG9yLgorICAgIExULCAgIC8vLzwgU2lnbmVkIGxlc3MgdGhhbiBjb21wYXJpc29uIChyZXN1bHQgaXMgZWl0aGVyIDAgb3IKKyAgICAgICAgICAvLy88IHNvbWUgdGFyZ2V0LXNwZWNpZmljIG5vbi16ZXJvIHZhbHVlKS4KKyAgICBMVEUsICAvLy88IFNpZ25lZCBsZXNzIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAocmVzdWx0IGlzIGVpdGhlciAwIG9yCisgICAgICAgICAgLy8vPCBzb21lIHRhcmdldC1zcGVjaWZpYyBub24temVybyB2YWx1ZSkuCisgICAgTW9kLCAgLy8vPCBTaWduZWQgcmVtYWluZGVyLgorICAgIE11bCwgIC8vLzwgTXVsdGlwbGljYXRpb24uCisgICAgTkUsICAgLy8vPCBJbmVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAgT3IsICAgLy8vPCBCaXR3aXNlIG9yLgorICAgIFNobCwgIC8vLzwgU2hpZnQgbGVmdC4KKyAgICBTaHIsICAvLy88IFNoaWZ0IHJpZ2h0IChhcml0aG1ldGljIG9yIGxvZ2ljYWwsIGRlcGVuZGluZyBvbiB0YXJnZXQpCisgICAgU3ViLCAgLy8vPCBTdWJ0cmFjdGlvbi4KKyAgICBYb3IgICAvLy88IEJpdHdpc2UgZXhjbHVzaXZlIG9yLgorICB9OworCitwcml2YXRlOgorICBPcGNvZGUgT3A7CisgIGNvbnN0IE1DRXhwciAqTEhTLCAqUkhTOworCisgIE1DQmluYXJ5RXhwcihPcGNvZGUgX09wLCBjb25zdCBNQ0V4cHIgKl9MSFMsIGNvbnN0IE1DRXhwciAqX1JIUykKKyAgICA6IE1DRXhwcihNQ0V4cHI6OkJpbmFyeSksIE9wKF9PcCksIExIUyhfTEhTKSwgUkhTKF9SSFMpIHt9CisKK3B1YmxpYzoKKyAgLy8vIEBuYW1lIENvbnN0cnVjdGlvbgorICAvLy8gQHsKKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpDcmVhdGUoT3Bjb2RlIE9wLCBjb25zdCBNQ0V4cHIgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqUkhTLCBNQ0NvbnRleHQgJkN0eCk7CisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKkNyZWF0ZUFkZChjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBDcmVhdGUoQWRkLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpDcmVhdGVBbmQoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gQ3JlYXRlKEFuZCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqQ3JlYXRlRGl2KGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShEaXYsIExIUywgUkhTLCBDdHgpOworICB9CisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKkNyZWF0ZUVRKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gQ3JlYXRlKEVRLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpDcmVhdGVHVChjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShHVCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqQ3JlYXRlR1RFKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShHVEUsIExIUywgUkhTLCBDdHgpOworICB9CisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKkNyZWF0ZUxBbmQoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShMQW5kLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpDcmVhdGVMT3IoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gQ3JlYXRlKExPciwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqQ3JlYXRlTFQoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBDcmVhdGUoTFQsIExIUywgUkhTLCBDdHgpOworICB9CisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKkNyZWF0ZUxURShjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBDcmVhdGUoTFRFLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpDcmVhdGVNb2QoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gQ3JlYXRlKE1vZCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqQ3JlYXRlTXVsKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShNdWwsIExIUywgUkhTLCBDdHgpOworICB9CisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKkNyZWF0ZU5FKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gQ3JlYXRlKE5FLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpDcmVhdGVPcihjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShPciwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqQ3JlYXRlU2hsKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShTaGwsIExIUywgUkhTLCBDdHgpOworICB9CisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKkNyZWF0ZVNocihjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBDcmVhdGUoU2hyLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpDcmVhdGVTdWIoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gQ3JlYXRlKFN1YiwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqQ3JlYXRlWG9yKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIENyZWF0ZShYb3IsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgLy8vIGdldE9wY29kZSAtIEdldCB0aGUga2luZCBvZiB0aGlzIGJpbmFyeSBleHByZXNzaW9uLgorICBPcGNvZGUgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gT3A7IH0KKworICAvLy8gZ2V0TEhTIC0gR2V0IHRoZSBsZWZ0LWhhbmQgc2lkZSBleHByZXNzaW9uIG9mIHRoZSBiaW5hcnkgb3BlcmF0b3IuCisgIGNvbnN0IE1DRXhwciAqZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gTEhTOyB9CisKKyAgLy8vIGdldFJIUyAtIEdldCB0aGUgcmlnaHQtaGFuZCBzaWRlIGV4cHJlc3Npb24gb2YgdGhlIGJpbmFyeSBvcGVyYXRvci4KKyAgY29uc3QgTUNFeHByICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRXhwciAqRSkgeworICAgIHJldHVybiBFLT5nZXRLaW5kKCkgPT0gTUNFeHByOjpCaW5hcnk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0JpbmFyeUV4cHIgKikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8vIE1DVGFyZ2V0RXhwciAtIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHBvaW50IGZvciB0YXJnZXQtc3BlY2lmaWMgTUNFeHByCisvLy8gc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQuCisvLy8KKy8vLyBOT1RFOiBBbGwgc3ViY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSB0cml2aWFsIGRlc3RydWN0b3JzIGJlY2F1c2UKKy8vLyBNQ0V4cHJzIGFyZSBidW1wIHBvaW50ZXIgYWxsb2NhdGVkIGFuZCBub3QgZGVzdHJ1Y3RlZC4KK2NsYXNzIE1DVGFyZ2V0RXhwciA6IHB1YmxpYyBNQ0V4cHIgeworICB2aXJ0dWFsIHZvaWQgQW5jaG9yKCk7Citwcm90ZWN0ZWQ6CisgIE1DVGFyZ2V0RXhwcigpIDogTUNFeHByKFRhcmdldCkge30KKyAgdmlydHVhbCB+TUNUYXJnZXRFeHByKCkge30KK3B1YmxpYzoKKworICB2aXJ0dWFsIHZvaWQgUHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUykgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgRXZhbHVhdGVBc1JlbG9jYXRhYmxlSW1wbChNQ1ZhbHVlICZSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICpMYXlvdXQpIGNvbnN0ID0gMDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNFeHByICpFKSB7CisgICAgcmV0dXJuIEUtPmdldEtpbmQoKSA9PSBNQ0V4cHI6OlRhcmdldDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DVGFyZ2V0RXhwciAqKSB7IHJldHVybiB0cnVlOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0ZpeHVwLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNGaXh1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDRjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNGaXh1cC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0ZpeHVwLmggLSBJbnN0cnVjdGlvbiBSZWxvY2F0aW9uIGFuZCBQYXRjaGluZyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0ZJWFVQX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0ZJWFVQX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DRXhwcjsKKworLy8vIE1DRml4dXBLaW5kIC0gRXh0ZW5zaWJsZSBlbnVtZXJhdGlvbiB0byByZXByZXNlbnQgdGhlIHR5cGUgb2YgYSBmaXh1cC4KK2VudW0gTUNGaXh1cEtpbmQgeworICBGS19EYXRhXzEgPSAwLCAvLy88IEEgb25lLWJ5dGUgZml4dXAuCisgIEZLX0RhdGFfMiwgICAgIC8vLzwgQSB0d28tYnl0ZSBmaXh1cC4KKyAgRktfRGF0YV80LCAgICAgLy8vPCBBIGZvdXItYnl0ZSBmaXh1cC4KKyAgRktfRGF0YV84LCAgICAgLy8vPCBBIGVpZ2h0LWJ5dGUgZml4dXAuCisKKyAgRmlyc3RUYXJnZXRGaXh1cEtpbmQgPSAxMjgsCisKKyAgLy8gTGltaXQgcmFuZ2Ugb2YgdGFyZ2V0IGZpeHVwcywgaW4gY2FzZSB3ZSB3YW50IHRvIHBhY2sgbW9yZSBlZmZpY2llbnRseQorICAvLyBsYXRlci4KKyAgTWF4VGFyZ2V0Rml4dXBLaW5kID0gKDEgPDwgOCkKK307CisKKy8vLyBNQ0ZpeHVwIC0gRW5jb2RlIGluZm9ybWF0aW9uIG9uIGEgc2luZ2xlIG9wZXJhdGlvbiB0byBwZXJmb3JtIG9uIGEgYnl0ZQorLy8vIHNlcXVlbmNlIChlLmcuLCBhbiBlbmNvZGVkIGluc3RydWN0aW9uKSB3aGljaCByZXF1aXJlcyBhc3NlbWJsZS0gb3IgcnVuLQorLy8vIHRpbWUgcGF0Y2hpbmcuCisvLy8KKy8vLyBGaXh1cHMgYXJlIHVzZWQgYW55IHRpbWUgdGhlIHRhcmdldCBpbnN0cnVjdGlvbiBlbmNvZGVyIG5lZWRzIHRvIHJlcHJlc2VudAorLy8vIHNvbWUgdmFsdWUgaW4gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbm90IHlldCBjb25jcmV0ZS4gVGhlIGVuY29kZXIgd2lsbAorLy8vIGVuY29kZSB0aGUgaW5zdHJ1Y3Rpb24gYXNzdW1pbmcgdGhlIHZhbHVlIGlzIDAsIGFuZCBlbWl0IGEgZml4dXAgd2hpY2gKKy8vLyBjb21tdW5pY2F0ZXMgdG8gdGhlIGFzc2VtYmxlciBiYWNrZW5kIGhvdyBpdCBzaG91bGQgcmV3cml0ZSB0aGUgZW5jb2RlZAorLy8vIHZhbHVlLgorLy8vCisvLy8gRHVyaW5nIHRoZSBwcm9jZXNzIG9mIHJlbGF4YXRpb24sIHRoZSBhc3NlbWJsZXIgd2lsbCBhcHBseSBmaXh1cHMgYXMKKy8vLyBzeW1ib2xpYyB2YWx1ZXMgYmVjb21lIGNvbmNyZXRlLiBXaGVuIHJlbGF4YXRpb24gaXMgY29tcGxldGUsIGFueSByZW1haW5pbmcKKy8vLyBmaXh1cHMgYmVjb21lIHJlbG9jYXRpb25zIGluIHRoZSBvYmplY3QgZmlsZSAob3IgZXJyb3JzLCBpZiB0aGUgZml4dXAgY2Fubm90CisvLy8gYmUgZW5jb2RlZCBvbiB0aGUgdGFyZ2V0KS4KK2NsYXNzIE1DRml4dXAgeworICAvLy8gVGhlIHZhbHVlIHRvIHB1dCBpbnRvIHRoZSBmaXh1cCBsb2NhdGlvbi4gVGhlIGV4YWN0IGludGVycHJldGF0aW9uIG9mIHRoZQorICAvLy8gZXhwcmVzc2lvbiBpcyB0YXJnZXQgZGVwZW5kZW50LCB1c3VhbGx5IGl0IHdpbGwgYmUgb25lIG9mIHRoZSBvcGVyYW5kcyB0bworICAvLy8gYW4gaW5zdHJ1Y3Rpb24gb3IgYW4gYXNzZW1ibGVyIGRpcmVjdGl2ZS4KKyAgY29uc3QgTUNFeHByICpWYWx1ZTsKKworICAvLy8gVGhlIGJ5dGUgaW5kZXggb2Ygc3RhcnQgb2YgdGhlIHJlbG9jYXRpb24gaW5zaWRlIHRoZSBlbmNvZGVkIGluc3RydWN0aW9uLgorICB1aW50MzJfdCBPZmZzZXQ7CisKKyAgLy8vIFRoZSB0YXJnZXQgZGVwZW5kZW50IGtpbmQgb2YgZml4dXAgaXRlbSB0aGlzIGlzLiBUaGUga2luZCBpcyB1c2VkIHRvCisgIC8vLyBkZXRlcm1pbmUgaG93IHRoZSBvcGVyYW5kIHZhbHVlIHNob3VsZCBiZSBlbmNvZGVkIGludG8gdGhlIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBLaW5kOworCitwdWJsaWM6CisgIHN0YXRpYyBNQ0ZpeHVwIENyZWF0ZSh1aW50MzJfdCBPZmZzZXQsIGNvbnN0IE1DRXhwciAqVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBNQ0ZpeHVwS2luZCBLaW5kKSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKEtpbmQpIDwgTWF4VGFyZ2V0Rml4dXBLaW5kICYmICJLaW5kIG91dCBvZiByYW5nZSEiKTsKKyAgICBNQ0ZpeHVwIEZJOworICAgIEZJLlZhbHVlID0gVmFsdWU7CisgICAgRkkuT2Zmc2V0ID0gT2Zmc2V0OworICAgIEZJLktpbmQgPSB1bnNpZ25lZChLaW5kKTsKKyAgICByZXR1cm4gRkk7CisgIH0KKworICBNQ0ZpeHVwS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gTUNGaXh1cEtpbmQoS2luZCk7IH0KKworICB1aW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKyAgdm9pZCBzZXRPZmZzZXQodWludDMyX3QgVmFsdWUpIHsgT2Zmc2V0ID0gVmFsdWU7IH0KKworICBjb25zdCBNQ0V4cHIgKmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICAvLy8gZ2V0S2luZEZvclNpemUgLSBSZXR1cm4gdGhlIGdlbmVyaWMgZml4dXAga2luZCBmb3IgYSB2YWx1ZSB3aXRoIHRoZSBnaXZlbgorICAvLy8gc2l6ZS4gSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBhbiB1bnN1cHBvcnRlZCBzaXplLgorICBzdGF0aWMgTUNGaXh1cEtpbmQgZ2V0S2luZEZvclNpemUodW5zaWduZWQgU2l6ZSkgeworICAgIHN3aXRjaCAoU2l6ZSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJJbnZhbGlkIGdlbmVyaWMgZml4dXAgc2l6ZSEiKTsKKyAgICBjYXNlIDE6IHJldHVybiBGS19EYXRhXzE7CisgICAgY2FzZSAyOiByZXR1cm4gRktfRGF0YV8yOworICAgIGNhc2UgNDogcmV0dXJuIEZLX0RhdGFfNDsKKyAgICBjYXNlIDg6IHJldHVybiBGS19EYXRhXzg7CisgICAgfQorICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3QuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzYzMGZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DSW5zdC5oCkBAIC0wLDAgKzEsMTQyIEBACisvLz09PS0tIGxsdm0vTUMvTUNJbnN0LmggLSBNQ0luc3QgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1DSW5zdCBhbmQgTUNPcGVyYW5kIGNsYXNzZXMsIHdoaWNoCisvLyBpcyB0aGUgYmFzaWMgcmVwcmVzZW50YXRpb24gdXNlZCB0byByZXByZXNlbnQgbG93LWxldmVsIG1hY2hpbmUgY29kZQorLy8gaW5zdHJ1Y3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0lOU1RfSAorI2RlZmluZSBMTFZNX01DX01DSU5TVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIE1DSW5zdFByaW50ZXI7CitjbGFzcyBNQ0V4cHI7CisKKy8vLyBNQ09wZXJhbmQgLSBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgb3BlcmFuZHMgb2YgdGhlIE1DSW5zdCBjbGFzcy4KKy8vLyBUaGlzIGlzIGEgc2ltcGxlIGRpc2NyaW1pbmF0ZWQgdW5pb24uCitjbGFzcyBNQ09wZXJhbmQgeworICBlbnVtIE1hY2hpbmVPcGVyYW5kVHlwZSB7CisgICAga0ludmFsaWQsICAgICAgICAgICAgICAgICAvLy88IFVuaW5pdGlhbGl6ZWQuCisgICAga1JlZ2lzdGVyLCAgICAgICAgICAgICAgICAvLy88IFJlZ2lzdGVyIG9wZXJhbmQuCisgICAga0ltbWVkaWF0ZSwgICAgICAgICAgICAgICAvLy88IEltbWVkaWF0ZSBvcGVyYW5kLgorICAgIGtFeHByICAgICAgICAgICAgICAgICAgICAgLy8vPCBSZWxvY2F0YWJsZSBpbW1lZGlhdGUgb3BlcmFuZC4KKyAgfTsKKyAgdW5zaWduZWQgY2hhciBLaW5kOworICAKKyAgdW5pb24geworICAgIHVuc2lnbmVkIFJlZ1ZhbDsKKyAgICBpbnQ2NF90IEltbVZhbDsKKyAgICBjb25zdCBNQ0V4cHIgKkV4cHJWYWw7CisgIH07CitwdWJsaWM6CisgIAorICBNQ09wZXJhbmQoKSA6IEtpbmQoa0ludmFsaWQpIHt9CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gS2luZCAhPSBrSW52YWxpZDsgfQorICBib29sIGlzUmVnKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBrUmVnaXN0ZXI7IH0KKyAgYm9vbCBpc0ltbSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0ga0ltbWVkaWF0ZTsgfQorICBib29sIGlzRXhwcigpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0ga0V4cHI7IH0KKyAgCisgIC8vLyBnZXRSZWcgLSBSZXR1cm5zIHRoZSByZWdpc3RlciBudW1iZXIuCisgIHVuc2lnbmVkIGdldFJlZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiVGhpcyBpcyBub3QgYSByZWdpc3RlciBvcGVyYW5kISIpOworICAgIHJldHVybiBSZWdWYWw7CisgIH0KKworICAvLy8gc2V0UmVnIC0gU2V0IHRoZSByZWdpc3RlciBudW1iZXIuCisgIHZvaWQgc2V0UmVnKHVuc2lnbmVkIFJlZykgeworICAgIGFzc2VydChpc1JlZygpICYmICJUaGlzIGlzIG5vdCBhIHJlZ2lzdGVyIG9wZXJhbmQhIik7CisgICAgUmVnVmFsID0gUmVnOworICB9CisgIAorICBpbnQ2NF90IGdldEltbSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbW0oKSAmJiAiVGhpcyBpcyBub3QgYW4gaW1tZWRpYXRlIik7CisgICAgcmV0dXJuIEltbVZhbDsKKyAgfQorICB2b2lkIHNldEltbShpbnQ2NF90IFZhbCkgeworICAgIGFzc2VydChpc0ltbSgpICYmICJUaGlzIGlzIG5vdCBhbiBpbW1lZGlhdGUiKTsKKyAgICBJbW1WYWwgPSBWYWw7CisgIH0KKyAgCisgIGNvbnN0IE1DRXhwciAqZ2V0RXhwcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNFeHByKCkgJiYgIlRoaXMgaXMgbm90IGFuIGV4cHJlc3Npb24iKTsKKyAgICByZXR1cm4gRXhwclZhbDsKKyAgfQorICB2b2lkIHNldEV4cHIoY29uc3QgTUNFeHByICpWYWwpIHsKKyAgICBhc3NlcnQoaXNFeHByKCkgJiYgIlRoaXMgaXMgbm90IGFuIGV4cHJlc3Npb24iKTsKKyAgICBFeHByVmFsID0gVmFsOworICB9CisgIAorICBzdGF0aWMgTUNPcGVyYW5kIENyZWF0ZVJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgICBNQ09wZXJhbmQgT3A7CisgICAgT3AuS2luZCA9IGtSZWdpc3RlcjsKKyAgICBPcC5SZWdWYWwgPSBSZWc7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNQ09wZXJhbmQgQ3JlYXRlSW1tKGludDY0X3QgVmFsKSB7CisgICAgTUNPcGVyYW5kIE9wOworICAgIE9wLktpbmQgPSBrSW1tZWRpYXRlOworICAgIE9wLkltbVZhbCA9IFZhbDsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgc3RhdGljIE1DT3BlcmFuZCBDcmVhdGVFeHByKGNvbnN0IE1DRXhwciAqVmFsKSB7CisgICAgTUNPcGVyYW5kIE9wOworICAgIE9wLktpbmQgPSBrRXhwcjsKKyAgICBPcC5FeHByVmFsID0gVmFsOworICAgIHJldHVybiBPcDsKKyAgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ0FzbUluZm8gKk1BSSkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworICAKKy8vLyBNQ0luc3QgLSBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBzaW5nbGUgbG93LWxldmVsIG1hY2hpbmUKKy8vLyBpbnN0cnVjdGlvbi4gCitjbGFzcyBNQ0luc3QgeworICB1bnNpZ25lZCBPcGNvZGU7CisgIFNtYWxsVmVjdG9yPE1DT3BlcmFuZCwgOD4gT3BlcmFuZHM7CitwdWJsaWM6CisgIE1DSW5zdCgpIDogT3Bjb2RlKDApIHt9CisgIAorICB2b2lkIHNldE9wY29kZSh1bnNpZ25lZCBPcCkgeyBPcGNvZGUgPSBPcDsgfQorICAKKyAgdW5zaWduZWQgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gT3Bjb2RlOyB9CisKKyAgY29uc3QgTUNPcGVyYW5kICZnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRzW2ldOyB9CisgIE1DT3BlcmFuZCAmZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSB7IHJldHVybiBPcGVyYW5kc1tpXTsgfQorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRzLnNpemUoKTsgfQorICAKKyAgdm9pZCBhZGRPcGVyYW5kKGNvbnN0IE1DT3BlcmFuZCAmT3ApIHsKKyAgICBPcGVyYW5kcy5wdXNoX2JhY2soT3ApOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DQXNtSW5mbyAqTUFJKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEdW1wIHRoZSBNQ0luc3QgYXMgcHJldHRpbHkgYXMgcG9zc2libGUgdXNpbmcgdGhlIGFkZGl0aW9uYWwgTUMKKyAgLy8vIHN0cnVjdHVyZXMsIGlmIGdpdmVuLiBPcGVyYXRvcnMgYXJlIHNlcGFyYXRlZCBieSB0aGUgXGFyZyBTZXBhcmF0b3IKKyAgLy8vIHN0cmluZy4KKyAgdm9pZCBkdW1wX3ByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DQXNtSW5mbyAqTUFJID0gMCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RQcmludGVyICpQcmludGVyID0gMCwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VwYXJhdG9yID0gIiAiKSBjb25zdDsKK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0UHJpbnRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DSW5zdFByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODM5YTgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DSW5zdFByaW50ZXIuaApAQCAtMCwwICsxLDQ4IEBACisvLz09PS0tIE1DSW5zdFByaW50ZXIuaCAtIENvbnZlcnQgYW4gTUNJbnN0IHRvIHRhcmdldCBhc3NlbWJseSBzeW50YXggLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNJTlNUUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNJTlNUUFJJTlRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgU3RyaW5nUmVmOworCisvLy8gTUNJbnN0UHJpbnRlciAtIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgYSB0YXJnZXQgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJpbnRlcgorLy8vIHRoYXQgY29udmVydHMgYW4gTUNJbnN0IHRvIHZhbGlkIHRhcmdldCBhc3NlbWJseSBzeW50YXguCitjbGFzcyBNQ0luc3RQcmludGVyIHsKK3Byb3RlY3RlZDoKKyAgLy8vIENvbW1lbnRTdHJlYW0gLSBhIHN0cmVhbSB0aGF0IGNvbW1lbnRzIGNhbiBiZSBlbWl0dGVkIHRvIGlmIGRlc2lyZWQuCisgIC8vLyBFYWNoIGNvbW1lbnQgbXVzdCBlbmQgd2l0aCBhIG5ld2xpbmUuICBUaGlzIHdpbGwgYmUgbnVsbCBpZiB2ZXJib3NlCisgIC8vLyBhc3NlbWJseSBlbWlzc2lvbiBpcyBkaXNhYmxlLgorICByYXdfb3N0cmVhbSAqQ29tbWVudFN0cmVhbTsKKyAgY29uc3QgTUNBc21JbmZvICZNQUk7CitwdWJsaWM6CisgIE1DSW5zdFByaW50ZXIoY29uc3QgTUNBc21JbmZvICZtYWkpCisgICAgOiBDb21tZW50U3RyZWFtKDApLCBNQUkobWFpKSB7fQorICAKKyAgdmlydHVhbCB+TUNJbnN0UHJpbnRlcigpOworCisgIC8vLyBzZXRDb21tZW50U3RyZWFtIC0gU3BlY2lmeSBhIHN0cmVhbSB0byBlbWl0IGNvbW1lbnRzIHRvLgorICB2b2lkIHNldENvbW1lbnRTdHJlYW0ocmF3X29zdHJlYW0gJk9TKSB7IENvbW1lbnRTdHJlYW0gPSAmT1M7IH0KKyAgCisgIC8vLyBwcmludEluc3QgLSBQcmludCB0aGUgc3BlY2lmaWVkIE1DSW5zdCB0byB0aGUgc3BlY2lmaWVkIHJhd19vc3RyZWFtLgorICAvLy8KKyAgdmlydHVhbCB2b2lkIHByaW50SW5zdChjb25zdCBNQ0luc3QgKk1JLCByYXdfb3N0cmVhbSAmT1MpID0gMDsKKyAgCisgIC8vLyBnZXRPcGNvZGVOYW1lIC0gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgb3Bjb2RlIGVudW0gKGUuZy4KKyAgLy8vICJNT1YzMnJpIikgb3IgZW1wdHkgaWYgd2UgY2FuJ3QgcmVzb2x2ZSBpdC4KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0T3Bjb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworfTsKKyAgCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DTGFiZWwuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0xhYmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3NTIwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ0xhYmVsLmgKQEAgLTAsMCArMSw1NiBAQAorLy89PT0tIE1DTGFiZWwuaCAtIE1hY2hpbmUgQ29kZSBEaXJlY3Rpb25hbCBMb2NhbCBMYWJlbHMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNQ0xhYmVsIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0xBQkVMX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0xBQkVMX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNQ0NvbnRleHQ7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIC8vLyBNQ0xhYmVsIC0gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgbGFiZWwgbmFtZSBpbiB0aGUgTUMgZmlsZSwKKyAgLy8vIGFuZCBNQ0xhYmVsIGFyZSBjcmVhdGVkIGFuZCB1bmlxdWUnZCBieSB0aGUgTUNDb250ZXh0IGNsYXNzLiAgTUNMYWJlbAorICAvLy8gc2hvdWxkIG9ubHkgYmUgY29uc3RydWN0ZWQgZm9yIHZhbGlkIGluc3RhbmNlcyBpbiB0aGUgb2JqZWN0IGZpbGUuCisgIGNsYXNzIE1DTGFiZWwgeworICAgIC8vIEluc3RhbmNlIC0gdGhlIGluc3RhbmNlIG51bWJlciBvZiB0aGlzIERpcmVjdGlvbmFsIExvY2FsIExhYmVsCisgICAgdW5zaWduZWQgSW5zdGFuY2U7CisKKyAgcHJpdmF0ZTogIC8vIE1DQ29udGV4dCBjcmVhdGVzIGFuZCB1bmlxdWVzIHRoZXNlLgorICAgIGZyaWVuZCBjbGFzcyBNQ0NvbnRleHQ7CisgICAgTUNMYWJlbCh1bnNpZ25lZCBpbnN0YW5jZSkKKyAgICAgIDogSW5zdGFuY2UoaW5zdGFuY2UpIHt9CisKKyAgICBNQ0xhYmVsKGNvbnN0IE1DTGFiZWwmKTsgICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1DTGFiZWwmKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICBwdWJsaWM6CisgICAgLy8vIGdldEluc3RhbmNlIC0gR2V0IHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoaXMgRGlyZWN0aW9uYWwgTG9jYWwgTGFiZWwuCisgICAgdW5zaWduZWQgZ2V0SW5zdGFuY2UoKSBjb25zdCB7IHJldHVybiBJbnN0YW5jZTsgfQorCisgICAgLy8vIGluY0luc3RhbmNlIC0gSW5jcmVtZW50IHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoaXMgRGlyZWN0aW9uYWwgTG9jYWwKKyAgICAvLy8gTGFiZWwuCisgICAgdW5zaWduZWQgaW5jSW5zdGFuY2UoKSB7IHJldHVybiArK0luc3RhbmNlOyB9CisKKyAgICAvLy8gcHJpbnQgLSBQcmludCB0aGUgdmFsdWUgdG8gdGhlIHN0cmVhbSBcYXJnIE9TLgorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBkdW1wIC0gUHJpbnQgdGhlIHZhbHVlIHRvIHN0ZGVyci4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ0xhYmVsICZMYWJlbCkgeworICAgIExhYmVsLnByaW50KE9TKTsKKyAgICByZXR1cm4gT1M7CisgIH0KK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DTWFjaE9TeW1ib2xGbGFncy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DTWFjaE9TeW1ib2xGbGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzhjODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNNYWNoT1N5bWJvbEZsYWdzLmgKQEAgLTAsMCArMSw0NCBAQAorLy89PT0tIE1DTWFjaE9TeW1ib2xGbGFncy5oIC0gTWFjaE8gU3ltYm9sIEZsYWdzIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFN5bWJvbEZsYWdzIHVzZWQgZm9yIHRoZSBNYWNoTyB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DTUFDSE9TWU1CT0xGTEFHU19ICisjZGVmaW5lIExMVk1fTUNfTUNNQUNIT1NZTUJPTEZMQUdTX0gKKworLy8gVGhlc2UgZmxhZ3MgYXJlIG1vc3RseSB1c2VkIGluIE1DTWFjaE9TdHJlYW1lci5jcHAgYnV0IGFsc28gbmVlZGVkIGluCisvLyBNYWNoT2JqZWN0V3JpdGVyLmNwcCB0byB0ZXN0IGZvciBXZWFrIERlZmluaXRpb25zIG9mIHN5bWJvbHMgdG8gZW1pdAorLy8gdGhlIGNvcnJlY3QgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKworbmFtZXNwYWNlIGxsdm0geworICAvLy8gU3ltYm9sRmxhZ3MgLSBXZSBzdG9yZSB0aGUgdmFsdWUgZm9yIHRoZSAnZGVzYycgc3ltYm9sIGZpZWxkIGluIHRoZSBsb3dlc3QKKyAgLy8vIDE2IGJpdHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZmxhZ3MuCisgIGVudW0gU3ltYm9sRmxhZ3MgeyAvLyBTZWUgPG1hY2gtby9ubGlzdC5oPi4KKyAgICBTRl9EZXNjRmxhZ3NNYXNrICAgICAgICAgICAgICAgICAgICAgICAgPSAweEZGRkYsCisKKyAgICAvLyBSZWZlcmVuY2UgdHlwZSBmbGFncy4KKyAgICBTRl9SZWZlcmVuY2VUeXBlTWFzayAgICAgICAgICAgICAgICAgICAgPSAweDAwMDcsCisgICAgU0ZfUmVmZXJlbmNlVHlwZVVuZGVmaW5lZE5vbkxhenkgICAgICAgID0gMHgwMDAwLAorICAgIFNGX1JlZmVyZW5jZVR5cGVVbmRlZmluZWRMYXp5ICAgICAgICAgICA9IDB4MDAwMSwKKyAgICBTRl9SZWZlcmVuY2VUeXBlRGVmaW5lZCAgICAgICAgICAgICAgICAgPSAweDAwMDIsCisgICAgU0ZfUmVmZXJlbmNlVHlwZVByaXZhdGVEZWZpbmVkICAgICAgICAgID0gMHgwMDAzLAorICAgIFNGX1JlZmVyZW5jZVR5cGVQcml2YXRlVW5kZWZpbmVkTm9uTGF6eSA9IDB4MDAwNCwKKyAgICBTRl9SZWZlcmVuY2VUeXBlUHJpdmF0ZVVuZGVmaW5lZExhenkgICAgPSAweDAwMDUsCisKKyAgICAvLyBPdGhlciAnZGVzYycgZmxhZ3MuCisgICAgU0ZfTm9EZWFkU3RyaXAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDIwLAorICAgIFNGX1dlYWtSZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDA0MCwKKyAgICBTRl9XZWFrRGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwODAKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNPYmplY3RTdHJlYW1lci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0U3RyZWFtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTZkOWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0U3RyZWFtZXIuaApAQCAtMCwwICsxLDY3IEBACisvLz09PS0gTUNPYmplY3RTdHJlYW1lci5oIC0gTUNTdHJlYW1lciBPYmplY3QgRmlsZSBJbnRlcmZhY2UgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNPQkpFQ1RTVFJFQU1FUl9ICisjZGVmaW5lIExMVk1fTUNfTUNPQkpFQ1RTVFJFQU1FUl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DU3RyZWFtZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNBc3NlbWJsZXI7CitjbGFzcyBNQ0NvZGVFbWl0dGVyOworY2xhc3MgTUNTZWN0aW9uRGF0YTsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DRnJhZ21lbnQ7CitjbGFzcyBNQ0RhdGFGcmFnbWVudDsKK2NsYXNzIFRhcmdldEFzbUJhY2tlbmQ7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFxicmllZiBTdHJlYW1pbmcgb2JqZWN0IGZpbGUgZ2VuZXJhdGlvbiBpbnRlcmZhY2UuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNQ1N0cmVhbWVyIGludGVyZmFjZSB3aGljaCBpcworLy8vIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCB0aGUgYXNzZW1ibGVyIGJhY2tlbmQuIFNwZWNpZmljIG9iamVjdCBmaWxlIGZvcm1hdHMKKy8vLyBhcmUgZXhwZWN0ZWQgdG8gc3ViY2xhc3MgdGhpcyBpbnRlcmZhY2UgdG8gaW1wbGVtZW50IGRpcmVjdGl2ZXMgc3BlY2lmaWMKKy8vLyB0byB0aGF0IGZpbGUgZm9ybWF0IG9yIGN1c3RvbSBzZW1hbnRpY3MgZXhwZWN0ZWQgYnkgdGhlIG9iamVjdCB3cml0ZXIKKy8vLyBpbXBsZW1lbnRhdGlvbi4KK2NsYXNzIE1DT2JqZWN0U3RyZWFtZXIgOiBwdWJsaWMgTUNTdHJlYW1lciB7CisgIE1DQXNzZW1ibGVyICpBc3NlbWJsZXI7CisgIE1DU2VjdGlvbkRhdGEgKkN1clNlY3Rpb25EYXRhOworCitwcm90ZWN0ZWQ6CisgIE1DT2JqZWN0U3RyZWFtZXIoTUNDb250ZXh0ICZDb250ZXh0LCBUYXJnZXRBc21CYWNrZW5kICZUQUIsCisgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJl9PUywgTUNDb2RlRW1pdHRlciAqX0VtaXR0ZXIpOworICB+TUNPYmplY3RTdHJlYW1lcigpOworCisgIE1DU2VjdGlvbkRhdGEgKmdldEN1cnJlbnRTZWN0aW9uRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3VyU2VjdGlvbkRhdGE7CisgIH0KKworICBNQ0ZyYWdtZW50ICpnZXRDdXJyZW50RnJhZ21lbnQoKSBjb25zdDsKKworICAvLy8gR2V0IGEgZGF0YSBmcmFnbWVudCB0byB3cml0ZSBpbnRvLCBjcmVhdGluZyBhIG5ldyBvbmUgaWYgdGhlIGN1cnJlbnQKKyAgLy8vIGZyYWdtZW50IGlzIG5vdCBhIGRhdGEgZnJhZ21lbnQuCisgIE1DRGF0YUZyYWdtZW50ICpnZXRPckNyZWF0ZURhdGFGcmFnbWVudCgpIGNvbnN0OworCisgIGNvbnN0IE1DRXhwciAqQWRkVmFsdWVTeW1ib2xzKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCitwdWJsaWM6CisgIE1DQXNzZW1ibGVyICZnZXRBc3NlbWJsZXIoKSB7IHJldHVybiAqQXNzZW1ibGVyOyB9CisKKyAgLy8vIEBuYW1lIE1DU3RyZWFtZXIgSW50ZXJmYWNlCisgIC8vLyBAeworCisgIHZpcnR1YWwgdm9pZCBTd2l0Y2hTZWN0aW9uKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbik7CisgIHZpcnR1YWwgdm9pZCBGaW5pc2goKTsKKworICAvLy8gQH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0V3JpdGVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNPYmplY3RXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmVlYTdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0V3JpdGVyLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ09iamVjdFdyaXRlci5oIC0gT2JqZWN0IEZpbGUgV3JpdGVyIEludGVyZmFjZSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ09CSkVDVFdSSVRFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNPQkpFQ1RXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNBc21MYXlvdXQ7CitjbGFzcyBNQ0Fzc2VtYmxlcjsKK2NsYXNzIE1DRml4dXA7CitjbGFzcyBNQ0ZyYWdtZW50OworY2xhc3MgTUNWYWx1ZTsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gTUNPYmplY3RXcml0ZXIgLSBEZWZpbmVzIHRoZSBvYmplY3QgZmlsZSBhbmQgdGFyZ2V0IGluZGVwZW5kZW50IGludGVyZmFjZXMKKy8vLyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgYmFja2VuZCB0byB3cml0ZSBuYXRpdmUgZmlsZSBmb3JtYXQgb2JqZWN0IGZpbGVzLgorLy8vCisvLy8gVGhlIG9iamVjdCB3cml0ZXIgY29udGFpbnMgYSBmZXcgY2FsbGJhY2tzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB0byBhbGxvdworLy8vIHRoZSBvYmplY3Qgd3JpdGVyIHRvIG1vZGlmeSB0aGUgYXNzZW1ibGVyIGRhdGEgc3RydWN0dXJlcyBhdCBhcHByb3ByaWF0ZQorLy8vIHBvaW50cy4gT25jZSBhc3NlbWJseSBpcyBjb21wbGV0ZSwgdGhlIG9iamVjdCB3cml0ZXIgaXMgZ2l2ZW4gdGhlCisvLy8gTUNBc3NlbWJsZXIgaW5zdGFuY2UsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgc3ltYm9sIGFuZCBzZWN0aW9uIGRhdGEgd2hpY2gKKy8vLyBzaG91bGQgYmUgZW1pdHRlZCBhcyBwYXJ0IG9mIFdyaXRlT2JqZWN0KCkuCisvLy8KKy8vLyBUaGUgb2JqZWN0IHdyaXRlciBhbHNvIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGhlbHBlciBtZXRob2RzIGZvciB3cml0aW5nCisvLy8gYmluYXJ5IGRhdGEgdG8gdGhlIG91dHB1dCBzdHJlYW0uCitjbGFzcyBNQ09iamVjdFdyaXRlciB7CisgIE1DT2JqZWN0V3JpdGVyKGNvbnN0IE1DT2JqZWN0V3JpdGVyICYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1DT2JqZWN0V3JpdGVyICYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisKK3Byb3RlY3RlZDoKKyAgcmF3X29zdHJlYW0gJk9TOworCisgIHVuc2lnbmVkIElzTGl0dGxlRW5kaWFuIDogMTsKKworcHJvdGVjdGVkOiAvLyBDYW4gb25seSBjcmVhdGUgc3ViY2xhc3Nlcy4KKyAgTUNPYmplY3RXcml0ZXIocmF3X29zdHJlYW0gJl9PUywgYm9vbCBfSXNMaXR0bGVFbmRpYW4pCisgICAgOiBPUyhfT1MpLCBJc0xpdHRsZUVuZGlhbihfSXNMaXR0bGVFbmRpYW4pIHt9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+TUNPYmplY3RXcml0ZXIoKTsKKworICBib29sIGlzTGl0dGxlRW5kaWFuKCkgY29uc3QgeyByZXR1cm4gSXNMaXR0bGVFbmRpYW47IH0KKworICByYXdfb3N0cmVhbSAmZ2V0U3RyZWFtKCkgeyByZXR1cm4gT1M7IH0KKworICAvLy8gQG5hbWUgSGlnaC1MZXZlbCBBUEkKKyAgLy8vIEB7CisKKyAgLy8vIFBlcmZvcm0gYW55IGxhdGUgYmluZGluZyBvZiBzeW1ib2xzIChmb3IgZXhhbXBsZSwgdG8gYXNzaWduIHN5bWJvbCBpbmRpY2VzCisgIC8vLyBmb3IgdXNlIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0aW9ucykuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibGVyIGFmdGVyIGxheW91dCBhbmQgcmVsYXhhdGlvbiBpcworICAvLy8gY29tcGxldGUuCisgIHZpcnR1YWwgdm9pZCBFeGVjdXRlUG9zdExheW91dEJpbmRpbmcoTUNBc3NlbWJsZXIgJkFzbSkgPSAwOworCisgIC8vLyBSZWNvcmQgYSByZWxvY2F0aW9uIGVudHJ5LgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmxlciBhZnRlciBsYXlvdXQgYW5kIHJlbGF4YXRpb24sIGFuZAorICAvLy8gcG9zdCBsYXlvdXQgYmluZGluZy4gVGhlIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBzdG9yaW5nCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVsb2NhdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSBlbWl0dGVkIGR1cmluZworICAvLy8gV3JpdGVPYmplY3QoKS4KKyAgdmlydHVhbCB2b2lkIFJlY29yZFJlbG9jYXRpb24oY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwLCBNQ1ZhbHVlIFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJkZpeGVkVmFsdWUpID0gMDsKKworICAvLy8gV3JpdGUgdGhlIG9iamVjdCBmaWxlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmxlciBhZnRlciBsYXlvdXQgYW5kIHJlbGF4YXRpb24gaXMKKyAgLy8vIGNvbXBsZXRlLCBmaXh1cHMgaGF2ZSBiZWVuIGV2YWx1YXRlZCBhbmQgYXBwbGllZCwgYW5kIHJlbG9jYXRpb25zCisgIC8vLyBnZW5lcmF0ZWQuCisgIHZpcnR1YWwgdm9pZCBXcml0ZU9iamVjdChjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgPSAwOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQmluYXJ5IE91dHB1dAorICAvLy8gQHsKKworICB2b2lkIFdyaXRlOCh1aW50OF90IFZhbHVlKSB7CisgICAgT1MgPDwgY2hhcihWYWx1ZSk7CisgIH0KKworICB2b2lkIFdyaXRlTEUxNih1aW50MTZfdCBWYWx1ZSkgeworICAgIFdyaXRlOCh1aW50OF90KFZhbHVlID4+IDApKTsKKyAgICBXcml0ZTgodWludDhfdChWYWx1ZSA+PiA4KSk7CisgIH0KKworICB2b2lkIFdyaXRlTEUzMih1aW50MzJfdCBWYWx1ZSkgeworICAgIFdyaXRlTEUxNih1aW50MTZfdChWYWx1ZSA+PiAwKSk7CisgICAgV3JpdGVMRTE2KHVpbnQxNl90KFZhbHVlID4+IDE2KSk7CisgIH0KKworICB2b2lkIFdyaXRlTEU2NCh1aW50NjRfdCBWYWx1ZSkgeworICAgIFdyaXRlTEUzMih1aW50MzJfdChWYWx1ZSA+PiAwKSk7CisgICAgV3JpdGVMRTMyKHVpbnQzMl90KFZhbHVlID4+IDMyKSk7CisgIH0KKworICB2b2lkIFdyaXRlQkUxNih1aW50MTZfdCBWYWx1ZSkgeworICAgIFdyaXRlOCh1aW50OF90KFZhbHVlID4+IDgpKTsKKyAgICBXcml0ZTgodWludDhfdChWYWx1ZSA+PiAwKSk7CisgIH0KKworICB2b2lkIFdyaXRlQkUzMih1aW50MzJfdCBWYWx1ZSkgeworICAgIFdyaXRlQkUxNih1aW50MTZfdChWYWx1ZSA+PiAxNikpOworICAgIFdyaXRlQkUxNih1aW50MTZfdChWYWx1ZSA+PiAwKSk7CisgIH0KKworICB2b2lkIFdyaXRlQkU2NCh1aW50NjRfdCBWYWx1ZSkgeworICAgIFdyaXRlQkUzMih1aW50MzJfdChWYWx1ZSA+PiAzMikpOworICAgIFdyaXRlQkUzMih1aW50MzJfdChWYWx1ZSA+PiAwKSk7CisgIH0KKworICB2b2lkIFdyaXRlMTYodWludDE2X3QgVmFsdWUpIHsKKyAgICBpZiAoSXNMaXR0bGVFbmRpYW4pCisgICAgICBXcml0ZUxFMTYoVmFsdWUpOworICAgIGVsc2UKKyAgICAgIFdyaXRlQkUxNihWYWx1ZSk7CisgIH0KKworICB2b2lkIFdyaXRlMzIodWludDMyX3QgVmFsdWUpIHsKKyAgICBpZiAoSXNMaXR0bGVFbmRpYW4pCisgICAgICBXcml0ZUxFMzIoVmFsdWUpOworICAgIGVsc2UKKyAgICAgIFdyaXRlQkUzMihWYWx1ZSk7CisgIH0KKworICB2b2lkIFdyaXRlNjQodWludDY0X3QgVmFsdWUpIHsKKyAgICBpZiAoSXNMaXR0bGVFbmRpYW4pCisgICAgICBXcml0ZUxFNjQoVmFsdWUpOworICAgIGVsc2UKKyAgICAgIFdyaXRlQkU2NChWYWx1ZSk7CisgIH0KKworICB2b2lkIFdyaXRlWmVyb3ModW5zaWduZWQgTikgeworICAgIGNvbnN0IGNoYXIgWmVyb3NbMTZdID0geyAwIH07CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTiAvIDE2OyBpICE9IGU7ICsraSkKKyAgICAgIE9TIDw8IFN0cmluZ1JlZihaZXJvcywgMTYpOworCisgICAgT1MgPDwgU3RyaW5nUmVmKFplcm9zLCBOICUgMTYpOworICB9CisKKyAgdm9pZCBXcml0ZUJ5dGVzKFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkIFplcm9GaWxsU2l6ZSA9IDApIHsKKyAgICBhc3NlcnQoKFplcm9GaWxsU2l6ZSA9PSAwIHx8IFN0ci5zaXplICgpIDw9IFplcm9GaWxsU2l6ZSkgJiYKKyAgICAgICJkYXRhIHNpemUgZ3JlYXRlciB0aGFuIGZpbGwgc2l6ZSwgdW5leHBlY3RlZCBsYXJnZSB3cml0ZSB3aWxsIG9jY3VyIik7CisgICAgT1MgPDwgU3RyOworICAgIGlmIChaZXJvRmlsbFNpemUpCisgICAgICBXcml0ZVplcm9zKFplcm9GaWxsU2l6ZSAtIFN0ci5zaXplKCkpOworICB9CisKKyAgLy8vIEB9Cit9OworCitNQ09iamVjdFdyaXRlciAqY3JlYXRlV2luQ09GRk9iamVjdFdyaXRlcihyYXdfb3N0cmVhbSAmT1MpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9Bc21Db25kLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvQXNtQ29uZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTExNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvQXNtQ29uZC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBBc21Db25kLmggLSBBc3NlbWJseSBmaWxlIGNvbmRpdGlvbmFsIGFzc2VtYmx5ICAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQVNNQ09ORF9ICisjZGVmaW5lIEFTTUNPTkRfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBc21Db25kIC0gQ2xhc3MgdG8gc3VwcG9ydCBjb25kaXRpb25hbCBhc3NlbWJseQorLy8vCisvLy8gVGhlIGNvbmRpdGlvbmFsIGFzc2VtYmx5IGZlYXR1cmUgKC5pZiwgLmVsc2UsIC5lbHNlaWYgYW5kIC5lbmRpZikgaXMKKy8vLyBpbXBsZW1lbnRlZCB3aXRoIEFzbUNvbmQgdGhhdCB0ZWxscyB1cyB3aGF0IHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIAorLy8vIHByb2Nlc3NpbmcuICBJZ25vcmUgY2FuIGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlLiAgV2hlbiB0cnVlIHdlIGFyZSBpZ25vcmluZworLy8vIHRoZSBibG9jayBvZiBjb2RlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25kaXRpb25hbC4KKworY2xhc3MgQXNtQ29uZCB7CitwdWJsaWM6CisgIGVudW0gQ29uZGl0aW9uYWxBc3NlbWJseVR5cGUgeworICAgIE5vQ29uZCwgICAgIC8vIG5vIGNvbmRpdGlvbmFsIGlzIGJlaW5nIHByb2Nlc3NlZAorICAgIElmQ29uZCwgICAgIC8vIGluc2lkZSBpZiBjb25kaXRpb25hbAorICAgIEVsc2VJZkNvbmQsIC8vIGluc2lkZSBlbHNlaWYgY29uZGl0aW9uYWwKKyAgICBFbHNlQ29uZCAgICAvLyBpbnNpZGUgZWxzZSBjb25kaXRpb25hbAorICB9OworCisgIENvbmRpdGlvbmFsQXNzZW1ibHlUeXBlIFRoZUNvbmQ7CisgIGJvb2wgQ29uZE1ldDsKKyAgYm9vbCBJZ25vcmU7CisKKyAgQXNtQ29uZCgpIDogVGhlQ29uZChOb0NvbmQpLCBDb25kTWV0KGZhbHNlKSwgSWdub3JlKGZhbHNlKSB7fQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvQXNtTGV4ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9Bc21MZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODc4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvQXNtTGV4ZXIuaApAQCAtMCwwICsxLDY4IEBACisvLz09PS0gQXNtTGV4ZXIuaCAtIExleGVyIGZvciBBc3NlbWJseSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgZGVjbGFyZXMgdGhlIGxleGVyIGZvciBhc3NlbWJseSBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEFTTUxFWEVSX0gKKyNkZWZpbmUgQVNNTEVYRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTWVtb3J5QnVmZmVyOworY2xhc3MgU01Mb2M7CitjbGFzcyBNQ0FzbUluZm87CisKKy8vLyBBc21MZXhlciAtIExleGVyIGNsYXNzIGZvciBhc3NlbWJseSBmaWxlcy4KK2NsYXNzIEFzbUxleGVyIDogcHVibGljIE1DQXNtTGV4ZXIgeworICBjb25zdCBNQ0FzbUluZm8gJk1BSTsKKyAgCisgIGNvbnN0IGNoYXIgKkN1clB0cjsKKyAgY29uc3QgTWVtb3J5QnVmZmVyICpDdXJCdWY7CisgIAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBBc21MZXhlciYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisgIEFzbUxleGVyKGNvbnN0IEFzbUxleGVyJik7ICAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKworcHJvdGVjdGVkOgorICAvLy8gTGV4VG9rZW4gLSBSZWFkIHRoZSBuZXh0IHRva2VuIGFuZCByZXR1cm4gaXRzIGNvZGUuCisgIHZpcnR1YWwgQXNtVG9rZW4gTGV4VG9rZW4oKTsKKworcHVibGljOgorICBBc21MZXhlcihjb25zdCBNQ0FzbUluZm8gJk1BSSk7CisgIH5Bc21MZXhlcigpOworICAKKyAgdm9pZCBzZXRCdWZmZXIoY29uc3QgTWVtb3J5QnVmZmVyICpidWYsIGNvbnN0IGNoYXIgKnB0ciA9IE5VTEwpOworICAKKyAgdmlydHVhbCBTdHJpbmdSZWYgTGV4VW50aWxFbmRPZlN0YXRlbWVudCgpOworCisgIGJvb2wgaXNBdFN0YXJ0T2ZDb21tZW50KGNoYXIgQ2hhcik7CisgIAorICBjb25zdCBNQ0FzbUluZm8gJmdldE1BSSgpIGNvbnN0IHsgcmV0dXJuIE1BSTsgfQorCitwcml2YXRlOgorICBpbnQgZ2V0TmV4dENoYXIoKTsKKyAgQXNtVG9rZW4gUmV0dXJuRXJyb3IoY29uc3QgY2hhciAqTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTXNnKTsKKworICBBc21Ub2tlbiBMZXhJZGVudGlmaWVyKCk7CisgIEFzbVRva2VuIExleFNsYXNoKCk7CisgIEFzbVRva2VuIExleExpbmVDb21tZW50KCk7CisgIEFzbVRva2VuIExleERpZ2l0KCk7CisgIEFzbVRva2VuIExleFF1b3RlKCk7Cit9OworICAKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MGU4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgKQEAgLTAsMCArMSwxNzggQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0FzbUxleGVyLmggLSBBYnN0cmFjdCBBc20gTGV4ZXIgSW50ZXJmYWNlIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0FTTUxFWEVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0FTTUxFWEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ0FzbUxleGVyOworY2xhc3MgTUNJbnN0OworY2xhc3MgVGFyZ2V0OworCisvLy8gQXNtVG9rZW4gLSBUYXJnZXQgaW5kZXBlbmRlbnQgcmVwcmVzZW50YXRpb24gZm9yIGFuIGFzc2VtYmxlciB0b2tlbi4KK2NsYXNzIEFzbVRva2VuIHsKK3B1YmxpYzoKKyAgZW51bSBUb2tlbktpbmQgeworICAgIC8vIE1hcmtlcnMKKyAgICBFb2YsIEVycm9yLAorCisgICAgLy8gU3RyaW5nIHZhbHVlcy4KKyAgICBJZGVudGlmaWVyLAorICAgIFN0cmluZywKKyAgICAKKyAgICAvLyBJbnRlZ2VyIHZhbHVlcy4KKyAgICBJbnRlZ2VyLAorICAgIAorICAgIC8vIFJlZ2lzdGVyIHZhbHVlcyAoc3RvcmVkIGluIEludFZhbCkuICBPbmx5IHVzZWQgYnkgVGFyZ2V0QXNtTGV4ZXIuCisgICAgUmVnaXN0ZXIsCisgICAgCisgICAgLy8gTm8tdmFsdWUuCisgICAgRW5kT2ZTdGF0ZW1lbnQsCisgICAgQ29sb24sCisgICAgUGx1cywgTWludXMsIFRpbGRlLAorICAgIFNsYXNoLCAgICAvLyAnLycKKyAgICBMUGFyZW4sIFJQYXJlbiwgTEJyYWMsIFJCcmFjLCBMQ3VybHksIFJDdXJseSwKKyAgICBTdGFyLCBEb3QsIENvbW1hLCBEb2xsYXIsIEVxdWFsLCBFcXVhbEVxdWFsLAorICAgIAorICAgIFBpcGUsIFBpcGVQaXBlLCBDYXJldCwgCisgICAgQW1wLCBBbXBBbXAsIEV4Y2xhaW0sIEV4Y2xhaW1FcXVhbCwgUGVyY2VudCwgSGFzaCwKKyAgICBMZXNzLCBMZXNzRXF1YWwsIExlc3NMZXNzLCBMZXNzR3JlYXRlciwKKyAgICBHcmVhdGVyLCBHcmVhdGVyRXF1YWwsIEdyZWF0ZXJHcmVhdGVyLCBBdAorICB9OworCisgIFRva2VuS2luZCBLaW5kOworCisgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgZW50aXJlIHRva2VuIGNvbnRlbnRzOyB0aGlzIGlzIGFsd2F5cyBhIHBvaW50ZXIgaW50bworICAvLy8gYSBtZW1vcnkgYnVmZmVyIG93bmVkIGJ5IHRoZSBzb3VyY2UgbWFuYWdlci4KKyAgU3RyaW5nUmVmIFN0cjsKKworICBpbnQ2NF90IEludFZhbDsKKworcHVibGljOgorICBBc21Ub2tlbigpIHt9CisgIEFzbVRva2VuKFRva2VuS2luZCBfS2luZCwgU3RyaW5nUmVmIF9TdHIsIGludDY0X3QgX0ludFZhbCA9IDApCisgICAgOiBLaW5kKF9LaW5kKSwgU3RyKF9TdHIpLCBJbnRWYWwoX0ludFZhbCkge30KKworICBUb2tlbktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKyAgYm9vbCBpcyhUb2tlbktpbmQgSykgY29uc3QgeyByZXR1cm4gS2luZCA9PSBLOyB9CisgIGJvb2wgaXNOb3QoVG9rZW5LaW5kIEspIGNvbnN0IHsgcmV0dXJuIEtpbmQgIT0gSzsgfQorCisgIFNNTG9jIGdldExvYygpIGNvbnN0OworCisgIC8vLyBnZXRTdHJpbmdDb250ZW50cyAtIEdldCB0aGUgY29udGVudHMgb2YgYSBzdHJpbmcgdG9rZW4gKHdpdGhvdXQgcXVvdGVzKS4KKyAgU3RyaW5nUmVmIGdldFN0cmluZ0NvbnRlbnRzKCkgY29uc3QgeyAKKyAgICBhc3NlcnQoS2luZCA9PSBTdHJpbmcgJiYgIlRoaXMgdG9rZW4gaXNuJ3QgYSBzdHJpbmchIik7CisgICAgcmV0dXJuIFN0ci5zbGljZSgxLCBTdHIuc2l6ZSgpIC0gMSk7CisgIH0KKworICAvLy8gZ2V0SWRlbnRpZmllciAtIEdldCB0aGUgaWRlbnRpZmllciBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IHRva2VuLCB3aGljaAorICAvLy8gc2hvdWxkIGJlIGFuIGlkZW50aWZpZXIgb3IgYSBzdHJpbmcuIFRoaXMgZ2V0cyB0aGUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nCisgIC8vLyB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgaWRlbnRpZmllciwgZS5nLiwgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUKKyAgLy8vIHF1b3RlcyBvbiBzdHJpbmdzLgorICBTdHJpbmdSZWYgZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsKKyAgICBpZiAoS2luZCA9PSBJZGVudGlmaWVyKQorICAgICAgcmV0dXJuIGdldFN0cmluZygpOworICAgIHJldHVybiBnZXRTdHJpbmdDb250ZW50cygpOworICB9CisKKyAgLy8vIGdldFN0cmluZyAtIEdldCB0aGUgc3RyaW5nIGZvciB0aGUgY3VycmVudCB0b2tlbiwgdGhpcyBpbmNsdWRlcyBhbGwKKyAgLy8vIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLCB0aGUgcXVvdGVzIG9uIHN0cmluZ3MpIGluIHRoZSB0b2tlbi4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgU3RyaW5nUmVmIHBvaW50cyBpbnRvIHRoZSBzb3VyY2UgbWFuYWdlcidzIG1lbW9yeSBidWZmZXIsIGFuZAorICAvLy8gaXMgc2FmZSB0byBzdG9yZSBhY3Jvc3MgY2FsbHMgdG8gTGV4KCkuCisgIFN0cmluZ1JlZiBnZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBTdHI7IH0KKworICAvLyBGSVhNRTogRG9uJ3QgY29tcHV0ZSB0aGlzIGluIGFkdmFuY2UsIGl0IG1ha2VzIGV2ZXJ5IHRva2VuIGxhcmdlciwgYW5kIGlzCisgIC8vIGFsc28gbm90IGdlbmVyYWxseSB3aGF0IHdlIHdhbnQgKGl0IGlzIG5pY2VyIGZvciByZWNvdmVyeSBldGMuIHRvIGxleCAxMjNicgorICAvLyBhcyBhIHNpbmdsZSB0b2tlbiwgdGhlbiBkaWFnbm9zZSBhcyBhbiBpbnZhbGlkIG51bWJlcikuCisgIGludDY0X3QgZ2V0SW50VmFsKCkgY29uc3QgeyAKKyAgICBhc3NlcnQoS2luZCA9PSBJbnRlZ2VyICYmICJUaGlzIHRva2VuIGlzbid0IGFuIGludGVnZXIhIik7CisgICAgcmV0dXJuIEludFZhbDsgCisgIH0KKyAgCisgIC8vLyBnZXRSZWdWYWwgLSBHZXQgdGhlIHJlZ2lzdGVyIG51bWJlciBmb3IgdGhlIGN1cnJlbnQgdG9rZW4sIHdoaWNoIHNob3VsZAorICAvLy8gYmUgYSByZWdpc3Rlci4KKyAgdW5zaWduZWQgZ2V0UmVnVmFsKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IFJlZ2lzdGVyICYmICJUaGlzIHRva2VuIGlzbid0IGEgcmVnaXN0ZXIhIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihJbnRWYWwpOworICB9Cit9OworCisvLy8gTUNBc21MZXhlciAtIEdlbmVyaWMgYXNzZW1ibGVyIGxleGVyIGludGVyZmFjZSwgZm9yIHVzZSBieSB0YXJnZXQgc3BlY2lmaWMKKy8vLyBhc3NlbWJseSBsZXhlcnMuCitjbGFzcyBNQ0FzbUxleGVyIHsKKyAgLy8vIFRoZSBjdXJyZW50IHRva2VuLCBzdG9yZWQgaW4gdGhlIGJhc2UgY2xhc3MgZm9yIGZhc3RlciBhY2Nlc3MuCisgIEFzbVRva2VuIEN1clRvazsKKyAgCisgIC8vLyBUaGUgbG9jYXRpb24gYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IGVycm9yCisgIFNNTG9jIEVyckxvYzsKKyAgc3RkOjpzdHJpbmcgRXJyOworCisgIE1DQXNtTGV4ZXIoY29uc3QgTUNBc21MZXhlciAmKTsgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1DQXNtTGV4ZXIgJik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBjb25zdCBjaGFyICpUb2tTdGFydDsKKworICBNQ0FzbUxleGVyKCk7CisKKyAgdmlydHVhbCBBc21Ub2tlbiBMZXhUb2tlbigpID0gMDsKKyAgCisgIHZvaWQgU2V0RXJyb3IoY29uc3QgU01Mb2MgJmVyckxvYywgY29uc3Qgc3RkOjpzdHJpbmcgJmVycikgeworICAgIEVyckxvYyA9IGVyckxvYzsKKyAgICBFcnIgPSBlcnI7CisgIH0KKyAgCitwdWJsaWM6CisgIHZpcnR1YWwgfk1DQXNtTGV4ZXIoKTsKKworICAvLy8gTGV4IC0gQ29uc3VtZSB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJldHVybiBpdC4KKyAgLy8vCisgIC8vLyBUaGUgbGV4ZXIgd2lsbCBjb250aW51b3NseSByZXR1cm4gdGhlIGVuZC1vZi1maWxlIHRva2VuIG9uY2UgdGhlIGVuZCBvZgorICAvLy8gdGhlIG1haW4gaW5wdXQgZmlsZSBoYXMgYmVlbiByZWFjaGVkLgorICBjb25zdCBBc21Ub2tlbiAmTGV4KCkgeworICAgIHJldHVybiBDdXJUb2sgPSBMZXhUb2tlbigpOworICB9CisKKyAgdmlydHVhbCBTdHJpbmdSZWYgTGV4VW50aWxFbmRPZlN0YXRlbWVudCgpID0gMDsKKworICAvLy8gZ2V0TG9jIC0gR2V0IHRoZSBjdXJyZW50IHNvdXJjZSBsb2NhdGlvbi4KKyAgU01Mb2MgZ2V0TG9jKCkgY29uc3Q7CisKKyAgLy8vIGdldFRvayAtIEdldCB0aGUgY3VycmVudCAobGFzdCkgbGV4ZWQgdG9rZW4uCisgIGNvbnN0IEFzbVRva2VuICZnZXRUb2soKSB7CisgICAgcmV0dXJuIEN1clRvazsKKyAgfQorICAKKyAgLy8vIGdldEVyckxvYyAtIEdldCB0aGUgY3VycmVudCBlcnJvciBsb2NhdGlvbgorICBjb25zdCBTTUxvYyAmZ2V0RXJyTG9jKCkgeworICAgIHJldHVybiBFcnJMb2M7CisgIH0KKyAgICAgICAgICAgCisgIC8vLyBnZXRFcnIgLSBHZXQgdGhlIGN1cnJlbnQgZXJyb3Igc3RyaW5nCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRFcnIoKSB7CisgICAgcmV0dXJuIEVycjsKKyAgfQorCisgIC8vLyBnZXRLaW5kIC0gR2V0IHRoZSBraW5kIG9mIGN1cnJlbnQgdG9rZW4uCisgIEFzbVRva2VuOjpUb2tlbktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEN1clRvay5nZXRLaW5kKCk7IH0KKworICAvLy8gaXMgLSBDaGVjayBpZiB0aGUgY3VycmVudCB0b2tlbiBoYXMga2luZCBcYXJnIEsuCisgIGJvb2wgaXMoQXNtVG9rZW46OlRva2VuS2luZCBLKSBjb25zdCB7IHJldHVybiBDdXJUb2suaXMoSyk7IH0KKworICAvLy8gaXNOb3QgLSBDaGVjayBpZiB0aGUgY3VycmVudCB0b2tlbiBoYXMga2luZCBcYXJnIEsuCisgIGJvb2wgaXNOb3QoQXNtVG9rZW46OlRva2VuS2luZCBLKSBjb25zdCB7IHJldHVybiBDdXJUb2suaXNOb3QoSyk7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU3OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmgKQEAgLTAsMCArMSwxMjggQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0FzbVBhcnNlci5oIC0gQWJzdHJhY3QgQXNtIFBhcnNlciBJbnRlcmZhY2UgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0FTTVBBUlNFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNBU01QQVJTRVJfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEFzbVRva2VuOworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgTUNBc21MZXhlcjsKK2NsYXNzIE1DQXNtUGFyc2VyRXh0ZW5zaW9uOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNFeHByOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIFNNTG9jOworY2xhc3MgU291cmNlTWdyOworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgVGFyZ2V0OworY2xhc3MgVGFyZ2V0QXNtUGFyc2VyOworY2xhc3MgVHdpbmU7CisKKy8vLyBNQ0FzbVBhcnNlciAtIEdlbmVyaWMgYXNzZW1ibGVyIHBhcnNlciBpbnRlcmZhY2UsIGZvciB1c2UgYnkgdGFyZ2V0IHNwZWNpZmljCisvLy8gYXNzZW1ibHkgcGFyc2Vycy4KK2NsYXNzIE1DQXNtUGFyc2VyIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBib29sICgqRGlyZWN0aXZlSGFuZGxlcikoTUNBc21QYXJzZXJFeHRlbnNpb24qLCBTdHJpbmdSZWYsIFNNTG9jKTsKKworcHJpdmF0ZToKKyAgTUNBc21QYXJzZXIoY29uc3QgTUNBc21QYXJzZXIgJik7ICAgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBNQ0FzbVBhcnNlciAmKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKKworICBUYXJnZXRBc21QYXJzZXIgKlRhcmdldFBhcnNlcjsKKworcHJvdGVjdGVkOiAvLyBDYW4gb25seSBjcmVhdGUgc3ViY2xhc3Nlcy4KKyAgTUNBc21QYXJzZXIoKTsKKworcHVibGljOgorICB2aXJ0dWFsIH5NQ0FzbVBhcnNlcigpOworCisgIHZpcnR1YWwgdm9pZCBBZGREaXJlY3RpdmVIYW5kbGVyKE1DQXNtUGFyc2VyRXh0ZW5zaW9uICpPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGl2ZUhhbmRsZXIgSGFuZGxlcikgPSAwOworCisgIHZpcnR1YWwgU291cmNlTWdyICZnZXRTb3VyY2VNYW5hZ2VyKCkgPSAwOworCisgIHZpcnR1YWwgTUNBc21MZXhlciAmZ2V0TGV4ZXIoKSA9IDA7CisKKyAgdmlydHVhbCBNQ0NvbnRleHQgJmdldENvbnRleHQoKSA9IDA7CisKKyAgLy8vIGdldFN0cmVhbWVyIC0gUmV0dXJuIHRoZSBvdXRwdXQgc3RyZWFtZXIgZm9yIHRoZSBhc3NlbWJsZXIuCisgIHZpcnR1YWwgTUNTdHJlYW1lciAmZ2V0U3RyZWFtZXIoKSA9IDA7CisKKyAgVGFyZ2V0QXNtUGFyc2VyICZnZXRUYXJnZXRQYXJzZXIoKSBjb25zdCB7IHJldHVybiAqVGFyZ2V0UGFyc2VyOyB9CisgIHZvaWQgc2V0VGFyZ2V0UGFyc2VyKFRhcmdldEFzbVBhcnNlciAmUCk7CisKKyAgLy8vIFJ1biAtIFJ1biB0aGUgcGFyc2VyIG9uIHRoZSBpbnB1dCBzb3VyY2UgYnVmZmVyLgorICB2aXJ0dWFsIGJvb2wgUnVuKGJvb2wgTm9Jbml0aWFsVGV4dFNlY3Rpb24sIGJvb2wgTm9GaW5hbGl6ZSA9IGZhbHNlKSA9IDA7CisKKyAgLy8vIFdhcm5pbmcgLSBFbWl0IGEgd2FybmluZyBhdCB0aGUgbG9jYXRpb24gXGFyZyBMLCB3aXRoIHRoZSBtZXNzYWdlIFxhcmcKKyAgLy8vIE1zZy4KKyAgdmlydHVhbCB2b2lkIFdhcm5pbmcoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1zZykgPSAwOworCisgIC8vLyBFcnJvciAtIEVtaXQgYW4gZXJyb3IgYXQgdGhlIGxvY2F0aW9uIFxhcmcgTCwgd2l0aCB0aGUgbWVzc2FnZSBcYXJnCisgIC8vLyBNc2cuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyB0cnVlLCBhcyBhbiBpZGlvbWF0aWMgY29udmVuaWVuY2UgdG8KKyAgLy8vIGNsaWVudHMuCisgIHZpcnR1YWwgYm9vbCBFcnJvcihTTUxvYyBMLCBjb25zdCBUd2luZSAmTXNnKSA9IDA7CisKKyAgLy8vIExleCAtIEdldCB0aGUgbmV4dCBBc21Ub2tlbiBpbiB0aGUgc3RyZWFtLCBwb3NzaWJseSBoYW5kbGluZyBmaWxlCisgIC8vLyBpbmNsdXNpb24gZmlyc3QuCisgIHZpcnR1YWwgY29uc3QgQXNtVG9rZW4gJkxleCgpID0gMDsKKworICAvLy8gZ2V0VG9rIC0gR2V0IHRoZSBjdXJyZW50IEFzbVRva2VuIGZyb20gdGhlIHN0cmVhbS4KKyAgY29uc3QgQXNtVG9rZW4gJmdldFRvaygpOworCisgIC8vLyBcYnJpZWYgUmVwb3J0IGFuIGVycm9yIGF0IHRoZSBjdXJyZW50IGxleGVyIGxvY2F0aW9uLgorICBib29sIFRva0Vycm9yKGNvbnN0IFR3aW5lICZNc2cpOworCisgIC8vLyBQYXJzZUlkZW50aWZpZXIgLSBQYXJzZSBhbiBpZGVudGlmaWVyIG9yIHN0cmluZyAoYXMgYSBxdW90ZWQgaWRlbnRpZmllcikKKyAgLy8vIGFuZCBzZXQgXGFyZyBSZXMgdG8gdGhlIGlkZW50aWZpZXIgY29udGVudHMuCisgIHZpcnR1YWwgYm9vbCBQYXJzZUlkZW50aWZpZXIoU3RyaW5nUmVmICZSZXMpID0gMDsKKworICAvLy8gXGJyaWVmIFBhcnNlIHVwIHRvIHRoZSBlbmQgb2Ygc3RhdGVtZW50IGFuZCByZXR1cm4gdGhlIGNvbnRlbnRzIGZyb20gdGhlCisgIC8vLyBjdXJyZW50IHRva2VuIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudDsgdGhlIGN1cnJlbnQgdG9rZW4gb24gZXhpdAorICAvLy8gd2lsbCBiZSBlaXRoZXIgdGhlIEVuZE9mU3RhdGVtZW50IG9yIEVPRi4KKyAgdmlydHVhbCBTdHJpbmdSZWYgUGFyc2VTdHJpbmdUb0VuZE9mU3RhdGVtZW50KCkgPSAwOworCisgIC8vLyBQYXJzZUV4cHJlc3Npb24gLSBQYXJzZSBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUmVzIC0gVGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZAorICAvLy8gb24gZXJyb3IuCisgIC8vLyBAcmVzdWx0IC0gRmFsc2Ugb24gc3VjY2Vzcy4KKyAgdmlydHVhbCBib29sIFBhcnNlRXhwcmVzc2lvbihjb25zdCBNQ0V4cHIgKiZSZXMsIFNNTG9jICZFbmRMb2MpID0gMDsKKyAgYm9vbCBQYXJzZUV4cHJlc3Npb24oY29uc3QgTUNFeHByIComUmVzKTsKKworICAvLy8gUGFyc2VQYXJlbkV4cHJlc3Npb24gLSBQYXJzZSBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbiwgYXNzdW1pbmcgdGhhdCBhbgorICAvLy8gaW5pdGlhbCAnKCcgaGFzIGFscmVhZHkgYmVlbiBjb25zdW1lZC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUmVzIC0gVGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZAorICAvLy8gb24gZXJyb3IuCisgIC8vLyBAcmVzdWx0IC0gRmFsc2Ugb24gc3VjY2Vzcy4KKyAgdmlydHVhbCBib29sIFBhcnNlUGFyZW5FeHByZXNzaW9uKGNvbnN0IE1DRXhwciAqJlJlcywgU01Mb2MgJkVuZExvYykgPSAwOworCisgIC8vLyBQYXJzZUFic29sdXRlRXhwcmVzc2lvbiAtIFBhcnNlIGFuIGV4cHJlc3Npb24gd2hpY2ggbXVzdCBldmFsdWF0ZSB0byBhbgorICAvLy8gYWJzb2x1dGUgdmFsdWUuCisgIC8vLworICAvLy8gQHBhcmFtIFJlcyAtIFRoZSB2YWx1ZSBvZiB0aGUgYWJzb2x1dGUgZXhwcmVzc2lvbi4gVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQKKyAgLy8vIG9uIGVycm9yLgorICAvLy8gQHJlc3VsdCAtIEZhbHNlIG9uIHN1Y2Nlc3MuCisgIHZpcnR1YWwgYm9vbCBQYXJzZUFic29sdXRlRXhwcmVzc2lvbihpbnQ2NF90ICZSZXMpID0gMDsKK307CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGFuIE1DQXNtUGFyc2VyIGluc3RhbmNlLgorTUNBc21QYXJzZXIgKmNyZWF0ZU1DQXNtUGFyc2VyKGNvbnN0IFRhcmdldCAmLCBTb3VyY2VNZ3IgJiwgTUNDb250ZXh0ICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTdHJlYW1lciAmLCBjb25zdCBNQ0FzbUluZm8gJik7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyRXh0ZW5zaW9uLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXJFeHRlbnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTE4NGNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyRXh0ZW5zaW9uLmgKQEAgLTAsMCArMSw3NiBAQAorLy89PT0tLSBsbHZtL01DL01DQXNtUGFyc2VyRXh0ZW5zaW9uLmggLSBBc20gUGFyc2VyIEhvb2tzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQVNNUEFSU0VSRVhURU5TSU9OX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0FTTVBBUlNFUkVYVEVOU0lPTl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NNTG9jLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFR3aW5lOworCisvLy8gXGJyaWVmIEdlbmVyaWMgaW50ZXJmYWNlIGZvciBleHRlbmRpbmcgdGhlIE1DQXNtUGFyc2VyLAorLy8vIHdoaWNoIGlzIGltcGxlbWVudGVkIGJ5IHRhcmdldCBhbmQgb2JqZWN0IGZpbGUgYXNzZW1ibHkgcGFyc2VyCisvLy8gaW1wbGVtZW50YXRpb25zLgorY2xhc3MgTUNBc21QYXJzZXJFeHRlbnNpb24geworICBNQ0FzbVBhcnNlckV4dGVuc2lvbihjb25zdCBNQ0FzbVBhcnNlckV4dGVuc2lvbiAmKTsgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1DQXNtUGFyc2VyRXh0ZW5zaW9uICYpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorCisgIE1DQXNtUGFyc2VyICpQYXJzZXI7CisKK3Byb3RlY3RlZDoKKyAgTUNBc21QYXJzZXJFeHRlbnNpb24oKTsKKworICAvLyBIZWxwZXIgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBzdGF0aWMgZGlzcGF0Y2ggZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIChUOjoqSGFuZGxlcikoU3RyaW5nUmVmLCBTTUxvYyk+CisgIHN0YXRpYyBib29sIEhhbmRsZURpcmVjdGl2ZShNQ0FzbVBhcnNlckV4dGVuc2lvbiAqVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIERpcmVjdGl2ZUxvYykgeworICAgIFQgKk9iaiA9IHN0YXRpY19jYXN0PFQqPihUYXJnZXQpOworICAgIHJldHVybiAoT2JqLT4qSGFuZGxlcikoRGlyZWN0aXZlLCBEaXJlY3RpdmVMb2MpOworICB9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+TUNBc21QYXJzZXJFeHRlbnNpb24oKTsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgdGhlIGV4dGVuc2lvbiBmb3IgcGFyc2luZyB1c2luZyB0aGUgZ2l2ZW4gXGFyZworICAvLy8gUGFyc2VyLiBUaGUgZXh0ZW5zaW9uIHNob3VsZCB1c2UgdGhlIEFzbVBhcnNlciBpbnRlcmZhY2VzIHRvIHJlZ2lzdGVyIGl0cworICAvLy8gcGFyc2luZyByb3V0aW5lcy4KKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoTUNBc21QYXJzZXIgJlBhcnNlcik7CisKKyAgLy8vIEBuYW1lIE1DQXNtUGFyc2VyIFByb3h5IEludGVyZmFjZXMKKyAgLy8vIEB7CisKKyAgTUNDb250ZXh0ICZnZXRDb250ZXh0KCkgeyByZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29udGV4dCgpOyB9CisgIE1DQXNtTGV4ZXIgJmdldExleGVyKCkgeyByZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0TGV4ZXIoKTsgfQorICBNQ0FzbVBhcnNlciAmZ2V0UGFyc2VyKCkgeyByZXR1cm4gKlBhcnNlcjsgfQorICBTb3VyY2VNZ3IgJmdldFNvdXJjZU1hbmFnZXIoKSB7IHJldHVybiBnZXRQYXJzZXIoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7IH0KKyAgTUNTdHJlYW1lciAmZ2V0U3RyZWFtZXIoKSB7IHJldHVybiBnZXRQYXJzZXIoKS5nZXRTdHJlYW1lcigpOyB9CisgIHZvaWQgV2FybmluZyhTTUxvYyBMLCBjb25zdCBUd2luZSAmTXNnKSB7CisgICAgcmV0dXJuIGdldFBhcnNlcigpLldhcm5pbmcoTCwgTXNnKTsKKyAgfQorICBib29sIEVycm9yKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2cpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkuRXJyb3IoTCwgTXNnKTsKKyAgfQorICBib29sIFRva0Vycm9yKGNvbnN0IFR3aW5lICZNc2cpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkuVG9rRXJyb3IoTXNnKTsKKyAgfQorCisgIGNvbnN0IEFzbVRva2VuICZMZXgoKSB7IHJldHVybiBnZXRQYXJzZXIoKS5MZXgoKTsgfQorCisgIGNvbnN0IEFzbVRva2VuICZnZXRUb2soKSB7IHJldHVybiBnZXRQYXJzZXIoKS5nZXRUb2soKTsgfQorCisgIC8vLyBAfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNQYXJzZWRBc21PcGVyYW5kLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNQYXJzZWRBc21PcGVyYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyZjViZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ1BhcnNlZEFzbU9wZXJhbmQuaApAQCAtMCwwICsxLDMzIEBACisvLz09PS0tIGxsdm0vTUMvTUNQYXJzZWRBc21PcGVyYW5kLmggLSBBc20gUGFyc2VyIE9wZXJhbmQgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNBU01PUEVSQU5EX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0FTTU9QRVJBTkRfSAorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTTUxvYzsKKworLy8vIE1DUGFyc2VkQXNtT3BlcmFuZCAtIFRoaXMgYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50cyBhIHNvdXJjZS1sZXZlbCBhc3NlbWJseQorLy8vIGluc3RydWN0aW9uIG9wZXJhbmQuICBJdCBzaG91bGQgYmUgc3ViY2xhc3NlZCBieSB0YXJnZXQtc3BlY2lmaWMgY29kZS4gIFRoaXMKKy8vLyBiYXNlIGNsYXNzIGlzIHVzZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNsaWVudHMgYW5kIGlzIHRoZSBpbnRlcmZhY2UKKy8vLyBiZXR3ZWVuIHBhcnNpbmcgYW4gYXNtIGluc3RydWN0aW9uIGFuZCByZWNvZ25pemluZyBpdC4KK2NsYXNzIE1DUGFyc2VkQXNtT3BlcmFuZCB7CitwdWJsaWM6ICAKKyAgTUNQYXJzZWRBc21PcGVyYW5kKCkge30KKyAgdmlydHVhbCB+TUNQYXJzZWRBc21PcGVyYW5kKCkge30KKyAgCisgIC8vLyBnZXRTdGFydExvYyAtIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHRva2VuIG9mIHRoaXMgb3BlcmFuZC4KKyAgdmlydHVhbCBTTUxvYyBnZXRTdGFydExvYygpIGNvbnN0OworICAvLy8gZ2V0RW5kTG9jIC0gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCB0b2tlbiBvZiB0aGlzIG9wZXJhbmQuCisgIHZpcnR1YWwgU01Mb2MgZ2V0RW5kTG9jKCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5OTczNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb24uaApAQCAtMCwwICsxLDY5IEBACisvLz09PS0gTUNTZWN0aW9uLmggLSBNYWNoaW5lIENvZGUgU2VjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTUNTZWN0aW9uIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NFQ1RJT05fSAorI2RlZmluZSBMTFZNX01DX01DU0VDVElPTl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TZWN0aW9uS2luZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTUNDb250ZXh0OworICBjbGFzcyBNQ0FzbUluZm87CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIC8vLyBNQ1NlY3Rpb24gLSBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB1bmlxdWVkIGlkZW50aWZpZXIgZm9yIGEKKyAgLy8vIHNlY3Rpb24gaW4gdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4gIFRoZSBNQ0NvbnRleHQgY2xhc3MgdW5pcXVlcyBhbmQKKyAgLy8vIGNyZWF0ZXMgdGhlc2UuCisgIGNsYXNzIE1DU2VjdGlvbiB7CisgIHB1YmxpYzoKKyAgICBlbnVtIFNlY3Rpb25WYXJpYW50IHsKKyAgICAgIFNWX0NPRkYgPSAwLAorICAgICAgU1ZfRUxGLAorICAgICAgU1ZfTWFjaE8sCisgICAgICBTVl9QSUMxNgorICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBNQ1NlY3Rpb24oY29uc3QgTUNTZWN0aW9uJik7ICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1DU2VjdGlvbiYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHByb3RlY3RlZDoKKyAgICBNQ1NlY3Rpb24oU2VjdGlvblZhcmlhbnQgViwgU2VjdGlvbktpbmQgSykgOiBWYXJpYW50KFYpLCBLaW5kKEspIHt9CisgICAgU2VjdGlvblZhcmlhbnQgVmFyaWFudDsKKyAgICBTZWN0aW9uS2luZCBLaW5kOworICBwdWJsaWM6CisgICAgdmlydHVhbCB+TUNTZWN0aW9uKCk7CisKKyAgICBTZWN0aW9uS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgICAgU2VjdGlvblZhcmlhbnQgZ2V0VmFyaWFudCgpIGNvbnN0IHsgcmV0dXJuIFZhcmlhbnQ7IH0KKworICAgIHZpcnR1YWwgdm9pZCBQcmludFN3aXRjaFRvU2VjdGlvbihjb25zdCBNQ0FzbUluZm8gJk1BSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSBjb25zdCA9IDA7CisKKyAgICAvLy8gaXNCYXNlQWRkcmVzc0tub3duWmVybyAtIFJldHVybiB0cnVlIGlmIHdlIGtub3cgdGhhdCB0aGlzIHNlY3Rpb24gd2lsbAorICAgIC8vLyBnZXQgYSBiYXNlIGFkZHJlc3Mgb2YgemVyby4gIEluIGNhc2VzIHdoZXJlIHdlIGtub3cgdGhhdCB0aGlzIGlzIHRydWUgd2UKKyAgICAvLy8gY2FuIGVtaXQgc2VjdGlvbiBvZmZzZXRzIGFzIGRpcmVjdCByZWZlcmVuY2VzIHRvIGF2b2lkIGEgc3VidHJhY3Rpb24KKyAgICAvLy8gZnJvbSB0aGUgYmFzZSBvZiB0aGUgc2VjdGlvbiwgc2F2aW5nIGEgcmVsb2NhdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wgaXNCYXNlQWRkcmVzc0tub3duWmVybygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DU2VjdGlvbiAqKSB7IHJldHVybiB0cnVlOyB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbkNPRkYuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25DT0ZGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyOGUxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25DT0ZGLmgKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tIE1DU2VjdGlvbkNPRkYuaCAtIENPRkYgTWFjaGluZSBDb2RlIFNlY3Rpb25zIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1DU2VjdGlvbkNPRkYgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DU0VDVElPTkNPRkZfSAorI2RlZmluZSBMTFZNX01DX01DU0VDVElPTkNPRkZfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DT0ZGLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgCisvLy8gTUNTZWN0aW9uQ09GRiAtIFRoaXMgcmVwcmVzZW50cyBhIHNlY3Rpb24gb24gV2luZG93cworICBjbGFzcyBNQ1NlY3Rpb25DT0ZGIDogcHVibGljIE1DU2VjdGlvbiB7CisgICAgLy8gVGhlIG1lbW9yeSBmb3IgdGhpcyBzdHJpbmcgaXMgc3RvcmVkIGluIHRoZSBzYW1lIE1DQ29udGV4dCBhcyAqdGhpcy4KKyAgICBTdHJpbmdSZWYgU2VjdGlvbk5hbWU7CisgICAgCisgICAgLy8vIENoYXJhY3RlcmlzdGljcyAtIFRoaXMgaXMgdGhlIENoYXJhY3RlcmlzdGljcyBmaWVsZCBvZiBhIHNlY3Rpb24sCisgICAgLy8gIGRyYXduIGZyb20gdGhlIGVudW1zIGJlbG93LgorICAgIHVuc2lnbmVkIENoYXJhY3RlcmlzdGljczsKKworICAgIC8vLyBTZWxlY3Rpb24gLSBUaGlzIGlzIHRoZSBTZWxlY3Rpb24gZmllbGQgZm9yIHRoZSBzZWN0aW9uIHN5bWJvbCwgaWYKKyAgICAvLy8gaXQgaXMgYSBDT01EQVQgc2VjdGlvbiAoQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfU0NOX0xOS19DT01EQVQpICE9IDAKKyAgICBpbnQgU2VsZWN0aW9uOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIE1DQ29udGV4dDsKKyAgICBNQ1NlY3Rpb25DT0ZGKFN0cmluZ1JlZiBTZWN0aW9uLCB1bnNpZ25lZCBDaGFyYWN0ZXJpc3RpY3MsCisgICAgICAgICAgICAgICAgICBpbnQgU2VsZWN0aW9uLCBTZWN0aW9uS2luZCBLKQorICAgICAgOiBNQ1NlY3Rpb24oU1ZfQ09GRiwgSyksIFNlY3Rpb25OYW1lKFNlY3Rpb24pLAorICAgICAgICBDaGFyYWN0ZXJpc3RpY3MoQ2hhcmFjdGVyaXN0aWNzKSwgU2VsZWN0aW9uIChTZWxlY3Rpb24pIHsKKyAgICAgIGFzc2VydCAoKENoYXJhY3RlcmlzdGljcyAmIDB4MDBGMDAwMDApID09IDAgJiYKKyAgICAgICAgImFsaWdubWVudCBtdXN0IG5vdCBiZSBzZXQgdXBvbiBzZWN0aW9uIGNyZWF0aW9uIik7CisgICAgfQorICAgIH5NQ1NlY3Rpb25DT0ZGKCk7CisKKyAgcHVibGljOgorICAgIC8vLyBTaG91bGRPbWl0U2VjdGlvbkRpcmVjdGl2ZSAtIERlY2lkZXMgd2hldGhlciBhICcuc2VjdGlvbicgZGlyZWN0aXZlCisgICAgLy8vIHNob3VsZCBiZSBwcmludGVkIGJlZm9yZSB0aGUgc2VjdGlvbiBuYW1lCisgICAgYm9vbCBTaG91bGRPbWl0U2VjdGlvbkRpcmVjdGl2ZShTdHJpbmdSZWYgTmFtZSwgY29uc3QgTUNBc21JbmZvICZNQUkpIGNvbnN0OworCisgICAgU3RyaW5nUmVmIGdldFNlY3Rpb25OYW1lKCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbk5hbWU7IH0KKyAgICB1bnNpZ25lZCBnZXRDaGFyYWN0ZXJpc3RpY3MoKSBjb25zdCB7IHJldHVybiBDaGFyYWN0ZXJpc3RpY3M7IH0KKyAgICBpbnQgZ2V0U2VsZWN0aW9uICgpIGNvbnN0IHsgcmV0dXJuIFNlbGVjdGlvbjsgfQorICAgIAorICAgIHZpcnR1YWwgdm9pZCBQcmludFN3aXRjaFRvU2VjdGlvbihjb25zdCBNQ0FzbUluZm8gJk1BSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNTZWN0aW9uICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0VmFyaWFudCgpID09IFNWX0NPRkY7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNTZWN0aW9uQ09GRiAqKSB7IHJldHVybiB0cnVlOyB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbkVMRi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbkVMRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZTgxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uRUxGLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8vPT09LSBNQ1NlY3Rpb25FTEYuaCAtIEVMRiBNYWNoaW5lIENvZGUgU2VjdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNQ1NlY3Rpb25FTEYgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DU0VDVElPTkVMRl9ICisjZGVmaW5lIExMVk1fTUNfTUNTRUNUSU9ORUxGX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgCisvLy8gTUNTZWN0aW9uRUxGIC0gVGhpcyByZXByZXNlbnRzIGEgc2VjdGlvbiBvbiBsaW51eCwgbG90cyBvZiB1bml4IHZhcmlhbnRzCisvLy8gYW5kIHNvbWUgYmFyZSBtZXRhbCBzeXN0ZW1zLgorY2xhc3MgTUNTZWN0aW9uRUxGIDogcHVibGljIE1DU2VjdGlvbiB7CisgIC8vLyBTZWN0aW9uTmFtZSAtIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24uICBUaGUgcmVmZXJlbmNlZCBtZW1vcnkgaXMKKyAgLy8vIG93bmVkIGJ5IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRidzIEVMRlVuaXF1ZU1hcC4KKyAgU3RyaW5nUmVmIFNlY3Rpb25OYW1lOworICAKKyAgLy8vIFR5cGUgLSBUaGlzIGlzIHRoZSBzaF90eXBlIGZpZWxkIG9mIGEgc2VjdGlvbiwgZHJhd24gZnJvbSB0aGUgZW51bXMgYmVsb3cuCisgIHVuc2lnbmVkIFR5cGU7CisgIAorICAvLy8gRmxhZ3MgLSBUaGlzIGlzIHRoZSBzaF9mbGFncyBmaWVsZCBvZiBhIHNlY3Rpb24sIGRyYXduIGZyb20gdGhlIGVudW1zLgorICAvLy8gYmVsb3cuCisgIHVuc2lnbmVkIEZsYWdzOworCisgIC8vLyBJc0V4cGxpY2l0IC0gSW5kaWNhdGVzIHRoYXQgdGhpcyBzZWN0aW9uIGNvbWVzIGZyb20gZ2xvYmFscyB3aXRoIGFuCisgIC8vLyBleHBsaWNpdCBzZWN0aW9uIHNwZWNpZmllZC4KKyAgYm9vbCBJc0V4cGxpY2l0OworICAKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNQ0NvbnRleHQ7CisgIE1DU2VjdGlvbkVMRihTdHJpbmdSZWYgU2VjdGlvbiwgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgZmxhZ3MsCisgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLLCBib29sIGlzRXhwbGljaXQpCisgICAgOiBNQ1NlY3Rpb24oU1ZfRUxGLCBLKSwgU2VjdGlvbk5hbWUoU2VjdGlvbiksIFR5cGUodHlwZSksIEZsYWdzKGZsYWdzKSwKKyAgICAgIElzRXhwbGljaXQoaXNFeHBsaWNpdCkge30KKyAgfk1DU2VjdGlvbkVMRigpOworcHVibGljOgorCisgIC8vLyBTaG91bGRPbWl0U2VjdGlvbkRpcmVjdGl2ZSAtIERlY2lkZXMgd2hldGhlciBhICcuc2VjdGlvbicgZGlyZWN0aXZlCisgIC8vLyBzaG91bGQgYmUgcHJpbnRlZCBiZWZvcmUgdGhlIHNlY3Rpb24gbmFtZQorICBib29sIFNob3VsZE9taXRTZWN0aW9uRGlyZWN0aXZlKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBNQ0FzbUluZm8gJk1BSSkgY29uc3Q7CisKKyAgLy8vIFNob3VsZFByaW50U2VjdGlvblR5cGUgLSBPbmx5IHByaW50cyB0aGUgc2VjdGlvbiB0eXBlIGlmIHN1cHBvcnRlZAorICBib29sIFNob3VsZFByaW50U2VjdGlvblR5cGUodW5zaWduZWQgVHkpIGNvbnN0OworCisgIC8vLyBIYXNDb21tb25TeW1ib2xzIC0gVHJ1ZSBpZiB0aGlzIHNlY3Rpb24gaG9sZHMgY29tbW9uIHN5bWJvbHMsIHRoaXMgaXMKKyAgLy8vIGluZGljYXRlZCBvbiB0aGUgRUxGIG9iamVjdCBmaWxlIGJ5IGEgc3ltYm9sIHdpdGggU0hOX0NPTU1PTiBzZWN0aW9uIAorICAvLy8gaGVhZGVyIGluZGV4LgorICBib29sIEhhc0NvbW1vblN5bWJvbHMoKSBjb25zdDsKKyAgCisgIC8vLyBUaGVzZSBhcmUgdGhlIHNlY3Rpb24gdHlwZSBhbmQgZmxhZ3MgZmllbGRzLiAgQW4gRUxGIHNlY3Rpb24gY2FuIGhhdmUKKyAgLy8vIG9ubHkgb25lIFR5cGUsIGJ1dCBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIG9mIHRoZSBmbGFncyBzcGVjaWZpZWQuCisgIC8vLworICAvLy8gVmFsaWQgc2VjdGlvbiB0eXBlcy4KKyAgZW51bSB7CisgICAgLy8gVGhpcyB2YWx1ZSBtYXJrcyB0aGUgc2VjdGlvbiBoZWFkZXIgYXMgaW5hY3RpdmUuCisgICAgU0hUX05VTEwgICAgICAgICAgICAgPSAweDAwVSwKKworICAgIC8vIEhvbGRzIGluZm9ybWF0aW9uIGRlZmluZWQgYnkgdGhlIHByb2dyYW0sIHdpdGggY3VzdG9tIGZvcm1hdCBhbmQgbWVhbmluZy4KKyAgICBTSFRfUFJPR0JJVFMgICAgICAgICA9IDB4MDFVLAorCisgICAgLy8gVGhpcyBzZWN0aW9uIGhvbGRzIGEgc3ltYm9sIHRhYmxlLgorICAgIFNIVF9TWU1UQUIgICAgICAgICAgID0gMHgwMlUsCisKKyAgICAvLyBUaGUgc2VjdGlvbiBob2xkcyBhIHN0cmluZyB0YWJsZS4KKyAgICBTSFRfU1RSVEFCICAgICAgICAgICA9IDB4MDNVLAorCisgICAgLy8gVGhlIHNlY3Rpb24gaG9sZHMgcmVsb2NhdGlvbiBlbnRyaWVzIHdpdGggZXhwbGljaXQgYWRkZW5kcy4KKyAgICBTSFRfUkVMQSAgICAgICAgICAgICA9IDB4MDRVLAorCisgICAgLy8gVGhlIHNlY3Rpb24gaG9sZHMgYSBzeW1ib2wgaGFzaCB0YWJsZS4KKyAgICBTSFRfSEFTSCAgICAgICAgICAgICA9IDB4MDVVLAorICAgIAorICAgIC8vIEluZm9ybWF0aW9uIGZvciBkeW5hbWljIGxpbmtpbmcuCisgICAgU0hUX0RZTkFNSUMgICAgICAgICAgPSAweDA2VSwKKworICAgIC8vIFRoZSBzZWN0aW9uIGhvbGRzIGluZm9ybWF0aW9uIHRoYXQgbWFya3MgdGhlIGZpbGUgaW4gc29tZSB3YXkuCisgICAgU0hUX05PVEUgICAgICAgICAgICAgPSAweDA3VSwKKworICAgIC8vIEEgc2VjdGlvbiBvZiB0aGlzIHR5cGUgb2NjdXBpZXMgbm8gc3BhY2UgaW4gdGhlIGZpbGUuCisgICAgU0hUX05PQklUUyAgICAgICAgICAgPSAweDA4VSwKKworICAgIC8vIFRoZSBzZWN0aW9uIGhvbGRzIHJlbG9jYXRpb24gZW50cmllcyB3aXRob3V0IGV4cGxpY2l0IGFkZGVuZHMuCisgICAgU0hUX1JFTCAgICAgICAgICAgICAgPSAweDA5VSwKKworICAgIC8vIFRoaXMgc2VjdGlvbiB0eXBlIGlzIHJlc2VydmVkIGJ1dCBoYXMgdW5zcGVjaWZpZWQgc2VtYW50aWNzLiAKKyAgICBTSFRfU0hMSUIgICAgICAgICAgICA9IDB4MEFVLAorCisgICAgLy8gVGhpcyBzZWN0aW9uIGhvbGRzIGEgc3ltYm9sIHRhYmxlLgorICAgIFNIVF9EWU5TWU0gICAgICAgICAgID0gMHgwQlUsCisKKyAgICAvLyBUaGlzIHNlY3Rpb24gY29udGFpbnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorICAgIFNIVF9JTklUX0FSUkFZICAgICAgID0gMHgwRVUsCisKKyAgICAvLyBUaGlzIHNlY3Rpb24gY29udGFpbnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGVybWluYXRpb24gZnVuY3Rpb25zLgorICAgIFNIVF9GSU5JX0FSUkFZICAgICAgID0gMHgwRlUsCisKKyAgICAvLyBUaGlzIHNlY3Rpb24gY29udGFpbnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHRoYXQgYXJlIGludm9rZWQKKyAgICAvLyBiZWZvcmUgYWxsIG90aGVyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KKyAgICBTSFRfUFJFSU5JVF9BUlJBWSAgICA9IDB4MTBVLAorCisgICAgLy8gQSBzZWN0aW9uIGdyb3VwIGlzIGEgc2V0IG9mIHNlY3Rpb25zIHRoYXQgYXJlIHJlbGF0ZWQgYW5kIHRoYXQgbXVzdCBiZQorICAgIC8vIHRyZWF0ZWQgc3BlY2lhbGx5IGJ5IHRoZSBsaW5rZXIuCisgICAgU0hUX0dST1VQICAgICAgICAgICAgPSAweDExVSwKKworICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uIG9mIHR5cGUgU0hUX1NZTVRBQiwgd2hlbiB0aGUKKyAgICAvLyByZWZlcmVuY2VkIHN5bWJvbCB0YWJsZSBjb250YWluIHRoZSBlc2NhcGUgdmFsdWUgU0hOX1hJTkRFWAorICAgIFNIVF9TWU1UQUJfU0hORFggICAgID0gMHgxMlUsCisKKyAgICBMQVNUX0tOT1dOX1NFQ1RJT05fVFlQRSA9IFNIVF9TWU1UQUJfU0hORFgKKyAgfTsgCisKKyAgLy8vIFZhbGlkIHNlY3Rpb24gZmxhZ3MuCisgIGVudW0geworICAgIC8vIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgdGhhdCBzaG91bGQgYmUgd3JpdGFibGUuCisgICAgU0hGX1dSSVRFICAgICAgICAgICAgPSAweDFVLAorCisgICAgLy8gVGhlIHNlY3Rpb24gb2NjdXBpZXMgbWVtb3J5IGR1cmluZyBleGVjdXRpb24uCisgICAgU0hGX0FMTE9DICAgICAgICAgICAgPSAweDJVLAorCisgICAgLy8gVGhlIHNlY3Rpb24gY29udGFpbnMgZXhlY3V0YWJsZSBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgICBTSEZfRVhFQ0lOU1RSICAgICAgICA9IDB4NFUsCisKKyAgICAvLyBUaGUgZGF0YSBpbiB0aGUgc2VjdGlvbiBtYXkgYmUgbWVyZ2VkIHRvIGVsaW1pbmF0ZSBkdXBsaWNhdGlvbi4KKyAgICBTSEZfTUVSR0UgICAgICAgICAgICA9IDB4MTBVLAorCisgICAgLy8gRWxlbWVudHMgaW4gdGhlIHNlY3Rpb24gY29uc2lzdCBvZiBudWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyIHN0cmluZ3MuCisgICAgU0hGX1NUUklOR1MgICAgICAgICAgPSAweDIwVSwKKworICAgIC8vIEEgZmllbGQgaW4gdGhpcyBzZWN0aW9uIGhvbGRzIGEgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW5kZXguCisgICAgU0hGX0lORk9fTElOSyAgICAgICAgPSAweDQwVSwKKworICAgIC8vIEFkZHMgc3BlY2lhbCBvcmRlcmluZyByZXF1aXJlbWVudHMgZm9yIGxpbmsgZWRpdG9ycy4KKyAgICBTSEZfTElOS19PUkRFUiAgICAgICA9IDB4ODBVLAorCisgICAgLy8gVGhpcyBzZWN0aW9uIHJlcXVpcmVzIHNwZWNpYWwgT1Mtc3BlY2lmaWMgcHJvY2Vzc2luZyB0byBhdm9pZCBpbmNvcnJlY3QKKyAgICAvLyBiZWhhdmlvci4KKyAgICBTSEZfT1NfTk9OQ09ORk9STUlORyA9IDB4MTAwVSwKKworICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBhIG1lbWJlciBvZiBhIHNlY3Rpb24gZ3JvdXAuCisgICAgU0hGX0dST1VQICAgICAgICAgICAgPSAweDIwMFUsCisKKyAgICAvLyBUaGlzIHNlY3Rpb24gaG9sZHMgVGhyZWFkLUxvY2FsIFN0b3JhZ2UuCisgICAgU0hGX1RMUyAgICAgICAgICAgICAgPSAweDQwMFUsCisKKyAgICAKKyAgICAvLyBTdGFydCBvZiB0YXJnZXQtc3BlY2lmaWMgZmxhZ3MuCisKKyAgICAvLy8gWENPUkVfU0hGX0NQX1NFQ1RJT04gLSBBbGwgc2VjdGlvbnMgd2l0aCB0aGUgImMiIGZsYWcgYXJlIGdyb3VwZWQKKyAgICAvLy8gdG9nZXRoZXIgYnkgdGhlIGxpbmtlciB0byBmb3JtIHRoZSBjb25zdGFudCBwb29sIGFuZCB0aGUgY3AgcmVnaXN0ZXIgaXMKKyAgICAvLy8gc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgY29uc3RhbnQgcG9vbCBieSB0aGUgYm9vdCBjb2RlLgorICAgIFhDT1JFX1NIRl9DUF9TRUNUSU9OID0gMHg4MDBVLAorICAgIAorICAgIC8vLyBYQ09SRV9TSEZfRFBfU0VDVElPTiAtIEFsbCBzZWN0aW9ucyB3aXRoIHRoZSAiZCIgZmxhZyBhcmUgZ3JvdXBlZAorICAgIC8vLyB0b2dldGhlciBieSB0aGUgbGlua2VyIHRvIGZvcm0gdGhlIGRhdGEgc2VjdGlvbiBhbmQgdGhlIGRwIHJlZ2lzdGVyIGlzCisgICAgLy8vIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gYnkgdGhlIGJvb3QgY29kZS4KKyAgICBYQ09SRV9TSEZfRFBfU0VDVElPTiA9IDB4MTAwMFUKKyAgfTsKKworICBTdHJpbmdSZWYgZ2V0U2VjdGlvbk5hbWUoKSBjb25zdCB7IHJldHVybiBTZWN0aW9uTmFtZTsgfQorICB1bnNpZ25lZCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICB1bnNpZ25lZCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzOyB9CisgIAorICB2b2lkIFByaW50U3dpdGNoVG9TZWN0aW9uKGNvbnN0IE1DQXNtSW5mbyAmTUFJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIAorICAvLy8gaXNCYXNlQWRkcmVzc0tub3duWmVybyAtIFdlIGtub3cgdGhhdCBub24tYWxsb2NhdGFibGUgc2VjdGlvbnMgKGxpa2UKKyAgLy8vIGRlYnVnIGluZm8pIGhhdmUgYSBiYXNlIG9mIHplcm8uCisgIHZpcnR1YWwgYm9vbCBpc0Jhc2VBZGRyZXNzS25vd25aZXJvKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIFNIRl9BTExPQykgPT0gMDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmdldFZhcmlhbnQoKSA9PSBTVl9FTEY7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ1NlY3Rpb25FTEYgKikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uTWFjaE8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25NYWNoTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOWQxMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uTWFjaE8uaApAQCAtMCwwICsxLDE3NyBAQAorLy89PT0tIE1DU2VjdGlvbk1hY2hPLmggLSBNYWNoTyBNYWNoaW5lIENvZGUgU2VjdGlvbnMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1DU2VjdGlvbk1hY2hPIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NFQ1RJT05NQUNIT19ICisjZGVmaW5lIExMVk1fTUNfTUNTRUNUSU9OTUFDSE9fSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworICAKKy8vLyBNQ1NlY3Rpb25NYWNoTyAtIFRoaXMgcmVwcmVzZW50cyBhIHNlY3Rpb24gb24gYSBNYWNoLU8gc3lzdGVtICh1c2VkIGJ5CisvLy8gTWFjIE9TIFgpLiAgT24gYSBNYWMgc3lzdGVtLCB0aGVzZSBhcmUgYWxzbyBkZXNjcmliZWQgaW4KKy8vLyAvdXNyL2luY2x1ZGUvbWFjaC1vL2xvYWRlci5oLgorY2xhc3MgTUNTZWN0aW9uTWFjaE8gOiBwdWJsaWMgTUNTZWN0aW9uIHsKKyAgY2hhciBTZWdtZW50TmFtZVsxNl07ICAvLyBOb3QgbmVjZXNzYXJpbHkgbnVsbCB0ZXJtaW5hdGVkIQorICBjaGFyIFNlY3Rpb25OYW1lWzE2XTsgIC8vIE5vdCBuZWNlc3NhcmlseSBudWxsIHRlcm1pbmF0ZWQhCisgIAorICAvLy8gVHlwZUFuZEF0dHJpYnV0ZXMgLSBUaGlzIGlzIHRoZSBTRUNUSU9OX1RZUEUgYW5kIFNFQ1RJT05fQVRUUklCVVRFUworICAvLy8gZmllbGQgb2YgYSBzZWN0aW9uLCBkcmF3biBmcm9tIHRoZSBlbnVtcyBiZWxvdy4KKyAgdW5zaWduZWQgVHlwZUFuZEF0dHJpYnV0ZXM7CisgIAorICAvLy8gUmVzZXJ2ZWQyIC0gVGhlICdyZXNlcnZlZDInIGZpZWxkIG9mIGEgc2VjdGlvbiwgdXNlZCB0byByZXByZXNlbnQgdGhlCisgIC8vLyBzaXplIG9mIHN0dWJzLCBmb3IgZXhhbXBsZS4KKyAgdW5zaWduZWQgUmVzZXJ2ZWQyOworICAKKyAgTUNTZWN0aW9uTWFjaE8oU3RyaW5nUmVmIFNlZ21lbnQsIFN0cmluZ1JlZiBTZWN0aW9uLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUQUEsIHVuc2lnbmVkIHJlc2VydmVkMiwgU2VjdGlvbktpbmQgSyk7ICAKKyAgZnJpZW5kIGNsYXNzIE1DQ29udGV4dDsKK3B1YmxpYzoKKyAgCisgIC8vLyBUaGVzZSBhcmUgdGhlIHNlY3Rpb24gdHlwZSBhbmQgYXR0cmlidXRlcyBmaWVsZHMuICBBIE1hY2hPIHNlY3Rpb24gY2FuCisgIC8vLyBoYXZlIG9ubHkgb25lIFR5cGUsIGJ1dCBjYW4gaGF2ZSBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkLgorICBlbnVtIHsKKyAgICAvLyBUeXBlQW5kQXR0cmlidXRlcyBiaXRtYXNrcy4KKyAgICBTRUNUSU9OX1RZUEUgICAgICAgPSAweDAwMDAwMEZGVSwKKyAgICBTRUNUSU9OX0FUVFJJQlVURVMgPSAweEZGRkZGRjAwVSwKKyAgICAKKyAgICAvLyBWYWxpZCBzZWN0aW9uIHR5cGVzLgorICAgIAorICAgIC8vLyBTX1JFR1VMQVIgLSBSZWd1bGFyIHNlY3Rpb24uCisgICAgU19SRUdVTEFSICAgICAgICAgICAgICAgICAgICA9IDB4MDBVLAorICAgIC8vLyBTX1pFUk9GSUxMIC0gWmVybyBmaWxsIG9uIGRlbWFuZCBzZWN0aW9uLgorICAgIFNfWkVST0ZJTEwgICAgICAgICAgICAgICAgICAgPSAweDAxVSwKKyAgICAvLy8gU19DU1RSSU5HX0xJVEVSQUxTIC0gU2VjdGlvbiB3aXRoIGxpdGVyYWwgQyBzdHJpbmdzLgorICAgIFNfQ1NUUklOR19MSVRFUkFMUyAgICAgICAgICAgPSAweDAyVSwKKyAgICAvLy8gU180QllURV9MSVRFUkFMUyAtIFNlY3Rpb24gd2l0aCA0IGJ5dGUgbGl0ZXJhbHMuCisgICAgU180QllURV9MSVRFUkFMUyAgICAgICAgICAgICA9IDB4MDNVLAorICAgIC8vLyBTXzhCWVRFX0xJVEVSQUxTIC0gU2VjdGlvbiB3aXRoIDggYnl0ZSBsaXRlcmFscy4KKyAgICBTXzhCWVRFX0xJVEVSQUxTICAgICAgICAgICAgID0gMHgwNFUsCisgICAgLy8vIFNfTElURVJBTF9QT0lOVEVSUyAtIFNlY3Rpb24gd2l0aCBwb2ludGVycyB0byBsaXRlcmFscy4KKyAgICBTX0xJVEVSQUxfUE9JTlRFUlMgICAgICAgICAgID0gMHgwNVUsCisgICAgLy8vIFNfTk9OX0xBWllfU1lNQk9MX1BPSU5URVJTIC0gU2VjdGlvbiB3aXRoIG5vbi1sYXp5IHN5bWJvbCBwb2ludGVycy4KKyAgICBTX05PTl9MQVpZX1NZTUJPTF9QT0lOVEVSUyAgID0gMHgwNlUsCisgICAgLy8vIFNfTEFaWV9TWU1CT0xfUE9JTlRFUlMgLSBTZWN0aW9uIHdpdGggbGF6eSBzeW1ib2wgcG9pbnRlcnMuCisgICAgU19MQVpZX1NZTUJPTF9QT0lOVEVSUyAgICAgICA9IDB4MDdVLAorICAgIC8vLyBTX1NZTUJPTF9TVFVCUyAtIFNlY3Rpb24gd2l0aCBzeW1ib2wgc3R1YnMsIGJ5dGUgc2l6ZSBvZiBzdHViIGluCisgICAgLy8vIHRoZSBSZXNlcnZlZDIgZmllbGQuCisgICAgU19TWU1CT0xfU1RVQlMgICAgICAgICAgICAgICA9IDB4MDhVLAorICAgIC8vLyBTX1NZTUJPTF9TVFVCUyAtIFNlY3Rpb24gd2l0aCBvbmx5IGZ1bmN0aW9uIHBvaW50ZXJzIGZvcgorICAgIC8vLyBpbml0aWFsaXphdGlvbi4KKyAgICBTX01PRF9JTklUX0ZVTkNfUE9JTlRFUlMgICAgID0gMHgwOVUsCisgICAgLy8vIFNfTU9EX0lOSVRfRlVOQ19QT0lOVEVSUyAtIFNlY3Rpb24gd2l0aCBvbmx5IGZ1bmN0aW9uIHBvaW50ZXJzIGZvcgorICAgIC8vLyB0ZXJtaW5hdGlvbi4KKyAgICBTX01PRF9URVJNX0ZVTkNfUE9JTlRFUlMgICAgID0gMHgwQVUsCisgICAgLy8vIFNfQ09BTEVTQ0VEIC0gU2VjdGlvbiBjb250YWlucyBzeW1ib2xzIHRoYXQgYXJlIHRvIGJlIGNvYWxlc2NlZC4KKyAgICBTX0NPQUxFU0NFRCAgICAgICAgICAgICAgICAgID0gMHgwQlUsCisgICAgLy8vIFNfR0JfWkVST0ZJTEwgLSBaZXJvIGZpbGwgb24gZGVtYW5kIHNlY3Rpb24gKHRoYXQgY2FuIGJlIGxhcmdlciB0aGFuIDQKKyAgICAvLy8gZ2lnYWJ5dGVzKS4KKyAgICBTX0dCX1pFUk9GSUxMICAgICAgICAgICAgICAgID0gMHgwQ1UsCisgICAgLy8vIFNfSU5URVJQT1NJTkcgLSBTZWN0aW9uIHdpdGggb25seSBwYWlycyBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IKKyAgICAvLy8gaW50ZXJwb3NpbmcuCisgICAgU19JTlRFUlBPU0lORyAgICAgICAgICAgICAgICA9IDB4MERVLAorICAgIC8vLyBTXzE2QllURV9MSVRFUkFMUyAtIFNlY3Rpb24gd2l0aCBvbmx5IDE2IGJ5dGUgbGl0ZXJhbHMuCisgICAgU18xNkJZVEVfTElURVJBTFMgICAgICAgICAgICA9IDB4MEVVLAorICAgIC8vLyBTX0RUUkFDRV9ET0YgLSBTZWN0aW9uIGNvbnRhaW5zIERUcmFjZSBPYmplY3QgRm9ybWF0LgorICAgIFNfRFRSQUNFX0RPRiAgICAgICAgICAgICAgICAgPSAweDBGVSwKKyAgICAvLy8gU19MQVpZX0RZTElCX1NZTUJPTF9QT0lOVEVSUyAtIFNlY3Rpb24gd2l0aCBsYXp5IHN5bWJvbCBwb2ludGVycyB0bworICAgIC8vLyBsYXp5IGxvYWRlZCBkeWxpYnMuCisgICAgU19MQVpZX0RZTElCX1NZTUJPTF9QT0lOVEVSUyA9IDB4MTBVLAorICAgIC8vLyBTX1RIUkVBRF9MT0NBTF9SRUdVTEFSIC0gU2VjdGlvbiB3aXRoIC4uLi4KKyAgICBTX1RIUkVBRF9MT0NBTF9SRUdVTEFSID0gMHgxMVUsCisgICAgLy8vIFNfVEhSRUFEX0xPQ0FMX1pFUk9GSUxMIC0gVGhyZWFkIGxvY2FsIHplcm9maWxsIHNlY3Rpb24uCisgICAgU19USFJFQURfTE9DQUxfWkVST0ZJTEwgPSAweDEyVSwKKyAgICAvLy8gU19USFJFQURfTE9DQUxfVkFSSUFCTEVTIC0gU2VjdGlvbiB3aXRoIHRocmVhZCBsb2NhbCB2YXJpYWJsZSBzdHJ1Y3R1cmUKKyAgICAvLy8gZGF0YS4KKyAgICBTX1RIUkVBRF9MT0NBTF9WQVJJQUJMRVMgPSAweDEzVSwKKyAgICAvLy8gU19USFJFQURfTE9DQUxfVkFSSUFCTEVfUE9JTlRFUlMgLSBTZWN0aW9uIHdpdGggLi4uLgorICAgIFNfVEhSRUFEX0xPQ0FMX1ZBUklBQkxFX1BPSU5URVJTID0gMHgxNFUsCisgICAgLy8vIFNfVEhSRUFEX0xPQ0FMX0lOSVRfRlVOQ1RJT05fUE9JTlRFUlMgLSBTZWN0aW9uIHdpdGggdGhyZWFkIGxvY2FsCisgICAgLy8vIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucy4KKyAgICBTX1RIUkVBRF9MT0NBTF9JTklUX0ZVTkNUSU9OX1BPSU5URVJTID0gMHgxNVUsCisKKyAgICBMQVNUX0tOT1dOX1NFQ1RJT05fVFlQRSA9IFNfVEhSRUFEX0xPQ0FMX0lOSVRfRlVOQ1RJT05fUE9JTlRFUlMsCisgICAgCisKKyAgICAvLyBWYWxpZCBzZWN0aW9uIGF0dHJpYnV0ZXMuCisgICAgCisgICAgLy8vIFNfQVRUUl9QVVJFX0lOU1RSVUNUSU9OUyAtIFNlY3Rpb24gY29udGFpbnMgb25seSB0cnVlIG1hY2hpbmUKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zLgorICAgIFNfQVRUUl9QVVJFX0lOU1RSVUNUSU9OUyAgID0gMVUgPDwgMzEsCisgICAgLy8vIFNfQVRUUl9OT19UT0MgLSBTZWN0aW9uIGNvbnRhaW5zIGNvYWxlc2NlZCBzeW1ib2xzIHRoYXQgYXJlIG5vdCB0byBiZQorICAgIC8vLyBpbiBhIHJhbmxpYiB0YWJsZSBvZiBjb250ZW50cy4KKyAgICBTX0FUVFJfTk9fVE9DICAgICAgICAgICAgICA9IDFVIDw8IDMwLAorICAgIC8vLyBTX0FUVFJfU1RSSVBfU1RBVElDX1NZTVMgLSBPayB0byBzdHJpcCBzdGF0aWMgc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24KKyAgICAvLy8gaW4gZmlsZXMgd2l0aCB0aGUgTVlfRFlMRExJTksgZmxhZy4KKyAgICBTX0FUVFJfU1RSSVBfU1RBVElDX1NZTVMgICA9IDFVIDw8IDI5LAorICAgIC8vLyBTX0FUVFJfTk9fREVBRF9TVFJJUCAtIE5vIGRlYWQgc3RyaXBwaW5nLgorICAgIFNfQVRUUl9OT19ERUFEX1NUUklQICAgICAgID0gMVUgPDwgMjgsCisgICAgLy8vIFNfQVRUUl9MSVZFX1NVUFBPUlQgLSBCbG9ja3MgYXJlIGxpdmUgaWYgdGhleSByZWZlcmVuY2UgbGl2ZSBibG9ja3MuCisgICAgU19BVFRSX0xJVkVfU1VQUE9SVCAgICAgICAgPSAxVSA8PCAyNywKKyAgICAvLy8gU19BVFRSX1NFTEZfTU9ESUZZSU5HX0NPREUgLSBVc2VkIHdpdGggaTM4NiBjb2RlIHN0dWJzIHdyaXR0ZW4gb24gYnkKKyAgICAvLy8gZHlsZC4KKyAgICBTX0FUVFJfU0VMRl9NT0RJRllJTkdfQ09ERSA9IDFVIDw8IDI2LAorICAgIC8vLyBTX0FUVFJfREVCVUcgLSBBIGRlYnVnIHNlY3Rpb24uCisgICAgU19BVFRSX0RFQlVHICAgICAgICAgICAgICAgPSAxVSA8PCAyNSwKKyAgICAvLy8gU19BVFRSX1NPTUVfSU5TVFJVQ1RJT05TIC0gU2VjdGlvbiBjb250YWlucyBzb21lIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorICAgIFNfQVRUUl9TT01FX0lOU1RSVUNUSU9OUyAgID0gMVUgPDwgMTAsCisgICAgLy8vIFNfQVRUUl9FWFRfUkVMT0MgLSBTZWN0aW9uIGhhcyBleHRlcm5hbCByZWxvY2F0aW9uIGVudHJpZXMuCisgICAgU19BVFRSX0VYVF9SRUxPQyAgICAgICAgICAgPSAxVSA8PCA5LAorICAgIC8vLyBTX0FUVFJfTE9DX1JFTE9DIC0gU2VjdGlvbiBoYXMgbG9jYWwgcmVsb2NhdGlvbiBlbnRyaWVzLgorICAgIFNfQVRUUl9MT0NfUkVMT0MgICAgICAgICAgID0gMVUgPDwgOAorICB9OworCisgIFN0cmluZ1JlZiBnZXRTZWdtZW50TmFtZSgpIGNvbnN0IHsKKyAgICAvLyBTZWdtZW50TmFtZSBpcyBub3QgbmVjZXNzYXJpbHkgbnVsbCB0ZXJtaW5hdGVkIQorICAgIGlmIChTZWdtZW50TmFtZVsxNV0pCisgICAgICByZXR1cm4gU3RyaW5nUmVmKFNlZ21lbnROYW1lLCAxNik7CisgICAgcmV0dXJuIFN0cmluZ1JlZihTZWdtZW50TmFtZSk7CisgIH0KKyAgU3RyaW5nUmVmIGdldFNlY3Rpb25OYW1lKCkgY29uc3QgeworICAgIC8vIFNlY3Rpb25OYW1lIGlzIG5vdCBuZWNlc3NhcmlseSBudWxsIHRlcm1pbmF0ZWQhCisgICAgaWYgKFNlY3Rpb25OYW1lWzE1XSkKKyAgICAgIHJldHVybiBTdHJpbmdSZWYoU2VjdGlvbk5hbWUsIDE2KTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKFNlY3Rpb25OYW1lKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFR5cGVBbmRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gVHlwZUFuZEF0dHJpYnV0ZXM7IH0KKyAgdW5zaWduZWQgZ2V0U3R1YlNpemUoKSBjb25zdCB7IHJldHVybiBSZXNlcnZlZDI7IH0KKworICB1bnNpZ25lZCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZUFuZEF0dHJpYnV0ZXMgJiBTRUNUSU9OX1RZUEU7IH0KKyAgYm9vbCBoYXNBdHRyaWJ1dGUodW5zaWduZWQgVmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gKFR5cGVBbmRBdHRyaWJ1dGVzICYgVmFsdWUpICE9IDA7CisgIH0KKworICAvLy8gUGFyc2VTZWN0aW9uU3BlY2lmaWVyIC0gUGFyc2UgdGhlIHNlY3Rpb24gc3BlY2lmaWVyIGluZGljYXRlZCBieSAiU3BlYyIuCisgIC8vLyBUaGlzIGlzIGEgc3RyaW5nIHRoYXQgY2FuIGFwcGVhciBhZnRlciBhIC5zZWN0aW9uIGRpcmVjdGl2ZSBpbiBhIG1hY2gtbworICAvLy8gZmxhdm9yZWQgLnMgZmlsZS4gIElmIHN1Y2Nlc3NmdWwsIHRoaXMgZmlsbHMgaW4gdGhlIHNwZWNpZmllZCBPdXQKKyAgLy8vIHBhcmFtZXRlcnMgYW5kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiAgV2hlbiBhbiBpbnZhbGlkIHNlY3Rpb24KKyAgLy8vIHNwZWNpZmllciBpcyBwcmVzZW50LCB0aGlzIHJldHVybnMgYSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgcHJvYmxlbS4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFBhcnNlU2VjdGlvblNwZWNpZmllcihTdHJpbmdSZWYgU3BlYywgICAgICAgLy8gSW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZTZWdtZW50LCAgIC8vIE91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlNlY3Rpb24sICAgLy8gT3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAmVEFBLCAgICAgICAvLyBPdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICZTdHViU2l6ZSk7IC8vIE91dC4KKworICB2aXJ0dWFsIHZvaWQgUHJpbnRTd2l0Y2hUb1NlY3Rpb24oY29uc3QgTUNBc21JbmZvICZNQUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmdldFZhcmlhbnQoKSA9PSBTVl9NYWNoTzsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DU2VjdGlvbk1hY2hPICopIHsgcmV0dXJuIHRydWU7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DU3RyZWFtZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1N0cmVhbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2N2E5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1N0cmVhbWVyLmgKQEAgLTAsMCArMSwzNzAgQEAKKy8vPT09LSBNQ1N0cmVhbWVyLmggLSBIaWdoLWxldmVsIFN0cmVhbWluZyBNYWNoaW5lIENvZGUgT3V0cHV0IC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNQ1N0cmVhbWVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NUUkVBTUVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NUUkVBTUVSX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEaXJlY3RpdmVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTUNBc21JbmZvOworICBjbGFzcyBNQ0NvZGVFbWl0dGVyOworICBjbGFzcyBNQ0NvbnRleHQ7CisgIGNsYXNzIE1DRXhwcjsKKyAgY2xhc3MgTUNJbnN0OworICBjbGFzcyBNQ0luc3RQcmludGVyOworICBjbGFzcyBNQ1NlY3Rpb247CisgIGNsYXNzIE1DU3ltYm9sOworICBjbGFzcyBTdHJpbmdSZWY7CisgIGNsYXNzIFRhcmdldEFzbUJhY2tlbmQ7CisgIGNsYXNzIFR3aW5lOworICBjbGFzcyByYXdfb3N0cmVhbTsKKyAgY2xhc3MgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOworCisgIC8vLyBNQ1N0cmVhbWVyIC0gU3RyZWFtaW5nIG1hY2hpbmUgY29kZSBnZW5lcmF0aW9uIGludGVyZmFjZS4gIFRoaXMgaW50ZXJmYWNlCisgIC8vLyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgcHJvZ3JhbWF0aWMgaW50ZXJmYWNlIHRoYXQgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZQorICAvLy8gbGV2ZWwgdGhhdCBhbiBhc3NlbWJsZXIgLnMgZmlsZSBwcm92aWRlcy4gIEl0IGhhcyBjYWxsYmFja3MgdG8gZW1pdCBieXRlcywKKyAgLy8vIGhhbmRsZSBkaXJlY3RpdmVzLCBldGMuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgcmV0YWlucworICAvLy8gc3RhdGUgdG8ga25vdyB3aGF0IHRoZSBjdXJyZW50IHNlY3Rpb24gaXMgZXRjLgorICAvLy8KKyAgLy8vIFRoZXJlIGFyZSBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2U6IG9uZSBmb3Igd3JpdGluZyBvdXQKKyAgLy8vIGEgLnMgZmlsZSwgYW5kIGltcGxlbWVudGF0aW9ucyB0aGF0IHdyaXRlIG91dCAubyBmaWxlcyBvZiB2YXJpb3VzIGZvcm1hdHMuCisgIC8vLworICBjbGFzcyBNQ1N0cmVhbWVyIHsKKyAgICBNQ0NvbnRleHQgJkNvbnRleHQ7CisKKyAgICBNQ1N0cmVhbWVyKGNvbnN0IE1DU3RyZWFtZXImKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICAgIE1DU3RyZWFtZXIgJm9wZXJhdG9yPShjb25zdCBNQ1N0cmVhbWVyJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKworICBwcm90ZWN0ZWQ6CisgICAgTUNTdHJlYW1lcihNQ0NvbnRleHQgJkN0eCk7CisKKyAgICAvLy8gQ3VyU2VjdGlvbiAtIFRoaXMgaXMgdGhlIGN1cnJlbnQgc2VjdGlvbiBjb2RlIGlzIGJlaW5nIGVtaXR0ZWQgdG8sIGl0IGlzCisgICAgLy8vIGtlcHQgdXAgdG8gZGF0ZSBieSBTd2l0Y2hTZWN0aW9uLgorICAgIGNvbnN0IE1DU2VjdGlvbiAqQ3VyU2VjdGlvbjsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB+TUNTdHJlYW1lcigpOworCisgICAgTUNDb250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgICAgLy8vIEBuYW1lIEFzc2VtYmx5IEZpbGUgRm9ybWF0dGluZy4KKyAgICAvLy8gQHsKKyAgICAKKyAgICAvLy8gaXNWZXJib3NlQXNtIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzdHJlYW1lciBzdXBwb3J0cyB2ZXJib3NlIGFzc2VtYmx5CisgICAgLy8vIGFuZCBpZiBpdCBpcyBlbmFibGVkLgorICAgIHZpcnR1YWwgYm9vbCBpc1ZlcmJvc2VBc20oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAgIC8vLyBoYXNSYXdUZXh0U3VwcG9ydCAtIFJldHVybiB0cnVlIGlmIHRoaXMgYXNtIHN0cmVhbWVyIHN1cHBvcnRzIGVtaXR0aW5nCisgICAgLy8vIHVuZm9ybWF0dGVkIHRleHQgdG8gdGhlIC5zIGZpbGUgd2l0aCBFbWl0UmF3VGV4dC4KKyAgICB2aXJ0dWFsIGJvb2wgaGFzUmF3VGV4dFN1cHBvcnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLy8vIEFkZENvbW1lbnQgLSBBZGQgYSBjb21tZW50IHRoYXQgY2FuIGJlIGVtaXR0ZWQgdG8gdGhlIGdlbmVyYXRlZCAucworICAgIC8vLyBmaWxlIGlmIGFwcGxpY2FibGUgYXMgYSBRb0kgaXNzdWUgdG8gbWFrZSB0aGUgb3V0cHV0IG9mIHRoZSBjb21waWxlcgorICAgIC8vLyBtb3JlIHJlYWRhYmxlLiAgVGhpcyBvbmx5IGFmZmVjdHMgdGhlIE1DQXNtU3RyZWFtZXIsIGFuZCBvbmx5IHdoZW4KKyAgICAvLy8gdmVyYm9zZSBhc3NlbWJseSBvdXRwdXQgaXMgZW5hYmxlZC4KKyAgICAvLy8KKyAgICAvLy8gSWYgdGhlIGNvbW1lbnQgaW5jbHVkZXMgZW1iZWRkZWQgXG4ncywgdGhleSB3aWxsIGVhY2ggZ2V0IHRoZSBjb21tZW50CisgICAgLy8vIHByZWZpeCBhcyBhcHByb3ByaWF0ZS4gIFRoZSBhZGRlZCBjb21tZW50IHNob3VsZCBub3QgZW5kIHdpdGggYSBcbi4KKyAgICB2aXJ0dWFsIHZvaWQgQWRkQ29tbWVudChjb25zdCBUd2luZSAmVCkge30KKyAgICAKKyAgICAvLy8gR2V0Q29tbWVudE9TIC0gUmV0dXJuIGEgcmF3X29zdHJlYW0gdGhhdCBjb21tZW50cyBjYW4gYmUgd3JpdHRlbiB0by4KKyAgICAvLy8gVW5saWtlIEFkZENvbW1lbnQsIHlvdSBhcmUgcmVxdWlyZWQgdG8gdGVybWluYXRlIGNvbW1lbnRzIHdpdGggXG4gaWYgeW91CisgICAgLy8vIHVzZSB0aGlzIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHJhd19vc3RyZWFtICZHZXRDb21tZW50T1MoKTsKKyAgICAKKyAgICAvLy8gQWRkQmxhbmtMaW5lIC0gRW1pdCBhIGJsYW5rIGxpbmUgdG8gYSAucyBmaWxlIHRvIHByZXR0eSBpdCB1cC4KKyAgICB2aXJ0dWFsIHZvaWQgQWRkQmxhbmtMaW5lKCkge30KKyAgICAKKyAgICAvLy8gQH0KKyAgICAKKyAgICAvLy8gQG5hbWUgU3ltYm9sICYgU2VjdGlvbiBNYW5hZ2VtZW50CisgICAgLy8vIEB7CisgICAgCisgICAgLy8vIGdldEN1cnJlbnRTZWN0aW9uIC0gUmV0dXJuIHRoZSBjdXJyZW50IHNlY3Rpb24gdGhhdCB0aGUgc3RyZWFtZXIgaXMKKyAgICAvLy8gZW1pdHRpbmcgY29kZSB0by4KKyAgICBjb25zdCBNQ1NlY3Rpb24gKmdldEN1cnJlbnRTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gQ3VyU2VjdGlvbjsgfQorCisgICAgLy8vIFN3aXRjaFNlY3Rpb24gLSBTZXQgdGhlIGN1cnJlbnQgc2VjdGlvbiB3aGVyZSBjb2RlIGlzIGJlaW5nIGVtaXR0ZWQgdG8KKyAgICAvLy8gQHAgU2VjdGlvbi4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIEN1clNlY3Rpb24uCisgICAgLy8vCisgICAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYXNzZW1ibGVyIGRpcmVjdGl2ZXMgbGlrZSAuc2VjdGlvbiwgLnRleHQsIGV0Yy4KKyAgICB2aXJ0dWFsIHZvaWQgU3dpdGNoU2VjdGlvbihjb25zdCBNQ1NlY3Rpb24gKlNlY3Rpb24pID0gMDsKKyAgICAKKyAgICAvLy8gRW1pdExhYmVsIC0gRW1pdCBhIGxhYmVsIGZvciBAcCBTeW1ib2wgaW50byB0aGUgY3VycmVudCBzZWN0aW9uLgorICAgIC8vLworICAgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIGFuIGFzc2VtYmxlciBzdGF0ZW1lbnQgc3VjaCBhczoKKyAgICAvLy8gICBmb286CisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBTeW1ib2wgLSBUaGUgc3ltYm9sIHRvIGVtaXQuIEEgZ2l2ZW4gc3ltYm9sIHNob3VsZCBvbmx5IGJlCisgICAgLy8vIGVtaXR0ZWQgYXMgYSBsYWJlbCBvbmNlLCBhbmQgc3ltYm9scyBlbWl0dGVkIGFzIGEgbGFiZWwgc2hvdWxkIG5ldmVyIGJlCisgICAgLy8vIHVzZWQgaW4gYW4gYXNzaWdubWVudC4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdExhYmVsKE1DU3ltYm9sICpTeW1ib2wpID0gMDsKKworICAgIC8vLyBFbWl0QXNzZW1ibGVyRmxhZyAtIE5vdGUgaW4gdGhlIG91dHB1dCB0aGUgc3BlY2lmaWVkIEBwIEZsYWcKKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEFzc2VtYmxlckZsYWcoTUNBc3NlbWJsZXJGbGFnIEZsYWcpID0gMDsKKworICAgIC8vLyBFbWl0QXNzaWdubWVudCAtIEVtaXQgYW4gYXNzaWdubWVudCBvZiBAcCBWYWx1ZSB0byBAcCBTeW1ib2wuCisgICAgLy8vCisgICAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYW4gYXNzZW1ibGVyIHN0YXRlbWVudCBzdWNoIGFzOgorICAgIC8vLyAgc3ltYm9sID0gdmFsdWUKKyAgICAvLy8KKyAgICAvLy8gVGhlIGFzc2lnbm1lbnQgZ2VuZXJhdGVzIG5vIGNvZGUsIGJ1dCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGJpbmRpbmcgdGhlCisgICAgLy8vIHZhbHVlIGluIHRoZSBjdXJyZW50IGNvbnRleHQuIEZvciB0aGUgYXNzZW1ibHkgc3RyZWFtZXIsIHRoaXMgcHJpbnRzIHRoZQorICAgIC8vLyBiaW5kaW5nIGludG8gdGhlIC5zIGZpbGUuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBTeW1ib2wgLSBUaGUgc3ltYm9sIGJlaW5nIGFzc2lnbmVkIHRvLgorICAgIC8vLyBAcGFyYW0gVmFsdWUgLSBUaGUgdmFsdWUgZm9yIHRoZSBzeW1ib2wuCisgICAgdmlydHVhbCB2b2lkIEVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpID0gMDsKKworICAgIC8vLyBFbWl0U3ltYm9sQXR0cmlidXRlIC0gQWRkIHRoZSBnaXZlbiBAcCBBdHRyaWJ1dGUgdG8gQHAgU3ltYm9sLgorICAgIHZpcnR1YWwgdm9pZCBFbWl0U3ltYm9sQXR0cmlidXRlKE1DU3ltYm9sICpTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTeW1ib2xBdHRyIEF0dHJpYnV0ZSkgPSAwOworCisgICAgLy8vIEVtaXRTeW1ib2xEZXNjIC0gU2V0IHRoZSBAcCBEZXNjVmFsdWUgZm9yIHRoZSBAcCBTeW1ib2wuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBTeW1ib2wgLSBUaGUgc3ltYm9sIHRvIGhhdmUgaXRzIG5fZGVzYyBmaWVsZCBzZXQuCisgICAgLy8vIEBwYXJhbSBEZXNjVmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IGludG8gdGhlIG5fZGVzYyBmaWVsZC4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdFN5bWJvbERlc2MoTUNTeW1ib2wgKlN5bWJvbCwgdW5zaWduZWQgRGVzY1ZhbHVlKSA9IDA7CisKKyAgICAvLy8gQmVnaW5DT0ZGU3ltYm9sRGVmIC0gU3RhcnQgZW1pdHRpbmcgQ09GRiBzeW1ib2wgZGVmaW5pdGlvbgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gU3ltYm9sIC0gVGhlIHN5bWJvbCB0byBoYXZlIGl0cyBFeHRlcm5hbCAmIFR5cGUgZmllbGRzIHNldC4KKyAgICB2aXJ0dWFsIHZvaWQgQmVnaW5DT0ZGU3ltYm9sRGVmKGNvbnN0IE1DU3ltYm9sICpTeW1ib2wpID0gMDsKKworICAgIC8vLyBFbWl0Q09GRlN5bWJvbFN0b3JhZ2VDbGFzcyAtIEVtaXQgdGhlIHN0b3JhZ2UgY2xhc3Mgb2YgdGhlIHN5bWJvbC4KKyAgICAvLy8KKyAgICAvLy8gQHBhcmFtIFN0b3JhZ2VDbGFzcyAtIFRoZSBzdG9yYWdlIGNsYXNzIHRoZSBzeW1ib2wgc2hvdWxkIGhhdmUuCisgICAgdmlydHVhbCB2b2lkIEVtaXRDT0ZGU3ltYm9sU3RvcmFnZUNsYXNzKGludCBTdG9yYWdlQ2xhc3MpID0gMDsKKworICAgIC8vLyBFbWl0Q09GRlN5bWJvbFR5cGUgLSBFbWl0IHRoZSB0eXBlIG9mIHRoZSBzeW1ib2wuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBUeXBlIC0gQSBDT0ZGIHR5cGUgaWRlbnRpZmllciAoc2VlIENPRkY6OlN5bWJvbFR5cGUgaW4gWDg2Q09GRi5oKQorICAgIHZpcnR1YWwgdm9pZCBFbWl0Q09GRlN5bWJvbFR5cGUoaW50IFR5cGUpID0gMDsKKworICAgIC8vLyBFbmRDT0ZGU3ltYm9sRGVmIC0gTWFya3MgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24uCisgICAgdmlydHVhbCB2b2lkIEVuZENPRkZTeW1ib2xEZWYoKSA9IDA7CisKKyAgICAvLy8gRW1pdEVMRlNpemUgLSBFbWl0IGFuIEVMRiAuc2l6ZSBkaXJlY3RpdmUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYW4gYXNzZW1ibGVyIHN0YXRlbWVudCBzdWNoIGFzOgorICAgIC8vLyAgLnNpemUgc3ltYm9sLCBleHByZXNzaW9uCisgICAgLy8vCisgICAgdmlydHVhbCB2b2lkIEVtaXRFTEZTaXplKE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpID0gMDsKKyAgICAKKyAgICAvLy8gRW1pdENvbW1vblN5bWJvbCAtIEVtaXQgYSBjb21tb24gc3ltYm9sLgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gU3ltYm9sIC0gVGhlIGNvbW1vbiBzeW1ib2wgdG8gZW1pdC4KKyAgICAvLy8gQHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4KKyAgICAvLy8gQHBhcmFtIEJ5dGVBbGlnbm1lbnQgLSBUaGUgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wgaWYKKyAgICAvLy8gbm9uLXplcm8uIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIDIuCisgICAgdmlydHVhbCB2b2lkIEVtaXRDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSA9IDA7CisKKyAgICAvLy8gRW1pdExvY2FsQ29tbW9uU3ltYm9sIC0gRW1pdCBhIGxvY2FsIGNvbW1vbiAoLmxjb21tKSBzeW1ib2wuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBTeW1ib2wgLSBUaGUgY29tbW9uIHN5bWJvbCB0byBlbWl0LgorICAgIC8vLyBAcGFyYW0gU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sLgorICAgIHZpcnR1YWwgdm9pZCBFbWl0TG9jYWxDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSkgPSAwOworICAgIAorICAgIC8vLyBFbWl0WmVyb2ZpbGwgLSBFbWl0IHRoZSB6ZXJvZmlsbCBzZWN0aW9uIGFuZCBhbiBvcHRpb25hbCBzeW1ib2wuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBTZWN0aW9uIC0gVGhlIHplcm9maWxsIHNlY3Rpb24gdG8gY3JlYXRlIGFuZCBvciB0byBwdXQgdGhlIHN5bWJvbAorICAgIC8vLyBAcGFyYW0gU3ltYm9sIC0gVGhlIHplcm9maWxsIHN5bWJvbCB0byBlbWl0LCBpZiBub24tTlVMTC4KKyAgICAvLy8gQHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgemVyb2ZpbGwgc3ltYm9sLgorICAgIC8vLyBAcGFyYW0gQnl0ZUFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHplcm9maWxsIHN5bWJvbCBpZgorICAgIC8vLyBub24temVyby4gVGhpcyBtdXN0IGJlIGEgcG93ZXIgb2YgMiBvbiBzb21lIHRhcmdldHMuCisgICAgdmlydHVhbCB2b2lkIEVtaXRaZXJvZmlsbChjb25zdCBNQ1NlY3Rpb24gKlNlY3Rpb24sIE1DU3ltYm9sICpTeW1ib2wgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSA9IDAsdW5zaWduZWQgQnl0ZUFsaWdubWVudCA9IDApID0gMDsKKworICAgIC8vLyBFbWl0VEJTU1N5bWJvbCAtIEVtaXQgYSB0aHJlYWQgbG9jYWwgYnNzICgudGJzcykgc3ltYm9sLgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gU2VjdGlvbiAtIFRoZSB0aHJlYWQgbG9jYWwgY29tbW9uIHNlY3Rpb24uCisgICAgLy8vIEBwYXJhbSBTeW1ib2wgLSBUaGUgdGhyZWFkIGxvY2FsIGNvbW1vbiBzeW1ib2wgdG8gZW1pdC4KKyAgICAvLy8gQHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sLgorICAgIC8vLyBAcGFyYW0gQnl0ZUFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHRocmVhZCBsb2NhbCBjb21tb24gc3ltYm9sCisgICAgLy8vIGlmIG5vbi16ZXJvLiAgVGhpcyBtdXN0IGJlIGEgcG93ZXIgb2YgMiBvbiBzb21lIHRhcmdldHMuCisgICAgdmlydHVhbCB2b2lkIEVtaXRUQlNTU3ltYm9sKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgdW5zaWduZWQgQnl0ZUFsaWdubWVudCA9IDApID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBHZW5lcmF0aW5nIERhdGEKKyAgICAvLy8gQHsKKworICAgIC8vLyBFbWl0Qnl0ZXMgLSBFbWl0IHRoZSBieXRlcyBpbiBcYXJnIERhdGEgaW50byB0aGUgb3V0cHV0LgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLmJ5dGUsIC5hc2NpaSwKKyAgICAvLy8gZXRjLgorICAgIHZpcnR1YWwgdm9pZCBFbWl0Qnl0ZXMoU3RyaW5nUmVmIERhdGEsIHVuc2lnbmVkIEFkZHJTcGFjZSkgPSAwOworCisgICAgLy8vIEVtaXRWYWx1ZSAtIEVtaXQgdGhlIGV4cHJlc3Npb24gQHAgVmFsdWUgaW50byB0aGUgb3V0cHV0IGFzIGEgbmF0aXZlCisgICAgLy8vIGludGVnZXIgb2YgdGhlIGdpdmVuIEBwIFNpemUgYnl0ZXMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAud29yZCwgLnF1YWQsCisgICAgLy8vIGV0Yy4KKyAgICAvLy8KKyAgICAvLy8gQHBhcmFtIFZhbHVlIC0gVGhlIHZhbHVlIHRvIGVtaXQuCisgICAgLy8vIEBwYXJhbSBTaXplIC0gVGhlIHNpemUgb2YgdGhlIGludGVnZXIgKGluIGJ5dGVzKSB0byBlbWl0LiBUaGlzIG11c3QKKyAgICAvLy8gbWF0Y2ggYSBuYXRpdmUgbWFjaGluZSB3aWR0aC4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UgPSAwKSA9IDA7CisKKyAgICAvLy8gRW1pdEludFZhbHVlIC0gU3BlY2lhbCBjYXNlIG9mIEVtaXRWYWx1ZSB0aGF0IGF2b2lkcyB0aGUgY2xpZW50IGhhdmluZworICAgIC8vLyB0byBwYXNzIGluIGEgTUNFeHByIGZvciBjb25zdGFudCBpbnRlZ2Vycy4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEludFZhbHVlKHVpbnQ2NF90IFZhbHVlLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlID0gMCk7CisgICAgCisgICAgLy8vIEVtaXRTeW1ib2xWYWx1ZSAtIFNwZWNpYWwgY2FzZSBvZiBFbWl0VmFsdWUgdGhhdCBhdm9pZHMgdGhlIGNsaWVudAorICAgIC8vLyBoYXZpbmcgdG8gcGFzcyBpbiBhIE1DRXhwciBmb3IgTUNTeW1ib2xzLgorICAgIHZpcnR1YWwgdm9pZCBFbWl0U3ltYm9sVmFsdWUoY29uc3QgTUNTeW1ib2wgKlN5bSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSk7CisgICAgCisgICAgLy8vIEVtaXRHUFJlbDMyVmFsdWUgLSBFbWl0IHRoZSBleHByZXNzaW9uIEBwIFZhbHVlIGludG8gdGhlIG91dHB1dCBhcyBhCisgICAgLy8vIGdwcmVsMzIgKDMyLWJpdCBHUCByZWxhdGl2ZSkgdmFsdWUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAuZ3ByZWwzMiBvbgorICAgIC8vLyB0YXJnZXRzIHRoYXQgc3VwcG9ydCB0aGVtLgorICAgIHZpcnR1YWwgdm9pZCBFbWl0R1BSZWwzMlZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpID0gMDsKKyAgICAKKyAgICAvLy8gRW1pdEZpbGwgLSBFbWl0IE51bUJ5dGVzIGJ5dGVzIHdvcnRoIG9mIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkKKyAgICAvLy8gRmlsbFZhbHVlLiAgVGhpcyBpbXBsZW1lbnRzIGRpcmVjdGl2ZXMgc3VjaCBhcyAnLnNwYWNlJy4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEZpbGwodWludDY0X3QgTnVtQnl0ZXMsIHVpbnQ4X3QgRmlsbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpOworICAgIAorICAgIC8vLyBFbWl0WmVyb3MgLSBFbWl0IE51bUJ5dGVzIHdvcnRoIG9mIHplcm9zLiAgVGhpcyBpcyBhIGNvbnZlbmllbmNlCisgICAgLy8vIGZ1bmN0aW9uIHRoYXQganVzdCB3cmFwcyBFbWl0RmlsbC4KKyAgICB2b2lkIEVtaXRaZXJvcyh1aW50NjRfdCBOdW1CeXRlcywgdW5zaWduZWQgQWRkclNwYWNlKSB7CisgICAgICBFbWl0RmlsbChOdW1CeXRlcywgMCwgQWRkclNwYWNlKTsKKyAgICB9CisKKyAgICAKKyAgICAvLy8gRW1pdFZhbHVlVG9BbGlnbm1lbnQgLSBFbWl0IHNvbWUgbnVtYmVyIG9mIGNvcGllcyBvZiBAcCBWYWx1ZSB1bnRpbAorICAgIC8vLyB0aGUgYnl0ZSBhbGlnbm1lbnQgQHAgQnl0ZUFsaWdubWVudCBpcyByZWFjaGVkLgorICAgIC8vLworICAgIC8vLyBJZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWQgdG8gZW1pdCBmb3IgdGhlIGFsaWdubWVudCBpcyBub3QgYSBtdWx0aXBsZQorICAgIC8vLyBvZiBAcCBWYWx1ZVNpemUsIHRoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBlbWl0dGVkIGZpbGwgYnl0ZXMgaXMKKyAgICAvLy8gdW5kZWZpbmVkLgorICAgIC8vLworICAgIC8vLyBUaGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSAuYWxpZ24gYXNzZW1ibGVyIGRpcmVjdGl2ZS4KKyAgICAvLy8KKyAgICAvLy8gQHBhcmFtIEJ5dGVBbGlnbm1lbnQgLSBUaGUgYWxpZ25tZW50IHRvIHJlYWNoLiBUaGlzIG11c3QgYmUgYSBwb3dlciBvZgorICAgIC8vLyB0d28gb24gc29tZSB0YXJnZXRzLgorICAgIC8vLyBAcGFyYW0gVmFsdWUgLSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gZmlsbGluZyBieXRlcy4KKyAgICAvLy8gQHBhcmFtIFZhbHVlU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBpbnRlZ2VyIChpbiBieXRlcykgdG8gZW1pdCBmb3IKKyAgICAvLy8gQHAgVmFsdWUuIFRoaXMgbXVzdCBtYXRjaCBhIG5hdGl2ZSBtYWNoaW5lIHdpZHRoLgorICAgIC8vLyBAcGFyYW0gTWF4Qnl0ZXNUb0VtaXQgLSBUaGUgbWF4aW11bSBudW1iZXJzIG9mIGJ5dGVzIHRvIGVtaXQsIG9yIDAuIElmCisgICAgLy8vIHRoZSBhbGlnbm1lbnQgY2Fubm90IGJlIHJlYWNoZWQgaW4gdGhpcyBtYW55IGJ5dGVzLCBubyBieXRlcyBhcmUKKyAgICAvLy8gZW1pdHRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlVG9BbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwgaW50NjRfdCBWYWx1ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlU2l6ZSA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0ID0gMCkgPSAwOworCisgICAgLy8vIEVtaXRDb2RlQWxpZ25tZW50IC0gRW1pdCBub3BzIHVudGlsIHRoZSBieXRlIGFsaWdubWVudCBAcCBCeXRlQWxpZ25tZW50CisgICAgLy8vIGlzIHJlYWNoZWQuCisgICAgLy8vCisgICAgLy8vIFRoaXMgdXNlZCB0byBhbGlnbiBjb2RlIHdoZXJlIHRoZSBhbGlnbm1lbnQgYnl0ZXMgbWF5IGJlIGV4ZWN1dGVkLiAgVGhpcworICAgIC8vLyBjYW4gZW1pdCBkaWZmZXJlbnQgYnl0ZXMgZm9yIGRpZmZlcmVudCBzaXplcyB0byBvcHRpbWl6ZSBleGVjdXRpb24uCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBCeXRlQWxpZ25tZW50IC0gVGhlIGFsaWdubWVudCB0byByZWFjaC4gVGhpcyBtdXN0IGJlIGEgcG93ZXIgb2YKKyAgICAvLy8gdHdvIG9uIHNvbWUgdGFyZ2V0cy4KKyAgICAvLy8gQHBhcmFtIE1heEJ5dGVzVG9FbWl0IC0gVGhlIG1heGltdW0gbnVtYmVycyBvZiBieXRlcyB0byBlbWl0LCBvciAwLiBJZgorICAgIC8vLyB0aGUgYWxpZ25tZW50IGNhbm5vdCBiZSByZWFjaGVkIGluIHRoaXMgbWFueSBieXRlcywgbm8gYnl0ZXMgYXJlCisgICAgLy8vIGVtaXR0ZWQuCisgICAgdmlydHVhbCB2b2lkIEVtaXRDb2RlQWxpZ25tZW50KHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0ID0gMCkgPSAwOworCisgICAgLy8vIEVtaXRWYWx1ZVRvT2Zmc2V0IC0gRW1pdCBzb21lIG51bWJlciBvZiBjb3BpZXMgb2YgQHAgVmFsdWUgdW50aWwgdGhlCisgICAgLy8vIGJ5dGUgb2Zmc2V0IEBwIE9mZnNldCBpcyByZWFjaGVkLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLm9yZy4KKyAgICAvLy8KKyAgICAvLy8gQHBhcmFtIE9mZnNldCAtIFRoZSBvZmZzZXQgdG8gcmVhY2guIFRoaXMgbWF5IGJlIGFuIGV4cHJlc3Npb24sIGJ1dCB0aGUKKyAgICAvLy8gZXhwcmVzc2lvbiBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBzZWN0aW9uLgorICAgIC8vLyBAcGFyYW0gVmFsdWUgLSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gZmlsbGluZyBieXRlcy4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlVG9PZmZzZXQoY29uc3QgTUNFeHByICpPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVmFsdWUgPSAwKSA9IDA7CisgICAgCisgICAgLy8vIEB9CisgICAgCisgICAgLy8vIEVtaXRGaWxlRGlyZWN0aXZlIC0gU3dpdGNoIHRvIGEgbmV3IGxvZ2ljYWwgZmlsZS4gIFRoaXMgaXMgdXNlZCB0bworICAgIC8vLyBpbXBsZW1lbnQgdGhlICcuZmlsZSAiZm9vLmMiJyBhc3NlbWJsZXIgZGlyZWN0aXZlLgorICAgIHZpcnR1YWwgdm9pZCBFbWl0RmlsZURpcmVjdGl2ZShTdHJpbmdSZWYgRmlsZW5hbWUpID0gMDsKKyAgICAKKyAgICAvLy8gRW1pdER3YXJmRmlsZURpcmVjdGl2ZSAtIEFzc29jaWF0ZSBhIGZpbGVuYW1lIHdpdGggYSBzcGVjaWZpZWQgbG9naWNhbAorICAgIC8vLyBmaWxlIG51bWJlci4gIFRoaXMgaW1wbGVtZW50cyB0aGUgRFdBUkYyICcuZmlsZSA0ICJmb28uYyInIGFzc2VtYmxlcgorICAgIC8vLyBkaXJlY3RpdmUuCisgICAgdmlydHVhbCB2b2lkIEVtaXREd2FyZkZpbGVEaXJlY3RpdmUodW5zaWduZWQgRmlsZU5vLFN0cmluZ1JlZiBGaWxlbmFtZSkgPSAwOworCisgICAgLy8vIEVtaXRJbnN0cnVjdGlvbiAtIEVtaXQgdGhlIGdpdmVuIEBwIEluc3RydWN0aW9uIGludG8gdGhlIGN1cnJlbnQKKyAgICAvLy8gc2VjdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAmSW5zdCkgPSAwOworCisgICAgLy8vIEVtaXRSYXdUZXh0IC0gSWYgdGhpcyBmaWxlIGlzIGJhY2tlZCBieSBhIGFzc2VtYmx5IHN0cmVhbWVyLCB0aGlzIGR1bXBzCisgICAgLy8vIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGluIHRoZSBvdXRwdXQgLnMgZmlsZS4gIFRoaXMgY2FwYWJpbGl0eSBpcworICAgIC8vLyBpbmRpY2F0ZWQgYnkgdGhlIGhhc1Jhd1RleHRTdXBwb3J0KCkgcHJlZGljYXRlLiAgQnkgZGVmYXVsdCB0aGlzIGFib3J0cy4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdFJhd1RleHQoU3RyaW5nUmVmIFN0cmluZyk7CisgICAgdm9pZCBFbWl0UmF3VGV4dChjb25zdCBUd2luZSAmU3RyaW5nKTsKKyAgICAKKyAgICAvLy8gRmluaXNoIC0gRmluaXNoIGVtaXNzaW9uIG9mIG1hY2hpbmUgY29kZS4KKyAgICB2aXJ0dWFsIHZvaWQgRmluaXNoKCkgPSAwOworICB9OworCisgIC8vLyBjcmVhdGVOdWxsU3RyZWFtZXIgLSBDcmVhdGUgYSBkdW1teSBtYWNoaW5lIGNvZGUgc3RyZWFtZXIsIHdoaWNoIGRvZXMKKyAgLy8vIG5vdGhpbmcuIFRoaXMgaXMgdXNlZnVsIGZvciB0aW1pbmcgdGhlIGFzc2VtYmxlciBmcm9udCBlbmQuCisgIE1DU3RyZWFtZXIgKmNyZWF0ZU51bGxTdHJlYW1lcihNQ0NvbnRleHQgJkN0eCk7CisKKyAgLy8vIGNyZWF0ZUFzbVN0cmVhbWVyIC0gQ3JlYXRlIGEgbWFjaGluZSBjb2RlIHN0cmVhbWVyIHdoaWNoIHdpbGwgcHJpbnQgb3V0CisgIC8vLyBhc3NlbWJseSBmb3IgdGhlIG5hdGl2ZSB0YXJnZXQsIHN1aXRhYmxlIGZvciBjb21waWxpbmcgd2l0aCBhIG5hdGl2ZQorICAvLy8gYXNzZW1ibGVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbnN0UHJpbnQgLSBJZiBnaXZlbiwgdGhlIGluc3RydWN0aW9uIHByaW50ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4KKyAgLy8vIHRoZSBNQ0luc3QgcmVwcmVzZW50YXRpb24gd2lsbCBiZSBwcmludGVkLiAgVGhpcyBtZXRob2QgdGFrZXMgb3duZXJzaGlwIG9mCisgIC8vLyBJbnN0UHJpbnQuCisgIC8vLworICAvLy8gXHBhcmFtIENFIC0gSWYgZ2l2ZW4sIGEgY29kZSBlbWl0dGVyIHRvIHVzZSB0byBzaG93IHRoZSBpbnN0cnVjdGlvbgorICAvLy8gZW5jb2RpbmcgaW5saW5lIHdpdGggdGhlIGFzc2VtYmx5LiBUaGlzIG1ldGhvZCB0YWtlcyBvd25lcnNoaXAgb2YgXGFyZyBDRS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2hvd0luc3QgLSBXaGV0aGVyIHRvIHNob3cgdGhlIE1DSW5zdCByZXByZXNlbnRhdGlvbiBpbmxpbmUgd2l0aAorICAvLy8gdGhlIGFzc2VtYmx5LgorICBNQ1N0cmVhbWVyICpjcmVhdGVBc21TdHJlYW1lcihNQ0NvbnRleHQgJkN0eCwgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0xpdHRsZUVuZGlhbiwgYm9vbCBpc1ZlcmJvc2VBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DSW5zdFByaW50ZXIgKkluc3RQcmludCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29kZUVtaXR0ZXIgKkNFID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG93SW5zdCA9IGZhbHNlKTsKKworICAvLy8gY3JlYXRlTWFjaE9TdHJlYW1lciAtIENyZWF0ZSBhIG1hY2hpbmUgY29kZSBzdHJlYW1lciB3aGljaCB3aWxsIGdlbmVyYXRlCisgIC8vLyBNYWNoLU8gZm9ybWF0IG9iamVjdCBmaWxlcy4KKyAgLy8vCisgIC8vLyBUYWtlcyBvd25lcnNoaXAgb2YgXGFyZyBUQUIgYW5kIFxhcmcgQ0UuCisgIE1DU3RyZWFtZXIgKmNyZWF0ZU1hY2hPU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgsIFRhcmdldEFzbUJhY2tlbmQgJlRBQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MsIE1DQ29kZUVtaXR0ZXIgKkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVsYXhBbGwgPSBmYWxzZSk7CisKKyAgLy8vIGNyZWF0ZVdpbkNPRkZTdHJlYW1lciAtIENyZWF0ZSBhIG1hY2hpbmUgY29kZSBzdHJlYW1lciB3aGljaCB3aWxsCisgIC8vLyBnZW5lcmF0ZSBNaWNyb3NvZnQgQ09GRiBmb3JtYXQgb2JqZWN0IGZpbGVzLgorICAvLy8KKyAgLy8vIFRha2VzIG93bmVyc2hpcCBvZiBcYXJnIFRBQiBhbmQgXGFyZyBDRS4KKyAgTUNTdHJlYW1lciAqY3JlYXRlV2luQ09GRlN0cmVhbWVyKE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNtQmFja2VuZCAmVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb2RlRW1pdHRlciAmQ0UsIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVsYXhBbGwgPSBmYWxzZSk7CisKKyAgLy8vIGNyZWF0ZUxvZ2dpbmdTdHJlYW1lciAtIENyZWF0ZSBhIG1hY2hpbmUgY29kZSBzdHJlYW1lciB3aGljaCBqdXN0IGxvZ3MgdGhlCisgIC8vLyBBUEkgY2FsbHMgYW5kIHRoZW4gZGlzcGF0Y2hlcyB0byBhbm90aGVyIHN0cmVhbWVyLgorICAvLy8KKyAgLy8vIFRoZSBuZXcgc3RyZWFtZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBcYXJnIENoaWxkLgorICBNQ1N0cmVhbWVyICpjcmVhdGVMb2dnaW5nU3RyZWFtZXIoTUNTdHJlYW1lciAqQ2hpbGQsIHJhd19vc3RyZWFtICZPUyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQzMmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sLmgKQEAgLTAsMCArMSwxNTggQEAKKy8vPT09LSBNQ1N5bWJvbC5oIC0gTWFjaGluZSBDb2RlIFN5bWJvbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTUNTeW1ib2wgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DU1lNQk9MX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NZTUJPTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNQ0V4cHI7CisgIGNsYXNzIE1DU2VjdGlvbjsKKyAgY2xhc3MgTUNDb250ZXh0OworICBjbGFzcyByYXdfb3N0cmVhbTsKKworICAvLy8gTUNTeW1ib2wgLSBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBzeW1ib2wgbmFtZSBpbiB0aGUgTUMgZmlsZSwKKyAgLy8vIGFuZCBNQ1N5bWJvbHMgYXJlIGNyZWF0ZWQgYW5kIHVuaXF1ZSdkIGJ5IHRoZSBNQ0NvbnRleHQgY2xhc3MuICBNQ1N5bWJvbHMKKyAgLy8vIHNob3VsZCBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggdmFsaWQgbmFtZXMgZm9yIHRoZSBvYmplY3QgZmlsZS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQvZW1pdHRlZCBpbnRvIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQsIHRoZQorICAvLy8gU2VjdGlvbiBtZW1iZXIgaXMgc2V0IHRvIGluZGljYXRlIHdoYXQgc2VjdGlvbiBpdCBsaXZlcyBpbi4gIE90aGVyd2lzZSwgaWYKKyAgLy8vIGl0IGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIGVudGl0eSwgaXQgaGFzIGEgbnVsbCBzZWN0aW9uLgorICBjbGFzcyBNQ1N5bWJvbCB7CisgICAgLy8gU3BlY2lhbCBzZW50aW5hbCB2YWx1ZSBmb3IgdGhlIGFic29sdXRlIHBzZXVkbyBzZWN0aW9uLgorICAgIC8vCisgICAgLy8gRklYTUU6IFVzZSBhIFBvaW50ZXJJbnQgd3JhcHBlciBmb3IgdGhpcz8KKyAgICBzdGF0aWMgY29uc3QgTUNTZWN0aW9uICpBYnNvbHV0ZVBzZXVkb1NlY3Rpb247CisKKyAgICAvLy8gTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuICBUaGUgcmVmZXJyZWQtdG8gc3RyaW5nIGRhdGEgaXMgYWN0dWFsbHkKKyAgICAvLy8gaGVsZCBieSB0aGUgU3RyaW5nTWFwIHRoYXQgbGl2ZXMgaW4gTUNDb250ZXh0LgorICAgIFN0cmluZ1JlZiBOYW1lOworCisgICAgLy8vIFNlY3Rpb24gLSBUaGUgc2VjdGlvbiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4uIFRoaXMgaXMgbnVsbCBmb3IKKyAgICAvLy8gdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCB0aGUgc3BlY2lhbCBBYnNvbHV0ZVBzZXVkb1NlY3Rpb24gdmFsdWUgZm9yCisgICAgLy8vIGFic29sdXRlIHN5bWJvbHMuCisgICAgY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uOworCisgICAgLy8vIFZhbHVlIC0gSWYgbm9uLW51bGwsIHRoZSB2YWx1ZSBmb3IgYSB2YXJpYWJsZSBzeW1ib2wuCisgICAgY29uc3QgTUNFeHByICpWYWx1ZTsKKworICAgIC8vLyBJc1RlbXBvcmFyeSAtIFRydWUgaWYgdGhpcyBpcyBhbiBhc3NlbWJsZXIgdGVtcG9yYXJ5IGxhYmVsLCB3aGljaAorICAgIC8vLyB0eXBpY2FsbHkgZG9lcyBub3Qgc3Vydml2ZSBpbiB0aGUgLm8gZmlsZSdzIHN5bWJvbCB0YWJsZS4gIFVzdWFsbHkKKyAgICAvLy8gIkxmb28iIG9yICIuZm9vIi4KKyAgICB1bnNpZ25lZCBJc1RlbXBvcmFyeSA6IDE7CisKKyAgICAvLy8gSXNVc2VkSW5FeHByIC0gVHJ1ZSBpZiB0aGlzIHN5bWJvbCBoYXMgYmVlbiB1c2VkIGluIGFuIGV4cHJlc3Npb24gYW5kCisgICAgLy8vIGNhbm5vdCBiZSByZWRlZmluZWQuCisgICAgdW5zaWduZWQgSXNVc2VkSW5FeHByIDogMTsKKworICBwcml2YXRlOiAgLy8gTUNDb250ZXh0IGNyZWF0ZXMgYW5kIHVuaXF1ZXMgdGhlc2UuCisgICAgZnJpZW5kIGNsYXNzIE1DQ29udGV4dDsKKyAgICBNQ1N5bWJvbChTdHJpbmdSZWYgbmFtZSwgYm9vbCBpc1RlbXBvcmFyeSkKKyAgICAgIDogTmFtZShuYW1lKSwgU2VjdGlvbigwKSwgVmFsdWUoMCksCisgICAgICAgIElzVGVtcG9yYXJ5KGlzVGVtcG9yYXJ5KSwgSXNVc2VkSW5FeHByKGZhbHNlKSB7fQorCisgICAgTUNTeW1ib2woY29uc3QgTUNTeW1ib2wmKTsgICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1DU3ltYm9sJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgcHVibGljOgorICAgIC8vLyBnZXROYW1lIC0gR2V0IHRoZSBzeW1ib2wgbmFtZS4KKyAgICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAgIC8vLyBAbmFtZSBBY2Nlc3NvcnMKKyAgICAvLy8gQHsKKworICAgIC8vLyBpc1RlbXBvcmFyeSAtIENoZWNrIGlmIHRoaXMgaXMgYW4gYXNzZW1ibGVyIHRlbXBvcmFyeSBzeW1ib2wuCisgICAgYm9vbCBpc1RlbXBvcmFyeSgpIGNvbnN0IHsgcmV0dXJuIElzVGVtcG9yYXJ5OyB9CisKKyAgICAvLy8gaXNVc2VkSW5FeHByIC0gQ2hlY2sgaWYgdGhpcyBpcyBhbiBhc3NlbWJsZXIgdGVtcG9yYXJ5IHN5bWJvbC4KKyAgICBib29sIGlzVXNlZEluRXhwcigpIGNvbnN0IHsgcmV0dXJuIElzVXNlZEluRXhwcjsgfQorICAgIHZvaWQgc2V0VXNlZEluRXhwcihib29sIFZhbHVlKSB7IElzVXNlZEluRXhwciA9IFZhbHVlOyB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgQXNzb2NpYXRlZCBTZWN0aW9ucworICAgIC8vLyBAeworCisgICAgLy8vIGlzRGVmaW5lZCAtIENoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgKGkuZS4sIGl0IGhhcyBhbiBhZGRyZXNzKS4KKyAgICAvLy8KKyAgICAvLy8gRGVmaW5lZCBzeW1ib2xzIGFyZSBlaXRoZXIgYWJzb2x1dGUgb3IgaW4gc29tZSBzZWN0aW9uLgorICAgIGJvb2wgaXNEZWZpbmVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNlY3Rpb24gIT0gMDsKKyAgICB9CisKKyAgICAvLy8gaXNJblNlY3Rpb24gLSBDaGVjayBpZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHNvbWUgc2VjdGlvbiAoaS5lLiwgaXQKKyAgICAvLy8gaXMgZGVmaW5lZCBidXQgbm90IGFic29sdXRlKS4KKyAgICBib29sIGlzSW5TZWN0aW9uKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzRGVmaW5lZCgpICYmICFpc0Fic29sdXRlKCk7CisgICAgfQorCisgICAgLy8vIGlzVW5kZWZpbmVkIC0gQ2hlY2sgaWYgdGhpcyBzeW1ib2wgdW5kZWZpbmVkIChpLmUuLCBpbXBsaWNpdGx5IGRlZmluZWQpLgorICAgIGJvb2wgaXNVbmRlZmluZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gIWlzRGVmaW5lZCgpOworICAgIH0KKworICAgIC8vLyBpc0Fic29sdXRlIC0gQ2hlY2sgaWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBzeW1ib2wuCisgICAgYm9vbCBpc0Fic29sdXRlKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNlY3Rpb24gPT0gQWJzb2x1dGVQc2V1ZG9TZWN0aW9uOworICAgIH0KKworICAgIC8vLyBnZXRTZWN0aW9uIC0gR2V0IHRoZSBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGRlZmluZWQsIG5vbi1hYnNvbHV0ZQorICAgIC8vLyBzeW1ib2wuCisgICAgY29uc3QgTUNTZWN0aW9uICZnZXRTZWN0aW9uKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzSW5TZWN0aW9uKCkgJiYgIkludmFsaWQgYWNjZXNzb3IhIik7CisgICAgICByZXR1cm4gKlNlY3Rpb247CisgICAgfQorCisgICAgLy8vIHNldFNlY3Rpb24gLSBNYXJrIHRoZSBzeW1ib2wgYXMgZGVmaW5lZCBpbiB0aGUgc2VjdGlvbiBcYXJnIFMuCisgICAgdm9pZCBzZXRTZWN0aW9uKGNvbnN0IE1DU2VjdGlvbiAmUykgeyBTZWN0aW9uID0gJlM7IH0KKworICAgIC8vLyBzZXRVbmRlZmluZWQgLSBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLgorICAgIHZvaWQgc2V0VW5kZWZpbmVkKCkgeworICAgICAgU2VjdGlvbiA9IDA7CisgICAgfQorCisgICAgLy8vIHNldEFic29sdXRlIC0gTWFyayB0aGUgc3ltYm9sIGFzIGFic29sdXRlLgorICAgIHZvaWQgc2V0QWJzb2x1dGUoKSB7IFNlY3Rpb24gPSBBYnNvbHV0ZVBzZXVkb1NlY3Rpb247IH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBWYXJpYWJsZSBTeW1ib2xzCisgICAgLy8vIEB7CisKKyAgICAvLy8gaXNWYXJpYWJsZSAtIENoZWNrIGlmIHRoaXMgaXMgYSB2YXJpYWJsZSBzeW1ib2wuCisgICAgYm9vbCBpc1ZhcmlhYmxlKCkgY29uc3QgeworICAgICAgcmV0dXJuIFZhbHVlICE9IDA7CisgICAgfQorCisgICAgLy8vIGdldFZhbHVlKCkgLSBHZXQgdGhlIHZhbHVlIGZvciB2YXJpYWJsZSBzeW1ib2xzLgorICAgIGNvbnN0IE1DRXhwciAqZ2V0VmFyaWFibGVWYWx1ZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc1ZhcmlhYmxlKCkgJiYgIkludmFsaWQgYWNjZXNzb3IhIik7CisgICAgICByZXR1cm4gVmFsdWU7CisgICAgfQorCisgICAgdm9pZCBzZXRWYXJpYWJsZVZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgICAgLy8vIEB9CisKKyAgICAvLy8gcHJpbnQgLSBQcmludCB0aGUgdmFsdWUgdG8gdGhlIHN0cmVhbSBcYXJnIE9TLgorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBkdW1wIC0gUHJpbnQgdGhlIHZhbHVlIHRvIHN0ZGVyci4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ1N5bWJvbCAmU3ltKSB7CisgICAgU3ltLnByaW50KE9TKTsKKyAgICByZXR1cm4gT1M7CisgIH0KK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01DVmFsdWUuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiNmMyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NQ1ZhbHVlLmgKQEAgLTAsMCArMSw4NyBAQAorLy89PT0tLSBsbHZtL01DL01DVmFsdWUuaCAtIE1DVmFsdWUgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNQ1ZhbHVlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1ZBTFVFX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1ZBTFVFX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ0FzbUluZm87CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIE1DU3ltYm9sUmVmRXhwcjsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gTUNWYWx1ZSAtIFRoaXMgcmVwcmVzZW50cyBhbiAiYXNzZW1ibGVyIGltbWVkaWF0ZSIuICBJbiBpdHMgbW9zdCBnZW5lcmFsCisvLy8gZm9ybSwgdGhpcyBjYW4gaG9sZCAiU3ltYm9sQSAtIFN5bWJvbEIgKyBpbW02NCIuICBOb3QgYWxsIHRhcmdldHMgc3VwcG9ydHMKKy8vLyByZWxvY2F0aW9ucyBvZiB0aGlzIGdlbmVyYWwgZm9ybSwgYnV0IHdlIG5lZWQgdG8gcmVwcmVzZW50IHRoaXMgYW55d2F5LgorLy8vCisvLy8gSW4gdGhlIGdlbmVyYWwgZm9ybSwgU3ltYm9sQiBjYW4gb25seSBiZSBkZWZpbmVkIGlmIFN5bWJvbEEgaXMsIGFuZCBib3RoCisvLy8gbXVzdCBiZSBpbiB0aGUgc2FtZSAobm9uLWV4dGVybmFsKSBzZWN0aW9uLiBUaGUgbGF0dGVyIGNvbnN0cmFpbnQgaXMgbm90CisvLy8gZW5mb3JjZWQsIHNpbmNlIGEgc3ltYm9sJ3Mgc2VjdGlvbiBtYXkgbm90IGJlIGtub3duIGF0IGNvbnN0cnVjdGlvbi4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGNsYXNzIG11c3QgcmVtYWluIGEgc2ltcGxlIFBPRCB2YWx1ZSBjbGFzcywgYmVjYXVzZSB3ZSBuZWVkCisvLy8gaXQgdG8gbGl2ZSBpbiB1bmlvbnMgZXRjLgorY2xhc3MgTUNWYWx1ZSB7CisgIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqU3ltQSwgKlN5bUI7CisgIGludDY0X3QgQ3N0OworcHVibGljOgorCisgIGludDY0X3QgZ2V0Q29uc3RhbnQoKSBjb25zdCB7IHJldHVybiBDc3Q7IH0KKyAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpnZXRTeW1BKCkgY29uc3QgeyByZXR1cm4gU3ltQTsgfQorICBjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKmdldFN5bUIoKSBjb25zdCB7IHJldHVybiBTeW1COyB9CisKKyAgLy8vIGlzQWJzb2x1dGUgLSBJcyB0aGlzIGFuIGFic29sdXRlIChhcyBvcHBvc2VkIHRvIHJlbG9jYXRhYmxlKSB2YWx1ZS4KKyAgYm9vbCBpc0Fic29sdXRlKCkgY29uc3QgeyByZXR1cm4gIVN5bUEgJiYgIVN5bUI7IH0KKworICAvLy8gZ2V0QXNzb2NpYXRlZFNlY3Rpb24gLSBGb3IgcmVsb2NhdGFibGUgdmFsdWVzLCByZXR1cm4gdGhlIHNlY3Rpb24gdGhlCisgIC8vLyB2YWx1ZSBpcyBhc3NvY2lhdGVkIHdpdGguCisgIC8vLworICAvLy8gQHJlc3VsdCAtIFRoZSB2YWx1ZSdzIGFzc29jaWF0ZWQgc2VjdGlvbiwgb3IgbnVsbCBmb3IgZXh0ZXJuYWwgb3IgY29uc3RhbnQKKyAgLy8vIHZhbHVlcy4KKyAgLy8KKyAgLy8gRklYTUU6IFN3aXRjaCB0byBhIHRhZ2dlZCBzZWN0aW9uLCBzbyB0aGlzIGNhbiByZXR1cm4gdGhlIHRhZ2dlZCBzZWN0aW9uCisgIC8vIHZhbHVlLgorICBjb25zdCBNQ1NlY3Rpb24gKmdldEFzc29jaWF0ZWRTZWN0aW9uKCkgY29uc3Q7CisKKyAgLy8vIHByaW50IC0gUHJpbnQgdGhlIHZhbHVlIHRvIHRoZSBzdHJlYW0gXGFyZyBPUy4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DQXNtSW5mbyAqTUFJKSBjb25zdDsKKworICAvLy8gZHVtcCAtIFByaW50IHRoZSB2YWx1ZSB0byBzdGRlcnIuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIHN0YXRpYyBNQ1ZhbHVlIGdldChjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKlN5bUEsIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqU3ltQj0wLAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBWYWwgPSAwKSB7CisgICAgTUNWYWx1ZSBSOworICAgIGFzc2VydCgoIVN5bUIgfHwgU3ltQSkgJiYgIkludmFsaWQgcmVsb2NhdGFibGUgTUNWYWx1ZSEiKTsKKyAgICBSLkNzdCA9IFZhbDsKKyAgICBSLlN5bUEgPSBTeW1BOworICAgIFIuU3ltQiA9IFN5bUI7CisgICAgcmV0dXJuIFI7CisgIH0KKworICBzdGF0aWMgTUNWYWx1ZSBnZXQoaW50NjRfdCBWYWwpIHsKKyAgICBNQ1ZhbHVlIFI7CisgICAgUi5Dc3QgPSBWYWw7CisgICAgUi5TeW1BID0gMDsKKyAgICBSLlN5bUIgPSAwOworICAgIHJldHVybiBSOworICB9CisKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL01hY2hPYmplY3RXcml0ZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NYWNoT2JqZWN0V3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxZmYxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NQy9NYWNoT2JqZWN0V3JpdGVyLmgKQEAgLTAsMCArMSw0NCBAQAorLy89PT0tLSBsbHZtL01DL01hY2hPYmplY3RXcml0ZXIuaCAtIE1hY2gtTyBGaWxlIFdyaXRlciAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01BQ0hPQkpFQ1RXUklURVJfSAorI2RlZmluZSBMTFZNX01DX01BQ0hPQkpFQ1RXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ09iamVjdFdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DQXNzZW1ibGVyOworY2xhc3MgTUNGcmFnbWVudDsKK2NsYXNzIE1DRml4dXA7CitjbGFzcyBNQ1ZhbHVlOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIE1hY2hPYmplY3RXcml0ZXIgOiBwdWJsaWMgTUNPYmplY3RXcml0ZXIgeworICB2b2lkICpJbXBsOworCitwdWJsaWM6CisgIE1hY2hPYmplY3RXcml0ZXIocmF3X29zdHJlYW0gJk9TLCBib29sIElzNjRCaXQsIGJvb2wgSXNMaXR0bGVFbmRpYW4gPSB0cnVlKTsKKyAgdmlydHVhbCB+TWFjaE9iamVjdFdyaXRlcigpOworCisgIHZpcnR1YWwgdm9pZCBFeGVjdXRlUG9zdExheW91dEJpbmRpbmcoTUNBc3NlbWJsZXIgJkFzbSk7CisKKyAgdmlydHVhbCB2b2lkIFJlY29yZFJlbG9jYXRpb24oY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwLCBNQ1ZhbHVlIFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJkZpeGVkVmFsdWUpOworCisgIHZpcnR1YWwgdm9pZCBXcml0ZU9iamVjdChjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KTsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL1NlY3Rpb25LaW5kLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTUMvU2VjdGlvbktpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE5MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01DL1NlY3Rpb25LaW5kLmgKQEAgLTAsMCArMSwyNDAgQEAKKy8vPT09LS0gbGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlLmggLSBPYmplY3QgSW5mbyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgY2xhc3NlcyB1c2VkIHRvIGhhbmRsZSBsb3dlcmluZ3Mgc3BlY2lmaWMgdG8gY29tbW9uCisvLyBvYmplY3QgZmlsZSBmb3JtYXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19TRUNUSU9OS0lORF9ICisjZGVmaW5lIExMVk1fTUNfU0VDVElPTktJTkRfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTZWN0aW9uS2luZCAtIFRoaXMgaXMgYSBzaW1wbGUgUE9EIHZhbHVlIHRoYXQgY2xhc3NpZmllcyB0aGUgcHJvcGVydGllcyBvZgorLy8vIGEgc2VjdGlvbi4gIEEgc2VjdGlvbiBpcyBjbGFzc2lmaWVkIGludG8gdGhlIGRlZXBlc3QgcG9zc2libGUKKy8vLyBjbGFzc2lmaWNhdGlvbiwgYW5kIHRoZW4gdGhlIHRhcmdldCBtYXBzIHRoZW0gb250byB0aGVpciBzZWN0aW9ucyBiYXNlZCBvbgorLy8vIHdoYXQgY2FwYWJpbGl0aWVzIHRoZXkgaGF2ZS4KKy8vLworLy8vIFRoZSBjb21tZW50cyBiZWxvdyBkZXNjcmliZSB0aGVzZSBhcyBpZiB0aGV5IHdlcmUgYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5CisvLy8gaW4gb3JkZXIgdG8gZXhwbGFpbiB0aGUgcHJlZGljYXRlcyBiZWxvdy4KKy8vLworY2xhc3MgU2VjdGlvbktpbmQgeworICBlbnVtIEtpbmQgeworICAgIC8vLyBNZXRhZGF0YSAtIERlYnVnIGluZm8gc2VjdGlvbnMgb3Igb3RoZXIgbWV0YWRhdGEuCisgICAgTWV0YWRhdGEsCisKKyAgICAvLy8gVGV4dCAtIFRleHQgc2VjdGlvbiwgdXNlZCBmb3IgZnVuY3Rpb25zIGFuZCBvdGhlciBleGVjdXRhYmxlIGNvZGUuCisgICAgVGV4dCwKKworICAgIC8vLyBSZWFkT25seSAtIERhdGEgdGhhdCBpcyBuZXZlciB3cml0dGVuIHRvIGF0IHByb2dyYW0gcnVudGltZSBieSB0aGUKKyAgICAvLy8gcHJvZ3JhbSBvciB0aGUgZHluYW1pYyBsaW5rZXIuICBUaGluZ3MgaW4gdGhlIHRvcC1sZXZlbCByZWFkb25seQorICAgIC8vLyBTZWN0aW9uS2luZCBhcmUgbm90IG1lcmdlYWJsZS4KKyAgICBSZWFkT25seSwKKworICAgICAgICAvLy8gTWVyZ2FibGVDU3RyaW5nIC0gQW55IG51bGwtdGVybWluYXRlZCBzdHJpbmcgd2hpY2ggYWxsb3dzIG1lcmdpbmcuCisgICAgICAgIC8vLyBUaGVzZSB2YWx1ZXMgYXJlIGtub3duIHRvIGVuZCBpbiBhIG51bCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUsCisgICAgICAgIC8vLyBub3Qgb3RoZXJ3aXNlIGNvbnRhaW4gYSBudWwgdmFsdWUsIGFuZCBiZSBtZXJnYWJsZS4gIFRoaXMgYWxsb3dzIHRoZQorICAgICAgICAvLy8gbGlua2VyIHRvIHVuaXF1ZSB0aGUgc3RyaW5ncyBpZiBpdCBzbyBkZXNpcmVzLgorCisgICAgICAgICAgIC8vLyBNZXJnZWFibGUxQnl0ZUNTdHJpbmcgLSAxIGJ5dGUgbWVyZ2FibGUsIG51bGwgdGVybWluYXRlZCwgc3RyaW5nLgorICAgICAgICAgICBNZXJnZWFibGUxQnl0ZUNTdHJpbmcsCisKKyAgICAgICAgICAgLy8vIE1lcmdlYWJsZTJCeXRlQ1N0cmluZyAtIDIgYnl0ZSBtZXJnYWJsZSwgbnVsbCB0ZXJtaW5hdGVkLCBzdHJpbmcuCisgICAgICAgICAgIE1lcmdlYWJsZTJCeXRlQ1N0cmluZywKKworICAgICAgICAgICAvLy8gTWVyZ2VhYmxlNEJ5dGVDU3RyaW5nIC0gNCBieXRlIG1lcmdhYmxlLCBudWxsIHRlcm1pbmF0ZWQsIHN0cmluZy4KKyAgICAgICAgICAgTWVyZ2VhYmxlNEJ5dGVDU3RyaW5nLAorCisgICAgICAgIC8vLyBNZXJnZWFibGVDb25zdCAtIFRoZXNlIGFyZSBzZWN0aW9ucyBmb3IgbWVyZ2luZyBmaXhlZC1sZW5ndGgKKyAgICAgICAgLy8vIGNvbnN0YW50cyB0b2dldGhlci4gIEZvciBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIHVuaXF1ZQorICAgICAgICAvLy8gY29uc3RhbnQgcG9vbCBlbnRyaWVzIGV0Yy4KKyAgICAgICAgTWVyZ2VhYmxlQ29uc3QsCisKKyAgICAgICAgICAgIC8vLyBNZXJnZWFibGVDb25zdDQgLSBUaGlzIGlzIGEgc2VjdGlvbiB1c2VkIGJ5IDQtYnl0ZSBjb25zdGFudHMsCisgICAgICAgICAgICAvLy8gZm9yIGV4YW1wbGUsIGZsb2F0cy4KKyAgICAgICAgICAgIE1lcmdlYWJsZUNvbnN0NCwKKworICAgICAgICAgICAgLy8vIE1lcmdlYWJsZUNvbnN0OCAtIFRoaXMgaXMgYSBzZWN0aW9uIHVzZWQgYnkgOC1ieXRlIGNvbnN0YW50cywKKyAgICAgICAgICAgIC8vLyBmb3IgZXhhbXBsZSwgZG91Ymxlcy4KKyAgICAgICAgICAgIE1lcmdlYWJsZUNvbnN0OCwKKworICAgICAgICAgICAgLy8vIE1lcmdlYWJsZUNvbnN0MTYgLSBUaGlzIGlzIGEgc2VjdGlvbiB1c2VkIGJ5IDE2LWJ5dGUgY29uc3RhbnRzLAorICAgICAgICAgICAgLy8vIGZvciBleGFtcGxlLCB2ZWN0b3JzLgorICAgICAgICAgICAgTWVyZ2VhYmxlQ29uc3QxNiwKKworICAgIC8vLyBXcml0ZWFibGUgLSBUaGlzIGlzIHRoZSBiYXNlIG9mIGFsbCBzZWdtZW50cyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbgorICAgIC8vLyB0byBkdXJpbmcgcHJvZ3JhbSBydW50aW1lLgorCisgICAgICAgLy8vIFRocmVhZExvY2FsIC0gVGhpcyBpcyB0aGUgYmFzZSBvZiBhbGwgVExTIHNlZ21lbnRzLiAgQWxsIFRMUworICAgICAgIC8vLyBvYmplY3RzIG11c3QgYmUgd3JpdGVhYmxlLCBvdGhlcndpc2UgdGhlcmUgaXMgbm8gcmVhc29uIGZvciB0aGVtIHRvCisgICAgICAgLy8vIGJlIHRocmVhZCBsb2NhbCEKKworICAgICAgICAgICAvLy8gVGhyZWFkQlNTIC0gWmVyby1pbml0aWFsaXplZCBUTFMgZGF0YSBvYmplY3RzLgorICAgICAgICAgICBUaHJlYWRCU1MsCisKKyAgICAgICAgICAgLy8vIFRocmVhZERhdGEgLSBJbml0aWFsaXplZCBUTFMgZGF0YSBvYmplY3RzLgorICAgICAgICAgICBUaHJlYWREYXRhLAorCisgICAgICAgLy8vIEdsb2JhbFdyaXRlYWJsZURhdGEgLSBXcml0ZWFibGUgZGF0YSB0aGF0IGlzIGdsb2JhbCAobm90IHRocmVhZAorICAgICAgIC8vLyBsb2NhbCkuCisKKyAgICAgICAgICAgLy8vIEJTUyAtIFplcm8gaW5pdGlhbGl6ZWQgd3JpdGVhYmxlIGRhdGEuCisgICAgICAgICAgIEJTUywKKworICAgICAgICAgICAgICAgLy8vIEJTU0xvY2FsIC0gVGhpcyBpcyBCU1MgKHplcm8gaW5pdGlhbGl6ZWQgYW5kIHdyaXRhYmxlKSBkYXRhCisgICAgICAgICAgICAgICAvLy8gd2hpY2ggaGFzIGxvY2FsIGxpbmthZ2UuCisgICAgICAgICAgICAgICBCU1NMb2NhbCwKKworICAgICAgICAgICAgICAgLy8vIEJTU0V4dGVybiAtIFRoaXMgaXMgQlNTIGRhdGEgd2l0aCBub3JtYWwgZXh0ZXJuYWwgbGlua2FnZS4KKyAgICAgICAgICAgICAgIEJTU0V4dGVybiwKKworICAgICAgICAgICAvLy8gQ29tbW9uIC0gRGF0YSB3aXRoIGNvbW1vbiBsaW5rYWdlLiAgVGhlc2UgcmVwcmVzZW50IHRlbnRhdGl2ZQorICAgICAgICAgICAvLy8gZGVmaW5pdGlvbnMsIHdoaWNoIGFsd2F5cyBoYXZlIGEgemVybyBpbml0aWFsaXplciBhbmQgYXJlIG5ldmVyCisgICAgICAgICAgIC8vLyBtYXJrZWQgJ2NvbnN0YW50Jy4KKyAgICAgICAgICAgQ29tbW9uLAorCisgICAgICAgICAgIC8vLyBEYXRhUmVsIC0gVGhpcyBpcyB0aGUgbW9zdCBnZW5lcmFsIGZvcm0gb2YgZGF0YSB0aGF0IGlzIHdyaXR0ZW4KKyAgICAgICAgICAgLy8vIHRvIGJ5IHRoZSBwcm9ncmFtLCBpdCBjYW4gaGF2ZSByYW5kb20gcmVsb2NhdGlvbnMgdG8gYXJiaXRyYXJ5CisgICAgICAgICAgIC8vLyBnbG9iYWxzLgorICAgICAgICAgICBEYXRhUmVsLAorCisgICAgICAgICAgICAgICAvLy8gRGF0YVJlbExvY2FsIC0gVGhpcyBpcyB3cml0ZWFibGUgZGF0YSB0aGF0IGhhcyBhIG5vbi16ZXJvCisgICAgICAgICAgICAgICAvLy8gaW5pdGlhbGl6ZXIgYW5kIGhhcyByZWxvY2F0aW9ucyBpbiBpdCwgYnV0IGFsbCBvZiB0aGUKKyAgICAgICAgICAgICAgIC8vLyByZWxvY2F0aW9ucyBhcmUga25vd24gdG8gYmUgd2l0aGluIHRoZSBmaW5hbCBsaW5rZWQgaW1hZ2UKKyAgICAgICAgICAgICAgIC8vLyB0aGUgZ2xvYmFsIGlzIGxpbmtlZCBpbnRvLgorICAgICAgICAgICAgICAgRGF0YVJlbExvY2FsLAorCisgICAgICAgICAgICAgICAgICAgLy8vIERhdGFOb1JlbCAtIFRoaXMgaXMgd3JpdGVhYmxlIGRhdGEgdGhhdCBoYXMgYSBub24temVybworICAgICAgICAgICAgICAgICAgIC8vLyBpbml0aWFsaXplciwgYnV0IHdob3NlIGluaXRpYWxpemVyIGlzIGtub3duIHRvIGhhdmUgbm8KKyAgICAgICAgICAgICAgICAgICAvLy8gcmVsb2NhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgRGF0YU5vUmVsLAorCisgICAgICAgICAgIC8vLyBSZWFkT25seVdpdGhSZWwgLSBUaGVzZSBhcmUgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBuZXZlcgorICAgICAgICAgICAvLy8gd3JpdHRlbiB0byBieSB0aGUgcHJvZ3JhbSwgYnV0IHRoYXQgaGF2ZSByZWxvY2F0aW9ucywgc28gdGhleQorICAgICAgICAgICAvLy8gbXVzdCBiZSBzdHVjayBpbiBhIHdyaXRlYWJsZSBzZWN0aW9uIHNvIHRoYXQgdGhlIGR5bmFtaWMgbGlua2VyCisgICAgICAgICAgIC8vLyBjYW4gd3JpdGUgdG8gdGhlbS4gIElmIGl0IGNob29zZXMgdG8sIHRoZSBkeW5hbWljIGxpbmtlciBjYW4KKyAgICAgICAgICAgLy8vIG1hcmsgdGhlIHBhZ2VzIHRoZXNlIGdsb2JhbHMgZW5kIHVwIG9uIGFzIHJlYWQtb25seSBhZnRlciBpdCBpcworICAgICAgICAgICAvLy8gZG9uZSB3aXRoIGl0cyByZWxvY2F0aW9uIHBoYXNlLgorICAgICAgICAgICBSZWFkT25seVdpdGhSZWwsCisKKyAgICAgICAgICAgICAgIC8vLyBSZWFkT25seVdpdGhSZWxMb2NhbCAtIFRoaXMgaXMgZGF0YSB0aGF0IGlzIHJlYWRvbmx5IGJ5IHRoZQorICAgICAgICAgICAgICAgLy8vIHByb2dyYW0sIGJ1dCBtdXN0IGJlIHdyaXRlYWJsZSBzbyB0aGF0IHRoZSBkeW5hbWljIGxpbmtlcgorICAgICAgICAgICAgICAgLy8vIGNhbiBwZXJmb3JtIHJlbG9jYXRpb25zIGluIGl0LiAgVGhpcyBpcyB1c2VkIHdoZW4gd2Uga25vdworICAgICAgICAgICAgICAgLy8vIHRoYXQgYWxsIHRoZSByZWxvY2F0aW9ucyBhcmUgdG8gZ2xvYmFscyBpbiB0aGlzIGZpbmFsCisgICAgICAgICAgICAgICAvLy8gbGlua2VkIGltYWdlLgorICAgICAgICAgICAgICAgUmVhZE9ubHlXaXRoUmVsTG9jYWwKKworICB9IEsgOiA4OworcHVibGljOgorCisgIGJvb2wgaXNNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIEsgPT0gTWV0YWRhdGE7IH0KKyAgYm9vbCBpc1RleHQoKSBjb25zdCB7IHJldHVybiBLID09IFRleHQ7IH0KKworICBib29sIGlzUmVhZE9ubHkoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gUmVhZE9ubHkgfHwgaXNNZXJnZWFibGVDU3RyaW5nKCkgfHwKKyAgICAgICAgICAgaXNNZXJnZWFibGVDb25zdCgpOworICB9CisKKyAgYm9vbCBpc01lcmdlYWJsZUNTdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlMUJ5dGVDU3RyaW5nIHx8IEsgPT0gTWVyZ2VhYmxlMkJ5dGVDU3RyaW5nIHx8CisgICAgICAgICAgIEsgPT0gTWVyZ2VhYmxlNEJ5dGVDU3RyaW5nOworICB9CisgIGJvb2wgaXNNZXJnZWFibGUxQnl0ZUNTdHJpbmcoKSBjb25zdCB7IHJldHVybiBLID09IE1lcmdlYWJsZTFCeXRlQ1N0cmluZzsgfQorICBib29sIGlzTWVyZ2VhYmxlMkJ5dGVDU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gSyA9PSBNZXJnZWFibGUyQnl0ZUNTdHJpbmc7IH0KKyAgYm9vbCBpc01lcmdlYWJsZTRCeXRlQ1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlNEJ5dGVDU3RyaW5nOyB9CisKKyAgYm9vbCBpc01lcmdlYWJsZUNvbnN0KCkgY29uc3QgeworICAgIHJldHVybiBLID09IE1lcmdlYWJsZUNvbnN0IHx8IEsgPT0gTWVyZ2VhYmxlQ29uc3Q0IHx8CisgICAgICAgICAgIEsgPT0gTWVyZ2VhYmxlQ29uc3Q4IHx8IEsgPT0gTWVyZ2VhYmxlQ29uc3QxNjsKKyAgfQorICBib29sIGlzTWVyZ2VhYmxlQ29uc3Q0KCkgY29uc3QgeyByZXR1cm4gSyA9PSBNZXJnZWFibGVDb25zdDQ7IH0KKyAgYm9vbCBpc01lcmdlYWJsZUNvbnN0OCgpIGNvbnN0IHsgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlQ29uc3Q4OyB9CisgIGJvb2wgaXNNZXJnZWFibGVDb25zdDE2KCkgY29uc3QgeyByZXR1cm4gSyA9PSBNZXJnZWFibGVDb25zdDE2OyB9CisKKyAgYm9vbCBpc1dyaXRlYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNUaHJlYWRMb2NhbCgpIHx8IGlzR2xvYmFsV3JpdGVhYmxlRGF0YSgpOworICB9CisKKyAgYm9vbCBpc1RocmVhZExvY2FsKCkgY29uc3QgeworICAgIHJldHVybiBLID09IFRocmVhZERhdGEgfHwgSyA9PSBUaHJlYWRCU1M7CisgIH0KKworICBib29sIGlzVGhyZWFkQlNTKCkgY29uc3QgeyByZXR1cm4gSyA9PSBUaHJlYWRCU1M7IH0KKyAgYm9vbCBpc1RocmVhZERhdGEoKSBjb25zdCB7IHJldHVybiBLID09IFRocmVhZERhdGE7IH0KKworICBib29sIGlzR2xvYmFsV3JpdGVhYmxlRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNCU1MoKSB8fCBpc0NvbW1vbigpIHx8IGlzRGF0YVJlbCgpIHx8IGlzUmVhZE9ubHlXaXRoUmVsKCk7CisgIH0KKworICBib29sIGlzQlNTKCkgY29uc3QgeyByZXR1cm4gSyA9PSBCU1MgfHwgSyA9PSBCU1NMb2NhbCB8fCBLID09IEJTU0V4dGVybjsgfQorICBib29sIGlzQlNTTG9jYWwoKSBjb25zdCB7IHJldHVybiBLID09IEJTU0xvY2FsOyB9CisgIGJvb2wgaXNCU1NFeHRlcm4oKSBjb25zdCB7IHJldHVybiBLID09IEJTU0V4dGVybjsgfQorCisgIGJvb2wgaXNDb21tb24oKSBjb25zdCB7IHJldHVybiBLID09IENvbW1vbjsgfQorCisgIGJvb2wgaXNEYXRhUmVsKCkgY29uc3QgeworICAgIHJldHVybiBLID09IERhdGFSZWwgfHwgSyA9PSBEYXRhUmVsTG9jYWwgfHwgSyA9PSBEYXRhTm9SZWw7CisgIH0KKworICBib29sIGlzRGF0YVJlbExvY2FsKCkgY29uc3QgeworICAgIHJldHVybiBLID09IERhdGFSZWxMb2NhbCB8fCBLID09IERhdGFOb1JlbDsKKyAgfQorCisgIGJvb2wgaXNEYXRhTm9SZWwoKSBjb25zdCB7IHJldHVybiBLID09IERhdGFOb1JlbDsgfQorCisgIGJvb2wgaXNSZWFkT25seVdpdGhSZWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gUmVhZE9ubHlXaXRoUmVsIHx8IEsgPT0gUmVhZE9ubHlXaXRoUmVsTG9jYWw7CisgIH0KKworICBib29sIGlzUmVhZE9ubHlXaXRoUmVsTG9jYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gUmVhZE9ubHlXaXRoUmVsTG9jYWw7CisgIH0KK3ByaXZhdGU6CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXQoS2luZCBLKSB7CisgICAgU2VjdGlvbktpbmQgUmVzOworICAgIFJlcy5LID0gSzsKKyAgICByZXR1cm4gUmVzOworICB9CitwdWJsaWM6CisKKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldE1ldGFkYXRhKCkgeyByZXR1cm4gZ2V0KE1ldGFkYXRhKTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0VGV4dCgpIHsgcmV0dXJuIGdldChUZXh0KTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0UmVhZE9ubHkoKSB7IHJldHVybiBnZXQoUmVhZE9ubHkpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGUxQnl0ZUNTdHJpbmcoKSB7CisgICAgcmV0dXJuIGdldChNZXJnZWFibGUxQnl0ZUNTdHJpbmcpOworICB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGUyQnl0ZUNTdHJpbmcoKSB7CisgICAgcmV0dXJuIGdldChNZXJnZWFibGUyQnl0ZUNTdHJpbmcpOworICB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGU0Qnl0ZUNTdHJpbmcoKSB7CisgICAgcmV0dXJuIGdldChNZXJnZWFibGU0Qnl0ZUNTdHJpbmcpOworICB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGVDb25zdCgpIHsgcmV0dXJuIGdldChNZXJnZWFibGVDb25zdCk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldE1lcmdlYWJsZUNvbnN0NCgpIHsgcmV0dXJuIGdldChNZXJnZWFibGVDb25zdDQpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGVDb25zdDgoKSB7IHJldHVybiBnZXQoTWVyZ2VhYmxlQ29uc3Q4KTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0TWVyZ2VhYmxlQ29uc3QxNigpIHsgcmV0dXJuIGdldChNZXJnZWFibGVDb25zdDE2KTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0VGhyZWFkQlNTKCkgeyByZXR1cm4gZ2V0KFRocmVhZEJTUyk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldFRocmVhZERhdGEoKSB7IHJldHVybiBnZXQoVGhyZWFkRGF0YSk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldEJTUygpIHsgcmV0dXJuIGdldChCU1MpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRCU1NMb2NhbCgpIHsgcmV0dXJuIGdldChCU1NMb2NhbCk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldEJTU0V4dGVybigpIHsgcmV0dXJuIGdldChCU1NFeHRlcm4pOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRDb21tb24oKSB7IHJldHVybiBnZXQoQ29tbW9uKTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0RGF0YVJlbCgpIHsgcmV0dXJuIGdldChEYXRhUmVsKTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0RGF0YVJlbExvY2FsKCkgeyByZXR1cm4gZ2V0KERhdGFSZWxMb2NhbCk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldERhdGFOb1JlbCgpIHsgcmV0dXJuIGdldChEYXRhTm9SZWwpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRSZWFkT25seVdpdGhSZWwoKSB7IHJldHVybiBnZXQoUmVhZE9ubHlXaXRoUmVsKTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0UmVhZE9ubHlXaXRoUmVsTG9jYWwoKXsKKyAgICByZXR1cm4gZ2V0KFJlYWRPbmx5V2l0aFJlbExvY2FsKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTWV0YWRhdGEuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9NZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTAxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vTWV0YWRhdGEuaApAQCAtMCwwICsxLDIyOSBAQAorLy89PT0tLSBsbHZtL01ldGFkYXRhLmggLSBNZXRhZGF0YSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQGZpbGUKKy8vLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBmb3IgbWV0YWRhdGEgc3ViY2xhc3Nlcy4KKy8vLyBUaGV5IHJlcHJlc2VudCB0aGUgZGlmZmVyZW50IGZsYXZvcnMgb2YgbWV0YWRhdGEgdGhhdCBsaXZlIGluIExMVk0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01FVEFEQVRBX0gKKyNkZWZpbmUgTExWTV9NRVRBREFUQV9ICisKKyNpbmNsdWRlICJsbHZtL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTW9kdWxlOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlU3ViQ2xhc3MsIHR5cGVuYW1lIEl0ZW1QYXJlbnRDbGFzcz4KKyAgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzOworICAKKyAgCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIE1EU3RyaW5nIC0gYSBzaW5nbGUgdW5pcXVlZCBzdHJpbmcuCisvLy8gVGhlc2UgYXJlIHVzZWQgdG8gZWZmaWNpZW50bHkgY29udGFpbiBhIGJ5dGUgc2VxdWVuY2UgZm9yIG1ldGFkYXRhLgorLy8vIE1EU3RyaW5nIGlzIGFsd2F5cyB1bm5hbWQuCitjbGFzcyBNRFN0cmluZyA6IHB1YmxpYyBWYWx1ZSB7CisgIE1EU3RyaW5nKGNvbnN0IE1EU3RyaW5nICYpOyAgICAgICAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKworICBTdHJpbmdSZWYgU3RyOworcHJvdGVjdGVkOgorICBleHBsaWNpdCBNRFN0cmluZyhMTFZNQ29udGV4dCAmQywgU3RyaW5nUmVmIFMpOworCitwdWJsaWM6CisgIHN0YXRpYyBNRFN0cmluZyAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgU3RyKTsKKyAgc3RhdGljIE1EU3RyaW5nICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIGNvbnN0IGNoYXIgKlN0cikgeworICAgIHJldHVybiBnZXQoQ29udGV4dCwgU3RyID8gU3RyaW5nUmVmKFN0cikgOiBTdHJpbmdSZWYoKSk7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0U3RyaW5nKCkgY29uc3QgeyByZXR1cm4gU3RyOyB9CisKKyAgdW5zaWduZWQgZ2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKVN0ci5zaXplKCk7IH0KKworICB0eXBlZGVmIFN0cmluZ1JlZjo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIAorICAvLy8gYmVnaW4oKSAtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHN0cmluZy4KKyAgLy8vCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gU3RyLmJlZ2luKCk7IH0KKworICAvLy8gZW5kKCkgLSBQb2ludGVyIHRvIG9uZSBieXRlIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAvLy8KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gU3RyLmVuZCgpOyB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1EU3RyaW5nICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gTURTdHJpbmdWYWw7CisgIH0KK307CisKKyAgCitjbGFzcyBNRE5vZGVPcGVyYW5kOworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gTUROb2RlIC0gYSB0dXBsZSBvZiBvdGhlciB2YWx1ZXMuCitjbGFzcyBNRE5vZGUgOiBwdWJsaWMgVmFsdWUsIHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CisgIE1ETm9kZShjb25zdCBNRE5vZGUgJik7ICAgICAgICAgICAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTUROb2RlICYpOyAgICAgICAgLy8gRE8gTk9UIElNUExFTUVOVAorICBmcmllbmQgY2xhc3MgTUROb2RlT3BlcmFuZDsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKworICAvLy8gTnVtT3BlcmFuZHMgLSBUaGlzIG1hbnkgJ01ETm9kZU9wZXJhbmQnIGl0ZW1zIGFyZSBjby1hbGxvY2F0ZWQgb250byB0aGUKKyAgLy8vIGVuZCBvZiB0aGlzIE1ETm9kZS4KKyAgdW5zaWduZWQgTnVtT3BlcmFuZHM7CisgIAorICAvLyBTdWJjbGFzcyBkYXRhIGVudW1zLgorICBlbnVtIHsKKyAgICAvLy8gRnVuY3Rpb25Mb2NhbEJpdCAtIFRoaXMgYml0IGlzIHNldCBpZiB0aGlzIE1ETm9kZSBpcyBmdW5jdGlvbiBsb2NhbC4KKyAgICAvLy8gVGhpcyBpcyB0cnVlIHdoZW4gaXQgKHBvdGVudGlhbGx5IHRyYW5zaXRpdmVseSkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8KKyAgICAvLy8gc29tZXRoaW5nIGluIGEgZnVuY3Rpb24sIGxpa2UgYW4gYXJndW1lbnQsIGJhc2ljYmxvY2ssIG9yIGluc3RydWN0aW9uLgorICAgIEZ1bmN0aW9uTG9jYWxCaXQgPSAxIDw8IDAsCisgICAgCisgICAgLy8vIE5vdFVuaXF1ZWRCaXQgLSBUaGlzIGlzIHNldCBvbiBNRE5vZGVzIHRoYXQgYXJlIG5vdCB1bmlxdWVkIGJlY2F1c2UgdGhleQorICAgIC8vLyBoYXZlIGEgbnVsbCBvcGVyYW5kLgorICAgIE5vdFVuaXF1ZWRCaXQgICAgPSAxIDw8IDEsCisgICAgCisgICAgLy8vIERlc3Ryb3lGbGFnIC0gVGhpcyBiaXQgaXMgc2V0IGJ5IGRlc3Ryb3koKSBzbyB0aGUgZGVzdHJ1Y3RvciBjYW4gYXNzZXJ0CisgICAgLy8vIHRoYXQgdGhlIG5vZGUgaXNuJ3QgYmVpbmcgZGVzdHJveWVkIHdpdGggYSBwbGFpbiAnZGVsZXRlJy4KKyAgICBEZXN0cm95RmxhZyAgICAgID0gMSA8PCAyCisgIH07CisgIAorICAvLyBGdW5jdGlvbkxvY2FsIGVudW1zLgorICBlbnVtIEZ1bmN0aW9uTG9jYWxuZXNzIHsKKyAgICBGTF9Vbmtub3duID0gLTEsCisgICAgRkxfTm8gPSAwLAorICAgIEZMX1llcyA9IDEKKyAgfTsKKyAgCisgIC8vLyByZXBsYWNlT3BlcmFuZCAtIFJlcGxhY2UgZWFjaCBpbnN0YW5jZSBvZiBGIGZyb20gdGhlIG9wZXJhbmQgbGlzdCBvZiB0aGlzIAorICAvLy8gbm9kZSB3aXRoIFQuCisgIHZvaWQgcmVwbGFjZU9wZXJhbmQoTUROb2RlT3BlcmFuZCAqT3AsIFZhbHVlICpOZXdWYWwpOworICB+TUROb2RlKCk7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgTUROb2RlKExMVk1Db250ZXh0ICZDLCBWYWx1ZSAqY29uc3QgKlZhbHMsIHVuc2lnbmVkIE51bVZhbHMsCisgICAgICAgICAgICAgICAgICBib29sIGlzRnVuY3Rpb25Mb2NhbCk7CisgIAorICBzdGF0aWMgTUROb2RlICpnZXRNRE5vZGUoTExWTUNvbnRleHQgJkMsIFZhbHVlICpjb25zdCAqVmFscywgdW5zaWduZWQgTnVtVmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTG9jYWxuZXNzIEZMLCBib29sIEluc2VydCA9IHRydWUpOworcHVibGljOgorICAvLyBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgorICBzdGF0aWMgTUROb2RlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIFZhbHVlICpjb25zdCAqVmFscywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVZhbHMpOworICAvLyBnZXRXaGVuVmFsc1VucmVzb2x2ZWQgLSBDb25zdHJ1Y3QgTUROb2RlIGRldGVybWluaW5nIGZ1bmN0aW9uLWxvY2FsbmVzcworICAvLyBmcm9tIGlzRnVuY3Rpb25Mb2NhbCBhcmd1bWVudCwgbm90IGJ5IGFuYWx5emluZyBWYWxzLgorICBzdGF0aWMgTUROb2RlICpnZXRXaGVuVmFsc1VucmVzb2x2ZWQoTExWTUNvbnRleHQgJkNvbnRleHQsIFZhbHVlICpjb25zdCAqVmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVZhbHMsIGJvb2wgaXNGdW5jdGlvbkxvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzdGF0aWMgTUROb2RlICpnZXRJZkV4aXN0cyhMTFZNQ29udGV4dCAmQ29udGV4dCwgVmFsdWUgKmNvbnN0ICpWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1WYWxzKTsKKyAgCisgIC8vLyBnZXRPcGVyYW5kIC0gUmV0dXJuIHNwZWNpZmllZCBvcGVyYW5kLgorICBWYWx1ZSAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdDsKKyAgCisgIC8vLyBnZXROdW1PcGVyYW5kcyAtIFJldHVybiBudW1iZXIgb2YgTUROb2RlIG9wZXJhbmRzLgorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wZXJhbmRzOyB9CisgIAorICAvLy8gaXNGdW5jdGlvbkxvY2FsIC0gUmV0dXJuIHdoZXRoZXIgTUROb2RlIGlzIGxvY2FsIHRvIGEgZnVuY3Rpb24uCisgIC8vLyBOb3RlOiBNRE5vZGVzIGFyZSBkZXNpZ25hdGVkIGFzIGZ1bmN0aW9uLWxvY2FsIHdoZW4gY3JlYXRlZCwgYW5kIGtlZXAKKyAgLy8vICAgICAgIHRoYXQgZGVzaWduYXRpb24gZXZlbiBpZiB0aGVpciBvcGVyYW5kcyBhcmUgbW9kaWZpZWQgdG8gbm8gbG9uZ2VyCisgIC8vLyAgICAgICByZWZlciB0byBmdW5jdGlvbi1sb2NhbCBJUi4KKyAgYm9vbCBpc0Z1bmN0aW9uTG9jYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmIEZ1bmN0aW9uTG9jYWxCaXQpICE9IDA7CisgIH0KKyAgCisgIC8vIGdldEZ1bmN0aW9uIC0gSWYgdGhpcyBtZXRhZGF0YSBpcyBmdW5jdGlvbi1sb2NhbCBhbmQgcmVjdXJzaXZlbHkgaGFzIGEKKyAgLy8gZnVuY3Rpb24tbG9jYWwgb3BlcmFuZCwgcmV0dXJuIHRoZSBmaXJzdCBzdWNoIG9wZXJhbmQncyBwYXJlbnQgZnVuY3Rpb24uCisgIC8vIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuIGdldEZ1bmN0aW9uKCkgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBwZXJmb3JtYW5jZS0KKyAgLy8gY3JpdGljYWwgY29kZSBiZWNhdXNlIGl0IHJlY3Vyc2l2ZWx5IHZpc2l0cyBhbGwgdGhlIE1ETm9kZSdzIG9wZXJhbmRzLiAgCisgIGNvbnN0IEZ1bmN0aW9uICpnZXRGdW5jdGlvbigpIGNvbnN0OworCisgIC8vLyBQcm9maWxlIC0gY2FsY3VsYXRlIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgTUROb2RlIHRvIGNvbGxhcHNlCisgIC8vLyBkdXBsaWNhdGVzCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1ETm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IE1ETm9kZVZhbDsKKyAgfQorcHJpdmF0ZToKKyAgLy8gZGVzdHJveSAtIERlbGV0ZSB0aGlzIG5vZGUuICBPbmx5IHdoZW4gdGhlcmUgYXJlIG5vIHVzZXMuCisgIHZvaWQgZGVzdHJveSgpOworCisgIGJvb2wgaXNOb3RVbmlxdWVkKCkgY29uc3QgeyAKKyAgICByZXR1cm4gKGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICYgTm90VW5pcXVlZEJpdCkgIT0gMDsKKyAgfQorICB2b2lkIHNldElzTm90VW5pcXVlZCgpOworICAKKyAgLy8gU2hhZG93IFZhbHVlOjpzZXRWYWx1ZVN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nIG1ldGhvZCBzbyB0aGF0CisgIC8vIGFueSBmdXR1cmUgc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRWYWx1ZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhKEQpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIE5hbWVkTUROb2RlIC0gYSB0dXBsZSBvZiBNRE5vZGVzLgorLy8vIE5hbWVkTUROb2RlIGlzIGFsd2F5cyBuYW1lZC4gQWxsIE5hbWVkTUROb2RlIG9wZXJhbmQgaGFzIGEgdHlwZSBvZiBtZXRhZGF0YS4KK2NsYXNzIE5hbWVkTUROb2RlIDogcHVibGljIGlsaXN0X25vZGU8TmFtZWRNRE5vZGU+IHsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxOYW1lZE1ETm9kZSwgTW9kdWxlPjsKKyAgZnJpZW5kIHN0cnVjdCBpbGlzdF90cmFpdHM8TmFtZWRNRE5vZGU+OworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTW9kdWxlOworICBOYW1lZE1ETm9kZShjb25zdCBOYW1lZE1ETm9kZSAmKTsgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgTW9kdWxlICpQYXJlbnQ7CisgIHZvaWQgKk9wZXJhbmRzOyAvLyBTbWFsbFZlY3RvcjxUcmFja2luZ1ZIPE1ETm9kZT4sIDQ+CisKKyAgdm9pZCBzZXRQYXJlbnQoTW9kdWxlICpNKSB7IFBhcmVudCA9IE07IH0KKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBOYW1lZE1ETm9kZShjb25zdCBUd2luZSAmTik7CisKK3B1YmxpYzoKKyAgLy8vIGVyYXNlRnJvbVBhcmVudCAtIERyb3AgYWxsIHJlZmVyZW5jZXMgYW5kIHJlbW92ZSB0aGUgbm9kZSBmcm9tIHBhcmVudAorICAvLy8gbW9kdWxlLgorICB2b2lkIGVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vLyBkcm9wQWxsUmVmZXJlbmNlcyAtIFJlbW92ZSBhbGwgdXNlcyBhbmQgY2xlYXIgbm9kZSB2ZWN0b3IuCisgIHZvaWQgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKworICAvLy8gfk5hbWVkTUROb2RlIC0gRGVzdHJveSBOYW1lZE1ETm9kZS4KKyAgfk5hbWVkTUROb2RlKCk7CisKKyAgLy8vIGdldFBhcmVudCAtIEdldCB0aGUgbW9kdWxlIHRoYXQgaG9sZHMgdGhpcyBuYW1lZCBtZXRhZGF0YSBjb2xsZWN0aW9uLgorICBpbmxpbmUgTW9kdWxlICpnZXRQYXJlbnQoKSB7IHJldHVybiBQYXJlbnQ7IH0KKyAgaW5saW5lIGNvbnN0IE1vZHVsZSAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8vIGdldE9wZXJhbmQgLSBSZXR1cm4gc3BlY2lmaWVkIG9wZXJhbmQuCisgIE1ETm9kZSAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdDsKKyAgCisgIC8vLyBnZXROdW1PcGVyYW5kcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIE5hbWVkTUROb2RlIG9wZXJhbmRzLgorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0OworCisgIC8vLyBhZGRPcGVyYW5kIC0gQWRkIG1ldGFkYXRhIG9wZXJhbmQuCisgIHZvaWQgYWRkT3BlcmFuZChNRE5vZGUgKk0pOworCisgIC8vLyBnZXROYW1lIC0gUmV0dXJuIGEgY29uc3RhbnQgcmVmZXJlbmNlIHRvIHRoaXMgbmFtZWQgbWV0YWRhdGEncyBuYW1lLgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworCisgIC8vLyBwcmludCAtIEltcGxlbWVudCBvcGVyYXRvcjw8IG9uIE5hbWVkTUROb2RlLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZST1MsIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlciAqQUFXID0gMCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Nb2R1bGUuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Nb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg4MGNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL01vZHVsZS5oCkBAIC0wLDAgKzEsNTUxIEBACisvLz09PS0tIGxsdm0vTW9kdWxlLmggLSBDKysgY2xhc3MgdG8gcmVwcmVzZW50IGEgVk0gbW9kdWxlIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBAZmlsZQorLy8vIE1vZHVsZS5oIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgTW9kdWxlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NT0RVTEVfSAorI2RlZmluZSBMTFZNX01PRFVMRV9ICisKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsQWxpYXMuaCIKKyNpbmNsdWRlICJsbHZtL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uVHlwZTsKK2NsYXNzIEdWTWF0ZXJpYWxpemVyOworY2xhc3MgTExWTUNvbnRleHQ7CisKK3RlbXBsYXRlPD4gc3RydWN0IGlsaXN0X3RyYWl0czxGdW5jdGlvbj4KKyAgOiBwdWJsaWMgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEZ1bmN0aW9uLCBNb2R1bGU+IHsKKworICAvLyBjcmVhdGVTZW50aW5lbCBpcyB1c2VkIHRvIGdldCBob2xkIG9mIHRoZSBub2RlIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGUKKyAgLy8gbGlzdC4uLiAoc2FtZSB0cmljayB1c2VkIGhlcmUgYXMgaW4gaWxpc3RfdHJhaXRzPEluc3RydWN0aW9uPikKKyAgRnVuY3Rpb24gKmNyZWF0ZVNlbnRpbmVsKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxGdW5jdGlvbio+KCZTZW50aW5lbCk7CisgIH0KKyAgc3RhdGljIHZvaWQgZGVzdHJveVNlbnRpbmVsKEZ1bmN0aW9uKikge30KKworICBGdW5jdGlvbiAqcHJvdmlkZUluaXRpYWxIZWFkKCkgY29uc3QgeyByZXR1cm4gY3JlYXRlU2VudGluZWwoKTsgfQorICBGdW5jdGlvbiAqZW5zdXJlSGVhZChGdW5jdGlvbiopIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7IH0KKyAgc3RhdGljIHZvaWQgbm90ZUhlYWQoRnVuY3Rpb24qLCBGdW5jdGlvbiopIHt9CisKK3ByaXZhdGU6CisgIG11dGFibGUgaWxpc3Rfbm9kZTxGdW5jdGlvbj4gU2VudGluZWw7Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaWxpc3RfdHJhaXRzPEdsb2JhbFZhcmlhYmxlPgorICA6IHB1YmxpYyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsVmFyaWFibGUsIE1vZHVsZT4geworICAvLyBjcmVhdGVTZW50aW5lbCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5vZGUgdGhhdCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICBzdGF0aWMgR2xvYmFsVmFyaWFibGUgKmNyZWF0ZVNlbnRpbmVsKCk7CisgIHN0YXRpYyB2b2lkIGRlc3Ryb3lTZW50aW5lbChHbG9iYWxWYXJpYWJsZSAqR1YpIHsgZGVsZXRlIEdWOyB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaWxpc3RfdHJhaXRzPEdsb2JhbEFsaWFzPgorICA6IHB1YmxpYyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsQWxpYXMsIE1vZHVsZT4geworICAvLyBjcmVhdGVTZW50aW5lbCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5vZGUgdGhhdCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICBzdGF0aWMgR2xvYmFsQWxpYXMgKmNyZWF0ZVNlbnRpbmVsKCk7CisgIHN0YXRpYyB2b2lkIGRlc3Ryb3lTZW50aW5lbChHbG9iYWxBbGlhcyAqR0EpIHsgZGVsZXRlIEdBOyB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBpbGlzdF90cmFpdHM8TmFtZWRNRE5vZGU+CisgIDogcHVibGljIGlsaXN0X2RlZmF1bHRfdHJhaXRzPE5hbWVkTUROb2RlPiB7CisgIC8vIGNyZWF0ZVNlbnRpbmVsIGlzIHVzZWQgdG8gZ2V0IGhvbGQgb2YgYSBub2RlIHRoYXQgbWFya3MgdGhlIGVuZCBvZgorICAvLyB0aGUgbGlzdC4uLgorICBOYW1lZE1ETm9kZSAqY3JlYXRlU2VudGluZWwoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE5hbWVkTUROb2RlKj4oJlNlbnRpbmVsKTsKKyAgfQorICBzdGF0aWMgdm9pZCBkZXN0cm95U2VudGluZWwoTmFtZWRNRE5vZGUqKSB7fQorCisgIE5hbWVkTUROb2RlICpwcm92aWRlSW5pdGlhbEhlYWQoKSBjb25zdCB7IHJldHVybiBjcmVhdGVTZW50aW5lbCgpOyB9CisgIE5hbWVkTUROb2RlICplbnN1cmVIZWFkKE5hbWVkTUROb2RlKikgY29uc3QgeyByZXR1cm4gY3JlYXRlU2VudGluZWwoKTsgfQorICBzdGF0aWMgdm9pZCBub3RlSGVhZChOYW1lZE1ETm9kZSosIE5hbWVkTUROb2RlKikge30KKyAgdm9pZCBhZGROb2RlVG9MaXN0KE5hbWVkTUROb2RlICopIHt9CisgIHZvaWQgcmVtb3ZlTm9kZUZyb21MaXN0KE5hbWVkTUROb2RlICopIHt9Citwcml2YXRlOgorICBtdXRhYmxlIGlsaXN0X25vZGU8TmFtZWRNRE5vZGU+IFNlbnRpbmVsOworfTsKKworLy8vIEEgTW9kdWxlIGluc3RhbmNlIGlzIHVzZWQgdG8gc3RvcmUgYWxsIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuCisvLy8gTExWTSBtb2R1bGUuIE1vZHVsZXMgYXJlIHRoZSB0b3AgbGV2ZWwgY29udGFpbmVyIG9mIGFsbCBvdGhlciBMTFZNCisvLy8gSW50ZXJtZWRpYXRlIFJlcHJlc2VudGF0aW9uIChJUikgb2JqZWN0cy4gRWFjaCBtb2R1bGUgZGlyZWN0bHkgY29udGFpbnMgYQorLy8vIGxpc3Qgb2YgZ2xvYmFscyB2YXJpYWJsZXMsIGEgbGlzdCBvZiBmdW5jdGlvbnMsIGEgbGlzdCBvZiBsaWJyYXJpZXMgKG9yCisvLy8gb3RoZXIgbW9kdWxlcykgdGhpcyBtb2R1bGUgZGVwZW5kcyBvbiwgYSBzeW1ib2wgdGFibGUsIGFuZCB2YXJpb3VzIGRhdGEKKy8vLyBhYm91dCB0aGUgdGFyZ2V0J3MgY2hhcmFjdGVyaXN0aWNzLgorLy8vCisvLy8gQSBtb2R1bGUgbWFpbnRhaW5zIGEgR2xvYmFsVmFsUmVmTWFwIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gaG9sZCBhbGwKKy8vLyBjb25zdGFudCByZWZlcmVuY2VzIHRvIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIG1vZHVsZS4gIFdoZW4gYSBnbG9iYWwKKy8vLyB2YXJpYWJsZSBpcyBkZXN0cm95ZWQsIGl0IHNob3VsZCBoYXZlIG5vIGVudHJpZXMgaW4gdGhlIEdsb2JhbFZhbHVlUmVmTWFwLgorLy8vIEBicmllZiBUaGUgbWFpbiBjb250YWluZXIgY2xhc3MgZm9yIHRoZSBMTFZNIEludGVybWVkaWF0ZSBSZXByZXNlbnRhdGlvbi4KK2NsYXNzIE1vZHVsZSB7CisvLy8gQG5hbWUgVHlwZXMgQW5kIEVudW1lcmF0aW9ucworLy8vIEB7CitwdWJsaWM6CisgIC8vLyBUaGUgdHlwZSBmb3IgdGhlIGxpc3Qgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKyAgdHlwZWRlZiBpcGxpc3Q8R2xvYmFsVmFyaWFibGU+IEdsb2JhbExpc3RUeXBlOworICAvLy8gVGhlIHR5cGUgZm9yIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucy4KKyAgdHlwZWRlZiBpcGxpc3Q8RnVuY3Rpb24+IEZ1bmN0aW9uTGlzdFR5cGU7CisgIC8vLyBUaGUgdHlwZSBmb3IgdGhlIGxpc3Qgb2YgYWxpYXNlcy4KKyAgdHlwZWRlZiBpcGxpc3Q8R2xvYmFsQWxpYXM+IEFsaWFzTGlzdFR5cGU7CisgIC8vLyBUaGUgdHlwZSBmb3IgdGhlIGxpc3Qgb2YgbmFtZWQgbWV0YWRhdGEuCisgIHR5cGVkZWYgaWxpc3Q8TmFtZWRNRE5vZGU+IE5hbWVkTURMaXN0VHlwZTsKKworICAvLy8gVGhlIHR5cGUgZm9yIHRoZSBsaXN0IG9mIGRlcGVuZGVudCBsaWJyYXJpZXMuCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpYnJhcnlMaXN0VHlwZTsKKworICAvLy8gVGhlIEdsb2JhbCBWYXJpYWJsZSBpdGVyYXRvci4KKyAgdHlwZWRlZiBHbG9iYWxMaXN0VHlwZTo6aXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX2l0ZXJhdG9yOworICAvLy8gVGhlIEdsb2JhbCBWYXJpYWJsZSBjb25zdGFudCBpdGVyYXRvci4KKyAgdHlwZWRlZiBHbG9iYWxMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICAgY29uc3RfZ2xvYmFsX2l0ZXJhdG9yOworCisgIC8vLyBUaGUgRnVuY3Rpb24gaXRlcmF0b3JzLgorICB0eXBlZGVmIEZ1bmN0aW9uTGlzdFR5cGU6Oml0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgIC8vLyBUaGUgRnVuY3Rpb24gY29uc3RhbnQgaXRlcmF0b3IKKyAgdHlwZWRlZiBGdW5jdGlvbkxpc3RUeXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBUaGUgR2xvYmFsIEFsaWFzIGl0ZXJhdG9ycy4KKyAgdHlwZWRlZiBBbGlhc0xpc3RUeXBlOjppdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzX2l0ZXJhdG9yOworICAvLy8gVGhlIEdsb2JhbCBBbGlhcyBjb25zdGFudCBpdGVyYXRvcgorICB0eXBlZGVmIEFsaWFzTGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgY29uc3RfYWxpYXNfaXRlcmF0b3I7CisKKyAgLy8vIFRoZSBuYW1lZCBtZXRhZGF0YSBpdGVyYXRvcnMuCisgIHR5cGVkZWYgTmFtZWRNRExpc3RUeXBlOjppdGVyYXRvciAgICAgICAgICAgICBuYW1lZF9tZXRhZGF0YV9pdGVyYXRvcjsKKyAgLy8vIFRoZSBuYW1lZCBtZXRhZGF0YSBjb25zdGFudCBpbnRlcmF0b3JzLgorICB0eXBlZGVmIE5hbWVkTURMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3I7CisgIC8vLyBUaGUgTGlicmFyeSBsaXN0IGl0ZXJhdG9yLgorICB0eXBlZGVmIExpYnJhcnlMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3IgbGliX2l0ZXJhdG9yOworCisgIC8vLyBBbiBlbnVtZXJhdGlvbiBmb3IgZGVzY3JpYmluZyB0aGUgZW5kaWFuZXNzIG9mIHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgZW51bSBFbmRpYW5uZXNzICB7IEFueUVuZGlhbm5lc3MsIExpdHRsZUVuZGlhbiwgQmlnRW5kaWFuIH07CisKKyAgLy8vIEFuIGVudW1lcmF0aW9uIGZvciBkZXNjcmliaW5nIHRoZSBzaXplIG9mIGEgcG9pbnRlciBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgIGVudW0gUG9pbnRlclNpemUgeyBBbnlQb2ludGVyU2l6ZSwgUG9pbnRlcjMyLCBQb2ludGVyNjQgfTsKKworLy8vIEB9CisvLy8gQG5hbWUgTWVtYmVyIFZhcmlhYmxlcworLy8vIEB7Citwcml2YXRlOgorICBMTFZNQ29udGV4dCAmQ29udGV4dDsgICAgICAgICAgIC8vLzwgVGhlIExMVk1Db250ZXh0IGZyb20gd2hpY2ggdHlwZXMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjb25zdGFudHMgYXJlIGFsbG9jYXRlZC4KKyAgR2xvYmFsTGlzdFR5cGUgR2xvYmFsTGlzdDsgICAgICAvLy88IFRoZSBHbG9iYWwgVmFyaWFibGVzIGluIHRoZSBtb2R1bGUKKyAgRnVuY3Rpb25MaXN0VHlwZSBGdW5jdGlvbkxpc3Q7ICAvLy88IFRoZSBGdW5jdGlvbnMgaW4gdGhlIG1vZHVsZQorICBBbGlhc0xpc3RUeXBlIEFsaWFzTGlzdDsgICAgICAgIC8vLzwgVGhlIEFsaWFzZXMgaW4gdGhlIG1vZHVsZQorICBMaWJyYXJ5TGlzdFR5cGUgTGlicmFyeUxpc3Q7ICAgIC8vLzwgVGhlIExpYnJhcmllcyBuZWVkZWQgYnkgdGhlIG1vZHVsZQorICBOYW1lZE1ETGlzdFR5cGUgTmFtZWRNRExpc3Q7ICAgIC8vLzwgVGhlIG5hbWVkIG1ldGFkYXRhIGluIHRoZSBtb2R1bGUKKyAgc3RkOjpzdHJpbmcgR2xvYmFsU2NvcGVBc207ICAgICAvLy88IElubGluZSBBc20gYXQgZ2xvYmFsIHNjb3BlLgorICBWYWx1ZVN5bWJvbFRhYmxlICpWYWxTeW1UYWI7ICAgIC8vLzwgU3ltYm9sIHRhYmxlIGZvciB2YWx1ZXMKKyAgVHlwZVN5bWJvbFRhYmxlICpUeXBlU3ltVGFiOyAgICAvLy88IFN5bWJvbCB0YWJsZSBmb3IgdHlwZXMKKyAgT3duaW5nUHRyPEdWTWF0ZXJpYWxpemVyPiBNYXRlcmlhbGl6ZXI7ICAvLy88IFVzZWQgdG8gbWF0ZXJpYWxpemUgR2xvYmFsVmFsdWVzCisgIHN0ZDo6c3RyaW5nIE1vZHVsZUlEOyAgICAgICAgICAgLy8vPCBIdW1hbiByZWFkYWJsZSBpZGVudGlmaWVyIGZvciB0aGUgbW9kdWxlCisgIHN0ZDo6c3RyaW5nIFRhcmdldFRyaXBsZTsgICAgICAgLy8vPCBQbGF0Zm9ybSB0YXJnZXQgdHJpcGxlIE1vZHVsZSBjb21waWxlZCBvbgorICBzdGQ6OnN0cmluZyBEYXRhTGF5b3V0OyAgICAgICAgIC8vLzwgVGFyZ2V0IGRhdGEgZGVzY3JpcHRpb24KKyAgdm9pZCAqTmFtZWRNRFN5bVRhYjsgICAgICAgICAgICAvLy88IE5hbWVkTUROb2RlIG5hbWVzLgorCisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworLy8vIEB9CisvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisvLy8gQHsKK3B1YmxpYzoKKyAgLy8vIFRoZSBNb2R1bGUgY29uc3RydWN0b3IuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBZb3UKKyAgLy8vIG11c3QgcHJvdmlkZSBhIG5hbWUgZm9yIHRoZSBtb2R1bGUgdXBvbiBjb25zdHJ1Y3Rpb24uCisgIGV4cGxpY2l0IE1vZHVsZShTdHJpbmdSZWYgTW9kdWxlSUQsIExMVk1Db250ZXh0JiBDKTsKKyAgLy8vIFRoZSBtb2R1bGUgZGVzdHJ1Y3Rvci4gVGhpcyB3aWxsIGRyb3BBbGxSZWZlcmVuY2VzLgorICB+TW9kdWxlKCk7CisKKy8vLyBAfQorLy8vIEBuYW1lIE1vZHVsZSBMZXZlbCBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBHZXQgdGhlIG1vZHVsZSBpZGVudGlmaWVyIHdoaWNoIGlzLCBlc3NlbnRpYWxseSwgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KKyAgLy8vIEByZXR1cm5zIHRoZSBtb2R1bGUgaWRlbnRpZmllciBhcyBhIHN0cmluZworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TW9kdWxlSWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIE1vZHVsZUlEOyB9CisKKyAgLy8vIEdldCB0aGUgZGF0YSBsYXlvdXQgc3RyaW5nIGZvciB0aGUgbW9kdWxlJ3MgdGFyZ2V0IHBsYXRmb3JtLiAgVGhpcyBlbmNvZGVzCisgIC8vLyB0aGUgdHlwZSBzaXplcyBhbmQgYWxpZ25tZW50cyBleHBlY3RlZCBieSB0aGlzIG1vZHVsZS4KKyAgLy8vIEByZXR1cm5zIHRoZSBkYXRhIGxheW91dCBhcyBhIHN0cmluZworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0RGF0YUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIERhdGFMYXlvdXQ7IH0KKworICAvLy8gR2V0IHRoZSB0YXJnZXQgdHJpcGxlIHdoaWNoIGlzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHRhcmdldCBob3N0LgorICAvLy8gQHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdGFyZ2V0IHRyaXBsZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFRhcmdldFRyaXBsZSgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFRyaXBsZTsgfQorCisgIC8vLyBHZXQgdGhlIHRhcmdldCBlbmRpYW4gaW5mb3JtYXRpb24uCisgIC8vLyBAcmV0dXJucyBFbmRpYW5lc3MgLSBhbiBlbnVtZXJhdGlvbiBmb3IgdGhlIGVuZGlhbmVzcyBvZiB0aGUgdGFyZ2V0CisgIEVuZGlhbm5lc3MgZ2V0RW5kaWFubmVzcygpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHRhcmdldCBwb2ludGVyIHNpemUuCisgIC8vLyBAcmV0dXJucyBQb2ludGVyU2l6ZSAtIGFuIGVudW1lcmF0aW9uIGZvciB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0J3MgcG9pbnRlcgorICBQb2ludGVyU2l6ZSBnZXRQb2ludGVyU2l6ZSgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGdsb2JhbCBkYXRhIGNvbnRleHQuCisgIC8vLyBAcmV0dXJucyBMTFZNQ29udGV4dCAtIGEgY29udGFpbmVyIGZvciBMTFZNJ3MgZ2xvYmFsIGluZm9ybWF0aW9uCisgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIC8vLyBHZXQgYW55IG1vZHVsZS1zY29wZSBpbmxpbmUgYXNzZW1ibHkgYmxvY2tzLgorICAvLy8gQHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbW9kdWxlLXNjb3BlIGlubGluZSBhc3NlbWJseSBibG9ja3MuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRNb2R1bGVJbmxpbmVBc20oKSBjb25zdCB7IHJldHVybiBHbG9iYWxTY29wZUFzbTsgfQorCisvLy8gQH0KKy8vLyBAbmFtZSBNb2R1bGUgTGV2ZWwgTXV0YXRvcnMKKy8vLyBAeworCisgIC8vLyBTZXQgdGhlIG1vZHVsZSBpZGVudGlmaWVyLgorICB2b2lkIHNldE1vZHVsZUlkZW50aWZpZXIoU3RyaW5nUmVmIElEKSB7IE1vZHVsZUlEID0gSUQ7IH0KKworICAvLy8gU2V0IHRoZSBkYXRhIGxheW91dAorICB2b2lkIHNldERhdGFMYXlvdXQoU3RyaW5nUmVmIERMKSB7IERhdGFMYXlvdXQgPSBETDsgfQorCisgIC8vLyBTZXQgdGhlIHRhcmdldCB0cmlwbGUuCisgIHZvaWQgc2V0VGFyZ2V0VHJpcGxlKFN0cmluZ1JlZiBUKSB7IFRhcmdldFRyaXBsZSA9IFQ7IH0KKworICAvLy8gU2V0IHRoZSBtb2R1bGUtc2NvcGUgaW5saW5lIGFzc2VtYmx5IGJsb2Nrcy4KKyAgdm9pZCBzZXRNb2R1bGVJbmxpbmVBc20oU3RyaW5nUmVmIEFzbSkgeyBHbG9iYWxTY29wZUFzbSA9IEFzbTsgfQorCisgIC8vLyBBcHBlbmQgdG8gdGhlIG1vZHVsZS1zY29wZSBpbmxpbmUgYXNzZW1ibHkgYmxvY2tzLCBhdXRvbWF0aWNhbGx5IGluc2VydGluZworICAvLy8gYSBzZXBhcmF0aW5nIG5ld2xpbmUgaWYgbmVjZXNzYXJ5LgorICB2b2lkIGFwcGVuZE1vZHVsZUlubGluZUFzbShTdHJpbmdSZWYgQXNtKSB7CisgICAgaWYgKCFHbG9iYWxTY29wZUFzbS5lbXB0eSgpICYmCisgICAgICAgIEdsb2JhbFNjb3BlQXNtW0dsb2JhbFNjb3BlQXNtLnNpemUoKS0xXSAhPSAnXG4nKQorICAgICAgR2xvYmFsU2NvcGVBc20gKz0gJ1xuJzsKKyAgICBHbG9iYWxTY29wZUFzbSArPSBBc207CisgIH0KKworLy8vIEB9CisvLy8gQG5hbWUgR2VuZXJpYyBWYWx1ZSBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBnZXROYW1lZFZhbHVlIC0gUmV0dXJuIHRoZSBmaXJzdCBnbG9iYWwgdmFsdWUgaW4gdGhlIG1vZHVsZSB3aXRoCisgIC8vLyB0aGUgc3BlY2lmaWVkIG5hbWUsIG9mIGFyYml0cmFyeSB0eXBlLiAgVGhpcyBtZXRob2QgcmV0dXJucyBudWxsCisgIC8vLyBpZiBhIGdsb2JhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZm91bmQuCisgIEdsb2JhbFZhbHVlICpnZXROYW1lZFZhbHVlKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gZ2V0TURLaW5kSUQgLSBSZXR1cm4gYSB1bmlxdWUgbm9uLXplcm8gSUQgZm9yIHRoZSBzcGVjaWZpZWQgbWV0YWRhdGEga2luZC4KKyAgLy8vIFRoaXMgSUQgaXMgdW5pcXVlZCBhY3Jvc3MgbW9kdWxlcyBpbiB0aGUgY3VycmVudCBMTFZNQ29udGV4dC4KKyAgdW5zaWduZWQgZ2V0TURLaW5kSUQoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBnZXRNREtpbmROYW1lcyAtIFBvcHVsYXRlIGNsaWVudCBzdXBwbGllZCBTbWFsbFZlY3RvciB3aXRoIHRoZSBuYW1lIGZvcgorICAvLy8gY3VzdG9tIG1ldGFkYXRhIElEcyByZWdpc3RlcmVkIGluIHRoaXMgTExWTUNvbnRleHQuCisgIHZvaWQgZ2V0TURLaW5kTmFtZXMoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJlJlc3VsdCkgY29uc3Q7CisKKy8vLyBAfQorLy8vIEBuYW1lIEZ1bmN0aW9uIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIGdldE9ySW5zZXJ0RnVuY3Rpb24gLSBMb29rIHVwIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaW4gdGhlIG1vZHVsZSBzeW1ib2wKKyAgLy8vIHRhYmxlLiAgRm91ciBwb3NzaWJpbGl0aWVzOgorICAvLy8gICAxLiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgYWRkIGEgcHJvdG90eXBlIGZvciB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdC4KKyAgLy8vICAgMi4gSWYgaXQgZXhpc3RzLCBhbmQgaGFzIGEgbG9jYWwgbGlua2FnZSwgdGhlIGV4aXN0aW5nIGZ1bmN0aW9uIGlzCisgIC8vLyAgICAgIHJlbmFtZWQgYW5kIGEgbmV3IG9uZSBpcyBpbnNlcnRlZC4KKyAgLy8vICAgMy4gT3RoZXJ3aXNlLCBpZiB0aGUgZXhpc3RpbmcgZnVuY3Rpb24gaGFzIHRoZSBjb3JyZWN0IHByb3RvdHlwZSwgcmV0dXJuCisgIC8vLyAgICAgIHRoZSBleGlzdGluZyBmdW5jdGlvbi4KKyAgLy8vICAgNC4gRmluYWxseSwgdGhlIGZ1bmN0aW9uIGV4aXN0cyBidXQgaGFzIHRoZSB3cm9uZyBwcm90b3R5cGU6IHJldHVybiB0aGUKKyAgLy8vICAgICAgZnVuY3Rpb24gd2l0aCBhIGNvbnN0YW50ZXhwciBjYXN0IHRvIHRoZSByaWdodCBwcm90b3R5cGUuCisgIENvbnN0YW50ICpnZXRPckluc2VydEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBGdW5jdGlvblR5cGUgKlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJMaXN0UHRyIEF0dHJpYnV0ZUxpc3QpOworCisgIENvbnN0YW50ICpnZXRPckluc2VydEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBGdW5jdGlvblR5cGUgKlQpOworCisgIC8vLyBnZXRPckluc2VydEZ1bmN0aW9uIC0gTG9vayB1cCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGluIHRoZSBtb2R1bGUgc3ltYm9sCisgIC8vLyB0YWJsZS4gIElmIGl0IGRvZXMgbm90IGV4aXN0LCBhZGQgYSBwcm90b3R5cGUgZm9yIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuCisgIC8vLyBpdC4gIFRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0byByZXR1cm4gYSBjb25zdGFudCBvZiBwb2ludGVyIHRvIHRoZQorICAvLy8gc3BlY2lmaWVkIGZ1bmN0aW9uIHR5cGUgb3IgYSBDb25zdGFudEV4cHIgQml0Q2FzdCBvZiB0aGF0IHR5cGUgaWYgdGhlCisgIC8vLyBuYW1lZCBmdW5jdGlvbiBoYXMgYSBkaWZmZXJlbnQgdHlwZS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIHRha2VzIGEKKyAgLy8vIG51bGwgdGVybWluYXRlZCBsaXN0IG9mIGZ1bmN0aW9uIGFyZ3VtZW50cywgd2hpY2ggbWFrZXMgaXQgZWFzaWVyIGZvcgorICAvLy8gY2xpZW50cyB0byB1c2UuCisgIENvbnN0YW50ICpnZXRPckluc2VydEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyTGlzdFB0ciBBdHRyaWJ1dGVMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpSZXRUeSwgLi4uKSAgRU5EX1dJVEhfTlVMTDsKKworICAvLy8gZ2V0T3JJbnNlcnRGdW5jdGlvbiAtIFNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRob3V0IHRoZSBhdHRyaWJ1dGVzLgorICBDb25zdGFudCAqZ2V0T3JJbnNlcnRGdW5jdGlvbihTdHJpbmdSZWYgTmFtZSwgY29uc3QgVHlwZSAqUmV0VHksIC4uLikKKyAgICBFTkRfV0lUSF9OVUxMOworCisgIENvbnN0YW50ICpnZXRPckluc2VydFRhcmdldEludHJpbnNpYyhTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyTGlzdFB0ciBBdHRyaWJ1dGVMaXN0KTsKKworICAvLy8gZ2V0RnVuY3Rpb24gLSBMb29rIHVwIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaW4gdGhlIG1vZHVsZSBzeW1ib2wgdGFibGUuCisgIC8vLyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIG51bGwuCisgIEZ1bmN0aW9uICpnZXRGdW5jdGlvbihTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CisKKy8vLyBAfQorLy8vIEBuYW1lIEdsb2JhbCBWYXJpYWJsZSBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBnZXRHbG9iYWxWYXJpYWJsZSAtIExvb2sgdXAgdGhlIHNwZWNpZmllZCBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIG1vZHVsZQorICAvLy8gc3ltYm9sIHRhYmxlLiAgSWYgaXQgZG9lcyBub3QgZXhpc3QsIHJldHVybiBudWxsLiBJZiBBbGxvd0ludGVybmFsIGlzIHNldAorICAvLy8gdG8gdHJ1ZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0eXBlcyB0aGF0IGhhdmUgSW50ZXJuYWxMaW5rYWdlLiBCeQorICAvLy8gZGVmYXVsdCwgdGhlc2UgdHlwZXMgYXJlIG5vdCByZXR1cm5lZC4KKyAgR2xvYmFsVmFyaWFibGUgKmdldEdsb2JhbFZhcmlhYmxlKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0ludGVybmFsID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBnZXROYW1lZEdsb2JhbCAtIFJldHVybiB0aGUgZmlyc3QgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSBtb2R1bGUgd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCBuYW1lLCBvZiBhcmJpdHJhcnkgdHlwZS4gIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiBhIGdsb2JhbAorICAvLy8gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGZvdW5kLgorICBHbG9iYWxWYXJpYWJsZSAqZ2V0TmFtZWRHbG9iYWwoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0R2xvYmFsVmFyaWFibGUoTmFtZSwgdHJ1ZSk7CisgIH0KKworICAvLy8gZ2V0T3JJbnNlcnRHbG9iYWwgLSBMb29rIHVwIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIGluIHRoZSBtb2R1bGUgc3ltYm9sCisgIC8vLyB0YWJsZS4KKyAgLy8vICAgMS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGFkZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBnbG9iYWwgYW5kIHJldHVybiBpdC4KKyAgLy8vICAgMi4gRWxzZSwgdGhlIGdsb2JhbCBleGlzdHMgYnV0IGhhcyB0aGUgd3JvbmcgdHlwZTogcmV0dXJuIHRoZSBmdW5jdGlvbgorICAvLy8gICAgICB3aXRoIGEgY29uc3RhbnRleHByIGNhc3QgdG8gdGhlIHJpZ2h0IHR5cGUuCisgIC8vLyAgIDMuIEZpbmFsbHksIGlmIHRoZSBleGlzdGluZyBnbG9iYWwgaXMgdGhlIGNvcnJlY3QgZGVsY2xhcmF0aW9uLCByZXR1cm4KKyAgLy8vICAgICAgdGhlIGV4aXN0aW5nIGdsb2JhbC4KKyAgQ29uc3RhbnQgKmdldE9ySW5zZXJ0R2xvYmFsKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBUeXBlICpUeSk7CisKKy8vLyBAfQorLy8vIEBuYW1lIEdsb2JhbCBBbGlhcyBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBnZXROYW1lZEFsaWFzIC0gUmV0dXJuIHRoZSBmaXJzdCBnbG9iYWwgYWxpYXMgaW4gdGhlIG1vZHVsZSB3aXRoIHRoZQorICAvLy8gc3BlY2lmaWVkIG5hbWUsIG9mIGFyYml0cmFyeSB0eXBlLiAgVGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGlmIGEgZ2xvYmFsCisgIC8vLyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZm91bmQuCisgIEdsb2JhbEFsaWFzICpnZXROYW1lZEFsaWFzKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgTmFtZWQgTWV0YWRhdGEgQWNjZXNzb3JzCisvLy8gQHsKKworICAvLy8gZ2V0TmFtZWRNZXRhZGF0YSAtIFJldHVybiB0aGUgZmlyc3QgTmFtZWRNRE5vZGUgaW4gdGhlIG1vZHVsZSB3aXRoIHRoZQorICAvLy8gc3BlY2lmaWVkIG5hbWUuIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiBhIE5hbWVkTUROb2RlIHdpdGggdGhlCisgIC8vLyBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZm91bmQuCisgIE5hbWVkTUROb2RlICpnZXROYW1lZE1ldGFkYXRhKGNvbnN0IFR3aW5lICZOYW1lKSBjb25zdDsKKworICAvLy8gZ2V0T3JJbnNlcnROYW1lZE1ldGFkYXRhIC0gUmV0dXJuIHRoZSBmaXJzdCBuYW1lZCBNRE5vZGUgaW4gdGhlIG1vZHVsZQorICAvLy8gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgTmFtZWRNRE5vZGUgaWYgYQorICAvLy8gTmFtZWRNRE5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGZvdW5kLgorICBOYW1lZE1ETm9kZSAqZ2V0T3JJbnNlcnROYW1lZE1ldGFkYXRhKFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gZXJhc2VOYW1lZE1ldGFkYXRhIC0gUmVtb3ZlIHRoZSBnaXZlbiBOYW1lZE1ETm9kZSBmcm9tIHRoaXMgbW9kdWxlCisgIC8vLyBhbmQgZGVsZXRlIGl0LgorICB2b2lkIGVyYXNlTmFtZWRNZXRhZGF0YShOYW1lZE1ETm9kZSAqTk1EKTsKKworLy8vIEB9CisvLy8gQG5hbWUgVHlwZSBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBhZGRUeXBlTmFtZSAtIEluc2VydCBhbiBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlIG1hcHBpbmcgU3RyIHRvIFR5cGUuICBJZgorICAvLy8gdGhlcmUgaXMgYWxyZWFkeSBhbiBlbnRyeSBmb3IgdGhpcyBuYW1lLCB0cnVlIGlzIHJldHVybmVkIGFuZCB0aGUgc3ltYm9sCisgIC8vLyB0YWJsZSBpcyBub3QgbW9kaWZpZWQuCisgIGJvb2wgYWRkVHlwZU5hbWUoU3RyaW5nUmVmIE5hbWUsIGNvbnN0IFR5cGUgKlR5KTsKKworICAvLy8gZ2V0VHlwZU5hbWUgLSBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZSwgcmV0dXJuIGl0LgorICBzdGQ6OnN0cmluZyBnZXRUeXBlTmFtZShjb25zdCBUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIGdldFR5cGVCeU5hbWUgLSBSZXR1cm4gdGhlIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyBtb2R1bGUsIG9yCisgIC8vLyBudWxsIGlmIHRoZXJlIGlzIG5vbmUgYnkgdGhhdCBuYW1lLgorICBjb25zdCBUeXBlICpnZXRUeXBlQnlOYW1lKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgTWF0ZXJpYWxpemF0aW9uCisvLy8gQHsKKworICAvLy8gc2V0TWF0ZXJpYWxpemVyIC0gU2V0cyB0aGUgR1ZNYXRlcmlhbGl6ZXIgdG8gR1ZNLiAgVGhpcyBtb2R1bGUgbXVzdCBub3QKKyAgLy8vIHlldCBoYXZlIGEgTWF0ZXJpYWxpemVyLiAgVG8gcmVzZXQgdGhlIG1hdGVyaWFsaXplciBmb3IgYSBtb2R1bGUgdGhhdAorICAvLy8gYWxyZWFkeSBoYXMgb25lLCBjYWxsIE1hdGVyaWFsaXplQWxsUGVybWFuZW50bHkgZmlyc3QuICBEZXN0cm95aW5nIHRoaXMKKyAgLy8vIG1vZHVsZSB3aWxsIGRlc3Ryb3kgaXRzIG1hdGVyaWFsaXplciB3aXRob3V0IG1hdGVyaWFsaXppbmcgYW55IG1vcmUKKyAgLy8vIEdsb2JhbFZhbHVlcy4gIFdpdGhvdXQgZGVzdHJveWluZyB0aGUgTW9kdWxlLCB0aGVyZSBpcyBubyB3YXkgdG8gZGV0YWNoIG9yCisgIC8vLyBkZXN0cm95IGEgbWF0ZXJpYWxpemVyIHdpdGhvdXQgbWF0ZXJpYWxpemluZyBhbGwgdGhlIEdWcyBpdCBjb250cm9scywgdG8KKyAgLy8vIGF2b2lkIGxlYXZpbmcgb3JwaGFuIHVubWF0ZXJpYWxpemVkIEdWcy4KKyAgdm9pZCBzZXRNYXRlcmlhbGl6ZXIoR1ZNYXRlcmlhbGl6ZXIgKkdWTSk7CisgIC8vLyBnZXRNYXRlcmlhbGl6ZXIgLSBSZXRyaWV2ZXMgdGhlIEdWTWF0ZXJpYWxpemVyLCBpZiBhbnksIGZvciB0aGlzIE1vZHVsZS4KKyAgR1ZNYXRlcmlhbGl6ZXIgKmdldE1hdGVyaWFsaXplcigpIGNvbnN0IHsgcmV0dXJuIE1hdGVyaWFsaXplci5nZXQoKTsgfQorCisgIC8vLyBpc01hdGVyaWFsaXphYmxlIC0gVHJ1ZSBpZiB0aGUgZGVmaW5pdGlvbiBvZiBHViBoYXMgeWV0IHRvIGJlIG1hdGVyaWFsaXplZAorICAvLy8gZnJvbSB0aGUgR1ZNYXRlcmlhbGl6ZXIuCisgIGJvb2wgaXNNYXRlcmlhbGl6YWJsZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0OworICAvLy8gaXNEZW1hdGVyaWFsaXphYmxlIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgR1Ygd2FzIGxvYWRlZCBmcm9tIHRoaXMgTW9kdWxlJ3MKKyAgLy8vIEdWTWF0ZXJpYWxpemVyIGFuZCB0aGUgR1ZNYXRlcmlhbGl6ZXIga25vd3MgaG93IHRvIGRlbWF0ZXJpYWxpemUgdGhlIEdWLgorICBib29sIGlzRGVtYXRlcmlhbGl6YWJsZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0OworCisgIC8vLyBNYXRlcmlhbGl6ZSAtIE1ha2Ugc3VyZSB0aGUgR2xvYmFsVmFsdWUgaXMgZnVsbHkgcmVhZC4gIElmIHRoZSBtb2R1bGUgaXMKKyAgLy8vIGNvcnJ1cHQsIHRoaXMgcmV0dXJucyB0cnVlIGFuZCBmaWxscyBpbiB0aGUgb3B0aW9uYWwgc3RyaW5nIHdpdGgKKyAgLy8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ibGVtLiAgSWYgc3VjY2Vzc2Z1bCwgdGhpcyByZXR1cm5zIGZhbHNlLgorICBib29sIE1hdGVyaWFsaXplKEdsb2JhbFZhbHVlICpHViwgc3RkOjpzdHJpbmcgKkVyckluZm8gPSAwKTsKKyAgLy8vIERlbWF0ZXJpYWxpemUgLSBJZiB0aGUgR2xvYmFsVmFsdWUgaXMgcmVhZCBpbiwgYW5kIGlmIHRoZSBHVk1hdGVyaWFsaXplcgorICAvLy8gc3VwcG9ydHMgaXQsIHJlbGVhc2UgdGhlIG1lbW9yeSBmb3IgdGhlIGZ1bmN0aW9uLCBhbmQgc2V0IGl0IHVwIHRvIGJlCisgIC8vLyBtYXRlcmlhbGl6ZWQgbGF6aWx5LiAgSWYgIWlzRGVtYXRlcmlhbGl6YWJsZSgpLCB0aGlzIG1ldGhvZCBpcyBhIG5vb3AuCisgIHZvaWQgRGVtYXRlcmlhbGl6ZShHbG9iYWxWYWx1ZSAqR1YpOworCisgIC8vLyBNYXRlcmlhbGl6ZUFsbCAtIE1ha2Ugc3VyZSBhbGwgR2xvYmFsVmFsdWVzIGluIHRoaXMgTW9kdWxlIGFyZSBmdWxseSByZWFkLgorICAvLy8gSWYgdGhlIG1vZHVsZSBpcyBjb3JydXB0LCB0aGlzIHJldHVybnMgdHJ1ZSBhbmQgZmlsbHMgaW4gdGhlIG9wdGlvbmFsCisgIC8vLyBzdHJpbmcgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvYmxlbS4gIElmIHN1Y2Nlc3NmdWwsIHRoaXMgcmV0dXJucworICAvLy8gZmFsc2UuCisgIGJvb2wgTWF0ZXJpYWxpemVBbGwoc3RkOjpzdHJpbmcgKkVyckluZm8gPSAwKTsKKworICAvLy8gTWF0ZXJpYWxpemVBbGxQZXJtYW5lbnRseSAtIE1ha2Ugc3VyZSBhbGwgR2xvYmFsVmFsdWVzIGluIHRoaXMgTW9kdWxlIGFyZQorICAvLy8gZnVsbHkgcmVhZCBhbmQgY2xlYXIgdGhlIE1hdGVyaWFsaXplci4gIElmIHRoZSBtb2R1bGUgaXMgY29ycnVwdCwgdGhpcworICAvLy8gcmV0dXJucyB0cnVlLCBmaWxscyBpbiB0aGUgb3B0aW9uYWwgc3RyaW5nIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgIC8vLyBwcm9ibGVtLCBhbmQgRE9FUyBOT1QgY2xlYXIgdGhlIG9sZCBNYXRlcmlhbGl6ZXIuICBJZiBzdWNjZXNzZnVsLCB0aGlzCisgIC8vLyByZXR1cm5zIGZhbHNlLgorICBib29sIE1hdGVyaWFsaXplQWxsUGVybWFuZW50bHkoc3RkOjpzdHJpbmcgKkVyckluZm8gPSAwKTsKKworLy8vIEB9CisvLy8gQG5hbWUgRGlyZWN0IGFjY2VzcyB0byB0aGUgZ2xvYmFscyBsaXN0LCBmdW5jdGlvbnMgbGlzdCwgYW5kIHN5bWJvbCB0YWJsZQorLy8vIEB7CisKKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3MgbGlzdCBvZiBnbG9iYWwgdmFyaWFibGVzIChjb25zdGFudCkuCisgIGNvbnN0IEdsb2JhbExpc3RUeXBlICAgJmdldEdsb2JhbExpc3QoKSBjb25zdCAgICAgICB7IHJldHVybiBHbG9iYWxMaXN0OyB9CisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKyAgR2xvYmFsTGlzdFR5cGUgICAgICAgICAmZ2V0R2xvYmFsTGlzdCgpICAgICAgICAgICAgIHsgcmV0dXJuIEdsb2JhbExpc3Q7IH0KKyAgc3RhdGljIGlwbGlzdDxHbG9iYWxWYXJpYWJsZT4gTW9kdWxlOjoqZ2V0U3VibGlzdEFjY2VzcyhHbG9iYWxWYXJpYWJsZSopIHsKKyAgICByZXR1cm4gJk1vZHVsZTo6R2xvYmFsTGlzdDsKKyAgfQorICAvLy8gR2V0IHRoZSBNb2R1bGUncyBsaXN0IG9mIGZ1bmN0aW9ucyAoY29uc3RhbnQpLgorICBjb25zdCBGdW5jdGlvbkxpc3RUeXBlICZnZXRGdW5jdGlvbkxpc3QoKSBjb25zdCAgICAgeyByZXR1cm4gRnVuY3Rpb25MaXN0OyB9CisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgZnVuY3Rpb25zLgorICBGdW5jdGlvbkxpc3RUeXBlICAgICAgICZnZXRGdW5jdGlvbkxpc3QoKSAgICAgICAgICAgeyByZXR1cm4gRnVuY3Rpb25MaXN0OyB9CisgIHN0YXRpYyBpcGxpc3Q8RnVuY3Rpb24+IE1vZHVsZTo6KmdldFN1Ymxpc3RBY2Nlc3MoRnVuY3Rpb24qKSB7CisgICAgcmV0dXJuICZNb2R1bGU6OkZ1bmN0aW9uTGlzdDsKKyAgfQorICAvLy8gR2V0IHRoZSBNb2R1bGUncyBsaXN0IG9mIGFsaWFzZXMgKGNvbnN0YW50KS4KKyAgY29uc3QgQWxpYXNMaXN0VHlwZSAgICAmZ2V0QWxpYXNMaXN0KCkgY29uc3QgICAgICAgIHsgcmV0dXJuIEFsaWFzTGlzdDsgfQorICAvLy8gR2V0IHRoZSBNb2R1bGUncyBsaXN0IG9mIGFsaWFzZXMuCisgIEFsaWFzTGlzdFR5cGUgICAgICAgICAgJmdldEFsaWFzTGlzdCgpICAgICAgICAgICAgICB7IHJldHVybiBBbGlhc0xpc3Q7IH0KKyAgc3RhdGljIGlwbGlzdDxHbG9iYWxBbGlhcz4gTW9kdWxlOjoqZ2V0U3VibGlzdEFjY2VzcyhHbG9iYWxBbGlhcyopIHsKKyAgICByZXR1cm4gJk1vZHVsZTo6QWxpYXNMaXN0OworICB9CisgIC8vLyBHZXQgdGhlIHN5bWJvbCB0YWJsZSBvZiBnbG9iYWwgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIGlkZW50aWZpZXJzCisgIGNvbnN0IFZhbHVlU3ltYm9sVGFibGUgJmdldFZhbHVlU3ltYm9sVGFibGUoKSBjb25zdCB7IHJldHVybiAqVmFsU3ltVGFiOyB9CisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIHN5bWJvbCB0YWJsZSBvZiBnbG9iYWwgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIGlkZW50aWZpZXJzLgorICBWYWx1ZVN5bWJvbFRhYmxlICAgICAgICZnZXRWYWx1ZVN5bWJvbFRhYmxlKCkgICAgICAgeyByZXR1cm4gKlZhbFN5bVRhYjsgfQorICAvLy8gR2V0IHRoZSBzeW1ib2wgdGFibGUgb2YgdHlwZXMKKyAgY29uc3QgVHlwZVN5bWJvbFRhYmxlICAmZ2V0VHlwZVN5bWJvbFRhYmxlKCkgY29uc3QgIHsgcmV0dXJuICpUeXBlU3ltVGFiOyB9CisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIHN5bWJvbCB0YWJsZSBvZiB0eXBlcworICBUeXBlU3ltYm9sVGFibGUgICAgICAgICZnZXRUeXBlU3ltYm9sVGFibGUoKSAgICAgICAgeyByZXR1cm4gKlR5cGVTeW1UYWI7IH0KKworLy8vIEB9CisvLy8gQG5hbWUgR2xvYmFsIFZhcmlhYmxlIEl0ZXJhdGlvbgorLy8vIEB7CisKKyAgLy8vIEdldCBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgZ2xvYmFsIHZhcmlhYmxlCisgIGdsb2JhbF9pdGVyYXRvciAgICAgICBnbG9iYWxfYmVnaW4oKSAgICAgICB7IHJldHVybiBHbG9iYWxMaXN0LmJlZ2luKCk7IH0KKyAgLy8vIEdldCBhIGNvbnN0YW50IGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBnbG9iYWwgdmFyaWFibGUKKyAgY29uc3RfZ2xvYmFsX2l0ZXJhdG9yIGdsb2JhbF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEdsb2JhbExpc3QuYmVnaW4oKTsgfQorICAvLy8gR2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGdsb2JhbCB2YXJpYWJsZQorICBnbG9iYWxfaXRlcmF0b3IgICAgICAgZ2xvYmFsX2VuZCAgKCkgICAgICAgeyByZXR1cm4gR2xvYmFsTGlzdC5lbmQoKTsgfQorICAvLy8gR2V0IGEgY29uc3RhbnQgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZ2xvYmFsIHZhcmlhYmxlCisgIGNvbnN0X2dsb2JhbF9pdGVyYXRvciBnbG9iYWxfZW5kICAoKSBjb25zdCB7IHJldHVybiBHbG9iYWxMaXN0LmVuZCgpOyB9CisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGxpc3Qgb2YgZ2xvYmFscyBpcyBlbXB0eS4KKyAgYm9vbCAgICAgICAgICAgICAgICAgIGdsb2JhbF9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEdsb2JhbExpc3QuZW1wdHkoKTsgfQorCisvLy8gQH0KKy8vLyBAbmFtZSBGdW5jdGlvbiBJdGVyYXRpb24KKy8vLyBAeworCisgIC8vLyBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGZ1bmN0aW9uLgorICBpdGVyYXRvciAgICAgICAgICAgICAgICBiZWdpbigpICAgICAgIHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5iZWdpbigpOyB9CisgIC8vLyBHZXQgYSBjb25zdGFudCBpdGVyYXRvciB0byB0aGUgZmlyc3QgZnVuY3Rpb24uCisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25MaXN0LmJlZ2luKCk7IH0KKyAgLy8vIEdldCBhbiBpdGVyYXRvciB0byB0aGUgbGFzdCBmdW5jdGlvbi4KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgZW5kICAoKSAgICAgICB7IHJldHVybiBGdW5jdGlvbkxpc3QuZW5kKCk7ICAgfQorICAvLy8gR2V0IGEgY29uc3RhbnQgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZnVuY3Rpb24uCisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25MaXN0LmVuZCgpOyAgIH0KKyAgLy8vIERldGVybWluZSBob3cgbWFueSBmdW5jdGlvbnMgYXJlIGluIHRoZSBNb2R1bGUncyBsaXN0IG9mIGZ1bmN0aW9ucy4KKyAgc2l6ZV90ICAgICAgICAgICAgICAgICAgc2l6ZSgpIGNvbnN0ICB7IHJldHVybiBGdW5jdGlvbkxpc3Quc2l6ZSgpOyB9CisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGlzIGVtcHR5LgorICBib29sICAgICAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5lbXB0eSgpOyB9CisKKy8vLyBAfQorLy8vIEBuYW1lIERlcGVuZGVudCBMaWJyYXJ5IEl0ZXJhdGlvbgorLy8vIEB7CisKKyAgLy8vIEBicmllZiBHZXQgYSBjb25zdGFudCBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgZGVwZW5kZW50IGxpYnJhcnkgbGlzdC4KKyAgaW5saW5lIGxpYl9pdGVyYXRvciBsaWJfYmVnaW4oKSBjb25zdCB7IHJldHVybiBMaWJyYXJ5TGlzdC5iZWdpbigpOyB9CisgIC8vLyBAYnJpZWYgR2V0IGEgY29uc3RhbnQgaXRlcmF0b3IgdG8gZW5kIG9mIGRlcGVuZGVudCBsaWJyYXJ5IGxpc3QuCisgIGlubGluZSBsaWJfaXRlcmF0b3IgbGliX2VuZCgpICAgY29uc3QgeyByZXR1cm4gTGlicmFyeUxpc3QuZW5kKCk7ICAgfQorICAvLy8gQGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdCBvZiBsaWJyYXJpZXMuCisgIGlubGluZSBzaXplX3QgICAgICAgbGliX3NpemUoKSAgY29uc3QgeyByZXR1cm4gTGlicmFyeUxpc3Quc2l6ZSgpOyAgfQorICAvLy8gQGJyaWVmIEFkZCBhIGxpYnJhcnkgdG8gdGhlIGxpc3Qgb2YgZGVwZW5kZW50IGxpYnJhcmllcworICB2b2lkIGFkZExpYnJhcnkoU3RyaW5nUmVmIExpYik7CisgIC8vLyBAYnJpZWYgUmVtb3ZlIGEgbGlicmFyeSBmcm9tIHRoZSBsaXN0IG9mIGRlcGVuZGVudCBsaWJyYXJpZXMKKyAgdm9pZCByZW1vdmVMaWJyYXJ5KFN0cmluZ1JlZiBMaWIpOworICAvLy8gQGJyaWVmIEdldCBhbGwgdGhlIGxpYnJhcmllcworICBpbmxpbmUgY29uc3QgTGlicmFyeUxpc3RUeXBlJiBnZXRMaWJyYXJpZXMoKSBjb25zdCB7IHJldHVybiBMaWJyYXJ5TGlzdDsgfQorCisvLy8gQH0KKy8vLyBAbmFtZSBBbGlhcyBJdGVyYXRpb24KKy8vLyBAeworCisgIC8vLyBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGFsaWFzLgorICBhbGlhc19pdGVyYXRvciAgICAgICBhbGlhc19iZWdpbigpICAgICAgICAgICAgeyByZXR1cm4gQWxpYXNMaXN0LmJlZ2luKCk7IH0KKyAgLy8vIEdldCBhIGNvbnN0YW50IGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBhbGlhcy4KKyAgY29uc3RfYWxpYXNfaXRlcmF0b3IgYWxpYXNfYmVnaW4oKSBjb25zdCAgICAgIHsgcmV0dXJuIEFsaWFzTGlzdC5iZWdpbigpOyB9CisgIC8vLyBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGxhc3QgYWxpYXMuCisgIGFsaWFzX2l0ZXJhdG9yICAgICAgIGFsaWFzX2VuZCAgKCkgICAgICAgICAgICB7IHJldHVybiBBbGlhc0xpc3QuZW5kKCk7ICAgfQorICAvLy8gR2V0IGEgY29uc3RhbnQgaXRlcmF0b3IgdG8gdGhlIGxhc3QgYWxpYXMuCisgIGNvbnN0X2FsaWFzX2l0ZXJhdG9yIGFsaWFzX2VuZCAgKCkgY29uc3QgICAgICB7IHJldHVybiBBbGlhc0xpc3QuZW5kKCk7ICAgfQorICAvLy8gRGV0ZXJtaW5lIGhvdyBtYW55IGFsaWFzZXMgYXJlIGluIHRoZSBNb2R1bGUncyBsaXN0IG9mIGFsaWFzZXMuCisgIHNpemVfdCAgICAgICAgICAgICAgIGFsaWFzX3NpemUgKCkgY29uc3QgICAgICB7IHJldHVybiBBbGlhc0xpc3Quc2l6ZSgpOyAgfQorICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBsaXN0IG9mIGFsaWFzZXMgaXMgZW1wdHkuCisgIGJvb2wgICAgICAgICAgICAgICAgIGFsaWFzX2VtcHR5KCkgY29uc3QgICAgICB7IHJldHVybiBBbGlhc0xpc3QuZW1wdHkoKTsgfQorCisKKy8vLyBAfQorLy8vIEBuYW1lIE5hbWVkIE1ldGFkYXRhIEl0ZXJhdGlvbgorLy8vIEB7CisKKyAgLy8vIEdldCBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgbmFtZWQgbWV0YWRhdGEuCisgIG5hbWVkX21ldGFkYXRhX2l0ZXJhdG9yIG5hbWVkX21ldGFkYXRhX2JlZ2luKCkgeyByZXR1cm4gTmFtZWRNRExpc3QuYmVnaW4oKTsgfQorICAvLy8gR2V0IGEgY29uc3RhbnQgaXRlcmF0b3IgdG8gdGhlIGZpcnN0IG5hbWVkIG1ldGFkYXRhLgorICBjb25zdF9uYW1lZF9tZXRhZGF0YV9pdGVyYXRvciBuYW1lZF9tZXRhZGF0YV9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gTmFtZWRNRExpc3QuYmVnaW4oKTsKKyAgfQorCisgIC8vLyBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGxhc3QgbmFtZWQgbWV0YWRhdGEuCisgIG5hbWVkX21ldGFkYXRhX2l0ZXJhdG9yIG5hbWVkX21ldGFkYXRhX2VuZCgpIHsgcmV0dXJuIE5hbWVkTURMaXN0LmVuZCgpOyB9CisgIC8vLyBHZXQgYSBjb25zdGFudCBpdGVyYXRvciB0byB0aGUgbGFzdCBuYW1lZCBtZXRhZGF0YS4KKyAgY29uc3RfbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3IgbmFtZWRfbWV0YWRhdGFfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBOYW1lZE1ETGlzdC5lbmQoKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaG93IG1hbnkgTmFtZWRNRE5vZGVzIGFyZSBpbiB0aGUgTW9kdWxlJ3MgbGlzdCBvZiBuYW1lZAorICAvLy8gbWV0YWRhdGEuCisgIHNpemVfdCBuYW1lZF9tZXRhZGF0YV9zaXplKCkgY29uc3QgeyByZXR1cm4gTmFtZWRNRExpc3Quc2l6ZSgpOyAgfQorICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBsaXN0IG9mIG5hbWVkIG1ldGFkYXRhIGlzIGVtcHR5LgorICBib29sIG5hbWVkX21ldGFkYXRhX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTmFtZWRNRExpc3QuZW1wdHkoKTsgfQorCisKKy8vLyBAfQorLy8vIEBuYW1lIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBwcmludGluZyBhbmQgZHVtcGluZyBNb2R1bGUgb2JqZWN0cworLy8vIEB7CisKKyAgLy8vIFByaW50IHRoZSBtb2R1bGUgdG8gYW4gb3V0cHV0IHN0cmVhbSB3aXRoIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlci4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlciAqQUFXKSBjb25zdDsKKworICAvLy8gRHVtcCB0aGUgbW9kdWxlIHRvIHN0ZGVyciAoZm9yIGRlYnVnZ2luZykuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICAvLy8gVGhpcyBmdW5jdGlvbiBjYXVzZXMgYWxsIHRoZSBzdWJpbnN0cnVjdGlvbnMgdG8gImxldCBnbyIgb2YgYWxsIHJlZmVyZW5jZXMKKyAgLy8vIHRoYXQgdGhleSBhcmUgbWFpbnRhaW5pbmcuICBUaGlzIGFsbG93cyBvbmUgdG8gJ2RlbGV0ZScgYSB3aG9sZSBjbGFzcyBhdAorICAvLy8gYSB0aW1lLCBldmVuIHRob3VnaCB0aGVyZSBtYXkgYmUgY2lyY3VsYXIgcmVmZXJlbmNlcy4uLiBmaXJzdCBhbGwKKyAgLy8vIHJlZmVyZW5jZXMgYXJlIGRyb3BwZWQsIGFuZCBhbGwgdXNlIGNvdW50cyBnbyB0byB6ZXJvLiAgVGhlbiBldmVyeXRoaW5nCisgIC8vLyBpcyBkZWxldGUnZCBmb3IgcmVhbC4gIE5vdGUgdGhhdCBubyBvcGVyYXRpb25zIGFyZSB2YWxpZCBvbiBhbiBvYmplY3QKKyAgLy8vIHRoYXQgaGFzICJkcm9wcGVkIGFsbCByZWZlcmVuY2VzIiwgZXhjZXB0IG9wZXJhdG9yIGRlbGV0ZS4KKyAgdm9pZCBkcm9wQWxsUmVmZXJlbmNlcygpOworLy8vIEB9Cit9OworCisvLy8gQW4gcmF3X29zdHJlYW0gaW5zZXJ0ZXIgZm9yIG1vZHVsZXMuCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk8sIGNvbnN0IE1vZHVsZSAmTSkgeworICBNLnByaW50KE8sIDApOworICByZXR1cm4gTzsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vT3BlcmFuZFRyYWl0cy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL09wZXJhbmRUcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjE0Y2NiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL09wZXJhbmRUcmFpdHMuaApAQCAtMCwwICsxLDIwNyBAQAorLy89PT0tLSBsbHZtL09wZXJhbmRUcmFpdHMuaCAtIE9wZXJhbmRUcmFpdHMgY2xhc3MgZGVmaW5pdGlvbiAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdHJhaXRzIGNsYXNzZXMgdGhhdCBhcmUgaGFuZHkgZm9yIGVuZm9yY2luZyB0aGUgY29ycmVjdAorLy8gbGF5b3V0IG9mIHZhcmlvdXMgVXNlciBzdWJjbGFzc2VzLiBJdCBhbHNvIHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgYWNjZXNzaW5nCisvLyB0aGUgb3BlcmFuZHMgaW4gdGhlIG1vc3QgZWZmaWNpZW50IG1hbm5lci4KKy8vCisKKyNpZm5kZWYgTExWTV9PUEVSQU5EX1RSQUlUU19ICisjZGVmaW5lIExMVk1fT1BFUkFORF9UUkFJVFNfSAorCisjaW5jbHVkZSAibGx2bS9Vc2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZE51bU9wZXJhbmQgVHJhaXQgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBGaXhlZE51bU9wZXJhbmRUcmFpdHMgLSBkZXRlcm1pbmUgdGhlIGFsbG9jYXRpb24gcmVnaW1lIG9mIHRoZSBVc2UgYXJyYXkKKy8vLyB3aGVuIGl0IGlzIGEgcHJlZml4IHRvIHRoZSBVc2VyIG9iamVjdCwgYW5kIHRoZSBudW1iZXIgb2YgVXNlIG9iamVjdHMgaXMKKy8vLyBrbm93biBhdCBjb21waWxlIHRpbWUuCisKK3RlbXBsYXRlIDx1bnNpZ25lZCBBUklUWT4KK3N0cnVjdCBGaXhlZE51bU9wZXJhbmRUcmFpdHMgeworICBzdGF0aWMgVXNlICpvcF9iZWdpbihVc2VyKiBVKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VXNlKj4oVSkgLSBBUklUWTsKKyAgfQorICBzdGF0aWMgVXNlICpvcF9lbmQoVXNlciogVSkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFVzZSo+KFUpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBvcGVyYW5kcyhjb25zdCBVc2VyKikgeworICAgIHJldHVybiBBUklUWTsKKyAgfQorICBzdHJ1Y3QgcHJlZml4IHsKKyAgICBVc2UgT3BzW0FSSVRZXTsKKyAgICBwcmVmaXgoKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICB9OworICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgc3RydWN0IExheW91dCB7CisgICAgc3RydWN0IG92ZXJsYXkgOiBwdWJsaWMgcHJlZml4LCBwdWJsaWMgVSB7CisgICAgICBvdmVybGF5KCk7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgICB9OworICB9OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbE9wZXJhbmQgVHJhaXQgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBPcHRpb25hbE9wZXJhbmRUcmFpdHMgLSB3aGVuIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgbWF5IGNoYW5nZSBhdCBydW50aW1lLgorLy8vIE5hdHVyYWxseSBpdCBtYXkgb25seSBkZWNyZWFzZSwgYmVjYXVzZSB0aGUgYWxsb2NhdGlvbnMgbWF5IG5vdCBjaGFuZ2UuCisKK3RlbXBsYXRlIDx1bnNpZ25lZCBBUklUWSA9IDE+CitzdHJ1Y3QgT3B0aW9uYWxPcGVyYW5kVHJhaXRzIDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxBUklUWT4geworICBzdGF0aWMgdW5zaWduZWQgb3BlcmFuZHMoY29uc3QgVXNlciAqVSkgeworICAgIHJldHVybiBVLT5nZXROdW1PcGVyYW5kcygpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhZGljT3BlcmFuZCBUcmFpdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFZhcmlhZGljT3BlcmFuZFRyYWl0cyAtIGRldGVybWluZSB0aGUgYWxsb2NhdGlvbiByZWdpbWUgb2YgdGhlIFVzZSBhcnJheQorLy8vIHdoZW4gaXQgaXMgYSBwcmVmaXggdG8gdGhlIFVzZXIgb2JqZWN0LCBhbmQgdGhlIG51bWJlciBvZiBVc2Ugb2JqZWN0cyBpcworLy8vIG9ubHkga25vd24gYXQgYWxsb2NhdGlvbiB0aW1lLgorCit0ZW1wbGF0ZSA8dW5zaWduZWQgTUlOQVJJVFkgPSAwPgorc3RydWN0IFZhcmlhZGljT3BlcmFuZFRyYWl0cyB7CisgIHN0YXRpYyBVc2UgKm9wX2JlZ2luKFVzZXIqIFUpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxVc2UqPihVKSAtIFUtPmdldE51bU9wZXJhbmRzKCk7CisgIH0KKyAgc3RhdGljIFVzZSAqb3BfZW5kKFVzZXIqIFUpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxVc2UqPihVKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgb3BlcmFuZHMoY29uc3QgVXNlciAqVSkgeworICAgIHJldHVybiBVLT5nZXROdW1PcGVyYW5kcygpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEh1bmdvZmZPcGVyYW5kIFRyYWl0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gSHVuZ29mZk9wZXJhbmRUcmFpdHMgLSBkZXRlcm1pbmUgdGhlIGFsbG9jYXRpb24gcmVnaW1lIG9mIHRoZSBVc2UgYXJyYXkKKy8vLyB3aGVuIGl0IGlzIG5vdCBhIHByZWZpeCB0byB0aGUgVXNlciBvYmplY3QsIGJ1dCBhbGxvY2F0ZWQgYXQgYW4gdW5yZWxhdGVkCisvLy8gaGVhcCBhZGRyZXNzLgorLy8vIEFzc3VtZXMgdGhhdCB0aGUgVXNlciBzdWJjbGFzcyB0aGF0IGlzIGRldGVybWluZWQgYnkgdGhpcyB0cmFpdHMgY2xhc3MKKy8vLyBoYXMgYW4gT3BlcmFuZExpc3QgbWVtYmVyIG9mIHR5cGUgVXNlcjo6b3BfaXRlcmF0b3IuIFtOb3RlOiB0aGlzIGlzIG5vdworLy8vIHRyaXZpYWxseSBzYXRpc2ZpZWQsIGJlY2F1c2UgVXNlciBoYXMgdGhhdCBtZW1iZXIgZm9yIGhpc3RvcmljIHJlYXNvbnMuXQorLy8vCisvLy8gVGhpcyBpcyB0aGUgdHJhaXRzIGNsYXNzIHRoYXQgaXMgbmVlZGVkIHdoZW4gdGhlIFVzZSBhcnJheSBtdXN0IGJlCisvLy8gcmVzaXphYmxlLgorCit0ZW1wbGF0ZSA8dW5zaWduZWQgTUlOQVJJVFkgPSAxPgorc3RydWN0IEh1bmdvZmZPcGVyYW5kVHJhaXRzIHsKKyAgc3RhdGljIFVzZSAqb3BfYmVnaW4oVXNlciogVSkgeworICAgIHJldHVybiBVLT5PcGVyYW5kTGlzdDsKKyAgfQorICBzdGF0aWMgVXNlICpvcF9lbmQoVXNlciogVSkgeworICAgIHJldHVybiBVLT5PcGVyYW5kTGlzdCArIFUtPmdldE51bU9wZXJhbmRzKCk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIG9wZXJhbmRzKGNvbnN0IFVzZXIgKlUpIHsKKyAgICByZXR1cm4gVS0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgfQorfTsKKworLy8vIE1hY3JvIGZvciBnZW5lcmF0aW5nIGluLWNsYXNzIG9wZXJhbmQgYWNjZXNzb3IgZGVjbGFyYXRpb25zLgorLy8vIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgcHVibGljIHNlY3Rpb24gb2YgdGhlIGludGVyZmFjZS4KKy8vLworI2RlZmluZSBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZBTFVFQ0xBU1MpIFwKKyAgcHVibGljOiBcCisgIGlubGluZSBWQUxVRUNMQVNTICpnZXRPcGVyYW5kKHVuc2lnbmVkKSBjb25zdDsgXAorICBpbmxpbmUgdm9pZCBzZXRPcGVyYW5kKHVuc2lnbmVkLCBWQUxVRUNMQVNTKik7IFwKKyAgaW5saW5lIG9wX2l0ZXJhdG9yIG9wX2JlZ2luKCk7IFwKKyAgaW5saW5lIGNvbnN0X29wX2l0ZXJhdG9yIG9wX2JlZ2luKCkgY29uc3Q7IFwKKyAgaW5saW5lIG9wX2l0ZXJhdG9yIG9wX2VuZCgpOyBcCisgIGlubGluZSBjb25zdF9vcF9pdGVyYXRvciBvcF9lbmQoKSBjb25zdDsgXAorICBwcm90ZWN0ZWQ6IFwKKyAgdGVtcGxhdGUgPGludD4gaW5saW5lIFVzZSAmT3AoKTsgXAorICB0ZW1wbGF0ZSA8aW50PiBpbmxpbmUgY29uc3QgVXNlICZPcCgpIGNvbnN0OyBcCisgIHB1YmxpYzogXAorICBpbmxpbmUgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdAorCisvLy8gTWFjcm8gZm9yIGdlbmVyYXRpbmcgb3V0LW9mLWNsYXNzIG9wZXJhbmQgYWNjZXNzb3IgZGVmaW5pdGlvbnMKKyNkZWZpbmUgREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENMQVNTLCBWQUxVRUNMQVNTKSBcCitDTEFTUzo6b3BfaXRlcmF0b3IgQ0xBU1M6Om9wX2JlZ2luKCkgeyBcCisgIHJldHVybiBPcGVyYW5kVHJhaXRzPENMQVNTPjo6b3BfYmVnaW4odGhpcyk7IFwKK30gXAorQ0xBU1M6OmNvbnN0X29wX2l0ZXJhdG9yIENMQVNTOjpvcF9iZWdpbigpIGNvbnN0IHsgXAorICByZXR1cm4gT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wX2JlZ2luKGNvbnN0X2Nhc3Q8Q0xBU1MqPih0aGlzKSk7IFwKK30gXAorQ0xBU1M6Om9wX2l0ZXJhdG9yIENMQVNTOjpvcF9lbmQoKSB7IFwKKyAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9lbmQodGhpcyk7IFwKK30gXAorQ0xBU1M6OmNvbnN0X29wX2l0ZXJhdG9yIENMQVNTOjpvcF9lbmQoKSBjb25zdCB7IFwKKyAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9lbmQoY29uc3RfY2FzdDxDTEFTUyo+KHRoaXMpKTsgXAorfSBcCitWQUxVRUNMQVNTICpDTEFTUzo6Z2V0T3BlcmFuZCh1bnNpZ25lZCBpX25vY2FwdHVyZSkgY29uc3QgeyBcCisgIGFzc2VydChpX25vY2FwdHVyZSA8IE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcGVyYW5kcyh0aGlzKSBcCisgICAgICAgICAmJiAiZ2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsgXAorICByZXR1cm4gc3RhdGljX2Nhc3Q8VkFMVUVDTEFTUyo+KCBcCisgICAgT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wX2JlZ2luKGNvbnN0X2Nhc3Q8Q0xBU1MqPih0aGlzKSlbaV9ub2NhcHR1cmVdKTsgXAorfSBcCit2b2lkIENMQVNTOjpzZXRPcGVyYW5kKHVuc2lnbmVkIGlfbm9jYXB0dXJlLCBWQUxVRUNMQVNTICpWYWxfbm9jYXB0dXJlKSB7IFwKKyAgYXNzZXJ0KGlfbm9jYXB0dXJlIDwgT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wZXJhbmRzKHRoaXMpIFwKKyAgICAgICAgICYmICJzZXRPcGVyYW5kKCkgb3V0IG9mIHJhbmdlISIpOyBcCisgIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9iZWdpbih0aGlzKVtpX25vY2FwdHVyZV0gPSBWYWxfbm9jYXB0dXJlOyBcCit9IFwKK3Vuc2lnbmVkIENMQVNTOjpnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgXAorICByZXR1cm4gT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wZXJhbmRzKHRoaXMpOyAgXAorfSBcCit0ZW1wbGF0ZSA8aW50IElkeF9ub2NhcHR1cmU+IFVzZSAmQ0xBU1M6Ok9wKCkgeyBcCisgIHJldHVybiB0aGlzLT5PcEZyb208SWR4X25vY2FwdHVyZT4odGhpcyk7IFwKK30gXAordGVtcGxhdGUgPGludCBJZHhfbm9jYXB0dXJlPiBjb25zdCBVc2UgJkNMQVNTOjpPcCgpIGNvbnN0IHsgXAorICByZXR1cm4gdGhpcy0+T3BGcm9tPElkeF9ub2NhcHR1cmU+KHRoaXMpOyBcCit9CisKKworLy8vIE1hY3JvIGZvciBnZW5lcmF0aW5nIG91dC1vZi1jbGFzcyBvcGVyYW5kIGFjY2Vzc29yCisvLy8gZGVmaW5pdGlvbnMgd2l0aCBjYXN0ZWQgcmVzdWx0CisjZGVmaW5lIERFRklORV9UUkFOU1BBUkVOVF9DQVNURURfT1BFUkFORF9BQ0NFU1NPUlMoQ0xBU1MsIFZBTFVFQ0xBU1MpIFwKK0NMQVNTOjpvcF9pdGVyYXRvciBDTEFTUzo6b3BfYmVnaW4oKSB7IFwKKyAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9iZWdpbih0aGlzKTsgXAorfSBcCitDTEFTUzo6Y29uc3Rfb3BfaXRlcmF0b3IgQ0xBU1M6Om9wX2JlZ2luKCkgY29uc3QgeyBcCisgIHJldHVybiBPcGVyYW5kVHJhaXRzPENMQVNTPjo6b3BfYmVnaW4oY29uc3RfY2FzdDxDTEFTUyo+KHRoaXMpKTsgXAorfSBcCitDTEFTUzo6b3BfaXRlcmF0b3IgQ0xBU1M6Om9wX2VuZCgpIHsgXAorICByZXR1cm4gT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wX2VuZCh0aGlzKTsgXAorfSBcCitDTEFTUzo6Y29uc3Rfb3BfaXRlcmF0b3IgQ0xBU1M6Om9wX2VuZCgpIGNvbnN0IHsgXAorICByZXR1cm4gT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wX2VuZChjb25zdF9jYXN0PENMQVNTKj4odGhpcykpOyBcCit9IFwKK1ZBTFVFQ0xBU1MgKkNMQVNTOjpnZXRPcGVyYW5kKHVuc2lnbmVkIGlfbm9jYXB0dXJlKSBjb25zdCB7IFwKKyAgYXNzZXJ0KGlfbm9jYXB0dXJlIDwgT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wZXJhbmRzKHRoaXMpIFwKKyAgICAgICAgICYmICJnZXRPcGVyYW5kKCkgb3V0IG9mIHJhbmdlISIpOyBcCisgIHJldHVybiBjYXN0PFZBTFVFQ0xBU1M+KCBcCisgICAgT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wX2JlZ2luKGNvbnN0X2Nhc3Q8Q0xBU1MqPih0aGlzKSlbaV9ub2NhcHR1cmVdKTsgXAorfSBcCit2b2lkIENMQVNTOjpzZXRPcGVyYW5kKHVuc2lnbmVkIGlfbm9jYXB0dXJlLCBWQUxVRUNMQVNTICpWYWxfbm9jYXB0dXJlKSB7IFwKKyAgYXNzZXJ0KGlfbm9jYXB0dXJlIDwgT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wZXJhbmRzKHRoaXMpIFwKKyAgICAgICAgICYmICJzZXRPcGVyYW5kKCkgb3V0IG9mIHJhbmdlISIpOyBcCisgIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9iZWdpbih0aGlzKVtpX25vY2FwdHVyZV0gPSBWYWxfbm9jYXB0dXJlOyBcCit9IFwKK3Vuc2lnbmVkIENMQVNTOjpnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgXAorICByZXR1cm4gT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wZXJhbmRzKHRoaXMpOyBcCit9IFwKK3RlbXBsYXRlIDxpbnQgSWR4X25vY2FwdHVyZT4gVXNlICZDTEFTUzo6T3AoKSB7IFwKKyAgcmV0dXJuIHRoaXMtPk9wRnJvbTxJZHhfbm9jYXB0dXJlPih0aGlzKTsgXAorfSBcCit0ZW1wbGF0ZSA8aW50IElkeF9ub2NhcHR1cmU+IGNvbnN0IFVzZSAmQ0xBU1M6Ok9wKCkgY29uc3QgeyBcCisgIHJldHVybiB0aGlzLT5PcEZyb208SWR4X25vY2FwdHVyZT4odGhpcyk7IFwKK30KKworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9PcGVyYXRvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL09wZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4NjVhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9PcGVyYXRvci5oCkBAIC0wLDAgKzEsMzA2IEBACisvLz09PS0tIGxsdm0vT3BlcmF0b3IuaCAtIE9wZXJhdG9yIHV0aWxpdHkgc3ViY2xhc3MgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHZhcmlvdXMgY2xhc3NlcyBmb3Igd29ya2luZyB3aXRoIEluc3RydWN0aW9ucyBhbmQKKy8vIENvbnN0YW50RXhwcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09QRVJBVE9SX0gKKyNkZWZpbmUgTExWTV9PUEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBHZXRFbGVtZW50UHRySW5zdDsKK2NsYXNzIEJpbmFyeU9wZXJhdG9yOworY2xhc3MgQ29uc3RhbnRFeHByOworCisvLy8gT3BlcmF0b3IgLSBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciB0aGUKKy8vLyBjb21tb24gZnVuY3Rpb25hbGl0eSBiZXR3ZWVuIEluc3RydWN0aW9ucyBhbmQgQ29uc3RhbnRFeHBycy4KKy8vLworY2xhc3MgT3BlcmF0b3IgOiBwdWJsaWMgVXNlciB7Citwcml2YXRlOgorICAvLyBEbyBub3QgaW1wbGVtZW50IGFueSBvZiB0aGVzZS4gVGhlIE9wZXJhdG9yIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQKKyAgLy8gYXMgYSB1dGlsaXR5LCBhbmQgaXMgbmV2ZXIgaXRzZWxmIGluc3RhbnRpYXRlZC4KKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdW5zaWduZWQpOworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpOworICBPcGVyYXRvcigpOworICB+T3BlcmF0b3IoKTsKKworcHVibGljOgorICAvLy8gZ2V0T3Bjb2RlIC0gUmV0dXJuIHRoZSBvcGNvZGUgZm9yIHRoaXMgSW5zdHJ1Y3Rpb24gb3IgQ29uc3RhbnRFeHByLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0T3Bjb2RlKCkgY29uc3QgeworICAgIGlmIChjb25zdCBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPih0aGlzKSkKKyAgICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKTsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudEV4cHI+KHRoaXMpLT5nZXRPcGNvZGUoKTsKKyAgfQorCisgIC8vLyBnZXRPcGNvZGUgLSBJZiBWIGlzIGFuIEluc3RydWN0aW9uIG9yIENvbnN0YW50RXhwciwgcmV0dXJuIGl0cworICAvLy8gb3Bjb2RlLiBPdGhlcndpc2UgcmV0dXJuIFVzZXJPcDEuCisgIC8vLworICBzdGF0aWMgdW5zaWduZWQgZ2V0T3Bjb2RlKGNvbnN0IFZhbHVlICpWKSB7CisgICAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKQorICAgICAgcmV0dXJuIEktPmdldE9wY29kZSgpOworICAgIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihWKSkKKyAgICAgIHJldHVybiBDRS0+Z2V0T3Bjb2RlKCk7CisgICAgcmV0dXJuIEluc3RydWN0aW9uOjpVc2VyT3AxOworICB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgT3BlcmF0b3IgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50RXhwciAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgfHwgaXNhPENvbnN0YW50RXhwcj4oVik7CisgIH0KK307CisKKy8vLyBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yIC0gVXRpbGl0eSBjbGFzcyBmb3IgaW50ZWdlciBhcml0aG1ldGljIG9wZXJhdG9ycworLy8vIHdoaWNoIG1heSBleGhpYml0IG92ZXJmbG93IC0gQWRkLCBTdWIsIGFuZCBNdWwuIEl0IGRvZXMgbm90IGluY2x1ZGUgU0RpdiwKKy8vLyBkZXNwaXRlIHRoYXQgb3BlcmF0b3IgaGF2aW5nIHRoZSBwb3RlbnRpYWwgZm9yIG92ZXJmbG93LgorLy8vCitjbGFzcyBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yIDogcHVibGljIE9wZXJhdG9yIHsKK3B1YmxpYzoKKyAgZW51bSB7CisgICAgTm9VbnNpZ25lZFdyYXAgPSAoMSA8PCAwKSwKKyAgICBOb1NpZ25lZFdyYXAgICA9ICgxIDw8IDEpCisgIH07CisKK3ByaXZhdGU6CisgIH5PdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yKCk7IC8vIGRvIG5vdCBpbXBsZW1lbnQKKworICBmcmllbmQgY2xhc3MgQmluYXJ5T3BlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEV4cHI7CisgIHZvaWQgc2V0SGFzTm9VbnNpZ25lZFdyYXAoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfk5vVW5zaWduZWRXcmFwKSB8IChCICogTm9VbnNpZ25lZFdyYXApOworICB9CisgIHZvaWQgc2V0SGFzTm9TaWduZWRXcmFwKGJvb2wgQikgeworICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0KKyAgICAgIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIH5Ob1NpZ25lZFdyYXApIHwgKEIgKiBOb1NpZ25lZFdyYXApOworICB9CisKK3B1YmxpYzoKKyAgLy8vIGhhc05vVW5zaWduZWRXcmFwIC0gVGVzdCB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIGtub3duIHRvIG5ldmVyCisgIC8vLyB1bmRlcmdvIHVuc2lnbmVkIG92ZXJmbG93LCBha2EgdGhlIG51dyBwcm9wZXJ0eS4KKyAgYm9vbCBoYXNOb1Vuc2lnbmVkV3JhcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViY2xhc3NPcHRpb25hbERhdGEgJiBOb1Vuc2lnbmVkV3JhcDsKKyAgfQorCisgIC8vLyBoYXNOb1NpZ25lZFdyYXAgLSBUZXN0IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaXMga25vd24gdG8gbmV2ZXIKKyAgLy8vIHVuZGVyZ28gc2lnbmVkIG92ZXJmbG93LCBha2EgdGhlIG5zdyBwcm9wZXJ0eS4KKyAgYm9vbCBoYXNOb1NpZ25lZFdyYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgTm9TaWduZWRXcmFwOworICB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvciAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQgfHwKKyAgICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN1YiB8fAorICAgICAgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TXVsOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50RXhwciAqQ0UpIHsKKyAgICByZXR1cm4gQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQgfHwKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTdWIgfHwKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpNdWw7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gKGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSkpIHx8CisgICAgICAgICAgIChpc2E8Q29uc3RhbnRFeHByPihWKSAmJiBjbGFzc29mKGNhc3Q8Q29uc3RhbnRFeHByPihWKSkpOworICB9Cit9OworCisvLy8gQWRkT3BlcmF0b3IgLSBVdGlsaXR5IGNsYXNzIGZvciBpbnRlZ2VyIGFkZGl0aW9uIG9wZXJhdG9ycy4KKy8vLworY2xhc3MgQWRkT3BlcmF0b3IgOiBwdWJsaWMgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvciB7CisgIH5BZGRPcGVyYXRvcigpOyAvLyBkbyBub3QgaW1wbGVtZW50CitwdWJsaWM6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEFkZE9wZXJhdG9yICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFkZDsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudEV4cHIgKkNFKSB7CisgICAgcmV0dXJuIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWRkOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIChpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpKSB8fAorICAgICAgICAgICAoaXNhPENvbnN0YW50RXhwcj4oVikgJiYgY2xhc3NvZihjYXN0PENvbnN0YW50RXhwcj4oVikpKTsKKyAgfQorfTsKKworLy8vIFN1Yk9wZXJhdG9yIC0gVXRpbGl0eSBjbGFzcyBmb3IgaW50ZWdlciBzdWJ0cmFjdGlvbiBvcGVyYXRvcnMuCisvLy8KK2NsYXNzIFN1Yk9wZXJhdG9yIDogcHVibGljIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3IgeworICB+U3ViT3BlcmF0b3IoKTsgLy8gZG8gbm90IGltcGxlbWVudAorcHVibGljOgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTdWJPcGVyYXRvciAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTdWI7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RhbnRFeHByICpDRSkgeworICAgIHJldHVybiBDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN1YjsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiAoaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKSkgfHwKKyAgICAgICAgICAgKGlzYTxDb25zdGFudEV4cHI+KFYpICYmIGNsYXNzb2YoY2FzdDxDb25zdGFudEV4cHI+KFYpKSk7CisgIH0KK307CisKKy8vLyBNdWxPcGVyYXRvciAtIFV0aWxpdHkgY2xhc3MgZm9yIGludGVnZXIgbXVsdGlwbGljYXRpb24gb3BlcmF0b3JzLgorLy8vCitjbGFzcyBNdWxPcGVyYXRvciA6IHB1YmxpYyBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yIHsKKyAgfk11bE9wZXJhdG9yKCk7IC8vIGRvIG5vdCBpbXBsZW1lbnQKK3B1YmxpYzoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTXVsT3BlcmF0b3IgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TXVsOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50RXhwciAqQ0UpIHsKKyAgICByZXR1cm4gQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpNdWw7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gKGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSkpIHx8CisgICAgICAgICAgIChpc2E8Q29uc3RhbnRFeHByPihWKSAmJiBjbGFzc29mKGNhc3Q8Q29uc3RhbnRFeHByPihWKSkpOworICB9Cit9OworCisvLy8gU0Rpdk9wZXJhdG9yIC0gQW4gT3BlcmF0b3Igd2l0aCBvcGNvZGUgSW5zdHJ1Y3Rpb246OlNEaXYuCisvLy8KK2NsYXNzIFNEaXZPcGVyYXRvciA6IHB1YmxpYyBPcGVyYXRvciB7CitwdWJsaWM6CisgIGVudW0geworICAgIElzRXhhY3QgPSAoMSA8PCAwKQorICB9OworCitwcml2YXRlOgorICB+U0Rpdk9wZXJhdG9yKCk7IC8vIGRvIG5vdCBpbXBsZW1lbnQKKworICBmcmllbmQgY2xhc3MgQmluYXJ5T3BlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEV4cHI7CisgIHZvaWQgc2V0SXNFeGFjdChib29sIEIpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9IChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIH5Jc0V4YWN0KSB8IChCICogSXNFeGFjdCk7CisgIH0KKworcHVibGljOgorICAvLy8gaXNFeGFjdCAtIFRlc3Qgd2hldGhlciB0aGlzIGRpdmlzaW9uIGlzIGtub3duIHRvIGJlIGV4YWN0LCB3aXRoCisgIC8vLyB6ZXJvIHJlbWFpbmRlci4KKyAgYm9vbCBpc0V4YWN0KCkgY29uc3QgeworICAgIHJldHVybiBTdWJjbGFzc09wdGlvbmFsRGF0YSAmIElzRXhhY3Q7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTRGl2T3BlcmF0b3IgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudEV4cHIgKkNFKSB7CisgICAgcmV0dXJuIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U0RpdjsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U0RpdjsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiAoaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKSkgfHwKKyAgICAgICAgICAgKGlzYTxDb25zdGFudEV4cHI+KFYpICYmIGNsYXNzb2YoY2FzdDxDb25zdGFudEV4cHI+KFYpKSk7CisgIH0KK307CisKK2NsYXNzIEdFUE9wZXJhdG9yIDogcHVibGljIE9wZXJhdG9yIHsKKyAgZW51bSB7CisgICAgSXNJbkJvdW5kcyA9ICgxIDw8IDApCisgIH07CisKKyAgfkdFUE9wZXJhdG9yKCk7IC8vIGRvIG5vdCBpbXBsZW1lbnQKKworICBmcmllbmQgY2xhc3MgR2V0RWxlbWVudFB0ckluc3Q7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEV4cHI7CisgIHZvaWQgc2V0SXNJbkJvdW5kcyhib29sIEIpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9CisgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiB+SXNJbkJvdW5kcykgfCAoQiAqIElzSW5Cb3VuZHMpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIGlzSW5Cb3VuZHMgLSBUZXN0IHdoZXRoZXIgdGhpcyBpcyBhbiBpbmJvdW5kcyBHRVAsIGFzIGRlZmluZWQKKyAgLy8vIGJ5IExhbmdSZWYuaHRtbC4KKyAgYm9vbCBpc0luQm91bmRzKCkgY29uc3QgeworICAgIHJldHVybiBTdWJjbGFzc09wdGlvbmFsRGF0YSAmIElzSW5Cb3VuZHM7CisgIH0KKworICBpbmxpbmUgb3BfaXRlcmF0b3IgICAgICAgaWR4X2JlZ2luKCkgICAgICAgeyByZXR1cm4gb3BfYmVnaW4oKSsxOyB9CisgIGlubGluZSBjb25zdF9vcF9pdGVyYXRvciBpZHhfYmVnaW4oKSBjb25zdCB7IHJldHVybiBvcF9iZWdpbigpKzE7IH0KKyAgaW5saW5lIG9wX2l0ZXJhdG9yICAgICAgIGlkeF9lbmQoKSAgICAgICAgIHsgcmV0dXJuIG9wX2VuZCgpOyB9CisgIGlubGluZSBjb25zdF9vcF9pdGVyYXRvciBpZHhfZW5kKCkgICBjb25zdCB7IHJldHVybiBvcF9lbmQoKTsgfQorCisgIFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorICBjb25zdCBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldFBvaW50ZXJPcGVyYW5kSW5kZXgoKSB7CisgICAgcmV0dXJuIDBVOyAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaW5kZXggZm9yIG1vZGlmeWluZyBjb3JyZWN0IG9wZXJhbmQKKyAgfQorCisgIC8vLyBnZXRQb2ludGVyT3BlcmFuZFR5cGUgLSBNZXRob2QgdG8gcmV0dXJuIHRoZSBwb2ludGVyIG9wZXJhbmQgYXMgYQorICAvLy8gUG9pbnRlclR5cGUuCisgIGNvbnN0IFBvaW50ZXJUeXBlICpnZXRQb2ludGVyT3BlcmFuZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUG9pbnRlclR5cGUqPihnZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtSW5kaWNlcygpIGNvbnN0IHsgIC8vIE5vdGU6IGFsd2F5cyBub24tbmVnYXRpdmUKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSAtIDE7CisgIH0KKworICBib29sIGhhc0luZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgPiAxOworICB9CisKKyAgLy8vIGhhc0FsbFplcm9JbmRpY2VzIC0gUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpY2VzIG9mIHRoaXMgR0VQIGFyZQorICAvLy8gemVyb3MuICBJZiBzbywgdGhlIHJlc3VsdCBwb2ludGVyIGFuZCB0aGUgZmlyc3Qgb3BlcmFuZCBoYXZlIHRoZSBzYW1lCisgIC8vLyB2YWx1ZSwganVzdCBwb3RlbnRpYWxseSBkaWZmZXJlbnQgdHlwZXMuCisgIGJvb2wgaGFzQWxsWmVyb0luZGljZXMoKSBjb25zdCB7CisgICAgZm9yIChjb25zdF9vcF9pdGVyYXRvciBJID0gaWR4X2JlZ2luKCksIEUgPSBpZHhfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oSSkpCisgICAgICAgIGlmIChDLT5pc051bGxWYWx1ZSgpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBoYXNBbGxDb25zdGFudEluZGljZXMgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIGluZGljZXMgb2YgdGhpcyBHRVAgYXJlCisgIC8vLyBjb25zdGFudCBpbnRlZ2Vycy4gIElmIHNvLCB0aGUgcmVzdWx0IHBvaW50ZXIgYW5kIHRoZSBmaXJzdCBvcGVyYW5kIGhhdmUKKyAgLy8vIGEgY29uc3RhbnQgb2Zmc2V0IGJldHdlZW4gdGhlbS4KKyAgYm9vbCBoYXNBbGxDb25zdGFudEluZGljZXMoKSBjb25zdCB7CisgICAgZm9yIChjb25zdF9vcF9pdGVyYXRvciBJID0gaWR4X2JlZ2luKCksIEUgPSBpZHhfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIWlzYTxDb25zdGFudEludD4oSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgR0VQT3BlcmF0b3IgKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBHZXRFbGVtZW50UHRySW5zdCAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50RXhwciAqQ0UpIHsKKyAgICByZXR1cm4gQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIChpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpKSB8fAorICAgICAgICAgICAoaXNhPENvbnN0YW50RXhwcj4oVikgJiYgY2xhc3NvZihjYXN0PENvbnN0YW50RXhwcj4oVikpKTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vUGFzcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1Bhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2JmMjdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1Bhc3MuaApAQCAtMCwwICsxLDM4NiBAQAorLy89PT0tIGxsdm0vUGFzcy5oIC0gQmFzZSBjbGFzcyBmb3IgUGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIHNwZWNpZmllZCBjbGFzcyBpcyBhCisvLyB0cmFuc2Zvcm1hdGlvbiBwYXNzIGltcGxlbWVudGF0aW9uLgorLy8KKy8vIFBhc3NlcyBhcmUgZGVzaWduZWQgdGhpcyB3YXkgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBydW4gcGFzc2VzIGluIGEgY2FjaGUKKy8vIGFuZCBvcmdhbml6YXRpb25hbGx5IG9wdGltYWwgb3JkZXIgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSBpdCBhdCB0aGUgZnJvbnQKKy8vIGVuZC4gIFRoaXMgYWxsb3dzIGFyYml0cmFyeSBwYXNzZXMgdG8gYmUgc3RydW5nIHRvZ2V0aGVyIGFuZCBoYXZlIHRoZW0KKy8vIGV4ZWN1dGVkIGFzIGVmZmVjaWVudGx5IGFzIHBvc3NpYmxlLgorLy8KKy8vIFBhc3NlcyBzaG91bGQgZXh0ZW5kIG9uZSBvZiB0aGUgY2xhc3NlcyBiZWxvdywgZGVwZW5kaW5nIG9uIHRoZSBndWFyYW50ZWVzCisvLyB0aGF0IGl0IGNhbiBtYWtlIGFib3V0IHdoYXQgd2lsbCBiZSBtb2RpZmllZCBhcyBpdCBpcyBydW4uICBGb3IgZXhhbXBsZSwgbW9zdAorLy8gZ2xvYmFsIG9wdGltaXphdGlvbnMgc2hvdWxkIGRlcml2ZSBmcm9tIEZ1bmN0aW9uUGFzcywgYmVjYXVzZSB0aGV5IGRvIG5vdCBhZGQKKy8vIG9yIGRlbGV0ZSBmdW5jdGlvbnMsIHRoZXkgb3BlcmF0ZSBvbiB0aGUgaW50ZXJuYWxzIG9mIHRoZSBmdW5jdGlvbi4KKy8vCisvLyBOb3RlIHRoYXQgdGhpcyBmaWxlICNpbmNsdWRlcyBQYXNzU3VwcG9ydC5oIGFuZCBQYXNzQW5hbHlzaXNTdXBwb3J0LmggKGF0IHRoZQorLy8gYm90dG9tKSwgc28gdGhlIEFQSXMgZXhwb3NlZCBieSB0aGVzZSBmaWxlcyBhcmUgYWxzbyBhdXRvbWF0aWNhbGx5IGF2YWlsYWJsZQorLy8gdG8gYWxsIHVzZXJzIG9mIHRoaXMgZmlsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUEFTU19ICisjZGVmaW5lIExMVk1fUEFTU19ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgQW5hbHlzaXNVc2FnZTsKK2NsYXNzIFBhc3NJbmZvOworY2xhc3MgSW1tdXRhYmxlUGFzczsKK2NsYXNzIFBNU3RhY2s7CitjbGFzcyBBbmFseXNpc1Jlc29sdmVyOworY2xhc3MgUE1EYXRhTWFuYWdlcjsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgU3RyaW5nUmVmOworCisvLyBBbmFseXNpc0lEIC0gVXNlIHRoZSBQYXNzSW5mbyB0byBpZGVudGlmeSBhIHBhc3MuLi4KK3R5cGVkZWYgY29uc3Qgdm9pZCogQW5hbHlzaXNJRDsKKworLy8vIERpZmZlcmVudCB0eXBlcyBvZiBpbnRlcm5hbCBwYXNzIG1hbmFnZXJzLiBFeHRlcm5hbCBwYXNzIG1hbmFnZXJzCisvLy8gKFBhc3NNYW5hZ2VyIGFuZCBGdW5jdGlvblBhc3NNYW5hZ2VyKSBhcmUgbm90IHJlcHJlc2VudGVkIGhlcmUuCisvLy8gT3JkZXJpbmcgb2YgcGFzcyBtYW5hZ2VyIHR5cGVzIGlzIGltcG9ydGFudCBoZXJlLgorZW51bSBQYXNzTWFuYWdlclR5cGUgeworICBQTVRfVW5rbm93biA9IDAsCisgIFBNVF9Nb2R1bGVQYXNzTWFuYWdlciA9IDEsIC8vLzwgTVBQYXNzTWFuYWdlciAKKyAgUE1UX0NhbGxHcmFwaFBhc3NNYW5hZ2VyLCAgLy8vPCBDR1Bhc3NNYW5hZ2VyCisgIFBNVF9GdW5jdGlvblBhc3NNYW5hZ2VyLCAgIC8vLzwgRlBQYXNzTWFuYWdlcgorICBQTVRfTG9vcFBhc3NNYW5hZ2VyLCAgICAgICAvLy88IExQUGFzc01hbmFnZXIKKyAgUE1UX0Jhc2ljQmxvY2tQYXNzTWFuYWdlciwgLy8vPCBCQlBhc3NNYW5hZ2VyCisgIFBNVF9MYXN0Cit9OworCisvLyBEaWZmZXJlbnQgdHlwZXMgb2YgcGFzc2VzLgorZW51bSBQYXNzS2luZCB7CisgIFBUX0Jhc2ljQmxvY2ssCisgIFBUX0xvb3AsCisgIFBUX0Z1bmN0aW9uLAorICBQVF9DYWxsR3JhcGhTQ0MsCisgIFBUX01vZHVsZSwKKyAgUFRfUGFzc01hbmFnZXIKK307CisgIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBQYXNzIGludGVyZmFjZSAtIEltcGxlbWVudGVkIGJ5IGFsbCAncGFzc2VzJy4gIFN1YmNsYXNzIHRoaXMgaWYgeW91IGFyZSBhbgorLy8vIGludGVycHJvY2VkdXJhbCBvcHRpbWl6YXRpb24gb3IgeW91IGRvIG5vdCBmaXQgaW50byBhbnkgb2YgdGhlIG1vcmUKKy8vLyBjb25zdHJhaW5lZCBwYXNzZXMgZGVzY3JpYmVkIGJlbG93LgorLy8vCitjbGFzcyBQYXNzIHsKKyAgQW5hbHlzaXNSZXNvbHZlciAqUmVzb2x2ZXI7ICAvLyBVc2VkIHRvIHJlc29sdmUgYW5hbHlzaXMKKyAgY29uc3Qgdm9pZCAqUGFzc0lEOworICBQYXNzS2luZCBLaW5kOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBQYXNzJik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIFBhc3MoY29uc3QgUGFzcyAmKTsgICAgICAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgCitwdWJsaWM6CisgIGV4cGxpY2l0IFBhc3MoUGFzc0tpbmQgSywgY2hhciAmcGlkKTsKKyAgdmlydHVhbCB+UGFzcygpOworCisgIAorICBQYXNzS2luZCBnZXRQYXNzS2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKyAgCisgIC8vLyBnZXRQYXNzTmFtZSAtIFJldHVybiBhIG5pY2UgY2xlYW4gbmFtZSBmb3IgYSBwYXNzLiAgVGhpcyB1c3VhbGx5CisgIC8vLyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUgbmFtZSB0aGF0IGlzIHJlZ2lzdGVyZWQgYnkgb25lIG9mIHRoZQorICAvLy8gUmVnaXN0cmF0aW9uIHRlbXBsYXRlcywgYnV0IGNhbiBiZSBvdmVybG9hZGVkIGRpcmVjdGx5LgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0OworCisgIC8vLyBnZXRQYXNzSUQgLSBSZXR1cm4gdGhlIFBhc3NJRCBudW1iZXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHBhc3MuCisgIHZpcnR1YWwgQW5hbHlzaXNJRCBnZXRQYXNzSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIFBhc3NJRDsKKyAgfQorCisgIC8vLyBwcmludCAtIFByaW50IG91dCB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHBhc3MuICBUaGlzIGlzIGNhbGxlZCBieQorICAvLy8gQW5hbHl6ZSB0byBwcmludCBvdXQgdGhlIGNvbnRlbnRzIG9mIGFuIGFuYWx5c2lzLiAgT3RoZXJ3aXNlIGl0IGlzIG5vdAorICAvLy8gbmVjZXNzYXJ5IHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZC4gIEJld2FyZSB0aGF0IHRoZSBtb2R1bGUgcG9pbnRlciBNQVkgYmUKKyAgLy8vIG51bGwuICBUaGlzIGF1dG9tYXRpY2FsbHkgZm9yd2FyZHMgdG8gYSB2aXJ0dWFsIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QKKyAgLy8vIHByb3ZpZGUgdGhlIE1vZHVsZSogaW4gY2FzZSB0aGUgYW5hbHlzaXMgZG9lc24ndCBuZWVkIGl0IGl0IGNhbiBqdXN0IGJlCisgIC8vLyBpZ25vcmVkLgorICAvLy8KKyAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUgKk0pIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsgLy8gZHVtcCAtIFByaW50IHRvIHN0ZGVyci4KKworICAvLy8gY3JlYXRlUHJpbnRlclBhc3MgLSBHZXQgYSBQYXNzIGFwcHJvcHJpYXRlIHRvIHByaW50IHRoZSBJUiB0aGlzCisgIC8vLyBwYXNzIG9wZXJhdGVzIG9uZSAoTW9kdWxlLCBGdW5jdGlvbiBvciBNYWNoaW5lRnVuY3Rpb24pLgorICB2aXJ0dWFsIFBhc3MgKmNyZWF0ZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0ID0gMDsKKworICAvLy8gRWFjaCBwYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBhc3NpZ25pbmcgYSBwYXNzIG1hbmFnZXIgdG8gaXRzZWxmLgorICAvLy8gUE1TIGlzIHRoZSBzdGFjayBvZiBhdmFpbGFibGUgcGFzcyBtYW5hZ2VyLiAKKyAgdmlydHVhbCB2b2lkIGFzc2lnblBhc3NNYW5hZ2VyKFBNU3RhY2sgJiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTWFuYWdlclR5cGUpIHt9CisgIC8vLyBDaGVjayBpZiBhdmFpbGFibGUgcGFzcyBtYW5hZ2VycyBhcmUgc3VpdGFibGUgZm9yIHRoaXMgcGFzcyBvciBub3QuCisgIHZpcnR1YWwgdm9pZCBwcmVwYXJlUGFzc01hbmFnZXIoUE1TdGFjayAmKTsKKyAgCisgIC8vLyAgUmV0dXJuIHdoYXQga2luZCBvZiBQYXNzIE1hbmFnZXIgY2FuIG1hbmFnZSB0aGlzIHBhc3MuCisgIHZpcnR1YWwgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0OworCisgIC8vIEFjY2VzcyBBbmFseXNpc1Jlc29sdmVyCisgIHZvaWQgc2V0UmVzb2x2ZXIoQW5hbHlzaXNSZXNvbHZlciAqQVIpOworICBBbmFseXNpc1Jlc29sdmVyICpnZXRSZXNvbHZlcigpIGNvbnN0IHsgcmV0dXJuIFJlc29sdmVyOyB9CisKKyAgLy8vIGdldEFuYWx5c2lzVXNhZ2UgLSBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvdmVycmlkZW4gYnkgcGFzc2VzIHRoYXQgbmVlZAorICAvLy8gYW5hbHlzaXMgaW5mb3JtYXRpb24gdG8gZG8gdGhlaXIgam9iLiAgSWYgYSBwYXNzIHNwZWNpZmllcyB0aGF0IGl0IHVzZXMgYQorICAvLy8gcGFydGljdWxhciBhbmFseXNpcyByZXN1bHQgdG8gdGhpcyBmdW5jdGlvbiwgaXQgY2FuIHRoZW4gdXNlIHRoZQorICAvLy8gZ2V0QW5hbHlzaXM8QW5hbHlzaXNUeXBlPigpIGZ1bmN0aW9uLCBiZWxvdy4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJikgY29uc3Q7CisKKyAgLy8vIHJlbGVhc2VNZW1vcnkoKSAtIFRoaXMgbWVtYmVyIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBhIHBhc3MgaWYgaXQgd2FudHMgdG8KKyAgLy8vIGJlIGFibGUgdG8gcmVsZWFzZSBpdHMgbWVtb3J5IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIFRoZSBkZWZhdWx0CisgIC8vLyBiZWhhdmlvciBvZiBwYXNzZXMgaXMgdG8gaG9sZCBvbnRvIG1lbW9yeSBmb3IgdGhlIGVudGlyZSBkdXJhdGlvbiBvZiB0aGVpcgorICAvLy8gbGlmZXRpbWUgKHdoaWNoIGlzIHRoZSBlbnRpcmUgY29tcGlsZSB0aW1lKS4gIEZvciBwaXBlbGluZWQgcGFzc2VzLCB0aGlzCisgIC8vLyBpcyBub3QgYSBiaWcgZGVhbCBiZWNhdXNlIHRoYXQgbWVtb3J5IGdldHMgcmVjeWNsZWQgZXZlcnkgdGltZSB0aGUgcGFzcyBpcworICAvLy8gaW52b2tlZCBvbiBhbm90aGVyIHByb2dyYW0gdW5pdC4gIEZvciBJUCBwYXNzZXMsIGl0IGlzIG1vcmUgaW1wb3J0YW50IHRvCisgIC8vLyBmcmVlIG1lbW9yeSB3aGVuIGl0IGlzIHVudXNlZC4KKyAgLy8vCisgIC8vLyBPcHRpb25hbGx5IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIHRvIHJlbGVhc2UgcGFzcyBtZW1vcnkgd2hlbiBpdCBpcyBubworICAvLy8gbG9uZ2VyIHVzZWQuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworCisgIC8vLyBnZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlciAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBhIHBhc3MgaW1wbGVtZW50cworICAvLy8gYW4gYW5hbHlzaXMgaW50ZXJmYWNlIHRocm91Z2ggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiBuZWVkZWQsIGl0IHNob3VsZAorICAvLy8gb3ZlcnJpZGUgdGhpcyB0byBhZGp1c3QgdGhlIHRoaXMgcG9pbnRlciBhcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpZWQgcGFzcworICAvLy8gaW5mby4KKyAgdmlydHVhbCB2b2lkICpnZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlcihBbmFseXNpc0lEIElEKTsKKyAgdmlydHVhbCBJbW11dGFibGVQYXNzICpnZXRBc0ltbXV0YWJsZVBhc3MoKTsKKyAgdmlydHVhbCBQTURhdGFNYW5hZ2VyICpnZXRBc1BNRGF0YU1hbmFnZXIoKTsKKyAgCisgIC8vLyB2ZXJpZnlBbmFseXNpcygpIC0gVGhpcyBtZW1iZXIgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGEgYW5hbHlzaXMgcGFzcyB0bworICAvLy8gY2hlY2sgc3RhdGUgb2YgYW5hbHlzaXMgaW5mb3JtYXRpb24uIAorICB2aXJ0dWFsIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdDsKKworICAvLyBkdW1wUGFzc1N0cnVjdHVyZSAtIEltcGxlbWVudCB0aGUgLWRlYnVnLXBhc3Nlcz1QYXNzU3RydWN0dXJlIG9wdGlvbgorICB2aXJ0dWFsIHZvaWQgZHVtcFBhc3NTdHJ1Y3R1cmUodW5zaWduZWQgT2Zmc2V0ID0gMCk7CisKKyAgLy8gbG9va3VwUGFzc0luZm8gLSBSZXR1cm4gdGhlIHBhc3MgaW5mbyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgcGFzcyBjbGFzcywKKyAgLy8gb3IgbnVsbCBpZiBpdCBpcyBub3Qga25vd24uCisgIHN0YXRpYyBjb25zdCBQYXNzSW5mbyAqbG9va3VwUGFzc0luZm8oY29uc3Qgdm9pZCAqVEkpOworCisgIC8vIGxvb2t1cFBhc3NJbmZvIC0gUmV0dXJuIHRoZSBwYXNzIGluZm8gb2JqZWN0IGZvciB0aGUgcGFzcyB3aXRoIHRoZSBnaXZlbgorICAvLyBhcmd1bWVudCBzdHJpbmcsIG9yIG51bGwgaWYgaXQgaXMgbm90IGtub3duLgorICBzdGF0aWMgY29uc3QgUGFzc0luZm8gKmxvb2t1cFBhc3NJbmZvKFN0cmluZ1JlZiBBcmcpOworCisgIC8vLyBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPEFuYWx5c2lzVHlwZT4oKSAtIFN1YmNsYXNzZXMgdXNlIHRoaXMgZnVuY3Rpb24gdG8KKyAgLy8vIGdldCBhbmFseXNpcyBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGJlIGFyb3VuZCwgZm9yIGV4YW1wbGUgdG8gdXBkYXRlIGl0LgorICAvLy8gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBnZXRBbmFseXNpcyBpbiB0aGF0IGl0IGNhbiBmYWlsIChpZiB0aGUgYW5hbHlzaXMKKyAgLy8vIHJlc3VsdHMgaGF2ZW4ndCBiZWVuIGNvbXB1dGVkKSwgc28gc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgY2FuIGhhbmRsZQorICAvLy8gdGhlIGNhc2Ugd2hlbiB0aGUgYW5hbHlzaXMgaXMgbm90IGF2YWlsYWJsZS4gIFRoaXMgbWV0aG9kIGlzIG9mdGVuIHVzZWQgYnkKKyAgLy8vIHRyYW5zZm9ybWF0aW9uIEFQSXMgdG8gdXBkYXRlIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGEgcGFzcyBhdXRvbWF0aWNhbGx5IGFzCisgIC8vLyB0aGUgdHJhbnNmb3JtIGlzIHBlcmZvcm1lZC4KKyAgLy8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4gQW5hbHlzaXNUeXBlICoKKyAgICBnZXRBbmFseXNpc0lmQXZhaWxhYmxlKCkgY29uc3Q7IC8vIERlZmluZWQgaW4gUGFzc0FuYWx5c2lzU3VwcG9ydC5oCisKKyAgLy8vIG11c3RQcmVzZXJ2ZUFuYWx5c2lzSUQgLSBUaGlzIG1ldGhvZCBzZXJ2ZXMgdGhlIHNhbWUgZnVuY3Rpb24gYXMKKyAgLy8vIGdldEFuYWx5c2lzSWZBdmFpbGFibGUsIGJ1dCB3b3JrcyBpZiB5b3UganVzdCBoYXZlIGFuIEFuYWx5c2lzSUQuICBUaGlzCisgIC8vLyBvYnZpb3VzbHkgY2Fubm90IGdpdmUgeW91IGEgcHJvcGVybHkgdHlwZWQgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGlmIHlvdQorICAvLy8gZG9uJ3QgaGF2ZSB0aGUgY2xhc3MgbmFtZSBhdmFpbGFibGUgKHVzZSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlIGlmIHlvdQorICAvLy8gZG8pLCBidXQgaXQgY2FuIHRlbGwgeW91IGlmIHlvdSBuZWVkIHRvIHByZXNlcnZlIHRoZSBwYXNzIGF0IGxlYXN0LgorICAvLy8KKyAgYm9vbCBtdXN0UHJlc2VydmVBbmFseXNpc0lEKGNoYXIgJkFJRCkgY29uc3Q7CisKKyAgLy8vIGdldEFuYWx5c2lzPEFuYWx5c2lzVHlwZT4oKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGdldAorICAvLy8gdG8gdGhlIGFuYWx5c2lzIGluZm9ybWF0aW9uIHRoYXQgdGhleSBjbGFpbSB0byB1c2UgYnkgb3ZlcnJpZGluZyB0aGUKKyAgLy8vIGdldEFuYWx5c2lzVXNhZ2UgZnVuY3Rpb24uCisgIC8vLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbmFseXNpc1R5cGU+CisgIEFuYWx5c2lzVHlwZSAmZ2V0QW5hbHlzaXMoKSBjb25zdDsgLy8gRGVmaW5lZCBpbiBQYXNzQW5hbHlzaXNTdXBwb3J0LmgKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbmFseXNpc1R5cGU+CisgIEFuYWx5c2lzVHlwZSAmZ2V0QW5hbHlzaXMoRnVuY3Rpb24gJkYpOyAvLyBEZWZpbmVkIGluIFBhc3NBbmFseXNpc1N1cHBvcnQuaAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KKyAgQW5hbHlzaXNUeXBlICZnZXRBbmFseXNpc0lEKEFuYWx5c2lzSUQgUEkpIGNvbnN0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KKyAgQW5hbHlzaXNUeXBlICZnZXRBbmFseXNpc0lEKEFuYWx5c2lzSUQgUEksIEZ1bmN0aW9uICZGKTsKK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBNb2R1bGVQYXNzIGNsYXNzIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGltcGxlbWVudCB1bnN0cnVjdHVyZWQKKy8vLyBpbnRlcnByb2NlZHVyYWwgb3B0aW1pemF0aW9ucyBhbmQgYW5hbHlzZXMuICBNb2R1bGVQYXNzZXMgbWF5IGRvIGFueXRoaW5nCisvLy8gdGhleSB3YW50IHRvIHRoZSBwcm9ncmFtLgorLy8vCitjbGFzcyBNb2R1bGVQYXNzIDogcHVibGljIFBhc3MgeworcHVibGljOgorICAvLy8gY3JlYXRlUHJpbnRlclBhc3MgLSBHZXQgYSBtb2R1bGUgcHJpbnRlciBwYXNzLgorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmTywgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3Q7CisKKyAgLy8vIHJ1bk9uTW9kdWxlIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcHJvY2VzcyB0aGUgbW9kdWxlCisgIC8vLyBiZWluZyBvcGVyYXRlZCBvbi4KKyAgdmlydHVhbCBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc01hbmFnZXJUeXBlIFQpOworCisgIC8vLyAgUmV0dXJuIHdoYXQga2luZCBvZiBQYXNzIE1hbmFnZXIgY2FuIG1hbmFnZSB0aGlzIHBhc3MuCisgIHZpcnR1YWwgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0OworCisgIGV4cGxpY2l0IE1vZHVsZVBhc3MoY2hhciAmcGlkKSA6IFBhc3MoUFRfTW9kdWxlLCBwaWQpIHt9CisgIC8vIEZvcmNlIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kLgorICB2aXJ0dWFsIH5Nb2R1bGVQYXNzKCk7Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gSW1tdXRhYmxlUGFzcyBjbGFzcyAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIHRoYXQgZG9lcworLy8vIG5vdCBuZWVkIHRvIGJlIHJ1bi4gIFRoaXMgaXMgdXNlZnVsIGZvciB0aGluZ3MgbGlrZSB0YXJnZXQgaW5mb3JtYXRpb24gYW5kCisvLy8gImJhc2ljIiB2ZXJzaW9ucyBvZiBBbmFseXNpc0dyb3Vwcy4KKy8vLworY2xhc3MgSW1tdXRhYmxlUGFzcyA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKK3B1YmxpYzoKKyAgLy8vIGluaXRpYWxpemVQYXNzIC0gVGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRlbiBieSBpbW11dGFibGUgcGFzc2VzIHRvIGFsbG93CisgIC8vLyB0aGVtIHRvIHBlcmZvcm0gdmFyaW91cyBpbml0aWFsaXphdGlvbiBhY3Rpb25zIHRoZXkgcmVxdWlyZS4gIFRoaXMgaXMKKyAgLy8vIHByaW1hcmlseSBiZWNhdXNlIGFuIEltbXV0YWJsZVBhc3MgY2FuICJyZXF1aXJlIiBhbm90aGVyIEltbXV0YWJsZVBhc3MsCisgIC8vLyBhbmQgaWYgaXQgZG9lcywgdGhlIG92ZXJsb2FkZWQgdmVyc2lvbiBvZiBpbml0aWFsaXplUGFzcyBtYXkgZ2V0IGFjY2VzcyB0bworICAvLy8gdGhlc2UgcGFzc2VzIHdpdGggZ2V0QW5hbHlzaXM8Pi4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplUGFzcygpOworCisgIHZpcnR1YWwgSW1tdXRhYmxlUGFzcyAqZ2V0QXNJbW11dGFibGVQYXNzKCkgeyByZXR1cm4gdGhpczsgfQorCisgIC8vLyBJbW11dGFibGVQYXNzZXMgYXJlIG5ldmVyIHJ1bi4KKyAgLy8vCisgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICYpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgZXhwbGljaXQgSW1tdXRhYmxlUGFzcyhjaGFyICZwaWQpIAorICA6IE1vZHVsZVBhc3MocGlkKSB7fQorICAKKyAgLy8gRm9yY2Ugb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QuCisgIHZpcnR1YWwgfkltbXV0YWJsZVBhc3MoKTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRnVuY3Rpb25QYXNzIGNsYXNzIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGltcGxlbWVudCBtb3N0IGdsb2JhbAorLy8vIG9wdGltaXphdGlvbnMuICBPcHRpbWl6YXRpb25zIHNob3VsZCBzdWJjbGFzcyB0aGlzIGNsYXNzIGlmIHRoZXkgbWVldCB0aGUKKy8vLyBmb2xsb3dpbmcgY29uc3RyYWludHM6CisvLy8KKy8vLyAgMS4gT3B0aW1pemF0aW9ucyBhcmUgb3JnYW5pemVkIGdsb2JhbGx5LCBpLmUuLCBhIGZ1bmN0aW9uIGF0IGEgdGltZQorLy8vICAyLiBPcHRpbWl6aW5nIGEgZnVuY3Rpb24gZG9lcyBub3QgY2F1c2UgdGhlIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYW55CisvLy8gICAgIGZ1bmN0aW9ucyBpbiB0aGUgbW9kdWxlCisvLy8KK2NsYXNzIEZ1bmN0aW9uUGFzcyA6IHB1YmxpYyBQYXNzIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRnVuY3Rpb25QYXNzKGNoYXIgJnBpZCkgOiBQYXNzKFBUX0Z1bmN0aW9uLCBwaWQpIHt9CisKKyAgLy8vIGNyZWF0ZVByaW50ZXJQYXNzIC0gR2V0IGEgZnVuY3Rpb24gcHJpbnRlciBwYXNzLgorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmTywgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3Q7CisKKyAgLy8vIGRvSW5pdGlhbGl6YXRpb24gLSBWaXJ0dWFsIG1ldGhvZCBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gZG8KKyAgLy8vIGFueSBuZWNlc3NhcnkgcGVyLW1vZHVsZSBpbml0aWFsaXphdGlvbi4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmKTsKKyAgCisgIC8vLyBydW5PbkZ1bmN0aW9uIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMgdG8gZG8gdGhlCisgIC8vLyBwZXItZnVuY3Rpb24gcHJvY2Vzc2luZyBvZiB0aGUgcGFzcy4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSA9IDA7CisKKyAgLy8vIGRvRmluYWxpemF0aW9uIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMgdG8gZG8gYW55IHBvc3QKKyAgLy8vIHByb2Nlc3NpbmcgbmVlZGVkIGFmdGVyIGFsbCBwYXNzZXMgaGF2ZSBydW4uCisgIC8vLworICB2aXJ0dWFsIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICYpOworCisgIC8vLyBydW5Pbk1vZHVsZSAtIE9uIGEgbW9kdWxlLCB3ZSBydW4gdGhpcyBwYXNzIGJ5IGluaXRpYWxpemluZywKKyAgLy8vIHJvbk9uRnVuY3Rpb24naW5nIG9uY2UgZm9yIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBtb2R1bGUsIHRoZW4gYnkKKyAgLy8vIGZpbmFsaXppbmcuCisgIC8vLworICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICAvLy8gcnVuIC0gT24gYSBmdW5jdGlvbiwgd2Ugc2ltcGx5IGluaXRpYWxpemUsIHJ1biB0aGUgZnVuY3Rpb24sIHRoZW4KKyAgLy8vIGZpbmFsaXplLgorICAvLy8KKyAgYm9vbCBydW4oRnVuY3Rpb24gJkYpOworCisgIHZpcnR1YWwgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc01hbmFnZXJUeXBlIFQpOworCisgIC8vLyAgUmV0dXJuIHdoYXQga2luZCBvZiBQYXNzIE1hbmFnZXIgY2FuIG1hbmFnZSB0aGlzIHBhc3MuCisgIHZpcnR1YWwgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0OworfTsKKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQmFzaWNCbG9ja1Bhc3MgY2xhc3MgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW1wbGVtZW50IG1vc3QgbG9jYWwKKy8vLyBvcHRpbWl6YXRpb25zLiAgT3B0aW1pemF0aW9ucyBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcyBpZiB0aGV5CisvLy8gbWVldCB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzOgorLy8vICAgMS4gT3B0aW1pemF0aW9ucyBhcmUgbG9jYWwsIG9wZXJhdGluZyBvbiBlaXRoZXIgYSBiYXNpYyBibG9jayBvcgorLy8vICAgICAgaW5zdHJ1Y3Rpb24gYXQgYSB0aW1lLgorLy8vICAgMi4gT3B0aW1pemF0aW9ucyBkbyBub3QgbW9kaWZ5IHRoZSBDRkcgb2YgdGhlIGNvbnRhaW5lZCBmdW5jdGlvbiwgb3IgYW55CisvLy8gICAgICBvdGhlciBiYXNpYyBibG9jayBpbiB0aGUgZnVuY3Rpb24uCisvLy8gICAzLiBPcHRpbWl6YXRpb25zIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBjb25zdHJhaW50cyBvZiBGdW5jdGlvblBhc3Nlcy4KKy8vLworY2xhc3MgQmFzaWNCbG9ja1Bhc3MgOiBwdWJsaWMgUGFzcyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEJhc2ljQmxvY2tQYXNzKGNoYXIgJnBpZCkgOiBQYXNzKFBUX0Jhc2ljQmxvY2ssIHBpZCkge30KKworICAvLy8gY3JlYXRlUHJpbnRlclBhc3MgLSBHZXQgYSBmdW5jdGlvbiBwcmludGVyIHBhc3MuCisgIFBhc3MgKmNyZWF0ZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPLCBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSBjb25zdDsKKworICAvLy8gZG9Jbml0aWFsaXphdGlvbiAtIFZpcnR1YWwgbWV0aG9kIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBkbworICAvLy8gYW55IG5lY2Vzc2FyeSBwZXItbW9kdWxlIGluaXRpYWxpemF0aW9uLgorICAvLy8KKyAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICYpOworCisgIC8vLyBkb0luaXRpYWxpemF0aW9uIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGRlbiBieSBCYXNpY0Jsb2NrUGFzcyBzdWJjbGFzc2VzCisgIC8vLyB0byBkbyBhbnkgbmVjZXNzYXJ5IHBlci1mdW5jdGlvbiBpbml0aWFsaXphdGlvbi4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBkb0luaXRpYWxpemF0aW9uKEZ1bmN0aW9uICYpOworCisgIC8vLyBydW5PbkJhc2ljQmxvY2sgLSBWaXJ0dWFsIG1ldGhvZCBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyB0byBkbyB0aGUKKyAgLy8vIHBlci1iYXNpY2Jsb2NrIHByb2Nlc3Npbmcgb2YgdGhlIHBhc3MuCisgIC8vLworICB2aXJ0dWFsIGJvb2wgcnVuT25CYXNpY0Jsb2NrKEJhc2ljQmxvY2sgJkJCKSA9IDA7CisKKyAgLy8vIGRvRmluYWxpemF0aW9uIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGVuIGJ5IEJhc2ljQmxvY2tQYXNzIHN1YmNsYXNzZXMgdG8KKyAgLy8vIGRvIGFueSBwb3N0IHByb2Nlc3NpbmcgbmVlZGVkIGFmdGVyIGFsbCBwYXNzZXMgaGF2ZSBydW4uCisgIC8vLworICB2aXJ0dWFsIGJvb2wgZG9GaW5hbGl6YXRpb24oRnVuY3Rpb24gJik7CisKKyAgLy8vIGRvRmluYWxpemF0aW9uIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMgdG8gZG8gYW55IHBvc3QKKyAgLy8vIHByb2Nlc3NpbmcgbmVlZGVkIGFmdGVyIGFsbCBwYXNzZXMgaGF2ZSBydW4uCisgIC8vLworICB2aXJ0dWFsIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICYpOworCisKKyAgLy8gVG8gcnVuIHRoaXMgcGFzcyBvbiBhIGZ1bmN0aW9uLCB3ZSBzaW1wbHkgY2FsbCBydW5PbkJhc2ljQmxvY2sgb25jZSBmb3IKKyAgLy8gZWFjaCBmdW5jdGlvbi4KKyAgLy8KKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKworICB2aXJ0dWFsIHZvaWQgYXNzaWduUGFzc01hbmFnZXIoUE1TdGFjayAmUE1TLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NNYW5hZ2VyVHlwZSBUKTsKKworICAvLy8gIFJldHVybiB3aGF0IGtpbmQgb2YgUGFzcyBNYW5hZ2VyIGNhbiBtYW5hZ2UgdGhpcyBwYXNzLgorICB2aXJ0dWFsIFBhc3NNYW5hZ2VyVHlwZSBnZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSBjb25zdDsKK307CisKKy8vLyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgdGhlIC10aW1lLXBhc3NlcyBhcmd1bWVudCBvbiBhbiBMTFZNIHRvb2wgY29tbWFuZCBsaW5lCisvLy8gdGhlbiB0aGUgdmFsdWUgb2YgdGhpcyBib29sZWFuIHdpbGwgYmUgdHJ1ZSwgb3RoZXJ3aXNlIGZhbHNlLgorLy8vIEBicmllZiBUaGlzIGlzIHRoZSBzdG9yYWdlIGZvciB0aGUgLXRpbWUtcGFzc2VzIG9wdGlvbi4KK2V4dGVybiBib29sIFRpbWVQYXNzZXNJc0VuYWJsZWQ7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKy8vIEluY2x1ZGUgc3VwcG9ydCBmaWxlcyB0aGF0IGNvbnRhaW4gaW1wb3J0YW50IEFQSXMgY29tbW9ubHkgdXNlZCBieSBQYXNzZXMsCisvLyBidXQgdGhhdCB3ZSB3YW50IHRvIHNlcGFyYXRlIG91dCB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSBoZWFkZXIgZmlsZXMuCisvLworI2luY2x1ZGUgImxsdm0vUGFzc1N1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NBbmFseXNpc1N1cHBvcnQuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vUGFzc0FuYWx5c2lzU3VwcG9ydC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1Bhc3NBbmFseXNpc1N1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzM0MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1Bhc3NBbmFseXNpc1N1cHBvcnQuaApAQCAtMCwwICsxLDI1MCBAQAorLy89PT0tIGxsdm0vUGFzc0FuYWx5c2lzU3VwcG9ydC5oIC0gQW5hbHlzaXMgUGFzcyBTdXBwb3J0IGNvZGUgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzdHVmZiB0aGF0IGlzIHVzZWQgdG8gZGVmaW5lIGFuZCAidXNlIiBBbmFseXNpcyBQYXNzZXMuCisvLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSAjaW5jbHVkZWQgYnkgUGFzcy5oLCBzbzoKKy8vCisvLyAgICAgICAgICAgTk8gLkNQUCBGSUxFUyBTSE9VTEQgSU5DTFVERSBUSElTIEZJTEUgRElSRUNUTFkKKy8vCisvLyBJbnN0ZWFkLCAjaW5jbHVkZSBQYXNzLmgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUEFTU19BTkFMWVNJU19TVVBQT1JUX0gKKyNkZWZpbmUgTExWTV9QQVNTX0FOQUxZU0lTX1NVUFBPUlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFuYWx5c2lzVXNhZ2UgLSBSZXByZXNlbnQgdGhlIGFuYWx5c2lzIHVzYWdlIGluZm9ybWF0aW9uIG9mIGEgcGFzcy4gIFRoaXMKKy8vIHRyYWNrcyBhbmFseXNlcyB0aGF0IHRoZSBwYXNzIFJFUVVJUkVTIChtdXN0IGJlIGF2YWlsYWJsZSB3aGVuIHRoZSBwYXNzCisvLyBydW5zKSwgUkVRVUlSRVMgVFJBTlNJVElWRSAobXVzdCBiZSBhdmFpbGFibGUgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlCisvLyBwYXNzKSwgYW5kIGFuYWx5c2VzIHRoYXQgdGhlIHBhc3MgUFJFU0VSVkVTICh0aGUgcGFzcyBkb2VzIG5vdCBpbnZhbGlkYXRlIHRoZQorLy8gcmVzdWx0cyBvZiB0aGVzZSBhbmFseXNlcykuICBUaGlzIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGJ5IGEgcGFzcyB0byB0aGUKKy8vIFBhc3MgaW5mcmFzdHJ1Y3R1cmUgdGhyb3VnaCB0aGUgZ2V0QW5hbHlzaXNVc2FnZSB2aXJ0dWFsIGZ1bmN0aW9uLgorLy8KK2NsYXNzIEFuYWx5c2lzVXNhZ2UgeworcHVibGljOgorICB0eXBlZGVmIFNtYWxsVmVjdG9yPEFuYWx5c2lzSUQsIDMyPiBWZWN0b3JUeXBlOworCitwcml2YXRlOgorICAvLyBTZXRzIG9mIGFuYWx5c2VzIHJlcXVpcmVkIGFuZCBwcmVzZXJ2ZWQgYnkgYSBwYXNzCisgIFZlY3RvclR5cGUgUmVxdWlyZWQsIFJlcXVpcmVkVHJhbnNpdGl2ZSwgUHJlc2VydmVkOworICBib29sIFByZXNlcnZlc0FsbDsKKworcHVibGljOgorICBBbmFseXNpc1VzYWdlKCkgOiBQcmVzZXJ2ZXNBbGwoZmFsc2UpIHt9CisKKyAgLy8gYWRkUmVxdWlyZWQgLSBBZGQgdGhlIHNwZWNpZmllZCBJRCB0byB0aGUgcmVxdWlyZWQgc2V0IG9mIHRoZSB1c2FnZSBpbmZvCisgIC8vIGZvciBhIHBhc3MuCisgIC8vCisgIEFuYWx5c2lzVXNhZ2UgJmFkZFJlcXVpcmVkSUQoY29uc3Qgdm9pZCAqSUQpOworICBBbmFseXNpc1VzYWdlICZhZGRSZXF1aXJlZElEKGNoYXIgJklEKTsKKyAgdGVtcGxhdGU8Y2xhc3MgUGFzc0NsYXNzPgorICBBbmFseXNpc1VzYWdlICZhZGRSZXF1aXJlZCgpIHsKKyAgICByZXR1cm4gYWRkUmVxdWlyZWRJRChQYXNzQ2xhc3M6OklEKTsKKyAgfQorCisgIEFuYWx5c2lzVXNhZ2UgJmFkZFJlcXVpcmVkVHJhbnNpdGl2ZUlEKGNoYXIgJklEKTsKKyAgdGVtcGxhdGU8Y2xhc3MgUGFzc0NsYXNzPgorICBBbmFseXNpc1VzYWdlICZhZGRSZXF1aXJlZFRyYW5zaXRpdmUoKSB7CisgICAgcmV0dXJuIGFkZFJlcXVpcmVkVHJhbnNpdGl2ZUlEKFBhc3NDbGFzczo6SUQpOworICB9CisKKyAgLy8gYWRkUHJlc2VydmVkIC0gQWRkIHRoZSBzcGVjaWZpZWQgSUQgdG8gdGhlIHNldCBvZiBhbmFseXNlcyBwcmVzZXJ2ZWQgYnkKKyAgLy8gdGhpcyBwYXNzCisgIC8vCisgIEFuYWx5c2lzVXNhZ2UgJmFkZFByZXNlcnZlZElEKGNvbnN0IHZvaWQgKklEKSB7CisgICAgUHJlc2VydmVkLnB1c2hfYmFjayhJRCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFuYWx5c2lzVXNhZ2UgJmFkZFByZXNlcnZlZElEKGNoYXIgJklEKSB7CisgICAgUHJlc2VydmVkLnB1c2hfYmFjaygmSUQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIGFkZFByZXNlcnZlZCAtIEFkZCB0aGUgc3BlY2lmaWVkIFBhc3MgY2xhc3MgdG8gdGhlIHNldCBvZiBhbmFseXNlcworICAvLyBwcmVzZXJ2ZWQgYnkgdGhpcyBwYXNzLgorICAvLworICB0ZW1wbGF0ZTxjbGFzcyBQYXNzQ2xhc3M+CisgIEFuYWx5c2lzVXNhZ2UgJmFkZFByZXNlcnZlZCgpIHsKKyAgICBQcmVzZXJ2ZWQucHVzaF9iYWNrKCZQYXNzQ2xhc3M6OklEKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBhZGRQcmVzZXJ2ZWQgLSBBZGQgdGhlIFBhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IHN0cmluZyB0byB0aGUgc2V0CisgIC8vIG9mIGFuYWx5c2VzIHByZXNlcnZlZCBieSB0aGlzIHBhc3MuIElmIG5vIHN1Y2ggUGFzcyBleGlzdHMsIGRvIG5vdGhpbmcuCisgIC8vIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGEgcGFzcyBpcyB0cml2aWFsbHkgcHJlc2VydmVkLCBidXQgbWF5IG5vdCBiZQorICAvLyBsaW5rZWQgaW4uIEJlIGNhcmVmdWwgYWJvdXQgc3BlbGxpbmchCisgIC8vCisgIEFuYWx5c2lzVXNhZ2UgJmFkZFByZXNlcnZlZChTdHJpbmdSZWYgQXJnKTsKKworICAvLyBzZXRQcmVzZXJ2ZXNBbGwgLSBTZXQgYnkgYW5hbHlzZXMgdGhhdCBkbyBub3QgdHJhbnNmb3JtIHRoZWlyIGlucHV0IGF0IGFsbAorICB2b2lkIHNldFByZXNlcnZlc0FsbCgpIHsgUHJlc2VydmVzQWxsID0gdHJ1ZTsgfQorICBib29sIGdldFByZXNlcnZlc0FsbCgpIGNvbnN0IHsgcmV0dXJuIFByZXNlcnZlc0FsbDsgfQorCisgIC8vLyBzZXRQcmVzZXJ2ZXNDRkcgLSBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIHBhc3MsIGlmZiB0aGV5IGRvCisgIC8vLyBub3Q6CisgIC8vLworICAvLy8gIDEuIEFkZCBvciByZW1vdmUgYmFzaWMgYmxvY2tzIGZyb20gdGhlIGZ1bmN0aW9uCisgIC8vLyAgMi4gTW9kaWZ5IHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb25zIGluIGFueSB3YXkuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBhbm5vdGF0ZXMgdGhlIEFuYWx5c2lzVXNhZ2UgaW5mbyBvYmplY3QgdG8gc2F5IHRoYXQgYW5hbHlzZXMKKyAgLy8vIHRoYXQgb25seSBkZXBlbmQgb24gdGhlIENGRyBhcmUgcHJlc2VydmVkIGJ5IHRoaXMgcGFzcy4KKyAgLy8vCisgIHZvaWQgc2V0UHJlc2VydmVzQ0ZHKCk7CisKKyAgY29uc3QgVmVjdG9yVHlwZSAmZ2V0UmVxdWlyZWRTZXQoKSBjb25zdCB7IHJldHVybiBSZXF1aXJlZDsgfQorICBjb25zdCBWZWN0b3JUeXBlICZnZXRSZXF1aXJlZFRyYW5zaXRpdmVTZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlcXVpcmVkVHJhbnNpdGl2ZTsKKyAgfQorICBjb25zdCBWZWN0b3JUeXBlICZnZXRQcmVzZXJ2ZWRTZXQoKSBjb25zdCB7IHJldHVybiBQcmVzZXJ2ZWQ7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBbmFseXNpc1Jlc29sdmVyIC0gU2ltcGxlIGludGVyZmFjZSB1c2VkIGJ5IFBhc3Mgb2JqZWN0cyB0byBwdWxsIGFsbAorLy8gYW5hbHlzaXMgaW5mb3JtYXRpb24gb3V0IG9mIHBhc3MgbWFuYWdlciB0aGF0IGlzIHJlc3BvbnNpYmxlIHRvIG1hbmFnZQorLy8gdGhlIHBhc3MuCisvLworY2xhc3MgUE1EYXRhTWFuYWdlcjsKK2NsYXNzIEFuYWx5c2lzUmVzb2x2ZXIgeworcHJpdmF0ZToKKyAgQW5hbHlzaXNSZXNvbHZlcigpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorCitwdWJsaWM6CisgIGV4cGxpY2l0IEFuYWx5c2lzUmVzb2x2ZXIoUE1EYXRhTWFuYWdlciAmUCkgOiBQTShQKSB7IH0KKyAgCisgIGlubGluZSBQTURhdGFNYW5hZ2VyICZnZXRQTURhdGFNYW5hZ2VyKCkgeyByZXR1cm4gUE07IH0KKworICAvLyBGaW5kIHBhc3MgdGhhdCBpcyBpbXBsZW1lbnRpbmcgUEkuCisgIFBhc3MgKmZpbmRJbXBsUGFzcyhBbmFseXNpc0lEIFBJKSB7CisgICAgUGFzcyAqUmVzdWx0UGFzcyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFuYWx5c2lzSW1wbHMuc2l6ZSgpIDsgKytpKSB7CisgICAgICBpZiAoQW5hbHlzaXNJbXBsc1tpXS5maXJzdCA9PSBQSSkgeworICAgICAgICBSZXN1bHRQYXNzID0gQW5hbHlzaXNJbXBsc1tpXS5zZWNvbmQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUmVzdWx0UGFzczsKKyAgfQorCisgIC8vIEZpbmQgcGFzcyB0aGF0IGlzIGltcGxlbWVudGluZyBQSS4gSW5pdGlhbGl6ZSBwYXNzIGZvciBGdW5jdGlvbiBGLgorICBQYXNzICpmaW5kSW1wbFBhc3MoUGFzcyAqUCwgQW5hbHlzaXNJRCBQSSwgRnVuY3Rpb24gJkYpOworCisgIHZvaWQgYWRkQW5hbHlzaXNJbXBsc1BhaXIoQW5hbHlzaXNJRCBQSSwgUGFzcyAqUCkgeworICAgIHN0ZDo6cGFpcjxBbmFseXNpc0lELCBQYXNzKj4gcGlyID0gc3RkOjptYWtlX3BhaXIoUEksUCk7CisgICAgQW5hbHlzaXNJbXBscy5wdXNoX2JhY2socGlyKTsKKyAgfQorCisgIC8vLyBjbGVhckFuYWx5c2lzSW1wbHMgLSBDbGVhciBjYWNoZSB0aGF0IGlzIHVzZWQgdG8gY29ubmVjdCBhIHBhc3MgdG8gdGhlCisgIC8vLyB0aGUgYW5hbHlzaXMgKFBhc3NJbmZvKS4KKyAgdm9pZCBjbGVhckFuYWx5c2lzSW1wbHMoKSB7CisgICAgQW5hbHlzaXNJbXBscy5jbGVhcigpOworICB9CisKKyAgLy8gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZSAtIFJldHVybiBhbmFseXNpcyByZXN1bHQgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0CisgIFBhc3MgKmdldEFuYWx5c2lzSWZBdmFpbGFibGUoQW5hbHlzaXNJRCBJRCwgYm9vbCBEaXJlY3Rpb24pIGNvbnN0OworCitwcml2YXRlOgorICAvLyBBbmFseXNpc0ltcGxzIC0gVGhpcyBrZWVwcyB0cmFjayBvZiB3aGljaCBwYXNzZXMgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlcworICAvLyB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgY3VycmVudCBwYXNzICh0byBpbXBsZW1lbnQgZ2V0QW5hbHlzaXMoKSkuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxBbmFseXNpc0lELCBQYXNzKj4gPiBBbmFseXNpc0ltcGxzOworCisgIC8vIFBhc3NNYW5hZ2VyIHRoYXQgaXMgdXNlZCB0byByZXNvbHZlIGFuYWx5c2lzIGluZm8KKyAgUE1EYXRhTWFuYWdlciAmUE07Cit9OworCisvLy8gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxBbmFseXNpc1R5cGU+KCkgLSBTdWJjbGFzc2VzIHVzZSB0aGlzIGZ1bmN0aW9uIHRvCisvLy8gZ2V0IGFuYWx5c2lzIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgYmUgYXJvdW5kLCBmb3IgZXhhbXBsZSB0byB1cGRhdGUgaXQuCisvLy8gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBnZXRBbmFseXNpcyBpbiB0aGF0IGl0IGNhbiBmYWlsIChpZiB0aGUgYW5hbHlzaXMKKy8vLyByZXN1bHRzIGhhdmVuJ3QgYmVlbiBjb21wdXRlZCksIHNvIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGNhbiBoYW5kbGUKKy8vLyB0aGUgY2FzZSB3aGVuIHRoZSBhbmFseXNpcyBpcyBub3QgYXZhaWxhYmxlLiAgVGhpcyBtZXRob2QgaXMgb2Z0ZW4gdXNlZCBieQorLy8vIHRyYW5zZm9ybWF0aW9uIEFQSXMgdG8gdXBkYXRlIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGEgcGFzcyBhdXRvbWF0aWNhbGx5IGFzCisvLy8gdGhlIHRyYW5zZm9ybSBpcyBwZXJmb3JtZWQuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KK0FuYWx5c2lzVHlwZSAqUGFzczo6Z2V0QW5hbHlzaXNJZkF2YWlsYWJsZSgpIGNvbnN0IHsKKyAgYXNzZXJ0KFJlc29sdmVyICYmICJQYXNzIG5vdCByZXNpZGVudCBpbiBhIFBhc3NNYW5hZ2VyIG9iamVjdCEiKTsKKworICBjb25zdCB2b2lkICpQSSA9ICZBbmFseXNpc1R5cGU6OklEOworCisgIFBhc3MgKlJlc3VsdFBhc3MgPSBSZXNvbHZlci0+Z2V0QW5hbHlzaXNJZkF2YWlsYWJsZShQSSwgdHJ1ZSk7CisgIGlmIChSZXN1bHRQYXNzID09IDApIHJldHVybiAwOworCisgIC8vIEJlY2F1c2UgdGhlIEFuYWx5c2lzVHlwZSBtYXkgbm90IGJlIGEgc3ViY2xhc3Mgb2YgcGFzcyAoZm9yCisgIC8vIEFuYWx5c2lzR3JvdXBzKSwgd2UgdXNlIGdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyIGhlcmUgdG8gcG90ZW50aWFsbHkKKyAgLy8gYWRqdXN0IHRoZSByZXR1cm4gcG9pbnRlciAoYmVjYXVzZSB0aGUgY2xhc3MgbWF5IG11bHRpcGx5IGluaGVyaXQsIG9uY2UKKyAgLy8gZnJvbSBwYXNzLCBvbmNlIGZyb20gQW5hbHlzaXNUeXBlKS4KKyAgcmV0dXJuIChBbmFseXNpc1R5cGUqKVJlc3VsdFBhc3MtPmdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyKFBJKTsKK30KKworLy8vIGdldEFuYWx5c2lzPEFuYWx5c2lzVHlwZT4oKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGdldAorLy8vIHRvIHRoZSBhbmFseXNpcyBpbmZvcm1hdGlvbiB0aGF0IHRoZXkgY2xhaW0gdG8gdXNlIGJ5IG92ZXJyaWRpbmcgdGhlCisvLy8gZ2V0QW5hbHlzaXNVc2FnZSBmdW5jdGlvbi4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorQW5hbHlzaXNUeXBlICZQYXNzOjpnZXRBbmFseXNpcygpIGNvbnN0IHsKKyAgYXNzZXJ0KFJlc29sdmVyICYmICJQYXNzIGhhcyBub3QgYmVlbiBpbnNlcnRlZCBpbnRvIGEgUGFzc01hbmFnZXIgb2JqZWN0ISIpOworICByZXR1cm4gZ2V0QW5hbHlzaXNJRDxBbmFseXNpc1R5cGU+KCZBbmFseXNpc1R5cGU6OklEKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorQW5hbHlzaXNUeXBlICZQYXNzOjpnZXRBbmFseXNpc0lEKEFuYWx5c2lzSUQgUEkpIGNvbnN0IHsKKyAgYXNzZXJ0KFBJICYmICJnZXRBbmFseXNpcyBmb3IgdW5yZWdpc3RlcmVkIHBhc3MhIik7CisgIGFzc2VydChSZXNvbHZlciYmIlBhc3MgaGFzIG5vdCBiZWVuIGluc2VydGVkIGludG8gYSBQYXNzTWFuYWdlciBvYmplY3QhIik7CisgIC8vIFBJICptdXN0KiBhcHBlYXIgaW4gQW5hbHlzaXNJbXBscy4gIEJlY2F1c2UgdGhlIG51bWJlciBvZiBwYXNzZXMgdXNlZAorICAvLyBzaG91bGQgYmUgYSBzbWFsbCBudW1iZXIsIHdlIGp1c3QgZG8gYSBsaW5lYXIgc2VhcmNoIG92ZXIgYSAoZGVuc2UpCisgIC8vIHZlY3Rvci4KKyAgUGFzcyAqUmVzdWx0UGFzcyA9IFJlc29sdmVyLT5maW5kSW1wbFBhc3MoUEkpOworICBhc3NlcnQgKFJlc3VsdFBhc3MgJiYgCisgICAgICAgICAgImdldEFuYWx5c2lzKigpIGNhbGxlZCBvbiBhbiBhbmFseXNpcyB0aGF0IHdhcyBub3QgIgorICAgICAgICAgICIncmVxdWlyZWQnIGJ5IHBhc3MhIik7CisKKyAgLy8gQmVjYXVzZSB0aGUgQW5hbHlzaXNUeXBlIG1heSBub3QgYmUgYSBzdWJjbGFzcyBvZiBwYXNzIChmb3IKKyAgLy8gQW5hbHlzaXNHcm91cHMpLCB3ZSB1c2UgZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIgaGVyZSB0byBwb3RlbnRpYWxseQorICAvLyBhZGp1c3QgdGhlIHJldHVybiBwb2ludGVyIChiZWNhdXNlIHRoZSBjbGFzcyBtYXkgbXVsdGlwbHkgaW5oZXJpdCwgb25jZQorICAvLyBmcm9tIHBhc3MsIG9uY2UgZnJvbSBBbmFseXNpc1R5cGUpLgorICByZXR1cm4gKihBbmFseXNpc1R5cGUqKVJlc3VsdFBhc3MtPmdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyKFBJKTsKK30KKworLy8vIGdldEFuYWx5c2lzPEFuYWx5c2lzVHlwZT4oKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGdldAorLy8vIHRvIHRoZSBhbmFseXNpcyBpbmZvcm1hdGlvbiB0aGF0IHRoZXkgY2xhaW0gdG8gdXNlIGJ5IG92ZXJyaWRpbmcgdGhlCisvLy8gZ2V0QW5hbHlzaXNVc2FnZSBmdW5jdGlvbi4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorQW5hbHlzaXNUeXBlICZQYXNzOjpnZXRBbmFseXNpcyhGdW5jdGlvbiAmRikgeworICBhc3NlcnQoUmVzb2x2ZXIgJiYiUGFzcyBoYXMgbm90IGJlZW4gaW5zZXJ0ZWQgaW50byBhIFBhc3NNYW5hZ2VyIG9iamVjdCEiKTsKKworICByZXR1cm4gZ2V0QW5hbHlzaXNJRDxBbmFseXNpc1R5cGU+KCZBbmFseXNpc1R5cGU6OklELCBGKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorQW5hbHlzaXNUeXBlICZQYXNzOjpnZXRBbmFseXNpc0lEKEFuYWx5c2lzSUQgUEksIEZ1bmN0aW9uICZGKSB7CisgIGFzc2VydChQSSAmJiAiZ2V0QW5hbHlzaXMgZm9yIHVucmVnaXN0ZXJlZCBwYXNzISIpOworICBhc3NlcnQoUmVzb2x2ZXIgJiYgIlBhc3MgaGFzIG5vdCBiZWVuIGluc2VydGVkIGludG8gYSBQYXNzTWFuYWdlciBvYmplY3QhIik7CisgIC8vIFBJICptdXN0KiBhcHBlYXIgaW4gQW5hbHlzaXNJbXBscy4gIEJlY2F1c2UgdGhlIG51bWJlciBvZiBwYXNzZXMgdXNlZAorICAvLyBzaG91bGQgYmUgYSBzbWFsbCBudW1iZXIsIHdlIGp1c3QgZG8gYSBsaW5lYXIgc2VhcmNoIG92ZXIgYSAoZGVuc2UpCisgIC8vIHZlY3Rvci4KKyAgUGFzcyAqUmVzdWx0UGFzcyA9IFJlc29sdmVyLT5maW5kSW1wbFBhc3ModGhpcywgUEksIEYpOworICBhc3NlcnQoUmVzdWx0UGFzcyAmJiAiVW5hYmxlIHRvIGZpbmQgcmVxdWVzdGVkIGFuYWx5c2lzIGluZm8iKTsKKyAgCisgIC8vIEJlY2F1c2UgdGhlIEFuYWx5c2lzVHlwZSBtYXkgbm90IGJlIGEgc3ViY2xhc3Mgb2YgcGFzcyAoZm9yCisgIC8vIEFuYWx5c2lzR3JvdXBzKSwgd2UgdXNlIGdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyIGhlcmUgdG8gcG90ZW50aWFsbHkKKyAgLy8gYWRqdXN0IHRoZSByZXR1cm4gcG9pbnRlciAoYmVjYXVzZSB0aGUgY2xhc3MgbWF5IG11bHRpcGx5IGluaGVyaXQsIG9uY2UKKyAgLy8gZnJvbSBwYXNzLCBvbmNlIGZyb20gQW5hbHlzaXNUeXBlKS4KKyAgcmV0dXJuICooQW5hbHlzaXNUeXBlKilSZXN1bHRQYXNzLT5nZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlcihQSSk7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1Bhc3NNYW5hZ2VyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vUGFzc01hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGI1ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1Bhc3NNYW5hZ2VyLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vPT09LSBsbHZtL1Bhc3NNYW5hZ2VyLmggLSBDb250YWluZXIgZm9yIFBhc3NlcyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBhc3NNYW5hZ2VyIGNsYXNzLiAgVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGhvbGQsCisvLyBtYWludGFpbiwgYW5kIG9wdGltaXplIGV4ZWN1dGlvbiBvZiBQYXNzZXMuICBUaGUgUGFzc01hbmFnZXIgY2xhc3MgZW5zdXJlcworLy8gdGhhdCBhbmFseXNpcyByZXN1bHRzIGFyZSBhdmFpbGFibGUgYmVmb3JlIGEgcGFzcyBydW5zLCBhbmQgdGhhdCBQYXNzJ3MgYXJlCisvLyBkZXN0cm95ZWQgd2hlbiB0aGUgUGFzc01hbmFnZXIgaXMgZGVzdHJveWVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QQVNTTUFOQUdFUl9ICisjZGVmaW5lIExMVk1fUEFTU01BTkFHRVJfSAorCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUGFzczsKK2NsYXNzIE1vZHVsZTsKKworY2xhc3MgUGFzc01hbmFnZXJJbXBsOworY2xhc3MgRnVuY3Rpb25QYXNzTWFuYWdlckltcGw7CisKKy8vLyBQYXNzTWFuYWdlckJhc2UgLSBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgdG8gYWxsb3cgY29kZSB0byBhZGQgcGFzc2VzIHRvCisvLy8gYSBwYXNzIG1hbmFnZXIgd2l0aG91dCBoYXZpbmcgdG8gaGFyZC1jb2RlIHdoYXQga2luZCBvZiBwYXNzIG1hbmFnZXIKKy8vLyBpdCBpcy4KK2NsYXNzIFBhc3NNYW5hZ2VyQmFzZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflBhc3NNYW5hZ2VyQmFzZSgpOworCisgIC8vLyBhZGQgLSBBZGQgYSBwYXNzIHRvIHRoZSBxdWV1ZSBvZiBwYXNzZXMgdG8gcnVuLiAgVGhpcyBwYXNzZXMgb3duZXJzaGlwIG9mCisgIC8vLyB0aGUgUGFzcyB0byB0aGUgUGFzc01hbmFnZXIuICBXaGVuIHRoZSBQYXNzTWFuYWdlciBpcyBkZXN0cm95ZWQsIHRoZSBwYXNzCisgIC8vLyB3aWxsIGJlIGRlc3Ryb3llZCBhcyB3ZWxsLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGRlbGV0ZSB0aGUgcGFzcy4gIFRoaXMKKyAgLy8vIGltcGxpZXMgdGhhdCBhbGwgcGFzc2VzIE1VU1QgYmUgYWxsb2NhdGVkIHdpdGggJ25ldycuCisgIHZpcnR1YWwgdm9pZCBhZGQoUGFzcyAqUCkgPSAwOworfTsKKworLy8vIFBhc3NNYW5hZ2VyIG1hbmFnZXMgTW9kdWxlUGFzc01hbmFnZXJzCitjbGFzcyBQYXNzTWFuYWdlciA6IHB1YmxpYyBQYXNzTWFuYWdlckJhc2UgeworcHVibGljOgorCisgIFBhc3NNYW5hZ2VyKCk7CisgIH5QYXNzTWFuYWdlcigpOworCisgIC8vLyBhZGQgLSBBZGQgYSBwYXNzIHRvIHRoZSBxdWV1ZSBvZiBwYXNzZXMgdG8gcnVuLiAgVGhpcyBwYXNzZXMgb3duZXJzaGlwIG9mCisgIC8vLyB0aGUgUGFzcyB0byB0aGUgUGFzc01hbmFnZXIuICBXaGVuIHRoZSBQYXNzTWFuYWdlciBpcyBkZXN0cm95ZWQsIHRoZSBwYXNzCisgIC8vLyB3aWxsIGJlIGRlc3Ryb3llZCBhcyB3ZWxsLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGRlbGV0ZSB0aGUgcGFzcy4gIFRoaXMKKyAgLy8vIGltcGxpZXMgdGhhdCBhbGwgcGFzc2VzIE1VU1QgYmUgYWxsb2NhdGVkIHdpdGggJ25ldycuCisgIHZvaWQgYWRkKFBhc3MgKlApOworIAorICAvLy8gcnVuIC0gRXhlY3V0ZSBhbGwgb2YgdGhlIHBhc3NlcyBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbi4gIEtlZXAgdHJhY2sgb2YKKyAgLy8vIHdoZXRoZXIgYW55IG9mIHRoZSBwYXNzZXMgbW9kaWZpZXMgdGhlIG1vZHVsZSwgYW5kIGlmIHNvLCByZXR1cm4gdHJ1ZS4KKyAgYm9vbCBydW4oTW9kdWxlICZNKTsKKworcHJpdmF0ZToKKyAgLy8vIGFkZEltcGwgLSBBZGQgYSBwYXNzIHRvIHRoZSBxdWV1ZSBvZiBwYXNzZXMgdG8gcnVuLCB3aXRob3V0CisgIC8vLyBjaGVja2luZyB3aGV0aGVyIHRvIGFkZCBhIHByaW50ZXIgcGFzcy4KKyAgdm9pZCBhZGRJbXBsKFBhc3MgKlApOworCisgIC8vLyBQYXNzTWFuYWdlckltcGxfTmV3IGlzIHRoZSBhY3R1YWwgY2xhc3MuIFBhc3NNYW5hZ2VyIGlzIGp1c3QgdGhlIAorICAvLy8gd3JhcGVyIHRvIHB1Ymxpc2ggc2ltcGxlIHBhc3MgbWFuYWdlciBpbnRlcmZhY2UKKyAgUGFzc01hbmFnZXJJbXBsICpQTTsKK307CisKKy8vLyBGdW5jdGlvblBhc3NNYW5hZ2VyIG1hbmFnZXMgRnVuY3Rpb25QYXNzZXMgYW5kIEJhc2ljQmxvY2tQYXNzTWFuYWdlcnMuCitjbGFzcyBGdW5jdGlvblBhc3NNYW5hZ2VyIDogcHVibGljIFBhc3NNYW5hZ2VyQmFzZSB7CitwdWJsaWM6CisgIC8vLyBGdW5jdGlvblBhc3NNYW5hZ2VyIGN0b3IgLSBUaGlzIGluaXRpYWxpemVzIHRoZSBwYXNzIG1hbmFnZXIuICBJdCBuZWVkcywKKyAgLy8vIGJ1dCBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiwgdGhlIHNwZWNpZmllZCBNb2R1bGUuCisgIGV4cGxpY2l0IEZ1bmN0aW9uUGFzc01hbmFnZXIoTW9kdWxlICpNKTsKKyAgfkZ1bmN0aW9uUGFzc01hbmFnZXIoKTsKKyAKKyAgLy8vIGFkZCAtIEFkZCBhIHBhc3MgdG8gdGhlIHF1ZXVlIG9mIHBhc3NlcyB0byBydW4uICBUaGlzIHBhc3NlcworICAvLy8gb3duZXJzaGlwIG9mIHRoZSBQYXNzIHRvIHRoZSBQYXNzTWFuYWdlci4gIFdoZW4gdGhlCisgIC8vLyBQYXNzTWFuYWdlcl9YIGlzIGRlc3Ryb3llZCwgdGhlIHBhc3Mgd2lsbCBiZSBkZXN0cm95ZWQgYXMgd2VsbCwgc28KKyAgLy8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gZGVsZXRlIHRoZSBwYXNzLiAoVE9ETyBkZWxldGUgcGFzc2VzLikKKyAgLy8vIFRoaXMgaW1wbGllcyB0aGF0IGFsbCBwYXNzZXMgTVVTVCBiZSBhbGxvY2F0ZWQgd2l0aCAnbmV3Jy4KKyAgdm9pZCBhZGQoUGFzcyAqUCk7CisKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwCisgIC8vLyB0cmFjayBvZiB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBmdW5jdGlvbiwgYW5kIGlmCisgIC8vLyBzbywgcmV0dXJuIHRydWUuCisgIC8vLworICBib29sIHJ1bihGdW5jdGlvbiAmRik7CisgIAorICAvLy8gZG9Jbml0aWFsaXphdGlvbiAtIFJ1biBhbGwgb2YgdGhlIGluaXRpYWxpemVycyBmb3IgdGhlIGZ1bmN0aW9uIHBhc3Nlcy4KKyAgLy8vCisgIGJvb2wgZG9Jbml0aWFsaXphdGlvbigpOworICAKKyAgLy8vIGRvRmluYWxpemF0aW9uIC0gUnVuIGFsbCBvZiB0aGUgZmluYWxpemVycyBmb3IgdGhlIGZ1bmN0aW9uIHBhc3Nlcy4KKyAgLy8vCisgIGJvb2wgZG9GaW5hbGl6YXRpb24oKTsKKyAgCitwcml2YXRlOgorICAvLy8gYWRkSW1wbCAtIEFkZCBhIHBhc3MgdG8gdGhlIHF1ZXVlIG9mIHBhc3NlcyB0byBydW4sIHdpdGhvdXQKKyAgLy8vIGNoZWNraW5nIHdoZXRoZXIgdG8gYWRkIGEgcHJpbnRlciBwYXNzLgorICB2b2lkIGFkZEltcGwoUGFzcyAqUCk7CisKKyAgRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgKkZQTTsKKyAgTW9kdWxlICpNOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vUGFzc01hbmFnZXJzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vUGFzc01hbmFnZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmNzNiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9QYXNzTWFuYWdlcnMuaApAQCAtMCwwICsxLDQ2NCBAQAorLy89PT0tIGxsdm0vUGFzc01hbmFnZXJzLmggLSBQYXNzIEluZnJhc3RydWN0dXJlIGNsYXNzZXMgIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIExMVk0gUGFzcyBNYW5hZ2VyIGluZnJhc3RydWN0dXJlLiAKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUEFTU01BTkFHRVJTX0gKKyNkZWZpbmUgTExWTV9QQVNTTUFOQUdFUlNfSAorCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE92ZXJ2aWV3OgorLy8gVGhlIFBhc3MgTWFuYWdlciBJbmZyYXN0cnVjdHVyZSBtYW5hZ2VzIHBhc3Nlcy4gSXQncyByZXNwb25zaWJpbGl0aWVzIGFyZToKKy8vIAorLy8gICBvIE1hbmFnZSBvcHRpbWl6YXRpb24gcGFzcyBleGVjdXRpb24gb3JkZXIKKy8vICAgbyBNYWtlIHJlcXVpcmVkIEFuYWx5c2lzIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBiZWZvcmUgcGFzcyBQIGlzIHJ1bgorLy8gICBvIFJlbGVhc2UgbWVtb3J5IG9jY3VwaWVkIGJ5IGRlYWQgcGFzc2VzCisvLyAgIG8gSWYgQW5hbHlzaXMgaW5mb3JtYXRpb24gaXMgZGlydGllZCBieSBhIHBhc3MgdGhlbiByZWdlbmVyYXRlIEFuYWx5c2lzIAorLy8gICAgIGluZm9ybWF0aW9uIGJlZm9yZSBpdCBpcyBjb25zdW1lZCBieSBhbm90aGVyIHBhc3MuCisvLworLy8gUGFzcyBNYW5hZ2VyIEluZnJhc3RydWN0dXJlIHVzZXMgbXVsdGlwbGUgcGFzcyBtYW5hZ2Vycy4gIFRoZXkgYXJlCisvLyBQYXNzTWFuYWdlciwgRnVuY3Rpb25QYXNzTWFuYWdlciwgTVBQYXNzTWFuYWdlciwgRlBQYXNzTWFuYWdlciwgQkJQYXNzTWFuYWdlci4KKy8vIFRoaXMgY2xhc3MgaGllcmFyY2h5IHVzZXMgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYnV0IHBhc3MgbWFuYWdlcnMgZG8gbm90CisvLyBkZXJpdmUgZnJvbSBhbm90aGVyIHBhc3MgbWFuYWdlci4KKy8vCisvLyBQYXNzTWFuYWdlciBhbmQgRnVuY3Rpb25QYXNzTWFuYWdlciBhcmUgdHdvIHRvcC1sZXZlbCBwYXNzIG1hbmFnZXIgdGhhdAorLy8gcmVwcmVzZW50cyB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlIG9mIHRoaXMgZW50aXJlIHBhc3MgbWFuYWdlciBpbmZyYXN0dWN0dXJlLgorLy8KKy8vIEltcG9ydGFudCBjbGFzc2VzIDoKKy8vCisvLyBbb10gY2xhc3MgUE1Ub3BMZXZlbE1hbmFnZXI7CisvLworLy8gVHdvIHRvcCBsZXZlbCBtYW5hZ2VycywgUGFzc01hbmFnZXIgYW5kIEZ1bmN0aW9uUGFzc01hbmFnZXIsIGRlcml2ZSBmcm9tIAorLy8gUE1Ub3BMZXZlbE1hbmFnZXIuIFBNVG9wTGV2ZWxNYW5hZ2VyIG1hbmFnZXMgaW5mb3JtYXRpb24gdXNlZCBieSB0b3AgbGV2ZWwgCisvLyBtYW5hZ2VycyBzdWNoIGFzIGxhc3QgdXNlciBpbmZvLgorLy8KKy8vIFtvXSBjbGFzcyBQTURhdGFNYW5hZ2VyOworLy8KKy8vIFBNRGF0YU1hbmFnZXIgbWFuYWdlcyBpbmZvcm1hdGlvbiwgZS5nLiBsaXN0IG9mIGF2YWlsYWJsZSBhbmFseXNpcyBpbmZvLCAKKy8vIHVzZWQgYnkgYSBwYXNzIG1hbmFnZXIgdG8gbWFuYWdlIGV4ZWN1dGlvbiBvcmRlciBvZiBwYXNzZXMuIEl0IGFsc28gcHJvdmlkZXMKKy8vIGEgcGxhY2UgdG8gaW1wbGVtZW50IGNvbW1vbiBwYXNzIG1hbmFnZXIgQVBJcy4gQWxsIHBhc3MgbWFuYWdlcnMgZGVyaXZlIGZyb20KKy8vIFBNRGF0YU1hbmFnZXIuCisvLworLy8gW29dIGNsYXNzIEJCUGFzc01hbmFnZXIgOiBwdWJsaWMgRnVuY3Rpb25QYXNzLCBwdWJsaWMgUE1EYXRhTWFuYWdlcjsKKy8vCisvLyBCQlBhc3NNYW5hZ2VyIG1hbmFnZXMgQmFzaWNCbG9ja1Bhc3Nlcy4KKy8vCisvLyBbb10gY2xhc3MgRnVuY3Rpb25QYXNzTWFuYWdlcjsKKy8vCisvLyBUaGlzIGlzIGEgZXh0ZXJuYWwgaW50ZXJmYWNlIHVzZWQgYnkgSklUIHRvIG1hbmFnZSBGdW5jdGlvblBhc3Nlcy4gVGhpcworLy8gaW50ZXJmYWNlIHJlbGllcyBvbiBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbCB0byBkbyBhbGwgdGhlIHRhc2tzLgorLy8KKy8vIFtvXSBjbGFzcyBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbCA6IHB1YmxpYyBNb2R1bGVQYXNzLCBQTURhdGFNYW5hZ2VyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFBNVG9wTGV2ZWxNYW5hZ2VyOworLy8KKy8vIEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsIGlzIGEgdG9wIGxldmVsIG1hbmFnZXIuIEl0IG1hbmFnZXMgRlBQYXNzTWFuYWdlcnMKKy8vCisvLyBbb10gY2xhc3MgRlBQYXNzTWFuYWdlciA6IHB1YmxpYyBNb2R1bGVQYXNzLCBwdWJsaWMgUE1EYXRhTWFuYWdlcjsKKy8vCisvLyBGUFBhc3NNYW5hZ2VyIG1hbmFnZXMgRnVuY3Rpb25QYXNzZXMgYW5kIEJCUGFzc01hbmFnZXJzCisvLworLy8gW29dIGNsYXNzIE1QUGFzc01hbmFnZXIgOiBwdWJsaWMgUGFzcywgcHVibGljIFBNRGF0YU1hbmFnZXI7CisvLworLy8gTVBQYXNzTWFuYWdlciBtYW5hZ2VzIE1vZHVsZVBhc3NlcyBhbmQgRlBQYXNzTWFuYWdlcnMKKy8vCisvLyBbb10gY2xhc3MgUGFzc01hbmFnZXI7CisvLworLy8gVGhpcyBpcyBhIGV4dGVybmFsIGludGVyZmFjZSB1c2VkIGJ5IHZhcmlvdXMgdG9vbHMgdG8gbWFuYWdlcyBwYXNzZXMuIEl0CisvLyByZWxpZXMgb24gUGFzc01hbmFnZXJJbXBsIHRvIGRvIGFsbCB0aGUgdGFza3MuCisvLworLy8gW29dIGNsYXNzIFBhc3NNYW5hZ2VySW1wbCA6IHB1YmxpYyBQYXNzLCBwdWJsaWMgUE1EYXRhTWFuYWdlciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUE1EVG9wTGV2ZWxNYW5hZ2VyCisvLworLy8gUGFzc01hbmFnZXJJbXBsIGlzIGEgdG9wIGxldmVsIHBhc3MgbWFuYWdlciByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcKKy8vIE1QUGFzc01hbmFnZXJzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTW9kdWxlOworICBjbGFzcyBQYXNzOworICBjbGFzcyBTdHJpbmdSZWY7CisgIGNsYXNzIFZhbHVlOworICBjbGFzcyBUaW1lcjsKKyAgY2xhc3MgUE1EYXRhTWFuYWdlcjsKKworLy8vIEZ1bmN0aW9uUGFzc01hbmFnZXIgYW5kIFBhc3NNYW5hZ2VyLCB0d28gdG9wIGxldmVsIG1hbmFnZXJzLCBzZXJ2ZSAKKy8vLyBhcyB0aGUgcHVibGljIGludGVyZmFjZSBvZiBwYXNzIG1hbmFnZXIgaW5mcmFzdHJ1Y3R1cmUuCitlbnVtIFRvcExldmVsTWFuYWdlclR5cGUgeworICBUTE1fRnVuY3Rpb24sICAvLyBGdW5jdGlvblBhc3NNYW5hZ2VyCisgIFRMTV9QYXNzICAgICAgIC8vIFBhc3NNYW5hZ2VyCit9OworICAgIAorLy8gZW51bXMgZm9yIGRlYnVnZ2luZyBzdHJpbmdzCitlbnVtIFBhc3NEZWJ1Z2dpbmdTdHJpbmcgeworICBFWEVDVVRJT05fTVNHLCAvLyAiRXhlY3V0aW5nIFBhc3MgJyIKKyAgTU9ESUZJQ0FUSU9OX01TRywgLy8gIicgTWFkZSBNb2RpZmljYXRpb24gJyIKKyAgRlJFRUlOR19NU0csIC8vICIgRnJlZWluZyBQYXNzICciCisgIE9OX0JBU0lDQkxPQ0tfTVNHLCAvLyAiJyAgb24gQmFzaWNCbG9jayAnIiArIFBhc3NOYW1lICsgIicuLi5cbiIKKyAgT05fRlVOQ1RJT05fTVNHLCAvLyAiJyBvbiBGdW5jdGlvbiAnIiArIEZ1bmN0aW9uTmFtZSArICInLi4uXG4iCisgIE9OX01PRFVMRV9NU0csIC8vICInIG9uIE1vZHVsZSAnIiArIE1vZHVsZU5hbWUgKyAiJy4uLlxuIgorICBPTl9MT09QX01TRywgLy8gIiAnb24gTG9vcCAuLi5cbiciCisgIE9OX0NHX01TRyAvLyAiJyBvbiBDYWxsIEdyYXBoIC4uLlxuJyIKK307ICAKKworLy8vIFBhc3NNYW5hZ2VyUHJldHR5U3RhY2tFbnRyeSAtIFRoaXMgaXMgdXNlZCB0byBwcmludCBpbmZvcm1hdGl2ZSBpbmZvcm1hdGlvbgorLy8vIGFib3V0IHdoYXQgcGFzcyBpcyBydW5uaW5nIHdoZW4vaWYgYSBzdGFjayB0cmFjZSBpcyBnZW5lcmF0ZWQuCitjbGFzcyBQYXNzTWFuYWdlclByZXR0eVN0YWNrRW50cnkgOiBwdWJsaWMgUHJldHR5U3RhY2tUcmFjZUVudHJ5IHsKKyAgUGFzcyAqUDsKKyAgVmFsdWUgKlY7CisgIE1vZHVsZSAqTTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUGFzc01hbmFnZXJQcmV0dHlTdGFja0VudHJ5KFBhc3MgKnApCisgICAgOiBQKHApLCBWKDApLCBNKDApIHt9ICAvLyBXaGVuIFAgaXMgcmVsZWFzZU1lbW9yeSdkLgorICBQYXNzTWFuYWdlclByZXR0eVN0YWNrRW50cnkoUGFzcyAqcCwgVmFsdWUgJnYpCisgICAgOiBQKHApLCBWKCZ2KSwgTSgwKSB7fSAvLyBXaGVuIFAgaXMgcnVuIG9uIFYKKyAgUGFzc01hbmFnZXJQcmV0dHlTdGFja0VudHJ5KFBhc3MgKnAsIE1vZHVsZSAmbSkKKyAgICA6IFAocCksIFYoMCksIE0oJm0pIHt9IC8vIFdoZW4gUCBpcyBydW4gb24gTQorICAKKyAgLy8vIHByaW50IC0gRW1pdCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHN0YWNrIGZyYW1lIHRvIE9TLgorICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisgIAorICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQTVN0YWNrCisvLworLy8vIFBNU3RhY2sgLSBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzdGFjayBkYXRhIHN0cnVjdHVyZSBvZiBQTURhdGFNYW5hZ2VyCisvLy8gcG9pbnRlcnMuCisvLy8KKy8vLyBUb3AgbGV2ZWwgcGFzcyBtYW5hZ2VycyAoc2VlIFBhc3NNYW5hZ2VyLmNwcCkgbWFpbnRhaW4gYWN0aXZlIFBhc3MgTWFuYWdlcnMgCisvLy8gdXNpbmcgUE1TdGFjay4gRWFjaCBQYXNzIGltcGxlbWVudHMgYXNzaWduUGFzc01hbmFnZXIoKSB0byBjb25uZWN0IGl0c2VsZgorLy8vIHdpdGggYXBwcm9wcmlhdGUgbWFuYWdlci4gYXNzaWduUGFzc01hbmFnZXIoKSB3YWxrcyBQTVN0YWNrIHRvIGZpbmQKKy8vLyBzdWl0YWJsZSBtYW5hZ2VyLgorY2xhc3MgUE1TdGFjayB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UE1EYXRhTWFuYWdlciAqPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBTLnJiZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFMucmVuZCgpOyB9CisKKyAgdm9pZCBwb3AoKTsKKyAgUE1EYXRhTWFuYWdlciAqdG9wKCkgY29uc3QgeyByZXR1cm4gUy5iYWNrKCk7IH0KKyAgdm9pZCBwdXNoKFBNRGF0YU1hbmFnZXIgKlBNKTsKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFMuZW1wdHkoKTsgfQorCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxQTURhdGFNYW5hZ2VyICo+IFM7Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQTVRvcExldmVsTWFuYWdlcgorLy8KKy8vLyBQTVRvcExldmVsTWFuYWdlciBtYW5hZ2VzIExhc3RVc2VyIGluZm8gYW5kIGNvbGxlY3RzIGNvbW1vbiBBUElzIHVzZWQgYnkKKy8vLyB0b3AgbGV2ZWwgcGFzcyBtYW5hZ2Vycy4KK2NsYXNzIFBNVG9wTGV2ZWxNYW5hZ2VyIHsKK3B1YmxpYzoKKworICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bUNvbnRhaW5lZE1hbmFnZXJzKCkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpUGFzc01hbmFnZXJzLnNpemUoKTsKKyAgfQorCisgIC8vLyBTY2hlZHVsZSBwYXNzIFAgZm9yIGV4ZWN1dGlvbi4gTWFrZSBzdXJlIHRoYXQgcGFzc2VzIHJlcXVpcmVkIGJ5CisgIC8vLyBQIGFyZSBydW4gYmVmb3JlIFAgaXMgcnVuLiBVcGRhdGUgYW5hbHlzaXMgaW5mbyBtYWludGFpbmVkIGJ5CisgIC8vLyB0aGUgbWFuYWdlci4gUmVtb3ZlIGRlYWQgcGFzc2VzLiBUaGlzIGlzIGEgcmVjdXJzaXZlIGZ1bmN0aW9uLgorICB2b2lkIHNjaGVkdWxlUGFzcyhQYXNzICpQKTsKKworICAvLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCBieSB0b3AgbGV2ZWwgcGFzcyBtYW5hZ2VyIGFuZCB1c2VkIGJ5IAorICAvLy8gc2NoZWR1bGVQYXNzKCkgdG8gYWRkIGFuYWx5c2lzIGluZm8gcGFzc2VzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUuCisgIHZpcnR1YWwgdm9pZCBhZGRUb3BMZXZlbFBhc3MoUGFzcyAgKlApID0gMDsKKworICAvLy8gU2V0IHBhc3MgUCBhcyB0aGUgbGFzdCB1c2VyIG9mIHRoZSBnaXZlbiBhbmFseXNpcyBwYXNzZXMuCisgIHZvaWQgc2V0TGFzdFVzZXIoU21hbGxWZWN0b3I8UGFzcyAqLCAxMj4gJkFuYWx5c2lzUGFzc2VzLCBQYXNzICpQKTsKKworICAvLy8gQ29sbGVjdCBwYXNzZXMgd2hvc2UgbGFzdCB1c2VyIGlzIFAKKyAgdm9pZCBjb2xsZWN0TGFzdFVzZXMoU21hbGxWZWN0b3I8UGFzcyAqLCAxMj4gJkxhc3RVc2VzLCBQYXNzICpQKTsKKworICAvLy8gRmluZCB0aGUgcGFzcyB0aGF0IGltcGxlbWVudHMgQW5hbHlzaXMgQUlELiBTZWFyY2ggaW1tdXRhYmxlCisgIC8vLyBwYXNzZXMgYW5kIGFsbCBwYXNzIG1hbmFnZXJzLiBJZiBkZXNpcmVkIHBhc3MgaXMgbm90IGZvdW5kCisgIC8vLyB0aGVuIHJldHVybiBOVUxMLgorICBQYXNzICpmaW5kQW5hbHlzaXNQYXNzKEFuYWx5c2lzSUQgQUlEKTsKKworICAvLy8gRmluZCBhbmFseXNpcyB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBhc3MgUC4KKyAgQW5hbHlzaXNVc2FnZSAqZmluZEFuYWx5c2lzVXNhZ2UoUGFzcyAqUCk7CisKKyAgZXhwbGljaXQgUE1Ub3BMZXZlbE1hbmFnZXIoZW51bSBUb3BMZXZlbE1hbmFnZXJUeXBlIHQpOworICB2aXJ0dWFsIH5QTVRvcExldmVsTWFuYWdlcigpOyAKKworICAvLy8gQWRkIGltbXV0YWJsZSBwYXNzIGFuZCBpbml0aWFsaXplIGl0LgorICBpbmxpbmUgdm9pZCBhZGRJbW11dGFibGVQYXNzKEltbXV0YWJsZVBhc3MgKlApIHsKKyAgICBQLT5pbml0aWFsaXplUGFzcygpOworICAgIEltbXV0YWJsZVBhc3Nlcy5wdXNoX2JhY2soUCk7CisgIH0KKworICBpbmxpbmUgU21hbGxWZWN0b3I8SW1tdXRhYmxlUGFzcyAqLCA4PiYgZ2V0SW1tdXRhYmxlUGFzc2VzKCkgeworICAgIHJldHVybiBJbW11dGFibGVQYXNzZXM7CisgIH0KKworICB2b2lkIGFkZFBhc3NNYW5hZ2VyKFBNRGF0YU1hbmFnZXIgKk1hbmFnZXIpIHsKKyAgICBQYXNzTWFuYWdlcnMucHVzaF9iYWNrKE1hbmFnZXIpOworICB9CisKKyAgLy8gQWRkIE1hbmFnZXIgaW50byB0aGUgbGlzdCBvZiBtYW5hZ2VycyB0aGF0IGFyZSBub3QgZGlyZWN0bHkKKyAgLy8gbWFpbnRhaW5lZCBieSB0aGlzIHRvcCBsZXZlbCBwYXNzIG1hbmFnZXIKKyAgaW5saW5lIHZvaWQgYWRkSW5kaXJlY3RQYXNzTWFuYWdlcihQTURhdGFNYW5hZ2VyICpNYW5hZ2VyKSB7CisgICAgSW5kaXJlY3RQYXNzTWFuYWdlcnMucHVzaF9iYWNrKE1hbmFnZXIpOworICB9CisKKyAgLy8gUHJpbnQgcGFzc2VzIG1hbmFnZWQgYnkgdGhpcyB0b3AgbGV2ZWwgbWFuYWdlci4KKyAgdm9pZCBkdW1wUGFzc2VzKCkgY29uc3Q7CisgIHZvaWQgZHVtcEFyZ3VtZW50cygpIGNvbnN0OworCisgIHZvaWQgaW5pdGlhbGl6ZUFsbEFuYWx5c2lzSW5mbygpOworCisgIC8vIEFjdGl2ZSBQYXNzIE1hbmFnZXJzCisgIFBNU3RhY2sgYWN0aXZlU3RhY2s7CisKK3Byb3RlY3RlZDoKKyAgCisgIC8vLyBDb2xsZWN0aW9uIG9mIHBhc3MgbWFuYWdlcnMKKyAgU21hbGxWZWN0b3I8UE1EYXRhTWFuYWdlciAqLCA4PiBQYXNzTWFuYWdlcnM7CisKK3ByaXZhdGU6CisKKyAgLy8vIENvbGxlY3Rpb24gb2YgcGFzcyBtYW5hZ2VycyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgbWFpbnRhaW5lZAorICAvLy8gYnkgdGhpcyBwYXNzIG1hbmFnZXIKKyAgU21hbGxWZWN0b3I8UE1EYXRhTWFuYWdlciAqLCA4PiBJbmRpcmVjdFBhc3NNYW5hZ2VyczsKKworICAvLyBNYXAgdG8ga2VlcCB0cmFjayBvZiBsYXN0IHVzZXIgb2YgdGhlIGFuYWx5c2lzIHBhc3MuCisgIC8vIExhc3RVc2VyLT5zZWNvbmQgaXMgdGhlIGxhc3QgdXNlciBvZiBMYXN0dXNlci0+Zmlyc3QuCisgIERlbnNlTWFwPFBhc3MgKiwgUGFzcyAqPiBMYXN0VXNlcjsKKworICAvLyBNYXAgdG8ga2VlcCB0cmFjayBvZiBwYXNzZXMgdGhhdCBhcmUgbGFzdCB1c2VkIGJ5IGEgcGFzcy4KKyAgLy8gVGhpcyBpbnZlcnNlIG1hcCBpcyBpbml0aWFsaXplZCBhdCBQTS0+cnVuKCkgYmFzZWQgb24KKyAgLy8gTGFzdFVzZXIgbWFwLgorICBEZW5zZU1hcDxQYXNzICosIFNtYWxsUHRyU2V0PFBhc3MgKiwgOD4gPiBJbnZlcnNlZExhc3RVc2VyOworCisgIC8vLyBJbW11dGFibGUgcGFzc2VzIGFyZSBtYW5hZ2VkIGJ5IHRvcCBsZXZlbCBtYW5hZ2VyLgorICBTbWFsbFZlY3RvcjxJbW11dGFibGVQYXNzICosIDg+IEltbXV0YWJsZVBhc3NlczsKKworICBEZW5zZU1hcDxQYXNzICosIEFuYWx5c2lzVXNhZ2UgKj4gQW5Vc2FnZU1hcDsKK307CisKKworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQTURhdGFNYW5hZ2VyCisKKy8vLyBQTURhdGFNYW5hZ2VyIHByb3ZpZGVzIHRoZSBjb21tb24gcGxhY2UgdG8gbWFuYWdlIHRoZSBhbmFseXNpcyBkYXRhCisvLy8gdXNlZCBieSBwYXNzIG1hbmFnZXJzLgorY2xhc3MgUE1EYXRhTWFuYWdlciB7CitwdWJsaWM6CisKKyAgZXhwbGljaXQgUE1EYXRhTWFuYWdlcihpbnQgRGVwdGgpIDogVFBNKE5VTEwpLCBEZXB0aChEZXB0aCkgeworICAgIGluaXRpYWxpemVBbmFseXNpc0luZm8oKTsKKyAgfQorCisgIHZpcnR1YWwgflBNRGF0YU1hbmFnZXIoKTsKKyAgCisgIHZpcnR1YWwgUGFzcyAqZ2V0QXNQYXNzKCkgPSAwOworCisgIC8vLyBBdWdtZW50IEF2YWlsYWJsZUFuYWx5c2lzIGJ5IGFkZGluZyBhbmFseXNpcyBtYWRlIGF2YWlsYWJsZSBieSBwYXNzIFAuCisgIHZvaWQgcmVjb3JkQXZhaWxhYmxlQW5hbHlzaXMoUGFzcyAqUCk7CisKKyAgLy8vIHZlcmlmeVByZXNlcnZlZEFuYWx5c2lzIC0tIFZlcmlmeSBhbmFseXNpcyBwcmVzcmV2ZWQgYnkgcGFzcyBQLgorICB2b2lkIHZlcmlmeVByZXNlcnZlZEFuYWx5c2lzKFBhc3MgKlApOworCisgIC8vLyBSZW1vdmUgQW5hbHlzaXMgdGhhdCBpcyBub3QgcHJlc2VydmVkIGJ5IHRoZSBwYXNzCisgIHZvaWQgcmVtb3ZlTm90UHJlc2VydmVkQW5hbHlzaXMoUGFzcyAqUCk7CisgIAorICAvLy8gUmVtb3ZlIGRlYWQgcGFzc2VzIHVzZWQgYnkgUC4KKyAgdm9pZCByZW1vdmVEZWFkUGFzc2VzKFBhc3MgKlAsIFN0cmluZ1JlZiBNc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBQYXNzRGVidWdnaW5nU3RyaW5nKTsKKworICAvLy8gUmVtb3ZlIFAuCisgIHZvaWQgZnJlZVBhc3MoUGFzcyAqUCwgU3RyaW5nUmVmIE1zZywgCisgICAgICAgICAgICAgICAgZW51bSBQYXNzRGVidWdnaW5nU3RyaW5nKTsKKworICAvLy8gQWRkIHBhc3MgUCBpbnRvIHRoZSBQYXNzVmVjdG9yLiBVcGRhdGUgCisgIC8vLyBBdmFpbGFibGVBbmFseXNpcyBhcHByb3ByaWF0ZWx5IGlmIFByb2Nlc3NBbmFseXNpcyBpcyB0cnVlLgorICB2b2lkIGFkZChQYXNzICpQLCBib29sIFByb2Nlc3NBbmFseXNpcyA9IHRydWUpOworCisgIC8vLyBBZGQgUmVxdWlyZWRQYXNzIGludG8gbGlzdCBvZiBsb3dlciBsZXZlbCBwYXNzZXMgcmVxdWlyZWQgYnkgcGFzcyBQLgorICAvLy8gUmVxdWlyZWRQYXNzIGlzIHJ1biBvbiB0aGUgZmx5IGJ5IFBhc3MgTWFuYWdlciB3aGVuIFAgcmVxdWVzdHMgaXQKKyAgLy8vIHRocm91Z2ggZ2V0QW5hbHlzaXMgaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgYWRkTG93ZXJMZXZlbFJlcXVpcmVkUGFzcyhQYXNzICpQLCBQYXNzICpSZXF1aXJlZFBhc3MpOworCisgIHZpcnR1YWwgUGFzcyAqZ2V0T25UaGVGbHlQYXNzKFBhc3MgKlAsIEFuYWx5c2lzSUQgUEksIEZ1bmN0aW9uICZGKTsKKworICAvLy8gSW5pdGlhbGl6ZSBhdmFpbGFibGUgYW5hbHlzaXMgaW5mb3JtYXRpb24uCisgIHZvaWQgaW5pdGlhbGl6ZUFuYWx5c2lzSW5mbygpIHsgCisgICAgQXZhaWxhYmxlQW5hbHlzaXMuY2xlYXIoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUE1UX0xhc3Q7ICsraSkKKyAgICAgIEluaGVyaXRlZEFuYWx5c2lzW2ldID0gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIFAgcHJlc2VydmVzIGhpZ2ggbGV2ZWwgYW5hbHlzaXMgdXNlZCBieSBvdGhlcgorICAvLyBwYXNzZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIG1hbmFnZXIuCisgIGJvb2wgcHJlc2VydmVIaWdoZXJMZXZlbEFuYWx5c2lzKFBhc3MgKlApOworCisKKyAgLy8vIFBvcHVsYXRlIFJlcXVpcmVkUGFzc2VzIHdpdGggYW5hbHlzaXMgcGFzcyB0aGF0IGFyZSByZXF1aXJlZCBieQorICAvLy8gcGFzcyBQIGFuZCBhcmUgYXZhaWxhYmxlLiBQb3B1bGF0ZSBSZXFQYXNzTm90QXZhaWxhYmxlIHdpdGggYW5hbHlzaXMKKyAgLy8vIHBhc3MgdGhhdCBhcmUgcmVxdWlyZWQgYnkgcGFzcyBQIGJ1dCBhcmUgbm90IGF2YWlsYWJsZS4KKyAgdm9pZCBjb2xsZWN0UmVxdWlyZWRBbmFseXNpcyhTbWFsbFZlY3RvcjxQYXNzICosIDg+ICZSZXF1aXJlZFBhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxBbmFseXNpc0lELCA4PiAmUmVxUGFzc05vdEF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzICpQKTsKKworICAvLy8gQWxsIFJlcXVpcmVkIGFuYWx5c2VzIHNob3VsZCBiZSBhdmFpbGFibGUgdG8gdGhlIHBhc3MgYXMgaXQgcnVucyEgIEhlcmUKKyAgLy8vIHdlIGZpbGwgaW4gdGhlIEFuYWx5c2lzSW1wbHMgbWVtYmVyIG9mIHRoZSBwYXNzIHNvIHRoYXQgaXQgY2FuCisgIC8vLyBzdWNjZXNzZnVsbHkgdXNlIHRoZSBnZXRBbmFseXNpcygpIG1ldGhvZCB0byByZXRyaWV2ZSB0aGUKKyAgLy8vIGltcGxlbWVudGF0aW9ucyBpdCBuZWVkcy4KKyAgdm9pZCBpbml0aWFsaXplQW5hbHlzaXNJbXBsKFBhc3MgKlApOworCisgIC8vLyBGaW5kIHRoZSBwYXNzIHRoYXQgaW1wbGVtZW50cyBBbmFseXNpcyBBSUQuIElmIGRlc2lyZWQgcGFzcyBpcyBub3QgZm91bmQKKyAgLy8vIHRoZW4gcmV0dXJuIE5VTEwuCisgIFBhc3MgKmZpbmRBbmFseXNpc1Bhc3MoQW5hbHlzaXNJRCBBSUQsIGJvb2wgRGlyZWN0aW9uKTsKKworICAvLyBBY2Nlc3MgdG9wbGV2ZWwgbWFuYWdlcgorICBQTVRvcExldmVsTWFuYWdlciAqZ2V0VG9wTGV2ZWxNYW5hZ2VyKCkgeyByZXR1cm4gVFBNOyB9CisgIHZvaWQgc2V0VG9wTGV2ZWxNYW5hZ2VyKFBNVG9wTGV2ZWxNYW5hZ2VyICpUKSB7IFRQTSA9IFQ7IH0KKworICB1bnNpZ25lZCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIERlcHRoOyB9CisKKyAgLy8gUHJpbnQgcm91dGluZXMgdXNlZCBieSBkZWJ1Zy1wYXNzCisgIHZvaWQgZHVtcExhc3RVc2VzKFBhc3MgKlAsIHVuc2lnbmVkIE9mZnNldCkgY29uc3Q7CisgIHZvaWQgZHVtcFBhc3NBcmd1bWVudHMoKSBjb25zdDsKKyAgdm9pZCBkdW1wUGFzc0luZm8oUGFzcyAqUCwgZW51bSBQYXNzRGVidWdnaW5nU3RyaW5nIFMxLAorICAgICAgICAgICAgICAgICAgICBlbnVtIFBhc3NEZWJ1Z2dpbmdTdHJpbmcgUzIsIFN0cmluZ1JlZiBNc2cpOworICB2b2lkIGR1bXBSZXF1aXJlZFNldChjb25zdCBQYXNzICpQKSBjb25zdDsKKyAgdm9pZCBkdW1wUHJlc2VydmVkU2V0KGNvbnN0IFBhc3MgKlApIGNvbnN0OworCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpUGFzc1ZlY3Rvci5zaXplKCk7CisgIH0KKworICB2aXJ0dWFsIFBhc3NNYW5hZ2VyVHlwZSBnZXRQYXNzTWFuYWdlclR5cGUoKSBjb25zdCB7IAorICAgIGFzc2VydCAoIDAgJiYgIkludmFsaWQgdXNlIG9mIGdldFBhc3NNYW5hZ2VyVHlwZSIpOworICAgIHJldHVybiBQTVRfVW5rbm93bjsgCisgIH0KKworICBzdGQ6Om1hcDxBbmFseXNpc0lELCBQYXNzKj4gKmdldEF2YWlsYWJsZUFuYWx5c2lzKCkgeworICAgIHJldHVybiAmQXZhaWxhYmxlQW5hbHlzaXM7CisgIH0KKworICAvLyBDb2xsZWN0IEF2YWlsYWJsZUFuYWx5c2lzIGZyb20gYWxsIHRoZSBhY3RpdmUgUGFzcyBNYW5hZ2Vycy4KKyAgdm9pZCBwb3B1bGF0ZUluaGVyaXRlZEFuYWx5c2lzKFBNU3RhY2sgJlBNUykgeworICAgIHVuc2lnbmVkIEluZGV4ID0gMDsKKyAgICBmb3IgKFBNU3RhY2s6Oml0ZXJhdG9yIEkgPSBQTVMuYmVnaW4oKSwgRSA9IFBNUy5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgSW5oZXJpdGVkQW5hbHlzaXNbSW5kZXgrK10gPSAoKkkpLT5nZXRBdmFpbGFibGVBbmFseXNpcygpOworICB9CisKK3Byb3RlY3RlZDoKKworICAvLyBUb3AgbGV2ZWwgbWFuYWdlci4KKyAgUE1Ub3BMZXZlbE1hbmFnZXIgKlRQTTsKKworICAvLyBDb2xsZWN0aW9uIG9mIHBhc3MgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIG1hbmFnZXIKKyAgU21hbGxWZWN0b3I8UGFzcyAqLCAxNj4gUGFzc1ZlY3RvcjsKKworICAvLyBDb2xsZWN0aW9uIG9mIEFuYWx5c2lzIHByb3ZpZGVkIGJ5IFBhcmVudCBwYXNzIG1hbmFnZXIgYW5kCisgIC8vIHVzZWQgYnkgY3VycmVudCBwYXNzIG1hbmFnZXIuIEF0IGF0IHRpbWUgdGhlcmUgY2FuIG5vdCBiZSBtb3JlCisgIC8vIHRoZW4gUE1UX0xhc3QgYWN0aXZlIHBhc3MgbWFuZ2Vycy4KKyAgc3RkOjptYXA8QW5hbHlzaXNJRCwgUGFzcyAqPiAqSW5oZXJpdGVkQW5hbHlzaXNbUE1UX0xhc3RdOworCisgIAorICAvLy8gaXNQYXNzRGVidWdnaW5nRXhlY3V0aW9uc09yTW9yZSAtIFJldHVybiB0cnVlIGlmIC1kZWJ1Zy1wYXNzPUV4ZWN1dGlvbnMKKyAgLy8vIG9yIGhpZ2hlciBpcyBzcGVjaWZpZWQuCisgIGJvb2wgaXNQYXNzRGVidWdnaW5nRXhlY3V0aW9uc09yTW9yZSgpIGNvbnN0OworICAKK3ByaXZhdGU6CisgIHZvaWQgZHVtcEFuYWx5c2lzVXNhZ2UoU3RyaW5nUmVmIE1zZywgY29uc3QgUGFzcyAqUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmFseXNpc1VzYWdlOjpWZWN0b3JUeXBlICZTZXQpIGNvbnN0OworCisgIC8vIFNldCBvZiBhdmFpbGFibGUgQW5hbHlzaXMuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB3aGlsZSBzY2hlZHVsaW5nIAorICAvLyBwYXNzLiBJZiBhIHBhc3MgcmVxdWlyZXMgYW4gYW5hbHlzaXMgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSB0aGVuIAorICAvLyB0aGUgcmVxdWlyZWQgYW5hbHlzaXMgcGFzcyBpcyBzY2hlZHVsZWQgdG8gcnVuIGJlZm9yZSB0aGUgcGFzcyBpdHNlbGYgaXMKKyAgLy8gc2NoZWR1bGVkIHRvIHJ1bi4KKyAgc3RkOjptYXA8QW5hbHlzaXNJRCwgUGFzcyo+IEF2YWlsYWJsZUFuYWx5c2lzOworCisgIC8vIENvbGxlY3Rpb24gb2YgaGlnaGVyIGxldmVsIGFuYWx5c2lzIHVzZWQgYnkgdGhlIHBhc3MgbWFuYWdlZCBieQorICAvLyB0aGlzIG1hbmFnZXIuCisgIFNtYWxsVmVjdG9yPFBhc3MgKiwgOD4gSGlnaGVyTGV2ZWxBbmFseXNpczsKKworICB1bnNpZ25lZCBEZXB0aDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGUFBhc3NNYW5hZ2VyCisvLworLy8vIEZQUGFzc01hbmFnZXIgbWFuYWdlcyBCQlBhc3NNYW5hZ2VycyBhbmQgRnVuY3Rpb25QYXNzZXMuCisvLy8gSXQgYmF0Y2hlcyBhbGwgZnVuY3Rpb24gcGFzc2VzIGFuZCBiYXNpYyBibG9jayBwYXNzIG1hbmFnZXJzIHRvZ2V0aGVyIGFuZCAKKy8vLyBzZXF1ZW5jZSB0aGVtIHRvIHByb2Nlc3Mgb25lIGZ1bmN0aW9uIGF0IGEgdGltZSBiZWZvcmUgcHJvY2Vzc2luZyBuZXh0IAorLy8vIGZ1bmN0aW9uLgorY2xhc3MgRlBQYXNzTWFuYWdlciA6IHB1YmxpYyBNb2R1bGVQYXNzLCBwdWJsaWMgUE1EYXRhTWFuYWdlciB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBleHBsaWNpdCBGUFBhc3NNYW5hZ2VyKGludCBEZXB0aCkgCisgIDogTW9kdWxlUGFzcyhJRCksIFBNRGF0YU1hbmFnZXIoRGVwdGgpIHsgfQorICAKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisgIC8vLyB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBtb2R1bGUsIGFuZCBpZiBzbywgcmV0dXJuIHRydWUuCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7CisgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKyAgCisgIC8vLyBjbGVhbnVwIC0gQWZ0ZXIgcnVubmluZyBhbGwgcGFzc2VzLCBjbGVhbiB1cCBwYXNzIG1hbmFnZXIgY2FjaGUuCisgIHZvaWQgY2xlYW51cCgpOworCisgIC8vLyBkb0luaXRpYWxpemF0aW9uIC0gUnVuIGFsbCBvZiB0aGUgaW5pdGlhbGl6ZXJzIGZvciB0aGUgZnVuY3Rpb24gcGFzc2VzLgorICAvLy8KKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSk7CisgIAorICAvLy8gZG9GaW5hbGl6YXRpb24gLSBSdW4gYWxsIG9mIHRoZSBmaW5hbGl6ZXJzIGZvciB0aGUgZnVuY3Rpb24gcGFzc2VzLgorICAvLy8KKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pOworCisgIHZpcnR1YWwgUE1EYXRhTWFuYWdlciAqZ2V0QXNQTURhdGFNYW5hZ2VyKCkgeyByZXR1cm4gdGhpczsgfQorICB2aXJ0dWFsIFBhc3MgKmdldEFzUGFzcygpIHsgcmV0dXJuIHRoaXM7IH0KKworICAvLy8gUGFzcyBNYW5hZ2VyIGl0c2VsZiBkb2VzIG5vdCBpbnZhbGlkYXRlIGFueSBhbmFseXNpcyBpbmZvLgorICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmSW5mbykgY29uc3QgeworICAgIEluZm8uc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICAvLyBQcmludCBwYXNzZXMgbWFuYWdlZCBieSB0aGlzIG1hbmFnZXIKKyAgdm9pZCBkdW1wUGFzc1N0cnVjdHVyZSh1bnNpZ25lZCBPZmZzZXQpOworCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJGdW5jdGlvbiBQYXNzIE1hbmFnZXIiOworICB9CisKKyAgRnVuY3Rpb25QYXNzICpnZXRDb250YWluZWRQYXNzKHVuc2lnbmVkIE4pIHsKKyAgICBhc3NlcnQgKCBOIDwgUGFzc1ZlY3Rvci5zaXplKCkgJiYgIlBhc3MgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICBGdW5jdGlvblBhc3MgKkZQID0gc3RhdGljX2Nhc3Q8RnVuY3Rpb25QYXNzICo+KFBhc3NWZWN0b3JbTl0pOworICAgIHJldHVybiBGUDsKKyAgfQorCisgIHZpcnR1YWwgUGFzc01hbmFnZXJUeXBlIGdldFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IHsgCisgICAgcmV0dXJuIFBNVF9GdW5jdGlvblBhc3NNYW5hZ2VyOyAKKyAgfQorfTsKKworVGltZXIgKmdldFBhc3NUaW1lcihQYXNzICopOworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1Bhc3NSZWdpc3RyeS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1Bhc3NSZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDcxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vUGFzc1JlZ2lzdHJ5LmgKQEAgLTAsMCArMSw3MSBAQAorLy89PT0tIGxsdm0vUGFzc1JlZ2lzdHJ5LmggLSBQYXNzIEluZm9ybWF0aW9uIFJlZ2lzdHJ5IC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBQYXNzUmVnaXN0cnksIGEgY2xhc3MgdGhhdCBpcyB1c2VkIGluIHRoZSBpbml0aWFsaXphdGlvbgorLy8gYW5kIHJlZ2lzdHJhdGlvbiBvZiBwYXNzZXMuICBBdCBpbml0aWFsaXphdGlvbiwgcGFzc2VzIGFyZSByZWdpc3RlcmVkIHdpdGgKKy8vIHRoZSBQYXNzUmVnaXN0cnksIHdoaWNoIGlzIGxhdGVyIHByb3ZpZGVkIHRvIHRoZSBQYXNzTWFuYWdlciBmb3IgZGVwZW5kZW5jeQorLy8gcmVzb2x1dGlvbiBhbmQgc2ltaWxhciB0YXNrcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUEFTU1JFR0lTVFJZX0gKKyNkZWZpbmUgTExWTV9QQVNTUkVHSVNUUllfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTXV0ZXguaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBQYXNzSW5mbzsKK3N0cnVjdCBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXI7CisKK2NsYXNzIFBhc3NSZWdpc3RyeSB7CisgIC8vLyBHdWFyZHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgY2xhc3MuCisgIG11dGFibGUgc3lzOjpTbWFydE11dGV4PHRydWU+IExvY2s7CisgIAorICAvLy8gUGFzc0luZm9NYXAgLSBLZWVwIHRyYWNrIG9mIHRoZSBQYXNzSW5mbyBvYmplY3QgZm9yIGVhY2ggcmVnaXN0ZXJlZCBwYXNzLgorICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCBjb25zdCBQYXNzSW5mbyo+IE1hcFR5cGU7CisgIE1hcFR5cGUgUGFzc0luZm9NYXA7CisgIAorICB0eXBlZGVmIFN0cmluZ01hcDxjb25zdCBQYXNzSW5mbyo+IFN0cmluZ01hcFR5cGU7CisgIFN0cmluZ01hcFR5cGUgUGFzc0luZm9TdHJpbmdNYXA7CisgIAorICAvLy8gQW5hbHlzaXNHcm91cEluZm8gLSBLZWVwIHRyYWNrIG9mIGluZm9ybWF0aW9uIGZvciBlYWNoIGFuYWx5c2lzIGdyb3VwLgorICBzdHJ1Y3QgQW5hbHlzaXNHcm91cEluZm8geworICAgIHN0ZDo6c2V0PGNvbnN0IFBhc3NJbmZvICo+IEltcGxlbWVudGF0aW9uczsKKyAgfTsKKyAgc3RkOjptYXA8Y29uc3QgUGFzc0luZm8qLCBBbmFseXNpc0dyb3VwSW5mbz4gQW5hbHlzaXNHcm91cEluZm9NYXA7CisgIAorICBzdGQ6OnZlY3RvcjxQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIqPiBMaXN0ZW5lcnM7CisKK3B1YmxpYzoKKyAgc3RhdGljIFBhc3NSZWdpc3RyeSAqZ2V0UGFzc1JlZ2lzdHJ5KCk7CisgIAorICBjb25zdCBQYXNzSW5mbyAqZ2V0UGFzc0luZm8oY29uc3Qgdm9pZCAqVEkpIGNvbnN0OworICBjb25zdCBQYXNzSW5mbyAqZ2V0UGFzc0luZm8oU3RyaW5nUmVmIEFyZykgY29uc3Q7CisgIAorICB2b2lkIHJlZ2lzdGVyUGFzcyhjb25zdCBQYXNzSW5mbyAmUEkpOworICB2b2lkIHVucmVnaXN0ZXJQYXNzKGNvbnN0IFBhc3NJbmZvICZQSSk7CisgIAorICAvLy8gQW5hbHlzaXMgR3JvdXAgTWVjaGFuaXNtcy4KKyAgdm9pZCByZWdpc3RlckFuYWx5c2lzR3JvdXAoY29uc3Qgdm9pZCAqSW50ZXJmYWNlSUQsIGNvbnN0IHZvaWQgKlBhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc0luZm8mIFJlZ2lzdGVyZWUsIGJvb2wgaXNEZWZhdWx0KTsKKyAgCisgIHZvaWQgZW51bWVyYXRlV2l0aChQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgKkwpOworICB2b2lkIGFkZFJlZ2lzdHJhdGlvbkxpc3RlbmVyKFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciogTCk7CisgIHZvaWQgcmVtb3ZlUmVnaXN0cmF0aW9uTGlzdGVuZXIoUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyICpMKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vUGFzc1N1cHBvcnQuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9QYXNzU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNTU5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vUGFzc1N1cHBvcnQuaApAQCAtMCwwICsxLDI1MSBAQAorLy89PT0tIGxsdm0vUGFzc1N1cHBvcnQuaCAtIFBhc3MgU3VwcG9ydCBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzdHVmZiB0aGF0IGlzIHVzZWQgdG8gZGVmaW5lIGFuZCAidXNlIiBQYXNzZXMuICBUaGlzIGZpbGUKKy8vIGlzIGF1dG9tYXRpY2FsbHkgI2luY2x1ZGVkIGJ5IFBhc3MuaCwgc286CisvLworLy8gICAgICAgICAgIE5PIC5DUFAgRklMRVMgU0hPVUxEIElOQ0xVREUgVEhJUyBGSUxFIERJUkVDVExZCisvLworLy8gSW5zdGVhZCwgI2luY2x1ZGUgUGFzcy5oLgorLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIFBhc3MgcmVnaXN0cmF0aW9uIGNvZGUgYW5kIGNsYXNzZXMgdXNlZCBmb3IgaXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BBU1NfU1VQUE9SVF9ICisjZGVmaW5lIExMVk1fUEFTU19TVVBQT1JUX0gKKworI2luY2x1ZGUgIlBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NSZWdpc3RyeS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gUGFzc0luZm8gY2xhc3MgLSBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGV4aXN0cyBmb3IgZXZlcnkgcGFzcyBrbm93biBieQorLy8vIHRoZSBzeXN0ZW0sIGFuZCBjYW4gYmUgb2J0YWluZWQgZnJvbSBhIGxpdmUgUGFzcyBieSBjYWxsaW5nIGl0cworLy8vIGdldFBhc3NJbmZvKCkgbWV0aG9kLiAgVGhlc2Ugb2JqZWN0cyBhcmUgc2V0IHVwIGJ5IHRoZSBSZWdpc3RlclBhc3M8PgorLy8vIHRlbXBsYXRlLCBkZWZpbmVkIGJlbG93LgorLy8vCitjbGFzcyBQYXNzSW5mbyB7CitwdWJsaWM6CisgIHR5cGVkZWYgUGFzcyogKCpOb3JtYWxDdG9yX3QpKCk7CisKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIgICAgICAqY29uc3QgUGFzc05hbWU7ICAgICAvLyBOaWNlIG5hbWUgZm9yIFBhc3MKKyAgY29uc3QgY2hhciAgICAgICpjb25zdCBQYXNzQXJndW1lbnQ7IC8vIENvbW1hbmQgTGluZSBhcmd1bWVudCB0byBydW4gdGhpcyBwYXNzCisgIGNvbnN0IHZvaWQgKlBhc3NJRDsgICAgICAKKyAgY29uc3QgYm9vbCBJc0NGR09ubHlQYXNzOyAgICAgICAgICAgIC8vIFBhc3Mgb25seSBsb29rcyBhdCB0aGUgQ0ZHLgorICBjb25zdCBib29sIElzQW5hbHlzaXM7ICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhbmFseXNpcyBwYXNzLgorICBjb25zdCBib29sIElzQW5hbHlzaXNHcm91cDsgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhbmFseXNpcyBncm91cC4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgUGFzc0luZm8qPiBJdGZJbXBsOy8vIEludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhpcyBwYXNzCisKKyAgTm9ybWFsQ3Rvcl90IE5vcm1hbEN0b3I7CisKK3B1YmxpYzoKKyAgLy8vIFBhc3NJbmZvIGN0b3IgLSBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LCB0aGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQKKyAgLy8vIHRocm91Z2ggUmVnaXN0ZXJQYXNzLgorICBQYXNzSW5mbyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphcmcsIGNvbnN0IHZvaWQgKnBpLAorICAgICAgICAgICBOb3JtYWxDdG9yX3Qgbm9ybWFsLCBib29sIGlzQ0ZHT25seSwgYm9vbCBpc19hbmFseXNpcykKKyAgICA6IFBhc3NOYW1lKG5hbWUpLCBQYXNzQXJndW1lbnQoYXJnKSwgUGFzc0lEKHBpKSwgCisgICAgICBJc0NGR09ubHlQYXNzKGlzQ0ZHT25seSksIAorICAgICAgSXNBbmFseXNpcyhpc19hbmFseXNpcyksIElzQW5hbHlzaXNHcm91cChmYWxzZSksIE5vcm1hbEN0b3Iobm9ybWFsKSB7CisgICAgUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKS0+cmVnaXN0ZXJQYXNzKCp0aGlzKTsKKyAgfQorICAvLy8gUGFzc0luZm8gY3RvciAtIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHksIHRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZAorICAvLy8gdGhyb3VnaCBSZWdpc3RlclBhc3MuIFRoaXMgdmVyc2lvbiBpcyBmb3IgdXNlIGJ5IGFuYWx5c2lzIGdyb3VwczsgaXQKKyAgLy8vIGRvZXMgbm90IGF1dG8tcmVnaXN0ZXIgdGhlIHBhc3MuCisgIFBhc3NJbmZvKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnBpKQorICAgIDogUGFzc05hbWUobmFtZSksIFBhc3NBcmd1bWVudCgiIiksIFBhc3NJRChwaSksIAorICAgICAgSXNDRkdPbmx5UGFzcyhmYWxzZSksIAorICAgICAgSXNBbmFseXNpcyhmYWxzZSksIElzQW5hbHlzaXNHcm91cCh0cnVlKSwgTm9ybWFsQ3RvcigwKSB7CisgIH0KKworICAvLy8gZ2V0UGFzc05hbWUgLSBSZXR1cm4gdGhlIGZyaWVuZGx5IG5hbWUgZm9yIHRoZSBwYXNzLCBuZXZlciByZXR1cm5zIG51bGwKKyAgLy8vCisgIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gUGFzc05hbWU7IH0KKworICAvLy8gZ2V0UGFzc0FyZ3VtZW50IC0gUmV0dXJuIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIHRoYXQgbWF5IGJlIHBhc3NlZCB0bworICAvLy8gJ29wdCcgdGhhdCB3aWxsIGNhdXNlIHRoaXMgcGFzcyB0byBiZSBydW4uICBUaGlzIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlcmUKKyAgLy8vIGlzIG5vIGFyZ3VtZW50LgorICAvLy8KKyAgY29uc3QgY2hhciAqZ2V0UGFzc0FyZ3VtZW50KCkgY29uc3QgeyByZXR1cm4gUGFzc0FyZ3VtZW50OyB9CisKKyAgLy8vIGdldFR5cGVJbmZvIC0gUmV0dXJuIHRoZSBpZCBvYmplY3QgZm9yIHRoZSBwYXNzLi4uCisgIC8vLyBUT0RPIDogUmVuYW1lCisgIGNvbnN0IHZvaWQgKmdldFR5cGVJbmZvKCkgY29uc3QgeyByZXR1cm4gUGFzc0lEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgUGFzc0lEIGltcGxlbWVudHMgdGhlIHNwZWNpZmllZCBJRCBwb2ludGVyLgorICBib29sIGlzUGFzc0lEKGNvbnN0IHZvaWQgKklEUHRyKSBjb25zdCB7CisgICAgcmV0dXJuIFBhc3NJRCA9PSBJRFB0cjsKKyAgfQorICAKKyAgLy8vIGlzQW5hbHlzaXNHcm91cCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gYW5hbHlzaXMgZ3JvdXAsIG5vdCBhIG5vcm1hbAorICAvLy8gcGFzcy4KKyAgLy8vCisgIGJvb2wgaXNBbmFseXNpc0dyb3VwKCkgY29uc3QgeyByZXR1cm4gSXNBbmFseXNpc0dyb3VwOyB9CisgIGJvb2wgaXNBbmFseXNpcygpIGNvbnN0IHsgcmV0dXJuIElzQW5hbHlzaXM7IH0KKworICAvLy8gaXNDRkdPbmx5UGFzcyAtIHJldHVybiB0cnVlIGlmIHRoaXMgcGFzcyBvbmx5IGxvb2tzIGF0IHRoZSBDRkcgZm9yIHRoZQorICAvLy8gZnVuY3Rpb24uCisgIGJvb2wgaXNDRkdPbmx5UGFzcygpIGNvbnN0IHsgcmV0dXJuIElzQ0ZHT25seVBhc3M7IH0KKyAgCisgIC8vLyBnZXROb3JtYWxDdG9yIC0gUmV0dXJuIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uLCB0aGF0IHdoZW4gY2FsbGVkLCBjcmVhdGVzCisgIC8vLyBhbiBpbnN0YW5jZSBvZiB0aGUgcGFzcyBhbmQgcmV0dXJucyBpdC4gIFRoaXMgcG9pbnRlciBtYXkgYmUgbnVsbCBpZiB0aGVyZQorICAvLy8gaXMgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlIHBhc3MuCisgIC8vLworICBOb3JtYWxDdG9yX3QgZ2V0Tm9ybWFsQ3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9ybWFsQ3RvcjsKKyAgfQorICB2b2lkIHNldE5vcm1hbEN0b3IoTm9ybWFsQ3Rvcl90IEN0b3IpIHsKKyAgICBOb3JtYWxDdG9yID0gQ3RvcjsKKyAgfQorCisgIC8vLyBjcmVhdGVQYXNzKCkgLSBVc2UgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgcGFzcy4KKyAgUGFzcyAqY3JlYXRlUGFzcygpIGNvbnN0OworCisgIC8vLyBhZGRJbnRlcmZhY2VJbXBsZW1lbnRlZCAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoaXMgcGFzcyBpcworICAvLy8gcmVnaXN0ZXJlZCBhcyBhIG1lbWJlciBvZiBhbiBhbmFseXNpcyBncm91cCB3aXRoIHRoZSBSZWdpc3RlckFuYWx5c2lzR3JvdXAKKyAgLy8vIHRlbXBsYXRlLgorICAvLy8KKyAgdm9pZCBhZGRJbnRlcmZhY2VJbXBsZW1lbnRlZChjb25zdCBQYXNzSW5mbyAqSXRmUEkpIHsKKyAgICBJdGZJbXBsLnB1c2hfYmFjayhJdGZQSSk7CisgIH0KKworICAvLy8gZ2V0SW50ZXJmYWNlc0ltcGxlbWVudGVkIC0gUmV0dXJuIGEgbGlzdCBvZiBhbGwgb2YgdGhlIGFuYWx5c2lzIGdyb3VwCisgIC8vLyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoaXMgcGFzcy4KKyAgLy8vCisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IFBhc3NJbmZvKj4gJmdldEludGVyZmFjZXNJbXBsZW1lbnRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSXRmSW1wbDsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBQYXNzSW5mbyAmKTsgLy8gZG8gbm90IGltcGxlbWVudAorICBQYXNzSW5mbyhjb25zdCBQYXNzSW5mbyAmKTsgICAgICAgLy8gZG8gbm90IGltcGxlbWVudAorfTsKKworI2RlZmluZSBJTklUSUFMSVpFX1BBU1MocGFzc05hbWUsIGFyZywgbmFtZSwgY2ZnLCBhbmFseXNpcykgXAorICBzdGF0aWMgUmVnaXN0ZXJQYXNzPHBhc3NOYW1lPiBwYXNzTmFtZSAjIyBfaW5mbyhhcmcsIG5hbWUsIGNmZywgYW5hbHlzaXMpCisKK3RlbXBsYXRlPHR5cGVuYW1lIFBhc3NOYW1lPgorUGFzcyAqY2FsbERlZmF1bHRDdG9yKCkgeyByZXR1cm4gbmV3IFBhc3NOYW1lKCk7IH0KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBSZWdpc3RlclBhc3M8dD4gdGVtcGxhdGUgLSBUaGlzIHRlbXBsYXRlIGNsYXNzIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBzeXN0ZW0KKy8vLyB0aGF0IGEgUGFzcyBpcyBhdmFpbGFibGUgZm9yIHVzZSwgYW5kIHJlZ2lzdGVycyBpdCBpbnRvIHRoZSBpbnRlcm5hbAorLy8vIGRhdGFiYXNlIG1haW50YWluZWQgYnkgdGhlIFBhc3NNYW5hZ2VyLiAgVW5sZXNzIHRoaXMgdGVtcGxhdGUgaXMgdXNlZCwgb3B0LAorLy8vIGZvciBleGFtcGxlIHdpbGwgbm90IGJlIGFibGUgdG8gc2VlIHRoZSBwYXNzIGFuZCBhdHRlbXB0cyB0byBjcmVhdGUgdGhlIHBhc3MKKy8vLyB3aWxsIGZhaWwuIFRoaXMgdGVtcGxhdGUgaXMgdXNlZCBpbiB0aGUgZm9sbG93IG1hbm5lciAoYXQgZ2xvYmFsIHNjb3BlLCBpbgorLy8vIHlvdXIgLmNwcCBmaWxlKToKKy8vLworLy8vIHN0YXRpYyBSZWdpc3RlclBhc3M8WW91clBhc3NDbGFzc05hbWU+IHRtcCgicGFzc29wdCIsICJNeSBQYXNzIE5hbWUiKTsKKy8vLworLy8vIFRoaXMgc3RhdGVtZW50IHdpbGwgY2F1c2UgeW91ciBwYXNzIHRvIGJlIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgZGVmYXVsdAorLy8vIGNvbnN0cnVjdG9yIGV4cG9zZWQgYnkgdGhlIHBhc3MuICBJZiB5b3UgaGF2ZSBhIGRpZmZlcmVudCBjb25zdHJ1Y3RvciB0aGF0CisvLy8gbXVzdCBiZSBjYWxsZWQsIGNyZWF0ZSBhIGdsb2JhbCBjb25zdHJ1Y3RvciBmdW5jdGlvbiAod2hpY2ggdGFrZXMgdGhlCisvLy8gYXJndW1lbnRzIHlvdSBuZWVkIGFuZCByZXR1cm5zIGEgUGFzcyopIGFuZCByZWdpc3RlciB5b3VyIHBhc3MgbGlrZSB0aGlzOgorLy8vCisvLy8gc3RhdGljIFJlZ2lzdGVyUGFzczxQYXNzQ2xhc3NOYW1lPiB0bXAoInBhc3NvcHQiLCAiTXkgTmFtZSIpOworLy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBwYXNzTmFtZT4KK3N0cnVjdCBSZWdpc3RlclBhc3MgOiBwdWJsaWMgUGFzc0luZm8geworCisgIC8vIFJlZ2lzdGVyIFBhc3MgdXNpbmcgZGVmYXVsdCBjb25zdHJ1Y3Rvci4uLgorICBSZWdpc3RlclBhc3MoY29uc3QgY2hhciAqUGFzc0FyZywgY29uc3QgY2hhciAqTmFtZSwgYm9vbCBDRkdPbmx5ID0gZmFsc2UsCisgICAgICAgICAgICAgICBib29sIGlzX2FuYWx5c2lzID0gZmFsc2UpCisgICAgOiBQYXNzSW5mbyhOYW1lLCBQYXNzQXJnLCAmcGFzc05hbWU6OklELAorICAgICAgICAgICAgICAgUGFzc0luZm86Ok5vcm1hbEN0b3JfdChjYWxsRGVmYXVsdEN0b3I8cGFzc05hbWU+KSwKKyAgICAgICAgICAgICAgIENGR09ubHksIGlzX2FuYWx5c2lzKSB7CisgICAgCisgIH0KK307CisKKworLy8vIFJlZ2lzdGVyQW5hbHlzaXNHcm91cCAtIFJlZ2lzdGVyIGEgUGFzcyBhcyBhIG1lbWJlciBvZiBhbiBhbmFseXNpcyBfZ3JvdXBfLgorLy8vIEFuYWx5c2lzIGdyb3VwcyBhcmUgdXNlZCB0byBkZWZpbmUgYW4gaW50ZXJmYWNlICh3aGljaCBuZWVkIG5vdCBkZXJpdmUgZnJvbQorLy8vIFBhc3MpIHRoYXQgaXMgcmVxdWlyZWQgYnkgcGFzc2VzIHRvIGRvIHRoZWlyIGpvYi4gIEFuYWx5c2lzIEdyb3VwcyBkaWZmZXIKKy8vLyBmcm9tIG5vcm1hbCBhbmFseXNlcyBiZWNhdXNlIGFueSBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGdyb3VwIHdpbGwKKy8vLyBiZSB1c2VkIGlmIGl0IGlzIGF2YWlsYWJsZS4KKy8vLworLy8vIElmIG5vIGFuYWx5c2lzIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGlzIGF2YWlsYWJsZSwgYSBkZWZhdWx0CisvLy8gaW1wbGVtZW50YXRpb24gaXMgY3JlYXRlZCBhbmQgYWRkZWQuICBBIHBhc3MgcmVnaXN0ZXJzIGl0c2VsZiBhcyB0aGUgZGVmYXVsdAorLy8vIGltcGxlbWVudGF0aW9uIGJ5IHNwZWNpZnlpbmcgJ3RydWUnIGFzIHRoZSBzZWNvbmQgdGVtcGxhdGUgYXJndW1lbnQgb2YgdGhpcworLy8vIGNsYXNzLgorLy8vCisvLy8gSW4gYWRkaXRpb24gdG8gcmVnaXN0ZXJpbmcgaXRzZWxmIGFzIGFuIGFuYWx5c2lzIGdyb3VwIG1lbWJlciwgYSBwYXNzIG11c3QKKy8vLyByZWdpc3RlciBpdHNlbGYgbm9ybWFsbHkgYXMgd2VsbC4gIFBhc3NlcyBtYXkgYmUgbWVtYmVycyBvZiBtdWx0aXBsZSBncm91cHMKKy8vLyBhbmQgbWF5IHN0aWxsIGJlICJyZXF1aXJlZCIgc3BlY2lmaWNhbGx5IGJ5IG5hbWUuCisvLy8KKy8vLyBUaGUgYWN0dWFsIGludGVyZmFjZSBtYXkgYWxzbyBiZSByZWdpc3RlcmVkIGFzIHdlbGwgKGJ5IG5vdCBzcGVjaWZ5aW5nIHRoZQorLy8vIHNlY29uZCB0ZW1wbGF0ZSBhcmd1bWVudCkuICBUaGUgaW50ZXJmYWNlIHNob3VsZCBiZSByZWdpc3RlcmVkIHRvIGFzc29jaWF0ZQorLy8vIGEgbmljZSBuYW1lIHdpdGggdGhlIGludGVyZmFjZS4KKy8vLworY2xhc3MgUmVnaXN0ZXJBR0Jhc2UgOiBwdWJsaWMgUGFzc0luZm8geworcHJvdGVjdGVkOgorICBSZWdpc3RlckFHQmFzZShjb25zdCBjaGFyICpOYW1lLAorICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpJbnRlcmZhY2VJRCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqUGFzc0lEID0gMCwKKyAgICAgICAgICAgICAgICAgYm9vbCBpc0RlZmF1bHQgPSBmYWxzZSk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnRlcmZhY2UsIGJvb2wgRGVmYXVsdCA9IGZhbHNlPgorc3RydWN0IFJlZ2lzdGVyQW5hbHlzaXNHcm91cCA6IHB1YmxpYyBSZWdpc3RlckFHQmFzZSB7CisgIGV4cGxpY2l0IFJlZ2lzdGVyQW5hbHlzaXNHcm91cChQYXNzSW5mbyAmUlBCKQorICAgIDogUmVnaXN0ZXJBR0Jhc2UoUlBCLmdldFBhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAmSW50ZXJmYWNlOjpJRCwgUlBCLmdldFR5cGVJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0KSB7CisgIH0KKworICBleHBsaWNpdCBSZWdpc3RlckFuYWx5c2lzR3JvdXAoY29uc3QgY2hhciAqTmFtZSkKKyAgICA6IFJlZ2lzdGVyQUdCYXNlKE5hbWUsICZJbnRlcmZhY2U6OklEKSB7CisgIH0KK307CisKKyNkZWZpbmUgSU5JVElBTElaRV9BR19QQVNTKHBhc3NOYW1lLCBhZ05hbWUsIGFyZywgbmFtZSwgY2ZnLCBhbmFseXNpcywgZGVmKSBcCisgIHN0YXRpYyBSZWdpc3RlclBhc3M8cGFzc05hbWU+IHBhc3NOYW1lICMjIF9pbmZvKGFyZywgbmFtZSwgY2ZnLCBhbmFseXNpcyk7IFwKKyAgc3RhdGljIFJlZ2lzdGVyQW5hbHlzaXNHcm91cDxhZ05hbWUsIGRlZj4gcGFzc05hbWUgIyMgX2FnKHBhc3NOYW1lICMjIF9pbmZvKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciBjbGFzcyAtIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgZGVyaXZlZCBmcm9tIGJ5CisvLy8gY2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHdoaWNoIHBhc3NlcyBnZXQgcmVnaXN0ZXJlZCBhbmQgdW5yZWdpc3RlcmVkCisvLy8gYXQgcnVudGltZSAod2hpY2ggY2FuIGJlIGJlY2F1c2Ugb2YgdGhlIFJlZ2lzdGVyUGFzcyBjb25zdHJ1Y3RvcnMgYmVpbmcgcnVuCisvLy8gYXMgdGhlIHByb2dyYW0gc3RhcnRzIHVwLCBvciBtYXkgYmUgYmVjYXVzZSBhIHNoYXJlZCBvYmplY3QganVzdCBnb3QKKy8vLyBsb2FkZWQpLiAgRGVyaXZpbmcgZnJvbSB0aGUgUGFzc1JlZ2lzdGF0aW9uTGlzdGVuZXIgY2xhc3MgYXV0b21hdGljYWxseQorLy8vIHJlZ2lzdGVycyB5b3VyIG9iamVjdCB0byByZWNlaXZlIGNhbGxiYWNrcyBpbmRpY2F0aW5nIHdoZW4gcGFzc2VzIGFyZSBsb2FkZWQKKy8vLyBhbmQgcmVtb3ZlZC4KKy8vLworc3RydWN0IFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciB7CisKKyAgLy8vIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciBjdG9yIC0gQWRkIHRoZSBjdXJyZW50IG9iamVjdCB0byB0aGUgbGlzdCBvZgorICAvLy8gUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVycy4uLgorICBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIoKTsKKworICAvLy8gZHRvciAtIFJlbW92ZSBvYmplY3QgZnJvbSBsaXN0IG9mIGxpc3RlbmVycy4uLgorICAvLy8KKyAgdmlydHVhbCB+UGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyKCk7CisKKyAgLy8vIENhbGxiYWNrIGZ1bmN0aW9ucyAtIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCB3aGVuZXZlciBhIHBhc3MgaXMgbG9hZGVkCisgIC8vLyBvciByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgZXhlY3V0YWJsZS4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBwYXNzUmVnaXN0ZXJlZChjb25zdCBQYXNzSW5mbyAqKSB7fQorCisgIC8vLyBlbnVtZXJhdGVQYXNzZXMgLSBJdGVyYXRlIG92ZXIgdGhlIHJlZ2lzdGVyZWQgcGFzc2VzLCBjYWxsaW5nIHRoZQorICAvLy8gcGFzc0VudW1lcmF0ZSBjYWxsYmFjayBvbiBlYWNoIFBhc3NJbmZvIG9iamVjdC4KKyAgLy8vCisgIHZvaWQgZW51bWVyYXRlUGFzc2VzKCk7CisKKyAgLy8vIHBhc3NFbnVtZXJhdGUgLSBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gc29tZW9uZSBjYWxscworICAvLy8gZW51bWVyYXRlUGFzc2VzIG9uIHRoaXMgUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyIG9iamVjdC4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBwYXNzRW51bWVyYXRlKGNvbnN0IFBhc3NJbmZvICopIHt9Cit9OworCisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQWxpZ25PZi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQWxpZ25PZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2ExYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BbGlnbk9mLmgKQEAgLTAsMCArMSw2MCBAQAorLy89PT0tLS0gQWxpZ25PZi5oIC0gUG9ydGFibGUgY2FsY3VsYXRpb24gb2YgdHlwZSBhbGlnbm1lbnQgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQWxpZ25PZiBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIGFsaWdubWVudHMgZm9yCisvLyBhcmJpdHJhcnkgdHlwZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQUxJR05PRl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BTElHTk9GX0gKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBbGlnbm1lbnRDYWxjSW1wbCB7CisgIGNoYXIgeDsKKyAgVCB0OworcHJpdmF0ZToKKyAgQWxpZ25tZW50Q2FsY0ltcGwoKSB7fSAvLyBOZXZlciBpbnN0YW50aWF0ZS4KK307CisKKy8vLyBBbGlnbk9mIC0gQSB0ZW1wbGF0ZWQgY2xhc3MgdGhhdCBjb250YWlucyBhbiBlbnVtIHZhbHVlIHJlcHJlc2VudGluZworLy8vICB0aGUgYWxpZ25tZW50IG9mIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudC4gIEZvciBleGFtcGxlLAorLy8vICBBbGlnbk9mPGludD46OkFsaWdubWVudCByZXByZXNlbnRzIHRoZSBhbGlnbm1lbnQgb2YgdHlwZSAiaW50Ii4gIFRoZQorLy8vICBhbGlnbm1lbnQgY2FsY3VsYXRlZCBpcyB0aGUgbWluaW11bSBhbGlnbm1lbnQsIGFuZCBub3QgbmVjZXNzYXJpbHkKKy8vLyAgdGhlICJkZXNpcmVkIiBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgR0NDJ3MgX19hbGlnbm9mX18gKGZvciBleGFtcGxlKS4gIE5vdGUKKy8vLyAgdGhhdCBiZWNhdXNlIHRoZSBhbGlnbm1lbnQgaXMgYW4gZW51bSB2YWx1ZSwgaXQgY2FuIGJlIHVzZWQgYXMgYQorLy8vICBjb21waWxlLXRpbWUgY29uc3RhbnQgKGUuZy4sIGZvciB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFsaWduT2YgeworICBlbnVtIHsgQWxpZ25tZW50ID0KKyAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc2l6ZW9mKEFsaWdubWVudENhbGNJbXBsPFQ+KSAtIHNpemVvZihUKSkgfTsKKworICBlbnVtIHsgQWxpZ25tZW50X0dyZWF0ZXJFcXVhbF8yQnl0ZXMgPSBBbGlnbm1lbnQgPj0gMiA/IDEgOiAwIH07CisgIGVudW0geyBBbGlnbm1lbnRfR3JlYXRlckVxdWFsXzRCeXRlcyA9IEFsaWdubWVudCA+PSA0ID8gMSA6IDAgfTsKKyAgZW51bSB7IEFsaWdubWVudF9HcmVhdGVyRXF1YWxfOEJ5dGVzID0gQWxpZ25tZW50ID49IDggPyAxIDogMCB9OworICBlbnVtIHsgQWxpZ25tZW50X0dyZWF0ZXJFcXVhbF8xNkJ5dGVzID0gQWxpZ25tZW50ID49IDE2ID8gMSA6IDAgfTsKKworICBlbnVtIHsgQWxpZ25tZW50X0xlc3NFcXVhbF8yQnl0ZXMgPSBBbGlnbm1lbnQgPD0gMiA/IDEgOiAwIH07CisgIGVudW0geyBBbGlnbm1lbnRfTGVzc0VxdWFsXzRCeXRlcyA9IEFsaWdubWVudCA8PSA0ID8gMSA6IDAgfTsKKyAgZW51bSB7IEFsaWdubWVudF9MZXNzRXF1YWxfOEJ5dGVzID0gQWxpZ25tZW50IDw9IDggPyAxIDogMCB9OworICBlbnVtIHsgQWxpZ25tZW50X0xlc3NFcXVhbF8xNkJ5dGVzID0gQWxpZ25tZW50IDw9IDE2ID8gMSA6IDAgfTsKKworfTsKKworLy8vIGFsaWdub2YgLSBBIHRlbXBsYXRlZCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbmludW0gYWxpZ25tZW50IG9mCisvLy8gIG9mIGEgdHlwZS4gIFRoaXMgcHJvdmlkZXMgbm8gZXh0cmEgZnVuY3Rpb25hbGl0eSBiZXlvbmQgdGhlIEFsaWduT2YKKy8vLyAgY2xhc3MgYmVzaWRlcyBzb21lIGNvc21ldGljIGNsZWFubGluZXNzLiAgRXhhbXBsZSB1c2FnZToKKy8vLyAgYWxpZ25vZjxpbnQ+KCkgcmV0dXJucyB0aGUgYWxpZ25tZW50IG9mIGFuIGludC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBhbGlnbm9mKCkgeyByZXR1cm4gQWxpZ25PZjxUPjo6QWxpZ25tZW50OyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3MjUxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMjQxIEBACisvLz09PS0tLSBBbGxvY2F0b3IuaCAtIFNpbXBsZSBtZW1vcnkgYWxsb2NhdGlvbiBhYnN0cmFjdGlvbiAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWxsb2NBbGxvY2F0b3IgYW5kIEJ1bXBQdHJBbGxvY2F0b3IgaW50ZXJmYWNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9BTExPQ0FUT1JfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGlnbk9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFsbG9jQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgTWFsbG9jQWxsb2NhdG9yKCkge30KKyAgfk1hbGxvY0FsbG9jYXRvcigpIHt9CisKKyAgdm9pZCBSZXNldCgpIHt9CisKKyAgdm9pZCAqQWxsb2NhdGUoc2l6ZV90IFNpemUsIHNpemVfdCAvKkFsaWdubWVudCovKSB7IHJldHVybiBtYWxsb2MoU2l6ZSk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgVCAqQWxsb2NhdGUoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxUKj4obWFsbG9jKHNpemVvZihUKSkpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQgKkFsbG9jYXRlKHNpemVfdCBOdW0pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KG1hbGxvYyhzaXplb2YoVCkqTnVtKSk7CisgIH0KKworICB2b2lkIERlYWxsb2NhdGUoY29uc3Qgdm9pZCAqUHRyKSB7IGZyZWUoY29uc3RfY2FzdDx2b2lkKj4oUHRyKSk7IH0KKworICB2b2lkIFByaW50U3RhdHMoKSBjb25zdCB7fQorfTsKKworLy8vIE1lbVNsYWIgLSBUaGlzIHN0cnVjdHVyZSBsaXZlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IHNsYWIgYWxsb2NhdGVkIGJ5CisvLy8gdGhlIGJ1bXAgYWxsb2NhdG9yLgorY2xhc3MgTWVtU2xhYiB7CitwdWJsaWM6CisgIHNpemVfdCBTaXplOworICBNZW1TbGFiICpOZXh0UHRyOworfTsKKworLy8vIFNsYWJBbGxvY2F0b3IgLSBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHBhcmFtZXRlcml6ZSB0aGUgdW5kZXJseWluZworLy8vIGFsbG9jYXRpb24gc3RyYXRlZ3kgZm9yIHRoZSBidW1wIGFsbG9jYXRvci4gIEluIHBhcnRpY3VsYXIsIHRoaXMgaXMgdXNlZAorLy8vIGJ5IHRoZSBKSVQgdG8gYWxsb2NhdGUgY29udGlndW91cyBzd2F0aGVzIG9mIGV4ZWN1dGFibGUgbWVtb3J5LiAgVGhlCisvLy8gaW50ZXJmYWNlIHVzZXMgTWVtU2xhYidzIGluc3RlYWQgb2Ygdm9pZCAqJ3Mgc28gdGhhdCB0aGUgYWxsb2NhdG9yCisvLy8gZG9lc24ndCBoYXZlIHRvIHJlbWVtYmVyIHRoZSBzaXplIG9mIHRoZSBwb2ludGVyIGl0IGFsbG9jYXRlZC4KK2NsYXNzIFNsYWJBbGxvY2F0b3IgeworcHVibGljOgorICB2aXJ0dWFsIH5TbGFiQWxsb2NhdG9yKCk7CisgIHZpcnR1YWwgTWVtU2xhYiAqQWxsb2NhdGUoc2l6ZV90IFNpemUpID0gMDsKKyAgdmlydHVhbCB2b2lkIERlYWxsb2NhdGUoTWVtU2xhYiAqU2xhYikgPSAwOworfTsKKworLy8vIE1hbGxvY1NsYWJBbGxvY2F0b3IgLSBUaGUgZGVmYXVsdCBzbGFiIGFsbG9jYXRvciBmb3IgdGhlIGJ1bXAgYWxsb2NhdG9yCisvLy8gaXMgYW4gYWRhcHRlciBjbGFzcyBmb3IgTWFsbG9jQWxsb2NhdG9yIHRoYXQganVzdCBmb3J3YXJkcyB0aGUgbWV0aG9kCisvLy8gY2FsbHMgYW5kIHRyYW5zbGF0ZXMgdGhlIGFyZ3VtZW50cy4KK2NsYXNzIE1hbGxvY1NsYWJBbGxvY2F0b3IgOiBwdWJsaWMgU2xhYkFsbG9jYXRvciB7CisgIC8vLyBBbGxvY2F0b3IgLSBUaGUgdW5kZXJseWluZyBhbGxvY2F0b3IgdGhhdCB3ZSBmb3J3YXJkIHRvLgorICAvLy8KKyAgTWFsbG9jQWxsb2NhdG9yIEFsbG9jYXRvcjsKKworcHVibGljOgorICBNYWxsb2NTbGFiQWxsb2NhdG9yKCkgOiBBbGxvY2F0b3IoKSB7IH0KKyAgdmlydHVhbCB+TWFsbG9jU2xhYkFsbG9jYXRvcigpOworICB2aXJ0dWFsIE1lbVNsYWIgKkFsbG9jYXRlKHNpemVfdCBTaXplKTsKKyAgdmlydHVhbCB2b2lkIERlYWxsb2NhdGUoTWVtU2xhYiAqU2xhYik7Cit9OworCisvLy8gQnVtcFB0ckFsbG9jYXRvciAtIFRoaXMgYWxsb2NhdG9yIGlzIHVzZWZ1bCBmb3IgY29udGFpbmVycyB0aGF0IG5lZWQKKy8vLyB2ZXJ5IHNpbXBsZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVnaWVzLiAgSW4gcGFydGljdWxhciwgdGhpcyBqdXN0IGtlZXBzCisvLy8gYWxsb2NhdGluZyBtZW1vcnksIGFuZCBuZXZlciBkZWxldGVzIGl0IHVudGlsIHRoZSBlbnRpcmUgYmxvY2sgaXMgZGVhZC4gVGhpcworLy8vIG1ha2VzIGFsbG9jYXRpb24gc3BlZWR5LCBidXQgbXVzdCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgdHJhZGUtb2ZmIGlzIG9rLgorY2xhc3MgQnVtcFB0ckFsbG9jYXRvciB7CisgIEJ1bXBQdHJBbGxvY2F0b3IoY29uc3QgQnVtcFB0ckFsbG9jYXRvciAmKTsgLy8gZG8gbm90IGltcGxlbWVudAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBCdW1wUHRyQWxsb2NhdG9yICYpOyAgIC8vIGRvIG5vdCBpbXBsZW1lbnQKKworICAvLy8gU2xhYlNpemUgLSBBbGxvY2F0ZSBkYXRhIGludG8gc2xhYnMgb2YgdGhpcyBzaXplIHVubGVzcyB3ZSBnZXQgYW4KKyAgLy8vIGFsbG9jYXRpb24gYWJvdmUgU2l6ZVRocmVzaG9sZC4KKyAgc2l6ZV90IFNsYWJTaXplOworCisgIC8vLyBTaXplVGhyZXNob2xkIC0gRm9yIGFueSBhbGxvY2F0aW9uIGxhcmdlciB0aGFuIHRoaXMgdGhyZXNob2xkLCB3ZSBzaG91bGQKKyAgLy8vIGFsbG9jYXRlIGEgc2VwYXJhdGUgc2xhYi4KKyAgc2l6ZV90IFNpemVUaHJlc2hvbGQ7CisKKyAgLy8vIEFsbG9jYXRvciAtIFRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvciB3ZSB1c2UgdG8gZ2V0IHNsYWJzIG9mIG1lbW9yeS4gIFRoaXMKKyAgLy8vIGRlZmF1bHRzIHRvIE1hbGxvY1NsYWJBbGxvY2F0b3IsIHdoaWNoIHdyYXBzIG1hbGxvYywgYnV0IGl0IGNvdWxkIGJlCisgIC8vLyBjaGFuZ2VkIHRvIHVzZSBhIGN1c3RvbSBhbGxvY2F0b3IuCisgIFNsYWJBbGxvY2F0b3IgJkFsbG9jYXRvcjsKKworICAvLy8gQ3VyU2xhYiAtIFRoZSBzbGFiIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBhbGxvY2F0aW5nIGludG8uCisgIC8vLworICBNZW1TbGFiICpDdXJTbGFiOworCisgIC8vLyBDdXJQdHIgLSBUaGUgY3VycmVudCBwb2ludGVyIGludG8gdGhlIGN1cnJlbnQgc2xhYi4gIFRoaXMgcG9pbnRzIHRvIHRoZQorICAvLy8gbmV4dCBmcmVlIGJ5dGUgaW4gdGhlIHNsYWIuCisgIGNoYXIgKkN1clB0cjsKKworICAvLy8gRW5kIC0gVGhlIGVuZCBvZiB0aGUgY3VycmVudCBzbGFiLgorICAvLy8KKyAgY2hhciAqRW5kOworCisgIC8vLyBCeXRlc0FsbG9jYXRlZCAtIFRoaXMgZmllbGQgdHJhY2tzIGhvdyBtYW55IGJ5dGVzIHdlJ3ZlIGFsbG9jYXRlZCwgc28KKyAgLy8vIHRoYXQgd2UgY2FuIGNvbXB1dGUgaG93IG11Y2ggc3BhY2Ugd2FzIHdhc3RlZC4KKyAgc2l6ZV90IEJ5dGVzQWxsb2NhdGVkOworCisgIC8vLyBBbGlnblB0ciAtIEFsaWduIFB0ciB0byBBbGlnbm1lbnQgYnl0ZXMsIHJvdW5kaW5nIHVwLiAgQWxpZ25tZW50IHNob3VsZAorICAvLy8gYmUgYSBwb3dlciBvZiB0d28uICBUaGlzIG1ldGhvZCByb3VuZHMgdXAsIHNvIEFsaWduUHRyKDcsIDQpID09IDggYW5kCisgIC8vLyBBbGlnblB0cig4LCA0KSA9PSA4LgorICBzdGF0aWMgY2hhciAqQWxpZ25QdHIoY2hhciAqUHRyLCBzaXplX3QgQWxpZ25tZW50KTsKKworICAvLy8gU3RhcnROZXdTbGFiIC0gQWxsb2NhdGUgYSBuZXcgc2xhYiBhbmQgbW92ZSB0aGUgYnVtcCBwb2ludGVycyBvdmVyIGludG8KKyAgLy8vIHRoZSBuZXcgc2xhYi4gIE1vZGlmaWVzIEN1clB0ciBhbmQgRW5kLgorICB2b2lkIFN0YXJ0TmV3U2xhYigpOworCisgIC8vLyBEZWFsbG9jYXRlU2xhYnMgLSBEZWFsbG9jYXRlIGFsbCBtZW1vcnkgc2xhYnMgYWZ0ZXIgYW5kIGluY2x1ZGluZyB0aGlzCisgIC8vLyBvbmUuCisgIHZvaWQgRGVhbGxvY2F0ZVNsYWJzKE1lbVNsYWIgKlNsYWIpOworCisgIHN0YXRpYyBNYWxsb2NTbGFiQWxsb2NhdG9yIERlZmF1bHRTbGFiQWxsb2NhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I7CitwdWJsaWM6CisgIEJ1bXBQdHJBbGxvY2F0b3Ioc2l6ZV90IHNpemUgPSA0MDk2LCBzaXplX3QgdGhyZXNob2xkID0gNDA5NiwKKyAgICAgICAgICAgICAgICAgICBTbGFiQWxsb2NhdG9yICZhbGxvY2F0b3IgPSBEZWZhdWx0U2xhYkFsbG9jYXRvcik7CisgIH5CdW1wUHRyQWxsb2NhdG9yKCk7CisKKyAgLy8vIFJlc2V0IC0gRGVhbGxvY2F0ZSBhbGwgYnV0IHRoZSBjdXJyZW50IHNsYWIgYW5kIHJlc2V0IHRoZSBjdXJyZW50IHBvaW50ZXIKKyAgLy8vIHRvIHRoZSBiZWdpbm5pbmcgb2YgaXQsIGZyZWVpbmcgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgc28gZmFyLgorICB2b2lkIFJlc2V0KCk7CisKKyAgLy8vIEFsbG9jYXRlIC0gQWxsb2NhdGUgc3BhY2UgYXQgdGhlIHNwZWNpZmllZCBhbGlnbm1lbnQuCisgIC8vLworICB2b2lkICpBbGxvY2F0ZShzaXplX3QgU2l6ZSwgc2l6ZV90IEFsaWdubWVudCk7CisKKyAgLy8vIEFsbG9jYXRlIHNwYWNlLCBidXQgZG8gbm90IGNvbnN0cnVjdCwgb25lIG9iamVjdC4KKyAgLy8vCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBUICpBbGxvY2F0ZSgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KEFsbG9jYXRlKHNpemVvZihUKSxBbGlnbk9mPFQ+OjpBbGlnbm1lbnQpKTsKKyAgfQorCisgIC8vLyBBbGxvY2F0ZSBzcGFjZSBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cy4gIFRoaXMgZG9lcyBub3QgY29uc3RydWN0IHRoZQorICAvLy8gb2JqZWN0cyB0aG91Z2guCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBUICpBbGxvY2F0ZShzaXplX3QgTnVtKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihBbGxvY2F0ZShOdW0gKiBzaXplb2YoVCksIEFsaWduT2Y8VD46OkFsaWdubWVudCkpOworICB9CisKKyAgLy8vIEFsbG9jYXRlIHNwYWNlIGZvciBhIHNwZWNpZmljIGNvdW50IG9mIGVsZW1lbnRzIGFuZCB3aXRoIGEgc3BlY2lmaWVkCisgIC8vLyBhbGlnbm1lbnQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBUICpBbGxvY2F0ZShzaXplX3QgTnVtLCBzaXplX3QgQWxpZ25tZW50KSB7CisgICAgLy8gUm91bmQgRWx0U2l6ZSB1cCB0byB0aGUgc3BlY2lmaWVkIGFsaWdubWVudC4KKyAgICBzaXplX3QgRWx0U2l6ZSA9IChzaXplb2YoVCkrQWxpZ25tZW50LTEpJigtQWxpZ25tZW50KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KEFsbG9jYXRlKE51bSAqIEVsdFNpemUsIEFsaWdubWVudCkpOworICB9CisKKyAgdm9pZCBEZWFsbG9jYXRlKGNvbnN0IHZvaWQgKiAvKlB0ciovKSB7fQorCisgIHVuc2lnbmVkIEdldE51bVNsYWJzKCkgY29uc3Q7CisKKyAgdm9pZCBQcmludFN0YXRzKCkgY29uc3Q7Cit9OworCisvLy8gU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yIC0gU2FtZSBhcyBCdW1wUHRyQWxsb2NhdG9yIGJ1dCBhbGxvd3Mgb25seQorLy8vIGVsZW1lbnRzIG9mIG9uZSB0eXBlIHRvIGJlIGFsbG9jYXRlZC4gVGhpcyBhbGxvd3MgY2FsbGluZyB0aGUgZGVzdHJ1Y3RvcgorLy8vIGluIERlc3Ryb3lBbGwoKSBhbmQgd2hlbiB0aGUgYWxsb2NhdG9yIGlzIGRlc3Ryb3llZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yIHsKKyAgQnVtcFB0ckFsbG9jYXRvciBBbGxvY2F0b3I7CitwdWJsaWM6CisgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcihzaXplX3Qgc2l6ZSA9IDQwOTYsIHNpemVfdCB0aHJlc2hvbGQgPSA0MDk2LAorICAgICAgICAgICAgICBTbGFiQWxsb2NhdG9yICZhbGxvY2F0b3IgPSBCdW1wUHRyQWxsb2NhdG9yOjpEZWZhdWx0U2xhYkFsbG9jYXRvcikKKyAgICA6IEFsbG9jYXRvcihzaXplLCB0aHJlc2hvbGQsIGFsbG9jYXRvcikge30KKworICB+U3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yKCkgeworICAgIERlc3Ryb3lBbGwoKTsKKyAgfQorCisgIC8vLyBDYWxsIHRoZSBkZXN0cnVjdG9yIG9mIGVhY2ggYWxsb2NhdGVkIG9iamVjdCBhbmQgZGVhbGxvY2F0ZSBhbGwgYnV0IHRoZQorICAvLy8gY3VycmVudCBzbGFiIGFuZCByZXNldCB0aGUgY3VycmVudCBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgaXQsIGZyZWVpbmcKKyAgLy8vIGFsbCBtZW1vcnkgYWxsb2NhdGVkIHNvIGZhci4KKyAgdm9pZCBEZXN0cm95QWxsKCkgeworICAgIE1lbVNsYWIgKlNsYWIgPSBBbGxvY2F0b3IuQ3VyU2xhYjsKKyAgICB3aGlsZSAoU2xhYikgeworICAgICAgY2hhciAqRW5kID0gU2xhYiA9PSBBbGxvY2F0b3IuQ3VyU2xhYiA/IEFsbG9jYXRvci5DdXJQdHIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopU2xhYiArIFNsYWItPlNpemU7CisgICAgICBmb3IgKGNoYXIgKlB0ciA9IChjaGFyKikoU2xhYisxKTsgUHRyIDwgRW5kOyBQdHIgKz0gc2l6ZW9mKFQpKSB7CisgICAgICAgIFB0ciA9IEFsbG9jYXRvci5BbGlnblB0cihQdHIsIGFsaWdub2Y8VD4oKSk7CisgICAgICAgIGlmIChQdHIgKyBzaXplb2YoVCkgPD0gRW5kKQorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KFB0ciktPn5UKCk7CisgICAgICB9CisgICAgICBTbGFiID0gU2xhYi0+TmV4dFB0cjsKKyAgICB9CisgICAgQWxsb2NhdG9yLlJlc2V0KCk7CisgIH0KKworICAvLy8gQWxsb2NhdGUgc3BhY2UgZm9yIGEgc3BlY2lmaWMgY291bnQgb2YgZWxlbWVudHMuCisgIFQgKkFsbG9jYXRlKHNpemVfdCBudW0gPSAxKSB7CisgICAgcmV0dXJuIEFsbG9jYXRvci5BbGxvY2F0ZTxUPihudW0pOworICB9Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworaW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgU2l6ZSwgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKSB7CisgIHN0cnVjdCBTIHsKKyAgICBjaGFyIGM7CisjaWZkZWYgX19HTlVDX18KKyAgICBjaGFyIHggX19hdHRyaWJ1dGVfXygoYWxpZ25lZCkpOworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICBkb3VibGUgRDsKKyAgICAgIGxvbmcgZG91YmxlIExEOworICAgICAgbG9uZyBsb25nIEw7CisgICAgICB2b2lkICpQOworICAgIH0geDsKKyNlbmRpZgorICB9OworICByZXR1cm4gQWxsb2NhdG9yLkFsbG9jYXRlKFNpemUsIHN0ZDo6bWluKChzaXplX3QpbGx2bTo6TmV4dFBvd2VyT2YyKFNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFMsIHgpKSk7Cit9CisKK2lubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICosIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJikge30KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9BTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ0ZHLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DRkcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmE3MWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ0ZHLmgKQEAgLTAsMCArMSwzMzQgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0NGRy5oIC0gUHJvY2VzcyBMTFZNIHN0cnVjdHVyZXMgYXMgZ3JhcGhzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRoYXQgYWxsb3cgRnVuY3Rpb24gYW5kCisvLyBCYXNpY0Jsb2NrIGdyYXBocyB0byBiZSB0cmVhdGVkIGFzIHByb3BlciBncmFwaHMgZm9yIGdlbmVyaWMgYWxnb3JpdGhtcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DRkdfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ0ZHX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCYXNpY0Jsb2NrIHByZWRfaXRlcmF0b3IgZGVmaW5pdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPGNsYXNzIFB0ciwgY2xhc3MgVVNFX2l0ZXJhdG9yPiAvLyBQcmVkZWNlc3NvciBJdGVyYXRvcgorY2xhc3MgUHJlZEl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0ciwgcHRyZGlmZl90PiB7CisgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBQdHIsIHB0cmRpZmZfdD4gc3VwZXI7CisgIHR5cGVkZWYgUHJlZEl0ZXJhdG9yPFB0ciwgVVNFX2l0ZXJhdG9yPiBTZWxmOworICBVU0VfaXRlcmF0b3IgSXQ7CisKKyAgaW5saW5lIHZvaWQgYWR2YW5jZVBhc3ROb25UZXJtaW5hdG9ycygpIHsKKyAgICAvLyBMb29wIHRvIGlnbm9yZSBub24gdGVybWluYXRvciB1c2VzIChmb3IgZXhhbXBsZSBQSEkgbm9kZXMpLgorICAgIHdoaWxlICghSXQuYXRFbmQoKSAmJiAhaXNhPFRlcm1pbmF0b3JJbnN0PigqSXQpKQorICAgICAgKytJdDsKKyAgfQorCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXI6OnBvaW50ZXIgcG9pbnRlcjsKKworICBleHBsaWNpdCBpbmxpbmUgUHJlZEl0ZXJhdG9yKFB0ciAqYmIpIDogSXQoYmItPnVzZV9iZWdpbigpKSB7CisgICAgYWR2YW5jZVBhc3ROb25UZXJtaW5hdG9ycygpOworICB9CisgIGlubGluZSBQcmVkSXRlcmF0b3IoUHRyICpiYiwgYm9vbCkgOiBJdChiYi0+dXNlX2VuZCgpKSB7fQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU2VsZiYgeCkgY29uc3QgeyByZXR1cm4gSXQgPT0geC5JdDsgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgaW5saW5lIHBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydCghSXQuYXRFbmQoKSAmJiAicHJlZF9pdGVyYXRvciBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNhc3Q8VGVybWluYXRvckluc3Q+KCpJdCktPmdldFBhcmVudCgpOworICB9CisgIGlubGluZSBwb2ludGVyICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgaW5saW5lIFNlbGYmIG9wZXJhdG9yKysoKSB7ICAgLy8gUHJlaW5jcmVtZW50CisgICAgYXNzZXJ0KCFJdC5hdEVuZCgpICYmICJwcmVkX2l0ZXJhdG9yIG91dCBvZiByYW5nZSEiKTsKKyAgICArK0l0OyBhZHZhbmNlUGFzdE5vblRlcm1pbmF0b3JzKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIFNlbGYgb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgIFNlbGYgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KK307CisKK3R5cGVkZWYgUHJlZEl0ZXJhdG9yPEJhc2ljQmxvY2ssIFZhbHVlOjp1c2VfaXRlcmF0b3I+IHByZWRfaXRlcmF0b3I7Cit0eXBlZGVmIFByZWRJdGVyYXRvcjxjb25zdCBCYXNpY0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvcj4gY29uc3RfcHJlZF9pdGVyYXRvcjsKKworaW5saW5lIHByZWRfaXRlcmF0b3IgcHJlZF9iZWdpbihCYXNpY0Jsb2NrICpCQikgeyByZXR1cm4gcHJlZF9pdGVyYXRvcihCQik7IH0KK2lubGluZSBjb25zdF9wcmVkX2l0ZXJhdG9yIHByZWRfYmVnaW4oY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIGNvbnN0X3ByZWRfaXRlcmF0b3IoQkIpOworfQoraW5saW5lIHByZWRfaXRlcmF0b3IgcHJlZF9lbmQoQmFzaWNCbG9jayAqQkIpIHsgcmV0dXJuIHByZWRfaXRlcmF0b3IoQkIsIHRydWUpO30KK2lubGluZSBjb25zdF9wcmVkX2l0ZXJhdG9yIHByZWRfZW5kKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBjb25zdF9wcmVkX2l0ZXJhdG9yKEJCLCB0cnVlKTsKK30KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCYXNpY0Jsb2NrIHN1Y2NfaXRlcmF0b3IgZGVmaW5pdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPGNsYXNzIFRlcm1fLCBjbGFzcyBCQl8+ICAgICAgICAgICAvLyBTdWNjZXNzb3IgSXRlcmF0b3IKK2NsYXNzIFN1Y2NJdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQl8sIHB0cmRpZmZfdD4geworICBjb25zdCBUZXJtXyBUZXJtOworICB1bnNpZ25lZCBpZHg7CisgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjxzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBCQl8sIHB0cmRpZmZfdD4gc3VwZXI7CisgIHR5cGVkZWYgU3VjY0l0ZXJhdG9yPFRlcm1fLCBCQl8+IFNlbGY7CisKKyAgaW5saW5lIGJvb2wgaW5kZXhfaXNfdmFsaWQoaW50IGlkeCkgeworICAgIHJldHVybiBpZHggPj0gMCAmJiAodW5zaWduZWQpIGlkeCA8IFRlcm0tPmdldE51bVN1Y2Nlc3NvcnMoKTsKKyAgfQorCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXI6OnBvaW50ZXIgcG9pbnRlcjsKKyAgLy8gVE9ETzogVGhpcyBjYW4gYmUgcmFuZG9tIGFjY2VzcyBpdGVyYXRvciwgb25seSBvcGVyYXRvcltdIG1pc3NpbmcuCisKKyAgZXhwbGljaXQgaW5saW5lIFN1Y2NJdGVyYXRvcihUZXJtXyBUKSA6IFRlcm0oVCksIGlkeCgwKSB7Ly8gYmVnaW4gaXRlcmF0b3IKKyAgICBhc3NlcnQoVCAmJiAiZ2V0VGVybWluYXRvciByZXR1cm5lZCBudWxsISIpOworICB9CisgIGlubGluZSBTdWNjSXRlcmF0b3IoVGVybV8gVCwgYm9vbCkgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBpdGVyYXRvcgorICAgIDogVGVybShUKSwgaWR4KFRlcm0tPmdldE51bVN1Y2Nlc3NvcnMoKSkgeworICAgIGFzc2VydChUICYmICJnZXRUZXJtaW5hdG9yIHJldHVybmVkIG51bGwhIik7CisgIH0KKworICBpbmxpbmUgY29uc3QgU2VsZiAmb3BlcmF0b3I9KGNvbnN0IFNlbGYgJkkpIHsKKyAgICBhc3NlcnQoVGVybSA9PSBJLlRlcm0gJiYiQ2Fubm90IGFzc2lnbiBpdGVyYXRvcnMgdG8gdHdvIGRpZmZlcmVudCBibG9ja3MhIik7CisgICAgaWR4ID0gSS5pZHg7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIGdldFN1Y2Nlc3NvckluZGV4IC0gVGhpcyBpcyB1c2VkIHRvIGludGVyZmFjZSBiZXR3ZWVuIGNvZGUgdGhhdCB3YW50cyB0bworICAvLy8gb3BlcmF0ZSBvbiB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucyBkaXJlY3RseS4KKyAgdW5zaWduZWQgZ2V0U3VjY2Vzc29ySW5kZXgoKSBjb25zdCB7IHJldHVybiBpZHg7IH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsgcmV0dXJuIGlkeCA9PSB4LmlkeDsgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgaW5saW5lIHBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gVGVybS0+Z2V0U3VjY2Vzc29yKGlkeCk7IH0KKyAgaW5saW5lIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisKKyAgaW5saW5lIFNlbGYmIG9wZXJhdG9yKysoKSB7ICsraWR4OyByZXR1cm4gKnRoaXM7IH0gLy8gUHJlaW5jcmVtZW50CisKKyAgaW5saW5lIFNlbGYgb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgIFNlbGYgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KKworICBpbmxpbmUgU2VsZiYgb3BlcmF0b3ItLSgpIHsgLS1pZHg7IHJldHVybiAqdGhpczsgfSAgLy8gUHJlZGVjcmVtZW50CisgIGlubGluZSBTZWxmIG9wZXJhdG9yLS0oaW50KSB7IC8vIFBvc3RkZWNyZW1lbnQKKyAgICBTZWxmIHRtcCA9ICp0aGlzOyAtLSp0aGlzOyByZXR1cm4gdG1wOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGVybSA9PSB4LlRlcm0gJiYgIkNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgYmxvY2tzISIpOworICAgIHJldHVybiBpZHggPCB4LmlkeDsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgU2VsZiYgeCkgY29uc3QgeworICAgIGFzc2VydChUZXJtID09IHguVGVybSAmJiAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBibG9ja3MhIik7CisgICAgcmV0dXJuIGlkeCA8PSB4LmlkeDsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGVybSA9PSB4LlRlcm0gJiYgIkNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgYmxvY2tzISIpOworICAgIHJldHVybiBpZHggPj0geC5pZHg7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgU2VsZiYgeCkgY29uc3QgeworICAgIGFzc2VydChUZXJtID09IHguVGVybSAmJiAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBibG9ja3MhIik7CisgICAgcmV0dXJuIGlkeCA+IHguaWR4OworICB9CisKKyAgaW5saW5lIFNlbGYmIG9wZXJhdG9yKz0oaW50IFJpZ2h0KSB7CisgICAgdW5zaWduZWQgbmV3X2lkeCA9IGlkeCArIFJpZ2h0OworICAgIGFzc2VydChpbmRleF9pc192YWxpZChuZXdfaWR4KSAmJiAiSXRlcmF0b3IgaW5kZXggb3V0IG9mIGJvdW5kIik7CisgICAgaWR4ID0gbmV3X2lkeDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgU2VsZiBvcGVyYXRvcisoaW50IFJpZ2h0KSB7CisgICAgU2VsZiB0bXAgPSAqdGhpczsKKyAgICB0bXAgKz0gUmlnaHQ7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIGlubGluZSBTZWxmJiBvcGVyYXRvci09KGludCBSaWdodCkgeworICAgIHJldHVybiBvcGVyYXRvcis9KC1SaWdodCk7CisgIH0KKworICBpbmxpbmUgU2VsZiBvcGVyYXRvci0oaW50IFJpZ2h0KSB7CisgICAgcmV0dXJuIG9wZXJhdG9yKygtUmlnaHQpOworICB9CisKKyAgaW5saW5lIGludCBvcGVyYXRvci0oY29uc3QgU2VsZiYgeCkgeworICAgIGFzc2VydChUZXJtID09IHguVGVybSAmJiAiQ2Fubm90IHdvcmsgb24gaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBibG9ja3MhIik7CisgICAgaW50IGRpc3RhbmNlID0gaWR4IC0geC5pZHg7CisgICAgcmV0dXJuIGRpc3RhbmNlOworICB9CisKKyAgLy8gVGhpcyB3b3JrcyBmb3IgcmVhZCBhY2Nlc3MsIGhvd2V2ZXIgd3JpdGUgYWNjZXNzIGlzIGRpZmZpY3VsdCBhcyBjaGFuZ2VzCisgIC8vIHRvIFRlcm0gYXJlIG9ubHkgcG9zc2libGUgd2l0aCBUZXJtLT5zZXRTdWNjZXNzb3IoaWR4KS4gUG9pbnRlcnMgdGhhdCBjYW4KKyAgLy8gYmUgbW9kaWZpZWQgYXJlIG5vdCBhdmFpbGFibGUuCisgIC8vCisgIC8vIGlubGluZSBwb2ludGVyIG9wZXJhdG9yW10oaW50IG9mZnNldCkgeworICAvLyAgU2VsZiB0bXAgPSAqdGhpczsKKyAgLy8gIHRtcCArPSBvZmZzZXQ7CisgIC8vICByZXR1cm4gdG1wLm9wZXJhdG9yKigpOworICAvLyB9CisKKyAgLy8vIEdldCB0aGUgc291cmNlIEJCIG9mIHRoaXMgaXRlcmF0b3IuCisgIGlubGluZSBCQl8gKmdldFNvdXJjZSgpIHsKKyAgICByZXR1cm4gVGVybS0+Z2V0UGFyZW50KCk7CisgIH0KK307CisKK3R5cGVkZWYgU3VjY0l0ZXJhdG9yPFRlcm1pbmF0b3JJbnN0KiwgQmFzaWNCbG9jaz4gc3VjY19pdGVyYXRvcjsKK3R5cGVkZWYgU3VjY0l0ZXJhdG9yPGNvbnN0IFRlcm1pbmF0b3JJbnN0KiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2ljQmxvY2s+IHN1Y2NfY29uc3RfaXRlcmF0b3I7CisKK2lubGluZSBzdWNjX2l0ZXJhdG9yIHN1Y2NfYmVnaW4oQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHN1Y2NfaXRlcmF0b3IoQkItPmdldFRlcm1pbmF0b3IoKSk7Cit9CitpbmxpbmUgc3VjY19jb25zdF9pdGVyYXRvciBzdWNjX2JlZ2luKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBzdWNjX2NvbnN0X2l0ZXJhdG9yKEJCLT5nZXRUZXJtaW5hdG9yKCkpOworfQoraW5saW5lIHN1Y2NfaXRlcmF0b3Igc3VjY19lbmQoQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHN1Y2NfaXRlcmF0b3IoQkItPmdldFRlcm1pbmF0b3IoKSwgdHJ1ZSk7Cit9CitpbmxpbmUgc3VjY19jb25zdF9pdGVyYXRvciBzdWNjX2VuZChjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gc3VjY19jb25zdF9pdGVyYXRvcihCQi0+Z2V0VGVybWluYXRvcigpLCB0cnVlKTsKK30KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb25zIGZvciBiYXNpYyBibG9jayBncmFwaHMgKENGR3MpCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgb2YgR3JhcGhUcmFpdHMgdG8gYmUgYWJsZSB0byB0cmVhdCBhIGZ1bmN0aW9uIGFzIGEKKy8vIGdyYXBoIG9mIGJhc2ljIGJsb2Nrcy4uLgorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8QmFzaWNCbG9jayo+IHsKKyAgdHlwZWRlZiBCYXNpY0Jsb2NrIE5vZGVUeXBlOworICB0eXBlZGVmIHN1Y2NfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoQmFzaWNCbG9jayAqQkIpIHsgcmV0dXJuIEJCOyB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gc3VjY19iZWdpbihOKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBzdWNjX2VuZChOKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IEJhc2ljQmxvY2sqPiB7CisgIHR5cGVkZWYgY29uc3QgQmFzaWNCbG9jayBOb2RlVHlwZTsKKyAgdHlwZWRlZiBzdWNjX2NvbnN0X2l0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7IHJldHVybiBCQjsgfQorCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gc3VjY19iZWdpbihOKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBzdWNjX2VuZChOKTsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgb2YgR3JhcGhUcmFpdHMgdG8gYmUgYWJsZSB0byB0cmVhdCBhIGZ1bmN0aW9uIGFzIGEKKy8vIGdyYXBoIG9mIGJhc2ljIGJsb2Nrcy4uLiBhbmQgdG8gd2FsayBpdCBpbiBpbnZlcnNlIG9yZGVyLiAgSW52ZXJzZSBvcmRlciBmb3IKKy8vIGEgZnVuY3Rpb24gaXMgY29uc2lkZXJlZCB0byBiZSB3aGVuIHRyYXZlcnNpbmcgdGhlIHByZWRlY2Vzc29yIGVkZ2VzIG9mIGEgQkIKKy8vIGluc3RlYWQgb2YgdGhlIHN1Y2Nlc3NvciBlZGdlcy4KKy8vCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8SW52ZXJzZTxCYXNpY0Jsb2NrKj4gPiB7CisgIHR5cGVkZWYgQmFzaWNCbG9jayBOb2RlVHlwZTsKKyAgdHlwZWRlZiBwcmVkX2l0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShJbnZlcnNlPEJhc2ljQmxvY2sgKj4gRykgeyByZXR1cm4gRy5HcmFwaDsgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIHByZWRfYmVnaW4oTik7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gcHJlZF9lbmQoTik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IEJhc2ljQmxvY2sqPiA+IHsKKyAgdHlwZWRlZiBjb25zdCBCYXNpY0Jsb2NrIE5vZGVUeXBlOworICB0eXBlZGVmIGNvbnN0X3ByZWRfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKEludmVyc2U8Y29uc3QgQmFzaWNCbG9jayo+IEcpIHsKKyAgICByZXR1cm4gRy5HcmFwaDsKKyAgfQorICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIHByZWRfYmVnaW4oTik7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gcHJlZF9lbmQoTik7CisgIH0KK307CisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdyYXBoVHJhaXRzIHNwZWNpYWxpemF0aW9ucyBmb3IgZnVuY3Rpb24gYmFzaWMgYmxvY2sgZ3JhcGhzIChDRkdzKQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYSBmdW5jdGlvbiBhcyBhCisvLyBncmFwaCBvZiBiYXNpYyBibG9ja3MuLi4gdGhlc2UgYXJlIHRoZSBzYW1lIGFzIHRoZSBiYXNpYyBibG9jayBpdGVyYXRvcnMsCisvLyBleGNlcHQgdGhhdCB0aGUgcm9vdCBub2RlIGlzIGltcGxpY2l0bHkgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGZ1bmN0aW9uLgorLy8KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxGdW5jdGlvbio+IDogcHVibGljIEdyYXBoVHJhaXRzPEJhc2ljQmxvY2sqPiB7CisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKEZ1bmN0aW9uICpGKSB7IHJldHVybiAmRi0+Z2V0RW50cnlCbG9jaygpOyB9CisKKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB0eXBlZGVmIEZ1bmN0aW9uOjppdGVyYXRvciBub2Rlc19pdGVyYXRvcjsKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKEZ1bmN0aW9uICpGKSB7IHJldHVybiBGLT5iZWdpbigpOyB9CisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQgIChGdW5jdGlvbiAqRikgeyByZXR1cm4gRi0+ZW5kKCk7IH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgRnVuY3Rpb24qPiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxjb25zdCBCYXNpY0Jsb2NrKj4geworICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShjb25zdCBGdW5jdGlvbiAqRikge3JldHVybiAmRi0+Z2V0RW50cnlCbG9jaygpO30KKworICAvLyBub2Rlc19pdGVyYXRvci9iZWdpbi9lbmQgLSBBbGxvdyBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoCisgIHR5cGVkZWYgRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIG5vZGVzX2l0ZXJhdG9yOworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oY29uc3QgRnVuY3Rpb24gKkYpIHsgcmV0dXJuIEYtPmJlZ2luKCk7IH0KKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZCAgKGNvbnN0IEZ1bmN0aW9uICpGKSB7IHJldHVybiBGLT5lbmQoKTsgfQorfTsKKworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEgZnVuY3Rpb24gYXMgYQorLy8gZ3JhcGggb2YgYmFzaWMgYmxvY2tzLi4uIGFuZCB0byB3YWxrIGl0IGluIGludmVyc2Ugb3JkZXIuICBJbnZlcnNlIG9yZGVyIGZvcgorLy8gYSBmdW5jdGlvbiBpcyBjb25zaWRlcmVkIHRvIGJlIHdoZW4gdHJhdmVyc2luZyB0aGUgcHJlZGVjZXNzb3IgZWRnZXMgb2YgYSBCQgorLy8gaW5zdGVhZCBvZiB0aGUgc3VjY2Vzc29yIGVkZ2VzLgorLy8KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPEZ1bmN0aW9uKj4gPiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxJbnZlcnNlPEJhc2ljQmxvY2sqPiA+IHsKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoSW52ZXJzZTxGdW5jdGlvbio+IEcpIHsKKyAgICByZXR1cm4gJkcuR3JhcGgtPmdldEVudHJ5QmxvY2soKTsKKyAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IEZ1bmN0aW9uKj4gPiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IEJhc2ljQmxvY2sqPiA+IHsKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoSW52ZXJzZTxjb25zdCBGdW5jdGlvbiAqPiBHKSB7CisgICAgcmV0dXJuICZHLkdyYXBoLT5nZXRFbnRyeUJsb2NrKCk7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ09GRi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ09GRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjRiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DT0ZGLmgKQEAgLTAsMCArMSwyNjkgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0NPRkYuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGFuIGRlZmluaXRpb25zIHVzZWQgaW4gV2luZG93cyBDT0ZGIEZpbGVzLgorLy8KKy8vIFN0cnVjdHVyZXMgYW5kIGVudW1zIGRlZmluZWQgd2l0aGluIHRoaXMgZmlsZSB3aGVyZSBjcmVhdGVkIHVzaW5nCisvLyBpbmZvcm1hdGlvbiBmcm9tIE1pY3Jvc29mdCdzIHB1YmxpY2x5IGF2YWlsYWJsZSBQRS9DT0ZGIGZvcm1hdCBkb2N1bWVudDoKKy8vIAorLy8gTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbgorLy8gUmV2aXNpb24gOC4xIC0gRmVicnVhcnkgMTUsIDIwMDgKKy8vCisvLyBBcyBvZiA1LzIvMjAxMCwgaG9zdGVkIGJ5IE1pY3Jvc29mdCBhdDoKKy8vIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL3N5c3RlbS9wbGF0Zm9ybS9maXJtd2FyZS9wZWNvZmYubXNweAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1dJTl9DT0ZGX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1dJTl9DT0ZGX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBDT0ZGIHsKKworICAvLyBTaXplcyBpbiBieXRlcyBvZiB2YXJpb3VzIHRoaW5ncyBpbiB0aGUgQ09GRiBmb3JtYXQuCisgIGVudW0geworICAgIEhlYWRlclNpemUgICAgID0gMjAsCisgICAgTmFtZVNpemUgICAgICAgPSA4LAorICAgIFN5bWJvbFNpemUgICAgID0gMTgsCisgICAgU2VjdGlvblNpemUgICAgPSA0MCwKKyAgICBSZWxvY2F0aW9uU2l6ZSA9IDEwCisgIH07CisKKyAgc3RydWN0IGhlYWRlciB7CisgICAgdWludDE2X3QgTWFjaGluZTsKKyAgICB1aW50MTZfdCBOdW1iZXJPZlNlY3Rpb25zOworICAgIHVpbnQzMl90IFRpbWVEYXRlU3RhbXA7CisgICAgdWludDMyX3QgUG9pbnRlclRvU3ltYm9sVGFibGU7CisgICAgdWludDMyX3QgTnVtYmVyT2ZTeW1ib2xzOworICAgIHVpbnQxNl90IFNpemVPZk9wdGlvbmFsSGVhZGVyOworICAgIHVpbnQxNl90IENoYXJhY3RlcmlzdGljczsKKyAgfTsKKworICBzdHJ1Y3Qgc3ltYm9sIHsKKyAgICBjaGFyICAgICBOYW1lW05hbWVTaXplXTsKKyAgICB1aW50MzJfdCBWYWx1ZTsKKyAgICB1aW50MTZfdCBUeXBlOworICAgIHVpbnQ4X3QgIFN0b3JhZ2VDbGFzczsKKyAgICB1aW50MTZfdCBTZWN0aW9uTnVtYmVyOworICAgIHVpbnQ4X3QgIE51bWJlck9mQXV4U3ltYm9sczsKKyAgfTsKKworICBlbnVtIFN5bWJvbEZsYWdzIHsKKyAgICBTRl9UeXBlTWFzayA9IDB4MDAwMEZGRkYsCisgICAgU0ZfVHlwZVNoaWZ0ID0gMCwKKworICAgIFNGX0NsYXNzTWFzayA9IDB4MDBGRjAwMDAsCisgICAgU0ZfQ2xhc3NTaGlmdCA9IDE2LAorCisgICAgU0ZfV2Vha1JlZmVyZW5jZSA9IDB4MDEwMDAwMDAKKyAgfTsKKworICAvLy8gU3RvcmFnZSBjbGFzcyB0ZWxscyB3aGVyZSBhbmQgd2hhdCB0aGUgc3ltYm9sIHJlcHJlc2VudHMKKyAgZW51bSBTeW1ib2xTdG9yYWdlQ2xhc3MgeworICAgIElNQUdFX1NZTV9DTEFTU19FTkRfT0ZfRlVOQ1RJT04gID0gLTEsICAvLy88IFBoeXNpY2FsIGVuZCBvZiBmdW5jdGlvbgorICAgIElNQUdFX1NZTV9DTEFTU19OVUxMICAgICAgICAgICAgID0gMCwgICAvLy88IE5vIHN5bWJvbAorICAgIElNQUdFX1NZTV9DTEFTU19BVVRPTUFUSUMgICAgICAgID0gMSwgICAvLy88IFN0YWNrIHZhcmlhYmxlCisgICAgSU1BR0VfU1lNX0NMQVNTX0VYVEVSTkFMICAgICAgICAgPSAyLCAgIC8vLzwgRXh0ZXJuYWwgc3ltYm9sCisgICAgSU1BR0VfU1lNX0NMQVNTX1NUQVRJQyAgICAgICAgICAgPSAzLCAgIC8vLzwgU3RhdGljCisgICAgSU1BR0VfU1lNX0NMQVNTX1JFR0lTVEVSICAgICAgICAgPSA0LCAgIC8vLzwgUmVnaXN0ZXIgdmFyaWFibGUKKyAgICBJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUxfREVGICAgICA9IDUsICAgLy8vPCBFeHRlcm5hbCBkZWZpbml0aW9uCisgICAgSU1BR0VfU1lNX0NMQVNTX0xBQkVMICAgICAgICAgICAgPSA2LCAgIC8vLzwgTGFiZWwKKyAgICBJTUFHRV9TWU1fQ0xBU1NfVU5ERUZJTkVEX0xBQkVMICA9IDcsICAgLy8vPCBVbmRlZmluZWQgbGFiZWwKKyAgICBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX1NUUlVDVCA9IDgsICAgLy8vPCBNZW1iZXIgb2Ygc3RydWN0dXJlCisgICAgSU1BR0VfU1lNX0NMQVNTX0FSR1VNRU5UICAgICAgICAgPSA5LCAgIC8vLzwgRnVuY3Rpb24gYXJndW1lbnQKKyAgICBJTUFHRV9TWU1fQ0xBU1NfU1RSVUNUX1RBRyAgICAgICA9IDEwLCAgLy8vPCBTdHJ1Y3R1cmUgdGFnCisgICAgSU1BR0VfU1lNX0NMQVNTX01FTUJFUl9PRl9VTklPTiAgPSAxMSwgIC8vLzwgTWVtYmVyIG9mIHVuaW9uCisgICAgSU1BR0VfU1lNX0NMQVNTX1VOSU9OX1RBRyAgICAgICAgPSAxMiwgIC8vLzwgVW5pb24gdGFnCisgICAgSU1BR0VfU1lNX0NMQVNTX1RZUEVfREVGSU5JVElPTiAgPSAxMywgIC8vLzwgVHlwZSBkZWZpbml0aW9uCisgICAgSU1BR0VfU1lNX0NMQVNTX1VOREVGSU5FRF9TVEFUSUMgPSAxNCwgIC8vLzwgVW5kZWZpbmVkIHN0YXRpYworICAgIElNQUdFX1NZTV9DTEFTU19FTlVNX1RBRyAgICAgICAgID0gMTUsICAvLy88IEVudW1lcmF0aW9uIHRhZworICAgIElNQUdFX1NZTV9DTEFTU19NRU1CRVJfT0ZfRU5VTSAgID0gMTYsICAvLy88IE1lbWJlciBvZiBlbnVtZXJhdGlvbgorICAgIElNQUdFX1NZTV9DTEFTU19SRUdJU1RFUl9QQVJBTSAgID0gMTcsICAvLy88IFJlZ2lzdGVyIHBhcmFtZXRlcgorICAgIElNQUdFX1NZTV9DTEFTU19CSVRfRklFTEQgICAgICAgID0gMTgsICAvLy88IEJpdCBmaWVsZAorICAgIC8vLyAiLmJiIiBvciAiLmViIiAtIGJlZ2lubmluZyBvciBlbmQgb2YgYmxvY2sKKyAgICBJTUFHRV9TWU1fQ0xBU1NfQkxPQ0sgICAgICAgICAgICA9IDEwMCwKKyAgICAvLy8gIi5iZiIgb3IgIi5lZiIgLSBiZWdpbm5pbmcgb3IgZW5kIG9mIGZ1bmN0aW9uCisgICAgSU1BR0VfU1lNX0NMQVNTX0ZVTkNUSU9OICAgICAgICAgPSAxMDEsCisgICAgSU1BR0VfU1lNX0NMQVNTX0VORF9PRl9TVFJVQ1QgICAgPSAxMDIsIC8vLzwgRW5kIG9mIHN0cnVjdHVyZQorICAgIElNQUdFX1NZTV9DTEFTU19GSUxFICAgICAgICAgICAgID0gMTAzLCAvLy88IEZpbGUgbmFtZQorICAgIC8vLyBMaW5lIG51bWJlciwgcmVmb3JtYXR0ZWQgYXMgc3ltYm9sCisgICAgSU1BR0VfU1lNX0NMQVNTX1NFQ1RJT04gICAgICAgICAgPSAxMDQsCisgICAgSU1BR0VfU1lNX0NMQVNTX1dFQUtfRVhURVJOQUwgICAgPSAxMDUsIC8vLzwgRHVwbGljYXRlIHRhZworICAgIC8vLyBFeHRlcm5hbCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYgorICAgIElNQUdFX1NZTV9DTEFTU19DTFJfVE9LRU4gICAgICAgID0gMTA3CisgIH07CisKKyAgZW51bSBTeW1ib2xCYXNlVHlwZSB7CisgICAgSU1BR0VfU1lNX1RZUEVfTlVMTCAgID0gMCwgIC8vLzwgTm8gdHlwZSBpbmZvcm1hdGlvbiBvciB1bmtub3duIGJhc2UgdHlwZS4KKyAgICBJTUFHRV9TWU1fVFlQRV9WT0lEICAgPSAxLCAgLy8vPCBVc2VkIHdpdGggdm9pZCBwb2ludGVycyBhbmQgZnVuY3Rpb25zLgorICAgIElNQUdFX1NZTV9UWVBFX0NIQVIgICA9IDIsICAvLy88IEEgY2hhcmFjdGVyIChzaWduZWQgYnl0ZSkuCisgICAgSU1BR0VfU1lNX1RZUEVfU0hPUlQgID0gMywgIC8vLzwgQSAyLWJ5dGUgc2lnbmVkIGludGVnZXIuCisgICAgSU1BR0VfU1lNX1RZUEVfSU5UICAgID0gNCwgIC8vLzwgQSBuYXR1cmFsIGludGVnZXIgdHlwZSBvbiB0aGUgdGFyZ2V0LgorICAgIElNQUdFX1NZTV9UWVBFX0xPTkcgICA9IDUsICAvLy88IEEgNC1ieXRlIHNpZ25lZCBpbnRlZ2VyLgorICAgIElNQUdFX1NZTV9UWVBFX0ZMT0FUICA9IDYsICAvLy88IEEgNC1ieXRlIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICBJTUFHRV9TWU1fVFlQRV9ET1VCTEUgPSA3LCAgLy8vPCBBbiA4LWJ5dGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAgIElNQUdFX1NZTV9UWVBFX1NUUlVDVCA9IDgsICAvLy88IEEgc3RydWN0dXJlLgorICAgIElNQUdFX1NZTV9UWVBFX1VOSU9OICA9IDksICAvLy88IEFuIHVuaW9uLgorICAgIElNQUdFX1NZTV9UWVBFX0VOVU0gICA9IDEwLCAvLy88IEFuIGVudW1lcmF0ZWQgdHlwZS4KKyAgICBJTUFHRV9TWU1fVFlQRV9NT0UgICAgPSAxMSwgLy8vPCBBIG1lbWJlciBvZiBlbnVtZXJhdGlvbiAoYSBzcGVjaWZpYyB2YWx1ZSkuCisgICAgSU1BR0VfU1lNX1RZUEVfQllURSAgID0gMTIsIC8vLzwgQSBieXRlOyB1bnNpZ25lZCAxLWJ5dGUgaW50ZWdlci4KKyAgICBJTUFHRV9TWU1fVFlQRV9XT1JEICAgPSAxMywgLy8vPCBBIHdvcmQ7IHVuc2lnbmVkIDItYnl0ZSBpbnRlZ2VyLgorICAgIElNQUdFX1NZTV9UWVBFX1VJTlQgICA9IDE0LCAvLy88IEFuIHVuc2lnbmVkIGludGVnZXIgb2YgbmF0dXJhbCBzaXplLgorICAgIElNQUdFX1NZTV9UWVBFX0RXT1JEICA9IDE1ICAvLy88IEFuIHVuc2lnbmVkIDQtYnl0ZSBpbnRlZ2VyLgorICB9OworCisgIGVudW0gU3ltYm9sQ29tcGxleFR5cGUgeworICAgIElNQUdFX1NZTV9EVFlQRV9OVUxMICAgICA9IDAsIC8vLzwgTm8gY29tcGxleCB0eXBlOyBzaW1wbGUgc2NhbGFyIHZhcmlhYmxlLiAKKyAgICBJTUFHRV9TWU1fRFRZUEVfUE9JTlRFUiAgPSAxLCAvLy88IEEgcG9pbnRlciB0byBiYXNlIHR5cGUuCisgICAgSU1BR0VfU1lNX0RUWVBFX0ZVTkNUSU9OID0gMiwgLy8vPCBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGJhc2UgdHlwZS4KKyAgICBJTUFHRV9TWU1fRFRZUEVfQVJSQVkgICAgPSAzLCAvLy88IEFuIGFycmF5IG9mIGJhc2UgdHlwZS4KKyAgICAKKyAgICAvLy8gVHlwZSBpcyBmb3JtZWQgYXMgKGJhc2UgKyAoZGVyaXZlZCA8PCBTQ1RfQ09NUExFWF9UWVBFX1NISUZUKSkKKyAgICBTQ1RfQ09NUExFWF9UWVBFX1NISUZUICAgPSA0CisgIH07CisKKyAgc3RydWN0IHNlY3Rpb24geworICAgIGNoYXIgICAgIE5hbWVbTmFtZVNpemVdOworICAgIHVpbnQzMl90IFZpcnR1YWxTaXplOworICAgIHVpbnQzMl90IFZpcnR1YWxBZGRyZXNzOworICAgIHVpbnQzMl90IFNpemVPZlJhd0RhdGE7CisgICAgdWludDMyX3QgUG9pbnRlclRvUmF3RGF0YTsKKyAgICB1aW50MzJfdCBQb2ludGVyVG9SZWxvY2F0aW9uczsKKyAgICB1aW50MzJfdCBQb2ludGVyVG9MaW5lTnVtYmVyczsKKyAgICB1aW50MTZfdCBOdW1iZXJPZlJlbG9jYXRpb25zOworICAgIHVpbnQxNl90IE51bWJlck9mTGluZU51bWJlcnM7CisgICAgdWludDMyX3QgQ2hhcmFjdGVyaXN0aWNzOworICB9OworCisgIGVudW0gU2VjdGlvbkNoYXJhY3RlcmlzdGljcyB7CisgICAgSU1BR0VfU0NOX1RZUEVfTk9fUEFEICAgICAgICAgICAgPSAweDAwMDAwMDA4LAorICAgIElNQUdFX1NDTl9DTlRfQ09ERSAgICAgICAgICAgICAgID0gMHgwMDAwMDAyMCwKKyAgICBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgICA9IDB4MDAwMDAwNDAsCisgICAgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEgPSAweDAwMDAwMDgwLAorICAgIElNQUdFX1NDTl9MTktfT1RIRVIgICAgICAgICAgICAgID0gMHgwMDAwMDEwMCwKKyAgICBJTUFHRV9TQ05fTE5LX0lORk8gICAgICAgICAgICAgICA9IDB4MDAwMDAyMDAsCisgICAgSU1BR0VfU0NOX0xOS19SRU1PVkUgICAgICAgICAgICAgPSAweDAwMDAwODAwLAorICAgIElNQUdFX1NDTl9MTktfQ09NREFUICAgICAgICAgICAgID0gMHgwMDAwMTAwMCwKKyAgICBJTUFHRV9TQ05fR1BSRUwgICAgICAgICAgICAgICAgICA9IDB4MDAwMDgwMDAsCisgICAgSU1BR0VfU0NOX01FTV9QVVJHRUFCTEUgICAgICAgICAgPSAweDAwMDIwMDAwLAorICAgIElNQUdFX1NDTl9NRU1fMTZCSVQgICAgICAgICAgICAgID0gMHgwMDAyMDAwMCwKKyAgICBJTUFHRV9TQ05fTUVNX0xPQ0tFRCAgICAgICAgICAgICA9IDB4MDAwNDAwMDAsCisgICAgSU1BR0VfU0NOX01FTV9QUkVMT0FEICAgICAgICAgICAgPSAweDAwMDgwMDAwLAorICAgIElNQUdFX1NDTl9BTElHTl8xQllURVMgICAgICAgICAgID0gMHgwMDEwMDAwMCwKKyAgICBJTUFHRV9TQ05fQUxJR05fMkJZVEVTICAgICAgICAgICA9IDB4MDAyMDAwMDAsCisgICAgSU1BR0VfU0NOX0FMSUdOXzRCWVRFUyAgICAgICAgICAgPSAweDAwMzAwMDAwLAorICAgIElNQUdFX1NDTl9BTElHTl84QllURVMgICAgICAgICAgID0gMHgwMDQwMDAwMCwKKyAgICBJTUFHRV9TQ05fQUxJR05fMTZCWVRFUyAgICAgICAgICA9IDB4MDA1MDAwMDAsCisgICAgSU1BR0VfU0NOX0FMSUdOXzMyQllURVMgICAgICAgICAgPSAweDAwNjAwMDAwLAorICAgIElNQUdFX1NDTl9BTElHTl82NEJZVEVTICAgICAgICAgID0gMHgwMDcwMDAwMCwKKyAgICBJTUFHRV9TQ05fQUxJR05fMTI4QllURVMgICAgICAgICA9IDB4MDA4MDAwMDAsCisgICAgSU1BR0VfU0NOX0FMSUdOXzI1NkJZVEVTICAgICAgICAgPSAweDAwOTAwMDAwLAorICAgIElNQUdFX1NDTl9BTElHTl81MTJCWVRFUyAgICAgICAgID0gMHgwMEEwMDAwMCwKKyAgICBJTUFHRV9TQ05fQUxJR05fMTAyNEJZVEVTICAgICAgICA9IDB4MDBCMDAwMDAsCisgICAgSU1BR0VfU0NOX0FMSUdOXzIwNDhCWVRFUyAgICAgICAgPSAweDAwQzAwMDAwLAorICAgIElNQUdFX1NDTl9BTElHTl80MDk2QllURVMgICAgICAgID0gMHgwMEQwMDAwMCwKKyAgICBJTUFHRV9TQ05fQUxJR05fODE5MkJZVEVTICAgICAgICA9IDB4MDBFMDAwMDAsCisgICAgSU1BR0VfU0NOX0xOS19OUkVMT0NfT1ZGTCAgICAgICAgPSAweDAxMDAwMDAwLAorICAgIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUgICAgICAgID0gMHgwMjAwMDAwMCwKKyAgICBJTUFHRV9TQ05fTUVNX05PVF9DQUNIRUQgICAgICAgICA9IDB4MDQwMDAwMDAsCisgICAgSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgICAgICAgICAgPSAweDA4MDAwMDAwLAorICAgIElNQUdFX1NDTl9NRU1fU0hBUkVEICAgICAgICAgICAgID0gMHgxMDAwMDAwMCwKKyAgICBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgICAgICAgICAgICA9IDB4MjAwMDAwMDAsCisgICAgSU1BR0VfU0NOX01FTV9SRUFEICAgICAgICAgICAgICAgPSAweDQwMDAwMDAwLAorICAgIElNQUdFX1NDTl9NRU1fV1JJVEUgICAgICAgICAgICAgID0gMHg4MDAwMDAwMAorICB9OworCisgIHN0cnVjdCByZWxvY2F0aW9uIHsKKyAgICB1aW50MzJfdCBWaXJ0dWFsQWRkcmVzczsKKyAgICB1aW50MzJfdCBTeW1ib2xUYWJsZUluZGV4OworICAgIHVpbnQxNl90IFR5cGU7CisgIH07CisKKyAgZW51bSBSZWxvY2F0aW9uVHlwZVg4NiB7CisgICAgSU1BR0VfUkVMX0kzODZfQUJTT0xVVEUgPSAweDAwMDAsCisgICAgSU1BR0VfUkVMX0kzODZfRElSMTYgICAgPSAweDAwMDEsCisgICAgSU1BR0VfUkVMX0kzODZfUkVMMTYgICAgPSAweDAwMDIsCisgICAgSU1BR0VfUkVMX0kzODZfRElSMzIgICAgPSAweDAwMDYsCisgICAgSU1BR0VfUkVMX0kzODZfRElSMzJOQiAgPSAweDAwMDcsCisgICAgSU1BR0VfUkVMX0kzODZfU0VHMTIgICAgPSAweDAwMDksCisgICAgSU1BR0VfUkVMX0kzODZfU0VDVElPTiAgPSAweDAwMEEsCisgICAgSU1BR0VfUkVMX0kzODZfU0VDUkVMICAgPSAweDAwMEIsCisgICAgSU1BR0VfUkVMX0kzODZfVE9LRU4gICAgPSAweDAwMEMsCisgICAgSU1BR0VfUkVMX0kzODZfU0VDUkVMNyAgPSAweDAwMEQsCisgICAgSU1BR0VfUkVMX0kzODZfUkVMMzIgICAgPSAweDAwMTQKKyAgfTsKKworICBlbnVtIENPTURBVFR5cGUgeworICAgIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTID0gMSwKKyAgICBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWSwKKyAgICBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRSwKKyAgICBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENILAorICAgIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkUsCisgICAgSU1BR0VfQ09NREFUX1NFTEVDVF9MQVJHRVNUCisgIH07CisKKyAgLy8gQXV4aWxpYXJ5IFN5bWJvbCBGb3JtYXRzCisgIHN0cnVjdCBBdXhpbGlhcnlGdW5jdGlvbkRlZmluaXRpb24geworICAgIHVpbnQzMl90IFRhZ0luZGV4OworICAgIHVpbnQzMl90IFRvdGFsU2l6ZTsKKyAgICB1aW50MzJfdCBQb2ludGVyVG9MaW5lbnVtYmVyOworICAgIHVpbnQzMl90IFBvaW50ZXJUb05leHRGdW5jdGlvbjsKKyAgICB1aW50OF90ICB1bnVzZWRbMl07CisgIH07CisKKyAgc3RydWN0IEF1eGlsaWFyeWJmQW5kZWZTeW1ib2wgeworICAgIHVpbnQ4X3QgIHVudXNlZDFbNF07CisgICAgdWludDE2X3QgTGluZW51bWJlcjsKKyAgICB1aW50OF90ICB1bnVzZWQyWzZdOworICAgIHVpbnQzMl90IFBvaW50ZXJUb05leHRGdW5jdGlvbjsKKyAgICB1aW50OF90ICB1bnVzZWQzWzJdOworICB9OworCisgIHN0cnVjdCBBdXhpbGlhcnlXZWFrRXh0ZXJuYWwgeworICAgIHVpbnQzMl90IFRhZ0luZGV4OworICAgIHVpbnQzMl90IENoYXJhY3RlcmlzdGljczsKKyAgICB1aW50OF90ICB1bnVzZWRbMTBdOworICB9OworCisgIC8vLyBUaGVzZSBhcmUgbm90IGRvY3VtZW50ZWQgaW4gdGhlIHNwZWMsIGJ1dCBhcmUgbG9jYXRlZCBpbiBXaW5OVC5oLgorICBlbnVtIFdlYWtFeHRlcm5hbENoYXJhY3RlcmlzdGljcyB7CisgICAgSU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX05PTElCUkFSWSA9IDEsCisgICAgSU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX0xJQlJBUlkgICA9IDIsCisgICAgSU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX0FMSUFTICAgICA9IDMKKyAgfTsKKworICBzdHJ1Y3QgQXV4aWxpYXJ5RmlsZSB7CisgICAgdWludDhfdCBGaWxlTmFtZVsxOF07CisgIH07CisKKyAgc3RydWN0IEF1eGlsaWFyeVNlY3Rpb25EZWZpbml0aW9uIHsKKyAgICB1aW50MzJfdCBMZW5ndGg7CisgICAgdWludDE2X3QgTnVtYmVyT2ZSZWxvY2F0aW9uczsKKyAgICB1aW50MTZfdCBOdW1iZXJPZkxpbmVudW1iZXJzOworICAgIHVpbnQzMl90IENoZWNrU3VtOworICAgIHVpbnQxNl90IE51bWJlcjsKKyAgICB1aW50OF90ICBTZWxlY3Rpb247CisgICAgdWludDhfdCAgdW51c2VkWzNdOworICB9OworCisgIHVuaW9uIEF1eGlsaWFyeSB7CisgICAgQXV4aWxpYXJ5RnVuY3Rpb25EZWZpbml0aW9uIEZ1bmN0aW9uRGVmaW5pdGlvbjsKKyAgICBBdXhpbGlhcnliZkFuZGVmU3ltYm9sICAgICAgYmZBbmRlZlN5bWJvbDsKKyAgICBBdXhpbGlhcnlXZWFrRXh0ZXJuYWwgICAgICAgV2Vha0V4dGVybmFsOworICAgIEF1eGlsaWFyeUZpbGUgICAgICAgICAgICAgICBGaWxlOworICAgIEF1eGlsaWFyeVNlY3Rpb25EZWZpbml0aW9uICBTZWN0aW9uRGVmaW5pdGlvbjsKKyAgfTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCit9IC8vIEVuZCBuYW1lc3BhY2UgQ09GRi4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGFiNmVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaApAQCAtMCwwICsxLDI4OSBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCAtIEFic3RyYWN0IENhbGwgJiBJbnZva2UgaW5zdHJzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ2FsbFNpdGUgY2xhc3MsIHdoaWNoIGlzIGEgaGFuZHkgd3JhcHBlciBmb3IgY29kZSB0aGF0CisvLyB3YW50cyB0byB0cmVhdCBDYWxsIGFuZCBJbnZva2UgaW5zdHJ1Y3Rpb25zIGluIGEgZ2VuZXJpYyB3YXkuIFdoZW4gaW4gbm9uLQorLy8gbXV0YXRpb24gY29udGV4dCAoZS5nLiBhbiBhbmFseXNpcykgSW1tdXRhYmxlQ2FsbFNpdGUgc2hvdWxkIGJlIHVzZWQuCisvLyBGaW5hbGx5LCB3aGVuIHNvbWUgZGVncmVlIG9mIGN1c3RvbWl6YXRpb24gaXMgbmVjZXNzYXJ5IGJldHdlZW4gdGhlc2UgdHdvCisvLyBleHRyZW1lcywgQ2FsbFNpdGVCYXNlPD4gY2FuIGJlIHN1cHBsaWVkIHdpdGggZmluZS10dW5lZCBwYXJhbWV0ZXJzLgorLy8KKy8vIE5PVEU6IFRoZXNlIGNsYXNzZXMgYXJlIHN1cHBvc2VkIHRvIGhhdmUgInZhbHVlIHNlbWFudGljcyIuIFNvIHRoZXkgc2hvdWxkIGJlCisvLyBwYXNzZWQgYnkgdmFsdWUsIG5vdCBieSByZWZlcmVuY2U7IHRoZXkgc2hvdWxkIG5vdCBiZSAibmV3ImVkIG9yICJkZWxldGUiZC4KKy8vIFRoZXkgYXJlIGVmZmljaWVudGx5IGNvcHlhYmxlLCBhc3NpZ25hYmxlIGFuZCBjb25zdHJ1Y3RhYmxlLCB3aXRoIGNvc3QKKy8vIGVxdWl2YWxlbnQgdG8gY29weWluZyBhIHBvaW50ZXIgKG5vdGljZSB0aGF0IHRoZXkgaGF2ZSBvbmx5IGEgc2luZ2xlIGRhdGEKKy8vIG1lbWJlcikuIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBjYXJyaWVzIGEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hpY2ggb2YKKy8vIHRoZSB0d28gdmFyaWFudHMgaXMgZW5jbG9zZWQuIFRoaXMgYWxsb3dzIGZvciBjaGVhcGVyIGNoZWNrcyB3aGVuIHZhcmlvdXMKKy8vIGFjY2Vzc29ycyBvZiBDYWxsU2l0ZSBhcmUgZW1wbG95ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ0FMTFNJVEVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ0FMTFNJVEVfSAorCisjaW5jbHVkZSAibGx2bS9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDYWxsSW5zdDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1blR5ID0gY29uc3QgRnVuY3Rpb24sCisgICAgICAgICAgdHlwZW5hbWUgVmFsVHkgPSBjb25zdCBWYWx1ZSwKKyAgICAgICAgICB0eXBlbmFtZSBVc2VyVHkgPSBjb25zdCBVc2VyLAorICAgICAgICAgIHR5cGVuYW1lIEluc3RyVHkgPSBjb25zdCBJbnN0cnVjdGlvbiwKKyAgICAgICAgICB0eXBlbmFtZSBDYWxsVHkgPSBjb25zdCBDYWxsSW5zdCwKKyAgICAgICAgICB0eXBlbmFtZSBJdGVyVHkgPSBVc2VyOjpjb25zdF9vcF9pdGVyYXRvcj4KK2NsYXNzIENhbGxTaXRlQmFzZSB7Citwcm90ZWN0ZWQ6CisgIFBvaW50ZXJJbnRQYWlyPEluc3RyVHkqLCAxLCBib29sPiBJOworcHVibGljOgorICBDYWxsU2l0ZUJhc2UoKSA6IEkoMCwgZmFsc2UpIHt9CisgIENhbGxTaXRlQmFzZShDYWxsVHkgKkNJKSA6IEkoQ0ksIHRydWUpIHsgYXNzZXJ0KENJKTsgfQorICBDYWxsU2l0ZUJhc2UoVmFsVHkgKklJKSB7ICp0aGlzID0gZ2V0KElJKTsgfQorICBDYWxsU2l0ZUJhc2UoSW5zdHJUeSAqSUkpIHsKKyAgICBhc3NlcnQoSUkgJiYgIk51bGwgaW5zdHJ1Y3Rpb24gZ2l2ZW4/Iik7CisgICAgKnRoaXMgPSBnZXQoSUkpOworICAgIGFzc2VydChJLmdldFBvaW50ZXIoKSAmJiAiTm90IGEgY2FsbD8iKTsKKyAgfQorCisgIC8vLyBDYWxsU2l0ZUJhc2U6OmdldCAtIFRoaXMgc3RhdGljIG1ldGhvZCBpcyBzb3J0IG9mIGxpa2UgYSBjb25zdHJ1Y3Rvci4gIEl0CisgIC8vLyB3aWxsIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSBjYWxsIHNpdGUgZm9yIGEgQ2FsbCBvciBJbnZva2UgaW5zdHJ1Y3Rpb24sIGJ1dAorICAvLy8gaXQgY2FuIGFsc28gY3JlYXRlIGEgbnVsbCBpbml0aWFsaXplZCBDYWxsU2l0ZUJhc2Ugb2JqZWN0IGZvciBzb21ldGhpbmcKKyAgLy8vIHdoaWNoIGlzIE5PVCBhIGNhbGwgc2l0ZS4KKyAgLy8vCisgIHN0YXRpYyBDYWxsU2l0ZUJhc2UgZ2V0KFZhbFR5ICpWKSB7CisgICAgaWYgKEluc3RyVHkgKklJID0gZHluX2Nhc3Q8SW5zdHJUeT4oVikpIHsKKyAgICAgIGlmIChJSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkNhbGwpCisgICAgICAgIHJldHVybiBDYWxsU2l0ZUJhc2Uoc3RhdGljX2Nhc3Q8Q2FsbFR5Kj4oSUkpKTsKKyAgICB9CisgICAgcmV0dXJuIENhbGxTaXRlQmFzZSgpOworICB9CisKKyAgLy8vIGlzQ2FsbCAtIHRydWUgaWYgYSBDYWxsSW5zdCBpcyBlbmNsb3NlZC4KKyAgLy8vIE5vdGUgdGhhdCAhaXNDYWxsKCkgZG9lcyBub3QgbWVhbiBpdCBpcyBhbiBJbnZva2VJbnN0IGVuY2xvc2VkLAorICAvLy8gaXQgYWxzbyBjb3VsZCBzaWduaWZ5IGEgTlVMTCBJbnN0cnVjdGlvbiBwb2ludGVyLgorICBib29sIGlzQ2FsbCgpIGNvbnN0IHsgcmV0dXJuIEkuZ2V0SW50KCk7IH0KKworICBJbnN0clR5ICpnZXRJbnN0cnVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIEkuZ2V0UG9pbnRlcigpOyB9CisgIEluc3RyVHkgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBJLmdldFBvaW50ZXIoKTsgfQorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gSS5nZXRQb2ludGVyKCk7IH0KKworICAvLy8gZ2V0Q2FsbGVkVmFsdWUgLSBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBpcyBiZWluZyBjYWxsZWQuLi4KKyAgLy8vCisgIFZhbFR5ICpnZXRDYWxsZWRWYWx1ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0SW5zdHJ1Y3Rpb24oKSAmJiAiTm90IGEgY2FsbCBvciBpbnZva2UgaW5zdHJ1Y3Rpb24hIik7CisgICAgcmV0dXJuICpnZXRDYWxsZWUoKTsKKyAgfQorCisgIC8vLyBnZXRDYWxsZWRGdW5jdGlvbiAtIFJldHVybiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkIGlmIHRoaXMgaXMgYSBkaXJlY3QKKyAgLy8vIGNhbGwsIG90aGVyd2lzZSByZXR1cm4gbnVsbCAoaWYgaXQncyBhbiBpbmRpcmVjdCBjYWxsKS4KKyAgLy8vCisgIEZ1blR5ICpnZXRDYWxsZWRGdW5jdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Q8RnVuVHk+KGdldENhbGxlZFZhbHVlKCkpOworICB9CisKKyAgLy8vIHNldENhbGxlZEZ1bmN0aW9uIC0gU2V0IHRoZSBjYWxsZWUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4uLgorICAvLy8KKyAgdm9pZCBzZXRDYWxsZWRGdW5jdGlvbihWYWx1ZSAqVikgeworICAgIGFzc2VydChnZXRJbnN0cnVjdGlvbigpICYmICJOb3QgYSBjYWxsIG9yIGludm9rZSBpbnN0cnVjdGlvbiEiKTsKKyAgICAqZ2V0Q2FsbGVlKCkgPSBWOworICB9CisKKyAgLy8vIGlzQ2FsbGVlIC0gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhc3NlZCBpdGVyYXRvciBwb2ludHMgdG8gdGhlCisgIC8vLyBjYWxsZWUgb3BlcmFuZCdzIFVzZS4KKyAgLy8vCisgIGJvb2wgaXNDYWxsZWUodmFsdWVfdXNlX2l0ZXJhdG9yPFVzZXJUeT4gVUkpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q2FsbGVlKCkgPT0gJlVJLmdldFVzZSgpOworICB9CisKKyAgVmFsVHkgKmdldEFyZ3VtZW50KHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgYXNzZXJ0KGFyZ19iZWdpbigpICsgQXJnTm8gPCBhcmdfZW5kKCkgJiYgIkFyZ3VtZW50ICMgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiAqKGFyZ19iZWdpbigpICsgQXJnTm8pOworICB9CisKKyAgdm9pZCBzZXRBcmd1bWVudCh1bnNpZ25lZCBBcmdObywgVmFsdWUqIG5ld1ZhbCkgeworICAgIGFzc2VydChnZXRJbnN0cnVjdGlvbigpICYmICJOb3QgYSBjYWxsIG9yIGludm9rZSBpbnN0cnVjdGlvbiEiKTsKKyAgICBhc3NlcnQoYXJnX2JlZ2luKCkgKyBBcmdObyA8IGFyZ19lbmQoKSAmJiAiQXJndW1lbnQgIyBvdXQgb2YgcmFuZ2UhIik7CisgICAgZ2V0SW5zdHJ1Y3Rpb24oKS0+c2V0T3BlcmFuZChBcmdObywgbmV3VmFsKTsKKyAgfQorCisgIC8vLyBHaXZlbiBhIHZhbHVlIHVzZSBpdGVyYXRvciwgcmV0dXJucyB0aGUgYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBpdC4KKyAgLy8vIEl0ZXJhdG9yIG11c3QgYWN0dWFsbHkgY29ycmVzcG9uZCB0byBhbiBhcmd1bWVudC4KKyAgdW5zaWduZWQgZ2V0QXJndW1lbnRObyh2YWx1ZV91c2VfaXRlcmF0b3I8VXNlclR5PiBJKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEluc3RydWN0aW9uKCkgJiYgIk5vdCBhIGNhbGwgb3IgaW52b2tlIGluc3RydWN0aW9uISIpOworICAgIGFzc2VydChhcmdfYmVnaW4oKSA8PSAmSS5nZXRVc2UoKSAmJiAmSS5nZXRVc2UoKSA8IGFyZ19lbmQoKQorICAgICAgICAgICAmJiAiQXJndW1lbnQgIyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuICZJLmdldFVzZSgpIC0gYXJnX2JlZ2luKCk7CisgIH0KKworICAvLy8gYXJnX2l0ZXJhdG9yIC0gVGhlIHR5cGUgb2YgaXRlcmF0b3IgdG8gdXNlIHdoZW4gbG9vcGluZyBvdmVyIGFjdHVhbAorICAvLy8gYXJndW1lbnRzIGF0IHRoaXMgY2FsbCBzaXRlLi4uCisgIHR5cGVkZWYgSXRlclR5IGFyZ19pdGVyYXRvcjsKKworICAvLy8gYXJnX2JlZ2luL2FyZ19lbmQgLSBSZXR1cm4gaXRlcmF0b3JzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFjdHVhbCBhcmd1bWVudAorICAvLy8gbGlzdCBmb3IgYSBjYWxsIHNpdGUuCisgIEl0ZXJUeSBhcmdfYmVnaW4oKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEluc3RydWN0aW9uKCkgJiYgIk5vdCBhIGNhbGwgb3IgaW52b2tlIGluc3RydWN0aW9uISIpOworICAgIC8vIFNraXAgbm9uLWFyZ3VtZW50cworICAgIHJldHVybiAoKnRoaXMpLT5vcF9iZWdpbigpOworICB9CisKKyAgSXRlclR5IGFyZ19lbmQoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpLT5vcF9lbmQoKSAtIGdldEFyZ3VtZW50RW5kT2Zmc2V0KCk7IH0KKyAgYm9vbCBhcmdfZW1wdHkoKSBjb25zdCB7IHJldHVybiBhcmdfZW5kKCkgPT0gYXJnX2JlZ2luKCk7IH0KKyAgdW5zaWduZWQgYXJnX3NpemUoKSBjb25zdCB7IHJldHVybiB1bnNpZ25lZChhcmdfZW5kKCkgLSBhcmdfYmVnaW4oKSk7IH0KKyAgCisgIC8vLyBnZXRUeXBlIC0gUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGdlbmVyYXRlZCB0aGlzIGNhbGwgc2l0ZQorICAvLy8KKyAgY29uc3QgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuICgqdGhpcyktPmdldFR5cGUoKTsgfQorCisgIC8vLyBnZXRDYWxsZXIgLSBSZXR1cm4gdGhlIGNhbGxlciBmdW5jdGlvbiBmb3IgdGhpcyBjYWxsIHNpdGUKKyAgLy8vCisgIEZ1blR5ICpnZXRDYWxsZXIoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7IH0KKworI2RlZmluZSBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoTUVUSE9EKSBcCisgIEluc3RyVHkgKklJID0gZ2V0SW5zdHJ1Y3Rpb24oKTsgICAgXAorICByZXR1cm4gY2FzdDxDYWxsSW5zdD4oSUkpLT5NRVRIT0QKKworI2RlZmluZSBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoTUVUSE9EKSBcCisgIEluc3RyVHkgKklJID0gZ2V0SW5zdHJ1Y3Rpb24oKTsgICAgXAorICBjYXN0PENhbGxJbnN0PihJSSktPk1FVEhPRDsKKworICAvLy8gZ2V0Q2FsbGluZ0NvbnYvc2V0Q2FsbGluZ0NvbnYgLSBnZXQgb3Igc2V0IHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgdGhlCisgIC8vLyBjYWxsLgorICBDYWxsaW5nQ29udjo6SUQgZ2V0Q2FsbGluZ0NvbnYoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldENhbGxpbmdDb252KCkpOworICB9CisgIHZvaWQgc2V0Q2FsbGluZ0NvbnYoQ2FsbGluZ0NvbnY6OklEIENDKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldENhbGxpbmdDb252KENDKSk7CisgIH0KKworICAvLy8gZ2V0QXR0cmlidXRlcy9zZXRBdHRyaWJ1dGVzIC0gZ2V0IG9yIHNldCB0aGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgb2YKKyAgLy8vIHRoZSBjYWxsLgorICBjb25zdCBBdHRyTGlzdFB0ciAmZ2V0QXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0QXR0cmlidXRlcygpKTsKKyAgfQorICB2b2lkIHNldEF0dHJpYnV0ZXMoY29uc3QgQXR0ckxpc3RQdHIgJlBBTCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRBdHRyaWJ1dGVzKFBBTCkpOworICB9CisKKyAgLy8vIHBhcmFtSGFzQXR0ciAtIHdoZXRoZXIgdGhlIGNhbGwgb3IgdGhlIGNhbGxlZSBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgYm9vbCBwYXJhbUhhc0F0dHIodWludDE2X3QgaSwgQXR0cmlidXRlcyBhdHRyKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKHBhcmFtSGFzQXR0cihpLCBhdHRyKSk7CisgIH0KKworICAvLy8gQGJyaWVmIEV4dHJhY3QgdGhlIGFsaWdubWVudCBmb3IgYSBjYWxsIG9yIHBhcmFtZXRlciAoMD11bmtub3duKS4KKyAgdWludDE2X3QgZ2V0UGFyYW1BbGlnbm1lbnQodWludDE2X3QgaSkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRQYXJhbUFsaWdubWVudChpKSk7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBjYWxsIHNob3VsZCBub3QgYmUgaW5saW5lZC4KKyAgYm9vbCBpc05vSW5saW5lKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihpc05vSW5saW5lKCkpOworICB9CisgIHZvaWQgc2V0SXNOb0lubGluZShib29sIFZhbHVlID0gdHJ1ZSkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRJc05vSW5saW5lKFZhbHVlKSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgY2FsbCBkb2VzIG5vdCBhY2Nlc3MgbWVtb3J5LgorICBib29sIGRvZXNOb3RBY2Nlc3NNZW1vcnkoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGRvZXNOb3RBY2Nlc3NNZW1vcnkoKSk7CisgIH0KKyAgdm9pZCBzZXREb2VzTm90QWNjZXNzTWVtb3J5KGJvb2wgZG9lc05vdEFjY2Vzc01lbW9yeSA9IHRydWUpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0RG9lc05vdEFjY2Vzc01lbW9yeShkb2VzTm90QWNjZXNzTWVtb3J5KSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgY2FsbCBkb2VzIG5vdCBhY2Nlc3Mgb3Igb25seSByZWFkcyBtZW1vcnkuCisgIGJvb2wgb25seVJlYWRzTWVtb3J5KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihvbmx5UmVhZHNNZW1vcnkoKSk7CisgIH0KKyAgdm9pZCBzZXRPbmx5UmVhZHNNZW1vcnkoYm9vbCBvbmx5UmVhZHNNZW1vcnkgPSB0cnVlKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldE9ubHlSZWFkc01lbW9yeShvbmx5UmVhZHNNZW1vcnkpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGNhbm5vdCByZXR1cm4uCisgIGJvb2wgZG9lc05vdFJldHVybigpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZG9lc05vdFJldHVybigpKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RSZXR1cm4oYm9vbCBkb2VzTm90UmV0dXJuID0gdHJ1ZSkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXREb2VzTm90UmV0dXJuKGRvZXNOb3RSZXR1cm4pKTsKKyAgfQorCisjdW5kZWYgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSCisjdW5kZWYgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSCisKKyAgLy8vIGhhc0FyZ3VtZW50IC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgQ2FsbFNpdGUgcGFzc2VzIHRoZSBnaXZlbiBWYWx1ZSogYXMgYW4KKyAgLy8vIGFyZ3VtZW50IHRvIHRoZSBjYWxsZWQgZnVuY3Rpb24uCisgIGJvb2wgaGFzQXJndW1lbnQoY29uc3QgVmFsdWUgKkFyZykgY29uc3QgeworICAgIGZvciAoYXJnX2l0ZXJhdG9yIEFJID0gdGhpcy0+YXJnX2JlZ2luKCksIEUgPSB0aGlzLT5hcmdfZW5kKCk7IEFJICE9IEU7CisgICAgICAgICArK0FJKQorICAgICAgaWYgKEFJLT5nZXQoKSA9PSBBcmcpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBnZXRBcmd1bWVudEVuZE9mZnNldCgpIGNvbnN0IHsKKyAgICBpZiAoaXNDYWxsKCkpCisgICAgICByZXR1cm4gMTsgLy8gU2tpcCBDYWxsZWUKKyAgICBlbHNlCisgICAgICByZXR1cm4gMzsgLy8gU2tpcCBCQiwgQkIsIENhbGxlZQorICB9CisKKyAgSXRlclR5IGdldENhbGxlZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDYWxsSW5zdD4oZ2V0SW5zdHJ1Y3Rpb24oKSktPm9wX2VuZCgpIC0gMTsKKyAgfQorfTsKKworY2xhc3MgQ2FsbFNpdGUgOiBwdWJsaWMgQ2FsbFNpdGVCYXNlPEZ1bmN0aW9uLCBWYWx1ZSwgVXNlciwgSW5zdHJ1Y3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEluc3QsIFVzZXI6Om9wX2l0ZXJhdG9yPiB7CisgIHR5cGVkZWYgQ2FsbFNpdGVCYXNlPEZ1bmN0aW9uLCBWYWx1ZSwgVXNlciwgSW5zdHJ1Y3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIENhbGxJbnN0LCBVc2VyOjpvcF9pdGVyYXRvcj4gQmFzZTsKK3B1YmxpYzoKKyAgQ2FsbFNpdGUoKSB7fQorICBDYWxsU2l0ZShCYXNlIEIpIDogQmFzZShCKSB7fQorICBDYWxsU2l0ZShWYWx1ZSogVikgOiBCYXNlKFYpIHt9CisgIENhbGxTaXRlKENhbGxJbnN0ICpDSSkgOiBCYXNlKENJKSB7fQorICBDYWxsU2l0ZShJbnN0cnVjdGlvbiAqSUkpIDogQmFzZShJSSkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2FsbFNpdGUgJkNTKSBjb25zdCB7IHJldHVybiBJID09IENTLkk7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENhbGxTaXRlICZDUykgY29uc3QgeyByZXR1cm4gSSAhPSBDUy5JOyB9CisKKyAgLy8vIENhbGxTaXRlOjpnZXQgLSBUaGlzIHN0YXRpYyBtZXRob2QgaXMgc29ydCBvZiBsaWtlIGEgY29uc3RydWN0b3IuICBJdCB3aWxsCisgIC8vLyBjcmVhdGUgYW4gYXBwcm9wcmlhdGUgY2FsbCBzaXRlIGZvciBhIENhbGwgb3IgSW52b2tlIGluc3RydWN0aW9uLCBidXQgaXQKKyAgLy8vIGNhbiBhbHNvIGNyZWF0ZSBhIG51bGwgaW5pdGlhbGl6ZWQgQ2FsbFNpdGUgb2JqZWN0IGZvciBzb21ldGhpbmcgd2hpY2ggaXMKKyAgLy8vIE5PVCBhIGNhbGwgc2l0ZS4KKyAgLy8vCisgIHN0YXRpYyBDYWxsU2l0ZSBnZXQoVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gQmFzZTo6Z2V0KFYpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ2FsbFNpdGUgJkNTKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluc3RydWN0aW9uKCkgPCBDUy5nZXRJbnN0cnVjdGlvbigpOworICB9CisKK3ByaXZhdGU6CisgIFVzZXI6Om9wX2l0ZXJhdG9yIGdldENhbGxlZSgpIGNvbnN0OworfTsKKworLy8vIEltbXV0YWJsZUNhbGxTaXRlIC0gZXN0YWJsaXNoIGEgdmlldyB0byBhIGNhbGwgc2l0ZSBmb3IgZXhhbWluYXRpb24KK2NsYXNzIEltbXV0YWJsZUNhbGxTaXRlIDogcHVibGljIENhbGxTaXRlQmFzZTw+IHsKKyAgdHlwZWRlZiBDYWxsU2l0ZUJhc2U8PiBCYXNlOworcHVibGljOgorICBJbW11dGFibGVDYWxsU2l0ZShjb25zdCBWYWx1ZSogVikgOiBCYXNlKFYpIHt9CisgIEltbXV0YWJsZUNhbGxTaXRlKGNvbnN0IENhbGxJbnN0ICpDSSkgOiBCYXNlKENJKSB7fQorICBJbW11dGFibGVDYWxsU2l0ZShjb25zdCBJbnN0cnVjdGlvbiAqSUkpIDogQmFzZShJSSkge30KKyAgSW1tdXRhYmxlQ2FsbFNpdGUoQ2FsbFNpdGUgQ1MpIDogQmFzZShDUy5nZXRJbnN0cnVjdGlvbigpKSB7fQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DYXN0aW5nLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DYXN0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjN2ViNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Nhc3RpbmcuaApAQCAtMCwwICsxLDI0NCBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIC0gQWxsb3cgZmxleGlibGUsIGNoZWNrZWQsIGNhc3RzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaXNhPFg+KCksIGNhc3Q8WD4oKSwgZHluX2Nhc3Q8WD4oKSwgY2FzdF9vcl9udWxsPFg+KCksCisvLyBhbmQgZHluX2Nhc3Rfb3JfbnVsbDxYPigpIHRlbXBsYXRlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DQVNUSU5HX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NBU1RJTkdfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGlzYTx4PiBTdXBwb3J0IFRlbXBsYXRlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGU8dHlwZW5hbWUgRnJvbUNsPiBzdHJ1Y3QgaXNhX2ltcGxfY2w7CisKKy8vIERlZmluZSBhIHRlbXBsYXRlIHRoYXQgY2FuIGJlIHNwZWNpYWxpemVkIGJ5IHNtYXJ0IHBvaW50ZXJzIHRvIHJlZmxlY3QgdGhlCisvLyBmYWN0IHRoYXQgdGhleSBhcmUgYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZWQsIGFuZCBhcmUgbm90IGludm9sdmVkIHdpdGggdGhlCisvLyB0ZW1wbGF0ZSBzZWxlY3Rpb24gcHJvY2Vzcy4uLiAgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYSBub29wLgorLy8KK3RlbXBsYXRlPHR5cGVuYW1lIEZyb20+IHN0cnVjdCBzaW1wbGlmeV90eXBlIHsKKyAgdHlwZWRlZiAgICAgICBGcm9tIFNpbXBsZVR5cGU7ICAgICAgICAvLyBUaGUgcmVhbCB0eXBlIHRoaXMgcmVwcmVzZW50cy4uLgorCisgIC8vIEFuIGFjY2Vzc29yIHRvIGdldCB0aGUgcmVhbCB2YWx1ZS4uLgorICBzdGF0aWMgU2ltcGxlVHlwZSAmZ2V0U2ltcGxpZmllZFZhbHVlKEZyb20gJlZhbCkgeyByZXR1cm4gVmFsOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGcm9tPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBGcm9tPiB7CisgIHR5cGVkZWYgY29uc3QgRnJvbSBTaW1wbGVUeXBlOworICBzdGF0aWMgU2ltcGxlVHlwZSAmZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IEZyb20gJlZhbCkgeworICAgIHJldHVybiBzaW1wbGlmeV90eXBlPEZyb20+OjpnZXRTaW1wbGlmaWVkVmFsdWUoc3RhdGljX2Nhc3Q8RnJvbSY+KFZhbCkpOworICB9Cit9OworCisKKy8vIGlzYTxYPiAtIFJldHVybiB0cnVlIGlmIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIHRlbXBsYXRlIGlzIGFuIGluc3RhbmNlIG9mIHRoZQorLy8gdGVtcGxhdGUgdHlwZSBhcmd1bWVudC4gIFVzZWQgbGlrZSB0aGlzOgorLy8KKy8vICBpZiAoaXNhPFR5cGUqPihteVZhbCkpIHsgLi4uIH0KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+CitzdHJ1Y3QgaXNhX2ltcGwgeworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBGcm9tICZWYWwpIHsKKyAgICByZXR1cm4gVG86OmNsYXNzb2YoJlZhbCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBTaW1wbGVUeXBlPgorc3RydWN0IGlzYV9pbXBsX3dyYXAgeworICAvLyBXaGVuIEZyb20gIT0gU2ltcGxpZmllZFR5cGUsIHdlIGNhbiBzaW1wbGlmeSB0aGUgdHlwZSBzb21lIG1vcmUgYnkgdXNpbmcKKyAgLy8gdGhlIHNpbXBsaWZ5X3R5cGUgdGVtcGxhdGUuCisgIHN0YXRpYyBib29sIGRvaXQoY29uc3QgRnJvbSAmVmFsKSB7CisgICAgcmV0dXJuIGlzYV9pbXBsX2NsPGNvbnN0IFNpbXBsZVR5cGU+Ojp0ZW1wbGF0ZQorICAgICAgICAgICAgICAgICAgICBpc2E8VG8+KHNpbXBsaWZ5X3R5cGU8Y29uc3QgRnJvbT46OmdldFNpbXBsaWZpZWRWYWx1ZShWYWwpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb21UeT4KK3N0cnVjdCBpc2FfaW1wbF93cmFwPFRvLCBjb25zdCBGcm9tVHksIGNvbnN0IEZyb21UeT4geworICAvLyBXaGVuIEZyb20gPT0gU2ltcGxlVHlwZSwgd2UgYXJlIGFzIHNpbXBsZSBhcyB3ZSBhcmUgZ29pbmcgdG8gZ2V0LgorICBzdGF0aWMgYm9vbCBkb2l0KGNvbnN0IEZyb21UeSAmVmFsKSB7CisgICAgcmV0dXJuIGlzYV9pbXBsPFRvLEZyb21UeT46OmRvaXQoVmFsKTsKKyAgfQorfTsKKworLy8gaXNhX2ltcGxfY2wgLSBVc2UgY2xhc3MgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB0byB0cmFuc2Zvcm0gdHlwZXMgdG8gYSBzaW5nbGUKKy8vIGNhbm9uaWNhbCBmb3JtIGZvciBpc2FfaW1wbC4KKy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBGcm9tQ2w+CitzdHJ1Y3QgaXNhX2ltcGxfY2wgeworICB0ZW1wbGF0ZTxjbGFzcyBUb0NsPgorICBzdGF0aWMgYm9vbCBpc2EoY29uc3QgRnJvbUNsICZWYWwpIHsKKyAgICByZXR1cm4gaXNhX2ltcGxfd3JhcDxUb0NsLGNvbnN0IEZyb21DbCwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzaW1wbGlmeV90eXBlPGNvbnN0IEZyb21DbD46OlNpbXBsZVR5cGU+Ojpkb2l0KFZhbCk7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemF0aW9uIHVzZWQgdG8gc3RyaXAgY29uc3QgcXVhbGlmaWVycyBvZmYgb2YgdGhlIEZyb21DbCB0eXBlLi4uCit0ZW1wbGF0ZTx0eXBlbmFtZSBGcm9tQ2w+CitzdHJ1Y3QgaXNhX2ltcGxfY2w8Y29uc3QgRnJvbUNsPiB7CisgIHRlbXBsYXRlPGNsYXNzIFRvQ2w+CisgIHN0YXRpYyBib29sIGlzYShjb25zdCBGcm9tQ2wgJlZhbCkgeworICAgIHJldHVybiBpc2FfaW1wbF9jbDxGcm9tQ2w+Ojp0ZW1wbGF0ZSBpc2E8VG9DbD4oVmFsKTsKKyAgfQorfTsKKworLy8gRGVmaW5lIHBvaW50ZXIgdHJhaXRzIGluIHRlcm1zIG9mIGJhc2UgdHJhaXRzLi4uCit0ZW1wbGF0ZTxjbGFzcyBGcm9tQ2w+CitzdHJ1Y3QgaXNhX2ltcGxfY2w8RnJvbUNsKj4geworICB0ZW1wbGF0ZTxjbGFzcyBUb0NsPgorICBzdGF0aWMgYm9vbCBpc2EoRnJvbUNsICpWYWwpIHsKKyAgICByZXR1cm4gaXNhX2ltcGxfY2w8RnJvbUNsPjo6dGVtcGxhdGUgaXNhPFRvQ2w+KCpWYWwpOworICB9Cit9OworCisvLyBEZWZpbmUgcmVmZXJlbmNlIHRyYWl0cyBpbiB0ZXJtcyBvZiBiYXNlIHRyYWl0cy4uLgordGVtcGxhdGU8Y2xhc3MgRnJvbUNsPgorc3RydWN0IGlzYV9pbXBsX2NsPEZyb21DbCY+IHsKKyAgdGVtcGxhdGU8Y2xhc3MgVG9DbD4KKyAgc3RhdGljIGJvb2wgaXNhKEZyb21DbCAmVmFsKSB7CisgICAgcmV0dXJuIGlzYV9pbXBsX2NsPEZyb21DbD46OnRlbXBsYXRlIGlzYTxUb0NsPigmVmFsKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgYm9vbCBpc2EoY29uc3QgWSAmVmFsKSB7CisgIHJldHVybiBpc2FfaW1wbF9jbDxZPjo6dGVtcGxhdGUgaXNhPFg+KFZhbCk7Cit9CisKKyNkZWZpbmUgSVNBX0lOVk9LRV9JTlNUKEkpIGZhbHNlCisjZGVmaW5lIElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJKSBmYWxzZQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8eD4gU3VwcG9ydCBUZW1wbGF0ZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPiBzdHJ1Y3QgY2FzdF9yZXR0eTsKKworCisvLyBDYWxjdWxhdGUgd2hhdCB0eXBlIHRoZSAnY2FzdCcgZnVuY3Rpb24gc2hvdWxkIHJldHVybiwgYmFzZWQgb24gYSByZXF1ZXN0ZWQKKy8vIHR5cGUgb2YgVG8gYW5kIGEgc291cmNlIHR5cGUgb2YgRnJvbS4KK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPiBzdHJ1Y3QgY2FzdF9yZXR0eV9pbXBsIHsKKyAgdHlwZWRlZiBUbyYgcmV0X3R5cGU7ICAgICAgICAgLy8gTm9ybWFsIGNhc2UsIHJldHVybiBUeSYKK307Cit0ZW1wbGF0ZTxjbGFzcyBUbywgY2xhc3MgRnJvbT4gc3RydWN0IGNhc3RfcmV0dHlfaW1wbDxUbywgY29uc3QgRnJvbT4geworICB0eXBlZGVmIGNvbnN0IFRvICZyZXRfdHlwZTsgICAvLyBOb3JtYWwgY2FzZSwgcmV0dXJuIFR5JgorfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+IHN0cnVjdCBjYXN0X3JldHR5X2ltcGw8VG8sIEZyb20qPiB7CisgIHR5cGVkZWYgVG8qIHJldF90eXBlOyAgICAgICAgIC8vIFBvaW50ZXIgYXJnIGNhc2UsIHJldHVybiBUeSoKK307CisKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPiBzdHJ1Y3QgY2FzdF9yZXR0eV9pbXBsPFRvLCBjb25zdCBGcm9tKj4geworICB0eXBlZGVmIGNvbnN0IFRvKiByZXRfdHlwZTsgICAvLyBDb25zdGFudCBwb2ludGVyIGFyZyBjYXNlLCByZXR1cm4gY29uc3QgVHkqCit9OworCit0ZW1wbGF0ZTxjbGFzcyBUbywgY2xhc3MgRnJvbT4gc3RydWN0IGNhc3RfcmV0dHlfaW1wbDxUbywgY29uc3QgRnJvbSpjb25zdD4geworICB0eXBlZGVmIGNvbnN0IFRvKiByZXRfdHlwZTsgICAvLyBDb25zdGFudCBwb2ludGVyIGFyZyBjYXNlLCByZXR1cm4gY29uc3QgVHkqCit9OworCisKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tLCBjbGFzcyBTaW1wbGVGcm9tPgorc3RydWN0IGNhc3RfcmV0dHlfd3JhcCB7CisgIC8vIFdoZW4gdGhlIHNpbXBsaWZpZWQgdHlwZSBhbmQgdGhlIGZyb20gdHlwZSBhcmUgbm90IHRoZSBzYW1lLCB1c2UgdGhlIHR5cGUKKyAgLy8gc2ltcGxpZmllciB0byByZWR1Y2UgdGhlIHR5cGUsIHRoZW4gcmV1c2UgY2FzdF9yZXR0eV9pbXBsIHRvIGdldCB0aGUKKyAgLy8gcmVzdWx0YW50IHR5cGUuCisgIHR5cGVkZWYgdHlwZW5hbWUgY2FzdF9yZXR0eTxUbywgU2ltcGxlRnJvbT46OnJldF90eXBlIHJldF90eXBlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb21UeT4KK3N0cnVjdCBjYXN0X3JldHR5X3dyYXA8VG8sIEZyb21UeSwgRnJvbVR5PiB7CisgIC8vIFdoZW4gdGhlIHNpbXBsaWZpZWQgdHlwZSBpcyBlcXVhbCB0byB0aGUgZnJvbSB0eXBlLCB1c2UgaXQgZGlyZWN0bHkuCisgIHR5cGVkZWYgdHlwZW5hbWUgY2FzdF9yZXR0eV9pbXBsPFRvLEZyb21UeT46OnJldF90eXBlIHJldF90eXBlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+CitzdHJ1Y3QgY2FzdF9yZXR0eSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgY2FzdF9yZXR0eV93cmFwPFRvLCBGcm9tLAorICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8RnJvbT46OlNpbXBsZVR5cGU+OjpyZXRfdHlwZSByZXRfdHlwZTsKK307CisKKy8vIEVuc3VyZSB0aGUgbm9uLXNpbXBsZSB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB1c2luZyB0aGUgc2ltcGxpZnlfdHlwZSB0ZW1wbGF0ZQorLy8gdGhhdCBtYXkgYmUgc3BlY2lhbGl6ZWQgYnkgc21hcnQgcG9pbnRlcnMuLi4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBUbywgY2xhc3MgRnJvbSwgY2xhc3MgU2ltcGxlRnJvbT4gc3RydWN0IGNhc3RfY29udmVydF92YWwgeworICAvLyBUaGlzIGlzIG5vdCBhIHNpbXBsZSB0eXBlLCB1c2UgdGhlIHRlbXBsYXRlIHRvIHNpbXBsaWZ5IGl0Li4uCisgIHN0YXRpYyB0eXBlbmFtZSBjYXN0X3JldHR5PFRvLCBGcm9tPjo6cmV0X3R5cGUgZG9pdChjb25zdCBGcm9tICZWYWwpIHsKKyAgICByZXR1cm4gY2FzdF9jb252ZXJ0X3ZhbDxUbywgU2ltcGxlRnJvbSwKKyAgICAgIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8U2ltcGxlRnJvbT46OlNpbXBsZVR5cGU+Ojpkb2l0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGlmeV90eXBlPEZyb20+OjpnZXRTaW1wbGlmaWVkVmFsdWUoVmFsKSk7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tVHk+IHN0cnVjdCBjYXN0X2NvbnZlcnRfdmFsPFRvLEZyb21UeSxGcm9tVHk+IHsKKyAgLy8gVGhpcyBfaXNfIGEgc2ltcGxlIHR5cGUsIGp1c3QgY2FzdCBpdC4KKyAgc3RhdGljIHR5cGVuYW1lIGNhc3RfcmV0dHk8VG8sIEZyb21UeT46OnJldF90eXBlIGRvaXQoY29uc3QgRnJvbVR5ICZWYWwpIHsKKyAgICB0eXBlbmFtZSBjYXN0X3JldHR5PFRvLCBGcm9tVHk+OjpyZXRfdHlwZSBSZXMyCisgICAgID0gKHR5cGVuYW1lIGNhc3RfcmV0dHk8VG8sIEZyb21UeT46OnJldF90eXBlKWNvbnN0X2Nhc3Q8RnJvbVR5Jj4oVmFsKTsKKyAgICByZXR1cm4gUmVzMjsKKyAgfQorfTsKKworCisKKy8vIGNhc3Q8WD4gLSBSZXR1cm4gdGhlIGFyZ3VtZW50IHBhcmFtZXRlciBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gIFRoaXMKKy8vIGNhc3Rpbmcgb3BlcmF0b3IgYXNzZXJ0cyB0aGF0IHRoZSB0eXBlIGlzIGNvcnJlY3QsIHNvIGl0IGRvZXMgbm90IHJldHVybiBudWxsCisvLyBvbiBmYWlsdXJlLiAgQnV0IGl0IHdpbGwgY29ycmVjdGx5IHJldHVybiBOVUxMIHdoZW4gdGhlIGlucHV0IGlzIE5VTEwuCisvLyBVc2VkIExpa2UgdGhpczoKKy8vCisvLyAgY2FzdDxJbnN0cnVjdGlvbj4obXlWYWwpLT5nZXRQYXJlbnQoKQorLy8KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgWT46OnJldF90eXBlIGNhc3QoY29uc3QgWSAmVmFsKSB7CisgIGFzc2VydChpc2E8WD4oVmFsKSAmJiAiY2FzdDxUeT4oKSBhcmd1bWVudCBvZiBpbmNvbXBhdGlibGUgdHlwZSEiKTsKKyAgcmV0dXJuIGNhc3RfY29udmVydF92YWw8WCwgWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc2ltcGxpZnlfdHlwZTxZPjo6U2ltcGxlVHlwZT46OmRvaXQoVmFsKTsKK30KKworLy8gY2FzdF9vcl9udWxsPFg+IC0gRnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byBjYXN0LCBleGNlcHQgdGhhdCBhIG51bGwgdmFsdWUgaXMKKy8vIGFjY2VwdGVkLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgWSo+OjpyZXRfdHlwZSBjYXN0X29yX251bGwoWSAqVmFsKSB7CisgIGlmIChWYWwgPT0gMCkgcmV0dXJuIDA7CisgIGFzc2VydChpc2E8WD4oVmFsKSAmJiAiY2FzdF9vcl9udWxsPFR5PigpIGFyZ3VtZW50IG9mIGluY29tcGF0aWJsZSB0eXBlISIpOworICByZXR1cm4gY2FzdDxYPihWYWwpOworfQorCisKKy8vIGR5bl9jYXN0PFg+IC0gUmV0dXJuIHRoZSBhcmd1bWVudCBwYXJhbWV0ZXIgY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuICBUaGlzCisvLyBjYXN0aW5nIG9wZXJhdG9yIHJldHVybnMgbnVsbCBpZiB0aGUgYXJndW1lbnQgaXMgb2YgdGhlIHdyb25nIHR5cGUsIHNvIGl0IGNhbgorLy8gYmUgdXNlZCB0byB0ZXN0IGZvciBhIHR5cGUgYXMgd2VsbCBhcyBjYXN0IGlmIHN1Y2Nlc3NmdWwuICBUaGlzIHNob3VsZCBiZQorLy8gdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhbiBpZiBzdGF0ZW1lbnQgbGlrZSB0aGlzOgorLy8KKy8vICBpZiAoY29uc3QgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4obXlWYWwpKSB7IC4uLiB9CisvLworCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK2lubGluZSB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIFk+OjpyZXRfdHlwZSBkeW5fY2FzdChjb25zdCBZICZWYWwpIHsKKyAgcmV0dXJuIGlzYTxYPihWYWwpID8gY2FzdDxYLCBZPihWYWwpIDogMDsKK30KKworLy8gZHluX2Nhc3Rfb3JfbnVsbDxYPiAtIEZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gZHluX2Nhc3QsIGV4Y2VwdCB0aGF0IGEgbnVsbAorLy8gdmFsdWUgaXMgYWNjZXB0ZWQuCisvLwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBZPjo6cmV0X3R5cGUgZHluX2Nhc3Rfb3JfbnVsbChjb25zdCBZICZWYWwpIHsKKyAgcmV0dXJuIChWYWwgJiYgaXNhPFg+KFZhbCkpID8gY2FzdDxYLCBZPihWYWwpIDogMDsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWUzZDZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaApAQCAtMCwwICsxLDEzOTEgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCAtIENvbW1hbmQgbGluZSBoYW5kbGVyIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NvciB0aGF0IGlzIHVzZWZ1bCB3aGVuCisvLyBjcmVhdGluZyBhIHRvb2wuICBJdCBwcm92aWRlcyBhIHNpbXBsZSwgbWluaW1hbGlzdGljIGludGVyZmFjZSB0aGF0IGlzIGVhc2lseQorLy8gZXh0ZW5zaWJsZSBhbmQgc3VwcG9ydHMgbm9ubG9jYWwgKGxpYnJhcnkpIGNvbW1hbmQgbGluZSBvcHRpb25zLgorLy8KKy8vIE5vdGUgdGhhdCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZmlndXJlIG91dCB3aGF0IHRoaXMgY29kZSBkb2VzLCB5b3Ugc2hvdWxkCisvLyByZWFkIHRoZSBsaWJyYXJ5IGRvY3VtZW50YXRpb24gbG9jYXRlZCBpbiBkb2NzL0NvbW1hbmRMaW5lLmh0bWwgb3IgbG9va3MgYXQKKy8vIHRoZSBtYW55IGV4YW1wbGUgdXNhZ2VzIGluIHRvb2xzLyovKi5jcHAKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DT01NQU5ETElORV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DT01NQU5ETElORV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIGNsIE5hbWVzcGFjZSAtIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCBvZiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbgorLy8vIHByb2Nlc3NpbmcgbWFjaGluZXJ5LiAgSXQgaXMgaW50ZW50aW9uYWxseSBhIHNob3J0IG5hbWUgdG8gbWFrZSBxdWFsaWZpZWQKKy8vLyB1c2FnZSBjb25jaXNlLgorbmFtZXNwYWNlIGNsIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhcnNlQ29tbWFuZExpbmVPcHRpb25zIC0gQ29tbWFuZCBsaW5lIG9wdGlvbiBwcm9jZXNzaW5nIGVudHJ5IHBvaW50LgorLy8KK3ZvaWQgUGFyc2VDb21tYW5kTGluZU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpPdmVydmlldyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVhZFJlc3BvbnNlRmlsZXMgPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXJzZUVudmlyb25tZW50T3B0aW9ucyAtIEVudmlyb25tZW50IHZhcmlhYmxlIG9wdGlvbiBwcm9jZXNzaW5nIGFsdGVybmF0ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSBwb2ludC4KKy8vCit2b2lkIFBhcnNlRW52aXJvbm1lbnRPcHRpb25zKGNvbnN0IGNoYXIgKnByb2dOYW1lLCBjb25zdCBjaGFyICplbnZ2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk92ZXJ2aWV3ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWFkUmVzcG9uc2VGaWxlcyA9IGZhbHNlKTsKKworLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBTZXRWZXJzaW9uUHJpbnRlciAtIE92ZXJyaWRlIHRoZSBkZWZhdWx0IChMTFZNIHNwZWNpZmljKSB2ZXJzaW9uIHByaW50ZXIKKy8vLyAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gcHJpbnQgb3V0IHRoZSB2ZXJzaW9uIHdoZW4gLS12ZXJzaW9uIGlzIGdpdmVuCisvLy8gICAgICAgICAgICAgICAgICAgICBvbiB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIGFsbG93cyBvdGhlciBzeXN0ZW1zIHVzaW5nIHRoZQorLy8vICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmUgdXRpbGl0aWVzIHRvIHByaW50IHRoZWlyIG93biB2ZXJzaW9uIHN0cmluZy4KK3ZvaWQgU2V0VmVyc2lvblByaW50ZXIodm9pZCAoKmZ1bmMpKCkpOworCisKKy8vIE1hcmtPcHRpb25zQ2hhbmdlZCAtIEludGVybmFsIGhlbHBlciBmdW5jdGlvbi4KK3ZvaWQgTWFya09wdGlvbnNDaGFuZ2VkKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGbGFncyBwZXJtaXR0ZWQgdG8gYmUgcGFzc2VkIHRvIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKy8vCisKK2VudW0gTnVtT2NjdXJyZW5jZXNGbGFnIHsgICAgICAvLyBGbGFncyBmb3IgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBhbGxvd2VkCisgIE9wdGlvbmFsICAgICAgICA9IDB4MDEsICAgICAgLy8gWmVybyBvciBPbmUgb2NjdXJyZW5jZQorICBaZXJvT3JNb3JlICAgICAgPSAweDAyLCAgICAgIC8vIFplcm8gb3IgbW9yZSBvY2N1cnJlbmNlcyBhbGxvd2VkCisgIFJlcXVpcmVkICAgICAgICA9IDB4MDMsICAgICAgLy8gT25lIG9jY3VycmVuY2UgcmVxdWlyZWQKKyAgT25lT3JNb3JlICAgICAgID0gMHgwNCwgICAgICAvLyBPbmUgb3IgbW9yZSBvY2N1cnJlbmNlcyByZXF1aXJlZAorCisgIC8vIENvbnN1bWVBZnRlciAtIEluZGljYXRlcyB0aGF0IHRoaXMgb3B0aW9uIGlzIGZlZCBhbnl0aGluZyB0aGF0IGZvbGxvd3MgdGhlCisgIC8vIGxhc3QgcG9zaXRpb25hbCBhcmd1bWVudCByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24gKGl0IGlzIGFuIGVycm9yIGlmCisgIC8vIHRoZXJlIGFyZSB6ZXJvIHBvc2l0aW9uYWwgYXJndW1lbnRzLCBhbmQgYSBDb25zdW1lQWZ0ZXIgb3B0aW9uIGlzIHVzZWQpLgorICAvLyBUaHVzLCBmb3IgZXhhbXBsZSwgYWxsIGFyZ3VtZW50cyB0byBMTEkgYXJlIHByb2Nlc3NlZCB1bnRpbCBhIGZpbGVuYW1lIGlzCisgIC8vIGZvdW5kLiAgT25jZSBhIGZpbGVuYW1lIGlzIGZvdW5kLCBhbGwgb2YgdGhlIHN1Y2NlZWRpbmcgYXJndW1lbnRzIGFyZQorICAvLyBwYXNzZWQsIHVucHJvY2Vzc2VkLCB0byB0aGUgQ29uc3VtZUFmdGVyIG9wdGlvbi4KKyAgLy8KKyAgQ29uc3VtZUFmdGVyICAgID0gMHgwNSwKKworICBPY2N1cnJlbmNlc01hc2sgID0gMHgwNworfTsKKworZW51bSBWYWx1ZUV4cGVjdGVkIHsgICAgICAgICAgIC8vIElzIGEgdmFsdWUgcmVxdWlyZWQgZm9yIHRoZSBvcHRpb24/CisgIFZhbHVlT3B0aW9uYWwgICA9IDB4MDgsICAgICAgLy8gVGhlIHZhbHVlIGNhbiBhcHBlYXIuLi4gb3Igbm90CisgIFZhbHVlUmVxdWlyZWQgICA9IDB4MTAsICAgICAgLy8gVGhlIHZhbHVlIGlzIHJlcXVpcmVkIHRvIGFwcGVhciEKKyAgVmFsdWVEaXNhbGxvd2VkID0gMHgxOCwgICAgICAvLyBBIHZhbHVlIG1heSBub3QgYmUgc3BlY2lmaWVkIChmb3IgZmxhZ3MpCisgIFZhbHVlTWFzayAgICAgICA9IDB4MTgKK307CisKK2VudW0gT3B0aW9uSGlkZGVuIHsgICAgICAgICAgICAvLyBDb250cm9sIHdoZXRoZXIgLWhlbHAgc2hvd3MgdGhpcyBvcHRpb24KKyAgTm90SGlkZGVuICAgICAgID0gMHgyMCwgICAgICAvLyBPcHRpb24gaW5jbHVkZWQgaW4gLWhlbHAgJiAtaGVscC1oaWRkZW4KKyAgSGlkZGVuICAgICAgICAgID0gMHg0MCwgICAgICAvLyAtaGVscCBkb2Vzbid0LCBidXQgLWhlbHAtaGlkZGVuIGRvZXMKKyAgUmVhbGx5SGlkZGVuICAgID0gMHg2MCwgICAgICAvLyBOZWl0aGVyIC1oZWxwIG5vciAtaGVscC1oaWRkZW4gc2hvdyB0aGlzIGFyZworICBIaWRkZW5NYXNrICAgICAgPSAweDYwCit9OworCisvLyBGb3JtYXR0aW5nIGZsYWdzIC0gVGhpcyBjb250cm9scyBzcGVjaWFsIGZlYXR1cmVzIHRoYXQgdGhlIG9wdGlvbiBtaWdodCBoYXZlCisvLyB0aGF0IGNhdXNlIGl0IHRvIGJlIHBhcnNlZCBkaWZmZXJlbnRseS4uLgorLy8KKy8vIFByZWZpeCAtIFRoaXMgb3B0aW9uIGFsbG93cyBhcmd1bWVudHMgdGhhdCBhcmUgb3RoZXJ3aXNlIHVucmVjb2duaXplZCB0byBiZQorLy8gbWF0Y2hlZCBieSBvcHRpb25zIHRoYXQgYXJlIGEgcHJlZml4IG9mIHRoZSBhY3R1YWwgdmFsdWUuICBUaGlzIGlzIHVzZWZ1bCBmb3IKKy8vIGNhc2VzIGxpa2UgYSBsaW5rZXIsIHdoZXJlIG9wdGlvbnMgYXJlIHR5cGljYWxseSBvZiB0aGUgZm9ybSAnLWxmb28nIG9yCisvLyAnLUwuLi8uLi9pbmNsdWRlJyB3aGVyZSAtbCBvciAtTCBhcmUgdGhlIGFjdHVhbCBmbGFncy4gIFdoZW4gcHJlZml4IGlzCisvLyBlbmFibGVkLCBhbmQgdXNlZCwgdGhlIHZhbHVlIGZvciB0aGUgZmxhZyBjb21lcyBmcm9tIHRoZSBzdWZmaXggb2YgdGhlCisvLyBhcmd1bWVudC4KKy8vCisvLyBHcm91cGluZyAtIFdpdGggdGhpcyBvcHRpb24gZW5hYmxlZCwgbXVsdGlwbGUgbGV0dGVyIG9wdGlvbnMgYXJlIGFsbG93ZWQgdG8KKy8vIGJ1bmNoIHRvZ2V0aGVyIHdpdGggb25seSBhIHNpbmdsZSBoeXBoZW4gZm9yIHRoZSB3aG9sZSBncm91cC4gIFRoaXMgYWxsb3dzCisvLyBlbXVsYXRpb24gb2YgdGhlIGJlaGF2aW9yIHRoYXQgbHMgdXNlcyBmb3IgZXhhbXBsZTogbHMgLWxhID09PSBscyAtbCAtYQorLy8KKworZW51bSBGb3JtYXR0aW5nRmxhZ3MgeworICBOb3JtYWxGb3JtYXR0aW5nID0gMHgwMDAsICAgICAvLyBOb3RoaW5nIHNwZWNpYWwKKyAgUG9zaXRpb25hbCAgICAgICA9IDB4MDgwLCAgICAgLy8gSXMgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBubyAnLScgcmVxdWlyZWQKKyAgUHJlZml4ICAgICAgICAgICA9IDB4MTAwLCAgICAgLy8gQ2FuIHRoaXMgb3B0aW9uIGRpcmVjdGx5IHByZWZpeCBpdHMgdmFsdWU/CisgIEdyb3VwaW5nICAgICAgICAgPSAweDE4MCwgICAgIC8vIENhbiB0aGlzIG9wdGlvbiBncm91cCB3aXRoIG90aGVyIG9wdGlvbnM/CisgIEZvcm1hdHRpbmdNYXNrICAgPSAweDE4MCAgICAgIC8vIFVuaW9uIG9mIHRoZSBhYm92ZSBmbGFncy4KK307CisKK2VudW0gTWlzY0ZsYWdzIHsgICAgICAgICAgICAgICAvLyBNaXNjZWxsYW5lb3VzIGZsYWdzIHRvIGFkanVzdCBhcmd1bWVudAorICBDb21tYVNlcGFyYXRlZCAgICAgPSAweDIwMCwgIC8vIFNob3VsZCB0aGlzIGNsOjpsaXN0IHNwbGl0IGJldHdlZW4gY29tbWFzPworICBQb3NpdGlvbmFsRWF0c0FyZ3MgPSAweDQwMCwgIC8vIFNob3VsZCB0aGlzIHBvc2l0aW9uYWwgY2w6Omxpc3QgZWF0IC1hcmdzPworICBTaW5rICAgICAgICAgICAgICAgPSAweDgwMCwgIC8vIFNob3VsZCB0aGlzIGNsOjpsaXN0IGVhdCBhbGwgdW5rbm93biBvcHRpb25zPworICBNaXNjTWFzayAgICAgICAgICAgPSAweEUwMCAgIC8vIFVuaW9uIG9mIHRoZSBhYm92ZSBmbGFncy4KK307CisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gT3B0aW9uIEJhc2UgY2xhc3MKKy8vCitjbGFzcyBhbGlhczsKK2NsYXNzIE9wdGlvbiB7CisgIGZyaWVuZCBjbGFzcyBhbGlhczsKKworICAvLyBoYW5kbGVPY2N1cnJlbmNlcyAtIE92ZXJyaWRlbiBieSBzdWJjbGFzc2VzIHRvIGhhbmRsZSB0aGUgdmFsdWUgcGFzc2VkIGludG8KKyAgLy8gYW4gYXJndW1lbnQuICBTaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgdGhlCisgIC8vIGFyZ3VtZW50IGFuZCB0aGUgcHJvZ3JhbSBzaG91bGQgZXhpdC4KKyAgLy8KKyAgdmlydHVhbCBib29sIGhhbmRsZU9jY3VycmVuY2UodW5zaWduZWQgcG9zLCBTdHJpbmdSZWYgQXJnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZykgPSAwOworCisgIHZpcnR1YWwgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWVPcHRpb25hbDsKKyAgfQorCisgIC8vIE91dCBvZiBsaW5lIHZpcnR1YWwgZnVuY3Rpb24gdG8gcHJvdmlkZSBob21lIGZvciB0aGUgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBpbnQgTnVtT2NjdXJyZW5jZXM7ICAgICAvLyBUaGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZAorICBpbnQgRmxhZ3M7ICAgICAgICAgICAgICAvLyBGbGFncyBmb3IgdGhlIGFyZ3VtZW50CisgIHVuc2lnbmVkIFBvc2l0aW9uOyAgICAgIC8vIFBvc2l0aW9uIG9mIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgb3B0aW9uCisgIHVuc2lnbmVkIEFkZGl0aW9uYWxWYWxzOy8vIEdyZWF0ZXIgdGhhbiAwIGZvciBtdWx0aS12YWx1ZWQgb3B0aW9uLgorICBPcHRpb24gKk5leHRSZWdpc3RlcmVkOyAvLyBTaW5nbHkgbGlua2VkIGxpc3Qgb2YgcmVnaXN0ZXJlZCBvcHRpb25zLgorcHVibGljOgorICBjb25zdCBjaGFyICpBcmdTdHI7ICAgICAvLyBUaGUgYXJndW1lbnQgc3RyaW5nIGl0c2VsZiAoZXg6ICJoZWxwIiwgIm8iKQorICBjb25zdCBjaGFyICpIZWxwU3RyOyAgICAvLyBUaGUgZGVzY3JpcHRpdmUgdGV4dCBtZXNzYWdlIGZvciAtaGVscAorICBjb25zdCBjaGFyICpWYWx1ZVN0cjsgICAvLyBTdHJpbmcgZGVzY3JpYmluZyB3aGF0IHRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbiBpcworCisgIGlubGluZSBlbnVtIE51bU9jY3VycmVuY2VzRmxhZyBnZXROdW1PY2N1cnJlbmNlc0ZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGVudW0gTnVtT2NjdXJyZW5jZXNGbGFnPihGbGFncyAmIE9jY3VycmVuY2VzTWFzayk7CisgIH0KKyAgaW5saW5lIGVudW0gVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZygpIGNvbnN0IHsKKyAgICBpbnQgVkUgPSBGbGFncyAmIFZhbHVlTWFzazsKKyAgICByZXR1cm4gVkUgPyBzdGF0aWNfY2FzdDxlbnVtIFZhbHVlRXhwZWN0ZWQ+KFZFKQorICAgICAgICAgICAgICA6IGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpOworICB9CisgIGlubGluZSBlbnVtIE9wdGlvbkhpZGRlbiBnZXRPcHRpb25IaWRkZW5GbGFnKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxlbnVtIE9wdGlvbkhpZGRlbj4oRmxhZ3MgJiBIaWRkZW5NYXNrKTsKKyAgfQorICBpbmxpbmUgZW51bSBGb3JtYXR0aW5nRmxhZ3MgZ2V0Rm9ybWF0dGluZ0ZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGVudW0gRm9ybWF0dGluZ0ZsYWdzPihGbGFncyAmIEZvcm1hdHRpbmdNYXNrKTsKKyAgfQorICBpbmxpbmUgdW5zaWduZWQgZ2V0TWlzY0ZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmIE1pc2NNYXNrOworICB9CisgIGlubGluZSB1bnNpZ25lZCBnZXRQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIFBvc2l0aW9uOyB9CisgIGlubGluZSB1bnNpZ25lZCBnZXROdW1BZGRpdGlvbmFsVmFscygpIGNvbnN0IHsgcmV0dXJuIEFkZGl0aW9uYWxWYWxzOyB9CisKKyAgLy8gaGFzQXJnU3RyIC0gUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3N0ciAhPSAiIgorICBib29sIGhhc0FyZ1N0cigpIGNvbnN0IHsgcmV0dXJuIEFyZ1N0clswXSAhPSAwOyB9CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgIC8vIEFjY2Vzc29yIGZ1bmN0aW9ucyBzZXQgYnkgT3B0aW9uTW9kaWZpZXJzCisgIC8vCisgIHZvaWQgc2V0QXJnU3RyKGNvbnN0IGNoYXIgKlMpIHsgQXJnU3RyID0gUzsgfQorICB2b2lkIHNldERlc2NyaXB0aW9uKGNvbnN0IGNoYXIgKlMpIHsgSGVscFN0ciA9IFM7IH0KKyAgdm9pZCBzZXRWYWx1ZVN0cihjb25zdCBjaGFyICpTKSB7IFZhbHVlU3RyID0gUzsgfQorCisgIHZvaWQgc2V0RmxhZyh1bnNpZ25lZCBGbGFnLCB1bnNpZ25lZCBGbGFnTWFzaykgeworICAgIEZsYWdzICY9IH5GbGFnTWFzazsKKyAgICBGbGFncyB8PSBGbGFnOworICB9CisKKyAgdm9pZCBzZXROdW1PY2N1cnJlbmNlc0ZsYWcoZW51bSBOdW1PY2N1cnJlbmNlc0ZsYWcgVmFsKSB7CisgICAgc2V0RmxhZyhWYWwsIE9jY3VycmVuY2VzTWFzayk7CisgIH0KKyAgdm9pZCBzZXRWYWx1ZUV4cGVjdGVkRmxhZyhlbnVtIFZhbHVlRXhwZWN0ZWQgVmFsKSB7IHNldEZsYWcoVmFsLCBWYWx1ZU1hc2spOyB9CisgIHZvaWQgc2V0SGlkZGVuRmxhZyhlbnVtIE9wdGlvbkhpZGRlbiBWYWwpIHsgc2V0RmxhZyhWYWwsIEhpZGRlbk1hc2spOyB9CisgIHZvaWQgc2V0Rm9ybWF0dGluZ0ZsYWcoZW51bSBGb3JtYXR0aW5nRmxhZ3MgVikgeyBzZXRGbGFnKFYsIEZvcm1hdHRpbmdNYXNrKTsgfQorICB2b2lkIHNldE1pc2NGbGFnKGVudW0gTWlzY0ZsYWdzIE0pIHsgc2V0RmxhZyhNLCBNKTsgfQorICB2b2lkIHNldFBvc2l0aW9uKHVuc2lnbmVkIHBvcykgeyBQb3NpdGlvbiA9IHBvczsgfQorcHJvdGVjdGVkOgorICBleHBsaWNpdCBPcHRpb24odW5zaWduZWQgRGVmYXVsdEZsYWdzKQorICAgIDogTnVtT2NjdXJyZW5jZXMoMCksIEZsYWdzKERlZmF1bHRGbGFncyB8IE5vcm1hbEZvcm1hdHRpbmcpLCBQb3NpdGlvbigwKSwKKyAgICAgIEFkZGl0aW9uYWxWYWxzKDApLCBOZXh0UmVnaXN0ZXJlZCgwKSwKKyAgICAgIEFyZ1N0cigiIiksIEhlbHBTdHIoIiIpLCBWYWx1ZVN0cigiIikgeworICAgIGFzc2VydChnZXROdW1PY2N1cnJlbmNlc0ZsYWcoKSAhPSAwICYmCisgICAgICAgICAgIGdldE9wdGlvbkhpZGRlbkZsYWcoKSAhPSAwICYmICJOb3QgYWxsIGRlZmF1bHQgZmxhZ3Mgc3BlY2lmaWVkISIpOworICB9CisKKyAgaW5saW5lIHZvaWQgc2V0TnVtQWRkaXRpb25hbFZhbHModW5zaWduZWQgbikgeyBBZGRpdGlvbmFsVmFscyA9IG47IH0KK3B1YmxpYzoKKyAgLy8gYWRkQXJndW1lbnQgLSBSZWdpc3RlciB0aGlzIGFyZ3VtZW50IHdpdGggdGhlIGNvbW1hbmRsaW5lIHN5c3RlbS4KKyAgLy8KKyAgdm9pZCBhZGRBcmd1bWVudCgpOworCisgIE9wdGlvbiAqZ2V0TmV4dFJlZ2lzdGVyZWRPcHRpb24oKSBjb25zdCB7IHJldHVybiBOZXh0UmVnaXN0ZXJlZDsgfQorCisgIC8vIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIG9wdGlvbiB0YWcgZm9yIHByaW50aW5nLi4uCisgIHZpcnR1YWwgc2l6ZV90IGdldE9wdGlvbldpZHRoKCkgY29uc3QgPSAwOworCisgIC8vIHByaW50T3B0aW9uSW5mbyAtIFByaW50IG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG9wdGlvbi4gIFRoZQorICAvLyB0by1iZS1tYWludGFpbmVkIHdpZHRoIGlzIHNwZWNpZmllZC4KKyAgLy8KKyAgdmlydHVhbCB2b2lkIHByaW50T3B0aW9uSW5mbyhzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHZvaWQgZ2V0RXh0cmFPcHRpb25OYW1lcyhTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhcio+ICYpIHt9CisKKyAgLy8gYWRkT2NjdXJyZW5jZSAtIFdyYXBwZXIgYXJvdW5kIGhhbmRsZU9jY3VycmVuY2UgdGhhdCBlbmZvcmNlcyBGbGFncy4KKyAgLy8KKyAgYm9vbCBhZGRPY2N1cnJlbmNlKHVuc2lnbmVkIHBvcywgU3RyaW5nUmVmIEFyZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsdWUsIGJvb2wgTXVsdGlBcmcgPSBmYWxzZSk7CisKKyAgLy8gUHJpbnRzIG9wdGlvbiBuYW1lIGZvbGxvd2VkIGJ5IG1lc3NhZ2UuICBBbHdheXMgcmV0dXJucyB0cnVlLgorICBib29sIGVycm9yKGNvbnN0IFR3aW5lICZNZXNzYWdlLCBTdHJpbmdSZWYgQXJnTmFtZSA9IFN0cmluZ1JlZigpKTsKKworcHVibGljOgorICBpbmxpbmUgaW50IGdldE51bU9jY3VycmVuY2VzKCkgY29uc3QgeyByZXR1cm4gTnVtT2NjdXJyZW5jZXM7IH0KKyAgdmlydHVhbCB+T3B0aW9uKCkge30KK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbW1hbmQgbGluZSBvcHRpb24gbW9kaWZpZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZgorLy8gY29tbWFuZCBsaW5lIG9wdGlvbiBwYXJzZXJzLi4uCisvLworCisvLyBkZXNjIC0gTW9kaWZpZXIgdG8gc2V0IHRoZSBkZXNjcmlwdGlvbiBzaG93biBpbiB0aGUgLWhlbHAgb3V0cHV0Li4uCitzdHJ1Y3QgZGVzYyB7CisgIGNvbnN0IGNoYXIgKkRlc2M7CisgIGRlc2MoY29uc3QgY2hhciAqU3RyKSA6IERlc2MoU3RyKSB7fQorICB2b2lkIGFwcGx5KE9wdGlvbiAmTykgY29uc3QgeyBPLnNldERlc2NyaXB0aW9uKERlc2MpOyB9Cit9OworCisvLyB2YWx1ZV9kZXNjIC0gTW9kaWZpZXIgdG8gc2V0IHRoZSB2YWx1ZSBkZXNjcmlwdGlvbiBzaG93biBpbiB0aGUgLWhlbHAKKy8vIG91dHB1dC4uLgorc3RydWN0IHZhbHVlX2Rlc2MgeworICBjb25zdCBjaGFyICpEZXNjOworICB2YWx1ZV9kZXNjKGNvbnN0IGNoYXIgKlN0cikgOiBEZXNjKFN0cikge30KKyAgdm9pZCBhcHBseShPcHRpb24gJk8pIGNvbnN0IHsgTy5zZXRWYWx1ZVN0cihEZXNjKTsgfQorfTsKKworLy8gaW5pdCAtIFNwZWNpZnkgYSBkZWZhdWx0IChpbml0aWFsKSB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCwgaWYKKy8vIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUgYXJndW1lbnQgdHlwZSBkb2VzIG5vdCBnaXZlIHlvdSB3aGF0IHlvdQorLy8gd2FudC4gIFRoaXMgaXMgb25seSB2YWxpZCBvbiAib3B0IiBhcmd1bWVudHMsIG5vdCBvbiAibGlzdCIgYXJndW1lbnRzLgorLy8KK3RlbXBsYXRlPGNsYXNzIFR5Pgorc3RydWN0IGluaXRpYWxpemVyIHsKKyAgY29uc3QgVHkgJkluaXQ7CisgIGluaXRpYWxpemVyKGNvbnN0IFR5ICZWYWwpIDogSW5pdChWYWwpIHt9CisKKyAgdGVtcGxhdGU8Y2xhc3MgT3B0PgorICB2b2lkIGFwcGx5KE9wdCAmTykgY29uc3QgeyBPLnNldEluaXRpYWxWYWx1ZShJbml0KTsgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgVHk+Citpbml0aWFsaXplcjxUeT4gaW5pdChjb25zdCBUeSAmVmFsKSB7CisgIHJldHVybiBpbml0aWFsaXplcjxUeT4oVmFsKTsKK30KKworCisvLyBsb2NhdGlvbiAtIEFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgd2hpY2ggZXh0ZXJuYWwgdmFyaWFibGUgdGhleSB3YW50IHRvCisvLyBzdG9yZSB0aGUgcmVzdWx0cyBvZiB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NpbmcgaW50bywgaWYgdGhleSBkb24ndAorLy8gd2FudCB0byBzdG9yZSBpdCBpbiB0aGUgb3B0aW9uIGl0c2VsZi4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBUeT4KK3N0cnVjdCBMb2NhdGlvbkNsYXNzIHsKKyAgVHkgJkxvYzsKKyAgTG9jYXRpb25DbGFzcyhUeSAmTCkgOiBMb2MoTCkge30KKworICB0ZW1wbGF0ZTxjbGFzcyBPcHQ+CisgIHZvaWQgYXBwbHkoT3B0ICZPKSBjb25zdCB7IE8uc2V0TG9jYXRpb24oTywgTG9jKTsgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgVHk+CitMb2NhdGlvbkNsYXNzPFR5PiBsb2NhdGlvbihUeSAmTCkgeyByZXR1cm4gTG9jYXRpb25DbGFzczxUeT4oTCk7IH0KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRW51bSB2YWx1ZWQgY29tbWFuZCBsaW5lIG9wdGlvbgorLy8KKyNkZWZpbmUgY2xFbnVtVmFsKEVOVU1WQUwsIERFU0MpICNFTlVNVkFMLCBpbnQoRU5VTVZBTCksIERFU0MKKyNkZWZpbmUgY2xFbnVtVmFsTihFTlVNVkFMLCBGTEFHTkFNRSwgREVTQykgRkxBR05BTUUsIGludChFTlVNVkFMKSwgREVTQworI2RlZmluZSBjbEVudW1WYWxFbmQgKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KDApKQorCisvLyB2YWx1ZXMgLSBGb3IgY3VzdG9tIGRhdGEgdHlwZXMsIGFsbG93IHNwZWNpZnlpbmcgYSBncm91cCBvZiB2YWx1ZXMgdG9nZXRoZXIKKy8vIGFzIHRoZSB2YWx1ZXMgdGhhdCBnbyBpbnRvIHRoZSBtYXBwaW5nIHRoYXQgdGhlIG9wdGlvbiBoYW5kbGVyIHVzZXMuICBOb3RlCisvLyB0aGF0IHRoZSB2YWx1ZXMgbGlzdCBtdXN0IGFsd2F5cyBoYXZlIGEgMCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IHRvIGluZGljYXRlCisvLyB0aGF0IHRoZSBsaXN0IGhhcyBlbmRlZC4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBEYXRhVHlwZT4KK2NsYXNzIFZhbHVlc0NsYXNzIHsKKyAgLy8gVXNlIGEgdmVjdG9yIGluc3RlYWQgb2YgYSBtYXAsIGJlY2F1c2UgdGhlIGxpc3RzIHNob3VsZCBiZSBzaG9ydCwKKyAgLy8gdGhlIG92ZXJoZWFkIGlzIGxlc3MsIGFuZCBtb3N0IGltcG9ydGFudGx5LCBpdCBrZWVwcyB0aGVtIGluIHRoZSBvcmRlcgorICAvLyBpbnNlcnRlZCBzbyB3ZSBjYW4gcHJpbnQgb3VyIG9wdGlvbiBvdXQgbmljZWx5LgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCBzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyICo+ID4sND4gVmFsdWVzOworICB2b2lkIHByb2Nlc3NWYWx1ZXModmFfbGlzdCBWYWxzKTsKK3B1YmxpYzoKKyAgVmFsdWVzQ2xhc3MoY29uc3QgY2hhciAqRW51bU5hbWUsIERhdGFUeXBlIFZhbCwgY29uc3QgY2hhciAqRGVzYywKKyAgICAgICAgICAgICAgdmFfbGlzdCBWYWx1ZUFyZ3MpIHsKKyAgICAvLyBJbnNlcnQgdGhlIGZpcnN0IHZhbHVlLCB3aGljaCBpcyByZXF1aXJlZC4KKyAgICBWYWx1ZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEVudW1OYW1lLCBzdGQ6Om1ha2VfcGFpcihWYWwsIERlc2MpKSk7CisKKyAgICAvLyBQcm9jZXNzIHRoZSB2YXJhcmdzIHBvcnRpb24gb2YgdGhlIHZhbHVlcy4uLgorICAgIHdoaWxlIChjb25zdCBjaGFyICplbnVtTmFtZSA9IHZhX2FyZyhWYWx1ZUFyZ3MsIGNvbnN0IGNoYXIgKikpIHsKKyAgICAgIERhdGFUeXBlIEVudW1WYWwgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZT4odmFfYXJnKFZhbHVlQXJncywgaW50KSk7CisgICAgICBjb25zdCBjaGFyICpFbnVtRGVzYyA9IHZhX2FyZyhWYWx1ZUFyZ3MsIGNvbnN0IGNoYXIgKik7CisgICAgICBWYWx1ZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGVudW1OYW1lLCAgICAgIC8vIEFkZCB2YWx1ZSB0byB2YWx1ZSBtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoRW51bVZhbCwgRW51bURlc2MpKSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgT3B0PgorICB2b2lkIGFwcGx5KE9wdCAmTykgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oVmFsdWVzLnNpemUoKSk7CisgICAgICAgICBpICE9IGU7ICsraSkKKyAgICAgIE8uZ2V0UGFyc2VyKCkuYWRkTGl0ZXJhbE9wdGlvbihWYWx1ZXNbaV0uZmlyc3QsIFZhbHVlc1tpXS5zZWNvbmQuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzW2ldLnNlY29uZC5zZWNvbmQpOworICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBEYXRhVHlwZT4KK1ZhbHVlc0NsYXNzPERhdGFUeXBlPiBFTkRfV0lUSF9OVUxMIHZhbHVlcyhjb25zdCBjaGFyICpBcmcsIERhdGFUeXBlIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpEZXNjLCAuLi4pIHsKKyAgICB2YV9saXN0IFZhbHVlQXJnczsKKyAgICB2YV9zdGFydChWYWx1ZUFyZ3MsIERlc2MpOworICAgIFZhbHVlc0NsYXNzPERhdGFUeXBlPiBWYWxzKEFyZywgVmFsLCBEZXNjLCBWYWx1ZUFyZ3MpOworICAgIHZhX2VuZChWYWx1ZUFyZ3MpOworICAgIHJldHVybiBWYWxzOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBwYXJzZXIgY2xhc3MgLSBQYXJhbWV0ZXJpemFibGUgcGFyc2VyIGZvciBkaWZmZXJlbnQgZGF0YSB0eXBlcy4gIEJ5IGRlZmF1bHQsCisvLyBrbm93biBkYXRhIHR5cGVzIChzdHJpbmcsIGludCwgYm9vbCkgaGF2ZSBzcGVjaWFsaXplZCBwYXJzZXJzLCB0aGF0IGRvIHdoYXQKKy8vIHlvdSB3b3VsZCBleHBlY3QuICBUaGUgZGVmYXVsdCBwYXJzZXIsIHVzZWQgZm9yIGRhdGEgdHlwZXMgdGhhdCBhcmUgbm90CisvLyBidWlsdC1pbiwgdXNlcyBhIG1hcHBpbmcgdGFibGUgdG8gbWFwIHNwZWNpZmljIG9wdGlvbnMgdG8gdmFsdWVzLCB3aGljaCBpcworLy8gdXNlZCwgYW1vbmcgb3RoZXIgdGhpbmdzLCB0byBoYW5kbGUgZW51bSB0eXBlcy4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2VuZXJpY19wYXJzZXJfYmFzZSAtIFRoaXMgY2xhc3MgaG9sZHMgYWxsIHRoZSBub24tZ2VuZXJpYyBjb2RlIHRoYXQgd2UgZG8KKy8vIG5vdCBuZWVkIHJlcGxpY2F0ZWQgZm9yIGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBnZW5lcmljIHBhcnNlci4gIFRoaXMgYWxzbworLy8gYWxsb3dzIHVzIHRvIHB1dCBzdHVmZiBpbnRvIENvbW1hbmRMaW5lLmNwcAorLy8KK3N0cnVjdCBnZW5lcmljX3BhcnNlcl9iYXNlIHsKKyAgdmlydHVhbCB+Z2VuZXJpY19wYXJzZXJfYmFzZSgpIHt9ICAvLyBCYXNlIGNsYXNzIHNob3VsZCBoYXZlIHZpcnR1YWwtZHRvcgorCisgIC8vIGdldE51bU9wdGlvbnMgLSBWaXJ0dWFsIGZ1bmN0aW9uIGltcGxlbWVudGVkIGJ5IGdlbmVyaWMgc3ViY2xhc3MgdG8KKyAgLy8gaW5kaWNhdGUgaG93IG1hbnkgZW50cmllcyBhcmUgaW4gVmFsdWVzLgorICAvLworICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bU9wdGlvbnMoKSBjb25zdCA9IDA7CisKKyAgLy8gZ2V0T3B0aW9uIC0gUmV0dXJuIG9wdGlvbiBuYW1lIE4uCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0T3B0aW9uKHVuc2lnbmVkIE4pIGNvbnN0ID0gMDsKKworICAvLyBnZXREZXNjcmlwdGlvbiAtIFJldHVybiBkZXNjcmlwdGlvbiBOCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0RGVzY3JpcHRpb24odW5zaWduZWQgTikgY29uc3QgPSAwOworCisgIC8vIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIG9wdGlvbiB0YWcgZm9yIHByaW50aW5nLi4uCisgIHZpcnR1YWwgc2l6ZV90IGdldE9wdGlvbldpZHRoKGNvbnN0IE9wdGlvbiAmTykgY29uc3Q7CisKKyAgLy8gcHJpbnRPcHRpb25JbmZvIC0gUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3B0aW9uLiAgVGhlCisgIC8vIHRvLWJlLW1haW50YWluZWQgd2lkdGggaXMgc3BlY2lmaWVkLgorICAvLworICB2aXJ0dWFsIHZvaWQgcHJpbnRPcHRpb25JbmZvKGNvbnN0IE9wdGlvbiAmTywgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICB2b2lkIGluaXRpYWxpemUoT3B0aW9uICZPKSB7CisgICAgLy8gQWxsIG9mIHRoZSBtb2RpZmllcnMgZm9yIHRoZSBvcHRpb24gaGF2ZSBiZWVuIHByb2Nlc3NlZCBieSBub3csIHNvIHRoZQorICAgIC8vIGFyZ3N0ciBmaWVsZCBzaG91bGQgYmUgc3RhYmxlLCBjb3B5IGl0IGRvd24gbm93LgorICAgIC8vCisgICAgaGFzQXJnU3RyID0gTy5oYXNBcmdTdHIoKTsKKyAgfQorCisgIHZvaWQgZ2V0RXh0cmFPcHRpb25OYW1lcyhTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhcio+ICZPcHRpb25OYW1lcykgeworICAgIC8vIElmIHRoZXJlIGhhcyBiZWVuIG5vIGFyZ3N0ciBzcGVjaWZpZWQsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGFkZCBhbgorICAgIC8vIGFyZ3VtZW50IGZvciBldmVyeSBwb3NzaWJsZSBvcHRpb24uICBUaGlzIGVuc3VyZXMgdGhhdCBvdXIgb3B0aW9ucyBhcmUKKyAgICAvLyB2ZWN0b3JlZCB0byB1cy4KKyAgICBpZiAoIWhhc0FyZ1N0cikKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcHRpb25zKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBPcHRpb25OYW1lcy5wdXNoX2JhY2soZ2V0T3B0aW9uKGkpKTsKKyAgfQorCisKKyAgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IHsKKyAgICAvLyBJZiB0aGVyZSBpcyBhbiBBcmdTdHIgc3BlY2lmaWVkLCB0aGVuIHdlIGFyZSBvZiB0aGUgZm9ybToKKyAgICAvLworICAgIC8vICAgIC1vcHQ9TzIgICBvciAgIC1vcHQgTzIgIG9yICAtb3B0TzIKKyAgICAvLworICAgIC8vIEluIHdoaWNoIGNhc2UsIHRoZSB2YWx1ZSBpcyByZXF1aXJlZC4gIE90aGVyd2lzZSBpZiBhbiBhcmcgc3RyIGhhcyBub3QKKyAgICAvLyBiZWVuIHNwZWNpZmllZCwgd2UgYXJlIG9mIHRoZSBmb3JtOgorICAgIC8vCisgICAgLy8gICAgLU8yIG9yIE8yIG9yIC1sYSAod2hlcmUgLWwgYW5kIC1hIGFyZSBzZXBhcmF0ZSBvcHRpb25zKQorICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgY2FzZSwgd2UgY2Fubm90IGFsbG93IGEgdmFsdWUuCisgICAgLy8KKyAgICBpZiAoaGFzQXJnU3RyKQorICAgICAgcmV0dXJuIFZhbHVlUmVxdWlyZWQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFZhbHVlRGlzYWxsb3dlZDsKKyAgfQorCisgIC8vIGZpbmRPcHRpb24gLSBSZXR1cm4gdGhlIG9wdGlvbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCisgIC8vIGFyZ3VtZW50IHN0cmluZy4gIElmIHRoZSBvcHRpb24gaXMgbm90IGZvdW5kLCBnZXROdW1PcHRpb25zKCkgaXMgcmV0dXJuZWQuCisgIC8vCisgIHVuc2lnbmVkIGZpbmRPcHRpb24oY29uc3QgY2hhciAqTmFtZSk7CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBoYXNBcmdTdHI7Cit9OworCisvLyBEZWZhdWx0IHBhcnNlciBpbXBsZW1lbnRhdGlvbiAtIFRoaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiBoYXZpbmcgYQorLy8gbWFwcGluZyBvZiByZWNvZ25pemVkIG9wdGlvbnMgdG8gdmFsdWVzIG9mIHNvbWUgc29ydC4gIEluIGFkZGl0aW9uIHRvIHRoaXMsCisvLyBlYWNoIGVudHJ5IGluIHRoZSBtYXBwaW5nIGFsc28gdHJhY2tzIGEgaGVscCBtZXNzYWdlIHRoYXQgaXMgcHJpbnRlZCB3aXRoIHRoZQorLy8gY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgLWhlbHAuICBCZWNhdXNlIHRoaXMgaXMgYSBzaW1wbGUgbWFwcGluZyBwYXJzZXIsIHRoZQorLy8gZGF0YSB0eXBlIGNhbiBiZSBhbnkgdW5zdXBwb3J0ZWQgdHlwZS4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+CitjbGFzcyBwYXJzZXIgOiBwdWJsaWMgZ2VuZXJpY19wYXJzZXJfYmFzZSB7Citwcm90ZWN0ZWQ6CisgIGNsYXNzIE9wdGlvbkluZm8geworICBwdWJsaWM6CisgICAgT3B0aW9uSW5mbyhjb25zdCBjaGFyICpuYW1lLCBEYXRhVHlwZSB2LCBjb25zdCBjaGFyICpoZWxwU3RyKSA6CisgICAgICBOYW1lKG5hbWUpLCBWKHYpLCBIZWxwU3RyKGhlbHBTdHIpIHt9CisgICAgY29uc3QgY2hhciAqTmFtZTsKKyAgICBEYXRhVHlwZSBWOworICAgIGNvbnN0IGNoYXIgKkhlbHBTdHI7CisgIH07CisgIFNtYWxsVmVjdG9yPE9wdGlvbkluZm8sIDg+IFZhbHVlczsKK3B1YmxpYzoKKyAgdHlwZWRlZiBEYXRhVHlwZSBwYXJzZXJfZGF0YV90eXBlOworCisgIC8vIEltcGxlbWVudCB2aXJ0dWFsIGZ1bmN0aW9ucyBuZWVkZWQgYnkgZ2VuZXJpY19wYXJzZXJfYmFzZQorICB1bnNpZ25lZCBnZXROdW1PcHRpb25zKCkgY29uc3QgeyByZXR1cm4gdW5zaWduZWQoVmFsdWVzLnNpemUoKSk7IH0KKyAgY29uc3QgY2hhciAqZ2V0T3B0aW9uKHVuc2lnbmVkIE4pIGNvbnN0IHsgcmV0dXJuIFZhbHVlc1tOXS5OYW1lOyB9CisgIGNvbnN0IGNoYXIgKmdldERlc2NyaXB0aW9uKHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWVzW05dLkhlbHBTdHI7CisgIH0KKworICAvLyBwYXJzZSAtIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHBhcnNlKE9wdGlvbiAmTywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBBcmcsIERhdGFUeXBlICZWKSB7CisgICAgU3RyaW5nUmVmIEFyZ1ZhbDsKKyAgICBpZiAoaGFzQXJnU3RyKQorICAgICAgQXJnVmFsID0gQXJnOworICAgIGVsc2UKKyAgICAgIEFyZ1ZhbCA9IEFyZ05hbWU7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFZhbHVlcy5zaXplKCkpOworICAgICAgICAgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVmFsdWVzW2ldLk5hbWUgPT0gQXJnVmFsKSB7CisgICAgICAgIFYgPSBWYWx1ZXNbaV0uVjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgcmV0dXJuIE8uZXJyb3IoIkNhbm5vdCBmaW5kIG9wdGlvbiBuYW1lZCAnIiArIEFyZ1ZhbCArICInISIpOworICB9CisKKyAgLy8vIGFkZExpdGVyYWxPcHRpb24gLSBBZGQgYW4gZW50cnkgdG8gdGhlIG1hcHBpbmcgdGFibGUuCisgIC8vLworICB0ZW1wbGF0ZSA8Y2xhc3MgRFQ+CisgIHZvaWQgYWRkTGl0ZXJhbE9wdGlvbihjb25zdCBjaGFyICpOYW1lLCBjb25zdCBEVCAmViwgY29uc3QgY2hhciAqSGVscFN0cikgeworICAgIGFzc2VydChmaW5kT3B0aW9uKE5hbWUpID09IFZhbHVlcy5zaXplKCkgJiYgIk9wdGlvbiBhbHJlYWR5IGV4aXN0cyEiKTsKKyAgICBPcHRpb25JbmZvIFgoTmFtZSwgc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KFYpLCBIZWxwU3RyKTsKKyAgICBWYWx1ZXMucHVzaF9iYWNrKFgpOworICAgIE1hcmtPcHRpb25zQ2hhbmdlZCgpOworICB9CisKKyAgLy8vIHJlbW92ZUxpdGVyYWxPcHRpb24gLSBSZW1vdmUgdGhlIHNwZWNpZmllZCBvcHRpb24uCisgIC8vLworICB2b2lkIHJlbW92ZUxpdGVyYWxPcHRpb24oY29uc3QgY2hhciAqTmFtZSkgeworICAgIHVuc2lnbmVkIE4gPSBmaW5kT3B0aW9uKE5hbWUpOworICAgIGFzc2VydChOICE9IFZhbHVlcy5zaXplKCkgJiYgIk9wdGlvbiBub3QgZm91bmQhIik7CisgICAgVmFsdWVzLmVyYXNlKFZhbHVlcy5iZWdpbigpK04pOworICB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBiYXNpY19wYXJzZXIgLSBTdXBlciBjbGFzcyBvZiBwYXJzZXJzIHRvIHByb3ZpZGUgYm9pbGVycGxhdGUgY29kZQorLy8KK2NsYXNzIGJhc2ljX3BhcnNlcl9pbXBsIHsgIC8vIG5vbi10ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBvZiBiYXNpY19wYXJzZXI8dD4KK3B1YmxpYzoKKyAgdmlydHVhbCB+YmFzaWNfcGFyc2VyX2ltcGwoKSB7fQorCisgIGVudW0gVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlUmVxdWlyZWQ7CisgIH0KKworICB2b2lkIGdldEV4dHJhT3B0aW9uTmFtZXMoU21hbGxWZWN0b3JJbXBsPGNvbnN0IGNoYXIqPiAmKSB7fQorCisgIHZvaWQgaW5pdGlhbGl6ZShPcHRpb24gJikge30KKworICAvLyBSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBvcHRpb24gdGFnIGZvciBwcmludGluZy4uLgorICBzaXplX3QgZ2V0T3B0aW9uV2lkdGgoY29uc3QgT3B0aW9uICZPKSBjb25zdDsKKworICAvLyBwcmludE9wdGlvbkluZm8gLSBQcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvcHRpb24uICBUaGUKKyAgLy8gdG8tYmUtbWFpbnRhaW5lZCB3aWR0aCBpcyBzcGVjaWZpZWQuCisgIC8vCisgIHZvaWQgcHJpbnRPcHRpb25JbmZvKGNvbnN0IE9wdGlvbiAmTywgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0VmFsdWVOYW1lKCkgY29uc3QgeyByZXR1cm4gInZhbHVlIjsgfQorCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKKy8vIGJhc2ljX3BhcnNlciAtIFRoZSByZWFsIGJhc2ljIHBhcnNlciBpcyBqdXN0IGEgdGVtcGxhdGUgd3JhcHBlciB0aGF0IHByb3ZpZGVzCisvLyBhIHR5cGVkZWYgZm9yIHRoZSBwcm92aWRlZCBkYXRhIHR5cGUuCisvLwordGVtcGxhdGU8Y2xhc3MgRGF0YVR5cGU+CitjbGFzcyBiYXNpY19wYXJzZXIgOiBwdWJsaWMgYmFzaWNfcGFyc2VyX2ltcGwgeworcHVibGljOgorICB0eXBlZGVmIERhdGFUeXBlIHBhcnNlcl9kYXRhX3R5cGU7Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJzZXI8Ym9vbD4KKy8vCit0ZW1wbGF0ZTw+CitjbGFzcyBwYXJzZXI8Ym9vbD4gOiBwdWJsaWMgYmFzaWNfcGFyc2VyPGJvb2w+IHsKKyAgY29uc3QgY2hhciAqQXJnU3RyOworcHVibGljOgorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwgU3RyaW5nUmVmIEFyZywgYm9vbCAmVmFsKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0PgorICB2b2lkIGluaXRpYWxpemUoT3B0ICZPKSB7CisgICAgQXJnU3RyID0gTy5BcmdTdHI7CisgIH0KKworICBlbnVtIFZhbHVlRXhwZWN0ZWQgZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBWYWx1ZU9wdGlvbmFsOworICB9CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gRG8gbm90IHByaW50ID08dmFsdWU+IGF0IGFsbC4KKyAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRWYWx1ZU5hbWUoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKworRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgYmFzaWNfcGFyc2VyPGJvb2w+KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyc2VyPGJvb2xPckRlZmF1bHQ+CitlbnVtIGJvb2xPckRlZmF1bHQgeyBCT1VfVU5TRVQsIEJPVV9UUlVFLCBCT1VfRkFMU0UgfTsKK3RlbXBsYXRlPD4KK2NsYXNzIHBhcnNlcjxib29sT3JEZWZhdWx0PiA6IHB1YmxpYyBiYXNpY19wYXJzZXI8Ym9vbE9yRGVmYXVsdD4geworcHVibGljOgorICAvLyBwYXJzZSAtIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHBhcnNlKE9wdGlvbiAmTywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBBcmcsIGJvb2xPckRlZmF1bHQgJlZhbCk7CisKKyAgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWVPcHRpb25hbDsKKyAgfQorCisgIC8vIGdldFZhbHVlTmFtZSAtIERvIG5vdCBwcmludCA9PHZhbHVlPiBhdCBhbGwuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0VmFsdWVOYW1lKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKK0VYVEVSTl9URU1QTEFURV9JTlNUQU5USUFUSU9OKGNsYXNzIGJhc2ljX3BhcnNlcjxib29sT3JEZWZhdWx0Pik7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjxpbnQ+CisvLwordGVtcGxhdGU8PgorY2xhc3MgcGFyc2VyPGludD4gOiBwdWJsaWMgYmFzaWNfcGFyc2VyPGludD4geworcHVibGljOgorICAvLyBwYXJzZSAtIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHBhcnNlKE9wdGlvbiAmTywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBBcmcsIGludCAmVmFsKTsKKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0VmFsdWVOYW1lKCkgY29uc3QgeyByZXR1cm4gImludCI7IH0KKworICAvLyBBbiBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgJ2hvbWUnIGZvciB0aGlzIGNsYXNzLgorICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Cit9OworCitFWFRFUk5fVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBiYXNpY19wYXJzZXI8aW50Pik7CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyc2VyPHVuc2lnbmVkPgorLy8KK3RlbXBsYXRlPD4KK2NsYXNzIHBhcnNlcjx1bnNpZ25lZD4gOiBwdWJsaWMgYmFzaWNfcGFyc2VyPHVuc2lnbmVkPiB7CitwdWJsaWM6CisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwgU3RyaW5nUmVmIEFyZywgdW5zaWduZWQgJlZhbCk7CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFZhbHVlTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJ1aW50IjsgfQorCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKK0VYVEVSTl9URU1QTEFURV9JTlNUQU5USUFUSU9OKGNsYXNzIGJhc2ljX3BhcnNlcjx1bnNpZ25lZD4pOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJzZXI8ZG91YmxlPgorLy8KK3RlbXBsYXRlPD4KK2NsYXNzIHBhcnNlcjxkb3VibGU+IDogcHVibGljIGJhc2ljX3BhcnNlcjxkb3VibGU+IHsKK3B1YmxpYzoKKyAgLy8gcGFyc2UgLSBSZXR1cm4gdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgQXJnLCBkb3VibGUgJlZhbCk7CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFZhbHVlTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJudW1iZXIiOyB9CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKworRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgYmFzaWNfcGFyc2VyPGRvdWJsZT4pOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJzZXI8ZmxvYXQ+CisvLwordGVtcGxhdGU8PgorY2xhc3MgcGFyc2VyPGZsb2F0PiA6IHB1YmxpYyBiYXNpY19wYXJzZXI8ZmxvYXQ+IHsKK3B1YmxpYzoKKyAgLy8gcGFyc2UgLSBSZXR1cm4gdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgQXJnLCBmbG9hdCAmVmFsKTsKKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0VmFsdWVOYW1lKCkgY29uc3QgeyByZXR1cm4gIm51bWJlciI7IH0KKworICAvLyBBbiBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgJ2hvbWUnIGZvciB0aGlzIGNsYXNzLgorICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Cit9OworCitFWFRFUk5fVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBiYXNpY19wYXJzZXI8ZmxvYXQ+KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyc2VyPHN0ZDo6c3RyaW5nPgorLy8KK3RlbXBsYXRlPD4KK2NsYXNzIHBhcnNlcjxzdGQ6OnN0cmluZz4gOiBwdWJsaWMgYmFzaWNfcGFyc2VyPHN0ZDo6c3RyaW5nPiB7CitwdWJsaWM6CisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICYsIFN0cmluZ1JlZiwgU3RyaW5nUmVmIEFyZywgc3RkOjpzdHJpbmcgJlZhbHVlKSB7CisgICAgVmFsdWUgPSBBcmcuc3RyKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFZhbHVlTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJzdHJpbmciOyB9CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKworRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgYmFzaWNfcGFyc2VyPHN0ZDo6c3RyaW5nPik7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjxjaGFyPgorLy8KK3RlbXBsYXRlPD4KK2NsYXNzIHBhcnNlcjxjaGFyPiA6IHB1YmxpYyBiYXNpY19wYXJzZXI8Y2hhcj4geworcHVibGljOgorICAvLyBwYXJzZSAtIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHBhcnNlKE9wdGlvbiAmLCBTdHJpbmdSZWYsIFN0cmluZ1JlZiBBcmcsIGNoYXIgJlZhbHVlKSB7CisgICAgVmFsdWUgPSBBcmdbMF07CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFZhbHVlTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJjaGFyIjsgfQorCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKK0VYVEVSTl9URU1QTEFURV9JTlNUQU5USUFUSU9OKGNsYXNzIGJhc2ljX3BhcnNlcjxjaGFyPik7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBhcHBsaWNhdG9yIGNsYXNzIC0gVGhpcyBjbGFzcyBpcyB1c2VkIGJlY2F1c2Ugd2UgbXVzdCB1c2UgcGFydGlhbAorLy8gc3BlY2lhbGl6YXRpb24gdG8gaGFuZGxlIGxpdGVyYWwgc3RyaW5nIGFyZ3VtZW50cyBzcGVjaWFsbHkgKGNvbnN0IGNoYXIqIGRvZXMKKy8vIG5vdCBjb3JyZWN0bHkgcmVzcG9uZCB0byB0aGUgYXBwbHkgbWV0aG9kKS4gIEJlY2F1c2UgdGhlIHN5bnRheCB0byB1c2UgdGhpcworLy8gaXMgYSBwYWluLCB3ZSBoYXZlIHRoZSAnYXBwbHknIG1ldGhvZCBiZWxvdyB0byBoYW5kbGUgdGhlIG5hc3RpbmVzcy4uLgorLy8KK3RlbXBsYXRlPGNsYXNzIE1vZD4gc3RydWN0IGFwcGxpY2F0b3IgeworICB0ZW1wbGF0ZTxjbGFzcyBPcHQ+CisgIHN0YXRpYyB2b2lkIG9wdChjb25zdCBNb2QgJk0sIE9wdCAmTykgeyBNLmFwcGx5KE8pOyB9Cit9OworCisvLyBIYW5kbGUgY29uc3QgY2hhciogYXMgYSBzcGVjaWFsIGNhc2UuLi4KK3RlbXBsYXRlPHVuc2lnbmVkIG4+IHN0cnVjdCBhcHBsaWNhdG9yPGNoYXJbbl0+IHsKKyAgdGVtcGxhdGU8Y2xhc3MgT3B0PgorICBzdGF0aWMgdm9pZCBvcHQoY29uc3QgY2hhciAqU3RyLCBPcHQgJk8pIHsgTy5zZXRBcmdTdHIoU3RyKTsgfQorfTsKK3RlbXBsYXRlPHVuc2lnbmVkIG4+IHN0cnVjdCBhcHBsaWNhdG9yPGNvbnN0IGNoYXJbbl0+IHsKKyAgdGVtcGxhdGU8Y2xhc3MgT3B0PgorICBzdGF0aWMgdm9pZCBvcHQoY29uc3QgY2hhciAqU3RyLCBPcHQgJk8pIHsgTy5zZXRBcmdTdHIoU3RyKTsgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IGFwcGxpY2F0b3I8Y29uc3QgY2hhcio+IHsKKyAgdGVtcGxhdGU8Y2xhc3MgT3B0PgorICBzdGF0aWMgdm9pZCBvcHQoY29uc3QgY2hhciAqU3RyLCBPcHQgJk8pIHsgTy5zZXRBcmdTdHIoU3RyKTsgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgYXBwbGljYXRvcjxOdW1PY2N1cnJlbmNlc0ZsYWc+IHsKKyAgc3RhdGljIHZvaWQgb3B0KE51bU9jY3VycmVuY2VzRmxhZyBOTywgT3B0aW9uICZPKSB7CisgICAgTy5zZXROdW1PY2N1cnJlbmNlc0ZsYWcoTk8pOworICB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgYXBwbGljYXRvcjxWYWx1ZUV4cGVjdGVkPiB7CisgIHN0YXRpYyB2b2lkIG9wdChWYWx1ZUV4cGVjdGVkIFZFLCBPcHRpb24gJk8pIHsgTy5zZXRWYWx1ZUV4cGVjdGVkRmxhZyhWRSk7IH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBhcHBsaWNhdG9yPE9wdGlvbkhpZGRlbj4geworICBzdGF0aWMgdm9pZCBvcHQoT3B0aW9uSGlkZGVuIE9ILCBPcHRpb24gJk8pIHsgTy5zZXRIaWRkZW5GbGFnKE9IKTsgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IGFwcGxpY2F0b3I8Rm9ybWF0dGluZ0ZsYWdzPiB7CisgIHN0YXRpYyB2b2lkIG9wdChGb3JtYXR0aW5nRmxhZ3MgRkYsIE9wdGlvbiAmTykgeyBPLnNldEZvcm1hdHRpbmdGbGFnKEZGKTsgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IGFwcGxpY2F0b3I8TWlzY0ZsYWdzPiB7CisgIHN0YXRpYyB2b2lkIG9wdChNaXNjRmxhZ3MgTUYsIE9wdGlvbiAmTykgeyBPLnNldE1pc2NGbGFnKE1GKTsgfQorfTsKKworLy8gYXBwbHkgbWV0aG9kIC0gQXBwbHkgYSBtb2RpZmllciB0byBhbiBvcHRpb24gaW4gYSB0eXBlIHNhZmUgd2F5LgordGVtcGxhdGU8Y2xhc3MgTW9kLCBjbGFzcyBPcHQ+Cit2b2lkIGFwcGx5KGNvbnN0IE1vZCAmTSwgT3B0ICpPKSB7CisgIGFwcGxpY2F0b3I8TW9kPjo6b3B0KE0sICpPKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gb3B0X3N0b3JhZ2UgY2xhc3MKKworLy8gRGVmYXVsdCBzdG9yYWdlIGNsYXNzIGRlZmluaXRpb246IGV4dGVybmFsIHN0b3JhZ2UuICBUaGlzIGltcGxlbWVudGF0aW9uCisvLyBhc3N1bWVzIHRoZSB1c2VyIHdpbGwgc3BlY2lmeSBhIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBkYXRhIGludG8gd2l0aCB0aGUKKy8vIGNsOjpsb2NhdGlvbih4KSBtb2RpZmllci4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBEYXRhVHlwZSwgYm9vbCBFeHRlcm5hbFN0b3JhZ2UsIGJvb2wgaXNDbGFzcz4KK2NsYXNzIG9wdF9zdG9yYWdlIHsKKyAgRGF0YVR5cGUgKkxvY2F0aW9uOyAgIC8vIFdoZXJlIHRvIHN0b3JlIHRoZSBvYmplY3QuLi4KKworICB2b2lkIGNoZWNrKCkgY29uc3QgeworICAgIGFzc2VydChMb2NhdGlvbiAhPSAwICYmICJjbDo6bG9jYXRpb24oLi4uKSBub3Qgc3BlY2lmaWVkIGZvciBhIGNvbW1hbmQgIgorICAgICAgICAgICAibGluZSBvcHRpb24gd2l0aCBleHRlcm5hbCBzdG9yYWdlLCAiCisgICAgICAgICAgICJvciBjbDo6aW5pdCBzcGVjaWZpZWQgYmVmb3JlIGNsOjpsb2NhdGlvbigpISEiKTsKKyAgfQorcHVibGljOgorICBvcHRfc3RvcmFnZSgpIDogTG9jYXRpb24oMCkge30KKworICBib29sIHNldExvY2F0aW9uKE9wdGlvbiAmTywgRGF0YVR5cGUgJkwpIHsKKyAgICBpZiAoTG9jYXRpb24pCisgICAgICByZXR1cm4gTy5lcnJvcigiY2w6OmxvY2F0aW9uKHgpIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSEiKTsKKyAgICBMb2NhdGlvbiA9ICZMOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIFQ+CisgIHZvaWQgc2V0VmFsdWUoY29uc3QgVCAmVikgeworICAgIGNoZWNrKCk7CisgICAgKkxvY2F0aW9uID0gVjsKKyAgfQorCisgIERhdGFUeXBlICZnZXRWYWx1ZSgpIHsgY2hlY2soKTsgcmV0dXJuICpMb2NhdGlvbjsgfQorICBjb25zdCBEYXRhVHlwZSAmZ2V0VmFsdWUoKSBjb25zdCB7IGNoZWNrKCk7IHJldHVybiAqTG9jYXRpb247IH0KKworICBvcGVyYXRvciBEYXRhVHlwZSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmdldFZhbHVlKCk7IH0KK307CisKKworLy8gRGVmaW5lIGhvdyB0byBob2xkIGEgY2xhc3MgdHlwZSBvYmplY3QsIHN1Y2ggYXMgYSBzdHJpbmcuICBTaW5jZSB3ZSBjYW4KKy8vIGluaGVyaXQgZnJvbSBhIGNsYXNzLCB3ZSBkbyBzby4gIFRoaXMgbWFrZXMgdXMgZXhhY3RseSBjb21wYXRpYmxlIHdpdGggdGhlCisvLyBvYmplY3QgaW4gYWxsIGNhc2VzIHRoYXQgaXQgaXMgdXNlZC4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBEYXRhVHlwZT4KK2NsYXNzIG9wdF9zdG9yYWdlPERhdGFUeXBlLGZhbHNlLHRydWU+IDogcHVibGljIERhdGFUeXBlIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgdm9pZCBzZXRWYWx1ZShjb25zdCBUICZWKSB7IERhdGFUeXBlOjpvcGVyYXRvcj0oVik7IH0KKworICBEYXRhVHlwZSAmZ2V0VmFsdWUoKSB7IHJldHVybiAqdGhpczsgfQorICBjb25zdCBEYXRhVHlwZSAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorfTsKKworLy8gRGVmaW5lIGEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB0byBoYW5kbGUgdGhpbmdzIHdlIGNhbm5vdCBpbmhlcml0IGZyb20uICBJbgorLy8gdGhpcyBjYXNlLCB3ZSBzdG9yZSBhbiBpbnN0YW5jZSB0aHJvdWdoIGNvbnRhaW5tZW50LCBhbmQgb3ZlcmxvYWQgb3BlcmF0b3JzCisvLyB0byBnZXQgYXQgdGhlIHZhbHVlLgorLy8KK3RlbXBsYXRlPGNsYXNzIERhdGFUeXBlPgorY2xhc3Mgb3B0X3N0b3JhZ2U8RGF0YVR5cGUsIGZhbHNlLCBmYWxzZT4geworcHVibGljOgorICBEYXRhVHlwZSBWYWx1ZTsKKworICAvLyBNYWtlIHN1cmUgd2UgaW5pdGlhbGl6ZSB0aGUgdmFsdWUgd2l0aCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlCisgIC8vIHR5cGUuCisgIG9wdF9zdG9yYWdlKCkgOiBWYWx1ZShEYXRhVHlwZSgpKSB7fQorCisgIHRlbXBsYXRlPGNsYXNzIFQ+CisgIHZvaWQgc2V0VmFsdWUoY29uc3QgVCAmVikgeyBWYWx1ZSA9IFY7IH0KKyAgRGF0YVR5cGUgJmdldFZhbHVlKCkgeyByZXR1cm4gVmFsdWU7IH0KKyAgRGF0YVR5cGUgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIG9wZXJhdG9yIERhdGFUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsdWUoKTsgfQorCisgIC8vIElmIHRoZSBkYXRhdHlwZSBpcyBhIHBvaW50ZXIsIHN1cHBvcnQgLT4gb24gaXQuCisgIERhdGFUeXBlIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorfTsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gb3B0IC0gQSBzY2FsYXIgY29tbWFuZCBsaW5lIG9wdGlvbi4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGUsIGJvb2wgRXh0ZXJuYWxTdG9yYWdlID0gZmFsc2UsCisgICAgICAgICAgY2xhc3MgUGFyc2VyQ2xhc3MgPSBwYXJzZXI8RGF0YVR5cGU+ID4KK2NsYXNzIG9wdCA6IHB1YmxpYyBPcHRpb24sCisgICAgICAgICAgICBwdWJsaWMgb3B0X3N0b3JhZ2U8RGF0YVR5cGUsIEV4dGVybmFsU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jbGFzczxEYXRhVHlwZT46OnZhbHVlPiB7CisgIFBhcnNlckNsYXNzIFBhcnNlcjsKKworICB2aXJ0dWFsIGJvb2wgaGFuZGxlT2NjdXJyZW5jZSh1bnNpZ25lZCBwb3MsIFN0cmluZ1JlZiBBcmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnKSB7CisgICAgdHlwZW5hbWUgUGFyc2VyQ2xhc3M6OnBhcnNlcl9kYXRhX3R5cGUgVmFsID0KKyAgICAgICB0eXBlbmFtZSBQYXJzZXJDbGFzczo6cGFyc2VyX2RhdGFfdHlwZSgpOworICAgIGlmIChQYXJzZXIucGFyc2UoKnRoaXMsIEFyZ05hbWUsIEFyZywgVmFsKSkKKyAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZSBlcnJvciEKKyAgICB0aGlzLT5zZXRWYWx1ZShWYWwpOworICAgIHRoaXMtPnNldFBvc2l0aW9uKHBvcyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCBlbnVtIFZhbHVlRXhwZWN0ZWQgZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBQYXJzZXIuZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCk7CisgIH0KKyAgdmlydHVhbCB2b2lkIGdldEV4dHJhT3B0aW9uTmFtZXMoU21hbGxWZWN0b3JJbXBsPGNvbnN0IGNoYXIqPiAmT3B0aW9uTmFtZXMpIHsKKyAgICByZXR1cm4gUGFyc2VyLmdldEV4dHJhT3B0aW9uTmFtZXMoT3B0aW9uTmFtZXMpOworICB9CisKKyAgLy8gRm9yd2FyZCBwcmludGluZyBzdHVmZiB0byB0aGUgcGFyc2VyLi4uCisgIHZpcnR1YWwgc2l6ZV90IGdldE9wdGlvbldpZHRoKCkgY29uc3Qge3JldHVybiBQYXJzZXIuZ2V0T3B0aW9uV2lkdGgoKnRoaXMpO30KKyAgdmlydHVhbCB2b2lkIHByaW50T3B0aW9uSW5mbyhzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0IHsKKyAgICBQYXJzZXIucHJpbnRPcHRpb25JbmZvKCp0aGlzLCBHbG9iYWxXaWR0aCk7CisgIH0KKworICB2b2lkIGRvbmUoKSB7CisgICAgYWRkQXJndW1lbnQoKTsKKyAgICBQYXJzZXIuaW5pdGlhbGl6ZSgqdGhpcyk7CisgIH0KK3B1YmxpYzoKKyAgLy8gc2V0SW5pdGlhbFZhbHVlIC0gVXNlZCBieSB0aGUgY2w6OmluaXQgbW9kaWZpZXIuLi4KKyAgdm9pZCBzZXRJbml0aWFsVmFsdWUoY29uc3QgRGF0YVR5cGUgJlYpIHsgdGhpcy0+c2V0VmFsdWUoVik7IH0KKworICBQYXJzZXJDbGFzcyAmZ2V0UGFyc2VyKCkgeyByZXR1cm4gUGFyc2VyOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgRGF0YVR5cGUgJm9wZXJhdG9yPShjb25zdCBUICZWYWwpIHsKKyAgICB0aGlzLT5zZXRWYWx1ZShWYWwpOworICAgIHJldHVybiB0aGlzLT5nZXRWYWx1ZSgpOworICB9CisKKyAgLy8gT25lIG9wdGlvbi4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQ+CisgIGV4cGxpY2l0IG9wdChjb25zdCBNMHQgJk0wKSA6IE9wdGlvbihPcHRpb25hbCB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKworICAvLyBUd28gb3B0aW9ucy4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQsIGNsYXNzIE0xdD4KKyAgb3B0KGNvbnN0IE0wdCAmTTAsIGNvbnN0IE0xdCAmTTEpIDogT3B0aW9uKE9wdGlvbmFsIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7CisgICAgZG9uZSgpOworICB9CisKKyAgLy8gVGhyZWUgb3B0aW9ucy4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQsIGNsYXNzIE0xdCwgY2xhc3MgTTJ0PgorICBvcHQoY29uc3QgTTB0ICZNMCwgY29uc3QgTTF0ICZNMSwKKyAgICAgIGNvbnN0IE0ydCAmTTIpIDogT3B0aW9uKE9wdGlvbmFsIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7IGFwcGx5KE0yLCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gRm91ciBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQsIGNsYXNzIE0zdD4KKyAgb3B0KGNvbnN0IE0wdCAmTTAsIGNvbnN0IE0xdCAmTTEsIGNvbnN0IE0ydCAmTTIsCisgICAgICBjb25zdCBNM3QgJk0zKSA6IE9wdGlvbihPcHRpb25hbCB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsgYXBwbHkoTTEsIHRoaXMpOyBhcHBseShNMiwgdGhpcyk7IGFwcGx5KE0zLCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gRml2ZSBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQsIGNsYXNzIE0zdCwgY2xhc3MgTTR0PgorICBvcHQoY29uc3QgTTB0ICZNMCwgY29uc3QgTTF0ICZNMSwgY29uc3QgTTJ0ICZNMiwgY29uc3QgTTN0ICZNMywKKyAgICAgIGNvbnN0IE00dCAmTTQpIDogT3B0aW9uKE9wdGlvbmFsIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7IGFwcGx5KE0yLCB0aGlzKTsgYXBwbHkoTTMsIHRoaXMpOworICAgIGFwcGx5KE00LCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gU2l4IG9wdGlvbnMuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgTTB0LCBjbGFzcyBNMXQsIGNsYXNzIE0ydCwgY2xhc3MgTTN0LAorICAgICAgICAgICBjbGFzcyBNNHQsIGNsYXNzIE01dD4KKyAgb3B0KGNvbnN0IE0wdCAmTTAsIGNvbnN0IE0xdCAmTTEsIGNvbnN0IE0ydCAmTTIsIGNvbnN0IE0zdCAmTTMsCisgICAgICBjb25zdCBNNHQgJk00LCBjb25zdCBNNXQgJk01KSA6IE9wdGlvbihPcHRpb25hbCB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsgYXBwbHkoTTEsIHRoaXMpOyBhcHBseShNMiwgdGhpcyk7IGFwcGx5KE0zLCB0aGlzKTsKKyAgICBhcHBseShNNCwgdGhpcyk7IGFwcGx5KE01LCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gU2V2ZW4gb3B0aW9ucy4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQsIGNsYXNzIE0xdCwgY2xhc3MgTTJ0LCBjbGFzcyBNM3QsCisgICAgICAgICAgIGNsYXNzIE00dCwgY2xhc3MgTTV0LCBjbGFzcyBNNnQ+CisgIG9wdChjb25zdCBNMHQgJk0wLCBjb25zdCBNMXQgJk0xLCBjb25zdCBNMnQgJk0yLCBjb25zdCBNM3QgJk0zLAorICAgICAgY29uc3QgTTR0ICZNNCwgY29uc3QgTTV0ICZNNSwKKyAgICAgIGNvbnN0IE02dCAmTTYpIDogT3B0aW9uKE9wdGlvbmFsIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7IGFwcGx5KE0yLCB0aGlzKTsgYXBwbHkoTTMsIHRoaXMpOworICAgIGFwcGx5KE00LCB0aGlzKTsgYXBwbHkoTTUsIHRoaXMpOyBhcHBseShNNiwgdGhpcyk7CisgICAgZG9uZSgpOworICB9CisgIC8vIEVpZ2h0IG9wdGlvbnMuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgTTB0LCBjbGFzcyBNMXQsIGNsYXNzIE0ydCwgY2xhc3MgTTN0LAorICAgICAgICAgICBjbGFzcyBNNHQsIGNsYXNzIE01dCwgY2xhc3MgTTZ0LCBjbGFzcyBNN3Q+CisgIG9wdChjb25zdCBNMHQgJk0wLCBjb25zdCBNMXQgJk0xLCBjb25zdCBNMnQgJk0yLCBjb25zdCBNM3QgJk0zLAorICAgICAgY29uc3QgTTR0ICZNNCwgY29uc3QgTTV0ICZNNSwgY29uc3QgTTZ0ICZNNiwKKyAgICAgIGNvbnN0IE03dCAmTTcpIDogT3B0aW9uKE9wdGlvbmFsIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7IGFwcGx5KE0yLCB0aGlzKTsgYXBwbHkoTTMsIHRoaXMpOworICAgIGFwcGx5KE00LCB0aGlzKTsgYXBwbHkoTTUsIHRoaXMpOyBhcHBseShNNiwgdGhpcyk7IGFwcGx5KE03LCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KK307CisKK0VYVEVSTl9URU1QTEFURV9JTlNUQU5USUFUSU9OKGNsYXNzIG9wdDx1bnNpZ25lZD4pOworRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3Mgb3B0PGludD4pOworRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3Mgb3B0PHN0ZDo6c3RyaW5nPik7CitFWFRFUk5fVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBvcHQ8Y2hhcj4pOworRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3Mgb3B0PGJvb2w+KTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIGxpc3Rfc3RvcmFnZSBjbGFzcworCisvLyBEZWZhdWx0IHN0b3JhZ2UgY2xhc3MgZGVmaW5pdGlvbjogZXh0ZXJuYWwgc3RvcmFnZS4gIFRoaXMgaW1wbGVtZW50YXRpb24KKy8vIGFzc3VtZXMgdGhlIHVzZXIgd2lsbCBzcGVjaWZ5IGEgdmFyaWFibGUgdG8gc3RvcmUgdGhlIGRhdGEgaW50byB3aXRoIHRoZQorLy8gY2w6OmxvY2F0aW9uKHgpIG1vZGlmaWVyLgorLy8KK3RlbXBsYXRlPGNsYXNzIERhdGFUeXBlLCBjbGFzcyBTdG9yYWdlQ2xhc3M+CitjbGFzcyBsaXN0X3N0b3JhZ2UgeworICBTdG9yYWdlQ2xhc3MgKkxvY2F0aW9uOyAgIC8vIFdoZXJlIHRvIHN0b3JlIHRoZSBvYmplY3QuLi4KKworcHVibGljOgorICBsaXN0X3N0b3JhZ2UoKSA6IExvY2F0aW9uKDApIHt9CisKKyAgYm9vbCBzZXRMb2NhdGlvbihPcHRpb24gJk8sIFN0b3JhZ2VDbGFzcyAmTCkgeworICAgIGlmIChMb2NhdGlvbikKKyAgICAgIHJldHVybiBPLmVycm9yKCJjbDo6bG9jYXRpb24oeCkgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlISIpOworICAgIExvY2F0aW9uID0gJkw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgdm9pZCBhZGRWYWx1ZShjb25zdCBUICZWKSB7CisgICAgYXNzZXJ0KExvY2F0aW9uICE9IDAgJiYgImNsOjpsb2NhdGlvbiguLi4pIG5vdCBzcGVjaWZpZWQgZm9yIGEgY29tbWFuZCAiCisgICAgICAgICAgICJsaW5lIG9wdGlvbiB3aXRoIGV4dGVybmFsIHN0b3JhZ2UhIik7CisgICAgTG9jYXRpb24tPnB1c2hfYmFjayhWKTsKKyAgfQorfTsKKworCisvLyBEZWZpbmUgaG93IHRvIGhvbGQgYSBjbGFzcyB0eXBlIG9iamVjdCwgc3VjaCBhcyBhIHN0cmluZy4gIFNpbmNlIHdlIGNhbgorLy8gaW5oZXJpdCBmcm9tIGEgY2xhc3MsIHdlIGRvIHNvLiAgVGhpcyBtYWtlcyB1cyBleGFjdGx5IGNvbXBhdGlibGUgd2l0aCB0aGUKKy8vIG9iamVjdCBpbiBhbGwgY2FzZXMgdGhhdCBpdCBpcyB1c2VkLgorLy8KK3RlbXBsYXRlPGNsYXNzIERhdGFUeXBlPgorY2xhc3MgbGlzdF9zdG9yYWdlPERhdGFUeXBlLCBib29sPiA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxEYXRhVHlwZT4geworcHVibGljOgorICB0ZW1wbGF0ZTxjbGFzcyBUPgorICB2b2lkIGFkZFZhbHVlKGNvbnN0IFQgJlYpIHsgc3RkOjp2ZWN0b3I8RGF0YVR5cGU+OjpwdXNoX2JhY2soVik7IH0KK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIGxpc3QgLSBBIGxpc3Qgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisvLwordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlLCBjbGFzcyBTdG9yYWdlID0gYm9vbCwKKyAgICAgICAgICBjbGFzcyBQYXJzZXJDbGFzcyA9IHBhcnNlcjxEYXRhVHlwZT4gPgorY2xhc3MgbGlzdCA6IHB1YmxpYyBPcHRpb24sIHB1YmxpYyBsaXN0X3N0b3JhZ2U8RGF0YVR5cGUsIFN0b3JhZ2U+IHsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFBvc2l0aW9uczsKKyAgUGFyc2VyQ2xhc3MgUGFyc2VyOworCisgIHZpcnR1YWwgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyc2VyLmdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpOworICB9CisgIHZpcnR1YWwgdm9pZCBnZXRFeHRyYU9wdGlvbk5hbWVzKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBjaGFyKj4gJk9wdGlvbk5hbWVzKSB7CisgICAgcmV0dXJuIFBhcnNlci5nZXRFeHRyYU9wdGlvbk5hbWVzKE9wdGlvbk5hbWVzKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBoYW5kbGVPY2N1cnJlbmNlKHVuc2lnbmVkIHBvcywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBBcmcpeworICAgIHR5cGVuYW1lIFBhcnNlckNsYXNzOjpwYXJzZXJfZGF0YV90eXBlIFZhbCA9CisgICAgICB0eXBlbmFtZSBQYXJzZXJDbGFzczo6cGFyc2VyX2RhdGFfdHlwZSgpOworICAgIGlmIChQYXJzZXIucGFyc2UoKnRoaXMsIEFyZ05hbWUsIEFyZywgVmFsKSkKKyAgICAgIHJldHVybiB0cnVlOyAgLy8gUGFyc2UgRXJyb3IhCisgICAgbGlzdF9zdG9yYWdlPERhdGFUeXBlLCBTdG9yYWdlPjo6YWRkVmFsdWUoVmFsKTsKKyAgICBzZXRQb3NpdGlvbihwb3MpOworICAgIFBvc2l0aW9ucy5wdXNoX2JhY2socG9zKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGb3J3YXJkIHByaW50aW5nIHN0dWZmIHRvIHRoZSBwYXJzZXIuLi4KKyAgdmlydHVhbCBzaXplX3QgZ2V0T3B0aW9uV2lkdGgoKSBjb25zdCB7cmV0dXJuIFBhcnNlci5nZXRPcHRpb25XaWR0aCgqdGhpcyk7fQorICB2aXJ0dWFsIHZvaWQgcHJpbnRPcHRpb25JbmZvKHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3QgeworICAgIFBhcnNlci5wcmludE9wdGlvbkluZm8oKnRoaXMsIEdsb2JhbFdpZHRoKTsKKyAgfQorCisgIHZvaWQgZG9uZSgpIHsKKyAgICBhZGRBcmd1bWVudCgpOworICAgIFBhcnNlci5pbml0aWFsaXplKCp0aGlzKTsKKyAgfQorcHVibGljOgorICBQYXJzZXJDbGFzcyAmZ2V0UGFyc2VyKCkgeyByZXR1cm4gUGFyc2VyOyB9CisKKyAgdW5zaWduZWQgZ2V0UG9zaXRpb24odW5zaWduZWQgb3B0bnVtKSBjb25zdCB7CisgICAgYXNzZXJ0KG9wdG51bSA8IHRoaXMtPnNpemUoKSAmJiAiSW52YWxpZCBvcHRpb24gaW5kZXgiKTsKKyAgICByZXR1cm4gUG9zaXRpb25zW29wdG51bV07CisgIH0KKworICB2b2lkIHNldE51bUFkZGl0aW9uYWxWYWxzKHVuc2lnbmVkIG4pIHsKKyAgICBPcHRpb246OnNldE51bUFkZGl0aW9uYWxWYWxzKG4pOworICB9CisKKyAgLy8gT25lIG9wdGlvbi4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQ+CisgIGV4cGxpY2l0IGxpc3QoY29uc3QgTTB0ICZNMCkgOiBPcHRpb24oWmVyb09yTW9yZSB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gVHdvIG9wdGlvbnMuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgTTB0LCBjbGFzcyBNMXQ+CisgIGxpc3QoY29uc3QgTTB0ICZNMCwgY29uc3QgTTF0ICZNMSkgOiBPcHRpb24oWmVyb09yTW9yZSB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsgYXBwbHkoTTEsIHRoaXMpOworICAgIGRvbmUoKTsKKyAgfQorICAvLyBUaHJlZSBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQ+CisgIGxpc3QoY29uc3QgTTB0ICZNMCwgY29uc3QgTTF0ICZNMSwgY29uc3QgTTJ0ICZNMikKKyAgICA6IE9wdGlvbihaZXJvT3JNb3JlIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7IGFwcGx5KE0yLCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gRm91ciBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQsIGNsYXNzIE0zdD4KKyAgbGlzdChjb25zdCBNMHQgJk0wLCBjb25zdCBNMXQgJk0xLCBjb25zdCBNMnQgJk0yLCBjb25zdCBNM3QgJk0zKQorICAgIDogT3B0aW9uKFplcm9Pck1vcmUgfCBOb3RIaWRkZW4pIHsKKyAgICBhcHBseShNMCwgdGhpcyk7IGFwcGx5KE0xLCB0aGlzKTsgYXBwbHkoTTIsIHRoaXMpOyBhcHBseShNMywgdGhpcyk7CisgICAgZG9uZSgpOworICB9CisgIC8vIEZpdmUgb3B0aW9ucy4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQsIGNsYXNzIE0xdCwgY2xhc3MgTTJ0LCBjbGFzcyBNM3QsIGNsYXNzIE00dD4KKyAgbGlzdChjb25zdCBNMHQgJk0wLCBjb25zdCBNMXQgJk0xLCBjb25zdCBNMnQgJk0yLCBjb25zdCBNM3QgJk0zLAorICAgICAgIGNvbnN0IE00dCAmTTQpIDogT3B0aW9uKFplcm9Pck1vcmUgfCBOb3RIaWRkZW4pIHsKKyAgICBhcHBseShNMCwgdGhpcyk7IGFwcGx5KE0xLCB0aGlzKTsgYXBwbHkoTTIsIHRoaXMpOyBhcHBseShNMywgdGhpcyk7CisgICAgYXBwbHkoTTQsIHRoaXMpOworICAgIGRvbmUoKTsKKyAgfQorICAvLyBTaXggb3B0aW9ucy4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQsIGNsYXNzIE0xdCwgY2xhc3MgTTJ0LCBjbGFzcyBNM3QsCisgICAgICAgICAgIGNsYXNzIE00dCwgY2xhc3MgTTV0PgorICBsaXN0KGNvbnN0IE0wdCAmTTAsIGNvbnN0IE0xdCAmTTEsIGNvbnN0IE0ydCAmTTIsIGNvbnN0IE0zdCAmTTMsCisgICAgICAgY29uc3QgTTR0ICZNNCwgY29uc3QgTTV0ICZNNSkgOiBPcHRpb24oWmVyb09yTW9yZSB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsgYXBwbHkoTTEsIHRoaXMpOyBhcHBseShNMiwgdGhpcyk7IGFwcGx5KE0zLCB0aGlzKTsKKyAgICBhcHBseShNNCwgdGhpcyk7IGFwcGx5KE01LCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gU2V2ZW4gb3B0aW9ucy4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQsIGNsYXNzIE0xdCwgY2xhc3MgTTJ0LCBjbGFzcyBNM3QsCisgICAgICAgICAgIGNsYXNzIE00dCwgY2xhc3MgTTV0LCBjbGFzcyBNNnQ+CisgIGxpc3QoY29uc3QgTTB0ICZNMCwgY29uc3QgTTF0ICZNMSwgY29uc3QgTTJ0ICZNMiwgY29uc3QgTTN0ICZNMywKKyAgICAgICBjb25zdCBNNHQgJk00LCBjb25zdCBNNXQgJk01LCBjb25zdCBNNnQgJk02KQorICAgIDogT3B0aW9uKFplcm9Pck1vcmUgfCBOb3RIaWRkZW4pIHsKKyAgICBhcHBseShNMCwgdGhpcyk7IGFwcGx5KE0xLCB0aGlzKTsgYXBwbHkoTTIsIHRoaXMpOyBhcHBseShNMywgdGhpcyk7CisgICAgYXBwbHkoTTQsIHRoaXMpOyBhcHBseShNNSwgdGhpcyk7IGFwcGx5KE02LCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gRWlnaHQgb3B0aW9ucy4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQsIGNsYXNzIE0xdCwgY2xhc3MgTTJ0LCBjbGFzcyBNM3QsCisgICAgICAgICAgIGNsYXNzIE00dCwgY2xhc3MgTTV0LCBjbGFzcyBNNnQsIGNsYXNzIE03dD4KKyAgbGlzdChjb25zdCBNMHQgJk0wLCBjb25zdCBNMXQgJk0xLCBjb25zdCBNMnQgJk0yLCBjb25zdCBNM3QgJk0zLAorICAgICAgIGNvbnN0IE00dCAmTTQsIGNvbnN0IE01dCAmTTUsIGNvbnN0IE02dCAmTTYsCisgICAgICAgY29uc3QgTTd0ICZNNykgOiBPcHRpb24oWmVyb09yTW9yZSB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsgYXBwbHkoTTEsIHRoaXMpOyBhcHBseShNMiwgdGhpcyk7IGFwcGx5KE0zLCB0aGlzKTsKKyAgICBhcHBseShNNCwgdGhpcyk7IGFwcGx5KE01LCB0aGlzKTsgYXBwbHkoTTYsIHRoaXMpOyBhcHBseShNNywgdGhpcyk7CisgICAgZG9uZSgpOworICB9Cit9OworCisvLyBtdWx0aV92YWwgLSBNb2RpZmllciB0byBzZXQgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHZhbHVlcy4KK3N0cnVjdCBtdWx0aV92YWwgeworICB1bnNpZ25lZCBBZGRpdGlvbmFsVmFsczsKKyAgZXhwbGljaXQgbXVsdGlfdmFsKHVuc2lnbmVkIE4pIDogQWRkaXRpb25hbFZhbHMoTikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRCwgdHlwZW5hbWUgUywgdHlwZW5hbWUgUD4KKyAgdm9pZCBhcHBseShsaXN0PEQsIFMsIFA+ICZMKSBjb25zdCB7IEwuc2V0TnVtQWRkaXRpb25hbFZhbHMoQWRkaXRpb25hbFZhbHMpOyB9Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBiaXRzX3N0b3JhZ2UgY2xhc3MKKworLy8gRGVmYXVsdCBzdG9yYWdlIGNsYXNzIGRlZmluaXRpb246IGV4dGVybmFsIHN0b3JhZ2UuICBUaGlzIGltcGxlbWVudGF0aW9uCisvLyBhc3N1bWVzIHRoZSB1c2VyIHdpbGwgc3BlY2lmeSBhIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBkYXRhIGludG8gd2l0aCB0aGUKKy8vIGNsOjpsb2NhdGlvbih4KSBtb2RpZmllci4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBEYXRhVHlwZSwgY2xhc3MgU3RvcmFnZUNsYXNzPgorY2xhc3MgYml0c19zdG9yYWdlIHsKKyAgdW5zaWduZWQgKkxvY2F0aW9uOyAgIC8vIFdoZXJlIHRvIHN0b3JlIHRoZSBiaXRzLi4uCisKKyAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgc3RhdGljIHVuc2lnbmVkIEJpdChjb25zdCBUICZWKSB7CisgICAgdW5zaWduZWQgQml0UG9zID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZD4oVik7CisgICAgYXNzZXJ0KEJpdFBvcyA8IHNpemVvZih1bnNpZ25lZCkgKiBDSEFSX0JJVCAmJgorICAgICAgICAgICJlbnVtIGV4Y2VlZHMgd2lkdGggb2YgYml0IHZlY3RvciEiKTsKKyAgICByZXR1cm4gMSA8PCBCaXRQb3M7CisgIH0KKworcHVibGljOgorICBiaXRzX3N0b3JhZ2UoKSA6IExvY2F0aW9uKDApIHt9CisKKyAgYm9vbCBzZXRMb2NhdGlvbihPcHRpb24gJk8sIHVuc2lnbmVkICZMKSB7CisgICAgaWYgKExvY2F0aW9uKQorICAgICAgcmV0dXJuIE8uZXJyb3IoImNsOjpsb2NhdGlvbih4KSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UhIik7CisgICAgTG9jYXRpb24gPSAmTDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBUPgorICB2b2lkIGFkZFZhbHVlKGNvbnN0IFQgJlYpIHsKKyAgICBhc3NlcnQoTG9jYXRpb24gIT0gMCAmJiAiY2w6OmxvY2F0aW9uKC4uLikgbm90IHNwZWNpZmllZCBmb3IgYSBjb21tYW5kICIKKyAgICAgICAgICAgImxpbmUgb3B0aW9uIHdpdGggZXh0ZXJuYWwgc3RvcmFnZSEiKTsKKyAgICAqTG9jYXRpb24gfD0gQml0KFYpOworICB9CisKKyAgdW5zaWduZWQgZ2V0Qml0cygpIHsgcmV0dXJuICpMb2NhdGlvbjsgfQorCisgIHRlbXBsYXRlPGNsYXNzIFQ+CisgIGJvb2wgaXNTZXQoY29uc3QgVCAmVikgeworICAgIHJldHVybiAoKkxvY2F0aW9uICYgQml0KFYpKSAhPSAwOworICB9Cit9OworCisKKy8vIERlZmluZSBob3cgdG8gaG9sZCBiaXRzLiAgU2luY2Ugd2UgY2FuIGluaGVyaXQgZnJvbSBhIGNsYXNzLCB3ZSBkbyBzby4KKy8vIFRoaXMgbWFrZXMgdXMgZXhhY3RseSBjb21wYXRpYmxlIHdpdGggdGhlIGJpdHMgaW4gYWxsIGNhc2VzIHRoYXQgaXQgaXMgdXNlZC4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBEYXRhVHlwZT4KK2NsYXNzIGJpdHNfc3RvcmFnZTxEYXRhVHlwZSwgYm9vbD4geworICB1bnNpZ25lZCBCaXRzOyAgIC8vIFdoZXJlIHRvIHN0b3JlIHRoZSBiaXRzLi4uCisKKyAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgc3RhdGljIHVuc2lnbmVkIEJpdChjb25zdCBUICZWKSB7CisgICAgdW5zaWduZWQgQml0UG9zID0gKHVuc2lnbmVkKVY7CisgICAgYXNzZXJ0KEJpdFBvcyA8IHNpemVvZih1bnNpZ25lZCkgKiBDSEFSX0JJVCAmJgorICAgICAgICAgICJlbnVtIGV4Y2VlZHMgd2lkdGggb2YgYml0IHZlY3RvciEiKTsKKyAgICByZXR1cm4gMSA8PCBCaXRQb3M7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZTxjbGFzcyBUPgorICB2b2lkIGFkZFZhbHVlKGNvbnN0IFQgJlYpIHsKKyAgICBCaXRzIHw9ICBCaXQoVik7CisgIH0KKworICB1bnNpZ25lZCBnZXRCaXRzKCkgeyByZXR1cm4gQml0czsgfQorCisgIHRlbXBsYXRlPGNsYXNzIFQ+CisgIGJvb2wgaXNTZXQoY29uc3QgVCAmVikgeworICAgIHJldHVybiAoQml0cyAmIEJpdChWKSkgIT0gMDsKKyAgfQorfTsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gYml0cyAtIEEgYml0IHZlY3RvciBvZiBjb21tYW5kIG9wdGlvbnMuCisvLwordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlLCBjbGFzcyBTdG9yYWdlID0gYm9vbCwKKyAgICAgICAgICBjbGFzcyBQYXJzZXJDbGFzcyA9IHBhcnNlcjxEYXRhVHlwZT4gPgorY2xhc3MgYml0cyA6IHB1YmxpYyBPcHRpb24sIHB1YmxpYyBiaXRzX3N0b3JhZ2U8RGF0YVR5cGUsIFN0b3JhZ2U+IHsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFBvc2l0aW9uczsKKyAgUGFyc2VyQ2xhc3MgUGFyc2VyOworCisgIHZpcnR1YWwgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyc2VyLmdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpOworICB9CisgIHZpcnR1YWwgdm9pZCBnZXRFeHRyYU9wdGlvbk5hbWVzKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBjaGFyKj4gJk9wdGlvbk5hbWVzKSB7CisgICAgcmV0dXJuIFBhcnNlci5nZXRFeHRyYU9wdGlvbk5hbWVzKE9wdGlvbk5hbWVzKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBoYW5kbGVPY2N1cnJlbmNlKHVuc2lnbmVkIHBvcywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBBcmcpeworICAgIHR5cGVuYW1lIFBhcnNlckNsYXNzOjpwYXJzZXJfZGF0YV90eXBlIFZhbCA9CisgICAgICB0eXBlbmFtZSBQYXJzZXJDbGFzczo6cGFyc2VyX2RhdGFfdHlwZSgpOworICAgIGlmIChQYXJzZXIucGFyc2UoKnRoaXMsIEFyZ05hbWUsIEFyZywgVmFsKSkKKyAgICAgIHJldHVybiB0cnVlOyAgLy8gUGFyc2UgRXJyb3IhCisgICAgYWRkVmFsdWUoVmFsKTsKKyAgICBzZXRQb3NpdGlvbihwb3MpOworICAgIFBvc2l0aW9ucy5wdXNoX2JhY2socG9zKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGb3J3YXJkIHByaW50aW5nIHN0dWZmIHRvIHRoZSBwYXJzZXIuLi4KKyAgdmlydHVhbCBzaXplX3QgZ2V0T3B0aW9uV2lkdGgoKSBjb25zdCB7cmV0dXJuIFBhcnNlci5nZXRPcHRpb25XaWR0aCgqdGhpcyk7fQorICB2aXJ0dWFsIHZvaWQgcHJpbnRPcHRpb25JbmZvKHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3QgeworICAgIFBhcnNlci5wcmludE9wdGlvbkluZm8oKnRoaXMsIEdsb2JhbFdpZHRoKTsKKyAgfQorCisgIHZvaWQgZG9uZSgpIHsKKyAgICBhZGRBcmd1bWVudCgpOworICAgIFBhcnNlci5pbml0aWFsaXplKCp0aGlzKTsKKyAgfQorcHVibGljOgorICBQYXJzZXJDbGFzcyAmZ2V0UGFyc2VyKCkgeyByZXR1cm4gUGFyc2VyOyB9CisKKyAgdW5zaWduZWQgZ2V0UG9zaXRpb24odW5zaWduZWQgb3B0bnVtKSBjb25zdCB7CisgICAgYXNzZXJ0KG9wdG51bSA8IHRoaXMtPnNpemUoKSAmJiAiSW52YWxpZCBvcHRpb24gaW5kZXgiKTsKKyAgICByZXR1cm4gUG9zaXRpb25zW29wdG51bV07CisgIH0KKworICAvLyBPbmUgb3B0aW9uLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdD4KKyAgZXhwbGljaXQgYml0cyhjb25zdCBNMHQgJk0wKSA6IE9wdGlvbihaZXJvT3JNb3JlIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOworICAgIGRvbmUoKTsKKyAgfQorICAvLyBUd28gb3B0aW9ucy4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQsIGNsYXNzIE0xdD4KKyAgYml0cyhjb25zdCBNMHQgJk0wLCBjb25zdCBNMXQgJk0xKSA6IE9wdGlvbihaZXJvT3JNb3JlIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7CisgICAgZG9uZSgpOworICB9CisgIC8vIFRocmVlIG9wdGlvbnMuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgTTB0LCBjbGFzcyBNMXQsIGNsYXNzIE0ydD4KKyAgYml0cyhjb25zdCBNMHQgJk0wLCBjb25zdCBNMXQgJk0xLCBjb25zdCBNMnQgJk0yKQorICAgIDogT3B0aW9uKFplcm9Pck1vcmUgfCBOb3RIaWRkZW4pIHsKKyAgICBhcHBseShNMCwgdGhpcyk7IGFwcGx5KE0xLCB0aGlzKTsgYXBwbHkoTTIsIHRoaXMpOworICAgIGRvbmUoKTsKKyAgfQorICAvLyBGb3VyIG9wdGlvbnMuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgTTB0LCBjbGFzcyBNMXQsIGNsYXNzIE0ydCwgY2xhc3MgTTN0PgorICBiaXRzKGNvbnN0IE0wdCAmTTAsIGNvbnN0IE0xdCAmTTEsIGNvbnN0IE0ydCAmTTIsIGNvbnN0IE0zdCAmTTMpCisgICAgOiBPcHRpb24oWmVyb09yTW9yZSB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsgYXBwbHkoTTEsIHRoaXMpOyBhcHBseShNMiwgdGhpcyk7IGFwcGx5KE0zLCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gRml2ZSBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQsIGNsYXNzIE0zdCwgY2xhc3MgTTR0PgorICBiaXRzKGNvbnN0IE0wdCAmTTAsIGNvbnN0IE0xdCAmTTEsIGNvbnN0IE0ydCAmTTIsIGNvbnN0IE0zdCAmTTMsCisgICAgICAgY29uc3QgTTR0ICZNNCkgOiBPcHRpb24oWmVyb09yTW9yZSB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsgYXBwbHkoTTEsIHRoaXMpOyBhcHBseShNMiwgdGhpcyk7IGFwcGx5KE0zLCB0aGlzKTsKKyAgICBhcHBseShNNCwgdGhpcyk7CisgICAgZG9uZSgpOworICB9CisgIC8vIFNpeCBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQsIGNsYXNzIE0zdCwKKyAgICAgICAgICAgY2xhc3MgTTR0LCBjbGFzcyBNNXQ+CisgIGJpdHMoY29uc3QgTTB0ICZNMCwgY29uc3QgTTF0ICZNMSwgY29uc3QgTTJ0ICZNMiwgY29uc3QgTTN0ICZNMywKKyAgICAgICBjb25zdCBNNHQgJk00LCBjb25zdCBNNXQgJk01KSA6IE9wdGlvbihaZXJvT3JNb3JlIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7IGFwcGx5KE0yLCB0aGlzKTsgYXBwbHkoTTMsIHRoaXMpOworICAgIGFwcGx5KE00LCB0aGlzKTsgYXBwbHkoTTUsIHRoaXMpOworICAgIGRvbmUoKTsKKyAgfQorICAvLyBTZXZlbiBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQsIGNsYXNzIE0zdCwKKyAgICAgICAgICAgY2xhc3MgTTR0LCBjbGFzcyBNNXQsIGNsYXNzIE02dD4KKyAgYml0cyhjb25zdCBNMHQgJk0wLCBjb25zdCBNMXQgJk0xLCBjb25zdCBNMnQgJk0yLCBjb25zdCBNM3QgJk0zLAorICAgICAgIGNvbnN0IE00dCAmTTQsIGNvbnN0IE01dCAmTTUsIGNvbnN0IE02dCAmTTYpCisgICAgOiBPcHRpb24oWmVyb09yTW9yZSB8IE5vdEhpZGRlbikgeworICAgIGFwcGx5KE0wLCB0aGlzKTsgYXBwbHkoTTEsIHRoaXMpOyBhcHBseShNMiwgdGhpcyk7IGFwcGx5KE0zLCB0aGlzKTsKKyAgICBhcHBseShNNCwgdGhpcyk7IGFwcGx5KE01LCB0aGlzKTsgYXBwbHkoTTYsIHRoaXMpOworICAgIGRvbmUoKTsKKyAgfQorICAvLyBFaWdodCBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQsIGNsYXNzIE0zdCwKKyAgICAgICAgICAgY2xhc3MgTTR0LCBjbGFzcyBNNXQsIGNsYXNzIE02dCwgY2xhc3MgTTd0PgorICBiaXRzKGNvbnN0IE0wdCAmTTAsIGNvbnN0IE0xdCAmTTEsIGNvbnN0IE0ydCAmTTIsIGNvbnN0IE0zdCAmTTMsCisgICAgICAgY29uc3QgTTR0ICZNNCwgY29uc3QgTTV0ICZNNSwgY29uc3QgTTZ0ICZNNiwKKyAgICAgICBjb25zdCBNN3QgJk03KSA6IE9wdGlvbihaZXJvT3JNb3JlIHwgTm90SGlkZGVuKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7IGFwcGx5KE0yLCB0aGlzKTsgYXBwbHkoTTMsIHRoaXMpOworICAgIGFwcGx5KE00LCB0aGlzKTsgYXBwbHkoTTUsIHRoaXMpOyBhcHBseShNNiwgdGhpcyk7IGFwcGx5KE03LCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBbGlhc2VkIGNvbW1hbmQgbGluZSBvcHRpb24gKGFsaWFzIHRoaXMgbmFtZSB0byBhIHByZWV4aXN0aW5nIG5hbWUpCisvLworCitjbGFzcyBhbGlhcyA6IHB1YmxpYyBPcHRpb24geworICBPcHRpb24gKkFsaWFzRm9yOworICB2aXJ0dWFsIGJvb2wgaGFuZGxlT2NjdXJyZW5jZSh1bnNpZ25lZCBwb3MsIFN0cmluZ1JlZiAvKkFyZ05hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZykgeworICAgIHJldHVybiBBbGlhc0Zvci0+aGFuZGxlT2NjdXJyZW5jZShwb3MsIEFsaWFzRm9yLT5BcmdTdHIsIEFyZyk7CisgIH0KKyAgLy8gSGFuZGxlIHByaW50aW5nIHN0dWZmLi4uCisgIHZpcnR1YWwgc2l6ZV90IGdldE9wdGlvbldpZHRoKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBwcmludE9wdGlvbkluZm8oc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICB2b2lkIGRvbmUoKSB7CisgICAgaWYgKCFoYXNBcmdTdHIoKSkKKyAgICAgIGVycm9yKCJjbDo6YWxpYXMgbXVzdCBoYXZlIGFyZ3VtZW50IG5hbWUgc3BlY2lmaWVkISIpOworICAgIGlmIChBbGlhc0ZvciA9PSAwKQorICAgICAgZXJyb3IoImNsOjphbGlhcyBtdXN0IGhhdmUgYW4gY2w6OmFsaWFzb3B0KG9wdGlvbikgc3BlY2lmaWVkISIpOworICAgICAgYWRkQXJndW1lbnQoKTsKKyAgfQorcHVibGljOgorICB2b2lkIHNldEFsaWFzRm9yKE9wdGlvbiAmTykgeworICAgIGlmIChBbGlhc0ZvcikKKyAgICAgIGVycm9yKCJjbDo6YWxpYXMgbXVzdCBvbmx5IGhhdmUgb25lIGNsOjphbGlhc29wdCguLi4pIHNwZWNpZmllZCEiKTsKKyAgICBBbGlhc0ZvciA9ICZPOworICB9CisKKyAgLy8gT25lIG9wdGlvbi4uLgorICB0ZW1wbGF0ZTxjbGFzcyBNMHQ+CisgIGV4cGxpY2l0IGFsaWFzKGNvbnN0IE0wdCAmTTApIDogT3B0aW9uKE9wdGlvbmFsIHwgSGlkZGVuKSwgQWxpYXNGb3IoMCkgeworICAgIGFwcGx5KE0wLCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gVHdvIG9wdGlvbnMuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgTTB0LCBjbGFzcyBNMXQ+CisgIGFsaWFzKGNvbnN0IE0wdCAmTTAsIGNvbnN0IE0xdCAmTTEpIDogT3B0aW9uKE9wdGlvbmFsIHwgSGlkZGVuKSwgQWxpYXNGb3IoMCkgeworICAgIGFwcGx5KE0wLCB0aGlzKTsgYXBwbHkoTTEsIHRoaXMpOworICAgIGRvbmUoKTsKKyAgfQorICAvLyBUaHJlZSBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQ+CisgIGFsaWFzKGNvbnN0IE0wdCAmTTAsIGNvbnN0IE0xdCAmTTEsIGNvbnN0IE0ydCAmTTIpCisgICAgOiBPcHRpb24oT3B0aW9uYWwgfCBIaWRkZW4pLCBBbGlhc0ZvcigwKSB7CisgICAgYXBwbHkoTTAsIHRoaXMpOyBhcHBseShNMSwgdGhpcyk7IGFwcGx5KE0yLCB0aGlzKTsKKyAgICBkb25lKCk7CisgIH0KKyAgLy8gRm91ciBvcHRpb25zLi4uCisgIHRlbXBsYXRlPGNsYXNzIE0wdCwgY2xhc3MgTTF0LCBjbGFzcyBNMnQsIGNsYXNzIE0zdD4KKyAgYWxpYXMoY29uc3QgTTB0ICZNMCwgY29uc3QgTTF0ICZNMSwgY29uc3QgTTJ0ICZNMiwgY29uc3QgTTN0ICZNMykKKyAgICA6IE9wdGlvbihPcHRpb25hbCB8IEhpZGRlbiksIEFsaWFzRm9yKDApIHsKKyAgICBhcHBseShNMCwgdGhpcyk7IGFwcGx5KE0xLCB0aGlzKTsgYXBwbHkoTTIsIHRoaXMpOyBhcHBseShNMywgdGhpcyk7CisgICAgZG9uZSgpOworICB9Cit9OworCisvLyBhbGlhc2ZvciAtIE1vZGlmaWVyIHRvIHNldCB0aGUgb3B0aW9uIGFuIGFsaWFzIGFsaWFzZXMuCitzdHJ1Y3QgYWxpYXNvcHQgeworICBPcHRpb24gJk9wdDsKKyAgZXhwbGljaXQgYWxpYXNvcHQoT3B0aW9uICZPKSA6IE9wdChPKSB7fQorICB2b2lkIGFwcGx5KGFsaWFzICZBKSBjb25zdCB7IEEuc2V0QWxpYXNGb3IoT3B0KTsgfQorfTsKKworLy8gZXh0cmFoZWxwIC0gcHJvdmlkZSBhZGRpdGlvbmFsIGhlbHAgYXQgdGhlIGVuZCBvZiB0aGUgbm9ybWFsIGhlbHAKKy8vIG91dHB1dC4gQWxsIG9jY3VycmVuY2VzIG9mIGNsOjpleHRyYWhlbHAgd2lsbCBiZSBhY2N1bXVsYXRlZCBhbmQKKy8vIHByaW50ZWQgdG8gc3RkZXJyIGF0IHRoZSBlbmQgb2YgdGhlIHJlZ3VsYXIgaGVscCwganVzdCBiZWZvcmUKKy8vIGV4aXQgaXMgY2FsbGVkLgorc3RydWN0IGV4dHJhaGVscCB7CisgIGNvbnN0IGNoYXIgKiBtb3JlaGVscDsKKyAgZXhwbGljaXQgZXh0cmFoZWxwKGNvbnN0IGNoYXIqIGhlbHApOworfTsKKwordm9pZCBQcmludFZlcnNpb25NZXNzYWdlKCk7CisvLyBUaGlzIGZ1bmN0aW9uIGp1c3QgcHJpbnRzIHRoZSBoZWxwIG1lc3NhZ2UsIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGlmIHRoZQorLy8gLWhlbHAgb3B0aW9uIGhhZCBiZWVuIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisvLyBOT1RFOiBUSElTIEZVTkNUSU9OIFRFUk1JTkFURVMgVEhFIFBST0dSQU0hCit2b2lkIFByaW50SGVscE1lc3NhZ2UoKTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIGNsCisKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjZTc2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0NvbXBpbGVyLmggLSBDb21waWxlciBhYnN0cmFjdGlvbiBzdXBwb3J0IC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgc2V2ZXJhbCBtYWNyb3MsIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbXBpbGVyLiAgVGhpcyBhbGxvd3MKKy8vIHVzZSBvZiBjb21waWxlci1zcGVjaWZpYyBmZWF0dXJlcyBpbiBhIHdheSB0aGF0IHJlbWFpbnMgcG9ydGFibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ09NUElMRVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ09NUElMRVJfSAorCisvLy8gTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgLSBJZiBhIGNsYXNzIG1hcmtlZCB3aXRoIHRoaXMgYXR0cmlidXRlIGlzIGxpbmtlZAorLy8vIGludG8gYSBzaGFyZWQgbGlicmFyeSwgdGhlbiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHByaXZhdGUgdG8gdGhlIGxpYnJhcnkgYW5kCisvLy8gbm90IGFjY2Vzc2libGUgZnJvbSBvdXRzaWRlIGl0LiAgQ2FuIGFsc28gYmUgdXNlZCB0byBtYXJrIHZhcmlhYmxlcyBhbmQKKy8vLyBmdW5jdGlvbnMsIG1ha2luZyB0aGVtIHByaXZhdGUgdG8gYW55IHNoYXJlZCBsaWJyYXJ5IHRoZXkgYXJlIGxpbmtlZCBpbnRvLgorCisvLy8gTExWTV9HTE9CQUxfVklTSUJJTElUWSAtIElmIGEgY2xhc3MgbWFya2VkIHdpdGggdGhpcyBhdHRyaWJ1dGUgaXMgbGlua2VkCisvLy8gaW50byBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHRoZSBjbGFzcyB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbSBvdXRzaWRlIHRoZQorLy8vIHRoZSBsaWJyYXJ5LiAgQ2FuIGFsc28gYmUgdXNlZCB0byBtYXJrIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLCBtYWtpbmcgdGhlbQorLy8vIGFjY2Vzc2libGUgZnJvbSBvdXRzaWRlIGFueSBzaGFyZWQgbGlicmFyeSB0aGV5IGFyZSBsaW5rZWQgaW50by4KKyNpZiAoX19HTlVDX18gPj0gNCkgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjZGVmaW5lIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZGVmaW5lIExMVk1fR0xPQkFMX1ZJU0lCSUxJVFkgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxzZQorI2RlZmluZSBMTFZNX0xJQlJBUllfVklTSUJJTElUWQorI2RlZmluZSBMTFZNX0dMT0JBTF9WSVNJQklMSVRZCisjZW5kaWYKKworI2lmIChfX0dOVUNfXyA+PSA0IHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDEpKQorI2RlZmluZSBBVFRSSUJVVEVfVVNFRCBfX2F0dHJpYnV0ZV9fKChfX3VzZWRfXykpCisjZWxzZQorI2RlZmluZSBBVFRSSUJVVEVfVVNFRAorI2VuZGlmCisKKyNpZiAoX19HTlVDX18gPj0gNCB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSAxKSkKKyNkZWZpbmUgQVRUUklCVVRFX1VOVVNFRCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKyNlbHNlCisjZGVmaW5lIEFUVFJJQlVURV9VTlVTRUQKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18gLy8gYWthICdBVFRSSUJVVEVfQ09OU1QnIGJ1dCBmb2xsb3dpbmcgTExWTSBDb252ZW50aW9ucy4KKyNkZWZpbmUgQVRUUklCVVRFX1JFQUROT05FIF9fYXR0cmlidXRlX18oKF9fY29uc3RfXykpCisjZWxzZQorI2RlZmluZSBBVFRSSUJVVEVfUkVBRE5PTkUKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18gIC8vIGFrYSAnQVRUUklCVVRFX1BVUkUnIGJ1dCBmb2xsb3dpbmcgTExWTSBDb252ZW50aW9ucy4KKyNkZWZpbmUgQVRUUklCVVRFX1JFQURPTkxZIF9fYXR0cmlidXRlX18oKF9fcHVyZV9fKSkKKyNlbHNlCisjZGVmaW5lIEFUVFJJQlVURV9SRUFET05MWQorI2VuZGlmCisKKyNpZiAoX19HTlVDX18gPj0gNCkKKyNkZWZpbmUgQlVJTFRJTl9FWFBFQ1QoRVhQUiwgVkFMVUUpIF9fYnVpbHRpbl9leHBlY3QoKEVYUFIpLCAoVkFMVUUpKQorI2Vsc2UKKyNkZWZpbmUgQlVJTFRJTl9FWFBFQ1QoRVhQUiwgVkFMVUUpIChFWFBSKQorI2VuZGlmCisKKy8vIEMrKyBkb2Vzbid0IHN1cHBvcnQgJ2V4dGVybiB0ZW1wbGF0ZScgb2YgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zLiAgR0NDIGRvZXMsCisvLyBidXQgcmVxdWlyZXMgX19leHRlbnNpb25fXyBiZWZvcmUgaXQuICBJbiB0aGUgaGVhZGVyLCB1c2UgdGhpczoKKy8vICAgRVhURVJOX1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgZm9vPGJhcj4pOworLy8gaW4gdGhlIC5jcHAgZmlsZSwgdXNlIHRoaXM6CisvLyAgIFRFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgZm9vPGJhcj4pOworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIEVYVEVSTl9URU1QTEFURV9JTlNUQU5USUFUSU9OKFgpIF9fZXh0ZW5zaW9uX18gZXh0ZXJuIHRlbXBsYXRlIFgKKyNkZWZpbmUgVEVNUExBVEVfSU5TVEFOVElBVElPTihYKSB0ZW1wbGF0ZSBYCisjZWxzZQorI2RlZmluZSBFWFRFUk5fVEVNUExBVEVfSU5TVEFOVElBVElPTihYKQorI2RlZmluZSBURU1QTEFURV9JTlNUQU5USUFUSU9OKFgpCisjZW5kaWYKKworLy8gRElTQUJMRV9JTkxJTkUgLSBPbiBjb21waWxlcnMgd2hlcmUgd2UgaGF2ZSBhIGRpcmVjdGl2ZSB0byBkbyBzbywgbWFyayBhCisvLyBtZXRob2QgIm5vdCBmb3IgaW5saW5pbmciLgorI2lmIChfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkpCisjZGVmaW5lIERJU0FCTEVfSU5MSU5FIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIERJU0FCTEVfSU5MSU5FIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjZWxzZQorI2RlZmluZSBESVNBQkxFX0lOTElORQorI2VuZGlmCisKKy8vIEFMV0FZU19JTkxJTkUgLSBPbiBjb21waWxlcnMgd2hlcmUgd2UgaGF2ZSBhIGRpcmVjdGl2ZSB0byBkbyBzbywgbWFyayBhCisvLyBtZXRob2QgImFsd2F5cyBpbmxpbmUiIGJlY2F1c2UgaXQgaXMgcGVyZm9ybWFuY2Ugc2Vuc2l0aXZlLgorLy8gR0NDIDMuNCBzdXBwb3J0ZWQgdGhpcyBidXQgaXMgYnVnZ3kgaW4gdmFyaW91cyBjYXNlcyBhbmQgcHJvZHVjZXMKKy8vIHVuaW1wbGVtZW50ZWQgZXJyb3JzLCBqdXN0IHVzZSBpdCBpbiBHQ0MgNC4wIGFuZCBsYXRlci4KKyNpZiBfX0dOVUNfXyA+IDMKKyNkZWZpbmUgQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyNlbHNlCisvLyBUT0RPOiBObyBpZGVhIGhvdyB0byBkbyB0aGlzIHdpdGggTVNWQy4KKyNkZWZpbmUgQUxXQVlTX0lOTElORQorI2VuZGlmCisKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIE5PUkVUVVJOIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIE5PUkVUVVJOIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxzZQorI2RlZmluZSBOT1JFVFVSTgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29uc3RhbnRGb2xkZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbnN0YW50Rm9sZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2YzVmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbnN0YW50Rm9sZGVyLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0NvbnN0YW50Rm9sZGVyLmggLSBDb25zdGFudCBmb2xkaW5nIGhlbHBlciAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIENvbnN0YW50Rm9sZGVyIGNsYXNzLCBhIGhlbHBlciBmb3IgSVJCdWlsZGVyLgorLy8gSXQgcHJvdmlkZXMgSVJCdWlsZGVyIHdpdGggYSBzZXQgb2YgbWV0aG9kcyBmb3IgY3JlYXRpbmcgY29uc3RhbnRzCisvLyB3aXRoIG1pbmltYWwgZm9sZGluZy4gIEZvciBnZW5lcmFsIGNvbnN0YW50IGNyZWF0aW9uIGFuZCBmb2xkaW5nLAorLy8gdXNlIENvbnN0YW50RXhwciBhbmQgdGhlIHJvdXRpbmVzIGluIGxsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ09OU1RBTlRGT0xERVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ09OU1RBTlRGT0xERVJfSAorCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RyVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMTFZNQ29udGV4dDsKKworLy8vIENvbnN0YW50Rm9sZGVyIC0gQ3JlYXRlIGNvbnN0YW50cyB3aXRoIG1pbmltdW0sIHRhcmdldCBpbmRlcGVuZGVudCwgZm9sZGluZy4KK2NsYXNzIENvbnN0YW50Rm9sZGVyIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ29uc3RhbnRGb2xkZXIoTExWTUNvbnRleHQgJikge30KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQmluYXJ5IE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlQWRkKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRBZGQoTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVOU1dBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE5TV0FkZChMSFMsIFJIUyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZU5VV0FkZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TlVXQWRkKExIUywgUkhTKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlRkFkZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0RkFkZChMSFMsIFJIUyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVN1YihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0U3ViKExIUywgUkhTKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlTlNXU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXROU1dTdWIoTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVOVVdTdWIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE5VV1N1YihMSFMsIFJIUyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZTdWIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEZTdWIoTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE11bChMSFMsIFJIUyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZU5TV011bChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TlNXTXVsKExIUywgUkhTKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlTlVXTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXROVVdNdWwoTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRGTXVsKExIUywgUkhTKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlVURpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0VURpdihMSFMsIFJIUyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVNEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNEaXYoTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVFeGFjdFNEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEV4YWN0U0RpdihMSFMsIFJIUyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEZEaXYoTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVVUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRVUmVtKExIUywgUkhTKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlU1JlbShDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0U1JlbShMSFMsIFJIUyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZSZW0oQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEZSZW0oTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVTaGwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNobChMSFMsIFJIUyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUxTaHIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldExTaHIoTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVBU2hyKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRBU2hyKExIUywgUkhTKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlQW5kKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRBbmQoTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVPcihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0T3IoTEhTLCBSSFMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVYb3IoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFhvcihMSFMsIFJIUyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlQmluT3AoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0KE9wYywgTEhTLCBSSFMpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFVuYXJ5IE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlTmVnKENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TmVnKEMpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVOU1dOZWcoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXROU1dOZWcoQyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZU5VV05lZyhDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE5VV05lZyhDKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlRk5lZyhDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEZOZWcoQyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZU5vdChDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE5vdChDKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNZW1vcnkgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVHZXRFbGVtZW50UHRyKENvbnN0YW50ICpDLCBDb25zdGFudCogY29uc3QgKklkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoQywgSWR4TGlzdCwgTnVtSWR4KTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlR2V0RWxlbWVudFB0cihDb25zdGFudCAqQywgVmFsdWUqIGNvbnN0ICpJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKEMsIElkeExpc3QsIE51bUlkeCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKENvbnN0YW50ICpDLCBDb25zdGFudCogY29uc3QgKklkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKEMsIElkeExpc3QsIE51bUlkeCk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihDb25zdGFudCAqQywgVmFsdWUqIGNvbnN0ICpJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihDLCBJZHhMaXN0LCBOdW1JZHgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENhc3QvQ29udmVyc2lvbiBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkNhc3RPcHMgT3AsIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRDYXN0KE9wLCBDLCBEZXN0VHkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVQb2ludGVyQ2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0UG9pbnRlckNhc3QoQywgRGVzdFR5KTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlSW50Q2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW50ZWdlckNhc3QoQywgRGVzdFR5LCBpc1NpZ25lZCk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZQQ2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0RlBDYXN0KEMsIERlc3RUeSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlQml0Q2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIEMsIERlc3RUeSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUludFRvUHRyKENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6SW50VG9QdHIsIEMsIERlc3RUeSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVB0clRvSW50KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6UHRyVG9JbnQsIEMsIERlc3RUeSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVpFeHRPckJpdENhc3QoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFpFeHRPckJpdENhc3QoQywgRGVzdFR5KTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlU0V4dE9yQml0Q2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0U0V4dE9yQml0Q2FzdChDLCBEZXN0VHkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVRydW5jT3JCaXRDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRUcnVuY09yQml0Q2FzdChDLCBEZXN0VHkpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENvbXBhcmUgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVJQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQLCBDb25zdGFudCAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Q29tcGFyZShQLCBMSFMsIFJIUyk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZDbXAoQ21wSW5zdDo6UHJlZGljYXRlIFAsIENvbnN0YW50ICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRDb21wYXJlKFAsIExIUywgUkhTKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBPdGhlciBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNlbGVjdChDb25zdGFudCAqQywgQ29uc3RhbnQgKlRydWUsIENvbnN0YW50ICpGYWxzZSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNlbGVjdChDLCBUcnVlLCBGYWxzZSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlRXh0cmFjdEVsZW1lbnQoQ29uc3RhbnQgKlZlYywgQ29uc3RhbnQgKklkeCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEV4dHJhY3RFbGVtZW50KFZlYywgSWR4KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVJbnNlcnRFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpOZXdFbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRJbnNlcnRFbGVtZW50KFZlYywgTmV3RWx0LCBJZHgpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNodWZmbGVWZWN0b3IoQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpNYXNrKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0U2h1ZmZsZVZlY3RvcihWMSwgVjIsIE1hc2spOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUV4dHJhY3RWYWx1ZShDb25zdGFudCAqQWdnLCBjb25zdCB1bnNpZ25lZCAqSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0VmFsdWUoQWdnLCBJZHhMaXN0LCBOdW1JZHgpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluc2VydFZhbHVlKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqSWR4TGlzdCwgdW5zaWduZWQgTnVtSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0VmFsdWUoQWdnLCBWYWwsIElkeExpc3QsIE51bUlkeCk7CisgIH0KK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db25zdGFudFJhbmdlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db25zdGFudFJhbmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyNDI2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbnN0YW50UmFuZ2UuaApAQCAtMCwwICsxLDI1MSBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvQ29uc3RhbnRSYW5nZS5oIC0gUmVwcmVzZW50IGEgcmFuZ2UgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBSZXByZXNlbnQgYSByYW5nZSBvZiBwb3NzaWJsZSB2YWx1ZXMgdGhhdCBtYXkgb2NjdXIgd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4KKy8vIGZvciBhbiBpbnRlZ3JhbCB2YWx1ZS4gIFRoaXMga2VlcHMgdHJhY2sgb2YgYSBsb3dlciBhbmQgdXBwZXIgYm91bmQgZm9yIHRoZQorLy8gY29uc3RhbnQsIHdoaWNoIE1BWSB3cmFwIGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBudW1lcmljIHJhbmdlLiAgVG8gZG8gdGhpcywgaXQKKy8vIGtlZXBzIHRyYWNrIG9mIGEgW2xvd2VyLCB1cHBlcikgYm91bmQsIHdoaWNoIHNwZWNpZmllcyBhbiBpbnRlcnZhbCBqdXN0IGxpa2UKKy8vIFNUTCBpdGVyYXRvcnMuICBXaGVuIHVzZWQgd2l0aCBib29sZWFuIHZhbHVlcywgdGhlIGZvbGxvd2luZyBhcmUgaW1wb3J0YW50CisvLyByYW5nZXM6IDoKKy8vCisvLyAgW0YsIEYpID0ge30gICAgID0gRW1wdHkgc2V0CisvLyAgW1QsIEYpID0ge1R9CisvLyAgW0YsIFQpID0ge0Z9CisvLyAgW1QsIFQpID0ge0YsIFR9ID0gRnVsbCBzZXQKKy8vCisvLyBUaGUgb3RoZXIgaW50ZWdyYWwgcmFuZ2VzIHVzZSBtaW4vbWF4IHZhbHVlcyBmb3Igc3BlY2lhbCByYW5nZSB2YWx1ZXMuIEZvcgorLy8gZXhhbXBsZSwgZm9yIDgtYml0IHR5cGVzLCBpdCB1c2VzOgorLy8gWzAsIDApICAgICA9IHt9ICAgICAgID0gRW1wdHkgc2V0CisvLyBbMjU1LCAyNTUpID0gezAuLjI1NX0gPSBGdWxsIFNldAorLy8KKy8vIE5vdGUgdGhhdCBDb25zdGFudFJhbmdlIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBlaXRoZXIgc2lnbmVkIG9yCisvLyB1bnNpZ25lZCByYW5nZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ09OU1RBTlRfUkFOR0VfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ09OU1RBTlRfUkFOR0VfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQ29uc3RhbnRSYW5nZSAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiByYW5nZSBvZiB2YWx1ZXMuCisvLy8KK2NsYXNzIENvbnN0YW50UmFuZ2UgeworICBBUEludCBMb3dlciwgVXBwZXI7CisgIHN0YXRpYyBDb25zdGFudFJhbmdlIGludGVyc2VjdDFXcmFwcGVkKGNvbnN0IENvbnN0YW50UmFuZ2UgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RhbnRSYW5nZSAmUkhTKTsKKworcHVibGljOgorICAvLy8gSW5pdGlhbGl6ZSBhIGZ1bGwgKHRoZSBkZWZhdWx0KSBvciBlbXB0eSBzZXQgZm9yIHRoZSBzcGVjaWZpZWQgYml0IHdpZHRoLgorICAvLy8KKyAgZXhwbGljaXQgQ29uc3RhbnRSYW5nZSh1aW50MzJfdCBCaXRXaWR0aCwgYm9vbCBpc0Z1bGxTZXQgPSB0cnVlKTsKKworICAvLy8gSW5pdGlhbGl6ZSBhIHJhbmdlIHRvIGhvbGQgdGhlIHNpbmdsZSBzcGVjaWZpZWQgdmFsdWUuCisgIC8vLworICBDb25zdGFudFJhbmdlKGNvbnN0IEFQSW50ICZWYWx1ZSk7CisKKyAgLy8vIEBicmllZiBJbml0aWFsaXplIGEgcmFuZ2Ugb2YgdmFsdWVzIGV4cGxpY2l0bHkuIFRoaXMgd2lsbCBhc3NlcnQgb3V0IGlmCisgIC8vLyBMb3dlcj09VXBwZXIgYW5kIExvd2VyICE9IE1pbiBvciBNYXggdmFsdWUgZm9yIGl0cyB0eXBlLiBJdCB3aWxsIGFsc28KKyAgLy8vIGFzc2VydCBvdXQgaWYgdGhlIHR3byBBUEludCdzIGFyZSBub3QgdGhlIHNhbWUgYml0IHdpZHRoLgorICBDb25zdGFudFJhbmdlKGNvbnN0IEFQSW50JiBMb3dlciwgY29uc3QgQVBJbnQmIFVwcGVyKTsKKworICAvLy8gbWFrZUlDbXBSZWdpb24gLSBQcm9kdWNlIHRoZSBzbWFsbGVzdCByYW5nZSB0aGF0IGNvbnRhaW5zIGFsbCB2YWx1ZXMgdGhhdAorICAvLy8gbWlnaHQgc2F0aXNmeSB0aGUgY29tcGFyaXNvbiBzcGVjaWZpZWQgYnkgUHJlZCB3aGVuIGNvbXBhcmVkIHRvIGFueSB2YWx1ZQorICAvLy8gY29udGFpbmVkIHdpdGhpbiBPdGhlci4KKyAgLy8vCisgIC8vLyBTb2x2ZXMgZm9yIHJhbmdlIFggaW4gJ2ZvciBhbGwgeCBpbiBYLCB0aGVyZSBleGlzdHMgYSB5IGluIFkgc3VjaCB0aGF0CisgIC8vLyBpY21wIG9wIHgsIHkgaXMgdHJ1ZScuIEV2ZXJ5IHZhbHVlIHRoYXQgbWlnaHQgbWFrZSB0aGUgY29tcGFyaXNvbiB0cnVlCisgIC8vLyBpcyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHJhbmdlLgorICBzdGF0aWMgQ29uc3RhbnRSYW5nZSBtYWtlSUNtcFJlZ2lvbih1bnNpZ25lZCBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcik7CisKKyAgLy8vIGdldExvd2VyIC0gUmV0dXJuIHRoZSBsb3dlciB2YWx1ZSBmb3IgdGhpcyByYW5nZS4uLgorICAvLy8KKyAgY29uc3QgQVBJbnQgJmdldExvd2VyKCkgY29uc3QgeyByZXR1cm4gTG93ZXI7IH0KKworICAvLy8gZ2V0VXBwZXIgLSBSZXR1cm4gdGhlIHVwcGVyIHZhbHVlIGZvciB0aGlzIHJhbmdlLi4uCisgIC8vLworICBjb25zdCBBUEludCAmZ2V0VXBwZXIoKSBjb25zdCB7IHJldHVybiBVcHBlcjsgfQorCisgIC8vLyBnZXRCaXRXaWR0aCAtIGdldCB0aGUgYml0IHdpZHRoIG9mIHRoaXMgQ29uc3RhbnRSYW5nZQorICAvLy8KKyAgdWludDMyX3QgZ2V0Qml0V2lkdGgoKSBjb25zdCB7IHJldHVybiBMb3dlci5nZXRCaXRXaWR0aCgpOyB9CisKKyAgLy8vIGlzRnVsbFNldCAtIFJldHVybiB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZWxlbWVudHMgcG9zc2libGUKKyAgLy8vIGZvciB0aGlzIGRhdGEtdHlwZQorICAvLy8KKyAgYm9vbCBpc0Z1bGxTZXQoKSBjb25zdDsKKworICAvLy8gaXNFbXB0eVNldCAtIFJldHVybiB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5zIG5vIG1lbWJlcnMuCisgIC8vLworICBib29sIGlzRW1wdHlTZXQoKSBjb25zdDsKKworICAvLy8gaXNXcmFwcGVkU2V0IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzZXQgd3JhcHMgYXJvdW5kIHRoZSB0b3Agb2YgdGhlIHJhbmdlLAorICAvLy8gZm9yIGV4YW1wbGU6IFsxMDAsIDgpCisgIC8vLworICBib29sIGlzV3JhcHBlZFNldCgpIGNvbnN0OworCisgIC8vLyBjb250YWlucyAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgaW4gdGhlIHNldC4KKyAgLy8vCisgIGJvb2wgY29udGFpbnMoY29uc3QgQVBJbnQgJlZhbCkgY29uc3Q7CisKKyAgLy8vIGNvbnRhaW5zIC0gUmV0dXJuIHRydWUgaWYgdGhlIG90aGVyIHJhbmdlIGlzIGEgc3Vic2V0IG9mIHRoaXMgb25lLgorICAvLy8KKyAgYm9vbCBjb250YWlucyhjb25zdCBDb25zdGFudFJhbmdlICZDUikgY29uc3Q7CisKKyAgLy8vIGdldFNpbmdsZUVsZW1lbnQgLSBJZiB0aGlzIHNldCBjb250YWlucyBhIHNpbmdsZSBlbGVtZW50LCByZXR1cm4gaXQsCisgIC8vLyBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIC8vLworICBjb25zdCBBUEludCAqZ2V0U2luZ2xlRWxlbWVudCgpIGNvbnN0IHsKKyAgICBpZiAoVXBwZXIgPT0gTG93ZXIgKyAxKQorICAgICAgcmV0dXJuICZMb3dlcjsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBpc1NpbmdsZUVsZW1lbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNldCBjb250YWlucyBleGFjdGx5IG9uZSBtZW1iZXIuCisgIC8vLworICBib29sIGlzU2luZ2xlRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGdldFNpbmdsZUVsZW1lbnQoKSAhPSAwOyB9CisKKyAgLy8vIGdldFNldFNpemUgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHNldC4KKyAgLy8vCisgIEFQSW50IGdldFNldFNpemUoKSBjb25zdDsKKworICAvLy8gZ2V0VW5zaWduZWRNYXggLSBSZXR1cm4gdGhlIGxhcmdlc3QgdW5zaWduZWQgdmFsdWUgY29udGFpbmVkIGluIHRoZQorICAvLy8gQ29uc3RhbnRSYW5nZS4KKyAgLy8vCisgIEFQSW50IGdldFVuc2lnbmVkTWF4KCkgY29uc3Q7CisKKyAgLy8vIGdldFVuc2lnbmVkTWluIC0gUmV0dXJuIHRoZSBzbWFsbGVzdCB1bnNpZ25lZCB2YWx1ZSBjb250YWluZWQgaW4gdGhlCisgIC8vLyBDb25zdGFudFJhbmdlLgorICAvLy8KKyAgQVBJbnQgZ2V0VW5zaWduZWRNaW4oKSBjb25zdDsKKworICAvLy8gZ2V0U2lnbmVkTWF4IC0gUmV0dXJuIHRoZSBsYXJnZXN0IHNpZ25lZCB2YWx1ZSBjb250YWluZWQgaW4gdGhlCisgIC8vLyBDb25zdGFudFJhbmdlLgorICAvLy8KKyAgQVBJbnQgZ2V0U2lnbmVkTWF4KCkgY29uc3Q7CisKKyAgLy8vIGdldFNpZ25lZE1pbiAtIFJldHVybiB0aGUgc21hbGxlc3Qgc2lnbmVkIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUKKyAgLy8vIENvbnN0YW50UmFuZ2UuCisgIC8vLworICBBUEludCBnZXRTaWduZWRNaW4oKSBjb25zdDsKKworICAvLy8gb3BlcmF0b3I9PSAtIFJldHVybiB0cnVlIGlmIHRoaXMgcmFuZ2UgaXMgZXF1YWwgdG8gYW5vdGhlciByYW5nZS4KKyAgLy8vCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb25zdGFudFJhbmdlICZDUikgY29uc3QgeworICAgIHJldHVybiBMb3dlciA9PSBDUi5Mb3dlciAmJiBVcHBlciA9PSBDUi5VcHBlcjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ29uc3RhbnRSYW5nZSAmQ1IpIGNvbnN0IHsKKyAgICByZXR1cm4gIW9wZXJhdG9yPT0oQ1IpOworICB9CisKKyAgLy8vIHN1YnRyYWN0IC0gU3VidHJhY3QgdGhlIHNwZWNpZmllZCBjb25zdGFudCBmcm9tIHRoZSBlbmRwb2ludHMgb2YgdGhpcworICAvLy8gY29uc3RhbnQgcmFuZ2UuCisgIENvbnN0YW50UmFuZ2Ugc3VidHJhY3QoY29uc3QgQVBJbnQgJkNJKSBjb25zdDsKKworICAvLy8gaW50ZXJzZWN0V2l0aCAtIFJldHVybiB0aGUgcmFuZ2UgdGhhdCByZXN1bHRzIGZyb20gdGhlIGludGVyc2VjdGlvbiBvZgorICAvLy8gdGhpcyByYW5nZSB3aXRoIGFub3RoZXIgcmFuZ2UuICBUaGUgcmVzdWx0YW50IHJhbmdlIGlzIGd1YXJhbnRlZWQgdG8KKyAgLy8vIGluY2x1ZGUgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiBib3RoIGlucHV0IHJhbmdlcywgYW5kIHRvIGhhdmUgdGhlCisgIC8vLyBzbWFsbGVzdCBwb3NzaWJsZSBzZXQgc2l6ZSB0aGF0IGRvZXMgc28uICBCZWNhdXNlIHRoZXJlIG1heSBiZSB0d28KKyAgLy8vIGludGVyc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBzZXQgc2l6ZSwgQS5pbnRlcnNlY3RXaXRoKEIpIG1pZ2h0IG5vdAorICAvLy8gYmUgZXF1YWwgdG8gQi5pbnRlcnNlY3RXaXRoKEEpLgorICAvLy8KKyAgQ29uc3RhbnRSYW5nZSBpbnRlcnNlY3RXaXRoKGNvbnN0IENvbnN0YW50UmFuZ2UgJkNSKSBjb25zdDsKKworICAvLy8gdW5pb25XaXRoIC0gUmV0dXJuIHRoZSByYW5nZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgdW5pb24gb2YgdGhpcyByYW5nZQorICAvLy8gd2l0aCBhbm90aGVyIHJhbmdlLiAgVGhlIHJlc3VsdGFudCByYW5nZSBpcyBndWFyYW50ZWVkIHRvIGluY2x1ZGUgdGhlCisgIC8vLyBlbGVtZW50cyBvZiBib3RoIHNldHMsIGJ1dCBtYXkgY29udGFpbiBtb3JlLiAgRm9yIGV4YW1wbGUsIFszLCA5KSB1bmlvbgorICAvLy8gWzEyLDE1KSBpcyBbMywgMTUpLCB3aGljaCBpbmNsdWRlcyA5LCAxMCwgYW5kIDExLCB3aGljaCB3ZXJlIG5vdCBpbmNsdWRlZAorICAvLy8gaW4gZWl0aGVyIHNldCBiZWZvcmUuCisgIC8vLworICBDb25zdGFudFJhbmdlIHVuaW9uV2l0aChjb25zdCBDb25zdGFudFJhbmdlICZDUikgY29uc3Q7CisKKyAgLy8vIHplcm9FeHRlbmQgLSBSZXR1cm4gYSBuZXcgcmFuZ2UgaW4gdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHR5cGUsIHdoaWNoIG11c3QKKyAgLy8vIGJlIHN0cmljdGx5IGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHR5cGUuICBUaGUgcmV0dXJuZWQgcmFuZ2Ugd2lsbAorICAvLy8gY29ycmVzcG9uZCB0byB0aGUgcG9zc2libGUgcmFuZ2Ugb2YgdmFsdWVzIGlmIHRoZSBzb3VyY2UgcmFuZ2UgaGFkIGJlZW4KKyAgLy8vIHplcm8gZXh0ZW5kZWQgdG8gQml0V2lkdGguCisgIENvbnN0YW50UmFuZ2UgemVyb0V4dGVuZCh1aW50MzJfdCBCaXRXaWR0aCkgY29uc3Q7CisKKyAgLy8vIHNpZ25FeHRlbmQgLSBSZXR1cm4gYSBuZXcgcmFuZ2UgaW4gdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHR5cGUsIHdoaWNoIG11c3QKKyAgLy8vIGJlIHN0cmljdGx5IGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHR5cGUuICBUaGUgcmV0dXJuZWQgcmFuZ2Ugd2lsbAorICAvLy8gY29ycmVzcG9uZCB0byB0aGUgcG9zc2libGUgcmFuZ2Ugb2YgdmFsdWVzIGlmIHRoZSBzb3VyY2UgcmFuZ2UgaGFkIGJlZW4KKyAgLy8vIHNpZ24gZXh0ZW5kZWQgdG8gQml0V2lkdGguCisgIENvbnN0YW50UmFuZ2Ugc2lnbkV4dGVuZCh1aW50MzJfdCBCaXRXaWR0aCkgY29uc3Q7CisKKyAgLy8vIHRydW5jYXRlIC0gUmV0dXJuIGEgbmV3IHJhbmdlIGluIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB0eXBlLCB3aGljaCBtdXN0IGJlCisgIC8vLyBzdHJpY3RseSBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgdHlwZS4gIFRoZSByZXR1cm5lZCByYW5nZSB3aWxsCisgIC8vLyBjb3JyZXNwb25kIHRvIHRoZSBwb3NzaWJsZSByYW5nZSBvZiB2YWx1ZXMgaWYgdGhlIHNvdXJjZSByYW5nZSBoYWQgYmVlbgorICAvLy8gdHJ1bmNhdGVkIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgQ29uc3RhbnRSYW5nZSB0cnVuY2F0ZSh1aW50MzJfdCBCaXRXaWR0aCkgY29uc3Q7CisKKyAgLy8vIHpleHRPclRydW5jIC0gbWFrZSB0aGlzIHJhbmdlIGhhdmUgdGhlIGJpdCB3aWR0aCBnaXZlbiBieSBccCBCaXRXaWR0aC4gVGhlCisgIC8vLyB2YWx1ZSBpcyB6ZXJvIGV4dGVuZGVkLCB0cnVuY2F0ZWQsIG9yIGxlZnQgYWxvbmUgdG8gbWFrZSBpdCB0aGF0IHdpZHRoLgorICBDb25zdGFudFJhbmdlIHpleHRPclRydW5jKHVpbnQzMl90IEJpdFdpZHRoKSBjb25zdDsKKyAgCisgIC8vLyBzZXh0T3JUcnVuYyAtIG1ha2UgdGhpcyByYW5nZSBoYXZlIHRoZSBiaXQgd2lkdGggZ2l2ZW4gYnkgXHAgQml0V2lkdGguIFRoZQorICAvLy8gdmFsdWUgaXMgc2lnbiBleHRlbmRlZCwgdHJ1bmNhdGVkLCBvciBsZWZ0IGFsb25lIHRvIG1ha2UgaXQgdGhhdCB3aWR0aC4KKyAgQ29uc3RhbnRSYW5nZSBzZXh0T3JUcnVuYyh1aW50MzJfdCBCaXRXaWR0aCkgY29uc3Q7CisKKyAgLy8vIGFkZCAtIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcKKyAgLy8vIGZyb20gYW4gYWRkaXRpb24gb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBhIHZhbHVlIGluIE90aGVyLgorICBDb25zdGFudFJhbmdlIGFkZChjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIG11bHRpcGx5IC0gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhIG11bHRpcGxpY2F0aW9uIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbiBPdGhlci4KKyAgLy8vIFRPRE86IFRoaXMgaXNuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgeWV0LgorICBDb25zdGFudFJhbmdlIG11bHRpcGx5KGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gc21heCAtIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcKKyAgLy8vIGZyb20gYSBzaWduZWQgbWF4aW11bSBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYW5kIGEgdmFsdWUgaW4gT3RoZXIuCisgIENvbnN0YW50UmFuZ2Ugc21heChjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIHVtYXggLSBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGFuIHVuc2lnbmVkIG1heGltdW0gb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBhIHZhbHVlIGluIE90aGVyLgorICBDb25zdGFudFJhbmdlIHVtYXgoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyB1ZGl2IC0gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhbiB1bnNpZ25lZCBkaXZpc2lvbiBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYW5kIGEgdmFsdWUgaW4gT3RoZXIuCisgIC8vLyBUT0RPOiBUaGlzIGlzbid0IGZ1bGx5IGltcGxlbWVudGVkIHlldC4KKyAgQ29uc3RhbnRSYW5nZSB1ZGl2KGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gc2hsIC0gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhIGxlZnQgc2hpZnQgb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGJ5IHRoZSBBbW91bnQgdmFsdWUuCisgIENvbnN0YW50UmFuZ2Ugc2hsKGNvbnN0IENvbnN0YW50UmFuZ2UgJkFtb3VudCkgY29uc3Q7CisKKyAgLy8vIGFzaHIgLSBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nIGZyb20KKyAgLy8vIGFuIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGJ5IHRoZSBBbW91bnQgdmFsdWUuCisgIENvbnN0YW50UmFuZ2UgYXNocihjb25zdCBDb25zdGFudFJhbmdlICZBbW91bnQpIGNvbnN0OworCisgIC8vLyBzaHIgLSBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGEgbG9naWNhbCByaWdodCBzaGlmdCBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYnkgdGhlIEFtb3VudCB2YWx1ZS4KKyAgQ29uc3RhbnRSYW5nZSBsc2hyKGNvbnN0IENvbnN0YW50UmFuZ2UgJkFtb3VudCkgY29uc3Q7CisKKyAgLy8vIGludmVyc2UgLSBSZXR1cm4gYSBuZXcgcmFuZ2UgdGhhdCBpcyB0aGUgbG9naWNhbCBub3Qgb2YgdGhlIGN1cnJlbnQgc2V0LgorICBDb25zdGFudFJhbmdlIGludmVyc2UoKSBjb25zdDsKKyAgCisgIC8vLyBwcmludCAtIFByaW50IG91dCB0aGUgYm91bmRzIHRvIGEgc3RyZWFtLi4uCisgIC8vLworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIGR1bXAgLSBBbGxvdyBwcmludGluZyBmcm9tIGEgZGVidWdnZXIgZWFzaWx5Li4uCisgIC8vLworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IENvbnN0YW50UmFuZ2UgJkNSKSB7CisgIENSLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NyYXNoUmVjb3ZlcnlDb250ZXh0LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DcmFzaFJlY292ZXJ5Q29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NGQyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DcmFzaFJlY292ZXJ5Q29udGV4dC5oCkBAIC0wLDAgKzEsODIgQEAKKy8vPT09LS0tIENyYXNoUmVjb3ZlcnlDb250ZXh0LmggLSBDcmFzaCBSZWNvdmVyeSAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NSQVNIUkVDT1ZFUllDT05URVhUX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NSQVNIUkVDT1ZFUllDT05URVhUX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCisvLy8gXGJyaWVmIENyYXNoIHJlY292ZXJ5IGhlbHBlciBvYmplY3QuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgcnVubmluZyBvcGVyYXRpb25zIGluIGEgc2FmZSBjb250ZXh0IHNvCisvLy8gdGhhdCBjcmFzaGVzIChtZW1vcnkgZXJyb3JzLCBzdGFjayBvdmVyZmxvdywgYXNzZXJ0aW9uIHZpb2xhdGlvbnMpIGNhbiBiZQorLy8vIGRldGVjdGVkIGFuZCBjb250cm9sIHJlc3RvcmVkIHRvIHRoZSBjcmFzaGluZyB0aHJlYWQuIENyYXNoIGRldGVjdGlvbiBpcworLy8vIHB1cmVseSAiYmVzdCBlZmZvcnQiLCB0aGUgZXhhY3Qgc2V0IG9mIGZhaWx1cmVzIHdoaWNoIGNhbiBiZSByZWNvdmVyZWQgZnJvbQorLy8vIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4KKy8vLworLy8vIENsaWVudHMgbWFrZSB1c2Ugb2YgdGhpcyBjb2RlIGJ5IGZpcnN0IGNhbGxpbmcKKy8vLyBDcmFzaFJlY292ZXJ5Q29udGV4dDo6RW5hYmxlKCksIGFuZCB0aGVuIGV4ZWN1dGluZyB1bnNhZmUgb3BlcmF0aW9ucyB2aWEgYQorLy8vIENyYXNoUmVjb3ZlcnlDb250ZXh0IG9iamVjdC4gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICB2b2lkIGFjdHVhbF93b3JrKHZvaWQgKik7CisvLy8KKy8vLyAgICB2b2lkIGZvbygpIHsKKy8vLyAgICAgIENyYXNoUmVjb3ZlcnlDb250ZXh0IENSQzsKKy8vLworLy8vICAgICAgaWYgKCFDUkMuUnVuU2FmZWx5KGFjdHVhbF93b3JrLCAwKSkgeworLy8vICAgICAgICAgLi4uIGEgY3Jhc2ggd2FzIGRldGVjdGVkLCByZXBvcnQgZXJyb3IgdG8gdXNlciAuLi4KKy8vLyAgICAgIH0KKy8vLworLy8vICAgICAgLi4uIG5vIGNyYXNoIHdhcyBkZXRlY3RlZCAuLi4KKy8vLyAgICB9CisvLy8KKy8vLyBDcmFzaCByZWNvdmVyeSBjb250ZXh0cyBtYXkgbm90IGJlIG5lc3RlZC4KK2NsYXNzIENyYXNoUmVjb3ZlcnlDb250ZXh0IHsKKyAgdm9pZCAqSW1wbDsKKworcHVibGljOgorICBDcmFzaFJlY292ZXJ5Q29udGV4dCgpIDogSW1wbCgwKSB7fQorICB+Q3Jhc2hSZWNvdmVyeUNvbnRleHQoKTsKKworICAvLy8gXGJyaWVmIEVuYWJsZSBjcmFzaCByZWNvdmVyeS4gVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUsIGNsaWVudHMKKyAgLy8vIHNob3VsZCBjYWxsIGl0IGR1cmluZyBzdGFydHVwIG9yIHdpdGggYSBsb2NrIGhlbGQuCisgIHN0YXRpYyB2b2lkIEVuYWJsZSgpOworCisgIC8vLyBcYnJpZWYgRGlzYWJsZSBjcmFzaCByZWNvdmVyeS4gVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUsIGNsaWVudHMKKyAgLy8vIHNob3VsZCBjYWxsIGl0IGR1cmluZyBzdGFydHVwIG9yIHdpdGggYSBsb2NrIGhlbGQuCisgIHN0YXRpYyB2b2lkIERpc2FibGUoKTsKKworICAvLy8gXGJyaWVmIEV4ZWN1dGUgdGhlIHByb3ZpZGUgY2FsbGJhY2sgZnVuY3Rpb24gKHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cykgaW4KKyAgLy8vIGEgcHJvdGVjdGVkIGNvbnRleHQuCisgIC8vLworICAvLy8gXHJldHVybiBUcnVlIGlmIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBhbmQgZmFsc2UgaWYgdGhlCisgIC8vLyBmdW5jdGlvbiBjcmFzaGVkIChvciBIYW5kbGVDcmFzaCB3YXMgY2FsbGVkIGV4cGxpY2l0bHkpLiBDbGllbnRzIHNob3VsZAorICAvLy8gbWFrZSBhcyBsaXR0bGUgYXNzdW1wdGlvbnMgYXMgcG9zc2libGUgYWJvdXQgdGhlIHByb2dyYW0gc3RhdGUgd2hlbgorICAvLy8gUnVuU2FmZWx5IGhhcyByZXR1cm5lZCBmYWxzZS4gQ2xpZW50cyBjYW4gdXNlIGdldEJhY2t0cmFjZSgpIHRvIHJldHJpZXZlCisgIC8vLyB0aGUgYmFja3RyYWNlIG9mIHRoZSBjcmFzaCBvbiBmYWlsdXJlcy4KKyAgYm9vbCBSdW5TYWZlbHkodm9pZCAoKkZuKSh2b2lkKiksIHZvaWQgKlVzZXJEYXRhKTsKKworICAvLy8gXGJyaWVmIEV4cGxpY2l0bHkgdHJpZ2dlciBhIGNyYXNoIHJlY292ZXJ5IGluIHRoZSBjdXJyZW50IHByb2Nlc3MsIGFuZAorICAvLy8gcmV0dXJuIGZhaWx1cmUgZnJvbSBSdW5TYWZlbHkoKS4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4uCisgIHZvaWQgSGFuZGxlQ3Jhc2goKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBiYWNrdHJhY2Ugd2hlcmUgdGhlIGNyYXNoIHdhcworICAvLy8gZGV0ZWN0ZWQ7IG9yIGVtcHR5IGlmIHRoZSBiYWNrdHJhY2Ugd2Fzbid0IHJlY292ZXJlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdmFsaWQgd2hlbiBhIGNyYXNoIGhhcyBiZWVuIGRldGVjdGVkIChpLmUuLAorICAvLy8gUnVuU2FmZWx5KCkgaGFzIHJldHVybmVkIGZhbHNlLgorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0QmFja3RyYWNlKCkgY29uc3Q7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRE9UR3JhcGhUcmFpdHMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RPVEdyYXBoVHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2Yzc0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RPVEdyYXBoVHJhaXRzLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0RvdEdyYXBoVHJhaXRzLmggLSBDdXN0b21pemUgLmRvdCBvdXRwdXQgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSB0ZW1wbGF0ZSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBkb3Qgb3V0cHV0CisvLyBncmFwaHMgZ2VuZXJhdGVkIGJ5IHRoZSBHcmFwaFdyaXRlci5oIGZpbGUuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgorLy8gdGhpcyBmaWxlIHdpbGwgcHJvZHVjZSBhIHNpbXBsZSwgYnV0IG5vdCB2ZXJ5IHBvbGlzaGVkIGdyYXBoLiAgQnkKKy8vIHNwZWNpYWxpemluZyB0aGlzIHRlbXBsYXRlLCBsb3RzIG9mIGN1c3RvbWl6YXRpb24gb3Bwb3J0dW5pdGllcyBhcmUgcG9zc2libGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRE9UR1JBUEhUUkFJVFNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRE9UR1JBUEhUUkFJVFNfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBEZWZhdWx0RE9UR3JhcGhUcmFpdHMgLSBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZgorLy8vIGFsbCBvZiB0aGUgRE9UR3JhcGhUcmFpdHMgbWV0aG9kcy4gIElmIGEgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgbmVlZCB0bworLy8vIG92ZXJyaWRlIGFsbCBtZXRob2RzIGhlcmUgaXQgc2hvdWxkIGluaGVyaXQgc28gdGhhdCBpdCBjYW4gZ2V0IHRoZSBkZWZhdWx0CisvLy8gaW1wbGVtZW50YXRpb25zLgorLy8vCitzdHJ1Y3QgRGVmYXVsdERPVEdyYXBoVHJhaXRzIHsKK3ByaXZhdGU6CisgIGJvb2wgSXNTaW1wbGU7CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBpc1NpbXBsZSgpIHsKKyAgICByZXR1cm4gSXNTaW1wbGU7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBEZWZhdWx0RE9UR3JhcGhUcmFpdHMoYm9vbCBzaW1wbGU9ZmFsc2UpIDogSXNTaW1wbGUgKHNpbXBsZSkge30KKworICAvLy8gZ2V0R3JhcGhOYW1lIC0gUmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhlIGdyYXBoIGFzIGEgd2hvbGUuICBQcmludGVkIGF0IHRoZQorICAvLy8gdG9wIG9mIHRoZSBncmFwaC4KKyAgLy8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEdyYXBoTmFtZShjb25zdCBHcmFwaFR5cGUmIEdyYXBoKSB7IHJldHVybiAiIjsgfQorCisgIC8vLyBnZXRHcmFwaFByb3BlcnRpZXMgLSBSZXR1cm4gYW55IGN1c3RvbSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkCisgIC8vLyBpbiB0aGUgdG9wIGxldmVsIGdyYXBoIHN0cnVjdHVyZSBmb3IgZG90LgorICAvLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgR3JhcGhUeXBlPgorICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0R3JhcGhQcm9wZXJ0aWVzKGNvbnN0IEdyYXBoVHlwZSYgR3JhcGgpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLy8gcmVuZGVyR3JhcGhGcm9tQm90dG9tVXAgLSBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGdyYXBoIGlzCisgIC8vLyBlbWl0dGVkIGJvdHRvbS11cCBpbnN0ZWFkIG9mIHRvcC1kb3duLiAgVGhpcyByZXF1aXJlcyBncmFwaHZpeiAyLjAgdG8gd29yaworICAvLy8gdGhvdWdoLgorICBzdGF0aWMgYm9vbCByZW5kZXJHcmFwaEZyb21Cb3R0b21VcCgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNOb2RlSGlkZGVuIC0gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGdpdmVuIG5vZGUgaXMgbm90CisgIC8vLyBkaXNwbGF5ZWQgaW4gdGhlIGdyYXBoLgorICBzdGF0aWMgYm9vbCBpc05vZGVIaWRkZW4oY29uc3Qgdm9pZCAqTm9kZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBnZXROb2RlTGFiZWwgLSBHaXZlbiBhIG5vZGUgYW5kIGEgcG9pbnRlciB0byB0aGUgdG9wIGxldmVsIGdyYXBoLCByZXR1cm4KKyAgLy8vIHRoZSBsYWJlbCB0byBwcmludCBpbiB0aGUgbm9kZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgR3JhcGhUeXBlPgorICBzdGQ6OnN0cmluZyBnZXROb2RlTGFiZWwoY29uc3Qgdm9pZCAqTm9kZSwgY29uc3QgR3JhcGhUeXBlJiBHcmFwaCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8vLyBoYXNOb2RlQWRkcmVzc0xhYmVsIC0gSWYgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLCB0aGUgYWRkcmVzcyBvZiB0aGUgbm9kZQorICAvLy8gaXMgYWRkZWQgdG8gdGhlIGxhYmVsIG9mIHRoZSBub2RlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+CisgIHN0YXRpYyBib29sIGhhc05vZGVBZGRyZXNzTGFiZWwoY29uc3Qgdm9pZCAqTm9kZSwgY29uc3QgR3JhcGhUeXBlJiBHcmFwaCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGN1c3RvbSBub2RlIGF0dHJpYnV0ZXMsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIHNvCisgIC8vLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXROb2RlQXR0cmlidXRlcyhjb25zdCB2b2lkICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JhcGhUeXBlJiBHcmFwaCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8vLyBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgZG90IGF0dHJpYnV0ZXMgcHJpbnRlZCBmb3IgYSBwYXJ0aWN1bGFyIGVkZ2UsCisgIC8vLyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRWRnZUl0ZXI+CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRFZGdlQXR0cmlidXRlcyhjb25zdCB2b2lkICpOb2RlLCBFZGdlSXRlciBFSSkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8vLyBnZXRFZGdlU291cmNlTGFiZWwgLSBJZiB5b3Ugd2FudCB0byBsYWJlbCB0aGUgZWRnZSBzb3VyY2UgaXRzZWxmLAorICAvLy8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBFZGdlSXRlcj4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEVkZ2VTb3VyY2VMYWJlbChjb25zdCB2b2lkICpOb2RlLCBFZGdlSXRlciBJKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8vIGVkZ2VUYXJnZXRzRWRnZVNvdXJjZSAtIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGlzIG91dGdvaW5nIGVkZ2UKKyAgLy8vIHNob3VsZCBhY3R1YWxseSB0YXJnZXQgYW5vdGhlciBlZGdlIHNvdXJjZSwgbm90IGEgbm9kZS4gIElmIHRoaXMgbWV0aG9kIGlzCisgIC8vLyBpbXBsZW1lbnRlZCwgZ2V0RWRnZVRhcmdldCBzaG91bGQgYmUgaW1wbGVtZW50ZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEVkZ2VJdGVyPgorICBzdGF0aWMgYm9vbCBlZGdlVGFyZ2V0c0VkZ2VTb3VyY2UoY29uc3Qgdm9pZCAqTm9kZSwgRWRnZUl0ZXIgSSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBnZXRFZGdlVGFyZ2V0IC0gSWYgZWRnZVRhcmdldHNFZGdlU291cmNlIHJldHVybnMgdHJ1ZSwgdGhpcyBtZXRob2QgaXMKKyAgLy8vIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hpY2ggb3V0Z29pbmcgZWRnZSBvZiBOb2RlIGlzIHRoZSB0YXJnZXQgb2YgdGhpcworICAvLy8gZWRnZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRWRnZUl0ZXI+CisgIHN0YXRpYyBFZGdlSXRlciBnZXRFZGdlVGFyZ2V0KGNvbnN0IHZvaWQgKk5vZGUsIEVkZ2VJdGVyIEkpIHsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBoYXNFZGdlRGVzdExhYmVscyAtIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB0aGUgZ3JhcGggaXMgYWJsZQorICAvLy8gdG8gcHJvdmlkZSBsYWJlbHMgZm9yIGVkZ2UgZGVzdGluYXRpb25zLgorICBzdGF0aWMgYm9vbCBoYXNFZGdlRGVzdExhYmVscygpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gbnVtRWRnZURlc3RMYWJlbHMgLSBJZiBoYXNFZGdlRGVzdExhYmVscywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZQorICAvLy8gbnVtYmVyIG9mIGluY29taW5nIGVkZ2UgbGFiZWxzIHRoZSBnaXZlbiBub2RlIGhhcy4KKyAgc3RhdGljIHVuc2lnbmVkIG51bUVkZ2VEZXN0TGFiZWxzKGNvbnN0IHZvaWQgKk5vZGUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXRFZGdlRGVzdExhYmVsIC0gSWYgaGFzRWRnZURlc3RMYWJlbHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUKKyAgLy8vIGluY29taW5nIGVkZ2UgbGFiZWwgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIGdpdmVuIG5vZGUuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRFZGdlRGVzdExhYmVsKGNvbnN0IHZvaWQgKk5vZGUsIHVuc2lnbmVkIGkpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLy8gYWRkQ3VzdG9tR3JhcGhGZWF0dXJlcyAtIElmIGEgZ3JhcGggaXMgbWFkZSB1cCBvZiBtb3JlIHRoYW4ganVzdAorICAvLy8gc3RyYWlnaHQtZm9yd2FyZCBub2RlcyBhbmQgZWRnZXMsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIHB1dCBhbGwgb2YgdGhlCisgIC8vLyBjdXN0b20gc3R1ZmYgbmVjZXNzYXJ5LiAgVGhlIEdyYXBoV3JpdGVyIG9iamVjdCwgaW5zdGFudGlhdGVkIHdpdGggeW91cgorICAvLy8gR3JhcGhUeXBlIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudC4gIFlvdSBtYXkgY2FsbCBhcmJpdHJhcnkgbWV0aG9kcyBvbgorICAvLy8gaXQgdG8gYWRkIHRoaW5ncyB0byB0aGUgb3V0cHV0IGdyYXBoLgorICAvLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgR3JhcGhUeXBlLCB0eXBlbmFtZSBHcmFwaFdyaXRlcj4KKyAgc3RhdGljIHZvaWQgYWRkQ3VzdG9tR3JhcGhGZWF0dXJlcyhjb25zdCBHcmFwaFR5cGUmIEdyYXBoLCBHcmFwaFdyaXRlciAmR1cpIHt9Cit9OworCisKKy8vLyBET1RHcmFwaFRyYWl0cyAtIFRlbXBsYXRlIGNsYXNzIHRoYXQgY2FuIGJlIHNwZWNpYWxpemVkIHRvIGN1c3RvbWl6ZSBob3cKKy8vLyBncmFwaHMgYXJlIGNvbnZlcnRlZCB0byAnZG90JyBncmFwaHMuICBXaGVuIHNwZWNpYWxpemluZywgeW91IG1heSBpbmhlcml0CisvLy8gZnJvbSBEZWZhdWx0RE9UR3JhcGhUcmFpdHMgaWYgeW91IGRvbid0IG5lZWQgdG8gb3ZlcnJpZGUgZXZlcnl0aGluZy4KKy8vLwordGVtcGxhdGUgPHR5cGVuYW1lIFR5Pgorc3RydWN0IERPVEdyYXBoVHJhaXRzIDogcHVibGljIERlZmF1bHRET1RHcmFwaFRyYWl0cyB7CisgIERPVEdyYXBoVHJhaXRzIChib29sIHNpbXBsZT1mYWxzZSkgOiBEZWZhdWx0RE9UR3JhcGhUcmFpdHMgKHNpbXBsZSkge30KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGF0YUZsb3cuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RhdGFGbG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1YzQwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RhdGFGbG93LmgKQEAgLTAsMCArMSwxMDMgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0RhdGFGbG93LmggLSBkYXRhZmxvdyBhcyBncmFwaHMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRoYXQgYWxsb3dzIFVzZS1EZWYgYW5kCisvLyBEZWYtVXNlIHJlbGF0aW9ucyB0byBiZSB0cmVhdGVkIGFzIHByb3BlciBncmFwaHMgZm9yIGdlbmVyaWMgYWxnb3JpdGhtcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0RBVEFGTE9XX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0RBVEFGTE9XX0gKKworI2luY2x1ZGUgImxsdm0vVXNlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgZGVmLXVzZS91c2UtZGVmCisvLyBjaGFpbnMgYXMgZ3JhcGhzCisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBWYWx1ZSo+IHsKKyAgdHlwZWRlZiBjb25zdCBWYWx1ZSBOb2RlVHlwZTsKKyAgdHlwZWRlZiBWYWx1ZTo6Y29uc3RfdXNlX2l0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKGNvbnN0IFZhbHVlICpHKSB7CisgICAgcmV0dXJuIEc7CisgIH0KKworICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPnVzZV9iZWdpbigpOworICB9CisKKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTi0+dXNlX2VuZCgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8VmFsdWUqPiB7CisgIHR5cGVkZWYgVmFsdWUgTm9kZVR5cGU7CisgIHR5cGVkZWYgVmFsdWU6OnVzZV9pdGVyYXRvciBDaGlsZEl0ZXJhdG9yVHlwZTsKKworICBzdGF0aWMgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShWYWx1ZSAqRykgeworICAgIHJldHVybiBHOworICB9CisKKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBOLT51c2VfYmVnaW4oKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPnVzZV9lbmQoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8Y29uc3QgVXNlcio+ID4geworICB0eXBlZGVmIGNvbnN0IFZhbHVlIE5vZGVUeXBlOworICB0eXBlZGVmIFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKEludmVyc2U8Y29uc3QgVXNlcio+IEcpIHsKKyAgICByZXR1cm4gRy5HcmFwaDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICBpZiAoY29uc3QgVXNlciAqVSA9IGR5bl9jYXN0PFVzZXI+KE4pKQorICAgICAgcmV0dXJuIFUtPm9wX2JlZ2luKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlVHlwZSAqTikgeworICAgIGlmKGNvbnN0IFVzZXIgKlUgPSBkeW5fY2FzdDxVc2VyPihOKSkKKyAgICAgIHJldHVybiBVLT5vcF9lbmQoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8VXNlcio+ID4geworICB0eXBlZGVmIFZhbHVlIE5vZGVUeXBlOworICB0eXBlZGVmIFVzZXI6Om9wX2l0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKEludmVyc2U8VXNlcio+IEcpIHsKKyAgICByZXR1cm4gRy5HcmFwaDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICBpZiAoVXNlciAqVSA9IGR5bl9jYXN0PFVzZXI+KE4pKQorICAgICAgcmV0dXJuIFUtPm9wX2JlZ2luKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlVHlwZSAqTikgeworICAgIGlmIChVc2VyICpVID0gZHluX2Nhc3Q8VXNlcj4oTikpCisgICAgICByZXR1cm4gVS0+b3BfZW5kKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK307CisKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmguY21ha2UgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDIxMGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmguY21ha2UKQEAgLTAsMCArMSwxNTIgQEAKKy8qPT09LS0gaW5jbHVkZS9TdXBwb3J0L0RhdGFUeXBlcy5oIC0gRGVmaW5lIGZpeGVkIHNpemUgdHlwZXMgLS0tLS0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyB0byBmaWd1cmUgb3V0IHRoZSBzaXplIG9mIF9IT1NUXyBkYXRhIHR5cGVzLip8Cit8KiBUaGlzIGZpbGUgaXMgaW1wb3J0YW50IGJlY2F1c2UgZGlmZmVyZW50IGhvc3QgT1MncyBkZWZpbmUgZGlmZmVyZW50IG1hY3JvcywqfAorfCogd2hpY2ggbWFrZXMgcG9ydGFiaWxpdHkgdG91Z2guICBUaGlzIGZpbGUgZXhwb3J0cyB0aGUgZm9sbG93aW5nICAgICAgICAgICAgKnwKK3wqIGRlZmluaXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICBbdV1pbnQoMzJ8NjQpX3QgOiB0eXBlZGVmcyBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCAzMi82NCBiaXQgc3lzdGVtIHR5cGVzKnwKK3wqICAgW1VdSU5UKDh8MTZ8MzJ8NjQpXyhNSU58TUFYKSA6IENvbnN0YW50cyBmb3IgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcy4gICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTm8gbGlicmFyeSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZXNlIGZ1bmN0aW5vbnMuICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKiBQbGVhc2UgbGVhdmUgdGhpcyBmaWxlIEMtY29tcGF0aWJsZS4gKi8KKworI2lmbmRlZiBTVVBQT1JUX0RBVEFUWVBFU19ICisjZGVmaW5lIFNVUFBPUlRfREFUQVRZUEVTX0gKKworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggJHtIQVZFX1NZU19UWVBFU19IfQorI2NtYWtlZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAke0hBVkVfSU5UVFlQRVNfSH0KKyNjbWFrZWRlZmluZSBIQVZFX1NURElOVF9IICR7SEFWRV9TVERJTlRfSH0KKyNjbWFrZWRlZmluZSBIQVZFX1VJTlQ2NF9UICR7SEFWRV9VSU5UNjRfVH0KKyNjbWFrZWRlZmluZSBIQVZFX1VfSU5UNjRfVCAke0hBVkVfVV9JTlQ2NF9UfQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxjbWF0aD4KKyNlbHNlCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX01TQ19WRVIKKworLyogTm90ZSB0aGF0IHRoaXMgaGVhZGVyJ3MgY29ycmVjdCBvcGVyYXRpb24gZGVwZW5kcyBvbiBfX1NURENfTElNSVRfTUFDUk9TCisgICBiZWluZyBkZWZpbmVkLiAgV2Ugd291bGQgZGVmaW5lIGl0IGhlcmUsIGJ1dCBpbiBvcmRlciB0byBwcmV2ZW50IEJhZCBUaGluZ3MKKyAgIGhhcHBlbmluZyB3aGVuIHN5c3RlbSBoZWFkZXJzIG9yIEMrKyBTVEwgaGVhZGVycyBpbmNsdWRlIHN0ZGludC5oIGJlZm9yZSB3ZQorICAgZGVmaW5lIGl0IGhlcmUsIHdlIGRlZmluZSBpdCBvbiB0aGUgZysrIGNvbW1hbmQgbGluZSAoaW4gTWFrZWZpbGUucnVsZXMpLiAqLworI2lmICFkZWZpbmVkKF9fU1REQ19MSU1JVF9NQUNST1MpCisjIGVycm9yICJNdXN0ICNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyBiZWZvcmUgI2luY2x1ZGluZyBTdXBwb3J0L0RhdGFUeXBlcy5oIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX1NURENfQ09OU1RBTlRfTUFDUk9TKQorIyBlcnJvciAiTXVzdCAjZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MgYmVmb3JlICIgXAorICAgICAgICAiI2luY2x1ZGluZyBTdXBwb3J0L0RhdGFUeXBlcy5oIgorI2VuZGlmCisKKy8qIE5vdGUgdGhhdCA8aW50dHlwZXMuaD4gaW5jbHVkZXMgPHN0ZGludC5oPiwgaWYgdGhpcyBpcyBhIEM5OSBzeXN0ZW0uICovCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIF9BSVgKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQUlYRGF0YVR5cGVzRml4LmgiCisjZW5kaWYKKworLyogSGFuZGxlIGluY29ycmVjdCBkZWZpbml0aW9uIG9mIHVpbnQ2NF90IGFzIHVfaW50NjRfdCAqLworI2lmbmRlZiBIQVZFX1VJTlQ2NF9UCisjaWZkZWYgSEFWRV9VX0lOVDY0X1QKK3R5cGVkZWYgdV9pbnQ2NF90IHVpbnQ2NF90OworI2Vsc2UKKyMgZXJyb3IgIkRvbid0IGhhdmUgYSBkZWZpbml0aW9uIGZvciB1aW50NjRfdCBvbiB0aGlzIHBsYXRmb3JtIgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9PcGVuQlNEXworI2RlZmluZSBJTlQ4X01BWCAxMjcKKyNkZWZpbmUgSU5UOF9NSU4gLTEyOAorI2RlZmluZSBVSU5UOF9NQVggMjU1CisjZGVmaW5lIElOVDE2X01BWCAzMjc2NworI2RlZmluZSBJTlQxNl9NSU4gLTMyNzY4CisjZGVmaW5lIFVJTlQxNl9NQVggNjU1MzUKKyNkZWZpbmUgSU5UMzJfTUFYIDIxNDc0ODM2NDcKKyNkZWZpbmUgSU5UMzJfTUlOIC0yMTQ3NDgzNjQ4CisjZGVmaW5lIFVJTlQzMl9NQVggNDI5NDk2NzI5NVUKKyNlbmRpZgorCisjZWxzZSAvKiBfTVNDX1ZFUiAqLworLyogVmlzdWFsIEMrKyBkb2Vzbid0IHByb3ZpZGUgc3RhbmRhcmQgaW50ZWdlciBoZWFkZXJzLCBidXQgaXQgZG9lcyBwcm92aWRlCisgICBidWlsdC1pbiBkYXRhIHR5cGVzLiAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8Y21hdGg+CisjZWxzZQorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgordHlwZWRlZiBfX2ludDY0IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwordHlwZWRlZiBzaG9ydCBpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgaW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgc3NpemVfdDsKKyNkZWZpbmUgSU5UOF9NQVggMTI3CisjZGVmaW5lIElOVDhfTUlOIC0xMjgKKyNkZWZpbmUgVUlOVDhfTUFYIDI1NQorI2RlZmluZSBJTlQxNl9NQVggMzI3NjcKKyNkZWZpbmUgSU5UMTZfTUlOIC0zMjc2OAorI2RlZmluZSBVSU5UMTZfTUFYIDY1NTM1CisjZGVmaW5lIElOVDMyX01BWCAyMTQ3NDgzNjQ3CisjZGVmaW5lIElOVDMyX01JTiAtMjE0NzQ4MzY0OAorI2RlZmluZSBVSU5UMzJfTUFYIDQyOTQ5NjcyOTVVCisjZGVmaW5lIElOVDhfQyhDKSAgIEMKKyNkZWZpbmUgVUlOVDhfQyhDKSAgQworI2RlZmluZSBJTlQxNl9DKEMpICBDCisjZGVmaW5lIFVJTlQxNl9DKEMpIEMKKyNkZWZpbmUgSU5UMzJfQyhDKSAgQworI2RlZmluZSBVSU5UMzJfQyhDKSBDICMjIFUKKyNkZWZpbmUgSU5UNjRfQyhDKSAgKChpbnQ2NF90KSBDICMjIExMKQorI2RlZmluZSBVSU5UNjRfQyhDKSAoKHVpbnQ2NF90KSBDICMjIFVMTCkKKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCisvKiBTZXQgZGVmYXVsdHMgZm9yIGNvbnN0YW50cyB3aGljaCB3ZSBjYW5ub3QgZmluZC4gKi8KKyNpZiAhZGVmaW5lZChJTlQ2NF9NQVgpCisjIGRlZmluZSBJTlQ2NF9NQVggOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjZW5kaWYKKyNpZiAhZGVmaW5lZChJTlQ2NF9NSU4pCisjIGRlZmluZSBJTlQ2NF9NSU4gKCgtSU5UNjRfTUFYKS0xKQorI2VuZGlmCisjaWYgIWRlZmluZWQoVUlOVDY0X01BWCkKKyMgZGVmaW5lIFVJTlQ2NF9NQVggMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisjZW5kaWYKKworI2lmIF9fR05VQ19fID4gMworI2RlZmluZSBFTkRfV0lUSF9OVUxMIF9fYXR0cmlidXRlX18oKHNlbnRpbmVsKSkKKyNlbHNlCisjZGVmaW5lIEVORF9XSVRIX05VTEwKKyNlbmRpZgorCisjaWZuZGVmIEhVR0VfVkFMRgorI2RlZmluZSBIVUdFX1ZBTEYgKGZsb2F0KUhVR0VfVkFMCisjZW5kaWYKKworI2VuZGlmICAvKiBTVVBQT1JUX0RBVEFUWVBFU19IICovCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaC5pbiBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OTVhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaC5pbgpAQCAtMCwwICsxLDE0NyBAQAorLyo9PT0tLSBpbmNsdWRlL1N1cHBvcnQvRGF0YVR5cGVzLmggLSBEZWZpbmUgZml4ZWQgc2l6ZSB0eXBlcyAtLS0tLSotIEMgLSotPT09KlwNCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfA0KK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8DQorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwNCit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfA0KK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8DQorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwNCit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfA0KK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8DQorfCogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIHRvIGZpZ3VyZSBvdXQgdGhlIHNpemUgb2YgX0hPU1RfIGRhdGEgdHlwZXMuKnwNCit8KiBUaGlzIGZpbGUgaXMgaW1wb3J0YW50IGJlY2F1c2UgZGlmZmVyZW50IGhvc3QgT1MncyBkZWZpbmUgZGlmZmVyZW50IG1hY3JvcywqfA0KK3wqIHdoaWNoIG1ha2VzIHBvcnRhYmlsaXR5IHRvdWdoLiAgVGhpcyBmaWxlIGV4cG9ydHMgdGhlIGZvbGxvd2luZyAgICAgICAgICAgICp8DQorfCogZGVmaW5pdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwNCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfA0KK3wqICAgW3VdaW50KDMyfDY0KV90IDogdHlwZWRlZnMgZm9yIHNpZ25lZCBhbmQgdW5zaWduZWQgMzIvNjQgYml0IHN5c3RlbSB0eXBlcyp8DQorfCogICBbVV1JTlQoOHwxNnwzMnw2NClfKE1JTnxNQVgpIDogQ29uc3RhbnRzIGZvciB0aGUgbWluIGFuZCBtYXggdmFsdWVzLiAgICAgKnwNCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfA0KK3wqIE5vIGxpYnJhcnkgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGVzZSBmdW5jdGlub25zLiAgICAgICAgICAgICAgICAgICAgICAgICp8DQorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwNCit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLw0KKw0KKy8qIFBsZWFzZSBsZWF2ZSB0aGlzIGZpbGUgQy1jb21wYXRpYmxlLiAqLw0KKw0KKyNpZm5kZWYgU1VQUE9SVF9EQVRBVFlQRVNfSA0KKyNkZWZpbmUgU1VQUE9SVF9EQVRBVFlQRVNfSA0KKw0KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19IDQorI3VuZGVmIEhBVkVfSU5UVFlQRVNfSA0KKyN1bmRlZiBIQVZFX1NURElOVF9IDQorI3VuZGVmIEhBVkVfVUlOVDY0X1QNCisjdW5kZWYgSEFWRV9VX0lOVDY0X1QNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCisjaW5jbHVkZSA8Y21hdGg+DQorI2Vsc2UNCisjaW5jbHVkZSA8bWF0aC5oPg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX01TQ19WRVINCisNCisvKiBOb3RlIHRoYXQgdGhpcyBoZWFkZXIncyBjb3JyZWN0IG9wZXJhdGlvbiBkZXBlbmRzIG9uIF9fU1REQ19MSU1JVF9NQUNST1MNCisgICBiZWluZyBkZWZpbmVkLiAgV2Ugd291bGQgZGVmaW5lIGl0IGhlcmUsIGJ1dCBpbiBvcmRlciB0byBwcmV2ZW50IEJhZCBUaGluZ3MNCisgICBoYXBwZW5pbmcgd2hlbiBzeXN0ZW0gaGVhZGVycyBvciBDKysgU1RMIGhlYWRlcnMgaW5jbHVkZSBzdGRpbnQuaCBiZWZvcmUgd2UNCisgICBkZWZpbmUgaXQgaGVyZSwgd2UgZGVmaW5lIGl0IG9uIHRoZSBnKysgY29tbWFuZCBsaW5lIChpbiBNYWtlZmlsZS5ydWxlcykuICovDQorI2lmICFkZWZpbmVkKF9fU1REQ19MSU1JVF9NQUNST1MpDQorIyBlcnJvciAiTXVzdCAjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MgYmVmb3JlICNpbmNsdWRpbmcgU3VwcG9ydC9EYXRhVHlwZXMuaCINCisjZW5kaWYNCisNCisjaWYgIWRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykNCisjIGVycm9yICJNdXN0ICNkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUyBiZWZvcmUgIiBcDQorICAgICAgICAiI2luY2x1ZGluZyBTdXBwb3J0L0RhdGFUeXBlcy5oIg0KKyNlbmRpZg0KKw0KKy8qIE5vdGUgdGhhdCA8aW50dHlwZXMuaD4gaW5jbHVkZXMgPHN0ZGludC5oPiwgaWYgdGhpcyBpcyBhIEM5OSBzeXN0ZW0uICovDQorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gNCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQorI2VuZGlmDQorDQorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSA0KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBIQVZFX1NURElOVF9IDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfQUlYDQorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BSVhEYXRhVHlwZXNGaXguaCINCisjZW5kaWYNCisNCisvKiBIYW5kbGUgaW5jb3JyZWN0IGRlZmluaXRpb24gb2YgdWludDY0X3QgYXMgdV9pbnQ2NF90ICovDQorI2lmbmRlZiBIQVZFX1VJTlQ2NF9UDQorI2lmZGVmIEhBVkVfVV9JTlQ2NF9UDQordHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3Q7DQorI2Vsc2UNCisjIGVycm9yICJEb24ndCBoYXZlIGEgZGVmaW5pdGlvbiBmb3IgdWludDY0X3Qgb24gdGhpcyBwbGF0Zm9ybSINCisjZW5kaWYNCisjZW5kaWYNCisNCisjaWZkZWYgX09wZW5CU0RfDQorI2RlZmluZSBJTlQ4X01BWCAxMjcNCisjZGVmaW5lIElOVDhfTUlOIC0xMjgNCisjZGVmaW5lIFVJTlQ4X01BWCAyNTUNCisjZGVmaW5lIElOVDE2X01BWCAzMjc2Nw0KKyNkZWZpbmUgSU5UMTZfTUlOIC0zMjc2OA0KKyNkZWZpbmUgVUlOVDE2X01BWCA2NTUzNQ0KKyNkZWZpbmUgSU5UMzJfTUFYIDIxNDc0ODM2NDcNCisjZGVmaW5lIElOVDMyX01JTiAtMjE0NzQ4MzY0OA0KKyNkZWZpbmUgVUlOVDMyX01BWCA0Mjk0OTY3Mjk1VQ0KKyNlbmRpZg0KKw0KKyNlbHNlIC8qIF9NU0NfVkVSICovDQorLyogVmlzdWFsIEMrKyBkb2Vzbid0IHByb3ZpZGUgc3RhbmRhcmQgaW50ZWdlciBoZWFkZXJzLCBidXQgaXQgZG9lcyBwcm92aWRlDQorICAgYnVpbHQtaW4gZGF0YSB0eXBlcy4gKi8NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0ZGRlZi5oPg0KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCit0eXBlZGVmIF9faW50NjQgaW50NjRfdDsNCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7DQordHlwZWRlZiBzaWduZWQgaW50IGludDMyX3Q7DQordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7DQordHlwZWRlZiBzaG9ydCBpbnQxNl90Ow0KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7DQordHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7DQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7DQordHlwZWRlZiBzaWduZWQgaW50IHNzaXplX3Q7DQorI2RlZmluZSBJTlQ4X01BWCAxMjcNCisjZGVmaW5lIElOVDhfTUlOIC0xMjgNCisjZGVmaW5lIFVJTlQ4X01BWCAyNTUNCisjZGVmaW5lIElOVDE2X01BWCAzMjc2Nw0KKyNkZWZpbmUgSU5UMTZfTUlOIC0zMjc2OA0KKyNkZWZpbmUgVUlOVDE2X01BWCA2NTUzNQ0KKyNkZWZpbmUgSU5UMzJfTUFYIDIxNDc0ODM2NDcNCisjZGVmaW5lIElOVDMyX01JTiAtMjE0NzQ4MzY0OA0KKyNkZWZpbmUgVUlOVDMyX01BWCA0Mjk0OTY3Mjk1VQ0KKyNkZWZpbmUgSU5UOF9DKEMpICAgQw0KKyNkZWZpbmUgVUlOVDhfQyhDKSAgQw0KKyNkZWZpbmUgSU5UMTZfQyhDKSAgQw0KKyNkZWZpbmUgVUlOVDE2X0MoQykgQw0KKyNkZWZpbmUgSU5UMzJfQyhDKSAgQw0KKyNkZWZpbmUgVUlOVDMyX0MoQykgQyAjIyBVDQorI2RlZmluZSBJTlQ2NF9DKEMpICAoKGludDY0X3QpIEMgIyMgTEwpDQorI2RlZmluZSBVSU5UNjRfQyhDKSAoKHVpbnQ2NF90KSBDICMjIFVMTCkNCisjZW5kaWYgLyogX01TQ19WRVIgKi8NCisNCisvKiBTZXQgZGVmYXVsdHMgZm9yIGNvbnN0YW50cyB3aGljaCB3ZSBjYW5ub3QgZmluZC4gKi8NCisjaWYgIWRlZmluZWQoSU5UNjRfTUFYKQ0KKyMgZGVmaW5lIElOVDY0X01BWCA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwNCisjZW5kaWYNCisjaWYgIWRlZmluZWQoSU5UNjRfTUlOKQ0KKyMgZGVmaW5lIElOVDY0X01JTiAoKC1JTlQ2NF9NQVgpLTEpDQorI2VuZGlmDQorI2lmICFkZWZpbmVkKFVJTlQ2NF9NQVgpDQorIyBkZWZpbmUgVUlOVDY0X01BWCAweGZmZmZmZmZmZmZmZmZmZmZVTEwNCisjZW5kaWYNCisNCisjaWYgX19HTlVDX18gPiAzDQorI2RlZmluZSBFTkRfV0lUSF9OVUxMIF9fYXR0cmlidXRlX18oKHNlbnRpbmVsKSkNCisjZWxzZQ0KKyNkZWZpbmUgRU5EX1dJVEhfTlVMTA0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgSFVHRV9WQUxGDQorI2RlZmluZSBIVUdFX1ZBTEYgKGZsb2F0KUhVR0VfVkFMDQorI2VuZGlmDQorDQorI2VuZGlmICAvKiBTVVBQT1JUX0RBVEFUWVBFU19IICovDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGVidWcuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1MWZjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RlYnVnLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvRGVidWcuaCAtIEVhc3kgd2F5IHRvIGFkZCBkZWJ1ZyBvdXRwdXQgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBoYW5keSB3YXkgb2YgYWRkaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB5b3VyCisvLyBjb2RlLCB3aXRob3V0IGl0IGJlaW5nIGVuYWJsZWQgYWxsIG9mIHRoZSB0aW1lLCBhbmQgd2l0aG91dCBoYXZpbmcgdG8gYWRkCisvLyBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBlbmFibGUgaXQuCisvLworLy8gSW4gcGFydGljdWxhciwganVzdCB3cmFwIHlvdXIgY29kZSB3aXRoIHRoZSBERUJVRygpIG1hY3JvLCBhbmQgaXQgd2lsbCBiZQorLy8gZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGlmIHlvdSBzcGVjaWZ5ICctZGVidWcnIG9uIHRoZSBjb21tYW5kLWxpbmUuCisvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gdXNlIHRoZSBTRVRfREVCVUdfVFlQRSgiZm9vIikgbWFjcm8gdG8gc3BlY2lmeQorLy8gdGhhdCB5b3VyIGRlYnVnIGNvZGUgYmVsb25ncyB0byBjbGFzcyAiZm9vIi4gIFRoZW4sIG9uIHRoZSBjb21tYW5kIGxpbmUsIHlvdQorLy8gY2FuIHNwZWNpZnkgJy1kZWJ1Zy1vbmx5PWZvbycgdG8gZW5hYmxlIEpVU1QgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGZvciB0aGUKKy8vIGZvbyBjbGFzcy4KKy8vCisvLyBXaGVuIGNvbXBpbGluZyB3aXRob3V0IGFzc2VydGlvbnMsIHRoZSAtZGVidWctKiBvcHRpb25zIGFuZCBhbGwgY29kZSBpbgorLy8gREVCVUcoKSBzdGF0ZW1lbnRzIGRpc2FwcGVhcnMsIHNvIGl0IGRvZXMgbm90IGVmZmVjdCB0aGUgcnVudGltZSBvZiB0aGUgY29kZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9ERUJVR19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9ERUJVR19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBERUJVR19UWVBFIG1hY3JvIC0gRmlsZXMgY2FuIHNwZWNpZnkgYSBERUJVR19UWVBFIGFzIGEgc3RyaW5nLCB3aGljaCBjYXVzZXMKKy8vLyBhbGwgb2YgdGhlaXIgREVCVUcgc3RhdGVtZW50cyB0byBiZSBhY3RpdmF0YWJsZSB3aXRoIC1kZWJ1Zy1vbmx5PXRoYXRzdHJpbmcuCisjaWZuZGVmIERFQlVHX1RZUEUKKyNkZWZpbmUgREVCVUdfVFlQRSAiIgorI2VuZGlmCisgIAorI2lmbmRlZiBOREVCVUcKKy8vLyBEZWJ1Z0ZsYWcgLSBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgaWYgdGhlICctZGVidWcnIGNvbW1hbmQgbGluZSBvcHRpb24KKy8vLyBpcyBzcGVjaWZpZWQuICBUaGlzIHNob3VsZCBwcm9iYWJseSBub3QgYmUgcmVmZXJlbmNlZCBkaXJlY3RseSwgaW5zdGVhZCwgdXNlCisvLy8gdGhlIERFQlVHIG1hY3JvIGJlbG93LgorLy8vCitleHRlcm4gYm9vbCBEZWJ1Z0ZsYWc7CisgIAorLy8vIGlzQ3VycmVudERlYnVnVHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHRoZSBkZWJ1ZyB0eXBlCisvLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIG9yIGlmIG5vbmUgd2FzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lCisvLy8gd2l0aCB0aGUgLWRlYnVnLW9ubHk9WCBvcHRpb24uCisvLy8KK2Jvb2wgaXNDdXJyZW50RGVidWdUeXBlKGNvbnN0IGNoYXIgKlR5cGUpOworCisvLy8gU2V0Q3VycmVudERlYnVnVHlwZSAtIFNldCB0aGUgY3VycmVudCBkZWJ1ZyB0eXBlLCBhcyBpZiB0aGUgLWRlYnVnLW9ubHk9WAorLy8vIG9wdGlvbiB3ZXJlIHNwZWNpZmllZC4gIE5vdGUgdGhhdCBEZWJ1Z0ZsYWcgYWxzbyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZSBmb3IKKy8vLyBkZWJ1ZyBvdXRwdXQgdG8gYmUgcHJvZHVjZWQuCisvLy8KK3ZvaWQgU2V0Q3VycmVudERlYnVnVHlwZShjb25zdCBjaGFyICpUeXBlKTsKKyAgCisvLy8gREVCVUdfV0lUSF9UWVBFIG1hY3JvIC0gVGhpcyBtYWNybyBzaG91bGQgYmUgdXNlZCBieSBwYXNzZXMgdG8gZW1pdCBkZWJ1ZworLy8vIGluZm9ybWF0aW9uLiAgSW4gdGhlICctZGVidWcnIG9wdGlvbiBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lLCBhbmQgaWYKKy8vLyB0aGlzIGlzIGEgZGVidWcgYnVpbGQsIHRoZW4gdGhlIGNvZGUgc3BlY2lmaWVkIGFzIHRoZSBvcHRpb24gdG8gdGhlIG1hY3JvCisvLy8gd2lsbCBiZSBleGVjdXRlZC4gIE90aGVyd2lzZSBpdCB3aWxsIG5vdCBiZS4gIEV4YW1wbGU6CisvLy8KKy8vLyBERUJVR19XSVRIX1RZUEUoImJpdHNldCIsIGRiZ3MoKSA8PCAiQml0c2V0IGNvbnRhaW5zOiAiIDw8IEJpdHNldCA8PCAiXG4iKTsKKy8vLworLy8vIFRoaXMgd2lsbCBlbWl0IHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBpZiAtZGVidWcgaXMgcHJlc2VudCwgYW5kIC1kZWJ1Zy1vbmx5CisvLy8gaXMgbm90IHNwZWNpZmllZCwgb3IgaXMgc3BlY2lmaWVkIGFzICJiaXRzZXQiLgorI2RlZmluZSBERUJVR19XSVRIX1RZUEUoVFlQRSwgWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7IGlmICg6Omxsdm06OkRlYnVnRmxhZyAmJiA6Omxsdm06OmlzQ3VycmVudERlYnVnVHlwZShUWVBFKSkgeyBYOyB9IFwKKyAgfSB3aGlsZSAoMCkKKworI2Vsc2UKKyNkZWZpbmUgaXNDdXJyZW50RGVidWdUeXBlKFgpIChmYWxzZSkKKyNkZWZpbmUgU2V0Q3VycmVudERlYnVnVHlwZShYKQorI2RlZmluZSBERUJVR19XSVRIX1RZUEUoVFlQRSwgWCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8vLyBFbmFibGVEZWJ1Z0J1ZmZlcmluZyAtIFRoaXMgZGVmYXVsdHMgdG8gZmFsc2UuICBJZiB0cnVlLCB0aGUgZGVidWcKKy8vLyBzdHJlYW0gd2lsbCBpbnN0YWxsIHNpZ25hbCBoYW5kbGVycyB0byBkdW1wIGFueSBidWZmZXJlZCBkZWJ1ZworLy8vIG91dHB1dC4gIEl0IGFsbG93cyBjbGllbnRzIHRvIHNlbGVjdGl2ZWx5IGFsbG93IHRoZSBkZWJ1ZyBzdHJlYW0KKy8vLyB0byBpbnN0YWxsIHNpZ25hbCBoYW5kbGVycyBpZiB0aGV5IGFyZSBjZXJ0YWluIHRoZXJlIHdpbGwgYmUgbm8KKy8vLyBjb25mbGljdC4KKy8vLworZXh0ZXJuIGJvb2wgRW5hYmxlRGVidWdCdWZmZXJpbmc7CisKKy8vLyBkYmdzKCkgLSBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSByYXdfb3N0cmVhbSBmb3IgZGVidWdnaW5nCisvLy8gbWVzc2FnZXMuICBJZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQgaXQgcmV0dXJucyBlcnJzKCkuICBVc2UgaXQKKy8vLyBsaWtlOiBkYmdzKCkgPDwgImZvbyIgPDwgImJhciI7CityYXdfb3N0cmVhbSAmZGJncygpOworCisvLyBERUJVRyBtYWNybyAtIFRoaXMgbWFjcm8gc2hvdWxkIGJlIHVzZWQgYnkgcGFzc2VzIHRvIGVtaXQgZGVidWcgaW5mb3JtYXRpb24uCisvLyBJbiB0aGUgJy1kZWJ1Zycgb3B0aW9uIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZGxpbmUsIGFuZCBpZiB0aGlzIGlzIGEKKy8vIGRlYnVnIGJ1aWxkLCB0aGVuIHRoZSBjb2RlIHNwZWNpZmllZCBhcyB0aGUgb3B0aW9uIHRvIHRoZSBtYWNybyB3aWxsIGJlCisvLyBleGVjdXRlZC4gIE90aGVyd2lzZSBpdCB3aWxsIG5vdCBiZS4gIEV4YW1wbGU6CisvLworLy8gREVCVUcoZGJncygpIDw8ICJCaXRzZXQgY29udGFpbnM6ICIgPDwgQml0c2V0IDw8ICJcbiIpOworLy8KKyNkZWZpbmUgREVCVUcoWCkgREVCVUdfV0lUSF9UWVBFKERFQlVHX1RZUEUsIFgpCisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGVidWdMb2MuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RlYnVnTG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjMzQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RlYnVnTG9jLmgKQEAgLTAsMCArMSw4MCBAQAorLy89PT0tLS0tIGxsdm0vU3VwcG9ydC9EZWJ1Z0xvYy5oIC0gRGVidWcgTG9jYXRpb24gSW5mb3JtYXRpb24gLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIG51bWJlciBvZiBsaWdodCB3ZWlnaHQgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQKKy8vIHRvIGRlc2NyaWJlIGFuZCB0cmFjayBkZWJ1ZyBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfREVCVUdMT0NfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfREVCVUdMT0NfSAorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1ETm9kZTsKKyAgY2xhc3MgTExWTUNvbnRleHQ7CisgIAorICAvLy8gRGVidWdMb2MgLSBEZWJ1ZyBsb2NhdGlvbiBpZC4gIFRoaXMgaXMgY2FycmllZCBieSBJbnN0cnVjdGlvbiwgU0ROb2RlLAorICAvLy8gYW5kIE1hY2hpbmVJbnN0ciB0byBjb21wYWN0bHkgZW5jb2RlIGZpbGUvbGluZS9zY29wZSBpbmZvcm1hdGlvbiBmb3IgYW4KKyAgLy8vIG9wZXJhdGlvbi4KKyAgY2xhc3MgRGVidWdMb2MgeworICAgIC8vLyBMaW5lQ29sIC0gVGhpcyAzMi1iaXQgdmFsdWUgZW5jb2RlcyB0aGUgbGluZSBhbmQgY29sdW1uIG51bWJlciBmb3IgdGhlCisgICAgLy8vIGxvY2F0aW9uLCBlbmNvZGVkIGFzIDI0LWJpdHMgZm9yIGxpbmUgYW5kIDggYml0cyBmb3IgY29sLiAgQSB2YWx1ZSBvZiAwCisgICAgLy8vIGZvciBlaXRoZXIgbWVhbnMgdW5rbm93bi4KKyAgICB1bnNpZ25lZCBMaW5lQ29sOworICAgIAorICAgIC8vLyBTY29wZUlkeCAtIFRoaXMgaXMgYW4gb3BhcXVlIElEIyBmb3IgU2NvcGUvSW5saW5lZEF0IGluZm9ybWF0aW9uLAorICAgIC8vLyBkZWNvZGVkIGJ5IExMVk1Db250ZXh0LiAgMCBpcyB1bmtub3duLgorICAgIGludCBTY29wZUlkeDsKKyAgcHVibGljOgorICAgIERlYnVnTG9jKCkgOiBMaW5lQ29sKDApLCBTY29wZUlkeCgwKSB7fSAgLy8gRGVmYXVsdHMgdG8gdW5rbm93bi4KKyAgICAKKyAgICAvLy8gZ2V0IC0gR2V0IGEgbmV3IERlYnVnTG9jIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZCBsaW5lL2NvbAorICAgIC8vLyBzY29wZS9pbmxpbmUgbG9jYXRpb24uCisgICAgc3RhdGljIERlYnVnTG9jIGdldCh1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKlNjb3BlLCBNRE5vZGUgKklubGluZWRBdCA9IDApOworICAgIAorICAgIC8vLyBnZXRGcm9tRElMb2NhdGlvbiAtIFRyYW5zbGF0ZSB0aGUgRElMb2NhdGlvbiBxdWFkIGludG8gYSBEZWJ1Z0xvYy4KKyAgICBzdGF0aWMgRGVidWdMb2MgZ2V0RnJvbURJTG9jYXRpb24oTUROb2RlICpOKTsKKyAgICAKKyAgICAvLy8gaXNVbmtub3duIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiB1bmtub3duIGxvY2F0aW9uLgorICAgIGJvb2wgaXNVbmtub3duKCkgY29uc3QgeyByZXR1cm4gU2NvcGVJZHggPT0gMDsgfQorICAgIAorICAgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gKExpbmVDb2wgPDwgOCkgPj4gODsgIC8vIE1hc2sgb3V0IGNvbHVtbi4KKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgZ2V0Q29sKCkgY29uc3QgeworICAgICAgcmV0dXJuIExpbmVDb2wgPj4gMjQ7CisgICAgfQorICAgIAorICAgIC8vLyBnZXRTY29wZSAtIFRoaXMgcmV0dXJucyB0aGUgc2NvcGUgcG9pbnRlciBmb3IgdGhpcyBEZWJ1Z0xvYywgb3IgbnVsbCBpZgorICAgIC8vLyBpbnZhbGlkLgorICAgIE1ETm9kZSAqZ2V0U2NvcGUoY29uc3QgTExWTUNvbnRleHQgJkN0eCkgY29uc3Q7CisgICAgCisgICAgLy8vIGdldElubGluZWRBdCAtIFRoaXMgcmV0dXJucyB0aGUgSW5saW5lZEF0IHBvaW50ZXIgZm9yIHRoaXMgRGVidWdMb2MsIG9yCisgICAgLy8vIG51bGwgaWYgaW52YWxpZCBvciBub3QgcHJlc2VudC4KKyAgICBNRE5vZGUgKmdldElubGluZWRBdChjb25zdCBMTFZNQ29udGV4dCAmQ3R4KSBjb25zdDsKKyAgICAKKyAgICAvLy8gZ2V0U2NvcGVBbmRJbmxpbmVkQXQgLSBSZXR1cm4gYm90aCB0aGUgU2NvcGUgYW5kIHRoZSBJbmxpbmVkQXQgdmFsdWVzLgorICAgIHZvaWQgZ2V0U2NvcGVBbmRJbmxpbmVkQXQoTUROb2RlIComU2NvcGUsIE1ETm9kZSAqJklBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTExWTUNvbnRleHQgJkN0eCkgY29uc3Q7CisgICAgCisgICAgCisgICAgLy8vIGdldEFzTUROb2RlIC0gVGhpcyBtZXRob2QgY29udmVydHMgdGhlIGNvbXByZXNzZWQgRGVidWdMb2Mgbm9kZSBpbnRvIGEKKyAgICAvLy8gRElMb2NhdGlvbiBjb21wYXRpYmxlIE1ETm9kZS4KKyAgICBNRE5vZGUgKmdldEFzTUROb2RlKGNvbnN0IExMVk1Db250ZXh0ICZDdHgpIGNvbnN0OworICAgIAorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZWJ1Z0xvYyAmREwpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMaW5lQ29sID09IERMLkxpbmVDb2wgJiYgU2NvcGVJZHggPT0gREwuU2NvcGVJZHg7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEZWJ1Z0xvYyAmREwpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gREwpOyB9CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLyogTExWTV9ERUJVR0xPQ19IICovCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Ed2FyZi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRHdhcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2E4ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRHdhcmYuaApAQCAtMCwwICsxLDY3NiBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvRHdhcmYuaCAtLS1Ed2FyZiBDb25zdGFudHMtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY29uc3RhbnRzIHVzZWQgZm9yIGltcGxlbWVudGluZyBEd2FyZiBkZWJ1ZyBzdXBwb3J0LiAgRm9yCisvLyBEZXRhaWxzIG9uIHRoZSBEd2FyZiAzIHNwZWNmaWNhdGlvbiBzZWUgRFdBUkYgRGVidWdnaW5nIEluZm9ybWF0aW9uIEZvcm1hdAorLy8gVi4zIHJlZmVyZW5jZSBtYW51YWwgaHR0cDovL2R3YXJmLmZyZWVzdGFuZGFyZHMub3JnICwKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9EV0FSRl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9EV0FSRl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERlYnVnIGluZm8gY29uc3RhbnRzLgorCitlbnVtIHsKKyAgTExWTURlYnVnVmVyc2lvbiA9ICg4IDw8IDE2KSwgICAgICAgICAvLyBDdXJyZW50IHZlcnNpb24gb2YgZGVidWcgaW5mb3JtYXRpb24uCisgIExMVk1EZWJ1Z1ZlcnNpb243ID0gKDcgPDwgMTYpLCAgICAgICAgLy8gQ29uc3RhbnQgZm9yIHZlcnNpb24gNy4KKyAgTExWTURlYnVnVmVyc2lvbjYgPSAoNiA8PCAxNiksICAgICAgICAvLyBDb25zdGFudCBmb3IgdmVyc2lvbiA2LgorICBMTFZNRGVidWdWZXJzaW9uNSA9ICg1IDw8IDE2KSwgICAgICAgIC8vIENvbnN0YW50IGZvciB2ZXJzaW9uIDUuCisgIExMVk1EZWJ1Z1ZlcnNpb240ID0gKDQgPDwgMTYpLCAgICAgICAgLy8gQ29uc3RhbnQgZm9yIHZlcnNpb24gNC4KKyAgTExWTURlYnVnVmVyc2lvbk1hc2sgPSAweGZmZmYwMDAwICAgICAvLyBNYXNrIGZvciB2ZXJzaW9uIG51bWJlci4KK307CisKK25hbWVzcGFjZSBkd2FyZiB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEd2FyZiBjb25zdGFudHMgYXMgZ2xlYW5lZCBmcm9tIHRoZSBEV0FSRiBEZWJ1Z2dpbmcgSW5mb3JtYXRpb24gRm9ybWF0IFYuMworLy8gcmVmZXJlbmNlIG1hbnVhbCBodHRwOi8vZHdhcmYuZnJlZXN0YW5kYXJkcy5vcmcgLgorLy8KKworLy8gRG8gbm90IG1peCB0aGUgZm9sbG93aW5nIHR3byBlbnVtZXJhdGlvbnMgc2V0cy4gIERXX1RBR19pbnZhbGlkIGNoYW5nZXMgdGhlCisvLyBlbnVtZXJhdGlvbiBiYXNlIHR5cGUuCisKK2VudW0gbGx2bV9kd2FyZl9jb25zdGFudHMgeworICAvLyBsbHZtIG1vY2sgdGFncworICBEV19UQUdfaW52YWxpZCA9IH4wVSwgICAgICAgICAgICAgICAgIC8vIFRhZyBmb3IgaW52YWxpZCByZXN1bHRzLgorCisgIERXX1RBR19hbmNob3IgPSAwLCAgICAgICAgICAgICAgICAgICAgLy8gVGFnIGZvciBkZXNjcmlwdG9yIGFuY2hvcnMuCisgIERXX1RBR19hdXRvX3ZhcmlhYmxlID0gMHgxMDAsICAgICAgICAgLy8gVGFnIGZvciBsb2NhbCAoYXV0bykgdmFyaWFibGVzLgorICBEV19UQUdfYXJnX3ZhcmlhYmxlID0gMHgxMDEsICAgICAgICAgIC8vIFRhZyBmb3IgYXJndW1lbnQgdmFyaWFibGVzLgorICBEV19UQUdfcmV0dXJuX3ZhcmlhYmxlID0gMHgxMDIsICAgICAgIC8vIFRhZyBmb3IgcmV0dXJuIHZhcmlhYmxlcy4KKworICBEV19UQUdfdmVjdG9yX3R5cGUgPSAweDEwMywgICAgICAgICAgIC8vIFRhZyBmb3IgdmVjdG9yIHR5cGVzLgorCisgIERXX1RBR191c2VyX2Jhc2UgPSAweDEwMDAsICAgICAgICAgICAgLy8gUmVjb21tZW5kZWQgYmFzZSBmb3IgdXNlciB0YWdzLgorCisgIERXX0NJRV9WRVJTSU9OID0gMSwgICAgICAgICAgICAgICAgICAgLy8gQ29tbW9uIGZyYW1lIGluZm9ybWF0aW9uIHZlcnNpb24uCisgIERXX0NJRV9JRCAgICAgICA9IDB4ZmZmZmZmZmYgICAgICAgICAgLy8gQ29tbW9uIGZyYW1lIGluZm9ybWF0aW9uIG1hcmsuCit9OworCitlbnVtIGR3YXJmX2NvbnN0YW50cyB7CisgIERXQVJGX1ZFUlNJT04gPSAyLAorCisgIC8vIFRhZ3MKKyAgRFdfVEFHX2FycmF5X3R5cGUgPSAweDAxLAorICBEV19UQUdfY2xhc3NfdHlwZSA9IDB4MDIsCisgIERXX1RBR19lbnRyeV9wb2ludCA9IDB4MDMsCisgIERXX1RBR19lbnVtZXJhdGlvbl90eXBlID0gMHgwNCwKKyAgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIgPSAweDA1LAorICBEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24gPSAweDA4LAorICBEV19UQUdfbGFiZWwgPSAweDBhLAorICBEV19UQUdfbGV4aWNhbF9ibG9jayA9IDB4MGIsCisgIERXX1RBR19tZW1iZXIgPSAweDBkLAorICBEV19UQUdfcG9pbnRlcl90eXBlID0gMHgwZiwKKyAgRFdfVEFHX3JlZmVyZW5jZV90eXBlID0gMHgxMCwKKyAgRFdfVEFHX2NvbXBpbGVfdW5pdCA9IDB4MTEsCisgIERXX1RBR19zdHJpbmdfdHlwZSA9IDB4MTIsCisgIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSA9IDB4MTMsCisgIERXX1RBR19zdWJyb3V0aW5lX3R5cGUgPSAweDE1LAorICBEV19UQUdfdHlwZWRlZiA9IDB4MTYsCisgIERXX1RBR191bmlvbl90eXBlID0gMHgxNywKKyAgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMgPSAweDE4LAorICBEV19UQUdfdmFyaWFudCA9IDB4MTksCisgIERXX1RBR19jb21tb25fYmxvY2sgPSAweDFhLAorICBEV19UQUdfY29tbW9uX2luY2x1c2lvbiA9IDB4MWIsCisgIERXX1RBR19pbmhlcml0YW5jZSA9IDB4MWMsCisgIERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUgPSAweDFkLAorICBEV19UQUdfbW9kdWxlID0gMHgxZSwKKyAgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSA9IDB4MWYsCisgIERXX1RBR19zZXRfdHlwZSA9IDB4MjAsCisgIERXX1RBR19zdWJyYW5nZV90eXBlID0gMHgyMSwKKyAgRFdfVEFHX3dpdGhfc3RtdCA9IDB4MjIsCisgIERXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb24gPSAweDIzLAorICBEV19UQUdfYmFzZV90eXBlID0gMHgyNCwKKyAgRFdfVEFHX2NhdGNoX2Jsb2NrID0gMHgyNSwKKyAgRFdfVEFHX2NvbnN0X3R5cGUgPSAweDI2LAorICBEV19UQUdfY29uc3RhbnQgPSAweDI3LAorICBEV19UQUdfZW51bWVyYXRvciA9IDB4MjgsCisgIERXX1RBR19maWxlX3R5cGUgPSAweDI5LAorICBEV19UQUdfZnJpZW5kID0gMHgyYSwKKyAgRFdfVEFHX25hbWVsaXN0ID0gMHgyYiwKKyAgRFdfVEFHX25hbWVsaXN0X2l0ZW0gPSAweDJjLAorICBEV19UQUdfcGFja2VkX3R5cGUgPSAweDJkLAorICBEV19UQUdfc3VicHJvZ3JhbSA9IDB4MmUsCisgIERXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtZXRlciA9IDB4MmYsCisgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbWV0ZXIgPSAweDMwLAorICBEV19UQUdfdGhyb3duX3R5cGUgPSAweDMxLAorICBEV19UQUdfdHJ5X2Jsb2NrID0gMHgzMiwKKyAgRFdfVEFHX3ZhcmlhbnRfcGFydCA9IDB4MzMsCisgIERXX1RBR192YXJpYWJsZSA9IDB4MzQsCisgIERXX1RBR192b2xhdGlsZV90eXBlID0gMHgzNSwKKyAgRFdfVEFHX2R3YXJmX3Byb2NlZHVyZSA9IDB4MzYsCisgIERXX1RBR19yZXN0cmljdF90eXBlID0gMHgzNywKKyAgRFdfVEFHX2ludGVyZmFjZV90eXBlID0gMHgzOCwKKyAgRFdfVEFHX25hbWVzcGFjZSA9IDB4MzksCisgIERXX1RBR19pbXBvcnRlZF9tb2R1bGUgPSAweDNhLAorICBEV19UQUdfdW5zcGVjaWZpZWRfdHlwZSA9IDB4M2IsCisgIERXX1RBR19wYXJ0aWFsX3VuaXQgPSAweDNjLAorICBEV19UQUdfaW1wb3J0ZWRfdW5pdCA9IDB4M2QsCisgIERXX1RBR19jb25kaXRpb24gPSAweDNmLAorICBEV19UQUdfc2hhcmVkX3R5cGUgPSAweDQwLAorICBEV19UQUdfbG9fdXNlciA9IDB4NDA4MCwKKyAgRFdfVEFHX2hpX3VzZXIgPSAweGZmZmYsCisKKyAgLy8gQ2hpbGRyZW4gZmxhZworICBEV19DSElMRFJFTl9ubyA9IDB4MDAsCisgIERXX0NISUxEUkVOX3llcyA9IDB4MDEsCisKKyAgLy8gQXR0cmlidXRlcworICBEV19BVF9zaWJsaW5nID0gMHgwMSwKKyAgRFdfQVRfbG9jYXRpb24gPSAweDAyLAorICBEV19BVF9uYW1lID0gMHgwMywKKyAgRFdfQVRfb3JkZXJpbmcgPSAweDA5LAorICBEV19BVF9ieXRlX3NpemUgPSAweDBiLAorICBEV19BVF9iaXRfb2Zmc2V0ID0gMHgwYywKKyAgRFdfQVRfYml0X3NpemUgPSAweDBkLAorICBEV19BVF9zdG10X2xpc3QgPSAweDEwLAorICBEV19BVF9sb3dfcGMgPSAweDExLAorICBEV19BVF9oaWdoX3BjID0gMHgxMiwKKyAgRFdfQVRfbGFuZ3VhZ2UgPSAweDEzLAorICBEV19BVF9kaXNjciA9IDB4MTUsCisgIERXX0FUX2Rpc2NyX3ZhbHVlID0gMHgxNiwKKyAgRFdfQVRfdmlzaWJpbGl0eSA9IDB4MTcsCisgIERXX0FUX2ltcG9ydCA9IDB4MTgsCisgIERXX0FUX3N0cmluZ19sZW5ndGggPSAweDE5LAorICBEV19BVF9jb21tb25fcmVmZXJlbmNlID0gMHgxYSwKKyAgRFdfQVRfY29tcF9kaXIgPSAweDFiLAorICBEV19BVF9jb25zdF92YWx1ZSA9IDB4MWMsCisgIERXX0FUX2NvbnRhaW5pbmdfdHlwZSA9IDB4MWQsCisgIERXX0FUX2RlZmF1bHRfdmFsdWUgPSAweDFlLAorICBEV19BVF9pbmxpbmUgPSAweDIwLAorICBEV19BVF9pc19vcHRpb25hbCA9IDB4MjEsCisgIERXX0FUX2xvd2VyX2JvdW5kID0gMHgyMiwKKyAgRFdfQVRfcHJvZHVjZXIgPSAweDI1LAorICBEV19BVF9wcm90b3R5cGVkID0gMHgyNywKKyAgRFdfQVRfcmV0dXJuX2FkZHIgPSAweDJhLAorICBEV19BVF9zdGFydF9zY29wZSA9IDB4MmMsCisgIERXX0FUX2JpdF9zdHJpZGUgPSAweDJlLAorICBEV19BVF91cHBlcl9ib3VuZCA9IDB4MmYsCisgIERXX0FUX2Fic3RyYWN0X29yaWdpbiA9IDB4MzEsCisgIERXX0FUX2FjY2Vzc2liaWxpdHkgPSAweDMyLAorICBEV19BVF9hZGRyZXNzX2NsYXNzID0gMHgzMywKKyAgRFdfQVRfYXJ0aWZpY2lhbCA9IDB4MzQsCisgIERXX0FUX2Jhc2VfdHlwZXMgPSAweDM1LAorICBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb24gPSAweDM2LAorICBEV19BVF9jb3VudCA9IDB4MzcsCisgIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uID0gMHgzOCwKKyAgRFdfQVRfZGVjbF9jb2x1bW4gPSAweDM5LAorICBEV19BVF9kZWNsX2ZpbGUgPSAweDNhLAorICBEV19BVF9kZWNsX2xpbmUgPSAweDNiLAorICBEV19BVF9kZWNsYXJhdGlvbiA9IDB4M2MsCisgIERXX0FUX2Rpc2NyX2xpc3QgPSAweDNkLAorICBEV19BVF9lbmNvZGluZyA9IDB4M2UsCisgIERXX0FUX2V4dGVybmFsID0gMHgzZiwKKyAgRFdfQVRfZnJhbWVfYmFzZSA9IDB4NDAsCisgIERXX0FUX2ZyaWVuZCA9IDB4NDEsCisgIERXX0FUX2lkZW50aWZpZXJfY2FzZSA9IDB4NDIsCisgIERXX0FUX21hY3JvX2luZm8gPSAweDQzLAorICBEV19BVF9uYW1lbGlzdF9pdGVtID0gMHg0NCwKKyAgRFdfQVRfcHJpb3JpdHkgPSAweDQ1LAorICBEV19BVF9zZWdtZW50ID0gMHg0NiwKKyAgRFdfQVRfc3BlY2lmaWNhdGlvbiA9IDB4NDcsCisgIERXX0FUX3N0YXRpY19saW5rID0gMHg0OCwKKyAgRFdfQVRfdHlwZSA9IDB4NDksCisgIERXX0FUX3VzZV9sb2NhdGlvbiA9IDB4NGEsCisgIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciA9IDB4NGIsCisgIERXX0FUX3ZpcnR1YWxpdHkgPSAweDRjLAorICBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbiA9IDB4NGQsCisgIERXX0FUX2FsbG9jYXRlZCA9IDB4NGUsCisgIERXX0FUX2Fzc29jaWF0ZWQgPSAweDRmLAorICBEV19BVF9kYXRhX2xvY2F0aW9uID0gMHg1MCwKKyAgRFdfQVRfYnl0ZV9zdHJpZGUgPSAweDUxLAorICBEV19BVF9lbnRyeV9wYyA9IDB4NTIsCisgIERXX0FUX3VzZV9VVEY4ID0gMHg1MywKKyAgRFdfQVRfZXh0ZW5zaW9uID0gMHg1NCwKKyAgRFdfQVRfcmFuZ2VzID0gMHg1NSwKKyAgRFdfQVRfdHJhbXBvbGluZSA9IDB4NTYsCisgIERXX0FUX2NhbGxfY29sdW1uID0gMHg1NywKKyAgRFdfQVRfY2FsbF9maWxlID0gMHg1OCwKKyAgRFdfQVRfY2FsbF9saW5lID0gMHg1OSwKKyAgRFdfQVRfZGVzY3JpcHRpb24gPSAweDVhLAorICBEV19BVF9iaW5hcnlfc2NhbGUgPSAweDViLAorICBEV19BVF9kZWNpbWFsX3NjYWxlID0gMHg1YywKKyAgRFdfQVRfc21hbGwgPSAweDVkLAorICBEV19BVF9kZWNpbWFsX3NpZ24gPSAweDVlLAorICBEV19BVF9kaWdpdF9jb3VudCA9IDB4NWYsCisgIERXX0FUX3BpY3R1cmVfc3RyaW5nID0gMHg2MCwKKyAgRFdfQVRfbXV0YWJsZSA9IDB4NjEsCisgIERXX0FUX3RocmVhZHNfc2NhbGVkID0gMHg2MiwKKyAgRFdfQVRfZXhwbGljaXQgPSAweDYzLAorICBEV19BVF9vYmplY3RfcG9pbnRlciA9IDB4NjQsCisgIERXX0FUX2VuZGlhbml0eSA9IDB4NjUsCisgIERXX0FUX2VsZW1lbnRhbCA9IDB4NjYsCisgIERXX0FUX3B1cmUgPSAweDY3LAorICBEV19BVF9yZWN1cnNpdmUgPSAweDY4LAorICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKKyAgRFdfQVRfc2ZfbmFtZXMgICA9IDB4MjEwMSwKKyAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCisgIERXX0FUX21hY19pbmZvID0gMHgyMTAzLAorICBEV19BVF9zcmNfY29vcmRzID0gMHgyMTA0LAorICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAorICBEV19BVF9ib2R5X2VuZCA9IDB4MjEwNiwKKyAgRFdfQVRfR05VX3ZlY3RvciA9IDB4MjEwNywKKyAgRFdfQVRfbG9fdXNlciA9IDB4MjAwMCwKKyAgRFdfQVRfaGlfdXNlciA9IDB4M2ZmZiwKKworICAvLyBBcHBsZSBleHRlbnNpb25zLgorICBEV19BVF9BUFBMRV9vcHRpbWl6ZWQgPSAweDNmZTEsCisgIERXX0FUX0FQUExFX2ZsYWdzID0gMHgzZmUyLAorICBEV19BVF9BUFBMRV9pc2EgPSAweDNmZTMsCisgIERXX0FUX0FQUExFX2Jsb2NrID0gMHgzZmU0LAorICBEV19BVF9BUFBMRV9tYWpvcl9ydW50aW1lX3ZlcnMgPSAweDNmZTUsCisgIERXX0FUX0FQUExFX3J1bnRpbWVfY2xhc3MgPSAweDNmZTYsCisgIERXX0FUX0FQUExFX29taXRfZnJhbWVfcHRyID0gMHgzZmU3LAorCisgIC8vIEF0dHJpYnV0ZSBmb3JtIGVuY29kaW5ncworICBEV19GT1JNX2FkZHIgPSAweDAxLAorICBEV19GT1JNX2Jsb2NrMiA9IDB4MDMsCisgIERXX0ZPUk1fYmxvY2s0ID0gMHgwNCwKKyAgRFdfRk9STV9kYXRhMiA9IDB4MDUsCisgIERXX0ZPUk1fZGF0YTQgPSAweDA2LAorICBEV19GT1JNX2RhdGE4ID0gMHgwNywKKyAgRFdfRk9STV9zdHJpbmcgPSAweDA4LAorICBEV19GT1JNX2Jsb2NrID0gMHgwOSwKKyAgRFdfRk9STV9ibG9jazEgPSAweDBhLAorICBEV19GT1JNX2RhdGExID0gMHgwYiwKKyAgRFdfRk9STV9mbGFnID0gMHgwYywKKyAgRFdfRk9STV9zZGF0YSA9IDB4MGQsCisgIERXX0ZPUk1fc3RycCA9IDB4MGUsCisgIERXX0ZPUk1fdWRhdGEgPSAweDBmLAorICBEV19GT1JNX3JlZl9hZGRyID0gMHgxMCwKKyAgRFdfRk9STV9yZWYxID0gMHgxMSwKKyAgRFdfRk9STV9yZWYyID0gMHgxMiwKKyAgRFdfRk9STV9yZWY0ID0gMHgxMywKKyAgRFdfRk9STV9yZWY4ID0gMHgxNCwKKyAgRFdfRk9STV9yZWZfdWRhdGEgPSAweDE1LAorICBEV19GT1JNX2luZGlyZWN0ID0gMHgxNiwKKworICAvLyBPcGVyYXRpb24gZW5jb2RpbmdzCisgIERXX09QX2FkZHIgPSAweDAzLAorICBEV19PUF9kZXJlZiA9IDB4MDYsCisgIERXX09QX2NvbnN0MXUgPSAweDA4LAorICBEV19PUF9jb25zdDFzID0gMHgwOSwKKyAgRFdfT1BfY29uc3QydSA9IDB4MGEsCisgIERXX09QX2NvbnN0MnMgPSAweDBiLAorICBEV19PUF9jb25zdDR1ID0gMHgwYywKKyAgRFdfT1BfY29uc3Q0cyA9IDB4MGQsCisgIERXX09QX2NvbnN0OHUgPSAweDBlLAorICBEV19PUF9jb25zdDhzID0gMHgwZiwKKyAgRFdfT1BfY29uc3R1ID0gMHgxMCwKKyAgRFdfT1BfY29uc3RzID0gMHgxMSwKKyAgRFdfT1BfZHVwID0gMHgxMiwKKyAgRFdfT1BfZHJvcCA9IDB4MTMsCisgIERXX09QX292ZXIgPSAweDE0LAorICBEV19PUF9waWNrID0gMHgxNSwKKyAgRFdfT1Bfc3dhcCA9IDB4MTYsCisgIERXX09QX3JvdCA9IDB4MTcsCisgIERXX09QX3hkZXJlZiA9IDB4MTgsCisgIERXX09QX2FicyA9IDB4MTksCisgIERXX09QX2FuZCA9IDB4MWEsCisgIERXX09QX2RpdiA9IDB4MWIsCisgIERXX09QX21pbnVzID0gMHgxYywKKyAgRFdfT1BfbW9kID0gMHgxZCwKKyAgRFdfT1BfbXVsID0gMHgxZSwKKyAgRFdfT1BfbmVnID0gMHgxZiwKKyAgRFdfT1Bfbm90ID0gMHgyMCwKKyAgRFdfT1Bfb3IgPSAweDIxLAorICBEV19PUF9wbHVzID0gMHgyMiwKKyAgRFdfT1BfcGx1c191Y29uc3QgPSAweDIzLAorICBEV19PUF9zaGwgPSAweDI0LAorICBEV19PUF9zaHIgPSAweDI1LAorICBEV19PUF9zaHJhID0gMHgyNiwKKyAgRFdfT1BfeG9yID0gMHgyNywKKyAgRFdfT1Bfc2tpcCA9IDB4MmYsCisgIERXX09QX2JyYSA9IDB4MjgsCisgIERXX09QX2VxID0gMHgyOSwKKyAgRFdfT1BfZ2UgPSAweDJhLAorICBEV19PUF9ndCA9IDB4MmIsCisgIERXX09QX2xlID0gMHgyYywKKyAgRFdfT1BfbHQgPSAweDJkLAorICBEV19PUF9uZSA9IDB4MmUsCisgIERXX09QX2xpdDAgPSAweDMwLAorICBEV19PUF9saXQxID0gMHgzMSwKKyAgRFdfT1BfbGl0MiA9IDB4MzIsCisgIERXX09QX2xpdDMgPSAweDMzLAorICBEV19PUF9saXQ0ID0gMHgzNCwKKyAgRFdfT1BfbGl0NSA9IDB4MzUsCisgIERXX09QX2xpdDYgPSAweDM2LAorICBEV19PUF9saXQ3ID0gMHgzNywKKyAgRFdfT1BfbGl0OCA9IDB4MzgsCisgIERXX09QX2xpdDkgPSAweDM5LAorICBEV19PUF9saXQxMCA9IDB4M2EsCisgIERXX09QX2xpdDExID0gMHgzYiwKKyAgRFdfT1BfbGl0MTIgPSAweDNjLAorICBEV19PUF9saXQxMyA9IDB4M2QsCisgIERXX09QX2xpdDE0ID0gMHgzZSwKKyAgRFdfT1BfbGl0MTUgPSAweDNmLAorICBEV19PUF9saXQxNiA9IDB4NDAsCisgIERXX09QX2xpdDE3ID0gMHg0MSwKKyAgRFdfT1BfbGl0MTggPSAweDQyLAorICBEV19PUF9saXQxOSA9IDB4NDMsCisgIERXX09QX2xpdDIwID0gMHg0NCwKKyAgRFdfT1BfbGl0MjEgPSAweDQ1LAorICBEV19PUF9saXQyMiA9IDB4NDYsCisgIERXX09QX2xpdDIzID0gMHg0NywKKyAgRFdfT1BfbGl0MjQgPSAweDQ4LAorICBEV19PUF9saXQyNSA9IDB4NDksCisgIERXX09QX2xpdDI2ID0gMHg0YSwKKyAgRFdfT1BfbGl0MjcgPSAweDRiLAorICBEV19PUF9saXQyOCA9IDB4NGMsCisgIERXX09QX2xpdDI5ID0gMHg0ZCwKKyAgRFdfT1BfbGl0MzAgPSAweDRlLAorICBEV19PUF9saXQzMSA9IDB4NGYsCisgIERXX09QX3JlZzAgPSAweDUwLAorICBEV19PUF9yZWcxID0gMHg1MSwKKyAgRFdfT1BfcmVnMiA9IDB4NTIsCisgIERXX09QX3JlZzMgPSAweDUzLAorICBEV19PUF9yZWc0ID0gMHg1NCwKKyAgRFdfT1BfcmVnNSA9IDB4NTUsCisgIERXX09QX3JlZzYgPSAweDU2LAorICBEV19PUF9yZWc3ID0gMHg1NywKKyAgRFdfT1BfcmVnOCA9IDB4NTgsCisgIERXX09QX3JlZzkgPSAweDU5LAorICBEV19PUF9yZWcxMCA9IDB4NWEsCisgIERXX09QX3JlZzExID0gMHg1YiwKKyAgRFdfT1BfcmVnMTIgPSAweDVjLAorICBEV19PUF9yZWcxMyA9IDB4NWQsCisgIERXX09QX3JlZzE0ID0gMHg1ZSwKKyAgRFdfT1BfcmVnMTUgPSAweDVmLAorICBEV19PUF9yZWcxNiA9IDB4NjAsCisgIERXX09QX3JlZzE3ID0gMHg2MSwKKyAgRFdfT1BfcmVnMTggPSAweDYyLAorICBEV19PUF9yZWcxOSA9IDB4NjMsCisgIERXX09QX3JlZzIwID0gMHg2NCwKKyAgRFdfT1BfcmVnMjEgPSAweDY1LAorICBEV19PUF9yZWcyMiA9IDB4NjYsCisgIERXX09QX3JlZzIzID0gMHg2NywKKyAgRFdfT1BfcmVnMjQgPSAweDY4LAorICBEV19PUF9yZWcyNSA9IDB4NjksCisgIERXX09QX3JlZzI2ID0gMHg2YSwKKyAgRFdfT1BfcmVnMjcgPSAweDZiLAorICBEV19PUF9yZWcyOCA9IDB4NmMsCisgIERXX09QX3JlZzI5ID0gMHg2ZCwKKyAgRFdfT1BfcmVnMzAgPSAweDZlLAorICBEV19PUF9yZWczMSA9IDB4NmYsCisgIERXX09QX2JyZWcwID0gMHg3MCwKKyAgRFdfT1BfYnJlZzEgPSAweDcxLAorICBEV19PUF9icmVnMiA9IDB4NzIsCisgIERXX09QX2JyZWczID0gMHg3MywKKyAgRFdfT1BfYnJlZzQgPSAweDc0LAorICBEV19PUF9icmVnNSA9IDB4NzUsCisgIERXX09QX2JyZWc2ID0gMHg3NiwKKyAgRFdfT1BfYnJlZzcgPSAweDc3LAorICBEV19PUF9icmVnOCA9IDB4NzgsCisgIERXX09QX2JyZWc5ID0gMHg3OSwKKyAgRFdfT1BfYnJlZzEwID0gMHg3YSwKKyAgRFdfT1BfYnJlZzExID0gMHg3YiwKKyAgRFdfT1BfYnJlZzEyID0gMHg3YywKKyAgRFdfT1BfYnJlZzEzID0gMHg3ZCwKKyAgRFdfT1BfYnJlZzE0ID0gMHg3ZSwKKyAgRFdfT1BfYnJlZzE1ID0gMHg3ZiwKKyAgRFdfT1BfYnJlZzE2ID0gMHg4MCwKKyAgRFdfT1BfYnJlZzE3ID0gMHg4MSwKKyAgRFdfT1BfYnJlZzE4ID0gMHg4MiwKKyAgRFdfT1BfYnJlZzE5ID0gMHg4MywKKyAgRFdfT1BfYnJlZzIwID0gMHg4NCwKKyAgRFdfT1BfYnJlZzIxID0gMHg4NSwKKyAgRFdfT1BfYnJlZzIyID0gMHg4NiwKKyAgRFdfT1BfYnJlZzIzID0gMHg4NywKKyAgRFdfT1BfYnJlZzI0ID0gMHg4OCwKKyAgRFdfT1BfYnJlZzI1ID0gMHg4OSwKKyAgRFdfT1BfYnJlZzI2ID0gMHg4YSwKKyAgRFdfT1BfYnJlZzI3ID0gMHg4YiwKKyAgRFdfT1BfYnJlZzI4ID0gMHg4YywKKyAgRFdfT1BfYnJlZzI5ID0gMHg4ZCwKKyAgRFdfT1BfYnJlZzMwID0gMHg4ZSwKKyAgRFdfT1BfYnJlZzMxID0gMHg4ZiwKKyAgRFdfT1BfcmVneCA9IDB4OTAsCisgIERXX09QX2ZicmVnID0gMHg5MSwKKyAgRFdfT1BfYnJlZ3ggPSAweDkyLAorICBEV19PUF9waWVjZSA9IDB4OTMsCisgIERXX09QX2RlcmVmX3NpemUgPSAweDk0LAorICBEV19PUF94ZGVyZWZfc2l6ZSA9IDB4OTUsCisgIERXX09QX25vcCA9IDB4OTYsCisgIERXX09QX3B1c2hfb2JqZWN0X2FkZHJlc3MgPSAweDk3LAorICBEV19PUF9jYWxsMiA9IDB4OTgsCisgIERXX09QX2NhbGw0ID0gMHg5OSwKKyAgRFdfT1BfY2FsbF9yZWYgPSAweDlhLAorICBEV19PUF9mb3JtX3Rsc19hZGRyZXNzID0gMHg5YiwKKyAgRFdfT1BfY2FsbF9mcmFtZV9jZmEgPSAweDljLAorICBEV19PUF9sb191c2VyID0gMHhlMCwKKyAgRFdfT1BfaGlfdXNlciA9IDB4ZmYsCisKKyAgLy8gRW5jb2RpbmcgYXR0cmlidXRlIHZhbHVlcworICBEV19BVEVfYWRkcmVzcyA9IDB4MDEsCisgIERXX0FURV9ib29sZWFuID0gMHgwMiwKKyAgRFdfQVRFX2NvbXBsZXhfZmxvYXQgPSAweDAzLAorICBEV19BVEVfZmxvYXQgPSAweDA0LAorICBEV19BVEVfc2lnbmVkID0gMHgwNSwKKyAgRFdfQVRFX3NpZ25lZF9jaGFyID0gMHgwNiwKKyAgRFdfQVRFX3Vuc2lnbmVkID0gMHgwNywKKyAgRFdfQVRFX3Vuc2lnbmVkX2NoYXIgPSAweDA4LAorICBEV19BVEVfaW1hZ2luYXJ5X2Zsb2F0ID0gMHgwOSwKKyAgRFdfQVRFX3BhY2tlZF9kZWNpbWFsID0gMHgwYSwKKyAgRFdfQVRFX251bWVyaWNfc3RyaW5nID0gMHgwYiwKKyAgRFdfQVRFX2VkaXRlZCA9IDB4MGMsCisgIERXX0FURV9zaWduZWRfZml4ZWQgPSAweDBkLAorICBEV19BVEVfdW5zaWduZWRfZml4ZWQgPSAweDBlLAorICBEV19BVEVfZGVjaW1hbF9mbG9hdCA9IDB4MGYsCisgIERXX0FURV9sb191c2VyID0gMHg4MCwKKyAgRFdfQVRFX2hpX3VzZXIgPSAweGZmLAorCisgIC8vIERlY2ltYWwgc2lnbiBhdHRyaWJ1dGUgdmFsdWVzCisgIERXX0RTX3Vuc2lnbmVkID0gMHgwMSwKKyAgRFdfRFNfbGVhZGluZ19vdmVycHVuY2ggPSAweDAyLAorICBEV19EU190cmFpbGluZ19vdmVycHVuY2ggPSAweDAzLAorICBEV19EU19sZWFkaW5nX3NlcGFyYXRlID0gMHgwNCwKKyAgRFdfRFNfdHJhaWxpbmdfc2VwYXJhdGUgPSAweDA1LAorCisgIC8vIEVuZGlhbml0eSBhdHRyaWJ1dGUgdmFsdWVzCisgIERXX0VORF9kZWZhdWx0ID0gMHgwMCwKKyAgRFdfRU5EX2JpZyA9IDB4MDEsCisgIERXX0VORF9saXR0bGUgPSAweDAyLAorICBEV19FTkRfbG9fdXNlciA9IDB4NDAsCisgIERXX0VORF9oaV91c2VyID0gMHhmZiwKKworICAvLyBBY2Nlc3NpYmlsaXR5IGNvZGVzCisgIERXX0FDQ0VTU19wdWJsaWMgPSAweDAxLAorICBEV19BQ0NFU1NfcHJvdGVjdGVkID0gMHgwMiwKKyAgRFdfQUNDRVNTX3ByaXZhdGUgPSAweDAzLAorCisgIC8vIFZpc2liaWxpdHkgY29kZXMKKyAgRFdfVklTX2xvY2FsID0gMHgwMSwKKyAgRFdfVklTX2V4cG9ydGVkID0gMHgwMiwKKyAgRFdfVklTX3F1YWxpZmllZCA9IDB4MDMsCisKKyAgLy8gVmlydHVhbGl0eSBjb2RlcworICBEV19WSVJUVUFMSVRZX25vbmUgPSAweDAwLAorICBEV19WSVJUVUFMSVRZX3ZpcnR1YWwgPSAweDAxLAorICBEV19WSVJUVUFMSVRZX3B1cmVfdmlydHVhbCA9IDB4MDIsCisKKyAgLy8gTGFuZ3VhZ2UgbmFtZXMKKyAgRFdfTEFOR19DODkgPSAweDAwMDEsCisgIERXX0xBTkdfQyA9IDB4MDAwMiwKKyAgRFdfTEFOR19BZGE4MyA9IDB4MDAwMywKKyAgRFdfTEFOR19DX3BsdXNfcGx1cyA9IDB4MDAwNCwKKyAgRFdfTEFOR19Db2JvbDc0ID0gMHgwMDA1LAorICBEV19MQU5HX0NvYm9sODUgPSAweDAwMDYsCisgIERXX0xBTkdfRm9ydHJhbjc3ID0gMHgwMDA3LAorICBEV19MQU5HX0ZvcnRyYW45MCA9IDB4MDAwOCwKKyAgRFdfTEFOR19QYXNjYWw4MyA9IDB4MDAwOSwKKyAgRFdfTEFOR19Nb2R1bGEyID0gMHgwMDBhLAorICBEV19MQU5HX0phdmEgPSAweDAwMGIsCisgIERXX0xBTkdfQzk5ID0gMHgwMDBjLAorICBEV19MQU5HX0FkYTk1ID0gMHgwMDBkLAorICBEV19MQU5HX0ZvcnRyYW45NSA9IDB4MDAwZSwKKyAgRFdfTEFOR19QTEkgPSAweDAwMGYsCisgIERXX0xBTkdfT2JqQyA9IDB4MDAxMCwKKyAgRFdfTEFOR19PYmpDX3BsdXNfcGx1cyA9IDB4MDAxMSwKKyAgRFdfTEFOR19VUEMgPSAweDAwMTIsCisgIERXX0xBTkdfRCA9IDB4MDAxMywKKyAgRFdfTEFOR19sb191c2VyID0gMHg4MDAwLAorICBEV19MQU5HX2hpX3VzZXIgPSAweGZmZmYsCisKKyAgLy8gSWRlbnRpZmllciBjYXNlIGNvZGVzCisgIERXX0lEX2Nhc2Vfc2Vuc2l0aXZlID0gMHgwMCwKKyAgRFdfSURfdXBfY2FzZSA9IDB4MDEsCisgIERXX0lEX2Rvd25fY2FzZSA9IDB4MDIsCisgIERXX0lEX2Nhc2VfaW5zZW5zaXRpdmUgPSAweDAzLAorCisgIC8vIENhbGxpbmcgY29udmVudGlvbiBjb2RlcworICBEV19DQ19ub3JtYWwgPSAweDAxLAorICBEV19DQ19wcm9ncmFtID0gMHgwMiwKKyAgRFdfQ0Nfbm9jYWxsID0gMHgwMywKKyAgRFdfQ0NfbG9fdXNlciA9IDB4NDAsCisgIERXX0NDX2hpX3VzZXIgPSAweGZmLAorCisgIC8vIElubGluZSBjb2RlcworICBEV19JTkxfbm90X2lubGluZWQgPSAweDAwLAorICBEV19JTkxfaW5saW5lZCA9IDB4MDEsCisgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDB4MDIsCisgIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkID0gMHgwMywKKworICAvLyBBcnJheSBvcmRlcmluZworICBEV19PUkRfcm93X21ham9yID0gMHgwMCwKKyAgRFdfT1JEX2NvbF9tYWpvciA9IDB4MDEsCisKKyAgLy8gRGlzY3JpbWluYW50IGRlc2NyaXB0b3IgdmFsdWVzCisgIERXX0RTQ19sYWJlbCA9IDB4MDAsCisgIERXX0RTQ19yYW5nZSA9IDB4MDEsCisKKyAgLy8gTGluZSBOdW1iZXIgU3RhbmRhcmQgT3Bjb2RlIEVuY29kaW5ncworICBEV19MTlNfY29weSA9IDB4MDEsCisgIERXX0xOU19hZHZhbmNlX3BjID0gMHgwMiwKKyAgRFdfTE5TX2FkdmFuY2VfbGluZSA9IDB4MDMsCisgIERXX0xOU19zZXRfZmlsZSA9IDB4MDQsCisgIERXX0xOU19zZXRfY29sdW1uID0gMHgwNSwKKyAgRFdfTE5TX25lZ2F0ZV9zdG10ID0gMHgwNiwKKyAgRFdfTE5TX3NldF9iYXNpY19ibG9jayA9IDB4MDcsCisgIERXX0xOU19jb25zdF9hZGRfcGMgPSAweDA4LAorICBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYyA9IDB4MDksCisgIERXX0xOU19zZXRfcHJvbG9ndWVfZW5kID0gMHgwYSwKKyAgRFdfTE5TX3NldF9lcGlsb2d1ZV9iZWdpbiA9IDB4MGIsCisgIERXX0xOU19zZXRfaXNhID0gMHgwYywKKworICAvLyBMaW5lIE51bWJlciBFeHRlbmRlZCBPcGNvZGUgRW5jb2RpbmdzCisgIERXX0xORV9lbmRfc2VxdWVuY2UgPSAweDAxLAorICBEV19MTkVfc2V0X2FkZHJlc3MgPSAweDAyLAorICBEV19MTkVfZGVmaW5lX2ZpbGUgPSAweDAzLAorICBEV19MTkVfbG9fdXNlciA9IDB4ODAsCisgIERXX0xORV9oaV91c2VyID0gMHhmZiwKKworICAvLyBNYWNpbmZvIFR5cGUgRW5jb2RpbmdzCisgIERXX01BQ0lORk9fZGVmaW5lID0gMHgwMSwKKyAgRFdfTUFDSU5GT191bmRlZiA9IDB4MDIsCisgIERXX01BQ0lORk9fc3RhcnRfZmlsZSA9IDB4MDMsCisgIERXX01BQ0lORk9fZW5kX2ZpbGUgPSAweDA0LAorICBEV19NQUNJTkZPX3ZlbmRvcl9leHQgPSAweGZmLAorCisgIC8vIENhbGwgZnJhbWUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzCisgIERXX0NGQV9leHRlbmRlZCA9IDB4MDAsCisgIERXX0NGQV9ub3AgPSAweDAwLAorICBEV19DRkFfYWR2YW5jZV9sb2MgPSAweDQwLAorICBEV19DRkFfb2Zmc2V0ID0gMHg4MCwKKyAgRFdfQ0ZBX3Jlc3RvcmUgPSAweGMwLAorICBEV19DRkFfc2V0X2xvYyA9IDB4MDEsCisgIERXX0NGQV9hZHZhbmNlX2xvYzEgPSAweDAyLAorICBEV19DRkFfYWR2YW5jZV9sb2MyID0gMHgwMywKKyAgRFdfQ0ZBX2FkdmFuY2VfbG9jNCA9IDB4MDQsCisgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgPSAweDA1LAorICBEV19DRkFfcmVzdG9yZV9leHRlbmRlZCA9IDB4MDYsCisgIERXX0NGQV91bmRlZmluZWQgPSAweDA3LAorICBEV19DRkFfc2FtZV92YWx1ZSA9IDB4MDgsCisgIERXX0NGQV9yZWdpc3RlciA9IDB4MDksCisgIERXX0NGQV9yZW1lbWJlcl9zdGF0ZSA9IDB4MGEsCisgIERXX0NGQV9yZXN0b3JlX3N0YXRlID0gMHgwYiwKKyAgRFdfQ0ZBX2RlZl9jZmEgPSAweDBjLAorICBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciA9IDB4MGQsCisgIERXX0NGQV9kZWZfY2ZhX29mZnNldCA9IDB4MGUsCisgIERXX0NGQV9kZWZfY2ZhX2V4cHJlc3Npb24gPSAweDBmLAorICBEV19DRkFfZXhwcmVzc2lvbiA9IDB4MTAsCisgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YgPSAweDExLAorICBEV19DRkFfZGVmX2NmYV9zZiA9IDB4MTIsCisgIERXX0NGQV9kZWZfY2ZhX29mZnNldF9zZiA9IDB4MTMsCisgIERXX0NGQV92YWxfb2Zmc2V0ID0gMHgxNCwKKyAgRFdfQ0ZBX3ZhbF9vZmZzZXRfc2YgPSAweDE1LAorICBEV19DRkFfdmFsX2V4cHJlc3Npb24gPSAweDE2LAorICBEV19DRkFfbG9fdXNlciA9IDB4MWMsCisgIERXX0NGQV9oaV91c2VyID0gMHgzZiwKKworICBEV19FSF9QRV9hYnNwdHIgPSAweDAwLAorICBEV19FSF9QRV9vbWl0ID0gMHhmZiwKKyAgRFdfRUhfUEVfdWxlYjEyOCA9IDB4MDEsCisgIERXX0VIX1BFX3VkYXRhMiA9IDB4MDIsCisgIERXX0VIX1BFX3VkYXRhNCA9IDB4MDMsCisgIERXX0VIX1BFX3VkYXRhOCA9IDB4MDQsCisgIERXX0VIX1BFX3NsZWIxMjggPSAweDA5LAorICBEV19FSF9QRV9zZGF0YTIgPSAweDBBLAorICBEV19FSF9QRV9zZGF0YTQgPSAweDBCLAorICBEV19FSF9QRV9zZGF0YTggPSAweDBDLAorICBEV19FSF9QRV9zaWduZWQgPSAweDA4LAorICBEV19FSF9QRV9wY3JlbCA9IDB4MTAsCisgIERXX0VIX1BFX3RleHRyZWwgPSAweDIwLAorICBEV19FSF9QRV9kYXRhcmVsID0gMHgzMCwKKyAgRFdfRUhfUEVfZnVuY3JlbCA9IDB4NDAsCisgIERXX0VIX1BFX2FsaWduZWQgPSAweDUwLAorICBEV19FSF9QRV9pbmRpcmVjdCA9IDB4ODAKK307CisKKy8vLyBUYWdTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCB0YWcuCisvLy8KK2NvbnN0IGNoYXIgKlRhZ1N0cmluZyh1bnNpZ25lZCBUYWcpOworCisvLy8gQ2hpbGRyZW5TdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBjaGlsZHJlbiBmbGFnLgorLy8vCitjb25zdCBjaGFyICpDaGlsZHJlblN0cmluZyh1bnNpZ25lZCBDaGlsZHJlbik7CisKKy8vLyBBdHRyaWJ1dGVTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisvLy8KK2NvbnN0IGNoYXIgKkF0dHJpYnV0ZVN0cmluZyh1bnNpZ25lZCBBdHRyaWJ1dGUpOworCisvLy8gRm9ybUVuY29kaW5nU3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgZm9ybSBlbmNvZGluZy4KKy8vLworY29uc3QgY2hhciAqRm9ybUVuY29kaW5nU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKTsKKworLy8vIE9wZXJhdGlvbkVuY29kaW5nU3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uCisvLy8gZW5jb2RpbmcuCitjb25zdCBjaGFyICpPcGVyYXRpb25FbmNvZGluZ1N0cmluZyh1bnNpZ25lZCBFbmNvZGluZyk7CisKKy8vLyBBdHRyaWJ1dGVFbmNvZGluZ1N0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQorLy8vIGVuY29kaW5nLgorY29uc3QgY2hhciAqQXR0cmlidXRlRW5jb2RpbmdTdHJpbmcodW5zaWduZWQgRW5jb2RpbmcpOworCisvLy8gRGVjaW1hbFNpZ25TdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBkZWNpbWFsIHNpZ24KKy8vLyBhdHRyaWJ1dGUuCitjb25zdCBjaGFyICpEZWNpbWFsU2lnblN0cmluZyh1bnNpZ25lZCBTaWduKTsKKworLy8vIEVuZGlhbml0eVN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGVuZGlhbml0eS4KKy8vLworY29uc3QgY2hhciAqRW5kaWFuaXR5U3RyaW5nKHVuc2lnbmVkIEVuZGlhbik7CisKKy8vLyBBY2Nlc3NpYmlsaXR5U3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgYWNjZXNzaWJpbGl0eS4KKy8vLworY29uc3QgY2hhciAqQWNjZXNzaWJpbGl0eVN0cmluZyh1bnNpZ25lZCBBY2Nlc3MpOworCisvLy8gVmlzaWJpbGl0eVN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIHZpc2liaWxpdHkuCisvLy8KK2NvbnN0IGNoYXIgKlZpc2liaWxpdHlTdHJpbmcodW5zaWduZWQgVmlzaWJpbGl0eSk7CisKKy8vLyBWaXJ0dWFsaXR5U3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgdmlydHVhbGl0eS4KKy8vLworY29uc3QgY2hhciAqVmlydHVhbGl0eVN0cmluZyh1bnNpZ25lZCBWaXJ0dWFsaXR5KTsKKworLy8vIExhbmd1YWdlU3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UuCisvLy8KK2NvbnN0IGNoYXIgKkxhbmd1YWdlU3RyaW5nKHVuc2lnbmVkIExhbmd1YWdlKTsKKworLy8vIENhc2VTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyIGNhc2UuCisvLy8KK2NvbnN0IGNoYXIgKkNhc2VTdHJpbmcodW5zaWduZWQgQ2FzZSk7CisKKy8vLyBDb252ZW50aW9uU3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgY2FsbGluZyBjb252ZW50aW9uLgorLy8vCitjb25zdCBjaGFyICpDb252ZW50aW9uU3RyaW5nKHVuc2lnbmVkIENvbnZlbnRpb24pOworCisvLy8gSW5saW5lQ29kZVN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGlubGluZSBjb2RlLgorLy8vCitjb25zdCBjaGFyICpJbmxpbmVDb2RlU3RyaW5nKHVuc2lnbmVkIENvZGUpOworCisvLy8gQXJyYXlPcmRlclN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5IG9yZGVyLgorLy8vCitjb25zdCBjaGFyICpBcnJheU9yZGVyU3RyaW5nKHVuc2lnbmVkIE9yZGVyKTsKKworLy8vIERpc2NyaW1pbmFudFN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGRpc2NyaW1pbmFudAorLy8vIGRlc2NyaXB0b3IuCitjb25zdCBjaGFyICpEaXNjcmltaW5hbnRTdHJpbmcodW5zaWduZWQgRGlzY3JpbWluYW50KTsKKworLy8vIExOU3RhbmRhcmRTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBsaW5lIG51bWJlciBzdGFuZGFyZC4KKy8vLworY29uc3QgY2hhciAqTE5TdGFuZGFyZFN0cmluZyh1bnNpZ25lZCBTdGFuZGFyZCk7CisKKy8vLyBMTkV4dGVuZGVkU3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgbGluZSBudW1iZXIgZXh0ZW5kZWQKKy8vLyBvcGNvZGUgZW5jb2RpbmdzLgorY29uc3QgY2hhciAqTE5FeHRlbmRlZFN0cmluZyh1bnNpZ25lZCBFbmNvZGluZyk7CisKKy8vLyBNYWNpbmZvU3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgbWFjaW5mbyB0eXBlIGVuY29kaW5ncy4KKy8vLworY29uc3QgY2hhciAqTWFjaW5mb1N0cmluZyh1bnNpZ25lZCBFbmNvZGluZyk7CisKKy8vLyBDYWxsRnJhbWVTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBjYWxsIGZyYW1lIGluc3RydWN0aW9uCisvLy8gZW5jb2RpbmdzLgorY29uc3QgY2hhciAqQ2FsbEZyYW1lU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKTsKK30gLy8gRW5kIG9mIG5hbWVzcGFjZSBkd2FyZgorCit9IC8vIEVuZCBvZiBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0R5bmFtaWNMaW5rZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0R5bmFtaWNMaW5rZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBmZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRHluYW1pY0xpbmtlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0R5bmFtaWNMaW5rZXIuaCAtIFBvcnRhYmxlIER5bmFtaWMgTGlua2VyIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTGlnaHR3ZWlnaHQgaW50ZXJmYWNlIHRvIGR5bmFtaWMgbGlicmFyeSBsaW5raW5nIGFuZCBsb2FkaW5nLCBhbmQgZHluYW1pYworLy8gc3ltYm9sIGxvb2t1cCBmdW5jdGlvbmFsaXR5LCBpbiB3aGF0ZXZlciBmb3JtIHRoZSBvcGVyYXRpbmcgc3lzdGVtCisvLyBwcm92aWRlcyBpdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9EWU5BTUlDTElOS0VSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0RZTkFNSUNMSU5LRVJfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBMaW5rRHluYW1pY09iamVjdCAtIExvYWQgdGhlIG5hbWVkIGZpbGUgYXMgYSBkeW5hbWljIGxpYnJhcnkKKy8vLyBhbmQgbGluayBpdCB3aXRoIHRoZSBjdXJyZW50bHkgcnVubmluZyBwcm9jZXNzLiBSZXR1cm5zIGZhbHNlCisvLy8gb24gc3VjY2VzcywgdHJ1ZSBpZiB0aGVyZSBpcyBhbiBlcnJvciAoYW5kIHNldHMgRXJyb3JNZXNzYWdlCisvLy8gaWYgaXQgaXMgbm90IE5VTEwpLiBBbmFsb2dvdXMgdG8gZGxvcGVuKCkuCisvLy8KK2Jvb2wgTGlua0R5bmFtaWNPYmplY3QgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdGQ6OnN0cmluZyAqRXJyb3JNZXNzYWdlKTsKKworLy8vIEdldEFkZHJlc3NPZlN5bWJvbCAtIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG5hbWVkIHN5bWJvbCBpbgorLy8vIHRoZSBjdXJyZW50bHkgcnVubmluZyBwcm9jZXNzLCBhcyByZXBvcnRlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIsCisvLy8gb3IgTlVMTCBpZiB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0IG9yIHNvbWUgb3RoZXIgZXJyb3IgaGFzCisvLy8gb2NjdXJyZWQuCisvLy8KK3ZvaWQgKkdldEFkZHJlc3NPZlN5bWJvbCAoY29uc3QgY2hhciAqc3ltYm9sTmFtZSk7Cit2b2lkICpHZXRBZGRyZXNzT2ZTeW1ib2wgKGNvbnN0IHN0ZDo6c3RyaW5nICZzeW1ib2xOYW1lKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vIFNVUFBPUlRfRFlOQU1JQ0xJTktFUl9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FTEYuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0VMRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjIzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FTEYuaApAQCAtMCwwICsxLDU0MCBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvRUxGLmggLSBFTEYgY29uc3RhbnRzIGFuZCBkYXRhIHN0cnVjdHVyZXMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBjb250YWlucyBjb21tb24sIG5vbi1wcm9jZXNzb3Itc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzIGFuZAorLy8gY29uc3RhbnRzIGZvciB0aGUgRUxGIGZpbGUgZm9ybWF0LgorLy8KKy8vIFRoZSBkZXRhaWxzIG9mIHRoZSBFTEYzMiBiaXRzIGluIHRoaXMgZmlsZSBhcmUgbGFyZ2VseSBiYXNlZCBvbiB0aGUgVG9vbAorLy8gSW50ZXJmYWNlIFN0YW5kYXJkIChUSVMpIEV4ZWN1dGFibGUgYW5kIExpbmtpbmcgRm9ybWF0IChFTEYpIFNwZWNpZmljYXRpb24KKy8vIFZlcnNpb24gMS4yLCBNYXkgMTk5NS4gVGhlIEVMRjY0IHN0dWZmIGlzIGJhc2VkIG9uIEVMRi02NCBPYmplY3QgRmlsZSBGb3JtYXQKKy8vIFZlcnNpb24gMS41LCBEcmFmdCAyLCBNYXkgMTk5OCBhcyB3ZWxsIGFzIE9wZW5CU0QgaGVhZGVyIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0VMRl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9FTEZfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgRUxGIHsKKwordHlwZWRlZiB1aW50MzJfdCBFbGYzMl9BZGRyOyAvLyBQcm9ncmFtIGFkZHJlc3MKK3R5cGVkZWYgdWludDE2X3QgRWxmMzJfSGFsZjsKK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfT2ZmOyAgLy8gRmlsZSBvZmZzZXQKK3R5cGVkZWYgaW50MzJfdCAgRWxmMzJfU3dvcmQ7Cit0eXBlZGVmIHVpbnQzMl90IEVsZjMyX1dvcmQ7CisKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfQWRkcjsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfT2ZmOwordHlwZWRlZiBpbnQzMl90ICBFbGY2NF9TaGFsZjsKK3R5cGVkZWYgaW50MzJfdCAgRWxmNjRfU3dvcmQ7Cit0eXBlZGVmIHVpbnQzMl90IEVsZjY0X1dvcmQ7Cit0eXBlZGVmIGludDY0X3QgIEVsZjY0X1N4d29yZDsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfWHdvcmQ7Cit0eXBlZGVmIHVpbnQzMl90IEVsZjY0X0hhbGY7Cit0eXBlZGVmIHVpbnQxNl90IEVsZjY0X1F1YXJ0ZXI7CisKKy8vIE9iamVjdCBmaWxlIG1hZ2ljIHN0cmluZy4KK3N0YXRpYyBjb25zdCBjaGFyIEVsZk1hZ2ljW10gPSB7IDB4N2YsICdFJywgJ0wnLCAnRicsICdcMCcgfTsKKworLy8gZV9pZGVudCBzaXplIGFuZCBpbmRpY2VzLgorZW51bSB7CisgIEVJX01BRzAgICAgICAgPSAwLCAgICAgICAgICAvLyBGaWxlIGlkZW50aWZpY2F0aW9uIGluZGV4LgorICBFSV9NQUcxICAgICAgID0gMSwgICAgICAgICAgLy8gRmlsZSBpZGVudGlmaWNhdGlvbiBpbmRleC4KKyAgRUlfTUFHMiAgICAgICA9IDIsICAgICAgICAgIC8vIEZpbGUgaWRlbnRpZmljYXRpb24gaW5kZXguCisgIEVJX01BRzMgICAgICAgPSAzLCAgICAgICAgICAvLyBGaWxlIGlkZW50aWZpY2F0aW9uIGluZGV4LgorICBFSV9DTEFTUyAgICAgID0gNCwgICAgICAgICAgLy8gRmlsZSBjbGFzcy4KKyAgRUlfREFUQSAgICAgICA9IDUsICAgICAgICAgIC8vIERhdGEgZW5jb2RpbmcuCisgIEVJX1ZFUlNJT04gICAgPSA2LCAgICAgICAgICAvLyBGaWxlIHZlcnNpb24uCisgIEVJX09TQUJJICAgICAgPSA3LCAgICAgICAgICAvLyBPUy9BQkkgaWRlbnRpZmljYXRpb24uCisgIEVJX0FCSVZFUlNJT04gPSA4LCAgICAgICAgICAvLyBBQkkgdmVyc2lvbi4KKyAgRUlfUEFEICAgICAgICA9IDksICAgICAgICAgIC8vIFN0YXJ0IG9mIHBhZGRpbmcgYnl0ZXMuCisgIEVJX05JREVOVCAgICAgPSAxNiAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZV9pZGVudC4KK307CisKK3N0cnVjdCBFbGYzMl9FaGRyIHsKKyAgdW5zaWduZWQgY2hhciBlX2lkZW50W0VJX05JREVOVF07IC8vIEVMRiBJZGVudGlmaWNhdGlvbiBieXRlcworICBFbGYzMl9IYWxmICAgIGVfdHlwZTsgICAgICAvLyBUeXBlIG9mIGZpbGUgKHNlZSBFVF8qIGJlbG93KQorICBFbGYzMl9IYWxmICAgIGVfbWFjaGluZTsgICAvLyBSZXF1aXJlZCBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgZmlsZSAoc2VlIEVNXyopCisgIEVsZjMyX1dvcmQgICAgZV92ZXJzaW9uOyAgIC8vIE11c3QgYmUgZXF1YWwgdG8gMQorICBFbGYzMl9BZGRyICAgIGVfZW50cnk7ICAgICAvLyBBZGRyZXNzIHRvIGp1bXAgdG8gaW4gb3JkZXIgdG8gc3RhcnQgcHJvZ3JhbQorICBFbGYzMl9PZmYgICAgIGVfcGhvZmY7ICAgICAvLyBQcm9ncmFtIGhlYWRlciB0YWJsZSdzIGZpbGUgb2Zmc2V0LCBpbiBieXRlcworICBFbGYzMl9PZmYgICAgIGVfc2hvZmY7ICAgICAvLyBTZWN0aW9uIGhlYWRlciB0YWJsZSdzIGZpbGUgb2Zmc2V0LCBpbiBieXRlcworICBFbGYzMl9Xb3JkICAgIGVfZmxhZ3M7ICAgICAvLyBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MKKyAgRWxmMzJfSGFsZiAgICBlX2Voc2l6ZTsgICAgLy8gU2l6ZSBvZiBFTEYgaGVhZGVyLCBpbiBieXRlcworICBFbGYzMl9IYWxmICAgIGVfcGhlbnRzaXplOyAvLyBTaXplIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZQorICBFbGYzMl9IYWxmICAgIGVfcGhudW07ICAgICAvLyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUKKyAgRWxmMzJfSGFsZiAgICBlX3NoZW50c2l6ZTsgLy8gU2l6ZSBvZiBhbiBlbnRyeSBpbiB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUKKyAgRWxmMzJfSGFsZiAgICBlX3NobnVtOyAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlCisgIEVsZjMyX0hhbGYgICAgZV9zaHN0cm5keDsgIC8vIFNlY3QgaGRyIHRhYmxlIGluZGV4IG9mIHNlY3QgbmFtZSBzdHJpbmcgdGFibGUKKyAgYm9vbCBjaGVja01hZ2ljKCkgY29uc3QgeworICAgIHJldHVybiAobWVtY21wKGVfaWRlbnQsIEVsZk1hZ2ljLCBzdHJsZW4oRWxmTWFnaWMpKSkgPT0gMDsKKyAgfQorICB1bnNpZ25lZCBjaGFyIGdldEZpbGVDbGFzcygpIGNvbnN0IHsgcmV0dXJuIGVfaWRlbnRbRUlfQ0xBU1NdOyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0RGF0YUVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gZV9pZGVudFtFSV9EQVRBXTsgfQorfTsKKworLy8gNjQtYml0IEVMRiBoZWFkZXIuIEZpZWxkcyBhcmUgdGhlIHNhbWUgYXMgZm9yIEVMRjMyLCBidXQgd2l0aCBkaWZmZXJlbnQKKy8vIHR5cGVzIChzZWUgYWJvdmUpLgorc3RydWN0IEVsZjY0X0VoZHIgeworICB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbRUlfTklERU5UXTsKKyAgRWxmNjRfUXVhcnRlciBlX3R5cGU7CisgIEVsZjY0X1F1YXJ0ZXIgZV9tYWNoaW5lOworICBFbGY2NF9IYWxmICAgIGVfdmVyc2lvbjsKKyAgRWxmNjRfQWRkciAgICBlX2VudHJ5OworICBFbGY2NF9PZmYgICAgIGVfcGhvZmY7CisgIEVsZjY0X09mZiAgICAgZV9zaG9mZjsKKyAgRWxmNjRfSGFsZiAgICBlX2ZsYWdzOworICBFbGY2NF9RdWFydGVyIGVfZWhzaXplOworICBFbGY2NF9RdWFydGVyIGVfcGhlbnRzaXplOworICBFbGY2NF9RdWFydGVyIGVfcGhudW07CisgIEVsZjY0X1F1YXJ0ZXIgZV9zaGVudHNpemU7CisgIEVsZjY0X1F1YXJ0ZXIgZV9zaG51bTsKKyAgRWxmNjRfUXVhcnRlciBlX3Noc3RybmR4OworICBib29sIGNoZWNrTWFnaWMoKSBjb25zdCB7CisgICAgcmV0dXJuIChtZW1jbXAoZV9pZGVudCwgRWxmTWFnaWMsIHN0cmxlbihFbGZNYWdpYykpKSA9PSAwOworICB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0RmlsZUNsYXNzKCkgY29uc3QgeyByZXR1cm4gZV9pZGVudFtFSV9DTEFTU107IH0KKyAgdW5zaWduZWQgY2hhciBnZXREYXRhRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBlX2lkZW50W0VJX0RBVEFdOyB9Cit9OworCisvLyBGaWxlIHR5cGVzCitlbnVtIHsKKyAgRVRfTk9ORSAgID0gMCwgICAgICAvLyBObyBmaWxlIHR5cGUKKyAgRVRfUkVMICAgID0gMSwgICAgICAvLyBSZWxvY2F0YWJsZSBmaWxlCisgIEVUX0VYRUMgICA9IDIsICAgICAgLy8gRXhlY3V0YWJsZSBmaWxlCisgIEVUX0RZTiAgICA9IDMsICAgICAgLy8gU2hhcmVkIG9iamVjdCBmaWxlCisgIEVUX0NPUkUgICA9IDQsICAgICAgLy8gQ29yZSBmaWxlCisgIEVUX0xPUFJPQyA9IDB4ZmYwMCwgLy8gQmVnaW5uaW5nIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyBjb2RlcworICBFVF9ISVBST0MgPSAweGZmZmYgIC8vIFByb2Nlc3Nvci1zcGVjaWZpYworfTsKKworLy8gVmVyc2lvbmluZworZW51bSB7CisgIEVWX05PTkUgPSAwLAorICBFVl9DVVJSRU5UID0gMQorfTsKKworLy8gTWFjaGluZSBhcmNoaXRlY3R1cmVzCitlbnVtIHsKKyAgRU1fTk9ORSA9IDAsICAvLyBObyBtYWNoaW5lCisgIEVNX00zMiA9IDEsICAgLy8gQVQmVCBXRSAzMjEwMAorICBFTV9TUEFSQyA9IDIsIC8vIFNQQVJDCisgIEVNXzM4NiA9IDMsICAgLy8gSW50ZWwgMzg2CisgIEVNXzY4SyA9IDQsICAgLy8gTW90b3JvbGEgNjgwMDAKKyAgRU1fODhLID0gNSwgICAvLyBNb3Rvcm9sYSA4ODAwMAorICBFTV80ODYgPSA2LCAgIC8vIEludGVsIDQ4NiAoZGVwcmVjYXRlZCkKKyAgRU1fODYwID0gNywgICAvLyBJbnRlbCA4MDg2MAorICBFTV9NSVBTID0gOCwgICAgIC8vIE1JUFMgUjMwMDAKKyAgRU1fUFBDID0gMjAsICAgICAvLyBQb3dlclBDCisgIEVNX1BQQzY0ID0gMjEsICAgLy8gUG93ZXJQQzY0CisgIEVNX0FSTSA9IDQwLCAgICAgLy8gQVJNCisgIEVNX0FMUEhBID0gNDEsICAgLy8gREVDIEFscGhhCisgIEVNX1NQQVJDVjkgPSA0MywgLy8gU1BBUkMgVjkKKyAgRU1fWDg2XzY0ID0gNjIgICAvLyBBTUQ2NAorfTsKKworLy8gT2JqZWN0IGZpbGUgY2xhc3Nlcy4KK2VudW0geworICBFTEZDTEFTUzMyID0gMSwgLy8gMzItYml0IG9iamVjdCBmaWxlCisgIEVMRkNMQVNTNjQgPSAyICAvLyA2NC1iaXQgb2JqZWN0IGZpbGUKK307CisKKy8vIE9iamVjdCBmaWxlIGJ5dGUgb3JkZXJpbmdzLgorZW51bSB7CisgIEVMRkRBVEFOT05FID0gMCwgLy8gSW52YWxpZCBkYXRhIGVuY29kaW5nLgorICBFTEZEQVRBMkxTQiA9IDEsIC8vIExpdHRsZS1lbmRpYW4gb2JqZWN0IGZpbGUKKyAgRUxGREFUQTJNU0IgPSAyICAvLyBCaWctZW5kaWFuIG9iamVjdCBmaWxlCit9OworCisvLyBPUyBBQkkgaWRlbnRpZmljYXRpb24uCitlbnVtIHsKKyAgRUxGT1NBQklfTk9ORSA9IDAsICAgICAgICAgIC8vIFVOSVggU3lzdGVtIFYgQUJJCisgIEVMRk9TQUJJX0hQVVggPSAxLCAgICAgICAgICAvLyBIUC1VWCBvcGVyYXRpbmcgc3lzdGVtCisgIEVMRk9TQUJJX05FVEJTRCA9IDIsICAgICAgICAvLyBOZXRCU0QKKyAgRUxGT1NBQklfTElOVVggPSAzLCAgICAgICAgIC8vIEdOVS9MaW51eAorICBFTEZPU0FCSV9IVVJEID0gNCwgICAgICAgICAgLy8gR05VL0h1cmQKKyAgRUxGT1NBQklfU09MQVJJUyA9IDYsICAgICAgIC8vIFNvbGFyaXMKKyAgRUxGT1NBQklfQUlYID0gNywgICAgICAgICAgIC8vIEFJWAorICBFTEZPU0FCSV9JUklYID0gOCwgICAgICAgICAgLy8gSVJJWAorICBFTEZPU0FCSV9GUkVFQlNEID0gOSwgICAgICAgLy8gRnJlZUJTRAorICBFTEZPU0FCSV9UUlU2NCA9IDEwLCAgICAgICAgLy8gVFJVNjQgVU5JWAorICBFTEZPU0FCSV9NT0RFU1RPID0gMTEsICAgICAgLy8gTm92ZWxsIE1vZGVzdG8KKyAgRUxGT1NBQklfT1BFTkJTRCA9IDEyLCAgICAgIC8vIE9wZW5CU0QKKyAgRUxGT1NBQklfT1BFTlZNUyA9IDEzLCAgICAgIC8vIE9wZW5WTVMKKyAgRUxGT1NBQklfTlNLID0gMTQsICAgICAgICAgIC8vIEhld2xldHQtUGFja2FyZCBOb24tU3RvcCBLZXJuZWwKKyAgRUxGT1NBQklfQVJPUyA9IDE1LCAgICAgICAgIC8vIEFST1MKKyAgRUxGT1NBQklfRkVOSVhPUyA9IDE2LCAgICAgIC8vIEZlbml4T1MKKyAgRUxGT1NBQklfQzYwMDBfRUxGQUJJID0gNjQsIC8vIEJhcmUtbWV0YWwgVE1TMzIwQzYwMDAKKyAgRUxGT1NBQklfQzYwMDBfTElOVVggPSA2NSwgIC8vIExpbnV4IFRNUzMyMEM2MDAwCisgIEVMRk9TQUJJX0FSTSA9IDk3LCAgICAgICAgICAvLyBBUk0KKyAgRUxGT1NBQklfU1RBTkRBTE9ORSA9IDI1NSAgIC8vIFN0YW5kYWxvbmUgKGVtYmVkZGVkKSBhcHBsaWNhdGlvbgorfTsKKworLy8gWDg2XzY0IHJlbG9jYXRpb25zLgorZW51bSB7CisgIFJfWDg2XzY0X05PTkUgICAgICAgPSAwLAorICBSX1g4Nl82NF82NCAgICAgICAgID0gMSwKKyAgUl9YODZfNjRfUEMzMiAgICAgICA9IDIsCisgIFJfWDg2XzY0X0dPVDMyICAgICAgPSAzLAorICBSX1g4Nl82NF9QTFQzMiAgICAgID0gNCwKKyAgUl9YODZfNjRfQ09QWSAgICAgICA9IDUsCisgIFJfWDg2XzY0X0dMT0JfREFUICAgPSA2LAorICBSX1g4Nl82NF9KVU1QX1NMT1QgID0gNywKKyAgUl9YODZfNjRfUkVMQVRJVkUgICA9IDgsCisgIFJfWDg2XzY0X0dPVFBDUkVMICAgPSA5LAorICBSX1g4Nl82NF8zMiAgICAgICAgID0gMTAsCisgIFJfWDg2XzY0XzMyUyAgICAgICAgPSAxMSwKKyAgUl9YODZfNjRfMTYgICAgICAgICA9IDEyLAorICBSX1g4Nl82NF9QQzE2ICAgICAgID0gMTMsCisgIFJfWDg2XzY0XzggICAgICAgICAgPSAxNCwKKyAgUl9YODZfNjRfUEM4ICAgICAgICA9IDE1LAorICBSX1g4Nl82NF9EVFBNT0Q2NCAgID0gMTYsCisgIFJfWDg2XzY0X0RUUE9GRjY0ICAgPSAxNywKKyAgUl9YODZfNjRfVFBPRkY2NCAgICA9IDE4LAorICBSX1g4Nl82NF9UTFNHRCAgICAgID0gMTksCisgIFJfWDg2XzY0X1RMU0xEICAgICAgPSAyMCwKKyAgUl9YODZfNjRfRFRQT0ZGMzIgICA9IDIxLAorICBSX1g4Nl82NF9HT1RUUE9GRiAgID0gMjIsCisgIFJfWDg2XzY0X1RQT0ZGMzIgICAgPSAyMywKKyAgUl9YODZfNjRfUEM2NCAgICAgICA9IDI0LAorICBSX1g4Nl82NF9HT1RPRkY2NCAgID0gMjUsCisgIFJfWDg2XzY0X0dPVFBDMzIgICAgPSAyNiwKKyAgUl9YODZfNjRfU0laRTMyICAgICA9IDMyLAorICBSX1g4Nl82NF9TSVpFNjQgICAgID0gMzMsCisgIFJfWDg2XzY0X0dPVFBDMzJfVExTREVTQyA9IDM0LAorICBSX1g4Nl82NF9UTFNERVNDX0NBTEwgICAgPSAzNSwKKyAgUl9YODZfNjRfVExTREVTQyAgICA9IDM2Cit9OworCisvLyBTZWN0aW9uIGhlYWRlci4KK3N0cnVjdCBFbGYzMl9TaGRyIHsKKyAgRWxmMzJfV29yZCBzaF9uYW1lOyAgICAgIC8vIFNlY3Rpb24gbmFtZSAoaW5kZXggaW50byBzdHJpbmcgdGFibGUpCisgIEVsZjMyX1dvcmQgc2hfdHlwZTsgICAgICAvLyBTZWN0aW9uIHR5cGUgKFNIVF8qKQorICBFbGYzMl9Xb3JkIHNoX2ZsYWdzOyAgICAgLy8gU2VjdGlvbiBmbGFncyAoU0hGXyopCisgIEVsZjMyX0FkZHIgc2hfYWRkcjsgICAgICAvLyBBZGRyZXNzIHdoZXJlIHNlY3Rpb24gaXMgdG8gYmUgbG9hZGVkCisgIEVsZjMyX09mZiAgc2hfb2Zmc2V0OyAgICAvLyBGaWxlIG9mZnNldCBvZiBzZWN0aW9uIGRhdGEsIGluIGJ5dGVzCisgIEVsZjMyX1dvcmQgc2hfc2l6ZTsgICAgICAvLyBTaXplIG9mIHNlY3Rpb24sIGluIGJ5dGVzCisgIEVsZjMyX1dvcmQgc2hfbGluazsgICAgICAvLyBTZWN0aW9uIHR5cGUtc3BlY2lmaWMgaGVhZGVyIHRhYmxlIGluZGV4IGxpbmsKKyAgRWxmMzJfV29yZCBzaF9pbmZvOyAgICAgIC8vIFNlY3Rpb24gdHlwZS1zcGVjaWZpYyBleHRyYSBpbmZvcm1hdGlvbgorICBFbGYzMl9Xb3JkIHNoX2FkZHJhbGlnbjsgLy8gU2VjdGlvbiBhZGRyZXNzIGFsaWdubWVudAorICBFbGYzMl9Xb3JkIHNoX2VudHNpemU7ICAgLy8gU2l6ZSBvZiByZWNvcmRzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNlY3Rpb24KK307CisKKy8vIFNlY3Rpb24gaGVhZGVyIGZvciBFTEY2NCAtIHNhbWUgZmllbGRzIGFzIEVMRjMyLCBkaWZmZXJlbnQgdHlwZXMuCitzdHJ1Y3QgRWxmNjRfU2hkciB7CisgIEVsZjY0X0hhbGYgIHNoX25hbWU7CisgIEVsZjY0X0hhbGYgIHNoX3R5cGU7CisgIEVsZjY0X1h3b3JkIHNoX2ZsYWdzOworICBFbGY2NF9BZGRyICBzaF9hZGRyOworICBFbGY2NF9PZmYgICBzaF9vZmZzZXQ7CisgIEVsZjY0X1h3b3JkIHNoX3NpemU7CisgIEVsZjY0X0hhbGYgIHNoX2xpbms7CisgIEVsZjY0X0hhbGYgIHNoX2luZm87CisgIEVsZjY0X1h3b3JkIHNoX2FkZHJhbGlnbjsKKyAgRWxmNjRfWHdvcmQgc2hfZW50c2l6ZTsKK307CisKKy8vIFNwZWNpYWwgc2VjdGlvbiBpbmRpY2VzLgorZW51bSB7CisgIFNITl9VTkRFRiAgICAgPSAwLCAgICAgIC8vIFVuZGVmaW5lZCwgbWlzc2luZywgaXJyZWxldmFudCwgb3IgbWVhbmluZ2xlc3MKKyAgU0hOX0xPUkVTRVJWRSA9IDB4ZmYwMCwgLy8gTG93ZXN0IHJlc2VydmVkIGluZGV4CisgIFNITl9MT1BST0MgICAgPSAweGZmMDAsIC8vIExvd2VzdCBwcm9jZXNzb3Itc3BlY2lmaWMgaW5kZXgKKyAgU0hOX0hJUFJPQyAgICA9IDB4ZmYxZiwgLy8gSGlnaGVzdCBwcm9jZXNzb3Itc3BlY2lmaWMgaW5kZXgKKyAgU0hOX0FCUyAgICAgICA9IDB4ZmZmMSwgLy8gU3ltYm9sIGhhcyBhYnNvbHV0ZSB2YWx1ZTsgZG9lcyBub3QgbmVlZCByZWxvY2F0aW9uCisgIFNITl9DT01NT04gICAgPSAweGZmZjIsIC8vIEZPUlRSQU4gQ09NTU9OIG9yIEMgZXh0ZXJuYWwgZ2xvYmFsIHZhcmlhYmxlcworICBTSE5fSElSRVNFUlZFID0gMHhmZmZmICAvLyBIaWdoZXN0IHJlc2VydmVkIGluZGV4Cit9OworCisvLyBTZWN0aW9uIHR5cGVzLgorZW51bSB7CisgIFNIVF9OVUxMICAgICAgICAgID0gMCwgIC8vIE5vIGFzc29jaWF0ZWQgc2VjdGlvbiAoaW5hY3RpdmUgZW50cnkpLgorICBTSFRfUFJPR0JJVFMgICAgICA9IDEsICAvLyBQcm9ncmFtLWRlZmluZWQgY29udGVudHMuCisgIFNIVF9TWU1UQUIgICAgICAgID0gMiwgIC8vIFN5bWJvbCB0YWJsZS4KKyAgU0hUX1NUUlRBQiAgICAgICAgPSAzLCAgLy8gU3RyaW5nIHRhYmxlLgorICBTSFRfUkVMQSAgICAgICAgICA9IDQsICAvLyBSZWxvY2F0aW9uIGVudHJpZXM7IGV4cGxpY2l0IGFkZGVuZHMuCisgIFNIVF9IQVNIICAgICAgICAgID0gNSwgIC8vIFN5bWJvbCBoYXNoIHRhYmxlLgorICBTSFRfRFlOQU1JQyAgICAgICA9IDYsICAvLyBJbmZvcm1hdGlvbiBmb3IgZHluYW1pYyBsaW5raW5nLgorICBTSFRfTk9URSAgICAgICAgICA9IDcsICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZS4KKyAgU0hUX05PQklUUyAgICAgICAgPSA4LCAgLy8gRGF0YSBvY2N1cGllcyBubyBzcGFjZSBpbiB0aGUgZmlsZS4KKyAgU0hUX1JFTCAgICAgICAgICAgPSA5LCAgLy8gUmVsb2NhdGlvbiBlbnRyaWVzOyBubyBleHBsaWNpdCBhZGRlbmRzLgorICBTSFRfU0hMSUIgICAgICAgICA9IDEwLCAvLyBSZXNlcnZlZC4KKyAgU0hUX0RZTlNZTSAgICAgICAgPSAxMSwgLy8gU3ltYm9sIHRhYmxlLgorICBTSFRfSU5JVF9BUlJBWSAgICA9IDE0LCAvLyBQb2ludGVycyB0byBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMuCisgIFNIVF9GSU5JX0FSUkFZICAgID0gMTUsIC8vIFBvaW50ZXJzIHRvIHRlcm1pbmF0aW9uIGZ1bmN0aW9ucy4KKyAgU0hUX1BSRUlOSVRfQVJSQVkgPSAxNiwgLy8gUG9pbnRlcnMgdG8gcHJlLWluaXQgZnVuY3Rpb25zLgorICBTSFRfR1JPVVAgICAgICAgICA9IDE3LCAvLyBTZWN0aW9uIGdyb3VwLgorICBTSFRfU1lNVEFCX1NITkRYICA9IDE4LCAvLyBJbmRpY2llcyBmb3IgU0hOX1hJTkRFWCBlbnRyaWVzLgorICBTSFRfTE9PUyAgICAgICAgICA9IDB4NjAwMDAwMDAsIC8vIExvd2VzdCBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIHR5cGUuCisgIFNIVF9ISU9TICAgICAgICAgID0gMHg2ZmZmZmZmZiwgLy8gSGlnaGVzdCBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIHR5cGUuCisgIFNIVF9MT1BST0MgICAgICAgID0gMHg3MDAwMDAwMCwgLy8gTG93ZXN0IHByb2Nlc3NvciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgdHlwZS4KKyAgU0hUX0hJUFJPQyAgICAgICAgPSAweDdmZmZmZmZmLCAvLyBIaWdoZXN0IHByb2Nlc3NvciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgdHlwZS4KKyAgU0hUX0xPVVNFUiAgICAgICAgPSAweDgwMDAwMDAwLCAvLyBMb3dlc3QgdHlwZSByZXNlcnZlZCBmb3IgYXBwbGljYXRpb25zLgorICBTSFRfSElVU0VSICAgICAgICA9IDB4ZmZmZmZmZmYgIC8vIEhpZ2hlc3QgdHlwZSByZXNlcnZlZCBmb3IgYXBwbGljYXRpb25zLgorfTsKKworLy8gU2VjdGlvbiBmbGFncy4KK2VudW0geworICBTSEZfV1JJVEUgICAgID0gMHgxLCAvLyBTZWN0aW9uIGRhdGEgc2hvdWxkIGJlIHdyaXRhYmxlIGR1cmluZyBleGVjdXRpb24uCisgIFNIRl9BTExPQyAgICAgPSAweDIsIC8vIFNlY3Rpb24gb2NjdXBpZXMgbWVtb3J5IGR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbi4KKyAgU0hGX0VYRUNJTlNUUiA9IDB4NCwgLy8gU2VjdGlvbiBjb250YWlucyBleGVjdXRhYmxlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorICBTSEZfTUFTS1BST0MgID0gMHhmMDAwMDAwMCAvLyBCaXRzIGluZGljYXRpbmcgcHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzLgorfTsKKworLy8gU3ltYm9sIHRhYmxlIGVudHJpZXMgZm9yIEVMRjMyLgorc3RydWN0IEVsZjMyX1N5bSB7CisgIEVsZjMyX1dvcmQgICAgc3RfbmFtZTsgIC8vIFN5bWJvbCBuYW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSkKKyAgRWxmMzJfQWRkciAgICBzdF92YWx1ZTsgLy8gVmFsdWUgb3IgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbAorICBFbGYzMl9Xb3JkICAgIHN0X3NpemU7ICAvLyBTaXplIG9mIHRoZSBzeW1ib2wKKyAgdW5zaWduZWQgY2hhciBzdF9pbmZvOyAgLy8gU3ltYm9sJ3MgdHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzCisgIHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7IC8vIE11c3QgYmUgemVybzsgcmVzZXJ2ZWQKKyAgRWxmMzJfSGFsZiAgICBzdF9zaG5keDsgLy8gV2hpY2ggc2VjdGlvbiAoaGVhZGVyIHRhYmxlIGluZGV4KSBpdCdzIGRlZmluZWQgaW4KKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjMyX1NUX0JJTkQsCisgIC8vIEVMRjMyX1NUX1RZUEUsIGFuZCBFTEYzMl9TVF9JTkZPIG1hY3JvcyBkZWZpbmVkIGluIHRoZSBFTEYgc3BlY2lmaWNhdGlvbjoKKyAgdW5zaWduZWQgY2hhciBnZXRCaW5kaW5nKCkgY29uc3QgeyByZXR1cm4gc3RfaW5mbyA+PiA0OyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0X2luZm8gJiAweDBmOyB9CisgIHZvaWQgc2V0QmluZGluZyh1bnNpZ25lZCBjaGFyIGIpIHsgc2V0QmluZGluZ0FuZFR5cGUoYiwgZ2V0VHlwZSgpKTsgfQorICB2b2lkIHNldFR5cGUodW5zaWduZWQgY2hhciB0KSB7IHNldEJpbmRpbmdBbmRUeXBlKGdldEJpbmRpbmcoKSwgdCk7IH0KKyAgdm9pZCBzZXRCaW5kaW5nQW5kVHlwZSh1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgdCkgeworICAgIHN0X2luZm8gPSAoYiA8PCA0KSArICh0ICYgMHgwZik7CisgIH0KK307CisKKy8vIFN5bWJvbCB0YWJsZSBlbnRyaWVzIGZvciBFTEY2NC4KK3N0cnVjdCBFbGY2NF9TeW0geworICBFbGY2NF9Xb3JkICAgICAgc3RfbmFtZTsgIC8vIFN5bWJvbCBuYW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSkKKyAgdW5zaWduZWQgY2hhciAgIHN0X2luZm87ICAvLyBTeW1ib2wncyB0eXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMKKyAgdW5zaWduZWQgY2hhciAgIHN0X290aGVyOyAvLyBNdXN0IGJlIHplcm87IHJlc2VydmVkCisgIEVsZjY0X0hhbGYgICAgICBzdF9zaG5keDsgLy8gV2hpY2ggc2VjdGlvbiAoaGVhZGVyIHRhYmxlIGluZGV4KSBpdCdzIGRlZmluZWQgaW4KKyAgRWxmNjRfQWRkciAgICAgIHN0X3ZhbHVlOyAvLyBWYWx1ZSBvciBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sCisgIEVsZjY0X1h3b3JkICAgICBzdF9zaXplOyAgLy8gU2l6ZSBvZiB0aGUgc3ltYm9sCisKKyAgLy8gVGhlc2UgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIGRlZmluZWQgZm9yIEVMRjMyCisgIC8vIHN5bWJvbCB0YWJsZSBlbnRyaWVzLgorICB1bnNpZ25lZCBjaGFyIGdldEJpbmRpbmcoKSBjb25zdCB7IHJldHVybiBzdF9pbmZvID4+IDQ7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RfaW5mbyAmIDB4MGY7IH0KKyAgdm9pZCBzZXRCaW5kaW5nKHVuc2lnbmVkIGNoYXIgYikgeyBzZXRCaW5kaW5nQW5kVHlwZShiLCBnZXRUeXBlKCkpOyB9CisgIHZvaWQgc2V0VHlwZSh1bnNpZ25lZCBjaGFyIHQpIHsgc2V0QmluZGluZ0FuZFR5cGUoZ2V0QmluZGluZygpLCB0KTsgfQorICB2b2lkIHNldEJpbmRpbmdBbmRUeXBlKHVuc2lnbmVkIGNoYXIgYiwgdW5zaWduZWQgY2hhciB0KSB7CisgICAgc3RfaW5mbyA9IChiIDw8IDQpICsgKHQgJiAweDBmKTsKKyAgfQorfTsKKworLy8gU3ltYm9sIGJpbmRpbmdzLgorZW51bSB7CisgIFNUQl9MT0NBTCA9IDAsICAgLy8gTG9jYWwgc3ltYm9sLCBub3QgdmlzaWJsZSBvdXRzaWRlIG9iaiBmaWxlIGNvbnRhaW5pbmcgZGVmCisgIFNUQl9HTE9CQUwgPSAxLCAgLy8gR2xvYmFsIHN5bWJvbCwgdmlzaWJsZSB0byBhbGwgb2JqZWN0IGZpbGVzIGJlaW5nIGNvbWJpbmVkCisgIFNUQl9XRUFLID0gMiwgICAgLy8gV2VhayBzeW1ib2wsIGxpa2UgZ2xvYmFsIGJ1dCBsb3dlci1wcmVjZWRlbmNlCisgIFNUQl9MT1BST0MgPSAxMywgLy8gTG93ZXN0IHByb2Nlc3Nvci1zcGVjaWZpYyBiaW5kaW5nIHR5cGUKKyAgU1RCX0hJUFJPQyA9IDE1ICAvLyBIaWdoZXN0IHByb2Nlc3Nvci1zcGVjaWZpYyBiaW5kaW5nIHR5cGUKK307CisKKy8vIFN5bWJvbCB0eXBlcy4KK2VudW0geworICBTVFRfTk9UWVBFICA9IDAsICAgLy8gU3ltYm9sJ3MgdHlwZSBpcyBub3Qgc3BlY2lmaWVkCisgIFNUVF9PQkpFQ1QgID0gMSwgICAvLyBTeW1ib2wgaXMgYSBkYXRhIG9iamVjdCAodmFyaWFibGUsIGFycmF5LCBldGMuKQorICBTVFRfRlVOQyAgICA9IDIsICAgLy8gU3ltYm9sIGlzIGV4ZWN1dGFibGUgY29kZSAoZnVuY3Rpb24sIGV0Yy4pCisgIFNUVF9TRUNUSU9OID0gMywgICAvLyBTeW1ib2wgcmVmZXJzIHRvIGEgc2VjdGlvbgorICBTVFRfRklMRSAgICA9IDQsICAgLy8gTG9jYWwsIGFic29sdXRlIHN5bWJvbCB0aGF0IHJlZmVycyB0byBhIGZpbGUKKyAgU1RUX0NPTU1PTiAgPSA1LCAgIC8vIEFuIHVuaW5pdGlhbGlzZWQgY29tbW9uIGJsb2NrCisgIFNUVF9UTFMgICAgID0gNiwgICAvLyBUaHJlYWQgbG9jYWwgZGF0YSBvYmplY3QKKyAgU1RUX0xPUFJPQyAgPSAxMywgIC8vIExvd2VzdCBwcm9jZXNzb3Itc3BlY2lmaWMgc3ltYm9sIHR5cGUKKyAgU1RUX0hJUFJPQyAgPSAxNSAgIC8vIEhpZ2hlc3QgcHJvY2Vzc29yLXNwZWNpZmljIHN5bWJvbCB0eXBlCit9OworCitlbnVtIHsKKyAgU1RWX0RFRkFVTFQgICA9IDAsICAvLyBWaXNpYmlsaXR5IGlzIHNwZWNpZmllZCBieSBiaW5kaW5nIHR5cGUKKyAgU1RWX0lOVEVSTkFMICA9IDEsICAvLyBEZWZpbmVkIGJ5IHByb2Nlc3NvciBzdXBwbGVtZW50cworICBTVFZfSElEREVOICAgID0gMiwgIC8vIE5vdCB2aXNpYmxlIHRvIG90aGVyIGNvbXBvbmVudHMKKyAgU1RWX1BST1RFQ1RFRCA9IDMgICAvLyBWaXNpYmxlIGluIG90aGVyIGNvbXBvbmVudHMgYnV0IG5vdCBwcmVlbXB0YWJsZQorfTsKKworLy8gUmVsb2NhdGlvbiBlbnRyeSwgd2l0aG91dCBleHBsaWNpdCBhZGRlbmQuCitzdHJ1Y3QgRWxmMzJfUmVsIHsKKyAgRWxmMzJfQWRkciByX29mZnNldDsgLy8gTG9jYXRpb24gKGZpbGUgYnl0ZSBvZmZzZXQsIG9yIHByb2dyYW0gdmlydHVhbCBhZGRyKQorICBFbGYzMl9Xb3JkIHJfaW5mbzsgICAvLyBTeW1ib2wgdGFibGUgaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBhcHBseQorCisgIC8vIFRoZXNlIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgY29ycmVzcG9uZCB0byB0aGUgRUxGMzJfUl9TWU0sIEVMRjMyX1JfVFlQRSwKKyAgLy8gYW5kIEVMRjMyX1JfSU5GTyBtYWNyb3MgZGVmaW5lZCBpbiB0aGUgRUxGIHNwZWNpZmljYXRpb246CisgIEVsZjMyX1dvcmQgZ2V0U3ltYm9sKCkgY29uc3QgeyByZXR1cm4gKHJfaW5mbyA+PiA4KTsgfQorICB1bnNpZ25lZCBjaGFyIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQgY2hhcikgKHJfaW5mbyAmIDB4MGZmKTsgfQorICB2b2lkIHNldFN5bWJvbChFbGYzMl9Xb3JkIHMpIHsgc2V0U3ltYm9sQW5kVHlwZShzLCBnZXRUeXBlKCkpOyB9CisgIHZvaWQgc2V0VHlwZSh1bnNpZ25lZCBjaGFyIHQpIHsgc2V0U3ltYm9sQW5kVHlwZShnZXRTeW1ib2woKSwgdCk7IH0KKyAgdm9pZCBzZXRTeW1ib2xBbmRUeXBlKEVsZjMyX1dvcmQgcywgdW5zaWduZWQgY2hhciB0KSB7CisgICAgcl9pbmZvID0gKHMgPDwgOCkgKyB0OworICB9Cit9OworCisvLyBSZWxvY2F0aW9uIGVudHJ5IHdpdGggZXhwbGljaXQgYWRkZW5kLgorc3RydWN0IEVsZjMyX1JlbGEgeworICBFbGYzMl9BZGRyICByX29mZnNldDsgLy8gTG9jYXRpb24gKGZpbGUgYnl0ZSBvZmZzZXQsIG9yIHByb2dyYW0gdmlydHVhbCBhZGRyKQorICBFbGYzMl9Xb3JkICByX2luZm87ICAgLy8gU3ltYm9sIHRhYmxlIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gdG8gYXBwbHkKKyAgRWxmMzJfU3dvcmQgcl9hZGRlbmQ7IC8vIENvbXB1dGUgdmFsdWUgZm9yIHJlbG9jYXRhYmxlIGZpZWxkIGJ5IGFkZGluZyB0aGlzCisKKyAgLy8gVGhlc2UgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyBjb3JyZXNwb25kIHRvIHRoZSBFTEYzMl9SX1NZTSwgRUxGMzJfUl9UWVBFLAorICAvLyBhbmQgRUxGMzJfUl9JTkZPIG1hY3JvcyBkZWZpbmVkIGluIHRoZSBFTEYgc3BlY2lmaWNhdGlvbjoKKyAgRWxmMzJfV29yZCBnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiAocl9pbmZvID4+IDgpOyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAocl9pbmZvICYgMHgwZmYpOyB9CisgIHZvaWQgc2V0U3ltYm9sKEVsZjMyX1dvcmQgcykgeyBzZXRTeW1ib2xBbmRUeXBlKHMsIGdldFR5cGUoKSk7IH0KKyAgdm9pZCBzZXRUeXBlKHVuc2lnbmVkIGNoYXIgdCkgeyBzZXRTeW1ib2xBbmRUeXBlKGdldFN5bWJvbCgpLCB0KTsgfQorICB2b2lkIHNldFN5bWJvbEFuZFR5cGUoRWxmMzJfV29yZCBzLCB1bnNpZ25lZCBjaGFyIHQpIHsKKyAgICByX2luZm8gPSAocyA8PCA4KSArIHQ7CisgIH0KK307CisKKy8vIFJlbG9jYXRpb24gZW50cnksIHdpdGhvdXQgZXhwbGljaXQgYWRkZW5kLgorc3RydWN0IEVsZjY0X1JlbCB7CisgIEVsZjY0X0FkZHIgcl9vZmZzZXQ7IC8vIExvY2F0aW9uIChmaWxlIGJ5dGUgb2Zmc2V0LCBvciBwcm9ncmFtIHZpcnR1YWwgYWRkcikuCisgIEVsZjY0X1h3b3JkIHJfaW5mbzsgICAvLyBTeW1ib2wgdGFibGUgaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBhcHBseS4KKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjY0X1JfU1lNLCBFTEY2NF9SX1RZUEUsCisgIC8vIGFuZCBFTEY2NF9SX0lORk8gbWFjcm9zIGRlZmluZWQgaW4gdGhlIEVMRiBzcGVjaWZpY2F0aW9uOgorICBFbGY2NF9Yd29yZCBnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiAocl9pbmZvID4+IDMyKTsgfQorICB1bnNpZ25lZCBjaGFyIGdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAocl9pbmZvICYgMHhmZmZmZmZmZkwpOworICB9CisgIHZvaWQgc2V0U3ltYm9sKEVsZjMyX1dvcmQgcykgeyBzZXRTeW1ib2xBbmRUeXBlKHMsIGdldFR5cGUoKSk7IH0KKyAgdm9pZCBzZXRUeXBlKHVuc2lnbmVkIGNoYXIgdCkgeyBzZXRTeW1ib2xBbmRUeXBlKGdldFN5bWJvbCgpLCB0KTsgfQorICB2b2lkIHNldFN5bWJvbEFuZFR5cGUoRWxmNjRfWHdvcmQgcywgdW5zaWduZWQgY2hhciB0KSB7CisgICAgcl9pbmZvID0gKHMgPDwgMzIpICsgKHQmMHhmZmZmZmZmZkwpOworICB9Cit9OworCisvLyBSZWxvY2F0aW9uIGVudHJ5IHdpdGggZXhwbGljaXQgYWRkZW5kLgorc3RydWN0IEVsZjY0X1JlbGEgeworICBFbGY2NF9BZGRyICByX29mZnNldDsgLy8gTG9jYXRpb24gKGZpbGUgYnl0ZSBvZmZzZXQsIG9yIHByb2dyYW0gdmlydHVhbCBhZGRyKS4KKyAgRWxmNjRfWHdvcmQgIHJfaW5mbzsgICAvLyBTeW1ib2wgdGFibGUgaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBhcHBseS4KKyAgRWxmNjRfU3h3b3JkIHJfYWRkZW5kOyAvLyBDb21wdXRlIHZhbHVlIGZvciByZWxvY2F0YWJsZSBmaWVsZCBieSBhZGRpbmcgdGhpcy4KKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjY0X1JfU1lNLCBFTEY2NF9SX1RZUEUsCisgIC8vIGFuZCBFTEY2NF9SX0lORk8gbWFjcm9zIGRlZmluZWQgaW4gdGhlIEVMRiBzcGVjaWZpY2F0aW9uOgorICBFbGY2NF9Yd29yZCBnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiAocl9pbmZvID4+IDMyKTsgfQorICB1bnNpZ25lZCBjaGFyIGdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAocl9pbmZvICYgMHhmZmZmZmZmZkwpOworICB9CisgIHZvaWQgc2V0U3ltYm9sKEVsZjY0X1h3b3JkIHMpIHsgc2V0U3ltYm9sQW5kVHlwZShzLCBnZXRUeXBlKCkpOyB9CisgIHZvaWQgc2V0VHlwZSh1bnNpZ25lZCBjaGFyIHQpIHsgc2V0U3ltYm9sQW5kVHlwZShnZXRTeW1ib2woKSwgdCk7IH0KKyAgdm9pZCBzZXRTeW1ib2xBbmRUeXBlKEVsZjY0X1h3b3JkIHMsIHVuc2lnbmVkIGNoYXIgdCkgeworICAgIHJfaW5mbyA9IChzIDw8IDMyKSArICh0JjB4ZmZmZmZmZmZMKTsKKyAgfQorfTsKKworLy8gUHJvZ3JhbSBoZWFkZXIgZm9yIEVMRjMyLgorc3RydWN0IEVsZjMyX1BoZHIgeworICBFbGYzMl9Xb3JkIHBfdHlwZTsgICAvLyBUeXBlIG9mIHNlZ21lbnQKKyAgRWxmMzJfT2ZmICBwX29mZnNldDsgLy8gRmlsZSBvZmZzZXQgd2hlcmUgc2VnbWVudCBpcyBsb2NhdGVkLCBpbiBieXRlcworICBFbGYzMl9BZGRyIHBfdmFkZHI7ICAvLyBWaXJ0dWFsIGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIHNlZ21lbnQKKyAgRWxmMzJfQWRkciBwX3BhZGRyOyAgLy8gUGh5c2ljYWwgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2Ygc2VnbWVudCAoT1Mtc3BlY2lmaWMpCisgIEVsZjMyX1dvcmQgcF9maWxlc3o7IC8vIE51bS4gb2YgYnl0ZXMgaW4gZmlsZSBpbWFnZSBvZiBzZWdtZW50IChtYXkgYmUgemVybykKKyAgRWxmMzJfV29yZCBwX21lbXN6OyAgLy8gTnVtLiBvZiBieXRlcyBpbiBtZW0gaW1hZ2Ugb2Ygc2VnbWVudCAobWF5IGJlIHplcm8pCisgIEVsZjMyX1dvcmQgcF9mbGFnczsgIC8vIFNlZ21lbnQgZmxhZ3MKKyAgRWxmMzJfV29yZCBwX2FsaWduOyAgLy8gU2VnbWVudCBhbGlnbm1lbnQgY29uc3RyYWludAorfTsKKworLy8gUHJvZ3JhbSBoZWFkZXIgZm9yIEVMRjY0Lgorc3RydWN0IEVsZjY0X1BoZHIgeworICBFbGY2NF9Xb3JkICAgcF90eXBlOyAgIC8vIFR5cGUgb2Ygc2VnbWVudAorICBFbGY2NF9Xb3JkICAgcF9mbGFnczsgIC8vIFNlZ21lbnQgZmxhZ3MKKyAgRWxmNjRfT2ZmICAgIHBfb2Zmc2V0OyAvLyBGaWxlIG9mZnNldCB3aGVyZSBzZWdtZW50IGlzIGxvY2F0ZWQsIGluIGJ5dGVzCisgIEVsZjY0X0FkZHIgICBwX3ZhZGRyOyAgLy8gVmlydHVhbCBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBzZWdtZW50CisgIEVsZjY0X0FkZHIgICBwX3BhZGRyOyAgLy8gUGh5c2ljYWwgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2Ygc2VnbWVudCAoT1Mtc3BlY2lmaWMpCisgIEVsZjY0X1h3b3JkICBwX2ZpbGVzejsgLy8gTnVtLiBvZiBieXRlcyBpbiBmaWxlIGltYWdlIG9mIHNlZ21lbnQgKG1heSBiZSB6ZXJvKQorICBFbGY2NF9Yd29yZCAgcF9tZW1zejsgIC8vIE51bS4gb2YgYnl0ZXMgaW4gbWVtIGltYWdlIG9mIHNlZ21lbnQgKG1heSBiZSB6ZXJvKQorICBFbGY2NF9Yd29yZCAgcF9hbGlnbjsgIC8vIFNlZ21lbnQgYWxpZ25tZW50IGNvbnN0cmFpbnQKK307CisKKy8vIFNlZ21lbnQgdHlwZXMuCitlbnVtIHsKKyAgUFRfTlVMTCAgICA9IDAsIC8vIFVudXNlZCBzZWdtZW50LgorICBQVF9MT0FEICAgID0gMSwgLy8gTG9hZGFibGUgc2VnbWVudC4KKyAgUFRfRFlOQU1JQyA9IDIsIC8vIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4KKyAgUFRfSU5URVJQICA9IDMsIC8vIEludGVycHJldGVyIHBhdGhuYW1lLgorICBQVF9OT1RFICAgID0gNCwgLy8gQXV4aWxpYXJ5IGluZm9ybWF0aW9uLgorICBQVF9TSExJQiAgID0gNSwgLy8gUmVzZXJ2ZWQuCisgIFBUX1BIRFIgICAgPSA2LCAvLyBUaGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUgaXRzZWxmLgorICBQVF9MT1BST0MgID0gMHg3MDAwMDAwMCwgLy8gTG93ZXN0IHByb2Nlc3Nvci1zcGVjaWZpYyBwcm9ncmFtIGhkciBlbnRyeSB0eXBlLgorICBQVF9ISVBST0MgID0gMHg3ZmZmZmZmZiAgLy8gSGlnaGVzdCBwcm9jZXNzb3Itc3BlY2lmaWMgcHJvZ3JhbSBoZHIgZW50cnkgdHlwZS4KK307CisKKy8vIFNlZ21lbnQgZmxhZyBiaXRzLgorZW51bSB7CisgIFBGX1ggICAgICAgID0gMSwgICAgICAgICAvLyBFeGVjdXRlCisgIFBGX1cgICAgICAgID0gMiwgICAgICAgICAvLyBXcml0ZQorICBQRl9SICAgICAgICA9IDQsICAgICAgICAgLy8gUmVhZAorICBQRl9NQVNLUFJPQyA9IDB4ZjAwMDAwMDAgLy8gVW5zcGVjaWZpZWQKK307CisKKy8vIER5bmFtaWMgdGFibGUgZW50cnkgZm9yIEVMRjMyLgorc3RydWN0IEVsZjMyX0R5bgoreworICBFbGYzMl9Td29yZCBkX3RhZzsgICAgICAgICAgICAvLyBUeXBlIG9mIGR5bmFtaWMgdGFibGUgZW50cnkuCisgIHVuaW9uCisgIHsKKyAgICAgIEVsZjMyX1dvcmQgZF92YWw7ICAgICAgICAgLy8gSW50ZWdlciB2YWx1ZSBvZiBlbnRyeS4KKyAgICAgIEVsZjMyX0FkZHIgZF9wdHI7ICAgICAgICAgLy8gUG9pbnRlciB2YWx1ZSBvZiBlbnRyeS4KKyAgfSBkX3VuOworfTsKKworLy8gRHluYW1pYyB0YWJsZSBlbnRyeSBmb3IgRUxGNjQuCitzdHJ1Y3QgRWxmNjRfRHluCit7CisgIEVsZjY0X1N4d29yZCBkX3RhZzsgICAgICAgICAgIC8vIFR5cGUgb2YgZHluYW1pYyB0YWJsZSBlbnRyeS4KKyAgdW5pb24KKyAgeworICAgICAgRWxmNjRfWHdvcmQgZF92YWw7ICAgICAgICAvLyBJbnRlZ2VyIHZhbHVlIG9mIGVudHJ5LgorICAgICAgRWxmNjRfQWRkciAgZF9wdHI7ICAgICAgICAvLyBQb2ludGVyIHZhbHVlIG9mIGVudHJ5LgorICB9IGRfdW47Cit9OworCisvLyBEeW5hbWljIHRhYmxlIGVudHJ5IHRhZ3MuCitlbnVtIHsKKyAgRFRfTlVMTCAgICAgICAgID0gMCwgICAgICAgIC8vIE1hcmtzIGVuZCBvZiBkeW5hbWljIGFycmF5LgorICBEVF9ORUVERUQgICAgICAgPSAxLCAgICAgICAgLy8gU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBuZWVkZWQgbGlicmFyeS4KKyAgRFRfUExUUkVMU1ogICAgID0gMiwgICAgICAgIC8vIFNpemUgb2YgcmVsb2NhdGlvbiBlbnRyaWVzIGluIFBMVC4KKyAgRFRfUExUR09UICAgICAgID0gMywgICAgICAgIC8vIEFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGxpbmthZ2UgdGFibGUuCisgIERUX0hBU0ggICAgICAgICA9IDQsICAgICAgICAvLyBBZGRyZXNzIG9mIHN5bWJvbGljIGhhc2ggdGFibGUuCisgIERUX1NUUlRBQiAgICAgICA9IDUsICAgICAgICAvLyBBZGRyZXNzIG9mIGR5bmFtaWMgc3RyaW5nIHRhYmxlLgorICBEVF9TWU1UQUIgICAgICAgPSA2LCAgICAgICAgLy8gQWRkcmVzcyBvZiBkeW5hbWljIHN5bWJvbCB0YWJsZS4KKyAgRFRfUkVMQSAgICAgICAgID0gNywgICAgICAgIC8vIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbiB0YWJsZSAoUmVsYSBlbnRyaWVzKS4KKyAgRFRfUkVMQVNaICAgICAgID0gOCwgICAgICAgIC8vIFNpemUgb2YgUmVsYSByZWxvY2F0aW9uIHRhYmxlLgorICBEVF9SRUxBRU5UICAgICAgPSA5LCAgICAgICAgLy8gU2l6ZSBvZiBhIFJlbGEgcmVsb2NhdGlvbiBlbnRyeS4KKyAgRFRfU1RSU1ogICAgICAgID0gMTAsICAgICAgIC8vIFRvdGFsIHNpemUgb2YgdGhlIHN0cmluZyB0YWJsZS4KKyAgRFRfU1lNRU5UICAgICAgID0gMTEsICAgICAgIC8vIFNpemUgb2YgYSBzeW1ib2wgdGFibGUgZW50cnkuCisgIERUX0lOSVQgICAgICAgICA9IDEyLCAgICAgICAvLyBBZGRyZXNzIG9mIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLgorICBEVF9GSU5JICAgICAgICAgPSAxMywgICAgICAgLy8gQWRkcmVzcyBvZiB0ZXJtaW5hdGlvbiBmdW5jdGlvbi4KKyAgRFRfU09OQU1FICAgICAgID0gMTQsICAgICAgIC8vIFN0cmluZyB0YWJsZSBvZmZzZXQgb2YgYSBzaGFyZWQgb2JqZWN0cyBuYW1lLgorICBEVF9SUEFUSCAgICAgICAgPSAxNSwgICAgICAgLy8gU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBsaWJyYXJ5IHNlYXJjaCBwYXRoLgorICBEVF9TWU1CT0xJQyAgICAgPSAxNiwgICAgICAgLy8gQ2hhbmdlcyBzeW1ib2wgcmVzb2x1dGlvbiBhbGdvcml0aG0uCisgIERUX1JFTCAgICAgICAgICA9IDE3LCAgICAgICAvLyBBZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUgKFJlbCBlbnRyaWVzKS4KKyAgRFRfUkVMU1ogICAgICAgID0gMTgsICAgICAgIC8vIFNpemUgb2YgUmVsIHJlbG9jYXRpb24gdGFibGUuCisgIERUX1JFTEVOVCAgICAgICA9IDE5LCAgICAgICAvLyBTaXplIG9mIGEgUmVsIHJlbG9jYXRpb24gZW50cnkuCisgIERUX1BMVFJFTCAgICAgICA9IDIwLCAgICAgICAvLyBUeXBlIG9mIHJlbG9jYXRpb24gZW50cnkgdXNlZCBmb3IgbGlua2luZy4KKyAgRFRfREVCVUcgICAgICAgID0gMjEsICAgICAgIC8vIFJlc2VydmVkIGZvciBkZWJ1Z2dlci4KKyAgRFRfVEVYVFJFTCAgICAgID0gMjIsICAgICAgIC8vIFJlbG9jYXRpb25zIGV4aXN0IGZvciBub24td3JpdGFibGUgc2VnZW1lbnRzLgorICBEVF9KTVBSRUwgICAgICAgPSAyMywgICAgICAgLy8gQWRkcmVzcyBvZiByZWxvY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggUExULgorICBEVF9CSU5EX05PVyAgICAgPSAyNCwgICAgICAgLy8gUHJvY2VzcyBhbGwgcmVsb2NhdGlvbnMgYmVmb3JlIGV4ZWN1dGlvbi4KKyAgRFRfSU5JVF9BUlJBWSAgID0gMjUsICAgICAgIC8vIFBvaW50ZXIgdG8gYXJyYXkgb2YgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorICBEVF9GSU5JX0FSUkFZICAgPSAyNiwgICAgICAgLy8gUG9pbnRlciB0byBhcnJheSBvZiB0ZXJtaW5hdGlvbiBmdW5jdGlvbnMuCisgIERUX0lOSVRfQVJSQVlTWiA9IDI3LCAgICAgICAvLyBTaXplIG9mIERUX0lOSVRfQVJSQVkuCisgIERUX0ZJTklfQVJSQVlTWiA9IDI4LCAgICAgICAvLyBTaXplIG9mIERUX0ZJTklfQVJSQVkuCisgIERUX0xPT1MgICAgICAgICA9IDB4NjAwMDAwMDAsIC8vIFN0YXJ0IG9mIGVudmlyb25tZW50IHNwZWNpZmljIHRhZ3MuCisgIERUX0hJT1MgICAgICAgICA9IDB4NkZGRkZGRkYsIC8vIEVuZCBvZiBlbnZpcm9ubWVudCBzcGVjaWZpYyB0YWdzLgorICBEVF9MT1BST0MgICAgICAgPSAweDcwMDAwMDAwLCAvLyBTdGFydCBvZiBwcm9jZXNzb3Igc3BlY2lmaWMgdGFncy4KKyAgRFRfSElQUk9DICAgICAgID0gMHg3RkZGRkZGRiAgLy8gRW5kIG9mIHByb2Nlc3NvciBzcGVjaWZpYyB0YWdzLgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVMRgorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmNiNDgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIC0gRmF0YWwgZXJyb3IgaGFuZGxpbmcgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYW4gQVBJIHVzZWQgdG8gaW5kaWNhdGUgZmF0YWwgZXJyb3IgY29uZGl0aW9ucy4gIE5vbi1mYXRhbAorLy8gZXJyb3JzIChtb3N0IG9mIHRoZW0pIHNob3VsZCBiZSBoYW5kbGVkIHRocm91Z2ggTExWTUNvbnRleHQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRVJST1JIQU5ETElOR19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9FUlJPUkhBTkRMSU5HX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBUd2luZTsKKworICAvLy8gQW4gZXJyb3IgaGFuZGxlciBjYWxsYmFjay4KKyAgdHlwZWRlZiB2b2lkICgqZmF0YWxfZXJyb3JfaGFuZGxlcl90KSh2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbik7CisKKyAgLy8vIGluc3RhbGxfZmF0YWxfZXJyb3JfaGFuZGxlciAtIEluc3RhbGxzIGEgbmV3IGVycm9yIGhhbmRsZXIgdG8gYmUgdXNlZAorICAvLy8gd2hlbmV2ZXIgYSBzZXJpb3VzIChub24tcmVjb3ZlcmFibGUpIGVycm9yIGlzIGVuY291bnRlcmVkIGJ5IExMVk0uCisgIC8vLworICAvLy8gSWYgeW91IGFyZSB1c2luZyBsbHZtX3N0YXJ0X211bHRpdGhyZWFkZWQsIHlvdSBzaG91bGQgcmVnaXN0ZXIgdGhlIGhhbmRsZXIKKyAgLy8vIGJlZm9yZSBkb2luZyB0aGF0LgorICAvLy8KKyAgLy8vIElmIG5vIGVycm9yIGhhbmRsZXIgaXMgaW5zdGFsbGVkIHRoZSBkZWZhdWx0IGlzIHRvIHByaW50IHRoZSBlcnJvciBtZXNzYWdlCisgIC8vLyB0byBzdGRlcnIsIGFuZCBjYWxsIGV4aXQoMSkuICBJZiBhbiBlcnJvciBoYW5kbGVyIGlzIGluc3RhbGxlZCB0aGVuIGl0IGlzCisgIC8vLyB0aGUgaGFuZGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGxvZyB0aGUgbWVzc2FnZSwgaXQgd2lsbCBubyBsb25nZXIgYmUKKyAgLy8vIHByaW50ZWQgdG8gc3RkZXJyLiAgSWYgdGhlIGVycm9yIGhhbmRsZXIgcmV0dXJucywgdGhlbiBleGl0KDEpIHdpbGwgYmUKKyAgLy8vIGNhbGxlZC4KKyAgLy8vCisgIC8vLyBJdCBpcyBkYW5nZXJvdXMgdG8gbmFpdmVseSB1c2UgYW4gZXJyb3IgaGFuZGxlciB3aGljaCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAvLy8gRXZlbiB0aG91Z2ggc29tZSBhcHBsaWNhdGlvbnMgZGVzaXJlIHRvIGdyYWNlZnVsbHkgcmVjb3ZlciBmcm9tIGFyYml0cmFyeQorICAvLy8gZmF1bHRzLCBibGluZGx5IHRocm93aW5nIGV4Y2VwdGlvbnMgdGhyb3VnaCB1bmZhbWlsaWFyIGNvZGUgaXNuJ3QgYSB3YXkgdG8KKyAgLy8vIGFjaGlldmUgdGhpcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gdXNlcl9kYXRhIC0gQW4gYXJndW1lbnQgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGluc3RhbGwgZXJyb3IKKyAgLy8vIGhhbmRsZXIuCisgIHZvaWQgaW5zdGFsbF9mYXRhbF9lcnJvcl9oYW5kbGVyKGZhdGFsX2Vycm9yX2hhbmRsZXJfdCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEgPSAwKTsKKworICAvLy8gUmVzdG9yZXMgZGVmYXVsdCBlcnJvciBoYW5kbGluZyBiZWhhdmlvdXIuCisgIC8vLyBUaGlzIG11c3Qgbm90IGJlIGNhbGxlZCBiZXR3ZWVuIGxsdm1fc3RhcnRfbXVsdGl0aHJlYWRlZCgpIGFuZAorICAvLy8gbGx2bV9zdG9wX211bHRpdGhyZWFkZWQoKS4KKyAgdm9pZCByZW1vdmVfZmF0YWxfZXJyb3JfaGFuZGxlcigpOworCisgIC8vLyBSZXBvcnRzIGEgc2VyaW91cyBlcnJvciwgY2FsbGluZyBhbnkgaW5zdGFsbGVkIGVycm9yIGhhbmRsZXIuIFRoZXNlCisgIC8vLyBmdW5jdGlvbnMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGVycm9yIGNvbmRpdGlvbnMgd2hpY2ggYXJlIG91dHNpZGUKKyAgLy8vIHRoZSBjb250cm9sIG9mIHRoZSBjb21waWxlciAoSS9PIGVycm9ycywgaW52YWxpZCB1c2VyIGlucHV0LCBldGMuKQorICAvLy8KKyAgLy8vIElmIG5vIGVycm9yIGhhbmRsZXIgaXMgaW5zdGFsbGVkIHRoZSBkZWZhdWx0IGlzIHRvIHByaW50IHRoZSBtZXNzYWdlIHRvCisgIC8vLyBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgorICAvLy8gQWZ0ZXIgdGhlIGVycm9yIGhhbmRsZXIgaXMgY2FsbGVkIHRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIGV4aXQoMSksIGl0IAorICAvLy8gZG9lcyBub3QgcmV0dXJuLgorICBOT1JFVFVSTiB2b2lkIHJlcG9ydF9mYXRhbF9lcnJvcihjb25zdCBjaGFyICpyZWFzb24pOworICBOT1JFVFVSTiB2b2lkIHJlcG9ydF9mYXRhbF9lcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKTsKKyAgTk9SRVRVUk4gdm9pZCByZXBvcnRfZmF0YWxfZXJyb3IoY29uc3QgVHdpbmUgJnJlYXNvbik7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gY2FsbHMgYWJvcnQoKSwgYW5kIHByaW50cyB0aGUgb3B0aW9uYWwgbWVzc2FnZSB0byBzdGRlcnIuCisgIC8vLyBVc2UgdGhlIGxsdm1fdW5yZWFjaGFibGUgbWFjcm8gKHRoYXQgYWRkcyBsb2NhdGlvbiBpbmZvKSwgaW5zdGVhZCBvZgorICAvLy8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICBOT1JFVFVSTiB2b2lkIGxsdm1fdW5yZWFjaGFibGVfaW50ZXJuYWwoY29uc3QgY2hhciAqbXNnPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlPTAsIHVuc2lnbmVkIGxpbmU9MCk7Cit9CisKKy8vLyBQcmludHMgdGhlIG1lc3NhZ2UgYW5kIGxvY2F0aW9uIGluZm8gdG8gc3RkZXJyIGluICFOREVCVUcgYnVpbGRzLgorLy8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgImltcG9zc2libGUiIHNpdHVhdGlvbnMgdGhhdCBpbXBseQorLy8vIGEgYnVnIGluIHRoZSBjb21waWxlci4KKy8vLworLy8vIEluIE5ERUJVRyBtb2RlIGl0IG9ubHkgcHJpbnRzICJVTlJFQUNIQUJMRSBleGVjdXRlZCIuCisvLy8gVXNlIHRoaXMgaW5zdGVhZCBvZiBhc3NlcnQoMCksIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGtub3dzIHRoaXMgcGF0aAorLy8vIGlzIG5vdCByZWFjaGFibGUgZXZlbiBmb3IgTkRFQlVHIGJ1aWxkcy4KKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIGxsdm1fdW5yZWFjaGFibGUobXNnKSBcCisgIDo6bGx2bTo6bGx2bV91bnJlYWNoYWJsZV9pbnRlcm5hbChtc2csIF9fRklMRV9fLCBfX0xJTkVfXykKKyNlbHNlCisjZGVmaW5lIGxsdm1fdW5yZWFjaGFibGUobXNnKSA6Omxsdm06Omxsdm1fdW5yZWFjaGFibGVfaW50ZXJuYWwoKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRmlsZVV0aWxpdGllcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRmlsZVV0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGQ0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9GaWxlVXRpbGl0aWVzLmgKQEAgLTAsMCArMSw3MiBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9GaWxlVXRpbGl0aWVzLmggLSBGaWxlIFN5c3RlbSBVdGlsaXRpZXMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGZhbWlseSBvZiB1dGlsaXR5IGZ1bmN0aW9ucyB3aGljaCBhcmUgdXNlZnVsIGZvciBkb2luZworLy8gdmFyaW91cyB0aGluZ3Mgd2l0aCBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9GSUxFVVRJTElUSUVTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0ZJTEVVVElMSVRJRVNfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUGF0aC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIERpZmZGaWxlc1dpdGhUb2xlcmFuY2UgLSBDb21wYXJlIHRoZSB0d28gZmlsZXMgc3BlY2lmaWVkLCByZXR1cm5pbmcgMCBpZgorICAvLy8gdGhlIGZpbGVzIG1hdGNoLCAxIGlmIHRoZXkgYXJlIGRpZmZlcmVudCwgYW5kIDIgaWYgdGhlcmUgaXMgYSBmaWxlIGVycm9yLgorICAvLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYW4gYWJzb2xldGUgYW5kIHJlbGF0aXZlIEZQIGVycm9yIHRoYXQKKyAgLy8vIGlzIGFsbG93ZWQgdG8gZXhpc3QuICBJZiB5b3Ugc3BlY2lmeSBhIHN0cmluZyB0byBmaWxsIGluIGZvciB0aGUgZXJyb3IKKyAgLy8vIG9wdGlvbiwgaXQgd2lsbCBzZXQgdGhlIHN0cmluZyB0byBhbiBlcnJvciBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycywgb3IKKyAgLy8vIGlmIHRoZSBmaWxlcyBhcmUgZGlmZmVyZW50LgorICAvLy8KKyAgaW50IERpZmZGaWxlc1dpdGhUb2xlcmFuY2UoY29uc3Qgc3lzOjpQYXRoV2l0aFN0YXR1cyAmRmlsZUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5czo6UGF0aFdpdGhTdGF0dXMgJkZpbGVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgQWJzVG9sLCBkb3VibGUgUmVsVG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyb3IgPSAwKTsKKworCisgIC8vLyBGaWxlUmVtb3ZlciAtIFRoaXMgY2xhc3MgaXMgYSBzaW1wbGUgb2JqZWN0IG1lYW50IHRvIGJlIHN0YWNrIGFsbG9jYXRlZC4KKyAgLy8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBhIHJlZ2lvbiwgdGhlIG9iamVjdCByZW1vdmVzIHRoZSBmaWxlbmFtZQorICAvLy8gc3BlY2lmaWVkIChpZiBkZWxldGVJdCBpcyB0cnVlKS4KKyAgLy8vCisgIGNsYXNzIEZpbGVSZW1vdmVyIHsKKyAgICBzeXM6OlBhdGggRmlsZW5hbWU7CisgICAgYm9vbCBEZWxldGVJdDsKKyAgcHVibGljOgorICAgIEZpbGVSZW1vdmVyKCkgOiBEZWxldGVJdChmYWxzZSkge30KKworICAgIGV4cGxpY2l0IEZpbGVSZW1vdmVyKGNvbnN0IHN5czo6UGF0aCAmZmlsZW5hbWUsIGJvb2wgZGVsZXRlSXQgPSB0cnVlKQorICAgICAgOiBGaWxlbmFtZShmaWxlbmFtZSksIERlbGV0ZUl0KGRlbGV0ZUl0KSB7fQorCisgICAgfkZpbGVSZW1vdmVyKCkgeworICAgICAgaWYgKERlbGV0ZUl0KSB7CisgICAgICAgIC8vIElnbm9yZSBwcm9ibGVtcyBkZWxldGluZyB0aGUgZmlsZS4KKyAgICAgICAgRmlsZW5hbWUuZXJhc2VGcm9tRGlzaygpOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBzZXRGaWxlIC0gR2l2ZSBvd25lcnNoaXAgb2YgdGhlIGZpbGUgdG8gdGhlIEZpbGVSZW1vdmVyIHNvIGl0IHdpbGwKKyAgICAvLy8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkLiAgSWYgdGhlIEZpbGVSZW1vdmVyIGFscmVhZHkKKyAgICAvLy8gaGFkIG93bmVyc2hpcCBvZiBhIGZpbGUsIHJlbW92ZSBpdCBmaXJzdC4KKyAgICB2b2lkIHNldEZpbGUoY29uc3Qgc3lzOjpQYXRoICZmaWxlbmFtZSwgYm9vbCBkZWxldGVJdCA9IHRydWUpIHsKKyAgICAgIGlmIChEZWxldGVJdCkKKyAgICAgICAgRmlsZW5hbWUuZXJhc2VGcm9tRGlzaygpOworCisgICAgICBGaWxlbmFtZSA9IGZpbGVuYW1lOworICAgICAgRGVsZXRlSXQgPSBkZWxldGVJdDsKKyAgICB9CisKKyAgICAvLy8gcmVsZWFzZUZpbGUgLSBUYWtlIG93bmVyc2hpcCBvZiB0aGUgZmlsZSBhd2F5IGZyb20gdGhlIEZpbGVSZW1vdmVyIHNvIGl0CisgICAgLy8vIHdpbGwgbm90IGJlIHJlbW92ZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4KKyAgICB2b2lkIHJlbGVhc2VGaWxlKCkgeyBEZWxldGVJdCA9IGZhbHNlOyB9CisgIH07Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0ZTNkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdC5oCkBAIC0wLDAgKzEsMTU0IEBACisvLz09PS0gRm9ybWF0LmggLSBFZmZpY2llbnQgcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcgZm9yIHN0cmVhbXMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBmb3JtYXQoKSBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBvdGhlcgorLy8gTExWTSBzdWJzeXN0ZW1zIHRvIHByb3ZpZGUgcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcuICBUaGlzIGdpdmVzIGFsbCB0aGUgcG93ZXIKKy8vIGFuZCByaXNrIG9mIHByaW50Zi4gIFRoaXMgY2FuIGJlIHVzZWQgbGlrZSB0aGlzICh3aXRoIHJhd19vc3RyZWFtcyBhcyBhbgorLy8gZXhhbXBsZSk6CisvLworLy8gICAgT1MgPDwgIm15bnVtYmVyOiAiIDw8IGZvcm1hdCgiJTQuNWYiLCAxMjM0LjQxMikgPDwgJ1xuJzsKKy8vCisvLyBPciBpZiB5b3UgcHJlZmVyOgorLy8KKy8vICBPUyA8PCBmb3JtYXQoIm15bnVtYmVyOiAlNC41ZlxuIiwgMTIzNC40MTIpOworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZPUk1BVF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9GT1JNQVRfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaWZkZWYgX01TQ19WRVIKKy8vIEZJWE1FOiBUaGlzIGRlZmluZSBpcyB3cm9uZzoKKy8vICAtIF9zbnByaW50ZiBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0cmFpbGluZyBudWxsIGlzIGFsd2F5cyBhZGRlZCAtIGlmCisvLyAgICB0aGVyZSBpcyBubyBzcGFjZSBmb3IgbnVsbCwgaXQgZG9lcyBub3QgcmVwb3J0IGFueSBlcnJvci4KKy8vICAtIEFjY29yZGluZyB0byBDKysgc3RhbmRhcmQsIHNucHJpbnRmIHNob3VsZCBiZSB2aXNpYmxlIGluIHRoZSAnc3RkJyAKKy8vICAgIG5hbWVzcGFjZSAtIHRoaXMgZGVmaW5lIG1ha2VzIHRoaXMgaW1wb3NzaWJsZS4KKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gZm9ybWF0X29iamVjdF9iYXNlIC0gVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB1c2VkIGZvciBoYW5kbGluZyBmb3JtYXR0ZWQKKy8vLyBvdXRwdXQuICBJdCBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhIHRlbXBsYXRlZCBkZXJpdmVkIGNsYXNzLgorY2xhc3MgZm9ybWF0X29iamVjdF9iYXNlIHsKK3Byb3RlY3RlZDoKKyAgY29uc3QgY2hhciAqRm10OworICB2aXJ0dWFsIHZvaWQgaG9tZSgpOyAvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZC4KKworICAvLy8gc25wcmludCAtIENhbGwgc25wcmludGYoKSBmb3IgdGhpcyBvYmplY3QsIG9uIHRoZSBnaXZlbiBidWZmZXIgYW5kIHNpemUuCisgIHZpcnR1YWwgaW50IHNucHJpbnQoY2hhciAqQnVmZmVyLCB1bnNpZ25lZCBCdWZmZXJTaXplKSBjb25zdCA9IDA7CisKK3B1YmxpYzoKKyAgZm9ybWF0X29iamVjdF9iYXNlKGNvbnN0IGNoYXIgKmZtdCkgOiBGbXQoZm10KSB7fQorICB2aXJ0dWFsIH5mb3JtYXRfb2JqZWN0X2Jhc2UoKSB7fQorCisgIC8vLyBwcmludCAtIEZvcm1hdCB0aGUgb2JqZWN0IGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuICBPbiBzdWNjZXNzLCB0aGlzCisgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZvcm1hdHRlZCBzdHJpbmcuICBJZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbCwKKyAgLy8vIHRoaXMgcmV0dXJucyBhIGxlbmd0aCB0byByZXRyeSB3aXRoLCB3aGljaCB3aWxsIGJlIGxhcmdlciB0aGFuIEJ1ZmZlclNpemUuCisgIHVuc2lnbmVkIHByaW50KGNoYXIgKkJ1ZmZlciwgdW5zaWduZWQgQnVmZmVyU2l6ZSkgY29uc3QgeworICAgIGFzc2VydChCdWZmZXJTaXplICYmICJJbnZhbGlkIGJ1ZmZlciBzaXplISIpOworCisgICAgLy8gUHJpbnQgdGhlIHN0cmluZywgbGVhdmluZyByb29tIGZvciB0aGUgdGVybWluYXRpbmcgbnVsbC4KKyAgICBpbnQgTiA9IHNucHJpbnQoQnVmZmVyLCBCdWZmZXJTaXplKTsKKworICAgIC8vIFZDKysgYW5kIG9sZCBHbGliQyByZXR1cm4gbmVnYXRpdmUgb24gb3ZlcmZsb3csIGp1c3QgZG91YmxlIHRoZSBzaXplLgorICAgIGlmIChOIDwgMCkKKyAgICAgIHJldHVybiBCdWZmZXJTaXplKjI7CisKKyAgICAvLyBPdGhlciBpbXBscyB5aWVsZCBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkLCBub3QgaW5jbHVkaW5nIHRoZSBmaW5hbCAnXDAnLgorICAgIGlmICh1bnNpZ25lZChOKSA+PSBCdWZmZXJTaXplKQorICAgICAgcmV0dXJuIE4rMTsKKworICAgIC8vIE90aGVyd2lzZSBOIGlzIHRoZSBsZW5ndGggb2Ygb3V0cHV0IChub3QgaW5jbHVkaW5nIHRoZSBmaW5hbCAnXDAnKS4KKyAgICByZXR1cm4gTjsKKyAgfQorfTsKKworLy8vIGZvcm1hdF9vYmplY3QxIC0gVGhpcyBpcyBhIHRlbXBsYXRlZCBoZWxwZXIgY2xhc3MgdXNlZCBieSB0aGUgZm9ybWF0CisvLy8gZnVuY3Rpb24gdGhhdCBjYXB0dXJlcyB0aGUgb2JqZWN0IHRvIGJlIGZvcm1hdGVkIGFuZCB0aGUgZm9ybWF0IHN0cmluZy4gV2hlbgorLy8vIGFjdHVhbGx5IHByaW50ZWQsIHRoaXMgc3ludGhlc2l6ZXMgdGhlIHN0cmluZyBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlcgorLy8vIHByb3ZpZGVkIGFuZCByZXR1cm5zIHdoZXRoZXIgb3Igbm90IGl0IGlzIGJpZyBlbm91Z2guCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIGZvcm1hdF9vYmplY3QxIDogcHVibGljIGZvcm1hdF9vYmplY3RfYmFzZSB7CisgIFQgVmFsOworcHVibGljOgorICBmb3JtYXRfb2JqZWN0MShjb25zdCBjaGFyICpmbXQsIGNvbnN0IFQgJnZhbCkKKyAgICA6IGZvcm1hdF9vYmplY3RfYmFzZShmbXQpLCBWYWwodmFsKSB7CisgIH0KKworICB2aXJ0dWFsIGludCBzbnByaW50KGNoYXIgKkJ1ZmZlciwgdW5zaWduZWQgQnVmZmVyU2l6ZSkgY29uc3QgeworICAgIHJldHVybiBzbnByaW50ZihCdWZmZXIsIEJ1ZmZlclNpemUsIEZtdCwgVmFsKTsKKyAgfQorfTsKKworLy8vIGZvcm1hdF9vYmplY3QyIC0gVGhpcyBpcyBhIHRlbXBsYXRlZCBoZWxwZXIgY2xhc3MgdXNlZCBieSB0aGUgZm9ybWF0CisvLy8gZnVuY3Rpb24gdGhhdCBjYXB0dXJlcyB0aGUgb2JqZWN0IHRvIGJlIGZvcm1hdGVkIGFuZCB0aGUgZm9ybWF0IHN0cmluZy4gV2hlbgorLy8vIGFjdHVhbGx5IHByaW50ZWQsIHRoaXMgc3ludGhlc2l6ZXMgdGhlIHN0cmluZyBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlcgorLy8vIHByb3ZpZGVkIGFuZCByZXR1cm5zIHdoZXRoZXIgb3Igbm90IGl0IGlzIGJpZyBlbm91Z2guCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorY2xhc3MgZm9ybWF0X29iamVjdDIgOiBwdWJsaWMgZm9ybWF0X29iamVjdF9iYXNlIHsKKyAgVDEgVmFsMTsKKyAgVDIgVmFsMjsKK3B1YmxpYzoKKyAgZm9ybWF0X29iamVjdDIoY29uc3QgY2hhciAqZm10LCBjb25zdCBUMSAmdmFsMSwgY29uc3QgVDIgJnZhbDIpCisgIDogZm9ybWF0X29iamVjdF9iYXNlKGZtdCksIFZhbDEodmFsMSksIFZhbDIodmFsMikgeworICB9CisKKyAgdmlydHVhbCBpbnQgc25wcmludChjaGFyICpCdWZmZXIsIHVuc2lnbmVkIEJ1ZmZlclNpemUpIGNvbnN0IHsKKyAgICByZXR1cm4gc25wcmludGYoQnVmZmVyLCBCdWZmZXJTaXplLCBGbXQsIFZhbDEsIFZhbDIpOworICB9Cit9OworCisvLy8gZm9ybWF0X29iamVjdDMgLSBUaGlzIGlzIGEgdGVtcGxhdGVkIGhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBmb3JtYXQKKy8vLyBmdW5jdGlvbiB0aGF0IGNhcHR1cmVzIHRoZSBvYmplY3QgdG8gYmUgZm9ybWF0ZWQgYW5kIHRoZSBmb3JtYXQgc3RyaW5nLiBXaGVuCisvLy8gYWN0dWFsbHkgcHJpbnRlZCwgdGhpcyBzeW50aGVzaXplcyB0aGUgc3RyaW5nIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyCisvLy8gcHJvdmlkZWQgYW5kIHJldHVybnMgd2hldGhlciBvciBub3QgaXQgaXMgYmlnIGVub3VnaC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorY2xhc3MgZm9ybWF0X29iamVjdDMgOiBwdWJsaWMgZm9ybWF0X29iamVjdF9iYXNlIHsKKyAgVDEgVmFsMTsKKyAgVDIgVmFsMjsKKyAgVDMgVmFsMzsKK3B1YmxpYzoKKyAgZm9ybWF0X29iamVjdDMoY29uc3QgY2hhciAqZm10LCBjb25zdCBUMSAmdmFsMSwgY29uc3QgVDIgJnZhbDIsY29uc3QgVDMgJnZhbDMpCisgICAgOiBmb3JtYXRfb2JqZWN0X2Jhc2UoZm10KSwgVmFsMSh2YWwxKSwgVmFsMih2YWwyKSwgVmFsMyh2YWwzKSB7CisgIH0KKworICB2aXJ0dWFsIGludCBzbnByaW50KGNoYXIgKkJ1ZmZlciwgdW5zaWduZWQgQnVmZmVyU2l6ZSkgY29uc3QgeworICAgIHJldHVybiBzbnByaW50ZihCdWZmZXIsIEJ1ZmZlclNpemUsIEZtdCwgVmFsMSwgVmFsMiwgVmFsMyk7CisgIH0KK307CisKKy8vLyBmb3JtYXQgLSBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBwcm9kdWNlIGZvcm1hdHRlZCBvdXRwdXQuCisvLy8gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBsaWtlOiAgT1MgPDwgZm9ybWF0KCIlMC40ZiIsIG15ZmxvYXQpIDw8ICdcbic7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBmb3JtYXRfb2JqZWN0MTxUPiBmb3JtYXQoY29uc3QgY2hhciAqRm10LCBjb25zdCBUICZWYWwpIHsKKyAgcmV0dXJuIGZvcm1hdF9vYmplY3QxPFQ+KEZtdCwgVmFsKTsKK30KKworLy8vIGZvcm1hdCAtIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHRvIHByb2R1Y2UgZm9ybWF0dGVkIG91dHB1dC4KKy8vLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGxpa2U6ICBPUyA8PCBmb3JtYXQoIiUwLjRmIiwgbXlmbG9hdCkgPDwgJ1xuJzsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitpbmxpbmUgZm9ybWF0X29iamVjdDI8VDEsIFQyPiBmb3JtYXQoY29uc3QgY2hhciAqRm10LCBjb25zdCBUMSAmVmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiAmVmFsMikgeworICByZXR1cm4gZm9ybWF0X29iamVjdDI8VDEsIFQyPihGbXQsIFZhbDEsIFZhbDIpOworfQorCisvLy8gZm9ybWF0IC0gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8gcHJvZHVjZSBmb3JtYXR0ZWQgb3V0cHV0LgorLy8vIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgbGlrZTogIE9TIDw8IGZvcm1hdCgiJTAuNGYiLCBteWZsb2F0KSA8PCAnXG4nOwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgIGlubGluZSBmb3JtYXRfb2JqZWN0MzxUMSwgVDIsIFQzPiBmb3JtYXQoY29uc3QgY2hhciAqRm10LCBjb25zdCBUMSAmVmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiAmVmFsMiwgY29uc3QgVDMgJlZhbDMpIHsKKyAgcmV0dXJuIGZvcm1hdF9vYmplY3QzPFQxLCBUMiwgVDM+KEZtdCwgVmFsMSwgVmFsMiwgVmFsMyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGExODg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oIC0gRm9ybWF0dGVkIHN0cmVhbXMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHJhd19vc3RyZWFtIGltcGxlbWVudGF0aW9ucyBmb3Igc3RyZWFtcyB0byBkbworLy8gdGhpbmdzIGxpa2UgcHJldHR5LXByaW50IGNvbW1lbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZPUk1BVFRFRFNUUkVBTV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9GT1JNQVRURURTVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIAoreworICAvLy8gZm9ybWF0dGVkX3Jhd19vc3RyZWFtIC0gRm9ybWF0dGVkIHJhd19mZF9vc3RyZWFtIHRvIGhhbmRsZQorICAvLy8gYXNtLXNwZWNpZmljIGNvbnN0cnVjdHMuCisgIC8vLworICBjbGFzcyBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gOiBwdWJsaWMgcmF3X29zdHJlYW0geworICBwdWJsaWM6CisgICAgLy8vIERFTEVURV9TVFJFQU0gLSBUZWxsIHRoZSBkZXN0cnVjdG9yIHRvIGRlbGV0ZSB0aGUgaGVsZCBzdHJlYW0uCisgICAgLy8vCisgICAgc3RhdGljIGNvbnN0IGJvb2wgREVMRVRFX1NUUkVBTSA9IHRydWU7CisKKyAgICAvLy8gUFJFU0VSVkVfU1RSRUFNIC0gVGVsbCB0aGUgZGVzdHJ1Y3RvciB0byBub3QgZGVsZXRlIHRoZSBoZWxkCisgICAgLy8vIHN0cmVhbS4KKyAgICAvLy8KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBQUkVTRVJWRV9TVFJFQU0gPSBmYWxzZTsKKworICBwcml2YXRlOgorICAgIC8vLyBUaGVTdHJlYW0gLSBUaGUgcmVhbCBzdHJlYW0gd2Ugb3V0cHV0IHRvLiBXZSBzZXQgaXQgdG8gYmUKKyAgICAvLy8gdW5idWZmZXJlZCwgc2luY2Ugd2UncmUgYWxyZWFkeSBkb2luZyBvdXIgb3duIGJ1ZmZlcmluZy4KKyAgICAvLy8KKyAgICByYXdfb3N0cmVhbSAqVGhlU3RyZWFtOworCisgICAgLy8vIERlbGV0ZVN0cmVhbSAtIERvIHdlIG5lZWQgdG8gZGVsZXRlIFRoZVN0cmVhbSBpbiB0aGUKKyAgICAvLy8gZGVzdHJ1Y3Rvcj8KKyAgICAvLy8KKyAgICBib29sIERlbGV0ZVN0cmVhbTsKKworICAgIC8vLyBDb2x1bW5TY2FubmVkIC0gVGhlIGN1cnJlbnQgb3V0cHV0IGNvbHVtbiBvZiB0aGUgZGF0YSB0aGF0J3MKKyAgICAvLy8gYmVlbiBmbHVzaGVkIGFuZCB0aGUgcG9ydGlvbiBvZiB0aGUgYnVmZmVyIHRoYXQncyBiZWVuCisgICAgLy8vIHNjYW5uZWQuICBUaGUgY29sdW1uIHNjaGVtZSBpcyB6ZXJvLWJhc2VkLgorICAgIC8vLworICAgIHVuc2lnbmVkIENvbHVtblNjYW5uZWQ7CisKKyAgICAvLy8gU2Nhbm5lZCAtIFRoaXMgcG9pbnRzIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUKKyAgICAvLy8gYnVmZmVyIHdlJ3ZlIHNjYW5uZWQuCisgICAgLy8vCisgICAgY29uc3QgY2hhciAqU2Nhbm5lZDsKKworICAgIHZpcnR1YWwgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpOworCisgICAgLy8vIGN1cnJlbnRfcG9zIC0gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLAorICAgIC8vLyBub3QgY291bnRpbmcgdGhlIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICAgIHZpcnR1YWwgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCB7IAorICAgICAgLy8gVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcgVGhlU3RyZWFtLmN1cnJlbnRfcG9zKCksCisgICAgICAvLyBidXQgdGhhdCBpbnRlcmZhY2UgaXMgcHJpdmF0ZS4KKyAgICAgIHJldHVybiBUaGVTdHJlYW0tPnRlbGwoKSAtIFRoZVN0cmVhbS0+R2V0TnVtQnl0ZXNJbkJ1ZmZlcigpOworICAgIH0KKworICAgIC8vLyBDb21wdXRlQ29sdW1uIC0gRXhhbWluZSB0aGUgZ2l2ZW4gb3V0cHV0IGJ1ZmZlciBhbmQgZmlndXJlIG91dCB3aGljaAorICAgIC8vLyBjb2x1bW4gd2UgZW5kIHVwIGluIGFmdGVyIG91dHB1dC4KKyAgICAvLy8KKyAgICB2b2lkIENvbXB1dGVDb2x1bW4oY29uc3QgY2hhciAqUHRyLCBzaXplX3Qgc2l6ZSk7CisKKyAgcHVibGljOgorICAgIC8vLyBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gLSBPcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSBmb3IKKyAgICAvLy8gd3JpdGluZy4gSWYgYW4gZXJyb3Igb2NjdXJzLCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgaXMKKyAgICAvLy8gcHV0IGludG8gRXJyb3JJbmZvLCBhbmQgdGhlIHN0cmVhbSBzaG91bGQgYmUgaW1tZWRpYXRlbHkKKyAgICAvLy8gZGVzdHJveWVkOyB0aGUgc3RyaW5nIHdpbGwgYmUgZW1wdHkgaWYgbm8gZXJyb3Igb2NjdXJyZWQuCisgICAgLy8vCisgICAgLy8vIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBnaXZlbiBTdHJlYW0gaXMgc2V0IHRvIGJlIFVuYnVmZmVyZWQuCisgICAgLy8vIFRoaXMgaXMgYmVjYXVzZSBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gZG9lcyBpdHMgb3duIGJ1ZmZlcmluZywKKyAgICAvLy8gc28gaXQgZG9lc24ndCB3YW50IGFub3RoZXIgbGF5ZXIgb2YgYnVmZmVyaW5nIHRvIGJlIGhhcHBlbmluZworICAgIC8vLyB1bmRlcm5lYXRoIGl0LgorICAgIC8vLworICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbShyYXdfb3N0cmVhbSAmU3RyZWFtLCBib29sIERlbGV0ZSA9IGZhbHNlKSAKKyAgICAgIDogcmF3X29zdHJlYW0oKSwgVGhlU3RyZWFtKDApLCBEZWxldGVTdHJlYW0oZmFsc2UpLCBDb2x1bW5TY2FubmVkKDApIHsKKyAgICAgIHNldFN0cmVhbShTdHJlYW0sIERlbGV0ZSk7CisgICAgfQorICAgIGV4cGxpY2l0IGZvcm1hdHRlZF9yYXdfb3N0cmVhbSgpCisgICAgICA6IHJhd19vc3RyZWFtKCksIFRoZVN0cmVhbSgwKSwgRGVsZXRlU3RyZWFtKGZhbHNlKSwgQ29sdW1uU2Nhbm5lZCgwKSB7CisgICAgICBTY2FubmVkID0gMDsKKyAgICB9CisKKyAgICB+Zm9ybWF0dGVkX3Jhd19vc3RyZWFtKCkgeworICAgICAgZmx1c2goKTsKKyAgICAgIHJlbGVhc2VTdHJlYW0oKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFN0cmVhbShyYXdfb3N0cmVhbSAmU3RyZWFtLCBib29sIERlbGV0ZSA9IGZhbHNlKSB7CisgICAgICByZWxlYXNlU3RyZWFtKCk7CisKKyAgICAgIFRoZVN0cmVhbSA9ICZTdHJlYW07CisgICAgICBEZWxldGVTdHJlYW0gPSBEZWxldGU7CisKKyAgICAgIC8vIFRoaXMgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIGluaGVyaXRzIGZyb20gcmF3X29zdHJlYW0sIHNvIGl0J2xsIGRvIGl0cworICAgICAgLy8gb3duIGJ1ZmZlcmluZywgYW5kIGl0IGRvZXNuJ3QgbmVlZCBvciB3YW50IFRoZVN0cmVhbSB0byBkbyBhbm90aGVyCisgICAgICAvLyBsYXllciBvZiBidWZmZXJpbmcgdW5kZXJuZWF0aC4gUmVzaXplIHRoZSBidWZmZXIgdG8gd2hhdCBUaGVTdHJlYW0KKyAgICAgIC8vIGhhZCBiZWVuIHVzaW5nLCBhbmQgdGVsbCBUaGVTdHJlYW0gbm90IHRvIGRvIGl0cyBvd24gYnVmZmVyaW5nLgorICAgICAgaWYgKHNpemVfdCBCdWZmZXJTaXplID0gVGhlU3RyZWFtLT5HZXRCdWZmZXJTaXplKCkpCisgICAgICAgIFNldEJ1ZmZlclNpemUoQnVmZmVyU2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIFNldFVuYnVmZmVyZWQoKTsKKyAgICAgIFRoZVN0cmVhbS0+U2V0VW5idWZmZXJlZCgpOworCisgICAgICBTY2FubmVkID0gMDsKKyAgICB9CisKKyAgICAvLy8gUGFkVG9Db2x1bW4gLSBBbGlnbiB0aGUgb3V0cHV0IHRvIHNvbWUgY29sdW1uIG51bWJlci4gIElmIHRoZSBjdXJyZW50CisgICAgLy8vIGNvbHVtbiBpcyBhbHJlYWR5IGVxdWFsIHRvIG9yIG1vcmUgdGhhbiBOZXdDb2wsIFBhZFRvQ29sdW1uIGluc2VydHMgb25lCisgICAgLy8vIHNwYWNlLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTmV3Q29sIC0gVGhlIGNvbHVtbiB0byBtb3ZlIHRvLgorICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmUGFkVG9Db2x1bW4odW5zaWduZWQgTmV3Q29sKTsKKworICBwcml2YXRlOgorICAgIHZvaWQgcmVsZWFzZVN0cmVhbSgpIHsKKyAgICAgIC8vIERlbGV0ZSB0aGUgc3RyZWFtIGlmIG5lZWRlZC4gT3RoZXJ3aXNlLCB0cmFuc2ZlciB0aGUgYnVmZmVyCisgICAgICAvLyBzZXR0aW5ncyBmcm9tIHRoaXMgcmF3X29zdHJlYW0gYmFjayB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICBpZiAoIVRoZVN0cmVhbSkKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKERlbGV0ZVN0cmVhbSkKKyAgICAgICAgZGVsZXRlIFRoZVN0cmVhbTsKKyAgICAgIGVsc2UgaWYgKHNpemVfdCBCdWZmZXJTaXplID0gR2V0QnVmZmVyU2l6ZSgpKQorICAgICAgICBUaGVTdHJlYW0tPlNldEJ1ZmZlclNpemUoQnVmZmVyU2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIFRoZVN0cmVhbS0+U2V0VW5idWZmZXJlZCgpOworICAgIH0KKyAgfTsKKworLy8vIGZvdXRzKCkgLSBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gZm9yCisvLy8gc3RhbmRhcmQgb3V0cHV0LiAgVXNlIGl0IGxpa2U6IGZvdXRzKCkgPDwgImZvbyIgPDwgImJhciI7Citmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJmZvdXRzKCk7CisKKy8vLyBmZXJycygpIC0gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIGZvcgorLy8vIHN0YW5kYXJkIGVycm9yLiAgVXNlIGl0IGxpa2U6IGZlcnJzKCkgPDwgImZvbyIgPDwgImJhciI7Citmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJmZlcnJzKCk7CisKKy8vLyBmZGJncygpIC0gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIGZvcgorLy8vIGRlYnVnIG91dHB1dC4gIFVzZSBpdCBsaWtlOiBmZGJncygpIDw8ICJmb28iIDw8ICJiYXIiOworZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZmZGJncygpOworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTdmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYW4gaXRlcmF0b3IgZm9yIHdhbGtpbmcgdGhyb3VnaCB0aGUgdHlwZXMgaW5kZXhlZCBieQorLy8gZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfR0VURUxFTUVOVFBUUlRZUEVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfR0VURUxFTUVOVFBUUlRZUEVfSAorCisjaW5jbHVkZSAibGx2bS9Vc2VyLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdFR5ID0gVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3I+CisgIGNsYXNzIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIGNvbnN0IFR5cGUgKiwgcHRyZGlmZl90PiB7CisgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKiwgcHRyZGlmZl90PiBzdXBlcjsKKworICAgIEl0VHkgT3BJdDsKKyAgICBjb25zdCBUeXBlICpDdXJUeTsKKyAgICBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yKCkge30KKyAgcHVibGljOgorCisgICAgc3RhdGljIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3IgYmVnaW4oY29uc3QgVHlwZSAqVHksIEl0VHkgSXQpIHsKKyAgICAgIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3IgSTsKKyAgICAgIEkuQ3VyVHkgPSBUeTsKKyAgICAgIEkuT3BJdCA9IEl0OworICAgICAgcmV0dXJuIEk7CisgICAgfQorICAgIHN0YXRpYyBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yIGVuZChJdFR5IEl0KSB7CisgICAgICBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yIEk7CisgICAgICBJLkN1clR5ID0gMDsKKyAgICAgIEkuT3BJdCA9IEl0OworICAgICAgcmV0dXJuIEk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3ImIHgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBPcEl0ID09IHguT3BJdDsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3ImIHgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSh4KTsKKyAgICB9CisKKyAgICBjb25zdCBUeXBlICpvcGVyYXRvciooKSBjb25zdCB7CisgICAgICByZXR1cm4gQ3VyVHk7CisgICAgfQorCisgICAgY29uc3QgVHlwZSAqZ2V0SW5kZXhlZFR5cGUoKSBjb25zdCB7CisgICAgICBjb25zdCBDb21wb3NpdGVUeXBlICpDVCA9IGNhc3Q8Q29tcG9zaXRlVHlwZT4oQ3VyVHkpOworICAgICAgcmV0dXJuIENULT5nZXRUeXBlQXRJbmRleChnZXRPcGVyYW5kKCkpOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgYSBub24tc3RhbmRhcmQgb3BlcmF0b3ItPi4gIEl0IGFsbG93cyB5b3UgdG8gY2FsbCBtZXRob2RzIG9uIHRoZQorICAgIC8vIGN1cnJlbnQgdHlwZSBkaXJlY3RseS4KKyAgICBjb25zdCBUeXBlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKworICAgIFZhbHVlICpnZXRPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gKk9wSXQ7IH0KKworICAgIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAgLy8gUHJlaW5jcmVtZW50CisgICAgICBpZiAoY29uc3QgQ29tcG9zaXRlVHlwZSAqQ1QgPSBkeW5fY2FzdDxDb21wb3NpdGVUeXBlPihDdXJUeSkpIHsKKyAgICAgICAgQ3VyVHkgPSBDVC0+Z2V0VHlwZUF0SW5kZXgoZ2V0T3BlcmFuZCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEN1clR5ID0gMDsKKyAgICAgIH0KKyAgICAgICsrT3BJdDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgICAgfQorICB9OworCisgIHR5cGVkZWYgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvcjw+IGdlcF90eXBlX2l0ZXJhdG9yOworCisgIGlubGluZSBnZXBfdHlwZV9pdGVyYXRvciBnZXBfdHlwZV9iZWdpbihjb25zdCBVc2VyICpHRVApIHsKKyAgICByZXR1cm4gZ2VwX3R5cGVfaXRlcmF0b3I6OmJlZ2luKEdFUC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VQLT5vcF9iZWdpbigpKzEpOworICB9CisgIGlubGluZSBnZXBfdHlwZV9pdGVyYXRvciBnZXBfdHlwZV9lbmQoY29uc3QgVXNlciAqR0VQKSB7CisgICAgcmV0dXJuIGdlcF90eXBlX2l0ZXJhdG9yOjplbmQoR0VQLT5vcF9lbmQoKSk7CisgIH0KKyAgaW5saW5lIGdlcF90eXBlX2l0ZXJhdG9yIGdlcF90eXBlX2JlZ2luKGNvbnN0IFVzZXIgJkdFUCkgeworICAgIHJldHVybiBnZXBfdHlwZV9pdGVyYXRvcjo6YmVnaW4oR0VQLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFUC5vcF9iZWdpbigpKzEpOworICB9CisgIGlubGluZSBnZXBfdHlwZV9pdGVyYXRvciBnZXBfdHlwZV9lbmQoY29uc3QgVXNlciAmR0VQKSB7CisgICAgcmV0dXJuIGdlcF90eXBlX2l0ZXJhdG9yOjplbmQoR0VQLm9wX2VuZCgpKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0VHk+CisgIGlubGluZSBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yPEl0VHk+CisgIGdlcF90eXBlX2JlZ2luKGNvbnN0IFR5cGUgKk9wMCwgSXRUeSBJLCBJdFR5IEUpIHsKKyAgICByZXR1cm4gZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvcjxJdFR5Pjo6YmVnaW4oT3AwLCBJKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0VHk+CisgIGlubGluZSBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yPEl0VHk+CisgIGdlcF90eXBlX2VuZChjb25zdCBUeXBlICpPcDAsIEl0VHkgSSwgSXRUeSBFKSB7CisgICAgcmV0dXJuIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3I8SXRUeT46OmVuZChFKTsKKyAgfQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HcmFwaFdyaXRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvR3JhcGhXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjUzZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvR3JhcGhXcml0ZXIuaApAQCAtMCwwICsxLDM1MiBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvR3JhcGhXcml0ZXIuaCAtIFdyaXRlIGdyYXBoIHRvIGEgLmRvdCBmaWxlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHNpbXBsZSBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBwcmludCBvdXQgZ2VuZXJpYworLy8gTExWTSBncmFwaHMgdG8gIi5kb3QiIGZpbGVzLiAgImRvdCIgaXMgYSB0b29sIHRoYXQgaXMgcGFydCBvZiB0aGUgQVQmVAorLy8gZ3JhcGh2aXogcGFja2FnZSAoaHR0cDovL3d3dy5yZXNlYXJjaC5hdHQuY29tL3N3L3Rvb2xzL2dyYXBodml6Lykgd2hpY2ggY2FuCisvLyBiZSB1c2VkIHRvIHR1cm4gdGhlIGZpbGVzIG91dHB1dCBieSB0aGlzIGludGVyZmFjZSBpbnRvIGEgdmFyaWV0eSBvZgorLy8gZGlmZmVyZW50IGdyYXBoaWNzIGZvcm1hdHMuCisvLworLy8gR3JhcGhzIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCBhbnkgaW50ZXJmYWNlIHBhc3Qgd2hhdCBpcyBhbHJlYWR5IHJlcXVpcmVkCisvLyBieSB0aGUgR3JhcGhUcmFpdHMgdGVtcGxhdGUsIGJ1dCB0aGV5IGNhbiBjaG9vc2UgdG8gaW1wbGVtZW50IHNwZWNpYWxpemF0aW9ucworLy8gb2YgdGhlIERPVEdyYXBoVHJhaXRzIHRlbXBsYXRlIGlmIHRoZXkgd2FudCB0byBjdXN0b21pemUgdGhlIGdyYXBocyBvdXRwdXQgaW4KKy8vIGFueSB3YXkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfR1JBUEhXUklURVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfR1JBUEhXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RPVEdyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9QYXRoLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIERPVCB7ICAvLyBQcml2YXRlIGZ1bmN0aW9ucy4uLgorICBzdGQ6OnN0cmluZyBFc2NhcGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJkxhYmVsKTsKK30KKworbmFtZXNwYWNlIEdyYXBoUHJvZ3JhbSB7CisgICBlbnVtIE5hbWUgeworICAgICAgRE9ULAorICAgICAgRkRQLAorICAgICAgTkVBVE8sCisgICAgICBUV09QSSwKKyAgICAgIENJUkNPCisgICB9OworfQorCit2b2lkIERpc3BsYXlHcmFwaChjb25zdCBzeXM6OlBhdGgmIEZpbGVuYW1lLCBib29sIHdhaXQ9dHJ1ZSwgR3JhcGhQcm9ncmFtOjpOYW1lIHByb2dyYW0gPSBHcmFwaFByb2dyYW06OkRPVCk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KK2NsYXNzIEdyYXBoV3JpdGVyIHsKKyAgcmF3X29zdHJlYW0gJk87CisgIGNvbnN0IEdyYXBoVHlwZSAmRzsKKworICB0eXBlZGVmIERPVEdyYXBoVHJhaXRzPEdyYXBoVHlwZT4gICAgICAgICAgIERPVFRyYWl0czsKKyAgdHlwZWRlZiBHcmFwaFRyYWl0czxHcmFwaFR5cGU+ICAgICAgICAgICAgICBHVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIEdUcmFpdHM6Ok5vZGVUeXBlICAgICAgICAgIE5vZGVUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEdUcmFpdHM6Om5vZGVzX2l0ZXJhdG9yICAgIG5vZGVfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgR1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfaXRlcmF0b3I7CisgIERPVFRyYWl0cyBEVHJhaXRzOworCisgIC8vIFdyaXRlcyB0aGUgZWRnZSBsYWJlbHMgb2YgdGhlIG5vZGUgdG8gTyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkKKyAgLy8gZWRnZSBsYWJlbHMgbm90IGVxdWFsIHRvIHRoZSBlbXB0eSBzdHJpbmcgIiIuCisgIGJvb2wgZ2V0RWRnZVNvdXJjZUxhYmVscyhyYXdfb3N0cmVhbSAmTywgTm9kZVR5cGUgKk5vZGUpIHsKKyAgICBjaGlsZF9pdGVyYXRvciBFSSA9IEdUcmFpdHM6OmNoaWxkX2JlZ2luKE5vZGUpOworICAgIGNoaWxkX2l0ZXJhdG9yIEVFID0gR1RyYWl0czo6Y2hpbGRfZW5kKE5vZGUpOworICAgIGJvb2wgaGFzRWRnZVNvdXJjZUxhYmVscyA9IGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgRUkgIT0gRUUgJiYgaSAhPSA2NDsgKytFSSwgKytpKSB7CisgICAgICBzdGQ6OnN0cmluZyBsYWJlbCA9IERUcmFpdHMuZ2V0RWRnZVNvdXJjZUxhYmVsKE5vZGUsIEVJKTsKKworICAgICAgaWYgKGxhYmVsID09ICIiKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaGFzRWRnZVNvdXJjZUxhYmVscyA9IHRydWU7CisKKyAgICAgIGlmIChpKQorICAgICAgICBPIDw8ICJ8IjsKKworICAgICAgTyA8PCAiPHMiIDw8IGkgPDwgIj4iIDw8IERUcmFpdHMuZ2V0RWRnZVNvdXJjZUxhYmVsKE5vZGUsIEVJKTsKKyAgICB9CisKKyAgICBpZiAoRUkgIT0gRUUgJiYgaGFzRWRnZVNvdXJjZUxhYmVscykKKyAgICAgIE8gPDwgInw8czY0PnRydW5jYXRlZC4uLiI7CisKKyAgICByZXR1cm4gaGFzRWRnZVNvdXJjZUxhYmVsczsKKyAgfQorCitwdWJsaWM6CisgIEdyYXBoV3JpdGVyKHJhd19vc3RyZWFtICZvLCBjb25zdCBHcmFwaFR5cGUgJmcsIGJvb2wgU04pIDogTyhvKSwgRyhnKSB7CisgIERUcmFpdHMgPSBET1RUcmFpdHMoU04pOyAKK30KKworICB2b2lkIHdyaXRlSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgc3RkOjpzdHJpbmcgR3JhcGhOYW1lID0gRFRyYWl0cy5nZXRHcmFwaE5hbWUoRyk7CisKKyAgICBpZiAoIU5hbWUuZW1wdHkoKSkKKyAgICAgIE8gPDwgImRpZ3JhcGggXCIiIDw8IERPVDo6RXNjYXBlU3RyaW5nKE5hbWUpIDw8ICJcIiB7XG4iOworICAgIGVsc2UgaWYgKCFHcmFwaE5hbWUuZW1wdHkoKSkKKyAgICAgIE8gPDwgImRpZ3JhcGggXCIiIDw8IERPVDo6RXNjYXBlU3RyaW5nKEdyYXBoTmFtZSkgPDwgIlwiIHtcbiI7CisgICAgZWxzZQorICAgICAgTyA8PCAiZGlncmFwaCB1bm5hbWVkIHtcbiI7CisKKyAgICBpZiAoRFRyYWl0cy5yZW5kZXJHcmFwaEZyb21Cb3R0b21VcCgpKQorICAgICAgTyA8PCAiXHRyYW5rZGlyPVwiQlRcIjtcbiI7CisKKyAgICBpZiAoIU5hbWUuZW1wdHkoKSkKKyAgICAgIE8gPDwgIlx0bGFiZWw9XCIiIDw8IERPVDo6RXNjYXBlU3RyaW5nKE5hbWUpIDw8ICJcIjtcbiI7CisgICAgZWxzZSBpZiAoIUdyYXBoTmFtZS5lbXB0eSgpKQorICAgICAgTyA8PCAiXHRsYWJlbD1cIiIgPDwgRE9UOjpFc2NhcGVTdHJpbmcoR3JhcGhOYW1lKSA8PCAiXCI7XG4iOworICAgIE8gPDwgRFRyYWl0cy5nZXRHcmFwaFByb3BlcnRpZXMoRyk7CisgICAgTyA8PCAiXG4iOworICB9CisKKyAgdm9pZCB3cml0ZUZvb3RlcigpIHsKKyAgICAvLyBGaW5pc2ggb2ZmIHRoZSBncmFwaAorICAgIE8gPDwgIn1cbiI7CisgIH0KKworICB2b2lkIHdyaXRlTm9kZXMoKSB7CisgICAgLy8gTG9vcCBvdmVyIHRoZSBncmFwaCwgcHJpbnRpbmcgaXQgb3V0Li4uCisgICAgZm9yIChub2RlX2l0ZXJhdG9yIEkgPSBHVHJhaXRzOjpub2Rlc19iZWdpbihHKSwgRSA9IEdUcmFpdHM6Om5vZGVzX2VuZChHKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgaWYgKCFpc05vZGVIaWRkZW4oKkkpKQorICAgICAgICB3cml0ZU5vZGUoKkkpOworICB9CisKKyAgYm9vbCBpc05vZGVIaWRkZW4oTm9kZVR5cGUgJk5vZGUpIHsKKyAgICByZXR1cm4gaXNOb2RlSGlkZGVuKCZOb2RlKTsKKyAgfQorCisgIGJvb2wgaXNOb2RlSGlkZGVuKE5vZGVUeXBlICpjb25zdCAqTm9kZSkgeworICAgIHJldHVybiBpc05vZGVIaWRkZW4oKk5vZGUpOworICB9CisKKyAgYm9vbCBpc05vZGVIaWRkZW4oTm9kZVR5cGUgKk5vZGUpIHsKKyAgICByZXR1cm4gRFRyYWl0cy5pc05vZGVIaWRkZW4oTm9kZSk7CisgIH0KKworICB2b2lkIHdyaXRlTm9kZShOb2RlVHlwZSYgTm9kZSkgeworICAgIHdyaXRlTm9kZSgmTm9kZSk7CisgIH0KKworICB2b2lkIHdyaXRlTm9kZShOb2RlVHlwZSAqY29uc3QgKk5vZGUpIHsKKyAgICB3cml0ZU5vZGUoKk5vZGUpOworICB9CisKKyAgdm9pZCB3cml0ZU5vZGUoTm9kZVR5cGUgKk5vZGUpIHsKKyAgICBzdGQ6OnN0cmluZyBOb2RlQXR0cmlidXRlcyA9IERUcmFpdHMuZ2V0Tm9kZUF0dHJpYnV0ZXMoTm9kZSwgRyk7CisKKyAgICBPIDw8ICJcdE5vZGUiIDw8IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihOb2RlKSA8PCAiIFtzaGFwZT1yZWNvcmQsIjsKKyAgICBpZiAoIU5vZGVBdHRyaWJ1dGVzLmVtcHR5KCkpIE8gPDwgTm9kZUF0dHJpYnV0ZXMgPDwgIiwiOworICAgIE8gPDwgImxhYmVsPVwieyI7CisKKyAgICBpZiAoIURUcmFpdHMucmVuZGVyR3JhcGhGcm9tQm90dG9tVXAoKSkgeworICAgICAgTyA8PCBET1Q6OkVzY2FwZVN0cmluZyhEVHJhaXRzLmdldE5vZGVMYWJlbChOb2RlLCBHKSk7CisKKyAgICAgIC8vIElmIHdlIHNob3VsZCBpbmNsdWRlIHRoZSBhZGRyZXNzIG9mIHRoZSBub2RlIGluIHRoZSBsYWJlbCwgZG8gc28gbm93LgorICAgICAgaWYgKERUcmFpdHMuaGFzTm9kZUFkZHJlc3NMYWJlbChOb2RlLCBHKSkKKyAgICAgICAgTyA8PCAifCIgPDwgKHZvaWQqKU5vZGU7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZWRnZVNvdXJjZUxhYmVsczsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gRWRnZVNvdXJjZUxhYmVscyhlZGdlU291cmNlTGFiZWxzKTsKKyAgICBib29sIGhhc0VkZ2VTb3VyY2VMYWJlbHMgPSBnZXRFZGdlU291cmNlTGFiZWxzKEVkZ2VTb3VyY2VMYWJlbHMsIE5vZGUpOworCisgICAgaWYgKGhhc0VkZ2VTb3VyY2VMYWJlbHMpIHsKKyAgICAgIGlmICghRFRyYWl0cy5yZW5kZXJHcmFwaEZyb21Cb3R0b21VcCgpKSBPIDw8ICJ8IjsKKworICAgICAgTyA8PCAieyIgPDwgRWRnZVNvdXJjZUxhYmVscy5zdHIoKSA8PCAifSI7CisKKyAgICAgIGlmIChEVHJhaXRzLnJlbmRlckdyYXBoRnJvbUJvdHRvbVVwKCkpIE8gPDwgInwiOworICAgIH0KKworICAgIGlmIChEVHJhaXRzLnJlbmRlckdyYXBoRnJvbUJvdHRvbVVwKCkpIHsKKyAgICAgIE8gPDwgRE9UOjpFc2NhcGVTdHJpbmcoRFRyYWl0cy5nZXROb2RlTGFiZWwoTm9kZSwgRykpOworCisgICAgICAvLyBJZiB3ZSBzaG91bGQgaW5jbHVkZSB0aGUgYWRkcmVzcyBvZiB0aGUgbm9kZSBpbiB0aGUgbGFiZWwsIGRvIHNvIG5vdy4KKyAgICAgIGlmIChEVHJhaXRzLmhhc05vZGVBZGRyZXNzTGFiZWwoTm9kZSwgRykpCisgICAgICAgIE8gPDwgInwiIDw8ICh2b2lkKilOb2RlOworICAgIH0KKworICAgIGlmIChEVHJhaXRzLmhhc0VkZ2VEZXN0TGFiZWxzKCkpIHsKKyAgICAgIE8gPDwgInx7IjsKKworICAgICAgdW5zaWduZWQgaSA9IDAsIGUgPSBEVHJhaXRzLm51bUVkZ2VEZXN0TGFiZWxzKE5vZGUpOworICAgICAgZm9yICg7IGkgIT0gZSAmJiBpICE9IDY0OyArK2kpIHsKKyAgICAgICAgaWYgKGkpIE8gPDwgInwiOworICAgICAgICBPIDw8ICI8ZCIgPDwgaSA8PCAiPiIKKyAgICAgICAgICA8PCBET1Q6OkVzY2FwZVN0cmluZyhEVHJhaXRzLmdldEVkZ2VEZXN0TGFiZWwoTm9kZSwgaSkpOworICAgICAgfQorCisgICAgICBpZiAoaSAhPSBlKQorICAgICAgICBPIDw8ICJ8PGQ2ND50cnVuY2F0ZWQuLi4iOworICAgICAgTyA8PCAifSI7CisgICAgfQorCisgICAgTyA8PCAifVwiXTtcbiI7ICAgLy8gRmluaXNoIHByaW50aW5nIHRoZSAibm9kZSIgbGluZQorCisgICAgLy8gT3V0cHV0IGFsbCBvZiB0aGUgZWRnZXMgbm93CisgICAgY2hpbGRfaXRlcmF0b3IgRUkgPSBHVHJhaXRzOjpjaGlsZF9iZWdpbihOb2RlKTsKKyAgICBjaGlsZF9pdGVyYXRvciBFRSA9IEdUcmFpdHM6OmNoaWxkX2VuZChOb2RlKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBFSSAhPSBFRSAmJiBpICE9IDY0OyArK0VJLCArK2kpCisgICAgICBpZiAoIURUcmFpdHMuaXNOb2RlSGlkZGVuKCpFSSkpCisgICAgICAgIHdyaXRlRWRnZShOb2RlLCBpLCBFSSk7CisgICAgZm9yICg7IEVJICE9IEVFOyArK0VJKQorICAgICAgaWYgKCFEVHJhaXRzLmlzTm9kZUhpZGRlbigqRUkpKQorICAgICAgICB3cml0ZUVkZ2UoTm9kZSwgNjQsIEVJKTsKKyAgfQorCisgIHZvaWQgd3JpdGVFZGdlKE5vZGVUeXBlICpOb2RlLCB1bnNpZ25lZCBlZGdlaWR4LCBjaGlsZF9pdGVyYXRvciBFSSkgeworICAgIGlmIChOb2RlVHlwZSAqVGFyZ2V0Tm9kZSA9ICpFSSkgeworICAgICAgaW50IERlc3RQb3J0ID0gLTE7CisgICAgICBpZiAoRFRyYWl0cy5lZGdlVGFyZ2V0c0VkZ2VTb3VyY2UoTm9kZSwgRUkpKSB7CisgICAgICAgIGNoaWxkX2l0ZXJhdG9yIFRhcmdldEl0ID0gRFRyYWl0cy5nZXRFZGdlVGFyZ2V0KE5vZGUsIEVJKTsKKworICAgICAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIGVkZ2UgdGhpcyB0YXJnZXRzLi4uCisgICAgICAgIHVuc2lnbmVkIE9mZnNldCA9CisgICAgICAgICAgKHVuc2lnbmVkKXN0ZDo6ZGlzdGFuY2UoR1RyYWl0czo6Y2hpbGRfYmVnaW4oVGFyZ2V0Tm9kZSksIFRhcmdldEl0KTsKKyAgICAgICAgRGVzdFBvcnQgPSBzdGF0aWNfY2FzdDxpbnQ+KE9mZnNldCk7CisgICAgICB9CisKKyAgICAgIGlmIChEVHJhaXRzLmdldEVkZ2VTb3VyY2VMYWJlbChOb2RlLCBFSSkgPT0gIiIpCisgICAgICAgIGVkZ2VpZHggPSAtMTsKKworICAgICAgZW1pdEVkZ2Uoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KE5vZGUpLCBlZGdlaWR4LAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KFRhcmdldE5vZGUpLCBEZXN0UG9ydCwKKyAgICAgICAgICAgICAgIERUcmFpdHMuZ2V0RWRnZUF0dHJpYnV0ZXMoTm9kZSwgRUkpKTsKKyAgICB9CisgIH0KKworICAvLy8gZW1pdFNpbXBsZU5vZGUgLSBPdXRwdXRzIGEgc2ltcGxlIChub24tcmVjb3JkKSBub2RlCisgIHZvaWQgZW1pdFNpbXBsZU5vZGUoY29uc3Qgdm9pZCAqSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICZBdHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZMYWJlbCwgdW5zaWduZWQgTnVtRWRnZVNvdXJjZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqRWRnZVNvdXJjZUxhYmVscyA9IDApIHsKKyAgICBPIDw8ICJcdE5vZGUiIDw8IElEIDw8ICJbICI7CisgICAgaWYgKCFBdHRyLmVtcHR5KCkpCisgICAgICBPIDw8IEF0dHIgPDwgIiwiOworICAgIE8gPDwgIiBsYWJlbCA9XCIiOworICAgIGlmIChOdW1FZGdlU291cmNlcykgTyA8PCAieyI7CisgICAgTyA8PCBET1Q6OkVzY2FwZVN0cmluZyhMYWJlbCk7CisgICAgaWYgKE51bUVkZ2VTb3VyY2VzKSB7CisgICAgICBPIDw8ICJ8eyI7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWRnZVNvdXJjZXM7ICsraSkgeworICAgICAgICBpZiAoaSkgTyA8PCAifCI7CisgICAgICAgIE8gPDwgIjxzIiA8PCBpIDw8ICI+IjsKKyAgICAgICAgaWYgKEVkZ2VTb3VyY2VMYWJlbHMpIE8gPDwgRE9UOjpFc2NhcGVTdHJpbmcoKCpFZGdlU291cmNlTGFiZWxzKVtpXSk7CisgICAgICB9CisgICAgICBPIDw8ICJ9fSI7CisgICAgfQorICAgIE8gPDwgIlwiXTtcbiI7CisgIH0KKworICAvLy8gZW1pdEVkZ2UgLSBPdXRwdXQgYW4gZWRnZSBmcm9tIGEgc2ltcGxlIG5vZGUgaW50byB0aGUgZ3JhcGguLi4KKyAgdm9pZCBlbWl0RWRnZShjb25zdCB2b2lkICpTcmNOb2RlSUQsIGludCBTcmNOb2RlUG9ydCwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpEZXN0Tm9kZUlELCBpbnQgRGVzdE5vZGVQb3J0LAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZBdHRycykgeworICAgIGlmIChTcmNOb2RlUG9ydCAgPiA2NCkgcmV0dXJuOyAgICAgICAgICAgICAvLyBFbWluYXRpbmcgZnJvbSB0cnVuY2F0ZWQgcGFydD8KKyAgICBpZiAoRGVzdE5vZGVQb3J0ID4gNjQpIERlc3ROb2RlUG9ydCA9IDY0OyAgLy8gVGFyZ2V0dGluZyB0aGUgdHJ1bmNhdGVkIHBhcnQ/CisKKyAgICBPIDw8ICJcdE5vZGUiIDw8IFNyY05vZGVJRDsKKyAgICBpZiAoU3JjTm9kZVBvcnQgPj0gMCkKKyAgICAgIE8gPDwgIjpzIiA8PCBTcmNOb2RlUG9ydDsKKyAgICBPIDw8ICIgLT4gTm9kZSIgPDwgRGVzdE5vZGVJRDsKKyAgICBpZiAoRGVzdE5vZGVQb3J0ID49IDAgJiYgRFRyYWl0cy5oYXNFZGdlRGVzdExhYmVscygpKQorICAgICAgTyA8PCAiOmQiIDw8IERlc3ROb2RlUG9ydDsKKworICAgIGlmICghQXR0cnMuZW1wdHkoKSkKKyAgICAgIE8gPDwgIlsiIDw8IEF0dHJzIDw8ICJdIjsKKyAgICBPIDw8ICI7XG4iOworICB9CisKKyAgLy8vIGdldE9TdHJlYW0gLSBHZXQgdGhlIHJhdyBvdXRwdXQgc3RyZWFtIGludG8gdGhlIGdyYXBoIGZpbGUuIFVzZWZ1bCB0bworICAvLy8gd3JpdGUgZmFuY3kgdGhpbmdzIHVzaW5nIGFkZEN1c3RvbUdyYXBoRmVhdHVyZXMoKS4KKyAgcmF3X29zdHJlYW0gJmdldE9TdHJlYW0oKSB7CisgICAgcmV0dXJuIE87CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KK3Jhd19vc3RyZWFtICZXcml0ZUdyYXBoKHJhd19vc3RyZWFtICZPLCBjb25zdCBHcmFwaFR5cGUgJkcsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3J0TmFtZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVGl0bGUgPSAiIikgeworICAvLyBTdGFydCB0aGUgZ3JhcGggZW1pc3Npb24gcHJvY2Vzcy4uLgorICBHcmFwaFdyaXRlcjxHcmFwaFR5cGU+IFcoTywgRywgU2hvcnROYW1lcyk7CisKKyAgLy8gT3V0cHV0IHRoZSBoZWFkZXIgZm9yIHRoZSBncmFwaC4uLgorICBXLndyaXRlSGVhZGVyKFRpdGxlKTsKKworICAvLyBFbWl0IGFsbCBvZiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLi4uCisgIFcud3JpdGVOb2RlcygpOworCisgIC8vIE91dHB1dCBhbnkgY3VzdG9taXphdGlvbnMgb24gdGhlIGdyYXBoCisgIERPVEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46OmFkZEN1c3RvbUdyYXBoRmVhdHVyZXMoRywgVyk7CisKKyAgLy8gT3V0cHV0IHRoZSBlbmQgb2YgdGhlIGdyYXBoCisgIFcud3JpdGVGb290ZXIoKTsKKyAgcmV0dXJuIE87Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KK3N5czo6UGF0aCBXcml0ZUdyYXBoKGNvbnN0IEdyYXBoVHlwZSAmRywgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIFNob3J0TmFtZXMgPSBmYWxzZSwgY29uc3Qgc3RkOjpzdHJpbmcgJlRpdGxlID0gIiIpIHsKKyAgc3RkOjpzdHJpbmcgRXJyTXNnOworICBzeXM6OlBhdGggRmlsZW5hbWUgPSBzeXM6OlBhdGg6OkdldFRlbXBvcmFyeURpcmVjdG9yeSgmRXJyTXNnKTsKKyAgaWYgKEZpbGVuYW1lLmlzRW1wdHkoKSkgeworICAgIGVycnMoKSA8PCAiRXJyb3I6ICIgPDwgRXJyTXNnIDw8ICJcbiI7CisgICAgcmV0dXJuIEZpbGVuYW1lOworICB9CisgIEZpbGVuYW1lLmFwcGVuZENvbXBvbmVudChOYW1lICsgIi5kb3QiKTsKKyAgaWYgKEZpbGVuYW1lLm1ha2VVbmlxdWUodHJ1ZSwmRXJyTXNnKSkgeworICAgIGVycnMoKSA8PCAiRXJyb3I6ICIgPDwgRXJyTXNnIDw8ICJcbiI7CisgICAgcmV0dXJuIHN5czo6UGF0aCgpOworICB9CisKKyAgZXJycygpIDw8ICJXcml0aW5nICciIDw8IEZpbGVuYW1lLnN0cigpIDw8ICInLi4uICI7CisKKyAgc3RkOjpzdHJpbmcgRXJyb3JJbmZvOworICByYXdfZmRfb3N0cmVhbSBPKEZpbGVuYW1lLmNfc3RyKCksIEVycm9ySW5mbyk7CisKKyAgaWYgKEVycm9ySW5mby5lbXB0eSgpKSB7CisgICAgV3JpdGVHcmFwaChPLCBHLCBTaG9ydE5hbWVzLCBOYW1lLCBUaXRsZSk7CisgICAgZXJycygpIDw8ICIgZG9uZS4gXG4iOworICB9IGVsc2UgeworICAgIGVycnMoKSA8PCAiZXJyb3Igb3BlbmluZyBmaWxlICciIDw8IEZpbGVuYW1lLnN0cigpIDw8ICInIGZvciB3cml0aW5nIVxuIjsKKyAgICBGaWxlbmFtZS5jbGVhcigpOworICB9CisKKyAgcmV0dXJuIEZpbGVuYW1lOworfQorCisvLy8gVmlld0dyYXBoIC0gRW1pdCBhIGRvdCBncmFwaCwgcnVuICdkb3QnLCBydW4gZ3Ygb24gdGhlIHBvc3RzY3JpcHQgZmlsZSwKKy8vLyB0aGVuIGNsZWFudXAuICBGb3IgdXNlIGZyb20gdGhlIGRlYnVnZ2VyLgorLy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+Cit2b2lkIFZpZXdHcmFwaChjb25zdCBHcmFwaFR5cGUgJkcsIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgYm9vbCBTaG9ydE5hbWVzID0gZmFsc2UsIGNvbnN0IHN0ZDo6c3RyaW5nICZUaXRsZSA9ICIiLAorICAgICAgICAgICAgICAgR3JhcGhQcm9ncmFtOjpOYW1lIFByb2dyYW0gPSBHcmFwaFByb2dyYW06OkRPVCkgeworICBzeXM6OlBhdGggRmlsZW5hbWUgPSBXcml0ZUdyYXBoKEcsIE5hbWUsIFNob3J0TmFtZXMsIFRpdGxlKTsKKworICBpZiAoRmlsZW5hbWUuaXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBEaXNwbGF5R3JhcGgoRmlsZW5hbWUsIHRydWUsIFByb2dyYW0pOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0lSQnVpbGRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvSVJCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzOTRmMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0lSQnVpbGRlci5oCkBAIC0wLDAgKzEsMTA5NSBAQAorLy89PT0tLS0tIGxsdm0vU3VwcG9ydC9JUkJ1aWxkZXIuaCAtIEJ1aWxkZXIgZm9yIExMVk0gSW5zdHJzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSVJCdWlsZGVyIGNsYXNzLCB3aGljaCBpcyB1c2VkIGFzIGEgY29udmVuaWVudCB3YXkKKy8vIHRvIGNyZWF0ZSBMTFZNIGluc3RydWN0aW9ucyB3aXRoIGEgY29uc2lzdGVudCBhbmQgc2ltcGxpZmllZCBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfSVJCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0lSQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbnN0YW50Rm9sZGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTUROb2RlOworCisvLy8gSVJCdWlsZGVyRGVmYXVsdEluc2VydGVyIC0gVGhpcyBwcm92aWRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKy8vLyBJUkJ1aWxkZXIgJ0luc2VydEhlbHBlcicgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGluc3RydWN0aW9uIGlzCisvLy8gY3JlYXRlZCBieSBJUkJ1aWxkZXIgYW5kIG5lZWRzIHRvIGJlIGluc2VydGVkLiAgQnkgZGVmYXVsdCwgdGhpcyBpbnNlcnRzIHRoZQorLy8vIGluc3RydWN0aW9uIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQuCitjbGFzcyBJUkJ1aWxkZXJEZWZhdWx0SW5zZXJ0ZXIgeworcHJvdGVjdGVkOgorICB2b2lkIEluc2VydEhlbHBlcihJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqQkIsIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFB0KSBjb25zdCB7CisgICAgaWYgKEJCKSBCQi0+Z2V0SW5zdExpc3QoKS5pbnNlcnQoSW5zZXJ0UHQsIEkpOworICB9Cit9OworCisvLy8gSVJCdWlsZGVyQmFzZSAtIENvbW1vbiBiYXNlIGNsYXNzIHNoYXJlZCBhbW9uZyB2YXJpb3VzIElSQnVpbGRlcnMuCitjbGFzcyBJUkJ1aWxkZXJCYXNlIHsKKyAgRGVidWdMb2MgQ3VyRGJnTG9jYXRpb247Citwcm90ZWN0ZWQ6CisgIEJhc2ljQmxvY2sgKkJCOworICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdDsKKyAgTExWTUNvbnRleHQgJkNvbnRleHQ7CitwdWJsaWM6CisgIAorICBJUkJ1aWxkZXJCYXNlKExMVk1Db250ZXh0ICZjb250ZXh0KQorICAgIDogQ29udGV4dChjb250ZXh0KSB7CisgICAgQ2xlYXJJbnNlcnRpb25Qb2ludCgpOworICB9CisgIAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQnVpbGRlciBjb25maWd1cmF0aW9uIG1ldGhvZHMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIAorICAvLy8gQ2xlYXJJbnNlcnRpb25Qb2ludCAtIENsZWFyIHRoZSBpbnNlcnRpb24gcG9pbnQ6IGNyZWF0ZWQgaW5zdHJ1Y3Rpb25zIHdpbGwKKyAgLy8vIG5vdCBiZSBpbnNlcnRlZCBpbnRvIGEgYmxvY2suCisgIHZvaWQgQ2xlYXJJbnNlcnRpb25Qb2ludCgpIHsKKyAgICBCQiA9IDA7CisgIH0KKyAgCisgIEJhc2ljQmxvY2sgKkdldEluc2VydEJsb2NrKCkgY29uc3QgeyByZXR1cm4gQkI7IH0KKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgR2V0SW5zZXJ0UG9pbnQoKSBjb25zdCB7IHJldHVybiBJbnNlcnRQdDsgfQorICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KKyAgCisgIC8vLyBTZXRJbnNlcnRQb2ludCAtIFRoaXMgc3BlY2lmaWVzIHRoYXQgY3JlYXRlZCBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlCisgIC8vLyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suCisgIHZvaWQgU2V0SW5zZXJ0UG9pbnQoQmFzaWNCbG9jayAqVGhlQkIpIHsKKyAgICBCQiA9IFRoZUJCOworICAgIEluc2VydFB0ID0gQkItPmVuZCgpOworICB9CisgIAorICAvLy8gU2V0SW5zZXJ0UG9pbnQgLSBUaGlzIHNwZWNpZmllcyB0aGF0IGNyZWF0ZWQgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZQorICAvLy8gaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBwb2ludC4KKyAgdm9pZCBTZXRJbnNlcnRQb2ludChCYXNpY0Jsb2NrICpUaGVCQiwgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVApIHsKKyAgICBCQiA9IFRoZUJCOworICAgIEluc2VydFB0ID0gSVA7CisgIH0KKyAgCisgIC8vLyBTZXRDdXJyZW50RGVidWdMb2NhdGlvbiAtIFNldCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB1c2VkIGJ5IGRlYnVnZ2luZworICAvLy8gaW5mb3JtYXRpb24uCisgIHZvaWQgU2V0Q3VycmVudERlYnVnTG9jYXRpb24oY29uc3QgRGVidWdMb2MgJkwpIHsKKyAgICBDdXJEYmdMb2NhdGlvbiA9IEw7CisgIH0KKyAgCisgIC8vLyBnZXRDdXJyZW50RGVidWdMb2NhdGlvbiAtIEdldCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB1c2VkIGJ5IGRlYnVnZ2luZworICAvLy8gaW5mb3JtYXRpb24uCisgIGNvbnN0IERlYnVnTG9jICZnZXRDdXJyZW50RGVidWdMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIEN1ckRiZ0xvY2F0aW9uOyB9CisgIAorICAvLy8gU2V0SW5zdERlYnVnTG9jYXRpb24gLSBJZiB0aGlzIGJ1aWxkZXIgaGFzIGEgY3VycmVudCBkZWJ1ZyBsb2NhdGlvbiwgc2V0CisgIC8vLyBpdCBvbiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgorICB2b2lkIFNldEluc3REZWJ1Z0xvY2F0aW9uKEluc3RydWN0aW9uICpJKSBjb25zdCB7CisgICAgaWYgKCFDdXJEYmdMb2NhdGlvbi5pc1Vua25vd24oKSkKKyAgICAgIEktPnNldERlYnVnTG9jKEN1ckRiZ0xvY2F0aW9uKTsKKyAgfQorCisgIC8vLyBJbnNlcnRQb2ludCAtIEEgc2F2ZWQgaW5zZXJ0aW9uIHBvaW50LgorICBjbGFzcyBJbnNlcnRQb2ludCB7CisgICAgQmFzaWNCbG9jayAqQmxvY2s7CisgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgUG9pbnQ7CisKKyAgcHVibGljOgorICAgIC8vLyBDcmVhdGVzIGEgbmV3IGluc2VydGlvbiBwb2ludCB3aGljaCBkb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nLgorICAgIEluc2VydFBvaW50KCkgOiBCbG9jaygwKSB7fQorCisgICAgLy8vIENyZWF0ZXMgYSBuZXcgaW5zZXJ0aW9uIHBvaW50IGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KKyAgICBJbnNlcnRQb2ludChCYXNpY0Jsb2NrICpJbnNlcnRCbG9jaywgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UG9pbnQpCisgICAgICA6IEJsb2NrKEluc2VydEJsb2NrKSwgUG9pbnQoSW5zZXJ0UG9pbnQpIHt9CisKKyAgICAvLy8gaXNTZXQgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnNlcnQgcG9pbnQgaXMgc2V0LgorICAgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiAoQmxvY2sgIT0gMCk7IH0KKworICAgIGxsdm06OkJhc2ljQmxvY2sgKmdldEJsb2NrKCkgY29uc3QgeyByZXR1cm4gQmxvY2s7IH0KKyAgICBsbHZtOjpCYXNpY0Jsb2NrOjppdGVyYXRvciBnZXRQb2ludCgpIGNvbnN0IHsgcmV0dXJuIFBvaW50OyB9CisgIH07CisKKyAgLy8vIHNhdmVJUCAtIFJldHVybnMgdGhlIGN1cnJlbnQgaW5zZXJ0IHBvaW50LgorICBJbnNlcnRQb2ludCBzYXZlSVAoKSBjb25zdCB7CisgICAgcmV0dXJuIEluc2VydFBvaW50KEdldEluc2VydEJsb2NrKCksIEdldEluc2VydFBvaW50KCkpOworICB9CisKKyAgLy8vIHNhdmVBbmRDbGVhcklQIC0gUmV0dXJucyB0aGUgY3VycmVudCBpbnNlcnQgcG9pbnQsIGNsZWFyaW5nIGl0CisgIC8vLyBpbiB0aGUgcHJvY2Vzcy4KKyAgSW5zZXJ0UG9pbnQgc2F2ZUFuZENsZWFySVAoKSB7CisgICAgSW5zZXJ0UG9pbnQgSVAoR2V0SW5zZXJ0QmxvY2soKSwgR2V0SW5zZXJ0UG9pbnQoKSk7CisgICAgQ2xlYXJJbnNlcnRpb25Qb2ludCgpOworICAgIHJldHVybiBJUDsKKyAgfQorCisgIC8vLyByZXN0b3JlSVAgLSBTZXRzIHRoZSBjdXJyZW50IGluc2VydCBwb2ludCB0byBhIHByZXZpb3VzbHktc2F2ZWQKKyAgLy8vIGxvY2F0aW9uLgorICB2b2lkIHJlc3RvcmVJUChJbnNlcnRQb2ludCBJUCkgeworICAgIGlmIChJUC5pc1NldCgpKQorICAgICAgU2V0SW5zZXJ0UG9pbnQoSVAuZ2V0QmxvY2soKSwgSVAuZ2V0UG9pbnQoKSk7CisgICAgZWxzZQorICAgICAgQ2xlYXJJbnNlcnRpb25Qb2ludCgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1pc2NlbGxhbmVvdXMgY3JlYXRpb24gbWV0aG9kcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIAorICAvLy8gQ3JlYXRlR2xvYmFsU3RyaW5nIC0gTWFrZSBhIG5ldyBnbG9iYWwgdmFyaWFibGUgd2l0aCBhbiBpbml0aWFsaXplciB0aGF0CisgIC8vLyBoYXMgYXJyYXkgb2YgaTggdHlwZSBmaWxsZWQgaW4gd2l0aCB0aGUgbnVsIHRlcm1pbmF0ZWQgc3RyaW5nIHZhbHVlCisgIC8vLyBzcGVjaWZpZWQuICBJZiBOYW1lIGlzIHNwZWNpZmllZCwgaXQgaXMgdGhlIG5hbWUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZQorICAvLy8gY3JlYXRlZC4KKyAgVmFsdWUgKkNyZWF0ZUdsb2JhbFN0cmluZyhjb25zdCBjaGFyICpTdHIgPSAiIiwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8vIGdldEludDEgLSBHZXQgYSBjb25zdGFudCB2YWx1ZSByZXByZXNlbnRpbmcgZWl0aGVyIHRydWUgb3IgZmFsc2UuCisgIENvbnN0YW50SW50ICpnZXRJbnQxKGJvb2wgVikgeworICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KGdldEludDFUeSgpLCBWKTsKKyAgfQorCisgIC8vLyBnZXRUcnVlIC0gR2V0IHRoZSBjb25zdGFudCB2YWx1ZSBmb3IgaTEgdHJ1ZS4KKyAgQ29uc3RhbnRJbnQgKmdldFRydWUoKSB7CisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXRUcnVlKENvbnRleHQpOworICB9CisKKyAgLy8vIGdldEZhbHNlIC0gR2V0IHRoZSBjb25zdGFudCB2YWx1ZSBmb3IgaTEgZmFsc2UuCisgIENvbnN0YW50SW50ICpnZXRGYWxzZSgpIHsKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldEZhbHNlKENvbnRleHQpOworICB9CisKKyAgLy8vIGdldEludDggLSBHZXQgYSBjb25zdGFudCA4LWJpdCB2YWx1ZS4KKyAgQ29uc3RhbnRJbnQgKmdldEludDgodWludDhfdCBDKSB7CisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoZ2V0SW50OFR5KCksIEMpOworICB9CisKKyAgLy8vIGdldEludDE2IC0gR2V0IGEgY29uc3RhbnQgMTYtYml0IHZhbHVlLgorICBDb25zdGFudEludCAqZ2V0SW50MTYodWludDE2X3QgQykgeworICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KGdldEludDE2VHkoKSwgQyk7CisgIH0KKworICAvLy8gZ2V0SW50MzIgLSBHZXQgYSBjb25zdGFudCAzMi1iaXQgdmFsdWUuCisgIENvbnN0YW50SW50ICpnZXRJbnQzMih1aW50MzJfdCBDKSB7CisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoZ2V0SW50MzJUeSgpLCBDKTsKKyAgfQorICAKKyAgLy8vIGdldEludDY0IC0gR2V0IGEgY29uc3RhbnQgNjQtYml0IHZhbHVlLgorICBDb25zdGFudEludCAqZ2V0SW50NjQodWludDY0X3QgQykgeworICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KGdldEludDY0VHkoKSwgQyk7CisgIH0KKyAgCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUeXBlIGNyZWF0aW9uIG1ldGhvZHMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIAorICAvLy8gZ2V0SW50MVR5IC0gRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGJpdAorICBjb25zdCBJbnRlZ2VyVHlwZSAqZ2V0SW50MVR5KCkgeworICAgIHJldHVybiBUeXBlOjpnZXRJbnQxVHkoQ29udGV4dCk7CisgIH0KKyAgCisgIC8vLyBnZXRJbnQ4VHkgLSBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgYW4gOC1iaXQgaW50ZWdlci4KKyAgY29uc3QgSW50ZWdlclR5cGUgKmdldEludDhUeSgpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50OFR5KENvbnRleHQpOworICB9CisgIAorICAvLy8gZ2V0SW50MTZUeSAtIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhIDE2LWJpdCBpbnRlZ2VyLgorICBjb25zdCBJbnRlZ2VyVHlwZSAqZ2V0SW50MTZUeSgpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50MTZUeShDb250ZXh0KTsKKyAgfQorICAKKyAgLy8vIGdldEludDMyVHkgLSBGZXRjaCB0aGUgdHlwZSByZXNlcHJlc2VudGluZyBhIDMyLWJpdCBpbnRlZ2VyLgorICBjb25zdCBJbnRlZ2VyVHlwZSAqZ2V0SW50MzJUeSgpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KTsKKyAgfQorICAKKyAgLy8vIGdldEludDY0VHkgLSBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgYSA2NC1iaXQgaW50ZWdlci4KKyAgY29uc3QgSW50ZWdlclR5cGUgKmdldEludDY0VHkoKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldEludDY0VHkoQ29udGV4dCk7CisgIH0KKyAgCisgIC8vLyBnZXRGbG9hdFR5IC0gRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGEgMzItYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlLgorICBjb25zdCBUeXBlICpnZXRGbG9hdFR5KCkgeworICAgIHJldHVybiBUeXBlOjpnZXRGbG9hdFR5KENvbnRleHQpOworICB9CisgIAorICAvLy8gZ2V0RG91YmxlVHkgLSBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgYSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCisgIGNvbnN0IFR5cGUgKmdldERvdWJsZVR5KCkgeworICAgIHJldHVybiBUeXBlOjpnZXREb3VibGVUeShDb250ZXh0KTsKKyAgfQorICAKKyAgLy8vIGdldFZvaWRUeSAtIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyB2b2lkLgorICBjb25zdCBUeXBlICpnZXRWb2lkVHkoKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldFZvaWRUeShDb250ZXh0KTsKKyAgfQorICAKKyAgY29uc3QgUG9pbnRlclR5cGUgKmdldEludDhQdHJUeSgpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50OFB0clR5KENvbnRleHQpOworICB9CisgIAorICAvLy8gZ2V0Q3VycmVudEZ1bmN0aW9uUmV0dXJuVHlwZSAtIEdldCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24KKyAgLy8vIHRoYXQgd2UncmUgZW1pdHRpbmcgaW50by4KKyAgY29uc3QgVHlwZSAqZ2V0Q3VycmVudEZ1bmN0aW9uUmV0dXJuVHlwZSgpIGNvbnN0OworfTsKKyAgCisvLy8gSVJCdWlsZGVyIC0gVGhpcyBwcm92aWRlcyBhIHVuaWZvcm0gQVBJIGZvciBjcmVhdGluZyBpbnN0cnVjdGlvbnMgYW5kCisvLy8gaW5zZXJ0aW5nIHRoZW0gaW50byBhIGJhc2ljIGJsb2NrOiBlaXRoZXIgYXQgdGhlIGVuZCBvZiBhIEJhc2ljQmxvY2ssIG9yCisvLy8gYXQgYSBzcGVjaWZpYyBpdGVyYXRvciBsb2NhdGlvbiBpbiBhIGJsb2NrLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoZSBidWlsZGVyIGRvZXMgbm90IGV4cG9zZSB0aGUgZnVsbCBnZW5lcmFsaXR5IG9mIExMVk0KKy8vLyBpbnN0cnVjdGlvbnMuICBGb3IgYWNjZXNzIHRvIGV4dHJhIGluc3RydWN0aW9uIHByb3BlcnRpZXMsIHVzZSB0aGUgbXV0YXRvcnMKKy8vLyAoZS5nLiBzZXRWb2xhdGlsZSkgb24gdGhlIGluc3RydWN0aW9ucyBhZnRlciB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkLgorLy8vIFRoZSBmaXJzdCB0ZW1wbGF0ZSBhcmd1bWVudCBoYW5kbGVzIHdoZXRoZXIgb3Igbm90IHRvIHByZXNlcnZlIG5hbWVzIGluIHRoZQorLy8vIGZpbmFsIGluc3RydWN0aW9uIG91dHB1dC4gVGhpcyBkZWZhdWx0cyB0byBvbi4gIFRoZSBzZWNvbmQgdGVtcGxhdGUgYXJndW1lbnQKKy8vLyBzcGVjaWZpZXMgYSBjbGFzcyB0byB1c2UgZm9yIGNyZWF0aW5nIGNvbnN0YW50cy4gIFRoaXMgZGVmYXVsdHMgdG8gY3JlYXRpbmcKKy8vLyBtaW5pbWFsbHkgZm9sZGVkIGNvbnN0YW50cy4gIFRoZSBmb3VydGggdGVtcGxhdGUgYXJndW1lbnQgYWxsb3dzIGNsaWVudHMgdG8KKy8vLyBzcGVjaWZ5IGN1c3RvbSBpbnNlcnRpb24gaG9va3MgdGhhdCBhcmUgY2FsbGVkIG9uIGV2ZXJ5IG5ld2x5IGNyZWF0ZWQKKy8vLyBpbnNlcnRpb24uCit0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gQ29uc3RhbnRGb2xkZXIsCisgICAgICAgICB0eXBlbmFtZSBJbnNlcnRlciA9IElSQnVpbGRlckRlZmF1bHRJbnNlcnRlciA+CitjbGFzcyBJUkJ1aWxkZXIgOiBwdWJsaWMgSVJCdWlsZGVyQmFzZSwgcHVibGljIEluc2VydGVyIHsKKyAgVCBGb2xkZXI7CitwdWJsaWM6CisgIElSQnVpbGRlcihMTFZNQ29udGV4dCAmQywgY29uc3QgVCAmRiwgY29uc3QgSW5zZXJ0ZXIgJkkgPSBJbnNlcnRlcigpKQorICAgIDogSVJCdWlsZGVyQmFzZShDKSwgSW5zZXJ0ZXIoSSksIEZvbGRlcihGKSB7CisgIH0KKyAgCisgIGV4cGxpY2l0IElSQnVpbGRlcihMTFZNQ29udGV4dCAmQykgOiBJUkJ1aWxkZXJCYXNlKEMpLCBGb2xkZXIoQykgeworICB9CisgIAorICBleHBsaWNpdCBJUkJ1aWxkZXIoQmFzaWNCbG9jayAqVGhlQkIsIGNvbnN0IFQgJkYpCisgICAgOiBJUkJ1aWxkZXJCYXNlKFRoZUJCLT5nZXRDb250ZXh0KCkpLCBGb2xkZXIoRikgeworICAgIFNldEluc2VydFBvaW50KFRoZUJCKTsKKyAgfQorICAKKyAgZXhwbGljaXQgSVJCdWlsZGVyKEJhc2ljQmxvY2sgKlRoZUJCKQorICAgIDogSVJCdWlsZGVyQmFzZShUaGVCQi0+Z2V0Q29udGV4dCgpKSwgRm9sZGVyKENvbnRleHQpIHsKKyAgICBTZXRJbnNlcnRQb2ludChUaGVCQik7CisgIH0KKyAgCisgIElSQnVpbGRlcihCYXNpY0Jsb2NrICpUaGVCQiwgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVAsIGNvbnN0IFQmIEYpCisgICAgOiBJUkJ1aWxkZXJCYXNlKFRoZUJCLT5nZXRDb250ZXh0KCkpLCBGb2xkZXIoRikgeworICAgIFNldEluc2VydFBvaW50KFRoZUJCLCBJUCk7CisgIH0KKyAgCisgIElSQnVpbGRlcihCYXNpY0Jsb2NrICpUaGVCQiwgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVApCisgICAgOiBJUkJ1aWxkZXJCYXNlKFRoZUJCLT5nZXRDb250ZXh0KCkpLCBGb2xkZXIoQ29udGV4dCkgeworICAgIFNldEluc2VydFBvaW50KFRoZUJCLCBJUCk7CisgIH0KKworICAvLy8gZ2V0Rm9sZGVyIC0gR2V0IHRoZSBjb25zdGFudCBmb2xkZXIgYmVpbmcgdXNlZC4KKyAgY29uc3QgVCAmZ2V0Rm9sZGVyKCkgeyByZXR1cm4gRm9sZGVyOyB9CisgICAgCisgIC8vLyBJbnNlcnQgLSBJbnNlcnQgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnN0VHk+CisgIEluc3RUeSAqSW5zZXJ0KEluc3RUeSAqSSkgY29uc3QgeworICAgIHRoaXMtPkluc2VydEhlbHBlcihJLCBCQiwgSW5zZXJ0UHQpOworICAgIGlmICghZ2V0Q3VycmVudERlYnVnTG9jYXRpb24oKS5pc1Vua25vd24oKSkKKyAgICAgIHRoaXMtPlNldEluc3REZWJ1Z0xvY2F0aW9uKEkpOworICAgIHJldHVybiBJOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEluc3RydWN0aW9uIGNyZWF0aW9uIG1ldGhvZHM6IFRlcm1pbmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBDcmVhdGVSZXRWb2lkIC0gQ3JlYXRlIGEgJ3JldCB2b2lkJyBpbnN0cnVjdGlvbi4KKyAgUmV0dXJuSW5zdCAqQ3JlYXRlUmV0Vm9pZCgpIHsKKyAgICByZXR1cm4gSW5zZXJ0KFJldHVybkluc3Q6OkNyZWF0ZShDb250ZXh0KSk7CisgIH0KKworICAvLy8gQHZlcmJhdGltCisgIC8vLyBDcmVhdGVSZXQgLSBDcmVhdGUgYSAncmV0IDx2YWw+JyBpbnN0cnVjdGlvbi4KKyAgLy8vIEBlbmR2ZXJiYXRpbQorICBSZXR1cm5JbnN0ICpDcmVhdGVSZXQoVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gSW5zZXJ0KFJldHVybkluc3Q6OkNyZWF0ZShDb250ZXh0LCBWKSk7CisgIH0KKyAgCisgIC8vLyBDcmVhdGVBZ2dyZWdhdGVSZXQgLSBDcmVhdGUgYSBzZXF1ZW5jZSBvZiBOIGluc2VydHZhbHVlIGluc3RydWN0aW9ucywKKyAgLy8vIHdpdGggb25lIFZhbHVlIGZyb20gdGhlIHJldFZhbHMgYXJyYXkgZWFjaCwgdGhhdCBidWlsZCBhIGFnZ3JlZ2F0ZQorICAvLy8gcmV0dXJuIHZhbHVlIG9uZSB2YWx1ZSBhdCBhIHRpbWUsIGFuZCBhIHJldCBpbnN0cnVjdGlvbiB0byByZXR1cm4KKyAgLy8vIHRoZSByZXN1bHRpbmcgYWdncmVnYXRlIHZhbHVlLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yCisgIC8vLyBjb2RlIHRoYXQgdXNlcyBhZ2dyZWdhdGUgcmV0dXJuIHZhbHVlcyBhcyBhIHZlaGljbGUgZm9yIGhhdmluZworICAvLy8gbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KKyAgLy8vCisgIFJldHVybkluc3QgKkNyZWF0ZUFnZ3JlZ2F0ZVJldChWYWx1ZSAqY29uc3QgKnJldFZhbHMsIHVuc2lnbmVkIE4pIHsKKyAgICBWYWx1ZSAqViA9IFVuZGVmVmFsdWU6OmdldChnZXRDdXJyZW50RnVuY3Rpb25SZXR1cm5UeXBlKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTjsgKytpKQorICAgICAgViA9IENyZWF0ZUluc2VydFZhbHVlKFYsIHJldFZhbHNbaV0sIGksICJtcnYiKTsKKyAgICByZXR1cm4gSW5zZXJ0KFJldHVybkluc3Q6OkNyZWF0ZShDb250ZXh0LCBWKSk7CisgIH0KKworICAvLy8gQ3JlYXRlQnIgLSBDcmVhdGUgYW4gdW5jb25kaXRpb25hbCAnYnIgbGFiZWwgWCcgaW5zdHJ1Y3Rpb24uCisgIEJyYW5jaEluc3QgKkNyZWF0ZUJyKEJhc2ljQmxvY2sgKkRlc3QpIHsKKyAgICByZXR1cm4gSW5zZXJ0KEJyYW5jaEluc3Q6OkNyZWF0ZShEZXN0KSk7CisgIH0KKworICAvLy8gQ3JlYXRlQ29uZEJyIC0gQ3JlYXRlIGEgY29uZGl0aW9uYWwgJ2JyIENvbmQsIFRydWVEZXN0LCBGYWxzZURlc3QnCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgQnJhbmNoSW5zdCAqQ3JlYXRlQ29uZEJyKFZhbHVlICpDb25kLCBCYXNpY0Jsb2NrICpUcnVlLCBCYXNpY0Jsb2NrICpGYWxzZSkgeworICAgIHJldHVybiBJbnNlcnQoQnJhbmNoSW5zdDo6Q3JlYXRlKFRydWUsIEZhbHNlLCBDb25kKSk7CisgIH0KKworICAvLy8gQ3JlYXRlU3dpdGNoIC0gQ3JlYXRlIGEgc3dpdGNoIGluc3RydWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSwKKyAgLy8vIGRlZmF1bHQgZGVzdCwgYW5kIHdpdGggYSBoaW50IGZvciB0aGUgbnVtYmVyIG9mIGNhc2VzIHRoYXQgd2lsbCBiZSBhZGRlZAorICAvLy8gKGZvciBlZmZpY2llbnQgYWxsb2NhdGlvbikuCisgIFN3aXRjaEluc3QgKkNyZWF0ZVN3aXRjaChWYWx1ZSAqViwgQmFzaWNCbG9jayAqRGVzdCwgdW5zaWduZWQgTnVtQ2FzZXMgPSAxMCkgeworICAgIHJldHVybiBJbnNlcnQoU3dpdGNoSW5zdDo6Q3JlYXRlKFYsIERlc3QsIE51bUNhc2VzKSk7CisgIH0KKworICAvLy8gQ3JlYXRlSW5kaXJlY3RCciAtIENyZWF0ZSBhbiBpbmRpcmVjdCBicmFuY2ggaW5zdHJ1Y3Rpb24gd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCBhZGRyZXNzIG9wZXJhbmQsIHdpdGggYW4gb3B0aW9uYWwgaGludCBmb3IgdGhlIG51bWJlciBvZgorICAvLy8gZGVzdGluYXRpb25zIHRoYXQgd2lsbCBiZSBhZGRlZCAoZm9yIGVmZmljaWVudCBhbGxvY2F0aW9uKS4KKyAgSW5kaXJlY3RCckluc3QgKkNyZWF0ZUluZGlyZWN0QnIoVmFsdWUgKkFkZHIsIHVuc2lnbmVkIE51bURlc3RzID0gMTApIHsKKyAgICByZXR1cm4gSW5zZXJ0KEluZGlyZWN0QnJJbnN0OjpDcmVhdGUoQWRkciwgTnVtRGVzdHMpKTsKKyAgfQorCisgIFVucmVhY2hhYmxlSW5zdCAqQ3JlYXRlVW5yZWFjaGFibGUoKSB7CisgICAgcmV0dXJuIEluc2VydChuZXcgVW5yZWFjaGFibGVJbnN0KENvbnRleHQpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnN0cnVjdGlvbiBjcmVhdGlvbiBtZXRob2RzOiBCaW5hcnkgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIFZhbHVlICpDcmVhdGVBZGQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVBZGQoTEMsIFJDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlTlNXQWRkKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoQ29uc3RhbnQgKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlTlNXQWRkKExDLCBSQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlNXQWRkKExIUywgUkhTKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZU5VV0FkZChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZU5VV0FkZChMQywgUkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5VV0FkZChMSFMsIFJIUykpOworICB9CisgIFZhbHVlICpDcmVhdGVGQWRkKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoQ29uc3RhbnQgKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlRkFkZChMQywgUkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZBZGQoTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlU3ViKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoQ29uc3RhbnQgKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlU3ViKExDLCBSQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKExIUywgUkhTKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZU5TV1N1YihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZU5TV1N1YihMQywgUkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5TV1N1YihMSFMsIFJIUykpOworICB9CisgIFZhbHVlICpDcmVhdGVOVVdTdWIoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVOVVdTdWIoTEMsIFJDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOVVdTdWIoTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlRlN1YihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZUZTdWIoTEMsIFJDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGU3ViKExIUywgUkhTKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZU11bChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZU11bChMQywgUkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU11bChMSFMsIFJIUykpOworICB9CisgIFZhbHVlICpDcmVhdGVOU1dNdWwoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVOU1dNdWwoTEMsIFJDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOU1dNdWwoTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlTlVXTXVsKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoQ29uc3RhbnQgKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlTlVXTXVsKExDLCBSQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlVXTXVsKExIUywgUkhTKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZNdWwoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVGTXVsKExDLCBSQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRk11bChMSFMsIFJIUykpOworICB9CisgIFZhbHVlICpDcmVhdGVVRGl2KFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoQ29uc3RhbnQgKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlVURpdihMQywgUkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVVEaXYoTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlU0RpdihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZVNEaXYoTEMsIFJDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTRGl2KExIUywgUkhTKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUV4YWN0U0RpdihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZUV4YWN0U0RpdihMQywgUkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUV4YWN0U0RpdihMSFMsIFJIUykpOworICB9CisgIFZhbHVlICpDcmVhdGVGRGl2KFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoQ29uc3RhbnQgKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlRkRpdihMQywgUkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZEaXYoTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlVVJlbShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZVVSZW0oTEMsIFJDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVVUmVtKExIUywgUkhTKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZVNSZW0oVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVTUmVtKExDLCBSQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU1JlbShMSFMsIFJIUykpOworICB9CisgIFZhbHVlICpDcmVhdGVGUmVtKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoQ29uc3RhbnQgKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlRlJlbShMQywgUkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZSZW0oTEhTLCBSSFMpKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTaGwoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVTaGwoTEMsIFJDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTaGwoTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlU2hsKFZhbHVlICpMSFMsIGNvbnN0IEFQSW50ICZSSFMpIHsKKyAgICBDb25zdGFudCAqUkhTQyA9IENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyk7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVTaGwoTEMsIFJIU0MpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNobChMSFMsIFJIU0MpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlU2hsKFZhbHVlICpMSFMsIHVpbnQ2NF90IFJIUykgeworICAgIENvbnN0YW50ICpSSFNDID0gQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKTsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZVNobChMQywgUkhTQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKExIUywgUkhTQykpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUxTaHIoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVMU2hyKExDLCBSQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTFNocihMSFMsIFJIUykpOworICB9CisgIFZhbHVlICpDcmVhdGVMU2hyKFZhbHVlICpMSFMsIGNvbnN0IEFQSW50ICZSSFMpIHsKKyAgICBDb25zdGFudCAqUkhTQyA9IENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyk7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVMU2hyKExDLCBSSFNDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVMU2hyKExIUywgUkhTQykpOworICB9CisgIFZhbHVlICpDcmVhdGVMU2hyKFZhbHVlICpMSFMsIHVpbnQ2NF90IFJIUykgeworICAgIENvbnN0YW50ICpSSFNDID0gQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKTsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZUxTaHIoTEMsIFJIU0MpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUxTaHIoTEhTLCBSSFNDKSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQVNocihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZUFTaHIoTEMsIFJDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBU2hyKExIUywgUkhTKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUFTaHIoVmFsdWUgKkxIUywgY29uc3QgQVBJbnQgJlJIUykgeworICAgIENvbnN0YW50ICpSSFNDID0gQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKTsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZUFTaHIoTEMsIFJIU0MpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFTaHIoTEhTLCBSSFNDKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUFTaHIoVmFsdWUgKkxIUywgdWludDY0X3QgUkhTKSB7CisgICAgQ29uc3RhbnQgKlJIU0MgPSBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpOworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlQVNocihMQywgUkhTQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQVNocihMSFMsIFJIU0MpKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVBbmQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkgeworICAgICAgaWYgKGlzYTxDb25zdGFudEludD4oUkMpICYmIGNhc3Q8Q29uc3RhbnRJbnQ+KFJDKS0+aXNBbGxPbmVzVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIExIUzsgIC8vIExIUyAmIC0xIC0+IExIUworICAgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZUFuZChMQywgUkMpOworICAgIH0KKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlQW5kKFZhbHVlICpMSFMsIGNvbnN0IEFQSW50ICZSSFMpIHsKKyAgICBDb25zdGFudCAqUkhTQyA9IENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyk7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVBbmQoTEMsIFJIU0MpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChMSFMsIFJIU0MpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlQW5kKFZhbHVlICpMSFMsIHVpbnQ2NF90IFJIUykgeworICAgIENvbnN0YW50ICpSSFNDID0gQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKTsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZUFuZChMQywgUkhTQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKExIUywgUkhTQykpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU9yKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICBpZiAoQ29uc3RhbnQgKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpIHsKKyAgICAgIGlmIChSQy0+aXNOdWxsVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIExIUzsgIC8vIExIUyB8IDAgLT4gTEhTCisgICAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlT3IoTEMsIFJDKTsKKyAgICB9CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlT3IoTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlT3IoVmFsdWUgKkxIUywgY29uc3QgQVBJbnQgJlJIUykgeworICAgIENvbnN0YW50ICpSSFNDID0gQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKTsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZU9yKExDLCBSSFNDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihMSFMsIFJIU0MpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlT3IoVmFsdWUgKkxIUywgdWludDY0X3QgUkhTKSB7CisgICAgQ29uc3RhbnQgKlJIU0MgPSBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpOworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlT3IoTEMsIFJIU0MpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKExIUywgUkhTQykpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVhvcihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZVhvcihMQywgUkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcihMSFMsIFJIUykpOworICB9CisgIFZhbHVlICpDcmVhdGVYb3IoVmFsdWUgKkxIUywgY29uc3QgQVBJbnQgJlJIUykgeworICAgIENvbnN0YW50ICpSSFNDID0gQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKTsKKyAgICBpZiAoQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZVhvcihMQywgUkhTQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKExIUywgUkhTQykpOworICB9CisgIFZhbHVlICpDcmVhdGVYb3IoVmFsdWUgKkxIUywgdWludDY0X3QgUkhTKSB7CisgICAgQ29uc3RhbnQgKlJIU0MgPSBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpOworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlWG9yKExDLCBSSFNDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVYb3IoTEhTLCBSSFNDKSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQmluT3AoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBPcGMsCisgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgaWYgKENvbnN0YW50ICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZUJpbk9wKE9wYywgTEMsIFJDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoT3BjLCBMSFMsIFJIUykpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU5lZyhWYWx1ZSAqVikgeworICAgIGlmIChDb25zdGFudCAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZU5lZyhWQyk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTmVnKFYpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlTlNXTmVnKFZhbHVlICpWKSB7CisgICAgaWYgKENvbnN0YW50ICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlTlNXTmVnKFZDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOU1dOZWcoVikpOworICB9CisgIFZhbHVlICpDcmVhdGVOVVdOZWcoVmFsdWUgKlYpIHsKKyAgICBpZiAoQ29uc3RhbnQgKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVOVVdOZWcoVkMpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5VV05lZyhWKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZOZWcoVmFsdWUgKlYpIHsKKyAgICBpZiAoQ29uc3RhbnQgKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVGTmVnKFZDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGTmVnKFYpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlTm90KFZhbHVlICpWKSB7CisgICAgaWYgKENvbnN0YW50ICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlTm90KFZDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOb3QoVikpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEluc3RydWN0aW9uIGNyZWF0aW9uIG1ldGhvZHM6IE1lbW9yeSBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQWxsb2NhSW5zdCAqQ3JlYXRlQWxsb2NhKGNvbnN0IFR5cGUgKlR5LCBWYWx1ZSAqQXJyYXlTaXplID0gMCkgeworICAgIHJldHVybiBJbnNlcnQobmV3IEFsbG9jYUluc3QoVHksIEFycmF5U2l6ZSkpOworICB9CisgIC8vIFByb3ZpZGVkIHRvIHJlc29sdmUgJ0NyZWF0ZUxvYWQoUHRyLCAiLi4uIiknIGNvcnJlY3RseSwgaW5zdGVhZCBvZgorICAvLyBjb252ZXJ0aW5nIHRoZSBzdHJpbmcgdG8gJ2Jvb2wnIGZvciB0aGUgaXNWb2xhdGlsZSBwYXJhbWV0ZXIuCisgIExvYWRJbnN0ICpDcmVhdGVMb2FkKFZhbHVlICpQdHIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBMb2FkSW5zdChQdHIpKTsKKyAgfQorICBMb2FkSW5zdCAqQ3JlYXRlTG9hZChWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUpIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBMb2FkSW5zdChQdHIsIDAsIGlzVm9sYXRpbGUpKTsKKyAgfQorICBTdG9yZUluc3QgKkNyZWF0ZVN0b3JlKFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlKSB7CisgICAgcmV0dXJuIEluc2VydChuZXcgU3RvcmVJbnN0KFZhbCwgUHRyLCBpc1ZvbGF0aWxlKSk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgVmFsdWUgKkNyZWF0ZUdFUChWYWx1ZSAqUHRyLCBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLCBJbnB1dEl0ZXJhdG9yIElkeEVuZCkgeworICAgIGlmIChDb25zdGFudCAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkgeworICAgICAgLy8gRXZlcnkgaW5kZXggbXVzdCBiZSBjb25zdGFudC4KKyAgICAgIElucHV0SXRlcmF0b3IgaTsKKyAgICAgIGZvciAoaSA9IElkeEJlZ2luOyBpIDwgSWR4RW5kOyArK2kpCisgICAgICAgIGlmICghaXNhPENvbnN0YW50PigqaSkpCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAoaSA9PSBJZHhFbmQpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlR2V0RWxlbWVudFB0cihQQywgJklkeEJlZ2luWzBdLCBJZHhFbmQgLSBJZHhCZWdpbik7CisgICAgfQorICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShQdHIsIElkeEJlZ2luLCBJZHhFbmQpKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICBWYWx1ZSAqQ3JlYXRlSW5Cb3VuZHNHRVAoVmFsdWUgKlB0ciwgSW5wdXRJdGVyYXRvciBJZHhCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4RW5kKSB7CisgICAgaWYgKENvbnN0YW50ICpQQyA9IGR5bl9jYXN0PENvbnN0YW50PihQdHIpKSB7CisgICAgICAvLyBFdmVyeSBpbmRleCBtdXN0IGJlIGNvbnN0YW50LgorICAgICAgSW5wdXRJdGVyYXRvciBpOworICAgICAgZm9yIChpID0gSWR4QmVnaW47IGkgPCBJZHhFbmQ7ICsraSkKKyAgICAgICAgaWYgKCFpc2E8Q29uc3RhbnQ+KCppKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChpID09IElkeEVuZCkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoUEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJZHhCZWdpblswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4RW5kIC0gSWR4QmVnaW4pOworICAgIH0KKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhQdHIsIElkeEJlZ2luLCBJZHhFbmQpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlR0VQKFZhbHVlICpQdHIsIFZhbHVlICpJZHgpIHsKKyAgICBpZiAoQ29uc3RhbnQgKlBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0cikpCisgICAgICBpZiAoQ29uc3RhbnQgKklDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KElkeCkpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlR2V0RWxlbWVudFB0cihQQywgJklDLCAxKTsKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoUHRyLCBJZHgpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlSW5Cb3VuZHNHRVAoVmFsdWUgKlB0ciwgVmFsdWUgKklkeCkgeworICAgIGlmIChDb25zdGFudCAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIGlmIChDb25zdGFudCAqSUMgPSBkeW5fY2FzdDxDb25zdGFudD4oSWR4KSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoUEMsICZJQywgMSk7CisgICAgcmV0dXJuIEluc2VydChHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMoUHRyLCBJZHgpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlQ29uc3RHRVAxXzMyKFZhbHVlICpQdHIsIHVuc2lnbmVkIElkeDApIHsKKyAgICBWYWx1ZSAqSWR4ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBJZHgwKTsKKworICAgIGlmIChDb25zdGFudCAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlR2V0RWxlbWVudFB0cihQQywgJklkeCwgMSk7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoUHRyLCAmSWR4LCAmSWR4KzEpKTsgICAgCisgIH0KKyAgVmFsdWUgKkNyZWF0ZUNvbnN0SW5Cb3VuZHNHRVAxXzMyKFZhbHVlICpQdHIsIHVuc2lnbmVkIElkeDApIHsKKyAgICBWYWx1ZSAqSWR4ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBJZHgwKTsKKworICAgIGlmIChDb25zdGFudCAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFBDLCAmSWR4LCAxKTsKKworICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZUluQm91bmRzKFB0ciwgJklkeCwgJklkeCsxKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUNvbnN0R0VQMl8zMihWYWx1ZSAqUHRyLCB1bnNpZ25lZCBJZHgwLCB1bnNpZ25lZCBJZHgxKSB7CisgICAgVmFsdWUgKklkeHNbXSA9IHsKKyAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgSWR4MCksCisgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIElkeDEpCisgICAgfTsKKworICAgIGlmIChDb25zdGFudCAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlR2V0RWxlbWVudFB0cihQQywgSWR4cywgMik7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoUHRyLCBJZHhzLCBJZHhzKzIpKTsgICAgCisgIH0KKyAgVmFsdWUgKkNyZWF0ZUNvbnN0SW5Cb3VuZHNHRVAyXzMyKFZhbHVlICpQdHIsIHVuc2lnbmVkIElkeDAsIHVuc2lnbmVkIElkeDEpIHsKKyAgICBWYWx1ZSAqSWR4c1tdID0geworICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBJZHgwKSwKKyAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgSWR4MSkKKyAgICB9OworCisgICAgaWYgKENvbnN0YW50ICpQQyA9IGR5bl9jYXN0PENvbnN0YW50PihQdHIpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoUEMsIElkeHMsIDIpOworCisgICAgcmV0dXJuIEluc2VydChHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMoUHRyLCBJZHhzLCBJZHhzKzIpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlQ29uc3RHRVAxXzY0KFZhbHVlICpQdHIsIHVpbnQ2NF90IElkeDApIHsKKyAgICBWYWx1ZSAqSWR4ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCBJZHgwKTsKKworICAgIGlmIChDb25zdGFudCAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlR2V0RWxlbWVudFB0cihQQywgJklkeCwgMSk7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoUHRyLCAmSWR4LCAmSWR4KzEpKTsgICAgCisgIH0KKyAgVmFsdWUgKkNyZWF0ZUNvbnN0SW5Cb3VuZHNHRVAxXzY0KFZhbHVlICpQdHIsIHVpbnQ2NF90IElkeDApIHsKKyAgICBWYWx1ZSAqSWR4ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCBJZHgwKTsKKworICAgIGlmIChDb25zdGFudCAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFBDLCAmSWR4LCAxKTsKKworICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZUluQm91bmRzKFB0ciwgJklkeCwgJklkeCsxKSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUNvbnN0R0VQMl82NChWYWx1ZSAqUHRyLCB1aW50NjRfdCBJZHgwLCB1aW50NjRfdCBJZHgxKSB7CisgICAgVmFsdWUgKklkeHNbXSA9IHsKKyAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgSWR4MCksCisgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoQ29udGV4dCksIElkeDEpCisgICAgfTsKKworICAgIGlmIChDb25zdGFudCAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlR2V0RWxlbWVudFB0cihQQywgSWR4cywgMik7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoUHRyLCBJZHhzLCBJZHhzKzIpKTsgICAgCisgIH0KKyAgVmFsdWUgKkNyZWF0ZUNvbnN0SW5Cb3VuZHNHRVAyXzY0KFZhbHVlICpQdHIsIHVpbnQ2NF90IElkeDAsIHVpbnQ2NF90IElkeDEpIHsKKyAgICBWYWx1ZSAqSWR4c1tdID0geworICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCBJZHgwKSwKKyAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgSWR4MSkKKyAgICB9OworCisgICAgaWYgKENvbnN0YW50ICpQQyA9IGR5bl9jYXN0PENvbnN0YW50PihQdHIpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoUEMsIElkeHMsIDIpOworCisgICAgcmV0dXJuIEluc2VydChHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMoUHRyLCBJZHhzLCBJZHhzKzIpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlU3RydWN0R0VQKFZhbHVlICpQdHIsIHVuc2lnbmVkIElkeCkgeworICAgIHJldHVybiBDcmVhdGVDb25zdEluQm91bmRzR0VQMl8zMihQdHIsIDAsIElkeCk7CisgIH0KKyAgCisgIC8vLyBDcmVhdGVHbG9iYWxTdHJpbmdQdHIgLSBTYW1lIGFzIENyZWF0ZUdsb2JhbFN0cmluZywgYnV0IHJldHVybiBhIHBvaW50ZXIKKyAgLy8vIHdpdGggImk4KiIgdHlwZSBpbnN0ZWFkIG9mIGEgcG9pbnRlciB0byBhcnJheSBvZiBpOC4KKyAgVmFsdWUgKkNyZWF0ZUdsb2JhbFN0cmluZ1B0cihjb25zdCBjaGFyICpTdHIgPSAiIikgeworICAgIFZhbHVlICpndiA9IENyZWF0ZUdsb2JhbFN0cmluZyhTdHIpOworICAgIFZhbHVlICp6ZXJvID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAwKTsKKyAgICBWYWx1ZSAqQXJnc1tdID0geyB6ZXJvLCB6ZXJvIH07CisgICAgcmV0dXJuIENyZWF0ZUluQm91bmRzR0VQKGd2LCBBcmdzLCBBcmdzKzIpOworICB9CisgIAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW5zdHJ1Y3Rpb24gY3JlYXRpb24gbWV0aG9kczogQ2FzdC9Db252ZXJzaW9uIE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBWYWx1ZSAqQ3JlYXRlVHJ1bmMoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKkRlc3RUeSkgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpUcnVuYywgViwgRGVzdFR5KTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlWkV4dChWYWx1ZSAqViwgY29uc3QgVHlwZSAqRGVzdFR5KSB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OlpFeHQsIFYsIERlc3RUeSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZVNFeHQoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKkRlc3RUeSkgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpTRXh0LCBWLCBEZXN0VHkpOworICB9CisgIFZhbHVlICpDcmVhdGVGUFRvVUkoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKkRlc3RUeSl7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkZQVG9VSSwgViwgRGVzdFR5KTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlRlBUb1NJKFZhbHVlICpWLCBjb25zdCBUeXBlICpEZXN0VHkpeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpGUFRvU0ksIFYsIERlc3RUeSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZVVJVG9GUChWYWx1ZSAqViwgY29uc3QgVHlwZSAqRGVzdFR5KXsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6VUlUb0ZQLCBWLCBEZXN0VHkpOworICB9CisgIFZhbHVlICpDcmVhdGVTSVRvRlAoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKkRlc3RUeSl7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OlNJVG9GUCwgViwgRGVzdFR5KTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlRlBUcnVuYyhWYWx1ZSAqViwgY29uc3QgVHlwZSAqRGVzdFR5KSB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkZQVHJ1bmMsIFYsIERlc3RUeSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZQRXh0KFZhbHVlICpWLCBjb25zdCBUeXBlICpEZXN0VHkpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6RlBFeHQsIFYsIERlc3RUeSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZVB0clRvSW50KFZhbHVlICpWLCBjb25zdCBUeXBlICpEZXN0VHkpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6UHRyVG9JbnQsIFYsIERlc3RUeSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUludFRvUHRyKFZhbHVlICpWLCBjb25zdCBUeXBlICpEZXN0VHkpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6SW50VG9QdHIsIFYsIERlc3RUeSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUJpdENhc3QoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKkRlc3RUeSkgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpCaXRDYXN0LCBWLCBEZXN0VHkpOworICB9CisgIFZhbHVlICpDcmVhdGVaRXh0T3JCaXRDYXN0KFZhbHVlICpWLCBjb25zdCBUeXBlICpEZXN0VHkpIHsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBWOworICAgIGlmIChDb25zdGFudCAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZVpFeHRPckJpdENhc3QoVkMsIERlc3RUeSk7CisgICAgcmV0dXJuIEluc2VydChDYXN0SW5zdDo6Q3JlYXRlWkV4dE9yQml0Q2FzdChWLCBEZXN0VHkpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlU0V4dE9yQml0Q2FzdChWYWx1ZSAqViwgY29uc3QgVHlwZSAqRGVzdFR5KSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoQ29uc3RhbnQgKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVTRXh0T3JCaXRDYXN0KFZDLCBEZXN0VHkpOworICAgIHJldHVybiBJbnNlcnQoQ2FzdEluc3Q6OkNyZWF0ZVNFeHRPckJpdENhc3QoViwgRGVzdFR5KSk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZVRydW5jT3JCaXRDYXN0KFZhbHVlICpWLCBjb25zdCBUeXBlICpEZXN0VHkpIHsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBWOworICAgIGlmIChDb25zdGFudCAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZVRydW5jT3JCaXRDYXN0KFZDLCBEZXN0VHkpOworICAgIHJldHVybiBJbnNlcnQoQ2FzdEluc3Q6OkNyZWF0ZVRydW5jT3JCaXRDYXN0KFYsIERlc3RUeSkpOworICB9CisgIFZhbHVlICpDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpDYXN0T3BzIE9wLCBWYWx1ZSAqViwgY29uc3QgVHlwZSAqRGVzdFR5KSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoQ29uc3RhbnQgKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVDYXN0KE9wLCBWQywgRGVzdFR5KTsKKyAgICByZXR1cm4gSW5zZXJ0KENhc3RJbnN0OjpDcmVhdGUoT3AsIFYsIERlc3RUeSkpOworICB9CisgIFZhbHVlICpDcmVhdGVQb2ludGVyQ2FzdChWYWx1ZSAqViwgY29uc3QgVHlwZSAqRGVzdFR5KSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoQ29uc3RhbnQgKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVQb2ludGVyQ2FzdChWQywgRGVzdFR5KTsKKyAgICByZXR1cm4gSW5zZXJ0KENhc3RJbnN0OjpDcmVhdGVQb2ludGVyQ2FzdChWLCBEZXN0VHkpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlSW50Q2FzdChWYWx1ZSAqViwgY29uc3QgVHlwZSAqRGVzdFR5LCBib29sIGlzU2lnbmVkKSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoQ29uc3RhbnQgKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVJbnRDYXN0KFZDLCBEZXN0VHksIGlzU2lnbmVkKTsKKyAgICByZXR1cm4gSW5zZXJ0KENhc3RJbnN0OjpDcmVhdGVJbnRlZ2VyQ2FzdChWLCBEZXN0VHksIGlzU2lnbmVkKSk7CisgIH0KK3ByaXZhdGU6CisgIC8vIFByb3ZpZGVkIHRvIHJlc29sdmUgJ0NyZWF0ZUludENhc3QoUHRyLCBQdHIsICIuLi4iKScsIGdpdmluZyBhIGNvbXBpbGUgdGltZQorICAvLyBlcnJvciwgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZSBzdHJpbmcgdG8gYm9vbCBmb3IgdGhlIGlzU2lnbmVkIHBhcmFtZXRlci4KKyAgVmFsdWUgKkNyZWF0ZUludENhc3QoVmFsdWUgKiwgY29uc3QgVHlwZSAqLCBjb25zdCBjaGFyICopOyAvLyBETyBOT1QgSU1QTEVNRU5UCitwdWJsaWM6CisgIFZhbHVlICpDcmVhdGVGUENhc3QoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKkRlc3RUeSkgeworICAgIGlmIChWLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIFY7CisgICAgaWYgKENvbnN0YW50ICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlRlBDYXN0KFZDLCBEZXN0VHkpOworICAgIHJldHVybiBJbnNlcnQoQ2FzdEluc3Q6OkNyZWF0ZUZQQ2FzdChWLCBEZXN0VHkpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnN0cnVjdGlvbiBjcmVhdGlvbiBtZXRob2RzOiBDb21wYXJlIEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBWYWx1ZSAqQ3JlYXRlSUNtcEVRKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9FUSwgTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVJQ21wTkUoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiBDcmVhdGVJQ21wKElDbXBJbnN0OjpJQ01QX05FLCBMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUlDbXBVR1QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiBDcmVhdGVJQ21wKElDbXBJbnN0OjpJQ01QX1VHVCwgTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVJQ21wVUdFKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9VR0UsIExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlSUNtcFVMVChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfVUxULCBMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUlDbXBVTEUoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiBDcmVhdGVJQ21wKElDbXBJbnN0OjpJQ01QX1VMRSwgTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVJQ21wU0dUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9TR1QsIExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlSUNtcFNHRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfU0dFLCBMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUlDbXBTTFQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiBDcmVhdGVJQ21wKElDbXBJbnN0OjpJQ01QX1NMVCwgTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVJQ21wU0xFKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9TTEUsIExIUywgUkhTKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wT0VRKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9PRVEsIExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlRkNtcE9HVChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfT0dULCBMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZDbXBPR0UoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX09HRSwgTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVGQ21wT0xUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9PTFQsIExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlRkNtcE9MRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfT0xFLCBMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZDbXBPTkUoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX09ORSwgTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVGQ21wT1JEKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9PUkQsIExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlRkNtcFVOTyhWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfVU5PLCBMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZDbXBVRVEoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX1VFUSwgTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVGQ21wVUdUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9VR1QsIExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlRkNtcFVHRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfVUdFLCBMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZDbXBVTFQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX1VMVCwgTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVGQ21wVUxFKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9VTEUsIExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlRkNtcFVORShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfVU5FLCBMSFMsIFJIUyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSUNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUCwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVJQ21wKFAsIExDLCBSQyk7CisgICAgcmV0dXJuIEluc2VydChuZXcgSUNtcEluc3QoUCwgTEhTLCBSSFMpKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlRkNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUCwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudCAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVGQ21wKFAsIExDLCBSQyk7CisgICAgcmV0dXJuIEluc2VydChuZXcgRkNtcEluc3QoUCwgTEhTLCBSSFMpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnN0cnVjdGlvbiBjcmVhdGlvbiBtZXRob2RzOiBPdGhlciBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgUEhJTm9kZSAqQ3JlYXRlUEhJKGNvbnN0IFR5cGUgKlR5KSB7CisgICAgcmV0dXJuIEluc2VydChQSElOb2RlOjpDcmVhdGUoVHkpKTsKKyAgfQorCisgIENhbGxJbnN0ICpDcmVhdGVDYWxsKFZhbHVlICpDYWxsZWUpIHsKKyAgICByZXR1cm4gSW5zZXJ0KENhbGxJbnN0OjpDcmVhdGUoQ2FsbGVlKSk7CisgIH0KKyAgQ2FsbEluc3QgKkNyZWF0ZUNhbGwoVmFsdWUgKkNhbGxlZSwgVmFsdWUgKkFyZykgeworICAgIHJldHVybiBJbnNlcnQoQ2FsbEluc3Q6OkNyZWF0ZShDYWxsZWUsIEFyZykpOworICB9CisgIENhbGxJbnN0ICpDcmVhdGVDYWxsMihWYWx1ZSAqQ2FsbGVlLCBWYWx1ZSAqQXJnMSwgVmFsdWUgKkFyZzIpIHsKKyAgICBWYWx1ZSAqQXJnc1tdID0geyBBcmcxLCBBcmcyIH07CisgICAgcmV0dXJuIEluc2VydChDYWxsSW5zdDo6Q3JlYXRlKENhbGxlZSwgQXJncywgQXJncysyKSk7CisgIH0KKyAgQ2FsbEluc3QgKkNyZWF0ZUNhbGwzKFZhbHVlICpDYWxsZWUsIFZhbHVlICpBcmcxLCBWYWx1ZSAqQXJnMiwgVmFsdWUgKkFyZzMpIHsKKyAgICBWYWx1ZSAqQXJnc1tdID0geyBBcmcxLCBBcmcyLCBBcmczIH07CisgICAgcmV0dXJuIEluc2VydChDYWxsSW5zdDo6Q3JlYXRlKENhbGxlZSwgQXJncywgQXJncyszKSk7CisgIH0KKyAgQ2FsbEluc3QgKkNyZWF0ZUNhbGw0KFZhbHVlICpDYWxsZWUsIFZhbHVlICpBcmcxLCBWYWx1ZSAqQXJnMiwgVmFsdWUgKkFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQXJnNCkgeworICAgIFZhbHVlICpBcmdzW10gPSB7IEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQgfTsKKyAgICByZXR1cm4gSW5zZXJ0KENhbGxJbnN0OjpDcmVhdGUoQ2FsbGVlLCBBcmdzLCBBcmdzKzQpKTsKKyAgfQorICBDYWxsSW5zdCAqQ3JlYXRlQ2FsbDUoVmFsdWUgKkNhbGxlZSwgVmFsdWUgKkFyZzEsIFZhbHVlICpBcmcyLCBWYWx1ZSAqQXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBcmc0LCBWYWx1ZSAqQXJnNSkgeworICAgIFZhbHVlICpBcmdzW10gPSB7IEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQsIEFyZzUgfTsKKyAgICByZXR1cm4gSW5zZXJ0KENhbGxJbnN0OjpDcmVhdGUoQ2FsbGVlLCBBcmdzLCBBcmdzKzUpKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgIENhbGxJbnN0ICpDcmVhdGVDYWxsKFZhbHVlICpDYWxsZWUsIElucHV0SXRlcmF0b3IgQXJnQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgQXJnRW5kKSB7CisgICAgcmV0dXJuIEluc2VydChDYWxsSW5zdDo6Q3JlYXRlKENhbGxlZSwgQXJnQmVnaW4sIEFyZ0VuZCkpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVNlbGVjdChWYWx1ZSAqQywgVmFsdWUgKlRydWUsIFZhbHVlICpGYWxzZSkgeworICAgIGlmIChDb25zdGFudCAqQ0MgPSBkeW5fY2FzdDxDb25zdGFudD4oQykpCisgICAgICBpZiAoQ29uc3RhbnQgKlRDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFRydWUpKQorICAgICAgICBpZiAoQ29uc3RhbnQgKkZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEZhbHNlKSkKKyAgICAgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZVNlbGVjdChDQywgVEMsIEZDKTsKKyAgICByZXR1cm4gSW5zZXJ0KFNlbGVjdEluc3Q6OkNyZWF0ZShDLCBUcnVlLCBGYWxzZSkpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUV4dHJhY3RFbGVtZW50KFZhbHVlICpWZWMsIFZhbHVlICpJZHgpIHsKKyAgICBpZiAoQ29uc3RhbnQgKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFZlYykpCisgICAgICBpZiAoQ29uc3RhbnQgKklDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KElkeCkpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoVkMsIElDKTsKKyAgICByZXR1cm4gSW5zZXJ0KEV4dHJhY3RFbGVtZW50SW5zdDo6Q3JlYXRlKFZlYywgSWR4KSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSW5zZXJ0RWxlbWVudChWYWx1ZSAqVmVjLCBWYWx1ZSAqTmV3RWx0LCBWYWx1ZSAqSWR4KSB7CisgICAgaWYgKENvbnN0YW50ICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWZWMpKQorICAgICAgaWYgKENvbnN0YW50ICpOQyA9IGR5bl9jYXN0PENvbnN0YW50PihOZXdFbHQpKQorICAgICAgICBpZiAoQ29uc3RhbnQgKklDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KElkeCkpCisgICAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVJbnNlcnRFbGVtZW50KFZDLCBOQywgSUMpOworICAgIHJldHVybiBJbnNlcnQoSW5zZXJ0RWxlbWVudEluc3Q6OkNyZWF0ZShWZWMsIE5ld0VsdCwgSWR4KSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU2h1ZmZsZVZlY3RvcihWYWx1ZSAqVjEsIFZhbHVlICpWMiwgVmFsdWUgKk1hc2spIHsKKyAgICBpZiAoQ29uc3RhbnQgKlYxQyA9IGR5bl9jYXN0PENvbnN0YW50PihWMSkpCisgICAgICBpZiAoQ29uc3RhbnQgKlYyQyA9IGR5bl9jYXN0PENvbnN0YW50PihWMikpCisgICAgICAgIGlmIChDb25zdGFudCAqTUMgPSBkeW5fY2FzdDxDb25zdGFudD4oTWFzaykpCisgICAgICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVTaHVmZmxlVmVjdG9yKFYxQywgVjJDLCBNQyk7CisgICAgcmV0dXJuIEluc2VydChuZXcgU2h1ZmZsZVZlY3Rvckluc3QoVjEsIFYyLCBNYXNrKSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRXh0cmFjdFZhbHVlKFZhbHVlICpBZ2csIHVuc2lnbmVkIElkeCkgeworICAgIGlmIChDb25zdGFudCAqQWdnQyA9IGR5bl9jYXN0PENvbnN0YW50PihBZ2cpKQorICAgICAgcmV0dXJuIEZvbGRlci5DcmVhdGVFeHRyYWN0VmFsdWUoQWdnQywgJklkeCwgMSk7CisgICAgcmV0dXJuIEluc2VydChFeHRyYWN0VmFsdWVJbnN0OjpDcmVhdGUoQWdnLCBJZHgpKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgIFZhbHVlICpDcmVhdGVFeHRyYWN0VmFsdWUoVmFsdWUgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4RW5kKSB7CisgICAgaWYgKENvbnN0YW50ICpBZ2dDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEFnZykpCisgICAgICByZXR1cm4gRm9sZGVyLkNyZWF0ZUV4dHJhY3RWYWx1ZShBZ2dDLCBJZHhCZWdpbiwgSWR4RW5kIC0gSWR4QmVnaW4pOworICAgIHJldHVybiBJbnNlcnQoRXh0cmFjdFZhbHVlSW5zdDo6Q3JlYXRlKEFnZywgSWR4QmVnaW4sIElkeEVuZCkpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUluc2VydFZhbHVlKFZhbHVlICpBZ2csIFZhbHVlICpWYWwsIHVuc2lnbmVkIElkeCkgeworICAgIGlmIChDb25zdGFudCAqQWdnQyA9IGR5bl9jYXN0PENvbnN0YW50PihBZ2cpKQorICAgICAgaWYgKENvbnN0YW50ICpWYWxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFZhbCkpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlSW5zZXJ0VmFsdWUoQWdnQywgVmFsQywgJklkeCwgMSk7CisgICAgcmV0dXJuIEluc2VydChJbnNlcnRWYWx1ZUluc3Q6OkNyZWF0ZShBZ2csIFZhbCwgSWR4KSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICBWYWx1ZSAqQ3JlYXRlSW5zZXJ0VmFsdWUoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgSWR4QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIElkeEVuZCkgeworICAgIGlmIChDb25zdGFudCAqQWdnQyA9IGR5bl9jYXN0PENvbnN0YW50PihBZ2cpKQorICAgICAgaWYgKENvbnN0YW50ICpWYWxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFZhbCkpCisgICAgICAgIHJldHVybiBGb2xkZXIuQ3JlYXRlSW5zZXJ0VmFsdWUoQWdnQywgVmFsQywgSWR4QmVnaW4sIElkeEVuZC1JZHhCZWdpbik7CisgICAgcmV0dXJuIEluc2VydChJbnNlcnRWYWx1ZUluc3Q6OkNyZWF0ZShBZ2csIFZhbCwgSWR4QmVnaW4sIElkeEVuZCkpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFV0aWxpdHkgY3JlYXRpb24gbWV0aG9kcworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gQ3JlYXRlSXNOdWxsIC0gUmV0dXJuIGFuIGkxIHZhbHVlIHRlc3RpbmcgaWYgXGFyZyBBcmcgaXMgbnVsbC4KKyAgVmFsdWUgKkNyZWF0ZUlzTnVsbChWYWx1ZSAqQXJnKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXBFUShBcmcsIENvbnN0YW50OjpnZXROdWxsVmFsdWUoQXJnLT5nZXRUeXBlKCkpKTsKKyAgfQorCisgIC8vLyBDcmVhdGVJc05vdE51bGwgLSBSZXR1cm4gYW4gaTEgdmFsdWUgdGVzdGluZyBpZiBcYXJnIEFyZyBpcyBub3QgbnVsbC4KKyAgVmFsdWUgKkNyZWF0ZUlzTm90TnVsbChWYWx1ZSAqQXJnKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXBORShBcmcsIENvbnN0YW50OjpnZXROdWxsVmFsdWUoQXJnLT5nZXRUeXBlKCkpKTsKKyAgfQorCisgIC8vLyBDcmVhdGVQdHJEaWZmIC0gUmV0dXJuIHRoZSBpNjQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb2ludGVyIHZhbHVlcywKKyAgLy8vIGRpdmlkaW5nIG91dCB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlZC10byBvYmplY3RzLiAgVGhpcyBpcyBpbnRlbmRlZCB0bworICAvLy8gaW1wbGVtZW50IEMtc3R5bGUgcG9pbnRlciBzdWJ0cmFjdGlvbi4gQXMgc3VjaCwgdGhlIHBvaW50ZXJzIG11c3QgYmUKKyAgLy8vIGFwcHJvcHJpYXRlbHkgYWxpZ25lZCBmb3IgdGhlaXIgZWxlbWVudCB0eXBlcyBhbmQgcG9pbnRpbmcgaW50byB0aGUKKyAgLy8vIHNhbWUgb2JqZWN0LgorICBWYWx1ZSAqQ3JlYXRlUHRyRGlmZihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgICAgYXNzZXJ0KExIUy0+Z2V0VHlwZSgpID09IFJIUy0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICJQb2ludGVyIHN1YnRyYWN0aW9uIG9wZXJhbmQgdHlwZXMgbXVzdCBtYXRjaCEiKTsKKyAgICBjb25zdCBQb2ludGVyVHlwZSAqQXJnVHlwZSA9IGNhc3Q8UG9pbnRlclR5cGU+KExIUy0+Z2V0VHlwZSgpKTsKKyAgICBWYWx1ZSAqTEhTX2ludCA9IENyZWF0ZVB0clRvSW50KExIUywgVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSk7CisgICAgVmFsdWUgKlJIU19pbnQgPSBDcmVhdGVQdHJUb0ludChSSFMsIFR5cGU6OmdldEludDY0VHkoQ29udGV4dCkpOworICAgIFZhbHVlICpEaWZmZXJlbmNlID0gQ3JlYXRlU3ViKExIU19pbnQsIFJIU19pbnQpOworICAgIHJldHVybiBDcmVhdGVFeGFjdFNEaXYoRGlmZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0U2l6ZU9mKEFyZ1R5cGUtPmdldEVsZW1lbnRUeXBlKCkpKTsKKyAgfQorfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0lSUmVhZGVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9JUlJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NGRhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9JUlJlYWRlci5oCkBAIC0wLDAgKzEsMTEwIEBACisvLz09PS0tLS0gbGx2bS9TdXBwb3J0L0lSUmVhZGVyLmggLSBSZWFkZXIgZm9yIExMVk0gSVIgZmlsZXMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBMTFZNIElSLiBUaGV5IHN1cHBvcnQgYm90aAorLy8gQml0Y29kZSBhbmQgQXNzZW1ibHksIGF1dG9tYXRpY2FsbHkgZGV0ZWN0aW5nIHRoZSBpbnB1dCBmb3JtYXQuCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIGluIG9yZGVyIHRvIGF2b2lkCisvLyBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc2luY2UgdGhleSByZWZlcmVuY2UgYm90aCBCaXRjb2RlIGFuZCBBc3NlbWJseQorLy8gZnVuY3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0lSUkVBREVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0lSUkVBREVSX0gKKworI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvUGFyc2VyLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL1JlYWRlcldyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLy8gSWYgdGhlIGdpdmVuIE1lbW9yeUJ1ZmZlciBob2xkcyBhIGJpdGNvZGUgaW1hZ2UsIHJldHVybiBhIE1vZHVsZSBmb3IgaXQKKyAgLy8vIHdoaWNoIGRvZXMgbGF6eSBkZXNlcmlhbGl6YXRpb24gb2YgZnVuY3Rpb24gYm9kaWVzLiAgT3RoZXJ3aXNlLCBhdHRlbXB0IHRvCisgIC8vLyBwYXJzZSBpdCBhcyBMTFZNIEFzc2VtYmx5IGFuZCByZXR1cm4gYSBmdWxseSBwb3B1bGF0ZWQgTW9kdWxlLiBUaGlzCisgIC8vLyBmdW5jdGlvbiAqYWx3YXlzKiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIE1lbW9yeUJ1ZmZlci4KKyAgaW5saW5lIE1vZHVsZSAqZ2V0TGF6eUlSTW9kdWxlKE1lbW9yeUJ1ZmZlciAqQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01EaWFnbm9zdGljICZFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIGlmIChpc0JpdGNvZGUoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilCdWZmZXItPmdldEJ1ZmZlclN0YXJ0KCksCisgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKUJ1ZmZlci0+Z2V0QnVmZmVyRW5kKCkpKSB7CisgICAgICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgICAgICBNb2R1bGUgKk0gPSBnZXRMYXp5Qml0Y29kZU1vZHVsZShCdWZmZXIsIENvbnRleHQsICZFcnJNc2cpOworICAgICAgaWYgKE0gPT0gMCkgeworICAgICAgICBFcnIgPSBTTURpYWdub3N0aWMoQnVmZmVyLT5nZXRCdWZmZXJJZGVudGlmaWVyKCksIEVyck1zZyk7CisgICAgICAgIC8vIFBhcnNlQml0Y29kZUZpbGUgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIEJ1ZmZlciBpbiB0aGUKKyAgICAgICAgLy8gY2FzZSBvZiBhbiBlcnJvci4KKyAgICAgICAgZGVsZXRlIEJ1ZmZlcjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBNOworICAgIH0KKworICAgIHJldHVybiBQYXJzZUFzc2VtYmx5KEJ1ZmZlciwgMCwgRXJyLCBDb250ZXh0KTsKKyAgfQorCisgIC8vLyBJZiB0aGUgZ2l2ZW4gZmlsZSBob2xkcyBhIGJpdGNvZGUgaW1hZ2UsIHJldHVybiBhIE1vZHVsZQorICAvLy8gZm9yIGl0IHdoaWNoIGRvZXMgbGF6eSBkZXNlcmlhbGl6YXRpb24gb2YgZnVuY3Rpb24gYm9kaWVzLiAgT3RoZXJ3aXNlLAorICAvLy8gYXR0ZW1wdCB0byBwYXJzZSBpdCBhcyBMTFZNIEFzc2VtYmx5IGFuZCByZXR1cm4gYSBmdWxseSBwb3B1bGF0ZWQKKyAgLy8vIE1vZHVsZS4KKyAgaW5saW5lIE1vZHVsZSAqZ2V0TGF6eUlSRmlsZU1vZHVsZShjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01EaWFnbm9zdGljICZFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgICAgTWVtb3J5QnVmZmVyICpGID0gTWVtb3J5QnVmZmVyOjpnZXRGaWxlT3JTVERJTihGaWxlbmFtZS5jX3N0cigpLCAmRXJyTXNnKTsKKyAgICBpZiAoRiA9PSAwKSB7CisgICAgICBFcnIgPSBTTURpYWdub3N0aWMoRmlsZW5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiAiICsgRXJyTXNnKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBnZXRMYXp5SVJNb2R1bGUoRiwgRXJyLCBDb250ZXh0KTsKKyAgfQorCisgIC8vLyBJZiB0aGUgZ2l2ZW4gTWVtb3J5QnVmZmVyIGhvbGRzIGEgYml0Y29kZSBpbWFnZSwgcmV0dXJuIGEgTW9kdWxlCisgIC8vLyBmb3IgaXQuICBPdGhlcndpc2UsIGF0dGVtcHQgdG8gcGFyc2UgaXQgYXMgTExWTSBBc3NlbWJseSBhbmQgcmV0dXJuCisgIC8vLyBhIE1vZHVsZSBmb3IgaXQuIFRoaXMgZnVuY3Rpb24gKmFsd2F5cyogdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBnaXZlbgorICAvLy8gTWVtb3J5QnVmZmVyLgorICBpbmxpbmUgTW9kdWxlICpQYXJzZUlSKE1lbW9yeUJ1ZmZlciAqQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNNRGlhZ25vc3RpYyAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgaWYgKGlzQml0Y29kZSgoY29uc3QgdW5zaWduZWQgY2hhciAqKUJ1ZmZlci0+Z2V0QnVmZmVyU3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopQnVmZmVyLT5nZXRCdWZmZXJFbmQoKSkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIEVyck1zZzsKKyAgICAgIE1vZHVsZSAqTSA9IFBhcnNlQml0Y29kZUZpbGUoQnVmZmVyLCBDb250ZXh0LCAmRXJyTXNnKTsKKyAgICAgIGlmIChNID09IDApCisgICAgICAgIEVyciA9IFNNRGlhZ25vc3RpYyhCdWZmZXItPmdldEJ1ZmZlcklkZW50aWZpZXIoKSwgRXJyTXNnKTsKKyAgICAgIC8vIFBhcnNlQml0Y29kZUZpbGUgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIEJ1ZmZlci4KKyAgICAgIGRlbGV0ZSBCdWZmZXI7CisgICAgICByZXR1cm4gTTsKKyAgICB9CisKKyAgICByZXR1cm4gUGFyc2VBc3NlbWJseShCdWZmZXIsIDAsIEVyciwgQ29udGV4dCk7CisgIH0KKworICAvLy8gSWYgdGhlIGdpdmVuIGZpbGUgaG9sZHMgYSBiaXRjb2RlIGltYWdlLCByZXR1cm4gYSBNb2R1bGUgZm9yIGl0LgorICAvLy8gT3RoZXJ3aXNlLCBhdHRlbXB0IHRvIHBhcnNlIGl0IGFzIExMVk0gQXNzZW1ibHkgYW5kIHJldHVybiBhIE1vZHVsZQorICAvLy8gZm9yIGl0LgorICBpbmxpbmUgTW9kdWxlICpQYXJzZUlSRmlsZShjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNRGlhZ25vc3RpYyAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIHN0ZDo6c3RyaW5nIEVyck1zZzsKKyAgICBNZW1vcnlCdWZmZXIgKkYgPSBNZW1vcnlCdWZmZXI6OmdldEZpbGVPclNURElOKEZpbGVuYW1lLmNfc3RyKCksICZFcnJNc2cpOworICAgIGlmIChGID09IDApIHsKKyAgICAgIEVyciA9IFNNRGlhZ25vc3RpYyhGaWxlbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6ICIgKyBFcnJNc2cpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIFBhcnNlSVIoRiwgRXJyLCBDb250ZXh0KTsKKyAgfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvSW5zdEl0ZXJhdG9yLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9JbnN0SXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDNmODgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvSW5zdEl0ZXJhdG9yLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvSW5zdEl0ZXJhdG9yLmggLSBDbGFzc2VzIGZvciBpbnN0IGl0ZXJhdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIHR3byBpdGVyYXRvcnMgZm9yIGl0ZXJhdGluZyBvdmVyIHRoZQorLy8gaW5zdHJ1Y3Rpb25zIGluIGEgZnVuY3Rpb24uICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgd3JhcHBlciBhcm91bmQgYSB0d28gbGV2ZWwKKy8vIGl0ZXJhdG9yIHRoYXQgY2FuIHByb2JhYmx5IGJlIGdlbmVyaWNpemVkIGxhdGVyLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGl0ZXJhdG9yIGdldHMgaW52YWxpZGF0ZWQgYW55IHRpbWUgdGhhdCBiYXNpYyBibG9ja3Mgb3IKKy8vIGluc3RydWN0aW9ucyBhcmUgbW92ZWQgYXJvdW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0lOU1RJVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9JTlNUSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBpbnN0X2JlZ2luKCkgJiBpbnN0X2VuZCgpIGZvcgorLy8gaW5zdF9pdGVyYXRvciBhbmQgY29uc3RfaW5zdF9pdGVyYXRvcidzLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBfQkJfdCwgY2xhc3MgX0JCX2lfdCwgY2xhc3MgX0JJX3QsIGNsYXNzIF9JSV90PgorY2xhc3MgSW5zdEl0ZXJhdG9yIHsKKyAgdHlwZWRlZiBfQkJfdCAgIEJCdHk7CisgIHR5cGVkZWYgX0JCX2lfdCBCQkl0eTsKKyAgdHlwZWRlZiBfQklfdCAgIEJJdHk7CisgIHR5cGVkZWYgX0lJX3QgICBJSXR5OworICBfQkJfdCAgKkJCczsgICAgICAvLyBCYXNpY0Jsb2Nrc1R5cGUKKyAgX0JCX2lfdCBCQjsgICAgICAgLy8gQmFzaWNCbG9ja3NUeXBlOjppdGVyYXRvcgorICBfQklfdCAgIEJJOyAgICAgICAvLyBCYXNpY0Jsb2NrOjppdGVyYXRvcgorcHVibGljOgorICB0eXBlZGVmIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgSUl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBJSXR5KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgSUl0eSYgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBJbnN0SXRlcmF0b3IoKSB7fQorCisgIC8vIENvcHkgY29uc3RydWN0b3IuLi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgQywgdHlwZW5hbWUgRD4KKyAgSW5zdEl0ZXJhdG9yKGNvbnN0IEluc3RJdGVyYXRvcjxBLEIsQyxEPiAmSUkpCisgICAgOiBCQnMoSUkuQkJzKSwgQkIoSUkuQkIpLCBCSShJSS5CSSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCLCB0eXBlbmFtZSBDLCB0eXBlbmFtZSBEPgorICBJbnN0SXRlcmF0b3IoSW5zdEl0ZXJhdG9yPEEsQixDLEQ+ICZJSSkKKyAgICA6IEJCcyhJSS5CQnMpLCBCQihJSS5CQiksIEJJKElJLkJJKSB7fQorCisgIHRlbXBsYXRlPGNsYXNzIE0+IEluc3RJdGVyYXRvcihNICZtKQorICAgIDogQkJzKCZtLmdldEJhc2ljQmxvY2tMaXN0KCkpLCBCQihCQnMtPmJlZ2luKCkpIHsgICAgLy8gYmVnaW4gY3RvcgorICAgIGlmIChCQiAhPSBCQnMtPmVuZCgpKSB7CisgICAgICBCSSA9IEJCLT5iZWdpbigpOworICAgICAgYWR2YW5jZVRvTmV4dEJCKCk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgTT4gSW5zdEl0ZXJhdG9yKE0gJm0sIGJvb2wpCisgICAgOiBCQnMoJm0uZ2V0QmFzaWNCbG9ja0xpc3QoKSksIEJCKEJCcy0+ZW5kKCkpIHsgICAgLy8gZW5kIGN0b3IKKyAgfQorCisgIC8vIEFjY2Vzc29ycyB0byBnZXQgYXQgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3JzLi4uCisgIGlubGluZSBCQkl0eSAmZ2V0QmFzaWNCbG9ja0l0ZXJhdG9yKCkgIHsgcmV0dXJuIEJCOyB9CisgIGlubGluZSBCSXR5ICAmZ2V0SW5zdHJ1Y3Rpb25JdGVyYXRvcigpIHsgcmV0dXJuIEJJOyB9CisKKyAgaW5saW5lIHJlZmVyZW5jZSBvcGVyYXRvciooKSAgY29uc3QgeyByZXR1cm4gKkJJOyB9CisgIGlubGluZSBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmb3BlcmF0b3IqKCk7IH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEluc3RJdGVyYXRvciAmeSkgY29uc3QgeworICAgIHJldHVybiBCQiA9PSB5LkJCICYmIChCQiA9PSBCQnMtPmVuZCgpIHx8IEJJID09IHkuQkkpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5zdEl0ZXJhdG9yJiB5KSBjb25zdCB7CisgICAgcmV0dXJuICFvcGVyYXRvcj09KHkpOworICB9CisKKyAgSW5zdEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICsrQkk7CisgICAgYWR2YW5jZVRvTmV4dEJCKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBJbnN0SXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBJbnN0SXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KKworICBJbnN0SXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7CisgICAgd2hpbGUgKEJCID09IEJCcy0+ZW5kKCkgfHwgQkkgPT0gQkItPmJlZ2luKCkpIHsKKyAgICAgIC0tQkI7CisgICAgICBCSSA9IEJCLT5lbmQoKTsKKyAgICB9CisgICAgLS1CSTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIEluc3RJdGVyYXRvciAgb3BlcmF0b3ItLShpbnQpIHsKKyAgICBJbnN0SXRlcmF0b3IgdG1wID0gKnRoaXM7IC0tKnRoaXM7IHJldHVybiB0bXA7CisgIH0KKworICBpbmxpbmUgYm9vbCBhdEVuZCgpIGNvbnN0IHsgcmV0dXJuIEJCID09IEJCcy0+ZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgYWR2YW5jZVRvTmV4dEJCKCkgeworICAgIC8vIFRoZSBvbmx5IHdheSB0aGF0IHRoZSBJSSBjb3VsZCBiZSBicm9rZW4gaXMgaWYgaXQgaXMgbm93IHBvaW50aW5nIHRvCisgICAgLy8gdGhlIGVuZCgpIG9mIHRoZSBjdXJyZW50IEJhc2ljQmxvY2sgYW5kIHRoZXJlIGFyZSBzdWNjZXNzb3IgQkJzLgorICAgIHdoaWxlIChCSSA9PSBCQi0+ZW5kKCkpIHsKKyAgICAgICsrQkI7CisgICAgICBpZiAoQkIgPT0gQkJzLT5lbmQoKSkgYnJlYWs7CisgICAgICBCSSA9IEJCLT5iZWdpbigpOworICAgIH0KKyAgfQorfTsKKworCit0eXBlZGVmIEluc3RJdGVyYXRvcjxpcGxpc3Q8QmFzaWNCbG9jaz4sCisgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjo6aXRlcmF0b3IsIEJhc2ljQmxvY2s6Oml0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24+IGluc3RfaXRlcmF0b3I7Cit0eXBlZGVmIEluc3RJdGVyYXRvcjxjb25zdCBpcGxpc3Q8QmFzaWNCbG9jaz4sCisgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uPiBjb25zdF9pbnN0X2l0ZXJhdG9yOworCitpbmxpbmUgaW5zdF9pdGVyYXRvciBpbnN0X2JlZ2luKEZ1bmN0aW9uICpGKSB7IHJldHVybiBpbnN0X2l0ZXJhdG9yKCpGKTsgfQoraW5saW5lIGluc3RfaXRlcmF0b3IgaW5zdF9lbmQoRnVuY3Rpb24gKkYpICAgeyByZXR1cm4gaW5zdF9pdGVyYXRvcigqRiwgdHJ1ZSk7IH0KK2lubGluZSBjb25zdF9pbnN0X2l0ZXJhdG9yIGluc3RfYmVnaW4oY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgcmV0dXJuIGNvbnN0X2luc3RfaXRlcmF0b3IoKkYpOworfQoraW5saW5lIGNvbnN0X2luc3RfaXRlcmF0b3IgaW5zdF9lbmQoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgcmV0dXJuIGNvbnN0X2luc3RfaXRlcmF0b3IoKkYsIHRydWUpOworfQoraW5saW5lIGluc3RfaXRlcmF0b3IgaW5zdF9iZWdpbihGdW5jdGlvbiAmRikgeyByZXR1cm4gaW5zdF9pdGVyYXRvcihGKTsgfQoraW5saW5lIGluc3RfaXRlcmF0b3IgaW5zdF9lbmQoRnVuY3Rpb24gJkYpICAgeyByZXR1cm4gaW5zdF9pdGVyYXRvcihGLCB0cnVlKTsgfQoraW5saW5lIGNvbnN0X2luc3RfaXRlcmF0b3IgaW5zdF9iZWdpbihjb25zdCBGdW5jdGlvbiAmRikgeworICByZXR1cm4gY29uc3RfaW5zdF9pdGVyYXRvcihGKTsKK30KK2lubGluZSBjb25zdF9pbnN0X2l0ZXJhdG9yIGluc3RfZW5kKGNvbnN0IEZ1bmN0aW9uICZGKSB7CisgIHJldHVybiBjb25zdF9pbnN0X2l0ZXJhdG9yKEYsIHRydWUpOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0luc3RWaXNpdG9yLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9JbnN0VmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDk0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9JbnN0VmlzaXRvci5oCkBAIC0wLDAgKzEsMjE0IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0luc3RWaXNpdG9yLmggLSBEZWZpbmUgaW5zdHJ1Y3Rpb24gdmlzaXRvcnMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0lOU1RWSVNJVE9SX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0lOU1RWSVNJVE9SX0gKKworI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBXZSBvcGVyYXRlIG9uIG9wYXF1ZSBpbnN0cnVjdGlvbiBjbGFzc2VzLCBzbyBmb3J3YXJkIGRlY2xhcmUgYWxsIGluc3RydWN0aW9uCisvLyB0eXBlcyBub3cuLi4KKy8vCisjZGVmaW5lIEhBTkRMRV9JTlNUKE5VTSwgT1BDT0RFLCBDTEFTUykgICBjbGFzcyBDTEFTUzsKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmRlZiIKKworI2RlZmluZSBERUxFR0FURShDTEFTU19UT19WSVNJVCkgXAorICByZXR1cm4gc3RhdGljX2Nhc3Q8U3ViQ2xhc3MqPih0aGlzKS0+IFwKKyAgICAgICAgICAgICAgIHZpc2l0IyNDTEFTU19UT19WSVNJVChzdGF0aWNfY2FzdDxDTEFTU19UT19WSVNJVCY+KEkpKQorCisKKy8vLyBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgaW5zdHJ1Y3Rpb24gdmlzaXRvcnMKKy8vLworLy8vIEluc3RydWN0aW9uIHZpc2l0b3JzIGFyZSB1c2VkIHdoZW4geW91IHdhbnQgdG8gcGVyZm9ybSBkaWZmZXJlbnQgYWN0aW9ucworLy8vIGZvciBkaWZmZXJlbnQga2luZHMgb2YgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBsb3RzIG9mIGNhc3RzCisvLy8gYW5kIGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQgKGluIHlvdXIgY29kZSwgdGhhdCBpcykuCisvLy8KKy8vLyBUbyBkZWZpbmUgeW91ciBvd24gdmlzaXRvciwgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MsIHNwZWNpZnlpbmcgeW91cgorLy8vIG5ldyB0eXBlIGZvciB0aGUgJ1N1YkNsYXNzJyB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGFuZCAib3ZlcnJpZGUiIHZpc2l0WFhYCisvLy8gZnVuY3Rpb25zIGluIHlvdXIgY2xhc3MuIEkgc2F5ICJvdmVycmlkZSIgYmVjYXVzZSB0aGlzIGNsYXNzIGlzIGRlZmluZWQKKy8vLyBpbiB0ZXJtcyBvZiBzdGF0aWNhbGx5IHJlc29sdmVkIG92ZXJsb2FkaW5nLCBub3QgdmlydHVhbCBmdW5jdGlvbnMuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgaGVyZSBpcyBhIHZpc2l0b3IgdGhhdCBjb3VudHMgdGhlIG51bWJlciBvZiBtYWxsb2MKKy8vLyBpbnN0cnVjdGlvbnMgcHJvY2Vzc2VkOgorLy8vCisvLy8gIC8vLyBEZWNsYXJlIHRoZSBjbGFzcy4gIE5vdGUgdGhhdCB3ZSBkZXJpdmUgZnJvbSBJbnN0VmlzaXRvciBpbnN0YW50aWF0ZWQKKy8vLyAgLy8vIHdpdGggX291ciBuZXcgc3ViY2xhc3Nlc18gdHlwZS4KKy8vLyAgLy8vCisvLy8gIHN0cnVjdCBDb3VudEFsbG9jYVZpc2l0b3IgOiBwdWJsaWMgSW5zdFZpc2l0b3I8Q291bnRBbGxvY2FWaXNpdG9yPiB7CisvLy8gICAgdW5zaWduZWQgQ291bnQ7CisvLy8gICAgQ291bnRBbGxvY2FWaXNpdG9yKCkgOiBDb3VudCgwKSB7fQorLy8vCisvLy8gICAgdm9pZCB2aXNpdEFsbG9jYUluc3QoQWxsb2NhSW5zdCAmQUkpIHsgKytDb3VudDsgfQorLy8vICB9OworLy8vCisvLy8gIEFuZCB0aGlzIGNsYXNzIHdvdWxkIGJlIHVzZWQgbGlrZSB0aGlzOgorLy8vICAgIENvdW50QWxsb2NhVmlzaXRvciBDQVY7CisvLy8gICAgQ0FWLnZpc2l0KGZ1bmN0aW9uKTsKKy8vLyAgICBOdW1BbGxvY2FzID0gQ0FWLkNvdW50OworLy8vCisvLy8gVGhlIGRlZmluZWQgaGFzICd2aXNpdCcgbWV0aG9kcyBmb3IgSW5zdHJ1Y3Rpb24sIGFuZCBhbHNvIGZvciBCYXNpY0Jsb2NrLAorLy8vIEZ1bmN0aW9uLCBhbmQgTW9kdWxlLCB3aGljaCByZWN1cnNpdmVseSBwcm9jZXNzIGFsbCBjb250YWluZWQgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gTm90ZSB0aGF0IGlmIHlvdSBkb24ndCBpbXBsZW1lbnQgdmlzaXRYWFggZm9yIHNvbWUgaW5zdHJ1Y3Rpb24gdHlwZSwKKy8vLyB0aGUgdmlzaXRYWFggbWV0aG9kIGZvciBpbnN0cnVjdGlvbiBzdXBlcmNsYXNzIHdpbGwgYmUgaW52b2tlZC4gU28KKy8vLyBpZiBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBmdXR1cmUsIHRoZXkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5CisvLy8gc3VwcG9ydGVkLCBpZiB5b3UgaGFuZGxlIG9uZSBvZiB0aGVpciBzdXBlcmNsYXNzZXMuCisvLy8KKy8vLyBUaGUgb3B0aW9uYWwgc2Vjb25kIHRlbXBsYXRlIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgdHlwZSB0aGF0IGluc3RydWN0aW9uCisvLy8gdmlzaXRhdGlvbiBmdW5jdGlvbnMgc2hvdWxkIHJldHVybi4gSWYgeW91IHNwZWNpZnkgdGhpcywgeW91ICpNVVNUKiBwcm92aWRlCisvLy8gYW4gaW1wbGVtZW50YXRpb24gb2YgdmlzaXRJbnN0cnVjdGlvbiB0aG91Z2ghLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGFzIGEgdGVtcGxhdGUgdG8gYXZvaWQKKy8vLyB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuICBEZWZpbmluZyBhbmQgdXNpbmcgYW4gSW5zdFZpc2l0b3IgaXMganVzdAorLy8vIGFzIGVmZmljaWVudCBhcyBoYXZpbmcgeW91ciBvd24gc3dpdGNoIHN0YXRlbWVudCBvdmVyIHRoZSBpbnN0cnVjdGlvbgorLy8vIG9wY29kZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFN1YkNsYXNzLCB0eXBlbmFtZSBSZXRUeT12b2lkPgorY2xhc3MgSW5zdFZpc2l0b3IgeworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW50ZXJmYWNlIGNvZGUgLSBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoZSBJbnN0VmlzaXRvciB0aGF0IHlvdQorICAvLyB1c2UgdG8gdmlzaXQgaW5zdHJ1Y3Rpb25zLi4uCisgIC8vCisKK3B1YmxpYzoKKyAgLy8gR2VuZXJpYyB2aXNpdCBtZXRob2QgLSBBbGxvdyB2aXNpdGF0aW9uIHRvIGFsbCBpbnN0cnVjdGlvbnMgaW4gYSByYW5nZQorICB0ZW1wbGF0ZTxjbGFzcyBJdGVyYXRvcj4KKyAgdm9pZCB2aXNpdChJdGVyYXRvciBTdGFydCwgSXRlcmF0b3IgRW5kKSB7CisgICAgd2hpbGUgKFN0YXJ0ICE9IEVuZCkKKyAgICAgIHN0YXRpY19jYXN0PFN1YkNsYXNzKj4odGhpcyktPnZpc2l0KCpTdGFydCsrKTsKKyAgfQorCisgIC8vIERlZmluZSB2aXNpdG9ycyBmb3IgZnVuY3Rpb25zIGFuZCBiYXNpYyBibG9ja3MuLi4KKyAgLy8KKyAgdm9pZCB2aXNpdChNb2R1bGUgJk0pIHsKKyAgICBzdGF0aWNfY2FzdDxTdWJDbGFzcyo+KHRoaXMpLT52aXNpdE1vZHVsZShNKTsKKyAgICB2aXNpdChNLmJlZ2luKCksIE0uZW5kKCkpOworICB9CisgIHZvaWQgdmlzaXQoRnVuY3Rpb24gJkYpIHsKKyAgICBzdGF0aWNfY2FzdDxTdWJDbGFzcyo+KHRoaXMpLT52aXNpdEZ1bmN0aW9uKEYpOworICAgIHZpc2l0KEYuYmVnaW4oKSwgRi5lbmQoKSk7CisgIH0KKyAgdm9pZCB2aXNpdChCYXNpY0Jsb2NrICZCQikgeworICAgIHN0YXRpY19jYXN0PFN1YkNsYXNzKj4odGhpcyktPnZpc2l0QmFzaWNCbG9jayhCQik7CisgICAgdmlzaXQoQkIuYmVnaW4oKSwgQkIuZW5kKCkpOworICB9CisKKyAgLy8gRm9yd2FyZGluZyBmdW5jdGlvbnMgc28gdGhhdCB0aGUgdXNlciBjYW4gdmlzaXQgd2l0aCBwb2ludGVycyBBTkQgcmVmcy4KKyAgdm9pZCB2aXNpdChNb2R1bGUgICAgICAgKk0pICB7IHZpc2l0KCpNKTsgfQorICB2b2lkIHZpc2l0KEZ1bmN0aW9uICAgICAqRikgIHsgdmlzaXQoKkYpOyB9CisgIHZvaWQgdmlzaXQoQmFzaWNCbG9jayAgICpCQikgeyB2aXNpdCgqQkIpOyB9CisgIFJldFR5IHZpc2l0KEluc3RydWN0aW9uICpJKSAgeyByZXR1cm4gdmlzaXQoKkkpOyB9CisKKyAgLy8gdmlzaXQgLSBGaW5hbGx5LCBjb2RlIHRvIHZpc2l0IGFuIGluc3RydWN0aW9uLi4uCisgIC8vCisgIFJldFR5IHZpc2l0KEluc3RydWN0aW9uICZJKSB7CisgICAgc3dpdGNoIChJLmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBpbnN0cnVjdGlvbiB0eXBlIGVuY291bnRlcmVkISIpOworICAgICAgLy8gQnVpbGQgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdXNpbmcgdGhlIEluc3RydWN0aW9uLmRlZiBmaWxlLi4uCisjZGVmaW5lIEhBTkRMRV9JTlNUKE5VTSwgT1BDT0RFLCBDTEFTUykgXAorICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9QQ09ERTogcmV0dXJuIFwKKyAgICAgICAgICAgc3RhdGljX2Nhc3Q8U3ViQ2xhc3MqPih0aGlzKS0+IFwKKyAgICAgICAgICAgICAgICAgICAgICB2aXNpdCMjT1BDT0RFKHN0YXRpY19jYXN0PENMQVNTJj4oSSkpOworI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb24uZGVmIgorICAgIH0KKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBWaXNpdGF0aW9uIGZ1bmN0aW9ucy4uLiB0aGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBkZWZhdWx0IGZhbGxiYWNrcyBpbiBjYXNlCisgIC8vIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgd2hhdCB0byBkbyBmb3IgYSBwYXJ0aWN1bGFyIGluc3RydWN0aW9uIHR5cGUuCisgIC8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGdlbmVyYWxpemUgdGhlIGluc3RydWN0aW9uIHR5cGUgdG8gaXRzIHN1YnR5cGUKKyAgLy8gYW5kIHRyeSB2aXNpdGluZyB0aGUgc3VidHlwZS4gIEFsbCBvZiB0aGlzIHNob3VsZCBiZSBpbmxpbmVkIHBlcmZlY3RseSwKKyAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gdmlydHVhbCBmdW5jdGlvbnMgdG8gZ2V0IGluIHRoZSB3YXkuCisgIC8vCisKKyAgLy8gV2hlbiB2aXNpdGluZyBhIG1vZHVsZSwgZnVuY3Rpb24gb3IgYmFzaWMgYmxvY2sgZGlyZWN0bHksIHRoZXNlIG1ldGhvZHMgZ2V0CisgIC8vIGNhbGxlZCB0byBpbmRpY2F0ZSB3aGVuIHRyYW5zaXRpb25pbmcgaW50byBhIG5ldyB1bml0LgorICAvLworICB2b2lkIHZpc2l0TW9kdWxlICAgIChNb2R1bGUgJk0pIHt9CisgIHZvaWQgdmlzaXRGdW5jdGlvbiAgKEZ1bmN0aW9uICZGKSB7fQorICB2b2lkIHZpc2l0QmFzaWNCbG9jayhCYXNpY0Jsb2NrICZCQikge30KKworICAvLyBEZWZpbmUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWMgdmlzaXRvciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiB0bworICAvLyBoYW5kbGUgU1BFQ0lGSUMgaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgZnVuY3Rpb25zIGF1dG9tYXRpY2FsbHkgZGVmaW5lCisgIC8vIHZpc2l0TXVsIHRvIHByb3h5IHRvIHZpc2l0QmluYXJ5T3BlcmF0b3IgZm9yIGluc3RhbmNlIGluIGNhc2UgdGhlIHVzZXIgZG9lcworICAvLyBub3QgbmVlZCB0aGlzIGdlbmVyYWxpdHkuCisgIC8vCisgIC8vIFRoZSBvbmUgcHJvYmxlbSBjYXNlIHdlIGhhdmUgdG8gaGFuZGxlIGhlcmUgdGhvdWdoIGlzIHRoYXQgdGhlIFBISU5vZGUKKyAgLy8gY2xhc3MgYW5kIG9wY29kZSBuYW1lIGFyZSB0aGUgZXhhY3Qgc2FtZS4gIEJlY2F1c2Ugb2YgdGhpcywgd2UgY2Fubm90CisgIC8vIGRlZmluZSB2aXNpdFBISU5vZGUgKHRoZSBpbnN0IHZlcnNpb24pIHRvIGZvcndhcmQgdG8gdmlzaXRQSElOb2RlICh0aGUKKyAgLy8gZ2VuZXJpYyB2ZXJzaW9uKSB3aXRob3V0IG11bHRpcGx5IGRlZmluZWQgc3ltYm9scyBhbmQgcmVjdXJzaW9uLiAgVG8gaGFuZGxlCisgIC8vIHRoaXMsIHdlIGRvIG5vdCBhdXRvZXhwYW5kICJPdGhlciIgaW5zdHJ1Y3Rpb25zLCB3ZSBkbyBpdCBtYW51YWxseS4KKyAgLy8KKyNkZWZpbmUgSEFORExFX0lOU1QoTlVNLCBPUENPREUsIENMQVNTKSBcCisgICAgUmV0VHkgdmlzaXQjI09QQ09ERShDTEFTUyAmSSkgeyBERUxFR0FURShDTEFTUyk7IH0KKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmRlZiIKKworICAvLyBTcGVjaWZpYyBJbnN0cnVjdGlvbiB0eXBlIGNsYXNzZXMuLi4gbm90ZSB0aGF0IGFsbCBvZiB0aGUgY2FzdHMgYXJlCisgIC8vIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgaW5zdHJ1Y3Rpb24gY2xhc3NlcyBhcyBvcGFxdWUgdHlwZXMuLi4KKyAgLy8KKyAgUmV0VHkgdmlzaXRSZXR1cm5JbnN0KFJldHVybkluc3QgJkkpICAgICAgICAgICAgICB7IERFTEVHQVRFKFRlcm1pbmF0b3JJbnN0KTt9CisgIFJldFR5IHZpc2l0QnJhbmNoSW5zdChCcmFuY2hJbnN0ICZJKSAgICAgICAgICAgICAgeyBERUxFR0FURShUZXJtaW5hdG9ySW5zdCk7fQorICBSZXRUeSB2aXNpdFN3aXRjaEluc3QoU3dpdGNoSW5zdCAmSSkgICAgICAgICAgICAgIHsgREVMRUdBVEUoVGVybWluYXRvckluc3QpO30KKyAgUmV0VHkgdmlzaXRJbmRpcmVjdEJySW5zdChJbmRpcmVjdEJySW5zdCAmSSkgICAgICB7IERFTEVHQVRFKFRlcm1pbmF0b3JJbnN0KTt9CisgIFJldFR5IHZpc2l0VW5yZWFjaGFibGVJbnN0KFVucmVhY2hhYmxlSW5zdCAmSSkgICAgeyBERUxFR0FURShUZXJtaW5hdG9ySW5zdCk7fQorICBSZXRUeSB2aXNpdElDbXBJbnN0KElDbXBJbnN0ICZJKSAgICAgICAgICAgICAgICAgIHsgREVMRUdBVEUoQ21wSW5zdCk7fQorICBSZXRUeSB2aXNpdEZDbXBJbnN0KEZDbXBJbnN0ICZJKSAgICAgICAgICAgICAgICAgIHsgREVMRUdBVEUoQ21wSW5zdCk7fQorICBSZXRUeSB2aXNpdEFsbG9jYUluc3QoQWxsb2NhSW5zdCAmSSkgICAgICAgICAgICAgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisgIFJldFR5IHZpc2l0TG9hZEluc3QoTG9hZEluc3QgICAgICZJKSAgICAgICAgICAgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7IH0KKyAgUmV0VHkgdmlzaXRTdG9yZUluc3QoU3RvcmVJbnN0ICAgJkkpICAgICAgICAgICAgICB7IERFTEVHQVRFKEluc3RydWN0aW9uKTsgfQorICBSZXRUeSB2aXNpdEdldEVsZW1lbnRQdHJJbnN0KEdldEVsZW1lbnRQdHJJbnN0ICZJKXsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisgIFJldFR5IHZpc2l0UEhJTm9kZShQSElOb2RlICAgICAgICZJKSAgICAgICAgICAgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7IH0KKyAgUmV0VHkgdmlzaXRUcnVuY0luc3QoVHJ1bmNJbnN0ICZJKSAgICAgICAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTsgfQorICBSZXRUeSB2aXNpdFpFeHRJbnN0KFpFeHRJbnN0ICZJKSAgICAgICAgICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpOyB9CisgIFJldFR5IHZpc2l0U0V4dEluc3QoU0V4dEluc3QgJkkpICAgICAgICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7IH0KKyAgUmV0VHkgdmlzaXRGUFRydW5jSW5zdChGUFRydW5jSW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTsgfQorICBSZXRUeSB2aXNpdEZQRXh0SW5zdChGUEV4dEluc3QgJkkpICAgICAgICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpOyB9CisgIFJldFR5IHZpc2l0RlBUb1VJSW5zdChGUFRvVUlJbnN0ICZJKSAgICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7IH0KKyAgUmV0VHkgdmlzaXRGUFRvU0lJbnN0KEZQVG9TSUluc3QgJkkpICAgICAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTsgfQorICBSZXRUeSB2aXNpdFVJVG9GUEluc3QoVUlUb0ZQSW5zdCAmSSkgICAgICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpOyB9CisgIFJldFR5IHZpc2l0U0lUb0ZQSW5zdChTSVRvRlBJbnN0ICZJKSAgICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7IH0KKyAgUmV0VHkgdmlzaXRQdHJUb0ludEluc3QoUHRyVG9JbnRJbnN0ICZJKSAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTsgfQorICBSZXRUeSB2aXNpdEludFRvUHRySW5zdChJbnRUb1B0ckluc3QgJkkpICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpOyB9CisgIFJldFR5IHZpc2l0Qml0Q2FzdEluc3QoQml0Q2FzdEluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7IH0KKyAgUmV0VHkgdmlzaXRTZWxlY3RJbnN0KFNlbGVjdEluc3QgJkkpICAgICAgICAgICAgICB7IERFTEVHQVRFKEluc3RydWN0aW9uKTsgfQorICBSZXRUeSB2aXNpdENhbGxJbnN0KENhbGxJbnN0ICAgICAmSSkgICAgICAgICAgICAgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisgIFJldFR5IHZpc2l0RXh0cmFjdEVsZW1lbnRJbnN0KEV4dHJhY3RFbGVtZW50SW5zdCAmSSkgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdEluc2VydEVsZW1lbnRJbnN0KEluc2VydEVsZW1lbnRJbnN0ICZJKSB7IERFTEVHQVRFKEluc3RydWN0aW9uKTsgfQorICBSZXRUeSB2aXNpdFNodWZmbGVWZWN0b3JJbnN0KFNodWZmbGVWZWN0b3JJbnN0ICZJKSB7IERFTEVHQVRFKEluc3RydWN0aW9uKTsgfQorICBSZXRUeSB2aXNpdEV4dHJhY3RWYWx1ZUluc3QoRXh0cmFjdFZhbHVlSW5zdCAmSSkgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRJbnNlcnRWYWx1ZUluc3QoSW5zZXJ0VmFsdWVJbnN0ICZJKSAgICB7IERFTEVHQVRFKEluc3RydWN0aW9uKTsgfQorCisgIC8vIE5leHQgbGV2ZWwgcHJvcGFnYXRvcnM6IElmIHRoZSB1c2VyIGRvZXMgbm90IG92ZXJsb2FkIGEgc3BlY2lmaWMKKyAgLy8gaW5zdHJ1Y3Rpb24gdHlwZSwgdGhleSBjYW4gb3ZlcmxvYWQgb25lIG9mIHRoZXNlIHRvIGdldCB0aGUgd2hvbGUgY2xhc3MKKyAgLy8gb2YgaW5zdHJ1Y3Rpb25zLi4uCisgIC8vCisgIFJldFR5IHZpc2l0VGVybWluYXRvckluc3QoVGVybWluYXRvckluc3QgJkkpIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisgIFJldFR5IHZpc2l0QmluYXJ5T3BlcmF0b3IoQmluYXJ5T3BlcmF0b3IgJkkpIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisgIFJldFR5IHZpc2l0Q21wSW5zdChDbXBJbnN0ICZJKSAgICAgICAgICAgICAgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisgIFJldFR5IHZpc2l0Q2FzdEluc3QoQ2FzdEluc3QgJkkpICAgICAgICAgICAgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisKKyAgLy8gSWYgdGhlIHVzZXIgd2FudHMgYSAnZGVmYXVsdCcgY2FzZSwgdGhleSBjYW4gY2hvb3NlIHRvIG92ZXJyaWRlIHRoaXMKKyAgLy8gZnVuY3Rpb24uICBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBvdmVybG9hZGVkIGluIHRoZSB1c2VyJ3Mgc3ViY2xhc3MsIHRoZW4KKyAgLy8gdGhpcyBpbnN0cnVjdGlvbiBqdXN0IGdldHMgaWdub3JlZC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHlvdSBNVVNUIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaWYgeW91ciByZXR1cm4gdHlwZSBpcyBub3Qgdm9pZC4KKyAgLy8KKyAgdm9pZCB2aXNpdEluc3RydWN0aW9uKEluc3RydWN0aW9uICZJKSB7fSAgLy8gSWdub3JlIHVuaGFuZGxlZCBpbnN0cnVjdGlvbnMKK307CisKKyN1bmRlZiBERUxFR0FURQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xlYWtEZXRlY3Rvci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTGVha0RldGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxYTlkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xlYWtEZXRlY3Rvci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0xlYWtEZXRlY3Rvci5oIC0gUHJvdmlkZSBsZWFrIGRldGVjdGlvbiAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdmVyeSBzaW1wbGUgbWVtb3J5IGxlYWsKKy8vIGNoZWNrcyBmb3IgYW4gQVBJLiAgQmFzaWNhbGx5IExMVk0gdXNlcyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGF0IEluc3RydWN0aW9ucywKKy8vIGZvciBleGFtcGxlLCBhcmUgZGVsZXRlZCB3aGVuIHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlLCBhbmQgbm90IGxlYWtlZCBhd2F5LgorLy8KKy8vIFdoZW4gY29tcGlsaW5nIHdpdGggTkRFQlVHIChSZWxlYXNlIGJ1aWxkKSwgdGhpcyBjbGFzcyBkb2VzIG5vdGhpbmcsIHRodXMKKy8vIGFkZGluZyBubyBjaGVja2luZyBvdmVyaGVhZCB0byByZWxlYXNlIGJ1aWxkcy4gIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzCisvLyBpbXBsZW1lbnRlZCBpbiBhIHZlcnkgc2ltcGxlIHdheSwgcmVxdWlyaW5nIGNvbXBsZXRlbHkgbWFudWFsIG1hbmlwdWxhdGlvbgorLy8gYW5kIGNoZWNraW5nIGZvciBnYXJiYWdlLCBidXQgdGhpcyBpcyBpbnRlbnRpb25hbDogdXNlcnMgc2hvdWxkIG5vdCBiZSB1c2luZworLy8gdGhpcyBBUEksIG9ubHkgb3RoZXIgQVBJcyBzaG91bGQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTEVBS0RFVEVDVE9SX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0xFQUtERVRFQ1RPUl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBWYWx1ZTsKKworc3RydWN0IExlYWtEZXRlY3RvciB7CisgIC8vLyBhZGRHYXJiYWdlT2JqZWN0IC0gQWRkIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgc2V0IG9mICJnYXJiYWdlIiBvYmplY3QKKyAgLy8vIHBvaW50ZXJzLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gb2JqZWN0cyBhcmUgY3JlYXRlZCwgb3IgaWYgdGhleSBhcmUKKyAgLy8vIHRha2VuIG91dCBvZiBhbiBvd25pbmcgY29sbGVjdGlvbi4KKyAgLy8vCisgIHN0YXRpYyB2b2lkIGFkZEdhcmJhZ2VPYmplY3Qodm9pZCAqT2JqZWN0KSB7CisjaWZuZGVmIE5ERUJVRworICAgIGFkZEdhcmJhZ2VPYmplY3RJbXBsKE9iamVjdCk7CisjZW5kaWYKKyAgfQorCisgIC8vLyByZW1vdmVHYXJiYWdlT2JqZWN0IC0gUmVtb3ZlIGEgcG9pbnRlciBmcm9tIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZgorICAvLy8gb3VyICJnYXJiYWdlIiBvYmplY3RzLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIGFkZGVkIHRvCisgIC8vLyBhbiAib3duaW5nIiBjb2xsZWN0aW9uLgorICAvLy8KKyAgc3RhdGljIHZvaWQgcmVtb3ZlR2FyYmFnZU9iamVjdCh2b2lkICpPYmplY3QpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgcmVtb3ZlR2FyYmFnZU9iamVjdEltcGwoT2JqZWN0KTsKKyNlbmRpZgorICB9CisKKyAgLy8vIGNoZWNrRm9yR2FyYmFnZSAtIFRyYXZlcnNlIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBnYXJiYWdlCisgIC8vLyBwb2ludGVycy4gIElmIHRoZXJlIGFyZSBhbnkgcG9pbnRlcnMgdGhhdCBoYXZlIGJlZW4gYWRkJ2VkLCBidXQgbm90CisgIC8vLyByZW1vdmUnZCwgYmlnIG9ibm94aW91cyB3YXJuaW5ncyBhYm91dCBtZW1vcnkgbGVha3MgYXJlIGlzc3VlZC4KKyAgLy8vCisgIC8vLyBUaGUgc3BlY2lmaWVkIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIGluZGljYXRpbmcgd2hlbiB0aGUgY2hlY2sgd2FzCisgIC8vLyBwZXJmb3JtZWQuCisgIC8vLworICBzdGF0aWMgdm9pZCBjaGVja0ZvckdhcmJhZ2UoTExWTUNvbnRleHQgJkMsIGNvbnN0IHN0ZDo6c3RyaW5nICZNZXNzYWdlKSB7CisjaWZuZGVmIE5ERUJVRworICAgIGNoZWNrRm9yR2FyYmFnZUltcGwoQywgTWVzc2FnZSk7CisjZW5kaWYKKyAgfQorCisgIC8vLyBPdmVybG9hZCB0aGUgbm9ybWFsIG1ldGhvZHMgdG8gd29yayBiZXR0ZXIgd2l0aCBWYWx1ZSoncyBiZWNhdXNlIHRoZXkgYXJlCisgIC8vLyBieSBmYXIgdGhlIG1vc3QgY29tbW9uIGluIExMVk0uICBUaGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgYWN0dWFsCisgIC8vLyBmdW5jdGlvbmluZyBvZiB0aGlzIGNsYXNzLCBpdCBqdXN0IG1ha2VzIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIG5pY2VyLgorICAvLy8KKyAgc3RhdGljIHZvaWQgYWRkR2FyYmFnZU9iamVjdChjb25zdCBWYWx1ZSAqT2JqZWN0KSB7CisjaWZuZGVmIE5ERUJVRworICAgIGFkZEdhcmJhZ2VPYmplY3RJbXBsKE9iamVjdCk7CisjZW5kaWYKKyAgfQorICBzdGF0aWMgdm9pZCByZW1vdmVHYXJiYWdlT2JqZWN0KGNvbnN0IFZhbHVlICpPYmplY3QpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgcmVtb3ZlR2FyYmFnZU9iamVjdEltcGwoT2JqZWN0KTsKKyNlbmRpZgorICB9CisKK3ByaXZhdGU6CisgIC8vIElmIHdlIGFyZSBkZWJ1Z2dpbmcsIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb25zIHdpbGwgYmUgY2FsbGVkLi4uCisgIHN0YXRpYyB2b2lkIGFkZEdhcmJhZ2VPYmplY3RJbXBsKGNvbnN0IFZhbHVlICpPYmplY3QpOworICBzdGF0aWMgdm9pZCByZW1vdmVHYXJiYWdlT2JqZWN0SW1wbChjb25zdCBWYWx1ZSAqT2JqZWN0KTsKKyAgc3RhdGljIHZvaWQgYWRkR2FyYmFnZU9iamVjdEltcGwodm9pZCAqT2JqZWN0KTsKKyAgc3RhdGljIHZvaWQgcmVtb3ZlR2FyYmFnZU9iamVjdEltcGwodm9pZCAqT2JqZWN0KTsKKyAgc3RhdGljIHZvaWQgY2hlY2tGb3JHYXJiYWdlSW1wbChMTFZNQ29udGV4dCAmQywgY29uc3Qgc3RkOjpzdHJpbmcgJk1lc3NhZ2UpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NYWNoTy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWFjaE8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzEzMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWFjaE8uaApAQCAtMCwwICsxLDY5NCBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvTWFjaE8uaCAtIFRoZSBNYWNoTyBmaWxlIGZvcm1hdCAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBtYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSBNYWNoTyBvYmplY3QgZmlsZSBmb3JtYXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUFDSE9fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTUFDSE9fSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKKy8vIE5PVEU6IFRoZSBlbnVtcyBpbiB0aGlzIGZpbGUgYXJlIGludGVudGlhbGx5IG5hbWVkIHRvIGJlIGRpZmZlcmVudCB0aGFuIHRob3NlCisvLyBpbiB0aGUgaGVhZGVycyBpbiAvdXNyL2luY2x1ZGUvbWFjaCAob24gZGFyd2luIHN5c3RlbXMpIHRvIGF2b2lkIGNvbmZsaWN0cworLy8gd2l0aCB0aG9zZSBtYWNyb3MuCituYW1lc3BhY2UgbGx2bSB7CisgIG5hbWVzcGFjZSBNYWNoTyB7CisgICAgLy8gRW51bXMgZnJvbSA8bWFjaC1vL2xvYWRlci5oPgorICAgIGVudW0geworICAgICAgLy8gQ29uc3RhbnRzIGZvciB0aGUgIm1hZ2ljIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6bWFjaF9oZWFkZXIgYW5kIAorICAgICAgLy8gbGx2bTo6TWFjaE86Om1hY2hfaGVhZGVyXzY0CisgICAgICBIZWFkZXJNYWdpYzMyICAgICAgICAgPSAweEZFRURGQUNFdSwgLy8gTUhfTUFHSUMKKyAgICAgIEhlYWRlck1hZ2ljMzJTd2FwcGVkICA9IDB4Q0VGQUVERkV1LCAvLyBNSF9DSUdBTQorICAgICAgSGVhZGVyTWFnaWM2NCAgICAgICAgID0gMHhGRUVERkFDRnUsIC8vIE1IX01BR0lDXzY0CisgICAgICBIZWFkZXJNYWdpYzY0U3dhcHBlZCAgPSAweENGRkFFREZFdSwgLy8gTUhfQ0lHQU1fNjQKKyAgICAgIFVuaXZlcnNhbE1hZ2ljICAgICAgICA9IDB4Q0FGRUJBQkV1LCAvLyBGQVRfTUFHSUMKKyAgICAgIFVuaXZlcnNhbE1hZ2ljU3dhcHBlZCA9IDB4QkVCQUZFQ0F1LCAvLyBGQVRfQ0lHQU0KKworICAgICAgLy8gQ29uc3RhbnRzIGZvciB0aGUgImZpbGV0eXBlIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6bWFjaF9oZWFkZXIgYW5kCisgICAgICAvLyBsbHZtOjpNYWNoTzo6bWFjaF9oZWFkZXJfNjQKKyAgICAgIEhlYWRlckZpbGVUeXBlT2JqZWN0ICAgICAgICAgICAgICA9IDB4MXUsIC8vIE1IX09CSkVDVAorICAgICAgSGVhZGVyRmlsZVR5cGVFeGVjdXRhYmxlICAgICAgICAgID0gMHgydSwgLy8gTUhfRVhFQ1VURQorICAgICAgSGVhZGVyRmlsZVR5cGVGaXhlZFZNU2hsaWIgICAgICAgID0gMHgzdSwgLy8gTUhfRlZNTElCCisgICAgICBIZWFkZXJGaWxlVHlwZUNvcmUgICAgICAgICAgICAgICAgPSAweDR1LCAvLyBNSF9DT1JFCisgICAgICBIZWFkZXJGaWxlVHlwZVByZWxvYWRlZEV4ZWN1dGFibGUgPSAweDV1LCAvLyBNSF9QUkVMT0FECisgICAgICBIZWFkZXJGaWxlVHlwZUR5bmFtaWNTaGxpYiAgICAgICAgPSAweDZ1LCAvLyBNSF9EWUxJQgorICAgICAgSGVhZGVyRmlsZVR5cGVEeW5hbWljTGlua0VkaXRvciAgID0gMHg3dSwgLy8gTUhfRFlMSU5LRVIKKyAgICAgIEhlYWRlckZpbGVUeXBlQnVuZGxlICAgICAgICAgICAgICA9IDB4OHUsIC8vIE1IX0JVTkRMRQorICAgICAgSGVhZGVyRmlsZVR5cGVEeW5hbWljU2hsaWJTdHViICAgID0gMHg5dSwgLy8gTUhfRFlMSUJfU1RVQgorICAgICAgSGVhZGVyRmlsZVR5cGVEU1lNICAgICAgICAgICAgICAgID0gMHhBdSwgLy8gTUhfRFNZTQorICAgICAgSGVhZGVyRmlsZVR5cGVLZXh0QnVuZGxlICAgICAgICAgID0gMHhCdSwgLy8gTUhfS0VYVF9CVU5ETEUKKworICAgICAgLy8gQ29uc3RhbnQgYml0cyBmb3IgdGhlICJmbGFncyIgZmllbGQgaW4gbGx2bTo6TWFjaE86Om1hY2hfaGVhZGVyIGFuZAorICAgICAgLy8gbGx2bTo6TWFjaE86Om1hY2hfaGVhZGVyXzY0CisgICAgICBIZWFkZXJGbGFnQml0Tm9VbmRlZmluZWRTeW1ib2xzICAgICA9IDB4MDAwMDAwMDF1LCAvLyBNSF9OT1VOREVGUworICAgICAgSGVhZGVyRmxhZ0JpdElzSW5jcmVtZW50YWxMaW5rT2JqZWN0PSAweDAwMDAwMDAydSwgLy8gTUhfSU5DUkxJTksKKyAgICAgIEhlYWRlckZsYWdCaXRJc0R5bmFtaWNMaW5rT2JqZWN0ICAgID0gMHgwMDAwMDAwNHUsIC8vIE1IX0RZTERMSU5LCisgICAgICBIZWFkZXJGbGFnQml0QmluZEF0TG9hZCAgICAgICAgICAgICA9IDB4MDAwMDAwMDh1LCAvLyBNSF9CSU5EQVRMT0FECisgICAgICBIZWFkZXJGbGFnQml0UHJlYm91bmQgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTB1LCAvLyBNSF9QUkVCT1VORAorICAgICAgSGVhZGVyRmxhZ0JpdFNwbGl0U2VnbWVudHMgICAgICAgICAgPSAweDAwMDAwMDIwdSwgLy8gTUhfU1BMSVRfU0VHUworICAgICAgSGVhZGVyRmxhZ0JpdExhenlJbml0ICAgICAgICAgICAgICAgPSAweDAwMDAwMDQwdSwgLy8gTUhfTEFaWV9JTklUCisgICAgICBIZWFkZXJGbGFnQml0VHdvTGV2ZWxOYW1lc3BhY2UgICAgICA9IDB4MDAwMDAwODB1LCAvLyBNSF9UV09MRVZFTAorICAgICAgSGVhZGVyRmxhZ0JpdEZvcmNlRmxhdE5hbWVzcGFjZSAgICAgPSAweDAwMDAwMTAwdSwgLy8gTUhfRk9SQ0VfRkxBVAorICAgICAgSGVhZGVyRmxhZ0JpdE5vTXVsdGlwbGVEZWZpbnRpb25zICAgPSAweDAwMDAwMjAwdSwgLy8gTUhfTk9NVUxUSURFRlMKKyAgICAgIEhlYWRlckZsYWdCaXROb0ZpeFByZWJpbmRpbmcgICAgICAgID0gMHgwMDAwMDQwMHUsIC8vIE1IX05PRklYUFJFQklORElORworICAgICAgSGVhZGVyRmxhZ0JpdFByZWJpbmRhYmxlICAgICAgICAgICAgPSAweDAwMDAwODAwdSwgLy8gTUhfUFJFQklOREFCTEUKKyAgICAgIEhlYWRlckZsYWdCaXRBbGxNb2R1bGVzQm91bmQgICAgICAgID0gMHgwMDAwMTAwMHUsIC8vIE1IX0FMTE1PRFNCT1VORAorICAgICAgSGVhZGVyRmxhZ0JpdFN1YnNlY3Rpb25zVmlhU3ltYm9scyAgPSAweDAwMDAyMDAwdSwgLy8gTUhfU1VCU0VDVElPTlNfVklBX1NZTUJPTFMKKyAgICAgIEhlYWRlckZsYWdCaXRDYW5vbmljYWwgICAgICAgICAgICAgID0gMHgwMDAwNDAwMHUsIC8vIE1IX0NBTk9OSUNBTAorICAgICAgSGVhZGVyRmxhZ0JpdFdlYWtEZWZpbmVzICAgICAgICAgICAgPSAweDAwMDA4MDAwdSwgLy8gTUhfV0VBS19ERUZJTkVTCisgICAgICBIZWFkZXJGbGFnQml0QmluZHNUb1dlYWsgICAgICAgICAgICA9IDB4MDAwMTAwMDB1LCAvLyBNSF9CSU5EU19UT19XRUFLCisgICAgICBIZWFkZXJGbGFnQml0QWxsb3dTdGFja0V4ZWN1dGlvbiAgICA9IDB4MDAwMjAwMDB1LCAvLyBNSF9BTExPV19TVEFDS19FWEVDVVRJT04KKyAgICAgIEhlYWRlckZsYWdCaXRSb290U2FmZSAgICAgICAgICAgICAgID0gMHgwMDA0MDAwMHUsIC8vIE1IX1JPT1RfU0FGRQorICAgICAgSGVhZGVyRmxhZ0JpdFNldFVJRFNhZmUgICAgICAgICAgICAgPSAweDAwMDgwMDAwdSwgLy8gTUhfU0VUVUlEX1NBRkUKKyAgICAgIEhlYWRlckZsYWdCaXROb1JlZXhwb3J0ZWREeWxpYnMgICAgID0gMHgwMDEwMDAwMHUsIC8vIE1IX05PX1JFRVhQT1JURURfRFlMSUJTCisgICAgICBIZWFkZXJGbGFnQml0UElFICAgICAgICAgICAgICAgICAgICA9IDB4MDAyMDAwMDB1LCAvLyBNSF9QSUUKKyAgICAgIEhlYWRlckZsYWdCaXREZWFkU3RyaXBwYWJsZUR5bGliICAgID0gMHgwMDQwMDAwMHUsIC8vIE1IX0RFQURfU1RSSVBQQUJMRV9EWUxJQgorICAgICAgCisgICAgICAvLyBDb25zdGFudHMgZm9yIHRoZSAiY21kIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6bG9hZF9jb21tYW5kCisgICAgICBMb2FkQ29tbWFuZER5bmFtaWNMaW5rZXJSZXF1aXJlZCAgICA9IDB4ODAwMDAwMDB1LCAvLyBMQ19SRVFfRFlMRAorICAgICAgTG9hZENvbW1hbmRTZWdtZW50MzIgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxdSwgLy8gTENfU0VHTUVOVAorICAgICAgTG9hZENvbW1hbmRTeW10YWIgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAydSwgLy8gTENfU1lNVEFCCisgICAgICBMb2FkQ29tbWFuZFN5bVNlZyAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDN1LCAvLyBMQ19TWU1TRUcKKyAgICAgIExvYWRDb21tYW5kVGhyZWFkICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNHUsIC8vIExDX1RIUkVBRAorICAgICAgTG9hZENvbW1hbmRVbml4VGhyZWFkICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1dSwgLy8gTENfVU5JWFRIUkVBRAorICAgICAgTG9hZENvbW1hbmRGaXhlZFZNU2hsaWJMb2FkICAgICAgICAgPSAweDAwMDAwMDA2dSwgLy8gTENfTE9BREZWTUxJQgorICAgICAgTG9hZENvbW1hbmRGaXhlZFZNU2hsaWJJZGVudCAgICAgICAgPSAweDAwMDAwMDA3dSwgLy8gTENfSURGVk1MSUIKKyAgICAgIExvYWRDb21tYW5kSWRlbnQgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOHUsIC8vIExDX0lERU5UCisgICAgICBMb2FkQ29tbWFuZEZpeGVkVk1GaWxlSW5jbHVzaW9uICAgICA9IDB4MDAwMDAwMDl1LCAvLyBMQ19GVk1GSUxFCisgICAgICBMb2FkQ29tbWFuZFByZVBhZ2UgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMEF1LCAvLyBMQ19QUkVQQUdFCisgICAgICBMb2FkQ29tbWFuZER5bmFtaWNTeW10YWJJbmZvICAgICAgICA9IDB4MDAwMDAwMEJ1LCAvLyBMQ19EWVNZTVRBQgorICAgICAgTG9hZENvbW1hbmREeWxpYkxvYWQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBDdSwgLy8gTENfTE9BRF9EWUxJQgorICAgICAgTG9hZENvbW1hbmREeWxpYklkZW50ICAgICAgICAgICAgICAgPSAweDAwMDAwMDBEdSwgLy8gTENfSURfRFlMSUIKKyAgICAgIExvYWRDb21tYW5kRHluYW1pY0xpbmtlckxvYWQgICAgICAgID0gMHgwMDAwMDAwRXUsIC8vIExDX0xPQURfRFlMSU5LRVIKKyAgICAgIExvYWRDb21tYW5kRHluYW1pY0xpbmtlcklkZW50ICAgICAgID0gMHgwMDAwMDAwRnUsIC8vIExDX0lEX0RZTElOS0VSCisgICAgICBMb2FkQ29tbWFuZER5bGliUHJlYm91bmQgICAgICAgICAgICA9IDB4MDAwMDAwMTB1LCAvLyBMQ19QUkVCT1VORF9EWUxJQgorICAgICAgTG9hZENvbW1hbmRSb3V0aW5lczMyICAgICAgICAgICAgICAgPSAweDAwMDAwMDExdSwgLy8gTENfUk9VVElORVMKKyAgICAgIExvYWRDb21tYW5kU3ViRnJhbWV3b3JrICAgICAgICAgICAgID0gMHgwMDAwMDAxMnUsIC8vIExDX1NVQl9GUkFNRVdPUksKKyAgICAgIExvYWRDb21tYW5kU3ViVW1icmVsbGEgICAgICAgICAgICAgID0gMHgwMDAwMDAxM3UsIC8vIExDX1NVQl9VTUJSRUxMQQorICAgICAgTG9hZENvbW1hbmRTdWJDbGllbnQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDE0dSwgLy8gTENfU1VCX0NMSUVOVAorICAgICAgTG9hZENvbW1hbmRTdWJMaWJyYXJ5ICAgICAgICAgICAgICAgPSAweDAwMDAwMDE1dSwgLy8gTENfU1VCX0xJQlJBUlkKKyAgICAgIExvYWRDb21tYW5kVHdvTGV2ZWxIaW50cyAgICAgICAgICAgID0gMHgwMDAwMDAxNnUsIC8vIExDX1RXT0xFVkVMX0hJTlRTCisgICAgICBMb2FkQ29tbWFuZFByZUJpbmRDaGVja3N1bSAgICAgICAgICA9IDB4MDAwMDAwMTd1LCAvLyBMQ19QUkVCSU5EX0NLU1VNCisgICAgICBMb2FkQ29tbWFuZER5bGliTG9hZFdlYWsgICAgICAgICAgICA9IDB4ODAwMDAwMTh1LCAvLyBMQ19MT0FEX1dFQUtfRFlMSUIKKyAgICAgIExvYWRDb21tYW5kU2VnbWVudDY0ICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxOXUsIC8vIExDX1NFR01FTlRfNjQKKyAgICAgIExvYWRDb21tYW5kUm91dGluZXM2NCAgICAgICAgICAgICAgID0gMHgwMDAwMDAxQXUsIC8vIExDX1JPVVRJTkVTXzY0CisgICAgICBMb2FkQ29tbWFuZFVVSUQgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMUJ1LCAvLyBMQ19VVUlECisgICAgICBMb2FkQ29tbWFuZFJ1bnBhdGggICAgICAgICAgICAgICAgICA9IDB4ODAwMDAwMUN1LCAvLyBMQ19SUEFUSAorICAgICAgTG9hZENvbW1hbmRDb2RlU2lnbmF0dXJlICAgICAgICAgICAgPSAweDAwMDAwMDFEdSwgLy8gTENfQ09ERV9TSUdOQVRVUkUKKyAgICAgIExvYWRDb21tYW5kU2VnbWVudFNwbGl0SW5mbyAgICAgICAgID0gMHgwMDAwMDAxRXUsIC8vIExDX1NFR01FTlRfU1BMSVRfSU5GTworICAgICAgTG9hZENvbW1hbmREeWxpYlJlZXhwb3J0ICAgICAgICAgICAgPSAweDgwMDAwMDFGdSwgLy8gTENfUkVFWFBPUlRfRFlMSUIKKyAgICAgIExvYWRDb21tYW5kRHlsaWJMYXp5TG9hZCAgICAgICAgICAgID0gMHgwMDAwMDAyMHUsIC8vIExDX0xBWllfTE9BRF9EWUxJQgorICAgICAgTG9hZENvbW1hbmRFbmNyeXB0aW9uSW5mbyAgICAgICAgICAgPSAweDAwMDAwMDIxdSwgLy8gTENfRU5DUllQVElPTl9JTkZPCisgICAgICBMb2FkQ29tbWFuZER5bmFtaWNMaW5rZXJJbmZvICAgICAgICA9IDB4MDAwMDAwMjJ1LCAvLyBMQ19EWUxEX0lORk8KKyAgICAgIExvYWRDb21tYW5kRHluYW1pY0xpbmtlckluZm9Pbmx5ICAgID0gMHg4MDAwMDAyMnUsIC8vIExDX0RZTERfSU5GT19PTkxZCisgICAgICBMb2FkQ29tbWFuZER5bGliTG9hZFVwd2FyZCAgICAgICAgICA9IDB4ODAwMDAwMjN1LCAvLyBMQ19MT0FEX1VQV0FSRF9EWUxJQgorICAgICAgCisgICAgICAvLyBDb25zdGFudCBiaXRzIGZvciB0aGUgImZsYWdzIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6c2VnbWVudF9jb21tYW5kCisgICAgICBTZWdtZW50Q29tbWFuZEZsYWdCaXRIaWdoVk0gICAgICAgICAgICAgPSAweDF1LCAvLyBTR19ISUdIVk0KKyAgICAgIFNlZ21lbnRDb21tYW5kRmxhZ0JpdEZpeGVkVk1MaWJyYXJ5ICAgICA9IDB4MnUsIC8vIFNHX0ZWTUxJQgorICAgICAgU2VnbWVudENvbW1hbmRGbGFnQml0Tm9SZWxvY2F0aW9ucyAgICAgID0gMHg0dSwgLy8gU0dfTk9SRUxPQworICAgICAgU2VnbWVudENvbW1hbmRGbGFnQml0UHJvdGVjdGVkVmVyc2lvbjEgID0gMHg4dSwgLy8gU0dfUFJPVEVDVEVEX1ZFUlNJT05fMQorCisKKyAgICAgIC8vIENvbnN0YW50IG1hc2tzIGZvciB0aGUgImZsYWdzIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6c2VjdGlvbiBhbmQKKyAgICAgIC8vIGxsdm06Ok1hY2hPOjpzZWN0aW9uXzY0CisgICAgICBTZWN0aW9uRmxhZ01hc2tTZWN0aW9uVHlwZSAgICAgID0gMHgwMDAwMDBmZnUsIC8vIFNFQ1RJT05fVFlQRQorICAgICAgU2VjdGlvbkZsYWdNYXNrQWxsQXR0cmlidXRlcyAgICA9IDB4ZmZmZmZmMDB1LCAvLyBTRUNUSU9OX0FUVFJJQlVURVMKKyAgICAgIFNlY3Rpb25GbGFnTWFza1VzZXJBdHRyaWJ1dGVzICAgPSAweGZmMDAwMDAwdSwgLy8gU0VDVElPTl9BVFRSSUJVVEVTX1VTUgorICAgICAgU2VjdGlvbkZsYWdNYXNrU3lzdGVtQXR0cmlidXRlcyA9IDB4MDBmZmZmMDB1LCAvLyBTRUNUSU9OX0FUVFJJQlVURVNfU1lTCisKKyAgICAgIC8vIENvbnN0YW50IG1hc2tzIGZvciB0aGUgImZsYWdzWzc6MF0iIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpzZWN0aW9uIGFuZAorICAgICAgLy8gbGx2bTo6TWFjaE86OnNlY3Rpb25fNjQgKG1hc2sgImZsYWdzIiB3aXRoIFNFQ1RJT05fVFlQRSkKKyAgICAgIFNlY3Rpb25UeXBlUmVndWxhciAgICAgICAgICAgICAgICAgICAgPSAweDAwdSwgLy8gU19SRUdVTEFSCisgICAgICBTZWN0aW9uVHlwZVplcm9GaWxsICAgICAgICAgICAgICAgICAgID0gMHgwMXUsIC8vIFNfWkVST0ZJTEwKKyAgICAgIFNlY3Rpb25UeXBlQ1N0cmluZ0xpdGVyYWxzICAgICAgICAgICAgPSAweDAydSwgLy8gU19DU1RSSU5HX0xJVEVSQUxTCisgICAgICBTZWN0aW9uVHlwZTRCeXRlTGl0ZXJhbHMgICAgICAgICAgICAgID0gMHgwM3UsIC8vIFNfNEJZVEVfTElURVJBTFMKKyAgICAgIFNlY3Rpb25UeXBlOEJ5dGVMaXRlcmFscyAgICAgICAgICAgICAgPSAweDA0dSwgLy8gU184QllURV9MSVRFUkFMUworICAgICAgU2VjdGlvblR5cGVMaXRlcmFsUG9pbnRlcnMgICAgICAgICAgICA9IDB4MDV1LCAvLyBTX0xJVEVSQUxfUE9JTlRFUlMKKyAgICAgIFNlY3Rpb25UeXBlTm9uTGF6eVN5bWJvbFBvaW50ZXJzICAgICAgPSAweDA2dSwgLy8gU19OT05fTEFaWV9TWU1CT0xfUE9JTlRFUlMKKyAgICAgIFNlY3Rpb25UeXBlTGF6eVN5bWJvbFBvaW50ZXJzICAgICAgICAgPSAweDA3dSwgLy8gU19MQVpZX1NZTUJPTF9QT0lOVEVSUworICAgICAgU2VjdGlvblR5cGVTeW1ib2xTdHVicyAgICAgICAgICAgICAgICA9IDB4MDh1LCAvLyBTX1NZTUJPTF9TVFVCUworICAgICAgU2VjdGlvblR5cGVNb2R1bGVJbml0RnVuY3Rpb25Qb2ludGVycyA9IDB4MDl1LCAvLyBTX01PRF9JTklUX0ZVTkNfUE9JTlRFUlMKKyAgICAgIFNlY3Rpb25UeXBlTW9kdWxlVGVybUZ1bmN0aW9uUG9pbnRlcnMgPSAweDBhdSwgLy8gU19NT0RfVEVSTV9GVU5DX1BPSU5URVJTCisgICAgICBTZWN0aW9uVHlwZUNvYWxlc2NlZCAgICAgICAgICAgICAgICAgID0gMHgwYnUsIC8vIFNfQ09BTEVTQ0VECisgICAgICBTZWN0aW9uVHlwZVplcm9GaWxsTGFyZ2UgICAgICAgICAgICAgID0gMHgwY3UsIC8vIFNfR0JfWkVST0ZJTEwKKyAgICAgIFNlY3Rpb25UeXBlSW50ZXJwb3NpbmcgICAgICAgICAgICAgICAgPSAweDBkdSwgLy8gU19JTlRFUlBPU0lORworICAgICAgU2VjdGlvblR5cGUxNkJ5dGVMaXRlcmFscyAgICAgICAgICAgICA9IDB4MGV1LCAvLyBTXzE2QllURV9MSVRFUkFMUworICAgICAgU2VjdGlvblR5cGVEVHJhY2VPYmplY3RGb3JtYXQgICAgICAgICA9IDB4MGZ1LCAvLyBTX0RUUkFDRV9ET0YKKyAgICAgIFNlY3Rpb25UeXBlTGF6eUR5bGliU3ltYm9sUG9pbnRlcnMgICAgPSAweDEwdSwgLy8gU19MQVpZX0RZTElCX1NZTUJPTF9QT0lOVEVSUworCisgICAgICAvLyBDb25zdGFudCBtYXNrcyBmb3IgdGhlICJmbGFnc1szMToyNF0iIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpzZWN0aW9uIGFuZAorICAgICAgLy8gbGx2bTo6TWFjaE86OnNlY3Rpb25fNjQgKG1hc2sgImZsYWdzIiB3aXRoIFNFQ1RJT05fQVRUUklCVVRFU19VU1IpCisgICAgICBTZWN0aW9uQXR0clVzZXJQdXJlSW5zdHJ1Y3Rpb25zICAgICAgID0gMHg4MDAwMDAwMHUsIC8vIFNfQVRUUl9QVVJFX0lOU1RSVUNUSU9OUworICAgICAgU2VjdGlvbkF0dHJVc2VyTm9UYWJsZU9mQ29udGVudHMgICAgICA9IDB4NDAwMDAwMDB1LCAvLyBTX0FUVFJfTk9fVE9DCisgICAgICBTZWN0aW9uQXR0clVzZXJDYW5TdHJpcFN0YXRpY1N5bWJvbHMgID0gMHgyMDAwMDAwMHUsIC8vIFNfQVRUUl9TVFJJUF9TVEFUSUNfU1lNUworICAgICAgU2VjdGlvbkF0dHJVc2VyTm9EZWFkU3RyaXAgICAgICAgICAgICA9IDB4MTAwMDAwMDB1LCAvLyBTX0FUVFJfTk9fREVBRF9TVFJJUAorICAgICAgU2VjdGlvbkF0dHJVc2VyTGl2ZVN1cHBvcnQgICAgICAgICAgICA9IDB4MDgwMDAwMDB1LCAvLyBTX0FUVFJfTElWRV9TVVBQT1JUCisgICAgICBTZWN0aW9uQXR0clVzZXJTZWxmTW9kaWZ5aW5nQ29kZSAgICAgID0gMHgwNDAwMDAwMHUsIC8vIFNfQVRUUl9TRUxGX01PRElGWUlOR19DT0RFCisgICAgICBTZWN0aW9uQXR0clVzZXJEZWJ1ZyAgICAgICAgICAgICAgICAgID0gMHgwMjAwMDAwMHUsIC8vIFNfQVRUUl9ERUJVRworCisgICAgICAvLyBDb25zdGFudCBtYXNrcyBmb3IgdGhlICJmbGFnc1syMzo4XSIgZmllbGQgaW4gbGx2bTo6TWFjaE86OnNlY3Rpb24gYW5kCisgICAgICAvLyBsbHZtOjpNYWNoTzo6c2VjdGlvbl82NCAobWFzayAiZmxhZ3MiIHdpdGggU0VDVElPTl9BVFRSSUJVVEVTX1NZUykKKyAgICAgIFNlY3Rpb25BdHRyU3l0ZW1Tb21lSW5zdHJ1Y3Rpb25zICAgICAgPSAweDAwMDAwNDAwdSwgLy8gU19BVFRSX1NPTUVfSU5TVFJVQ1RJT05TCisgICAgICBTZWN0aW9uQXR0clN5dGVtSGFzRXh0ZXJuYWxSZWxvY2F0aW9ucz0gMHgwMDAwMDIwMHUsIC8vIFNfQVRUUl9FWFRfUkVMT0MKKyAgICAgIFNlY3Rpb25BdHRyU3l0ZW1IYXNMb2NhbFJlbG9jYXRpb25zICAgPSAweDAwMDAwMTAwdSwgLy8gU19BVFRSX0xPQ19SRUxPQworCisgICAgICBJbmRpcmVjdFN5bWJvbExvY2FsICAgICAgICAgICAgICAgICAgID0gMHg4MDAwMDAwMHUsIC8vIElORElSRUNUX1NZTUJPTF9MT0NBTAorICAgICAgSW5kaXJlY3RTeW1ib2xBYnNvbHV0ZSAgICAgICAgICAgICAgICA9IDB4NDAwMDAwMDB1LCAvLyBJTkRJUkVDVF9TWU1CT0xfQUJTCisKKyAgICAgIFJlYmFzZVR5cGVQb2ludGVyICAgICAgICAgICAgICAgICAgICAgPSAxdSwgLy8gUkVCQVNFX1RZUEVfUE9JTlRFUgorICAgICAgUmViYXNlVHlwZVRleHRBYnNvbHV0ZTMyICAgICAgICAgICAgICA9IDJ1LCAvLyBSRUJBU0VfVFlQRV9URVhUX0FCU09MVVRFMzIKKyAgICAgIFJlYmFzZVR5cGVUZXh0UENSZWxhdGl2ZTMyCSAgICA9IDN1LCAvLyBSRUJBU0VfVFlQRV9URVhUX1BDUkVMMzIKKworICAgICAgUmViYXNlT3Bjb2RlTWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweEYwdSwgLy8gUkVCQVNFX09QQ09ERV9NQVNLCisgICAgICBSZWJhc2VJbW1lZGlhdGVNYXNrICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEZ1LCAvLyBSRUJBU0VfSU1NRURJQVRFX01BU0sKKyAgICAgIFJlYmFzZU9wY29kZURvbmUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMHUsIC8vIFJFQkFTRV9PUENPREVfRE9ORQorICAgICAgUmViYXNlT3Bjb2RlU2V0VHlwZUltbWVkaWF0ZSAgICAgICAgICAgICAgPSAweDEwdSwgLy8gUkVCQVNFX09QQ09ERV9TRVRfVFlQRV9JTU0KKyAgICAgIFJlYmFzZU9wY29kZVNldFNlZ21lbnRBbmRPZmZzZXRVTEVCCT0gMHgyMHUsIC8vIFJFQkFTRV9PUENPREVfU0VUX1NFR01FTlRfQU5EX09GRlNFVF9VTEVCCisgICAgICBSZWJhc2VPcGNvZGVBZGRBZGRyZXNzVUxFQiAgICAgICAgICAgICAgICA9IDB4MzB1LCAvLyBSRUJBU0VfT1BDT0RFX0FERF9BRERSX1VMRUIKKyAgICAgIFJlYmFzZU9wY29kZUFkZEFkZHJlc3NJbW1lZGlhdGVTY2FsZWQJPSAweDQwdSwgLy8gUkVCQVNFX09QQ09ERV9BRERfQUREUl9JTU1fU0NBTEVECisgICAgICBSZWJhc2VPcGNvZGVEb1JlYmFzZUltbWVkaWF0ZVRpbWVzCT0gMHg1MHUsIC8vIFJFQkFTRV9PUENPREVfRE9fUkVCQVNFX0lNTV9USU1FUworICAgICAgUmViYXNlT3Bjb2RlRG9SZWJhc2VVTEVCVGltZXMgICAgICAgICAgICAgPSAweDYwdSwgLy8gUkVCQVNFX09QQ09ERV9ET19SRUJBU0VfVUxFQl9USU1FUworICAgICAgUmViYXNlT3Bjb2RlRG9SZWJhc2VBZGRBZGRyZXNzVUxFQiAgICAgICAgPSAweDcwdSwgLy8gUkVCQVNFX09QQ09ERV9ET19SRUJBU0VfQUREX0FERFJfVUxFQgorICAgICAgUmViYXNlT3Bjb2RlRG9SZWJhc2VVTEVCVGltZXNTa2lwcGluZ1VMRUIgPSAweDgwdSwgLy8gUkVCQVNFX09QQ09ERV9ET19SRUJBU0VfVUxFQl9USU1FU19TS0lQUElOR19VTEVCCisKKworICAgICAgQmluZFR5cGVQb2ludGVyICAgICAgICAgICA9IDF1LCAvLyBCSU5EX1RZUEVfUE9JTlRFUgorICAgICAgQmluZFR5cGVUZXh0QWJzb2x1dGUzMgk9IDJ1LCAvLyBCSU5EX1RZUEVfVEVYVF9BQlNPTFVURTMyCisgICAgICBCaW5kVHlwZVRleHRQQ1JlbGF0aXZlMzIJPSAzdSwgLy8gQklORF9UWVBFX1RFWFRfUENSRUwzMgorCisgICAgICBCaW5kU3BlY2lhbER5bGliU2VsZiAgICAgICAgICAgID0gIDB1LCAvLyBCSU5EX1NQRUNJQUxfRFlMSUJfU0VMRgorICAgICAgQmluZFNwZWNpYWxEeWxpYk1haW5FeGVjdXRhYmxlICA9IC0xdSwgLy8gQklORF9TUEVDSUFMX0RZTElCX01BSU5fRVhFQ1VUQUJMRQorICAgICAgQmluZFNwZWNpYWxEeWxpYkZsYXRMb29rdXAgICAgICA9IC0ydSwgLy8gQklORF9TUEVDSUFMX0RZTElCX0ZMQVRfTE9PS1VQCisKKyAgICAgIEJpbmRTeW1ib2xGbGFnc1dlYWtJbXBvcnQgICAgICAgICA9IDB4MXUsIC8vIEJJTkRfU1lNQk9MX0ZMQUdTX1dFQUtfSU1QT1JUCisgICAgICBCaW5kU3ltYm9sRmxhZ3NOb25XZWFrRGVmaW5pdGlvbgk9IDB4OHUsIC8vIEJJTkRfU1lNQk9MX0ZMQUdTX05PTl9XRUFLX0RFRklOSVRJT04KKworICAgICAgQmluZE9wY29kZU1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweEYwdSwgLy8gQklORF9PUENPREVfTUFTSworICAgICAgQmluZEltbWVkaWF0ZU1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBGdSwgLy8gQklORF9JTU1FRElBVEVfTUFTSworICAgICAgQmluZE9wY29kZURvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwdSwgLy8gQklORF9PUENPREVfRE9ORQorICAgICAgQmluZE9wY29kZVNldER5bGliT3JkaW5hbEltbWVkaWF0ZSAgICAgICAgPSAweDEwdSwgLy8gQklORF9PUENPREVfU0VUX0RZTElCX09SRElOQUxfSU1NCisgICAgICBCaW5kT3Bjb2RlU2V0RHlsaWJPcmRpbmFsVUxFQiAgICAgICAgICAgICA9IDB4MjB1LCAvLyBCSU5EX09QQ09ERV9TRVRfRFlMSUJfT1JESU5BTF9VTEVCCisgICAgICBCaW5kT3Bjb2RlU2V0RHlsaWJTcGVjaWFsSW1tZWRpYXRlCT0gMHgzMHUsIC8vIEJJTkRfT1BDT0RFX1NFVF9EWUxJQl9TUEVDSUFMX0lNTQorICAgICAgQmluZE9wY29kZVNldFN5bWJvbFRyYWlsaW5nRmxhZ3NJbW1lZGlhdGUJPSAweDQwdSwgLy8gQklORF9PUENPREVfU0VUX1NZTUJPTF9UUkFJTElOR19GTEFHU19JTU0KKyAgICAgIEJpbmRPcGNvZGVTZXRUeXBlSW1tZWRpYXRlCQk9IDB4NTB1LCAvLyBCSU5EX09QQ09ERV9TRVRfVFlQRV9JTU0KKyAgICAgIEJpbmRPcGNvZGVTZXRBcHBlbmRTTEVCICAgICAgICAgICAgICAgICAgID0gMHg2MHUsIC8vIEJJTkRfT1BDT0RFX1NFVF9BRERFTkRfU0xFQgorICAgICAgQmluZE9wY29kZVNldFNlZ21lbnRBbmRPZmZzZXRVTEVCICAgICAgICAgPSAweDcwdSwgLy8gQklORF9PUENPREVfU0VUX1NFR01FTlRfQU5EX09GRlNFVF9VTEVCCisgICAgICBCaW5kT3Bjb2RlQWRkQWRkcmVzc1VMRUIgICAgICAgICAgICAgICAgICA9IDB4ODB1LCAvLyBCSU5EX09QQ09ERV9BRERfQUREUl9VTEVCCisgICAgICBCaW5kT3Bjb2RlRG9CaW5kICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OTB1LCAvLyBCSU5EX09QQ09ERV9ET19CSU5ECisgICAgICBCaW5kT3Bjb2RlRG9CaW5kQWRkQWRkcmVzc1VMRUIJCT0gMHhBMHUsIC8vIEJJTkRfT1BDT0RFX0RPX0JJTkRfQUREX0FERFJfVUxFQgorICAgICAgQmluZE9wY29kZURvQmluZEFkZEFkZHJlc3NJbW1lZGlhdGVTY2FsZWQJPSAweEIwdSwgLy8gQklORF9PUENPREVfRE9fQklORF9BRERfQUREUl9JTU1fU0NBTEVECisgICAgICBCaW5kT3Bjb2RlRG9CaW5kVUxFQlRpbWVzU2tpcHBpbmdVTEVCICAgICA9IDB4QzB1LCAvLyBCSU5EX09QQ09ERV9ET19CSU5EX1VMRUJfVElNRVNfU0tJUFBJTkdfVUxFQgorCisgICAgICBFeHBvcnRTeW1ib2xGbGFnc0tpbmRNYXNrICAgICAgICAgICA9IDB4MDN1LCAvLyBFWFBPUlRfU1lNQk9MX0ZMQUdTX0tJTkRfTUFTSworICAgICAgRXhwb3J0U3ltYm9sRmxhZ3NLaW5kUmVndWxhcgkgID0gMHgwMHUsIC8vIEVYUE9SVF9TWU1CT0xfRkxBR1NfS0lORF9SRUdVTEFSCisgICAgICBFeHBvcnRTeW1ib2xGbGFnc0tpbmRUaHJlYWRMb2NhbCAgICA9IDB4MDF1LCAvLyBFWFBPUlRfU1lNQk9MX0ZMQUdTX0tJTkRfVEhSRUFEX0xPQ0FMCisgICAgICBFeHBvcnRTeW1ib2xGbGFnc1dlYWtEZWZpbml0aW9uICAgICA9IDB4MDR1LCAvLyBFWFBPUlRfU1lNQk9MX0ZMQUdTX1dFQUtfREVGSU5JVElPTgorICAgICAgRXhwb3J0U3ltYm9sRmxhZ3NJbmRpcmVjdERlZmluaXRpb24gPSAweDA4dSwgLy8gRVhQT1JUX1NZTUJPTF9GTEFHU19JTkRJUkVDVF9ERUZJTklUSU9OCisgICAgICBFeHBvcnRTeW1ib2xGbGFnc0hhc1NwZWNpYWxpemF0aW9ucyA9IDB4MTB1LCAvLyBFWFBPUlRfU1lNQk9MX0ZMQUdTX0hBU19TUEVDSUFMSVpBVElPTlMKKworCisgICAgICAvLyBDb25zdGFudCBtYXNrcyBmb3IgdGhlICJuX3R5cGUiIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpubGlzdCBhbmQKKyAgICAgIC8vIGxsdm06Ok1hY2hPOjpubGlzdF82NAorICAgICAgTmxpc3RNYXNrU3RhYiAgICAgICAgICAgICA9IDB4ZTAsIC8vIE5fU1RBQgorICAgICAgTmxpc3RNYXNrUHJpdmF0ZUV4dGVybmFsCT0gMHgxMCwgLy8gTl9QRVhUCisgICAgICBObGlzdE1hc2tUeXBlICAgICAgICAgICAgID0gMHgwZSwgLy8gTl9UWVBFCisgICAgICBObGlzdE1hc2tFeHRlcm5hbCAgICAgICAgID0gMHgwMSwgLy8gTl9FWFQKKworICAgICAgLy8gQ29uc3RhbnRzIGZvciB0aGUgIm5fdHlwZSAmIE5fVFlQRSIgbGx2bTo6TWFjaE86Om5saXN0IGFuZAorICAgICAgLy8gbGx2bTo6TWFjaE86Om5saXN0XzY0CisgICAgICBOTGlzdFR5cGVVbmRlZmluZWQgICAgICAgICAgPSAweDB1LCAvLyBOX1VOREYKKyAgICAgIE5MaXN0VHlwZUFic29sdXRlICAgICAgICAgICA9IDB4MnUsIC8vIE5fQUJTCisgICAgICBOTGlzdFR5cGVTZWN0aW9uICAgICAgICAgICAgPSAweGV1LCAvLyBOX1NFQ1QKKyAgICAgIE5MaXN0VHlwZVByZWJvdW5kVW5kZWZpbmVkICA9IDB4Y3UsIC8vIE5fUEJVRAorICAgICAgTkxpc3RUeXBlSW5kaXJlY3QgICAgICAgICAgID0gMHhhdSwgLy8gTl9JTkRSCisKKyAgICAgIC8vIENvbnN0YW50IG1hc2tzIGZvciB0aGUgIm5fc2VjdCIgZmllbGQgaW4gbGx2bTo6TWFjaE86Om5saXN0IGFuZAorICAgICAgLy8gbGx2bTo6TWFjaE86Om5saXN0XzY0CisgICAgICBOTGlzdFNlY3Rpb25Ob1NlY3Rpb24gICAgID0gMHUsIC8vIE5PX1NFQ1QKKyAgICAgIE5MaXN0U2VjdGlvbk1heFNlY3Rpb24gICAgPSAweGZmdSwgLy8gTUFYX1NFQ1QKKworICAgICAgLy8gQ29uc3RhbnQgdmFsdWVzIGZvciB0aGUgIm5fdHlwZSIgZmllbGQgaW4gbGx2bTo6TWFjaE86Om5saXN0IGFuZAorICAgICAgLy8gbGx2bTo6TWFjaE86Om5saXN0XzY0IHdoZW4gIihuX3R5cGUgJiBObGlzdE1hc2tTdGFiKSAhPSAwIgorICAgICAgU3RhYkdsb2JhbFN5bWJvbCAgICAgICAgICA9IDB4MjB1LCAgLy8gTl9HU1lNCQorICAgICAgU3RhYkZ1bmN0aW9uTmFtZSAgICAgICAgICA9IDB4MjJ1LCAgLy8gTl9GTkFNRQkKKyAgICAgIFN0YWJGdW5jdGlvbiAgICAgICAgICAgICAgPSAweDI0dSwgIC8vIE5fRlVOCQorICAgICAgU3RhYlN0YXRpY1N5bWJvbCAgICAgICAgICA9IDB4MjZ1LCAgLy8gTl9TVFNZTQkKKyAgICAgIFN0YWJMb2NhbENvbW1vbiAgICAgICAgICAgPSAweDI4dSwgIC8vIE5fTENTWU0JCisgICAgICBTdGFiQmVnaW5TeW1ib2wgICAgICAgICAgID0gMHgyRXUsICAvLyBOX0JOU1lNICAgCisgICAgICBTdGFiU291cmNlRmlsZU9wdGlvbnMgICAgID0gMHgzQ3UsICAvLyBOX09QVAkKKyAgICAgIFN0YWJSZWdpc3RlclN5bWJvbCAgICAgICAgPSAweDQwdSwgIC8vIE5fUlNZTQkKKyAgICAgIFN0YWJTb3VyY2VMaW5lICAgICAgICAgICAgPSAweDQ0dSwgIC8vIE5fU0xJTkUJCisgICAgICBTdGFiRW5kU3ltYm9sICAgICAgICAgICAgID0gMHg0RXUsICAvLyBOX0VOU1lNICAgCisgICAgICBTdGFiU3RydWN0dXJlVHlwZSAgICAgICAgID0gMHg2MHUsICAvLyBOX1NTWU0JCisgICAgICBTdGFiU291cmNlRmlsZU5hbWUgICAgICAgID0gMHg2NHUsICAvLyBOX1NPCQorICAgICAgU3RhYk9iamVjdEZpbGVOYW1lICAgICAgICA9IDB4NjZ1LCAgLy8gTl9PU08JCisgICAgICBTdGFiTG9jYWxTeW1ib2wgICAgICAgICAgID0gMHg4MHUsICAvLyBOX0xTWU0JCisgICAgICBTdGFiQmVnaW5JbmNsdWRlRmlsZU5hbWUgID0gMHg4MnUsICAvLyBOX0JJTkNMCQorICAgICAgU3RhYkluY2x1ZGVGaWxlTmFtZSAgICAgICA9IDB4ODR1LCAgLy8gTl9TT0wJCisgICAgICBTdGFiQ29tcGlsZXJQYXJhbWV0ZXJzICAgID0gMHg4NnUsICAvLyBOX1BBUkFNUyAgCisgICAgICBTdGFiQ29tcGlsZXJWZXJzaW9uICAgICAgID0gMHg4OHUsICAvLyBOX1ZFUlNJT04gCisgICAgICBTdGFiQ29tcGlsZXJPcHRMZXZlbCAgICAgID0gMHg4QXUsICAvLyBOX09MRVZFTCAgCisgICAgICBTdGFiUGFyYW1ldGVyICAgICAgICAgICAgID0gMHhBMHUsICAvLyBOX1BTWU0JCisgICAgICBTdGFiRW5kSW5jbHVkZUZpbGUgICAgICAgID0gMHhBMnUsICAvLyBOX0VJTkNMCQorICAgICAgU3RhYkFsdGVybmF0ZUVudHJ5ICAgICAgICA9IDB4QTR1LCAgLy8gTl9FTlRSWQkKKyAgICAgIFN0YWJMZWZ0QnJhY2tldCAgICAgICAgICAgPSAweEMwdSwgIC8vIE5fTEJSQUMJCisgICAgICBTdGFiRGVsZXRlZEluY2x1ZGVGaWxlICAgID0gMHhDMnUsICAvLyBOX0VYQ0wJCisgICAgICBTdGFiUmlnaHRCcmFja2V0ICAgICAgICAgID0gMHhFMHUsICAvLyBOX1JCUkFDCQorICAgICAgU3RhYkJlZ2luQ29tbW9uICAgICAgICAgICA9IDB4RTJ1LCAgLy8gTl9CQ09NTQkKKyAgICAgIFN0YWJFbmRDb21tb24gICAgICAgICAgICAgPSAweEU0dSwgIC8vIE5fRUNPTU0JCisgICAgICBTdGFiRW5kQ29tbW9uTG9jYWwgICAgICAgID0gMHhFOHUsICAvLyBOX0VDT01MCQorICAgICAgU3RhYkxlbmd0aCAgICAgICAgICAgICAgICA9IDB4RkV1ICAgLy8gTl9MRU5HCQorCisgICAgfTsKKyAgICAKKyAgICAvLyBTdHJ1Y3RzIGZyb20gPG1hY2gtby9sb2FkZXIuaD4KKyAgICAKKyAgICBzdHJ1Y3QgbWFjaF9oZWFkZXIgeworICAgICAgdWludDMyX3QgbWFnaWM7CisgICAgICB1aW50MzJfdCBjcHV0eXBlOworICAgICAgdWludDMyX3QgY3B1c3VidHlwZTsKKyAgICAgIHVpbnQzMl90IGZpbGV0eXBlOworICAgICAgdWludDMyX3QgbmNtZHM7CisgICAgICB1aW50MzJfdCBzaXplb2ZjbWRzOworICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgfTsKKworICAgIHN0cnVjdCBtYWNoX2hlYWRlcl82NCB7CisgICAgICB1aW50MzJfdCBtYWdpYzsKKyAgICAgIHVpbnQzMl90IGNwdXR5cGU7CisgICAgICB1aW50MzJfdCBjcHVzdWJ0eXBlOworICAgICAgdWludDMyX3QgZmlsZXR5cGU7CisgICAgICB1aW50MzJfdCBuY21kczsKKyAgICAgIHVpbnQzMl90IHNpemVvZmNtZHM7CisgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgIHVpbnQzMl90IHJlc2VydmVkOworICAgIH07CisKKyAgICBzdHJ1Y3QgbG9hZF9jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgfTsKKworICAgIHN0cnVjdCBzZWdtZW50X2NvbW1hbmQgeworICAgICAgdWludDMyX3QgY21kOworICAgICAgdWludDMyX3QgY21kc2l6ZTsKKyAgICAgIGNoYXIgc2VnbmFtZVsxNl07CisgICAgICB1aW50MzJfdCB2bWFkZHI7CisgICAgICB1aW50MzJfdCB2bXNpemU7CisgICAgICB1aW50MzJfdCBmaWxlb2ZmOworICAgICAgdWludDMyX3QgZmlsZXNpemU7CisgICAgICB1aW50MzJfdCBtYXhwcm90OworICAgICAgdWludDMyX3QgaW5pdHByb3Q7CisgICAgICB1aW50MzJfdCBuc2VjdHM7CisgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICB9OworCisgICAgc3RydWN0IHNlZ21lbnRfY29tbWFuZF82NCB7CisgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICB1aW50MzJfdCBjbWRzaXplOworICAgICAgY2hhciBzZWduYW1lWzE2XTsKKyAgICAgIHVpbnQ2NF90IHZtYWRkcjsKKyAgICAgIHVpbnQ2NF90IHZtc2l6ZTsKKyAgICAgIHVpbnQ2NF90IGZpbGVvZmY7CisgICAgICB1aW50NjRfdCBmaWxlc2l6ZTsKKyAgICAgIHVpbnQzMl90IG1heHByb3Q7CisgICAgICB1aW50MzJfdCBpbml0cHJvdDsKKyAgICAgIHVpbnQzMl90IG5zZWN0czsKKyAgICAgIHVpbnQzMl90IGZsYWdzOworICAgIH07CisKKyAgICBzdHJ1Y3Qgc2VjdGlvbiB7CisgICAgICBjaGFyIHNlY3RuYW1lWzE2XTsKKyAgICAgIGNoYXIgc2VnbmFtZVsxNl07CisgICAgICB1aW50MzJfdCBhZGRyOworICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgIHVpbnQzMl90IGFsaWduOworICAgICAgdWludDMyX3QgcmVsb2ZmOworICAgICAgdWludDMyX3QgbnJlbG9jOworICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICB1aW50MzJfdCByZXNlcnZlZDE7CisgICAgICB1aW50MzJfdCByZXNlcnZlZDI7CisgICAgfTsKKworICAgIHN0cnVjdCBzZWN0aW9uXzY0IHsKKyAgICAgIGNoYXIgc2VjdG5hbWVbMTZdOworICAgICAgY2hhciBzZWduYW1lWzE2XTsKKyAgICAgIHVpbnQ2NF90IGFkZHI7CisgICAgICB1aW50NjRfdCBzaXplOworICAgICAgdWludDMyX3Qgb2Zmc2V0OworICAgICAgdWludDMyX3QgYWxpZ247CisgICAgICB1aW50MzJfdCByZWxvZmY7CisgICAgICB1aW50MzJfdCBucmVsb2M7CisgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgIHVpbnQzMl90IHJlc2VydmVkMTsKKyAgICAgIHVpbnQzMl90IHJlc2VydmVkMjsKKyAgICAgIHVpbnQzMl90IHJlc2VydmVkMzsKKyAgICB9OworCisgICAgc3RydWN0IGZ2bWxpYiB7CisgICAgICB1aW50MzJfdCBuYW1lOworICAgICAgdWludDMyX3QgbWlub3JfdmVyc2lvbjsKKyAgICAgIHVpbnQzMl90IGhlYWRlcl9hZGRyOworICAgIH07CisKKyAgICBzdHJ1Y3QgZnZtbGliX2NvbW1hbmQgeworICAgICAgdWludDMyX3QgIGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICBzdHJ1Y3QgZnZtbGliIGZ2bWxpYjsKKyAgICB9OworCisgICAgc3RydWN0IGR5bGliIHsKKyAgICAgIHVpbnQzMl90IG5hbWU7CisgICAgICB1aW50MzJfdCB0aW1lc3RhbXA7CisgICAgICB1aW50MzJfdCBjdXJyZW50X3ZlcnNpb247CisgICAgICB1aW50MzJfdCBjb21wYXRpYmlsaXR5X3ZlcnNpb247CisgICAgfTsKKworICAgIHN0cnVjdCBkeWxpYl9jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICBzdHJ1Y3QgZHlsaWIgZHlsaWI7CisgICAgfTsKKworICAgIHN0cnVjdCBzdWJfZnJhbWV3b3JrX2NvbW1hbmQgeworICAgICAgdWludDMyX3QgY21kOworICAgICAgdWludDMyX3QgY21kc2l6ZTsKKyAgICAgIHVpbnQzMl90IHVtYnJlbGxhOworICAgIH07CisKKyAgICBzdHJ1Y3Qgc3ViX2NsaWVudF9jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50MzJfdCBjbGllbnQ7CisgICAgfTsKKworICAgIHN0cnVjdCBzdWJfdW1icmVsbGFfY29tbWFuZCB7CisgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICB1aW50MzJfdCBjbWRzaXplOworICAgICAgdWludDMyX3Qgc3ViX3VtYnJlbGxhOworICAgIH07CisKKyAgICBzdHJ1Y3Qgc3ViX2xpYnJhcnlfY29tbWFuZCB7CisgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICB1aW50MzJfdCBjbWRzaXplOworICAgICAgdWludDMyX3Qgc3ViX2xpYnJhcnk7CisgICAgfTsKKworICAgIHN0cnVjdCBwcmVib3VuZF9keWxpYl9jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50MzJfdCBuYW1lOworICAgICAgdWludDMyX3Qgbm1vZHVsZXM7CisgICAgICB1aW50MzJfdCBsaW5rZWRfbW9kdWxlczsKKyAgICB9OworCisgICAgc3RydWN0IGR5bGlua2VyX2NvbW1hbmQgeworICAgICAgdWludDMyX3QgY21kOworICAgICAgdWludDMyX3QgY21kc2l6ZTsKKyAgICAgIHVpbnQzMl90IG5hbWU7CisgICAgfTsKKworICAgIHN0cnVjdCB0aHJlYWRfY29tbWFuZCB7CisgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICB1aW50MzJfdCBjbWRzaXplOworICAgIH07CisKKyAgICBzdHJ1Y3Qgcm91dGluZXNfY29tbWFuZCB7CisgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICB1aW50MzJfdCBjbWRzaXplOworICAgICAgdWludDMyX3QgaW5pdF9hZGRyZXNzOworICAgICAgdWludDMyX3QgaW5pdF9tb2R1bGU7CisgICAgICB1aW50MzJfdCByZXNlcnZlZDE7CisgICAgICB1aW50MzJfdCByZXNlcnZlZDI7CisgICAgICB1aW50MzJfdCByZXNlcnZlZDM7CisgICAgICB1aW50MzJfdCByZXNlcnZlZDQ7CisgICAgICB1aW50MzJfdCByZXNlcnZlZDU7CisgICAgICB1aW50MzJfdCByZXNlcnZlZDY7CisgICAgfTsKKworICAgIHN0cnVjdCByb3V0aW5lc19jb21tYW5kXzY0IHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50NjRfdCBpbml0X2FkZHJlc3M7CisgICAgICB1aW50NjRfdCBpbml0X21vZHVsZTsKKyAgICAgIHVpbnQ2NF90IHJlc2VydmVkMTsKKyAgICAgIHVpbnQ2NF90IHJlc2VydmVkMjsKKyAgICAgIHVpbnQ2NF90IHJlc2VydmVkMzsKKyAgICAgIHVpbnQ2NF90IHJlc2VydmVkNDsKKyAgICAgIHVpbnQ2NF90IHJlc2VydmVkNTsKKyAgICAgIHVpbnQ2NF90IHJlc2VydmVkNjsKKyAgICB9OworCisgICAgc3RydWN0IHN5bXRhYl9jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50MzJfdCBzeW1vZmY7CisgICAgICB1aW50MzJfdCBuc3ltczsKKyAgICAgIHVpbnQzMl90IHN0cm9mZjsKKyAgICAgIHVpbnQzMl90IHN0cnNpemU7CisgICAgfTsKKworICAgIHN0cnVjdCBkeXN5bXRhYl9jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50MzJfdCBpbG9jYWxzeW07CisgICAgICB1aW50MzJfdCBubG9jYWxzeW07CisgICAgICB1aW50MzJfdCBpZXh0ZGVmc3ltOworICAgICAgdWludDMyX3QgbmV4dGRlZnN5bTsKKyAgICAgIHVpbnQzMl90IGl1bmRlZnN5bTsKKyAgICAgIHVpbnQzMl90IG51bmRlZnN5bTsKKyAgICAgIHVpbnQzMl90IHRvY29mZjsKKyAgICAgIHVpbnQzMl90IG50b2M7CisgICAgICB1aW50MzJfdCBtb2R0YWJvZmY7CisgICAgICB1aW50MzJfdCBubW9kdGFiOworICAgICAgdWludDMyX3QgZXh0cmVmc3ltb2ZmOworICAgICAgdWludDMyX3QgbmV4dHJlZnN5bXM7CisgICAgICB1aW50MzJfdCBpbmRpcmVjdHN5bW9mZjsKKyAgICAgIHVpbnQzMl90IG5pbmRpcmVjdHN5bXM7CisgICAgICB1aW50MzJfdCBleHRyZWxvZmY7CisgICAgICB1aW50MzJfdCBuZXh0cmVsOworICAgICAgdWludDMyX3QgbG9jcmVsb2ZmOworICAgICAgdWludDMyX3QgbmxvY3JlbDsKKyAgICB9OwkKKworICAgIHN0cnVjdCBkeWxpYl90YWJsZV9vZl9jb250ZW50cyB7CisgICAgICB1aW50MzJfdCBzeW1ib2xfaW5kZXg7CisgICAgICB1aW50MzJfdCBtb2R1bGVfaW5kZXg7CisgICAgfTsJCisKKyAgICBzdHJ1Y3QgZHlsaWJfbW9kdWxlIHsKKyAgICAgIHVpbnQzMl90IG1vZHVsZV9uYW1lOworICAgICAgdWludDMyX3QgaWV4dGRlZnN5bTsKKyAgICAgIHVpbnQzMl90IG5leHRkZWZzeW07CisgICAgICB1aW50MzJfdCBpcmVmc3ltOworICAgICAgdWludDMyX3QgbnJlZnN5bTsKKyAgICAgIHVpbnQzMl90IGlsb2NhbHN5bTsKKyAgICAgIHVpbnQzMl90IG5sb2NhbHN5bTsKKyAgICAgIHVpbnQzMl90IGlleHRyZWw7CisgICAgICB1aW50MzJfdCBuZXh0cmVsOworICAgICAgdWludDMyX3QgaWluaXRfaXRlcm07CisgICAgICB1aW50MzJfdCBuaW5pdF9udGVybTsKKyAgICAgIHVpbnQzMl90IG9iamNfbW9kdWxlX2luZm9fYWRkcjsKKyAgICAgIHVpbnQzMl90IG9iamNfbW9kdWxlX2luZm9fc2l6ZTsKKyAgICB9OwkKKworICAgIHN0cnVjdCBkeWxpYl9tb2R1bGVfNjQgeworICAgICAgdWludDMyX3QgbW9kdWxlX25hbWU7CisgICAgICB1aW50MzJfdCBpZXh0ZGVmc3ltOworICAgICAgdWludDMyX3QgbmV4dGRlZnN5bTsKKyAgICAgIHVpbnQzMl90IGlyZWZzeW07CisgICAgICB1aW50MzJfdCBucmVmc3ltOworICAgICAgdWludDMyX3QgaWxvY2Fsc3ltOworICAgICAgdWludDMyX3QgbmxvY2Fsc3ltOworICAgICAgdWludDMyX3QgaWV4dHJlbDsKKyAgICAgIHVpbnQzMl90IG5leHRyZWw7CisgICAgICB1aW50MzJfdCBpaW5pdF9pdGVybTsKKyAgICAgIHVpbnQzMl90IG5pbml0X250ZXJtOworICAgICAgdWludDMyX3Qgb2JqY19tb2R1bGVfaW5mb19zaXplOworICAgICAgdWludDY0X3Qgb2JqY19tb2R1bGVfaW5mb19hZGRyOworICAgIH07CisKKyAgICBzdHJ1Y3QgZHlsaWJfcmVmZXJlbmNlIHsKKyAgICAgIHVpbnQzMl90IGlzeW06MjQsCisgICAgICAgICAgICAgICBmbGFnczo4OworICAgIH07CisKKworICAgIHN0cnVjdCB0d29sZXZlbF9oaW50c19jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgICB1aW50MzJfdCBuaGludHM7CisgICAgfTsKKworICAgIHN0cnVjdCB0d29sZXZlbF9oaW50IHsKKyAgICAgIHVpbnQzMl90IGlzdWJfaW1hZ2U6OCwKKyAgICAgICAgICAgICAgIGl0b2M6MjQ7CisgICAgfTsKKworICAgIHN0cnVjdCBwcmViaW5kX2Nrc3VtX2NvbW1hbmQgeworICAgICAgdWludDMyX3QgY21kOworICAgICAgdWludDMyX3QgY21kc2l6ZTsKKyAgICAgIHVpbnQzMl90IGNrc3VtOworICAgIH07CisKKyAgICBzdHJ1Y3QgdXVpZF9jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50OF90IHV1aWRbMTZdOworICAgIH07CisKKyAgICBzdHJ1Y3QgcnBhdGhfY29tbWFuZCB7CisgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICB1aW50MzJfdCBjbWRzaXplOworICAgICAgdWludDMyX3QgcGF0aDsKKyAgICB9OworCisgICAgc3RydWN0IGxpbmtlZGl0X2RhdGFfY29tbWFuZCB7CisgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICB1aW50MzJfdCBjbWRzaXplOworICAgICAgdWludDMyX3QgZGF0YW9mZjsKKyAgICAgIHVpbnQzMl90IGRhdGFzaXplOworICAgIH07CisKKyAgICBzdHJ1Y3QgZW5jcnlwdGlvbl9pbmZvX2NvbW1hbmQgeworICAgICAgdWludDMyX3QgY21kOworICAgICAgdWludDMyX3QgY21kc2l6ZTsKKyAgICAgIHVpbnQzMl90IGNyeXB0b2ZmOworICAgICAgdWludDMyX3QgY3J5cHRzaXplOworICAgICAgdWludDMyX3QgY3J5cHRpZDsKKyAgICB9OworCisgICAgc3RydWN0IGR5bGRfaW5mb19jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50MzJfdCByZWJhc2Vfb2ZmOworICAgICAgdWludDMyX3QgcmViYXNlX3NpemU7CisgICAgICB1aW50MzJfdCBiaW5kX29mZjsKKyAgICAgIHVpbnQzMl90IGJpbmRfc2l6ZTsKKyAgICAgIHVpbnQzMl90IHdlYWtfYmluZF9vZmY7CisgICAgICB1aW50MzJfdCB3ZWFrX2JpbmRfc2l6ZTsKKyAgICAgIHVpbnQzMl90IGxhenlfYmluZF9vZmY7CisgICAgICB1aW50MzJfdCBsYXp5X2JpbmRfc2l6ZTsKKyAgICAgIHVpbnQzMl90IGV4cG9ydF9vZmY7CisgICAgICB1aW50MzJfdCBleHBvcnRfc2l6ZTsKKyAgICB9OworCisgICAgc3RydWN0IHN5bXNlZ19jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgICB1aW50MzJfdCBzaXplOworICAgIH07CisKKyAgICBzdHJ1Y3QgaWRlbnRfY29tbWFuZCB7CisgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICB1aW50MzJfdCBjbWRzaXplOworICAgIH07CisKKyAgICBzdHJ1Y3QgZnZtZmlsZV9jb21tYW5kIHsKKyAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgIHVpbnQzMl90IGNtZHNpemU7CisgICAgICB1aW50MzJfdCBuYW1lOworICAgICAgdWludDMyX3QgaGVhZGVyX2FkZHI7CisgICAgfTsKKworCisgICAgLy8gU3RydWN0cyBmcm9tIDxtYWNoLW8vZmF0Lmg+CisgICAgc3RydWN0IGZhdF9oZWFkZXIgeworICAgICAgdWludDMyX3QgbWFnaWM7CisgICAgICB1aW50MzJfdCBuZmF0X2FyY2g7CisgICAgfTsKKworICAgIHN0cnVjdCBmYXRfYXJjaCB7CisgICAgICB1aW50MzJfdCBjcHV0eXBlOworICAgICAgdWludDMyX3QgY3B1c3VidHlwZTsKKyAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICB1aW50MzJfdCBhbGlnbjsKKyAgICB9OworCisgICAgLy8gU3RydWN0cyBmcm9tIDxtYWNoLW8vZmF0Lmg+CisgICAgc3RydWN0IG5saXN0IHsKKyAgICAgIHVpbnQzMl90IG5fc3RyeDsKKyAgICAgIHVpbnQ4X3Qgbl90eXBlOworICAgICAgdWludDhfdCBuX3NlY3Q7CisgICAgICBpbnQxNl90IG5fZGVzYzsKKyAgICAgIHVpbnQzMl90IG5fdmFsdWU7CisgICAgfTsKKworICAgIHN0cnVjdCBubGlzdF82NCB7CisgICAgICB1aW50MzJfdCBuX3N0cng7CisgICAgICB1aW50OF90IG5fdHlwZTsKKyAgICAgIHVpbnQ4X3Qgbl9zZWN0OworICAgICAgdWludDE2X3Qgbl9kZXNjOworICAgICAgdWludDY0X3Qgbl92YWx1ZTsKKyAgICB9OworCisgICAgLy8gR2V0L1NldCBmdW5jdGlvbnMgZnJvbSA8bWFjaC1vL25saXN0Lmg+CisgICAgCisgICAgc3RhdGljIGlubGluZSB1aW50MTZfdCBHRVRfTElCUkFSWV9PUkRJTkFMKHVpbnQxNl90IG5fZGVzYykKKyAgICB7CisgICAgICByZXR1cm4gKCgobl9kZXNjKSA+PiA4dSkgJiAweGZmdSk7CisgICAgfQorICAgICAgCisgICAgc3RhdGljIGlubGluZSB2b2lkIFNFVF9MSUJSQVJZX09SRElOQUwodWludDE2X3QgJm5fZGVzYywgdWludDhfdCBvcmRpbmFsKQorICAgIHsKKyAgICAgIG5fZGVzYyA9ICgoKG5fZGVzYykgJiAweDAwZmYpIHwgKCgob3JkaW5hbCkgJiAweGZmKSA8PCA4KSk7CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSB1aW50OF90IEdFVF9DT01NX0FMSUdOICh1aW50MTZfdCBuX2Rlc2MpCisgICAgeworICAgICAgcmV0dXJuIChuX2Rlc2MgPj4gOHUpICYgMHgwZnU7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBTRVRfQ09NTV9BTElHTiAodWludDE2X3QgJm5fZGVzYywgdWludDhfdCBhbGlnbikKKyAgICB7CisgICAgICBuX2Rlc2MgPSAoKG5fZGVzYyAmIDB4ZjBmZnUpIHwgKChhbGlnbiAmIDB4MGZ1KSA8PCA4dSkpOworICAgIH0KKworICAgIC8vIEVudW1zIGZyb20gPG1hY2gvbWFjaGluZS5oPgorICAgIGVudW0geworICAgICAgLy8gQ2FwYWJpbGl0eSBiaXRzIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgY3B1X3R5cGUuCisgICAgICBDUFVBcmNoTWFzayA9IDB4ZmYwMDAwMDAsICAgLy8gTWFzayBmb3IgYXJjaGl0ZWN0dXJlIGJpdHMKKyAgICAgIENQVUFyY2hBQkk2NCA9IDB4MDEwMDAwMDAsICAvLyA2NCBiaXQgQUJJCisgICAgICAKKyAgICAgIC8vIENvbnN0YW50cyBmb3IgdGhlIGNwdXR5cGUgZmllbGQuCisgICAgICBDUFVUeXBlSTM4NiAgICAgID0gNywKKyAgICAgIENQVVR5cGVYODZfNjQgICAgPSBDUFVUeXBlSTM4NiB8IENQVUFyY2hBQkk2NCwKKyAgICAgIENQVVR5cGVBUk0gICAgICAgPSAxMiwKKyAgICAgIENQVVR5cGVTUEFSQyAgICAgPSAxNCwKKyAgICAgIENQVVR5cGVQb3dlclBDICAgPSAxOCwKKyAgICAgIENQVVR5cGVQb3dlclBDNjQgPSBDUFVUeXBlUG93ZXJQQyB8IENQVUFyY2hBQkk2NCwKKworCisgICAgICAvLyBDb25zdGFudHMgZm9yIHRoZSBjcHVzdWJ0eXBlIGZpZWxkLgorICAgICAgCisgICAgICAvLyBYODYKKyAgICAgIENQVVN1YlR5cGVfSTM4Nl9BTEwgICAgPSAzLAorICAgICAgQ1BVU3ViVHlwZV9YODZfNjRfQUxMICA9IDMsCisgICAgICAKKyAgICAgIC8vIEFSTQorICAgICAgQ1BVU3ViVHlwZV9BUk1fQUxMICAgICA9IDAsCisgICAgICBDUFVTdWJUeXBlX0FSTV9WNFQgICAgID0gNSwKKyAgICAgIENQVVN1YlR5cGVfQVJNX1Y2ICAgICAgPSA2LAorCisgICAgICAvLyBQb3dlclBDCisgICAgICBDUFVTdWJUeXBlX1BPV0VSUENfQUxMID0gMCwKKyAgICAgIAorICAgICAgQ1BVU3ViVHlwZV9TUEFSQ19BTEwgICA9IDAKKyAgICB9OworICB9IC8vIGVuZCBuYW1lc3BhY2UgTWFjaE8KK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTIyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCAtIFN0YXRpYyBHbG9iYWwgd3JhcHBlciAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1hbmFnZWRTdGF0aWMgY2xhc3MgYW5kIHRoZSBsbHZtX3NodXRkb3duKCkgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUFOQUdFRF9TVEFUSUNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTUFOQUdFRF9TVEFUSUNfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vQXRvbWljLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vVGhyZWFkaW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIG9iamVjdF9jcmVhdG9yIC0gSGVscGVyIG1ldGhvZCBmb3IgTWFuYWdlZFN0YXRpYy4KK3RlbXBsYXRlPGNsYXNzIEM+Cit2b2lkKiBvYmplY3RfY3JlYXRvcigpIHsKKyAgcmV0dXJuIG5ldyBDKCk7Cit9CisKKy8vLyBvYmplY3RfZGVsZXRlciAtIEhlbHBlciBtZXRob2QgZm9yIE1hbmFnZWRTdGF0aWMuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBvYmplY3RfZGVsZXRlciB7CisgIHN0YXRpYyB2b2lkIGNhbGwodm9pZCAqIFB0cikgeyBkZWxldGUgKFQqKVB0cjsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBOPiBzdHJ1Y3Qgb2JqZWN0X2RlbGV0ZXI8VFtOXT4geworICBzdGF0aWMgdm9pZCBjYWxsKHZvaWQgKiBQdHIpIHsgZGVsZXRlW10gKFQqKVB0cjsgfQorfTsKKworLy8vIE1hbmFnZWRTdGF0aWNCYXNlIC0gQ29tbW9uIGJhc2UgY2xhc3MgZm9yIE1hbmFnZWRTdGF0aWMgaW5zdGFuY2VzLgorY2xhc3MgTWFuYWdlZFN0YXRpY0Jhc2UgeworcHJvdGVjdGVkOgorICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYSBzdGF0aWMgdmFyaWFibGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB0aGlzCisgIC8vIHdpbGwgYmUgemVybyBpbml0aWFsaXplZC4KKyAgbXV0YWJsZSB2b2lkICpQdHI7CisgIG11dGFibGUgdm9pZCAoKkRlbGV0ZXJGbikodm9pZCopOworICBtdXRhYmxlIGNvbnN0IE1hbmFnZWRTdGF0aWNCYXNlICpOZXh0OworCisgIHZvaWQgUmVnaXN0ZXJNYW5hZ2VkU3RhdGljKHZvaWQgKigqY3JlYXRvcikoKSwgdm9pZCAoKmRlbGV0ZXIpKHZvaWQqKSkgY29uc3Q7CitwdWJsaWM6CisgIC8vLyBpc0NvbnN0cnVjdGVkIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LgorICBib29sIGlzQ29uc3RydWN0ZWQoKSBjb25zdCB7IHJldHVybiBQdHIgIT0gMDsgfQorCisgIHZvaWQgZGVzdHJveSgpIGNvbnN0OworfTsKKworLy8vIE1hbmFnZWRTdGF0aWMgLSBUaGlzIHRyYW5zcGFyZW50bHkgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgZ2xvYmFsIHN0YXRpY3MgdG8KKy8vLyBiZSBsYXppbHkgY29uc3RydWN0ZWQgb24gZGVtYW5kIChnb29kIGZvciByZWR1Y2luZyBzdGFydHVwIHRpbWVzIG9mIGR5bmFtaWMKKy8vLyBsaWJyYXJpZXMgdGhhdCBsaW5rIGluIExMVk0gY29tcG9uZW50cykgYW5kIGZvciBtYWtpbmcgZGVzdHJ1Y3Rpb24gYmUKKy8vLyBleHBsaWNpdCB0aHJvdWdoIHRoZSBsbHZtX3NodXRkb3duKCkgZnVuY3Rpb24gY2FsbC4KKy8vLwordGVtcGxhdGU8Y2xhc3MgQz4KK2NsYXNzIE1hbmFnZWRTdGF0aWMgOiBwdWJsaWMgTWFuYWdlZFN0YXRpY0Jhc2UgeworcHVibGljOgorCisgIC8vIEFjY2Vzc29ycy4KKyAgQyAmb3BlcmF0b3IqKCkgeworICAgIHZvaWQqIHRtcCA9IFB0cjsKKyAgICBpZiAobGx2bV9pc19tdWx0aXRocmVhZGVkKCkpIHN5czo6TWVtb3J5RmVuY2UoKTsKKyAgICBpZiAoIXRtcCkgUmVnaXN0ZXJNYW5hZ2VkU3RhdGljKG9iamVjdF9jcmVhdG9yPEM+LCBvYmplY3RfZGVsZXRlcjxDPjo6Y2FsbCk7CisKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PEMqPihQdHIpOworICB9CisgIEMgKm9wZXJhdG9yLT4oKSB7CisgICAgdm9pZCogdG1wID0gUHRyOworICAgIGlmIChsbHZtX2lzX211bHRpdGhyZWFkZWQoKSkgc3lzOjpNZW1vcnlGZW5jZSgpOworICAgIGlmICghdG1wKSBSZWdpc3Rlck1hbmFnZWRTdGF0aWMob2JqZWN0X2NyZWF0b3I8Qz4sIG9iamVjdF9kZWxldGVyPEM+OjpjYWxsKTsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDKj4oUHRyKTsKKyAgfQorICBjb25zdCBDICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgdm9pZCogdG1wID0gUHRyOworICAgIGlmIChsbHZtX2lzX211bHRpdGhyZWFkZWQoKSkgc3lzOjpNZW1vcnlGZW5jZSgpOworICAgIGlmICghdG1wKSBSZWdpc3Rlck1hbmFnZWRTdGF0aWMob2JqZWN0X2NyZWF0b3I8Qz4sIG9iamVjdF9kZWxldGVyPEM+OjpjYWxsKTsKKworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Qyo+KFB0cik7CisgIH0KKyAgY29uc3QgQyAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICB2b2lkKiB0bXAgPSBQdHI7CisgICAgaWYgKGxsdm1faXNfbXVsdGl0aHJlYWRlZCgpKSBzeXM6Ok1lbW9yeUZlbmNlKCk7CisgICAgaWYgKCF0bXApIFJlZ2lzdGVyTWFuYWdlZFN0YXRpYyhvYmplY3RfY3JlYXRvcjxDPiwgb2JqZWN0X2RlbGV0ZXI8Qz46OmNhbGwpOworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEMqPihQdHIpOworICB9Cit9OworCit0ZW1wbGF0ZTx2b2lkICgqQ2xlYW51cEZuKSh2b2lkKik+CitjbGFzcyBNYW5hZ2VkQ2xlYW51cCA6IHB1YmxpYyBNYW5hZ2VkU3RhdGljQmFzZSB7CitwdWJsaWM6CisgIHZvaWQgUmVnaXN0ZXIoKSB7IFJlZ2lzdGVyTWFuYWdlZFN0YXRpYygwLCBDbGVhbnVwRm4pOyB9Cit9OworCisvLy8gbGx2bV9zaHV0ZG93biAtIERlYWxsb2NhdGUgYW5kIGRlc3Ryb3kgYWxsIE1hbmFnZWRTdGF0aWMgdmFyaWFibGVzLgordm9pZCBsbHZtX3NodXRkb3duKCk7CisKKworLy8vIGxsdm1fc2h1dGRvd25fb2JqIC0gVGhpcyBpcyBhIHNpbXBsZSBoZWxwZXIgY2xhc3MgdGhhdCBjYWxscworLy8vIGxsdm1fc2h1dGRvd24oKSB3aGVuIGl0IGlzIGRlc3Ryb3llZC4KK3N0cnVjdCBsbHZtX3NodXRkb3duX29iaiB7CisgIGxsdm1fc2h1dGRvd25fb2JqKCkgeyB9CisgIGV4cGxpY2l0IGxsdm1fc2h1dGRvd25fb2JqKGJvb2wgbXVsdGl0aHJlYWRlZCkgeworICAgIGlmIChtdWx0aXRocmVhZGVkKSBsbHZtX3N0YXJ0X211bHRpdGhyZWFkZWQoKTsKKyAgfQorICB+bGx2bV9zaHV0ZG93bl9vYmooKSB7IGxsdm1fc2h1dGRvd24oKTsgfQorfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQxMWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oCkBAIC0wLDAgKzEsNDc0IEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmggLSBVc2VmdWwgbWF0aCBmdW5jdGlvbnMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VmdWwgZm9yIG1hdGggc3R1ZmYuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUFUSEVYVFJBU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9NQVRIRVhUUkFTX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIE5PVEU6IFRoZSBmb2xsb3dpbmcgc3VwcG9ydCBmdW5jdGlvbnMgdXNlIHRoZSBfMzIvXzY0IGV4dGVuc2lvbnMgaW5zdGVhZCBvZgorLy8gdHlwZSBvdmVybG9hZGluZyBzbyB0aGF0IHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlcnMgY2FuIGJlIHVzZWQgd2l0aG91dAorLy8gYW1iaWd1aXR5LgorCisvLy8gSGlfMzIgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGhpZ2ggMzIgYml0cyBvZiBhIDY0IGJpdCB2YWx1ZS4KK2lubGluZSB1aW50MzJfdCBIaV8zMih1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFZhbHVlID4+IDMyKTsKK30KKworLy8vIExvXzMyIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsb3cgMzIgYml0cyBvZiBhIDY0IGJpdCB2YWx1ZS4KK2lubGluZSB1aW50MzJfdCBMb18zMih1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFZhbHVlKTsKK30KKworLy8vIGlzSW50IC0gQ2hlY2tzIGlmIGFuIGludGVnZXIgZml0cyBpbnRvIHRoZSBnaXZlbiBiaXQgd2lkdGguCit0ZW1wbGF0ZTx1bnNpZ25lZCBOPgoraW5saW5lIGJvb2wgaXNJbnQoaW50NjRfdCB4KSB7CisgIHJldHVybiBOID49IDY0IHx8ICgtKElOVDY0X0MoMSk8PChOLTEpKSA8PSB4ICYmIHggPCAoSU5UNjRfQygxKTw8KE4tMSkpKTsKK30KKy8vIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyB0byBnZXQgYmV0dGVyIGNvZGUgZm9yIGNvbW1vbiBjYXNlcy4KK3RlbXBsYXRlPD4KK2lubGluZSBib29sIGlzSW50PDg+KGludDY0X3QgeCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50OF90Pih4KSA9PSB4OworfQordGVtcGxhdGU8PgoraW5saW5lIGJvb2wgaXNJbnQ8MTY+KGludDY0X3QgeCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MTZfdD4oeCkgPT0geDsKK30KK3RlbXBsYXRlPD4KK2lubGluZSBib29sIGlzSW50PDMyPihpbnQ2NF90IHgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KHgpID09IHg7Cit9CisKKy8vLyBpc1VJbnQgLSBDaGVja3MgaWYgYW4gdW5zaWduZWQgaW50ZWdlciBmaXRzIGludG8gdGhlIGdpdmVuIGJpdCB3aWR0aC4KK3RlbXBsYXRlPHVuc2lnbmVkIE4+CitpbmxpbmUgYm9vbCBpc1VJbnQodWludDY0X3QgeCkgeworICByZXR1cm4gTiA+PSA2NCB8fCB4IDwgKFVJTlQ2NF9DKDEpPDxOKTsKK30KKy8vIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyB0byBnZXQgYmV0dGVyIGNvZGUgZm9yIGNvbW1vbiBjYXNlcy4KK3RlbXBsYXRlPD4KK2lubGluZSBib29sIGlzVUludDw4Pih1aW50NjRfdCB4KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Pih4KSA9PSB4OworfQordGVtcGxhdGU8PgoraW5saW5lIGJvb2wgaXNVSW50PDE2Pih1aW50NjRfdCB4KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oeCkgPT0geDsKK30KK3RlbXBsYXRlPD4KK2lubGluZSBib29sIGlzVUludDwzMj4odWludDY0X3QgeCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHgpID09IHg7Cit9CisKKy8vLyBpc01hc2tfMzIgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBzZXF1ZW5jZSBvZiBvbmVzCisvLy8gc3RhcnRpbmcgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB3aXRoIHRoZSByZW1haW5kZXIgemVybyAoMzIgYml0CisvLy8gdmVyc2lvbikuICAgRXguIGlzTWFza18zMigweDAwMDBGRkZGVSkgPT0gdHJ1ZS4KK2lubGluZSBib29sIGlzTWFza18zMih1aW50MzJfdCBWYWx1ZSkgeworICByZXR1cm4gVmFsdWUgJiYgKChWYWx1ZSArIDEpICYgVmFsdWUpID09IDA7Cit9CisKKy8vLyBpc01hc2tfNjQgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBzZXF1ZW5jZSBvZiBvbmVzCisvLy8gc3RhcnRpbmcgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB3aXRoIHRoZSByZW1haW5kZXIgemVybyAoNjQgYml0CisvLy8gdmVyc2lvbikuCitpbmxpbmUgYm9vbCBpc01hc2tfNjQodWludDY0X3QgVmFsdWUpIHsKKyAgcmV0dXJuIFZhbHVlICYmICgoVmFsdWUgKyAxKSAmIFZhbHVlKSA9PSAwOworfQorCisvLy8gaXNTaGlmdGVkTWFza18zMiAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBjb250YWlucyBhCisvLy8gc2VxdWVuY2Ugb2Ygb25lcyB3aXRoIHRoZSByZW1haW5kZXIgemVybyAoMzIgYml0IHZlcnNpb24uKQorLy8vIEV4LiBpc1NoaWZ0ZWRNYXNrXzMyKDB4MDAwMEZGMDBVKSA9PSB0cnVlLgoraW5saW5lIGJvb2wgaXNTaGlmdGVkTWFza18zMih1aW50MzJfdCBWYWx1ZSkgeworICByZXR1cm4gaXNNYXNrXzMyKChWYWx1ZSAtIDEpIHwgVmFsdWUpOworfQorCisvLy8gaXNTaGlmdGVkTWFza182NCAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBjb250YWlucyBhCisvLy8gc2VxdWVuY2Ugb2Ygb25lcyB3aXRoIHRoZSByZW1haW5kZXIgemVybyAoNjQgYml0IHZlcnNpb24uKQoraW5saW5lIGJvb2wgaXNTaGlmdGVkTWFza182NCh1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gaXNNYXNrXzY0KChWYWx1ZSAtIDEpIHwgVmFsdWUpOworfQorCisvLy8gaXNQb3dlck9mMl8zMiAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIHBvd2VyIG9mCisvLy8gdHdvID4gMC4gRXguIGlzUG93ZXJPZjJfMzIoMHgwMDEwMDAwMFUpID09IHRydWUgKDMyIGJpdCBlZGl0aW9uLikKK2lubGluZSBib29sIGlzUG93ZXJPZjJfMzIodWludDMyX3QgVmFsdWUpIHsKKyAgcmV0dXJuIFZhbHVlICYmICEoVmFsdWUgJiAoVmFsdWUgLSAxKSk7Cit9CisKKy8vLyBpc1Bvd2VyT2YyXzY0IC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgcG93ZXIgb2YgdHdvCisvLy8gPiAwICg2NCBiaXQgZWRpdGlvbi4pCitpbmxpbmUgYm9vbCBpc1Bvd2VyT2YyXzY0KHVpbnQ2NF90IFZhbHVlKSB7CisgIHJldHVybiBWYWx1ZSAmJiAhKFZhbHVlICYgKFZhbHVlIC0gaW50NjRfdCgxTCkpKTsKK30KKworLy8vIEJ5dGVTd2FwXzE2IC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYnl0ZS1zd2FwcGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorLy8vIDE2LWJpdCBhcmd1bWVudCwgVmFsdWUuCitpbmxpbmUgdWludDE2X3QgQnl0ZVN3YXBfMTYodWludDE2X3QgVmFsdWUpIHsKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfREVCVUcpCisgIC8vIFRoZSBETEwgdmVyc2lvbiBvZiB0aGUgcnVudGltZSBsYWNrcyB0aGVzZSBmdW5jdGlvbnMgKGJ1ZyE/KSwgYnV0IGluIGEKKyAgLy8gcmVsZWFzZSBidWlsZCB0aGV5J3JlIHJlcGxhY2VkIHdpdGggQlNXQVAgaW5zdHJ1Y3Rpb25zIGFueXdheS4KKyAgcmV0dXJuIF9ieXRlc3dhcF91c2hvcnQoVmFsdWUpOworI2Vsc2UKKyAgdWludDE2X3QgSGkgPSBWYWx1ZSA8PCA4OworICB1aW50MTZfdCBMbyA9IFZhbHVlID4+IDg7CisgIHJldHVybiBIaSB8IExvOworI2VuZGlmCit9CisKKy8vLyBCeXRlU3dhcF8zMiAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJ5dGUtc3dhcHBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKy8vLyAzMi1iaXQgYXJndW1lbnQsIFZhbHVlLgoraW5saW5lIHVpbnQzMl90IEJ5dGVTd2FwXzMyKHVpbnQzMl90IFZhbHVlKSB7CisjaWYgKF9fR05VQ19fID4gNCB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSAzKSkgJiYgIWRlZmluZWQoX19JQ0MpCisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXAzMihWYWx1ZSk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfREVCVUcpCisgIHJldHVybiBfYnl0ZXN3YXBfdWxvbmcoVmFsdWUpOworI2Vsc2UKKyAgdWludDMyX3QgQnl0ZTAgPSBWYWx1ZSAmIDB4MDAwMDAwRkY7CisgIHVpbnQzMl90IEJ5dGUxID0gVmFsdWUgJiAweDAwMDBGRjAwOworICB1aW50MzJfdCBCeXRlMiA9IFZhbHVlICYgMHgwMEZGMDAwMDsKKyAgdWludDMyX3QgQnl0ZTMgPSBWYWx1ZSAmIDB4RkYwMDAwMDA7CisgIHJldHVybiAoQnl0ZTAgPDwgMjQpIHwgKEJ5dGUxIDw8IDgpIHwgKEJ5dGUyID4+IDgpIHwgKEJ5dGUzID4+IDI0KTsKKyNlbmRpZgorfQorCisvLy8gQnl0ZVN3YXBfNjQgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBieXRlLXN3YXBwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlCisvLy8gNjQtYml0IGFyZ3VtZW50LCBWYWx1ZS4KK2lubGluZSB1aW50NjRfdCBCeXRlU3dhcF82NCh1aW50NjRfdCBWYWx1ZSkgeworI2lmIChfX0dOVUNfXyA+IDQgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMykpICYmICFkZWZpbmVkKF9fSUNDKQorICByZXR1cm4gX19idWlsdGluX2Jzd2FwNjQoVmFsdWUpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX0RFQlVHKQorICByZXR1cm4gX2J5dGVzd2FwX3VpbnQ2NChWYWx1ZSk7CisjZWxzZQorICB1aW50NjRfdCBIaSA9IEJ5dGVTd2FwXzMyKHVpbnQzMl90KFZhbHVlKSk7CisgIHVpbnQzMl90IExvID0gQnl0ZVN3YXBfMzIodWludDMyX3QoVmFsdWUgPj4gMzIpKTsKKyAgcmV0dXJuIChIaSA8PCAzMikgfCBMbzsKKyNlbmRpZgorfQorCisvLy8gQ291bnRMZWFkaW5nWmVyb3NfMzIgLSB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBwbGF0Zm9ybSBvcHRpbWFsIGZvcm0gb2YKKy8vLyBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHplcm9zIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdCBvbmUKKy8vLyBiaXQuICBFeC4gQ291bnRMZWFkaW5nWmVyb3NfMzIoMHgwMEYwMDBGRikgPT0gOC4KKy8vLyBSZXR1cm5zIDMyIGlmIHRoZSB3b3JkIGlzIHplcm8uCitpbmxpbmUgdW5zaWduZWQgQ291bnRMZWFkaW5nWmVyb3NfMzIodWludDMyX3QgVmFsdWUpIHsKKyAgdW5zaWduZWQgQ291bnQ7IC8vIHJlc3VsdAorI2lmIF9fR05VQ19fID49IDQKKyAgLy8gUG93ZXJQQyBpcyBkZWZpbmVkIGZvciBfX2J1aWx0aW5fY2x6KDApCisjaWYgIWRlZmluZWQoX19wcGNfXykgJiYgIWRlZmluZWQoX19wcGM2NF9fKQorICBpZiAoIVZhbHVlKSByZXR1cm4gMzI7CisjZW5kaWYKKyAgQ291bnQgPSBfX2J1aWx0aW5fY2x6KFZhbHVlKTsKKyNlbHNlCisgIGlmICghVmFsdWUpIHJldHVybiAzMjsKKyAgQ291bnQgPSAwOworICAvLyBiaXNlY3Rpb24gbWV0aG9kIGZvciBjb3VudCBsZWFkaW5nIHplcm9zCisgIGZvciAodW5zaWduZWQgU2hpZnQgPSAzMiA+PiAxOyBTaGlmdDsgU2hpZnQgPj49IDEpIHsKKyAgICB1aW50MzJfdCBUbXAgPSBWYWx1ZSA+PiBTaGlmdDsKKyAgICBpZiAoVG1wKSB7CisgICAgICBWYWx1ZSA9IFRtcDsKKyAgICB9IGVsc2UgeworICAgICAgQ291bnQgfD0gU2hpZnQ7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIENvdW50OworfQorCisvLy8gQ291bnRMZWFkaW5nT25lc18zMiAtIHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG9wZXJhdGlvbiBvZgorLy8vIGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygb25lcyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QgemVybworLy8vIGJpdC4gIEV4LiBDb3VudExlYWRpbmdPbmVzXzMyKDB4RkYwRkZGMDApID09IDguCisvLy8gUmV0dXJucyAzMiBpZiB0aGUgd29yZCBpcyBhbGwgb25lcy4KK2lubGluZSB1bnNpZ25lZCBDb3VudExlYWRpbmdPbmVzXzMyKHVpbnQzMl90IFZhbHVlKSB7CisgIHJldHVybiBDb3VudExlYWRpbmdaZXJvc18zMih+VmFsdWUpOworfQorCisvLy8gQ291bnRMZWFkaW5nWmVyb3NfNjQgLSBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBwbGF0Zm9ybSBvcHRpbWFsIGZvcm0KKy8vLyBvZiBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHplcm9zIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdAorLy8vIG9uZSBiaXQgKDY0IGJpdCBlZGl0aW9uLikKKy8vLyBSZXR1cm5zIDY0IGlmIHRoZSB3b3JkIGlzIHplcm8uCitpbmxpbmUgdW5zaWduZWQgQ291bnRMZWFkaW5nWmVyb3NfNjQodWludDY0X3QgVmFsdWUpIHsKKyAgdW5zaWduZWQgQ291bnQ7IC8vIHJlc3VsdAorI2lmIF9fR05VQ19fID49IDQKKyAgLy8gUG93ZXJQQyBpcyBkZWZpbmVkIGZvciBfX2J1aWx0aW5fY2x6bGwoMCkKKyNpZiAhZGVmaW5lZChfX3BwY19fKSAmJiAhZGVmaW5lZChfX3BwYzY0X18pCisgIGlmICghVmFsdWUpIHJldHVybiA2NDsKKyNlbmRpZgorICBDb3VudCA9IF9fYnVpbHRpbl9jbHpsbChWYWx1ZSk7CisjZWxzZQorICBpZiAoc2l6ZW9mKGxvbmcpID09IHNpemVvZihpbnQ2NF90KSkgeworICAgIGlmICghVmFsdWUpIHJldHVybiA2NDsKKyAgICBDb3VudCA9IDA7CisgICAgLy8gYmlzZWN0aW9uIG1ldGhvZCBmb3IgY291bnQgbGVhZGluZyB6ZXJvcworICAgIGZvciAodW5zaWduZWQgU2hpZnQgPSA2NCA+PiAxOyBTaGlmdDsgU2hpZnQgPj49IDEpIHsKKyAgICAgIHVpbnQ2NF90IFRtcCA9IFZhbHVlID4+IFNoaWZ0OworICAgICAgaWYgKFRtcCkgeworICAgICAgICBWYWx1ZSA9IFRtcDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvdW50IHw9IFNoaWZ0OworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBnZXQgaGkgcG9ydGlvbgorICAgIHVpbnQzMl90IEhpID0gSGlfMzIoVmFsdWUpOworCisgICAgLy8gaWYgc29tZSBiaXRzIGluIGhpIHBvcnRpb24KKyAgICBpZiAoSGkpIHsKKyAgICAgICAgLy8gbGVhZGluZyB6ZXJvcyBpbiBoaSBwb3J0aW9uIHBsdXMgYWxsIGJpdHMgaW4gbG8gcG9ydGlvbgorICAgICAgICBDb3VudCA9IENvdW50TGVhZGluZ1plcm9zXzMyKEhpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBnZXQgbG8gcG9ydGlvbgorICAgICAgICB1aW50MzJfdCBMbyA9IExvXzMyKFZhbHVlKTsKKyAgICAgICAgLy8gc2FtZSBhcyAzMiBiaXQgdmFsdWUKKyAgICAgICAgQ291bnQgPSBDb3VudExlYWRpbmdaZXJvc18zMihMbykrMzI7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIENvdW50OworfQorCisvLy8gQ291bnRMZWFkaW5nT25lc182NCAtIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG9wZXJhdGlvbgorLy8vIG9mIGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygb25lcyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QKKy8vLyB6ZXJvIGJpdCAoNjQgYml0IGVkaXRpb24uKQorLy8vIFJldHVybnMgNjQgaWYgdGhlIHdvcmQgaXMgYWxsIG9uZXMuCitpbmxpbmUgdW5zaWduZWQgQ291bnRMZWFkaW5nT25lc182NCh1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gQ291bnRMZWFkaW5nWmVyb3NfNjQoflZhbHVlKTsKK30KKworLy8vIENvdW50VHJhaWxpbmdaZXJvc18zMiAtIHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIHBsYXRmb3JtIG9wdGltYWwgZm9ybSBvZgorLy8vIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgemVyb3MgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdCBvbmUKKy8vLyBiaXQuICBFeC4gQ291bnRUcmFpbGluZ1plcm9zXzMyKDB4RkYwMEZGMDApID09IDguCisvLy8gUmV0dXJucyAzMiBpZiB0aGUgd29yZCBpcyB6ZXJvLgoraW5saW5lIHVuc2lnbmVkIENvdW50VHJhaWxpbmdaZXJvc18zMih1aW50MzJfdCBWYWx1ZSkgeworI2lmIF9fR05VQ19fID49IDQKKyAgcmV0dXJuIFZhbHVlID8gX19idWlsdGluX2N0eihWYWx1ZSkgOiAzMjsKKyNlbHNlCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBNb2QzN0JpdFBvc2l0aW9uW10gPSB7CisgICAgMzIsIDAsIDEsIDI2LCAyLCAyMywgMjcsIDAsIDMsIDE2LCAyNCwgMzAsIDI4LCAxMSwgMCwgMTMsCisgICAgNCwgNywgMTcsIDAsIDI1LCAyMiwgMzEsIDE1LCAyOSwgMTAsIDEyLCA2LCAwLCAyMSwgMTQsIDksCisgICAgNSwgMjAsIDgsIDE5LCAxOAorICB9OworICByZXR1cm4gTW9kMzdCaXRQb3NpdGlvblsoLVZhbHVlICYgVmFsdWUpICUgMzddOworI2VuZGlmCit9CisKKy8vLyBDb3VudFRyYWlsaW5nT25lc18zMiAtIHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG9wZXJhdGlvbiBvZgorLy8vIGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygb25lcyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIGZpcnN0IHplcm8KKy8vLyBiaXQuICBFeC4gQ291bnRUcmFpbGluZ09uZXNfMzIoMHgwMEZGMDBGRikgPT0gOC4KKy8vLyBSZXR1cm5zIDMyIGlmIHRoZSB3b3JkIGlzIGFsbCBvbmVzLgoraW5saW5lIHVuc2lnbmVkIENvdW50VHJhaWxpbmdPbmVzXzMyKHVpbnQzMl90IFZhbHVlKSB7CisgIHJldHVybiBDb3VudFRyYWlsaW5nWmVyb3NfMzIoflZhbHVlKTsKK30KKworLy8vIENvdW50VHJhaWxpbmdaZXJvc182NCAtIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIHBsYXRmb3JtIG9wdGltYWwgZm9ybQorLy8vIG9mIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgemVyb3MgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdAorLy8vIG9uZSBiaXQgKDY0IGJpdCBlZGl0aW9uLikKKy8vLyBSZXR1cm5zIDY0IGlmIHRoZSB3b3JkIGlzIHplcm8uCitpbmxpbmUgdW5zaWduZWQgQ291bnRUcmFpbGluZ1plcm9zXzY0KHVpbnQ2NF90IFZhbHVlKSB7CisjaWYgX19HTlVDX18gPj0gNAorICByZXR1cm4gVmFsdWUgPyBfX2J1aWx0aW5fY3R6bGwoVmFsdWUpIDogNjQ7CisjZWxzZQorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTW9kNjdQb3NpdGlvbltdID0geworICAgIDY0LCAwLCAxLCAzOSwgMiwgMTUsIDQwLCAyMywgMywgMTIsIDE2LCA1OSwgNDEsIDE5LCAyNCwgNTQsCisgICAgNCwgNjQsIDEzLCAxMCwgMTcsIDYyLCA2MCwgMjgsIDQyLCAzMCwgMjAsIDUxLCAyNSwgNDQsIDU1LAorICAgIDQ3LCA1LCAzMiwgNjUsIDM4LCAxNCwgMjIsIDExLCA1OCwgMTgsIDUzLCA2MywgOSwgNjEsIDI3LAorICAgIDI5LCA1MCwgNDMsIDQ2LCAzMSwgMzcsIDIxLCA1NywgNTIsIDgsIDI2LCA0OSwgNDUsIDM2LCA1NiwKKyAgICA3LCA0OCwgMzUsIDYsIDM0LCAzMywgMAorICB9OworICByZXR1cm4gTW9kNjdQb3NpdGlvblsoLVZhbHVlICYgVmFsdWUpICUgNjddOworI2VuZGlmCit9CisKKy8vLyBDb3VudFRyYWlsaW5nT25lc182NCAtIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG9wZXJhdGlvbgorLy8vIG9mIGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygb25lcyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIGZpcnN0CisvLy8gemVybyBiaXQgKDY0IGJpdCBlZGl0aW9uLikKKy8vLyBSZXR1cm5zIDY0IGlmIHRoZSB3b3JkIGlzIGFsbCBvbmVzLgoraW5saW5lIHVuc2lnbmVkIENvdW50VHJhaWxpbmdPbmVzXzY0KHVpbnQ2NF90IFZhbHVlKSB7CisgIHJldHVybiBDb3VudFRyYWlsaW5nWmVyb3NfNjQoflZhbHVlKTsKK30KKworLy8vIENvdW50UG9wdWxhdGlvbl8zMiAtIHRoaXMgZnVuY3Rpb24gY291bnRzIHRoZSBudW1iZXIgb2Ygc2V0IGJpdHMgaW4gYSB2YWx1ZS4KKy8vLyBFeC4gQ291bnRQb3B1bGF0aW9uKDB4RjAwMEYwMDApID0gOAorLy8vIFJldHVybnMgMCBpZiB0aGUgd29yZCBpcyB6ZXJvLgoraW5saW5lIHVuc2lnbmVkIENvdW50UG9wdWxhdGlvbl8zMih1aW50MzJfdCBWYWx1ZSkgeworI2lmIF9fR05VQ19fID49IDQKKyAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudChWYWx1ZSk7CisjZWxzZQorICB1aW50MzJfdCB2ID0gVmFsdWUgLSAoKFZhbHVlID4+IDEpICYgMHg1NTU1NTU1NSk7CisgIHYgPSAodiAmIDB4MzMzMzMzMzMpICsgKCh2ID4+IDIpICYgMHgzMzMzMzMzMyk7CisgIHJldHVybiAoKHYgKyAodiA+PiA0KSAmIDB4RjBGMEYwRikgKiAweDEwMTAxMDEpID4+IDI0OworI2VuZGlmCit9CisKKy8vLyBDb3VudFBvcHVsYXRpb25fNjQgLSB0aGlzIGZ1bmN0aW9uIGNvdW50cyB0aGUgbnVtYmVyIG9mIHNldCBiaXRzIGluIGEgdmFsdWUsCisvLy8gKDY0IGJpdCBlZGl0aW9uLikKK2lubGluZSB1bnNpZ25lZCBDb3VudFBvcHVsYXRpb25fNjQodWludDY0X3QgVmFsdWUpIHsKKyNpZiBfX0dOVUNfXyA+PSA0CisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsbChWYWx1ZSk7CisjZWxzZQorICB1aW50NjRfdCB2ID0gVmFsdWUgLSAoKFZhbHVlID4+IDEpICYgMHg1NTU1NTU1NTU1NTU1NTU1VUxMKTsKKyAgdiA9ICh2ICYgMHgzMzMzMzMzMzMzMzMzMzMzVUxMKSArICgodiA+PiAyKSAmIDB4MzMzMzMzMzMzMzMzMzMzM1VMTCk7CisgIHYgPSAodiArICh2ID4+IDQpKSAmIDB4MEYwRjBGMEYwRjBGMEYwRlVMTDsKKyAgcmV0dXJuIHVuc2lnbmVkKCh1aW50NjRfdCkodiAqIDB4MDEwMTAxMDEwMTAxMDEwMVVMTCkgPj4gNTYpOworI2VuZGlmCit9CisKKy8vLyBMb2cyXzMyIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmbG9vciBsb2cgYmFzZSAyIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsCisvLy8gLTEgaWYgdGhlIHZhbHVlIGlzIHplcm8uICgzMiBiaXQgZWRpdGlvbi4pCisvLy8gRXguIExvZzJfMzIoMzIpID09IDUsIExvZzJfMzIoMSkgPT0gMCwgTG9nMl8zMigwKSA9PSAtMSwgTG9nMl8zMig2KSA9PSAyCitpbmxpbmUgdW5zaWduZWQgTG9nMl8zMih1aW50MzJfdCBWYWx1ZSkgeworICByZXR1cm4gMzEgLSBDb3VudExlYWRpbmdaZXJvc18zMihWYWx1ZSk7Cit9CisKKy8vLyBMb2cyXzY0IC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmbG9vciBsb2cgYmFzZSAyIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsCisvLy8gLTEgaWYgdGhlIHZhbHVlIGlzIHplcm8uICg2NCBiaXQgZWRpdGlvbi4pCitpbmxpbmUgdW5zaWduZWQgTG9nMl82NCh1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gNjMgLSBDb3VudExlYWRpbmdaZXJvc182NChWYWx1ZSk7Cit9CisKKy8vLyBMb2cyXzMyX0NlaWwgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNlaWwgbG9nIGJhc2UgMiBvZiB0aGUgc3BlY2lmaWVkCisvLy8gdmFsdWUsIDMyIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLiAoMzIgYml0IGVkaXRpb24pLgorLy8vIEV4LiBMb2cyXzMyX0NlaWwoMzIpID09IDUsIExvZzJfMzJfQ2VpbCgxKSA9PSAwLCBMb2cyXzMyX0NlaWwoNikgPT0gMworaW5saW5lIHVuc2lnbmVkIExvZzJfMzJfQ2VpbCh1aW50MzJfdCBWYWx1ZSkgeworICByZXR1cm4gMzItQ291bnRMZWFkaW5nWmVyb3NfMzIoVmFsdWUtMSk7Cit9CisKKy8vLyBMb2cyXzY0X0NlaWwgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNlaWwgbG9nIGJhc2UgMiBvZiB0aGUgc3BlY2lmaWVkCisvLy8gdmFsdWUsIDY0IGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLiAoNjQgYml0IGVkaXRpb24uKQoraW5saW5lIHVuc2lnbmVkIExvZzJfNjRfQ2VpbCh1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gNjQtQ291bnRMZWFkaW5nWmVyb3NfNjQoVmFsdWUtMSk7Cit9CisKKy8vLyBHcmVhdGVzdENvbW1vbkRpdmlzb3I2NCAtIFJldHVybiB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgdGhlIHR3bworLy8vIHZhbHVlcyB1c2luZyBFdWNsaWQncyBhbGdvcml0aG0uCitpbmxpbmUgdWludDY0X3QgR3JlYXRlc3RDb21tb25EaXZpc29yNjQodWludDY0X3QgQSwgdWludDY0X3QgQikgeworICB3aGlsZSAoQikgeworICAgIHVpbnQ2NF90IFQgPSBCOworICAgIEIgPSBBICUgQjsKKyAgICBBID0gVDsKKyAgfQorICByZXR1cm4gQTsKK30KKworLy8vIEJpdHNUb0RvdWJsZSAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSA2NC1iaXQgaW50ZWdlciBhbmQgcmV0dXJucyB0aGUgYml0CisvLy8gZXF1aXZhbGVudCBkb3VibGUuCitpbmxpbmUgZG91YmxlIEJpdHNUb0RvdWJsZSh1aW50NjRfdCBCaXRzKSB7CisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCBMOworICAgIGRvdWJsZSBEOworICB9IFQ7CisgIFQuTCA9IEJpdHM7CisgIHJldHVybiBULkQ7Cit9CisKKy8vLyBCaXRzVG9GbG9hdCAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSAzMi1iaXQgaW50ZWdlciBhbmQgcmV0dXJucyB0aGUgYml0CisvLy8gZXF1aXZhbGVudCBmbG9hdC4KK2lubGluZSBmbG9hdCBCaXRzVG9GbG9hdCh1aW50MzJfdCBCaXRzKSB7CisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCBJOworICAgIGZsb2F0IEY7CisgIH0gVDsKKyAgVC5JID0gQml0czsKKyAgcmV0dXJuIFQuRjsKK30KKworLy8vIERvdWJsZVRvQml0cyAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBkb3VibGUgYW5kIHJldHVybnMgdGhlIGJpdAorLy8vIGVxdWl2YWxlbnQgNjQtYml0IGludGVnZXIuICBOb3RlIHRoYXQgY29weWluZyBkb3VibGVzIGFyb3VuZAorLy8vIGNoYW5nZXMgdGhlIGJpdHMgb2YgTmFOcyBvbiBzb21lIGhvc3RzLCBub3RhYmx5IHg4Niwgc28gdGhpcworLy8vIHJvdXRpbmUgY2Fubm90IGJlIHVzZWQgaWYgdGhlc2UgYml0cyBhcmUgbmVlZGVkLgoraW5saW5lIHVpbnQ2NF90IERvdWJsZVRvQml0cyhkb3VibGUgRG91YmxlKSB7CisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCBMOworICAgIGRvdWJsZSBEOworICB9IFQ7CisgIFQuRCA9IERvdWJsZTsKKyAgcmV0dXJuIFQuTDsKK30KKworLy8vIEZsb2F0VG9CaXRzIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZsb2F0IGFuZCByZXR1cm5zIHRoZSBiaXQKKy8vLyBlcXVpdmFsZW50IDMyLWJpdCBpbnRlZ2VyLiAgTm90ZSB0aGF0IGNvcHlpbmcgZmxvYXRzIGFyb3VuZAorLy8vIGNoYW5nZXMgdGhlIGJpdHMgb2YgTmFOcyBvbiBzb21lIGhvc3RzLCBub3RhYmx5IHg4Niwgc28gdGhpcworLy8vIHJvdXRpbmUgY2Fubm90IGJlIHVzZWQgaWYgdGhlc2UgYml0cyBhcmUgbmVlZGVkLgoraW5saW5lIHVpbnQzMl90IEZsb2F0VG9CaXRzKGZsb2F0IEZsb2F0KSB7CisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCBJOworICAgIGZsb2F0IEY7CisgIH0gVDsKKyAgVC5GID0gRmxvYXQ7CisgIHJldHVybiBULkk7Cit9CisKKy8vLyBQbGF0Zm9ybS1pbmRlcGVuZGVudCB3cmFwcGVycyBmb3IgdGhlIEM5OSBpc25hbigpIGZ1bmN0aW9uLgoraW50IElzTkFOKGZsb2F0IGYpOworaW50IElzTkFOKGRvdWJsZSBkKTsKKworLy8vIFBsYXRmb3JtLWluZGVwZW5kZW50IHdyYXBwZXJzIGZvciB0aGUgQzk5IGlzaW5mKCkgZnVuY3Rpb24uCitpbnQgSXNJbmYoZmxvYXQgZik7CitpbnQgSXNJbmYoZG91YmxlIGQpOworCisvLy8gTWluQWxpZ24gLSBBIGFuZCBCIGFyZSBlaXRoZXIgYWxpZ25tZW50cyBvciBvZmZzZXRzLiAgUmV0dXJuIHRoZSBtaW5pbXVtCisvLy8gYWxpZ25tZW50IHRoYXQgbWF5IGJlIGFzc3VtZWQgYWZ0ZXIgYWRkaW5nIHRoZSB0d28gdG9nZXRoZXIuCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IE1pbkFsaWduKHVpbnQ2NF90IEEsIHVpbnQ2NF90IEIpIHsKKyAgLy8gVGhlIGxhcmdlc3QgcG93ZXIgb2YgMiB0aGF0IGRpdmlkZXMgYm90aCBBIGFuZCBCLgorICByZXR1cm4gKEEgfCBCKSAmIC0oQSB8IEIpOworfQorCisvLy8gTmV4dFBvd2VyT2YyIC0gUmV0dXJucyB0aGUgbmV4dCBwb3dlciBvZiB0d28gKGluIDY0LWJpdHMpCisvLy8gdGhhdCBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gQS4gIFJldHVybnMgemVybyBvbiBvdmVyZmxvdy4KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgTmV4dFBvd2VyT2YyKHVpbnQ2NF90IEEpIHsKKyAgQSB8PSAoQSA+PiAxKTsKKyAgQSB8PSAoQSA+PiAyKTsKKyAgQSB8PSAoQSA+PiA0KTsKKyAgQSB8PSAoQSA+PiA4KTsKKyAgQSB8PSAoQSA+PiAxNik7CisgIEEgfD0gKEEgPj4gMzIpOworICByZXR1cm4gQSArIDE7Cit9CisKKy8vLyBSb3VuZFVwVG9BbGlnbm1lbnQgLSBSZXR1cm5zIHRoZSBuZXh0IGludGVnZXIgKG1vZCAyKio2NCkgdGhhdCBpcworLy8vIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBcYXJnIFZhbHVlIGFuZCBpcyBhIG11bHRpcGxlIG9mIFxhcmcKKy8vLyBBbGlnbi4gQWxpZ24gbXVzdCBiZSBub24temVyby4KKy8vLworLy8vIEV4YW1wbGVzOgorLy8vIFJvdW5kVXBUb0FsaWdubWVudCg1LCA4KSA9IDgKKy8vLyBSb3VuZFVwVG9BbGlnbm1lbnQoMTcsIDgpID0gMjQKKy8vLyBSb3VuZFVwVG9BbGlnbm1lbnQofjBMTCwgOCkgPSAwCitpbmxpbmUgdWludDY0X3QgUm91bmRVcFRvQWxpZ25tZW50KHVpbnQ2NF90IFZhbHVlLCB1aW50NjRfdCBBbGlnbikgeworICByZXR1cm4gKChWYWx1ZSArIEFsaWduIC0gMSkgLyBBbGlnbikgKiBBbGlnbjsKK30KKworLy8vIE9mZnNldFRvQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBvZmZzZXQgdG8gdGhlIG5leHQgaW50ZWdlciAobW9kIDIqKjY0KSB0aGF0CisvLy8gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFxhcmcgVmFsdWUgYW5kIGlzIGEgbXVsdGlwbGUgb2YgXGFyZworLy8vIEFsaWduLiBBbGlnbiBtdXN0IGJlIG5vbi16ZXJvLgoraW5saW5lIHVpbnQ2NF90IE9mZnNldFRvQWxpZ25tZW50KHVpbnQ2NF90IFZhbHVlLCB1aW50NjRfdCBBbGlnbikgeworICByZXR1cm4gUm91bmRVcFRvQWxpZ25tZW50KFZhbHVlLCBBbGlnbikgLSBWYWx1ZTsKK30KKworLy8vIGFiczY0IC0gYWJzb2x1dGUgdmFsdWUgb2YgYSA2NC1iaXQgaW50LiAgTm90IGFsbCBlbnZpcm9ubWVudHMgc3VwcG9ydAorLy8vICJhYnMiIG9uIHdoYXRldmVyIHRoZWlyIG5hbWUgZm9yIHRoZSA2NC1iaXQgaW50IHR5cGUgaXMuICBUaGUgYWJzb2x1dGUKKy8vLyB2YWx1ZSBvZiB0aGUgbGFyZ2VzdCBuZWdhdGl2ZSBudW1iZXIgaXMgdW5kZWZpbmVkLCBhcyB3aXRoICJhYnMiLgoraW5saW5lIGludDY0X3QgYWJzNjQoaW50NjRfdCB4KSB7CisgIHJldHVybiAoeCA8IDApID8gLXggOiB4OworfQorCisvLy8gU2lnbkV4dGVuZDMyIC0gU2lnbiBleHRlbmQgQi1iaXQgbnVtYmVyIHggdG8gMzItYml0IGludC4KKy8vLyBVc2FnZSBpbnQzMl90IHIgPSBTaWduRXh0ZW5kMzI8NT4oeCk7Cit0ZW1wbGF0ZSA8dW5zaWduZWQgQj4gaW5saW5lIGludDMyX3QgU2lnbkV4dGVuZDMyKHVpbnQzMl90IHgpIHsKKyAgcmV0dXJuIGludDMyX3QoeCA8PCAoMzIgLSBCKSkgPj4gKDMyIC0gQik7Cit9CisKKy8vLyBTaWduRXh0ZW5kNjQgLSBTaWduIGV4dGVuZCBCLWJpdCBudW1iZXIgeCB0byA2NC1iaXQgaW50LgorLy8vIFVzYWdlIGludDY0X3QgciA9IFNpZ25FeHRlbmQ2NDw1Pih4KTsKK3RlbXBsYXRlIDx1bnNpZ25lZCBCPiBpbmxpbmUgaW50NjRfdCBTaWduRXh0ZW5kNjQodWludDY0X3QgeCkgeworICByZXR1cm4gaW50NjRfdCh4IDw8ICg2NCAtIEIpKSA+PiAoNjQgLSBCKTsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDFhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaApAQCAtMCwwICsxLDExNyBAQAorLy89PT0tLS0gTWVtb3J5QnVmZmVyLmggLSBNZW1vcnkgQnVmZmVyIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1lbW9yeUJ1ZmZlciBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUVNT1JZQlVGRkVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX01FTU9SWUJVRkZFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gTWVtb3J5QnVmZmVyIC0gVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgc2ltcGxlIHJlYWQtb25seSBhY2Nlc3MgdG8gYSBibG9jaworLy8vIG9mIG1lbW9yeSwgYW5kIHByb3ZpZGVzIHNpbXBsZSBtZXRob2RzIGZvciByZWFkaW5nIGZpbGVzIGFuZCBzdGFuZGFyZCBpbnB1dAorLy8vIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgSW4gYWRkaXRpb24gdG8gYmFzaWMgYWNjZXNzIHRvIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQorLy8vIGZpbGUsIHRoaXMgaW50ZXJmYWNlIGd1YXJhbnRlZXMgeW91IGNhbiByZWFkIG9uZSBjaGFyYWN0ZXIgcGFzdCB0aGUgZW5kIG9mCisvLy8gdGhlIGZpbGUsIGFuZCB0aGF0IHRoaXMgY2hhcmFjdGVyIHdpbGwgcmVhZCBhcyAnXDAnLgorLy8vCisvLy8gVGhlICdcMCcgZ3VhcmFudGVlIGlzIG5lZWRlZCB0byBzdXBwb3J0IGFuIG9wdGltaXphdGlvbiAtLSBpdCdzIGludGVuZGVkIHRvCisvLy8gYmUgbW9yZSBlZmZpY2llbnQgZm9yIGNsaWVudHMgd2hpY2ggYXJlIHJlYWRpbmcgYWxsIHRoZSBkYXRhIHRvIHN0b3AKKy8vLyByZWFkaW5nIHdoZW4gdGhleSBlbmNvdW50ZXIgYSAnXDAnIHRoYW4gdG8gY29udGludWFsbHkgY2hlY2sgdGhlIGZpbGUKKy8vLyBwb3NpdGlvbiB0byBzZWUgaWYgaXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KK2NsYXNzIE1lbW9yeUJ1ZmZlciB7CisgIGNvbnN0IGNoYXIgKkJ1ZmZlclN0YXJ0OyAvLyBTdGFydCBvZiB0aGUgYnVmZmVyLgorICBjb25zdCBjaGFyICpCdWZmZXJFbmQ7ICAgLy8gRW5kIG9mIHRoZSBidWZmZXIuCisKKyAgTWVtb3J5QnVmZmVyKGNvbnN0IE1lbW9yeUJ1ZmZlciAmKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICBNZW1vcnlCdWZmZXIgJm9wZXJhdG9yPShjb25zdCBNZW1vcnlCdWZmZXIgJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKK3Byb3RlY3RlZDoKKyAgTWVtb3J5QnVmZmVyKCkge30KKyAgdm9pZCBpbml0KGNvbnN0IGNoYXIgKkJ1ZlN0YXJ0LCBjb25zdCBjaGFyICpCdWZFbmQpOworcHVibGljOgorICB2aXJ0dWFsIH5NZW1vcnlCdWZmZXIoKTsKKworICBjb25zdCBjaGFyICpnZXRCdWZmZXJTdGFydCgpIGNvbnN0IHsgcmV0dXJuIEJ1ZmZlclN0YXJ0OyB9CisgIGNvbnN0IGNoYXIgKmdldEJ1ZmZlckVuZCgpIGNvbnN0ICAgeyByZXR1cm4gQnVmZmVyRW5kOyB9CisgIHNpemVfdCBnZXRCdWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gQnVmZmVyRW5kLUJ1ZmZlclN0YXJ0OyB9CisKKyAgU3RyaW5nUmVmIGdldEJ1ZmZlcigpIGNvbnN0IHsgCisgICAgcmV0dXJuIFN0cmluZ1JlZihCdWZmZXJTdGFydCwgZ2V0QnVmZmVyU2l6ZSgpKTsgCisgIH0KKworICAvLy8gZ2V0QnVmZmVySWRlbnRpZmllciAtIFJldHVybiBhbiBpZGVudGlmaWVyIGZvciB0aGlzIGJ1ZmZlciwgdHlwaWNhbGx5IHRoZQorICAvLy8gZmlsZW5hbWUgaXQgd2FzIHJlYWQgZnJvbS4KKyAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRCdWZmZXJJZGVudGlmaWVyKCkgY29uc3QgeworICAgIHJldHVybiAiVW5rbm93biBidWZmZXIiOworICB9CisKKyAgLy8vIGdldEZpbGUgLSBPcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyBhIE1lbW9yeUJ1ZmZlciwgcmV0dXJuaW5nIGEgbmV3CisgIC8vLyBNZW1vcnlCdWZmZXIgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIHJldHVybmluZyBudWxsLiAgSWYgRmlsZVNpemUgaXMKKyAgLy8vIHNwZWNpZmllZCwgdGhpcyBtZWFucyB0aGF0IHRoZSBjbGllbnQga25vd3MgdGhhdCB0aGUgZmlsZSBleGlzdHMgYW5kIHRoYXQKKyAgLy8vIGl0IGhhcyB0aGUgc3BlY2lmaWVkIHNpemUuCisgIHN0YXRpYyBNZW1vcnlCdWZmZXIgKmdldEZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJTdHIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgRmlsZVNpemUgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCAqRmlsZUluZm8gPSAwKTsKKyAgc3RhdGljIE1lbW9yeUJ1ZmZlciAqZ2V0RmlsZShjb25zdCBjaGFyICpGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyU3RyID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IEZpbGVTaXplID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgKkZpbGVJbmZvID0gMCk7CisKKyAgLy8vIGdldE1lbUJ1ZmZlciAtIE9wZW4gdGhlIHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UgYXMgYSBNZW1vcnlCdWZmZXIuICBOb3RlCisgIC8vLyB0aGF0IEVuZFB0clswXSBtdXN0IGJlIGEgbnVsbCBieXRlIGFuZCBiZSBhY2Nlc3NpYmxlIQorICBzdGF0aWMgTWVtb3J5QnVmZmVyICpnZXRNZW1CdWZmZXIoU3RyaW5nUmVmIElucHV0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCdWZmZXJOYW1lID0gIiIpOworCisgIC8vLyBnZXRNZW1CdWZmZXJDb3B5IC0gT3BlbiB0aGUgc3BlY2lmaWVkIG1lbW9yeSByYW5nZSBhcyBhIE1lbW9yeUJ1ZmZlciwKKyAgLy8vIGNvcHlpbmcgdGhlIGNvbnRlbnRzIGFuZCB0YWtpbmcgb3duZXJzaGlwIG9mIGl0LiAgVGhpcyBoYXMgbm8gcmVxdWlyZW1lbnRzCisgIC8vLyBvbiBFbmRQdHJbMF0uCisgIHN0YXRpYyBNZW1vcnlCdWZmZXIgKmdldE1lbUJ1ZmZlckNvcHkoU3RyaW5nUmVmIElucHV0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQnVmZmVyTmFtZSA9ICIiKTsKKworICAvLy8gZ2V0TmV3TWVtQnVmZmVyIC0gQWxsb2NhdGUgYSBuZXcgTWVtb3J5QnVmZmVyIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB0aGF0CisgIC8vLyBpcyBjb21wbGV0ZWx5IGluaXRpYWxpemVkIHRvIHplcm9zLiAgTm90ZSB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkCisgIC8vLyBpbml0aWFsaXplIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgbWV0aG9kLiAgVGhlIG1lbW9yeSBpcyBvd25lZCBieQorICAvLy8gdGhlIE1lbW9yeUJ1ZmZlciBvYmplY3QuCisgIHN0YXRpYyBNZW1vcnlCdWZmZXIgKmdldE5ld01lbUJ1ZmZlcihzaXplX3QgU2l6ZSwgU3RyaW5nUmVmIEJ1ZmZlck5hbWUgPSAiIik7CisKKyAgLy8vIGdldE5ld1VuaW5pdE1lbUJ1ZmZlciAtIEFsbG9jYXRlIGEgbmV3IE1lbW9yeUJ1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIHNpemUKKyAgLy8vIHRoYXQgaXMgbm90IGluaXRpYWxpemVkLiAgTm90ZSB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGluaXRpYWxpemUgdGhlCisgIC8vLyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgbWV0aG9kLiAgVGhlIG1lbW9yeSBpcyBvd25lZCBieSB0aGUgTWVtb3J5QnVmZmVyCisgIC8vLyBvYmplY3QuCisgIHN0YXRpYyBNZW1vcnlCdWZmZXIgKmdldE5ld1VuaW5pdE1lbUJ1ZmZlcihzaXplX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCdWZmZXJOYW1lID0gIiIpOworCisgIC8vLyBnZXRTVERJTiAtIFJlYWQgYWxsIG9mIHN0ZGluIGludG8gYSBmaWxlIGJ1ZmZlciwgYW5kIHJldHVybiBpdC4KKyAgLy8vIElmIGFuIGVycm9yIG9jY3VycywgdGhpcyByZXR1cm5zIG51bGwgYW5kIGZpbGxzIGluICpFcnJTdHIgd2l0aCBhIHJlYXNvbi4KKyAgc3RhdGljIE1lbW9yeUJ1ZmZlciAqZ2V0U1RESU4oc3RkOjpzdHJpbmcgKkVyclN0ciA9IDApOworCisKKyAgLy8vIGdldEZpbGVPclNURElOIC0gT3BlbiB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSBNZW1vcnlCdWZmZXIsIG9yIG9wZW4gc3RkaW4KKyAgLy8vIGlmIHRoZSBGaWxlbmFtZSBpcyAiLSIuICBJZiBhbiBlcnJvciBvY2N1cnMsIHRoaXMgcmV0dXJucyBudWxsIGFuZCBmaWxscworICAvLy8gaW4gKkVyclN0ciB3aXRoIGEgcmVhc29uLgorICBzdGF0aWMgTWVtb3J5QnVmZmVyICpnZXRGaWxlT3JTVERJTihTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJTdHIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IEZpbGVTaXplID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0ICpGaWxlSW5mbyA9IDApOworICBzdGF0aWMgTWVtb3J5QnVmZmVyICpnZXRGaWxlT3JTVERJTihjb25zdCBjaGFyICpGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyclN0ciA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgRmlsZVNpemUgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgKkZpbGVJbmZvID0gMCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01lbW9yeU9iamVjdC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWVtb3J5T2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5M2NhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01lbW9yeU9iamVjdC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT09LSBNZW1vcnlPYmplY3QuaCAtIEFic3RyYWN0IG1lbW9yeSBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTUVNT1JZT0JKRUNUX0gKKyNkZWZpbmUgTUVNT1JZT0JKRUNUX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBNZW1vcnlPYmplY3QgLSBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb250aWd1b3VzIGFkZHJlc3NhYmxlIG1lbW9yeS4KKy8vLyAgIE5lY2Vzc2FyeSBmb3IgY2FzZXMgaW4gd2hpY2ggdGhlIG1lbW9yeSBpcyBpbiBhbm90aGVyIHByb2Nlc3MsIGluIGEKKy8vLyAgIGZpbGUsIG9yIG9uIGEgcmVtb3RlIG1hY2hpbmUuCisvLy8gICBBbGwgc2l6ZSBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgYXJlIHVpbnQ2NF90cywgdG8gYWxsb3cgMzItYml0IHByb2Nlc3NlcworLy8vICAgYWNjZXNzIHRvIDY0LWJpdCBhZGRyZXNzIHNwYWNlcy4KK2NsYXNzIE1lbW9yeU9iamVjdCB7CitwdWJsaWM6CisgIC8vLyBEZXN0cnVjdG9yICAgICAgLSBPdmVycmlkZSBhcyBuZWNlc3NhcnkuCisgIHZpcnR1YWwgfk1lbW9yeU9iamVjdCgpOworICAKKyAgLy8vIGdldEJhc2UgICAgICAgICAtIFJldHVybnMgdGhlIGxvd2VzdCB2YWxpZCBhZGRyZXNzIGluIHRoZSByZWdpb24uCisgIC8vLworICAvLy8gQHJlc3VsdCAgICAgICAgIC0gVGhlIGxvd2VzdCB2YWxpZCBhZGRyZXNzLgorICB2aXJ0dWFsIHVpbnQ2NF90IGdldEJhc2UoKSBjb25zdCA9IDA7CisgIAorICAvLy8gZ2V0RXh0ZW50ICAgICAgIC0gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzLiAgKFRoZSByZWdpb24gaXMKKyAgLy8vICAgICAgICAgICAgICAgICAgIGNvbnRpZ3VvdXMsIHNvIHRoZSBoaWdoZXN0IHZhbGlkIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbiAKKyAgLy8vICAgICAgICAgICAgICAgICAgIGlzIGdldEJhc2UoKSArIGdldEV4dGVudCgpIC0gMSkuCisgIC8vLworICAvLy8gQHJlc3VsdCAgICAgICAgIC0gVGhlIHNpemUgb2YgdGhlIHJlZ2lvbi4KKyAgdmlydHVhbCB1aW50NjRfdCBnZXRFeHRlbnQoKSBjb25zdCA9IDA7CisgIAorICAvLy8gcmVhZEJ5dGUgICAgICAgIC0gVHJpZXMgdG8gcmVhZCBhIHNpbmdsZSBieXRlIGZyb20gdGhlIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gYWRkcmVzcyAgLSBUaGUgYWRkcmVzcyBvZiB0aGUgYnl0ZSwgaW4gdGhlIHNhbWUgc3BhY2UgYXMgZ2V0QmFzZSgpLgorICAvLy8gQHBhcmFtIHB0ciAgICAgIC0gQSBwb2ludGVyIHRvIGEgYnl0ZSB0byBiZSBmaWxsZWQgaW4uICBNdXN0IGJlIG5vbi1OVUxMLgorICAvLy8gQHJlc3VsdCAgICAgICAgIC0gMCBpZiBzdWNjZXNzZnVsOyAtMSBpZiBub3QuICBGYWlsdXJlIG1heSBiZSBkdWUgdG8gYQorICAvLy8gICAgICAgICAgICAgICAgICAgYm91bmRzIHZpb2xhdGlvbiBvciBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBlcnJvci4KKyAgdmlydHVhbCBpbnQgcmVhZEJ5dGUodWludDY0X3QgYWRkcmVzcywgdWludDhfdCogcHRyKSBjb25zdCA9IDA7CisgIAorICAvLy8gcmVhZEJ5dGVzICAgICAgIC0gVHJpZXMgdG8gcmVhZCBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgYnl0ZXMgZnJvbSB0aGUKKyAgLy8vICAgICAgICAgICAgICAgICAgIHJlZ2lvbiwgdXAgdG8gdGhlIGVuZCBvZiB0aGUgcmVnaW9uLgorICAvLy8gICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGlmIHRoZXJlIGlzIGEgcXVpY2tlcgorICAvLy8gICAgICAgICAgICAgICAgICAgd2F5IHRoYW4gZ29pbmcgYmFjayBhbmQgZm9ydGggd2l0aCBpbmRpdmlkdWFsIGJ5dGVzLgorICAvLy8KKyAgLy8vIEBwYXJhbSBhZGRyZXNzICAtIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlLCBpbiB0aGUgc2FtZSBzcGFjZSBhcyAKKyAgLy8vICAgICAgICAgICAgICAgICAgIGdldEJhc2UoKS4KKyAgLy8vIEBwYXJhbSBzaXplICAgICAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5LgorICAvLy8gQHBhcmFtIGJ1ZiAgICAgIC0gQSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGJlIGZpbGxlZCBpbi4gIE11c3QgYmUgbm9uLU5VTEwKKyAgLy8vICAgICAgICAgICAgICAgICAgIGFuZCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzaXplIGJ5dGVzLgorICAvLy8gQHBhcmFtIGNvcGllZCAgIC0gQSBwb2ludGVyIHRvIGEgbnVuYmVyIHRoYXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIG51bWJlcgorICAvLy8gICAgICAgICAgICAgICAgICAgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4gIE1heSBiZSBOVUxMLgorICAvLy8gQHJlc3VsdCAgICAgICAgIC0gMCBpZiBzdWNjZXNzZnVsOyAtMSBpZiBub3QuICBGYWlsdXJlIG1heSBiZSBkdWUgdG8gYQorICAvLy8gICAgICAgICAgICAgICAgICAgYm91bmRzIHZpb2xhdGlvbiBvciBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBlcnJvci4KKyAgdmlydHVhbCBpbnQgcmVhZEJ5dGVzKHVpbnQ2NF90IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGNvcGllZCkgY29uc3Q7Cit9OworCit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NdXRleEd1YXJkLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NdXRleEd1YXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1OGI5NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L011dGV4R3VhcmQuaApAQCAtMCwwICsxLDQxIEBACisvLz09PS0tIFN1cHBvcnQvTXV0ZXhHdWFyZC5oIC0gQWNxdWlyZS9SZWxlYXNlIE11dGV4IEluIFNjb3BlIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgZ3VhcmQgZm9yIGEgYmxvY2sgb2YgY29kZSB0aGF0IGVuc3VyZXMgYSBNdXRleCBpcyBsb2NrZWQKKy8vIHVwb24gY29uc3RydWN0aW9uIGFuZCByZWxlYXNlZCB1cG9uIGRlc3RydWN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01VVEVYR1VBUkRfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTVVURVhHVUFSRF9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NdXRleC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhY3F1aXJlIGEgZ2l2ZW4gTXV0ZXggTG9jayB3aGVuIGNvbnN0cnVjdGVkIGFuZAorICAvLy8gaG9sZCB0aGF0IGxvY2sgdW50aWwgZGVzdHJ1Y3Rpb24uIFRoZSBpbnRlbnRpb24gaXMgdG8gaW5zdGFudGlhdGUgb25lIG9mCisgIC8vLyB0aGVzZSBvbiB0aGUgc3RhY2sgYXQgdGhlIHRvcCBvZiBzb21lIHNjb3BlIHRvIGJlIGFzc3VyZWQgdGhhdCBDKysKKyAgLy8vIGRlc3RydWN0aW9uIG9mIHRoZSBvYmplY3Qgd2lsbCBhbHdheXMgcmVsZWFzZSB0aGUgTXV0ZXggYW5kIHRodXMgYXZvaWQKKyAgLy8vIGEgaG9zdCBvZiBuYXN0eSBtdWx0aS10aHJlYWRpbmcgcHJvYmxlbXMgaW4gdGhlIGZhY2Ugb2YgZXhjZXB0aW9ucywgZXRjLgorICAvLy8gQGJyaWVmIEd1YXJkIGEgc2VjdGlvbiBvZiBjb2RlIHdpdGggYSBNdXRleC4KKyAgY2xhc3MgTXV0ZXhHdWFyZCB7CisgICAgc3lzOjpNdXRleCAmTTsKKyAgICBNdXRleEd1YXJkKGNvbnN0IE11dGV4R3VhcmQgJik7ICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBNdXRleEd1YXJkICYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHB1YmxpYzoKKyAgICBNdXRleEd1YXJkKHN5czo6TXV0ZXggJm0pIDogTShtKSB7IE0uYWNxdWlyZSgpOyB9CisgICAgfk11dGV4R3VhcmQoKSB7IE0ucmVsZWFzZSgpOyB9CisgICAgLy8vIGhvbGRzIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgbG9ja2VyIGluc3RhbmNlIGhvbGRzIHRoZSBzcGVjaWZpZWQgbG9jay4KKyAgICAvLy8gVGhpcyBpcyBtb3N0bHkgdXNlZCBpbiBhc3NlcnRpb25zIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGNvcnJlY3QgbXV0ZXgKKyAgICAvLy8gaXMgaGVsZC4KKyAgICBib29sIGhvbGRzKGNvbnN0IHN5czo6TXV0ZXgmIGxvY2spIGNvbnN0IHsgcmV0dXJuICZNID09ICZsb2NrOyB9CisgIH07Cit9CisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfTVVURVhHVUFSRF9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Ob0ZvbGRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTm9Gb2xkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTI1NmUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTm9Gb2xkZXIuaApAQCAtMCwwICsxLDIyMCBAQAorLy89PT09PT0tLSBsbHZtL1N1cHBvcnQvTm9Gb2xkZXIuaCAtIENvbnN0YW50IGZvbGRpbmcgaGVscGVyIC0qLSBDKysgLSotPT09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTm9Gb2xkZXIgY2xhc3MsIGEgaGVscGVyIGZvciBJUkJ1aWxkZXIuICBJdCBwcm92aWRlcworLy8gSVJCdWlsZGVyIHdpdGggYSBzZXQgb2YgbWV0aG9kcyBmb3IgY3JlYXRpbmcgdW5mb2xkZWQgY29uc3RhbnRzLiAgVGhpcyBpcworLy8gdXNlZnVsIGZvciBsZWFybmVycyB0cnlpbmcgdG8gdW5kZXJzdGFuZCBob3cgTExWTSBJUiB3b3JrcywgYW5kIHdobyBkb24ndAorLy8gd2FudCBkZXRhaWxzIHRvIGJlIGhpZGRlbiBieSB0aGUgY29uc3RhbnQgZm9sZGVyLiAgRm9yIGdlbmVyYWwgY29uc3RhbnQKKy8vIGNyZWF0aW9uIGFuZCBmb2xkaW5nLCB1c2UgQ29uc3RhbnRFeHByIGFuZCB0aGUgcm91dGluZXMgaW4KKy8vIGxsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmguCisvLworLy8gTm90ZTogc2luY2UgaXQgaXMgbm90IGFjdHVhbGx5IHBvc3NpYmxlIHRvIGNyZWF0ZSB1bmZvbGRlZCBjb25zdGFudHMsIHRoaXMKKy8vIGNsYXNzIHJldHVybnMgdmFsdWVzIHJhdGhlciB0aGFuIGNvbnN0YW50cy4gIFRoZSB2YWx1ZXMgZG8gbm90IGhhdmUgbmFtZXMsCisvLyBldmVuIGlmIG5hbWVzIHdlcmUgcHJvdmlkZWQgdG8gSVJCdWlsZGVyLCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX05PRk9MREVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX05PRk9MREVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMTFZNQ29udGV4dDsKKworLy8vIE5vRm9sZGVyIC0gQ3JlYXRlICJjb25zdGFudHMiIChhY3R1YWxseSwgdmFsdWVzKSB3aXRoIG5vIGZvbGRpbmcuCitjbGFzcyBOb0ZvbGRlciB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE5vRm9sZGVyKExMVk1Db250ZXh0ICYpIHt9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEJpbmFyeSBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgVmFsdWUgKkNyZWF0ZUFkZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVOU1dBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlNXQWRkKExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlTlVXQWRkKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5VV0FkZChMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkFkZChMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZVN1YihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIoTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVOU1dTdWIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlNXU3ViKExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlTlVXU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5VV1N1YihMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZTdWIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRlN1YihMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZU11bChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVNdWwoTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVOU1dNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlNXTXVsKExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlTlVXTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5VV011bChMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUZNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRk11bChMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZVVEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlVURpdihMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZVNEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU0RpdihMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUV4YWN0U0RpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVFeGFjdFNEaXYoTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVGRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZEaXYoTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVVUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVVSZW0oTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVTUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNSZW0oTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVGUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZSZW0oTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVTaGwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlTFNocihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVMU2hyKExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlQVNocihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBU2hyKExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlQW5kKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChMSFMsIFJIUyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZU9yKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKExIUywgUkhTKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlWG9yKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcihMSFMsIFJIUyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQmluT3AoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBPcGMsCisgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoT3BjLCBMSFMsIFJIUyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVW5hcnkgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIFZhbHVlICpDcmVhdGVOZWcoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5lZyhDKTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlTlNXTmVnKENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOU1dOZWcoQyk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZU5VV05lZyhDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlVXTmVnKEMpOworICB9CisgIFZhbHVlICpDcmVhdGVOb3QoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5vdChDKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNZW1vcnkgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVHZXRFbGVtZW50UHRyKENvbnN0YW50ICpDLCBDb25zdGFudCogY29uc3QgKklkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoQywgSWR4TGlzdCwgTnVtSWR4KTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlR2V0RWxlbWVudFB0cihDb25zdGFudCAqQywgVmFsdWUqIGNvbnN0ICpJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShDLCBJZHhMaXN0LCBJZHhMaXN0K051bUlkeCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKENvbnN0YW50ICpDLCBDb25zdGFudCogY29uc3QgKklkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKEMsIElkeExpc3QsIE51bUlkeCk7CisgIH0KKyAgVmFsdWUgKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihDb25zdGFudCAqQywgVmFsdWUqIGNvbnN0ICpJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCkgY29uc3QgeworICAgIHJldHVybiBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMoQywgSWR4TGlzdCwgSWR4TGlzdCtOdW1JZHgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENhc3QvQ29udmVyc2lvbiBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgVmFsdWUgKkNyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkNhc3RPcHMgT3AsIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZShPcCwgQywgRGVzdFR5KTsKKyAgfQorICBWYWx1ZSAqQ3JlYXRlSW50Q2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSBjb25zdCB7CisgICAgcmV0dXJuIENhc3RJbnN0OjpDcmVhdGVJbnRlZ2VyQ2FzdChDLCBEZXN0VHksIGlzU2lnbmVkKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDb21wYXJlIEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBWYWx1ZSAqQ3JlYXRlSUNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUCwgQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBuZXcgSUNtcEluc3QoUCwgTEhTLCBSSFMpOworICB9CisgIFZhbHVlICpDcmVhdGVGQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQLCBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBGQ21wSW5zdChQLCBMSFMsIFJIUyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gT3RoZXIgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIFZhbHVlICpDcmVhdGVTZWxlY3QoQ29uc3RhbnQgKkMsIENvbnN0YW50ICpUcnVlLCBDb25zdGFudCAqRmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VsZWN0SW5zdDo6Q3JlYXRlKEMsIFRydWUsIEZhbHNlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVFeHRyYWN0RWxlbWVudChDb25zdGFudCAqVmVjLCBDb25zdGFudCAqSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEV4dHJhY3RFbGVtZW50SW5zdDo6Q3JlYXRlKFZlYywgSWR4KTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJbnNlcnRFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpOZXdFbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5zZXJ0RWxlbWVudEluc3Q6OkNyZWF0ZShWZWMsIE5ld0VsdCwgSWR4KTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTaHVmZmxlVmVjdG9yKENvbnN0YW50ICpWMSwgQ29uc3RhbnQgKlYyLCBDb25zdGFudCAqTWFzaykgY29uc3QgeworICAgIHJldHVybiBuZXcgU2h1ZmZsZVZlY3Rvckluc3QoVjEsIFYyLCBNYXNrKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVFeHRyYWN0VmFsdWUoQ29uc3RhbnQgKkFnZywgY29uc3QgdW5zaWduZWQgKklkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEV4dHJhY3RWYWx1ZUluc3Q6OkNyZWF0ZShBZ2csIElkeExpc3QsIElkeExpc3QrTnVtSWR4KTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJbnNlcnRWYWx1ZShDb25zdGFudCAqQWdnLCBDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKklkeExpc3QsIHVuc2lnbmVkIE51bUlkeCkgY29uc3QgeworICAgIHJldHVybiBJbnNlcnRWYWx1ZUluc3Q6OkNyZWF0ZShBZ2csIFZhbCwgSWR4TGlzdCwgSWR4TGlzdCtOdW1JZHgpOworICB9Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvT3V0cHV0QnVmZmVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9PdXRwdXRCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjk4ZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvT3V0cHV0QnVmZmVyLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8vPT09IE91dHB1dEJ1ZmZlci5oIC0gT3V0cHV0IEJ1ZmZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTWV0aG9kcyB0byBvdXRwdXQgdmFsdWVzIHRvIGEgZGF0YSBidWZmZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfT1VUUFVUQlVGRkVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX09VVFBVVEJVRkZFUl9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBPdXRwdXRCdWZmZXIgeworICAgIC8vLyBPdXRwdXQgYnVmZmVyLgorICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+ICZPdXRwdXQ7CisKKyAgICAvLy8gaXM2NEJpdC9pc0xpdHRsZUVuZGlhbiAtIFRoaXMgaW5mb3JtYXRpb24gaXMgaW5mZXJyZWQgZnJvbSB0aGUgdGFyZ2V0CisgICAgLy8vIG1hY2hpbmUgZGlyZWN0bHksIGluZGljYXRpbmcgd2hhdCBoZWFkZXIgdmFsdWVzIGFuZCBmbGFncyB0byBzZXQuCisgICAgYm9vbCBpczY0Qml0LCBpc0xpdHRsZUVuZGlhbjsKKyAgcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcihzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiAmT3V0LAorICAgICAgICAgICAgICAgICBib29sIGlzNjRiaXQsIGJvb2wgbGUpCisgICAgICA6IE91dHB1dChPdXQpLCBpczY0Qml0KGlzNjRiaXQpLCBpc0xpdHRsZUVuZGlhbihsZSkge30KKworICAgIC8vIGFsaWduIC0gRW1pdCBwYWRkaW5nIGludG8gdGhlIGZpbGUgdW50aWwgdGhlIGN1cnJlbnQgb3V0cHV0IHBvc2l0aW9uIGlzCisgICAgLy8gYWxpZ25lZCB0byB0aGUgc3BlY2lmaWVkIHBvd2VyIG9mIHR3byBib3VuZGFyeS4KKyAgICB2b2lkIGFsaWduKHVuc2lnbmVkIEJvdW5kYXJ5KSB7CisgICAgICBhc3NlcnQoQm91bmRhcnkgJiYgKEJvdW5kYXJ5ICYgKEJvdW5kYXJ5IC0gMSkpID09IDAgJiYKKyAgICAgICAgICAgICAiTXVzdCBhbGlnbiB0byAyXmsgYm91bmRhcnkiKTsKKyAgICAgIHNpemVfdCBTaXplID0gT3V0cHV0LnNpemUoKTsKKworICAgICAgaWYgKFNpemUgJiAoQm91bmRhcnkgLSAxKSkgeworICAgICAgICAvLyBBZGQgcGFkZGluZyB0byBnZXQgYWxpZ25tZW50IHRvIHRoZSBjb3JyZWN0IHBsYWNlLgorICAgICAgICBzaXplX3QgUGFkID0gQm91bmRhcnkgLSAoU2l6ZSAmIChCb3VuZGFyeSAtIDEpKTsKKyAgICAgICAgT3V0cHV0LnJlc2l6ZShTaXplICsgUGFkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gT3V0IEZ1bmN0aW9ucyAtIE91dHB1dCB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBkYXRhIGJ1ZmZlci4KKworICAgIHZvaWQgb3V0Ynl0ZSh1bnNpZ25lZCBjaGFyIFgpIHsKKyAgICAgIE91dHB1dC5wdXNoX2JhY2soWCk7CisgICAgfQorICAgIHZvaWQgb3V0aGFsZih1bnNpZ25lZCBzaG9ydCBYKSB7CisgICAgICBpZiAoaXNMaXR0bGVFbmRpYW4pIHsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjayhYICYgMjU1KTsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjayhYID4+IDgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjayhYID4+IDgpOworICAgICAgICBPdXRwdXQucHVzaF9iYWNrKFggJiAyNTUpOworICAgICAgfQorICAgIH0KKyAgICB2b2lkIG91dHdvcmQodW5zaWduZWQgWCkgeworICAgICAgaWYgKGlzTGl0dGxlRW5kaWFuKSB7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2soKFggPj4gIDApICYgMjU1KTsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjaygoWCA+PiAgOCkgJiAyNTUpOworICAgICAgICBPdXRwdXQucHVzaF9iYWNrKChYID4+IDE2KSAmIDI1NSk7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2soKFggPj4gMjQpICYgMjU1KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2soKFggPj4gMjQpICYgMjU1KTsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjaygoWCA+PiAxNikgJiAyNTUpOworICAgICAgICBPdXRwdXQucHVzaF9iYWNrKChYID4+ICA4KSAmIDI1NSk7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2soKFggPj4gIDApICYgMjU1KTsKKyAgICAgIH0KKyAgICB9CisgICAgdm9pZCBvdXR4d29yZCh1aW50NjRfdCBYKSB7CisgICAgICBpZiAoaXNMaXR0bGVFbmRpYW4pIHsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjayh1bnNpZ25lZChYID4+ICAwKSAmIDI1NSk7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2sodW5zaWduZWQoWCA+PiAgOCkgJiAyNTUpOworICAgICAgICBPdXRwdXQucHVzaF9iYWNrKHVuc2lnbmVkKFggPj4gMTYpICYgMjU1KTsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjayh1bnNpZ25lZChYID4+IDI0KSAmIDI1NSk7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2sodW5zaWduZWQoWCA+PiAzMikgJiAyNTUpOworICAgICAgICBPdXRwdXQucHVzaF9iYWNrKHVuc2lnbmVkKFggPj4gNDApICYgMjU1KTsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjayh1bnNpZ25lZChYID4+IDQ4KSAmIDI1NSk7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2sodW5zaWduZWQoWCA+PiA1NikgJiAyNTUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjayh1bnNpZ25lZChYID4+IDU2KSAmIDI1NSk7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2sodW5zaWduZWQoWCA+PiA0OCkgJiAyNTUpOworICAgICAgICBPdXRwdXQucHVzaF9iYWNrKHVuc2lnbmVkKFggPj4gNDApICYgMjU1KTsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjayh1bnNpZ25lZChYID4+IDMyKSAmIDI1NSk7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2sodW5zaWduZWQoWCA+PiAyNCkgJiAyNTUpOworICAgICAgICBPdXRwdXQucHVzaF9iYWNrKHVuc2lnbmVkKFggPj4gMTYpICYgMjU1KTsKKyAgICAgICAgT3V0cHV0LnB1c2hfYmFjayh1bnNpZ25lZChYID4+ICA4KSAmIDI1NSk7CisgICAgICAgIE91dHB1dC5wdXNoX2JhY2sodW5zaWduZWQoWCA+PiAgMCkgJiAyNTUpOworICAgICAgfQorICAgIH0KKyAgICB2b2lkIG91dGFkZHIzMih1bnNpZ25lZCBYKSB7CisgICAgICBvdXR3b3JkKFgpOworICAgIH0KKyAgICB2b2lkIG91dGFkZHI2NCh1aW50NjRfdCBYKSB7CisgICAgICBvdXR4d29yZChYKTsKKyAgICB9CisgICAgdm9pZCBvdXRhZGRyKHVpbnQ2NF90IFgpIHsKKyAgICAgIGlmICghaXM2NEJpdCkKKyAgICAgICAgb3V0d29yZCgodW5zaWduZWQpWCk7CisgICAgICBlbHNlCisgICAgICAgIG91dHh3b3JkKFgpOworICAgIH0KKyAgICB2b2lkIG91dHN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmUywgdW5zaWduZWQgTGVuZ3RoKSB7CisgICAgICB1bnNpZ25lZCBsZW5fdG9fY29weSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihTLmxlbmd0aCgpKSA8IExlbmd0aAorICAgICAgICA/IHN0YXRpY19jYXN0PHVuc2lnbmVkPihTLmxlbmd0aCgpKSA6IExlbmd0aDsKKyAgICAgIHVuc2lnbmVkIGxlbl90b19maWxsID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFMubGVuZ3RoKCkpIDwgTGVuZ3RoCisgICAgICAgID8gTGVuZ3RoIC0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFMubGVuZ3RoKCkpIDogMDsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbl90b19jb3B5OyArK2kpCisgICAgICAgIG91dGJ5dGUoU1tpXSk7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5fdG9fZmlsbDsgKytpKQorICAgICAgICBvdXRieXRlKDApOworICAgIH0KKworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgICAvLyBGaXggRnVuY3Rpb25zIC0gUmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSBhdCBhbiBvZmZzZXQuCisKKyAgICB2b2lkIGZpeGhhbGYodW5zaWduZWQgc2hvcnQgWCwgdW5zaWduZWQgT2Zmc2V0KSB7CisgICAgICB1bnNpZ25lZCBjaGFyICpQID0gJk91dHB1dFtPZmZzZXRdOworICAgICAgUFswXSA9IChYID4+IChpc0xpdHRsZUVuZGlhbiA/ICAwIDogOCkpICYgMjU1OworICAgICAgUFsxXSA9IChYID4+IChpc0xpdHRsZUVuZGlhbiA/ICA4IDogMCkpICYgMjU1OworICAgIH0KKyAgICB2b2lkIGZpeHdvcmQodW5zaWduZWQgWCwgdW5zaWduZWQgT2Zmc2V0KSB7CisgICAgICB1bnNpZ25lZCBjaGFyICpQID0gJk91dHB1dFtPZmZzZXRdOworICAgICAgUFswXSA9IChYID4+IChpc0xpdHRsZUVuZGlhbiA/ICAwIDogMjQpKSAmIDI1NTsKKyAgICAgIFBbMV0gPSAoWCA+PiAoaXNMaXR0bGVFbmRpYW4gPyAgOCA6IDE2KSkgJiAyNTU7CisgICAgICBQWzJdID0gKFggPj4gKGlzTGl0dGxlRW5kaWFuID8gMTYgOiAgOCkpICYgMjU1OworICAgICAgUFszXSA9IChYID4+IChpc0xpdHRsZUVuZGlhbiA/IDI0IDogIDApKSAmIDI1NTsKKyAgICB9CisgICAgdm9pZCBmaXh4d29yZCh1aW50NjRfdCBYLCB1bnNpZ25lZCBPZmZzZXQpIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKlAgPSAmT3V0cHV0W09mZnNldF07CisgICAgICBQWzBdID0gKFggPj4gKGlzTGl0dGxlRW5kaWFuID8gIDAgOiA1NikpICYgMjU1OworICAgICAgUFsxXSA9IChYID4+IChpc0xpdHRsZUVuZGlhbiA/ICA4IDogNDgpKSAmIDI1NTsKKyAgICAgIFBbMl0gPSAoWCA+PiAoaXNMaXR0bGVFbmRpYW4gPyAxNiA6IDQwKSkgJiAyNTU7CisgICAgICBQWzNdID0gKFggPj4gKGlzTGl0dGxlRW5kaWFuID8gMjQgOiAzMikpICYgMjU1OworICAgICAgUFs0XSA9IChYID4+IChpc0xpdHRsZUVuZGlhbiA/IDMyIDogMjQpKSAmIDI1NTsKKyAgICAgIFBbNV0gPSAoWCA+PiAoaXNMaXR0bGVFbmRpYW4gPyA0MCA6IDE2KSkgJiAyNTU7CisgICAgICBQWzZdID0gKFggPj4gKGlzTGl0dGxlRW5kaWFuID8gNDggOiAgOCkpICYgMjU1OworICAgICAgUFs3XSA9IChYID4+IChpc0xpdHRsZUVuZGlhbiA/IDU2IDogIDApKSAmIDI1NTsKKyAgICB9CisgICAgdm9pZCBmaXhhZGRyKHVpbnQ2NF90IFgsIHVuc2lnbmVkIE9mZnNldCkgeworICAgICAgaWYgKCFpczY0Qml0KQorICAgICAgICBmaXh3b3JkKCh1bnNpZ25lZClYLCBPZmZzZXQpOworICAgICAgZWxzZQorICAgICAgICBmaXh4d29yZChYLCBPZmZzZXQpOworICAgIH0KKworICAgIHVuc2lnbmVkIGNoYXIgJm9wZXJhdG9yW10odW5zaWduZWQgSW5kZXgpIHsKKyAgICAgIHJldHVybiBPdXRwdXRbSW5kZXhdOworICAgIH0KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICZvcGVyYXRvcltdKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgICAgICByZXR1cm4gT3V0cHV0W0luZGV4XTsKKyAgICB9CisgIH07CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfT1VUUFVUQlVGRkVSX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Bhc3NOYW1lUGFyc2VyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QYXNzTmFtZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNGE2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QYXNzTmFtZVBhcnNlci5oCkBAIC0wLDAgKzEsMTM3IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L1Bhc3NOYW1lUGFyc2VyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSB0aGUgUGFzc05hbWVQYXJzZXIgYW5kIEZpbHRlcmVkUGFzc05hbWVQYXJzZXI8PiBjbGFzc2VzLCB3aGljaCBhcmUKKy8vIHVzZWQgdG8gYWRkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gYSB1dGlsaXR5IGZvciBhbGwgb2YgdGhlIHBhc3NlcyB0aGF0CisvLyBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBpbnRvIHRoZSBzeXN0ZW0uCisvLworLy8gVGhlIFBhc3NOYW1lUGFyc2VyIGNsYXNzIGFkZHMgQUxMIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgc3lzdGVtICh0aGF0IGFyZQorLy8gY3JlYXRhYmxlKSBhcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHRoZSB0b29sICh3aGVuIGluc3RhbnRpYXRlZCB3aXRoIHRoZQorLy8gYXBwcm9wcmlhdGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0ZW1wbGF0ZSkuICBUaGUgRmlsdGVyZWRQYXNzTmFtZVBhcnNlcjw+CisvLyB0ZW1wbGF0ZSBpcyB1c2VkIGZvciB0aGUgc2FtZSBwdXJwb3NlcyBhcyBQYXNzTmFtZVBhcnNlciwgZXhjZXB0IHRoYXQgaXQgb25seQorLy8gaW5jbHVkZXMgcGFzc2VzIHRoYXQgaGF2ZSBhIFBhc3NUeXBlIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZmlsdGVyCisvLyAod2hpY2ggaXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50KS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9QQVNTX05BTUVfUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1BBU1NfTkFNRV9QQVJTRVJfSAorCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXNzTmFtZVBhcnNlciBjbGFzcyAtIE1ha2UgdXNlIG9mIHRoZSBwYXNzIHJlZ2lzdHJhdGlvbiBtZWNoYW5pc20gdG8KKy8vIGF1dG9tYXRpY2FsbHkgYWRkIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIG9wdCBmb3IgZWFjaCBwYXNzLgorLy8KK2NsYXNzIFBhc3NOYW1lUGFyc2VyIDogcHVibGljIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGNsOjpwYXJzZXI8Y29uc3QgUGFzc0luZm8qPiB7CisgIGNsOjpPcHRpb24gKk9wdDsKK3B1YmxpYzoKKyAgUGFzc05hbWVQYXJzZXIoKSA6IE9wdCgwKSB7fQorICB2aXJ0dWFsIH5QYXNzTmFtZVBhcnNlcigpOworCisgIHZvaWQgaW5pdGlhbGl6ZShjbDo6T3B0aW9uICZPKSB7CisgICAgT3B0ID0gJk87CisgICAgY2w6OnBhcnNlcjxjb25zdCBQYXNzSW5mbyo+Ojppbml0aWFsaXplKE8pOworCisgICAgLy8gQWRkIGFsbCBvZiB0aGUgcGFzc2VzIHRvIHRoZSBtYXAgdGhhdCBnb3QgaW5pdGlhbGl6ZWQgYmVmb3JlICd0aGlzJyBkaWQuCisgICAgZW51bWVyYXRlUGFzc2VzKCk7CisgIH0KKworICAvLyBpZ25vcmFibGVQYXNzSW1wbCAtIENhbiBiZSBvdmVycmlkZW4gaW4gc3ViY2xhc3NlcyB0byByZWZpbmUgdGhlIGxpc3Qgb2YKKyAgLy8gd2hpY2ggcGFzc2VzIHdlIHdhbnQgdG8gaW5jbHVkZS4KKyAgLy8KKyAgdmlydHVhbCBib29sIGlnbm9yYWJsZVBhc3NJbXBsKGNvbnN0IFBhc3NJbmZvICpQKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIGlubGluZSBib29sIGlnbm9yYWJsZVBhc3MoY29uc3QgUGFzc0luZm8gKlApIGNvbnN0IHsKKyAgICAvLyBJZ25vcmUgbm9uLXNlbGVjdGFibGUgYW5kIG5vbi1jb25zdHJ1Y3RpYmxlIHBhc3NlcyEgIElnbm9yZQorICAgIC8vIG5vbi1vcHRpbWl6YXRpb25zLgorICAgIHJldHVybiBQLT5nZXRQYXNzQXJndW1lbnQoKSA9PSAwIHx8ICpQLT5nZXRQYXNzQXJndW1lbnQoKSA9PSAwIHx8CisgICAgICAgICAgIFAtPmdldE5vcm1hbEN0b3IoKSA9PSAwIHx8IGlnbm9yYWJsZVBhc3NJbXBsKFApOworICB9CisKKyAgLy8gSW1wbGVtZW50IHRoZSBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgY2FsbGJhY2tzIHVzZWQgdG8gcG9wdWxhdGUgb3VyIG1hcAorICAvLworICB2aXJ0dWFsIHZvaWQgcGFzc1JlZ2lzdGVyZWQoY29uc3QgUGFzc0luZm8gKlApIHsKKyAgICBpZiAoaWdub3JhYmxlUGFzcyhQKSB8fCAhT3B0KSByZXR1cm47CisgICAgaWYgKGZpbmRPcHRpb24oUC0+Z2V0UGFzc0FyZ3VtZW50KCkpICE9IGdldE51bU9wdGlvbnMoKSkgeworICAgICAgZXJycygpIDw8ICJUd28gcGFzc2VzIHdpdGggdGhlIHNhbWUgYXJndW1lbnQgKC0iCisgICAgICAgICAgIDw8IFAtPmdldFBhc3NBcmd1bWVudCgpIDw8ICIpIGF0dGVtcHRlZCB0byBiZSByZWdpc3RlcmVkIVxuIjsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgICAgfQorICAgIGFkZExpdGVyYWxPcHRpb24oUC0+Z2V0UGFzc0FyZ3VtZW50KCksIFAsIFAtPmdldFBhc3NOYW1lKCkpOworICB9CisgIHZpcnR1YWwgdm9pZCBwYXNzRW51bWVyYXRlKGNvbnN0IFBhc3NJbmZvICpQKSB7IHBhc3NSZWdpc3RlcmVkKFApOyB9CisKKyAgLy8gcHJpbnRPcHRpb25JbmZvIC0gUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3B0aW9uLiAgT3ZlcnJpZGUgdGhlCisgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gc29ydCB0aGUgdGFibGUgYmVmb3JlIHdlIHByaW50Li4uCisgIHZpcnR1YWwgdm9pZCBwcmludE9wdGlvbkluZm8oY29uc3QgY2w6Ok9wdGlvbiAmTywgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdCB7CisgICAgUGFzc05hbWVQYXJzZXIgKlBOUCA9IGNvbnN0X2Nhc3Q8UGFzc05hbWVQYXJzZXIqPih0aGlzKTsKKyAgICBhcnJheV9wb2Rfc29ydChQTlAtPlZhbHVlcy5iZWdpbigpLCBQTlAtPlZhbHVlcy5lbmQoKSwgVmFsTGVzc1RoYW4pOworICAgIGNsOjpwYXJzZXI8Y29uc3QgUGFzc0luZm8qPjo6cHJpbnRPcHRpb25JbmZvKE8sIEdsb2JhbFdpZHRoKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBWYWxMZXNzVGhhbiAtIFByb3ZpZGUgYSBzb3J0aW5nIGNvbXBhcmF0b3IgZm9yIFZhbHVlcyBlbGVtZW50cy4uLgorICBzdGF0aWMgaW50IFZhbExlc3NUaGFuKGNvbnN0IHZvaWQgKlZUMSwgY29uc3Qgdm9pZCAqVlQyKSB7CisgICAgdHlwZWRlZiBQYXNzTmFtZVBhcnNlcjo6T3B0aW9uSW5mbyBWYWxUeXBlOworICAgIHJldHVybiBzdGQ6OnN0cmNtcChzdGF0aWNfY2FzdDxjb25zdCBWYWxUeXBlICo+KFZUMSktPk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFZhbFR5cGUgKj4oVlQyKS0+TmFtZSk7CisgIH0KK307CisKKy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZpbHRlcmVkUGFzc05hbWVQYXJzZXIgY2xhc3MgLSBNYWtlIHVzZSBvZiB0aGUgcGFzcyByZWdpc3RyYXRpb24KKy8vLyBtZWNoYW5pc20gdG8gYXV0b21hdGljYWxseSBhZGQgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdG8gb3B0IGZvcgorLy8vIGVhY2ggcGFzcyB0aGF0IHNhdGlzZmllcyBhIGZpbHRlciBjcml0ZXJpYS4gIEZpbHRlciBzaG91bGQgcmV0dXJuCisvLy8gdHJ1ZSBmb3IgcGFzc2VzIHRvIGJlIHJlZ2lzdGVyZWQgYXMgY29tbWFuZC1saW5lIG9wdGlvbnMuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIEZpbHRlcj4KK2NsYXNzIEZpbHRlcmVkUGFzc05hbWVQYXJzZXIgOiBwdWJsaWMgUGFzc05hbWVQYXJzZXIgeworcHJpdmF0ZToKKyAgRmlsdGVyIGZpbHRlcjsKKworcHVibGljOgorICBib29sIGlnbm9yYWJsZVBhc3NJbXBsKGNvbnN0IFBhc3NJbmZvICpQKSBjb25zdCB7IHJldHVybiAhZmlsdGVyKCpQKTsgfQorfTsKKworLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUGFzc0FyZ0ZpbHRlciAtIEEgZmlsdGVyIGZvciB1c2Ugd2l0aCBQYXNzTmFtZUZpbHRlclBhcnNlciB0aGF0IG9ubHkKKy8vLyBhY2NlcHRzIGEgUGFzcyB3aG9zZSBBcmcgbWF0Y2hlcyBjZXJ0YWluIHN0cmluZ3MuCisvLy8KKy8vLyBVc2UgbGlrZSB0aGlzOgorLy8vCisvLy8gZXh0ZXJuIGNvbnN0IGNoYXIgQWxsb3dlZFBhc3NBcmdzW10gPSAiLWFuZGVyc19hYSAtZHNlIjsKKy8vLworLy8vIHN0YXRpYyBjbDo6bGlzdDwKKy8vLyAgIGNvbnN0IFBhc3NJbmZvKiwKKy8vLyAgIGJvb2wsCisvLy8gICBGaWx0ZXJlZFBhc3NOYW1lUGFyc2VyPFBhc3NBcmdGaWx0ZXI8QWxsb3dlZFBhc3NBcmdzPiA+ID4KKy8vLyBQYXNzTGlzdChjbDo6ZGVzYygiUGFzc2VzIGF2YWlsYWJsZToiKSk7CisvLy8KKy8vLyBPbmx5IHRoZSAtYW5kZXJzX2FhIGFuZCAtZHNlIG9wdGlvbnMgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIuCisvLy8KK3RlbXBsYXRlPGNvbnN0IGNoYXIgKkFyZ3M+CitjbGFzcyBQYXNzQXJnRmlsdGVyIHsKK3B1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFBhc3NJbmZvICZQKSBjb25zdCB7CisgICAgcmV0dXJuKHN0ZDo6c3Ryc3RyKEFyZ3MsIFAuZ2V0UGFzc0FyZ3VtZW50KCkpKTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QYXR0ZXJuTWF0Y2guaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BhdHRlcm5NYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMmJjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QYXR0ZXJuTWF0Y2guaApAQCAtMCwwICsxLDYxNyBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvUGF0dGVybk1hdGNoLmggLSBNYXRjaCBvbiB0aGUgTExWTSBJUiAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgYSBzaW1wbGUgYW5kIGVmZmljaWVudCBtZWNoYW5pc20gZm9yIHBlcmZvcm1pbmcgZ2VuZXJhbAorLy8gdHJlZS1iYXNlZCBwYXR0ZXJuIG1hdGNoZXMgb24gdGhlIExMVk0gSVIuICBUaGUgcG93ZXIgb2YgdGhlc2Ugcm91dGluZXMgaXMKKy8vIHRoYXQgaXQgYWxsb3dzIHlvdSB0byB3cml0ZSBjb25jaXNlIHBhdHRlcm5zIHRoYXQgYXJlIGV4cHJlc3NpdmUgYW5kIGVhc3kgdG8KKy8vIHVuZGVyc3RhbmQuICBUaGUgb3RoZXIgbWFqb3IgYWR2YW50YWdlIG9mIHRoaXMgaXMgdGhhdCBpdCBhbGxvd3MgeW91IHRvCisvLyB0cml2aWFsbHkgY2FwdHVyZS9iaW5kIGVsZW1lbnRzIGluIHRoZSBwYXR0ZXJuIHRvIHZhcmlhYmxlcy4gIEZvciBleGFtcGxlLAorLy8geW91IGNhbiBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOgorLy8KKy8vICBWYWx1ZSAqRXhwID0gLi4uCisvLyAgVmFsdWUgKlgsICpZOyAgQ29uc3RhbnRJbnQgKkMxLCAqQzI7ICAgICAgLy8gKFggJiBDMSkgfCAoWSAmIEMyKQorLy8gIGlmIChtYXRjaChFeHAsIG1fT3IobV9BbmQobV9WYWx1ZShYKSwgbV9Db25zdGFudEludChDMSkpLAorLy8gICAgICAgICAgICAgICAgICAgICAgbV9BbmQobV9WYWx1ZShZKSwgbV9Db25zdGFudEludChDMikpKSkpIHsKKy8vICAgIC4uLiBQYXR0ZXJuIGlzIG1hdGNoZWQgYW5kIHZhcmlhYmxlcyBhcmUgYm91bmQgLi4uCisvLyAgfQorLy8KKy8vIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCB0byB0aGluZ3MgbGlrZSB0aGUgaW5zdHJ1Y3Rpb24gY29tYmluZXIsIGJ1dCBjYW4KKy8vIGFsc28gYmUgdXNlZnVsIGZvciBzdGF0aWMgYW5hbHlzaXMgdG9vbHMgb3IgY29kZSBnZW5lcmF0b3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1BBVFRFUk5NQVRDSF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9QQVRURVJOTUFUQ0hfSAorCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgUGF0dGVybk1hdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsLCB0eXBlbmFtZSBQYXR0ZXJuPgorYm9vbCBtYXRjaChWYWwgKlYsIGNvbnN0IFBhdHRlcm4gJlApIHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8UGF0dGVybiY+KFApLm1hdGNoKFYpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDbGFzcz4KK3N0cnVjdCBsZWFmX3R5IHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSVR5PgorICBib29sIG1hdGNoKElUeSAqVikgeyByZXR1cm4gaXNhPENsYXNzPihWKTsgfQorfTsKKworLy8vIG1fVmFsdWUoKSAtIE1hdGNoIGFuIGFyYml0cmFyeSB2YWx1ZSBhbmQgaWdub3JlIGl0LgoraW5saW5lIGxlYWZfdHk8VmFsdWU+IG1fVmFsdWUoKSB7IHJldHVybiBsZWFmX3R5PFZhbHVlPigpOyB9CisvLy8gbV9Db25zdGFudEludCgpIC0gTWF0Y2ggYW4gYXJiaXRyYXJ5IENvbnN0YW50SW50IGFuZCBpZ25vcmUgaXQuCitpbmxpbmUgbGVhZl90eTxDb25zdGFudEludD4gbV9Db25zdGFudEludCgpIHsgcmV0dXJuIGxlYWZfdHk8Q29uc3RhbnRJbnQ+KCk7IH0KKwordGVtcGxhdGU8aW50NjRfdCBWYWw+CitzdHJ1Y3QgY29uc3RhbnRpbnRfdHkgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJVHk+CisgIGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgaWYgKGNvbnN0IENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKSkgeworICAgICAgY29uc3QgQVBJbnQgJkNJViA9IENJLT5nZXRWYWx1ZSgpOworICAgICAgaWYgKFZhbCA+PSAwKQorICAgICAgICByZXR1cm4gQ0lWID09IHN0YXRpY19jYXN0PHVpbnQ2NF90PihWYWwpOworICAgICAgLy8gSWYgVmFsIGlzIG5lZ2F0aXZlLCBhbmQgQ0kgaXMgc2hvcnRlciB0aGFuIGl0LCB0cnVuY2F0ZSB0byB0aGUgcmlnaHQKKyAgICAgIC8vIG51bWJlciBvZiBiaXRzLiAgSWYgaXQgaXMgbGFyZ2VyLCB0aGVuIHdlIGhhdmUgdG8gc2lnbiBleHRlbmQuICBKdXN0CisgICAgICAvLyBjb21wYXJlIHRoZWlyIG5lZ2F0ZWQgdmFsdWVzLgorICAgICAgcmV0dXJuIC1DSVYgPT0gLVZhbDsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gbV9Db25zdGFudEludChpbnQ2NF90KSAtIE1hdGNoIGEgQ29uc3RhbnRJbnQgd2l0aCBhIHNwZWNpZmljIHZhbHVlCisvLy8gYW5kIGlnbm9yZSBpdC4KK3RlbXBsYXRlPGludDY0X3QgVmFsPgoraW5saW5lIGNvbnN0YW50aW50X3R5PFZhbD4gbV9Db25zdGFudEludCgpIHsKKyAgcmV0dXJuIGNvbnN0YW50aW50X3R5PFZhbD4oKTsKK30KKworc3RydWN0IHplcm9fdHkgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJVHk+CisgIGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgaWYgKGNvbnN0IENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEMtPmlzTnVsbFZhbHVlKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gbV9aZXJvKCkgLSBNYXRjaCBhbiBhcmJpdHJhcnkgemVyby9udWxsIGNvbnN0YW50LgoraW5saW5lIHplcm9fdHkgbV9aZXJvKCkgeyByZXR1cm4gemVyb190eSgpOyB9CisKK3N0cnVjdCBvbmVfdHkgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJVHk+CisgIGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgaWYgKGNvbnN0IENvbnN0YW50SW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFYpKQorICAgICAgcmV0dXJuIEMtPmlzT25lKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gbV9PbmUoKSAtIE1hdGNoIGEgYW4gaW50ZWdlciAxLgoraW5saW5lIG9uZV90eSBtX09uZSgpIHsgcmV0dXJuIG9uZV90eSgpOyB9CisgIAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDbGFzcz4KK3N0cnVjdCBiaW5kX3R5IHsKKyAgQ2xhc3MgKiZWUjsKKyAgYmluZF90eShDbGFzcyAqJlYpIDogVlIoVikge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJVHk+CisgIGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgaWYgKENsYXNzICpDViA9IGR5bl9jYXN0PENsYXNzPihWKSkgeworICAgICAgVlIgPSBDVjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBtX1ZhbHVlIC0gTWF0Y2ggYSB2YWx1ZSwgY2FwdHVyaW5nIGl0IGlmIHdlIG1hdGNoLgoraW5saW5lIGJpbmRfdHk8VmFsdWU+IG1fVmFsdWUoVmFsdWUgKiZWKSB7IHJldHVybiBWOyB9CisKKy8vLyBtX0NvbnN0YW50SW50IC0gTWF0Y2ggYSBDb25zdGFudEludCwgY2FwdHVyaW5nIHRoZSB2YWx1ZSBpZiB3ZSBtYXRjaC4KK2lubGluZSBiaW5kX3R5PENvbnN0YW50SW50PiBtX0NvbnN0YW50SW50KENvbnN0YW50SW50IComQ0kpIHsgcmV0dXJuIENJOyB9CisKKy8vLyBzcGVjaWZpY3ZhbF90eSAtIE1hdGNoIGEgc3BlY2lmaWVkIFZhbHVlKi4KK3N0cnVjdCBzcGVjaWZpY3ZhbF90eSB7CisgIGNvbnN0IFZhbHVlICpWYWw7CisgIHNwZWNpZmljdmFsX3R5KGNvbnN0IFZhbHVlICpWKSA6IFZhbChWKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIElUeT4KKyAgYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICByZXR1cm4gViA9PSBWYWw7CisgIH0KK307CisKKy8vLyBtX1NwZWNpZmljIC0gTWF0Y2ggaWYgd2UgaGF2ZSBhIHNwZWNpZmljIHNwZWNpZmllZCB2YWx1ZS4KK2lubGluZSBzcGVjaWZpY3ZhbF90eSBtX1NwZWNpZmljKGNvbnN0IFZhbHVlICpWKSB7IHJldHVybiBWOyB9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBzcGVjaWZpYyBiaW5hcnkgb3BlcmF0b3JzLgorLy8KKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTX3QsIHR5cGVuYW1lIFJIU190LAorICAgICAgICAgdW5zaWduZWQgT3Bjb2RlLCB0eXBlbmFtZSBDb25jcmV0ZVR5ID0gQmluYXJ5T3BlcmF0b3I+CitzdHJ1Y3QgQmluYXJ5T3BfbWF0Y2ggeworICBMSFNfdCBMOworICBSSFNfdCBSOworCisgIEJpbmFyeU9wX21hdGNoKGNvbnN0IExIU190ICZMSFMsIGNvbnN0IFJIU190ICZSSFMpIDogTChMSFMpLCBSKFJIUykge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPcFR5PgorICBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpJbnN0cnVjdGlvblZhbCArIE9wY29kZSkgeworICAgICAgQ29uY3JldGVUeSAqSSA9IGNhc3Q8Q29uY3JldGVUeT4oVik7CisgICAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gT3Bjb2RlICYmIEwubWF0Y2goSS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICAgICBSLm1hdGNoKEktPmdldE9wZXJhbmQoMSkpOworICAgIH0KKyAgICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVikpCisgICAgICByZXR1cm4gQ0UtPmdldE9wY29kZSgpID09IE9wY29kZSAmJiBMLm1hdGNoKENFLT5nZXRPcGVyYW5kKDApKSAmJgorICAgICAgICAgICAgIFIubWF0Y2goQ0UtPmdldE9wZXJhbmQoMSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBZGQ+IG1fQWRkKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkFkZD4oTCwgUik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RkFkZD4gbV9GQWRkKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RkFkZD4oTCwgUik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U3ViPiBtX1N1Yihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTdWI+KEwsIFIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkZTdWI+IG1fRlN1Yihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkZTdWI+KEwsIFIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Ok11bD4gbV9NdWwoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6TXVsPihMLCBSKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGTXVsPiBtX0ZNdWwoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGTXVsPihMLCBSKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpVRGl2PiBtX1VEaXYoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6VURpdj4oTCwgUik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U0Rpdj4gbV9TRGl2KGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNEaXY+KEwsIFIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkZEaXY+IG1fRkRpdihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGRGl2PihMLCBSKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpVUmVtPiBtX1VSZW0oY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpVUmVtPihMLCBSKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTUmVtPiBtX1NSZW0oY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTUmVtPihMLCBSKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGUmVtPiBtX0ZSZW0oY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RlJlbT4oTCwgUik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QW5kPiBtX0FuZChjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBbmQ+KEwsIFIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Ok9yPiBtX09yKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpPcj4oTCwgUik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6WG9yPiBtX1hvcihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpYb3I+KEwsIFIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNobD4gbV9TaGwoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U2hsPihMLCBSKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpMU2hyPiBtX0xTaHIoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpMU2hyPihMLCBSKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBU2hyPiBtX0FTaHIoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBU2hyPihMLCBSKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBlaXRoZXIgQVNociBvciBMU2hyIC4uIGZvciBjb252ZW5pZW5jZQorLy8KK3RlbXBsYXRlPHR5cGVuYW1lIExIU190LCB0eXBlbmFtZSBSSFNfdCwgdHlwZW5hbWUgQ29uY3JldGVUeSA9IEJpbmFyeU9wZXJhdG9yPgorc3RydWN0IFNocl9tYXRjaCB7CisgIExIU190IEw7CisgIFJIU190IFI7CisKKyAgU2hyX21hdGNoKGNvbnN0IExIU190ICZMSFMsIGNvbnN0IFJIU190ICZSSFMpIDogTChMSFMpLCBSKFJIUykge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPcFR5PgorICBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpJbnN0cnVjdGlvblZhbCArIEluc3RydWN0aW9uOjpMU2hyIHx8CisgICAgICAgIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6SW5zdHJ1Y3Rpb25WYWwgKyBJbnN0cnVjdGlvbjo6QVNocikgeworICAgICAgQ29uY3JldGVUeSAqSSA9IGNhc3Q8Q29uY3JldGVUeT4oVik7CisgICAgICByZXR1cm4gKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBU2hyIHx8CisgICAgICAgICAgICAgIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpMU2hyKSAmJgorICAgICAgICAgICAgIEwubWF0Y2goSS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICAgICBSLm1hdGNoKEktPmdldE9wZXJhbmQoMSkpOworICAgIH0KKyAgICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVikpCisgICAgICByZXR1cm4gKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TFNociB8fAorICAgICAgICAgICAgICBDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFTaHIpICYmCisgICAgICAgICAgICAgTC5tYXRjaChDRS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICAgICBSLm1hdGNoKENFLT5nZXRPcGVyYW5kKDEpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIFNocl9tYXRjaDxMSFMsIFJIUz4gbV9TaHIoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIFNocl9tYXRjaDxMSFMsIFJIUz4oTCwgUik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgYmluYXJ5IGNsYXNzZXMKKy8vCisKK3RlbXBsYXRlPHR5cGVuYW1lIExIU190LCB0eXBlbmFtZSBSSFNfdCwgdHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIE9wY1R5cGU+CitzdHJ1Y3QgQmluYXJ5T3BDbGFzc19tYXRjaCB7CisgIE9wY1R5cGUgKk9wY29kZTsKKyAgTEhTX3QgTDsKKyAgUkhTX3QgUjsKKworICBCaW5hcnlPcENsYXNzX21hdGNoKE9wY1R5cGUgJk9wLCBjb25zdCBMSFNfdCAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIU190ICZSSFMpCisgICAgOiBPcGNvZGUoJk9wKSwgTChMSFMpLCBSKFJIUykge30KKyAgQmluYXJ5T3BDbGFzc19tYXRjaChjb25zdCBMSFNfdCAmTEhTLCBjb25zdCBSSFNfdCAmUkhTKQorICAgIDogT3Bjb2RlKDApLCBMKExIUyksIFIoUkhTKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE9wVHk+CisgIGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChDbGFzcyAqSSA9IGR5bl9jYXN0PENsYXNzPihWKSkKKyAgICAgIGlmIChMLm1hdGNoKEktPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgICAgUi5tYXRjaChJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICBpZiAoT3Bjb2RlKQorICAgICAgICAgICpPcGNvZGUgPSBJLT5nZXRPcGNvZGUoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisjaWYgMCAgLy8gRG9lc24ndCBoYW5kbGUgY29uc3RhbnRleHBycyB5ZXQhCisgICAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKQorICAgICAgcmV0dXJuIENFLT5nZXRPcGNvZGUoKSA9PSBPcGNvZGUgJiYgTC5tYXRjaChDRS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICAgICBSLm1hdGNoKENFLT5nZXRPcGVyYW5kKDEpKTsKKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BDbGFzc19tYXRjaDxMSFMsIFJIUywgQmluYXJ5T3BlcmF0b3IsIEluc3RydWN0aW9uOjpCaW5hcnlPcHM+CittX1NoaWZ0KEluc3RydWN0aW9uOjpCaW5hcnlPcHMgJk9wLCBjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BDbGFzc19tYXRjaDxMSFMsIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IsIEluc3RydWN0aW9uOjpCaW5hcnlPcHM+KE9wLCBMLCBSKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BDbGFzc19tYXRjaDxMSFMsIFJIUywgQmluYXJ5T3BlcmF0b3IsIEluc3RydWN0aW9uOjpCaW5hcnlPcHM+CittX1NoaWZ0KGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcENsYXNzX21hdGNoPExIUywgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcz4oTCwgUik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgQ21wSW5zdCBjbGFzc2VzCisvLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMSFNfdCwgdHlwZW5hbWUgUkhTX3QsIHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBQcmVkaWNhdGVUeT4KK3N0cnVjdCBDbXBDbGFzc19tYXRjaCB7CisgIFByZWRpY2F0ZVR5ICZQcmVkaWNhdGU7CisgIExIU190IEw7CisgIFJIU190IFI7CisKKyAgQ21wQ2xhc3NfbWF0Y2goUHJlZGljYXRlVHkgJlByZWQsIGNvbnN0IExIU190ICZMSFMsCisgICAgICAgICAgICAgICAgIGNvbnN0IFJIU190ICZSSFMpCisgICAgOiBQcmVkaWNhdGUoUHJlZCksIEwoTEhTKSwgUihSSFMpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3BUeT4KKyAgYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKENsYXNzICpJID0gZHluX2Nhc3Q8Q2xhc3M+KFYpKQorICAgICAgaWYgKEwubWF0Y2goSS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICBSLm1hdGNoKEktPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgIFByZWRpY2F0ZSA9IEktPmdldFByZWRpY2F0ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIENtcENsYXNzX21hdGNoPExIUywgUkhTLCBJQ21wSW5zdCwgSUNtcEluc3Q6OlByZWRpY2F0ZT4KK21fSUNtcChJQ21wSW5zdDo6UHJlZGljYXRlICZQcmVkLCBjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQ21wQ2xhc3NfbWF0Y2g8TEhTLCBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdCwgSUNtcEluc3Q6OlByZWRpY2F0ZT4oUHJlZCwgTCwgUik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIENtcENsYXNzX21hdGNoPExIUywgUkhTLCBGQ21wSW5zdCwgRkNtcEluc3Q6OlByZWRpY2F0ZT4KK21fRkNtcChGQ21wSW5zdDo6UHJlZGljYXRlICZQcmVkLCBjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQ21wQ2xhc3NfbWF0Y2g8TEhTLCBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICBGQ21wSW5zdCwgRkNtcEluc3Q6OlByZWRpY2F0ZT4oUHJlZCwgTCwgUik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgU2VsZWN0SW5zdCBjbGFzc2VzCisvLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDb25kX3QsIHR5cGVuYW1lIExIU190LCB0eXBlbmFtZSBSSFNfdD4KK3N0cnVjdCBTZWxlY3RDbGFzc19tYXRjaCB7CisgIENvbmRfdCBDOworICBMSFNfdCBMOworICBSSFNfdCBSOworCisgIFNlbGVjdENsYXNzX21hdGNoKGNvbnN0IENvbmRfdCAmQ29uZCwgY29uc3QgTEhTX3QgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTX3QgJlJIUykKKyAgICA6IEMoQ29uZCksIEwoTEhTKSwgUihSSFMpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3BUeT4KKyAgYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKFNlbGVjdEluc3QgKkkgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihWKSkKKyAgICAgIHJldHVybiBDLm1hdGNoKEktPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgICAgICAgTC5tYXRjaChJLT5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgICAgICAgIFIubWF0Y2goSS0+Z2V0T3BlcmFuZCgyKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDb25kLCB0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBTZWxlY3RDbGFzc19tYXRjaDxDb25kLCBMSFMsIFJIUz4KK21fU2VsZWN0KGNvbnN0IENvbmQgJkMsIGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBTZWxlY3RDbGFzc19tYXRjaDxDb25kLCBMSFMsIFJIUz4oQywgTCwgUik7Cit9CisKKy8vLyBtX1NlbGVjdENzdCAtIFRoaXMgbWF0Y2hlcyBhIHNlbGVjdCBvZiB0d28gY29uc3RhbnRzLCBlLmcuOgorLy8vICAgIG1fU2VsZWN0Q3N0PC0xLCAwPihtX1ZhbHVlKFYpKQordGVtcGxhdGU8aW50NjRfdCBMLCBpbnQ2NF90IFIsIHR5cGVuYW1lIENvbmQ+CitpbmxpbmUgU2VsZWN0Q2xhc3NfbWF0Y2g8Q29uZCwgY29uc3RhbnRpbnRfdHk8TD4sIGNvbnN0YW50aW50X3R5PFI+ID4KK21fU2VsZWN0Q3N0KGNvbnN0IENvbmQgJkMpIHsKKyAgcmV0dXJuIFNlbGVjdENsYXNzX21hdGNoPENvbmQsIGNvbnN0YW50aW50X3R5PEw+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRpbnRfdHk8Uj4gPihDLCBtX0NvbnN0YW50SW50PEw+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Db25zdGFudEludDxSPigpKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWF0Y2hlcnMgZm9yIENhc3RJbnN0IGNsYXNzZXMKKy8vCisKK3RlbXBsYXRlPHR5cGVuYW1lIE9wX3QsIHVuc2lnbmVkIE9wY29kZT4KK3N0cnVjdCBDYXN0Q2xhc3NfbWF0Y2ggeworICBPcF90IE9wOworCisgIENhc3RDbGFzc19tYXRjaChjb25zdCBPcF90ICZPcE1hdGNoKSA6IE9wKE9wTWF0Y2gpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3BUeT4KKyAgYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKENhc3RJbnN0ICpJID0gZHluX2Nhc3Q8Q2FzdEluc3Q+KFYpKQorICAgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IE9wY29kZSAmJiBPcC5tYXRjaChJLT5nZXRPcGVyYW5kKDApKTsKKyAgICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVikpCisgICAgICByZXR1cm4gQ0UtPmdldE9wY29kZSgpID09IE9wY29kZSAmJiBPcC5tYXRjaChDRS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gbV9QdHJUb0ludAordGVtcGxhdGU8dHlwZW5hbWUgT3BUeT4KK2lubGluZSBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlB0clRvSW50PgorbV9QdHJUb0ludChjb25zdCBPcFR5ICZPcCkgeworICByZXR1cm4gQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpQdHJUb0ludD4oT3ApOworfQorCisvLy8gbV9UcnVuYwordGVtcGxhdGU8dHlwZW5hbWUgT3BUeT4KK2lubGluZSBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlRydW5jPgorbV9UcnVuYyhjb25zdCBPcFR5ICZPcCkgeworICByZXR1cm4gQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpUcnVuYz4oT3ApOworfQorCisvLy8gbV9TRXh0Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPcFR5PgoraW5saW5lIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6U0V4dD4KK21fU0V4dChjb25zdCBPcFR5ICZPcCkgeworICByZXR1cm4gQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpTRXh0PihPcCk7Cit9CisKKy8vLyBtX1pFeHQKK3RlbXBsYXRlPHR5cGVuYW1lIE9wVHk+CitpbmxpbmUgQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpaRXh0PgorbV9aRXh0KGNvbnN0IE9wVHkgJk9wKSB7CisgIHJldHVybiBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlpFeHQ+KE9wKTsKK30KKyAgCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgdW5hcnkgb3BlcmF0b3JzCisvLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMSFNfdD4KK3N0cnVjdCBub3RfbWF0Y2ggeworICBMSFNfdCBMOworCisgIG5vdF9tYXRjaChjb25zdCBMSFNfdCAmTEhTKSA6IEwoTEhTKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE9wVHk+CisgIGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkKKyAgICAgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6WG9yKQorICAgICAgICByZXR1cm4gbWF0Y2hJZk5vdChJLT5nZXRPcGVyYW5kKDApLCBJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVikpCisgICAgICBpZiAoQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpYb3IpCisgICAgICAgIHJldHVybiBtYXRjaElmTm90KENFLT5nZXRPcGVyYW5kKDApLCBDRS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKSkKKyAgICAgIHJldHVybiBMLm1hdGNoKENvbnN0YW50RXhwcjo6Z2V0Tm90KENJKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Citwcml2YXRlOgorICBib29sIG1hdGNoSWZOb3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oUkhTKSkKKyAgICAgIHJldHVybiBDSS0+aXNBbGxPbmVzVmFsdWUoKSAmJiBMLm1hdGNoKExIUyk7CisgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihMSFMpKQorICAgICAgcmV0dXJuIENJLT5pc0FsbE9uZXNWYWx1ZSgpICYmIEwubWF0Y2goUkhTKTsKKyAgICBpZiAoQ29uc3RhbnRWZWN0b3IgKkNWID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KFJIUykpCisgICAgICByZXR1cm4gQ1YtPmlzQWxsT25lc1ZhbHVlKCkgJiYgTC5tYXRjaChMSFMpOworICAgIGlmIChDb25zdGFudFZlY3RvciAqQ1YgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oTEhTKSkKKyAgICAgIHJldHVybiBDVi0+aXNBbGxPbmVzVmFsdWUoKSAmJiBMLm1hdGNoKFJIUyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMSFM+CitpbmxpbmUgbm90X21hdGNoPExIUz4gbV9Ob3QoY29uc3QgTEhTICZMKSB7IHJldHVybiBMOyB9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTX3Q+CitzdHJ1Y3QgbmVnX21hdGNoIHsKKyAgTEhTX3QgTDsKKworICBuZWdfbWF0Y2goY29uc3QgTEhTX3QgJkxIUykgOiBMKExIUykge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPcFR5PgorICBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpCisgICAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN1YikKKyAgICAgICAgcmV0dXJuIG1hdGNoSWZOZWcoSS0+Z2V0T3BlcmFuZCgwKSwgSS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKQorICAgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U3ViKQorICAgICAgICByZXR1cm4gbWF0Y2hJZk5lZyhDRS0+Z2V0T3BlcmFuZCgwKSwgQ0UtPmdldE9wZXJhbmQoMSkpOworICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpCisgICAgICByZXR1cm4gTC5tYXRjaChDb25zdGFudEV4cHI6OmdldE5lZyhDSSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorcHJpdmF0ZToKKyAgYm9vbCBtYXRjaElmTmVnKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IENvbnN0YW50RlA6OmdldFplcm9WYWx1ZUZvck5lZ2F0aW9uKExIUy0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgICBMLm1hdGNoKFJIUyk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExIUz4KK2lubGluZSBuZWdfbWF0Y2g8TEhTPiBtX05lZyhjb25zdCBMSFMgJkwpIHsgcmV0dXJuIEw7IH0KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMSFNfdD4KK3N0cnVjdCBmbmVnX21hdGNoIHsKKyAgTEhTX3QgTDsKKworICBmbmVnX21hdGNoKGNvbnN0IExIU190ICZMSFMpIDogTChMSFMpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3BUeT4KKyAgYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKQorICAgICAgaWYgKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpGU3ViKQorICAgICAgICByZXR1cm4gbWF0Y2hJZkZOZWcoSS0+Z2V0T3BlcmFuZCgwKSwgSS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKQorICAgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RlN1YikKKyAgICAgICAgcmV0dXJuIG1hdGNoSWZGTmVnKENFLT5nZXRPcGVyYW5kKDApLCBDRS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKENvbnN0YW50RlAgKkNGID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oVikpCisgICAgICByZXR1cm4gTC5tYXRjaChDb25zdGFudEV4cHI6OmdldEZOZWcoQ0YpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK3ByaXZhdGU6CisgIGJvb2wgbWF0Y2hJZkZOZWcoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiBMSFMgPT0gQ29uc3RhbnRGUDo6Z2V0WmVyb1ZhbHVlRm9yTmVnYXRpb24oTEhTLT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgIEwubWF0Y2goUkhTKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTEhTPgoraW5saW5lIGZuZWdfbWF0Y2g8TEhTPiBtX0ZOZWcoY29uc3QgTEhTICZMKSB7IHJldHVybiBMOyB9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBjb250cm9sIGZsb3cKKy8vCisKK3RlbXBsYXRlPHR5cGVuYW1lIENvbmRfdD4KK3N0cnVjdCBicmNfbWF0Y2ggeworICBDb25kX3QgQ29uZDsKKyAgQmFzaWNCbG9jayAqJlQsIComRjsKKyAgYnJjX21hdGNoKGNvbnN0IENvbmRfdCAmQywgQmFzaWNCbG9jayAqJnQsIEJhc2ljQmxvY2sgKiZmKQorICAgIDogQ29uZChDKSwgVCh0KSwgRihmKSB7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPcFR5PgorICBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihWKSkKKyAgICAgIGlmIChCSS0+aXNDb25kaXRpb25hbCgpKSB7CisgICAgICAgIGlmIChDb25kLm1hdGNoKEJJLT5nZXRDb25kaXRpb24oKSkpIHsKKyAgICAgICAgICBUID0gQkktPmdldFN1Y2Nlc3NvcigwKTsKKyAgICAgICAgICBGID0gQkktPmdldFN1Y2Nlc3NvcigxKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQ29uZF90PgoraW5saW5lIGJyY19tYXRjaDxDb25kX3Q+IG1fQnIoY29uc3QgQ29uZF90ICZDLCBCYXNpY0Jsb2NrIComVCwgQmFzaWNCbG9jayAqJkYpIHsKKyAgcmV0dXJuIGJyY19tYXRjaDxDb25kX3Q+KEMsIFQsIEYpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgUGF0dGVybk1hdGNoCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BsdWdpbkxvYWRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUGx1Z2luTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiYjEzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BsdWdpbkxvYWRlci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L1BsdWdpbkxvYWRlci5oIC0gUGx1Z2luIExvYWRlciBmb3IgVG9vbHMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQSB0b29sIGNhbiAjaW5jbHVkZSB0aGlzIGZpbGUgdG8gZ2V0IGEgLWxvYWQgb3B0aW9uIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvCisvLyBsb2FkIGFyYml0cmFyeSBzaGFyZWQgb2JqZWN0cyBpbnRvIHRoZSB0b29sJ3MgYWRkcmVzcyBzcGFjZS4gIE5vdGUgdGhhdCB0aGlzCisvLyBoZWFkZXIgY2FuIG9ubHkgYmUgaW5jbHVkZWQgYnkgYSBwcm9ncmFtIE9OQ0UsIHNvIGl0IHNob3VsZCBuZXZlciB0byB1c2VkIGJ5CisvLyBsaWJyYXJ5IGF1dGhvcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUExVR0lOTE9BREVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1BMVUdJTkxPQURFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBzdHJ1Y3QgUGx1Z2luTG9hZGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUpOworICAgIHN0YXRpYyB1bnNpZ25lZCBnZXROdW1QbHVnaW5zKCk7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nJiBnZXRQbHVnaW4odW5zaWduZWQgbnVtKTsKKyAgfTsKKworI2lmbmRlZiBET05UX0dFVF9QTFVHSU5fTE9BREVSX09QVElPTgorICAvLyBUaGlzIGNhdXNlcyBvcGVyYXRvcj0gYWJvdmUgdG8gYmUgaW52b2tlZCBmb3IgZXZlcnkgLWxvYWQgb3B0aW9uLgorICBzdGF0aWMgY2w6Om9wdDxQbHVnaW5Mb2FkZXIsIGZhbHNlLCBjbDo6cGFyc2VyPHN0ZDo6c3RyaW5nPiA+CisgICAgTG9hZE9wdCgibG9hZCIsIGNsOjpaZXJvT3JNb3JlLCBjbDo6dmFsdWVfZGVzYygicGx1Z2luZmlsZW5hbWUiKSwKKyAgICAgICAgICAgIGNsOjpkZXNjKCJMb2FkIHRoZSBzcGVjaWZpZWQgcGx1Z2luIikpOworI2VuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODUxNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgKQEAgLTAsMCArMSw4MSBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCAtIFBvaW50ZXIgVHJhaXRzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGNsYXNzLiAgVGhpcyBhbGxvd3MgZGF0YQorLy8gc3RydWN0dXJlcyB0byByZWFzb24gYWJvdXQgcG9pbnRlcnMgYW5kIG90aGVyIHRoaW5ncyB0aGF0IGFyZSBwb2ludGVyIHNpemVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1BPSU5URVJMSUtFVFlQRVRSQUlUU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9QT0lOVEVSTElLRVRZUEVUUkFJVFNfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgCisvLy8gUG9pbnRlckxpa2VUeXBlVHJhaXRzIC0gVGhpcyBpcyBhIHRyYWl0cyBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGhhbmRsZQorLy8vIHBvaW50ZXIgdHlwZXMgYW5kIHRoaW5ncyB0aGF0IGFyZSBqdXN0IHdyYXBwZXJzIGZvciBwb2ludGVycyBhcyBhIHVuaWZvcm0KKy8vLyBlbnRpdHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyB7CisgIC8vIGdldEFzVm9pZFBvaW50ZXIKKyAgLy8gZ2V0RnJvbVZvaWRQb2ludGVyCisgIC8vIGdldE51bUxvd0JpdHNBdmFpbGFibGUKK307CisKKy8vIFByb3ZpZGUgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGZvciBub24tY3ZyIHBvaW50ZXJzLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUKj4geworcHVibGljOgorICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEFzVm9pZFBvaW50ZXIoVCogUCkgeyByZXR1cm4gUDsgfQorICBzdGF0aWMgaW5saW5lIFQgKmdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihQKTsKKyAgfQorICAKKyAgLy8vIE5vdGUsIHdlIGFzc3VtZSBoZXJlIHRoYXQgbWFsbG9jIHJldHVybnMgb2JqZWN0cyBhdCBsZWFzdCA0LWJ5dGUgYWxpZ25lZC4KKyAgLy8vIEhvd2V2ZXIsIHRoaXMgbWF5IGJlIHdyb25nLCBvciBwb2ludGVycyBtYXkgYmUgZnJvbSBzb21ldGhpbmcgb3RoZXIgdGhhbgorICAvLy8gbWFsbG9jLiAgSW4gdGhpcyBjYXNlLCB5b3Ugc2hvdWxkIHNwZWNpYWxpemUgdGhpcyB0ZW1wbGF0ZSB0byByZWR1Y2UgdGhpcy4KKyAgLy8vCisgIC8vLyBBbGwgY2xpZW50cyBzaG91bGQgdXNlIGFzc2VydGlvbnMgdG8gZG8gYSBydW4tdGltZSBjaGVjayB0byBlbnN1cmUgdGhhdAorICAvLy8gdGhpcyBpcyBhY3R1YWxseSB0cnVlLgorICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IDIgfTsKK307CisgIAorLy8gUHJvdmlkZSBQb2ludGVyTGlrZVR5cGVUcmFpdHMgZm9yIGNvbnN0IHBvaW50ZXJzLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxjb25zdCBUKj4geworICB0eXBlZGVmIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUKj4gTm9uQ29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIGlubGluZSBjb25zdCB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFQqIFApIHsKKyAgICByZXR1cm4gTm9uQ29uc3Q6OmdldEFzVm9pZFBvaW50ZXIoY29uc3RfY2FzdDxUKj4oUCkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgVCAqZ2V0RnJvbVZvaWRQb2ludGVyKGNvbnN0IHZvaWQgKlApIHsKKyAgICByZXR1cm4gTm9uQ29uc3Q6OmdldEZyb21Wb2lkUG9pbnRlcihjb25zdF9jYXN0PHZvaWQqPihQKSk7CisgIH0KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSBOb25Db25zdDo6TnVtTG93Qml0c0F2YWlsYWJsZSB9OworfTsKKworLy8gUHJvdmlkZSBQb2ludGVyTGlrZVR5cGVUcmFpdHMgZm9yIHVpbnRwdHJfdC4KK3RlbXBsYXRlPD4KK2NsYXNzIFBvaW50ZXJMaWtlVHlwZVRyYWl0czx1aW50cHRyX3Q+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKHVpbnRwdHJfdCBQKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KFApOworICB9CisgIHN0YXRpYyBpbmxpbmUgdWludHB0cl90IGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQKTsKKyAgfQorICAvLyBObyBiaXRzIGFyZSBhdmFpbGFibGUhCisgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gMCB9OworfTsKKyAgCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ByZWRJdGVyYXRvckNhY2hlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QcmVkSXRlcmF0b3JDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNjZhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QcmVkSXRlcmF0b3JDYWNoZS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvUHJlZEl0ZXJhdG9yQ2FjaGUuaCAtIHByZWRfaXRlcmF0b3IgQ2FjaGUgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFByZWRJdGVyYXRvckNhY2hlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUFJFRElURVJBVE9SQ0FDSEVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUFJFRElURVJBVE9SQ0FDSEVfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIFByZWRJdGVyYXRvckNhY2hlIC0gVGhpcyBjbGFzcyBpcyBhbiBleHRyZW1lbHkgdHJpdmlhbCBjYWNoZSBmb3IKKyAgLy8vIHByZWRlY2Vzc29yIGl0ZXJhdG9yIHF1ZXJpZXMuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY29kZSB0aGF0IHJlcGVhdGVkbHkKKyAgLy8vIHdhbnRzIHRoZSBwcmVkZWNlc3NvciBsaXN0IGZvciB0aGUgc2FtZSBibG9ja3MuCisgIGNsYXNzIFByZWRJdGVyYXRvckNhY2hlIHsKKyAgICAvLy8gQmxvY2tUb1ByZWRzTWFwIC0gUG9pbnRlciB0byBudWxsLXRlcm1pbmF0ZWQgbGlzdC4KKyAgICBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgQmFzaWNCbG9jayoqPiBCbG9ja1RvUHJlZHNNYXA7CisgICAgRGVuc2VNYXA8QmFzaWNCbG9jayosIHVuc2lnbmVkPiBCbG9ja1RvUHJlZENvdW50TWFwOworCisgICAgLy8vIE1lbW9yeSAtIFRoaXMgaXMgdGhlIHNwYWNlIHRoYXQgaG9sZHMgY2FjaGVkIHByZWRzLgorICAgIEJ1bXBQdHJBbGxvY2F0b3IgTWVtb3J5OworICBwdWJsaWM6CisKKyAgICAvLy8gR2V0UHJlZHMgLSBHZXQgYSBjYWNoZWQgbGlzdCBmb3IgdGhlIG51bGwtdGVybWluYXRlZCBwcmVkZWNlc3NvciBsaXN0IG9mCisgICAgLy8vIHRoZSBzcGVjaWZpZWQgYmxvY2suICBUaGlzIGNhbiBiZSB1c2VkIGluIGEgbG9vcCBsaWtlIHRoaXM6CisgICAgLy8vICAgZm9yIChCYXNpY0Jsb2NrICoqUEkgPSBQcmVkQ2FjaGUtPkdldFByZWRzKEJCKTsgKlBJOyArK1BJKQorICAgIC8vLyAgICAgIHVzZSgqUEkpOworICAgIC8vLyBpbnN0ZWFkIG9mOgorICAgIC8vLyBmb3IgKHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEJCKSwgRSA9IHByZWRfZW5kKEJCKTsgUEkgIT0gRTsgKytQSSkKKyAgICBCYXNpY0Jsb2NrICoqR2V0UHJlZHMoQmFzaWNCbG9jayAqQkIpIHsKKyAgICAgIEJhc2ljQmxvY2sgKiomRW50cnkgPSBCbG9ja1RvUHJlZHNNYXBbQkJdOworICAgICAgaWYgKEVudHJ5KSByZXR1cm4gRW50cnk7CisKKyAgICAgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCAzMj4gUHJlZENhY2hlKHByZWRfYmVnaW4oQkIpLCBwcmVkX2VuZChCQikpOworICAgICAgUHJlZENhY2hlLnB1c2hfYmFjaygwKTsgLy8gbnVsbCB0ZXJtaW5hdG9yLgorICAgICAgCisgICAgICBCbG9ja1RvUHJlZENvdW50TWFwW0JCXSA9IFByZWRDYWNoZS5zaXplKCktMTsKKworICAgICAgRW50cnkgPSBNZW1vcnkuQWxsb2NhdGU8QmFzaWNCbG9jayo+KFByZWRDYWNoZS5zaXplKCkpOworICAgICAgc3RkOjpjb3B5KFByZWRDYWNoZS5iZWdpbigpLCBQcmVkQ2FjaGUuZW5kKCksIEVudHJ5KTsKKyAgICAgIHJldHVybiBFbnRyeTsKKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgR2V0TnVtUHJlZHMoQmFzaWNCbG9jayAqQkIpIHsKKyAgICAgIEdldFByZWRzKEJCKTsKKyAgICAgIHJldHVybiBCbG9ja1RvUHJlZENvdW50TWFwW0JCXTsKKyAgICB9CisKKyAgICAvLy8gY2xlYXIgLSBSZW1vdmUgYWxsIGluZm9ybWF0aW9uLgorICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICBCbG9ja1RvUHJlZHNNYXAuY2xlYXIoKTsKKyAgICAgIEJsb2NrVG9QcmVkQ291bnRNYXAuY2xlYXIoKTsKKyAgICAgIE1lbW9yeS5SZXNldCgpOworICAgIH0KKyAgfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjg0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmgKQEAgLTAsMCArMSw3MSBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmggLSBQcmV0dHkgQ3Jhc2ggSGFuZGxpbmcgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUHJldHR5U3RhY2tUcmFjZUVudHJ5IGNsYXNzLCB3aGljaCBpcyB1c2VkIHRvIG1ha2UKKy8vIGNyYXNoZXMgZ2l2ZSBtb3JlIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB0aGUgcHJvZ3JhbSB3YXMgZG9pbmcKKy8vIHdoZW4gaXQgY3Jhc2hlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9QUkVUVFlTVEFDS1RSQUNFX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1BSRVRUWVNUQUNLVFJBQ0VfSAorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIC8vLyBEaXNhYmxlUHJldHR5U3RhY2tUcmFjZSAtIFNldCB0aGlzIHRvIHRydWUgdG8gZGlzYWJsZSB0aGlzIG1vZHVsZS4gVGhpcworICAvLy8gbWlnaHQgYmUgbmVjY2Vzc2FyeSBpZiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBpbnN0YWxscyBpdHMgb3duIHNpZ25hbAorICAvLy8gaGFuZGxlcnMgd2hpY2ggY29uZmxpY3Qgd2l0aCB0aGUgb25lcyBpbnN0YWxsZWQgYnkgdGhpcyBtb2R1bGUuCisgIC8vLyBEZWZhdWx0cyB0byBmYWxzZS4KKyAgZXh0ZXJuIGJvb2wgRGlzYWJsZVByZXR0eVN0YWNrVHJhY2U7CisgIAorICAvLy8gUHJldHR5U3RhY2tUcmFjZUVudHJ5IC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIGZyYW1lIG9mIHRoZQorICAvLy8gInByZXR0eSIgc3RhY2sgdHJhY2UgdGhhdCBpcyBkdW1wZWQgd2hlbiBhIHByb2dyYW0gY3Jhc2hlcy4gWW91IGNhbiBkZWZpbmUKKyAgLy8vIHN1YmNsYXNzZXMgb2YgdGhpcyBhbmQgZGVjbGFyZSB0aGVtIG9uIHRoZSBwcm9ncmFtIHN0YWNrOiB3aGVuIHRoZXkgYXJlIAorICAvLy8gY29uc3RydWN0ZWQgYW5kIGRlc3RydWN0ZWQsIHRoZXkgd2lsbCBhZGQgdGhlaXIgc3ltYm9saWMgZnJhbWVzIHRvIGEKKyAgLy8vIHZpcnR1YWwgc3RhY2sgdHJhY2UuICBUaGlzIGdldHMgZHVtcGVkIG91dCBpZiB0aGUgcHJvZ3JhbSBjcmFzaGVzLgorICBjbGFzcyBQcmV0dHlTdGFja1RyYWNlRW50cnkgeworICAgIGNvbnN0IFByZXR0eVN0YWNrVHJhY2VFbnRyeSAqTmV4dEVudHJ5OworICAgIFByZXR0eVN0YWNrVHJhY2VFbnRyeShjb25zdCBQcmV0dHlTdGFja1RyYWNlRW50cnkgJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBQcmV0dHlTdGFja1RyYWNlRW50cnkmKTsgICAgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHB1YmxpYzoKKyAgICBQcmV0dHlTdGFja1RyYWNlRW50cnkoKTsKKyAgICB2aXJ0dWFsIH5QcmV0dHlTdGFja1RyYWNlRW50cnkoKTsKKyAgICAKKyAgICAvLy8gcHJpbnQgLSBFbWl0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3RhY2sgZnJhbWUgdG8gT1MuCisgICAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgPSAwOworICAgIAorICAgIC8vLyBnZXROZXh0RW50cnkgLSBSZXR1cm4gdGhlIG5leHQgZW50cnkgaW4gdGhlIGxpc3Qgb2YgZnJhbWVzLgorICAgIGNvbnN0IFByZXR0eVN0YWNrVHJhY2VFbnRyeSAqZ2V0TmV4dEVudHJ5KCkgY29uc3QgeyByZXR1cm4gTmV4dEVudHJ5OyB9CisgIH07CisgIAorICAvLy8gUHJldHR5U3RhY2tUcmFjZVN0cmluZyAtIFRoaXMgb2JqZWN0IHByaW50cyBhIHNwZWNpZmllZCBzdHJpbmcgKHdoaWNoCisgIC8vLyBzaG91bGQgbm90IGNvbnRhaW4gbmV3bGluZXMpIHRvIHRoZSBzdHJlYW0gYXMgdGhlIHN0YWNrIHRyYWNlIHdoZW4gYSBjcmFzaAorICAvLy8gb2NjdXJzLgorICBjbGFzcyBQcmV0dHlTdGFja1RyYWNlU3RyaW5nIDogcHVibGljIFByZXR0eVN0YWNrVHJhY2VFbnRyeSB7CisgICAgY29uc3QgY2hhciAqU3RyOworICBwdWJsaWM6CisgICAgUHJldHR5U3RhY2tUcmFjZVN0cmluZyhjb25zdCBjaGFyICpzdHIpIDogU3RyKHN0cikge30KKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgfTsKKyAgCisgIC8vLyBQcmV0dHlTdGFja1RyYWNlUHJvZ3JhbSAtIFRoaXMgb2JqZWN0IHByaW50cyBhIHNwZWNpZmllZCBwcm9ncmFtIGFyZ3VtZW50cworICAvLy8gdG8gdGhlIHN0cmVhbSBhcyB0aGUgc3RhY2sgdHJhY2Ugd2hlbiBhIGNyYXNoIG9jY3Vycy4KKyAgY2xhc3MgUHJldHR5U3RhY2tUcmFjZVByb2dyYW0gOiBwdWJsaWMgUHJldHR5U3RhY2tUcmFjZUVudHJ5IHsKKyAgICBpbnQgQXJnQzsKKyAgICBjb25zdCBjaGFyICpjb25zdCAqQXJnVjsKKyAgcHVibGljOgorICAgIFByZXR0eVN0YWNrVHJhY2VQcm9ncmFtKGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QqYXJndikKKyAgICAgIDogQXJnQyhhcmdjKSwgQXJnVihhcmd2KSB7fQorICAgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB9OworICAKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVjeWNsZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlY3ljbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOGM3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlY3ljbGVyLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8vPT0tIGxsdm0vU3VwcG9ydC9SZWN5Y2xlci5oIC0gUmVjeWNsaW5nIEFsbG9jYXRvciAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFJlY3ljbGVyIGNsYXNzIHRlbXBsYXRlLiAgU2VlIHRoZSBkb3h5Z2VuIGNvbW1lbnQgZm9yCisvLyBSZWN5Y2xlciBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JFQ1lDTEVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JFQ1lDTEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQcmludFJlY3ljbGluZ0FsbG9jYXRvclN0YXRzIC0gSGVscGVyIGZvciBSZWN5Y2xpbmdBbGxvY2F0b3IgZm9yCisvLy8gcHJpbnRpbmcgc3RhdGlzdGljcy4KKy8vLwordm9pZCBQcmludFJlY3ljbGVyU3RhdHMoc2l6ZV90IFNpemUsIHNpemVfdCBBbGlnbiwgc2l6ZV90IEZyZWVMaXN0U2l6ZSk7CisKKy8vLyBSZWN5Y2xlclN0cnVjdCAtIEltcGxlbWVudGF0aW9uIGRldGFpbCBmb3IgUmVjeWNsZXIuIFRoaXMgaXMgYQorLy8vIGNsYXNzIHRoYXQgdGhlIHJlY3ljbGVyIGltcG9zZXMgb24gZnJlZSdkIG1lbW9yeSB0byBjYXJ2ZSBvdXQKKy8vLyBuZXh0L3ByZXYgcG9pbnRlcnMuCitzdHJ1Y3QgUmVjeWNsZXJTdHJ1Y3QgeworICBSZWN5Y2xlclN0cnVjdCAqUHJldiwgKk5leHQ7Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaWxpc3RfdHJhaXRzPFJlY3ljbGVyU3RydWN0PiA6CisgICAgcHVibGljIGlsaXN0X2RlZmF1bHRfdHJhaXRzPFJlY3ljbGVyU3RydWN0PiB7CisgIHN0YXRpYyBSZWN5Y2xlclN0cnVjdCAqZ2V0UHJldihjb25zdCBSZWN5Y2xlclN0cnVjdCAqdCkgeyByZXR1cm4gdC0+UHJldjsgfQorICBzdGF0aWMgUmVjeWNsZXJTdHJ1Y3QgKmdldE5leHQoY29uc3QgUmVjeWNsZXJTdHJ1Y3QgKnQpIHsgcmV0dXJuIHQtPk5leHQ7IH0KKyAgc3RhdGljIHZvaWQgc2V0UHJldihSZWN5Y2xlclN0cnVjdCAqdCwgUmVjeWNsZXJTdHJ1Y3QgKnApIHsgdC0+UHJldiA9IHA7IH0KKyAgc3RhdGljIHZvaWQgc2V0TmV4dChSZWN5Y2xlclN0cnVjdCAqdCwgUmVjeWNsZXJTdHJ1Y3QgKm4pIHsgdC0+TmV4dCA9IG47IH0KKworICBtdXRhYmxlIFJlY3ljbGVyU3RydWN0IFNlbnRpbmVsOworICBSZWN5Y2xlclN0cnVjdCAqY3JlYXRlU2VudGluZWwoKSBjb25zdCB7CisgICAgcmV0dXJuICZTZW50aW5lbDsKKyAgfQorICBzdGF0aWMgdm9pZCBkZXN0cm95U2VudGluZWwoUmVjeWNsZXJTdHJ1Y3QgKikge30KKworICBSZWN5Y2xlclN0cnVjdCAqcHJvdmlkZUluaXRpYWxIZWFkKCkgY29uc3QgeyByZXR1cm4gY3JlYXRlU2VudGluZWwoKTsgfQorICBSZWN5Y2xlclN0cnVjdCAqZW5zdXJlSGVhZChSZWN5Y2xlclN0cnVjdCopIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZVNlbnRpbmVsKCk7IH0KKyAgc3RhdGljIHZvaWQgbm90ZUhlYWQoUmVjeWNsZXJTdHJ1Y3QqLCBSZWN5Y2xlclN0cnVjdCopIHt9CisKKyAgc3RhdGljIHZvaWQgZGVsZXRlTm9kZShSZWN5Y2xlclN0cnVjdCAqKSB7CisgICAgYXNzZXJ0KDAgJiYgIlJlY3ljbGVyJ3MgaWxpc3RfdHJhaXRzIHNob3VsZG4ndCBzZWUgYSBkZWxldGVOb2RlIGNhbGwhIik7CisgIH0KK307CisKKy8vLyBSZWN5Y2xlciAtIFRoaXMgY2xhc3MgbWFuYWdlcyBhIGxpbmtlZC1saXN0IG9mIGRlYWxsb2NhdGVkIG5vZGVzCisvLy8gYW5kIGZhY2lsaXRhdGVzIHJldXNpbmcgZGVhbGxvY2F0ZWQgbWVtb3J5IGluIHBsYWNlIG9mIGFsbG9jYXRpbmcKKy8vLyBuZXcgbWVtb3J5LgorLy8vCit0ZW1wbGF0ZTxjbGFzcyBULCBzaXplX3QgU2l6ZSA9IHNpemVvZihUKSwgc2l6ZV90IEFsaWduID0gQWxpZ25PZjxUPjo6QWxpZ25tZW50PgorY2xhc3MgUmVjeWNsZXIgeworICAvLy8gRnJlZUxpc3QgLSBEb3VibHktbGlua2VkIGxpc3Qgb2Ygbm9kZXMgdGhhdCBoYXZlIGRlbGV0ZWQgY29udGVudHMgYW5kCisgIC8vLyBhcmUgbm90IGluIGFjdGl2ZSB1c2UuCisgIC8vLworICBpcGxpc3Q8UmVjeWNsZXJTdHJ1Y3Q+IEZyZWVMaXN0OworCitwdWJsaWM6CisgIH5SZWN5Y2xlcigpIHsKKyAgICAvLyBJZiB0aGlzIGZhaWxzLCBlaXRoZXIgdGhlIGNhbGxlZSBoYXMgbG9zdCB0cmFjayBvZiBzb21lIGFsbG9jYXRpb24sCisgICAgLy8gb3IgdGhlIGNhbGxlZSBpc24ndCB0cmFja2luZyBhbGxvY2F0aW9ucyBhbmQgc2hvdWxkIGp1c3QgY2FsbAorICAgIC8vIGNsZWFyKCkgYmVmb3JlIGRlbGV0aW5nIHRoZSBSZWN5Y2xlci4KKyAgICBhc3NlcnQoRnJlZUxpc3QuZW1wdHkoKSAmJiAiTm9uLWVtcHR5IHJlY3ljbGVyIGRlbGV0ZWQhIik7CisgIH0KKworICAvLy8gY2xlYXIgLSBSZWxlYXNlIGFsbCB0aGUgdHJhY2tlZCBhbGxvY2F0aW9ucyB0byB0aGUgYWxsb2NhdG9yLiBUaGUKKyAgLy8vIHJlY3ljbGVyIG11c3QgYmUgZnJlZSBvZiBhbnkgdHJhY2tlZCBhbGxvY2F0aW9ucyBiZWZvcmUgYmVpbmcKKyAgLy8vIGRlbGV0ZWQ7IGNhbGxpbmcgY2xlYXIgaXMgb25lIHdheSB0byBlbnN1cmUgdGhpcy4KKyAgdGVtcGxhdGU8Y2xhc3MgQWxsb2NhdG9yVHlwZT4KKyAgdm9pZCBjbGVhcihBbGxvY2F0b3JUeXBlICZBbGxvY2F0b3IpIHsKKyAgICB3aGlsZSAoIUZyZWVMaXN0LmVtcHR5KCkpIHsKKyAgICAgIFQgKnQgPSByZWludGVycHJldF9jYXN0PFQgKj4oRnJlZUxpc3QucmVtb3ZlKEZyZWVMaXN0LmJlZ2luKCkpKTsKKyAgICAgIEFsbG9jYXRvci5EZWFsbG9jYXRlKHQpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIFN1YkNsYXNzLCBjbGFzcyBBbGxvY2F0b3JUeXBlPgorICBTdWJDbGFzcyAqQWxsb2NhdGUoQWxsb2NhdG9yVHlwZSAmQWxsb2NhdG9yKSB7CisgICAgYXNzZXJ0KHNpemVvZihTdWJDbGFzcykgPD0gU2l6ZSAmJgorICAgICAgICAgICAiUmVjeWNsZXIgYWxsb2NhdGlvbiBzaXplIGlzIGxlc3MgdGhhbiBvYmplY3Qgc2l6ZSEiKTsKKyAgICBhc3NlcnQoQWxpZ25PZjxTdWJDbGFzcz46OkFsaWdubWVudCA8PSBBbGlnbiAmJgorICAgICAgICAgICAiUmVjeWNsZXIgYWxsb2NhdGlvbiBhbGlnbm1lbnQgaXMgbGVzcyB0aGFuIG9iamVjdCBhbGlnbm1lbnQhIik7CisgICAgcmV0dXJuICFGcmVlTGlzdC5lbXB0eSgpID8KKyAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdWJDbGFzcyAqPihGcmVlTGlzdC5yZW1vdmUoRnJlZUxpc3QuYmVnaW4oKSkpIDoKKyAgICAgICAgICAgc3RhdGljX2Nhc3Q8U3ViQ2xhc3MgKj4oQWxsb2NhdG9yLkFsbG9jYXRlKFNpemUsIEFsaWduKSk7CisgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBBbGxvY2F0b3JUeXBlPgorICBUICpBbGxvY2F0ZShBbGxvY2F0b3JUeXBlICZBbGxvY2F0b3IpIHsKKyAgICByZXR1cm4gQWxsb2NhdGU8VD4oQWxsb2NhdG9yKTsKKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIFN1YkNsYXNzLCBjbGFzcyBBbGxvY2F0b3JUeXBlPgorICB2b2lkIERlYWxsb2NhdGUoQWxsb2NhdG9yVHlwZSAmIC8qQWxsb2NhdG9yKi8sIFN1YkNsYXNzKiBFbGVtZW50KSB7CisgICAgRnJlZUxpc3QucHVzaF9mcm9udChyZWludGVycHJldF9jYXN0PFJlY3ljbGVyU3RydWN0ICo+KEVsZW1lbnQpKTsKKyAgfQorCisgIHZvaWQgUHJpbnRTdGF0cygpIHsKKyAgICBQcmludFJlY3ljbGVyU3RhdHMoU2l6ZSwgQWxpZ24sIEZyZWVMaXN0LnNpemUoKSk7CisgIH0KK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWN5Y2xpbmdBbGxvY2F0b3IuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlY3ljbGluZ0FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YWI4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWN5Y2xpbmdBbGxvY2F0b3IuaApAQCAtMCwwICsxLDczIEBACisvLz09LSBsbHZtL1N1cHBvcnQvUmVjeWNsaW5nQWxsb2NhdG9yLmggLSBSZWN5Y2xpbmcgQWxsb2NhdG9yIC0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBSZWN5Y2xpbmdBbGxvY2F0b3IgY2xhc3MuICBTZWUgdGhlIGRveHlnZW4gY29tbWVudCBmb3IKKy8vIFJlY3ljbGluZ0FsbG9jYXRvciBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SRUNZQ0xJTkdBTExPQ0FUT1JfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUkVDWUNMSU5HQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWN5Y2xlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBSZWN5Y2xpbmdBbGxvY2F0b3IgLSBUaGlzIGNsYXNzIHdyYXBzIGFuIEFsbG9jYXRvciwgYWRkaW5nIHRoZQorLy8vIGZ1bmN0aW9uYWxpdHkgb2YgcmVjeWNsaW5nIGRlbGV0ZWQgb2JqZWN0cy4KKy8vLwordGVtcGxhdGU8Y2xhc3MgQWxsb2NhdG9yVHlwZSwgY2xhc3MgVCwKKyAgICAgICAgIHNpemVfdCBTaXplID0gc2l6ZW9mKFQpLCBzaXplX3QgQWxpZ24gPSBBbGlnbk9mPFQ+OjpBbGlnbm1lbnQ+CitjbGFzcyBSZWN5Y2xpbmdBbGxvY2F0b3IgeworcHJpdmF0ZToKKyAgLy8vIEJhc2UgLSBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorICAvLy8KKyAgUmVjeWNsZXI8VCwgU2l6ZSwgQWxpZ24+IEJhc2U7CisKKyAgLy8vIEFsbG9jYXRvciAtIFRoZSB3cmFwcGVkIGFsbG9jYXRvci4KKyAgLy8vCisgIEFsbG9jYXRvclR5cGUgQWxsb2NhdG9yOworCitwdWJsaWM6CisgIH5SZWN5Y2xpbmdBbGxvY2F0b3IoKSB7IEJhc2UuY2xlYXIoQWxsb2NhdG9yKTsgfQorCisgIC8vLyBBbGxvY2F0ZSAtIFJldHVybiBhIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgYW4gb2JqZWN0IG9mIHR5cGUKKyAgLy8vIFN1YkNsYXNzLiBUaGUgc3RvcmFnZSBtYXkgYmUgZWl0aGVyIG5ld2x5IGFsbG9jYXRlZCBvciByZWN5Y2xlZC4KKyAgLy8vCisgIHRlbXBsYXRlPGNsYXNzIFN1YkNsYXNzPgorICBTdWJDbGFzcyAqQWxsb2NhdGUoKSB7IHJldHVybiBCYXNlLnRlbXBsYXRlIEFsbG9jYXRlPFN1YkNsYXNzPihBbGxvY2F0b3IpOyB9CisKKyAgVCAqQWxsb2NhdGUoKSB7IHJldHVybiBCYXNlLkFsbG9jYXRlKEFsbG9jYXRvcik7IH0KKworICAvLy8gRGVhbGxvY2F0ZSAtIFJlbGVhc2Ugc3RvcmFnZSBmb3IgdGhlIHBvaW50ZWQtdG8gb2JqZWN0LiBUaGUKKyAgLy8vIHN0b3JhZ2Ugd2lsbCBiZSBrZXB0IHRyYWNrIG9mIGFuZCBtYXkgYmUgcmVjeWNsZWQuCisgIC8vLworICB0ZW1wbGF0ZTxjbGFzcyBTdWJDbGFzcz4KKyAgdm9pZCBEZWFsbG9jYXRlKFN1YkNsYXNzKiBFKSB7IHJldHVybiBCYXNlLkRlYWxsb2NhdGUoQWxsb2NhdG9yLCBFKTsgfQorCisgIHZvaWQgUHJpbnRTdGF0cygpIHsgQmFzZS5QcmludFN0YXRzKCk7IH0KK307CisKK30KKwordGVtcGxhdGU8Y2xhc3MgQWxsb2NhdG9yVHlwZSwgY2xhc3MgVCwgc2l6ZV90IFNpemUsIHNpemVfdCBBbGlnbj4KK2lubGluZSB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpSZWN5Y2xpbmdBbGxvY2F0b3I8QWxsb2NhdG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQsIFNpemUsIEFsaWduPiAmQWxsb2NhdG9yKSB7CisgIHJldHVybiBBbGxvY2F0b3IuQWxsb2NhdGUoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgQWxsb2NhdG9yVHlwZSwgY2xhc3MgVCwgc2l6ZV90IFNpemUsIHNpemVfdCBBbGlnbj4KK2lubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlJlY3ljbGluZ0FsbG9jYXRvcjxBbGxvY2F0b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULCBTaXplLCBBbGlnbj4gJkEpIHsKKyAgQS5EZWFsbG9jYXRlKEUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlZ2V4LmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWdleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjVjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWdleC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vPT09LS0gUmVnZXguaCAtIFJlZ3VsYXIgRXhwcmVzc2lvbiBtYXRjaGVyIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSA8c3RyaW5nPgorCitzdHJ1Y3QgbGx2bV9yZWdleDsKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBTdHJpbmdSZWY7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKyAgCisgIGNsYXNzIFJlZ2V4IHsKKyAgcHVibGljOgorICAgIGVudW0geworICAgICAgTm9GbGFncz0wLAorICAgICAgLy8vIENvbXBpbGUgZm9yIG1hdGNoaW5nIHRoYXQgaWdub3JlcyB1cHBlci9sb3dlciBjYXNlIGRpc3RpbmN0aW9ucy4KKyAgICAgIElnbm9yZUNhc2U9MSwKKyAgICAgIC8vLyBDb21waWxlIGZvciBuZXdsaW5lLXNlbnNpdGl2ZSBtYXRjaGluZy4gV2l0aCB0aGlzIGZsYWcgJ1teJyBicmFja2V0CisgICAgICAvLy8gZXhwcmVzc2lvbnMgYW5kICcuJyBuZXZlciBtYXRjaCBuZXdsaW5lLiBBIF4gYW5jaG9yIG1hdGNoZXMgdGhlIAorICAgICAgLy8vIG51bGwgc3RyaW5nIGFmdGVyIGFueSBuZXdsaW5lIGluIHRoZSBzdHJpbmcgaW4gYWRkaXRpb24gdG8gaXRzIG5vcm1hbCAKKyAgICAgIC8vLyBmdW5jdGlvbiwgYW5kIHRoZSAkIGFuY2hvciBtYXRjaGVzIHRoZSBudWxsIHN0cmluZyBiZWZvcmUgYW55IAorICAgICAgLy8vIG5ld2xpbmUgaW4gdGhlIHN0cmluZyBpbiBhZGRpdGlvbiB0byBpdHMgbm9ybWFsIGZ1bmN0aW9uLgorICAgICAgTmV3bGluZT0yCisgICAgfTsKKworICAgIC8vLyBDb21waWxlcyB0aGUgZ2l2ZW4gUE9TSVggRXh0ZW5kZWQgUmVndWxhciBFeHByZXNzaW9uIFxhcmcgUmVnZXguCisgICAgLy8vIFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgcmVnZXhlcyBhbmQgbWF0Y2hpbmcgc3RyaW5ncyB3aXRoIGVtYmVkZGVkCisgICAgLy8vIE5VTCBjaGFyYWN0ZXJzLgorICAgIFJlZ2V4KFN0cmluZ1JlZiBSZWdleCwgdW5zaWduZWQgRmxhZ3MgPSBOb0ZsYWdzKTsKKyAgICB+UmVnZXgoKTsKKworICAgIC8vLyBpc1ZhbGlkIC0gcmV0dXJucyB0aGUgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIHJlZ2V4IGNvbXBpbGF0aW9uLCBvcgorICAgIC8vLyBtYXRjaGluZywgaWYgYW55LgorICAgIGJvb2wgaXNWYWxpZChzdGQ6OnN0cmluZyAmRXJyb3IpOworCisgICAgLy8vIGdldE51bU1hdGNoZXMgLSBJbiBhIHZhbGlkIHJlZ2V4LCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJlbnRoZXNpemVkCisgICAgLy8vIG1hdGNoZXMgaXQgY29udGFpbnMuICBUaGUgbnVtYmVyIGZpbGxlZCBpbiBieSBtYXRjaCB3aWxsIGluY2x1ZGUgdGhpcworICAgIC8vLyBtYW55IGVudHJpZXMgcGx1cyBvbmUgZm9yIHRoZSB3aG9sZSByZWdleCAoYXMgZWxlbWVudCAwKS4KKyAgICB1bnNpZ25lZCBnZXROdW1NYXRjaGVzKCkgY29uc3Q7CisgICAgCisgICAgLy8vIG1hdGNoZXMgLSBNYXRjaCB0aGUgcmVnZXggYWdhaW5zdCBhIGdpdmVuIFxhcmcgU3RyaW5nLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTWF0Y2hlcyAtIElmIGdpdmVuLCBvbiBhIHN1Y2Nlc2Z1bCBtYXRjaCB0aGlzIHdpbGwgYmUgZmlsbGVkIGluCisgICAgLy8vIHdpdGggcmVmZXJlbmNlcyB0byB0aGUgbWF0Y2hlZCBncm91cCBleHByZXNzaW9ucyAoaW5zaWRlIFxhcmcgU3RyaW5nKSwKKyAgICAvLy8gdGhlIGZpcnN0IGdyb3VwIGlzIGFsd2F5cyB0aGUgZW50aXJlIHBhdHRlcm4uCisgICAgLy8vCisgICAgLy8vIFRoaXMgcmV0dXJucyB0cnVlIG9uIGEgc3VjY2Vzc2Z1bCBtYXRjaC4KKyAgICBib29sIG1hdGNoKFN0cmluZ1JlZiBTdHJpbmcsIFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICpNYXRjaGVzID0gMCk7CisKKyAgICAvLy8gc3ViIC0gUmV0dXJuIHRoZSByZXN1bHQgb2YgcmVwbGFjaW5nIHRoZSBmaXJzdCBtYXRjaCBvZiB0aGUgcmVnZXggaW4KKyAgICAvLy8gXGFyZyBTdHJpbmcgd2l0aCB0aGUgXGFyZyBSZXBsIHN0cmluZy4gQmFja3JlZmVyZW5jZXMgbGlrZSAiXDAiIGluIHRoZQorICAgIC8vLyByZXBsYWNlbWVudCBzdHJpbmcgYXJlIHJlcGxhY2VkIHdpdGggdGhlIGFwcHJvcHJpYXRlIG1hdGNoIHN1YnN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHRoZSByZXBsYWNlbWVudCBzdHJpbmcgaGFzIGJhY2tzbGFzaCBlc2NhcGluZyBwZXJmb3JtZWQgb24KKyAgICAvLy8gaXQuIEludmFsaWQgYmFja3JlZmVyZW5jZXMgYXJlIGlnbm9yZWQgKHJlcGxhY2VkIGJ5IGVtcHR5IHN0cmluZ3MpLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gRXJyb3IgSWYgbm9uLW51bGwsIGFueSBlcnJvcnMgaW4gdGhlIHN1YnN0aXR1dGlvbiAoaW52YWxpZAorICAgIC8vLyBiYWNrcmVmZXJlbmNlcywgdHJhaWxpbmcgYmFja3NsYXNoZXMpIHdpbGwgYmUgcmVjb3JkZWQgYXMgYSBub24tZW1wdHkKKyAgICAvLy8gc3RyaW5nLgorICAgIHN0ZDo6c3RyaW5nIHN1YihTdHJpbmdSZWYgUmVwbCwgU3RyaW5nUmVmIFN0cmluZywgc3RkOjpzdHJpbmcgKkVycm9yID0gMCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgbGx2bV9yZWdleCAqcHJlZzsKKyAgICBpbnQgZXJyb3I7CisgIH07Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWdpc3RyeS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVnaXN0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDM3NWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVnaXN0cnkuaApAQCAtMCwwICsxLDIyMyBAQAorLy89PT0gUmVnaXN0cnkuaCAtIExpbmtlci1zdXBwb3J0ZWQgcGx1Z2luIHJlZ2lzdHJpZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbmVzIGEgcmVnaXN0cnkgdGVtcGxhdGUgZm9yIGRpc2NvdmVyaW5nIHBsdWdnYWJsZSBtb2R1bGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JFR0lTVFJZX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JFR0lTVFJZX0gKKworbmFtZXNwYWNlIGxsdm0geworICAvLy8gQSBzaW1wbGUgcmVnaXN0cnkgZW50cnkgd2hpY2ggcHJvdmlkZXMgb25seSBhIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQKKyAgLy8vIG5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY2xhc3MgU2ltcGxlUmVnaXN0cnlFbnRyeSB7CisgICAgY29uc3QgY2hhciAqTmFtZSwgKkRlc2M7CisgICAgVCAqKCpDdG9yKSgpOworCisgIHB1YmxpYzoKKyAgICBTaW1wbGVSZWdpc3RyeUVudHJ5KGNvbnN0IGNoYXIgKk4sIGNvbnN0IGNoYXIgKkQsIFQgKigqQykoKSkKKyAgICAgIDogTmFtZShOKSwgRGVzYyhEKSwgQ3RvcihDKQorICAgIHt9CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICAgIGNvbnN0IGNoYXIgKmdldERlc2MoKSBjb25zdCB7IHJldHVybiBEZXNjOyB9CisgICAgVCAqaW5zdGFudGlhdGUoKSBjb25zdCB7IHJldHVybiBDdG9yKCk7IH0KKyAgfTsKKworCisgIC8vLyBUcmFpdHMgZm9yIHJlZ2lzdHJ5IGVudHJpZXMuIElmIHVzaW5nIG90aGVyIHRoYW4gU2ltcGxlUmVnaXN0cnlFbnRyeSwgaXQKKyAgLy8vIGlzIG5lY2Vzc2FyeSB0byBkZWZpbmUgYW4gYWx0ZXJuYXRlIHRyYWl0cyBjbGFzcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNsYXNzIFJlZ2lzdHJ5VHJhaXRzIHsKKyAgICBSZWdpc3RyeVRyYWl0cygpOyAvLyBEbyBub3QgaW1wbGVtZW50LgorCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpbXBsZVJlZ2lzdHJ5RW50cnk8VD4gZW50cnk7CisKKyAgICAvLy8gbmFtZW9mL2Rlc2NvZiAtIEFjY2Vzc29ycyBmb3IgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgZW50cmllcy4gVGhlc2UgYXJlCisgICAgLy8gICAgICAgICAgICAgICAgICB1c2VkIHRvIGdlbmVyYXRlIGhlbHAgZm9yIGNvbW1hbmQtbGluZSBvcHRpb25zLgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lb2YoY29uc3QgZW50cnkgJkVudHJ5KSB7IHJldHVybiBFbnRyeS5nZXROYW1lKCk7IH0KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZGVzY29mKGNvbnN0IGVudHJ5ICZFbnRyeSkgeyByZXR1cm4gRW50cnkuZ2V0RGVzYygpOyB9CisgIH07CisKKworICAvLy8gQSBnbG9iYWwgcmVnaXN0cnkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHN0YXRpYyBjb25zdHJ1Y3RvcnMgdG8gbWFrZQorICAvLy8gcGx1Z2dhYmxlIGNvbXBvbmVudHMgKGxpa2UgdGFyZ2V0cyBvciBnYXJiYWdlIGNvbGxlY3RvcnMpICJqdXN0IHdvcmsiIHdoZW4KKyAgLy8vIGxpbmtlZCB3aXRoIGFuIGV4ZWN1dGFibGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVID0gUmVnaXN0cnlUcmFpdHM8VD4gPgorICBjbGFzcyBSZWdpc3RyeSB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFUgdHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVTo6ZW50cnkgZW50cnk7CisKKyAgICBjbGFzcyBub2RlOworICAgIGNsYXNzIGxpc3RlbmVyOworICAgIGNsYXNzIGl0ZXJhdG9yOworCisgIHByaXZhdGU6CisgICAgUmVnaXN0cnkoKTsgLy8gRG8gbm90IGltcGxlbWVudC4KKworICAgIHN0YXRpYyB2b2lkIEFubm91bmNlKGNvbnN0IGVudHJ5ICZFKSB7CisgICAgICBmb3IgKGxpc3RlbmVyICpDdXIgPSBMaXN0ZW5lckhlYWQ7IEN1cjsgQ3VyID0gQ3VyLT5OZXh0KQorICAgICAgICBDdXItPnJlZ2lzdGVyZWQoRSk7CisgICAgfQorCisgICAgZnJpZW5kIGNsYXNzIG5vZGU7CisgICAgc3RhdGljIG5vZGUgKkhlYWQsICpUYWlsOworCisgICAgZnJpZW5kIGNsYXNzIGxpc3RlbmVyOworICAgIHN0YXRpYyBsaXN0ZW5lciAqTGlzdGVuZXJIZWFkLCAqTGlzdGVuZXJUYWlsOworCisgIHB1YmxpYzoKKyAgICAvLy8gTm9kZSBpbiBsaW5rZWQgbGlzdCBvZiBlbnRyaWVzLgorICAgIC8vLworICAgIGNsYXNzIG5vZGUgeworICAgICAgZnJpZW5kIGNsYXNzIGl0ZXJhdG9yOworCisgICAgICBub2RlICpOZXh0OworICAgICAgY29uc3QgZW50cnkmIFZhbDsKKworICAgIHB1YmxpYzoKKyAgICAgIG5vZGUoY29uc3QgZW50cnkmIFYpIDogTmV4dCgwKSwgVmFsKFYpIHsKKyAgICAgICAgaWYgKFRhaWwpCisgICAgICAgICAgVGFpbC0+TmV4dCA9IHRoaXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBIZWFkID0gdGhpczsKKyAgICAgICAgVGFpbCA9IHRoaXM7CisKKyAgICAgICAgQW5ub3VuY2UoVik7CisgICAgICB9CisgICAgfTsKKworCisgICAgLy8vIEl0ZXJhdG9ycyBmb3IgcmVnaXN0cnkgZW50cmllcy4KKyAgICAvLy8KKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICBjb25zdCBub2RlICpDdXI7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBpdGVyYXRvcihjb25zdCBub2RlICpOKSA6IEN1cihOKSB7fQorCisgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJlRoYXQpIGNvbnN0IHsgcmV0dXJuIEN1ciA9PSBUaGF0LkN1cjsgfQorICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yICZUaGF0KSBjb25zdCB7IHJldHVybiBDdXIgIT0gVGhhdC5DdXI7IH0KKyAgICAgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyBDdXIgPSBDdXItPk5leHQ7IHJldHVybiAqdGhpczsgfQorICAgICAgY29uc3QgZW50cnkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEN1ci0+VmFsOyB9CisgICAgICBjb25zdCBlbnRyeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZDdXItPlZhbDsgfQorICAgIH07CisKKyAgICBzdGF0aWMgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcihIZWFkKTsgfQorICAgIHN0YXRpYyBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIGl0ZXJhdG9yKDApOyB9CisKKworICAgIC8vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciByZWdpc3RyeSBsaXN0ZW5lcnMsIHdoaWNoIGFyZSBpbmZvcm1lZCB3aGVuIG5ldworICAgIC8vLyBlbnRyaWVzIGFyZSBhZGRlZCB0byB0aGUgcmVnaXN0cnkuIFNpbXBseSBzdWJjbGFzcyBhbmQgaW5zdGFudGlhdGU6CisgICAgLy8vCisgICAgLy8vICAgY2xhc3MgQ29sbGVjdG9yUHJpbnRlciA6IHB1YmxpYyBSZWdpc3RyeTxDb2xsZWN0b3I+OjpsaXN0ZW5lciB7CisgICAgLy8vICAgcHJvdGVjdGVkOgorICAgIC8vLyAgICAgdm9pZCByZWdpc3RlcmVkKGNvbnN0IFJlZ2lzdHJ5PENvbGxlY3Rvcj46OmVudHJ5ICZlKSB7CisgICAgLy8vICAgICAgIGNlcnIgPDwgImNvbGxlY3RvciBub3cgYXZhaWxhYmxlOiAiIDw8IGUtPmdldE5hbWUoKSA8PCAiXG4iOworICAgIC8vLyAgICAgfQorICAgIC8vLworICAgIC8vLyAgIHB1YmxpYzoKKyAgICAvLy8gICAgIENvbGxlY3RvclByaW50ZXIoKSB7IGluaXQoKTsgfSAgLy8gUHJpbnQgdGhvc2UgYWxyZWFkeSByZWdpc3RlcmVkLgorICAgIC8vLyAgIH07CisgICAgLy8vCisgICAgLy8vICAgQ29sbGVjdG9yUHJpbnRlciBQcmludGVyOworICAgIC8vLworICAgIGNsYXNzIGxpc3RlbmVyIHsKKyAgICAgIGxpc3RlbmVyICpQcmV2LCAqTmV4dDsKKworICAgICAgZnJpZW5kIHZvaWQgUmVnaXN0cnk6OkFubm91bmNlKGNvbnN0IGVudHJ5ICZFKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBDYWxsZWQgd2hlbiBhbiBlbnRyeSBpcyBhZGRlZCB0byB0aGUgcmVnaXN0cnkuCisgICAgICAvLy8KKyAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlcmVkKGNvbnN0IGVudHJ5ICYpID0gMDsKKworICAgICAgLy8vIENhbGxzICdyZWdpc3RlcmVkJyBmb3IgZWFjaCBwcmUtZXhpc3RpbmcgZW50cnkuCisgICAgICAvLy8KKyAgICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgICByZWdpc3RlcmVkKCpJKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIGxpc3RlbmVyKCkgOiBQcmV2KExpc3RlbmVyVGFpbCksIE5leHQoMCkgeworICAgICAgICBpZiAoUHJldikKKyAgICAgICAgICBQcmV2LT5OZXh0ID0gdGhpczsKKyAgICAgICAgZWxzZQorICAgICAgICAgIExpc3RlbmVySGVhZCA9IHRoaXM7CisgICAgICAgIExpc3RlbmVyVGFpbCA9IHRoaXM7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgfmxpc3RlbmVyKCkgeworICAgICAgICBpZiAoTmV4dCkKKyAgICAgICAgICBOZXh0LT5QcmV2ID0gUHJldjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIExpc3RlbmVyVGFpbCA9IFByZXY7CisgICAgICAgIGlmIChQcmV2KQorICAgICAgICAgIFByZXYtPk5leHQgPSBOZXh0OworICAgICAgICBlbHNlCisgICAgICAgICAgTGlzdGVuZXJIZWFkID0gTmV4dDsKKyAgICAgIH0KKyAgICB9OworCisKKyAgICAvLy8gQSBzdGF0aWMgcmVnaXN0cmF0aW9uIHRlbXBsYXRlLiBVc2UgbGlrZSBzdWNoOgorICAgIC8vLworICAgIC8vLyAgIFJlZ2lzdHJ5PENvbGxlY3Rvcj46OkFkZDxGYW5jeUdDPgorICAgIC8vLyAgIFgoImZhbmN5LWdjIiwgIk5ld2ZhbmdsZWQgZ2FyYmFnZSBjb2xsZWN0b3IuIik7CisgICAgLy8vCisgICAgLy8vIFVzZSBvZiB0aGlzIHRlbXBsYXRlIHJlcXVpcmVzIHRoYXQ6CisgICAgLy8vCisgICAgLy8vICAxLiBUaGUgcmVnaXN0ZXJlZCBzdWJjbGFzcyBoYXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8vICAyLiBUaGUgcmVnaXN0cnkgZW50cnkgdHlwZSBoYXMgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggdGhpcworICAgIC8vLyAgICAgc2lnbmF0dXJlOgorICAgIC8vLworICAgIC8vLyAgICAgICBlbnRyeShjb25zdCBjaGFyICpOYW1lLCBjb25zdCBjaGFyICpTaG9ydERlc2MsIFQgKigqQ3RvcikoKSk7CisgICAgLy8vCisgICAgLy8vIElmIHlvdSBoYXZlIG1vcmUgZWxhYm9yYXRlIHJlcXVpcmVtZW50cywgdGhlbiBjb3B5IGFuZCBtb2RpZnkuCisgICAgLy8vCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFY+CisgICAgY2xhc3MgQWRkIHsKKyAgICAgIGVudHJ5IEVudHJ5OworICAgICAgbm9kZSBOb2RlOworCisgICAgICBzdGF0aWMgVCAqQ3RvckZuKCkgeyByZXR1cm4gbmV3IFYoKTsgfQorCisgICAgcHVibGljOgorICAgICAgQWRkKGNvbnN0IGNoYXIgKk5hbWUsIGNvbnN0IGNoYXIgKkRlc2MpCisgICAgICAgIDogRW50cnkoTmFtZSwgRGVzYywgQ3RvckZuKSwgTm9kZShFbnRyeSkge30KKyAgICB9OworCisgICAgLy8vIFJlZ2lzdHJ5OjpQYXJzZXIgbm93IGxpdmVzIGluIGxsdm0vU3VwcG9ydC9SZWdpc3RyeVBhcnNlci5oLgorCisgIH07CisKKyAgLy8gU2luY2UgdGhlc2UgYXJlIGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSwgcGx1Z2lucyBtdXN0IGJlIHN1cmUgdG8gZXhwb3J0CisgIC8vIHRoZXNlIHN5bWJvbHMuCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgIHR5cGVuYW1lIFJlZ2lzdHJ5PFQsVT46Om5vZGUgKlJlZ2lzdHJ5PFQsVT46OkhlYWQ7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgIHR5cGVuYW1lIFJlZ2lzdHJ5PFQsVT46Om5vZGUgKlJlZ2lzdHJ5PFQsVT46OlRhaWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgIHR5cGVuYW1lIFJlZ2lzdHJ5PFQsVT46Omxpc3RlbmVyICpSZWdpc3RyeTxULFU+OjpMaXN0ZW5lckhlYWQ7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgIHR5cGVuYW1lIFJlZ2lzdHJ5PFQsVT46Omxpc3RlbmVyICpSZWdpc3RyeTxULFU+OjpMaXN0ZW5lclRhaWw7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWdpc3RyeVBhcnNlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVnaXN0cnlQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M1NzgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVnaXN0cnlQYXJzZXIuaApAQCAtMCwwICsxLDU1IEBACisvLz09PSBSZWdpc3RyeVBhcnNlci5oIC0gTGlua2VyLXN1cHBvcnRlZCBwbHVnaW4gcmVnaXN0cmllcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlZmluZXMgYSBjb21tYW5kLWxpbmUgcGFyc2VyIGZvciBhIHJlZ2lzdHJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JFR0lTVFJZX1BBUlNFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9SRUdJU1RSWV9QQVJTRVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlZ2lzdHJ5LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLy8gQSBjb21tYW5kLWxpbmUgcGFyc2VyIGZvciBhIHJlZ2lzdHJ5LiBVc2UgbGlrZSBzdWNoOgorICAvLy8KKyAgLy8vICAgc3RhdGljIGNsOjpvcHQ8UmVnaXN0cnk8Q29sbGVjdG9yPjo6ZW50cnksIGZhbHNlLAorICAvLy8gICAgICAgICAgICAgICAgICBSZWdpc3RyeVBhcnNlcjxDb2xsZWN0b3I+ID4KKyAgLy8vICAgR0NPcHQoImdjIiwgY2w6OmRlc2MoIkdhcmJhZ2UgY29sbGVjdG9yIHRvIHVzZS4iKSwKKyAgLy8vICAgICAgICAgICAgICAgY2w6OnZhbHVlX2Rlc2MoKSk7CisgIC8vLworICAvLy8gVG8gbWFrZSB1c2Ugb2YgdGhlIHZhbHVlOgorICAvLy8KKyAgLy8vICAgQ29sbGVjdG9yICpUaGVDb2xsZWN0b3IgPSBHQ09wdC0+aW5zdGFudGlhdGUoKTsKKyAgLy8vCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVID0gUmVnaXN0cnlUcmFpdHM8VD4gPgorICBjbGFzcyBSZWdpc3RyeVBhcnNlciA6CisgIHB1YmxpYyBjbDo6cGFyc2VyPGNvbnN0IHR5cGVuYW1lIFU6OmVudHJ5Kj4sCisgICAgcHVibGljIFJlZ2lzdHJ5PFQsIFU+OjpsaXN0ZW5lciB7CisgICAgdHlwZWRlZiBVIHRyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFU6OmVudHJ5IGVudHJ5OworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmVnaXN0cnk8VCwgVT46Omxpc3RlbmVyIGxpc3RlbmVyOworCisgIHByb3RlY3RlZDoKKyAgICB2b2lkIHJlZ2lzdGVyZWQoY29uc3QgZW50cnkgJkUpIHsKKyAgICAgIGFkZExpdGVyYWxPcHRpb24odHJhaXRzOjpuYW1lb2YoRSksICZFLCB0cmFpdHM6OmRlc2NvZihFKSk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB2b2lkIGluaXRpYWxpemUoY2w6Ok9wdGlvbiAmTykgeworICAgICAgbGlzdGVuZXI6OmluaXQoKTsKKyAgICAgIGNsOjpwYXJzZXI8Y29uc3QgdHlwZW5hbWUgVTo6ZW50cnkqPjo6aW5pdGlhbGl6ZShPKTsKKyAgICB9CisgIH07CisKK30KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9SRUdJU1RSWV9QQVJTRVJfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvU01Mb2MuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NNTG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3YmYxNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NNTG9jLmgKQEAgLTAsMCArMSw0NCBAQAorLy89PT0tIFNNTG9jLmggLSBTb3VyY2UgbG9jYXRpb24gZm9yIHVzZSB3aXRoIGRpYWdub3N0aWNzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFNNTG9jIGNsYXNzLiAgVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYSBsb2NhdGlvbiBpbgorLy8gc291cmNlIGNvZGUgZm9yIHVzZSBpbiBkaWFnbm9zdGljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFNVUFBPUlRfU01MT0NfSAorI2RlZmluZSBTVVBQT1JUX1NNTE9DX0gKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBTTUxvYyAtIFJlcHJlc2VudHMgYSBsb2NhdGlvbiBpbiBzb3VyY2UgY29kZS4KK2NsYXNzIFNNTG9jIHsgICAgCisgIGNvbnN0IGNoYXIgKlB0cjsKK3B1YmxpYzoKKyAgU01Mb2MoKSA6IFB0cigwKSB7fQorICBTTUxvYyhjb25zdCBTTUxvYyAmUkhTKSA6IFB0cihSSFMuUHRyKSB7fQorICAgIAorICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBQdHIgIT0gMDsgfQorICAgIAorICBib29sIG9wZXJhdG9yPT0oY29uc3QgU01Mb2MgJlJIUykgY29uc3QgeyByZXR1cm4gUkhTLlB0ciA9PSBQdHI7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNNTG9jICZSSFMpIGNvbnN0IHsgcmV0dXJuIFJIUy5QdHIgIT0gUHRyOyB9CisgICAgCisgIGNvbnN0IGNoYXIgKmdldFBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBQdHI7IH0KKyAgICAKKyAgc3RhdGljIFNNTG9jIGdldEZyb21Qb2ludGVyKGNvbnN0IGNoYXIgKlB0cikgeworICAgIFNNTG9jIEw7CisgICAgTC5QdHIgPSBQdHI7CisgICAgcmV0dXJuIEw7CisgIH0KK307CisKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Nsb3dPcGVyYXRpb25JbmZvcm1lci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2xvd09wZXJhdGlvbkluZm9ybWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3ZDk5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Nsb3dPcGVyYXRpb25JbmZvcm1lci5oCkBAIC0wLDAgKzEsNjUgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvU2xvd09wZXJhdGlvbkluZm9ybWVyLmggLSBLZWVwIHVzZXIgaW5mb3JtZWQgKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBzaW1wbGUgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGxldCB0aGUgdXNlciBrbm93IHdoYXQKKy8vIGlzIGdvaW5nIG9uIHdoZW4gYSBzbG93IG9wZXJhdGlvbiBpcyBoYXBwZW5pbmcsIGFuZCBnaXZlcyB0aGVtIHRoZSBhYmlsaXR5IHRvCisvLyBjYW5jZWwgaXQuICBQb3RlbnRpYWxseSBzbG93IG9wZXJhdGlvbnMgY2FuIHN0YWNrIGFsbG9jYXRlIG9uZSBvZiB0aGVzZQorLy8gb2JqZWN0cywgYW5kIHBlcmlvZGljYWxseSBjYWxsIHRoZSAicHJvZ3Jlc3MiIG1ldGhvZCB0byB1cGRhdGUgdGhlIHByb2dyZXNzCisvLyBiYXIuICBJZiB0aGUgb3BlcmF0aW9uIHRha2VzIG1vcmUgdGhhbiAxIHNlY29uZCB0byBjb21wbGV0ZSwgdGhlIHByb2dyZXNzIGJhcgorLy8gaXMgYXV0b21hdGljYWxseSBzaG93biBhbmQgdXBkYXRlZC4gIEFzIHN1Y2gsIHRoZSBzbG93IG9wZXJhdGlvbiBzaG91bGQgbm90CisvLyBwcmludCBzdHVmZiB0byB0aGUgc2NyZWVuLCBhbmQgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCBpZiBhbiBleHRyYSBsaW5lCisvLyBhcHBlYXJzIG9uIHRoZSBzY3JlZW4gKGllLCB0aGUgY3Vyc29yIHNob3VsZCBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUpLgorLy8KKy8vIElmIHRoZSB1c2VyIHByZXNzZXMgQ1RSTC1DIGR1cmluZyB0aGUgb3BlcmF0aW9uLCB0aGUgbmV4dCBpbnZvY2F0aW9uIG9mIHRoZQorLy8gcHJvZ3Jlc3MgbWV0aG9kIHJldHVybiB0cnVlIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuCisvLworLy8gQmVjYXVzZSBTbG93T3BlcmF0aW9uSW5mb3JtZXJzIGZpZGRsZSBhcm91bmQgd2l0aCBzaWduYWxzLCB0aGV5IGNhbm5vdCBiZQorLy8gbmVzdGVkLCBhbmQgaW50ZXJhY3QgcG9vcmx5IHdpdGggdGhyZWFkcy4gIFRoZSBTSUdBTFJNIGhhbmRsZXIgaXMgc2V0IGJhY2sgdG8KKy8vIFNJR0RGTCwgYnV0IHRoZSBTSUdJTlQgc2lnbmFsIGhhbmRsZXIgaXMgcmVzdG9yZWQgd2hlbiB0aGUKKy8vIFNsb3dPcGVyYXRpb25JbmZvcm1lciBpcyBkZXN0cm95ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU0xPV19PUEVSQVRJT05fSU5GT1JNRVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU0xPV19PUEVSQVRJT05fSU5GT1JNRVJfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgU2xvd09wZXJhdGlvbkluZm9ybWVyIHsKKyAgICBzdGQ6OnN0cmluZyBPcGVyYXRpb25OYW1lOworICAgIHVuc2lnbmVkIExhc3RQcmludEFtb3VudDsKKworICAgIFNsb3dPcGVyYXRpb25JbmZvcm1lcihjb25zdCBTbG93T3BlcmF0aW9uSW5mb3JtZXImKTsgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU2xvd09wZXJhdGlvbkluZm9ybWVyJik7ICAgICAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFNsb3dPcGVyYXRpb25JbmZvcm1lcihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSk7CisgICAgflNsb3dPcGVyYXRpb25JbmZvcm1lcigpOworCisgICAgLy8vIHByb2dyZXNzIC0gQ2xpZW50cyBzaG91bGQgcGVyaW9kaWNhbGx5IGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGV5IGNhbgorICAgIC8vLyBoYW5kbGUgY2FuY2VsbGF0aW9uLiAgVGhlIEFtb3VudCB2YXJpYWJsZSBzaG91bGQgaW5kaWNhdGUgaG93IGZhcgorICAgIC8vLyBhbG9uZyB0aGUgb3BlcmF0aW9uIGlzLCBnaXZlbiBpbiAxLzEwdGhzIG9mIGEgcGVyY2VudCAoaW4gb3RoZXIgd29yZHMsCisgICAgLy8vIEFtb3VudCBzaG91bGQgcmFuZ2UgZnJvbSAwIHRvIDEwMDApLiAgSWYgdGhlIHVzZXIgY2FuY2VscyB0aGUgb3BlcmF0aW9uLAorICAgIC8vLyB0aGlzIHJldHVybnMgdHJ1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgcHJvZ3Jlc3ModW5zaWduZWQgQW1vdW50KTsKKworICAgIC8vLyBwcm9ncmVzcyAtIFNhbWUgYXMgdGhlIG1ldGhvZCBhYm92ZSwgYnV0IHRoaXMgcGVyZm9ybXMgdGhlIGRpdmlzaW9uIGZvcgorICAgIC8vLyB5b3UsIGFuZCBoZWxwcyB5b3UgYXZvaWQgb3ZlcmZsb3cgaWYgeW91IGFyZSBkZWFsaW5nIHdpdGggbGFyZ2lzaAorICAgIC8vLyBudW1iZXJzLgorICAgIGJvb2wgcHJvZ3Jlc3ModW5zaWduZWQgQ3VycmVudCwgdW5zaWduZWQgTWF4aW11bSkgeworICAgICAgYXNzZXJ0KE1heGltdW0gIT0gMCAmJgorICAgICAgICAgICAgICJTaG91bGRuJ3QgYmUgZG9pbmcgd29yayBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvISIpOworICAgICAgcmV0dXJuIHByb2dyZXNzKEN1cnJlbnQqdWludDY0X3QoMTAwMFVMKS9NYXhpbXVtKTsKKyAgICB9CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLyogU0xPV19PUEVSQVRJT05fSU5GT1JNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvU291cmNlTWdyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Tb3VyY2VNZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBhYjJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvU291cmNlTWdyLmgKQEAgLTAsMCArMSwxODkgQEAKKy8vPT09LSBTb3VyY2VNZ3IuaCAtIE1hbmFnZXIgZm9yIFNvdXJjZSBCdWZmZXJzICYgRGlhZ25vc3RpY3MgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTTURpYWdub3N0aWMgYW5kIFNvdXJjZU1nciBjbGFzc2VzLiAgVGhpcworLy8gcHJvdmlkZXMgYSBzaW1wbGUgc3Vic3RyYXRlIGZvciBkaWFnbm9zdGljcywgI2luY2x1ZGUgaGFuZGxpbmcsIGFuZCBvdGhlciBsb3cKKy8vIGxldmVsIHRoaW5ncyBmb3Igc2ltcGxlIHBhcnNlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTVVBQT1JUX1NPVVJDRU1HUl9ICisjZGVmaW5lIFNVUFBPUlRfU09VUkNFTUdSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1lbW9yeUJ1ZmZlcjsKKyAgY2xhc3MgU291cmNlTWdyOworICBjbGFzcyBTTURpYWdub3N0aWM7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisvLy8gU291cmNlTWdyIC0gVGhpcyBvd25zIHRoZSBmaWxlcyByZWFkIGJ5IGEgcGFyc2VyLCBoYW5kbGVzIGluY2x1ZGUgc3RhY2tzLAorLy8vIGFuZCBoYW5kbGVzIGRpYWdub3N0aWMgd3JhbmdsaW5nLgorY2xhc3MgU291cmNlTWdyIHsKK3B1YmxpYzoKKyAgLy8vIERpYWdIYW5kbGVyVHkgLSBDbGllbnRzIHRoYXQgd2FudCB0byBoYW5kbGUgdGhlaXIgb3duIGRpYWdub3N0aWNzIGluIGEKKyAgLy8vIGN1c3RvbSB3YXkgY2FuIHJlZ2lzdGVyIGEgZnVuY3Rpb24gcG9pbnRlcitjb250ZXh0IGFzIGEgZGlhZ25vc3RpYworICAvLy8gaGFuZGxlci4gIEl0IGdldHMgY2FsbGVkIGVhY2ggdGltZSBQcmludE1lc3NhZ2UgaXMgaW52b2tlZC4KKyAgdHlwZWRlZiB2b2lkICgqRGlhZ0hhbmRsZXJUeSkoY29uc3QgU01EaWFnbm9zdGljJiwgdm9pZCAqQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTG9jQ29va2llKTsKK3ByaXZhdGU6CisgIHN0cnVjdCBTcmNCdWZmZXIgeworICAgIC8vLyBCdWZmZXIgLSBUaGUgbWVtb3J5IGJ1ZmZlciBmb3IgdGhlIGZpbGUuCisgICAgTWVtb3J5QnVmZmVyICpCdWZmZXI7CisKKyAgICAvLy8gSW5jbHVkZUxvYyAtIFRoaXMgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBwYXJlbnQgaW5jbHVkZSwgb3IgbnVsbCBpZiBhdAorICAgIC8vLyB0aGUgdG9wIGxldmVsLgorICAgIFNNTG9jIEluY2x1ZGVMb2M7CisgIH07CisKKyAgLy8vIEJ1ZmZlcnMgLSBUaGlzIGlzIGFsbCBvZiB0aGUgYnVmZmVycyB0aGF0IHdlIGFyZSByZWFkaW5nIGZyb20uCisgIHN0ZDo6dmVjdG9yPFNyY0J1ZmZlcj4gQnVmZmVyczsKKworICAvLyBJbmNsdWRlRGlyZWN0b3JpZXMgLSBUaGlzIGlzIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHdlIHNob3VsZCBzZWFyY2ggZm9yCisgIC8vIGluY2x1ZGUgZmlsZXMgaW4uCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBJbmNsdWRlRGlyZWN0b3JpZXM7CisKKyAgLy8vIExpbmVOb0NhY2hlIC0gVGhpcyBpcyBhIGNhY2hlIGZvciBsaW5lIG51bWJlciBxdWVyaWVzLCBpdHMgaW1wbGVtZW50YXRpb24KKyAgLy8vIGlzIHJlYWxseSBwcml2YXRlIHRvIFNvdXJjZU1nci5jcHAuCisgIG11dGFibGUgdm9pZCAqTGluZU5vQ2FjaGU7CisKKyAgRGlhZ0hhbmRsZXJUeSBEaWFnSGFuZGxlcjsKKyAgdm9pZCAqRGlhZ0NvbnRleHQ7CisgIHVuc2lnbmVkIERpYWdMb2NDb29raWU7CisgIAorICBTb3VyY2VNZ3IoY29uc3QgU291cmNlTWdyJik7ICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU291cmNlTWdyJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKK3B1YmxpYzoKKyAgU291cmNlTWdyKCkgOiBMaW5lTm9DYWNoZSgwKSwgRGlhZ0hhbmRsZXIoMCksIERpYWdDb250ZXh0KDApIHt9CisgIH5Tb3VyY2VNZ3IoKTsKKworICB2b2lkIHNldEluY2x1ZGVEaXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmRGlycykgeworICAgIEluY2x1ZGVEaXJlY3RvcmllcyA9IERpcnM7CisgIH0KKworICAvLy8gc2V0RGlhZ0hhbmRsZXIgLSBTcGVjaWZ5IGEgZGlhZ25vc3RpYyBoYW5kbGVyIHRvIGJlIGludm9rZWQgZXZlcnkgdGltZQorICAvLy8gUHJpbnRNZXNzYWdlIGlzIGNhbGxlZC4gIEN0eCBhbmQgQ29va2llIGFyZSBwYXNzZWQgaW50byB0aGUgaGFuZGxlciB3aGVuCisgIC8vLyBpdCBpcyBpbnZva2VkLgorICB2b2lkIHNldERpYWdIYW5kbGVyKERpYWdIYW5kbGVyVHkgREgsIHZvaWQgKkN0eCA9IDAsIHVuc2lnbmVkIENvb2tpZSA9IDApIHsKKyAgICBEaWFnSGFuZGxlciA9IERIOworICAgIERpYWdDb250ZXh0ID0gQ3R4OworICAgIERpYWdMb2NDb29raWUgPSBDb29raWU7CisgIH0KKworICBjb25zdCBTcmNCdWZmZXIgJmdldEJ1ZmZlckluZm8odW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgQnVmZmVycy5zaXplKCkgJiYgIkludmFsaWQgQnVmZmVyIElEISIpOworICAgIHJldHVybiBCdWZmZXJzW2ldOworICB9CisKKyAgY29uc3QgTWVtb3J5QnVmZmVyICpnZXRNZW1vcnlCdWZmZXIodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgQnVmZmVycy5zaXplKCkgJiYgIkludmFsaWQgQnVmZmVyIElEISIpOworICAgIHJldHVybiBCdWZmZXJzW2ldLkJ1ZmZlcjsKKyAgfQorCisgIFNNTG9jIGdldFBhcmVudEluY2x1ZGVMb2ModW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgQnVmZmVycy5zaXplKCkgJiYgIkludmFsaWQgQnVmZmVyIElEISIpOworICAgIHJldHVybiBCdWZmZXJzW2ldLkluY2x1ZGVMb2M7CisgIH0KKworICAvLy8gQWRkTmV3U291cmNlQnVmZmVyIC0gQWRkIGEgbmV3IHNvdXJjZSBidWZmZXIgdG8gdGhpcyBzb3VyY2UgbWFuYWdlci4gIFRoaXMKKyAgLy8vIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgbWVtb3J5IGJ1ZmZlci4KKyAgdW5zaWduZWQgQWRkTmV3U291cmNlQnVmZmVyKE1lbW9yeUJ1ZmZlciAqRiwgU01Mb2MgSW5jbHVkZUxvYykgeworICAgIFNyY0J1ZmZlciBOQjsKKyAgICBOQi5CdWZmZXIgPSBGOworICAgIE5CLkluY2x1ZGVMb2MgPSBJbmNsdWRlTG9jOworICAgIEJ1ZmZlcnMucHVzaF9iYWNrKE5CKTsKKyAgICByZXR1cm4gQnVmZmVycy5zaXplKCktMTsKKyAgfQorCisgIC8vLyBBZGRJbmNsdWRlRmlsZSAtIFNlYXJjaCBmb3IgYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBjdXJyZW50CisgIC8vLyBkaXJlY3Rvcnkgb3IgaW4gb25lIG9mIHRoZSBJbmNsdWRlRGlycy4gIElmIG5vIGZpbGUgaXMgZm91bmQsIHRoaXMgcmV0dXJucworICAvLy8gfjAsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBidWZmZXIgSUQgb2YgdGhlIHN0YWNrZWQgZmlsZS4KKyAgdW5zaWduZWQgQWRkSW5jbHVkZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVuYW1lLCBTTUxvYyBJbmNsdWRlTG9jKTsKKworICAvLy8gRmluZEJ1ZmZlckNvbnRhaW5pbmdMb2MgLSBSZXR1cm4gdGhlIElEIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUKKyAgLy8vIHNwZWNpZmllZCBsb2NhdGlvbiwgcmV0dXJuaW5nIC0xIGlmIG5vdCBmb3VuZC4KKyAgaW50IEZpbmRCdWZmZXJDb250YWluaW5nTG9jKFNNTG9jIExvYykgY29uc3Q7CisKKyAgLy8vIEZpbmRMaW5lTnVtYmVyIC0gRmluZCB0aGUgbGluZSBudW1iZXIgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlCisgIC8vLyBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgaXMgbm90IGEgZmFzdCBtZXRob2QuCisgIHVuc2lnbmVkIEZpbmRMaW5lTnVtYmVyKFNNTG9jIExvYywgaW50IEJ1ZmZlcklEID0gLTEpIGNvbnN0OworCisgIC8vLyBQcmludE1lc3NhZ2UgLSBFbWl0IGEgbWVzc2FnZSBhYm91dCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpdGggdGhlCisgIC8vLyBzcGVjaWZpZWQgc3RyaW5nLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUeXBlIC0gSWYgbm9uLW51bGwsIHRoZSBraW5kIG9mIG1lc3NhZ2UgKGUuZy4sICJlcnJvciIpIHdoaWNoIGlzCisgIC8vLyBwcmVmaXhlZCB0byB0aGUgbWVzc2FnZS4KKyAgLy8vIEBwYXJhbSBTaG93TGluZSAtIFNob3VsZCB0aGUgZGlhZ25vc3RpYyBzaG93IHRoZSBzb3VyY2UgbGluZS4KKyAgdm9pZCBQcmludE1lc3NhZ2UoU01Mb2MgTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTXNnLCBjb25zdCBjaGFyICpUeXBlLAorICAgICAgICAgICAgICAgICAgICBib29sIFNob3dMaW5lID0gdHJ1ZSkgY29uc3Q7CisKKworICAvLy8gR2V0TWVzc2FnZSAtIFJldHVybiBhbiBTTURpYWdub3N0aWMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aXRoIHRoZQorICAvLy8gc3BlY2lmaWVkIHN0cmluZy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gVHlwZSAtIElmIG5vbi1udWxsLCB0aGUga2luZCBvZiBtZXNzYWdlIChlLmcuLCAiZXJyb3IiKSB3aGljaCBpcworICAvLy8gcHJlZml4ZWQgdG8gdGhlIG1lc3NhZ2UuCisgIC8vLyBAcGFyYW0gU2hvd0xpbmUgLSBTaG91bGQgdGhlIGRpYWdub3N0aWMgc2hvdyB0aGUgc291cmNlIGxpbmUuCisgIFNNRGlhZ25vc3RpYyBHZXRNZXNzYWdlKFNNTG9jIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZywgY29uc3QgY2hhciAqVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG93TGluZSA9IHRydWUpIGNvbnN0OworCisKK3ByaXZhdGU6CisgIHZvaWQgUHJpbnRJbmNsdWRlU3RhY2soU01Mb2MgSW5jbHVkZUxvYywgcmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisKKworLy8vIFNNRGlhZ25vc3RpYyAtIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGVuY2Fwc3VsYXRlIG9uZSBkaWFnbm9zdGljIHJlcG9ydCwKKy8vLyBhbGxvd2luZyBwcmludGluZyB0byBhIHJhd19vc3RyZWFtIGFzIGEgY2FyZXQgZGlhZ25vc3RpYy4KK2NsYXNzIFNNRGlhZ25vc3RpYyB7CisgIGNvbnN0IFNvdXJjZU1nciAqU007CisgIFNNTG9jIExvYzsKKyAgc3RkOjpzdHJpbmcgRmlsZW5hbWU7CisgIGludCBMaW5lTm8sIENvbHVtbk5vOworICBzdGQ6OnN0cmluZyBNZXNzYWdlLCBMaW5lQ29udGVudHM7CisgIHVuc2lnbmVkIFNob3dMaW5lIDogMTsKKworcHVibGljOgorICAvLyBOdWxsIGRpYWdub3N0aWMuCisgIFNNRGlhZ25vc3RpYygpIDogU00oMCksIExpbmVObygwKSwgQ29sdW1uTm8oMCksIFNob3dMaW5lKDApIHt9CisgIC8vIERpYWdub3N0aWMgd2l0aCBubyBsb2NhdGlvbiAoZS5nLiBmaWxlIG5vdCBmb3VuZCwgY29tbWFuZCBsaW5lIGFyZyBlcnJvcikuCisgIFNNRGlhZ25vc3RpYyhjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nICZNc2csCisgICAgICAgICAgICAgICBib29sIHNob3dsaW5lID0gdHJ1ZSkKKyAgICA6IFNNKDApLCBGaWxlbmFtZShmaWxlbmFtZSksIExpbmVObygtMSksIENvbHVtbk5vKC0xKSwKKyAgICAgIE1lc3NhZ2UoTXNnKSwgU2hvd0xpbmUoc2hvd2xpbmUpIHt9CisgIAorICAvLyBEaWFnbm9zdGljIHdpdGggYSBsb2NhdGlvbi4KKyAgU01EaWFnbm9zdGljKGNvbnN0IFNvdXJjZU1nciAmc20sIFNNTG9jIEwsIGNvbnN0IHN0ZDo6c3RyaW5nICZGTiwKKyAgICAgICAgICAgICAgIGludCBMaW5lLCBpbnQgQ29sLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZywgY29uc3Qgc3RkOjpzdHJpbmcgJkxpbmVTdHIsCisgICAgICAgICAgICAgICBib29sIHNob3dsaW5lID0gdHJ1ZSkKKyAgICA6IFNNKCZzbSksIExvYyhMKSwgRmlsZW5hbWUoRk4pLCBMaW5lTm8oTGluZSksIENvbHVtbk5vKENvbCksIE1lc3NhZ2UoTXNnKSwKKyAgICAgIExpbmVDb250ZW50cyhMaW5lU3RyKSwgU2hvd0xpbmUoc2hvd2xpbmUpIHt9CisKKyAgY29uc3QgU291cmNlTWdyICpnZXRTb3VyY2VNZ3IoKSBjb25zdCB7IHJldHVybiBTTTsgfQorICBTTUxvYyBnZXRMb2MoKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEZpbGVuYW1lKCkgeyByZXR1cm4gRmlsZW5hbWU7IH0KKyAgaW50IGdldExpbmVObygpIGNvbnN0IHsgcmV0dXJuIExpbmVObzsgfQorICBpbnQgZ2V0Q29sdW1uTm8oKSBjb25zdCB7IHJldHVybiBDb2x1bW5ObzsgfQorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIE1lc3NhZ2U7IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldExpbmVDb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIExpbmVDb250ZW50czsgfQorICBib29sIGdldFNob3dMaW5lKCkgY29uc3QgeyByZXR1cm4gU2hvd0xpbmU7IH0KKyAgCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciAqUHJvZ05hbWUsIHJhd19vc3RyZWFtICZTKSBjb25zdDsKK307CisKK30gIC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N0YWJsZUJhc2ljQmxvY2tOdW1iZXJpbmcuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N0YWJsZUJhc2ljQmxvY2tOdW1iZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTBmODdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3RhYmxlQmFzaWNCbG9ja051bWJlcmluZy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09LSBTdGFibGVCYXNpY0Jsb2NrTnVtYmVyaW5nLmggLSBQcm92aWRlIEJCIGlkZW50aWZpZXJzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhICpzdGFibGUqIG51bWJlcmluZyBvZiBiYXNpYyBibG9ja3MgdGhhdCBkb2VzIG5vdCBkZXBlbmQKKy8vIG9uIHRoZWlyIGFkZHJlc3MgaW4gbWVtb3J5ICh3aGljaCBpcyBub25kZXRlcm1pbmlzdGljKS4gIFdoZW4gcmVxdWVzdGVkLCB0aGlzCisvLyBjbGFzcyBzaW1wbHkgcHJvdmlkZXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggYmFzaWMgYmxvY2sgaW4gdGhlIGZ1bmN0aW9uCisvLyBzcGVjaWZpZWQgYW5kIHRoZSBpbnZlcnNlIG1hcHBpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU1RBQkxFQkFTSUNCTE9DS05VTUJFUklOR19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TVEFCTEVCQVNJQ0JMT0NLTlVNQkVSSU5HX0gKKworI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9VbmlxdWVWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBTdGFibGVCYXNpY0Jsb2NrTnVtYmVyaW5nIHsKKyAgICAvLyBCQk51bWJlcmluZyAtIEhvbGRzIHRoZSBudW1iZXJpbmcuCisgICAgVW5pcXVlVmVjdG9yPEJhc2ljQmxvY2sqPiBCQk51bWJlcmluZzsKKyAgcHVibGljOgorICAgIFN0YWJsZUJhc2ljQmxvY2tOdW1iZXJpbmcoRnVuY3Rpb24gKkYgPSAwKSB7CisgICAgICBpZiAoRikgY29tcHV0ZSgqRik7CisgICAgfQorCisgICAgLy8vIGNvbXB1dGUgLSBJZiB3ZSBoYXZlIG5vdCBjb21wdXRlZCBhIG51bWJlcmluZyBmb3IgdGhlIGZ1bmN0aW9uIHlldCwgZG8KKyAgICAvLy8gc28uCisgICAgdm9pZCBjb21wdXRlKEZ1bmN0aW9uICZGKSB7CisgICAgICBpZiAoQkJOdW1iZXJpbmcuZW1wdHkoKSkgeworICAgICAgICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBJID0gRi5iZWdpbigpLCBFID0gRi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgICAgQkJOdW1iZXJpbmcuaW5zZXJ0KEkpOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBnZXROdW1iZXIgLSBSZXR1cm4gdGhlIElEIG51bWJlciBmb3IgdGhlIHNwZWNpZmllZCBCYXNpY0Jsb2NrLgorICAgIC8vLworICAgIHVuc2lnbmVkIGdldE51bWJlcihCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgICAgdW5zaWduZWQgSWR4ID0gQkJOdW1iZXJpbmcuaWRGb3IoQkIpOworICAgICAgYXNzZXJ0KElkeCAmJiAiSW52YWxpZCBiYXNpYyBibG9jayBvciBudW1iZXJpbmcgbm90IGNvbXB1dGVkISIpOworICAgICAgcmV0dXJuIElkeC0xOworICAgIH0KKworICAgIC8vLyBnZXRCbG9jayAtIFJldHVybiB0aGUgQmFzaWNCbG9jayBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhciBJRC4KKyAgICAvLy8KKyAgICBCYXNpY0Jsb2NrICpnZXRCbG9jayh1bnNpZ25lZCBOKSBjb25zdCB7CisgICAgICBhc3NlcnQoTiA8IEJCTnVtYmVyaW5nLnNpemUoKSAmJgorICAgICAgICAgICAgICJCbG9jayBJRCBvdXQgb2YgcmFuZ2Ugb3IgbnVtYmVyaW5nIG5vdCBjb21wdXRlZCEiKTsKKyAgICAgIHJldHVybiBCQk51bWJlcmluZ1tOKzFdOworICAgIH0KKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TdGFuZGFyZFBhc3Nlcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3RhbmRhcmRQYXNzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjJmYmYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3RhbmRhcmRQYXNzZXMuaApAQCAtMCwwICsxLDI1MSBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvU3RhbmRhcmRQYXNzZXMuaCAtIFN0YW5kYXJkIHBhc3MgbGlzdHMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYSAic3RhbmRhcmQiIHNldCBvZgorLy8gb3B0aW1pemF0aW9uIHBhc3Nlcywgc28gdGhhdCBjb21waWxlcnMgYW5kIHRvb2xzIHdoaWNoIHVzZSBvcHRpbWl6YXRpb24KKy8vIHBhc3NlcyB1c2UgdGhlIHNhbWUgc2V0IG9mIHN0YW5kYXJkIHBhc3Nlcy4KKy8vCisvLyBUaGVzZSBhcmUgaW1wbGVtZW50ZWQgYXMgaW5saW5lIGZ1bmN0aW9ucyBzbyB0aGF0IHdlIGRvIG5vdCBoYXZlIHRvIHdvcnJ5CisvLyBhYm91dCBsaW5rIGlzc3Vlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9TVEFOREFSRFBBU1NFU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TVEFOREFSRFBBU1NFU19ICisKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1ZlcmlmaWVyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICAvLy8gY3JlYXRlU3RhbmRhcmRGdW5jdGlvblBhc3NlcyAtIEFkZCB0aGUgc3RhbmRhcmQgbGlzdCBvZiBmdW5jdGlvbiBwYXNzZXMgdG8KKyAgLy8vIHRoZSBwcm92aWRlZCBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gXGFyZyBPcHRpbWl6YXRpb25MZXZlbCAtIFRoZSBvcHRpbWl6YXRpb24gbGV2ZWwsIGNvcnJlc3BvbmRpbmcgdG8gLU8wLAorICAvLy8gLU8xLCBldGMuCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjcmVhdGVTdGFuZGFyZEZ1bmN0aW9uUGFzc2VzKFBhc3NNYW5hZ2VyQmFzZSAqUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wdGltaXphdGlvbkxldmVsKTsKKworICAvLy8gY3JlYXRlU3RhbmRhcmRNb2R1bGVQYXNzZXMgLSBBZGQgdGhlIHN0YW5kYXJkIGxpc3Qgb2YgbW9kdWxlIHBhc3NlcyB0byB0aGUKKyAgLy8vIHByb3ZpZGVkIHBhc3MgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBcYXJnIE9wdGltaXphdGlvbkxldmVsIC0gVGhlIG9wdGltaXphdGlvbiBsZXZlbCwgY29ycmVzcG9uZGluZyB0byAtTzAsCisgIC8vLyAtTzEsIGV0Yy4KKyAgLy8vIFxhcmcgT3B0aW1pemVTaXplIC0gV2hldGhlciB0aGUgdHJhbnNmb3JtYXRpb25zIHNob3VsZCBvcHRpbWl6ZSBmb3Igc2l6ZS4KKyAgLy8vIFxhcmcgVW5pdEF0QVRpbWUgLSBBbGxvdyBwYXNzZXMgd2hpY2ggbWF5IG1ha2UgZ2xvYmFsIG1vZHVsZSBjaGFuZ2VzLgorICAvLy8gXGFyZyBVbnJvbGxMb29wcyAtIEFsbG93IGxvb3AgdW5yb2xsaW5nLgorICAvLy8gXGFyZyBTaW1wbGlmeUxpYkNhbGxzIC0gQWxsb3cgbGlicmFyeSBjYWxscyB0byBiZSBzaW1wbGlmaWVkLgorICAvLy8gXGFyZyBIYXZlRXhjZXB0aW9ucyAtIFdoZXRoZXIgdGhlIG1vZHVsZSBtYXkgaGF2ZSBjb2RlIHVzaW5nIGV4Y2VwdGlvbnMuCisgIC8vLyBcYXJnIElubGluaW5nUGFzcyAtIFRoZSBpbmxpbmluZyBwYXNzIHRvIHVzZSwgaWYgYW55LCBvciBudWxsLiBUaGlzIHdpbGwKKyAgLy8vIGFsd2F5cyBiZSBhZGRlZCwgZXZlbiBhdCAtTzAuYQorICBzdGF0aWMgaW5saW5lIHZvaWQgY3JlYXRlU3RhbmRhcmRNb2R1bGVQYXNzZXMoUGFzc01hbmFnZXJCYXNlICpQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wdGltaXphdGlvbkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPcHRpbWl6ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVuaXRBdEFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVbnJvbGxMb29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2ltcGxpZnlMaWJDYWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGF2ZUV4Y2VwdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzICpJbmxpbmluZ1Bhc3MpOworCisgIC8vLyBjcmVhdGVTdGFuZGFyZExUT1Bhc3NlcyAtIEFkZCB0aGUgc3RhbmRhcmQgbGlzdCBvZiBtb2R1bGUgcGFzc2VzIHN1aXRhYmxlCisgIC8vLyBmb3IgbGluayB0aW1lIG9wdGltaXphdGlvbi4KKyAgLy8vCisgIC8vLyBJbnRlcm5hbGl6ZSAtIFJ1biB0aGUgaW50ZXJuYWxpemUgcGFzcy4KKyAgLy8vIFJ1bklubGluZXIgLSBVc2UgYSBmdW5jdGlvbiBpbmxpbmluZyBwYXNzLgorICAvLy8gVmVyaWZ5RWFjaCAtIFJ1biB0aGUgdmVyaWZpZXIgYWZ0ZXIgZWFjaCBwYXNzLgorICBzdGF0aWMgaW5saW5lIHZvaWQgY3JlYXRlU3RhbmRhcmRMVE9QYXNzZXMoUGFzc01hbmFnZXJCYXNlICpQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW50ZXJuYWxpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJ1bklubGluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2gpOworCisgIC8vIEltcGxlbWVudGF0aW9ucworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjcmVhdGVTdGFuZGFyZEZ1bmN0aW9uUGFzc2VzKFBhc3NNYW5hZ2VyQmFzZSAqUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wdGltaXphdGlvbkxldmVsKSB7CisgICAgaWYgKE9wdGltaXphdGlvbkxldmVsID4gMCkgeworICAgICAgUE0tPmFkZChjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKSk7CisgICAgICBpZiAoT3B0aW1pemF0aW9uTGV2ZWwgPT0gMSkKKyAgICAgICAgUE0tPmFkZChjcmVhdGVQcm9tb3RlTWVtb3J5VG9SZWdpc3RlclBhc3MoKSk7CisgICAgICBlbHNlCisgICAgICAgIFBNLT5hZGQoY3JlYXRlU2NhbGFyUmVwbEFnZ3JlZ2F0ZXNQYXNzKCkpOworICAgICAgUE0tPmFkZChjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSk7CisgICAgfQorICB9CisKKyAgLy8vIGNyZWF0ZVN0YW5kYXJkTW9kdWxlUGFzc2VzIC0gQWRkIHRoZSBzdGFuZGFyZCBtb2R1bGUgcGFzc2VzLiAgVGhpcyBpcworICAvLy8gZXhwZWN0ZWQgdG8gYmUgcnVuIGFmdGVyIHRoZSBzdGFuZGFyZCBmdW5jdGlvbiBwYXNzZXMuCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjcmVhdGVTdGFuZGFyZE1vZHVsZVBhc3NlcyhQYXNzTWFuYWdlckJhc2UgKlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3B0aW1pemF0aW9uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9wdGltaXplU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVW5pdEF0QVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVucm9sbExvb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaW1wbGlmeUxpYkNhbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXZlRXhjZXB0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3MgKklubGluaW5nUGFzcykgeworICAgIGlmIChPcHRpbWl6YXRpb25MZXZlbCA9PSAwKSB7CisgICAgICBpZiAoSW5saW5pbmdQYXNzKQorICAgICAgICBQTS0+YWRkKElubGluaW5nUGFzcyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChVbml0QXRBVGltZSkgeworICAgICAgUE0tPmFkZChjcmVhdGVHbG9iYWxPcHRpbWl6ZXJQYXNzKCkpOyAgICAgLy8gT3B0aW1pemUgb3V0IGdsb2JhbCB2YXJzCisgICAgICAKKyAgICAgIFBNLT5hZGQoY3JlYXRlSVBTQ0NQUGFzcygpKTsgICAgICAgICAgICAgIC8vIElQIFNDQ1AKKyAgICAgIFBNLT5hZGQoY3JlYXRlRGVhZEFyZ0VsaW1pbmF0aW9uUGFzcygpKTsgIC8vIERlYWQgYXJndW1lbnQgZWxpbWluYXRpb24KKyAgICB9CisgICAgUE0tPmFkZChjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSk7ICAvLyBDbGVhbiB1cCBhZnRlciBJUENQICYgREFFCisgICAgUE0tPmFkZChjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKSk7ICAgICAvLyBDbGVhbiB1cCBhZnRlciBJUENQICYgREFFCisgICAgCisgICAgLy8gU3RhcnQgb2YgQ2FsbEdyYXBoIFNDQyBwYXNzZXMuCisgICAgaWYgKFVuaXRBdEFUaW1lICYmIEhhdmVFeGNlcHRpb25zKQorICAgICAgUE0tPmFkZChjcmVhdGVQcnVuZUVIUGFzcygpKTsgICAgICAgICAgIC8vIFJlbW92ZSBkZWFkIEVIIGluZm8KKyAgICBpZiAoSW5saW5pbmdQYXNzKQorICAgICAgUE0tPmFkZChJbmxpbmluZ1Bhc3MpOworICAgIGlmIChVbml0QXRBVGltZSkKKyAgICAgIFBNLT5hZGQoY3JlYXRlRnVuY3Rpb25BdHRyc1Bhc3MoKSk7ICAgICAgIC8vIFNldCByZWFkb25seS9yZWFkbm9uZSBhdHRycworICAgIGlmIChPcHRpbWl6YXRpb25MZXZlbCA+IDIpCisgICAgICBQTS0+YWRkKGNyZWF0ZUFyZ3VtZW50UHJvbW90aW9uUGFzcygpKTsgICAvLyBTY2FsYXJpemUgdW5pbmxpbmVkIGZuIGFyZ3MKKyAgICAKKyAgICAvLyBTdGFydCBvZiBmdW5jdGlvbiBwYXNzLgorICAgIAorICAgIFBNLT5hZGQoY3JlYXRlU2NhbGFyUmVwbEFnZ3JlZ2F0ZXNQYXNzKCkpOyAgLy8gQnJlYWsgdXAgYWdncmVnYXRlIGFsbG9jYXMKKyAgICBpZiAoU2ltcGxpZnlMaWJDYWxscykKKyAgICAgIFBNLT5hZGQoY3JlYXRlU2ltcGxpZnlMaWJDYWxsc1Bhc3MoKSk7ICAgIC8vIExpYnJhcnkgQ2FsbCBPcHRpbWl6YXRpb25zCisgICAgUE0tPmFkZChjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSk7ICAvLyBDbGVhbnVwIGZvciBzY2FsYXJyZXBsLgorICAgIFBNLT5hZGQoY3JlYXRlSnVtcFRocmVhZGluZ1Bhc3MoKSk7ICAgICAgICAgLy8gVGhyZWFkIGp1bXBzLgorICAgIFBNLT5hZGQoY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAgICAgLy8gTWVyZ2UgJiByZW1vdmUgQkJzCisgICAgUE0tPmFkZChjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSk7ICAvLyBDb21iaW5lIHNpbGx5IHNlcSdzCisgICAgCisgICAgUE0tPmFkZChjcmVhdGVUYWlsQ2FsbEVsaW1pbmF0aW9uUGFzcygpKTsgICAvLyBFbGltaW5hdGUgdGFpbCBjYWxscworICAgIFBNLT5hZGQoY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAgICAgLy8gTWVyZ2UgJiByZW1vdmUgQkJzCisgICAgUE0tPmFkZChjcmVhdGVSZWFzc29jaWF0ZVBhc3MoKSk7ICAgICAgICAgICAvLyBSZWFzc29jaWF0ZSBleHByZXNzaW9ucworICAgIC8vIEV4cGxpY2l0bHkgc2NoZWR1bGUgdGhpcyB0byBlbnN1cmUgdGhhdCBpdCBydW5zIGJlZm9yZSBhbnkgbG9vcCBwYXNzLgorICAgIFBNLT5hZGQobmV3IERvbWluYW5jZUZyb250aWVyKCkpOyAgICAgICAgICAgLy8gQ2FsY3VsYXRlIERvbWluYW5jZSBGcm9udGllcnMKKyAgICBQTS0+YWRkKGNyZWF0ZUxvb3BSb3RhdGVQYXNzKCkpOyAgICAgICAgICAgIC8vIFJvdGF0ZSBMb29wCisgICAgUE0tPmFkZChjcmVhdGVMSUNNUGFzcygpKTsgICAgICAgICAgICAgICAgICAvLyBIb2lzdCBsb29wIGludmFyaWFudHMKKyAgICBQTS0+YWRkKGNyZWF0ZUxvb3BVbnN3aXRjaFBhc3MoT3B0aW1pemVTaXplIHx8IE9wdGltaXphdGlvbkxldmVsIDwgMykpOworICAgIFBNLT5hZGQoY3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCkpOyAgCisgICAgUE0tPmFkZChjcmVhdGVJbmRWYXJTaW1wbGlmeVBhc3MoKSk7ICAgICAgICAvLyBDYW5vbmljYWxpemUgaW5kdmFycworICAgIFBNLT5hZGQoY3JlYXRlTG9vcERlbGV0aW9uUGFzcygpKTsgICAgICAgICAgLy8gRGVsZXRlIGRlYWQgbG9vcHMKKyAgICBpZiAoVW5yb2xsTG9vcHMpCisgICAgICBQTS0+YWRkKGNyZWF0ZUxvb3BVbnJvbGxQYXNzKCkpOyAgICAgICAgICAvLyBVbnJvbGwgc21hbGwgbG9vcHMKKyAgICBQTS0+YWRkKGNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsgIC8vIENsZWFuIHVwIGFmdGVyIHRoZSB1bnJvbGxlcgorICAgIGlmIChPcHRpbWl6YXRpb25MZXZlbCA+IDEpCisgICAgICBQTS0+YWRkKGNyZWF0ZUdWTlBhc3MoKSk7ICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcmVkdW5kYW5jaWVzCisgICAgUE0tPmFkZChjcmVhdGVNZW1DcHlPcHRQYXNzKCkpOyAgICAgICAgICAgICAvLyBSZW1vdmUgbWVtY3B5IC8gZm9ybSBtZW1zZXQKKyAgICBQTS0+YWRkKGNyZWF0ZVNDQ1BQYXNzKCkpOyAgICAgICAgICAgICAgICAgIC8vIENvbnN0YW50IHByb3Agd2l0aCBTQ0NQCisgIAorICAgIC8vIFJ1biBpbnN0Y29tYmluZSBhZnRlciByZWR1bmRhbmN5IGVsaW1pbmF0aW9uIHRvIGV4cGxvaXQgb3Bwb3J0dW5pdGllcworICAgIC8vIG9wZW5lZCB1cCBieSB0aGVtLgorICAgIFBNLT5hZGQoY3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCkpOworICAgIFBNLT5hZGQoY3JlYXRlSnVtcFRocmVhZGluZ1Bhc3MoKSk7ICAgICAgICAgLy8gVGhyZWFkIGp1bXBzCisgICAgUE0tPmFkZChjcmVhdGVEZWFkU3RvcmVFbGltaW5hdGlvblBhc3MoKSk7ICAvLyBEZWxldGUgZGVhZCBzdG9yZXMKKyAgICBQTS0+YWRkKGNyZWF0ZUFnZ3Jlc3NpdmVEQ0VQYXNzKCkpOyAgICAgICAgIC8vIERlbGV0ZSBkZWFkIGluc3RydWN0aW9ucworICAgIFBNLT5hZGQoY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAgICAgLy8gTWVyZ2UgJiByZW1vdmUgQkJzCisKKyAgICBpZiAoVW5pdEF0QVRpbWUpIHsKKyAgICAgIFBNLT5hZGQoY3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MoKSk7IC8vIEdldCByaWQgb2YgZGVhZCBwcm90b3R5cGVzCisgICAgICBQTS0+YWRkKGNyZWF0ZURlYWRUeXBlRWxpbWluYXRpb25QYXNzKCkpOyAvLyBFbGltaW5hdGUgZGVhZCB0eXBlcworCisgICAgICAvLyBHbG9iYWxPcHQgYWxyZWFkeSBkZWxldGVzIGRlYWQgZnVuY3Rpb25zIGFuZCBnbG9iYWxzLCBhdCAtTzMgdHJ5IGEKKyAgICAgIC8vIGxhdGUgcGFzcyBvZiBHbG9iYWxEQ0UuICBJdCBpcyBjYXBhYmxlIG9mIGRlbGV0aW5nIGRlYWQgY3ljbGVzLgorICAgICAgaWYgKE9wdGltaXphdGlvbkxldmVsID4gMikKKyAgICAgICAgUE0tPmFkZChjcmVhdGVHbG9iYWxEQ0VQYXNzKCkpOyAgICAgICAgIC8vIFJlbW92ZSBkZWFkIGZucyBhbmQgZ2xvYmFscy4KKyAgICAKKyAgICAgIGlmIChPcHRpbWl6YXRpb25MZXZlbCA+IDEpCisgICAgICAgIFBNLT5hZGQoY3JlYXRlQ29uc3RhbnRNZXJnZVBhc3MoKSk7ICAgICAgIC8vIE1lcmdlIGR1cCBnbG9iYWwgY29uc3RhbnRzCisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGFkZE9uZVBhc3MoUGFzc01hbmFnZXJCYXNlICpQTSwgUGFzcyAqUCwgYm9vbCBBbmRWZXJpZnkpIHsKKyAgICBQTS0+YWRkKFApOworCisgICAgaWYgKEFuZFZlcmlmeSkKKyAgICAgIFBNLT5hZGQoY3JlYXRlVmVyaWZpZXJQYXNzKCkpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNyZWF0ZVN0YW5kYXJkTFRPUGFzc2VzKFBhc3NNYW5hZ2VyQmFzZSAqUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEludGVybmFsaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSdW5JbmxpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoKSB7CisgICAgLy8gTm93IHRoYXQgY29tcG9zaXRlIGhhcyBiZWVuIGNvbXBpbGVkLCBzY2FuIHRocm91Z2ggdGhlIG1vZHVsZSwgbG9va2luZworICAgIC8vIGZvciBhIG1haW4gZnVuY3Rpb24uICBJZiBtYWluIGlzIGRlZmluZWQsIG1hcmsgYWxsIG90aGVyIGZ1bmN0aW9ucworICAgIC8vIGludGVybmFsLgorICAgIGlmIChJbnRlcm5hbGl6ZSkKKyAgICAgIGFkZE9uZVBhc3MoUE0sIGNyZWF0ZUludGVybmFsaXplUGFzcyh0cnVlKSwgVmVyaWZ5RWFjaCk7CisKKyAgICAvLyBQcm9wYWdhdGUgY29uc3RhbnRzIGF0IGNhbGwgc2l0ZXMgaW50byB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbC4gIFRoaXMKKyAgICAvLyBvcGVucyBvcHBvcnR1bml0aWVzIGZvciBnbG9iYWxvcHQgKGFuZCBpbmxpbmluZykgYnkgc3Vic3RpdHV0aW5nIGZ1bmN0aW9uCisgICAgLy8gcG9pbnRlcnMgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBkaXJlY3QgdXNlcyBvZiBmdW5jdGlvbnMuICAKKyAgICBhZGRPbmVQYXNzKFBNLCBjcmVhdGVJUFNDQ1BQYXNzKCksIFZlcmlmeUVhY2gpOworCisgICAgLy8gTm93IHRoYXQgd2UgaW50ZXJuYWxpemVkIHNvbWUgZ2xvYmFscywgc2VlIGlmIHdlIGNhbiBoYWNrIG9uIHRoZW0hCisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlR2xvYmFsT3B0aW1pemVyUGFzcygpLCBWZXJpZnlFYWNoKTsKKyAgICAKKyAgICAvLyBMaW5raW5nIG1vZHVsZXMgdG9nZXRoZXIgY2FuIGxlYWQgdG8gZHVwbGljYXRlZCBnbG9iYWwgY29uc3RhbnRzLCBvbmx5CisgICAgLy8ga2VlcCBvbmUgY29weSBvZiBlYWNoIGNvbnN0YW50Li4uCisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlQ29uc3RhbnRNZXJnZVBhc3MoKSwgVmVyaWZ5RWFjaCk7CisgICAgCisgICAgLy8gUmVtb3ZlIHVudXNlZCBhcmd1bWVudHMgZnJvbSBmdW5jdGlvbnMuLi4KKyAgICBhZGRPbmVQYXNzKFBNLCBjcmVhdGVEZWFkQXJnRWxpbWluYXRpb25QYXNzKCksIFZlcmlmeUVhY2gpOworCisgICAgLy8gUmVkdWNlIHRoZSBjb2RlIGFmdGVyIGdsb2JhbG9wdCBhbmQgaXBzY2NwLiAgQm90aCBjYW4gb3BlbiB1cCBzaWduaWZpY2FudAorICAgIC8vIHNpbXBsaWZpY2F0aW9uIG9wcG9ydHVuaXRpZXMsIGFuZCBib3RoIGNhbiBwcm9wYWdhdGUgZnVuY3Rpb25zIHRocm91Z2gKKyAgICAvLyBmdW5jdGlvbiBwb2ludGVycy4gIFdoZW4gdGhpcyBoYXBwZW5zLCB3ZSBvZnRlbiBoYXZlIHRvIHJlc29sdmUgdmFyYXJncworICAgIC8vIGNhbGxzLCBldGMsIHNvIGxldCBpbnN0Y29tYmluZSBkbyB0aGlzLgorICAgIGFkZE9uZVBhc3MoUE0sIGNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpLCBWZXJpZnlFYWNoKTsKKworICAgIC8vIElubGluZSBzbWFsbCBmdW5jdGlvbnMKKyAgICBpZiAoUnVuSW5saW5lcikKKyAgICAgIGFkZE9uZVBhc3MoUE0sIGNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzKCksIFZlcmlmeUVhY2gpOworCisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlUHJ1bmVFSFBhc3MoKSwgVmVyaWZ5RWFjaCk7ICAgLy8gUmVtb3ZlIGRlYWQgRUggaW5mby4KKyAgICAvLyBPcHRpbWl6ZSBnbG9iYWxzIGFnYWluIGlmIHdlIHJhbiB0aGUgaW5saW5lci4KKyAgICBpZiAoUnVuSW5saW5lcikKKyAgICAgIGFkZE9uZVBhc3MoUE0sIGNyZWF0ZUdsb2JhbE9wdGltaXplclBhc3MoKSwgVmVyaWZ5RWFjaCk7CisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlR2xvYmFsRENFUGFzcygpLCBWZXJpZnlFYWNoKTsgLy8gUmVtb3ZlIGRlYWQgZnVuY3Rpb25zLgorCisgICAgLy8gSWYgd2UgZGlkbid0IGRlY2lkZSB0byBpbmxpbmUgYSBmdW5jdGlvbiwgY2hlY2sgdG8gc2VlIGlmIHdlIGNhbgorICAgIC8vIHRyYW5zZm9ybSBpdCB0byBwYXNzIGFyZ3VtZW50cyBieSB2YWx1ZSBpbnN0ZWFkIG9mIGJ5IHJlZmVyZW5jZS4KKyAgICBhZGRPbmVQYXNzKFBNLCBjcmVhdGVBcmd1bWVudFByb21vdGlvblBhc3MoKSwgVmVyaWZ5RWFjaCk7CisKKyAgICAvLyBUaGUgSVBPIHBhc3NlcyBtYXkgbGVhdmUgY3J1ZnQgYXJvdW5kLiAgQ2xlYW4gdXAgYWZ0ZXIgdGhlbS4KKyAgICBhZGRPbmVQYXNzKFBNLCBjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSwgVmVyaWZ5RWFjaCk7CisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlSnVtcFRocmVhZGluZ1Bhc3MoKSwgVmVyaWZ5RWFjaCk7CisgICAgLy8gQnJlYWsgdXAgYWxsb2NhcworICAgIGFkZE9uZVBhc3MoUE0sIGNyZWF0ZVNjYWxhclJlcGxBZ2dyZWdhdGVzUGFzcygpLCBWZXJpZnlFYWNoKTsKKworICAgIC8vIFJ1biBhIGZldyBBQSBkcml2ZW4gb3B0aW1pemF0aW9ucyBoZXJlIGFuZCBub3csIHRvIGNsZWFudXAgdGhlIGNvZGUuCisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlRnVuY3Rpb25BdHRyc1Bhc3MoKSwgVmVyaWZ5RWFjaCk7IC8vIEFkZCBub2NhcHR1cmUuCisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlR2xvYmFsc01vZFJlZlBhc3MoKSwgVmVyaWZ5RWFjaCk7IC8vIElQIGFsaWFzIGFuYWx5c2lzLgorCisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlTElDTVBhc3MoKSwgVmVyaWZ5RWFjaCk7ICAgICAgLy8gSG9pc3QgbG9vcCBpbnZhcmlhbnRzLgorICAgIGFkZE9uZVBhc3MoUE0sIGNyZWF0ZUdWTlBhc3MoKSwgVmVyaWZ5RWFjaCk7ICAgICAgIC8vIFJlbW92ZSByZWR1bmRhbmNpZXMuCisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlTWVtQ3B5T3B0UGFzcygpLCBWZXJpZnlFYWNoKTsgLy8gUmVtb3ZlIGRlYWQgbWVtY3B5cy4KKyAgICAvLyBOdWtlIGRlYWQgc3RvcmVzLgorICAgIGFkZE9uZVBhc3MoUE0sIGNyZWF0ZURlYWRTdG9yZUVsaW1pbmF0aW9uUGFzcygpLCBWZXJpZnlFYWNoKTsKKworICAgIC8vIENsZWFudXAgYW5kIHNpbXBsaWZ5IHRoZSBjb2RlIGFmdGVyIHRoZSBzY2FsYXIgb3B0aW1pemF0aW9ucy4KKyAgICBhZGRPbmVQYXNzKFBNLCBjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSwgVmVyaWZ5RWFjaCk7CisKKyAgICBhZGRPbmVQYXNzKFBNLCBjcmVhdGVKdW1wVGhyZWFkaW5nUGFzcygpLCBWZXJpZnlFYWNoKTsKKyAgICAKKyAgICAvLyBEZWxldGUgYmFzaWMgYmxvY2tzLCB3aGljaCBvcHRpbWl6YXRpb24gcGFzc2VzIG1heSBoYXZlIGtpbGxlZC4KKyAgICBhZGRPbmVQYXNzKFBNLCBjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKSwgVmVyaWZ5RWFjaCk7CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIG9wdGltaXplZCB0aGUgcHJvZ3JhbSwgZGlzY2FyZCB1bnJlYWNoYWJsZSBmdW5jdGlvbnMuCisgICAgYWRkT25lUGFzcyhQTSwgY3JlYXRlR2xvYmFsRENFUGFzcygpLCBWZXJpZnlFYWNoKTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N0cmluZ1Bvb2wuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N0cmluZ1Bvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTA1ZTBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3RyaW5nUG9vbC5oCkBAIC0wLDAgKzEsMTM5IEBACisvLz09PS0tIFN0cmluZ1Bvb2wuaCAtIEludGVybmVkIHN0cmluZyBwb29sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBhbiBpbnRlcm5lZCBzdHJpbmcgcG9vbCwgd2hpY2ggaGVscHMgcmVkdWNlIHRoZSBjb3N0IG9mCisvLyBzdHJpbmdzIGJ5IHVzaW5nIHRoZSBzYW1lIHN0b3JhZ2UgZm9yIGlkZW50aWNhbCBzdHJpbmdzLgorLy8KKy8vIFRvIGludGVybiBhIHN0cmluZzoKKy8vCisvLyAgIFN0cmluZ1Bvb2wgUG9vbDsKKy8vICAgUG9vbGVkU3RyaW5nUHRyIFN0ciA9IFBvb2wuaW50ZXJuKCJ3YWtrYSB3YWtrYSIpOworLy8KKy8vIFRvIHVzZSB0aGUgdmFsdWUgb2YgYW4gaW50ZXJuZWQgc3RyaW5nLCB1c2Ugb3BlcmF0b3IgYm9vbCBhbmQgb3BlcmF0b3IqOgorLy8KKy8vICAgaWYgKFN0cikKKy8vICAgICBjZXJyIDw8ICJ0aGUgc3RyaW5nIGlzIiA8PCAqU3RyIDw8ICJcbiI7CisvLworLy8gUG9vbGVkIHN0cmluZ3MgYXJlIGltbXV0YWJsZSwgYnV0IHlvdSBjYW4gY2hhbmdlIGEgUG9vbGVkU3RyaW5nUHRyIHRvIHBvaW50CisvLyB0byBhbm90aGVyIGluc3RhbmNlLiBTbyB0aGF0IGludGVybmVkIHN0cmluZ3MgY2FuIGV2ZW50dWFsbHkgYmUgZnJlZWQsCisvLyBzdHJpbmdzIGluIHRoZSBzdHJpbmcgcG9vbCBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgKGF1dG9tYXRpY2FsbHkpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1NUUklOR1BPT0xfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU1RSSU5HUE9PTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIFBvb2xlZFN0cmluZ1B0cjsKKworICAvLy8gU3RyaW5nUG9vbCAtIEFuIGludGVybmVkIHN0cmluZyBwb29sLiBVc2UgdGhlIGludGVybiBtZXRob2QgdG8gYWRkIGEKKyAgLy8vIHN0cmluZy4gU3RyaW5ncyBhcmUgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IGFzIFBvb2xlZFN0cmluZ1B0cnMgYXJlCisgIC8vLyBkZXN0cm95ZWQuCisgIGNsYXNzIFN0cmluZ1Bvb2wgeworICAgIC8vLyBQb29sZWRTdHJpbmcgLSBUaGlzIGlzIHRoZSB2YWx1ZSBvZiBhbiBlbnRyeSBpbiB0aGUgcG9vbCdzIGludGVybmluZworICAgIC8vLyB0YWJsZS4KKyAgICBzdHJ1Y3QgUG9vbGVkU3RyaW5nIHsKKyAgICAgIFN0cmluZ1Bvb2wgKlBvb2w7ICAvLy88IFNvIHRoZSBzdHJpbmcgY2FuIHJlbW92ZSBpdHNlbGYuCisgICAgICB1bnNpZ25lZCBSZWZjb3VudDsgLy8vPCBOdW1iZXIgb2YgcmVmZXJlbmNpbmcgUG9vbGVkU3RyaW5nUHRycy4KKworICAgIHB1YmxpYzoKKyAgICAgIFBvb2xlZFN0cmluZygpIDogUG9vbCgwKSwgUmVmY291bnQoMCkgeyB9CisgICAgfTsKKworICAgIGZyaWVuZCBjbGFzcyBQb29sZWRTdHJpbmdQdHI7CisKKyAgICB0eXBlZGVmIFN0cmluZ01hcDxQb29sZWRTdHJpbmc+IHRhYmxlX3Q7CisgICAgdHlwZWRlZiBTdHJpbmdNYXBFbnRyeTxQb29sZWRTdHJpbmc+IGVudHJ5X3Q7CisgICAgdGFibGVfdCBJbnRlcm5UYWJsZTsKKworICBwdWJsaWM6CisgICAgU3RyaW5nUG9vbCgpOworICAgIH5TdHJpbmdQb29sKCk7CisKKyAgICAvLy8gaW50ZXJuIC0gQWRkcyBhIHN0cmluZyB0byB0aGUgcG9vbCBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZS1jb3VudGVkCisgICAgLy8vIHBvaW50ZXIgdG8gaXQuIE5vIGFkZGl0aW9uYWwgbWVtb3J5IGlzIGFsbG9jYXRlZCBpZiB0aGUgc3RyaW5nIGFscmVhZHkKKyAgICAvLy8gZXhpc3RzIGluIHRoZSBwb29sLgorICAgIFBvb2xlZFN0cmluZ1B0ciBpbnRlcm4oU3RyaW5nUmVmIFN0cik7CisKKyAgICAvLy8gZW1wdHkgLSBDaGVja3Mgd2hldGhlciB0aGUgcG9vbCBpcyBlbXB0eS4gUmV0dXJucyB0cnVlIGlmIHNvLgorICAgIC8vLworICAgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gSW50ZXJuVGFibGUuZW1wdHkoKTsgfQorICB9OworCisgIC8vLyBQb29sZWRTdHJpbmdQdHIgLSBBIHBvaW50ZXIgdG8gYW4gaW50ZXJuZWQgc3RyaW5nLiBVc2Ugb3BlcmF0b3IgYm9vbCB0bworICAvLy8gdGVzdCB3aGV0aGVyIHRoZSBwb2ludGVyIGlzIHZhbGlkLCBhbmQgb3BlcmF0b3IgKiB0byBnZXQgdGhlIHN0cmluZyBpZiBzby4KKyAgLy8vIFRoaXMgaXMgYSBsaWdodHdlaWdodCB2YWx1ZSBjbGFzcyB3aXRoIHN0b3JhZ2UgcmVxdWlyZW1lbnRzIGVxdWl2YWxlbnQgdG8KKyAgLy8vIGEgc2luZ2xlIHBvaW50ZXIsIGJ1dCBpdCBkb2VzIGhhdmUgcmVmZXJlbmNlLWNvdW50aW5nIG92ZXJoZWFkIHdoZW4KKyAgLy8vIGNvcGllZC4KKyAgY2xhc3MgUG9vbGVkU3RyaW5nUHRyIHsKKyAgICB0eXBlZGVmIFN0cmluZ1Bvb2w6OmVudHJ5X3QgZW50cnlfdDsKKyAgICBlbnRyeV90ICpTOworCisgIHB1YmxpYzoKKyAgICBQb29sZWRTdHJpbmdQdHIoKSA6IFMoMCkge30KKworICAgIGV4cGxpY2l0IFBvb2xlZFN0cmluZ1B0cihlbnRyeV90ICpFKSA6IFMoRSkgeworICAgICAgaWYgKFMpICsrUy0+Z2V0VmFsdWUoKS5SZWZjb3VudDsKKyAgICB9CisKKyAgICBQb29sZWRTdHJpbmdQdHIoY29uc3QgUG9vbGVkU3RyaW5nUHRyICZUaGF0KSA6IFMoVGhhdC5TKSB7CisgICAgICBpZiAoUykgKytTLT5nZXRWYWx1ZSgpLlJlZmNvdW50OworICAgIH0KKworICAgIFBvb2xlZFN0cmluZ1B0ciAmb3BlcmF0b3I9KGNvbnN0IFBvb2xlZFN0cmluZ1B0ciAmVGhhdCkgeworICAgICAgaWYgKFMgIT0gVGhhdC5TKSB7CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIFMgPSBUaGF0LlM7CisgICAgICAgIGlmIChTKSArK1MtPmdldFZhbHVlKCkuUmVmY291bnQ7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIGlmICghUykKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKC0tUy0+Z2V0VmFsdWUoKS5SZWZjb3VudCA9PSAwKSB7CisgICAgICAgIFMtPmdldFZhbHVlKCkuUG9vbC0+SW50ZXJuVGFibGUucmVtb3ZlKFMpOworICAgICAgICBTLT5EZXN0cm95KCk7CisgICAgICB9CisgICAgICBTID0gMDsKKyAgICB9CisKKyAgICB+UG9vbGVkU3RyaW5nUHRyKCkgeyBjbGVhcigpOyB9CisKKyAgICBpbmxpbmUgY29uc3QgY2hhciAqYmVnaW4oKSBjb25zdCB7CisgICAgICBhc3NlcnQoKnRoaXMgJiYgIkF0dGVtcHQgdG8gZGVyZWZlcmVuY2UgZW1wdHkgUG9vbGVkU3RyaW5nUHRyISIpOworICAgICAgcmV0dXJuIFMtPmdldEtleURhdGEoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgY2hhciAqZW5kKCkgY29uc3QgeworICAgICAgYXNzZXJ0KCp0aGlzICYmICJBdHRlbXB0IHRvIGRlcmVmZXJlbmNlIGVtcHR5IFBvb2xlZFN0cmluZ1B0ciEiKTsKKyAgICAgIHJldHVybiBTLT5nZXRLZXlEYXRhKCkgKyBTLT5nZXRLZXlMZW5ndGgoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgqdGhpcyAmJiAiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBlbXB0eSBQb29sZWRTdHJpbmdQdHIhIik7CisgICAgICByZXR1cm4gUy0+Z2V0S2V5TGVuZ3RoKCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IGNoYXIgKm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGJlZ2luKCk7IH0KKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIFMgIT0gMDsgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQb29sZWRTdHJpbmdQdHIgJlRoYXQpIHsgcmV0dXJuIFMgPT0gVGhhdC5TOyB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQb29sZWRTdHJpbmdQdHIgJlRoYXQpIHsgcmV0dXJuIFMgIT0gVGhhdC5TOyB9CisgIH07CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3lzdGVtVXRpbHMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N5c3RlbVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkODNmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N5c3RlbVV0aWxzLmgKQEAgLTAsMCArMSw0NCBAQAorLy89PT0tIFN5c3RlbVV0aWxzLmggLSBVdGlsaXRpZXMgdG8gZG8gbG93LWxldmVsIHN5c3RlbSBzdHVmZiAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHVzZWQgdG8gZG8gYSB2YXJpZXR5IG9mIGxvdy1sZXZlbCwgb2Z0ZW4KKy8vIHN5c3RlbS1zcGVjaWZpYywgdGFza3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU1lTVEVNVVRJTFNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU1lTVEVNVVRJTFNfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIHJhd19vc3RyZWFtOworICBuYW1lc3BhY2Ugc3lzIHsgY2xhc3MgUGF0aDsgfQorCisvLy8gRGV0ZXJtaW5lIGlmIHRoZSByYXdfb3N0cmVhbSBwcm92aWRlZCBpcyBjb25uZWN0ZWQgdG8gdGhlIG91dHMoKSBhbmQKKy8vLyBkaXNwbGF5ZWQgb3Igbm90ICh0byBhIGNvbnNvbGUgd2luZG93KS4gSWYgc28sIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlCisvLy8gYWR2aXNpbmcgYWdhaW5zdCBkaXNwbGF5IG9mIGJpdGNvZGUgYW5kIHJldHVybiB0cnVlLiBPdGhlcndpc2UganVzdCByZXR1cm4KKy8vLyBmYWxzZQorLy8vIEBicmllZiBDaGVjayBmb3Igb3V0cHV0IHdyaXR0ZW4gdG8gYSBjb25zb2xlCitib29sIENoZWNrQml0Y29kZU91dHB1dFRvQ29uc29sZSgKKyAgcmF3X29zdHJlYW0gJnN0cmVhbV90b19jaGVjaywgLy8vPCBUaGUgc3RyZWFtIHRvIGJlIGNoZWNrZWQKKyAgYm9vbCBwcmludF93YXJuaW5nID0gdHJ1ZSAgICAgLy8vPCBDb250cm9sIHdoZXRoZXIgd2FybmluZ3MgYXJlIHByaW50ZWQKKyk7CisKKy8vLyBGaW5kRXhlY3V0YWJsZSAtIEZpbmQgYSBuYW1lZCBleGVjdXRhYmxlLCBnaXZpbmcgdGhlIGFyZ3ZbMF0gb2YgcHJvZ3JhbQorLy8vIGJlaW5nIGV4ZWN1dGVkLiBUaGlzIGFsbG93cyB1cyB0byBmaW5kIGFub3RoZXIgTExWTSB0b29sIGlmIGl0IGlzIGJ1aWx0IGluCisvLy8gdGhlIHNhbWUgZGlyZWN0b3J5LiAgSWYgdGhlIGV4ZWN1dGFibGUgY2Fubm90IGJlIGZvdW5kLCByZXR1cm4gYW4KKy8vLyBlbXB0eSBzdHJpbmcuCisvLy8gQGJyaWVmIEZpbmQgYSBuYW1lZCBleGVjdXRhYmxlLgorc3lzOjpQYXRoIEZpbmRFeGVjdXRhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nICZFeGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkFyZ3YwLCB2b2lkICpNYWluQWRkcik7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0Rm9sZGVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJnZXRGb2xkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRmMzVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0Rm9sZGVyLmgKQEAgLTAsMCArMSwyNjQgQEAKKy8vPT09PS0tIGxsdm0vU3VwcG9ydC9UYXJnZXRGb2xkZXIuaCAtIENvbnN0YW50IGZvbGRpbmcgaGVscGVyIC0qLSBDKysgLSotPT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFRhcmdldEZvbGRlciBjbGFzcywgYSBoZWxwZXIgZm9yIElSQnVpbGRlci4KKy8vIEl0IHByb3ZpZGVzIElSQnVpbGRlciB3aXRoIGEgc2V0IG9mIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGNvbnN0YW50cyB3aXRoCisvLyB0YXJnZXQgZGVwZW5kZW50IGZvbGRpbmcsIGluIGFkZGl0aW9uIHRvIHRoZSBzYW1lIHRhcmdldC1pbmRlcGVuZGVudAorLy8gZm9sZGluZyB0aGF0IHRoZSBDb25zdGFudEZvbGRlciBjbGFzcyBwcm92aWRlcy4gIEZvciBnZW5lcmFsIGNvbnN0YW50CisvLyBjcmVhdGlvbiBhbmQgZm9sZGluZywgdXNlIENvbnN0YW50RXhwciBhbmQgdGhlIHJvdXRpbmVzIGluCisvLyBsbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RBUkdFVEZPTERFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9UQVJHRVRGT0xERVJfSAorCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFRhcmdldERhdGE7CisKKy8vLyBUYXJnZXRGb2xkZXIgLSBDcmVhdGUgY29uc3RhbnRzIHdpdGggdGFyZ2V0IGRlcGVuZGVudCBmb2xkaW5nLgorY2xhc3MgVGFyZ2V0Rm9sZGVyIHsKKyAgY29uc3QgVGFyZ2V0RGF0YSAqVEQ7CisKKyAgLy8vIEZvbGQgLSBGb2xkIHRoZSBjb25zdGFudCB1c2luZyB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgIENvbnN0YW50ICpGb2xkKENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KEMpKQorICAgICAgaWYgKENvbnN0YW50ICpDRiA9IENvbnN0YW50Rm9sZENvbnN0YW50RXhwcmVzc2lvbihDRSwgVEQpKQorICAgICAgICByZXR1cm4gQ0Y7CisgICAgcmV0dXJuIEM7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBUYXJnZXRGb2xkZXIoY29uc3QgVGFyZ2V0RGF0YSAqVGhlVEQpIDogVEQoVGhlVEQpIHt9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEJpbmFyeSBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZUFkZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRBZGQoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlTlNXQWRkKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldE5TV0FkZChMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVOVVdBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0TlVXQWRkKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0RkFkZChMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVTdWIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0U3ViKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZU5TV1N1YihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXROU1dTdWIoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlTlVXU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldE5VV1N1YihMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZTdWIoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldE11bChMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVOU1dNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0TlNXTXVsKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZU5VV011bChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXROVVdNdWwoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlRk11bChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRGTXVsKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVVEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0VURpdihMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVTRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFNEaXYoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlRXhhY3RTRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEV4YWN0U0RpdihMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZEaXYoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlVVJlbShDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRVUmVtKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVNSZW0oQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0U1JlbShMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZSZW0oTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlU2hsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFNobChMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVMU2hyKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldExTaHIoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlQVNocihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRBU2hyKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUFuZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRBbmQoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlT3IoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0T3IoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlWG9yKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFhvcihMSFMsIFJIUykpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUJpbk9wKEluc3RydWN0aW9uOjpCaW5hcnlPcHMgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0KE9wYywgTEhTLCBSSFMpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBVbmFyeSBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZU5lZyhDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0TmVnKEMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlTlNXTmVnKENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXROU1dOZWcoQykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVOVVdOZWcoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldE5VV05lZyhDKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZOZWcoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZOZWcoQykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVOb3QoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldE5vdChDKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWVtb3J5IEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlR2V0RWxlbWVudFB0cihDb25zdGFudCAqQywgQ29uc3RhbnQqIGNvbnN0ICpJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoQywgSWR4TGlzdCwgTnVtSWR4KSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUdldEVsZW1lbnRQdHIoQ29uc3RhbnQgKkMsIFZhbHVlKiBjb25zdCAqSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKEMsIElkeExpc3QsIE51bUlkeCkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihDb25zdGFudCAqQywgQ29uc3RhbnQqIGNvbnN0ICpJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKEMsIElkeExpc3QsIE51bUlkeCkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoQ29uc3RhbnQgKkMsIFZhbHVlKiBjb25zdCAqSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihDLCBJZHhMaXN0LCBOdW1JZHgpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDYXN0L0NvbnZlcnNpb24gT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpDYXN0T3BzIE9wLCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRDYXN0KE9wLCBDLCBEZXN0VHkpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlSW50Q2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRJbnRlZ2VyQ2FzdChDLCBEZXN0VHksIGlzU2lnbmVkKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVBvaW50ZXJDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRQb2ludGVyQ2FzdChDLCBEZXN0VHkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVCaXRDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgQywgRGVzdFR5KTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlSW50VG9QdHIoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpJbnRUb1B0ciwgQywgRGVzdFR5KTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlUHRyVG9JbnQoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpQdHJUb0ludCwgQywgRGVzdFR5KTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlWkV4dE9yQml0Q2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRaRXh0T3JCaXRDYXN0KEMsIERlc3RUeSkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVTRXh0T3JCaXRDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICBpZiAoQy0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBDOyAvLyBhdm9pZCBjYWxsaW5nIEZvbGQKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFNFeHRPckJpdENhc3QoQywgRGVzdFR5KSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVRydW5jT3JCaXRDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICBpZiAoQy0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBDOyAvLyBhdm9pZCBjYWxsaW5nIEZvbGQKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFRydW5jT3JCaXRDYXN0KEMsIERlc3RUeSkpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENvbXBhcmUgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVJQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQLCBDb25zdGFudCAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRDb21wYXJlKFAsIExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZDbXAoQ21wSW5zdDo6UHJlZGljYXRlIFAsIENvbnN0YW50ICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldENvbXBhcmUoUCwgTEhTLCBSSFMpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBPdGhlciBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNlbGVjdChDb25zdGFudCAqQywgQ29uc3RhbnQgKlRydWUsIENvbnN0YW50ICpGYWxzZSkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0U2VsZWN0KEMsIFRydWUsIEZhbHNlKSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlRXh0cmFjdEVsZW1lbnQoQ29uc3RhbnQgKlZlYywgQ29uc3RhbnQgKklkeCkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0RXh0cmFjdEVsZW1lbnQoVmVjLCBJZHgpKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVJbnNlcnRFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpOZXdFbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEluc2VydEVsZW1lbnQoVmVjLCBOZXdFbHQsIElkeCkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNodWZmbGVWZWN0b3IoQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpNYXNrKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRTaHVmZmxlVmVjdG9yKFYxLCBWMiwgTWFzaykpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUV4dHJhY3RWYWx1ZShDb25zdGFudCAqQWdnLCBjb25zdCB1bnNpZ25lZCAqSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEV4dHJhY3RWYWx1ZShBZ2csIElkeExpc3QsIE51bUlkeCkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluc2VydFZhbHVlKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqSWR4TGlzdCwgdW5zaWduZWQgTnVtSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRJbnNlcnRWYWx1ZShBZ2csIFZhbCwgSWR4TGlzdCwgTnVtSWR4KSk7CisgIH0KK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UaW1lci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU5MTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGltZXIuaApAQCAtMCwwICsxLDE5NCBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvVGltZXIuaCAtIEludGVydmFsIFRpbWluZyBTdXBwb3J0IC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aHJlZSBjbGFzc2VzOiBUaW1lciwgVGltZVJlZ2lvbiwgYW5kIFRpbWVyR3JvdXAsCisvLyBkb2N1bWVudGVkIGJlbG93LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RJTUVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RJTUVSX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFRpbWVyOworY2xhc3MgVGltZXJHcm91cDsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBUaW1lUmVjb3JkIHsKKyAgZG91YmxlIFdhbGxUaW1lOyAgICAgICAvLyBXYWxsIGNsb2NrIHRpbWUgZWxhcHNlZCBpbiBzZWNvbmRzCisgIGRvdWJsZSBVc2VyVGltZTsgICAgICAgLy8gVXNlciB0aW1lIGVsYXBzZWQKKyAgZG91YmxlIFN5c3RlbVRpbWU7ICAgICAvLyBTeXN0ZW0gdGltZSBlbGFwc2VkCisgIHNzaXplX3QgTWVtVXNlZDsgICAgICAgLy8gTWVtb3J5IGFsbG9jYXRlZCAoaW4gYnl0ZXMpCitwdWJsaWM6CisgIFRpbWVSZWNvcmQoKSA6IFdhbGxUaW1lKDApLCBVc2VyVGltZSgwKSwgU3lzdGVtVGltZSgwKSwgTWVtVXNlZCgwKSB7fQorICAKKyAgLy8vIGdldEN1cnJlbnRUaW1lIC0gR2V0IHRoZSBjdXJyZW50IHRpbWUgYW5kIG1lbW9yeSB1c2FnZS4gIElmIFN0YXJ0IGlzIHRydWUKKyAgLy8vIHdlIGdldCB0aGUgbWVtb3J5IHVzYWdlIGJlZm9yZSB0aGUgdGltZSwgb3RoZXJ3aXNlIHdlIGdldCB0aW1lIGJlZm9yZQorICAvLy8gbWVtb3J5IHVzYWdlLiAgVGhpcyBtYXR0ZXJzIGlmIHRoZSB0aW1lIHRvIGdldCB0aGUgbWVtb3J5IHVzYWdlIGlzCisgIC8vLyBzaWduaWZpY2FudCBhbmQgc2hvdWxkbid0IGJlIGNvdW50ZWQgYXMgcGFydCBvZiBhIGR1cmF0aW9uLgorICBzdGF0aWMgVGltZVJlY29yZCBnZXRDdXJyZW50VGltZShib29sIFN0YXJ0ID0gdHJ1ZSk7CisgIAorICBkb3VibGUgZ2V0UHJvY2Vzc1RpbWUoKSBjb25zdCB7IHJldHVybiBVc2VyVGltZStTeXN0ZW1UaW1lOyB9CisgIGRvdWJsZSBnZXRVc2VyVGltZSgpIGNvbnN0IHsgcmV0dXJuIFVzZXJUaW1lOyB9CisgIGRvdWJsZSBnZXRTeXN0ZW1UaW1lKCkgY29uc3QgeyByZXR1cm4gU3lzdGVtVGltZTsgfQorICBkb3VibGUgZ2V0V2FsbFRpbWUoKSBjb25zdCB7IHJldHVybiBXYWxsVGltZTsgfQorICBzc2l6ZV90IGdldE1lbVVzZWQoKSBjb25zdCB7IHJldHVybiBNZW1Vc2VkOyB9CisgIAorICAKKyAgLy8gb3BlcmF0b3I8IC0gQWxsb3cgc29ydGluZy4KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVGltZVJlY29yZCAmVCkgY29uc3QgeworICAgIC8vIFNvcnQgYnkgV2FsbCBUaW1lIGVsYXBzZWQsIGFzIGl0IGlzIHRoZSBvbmx5IHRoaW5nIHJlYWxseSBhY2N1cmF0ZQorICAgIHJldHVybiBXYWxsVGltZSA8IFQuV2FsbFRpbWU7CisgIH0KKyAgCisgIHZvaWQgb3BlcmF0b3IrPShjb25zdCBUaW1lUmVjb3JkICZSSFMpIHsKKyAgICBXYWxsVGltZSAgICs9IFJIUy5XYWxsVGltZTsKKyAgICBVc2VyVGltZSAgICs9IFJIUy5Vc2VyVGltZTsKKyAgICBTeXN0ZW1UaW1lICs9IFJIUy5TeXN0ZW1UaW1lOworICAgIE1lbVVzZWQgICAgKz0gUkhTLk1lbVVzZWQ7CisgIH0KKyAgdm9pZCBvcGVyYXRvci09KGNvbnN0IFRpbWVSZWNvcmQgJlJIUykgeworICAgIFdhbGxUaW1lICAgLT0gUkhTLldhbGxUaW1lOworICAgIFVzZXJUaW1lICAgLT0gUkhTLlVzZXJUaW1lOworICAgIFN5c3RlbVRpbWUgLT0gUkhTLlN5c3RlbVRpbWU7CisgICAgTWVtVXNlZCAgICAtPSBSSFMuTWVtVXNlZDsKKyAgfQorICAKKyAgLy8vIHByaW50IC0gUHJpbnQgdGhlIGN1cnJlbnQgdGltZXIgdG8gc3RhbmRhcmQgZXJyb3IsIGFuZCByZXNldCB0aGUgIlN0YXJ0ZWQiCisgIC8vLyBmbGFnLgorICB2b2lkIHByaW50KGNvbnN0IFRpbWVSZWNvcmQgJlRvdGFsLCByYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKyAgCisvLy8gVGltZXIgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGJldHdlZW4KKy8vLyBpbnZvY2F0aW9ucyBvZiBpdHMgc3RhcnRUaW1lcigpL3N0b3BUaW1lcigpIG1ldGhvZHMuICBHaXZlbiBhcHByb3ByaWF0ZSBPUworLy8vIHN1cHBvcnQgaXQgY2FuIGFsc28ga2VlcCB0cmFjayBvZiB0aGUgUlNTIG9mIHRoZSBwcm9ncmFtIGF0IHZhcmlvdXMgcG9pbnRzLgorLy8vIEJ5IGRlZmF1bHQsIHRoZSBUaW1lciB3aWxsIHByaW50IHRoZSBhbW91bnQgb2YgdGltZSBpdCBoYXMgY2FwdHVyZWQgdG8KKy8vLyBzdGFuZGFyZCBlcnJvciB3aGVuIHRoZSBsYXN0ZXIgdGltZXIgaXMgZGVzdHJveWVkLCBvdGhlcndpc2UgaXQgaXMgcHJpbnRlZAorLy8vIHdoZW4gaXRzIFRpbWVyR3JvdXAgaXMgZGVzdHJveWVkLiAgVGltZXJzIGRvIG5vdCBwcmludCB0aGVpciBpbmZvcm1hdGlvbgorLy8vIGlmIHRoZXkgYXJlIG5ldmVyIHN0YXJ0ZWQuCisvLy8KK2NsYXNzIFRpbWVyIHsKKyAgVGltZVJlY29yZCBUaW1lOworICBzdGQ6OnN0cmluZyBOYW1lOyAgICAgIC8vIFRoZSBuYW1lIG9mIHRoaXMgdGltZSB2YXJpYWJsZS4KKyAgYm9vbCBTdGFydGVkOyAgICAgICAgICAvLyBIYXMgdGhpcyB0aW1lIHZhcmlhYmxlIGV2ZXIgYmVlbiBzdGFydGVkPworICBUaW1lckdyb3VwICpURzsgICAgICAgIC8vIFRoZSBUaW1lckdyb3VwIHRoaXMgVGltZXIgaXMgaW4uCisgIAorICBUaW1lciAqKlByZXYsICpOZXh0OyAgIC8vIERvdWJseSBsaW5rZWQgbGlzdCBvZiB0aW1lcnMgaW4gdGhlIGdyb3VwLgorcHVibGljOgorICBleHBsaWNpdCBUaW1lcihTdHJpbmdSZWYgTikgOiBURygwKSB7IGluaXQoTik7IH0KKyAgVGltZXIoU3RyaW5nUmVmIE4sIFRpbWVyR3JvdXAgJnRnKSA6IFRHKDApIHsgaW5pdChOLCB0Zyk7IH0KKyAgVGltZXIoY29uc3QgVGltZXIgJlJIUykgOiBURygwKSB7CisgICAgYXNzZXJ0KFJIUy5URyA9PSAwICYmICJDYW4gb25seSBjb3B5IHVuaW5pdGlhbGl6ZWQgdGltZXJzIik7CisgIH0KKyAgY29uc3QgVGltZXIgJm9wZXJhdG9yPShjb25zdCBUaW1lciAmVCkgeworICAgIGFzc2VydChURyA9PSAwICYmIFQuVEcgPT0gMCAmJiAiQ2FuIG9ubHkgYXNzaWduIHVuaW5pdCB0aW1lcnMiKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgflRpbWVyKCk7CisKKyAgLy8gQ3JlYXRlIGFuIHVuaW5pdGlhbGl6ZWQgdGltZXIsIGNsaWVudCBtdXN0IHVzZSAnaW5pdCcuCisgIGV4cGxpY2l0IFRpbWVyKCkgOiBURygwKSB7fQorICB2b2lkIGluaXQoU3RyaW5nUmVmIE4pOworICB2b2lkIGluaXQoU3RyaW5nUmVmIE4sIFRpbWVyR3JvdXAgJnRnKTsKKyAgCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBib29sIGlzSW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBURyAhPSAwOyB9CisgIAorICAvLy8gc3RhcnRUaW1lciAtIFN0YXJ0IHRoZSB0aW1lciBydW5uaW5nLiAgVGltZSBiZXR3ZWVuIGNhbGxzIHRvCisgIC8vLyBzdGFydFRpbWVyL3N0b3BUaW1lciBpcyBjb3VudGVkIGJ5IHRoZSBUaW1lciBjbGFzcy4gIE5vdGUgdGhhdCB0aGVzZSBjYWxscworICAvLy8gbXVzdCBiZSBjb3JyZWN0bHkgcGFpcmVkLgorICAvLy8KKyAgdm9pZCBzdGFydFRpbWVyKCk7CisKKyAgLy8vIHN0b3BUaW1lciAtIFN0b3AgdGhlIHRpbWVyLgorICAvLy8KKyAgdm9pZCBzdG9wVGltZXIoKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRpbWVyR3JvdXA7Cit9OworCisKKy8vLyBUaGUgVGltZVJlZ2lvbiBjbGFzcyBpcyB1c2VkIGFzIGEgaGVscGVyIGNsYXNzIHRvIGNhbGwgdGhlIHN0YXJ0VGltZXIoKSBhbmQKKy8vLyBzdG9wVGltZXIoKSBtZXRob2RzIG9mIHRoZSBUaW1lciBjbGFzcy4gIFdoZW4gdGhlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCwgaXQKKy8vLyBzdGFydHMgdGhlIHRpbWVyIHNwZWNpZmllZCBhcyBpdCdzIGFyZ3VtZW50LiAgV2hlbiBpdCBpcyBkZXN0cm95ZWQsIGl0IHN0b3BzCisvLy8gdGhlIHJlbGV2YW50IHRpbWVyLiAgVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRpbWUgYSByZWdpb24gb2YgY29kZS4KKy8vLworY2xhc3MgVGltZVJlZ2lvbiB7CisgIFRpbWVyICpUOworICBUaW1lUmVnaW9uKGNvbnN0IFRpbWVSZWdpb24gJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKK3B1YmxpYzoKKyAgZXhwbGljaXQgVGltZVJlZ2lvbihUaW1lciAmdCkgOiBUKCZ0KSB7CisgICAgVC0+c3RhcnRUaW1lcigpOworICB9CisgIGV4cGxpY2l0IFRpbWVSZWdpb24oVGltZXIgKnQpIDogVCh0KSB7CisgICAgaWYgKFQpIFQtPnN0YXJ0VGltZXIoKTsKKyAgfQorICB+VGltZVJlZ2lvbigpIHsKKyAgICBpZiAoVCkgVC0+c3RvcFRpbWVyKCk7CisgIH0KK307CisKKworLy8vIE5hbWVkUmVnaW9uVGltZXIgLSBUaGlzIGNsYXNzIGlzIGJhc2ljYWxseSBhIGNvbWJpbmF0aW9uIG9mIFRpbWVSZWdpb24gYW5kCisvLy8gVGltZXIuICBJdCBhbGxvd3MgeW91IHRvIGRlY2xhcmUgYSBuZXcgdGltZXIsIEFORCBzcGVjaWZ5IHRoZSByZWdpb24gdG8KKy8vLyB0aW1lLCBhbGwgaW4gb25lIHN0YXRlbWVudC4gIEFsbCB0aW1lcnMgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSBtZXJnZWQuICBUaGlzCisvLy8gaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgZm9yIGh1bnRpbmcgcGVyZm9ybWFuY2UgcHJvYmxlbXMuCisvLy8KK3N0cnVjdCBOYW1lZFJlZ2lvblRpbWVyIDogcHVibGljIFRpbWVSZWdpb24geworICBleHBsaWNpdCBOYW1lZFJlZ2lvblRpbWVyKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW5hYmxlZCA9IHRydWUpOworICBleHBsaWNpdCBOYW1lZFJlZ2lvblRpbWVyKFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgR3JvdXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW5hYmxlZCA9IHRydWUpOworfTsKKworCisvLy8gVGhlIFRpbWVyR3JvdXAgY2xhc3MgaXMgdXNlZCB0byBncm91cCB0b2dldGhlciByZWxhdGVkIHRpbWVycyBpbnRvIGEgc2luZ2xlCisvLy8gcmVwb3J0IHRoYXQgaXMgcHJpbnRlZCB3aGVuIHRoZSBUaW1lckdyb3VwIGlzIGRlc3Ryb3llZC4gIEl0IGlzIGlsbGVnYWwgdG8KKy8vLyBkZXN0cm95IGEgVGltZXJHcm91cCBvYmplY3QgYmVmb3JlIGFsbCBvZiB0aGUgVGltZXJzIGluIGl0IGFyZSBnb25lLiAgQQorLy8vIFRpbWVyR3JvdXAgY2FuIGJlIHNwZWNpZmllZCBmb3IgYSBuZXdseSBjcmVhdGVkIHRpbWVyIGluIGl0cyBjb25zdHJ1Y3Rvci4KKy8vLworY2xhc3MgVGltZXJHcm91cCB7CisgIHN0ZDo6c3RyaW5nIE5hbWU7CisgIFRpbWVyICpGaXJzdFRpbWVyOyAgIC8vIEZpcnN0IHRpbWVyIGluIHRoZSBncm91cC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFRpbWVSZWNvcmQsIHN0ZDo6c3RyaW5nPiA+IFRpbWVyc1RvUHJpbnQ7CisgIAorICBUaW1lckdyb3VwICoqUHJldiwgKk5leHQ7IC8vIERvdWJseSBsaW5rZWQgbGlzdCBvZiBUaW1lckdyb3VwJ3MuCisgIFRpbWVyR3JvdXAoY29uc3QgVGltZXJHcm91cCAmVEcpOyAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVGltZXJHcm91cCAmVEcpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorcHVibGljOgorICBleHBsaWNpdCBUaW1lckdyb3VwKFN0cmluZ1JlZiBuYW1lKTsKKyAgflRpbWVyR3JvdXAoKTsKKworICB2b2lkIHNldE5hbWUoU3RyaW5nUmVmIG5hbWUpIHsgTmFtZS5hc3NpZ24obmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpKTsgfQorCisgIC8vLyBwcmludCAtIFByaW50IGFueSBzdGFydGVkIHRpbWVycyBpbiB0aGlzIGdyb3VwIGFuZCB6ZXJvIHRoZW0uCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKTsKKyAgCisgIC8vLyBwcmludEFsbCAtIFRoaXMgc3RhdGljIG1ldGhvZCBwcmludHMgYWxsIHRpbWVycyBhbmQgY2xlYXJzIHRoZW0gYWxsIG91dC4KKyAgc3RhdGljIHZvaWQgcHJpbnRBbGwocmF3X29zdHJlYW0gJk9TKTsKKyAgCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGltZXI7CisgIHZvaWQgYWRkVGltZXIoVGltZXIgJlQpOworICB2b2lkIHJlbW92ZVRpbWVyKFRpbWVyICZUKTsKKyAgdm9pZCBQcmludFF1ZXVlZFRpbWVycyhyYXdfb3N0cmVhbSAmT1MpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UeXBlQnVpbGRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHlwZUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBhYzUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHlwZUJ1aWxkZXIuaApAQCAtMCwwICsxLDM5MyBAQAorLy89PT0tLS0tIGxsdm0vU3VwcG9ydC9UeXBlQnVpbGRlci5oIC0gQnVpbGRlciBmb3IgTExWTSB0eXBlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVHlwZUJ1aWxkZXIgY2xhc3MsIHdoaWNoIGlzIHVzZWQgYXMgYSBjb252ZW5pZW50IHdheSB0bworLy8gY3JlYXRlIExMVk0gdHlwZXMgd2l0aCBhIGNvbnNpc3RlbnQgYW5kIHNpbXBsaWZpZWQgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RZUEVCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RZUEVCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUeXBlQnVpbGRlciAtIFRoaXMgcHJvdmlkZXMgYSB1bmlmb3JtIEFQSSBmb3IgbG9va2luZyB1cCB0eXBlcworLy8vIGtub3duIGF0IGNvbXBpbGUgdGltZS4gIFRvIHN1cHBvcnQgY3Jvc3MtY29tcGlsYXRpb24sIHdlIGRlZmluZSBhCisvLy8gc2VyaWVzIG9mIHRhZyB0eXBlcyBpbiB0aGUgbGx2bTo6dHlwZXMgbmFtZXNwYWNlLCBsaWtlIGk8Tj4sCisvLy8gaWVlZV9mbG9hdCwgcHBjX2ZwMTI4LCBldGMuICBUeXBlQnVpbGRlcjxULCBmYWxzZT4gYWxsb3dzIFQgdG8gYmUKKy8vLyBhbnkgb2YgdGhlc2UsIGEgbmF0aXZlIEMgdHlwZSAod2hvc2Ugc2l6ZSBtYXkgZGVwZW5kIG9uIHRoZSBob3N0CisvLy8gY29tcGlsZXIpLCBvciBhIHBvaW50ZXIsIGZ1bmN0aW9uLCBvciBzdHJ1Y3QgdHlwZSBidWlsdCBvdXQgb2YKKy8vLyB0aGVzZS4gIFR5cGVCdWlsZGVyPFQsIHRydWU+IHJlbW92ZXMgbmF0aXZlIEMgdHlwZXMgZnJvbSB0aGlzIHNldAorLy8vIHRvIGd1YXJhbnRlZSB0aGF0IGl0cyByZXN1bHQgaXMgc3VpdGFibGUgZm9yIGNyb3NzLWNvbXBpbGF0aW9uLgorLy8vIFdlIGRlZmluZSB0aGUgcHJpbWl0aXZlIHR5cGVzLCBwb2ludGVyIHR5cGVzLCBhbmQgZnVuY3Rpb25zIHVwIHRvCisvLy8gNSBhcmd1bWVudHMgaGVyZSwgYnV0IHRvIHVzZSB0aGlzIGNsYXNzIHdpdGggeW91ciBvd24gdHlwZXMsCisvLy8geW91J2xsIG5lZWQgdG8gc3BlY2lhbGl6ZSBpdC4gIEZvciBleGFtcGxlLCBzYXkgeW91IHdhbnQgdG8gY2FsbCBhCisvLy8gZnVuY3Rpb24gZGVmaW5lZCBleHRlcm5hbGx5IGFzOgorLy8vCisvLy8gICBzdHJ1Y3QgTXlUeXBlIHsKKy8vLyAgICAgaW50MzIgYTsKKy8vLyAgICAgaW50MzIgKmI7CisvLy8gICAgIHZvaWQgKmFycmF5WzFdOyAgLy8gSW50ZW5kZWQgYXMgYSBmbGV4aWJsZSBhcnJheS4KKy8vLyAgIH07CisvLy8gICBpbnQ4IEFGdW5jdGlvbihzdHJ1Y3QgTXlUeXBlICp2YWx1ZSk7CisvLy8KKy8vLyBZb3UnbGwgd2FudCB0byB1c2UKKy8vLyAgIEZ1bmN0aW9uOjpDcmVhdGUoVHlwZUJ1aWxkZXI8dHlwZXM6Omk8OD4oTXlUeXBlKiksIHRydWU+OjpnZXQoKSwgLi4uKQorLy8vIHRvIGRlY2xhcmUgdGhlIGZ1bmN0aW9uLCBidXQgd2hlbiB5b3UgZmlyc3QgdHJ5IHRoaXMsIHlvdXIgY29tcGlsZXIgd2lsbAorLy8vIGNvbXBsYWluIHRoYXQgVHlwZUJ1aWxkZXI8TXlUeXBlLCB0cnVlPjo6Z2V0KCkgZG9lc24ndCBleGlzdC4gVG8gZml4IHRoaXMsCisvLy8gd3JpdGU6CisvLy8KKy8vLyAgIG5hbWVzcGFjZSBsbHZtIHsKKy8vLyAgIHRlbXBsYXRlPGJvb2wgeGNvbXBpbGU+IGNsYXNzIFR5cGVCdWlsZGVyPE15VHlwZSwgeGNvbXBpbGU+IHsKKy8vLyAgIHB1YmxpYzoKKy8vLyAgICAgc3RhdGljIGNvbnN0IFN0cnVjdFR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworLy8vICAgICAgIC8vIElmIHlvdSBjYWNoZSB0aGlzIHJlc3VsdCwgYmUgc3VyZSB0byBjYWNoZSBpdCBzZXBhcmF0ZWx5CisvLy8gICAgICAgLy8gZm9yIGVhY2ggTExWTUNvbnRleHQuCisvLy8gICAgICAgcmV0dXJuIFN0cnVjdFR5cGU6OmdldCgKKy8vLyAgICAgICAgIFR5cGVCdWlsZGVyPHR5cGVzOjppPDMyPiwgeGNvbXBpbGU+OjpnZXQoQ29udGV4dCksCisvLy8gICAgICAgICBUeXBlQnVpbGRlcjx0eXBlczo6aTwzMj4qLCB4Y29tcGlsZT46OmdldChDb250ZXh0KSwKKy8vLyAgICAgICAgIFR5cGVCdWlsZGVyPHR5cGVzOjppPDg+KltdLCB4Y29tcGlsZT46OmdldChDb250ZXh0KSwKKy8vLyAgICAgICAgIE5VTEwpOworLy8vICAgICB9CisvLy8KKy8vLyAgICAgLy8gWW91IG1heSBmaW5kIHRoaXMgYSBjb252ZW5pZW50IHBsYWNlIHRvIHB1dCBzb21lIGNvbnN0YW50cworLy8vICAgICAvLyB0byBoZWxwIHdpdGggZ2V0ZWxlbWVudHB0ci4gIFRoZXkgZG9uJ3QgaGF2ZSBhbnkgZWZmZWN0IG9uCisvLy8gICAgIC8vIHRoZSBvcGVyYXRpb24gb2YgVHlwZUJ1aWxkZXIuCisvLy8gICAgIGVudW0gRmllbGRzIHsKKy8vLyAgICAgICBGSUVMRF9BLAorLy8vICAgICAgIEZJRUxEX0IsCisvLy8gICAgICAgRklFTERfQVJSQVkKKy8vLyAgICAgfTsKKy8vLyAgIH0KKy8vLyAgIH0gIC8vIG5hbWVzcGFjZSBsbHZtCisvLy8KKy8vLyBUeXBlQnVpbGRlciBjYW5ub3QgaGFuZGxlIHJlY3Vyc2l2ZSB0eXBlcyBvciB0eXBlcyB5b3Ugb25seSBrbm93IGF0IHJ1bnRpbWUuCisvLy8gSWYgeW91IHRyeSB0byBnaXZlIGl0IGEgcmVjdXJzaXZlIHR5cGUsIGl0IHdpbGwgZGVhZGxvY2ssIGluZmluaXRlbHkKKy8vLyByZWN1cnNlLCBvciB0aHJvdyBhIHJlY3Vyc2l2ZV9pbml0IGV4Y2VwdGlvbi4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgY3Jvc3NfY29tcGlsYWJsZT4gY2xhc3MgVHlwZUJ1aWxkZXIge307CisKKy8vIFR5cGVzIGZvciB1c2Ugd2l0aCBjcm9zcy1jb21waWxhYmxlIFR5cGVCdWlsZGVycy4gIFRoZXNlIGNvcnJlc3BvbmQKKy8vIGV4YWN0bHkgd2l0aCBhbiBMTFZNLW5hdGl2ZSB0eXBlLgorbmFtZXNwYWNlIHR5cGVzIHsKKy8vLyBpPE4+IGNvcnJlc3BvbmRzIHRvIHRoZSBMTFZNIEludGVnZXJUeXBlIHdpdGggTiBiaXRzLgordGVtcGxhdGU8dWludDMyX3QgbnVtX2JpdHM+IGNsYXNzIGkge307CisKKy8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyByZXByZXNlbnQgdGhlIExMVk0gZmxvYXRpbmcgdHlwZXMuCitjbGFzcyBpZWVlX2Zsb2F0IHt9OworY2xhc3MgaWVlZV9kb3VibGUge307CitjbGFzcyB4ODZfZnA4MCB7fTsKK2NsYXNzIGZwMTI4IHt9OworY2xhc3MgcHBjX2ZwMTI4IHt9OworfSAgLy8gbmFtZXNwYWNlIHR5cGVzCisKKy8vIExMVk0gZG9lc24ndCBoYXZlIGNvbnN0IG9yIHZvbGF0aWxlIHR5cGVzLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8Y29uc3QgVCwgY3Jvc3M+CisgIDogcHVibGljIFR5cGVCdWlsZGVyPFQsIGNyb3NzPiB7fTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPHZvbGF0aWxlIFQsIGNyb3NzPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjxULCBjcm9zcz4ge307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxjb25zdCB2b2xhdGlsZSBULCBjcm9zcz4KKyAgOiBwdWJsaWMgVHlwZUJ1aWxkZXI8VCwgY3Jvc3M+IHt9OworCisvLyBQb2ludGVycwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8VCosIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBQb2ludGVyVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgcmV0dXJuIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZUJ1aWxkZXI8VCxjcm9zcz46OmdldChDb250ZXh0KSk7CisgIH0KK307CisKKy8vLyBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciByZWZlcmVuY2VzCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxUJiwgY3Jvc3M+IHt9OworCisvLyBBcnJheXMKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBOLCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxUW05dLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgQXJyYXlUeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICByZXR1cm4gQXJyYXlUeXBlOjpnZXQoVHlwZUJ1aWxkZXI8VCwgY3Jvc3M+OjpnZXQoQ29udGV4dCksIE4pOworICB9Cit9OworLy8vIExMVk0gdXNlcyBhbiBhcnJheSBvZiBsZW5ndGggMCB0byByZXByZXNlbnQgYW4gdW5rbm93bi1sZW5ndGggYXJyYXkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxUW10sIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBBcnJheVR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIHJldHVybiBBcnJheVR5cGU6OmdldChUeXBlQnVpbGRlcjxULCBjcm9zcz46OmdldChDb250ZXh0KSwgMCk7CisgIH0KK307CisKKy8vIERlZmluZSB0aGUgQyBpbnRlZ3JhbCB0eXBlcyBvbmx5IGZvciBUeXBlQnVpbGRlcjxULCBmYWxzZT4uCisvLworLy8gQyBpbnRlZ3JhbCB0eXBlcyBkbyBub3QgaGF2ZSBhIGRlZmluZWQgc2l6ZS4gSXQgd291bGQgYmUgbmljZSB0byB1c2UgdGhlCisvLyBzdGRpbnQuaC1kZWZpbmVkIHR5cGVkZWZzIHRoYXQgZG8gaGF2ZSBkZWZpbmVkIHNpemVzLCBidXQgd2UnZCBydW4gaW50byB0aGUKKy8vIGZvbGxvd2luZyBwcm9ibGVtOgorLy8KKy8vIE9uIGFuIElMUDMyIG1hY2hpbmUsIHN0ZGludC5oIG1pZ2h0IGRlZmluZToKKy8vCisvLyAgIHR5cGVkZWYgaW50IGludDMyX3Q7CisvLyAgIHR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7CisvLyAgIHR5cGVkZWYgbG9uZyBzaXplX3Q7CisvLworLy8gSWYgd2UgZGVmaW5lZCBUeXBlQnVpbGRlcjxpbnQzMl90PiBhbmQgVHlwZUJ1aWxkZXI8aW50NjRfdD4sIHRoZW4gYW55IHVzZSBvZgorLy8gVHlwZUJ1aWxkZXI8c2l6ZV90PiB3b3VsZCBmYWlsLiAgV2UgY291bGRuJ3QgZGVmaW5lIFR5cGVCdWlsZGVyPHNpemVfdD4gaW4KKy8vIGFkZGl0aW9uIHRvIHRoZSBkZWZpbmVkLXNpemUgdHlwZXMgYmVjYXVzZSB3ZSdkIGdldCBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb24KKy8vIHBsYXRmb3JtcyB3aGVyZSBzdGRpbnQuaCBpbnN0ZWFkIGRlZmluZXM6CisvLworLy8gICB0eXBlZGVmIGludCBpbnQzMl90OworLy8gICB0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OworLy8gICB0eXBlZGVmIGludCBzaXplX3Q7CisvLworLy8gU28gd2UgZGVmaW5lIGFsbCB0aGUgcHJpbWl0aXZlIEMgdHlwZXMgYW5kIG5vdGhpbmcgZWxzZS4KKyNkZWZpbmUgREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKFQpIFwKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8VCwgZmFsc2U+IHsgXAorcHVibGljOiBcCisgIHN0YXRpYyBjb25zdCBJbnRlZ2VyVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7IFwKKyAgICByZXR1cm4gSW50ZWdlclR5cGU6OmdldChDb250ZXh0LCBzaXplb2YoVCkgKiBDSEFSX0JJVCk7IFwKKyAgfSBcCit9OyBcCit0ZW1wbGF0ZTw+IGNsYXNzIFR5cGVCdWlsZGVyPFQsIHRydWU+IHsgXAorICAvKiBXZSBwcm92aWRlIGEgZGVmaW5pdGlvbiBoZXJlIHNvIHVzZXJzIGRvbid0IGFjY2lkZW50YWxseSAqLyBcCisgIC8qIGRlZmluZSB0aGVzZSB0eXBlcyB0byB3b3JrLiAqLyBcCit9CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoY2hhcik7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoc2lnbmVkIGNoYXIpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKHVuc2lnbmVkIGNoYXIpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKHNob3J0KTsKK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUih1bnNpZ25lZCBzaG9ydCk7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoaW50KTsKK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUih1bnNpZ25lZCBpbnQpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKGxvbmcpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKHVuc2lnbmVkIGxvbmcpOworI2lmZGVmIF9NU0NfVkVSCitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoX19pbnQ2NCk7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIodW5zaWduZWQgX19pbnQ2NCk7CisjZWxzZSAvKiBfTVNDX1ZFUiAqLworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKGxvbmcgbG9uZyk7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIodW5zaWduZWQgbG9uZyBsb25nKTsKKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworI3VuZGVmIERFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUgorCit0ZW1wbGF0ZTx1aW50MzJfdCBudW1fYml0cywgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPHR5cGVzOjppPG51bV9iaXRzPiwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IEludGVnZXJUeXBlICpnZXQoTExWTUNvbnRleHQgJkMpIHsKKyAgICByZXR1cm4gSW50ZWdlclR5cGU6OmdldChDLCBudW1fYml0cyk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8ZmxvYXQsIGZhbHNlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXQoTExWTUNvbnRleHQmIEMpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0RmxvYXRUeShDKTsKKyAgfQorfTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8ZmxvYXQsIHRydWU+IHt9OworCit0ZW1wbGF0ZTw+IGNsYXNzIFR5cGVCdWlsZGVyPGRvdWJsZSwgZmFsc2U+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldChMTFZNQ29udGV4dCYgQykgeworICAgIHJldHVybiBUeXBlOjpnZXREb3VibGVUeShDKTsKKyAgfQorfTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8ZG91YmxlLCB0cnVlPiB7fTsKKwordGVtcGxhdGU8Ym9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8dHlwZXM6OmllZWVfZmxvYXQsIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXQoTExWTUNvbnRleHQmIEMpIHsgcmV0dXJuIFR5cGU6OmdldEZsb2F0VHkoQyk7IH0KK307Cit0ZW1wbGF0ZTxib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjx0eXBlczo6aWVlZV9kb3VibGUsIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXQoTExWTUNvbnRleHQmIEMpIHsgcmV0dXJuIFR5cGU6OmdldERvdWJsZVR5KEMpOyB9Cit9OwordGVtcGxhdGU8Ym9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8dHlwZXM6Ong4Nl9mcDgwLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgVHlwZSAqZ2V0KExMVk1Db250ZXh0JiBDKSB7IHJldHVybiBUeXBlOjpnZXRYODZfRlA4MFR5KEMpOyB9Cit9OwordGVtcGxhdGU8Ym9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8dHlwZXM6OmZwMTI4LCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgVHlwZSAqZ2V0KExMVk1Db250ZXh0JiBDKSB7IHJldHVybiBUeXBlOjpnZXRGUDEyOFR5KEMpOyB9Cit9OwordGVtcGxhdGU8Ym9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8dHlwZXM6OnBwY19mcDEyOCwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldChMTFZNQ29udGV4dCYgQykgeyByZXR1cm4gVHlwZTo6Z2V0UFBDX0ZQMTI4VHkoQyk7IH0KK307CisKK3RlbXBsYXRlPGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPHZvaWQsIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXQoTExWTUNvbnRleHQgJkMpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0Vm9pZFR5KEMpOworICB9Cit9OworCisvLy8gdm9pZCogaXMgZGlzYWxsb3dlZCBpbiBMTFZNIHR5cGVzLCBidXQgaXQgb2NjdXJzIG9mdGVuIGVub3VnaCBpbiBDIGNvZGUgdGhhdAorLy8vIHdlIHNwZWNpYWwgY2FzZSBpdC4KK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8dm9pZCosIGZhbHNlPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjx0eXBlczo6aTw4PiosIGZhbHNlPiB7fTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8Y29uc3Qgdm9pZCosIGZhbHNlPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjx0eXBlczo6aTw4PiosIGZhbHNlPiB7fTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8dm9sYXRpbGUgdm9pZCosIGZhbHNlPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjx0eXBlczo6aTw4PiosIGZhbHNlPiB7fTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8Y29uc3Qgdm9sYXRpbGUgdm9pZCosIGZhbHNlPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjx0eXBlczo6aTw4PiosIGZhbHNlPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgYm9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8UigpLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgRnVuY3Rpb25UeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksIGZhbHNlKTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxSKEExKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzZXJ2ZSgxKTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIGZhbHNlKTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPFIoQTEsIEEyKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzZXJ2ZSgyKTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHJldHVybiBGdW5jdGlvblR5cGU6OmdldChUeXBlQnVpbGRlcjxSLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBmYWxzZSk7CisgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzZXJ2ZSgzKTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHBhcmFtcy5wdXNoX2JhY2soVHlwZUJ1aWxkZXI8QTMsIGNyb3NzPjo6Z2V0KENvbnRleHQpKTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgZmFsc2UpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICAgICAgIGJvb2wgY3Jvc3M+CitjbGFzcyBUeXBlQnVpbGRlcjxSKEExLCBBMiwgQTMsIEE0KSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzZXJ2ZSg0KTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHBhcmFtcy5wdXNoX2JhY2soVHlwZUJ1aWxkZXI8QTMsIGNyb3NzPjo6Z2V0KENvbnRleHQpKTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEE0LCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIGZhbHNlKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgICAgICB0eXBlbmFtZSBBNSwgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPFIoQTEsIEEyLCBBMywgQTQsIEE1KSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzZXJ2ZSg1KTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHBhcmFtcy5wdXNoX2JhY2soVHlwZUJ1aWxkZXI8QTMsIGNyb3NzPjo6Z2V0KENvbnRleHQpKTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEE0LCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBNSwgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHJldHVybiBGdW5jdGlvblR5cGU6OmdldChUeXBlQnVpbGRlcjxSLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBmYWxzZSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPFIoLi4uKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLCB0cnVlKTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgLi4uKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzZXJ2ZSgxKTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLCBwYXJhbXMsIHRydWUpOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIC4uLiksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBwYXJhbXM7CisgICAgcGFyYW1zLnJlc2VydmUoMik7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHBhcmFtcy5wdXNoX2JhY2soVHlwZUJ1aWxkZXI8QTIsIGNyb3NzPjo6Z2V0KENvbnRleHQpKTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgdHJ1ZSk7CisgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzLCAuLi4pLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgRnVuY3Rpb25UeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gcGFyYW1zOworICAgIHBhcmFtcy5yZXNlcnZlKDMpOworICAgIHBhcmFtcy5wdXNoX2JhY2soVHlwZUJ1aWxkZXI8QTEsIGNyb3NzPjo6Z2V0KENvbnRleHQpKTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEEyLCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBMywgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHJldHVybiBGdW5jdGlvblR5cGU6OmdldChUeXBlQnVpbGRlcjxSLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCB0cnVlKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgICAgICBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzLCBBNCwgLi4uKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzZXJ2ZSg0KTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHBhcmFtcy5wdXNoX2JhY2soVHlwZUJ1aWxkZXI8QTMsIGNyb3NzPjo6Z2V0KENvbnRleHQpKTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEE0LCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHRydWUpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICAgICAgIHR5cGVuYW1lIEE1LCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUsIC4uLiksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBwYXJhbXM7CisgICAgcGFyYW1zLnJlc2VydmUoNSk7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHBhcmFtcy5wdXNoX2JhY2soVHlwZUJ1aWxkZXI8QTIsIGNyb3NzPjo6Z2V0KENvbnRleHQpKTsKKyAgICBwYXJhbXMucHVzaF9iYWNrKFR5cGVCdWlsZGVyPEEzLCBjcm9zcz46OmdldChDb250ZXh0KSk7CisgICAgcGFyYW1zLnB1c2hfYmFjayhUeXBlQnVpbGRlcjxBNCwgY3Jvc3M+OjpnZXQoQ29udGV4dCkpOworICAgIHBhcmFtcy5wdXNoX2JhY2soVHlwZUJ1aWxkZXI8QTUsIGNyb3NzPjo6Z2V0KENvbnRleHQpKTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgdHJ1ZSk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ZhbHVlSGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjZGMzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ZhbHVlSGFuZGxlLmgKQEAgLTAsMCArMSw0MDggQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCAtIFZhbHVlIFNtYXJ0IFBvaW50ZXIgY2xhc3NlcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBWYWx1ZUhhbmRsZSBjbGFzcyBhbmQgaXRzIHN1Yi1jbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1ZBTFVFSEFORExFX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1ZBTFVFSEFORExFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9WYWx1ZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBWYWx1ZUhhbmRsZUJhc2U7CisKKy8vIFZhbHVlSGFuZGxlQmFzZSoqIGlzIG9ubHkgNC1ieXRlIGFsaWduZWQuCit0ZW1wbGF0ZTw+CitjbGFzcyBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VmFsdWVIYW5kbGVCYXNlKio+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFZhbHVlSGFuZGxlQmFzZSoqIFApIHsgcmV0dXJuIFA7IH0KKyAgc3RhdGljIGlubGluZSBWYWx1ZUhhbmRsZUJhc2UgKipnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxWYWx1ZUhhbmRsZUJhc2UqKj4oUCk7CisgIH0KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAyIH07Cit9OworCisvLy8gVmFsdWVIYW5kbGVCYXNlIC0gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3Mgb2YgdmFsdWUgaGFuZGxlcy4KKy8vLyBWYWx1ZUhhbmRsZSdzIGFyZSBzbWFydCBwb2ludGVycyB0byBWYWx1ZSdzIHRoYXQgaGF2ZSBzcGVjaWFsIGJlaGF2aW9yIHdoZW4KKy8vLyB0aGUgdmFsdWUgaXMgZGVsZXRlZCBvciBSZXBsYWNlQWxsVXNlc1dpdGgnZC4gIFNlZSB0aGUgc3BlY2lmaWMgaGFuZGxlcworLy8vIGJlbG93IGZvciBkZXRhaWxzLgorLy8vCitjbGFzcyBWYWx1ZUhhbmRsZUJhc2UgeworICBmcmllbmQgY2xhc3MgVmFsdWU7Citwcm90ZWN0ZWQ6CisgIC8vLyBIYW5kbGVCYXNlS2luZCAtIFRoaXMgaW5kaWNhdGVzIHdoYXQgc3ViIGNsYXNzIHRoZSBoYW5kbGUgYWN0dWFsbHkgaXMuCisgIC8vLyBUaGlzIGlzIHRvIGF2b2lkIGhhdmluZyBhIHZ0YWJsZSBmb3IgdGhlIGxpZ2h0LXdlaWdodCBoYW5kbGUgcG9pbnRlcnMuIFRoZQorICAvLy8gZnVsbHkgZ2VuZXJhbCBDYWxsYmFjayB2ZXJzaW9uIGRvZXMgaGF2ZSBhIHZ0YWJsZS4KKyAgZW51bSBIYW5kbGVCYXNlS2luZCB7CisgICAgQXNzZXJ0LAorICAgIENhbGxiYWNrLAorICAgIFRyYWNraW5nLAorICAgIFdlYWsKKyAgfTsKK3ByaXZhdGU6CisKKyAgUG9pbnRlckludFBhaXI8VmFsdWVIYW5kbGVCYXNlKiosIDIsIEhhbmRsZUJhc2VLaW5kPiBQcmV2UGFpcjsKKyAgVmFsdWVIYW5kbGVCYXNlICpOZXh0OworICBWYWx1ZSAqVlA7CisgIAorICBleHBsaWNpdCBWYWx1ZUhhbmRsZUJhc2UoY29uc3QgVmFsdWVIYW5kbGVCYXNlJik7IC8vIERPIE5PVCBJTVBMRU1FTlQuCitwdWJsaWM6CisgIGV4cGxpY2l0IFZhbHVlSGFuZGxlQmFzZShIYW5kbGVCYXNlS2luZCBLaW5kKQorICAgIDogUHJldlBhaXIoMCwgS2luZCksIE5leHQoMCksIFZQKDApIHt9CisgIFZhbHVlSGFuZGxlQmFzZShIYW5kbGVCYXNlS2luZCBLaW5kLCBWYWx1ZSAqVikKKyAgICA6IFByZXZQYWlyKDAsIEtpbmQpLCBOZXh0KDApLCBWUChWKSB7CisgICAgaWYgKGlzVmFsaWQoVlApKQorICAgICAgQWRkVG9Vc2VMaXN0KCk7CisgIH0KKyAgVmFsdWVIYW5kbGVCYXNlKEhhbmRsZUJhc2VLaW5kIEtpbmQsIGNvbnN0IFZhbHVlSGFuZGxlQmFzZSAmUkhTKQorICAgIDogUHJldlBhaXIoMCwgS2luZCksIE5leHQoMCksIFZQKFJIUy5WUCkgeworICAgIGlmIChpc1ZhbGlkKFZQKSkKKyAgICAgIEFkZFRvRXhpc3RpbmdVc2VMaXN0KFJIUy5nZXRQcmV2UHRyKCkpOworICB9CisgIH5WYWx1ZUhhbmRsZUJhc2UoKSB7CisgICAgaWYgKGlzVmFsaWQoVlApKQorICAgICAgUmVtb3ZlRnJvbVVzZUxpc3QoKTsKKyAgfQorCisgIFZhbHVlICpvcGVyYXRvcj0oVmFsdWUgKlJIUykgeworICAgIGlmIChWUCA9PSBSSFMpIHJldHVybiBSSFM7CisgICAgaWYgKGlzVmFsaWQoVlApKSBSZW1vdmVGcm9tVXNlTGlzdCgpOworICAgIFZQID0gUkhTOworICAgIGlmIChpc1ZhbGlkKFZQKSkgQWRkVG9Vc2VMaXN0KCk7CisgICAgcmV0dXJuIFJIUzsKKyAgfQorCisgIFZhbHVlICpvcGVyYXRvcj0oY29uc3QgVmFsdWVIYW5kbGVCYXNlICZSSFMpIHsKKyAgICBpZiAoVlAgPT0gUkhTLlZQKSByZXR1cm4gUkhTLlZQOworICAgIGlmIChpc1ZhbGlkKFZQKSkgUmVtb3ZlRnJvbVVzZUxpc3QoKTsKKyAgICBWUCA9IFJIUy5WUDsKKyAgICBpZiAoaXNWYWxpZChWUCkpIEFkZFRvRXhpc3RpbmdVc2VMaXN0KFJIUy5nZXRQcmV2UHRyKCkpOworICAgIHJldHVybiBWUDsKKyAgfQorCisgIFZhbHVlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsUHRyKCk7IH0KKyAgVmFsdWUgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXRWYWxQdHIoKTsgfQorCitwcm90ZWN0ZWQ6CisgIFZhbHVlICpnZXRWYWxQdHIoKSBjb25zdCB7IHJldHVybiBWUDsgfQorICBzdGF0aWMgYm9vbCBpc1ZhbGlkKFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYgJiYKKyAgICAgICAgICAgViAhPSBEZW5zZU1hcEluZm88VmFsdWUgKj46OmdldEVtcHR5S2V5KCkgJiYKKyAgICAgICAgICAgViAhPSBEZW5zZU1hcEluZm88VmFsdWUgKj46OmdldFRvbWJzdG9uZUtleSgpOworICB9CisKK3ByaXZhdGU6CisgIC8vIENhbGxiYWNrcyBtYWRlIGZyb20gVmFsdWUuCisgIHN0YXRpYyB2b2lkIFZhbHVlSXNEZWxldGVkKFZhbHVlICpWKTsKKyAgc3RhdGljIHZvaWQgVmFsdWVJc1JBVVdkKFZhbHVlICpPbGQsIFZhbHVlICpOZXcpOworCisgIC8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisgIFZhbHVlSGFuZGxlQmFzZSAqKmdldFByZXZQdHIoKSBjb25zdCB7IHJldHVybiBQcmV2UGFpci5nZXRQb2ludGVyKCk7IH0KKyAgSGFuZGxlQmFzZUtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIFByZXZQYWlyLmdldEludCgpOyB9CisgIHZvaWQgc2V0UHJldlB0cihWYWx1ZUhhbmRsZUJhc2UgKipQdHIpIHsgUHJldlBhaXIuc2V0UG9pbnRlcihQdHIpOyB9CisKKyAgLy8vIEFkZFRvRXhpc3RpbmdVc2VMaXN0IC0gQWRkIHRoaXMgVmFsdWVIYW5kbGUgdG8gdGhlIHVzZSBsaXN0IGZvciBWUCwgd2hlcmUKKyAgLy8vIExpc3QgaXMgdGhlIGFkZHJlc3Mgb2YgZWl0aGVyIHRoZSBoZWFkIG9mIHRoZSBsaXN0IG9yIGEgTmV4dCBub2RlIHdpdGhpbgorICAvLy8gdGhlIGV4aXN0aW5nIHVzZSBsaXN0LgorICB2b2lkIEFkZFRvRXhpc3RpbmdVc2VMaXN0KFZhbHVlSGFuZGxlQmFzZSAqKkxpc3QpOworCisgIC8vLyBBZGRUb0V4aXN0aW5nVXNlTGlzdEFmdGVyIC0gQWRkIHRoaXMgVmFsdWVIYW5kbGUgdG8gdGhlIHVzZSBsaXN0IGFmdGVyCisgIC8vLyBOb2RlLgorICB2b2lkIEFkZFRvRXhpc3RpbmdVc2VMaXN0QWZ0ZXIoVmFsdWVIYW5kbGVCYXNlICpOb2RlKTsKKworICAvLy8gQWRkVG9Vc2VMaXN0IC0gQWRkIHRoaXMgVmFsdWVIYW5kbGUgdG8gdGhlIHVzZSBsaXN0IGZvciBWUC4KKyAgdm9pZCBBZGRUb1VzZUxpc3QoKTsKKyAgLy8vIFJlbW92ZUZyb21Vc2VMaXN0IC0gUmVtb3ZlIHRoaXMgVmFsdWVIYW5kbGUgZnJvbSBpdHMgY3VycmVudCB1c2UgbGlzdC4KKyAgdm9pZCBSZW1vdmVGcm9tVXNlTGlzdCgpOworfTsKKworLy8vIFdlYWtWSCAtIFRoaXMgaXMgYSB2YWx1ZSBoYW5kbGUgdGhhdCB0cmllcyBoYXJkIHRvIHBvaW50IHRvIGEgVmFsdWUsIGV2ZW4KKy8vLyBhY3Jvc3MgUkFVVyBvcGVyYXRpb25zLCBidXQgd2lsbCBudWxsIGl0c2VsZiBvdXQgaWYgdGhlIHZhbHVlIGlzIGRlc3Ryb3llZC4KKy8vLyB0aGlzIGlzIHVzZWZ1bCBmb3IgYWR2aXNvcnkgc29ydHMgb2YgaW5mb3JtYXRpb24sIGJ1dCBzaG91bGQgbm90IGJlIHVzZWQgYXMKKy8vLyB0aGUga2V5IG9mIGEgbWFwIChzaW5jZSB0aGUgbWFwIHdvdWxkIGhhdmUgdG8gcmVhcnJhbmdlIGl0c2VsZiB3aGVuIHRoZQorLy8vIHBvaW50ZXIgY2hhbmdlcykuCitjbGFzcyBXZWFrVkggOiBwdWJsaWMgVmFsdWVIYW5kbGVCYXNlIHsKK3B1YmxpYzoKKyAgV2Vha1ZIKCkgOiBWYWx1ZUhhbmRsZUJhc2UoV2Vhaykge30KKyAgV2Vha1ZIKFZhbHVlICpQKSA6IFZhbHVlSGFuZGxlQmFzZShXZWFrLCBQKSB7fQorICBXZWFrVkgoY29uc3QgV2Vha1ZIICZSSFMpCisgICAgOiBWYWx1ZUhhbmRsZUJhc2UoV2VhaywgUkhTKSB7fQorCisgIFZhbHVlICpvcGVyYXRvcj0oVmFsdWUgKlJIUykgeworICAgIHJldHVybiBWYWx1ZUhhbmRsZUJhc2U6Om9wZXJhdG9yPShSSFMpOworICB9CisgIFZhbHVlICpvcGVyYXRvcj0oY29uc3QgVmFsdWVIYW5kbGVCYXNlICZSSFMpIHsKKyAgICByZXR1cm4gVmFsdWVIYW5kbGVCYXNlOjpvcGVyYXRvcj0oUkhTKTsKKyAgfQorCisgIG9wZXJhdG9yIFZhbHVlKigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemUgc2ltcGxpZnlfdHlwZSB0byBhbGxvdyBXZWFrVkggdG8gcGFydGljaXBhdGUgaW4KKy8vIGR5bl9jYXN0LCBpc2EsIGV0Yy4KK3RlbXBsYXRlPHR5cGVuYW1lIEZyb20+IHN0cnVjdCBzaW1wbGlmeV90eXBlOwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBXZWFrVkg+IHsKKyAgdHlwZWRlZiBWYWx1ZSogU2ltcGxlVHlwZTsKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IFdlYWtWSCAmV1ZIKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZhbHVlICo+KFdWSCk7CisgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPFdlYWtWSD4gOiBwdWJsaWMgc2ltcGxpZnlfdHlwZTxjb25zdCBXZWFrVkg+IHt9OworCisvLy8gQXNzZXJ0aW5nVkggLSBUaGlzIGlzIGEgVmFsdWUgSGFuZGxlIHRoYXQgcG9pbnRzIHRvIGEgdmFsdWUgYW5kIGFzc2VydHMgb3V0CisvLy8gaWYgdGhlIHZhbHVlIGlzIGRlc3Ryb3llZCB3aGlsZSB0aGUgaGFuZGxlIGlzIHN0aWxsIGxpdmUuICBUaGlzIGlzIHZlcnkKKy8vLyB1c2VmdWwgZm9yIGNhdGNoaW5nIGRhbmdsaW5nIHBvaW50ZXIgYnVncyBhbmQgb3RoZXIgdGhpbmdzIHdoaWNoIGNhbiBiZQorLy8vIG5vbi1vYnZpb3VzLiAgT25lIHBhcnRpY3VsYXJseSB1c2VmdWwgcGxhY2UgdG8gdXNlIHRoaXMgaXMgYXMgdGhlIEtleSBvZiBhCisvLy8gbWFwLiAgRGFuZ2xpbmcgcG9pbnRlciBidWdzIG9mdGVuIGxlYWQgdG8gcmVhbGx5IHN1YnRsZSBidWdzIHRoYXQgb25seSBvY2N1cgorLy8vIGlmIGFub3RoZXIgb2JqZWN0IGhhcHBlbnMgdG8gZ2V0IGFsbG9jYXRlZCB0byB0aGUgc2FtZSBhZGRyZXNzIGFzIHRoZSBvbGQKKy8vLyBvbmUuICBVc2luZyBhbiBBc3NlcnRpbmdWSCBlbnN1cmVzIHRoYXQgYW4gYXNzZXJ0IGlzIHRyaWdnZXJlZCBhcyBzb29uIGFzCisvLy8gdGhlIGJhZCBkZWxldGUgb2NjdXJzLgorLy8vCisvLy8gTm90ZSB0aGF0IGFuIEFzc2VydGluZ1ZIIGhhbmRsZSBkb2VzICpub3QqIGZvbGxvdyB2YWx1ZXMgYWNyb3NzIFJBVVcKKy8vLyBvcGVyYXRpb25zLiAgVGhpcyBtZWFucyB0aGF0IFJBVVcncyBuZWVkIHRvIGV4cGxpY2l0bHkgdXBkYXRlIHRoZQorLy8vIEFzc2VydGluZ1ZIJ3MgYXMgaXQgbW92ZXMuICBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgaW4gbm9uLWFzc2VydCBtb2RlIHRoaXMKKy8vLyBjbGFzcyB0dXJucyBpbnRvIGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCBhIHBvaW50ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeT4KK2NsYXNzIEFzc2VydGluZ1ZICisjaWZuZGVmIE5ERUJVRworICA6IHB1YmxpYyBWYWx1ZUhhbmRsZUJhc2UKKyNlbmRpZgorICB7CisKKyNpZm5kZWYgTkRFQlVHCisgIFZhbHVlVHkgKmdldFZhbFB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VmFsdWVUeSo+KFZhbHVlSGFuZGxlQmFzZTo6Z2V0VmFsUHRyKCkpOworICB9CisgIHZvaWQgc2V0VmFsUHRyKFZhbHVlVHkgKlApIHsKKyAgICBWYWx1ZUhhbmRsZUJhc2U6Om9wZXJhdG9yPShHZXRBc1ZhbHVlKFApKTsKKyAgfQorI2Vsc2UKKyAgVmFsdWVUeSAqVGhlUHRyOworICBWYWx1ZVR5ICpnZXRWYWxQdHIoKSBjb25zdCB7IHJldHVybiBUaGVQdHI7IH0KKyAgdm9pZCBzZXRWYWxQdHIoVmFsdWVUeSAqUCkgeyBUaGVQdHIgPSBQOyB9CisjZW5kaWYKKworICAvLyBDb252ZXJ0IGEgVmFsdWVUeSosIHdoaWNoIG1heSBiZSBjb25zdCwgdG8gdGhlIHR5cGUgdGhlIGJhc2UKKyAgLy8gY2xhc3MgZXhwZWN0cy4KKyAgc3RhdGljIFZhbHVlICpHZXRBc1ZhbHVlKFZhbHVlICpWKSB7IHJldHVybiBWOyB9CisgIHN0YXRpYyBWYWx1ZSAqR2V0QXNWYWx1ZShjb25zdCBWYWx1ZSAqVikgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KFYpOyB9CisKK3B1YmxpYzoKKyNpZm5kZWYgTkRFQlVHCisgIEFzc2VydGluZ1ZIKCkgOiBWYWx1ZUhhbmRsZUJhc2UoQXNzZXJ0KSB7fQorICBBc3NlcnRpbmdWSChWYWx1ZVR5ICpQKSA6IFZhbHVlSGFuZGxlQmFzZShBc3NlcnQsIEdldEFzVmFsdWUoUCkpIHt9CisgIEFzc2VydGluZ1ZIKGNvbnN0IEFzc2VydGluZ1ZIICZSSFMpIDogVmFsdWVIYW5kbGVCYXNlKEFzc2VydCwgUkhTKSB7fQorI2Vsc2UKKyAgQXNzZXJ0aW5nVkgoKSA6IFRoZVB0cigwKSB7fQorICBBc3NlcnRpbmdWSChWYWx1ZVR5ICpQKSA6IFRoZVB0cihQKSB7fQorI2VuZGlmCisKKyAgb3BlcmF0b3IgVmFsdWVUeSooKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbFB0cigpOworICB9CisKKyAgVmFsdWVUeSAqb3BlcmF0b3I9KFZhbHVlVHkgKlJIUykgeworICAgIHNldFZhbFB0cihSSFMpOworICAgIHJldHVybiBnZXRWYWxQdHIoKTsKKyAgfQorICBWYWx1ZVR5ICpvcGVyYXRvcj0oY29uc3QgQXNzZXJ0aW5nVkg8VmFsdWVUeT4gJlJIUykgeworICAgIHNldFZhbFB0cihSSFMuZ2V0VmFsUHRyKCkpOworICAgIHJldHVybiBnZXRWYWxQdHIoKTsKKyAgfQorCisgIFZhbHVlVHkgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBnZXRWYWxQdHIoKTsgfQorICBWYWx1ZVR5ICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqZ2V0VmFsUHRyKCk7IH0KK307CisKKy8vIFNwZWNpYWxpemUgc2ltcGxpZnlfdHlwZSB0byBhbGxvdyBBc3NlcnRpbmdWSCB0byBwYXJ0aWNpcGF0ZSBpbgorLy8gZHluX2Nhc3QsIGlzYSwgZXRjLgordGVtcGxhdGU8dHlwZW5hbWUgRnJvbT4gc3RydWN0IHNpbXBsaWZ5X3R5cGU7Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IEFzc2VydGluZ1ZIPFZhbHVlPiA+IHsKKyAgdHlwZWRlZiBWYWx1ZSogU2ltcGxlVHlwZTsKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IEFzc2VydGluZ1ZIPFZhbHVlPiAmQVZIKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZhbHVlICo+KEFWSCk7CisgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPEFzc2VydGluZ1ZIPFZhbHVlPiA+CisgIDogcHVibGljIHNpbXBsaWZ5X3R5cGU8Y29uc3QgQXNzZXJ0aW5nVkg8VmFsdWU+ID4ge307CisKKy8vIFNwZWNpYWxpemUgRGVuc2VNYXBJbmZvIHRvIGFsbG93IEFzc2VydGluZ1ZIIHRvIHBhcnRpY2lwYXRlIGluIERlbnNlTWFwLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBEZW5zZU1hcEluZm88QXNzZXJ0aW5nVkg8VD4gPiB7CisgIHR5cGVkZWYgRGVuc2VNYXBJbmZvPFQqPiBQb2ludGVySW5mbzsKKyAgc3RhdGljIGlubGluZSBBc3NlcnRpbmdWSDxUPiBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW5nVkg8VD4oUG9pbnRlckluZm86OmdldEVtcHR5S2V5KCkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgVCogZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBBc3NlcnRpbmdWSDxUPihQb2ludGVySW5mbzo6Z2V0VG9tYnN0b25lS2V5KCkpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgQXNzZXJ0aW5nVkg8VD4gJlZhbCkgeworICAgIHJldHVybiBQb2ludGVySW5mbzo6Z2V0SGFzaFZhbHVlKFZhbCk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBBc3NlcnRpbmdWSDxUPiAmTEhTLCBjb25zdCBBc3NlcnRpbmdWSDxUPiAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisgIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNQb2RMaWtlPEFzc2VydGluZ1ZIPFQ+ID4geworI2lmZGVmIE5ERUJVRworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7CisjZWxzZQorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworI2VuZGlmCit9OworCisKKy8vLyBUcmFja2luZ1ZIIC0gVGhpcyBpcyBhIHZhbHVlIGhhbmRsZSB0aGF0IHRyYWNrcyBhIFZhbHVlIChvciBWYWx1ZSBzdWJjbGFzcyksCisvLy8gZXZlbiBhY3Jvc3MgUkFVVyBvcGVyYXRpb25zLgorLy8vCisvLy8gVHJhY2tpbmdWSCBpcyBkZXNpZ25lZCBmb3Igc2l0dWF0aW9ucyB3aGVyZSBhIGNsaWVudCBuZWVkcyB0byBob2xkIGEgaGFuZGxlCisvLy8gdG8gYSBWYWx1ZSAob3Igc3ViY2xhc3MpIGFjcm9zcyBzb21lIG9wZXJhdGlvbnMgd2hpY2ggbWF5IG1vdmUgdGhhdCB2YWx1ZSwKKy8vLyBidXQgc2hvdWxkIG5ldmVyIGRlc3Ryb3kgaXQgb3IgcmVwbGFjZSBpdCB3aXRoIHNvbWUgdW5hY2NlcHRhYmxlIHR5cGUuCisvLy8KKy8vLyBJdCBpcyBhbiBlcnJvciB0byBkbyBhbnl0aGluZyB3aXRoIGEgVHJhY2tpbmdWSCB3aG9zZSB2YWx1ZSBoYXMgYmVlbgorLy8vIGRlc3Ryb3llZCwgZXhjZXB0IHRvIGRlc3RydWN0IGl0LgorLy8vCisvLy8gSXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0byByZXBsYWNlIGEgdmFsdWUgd2l0aCBvbmUgb2YgYSB0eXBlIHdoaWNoIGlzCisvLy8gaW5jb21wYXRpYmxlIHdpdGggYW55IG9mIGl0cyBvdXRzdGFuZGluZyBUcmFja2luZ1ZIcy4KK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+CitjbGFzcyBUcmFja2luZ1ZIIDogcHVibGljIFZhbHVlSGFuZGxlQmFzZSB7CisgIHZvaWQgQ2hlY2tWYWxpZGl0eSgpIGNvbnN0IHsKKyAgICBWYWx1ZSAqVlAgPSBWYWx1ZUhhbmRsZUJhc2U6OmdldFZhbFB0cigpOworCisgICAgLy8gTnVsbCBpcyBhbHdheXMgb2suCisgICAgaWYgKCFWUCkgcmV0dXJuOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGlzIHZhbHVlIGlzIHZhbGlkIChpLmUuLCBpdCBoYXNuJ3QgYmVlbiBkZWxldGVkKS4gV2UKKyAgICAvLyBleHBsaWNpdGx5IGRlbGF5IHRoaXMgY2hlY2sgdW50aWwgYWNjZXNzIHRvIGF2b2lkIHJlcXVpcmluZyBjbGllbnRzIHRvIGJlCisgICAgLy8gdW5uZWNlc3NhcmlseSBjYXJlZnVsIHcuci50LiBkZXN0cnVjdGlvbi4KKyAgICBhc3NlcnQoVmFsdWVIYW5kbGVCYXNlOjppc1ZhbGlkKFZQKSAmJiAiVHJhY2tlZCBWYWx1ZSB3YXMgZGVsZXRlZCEiKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIHZhbHVlIGlzIGEgbWVtYmVyIG9mIHRoZSBjb3JyZWN0IHN1YmNsYXNzLiBXZSB3b3VsZCBsaWtlCisgICAgLy8gdG8gY2hlY2sgdGhpcyBwcm9wZXJ0eSBvbiBhc3NpZ25tZW50IGZvciBiZXR0ZXIgZGVidWdnaW5nLCBidXQgd2UgZG9uJ3QKKyAgICAvLyB3YW50IHRvIHJlcXVpcmUgYSB2aXJ0dWFsIGludGVyZmFjZSBvbiB0aGlzIFZILiBJbnN0ZWFkIHdlIGFsbG93IFJBVVcgdG8KKyAgICAvLyByZXBsYWNlIHRoaXMgdmFsdWUgd2l0aCBhIHZhbHVlIG9mIGFuIGludmFsaWQgdHlwZSwgYW5kIGNoZWNrIGl0IGhlcmUuCisgICAgYXNzZXJ0KGlzYTxWYWx1ZVR5PihWUCkgJiYKKyAgICAgICAgICAgIlRyYWNrZWQgVmFsdWUgd2FzIHJlcGxhY2VkIGJ5IG9uZSB3aXRoIGFuIGludmFsaWQgdHlwZSEiKTsKKyAgfQorCisgIFZhbHVlVHkgKmdldFZhbFB0cigpIGNvbnN0IHsKKyAgICBDaGVja1ZhbGlkaXR5KCk7CisgICAgcmV0dXJuIChWYWx1ZVR5KilWYWx1ZUhhbmRsZUJhc2U6OmdldFZhbFB0cigpOworICB9CisgIHZvaWQgc2V0VmFsUHRyKFZhbHVlVHkgKlApIHsKKyAgICBDaGVja1ZhbGlkaXR5KCk7CisgICAgVmFsdWVIYW5kbGVCYXNlOjpvcGVyYXRvcj0oR2V0QXNWYWx1ZShQKSk7CisgIH0KKworICAvLyBDb252ZXJ0IGEgVmFsdWVUeSosIHdoaWNoIG1heSBiZSBjb25zdCwgdG8gdGhlIHR5cGUgdGhlIGJhc2UKKyAgLy8gY2xhc3MgZXhwZWN0cy4KKyAgc3RhdGljIFZhbHVlICpHZXRBc1ZhbHVlKFZhbHVlICpWKSB7IHJldHVybiBWOyB9CisgIHN0YXRpYyBWYWx1ZSAqR2V0QXNWYWx1ZShjb25zdCBWYWx1ZSAqVikgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KFYpOyB9CisKK3B1YmxpYzoKKyAgVHJhY2tpbmdWSCgpIDogVmFsdWVIYW5kbGVCYXNlKFRyYWNraW5nKSB7fQorICBUcmFja2luZ1ZIKFZhbHVlVHkgKlApIDogVmFsdWVIYW5kbGVCYXNlKFRyYWNraW5nLCBHZXRBc1ZhbHVlKFApKSB7fQorICBUcmFja2luZ1ZIKGNvbnN0IFRyYWNraW5nVkggJlJIUykgOiBWYWx1ZUhhbmRsZUJhc2UoVHJhY2tpbmcsIFJIUykge30KKworICBvcGVyYXRvciBWYWx1ZVR5KigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KKworICBWYWx1ZVR5ICpvcGVyYXRvcj0oVmFsdWVUeSAqUkhTKSB7CisgICAgc2V0VmFsUHRyKFJIUyk7CisgICAgcmV0dXJuIGdldFZhbFB0cigpOworICB9CisgIFZhbHVlVHkgKm9wZXJhdG9yPShjb25zdCBUcmFja2luZ1ZIPFZhbHVlVHk+ICZSSFMpIHsKKyAgICBzZXRWYWxQdHIoUkhTLmdldFZhbFB0cigpKTsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KKworICBWYWx1ZVR5ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsUHRyKCk7IH0KKyAgVmFsdWVUeSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmdldFZhbFB0cigpOyB9Cit9OworCisvLyBTcGVjaWFsaXplIHNpbXBsaWZ5X3R5cGUgdG8gYWxsb3cgVHJhY2tpbmdWSCB0byBwYXJ0aWNpcGF0ZSBpbgorLy8gZHluX2Nhc3QsIGlzYSwgZXRjLgordGVtcGxhdGU8dHlwZW5hbWUgRnJvbT4gc3RydWN0IHNpbXBsaWZ5X3R5cGU7Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFRyYWNraW5nVkg8VmFsdWU+ID4geworICB0eXBlZGVmIFZhbHVlKiBTaW1wbGVUeXBlOworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgVHJhY2tpbmdWSDxWYWx1ZT4gJkFWSCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxWYWx1ZSAqPihBVkgpOworICB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxUcmFja2luZ1ZIPFZhbHVlPiA+CisgIDogcHVibGljIHNpbXBsaWZ5X3R5cGU8Y29uc3QgVHJhY2tpbmdWSDxWYWx1ZT4gPiB7fTsKKworLy8vIENhbGxiYWNrVkggLSBUaGlzIGlzIGEgdmFsdWUgaGFuZGxlIHRoYXQgYWxsb3dzIHN1YmNsYXNzZXMgdG8gZGVmaW5lCisvLy8gY2FsbGJhY2tzIHRoYXQgcnVuIHdoZW4gdGhlIHVuZGVybHlpbmcgVmFsdWUgaGFzIFJBVVcgY2FsbGVkIG9uIGl0IG9yIGlzCisvLy8gZGVzdHJveWVkLiAgVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IG9mIGEgbWFwLCBhcyBsb25nIGFzIHRoZSB1c2VyCisvLy8gdGFrZXMgaXQgb3V0IG9mIHRoZSBtYXAgYmVmb3JlIGNhbGxpbmcgc2V0VmFsUHRyKCkgKHNpbmNlIHRoZSBtYXAgaGFzIHRvCisvLy8gcmVhcnJhbmdlIGl0c2VsZiB3aGVuIHRoZSBwb2ludGVyIGNoYW5nZXMpLiAgVW5saWtlIFZhbHVlSGFuZGxlQmFzZSwgdGhpcworLy8vIGNsYXNzIGhhcyBhIHZ0YWJsZSBhbmQgYSB2aXJ0dWFsIGRlc3RydWN0b3IuCitjbGFzcyBDYWxsYmFja1ZIIDogcHVibGljIFZhbHVlSGFuZGxlQmFzZSB7Citwcm90ZWN0ZWQ6CisgIENhbGxiYWNrVkgoY29uc3QgQ2FsbGJhY2tWSCAmUkhTKQorICAgIDogVmFsdWVIYW5kbGVCYXNlKENhbGxiYWNrLCBSSFMpIHt9CisKKyAgdmlydHVhbCB+Q2FsbGJhY2tWSCgpOworCisgIHZvaWQgc2V0VmFsUHRyKFZhbHVlICpQKSB7CisgICAgVmFsdWVIYW5kbGVCYXNlOjpvcGVyYXRvcj0oUCk7CisgIH0KKworcHVibGljOgorICBDYWxsYmFja1ZIKCkgOiBWYWx1ZUhhbmRsZUJhc2UoQ2FsbGJhY2spIHt9CisgIENhbGxiYWNrVkgoVmFsdWUgKlApIDogVmFsdWVIYW5kbGVCYXNlKENhbGxiYWNrLCBQKSB7fQorCisgIG9wZXJhdG9yIFZhbHVlKigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KKworICAvLy8gQ2FsbGVkIHdoZW4gdGhpcy0+Z2V0VmFsUHRyKCkgaXMgZGVzdHJveWVkLCBpbnNpZGUgflZhbHVlKCksIHNvIHlvdSBtYXkKKyAgLy8vIGNhbGwgYW55IG5vbi12aXJ0dWFsIFZhbHVlIG1ldGhvZCBvbiBnZXRWYWxQdHIoKSwgYnV0IG5vIHN1YmNsYXNzIG1ldGhvZHMuCisgIC8vLyBJZiBXZWFrVkggd2VyZSBpbXBsZW1lbnRlZCBhcyBhIENhbGxiYWNrVkgsIGl0IHdvdWxkIHVzZSB0aGlzIG1ldGhvZCB0bworICAvLy8gY2FsbCBzZXRWYWxQdHIoTlVMTCkuICBBc3NlcnRpbmdWSCB3b3VsZCB1c2UgdGhpcyBtZXRob2QgdG8gY2F1c2UgYW4KKyAgLy8vIGFzc2VydGlvbiBmYWlsdXJlLgorICAvLy8KKyAgLy8vIEFsbCBpbXBsZW1lbnRhdGlvbnMgbXVzdCByZW1vdmUgdGhlIHJlZmVyZW5jZSBmcm9tIHRoaXMgb2JqZWN0IHRvIHRoZQorICAvLy8gVmFsdWUgdGhhdCdzIGJlaW5nIGRlc3Ryb3llZC4KKyAgdmlydHVhbCB2b2lkIGRlbGV0ZWQoKSB7CisgICAgc2V0VmFsUHRyKE5VTEwpOworICB9CisKKyAgLy8vIENhbGxlZCB3aGVuIHRoaXMtPmdldFZhbFB0cigpLT5yZXBsYWNlQWxsVXNlc1dpdGgobmV3X3ZhbHVlKSBpcyBjYWxsZWQsCisgIC8vLyBfYmVmb3JlXyBhbnkgb2YgdGhlIHVzZXMgaGF2ZSBhY3R1YWxseSBiZWVuIHJlcGxhY2VkLiAgSWYgV2Vha1ZIIHdlcmUKKyAgLy8vIGltcGxlbWVudGVkIGFzIGEgQ2FsbGJhY2tWSCwgaXQgd291bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGNhbGwKKyAgLy8vIHNldFZhbFB0cihuZXdfdmFsdWUpLiAgQXNzZXJ0aW5nVkggd291bGQgZG8gbm90aGluZyBpbiB0aGlzIG1ldGhvZC4KKyAgdmlydHVhbCB2b2lkIGFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKikge30KK307CisKKy8vIFNwZWNpYWxpemUgc2ltcGxpZnlfdHlwZSB0byBhbGxvdyBDYWxsYmFja1ZIIHRvIHBhcnRpY2lwYXRlIGluCisvLyBkeW5fY2FzdCwgaXNhLCBldGMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBGcm9tPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTsKK3RlbXBsYXRlPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgQ2FsbGJhY2tWSD4geworICB0eXBlZGVmIFZhbHVlKiBTaW1wbGVUeXBlOworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgQ2FsbGJhY2tWSCAmQ1ZIKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZhbHVlICo+KENWSCk7CisgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPENhbGxiYWNrVkg+CisgIDogcHVibGljIHNpbXBsaWZ5X3R5cGU8Y29uc3QgQ2FsbGJhY2tWSD4ge307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvY2lyY3VsYXJfcmF3X29zdHJlYW0uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L2NpcmN1bGFyX3Jhd19vc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzYzMyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L2NpcmN1bGFyX3Jhd19vc3RyZWFtLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L2NpcmN1bGFyX3Jhd19vc3RyZWFtLmggLSBCdWZmZXJlZCBzdHJlYW1zIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHJhd19vc3RyZWFtIGltcGxlbWVudGF0aW9ucyBmb3Igc3RyZWFtcyB0byBkbyBjaXJjdWxhcgorLy8gYnVmZmVyaW5nIG9mIHRoZWlyIG91dHB1dC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DSVJDVUxBUl9SQVdfT1NUUkVBTV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DSVJDVUxBUl9SQVdfT1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0gCit7CisgIC8vLyBjaXJjdWxhcl9yYXdfb3N0cmVhbSAtIEEgcmF3X29zdHJlYW0gd2hpY2ggKmNhbiogc2F2ZSBpdHMgZGF0YQorICAvLy8gdG8gYSBjaXJjdWxhciBidWZmZXIsIG9yIGNhbiBwYXNzIGl0IHRocm91Z2ggZGlyZWN0bHkgdG8gYW4KKyAgLy8vIHVuZGVybHlpbmcgc3RyZWFtIGlmIHNwZWNpZmllZCB3aXRoIGEgYnVmZmVyIG9mIHplcm8uCisgIC8vLworICBjbGFzcyBjaXJjdWxhcl9yYXdfb3N0cmVhbSA6IHB1YmxpYyByYXdfb3N0cmVhbSB7CisgIHB1YmxpYzoKKyAgICAvLy8gVEFLRV9PV05FUlNISVAgLSBUZWxsIHRoaXMgc3RyZWFtIHRoYXQgaXQgb3ducyB0aGUgdW5kZXJseWluZworICAgIC8vLyBzdHJlYW0gYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjbGVhbnVwLCBtZW1vcnkgbWFuYWdlbWVudAorICAgIC8vLyBpc3N1ZXMsIGV0Yy4KKyAgICAvLy8KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBUQUtFX09XTkVSU0hJUCA9IHRydWU7CisKKyAgICAvLy8gUkVGRVJFTkNFX09OTFkgLSBUZWxsIHRoaXMgc3RyZWFtIGl0IHNob3VsZCBub3QgbWFuYWdlIHRoZQorICAgIC8vLyBoZWxkIHN0cmVhbS4KKyAgICAvLy8KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBSRUZFUkVOQ0VfT05MWSA9IGZhbHNlOworCisgIHByaXZhdGU6CisgICAgLy8vIFRoZVN0cmVhbSAtIFRoZSByZWFsIHN0cmVhbSB3ZSBvdXRwdXQgdG8uIFdlIHNldCBpdCB0byBiZQorICAgIC8vLyB1bmJ1ZmZlcmVkLCBzaW5jZSB3ZSdyZSBhbHJlYWR5IGRvaW5nIG91ciBvd24gYnVmZmVyaW5nLgorICAgIC8vLworICAgIHJhd19vc3RyZWFtICpUaGVTdHJlYW07CisKKyAgICAvLy8gT3duc1N0cmVhbSAtIEFyZSB3ZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHVuZGVybHlpbmcKKyAgICAvLy8gc3RyZWFtPworICAgIC8vLworICAgIGJvb2wgT3duc1N0cmVhbTsKKworICAgIC8vLyBCdWZmZXJTaXplIC0gVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy4KKyAgICAvLy8KKyAgICBzaXplX3QgQnVmZmVyU2l6ZTsKKworICAgIC8vLyBCdWZmZXJBcnJheSAtIFRoZSBhY3R1YWwgYnVmZmVyIHN0b3JhZ2UuCisgICAgLy8vCisgICAgY2hhciAqQnVmZmVyQXJyYXk7CisKKyAgICAvLy8gQ3VyIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBvdXRwdXQgcG9pbnQgaW4gQnVmZmVyQXJyYXkuCisgICAgLy8vCisgICAgY2hhciAqQ3VyOworCisgICAgLy8vIEZpbGxlZCAtIEluZGljYXRlIHdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiBjb21wbGV0ZWx5CisgICAgLy8vIGZpbGxlZC4gIFRoaXMgaGVscHMgYXZvaWQgZ2FyYmFnZSBvdXRwdXQuCisgICAgLy8vCisgICAgYm9vbCBGaWxsZWQ7CisKKyAgICAvLy8gQmFubmVyIC0gQSBwb2ludGVyIHRvIGEgYmFubmVyIHRvIHByaW50IGJlZm9yZSBkdW1waW5nIHRoZQorICAgIC8vLyBsb2cuCisgICAgLy8vCisgICAgY29uc3QgY2hhciAqQmFubmVyOworCisgICAgLy8vIGZsdXNoQnVmZmVyIC0gRHVtcCB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciB0byBTdHJlYW0uCisgICAgLy8vCisgICAgdm9pZCBmbHVzaEJ1ZmZlcih2b2lkKSB7CisgICAgICBpZiAoRmlsbGVkKQorICAgICAgICAvLyBXcml0ZSB0aGUgb2xkZXIgcG9ydGlvbiBvZiB0aGUgYnVmZmVyLgorICAgICAgICBUaGVTdHJlYW0tPndyaXRlKEN1ciwgQnVmZmVyQXJyYXkgKyBCdWZmZXJTaXplIC0gQ3VyKTsKKyAgICAgIC8vIFdyaXRlIHRoZSBuZXdlciBwb3J0aW9uIG9mIHRoZSBidWZmZXIuCisgICAgICBUaGVTdHJlYW0tPndyaXRlKEJ1ZmZlckFycmF5LCBDdXIgLSBCdWZmZXJBcnJheSk7CisgICAgICBDdXIgPSBCdWZmZXJBcnJheTsKKyAgICAgIEZpbGxlZCA9IGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpOworCisgICAgLy8vIGN1cnJlbnRfcG9zIC0gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLAorICAgIC8vLyBub3QgY291bnRpbmcgdGhlIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICAgIC8vLworICAgIHZpcnR1YWwgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCB7IAorICAgICAgLy8gVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcgVGhlU3RyZWFtLmN1cnJlbnRfcG9zKCksCisgICAgICAvLyBidXQgdGhhdCBpbnRlcmZhY2UgaXMgcHJpdmF0ZS4KKyAgICAgIHJldHVybiBUaGVTdHJlYW0tPnRlbGwoKSAtIFRoZVN0cmVhbS0+R2V0TnVtQnl0ZXNJbkJ1ZmZlcigpOworICAgIH0KKworICBwdWJsaWM6CisgICAgLy8vIGNpcmN1bGFyX3Jhd19vc3RyZWFtIC0gQ29uc3RydWN0IGFuIG9wdGlvbmFsbHkKKyAgICAvLy8gY2lyY3VsYXItYnVmZmVyZWQgc3RyZWFtLCBoYW5kaW5nIGl0IGFuIHVuZGVybHlpbmcgc3RyZWFtIHRvCisgICAgLy8vIGRvIHRoZSAicmVhbCIgb3V0cHV0LgorICAgIC8vLworICAgIC8vLyBBcyBhIHNpZGUgZWZmZWN0LCBpZiBCdWZmU2l6ZSBpcyBub256ZXJvLCB0aGUgZ2l2ZW4gU3RyZWFtIGlzCisgICAgLy8vIHNldCB0byBiZSBVbmJ1ZmZlcmVkLiAgVGhpcyBpcyBiZWNhdXNlIGNpcmN1bGFyX3Jhd19vc3RyZWFtCisgICAgLy8vIGRvZXMgaXRzIG93biBidWZmZXJpbmcsIHNvIGl0IGRvZXNuJ3Qgd2FudCBhbm90aGVyIGxheWVyIG9mCisgICAgLy8vIGJ1ZmZlcmluZyB0byBiZSBoYXBwZW5pbmcgdW5kZXJuZWF0aCBpdC4KKyAgICAvLy8KKyAgICAvLy8gIk93bnMiIHRlbGxzIHRoZSBjaXJjdWxhcl9yYXdfb3N0cmVhbSB3aGV0aGVyIGl0IGlzCisgICAgLy8vIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgaGVsZCBzdHJlYW0sIGRvaW5nIG1lbW9yeQorICAgIC8vLyBtYW5hZ2VtZW50IG9mIGl0LCBldGMuCisgICAgLy8vCisgICAgY2lyY3VsYXJfcmF3X29zdHJlYW0ocmF3X29zdHJlYW0gJlN0cmVhbSwgY29uc3QgY2hhciAqSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBCdWZmU2l6ZSA9IDAsIGJvb2wgT3ducyA9IFJFRkVSRU5DRV9PTkxZKSAKKyAgICAgICAgOiByYXdfb3N0cmVhbSgvKnVuYnVmZmVyZWQqL3RydWUpLAorICAgICAgICAgICAgVGhlU3RyZWFtKDApLAorICAgICAgICAgICAgT3duc1N0cmVhbShPd25zKSwKKyAgICAgICAgICAgIEJ1ZmZlclNpemUoQnVmZlNpemUpLAorICAgICAgICAgICAgQnVmZmVyQXJyYXkoMCksCisgICAgICAgICAgICBGaWxsZWQoZmFsc2UpLAorICAgICAgICAgICAgQmFubmVyKEhlYWRlcikgeworICAgICAgaWYgKEJ1ZmZlclNpemUgIT0gMCkKKyAgICAgICAgQnVmZmVyQXJyYXkgPSBuZXcgY2hhcltCdWZmZXJTaXplXTsKKyAgICAgIEN1ciA9IEJ1ZmZlckFycmF5OworICAgICAgc2V0U3RyZWFtKFN0cmVhbSwgT3ducyk7CisgICAgfQorICAgIGV4cGxpY2l0IGNpcmN1bGFyX3Jhd19vc3RyZWFtKCkKKyAgICAgICAgOiByYXdfb3N0cmVhbSgvKnVuYnVmZmVyZWQqL3RydWUpLAorICAgICAgICAgICAgVGhlU3RyZWFtKDApLAorICAgICAgICAgICAgT3duc1N0cmVhbShSRUZFUkVOQ0VfT05MWSksCisgICAgICAgICAgICBCdWZmZXJBcnJheSgwKSwKKyAgICAgICAgICAgIEZpbGxlZChmYWxzZSksCisgICAgICAgICAgICBCYW5uZXIoIiIpIHsKKyAgICAgIEN1ciA9IEJ1ZmZlckFycmF5OworICAgIH0KKworICAgIH5jaXJjdWxhcl9yYXdfb3N0cmVhbSgpIHsKKyAgICAgIGZsdXNoKCk7CisgICAgICBmbHVzaEJ1ZmZlcldpdGhCYW5uZXIoKTsKKyAgICAgIHJlbGVhc2VTdHJlYW0oKTsKKyAgICAgIGRlbGV0ZVtdIEJ1ZmZlckFycmF5OworICAgIH0KKworICAgIC8vLyBzZXRTdHJlYW0gLSBUZWxsIHRoZSBjaXJjdWxhcl9yYXdfb3N0cmVhbSB0byBvdXRwdXQgYQorICAgIC8vLyBkaWZmZXJlbnQgc3RyZWFtLiAgIk93bnMiIHRlbGxzIGNpcmN1bGFyX3Jhd19vc3RyZWFtIHdoZXRoZXIKKyAgICAvLy8gaXQgc2hvdWxkIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIHRoZSB1bmRlcmx5aW5nCisgICAgLy8vIHN0cmVhbS4KKyAgICAvLy8KKyAgICB2b2lkIHNldFN0cmVhbShyYXdfb3N0cmVhbSAmU3RyZWFtLCBib29sIE93bnMgPSBSRUZFUkVOQ0VfT05MWSkgeworICAgICAgcmVsZWFzZVN0cmVhbSgpOworICAgICAgVGhlU3RyZWFtID0gJlN0cmVhbTsKKyAgICAgIE93bnNTdHJlYW0gPSBPd25zOworICAgIH0KKworICAgIC8vLyBmbHVzaEJ1ZmZlcldpdGhCYW5uZXIgLSBGb3JjZSBvdXRwdXQgb2YgdGhlIGJ1ZmZlciBhbG9uZyB3aXRoCisgICAgLy8vIGEgc21hbGwgaGVhZGVyLgorICAgIC8vLworICAgIHZvaWQgZmx1c2hCdWZmZXJXaXRoQmFubmVyKHZvaWQpOworCisgIHByaXZhdGU6CisgICAgLy8vIHJlbGVhc2VTdHJlYW0gLSBEZWxldGUgdGhlIGhlbGQgc3RyZWFtIGlmIG5lZWRlZC4gT3RoZXJ3aXNlLAorICAgIC8vLyB0cmFuc2ZlciB0aGUgYnVmZmVyIHNldHRpbmdzIGZyb20gdGhpcyBjaXJjdWxhcl9yYXdfb3N0cmVhbQorICAgIC8vLyBiYWNrIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAvLy8KKyAgICB2b2lkIHJlbGVhc2VTdHJlYW0oKSB7CisgICAgICBpZiAoIVRoZVN0cmVhbSkKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKE93bnNTdHJlYW0pCisgICAgICAgIGRlbGV0ZSBUaGVTdHJlYW07CisgICAgfQorICB9OworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc19vc3RyZWFtLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3Nfb3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNWQzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3Nfb3N0cmVhbS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LSByYXdfb3Nfb3N0cmVhbS5oIC0gc3RkOjpvc3RyZWFtIGFkYXB0b3IgZm9yIHJhd19vc3RyZWFtIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSByYXdfb3Nfb3N0cmVhbSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SQVdfT1NfT1NUUkVBTV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9SQVdfT1NfT1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxpb3Nmd2Q+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIHJhd19vc19vc3RyZWFtIC0gQSByYXdfb3N0cmVhbSB0aGF0IHdyaXRlcyB0byBhbiBzdGQ6Om9zdHJlYW0uICBUaGlzIGlzIGEKKy8vLyBzaW1wbGUgYWRhcHRvciBjbGFzcy4gIEl0IGRvZXMgbm90IGNoZWNrIGZvciBvdXRwdXQgZXJyb3JzOyBjbGllbnRzIHNob3VsZAorLy8vIHVzZSB0aGUgdW5kZXJseWluZyBzdHJlYW0gdG8gZGV0ZWN0IGVycm9ycy4KK2NsYXNzIHJhd19vc19vc3RyZWFtIDogcHVibGljIHJhd19vc3RyZWFtIHsKKyAgc3RkOjpvc3RyZWFtICZPUzsKKyAgCisgIC8vLyB3cml0ZV9pbXBsIC0gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgorICB2aXJ0dWFsIHZvaWQgd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKTsKKyAgCisgIC8vLyBjdXJyZW50X3BvcyAtIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwgbm90CisgIC8vLyBjb3VudGluZyB0aGUgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgIHZpcnR1YWwgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdDsKKyAgCitwdWJsaWM6CisgIHJhd19vc19vc3RyZWFtKHN0ZDo6b3N0cmVhbSAmTykgOiBPUyhPKSB7fQorICB+cmF3X29zX29zdHJlYW0oKTsKK307CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5YTUyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgKQEAgLTAsMCArMSw0ODYgQEAKKy8vPT09LS0tIHJhd19vc3RyZWFtLmggLSBSYXcgb3V0cHV0IHN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSByYXdfb3N0cmVhbSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SQVdfT1NUUkVBTV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9SQVdfT1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBmb3JtYXRfb2JqZWN0X2Jhc2U7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjbGFzcyBTbWFsbFZlY3RvckltcGw7CisKKy8vLyByYXdfb3N0cmVhbSAtIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBleHRyZW1lbHkgZmFzdCBidWxrIG91dHB1dCBzdHJlYW0KKy8vLyB0aGF0IGNhbiAqb25seSogb3V0cHV0IHRvIGEgc3RyZWFtLiAgSXQgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLCByZW9wZW5pbmcsCisvLy8gcmV3aW5kaW5nLCBsaW5lIGJ1ZmZlcmVkIGRpc2NpcGxpbmVzIGV0Yy4gSXQgaXMgYSBzaW1wbGUgYnVmZmVyIHRoYXQgb3V0cHV0cworLy8vIGEgY2h1bmsgYXQgYSB0aW1lLgorY2xhc3MgcmF3X29zdHJlYW0geworcHJpdmF0ZToKKyAgLy8gRG8gbm90IGltcGxlbWVudC4gcmF3X29zdHJlYW0gaXMgbm9uY29weWFibGUuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHJhd19vc3RyZWFtICYpOworICByYXdfb3N0cmVhbShjb25zdCByYXdfb3N0cmVhbSAmKTsKKworICAvLy8gVGhlIGJ1ZmZlciBpcyBoYW5kbGVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgYnVmZmVyIGlzCisgIC8vLyB1bmluaXRpYWxpemVkLCB1bmJ1ZmZlcmVkLCBvciBvdXQgb2Ygc3BhY2Ugd2hlbiBPdXRCdWZDdXIgPj0KKyAgLy8vIE91dEJ1ZkVuZC4gVGh1cyBhIHNpbmdsZSBjb21wYXJpc29uIHN1ZmZpY2VzIHRvIGRldGVybWluZSBpZiB3ZQorICAvLy8gbmVlZCB0byB0YWtlIHRoZSBzbG93IHBhdGggdG8gd3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLgorICAvLy8KKyAgLy8vIFRoZSBidWZmZXIgaXMgaW4gb25lIG9mIHRocmVlIHN0YXRlczoKKyAgLy8vICAxLiBVbmJ1ZmZlcmVkIChCdWZmZXJNb2RlID09IFVuYnVmZmVyZWQpCisgIC8vLyAgMS4gVW5pbml0aWFsaXplZCAoQnVmZmVyTW9kZSAhPSBVbmJ1ZmZlcmVkICYmIE91dEJ1ZlN0YXJ0ID09IDApLgorICAvLy8gIDIuIEJ1ZmZlcmVkIChCdWZmZXJNb2RlICE9IFVuYnVmZmVyZWQgJiYgT3V0QnVmU3RhcnQgIT0gMCAmJgorICAvLy8gICAgICAgICAgICAgICBPdXRCdWZFbmQgLSBPdXRCdWZTdGFydCA+PSAxKS4KKyAgLy8vCisgIC8vLyBJZiBidWZmZXJlZCwgdGhlbiB0aGUgcmF3X29zdHJlYW0gb3ducyB0aGUgYnVmZmVyIGlmIChCdWZmZXJNb2RlID09CisgIC8vLyBJbnRlcm5hbEJ1ZmZlcik7IG90aGVyd2lzZSB0aGUgYnVmZmVyIGhhcyBiZWVuIHNldCB2aWEgU2V0QnVmZmVyIGFuZCBpcworICAvLy8gbWFuYWdlZCBieSB0aGUgc3ViY2xhc3MuCisgIC8vLworICAvLy8gSWYgYSBzdWJjbGFzcyBpbnN0YWxscyBhbiBleHRlcm5hbCBidWZmZXIgdXNpbmcgU2V0QnVmZmVyIHRoZW4gaXQgY2FuIHdhaXQKKyAgLy8vIGZvciBhIFxzZWUgd3JpdGVfaW1wbCgpIGNhbGwgdG8gaGFuZGxlIHRoZSBkYXRhIHdoaWNoIGhhcyBiZWVuIHB1dCBpbnRvCisgIC8vLyB0aGlzIGJ1ZmZlci4KKyAgY2hhciAqT3V0QnVmU3RhcnQsICpPdXRCdWZFbmQsICpPdXRCdWZDdXI7CisKKyAgZW51bSBCdWZmZXJLaW5kIHsKKyAgICBVbmJ1ZmZlcmVkID0gMCwKKyAgICBJbnRlcm5hbEJ1ZmZlciwKKyAgICBFeHRlcm5hbEJ1ZmZlcgorICB9IEJ1ZmZlck1vZGU7CisKKyAgLy8vIEVycm9yIFRoaXMgZmxhZyBpcyB0cnVlIGlmIGFuIGVycm9yIG9mIGFueSBraW5kIGhhcyBiZWVuIGRldGVjdGVkLgorICAvLy8KKyAgYm9vbCBFcnJvcjsKKworcHVibGljOgorICAvLyBjb2xvciBvcmRlciBtYXRjaGVzIEFOU0kgZXNjYXBlIHNlcXVlbmNlLCBkb24ndCBjaGFuZ2UKKyAgZW51bSBDb2xvcnMgeworICAgIEJMQUNLPTAsCisgICAgUkVELAorICAgIEdSRUVOLAorICAgIFlFTExPVywKKyAgICBCTFVFLAorICAgIE1BR0VOVEEsCisgICAgQ1lBTiwKKyAgICBXSElURSwKKyAgICBTQVZFRENPTE9SCisgIH07CisKKyAgZXhwbGljaXQgcmF3X29zdHJlYW0oYm9vbCB1bmJ1ZmZlcmVkPWZhbHNlKQorICAgIDogQnVmZmVyTW9kZSh1bmJ1ZmZlcmVkID8gVW5idWZmZXJlZCA6IEludGVybmFsQnVmZmVyKSwgRXJyb3IoZmFsc2UpIHsKKyAgICAvLyBTdGFydCBvdXQgcmVhZHkgdG8gZmx1c2guCisgICAgT3V0QnVmU3RhcnQgPSBPdXRCdWZFbmQgPSBPdXRCdWZDdXIgPSAwOworICB9CisKKyAgdmlydHVhbCB+cmF3X29zdHJlYW0oKTsKKworICAvLy8gdGVsbCAtIFJldHVybiB0aGUgY3VycmVudCBvZmZzZXQgd2l0aCB0aGUgZmlsZS4KKyAgdWludDY0X3QgdGVsbCgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfcG9zKCkgKyBHZXROdW1CeXRlc0luQnVmZmVyKCk7IH0KKworICAvLy8gaGFzX2Vycm9yIC0gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiB0aGlzIHJhd19vc3RyZWFtIGluZGljYXRpbmcKKyAgLy8vIHdoZXRoZXIgYW4gb3V0cHV0IGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLgorICAvLy8gVGhpcyBkb2Vzbid0IGltcGxpY2l0bHkgZmx1c2ggYW55IHBlbmRpbmcgb3V0cHV0LgorICBib29sIGhhc19lcnJvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gRXJyb3I7CisgIH0KKworICAvLy8gY2xlYXJfZXJyb3IgLSBTZXQgdGhlIGZsYWcgcmVhZCBieSBoYXNfZXJyb3IoKSB0byBmYWxzZS4gSWYgdGhlIGVycm9yCisgIC8vLyBmbGFnIGlzIHNldCBhdCB0aGUgdGltZSB3aGVuIHRoaXMgcmF3X29zdHJlYW0ncyBkZXN0cnVjdG9yIGlzIGNhbGxlZCwKKyAgLy8vIHJlcG9ydF9mYXRhbF9lcnJvciBpcyBjYWxsZWQgdG8gcmVwb3J0IHRoZSBlcnJvci4gVXNlIGNsZWFyX2Vycm9yKCkKKyAgLy8vIGFmdGVyIGhhbmRsaW5nIHRoZSBlcnJvciB0byBhdm9pZCB0aGlzIGJlaGF2aW9yLgorICB2b2lkIGNsZWFyX2Vycm9yKCkgeworICAgIEVycm9yID0gZmFsc2U7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29uZmlndXJhdGlvbiBJbnRlcmZhY2UKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFNldEJ1ZmZlcmVkIC0gU2V0IHRoZSBzdHJlYW0gdG8gYmUgYnVmZmVyZWQsIHdpdGggYW4gYXV0b21hdGljYWxseQorICAvLy8gZGV0ZXJtaW5lZCBidWZmZXIgc2l6ZS4KKyAgdm9pZCBTZXRCdWZmZXJlZCgpOworCisgIC8vLyBTZXRCdWZmZXJTaXplIC0gU2V0IHRoZSBzdHJlYW0gdG8gYmUgYnVmZmVyZWQsIHVzaW5nIHRoZQorICAvLy8gc3BlY2lmaWVkIGJ1ZmZlciBzaXplLgorICB2b2lkIFNldEJ1ZmZlclNpemUoc2l6ZV90IFNpemUpIHsKKyAgICBmbHVzaCgpOworICAgIFNldEJ1ZmZlckFuZE1vZGUobmV3IGNoYXJbU2l6ZV0sIFNpemUsIEludGVybmFsQnVmZmVyKTsKKyAgfQorCisgIHNpemVfdCBHZXRCdWZmZXJTaXplKCkgY29uc3QgeworICAgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGJlIGJ1ZmZlcmVkIGJ1dCBoYXZlbid0IGFjdHVhbGx5IGdvdHRlbiBhcm91bmQKKyAgICAvLyB0byBhbGxvY2F0aW5nIHRoZSBidWZmZXIgeWV0LCByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd291bGQgYmUgdXNlZC4KKyAgICBpZiAoQnVmZmVyTW9kZSAhPSBVbmJ1ZmZlcmVkICYmIE91dEJ1ZlN0YXJ0ID09IDApCisgICAgICByZXR1cm4gcHJlZmVycmVkX2J1ZmZlcl9zaXplKCk7CisKKyAgICAvLyBPdGhlcndpc2UganVzdCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgcmV0dXJuIE91dEJ1ZkVuZCAtIE91dEJ1ZlN0YXJ0OworICB9CisKKyAgLy8vIFNldFVuYnVmZmVyZWQgLSBTZXQgdGhlIHN0cmVhbSB0byBiZSB1bmJ1ZmZlcmVkLiBXaGVuCisgIC8vLyB1bmJ1ZmZlcmVkLCB0aGUgc3RyZWFtIHdpbGwgZmx1c2ggYWZ0ZXIgZXZlcnkgd3JpdGUuIFRoaXMgcm91dGluZQorICAvLy8gd2lsbCBhbHNvIGZsdXNoIHRoZSBidWZmZXIgaW1tZWRpYXRlbHkgd2hlbiB0aGUgc3RyZWFtIGlzIGJlaW5nCisgIC8vLyBzZXQgdG8gdW5idWZmZXJlZC4KKyAgdm9pZCBTZXRVbmJ1ZmZlcmVkKCkgeworICAgIGZsdXNoKCk7CisgICAgU2V0QnVmZmVyQW5kTW9kZSgwLCAwLCBVbmJ1ZmZlcmVkKTsKKyAgfQorCisgIHNpemVfdCBHZXROdW1CeXRlc0luQnVmZmVyKCkgY29uc3QgeworICAgIHJldHVybiBPdXRCdWZDdXIgLSBPdXRCdWZTdGFydDsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBEYXRhIE91dHB1dCBJbnRlcmZhY2UKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdm9pZCBmbHVzaCgpIHsKKyAgICBpZiAoT3V0QnVmQ3VyICE9IE91dEJ1ZlN0YXJ0KQorICAgICAgZmx1c2hfbm9uZW1wdHkoKTsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNoYXIgQykgeworICAgIGlmIChPdXRCdWZDdXIgPj0gT3V0QnVmRW5kKQorICAgICAgcmV0dXJuIHdyaXRlKEMpOworICAgICpPdXRCdWZDdXIrKyA9IEM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBDKSB7CisgICAgaWYgKE91dEJ1ZkN1ciA+PSBPdXRCdWZFbmQpCisgICAgICByZXR1cm4gd3JpdGUoQyk7CisgICAgKk91dEJ1ZkN1cisrID0gQzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChzaWduZWQgY2hhciBDKSB7CisgICAgaWYgKE91dEJ1ZkN1ciA+PSBPdXRCdWZFbmQpCisgICAgICByZXR1cm4gd3JpdGUoQyk7CisgICAgKk91dEJ1ZkN1cisrID0gQzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChTdHJpbmdSZWYgU3RyKSB7CisgICAgLy8gSW5saW5lIGZhc3QgcGF0aCwgcGFydGljdWxhcmx5IGZvciBzdHJpbmdzIHdpdGggYSBrbm93biBsZW5ndGguCisgICAgc2l6ZV90IFNpemUgPSBTdHIuc2l6ZSgpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiB1c2UgdGhlIGZhc3QgcGF0aC4KKyAgICBpZiAoT3V0QnVmQ3VyK1NpemUgPiBPdXRCdWZFbmQpCisgICAgICByZXR1cm4gd3JpdGUoU3RyLmRhdGEoKSwgU2l6ZSk7CisKKyAgICBtZW1jcHkoT3V0QnVmQ3VyLCBTdHIuZGF0YSgpLCBTaXplKTsKKyAgICBPdXRCdWZDdXIgKz0gU2l6ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBjaGFyICpTdHIpIHsKKyAgICAvLyBJbmxpbmUgZmFzdCBwYXRoLCBwYXJ0aWN1bGFyeSBmb3IgY29uc3RhbnQgc3RyaW5ncyB3aGVyZSBhIHN1ZmZpY2llbnRseQorICAgIC8vIHNtYXJ0IGNvbXBpbGVyIHdpbGwgc2ltcGxpZnkgc3RybGVuLgorCisgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwoU3RyaW5nUmVmKFN0cikpOworICB9CisKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3Qgc3RkOjpzdHJpbmcgJlN0cikgeworICAgIC8vIEF2b2lkIHRoZSBmYXN0IHBhdGgsIGl0IHdvdWxkIG9ubHkgaW5jcmVhc2UgY29kZSBzaXplIGZvciBhIG1hcmdpbmFsIHdpbi4KKyAgICByZXR1cm4gd3JpdGUoU3RyLmRhdGEoKSwgU3RyLmxlbmd0aCgpKTsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgTik7CisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGxvbmcgTik7CisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgbG9uZyBOKTsKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwobG9uZyBsb25nIE4pOworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCB2b2lkICpQKTsKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwodW5zaWduZWQgaW50IE4pIHsKKyAgICByZXR1cm4gdGhpcy0+b3BlcmF0b3I8PChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihOKSk7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChpbnQgTikgeworICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KHN0YXRpY19jYXN0PGxvbmc+KE4pKTsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGRvdWJsZSBOKTsKKworICAvLy8gd3JpdGVfaGV4IC0gT3V0cHV0IFxhcmcgTiBpbiBoZXhhZGVjaW1hbCwgd2l0aG91dCBhbnkgcHJlZml4IG9yIHBhZGRpbmcuCisgIHJhd19vc3RyZWFtICZ3cml0ZV9oZXgodW5zaWduZWQgbG9uZyBsb25nIE4pOworCisgIC8vLyB3cml0ZV9lc2NhcGVkIC0gT3V0cHV0IFxhcmcgU3RyLCB0dXJuaW5nICdcXCcsICdcdCcsICdcbicsICciJywgYW5kCisgIC8vLyBhbnl0aGluZyB0aGF0IGRvZXNuJ3Qgc2F0aXNmeSBzdGQ6OmlzcHJpbnQgaW50byBhbiBlc2NhcGUgc2VxdWVuY2UuCisgIHJhd19vc3RyZWFtICZ3cml0ZV9lc2NhcGVkKFN0cmluZ1JlZiBTdHIpOworCisgIHJhd19vc3RyZWFtICZ3cml0ZSh1bnNpZ25lZCBjaGFyIEMpOworICByYXdfb3N0cmVhbSAmd3JpdGUoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSk7CisKKyAgLy8gRm9ybWF0dGVkIG91dHB1dCwgc2VlIHRoZSBmb3JtYXQoKSBmdW5jdGlvbiBpbiBTdXBwb3J0L0Zvcm1hdC5oLgorICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBmb3JtYXRfb2JqZWN0X2Jhc2UgJkZtdCk7CisKKyAgLy8vIGluZGVudCAtIEluc2VydCAnTnVtU3BhY2VzJyBzcGFjZXMuCisgIHJhd19vc3RyZWFtICZpbmRlbnQodW5zaWduZWQgTnVtU3BhY2VzKTsKKworCisgIC8vLyBDaGFuZ2VzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRleHQgdGhhdCB3aWxsIGJlIG91dHB1dCBmcm9tIHRoaXMgcG9pbnQKKyAgLy8vIGZvcndhcmQuCisgIC8vLyBAcGFyYW0gY29sb3JzIEFOU0kgY29sb3IgdG8gdXNlLCB0aGUgc3BlY2lhbCBTQVZFRENPTE9SIGNhbiBiZSB1c2VkIHRvCisgIC8vLyBjaGFuZ2Ugb25seSB0aGUgYm9sZCBhdHRyaWJ1dGUsIGFuZCBrZWVwIGNvbG9ycyB1bnRvdWNoZWQKKyAgLy8vIEBwYXJhbSBib2xkIGJvbGQvYnJpZ2h0ZXIgdGV4dCwgZGVmYXVsdCBmYWxzZQorICAvLy8gQHBhcmFtIGJnIGlmIHRydWUgY2hhbmdlIHRoZSBiYWNrZ3JvdW5kLCBkZWZhdWx0OiBjaGFuZ2UgZm9yZWdyb3VuZAorICAvLy8gQHJldHVybnMgaXRzZWxmIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGhpbiA8PCBpbnZvY2F0aW9ucworICB2aXJ0dWFsIHJhd19vc3RyZWFtICZjaGFuZ2VDb2xvcihlbnVtIENvbG9ycywgYm9vbCA9IGZhbHNlLCBib29sID0gZmFsc2UpIHsgCisgICAgcmV0dXJuICp0aGlzOyB9CisKKyAgLy8vIFJlc2V0cyB0aGUgY29sb3JzIHRvIHRlcm1pbmFsIGRlZmF1bHRzLiBDYWxsIHRoaXMgd2hlbiB5b3UgYXJlIGRvbmUKKyAgLy8vIG91dHB1dHRpbmcgY29sb3JlZCB0ZXh0LCBvciBiZWZvcmUgcHJvZ3JhbSBleGl0LgorICB2aXJ0dWFsIHJhd19vc3RyZWFtICZyZXNldENvbG9yKCkgeyByZXR1cm4gKnRoaXM7IH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoaXMgc3RyZWFtIGlzIGNvbm5lY3RlZCB0byBhICJ0dHkiIG9yCisgIC8vLyAiY29uc29sZSIgd2luZG93LiBUaGF0IGlzLCB0aGUgb3V0cHV0IHdvdWxkIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlcgorICAvLy8gcmF0aGVyIHRoYW4gYmVpbmcgcHV0IG9uIGEgcGlwZSBvciBzdG9yZWQgaW4gYSBmaWxlLgorICB2aXJ0dWFsIGJvb2wgaXNfZGlzcGxheWVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU3ViY2xhc3MgSW50ZXJmYWNlCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwcml2YXRlOgorICAvLy8gd3JpdGVfaW1wbCAtIFRoZSBpcyB0aGUgcGllY2Ugb2YgdGhlIGNsYXNzIHRoYXQgaXMgaW1wbGVtZW50ZWQKKyAgLy8vIGJ5IHN1YmNsYXNzZXMuICBUaGlzIHdyaXRlcyB0aGUgXGFyZ3MgU2l6ZSBieXRlcyBzdGFydGluZyBhdAorICAvLy8gXGFyZyBQdHIgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBvbmx5IGJlIGNhbGxlZCBhdCBhIHBvaW50IGF0IHdoaWNoIGl0IGlzCisgIC8vLyBzYWZlIGZvciB0aGUgc3ViY2xhc3MgdG8gaW5zdGFsbCBhIG5ldyBidWZmZXIgdmlhIFNldEJ1ZmZlci4KKyAgLy8vCisgIC8vLyBcYXJnIFB0ciAtIFRoZSBzdGFydCBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuLiBGb3IgYnVmZmVyZWQgc3RyZWFtcyB0aGlzCisgIC8vLyBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgorICAvLy8gXGFyZyBTaXplIC0gVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuLgorICAvLy8KKyAgLy8vIFxpbnZhcmlhbnQgeyBTaXplID4gMCB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpID0gMDsKKworICAvLyBBbiBvdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgaG9tZSBmb3IgdGhlIGNsYXNzIHZ0YWJsZS4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZSgpOworCisgIC8vLyBjdXJyZW50X3BvcyAtIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwgbm90CisgIC8vLyBjb3VudGluZyB0aGUgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgIHZpcnR1YWwgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFNldEJ1ZmZlciAtIFVzZSB0aGUgcHJvdmlkZWQgYnVmZmVyIGFzIHRoZSByYXdfb3N0cmVhbSBidWZmZXIuIFRoaXMgaXMKKyAgLy8vIGludGVuZGVkIGZvciB1c2Ugb25seSBieSBzdWJjbGFzc2VzIHdoaWNoIGNhbiBhcnJhbmdlIGZvciB0aGUgb3V0cHV0IHRvIGdvCisgIC8vLyBkaXJlY3RseSBpbnRvIHRoZSBkZXNpcmVkIG91dHB1dCBidWZmZXIsIGluc3RlYWQgb2YgYmVpbmcgY29waWVkIG9uIGVhY2gKKyAgLy8vIGZsdXNoLgorICB2b2lkIFNldEJ1ZmZlcihjaGFyICpCdWZmZXJTdGFydCwgc2l6ZV90IFNpemUpIHsKKyAgICBTZXRCdWZmZXJBbmRNb2RlKEJ1ZmZlclN0YXJ0LCBTaXplLCBFeHRlcm5hbEJ1ZmZlcik7CisgIH0KKworICAvLy8gcHJlZmVycmVkX2J1ZmZlcl9zaXplIC0gUmV0dXJuIGFuIGVmZmljaWVudCBidWZmZXIgc2l6ZSBmb3IgdGhlCisgIC8vLyB1bmRlcmx5aW5nIG91dHB1dCBtZWNoYW5pc20uCisgIHZpcnR1YWwgc2l6ZV90IHByZWZlcnJlZF9idWZmZXJfc2l6ZSgpIGNvbnN0OworCisgIC8vLyBlcnJvcl9kZXRlY3RlZCAtIFNldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYW4gb3V0cHV0IGVycm9yIGhhcworICAvLy8gYmVlbiBlbmNvdW50ZXJlZC4KKyAgdm9pZCBlcnJvcl9kZXRlY3RlZCgpIHsgRXJyb3IgPSB0cnVlOyB9CisKKyAgLy8vIGdldEJ1ZmZlclN0YXJ0IC0gUmV0dXJuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgc3RyZWFtIGJ1ZmZlciwgb3IgMAorICAvLy8gaWYgdGhlIHN0cmVhbSBpcyB1bmJ1ZmZlcmVkLgorICBjb25zdCBjaGFyICpnZXRCdWZmZXJTdGFydCgpIGNvbnN0IHsgcmV0dXJuIE91dEJ1ZlN0YXJ0OyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFByaXZhdGUgSW50ZXJmYWNlCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworcHJpdmF0ZToKKyAgLy8vIFNldEJ1ZmZlckFuZE1vZGUgLSBJbnN0YWxsIHRoZSBnaXZlbiBidWZmZXIgYW5kIG1vZGUuCisgIHZvaWQgU2V0QnVmZmVyQW5kTW9kZShjaGFyICpCdWZmZXJTdGFydCwgc2l6ZV90IFNpemUsIEJ1ZmZlcktpbmQgTW9kZSk7CisKKyAgLy8vIGZsdXNoX25vbmVtcHR5IC0gRmx1c2ggdGhlIGN1cnJlbnQgYnVmZmVyLCB3aGljaCBpcyBrbm93biB0byBiZQorICAvLy8gbm9uLWVtcHR5LiBUaGlzIG91dHB1dHMgdGhlIGN1cnJlbnRseSBidWZmZXJlZCBkYXRhIGFuZCByZXNldHMKKyAgLy8vIHRoZSBidWZmZXIgdG8gZW1wdHkuCisgIHZvaWQgZmx1c2hfbm9uZW1wdHkoKTsKKworICAvLy8gY29weV90b19idWZmZXIgLSBDb3B5IGRhdGEgaW50byB0aGUgYnVmZmVyLiBTaXplIG11c3Qgbm90IGJlCisgIC8vLyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiB1bnVzZWQgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KKyAgdm9pZCBjb3B5X3RvX2J1ZmZlcihjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGaWxlIE91dHB1dCBTdHJlYW1zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gcmF3X2ZkX29zdHJlYW0gLSBBIHJhd19vc3RyZWFtIHRoYXQgd3JpdGVzIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgorLy8vCitjbGFzcyByYXdfZmRfb3N0cmVhbSA6IHB1YmxpYyByYXdfb3N0cmVhbSB7CisgIGludCBGRDsKKyAgYm9vbCBTaG91bGRDbG9zZTsKKyAgdWludDY0X3QgcG9zOworCisgIC8vLyB3cml0ZV9pbXBsIC0gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgorICB2aXJ0dWFsIHZvaWQgd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKTsKKworICAvLy8gY3VycmVudF9wb3MgLSBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0sIG5vdAorICAvLy8gY291bnRpbmcgdGhlIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICB2aXJ0dWFsIHVpbnQ2NF90IGN1cnJlbnRfcG9zKCkgY29uc3QgeyByZXR1cm4gcG9zOyB9CisKKyAgLy8vIHByZWZlcnJlZF9idWZmZXJfc2l6ZSAtIERldGVybWluZSBhbiBlZmZpY2llbnQgYnVmZmVyIHNpemUuCisgIHZpcnR1YWwgc2l6ZV90IHByZWZlcnJlZF9idWZmZXJfc2l6ZSgpIGNvbnN0OworCitwdWJsaWM6CisKKyAgZW51bSB7CisgICAgLy8vIEZfRXhjbCAtIFdoZW4gb3BlbmluZyBhIGZpbGUsIHRoaXMgZmxhZyBtYWtlcyByYXdfZmRfb3N0cmVhbQorICAgIC8vLyByZXBvcnQgYW4gZXJyb3IgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMuCisgICAgRl9FeGNsICA9IDEsCisKKyAgICAvLy8gRl9BcHBlbmQgLSBXaGVuIG9wZW5pbmcgYSBmaWxlLCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBhcHBlbmQgdG8gdGhlCisgICAgLy8vIGV4aXN0aW5nIGZpbGUgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IuICBUaGlzIG1heSBub3QgYmUgc3BlY2lmaWVkCisgICAgLy8vIHdpdGggRl9FeGNsLgorICAgIEZfQXBwZW5kID0gMiwKKworICAgIC8vLyBGX0JpbmFyeSAtIFRoZSBmaWxlIHNob3VsZCBiZSBvcGVuZWQgaW4gYmluYXJ5IG1vZGUgb24gcGxhdGZvcm1zIHRoYXQKKyAgICAvLy8gbWFrZSB0aGlzIGRpc3RpbmN0aW9uLgorICAgIEZfQmluYXJ5ID0gNAorICB9OworCisgIC8vLyByYXdfZmRfb3N0cmVhbSAtIE9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIGZvciB3cml0aW5nLiBJZiBhbiBlcnJvciBvY2N1cnMsCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgaXMgcHV0IGludG8gRXJyb3JJbmZvLCBhbmQgdGhlIHN0cmVhbSBzaG91bGQKKyAgLy8vIGJlIGltbWVkaWF0ZWx5IGRlc3Ryb3llZDsgdGhlIHN0cmluZyB3aWxsIGJlIGVtcHR5IGlmIG5vIGVycm9yIG9jY3VycmVkLgorICAvLy8gVGhpcyBhbGxvd3Mgb3B0aW9uYWwgZmxhZ3MgdG8gY29udHJvbCBob3cgdGhlIGZpbGUgd2lsbCBiZSBvcGVuZWQuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGVuYW1lIC0gVGhlIGZpbGUgdG8gb3Blbi4gSWYgdGhpcyBpcyAiLSIgdGhlbiB0aGUKKyAgLy8vIHN0cmVhbSB3aWxsIHVzZSBzdGRvdXQgaW5zdGVhZC4KKyAgcmF3X2ZkX29zdHJlYW0oY29uc3QgY2hhciAqRmlsZW5hbWUsIHN0ZDo6c3RyaW5nICZFcnJvckluZm8sCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzID0gMCk7CisKKyAgLy8vIHJhd19mZF9vc3RyZWFtIGN0b3IgLSBGRCBpcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRoYXQgdGhpcyB3cml0ZXMgdG8uICBJZgorICAvLy8gU2hvdWxkQ2xvc2UgaXMgdHJ1ZSwgdGhpcyBjbG9zZXMgdGhlIGZpbGUgd2hlbiB0aGUgc3RyZWFtIGlzIGRlc3Ryb3llZC4KKyAgcmF3X2ZkX29zdHJlYW0oaW50IGZkLCBib29sIHNob3VsZENsb3NlLAorICAgICAgICAgICAgICAgICBib29sIHVuYnVmZmVyZWQ9ZmFsc2UpIDogcmF3X29zdHJlYW0odW5idWZmZXJlZCksIEZEKGZkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3VsZENsb3NlKHNob3VsZENsb3NlKSB7fQorCisgIH5yYXdfZmRfb3N0cmVhbSgpOworCisgIC8vLyBjbG9zZSAtIE1hbnVhbGx5IGZsdXNoIHRoZSBzdHJlYW0gYW5kIGNsb3NlIHRoZSBmaWxlLgorICB2b2lkIGNsb3NlKCk7CisKKyAgLy8vIHNlZWsgLSBGbHVzaGVzIHRoZSBzdHJlYW0gYW5kIHJlcG9zaXRpb25zIHRoZSB1bmRlcmx5aW5nIGZpbGUgZGVzY3JpcHRvcgorICAvLy8gIHBvc2l0aXRpb24gdG8gdGhlIG9mZnNldCBzcGVjaWZpZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICB1aW50NjRfdCBzZWVrKHVpbnQ2NF90IG9mZik7CisKKyAgdmlydHVhbCByYXdfb3N0cmVhbSAmY2hhbmdlQ29sb3IoZW51bSBDb2xvcnMgY29sb3JzLCBib29sIGJvbGQ9ZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmc9ZmFsc2UpOworICB2aXJ0dWFsIHJhd19vc3RyZWFtICZyZXNldENvbG9yKCk7CisKKyAgdmlydHVhbCBib29sIGlzX2Rpc3BsYXllZCgpIGNvbnN0OworfTsKKworLy8vIHJhd19zdGRvdXRfb3N0cmVhbSAtIFRoaXMgaXMgYSBzdHJlYW0gdGhhdCBhbHdheXMgcHJpbnRzIHRvIHN0ZG91dC4KKy8vLworY2xhc3MgcmF3X3N0ZG91dF9vc3RyZWFtIDogcHVibGljIHJhd19mZF9vc3RyZWFtIHsKKyAgLy8gQW4gb3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhIGhvbWUgZm9yIHRoZSBjbGFzcyB2dGFibGUuCisgIHZpcnR1YWwgdm9pZCBoYW5kbGUoKTsKK3B1YmxpYzoKKyAgcmF3X3N0ZG91dF9vc3RyZWFtKCk7Cit9OworCisvLy8gcmF3X3N0ZGVycl9vc3RyZWFtIC0gVGhpcyBpcyBhIHN0cmVhbSB0aGF0IGFsd2F5cyBwcmludHMgdG8gc3RkZXJyLgorLy8vCitjbGFzcyByYXdfc3RkZXJyX29zdHJlYW0gOiBwdWJsaWMgcmF3X2ZkX29zdHJlYW0geworICAvLyBBbiBvdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgaG9tZSBmb3IgdGhlIGNsYXNzIHZ0YWJsZS4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZSgpOworcHVibGljOgorICByYXdfc3RkZXJyX29zdHJlYW0oKTsKK307CisKKy8vLyBvdXRzKCkgLSBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSByYXdfb3N0cmVhbSBmb3Igc3RhbmRhcmQgb3V0cHV0LgorLy8vIFVzZSBpdCBsaWtlOiBvdXRzKCkgPDwgImZvbyIgPDwgImJhciI7CityYXdfb3N0cmVhbSAmb3V0cygpOworCisvLy8gZXJycygpIC0gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgcmF3X29zdHJlYW0gZm9yIHN0YW5kYXJkIGVycm9yLgorLy8vIFVzZSBpdCBsaWtlOiBlcnJzKCkgPDwgImZvbyIgPDwgImJhciI7CityYXdfb3N0cmVhbSAmZXJycygpOworCisvLy8gbnVsbHMoKSAtIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHJhd19vc3RyZWFtIHdoaWNoIHNpbXBseSBkaXNjYXJkcworLy8vIG91dHB1dC4KK3Jhd19vc3RyZWFtICZudWxscygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gT3V0cHV0IFN0cmVhbSBBZGFwdG9ycworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIHJhd19zdHJpbmdfb3N0cmVhbSAtIEEgcmF3X29zdHJlYW0gdGhhdCB3cml0ZXMgdG8gYW4gc3RkOjpzdHJpbmcuICBUaGlzIGlzIGEKKy8vLyBzaW1wbGUgYWRhcHRvciBjbGFzcy4gVGhpcyBjbGFzcyBkb2VzIG5vdCBlbmNvdW50ZXIgb3V0cHV0IGVycm9ycy4KK2NsYXNzIHJhd19zdHJpbmdfb3N0cmVhbSA6IHB1YmxpYyByYXdfb3N0cmVhbSB7CisgIHN0ZDo6c3RyaW5nICZPUzsKKworICAvLy8gd3JpdGVfaW1wbCAtIFNlZSByYXdfb3N0cmVhbTo6d3JpdGVfaW1wbC4KKyAgdmlydHVhbCB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSk7CisKKyAgLy8vIGN1cnJlbnRfcG9zIC0gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLCBub3QKKyAgLy8vIGNvdW50aW5nIHRoZSBieXRlcyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlci4KKyAgdmlydHVhbCB1aW50NjRfdCBjdXJyZW50X3BvcygpIGNvbnN0IHsgcmV0dXJuIE9TLnNpemUoKTsgfQorcHVibGljOgorICBleHBsaWNpdCByYXdfc3RyaW5nX29zdHJlYW0oc3RkOjpzdHJpbmcgJk8pIDogT1MoTykge30KKyAgfnJhd19zdHJpbmdfb3N0cmVhbSgpOworCisgIC8vLyBzdHIgLSBGbHVzaGVzIHRoZSBzdHJlYW0gY29udGVudHMgdG8gdGhlIHRhcmdldCBzdHJpbmcgYW5kIHJldHVybnMKKyAgLy8vICB0aGUgc3RyaW5nJ3MgcmVmZXJlbmNlLgorICBzdGQ6OnN0cmluZyYgc3RyKCkgeworICAgIGZsdXNoKCk7CisgICAgcmV0dXJuIE9TOworICB9Cit9OworCisvLy8gcmF3X3N2ZWN0b3Jfb3N0cmVhbSAtIEEgcmF3X29zdHJlYW0gdGhhdCB3cml0ZXMgdG8gYW4gU21hbGxWZWN0b3Igb3IKKy8vLyBTbWFsbFN0cmluZy4gIFRoaXMgaXMgYSBzaW1wbGUgYWRhcHRvciBjbGFzcy4gVGhpcyBjbGFzcyBkb2VzIG5vdAorLy8vIGVuY291bnRlciBvdXRwdXQgZXJyb3JzLgorY2xhc3MgcmF3X3N2ZWN0b3Jfb3N0cmVhbSA6IHB1YmxpYyByYXdfb3N0cmVhbSB7CisgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT1M7CisKKyAgLy8vIHdyaXRlX2ltcGwgLSBTZWUgcmF3X29zdHJlYW06OndyaXRlX2ltcGwuCisgIHZpcnR1YWwgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpOworCisgIC8vLyBjdXJyZW50X3BvcyAtIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwgbm90CisgIC8vLyBjb3VudGluZyB0aGUgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgIHZpcnR1YWwgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdDsKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdCBhIG5ldyByYXdfc3ZlY3Rvcl9vc3RyZWFtLgorICAvLy8KKyAgLy8vIFxhcmcgTyAtIFRoZSB2ZWN0b3IgdG8gd3JpdGUgdG87IHRoaXMgc2hvdWxkIGdlbmVyYWxseSBoYXZlIGF0IGxlYXN0IDEyOAorICAvLy8gYnl0ZXMgZnJlZSB0byBhdm9pZCBhbnkgZXh0cmFuZW91cyBtZW1vcnkgb3ZlcmhlYWQuCisgIGV4cGxpY2l0IHJhd19zdmVjdG9yX29zdHJlYW0oU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPKTsKKyAgfnJhd19zdmVjdG9yX29zdHJlYW0oKTsKKworICAvLy8gcmVzeW5jIC0gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgU21hbGxWZWN0b3Igd2UncmUgYXBwZW5kaW5nIHRvIGlzIGNoYW5nZWQKKyAgLy8vIG91dHNpZGUgb2YgdGhlIHJhd19zdmVjdG9yX29zdHJlYW0ncyBjb250cm9sLiAgSXQgaXMgb25seSBzYWZlIHRvIGRvIHRoaXMKKyAgLy8vIGlmIHRoZSByYXdfc3ZlY3Rvcl9vc3RyZWFtIGhhcyBwcmV2aW91c2x5IGJlZW4gZmx1c2hlZC4KKyAgdm9pZCByZXN5bmMoKTsKKyAgCisgIC8vLyBzdHIgLSBGbHVzaGVzIHRoZSBzdHJlYW0gY29udGVudHMgdG8gdGhlIHRhcmdldCB2ZWN0b3IgYW5kIHJldHVybiBhCisgIC8vLyBTdHJpbmdSZWYgZm9yIHRoZSB2ZWN0b3IgY29udGVudHMuCisgIFN0cmluZ1JlZiBzdHIoKTsKK307CisKKy8vLyByYXdfbnVsbF9vc3RyZWFtIC0gQSByYXdfb3N0cmVhbSB0aGF0IGRpc2NhcmRzIGFsbCBvdXRwdXQuCitjbGFzcyByYXdfbnVsbF9vc3RyZWFtIDogcHVibGljIHJhd19vc3RyZWFtIHsKKyAgLy8vIHdyaXRlX2ltcGwgLSBTZWUgcmF3X29zdHJlYW06OndyaXRlX2ltcGwuCisgIHZpcnR1YWwgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IHNpemUpOworCisgIC8vLyBjdXJyZW50X3BvcyAtIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwgbm90CisgIC8vLyBjb3VudGluZyB0aGUgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgIHZpcnR1YWwgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdDsKKworcHVibGljOgorICBleHBsaWNpdCByYXdfbnVsbF9vc3RyZWFtKCkge30KKyAgfnJhd19udWxsX29zdHJlYW0oKTsKK307CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1Mjk1YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCAtIFNpbXBsZmllZCB0eXBlIHRyYWl0cyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgdGVtcGxhdGUgY2xhc3MgdGhhdCBkZXRlcm1pbmVzIGlmIGEgdHlwZSBpcyBhIGNsYXNzIG9yCisvLyBub3QuIFRoZSBiYXNpYyBtZWNoYW5pc20sIGJhc2VkIG9uIHVzaW5nIHRoZSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiBvZgorLy8gYSB6ZXJvIGFyZ3VtZW50IHRvIGEgZnVuY3Rpb24gd2FzICJib29zdGVkIiBmcm9tIHRoZSBib29zdCB0eXBlX3RyYWl0cworLy8gbGlicmFyeS4gU2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLyBmb3IgYWxsIHRoZSBnb3J5IGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVFlQRV9UUkFJVFNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVFlQRV9UUkFJVFNfSAorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworLy8gVGhpcyBpcyBhY3R1YWxseSB0aGUgY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbiB3aGljaCB3b3JrcyB3aXRoIGFic3RyYWN0CisvLyBjbGFzc2VzLiAgSG93ZXZlciwgZW5vdWdoIGNvbXBpbGVycyBoYXZlIHRyb3VibGUgd2l0aCBpdCB0aGF0IG1vc3Qgd2lsbCB1c2UKKy8vIHRoZSBvbmUgaW4gYm9vc3QvdHlwZV90cmFpdHMvb2JqZWN0X3RyYWl0cy5ocHAuIFRoaXMgaW1wbGVtZW50YXRpb24gYWN0dWFsbHkKKy8vIHdvcmtzIHdpdGggVkM3LjAsIGJ1dCBvdGhlciBpbnRlcmFjdGlvbnMgc2VlbSB0byBmYWlsIHdoZW4gd2UgdXNlIGl0LgorCituYW1lc3BhY2UgbGx2bSB7CisgIAorbmFtZXNwYWNlIGRvbnRfdXNlCit7CisgICAgLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBzaG91bGQgbmV2ZXIgYmUgdXNlZC4gVGhleSBhcmUgaGVscGVycyB0bworICAgIC8vIHRoZSBpc19jbGFzcyB0ZW1wbGF0ZSBiZWxvdy4gVGhleSBjYW5ub3QgYmUgbG9jYXRlZCBpbnNpZGUKKyAgICAvLyBpc19jbGFzcyBiZWNhdXNlIGRvaW5nIHNvIGNhdXNlcyBhdCBsZWFzdCBHQ0MgdG8gdGhpbmsgdGhhdAorICAgIC8vIHRoZSB2YWx1ZSBvZiB0aGUgInZhbHVlIiBlbnVtZXJhdG9yIGlzIG5vdCBjb25zdGFudC4gUGxhY2luZworICAgIC8vIHRoZW0gb3V0IGhlcmUgKGZvciBzb21lIHN0cmFuZ2UgcmVhc29uKSBhbGxvd3MgdGhlIHNpemVvZgorICAgIC8vIG9wZXJhdG9yIGFnYWluc3QgdGhlbSB0byBtYWdpY2FsbHkgYmUgY29uc3RhbnQuIFRoaXMgaXMKKyAgICAvLyBpbXBvcnRhbnQgdG8gbWFrZSB0aGUgaXNfY2xhc3M8VD46OnZhbHVlIGlkaW9tIHplcm8gY29zdC4gaXQKKyAgICAvLyBldmFsdWF0ZXMgdG8gYSBjb25zdGFudCAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCisgICAgLy8gcGFyYW1ldGVyIFQgaXMgYSBjbGFzcyBvciBub3QgKHJlc3BlY3RpdmVseSkuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2hhciBpc19jbGFzc19oZWxwZXIodm9pZChUOjoqKSgpKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBkb3VibGUgaXNfY2xhc3NfaGVscGVyKC4uLik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX2NsYXNzCit7CisgIC8vIGlzX2NsYXNzPD4gbWV0YWZ1bmN0aW9uIGR1ZSB0byBQYXVsIE1lbnNvbmlkZXMgKGxlYXZpbmdzQGF0dGJpLmNvbSkuIEZvcgorICAvLyBtb3JlIGRldGFpbHM6CisgIC8vIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cHM/aGw9ZW4mc2VsbT0wMDAwMDFjMWNjODMlMjRlMTU0ZDVlMCUyNDc3NzJlNTBjJTQwYzE2MTU1MGEmcm51bT0xCisgcHVibGljOgorICAgIGVudW0geyB2YWx1ZSA9IHNpemVvZihjaGFyKSA9PSBzaXplb2YoZG9udF91c2U6OmlzX2NsYXNzX2hlbHBlcjxUPigwKSkgfTsKK307CisgIAorICAKKy8vLyBpc1BvZExpa2UgLSBUaGlzIGlzIGEgdHlwZSB0cmFpdCB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbgorLy8vIHR5cGUgY2FuIGJlIGNvcGllZCBhcm91bmQgd2l0aCBtZW1jcHkgaW5zdGVhZCBvZiBydW5uaW5nIGN0b3JzIGV0Yy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzUG9kTGlrZSB7CisgIC8vIElmIHdlIGRvbid0IGtub3cgYW55dGhpbmcgZWxzZSwgd2UgY2FuIChhdCBsZWFzdCkgYXNzdW1lIHRoYXQgYWxsIG5vbi1jbGFzcworICAvLyB0eXBlcyBhcmUgUE9Ecy4KKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSAhaXNfY2xhc3M8VD46OnZhbHVlOworfTsKKworLy8gc3RkOjpwYWlyJ3MgYXJlIHBvZC1saWtlIGlmIHRoZWlyIGVsZW1lbnRzIGFyZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgaXNQb2RMaWtlPHN0ZDo6cGFpcjxULCBVPiA+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBpc1BvZExpa2U8VD46OnZhbHVlICYgaXNQb2RMaWtlPFU+Ojp2YWx1ZTsKK307CisgIAorCisvLy8gXGJyaWVmIE1ldGFmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgdHdvIGdpdmVuIHR5cGVzIGFyZSAKKy8vLyBlcXVpdmFsZW50LgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBpc19zYW1lIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfc2FtZTxULCBUPiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisgIAorLy8gZW5hYmxlX2lmX2MgLSBFbmFibGUvZGlzYWJsZSBhIHRlbXBsYXRlIGJhc2VkIG9uIGEgbWV0YWZ1bmN0aW9uCit0ZW1wbGF0ZTxib29sIENvbmQsIHR5cGVuYW1lIFQgPSB2b2lkPgorc3RydWN0IGVuYWJsZV9pZl9jIHsKKyAgdHlwZWRlZiBUIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgZW5hYmxlX2lmX2M8ZmFsc2UsIFQ+IHsgfTsKKyAgCisvLyBlbmFibGVfaWYgLSBFbmFibGUvZGlzYWJsZSBhIHRlbXBsYXRlIGJhc2VkIG9uIGEgbWV0YWZ1bmN0aW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBDb25kLCB0eXBlbmFtZSBUID0gdm9pZD4KK3N0cnVjdCBlbmFibGVfaWYgOiBwdWJsaWMgZW5hYmxlX2lmX2M8Q29uZDo6dmFsdWUsIFQ+IHsgfTsKKworbmFtZXNwYWNlIGRvbnRfdXNlIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzZT4gY2hhciBiYXNlX29mX2hlbHBlcihjb25zdCB2b2xhdGlsZSBCYXNlKik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2U+IGRvdWJsZSBiYXNlX29mX2hlbHBlciguLi4pOworfQorCisvLy8gaXNfYmFzZV9vZiAtIE1ldGFmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBvbmUgdHlwZSBpcyBhIGJhc2UgY2xhc3Mgb2YKKy8vLyAob3IgaWRlbnRpY2FsIHRvKSBhbm90aGVyIHR5cGUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNlLCB0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGlzX2Jhc2Vfb2YgeworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSAKKyAgICA9IGlzX2NsYXNzPEJhc2U+Ojp2YWx1ZSAmJiBpc19jbGFzczxEZXJpdmVkPjo6dmFsdWUgJiYKKyAgICAgIHNpemVvZihjaGFyKSA9PSBzaXplb2YoZG9udF91c2U6OmJhc2Vfb2ZfaGVscGVyPEJhc2U+KChEZXJpdmVkKikwKSk7Cit9OworCisvLyByZW1vdmVfcG9pbnRlciAtIE1ldGFmdW5jdGlvbiB0byB0dXJuIEZvbyogaW50byBGb28uICBEZWZpbmVkIGluCisvLyBDKysweCBbbWV0YS50cmFucy5wdHJdLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcG9pbnRlciB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcG9pbnRlcjxUKj4geyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX3BvaW50ZXI8VCpjb25zdD4geyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX3BvaW50ZXI8VCp2b2xhdGlsZT4geyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX3BvaW50ZXI8VCpjb25zdCB2b2xhdGlsZT4geworICAgIHR5cGVkZWYgVCB0eXBlOyB9OworCit0ZW1wbGF0ZSA8Ym9vbCwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgRj4KK3N0cnVjdCBjb25kaXRpb25hbCB7IHR5cGVkZWYgVCB0eXBlOyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRj4KK3N0cnVjdCBjb25kaXRpb25hbDxmYWxzZSwgVCwgRj4geyB0eXBlZGVmIEYgdHlwZTsgfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWE0ZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5bWJvbFRhYmxlTGlzdFRyYWl0cy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vPT09LS0gbGx2bS9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaCAtIFRyYWl0cyBmb3IgaXBsaXN0IC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBnZW5lcmljIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGF1dG9tYXRpYworLy8gc3ltYm9sIHRhYmxlIG1hbmlwdWxhdGlvbiB0aGF0IG9jY3VycyB3aGVuIHlvdSBwdXQgKGZvciBleGFtcGxlKSBhIG5hbWVkCisvLyBpbnN0cnVjdGlvbiBpbnRvIGEgYmFzaWMgYmxvY2suCisvLworLy8gVGhlIHdheSB0aGF0IHRoaXMgaXMgaW1wbGVtZW50ZWQgaXMgYnkgdXNpbmcgYSBzcGVjaWFsIHRyYWl0cyBjbGFzcyB3aXRoIHRoZQorLy8gaW50cnVzaXZlIGxpc3QgdGhhdCBtYWtlcyB1cCB0aGUgbGlzdCBvZiBpbnN0cnVjdGlvbnMgaW4gYSBiYXNpYyBibG9jay4gIFdoZW4KKy8vIGEgbmV3IGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zLCB0aGUgdHJhaXRzIGNsYXNzIGlzCisvLyBub3RpZmllZCwgYWxsb3dpbmcgdGhlIHN5bWJvbCB0YWJsZSB0byBiZSB1cGRhdGVkLgorLy8KKy8vIFRoaXMgZ2VuZXJpYyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB0cmFpdHMgY2xhc3MuICBJdCBtdXN0IGJlIGdlbmVyaWMgc28gdGhhdAorLy8gaXQgY2FuIHdvcmsgZm9yIGFsbCB1c2VzIGl0LCB3aGljaCBpbmNsdWRlIGxpc3RzIG9mIGluc3RydWN0aW9ucywgYmFzaWMKKy8vIGJsb2NrcywgYXJndW1lbnRzLCBmdW5jdGlvbnMsIGdsb2JhbCB2YXJpYWJsZXMsIGV0Yy4uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWU1CT0xUQUJMRUxJU1RUUkFJVFNfSAorI2RlZmluZSBMTFZNX1NZTUJPTFRBQkxFTElTVFRSQUlUU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBWYWx1ZVN5bWJvbFRhYmxlOworICAKK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVUeT4gY2xhc3MgaWxpc3RfaXRlcmF0b3I7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlVHksIHR5cGVuYW1lIFRyYWl0cz4gY2xhc3MgaXBsaXN0OwordGVtcGxhdGU8dHlwZW5hbWUgVHk+IHN0cnVjdCBpbGlzdF90cmFpdHM7CisKKy8vIFZhbHVlU3ViQ2xhc3MgICAtIFRoZSB0eXBlIG9mIG9iamVjdHMgdGhhdCBJIGhvbGQsIGUuZy4gSW5zdHJ1Y3Rpb24uCisvLyBJdGVtUGFyZW50Q2xhc3MgLSBUaGUgdHlwZSBvZiBvYmplY3QgdGhhdCBvd25zIHRoZSBsaXN0LCBlLmcuIEJhc2ljQmxvY2suCisvLwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVTdWJDbGFzcywgdHlwZW5hbWUgSXRlbVBhcmVudENsYXNzPgorY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzIDogcHVibGljIGlsaXN0X2RlZmF1bHRfdHJhaXRzPFZhbHVlU3ViQ2xhc3M+IHsKKyAgdHlwZWRlZiBpbGlzdF90cmFpdHM8VmFsdWVTdWJDbGFzcz4gVHJhaXRzQ2xhc3M7CitwdWJsaWM6CisgIFN5bWJvbFRhYmxlTGlzdFRyYWl0cygpIHt9CisKKyAgLy8vIGdldExpc3RPd25lciAtIFJldHVybiB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGlzIGxpc3QuICBJZiB0aGlzIGlzIGEgbGlzdAorICAvLy8gb2YgaW5zdHJ1Y3Rpb25zLCBpdCByZXR1cm5zIHRoZSBCYXNpY0Jsb2NrIHRoYXQgb3ducyB0aGVtLgorICBJdGVtUGFyZW50Q2xhc3MgKmdldExpc3RPd25lcigpIHsKKyAgICB0eXBlZGVmIGlwbGlzdDxWYWx1ZVN1YkNsYXNzPiBJdGVtUGFyZW50Q2xhc3M6OipTdWJsaXN0OworICAgIHNpemVfdCBPZmZzZXQoc2l6ZV90KCYoKEl0ZW1QYXJlbnRDbGFzcyopMC0+Kkl0ZW1QYXJlbnRDbGFzczo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdWJsaXN0QWNjZXNzKHN0YXRpY19jYXN0PFZhbHVlU3ViQ2xhc3MqPigwKSkpKSk7CisgICAgaXBsaXN0PFZhbHVlU3ViQ2xhc3M+KiBBbmNob3Ioc3RhdGljX2Nhc3Q8aXBsaXN0PFZhbHVlU3ViQ2xhc3M+Kj4odGhpcykpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEl0ZW1QYXJlbnRDbGFzcyo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KEFuY2hvciktCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0KTsKKyAgfQorCisgIHN0YXRpYyBpcGxpc3Q8VmFsdWVTdWJDbGFzcz4gJmdldExpc3QoSXRlbVBhcmVudENsYXNzICpQYXIpIHsKKyAgICByZXR1cm4gUGFyLT4qKFBhci0+Z2V0U3VibGlzdEFjY2VzcygoVmFsdWVTdWJDbGFzcyopMCkpOworICB9CisKKyAgc3RhdGljIFZhbHVlU3ltYm9sVGFibGUgKmdldFN5bVRhYihJdGVtUGFyZW50Q2xhc3MgKlBhcikgeworICAgIHJldHVybiBQYXIgPyB0b1B0cihQYXItPmdldFZhbHVlU3ltYm9sVGFibGUoKSkgOiAwOworICB9CisKKyAgdm9pZCBhZGROb2RlVG9MaXN0KFZhbHVlU3ViQ2xhc3MgKlYpOworICB2b2lkIHJlbW92ZU5vZGVGcm9tTGlzdChWYWx1ZVN1YkNsYXNzICpWKTsKKyAgdm9pZCB0cmFuc2Zlck5vZGVzRnJvbUxpc3QoaWxpc3RfdHJhaXRzPFZhbHVlU3ViQ2xhc3M+ICZMMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWxpc3RfaXRlcmF0b3I8VmFsdWVTdWJDbGFzcz4gZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsaXN0X2l0ZXJhdG9yPFZhbHVlU3ViQ2xhc3M+IGxhc3QpOworLy9wcml2YXRlOgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUUHRyPgorICB2b2lkIHNldFN5bVRhYk9iamVjdChUUHRyICosIFRQdHIpOworICBzdGF0aWMgVmFsdWVTeW1ib2xUYWJsZSAqdG9QdHIoVmFsdWVTeW1ib2xUYWJsZSAqUCkgeyByZXR1cm4gUDsgfQorICBzdGF0aWMgVmFsdWVTeW1ib2xUYWJsZSAqdG9QdHIoVmFsdWVTeW1ib2xUYWJsZSAmUikgeyByZXR1cm4gJlI7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9BSVhEYXRhVHlwZXNGaXguaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vQUlYRGF0YVR5cGVzRml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiZjAyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vQUlYRGF0YVR5cGVzRml4LmgKQEAgLTAsMCArMSwyNSBAQAorLy89PT0tLSBsbHZtL1N5c3RlbS9BSVhEYXRhVHlwZXNGaXguaCAtIEZpeCBkYXRhdHlwZSBkZWZzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBvdmVycmlkZXMgZGVmYXVsdCBzeXN0ZW0tZGVmaW5lZCB0eXBlcyBhbmQgbGltaXRzIHdoaWNoIGNhbm5vdCBiZQorLy8gZG9uZSBpbiBEYXRhVHlwZXMuaC5pbiBiZWNhdXNlIGl0IGlzIHByb2Nlc3NlZCBieSBhdXRvaGVhZGVyIGZpcnN0LCB3aGljaAorLy8gY29tbWVudHMgb3V0IGFueSAjdW5kZWYgc3RhdGVtZW50CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gTm8gaW5jbHVkZSBndWFyZHMgZGVzaXJlZCEKKworI2lmbmRlZiBTVVBQT1JUX0RBVEFUWVBFU19ICisjZXJyb3IgIkFJWERhdGFUeXBlc0ZpeC5oIG11c3Qgb25seSBiZSBpbmNsdWRlZCB2aWEgRGF0YVR5cGVzLmghIgorI2VuZGlmCisKKy8vIEdDQyBpcyBzdHJpY3QgYWJvdXQgZGVmaW5pbmcgbGFyZ2UgY29uc3RhbnRzOiB0aGV5IG11c3QgaGF2ZSBMTCBtb2RpZmllci4KKy8vIFRoZXNlIHdpbGwgYmUgZGVmaW5lZCBwcm9wZXJseSBhdCB0aGUgZW5kIG9mIERhdGFUeXBlcy5oCisjdW5kZWYgSU5UNjRfTUFYCisjdW5kZWYgSU5UNjRfTUlOCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL0FsYXJtLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL0FsYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyODQxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vQWxhcm0uaApAQCAtMCwwICsxLDUxIEBACisvLz09PS0gbGx2bS9TeXN0ZW0vQWxhcm0uaCAtIEFsYXJtIEdlbmVyYXRpb24gc3VwcG9ydCAgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBvcGVyYXRpbmcgc3lzdGVtIGluZGVwZW5kZW50IGludGVyZmFjZSB0byBhbGFybSgyKQorLy8gdHlwZSBmdW5jdGlvbmFsaXR5LiBUaGUgQWxhcm0gY2xhc3MgYWxsb3dzIGEgb25lLXNob3QgYWxhcm0gdG8gYmUgc2V0IHVwCisvLyBhdCBzb21lIG51bWJlciBvZiBzZWNvbmRzIGluIHRoZSBmdXR1cmUuIFdoZW4gdGhlIGFsYXJtIHRyaWdnZXJzLCBhIG1ldGhvZAorLy8gaXMgY2FsbGVkIHRvIHByb2Nlc3MgdGhlIGV2ZW50CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NZU1RFTV9BTEFSTV9ICisjZGVmaW5lIExMVk1fU1lTVEVNX0FMQVJNX0gKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGFuIGFsYXJtIHRvIHRyaWdnZXIgc29tZSBudW1iZXIgb2YgXHAgc2Vjb25kcyBpbgorICAvLy8gdGhlIGZ1dHVyZS4gV2hlbiB0aGF0IHRpbWUgYXJyaXZlcywgdGhlIEFsYXJtU3RhdHVzIGZ1bmN0aW9uIHdpbGwgYmVnaW4KKyAgLy8vIHRvIHJldHVybiAxIGluc3RlYWQgb2YgMC4gVGhlIHVzZXIgbXVzdCBwb2xsIHRoZSBzdGF0dXMgb2YgdGhlIGFsYXJtIGJ5CisgIC8vLyBtYWtpbmcgb2NjYXNpb25hbCBjYWxscyB0byBBbGFybVN0YXR1cy4gSWYgdGhlIHVzZXIgc2VuZHMgYW4gaW50ZXJydXB0CisgIC8vLyBzaWduYWwsIEFsYXJtU3RhdHVzIHdpbGwgYmVnaW4gcmV0dXJuaW5nIC0xLCBldmVuIGlmIHRoZSBhbGFybSBldmVudAorICAvLy8gb2NjdXJyZWQuCisgIC8vLyBAcmV0dXJucyBub3RoaW5nCisgIHZvaWQgU2V0dXBBbGFybSgKKyAgICB1bnNpZ25lZCBzZWNvbmRzIC8vLzwgTnVtYmVyIG9mIHNlY29uZHMgaW4gZnV0dXJlIHdoZW4gYWxhcm0gYXJyaXZlcworICApOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgdGhlIGFsYXJtIHByZXZpb3VzbHkgc2V0IHVwCisgIC8vLyBAcmV0dXJucyBub3RoaW5nCisgIHZvaWQgVGVybWluYXRlQWxhcm0oKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBhY3F1aXJlcyB0aGUgc3RhdHVzIG9mIHRoZSBhbGFybS4KKyAgLy8vIEByZXR1cm5zIC0xPWNhbmNlbGxlZCwgMD11bnRyaWdnZXJlZCwgMT10cmlnZ2VyZWQKKyAgaW50IEFsYXJtU3RhdHVzKCk7CisKKyAgLy8vIFNsZWVwIGZvciBuIHNlY29uZHMuIFdhcm5pbmc6IG1peGluZyBjYWxscyB0byBTbGVlcCgpIGFuZCBvdGhlciAqQWxhcm0KKyAgLy8vIGNhbGxzIG1heSBiZSBhIGJhZCBpZGVhIG9uIHNvbWUgcGxhdGZvcm1zIChzb3VyY2U6IExpbnV4IG1hbiBwYWdlKS4KKyAgLy8vIEByZXR1cm5zIG5vdGhpbmcuCisgIHZvaWQgU2xlZXAodW5zaWduZWQgbik7CisKKworfSAvLyBFbmQgc3lzIG5hbWVzcGFjZQorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL0F0b21pYy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9BdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzE5MzY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9BdG9taWMuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0gbGx2bS9TeXN0ZW0vQXRvbWljLmggLSBBdG9taWMgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzIGF0b21pYyBvcGVyYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWVNURU1fQVRPTUlDX0gKKyNkZWZpbmUgTExWTV9TWVNURU1fQVRPTUlDX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIG5hbWVzcGFjZSBzeXMgeworICAgIHZvaWQgTWVtb3J5RmVuY2UoKTsKKworI2lmZGVmIF9NU0NfVkVSCisgICAgdHlwZWRlZiBsb25nIGNhc19mbGFnOworI2Vsc2UKKyAgICB0eXBlZGVmIHVpbnQzMl90IGNhc19mbGFnOworI2VuZGlmCisgICAgY2FzX2ZsYWcgQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgY2FzX2ZsYWcqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNfZmxhZyBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzX2ZsYWcgb2xkX3ZhbHVlKTsKKyAgICBjYXNfZmxhZyBBdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgY2FzX2ZsYWcqIHB0cik7CisgICAgY2FzX2ZsYWcgQXRvbWljRGVjcmVtZW50KHZvbGF0aWxlIGNhc19mbGFnKiBwdHIpOworICAgIGNhc19mbGFnIEF0b21pY0FkZCh2b2xhdGlsZSBjYXNfZmxhZyogcHRyLCBjYXNfZmxhZyB2YWwpOworICAgIGNhc19mbGFnIEF0b21pY011bCh2b2xhdGlsZSBjYXNfZmxhZyogcHRyLCBjYXNfZmxhZyB2YWwpOworICAgIGNhc19mbGFnIEF0b21pY0Rpdih2b2xhdGlsZSBjYXNfZmxhZyogcHRyLCBjYXNfZmxhZyB2YWwpOworICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9EYXRhVHlwZXMuaC5jbWFrZSBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmZTc1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmguY21ha2UKQEAgLTAsMCArMSwxODkgQEAKKy8qPT09LS0gaW5jbHVkZS9TeXN0ZW0vRGF0YVR5cGVzLmggLSBEZWZpbmUgZml4ZWQgc2l6ZSB0eXBlcyAtLS0tLSotIEMgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIHRvIGZpZ3VyZSBvdXQgdGhlIHNpemUgb2YgX0hPU1RfIGRhdGEgdHlwZXMuKnwKK3wqIFRoaXMgZmlsZSBpcyBpbXBvcnRhbnQgYmVjYXVzZSBkaWZmZXJlbnQgaG9zdCBPUydzIGRlZmluZSBkaWZmZXJlbnQgbWFjcm9zLCp8Cit8KiB3aGljaCBtYWtlcyBwb3J0YWJpbGl0eSB0b3VnaC4gIFRoaXMgZmlsZSBleHBvcnRzIHRoZSBmb2xsb3dpbmcgICAgICAgICAgICAqfAorfCogZGVmaW5pdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgIFt1XWludCgzMnw2NClfdCA6IHR5cGVkZWZzIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIDMyLzY0IGJpdCBzeXN0ZW0gdHlwZXMqfAorfCogICBbVV1JTlQoOHwxNnwzMnw2NClfKE1JTnxNQVgpIDogQ29uc3RhbnRzIGZvciB0aGUgbWluIGFuZCBtYXggdmFsdWVzLiAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBObyBsaWJyYXJ5IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlc2UgZnVuY3Rpbm9ucy4gICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKy8qIFBsZWFzZSBsZWF2ZSB0aGlzIGZpbGUgQy1jb21wYXRpYmxlLiAqLworCisjaWZuZGVmIFNVUFBPUlRfREFUQVRZUEVTX0gKKyNkZWZpbmUgU1VQUE9SVF9EQVRBVFlQRVNfSAorCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAke0hBVkVfU1lTX1RZUEVTX0h9CisjY21ha2VkZWZpbmUgSEFWRV9JTlRUWVBFU19IICR7SEFWRV9JTlRUWVBFU19IfQorI2NtYWtlZGVmaW5lIEhBVkVfU1RESU5UX0ggJHtIQVZFX1NURElOVF9IfQorI2NtYWtlZGVmaW5lIEhBVkVfVUlOVDY0X1QgJHtIQVZFX1VJTlQ2NF9UfQorI2NtYWtlZGVmaW5lIEhBVkVfVV9JTlQ2NF9UICR7SEFWRV9VX0lOVDY0X1R9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPGNtYXRoPgorI2Vsc2UKKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKKworI2lmbmRlZiBfTVNDX1ZFUgorCisvKiBOb3RlIHRoYXQgdGhpcyBoZWFkZXIncyBjb3JyZWN0IG9wZXJhdGlvbiBkZXBlbmRzIG9uIF9fU1REQ19MSU1JVF9NQUNST1MKKyAgIGJlaW5nIGRlZmluZWQuICBXZSB3b3VsZCBkZWZpbmUgaXQgaGVyZSwgYnV0IGluIG9yZGVyIHRvIHByZXZlbnQgQmFkIFRoaW5ncworICAgaGFwcGVuaW5nIHdoZW4gc3lzdGVtIGhlYWRlcnMgb3IgQysrIFNUTCBoZWFkZXJzIGluY2x1ZGUgc3RkaW50LmggYmVmb3JlIHdlCisgICBkZWZpbmUgaXQgaGVyZSwgd2UgZGVmaW5lIGl0IG9uIHRoZSBnKysgY29tbWFuZCBsaW5lIChpbiBNYWtlZmlsZS5ydWxlcykuICovCisjaWYgIWRlZmluZWQoX19TVERDX0xJTUlUX01BQ1JPUykKKyMgZXJyb3IgIk11c3QgI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIGJlZm9yZSAjaW5jbHVkaW5nIFN5c3RlbS9EYXRhVHlwZXMuaCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykKKyMgZXJyb3IgIk11c3QgI2RlZmluZSBfX1NURENfQ09OU1RBTlRfTUFDUk9TIGJlZm9yZSAiIFwKKyAgICAgICAgIiNpbmNsdWRpbmcgU3lzdGVtL0RhdGFUeXBlcy5oIgorI2VuZGlmCisKKy8qIE5vdGUgdGhhdCA8aW50dHlwZXMuaD4gaW5jbHVkZXMgPHN0ZGludC5oPiwgaWYgdGhpcyBpcyBhIEM5OSBzeXN0ZW0uICovCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIF9BSVgKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9BSVhEYXRhVHlwZXNGaXguaCIKKyNlbmRpZgorCisvKiBIYW5kbGUgaW5jb3JyZWN0IGRlZmluaXRpb24gb2YgdWludDY0X3QgYXMgdV9pbnQ2NF90ICovCisjaWZuZGVmIEhBVkVfVUlOVDY0X1QKKyNpZmRlZiBIQVZFX1VfSU5UNjRfVAordHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3Q7CisjZWxzZQorIyBlcnJvciAiRG9uJ3QgaGF2ZSBhIGRlZmluaXRpb24gZm9yIHVpbnQ2NF90IG9uIHRoaXMgcGxhdGZvcm0iCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX09wZW5CU0RfCisjZGVmaW5lIElOVDhfTUFYIDEyNworI2RlZmluZSBJTlQ4X01JTiAtMTI4CisjZGVmaW5lIFVJTlQ4X01BWCAyNTUKKyNkZWZpbmUgSU5UMTZfTUFYIDMyNzY3CisjZGVmaW5lIElOVDE2X01JTiAtMzI3NjgKKyNkZWZpbmUgVUlOVDE2X01BWCA2NTUzNQorI2RlZmluZSBJTlQzMl9NQVggMjE0NzQ4MzY0NworI2RlZmluZSBJTlQzMl9NSU4gLTIxNDc0ODM2NDgKKyNkZWZpbmUgVUlOVDMyX01BWCA0Mjk0OTY3Mjk1VQorI2VuZGlmCisKKyNlbHNlIC8qIF9NU0NfVkVSICovCisvKiBWaXN1YWwgQysrIGRvZXNuJ3QgcHJvdmlkZSBzdGFuZGFyZCBpbnRlZ2VyIGhlYWRlcnMsIGJ1dCBpdCBkb2VzIHByb3ZpZGUKKyAgIGJ1aWx0LWluIGRhdGEgdHlwZXMuICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxjbWF0aD4KKyNlbHNlCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCit0eXBlZGVmIF9faW50NjQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKK3R5cGVkZWYgc2lnbmVkIGludCBpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Cit0eXBlZGVmIHNob3J0IGludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNl90OwordHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKK3R5cGVkZWYgc2lnbmVkIGludCBzc2l6ZV90OworI2lmbmRlZiBJTlQ4X01BWAorIyBkZWZpbmUgSU5UOF9NQVggMTI3CisjZW5kaWYKKyNpZm5kZWYgSU5UOF9NSU4KKyMgZGVmaW5lIElOVDhfTUlOIC0xMjgKKyNlbmRpZgorI2lmbmRlZiBVSU5UOF9NQVgKKyMgZGVmaW5lIFVJTlQ4X01BWCAyNTUKKyNlbmRpZgorI2lmbmRlZiBJTlQxNl9NQVgKKyMgZGVmaW5lIElOVDE2X01BWCAzMjc2NworI2VuZGlmCisjaWZuZGVmIElOVDE2X01JTgorIyBkZWZpbmUgSU5UMTZfTUlOIC0zMjc2OAorI2VuZGlmCisjaWZuZGVmIFVJTlQxNl9NQVgKKyMgZGVmaW5lIFVJTlQxNl9NQVggNjU1MzUKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NQVgKKyMgZGVmaW5lIElOVDMyX01BWCAyMTQ3NDgzNjQ3CisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUlOCisjIGRlZmluZSBJTlQzMl9NSU4gLTIxNDc0ODM2NDgKKyNlbmRpZgorI2lmbmRlZiBVSU5UMzJfTUFYCisjIGRlZmluZSBVSU5UMzJfTUFYIDQyOTQ5NjcyOTVVCisjZW5kaWYKKy8qIENlcnRhaW4gY29tcGF0aWJpbGl0eSB1cGRhdGVzIHRvIFZDKysgaW50cm9kdWNlIHRoZSBgY3N0ZGludCcKKyAqIGhlYWRlciwgd2hpY2ggZGVmaW5lcyB0aGUgSU5UKl9DIG1hY3Jvcy4gT24gZGVmYXVsdCBpbnN0YWxscyB0aGV5CisgKiBhcmUgYWJzZW50LiAqLworI2lmbmRlZiBJTlQ4X0MKKyMgZGVmaW5lIElOVDhfQyhDKSAgIEMjI2k4CisjZW5kaWYKKyNpZm5kZWYgVUlOVDhfQworIyBkZWZpbmUgVUlOVDhfQyhDKSAgQyMjdWk4CisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfQworIyBkZWZpbmUgSU5UMTZfQyhDKSAgQyMjaTE2CisjZW5kaWYKKyNpZm5kZWYgVUlOVDE2X0MKKyMgZGVmaW5lIFVJTlQxNl9DKEMpIEMjI3VpMTYKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9DCisjIGRlZmluZSBJTlQzMl9DKEMpICBDIyNpMzIKKyNlbmRpZgorI2lmbmRlZiBVSU5UMzJfQworIyBkZWZpbmUgVUlOVDMyX0MoQykgQyMjdWkzMgorI2VuZGlmCisjaWZuZGVmIElOVDY0X0MKKyMgZGVmaW5lIElOVDY0X0MoQykgIEMjI2k2NAorI2VuZGlmCisjaWZuZGVmIFVJTlQ2NF9DCisjIGRlZmluZSBVSU5UNjRfQyhDKSBDIyN1aTY0CisjZW5kaWYKKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCisvKiBTZXQgZGVmYXVsdHMgZm9yIGNvbnN0YW50cyB3aGljaCB3ZSBjYW5ub3QgZmluZC4gKi8KKyNpZiAhZGVmaW5lZChJTlQ2NF9NQVgpCisjIGRlZmluZSBJTlQ2NF9NQVggOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjZW5kaWYKKyNpZiAhZGVmaW5lZChJTlQ2NF9NSU4pCisjIGRlZmluZSBJTlQ2NF9NSU4gKCgtSU5UNjRfTUFYKS0xKQorI2VuZGlmCisjaWYgIWRlZmluZWQoVUlOVDY0X01BWCkKKyMgZGVmaW5lIFVJTlQ2NF9NQVggMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisjZW5kaWYKKworI2lmIF9fR05VQ19fID4gMworI2RlZmluZSBFTkRfV0lUSF9OVUxMIF9fYXR0cmlidXRlX18oKHNlbnRpbmVsKSkKKyNlbHNlCisjZGVmaW5lIEVORF9XSVRIX05VTEwKKyNlbmRpZgorCisjaWZuZGVmIEhVR0VfVkFMRgorI2RlZmluZSBIVUdFX1ZBTEYgKGZsb2F0KUhVR0VfVkFMCisjZW5kaWYKKworI2VuZGlmICAvKiBTVVBQT1JUX0RBVEFUWVBFU19IICovCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL0RhdGFUeXBlcy5oLmluIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9EYXRhVHlwZXMuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2RiZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9EYXRhVHlwZXMuaC5pbgpAQCAtMCwwICsxLDExMSBAQAorLyo9PT0tLSBpbmNsdWRlL1N5c3RlbS9EYXRhVHlwZXMuaCAtIERlZmluZSBmaXhlZCBzaXplIHR5cGVzIC0tLS0tKi0gQyAtKi09PT0qXA0KK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8DQorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwNCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfA0KK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8DQorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwNCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfA0KK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8DQorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwNCit8KiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgdG8gZmlndXJlIG91dCB0aGUgc2l6ZSBvZiBfSE9TVF8gZGF0YSB0eXBlcy4qfA0KK3wqIFRoaXMgZmlsZSBpcyBpbXBvcnRhbnQgYmVjYXVzZSBkaWZmZXJlbnQgaG9zdCBPUydzIGRlZmluZSBkaWZmZXJlbnQgbWFjcm9zLCp8DQorfCogd2hpY2ggbWFrZXMgcG9ydGFiaWxpdHkgdG91Z2guICBUaGlzIGZpbGUgZXhwb3J0cyB0aGUgZm9sbG93aW5nICAgICAgICAgICAgKnwNCit8KiBkZWZpbml0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfA0KK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8DQorfCogICBbdV1pbnQoMzJ8NjQpX3QgOiB0eXBlZGVmcyBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCAzMi82NCBiaXQgc3lzdGVtIHR5cGVzKnwNCit8KiAgIFtVXUlOVCg4fDE2fDMyfDY0KV8oTUlOfE1BWCkgOiBDb25zdGFudHMgZm9yIHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMuICAgICAqfA0KK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8DQorfCogTm8gbGlicmFyeSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZXNlIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgKnwNCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfA0KK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovDQorDQorLyogUGxlYXNlIGxlYXZlIHRoaXMgZmlsZSBDLWNvbXBhdGlibGUuICovDQorDQorI2lmbmRlZiBTVVBQT1JUX0RBVEFUWVBFU19IDQorI2RlZmluZSBTVVBQT1JUX0RBVEFUWVBFU19IDQorDQorI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gNCisjdW5kZWYgSEFWRV9JTlRUWVBFU19IDQorI3VuZGVmIEhBVkVfU1RESU5UX0gNCisjdW5kZWYgSEFWRV9VSU5UNjRfVA0KKyN1bmRlZiBIQVZFX1VfSU5UNjRfVA0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KKyNpbmNsdWRlIDxjbWF0aD4NCisjZWxzZQ0KKyNpbmNsdWRlIDxtYXRoLmg+DQorI2VuZGlmDQorDQorLyogTm90ZSB0aGF0IHRoaXMgaGVhZGVyJ3MgY29ycmVjdCBvcGVyYXRpb24gZGVwZW5kcyBvbiBfX1NURENfTElNSVRfTUFDUk9TDQorICAgYmVpbmcgZGVmaW5lZC4gIFdlIHdvdWxkIGRlZmluZSBpdCBoZXJlLCBidXQgaW4gb3JkZXIgdG8gcHJldmVudCBCYWQgVGhpbmdzDQorICAgaGFwcGVuaW5nIHdoZW4gc3lzdGVtIGhlYWRlcnMgb3IgQysrIFNUTCBoZWFkZXJzIGluY2x1ZGUgc3RkaW50LmggYmVmb3JlIHdlDQorICAgZGVmaW5lIGl0IGhlcmUsIHdlIGRlZmluZSBpdCBvbiB0aGUgZysrIGNvbW1hbmQgbGluZSAoaW4gTWFrZWZpbGUucnVsZXMpLiAqLw0KKyNpZiAhZGVmaW5lZChfX1NURENfTElNSVRfTUFDUk9TKQ0KKyMgZXJyb3IgIk11c3QgI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIGJlZm9yZSAjaW5jbHVkaW5nIFN5c3RlbS9EYXRhVHlwZXMuaCINCisjZW5kaWYNCisNCisjaWYgIWRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykNCisjIGVycm9yICJNdXN0ICNkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUyBiZWZvcmUgIiBcDQorICAgICAgICAiI2luY2x1ZGluZyBTeXN0ZW0vRGF0YVR5cGVzLmgiDQorI2VuZGlmDQorDQorLyogTm90ZSB0aGF0IDxpbnR0eXBlcy5oPiBpbmNsdWRlcyA8c3RkaW50Lmg+LCBpZiB0aGlzIGlzIGEgQzk5IHN5c3RlbS4gKi8NCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSA0KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCisjZW5kaWYNCisNCisjaWZkZWYgSEFWRV9JTlRUWVBFU19IDQorI2luY2x1ZGUgPGludHR5cGVzLmg+DQorI2VuZGlmDQorDQorI2lmZGVmIEhBVkVfU1RESU5UX0gNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorI2VuZGlmDQorDQorI2lmZGVmIF9BSVgNCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vQUlYRGF0YVR5cGVzRml4LmgiDQorI2VuZGlmDQorDQorLyogSGFuZGxlIGluY29ycmVjdCBkZWZpbml0aW9uIG9mIHVpbnQ2NF90IGFzIHVfaW50NjRfdCAqLw0KKyNpZm5kZWYgSEFWRV9VSU5UNjRfVA0KKyNpZmRlZiBIQVZFX1VfSU5UNjRfVA0KK3R5cGVkZWYgdV9pbnQ2NF90IHVpbnQ2NF90Ow0KKyNlbHNlDQorIyBlcnJvciAiRG9uJ3QgaGF2ZSBhIGRlZmluaXRpb24gZm9yIHVpbnQ2NF90IG9uIHRoaXMgcGxhdGZvcm0iDQorI2VuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIF9PcGVuQlNEXw0KKyNkZWZpbmUgSU5UOF9NQVggMTI3DQorI2RlZmluZSBJTlQ4X01JTiAtMTI4DQorI2RlZmluZSBVSU5UOF9NQVggMjU1DQorI2RlZmluZSBJTlQxNl9NQVggMzI3NjcNCisjZGVmaW5lIElOVDE2X01JTiAtMzI3NjgNCisjZGVmaW5lIFVJTlQxNl9NQVggNjU1MzUNCisjZGVmaW5lIElOVDMyX01BWCAyMTQ3NDgzNjQ3DQorI2RlZmluZSBJTlQzMl9NSU4gLTIxNDc0ODM2NDgNCisjZGVmaW5lIFVJTlQzMl9NQVggNDI5NDk2NzI5NVUNCisjZW5kaWYNCisNCisvKiBTZXQgZGVmYXVsdHMgZm9yIGNvbnN0YW50cyB3aGljaCB3ZSBjYW5ub3QgZmluZC4gKi8NCisjaWYgIWRlZmluZWQoSU5UNjRfTUFYKQ0KKyMgZGVmaW5lIElOVDY0X01BWCA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwNCisjZW5kaWYNCisjaWYgIWRlZmluZWQoSU5UNjRfTUlOKQ0KKyMgZGVmaW5lIElOVDY0X01JTiAoKC1JTlQ2NF9NQVgpLTEpDQorI2VuZGlmDQorI2lmICFkZWZpbmVkKFVJTlQ2NF9NQVgpDQorIyBkZWZpbmUgVUlOVDY0X01BWCAweGZmZmZmZmZmZmZmZmZmZmZVTEwNCisjZW5kaWYNCisNCisjaWYgX19HTlVDX18gPiAzDQorI2RlZmluZSBFTkRfV0lUSF9OVUxMIF9fYXR0cmlidXRlX18oKHNlbnRpbmVsKSkNCisjZWxzZQ0KKyNkZWZpbmUgRU5EX1dJVEhfTlVMTA0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgSFVHRV9WQUxGDQorI2RlZmluZSBIVUdFX1ZBTEYgKGZsb2F0KUhVR0VfVkFMDQorI2VuZGlmDQorDQorI2VuZGlmICAvKiBTVVBQT1JUX0RBVEFUWVBFU19IICovDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9EaXNhc3NlbWJsZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vRGlzYXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExZTc5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vRGlzYXNzZW1ibGVyLmgKQEAgLTAsMCArMSwzNSBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9EaXNhc3NlbWJsZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbmVjZXNzYXJ5IGdsdWUgdG8gY2FsbCBleHRlcm5hbCBkaXNhc3NlbWJsZXIKKy8vIGxpYnJhcmllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1lTVEVNX0RJU0FTU0VNQkxFUl9ICisjZGVmaW5lIExMVk1fU1lTVEVNX0RJU0FTU0VNQkxFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUsIGlmIHRoZXJlIGlzIHBvc3NpYmxlIHRvIHVzZSBzb21lIGV4dGVybmFsCisvLy8gZGlzYXNzZW1ibGVyIGxpYnJhcnkuIEZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgaGFzRGlzYXNzZW1ibGVyKCk7CisKKy8vLyBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHNvbWUgImdsdWUiIGNvZGUgdG8gY2FsbCBleHRlcm5hbCBkaXNhc3NlbWJsZXIKKy8vLyBsaWJyYXJpZXMuCitzdGQ6OnN0cmluZyBkaXNhc3NlbWJsZUJ1ZmZlcih1aW50OF90KiBzdGFydCwgc2l6ZV90IGxlbmd0aCwgdWludDY0X3QgcGMgPSAwKTsKKworfQorfQorCisjZW5kaWYgLy8gTExWTV9TWVNURU1fRElTQVNTRU1CTEVSX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vRHluYW1pY0xpYnJhcnkuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vRHluYW1pY0xpYnJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDViOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9EeW5hbWljTGlicmFyeS5oCkBAIC0wLDAgKzEsODYgQEAKKy8vPT09LS0gbGx2bS9TeXN0ZW0vRHluYW1pY0xpYnJhcnkuaCAtIFBvcnRhYmxlIER5bmFtaWMgTGlicmFyeSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBzeXM6OkR5bmFtaWNMaWJyYXJ5IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWVNURU1fRFlOQU1JQ19MSUJSQVJZX0gKKyNkZWZpbmUgTExWTV9TWVNURU1fRFlOQU1JQ19MSUJSQVJZX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKKyAgLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBwb3J0YWJsZSBpbnRlcmZhY2UgdG8gZHluYW1pYyBsaWJyYXJpZXMgd2hpY2ggYWxzbworICAvLy8gbWlnaHQgYmUga25vd24gYXMgc2hhcmVkIGxpYnJhcmllcywgc2hhcmVkIG9iamVjdHMsIGR5bmFtaWMgc2hhcmVkCisgIC8vLyBvYmplY3RzLCBvciBkeW5hbWljIGxpbmsgbGlicmFyaWVzLiBSZWdhcmRsZXNzIG9mIHRoZSB0ZXJtaW5vbG9neSBvciB0aGUKKyAgLy8vIG9wZXJhdGluZyBzeXN0ZW0gaW50ZXJmYWNlLCB0aGlzIGNsYXNzIHByb3ZpZGVzIGEgcG9ydGFibGUgaW50ZXJmYWNlIHRoYXQKKyAgLy8vIGFsbG93cyBkeW5hbWljIGxpYnJhcmllcyB0byBiZSBsb2FkZWQgYW5kIHNlYXJjaGVkIGZvciBleHRlcm5hbGx5CisgIC8vLyBkZWZpbmVkIHN5bWJvbHMuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gcHJvdmlkZSAicGx1Zy1pbiIgc3VwcG9ydC4KKyAgLy8vIEl0IGFsc28gYWxsb3dzIGZvciBzeW1ib2xzIHRvIGJlIGRlZmluZWQgd2hpY2ggZG9uJ3QgbGl2ZSBpbiBhbnkgbGlicmFyeSwKKyAgLy8vIGJ1dCByYXRoZXIgdGhlIG1haW4gcHJvZ3JhbSBpdHNlbGYsIHVzZWZ1bCBvbiBXaW5kb3dzIHdoZXJlIHRoZSBtYWluCisgIC8vLyBleGVjdXRhYmxlIGNhbm5vdCBiZSBzZWFyY2hlZC4KKyAgY2xhc3MgRHluYW1pY0xpYnJhcnkgeworICAgIER5bmFtaWNMaWJyYXJ5KCk7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgcHVibGljOgorICAgIC8vLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyBhIGxpYnJhcnkgdG8gYmUgbG9hZGVkIHdpdGhvdXQgaW5zdGFudGlhdGluZyBhCisgICAgLy8vIER5bmFtaWNMaWJyYXJ5IG9iamVjdC4gQ29uc2VxdWVudGx5LCBpdCBpcyBtYXJrZWQgYXMgYmVpbmcgcGVybWFuZW50CisgICAgLy8vIGFuZCB3aWxsIG9ubHkgYmUgdW5sb2FkZWQgd2hlbiB0aGUgcHJvZ3JhbSB0ZXJtaW5hdGVzLiAgVGhpcyByZXR1cm5zCisgICAgLy8vIGZhbHNlIG9uIHN1Y2Nlc3Mgb3IgcmV0dXJucyB0cnVlIGFuZCBmaWxscyBpbiAqRXJyTXNnIG9uIGZhaWx1cmUuCisgICAgLy8vIEBicmllZiBPcGVuIGEgZHluYW1pYyBsaWJyYXJ5IHBlcm1hbmVudGx5LgorICAgIC8vLworICAgIC8vLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICAvLy8KKyAgICBzdGF0aWMgYm9vbCBMb2FkTGlicmFyeVBlcm1hbmVudGx5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZyA9IDApOworCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBzZWFyY2ggdGhyb3VnaCBhbGwgcHJldmlvdXNseSBsb2FkZWQgZHluYW1pYworICAgIC8vLyBsaWJyYXJpZXMgZm9yIHRoZSBzeW1ib2wgXHAgc3ltYm9sTmFtZS4gSWYgaXQgaXMgZm91bmQsIHRoZSBhZGRyZXNzb2YKKyAgICAvLy8gdGhhdCBzeW1ib2wgaXMgcmV0dXJuZWQuIElmIG5vdCwgbnVsbCBpcyByZXR1cm5lZC4gTm90ZSB0aGF0IHRoaXMgd2lsbAorICAgIC8vLyBzZWFyY2ggcGVybWFuZW50bHkgbG9hZGVkIGxpYnJhcmllcyAoTG9hZExpYnJhcnlQZXJtYW5lbnRseSkgYXMgd2VsbAorICAgIC8vLyBhcyBlcGhlbWVyYWxseSBsb2FkZWQgbGlicmFyaWVzIChjb25zdHJ1Y3RvcnMpLgorICAgIC8vLyBAdGhyb3dzIHN0ZDo6c3RyaW5nIG9uIGVycm9yLgorICAgIC8vLyBAYnJpZWYgU2VhcmNoIHRocm91Z2ggbGlicmFyaWVzIGZvciBhZGRyZXNzIG9mIGEgc3ltYm9sCisgICAgLy8vCisgICAgLy8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLgorICAgIC8vLworICAgIHN0YXRpYyB2b2lkICpTZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woY29uc3QgY2hhciAqc3ltYm9sTmFtZSk7CisKKyAgICAvLy8gQGJyaWVmIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBDKytvcGhpbGVzLgorICAgIC8vLworICAgIC8vLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICAvLy8KKyAgICBzdGF0aWMgdm9pZCAqU2VhcmNoRm9yQWRkcmVzc09mU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nICZzeW1ib2xOYW1lKSB7CisgICAgICByZXR1cm4gU2VhcmNoRm9yQWRkcmVzc09mU3ltYm9sKHN5bWJvbE5hbWUuY19zdHIoKSk7CisgICAgfQorCisgICAgLy8vIFRoaXMgZnVuY3Rpb25zIHBlcm1hbmVudGx5IGFkZHMgdGhlIHN5bWJvbCBccCBzeW1ib2xOYW1lIHdpdGggdGhlCisgICAgLy8vIHZhbHVlIFxwIHN5bWJvbFZhbHVlLiAgVGhlc2Ugc3ltYm9scyBhcmUgc2VhcmNoZWQgYmVmb3JlIGFueQorICAgIC8vLyBsaWJyYXJpZXMuCisgICAgLy8vIEBicmllZiBBZGQgc2VhcmNoYWJsZSBzeW1ib2wvdmFsdWUgcGFpci4KKyAgICAvLy8KKyAgICAvLy8gTk9URTogVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgLy8vCisgICAgc3RhdGljIHZvaWQgQWRkU3ltYm9sKGNvbnN0IGNoYXIgKnN5bWJvbE5hbWUsIHZvaWQgKnN5bWJvbFZhbHVlKTsKKworICAgIC8vLyBAYnJpZWYgQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIEMrK29waGlsZXMuCisgICAgLy8vCisgICAgLy8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLgorICAgIC8vLworICAgIHN0YXRpYyB2b2lkIEFkZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyAmc3ltYm9sTmFtZSwgdm9pZCAqc3ltYm9sVmFsdWUpIHsKKyAgICAgIEFkZFN5bWJvbChzeW1ib2xOYW1lLmNfc3RyKCksIHN5bWJvbFZhbHVlKTsKKyAgICB9CisgIH07CisKK30gLy8gRW5kIHN5cyBuYW1lc3BhY2UKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBMTFZNX1NZU1RFTV9EWU5BTUlDX0xJQlJBUllfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9FcnJuby5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9FcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjkyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL0Vycm5vLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIGxsdm0vU3lzdGVtL0Vycm5vLmggLSBQb3J0YWJsZStjb252ZW5pZW50IGVycm5vIGhhbmRsaW5nIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgc29tZSBwb3J0YWJsZSBhbmQgY29udmVuaWVudCBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGVycm5vLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWVNURU1fRVJSTk9fSAorI2RlZmluZSBMTFZNX1NZU1RFTV9FUlJOT19ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisvLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJybm8gdmFsdWUsIHVzaW5nIHdoYXRldmVyCisvLy8gdGhyZWFkLXNhZmUgdmFyaWFudCBvZiBzdHJlcnJvcigpIGlzIGF2YWlsYWJsZS4gIEJlIHN1cmUgdG8gY2FsbCB0aGlzCisvLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZ1bmN0aW9uIHRoYXQgc2V0IGVycm5vLCBvciBlcnJubyBtYXkgaGF2ZSBiZWVuCisvLy8gb3ZlcndyaXR0ZW4gYnkgYW4gaW50ZXJ2ZW5pbmcgY2FsbC4KK3N0ZDo6c3RyaW5nIFN0ckVycm9yKCk7CisKKy8vLyBMaWtlIHRoZSBuby1hcmd1bWVudCB2ZXJzaW9uIGFib3ZlLCBidXQgdXNlcyBccCBlcnJudW0gaW5zdGVhZCBvZiBlcnJuby4KK3N0ZDo6c3RyaW5nIFN0ckVycm9yKGludCBlcnJudW0pOworCit9ICAvLyBuYW1lc3BhY2Ugc3lzCit9ICAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgIC8vIExMVk1fU1lTVEVNX0VSUk5PX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vSG9zdC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9Ib3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiZjVjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vSG9zdC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vPT09LSBsbHZtL1N5c3RlbS9Ib3N0LmggLSBIb3N0IG1hY2hpbmUgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTWV0aG9kcyBmb3IgcXVlcnlpbmcgdGhlIG5hdHVyZSBvZiB0aGUgaG9zdCBtYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWVNURU1fSE9TVF9ICisjZGVmaW5lIExMVk1fU1lTVEVNX0hPU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3lzIHsKKworICBpbmxpbmUgYm9vbCBpc0xpdHRsZUVuZGlhbkhvc3QoKSB7CisgICAgdW5pb24geworICAgICAgaW50IGk7CisgICAgICBjaGFyIGM7CisgICAgfTsKKyAgICBpID0gMTsKKyAgICByZXR1cm4gYzsKKyAgfQorCisgIGlubGluZSBib29sIGlzQmlnRW5kaWFuSG9zdCgpIHsKKyAgICByZXR1cm4gIWlzTGl0dGxlRW5kaWFuSG9zdCgpOworICB9CisKKyAgLy8vIGdldEhvc3RUcmlwbGUoKSAtIFJldHVybiB0aGUgdGFyZ2V0IHRyaXBsZSBvZiB0aGUgcnVubmluZworICAvLy8gc3lzdGVtLgorICAvLy8KKyAgLy8vIFRoZSB0YXJnZXQgdHJpcGxlIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtYXQgb2Y6CisgIC8vLyAgIENQVV9UWVBFLVZFTkRPUi1PUEVSQVRJTkdfU1lTVEVNCisgIC8vLyBvcgorICAvLy8gICBDUFVfVFlQRS1WRU5ET1ItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyAgc3RkOjpzdHJpbmcgZ2V0SG9zdFRyaXBsZSgpOworCisgIC8vLyBnZXRIb3N0Q1BVTmFtZSAtIEdldCB0aGUgTExWTSBuYW1lIGZvciB0aGUgaG9zdCBDUFUuIFRoZSBwYXJ0aWN1bGFyIGZvcm1hdAorICAvLy8gb2YgdGhlIG5hbWUgaXMgdGFyZ2V0IGRlcGVuZGVudCwgYW5kIHN1aXRhYmxlIGZvciBwYXNzaW5nIGFzIC1tY3B1IHRvIHRoZQorICAvLy8gdGFyZ2V0IHdoaWNoIG1hdGNoZXMgdGhlIGhvc3QuCisgIC8vLworICAvLy8gXHJldHVybiAtIFRoZSBob3N0IENQVSBuYW1lLCBvciBlbXB0eSBpZiB0aGUgQ1BVIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLgorICBzdGQ6OnN0cmluZyBnZXRIb3N0Q1BVTmFtZSgpOworCisgIC8vLyBnZXRIb3N0Q1BVRmVhdHVyZXMgLSBHZXQgdGhlIExMVk0gbmFtZXMgZm9yIHRoZSBob3N0IENQVSBmZWF0dXJlcy4KKyAgLy8vIFRoZSBwYXJ0aWN1bGFyIGZvcm1hdCBvZiB0aGUgbmFtZXMgYXJlIHRhcmdldCBkZXBlbmRlbnQsIGFuZCBzdWl0YWJsZSBmb3IKKyAgLy8vIHBhc3NpbmcgYXMgLW1hdHRyIHRvIHRoZSB0YXJnZXQgd2hpY2ggbWF0Y2hlcyB0aGUgaG9zdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmVhdHVyZXMgLSBBIHN0cmluZyBtYXBwaW5nIGZlYXR1cmUgbmFtZXMgdG8gZWl0aGVyCisgIC8vLyB0cnVlIChpZiBlbmFibGVkKSBvciBmYWxzZSAoaWYgZGlzYWJsZWQpLiBUaGlzIHJvdXRpbmUgbWFrZXMgbm8gZ3VhcmFudGVlcworICAvLy8gYWJvdXQgZXhhY3RseSB3aGljaCBmZWF0dXJlcyBtYXkgYXBwZWFyIGluIHRoaXMgbWFwLCBleGNlcHQgdGhhdCB0aGV5IGFyZQorICAvLy8gYWxsIHZhbGlkIExMVk0gZmVhdHVyZSBuYW1lcy4KKyAgLy8vCisgIC8vLyBccmV0dXJuIC0gVHJ1ZSBvbiBzdWNjZXNzLgorICBib29sIGdldEhvc3RDUFVGZWF0dXJlcyhTdHJpbmdNYXA8Ym9vbD4gJkZlYXR1cmVzKTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL0luY2x1ZGVGaWxlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL0luY2x1ZGVGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2OGVhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vSW5jbHVkZUZpbGUuaApAQCAtMCwwICsxLDc5IEBACisvLz09PS0gbGx2bS9TeXN0ZW0vSW5jbHVkZUZpbGUuaCAtIEVuc3VyZSBMaW5raW5nIE9mIExpYnJhcnkgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEZPUkNFX0RFRklOSU5HX0ZJTEVfVE9fQkVfTElOS0VEIGFuZCBERUZJTkVfRklMRV9GT1IKKy8vIG1hY3Jvcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1lTVEVNX0lOQ0xVREVGSUxFX0gKKyNkZWZpbmUgTExWTV9TWVNURU1fSU5DTFVERUZJTEVfSAorCisvLy8gVGhpcyBtYWNybyBpcyB0aGUgcHVibGljIGludGVyZmFjZSB0aGF0IEluY2x1ZGVGaWxlLmggZXhwb3J0cy4gVGhpcyBnaXZlcworLy8vIHVzIHRoZSBvcHRpb24gdG8gaW1wbGVtZW50IHRoZSAibGluayB0aGUgZGVmaW5pdGlvbiIgY2FwYWJpbGl0eSBpbiBhbnkgCisvLy8gbWFubmVyIHRoYXQgd2UgY2hvb3NlLiBBbGwgaGVhZGVyIGZpbGVzIHRoYXQgZGVwZW5kIG9uIGEgc3BlY2lmaWMgLmNwcAorLy8vIGZpbGUgYmVpbmcgbGlua2VkIGF0IHJ1biB0aW1lIHNob3VsZCB1c2UgdGhpcyBtYWNybyBpbnN0ZWFkIG9mIHRoZQorLy8vIEluY2x1ZGVGaWxlIGNsYXNzIGRpcmVjdGx5LiAKKy8vLyAKKy8vLyBGb3IgZXhhbXBsZSwgZm9vLmggd291bGQgdXNlOjxici8+CisvLy8gPHR0PkZPUkNFX0RFRklOSU5HX0ZJTEVfVE9fQkVfTElOS0VEKGZvbyk8L3R0Pjxici8+CisvLy8gCisvLy8gQW5kLCBmb28uY3Agd291bGQgdXNlOjxici8+CisvLy8gPHR0PkRFRklOSU5HX0ZJTEVfRk9SKGZvbyk8L3R0Pjxici8+CisjaWZkZWYgX19HTlVDX18KKy8vIElmIHRoZSBgdXNlZCcgYXR0cmlidXRlIGlzIGF2YWlsYWJsZSwgdXNlIGl0IHRvIGNyZWF0ZSBhIHZhcmlhYmxlCisvLyB3aXRoIGFuIGluaXRpYWxpemVyIHRoYXQgd2lsbCBmb3JjZSB0aGUgbGlua2luZyBvZiB0aGUgZGVmaW5pbmcgZmlsZS4KKyNkZWZpbmUgRk9SQ0VfREVGSU5JTkdfRklMRV9UT19CRV9MSU5LRUQobmFtZSkgXAorICBuYW1lc3BhY2UgbGx2bSB7IFwKKyAgICBleHRlcm4gY29uc3QgY2hhciBuYW1lICMjIExpbmtWYXI7IFwKKyAgICBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWUgIyMgTGlua09iaiA9IFwKKyAgICAgICZuYW1lICMjIExpbmtWYXI7IFwKKyAgfSAKKyNlbHNlCisvLyBPdGhlcndpc2UgdXNlIGEgY29uc3RydWN0b3IgY2FsbC4KKyNkZWZpbmUgRk9SQ0VfREVGSU5JTkdfRklMRV9UT19CRV9MSU5LRUQobmFtZSkgXAorICBuYW1lc3BhY2UgbGx2bSB7IFwKKyAgICBleHRlcm4gY29uc3QgY2hhciBuYW1lICMjIExpbmtWYXI7IFwKKyAgICBzdGF0aWMgY29uc3QgSW5jbHVkZUZpbGUgbmFtZSAjIyBMaW5rT2JqICggJm5hbWUgIyMgTGlua1ZhciApOyBcCisgIH0gCisjZW5kaWYKKworLy8vIFRoaXMgbWFjcm8gaXMgdGhlIGNvdW50ZXJwYXJ0IHRvIEZPUkNFX0RFRklOSU5HX0ZJTEVfVE9fQkVfTElOS0VELiBJdCBzaG91bGQKKy8vLyBiZSB1c2VkIGluIGEgLmNwcCBmaWxlIHRvIGRlZmluZSB0aGUgbmFtZSByZWZlcmVuY2VkIGluIGEgaGVhZGVyIGZpbGUgdGhhdAorLy8vIHdpbGwgY2F1c2UgbGlua2FnZSBvZiB0aGUgLmNwcCBmaWxlLiBJdCBzaG91bGQgb25seSBiZSB1c2VkIGF0IGV4dGVybiBsZXZlbC4KKyNkZWZpbmUgREVGSU5JTkdfRklMRV9GT1IobmFtZSkgXAorICBuYW1lc3BhY2UgbGx2bSB7IGNvbnN0IGNoYXIgbmFtZSAjIyBMaW5rVmFyID0gMDsgfQorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIEZPUkNFX0RFRklOSU5HX0ZJTEVfVE9fQkVfTElOS0VECisvLy8gbWFjcm8gdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgaGVhZGVyIGZpbGUgaXMgaW5jbHVkZWQgCisvLy8gaW50byBhIHRvb2wgdGhhdCB1c2VzIHRoZSBoZWFkZXIuICBUaGlzIGlzIHNvbGVseSAKKy8vLyB0byBvdmVyY29tZSBwcm9ibGVtcyBsaW5raW5nIC5hIGZpbGVzIGFuZCBub3QgZ2V0dGluZyB0aGUgaW1wbGVtZW50YXRpb24gCisvLy8gb2YgY29tcGlsYXRpb24gdW5pdHMgd2UgbmVlZC4gVGhpcyBpcyBjb21tb25seSBhbiBpc3N1ZSB3aXRoIHRoZSB2YXJpb3VzCisvLy8gUGFzc2VzIGJ1dCBhbHNvIG9jY3VycyBlbHNld2hlcmUgaW4gTExWTS4gV2UgbGlrZSB0byB1c2UgLmEgZmlsZXMgYmVjYXVzZQorLy8vIHRoZXkgbGluayBmYXN0ZXIgYW5kIHByb3ZpZGUgdGhlIHNtYWxsZXN0IGV4ZWN1dGFibGVzLiBIb3dldmVyLCBzb21ldGltZXMKKy8vLyB0aG9zZSBleGVjdXRhYmxlcyBhcmUgdG9vIHNtYWxsLCBpZiB0aGUgcHJvZ3JhbSBkb2Vzbid0IHJlZmVyZW5jZSBzb21ldGhpbmcKKy8vLyB0aGF0IG1pZ2h0IGJlIG5lZWRlZCwgZXNwZWNpYWxseSBieSBhIGxvYWRlZCBzaGFyZSBvYmplY3QuIFRoaXMgbGl0dGxlIGNsYXNzCisvLy8gaGVscHMgdG8gcmVzb2x2ZSB0aGF0IHByb2JsZW0uIFRoZSBiYXNpYyBzdHJhdGVneSBpcyB0byB1c2UgdGhpcyBjbGFzcyBpbgorLy8vIGEgaGVhZGVyIGZpbGUgYW5kIHBhc3MgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSB0byB0aGUgY29uc3RydWN0b3IuIElmIHRoZQorLy8vIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gdGhlIGhlYWRlciBmaWxlJ3MgY29ycmVzcG9uZGluZyAuY3BwIGZpbGUgdGhlbiBhbGwKKy8vLyB0b29scy9saWJyYXJpZXMgdGhhdCBcI2luY2x1ZGUgdGhlIGhlYWRlciBmaWxlIHdpbGwgcmVxdWlyZSB0aGUgLmNwcCBhcworLy8vIHdlbGwuCisvLy8gRm9yIGV4YW1wbGU6PGJyLz4KKy8vLyA8dHQ+ZXh0ZXJuIGludCBMaW5rTXlDb2RlU3R1Yjs8L3R0Pjxici8+CisvLy8gPHR0PnN0YXRpYyBJbmNsdWRlRmlsZSBMaW5rTXlNb2R1bGUoJkxpbmtNeUNvZGVTdHViKTs8L3R0Pjxici8+CisvLy8gQGJyaWVmIENsYXNzIHRvIGVuc3VyZSBsaW5raW5nIG9mIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGZpbGUuCitzdHJ1Y3QgSW5jbHVkZUZpbGUgeworICBleHBsaWNpdCBJbmNsdWRlRmlsZShjb25zdCB2b2lkICopOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vTElDRU5TRS5UWFQgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL0xJQ0VOU0UuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjlkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL0xJQ0VOU0UuVFhUCkBAIC0wLDAgKzEsNiBAQAorTExWTSBTeXN0ZW0gSW50ZXJmYWNlIExpYnJhcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBMTFZNIFN5c3RlbSBJbnRlcmZhY2UgTGlicmFyeSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCitMaWNlbnNlIGFuZCBoYXMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGNvcHlyaWdodDoKKworQ29weXJpZ2h0IChDKSAyMDA0IGVYdGVuc2libGUgU3lzdGVtcywgSW5jLgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9NZW1vcnkuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vTWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiY2FiMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vTWVtb3J5LmgKQEAgLTAsMCArMSw5NyBAQAorLy89PT0tIGxsdm0vU3lzdGVtL01lbW9yeS5oIC0gTWVtb3J5IFN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6TWVtb3J5IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWVNURU1fTUVNT1JZX0gKKyNkZWZpbmUgTExWTV9TWVNURU1fTUVNT1JZX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKKyAgLy8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBub3Rpb24gb2YgYSBtZW1vcnkgYmxvY2sgd2hpY2ggaGFzIGFuIGFkZHJlc3MKKyAgLy8vIGFuZCBhIHNpemUuIEl0IGlzIHVzZWQgYnkgdGhlIE1lbW9yeSBjbGFzcyAoYSBmcmllbmQpIGFzIHRoZSByZXN1bHQgb2YKKyAgLy8vIHZhcmlvdXMgbWVtb3J5IGFsbG9jYXRpb24gb3BlcmF0aW9ucy4KKyAgLy8vIEBzZWUgTWVtb3J5CisgIC8vLyBAYnJpZWYgTWVtb3J5IGJsb2NrIGFic3RyYWN0aW9uLgorICBjbGFzcyBNZW1vcnlCbG9jayB7CisgIHB1YmxpYzoKKyAgICBNZW1vcnlCbG9jaygpIDogQWRkcmVzcygwKSwgU2l6ZSgwKSB7IH0KKyAgICBNZW1vcnlCbG9jayh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkgOiBBZGRyZXNzKGFkZHIpLCBTaXplKHNpemUpIHsgfQorICAgIHZvaWQgKmJhc2UoKSBjb25zdCB7IHJldHVybiBBZGRyZXNzOyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisgIHByaXZhdGU6CisgICAgdm9pZCAqQWRkcmVzczsgICAgLy8vPCBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgbWVtb3J5IGFyZWEKKyAgICBzaXplX3QgU2l6ZTsgICAgICAvLy88IFNpemUsIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgYXJlYQorICAgIGZyaWVuZCBjbGFzcyBNZW1vcnk7CisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgdmFyaW91cyBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zIHRoYXQgbWFuaXB1bGF0ZQorICAvLy8gTWVtb3J5QmxvY2sgaW5zdGFuY2VzLgorICAvLy8gQHNpbmNlIDEuNAorICAvLy8gQGJyaWVmIEFuIGFic3RyYWN0aW9uIGZvciBtZW1vcnkgb3BlcmF0aW9ucy4KKyAgY2xhc3MgTWVtb3J5IHsKKyAgcHVibGljOgorICAgIC8vLyBUaGlzIG1ldGhvZCBhbGxvY2F0ZXMgYSBibG9jayBvZiBSZWFkL1dyaXRlL0V4ZWN1dGUgbWVtb3J5IHRoYXQgaXMKKyAgICAvLy8gc3VpdGFibGUgZm9yIGV4ZWN1dGluZyBkeW5hbWljYWxseSBnZW5lcmF0ZWQgY29kZSAoZS5nLiBKSVQpLiBBbgorICAgIC8vLyBhdHRlbXB0IHRvIGFsbG9jYXRlIFxwIE51bUJ5dGVzIGJ5dGVzIG9mIHZpcnR1YWwgbWVtb3J5IGlzIG1hZGUuCisgICAgLy8vIFxwIE5lYXJCbG9jayBtYXkgcG9pbnQgdG8gYW4gZXhpc3RpbmcgYWxsb2NhdGlvbiBpbiB3aGljaCBjYXNlCisgICAgLy8vIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeSBuZWFyIHRoZSBleGlzdGluZyBibG9jay4KKyAgICAvLy8KKyAgICAvLy8gT24gc3VjY2VzcywgdGhpcyByZXR1cm5zIGEgbm9uLW51bGwgbWVtb3J5IGJsb2NrLCBvdGhlcndpc2UgaXQgcmV0dXJucworICAgIC8vLyBhIG51bGwgbWVtb3J5IGJsb2NrIGFuZCBmaWxscyBpbiAqRXJyTXNnLgorICAgIC8vLyAKKyAgICAvLy8gQGJyaWVmIEFsbG9jYXRlIFJlYWQvV3JpdGUvRXhlY3V0ZSBtZW1vcnkuCisgICAgc3RhdGljIE1lbW9yeUJsb2NrIEFsbG9jYXRlUldYKHNpemVfdCBOdW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5QmxvY2sgKk5lYXJCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZyA9IDApOworCisgICAgLy8vIFRoaXMgbWV0aG9kIHJlbGVhc2VzIGEgYmxvY2sgb2YgUmVhZC9Xcml0ZS9FeGVjdXRlIG1lbW9yeSB0aGF0IHdhcworICAgIC8vLyBhbGxvY2F0ZWQgd2l0aCB0aGUgQWxsb2NhdGVSV1ggbWV0aG9kLiBJdCBzaG91bGQgbm90IGJlIHVzZWQgdG8KKyAgICAvLy8gcmVsZWFzZSBhbnkgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBhbnkgb3RoZXIgd2F5LgorICAgIC8vLworICAgIC8vLyBPbiBzdWNjZXNzLCB0aGlzIHJldHVybnMgZmFsc2UsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRydWUgYW5kIGZpbGxzCisgICAgLy8vIGluICpFcnJNc2cuCisgICAgLy8vIEB0aHJvd3Mgc3RkOjpzdHJpbmcgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgLy8vIEBicmllZiBSZWxlYXNlIFJlYWQvV3JpdGUvRXhlY3V0ZSBtZW1vcnkuCisgICAgc3RhdGljIGJvb2wgUmVsZWFzZVJXWChNZW1vcnlCbG9jayAmYmxvY2ssIHN0ZDo6c3RyaW5nICpFcnJNc2cgPSAwKTsKKyAgICAKKyAgICAKKyAgICAvLy8gSW52YWxpZGF0ZUluc3RydWN0aW9uQ2FjaGUgLSBCZWZvcmUgdGhlIEpJVCBjYW4gcnVuIGEgYmxvY2sgb2YgY29kZQorICAgIC8vLyB0aGF0IGhhcyBiZWVuIGVtaXR0ZWQgaXQgbXVzdCBpbnZhbGlkYXRlIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSBvbiBzb21lCisgICAgLy8vIHBsYXRmb3Jtcy4KKyAgICBzdGF0aWMgdm9pZCBJbnZhbGlkYXRlSW5zdHJ1Y3Rpb25DYWNoZShjb25zdCB2b2lkICpBZGRyLCBzaXplX3QgTGVuKTsKKworICAgIC8vLyBzZXRFeGVjdXRhYmxlIC0gQmVmb3JlIHRoZSBKSVQgY2FuIHJ1biBhIGJsb2NrIG9mIGNvZGUsIGl0IGhhcyB0byBiZQorICAgIC8vLyBnaXZlbiByZWFkIGFuZCBleGVjdXRhYmxlIHByaXZpbGVnZS4gUmV0dXJuIHRydWUgaWYgaXQgaXMgYWxyZWFkeSByLXgKKyAgICAvLy8gb3IgdGhlIHN5c3RlbSBpcyBhYmxlIHRvIGNoYW5nZSBpdHMgcHJldmlsZWdlLgorICAgIHN0YXRpYyBib29sIHNldEV4ZWN1dGFibGUgKE1lbW9yeUJsb2NrICZNLCBzdGQ6OnN0cmluZyAqRXJyTXNnID0gMCk7CisKKyAgICAvLy8gc2V0V3JpdGFibGUgLSBXaGVuIGFkZGluZyB0byBhIGJsb2NrIG9mIGNvZGUsIHRoZSBKSVQgbWF5IG5lZWQKKyAgICAvLy8gdG8gbWFyayBhIGJsb2NrIG9mIGNvZGUgYXMgUlcgc2luY2UgdGhlIHByb3RlY3Rpb25zIGFyZSBvbiBwYWdlCisgICAgLy8vIGJvdW5kYXJpZXMsIGFuZCB0aGUgSklUIGludGVybmFsIGFsbG9jYXRpb25zIGFyZSBub3QgcGFnZSBhbGlnbmVkLgorICAgIHN0YXRpYyBib29sIHNldFdyaXRhYmxlIChNZW1vcnlCbG9jayAmTSwgc3RkOjpzdHJpbmcgKkVyck1zZyA9IDApOworCisgICAgLy8vIHNldFJhbmdlRXhlY3V0YWJsZSAtIE1hcmsgdGhlIHBhZ2UgY29udGFpbmluZyBhIHJhbmdlIG9mIGFkZHJlc3NlcyAKKyAgICAvLy8gYXMgZXhlY3V0YWJsZS4KKyAgICBzdGF0aWMgYm9vbCBzZXRSYW5nZUV4ZWN1dGFibGUoY29uc3Qgdm9pZCAqQWRkciwgc2l6ZV90IFNpemUpOworCisgICAgLy8vIHNldFJhbmdlV3JpdGFibGUgLSBNYXJrIHRoZSBwYWdlIGNvbnRhaW5pbmcgYSByYW5nZSBvZiBhZGRyZXNzZXMgCisgICAgLy8vIGFzIHdyaXRhYmxlLgorICAgIHN0YXRpYyBib29sIHNldFJhbmdlV3JpdGFibGUoY29uc3Qgdm9pZCAqQWRkciwgc2l6ZV90IFNpemUpOworICB9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vTXV0ZXguaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vTXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWQxMDA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9NdXRleC5oCkBAIC0wLDAgKzEsMTU0IEBACisvLz09PS0gbGx2bS9TeXN0ZW0vTXV0ZXguaCAtIE11dGV4IE9wZXJhdGluZyBTeXN0ZW0gQ29uY2VwdCAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpNdXRleCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1lTVEVNX01VVEVYX0gKKyNkZWZpbmUgTExWTV9TWVNURU1fTVVURVhfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vVGhyZWFkaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0KK3sKKyAgbmFtZXNwYWNlIHN5cworICB7CisgICAgLy8vIEBicmllZiBQbGF0Zm9ybSBhZ25vc3RpYyBNdXRleCBjbGFzcy4KKyAgICBjbGFzcyBNdXRleEltcGwKKyAgICB7CisgICAgLy8vIEBuYW1lIENvbnN0cnVjdG9ycworICAgIC8vLyBAeworICAgIHB1YmxpYzoKKworICAgICAgLy8vIEluaXRpYWxpemVzIHRoZSBsb2NrIGJ1dCBkb2Vzbid0IGFjcXVpcmUgaXQuIGlmIFxwIHJlY3Vyc2l2ZSBpcyBzZXQKKyAgICAgIC8vLyB0byBmYWxzZSwgdGhlIGxvY2sgd2lsbCBub3QgYmUgcmVjdXJzaXZlIHdoaWNoIG1ha2VzIGl0IGNoZWFwZXIgYnV0CisgICAgICAvLy8gYWxzbyBtb3JlIGxpa2VseSB0byBkZWFkbG9jayAoc2FtZSB0aHJlYWQgY2FuJ3QgYWNxdWlyZSBtb3JlIHRoYW4KKyAgICAgIC8vLyBvbmNlKS4KKyAgICAgIC8vLyBAYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICAgIGV4cGxpY2l0IE11dGV4SW1wbChib29sIHJlY3Vyc2l2ZSA9IHRydWUpOworCisgICAgICAvLy8gUmVsZWFzZXMgYW5kIHJlbW92ZXMgdGhlIGxvY2sKKyAgICAgIC8vLyBAYnJpZWYgRGVzdHJ1Y3RvcgorICAgICAgfk11dGV4SW1wbCgpOworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIE1ldGhvZHMKKyAgICAvLy8gQHsKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vLyBBdHRlbXB0cyB0byB1bmNvbmRpdGlvbmFsbHkgYWNxdWlyZSB0aGUgbG9jay4gSWYgdGhlIGxvY2sgaXMgaGVsZCBieQorICAgICAgLy8vIGFub3RoZXIgdGhyZWFkLCB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdW50aWwgaXQgY2FuIGFjcXVpcmUgdGhlIGxvY2suCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgYW55IGtpbmQgb2YgZXJyb3Igb2NjdXJzLCB0cnVlIG90aGVyd2lzZS4KKyAgICAgIC8vLyBAYnJpZWYgVW5jb25kaXRpb25hbGx5IGFjcXVpcmUgdGhlIGxvY2suCisgICAgICBib29sIGFjcXVpcmUoKTsKKworICAgICAgLy8vIEF0dGVtcHRzIHRvIHJlbGVhc2UgdGhlIGxvY2suIElmIHRoZSBsb2NrIGlzIGhlbGQgYnkgdGhlIGN1cnJlbnQKKyAgICAgIC8vLyB0aHJlYWQsIHRoZSBsb2NrIGlzIHJlbGVhc2VkIGFsbG93aW5nIG90aGVyIHRocmVhZHMgdG8gYWNxdWlyZSB0aGUKKyAgICAgIC8vLyBsb2NrLgorICAgICAgLy8vIEByZXR1cm5zIGZhbHNlIGlmIGFueSBraW5kIG9mIGVycm9yIG9jY3VycywgdHJ1ZSBvdGhlcndpc2UuCisgICAgICAvLy8gQGJyaWVmIFVuY29uZGl0aW9uYWxseSByZWxlYXNlIHRoZSBsb2NrLgorICAgICAgYm9vbCByZWxlYXNlKCk7CisKKyAgICAgIC8vLyBBdHRlbXB0cyB0byBhY3F1aXJlIHRoZSBsb2NrIHdpdGhvdXQgYmxvY2tpbmcuIElmIHRoZSBsb2NrIGlzIG5vdAorICAgICAgLy8vIGF2YWlsYWJsZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHF1aWNrbHkgKHdpdGhvdXQgYmxvY2tpbmcpLiBJZgorICAgICAgLy8vIHRoZSBsb2NrIGlzIGF2YWlsYWJsZSwgaXQgaXMgYWNxdWlyZWQuCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgYW55IGtpbmQgb2YgZXJyb3Igb2NjdXJzIG9yIHRoZSBsb2NrIGlzIG5vdAorICAgICAgLy8vIGF2YWlsYWJsZSwgdHJ1ZSBvdGhlcndpc2UuCisgICAgICAvLy8gQGJyaWVmIFRyeSB0byBhY3F1aXJlIHRoZSBsb2NrLgorICAgICAgYm9vbCB0cnlhY3F1aXJlKCk7CisKKyAgICAvL0B9CisgICAgLy8vIEBuYW1lIFBsYXRmb3JtIERlcGVuZGVudCBEYXRhCisgICAgLy8vIEB7CisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQqIGRhdGFfOyAvLy88IFdlIGRvbid0IGtub3cgd2hhdCB0aGUgZGF0YSB3aWxsIGJlCisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgRG8gTm90IEltcGxlbWVudAorICAgIC8vLyBAeworICAgIHByaXZhdGU6CisgICAgICBNdXRleEltcGwoY29uc3QgTXV0ZXhJbXBsICYgb3JpZ2luYWwpOworICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTXV0ZXhJbXBsICYpOworICAgIC8vLyBAfQorICAgIH07CisgICAgCisgICAgCisgICAgLy8vIFNtYXJ0TXV0ZXggLSBBIG11dGV4IHdpdGggYSBjb21waWxlIHRpbWUgY29uc3RhbnQgcGFyYW1ldGVyIHRoYXQgCisgICAgLy8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgbXV0ZXggc2hvdWxkIGJlY29tZSBhIG5vLW9wIHdoZW4gd2UncmUgbm90CisgICAgLy8vIHJ1bm5pbmcgaW4gbXVsdGl0aHJlYWRlZCBtb2RlLgorICAgIHRlbXBsYXRlPGJvb2wgbXRfb25seT4KKyAgICBjbGFzcyBTbWFydE11dGV4IDogcHVibGljIE11dGV4SW1wbCB7CisgICAgICB1bnNpZ25lZCBhY3F1aXJlZDsKKyAgICAgIGJvb2wgcmVjdXJzaXZlOworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0IFNtYXJ0TXV0ZXgoYm9vbCByZWMgPSB0cnVlKSA6CisgICAgICAgIE11dGV4SW1wbChyZWMpLCBhY3F1aXJlZCgwKSwgcmVjdXJzaXZlKHJlYykgeyB9CisgICAgICAKKyAgICAgIGJvb2wgYWNxdWlyZSgpIHsKKyAgICAgICAgaWYgKCFtdF9vbmx5IHx8IGxsdm1faXNfbXVsdGl0aHJlYWRlZCgpKSB7CisgICAgICAgICAgcmV0dXJuIE11dGV4SW1wbDo6YWNxdWlyZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFNpbmdsZS10aHJlYWRlZCBkZWJ1Z2dpbmcgY29kZS4gIFRoaXMgd291bGQgYmUgcmFjeSBpbgorICAgICAgICAgIC8vIG11bHRpdGhyZWFkZWQgbW9kZSwgYnV0IHByb3ZpZGVzIG5vdCBzYW5pdHkgY2hlY2tzIGluIHNpbmdsZQorICAgICAgICAgIC8vIHRocmVhZGVkIG1vZGUuCisgICAgICAgICAgYXNzZXJ0KChyZWN1cnNpdmUgfHwgYWNxdWlyZWQgPT0gMCkgJiYgIkxvY2sgYWxyZWFkeSBhY3F1aXJlZCEhIik7CisgICAgICAgICAgKythY3F1aXJlZDsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBib29sIHJlbGVhc2UoKSB7CisgICAgICAgIGlmICghbXRfb25seSB8fCBsbHZtX2lzX211bHRpdGhyZWFkZWQoKSkgeworICAgICAgICAgIHJldHVybiBNdXRleEltcGw6OnJlbGVhc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBTaW5nbGUtdGhyZWFkZWQgZGVidWdnaW5nIGNvZGUuICBUaGlzIHdvdWxkIGJlIHJhY3kgaW4KKyAgICAgICAgICAvLyBtdWx0aXRocmVhZGVkIG1vZGUsIGJ1dCBwcm92aWRlcyBub3Qgc2FuaXR5IGNoZWNrcyBpbiBzaW5nbGUKKyAgICAgICAgICAvLyB0aHJlYWRlZCBtb2RlLgorICAgICAgICAgIGFzc2VydCgoKHJlY3Vyc2l2ZSAmJiBhY3F1aXJlZCkgfHwgKGFjcXVpcmVkID09IDEpKSAmJgorICAgICAgICAgICAgICAgICAiTG9jayBub3QgYWNxdWlyZWQgYmVmb3JlIHJlbGVhc2UhIik7CisgICAgICAgICAgLS1hY3F1aXJlZDsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBib29sIHRyeWFjcXVpcmUoKSB7CisgICAgICAgIGlmICghbXRfb25seSB8fCBsbHZtX2lzX211bHRpdGhyZWFkZWQoKSkKKyAgICAgICAgICByZXR1cm4gTXV0ZXhJbXBsOjp0cnlhY3F1aXJlKCk7CisgICAgICAgIGVsc2UgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAKKyAgICAgIHByaXZhdGU6CisgICAgICAgIFNtYXJ0TXV0ZXgoY29uc3QgU21hcnRNdXRleDxtdF9vbmx5PiAmIG9yaWdpbmFsKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU21hcnRNdXRleDxtdF9vbmx5PiAmKTsKKyAgICB9OworICAgIAorICAgIC8vLyBNdXRleCAtIEEgc3RhbmRhcmQsIGFsd2F5cyBlbmZvcmNlZCBtdXRleC4KKyAgICB0eXBlZGVmIFNtYXJ0TXV0ZXg8ZmFsc2U+IE11dGV4OworICAgIAorICAgIHRlbXBsYXRlPGJvb2wgbXRfb25seT4KKyAgICBjbGFzcyBTbWFydFNjb3BlZExvY2sgIHsKKyAgICAgIFNtYXJ0TXV0ZXg8bXRfb25seT4mIG10eDsKKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIFNtYXJ0U2NvcGVkTG9jayhTbWFydE11dGV4PG10X29ubHk+JiBtKSA6IG10eChtKSB7CisgICAgICAgIG10eC5hY3F1aXJlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIH5TbWFydFNjb3BlZExvY2soKSB7CisgICAgICAgIG10eC5yZWxlYXNlKCk7CisgICAgICB9CisgICAgfTsKKyAgICAKKyAgICB0eXBlZGVmIFNtYXJ0U2NvcGVkTG9jazxmYWxzZT4gU2NvcGVkTG9jazsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vUGF0aC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9QYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2MTc2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vUGF0aC5oCkBAIC0wLDAgKzEsNzE1IEBACisvLz09PS0gbGx2bS9TeXN0ZW0vUGF0aC5oIC0gUGF0aCBPcGVyYXRpbmcgU3lzdGVtIENvbmNlcHQgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpQYXRoIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWVNURU1fUEFUSF9ICisjZGVmaW5lIExMVk1fU1lTVEVNX1BBVEhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vVGltZVZhbHVlLmgiCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisgIC8vLyBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBiYXNpYyBmaWxlIHN5c3RlbSBpbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUuIEl0CisgIC8vLyBpcyBwYXR0ZXJuZWQgYWZ0ZXIgdGhlIHN0YXQoMikgVW5peCBvcGVyYXRpbmcgc3lzdGVtIGNhbGwgYnV0IG1hZGUKKyAgLy8vIHBsYXRmb3JtIGluZGVwZW5kZW50IGFuZCBlbGltaW5hdGVzIG1hbnkgb2YgdGhlIHVuaXgtc3BlY2lmaWMgZmllbGRzLgorICAvLy8gSG93ZXZlciwgdG8gc3VwcG9ydCBsbHZtLWFyLCB0aGUgbW9kZSwgdXNlciwgYW5kIGdyb3VwIGZpZWxkcyBhcmUKKyAgLy8vIHJldGFpbmVkLiBUaGVzZSBwZXJ0YWluIHRvIHVuaXggc2VjdXJpdHkgYW5kIG1heSBub3QgaGF2ZSBhIG1lYW5pbmdmdWwKKyAgLy8vIHZhbHVlIG9uIG5vbi1Vbml4IHBsYXRmb3Jtcy4gSG93ZXZlciwgdGhlIG90aGVyIGZpZWxkcyBzaG91bGQKKyAgLy8vIGFsd2F5cyBiZSBhcHBsaWNhYmxlIG9uIGFsbCBwbGF0Zm9ybXMuICBUaGUgc3RydWN0dXJlIGlzIGZpbGxlZCBpbiBieQorICAvLy8gdGhlIFBhdGhXaXRoU3RhdHVzIGNsYXNzLgorICAvLy8gQGJyaWVmIEZpbGUgc3RhdHVzIHN0cnVjdHVyZQorICBjbGFzcyBGaWxlU3RhdHVzIHsKKyAgcHVibGljOgorICAgIHVpbnQ2NF90ICAgIGZpbGVTaXplOyAgIC8vLzwgU2l6ZSBvZiB0aGUgZmlsZSBpbiBieXRlcworICAgIFRpbWVWYWx1ZSAgIG1vZFRpbWU7ICAgIC8vLzwgVGltZSBvZiBmaWxlJ3MgbW9kaWZpY2F0aW9uCisgICAgdWludDMyX3QgICAgbW9kZTsgICAgICAgLy8vPCBNb2RlIG9mIHRoZSBmaWxlLCBpZiBhcHBsaWNhYmxlCisgICAgdWludDMyX3QgICAgdXNlcjsgICAgICAgLy8vPCBVc2VyIElEIG9mIG93bmVyLCBpZiBhcHBsaWNhYmxlCisgICAgdWludDMyX3QgICAgZ3JvdXA7ICAgICAgLy8vPCBHcm91cCBJRCBvZiBvd25lciwgaWYgYXBwbGljYWJsZQorICAgIHVpbnQ2NF90ICAgIHVuaXF1ZUlEOyAgIC8vLzwgQSBudW1iZXIgdG8gdW5pcXVlbHkgSUQgdGhpcyBmaWxlCisgICAgYm9vbCAgICAgICAgaXNEaXIgIDogMTsgLy8vPCBUcnVlIGlmIHRoaXMgaXMgYSBkaXJlY3RvcnkuCisgICAgYm9vbCAgICAgICAgaXNGaWxlIDogMTsgLy8vPCBUcnVlIGlmIHRoaXMgaXMgYSBmaWxlLgorCisgICAgRmlsZVN0YXR1cygpIDogZmlsZVNpemUoMCksIG1vZFRpbWUoMCwwKSwgbW9kZSgwNzc3KSwgdXNlcig5OTkpLAorICAgICAgICAgICAgICAgICAgIGdyb3VwKDk5OSksIHVuaXF1ZUlEKDApLCBpc0RpcihmYWxzZSksIGlzRmlsZShmYWxzZSkgeyB9CisKKyAgICBUaW1lVmFsdWUgZ2V0VGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gbW9kVGltZTsgfQorICAgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBmaWxlU2l6ZTsgfQorICAgIHVpbnQzMl90IGdldE1vZGUoKSBjb25zdCB7IHJldHVybiBtb2RlOyB9CisgICAgdWludDMyX3QgZ2V0VXNlcigpIGNvbnN0IHsgcmV0dXJuIHVzZXI7IH0KKyAgICB1aW50MzJfdCBnZXRHcm91cCgpIGNvbnN0IHsgcmV0dXJuIGdyb3VwOyB9CisgICAgdWludDY0X3QgZ2V0VW5pcXVlSUQoKSBjb25zdCB7IHJldHVybiB1bmlxdWVJRDsgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciB0aGUgcGF0aCB0byBhIGZpbGUgb3IgZGlyZWN0b3J5CisgIC8vLyBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGZpbGVzeXN0ZW0gYW5kIHByb3ZpZGVzIHZhcmlvdXMgYmFzaWMgb3BlcmF0aW9ucworICAvLy8gb24gaXQuICBOb3RlIHRoYXQgdGhpcyBjbGFzcyBvbmx5IHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYSBwYXRoIHRvIGEgZmlsZQorICAvLy8gb3IgZGlyZWN0b3J5IHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHZhbGlkIGZvciBhIGdpdmVuIG1hY2hpbmUncyBmaWxlCisgIC8vLyBzeXN0ZW0uIFRoZSBjbGFzcyBpcyBwYXR0ZXJuZWQgYWZ0ZXIgdGhlIGphdmEuaW8uRmlsZSBjbGFzcyB3aXRoIHZhcmlvdXMKKyAgLy8vIGV4dGVuc2lvbnMgYW5kIHNldmVyYWwgb21pc3Npb25zIChub3QgcmVsZXZhbnQgdG8gTExWTSkuICBBIFBhdGggb2JqZWN0CisgIC8vLyBlbnN1cmVzIHRoYXQgdGhlIHBhdGggaXQgZW5jYXBzdWxhdGVzIGlzIHN5bnRhY3RpY2FsbHkgdmFsaWQgZm9yIHRoZQorICAvLy8gb3BlcmF0aW5nIHN5c3RlbSBpdCBpcyBydW5uaW5nIG9uIGJ1dCBkb2VzIG5vdCBlbnN1cmUgY29ycmVjdG5lc3MgZm9yCisgIC8vLyBhbnkgcGFydGljdWxhciBmaWxlIHN5c3RlbS4gVGhhdCBpcywgYSBzeW50YWN0aWNhbGx5IHZhbGlkIHBhdGggbWlnaHQKKyAgLy8vIHNwZWNpZnkgcGF0aCBjb21wb25lbnRzIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgdXNpbmcKKyAgLy8vIHN1Y2ggYSBQYXRoIHRvIGFjdCBvbiB0aGUgZmlsZSBzeXN0ZW0gY291bGQgcHJvZHVjZSBlcnJvcnMuIFRoZXJlIGlzIG9uZQorICAvLy8gaW52YWxpZCBQYXRoIHZhbHVlIHdoaWNoIGlzIHBlcm1pdHRlZDogdGhlIGVtcHR5IHBhdGguICBUaGUgY2xhc3Mgc2hvdWxkCisgIC8vLyBuZXZlciBhbGxvdyBhIHN5bnRhY3RpY2FsbHkgaW52YWxpZCBub24tZW1wdHkgcGF0aCBuYW1lIHRvIGJlIGFzc2lnbmVkLgorICAvLy8gRW1wdHkgcGF0aHMgYXJlIHJlcXVpcmVkIGluIG9yZGVyIHRvIGluZGljYXRlIGFuIGVycm9yIHJlc3VsdCBpbiBzb21lCisgIC8vLyBzaXR1YXRpb25zLiBJZiB0aGUgcGF0aCBpcyBlbXB0eSwgdGhlIGlzVmFsaWQgb3BlcmF0aW9uIHdpbGwgcmV0dXJuCisgIC8vLyBmYWxzZS4gQWxsIG9wZXJhdGlvbnMgd2lsbCBmYWlsIGlmIGlzVmFsaWQgaXMgZmFsc2UuIE9wZXJhdGlvbnMgdGhhdAorICAvLy8gY2hhbmdlIHRoZSBwYXRoIHdpbGwgZWl0aGVyIHJldHVybiBmYWxzZSBpZiBpdCB3b3VsZCBjYXVzZSBhIHN5bnRhY3RpY2FsbHkKKyAgLy8vIGludmFsaWQgcGF0aCBuYW1lIChpbiB3aGljaCBjYXNlIHRoZSBQYXRoIG9iamVjdCBpcyBsZWZ0IHVuY2hhbmdlZCkgb3IKKyAgLy8vIHRocm93IGFuIHN0ZDo6c3RyaW5nIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoZSBlcnJvci4gVGhlIG1ldGhvZHMgYXJlCisgIC8vLyBncm91cGVkIGludG8gZm91ciBiYXNpYyBjYXRlZ29yaWVzOiBQYXRoIEFjY2Vzc29ycyAocHJvdmlkZSBpbmZvcm1hdGlvbgorICAvLy8gYWJvdXQgdGhlIHBhdGggd2l0aG91dCBhY2Nlc3NpbmcgZGlzayksIERpc2sgQWNjZXNzb3JzIChwcm92aWRlCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdW5kZXJseWluZyBmaWxlIG9yIGRpcmVjdG9yeSksIFBhdGggTXV0YXRvcnMKKyAgLy8vIChjaGFuZ2UgdGhlIHBhdGggaW5mb3JtYXRpb24sIG5vdCB0aGUgZGlzayksIGFuZCBEaXNrIE11dGF0b3JzIChjaGFuZ2UKKyAgLy8vIHRoZSBkaXNrIGZpbGUvZGlyZWN0b3J5IHJlZmVyZW5jZWQgYnkgdGhlIHBhdGgpLiBUaGUgRGlzayBNdXRhdG9yIG1ldGhvZHMKKyAgLy8vIGFsbCBoYXZlIHRoZSB3b3JkICJkaXNrIiBlbWJlZGRlZCBpbiB0aGVpciBtZXRob2QgbmFtZSB0byByZWluZm9yY2UgdGhlCisgIC8vLyBub3Rpb24gdGhhdCB0aGUgb3BlcmF0aW9uIG1vZGlmaWVzIHRoZSBmaWxlIHN5c3RlbS4KKyAgLy8vIEBzaW5jZSAxLjQKKyAgLy8vIEBicmllZiBBbiBhYnN0cmFjdGlvbiBmb3Igb3BlcmF0aW5nIHN5c3RlbSBwYXRocy4KKyAgY2xhc3MgUGF0aCB7CisgICAgLy8vIEBuYW1lIENvbnN0cnVjdG9ycworICAgIC8vLyBAeworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBDb25zdHJ1Y3QgYSBwYXRoIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgZmlsZSBzeXN0ZW0uIFRoZSByb290CisgICAgICAvLy8gZGlyZWN0b3J5IGlzIGEgdG9wIGxldmVsIGRpcmVjdG9yeSBhYm92ZSB3aGljaCB0aGVyZSBhcmUgbm8gbW9yZQorICAgICAgLy8vIGRpcmVjdG9yaWVzLiBGb3IgZXhhbXBsZSwgb24gVU5JWCwgdGhlIHJvb3QgZGlyZWN0b3J5IGlzIC8uIE9uIFdpbmRvd3MKKyAgICAgIC8vLyBpdCBpcyBDOlwuIE90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIG1heSBoYXZlIGRpZmZlcmVudCBub3Rpb25zIG9mCisgICAgICAvLy8gd2hhdCB0aGUgcm9vdCBkaXJlY3RvcnkgaXMgb3Igbm9uZSBhdCBhbGwuIEluIHRoYXQgY2FzZSwgYSBjb25zaXN0ZW50CisgICAgICAvLy8gZGVmYXVsdCByb290IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisgICAgICBzdGF0aWMgUGF0aCBHZXRSb290RGlyZWN0b3J5KCk7CisKKyAgICAgIC8vLyBDb25zdHJ1Y3QgYSBwYXRoIHRvIGEgdW5pcXVlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCBpcyBjcmVhdGVkIGluCisgICAgICAvLy8gYSAic3RhbmRhcmQiIHBsYWNlIGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gVGhlIGRpcmVjdG9yeSBpcworICAgICAgLy8vIGd1YXJhbnRlZWQgdG8gYmUgY3JlYXRlZCBvbiBleGl0IGZyb20gdGhpcyBmdW5jdGlvbi4gSWYgdGhlIGRpcmVjdG9yeQorICAgICAgLy8vIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgZnVuY3Rpb24gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgICAvLy8gQHJldHVybnMgYW4gaW52YWxpZCBwYXRoIChlbXB0eSkgb24gZXJyb3IKKyAgICAgIC8vLyBAcGFyYW0gRXJyTXNnIE9wdGlvbmFsIHBsYWNlIGZvciBhbiBlcnJvciBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3VycworICAgICAgLy8vIEBicmllZiBDb25zdHJjdCBhIHBhdGggdG8gYW4gbmV3LCB1bmlxdWUsIGV4aXN0aW5nIHRlbXBvcmFyeQorICAgICAgLy8vIGRpcmVjdG9yeS4KKyAgICAgIHN0YXRpYyBQYXRoIEdldFRlbXBvcmFyeURpcmVjdG9yeShzdGQ6OnN0cmluZyogRXJyTXNnID0gMCk7CisKKyAgICAgIC8vLyBDb25zdHJ1Y3QgYSB2ZWN0b3Igb2Ygc3lzOjpQYXRoIHRoYXQgY29udGFpbnMgdGhlICJzdGFuZGFyZCIgc3lzdGVtCisgICAgICAvLy8gbGlicmFyeSBwYXRocyBzdWl0YWJsZSBmb3IgbGlua2luZyBpbnRvIHByb2dyYW1zLiBUaGlzIGZ1bmN0aW9uICptdXN0KgorICAgICAgLy8vIHJldHVybiB0aGUgdmFsdWUgb2YgTExWTV9MSUJfU0VBUkNIX1BBVEggYXMgdGhlIGZpcnN0IGl0ZW0gaW4gXHAgUGF0aHMKKyAgICAgIC8vLyBpZiB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCBhbmQgaXQgcmVmZXJlbmNlcyBhIGRpcmVjdG9yeS4KKyAgICAgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgcGF0aCB0byB0aGUgc3lzdGVtIGxpYnJhcnkgZGlyZWN0b3J5CisgICAgICBzdGF0aWMgdm9pZCBHZXRTeXN0ZW1MaWJyYXJ5UGF0aHMoc3RkOjp2ZWN0b3I8c3lzOjpQYXRoPiYgUGF0aHMpOworCisgICAgICAvLy8gQ29uc3RydWN0IGEgdmVjdG9yIG9mIHN5czo6UGF0aCB0aGF0IGNvbnRhaW5zIHRoZSAic3RhbmRhcmQiIGJpdGNvZGUKKyAgICAgIC8vLyBsaWJyYXJ5IHBhdGhzIHN1aXRhYmxlIGZvciBsaW5raW5nIGludG8gYW4gbGx2bSBwcm9ncmFtLiBUaGlzIGZ1bmN0aW9uCisgICAgICAvLy8gKm11c3QqIHJldHVybiB0aGUgdmFsdWUgb2YgTExWTV9MSUJfU0VBUkNIX1BBVEggYXMgd2VsbCBhcyB0aGUgdmFsdWUKKyAgICAgIC8vLyBvZiBMTFZNX0xJQkRJUi4gSXQgYWxzbyBtdXN0IHByb3ZpZGUgdGhlIFN5c3RlbSBsaWJyYXJ5IHBhdGhzIGFzCisgICAgICAvLy8gcmV0dXJuZWQgYnkgR2V0U3lzdGVtTGlicmFyeVBhdGhzLgorICAgICAgLy8vIEBzZWUgR2V0U3lzdGVtTGlicmFyeVBhdGhzCisgICAgICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaW4gd2hpY2ggYml0Y29kZSBjb3VsZCBiZQorICAgICAgLy8vIGZvdW5kLgorICAgICAgc3RhdGljIHZvaWQgR2V0Qml0Y29kZUxpYnJhcnlQYXRocyhzdGQ6OnZlY3RvcjxzeXM6OlBhdGg+JiBQYXRocyk7CisKKyAgICAgIC8vLyBGaW5kIHRoZSBwYXRoIHRvIGEgbGlicmFyeSB1c2luZyBpdHMgc2hvcnQgbmFtZS4gVXNlIHRoZSBzeXN0ZW0KKyAgICAgIC8vLyBkZXBlbmRlbnQgbGlicmFyeSBwYXRocyB0byBsb2NhdGUgdGhlIGxpYnJhcnkuCisgICAgICAvLy8gQGJyaWVmIEZpbmQgYSBsaWJyYXJ5LgorICAgICAgc3RhdGljIFBhdGggRmluZExpYnJhcnkoc3RkOjpzdHJpbmcmIHNob3J0X25hbWUpOworCisgICAgICAvLy8gQ29uc3RydWN0IGEgcGF0aCB0byB0aGUgZGVmYXVsdCBMTFZNIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LiBUaGUKKyAgICAgIC8vLyBpbXBsZW1lbnRhdGlvbiBtdXN0IGVuc3VyZSB0aGF0IHRoaXMgaXMgYSB3ZWxsLWtub3duIChzYW1lIG9uIG1hbnkKKyAgICAgIC8vLyBzeXN0ZW1zKSBkaXJlY3RvcnkgaW4gd2hpY2ggbGx2bSBjb25maWd1cmF0aW9uIGZpbGVzIGV4aXN0LiBGb3IKKyAgICAgIC8vLyBleGFtcGxlLCBvbiBVbml4LCB0aGUgL2V0Yy9sbHZtIGRpcmVjdG9yeSBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgICAgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgcGF0aCB0byB0aGUgZGVmYXVsdCBMTFZNIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5CisgICAgICBzdGF0aWMgUGF0aCBHZXRMTFZNRGVmYXVsdENvbmZpZ0RpcigpOworCisgICAgICAvLy8gQ29uc3RydWN0IGEgcGF0aCB0byB0aGUgTExWTSBpbnN0YWxsZWQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuIFRoZQorICAgICAgLy8vIGltcGxlbWVudGF0aW9uIG11c3QgZW5zdXJlIHRoYXQgdGhpcyByZWZlcnMgdG8gdGhlICJldGMiIGRpcmVjdG9yeSBvZgorICAgICAgLy8vIHRoZSBMTFZNIGluc3RhbGxhdGlvbi4gVGhpcyBpcyB0aGUgbG9jYXRpb24gd2hlcmUgY29uZmlndXJhdGlvbiBmaWxlcworICAgICAgLy8vIHdpbGwgYmUgbG9jYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIGluc3RhbGxhdGlvbiBvZiBMTFZNIG9uIGEgbWFjaGluZS4KKyAgICAgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgcGF0aCB0byB0aGUgTExWTSBpbnN0YWxsZWQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkKKyAgICAgIHN0YXRpYyBQYXRoIEdldExMVk1Db25maWdEaXIoKTsKKworICAgICAgLy8vIENvbnN0cnVjdCBhIHBhdGggdG8gdGhlIGN1cnJlbnQgdXNlcidzIGhvbWUgZGlyZWN0b3J5LiBUaGUKKyAgICAgIC8vLyBpbXBsZW1lbnRhdGlvbiBtdXN0IHVzZSBhbiBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljIG1lY2hhbmlzbSBmb3IKKyAgICAgIC8vLyBkZXRlcm1pbmluZyB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LiBGb3IgZXhhbXBsZSwgdGhlIGVudmlyb25tZW50CisgICAgICAvLy8gdmFyaWFibGUgIkhPTUUiIGNvdWxkIGJlIHVzZWQgb24gVW5peC4gSWYgYSBnaXZlbiBvcGVyYXRpbmcgc3lzdGVtCisgICAgICAvLy8gZG9lcyBub3QgaGF2ZSB0aGUgY29uY2VwdCBvZiBhIHVzZXIncyBob21lIGRpcmVjdG9yeSwgdGhpcyBzdGF0aWMKKyAgICAgIC8vLyBjb25zdHJ1Y3RvciBtdXN0IHByb3ZpZGUgdGhlIHNhbWUgcmVzdWx0IGFzIEdldFJvb3REaXJlY3RvcnkuCisgICAgICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIHBhdGggdG8gdGhlIGN1cnJlbnQgdXNlcidzICJob21lIiBkaXJlY3RvcnkKKyAgICAgIHN0YXRpYyBQYXRoIEdldFVzZXJIb21lRGlyZWN0b3J5KCk7CisKKyAgICAgIC8vLyBDb25zdHJ1Y3QgYSBwYXRoIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgICAgIC8vLyBAcmV0dXJucyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgIC8vLyBAYnJpZWYgUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgIHN0YXRpYyBQYXRoIEdldEN1cnJlbnREaXJlY3RvcnkoKTsKKworICAgICAgLy8vIFJldHVybiB0aGUgc3VmZml4IGNvbW1vbmx5IHVzZWQgb24gZmlsZSBuYW1lcyB0aGF0IGNvbnRhaW4gYSBzaGFyZWQKKyAgICAgIC8vLyBvYmplY3QsIHNoYXJlZCBhcmNoaXZlLCBvciBkeW5hbWljIGxpbmsgbGlicmFyeS4gU3VjaCBmaWxlcyBhcmUKKyAgICAgIC8vLyBsaW5rZWQgYXQgcnVudGltZSBpbnRvIGEgcHJvY2VzcyBhbmQgdGhlaXIgY29kZSBpbWFnZXMgYXJlIHNoYXJlZAorICAgICAgLy8vIGJldHdlZW4gcHJvY2Vzc2VzLgorICAgICAgLy8vIEByZXR1cm5zIFRoZSBkeW5hbWljIGxpbmsgbGlicmFyeSBzdWZmaXggZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorICAgICAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGR5bmFtaWMgbGluayBsaWJyYXJ5IHN1ZmZpeC4KKyAgICAgIHN0YXRpYyBTdHJpbmdSZWYgR2V0RExMU3VmZml4KCk7CisKKyAgICAgIC8vLyBHZXRNYWluRXhlY3V0YWJsZSAtIFJldHVybiB0aGUgcGF0aCB0byB0aGUgbWFpbiBleGVjdXRhYmxlLCBnaXZlbiB0aGUKKyAgICAgIC8vLyB2YWx1ZSBvZiBhcmd2WzBdIGZyb20gcHJvZ3JhbSBzdGFydHVwIGFuZCB0aGUgYWRkcmVzcyBvZiBtYWluIGl0c2VsZi4KKyAgICAgIHN0YXRpYyBQYXRoIEdldE1haW5FeGVjdXRhYmxlKGNvbnN0IGNoYXIgKmFyZ3YwLCB2b2lkICpNYWluQWRkcik7CisKKyAgICAgIC8vLyBUaGlzIGlzIG9uZSBvZiB0aGUgdmVyeSBmZXcgd2F5cyBpbiB3aGljaCBhIHBhdGggY2FuIGJlIGNvbnN0cnVjdGVkCisgICAgICAvLy8gd2l0aCBhIHN5bnRhY3RpY2FsbHkgaW52YWxpZCBuYW1lLiBUaGUgb25seSAqbGVnYWwqIGludmFsaWQgbmFtZSBpcyBhbgorICAgICAgLy8vIGVtcHR5IG9uZS4gT3RoZXIgaW52YWxpZCBuYW1lcyBhcmUgbm90IHBlcm1pdHRlZC4gRW1wdHkgcGF0aHMgYXJlCisgICAgICAvLy8gcHJvdmlkZWQgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIG51bGwgb3IgZXJyb3IgcmVzdWx0cyBpbgorICAgICAgLy8vIG90aGVyIGxpYi9TeXN0ZW0gZnVuY3Rpb25hbGl0eS4KKyAgICAgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IChhbmQgaW52YWxpZCkgcGF0aC4KKyAgICAgIFBhdGgoKSA6IHBhdGgoKSB7fQorICAgICAgUGF0aChjb25zdCBQYXRoICZ0aGF0KSA6IHBhdGgodGhhdC5wYXRoKSB7fQorCisgICAgICAvLy8gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIGFjY2VwdCBhIGNoYXIqIG9yIHN0ZDo6c3RyaW5nIGFzIGEgcGF0aC4gTm8KKyAgICAgIC8vLyBjaGVja2luZyBpcyBkb25lIG9uIHRoaXMgcGF0aCB0byBkZXRlcm1pbmUgaWYgaXQgaXMgdmFsaWQuIFRvCisgICAgICAvLy8gZGV0ZXJtaW5lIHZhbGlkaXR5IG9mIHRoZSBwYXRoLCB1c2UgdGhlIGlzVmFsaWQgbWV0aG9kLgorICAgICAgLy8vIEBwYXJhbSBwIFRoZSBwYXRoIHRvIGFzc2lnbi4KKyAgICAgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgUGF0aCBmcm9tIGEgc3RyaW5nLgorICAgICAgZXhwbGljaXQgUGF0aChTdHJpbmdSZWYgcCk7CisKKyAgICAgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgYWNjZXB0IGEgY2hhcmFjdGVyIHJhbmdlIGFzIGEgcGF0aC4gIE5vIGNoZWNraW5nCisgICAgICAvLy8gaXMgZG9uZSBvbiB0aGlzIHBhdGggdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHZhbGlkLiAgVG8gZGV0ZXJtaW5lCisgICAgICAvLy8gdmFsaWRpdHkgb2YgdGhlIHBhdGgsIHVzZSB0aGUgaXNWYWxpZCBtZXRob2QuCisgICAgICAvLy8gQHBhcmFtIFN0clN0YXJ0IEEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBwYXRoIG5hbWUKKyAgICAgIC8vLyBAcGFyYW0gU3RyTGVuIFRoZSBsZW5ndGggb2YgdGhlIHBhdGggbmFtZSBhdCBTdHJTdGFydAorICAgICAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYSBQYXRoIGZyb20gYSBzdHJpbmcuCisgICAgICBQYXRoKGNvbnN0IGNoYXIgKlN0clN0YXJ0LCB1bnNpZ25lZCBTdHJMZW4pOworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIE9wZXJhdG9ycworICAgIC8vLyBAeworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBNYWtlcyBhIGNvcHkgb2YgXHAgdGhhdCB0byBccCB0aGlzLgorICAgICAgLy8vIEByZXR1cm5zIFxwIHRoaXMKKyAgICAgIC8vLyBAYnJpZWYgQXNzaWdubWVudCBPcGVyYXRvcgorICAgICAgUGF0aCAmb3BlcmF0b3I9KGNvbnN0IFBhdGggJnRoYXQpIHsKKyAgICAgICAgcGF0aCA9IHRoYXQucGF0aDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gTWFrZXMgYSBjb3B5IG9mIFxwIHRoYXQgdG8gXHAgdGhpcy4KKyAgICAgIC8vLyBAcGFyYW0gdGhhdCBBIFN0cmluZ1JlZiBkZW5vdGluZyB0aGUgcGF0aAorICAgICAgLy8vIEByZXR1cm5zIFxwIHRoaXMKKyAgICAgIC8vLyBAYnJpZWYgQXNzaWdubWVudCBPcGVyYXRvcgorICAgICAgUGF0aCAmb3BlcmF0b3I9KFN0cmluZ1JlZiB0aGF0KTsKKworICAgICAgLy8vIENvbXBhcmVzIFxwIHRoaXMgUGF0aCB3aXRoIFxwIHRoYXQgUGF0aCBmb3IgZXF1YWxpdHkuCisgICAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiBccCB0aGlzIGFuZCBccCB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIHRoaW5nLgorICAgICAgLy8vIEBicmllZiBFcXVhbGl0eSBPcGVyYXRvcgorICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhdGggJnRoYXQpIGNvbnN0OworCisgICAgICAvLy8gQ29tcGFyZXMgXHAgdGhpcyBQYXRoIHdpdGggXHAgdGhhdCBQYXRoIGZvciBpbmVxdWFsaXR5LgorICAgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgXHAgdGhpcyBhbmQgXHAgdGhhdCByZWZlciB0byBkaWZmZXJlbnQgdGhpbmdzLgorICAgICAgLy8vIEBicmllZiBJbmVxdWFsaXR5IE9wZXJhdG9yCisgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgUGF0aCAmdGhhdCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSB0aGF0KTsgfQorCisgICAgICAvLy8gRGV0ZXJtaW5lcyBpZiBccCB0aGlzIFBhdGggaXMgbGVzcyB0aGFuIFxwIHRoYXQgUGF0aC4gVGhpcyBpcyByZXF1aXJlZAorICAgICAgLy8vIHNvIHRoYXQgUGF0aCBvYmplY3RzIGNhbiBiZSBwbGFjZWQgaW50byBvcmRlcmVkIGNvbGxlY3Rpb25zIChlLmcuCisgICAgICAvLy8gc3RkOjptYXApLiBUaGUgY29tcGFyaXNvbiBpcyBkb25lIGxleGljb2dyYXBoaWNhbGx5IGFzIGRlZmluZWQgYnkKKyAgICAgIC8vLyB0aGUgc3RkOjpzdHJpbmc6OmNvbXBhcmUgbWV0aG9kLgorICAgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgXHAgdGhpcyBwYXRoIGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBccCB0aGF0LgorICAgICAgLy8vIEBicmllZiBMZXNzIFRoYW4gT3BlcmF0b3IKKyAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFBhdGgmIHRoYXQpIGNvbnN0OworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIFBhdGggQWNjZXNzb3JzCisgICAgLy8vIEB7CisgICAgcHVibGljOgorICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCB1c2UgYW4gb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBhbGdvcml0aG0gdG8KKyAgICAgIC8vLyBkZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgXHAgdGhpcyBpcyBhIHN5bnRhY3RpY2FsbHkgdmFsaWQKKyAgICAgIC8vLyBwYXRoIG5hbWUgZm9yIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBUaGUgcGF0aCBuYW1lIGRvZXMgbm90IG5lZWQgdG8KKyAgICAgIC8vLyBleGlzdCwgdmFsaWRpdHkgaXMgc2ltcGx5IHN5bnRhY3RpY2FsLiBFbXB0eSBwYXRocyBhcmUgYWx3YXlzIGludmFsaWQuCisgICAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhdGggbmFtZSBpcyBzeW50YWN0aWNhbGx5IGxlZ2FsIGZvciB0aGUKKyAgICAgIC8vLyBob3N0IG9wZXJhdGluZyBzeXN0ZW0uCisgICAgICAvLy8gQGJyaWVmIERldGVybWluZSBpZiBhIHBhdGggaXMgc3ludGFjdGljYWxseSB2YWxpZCBvciBub3QuCisgICAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgY29udGVudHMgb2YgdGhlIHBhdGggbmFtZSBhcmUgZW1wdHkuCisgICAgICAvLy8gVGhhdCBpcywgdGhlIHBhdGggbmFtZSBoYXMgYSB6ZXJvIGxlbmd0aC4gVGhpcyBkb2VzIE5PVCBkZXRlcm1pbmUgaWYKKyAgICAgIC8vLyBpZiB0aGUgZmlsZSBpcyBlbXB0eS4gVG8gZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgaXRzZWxmLCBVc2UgdGhlCisgICAgICAvLy8gUGF0aFdpdGhTdGF0dXM6OmdldEZpbGVTdGF0dXMoKSBtZXRob2QgYW5kIHRoZW4gdGhlIGdldFNpemUoKSBtZXRob2QKKyAgICAgIC8vLyBvbiB0aGUgcmV0dXJuZWQgRmlsZVN0YXR1cyBvYmplY3QuCisgICAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhdGggaXMgZW1wdHkuCisgICAgICAvLy8gQGJyaWVmIERldGVybWluZXMgaWYgdGhlIHBhdGggbmFtZSBpcyBlbXB0eSAoaW52YWxpZCkuCisgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBwYXRoLmVtcHR5KCk7IH0KKworICAgICAgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoIG5hbWUuIFRoZSBsYXN0CisgICAgICAvLy8gY29tcG9uZW50IGlzIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lIG9jY3VyaW5nIGFmdGVyIHRoZSBsYXN0CisgICAgICAvLy8gZGlyZWN0b3J5IHNlcGFyYXRvci4gSWYgbm8gZGlyZWN0b3J5IHNlcGFyYXRvciBpcyBwcmVzZW50LCB0aGUgZW50aXJlCisgICAgICAvLy8gcGF0aCBuYW1lIGlzIHJldHVybmVkIChpLmUuIHNhbWUgYXMgdG9TdHJpbmcpLgorICAgICAgLy8vIEByZXR1cm5zIFN0cmluZ1JlZiBjb250YWluaW5nIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aCBuYW1lLgorICAgICAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aCBuYW1lLgorICAgICAgU3RyaW5nUmVmIGdldExhc3QoKSBjb25zdDsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gc3RyaXBzIG9mZiB0aGUgcGF0aCBhbmQgc3VmZml4IG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeQorICAgICAgLy8vIG5hbWUgYW5kIHJldHVybnMganVzdCB0aGUgYmFzZW5hbWUuIEZvciBleGFtcGxlIC9hL2Zvby5iYXIgd291bGQgY2F1c2UKKyAgICAgIC8vLyB0aGlzIGZ1bmN0aW9uIHRvIHJldHVybiAiZm9vIi4KKyAgICAgIC8vLyBAcmV0dXJucyBTdHJpbmdSZWYgY29udGFpbmluZyB0aGUgYmFzZW5hbWUgb2YgdGhlIHBhdGgKKyAgICAgIC8vLyBAYnJpZWYgR2V0IHRoZSBiYXNlIG5hbWUgb2YgdGhlIHBhdGgKKyAgICAgIFN0cmluZ1JlZiBnZXRCYXNlbmFtZSgpIGNvbnN0OworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiBzdHJpcHMgb2ZmIHRoZSBzdWZmaXggb2YgdGhlIHBhdGggYmVnaW5uaW5nIHdpdGggdGhlCisgICAgICAvLy8gcGF0aCBzZXBhcmF0b3IgKCcvJyBvbiBVbml4LCAnXCcgb24gV2luZG93cykgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICAgIFN0cmluZ1JlZiBnZXREaXJuYW1lKCkgY29uc3Q7CisKKyAgICAgIC8vLyBUaGlzIGZ1bmN0aW9uIHN0cmlwcyBvZmYgdGhlIHBhdGggYW5kIGJhc2VuYW1lKHVwIHRvIGFuZAorICAgICAgLy8vIGluY2x1ZGluZyB0aGUgbGFzdCBkb3QpIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lIGFuZAorICAgICAgLy8vIHJldHVybnMganVzdCB0aGUgc3VmZml4LiBGb3IgZXhhbXBsZSAvYS9mb28uYmFyIHdvdWxkIGNhdXNlCisgICAgICAvLy8gdGhpcyBmdW5jdGlvbiB0byByZXR1cm4gImJhciIuCisgICAgICAvLy8gQHJldHVybnMgU3RyaW5nUmVmIGNvbnRhaW5pbmcgdGhlIHN1ZmZpeCBvZiB0aGUgcGF0aAorICAgICAgLy8vIEBicmllZiBHZXQgdGhlIHN1ZmZpeCBvZiB0aGUgcGF0aAorICAgICAgU3RyaW5nUmVmIGdldFN1ZmZpeCgpIGNvbnN0OworCisgICAgICAvLy8gT2J0YWluIGEgJ0MnIHN0cmluZyBmb3IgdGhlIHBhdGggbmFtZS4KKyAgICAgIC8vLyBAcmV0dXJucyBhICdDJyBzdHJpbmcgY29udGFpbmluZyB0aGUgcGF0aCBuYW1lLgorICAgICAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBwYXRoIGFzIGEgQyBzdHJpbmcuCisgICAgICBjb25zdCBjaGFyICpjX3N0cigpIGNvbnN0IHsgcmV0dXJuIHBhdGguY19zdHIoKTsgfQorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cigpIGNvbnN0IHsgcmV0dXJuIHBhdGg7IH0KKworCisgICAgICAvLy8gc2l6ZSAtIFJldHVybiB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoaXMgcGF0aCBuYW1lLgorICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBwYXRoLnNpemUoKTsgfQorCisgICAgICAvLy8gZW1wdHkgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggaXMgZW1wdHkuCisgICAgICB1bnNpZ25lZCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHBhdGguZW1wdHkoKTsgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIERpc2sgQWNjZXNzb3JzCisgICAgLy8vIEB7CisgICAgcHVibGljOgorICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcGF0aCBuYW1lIGlzIGFic29sdXRlLCBhcyBvcHBvc2VkIHRvCisgICAgICAvLy8gcmVsYXRpdmUuCisgICAgICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgcGF0aCBpcyBhYnNvbHV0ZS4KKyAgICAgIGJvb2wgaXNBYnNvbHV0ZSgpIGNvbnN0OworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwYXRoIG5hbWUgaXMgYWJzb2x1dGUsIGFzIG9wcG9zZWQgdG8KKyAgICAgIC8vLyByZWxhdGl2ZS4KKyAgICAgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLgorICAgICAgc3RhdGljIGJvb2wgaXNBYnNvbHV0ZShjb25zdCBjaGFyICpOYW1lU3RhcnQsIHVuc2lnbmVkIE5hbWVMZW4pOworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhdGggbmFtZSBwcm92aWRlZCBieQorICAgICAgLy8vIHRoZSBQYXRoIG9iamVjdCBhbmQgcmVhZHMgaXRzIG1hZ2ljIG51bWJlci4gSWYgdGhlIG1hZ2ljIG51bWJlciBhdCB0aGUKKyAgICAgIC8vLyBzdGFydCBvZiB0aGUgZmlsZSBtYXRjaGVzIFxwIG1hZ2ljLCB0cnVlIGlzIHJldHVybmVkLiBJbiBhbGwgb3RoZXIKKyAgICAgIC8vLyBjYXNlcyAoZmlsZSBub3QgZm91bmQsIGZpbGUgbm90IGFjY2Vzc2libGUsIGV0Yy4pIGl0IHJldHVybnMgZmFsc2UuCisgICAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBmaWxlIG1hdGNoZXMgXHAgbWFnaWMuCisgICAgICAvLy8gQGJyaWVmIERldGVybWluZSBpZiBmaWxlIGhhcyBhIHNwZWNpZmljIG1hZ2ljIG51bWJlcgorICAgICAgYm9vbCBoYXNNYWdpY051bWJlcihTdHJpbmdSZWYgbWFnaWMpIGNvbnN0OworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGZpcnN0IFxwIGxlbiBieXRlcyBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkCisgICAgICAvLy8gd2l0aCBccCB0aGlzLiBUaGVzZSBieXRlcyBhcmUgcmV0dXJuZWQgYXMgdGhlICJtYWdpYyBudW1iZXIiIGluIHRoZQorICAgICAgLy8vIFxwIE1hZ2ljIHBhcmFtZXRlci4KKyAgICAgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBQYXRoIGlzIGEgZmlsZSBhbmQgdGhlIG1hZ2ljIG51bWJlciBpcyByZXRyaWV2ZWQsCisgICAgICAvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgLy8vIEBicmllZiBHZXQgdGhlIGZpbGUncyBtYWdpYyBudW1iZXIuCisgICAgICBib29sIGdldE1hZ2ljTnVtYmVyKHN0ZDo6c3RyaW5nJiBNYWdpYywgdW5zaWduZWQgbGVuKSBjb25zdDsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcGF0aCBuYW1lIGluIHRoZSBvYmplY3QgcmVmZXJlbmNlcyBhbgorICAgICAgLy8vIGFyY2hpdmUgZmlsZSBieSBsb29raW5nIGF0IGl0cyBtYWdpYyBudW1iZXIuCisgICAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBzdGFydHMgd2l0aCB0aGUgbWFnaWMgbnVtYmVyIGZvciBhbiBhcmNoaXZlCisgICAgICAvLy8gZmlsZS4KKyAgICAgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBwYXRoIHJlZmVyZW5jZXMgYW4gYXJjaGl2ZSBmaWxlLgorICAgICAgYm9vbCBpc0FyY2hpdmUoKSBjb25zdDsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcGF0aCBuYW1lIGluIHRoZSBvYmplY3QgcmVmZXJlbmNlcyBhbgorICAgICAgLy8vIExMVk0gQml0Y29kZSBmaWxlIGJ5IGxvb2tpbmcgYXQgaXRzIG1hZ2ljIG51bWJlci4KKyAgICAgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIHN0YXJ0cyB3aXRoIHRoZSBtYWdpYyBudW1iZXIgZm9yIExMVk0KKyAgICAgIC8vLyBiaXRjb2RlIGZpbGVzLgorICAgICAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHBhdGggcmVmZXJlbmNlcyBhIGJpdGNvZGUgZmlsZS4KKyAgICAgIGJvb2wgaXNCaXRjb2RlRmlsZSgpIGNvbnN0OworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwYXRoIG5hbWUgaW4gdGhlIG9iamVjdCByZWZlcmVuY2VzIGEKKyAgICAgIC8vLyBuYXRpdmUgRHluYW1pYyBMaWJyYXJ5IChzaGFyZWQgbGlicmFyeSwgc2hhcmVkIG9iamVjdCkgYnkgbG9va2luZyBhdAorICAgICAgLy8vIHRoZSBmaWxlJ3MgbWFnaWMgbnVtYmVyLiBUaGUgUGF0aCBvYmplY3QgbXVzdCByZWZlcmVuY2UgYSBmaWxlLCBub3QgYQorICAgICAgLy8vIGRpcmVjdG9yeS4KKyAgICAgIC8vLyBAcmV0dXJuIHN0cnVlIGlmIHRoZSBmaWxlIHN0YXJ0cyB3aXRoIHRoZSBtYWdpZCBudW1iZXIgZm9yIGEgbmF0aXZlCisgICAgICAvLy8gc2hhcmVkIGxpYnJhcnkuCisgICAgICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgcGF0aCByZWZlcmVuY2UgYSBkeW5hbWljIGxpYnJhcnkuCisgICAgICBib29sIGlzRHluYW1pY0xpYnJhcnkoKSBjb25zdDsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcGF0aCBuYW1lIHJlZmVyZW5jZXMgYW4gZXhpc3RpbmcgZmlsZQorICAgICAgLy8vIG9yIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0uCisgICAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aG5hbWUgcmVmZXJlbmNlcyBhbiBleGlzdGluZyBmaWxlIG9yCisgICAgICAvLy8gZGlyZWN0b3J5LgorICAgICAgLy8vIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBwYXRoIGlzIGEgZmlsZSBvciBkaXJlY3RvcnkgaW4KKyAgICAgIC8vLyB0aGUgZmlsZSBzeXN0ZW0uCisgICAgICBib29sIGV4aXN0cygpIGNvbnN0OworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwYXRoIG5hbWUgcmVmZW5jZXMgYW4KKyAgICAgIC8vLyBleGlzdGluZyBkaXJlY3RvcnkuCisgICAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aG5hbWUgcmVmZXJlbmNlcyBhbiBleGlzdGluZyBkaXJlY3RvcnkuCisgICAgICAvLy8gQGJyaWVmIERldGVybWlucyBpZiB0aGUgcGF0aCBpcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0uCisgICAgICBib29sIGlzRGlyZWN0b3J5KCkgY29uc3Q7CisKKyAgICAgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHBhdGggbmFtZSByZWZlcmVuY2VzIGEgcmVhZGFibGUgZmlsZQorICAgICAgLy8vIG9yIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvcgorICAgICAgLy8vIHRoZSBleGlzdGVuY2UgYW5kIHJlYWRhYmlsaXR5IChieSB0aGUgY3VycmVudCBwcm9ncmFtKSBvZiB0aGUgZmlsZQorICAgICAgLy8vIG9yIGRpcmVjdG9yeS4KKyAgICAgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwYXRobmFtZSByZWZlcmVuY2VzIGEgcmVhZGFibGUgZmlsZS4KKyAgICAgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgcGF0aCBpcyBhIHJlYWRhYmxlIGZpbGUgb3IgZGlyZWN0b3J5CisgICAgICAvLy8gaW4gdGhlIGZpbGUgc3lzdGVtLgorICAgICAgYm9vbCBjYW5SZWFkKCkgY29uc3Q7CisKKyAgICAgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHBhdGggbmFtZSByZWZlcmVuY2VzIGEgd3JpdGFibGUgZmlsZQorICAgICAgLy8vIG9yIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciB0aGUKKyAgICAgIC8vLyBleGlzdGVuY2UgYW5kIHdyaXRhYmlsaXR5IChieSB0aGUgY3VycmVudCBwcm9ncmFtKSBvZiB0aGUgZmlsZSBvcgorICAgICAgLy8vIGRpcmVjdG9yeS4KKyAgICAgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwYXRobmFtZSByZWZlcmVuY2VzIGEgd3JpdGFibGUgZmlsZS4KKyAgICAgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgcGF0aCBpcyBhIHdyaXRhYmxlIGZpbGUgb3IgZGlyZWN0b3J5CisgICAgICAvLy8gaW4gdGhlIGZpbGUgc3lzdGVtLgorICAgICAgYm9vbCBjYW5Xcml0ZSgpIGNvbnN0OworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhhdCB3aGF0IHdlJ3JlIHRyeWluZyB0byB3b3JrIG9ubHkgb24gYSByZWd1bGFyIGZpbGUuCisgICAgICAvLy8gQ2hlY2sgZm9yIHRoaW5ncyBsaWtlIC9kZXYvbnVsbCwgYW55IGJsb2NrIHNwZWNpYWwgZmlsZSwKKyAgICAgIC8vLyBvciBvdGhlciB0aGluZ3MgdGhhdCBhcmVuJ3QgInJlZ3VsYXIiIHJlZ3VsYXIgZmlsZXMuCisgICAgICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBTX0lTUkVHLgorICAgICAgLy8vIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBmaWxlIGlzIGEgcmVndWxhciBmaWxlCisgICAgICBib29sIGlzUmVndWxhckZpbGUoKSBjb25zdDsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcGF0aCBuYW1lIHJlZmVyZW5jZXMgYW4gZXhlY3V0YWJsZQorICAgICAgLy8vIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtLiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBhbmQKKyAgICAgIC8vLyBleGVjdXRhYmlsaXR5IChieSB0aGUgY3VycmVudCBwcm9ncmFtKSBvZiB0aGUgZmlsZS4KKyAgICAgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwYXRobmFtZSByZWZlcmVuY2VzIGFuIGV4ZWN1dGFibGUgZmlsZS4KKyAgICAgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgcGF0aCBpcyBhbiBleGVjdXRhYmxlIGZpbGUgaW4gdGhlIGZpbGUKKyAgICAgIC8vLyBzeXN0ZW0uCisgICAgICBib29sIGNhbkV4ZWN1dGUoKSBjb25zdDsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgbGlzdCBvZiBwYXRocyB0aGF0IGFyZSB0aGUgbmFtZXMgb2YgdGhlCisgICAgICAvLy8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIGEgZGlyZWN0b3J5LgorICAgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJzLCB0cnVlIG90aGVyd2lzZQorICAgICAgLy8vIEBicmllZiBCdWlsZCBhIGxpc3Qgb2YgZGlyZWN0b3J5J3MgY29udGVudHMuCisgICAgICBib29sIGdldERpcmVjdG9yeUNvbnRlbnRzKAorICAgICAgICBzdGQ6OnNldDxQYXRoPiAmcGF0aHMsIC8vLzwgVGhlIHJlc3VsdGluZyBsaXN0IG9mIGZpbGUgJiBkaXJlY3RvcnkgbmFtZXMKKyAgICAgICAgc3RkOjpzdHJpbmcqIEVyck1zZyAgICAvLy88IE9wdGlvbmFsIHBsYWNlIHRvIHJldHVybiBhbiBlcnJvciBtZXNzYWdlLgorICAgICAgKSBjb25zdDsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBQYXRoIE11dGF0b3JzCisgICAgLy8vIEB7CisgICAgcHVibGljOgorICAgICAgLy8vIFRoZSBwYXRoIG5hbWUgaXMgY2xlYXJlZCBhbmQgYmVjb21lcyBlbXB0eS4gVGhpcyBpcyBhbiBpbnZhbGlkCisgICAgICAvLy8gcGF0aCBuYW1lIGJ1dCBpcyB0aGUgKm9ubHkqIGludmFsaWQgcGF0aCBuYW1lLiBUaGlzIGlzIHByb3ZpZGVkCisgICAgICAvLy8gc28gdGhhdCBwYXRoIG9iamVjdHMgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGxhY2sgb2YgYQorICAgICAgLy8vIHZhbGlkIHBhdGggYmVpbmcgZm91bmQuCisgICAgICAvLy8gQGJyaWVmIE1ha2UgdGhlIHBhdGggZW1wdHkuCisgICAgICB2b2lkIGNsZWFyKCkgeyBwYXRoLmNsZWFyKCk7IH0KKworICAgICAgLy8vIFRoaXMgbWV0aG9kIHNldHMgdGhlIFBhdGggb2JqZWN0IHRvIFxwIHVudmVyaWZpZWRfcGF0aC4gVGhpcyBjYW4gZmFpbAorICAgICAgLy8vIGlmIHRoZSBccCB1bnZlcmlmaWVkX3BhdGggZG9lcyBub3QgcGFzcyB0aGUgc3ludGFjdGljIGNoZWNrcyBvZiB0aGUKKyAgICAgIC8vLyBpc1ZhbGlkKCkgbWV0aG9kLiBJZiB2ZXJpZmljYXRpb24gZmFpbHMsIHRoZSBQYXRoIG9iamVjdCByZW1haW5zCisgICAgICAvLy8gdW5jaGFuZ2VkIGFuZCBmYWxzZSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRydWUgaXMgcmV0dXJuZWQgYW5kIHRoZQorICAgICAgLy8vIFBhdGggb2JqZWN0IHRha2VzIG9uIHRoZSBwYXRoIHZhbHVlIG9mIFxwIHVudmVyaWZpZWRfcGF0aAorICAgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgLy8vIEBwYXJhbSB1bnZlcmlmaWVkX3BhdGggVGhlIHBhdGggdG8gYmUgc2V0IGluIFBhdGggb2JqZWN0LgorICAgICAgLy8vIEBicmllZiBTZXQgYSBmdWxsIHBhdGggZnJvbSBhIFN0cmluZ1JlZgorICAgICAgYm9vbCBzZXQoU3RyaW5nUmVmIHVudmVyaWZpZWRfcGF0aCk7CisKKyAgICAgIC8vLyBPbmUgcGF0aCBjb21wb25lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBQYXRoLiBJZiBvbmx5IG9uZSBjb21wb25lbnQgaXMKKyAgICAgIC8vLyBwcmVzZW50IGluIHRoZSBwYXRoLCB0aGUgUGF0aCBvYmplY3QgYmVjb21lcyBlbXB0eS4gSWYgdGhlIFBhdGggb2JqZWN0CisgICAgICAvLy8gaXMgZW1wdHksIG5vIGNoYW5nZSBpcyBtYWRlLgorICAgICAgLy8vIEByZXR1cm5zIGZhbHNlIGlmIHRoZSBwYXRoIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgcmVtb3ZlZC4KKyAgICAgIC8vLyBAYnJpZWYgUmVtb3ZlcyB0aGUgbGFzdCBkaXJlY3RvcnkgY29tcG9uZW50IG9mIHRoZSBQYXRoLgorICAgICAgYm9vbCBlcmFzZUNvbXBvbmVudCgpOworCisgICAgICAvLy8gVGhlIFxwIGNvbXBvbmVudCBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBQYXRoIGlmIGl0IGlzIGEgbGVnYWwKKyAgICAgIC8vLyBuYW1lIGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gQSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHdpbGwgYmUgYWRkZWQgaWYKKyAgICAgIC8vLyBuZWVkZWQuCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgdGhlIHBhdGggY29tcG9uZW50IGNvdWxkIG5vdCBiZSBhZGRlZC4KKyAgICAgIC8vLyBAYnJpZWYgQXBwZW5kcyBvbmUgcGF0aCBjb21wb25lbnQgdG8gdGhlIFBhdGguCisgICAgICBib29sIGFwcGVuZENvbXBvbmVudChTdHJpbmdSZWYgY29tcG9uZW50KTsKKworICAgICAgLy8vIEEgcGVyaW9kIGFuZCB0aGUgXHAgc3VmZml4IGFyZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBwYXRobmFtZS4KKyAgICAgIC8vLyBUaGUgcHJlY29uZGl0aW9uIGZvciB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgdGhlIFBhdGggcmVmZXJlbmNlIGEgZmlsZQorICAgICAgLy8vIG5hbWUgKGkuZS4gaXNGaWxlKCkgcmV0dXJucyB0cnVlKS4gSWYgdGhlIFBhdGggaXMgbm90IGEgZmlsZSwgbm8KKyAgICAgIC8vLyBhY3Rpb24gaXMgdGFrZW4gYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLiBJZiB0aGUgcGF0aCB3b3VsZAorICAgICAgLy8vIGJlY29tZSBpbnZhbGlkIGZvciB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtLCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgIC8vLyBAcmV0dXJucyBmYWxzZSBpZiB0aGUgc3VmZml4IGNvdWxkIG5vdCBiZSBhZGRlZCwgdHJ1ZSBpZiBpdCB3YXMuCisgICAgICAvLy8gQGJyaWVmIEFkZHMgYSBwZXJpb2QgYW5kIHRoZSBccCBzdWZmaXggdG8gdGhlIGVuZCBvZiB0aGUgcGF0aG5hbWUuCisgICAgICBib29sIGFwcGVuZFN1ZmZpeChTdHJpbmdSZWYgc3VmZml4KTsKKworICAgICAgLy8vIFRoZSBzdWZmaXggb2YgdGhlIGZpbGVuYW1lIGlzIGVyYXNlZC4gVGhlIHN1ZmZpeCBiZWdpbnMgd2l0aCBhbmQKKyAgICAgIC8vLyBpbmNsdWRlcyB0aGUgbGFzdCAuIGNoYXJhY3RlciBpbiB0aGUgZmlsZW5hbWUgYWZ0ZXIgdGhlIGxhc3QgZGlyZWN0b3J5CisgICAgICAvLy8gc2VwYXJhdG9yIGFuZCBleHRlbmRzIHVudGlsIHRoZSBlbmQgb2YgdGhlIG5hbWUuIElmIG5vIC4gY2hhcmFjdGVyIGlzCisgICAgICAvLy8gYWZ0ZXIgdGhlIGxhc3QgZGlyZWN0b3J5IHNlcGFyYXRvciwgdGhlbiB0aGUgZmlsZSBuYW1lIGlzIGxlZnQKKyAgICAgIC8vLyB1bmNoYW5nZWQgKGkuZS4gaXQgd2FzIGFscmVhZHkgd2l0aG91dCBhIHN1ZmZpeCkgYnV0IHRoZSBmdW5jdGlvbgorICAgICAgLy8vIHJldHVybnMgZmFsc2UuCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgdGhlcmUgd2FzIG5vIHN1ZmZpeCB0byByZW1vdmUsIHRydWUgb3RoZXJ3aXNlLgorICAgICAgLy8vIEBicmllZiBSZW1vdmUgdGhlIHN1ZmZpeCBmcm9tIGEgcGF0aCBuYW1lLgorICAgICAgYm9vbCBlcmFzZVN1ZmZpeCgpOworCisgICAgICAvLy8gVGhlIGN1cnJlbnQgUGF0aCBuYW1lIGlzIG1hZGUgdW5pcXVlIGluIHRoZSBmaWxlIHN5c3RlbS4gVXBvbiByZXR1cm4sCisgICAgICAvLy8gdGhlIFBhdGggd2lsbCBoYXZlIGJlZW4gY2hhbmdlZCB0byBtYWtlIGEgdW5pcXVlIGZpbGUgaW4gdGhlIGZpbGUKKyAgICAgIC8vLyBzeXN0ZW0gb3IgaXQgd2lsbCBub3QgaGF2ZSBiZWVuIGNoYW5nZWQgaWYgdGhlIGN1cnJlbnQgcGF0aCBuYW1lIGlzCisgICAgICAvLy8gYWxyZWFkeSB1bmlxdWUuCisgICAgICAvLy8gQHRocm93cyBzdGQ6OnN0cmluZyBpZiBhbiB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3Vycy4KKyAgICAgIC8vLyBAYnJpZWYgTWFrZSB0aGUgY3VycmVudCBwYXRoIG5hbWUgdW5pcXVlIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgIGJvb2wgbWFrZVVuaXF1ZSggYm9vbCByZXVzZV9jdXJyZW50IC8qPSB0cnVlKi8sIHN0ZDo6c3RyaW5nKiBFcnJNc2cgKTsKKworICAgICAgLy8vIFRoZSBjdXJyZW50IFBhdGggbmFtZSBpcyBtYWRlIGFic29sdXRlIGJ5IHByZXBlbmRpbmcgdGhlCisgICAgICAvLy8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpZiBuZWNlc3NhcnkuCisgICAgICB2b2lkIG1ha2VBYnNvbHV0ZSgpOworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIERpc2sgTXV0YXRvcnMKKyAgICAvLy8gQHsKKyAgICBwdWJsaWM6CisgICAgICAvLy8gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gbWFrZSB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5IHRoZSBQYXRoIG9iamVjdAorICAgICAgLy8vIGF2YWlsYWJsZSBmb3IgcmVhZGluZyBzbyB0aGF0IHRoZSBjYW5SZWFkKCkgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuCisgICAgICAvLy8gQGJyaWVmIE1ha2UgdGhlIGZpbGUgcmVhZGFibGU7CisgICAgICBib29sIG1ha2VSZWFkYWJsZU9uRGlzayhzdGQ6OnN0cmluZyogRXJyTXNnID0gMCk7CisKKyAgICAgIC8vLyBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBtYWtlIHRoZSBmaWxlIHJlZmVyZW5jZWQgYnkgdGhlIFBhdGggb2JqZWN0CisgICAgICAvLy8gYXZhaWxhYmxlIGZvciB3cml0aW5nIHNvIHRoYXQgdGhlIGNhbldyaXRlKCkgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuCisgICAgICAvLy8gQGJyaWVmIE1ha2UgdGhlIGZpbGUgd3JpdGFibGU7CisgICAgICBib29sIG1ha2VXcml0ZWFibGVPbkRpc2soc3RkOjpzdHJpbmcqIEVyck1zZyA9IDApOworCisgICAgICAvLy8gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gbWFrZSB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5IHRoZSBQYXRoIG9iamVjdAorICAgICAgLy8vIGF2YWlsYWJsZSBmb3IgZXhlY3V0aW9uIHNvIHRoYXQgdGhlIGNhbkV4ZWN1dGUoKSBtZXRob2Qgd2lsbCByZXR1cm4KKyAgICAgIC8vLyB0cnVlLgorICAgICAgLy8vIEBicmllZiBNYWtlIHRoZSBmaWxlIHJlYWRhYmxlOworICAgICAgYm9vbCBtYWtlRXhlY3V0YWJsZU9uRGlzayhzdGQ6OnN0cmluZyogRXJyTXNnID0gMCk7CisKKyAgICAgIC8vLyBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBzdGFtcCBhbmQgcGVybWlzc2lvbiBiaXRzCisgICAgICAvLy8gdG8gYmUgc2V0IG9uIHRoZSBkaXNrIG9iamVjdCByZWZlcmVuY2VkIGJ5IHRoZSBQYXRoLgorICAgICAgLy8vIEB0aHJvd3Mgc3RkOjpzdHJpbmcgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAgLy8vIEByZXR1cm5zIHRydWUgb24gZXJyb3IuCisgICAgICAvLy8gQGJyaWVmIFNldCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uLgorICAgICAgYm9vbCBzZXRTdGF0dXNJbmZvT25EaXNrKGNvbnN0IEZpbGVTdGF0dXMgJlNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJTdHIgPSAwKSBjb25zdDsKKworICAgICAgLy8vIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0gd2l0aCB0aGUKKyAgICAgIC8vLyBzYW1lIG5hbWUgYXMgdGhlIFBhdGggb2JqZWN0LiBUaGUgXHAgY3JlYXRlX3BhcmVudHMgcGFyYW1ldGVyIGNvbnRyb2xzCisgICAgICAvLy8gd2hldGhlciBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQgb3Igbm90LiBpZiBccAorICAgICAgLy8vIGNyZWF0ZV9wYXJlbnRzIGlzIHRydWUsIHRoZW4gYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gY3JlYXRlIGFsbAorICAgICAgLy8vIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcywgYXMgbmVlZGVkLiBJZiBccCBjcmVhdGVfcGFyZW50cyBpcyBmYWxzZSwKKyAgICAgIC8vLyB0aGVuIG9ubHkgdGhlIGZpbmFsIGRpcmVjdG9yeSBjb21wb25lbnQgb2YgdGhlIFBhdGggbmFtZSB3aWxsIGJlCisgICAgICAvLy8gY3JlYXRlZC4gVGhlIGNyZWF0ZWQgZGlyZWN0b3J5IHdpbGwgaGF2ZSBubyBlbnRyaWVzLgorICAgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIGRpcmVjdG9yeSBjb3VsZCBub3QgYmUgY3JlYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICAvLy8gQGJyaWVmIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHRoaXMgUGF0aCByZWZlcnMgdG8uCisgICAgICBib29sIGNyZWF0ZURpcmVjdG9yeU9uRGlzaygKKyAgICAgICAgYm9vbCBjcmVhdGVfcGFyZW50cyA9IGZhbHNlLCAvLy88ICBEZXRlcm1pbmVzIHdoZXRoZXIgbm9uLWV4aXN0ZW50CisgICAgICAgICAgIC8vLzwgZGlyZWN0b3J5IGNvbXBvbmVudHMgb3RoZXIgdGhhbiB0aGUgbGFzdCBvbmUgKHRoZSAicGFyZW50cyIpCisgICAgICAgICAgIC8vLzwgYXJlIGNyZWF0ZWQgb3Igbm90LgorICAgICAgICBzdGQ6OnN0cmluZyogRXJyTXNnID0gMCAvLy88IE9wdGlvbmFsIHBsYWNlIHRvIHB1dCBlcnJvciBtZXNzYWdlcy4KKyAgICAgICk7CisKKyAgICAgIC8vLyBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBjcmVhdGUgYSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbSB3aXRoIHRoZSBzYW1lCisgICAgICAvLy8gbmFtZSBhcyB0aGUgUGF0aCBvYmplY3QuIFRoZSBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMgbXVzdCBhbGwgZXhpc3QKKyAgICAgIC8vLyBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuIFVzZSBjcmVhdGVEaXJlY3Rvcmllc09uRGlzayB0bworICAgICAgLy8vIGFjY29tcGxpc2ggdGhhdC4gVGhlIGNyZWF0ZWQgZmlsZSB3aWxsIGJlIGVtcHR5IHVwb24gcmV0dXJuIGZyb20gdGhpcworICAgICAgLy8vIGZ1bmN0aW9uLgorICAgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgIC8vLyBAYnJpZWYgQ3JlYXRlIHRoZSBmaWxlIHRoaXMgUGF0aCByZWZlcnMgdG8uCisgICAgICBib29sIGNyZWF0ZUZpbGVPbkRpc2soCisgICAgICAgIHN0ZDo6c3RyaW5nKiBFcnJNc2cgPSAwIC8vLzwgT3B0aW9uYWwgcGxhY2UgdG8gcHV0IGVycm9yIG1lc3NhZ2VzLgorICAgICAgKTsKKworICAgICAgLy8vIFRoaXMgaXMgbGlrZSBjcmVhdGVGaWxlIGV4Y2VwdCB0aGF0IGl0IGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZS4gQQorICAgICAgLy8vIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YKKyAgICAgIC8vLyBccCB0aGlzIGJlZm9yZSB0aGUgY2FsbC4gVGhlIG5ldyBuYW1lIGlzIGFzc2lnbmVkIHRvIFxwIHRoaXMgYW5kIHRoZQorICAgICAgLy8vIGZpbGUgaXMgY3JlYXRlZC4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYm90aCBjaGFuZ2UgdGhlIFBhdGggb2JqZWN0CisgICAgICAvLy8gKmFuZCogY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUuIFRoaXMgZnVuY3Rpb24gd2lsbCBlbnN1cmUgdGhhdAorICAgICAgLy8vIHRoZSBuZXdseSBnZW5lcmF0ZWQgdGVtcG9yYXJ5IGZpbGUgbmFtZSBpcyB1bmlxdWUgaW4gdGhlIGZpbGUgc3lzdGVtLgorICAgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgY291bGRuJ3QgYmUgY3JlYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgLy8vIEBicmllZiBDcmVhdGUgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUKKyAgICAgIGJvb2wgY3JlYXRlVGVtcG9yYXJ5RmlsZU9uRGlzaygKKyAgICAgICAgYm9vbCByZXVzZV9jdXJyZW50ID0gZmFsc2UsIC8vLzwgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAvLy88IGluZGljYXRlcyB0aGF0IGlmIHRoZSBjdXJyZW50IGZpbGUgbmFtZSBkb2VzIG5vdCBleGlzdCB0aGVuCisgICAgICAgICAgLy8vPCBpdCB3aWxsIGJlIHVzZWQgd2l0aG91dCBtb2RpZmljYXRpb24uCisgICAgICAgIHN0ZDo6c3RyaW5nKiBFcnJNc2cgPSAwIC8vLzwgT3B0aW9uYWwgcGxhY2UgdG8gcHV0IGVycm9yIG1lc3NhZ2VzCisgICAgICApOworCisgICAgICAvLy8gVGhpcyBtZXRob2QgcmVuYW1lcyB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5IFxwIHRoaXMgYXMgXHAgbmV3TmFtZS4gVGhlCisgICAgICAvLy8gZmlsZSByZWZlcmVuY2VkIGJ5IFxwIHRoaXMgbXVzdCBleGlzdC4gVGhlIGZpbGUgcmVmZXJlbmNlZCBieQorICAgICAgLy8vIFxwIG5ld05hbWUgZG9lcyBub3QgbmVlZCB0byBleGlzdC4KKyAgICAgIC8vLyBAcmV0dXJucyB0cnVlIG9uIGVycm9yLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgIC8vLyBAYnJpZWYgUmVuYW1lIG9uZSBmaWxlIGFzIGFub3RoZXIuCisgICAgICBib29sIHJlbmFtZVBhdGhPbkRpc2soY29uc3QgUGF0aCYgbmV3TmFtZSwgc3RkOjpzdHJpbmcqIEVyck1zZyk7CisKKyAgICAgIC8vLyBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBkZXN0cm95IHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUKKyAgICAgIC8vLyBsYXN0IGNvbXBvbmVudCBvZiB0aGUgUGF0aC4gSWYgdGhlIFBhdGggcmVmZXJzIHRvIGEgZGlyZWN0b3J5IGFuZCB0aGUKKyAgICAgIC8vLyBccCBkZXN0cm95X2NvbnRlbnRzIGlzIGZhbHNlLCBhbiBhdHRlbXB0IHdpbGwgYmUgbWFkZSB0byByZW1vdmUganVzdAorICAgICAgLy8vIHRoZSBkaXJlY3RvcnkgKHRoZSBmaW5hbCBQYXRoIGNvbXBvbmVudCkuIElmIFxwIGRlc3Ryb3lfY29udGVudHMgaXMKKyAgICAgIC8vLyB0cnVlLCBhbiBhdHRlbXB0IHdpbGwgYmUgbWFkZSB0byByZW1vdmUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUKKyAgICAgIC8vLyBkaXJlY3RvcnksIHJlY3Vyc2l2ZWx5LiBJZiB0aGUgUGF0aCByZWZlcnMgdG8gYSBmaWxlLCB0aGUKKyAgICAgIC8vLyBccCBkZXN0cm95X2NvbnRlbnRzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAgLy8vIEBwYXJhbSBkZXN0cm95X2NvbnRlbnRzIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb250ZW50cyBvZiBhIGRlc3Ryb3llZAorICAgICAgLy8vIEBwYXJhbSBFcnIgQW4gb3B0aW9uYWwgc3RyaW5nIHRvIHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgIC8vLyBkaXJlY3Rvcnkgc2hvdWxkIGFsc28gYmUgZGVzdHJveWVkIChyZWN1cnNpdmVseSkuCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgdGhlIGZpbGUvZGlyZWN0b3J5IHdhcyBkZXN0cm95ZWQsIHRydWUgb24gZXJyb3IuCisgICAgICAvLy8gQGJyaWVmIFJlbW92ZXMgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGZyb20gdGhlIGZpbGVzeXN0ZW0uCisgICAgICBib29sIGVyYXNlRnJvbURpc2soYm9vbCBkZXN0cm95X2NvbnRlbnRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyciA9IDApIGNvbnN0OworCisKKyAgICAgIC8vLyBNYXBJbkZpbGVQYWdlcyAtIFRoaXMgaXMgYSBsb3cgbGV2ZWwgc3lzdGVtIEFQSSB0byBtYXAgaW4gdGhlIGZpbGUKKyAgICAgIC8vLyB0aGF0IGlzIGN1cnJlbnRseSBvcGVuZWQgYXMgRkQgaW50byB0aGUgY3VycmVudCBwcm9jZXNzZXMnIGFkZHJlc3MKKyAgICAgIC8vLyBzcGFjZSBmb3IgcmVhZCBvbmx5IGFjY2Vzcy4gIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBudWxsIG9uIGZhaWx1cmUKKyAgICAgIC8vLyBvciBpZiB0aGUgc3lzdGVtIGNhbm5vdCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHM6CisgICAgICAvLy8gIDEpIFRoZSBwYWdlcyBtdXN0IGJlIHZhbGlkIGFmdGVyIHRoZSBGRCBpcyBjbG9zZWQsIHVudGlsCisgICAgICAvLy8gICAgIFVuTWFwRmlsZVBhZ2VzIGlzIGNhbGxlZC4KKyAgICAgIC8vLyAgMikgQW55IHBhZGRpbmcgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZmlsZSBtdXN0IGJlIHplcm8gZmlsbGVkLCBpZgorICAgICAgLy8vICAgICBwcmVzZW50LgorICAgICAgLy8vICAzKSBUaGUgcGFnZXMgbXVzdCBiZSBjb250aWd1b3VzLgorICAgICAgLy8vCisgICAgICAvLy8gVGhpcyBBUEkgaXMgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZSwgY2xpZW50cyBzaG91bGQgdXNlCisgICAgICAvLy8gTWVtb3J5QnVmZmVyOjpnZXRGaWxlIGluc3RlYWQuCisgICAgICBzdGF0aWMgY29uc3QgY2hhciAqTWFwSW5GaWxlUGFnZXMoaW50IEZELCB1aW50NjRfdCBGaWxlU2l6ZSk7CisKKyAgICAgIC8vLyBVbk1hcEZpbGVQYWdlcyAtIEZyZWUgcGFnZXMgbWFwcGVkIGludG8gdGhlIGN1cnJlbnQgcHJvY2VzcyBieQorICAgICAgLy8vIE1hcEluRmlsZVBhZ2VzLgorICAgICAgLy8vCisgICAgICAvLy8gVGhpcyBBUEkgaXMgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZSwgY2xpZW50cyBzaG91bGQgdXNlCisgICAgICAvLy8gTWVtb3J5QnVmZmVyOjpnZXRGaWxlIGluc3RlYWQuCisgICAgICBzdGF0aWMgdm9pZCBVbk1hcEZpbGVQYWdlcyhjb25zdCBjaGFyICpCYXNlLCB1aW50NjRfdCBGaWxlU2l6ZSk7CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgRGF0YQorICAgIC8vLyBAeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIE91ciB3aW4zMiBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhpcyBzdHJpbmcgYmVpbmcgbXV0YWJsZS4KKyAgICAgIG11dGFibGUgc3RkOjpzdHJpbmcgcGF0aDsgICAvLy88IFN0b3JhZ2UgZm9yIHRoZSBwYXRoIG5hbWUuCisKKworICAgIC8vLyBAfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIGlzIGlkZW50aWNhbCB0byBQYXRoIGNsYXNzIGV4Y2VwdCBpdCBhbGxvd3MgeW91IHRvIG9idGFpbiB0aGUKKyAgLy8vIGZpbGUgc3RhdHVzIG9mIHRoZSBQYXRoIGFzIHdlbGwuIFRoZSByZWFzb24gZm9yIHRoZSBkaXN0aW5jdGlvbiBpcyBvbmUgb2YKKyAgLy8vIGVmZmljaWVuY3kuIEZpcnN0LCB0aGUgZmlsZSBzdGF0dXMgcmVxdWlyZXMgYWRkaXRpb25hbCBzcGFjZSBhbmQgdGhlIHNwYWNlCisgIC8vLyBpcyBpbmNvcnBvcmF0ZWQgZGlyZWN0bHkgaW50byBQYXRoV2l0aFN0YXR1cyB3aXRob3V0IGFuIGFkZGl0aW9uYWwgbWFsbG9jLgorICAvLy8gU2Vjb25kLCBvYnRhaW5pbmcgc3RhdHVzIGluZm9ybWF0aW9uIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24gb24gbW9zdAorICAvLy8gb3BlcmF0aW5nIHN5c3RlbXMgc28gd2Ugd2FudCB0byBiZSBjYXJlZnVsIGFuZCBleHBsaWNpdHkgYWJvdXQgd2hlcmUgd2UKKyAgLy8vIGFsbG93IHRoaXMgb3BlcmF0aW9uIGluIExMVk0uCisgIC8vLyBAYnJpZWYgUGF0aCB3aXRoIGZpbGUgc3RhdHVzIGNsYXNzLgorICBjbGFzcyBQYXRoV2l0aFN0YXR1cyA6IHB1YmxpYyBQYXRoIHsKKyAgICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgICAgLy8vIEB7CisgICAgcHVibGljOgorICAgICAgLy8vIEBicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICBQYXRoV2l0aFN0YXR1cygpIDogUGF0aCgpLCBzdGF0dXMoKSwgZnNJc1ZhbGlkKGZhbHNlKSB7fQorCisgICAgICAvLy8gQGJyaWVmIENvcHkgY29uc3RydWN0b3IKKyAgICAgIFBhdGhXaXRoU3RhdHVzKGNvbnN0IFBhdGhXaXRoU3RhdHVzICZ0aGF0KQorICAgICAgICA6IFBhdGgoc3RhdGljX2Nhc3Q8Y29uc3QgUGF0aCY+KHRoYXQpKSwgc3RhdHVzKHRoYXQuc3RhdHVzKSwKKyAgICAgICAgICAgZnNJc1ZhbGlkKHRoYXQuZnNJc1ZhbGlkKSB7fQorCisgICAgICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgY29uc3RydWN0aW9uIGZyb20gYSBQYXRoIG9iamVjdAorICAgICAgLy8vIEBicmllZiBQYXRoIGNvbnN0cnVjdG9yCisgICAgICBQYXRoV2l0aFN0YXR1cyhjb25zdCBQYXRoICZvdGhlcikKKyAgICAgICAgOiBQYXRoKG90aGVyKSwgc3RhdHVzKCksIGZzSXNWYWxpZChmYWxzZSkge30KKworICAgICAgLy8vIFRoaXMgY29uc3RydWN0b3Igd2lsbCBhY2NlcHQgYSBjaGFyKiBvciBzdGQ6OnN0cmluZyBhcyBhIHBhdGguIE5vCisgICAgICAvLy8gY2hlY2tpbmcgaXMgZG9uZSBvbiB0aGlzIHBhdGggdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHZhbGlkLiBUbworICAgICAgLy8vIGRldGVybWluZSB2YWxpZGl0eSBvZiB0aGUgcGF0aCwgdXNlIHRoZSBpc1ZhbGlkIG1ldGhvZC4KKyAgICAgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgUGF0aCBmcm9tIGEgc3RyaW5nLgorICAgICAgZXhwbGljaXQgUGF0aFdpdGhTdGF0dXMoCisgICAgICAgIFN0cmluZ1JlZiBwIC8vLzwgVGhlIHBhdGggdG8gYXNzaWduLgorICAgICAgKSA6IFBhdGgocCksIHN0YXR1cygpLCBmc0lzVmFsaWQoZmFsc2UpIHt9CisKKyAgICAgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgYWNjZXB0IGEgY2hhcmFjdGVyIHJhbmdlIGFzIGEgcGF0aC4gIE5vIGNoZWNraW5nCisgICAgICAvLy8gaXMgZG9uZSBvbiB0aGlzIHBhdGggdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHZhbGlkLiAgVG8gZGV0ZXJtaW5lCisgICAgICAvLy8gdmFsaWRpdHkgb2YgdGhlIHBhdGgsIHVzZSB0aGUgaXNWYWxpZCBtZXRob2QuCisgICAgICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIFBhdGggZnJvbSBhIHN0cmluZy4KKyAgICAgIGV4cGxpY2l0IFBhdGhXaXRoU3RhdHVzKAorICAgICAgICBjb25zdCBjaGFyICpTdHJTdGFydCwgIC8vLzwgUG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBwYXRoCisgICAgICAgIHVuc2lnbmVkIFN0ckxlbiAgICAgICAgLy8vPCBMZW5ndGggb2YgdGhlIHBhdGguCisgICAgICApIDogUGF0aChTdHJTdGFydCwgU3RyTGVuKSwgc3RhdHVzKCksIGZzSXNWYWxpZChmYWxzZSkge30KKworICAgICAgLy8vIE1ha2VzIGEgY29weSBvZiBccCB0aGF0IHRvIFxwIHRoaXMuCisgICAgICAvLy8gQHJldHVybnMgXHAgdGhpcworICAgICAgLy8vIEBicmllZiBBc3NpZ25tZW50IE9wZXJhdG9yCisgICAgICBQYXRoV2l0aFN0YXR1cyAmb3BlcmF0b3I9KGNvbnN0IFBhdGhXaXRoU3RhdHVzICZ0aGF0KSB7CisgICAgICAgIHN0YXRpY19jYXN0PFBhdGgmPigqdGhpcykgPSBzdGF0aWNfY2FzdDxjb25zdCBQYXRoJj4odGhhdCk7CisgICAgICAgIHN0YXR1cyA9IHRoYXQuc3RhdHVzOworICAgICAgICBmc0lzVmFsaWQgPSB0aGF0LmZzSXNWYWxpZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gTWFrZXMgYSBjb3B5IG9mIFxwIHRoYXQgdG8gXHAgdGhpcy4KKyAgICAgIC8vLyBAcmV0dXJucyBccCB0aGlzCisgICAgICAvLy8gQGJyaWVmIEFzc2lnbm1lbnQgT3BlcmF0b3IKKyAgICAgIFBhdGhXaXRoU3RhdHVzICZvcGVyYXRvcj0oY29uc3QgUGF0aCAmdGhhdCkgeworICAgICAgICBzdGF0aWNfY2FzdDxQYXRoJj4oKnRoaXMpID0gc3RhdGljX2Nhc3Q8Y29uc3QgUGF0aCY+KHRoYXQpOworICAgICAgICBmc0lzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIE1ldGhvZHMKKyAgICAvLy8gQHsKKyAgICBwdWJsaWM6CisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZS4gVGhlIHR5cGUgb2YKKyAgICAgIC8vLyBwYXRoIChmaWxlIG9yIGRpcmVjdG9yeSkgaXMgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBhY3R1YWwgY29udGVudHMKKyAgICAgIC8vLyBvZiB0aGUgZmlsZSBzeXN0ZW0uCisgICAgICAvLy8gQHJldHVybnMgMCBvbiBmYWlsdXJlLCB3aXRoIEVycm9yIGV4cGxhaW5pbmcgd2h5IChpZiBub24temVybykKKyAgICAgIC8vLyBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBGaWxlU3RhdHVzIHN0cnVjdHVyZSBvbiBzdWNjZXNzLgorICAgICAgLy8vIEBicmllZiBHZXQgZmlsZSBzdGF0dXMuCisgICAgICBjb25zdCBGaWxlU3RhdHVzICpnZXRGaWxlU3RhdHVzKAorICAgICAgICBib29sIGZvcmNlVXBkYXRlID0gZmFsc2UsIC8vLzwgRm9yY2UgYW4gdXBkYXRlIGZyb20gdGhlIGZpbGUgc3lzdGVtCisgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJvciA9IDAgICAgLy8vPCBPcHRpb25hbCBwbGFjZSB0byByZXR1cm4gYW4gZXJyb3IgbXNnLgorICAgICAgKSBjb25zdDsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBEYXRhCisgICAgLy8vIEB7CisgICAgcHJpdmF0ZToKKyAgICAgIG11dGFibGUgRmlsZVN0YXR1cyBzdGF0dXM7IC8vLzwgU3RhdHVzIGluZm9ybWF0aW9uLgorICAgICAgbXV0YWJsZSBib29sIGZzSXNWYWxpZDsgICAgLy8vPCBXaGV0aGVyIHdlJ3ZlIG9idGFpbmVkIGl0IG9yIG5vdAorCisgICAgLy8vIEB9CisgIH07CisKKyAgLy8vIFRoaXMgZW51bWVyYXRpb24gZGVsaW5lYXRlcyB0aGUga2luZHMgb2YgZmlsZXMgdGhhdCBMTFZNIGtub3dzIGFib3V0LgorICBlbnVtIExMVk1GaWxlVHlwZSB7CisgICAgVW5rbm93bl9GaWxlVHlwZSA9IDAsICAgICAgICAgICAgICAvLy88IFVucmVjb2duaXplZCBmaWxlCisgICAgQml0Y29kZV9GaWxlVHlwZSwgICAgICAgICAgICAgICAgICAvLy88IEJpdGNvZGUgZmlsZQorICAgIEFyY2hpdmVfRmlsZVR5cGUsICAgICAgICAgICAgICAgICAgLy8vPCBhciBzdHlsZSBhcmNoaXZlIGZpbGUKKyAgICBFTEZfUmVsb2NhdGFibGVfRmlsZVR5cGUsICAgICAgICAgIC8vLzwgRUxGIFJlbG9jYXRhYmxlIG9iamVjdCBmaWxlCisgICAgRUxGX0V4ZWN1dGFibGVfRmlsZVR5cGUsICAgICAgICAgICAvLy88IEVMRiBFeGVjdXRhYmxlIGltYWdlCisgICAgRUxGX1NoYXJlZE9iamVjdF9GaWxlVHlwZSwgICAgICAgICAvLy88IEVMRiBkeW5hbWljYWxseSBsaW5rZWQgc2hhcmVkIGxpYgorICAgIEVMRl9Db3JlX0ZpbGVUeXBlLCAgICAgICAgICAgICAgICAgLy8vPCBFTEYgY29yZSBpbWFnZQorICAgIE1hY2hfT19PYmplY3RfRmlsZVR5cGUsICAgICAgICAgICAgLy8vPCBNYWNoLU8gT2JqZWN0IGZpbGUKKyAgICBNYWNoX09fRXhlY3V0YWJsZV9GaWxlVHlwZSwgICAgICAgIC8vLzwgTWFjaC1PIEV4ZWN1dGFibGUKKyAgICBNYWNoX09fRml4ZWRWaXJ0dWFsTWVtb3J5U2hhcmVkTGliX0ZpbGVUeXBlLCAvLy88IE1hY2gtTyBTaGFyZWQgTGliLCBGVk0KKyAgICBNYWNoX09fQ29yZV9GaWxlVHlwZSwgICAgICAgICAgICAgIC8vLzwgTWFjaC1PIENvcmUgRmlsZQorICAgIE1hY2hfT19QcmVsb2FkRXhlY3R1YWJsZV9GaWxlVHlwZSwgLy8vPCBNYWNoLU8gUHJlbG9hZGVkIEV4ZWN1dGFibGUKKyAgICBNYWNoX09fRHluYW1pY2FsbHlMaW5rZWRTaGFyZWRMaWJfRmlsZVR5cGUsIC8vLzwgTWFjaC1PIGR5bmxpbmtlZCBzaGFyZWQgbGliCisgICAgTWFjaF9PX0R5bmFtaWNMaW5rZXJfRmlsZVR5cGUsICAgICAvLy88IFRoZSBNYWNoLU8gZHluYW1pYyBsaW5rZXIKKyAgICBNYWNoX09fQnVuZGxlX0ZpbGVUeXBlLCAgICAgICAgICAgIC8vLzwgTWFjaC1PIEJ1bmRsZSBmaWxlCisgICAgTWFjaF9PX0R5bmFtaWNhbGx5TGlua2VkU2hhcmVkTGliU3R1Yl9GaWxlVHlwZSwgLy8vPCBNYWNoLU8gU2hhcmVkIGxpYiBzdHViCisgICAgQ09GRl9GaWxlVHlwZSAgICAgICAgICAgICAgICAgICAgICAvLy88IENPRkYgb2JqZWN0IGZpbGUgb3IgbGliCisgIH07CisKKyAgLy8vIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBhbGxvd3MgYW55IG1lbW9yeSBibG9jayB0byBiZSBleGFtaW5lZCBpbiBvcmRlcgorICAvLy8gdG8gZGV0ZXJtaW5lIGl0cyBmaWxlIHR5cGUuCisgIExMVk1GaWxlVHlwZSBJZGVudGlmeUZpbGVUeXBlKGNvbnN0IGNoYXIqbWFnaWMsIHVuc2lnbmVkIGxlbmd0aCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29weSB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgU3JjIHRvIHRoZQorICAvLy8gZmlsZSBzcGVjaWZpZWQgYnkgRGVzdC4gSWYgYW4gZXJyb3Igb2NjdXJzLCBEZXN0IGlzIHJlbW92ZWQuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycywgZmFsc2Ugb3RoZXJ3aXNlCisgIC8vLyBAYnJpZWYgQ29weSBvbmUgZmlsZSB0byBhbm90aGVyLgorICBib29sIENvcHlGaWxlKGNvbnN0IFBhdGgmIERlc3QsIGNvbnN0IFBhdGgmIFNyYywgc3RkOjpzdHJpbmcqIEVyck1zZyk7CisKKyAgLy8vIFRoaXMgaXMgdGhlIE9TLXNwZWNpZmljIHBhdGggc2VwYXJhdG9yOiBhIGNvbG9uIG9uIFVuaXggb3IgYSBzZW1pY29sb24KKyAgLy8vIG9uIFdpbmRvd3MuCisgIGV4dGVybiBjb25zdCBjaGFyIFBhdGhTZXBhcmF0b3I7Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1Byb2Nlc3MuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vUHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMDQ5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1Byb2Nlc3MuaApAQCAtMCwwICsxLDE0OCBAQAorLy89PT0tIGxsdm0vU3lzdGVtL1Byb2Nlc3MuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6UHJvY2VzcyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1lTVEVNX1BST0NFU1NfSAorI2RlZmluZSBMTFZNX1NZU1RFTV9QUk9DRVNTX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL1RpbWVWYWx1ZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3lzIHsKKworICAvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBmb3IgZ2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgLy8vIGN1cnJlbnRseSBleGVjdXRpbmcgcHJvY2Vzcy4KKyAgLy8vIEBzaW5jZSAxLjQKKyAgLy8vIEBicmllZiBBbiBhYnN0cmFjdGlvbiBmb3Igb3BlcmF0aW5nIHN5c3RlbSBwcm9jZXNzZXMuCisgIGNsYXNzIFByb2Nlc3MgeworICAgIC8vLyBAbmFtZSBBY2Nlc3NvcnMKKyAgICAvLy8gQHsKKyAgICBwdWJsaWM6CisgICAgICAvLy8gVGhpcyBzdGF0aWMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyB2aXJ0dWFsIG1lbW9yeQorICAgICAgLy8vIHBhZ2Ugc2l6ZS4KKyAgICAgIC8vLyBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgdmlydHVhbCBtZW1vcnkgcGFnZS4KKyAgICAgIC8vLyBAdGhyb3dzIG5vdGhpbmcKKyAgICAgIC8vLyBAYnJpZWYgR2V0IHRoZSB2aXJ0dWFsIG1lbW9yeSBwYWdlIHNpemUKKyAgICAgIHN0YXRpYyB1bnNpZ25lZCBHZXRQYWdlU2l6ZSgpOworCisgICAgICAvLy8gVGhpcyBzdGF0aWMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkCisgICAgICAvLy8gYnkgdGhlIHByb2Nlc3MuIFRoaXMgb25seSBjb3VudHMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdmlhIHRoZSBtYWxsb2MsCisgICAgICAvLy8gY2FsbG9jIGFuZCByZWFsbG9jIGZ1bmN0aW9ucyBhbmQgaW5jbHVkZXMgYW55ICJmcmVlIiBob2xlcyBpbiB0aGUKKyAgICAgIC8vLyBhbGxvY2F0ZWQgc3BhY2UuCisgICAgICAvLy8gQHRocm93cyBub3RoaW5nCisgICAgICAvLy8gQGJyaWVmIFJldHVybiBwcm9jZXNzIG1lbW9yeSB1c2FnZS4KKyAgICAgIHN0YXRpYyBzaXplX3QgR2V0TWFsbG9jVXNhZ2UoKTsKKworICAgICAgLy8vIFRoaXMgc3RhdGljIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSB0b3RhbCBtZW1vcnkgdXNhZ2Ugb2YgdGhlCisgICAgICAvLy8gcHJvY2Vzcy4gVGhpcyBpbmNsdWRlcyBjb2RlLCBkYXRhLCBzdGFjayBhbmQgbWFwcGVkIHBhZ2VzIHVzYWdlLiBOb3RlaQorICAgICAgLy8vIHRoYXQgdGhlIHZhbHVlIHJldHVybmVkIGhlcmUgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBSdW5uaW5nIFNldCBTaXplLAorICAgICAgLy8vIGl0IGlzIHRoZSB0b3RhbCB2aXJ0dWFsIG1lbW9yeSB1c2FnZSwgcmVnYXJkbGVzcyBvZiBtYXBwZWQgc3RhdGUgb2YKKyAgICAgIC8vLyB0aGF0IG1lbW9yeS4KKyAgICAgIHN0YXRpYyBzaXplX3QgR2V0VG90YWxNZW1vcnlVc2FnZSgpOworCisgICAgICAvLy8gVGhpcyBzdGF0aWMgZnVuY3Rpb24gd2lsbCBzZXQgXHAgdXNlcl90aW1lIHRvIHRoZSBhbW91bnQgb2YgQ1BVIHRpbWUKKyAgICAgIC8vLyBzcGVudCBpbiB1c2VyIChub24ta2VybmVsKSBtb2RlIGFuZCBccCBzeXNfdGltZSB0byB0aGUgYW1vdW50IG9mIENQVQorICAgICAgLy8vIHRpbWUgc3BlbnQgaW4gc3lzdGVtIChrZXJuZWwpIG1vZGUuICBJZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdAorICAgICAgLy8vIHN1cHBvcnQgY29sbGVjdGlvbiBvZiB0aGVzZSBtZXRyaWNzLCBhIHplcm8gVGltZVZhbHVlIHdpbGwgYmUgZm9yIGJvdGgKKyAgICAgIC8vLyB2YWx1ZXMuCisgICAgICBzdGF0aWMgdm9pZCBHZXRUaW1lVXNhZ2UoCisgICAgICAgIFRpbWVWYWx1ZSYgZWxhcHNlZCwKKyAgICAgICAgICAvLy88IFJldHVybnMgdGhlIFRpbWVWYWx1ZTo6bm93KCkgZ2l2aW5nIGN1cnJlbnQgdGltZQorICAgICAgICBUaW1lVmFsdWUmIHVzZXJfdGltZSwKKyAgICAgICAgICAvLy88IFJldHVybnMgdGhlIGN1cnJlbnQgYW1vdW50IG9mIHVzZXIgdGltZSBmb3IgdGhlIHByb2Nlc3MKKyAgICAgICAgVGltZVZhbHVlJiBzeXNfdGltZQorICAgICAgICAgIC8vLzwgUmV0dXJucyB0aGUgY3VycmVudCBhbW91bnQgb2Ygc3lzdGVtIHRpbWUgZm9yIHRoZSBwcm9jZXNzCisgICAgICApOworCisgICAgICAvLy8gVGhpcyBzdGF0aWMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHByb2Nlc3MnIGN1cnJlbnQgdXNlciBpZCBudW1iZXIuCisgICAgICAvLy8gTm90IGFsbCBvcGVyYXRpbmcgc3lzdGVtcyBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gV2hlcmUgaXQgaXMgbm90CisgICAgICAvLy8gc3VwcG9ydGVkLCB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiA2NTUzNiBhcyB0aGUgdmFsdWUuCisgICAgICBzdGF0aWMgaW50IEdldEN1cnJlbnRVc2VySWQoKTsKKworICAgICAgLy8vIFRoaXMgc3RhdGljIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBwcm9jZXNzJyBjdXJyZW50IGdyb3VwIGlkIG51bWJlci4KKyAgICAgIC8vLyBOb3QgYWxsIG9wZXJhdGluZyBzeXN0ZW1zIHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBXaGVyZSBpdCBpcyBub3QKKyAgICAgIC8vLyBzdXBwb3J0ZWQsIHRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDY1NTM2IGFzIHRoZSB2YWx1ZS4KKyAgICAgIHN0YXRpYyBpbnQgR2V0Q3VycmVudEdyb3VwSWQoKTsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gbWFrZXMgdGhlIG5lY2Vzc2FyeSBjYWxscyB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0bworICAgICAgLy8vIHByZXZlbnQgY29yZSBmaWxlcyBvciBhbnkgb3RoZXIga2luZCBvZiBsYXJnZSBtZW1vcnkgZHVtcHMgdGhhdCBjYW4KKyAgICAgIC8vLyBvY2N1ciB3aGVuIGEgcHJvZ3JhbSBmYWlscy4KKyAgICAgIC8vLyBAYnJpZWYgUHJldmVudCBjb3JlIGZpbGUgZ2VuZXJhdGlvbi4KKyAgICAgIHN0YXRpYyB2b2lkIFByZXZlbnRDb3JlRmlsZXMoKTsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgc3RhbmRhcmQgaW5wdXQgaXMgY29ubmVjdGVkIGRpcmVjdGx5CisgICAgICAvLy8gdG8gYSB1c2VyJ3MgaW5wdXQgKGtleWJvYXJkIHByb2JhYmx5KSwgcmF0aGVyIHRoYW4gY29taW5nIGZyb20gYSBmaWxlCisgICAgICAvLy8gb3IgcGlwZS4KKyAgICAgIHN0YXRpYyBib29sIFN0YW5kYXJkSW5Jc1VzZXJJbnB1dCgpOworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBzdGFuZGFyZCBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIGEKKyAgICAgIC8vLyAidHR5IiBvciAiY29uc29sZSIgd2luZG93LiBUaGF0IGlzLCB0aGUgb3V0cHV0IHdvdWxkIGJlIGRpc3BsYXllZCB0bworICAgICAgLy8vIHRoZSB1c2VyIHJhdGhlciB0aGFuIGJlaW5nIHB1dCBvbiBhIHBpcGUgb3Igc3RvcmVkIGluIGEgZmlsZS4KKyAgICAgIHN0YXRpYyBib29sIFN0YW5kYXJkT3V0SXNEaXNwbGF5ZWQoKTsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgY29ubmVjdGVkIHRvIGEKKyAgICAgIC8vLyAidHR5IiBvciAiY29uc29sZSIgd2luZG93LiBUaGF0IGlzLCB0aGUgb3V0cHV0IHdvdWxkIGJlIGRpc3BsYXllZCB0bworICAgICAgLy8vIHRoZSB1c2VyIHJhdGhlciB0aGFuIGJlaW5nIHB1dCBvbiBhIHBpcGUgb3Igc3RvcmVkIGluIGEgZmlsZS4KKyAgICAgIHN0YXRpYyBib29sIFN0YW5kYXJkRXJySXNEaXNwbGF5ZWQoKTsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIGlzIGNvbm5lY3RlZCB0bworICAgICAgLy8vIGEgInR0eSIgb3IgImNvbnNvbGUiIHdpbmRvdy4gVGhhdCBpcywgdGhlIG91dHB1dCB3b3VsZCBiZSBkaXNwbGF5ZWQgdG8KKyAgICAgIC8vLyB0aGUgdXNlciByYXRoZXIgdGhhbiBiZWluZyBwdXQgb24gYSBwaXBlIG9yIHN0b3JlZCBpbiBhIGZpbGUuCisgICAgICBzdGF0aWMgYm9vbCBGaWxlRGVzY3JpcHRvcklzRGlzcGxheWVkKGludCBmZCk7CisKKyAgICAgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB3aW5kb3cKKyAgICAgIC8vLyBpZiBzdGFuZGFyZCBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIGEgInR0eSIgb3IgImNvbnNvbGUiCisgICAgICAvLy8gd2luZG93LiBJZiBzdGFuZGFyZCBvdXRwdXQgaXMgbm90IGNvbm5lY3RlZCB0byBhIHR0eSBvcgorICAgICAgLy8vIGNvbnNvbGUsIG9yIGlmIHRoZSBudW1iZXIgb2YgY29sdW1ucyBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwKKyAgICAgIC8vLyB0aGlzIHJvdXRpbmUgcmV0dXJucyB6ZXJvLgorICAgICAgc3RhdGljIHVuc2lnbmVkIFN0YW5kYXJkT3V0Q29sdW1ucygpOworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgd2luZG93CisgICAgICAvLy8gaWYgc3RhbmRhcmQgZXJyb3IgaXMgY29ubmVjdGVkIHRvIGEgInR0eSIgb3IgImNvbnNvbGUiCisgICAgICAvLy8gd2luZG93LiBJZiBzdGFuZGFyZCBlcnJvciBpcyBub3QgY29ubmVjdGVkIHRvIGEgdHR5IG9yCisgICAgICAvLy8gY29uc29sZSwgb3IgaWYgdGhlIG51bWJlciBvZiBjb2x1bW5zIGNhbm5vdCBiZSBkZXRlcm1pbmVkLAorICAgICAgLy8vIHRoaXMgcm91dGluZSByZXR1cm5zIHplcm8uCisgICAgICBzdGF0aWMgdW5zaWduZWQgU3RhbmRhcmRFcnJDb2x1bW5zKCk7CisKKyAgICAgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgd2hldGhlciB0aGUgdGVybWluYWwgY29ubmVjdGVkIHRvIHN0YW5kYXJkCisgICAgICAvLy8gb3V0cHV0IHN1cHBvcnRzIGNvbG9ycy4gSWYgc3RhbmRhcmQgb3V0cHV0IGlzIG5vdCBjb25uZWN0ZWQgdG8gYQorICAgICAgLy8vIHRlcm1pbmFsLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UuCisgICAgICBzdGF0aWMgYm9vbCBTdGFuZGFyZE91dEhhc0NvbG9ycygpOworCisgICAgICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRlcm1pbmFsIGNvbm5lY3RlZCB0byBzdGFuZGFyZAorICAgICAgLy8vIGVycm9yIHN1cHBvcnRzIGNvbG9ycy4gSWYgc3RhbmRhcmQgZXJyb3IgaXMgbm90IGNvbm5lY3RlZCB0byBhCisgICAgICAvLy8gdGVybWluYWwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKyAgICAgIHN0YXRpYyBib29sIFN0YW5kYXJkRXJySGFzQ29sb3JzKCk7CisKKyAgICAgIC8vLyBXaGV0aGVyIGNoYW5naW5nIGNvbG9ycyByZXF1aXJlcyB0aGUgb3V0cHV0IHRvIGJlIGZsdXNoZWQuCisgICAgICAvLy8gVGhpcyBpcyBuZWVkZWQgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgZXNjYXBlIHNlcXVlbmNlcyBmb3IKKyAgICAgIC8vLyBjaGFuZ2luZyBjb2xvcnMuCisgICAgICBzdGF0aWMgYm9vbCBDb2xvck5lZWRzRmx1c2goKTsKKworICAgICAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sb3Jjb2RlIGVzY2FwZSBzZXF1ZW5jZXMuCisgICAgICAvLy8gSWYgQ29sb3JOZWVkc0ZsdXNoKCkgaXMgdHJ1ZSB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbG9ycworICAgICAgLy8vIGFuZCByZXR1cm4gYW4gZW1wdHkgZXNjYXBlIHNlcXVlbmNlLiBJbiB0aGF0IGNhc2UgaXQgaXMgdGhlCisgICAgICAvLy8gcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNsaWVudCB0byBmbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBwcmlvciB0bworICAgICAgLy8vIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpPdXRwdXRDb2xvcihjaGFyIGMsIGJvb2wgYm9sZCwgYm9vbCBiZyk7CisKKyAgICAgIC8vLyBTYW1lIGFzIE91dHB1dENvbG9yLCBidXQgb25seSBlbmFibGVzIHRoZSBib2xkIGF0dHJpYnV0ZS4KKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpPdXRwdXRCb2xkKGJvb2wgYmcpOworCisgICAgICAvLy8gUmVzZXRzIHRoZSB0ZXJtaW5hbHMgY29sb3JzLCBvciByZXR1cm5zIGFuIGVzY2FwZSBzZXF1ZW5jZSB0byBkbyBzby4KKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpSZXNldENvbG9yKCk7CisgICAgLy8vIEB9CisgIH07Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9Qcm9ncmFtLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWNlNDc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9Qcm9ncmFtLmgKQEAgLTAsMCArMSwxNTggQEAKKy8vPT09LSBsbHZtL1N5c3RlbS9Qcm9ncmFtLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBsbHZtOjpzeXM6OlByb2dyYW0gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NZU1RFTV9QUk9HUkFNX0gKKyNkZWZpbmUgTExWTV9TWVNURU1fUFJPR1JBTV9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9QYXRoLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisgIC8vIFRPRE86IEFkZCBvcGVyYXRpb25zIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHByb2Nlc3MsIHJlZGlyZWN0IGl0cyBJL08sCisgIC8vIGV0Yy4KKworICAvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBmb3IgcHJvZ3JhbXMgdGhhdCBhcmUgZXhlY3V0YWJsZSBieSB0aGUKKyAgLy8vIG9wZXJhdGluZyBzeXN0ZW0uIEl0IHByb3ZpZGVzIGEgcGxhdGZvcm0gZ2VuZXJpYyB3YXkgdG8gZmluZCBleGVjdXRhYmxlCisgIC8vLyBwcm9ncmFtcyBmcm9tIHRoZSBwYXRoIGFuZCB0byBleGVjdXRlIHRoZW0gaW4gdmFyaW91cyB3YXlzLiBUaGUgc3lzOjpQYXRoCisgIC8vLyBjbGFzcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBQcm9ncmFtLgorICAvLy8gQHNpbmNlIDEuNAorICAvLy8gQGJyaWVmIEFuIGFic3RyYWN0aW9uIGZvciBmaW5kaW5nIGFuZCBleGVjdXRpbmcgcHJvZ3JhbXMuCisgIGNsYXNzIFByb2dyYW0geworICAgIC8vLyBPcGFxdWUgaGFuZGxlIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YS4KKyAgICB2b2lkICpEYXRhXzsKKworICAgIC8vIE5vbmNvcHlhYmxlLgorICAgIFByb2dyYW0oY29uc3QgUHJvZ3JhbSYgb3RoZXIpOworICAgIFByb2dyYW0mIG9wZXJhdG9yPShjb25zdCBQcm9ncmFtJiBvdGhlcik7CisKKyAgICAvLy8gQG5hbWUgTWV0aG9kcworICAgIC8vLyBAeworICBwdWJsaWM6CisKKyAgICBQcm9ncmFtKCk7CisgICAgflByb2dyYW0oKTsKKworICAgIC8vLyBSZXR1cm4gcHJvY2VzcyBJRCBvZiB0aGlzIHByb2dyYW0uCisgICAgdW5zaWduZWQgR2V0UGlkKCkgY29uc3Q7CisKKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcHJvZ3JhbSB1c2luZyB0aGUgXHAgYXJndW1lbnRzIHByb3ZpZGVkLiAgVGhlCisgICAgLy8vIGludm9rZWQgcHJvZ3JhbSB3aWxsIGluaGVyaXQgdGhlIHN0ZGluLCBzdGRvdXQsIGFuZCBzdGRlcnIgZmlsZQorICAgIC8vLyBkZXNjcmlwdG9ycywgdGhlIGVudmlyb25tZW50IGFuZCBvdGhlciBjb25maWd1cmF0aW9uIHNldHRpbmdzIG9mIHRoZQorICAgIC8vLyBpbnZva2luZyBwcm9ncmFtLiBJZiBQYXRoOjpleGVjdXRhYmxlKCkgZG9lcyBub3QgcmV0dXJuIHRydWUgd2hlbiB0aGlzCisgICAgLy8vIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aGVuIGEgc3RkOjpzdHJpbmcgaXMgdGhyb3duLgorICAgIC8vLyBAcmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLCB0cnVlIG90aGVyd2lzZS4KKyAgICAvLy8gQHNlZSBGaW5kUHJvZ3JhbUJ5TmFtZQorICAgIC8vLyBAYnJpZWYgRXhlY3V0ZXMgdGhlIHByb2dyYW0gd2l0aCB0aGUgZ2l2ZW4gc2V0IG9mIFxwIGFyZ3MuCisgICAgYm9vbCBFeGVjdXRlCisgICAgKCBjb25zdCBQYXRoJiBwYXRoLCAgLy8vPCBzeXM6OlBhdGggb2JqZWN0IHByb3ZpZGluZyB0aGUgcGF0aCBvZiB0aGUKKyAgICAgIC8vLzwgcHJvZ3JhbSB0byBiZSBleGVjdXRlZC4gSXQgaXMgcHJlc3VtZWQgdGhpcyBpcyB0aGUgcmVzdWx0IG9mCisgICAgICAvLy88IHRoZSBGaW5kUHJvZ3JhbUJ5TmFtZSBtZXRob2QuCisgICAgICBjb25zdCBjaGFyKiogYXJncywgLy8vPCBBIHZlY3RvciBvZiBzdHJpbmdzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUKKyAgICAgIC8vLzwgcHJvZ3JhbS4gIFRoZSBmaXJzdCBlbGVtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbS4KKyAgICAgIC8vLzwgVGhlIGxpc3QgKm11c3QqIGJlIHRlcm1pbmF0ZWQgYnkgYSBudWxsIGNoYXIqIGVudHJ5LgorICAgICAgY29uc3QgY2hhciAqKiBlbnYgPSAwLCAvLy88IEFuIG9wdGlvbmFsIHZlY3RvciBvZiBzdHJpbmdzIHRvIHVzZSBmb3IKKyAgICAgIC8vLzwgdGhlIHByb2dyYW0ncyBlbnZpcm9ubWVudC4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCBwcm9ncmFtJ3MKKyAgICAgIC8vLzwgZW52aXJvbm1lbnQgd2lsbCBiZSB1c2VkLgorICAgICAgY29uc3Qgc3lzOjpQYXRoKiogcmVkaXJlY3RzID0gMCwgLy8vPCBBbiBvcHRpb25hbCBhcnJheSBvZiBwb2ludGVycyB0bworICAgICAgLy8vPCBQYXRocy4gSWYgdGhlIGFycmF5IGlzIG51bGwsIG5vIHJlZGlyZWN0aW9uIGlzIGRvbmUuIFRoZSBhcnJheQorICAgICAgLy8vPCBzaG91bGQgaGF2ZSBhIHNpemUgb2YgYXQgbGVhc3QgdGhyZWUuIElmIHRoZSBwb2ludGVyIGluIHRoZSBhcnJheQorICAgICAgLy8vPCBhcmUgbm90IG51bGwsIHRoZW4gdGhlIGluZmVyaW9yIHByb2Nlc3MncyBzdGRpbigwKSwgc3Rkb3V0KDEpLAorICAgICAgLy8vPCBhbmQgc3RkZXJyKDIpIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0aGUgY29ycmVzcG9uZGluZyBQYXRocy4KKyAgICAgIC8vLzwgV2hlbiBhbiBlbXB0eSBQYXRoIGlzIHBhc3NlZCBpbiwgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZQorICAgICAgLy8vPCBkZXNjcmlwdG9yIHdpbGwgYmUgZGlzY29ubmVjdGVkIChpZSwgL2Rldi9udWxsJ2QpIGluIGEgcG9ydGFibGUKKyAgICAgIC8vLzwgd2F5LgorICAgICAgdW5zaWduZWQgbWVtb3J5TGltaXQgPSAwLCAvLy88IElmIG5vbi16ZXJvLCB0aGlzIHNwZWNpZmllcyBtYXguIGFtb3VudAorICAgICAgLy8vPCBvZiBtZW1vcnkgY2FuIGJlIGFsbG9jYXRlZCBieSBwcm9jZXNzLiBJZiBtZW1vcnkgdXNhZ2Ugd2lsbCBiZQorICAgICAgLy8vPCBoaWdoZXIgbGltaXQsIHRoZSBjaGlsZCBpcyBraWxsZWQgYW5kIHRoaXMgY2FsbCByZXR1cm5zLiBJZiB6ZXJvCisgICAgICAvLy88IC0gbm8gbWVtb3J5IGxpbWl0LgorICAgICAgc3RkOjpzdHJpbmcqIEVyck1zZyA9IDAgLy8vPCBJZiBub24temVybywgcHJvdmlkZXMgYSBwb2ludGVyIHRvIGEgc3RyaW5nCisgICAgICAvLy88IGluc3RhbmNlIGluIHdoaWNoIGVycm9yIG1lc3NhZ2VzIHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoZSBzdHJpbmcKKyAgICAgIC8vLzwgaXMgbm9uLWVtcHR5IHVwb24gcmV0dXJuIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGludm9raW5nIHRoZQorICAgICAgLy8vPCBwcm9ncmFtLgorICAgICAgKTsKKworICAgIC8vLyBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciB0aGUgcHJvZ3JhbSB0byBleGl0LiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sKKyAgICAvLy8gdGhlIGN1cnJlbnQgcHJvZ3JhbSB1bnRpbCB0aGUgaW52b2tlZCBwcm9ncmFtIGV4aXRzLgorICAgIC8vLyBAcmV0dXJucyBhbiBpbnRlZ2VyIHJlc3VsdCBjb2RlIGluZGljYXRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgcHJvZ3JhbS4KKyAgICAvLy8gQSB6ZXJvIG9yIHBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aGUgcmVzdWx0IGNvZGUgb2YgdGhlIHByb2dyYW0uIEEKKyAgICAvLy8gbmVnYXRpdmUgdmFsdWUgaXMgdGhlIHNpZ25hbCBudW1iZXIgb24gd2hpY2ggaXQgdGVybWluYXRlZC4KKyAgICAvLy8gQHNlZSBFeGVjdXRlCisgICAgLy8vIEBicmllZiBXYWl0cyBmb3IgdGhlIHByb2dyYW0gdG8gZXhpdC4KKyAgICBpbnQgV2FpdAorICAgICggdW5zaWduZWQgc2Vjb25kc1RvV2FpdCA9IDAsIC8vLzwgSWYgbm9uLXplcm8sIHRoaXMgc3BlY2lmaWVzIHRoZSBhbW91bnQKKyAgICAgIC8vLzwgb2YgdGltZSB0byB3YWl0IGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBleGl0LiBJZiB0aGUgdGltZQorICAgICAgLy8vPCBleHBpcmVzLCB0aGUgY2hpbGQgaXMga2lsbGVkIGFuZCB0aGlzIGNhbGwgcmV0dXJucy4gSWYgemVybywKKyAgICAgIC8vLzwgdGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQgdW50aWwgdGhlIGNoaWxkIGZpbmlzaGVzIG9yIGZvcmV2ZXIgaWYKKyAgICAgIC8vLzwgaXQgZG9lc24ndC4KKyAgICAgIHN0ZDo6c3RyaW5nKiBFcnJNc2cgPSAwIC8vLzwgSWYgbm9uLXplcm8sIHByb3ZpZGVzIGEgcG9pbnRlciB0byBhIHN0cmluZworICAgICAgLy8vPCBpbnN0YW5jZSBpbiB3aGljaCBlcnJvciBtZXNzYWdlcyB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGUgc3RyaW5nCisgICAgICAvLy88IGlzIG5vbi1lbXB0eSB1cG9uIHJldHVybiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3YWl0aW5nLgorICAgICAgKTsKKworICAgIC8vLyBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgdGhlIHByb2dyYW0uCisgICAgLy8vIEByZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJlZC4KKyAgICAvLy8gQHNlZSBFeGVjdXRlCisgICAgLy8vIEBicmllZiBUZXJtaW5hdGVzIHRoZSBwcm9ncmFtLgorICAgIGJvb2wgS2lsbAorICAgICggc3RkOjpzdHJpbmcqIEVyck1zZyA9IDAgLy8vPCBJZiBub24temVybywgcHJvdmlkZXMgYSBwb2ludGVyIHRvIGEgc3RyaW5nCisgICAgICAvLy88IGluc3RhbmNlIGluIHdoaWNoIGVycm9yIG1lc3NhZ2VzIHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoZSBzdHJpbmcKKyAgICAgIC8vLzwgaXMgbm9uLWVtcHR5IHVwb24gcmV0dXJuIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGtpbGxpbmcgdGhlCisgICAgICAvLy88IHByb2dyYW0uCisgICAgICApOworCisgICAgLy8vIFRoaXMgc3RhdGljIGNvbnN0cnVjdG9yIChmYWN0b3J5KSB3aWxsIGF0dGVtcHQgdG8gbG9jYXRlIGEgcHJvZ3JhbSBpbgorICAgIC8vLyB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGZpbGUgc3lzdGVtIHVzaW5nIHNvbWUgcHJlLWRldGVybWluZWQgc2V0IG9mCisgICAgLy8vIGxvY2F0aW9ucyB0byBzZWFyY2ggKGUuZy4gdGhlIFBBVEggb24gVW5peCkuCisgICAgLy8vIEByZXR1cm5zIEEgUGF0aCBvYmplY3QgaW5pdGlhbGl6ZWQgdG8gdGhlIHBhdGggb2YgdGhlIHByb2dyYW0gb3IgYQorICAgIC8vLyBQYXRoIG9iamVjdCB0aGF0IGlzIGVtcHR5IChpbnZhbGlkKSBpZiB0aGUgcHJvZ3JhbSBjb3VsZCBub3QgYmUgZm91bmQuCisgICAgLy8vIEB0aHJvd3Mgbm90aGluZworICAgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgUHJvZ3JhbSBieSBmaW5kaW5nIGl0IGJ5IG5hbWUuCisgICAgc3RhdGljIFBhdGggRmluZFByb2dyYW1CeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworCisgICAgLy8gVGhlc2UgbWV0aG9kcyBjaGFuZ2UgdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBzdHJlYW0gKHN0ZGluLAorICAgIC8vIHN0ZG91dCwgb3Igc3RkZXJyKSB0byBiaW5hcnkgbW9kZS4gVGhleSByZXR1cm4gdHJ1ZSBpZiBhbiBlcnJvcgorICAgIC8vIG9jY3VycmVkCisgICAgc3RhdGljIGJvb2wgQ2hhbmdlU3RkaW5Ub0JpbmFyeSgpOworICAgIHN0YXRpYyBib29sIENoYW5nZVN0ZG91dFRvQmluYXJ5KCk7CisgICAgc3RhdGljIGJvb2wgQ2hhbmdlU3RkZXJyVG9CaW5hcnkoKTsKKworICAgIC8vLyBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG8gUHJvZ3JhbSBwcmc7IHByZy5FeGVjdXRlKC4uKTsKKyAgICAvLy8gcHJnLldhaXQoLi4pOworICAgIC8vLyBAdGhyb3dzIG5vdGhpbmcKKyAgICAvLy8gQHNlZSBFeGVjdXRlLCBXYWl0CisgICAgc3RhdGljIGludCBFeGVjdXRlQW5kV2FpdChjb25zdCBQYXRoJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqIGVudiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzeXM6OlBhdGgqKiByZWRpcmVjdHMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2Vjb25kc1RvV2FpdCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtZW1vcnlMaW1pdCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogRXJyTXNnID0gMCk7CisKKyAgICAvLy8gQSBjb252ZW5pZW5jZSBmdW5jdGlvbiBlcXVpdmFsZW50IHRvIFByb2dyYW0gcHJnOyBwcmcuRXhlY3V0ZSguLik7CisgICAgLy8vIEB0aHJvd3Mgbm90aGluZworICAgIC8vLyBAc2VlIEV4ZWN1dGUKKyAgICBzdGF0aWMgdm9pZCBFeGVjdXRlTm9XYWl0KGNvbnN0IFBhdGgmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiogZW52ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5czo6UGF0aCoqIHJlZGlyZWN0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtZW1vcnlMaW1pdCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogRXJyTXNnID0gMCk7CisKKyAgICAvLy8gQH0KKworICB9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vUldNdXRleC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9SV011dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyODgxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vUldNdXRleC5oCkBAIC0wLDAgKzEsMTczIEBACisvLz09PS0gUldNdXRleC5oIC0gUmVhZGVyL1dyaXRlciBNdXR1YWwgRXhjbHVzaW9uIExvY2sgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpSV011dGV4IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWVNURU1fUldNVVRFWF9ICisjZGVmaW5lIExMVk1fU1lTVEVNX1JXTVVURVhfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vVGhyZWFkaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0KK3sKKyAgbmFtZXNwYWNlIHN5cworICB7CisgICAgLy8vIEBicmllZiBQbGF0Zm9ybSBhZ25vc3RpYyBSV011dGV4IGNsYXNzLgorICAgIGNsYXNzIFJXTXV0ZXhJbXBsCisgICAgeworICAgIC8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gQHsKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vLyBJbml0aWFsaXplcyB0aGUgbG9jayBidXQgZG9lc24ndCBhY3F1aXJlIGl0LgorICAgICAgLy8vIEBicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAgZXhwbGljaXQgUldNdXRleEltcGwoKTsKKworICAgICAgLy8vIFJlbGVhc2VzIGFuZCByZW1vdmVzIHRoZSBsb2NrCisgICAgICAvLy8gQGJyaWVmIERlc3RydWN0b3IKKyAgICAgIH5SV011dGV4SW1wbCgpOworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIE1ldGhvZHMKKyAgICAvLy8gQHsKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vLyBBdHRlbXB0cyB0byB1bmNvbmRpdGlvbmFsbHkgYWNxdWlyZSB0aGUgbG9jayBpbiByZWFkZXIgbW9kZS4gSWYgdGhlCisgICAgICAvLy8gbG9jayBpcyBoZWxkIGJ5IGEgd3JpdGVyLCB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdW50aWwgaXQgY2FuIGFjcXVpcmUKKyAgICAgIC8vLyB0aGUgbG9jay4gCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgYW55IGtpbmQgb2YgZXJyb3Igb2NjdXJzLCB0cnVlIG90aGVyd2lzZS4KKyAgICAgIC8vLyBAYnJpZWYgVW5jb25kaXRpb25hbGx5IGFjcXVpcmUgdGhlIGxvY2sgaW4gcmVhZGVyIG1vZGUuCisgICAgICBib29sIHJlYWRlcl9hY3F1aXJlKCk7CisKKyAgICAgIC8vLyBBdHRlbXB0cyB0byByZWxlYXNlIHRoZSBsb2NrIGluIHJlYWRlciBtb2RlLgorICAgICAgLy8vIEByZXR1cm5zIGZhbHNlIGlmIGFueSBraW5kIG9mIGVycm9yIG9jY3VycywgdHJ1ZSBvdGhlcndpc2UuCisgICAgICAvLy8gQGJyaWVmIFVuY29uZGl0aW9uYWxseSByZWxlYXNlIHRoZSBsb2NrIGluIHJlYWRlciBtb2RlLgorICAgICAgYm9vbCByZWFkZXJfcmVsZWFzZSgpOworCisgICAgICAvLy8gQXR0ZW1wdHMgdG8gdW5jb25kaXRpb25hbGx5IGFjcXVpcmUgdGhlIGxvY2sgaW4gcmVhZGVyIG1vZGUuIElmIHRoZQorICAgICAgLy8vIGxvY2sgaXMgaGVsZCBieSBhbnkgcmVhZGVycywgdGhpcyBtZXRob2Qgd2lsbCB3YWl0IHVudGlsIGl0IGNhbgorICAgICAgLy8vIGFjcXVpcmUgdGhlIGxvY2suIAorICAgICAgLy8vIEByZXR1cm5zIGZhbHNlIGlmIGFueSBraW5kIG9mIGVycm9yIG9jY3VycywgdHJ1ZSBvdGhlcndpc2UuCisgICAgICAvLy8gQGJyaWVmIFVuY29uZGl0aW9uYWxseSBhY3F1aXJlIHRoZSBsb2NrIGluIHdyaXRlciBtb2RlLgorICAgICAgYm9vbCB3cml0ZXJfYWNxdWlyZSgpOworCisgICAgICAvLy8gQXR0ZW1wdHMgdG8gcmVsZWFzZSB0aGUgbG9jayBpbiB3cml0ZXIgbW9kZS4KKyAgICAgIC8vLyBAcmV0dXJucyBmYWxzZSBpZiBhbnkga2luZCBvZiBlcnJvciBvY2N1cnMsIHRydWUgb3RoZXJ3aXNlLgorICAgICAgLy8vIEBicmllZiBVbmNvbmRpdGlvbmFsbHkgcmVsZWFzZSB0aGUgbG9jayBpbiB3cml0ZSBtb2RlLgorICAgICAgYm9vbCB3cml0ZXJfcmVsZWFzZSgpOworCisgICAgLy9AfQorICAgIC8vLyBAbmFtZSBQbGF0Zm9ybSBEZXBlbmRlbnQgRGF0YQorICAgIC8vLyBAeworICAgIHByaXZhdGU6CisgICAgICB2b2lkKiBkYXRhXzsgLy8vPCBXZSBkb24ndCBrbm93IHdoYXQgdGhlIGRhdGEgd2lsbCBiZQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIERvIE5vdCBJbXBsZW1lbnQKKyAgICAvLy8gQHsKKyAgICBwcml2YXRlOgorICAgICAgUldNdXRleEltcGwoY29uc3QgUldNdXRleEltcGwgJiBvcmlnaW5hbCk7CisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBSV011dGV4SW1wbCAmKTsKKyAgICAvLy8gQH0KKyAgICB9OworICAgIAorICAgIC8vLyBTbWFydE11dGV4IC0gQW4gUi9XIG11dGV4IHdpdGggYSBjb21waWxlIHRpbWUgY29uc3RhbnQgcGFyYW1ldGVyIHRoYXQgCisgICAgLy8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgbXV0ZXggc2hvdWxkIGJlY29tZSBhIG5vLW9wIHdoZW4gd2UncmUgbm90CisgICAgLy8vIHJ1bm5pbmcgaW4gbXVsdGl0aHJlYWRlZCBtb2RlLgorICAgIHRlbXBsYXRlPGJvb2wgbXRfb25seT4KKyAgICBjbGFzcyBTbWFydFJXTXV0ZXggOiBwdWJsaWMgUldNdXRleEltcGwgeworICAgICAgdW5zaWduZWQgcmVhZGVycywgd3JpdGVyczsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBTbWFydFJXTXV0ZXgoKSA6IFJXTXV0ZXhJbXBsKCksIHJlYWRlcnMoMCksIHdyaXRlcnMoMCkgeyB9CisgICAgICAKKyAgICAgIGJvb2wgcmVhZGVyX2FjcXVpcmUoKSB7CisgICAgICAgIGlmICghbXRfb25seSB8fCBsbHZtX2lzX211bHRpdGhyZWFkZWQoKSkKKyAgICAgICAgICByZXR1cm4gUldNdXRleEltcGw6OnJlYWRlcl9hY3F1aXJlKCk7CisgICAgICAgIAorICAgICAgICAvLyBTaW5nbGUtdGhyZWFkZWQgZGVidWdnaW5nIGNvZGUuICBUaGlzIHdvdWxkIGJlIHJhY3kgaW4gbXVsdGl0aHJlYWRlZAorICAgICAgICAvLyBtb2RlLCBidXQgcHJvdmlkZXMgbm90IHNhbml0eSBjaGVja3MgaW4gc2luZ2xlIHRocmVhZGVkIG1vZGUuCisgICAgICAgICsrcmVhZGVyczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAKKyAgICAgIGJvb2wgcmVhZGVyX3JlbGVhc2UoKSB7CisgICAgICAgIGlmICghbXRfb25seSB8fCBsbHZtX2lzX211bHRpdGhyZWFkZWQoKSkKKyAgICAgICAgICByZXR1cm4gUldNdXRleEltcGw6OnJlYWRlcl9yZWxlYXNlKCk7CisgICAgICAgIAorICAgICAgICAvLyBTaW5nbGUtdGhyZWFkZWQgZGVidWdnaW5nIGNvZGUuICBUaGlzIHdvdWxkIGJlIHJhY3kgaW4gbXVsdGl0aHJlYWRlZAorICAgICAgICAvLyBtb2RlLCBidXQgcHJvdmlkZXMgbm90IHNhbml0eSBjaGVja3MgaW4gc2luZ2xlIHRocmVhZGVkIG1vZGUuCisgICAgICAgIGFzc2VydChyZWFkZXJzID4gMCAmJiAiUmVhZGVyIGxvY2sgbm90IGFjcXVpcmVkIGJlZm9yZSByZWxlYXNlISIpOworICAgICAgICAtLXJlYWRlcnM7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgCisgICAgICBib29sIHdyaXRlcl9hY3F1aXJlKCkgeworICAgICAgICBpZiAoIW10X29ubHkgfHwgbGx2bV9pc19tdWx0aXRocmVhZGVkKCkpCisgICAgICAgICAgcmV0dXJuIFJXTXV0ZXhJbXBsOjp3cml0ZXJfYWNxdWlyZSgpOworICAgICAgICAKKyAgICAgICAgLy8gU2luZ2xlLXRocmVhZGVkIGRlYnVnZ2luZyBjb2RlLiAgVGhpcyB3b3VsZCBiZSByYWN5IGluIG11bHRpdGhyZWFkZWQKKyAgICAgICAgLy8gbW9kZSwgYnV0IHByb3ZpZGVzIG5vdCBzYW5pdHkgY2hlY2tzIGluIHNpbmdsZSB0aHJlYWRlZCBtb2RlLgorICAgICAgICBhc3NlcnQod3JpdGVycyA9PSAwICYmICJXcml0ZXIgbG9jayBhbHJlYWR5IGFjcXVpcmVkISIpOworICAgICAgICArK3dyaXRlcnM7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgCisgICAgICBib29sIHdyaXRlcl9yZWxlYXNlKCkgeworICAgICAgICBpZiAoIW10X29ubHkgfHwgbGx2bV9pc19tdWx0aXRocmVhZGVkKCkpCisgICAgICAgICAgcmV0dXJuIFJXTXV0ZXhJbXBsOjp3cml0ZXJfcmVsZWFzZSgpOworICAgICAgICAKKyAgICAgICAgLy8gU2luZ2xlLXRocmVhZGVkIGRlYnVnZ2luZyBjb2RlLiAgVGhpcyB3b3VsZCBiZSByYWN5IGluIG11bHRpdGhyZWFkZWQKKyAgICAgICAgLy8gbW9kZSwgYnV0IHByb3ZpZGVzIG5vdCBzYW5pdHkgY2hlY2tzIGluIHNpbmdsZSB0aHJlYWRlZCBtb2RlLgorICAgICAgICBhc3NlcnQod3JpdGVycyA9PSAxICYmICJXcml0ZXIgbG9jayBub3QgYWNxdWlyZWQgYmVmb3JlIHJlbGVhc2UhIik7CisgICAgICAgIC0td3JpdGVyczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgU21hcnRSV011dGV4KGNvbnN0IFNtYXJ0UldNdXRleDxtdF9vbmx5PiAmIG9yaWdpbmFsKTsKKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNtYXJ0UldNdXRleDxtdF9vbmx5PiAmKTsKKyAgICB9OworICAgIHR5cGVkZWYgU21hcnRSV011dGV4PGZhbHNlPiBSV011dGV4OworICAgIAorICAgIC8vLyBTY29wZWRSZWFkZXIgLSBSQUlJIGFjcXVpc2l0aW9uIG9mIGEgcmVhZGVyIGxvY2sKKyAgICB0ZW1wbGF0ZTxib29sIG10X29ubHk+CisgICAgc3RydWN0IFNtYXJ0U2NvcGVkUmVhZGVyIHsKKyAgICAgIFNtYXJ0UldNdXRleDxtdF9vbmx5PiYgbXV0ZXg7CisgICAgICAKKyAgICAgIGV4cGxpY2l0IFNtYXJ0U2NvcGVkUmVhZGVyKFNtYXJ0UldNdXRleDxtdF9vbmx5PiYgbSkgOiBtdXRleChtKSB7CisgICAgICAgIG11dGV4LnJlYWRlcl9hY3F1aXJlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIH5TbWFydFNjb3BlZFJlYWRlcigpIHsKKyAgICAgICAgbXV0ZXgucmVhZGVyX3JlbGVhc2UoKTsKKyAgICAgIH0KKyAgICB9OworICAgIHR5cGVkZWYgU21hcnRTY29wZWRSZWFkZXI8ZmFsc2U+IFNjb3BlZFJlYWRlcjsKKyAgICAKKyAgICAvLy8gU2NvcGVkV3JpdGVyIC0gUkFJSSBhY3F1aXNpdGlvbiBvZiBhIHdyaXRlciBsb2NrCisgICAgdGVtcGxhdGU8Ym9vbCBtdF9vbmx5PgorICAgIHN0cnVjdCBTbWFydFNjb3BlZFdyaXRlciB7CisgICAgICBTbWFydFJXTXV0ZXg8bXRfb25seT4mIG11dGV4OworICAgICAgCisgICAgICBleHBsaWNpdCBTbWFydFNjb3BlZFdyaXRlcihTbWFydFJXTXV0ZXg8bXRfb25seT4mIG0pIDogbXV0ZXgobSkgeworICAgICAgICBtdXRleC53cml0ZXJfYWNxdWlyZSgpOworICAgICAgfQorICAgICAgCisgICAgICB+U21hcnRTY29wZWRXcml0ZXIoKSB7CisgICAgICAgIG11dGV4LndyaXRlcl9yZWxlYXNlKCk7CisgICAgICB9CisgICAgfTsKKyAgICB0eXBlZGVmIFNtYXJ0U2NvcGVkV3JpdGVyPGZhbHNlPiBTY29wZWRXcml0ZXI7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1NpZ25hbHMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vU2lnbmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNDQyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1NpZ25hbHMuaApAQCAtMCwwICsxLDU1IEBACisvLz09PS0gbGx2bS9TeXN0ZW0vU2lnbmFscy5oIC0gU2lnbmFsIEhhbmRsaW5nIHN1cHBvcnQgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgaGVscGZ1bCBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YKKy8vIHVuaXggc2lnbmFscyBvY2N1cmluZyB3aGlsZSB5b3VyIHByb2dyYW0gaXMgcnVubmluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1lTVEVNX1NJR05BTFNfSAorI2RlZmluZSBMTFZNX1NZU1RFTV9TSUdOQUxTX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL1BhdGguaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcnVucyBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJydXB0IGhhbmRsZXJzLCBpbmNsdWRpbmcgdGhlCisgIC8vLyByZW1vdmFsIG9mIGZpbGVzIHJlZ2lzdGVyZWQgYnkgUmVtb3ZlRmlsZU9uU2lnbmFsLgorICB2b2lkIFJ1bkludGVycnVwdEhhbmRsZXJzKCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHNpZ25hbCBoYW5kbGVycyB0byBlbnN1cmUgdGhhdCBpZiBhIHNpZ25hbCBnZXRzCisgIC8vLyBkZWxpdmVyZWQgdGhhdCB0aGUgbmFtZWQgZmlsZSBpcyByZW1vdmVkLgorICAvLy8gQGJyaWVmIFJlbW92ZSBhIGZpbGUgaWYgYSBmYXRhbCBzaWduYWwgb2NjdXJzLgorICBib29sIFJlbW92ZUZpbGVPblNpZ25hbChjb25zdCBQYXRoICZGaWxlbmFtZSwgc3RkOjpzdHJpbmcqIEVyck1zZyA9IDApOworCisgIC8vLyBXaGVuIGFuIGVycm9yIHNpZ25hbCAoc3VjaCBhcyBTSUJBQlJUIG9yIFNJR1NFR1YpIGlzIGRlbGl2ZXJlZCB0byB0aGUKKyAgLy8vIHByb2Nlc3MsIHByaW50IGEgc3RhY2sgdHJhY2UgYW5kIHRoZW4gZXhpdC4KKyAgLy8vIEBicmllZiBQcmludCBhIHN0YWNrIHRyYWNlIGlmIGEgZmF0YWwgc2lnbmFsIG9jY3Vycy4KKyAgdm9pZCBQcmludFN0YWNrVHJhY2VPbkVycm9yU2lnbmFsKCk7CisKKyAgLy8vIEFkZFNpZ25hbEhhbmRsZXIgLSBBZGQgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBhbiBhYm9ydC9raWxsIHNpZ25hbAorICAvLy8gaXMgZGVsaXZlcmVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGhhbmRsZXIgY2FuIGhhdmUgYSBjb29raWUgcGFzc2VkIHRvIGl0CisgIC8vLyB0byBpZGVudGlmeSB3aGF0IGluc3RhbmNlIG9mIHRoZSBoYW5kbGVyIGl0IGlzLgorICB2b2lkIEFkZFNpZ25hbEhhbmRsZXIodm9pZCAoKkZuUHRyKSh2b2lkICopLCB2b2lkICpDb29raWUpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB1c2VyICJpbnRlcnJ1cHRzIgorICAvLy8gdGhlIHByb2dyYW0gKHR5cGljYWxseSBieSBwcmVzc2luZyBjdHJsLWMpLiAgV2hlbiB0aGUgdXNlciBpbnRlcnJ1cHRzIHRoZQorICAvLy8gcHJvZ3JhbSwgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgZnVuY3Rpb24gaXMgY2FsbGVkIGluc3RlYWQgb2YgdGhlIHByb2dyYW0KKyAgLy8vIGJlaW5nIGtpbGxlZCwgYW5kIHRoZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYXV0b21hdGljYWxseSBkaXNhYmxlZC4gIE5vdGUKKyAgLy8vIHRoYXQgaW50ZXJydXB0IGZ1bmN0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCBhbnkgbm9uLXJlZW50cmFudAorICAvLy8gZnVuY3Rpb25zLiAgQW4gbnVsbCBpbnRlcnJ1cHQgZnVuY3Rpb24gcG9pbnRlciBkaXNhYmxlcyB0aGUgY3VycmVudAorICAvLy8gaW5zdGFsbGVkIGZ1bmN0aW9uLiAgTm90ZSBhbHNvIHRoYXQgdGhlIGhhbmRsZXIgbWF5IGJlIGV4ZWN1dGVkIG9uIGEKKyAgLy8vIGRpZmZlcmVudCB0aHJlYWQgb24gc29tZSBwbGF0Zm9ybXMuCisgIC8vLyBAYnJpZWYgUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBjdHJsLWMgaXMgcHJlc3NlZC4KKyAgdm9pZCBTZXRJbnRlcnJ1cHRGdW5jdGlvbih2b2lkICgqSUYpKCkpOworfSAvLyBFbmQgc3lzIG5hbWVzcGFjZQorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1NvbGFyaXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vU29sYXJpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YWRiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1NvbGFyaXMuaApAQCAtMCwwICsxLDQwIEBACisvKj09PS0gbGx2bS9TeXN0ZW0vU29sYXJpcy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qCisgKgorICogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorICogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSoKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcG9ydGFiaWxpdHkgZml4ZXMgZm9yIFNvbGFyaXMgaG9zdHMuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX1NZU1RFTV9TT0xBUklTX0gKKyNkZWZpbmUgTExWTV9TWVNURU1fU09MQVJJU19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVnc2V0Lmg+CisKKyN1bmRlZiBDUworI3VuZGVmIERTCisjdW5kZWYgRVMKKyN1bmRlZiBGUworI3VuZGVmIEdTCisjdW5kZWYgU1MKKyN1bmRlZiBFQVgKKyN1bmRlZiBFQ1gKKyN1bmRlZiBFRFgKKyN1bmRlZiBFQlgKKyN1bmRlZiBFU1AKKyN1bmRlZiBFQlAKKyN1bmRlZiBFU0kKKyN1bmRlZiBFREkKKyN1bmRlZiBFSVAKKyN1bmRlZiBVRVNQCisjdW5kZWYgRUZMCisjdW5kZWYgRVJSCisjdW5kZWYgVFJBUE5PCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9UaHJlYWRMb2NhbC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9UaHJlYWRMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZWRkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1RocmVhZExvY2FsLmgKQEAgLTAsMCArMSw1NCBAQAorLy89PT0tIGxsdm0vU3lzdGVtL1RocmVhZExvY2FsLmggLSBUaHJlYWQgTG9jYWwgRGF0YSAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6VGhyZWFkTG9jYWwgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NZU1RFTV9USFJFQURfTE9DQUxfSAorI2RlZmluZSBMTFZNX1NZU1RFTV9USFJFQURfTE9DQUxfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vVGhyZWFkaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworICBuYW1lc3BhY2Ugc3lzIHsKKyAgICAvLyBUaHJlYWRMb2NhbEltcGwgLSBDb21tb24gYmFzZSBjbGFzcyBvZiBhbGwgVGhyZWFkTG9jYWwgaW5zdGFudGlhdGlvbnMuCisgICAgLy8gWU9VIFNIT1VMRCBORVZFUiBVU0UgVEhJUyBESVJFQ1RMWS4KKyAgICBjbGFzcyBUaHJlYWRMb2NhbEltcGwgeworICAgICAgdm9pZCogZGF0YTsKKyAgICBwdWJsaWM6CisgICAgICBUaHJlYWRMb2NhbEltcGwoKTsKKyAgICAgIHZpcnR1YWwgflRocmVhZExvY2FsSW1wbCgpOworICAgICAgdm9pZCBzZXRJbnN0YW5jZShjb25zdCB2b2lkKiBkKTsKKyAgICAgIGNvbnN0IHZvaWQqIGdldEluc3RhbmNlKCk7CisgICAgICB2b2lkIHJlbW92ZUluc3RhbmNlKCk7CisgICAgfTsKKyAgICAKKyAgICAvLy8gVGhyZWFkTG9jYWwgLSBBIGNsYXNzIHVzZWQgdG8gYWJzdHJhY3QgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuICBJdCBob2xkcywKKyAgICAvLy8gZm9yIGVhY2ggdGhyZWFkLCBhIHBvaW50ZXIgYSBzaW5nbGUgb2JqZWN0IG9mIHR5cGUgVC4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNsYXNzIFRocmVhZExvY2FsIDogcHVibGljIFRocmVhZExvY2FsSW1wbCB7CisgICAgcHVibGljOgorICAgICAgVGhyZWFkTG9jYWwoKSA6IFRocmVhZExvY2FsSW1wbCgpIHsgfQorICAgICAgCisgICAgICAvLy8gZ2V0IC0gRmV0Y2hlcyBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKKyAgICAgIC8vLyB0aHJlYWQuICBJZiBubyBvYmplY3QgaGFzIHlldCBiZWVuIGFzc29jaWF0ZWQsIGl0IHJldHVybnMgTlVMTDsKKyAgICAgIFQqIGdldCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihnZXRJbnN0YW5jZSgpKTsgfQorICAgICAgCisgICAgICAvLyBzZXQgLSBBc3NvY2lhdGVzIGEgcG9pbnRlciB0byBhbiBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgICB2b2lkIHNldChUKiBkKSB7IHNldEluc3RhbmNlKGQpOyB9CisgICAgICAKKyAgICAgIC8vIGVyYXNlIC0gUmVtb3ZlcyB0aGUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgICAgdm9pZCBlcmFzZSgpIHsgcmVtb3ZlSW5zdGFuY2UoKTsgfQorICAgIH07CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1RocmVhZGluZy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9UaHJlYWRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQyZjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9UaHJlYWRpbmcuaApAQCAtMCwwICsxLDQ1IEBACisvLz09PS0tIGxsdm0vU3lzdGVtL1RocmVhZGluZy5oIC0gQ29udHJvbCBtdWx0aXRocmVhZGluZyBtb2RlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVFRoaXMgZmlsZSBkZWZpbmVzIGxsdm1fc3RhcnRfbXVsdGl0aHJlYWRlZCgpIGFuZCBmcmllbmRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWVNURU1fVEhSRUFESU5HX0gKKyNkZWZpbmUgTExWTV9TWVNURU1fVEhSRUFESU5HX0gKKworbmFtZXNwYWNlIGxsdm0geworICAvLy8gbGx2bV9zdGFydF9tdWx0aXRocmVhZGVkIC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3RydWN0dXJlcyBuZWVkZWQgdG8KKyAgLy8vIG1ha2UgTExWTSBzYWZlIGZvciBtdWx0aXRocmVhZGluZy4gIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIKKyAgLy8vIG11bHRpdGhyZWFkZWQgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkLiAgTExWTSB3aWxsIHN0aWxsIGJlIG9wZXJhdGlvbmFsCisgIC8vLyBvbiAiZmFpbGVkIiByZXR1cm4sIGFuZCB3aWxsIHN0aWxsIGJlIHNhZmUgZm9yIGhvc3RpbmcgdGhyZWFkaW5nIAorICAvLy8gYXBwbGljYXRpb25zIGluIHRoZSBKSVQsIGJ1dCB3aWxsIG5vdCBiZSBzYWZlIGZvciBjb25jdXJyZW50IGNhbGxzIHRvIHRoZQorICAvLy8gTExWTSBBUElzLgorICAvLy8gVEhJUyBNVVNUIEVYRUNVVEUgSU4gSVNPTEFUSU9OIEZST00gQUxMIE9USEVSIExMVk0gQVBJIENBTExTLgorICBib29sIGxsdm1fc3RhcnRfbXVsdGl0aHJlYWRlZCgpOworICAKKyAgLy8vIGxsdm1fc3RvcF9tdWx0aXRocmVhZGVkIC0gRGVhbGxvY2F0ZSBzdHJ1Y3R1cmVzIG5lY2Vzc2FyeSB0byBtYWtlIExMVk0KKyAgLy8vIHNhZmUgZm9yIG11bHRpdGhyZWFkaW5nLgorICAvLy8gVEhJUyBNVVNUIEVYRUNVVEUgSU4gSVNPTEFUSU9OIEZST00gQUxMIE9USEVSIExMVk0gQVBJIENBTExTLgorICB2b2lkIGxsdm1fc3RvcF9tdWx0aXRocmVhZGVkKCk7CisgIAorICAvLy8gbGx2bV9pc19tdWx0aXRocmVhZGVkIC0gQ2hlY2sgd2hldGhlciBMTFZNIGlzIGV4ZWN1dGluZyBpbiB0aHJlYWQtc2FmZQorICAvLy8gbW9kZSBvciBub3QuCisgIGJvb2wgbGx2bV9pc19tdWx0aXRocmVhZGVkKCk7CisgIAorICAvLy8gYWNxdWlyZV9nbG9iYWxfbG9jayAtIEFjcXVpcmUgdGhlIGdsb2JhbCBsb2NrLiAgVGhpcyBpcyBhIG5vLW9wIGlmIGNhbGxlZAorICAvLy8gYmVmb3JlIGxsdm1fc3RhcnRfbXVsdGl0aHJlYWRlZCgpLgorICB2b2lkIGxsdm1fYWNxdWlyZV9nbG9iYWxfbG9jaygpOworICAKKyAgLy8vIHJlbGVhc2VfZ2xvYmFsX2xvY2sgLSBSZWxlYXNlIHRoZSBnbG9iYWwgbG9jay4gIFRoaXMgaXMgYSBuby1vcCBpZiBjYWxsZWQKKyAgLy8vIGJlZm9yZSBsbHZtX3N0YXJ0X211bHRpdGhyZWFkZWQoKS4KKyAgdm9pZCBsbHZtX3JlbGVhc2VfZ2xvYmFsX2xvY2soKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1RpbWVWYWx1ZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9UaW1lVmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODI2NDdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1N5c3RlbS9UaW1lVmFsdWUuaApAQCAtMCwwICsxLDM4MiBAQAorLy89PT0tLSBUaW1lVmFsdWUuaCAtIERlY2xhcmUgT1MgVGltZVZhbHVlIENvbmNlcHQgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBUaW1lVmFsdWUgY29uY2VwdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaWZuZGVmIExMVk1fU1lTVEVNX1RJTUVWQUxVRV9ICisjZGVmaW5lIExMVk1fU1lTVEVNX1RJTUVWQUxVRV9ICisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworICAvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHdoZXJlIGEgcHJlY2lzZSBmaXhlZCBwb2ludCBpbiB0aW1lIGlzIHJlcXVpcmVkLiBUaGUKKyAgLy8vIHJhbmdlIG9mIFRpbWVWYWx1ZSBzcGFucyBtYW55IGh1bmRyZWRzIG9mIGJpbGxpb25zIG9mIHllYXJzIGJvdGggcGFzdCBhbmQKKyAgLy8vIHByZXNlbnQuICBUaGUgcHJlY2lzaW9uIG9mIFRpbWVWYWx1ZSBpcyB0byB0aGUgbmFub3NlY29uZC4gSG93ZXZlciwgdGhlCisgIC8vLyBhY3R1YWwgcHJlY2lzaW9uIG9mIGl0cyB2YWx1ZXMgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSByZXNvbHV0aW9uIG9mCisgIC8vLyB0aGUgc3lzdGVtIGNsb2NrLiBUaGUgVGltZVZhbHVlIGNsYXNzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBzZXZlcmFsCisgIC8vLyBvdGhlciBsaWIvU3lzdGVtIGludGVyZmFjZXMgdG8gc3BlY2lmeSB0aGUgdGltZSBhdCB3aGljaCBhIGNhbGwgc2hvdWxkCisgIC8vLyB0aW1lb3V0LCBldGMuCisgIC8vLyBAc2luY2UgMS40CisgIC8vLyBAYnJpZWYgUHJvdmlkZXMgYW4gYWJzdHJhY3Rpb24gZm9yIGEgZml4ZWQgcG9pbnQgaW4gdGltZS4KKyAgY2xhc3MgVGltZVZhbHVlIHsKKworICAvLy8gQG5hbWUgQ29uc3RhbnRzCisgIC8vLyBAeworICBwdWJsaWM6CisKKyAgICAvLy8gQSBjb25zdGFudCBUaW1lVmFsdWUgcmVwcmVzZW50aW5nIHRoZSBzbWFsbGVzdCB0aW1lCisgICAgLy8vIHZhbHVlIHBlcm1pc3NhYmxlIGJ5IHRoZSBjbGFzcy4gTWluVGltZSBpcyBzb21lIHBvaW50CisgICAgLy8vIGluIHRoZSBkaXN0YW50IHBhc3QsIGFib3V0IDMwMCBiaWxsaW9uIHllYXJzIEJDRS4KKyAgICAvLy8gQGJyaWVmIFRoZSBzbWFsbGVzdCBwb3NzaWJsZSB0aW1lIHZhbHVlLgorICAgIHN0YXRpYyBjb25zdCBUaW1lVmFsdWUgTWluVGltZTsKKworICAgIC8vLyBBIGNvbnN0YW50IFRpbWVWYWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhcmdlc3QgdGltZQorICAgIC8vLyB2YWx1ZSBwZXJtaXNzYWJsZSBieSB0aGUgY2xhc3MuIE1heFRpbWUgaXMgc29tZSBwb2ludAorICAgIC8vLyBpbiB0aGUgZGlzdGFudCBmdXR1cmUsIGFib3V0IDMwMCBiaWxsaW9uIHllYXJzIEFELgorICAgIC8vLyBAYnJpZWYgVGhlIGxhcmdlc3QgcG9zc2libGUgdGltZSB2YWx1ZS4KKyAgICBzdGF0aWMgY29uc3QgVGltZVZhbHVlIE1heFRpbWU7CisKKyAgICAvLy8gQSBjb25zdGFudCBUaW1lVmFsdWUgcmVwcmVzZW50aW5nIHRoZSBiYXNlIHRpbWUsCisgICAgLy8vIG9yIHplcm8gdGltZSBvZiAwMDowMDowMCAobWlkbmlnaHQpIEphbnVhcnkgMXN0LCAyMDAwLgorICAgIC8vLyBAYnJpZWYgMDA6MDA6MDAgSmFuIDEsIDIwMDAgVVRDLgorICAgIHN0YXRpYyBjb25zdCBUaW1lVmFsdWUgWmVyb1RpbWU7CisKKyAgICAvLy8gQSBjb25zdGFudCBUaW1lVmFsdWUgZm9yIHRoZSBQb3NpeCBiYXNlIHRpbWUgd2hpY2ggaXMKKyAgICAvLy8gMDA6MDA6MDAgKG1pZG5pZ2h0KSBKYW51YXJ5IDFzdCwgMTk3MC4KKyAgICAvLy8gQGJyaWVmIDAwOjAwOjAwIEphbiAxLCAxOTcwIFVUQy4KKyAgICBzdGF0aWMgY29uc3QgVGltZVZhbHVlIFBvc2l4WmVyb1RpbWU7CisKKyAgICAvLy8gQSBjb25zdGFudCBUaW1lVmFsdWUgZm9yIHRoZSBXaW4zMiBiYXNlIHRpbWUgd2hpY2ggaXMKKyAgICAvLy8gMDA6MDA6MDAgKG1pZG5pZ2h0KSBKYW51YXJ5IDFzdCwgMTYwMS4KKyAgICAvLy8gQGJyaWVmIDAwOjAwOjAwIEphbiAxLCAxNjAxIFVUQy4KKyAgICBzdGF0aWMgY29uc3QgVGltZVZhbHVlIFdpbjMyWmVyb1RpbWU7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBUeXBlcworICAvLy8gQHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgaW50NjRfdCBTZWNvbmRzVHlwZTsgICAgLy8vPCBUeXBlIHVzZWQgZm9yIHJlcHJlc2VudGluZyBzZWNvbmRzLgorICAgIHR5cGVkZWYgaW50MzJfdCBOYW5vU2Vjb25kc1R5cGU7Ly8vPCBUeXBlIHVzZWQgZm9yIHJlcHJlc2VudGluZyBuYW5vc2Vjb25kcy4KKworICAgIGVudW0gVGltZUNvbnZlcnNpb25zIHsKKyAgICAgIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQgPSAxMDAwMDAwMDAwLCAgLy8vPCBPbmUgQmlsbGlvbgorICAgICAgTUlDUk9TRUNPTkRTX1BFUl9TRUNPTkQgPSAxMDAwMDAwLCAgICAvLy88IE9uZSBNaWxsaW9uCisgICAgICBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCA9IDEwMDAsICAgICAgIC8vLzwgT25lIFRob3VzYW5kCisgICAgICBOQU5PU0VDT05EU19QRVJfTUlDUk9TRUNPTkQgPSAxMDAwLCAgIC8vLzwgT25lIFRob3VzYW5kCisgICAgICBOQU5PU0VDT05EU19QRVJfTUlMTElTRUNPTkQgPSAxMDAwMDAwLC8vLzwgT25lIE1pbGxpb24KKyAgICAgIE5BTk9TRUNPTkRTX1BFUl9QT1NJWF9USUNLID0gMTAwLCAgICAgLy8vPCBQb3NpeCB0aWNrIGlzIDEwMCBIeiAoMTBtcykKKyAgICAgIE5BTk9TRUNPTkRTX1BFUl9XSU4zMl9USUNLID0gMTAwICAgICAgLy8vPCBXaW4zMiB0aWNrIGlzIDEwMCBIeiAoMTBtcykKKyAgICB9OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgIC8vLyBAeworICBwdWJsaWM6CisgICAgLy8vIENhbGxlciBwcm92aWRlcyB0aGUgZXhhY3QgdmFsdWUgaW4gc2Vjb25kcyBhbmQgbmFub3NlY29uZHMuIFRoZQorICAgIC8vLyBccCBuYW5vcyBhcmd1bWVudCBkZWZhdWx0cyB0byB6ZXJvIGZvciBjb252ZW5pZW5jZS4KKyAgICAvLy8gQGJyaWVmIEV4cGxpY2l0IGNvbnN0cnVjdG9yCisgICAgZXhwbGljaXQgVGltZVZhbHVlIChTZWNvbmRzVHlwZSBzZWNvbmRzLCBOYW5vU2Vjb25kc1R5cGUgbmFub3MgPSAwKQorICAgICAgOiBzZWNvbmRzXyggc2Vjb25kcyApLCBuYW5vc18oIG5hbm9zICkgeyB0aGlzLT5ub3JtYWxpemUoKTsgfQorCisgICAgLy8vIENhbGxlciBwcm92aWRlcyB0aGUgZXhhY3QgdmFsdWUgYXMgYSBkb3VibGUgaW4gc2Vjb25kcyB3aXRoIHRoZQorICAgIC8vLyBmcmFjdGlvbmFsIHBhcnQgcmVwcmVzZW50aW5nIG5hbm9zZWNvbmRzLgorICAgIC8vLyBAYnJpZWYgRG91YmxlIENvbnN0cnVjdG9yLgorICAgIGV4cGxpY2l0IFRpbWVWYWx1ZSggZG91YmxlIG5ld190aW1lICkKKyAgICAgIDogc2Vjb25kc18oIDAgKSAsIG5hbm9zXyAoIDAgKSB7CisgICAgICBTZWNvbmRzVHlwZSBpbnRlZ2VyX3BhcnQgPSBzdGF0aWNfY2FzdDxTZWNvbmRzVHlwZT4oIG5ld190aW1lICk7CisgICAgICBzZWNvbmRzXyA9IGludGVnZXJfcGFydDsKKyAgICAgIG5hbm9zXyA9IHN0YXRpY19jYXN0PE5hbm9TZWNvbmRzVHlwZT4oIChuZXdfdGltZSAtCisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGludGVnZXJfcGFydCkpICogTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCApOworICAgICAgdGhpcy0+bm9ybWFsaXplKCk7CisgICAgfQorCisgICAgLy8vIFRoaXMgaXMgYSBzdGF0aWMgY29uc3RydWN0b3IgdGhhdCByZXR1cm5zIGEgVGltZVZhbHVlIHRoYXQgcmVwcmVzZW50cworICAgIC8vLyB0aGUgY3VycmVudCB0aW1lLgorICAgIC8vLyBAYnJpZWYgQ3JlYXRlcyBhIFRpbWVWYWx1ZSB3aXRoIHRoZSBjdXJyZW50IHRpbWUgKFVUQykuCisgICAgc3RhdGljIFRpbWVWYWx1ZSBub3coKTsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIE9wZXJhdG9ycworICAvLy8gQHsKKyAgcHVibGljOgorICAgIC8vLyBBZGQgXHAgdGhhdCB0byBccCB0aGlzLgorICAgIC8vLyBAcmV0dXJucyB0aGlzCisgICAgLy8vIEBicmllZiBJbmNyZW1lbnRpbmcgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICBUaW1lVmFsdWUmIG9wZXJhdG9yICs9IChjb25zdCBUaW1lVmFsdWUmIHRoYXQgKSB7CisgICAgICB0aGlzLT5zZWNvbmRzXyArPSB0aGF0LnNlY29uZHNfICA7CisgICAgICB0aGlzLT5uYW5vc18gKz0gdGhhdC5uYW5vc18gOworICAgICAgdGhpcy0+bm9ybWFsaXplKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIFN1YnRyYWN0IFxwIHRoYXQgZnJvbSBccCB0aGlzLgorICAgIC8vLyBAcmV0dXJucyB0aGlzCisgICAgLy8vIEBicmllZiBEZWNyZW1lbnRpbmcgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICBUaW1lVmFsdWUmIG9wZXJhdG9yIC09IChjb25zdCBUaW1lVmFsdWUgJnRoYXQgKSB7CisgICAgICB0aGlzLT5zZWNvbmRzXyAtPSB0aGF0LnNlY29uZHNfIDsKKyAgICAgIHRoaXMtPm5hbm9zXyAtPSB0aGF0Lm5hbm9zXyA7CisgICAgICB0aGlzLT5ub3JtYWxpemUoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gRGV0ZXJtaW5lIGlmIFxwIHRoaXMgaXMgbGVzcyB0aGFuIFxwIHRoYXQuCisgICAgLy8vIEByZXR1cm5zIFRydWUgaWZmICp0aGlzIDwgdGhhdC4KKyAgICAvLy8gQGJyaWVmIFRydWUgaWYgdGhpcyA8IHRoYXQuCisgICAgaW50IG9wZXJhdG9yIDwgKGNvbnN0IFRpbWVWYWx1ZSAmdGhhdCkgY29uc3QgeyByZXR1cm4gdGhhdCA+ICp0aGlzOyB9CisKKyAgICAvLy8gRGV0ZXJtaW5lIGlmIFxwIHRoaXMgaXMgZ3JlYXRoZXIgdGhhbiBccCB0aGF0LgorICAgIC8vLyBAcmV0dXJucyBUcnVlIGlmZiAqdGhpcyA+IHRoYXQuCisgICAgLy8vIEBicmllZiBUcnVlIGlmIHRoaXMgPiB0aGF0LgorICAgIGludCBvcGVyYXRvciA+IChjb25zdCBUaW1lVmFsdWUgJnRoYXQpIGNvbnN0IHsKKyAgICAgIGlmICggdGhpcy0+c2Vjb25kc18gPiB0aGF0LnNlY29uZHNfICkgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgfSBlbHNlIGlmICggdGhpcy0+c2Vjb25kc18gPT0gdGhhdC5zZWNvbmRzXyApIHsKKyAgICAgICAgICBpZiAoIHRoaXMtPm5hbm9zXyA+IHRoYXQubmFub3NfICkgcmV0dXJuIDE7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLy8gRGV0ZXJtaW5lIGlmIFxwIHRoaXMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFxwIHRoYXQuCisgICAgLy8vIEByZXR1cm5zIFRydWUgaWZmICp0aGlzIDw9IHRoYXQuCisgICAgLy8vIEBicmllZiBUcnVlIGlmIHRoaXMgPD0gdGhhdC4KKyAgICBpbnQgb3BlcmF0b3IgPD0gKGNvbnN0IFRpbWVWYWx1ZSAmdGhhdCkgY29uc3QgeyByZXR1cm4gdGhhdCA+PSAqdGhpczsgfQorCisgICAgLy8vIERldGVybWluZSBpZiBccCB0aGlzIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBccCB0aGF0LgorICAgIC8vLyBAcmV0dXJucyBUcnVlIGlmZiAqdGhpcyA+PSB0aGF0LgorICAgIC8vLyBAYnJpZWYgVHJ1ZSBpZiB0aGlzID49IHRoYXQuCisgICAgaW50IG9wZXJhdG9yID49IChjb25zdCBUaW1lVmFsdWUgJnRoYXQpIGNvbnN0IHsKKyAgICAgIGlmICggdGhpcy0+c2Vjb25kc18gPiB0aGF0LnNlY29uZHNfICkgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgfSBlbHNlIGlmICggdGhpcy0+c2Vjb25kc18gPT0gdGhhdC5zZWNvbmRzXyApIHsKKyAgICAgICAgICBpZiAoIHRoaXMtPm5hbm9zXyA+PSB0aGF0Lm5hbm9zXyApIHJldHVybiAxOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8vIERldGVybWluZXMgaWYgdHdvIFRpbWVWYWx1ZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgc2FtZSBtb21lbnQgaW4gdGltZS4KKyAgICAvLy8gQGJyaWVmIFRydWUgaWZmICp0aGlzID09IHRoYXQuCisgICAgLy8vIEBicmllZiBUcnVlIGlmIHRoaXMgPT0gdGhhdC4KKyAgICBpbnQgb3BlcmF0b3IgPT0gKGNvbnN0IFRpbWVWYWx1ZSAmdGhhdCkgY29uc3QgeworICAgICAgcmV0dXJuICh0aGlzLT5zZWNvbmRzXyA9PSB0aGF0LnNlY29uZHNfKSAmJgorICAgICAgICAgICAgICh0aGlzLT5uYW5vc18gPT0gdGhhdC5uYW5vc18pOworICAgIH0KKworICAgIC8vLyBEZXRlcm1pbmVzIGlmIHR3byBUaW1lVmFsdWUgb2JqZWN0cyByZXByZXNlbnQgdGltZXMgdGhhdCBhcmUgbm90IHRoZQorICAgIC8vLyBzYW1lLgorICAgIC8vLyBAcmV0dXJuIFRydWUgaWZmICp0aGlzICE9IHRoYXQuCisgICAgLy8vIEBicmllZiBUcnVlIGlmIHRoaXMgIT0gdGhhdC4KKyAgICBpbnQgb3BlcmF0b3IgIT0gKGNvbnN0IFRpbWVWYWx1ZSAmdGhhdCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSB0aGF0KTsgfQorCisgICAgLy8vIEFkZHMgdHdvIFRpbWVWYWx1ZSBvYmplY3RzIHRvZ2V0aGVyLgorICAgIC8vLyBAcmV0dXJucyBUaGUgc3VtIG9mIHRoZSB0d28gb3BlcmFuZHMgYXMgYSBuZXcgVGltZVZhbHVlCisgICAgLy8vIEBicmllZiBBZGRpdGlvbiBvcGVyYXRvci4KKyAgICBmcmllbmQgVGltZVZhbHVlIG9wZXJhdG9yICsgKGNvbnN0IFRpbWVWYWx1ZSAmdHYxLCBjb25zdCBUaW1lVmFsdWUgJnR2Mik7CisKKyAgICAvLy8gU3VidHJhY3RzIHR3byBUaW1lVmFsdWUgb2JqZWN0cy4KKyAgICAvLy8gQHJldHVybnMgVGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHR3byBvcGVyYW5kcyBhcyBhIG5ldyBUaW1lVmFsdWUKKyAgICAvLy8gQGJyaWVmIFN1YnRyYWN0aW9uIG9wZXJhdG9yLgorICAgIGZyaWVuZCBUaW1lVmFsdWUgb3BlcmF0b3IgLSAoY29uc3QgVGltZVZhbHVlICZ0djEsIGNvbnN0IFRpbWVWYWx1ZSAmdHYyKTsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKyAgcHVibGljOgorCisgICAgLy8vIFJldHVybnMgb25seSB0aGUgc2Vjb25kcyBjb21wb25lbnQgb2YgdGhlIFRpbWVWYWx1ZS4gVGhlIG5hbm9zZWNvbmRzCisgICAgLy8vIHBvcnRpb24gaXMgaWdub3JlZC4gTm8gcm91bmRpbmcgaXMgcGVyZm9ybWVkLgorICAgIC8vLyBAYnJpZWYgUmV0cmlldmUgdGhlIHNlY29uZHMgY29tcG9uZW50CisgICAgU2Vjb25kc1R5cGUgc2Vjb25kcygpIGNvbnN0IHsgcmV0dXJuIHNlY29uZHNfOyB9CisKKyAgICAvLy8gUmV0dXJucyBvbmx5IHRoZSBuYW5vc2Vjb25kcyBjb21wb25lbnQgb2YgdGhlIFRpbWVWYWx1ZS4gVGhlIHNlY29uZHMKKyAgICAvLy8gcG9ydGlvbiBpcyBpZ25vcmVkLgorICAgIC8vLyBAYnJpZWYgUmV0cmlldmUgdGhlIG5hbm9zZWNvbmRzIGNvbXBvbmVudC4KKyAgICBOYW5vU2Vjb25kc1R5cGUgbmFub3NlY29uZHMoKSBjb25zdCB7IHJldHVybiBuYW5vc187IH0KKworICAgIC8vLyBSZXR1cm5zIG9ubHkgdGhlIGZyYWN0aW9uYWwgcG9ydGlvbiBvZiB0aGUgVGltZVZhbHVlIHJvdW5kZWQgZG93biB0byB0aGUKKyAgICAvLy8gbmVhcmVzdCBtaWNyb3NlY29uZCAoZGl2aWRlIGJ5IG9uZSB0aG91c2FuZCkuCisgICAgLy8vIEBicmllZiBSZXRyaWV2ZSB0aGUgZnJhY3Rpb25hbCBwYXJ0IGFzIG1pY3Jvc2Vjb25kczsKKyAgICB1aW50MzJfdCBtaWNyb3NlY29uZHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmFub3NfIC8gTkFOT1NFQ09ORFNfUEVSX01JQ1JPU0VDT05EOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG9ubHkgdGhlIGZyYWN0aW9uYWwgcG9ydGlvbiBvZiB0aGUgVGltZVZhbHVlIHJvdW5kZWQgZG93biB0byB0aGUKKyAgICAvLy8gbmVhcmVzdCBtaWxsaXNlY29uZCAoZGl2aWRlIGJ5IG9uZSBtaWxsaW9uKS4KKyAgICAvLy8gQGJyaWVmIFJldHJpZXZlIHRoZSBmcmFjdGlvbmFsIHBhcnQgYXMgbWlsbGlzZWNvbmRzOworICAgIHVpbnQzMl90IG1pbGxpc2Vjb25kcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuYW5vc18gLyBOQU5PU0VDT05EU19QRVJfTUlMTElTRUNPTkQ7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIFRpbWVWYWx1ZSBhcyBhIG51bWJlciBvZiBtaWNyb3NlY29uZHMuIE5vdGUgdGhhdCB0aGUgdmFsdWUKKyAgICAvLy8gcmV0dXJuZWQgY2FuIG92ZXJmbG93IGJlY2F1c2UgdGhlIHJhbmdlIG9mIGEgdWludDY0X3QgaXMgc21hbGxlciB0aGFuCisgICAgLy8vIHRoZSByYW5nZSBvZiBhIFRpbWVWYWx1ZS4gTmV2ZXJ0aGVsZXNzLCB0aGlzIGlzIHVzZWZ1bCBvbiBzb21lIG9wZXJhdGluZworICAgIC8vLyBzeXN0ZW1zIGFuZCBpcyB0aGVyZWZvcmUgcHJvdmlkZWQuCisgICAgLy8vIEBicmllZiBDb252ZXJ0IHRvIGEgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyAoY2FuIG92ZXJmbG93KQorICAgIHVpbnQ2NF90IHVzZWMoKSBjb25zdCB7CisgICAgICByZXR1cm4gc2Vjb25kc18gKiBNSUNST1NFQ09ORFNfUEVSX1NFQ09ORCArCisgICAgICAgICAgICAgKCBuYW5vc18gLyBOQU5PU0VDT05EU19QRVJfTUlDUk9TRUNPTkQgKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgVGltZVZhbHVlIGFzIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gTm90ZSB0aGF0IHRoZSB2YWx1ZQorICAgIC8vLyByZXR1cm5lZCBjYW4gb3ZlcmZsb3cgYmVjYXVzZSB0aGUgcmFuZ2Ugb2YgYSB1aW50NjRfdCBpcyBzbWFsbGVyIHRoYW4KKyAgICAvLy8gdGhlIHJhbmdlIG9mIGEgVGltZVZhbHVlLiBOZXZlcnRoZWxlc3MsIHRoaXMgaXMgdXNlZnVsIG9uIHNvbWUgb3BlcmF0aW5nCisgICAgLy8vIHN5c3RlbXMgYW5kIGlzIHRoZXJlZm9yZSBwcm92aWRlZC4KKyAgICAvLy8gQGJyaWVmIENvbnZlcnQgdG8gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIChjYW4gb3ZlcmZsb3cpCisgICAgdWludDY0X3QgbXNlYygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzZWNvbmRzXyAqIE1JTExJU0VDT05EU19QRVJfU0VDT05EICsKKyAgICAgICAgICAgICAoIG5hbm9zXyAvIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCApOworICAgIH0KKworICAgIC8vLyBDb252ZXJ0cyB0aGUgVGltZVZhbHVlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mICJ0aWNrcyIgZm9yCisgICAgLy8vIFBvc2l4LCBjb3JyZWN0aW5nIGZvciB0aGUgZGlmZmVyZW5jZSBpbiBQb3NpeCB6ZXJvIHRpbWUuCisgICAgLy8vIEBicmllZiBDb252ZXJ0IHRvIHVuaXggdGltZSAoMTAwIG5hbm9zZWNvbmRzIHNpbmNlIDEyOjAwOjAwYSBKYW4gMSwxOTcwKQorICAgIHVpbnQ2NF90IHRvUG9zaXhUaW1lKCkgY29uc3QgeworICAgICAgdWludDY0X3QgcmVzdWx0ID0gc2Vjb25kc18gLSBQb3NpeFplcm9UaW1lLnNlY29uZHNfOworICAgICAgcmVzdWx0ICs9IG5hbm9zXyAvIE5BTk9TRUNPTkRTX1BFUl9QT1NJWF9USUNLOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLy8gQ29udmVydHMgdGhlIFRpbWVWYWx1ZSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBzZWNvbmRzCisgICAgLy8vIHNpbmNlIHRoZSBlcG9jaCAoMDA6MDA6MDAgSmFuIDEsMTk3MCkuCisgICAgdWludDY0X3QgdG9FcG9jaFRpbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gc2Vjb25kc18gLSBQb3NpeFplcm9UaW1lLnNlY29uZHNfOworICAgIH0KKworICAgIC8vLyBDb252ZXJ0cyB0aGUgVGltZVZhbHVlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mICJ0aWNrcyIgZm9yCisgICAgLy8vIFdpbjMyIHBsYXRmb3JtcywgY29ycmVjdGluZyBmb3IgdGhlIGRpZmZlcmVuY2UgaW4gV2luMzIgemVybyB0aW1lLgorICAgIC8vLyBAYnJpZWYgQ29udmVydCB0byB3aW5kb3dzIHRpbWUgKHNlY29uZHMgc2luY2UgMTI6MDA6MDBhIEphbiAxLCAxNjAxKQorICAgIHVpbnQ2NF90IHRvV2luMzJUaW1lKCkgY29uc3QgeworICAgICAgdWludDY0X3QgcmVzdWx0ID0gc2Vjb25kc18gLSBXaW4zMlplcm9UaW1lLnNlY29uZHNfOworICAgICAgcmVzdWx0ICs9IG5hbm9zXyAvIE5BTk9TRUNPTkRTX1BFUl9XSU4zMl9USUNLOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLy8gUHJvdmlkZXMgdGhlIHNlY29uZHMgYW5kIG5hbm9zZWNvbmRzIGFzIHJlc3VsdHMgaW4gaXRzIGFyZ3VtZW50cyBhZnRlcgorICAgIC8vLyBjb3JyZWN0aW9uIGZvciB0aGUgUG9zaXggemVybyB0aW1lLgorICAgIC8vLyBAYnJpZWYgQ29udmVydCB0byB0aW1lc3BlYyB0aW1lIChhbGEgUE9TSVguMWIpCisgICAgdm9pZCBnZXRUaW1lc3BlY1RpbWUoIHVpbnQ2NF90JiBzZWNvbmRzLCB1aW50MzJfdCYgbmFub3MgKSBjb25zdCB7CisgICAgICBzZWNvbmRzID0gc2Vjb25kc18gLSBQb3NpeFplcm9UaW1lLnNlY29uZHNfOworICAgICAgbmFub3MgPSBuYW5vc187CisgICAgfQorCisgICAgLy8vIFByb3ZpZGVzIGNvbnZlcnNpb24gb2YgdGhlIFRpbWVWYWx1ZSBpbnRvIGEgcmVhZGFibGUgdGltZSAmIGRhdGUuCisgICAgLy8vIEByZXR1cm5zIHN0ZDo6c3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJlYWRhYmxlIHRpbWUgdmFsdWUKKyAgICAvLy8gQGJyaWVmIENvbnZlcnQgdGltZSB0byBhIHN0cmluZy4KKyAgICBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIE11dGF0b3JzCisgIC8vLyBAeworICBwdWJsaWM6CisgICAgLy8vIFRoZSBzZWNvbmRzIGNvbXBvbmVudCBvZiB0aGUgVGltZVZhbHVlIGlzIHNldCB0byBccCBzZWMgd2l0aG91dAorICAgIC8vLyBtb2RpZnlpbmcgdGhlIG5hbm9zZWNvbmRzIHBhcnQuICBUaGlzIGlzIHVzZWZ1bCBmb3Igd2hvbGUgc2Vjb25kCisgICAgLy8vIGFyaXRobWV0aWMuCisgICAgLy8vIEBicmllZiBTZXQgdGhlIHNlY29uZHMgY29tcG9uZW50LgorICAgIHZvaWQgc2Vjb25kcyAoU2Vjb25kc1R5cGUgc2VjICkgeworICAgICAgdGhpcy0+c2Vjb25kc18gPSBzZWM7CisgICAgICB0aGlzLT5ub3JtYWxpemUoKTsKKyAgICB9CisKKyAgICAvLy8gVGhlIG5hbm9zZWNvbmRzIGNvbXBvbmVudCBvZiB0aGUgVGltZVZhbHVlIGlzIHNldCB0byBccCBuYW5vcyB3aXRob3V0CisgICAgLy8vIG1vZGlmeWluZyB0aGUgc2Vjb25kcyBwYXJ0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYmFzaWMgY29tcHV0YXRpb25zCisgICAgLy8vIGludm9sdmluZyBqdXN0IHRoZSBuYW5vc2Vjb25kcyBwb3J0aW9uLiBOb3RlIHRoYXQgdGhlIFRpbWVWYWx1ZSB3aWxsIGJlCisgICAgLy8vIG5vcm1hbGl6ZWQgYWZ0ZXIgdGhpcyBjYWxsIHNvIHRoYXQgdGhlIGZyYWN0aW9uYWwgKG5hbm9zZWNvbmRzKSBwb3J0aW9uCisgICAgLy8vIHdpbGwgaGF2ZSB0aGUgc21hbGxlc3QgZXF1aXZhbGVudCB2YWx1ZS4KKyAgICAvLy8gQGJyaWVmIFNldCB0aGUgbmFub3NlY29uZHMgY29tcG9uZW50IHVzaW5nIGEgbnVtYmVyIG9mIG5hbm9zZWNvbmRzLgorICAgIHZvaWQgbmFub3NlY29uZHMgKCBOYW5vU2Vjb25kc1R5cGUgbmFub3MgKSB7CisgICAgICB0aGlzLT5uYW5vc18gPSBuYW5vczsKKyAgICAgIHRoaXMtPm5vcm1hbGl6ZSgpOworICAgIH0KKworICAgIC8vLyBUaGUgc2Vjb25kcyBjb21wb25lbnQgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgLy8vIEBicmllZiBTZXQgdGhlIG5hbm9zZWNvbmRzIGNvbXBvbmVudCB1c2luZyBhIG51bWJlciBvZiBtaWNyb3NlY29uZHMuCisgICAgdm9pZCBtaWNyb3NlY29uZHMgKCBpbnQzMl90IG1pY3JvcyApIHsKKyAgICAgIHRoaXMtPm5hbm9zXyA9IG1pY3JvcyAqIE5BTk9TRUNPTkRTX1BFUl9NSUNST1NFQ09ORDsKKyAgICAgIHRoaXMtPm5vcm1hbGl6ZSgpOworICAgIH0KKworICAgIC8vLyBUaGUgc2Vjb25kcyBjb21wb25lbnQgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgLy8vIEBicmllZiBTZXQgdGhlIG5hbm9zZWNvbmRzIGNvbXBvbmVudCB1c2luZyBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCisgICAgdm9pZCBtaWxsaXNlY29uZHMgKCBpbnQzMl90IG1pbGxpcyApIHsKKyAgICAgIHRoaXMtPm5hbm9zXyA9IG1pbGxpcyAqIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORDsKKyAgICAgIHRoaXMtPm5vcm1hbGl6ZSgpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgQ29udmVydHMgZnJvbSBtaWNyb3NlY29uZCBmb3JtYXQgdG8gVGltZVZhbHVlIGZvcm1hdAorICAgIHZvaWQgdXNlYyggaW50NjRfdCBtaWNyb3NlY29uZHMgKSB7CisgICAgICB0aGlzLT5zZWNvbmRzXyA9IG1pY3Jvc2Vjb25kcyAvIE1JQ1JPU0VDT05EU19QRVJfU0VDT05EOworICAgICAgdGhpcy0+bmFub3NfID0gTmFub1NlY29uZHNUeXBlKG1pY3Jvc2Vjb25kcyAlIE1JQ1JPU0VDT05EU19QRVJfU0VDT05EKSAqCisgICAgICAgIE5BTk9TRUNPTkRTX1BFUl9NSUNST1NFQ09ORDsKKyAgICAgIHRoaXMtPm5vcm1hbGl6ZSgpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgQ29udmVydHMgZnJvbSBtaWxsaXNlY29uZCBmb3JtYXQgdG8gVGltZVZhbHVlIGZvcm1hdAorICAgIHZvaWQgbXNlYyggaW50NjRfdCBtaWxsaXNlY29uZHMgKSB7CisgICAgICB0aGlzLT5zZWNvbmRzXyA9IG1pbGxpc2Vjb25kcyAvIE1JTExJU0VDT05EU19QRVJfU0VDT05EOworICAgICAgdGhpcy0+bmFub3NfID0gTmFub1NlY29uZHNUeXBlKG1pbGxpc2Vjb25kcyAlIE1JTExJU0VDT05EU19QRVJfU0VDT05EKSAqCisgICAgICAgIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORDsKKyAgICAgIHRoaXMtPm5vcm1hbGl6ZSgpOworICAgIH0KKworICAgIC8vLyBDb252ZXJ0cyB0aGUgXHAgc2Vjb25kcyBhcmd1bWVudCBmcm9tIFBvc2l4VGltZSB0byB0aGUgY29ycmVzcG9uZGluZworICAgIC8vLyBUaW1lVmFsdWUgYW5kIGFzc2lnbnMgdGhhdCB2YWx1ZSB0byBccCB0aGlzLgorICAgIC8vLyBAYnJpZWYgQ29udmVydCBzZWNvbmRzIGZvcm0gUG9zaXhUaW1lIHRvIFRpbWVWYWx1ZQorICAgIHZvaWQgZnJvbUVwb2NoVGltZSggU2Vjb25kc1R5cGUgc2Vjb25kcyApIHsKKyAgICAgIHNlY29uZHNfID0gc2Vjb25kcyArIFBvc2l4WmVyb1RpbWUuc2Vjb25kc187CisgICAgICBuYW5vc18gPSAwOworICAgICAgdGhpcy0+bm9ybWFsaXplKCk7CisgICAgfQorCisgICAgLy8vIENvbnZlcnRzIHRoZSBccCB3aW4zMlRpbWUgYXJndW1lbnQgZnJvbSBXaW5kb3dzIEZJTEVUSU1FIHRvIHRoZQorICAgIC8vLyBjb3JyZXNwb25kaW5nIFRpbWVWYWx1ZSBhbmQgYXNzaWducyB0aGF0IHZhbHVlIHRvIFxwIHRoaXMuCisgICAgLy8vIEBicmllZiBDb252ZXJ0IHNlY29uZHMgZm9ybSBXaW5kb3dzIEZJTEVUSU1FIHRvIFRpbWVWYWx1ZQorICAgIHZvaWQgZnJvbVdpbjMyVGltZSggdWludDY0X3Qgd2luMzJUaW1lICkgeworICAgICAgdGhpcy0+c2Vjb25kc18gPSB3aW4zMlRpbWUgLyAxMDAwMDAwMCArIFdpbjMyWmVyb1RpbWUuc2Vjb25kc187CisgICAgICB0aGlzLT5uYW5vc18gPSBOYW5vU2Vjb25kc1R5cGUod2luMzJUaW1lICAlIDEwMDAwMDAwKSAqIDEwMDsKKyAgICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBJbXBsZW1lbnRhdGlvbgorICAvLy8gQHsKKyAgcHJpdmF0ZToKKyAgICAvLy8gVGhpcyBjYXVzZXMgdGhlIHZhbHVlcyB0byBiZSByZXByZXNlbnRlZCBzbyB0aGF0IHRoZSBmcmFjdGlvbmFsCisgICAgLy8vIHBhcnQgaXMgbWluaW1pemVkLCBwb3NzaWJseSBpbmNyZW1lbnRpbmcgdGhlIHNlY29uZHMgcGFydC4KKyAgICAvLy8gQGJyaWVmIE5vcm1hbGl6ZSB0byBjYW5vbmljYWwgZm9ybS4KKyAgICB2b2lkIG5vcm1hbGl6ZSgpOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgRGF0YQorICAvLy8gQHsKKyAgcHJpdmF0ZToKKyAgICAvLy8gU3RvcmUgdGhlIHZhbHVlcyBhcyBhIDx0aW1ldmFsPi4KKyAgICBTZWNvbmRzVHlwZSAgICAgIHNlY29uZHNfOy8vLzwgU3RvcmVzIHRoZSBzZWNvbmRzIHBhcnQgb2YgdGhlIFRpbWVWYWwKKyAgICBOYW5vU2Vjb25kc1R5cGUgIG5hbm9zXzsgIC8vLzwgU3RvcmVzIHRoZSBuYW5vc2Vjb25kcyBwYXJ0IG9mIHRoZSBUaW1lVmFsCisgIC8vLyBAfQorCisgIH07CisKK2lubGluZSBUaW1lVmFsdWUgb3BlcmF0b3IgKyAoY29uc3QgVGltZVZhbHVlICZ0djEsIGNvbnN0IFRpbWVWYWx1ZSAmdHYyKSB7CisgIFRpbWVWYWx1ZSBzdW0gKHR2MS5zZWNvbmRzXyArIHR2Mi5zZWNvbmRzXywgdHYxLm5hbm9zXyArIHR2Mi5uYW5vc18pOworICBzdW0ubm9ybWFsaXplICgpOworICByZXR1cm4gc3VtOworfQorCitpbmxpbmUgVGltZVZhbHVlIG9wZXJhdG9yIC0gKGNvbnN0IFRpbWVWYWx1ZSAmdHYxLCBjb25zdCBUaW1lVmFsdWUgJnR2MikgeworICBUaW1lVmFsdWUgZGlmZmVyZW5jZSAodHYxLnNlY29uZHNfIC0gdHYyLnNlY29uZHNfLCB0djEubmFub3NfIC0gdHYyLm5hbm9zXyApOworICBkaWZmZXJlbmNlLm5vcm1hbGl6ZSAoKTsKKyAgcmV0dXJuIGRpZmZlcmVuY2U7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1ZhbGdyaW5kLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vU3lzdGVtL1ZhbGdyaW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjNzljMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9TeXN0ZW0vVmFsZ3JpbmQuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gbGx2bS9TeXN0ZW0vVmFsZ3JpbmQuaCAtIENvbW11bmljYXRpb24gd2l0aCBWYWxncmluZCAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1ldGhvZHMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhIHZhbGdyaW5kIGluc3RhbmNlIHRoaXMgcHJvZ3JhbSBpcyBydW5uaW5nCisvLyB1bmRlci4gIFRoZXNlIGFyZSBhbGwgbm8tb3BzIHVubGVzcyBMTFZNIHdhcyBjb25maWd1cmVkIG9uIGEgc3lzdGVtIHdpdGggdGhlCisvLyB2YWxncmluZCBoZWFkZXJzIGluc3RhbGxlZCBhbmQgdmFsZ3JpbmQgaXMgY29udHJvbGxpbmcgdGhpcyBwcm9jZXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TWVNURU1fVkFMR1JJTkRfSAorI2RlZmluZSBMTFZNX1NZU1RFTV9WQUxHUklORF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisgIC8vIFRydWUgaWYgVmFsZ3JpbmQgaXMgY29udHJvbGxpbmcgdGhpcyBwcm9jZXNzLgorICBib29sIFJ1bm5pbmdPblZhbGdyaW5kKCk7CisKKyAgLy8gRGlzY2FyZCB2YWxncmluZCdzIHRyYW5zbGF0aW9uIG9mIGNvZGUgaW4gdGhlIHJhbmdlIFtBZGRyIC4uIEFkZHIgKyBMZW4pLgorICAvLyBPdGhlcndpc2UgdmFsZ3JpbmQgbWF5IGNvbnRpbnVlIHRvIGV4ZWN1dGUgdGhlIG9sZCB2ZXJzaW9uIG9mIHRoZSBjb2RlLgorICB2b2lkIFZhbGdyaW5kRGlzY2FyZFRyYW5zbGF0aW9ucyhjb25zdCB2b2lkICpBZGRyLCBzaXplX3QgTGVuKTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L01hbmdsZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvTWFuZ2xlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjM1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L01hbmdsZXIuaApAQCAtMCwwICsxLDgyIEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L01hbmdsZXIuaCAtIFNlbGYtY29udGFpbmVkIG5hbWUgbWFuZ2xlciAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFVuaWZpZWQgbmFtZSBtYW5nbGVyIGZvciB2YXJpb3VzIGJhY2tlbmRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01BTkdMRVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTUFOR0xFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgVHdpbmU7CitjbGFzcyBWYWx1ZTsKK2NsYXNzIEdsb2JhbFZhbHVlOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsgCitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIFRhcmdldERhdGE7CisKK2NsYXNzIE1hbmdsZXIgeworcHVibGljOgorICBlbnVtIE1hbmdsZXJQcmVmaXhUeSB7CisgICAgRGVmYXVsdCwgICAgICAgICAgICAgICAvLy88IEVtaXQgZGVmYXVsdCBzdHJpbmcgYmVmb3JlIGVhY2ggc3ltYm9sLgorICAgIFByaXZhdGUsICAgICAgICAgICAgICAgLy8vPCBFbWl0ICJwcml2YXRlIiBwcmVmaXggYmVmb3JlIGVhY2ggc3ltYm9sLgorICAgIExpbmtlclByaXZhdGUgICAgICAgICAgLy8vPCBFbWl0ICJsaW5rZXIgcHJpdmF0ZSIgcHJlZml4IGJlZm9yZSBlYWNoIHN5bWJvbC4KKyAgfTsKKworcHJpdmF0ZToKKyAgTUNDb250ZXh0ICZDb250ZXh0OworICBjb25zdCBUYXJnZXREYXRhICZURDsKKworICAvLy8gQW5vbkdsb2JhbElEcyAtIFdlIG5lZWQgdG8gZ2l2ZSBnbG9iYWwgdmFsdWVzIHRoZSBzYW1lIG5hbWUgZXZlcnkgdGltZQorICAvLy8gdGhleSBhcmUgbWFuZ2xlZC4gIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciB3ZSBnaXZlIHRvIGFub255bW91cworICAvLy8gb25lcy4KKyAgLy8vCisgIERlbnNlTWFwPGNvbnN0IEdsb2JhbFZhbHVlKiwgdW5zaWduZWQ+IEFub25HbG9iYWxJRHM7CisKKyAgLy8vIE5leHRBbm9uR2xvYmFsSUQgLSBUaGlzIHNpbXBsZSBjb3VudGVyIGlzIHVzZWQgdG8gdW5pcXVlIHZhbHVlIG5hbWVzLgorICAvLy8KKyAgdW5zaWduZWQgTmV4dEFub25HbG9iYWxJRDsKKworcHVibGljOgorICBNYW5nbGVyKE1DQ29udGV4dCAmY29udGV4dCwgY29uc3QgVGFyZ2V0RGF0YSAmdGQpCisgICAgOiBDb250ZXh0KGNvbnRleHQpLCBURCh0ZCksIE5leHRBbm9uR2xvYmFsSUQoMSkge30KKworICAvLy8gZ2V0U3ltYm9sIC0gUmV0dXJuIHRoZSBNQ1N5bWJvbCBmb3IgdGhlIHNwZWNpZmllZCBnbG9iYWwgdmFsdWUuICBUaGlzCisgIC8vLyBzeW1ib2wgaXMgdGhlIG1haW4gbGFiZWwgdGhhdCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZ2xvYmFsLgorICBNQ1N5bWJvbCAqZ2V0U3ltYm9sKGNvbnN0IEdsb2JhbFZhbHVlICpHVik7CisKKyAgCisgIC8vLyBnZXROYW1lV2l0aFByZWZpeCAtIEZpbGwgT3V0TmFtZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBhcHByb3ByaWF0ZSBwcmVmaXgKKyAgLy8vIGFuZCB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZSdzIG5hbWUuICBJZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGRvZXNuJ3QKKyAgLy8vIGhhdmUgYSBuYW1lLCB0aGlzIGZpbGxzIGluIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBnbG9iYWwuCisgIHZvaWQgZ2V0TmFtZVdpdGhQcmVmaXgoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXROYW1lLCBjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcGxpY2l0bHlQcml2YXRlKTsKKyAgCisgIC8vLyBnZXROYW1lV2l0aFByZWZpeCAtIEZpbGwgT3V0TmFtZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBhcHByb3ByaWF0ZSBwcmVmaXgKKyAgLy8vIGFuZCB0aGUgc3BlY2lmaWVkIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lLiAgR1ZOYW1lIG11c3Qgbm90IGJlCisgIC8vLyBlbXB0eS4KKyAgdm9pZCBnZXROYW1lV2l0aFByZWZpeChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dE5hbWUsIGNvbnN0IFR3aW5lICZHVk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFuZ2xlclByZWZpeFR5IFByZWZpeFR5ID0gTWFuZ2xlcjo6RGVmYXVsdCk7CisKKyAgLy8vIGdldE5hbWVXaXRoUHJlZml4IC0gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhcHByb3ByaWF0ZSBwcmVmaXgKKyAgLy8vIGFuZCB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZSdzIG5hbWUuICBJZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGRvZXNuJ3QKKyAgLy8vIGhhdmUgYSBuYW1lLCB0aGlzIGZpbGxzIGluIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBnbG9iYWwuCisgIHN0ZDo6c3RyaW5nIGdldE5hbWVXaXRoUHJlZml4KGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcGxpY2l0bHlQcml2YXRlID0gZmFsc2UpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9NQU5HTEVSX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvU3VidGFyZ2V0RmVhdHVyZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9TdWJ0YXJnZXRGZWF0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0Njg3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvU3VidGFyZ2V0RmVhdHVyZS5oCkBAIC0wLDAgKzEsMTE5IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1N1YnRhcmdldEZlYXR1cmUuaCAtIENQVSBjaGFyYWN0ZXJpc3RpY3MgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuZCBtYW5hZ2VzIHVzZXIgb3IgdG9vbCBzcGVjaWZpZWQgQ1BVIGNoYXJhY3RlcmlzdGljcy4KKy8vIFRoZSBpbnRlbnQgaXMgdG8gYmUgYWJsZSB0byBwYWNrYWdlIHNwZWNpZmljIGZlYXR1cmVzIHRoYXQgc2hvdWxkIG9yIHNob3VsZAorLy8gbm90IGJlIHVzZWQgb24gYSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yLiAgQSB0b29sLCBzdWNoIGFzIGxsYywgY291bGQsIGFzCisvLyBhcyBleGFtcGxlLCBnYXRoZXIgY2hpcCBpbmZvIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgYSBsb25nIHdpdGggZmVhdHVyZXMKKy8vIHRoYXQgc2hvdWxkIGJlIHVzZWQgb24gdGhhdCBjaGlwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfU1VCVEFSR0VURkVBVFVSRV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1NVQlRBUkdFVEZFQVRVUkVfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIHJhd19vc3RyZWFtOworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBTdWJ0YXJnZXRGZWF0dXJlS1YgLSBVc2VkIHRvIHByb3ZpZGUga2V5IHZhbHVlIHBhaXJzIGZvciBmZWF0dXJlIGFuZAorLy8vIENQVSBiaXQgZmxhZ3MuCisvLworc3RydWN0IFN1YnRhcmdldEZlYXR1cmVLViB7CisgIGNvbnN0IGNoYXIgKktleTsgICAgICAgICAgICAgICAgICAgICAgLy8gSy1WIGtleSBzdHJpbmcKKyAgY29uc3QgY2hhciAqRGVzYzsgICAgICAgICAgICAgICAgICAgICAvLyBIZWxwIGRlc2NyaXB0b3IKKyAgdWludDMyX3QgVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAvLyBLLVYgaW50ZWdlciB2YWx1ZQorICB1aW50MzJfdCBJbXBsaWVzOyAgICAgICAgICAgICAgICAgICAgIC8vIEstViBiaXQgbWFzaworICAKKyAgLy8gQ29tcGFyZSByb3V0aW5lIGZvciBzdGQgYmluYXJ5IHNlYXJjaAorICBib29sIG9wZXJhdG9yPChjb25zdCBTdWJ0YXJnZXRGZWF0dXJlS1YgJlMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyY21wKEtleSwgUy5LZXkpIDwgMDsKKyAgfQorfTsKKyAgCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gU3VidGFyZ2V0SW5mb0tWIC0gVXNlZCB0byBwcm92aWRlIGtleSB2YWx1ZSBwYWlycyBmb3IgQ1BVIGFuZCBhcmJpdHJhcnkKKy8vLyBwb2ludGVycy4KKy8vCitzdHJ1Y3QgU3VidGFyZ2V0SW5mb0tWIHsKKyAgY29uc3QgY2hhciAqS2V5OyAgICAgICAgICAgICAgICAgICAgICAvLyBLLVYga2V5IHN0cmluZworICB2b2lkICpWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEstViBwb2ludGVyIHZhbHVlCisgIAorICAvLyBDb21wYXJlIHJvdXRpbmUgZm9yIHN0ZCBiaW5hcnkgc2VhcmNoCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN1YnRhcmdldEluZm9LViAmUykgY29uc3QgeworICAgIHJldHVybiBzdHJjbXAoS2V5LCBTLktleSkgPCAwOworICB9Cit9OworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBTdWJ0YXJnZXRGZWF0dXJlcyAtIE1hbmFnZXMgdGhlIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgb2Ygc3VidGFyZ2V0IAorLy8vIHNwZWNpZmljIGZlYXR1cmVzLiAgRmVhdHVyZXMgYXJlIGVuY29kZWQgYXMgYSBzdHJpbmcgb2YgdGhlIGZvcm0KKy8vLyAgICJjcHUsK2F0dHIxLCthdHRyMiwtYXR0cjMsLi4uLCthdHRyTiIKKy8vLyBBIGNvbW1hIHNlcGFyYXRlcyBlYWNoIGZlYXR1cmUgZnJvbSB0aGUgbmV4dCAoYWxsIGxvd2VyY2FzZS4pCisvLy8gVGhlIGZpcnN0IGZlYXR1cmUgaXMgYWx3YXlzIHRoZSBDUFUgc3VidHlwZSAoZWcuIHBlbnRpdW1tKS4gIElmIHRoZSBDUFUKKy8vLyB2YWx1ZSBpcyAiZ2VuZXJpYyIgdGhlbiB0aGUgQ1BVIHN1YnR5cGUgc2hvdWxkIGJlIGdlbmVyaWMgZm9yIHRoZSB0YXJnZXQuCisvLy8gRWFjaCBvZiB0aGUgcmVtYWluaW5nIGZlYXR1cmVzIGlzIHByZWZpeGVkIHdpdGggKyBvciAtIGluZGljYXRpbmcgd2hldGhlcgorLy8vIHRoYXQgZmVhdHVyZSBzaG91bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBjb250cmFyeSB0byB0aGUgY3B1CisvLy8gc3BlY2lmaWNhdGlvbi4KKy8vLworCitjbGFzcyBTdWJ0YXJnZXRGZWF0dXJlcyB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBGZWF0dXJlczsgICAgLy8gU3VidGFyZ2V0IGZlYXR1cmVzIGFzIGEgdmVjdG9yCitwdWJsaWM6CisgIGV4cGxpY2l0IFN1YnRhcmdldEZlYXR1cmVzKGNvbnN0IHN0ZDo6c3RyaW5nICZJbml0aWFsID0gc3RkOjpzdHJpbmcoKSk7CisKKyAgLy8vIEZlYXR1cmVzIHN0cmluZyBhY2Nlc3NvcnMuCisgIHN0ZDo6c3RyaW5nIGdldFN0cmluZygpIGNvbnN0OworICB2b2lkIHNldFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmSW5pdGlhbCk7CisKKyAgLy8vIFNldCB0aGUgQ1BVIHN0cmluZy4gIFJlcGxhY2VzIHByZXZpb3VzIHNldHRpbmcuICBTZXR0aW5nIHRvICIiIGNsZWFycyBDUFUuCisgIHZvaWQgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHJpbmcpOworCisgIC8vLyBTZXR0aW5nIENQVSBzdHJpbmcgb25seSBpZiBubyBzdHJpbmcgaXMgc2V0LgorICB2b2lkIHNldENQVUlmTm9uZShjb25zdCBzdGQ6OnN0cmluZyAmU3RyaW5nKTsKKworICAvLy8gUmV0dXJucyBjdXJyZW50IENQVSBzdHJpbmcuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICYgZ2V0Q1BVKCkgY29uc3Q7CisKKyAgLy8vIEFkZGluZyBGZWF0dXJlcy4KKyAgdm9pZCBBZGRGZWF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHJpbmcsIGJvb2wgSXNFbmFibGVkID0gdHJ1ZSk7CisgICAgICAgICAgIAorICAvLy8gR2V0IGZlYXR1cmUgYml0cy4KKyAgdWludDMyX3QgZ2V0Qml0cyhjb25zdCBTdWJ0YXJnZXRGZWF0dXJlS1YgKkNQVVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBDUFVUYWJsZVNpemUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU3VidGFyZ2V0RmVhdHVyZUtWICpGZWF0dXJlVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEZlYXR1cmVUYWJsZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAvLy8gR2V0IGluZm8gcG9pbnRlcgorICB2b2lkICpnZXRJbmZvKGNvbnN0IFN1YnRhcmdldEluZm9LViAqVGFibGUsIHNpemVfdCBUYWJsZVNpemUpOworICAKKyAgLy8vIFByaW50IGZlYXR1cmUgc3RyaW5nLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIAorICAvLyBEdW1wIGZlYXR1cmUgaW5mby4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIFJldHJpZXZlIGEgZm9ybWF0dGVkIHN0cmluZyBvZiB0aGUgZGVmYXVsdCBmZWF0dXJlcyBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gdGFyZ2V0IHRyaXBsZS4KKyAgdm9pZCBnZXREZWZhdWx0U3VidGFyZ2V0RmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcgJkNQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJpcGxlJiBUcmlwbGUpOworfTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldC50ZCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOWUwODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldC50ZApAQCAtMCwwICsxLDY0NiBAQAorLy89PT0tIFRhcmdldC50ZCAtIFRhcmdldCBJbmRlcGVuZGVudCBUYWJsZUdlbiBpbnRlcmZhY2UgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgaW50ZXJmYWNlcyB3aGljaCBzaG91bGQgYmUKKy8vIGltcGxlbWVudGVkIGJ5IGVhY2ggdGFyZ2V0IHdoaWNoIGlzIHVzaW5nIGEgVGFibGVHZW4gYmFzZWQgY29kZSBnZW5lcmF0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gSW5jbHVkZSBhbGwgaW5mb3JtYXRpb24gYWJvdXQgTExWTSBpbnRyaW5zaWNzLgoraW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmVnaXN0ZXIgZmlsZSBkZXNjcmlwdGlvbiAtIFRoZXNlIGNsYXNzZXMgYXJlIHVzZWQgdG8gZmlsbCBpbiB0aGUgdGFyZ2V0CisvLyBkZXNjcmlwdGlvbiBjbGFzc2VzLgorCitjbGFzcyBSZWdpc3RlckNsYXNzOyAvLyBGb3J3YXJkIGRlZgorCisvLyBTdWJSZWdJbmRleCAtIFVzZSBpbnN0YW5jZXMgb2YgU3ViUmVnSW5kZXggdG8gaWRlbnRpZnkgc3VicmVnaXN0ZXJzLgorY2xhc3MgU3ViUmVnSW5kZXggeworICBzdHJpbmcgTmFtZXNwYWNlID0gIiI7Cit9CisKKy8vIFJlZ2lzdGVyIC0gWW91IHNob3VsZCBkZWZpbmUgb25lIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZm9yIGVhY2ggcmVnaXN0ZXIKKy8vIGluIHRoZSB0YXJnZXQgbWFjaGluZS4gIFN0cmluZyBuIHdpbGwgYmVjb21lIHRoZSAibmFtZSIgb2YgdGhlIHJlZ2lzdGVyLgorY2xhc3MgUmVnaXN0ZXI8c3RyaW5nIG4+IHsKKyAgc3RyaW5nIE5hbWVzcGFjZSA9ICIiOworICBzdHJpbmcgQXNtTmFtZSA9IG47CisKKyAgLy8gU3BpbGxTaXplIC0gSWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gYSBub24temVybyB2YWx1ZSwgaXQgaXMgdGhlIHNpemUgaW4KKyAgLy8gYml0cyBvZiB0aGUgc3BpbGwgc2xvdCByZXF1aXJlZCB0byBob2xkIHRoaXMgcmVnaXN0ZXIuICBJZiB0aGlzIHZhbHVlIGlzCisgIC8vIHNldCB0byB6ZXJvLCB0aGUgaW5mb3JtYXRpb24gaXMgaW5mZXJyZWQgZnJvbSBhbnkgcmVnaXN0ZXIgY2xhc3NlcyB0aGUKKyAgLy8gcmVnaXN0ZXIgYmVsb25ncyB0by4KKyAgaW50IFNwaWxsU2l6ZSA9IDA7CisKKyAgLy8gU3BpbGxBbGlnbm1lbnQgLSBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvcgorICAvLyBzcGlsbGluZyB0aGUgcmVnaXN0ZXIuICBMaWtlIFNwaWxsU2l6ZSwgdGhpcyBzaG91bGQgb25seSBiZSBleHBsaWNpdGx5CisgIC8vIHNwZWNpZmllZCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm90IGluIGEgcmVnaXN0ZXIgY2xhc3MuCisgIGludCBTcGlsbEFsaWdubWVudCA9IDA7CisKKyAgLy8gQWxpYXNlcyAtIEEgbGlzdCBvZiByZWdpc3RlcnMgdGhhdCB0aGlzIHJlZ2lzdGVyIG92ZXJsYXBzIHdpdGguICBBIHJlYWQgb3IKKyAgLy8gbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVnaXN0ZXIgY2FuIHBvdGVudGlhbGx5IHJlYWQgb3IgbW9kaWZ5IHRoZSBhbGlhc2VkCisgIC8vIHJlZ2lzdGVycy4KKyAgbGlzdDxSZWdpc3Rlcj4gQWxpYXNlcyA9IFtdOworICAKKyAgLy8gU3ViUmVncyAtIEEgbGlzdCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgcGFydHMgb2YgdGhpcyByZWdpc3Rlci4gTm90ZSB0aGVzZQorICAvLyBhcmUgImltbWVkaWF0ZSIgc3ViLXJlZ2lzdGVycyBhbmQgdGhlIHJlZ2lzdGVycyB3aXRoaW4gdGhlIGxpc3QgZG8gbm90CisgIC8vIHRoZW1zZWx2ZXMgb3ZlcmxhcC4gZS5nLiBGb3IgWDg2LCBFQVgncyBTdWJSZWdzIGxpc3QgY29udGFpbnMgb25seSBbQVhdLAorICAvLyBub3QgW0FYLCBBSCwgQUxdLgorICBsaXN0PFJlZ2lzdGVyPiBTdWJSZWdzID0gW107CisKKyAgLy8gU3ViUmVnSW5kaWNlcyAtIEZvciBlYWNoIHJlZ2lzdGVyIGluIFN1YlJlZ3MsIHNwZWNpZnkgdGhlIFN1YlJlZ0luZGV4IHVzZWQKKyAgLy8gdG8gYWRkcmVzcyBpdC4gU3ViLXN1Yi1yZWdpc3RlciBpbmRpY2VzIGFyZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBmcm9tCisgIC8vIFN1YlJlZ3MuCisgIGxpc3Q8U3ViUmVnSW5kZXg+IFN1YlJlZ0luZGljZXMgPSBbXTsKKworICAvLyBDb21wb3NpdGVJbmRpY2VzIC0gU3BlY2lmeSBzdWJyZWcgaW5kaWNlcyB0aGF0IGRvbid0IGNvcnJlc3BvbmQgZGlyZWN0bHkgdG8KKyAgLy8gYSByZWdpc3RlciBpbiBTdWJSZWdzIGFuZCBhcmUgbm90IGluaGVyaXRlZC4gVGhlIGZvbGxvd2luZyBmb3JtYXRzIGFyZQorICAvLyBzdXBwb3J0ZWQ6CisgIC8vCisgIC8vIChhKSAgICAgSWRlbnRpdHkgIC0gUmVnOmEgPT0gUmVnCisgIC8vIChhIGIpICAgQWxpYXMgICAgIC0gUmVnOmEgPT0gUmVnOmIKKyAgLy8gKGEgYixjKSBDb21wb3NpdGUgLSBSZWc6YSA9PSAoUmVnOmIpOmMKKyAgLy8KKyAgLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBkaXNhbWJpZ3VhdGUgYSBzdWItc3ViLXJlZ2lzdGVyIHRoYXQgZXhpc3RzIGluIG1vcmUKKyAgLy8gdGhhbiBvbmUgc3VicmVnaXN0ZXIgYW5kIG90aGVyIHdlaXJkIHN0dWZmLgorICBsaXN0PGRhZz4gQ29tcG9zaXRlSW5kaWNlcyA9IFtdOworCisgIC8vIER3YXJmTnVtYmVycyAtIE51bWJlcnMgdXNlZCBpbnRlcm5hbGx5IGJ5IGdjYy9nZGIgdG8gaWRlbnRpZnkgdGhlIHJlZ2lzdGVyLgorICAvLyBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRldGVybWluZWQgYnkgbG9jYXRpbmcgdGhlIDx0YXJnZXQ+LmggZmlsZSBpbiB0aGUKKyAgLy8gZGlyZWN0b3J5IGxsdm1nY2MvZ2NjL2NvbmZpZy88dGFyZ2V0Pi8gYW5kIGxvb2tpbmcgZm9yIFJFR0lTVEVSX05BTUVTLiAgVGhlCisgIC8vIG9yZGVyIG9mIHRoZXNlIG5hbWVzIGNvcnJlc3BvbmQgdG8gdGhlIGVudW1lcmF0aW9uIHVzZWQgYnkgZ2NjLiAgQSB2YWx1ZSBvZgorICAvLyAtMSBpbmRpY2F0ZXMgdGhhdCB0aGUgZ2NjIG51bWJlciBpcyB1bmRlZmluZWQgYW5kIC0yIHRoYXQgcmVnaXN0ZXIgbnVtYmVyCisgIC8vIGlzIGludmFsaWQgZm9yIHRoaXMgbW9kZS9mbGF2b3VyLgorICBsaXN0PGludD4gRHdhcmZOdW1iZXJzID0gW107Cit9CisKKy8vIFJlZ2lzdGVyV2l0aFN1YlJlZ3MgLSBUaGlzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBpbnN0YW5jZXMgb2YgUmVnaXN0ZXIgd2hpY2gKKy8vIG5lZWQgdG8gc3BlY2lmeSBzdWItcmVnaXN0ZXJzLgorLy8gTGlzdCAic3VicmVncyIgc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBhcmUgc3ViLXJlZ2lzdGVycyB0byB0aGlzIG9uZS4gVGhpcworLy8gaXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgU3ViUmVncyBhbmQgQWxpYXNTZXQgZmllbGRzIG9mIFRhcmdldFJlZ2lzdGVyRGVzYy4KKy8vIFRoaXMgYWxsb3dzIHRoZSBjb2RlIGdlbmVyYXRvciB0byBiZSBjYXJlZnVsIG5vdCB0byBwdXQgdHdvIHZhbHVlcyB3aXRoIAorLy8gb3ZlcmxhcHBpbmcgbGl2ZSByYW5nZXMgaW50byByZWdpc3RlcnMgd2hpY2ggYWxpYXMuCitjbGFzcyBSZWdpc3RlcldpdGhTdWJSZWdzPHN0cmluZyBuLCBsaXN0PFJlZ2lzdGVyPiBzdWJyZWdzPiA6IFJlZ2lzdGVyPG4+IHsKKyAgbGV0IFN1YlJlZ3MgPSBzdWJyZWdzOworfQorCisvLyBSZWdpc3RlckNsYXNzIC0gTm93IHRoYXQgYWxsIG9mIHRoZSByZWdpc3RlcnMgYXJlIGRlZmluZWQsIGFuZCBhbGlhc2VzCisvLyBiZXR3ZWVuIHJlZ2lzdGVycyBhcmUgZGVmaW5lZCwgc3BlY2lmeSB3aGljaCByZWdpc3RlcnMgYmVsb25nIHRvIHdoaWNoCisvLyByZWdpc3RlciBjbGFzc2VzLiAgVGhpcyBhbHNvIGRlZmluZXMgdGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBvcmRlciBvZgorLy8gcmVnaXN0ZXJzIGJ5IHJlZ2lzdGVyIGFsbG9jYXRvcnMuCisvLworY2xhc3MgUmVnaXN0ZXJDbGFzczxzdHJpbmcgbmFtZXNwYWNlLCBsaXN0PFZhbHVlVHlwZT4gcmVnVHlwZXMsIGludCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIGxpc3Q8UmVnaXN0ZXI+IHJlZ0xpc3Q+IHsKKyAgc3RyaW5nIE5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKworICAvLyBSZWdUeXBlIC0gU3BlY2lmeSB0aGUgbGlzdCBWYWx1ZVR5cGUgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGlzIHJlZ2lzdGVyCisgIC8vIGNsYXNzLiAgTm90ZSB0aGF0IGFsbCByZWdpc3RlcnMgaW4gYSByZWdpc3RlciBjbGFzcyBtdXN0IGhhdmUgdGhlIHNhbWUKKyAgLy8gVmFsdWVUeXBlcy4gIFRoaXMgaXMgYSBsaXN0IGJlY2F1c2Ugc29tZSB0YXJnZXRzIHBlcm1pdCBzdG9yaW5nIGRpZmZlcmVudCAKKyAgLy8gdHlwZXMgaW4gc2FtZSByZWdpc3RlciwgZm9yIGV4YW1wbGUgdmVjdG9yIHZhbHVlcyB3aXRoIDEyOC1iaXQgdG90YWwgc2l6ZSwKKyAgLy8gYnV0IGRpZmZlcmVudCBjb3VudC9zaXplIG9mIGl0ZW1zLCBsaWtlIFNTRSBvbiB4ODYuCisgIC8vCisgIGxpc3Q8VmFsdWVUeXBlPiBSZWdUeXBlcyA9IHJlZ1R5cGVzOworCisgIC8vIFNpemUgLSBTcGVjaWZ5IHRoZSBzcGlsbCBzaXplIGluIGJpdHMgb2YgdGhlIHJlZ2lzdGVycy4gIEEgZGVmYXVsdCB2YWx1ZSBvZgorICAvLyB6ZXJvIGxldHMgdGFibGdlbiBwaWNrIGFuIGFwcHJvcHJpYXRlIHNpemUuCisgIGludCBTaXplID0gMDsKKworICAvLyBBbGlnbm1lbnQgLSBTcGVjaWZ5IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgb2YgdGhlIHJlZ2lzdGVycyB3aGVuIHRoZXkgYXJlCisgIC8vIHN0b3JlZCBvciBsb2FkZWQgdG8gbWVtb3J5LgorICAvLworICBpbnQgQWxpZ25tZW50ID0gYWxpZ25tZW50OworCisgIC8vIENvcHlDb3N0IC0gVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvc3Qgb2YgY29weWluZyBhIHZhbHVlCisgIC8vIGJldHdlZW4gdHdvIHJlZ2lzdGVycyBpbiB0aGlzIHJlZ2lzdGVyIGNsYXNzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvbmUKKyAgLy8gbWVhbmluZyBpdCB0YWtlcyBhIHNpbmdsZSBpbnN0cnVjdGlvbiB0byBwZXJmb3JtIHRoZSBjb3B5aW5nLiBBIG5lZ2F0aXZlCisgIC8vIHZhbHVlIG1lYW5zIGNvcHlpbmcgaXMgZXh0cmVtZWx5IGV4cGVuc2l2ZSBvciBpbXBvc3NpYmxlLgorICBpbnQgQ29weUNvc3QgPSAxOworCisgIC8vIE1lbWJlckxpc3QgLSBTcGVjaWZ5IHdoaWNoIHJlZ2lzdGVycyBhcmUgaW4gdGhpcyBjbGFzcy4gIElmIHRoZQorICAvLyBhbGxvY2F0aW9uX29yZGVyXyogbWV0aG9kIGFyZSBub3Qgc3BlY2lmaWVkLCB0aGlzIGFsc28gZGVmaW5lcyB0aGUgb3JkZXIgb2YKKyAgLy8gYWxsb2NhdGlvbiB1c2VkIGJ5IHRoZSByZWdpc3RlciBhbGxvY2F0b3IuCisgIC8vCisgIGxpc3Q8UmVnaXN0ZXI+IE1lbWJlckxpc3QgPSByZWdMaXN0OworICAKKyAgLy8gU3ViUmVnQ2xhc3NlcyAtIFNwZWNpZnkgdGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHN1YnJlZ2lzdGVycyBhcyBhIGxpc3Qgb2YKKyAgLy8gZGFnczogKFJlZ0NsYXNzIFN1YlJlZ0luZGV4LCBTdWJSZWdpbmRleCwgLi4uKQorICBsaXN0PGRhZz4gU3ViUmVnQ2xhc3NlcyA9IFtdOworCisgIC8vIE1ldGhvZFByb3Rvcy9NZXRob2RCb2RpZXMgLSBUaGVzZSBtZW1iZXJzIGNhbiBiZSB1c2VkIHRvIGluc2VydCBhcmJpdHJhcnkKKyAgLy8gY29kZSBpbnRvIGEgZ2VuZXJhdGVkIHJlZ2lzdGVyIGNsYXNzLiAgIFRoZSBub3JtYWwgdXNhZ2Ugb2YgdGhpcyBpcyB0byAKKyAgLy8gb3ZlcmxvYWQgdmlydHVhbCBtZXRob2RzLgorICBjb2RlIE1ldGhvZFByb3RvcyA9IFt7fV07CisgIGNvZGUgTWV0aG9kQm9kaWVzID0gW3t9XTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRHdhcmZSZWdOdW0gLSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgbWFwcGluZyBvZiB0aGUgbGx2bSByZWdpc3RlciBlbnVtZXJhdGlvbgorLy8gdG8gdGhlIHJlZ2lzdGVyIG51bWJlcmluZyB1c2VkIGJ5IGdjYyBhbmQgZ2RiLiAgVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IGEKKy8vIGRlYnVnIGluZm9ybWF0aW9uIHdyaXRlciB0byBkZXNjcmliZSB3aGVyZSB2YWx1ZXMgbWF5IGJlIGxvY2F0ZWQgZHVyaW5nCisvLyBleGVjdXRpb24uCitjbGFzcyBEd2FyZlJlZ051bTxsaXN0PGludD4gTnVtYmVycz4geworICAvLyBEd2FyZk51bWJlcnMgLSBOdW1iZXJzIHVzZWQgaW50ZXJuYWxseSBieSBnY2MvZ2RiIHRvIGlkZW50aWZ5IHRoZSByZWdpc3Rlci4KKyAgLy8gVGhlc2UgdmFsdWVzIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGxvY2F0aW5nIHRoZSA8dGFyZ2V0Pi5oIGZpbGUgaW4gdGhlCisgIC8vIGRpcmVjdG9yeSBsbHZtZ2NjL2djYy9jb25maWcvPHRhcmdldD4vIGFuZCBsb29raW5nIGZvciBSRUdJU1RFUl9OQU1FUy4gIFRoZQorICAvLyBvcmRlciBvZiB0aGVzZSBuYW1lcyBjb3JyZXNwb25kIHRvIHRoZSBlbnVtZXJhdGlvbiB1c2VkIGJ5IGdjYy4gIEEgdmFsdWUgb2YKKyAgLy8gLTEgaW5kaWNhdGVzIHRoYXQgdGhlIGdjYyBudW1iZXIgaXMgdW5kZWZpbmVkIGFuZCAtMiB0aGF0IHJlZ2lzdGVyIG51bWJlciBpcyAKKyAgLy8gaW52YWxpZCBmb3IgdGhpcyBtb2RlL2ZsYXZvdXIuCisgIGxpc3Q8aW50PiBEd2FyZk51bWJlcnMgPSBOdW1iZXJzOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHVsbCBpbiB0aGUgY29tbW9uIHN1cHBvcnQgZm9yIHNjaGVkdWxpbmcKKy8vCitpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTY2hlZHVsZS50ZCIKKworY2xhc3MgUHJlZGljYXRlOyAvLyBGb3J3YXJkIGRlZgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gc2V0IGRlc2NyaXB0aW9uIC0gVGhlc2UgY2xhc3NlcyBjb3JyZXNwb25kIHRvIHRoZSBDKysgY2xhc3NlcyBpbgorLy8gdGhlIFRhcmdldC9UYXJnZXRJbnN0ckluZm8uaCBmaWxlLgorLy8KK2NsYXNzIEluc3RydWN0aW9uIHsKKyAgc3RyaW5nIE5hbWVzcGFjZSA9ICIiOworCisgIGRhZyBPdXRPcGVyYW5kTGlzdDsgICAgICAgLy8gQW4gZGFnIGNvbnRhaW5pbmcgdGhlIE1JIGRlZiBvcGVyYW5kIGxpc3QuCisgIGRhZyBJbk9wZXJhbmRMaXN0OyAgICAgICAgLy8gQW4gZGFnIGNvbnRhaW5pbmcgdGhlIE1JIHVzZSBvcGVyYW5kIGxpc3QuCisgIHN0cmluZyBBc21TdHJpbmcgPSAiIjsgICAgLy8gVGhlIC5zIGZvcm1hdCB0byBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gd2l0aC4KKworICAvLyBQYXR0ZXJuIC0gU2V0IHRvIHRoZSBEQUcgcGF0dGVybiBmb3IgdGhpcyBpbnN0cnVjdGlvbiwgaWYgd2Uga25vdyBvZiBvbmUsCisgIC8vIG90aGVyd2lzZSwgdW5pbml0aWFsaXplZC4KKyAgbGlzdDxkYWc+IFBhdHRlcm47CisKKyAgLy8gVGhlIGZvbGxvdyBzdGF0ZSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5mZXJyZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZQorICAvLyBpbnN0cnVjdGlvbiBwYXR0ZXJuLgorCisgIGxpc3Q8UmVnaXN0ZXI+IFVzZXMgPSBbXTsgLy8gRGVmYXVsdCB0byB1c2luZyBubyBub24tb3BlcmFuZCByZWdpc3RlcnMKKyAgbGlzdDxSZWdpc3Rlcj4gRGVmcyA9IFtdOyAvLyBEZWZhdWx0IHRvIG1vZGlmeWluZyBubyBub24tb3BlcmFuZCByZWdpc3RlcnMKKworICAvLyBQcmVkaWNhdGVzIC0gTGlzdCBvZiBwcmVkaWNhdGVzIHdoaWNoIHdpbGwgYmUgdHVybmVkIGludG8gaXNlbCBtYXRjaGluZworICAvLyBjb2RlLgorICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtdOworCisgIC8vIENvZGUgc2l6ZS4KKyAgaW50IENvZGVTaXplID0gMDsKKworICAvLyBBZGRlZCBjb21wbGV4aXR5IHBhc3NlZCBvbnRvIG1hdGNoaW5nIHBhdHRlcm4uCisgIGludCBBZGRlZENvbXBsZXhpdHkgID0gMDsKKworICAvLyBUaGVzZSBiaXRzIGNhcHR1cmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhpZ2gtbGV2ZWwgc2VtYW50aWNzIG9mIHRoZQorICAvLyBpbnN0cnVjdGlvbi4KKyAgYml0IGlzUmV0dXJuICAgICA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgcmV0dXJuIGluc3RydWN0aW9uPworICBiaXQgaXNCcmFuY2ggICAgID0gMDsgICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSBicmFuY2ggaW5zdHJ1Y3Rpb24/CisgIGJpdCBpc0luZGlyZWN0QnJhbmNoID0gMDsgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhbiBpbmRpcmVjdCBicmFuY2g/CisgIGJpdCBpc0NvbXBhcmUgICAgPSAwOyAgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24/CisgIGJpdCBpc0JhcnJpZXIgICAgPSAwOyAgICAgLy8gQ2FuIGNvbnRyb2wgZmxvdyBmYWxsIHRocm91Z2ggdGhpcyBpbnN0cnVjdGlvbj8KKyAgYml0IGlzQ2FsbCAgICAgICA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgY2FsbCBpbnN0cnVjdGlvbj8KKyAgYml0IGNhbkZvbGRBc0xvYWQgPSAwOyAgICAvLyBDYW4gdGhpcyBiZSBmb2xkZWQgYXMgYSBzaW1wbGUgbWVtb3J5IG9wZXJhbmQ/CisgIGJpdCBtYXlMb2FkICAgICAgPSAwOyAgICAgLy8gSXMgaXQgcG9zc2libGUgZm9yIHRoaXMgaW5zdCB0byByZWFkIG1lbW9yeT8KKyAgYml0IG1heVN0b3JlICAgICA9IDA7ICAgICAvLyBJcyBpdCBwb3NzaWJsZSBmb3IgdGhpcyBpbnN0IHRvIHdyaXRlIG1lbW9yeT8KKyAgYml0IGlzQ29udmVydGlibGVUb1RocmVlQWRkcmVzcyA9IDA7ICAvLyBDYW4gdGhpcyAyLWFkZHIgaW5zdHJ1Y3Rpb24gcHJvbW90ZT8KKyAgYml0IGlzQ29tbXV0YWJsZSA9IDA7ICAgICAvLyBJcyB0aGlzIDMgb3BlcmFuZCBpbnN0cnVjdGlvbiBjb21tdXRhYmxlPworICBiaXQgaXNUZXJtaW5hdG9yID0gMDsgICAgIC8vIElzIHRoaXMgcGFydCBvZiB0aGUgdGVybWluYXRvciBmb3IgYSBiYXNpYyBibG9jaz8KKyAgYml0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDA7IC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gcmUtbWF0ZXJpYWxpemFibGU/CisgIGJpdCBpc1ByZWRpY2FibGUgPSAwOyAgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBwcmVkaWNhYmxlPworICBiaXQgaGFzRGVsYXlTbG90ID0gMDsgICAgIC8vIERvZXMgdGhpcyBpbnN0cnVjdGlvbiBoYXZlIGFuIGRlbGF5IHNsb3Q/CisgIGJpdCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAwOyAvLyBQc2V1ZG8gaW5zdHIgbmVlZGluZyBzcGVjaWFsIGhlbHAuCisgIGJpdCBoYXNDdHJsRGVwICAgPSAwOyAgICAgLy8gRG9lcyB0aGlzIGluc3RydWN0aW9uIHIvdyBjdHJsLWZsb3cgY2hhaW5zPworICBiaXQgaXNOb3REdXBsaWNhYmxlID0gMDsgIC8vIElzIGl0IHVuc2FmZSB0byBkdXBsaWNhdGUgdGhpcyBpbnN0cnVjdGlvbj8KKyAgYml0IGlzQXNDaGVhcEFzQU1vdmUgPSAwOyAvLyBBcyBjaGVhcCAob3IgY2hlYXBlcikgdGhhbiBhIG1vdmUgaW5zdHJ1Y3Rpb24uCisgIGJpdCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxID0gMDsgLy8gU291cmNlcyBoYXZlIHNwZWNpYWwgcmVnYWxsb2MgcmVxdWlyZW1lbnQ/CisgIGJpdCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMDsgLy8gRGVmcyBoYXZlIHNwZWNpYWwgcmVnYWxsb2MgcmVxdWlyZW1lbnQ/CisKKyAgLy8gU2lkZSBlZmZlY3QgZmxhZ3MgLSBXaGVuIHNldCwgdGhlIGZsYWdzIGhhdmUgdGhlc2UgbWVhbmluZ3M6CisgIC8vCisgIC8vICBoYXNTaWRlRWZmZWN0cyAtIFRoZSBpbnN0cnVjdGlvbiBoYXMgc2lkZSBlZmZlY3RzIHRoYXQgYXJlIG5vdAorICAvLyAgICBjYXB0dXJlZCBieSBhbnkgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uIG9yIG90aGVyIGZsYWdzLgorICAvLworICAvLyAgbmV2ZXJIYXNTaWRlRWZmZWN0cyAtIFNldCBvbiBhbiBpbnN0cnVjdGlvbiB3aXRoIG5vIHBhdHRlcm4gaWYgaXQgaGFzIG5vCisgIC8vICAgIHNpZGUgZWZmZWN0cy4KKyAgYml0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgYml0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAwOworCisgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSAicmVhbCIgaW5zdHJ1Y3Rpb24gKHdpdGggYSBkaXN0aW5jdCBtYWNoaW5lCisgIC8vIGVuY29kaW5nKSwgb3IgaXMgaXQgYSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gdXNlZCBmb3IgY29kZWdlbiBtb2RlbGluZworICAvLyBwdXJwb3Nlcy4KKyAgYml0IGlzQ29kZUdlbk9ubHkgPSAwOworCisgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gZm9yIHVzZSBieSB0aGUgYXNzZW1ibGVyIHBhcnNlci4KKyAgYml0IGlzQXNtUGFyc2VyT25seSA9IDA7CisKKyAgSW5zdHJJdGluQ2xhc3MgSXRpbmVyYXJ5ID0gTm9JdGluZXJhcnk7Ly8gRXhlY3V0aW9uIHN0ZXBzIHVzZWQgZm9yIHNjaGVkdWxpbmcuCisKKyAgc3RyaW5nIENvbnN0cmFpbnRzID0gIiI7ICAvLyBPcGVyYW5kQ29uc3RyYWludCwgZS5nLiAkc3JjID0gJGRzdC4KKworICAvLy8gRGlzYWJsZUVuY29kaW5nIC0gTGlzdCBvZiBvcGVyYW5kIG5hbWVzIChlLmcuICIkb3AxLCRvcDIiKSB0aGF0IHNob3VsZCBub3QKKyAgLy8vIGJlIGVuY29kZWQgaW50byB0aGUgb3V0cHV0IG1hY2hpbmVpbnN0ci4KKyAgc3RyaW5nIERpc2FibGVFbmNvZGluZyA9ICIiOworCisgIC8vLyBUYXJnZXQtc3BlY2lmaWMgZmxhZ3MuIFRoaXMgYmVjb21lcyB0aGUgVFNGbGFncyBmaWVsZCBpbiBUYXJnZXRJbnN0ckRlc2MuCisgIGJpdHM8NjQ+IFRTRmxhZ3MgPSAwOworfQorCisvLy8gUHJlZGljYXRlcyAtIFRoZXNlIGFyZSBleHRyYSBjb25kaXRpb25hbHMgd2hpY2ggYXJlIHR1cm5lZCBpbnRvIGluc3RydWN0aW9uCisvLy8gc2VsZWN0b3IgbWF0Y2hpbmcgY29kZS4gQ3VycmVudGx5IGVhY2ggcHJlZGljYXRlIGlzIGp1c3QgYSBzdHJpbmcuCitjbGFzcyBQcmVkaWNhdGU8c3RyaW5nIGNvbmQ+IHsKKyAgc3RyaW5nIENvbmRTdHJpbmcgPSBjb25kOworfQorCisvLy8gTm9Ib25vclNpZ25EZXBlbmRlbnRSb3VuZGluZyAtIFRoaXMgcHJlZGljYXRlIGlzIHRydWUgaWYgc3VwcG9ydCBmb3IKKy8vLyBzaWduLWRlcGVuZGVudC1yb3VuZGluZyBpcyBub3QgZW5hYmxlZC4KK2RlZiBOb0hvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nCisgOiBQcmVkaWNhdGU8IiFIb25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aCgpIj47CisKK2NsYXNzIFJlcXVpcmVzPGxpc3Q8UHJlZGljYXRlPiBwcmVkcz4geworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IHByZWRzOworfQorCisvLy8gb3BzIGRlZmluaXRpb24gLSBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgbWFya2VyIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG9wZXJhbmRzCisvLy8gbGlzdCBmb3IgYW4gaW5zdHJ1Y3Rpb24uIG91dHMgYW5kIGlucyBhcmUgaWRlbnRpY2FsIGJvdGggc3ludGF0aWNhbGx5IGFuZAorLy8vIHNlbWFudGljYWxseSwgdGhleSBhcmUgdXNlZCB0byBkZWZpbmUgZGVmIG9wZXJhbmRzIGFuZCB1c2Ugb3BlcmFuZHMgdG8KKy8vLyBpbXByb3ZlIHJlYWRpYmlsaXR5LiBUaGlzIHNob3VsZCBiZSB1c2VkIGxpa2UgdGhpczoKKy8vLyAgICAgKG91dHMgUjMyOiRkc3QpLCAoaW5zIFIzMjokc3JjMSwgUjMyOiRzcmMyKSBvciBzb21ldGhpbmcgc2ltaWxhci4KK2RlZiBvcHM7CitkZWYgb3V0czsKK2RlZiBpbnM7CisKKy8vLyB2YXJpYWJsZV9vcHMgZGVmaW5pdGlvbiAtIE1hcmsgdGhpcyBpbnN0cnVjdGlvbiBhcyB0YWtpbmcgYSB2YXJpYWJsZSBudW1iZXIKKy8vLyBvZiBvcGVyYW5kcy4KK2RlZiB2YXJpYWJsZV9vcHM7CisKKworLy8vIFBvaW50ZXJMaWtlUmVnQ2xhc3MgLSBWYWx1ZXMgdGhhdCBhcmUgZGVzaWduZWQgdG8gaGF2ZSBwb2ludGVyIHdpZHRoIGFyZQorLy8vIGRlcml2ZWQgZnJvbSB0aGlzLiAgVGFibGVHZW4gdHJlYXRzIHRoZSByZWdpc3RlciBjbGFzcyBhcyBoYXZpbmcgYSBzeW1ib2xpYworLy8vIHR5cGUgdGhhdCBpdCBkb2Vzbid0IGtub3csIGFuZCByZXNvbHZlcyB0aGUgYWN0dWFsIHJlZ2NsYXNzIHRvIHVzZSBieSB1c2luZworLy8vIHRoZSBUYXJnZXRSZWdpc3RlckluZm86OmdldFBvaW50ZXJSZWdDbGFzcygpIGhvb2sgYXQgY29kZWdlbiB0aW1lLgorY2xhc3MgUG9pbnRlckxpa2VSZWdDbGFzczxpbnQgS2luZD4geworICBpbnQgUmVnQ2xhc3NLaW5kID0gS2luZDsKK30KKworCisvLy8gcHRyX3JjIGRlZmluaXRpb24gLSBNYXJrIHRoaXMgb3BlcmFuZCBhcyBiZWluZyBhIHBvaW50ZXIgdmFsdWUgd2hvc2UKKy8vLyByZWdpc3RlciBjbGFzcyBpcyByZXNvbHZlZCBkeW5hbWljYWxseSB2aWEgYSBjYWxsYmFjayB0byBUYXJnZXRJbnN0ckluZm8uCisvLy8gRklYTUU6IFdlIHNob3VsZCBwcm9iYWJseSBjaGFuZ2UgdGhpcyB0byBhIGNsYXNzIHdoaWNoIGNvbnRhaW4gYSBsaXN0IG9mCisvLy8gZmxhZ3MuIEJ1dCBjdXJyZW50bHkgd2UgaGF2ZSBidXQgb25lIGZsYWcuCitkZWYgcHRyX3JjIDogUG9pbnRlckxpa2VSZWdDbGFzczwwPjsKKworLy8vIHVua25vd24gZGVmaW5pdGlvbiAtIE1hcmsgdGhpcyBvcGVyYW5kIGFzIGJlaW5nIG9mIHVua25vd24gdHlwZSwgY2F1c2luZworLy8vIGl0IHRvIGJlIHJlc29sdmVkIGJ5IGluZmVyZW5jZSBpbiB0aGUgY29udGV4dCBpdCBpcyB1c2VkLgorZGVmIHVua25vd247CisKKy8vLyBBc21PcGVyYW5kQ2xhc3MgLSBSZXByZXNlbnRhdGlvbiBmb3IgdGhlIGtpbmRzIG9mIG9wZXJhbmRzIHdoaWNoIHRoZSB0YXJnZXQKKy8vLyBzcGVjaWZpYyBwYXJzZXIgY2FuIGNyZWF0ZSBhbmQgdGhlIGFzc2VtYmx5IG1hdGNoZXIgbWF5IG5lZWQgdG8gZGlzdGluZ3Vpc2guCisvLy8KKy8vLyBPcGVyYW5kIGNsYXNzZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBpbiB3aGljaCBpbnN0cnVjdGlvbnMgYXJlCisvLy8gbWF0Y2hlZCwgdG8gZW5zdXJlIHRoYXQgdGhlIGluc3RydWN0aW9uIHdoaWNoIGdldHMgbWF0Y2hlZCBmb3IgYW55CisvLy8gcGFydGljdWxhciBsaXN0IG9mIG9wZXJhbmRzIGlzIGRldGVybWluaXN0aWMuCisvLy8KKy8vLyBUaGUgdGFyZ2V0IHNwZWNpZmljIHBhcnNlciBtdXN0IGJlIGFibGUgdG8gY2xhc3NpZnkgYSBwYXJzZWQgb3BlcmFuZCBpbnRvIGEKKy8vLyB1bmlxdWUgY2xhc3Mgd2hpY2ggZG9lcyBub3QgcGFydGlhbGx5IG92ZXJsYXAgd2l0aCBhbnkgb3RoZXIgY2xhc3Nlcy4gSXQgY2FuCisvLy8gbWF0Y2ggYSBzdWJzZXQgb2Ygc29tZSBvdGhlciBjbGFzcywgaW4gd2hpY2ggY2FzZSB0aGUgc3VwZXIgY2xhc3MgZmllbGQKKy8vLyBzaG91bGQgYmUgZGVmaW5lZC4KK2NsYXNzIEFzbU9wZXJhbmRDbGFzcyB7CisgIC8vLyBUaGUgbmFtZSB0byB1c2UgZm9yIHRoaXMgY2xhc3MsIHdoaWNoIHNob3VsZCBiZSB1c2FibGUgYXMgYW4gZW51bSB2YWx1ZS4KKyAgc3RyaW5nIE5hbWUgPSA/OworCisgIC8vLyBUaGUgc3VwZXIgY2xhc3NlcyBvZiB0aGlzIG9wZXJhbmQuCisgIGxpc3Q8QXNtT3BlcmFuZENsYXNzPiBTdXBlckNsYXNzZXMgPSBbXTsKKworICAvLy8gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHNwZWNpZmljIG9wZXJhbmQgdG8gY2FsbCB0byB0ZXN0CisgIC8vLyB3aGV0aGVyIHRoZSBvcGVyYW5kIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIElmIG5vdCBzZXQsIHRoaXMgd2lsbAorICAvLy8gZGVmYXVsdCB0byAiaXNGb28iLCB3aGVyZSBGb28gaXMgdGhlIEFzbU9wZXJhbmRDbGFzcyBuYW1lLiBUaGUgbWV0aG9kCisgIC8vLyBzaWduYXR1cmUgc2hvdWxkIGJlOgorICAvLy8gICBib29sIGlzRm9vKCkgY29uc3Q7CisgIHN0cmluZyBQcmVkaWNhdGVNZXRob2QgPSA/OworCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSB0YXJnZXQgc3BlY2lmaWMgb3BlcmFuZCB0byBjYWxsIHRvIGFkZCB0aGUKKyAgLy8vIHRhcmdldCBzcGVjaWZpYyBvcGVyYW5kIHRvIGFuIE1DSW5zdC4gSWYgbm90IHNldCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8KKyAgLy8vICJhZGRGb29PcGVyYW5kcyIsIHdoZXJlIEZvbyBpcyB0aGUgQXNtT3BlcmFuZENsYXNzIG5hbWUuIFRoZSBtZXRob2QKKyAgLy8vIHNpZ25hdHVyZSBzaG91bGQgYmU6CisgIC8vLyAgIHZvaWQgYWRkRm9vT3BlcmFuZHMoTUNJbnN0ICZJbnN0LCB1bnNpZ25lZCBOKSBjb25zdDsKKyAgc3RyaW5nIFJlbmRlck1ldGhvZCA9ID87Cit9CisKK2RlZiBJbW1Bc21PcGVyYW5kIDogQXNtT3BlcmFuZENsYXNzIHsKKyAgbGV0IE5hbWUgPSAiSW1tIjsKK30KKyAgIAorLy8vIE9wZXJhbmQgVHlwZXMgLSBUaGVzZSBwcm92aWRlIHRoZSBidWlsdC1pbiBvcGVyYW5kIHR5cGVzIHRoYXQgbWF5IGJlIHVzZWQKKy8vLyBieSBhIHRhcmdldC4gIFRhcmdldHMgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSB0aGVpciBvd24gb3BlcmFuZCB0eXBlcyBhcworLy8vIG5lZWRlZCwgdGhvdWdoIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yIFJJU0MgdGFyZ2V0cy4KK2NsYXNzIE9wZXJhbmQ8VmFsdWVUeXBlIHR5PiB7CisgIFZhbHVlVHlwZSBUeXBlID0gdHk7CisgIHN0cmluZyBQcmludE1ldGhvZCA9ICJwcmludE9wZXJhbmQiOworICBzdHJpbmcgQXNtT3BlcmFuZExvd2VyTWV0aG9kID0gPzsKKyAgZGFnIE1JT3BlcmFuZEluZm8gPSAob3BzKTsKKworICAvLyBQYXJzZXJNYXRjaENsYXNzIC0gVGhlICJtYXRjaCBjbGFzcyIgdGhhdCBvcGVyYW5kcyBvZiB0aGlzIHR5cGUgZml0CisgIC8vIGluLiBNYXRjaCBjbGFzc2VzIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZQorICAvLyBtYXRjaCwgdG8gZW5zdXJlIHRoYXQgd2hpY2ggaW5zdHJ1Y3Rpb25zIGdldHMgbWF0Y2hlZCBpcyBkZXRlcm1pbmlzdGljLgorICAvLworICAvLyBUaGUgdGFyZ2V0IHNwZWNpZmljIHBhcnNlciBtdXN0IGJlIGFibGUgdG8gY2xhc3NpZnkgYW4gcGFyc2VkIG9wZXJhbmQgaW50bworICAvLyBhIHVuaXF1ZSBjbGFzcywgd2hpY2ggZG9lcyBub3QgcGFydGlhbGx5IG92ZXJsYXAgd2l0aCBhbnkgb3RoZXIgY2xhc3Nlcy4gSXQKKyAgLy8gY2FuIG1hdGNoIGEgc3Vic2V0IG9mIHNvbWUgb3RoZXIgY2xhc3MsIGluIHdoaWNoIGNhc2UgdGhlIEFzbU9wZXJhbmRDbGFzcworICAvLyBzaG91bGQgZGVjbGFyZSB0aGUgb3RoZXIgb3BlcmFuZCBhcyBvbmUgb2YgaXRzIHN1cGVyIGNsYXNzZXMuCisgIEFzbU9wZXJhbmRDbGFzcyBQYXJzZXJNYXRjaENsYXNzID0gSW1tQXNtT3BlcmFuZDsKK30KKworZGVmIGkxaW1tICA6IE9wZXJhbmQ8aTE+OworZGVmIGk4aW1tICA6IE9wZXJhbmQ8aTg+OworZGVmIGkxNmltbSA6IE9wZXJhbmQ8aTE2PjsKK2RlZiBpMzJpbW0gOiBPcGVyYW5kPGkzMj47CitkZWYgaTY0aW1tIDogT3BlcmFuZDxpNjQ+OworCitkZWYgZjMyaW1tIDogT3BlcmFuZDxmMzI+OworZGVmIGY2NGltbSA6IE9wZXJhbmQ8ZjY0PjsKKworLy8vIHplcm9fcmVnIGRlZmluaXRpb24gLSBTcGVjaWFsIG5vZGUgdG8gc3RhbmQgZm9yIHRoZSB6ZXJvIHJlZ2lzdGVyLgorLy8vCitkZWYgemVyb19yZWc7CisKKy8vLyBQcmVkaWNhdGVPcGVyYW5kIC0gVGhpcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYSBwcmVkaWNhdGUgb3BlcmFuZCBmb3IgYW4KKy8vLyBpbnN0cnVjdGlvbi4gIE9wVHlwZXMgc3BlY2lmaWVzIHRoZSBNSU9wZXJhbmRJbmZvIGZvciB0aGUgb3BlcmFuZCwgYW5kCisvLy8gQWx3YXlzVmFsIHNwZWNpZmllcyB0aGUgdmFsdWUgb2YgdGhpcyBwcmVkaWNhdGUgd2hlbiBzZXQgdG8gImFsd2F5cworLy8vIGV4ZWN1dGUiLgorY2xhc3MgUHJlZGljYXRlT3BlcmFuZDxWYWx1ZVR5cGUgdHksIGRhZyBPcFR5cGVzLCBkYWcgQWx3YXlzVmFsPgorICA6IE9wZXJhbmQ8dHk+IHsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSBPcFR5cGVzOworICBkYWcgRGVmYXVsdE9wcyA9IEFsd2F5c1ZhbDsKK30KKworLy8vIE9wdGlvbmFsRGVmT3BlcmFuZCAtIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgYSBvcHRpb25hbCBkZWZpbml0aW9uIG9wZXJhbmQKKy8vLyBmb3IgYW4gaW5zdHJ1Y3Rpb24uIERlZmF1bHRPcHMgaXMgdGhlIHJlZ2lzdGVyIHRoZSBvcGVyYW5kIHJlcHJlc2VudHMgaWYKKy8vLyBub25lIGlzIHN1cHBsaWVkLCBlLmcuIHplcm9fcmVnLgorY2xhc3MgT3B0aW9uYWxEZWZPcGVyYW5kPFZhbHVlVHlwZSB0eSwgZGFnIE9wVHlwZXMsIGRhZyBkZWZhdWx0b3BzPgorICA6IE9wZXJhbmQ8dHk+IHsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSBPcFR5cGVzOworICBkYWcgRGVmYXVsdE9wcyA9IGRlZmF1bHRvcHM7Cit9CisKKworLy8gSW5zdHJJbmZvIC0gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSBpbnN0YW50aWF0ZWQgb25jZSB0byBwcm92aWRlIHBhcmFtZXRlcnMKKy8vIHdoaWNoIGFyZSBnbG9iYWwgdG8gdGhlIHRhcmdldCBtYWNoaW5lLgorLy8KK2NsYXNzIEluc3RySW5mbyB7CisgIC8vIFRhcmdldCBjYW4gc3BlY2lmeSBpdHMgaW5zdHJ1Y3Rpb25zIGluIGVpdGhlciBiaWcgb3IgbGl0dGxlLWVuZGlhbiBmb3JtYXRzLgorICAvLyBGb3IgaW5zdGFuY2UsIHdoaWxlIGJvdGggU3BhcmMgYW5kIFBvd2VyUEMgYXJlIGJpZy1lbmRpYW4gcGxhdGZvcm1zLCB0aGUKKyAgLy8gU3BhcmMgbWFudWFsIHNwZWNpZmllcyBpdHMgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmb3JtYXQgWzMxLi4wXSAoYmlnKSwgd2hpbGUKKyAgLy8gUG93ZXJQQyBzcGVjaWZpZXMgdGhlbSB1c2luZyB0aGUgZm9ybWF0IFswLi4zMV0gKGxpdHRsZSkuCisgIGJpdCBpc0xpdHRsZUVuZGlhbkVuY29kaW5nID0gMDsKK30KKworLy8gU3RhbmRhcmQgUHNldWRvIEluc3RydWN0aW9ucy4KKy8vIFRoaXMgbGlzdCBtdXN0IG1hdGNoIFRhcmdldE9wY29kZXMuaCBhbmQgQ29kZUdlblRhcmdldC5jcHAuCisvLyBPbmx5IHRoZXNlIGluc3RydWN0aW9ucyBhcmUgYWxsb3dlZCBpbiB0aGUgVGFyZ2V0T3Bjb2RlIG5hbWVzcGFjZS4KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSwgTmFtZXNwYWNlID0gIlRhcmdldE9wY29kZSIgaW4geworZGVmIFBISSA6IEluc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdmFyaWFibGVfb3BzKTsKKyAgbGV0IEFzbVN0cmluZyA9ICJQSElOT0RFIjsKK30KK2RlZiBJTkxJTkVBU00gOiBJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKK30KK2RlZiBQUk9MT0dfTEFCRUwgOiBJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIGkzMmltbTokaWQpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNDdHJsRGVwID0gMTsKKyAgbGV0IGlzTm90RHVwbGljYWJsZSA9IDE7Cit9CitkZWYgRUhfTEFCRUwgOiBJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIGkzMmltbTokaWQpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNDdHJsRGVwID0gMTsKKyAgbGV0IGlzTm90RHVwbGljYWJsZSA9IDE7Cit9CitkZWYgR0NfTEFCRUwgOiBJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIGkzMmltbTokaWQpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNDdHJsRGVwID0gMTsKKyAgbGV0IGlzTm90RHVwbGljYWJsZSA9IDE7Cit9CitkZWYgS0lMTCA6IEluc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdmFyaWFibGVfb3BzKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIiOworICBsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDE7Cit9CitkZWYgRVhUUkFDVF9TVUJSRUcgOiBJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRzdXBlcnNyYywgaTMyaW1tOiRzdWJpZHgpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMTsKK30KK2RlZiBJTlNFUlRfU1VCUkVHIDogSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokc3VwZXJzcmMsIHVua25vd246JHN1YnNyYywgaTMyaW1tOiRzdWJpZHgpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMTsKKyAgbGV0IENvbnN0cmFpbnRzID0gIiRzdXBlcnNyYyA9ICRkc3QiOworfQorZGVmIElNUExJQ0lUX0RFRiA6IEluc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIiOworICBsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDE7CisgIGxldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxOworICBsZXQgaXNBc0NoZWFwQXNBTW92ZSA9IDE7Cit9CitkZWYgU1VCUkVHX1RPX1JFRyA6IEluc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JGltcGxzcmMsIHVua25vd246JHN1YnNyYywgaTMyaW1tOiRzdWJpZHgpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMTsKK30KK2RlZiBDT1BZX1RPX1JFR0NMQVNTIDogSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokc3JjLCBpMzJpbW06JHJlZ2NsYXNzKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIiOworICBsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDE7CisgIGxldCBpc0FzQ2hlYXBBc0FNb3ZlID0gMTsKK30KK2RlZiBEQkdfVkFMVUUgOiBJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiREJHX1ZBTFVFIjsKKyAgbGV0IGlzQXNDaGVhcEFzQU1vdmUgPSAxOworfQorZGVmIFJFR19TRVFVRU5DRSA6IEluc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxOworICBsZXQgaXNBc0NoZWFwQXNBTW92ZSA9IDE7Cit9CitkZWYgQ09QWSA6IEluc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JHNyYyk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxOworICBsZXQgaXNBc0NoZWFwQXNBTW92ZSA9IDE7Cit9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBc21QYXJzZXIgLSBUaGlzIGNsYXNzIGNhbiBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2lzaCB0byBpbXBsZW1lbnQKKy8vIC5zIGZpbGUgcGFyc2luZy4KKy8vCisvLyBTdWJ0YXJnZXRzIGNhbiBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCBhc3NlbWJseSBwYXJzZXJzIChlLmcuIEFUJlQgdnMgSW50ZWwKKy8vIHN5bnRheCBvbiBYODYgZm9yIGV4YW1wbGUpLgorLy8KK2NsYXNzIEFzbVBhcnNlciB7CisgIC8vIEFzbVBhcnNlckNsYXNzTmFtZSAtIFRoaXMgc3BlY2lmaWVzIHRoZSBzdWZmaXggdG8gdXNlIGZvciB0aGUgYXNtcGFyc2VyCisgIC8vIGNsYXNzLiAgR2VuZXJhdGVkIEFzbVBhcnNlciBjbGFzc2VzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCB0aGUgdGFyZ2V0CisgIC8vIG5hbWUuCisgIHN0cmluZyBBc21QYXJzZXJDbGFzc05hbWUgID0gIkFzbVBhcnNlciI7CisKKyAgLy8gQXNtUGFyc2VySW5zdENsZWFudXAgLSBJZiBub24tZW1wdHksIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBjdXN0b20gZnVuY3Rpb24gb24gdGhlCisgIC8vIEFzbVBhcnNlciBjbGFzcyB0byBjYWxsIG9uIGV2ZXJ5IG1hdGNoZWQgaW5zdHJ1Y3Rpb24uIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAgLy8gcGVyZm9ybSB0YXJnZXQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gcG9zdC1wcm9jZXNzaW5nLgorICBzdHJpbmcgQXNtUGFyc2VySW5zdENsZWFudXAgID0gIiI7CisKKyAgLy8gTWF0Y2hJbnN0cnVjdGlvbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gbWF0Y2hpbmcgZnVuY3Rpb24gdG8KKyAgLy8gZ2VuZXJhdGUuCisgIHN0cmluZyBNYXRjaEluc3RydWN0aW9uTmFtZSAgPSAiTWF0Y2hJbnN0cnVjdGlvbiI7CisKKyAgLy8gVmFyaWFudCAtIEFzbVBhcnNlcnMgY2FuIGJlIG9mIG11bHRpcGxlIGRpZmZlcmVudCB2YXJpYW50cy4gIFZhcmlhbnRzIGFyZQorICAvLyB1c2VkIHRvIHN1cHBvcnQgdGFyZ2V0cyB0aGF0IG5lZWQgdG8gcGFyc2VyIG11bHRpcGxlIGZvcm1hdHMgZm9yIHRoZQorICAvLyBhc3NlbWJseSBsYW5ndWFnZS4KKyAgaW50IFZhcmlhbnQgPSAwOworCisgIC8vIENvbW1lbnREZWxpbWl0ZXIgLSBJZiBnaXZlbiwgdGhlIGRlbGltaXRlciBzdHJpbmcgdXNlZCB0byByZWNvZ25pemUKKyAgLy8gY29tbWVudHMgd2hpY2ggYXJlIGhhcmQgY29kZWQgaW4gdGhlIC50ZCBhc3NlbWJsZXIgc3RyaW5ncyBmb3IgaW5kaXZpZHVhbAorICAvLyBpbnN0cnVjdGlvbnMuCisgIHN0cmluZyBDb21tZW50RGVsaW1pdGVyID0gIiI7CisKKyAgLy8gUmVnaXN0ZXJQcmVmaXggLSBJZiBnaXZlbiwgdGhlIHRva2VuIHByZWZpeCB3aGljaCBpbmRpY2F0ZXMgYSByZWdpc3RlcgorICAvLyB0b2tlbi4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBtYXRjaGVyIHRvIGF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGhhcmQgY29kZWQKKyAgLy8gcmVnaXN0ZXIgdG9rZW5zIGFzIGNvbnN0cmFpbmVkIHJlZ2lzdGVycywgaW5zdGVhZCBvZiB0b2tlbnMsIGZvciB0aGUKKyAgLy8gcHVycG9zZXMgb2YgbWF0Y2hpbmcuCisgIHN0cmluZyBSZWdpc3RlclByZWZpeCA9ICIiOworfQorZGVmIERlZmF1bHRBc21QYXJzZXIgOiBBc21QYXJzZXI7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFzbVdyaXRlciAtIFRoaXMgY2xhc3MgY2FuIGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdCBuZWVkIHRvIGN1c3RvbWl6ZQorLy8gdGhlIGZvcm1hdCBvZiB0aGUgLnMgZmlsZSB3cml0ZXIuCisvLworLy8gU3VidGFyZ2V0cyBjYW4gaGF2ZSBtdWx0aXBsZSBkaWZmZXJlbnQgYXNtd3JpdGVycyAoZS5nLiBBVCZUIHZzIEludGVsIHN5bnRheAorLy8gb24gWDg2IGZvciBleGFtcGxlKS4KKy8vCitjbGFzcyBBc21Xcml0ZXIgeworICAvLyBBc21Xcml0ZXJDbGFzc05hbWUgLSBUaGlzIHNwZWNpZmllcyB0aGUgc3VmZml4IHRvIHVzZSBmb3IgdGhlIGFzbXdyaXRlcgorICAvLyBjbGFzcy4gIEdlbmVyYXRlZCBBc21Xcml0ZXIgY2xhc3NlcyBhcmUgYWx3YXlzIHByZWZpeGVkIHdpdGggdGhlIHRhcmdldAorICAvLyBuYW1lLgorICBzdHJpbmcgQXNtV3JpdGVyQ2xhc3NOYW1lICA9ICJBc21QcmludGVyIjsKKworICAvLyBJbnN0Rm9ybWF0TmFtZSAtIEFzbVdyaXRlcnMgY2FuIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGZvcm1hdCBzdHJpbmcgdG8KKyAgLy8gcHJpbnQgaW5zdHJ1Y3Rpb25zIHdpdGguCisgIHN0cmluZyBJbnN0Rm9ybWF0TmFtZSA9ICJBc21TdHJpbmciOworCisgIC8vIFZhcmlhbnQgLSBBc21Xcml0ZXJzIGNhbiBiZSBvZiBtdWx0aXBsZSBkaWZmZXJlbnQgdmFyaWFudHMuICBWYXJpYW50cyBhcmUKKyAgLy8gdXNlZCB0byBzdXBwb3J0IHRhcmdldHMgdGhhdCBuZWVkIHRvIGVtaXQgYXNzZW1ibHkgY29kZSBpbiB3YXlzIHRoYXQgYXJlCisgIC8vIG1vc3RseSB0aGUgc2FtZSBmb3IgZGlmZmVyZW50IHRhcmdldHMsIGJ1dCBoYXZlIG1pbm9yIGRpZmZlcmVuY2VzIGluCisgIC8vIHN5bnRheC4gIElmIHRoZSBhc21zdHJpbmcgY29udGFpbnMge3x9IGNoYXJhY3RlcnMgaW4gdGhlbSwgdGhpcyBpbnRlZ2VyCisgIC8vIHdpbGwgc3BlY2lmeSB3aGljaCBhbHRlcm5hdGl2ZSB0byB1c2UuICBGb3IgZXhhbXBsZSAie3h8eXx6fSIgd2l0aCBWYXJpYW50CisgIC8vID09IDEsIHdpbGwgZXhwYW5kIHRvICJ5Ii4KKyAgaW50IFZhcmlhbnQgPSAwOworICAKKyAgCisgIC8vIEZpcnN0T3BlcmFuZENvbHVtbi9PcGVyYW5kU3BhY2luZyAtIElmIHRoZSBhc3NlbWJsZXIgc3ludGF4IHVzZXMgYSBjb2x1bW5hcgorICAvLyBsYXlvdXQsIHRoZSBhc213cml0ZXIgY2FuIGFjdHVhbGx5IGdlbmVyYXRlIG91dHB1dCBpbiB0aGlzIGNvbHVtbnMgKGluCisgIC8vIHZlcmJvc2UtYXNtIG1vZGUpLiAgVGhlc2UgdHdvIHZhbHVlcyBpbmRpY2F0ZSB0aGUgd2lkdGggb2YgdGhlIGZpcnN0IGNvbHVtbgorICAvLyAodGhlICJvcGNvZGUiIGFyZWEpIGFuZCB0aGUgd2lkdGggdG8gcmVzZXJ2ZSBmb3Igc3Vic2VxdWVudCBvcGVyYW5kcy4gIFdoZW4KKyAgLy8gdmVyYm9zZSBhc20gbW9kZSBpcyBlbmFibGVkLCBvcGVyYW5kcyB3aWxsIGJlIGluZGVudGVkIHRvIHJlc3BlY3QgdGhpcy4KKyAgaW50IEZpcnN0T3BlcmFuZENvbHVtbiA9IC0xOworICAKKyAgLy8gT3BlcmFuZFNwYWNpbmcgLSBTcGFjZSBiZXR3ZWVuIG9wZXJhbmQgY29sdW1ucy4KKyAgaW50IE9wZXJhbmRTcGFjaW5nID0gLTE7Cit9CitkZWYgRGVmYXVsdEFzbVdyaXRlciA6IEFzbVdyaXRlcjsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGFyZ2V0IC0gVGhpcyBjbGFzcyBjb250YWlucyB0aGUgImdsb2JhbCIgdGFyZ2V0IGluZm9ybWF0aW9uCisvLworY2xhc3MgVGFyZ2V0IHsKKyAgLy8gSW5zdHJ1Y3Rpb25TZXQgLSBJbnN0cnVjdGlvbiBzZXQgZGVzY3JpcHRpb24gZm9yIHRoaXMgdGFyZ2V0LgorICBJbnN0ckluZm8gSW5zdHJ1Y3Rpb25TZXQ7CisKKyAgLy8gQXNzZW1ibHlQYXJzZXJzIC0gVGhlIEFzbVBhcnNlciBpbnN0YW5jZXMgYXZhaWxhYmxlIGZvciB0aGlzIHRhcmdldC4KKyAgbGlzdDxBc21QYXJzZXI+IEFzc2VtYmx5UGFyc2VycyA9IFtEZWZhdWx0QXNtUGFyc2VyXTsKKworICAvLyBBc3NlbWJseVdyaXRlcnMgLSBUaGUgQXNtV3JpdGVyIGluc3RhbmNlcyBhdmFpbGFibGUgZm9yIHRoaXMgdGFyZ2V0LgorICBsaXN0PEFzbVdyaXRlcj4gQXNzZW1ibHlXcml0ZXJzID0gW0RlZmF1bHRBc21Xcml0ZXJdOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3VidGFyZ2V0RmVhdHVyZSAtIEEgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGNoaXAgc2V0LgorLy8KK2NsYXNzIFN1YnRhcmdldEZlYXR1cmU8c3RyaW5nIG4sIHN0cmluZyBhLCAgc3RyaW5nIHYsIHN0cmluZyBkLAorICAgICAgICAgICAgICAgICAgICAgICBsaXN0PFN1YnRhcmdldEZlYXR1cmU+IGkgPSBbXT4geworICAvLyBOYW1lIC0gRmVhdHVyZSBuYW1lLiAgVXNlZCBieSBjb21tYW5kIGxpbmUgKC1tYXR0cj0pIHRvIGRldGVybWluZSB0aGUKKyAgLy8gYXBwcm9wcmlhdGUgdGFyZ2V0IGNoaXAuCisgIC8vCisgIHN0cmluZyBOYW1lID0gbjsKKyAgCisgIC8vIEF0dHJpYnV0ZSAtIEF0dHJpYnV0ZSB0byBiZSBzZXQgYnkgZmVhdHVyZS4KKyAgLy8KKyAgc3RyaW5nIEF0dHJpYnV0ZSA9IGE7CisgIAorICAvLyBWYWx1ZSAtIFZhbHVlIHRoZSBhdHRyaWJ1dGUgdG8gYmUgc2V0IHRvIGJ5IGZlYXR1cmUuCisgIC8vCisgIHN0cmluZyBWYWx1ZSA9IHY7CisgIAorICAvLyBEZXNjIC0gRmVhdHVyZSBkZXNjcmlwdGlvbi4gIFVzZWQgYnkgY29tbWFuZCBsaW5lICgtbWF0dHI9KSB0byBkaXNwbGF5IGhlbHAKKyAgLy8gaW5mb3JtYXRpb24uCisgIC8vCisgIHN0cmluZyBEZXNjID0gZDsKKworICAvLyBJbXBsaWVzIC0gRmVhdHVyZXMgdGhhdCB0aGlzIGZlYXR1cmUgaW1wbGllcyBhcmUgcHJlc2VudC4gSWYgb25lIG9mIHRob3NlCisgIC8vIGZlYXR1cmVzIGlzbid0IHNldCwgdGhlbiB0aGlzIG9uZSBzaG91bGRuJ3QgYmUgc2V0IGVpdGhlci4KKyAgLy8KKyAgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBJbXBsaWVzID0gaTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByb2Nlc3NvciBjaGlwIHNldHMgLSBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IGVhY2ggb2YgdGhlIGNoaXAgc2V0cyBzdXBwb3J0ZWQKKy8vIGJ5IHRoZSBzY2hlZHVsZXIuICBFYWNoIFByb2Nlc3NvciBkZWZpbml0aW9uIHJlcXVpcmVzIGNvcnJlc3BvbmRpbmcKKy8vIGluc3RydWN0aW9uIGl0aW5lcmFyaWVzLgorLy8KK2NsYXNzIFByb2Nlc3NvcjxzdHJpbmcgbiwgUHJvY2Vzc29ySXRpbmVyYXJpZXMgcGksIGxpc3Q8U3VidGFyZ2V0RmVhdHVyZT4gZj4geworICAvLyBOYW1lIC0gQ2hpcCBzZXQgbmFtZS4gIFVzZWQgYnkgY29tbWFuZCBsaW5lICgtbWNwdT0pIHRvIGRldGVybWluZSB0aGUKKyAgLy8gYXBwcm9wcmlhdGUgdGFyZ2V0IGNoaXAuCisgIC8vCisgIHN0cmluZyBOYW1lID0gbjsKKyAgCisgIC8vIFByb2NJdGluIC0gVGhlIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSB0YXJnZXQgcHJvY2Vzc29yLgorICAvLworICBQcm9jZXNzb3JJdGluZXJhcmllcyBQcm9jSXRpbiA9IHBpOworICAKKyAgLy8gRmVhdHVyZXMgLSBsaXN0IG9mIAorICBsaXN0PFN1YnRhcmdldEZlYXR1cmU+IEZlYXR1cmVzID0gZjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFB1bGwgaW4gdGhlIGNvbW1vbiBzdXBwb3J0IGZvciBjYWxsaW5nIGNvbnZlbnRpb25zLgorLy8KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldENhbGxpbmdDb252LnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHVsbCBpbiB0aGUgY29tbW9uIHN1cHBvcnQgZm9yIERBRyBpc2VsIGdlbmVyYXRpb24uCisvLworaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHLnRkIgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRBc21CYWNrZW5kLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEFzbUJhY2tlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzk1OTVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRBc21CYWNrZW5kLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vPT09LS0gbGx2bS9UYXJnZXQvVGFyZ2V0QXNtQmFja2VuZC5oIC0gVGFyZ2V0IEFzbSBCYWNrZW5kIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfVEFSR0VUQVNNQkFDS0VORF9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVEFTTUJBQ0tFTkRfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DRGF0YUZyYWdtZW50OworY2xhc3MgTUNGaXh1cDsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIE1DT2JqZWN0V3JpdGVyOworY2xhc3MgTUNTZWN0aW9uOwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK2NsYXNzIFRhcmdldDsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gVGFyZ2V0QXNtQmFja2VuZCAtIEdlbmVyaWMgaW50ZXJmYWNlIHRvIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJsZXIgYmFja2VuZHMuCitjbGFzcyBUYXJnZXRBc21CYWNrZW5kIHsKKyAgVGFyZ2V0QXNtQmFja2VuZChjb25zdCBUYXJnZXRBc21CYWNrZW5kICYpOyAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVGFyZ2V0QXNtQmFja2VuZCAmKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3Byb3RlY3RlZDogLy8gQ2FuIG9ubHkgY3JlYXRlIHN1YmNsYXNzZXMuCisgIFRhcmdldEFzbUJhY2tlbmQoY29uc3QgVGFyZ2V0ICYpOworCisgIC8vLyBUaGVUYXJnZXQgLSBUaGUgVGFyZ2V0IHRoYXQgdGhpcyBtYWNoaW5lIHdhcyBjcmVhdGVkIGZvci4KKyAgY29uc3QgVGFyZ2V0ICZUaGVUYXJnZXQ7CisKKyAgdW5zaWduZWQgSGFzQWJzb2x1dGl6ZWRTZXQgOiAxOworICB1bnNpZ25lZCBIYXNSZWxpYWJsZVN5bWJvbERpZmZlcmVuY2UgOiAxOworICB1bnNpZ25lZCBIYXNTY2F0dGVyZWRTeW1ib2xzIDogMTsKKworcHVibGljOgorICB2aXJ0dWFsIH5UYXJnZXRBc21CYWNrZW5kKCk7CisKKyAgY29uc3QgVGFyZ2V0ICZnZXRUYXJnZXQoKSBjb25zdCB7IHJldHVybiBUaGVUYXJnZXQ7IH0KKworICAvLy8gY3JlYXRlT2JqZWN0V3JpdGVyIC0gQ3JlYXRlIGEgbmV3IE1DT2JqZWN0V3JpdGVyIGluc3RhbmNlIGZvciB1c2UgYnkgdGhlCisgIC8vLyBhc3NlbWJsZXIgYmFja2VuZCB0byBlbWl0IHRoZSBmaW5hbCBvYmplY3QgZmlsZS4KKyAgdmlydHVhbCBNQ09iamVjdFdyaXRlciAqY3JlYXRlT2JqZWN0V3JpdGVyKHJhd19vc3RyZWFtICZPUykgY29uc3QgPSAwOworCisgIC8vLyBoYXNBYnNvbHV0aXplZFNldCAtIENoZWNrIHdoZXRoZXIgdGhpcyB0YXJnZXQgImFic29sdXRpemVzIgorICAvLy8gYXNzaWdubWVudHMuIFRoYXQgaXMsIGdpdmVuIGNvZGUgbGlrZToKKyAgLy8vICAgYToKKyAgLy8vICAgLi4uCisgIC8vLyAgIGI6CisgIC8vLyAgIHRtcCA9IGEgLSBiCisgIC8vLyAgICAgICAubG9uZyB0bXAKKyAgLy8vIHdpbGwgdGhlIHZhbHVlIG9mICd0bXAnIGJlIGEgcmVsb2NhdGFibGUgZXhwcmVzc2lvbiwgb3IgdGhlIGFzc2VtYmx5IHRpbWUKKyAgLy8vIHZhbHVlIG9mIEwwIC0gTDEuIFRoaXMgZGlzdGluY3Rpb24gaXMgb25seSByZWxldmFudCBmb3IgcGxhdGZvcm1zIHRoYXQKKyAgLy8vIHN1cHBvcnQgc2NhdHRlcmVkIHN5bWJvbHMsIHNpbmNlIGluIHRoZSBhYnNlbmNlIG9mIHNjYXR0ZXJlZCBzeW1ib2xzIChhIC0KKyAgLy8vIGIpIGNhbm5vdCBjaGFuZ2UgYWZ0ZXIgYXNzZW1ibHkuCisgIGJvb2wgaGFzQWJzb2x1dGl6ZWRTZXQoKSBjb25zdCB7IHJldHVybiBIYXNBYnNvbHV0aXplZFNldDsgfQorCisgIC8vLyBoYXNSZWxpYWJsZVN5bWJvbERpZmZlcmVuY2UgLSBDaGVjayB3aGV0aGVyIHRoaXMgdGFyZ2V0IGltcGxlbWVudHMKKyAgLy8vIGFjY3VyYXRlIHJlbG9jYXRpb25zIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHN5bWJvbHMuIElmIG5vdCwgZGlmZmVyZW5jZXMKKyAgLy8vIGJldHdlZW4gc3ltYm9scyB3aWxsIGFsd2F5cyBiZSByZWxvY2F0YWJsZSBleHByZXNzaW9ucyBhbmQgYW55IHJlZmVyZW5jZXMKKyAgLy8vIHRvIHRlbXBvcmFyeSBzeW1ib2xzIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBpbiB0aGUgc2FtZSBhdG9tLCB1bmxlc3MgdGhleQorICAvLy8gcmVzaWRlIGluIGEgZGlmZmVyZW50IHNlY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRydWUgKHNpbmNlIGl0IHJlc3VsdHMgaW4gZmV3ZXIgcmVsb2NhdGlvbnMgd2l0aCBubworICAvLy8gbG9zcyBvZiBmdW5jdGlvbmFsaXR5KSwgYnV0IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYXMgYSB3YXkgdG8gbWFpbnRhaW4KKyAgLy8vIGV4YWN0IG9iamVjdCBjb21wYXRpYmlsaXR5IHdpdGggRGFyd2luICdhcycgKG9uIG5vbi14ODZfNjQpLiBJdCBzaG91bGQKKyAgLy8vIGV2ZW50dWFsbHkgc2hvdWxkIGJlIGVsaW1pbmF0ZWQuIFNlZSBhbHNvIFxzZWUgaGFzQWJzb2x1dGl6ZWRTZXQuCisgIGJvb2wgaGFzUmVsaWFibGVTeW1ib2xEaWZmZXJlbmNlKCkgY29uc3QgeworICAgIHJldHVybiBIYXNSZWxpYWJsZVN5bWJvbERpZmZlcmVuY2U7CisgIH0KKworICAvLy8gaGFzU2NhdHRlcmVkU3ltYm9scyAtIENoZWNrIHdoZXRoZXIgdGhpcyB0YXJnZXQgc3VwcG9ydHMgc2NhdHRlcmVkCisgIC8vLyBzeW1ib2xzLiBJZiBzbywgdGhlIGFzc2VtYmxlciBzaG91bGQgYXNzdW1lIHRoYXQgYXRvbXMgY2FuIGJlIHNjYXR0ZXJlZCBieQorICAvLy8gdGhlIGxpbmtlci4gSW4gcGFydGljdWxhciwgdGhpcyBtZWFucyB0aGF0IHRoZSBvZmZzZXRzIGJldHdlZW4gc3ltYm9scworICAvLy8gd2hpY2ggYXJlIGluIGRpc3RpbmN0IGF0b21zIGlzIG5vdCBrbm93biBhdCBsaW5rIHRpbWUsIGFuZCB0aGUgYXNzZW1ibGVyCisgIC8vLyBtdXN0IGdlbmVyYXRlIGZpeHVwcyBhbmQgcmVsb2NhdGlvbnMgYXBwcm9wcmlhdGVseS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIGFzc2VtYmxlciBjdXJyZW50bHkgZG9lcyBub3QgcmVhc29uIGFib3V0IGF0b21zLCBpbnN0ZWFkIGl0CisgIC8vLyBhc3N1bWVzIGFsbCB0ZW1wb3Jhcnkgc3ltYm9scyByZXNpZGUgaW4gdGhlICJjdXJyZW50IGF0b20iLgorICBib29sIGhhc1NjYXR0ZXJlZFN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBIYXNTY2F0dGVyZWRTeW1ib2xzOyB9CisKKyAgLy8vIGRvZXNTZWN0aW9uUmVxdWlyZVN5bWJvbHMgLSBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBzZWN0aW9uIHJlcXVpcmVzIHRoYXQKKyAgLy8vIGFsbCBzeW1ib2xzIChldmVuIHRlbXBvcmFyaWVzKSBoYXZlIHN5bWJvbCB0YWJsZSBlbnRyaWVzLgorICB2aXJ0dWFsIGJvb2wgZG9lc1NlY3Rpb25SZXF1aXJlU3ltYm9scyhjb25zdCBNQ1NlY3Rpb24gJlNlY3Rpb24pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNTZWN0aW9uQXRvbWl6YWJsZSAtIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHNlY3Rpb24gY2FuIGJlIHNwbGl0IGludG8KKyAgLy8vIGF0b21zLgorICAvLy8KKyAgLy8vIFxzZWUgTUNBc3NlbWJsZXI6OmlzU3ltYm9sTGlua2VyVmlzaWJsZSgpLgorICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uQXRvbWl6YWJsZShjb25zdCBNQ1NlY3Rpb24gJlNlY3Rpb24pIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBpc1ZpcnR1YWxTZWN0aW9uIC0gQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gc2VjdGlvbiBpcyAidmlydHVhbCIsIHRoYXQgaXMKKyAgLy8vIGhhcyBubyBhY3R1YWwgb2JqZWN0IGZpbGUgY29udGVudHMuCisgIHZpcnR1YWwgYm9vbCBpc1ZpcnR1YWxTZWN0aW9uKGNvbnN0IE1DU2VjdGlvbiAmU2VjdGlvbikgY29uc3QgPSAwOworCisgIC8vLyBBcHBseUZpeHVwIC0gQXBwbHkgdGhlIFxhcmcgVmFsdWUgZm9yIGdpdmVuIFxhcmcgRml4dXAgaW50byB0aGUgcHJvdmlkZWQKKyAgLy8vIGRhdGEgZnJhZ21lbnQsIGF0IHRoZSBvZmZzZXQgc3BlY2lmaWVkIGJ5IHRoZSBmaXh1cCBhbmQgZm9sbG93aW5nIHRoZQorICAvLy8gZml4dXAga2luZCBhcyBhcHByb3ByaWF0ZS4KKyAgdmlydHVhbCB2b2lkIEFwcGx5Rml4dXAoY29uc3QgTUNGaXh1cCAmRml4dXAsIE1DRGF0YUZyYWdtZW50ICZGcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVmFsdWUpIGNvbnN0ID0gMDsKKworICAvLy8gTWF5TmVlZFJlbGF4YXRpb24gLSBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBtYXkgbmVlZAorICAvLy8gcmVsYXhhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5zdCAtIFRoZSBpbnN0cnVjdGlvbiB0byB0ZXN0LgorICB2aXJ0dWFsIGJvb2wgTWF5TmVlZFJlbGF4YXRpb24oY29uc3QgTUNJbnN0ICZJbnN0KSBjb25zdCA9IDA7CisKKyAgLy8vIFJlbGF4SW5zdHJ1Y3Rpb24gLSBSZWxheCB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGdpdmVuIGZyYWdtZW50IHRvIHRoZSBuZXh0CisgIC8vLyB3aWRlciBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5zdCAtIFRoZSBpbnN0cnVjdGlvbiB0byByZWxheCwgd2hpY2ggbWF5IGJlIHRoZSBzYW1lIGFzIHRoZQorICAvLy8gb3V0cHV0LgorICAvLy8gXHBhcm0gUmVzIFtvdXRwdXRdIC0gT24gcmV0dXJuLCB0aGUgcmVsYXhlZCBpbnN0cnVjdGlvbi4KKyAgdmlydHVhbCB2b2lkIFJlbGF4SW5zdHJ1Y3Rpb24oY29uc3QgTUNJbnN0ICZJbnN0LCBNQ0luc3QgJlJlcykgY29uc3QgPSAwOworCisgIC8vLyBXcml0ZU5vcERhdGEgLSBXcml0ZSBhbiAob3B0aW1hbCkgbm9wIHNlcXVlbmNlIG9mIENvdW50IGJ5dGVzIHRvIHRoZSBnaXZlbgorICAvLy8gb3V0cHV0LiBJZiB0aGUgdGFyZ2V0IGNhbm5vdCBnZW5lcmF0ZSBzdWNoIGEgc2VxdWVuY2UsIGl0IHNob3VsZCByZXR1cm4gYW4KKyAgLy8vIGVycm9yLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gLSBUcnVlIG9uIHN1Y2Nlc3MuCisgIHZpcnR1YWwgYm9vbCBXcml0ZU5vcERhdGEodWludDY0X3QgQ291bnQsIE1DT2JqZWN0V3JpdGVyICpPVykgY29uc3QgPSAwOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEFzbUxleGVyLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEFzbUxleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjZjQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0QXNtTGV4ZXIuaApAQCAtMCwwICsxLDg5IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldEFzbUxleGVyLmggLSBUYXJnZXQgQXNzZW1ibHkgTGV4ZXIgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVEFTTUxFWEVSX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfVEFSR0VUQVNNTEVYRVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFRhcmdldDsKKyAgCisvLy8gVGFyZ2V0QXNtTGV4ZXIgLSBHZW5lcmljIGludGVyZmFjZSB0byB0YXJnZXQgc3BlY2lmaWMgYXNzZW1ibHkgbGV4ZXJzLgorY2xhc3MgVGFyZ2V0QXNtTGV4ZXIgeworICAvLy8gVGhlIGN1cnJlbnQgdG9rZW4KKyAgQXNtVG9rZW4gQ3VyVG9rOworICAKKyAgLy8vIFRoZSBsb2NhdGlvbiBhbmQgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgZXJyb3IKKyAgU01Mb2MgRXJyTG9jOworICBzdGQ6OnN0cmluZyBFcnI7CisgIAorICBUYXJnZXRBc21MZXhlcihjb25zdCBUYXJnZXRBc21MZXhlciAmKTsgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFRhcmdldEFzbUxleGVyICYpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorcHJvdGVjdGVkOiAvLyBDYW4gb25seSBjcmVhdGUgc3ViY2xhc3Nlcy4KKyAgVGFyZ2V0QXNtTGV4ZXIoY29uc3QgVGFyZ2V0ICYpOworICAKKyAgdmlydHVhbCBBc21Ub2tlbiBMZXhUb2tlbigpID0gMDsKKyAgCisgIHZvaWQgU2V0RXJyb3IoY29uc3QgU01Mb2MgJmVyckxvYywgY29uc3Qgc3RkOjpzdHJpbmcgJmVycikgeworICAgIEVyckxvYyA9IGVyckxvYzsKKyAgICBFcnIgPSBlcnI7CisgIH0KKyAgCisgIC8vLyBUaGVUYXJnZXQgLSBUaGUgVGFyZ2V0IHRoYXQgdGhpcyBtYWNoaW5lIHdhcyBjcmVhdGVkIGZvci4KKyAgY29uc3QgVGFyZ2V0ICZUaGVUYXJnZXQ7CisgIE1DQXNtTGV4ZXIgKkxleGVyOworICAKK3B1YmxpYzoKKyAgdmlydHVhbCB+VGFyZ2V0QXNtTGV4ZXIoKTsKKyAgCisgIGNvbnN0IFRhcmdldCAmZ2V0VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gVGhlVGFyZ2V0OyB9CisgIAorICAvLy8gSW5zdGFsbExleGVyIC0gU2V0IHRoZSBsZXhlciB0byBnZXQgdG9rZW5zIGZyb20gbG93ZXItbGV2ZWwgbGV4ZXIgXGFyZyBMLgorICB2b2lkIEluc3RhbGxMZXhlcihNQ0FzbUxleGVyICZMKSB7CisgICAgTGV4ZXIgPSAmTDsKKyAgfQorICAKKyAgTUNBc21MZXhlciAqZ2V0TGV4ZXIoKSB7CisgICAgcmV0dXJuIExleGVyOworICB9CisgIAorICAvLy8gTGV4IC0gQ29uc3VtZSB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJldHVybiBpdC4KKyAgY29uc3QgQXNtVG9rZW4gJkxleCgpIHsKKyAgICByZXR1cm4gQ3VyVG9rID0gTGV4VG9rZW4oKTsKKyAgfQorICAKKyAgLy8vIGdldFRvayAtIEdldCB0aGUgY3VycmVudCAobGFzdCkgbGV4ZWQgdG9rZW4uCisgIGNvbnN0IEFzbVRva2VuICZnZXRUb2soKSB7CisgICAgcmV0dXJuIEN1clRvazsKKyAgfQorICAKKyAgLy8vIGdldEVyckxvYyAtIEdldCB0aGUgY3VycmVudCBlcnJvciBsb2NhdGlvbgorICBjb25zdCBTTUxvYyAmZ2V0RXJyTG9jKCkgeworICAgIHJldHVybiBFcnJMb2M7CisgIH0KKyAgCisgIC8vLyBnZXRFcnIgLSBHZXQgdGhlIGN1cnJlbnQgZXJyb3Igc3RyaW5nCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRFcnIoKSB7CisgICAgcmV0dXJuIEVycjsKKyAgfQorICAKKyAgLy8vIGdldEtpbmQgLSBHZXQgdGhlIGtpbmQgb2YgY3VycmVudCB0b2tlbi4KKyAgQXNtVG9rZW46OlRva2VuS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gQ3VyVG9rLmdldEtpbmQoKTsgfQorICAKKyAgLy8vIGlzIC0gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaGFzIGtpbmQgXGFyZyBLLgorICBib29sIGlzKEFzbVRva2VuOjpUb2tlbktpbmQgSykgY29uc3QgeyByZXR1cm4gQ3VyVG9rLmlzKEspOyB9CisgIAorICAvLy8gaXNOb3QgLSBDaGVjayBpZiB0aGUgY3VycmVudCB0b2tlbiBoYXMga2luZCBcYXJnIEsuCisgIGJvb2wgaXNOb3QoQXNtVG9rZW46OlRva2VuS2luZCBLKSBjb25zdCB7IHJldHVybiBDdXJUb2suaXNOb3QoSyk7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRBc21QYXJzZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0QXNtUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzN2FkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0QXNtUGFyc2VyLmgKQEAgLTAsMCArMSw4NCBAQAorLy89PT0tLSBsbHZtL1RhcmdldC9UYXJnZXRBc21QYXJzZXIuaCAtIFRhcmdldCBBc3NlbWJseSBQYXJzZXIgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9UQVJHRVRQQVJTRVJfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRQQVJTRVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlckV4dGVuc2lvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ0luc3Q7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBUYXJnZXQ7CitjbGFzcyBTTUxvYzsKK2NsYXNzIEFzbVRva2VuOworY2xhc3MgTUNQYXJzZWRBc21PcGVyYW5kOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKworLy8vIFRhcmdldEFzbVBhcnNlciAtIEdlbmVyaWMgaW50ZXJmYWNlIHRvIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJseSBwYXJzZXJzLgorY2xhc3MgVGFyZ2V0QXNtUGFyc2VyIDogcHVibGljIE1DQXNtUGFyc2VyRXh0ZW5zaW9uIHsKKyAgVGFyZ2V0QXNtUGFyc2VyKGNvbnN0IFRhcmdldEFzbVBhcnNlciAmKTsgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFRhcmdldEFzbVBhcnNlciAmKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3Byb3RlY3RlZDogLy8gQ2FuIG9ubHkgY3JlYXRlIHN1YmNsYXNzZXMuCisgIFRhcmdldEFzbVBhcnNlcihjb25zdCBUYXJnZXQgJik7CisgCisgIC8vLyBUaGUgVGFyZ2V0IHRoYXQgdGhpcyBtYWNoaW5lIHdhcyBjcmVhdGVkIGZvci4KKyAgY29uc3QgVGFyZ2V0ICZUaGVUYXJnZXQ7CisKKyAgLy8vIFRoZSBjdXJyZW50IHNldCBvZiBhdmFpbGFibGUgZmVhdHVyZXMuCisgIHVuc2lnbmVkIEF2YWlsYWJsZUZlYXR1cmVzOworCitwdWJsaWM6CisgIHZpcnR1YWwgflRhcmdldEFzbVBhcnNlcigpOworCisgIGNvbnN0IFRhcmdldCAmZ2V0VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gVGhlVGFyZ2V0OyB9CisKKyAgdW5zaWduZWQgZ2V0QXZhaWxhYmxlRmVhdHVyZXMoKSBjb25zdCB7IHJldHVybiBBdmFpbGFibGVGZWF0dXJlczsgfQorICB2b2lkIHNldEF2YWlsYWJsZUZlYXR1cmVzKHVuc2lnbmVkIFZhbHVlKSB7IEF2YWlsYWJsZUZlYXR1cmVzID0gVmFsdWU7IH0KKworICAvLy8gUGFyc2VJbnN0cnVjdGlvbiAtIFBhcnNlIG9uZSBhc3NlbWJseSBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgcGFyc2VyIGlzIHBvc2l0aW9uZWQgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbiBuYW1lLiBUaGUgdGFyZ2V0CisgIC8vLyBzcGVjaWZpYyBpbnN0cnVjdGlvbiBwYXJzZXIgc2hvdWxkIHBhcnNlIHRoZSBlbnRpcmUgaW5zdHJ1Y3Rpb24gYW5kCisgIC8vLyBjb25zdHJ1Y3QgdGhlIGFwcHJvcHJpYXRlIE1DSW5zdCwgb3IgZW1pdCBhbiBlcnJvci4gT24gc3VjY2VzcywgdGhlIGVudGlyZQorICAvLy8gbGluZSBzaG91bGQgYmUgcGFyc2VkIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGVuZC1vZi1zdGF0ZW1lbnQgdG9rZW4uIE9uCisgIC8vLyBmYWlsdXJlLCB0aGUgcGFyc2VyIGlzIG5vdCByZXF1aXJlZCB0byByZWFkIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisgIC8vCisgIC8vLyBccGFyYW0gTmFtZSAtIFRoZSBpbnN0cnVjdGlvbiBuYW1lLgorICAvLy8gXHBhcmFtIE5hbWVMb2MgLSBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBuYW1lLgorICAvLy8gXHBhcmFtIE9wZXJhbmRzIFtvdXRdIC0gVGhlIGxpc3Qgb2YgcGFyc2VkIG9wZXJhbmRzLCB0aGlzIHJldHVybnMKKyAgLy8vICAgICAgICBvd25lcnNoaXAgb2YgdGhlbSB0byB0aGUgY2FsbGVyLgorICAvLy8gXHJldHVybiBUcnVlIG9uIGZhaWx1cmUuCisgIHZpcnR1YWwgYm9vbCBQYXJzZUluc3RydWN0aW9uKFN0cmluZ1JlZiBOYW1lLCBTTUxvYyBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNQ1BhcnNlZEFzbU9wZXJhbmQqPiAmT3BlcmFuZHMpID0gMDsKKworICAvLy8gUGFyc2VEaXJlY3RpdmUgLSBQYXJzZSBhIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJsZXIgZGlyZWN0aXZlCisgIC8vLworICAvLy8gVGhlIHBhcnNlciBpcyBwb3NpdGlvbmVkIGZvbGxvd2luZyB0aGUgZGlyZWN0aXZlIG5hbWUuICBUaGUgdGFyZ2V0CisgIC8vLyBzcGVjaWZpYyBkaXJlY3RpdmUgcGFyc2VyIHNob3VsZCBwYXJzZSB0aGUgZW50aXJlIGRpcmVjdGl2ZSBkb2luZyBvcgorICAvLy8gcmVjb3JkaW5nIGFueSB0YXJnZXQgc3BlY2lmaWMgd29yaywgb3IgcmV0dXJuIHRydWUgYW5kIGRvIG5vdGhpbmcgaWYgdGhlCisgIC8vLyBkaXJlY3RpdmUgaXMgbm90IHRhcmdldCBzcGVjaWZpYy4gSWYgdGhlIGRpcmVjdGl2ZSBpcyBzcGVjaWZpYyBmb3IKKyAgLy8vIHRoZSB0YXJnZXQsIHRoZSBlbnRpcmUgbGluZSBpcyBwYXJzZWQgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKKyAgLy8vIGVuZC1vZi1zdGF0ZW1lbnQgdG9rZW4gYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEaXJlY3RpdmVJRCAtIHRoZSBpZGVudGlmaWVyIHRva2VuIG9mIHRoZSBkaXJlY3RpdmUuCisgIHZpcnR1YWwgYm9vbCBQYXJzZURpcmVjdGl2ZShBc21Ub2tlbiBEaXJlY3RpdmVJRCkgPSAwOworICAKKyAgLy8vIE1hdGNoSW5zdHJ1Y3Rpb24gLSBSZWNvZ25pemUgYSBzZXJpZXMgb2Ygb3BlcmFuZHMgb2YgYSBwYXJzZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIGFzIGFuIGFjdHVhbCBNQ0luc3QuICBUaGlzIHJldHVybnMgZmFsc2UgYW5kIGZpbGxzIGluIEluc3Qgb24gc3VjY2VzcyBhbmQKKyAgLy8vIHJldHVybnMgdHJ1ZSBvbiBmYWlsdXJlIHRvIG1hdGNoLgorICB2aXJ0dWFsIGJvb2wgCisgIE1hdGNoSW5zdHJ1Y3Rpb24oY29uc3QgU21hbGxWZWN0b3JJbXBsPE1DUGFyc2VkQXNtT3BlcmFuZCo+ICZPcGVyYW5kcywKKyAgICAgICAgICAgICAgICAgICBNQ0luc3QgJkluc3QpID0gMDsKKyAgCit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0Q2FsbGluZ0NvbnYuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0Q2FsbGluZ0NvbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY4YTJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRDYWxsaW5nQ29udi5oCkBAIC0wLDAgKzEsMTQyIEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldENhbGxpbmdDb252LmggLSBDYWxsaW5nIENvbnZlbnRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHR5cGVzIGZvciB3b3JraW5nIHdpdGggY2FsbGluZy1jb252ZW50aW9uIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfVEFSR0VUQ0FMTElOR0NPTlZfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRDQUxMSU5HQ09OVl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIElTRCB7CisgIHN0cnVjdCBBcmdGbGFnc1R5IHsKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgTm9GbGFnU2V0ICAgICAgPSAwVUxMOworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBaRXh0ICAgICAgICAgICA9IDFVTEw8PDA7ICAvLy88IFplcm8gZXh0ZW5kZWQKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgWkV4dE9mZnMgICAgICAgPSAwOworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBTRXh0ICAgICAgICAgICA9IDFVTEw8PDE7ICAvLy88IFNpZ24gZXh0ZW5kZWQKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgU0V4dE9mZnMgICAgICAgPSAxOworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBJblJlZyAgICAgICAgICA9IDFVTEw8PDI7ICAvLy88IFBhc3NlZCBpbiByZWdpc3RlcgorICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBJblJlZ09mZnMgICAgICA9IDI7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFNSZXQgICAgICAgICAgID0gMVVMTDw8MzsgIC8vLzwgSGlkZGVuIHN0cnVjdC1yZXQgcHRyCisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFNSZXRPZmZzICAgICAgID0gMzsKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQnlWYWwgICAgICAgICAgPSAxVUxMPDw0OyAgLy8vPCBTdHJ1Y3QgcGFzc2VkIGJ5IHZhbHVlCisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEJ5VmFsT2ZmcyAgICAgID0gNDsKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgTmVzdCAgICAgICAgICAgPSAxVUxMPDw1OyAgLy8vPCBOZXN0ZWQgZm4gc3RhdGljIGNoYWluCisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IE5lc3RPZmZzICAgICAgID0gNTsKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQnlWYWxBbGlnbiAgICAgPSAweEZVTEwgPDwgNjsgLy88IFN0cnVjdCBhbGlnbm1lbnQKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQnlWYWxBbGlnbk9mZnMgPSA2OworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBTcGxpdCAgICAgICAgICA9IDFVTEwgPDwgMTA7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFNwbGl0T2ZmcyAgICAgID0gMTA7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IE9yaWdBbGlnbiAgICAgID0gMHgxRlVMTDw8Mjc7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IE9yaWdBbGlnbk9mZnMgID0gMjc7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEJ5VmFsU2l6ZSAgICAgID0gMHhmZmZmZmZmZlVMTCA8PCAzMjsgLy88IFN0cnVjdCBzaXplCisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEJ5VmFsU2l6ZU9mZnMgID0gMzI7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgT25lICAgICAgICAgICAgPSAxVUxMOyAvLzwgMSBvZiB0aGlzIHR5cGUsIGZvciBzaGlmdHMKKworICAgIHVpbnQ2NF90IEZsYWdzOworICBwdWJsaWM6CisgICAgQXJnRmxhZ3NUeSgpIDogRmxhZ3MoMCkgeyB9CisKKyAgICBib29sIGlzWkV4dCgpICAgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiBaRXh0OyB9CisgICAgdm9pZCBzZXRaRXh0KCkgIHsgRmxhZ3MgfD0gT25lIDw8IFpFeHRPZmZzOyB9CisKKyAgICBib29sIGlzU0V4dCgpICAgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiBTRXh0OyB9CisgICAgdm9pZCBzZXRTRXh0KCkgIHsgRmxhZ3MgfD0gT25lIDw8IFNFeHRPZmZzOyB9CisKKyAgICBib29sIGlzSW5SZWcoKSAgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiBJblJlZzsgfQorICAgIHZvaWQgc2V0SW5SZWcoKSB7IEZsYWdzIHw9IE9uZSA8PCBJblJlZ09mZnM7IH0KKworICAgIGJvb2wgaXNTUmV0KCkgICBjb25zdCB7IHJldHVybiBGbGFncyAmIFNSZXQ7IH0KKyAgICB2b2lkIHNldFNSZXQoKSAgeyBGbGFncyB8PSBPbmUgPDwgU1JldE9mZnM7IH0KKworICAgIGJvb2wgaXNCeVZhbCgpICBjb25zdCB7IHJldHVybiBGbGFncyAmIEJ5VmFsOyB9CisgICAgdm9pZCBzZXRCeVZhbCgpIHsgRmxhZ3MgfD0gT25lIDw8IEJ5VmFsT2ZmczsgfQorCisgICAgYm9vbCBpc05lc3QoKSAgIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgTmVzdDsgfQorICAgIHZvaWQgc2V0TmVzdCgpICB7IEZsYWdzIHw9IE9uZSA8PCBOZXN0T2ZmczsgfQorCisgICAgdW5zaWduZWQgZ2V0QnlWYWxBbGlnbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAodW5zaWduZWQpCisgICAgICAgICgoT25lIDw8ICgoRmxhZ3MgJiBCeVZhbEFsaWduKSA+PiBCeVZhbEFsaWduT2ZmcykpIC8gMik7CisgICAgfQorICAgIHZvaWQgc2V0QnlWYWxBbGlnbih1bnNpZ25lZCBBKSB7CisgICAgICBGbGFncyA9IChGbGFncyAmIH5CeVZhbEFsaWduKSB8CisgICAgICAgICh1aW50NjRfdChMb2cyXzMyKEEpICsgMSkgPDwgQnlWYWxBbGlnbk9mZnMpOworICAgIH0KKworICAgIGJvb2wgaXNTcGxpdCgpICAgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiBTcGxpdDsgfQorICAgIHZvaWQgc2V0U3BsaXQoKSAgeyBGbGFncyB8PSBPbmUgPDwgU3BsaXRPZmZzOyB9CisKKyAgICB1bnNpZ25lZCBnZXRPcmlnQWxpZ24oKSBjb25zdCB7CisgICAgICByZXR1cm4gKHVuc2lnbmVkKQorICAgICAgICAoKE9uZSA8PCAoKEZsYWdzICYgT3JpZ0FsaWduKSA+PiBPcmlnQWxpZ25PZmZzKSkgLyAyKTsKKyAgICB9CisgICAgdm9pZCBzZXRPcmlnQWxpZ24odW5zaWduZWQgQSkgeworICAgICAgRmxhZ3MgPSAoRmxhZ3MgJiB+T3JpZ0FsaWduKSB8CisgICAgICAgICh1aW50NjRfdChMb2cyXzMyKEEpICsgMSkgPDwgT3JpZ0FsaWduT2Zmcyk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0QnlWYWxTaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuICh1bnNpZ25lZCkoKEZsYWdzICYgQnlWYWxTaXplKSA+PiBCeVZhbFNpemVPZmZzKTsKKyAgICB9CisgICAgdm9pZCBzZXRCeVZhbFNpemUodW5zaWduZWQgUykgeworICAgICAgRmxhZ3MgPSAoRmxhZ3MgJiB+QnlWYWxTaXplKSB8ICh1aW50NjRfdChTKSA8PCBCeVZhbFNpemVPZmZzKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0QXJnRmxhZ3NTdHJpbmcgLSBSZXR1cm5zIHRoZSBmbGFncyBhcyBhIHN0cmluZywgZWc6ICJ6ZXh0IGFsaWduOjQiLgorICAgIHN0ZDo6c3RyaW5nIGdldEFyZ0ZsYWdzU3RyaW5nKCk7CisKKyAgICAvLy8gZ2V0UmF3Qml0cyAtIFJlcHJlc2VudCB0aGUgZmxhZ3MgYXMgYSBidW5jaCBvZiBiaXRzLgorICAgIHVpbnQ2NF90IGdldFJhd0JpdHMoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorICB9OworCisgIC8vLyBJbnB1dEFyZyAtIFRoaXMgc3RydWN0IGNhcnJpZXMgZmxhZ3MgYW5kIHR5cGUgaW5mb3JtYXRpb24gYWJvdXQgYQorICAvLy8gc2luZ2xlIGluY29taW5nIChmb3JtYWwpIGFyZ3VtZW50IG9yIGluY29taW5nIChmcm9tIHRoZSBwZXJzcGVjdGl2ZQorICAvLy8gb2YgdGhlIGNhbGxlcikgcmV0dXJuIHZhbHVlIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLworICBzdHJ1Y3QgSW5wdXRBcmcgeworICAgIEFyZ0ZsYWdzVHkgRmxhZ3M7CisgICAgRVZUIFZUOworICAgIGJvb2wgVXNlZDsKKworICAgIElucHV0QXJnKCkgOiBWVChNVlQ6Ok90aGVyKSwgVXNlZChmYWxzZSkge30KKyAgICBJbnB1dEFyZyhBcmdGbGFnc1R5IGZsYWdzLCBFVlQgdnQsIGJvb2wgdXNlZCkKKyAgICAgIDogRmxhZ3MoZmxhZ3MpLCBWVCh2dCksIFVzZWQodXNlZCkgeworICAgICAgYXNzZXJ0KFZULmlzU2ltcGxlKCkgJiYKKyAgICAgICAgICAgICAiSW5wdXRBcmcgdmFsdWUgdHlwZSBtdXN0IGJlIFNpbXBsZSEiKTsKKyAgICB9CisgIH07CisKKyAgLy8vIE91dHB1dEFyZyAtIFRoaXMgc3RydWN0IGNhcnJpZXMgZmxhZ3MgYW5kIGEgdmFsdWUgZm9yIGEKKyAgLy8vIHNpbmdsZSBvdXRnb2luZyAoYWN0dWFsKSBhcmd1bWVudCBvciBvdXRnb2luZyAoZnJvbSB0aGUgcGVyc3BlY3RpdmUKKyAgLy8vIG9mIHRoZSBjYWxsZXIpIHJldHVybiB2YWx1ZSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAvLy8KKyAgc3RydWN0IE91dHB1dEFyZyB7CisgICAgQXJnRmxhZ3NUeSBGbGFnczsKKyAgICBFVlQgVlQ7CisKKyAgICAvLy8gSXNGaXhlZCAtIElzIHRoaXMgYSAiZml4ZWQiIHZhbHVlLCBpZSBub3QgcGFzc2VkIHRocm91Z2ggYSB2YXJhcmcgIi4uLiIuCisgICAgYm9vbCBJc0ZpeGVkOworCisgICAgT3V0cHV0QXJnKCkgOiBJc0ZpeGVkKGZhbHNlKSB7fQorICAgIE91dHB1dEFyZyhBcmdGbGFnc1R5IGZsYWdzLCBFVlQgdnQsIGJvb2wgaXNmaXhlZCkKKyAgICAgIDogRmxhZ3MoZmxhZ3MpLCBWVCh2dCksIElzRml4ZWQoaXNmaXhlZCkgeworICAgICAgYXNzZXJ0KFZULmlzU2ltcGxlKCkgJiYKKyAgICAgICAgICAgICAiT3V0cHV0QXJnIHZhbHVlIHR5cGUgbXVzdCBiZSBTaW1wbGUhIik7CisgICAgfQorICB9OworfQorCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0Q2FsbGluZ0NvbnYudGQgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldENhbGxpbmdDb252LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjY0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldENhbGxpbmdDb252LnRkCkBAIC0wLDAgKzEsMTM1IEBACisvLz09PS0gVGFyZ2V0Q2FsbGluZ0NvbnYudGQgLSBUYXJnZXQgQ2FsbGluZyBDb252ZW50aW9ucyAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHdpdGggd2hpY2ggdGFyZ2V0cworLy8gZGVzY3JpYmUgdGhlaXIgY2FsbGluZyBjb252ZW50aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBDQ0FjdGlvbjsKK2NsYXNzIENhbGxpbmdDb252OworCisvLy8gQ0NDdXN0b20gLSBDYWxscyBhIGN1c3RvbSBhcmcgaGFuZGxpbmcgZnVuY3Rpb24uCitjbGFzcyBDQ0N1c3RvbTxzdHJpbmcgZm4+IDogQ0NBY3Rpb24geworICBzdHJpbmcgRnVuY05hbWUgPSBmbjsKK30KKworLy8vIENDUHJlZGljYXRlQWN0aW9uIC0gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgY2hlY2sgc29tZSBwcmVkaWNhdGUsIHRoZW4KKy8vLyBkZWxlZ2F0ZSB0byBhbm90aGVyIGFjdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIHRydWUuCitjbGFzcyBDQ1ByZWRpY2F0ZUFjdGlvbjxDQ0FjdGlvbiBBPiA6IENDQWN0aW9uIHsKKyAgQ0NBY3Rpb24gU3ViQWN0aW9uID0gQTsKK30KKworLy8vIENDSWZUeXBlIC0gSWYgdGhlIGN1cnJlbnQgYXJndW1lbnQgaXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMsIGFwcGx5CisvLy8gQWN0aW9uIEEuCitjbGFzcyBDQ0lmVHlwZTxsaXN0PFZhbHVlVHlwZT4gdnRzLCBDQ0FjdGlvbiBBPiA6IENDUHJlZGljYXRlQWN0aW9uPEE+IHsKKyAgbGlzdDxWYWx1ZVR5cGU+IFZUcyA9IHZ0czsKK30KKworLy8vIENDSWYgLSBJZiB0aGUgcHJlZGljYXRlIG1hdGNoZXMsIGFwcGx5IEEuCitjbGFzcyBDQ0lmPHN0cmluZyBwcmVkaWNhdGUsIENDQWN0aW9uIEE+IDogQ0NQcmVkaWNhdGVBY3Rpb248QT4geworICBzdHJpbmcgUHJlZGljYXRlID0gcHJlZGljYXRlOworfQorCisvLy8gQ0NJZkJ5VmFsIC0gSWYgdGhlIGN1cnJlbnQgYXJndW1lbnQgaGFzIEJ5VmFsIHBhcmFtZXRlciBhdHRyaWJ1dGUsIGFwcGx5CisvLy8gQWN0aW9uIEEuCitjbGFzcyBDQ0lmQnlWYWw8Q0NBY3Rpb24gQT4gOiBDQ0lmPCJBcmdGbGFncy5pc0J5VmFsKCkiLCBBPiB7Cit9CisKKy8vLyBDQ0lmQ0MgLSBNYXRjaCBvZiB0aGUgY3VycmVudCBjYWxsaW5nIGNvbnZlbnRpb24gaXMgJ0NDJy4KK2NsYXNzIENDSWZDQzxzdHJpbmcgQ0MsIENDQWN0aW9uIEE+CisgIDogQ0NJZjwhc3RyY29uY2F0KCJTdGF0ZS5nZXRDYWxsaW5nQ29udigpID09ICIsIENDKSwgQT4ge30KKworLy8vIENDSWZJblJlZyAtIElmIHRoaXMgYXJndW1lbnQgaXMgbWFya2VkIHdpdGggdGhlICdpbnJlZycgYXR0cmlidXRlLCBhcHBseQorLy8vIHRoZSBzcGVjaWZpZWQgYWN0aW9uLgorY2xhc3MgQ0NJZkluUmVnPENDQWN0aW9uIEE+IDogQ0NJZjwiQXJnRmxhZ3MuaXNJblJlZygpIiwgQT4ge30KKworLy8vIENDSWZOZXN0IC0gSWYgdGhpcyBhcmd1bWVudCBpcyBtYXJrZWQgd2l0aCB0aGUgJ25lc3QnIGF0dHJpYnV0ZSwgYXBwbHkKKy8vLyB0aGUgc3BlY2lmaWVkIGFjdGlvbi4KK2NsYXNzIENDSWZOZXN0PENDQWN0aW9uIEE+IDogQ0NJZjwiQXJnRmxhZ3MuaXNOZXN0KCkiLCBBPiB7fQorCisvLy8gQ0NJZlNwbGl0IC0gSWYgdGhpcyBhcmd1bWVudCBpcyBtYXJrZWQgd2l0aCB0aGUgJ3NwbGl0JyBhdHRyaWJ1dGUsIGFwcGx5CisvLy8gdGhlIHNwZWNpZmllZCBhY3Rpb24uCitjbGFzcyBDQ0lmU3BsaXQ8Q0NBY3Rpb24gQT4gOiBDQ0lmPCJBcmdGbGFncy5pc1NwbGl0KCkiLCBBPiB7fQorCisvLy8gQ0NJZlNSZXQgLSBJZiB0aGlzIGFyZ3VtZW50IGlzIG1hcmtlZCB3aXRoIHRoZSAnc3JldCcgYXR0cmlidXRlLCBhcHBseQorLy8vIHRoZSBzcGVjaWZpZWQgYWN0aW9uLgorY2xhc3MgQ0NJZlNSZXQ8Q0NBY3Rpb24gQT4gOiBDQ0lmPCJBcmdGbGFncy5pc1NSZXQoKSIsIEE+IHt9CisKKy8vLyBDQ0lmTm90VmFyQXJnIC0gSWYgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaXMgbm90IHZhcmFyZyAtIGFwcGx5IHRoZSBhY3Rpb24KK2NsYXNzIENDSWZOb3RWYXJBcmc8Q0NBY3Rpb24gQT4gOiBDQ0lmPCIhU3RhdGUuaXNWYXJBcmcoKSIsIEE+IHt9CisKKy8vLyBDQ0Fzc2lnblRvUmVnIC0gVGhpcyBhY3Rpb24gbWF0Y2hlcyBpZiB0aGVyZSBpcyBhIHJlZ2lzdGVyIGluIHRoZSBzcGVjaWZpZWQKKy8vLyBsaXN0IHRoYXQgaXMgc3RpbGwgYXZhaWxhYmxlLiAgSWYgc28sIGl0IGFzc2lnbnMgdGhlIHZhbHVlIHRvIHRoZSBmaXJzdAorLy8vIGF2YWlsYWJsZSByZWdpc3RlciBhbmQgc3VjY2VlZHMuCitjbGFzcyBDQ0Fzc2lnblRvUmVnPGxpc3Q8UmVnaXN0ZXI+IHJlZ0xpc3Q+IDogQ0NBY3Rpb24geworICBsaXN0PFJlZ2lzdGVyPiBSZWdMaXN0ID0gcmVnTGlzdDsKK30KKworLy8vIENDQXNzaWduVG9SZWdXaXRoU2hhZG93IC0gU2FtZSBhcyBDQ0Fzc2lnblRvUmVnLCBidXQgd2l0aCBsaXN0IG9mIHJlZ2lzdGVycworLy8vIHdoaWNoIGJlY2FtZSBzaGFkb3dlZCwgd2hlbiBzb21lIHJlZ2lzdGVyIGlzIHVzZWQuCitjbGFzcyBDQ0Fzc2lnblRvUmVnV2l0aFNoYWRvdzxsaXN0PFJlZ2lzdGVyPiByZWdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxSZWdpc3Rlcj4gc2hhZG93TGlzdD4gOiBDQ0FjdGlvbiB7CisgIGxpc3Q8UmVnaXN0ZXI+IFJlZ0xpc3QgPSByZWdMaXN0OworICBsaXN0PFJlZ2lzdGVyPiBTaGFkb3dSZWdMaXN0ID0gc2hhZG93TGlzdDsKK30KKworLy8vIENDQXNzaWduVG9TdGFjayAtIFRoaXMgYWN0aW9uIGFsd2F5cyBtYXRjaGVzOiBpdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byBhCisvLy8gc3RhY2sgc2xvdCBvZiB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIGFsaWdubWVudCBvbiB0aGUgc3RhY2suICBJZiBzaXplIGlzCisvLy8gemVybyB0aGVuIHRoZSBBQkkgc2l6ZSBpcyB1c2VkOyBpZiBhbGlnbiBpcyB6ZXJvIHRoZW4gdGhlIEFCSSBhbGlnbm1lbnQKKy8vLyBpcyB1c2VkIC0gdGhlc2UgbWF5IGRlcGVuZCBvbiB0aGUgdGFyZ2V0IG9yIHN1YnRhcmdldC4KK2NsYXNzIENDQXNzaWduVG9TdGFjazxpbnQgc2l6ZSwgaW50IGFsaWduPiA6IENDQWN0aW9uIHsKKyAgaW50IFNpemUgPSBzaXplOworICBpbnQgQWxpZ24gPSBhbGlnbjsKK30KKworLy8vIENDQXNzaWduVG9TdGFja1dpdGhTaGFkb3cgLSBTYW1lIGFzIENDQXNzaWduVG9TdGFjaywgYnV0IHdpdGggYSByZWdpc3RlcgorLy8vIHRvIGJlIHNoYWRvd2VkLgorY2xhc3MgQ0NBc3NpZ25Ub1N0YWNrV2l0aFNoYWRvdzxpbnQgc2l6ZSwgaW50IGFsaWduLCBSZWdpc3RlciByZWc+IDoKKyAgICAgICAgQ0NBc3NpZ25Ub1N0YWNrPHNpemUsIGFsaWduPiB7CisgIFJlZ2lzdGVyIFNoYWRvd1JlZyA9IHJlZzsKK30KKworLy8vIENDUGFzc0J5VmFsIC0gVGhpcyBhY3Rpb24gYWx3YXlzIG1hdGNoZXM6IGl0IGFzc2lnbnMgdGhlIHZhbHVlIHRvIGEgc3RhY2sKKy8vLyBzbG90IHRvIGltcGxlbWVudCBCeVZhbCBhZ2dyZWdhdGUgcGFyYW1ldGVyIHBhc3NpbmcuIFNpemUgYW5kIGFsaWdubWVudAorLy8vIHNwZWNpZnkgdGhlIG1pbmltdW0gc2l6ZSBhbmQgYWxpZ25tZW50IGZvciB0aGUgc3RhY2sgc2xvdC4KK2NsYXNzIENDUGFzc0J5VmFsPGludCBzaXplLCBpbnQgYWxpZ24+IDogQ0NBY3Rpb24geworICBpbnQgU2l6ZSA9IHNpemU7CisgIGludCBBbGlnbiA9IGFsaWduOworfQorCisvLy8gQ0NQcm9tb3RlVG9UeXBlIC0gSWYgYXBwbGllZCwgdGhpcyBwcm9tb3RlcyB0aGUgc3BlY2lmaWVkIGN1cnJlbnQgdmFsdWUgdG8KKy8vLyB0aGUgc3BlY2lmaWVkIHR5cGUuCitjbGFzcyBDQ1Byb21vdGVUb1R5cGU8VmFsdWVUeXBlIGRlc3RUeT4gOiBDQ0FjdGlvbiB7CisgIFZhbHVlVHlwZSBEZXN0VHkgPSBkZXN0VHk7Cit9CisKKy8vLyBDQ0JpdENvbnZlcnRUb1R5cGUgLSBJZiBhcHBsaWVkLCB0aGlzIGJpdGNvbnZlcnRzIHRoZSBzcGVjaWZpZWQgY3VycmVudAorLy8vIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KK2NsYXNzIENDQml0Q29udmVydFRvVHlwZTxWYWx1ZVR5cGUgZGVzdFR5PiA6IENDQWN0aW9uIHsKKyAgVmFsdWVUeXBlIERlc3RUeSA9IGRlc3RUeTsKK30KKworLy8vIENDUGFzc0luZGlyZWN0IC0gSWYgYXBwbGllZCwgdGhpcyBzdG9yZXMgdGhlIHZhbHVlIHRvIHN0YWNrIGFuZCBwYXNzZXMgdGhlIHBvaW50ZXIKKy8vLyBhcyBub3JtYWwgYXJndW1lbnQuCitjbGFzcyBDQ1Bhc3NJbmRpcmVjdDxWYWx1ZVR5cGUgZGVzdFR5PiA6IENDQWN0aW9uIHsKKyAgVmFsdWVUeXBlIERlc3RUeSA9IGRlc3RUeTsKK30KKworLy8vIENDRGVsZWdhdGVUbyAtIFRoaXMgYWN0aW9uIGludm9rZXMgdGhlIHNwZWNpZmllZCBzdWItY2FsbGluZy1jb252ZW50aW9uLiAgSXQKKy8vLyBpcyBzdWNjZXNzZnVsIGlmIHRoZSBzcGVjaWZpZWQgQ0MgbWF0Y2hlcy4KK2NsYXNzIENDRGVsZWdhdGVUbzxDYWxsaW5nQ29udiBjYz4gOiBDQ0FjdGlvbiB7CisgIENhbGxpbmdDb252IENDID0gY2M7Cit9CisKKy8vLyBDYWxsaW5nQ29udiAtIEFuIGluc3RhbmNlIG9mIHRoaXMgaXMgdXNlZCB0byBkZWZpbmUgZWFjaCBjYWxsaW5nIGNvbnZlbnRpb24KKy8vLyB0aGF0IHRoZSB0YXJnZXQgc3VwcG9ydHMuCitjbGFzcyBDYWxsaW5nQ29udjxsaXN0PENDQWN0aW9uPiBhY3Rpb25zPiB7CisgIGxpc3Q8Q0NBY3Rpb24+IEFjdGlvbnMgPSBhY3Rpb25zOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXREYXRhLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldERhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzI0NjFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXREYXRhLmgKQEAgLTAsMCArMSwzMzUgQEAKKy8vPT09LS0gbGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIC0gRGF0YSBzaXplICYgYWxpZ25tZW50IGluZm8gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGFyZ2V0IHByb3BlcnRpZXMgcmVsYXRlZCB0byBkYXRhdHlwZSBzaXplL29mZnNldC9hbGlnbm1lbnQKKy8vIGluZm9ybWF0aW9uLiAgSXQgdXNlcyBsYXp5IGFubm90YXRpb25zIHRvIGNhY2hlIGluZm9ybWF0aW9uIGFib3V0IGhvdworLy8gc3RydWN0dXJlIHR5cGVzIGFyZSBsYWlkIG91dCBhbmQgdXNlZC4KKy8vCisvLyBUaGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgY3JlYXRlZCBvbmNlLCBmaWxsZWQgaW4gaWYgdGhlIGRlZmF1bHRzIGFyZSBub3QKKy8vIGNvcnJlY3QgYW5kIHRoZW4gcGFzc2VkIGFyb3VuZCBieSBjb25zdCYuICBOb25lIG9mIHRoZSBtZW1iZXJzIGZ1bmN0aW9ucworLy8gcmVxdWlyZSBtb2RpZmljYXRpb24gdG8gdGhlIG9iamVjdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVERBVEFfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVREQVRBX0gKKworI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVmFsdWU7CitjbGFzcyBUeXBlOworY2xhc3MgSW50ZWdlclR5cGU7CitjbGFzcyBTdHJ1Y3RUeXBlOworY2xhc3MgU3RydWN0TGF5b3V0OworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBMTFZNQ29udGV4dDsKKworLy8vIEVudW0gdXNlZCB0byBjYXRlZ29yaXplIHRoZSBhbGlnbm1lbnQgdHlwZXMgc3RvcmVkIGJ5IFRhcmdldEFsaWduRWxlbQorZW51bSBBbGlnblR5cGVFbnVtIHsKKyAgSU5URUdFUl9BTElHTiA9ICdpJywgICAgICAgICAgICAgICAvLy88IEludGVnZXIgdHlwZSBhbGlnbm1lbnQKKyAgVkVDVE9SX0FMSUdOID0gJ3YnLCAgICAgICAgICAgICAgICAvLy88IFZlY3RvciB0eXBlIGFsaWdubWVudAorICBGTE9BVF9BTElHTiA9ICdmJywgICAgICAgICAgICAgICAgIC8vLzwgRmxvYXRpbmcgcG9pbnQgdHlwZSBhbGlnbm1lbnQKKyAgQUdHUkVHQVRFX0FMSUdOID0gJ2EnLCAgICAgICAgICAgICAvLy88IEFnZ3JlZ2F0ZSBhbGlnbm1lbnQKKyAgU1RBQ0tfQUxJR04gPSAncycgICAgICAgICAgICAgICAgICAvLy88IFN0YWNrIG9iamVjdHMgYWxpZ25tZW50Cit9OworLy8vIFRhcmdldCBhbGlnbm1lbnQgZWxlbWVudC4KKy8vLworLy8vIFN0b3JlcyB0aGUgYWxpZ25tZW50IGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYWxpZ25tZW50IHR5cGUgKHBvaW50ZXIsCisvLy8gaW50ZWdlciwgdmVjdG9yLCBmbG9hdCkgYW5kIHR5cGUgYml0IHdpZHRoLgorLy8vCisvLy8gQG5vdGUgVGhlIHVudXN1YWwgb3JkZXIgb2YgZWxlbWVudHMgaW4gdGhlIHN0cnVjdHVyZSBhdHRlbXB0cyB0byByZWR1Y2UKKy8vLyBwYWRkaW5nIGFuZCBtYWtlIHRoZSBzdHJ1Y3R1cmUgc2xpZ2h0bHkgbW9yZSBjYWNoZSBmcmllbmRseS4KK3N0cnVjdCBUYXJnZXRBbGlnbkVsZW0geworICBBbGlnblR5cGVFbnVtICAgICAgIEFsaWduVHlwZSA6IDg7ICAvLzwgQWxpZ25tZW50IHR5cGUgKEFsaWduVHlwZUVudW0pCisgIHVuc2lnbmVkIGNoYXIgICAgICAgQUJJQWxpZ247ICAgICAgIC8vPCBBQkkgYWxpZ25tZW50IGZvciB0aGlzIHR5cGUvYml0dworICB1bnNpZ25lZCBjaGFyICAgICAgIFByZWZBbGlnbjsgICAgICAvLzwgUHJlZi4gYWxpZ25tZW50IGZvciB0aGlzIHR5cGUvYml0dworICB1aW50MzJfdCAgICAgICAgICAgIFR5cGVCaXRXaWR0aDsgICAvLzwgVHlwZSBiaXQgd2lkdGgKKworICAvLy8gSW5pdGlhbGl6ZXIKKyAgc3RhdGljIFRhcmdldEFsaWduRWxlbSBnZXQoQWxpZ25UeXBlRW51bSBhbGlnbl90eXBlLCB1bnNpZ25lZCBjaGFyIGFiaV9hbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwcmVmX2FsaWduLCB1aW50MzJfdCBiaXRfd2lkdGgpOworICAvLy8gRXF1YWxpdHkgcHJlZGljYXRlCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUYXJnZXRBbGlnbkVsZW0gJnJocykgY29uc3Q7Cit9OworCitjbGFzcyBUYXJnZXREYXRhIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworcHJpdmF0ZToKKyAgYm9vbCAgICAgICAgICBMaXR0bGVFbmRpYW47ICAgICAgICAgIC8vLzwgRGVmYXVsdHMgdG8gZmFsc2UKKyAgdW5zaWduZWQgY2hhciBQb2ludGVyTWVtU2l6ZTsgICAgICAgIC8vLzwgUG9pbnRlciBzaXplIGluIGJ5dGVzCisgIHVuc2lnbmVkIGNoYXIgUG9pbnRlckFCSUFsaWduOyAgICAgICAvLy88IFBvaW50ZXIgQUJJIGFsaWdubWVudAorICB1bnNpZ25lZCBjaGFyIFBvaW50ZXJQcmVmQWxpZ247ICAgICAgLy8vPCBQb2ludGVyIHByZWZlcnJlZCBhbGlnbm1lbnQKKworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCBjaGFyLCA4PiBMZWdhbEludFdpZHRoczsgLy8vPCBMZWdhbCBJbnRlZ2Vycy4KKyAgCisgIC8vLyBBbGlnbm1lbnRzLSBXaGVyZSB0aGUgcHJpbWl0aXZlIHR5cGUgYWxpZ25tZW50IGRhdGEgaXMgc3RvcmVkLgorICAvLy8KKyAgLy8vIEBzYSBpbml0KCkuCisgIC8vLyBAbm90ZSBDb3VsZCBzdXBwb3J0IG11bHRpcGxlIHNpemUgcG9pbnRlciBhbGlnbm1lbnRzLCBlLmcuLCAzMi1iaXQKKyAgLy8vIHBvaW50ZXJzIHZzLiA2NC1iaXQgcG9pbnRlcnMgYnkgZXh0ZW5kaW5nIFRhcmdldEFsaWdubWVudCwgYnV0IGZvciBub3csCisgIC8vLyB3ZSBkb24ndC4KKyAgU21hbGxWZWN0b3I8VGFyZ2V0QWxpZ25FbGVtLCAxNj4gQWxpZ25tZW50czsKKyAgCisgIC8vLyBJbnZhbGlkQWxpZ25tZW50RWxlbSAtIFRoaXMgbWVtYmVyIGlzIGEgc2lnbmFsIHRoYXQgYSByZXF1ZXN0ZWQgYWxpZ25tZW50CisgIC8vLyB0eXBlIGFuZCBiaXQgd2lkdGggd2VyZSBub3QgZm91bmQgaW4gdGhlIFNtYWxsVmVjdG9yLgorICBzdGF0aWMgY29uc3QgVGFyZ2V0QWxpZ25FbGVtIEludmFsaWRBbGlnbm1lbnRFbGVtOworCisgIC8vIFRoZSBTdHJ1Y3RUeXBlIC0+IFN0cnVjdExheW91dCBtYXAuCisgIG11dGFibGUgdm9pZCAqTGF5b3V0TWFwOworCisgIC8vISBTZXQvaW5pdGlhbGl6ZSB0YXJnZXQgYWxpZ25tZW50cworICB2b2lkIHNldEFsaWdubWVudChBbGlnblR5cGVFbnVtIGFsaWduX3R5cGUsIHVuc2lnbmVkIGNoYXIgYWJpX2FsaWduLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHByZWZfYWxpZ24sIHVpbnQzMl90IGJpdF93aWR0aCk7CisgIHVuc2lnbmVkIGdldEFsaWdubWVudEluZm8oQWxpZ25UeXBlRW51bSBhbGlnbl90eXBlLCB1aW50MzJfdCBiaXRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBQklBbGlnbiwgY29uc3QgVHlwZSAqVHkpIGNvbnN0OworICAvLyEgSW50ZXJuYWwgaGVscGVyIG1ldGhvZCB0aGF0IHJldHVybnMgcmVxdWVzdGVkIGFsaWdubWVudCBmb3IgdHlwZS4KKyAgdW5zaWduZWQgY2hhciBnZXRBbGlnbm1lbnQoY29uc3QgVHlwZSAqVHksIGJvb2wgYWJpX29yX3ByZWYpIGNvbnN0OworCisgIC8vLyBWYWxpZCBhbGlnbm1lbnQgcHJlZGljYXRlLgorICAvLy8KKyAgLy8vIFByZWRpY2F0ZSB0aGF0IHRlc3RzIGEgVGFyZ2V0QWxpZ25FbGVtIHJlZmVyZW5jZSByZXR1cm5lZCBieSBnZXQoKSBhZ2FpbnN0CisgIC8vLyBJbnZhbGlkQWxpZ25tZW50RWxlbS4KKyAgYm9vbCB2YWxpZEFsaWdubWVudChjb25zdCBUYXJnZXRBbGlnbkVsZW0gJmFsaWduKSBjb25zdCB7CisgICAgcmV0dXJuICZhbGlnbiAhPSAmSW52YWxpZEFsaWdubWVudEVsZW07CisgIH0KKworcHVibGljOgorICAvLy8gRGVmYXVsdCBjdG9yLgorICAvLy8KKyAgLy8vIEBub3RlIFRoaXMgaGFzIHRvIGV4aXN0LCBiZWNhdXNlIHRoaXMgaXMgYSBwYXNzLCBidXQgaXQgc2hvdWxkIG5ldmVyIGJlCisgIC8vLyB1c2VkLgorICBUYXJnZXREYXRhKCk7CisgIAorICAvLy8gQ29uc3RydWN0cyBhIFRhcmdldERhdGEgZnJvbSBhIHNwZWNpZmljYXRpb24gc3RyaW5nLiBTZWUgaW5pdCgpLgorICBleHBsaWNpdCBUYXJnZXREYXRhKFN0cmluZ1JlZiBUYXJnZXREZXNjcmlwdGlvbikKKyAgICA6IEltbXV0YWJsZVBhc3MoSUQpIHsKKyAgICBpbml0KFRhcmdldERlc2NyaXB0aW9uKTsKKyAgfQorCisgIC8vLyBJbml0aWFsaXplIHRhcmdldCBkYXRhIGZyb20gcHJvcGVydGllcyBzdG9yZWQgaW4gdGhlIG1vZHVsZS4KKyAgZXhwbGljaXQgVGFyZ2V0RGF0YShjb25zdCBNb2R1bGUgKk0pOworCisgIFRhcmdldERhdGEoY29uc3QgVGFyZ2V0RGF0YSAmVEQpIDoKKyAgICBJbW11dGFibGVQYXNzKElEKSwKKyAgICBMaXR0bGVFbmRpYW4oVEQuaXNMaXR0bGVFbmRpYW4oKSksCisgICAgUG9pbnRlck1lbVNpemUoVEQuUG9pbnRlck1lbVNpemUpLAorICAgIFBvaW50ZXJBQklBbGlnbihURC5Qb2ludGVyQUJJQWxpZ24pLAorICAgIFBvaW50ZXJQcmVmQWxpZ24oVEQuUG9pbnRlclByZWZBbGlnbiksCisgICAgTGVnYWxJbnRXaWR0aHMoVEQuTGVnYWxJbnRXaWR0aHMpLAorICAgIEFsaWdubWVudHMoVEQuQWxpZ25tZW50cyksCisgICAgTGF5b3V0TWFwKDApCisgIHsgfQorCisgIH5UYXJnZXREYXRhKCk7ICAvLyBOb3QgdmlydHVhbCwgZG8gbm90IHN1YmNsYXNzIHRoaXMgY2xhc3MKKworICAvLyEgUGFyc2UgYSB0YXJnZXQgZGF0YSBsYXlvdXQgc3RyaW5nIGFuZCBpbml0aWFsaXplIFRhcmdldERhdGEgYWxpZ25tZW50cy4KKyAgdm9pZCBpbml0KFN0cmluZ1JlZiBUYXJnZXREZXNjcmlwdGlvbik7CisKKyAgLy8vIFRhcmdldCBlbmRpYW5uZXNzLi4uCisgIGJvb2wgaXNMaXR0bGVFbmRpYW4oKSBjb25zdCB7IHJldHVybiBMaXR0bGVFbmRpYW47IH0KKyAgYm9vbCBpc0JpZ0VuZGlhbigpIGNvbnN0IHsgcmV0dXJuICFMaXR0bGVFbmRpYW47IH0KKworICAvLy8gZ2V0U3RyaW5nUmVwcmVzZW50YXRpb24gLSBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgLy8vIFRhcmdldERhdGEuICBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIGluIHRoZSBzYW1lIGZvcm1hdCBhY2NlcHRlZCBieSB0aGUKKyAgLy8vIHN0cmluZyBjb25zdHJ1Y3RvciBhYm92ZS4KKyAgc3RkOjpzdHJpbmcgZ2V0U3RyaW5nUmVwcmVzZW50YXRpb24oKSBjb25zdDsKKyAgCisgIC8vLyBpc0xlZ2FsSW50ZWdlciAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcworICAvLy8ga25vd24gdG9iZSBhIG5hdGl2ZSBpbnRlZ2VyIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBDUFUuICBGb3IgZXhhbXBsZSwKKyAgLy8vIGk2NCBpcyBub3QgbmF0aXZlIG9uIG1vc3QgMzItYml0IENQVXMgYW5kIGkzNyBpcyBub3QgbmF0aXZlIG9uIGFueSBrbm93bgorICAvLy8gb25lLiAgVGhpcyByZXR1cm5zIGZhbHNlIGlmIHRoZSBpbnRlZ2VyIHdpZHRoIGlzIG5vdCBsZWdhbC4KKyAgLy8vCisgIC8vLyBUaGUgd2lkdGggaXMgc3BlY2lmaWVkIGluIGJpdHMuCisgIC8vLworICBib29sIGlzTGVnYWxJbnRlZ2VyKHVuc2lnbmVkIFdpZHRoKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9ICh1bnNpZ25lZClMZWdhbEludFdpZHRocy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKExlZ2FsSW50V2lkdGhzW2ldID09IFdpZHRoKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIGJvb2wgaXNJbGxlZ2FsSW50ZWdlcih1bnNpZ25lZCBXaWR0aCkgY29uc3QgeworICAgIHJldHVybiAhaXNMZWdhbEludGVnZXIoV2lkdGgpOworICB9CisgIAorICAvLy8gVGFyZ2V0IHBvaW50ZXIgYWxpZ25tZW50CisgIHVuc2lnbmVkIGNoYXIgZ2V0UG9pbnRlckFCSUFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIFBvaW50ZXJBQklBbGlnbjsgfQorICAvLy8gUmV0dXJuIHRhcmdldCdzIGFsaWdubWVudCBmb3Igc3RhY2stYmFzZWQgcG9pbnRlcnMKKyAgdW5zaWduZWQgY2hhciBnZXRQb2ludGVyUHJlZkFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIFBvaW50ZXJQcmVmQWxpZ247IH0KKyAgLy8vIFRhcmdldCBwb2ludGVyIHNpemUKKyAgdW5zaWduZWQgY2hhciBnZXRQb2ludGVyU2l6ZSgpICAgICAgICAgY29uc3QgeyByZXR1cm4gUG9pbnRlck1lbVNpemU7IH0KKyAgLy8vIFRhcmdldCBwb2ludGVyIHNpemUsIGluIGJpdHMKKyAgdW5zaWduZWQgY2hhciBnZXRQb2ludGVyU2l6ZUluQml0cygpICAgY29uc3QgeyByZXR1cm4gOCpQb2ludGVyTWVtU2l6ZTsgfQorCisgIC8vLyBTaXplIGV4YW1wbGVzOgorICAvLy8KKyAgLy8vIFR5cGUgICAgICAgIFNpemVJbkJpdHMgIFN0b3JlU2l6ZUluQml0cyAgQWxsb2NTaXplSW5CaXRzWypdCisgIC8vLyAtLS0tICAgICAgICAtLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLQorICAvLy8gIGkxICAgICAgICAgICAgMSAgICAgICAgICAgOCAgICAgICAgICAgICAgICA4CisgIC8vLyAgaTggICAgICAgICAgICA4ICAgICAgICAgICA4ICAgICAgICAgICAgICAgIDgKKyAgLy8vICBpMTkgICAgICAgICAgMTkgICAgICAgICAgMjQgICAgICAgICAgICAgICAzMgorICAvLy8gIGkzMiAgICAgICAgICAzMiAgICAgICAgICAzMiAgICAgICAgICAgICAgIDMyCisgIC8vLyAgaTEwMCAgICAgICAgMTAwICAgICAgICAgMTA0ICAgICAgICAgICAgICAxMjgKKyAgLy8vICBpMTI4ICAgICAgICAxMjggICAgICAgICAxMjggICAgICAgICAgICAgIDEyOAorICAvLy8gIEZsb2F0ICAgICAgICAzMiAgICAgICAgICAzMiAgICAgICAgICAgICAgIDMyCisgIC8vLyAgRG91YmxlICAgICAgIDY0ICAgICAgICAgIDY0ICAgICAgICAgICAgICAgNjQKKyAgLy8vICBYODZfRlA4MCAgICAgODAgICAgICAgICAgODAgICAgICAgICAgICAgICA5NgorICAvLy8KKyAgLy8vIFsqXSBUaGUgYWxsb2Mgc2l6ZSBkZXBlbmRzIG9uIHRoZSBhbGlnbm1lbnQsIGFuZCB0aHVzIG9uIHRoZSB0YXJnZXQuCisgIC8vLyAgICAgVGhlc2UgdmFsdWVzIGFyZSBmb3IgeDg2LTMyIGxpbnV4LgorCisgIC8vLyBnZXRUeXBlU2l6ZUluQml0cyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIGhvbGQgdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZS4gIEZvciBleGFtcGxlLCByZXR1cm5zIDM2IGZvciBpMzYgYW5kIDgwIGZvciB4ODZfZnA4MC4KKyAgdWludDY0X3QgZ2V0VHlwZVNpemVJbkJpdHMoY29uc3QgVHlwZSogVHkpIGNvbnN0OworCisgIC8vLyBnZXRUeXBlU3RvcmVTaXplIC0gUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IG1heSBiZQorICAvLy8gb3ZlcndyaXR0ZW4gYnkgc3RvcmluZyB0aGUgc3BlY2lmaWVkIHR5cGUuICBGb3IgZXhhbXBsZSwgcmV0dXJucyA1CisgIC8vLyBmb3IgaTM2IGFuZCAxMCBmb3IgeDg2X2ZwODAuCisgIHVpbnQ2NF90IGdldFR5cGVTdG9yZVNpemUoY29uc3QgVHlwZSAqVHkpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldFR5cGVTaXplSW5CaXRzKFR5KSs3KS84OworICB9CisKKyAgLy8vIGdldFR5cGVTdG9yZVNpemVJbkJpdHMgLSBSZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgdGhhdCBtYXkgYmUKKyAgLy8vIG92ZXJ3cml0dGVuIGJ5IHN0b3JpbmcgdGhlIHNwZWNpZmllZCB0eXBlOyBhbHdheXMgYSBtdWx0aXBsZSBvZiA4LiAgRm9yCisgIC8vLyBleGFtcGxlLCByZXR1cm5zIDQwIGZvciBpMzYgYW5kIDgwIGZvciB4ODZfZnA4MC4KKyAgdWludDY0X3QgZ2V0VHlwZVN0b3JlU2l6ZUluQml0cyhjb25zdCBUeXBlICpUeSkgY29uc3QgeworICAgIHJldHVybiA4KmdldFR5cGVTdG9yZVNpemUoVHkpOworICB9CisKKyAgLy8vIGdldFR5cGVBbGxvY1NpemUgLSBSZXR1cm4gdGhlIG9mZnNldCBpbiBieXRlcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgb2JqZWN0cworICAvLy8gb2YgdGhlIHNwZWNpZmllZCB0eXBlLCBpbmNsdWRpbmcgYWxpZ25tZW50IHBhZGRpbmcuICBUaGlzIGlzIHRoZSBhbW91bnQKKyAgLy8vIHRoYXQgYWxsb2NhIHJlc2VydmVzIGZvciB0aGlzIHR5cGUuICBGb3IgZXhhbXBsZSwgcmV0dXJucyAxMiBvciAxNiBmb3IKKyAgLy8vIHg4Nl9mcDgwLCBkZXBlbmRpbmcgb24gYWxpZ25tZW50LgorICB1aW50NjRfdCBnZXRUeXBlQWxsb2NTaXplKGNvbnN0IFR5cGUqIFR5KSBjb25zdCB7CisgICAgLy8gUm91bmQgdXAgdG8gdGhlIG5leHQgYWxpZ25tZW50IGJvdW5kYXJ5LgorICAgIHJldHVybiBSb3VuZFVwQWxpZ25tZW50KGdldFR5cGVTdG9yZVNpemUoVHkpLCBnZXRBQklUeXBlQWxpZ25tZW50KFR5KSk7CisgIH0KKworICAvLy8gZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyAtIFJldHVybiB0aGUgb2Zmc2V0IGluIGJpdHMgYmV0d2VlbiBzdWNjZXNzaXZlCisgIC8vLyBvYmplY3RzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSwgaW5jbHVkaW5nIGFsaWdubWVudCBwYWRkaW5nOyBhbHdheXMgYQorICAvLy8gbXVsdGlwbGUgb2YgOC4gIFRoaXMgaXMgdGhlIGFtb3VudCB0aGF0IGFsbG9jYSByZXNlcnZlcyBmb3IgdGhpcyB0eXBlLgorICAvLy8gRm9yIGV4YW1wbGUsIHJldHVybnMgOTYgb3IgMTI4IGZvciB4ODZfZnA4MCwgZGVwZW5kaW5nIG9uIGFsaWdubWVudC4KKyAgdWludDY0X3QgZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyhjb25zdCBUeXBlKiBUeSkgY29uc3QgeworICAgIHJldHVybiA4KmdldFR5cGVBbGxvY1NpemUoVHkpOworICB9CisKKyAgLy8vIGdldEFCSVR5cGVBbGlnbm1lbnQgLSBSZXR1cm4gdGhlIG1pbmltdW0gQUJJLXJlcXVpcmVkIGFsaWdubWVudCBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZS4KKyAgdW5zaWduZWQgY2hhciBnZXRBQklUeXBlQWxpZ25tZW50KGNvbnN0IFR5cGUgKlR5KSBjb25zdDsKKyAgCisgIC8vLyBnZXRBQklJbnRlZ2VyVHlwZUFsaWdubWVudCAtIFJldHVybiB0aGUgbWluaW11bSBBQkktcmVxdWlyZWQgYWxpZ25tZW50IGZvcgorICAvLy8gYW4gaW50ZWdlciB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYml0d2lkdGguCisgIHVuc2lnbmVkIGNoYXIgZ2V0QUJJSW50ZWdlclR5cGVBbGlnbm1lbnQodW5zaWduZWQgQml0V2lkdGgpIGNvbnN0OworICAKKworICAvLy8gZ2V0Q2FsbEZyYW1lVHlwZUFsaWdubWVudCAtIFJldHVybiB0aGUgbWluaW11bSBBQkktcmVxdWlyZWQgYWxpZ25tZW50CisgIC8vLyBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIHdoZW4gaXQgaXMgcGFydCBvZiBhIGNhbGwgZnJhbWUuCisgIHVuc2lnbmVkIGNoYXIgZ2V0Q2FsbEZyYW1lVHlwZUFsaWdubWVudChjb25zdCBUeXBlICpUeSkgY29uc3Q7CisKKworICAvLy8gZ2V0UHJlZlR5cGVBbGlnbm1lbnQgLSBSZXR1cm4gdGhlIHByZWZlcnJlZCBzdGFjay9nbG9iYWwgYWxpZ25tZW50IGZvcgorICAvLy8gdGhlIHNwZWNpZmllZCB0eXBlLiAgVGhpcyBpcyBhbHdheXMgYXQgbGVhc3QgYXMgZ29vZCBhcyB0aGUgQUJJIGFsaWdubWVudC4KKyAgdW5zaWduZWQgY2hhciBnZXRQcmVmVHlwZUFsaWdubWVudChjb25zdCBUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIGdldFByZWZlcnJlZFR5cGVBbGlnbm1lbnRTaGlmdCAtIFJldHVybiB0aGUgcHJlZmVycmVkIGFsaWdubWVudCBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZSwgcmV0dXJuZWQgYXMgbG9nMiBvZiB0aGUgdmFsdWUgKGEgc2hpZnQgYW1vdW50KS4KKyAgLy8vCisgIHVuc2lnbmVkIGNoYXIgZ2V0UHJlZmVycmVkVHlwZUFsaWdubWVudFNoaWZ0KGNvbnN0IFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gZ2V0SW50UHRyVHlwZSAtIFJldHVybiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhhdCBpcyB0aGUgc2FtZSBzaXplIG9yCisgIC8vLyBncmVhdGVyIHRvIHRoZSBob3N0IHBvaW50ZXIgc2l6ZS4KKyAgLy8vCisgIGNvbnN0IEludGVnZXJUeXBlICpnZXRJbnRQdHJUeXBlKExMVk1Db250ZXh0ICZDKSBjb25zdDsKKworICAvLy8gZ2V0SW5kZXhlZE9mZnNldCAtIHJldHVybiB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdHlwZSBmb3IKKyAgLy8vIHRoZSBzcGVjaWZpZWQgaW5kaWNlcy4gIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgZ2V0ZWxlbWVudHB0ci4KKyAgLy8vCisgIHVpbnQ2NF90IGdldEluZGV4ZWRPZmZzZXQoY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUqIGNvbnN0KiBJbmRpY2VzLCB1bnNpZ25lZCBOdW1JbmRpY2VzKSBjb25zdDsKKworICAvLy8gZ2V0U3RydWN0TGF5b3V0IC0gUmV0dXJuIGEgU3RydWN0TGF5b3V0IG9iamVjdCwgaW5kaWNhdGluZyB0aGUgYWxpZ25tZW50CisgIC8vLyBvZiB0aGUgc3RydWN0LCBpdHMgc2l6ZSwgYW5kIHRoZSBvZmZzZXRzIG9mIGl0cyBmaWVsZHMuICBOb3RlIHRoYXQgdGhpcworICAvLy8gaW5mb3JtYXRpb24gaXMgbGF6aWx5IGNhY2hlZC4KKyAgY29uc3QgU3RydWN0TGF5b3V0ICpnZXRTdHJ1Y3RMYXlvdXQoY29uc3QgU3RydWN0VHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBJbnZhbGlkYXRlU3RydWN0TGF5b3V0SW5mbyAtIFRhcmdldERhdGEgc3BlY3VsYXRpdmVseSBjYWNoZXMgU3RydWN0TGF5b3V0CisgIC8vLyBvYmplY3RzLiAgSWYgYSBUYXJnZXREYXRhIG9iamVjdCBpcyBhbGl2ZSB3aGVuIHR5cGVzIGFyZSBiZWluZyByZWZpbmVkIGFuZAorICAvLy8gcmVtb3ZlZCwgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBTdHJ1Y3RUeXBlIGlzIHJlbW92ZWQgdG8KKyAgLy8vIGF2b2lkIGEgZGFuZ2xpbmcgcG9pbnRlciBpbiB0aGlzIGNhY2hlLgorICB2b2lkIEludmFsaWRhdGVTdHJ1Y3RMYXlvdXRJbmZvKGNvbnN0IFN0cnVjdFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gZ2V0UHJlZmVycmVkQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBwcmVmZXJyZWQgYWxpZ25tZW50IG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGdsb2JhbC4gIFRoaXMgaW5jbHVkZXMgYW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgYWxpZ25tZW50IChpZiB0aGUgZ2xvYmFsCisgIC8vLyBoYXMgb25lKS4KKyAgdW5zaWduZWQgZ2V0UHJlZmVycmVkQWxpZ25tZW50KGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgY29uc3Q7CisKKyAgLy8vIGdldFByZWZlcnJlZEFsaWdubWVudExvZyAtIFJldHVybiB0aGUgcHJlZmVycmVkIGFsaWdubWVudCBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCBnbG9iYWwsIHJldHVybmVkIGluIGxvZyBmb3JtLiAgVGhpcyBpbmNsdWRlcyBhbiBleHBsaWNpdGx5CisgIC8vLyByZXF1ZXN0ZWQgYWxpZ25tZW50IChpZiB0aGUgZ2xvYmFsIGhhcyBvbmUpLgorICB1bnNpZ25lZCBnZXRQcmVmZXJyZWRBbGlnbm1lbnRMb2coY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKSBjb25zdDsKKworICAvLy8gUm91bmRVcEFsaWdubWVudCAtIFJvdW5kIHRoZSBzcGVjaWZpZWQgdmFsdWUgdXAgdG8gdGhlIG5leHQgYWxpZ25tZW50CisgIC8vLyBib3VuZGFyeSBzcGVjaWZpZWQgYnkgQWxpZ25tZW50LiAgRm9yIGV4YW1wbGUsIDcgcm91bmRlZCB1cCB0byBhbgorICAvLy8gYWxpZ25tZW50IGJvdW5kYXJ5IG9mIDQgaXMgOC4gIDggcm91bmRlZCB1cCB0byB0aGUgYWxpZ25tZW50IGJvdW5kYXJ5IG9mIDQKKyAgLy8vIGlzIDggYmVjYXVzZSBpdCBpcyBhbHJlYWR5IGFsaWduZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVSW50VHk+CisgIHN0YXRpYyBVSW50VHkgUm91bmRVcEFsaWdubWVudChVSW50VHkgVmFsLCB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgICBhc3NlcnQoKEFsaWdubWVudCAmIChBbGlnbm1lbnQtMSkpID09IDAgJiYgIkFsaWdubWVudCBtdXN0IGJlIHBvd2VyIG9mIDIhIik7CisgICAgcmV0dXJuIChWYWwgKyAoQWxpZ25tZW50LTEpKSAmIH5VSW50VHkoQWxpZ25tZW50LTEpOworICB9CisgIAorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorfTsKKworLy8vIFN0cnVjdExheW91dCAtIHVzZWQgdG8gbGF6aWx5IGNhbGN1bGF0ZSBzdHJ1Y3R1cmUgbGF5b3V0IGluZm9ybWF0aW9uIGZvciBhCisvLy8gdGFyZ2V0IG1hY2hpbmUsIGJhc2VkIG9uIHRoZSBUYXJnZXREYXRhIHN0cnVjdHVyZS4KKy8vLworY2xhc3MgU3RydWN0TGF5b3V0IHsKKyAgdWludDY0X3QgU3RydWN0U2l6ZTsKKyAgdW5zaWduZWQgU3RydWN0QWxpZ25tZW50OworICB1bnNpZ25lZCBOdW1FbGVtZW50czsKKyAgdWludDY0X3QgTWVtYmVyT2Zmc2V0c1sxXTsgIC8vIHZhcmlhYmxlIHNpemVkIGFycmF5IQorcHVibGljOgorCisgIHVpbnQ2NF90IGdldFNpemVJbkJ5dGVzKCkgY29uc3QgeworICAgIHJldHVybiBTdHJ1Y3RTaXplOworICB9CisKKyAgdWludDY0X3QgZ2V0U2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gOCpTdHJ1Y3RTaXplOworICB9CisKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBTdHJ1Y3RBbGlnbm1lbnQ7CisgIH0KKworICAvLy8gZ2V0RWxlbWVudENvbnRhaW5pbmdPZmZzZXQgLSBHaXZlbiBhIHZhbGlkIGJ5dGUgb2Zmc2V0IGludG8gdGhlIHN0cnVjdHVyZSwKKyAgLy8vIHJldHVybiB0aGUgc3RydWN0dXJlIGluZGV4IHRoYXQgY29udGFpbnMgaXQuCisgIC8vLworICB1bnNpZ25lZCBnZXRFbGVtZW50Q29udGFpbmluZ09mZnNldCh1aW50NjRfdCBPZmZzZXQpIGNvbnN0OworCisgIHVpbnQ2NF90IGdldEVsZW1lbnRPZmZzZXQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KElkeCA8IE51bUVsZW1lbnRzICYmICJJbnZhbGlkIGVsZW1lbnQgaWR4ISIpOworICAgIHJldHVybiBNZW1iZXJPZmZzZXRzW0lkeF07CisgIH0KKworICB1aW50NjRfdCBnZXRFbGVtZW50T2Zmc2V0SW5CaXRzKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiBnZXRFbGVtZW50T2Zmc2V0KElkeCkqODsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGFyZ2V0RGF0YTsgICAvLyBPbmx5IFRhcmdldERhdGEgY2FuIGNyZWF0ZSB0aGlzIGNsYXNzCisgIFN0cnVjdExheW91dChjb25zdCBTdHJ1Y3RUeXBlICpTVCwgY29uc3QgVGFyZ2V0RGF0YSAmVEQpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzVkMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaApAQCAtMCwwICsxLDk3IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEludGVyZmFjZSB0byBkZXNjcmliZSB0aGUgbGF5b3V0IG9mIGEgc3RhY2sgZnJhbWUgb24gdGhlIHRhcmdldCBtYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfVEFSR0VURlJBTUVJTkZPX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfVEFSR0VURlJBTUVJTkZPX0gKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEluZm9ybWF0aW9uIGFib3V0IHN0YWNrIGZyYW1lIGxheW91dCBvbiB0aGUgdGFyZ2V0LiAgSXQgaG9sZHMgdGhlIGRpcmVjdGlvbgorLy8vIG9mIHN0YWNrIGdyb3d0aCwgdGhlIGtub3duIHN0YWNrIGFsaWdubWVudCBvbiBlbnRyeSB0byBlYWNoIGZ1bmN0aW9uLCBhbmQKKy8vLyB0aGUgb2Zmc2V0IHRvIHRoZSBsb2NhbHMgYXJlYS4KKy8vLworLy8vIFRoZSBvZmZzZXQgdG8gdGhlIGxvY2FsIGFyZWEgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFjayBwb2ludGVyIG9uCisvLy8gZnVuY3Rpb24gZW50cnkgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIHdoZXJlIGZ1bmN0aW9uIGRhdGEgKGxvY2FsIHZhcmlhYmxlcywKKy8vLyBzcGlsbCBsb2NhdGlvbnMpIGNhbiBiZSBzdG9yZWQuCitjbGFzcyBUYXJnZXRGcmFtZUluZm8geworcHVibGljOgorICBlbnVtIFN0YWNrRGlyZWN0aW9uIHsKKyAgICBTdGFja0dyb3dzVXAsICAgICAgICAvLyBBZGRpbmcgdG8gdGhlIHN0YWNrIGluY3JlYXNlcyB0aGUgc3RhY2sgYWRkcmVzcworICAgIFN0YWNrR3Jvd3NEb3duICAgICAgIC8vIEFkZGluZyB0byB0aGUgc3RhY2sgZGVjcmVhc2VzIHRoZSBzdGFjayBhZGRyZXNzCisgIH07CisKKyAgLy8gTWFwcyBhIGNhbGxlZSBzYXZlZCByZWdpc3RlciB0byBhIHN0YWNrIHNsb3Qgd2l0aCBhIGZpeGVkIG9mZnNldC4KKyAgc3RydWN0IFNwaWxsU2xvdCB7CisgICAgdW5zaWduZWQgUmVnOworICAgIGludCBPZmZzZXQ7IC8vIE9mZnNldCByZWxhdGl2ZSB0byBzdGFjayBwb2ludGVyIG9uIGZ1bmN0aW9uIGVudHJ5LgorICB9OworcHJpdmF0ZToKKyAgU3RhY2tEaXJlY3Rpb24gU3RhY2tEaXI7CisgIHVuc2lnbmVkIFN0YWNrQWxpZ25tZW50OworICB1bnNpZ25lZCBUcmFuc2llbnRTdGFja0FsaWdubWVudDsKKyAgaW50IExvY2FsQXJlYU9mZnNldDsKK3B1YmxpYzoKKyAgVGFyZ2V0RnJhbWVJbmZvKFN0YWNrRGlyZWN0aW9uIEQsIHVuc2lnbmVkIFN0YWNrQWwsIGludCBMQU8sCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUcmFuc0FsID0gMSkKKyAgICA6IFN0YWNrRGlyKEQpLCBTdGFja0FsaWdubWVudChTdGFja0FsKSwgVHJhbnNpZW50U3RhY2tBbGlnbm1lbnQoVHJhbnNBbCksCisgICAgICBMb2NhbEFyZWFPZmZzZXQoTEFPKSB7fQorCisgIHZpcnR1YWwgflRhcmdldEZyYW1lSW5mbygpOworCisgIC8vIFRoZXNlIG1ldGhvZHMgcmV0dXJuIGluZm9ybWF0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSBhYnN0cmFjdCBzdGFjayBsYXlvdXQKKyAgLy8gb2YgdGhlIHRhcmdldCBtYWNoaW5lLgorCisgIC8vLyBnZXRTdGFja0dyb3d0aERpcmVjdGlvbiAtIFJldHVybiB0aGUgZGlyZWN0aW9uIHRoZSBzdGFjayBncm93cworICAvLy8KKyAgU3RhY2tEaXJlY3Rpb24gZ2V0U3RhY2tHcm93dGhEaXJlY3Rpb24oKSBjb25zdCB7IHJldHVybiBTdGFja0RpcjsgfQorCisgIC8vLyBnZXRTdGFja0FsaWdubWVudCAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0byB3aGljaCB0aGUKKyAgLy8vIHN0YWNrIHBvaW50ZXIgbXVzdCBiZSBhbGlnbmVkIG9uIGVudHJ5IHRvIGEgZnVuY3Rpb24uICBUeXBpY2FsbHksIHRoaXMKKyAgLy8vIGlzIHRoZSBsYXJnZXN0IGFsaWdubWVudCBmb3IgYW55IGRhdGEgb2JqZWN0IGluIHRoZSB0YXJnZXQuCisgIC8vLworICB1bnNpZ25lZCBnZXRTdGFja0FsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIFN0YWNrQWxpZ25tZW50OyB9CisKKyAgLy8vIGdldFRyYW5zaWVudFN0YWNrQWxpZ25tZW50IC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvCisgIC8vLyB3aGljaCB0aGUgc3RhY2sgcG9pbnRlciBtdXN0IGJlIGFsaWduZWQgYXQgYWxsIHRpbWVzLCBldmVuIGJldHdlZW4KKyAgLy8vIGNhbGxzLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0VHJhbnNpZW50U3RhY2tBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIFRyYW5zaWVudFN0YWNrQWxpZ25tZW50OworICB9CisKKyAgLy8vIGdldE9mZnNldE9mTG9jYWxBcmVhIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsb2NhbCBhcmVhCisgIC8vLyBmcm9tIHRoZSBzdGFjayBwb2ludGVyIG9uIGVudHJhbmNlIHRvIGEgZnVuY3Rpb24uCisgIC8vLworICBpbnQgZ2V0T2Zmc2V0T2ZMb2NhbEFyZWEoKSBjb25zdCB7IHJldHVybiBMb2NhbEFyZWFPZmZzZXQ7IH0KKworICAvLy8gZ2V0Q2FsbGVlU2F2ZWRTcGlsbFNsb3RzIC0gVGhpcyBtZXRob2QgcmV0dXJucyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKKyAgLy8vIHBhaXJzLCB0aGF0IGNvbnRhaW5zIGFuIGVudHJ5IGZvciBlYWNoIGNhbGxlZSBzYXZlZCByZWdpc3RlciB0aGF0IG11c3QgYmUKKyAgLy8vIHNwaWxsZWQgdG8gYSBwYXJ0aWN1bGFyIHN0YWNrIGxvY2F0aW9uIGlmIGl0IGlzIHNwaWxsZWQuCisgIC8vLworICAvLy8gRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGNvbnRhaW5zIGEgPHJlZ2lzdGVyLG9mZnNldD4gcGFpciwgaW5kaWNhdGluZyB0aGUKKyAgLy8vIGZpeGVkIG9mZnNldCBmcm9tIHRoZSBpbmNvbWluZyBzdGFjayBwb2ludGVyIHRoYXQgZWFjaCByZWdpc3RlciBzaG91bGQgYmUKKyAgLy8vIHNwaWxsZWQgYXQuIElmIGEgcmVnaXN0ZXIgaXMgbm90IGxpc3RlZCBoZXJlLCB0aGUgY29kZSBnZW5lcmF0b3IgaXMKKyAgLy8vIGFsbG93ZWQgdG8gc3BpbGwgaXQgYW55d2hlcmUgaXQgY2hvb3Nlcy4KKyAgLy8vCisgIHZpcnR1YWwgY29uc3QgU3BpbGxTbG90ICoKKyAgZ2V0Q2FsbGVlU2F2ZWRTcGlsbFNsb3RzKHVuc2lnbmVkICZOdW1FbnRyaWVzKSBjb25zdCB7CisgICAgTnVtRW50cmllcyA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRJbnN0ckRlc2MuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJEZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyN2FlZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJEZXNjLmgKQEAgLTAsMCArMSw1MDYgQEAKKy8vPT09LS0gbGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJEZXNjLmggLSBJbnN0cnVjdGlvbiBEZXNjcmlwdG9ycyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFRhcmdldE9wZXJhbmRJbmZvIGFuZCBUYXJnZXRJbnN0ckRlc2MgY2xhc3Nlcywgd2hpY2gKKy8vIGFyZSB1c2VkIHRvIGRlc2NyaWJlIHRhcmdldCBpbnN0cnVjdGlvbnMgYW5kIHRoZWlyIG9wZXJhbmRzLiAKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVElOU1RSREVTQ19ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVElOU1RSREVTQ19ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYWNoaW5lIE9wZXJhbmQgRmxhZ3MgYW5kIERlc2NyaXB0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAKK25hbWVzcGFjZSBUT0kgeworICAvLyBPcGVyYW5kIGNvbnN0cmFpbnRzCisgIGVudW0gT3BlcmFuZENvbnN0cmFpbnQgeworICAgIFRJRURfVE8gPSAwLCAgICAvLyBNdXN0IGJlIGFsbG9jYXRlZCB0aGUgc2FtZSByZWdpc3RlciBhcy4KKyAgICBFQVJMWV9DTE9CQkVSICAgLy8gT3BlcmFuZCBpcyBhbiBlYXJseSBjbG9iYmVyIHJlZ2lzdGVyIG9wZXJhbmQKKyAgfTsKKyAgCisgIC8vLyBPcGVyYW5kRmxhZ3MgLSBUaGVzZSBhcmUgZmxhZ3Mgc2V0IG9uIG9wZXJhbmRzLCBidXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQKKyAgLy8vIHByaXZhdGUsIGFsbCBhY2Nlc3Mgc2hvdWxkIGdvIHRocm91Z2ggdGhlIFRhcmdldE9wZXJhbmRJbmZvIGFjY2Vzc29ycy4KKyAgLy8vIFNlZSB0aGUgYWNjZXNzb3JzIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlc2UgYXJlLgorICBlbnVtIE9wZXJhbmRGbGFncyB7CisgICAgTG9va3VwUHRyUmVnQ2xhc3MgPSAwLAorICAgIFByZWRpY2F0ZSwKKyAgICBPcHRpb25hbERlZgorICB9OworfQorCisvLy8gVGFyZ2V0T3BlcmFuZEluZm8gLSBUaGlzIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvcGVyYW5kIG9mIGEgbWFjaGluZQorLy8vIGluc3RydWN0aW9uLCBpbmRpY2F0aW5nIHRoZSByZWdpc3RlciBjbGFzcyBmb3IgcmVnaXN0ZXIgb3BlcmFuZHMsIGV0Yy4KKy8vLworY2xhc3MgVGFyZ2V0T3BlcmFuZEluZm8geworcHVibGljOgorICAvLy8gUmVnQ2xhc3MgLSBUaGlzIHNwZWNpZmllcyB0aGUgcmVnaXN0ZXIgY2xhc3MgZW51bWVyYXRpb24gb2YgdGhlIG9wZXJhbmQgCisgIC8vLyBpZiB0aGUgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyLiAgSWYgaXNMb29rdXBQdHJSZWdDbGFzcyBpcyBzZXQsIHRoZW4gdGhpcyBpcworICAvLy8gYW4gaW5kZXggdGhhdCBpcyBwYXNzZWQgdG8gVGFyZ2V0UmVnaXN0ZXJJbmZvOjpnZXRQb2ludGVyUmVnQ2xhc3MoeCkgdG8KKyAgLy8vIGdldCBhIGR5bmFtaWMgcmVnaXN0ZXIgY2xhc3MuCisgIC8vLworICAvLy8gTk9URTogVGhpcyBtZW1iZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgcHJpdmF0ZSwgYWxsIGFjY2VzcyBzaG91bGQgZ28KKyAgLy8vIHRocm91Z2ggImdldFJlZ0NsYXNzKFRSSSkiIGJlbG93LgorICBzaG9ydCBSZWdDbGFzczsKKyAgCisgIC8vLyBGbGFncyAtIFRoZXNlIGFyZSBmbGFncyBmcm9tIHRoZSBUT0k6Ok9wZXJhbmRGbGFncyBlbnVtLgorICB1bnNpZ25lZCBzaG9ydCBGbGFnczsKKyAgCisgIC8vLyBMb3dlciAxNiBiaXRzIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggY29uc3RyYWludHMgYXJlIHNldC4gVGhlIGhpZ2hlciAxNgorICAvLy8gYml0cyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB2YWx1ZSBvZiBjb25zdHJhaW50cyAoNCBiaXRzIGVhY2gpLgorICB1bnNpZ25lZCBDb25zdHJhaW50czsKKyAgLy8vIEN1cnJlbnRseSBubyBvdGhlciBpbmZvcm1hdGlvbi4KKyAgCisgIC8vLyBnZXRSZWdDbGFzcyAtIEdldCB0aGUgcmVnaXN0ZXIgY2xhc3MgZm9yIHRoZSBvcGVyYW5kLCBoYW5kbGluZyByZXNvbHV0aW9uCisgIC8vLyBvZiAic3ltYm9saWMiIHBvaW50ZXIgcmVnaXN0ZXIgY2xhc3NlcyBldGMuICBJZiB0aGlzIGlzIG5vdCBhIHJlZ2lzdGVyCisgIC8vLyBvcGVyYW5kLCB0aGlzIHJldHVybnMgbnVsbC4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworICAKKyAgCisgIC8vLyBpc0xvb2t1cFB0clJlZ0NsYXNzIC0gU2V0IGlmIHRoaXMgb3BlcmFuZCBpcyBhIHBvaW50ZXIgdmFsdWUgYW5kIGl0CisgIC8vLyByZXF1aXJlcyBhIGNhbGxiYWNrIHRvIGxvb2sgdXAgaXRzIHJlZ2lzdGVyIGNsYXNzLgorICBib29sIGlzTG9va3VwUHRyUmVnQ2xhc3MoKSBjb25zdCB7IHJldHVybiBGbGFncyYoMSA8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpO30KKyAgCisgIC8vLyBpc1ByZWRpY2F0ZSAtIFNldCBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgb3BlcmFuZHMgdGhhdCBtYWRlIHVwIG9mCisgIC8vLyB0aGUgcHJlZGljYXRlIG9wZXJhbmQgdGhhdCBjb250cm9scyBhbiBpc1ByZWRpY2FibGUoKSBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc1ByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDEgPDwgVE9JOjpQcmVkaWNhdGUpOyB9CisgIAorICAvLy8gaXNPcHRpb25hbERlZiAtIFNldCBpZiB0aGlzIG9wZXJhbmQgaXMgYSBvcHRpb25hbCBkZWYuCisgIC8vLworICBib29sIGlzT3B0aW9uYWxEZWYoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxIDw8IFRPSTo6T3B0aW9uYWxEZWYpOyB9Cit9OworCisgIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hY2hpbmUgSW5zdHJ1Y3Rpb24gRmxhZ3MgYW5kIERlc2NyaXB0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGFyZ2V0SW5zdHJEZXNjIGZsYWdzIC0gVGhlc2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHJpdmF0ZSB0byB0aGUKKy8vLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJEZXNjIGNsYXNzLiAgQ2xpZW50cyBzaG91bGQgdXNlIHRoZQorLy8vIHByZWRpY2F0ZSBtZXRob2RzIG9uIFRhcmdldEluc3RyRGVzYywgbm90IHVzZSB0aGVzZSBkaXJlY3RseS4gIFRoZXNlCisvLy8gYWxsIGNvcnJlc3BvbmQgdG8gYml0ZmllbGRzIGluIHRoZSBUYXJnZXRJbnN0ckRlc2M6OkZsYWdzIGZpZWxkLgorbmFtZXNwYWNlIFRJRCB7CisgIGVudW0geworICAgIFZhcmlhZGljID0gMCwKKyAgICBIYXNPcHRpb25hbERlZiwKKyAgICBSZXR1cm4sCisgICAgQ2FsbCwKKyAgICBCYXJyaWVyLAorICAgIFRlcm1pbmF0b3IsCisgICAgQnJhbmNoLAorICAgIEluZGlyZWN0QnJhbmNoLAorICAgIFByZWRpY2FibGUsCisgICAgTm90RHVwbGljYWJsZSwKKyAgICBDb21wYXJlLAorICAgIERlbGF5U2xvdCwKKyAgICBGb2xkYWJsZUFzTG9hZCwKKyAgICBNYXlMb2FkLAorICAgIE1heVN0b3JlLAorICAgIFVubW9kZWxlZFNpZGVFZmZlY3RzLAorICAgIENvbW11dGFibGUsCisgICAgQ29udmVydGlibGVUbzNBZGRyLAorICAgIFVzZXNDdXN0b21JbnNlcnRlciwKKyAgICBSZW1hdGVyaWFsaXphYmxlLAorICAgIENoZWFwQXNBTW92ZSwKKyAgICBFeHRyYVNyY1JlZ0FsbG9jUmVxLAorICAgIEV4dHJhRGVmUmVnQWxsb2NSZXEKKyAgfTsKK30KKworLy8vIFRhcmdldEluc3RyRGVzYyAtIERlc2NyaWJlIHByb3BlcnRpZXMgdGhhdCBhcmUgdHJ1ZSBvZiBlYWNoCisvLy8gaW5zdHJ1Y3Rpb24gaW4gdGhlIHRhcmdldCBkZXNjcmlwdGlvbiBmaWxlLiAgVGhpcyBjYXB0dXJlcyBpbmZvcm1hdGlvbiBhYm91dAorLy8vIHNpZGUgZWZmZWN0cywgcmVnaXN0ZXIgdXNlIGFuZCBtYW55IG90aGVyIHRoaW5ncy4gIFRoZXJlIGlzIG9uZSBpbnN0YW5jZSBvZgorLy8vIHRoaXMgc3RydWN0IGZvciBlYWNoIHRhcmdldCBpbnN0cnVjdGlvbiBjbGFzcywgYW5kIHRoZSBNYWNoaW5lSW5zdHIgY2xhc3MKKy8vLyBwb2ludHMgdG8gdGhpcyBzdHJ1Y3QgZGlyZWN0bHkgdG8gZGVzY3JpYmUgaXRzZWxmLgorY2xhc3MgVGFyZ2V0SW5zdHJEZXNjIHsKK3B1YmxpYzoKKyAgdW5zaWduZWQgc2hvcnQgIE9wY29kZTsgICAgICAgIC8vIFRoZSBvcGNvZGUgbnVtYmVyCisgIHVuc2lnbmVkIHNob3J0ICBOdW1PcGVyYW5kczsgICAvLyBOdW0gb2YgYXJncyAobWF5IGJlIG1vcmUgaWYgdmFyaWFibGVfb3BzKQorICB1bnNpZ25lZCBzaG9ydCAgTnVtRGVmczsgICAgICAgLy8gTnVtIG9mIGFyZ3MgdGhhdCBhcmUgZGVmaW5pdGlvbnMKKyAgdW5zaWduZWQgc2hvcnQgIFNjaGVkQ2xhc3M7ICAgIC8vIGVudW0gaWRlbnRpZnlpbmcgaW5zdHIgc2NoZWQgY2xhc3MKKyAgY29uc3QgY2hhciAqICAgIE5hbWU7ICAgICAgICAgIC8vIE5hbWUgb2YgdGhlIGluc3RydWN0aW9uIHJlY29yZCBpbiB0ZCBmaWxlCisgIHVuc2lnbmVkICAgICAgICBGbGFnczsgICAgICAgICAvLyBGbGFncyBpZGVudGlmeWluZyBtYWNoaW5lIGluc3RyIGNsYXNzCisgIHVpbnQ2NF90ICAgICAgICBUU0ZsYWdzOyAgICAgICAvLyBUYXJnZXQgU3BlY2lmaWMgRmxhZyB2YWx1ZXMKKyAgY29uc3QgdW5zaWduZWQgKkltcGxpY2l0VXNlczsgIC8vIFJlZ2lzdGVycyBpbXBsaWNpdGx5IHJlYWQgYnkgdGhpcyBpbnN0cgorICBjb25zdCB1bnNpZ25lZCAqSW1wbGljaXREZWZzOyAgLy8gUmVnaXN0ZXJzIGltcGxpY2l0bHkgZGVmaW5lZCBieSB0aGlzIGluc3RyCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKipSQ0JhcnJpZXJzOyAvLyBSZWcgY2xhc3NlcyBjb21wbGV0ZWx5ICJjbG9iYmVyZWQiCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm87IC8vICdOdW1PcGVyYW5kcycgZW50cmllcyBhYm91dCBvcGVyYW5kcworCisgIC8vLyBnZXRPcGVyYW5kQ29uc3RyYWludCAtIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpYyBjb25zdHJhaW50IGlmCisgIC8vLyBpdCBpcyBzZXQuIFJldHVybnMgLTEgaWYgaXQgaXMgbm90IHNldC4KKyAgaW50IGdldE9wZXJhbmRDb25zdHJhaW50KHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9JOjpPcGVyYW5kQ29uc3RyYWludCBDb25zdHJhaW50KSBjb25zdCB7CisgICAgaWYgKE9wTnVtIDwgTnVtT3BlcmFuZHMgJiYKKyAgICAgICAgKE9wSW5mb1tPcE51bV0uQ29uc3RyYWludHMgJiAoMSA8PCBDb25zdHJhaW50KSkpIHsKKyAgICAgIHVuc2lnbmVkIFBvcyA9IDE2ICsgQ29uc3RyYWludCAqIDQ7CisgICAgICByZXR1cm4gKGludCkoT3BJbmZvW09wTnVtXS5Db25zdHJhaW50cyA+PiBQb3MpICYgMHhmOworICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLy8gZ2V0UmVnQ2xhc3MgLSBSZXR1cm5zIHRoZSByZWdpc3RlciBjbGFzcyBjb25zdHJhaW50IGZvciBPcE51bSwgb3IgTlVMTC4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3ModW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgICAgcmV0dXJuIE9wTnVtIDwgTnVtT3BlcmFuZHMgPyBPcEluZm9bT3BOdW1dLmdldFJlZ0NsYXNzKFRSSSkgOiAwOworICB9CisKKyAgLy8vIGdldE9wY29kZSAtIFJldHVybiB0aGUgb3Bjb2RlIG51bWJlciBmb3IgdGhpcyBkZXNjcmlwdG9yLgorICB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIE9wY29kZTsKKyAgfQorICAKKyAgLy8vIGdldE5hbWUgLSBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlY29yZCBpbiB0aGUgLnRkIGZpbGUgZm9yIHRoaXMKKyAgLy8vIGluc3RydWN0aW9uLCBmb3IgZXhhbXBsZSAiQUREOHJpIi4KKyAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTmFtZTsKKyAgfQorICAKKyAgLy8vIGdldE51bU9wZXJhbmRzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVjbGFyZWQgTWFjaGluZU9wZXJhbmRzIGZvciB0aGlzCisgIC8vLyBNYWNoaW5lSW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgdmFyaWFkaWMgKGlzVmFyaWFkaWMoKSByZXR1cm5zIHRydWUpCisgIC8vLyBpbnN0cnVjdGlvbnMgbWF5IGhhdmUgYWRkaXRpb25hbCBvcGVyYW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBhbmQgbm90ZQorICAvLy8gdGhhdCB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbiBtYXkgaW5jbHVkZSBpbXBsaWNpdCByZWdpc3RlciBkZWYvdXNlcyBhcworICAvLy8gd2VsbC4KKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bU9wZXJhbmRzOworICB9CisgIAorICAvLy8gZ2V0TnVtRGVmcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIE1hY2hpbmVPcGVyYW5kcyB0aGF0IGFyZSByZWdpc3RlcgorICAvLy8gZGVmaW5pdGlvbnMuICBSZWdpc3RlciBkZWZpbml0aW9ucyBhbHdheXMgb2NjdXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSAKKyAgLy8vIG1hY2hpbmUgb3BlcmFuZCBsaXN0LiAgVGhpcyBpcyB0aGUgbnVtYmVyIG9mICJvdXRzIiBpbiB0aGUgLnRkIGZpbGUsCisgIC8vLyBhbmQgZG9lcyBub3QgaW5jbHVkZSBpbXBsaWNpdCBkZWZzLgorICB1bnNpZ25lZCBnZXROdW1EZWZzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1EZWZzOworICB9CisgIAorICAvLy8gaXNWYXJpYWRpYyAtIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gY2FuIGhhdmUgYSB2YXJpYWJsZSBudW1iZXIgb2YKKyAgLy8vIG9wZXJhbmRzLiAgSW4gdGhpcyBjYXNlLCB0aGUgdmFyaWFibGUgb3BlcmFuZHMgd2lsbCBiZSBhZnRlciB0aGUgbm9ybWFsCisgIC8vLyBvcGVyYW5kcyBidXQgYmVmb3JlIHRoZSBpbXBsaWNpdCBkZWZpbml0aW9ucyBhbmQgdXNlcyAoaWYgYW55IGFyZQorICAvLy8gcHJlc2VudCkuCisgIGJvb2wgaXNWYXJpYWRpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OlZhcmlhZGljKTsKKyAgfQorICAKKyAgLy8vIGhhc09wdGlvbmFsRGVmIC0gU2V0IGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wdGlvbmFsIGRlZmluaXRpb24sIGUuZy4KKyAgLy8vIEFSTSBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIHNldCBjb25kaXRpb24gY29kZSBpZiAncycgYml0IGlzIHNldC4KKyAgYm9vbCBoYXNPcHRpb25hbERlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6Okhhc09wdGlvbmFsRGVmKTsKKyAgfQorICAKKyAgLy8vIGdldEltcGxpY2l0VXNlcyAtIFJldHVybiBhIGxpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHBvdGVudGlhbGx5CisgIC8vLyByZWFkIGJ5IGFueSBpbnN0YW5jZSBvZiB0aGlzIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZSwgb24gWDg2LAorICAvLy8gdGhlICJhZGMiIGluc3RydWN0aW9uIGFkZHMgdHdvIHJlZ2lzdGVyIG9wZXJhbmRzIGFuZCBhZGRzIHRoZSBjYXJyeSBiaXQgaW4KKyAgLy8vIGZyb20gdGhlIGZsYWdzIHJlZ2lzdGVyLiAgSW4gdGhpcyBjYXNlLCB0aGUgaW5zdHJ1Y3Rpb24gaXMgbWFya2VkIGFzCisgIC8vLyBpbXBsaWNpdGx5IHJlYWRpbmcgdGhlIGZsYWdzLiAgTGlrZXdpc2UsIHRoZSB2YXJpYWJsZSBzaGlmdCBpbnN0cnVjdGlvbiBvbgorICAvLy8gWDg2IGlzIG1hcmtlZCBhcyBpbXBsaWNpdGx5IHJlYWRpbmcgdGhlICdDTCcgcmVnaXN0ZXIsIHdoaWNoIGl0IGFsd2F5cworICAvLy8gZG9lcy4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBubyBpbXBsaWNpdCB1c2VzLgorICBjb25zdCB1bnNpZ25lZCAqZ2V0SW1wbGljaXRVc2VzKCkgY29uc3QgeworICAgIHJldHVybiBJbXBsaWNpdFVzZXM7CisgIH0KKyAgCisgIC8vLyBnZXROdW1JbXBsaWNpdFVzZXMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBpbXBsaWNpdCB1c2VzIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgLy8vIGhhcy4KKyAgdW5zaWduZWQgZ2V0TnVtSW1wbGljaXRVc2VzKCkgY29uc3QgeworICAgIGlmIChJbXBsaWNpdFVzZXMgPT0gMCkgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgZm9yICg7IEltcGxpY2l0VXNlc1tpXTsgKytpKSAvKmVtcHR5Ki87CisgICAgcmV0dXJuIGk7CisgIH0KKyAgCisgIAorICAvLy8gZ2V0SW1wbGljaXREZWZzIC0gUmV0dXJuIGEgbGlzdCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgcG90ZW50aWFsbHkKKyAgLy8vIHdyaXR0ZW4gYnkgYW55IGluc3RhbmNlIG9mIHRoaXMgbWFjaGluZSBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlLCBvbiBYODYsCisgIC8vLyBtYW55IGluc3RydWN0aW9ucyBpbXBsaWNpdGx5IHNldCB0aGUgZmxhZ3MgcmVnaXN0ZXIuICBJbiB0aGlzIGNhc2UsIHRoZXkKKyAgLy8vIGFyZSBtYXJrZWQgYXMgc2V0dGluZyB0aGUgRkxBR1MuICBMaWtld2lzZSwgbWFueSBpbnN0cnVjdGlvbnMgYWx3YXlzCisgIC8vLyBkZXBvc2l0IHRoZWlyIHJlc3VsdCBpbiBhIHBoeXNpY2FsIHJlZ2lzdGVyLiAgRm9yIGV4YW1wbGUsIHRoZSBYODYgZGl2aWRlCisgIC8vLyBpbnN0cnVjdGlvbiBhbHdheXMgZGVwb3NpdHMgdGhlIHF1b3RpZW50IGFuZCByZW1haW5kZXIgaW4gdGhlIEVBWC9FRFgKKyAgLy8vIHJlZ2lzdGVycy4gIEZvciB0aGF0IGluc3RydWN0aW9uLCB0aGlzIHdpbGwgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZQorICAvLy8gRUFYL0VEWC9FRkxBR1MgcmVnaXN0ZXJzLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIGltcGxpY2l0IGRlZnMuCisgIGNvbnN0IHVuc2lnbmVkICpnZXRJbXBsaWNpdERlZnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEltcGxpY2l0RGVmczsKKyAgfQorICAKKyAgLy8vIGdldE51bUltcGxpY2l0RGVmcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGltcGxpY2l0IGRlZnMgdGhpcyBpbnN0cnVjdGlvbgorICAvLy8gaGFzLgorICB1bnNpZ25lZCBnZXROdW1JbXBsaWNpdERlZnMoKSBjb25zdCB7CisgICAgaWYgKEltcGxpY2l0RGVmcyA9PSAwKSByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBpID0gMDsKKyAgICBmb3IgKDsgSW1wbGljaXREZWZzW2ldOyArK2kpIC8qZW1wdHkqLzsKKyAgICByZXR1cm4gaTsKKyAgfQorICAKKyAgLy8vIGhhc0ltcGxpY2l0VXNlT2ZQaHlzUmVnIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpbXBsaWNpdGx5CisgIC8vLyB1c2VzIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcmVnaXN0ZXIuCisgIGJvb2wgaGFzSW1wbGljaXRVc2VPZlBoeXNSZWcodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgaWYgKGNvbnN0IHVuc2lnbmVkICpJbXBVc2VzID0gSW1wbGljaXRVc2VzKQorICAgICAgZm9yICg7ICpJbXBVc2VzOyArK0ltcFVzZXMpCisgICAgICAgIGlmICgqSW1wVXNlcyA9PSBSZWcpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgLy8vIGhhc0ltcGxpY2l0RGVmT2ZQaHlzUmVnIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpbXBsaWNpdGx5CisgIC8vLyBkZWZpbmVzIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcmVnaXN0ZXIuCisgIGJvb2wgaGFzSW1wbGljaXREZWZPZlBoeXNSZWcodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgaWYgKGNvbnN0IHVuc2lnbmVkICpJbXBEZWZzID0gSW1wbGljaXREZWZzKQorICAgICAgZm9yICg7ICpJbXBEZWZzOyArK0ltcERlZnMpCisgICAgICAgIGlmICgqSW1wRGVmcyA9PSBSZWcpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBnZXRSZWdDbGFzc0JhcnJpZXJzIC0gUmV0dXJuIGEgbGlzdCBvZiByZWdpc3RlciBjbGFzc2VzIHRoYXQgYXJlCisgIC8vLyBjb21wbGV0ZWx5IGNsb2JiZXJlZCBieSB0aGlzIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uIEZvciBleGFtcGxlLCBvbiBYODYKKyAgLy8vIHRoZSBjYWxsIGluc3RydWN0aW9ucyB3aWxsIGNvbXBsZXRlbHkgY2xvYmJlciBhbGwgdGhlIHJlZ2lzdGVycyBpbiB0aGUKKyAgLy8vIGZwIHN0YWNrIGFuZCBYTU0gY2xhc3Nlcy4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgdGhlIGluc3RydWN0aW9uIGRvZXNuJ3QgY29tcGxldGVseSBjbG9iYmVyCisgIC8vLyBhbnkgcmVnaXN0ZXIgY2xhc3MuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKipnZXRSZWdDbGFzc0JhcnJpZXJzKCkgY29uc3QgeworICAgIHJldHVybiBSQ0JhcnJpZXJzOworICB9CisKKyAgLy8vIGdldFNjaGVkQ2xhc3MgLSBSZXR1cm4gdGhlIHNjaGVkdWxpbmcgY2xhc3MgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICBUaGUKKyAgLy8vIHNjaGVkdWxpbmcgY2xhc3MgaXMgYW4gaW5kZXggaW50byB0aGUgSW5zdHJJdGluZXJhcnlEYXRhIHRhYmxlLiAgVGhpcworICAvLy8gcmV0dXJucyB6ZXJvIGlmIHRoZXJlIGlzIG5vIGtub3duIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gZm9yIHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIC8vLworICB1bnNpZ25lZCBnZXRTY2hlZENsYXNzKCkgY29uc3QgeworICAgIHJldHVybiBTY2hlZENsYXNzOworICB9CisgIAorICBib29sIGlzUmV0dXJuKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxIDw8IFRJRDo6UmV0dXJuKTsKKyAgfQorICAKKyAgYm9vbCBpc0NhbGwoKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzICYgKDEgPDwgVElEOjpDYWxsKTsKKyAgfQorICAKKyAgLy8vIGlzQmFycmllciAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHN0b3BzIGNvbnRyb2wgZmxvdworICAvLy8gZnJvbSBleGVjdXRpbmcgdGhlIGluc3RydWN0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBpdC4gIEV4YW1wbGVzIGluY2x1ZGUKKyAgLy8vIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgYW5kIHJldHVybiBpbnN0cnVjdGlvbnMuCisgIGJvb2wgaXNCYXJyaWVyKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxIDw8IFRJRDo6QmFycmllcik7CisgIH0KKyAgCisgIC8vLyBpc1Rlcm1pbmF0b3IgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBwYXJ0IG9mIHRoZSB0ZXJtaW5hdG9yIGZvcgorICAvLy8gYSBiYXNpYyBibG9jay4gIFR5cGljYWxseSB0aGlzIGlzIHRoaW5ncyBsaWtlIHJldHVybiBhbmQgYnJhbmNoCisgIC8vLyBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gVmFyaW91cyBwYXNzZXMgdXNlIHRoaXMgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgYm90dG9tIG9mIGEgYmFzaWMgYmxvY2ssCisgIC8vLyBidXQgYmVmb3JlIGNvbnRyb2wgZmxvdyBvY2N1cnMuCisgIGJvb2wgaXNUZXJtaW5hdG9yKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxIDw8IFRJRDo6VGVybWluYXRvcik7CisgIH0KKyAgCisgIC8vLyBpc0JyYW5jaCAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgY29uZGl0aW9uYWwsIHVuY29uZGl0aW9uYWwsIG9yCisgIC8vLyBpbmRpcmVjdCBicmFuY2guICBQcmVkaWNhdGVzIGJlbG93IGNhbiBiZSB1c2VkIHRvIGRpc2NyaW1pbmF0ZSBiZXR3ZWVuCisgIC8vLyB0aGVzZSBjYXNlcywgYW5kIHRoZSBUYXJnZXRJbnN0ckluZm86OkFuYWx5emVCcmFuY2ggbWV0aG9kIGNhbiBiZSB1c2VkIHRvCisgIC8vLyBnZXQgbW9yZSBpbmZvcm1hdGlvbi4KKyAgYm9vbCBpc0JyYW5jaCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OkJyYW5jaCk7CisgIH0KKworICAvLy8gaXNJbmRpcmVjdEJyYW5jaCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW5kaXJlY3QgYnJhbmNoLCBzdWNoIGFzIGEKKyAgLy8vIGJyYW5jaCB0aHJvdWdoIGEgcmVnaXN0ZXIuCisgIGJvb2wgaXNJbmRpcmVjdEJyYW5jaCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OkluZGlyZWN0QnJhbmNoKTsKKyAgfQorCisgIC8vLyBpc0NvbmRpdGlvbmFsQnJhbmNoIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGJyYW5jaCB3aGljaCBtYXkgZmFsbAorICAvLy8gdGhyb3VnaCB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiBvciBtYXkgdHJhbnNmZXIgY29udHJvbCBmbG93IHRvIHNvbWUgb3RoZXIKKyAgLy8vIGJsb2NrLiAgVGhlIFRhcmdldEluc3RySW5mbzo6QW5hbHl6ZUJyYW5jaCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZ2V0IG1vcmUKKyAgLy8vIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYnJhbmNoLgorICBib29sIGlzQ29uZGl0aW9uYWxCcmFuY2goKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQnJhbmNoKCkgJiAhaXNCYXJyaWVyKCkgJiAhaXNJbmRpcmVjdEJyYW5jaCgpOworICB9CisgIAorICAvLy8gaXNVbmNvbmRpdGlvbmFsQnJhbmNoIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGJyYW5jaCB3aGljaCBhbHdheXMKKyAgLy8vIHRyYW5zZmVycyBjb250cm9sIGZsb3cgdG8gc29tZSBvdGhlciBibG9jay4gIFRoZQorICAvLy8gVGFyZ2V0SW5zdHJJbmZvOjpBbmFseXplQnJhbmNoIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbgorICAvLy8gYWJvdXQgdGhpcyBicmFuY2guCisgIGJvb2wgaXNVbmNvbmRpdGlvbmFsQnJhbmNoKCkgY29uc3QgeworICAgIHJldHVybiBpc0JyYW5jaCgpICYgaXNCYXJyaWVyKCkgJiAhaXNJbmRpcmVjdEJyYW5jaCgpOworICB9CisgIAorICAvLyBpc1ByZWRpY2FibGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBhIHByZWRpY2F0ZSBvcGVyYW5kIHRoYXQKKyAgLy8gY29udHJvbHMgZXhlY3V0aW9uLiAgSXQgbWF5IGJlIHNldCB0byAnYWx3YXlzJywgb3IgbWF5IGJlIHNldCB0byBvdGhlcgorICAvLy8gdmFsdWVzLiAgIFRoZXJlIGFyZSB2YXJpb3VzIG1ldGhvZHMgaW4gVGFyZ2V0SW5zdHJJbmZvIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAgLy8vIGNvbnRyb2wgYW5kIG1vZGlmeSB0aGUgcHJlZGljYXRlIGluIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNQcmVkaWNhYmxlKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxIDw8IFRJRDo6UHJlZGljYWJsZSk7CisgIH0KKyAgCisgIC8vLyBpc0NvbXBhcmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgY29tcGFyaXNvbi4KKyAgYm9vbCBpc0NvbXBhcmUoKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzICYgKDEgPDwgVElEOjpDb21wYXJlKTsKKyAgfQorICAKKyAgLy8vIGlzTm90RHVwbGljYWJsZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gY2Fubm90IGJlIHNhZmVseQorICAvLy8gZHVwbGljYXRlZC4gIEZvciBleGFtcGxlLCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGEgdW5pcXVlIGxhYmVscyBhdHRhY2hlZAorICAvLy8gdG8gaXQsIGR1cGxpY2F0aW5nIGl0IHdvdWxkIGNhdXNlIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3JzLgorICBib29sIGlzTm90RHVwbGljYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6Ok5vdER1cGxpY2FibGUpOworICB9CisgIAorICAvLy8gaGFzRGVsYXlTbG90IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaGFzIGEgZGVsYXkgc2xvdAorICAvLy8gd2hpY2ggbXVzdCBiZSBmaWxsZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLgorICBib29sIGhhc0RlbGF5U2xvdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OkRlbGF5U2xvdCk7CisgIH0KKyAgCisgIC8vLyBjYW5Gb2xkQXNMb2FkIC0gUmV0dXJuIHRydWUgZm9yIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBmb2xkZWQgYXMKKyAgLy8vIG1lbW9yeSBvcGVyYW5kcyBpbiBvdGhlciBpbnN0cnVjdGlvbnMuIFRoZSBtb3N0IGNvbW1vbiB1c2UgZm9yIHRoaXMKKyAgLy8vIGlzIGluc3RydWN0aW9ucyB0aGF0IGFyZSBzaW1wbGUgbG9hZHMgZnJvbSBtZW1vcnkgdGhhdCBkb24ndCBtb2RpZnkKKyAgLy8vIHRoZSBsb2FkZWQgdmFsdWUgaW4gYW55IHdheSwgYnV0IGl0IGNhbiBhbHNvIGJlIHVzZWQgZm9yIGluc3RydWN0aW9ucworICAvLy8gdGhhdCBjYW4gYmUgZXhwcmVzc2VkIGFzIGNvbnN0YW50LXBvb2wgbG9hZHMsIHN1Y2ggYXMgVl9TRVRBTExPTkVTCisgIC8vLyBvbiB4ODYsIHRvIGFsbG93IHRoZW0gdG8gYmUgZm9sZGVkIHdoZW4gaXQgaXMgYmVuZWZpY2lhbC4KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IG9uIGluc3RydWN0aW9ucyB0aGF0IHJldHVybiBhIHZhbHVlIGluIHRoZWlyCisgIC8vLyBvbmx5IHZpcnR1YWwgcmVnaXN0ZXIgZGVmaW5pdGlvbi4KKyAgYm9vbCBjYW5Gb2xkQXNMb2FkKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxIDw8IFRJRDo6Rm9sZGFibGVBc0xvYWQpOworICB9CisgIAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU2lkZSBFZmZlY3QgQW5hbHlzaXMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIG1heUxvYWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGNvdWxkIHBvc3NpYmx5IHJlYWQgbWVtb3J5LgorICAvLy8gSW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgbm90IG5lY2Vzc2FyaWx5IHNpbXBsZSBsb2FkCisgIC8vLyBpbnN0cnVjdGlvbnMsIHRoZXkgbWF5IGxvYWQgYSB2YWx1ZSBhbmQgbW9kaWZ5IGl0LCBmb3IgZXhhbXBsZS4KKyAgYm9vbCBtYXlMb2FkKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxIDw8IFRJRDo6TWF5TG9hZCk7CisgIH0KKyAgCisgIAorICAvLy8gbWF5U3RvcmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGNvdWxkIHBvc3NpYmx5IG1vZGlmeSBtZW1vcnkuCisgIC8vLyBJbnN0cnVjdGlvbnMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSBub3QgbmVjZXNzYXJpbHkgc2ltcGxlIHN0b3JlCisgIC8vLyBpbnN0cnVjdGlvbnMsIHRoZXkgbWF5IHN0b3JlIGEgbW9kaWZpZWQgdmFsdWUgYmFzZWQgb24gdGhlaXIgb3BlcmFuZHMsIG9yCisgIC8vLyBtYXkgbm90IGFjdHVhbGx5IG1vZGlmeSBhbnl0aGluZywgZm9yIGV4YW1wbGUuCisgIGJvb2wgbWF5U3RvcmUoKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzICYgKDEgPDwgVElEOjpNYXlTdG9yZSk7CisgIH0KKyAgCisgIC8vLyBoYXNVbm1vZGVsZWRTaWRlRWZmZWN0cyAtIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIHNpZGUKKyAgLy8vIGVmZmVjdHMgdGhhdCBhcmUgbm90IG1vZGVsZWQgYnkgb3RoZXIgZmxhZ3MuICBUaGlzIGRvZXMgbm90IHJldHVybiB0cnVlCisgIC8vLyBmb3IgaW5zdHJ1Y3Rpb25zIHdob3NlIGVmZmVjdHMgYXJlIGNhcHR1cmVkIGJ5OgorICAvLy8KKyAgLy8vICAxLiBUaGVpciBvcGVyYW5kIGxpc3QgYW5kIGltcGxpY2l0IGRlZmluaXRpb24vdXNlIGxpc3QuICBSZWdpc3RlciB1c2UvZGVmCisgIC8vLyAgICAgaW5mbyBpcyBleHBsaWNpdCBmb3IgaW5zdHJ1Y3Rpb25zLgorICAvLy8gIDIuIE1lbW9yeSBhY2Nlc3Nlcy4gIFVzZSBtYXlMb2FkL21heVN0b3JlLgorICAvLy8gIDMuIENhbGxpbmcsIGJyYW5jaGluZywgcmV0dXJuaW5nOiB1c2UgaXNDYWxsL2lzUmV0dXJuL2lzQnJhbmNoLgorICAvLy8KKyAgLy8vIEV4YW1wbGVzIG9mIHNpZGUgZWZmZWN0cyB3b3VsZCBiZSBtb2RpZnlpbmcgJ2ludmlzaWJsZScgbWFjaGluZSBzdGF0ZSBsaWtlCisgIC8vLyBhIGNvbnRyb2wgcmVnaXN0ZXIsIGZsdXNoaW5nIGEgY2FjaGUsIG1vZGlmeWluZyBhIHJlZ2lzdGVyIGludmlzaWJsZSB0bworICAvLy8gTExWTSwgZXRjLgorICAvLy8KKyAgYm9vbCBoYXNVbm1vZGVsZWRTaWRlRWZmZWN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKTsKKyAgfQorICAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEZsYWdzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiBjYW4gYmUgbW9kaWZpZWQgYnkgYSBtZXRob2QuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAKKyAgLy8vIGlzQ29tbXV0YWJsZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgbWF5IGJlIGEgMi0gb3IgMy1hZGRyZXNzCisgIC8vLyBpbnN0cnVjdGlvbiAob2YgdGhlIGZvcm0gIlggPSBvcCBZLCBaLCAuLi4iKSwgd2hpY2ggcHJvZHVjZXMgdGhlIHNhbWUKKyAgLy8vIHJlc3VsdCBpZiBZIGFuZCBaIGFyZSBleGNoYW5nZWQuICBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHRoZSAKKyAgLy8vIFRhcmdldEluc3RySW5mbzo6Y29tbXV0ZUluc3RydWN0aW9uIG1ldGhvZCBtYXkgYmUgdXNlZCB0byBoYWNrIG9uIHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgZmxhZyBtYXkgYmUgc2V0IG9uIGluc3RydWN0aW9ucyB0aGF0IGFyZSBvbmx5IGNvbW11dGFibGUKKyAgLy8vIHNvbWV0aW1lcy4gIEluIHRoZXNlIGNhc2VzLCB0aGUgY2FsbCB0byBjb21tdXRlSW5zdHJ1Y3Rpb24gd2lsbCBmYWlsLgorICAvLy8gQWxzbyBub3RlIHRoYXQgc29tZSBpbnN0cnVjdGlvbnMgcmVxdWlyZSBub24tdHJpdmlhbCBtb2RpZmljYXRpb24gdG8KKyAgLy8vIGNvbW11dGUgdGhlbS4KKyAgYm9vbCBpc0NvbW11dGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzICYgKDEgPDwgVElEOjpDb21tdXRhYmxlKTsKKyAgfQorICAKKyAgLy8vIGlzQ29udmVydGlibGVUbzNBZGRyIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDItYWRkcmVzcyBpbnN0cnVjdGlvbgorICAvLy8gd2hpY2ggY2FuIGJlIGNoYW5nZWQgaW50byBhIDMtYWRkcmVzcyBpbnN0cnVjdGlvbiBpZiBuZWVkZWQuICBEb2luZyB0aGlzCisgIC8vLyB0cmFuc2Zvcm1hdGlvbiBjYW4gYmUgcHJvZml0YWJsZSBpbiB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yLCBiZWNhdXNlIGl0CisgIC8vLyBtZWFucyB0aGF0IHRoZSBpbnN0cnVjdGlvbiBjYW4gdXNlIGEgMi1hZGRyZXNzIGZvcm0gaWYgcG9zc2libGUsIGJ1dAorICAvLy8gZGVncmFkZSBpbnRvIGEgbGVzcyBlZmZpY2llbnQgZm9ybSBpZiB0aGUgc291cmNlIGFuZCBkZXN0IHJlZ2lzdGVyIGNhbm5vdAorICAvLy8gYmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgcmVnaXN0ZXIuICBGb3IgZXhhbXBsZSwgdGhpcyBhbGxvd3MgdGhlIHg4NgorICAvLy8gYmFja2VuZCB0byB0dXJuIGEgInNobCByZWcsIDMiIGluc3RydWN0aW9uIGludG8gYW4gTEVBIGluc3RydWN0aW9uLCB3aGljaAorICAvLy8gaXMgdGhlIHNhbWUgc3BlZWQgYXMgdGhlIHNoaWZ0IGJ1dCBoYXMgYmlnZ2VyIGNvZGUgc2l6ZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgdGFyZ2V0IG11c3QgaW1wbGVtZW50IHRoZQorICAvLy8gVGFyZ2V0SW5zdHJJbmZvOjpjb252ZXJ0VG9UaHJlZUFkZHJlc3MgbWV0aG9kIGZvciB0aGlzIGluc3RydWN0aW9uLCB3aGljaAorICAvLy8gaXMgYWxsb3dlZCB0byBmYWlsIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBpc24ndCB2YWxpZCBmb3IgdGhpcyBzcGVjaWZpYworICAvLy8gaW5zdHJ1Y3Rpb24gKGUuZy4gc2hsIHJlZywgNCBvbiB4ODYpLgorICAvLy8KKyAgYm9vbCBpc0NvbnZlcnRpYmxlVG8zQWRkcigpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkcik7CisgIH0KKyAgCisgIC8vLyB1c2VzQ3VzdG9tSW5zZXJ0aW9uSG9vayAtIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMKKyAgLy8vIGN1c3RvbSBpbnNlcnRpb24gc3VwcG9ydCB3aGVuIHRoZSBEQUcgc2NoZWR1bGVyIGlzIGluc2VydGluZyBpdCBpbnRvIGEKKyAgLy8vIG1hY2hpbmUgYmFzaWMgYmxvY2suICBJZiB0aGlzIGlzIHRydWUgZm9yIHRoZSBpbnN0cnVjdGlvbiwgaXQgYmFzaWNhbGx5CisgIC8vLyBtZWFucyB0aGF0IGl0IGlzIGEgcHNldWRvIGluc3RydWN0aW9uIHVzZWQgYXQgU2VsZWN0aW9uREFHIHRpbWUgdGhhdCBpcyAKKyAgLy8vIGV4cGFuZGVkIG91dCBpbnRvIG1hZ2ljIGNvZGUgYnkgdGhlIHRhcmdldCB3aGVuIE1hY2hpbmVJbnN0cnMgYXJlIGZvcm1lZC4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGlzIHRydWUsIHRoZSBUYXJnZXRMb3dlcmluZ0luZm86Okluc2VydEF0RW5kT2ZCYXNpY0Jsb2NrIG1ldGhvZAorICAvLy8gaXMgdXNlZCB0byBpbnNlcnQgdGhpcyBpbnRvIHRoZSBNYWNoaW5lQmFzaWNCbG9jay4KKyAgYm9vbCB1c2VzQ3VzdG9tSW5zZXJ0aW9uSG9vaygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OlVzZXNDdXN0b21JbnNlcnRlcik7CisgIH0KKyAgCisgIC8vLyBpc1JlbWF0ZXJpYWxpemFibGUgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBhIGNhbmRpZGF0ZSBmb3IKKyAgLy8vIHJlbWF0LiAgVGhpcyBmbGFnIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSBkb24ndCB1c2UgaXQgYW55bW9yZS4gIElmIHRoaXMKKyAgLy8vIGZsYWcgaXMgc2V0LCB0aGUgaXNSZWFsbHlUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKCkgbWV0aG9kIGlzIGNhbGxlZCB0bworICAvLy8gdmVyaWZ5IHRoZSBpbnN0cnVjdGlvbiBpcyByZWFsbHkgcmVtYXRhYmxlLgorICBib29sIGlzUmVtYXRlcmlhbGl6YWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OlJlbWF0ZXJpYWxpemFibGUpOworICB9CisKKyAgLy8vIGlzQXNDaGVhcEFzQU1vdmUgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgdGhlIHNhbWUgY29zdCAob3IKKyAgLy8vIGxlc3MpIHRoYW4gYSBtb3ZlIGluc3RydWN0aW9uLiBUaGlzIGlzIHVzZWZ1bCBkdXJpbmcgY2VydGFpbiB0eXBlcyBvZgorICAvLy8gb3B0aW1pemF0aW9ucyAoZS5nLiwgcmVtYXQgZHVyaW5nIHR3by1hZGRyZXNzIGNvbnZlcnNpb24gb3IgbWFjaGluZSBsaWNtKQorICAvLy8gd2hlcmUgd2Ugd291bGQgbGlrZSB0byByZW1hdCBvciBob2lzdCB0aGUgaW5zdHJ1Y3Rpb24sIGJ1dCBub3QgaWYgaXQgY29zdHMKKyAgLy8vIG1vcmUgdGhhbiBtb3ZpbmcgdGhlIGluc3RydWN0aW9uIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyLiBOb3RlLCB3ZQorICAvLy8gYXJlIG5vdCBtYXJraW5nIGNvcGllcyBmcm9tIGFuZCB0byB0aGUgc2FtZSByZWdpc3RlciBjbGFzcyB3aXRoIHRoaXMgZmxhZy4KKyAgYm9vbCBpc0FzQ2hlYXBBc0FNb3ZlKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxIDw8IFRJRDo6Q2hlYXBBc0FNb3ZlKTsKKyAgfQorCisgIC8vLyBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gc291cmNlIG9wZXJhbmRzCisgIC8vLyBoYXZlIHNwZWNpYWwgcmVnaXN0ZXIgYWxsb2NhdGlvbiByZXF1aXJlbWVudHMgdGhhdCBhcmUgbm90IGNhcHR1cmVkIGJ5IHRoZQorICAvLy8gb3BlcmFuZCByZWdpc3RlciBjbGFzc2VzLiBlLmcuIEFSTTo6U1RSRCdzIHR3byBzb3VyY2UgcmVnaXN0ZXJzIG11c3QgYmUgYW4KKyAgLy8vIGV2ZW4gLyBvZGQgcGFpciwgQVJNOjpTVE0gcmVnaXN0ZXJzIGhhdmUgdG8gYmUgaW4gYXNjZW5kaW5nIG9yZGVyLgorICAvLy8gUG9zdC1yZWdpc3RlciBhbGxvY2F0aW9uIHBhc3NlcyBzaG91bGQgbm90IGF0dGVtcHQgdG8gY2hhbmdlIGFsbG9jYXRpb25zCisgIC8vLyBmb3Igc291cmNlcyBvZiBpbnN0cnVjdGlvbnMgd2l0aCB0aGlzIGZsYWcuCisgIGJvb2wgaGFzRXh0cmFTcmNSZWdBbGxvY1JlcSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OkV4dHJhU3JjUmVnQWxsb2NSZXEpOworICB9CisKKyAgLy8vIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBkZWYgb3BlcmFuZHMKKyAgLy8vIGhhdmUgc3BlY2lhbCByZWdpc3RlciBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBub3QgY2FwdHVyZWQgYnkgdGhlCisgIC8vLyBvcGVyYW5kIHJlZ2lzdGVyIGNsYXNzZXMuIGUuZy4gQVJNOjpMRFJEJ3MgdHdvIGRlZiByZWdpc3RlcnMgbXVzdCBiZSBhbgorICAvLy8gZXZlbiAvIG9kZCBwYWlyLCBBUk06OkxETSByZWdpc3RlcnMgaGF2ZSB0byBiZSBpbiBhc2NlbmRpbmcgb3JkZXIuCisgIC8vLyBQb3N0LXJlZ2lzdGVyIGFsbG9jYXRpb24gcGFzc2VzIHNob3VsZCBub3QgYXR0ZW1wdCB0byBjaGFuZ2UgYWxsb2NhdGlvbnMKKyAgLy8vIGZvciBkZWZpbml0aW9ucyBvZiBpbnN0cnVjdGlvbnMgd2l0aCB0aGlzIGZsYWcuCisgIGJvb2wgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBUSUQ6OkV4dHJhRGVmUmVnQWxsb2NSZXEpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMGM0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oCkBAIC0wLDAgKzEsNjM0IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIC0gSW5zdHJ1Y3Rpb24gSW5mbyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHRhcmdldCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCB0byB0aGUgY29kZSBnZW5lcmF0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9UQVJHRVRJTlNUUklORk9fSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRJTlNUUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJEZXNjLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENhbGxlZVNhdmVkSW5mbzsKK2NsYXNzIEluc3RySXRpbmVyYXJ5RGF0YTsKK2NsYXNzIExpdmVWYXJpYWJsZXM7CitjbGFzcyBNQ0FzbUluZm87CitjbGFzcyBNYWNoaW5lTWVtT3BlcmFuZDsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIFNETm9kZTsKK2NsYXNzIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplcjsKK2NsYXNzIFNlbGVjdGlvbkRBRzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vCisvLy8gVGFyZ2V0SW5zdHJJbmZvIC0gSW50ZXJmYWNlIHRvIGRlc2NyaXB0aW9uIG9mIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0CisvLy8KK2NsYXNzIFRhcmdldEluc3RySW5mbyB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAqRGVzY3JpcHRvcnM7IC8vIFJhdyBhcnJheSB0byBhbGxvdyBzdGF0aWMgaW5pdCduCisgIHVuc2lnbmVkIE51bU9wY29kZXM7ICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkZXNjIGFycmF5CisKKyAgVGFyZ2V0SW5zdHJJbmZvKGNvbnN0IFRhcmdldEluc3RySW5mbyAmKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVGFyZ2V0SW5zdHJJbmZvICYpOyAgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3B1YmxpYzoKKyAgVGFyZ2V0SW5zdHJJbmZvKGNvbnN0IFRhcmdldEluc3RyRGVzYyAqZGVzYywgdW5zaWduZWQgTnVtT3Bjb2Rlcyk7CisgIHZpcnR1YWwgflRhcmdldEluc3RySW5mbygpOworCisgIHVuc2lnbmVkIGdldE51bU9wY29kZXMoKSBjb25zdCB7IHJldHVybiBOdW1PcGNvZGVzOyB9CisKKyAgLy8vIGdldCAtIFJldHVybiB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorICAvLy8KKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZnZXQodW5zaWduZWQgT3Bjb2RlKSBjb25zdCB7CisgICAgYXNzZXJ0KE9wY29kZSA8IE51bU9wY29kZXMgJiYgIkludmFsaWQgb3Bjb2RlISIpOworICAgIHJldHVybiBEZXNjcmlwdG9yc1tPcGNvZGVdOworICB9CisKKyAgLy8vIGlzVHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZSAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyB0cml2aWFsbHkKKyAgLy8vIHJlbWF0ZXJpYWxpemFibGUsIG1lYW5pbmcgaXQgaGFzIG5vIHNpZGUgZWZmZWN0cyBhbmQgcmVxdWlyZXMgbm8gb3BlcmFuZHMKKyAgLy8vIHRoYXQgYXJlbid0IGFsd2F5cyBhdmFpbGFibGUuCisgIGJvb2wgaXNUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBID0gMCkgY29uc3QgeworICAgIHJldHVybiBNSS0+Z2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYgfHwKKyAgICAgICAgICAgKE1JLT5nZXREZXNjKCkuaXNSZW1hdGVyaWFsaXphYmxlKCkgJiYKKyAgICAgICAgICAgIChpc1JlYWxseVRyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoTUksIEFBKSB8fAorICAgICAgICAgICAgIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZUdlbmVyaWMoTUksIEFBKSkpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZSAtIEZvciBpbnN0cnVjdGlvbnMgd2l0aCBvcGNvZGVzIGZvcgorICAvLy8gd2hpY2ggdGhlIE1fUkVNQVRFUklBTElaQUJMRSBmbGFnIGlzIHNldCwgdGhpcyBob29rIGxldHMgdGhlIHRhcmdldAorICAvLy8gc3BlY2lmeSB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBpcyBhY3R1YWxseSB0cml2aWFsbHkgcmVtYXRlcmlhbGl6YWJsZSwKKyAgLy8vIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gaXRzIG9wZXJhbmRzLiBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiBmYWxzZQorICAvLy8gaWYgdGhlIGluc3RydWN0aW9uIGhhcyBhbnkgc2lkZSBlZmZlY3RzIG90aGVyIHRoYW4gcHJvZHVjaW5nIGEgdmFsdWUsIG9yCisgIC8vLyBpZiBpdCByZXF1cmVzIGFueSBhZGRyZXNzIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYWx3YXlzIGF2YWlsYWJsZS4KKyAgdmlydHVhbCBib29sIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBpc1JlYWxseVRyaXZpYWxseVJlTWF0ZXJpYWxpemFibGVHZW5lcmljIC0gRm9yIGluc3RydWN0aW9ucyB3aXRoIG9wY29kZXMKKyAgLy8vIGZvciB3aGljaCB0aGUgTV9SRU1BVEVSSUFMSVpBQkxFIGZsYWcgaXMgc2V0IGFuZCB0aGUgdGFyZ2V0IGhvb2sKKyAgLy8vIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZSByZXR1cm5zIGZhbHNlLCB0aGlzIGZ1bmN0aW9uIGRvZXMKKyAgLy8vIHRhcmdldC1pbmRlcGVuZGVudCB0ZXN0cyB0byBkZXRlcm1pbmUgaWYgdGhlIGluc3RydWN0aW9uIGlzIHJlYWxseQorICAvLy8gdHJpdmlhbGx5IHJlbWF0ZXJpYWxpemFibGUuCisgIGJvb2wgaXNSZWFsbHlUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlR2VuZXJpYyhjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAqQUEpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBpc0NvYWxlc2NhYmxlRXh0SW5zdHIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSAiY29hbGVzY2FibGUiCisgIC8vLyBleHRlbnNpb24gaW5zdHJ1Y3Rpb24uIFRoYXQgaXMsIGl0J3MgbGlrZSBhIGNvcHkgd2hlcmUgaXQncyBsZWdhbCBmb3IgdGhlCisgIC8vLyBzb3VyY2UgdG8gb3ZlcmxhcCB0aGUgZGVzdGluYXRpb24uIGUuZy4gWDg2OjpNT1ZTWDY0cnIzMi4gSWYgdGhpcyByZXR1cm5zCisgIC8vLyB0cnVlLCB0aGVuIGl0J3MgZXhwZWN0ZWQgdGhlIHByZS1leHRlbnNpb24gdmFsdWUgaXMgYXZhaWxhYmxlIGFzIGEgc3VicmVnCisgIC8vLyBvZiB0aGUgcmVzdWx0IHJlZ2lzdGVyLiBUaGlzIGFsc28gcmV0dXJucyB0aGUgc3ViLXJlZ2lzdGVyIGluZGV4IGluCisgIC8vLyBTdWJJZHguCisgIHZpcnR1YWwgYm9vbCBpc0NvYWxlc2NhYmxlRXh0SW5zdHIoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmU3JjUmVnLCB1bnNpZ25lZCAmRHN0UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTdWJJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNMb2FkRnJvbVN0YWNrU2xvdCAtIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBhIGRpcmVjdAorICAvLy8gbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorICAvLy8gdGhlIGRlc3RpbmF0aW9uIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKyAgLy8vIG5vdCwgcmV0dXJuIDAuICBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiAwIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMKKyAgLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBsb2FkaW5nIGZyb20gdGhlIHN0YWNrIHNsb3QuCisgIHZpcnR1YWwgdW5zaWduZWQgaXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gaXNMb2FkRnJvbVN0YWNrU2xvdFBvc3RGRSAtIENoZWNrIGZvciBwb3N0LWZyYW1lIHB0ciBlbGltaW5hdGlvbgorICAvLy8gc3RhY2sgbG9jYXRpb25zIGFzIHdlbGwuICBUaGlzIHVzZXMgYSBoZXVyaXN0aWMgc28gaXQgaXNuJ3QKKyAgLy8vIHJlbGlhYmxlIGZvciBjb3JyZWN0bmVzcy4KKyAgdmlydHVhbCB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90UG9zdEZFKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBoYXNMb2FkRnJvbVN0YWNrU2xvdCAtIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBoYXMKKyAgLy8vIGEgbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRydWUgYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleAorICAvLy8gb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90IGFuZCB0aGUgbWFjaGluZSBtZW0gb3BlcmFuZCBjb250YWluaW5nCisgIC8vLyB0aGUgcmVmZXJlbmNlLiAgSWYgbm90LCByZXR1cm4gZmFsc2UuICBVbmxpa2UKKyAgLy8vIGlzTG9hZEZyb21TdGFja1Nsb3QsIHRoaXMgcmV0dXJucyB0cnVlIGZvciBhbnkgaW5zdHJ1Y3Rpb25zIHRoYXQKKyAgLy8vIGxvYWRzIGZyb20gdGhlIHN0YWNrLiAgVGhpcyBpcyBqdXN0IGEgaGludCwgYXMgc29tZSBjYXNlcyBtYXkgYmUKKyAgLy8vIG1pc3NlZC4KKyAgdmlydHVhbCBib29sIGhhc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqJk1NTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisgIAorICAvLy8gaXNTdG9yZVRvU3RhY2tTbG90IC0gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGEgZGlyZWN0CisgIC8vLyBzdG9yZSB0byBhIHN0YWNrIHNsb3QsIHJldHVybiB0aGUgdmlydHVhbCBvciBwaHlzaWNhbCByZWdpc3RlciBudW1iZXIgb2YKKyAgLy8vIHRoZSBzb3VyY2UgcmVnIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKyAgLy8vIG5vdCwgcmV0dXJuIDAuICBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiAwIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMKKyAgLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBzdG9yaW5nIHRvIHRoZSBzdGFjayBzbG90LgorICB2aXJ0dWFsIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBpc1N0b3JlVG9TdGFja1Nsb3RQb3N0RkUgLSBDaGVjayBmb3IgcG9zdC1mcmFtZSBwdHIgZWxpbWluYXRpb24KKyAgLy8vIHN0YWNrIGxvY2F0aW9ucyBhcyB3ZWxsLiAgVGhpcyB1c2VzIGEgaGV1cmlzdGljIHNvIGl0IGlzbid0CisgIC8vLyByZWxpYWJsZSBmb3IgY29ycmVjdG5lc3MuCisgIHZpcnR1YWwgdW5zaWduZWQgaXNTdG9yZVRvU3RhY2tTbG90UG9zdEZFKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIGhhc1N0b3JlVG9TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaGFzIGEKKyAgLy8vIHN0b3JlIHRvIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRydWUgYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZgorICAvLy8gdGhlIGxvYWRlZCBzdGFjayBzbG90IGFuZCB0aGUgbWFjaGluZSBtZW0gb3BlcmFuZCBjb250YWluaW5nIHRoZQorICAvLy8gcmVmZXJlbmNlLiAgSWYgbm90LCByZXR1cm4gZmFsc2UuICBVbmxpa2UgaXNTdG9yZVRvU3RhY2tTbG90LAorICAvLy8gdGhpcyByZXR1cm5zIHRydWUgZm9yIGFueSBpbnN0cnVjdGlvbnMgdGhhdCBzdG9yZXMgdG8gdGhlCisgIC8vLyBzdGFjay4gIFRoaXMgaXMganVzdCBhIGhpbnQsIGFzIHNvbWUgY2FzZXMgbWF5IGJlIG1pc3NlZC4KKyAgdmlydHVhbCBib29sIGhhc1N0b3JlVG9TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgKiZNTU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIHJlTWF0ZXJpYWxpemUgLSBSZS1pc3N1ZSB0aGUgc3BlY2lmaWVkICdvcmlnaW5hbCcgaW5zdHJ1Y3Rpb24gYXQgdGhlCisgIC8vLyBzcGVjaWZpYyBsb2NhdGlvbiB0YXJnZXRpbmcgYSBuZXcgZGVzdGluYXRpb24gcmVnaXN0ZXIuCisgIC8vLyBUaGUgcmVnaXN0ZXIgaW4gT3JpZy0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSB3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5CisgIC8vLyBEZXN0UmVnOlN1YklkeC4gQW55IGV4aXN0aW5nIHN1YnJlZyBpbmRleCBpcyBwcmVzZXJ2ZWQgb3IgY29tcG9zZWQgd2l0aAorICAvLy8gU3ViSWR4LgorICB2aXJ0dWFsIHZvaWQgcmVNYXRlcmlhbGl6ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpPcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3QgPSAwOworCisgIC8vLyBzY2hlZHVsZVR3b0FkZHJTb3VyY2UgLSBTY2hlZHVsZSB0aGUgY29weSAvIHJlLW1hdCBvZiB0aGUgc291cmNlIG9mIHRoZQorICAvLy8gdHdvLWFkZHJzcyBpbnN0cnVjdGlvbiBpbnNlcnRlZCBieSB0d28tYWRkcmVzcyBwYXNzLgorICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVUd29BZGRyU291cmNlKE1hY2hpbmVJbnN0ciAqU3JjTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpVc2VNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3QgeworICAgIC8vIERvIG5vdGhpbmcuCisgIH0KKworICAvLy8gZHVwbGljYXRlIC0gQ3JlYXRlIGEgZHVwbGljYXRlIG9mIHRoZSBPcmlnIGluc3RydWN0aW9uIGluIE1GLiBUaGlzIGlzIGxpa2UKKyAgLy8vIE1hY2hpbmVGdW5jdGlvbjo6Q2xvbmVNYWNoaW5lSW5zdHIoKSwgYnV0IHRoZSB0YXJnZXQgbWF5IHVwZGF0ZSBvcGVyYW5kcworICAvLy8gdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgdW5pcXVlLgorICAvLy8KKyAgLy8vIFRoZSBpbnN0cnVjdGlvbiBtdXN0IGJlIGR1cGxpY2FibGUgYXMgaW5kaWNhdGVkIGJ5IGlzTm90RHVwbGljYWJsZSgpLgorICB2aXJ0dWFsIE1hY2hpbmVJbnN0ciAqZHVwbGljYXRlKE1hY2hpbmVJbnN0ciAqT3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCA9IDA7CisKKyAgLy8vIGNvbnZlcnRUb1RocmVlQWRkcmVzcyAtIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0CisgIC8vLyBzZXQgdGhlIE1fQ09OVkVSVElCTEVfVE9fM19BRERSIGZsYWcuICBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSB0YXJnZXQKKyAgLy8vIG1heSBiZSBhYmxlIHRvIGNvbnZlcnQgYSB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbiBpbnRvIG9uZSBvciBtb3JlIHRydWUKKyAgLy8vIHRocmVlLWFkZHJlc3MgaW5zdHJ1Y3Rpb25zIG9uIGRlbWFuZC4gIFRoaXMgYWxsb3dzIHRoZSBYODYgdGFyZ2V0IChmb3IKKyAgLy8vIGV4YW1wbGUpIHRvIGNvbnZlcnQgQUREIGFuZCBTSEwgaW5zdHJ1Y3Rpb25zIGludG8gTEVBIGluc3RydWN0aW9ucyBpZiB0aGV5CisgIC8vLyB3b3VsZCByZXF1aXJlIHJlZ2lzdGVyIGNvcGllcyBkdWUgdG8gdHdvLWFkZHJlc3NuZXNzLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgYSBudWxsIHBvaW50ZXIgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGNhbm5vdCBiZQorICAvLy8gcGVyZm9ybWVkLCBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgbGFzdCBuZXcgaW5zdHJ1Y3Rpb24uCisgIC8vLworICB2aXJ0dWFsIE1hY2hpbmVJbnN0ciAqCisgIGNvbnZlcnRUb1RocmVlQWRkcmVzcyhNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yICZNRkksCisgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLCBMaXZlVmFyaWFibGVzICpMVikgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIGNvbW11dGVJbnN0cnVjdGlvbiAtIElmIGEgdGFyZ2V0IGhhcyBhbnkgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlCisgIC8vLyBjb21tdXRhYmxlIGJ1dCByZXF1aXJlIGNvbnZlcnRpbmcgdG8gZGlmZmVyZW50IGluc3RydWN0aW9ucyBvciBtYWtpbmcKKyAgLy8vIG5vbi10cml2aWFsIGNoYW5nZXMgdG8gY29tbXV0ZSB0aGVtLCB0aGlzIG1ldGhvZCBjYW4gb3ZlcmxvYWRlZCB0byBkbworICAvLy8gdGhhdC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBzd2FwcyB0aGUgY29tbXV0YWJsZSBvcGVyYW5kcy4KKyAgLy8vIElmIE5ld01JIGlzIGZhbHNlLCBNSSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQ7IG90aGVyd2lzZSwgYQorICAvLy8gbmV3IG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuICBEbyBub3QgY2FsbCB0aGlzCisgIC8vLyBtZXRob2QgZm9yIGEgbm9uLWNvbW11dGFibGUgaW5zdHJ1Y3Rpb24sIGJ1dCB0aGVyZSBtYXkgYmUgc29tZSBjYXNlcworICAvLy8gd2hlcmUgdGhpcyBtZXRob2QgZmFpbHMgYW5kIHJldHVybnMgbnVsbC4KKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgKmNvbW11dGVJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTmV3TUkgPSBmYWxzZSkgY29uc3QgPSAwOworCisgIC8vLyBmaW5kQ29tbXV0ZWRPcEluZGljZXMgLSBJZiBzcGVjaWZpZWQgTUkgaXMgY29tbXV0YWJsZSwgcmV0dXJuIHRoZSB0d28KKyAgLy8vIG9wZXJhbmQgaW5kaWNlcyB0aGF0IHdvdWxkIHN3YXAgdmFsdWUuIFJldHVybiBmYWxzZSBpZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIGlzIG5vdCBpbiBhIGZvcm0gd2hpY2ggdGhpcyByb3V0aW5lIHVuZGVyc3RhbmRzLgorICB2aXJ0dWFsIGJvb2wgZmluZENvbW11dGVkT3BJbmRpY2VzKE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkICZTcmNPcElkeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlNyY09wSWR4MikgY29uc3QgPSAwOworCisgIC8vLyBwcm9kdWNlU2FtZVZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdHdvIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHdvdWxkIHByb2R1Y2UKKyAgLy8vIGlkZW50aWNhbCB2YWx1ZXMuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgb25seSB0cnVlIHdoZW4gdGhlIHR3byBpbnN0cnVjdGlvbnMKKyAgLy8vIGFyZSBkZWVtZWQgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgZGVmcy4KKyAgdmlydHVhbCBib29sIHByb2R1Y2VTYW1lVmFsdWUoY29uc3QgTWFjaGluZUluc3RyICpNSTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkxKSBjb25zdCA9IDA7CisKKyAgLy8vIEFuYWx5emVCcmFuY2ggLSBBbmFseXplIHRoZSBicmFuY2hpbmcgY29kZSBhdCB0aGUgZW5kIG9mIE1CQiwgcmV0dXJuaW5nCisgIC8vLyB0cnVlIGlmIGl0IGNhbm5vdCBiZSB1bmRlcnN0b29kIChlLmcuIGl0J3MgYSBzd2l0Y2ggZGlzcGF0Y2ggb3IgaXNuJ3QKKyAgLy8vIGltcGxlbWVudGVkIGZvciBhIHRhcmdldCkuICBVcG9uIHN1Y2Nlc3MsIHRoaXMgcmV0dXJucyBmYWxzZSBhbmQgcmV0dXJucworICAvLy8gd2l0aCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHZhcmlvdXMgY2FzZXM6CisgIC8vLworICAvLy8gMS4gSWYgdGhpcyBibG9jayBlbmRzIHdpdGggbm8gYnJhbmNoZXMgKGl0IGp1c3QgZmFsbHMgdGhyb3VnaCB0byBpdHMgc3VjYykKKyAgLy8vICAgIGp1c3QgcmV0dXJuIGZhbHNlLCBsZWF2aW5nIFRCQi9GQkIgbnVsbC4KKyAgLy8vIDIuIElmIHRoaXMgYmxvY2sgZW5kcyB3aXRoIG9ubHkgYW4gdW5jb25kaXRpb25hbCBicmFuY2gsIGl0IHNldHMgVEJCIHRvIGJlCisgIC8vLyAgICB0aGUgZGVzdGluYXRpb24gYmxvY2suCisgIC8vLyAzLiBJZiB0aGlzIGJsb2NrIGVuZHMgd2l0aCBhIGNvbmRpdGlvbmFsIGJyYW5jaCBhbmQgaXQgZmFsbHMgdGhyb3VnaCB0byBhCisgIC8vLyAgICBzdWNjZXNzb3IgYmxvY2ssIGl0IHNldHMgVEJCIHRvIGJlIHRoZSBicmFuY2ggZGVzdGluYXRpb24gYmxvY2sgYW5kIGEKKyAgLy8vICAgIGxpc3Qgb2Ygb3BlcmFuZHMgdGhhdCBldmFsdWF0ZSB0aGUgY29uZGl0aW9uLiBUaGVzZSBvcGVyYW5kcyBjYW4gYmUKKyAgLy8vICAgIHBhc3NlZCB0byBvdGhlciBUYXJnZXRJbnN0ckluZm8gbWV0aG9kcyB0byBjcmVhdGUgbmV3IGJyYW5jaGVzLgorICAvLy8gNC4gSWYgdGhpcyBibG9jayBlbmRzIHdpdGggYSBjb25kaXRpb25hbCBicmFuY2ggZm9sbG93ZWQgYnkgYW4KKyAgLy8vICAgIHVuY29uZGl0aW9uYWwgYnJhbmNoLCBpdCByZXR1cm5zIHRoZSAndHJ1ZScgZGVzdGluYXRpb24gaW4gVEJCLCB0aGUKKyAgLy8vICAgICdmYWxzZScgZGVzdGluYXRpb24gaW4gRkJCLCBhbmQgYSBsaXN0IG9mIG9wZXJhbmRzIHRoYXQgZXZhbHVhdGUgdGhlCisgIC8vLyAgICBjb25kaXRpb24uICBUaGVzZSBvcGVyYW5kcyBjYW4gYmUgcGFzc2VkIHRvIG90aGVyIFRhcmdldEluc3RySW5mbworICAvLy8gICAgbWV0aG9kcyB0byBjcmVhdGUgbmV3IGJyYW5jaGVzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBSZW1vdmVCcmFuY2ggYW5kIEluc2VydEJyYW5jaCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHN1cHBvcnQKKyAgLy8vIGNhc2VzIHdoZXJlIHRoaXMgbWV0aG9kIHJldHVybnMgc3VjY2Vzcy4KKyAgLy8vCisgIC8vLyBJZiBBbGxvd01vZGlmeSBpcyB0cnVlLCB0aGVuIHRoaXMgcm91dGluZSBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYmFzaWMKKyAgLy8vIGJsb2NrIChlLmcuIGRlbGV0ZSBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoKS4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBBbmFseXplQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqJkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmVtb3ZlQnJhbmNoIC0gUmVtb3ZlIHRoZSBicmFuY2hpbmcgY29kZSBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpYyBNQkIuCisgIC8vLyBUaGlzIGlzIG9ubHkgaW52b2tlZCBpbiBjYXNlcyB3aGVyZSBBbmFseXplQnJhbmNoIHJldHVybnMgc3VjY2Vzcy4gSXQKKyAgLy8vIHJldHVybnMgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCB3ZXJlIHJlbW92ZWQuCisgIHZpcnR1YWwgdW5zaWduZWQgUmVtb3ZlQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0IHsKKyAgICBhc3NlcnQoMCAmJiAiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgVGFyZ2V0SW5zdHJJbmZvOjpSZW1vdmVCcmFuY2ghIik7IAorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIEluc2VydEJyYW5jaCAtIEluc2VydCBicmFuY2ggY29kZSBpbnRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZAorICAvLy8gTWFjaGluZUJhc2ljQmxvY2suICBUaGUgb3BlcmFuZHMgdG8gdGhpcyBtZXRob2QgYXJlIHRoZSBzYW1lIGFzIHRob3NlCisgIC8vLyByZXR1cm5lZCBieSBBbmFseXplQnJhbmNoLiAgVGhpcyBpcyBvbmx5IGludm9rZWQgaW4gY2FzZXMgd2hlcmUKKyAgLy8vIEFuYWx5emVCcmFuY2ggcmV0dXJucyBzdWNjZXNzLiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zCisgIC8vLyBpbnNlcnRlZC4KKyAgLy8vCisgIC8vLyBJdCBpcyBhbHNvIGludm9rZWQgYnkgdGFpbCBtZXJnaW5nIHRvIGFkZCB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzIGluCisgIC8vLyBjYXNlcyB3aGVyZSBBbmFseXplQnJhbmNoIGRvZXNuJ3QgYXBwbHkgYmVjYXVzZSB0aGVyZSB3YXMgbm8gb3JpZ2luYWwKKyAgLy8vIGJyYW5jaCB0byBhbmFseXplLiAgQXQgbGVhc3QgdGhpcyBtdWNoIG11c3QgYmUgaW1wbGVtZW50ZWQsIGVsc2UgdGFpbAorICAvLy8gbWVyZ2luZyBuZWVkcyB0byBiZSBkaXNhYmxlZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBJbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0IHsKKyAgICBhc3NlcnQoMCAmJiAiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgVGFyZ2V0SW5zdHJJbmZvOjpJbnNlcnRCcmFuY2ghIik7IAorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFJlcGxhY2VUYWlsV2l0aEJyYW5jaFRvIC0gRGVsZXRlIHRoZSBpbnN0cnVjdGlvbiBPbGRJbnN0IGFuZCBldmVyeXRoaW5nCisgIC8vLyBhZnRlciBpdCwgcmVwbGFjaW5nIGl0IHdpdGggYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gTmV3RGVzdC4gVGhpcyBpcworICAvLy8gdXNlZCBieSB0aGUgdGFpbCBtZXJnaW5nIHBhc3MuCisgIHZpcnR1YWwgdm9pZCBSZXBsYWNlVGFpbFdpdGhCcmFuY2hUbyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgVGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdEZXN0KSBjb25zdCA9IDA7CisKKyAgLy8vIGlzTGVnYWxUb1NwbGl0TUJCQXQgLSBSZXR1cm4gdHJ1ZSBpZiBpdCdzIGxlZ2FsIHRvIHNwbGl0IHRoZSBnaXZlbiBiYXNpYworICAvLy8gYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiAoaS5lLiBpbnN0cnVjdGlvbiB3b3VsZCBiZSB0aGUgc3RhcnQKKyAgLy8vIG9mIGEgbmV3IGJhc2ljIGJsb2NrKS4KKyAgdmlydHVhbCBib29sIGlzTGVnYWxUb1NwbGl0TUJCQXQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBpc1Byb2ZpdGFibGVUb0lmQ3Z0IC0gUmV0dXJuIHRydWUgaWYgaXQncyBwcm9maXRhYmxlIHRvIGZpcnN0ICJOdW1JbnN0cnMiCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLgorICB2aXJ0dWFsCisgIGJvb2wgaXNQcm9maXRhYmxlVG9JZkN2dChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCB1bnNpZ25lZCBOdW1JbnN0cnMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vLyBpc1Byb2ZpdGFibGVUb0lmQ3Z0IC0gU2Vjb25kIHZhcmlhbnQgb2YgaXNQcm9maXRhYmxlVG9JZkN2dCwgdGhpcyBvbmUKKyAgLy8vIGNoZWNrcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdHdvIGJhc2ljIGJsb2NrcyBmcm9tIHRydWUgYW5kIGZhbHNlIHBhdGgKKyAgLy8vIG9mIGEgaWYtdGhlbi1lbHNlIChkaWFtb25kKSBhcmUgcHJlZGljYXRlZCBvbiBtdXRhbGx5IGV4Y2x1c2l2ZQorICAvLy8gcHJlZGljYXRlcy4KKyAgdmlydHVhbCBib29sCisgIGlzUHJvZml0YWJsZVRvSWZDdnQoTWFjaGluZUJhc2ljQmxvY2sgJlRNQkIsIHVuc2lnbmVkIE51bVRJbnN0cnMsCisgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJkZNQkIsIHVuc2lnbmVkIE51bUZJbnN0cnMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNQcm9maXRhYmxlVG9EdXBGb3JJZkN2dCAtIFJldHVybiB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSBmb3IKKyAgLy8vIGlmLWNvbnZlcnRlciB0byBkdXBsaWNhdGUgYSBzcGVjaWZpYyBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGluIHRoZQorICAvLy8gc3BlY2lmaWVkIE1CQiB0byBlbmFibGUgaWYtY29udmVyc2lvbi4KKyAgdmlydHVhbCBib29sCisgIGlzUHJvZml0YWJsZVRvRHVwRm9ySWZDdnQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQix1bnNpZ25lZCBOdW1JbnN0cnMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vLyBjb3B5UGh5c1JlZyAtIEVtaXQgaW5zdHJ1Y3Rpb25zIHRvIGNvcHkgYSBwYWlyIG9mIHBoeXNpY2FsIHJlZ2lzdGVycy4KKyAgdmlydHVhbCB2b2lkIGNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdCB7CisgICAgYXNzZXJ0KDAgJiYgIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6Y29weVBoeXNSZWchIik7CisgIH0KKworICAvLy8gc3RvcmVSZWdUb1N0YWNrU2xvdCAtIFN0b3JlIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgb2YgdGhlIGdpdmVuIHJlZ2lzdGVyCisgIC8vLyBjbGFzcyB0byB0aGUgc3BlY2lmaWVkIHN0YWNrIGZyYW1lIGluZGV4LiBUaGUgc3RvcmUgaW5zdHJ1Y3Rpb24gaXMgdG8gYmUKKyAgLy8vIGFkZGVkIHRvIHRoZSBnaXZlbiBtYWNoaW5lIGJhc2ljIGJsb2NrIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG1hY2hpbmUKKyAgLy8vIGluc3RydWN0aW9uLiBJZiBpc0tpbGwgaXMgdHJ1ZSwgdGhlIHJlZ2lzdGVyIG9wZXJhbmQgaXMgdGhlIGxhc3QgdXNlIGFuZAorICAvLy8gbXVzdCBiZSBtYXJrZWQga2lsbC4KKyAgdmlydHVhbCB2b2lkIHN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGFzc2VydCgwICYmICJUYXJnZXQgZGlkbid0IGltcGxlbWVudCBUYXJnZXRJbnN0ckluZm86OnN0b3JlUmVnVG9TdGFja1Nsb3QhIik7CisgIH0KKworICAvLy8gbG9hZFJlZ0Zyb21TdGFja1Nsb3QgLSBMb2FkIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgb2YgdGhlIGdpdmVuIHJlZ2lzdGVyCisgIC8vLyBjbGFzcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhY2sgZnJhbWUgaW5kZXguIFRoZSBsb2FkIGluc3RydWN0aW9uIGlzIHRvIGJlCisgIC8vLyBhZGRlZCB0byB0aGUgZ2l2ZW4gbWFjaGluZSBiYXNpYyBibG9jayBiZWZvcmUgdGhlIHNwZWNpZmllZCBtYWNoaW5lCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgdmlydHVhbCB2b2lkIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgYXNzZXJ0KDAgJiYgIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6bG9hZFJlZ0Zyb21TdGFja1Nsb3QhIik7CisgIH0KKyAgCisgIC8vLyBzcGlsbENhbGxlZVNhdmVkUmVnaXN0ZXJzIC0gSXNzdWVzIGluc3RydWN0aW9uKHMpIHRvIHNwaWxsIGFsbCBjYWxsZWUKKyAgLy8vIHNhdmVkIHJlZ2lzdGVycyBhbmQgcmV0dXJucyB0cnVlIGlmIGl0IGlzbid0IHBvc3NpYmxlIC8gcHJvZml0YWJsZSB0byBkbworICAvLy8gc28gYnkgaXNzdWluZyBhIHNlcmllcyBvZiBzdG9yZSBpbnN0cnVjdGlvbnMgdmlhCisgIC8vLyBzdG9yZVJlZ1RvU3RhY2tTbG90KCkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgc3BpbGxDYWxsZWVTYXZlZFJlZ2lzdGVycyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyByZXN0b3JlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMgLSBJc3N1ZXMgaW5zdHJ1Y3Rpb24ocykgdG8gcmVzdG9yZSBhbGwgY2FsbGVlCisgIC8vLyBzYXZlZCByZWdpc3RlcnMgYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCBpc24ndCBwb3NzaWJsZSAvIHByb2ZpdGFibGUgdG8gZG8KKyAgLy8vIHNvIGJ5IGlzc3VpbmcgYSBzZXJpZXMgb2YgbG9hZCBpbnN0cnVjdGlvbnMgdmlhIGxvYWRSZWdUb1N0YWNrU2xvdCgpLgorICAvLy8gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisgIHZpcnR1YWwgYm9vbCByZXN0b3JlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLy8gZW1pdEZyYW1lSW5kZXhEZWJ1Z1ZhbHVlIC0gRW1pdCBhIHRhcmdldC1kZXBlbmRlbnQgZm9ybSBvZgorICAvLy8gREJHX1ZBTFVFIGVuY29kaW5nIHRoZSBhZGRyZXNzIG9mIGEgZnJhbWUgaW5kZXguICBBZGRyZXNzZXMgd291bGQKKyAgLy8vIG5vcm1hbGx5IGJlIGxvd2VyZWQgdGhlIHNhbWUgd2F5IGFzIG90aGVyIGFkZHJlc3NlcyBvbiB0aGUgdGFyZ2V0LAorICAvLy8gZS5nLiBpbiBsb2FkIGluc3RydWN0aW9ucy4gIEZvciB0YXJnZXRzIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhpcworICAvLy8gdGhlIGRlYnVnIGluZm8gaXMgc2ltcGx5IGxvc3QuCisgIC8vLyBJZiB5b3UgYWRkIHRoaXMgZm9yIGEgdGFyZ2V0IHlvdSBzaG91bGQgaGFuZGxlIHRoaXMgREJHX1ZBTFVFIGluIHRoZQorICAvLy8gdGFyZ2V0LXNwZWNpZmljIEFzbVByaW50ZXIgY29kZSBhcyB3ZWxsOyB5b3Ugd2lsbCBwcm9iYWJseSBnZXQgaW52YWxpZAorICAvLy8gYXNzZW1ibHkgb3V0cHV0IGlmIHlvdSBkb24ndC4KKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgKmVtaXRGcmFtZUluZGV4RGVidWdWYWx1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGcmFtZUl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKk1EUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gZm9sZE1lbW9yeU9wZXJhbmQgLSBBdHRlbXB0IHRvIGZvbGQgYSBsb2FkIG9yIHN0b3JlIG9mIHRoZSBzcGVjaWZpZWQgc3RhY2sKKyAgLy8vIHNsb3QgaW50byB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmFuZChzKS4KKyAgLy8vIElmIHRoaXMgaXMgcG9zc2libGUsIGEgbmV3IGluc3RydWN0aW9uIGlzIHJldHVybmVkIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gb3BlcmFuZCBmb2xkZWQsIG90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLgorICAvLy8gVGhlIG5ldyBpbnN0cnVjdGlvbiBpcyBpbnNlcnRlZCBiZWZvcmUgTUksIGFuZCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlCisgIC8vLyBmb3IgcmVtb3ZpbmcgdGhlIG9sZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyKiBmb2xkTWVtb3J5T3BlcmFuZChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGcmFtZUluZGV4KSBjb25zdDsKKworICAvLy8gZm9sZE1lbW9yeU9wZXJhbmQgLSBTYW1lIGFzIHRoZSBwcmV2aW91cyB2ZXJzaW9uIGV4Y2VwdCBpdCBhbGxvd3MgZm9sZGluZworICAvLy8gb2YgYW55IGxvYWQgYW5kIHN0b3JlIGZyb20gLyB0byBhbnkgYWRkcmVzcywgbm90IGp1c3QgZnJvbSBhIHNwZWNpZmljCisgIC8vLyBzdGFjayBzbG90LgorICBNYWNoaW5lSW5zdHIqIGZvbGRNZW1vcnlPcGVyYW5kKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyKiBMb2FkTUkpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8vLyBmb2xkTWVtb3J5T3BlcmFuZEltcGwgLSBUYXJnZXQtZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIGZvcgorICAvLy8gZm9sZE1lbW9yeU9wZXJhbmQuIFRhcmdldC1pbmRlcGVuZGVudCBjb2RlIGluIGZvbGRNZW1vcnlPcGVyYW5kIHdpbGwKKyAgLy8vIHRha2UgY2FyZSBvZiBhZGRpbmcgYSBNYWNoaW5lTWVtT3BlcmFuZCB0byB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIqIGZvbGRNZW1vcnlPcGVyYW5kSW1wbChNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyKiBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGcmFtZUluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gZm9sZE1lbW9yeU9wZXJhbmRJbXBsIC0gVGFyZ2V0LWRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBmb3IKKyAgLy8vIGZvbGRNZW1vcnlPcGVyYW5kLiBUYXJnZXQtaW5kZXBlbmRlbnQgY29kZSBpbiBmb2xkTWVtb3J5T3BlcmFuZCB3aWxsCisgIC8vLyB0YWtlIGNhcmUgb2YgYWRkaW5nIGEgTWFjaGluZU1lbU9wZXJhbmQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIHZpcnR1YWwgTWFjaGluZUluc3RyKiBmb2xkTWVtb3J5T3BlcmFuZEltcGwoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIqIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciogTG9hZE1JKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworcHVibGljOgorICAvLy8gY2FuRm9sZE1lbW9yeU9wZXJhbmQgLSBSZXR1cm5zIHRydWUgZm9yIHRoZSBzcGVjaWZpZWQgbG9hZCAvIHN0b3JlIGlmCisgIC8vLyBmb2xkaW5nIGlzIHBvc3NpYmxlLgorICB2aXJ0dWFsCisgIGJvb2wgY2FuRm9sZE1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZPcHMpIGNvbnN0ID0wOworCisgIC8vLyB1bmZvbGRNZW1vcnlPcGVyYW5kIC0gU2VwYXJhdGUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gd2hpY2ggZm9sZGVkIGEgbG9hZCBvcgorICAvLy8gYSBzdG9yZSBvciBhIGxvYWQgYW5kIGEgc3RvcmUgaW50byB0d28gb3IgbW9yZSBpbnN0cnVjdGlvbi4gSWYgdGhpcyBpcworICAvLy8gcG9zc2libGUsIHJldHVybnMgdHJ1ZSBhcyB3ZWxsIGFzIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIGJ5IHJlZmVyZW5jZS4KKyAgdmlydHVhbCBib29sIHVuZm9sZE1lbW9yeU9wZXJhbmQoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBib29sIFVuZm9sZExvYWQsIGJvb2wgVW5mb2xkU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyKj4gJk5ld01JcykgY29uc3R7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCBib29sIHVuZm9sZE1lbW9yeU9wZXJhbmQoU2VsZWN0aW9uREFHICZEQUcsIFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNETm9kZSo+ICZOZXdOb2RlcykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBnZXRPcGNvZGVBZnRlck1lbW9yeVVuZm9sZCAtIFJldHVybnMgdGhlIG9wY29kZSBvZiB0aGUgd291bGQgYmUgbmV3CisgIC8vLyBpbnN0cnVjdGlvbiBhZnRlciBsb2FkIC8gc3RvcmUgYXJlIHVuZm9sZGVkIGZyb20gYW4gaW5zdHJ1Y3Rpb24gb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgb3Bjb2RlLiBJdCByZXR1cm5zIHplcm8gaWYgdGhlIHNwZWNpZmllZCB1bmZvbGRpbmcgaXMgbm90CisgIC8vLyBwb3NzaWJsZS4gSWYgTG9hZFJlZ0luZGV4IGlzIG5vbi1udWxsLCBpdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgb3BlcmFuZAorICAvLy8gaW5kZXggb2YgdGhlIG9wZXJhbmQgd2hpY2ggd2lsbCBob2xkIHRoZSByZWdpc3RlciBob2xkaW5nIHRoZSBsb2FkZWQKKyAgLy8vIHZhbHVlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE9wY29kZUFmdGVyTWVtb3J5VW5mb2xkKHVuc2lnbmVkIE9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVbmZvbGRMb2FkLCBib29sIFVuZm9sZFN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqTG9hZFJlZ0luZGV4ID0gMCkgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIGFyZUxvYWRzRnJvbVNhbWVCYXNlUHRyIC0gVGhpcyBpcyB1c2VkIGJ5IHRoZSBwcmUtcmVnYWxsb2Mgc2NoZWR1bGVyCisgIC8vLyB0byBkZXRlcm1pbmUgaWYgdHdvIGxvYWRzIGFyZSBsb2FkaW5nIGZyb20gdGhlIHNhbWUgYmFzZSBhZGRyZXNzLiBJdAorICAvLy8gc2hvdWxkIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIGJhc2UgcG9pbnRlcnMgYXJlIHRoZSBzYW1lIGFuZCB0aGUKKyAgLy8vIG9ubHkgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGFkZHJlc3NlcyBhcmUgdGhlIG9mZnNldC4gSXQgYWxzbyByZXR1cm5zCisgIC8vLyB0aGUgb2Zmc2V0cyBieSByZWZlcmVuY2UuCisgIHZpcnR1YWwgYm9vbCBhcmVMb2Fkc0Zyb21TYW1lQmFzZVB0cihTRE5vZGUgKkxvYWQxLCBTRE5vZGUgKkxvYWQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmT2Zmc2V0MSwgaW50NjRfdCAmT2Zmc2V0MikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBzaG91bGRTY2hlZHVsZUxvYWRzTmVhciAtIFRoaXMgaXMgYSB1c2VkIGJ5IHRoZSBwcmUtcmVnYWxsb2Mgc2NoZWR1bGVyIHRvCisgIC8vLyBkZXRlcm1pbmUgKGluIGNvbmp1Y3Rpb24gd2l0aCBhcmVMb2Fkc0Zyb21TYW1lQmFzZVB0cikgaWYgdHdvIGxvYWRzIHNob3VsZAorICAvLy8gYmUgc2NoZWR1bGVkIHRvZ3RoZXIuIE9uIHNvbWUgdGFyZ2V0cyBpZiB0d28gbG9hZHMgYXJlIGxvYWRpbmcgZnJvbQorICAvLy8gYWRkcmVzc2VzIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUsIGl0J3MgYmV0dGVyIGlmIHRoZXkgYXJlIHNjaGVkdWxlZAorICAvLy8gdG9nZXRoZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgdHdvIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBsb2FkIG9mZnNldHMKKyAgLy8vIGZyb20gdGhlIGNvbW1vbiBiYXNlIGFkZHJlc3MuIEl0IHJldHVybnMgdHJ1ZSBpZiBpdCBkZWNpZGVzIGl0J3MgZGVzaXJhYmxlCisgIC8vLyB0byBzY2hlZHVsZSB0aGUgdHdvIGxvYWRzIHRvZ2V0aGVyLiAiTnVtTG9hZHMiIGlzIHRoZSBudW1iZXIgb2YgbG9hZHMgdGhhdAorICAvLy8gaGF2ZSBhbHJlYWR5IGJlZW4gc2NoZWR1bGVkIGFmdGVyIExvYWQxLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkU2NoZWR1bGVMb2Fkc05lYXIoU0ROb2RlICpMb2FkMSwgU0ROb2RlICpMb2FkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgT2Zmc2V0MSwgaW50NjRfdCBPZmZzZXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtTG9hZHMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vLyBSZXZlcnNlQnJhbmNoQ29uZGl0aW9uIC0gUmV2ZXJzZXMgdGhlIGJyYW5jaCBjb25kaXRpb24gb2YgdGhlIHNwZWNpZmllZAorICAvLy8gY29uZGl0aW9uIGxpc3QsIHJldHVybmluZyBmYWxzZSBvbiBzdWNjZXNzIGFuZCB0cnVlIGlmIGl0IGNhbm5vdCBiZQorICAvLy8gcmV2ZXJzZWQuCisgIHZpcnR1YWwKKyAgYm9vbCBSZXZlcnNlQnJhbmNoQ29uZGl0aW9uKFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgLy8vIGluc2VydE5vb3AgLSBJbnNlcnQgYSBub29wIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkCisgIC8vLyBwb2ludC4KKyAgdmlydHVhbCB2b2lkIGluc2VydE5vb3AoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSkgY29uc3Q7CisgIAorICAKKyAgLy8vIGdldE5vb3BGb3JNYWNob1RhcmdldCAtIFJldHVybiB0aGUgbm9vcCBpbnN0cnVjdGlvbiB0byB1c2UgZm9yIGEgbm9vcC4KKyAgdmlydHVhbCB2b2lkIGdldE5vb3BGb3JNYWNob1RhcmdldChNQ0luc3QgJk5vcEluc3QpIGNvbnN0IHsKKyAgICAvLyBEZWZhdWx0IHRvIGp1c3QgdXNpbmcgJ25vcCcgc3RyaW5nLgorICB9CisgIAorICAKKyAgLy8vIGlzUHJlZGljYXRlZCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYWxyZWFkeSBwcmVkaWNhdGVkLgorICAvLy8KKyAgdmlydHVhbCBib29sIGlzUHJlZGljYXRlZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGlzVW5wcmVkaWNhdGVkVGVybWluYXRvciAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYQorICAvLy8gdGVybWluYXRvciBpbnN0cnVjdGlvbiB0aGF0IGhhcyBub3QgYmVlbiBwcmVkaWNhdGVkLgorICB2aXJ0dWFsIGJvb2wgaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0OworCisgIC8vLyBQcmVkaWNhdGVJbnN0cnVjdGlvbiAtIENvbnZlcnQgdGhlIGluc3RydWN0aW9uIGludG8gYSBwcmVkaWNhdGVkCisgIC8vLyBpbnN0cnVjdGlvbi4gSXQgcmV0dXJucyB0cnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgIHZpcnR1YWwKKyAgYm9vbCBQcmVkaWNhdGVJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmUHJlZCkgY29uc3QgPSAwOworCisgIC8vLyBTdWJzdW1lc1ByZWRpY2F0ZSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlyc3Qgc3BlY2lmaWVkIHByZWRpY2F0ZQorICAvLy8gc3Vic3VtZXMgdGhlIHNlY29uZCwgZS5nLiBHRSBzdWJzdW1lcyBHVC4KKyAgdmlydHVhbAorICBib29sIFN1YnN1bWVzUHJlZGljYXRlKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJlByZWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJlByZWQyKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIERlZmluZXNQcmVkaWNhdGUgLSBJZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGRlZmluZXMgYW55IHByZWRpY2F0ZQorICAvLy8gb3IgY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXIocykgdXNlZCBmb3IgcHJlZGljYXRpb24sIHJldHVybnMgdHJ1ZSBhcyB3ZWxsCisgIC8vLyBhcyB0aGUgZGVmaW5pdGlvbiBwcmVkaWNhdGUocykgYnkgcmVmZXJlbmNlLgorICB2aXJ0dWFsIGJvb2wgRGVmaW5lc1ByZWRpY2F0ZShNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lT3BlcmFuZD4gJlByZWQpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNQcmVkaWNhYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBjYW4gYmUgcHJlZGljYXRlZC4KKyAgLy8vIEJ5IGRlZmF1bHQsIHRoaXMgcmV0dXJucyB0cnVlIGZvciBldmVyeSBpbnN0cnVjdGlvbiB3aXRoIGEKKyAgLy8vIFByZWRpY2F0ZU9wZXJhbmQuCisgIHZpcnR1YWwgYm9vbCBpc1ByZWRpY2FibGUoTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICAgIHJldHVybiBNSS0+Z2V0RGVzYygpLmlzUHJlZGljYWJsZSgpOworICB9CisKKyAgLy8vIGlzU2FmZVRvTW92ZVJlZ0NsYXNzRGVmcyAtIFJldHVybiB0cnVlIGlmIGl0J3Mgc2FmZSB0byBtb3ZlIGEgbWFjaGluZQorICAvLy8gaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MuCisgIHZpcnR1YWwgYm9vbCBpc1NhZmVUb01vdmVSZWdDbGFzc0RlZnMoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBpc1NjaGVkdWxpbmdCb3VuZGFyeSAtIFRlc3QgaWYgdGhlIGdpdmVuIGluc3RydWN0aW9uIHNob3VsZCBiZQorICAvLy8gY29uc2lkZXJlZCBhIHNjaGVkdWxpbmcgYm91bmRhcnkuIFRoaXMgcHJpbWFyaWx5IGluY2x1ZGVzIGxhYmVscyBhbmQKKyAgLy8vIHRlcm1pbmF0b3JzLgorICB2aXJ0dWFsIGJvb2wgaXNTY2hlZHVsaW5nQm91bmRhcnkoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCA9IDA7CisKKyAgLy8vIE1lYXN1cmUgdGhlIHNwZWNpZmllZCBpbmxpbmUgYXNtIHRvIGRldGVybWluZSBhbiBhcHByb3hpbWF0aW9uIG9mIGl0cworICAvLy8gbGVuZ3RoLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldElubGluZUFzbUxlbmd0aChjb25zdCBjaGFyICpTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtSW5mbyAmTUFJKSBjb25zdDsKKworICAvLy8gQ3JlYXRlVGFyZ2V0SGF6YXJkUmVjb2duaXplciAtIEFsbG9jYXRlIGFuZCByZXR1cm4gYSBoYXphcmQgcmVjb2duaXplcgorICAvLy8gdG8gdXNlIGZvciB0aGlzIHRhcmdldCB3aGVuIHNjaGVkdWxpbmcgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGFmdGVyCisgIC8vLyByZWdpc3RlciBhbGxvY2F0aW9uLgorICB2aXJ0dWFsIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplcioKKyAgQ3JlYXRlVGFyZ2V0UG9zdFJBSGF6YXJkUmVjb2duaXplcihjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEmKSBjb25zdCA9IDA7CisKKyAgLy8vIEFuYWx5emVDb21wYXJlIC0gRm9yIGEgY29tcGFyaXNvbiBpbnN0cnVjdGlvbiwgcmV0dXJuIHRoZSBzb3VyY2UgcmVnaXN0ZXIKKyAgLy8vIGluIFNyY1JlZyBhbmQgdGhlIHZhbHVlIGl0IGNvbXBhcmVzIGFnYWluc3QgaW4gQ21wVmFsdWUuIFJldHVybiB0cnVlIGlmCisgIC8vLyB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbiBjYW4gYmUgYW5hbHl6ZWQuCisgIHZpcnR1YWwgYm9vbCBBbmFseXplQ29tcGFyZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlNyY1JlZywgaW50ICZDbXBWYWx1ZSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBDb252ZXJ0VG9TZXRaZXJvRmxhZyAtIENvbnZlcnQgdGhlIGluc3RydWN0aW9uIHRvIHNldCB0aGUgemVybyBmbGFnIHNvCisgIC8vLyB0aGF0IHdlIGNhbiByZW1vdmUgYSAiY29tcGFyaXNvbiB3aXRoIHplcm8iLgorICB2aXJ0dWFsIGJvb2wgQ29udmVydFRvU2V0WmVyb0ZsYWcoTWFjaGluZUluc3RyICpJbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqQ21wSW5zdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBUYXJnZXRJbnN0ckluZm9JbXBsIC0gVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgorLy8vIFRhcmdldEluc3RySW5mbywgd2hpY2gganVzdCBwcm92aWRlcyBhIGNvdXBsZSBvZiBkZWZhdWx0IGltcGxlbWVudGF0aW9ucworLy8vIGZvciB2YXJpb3VzIG1ldGhvZHMuICBUaGlzIHNlcGFyYXRlZCBvdXQgYmVjYXVzZSBpdCBpcyBpbXBsZW1lbnRlZCBpbgorLy8vIGxpYmNvZGVnZW4sIG5vdCBpbiBsaWJ0YXJnZXQuCitjbGFzcyBUYXJnZXRJbnN0ckluZm9JbXBsIDogcHVibGljIFRhcmdldEluc3RySW5mbyB7Citwcm90ZWN0ZWQ6CisgIFRhcmdldEluc3RySW5mb0ltcGwoY29uc3QgVGFyZ2V0SW5zdHJEZXNjICpkZXNjLCB1bnNpZ25lZCBOdW1PcGNvZGVzKQorICA6IFRhcmdldEluc3RySW5mbyhkZXNjLCBOdW1PcGNvZGVzKSB7fQorcHVibGljOgorICB2aXJ0dWFsIHZvaWQgUmVwbGFjZVRhaWxXaXRoQnJhbmNoVG8oTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE9sZEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3RGVzdCkgY29uc3Q7CisgIHZpcnR1YWwgTWFjaGluZUluc3RyICpjb21tdXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5ld01JID0gZmFsc2UpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgZmluZENvbW11dGVkT3BJbmRpY2VzKE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkICZTcmNPcElkeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlNyY09wSWR4MikgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBjYW5Gb2xkTWVtb3J5T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmT3BzKSBjb25zdDsKKyAgdmlydHVhbCBib29sIFByZWRpY2F0ZUluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmUHJlZCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCByZU1hdGVyaWFsaXplKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3ViUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgKk9yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdDsKKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgKmR1cGxpY2F0ZShNYWNoaW5lSW5zdHIgKk9yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBwcm9kdWNlU2FtZVZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgKk1JMSkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc1NjaGVkdWxpbmdCb3VuZGFyeShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIHZpcnR1YWwgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICoKKyAgQ3JlYXRlVGFyZ2V0UG9zdFJBSGF6YXJkUmVjb2duaXplcihjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEmKSBjb25zdDsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRJbnN0ckl0aW5lcmFyaWVzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEluc3RySXRpbmVyYXJpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTY0OGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRJbnN0ckl0aW5lcmFyaWVzLmgKQEAgLTAsMCArMSwxODggQEAKKy8vPT09LS0gbGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJdGluZXJhcmllcy5oIC0gU2NoZWR1bGluZyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlcyB1c2VkIGZvciBpbnN0cnVjdGlvbgorLy8gaXRpbmVyYXJpZXMsIHN0YWdlcywgYW5kIG9wZXJhbmQgcmVhZHMvd3JpdGVzLiAgVGhpcyBpcyB1c2VkIGJ5CisvLyBzY2hlZHVsZXJzIHRvIGRldGVybWluZSBpbnN0cnVjdGlvbiBzdGFnZXMgYW5kIGxhdGVuY2llcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVElOU1RSSVRJTkVSQVJJRVNfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRJTlNUUklUSU5FUkFSSUVTX0gKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEluc3RydWN0aW9uIHN0YWdlIC0gVGhlc2UgdmFsdWVzIHJlcHJlc2VudCBhIG5vbi1waXBlbGluZWQgc3RlcCBpbgorLy8vIHRoZSBleGVjdXRpb24gb2YgYW4gaW5zdHJ1Y3Rpb24uICBDeWNsZXMgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mCisvLy8gZGlzY3JldGUgdGltZSBzbG90cyBuZWVkZWQgdG8gY29tcGxldGUgdGhlIHN0YWdlLiAgVW5pdHMgcmVwcmVzZW50CisvLy8gdGhlIGNob2ljZSBvZiBmdW5jdGlvbmFsIHVuaXRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcGxldGUgdGhlCisvLy8gc3RhZ2UuICBFZy4gSW50VW5pdDEsIEludFVuaXQyLiBOZXh0Q3ljbGVzIGluZGljYXRlcyBob3cgbWFueQorLy8vIGN5Y2xlcyBzaG91bGQgZWxhcHNlIGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgc3RhZ2UgdG8gdGhlIHN0YXJ0IG9mCisvLy8gdGhlIG5leHQgc3RhZ2UgaW4gdGhlIGl0aW5lcmFyeS4gQSB2YWx1ZSBvZiAtMSBpbmRpY2F0ZXMgdGhhdCB0aGUKKy8vLyBuZXh0IHN0YWdlIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCBvbmUuCisvLy8gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgIHsgMSwgeCwgLTEgfQorLy8vICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YWdlIG9jY3VwaWVzIEZVIHggZm9yIDEgY3ljbGUgYW5kIHRoYXQKKy8vLyAgICAgIHRoZSBuZXh0IHN0YWdlIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGlzIG9uZS4KKy8vLworLy8vICAgeyAyLCB4fHksIDEgfQorLy8vICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YWdlIG9jY3VwaWVzIGVpdGhlciBGVSB4IG9yIEZVIHkgZm9yIDIKKy8vLyAgICAgIGNvbnNlY3VhdGl2ZSBjeWNsZXMgYW5kIHRoYXQgdGhlIG5leHQgc3RhZ2Ugc3RhcnRzIG9uZSBjeWNsZQorLy8vICAgICAgYWZ0ZXIgdGhpcyBzdGFnZSBzdGFydHMuIFRoYXQgaXMsIHRoZSBzdGFnZSByZXF1aXJlbWVudHMKKy8vLyAgICAgIG92ZXJsYXAgaW4gdGltZS4KKy8vLworLy8vICAgeyAxLCB4LCAwIH0KKy8vLyAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBzdGFnZSBvY2N1cGllcyBGVSB4IGZvciAxIGN5Y2xlIGFuZCB0aGF0CisvLy8gICAgICB0aGUgbmV4dCBzdGFnZSBzdGFydHMgaW4gdGhpcyBzYW1lIGN5Y2xlLiBUaGlzIGNhbiBiZSB1c2VkIHRvCisvLy8gICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBpbnN0cnVjdGlvbiByZXF1aXJlcyBtdWx0aXBsZSBzdGFnZXMgYXQgdGhlCisvLy8gICAgICBzYW1lIHRpbWUuCisvLy8KKy8vLyBGVSByZXNlcnZhdGlvbiBjYW4gYmUgb2YgdHdvIGRpZmZlcmVudCBraW5kczoKKy8vLyAgLSBGVXMgd2hpY2ggaW5zdHJ1Y3Rpb24gYWN0dWFsbHkgcmVxdWlyZXMKKy8vLyAgLSBGVXMgd2hpY2ggaW5zdHJ1Y3Rpb24ganVzdCByZXNlcnZlcy4gUmVzZXJ2ZWQgdW5pdCBpcyBub3QgYXZhaWxhYmxlIGZvcgorLy8vICAgIGV4ZWN1dGlvbiBvZiBvdGhlciBpbnN0cnVjdGlvbi4gSG93ZXZlciwgc2V2ZXJhbCBpbnN0cnVjdGlvbnMgY2FuIHJlc2VydmUKKy8vLyAgICB0aGUgc2FtZSB1bml0IHNldmVyYWwgdGltZXMuCisvLy8gU3VjaCB0d28gdHlwZXMgb2YgdW5pdHMgcmVzZXJ2YXRpb24gaXMgdXNlZCB0byBtb2RlbCBpbnN0cnVjdGlvbiBkb21haW4KKy8vLyBjaGFuZ2Ugc3RhbGxzLCBGVXMgdXNpbmcgdGhlIHNhbWUgcmVzb3VyY2UgKGUuZy4gc2FtZSByZWdpc3RlciBmaWxlKSwgZXRjLgorCitzdHJ1Y3QgSW5zdHJTdGFnZSB7CisgIGVudW0gUmVzZXJ2YXRpb25LaW5kcyB7CisgICAgUmVxdWlyZWQgPSAwLAorICAgIFJlc2VydmVkID0gMQorICB9OworCisgIHVuc2lnbmVkIEN5Y2xlc187ICAvLy88IExlbmd0aCBvZiBzdGFnZSBpbiBtYWNoaW5lIGN5Y2xlcworICB1bnNpZ25lZCBVbml0c187ICAgLy8vPCBDaG9pY2Ugb2YgZnVuY3Rpb25hbCB1bml0cworICBpbnQgTmV4dEN5Y2xlc187ICAgLy8vPCBOdW1iZXIgb2YgbWFjaGluZSBjeWNsZXMgdG8gbmV4dCBzdGFnZQorICBSZXNlcnZhdGlvbktpbmRzIEtpbmRfOyAvLy88IEtpbmQgb2YgdGhlIEZVIHJlc2VydmF0aW9uCisKKyAgLy8vIGdldEN5Y2xlcyAtIHJldHVybnMgdGhlIG51bWJlciBvZiBjeWNsZXMgdGhlIHN0YWdlIGlzIG9jY3VwaWVkCisgIHVuc2lnbmVkIGdldEN5Y2xlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3ljbGVzXzsKKyAgfQorCisgIC8vLyBnZXRVbml0cyAtIHJldHVybnMgdGhlIGNob2ljZSBvZiBGVXMKKyAgdW5zaWduZWQgZ2V0VW5pdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFVuaXRzXzsKKyAgfQorCisgIFJlc2VydmF0aW9uS2luZHMgZ2V0UmVzZXJ2YXRpb25LaW5kKCkgY29uc3QgeworICAgIHJldHVybiBLaW5kXzsKKyAgfQorCisgIC8vLyBnZXROZXh0Q3ljbGVzIC0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBmcm9tIHRoZSBzdGFydCBvZgorICAvLy8gdGhpcyBzdGFnZSB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgc3RhZ2UgaW4gdGhlIGl0aW5lcmFyeQorICB1bnNpZ25lZCBnZXROZXh0Q3ljbGVzKCkgY29uc3QgeworICAgIHJldHVybiAoTmV4dEN5Y2xlc18gPj0gMCkgPyAodW5zaWduZWQpTmV4dEN5Y2xlc18gOiBDeWNsZXNfOworICB9Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gSW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5IC0gQW4gaXRpbmVyYXJ5IHJlcHJlc2VudHMgdGhlIHNjaGVkdWxpbmcKKy8vLyBpbmZvcm1hdGlvbiBmb3IgYW4gaW5zdHJ1Y3Rpb24uIFRoaXMgaW5jbHVkZXMgYSBzZXQgb2Ygc3RhZ2VzCisvLy8gb2NjdXBpZXMgYnkgdGhlIGluc3RydWN0aW9uLCBhbmQgdGhlIHBpcGVsaW5lIGN5Y2xlIGluIHdoaWNoCisvLy8gb3BlcmFuZHMgYXJlIHJlYWQgYW5kIHdyaXR0ZW4uCisvLy8KK3N0cnVjdCBJbnN0ckl0aW5lcmFyeSB7CisgIHVuc2lnbmVkIEZpcnN0U3RhZ2U7ICAgICAgICAgLy8vPCBJbmRleCBvZiBmaXJzdCBzdGFnZSBpbiBpdGluZXJhcnkKKyAgdW5zaWduZWQgTGFzdFN0YWdlOyAgICAgICAgICAvLy88IEluZGV4IG9mIGxhc3QgKyAxIHN0YWdlIGluIGl0aW5lcmFyeQorICB1bnNpZ25lZCBGaXJzdE9wZXJhbmRDeWNsZTsgIC8vLzwgSW5kZXggb2YgZmlyc3Qgb3BlcmFuZCByZC93cgorICB1bnNpZ25lZCBMYXN0T3BlcmFuZEN5Y2xlOyAgIC8vLzwgSW5kZXggb2YgbGFzdCArIDEgb3BlcmFuZCByZC93cgorfTsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEluc3RydWN0aW9uIGl0aW5lcmFyeSBEYXRhIC0gSXRpbmVyYXJ5IGRhdGEgc3VwcGxpZWQgYnkgYSBzdWJ0YXJnZXQgdG8gYmUKKy8vLyB1c2VkIGJ5IGEgdGFyZ2V0LgorLy8vCitjbGFzcyBJbnN0ckl0aW5lcmFyeURhdGEgeworcHVibGljOgorICBjb25zdCBJbnN0clN0YWdlICAgICAqU3RhZ2VzOyAgICAgICAgIC8vLzwgQXJyYXkgb2Ygc3RhZ2VzIHNlbGVjdGVkCisgIGNvbnN0IHVuc2lnbmVkICAgICAgICpPcGVyYW5kQ3ljbGVzOyAgLy8vPCBBcnJheSBvZiBvcGVyYW5kIGN5Y2xlcyBzZWxlY3RlZAorICBjb25zdCBJbnN0ckl0aW5lcmFyeSAqSXRpbmVyYXRyaWVzOyAgIC8vLzwgQXJyYXkgb2YgaXRpbmVyYXJpZXMgc2VsZWN0ZWQKKworICAvLy8gQ3RvcnMuCisgIC8vLworICBJbnN0ckl0aW5lcmFyeURhdGEoKSA6IFN0YWdlcygwKSwgT3BlcmFuZEN5Y2xlcygwKSwgSXRpbmVyYXRyaWVzKDApIHt9CisgIEluc3RySXRpbmVyYXJ5RGF0YShjb25zdCBJbnN0clN0YWdlICpTLCBjb25zdCB1bnNpZ25lZCAqT1MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0ckl0aW5lcmFyeSAqSSkKKyAgICA6IFN0YWdlcyhTKSwgT3BlcmFuZEN5Y2xlcyhPUyksIEl0aW5lcmF0cmllcyhJKSB7fQorICAKKyAgLy8vIGlzRW1wdHkgLSBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vIGl0aW5lcmFyaWVzLgorICAvLy8KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gSXRpbmVyYXRyaWVzID09IDA7IH0KKworICAvLy8gaXNFbmRNYXJrZXIgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGluZGV4IGlzIGZvciB0aGUgZW5kIG1hcmtlcgorICAvLy8gaXRpbmVyYXJ5LgorICAvLy8KKyAgYm9vbCBpc0VuZE1hcmtlcih1bnNpZ25lZCBJdGluQ2xhc3NJbmR4KSBjb25zdCB7CisgICAgcmV0dXJuICgoSXRpbmVyYXRyaWVzW0l0aW5DbGFzc0luZHhdLkZpcnN0U3RhZ2UgPT0gfjBVKSAmJgorICAgICAgICAgICAgKEl0aW5lcmF0cmllc1tJdGluQ2xhc3NJbmR4XS5MYXN0U3RhZ2UgPT0gfjBVKSk7CisgIH0KKworICAvLy8gYmVnaW5TdGFnZSAtIFJldHVybiB0aGUgZmlyc3Qgc3RhZ2Ugb2YgdGhlIGl0aW5lcmFyeS4KKyAgLy8vIAorICBjb25zdCBJbnN0clN0YWdlICpiZWdpblN0YWdlKHVuc2lnbmVkIEl0aW5DbGFzc0luZHgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBTdGFnZUlkeCA9IEl0aW5lcmF0cmllc1tJdGluQ2xhc3NJbmR4XS5GaXJzdFN0YWdlOworICAgIHJldHVybiBTdGFnZXMgKyBTdGFnZUlkeDsKKyAgfQorCisgIC8vLyBlbmRTdGFnZSAtIFJldHVybiB0aGUgbGFzdCsxIHN0YWdlIG9mIHRoZSBpdGluZXJhcnkuCisgIC8vLyAKKyAgY29uc3QgSW5zdHJTdGFnZSAqZW5kU3RhZ2UodW5zaWduZWQgSXRpbkNsYXNzSW5keCkgY29uc3QgeworICAgIHVuc2lnbmVkIFN0YWdlSWR4ID0gSXRpbmVyYXRyaWVzW0l0aW5DbGFzc0luZHhdLkxhc3RTdGFnZTsKKyAgICByZXR1cm4gU3RhZ2VzICsgU3RhZ2VJZHg7CisgIH0KKworICAvLy8gZ2V0U3RhZ2VMYXRlbmN5IC0gUmV0dXJuIHRoZSB0b3RhbCBzdGFnZSBsYXRlbmN5IG9mIHRoZSBnaXZlbgorICAvLy8gY2xhc3MuICBUaGUgbGF0ZW5jeSBpcyB0aGUgbWF4aW11bSBjb21wbGV0aW9uIHRpbWUgZm9yIGFueSBzdGFnZQorICAvLy8gaW4gdGhlIGl0aW5lcmFyeS4KKyAgLy8vCisgIHVuc2lnbmVkIGdldFN0YWdlTGF0ZW5jeSh1bnNpZ25lZCBJdGluQ2xhc3NJbmR4KSBjb25zdCB7CisgICAgLy8gSWYgdGhlIHRhcmdldCBkb2Vzbid0IHByb3ZpZGUgaXRpbmVyYXJ5IGluZm9ybWF0aW9uLCB1c2UgYQorICAgIC8vIHNpbXBsZSBub24temVybyBkZWZhdWx0IHZhbHVlIGZvciBhbGwgaW5zdHJ1Y3Rpb25zLgorICAgIGlmIChpc0VtcHR5KCkpCisgICAgICByZXR1cm4gMTsKKworICAgIC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBjb21wbGV0aW9uIHRpbWUgZm9yIGFueSBzdGFnZS4KKyAgICB1bnNpZ25lZCBMYXRlbmN5ID0gMCwgU3RhcnRDeWNsZSA9IDA7CisgICAgZm9yIChjb25zdCBJbnN0clN0YWdlICpJUyA9IGJlZ2luU3RhZ2UoSXRpbkNsYXNzSW5keCksCisgICAgICAgICAgICpFID0gZW5kU3RhZ2UoSXRpbkNsYXNzSW5keCk7IElTICE9IEU7ICsrSVMpIHsKKyAgICAgIExhdGVuY3kgPSBzdGQ6Om1heChMYXRlbmN5LCBTdGFydEN5Y2xlICsgSVMtPmdldEN5Y2xlcygpKTsKKyAgICAgIFN0YXJ0Q3ljbGUgKz0gSVMtPmdldE5leHRDeWNsZXMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gTGF0ZW5jeTsKKyAgfQorCisgIC8vLyBnZXRPcGVyYW5kQ3ljbGUgLSBSZXR1cm4gdGhlIGN5Y2xlIGZvciB0aGUgZ2l2ZW4gY2xhc3MgYW5kCisgIC8vLyBvcGVyYW5kLiBSZXR1cm4gLTEgaWYgbm8gY3ljbGUgaXMgc3BlY2lmaWVkIGZvciB0aGUgb3BlcmFuZC4KKyAgLy8vCisgIGludCBnZXRPcGVyYW5kQ3ljbGUodW5zaWduZWQgSXRpbkNsYXNzSW5keCwgdW5zaWduZWQgT3BlcmFuZElkeCkgY29uc3QgeworICAgIGlmIChpc0VtcHR5KCkpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB1bnNpZ25lZCBGaXJzdElkeCA9IEl0aW5lcmF0cmllc1tJdGluQ2xhc3NJbmR4XS5GaXJzdE9wZXJhbmRDeWNsZTsKKyAgICB1bnNpZ25lZCBMYXN0SWR4ID0gSXRpbmVyYXRyaWVzW0l0aW5DbGFzc0luZHhdLkxhc3RPcGVyYW5kQ3ljbGU7CisgICAgaWYgKChGaXJzdElkeCArIE9wZXJhbmRJZHgpID49IExhc3RJZHgpCisgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gKGludClPcGVyYW5kQ3ljbGVzW0ZpcnN0SWR4ICsgT3BlcmFuZElkeF07CisgIH0KK307CisKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEludHJpbnNpY0luZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0SW50cmluc2ljSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOGFjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEludHJpbnNpY0luZm8uaApAQCAtMCwwICsxLDY0IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldEludHJpbnNpY0luZm8uaCAtIEluc3RydWN0aW9uIEluZm8gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHRhcmdldCBpbnRyaW5zaWMgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBjb2RlIGdlbmVyYXRvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVElOVFJJTlNJQ0lORk9fSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRJTlRSSU5TSUNJTkZPX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFR5cGU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8KKy8vLyBUYXJnZXRJbnRyaW5zaWNJbmZvIC0gSW50ZXJmYWNlIHRvIGRlc2NyaXB0aW9uIG9mIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0CisvLy8KK2NsYXNzIFRhcmdldEludHJpbnNpY0luZm8geworICBUYXJnZXRJbnRyaW5zaWNJbmZvKGNvbnN0IFRhcmdldEludHJpbnNpY0luZm8gJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVGFyZ2V0SW50cmluc2ljSW5mbyAmKTsgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCitwdWJsaWM6CisgIFRhcmdldEludHJpbnNpY0luZm8oKTsKKyAgdmlydHVhbCB+VGFyZ2V0SW50cmluc2ljSW5mbygpOworCisgIC8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgYSB0YXJnZXQgaW50cmluc2ljLCBlLmcuICJsbHZtLmJmaW4uc3N5bmMiLgorICAvLy8gVGhlIFR5cyBhbmQgbnVtVHlzIHBhcmFtZXRlcnMgYXJlIGZvciBpbnRyaW5zaWNzIHdpdGggb3ZlcmxvYWRlZCB0eXBlcworICAvLy8gKGUuZy4sIHRob3NlIHVzaW5nIGlBbnkgb3IgZkFueSkuIEZvciBhIGRlY2xhcmF0aW9uIGZvciBhbiBvdmVybG9hZGVkCisgIC8vLyBpbnRyaW5zaWMsIFR5cyBzaG91bGQgcG9pbnQgdG8gYW4gYXJyYXkgb2YgbnVtVHlzIHBvaW50ZXJzIHRvIFR5cGUsCisgIC8vLyBhbmQgbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIHR5cGUgZm9yIGVhY2ggb3ZlcmxvYWRlZCB0eXBlIGluIHRoZQorICAvLy8gaW50cmluc2ljLgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldE5hbWUodW5zaWduZWQgSUlELCBjb25zdCBUeXBlICoqVHlzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bVR5cyA9IDApIGNvbnN0ID0gMDsKKworICAvLy8gTG9vayB1cCB0YXJnZXQgaW50cmluc2ljIGJ5IG5hbWUuIFJldHVybiBpbnRyaW5zaWMgSUQgb3IgMCBmb3IgdW5rbm93bgorICAvLy8gbmFtZXMuCisgIHZpcnR1YWwgdW5zaWduZWQgbG9va3VwTmFtZShjb25zdCBjaGFyICpOYW1lLCB1bnNpZ25lZCBMZW4pIGNvbnN0ID0wOworCisgIC8vLyBSZXR1cm4gdGhlIHRhcmdldCBpbnRyaW5zaWMgSUQgb2YgYSBmdW5jdGlvbiwgb3IgMC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRJbnRyaW5zaWNJRChGdW5jdGlvbiAqRikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW50cmluc2ljIGNhbiBiZSBvdmVybG9hZGVkLgorICB2aXJ0dWFsIGJvb2wgaXNPdmVybG9hZGVkKHVuc2lnbmVkIElJRCkgY29uc3QgPSAwOworICAKKyAgLy8vIENyZWF0ZSBvciBpbnNlcnQgYW4gTExWTSBGdW5jdGlvbiBkZWNsYXJhdGlvbiBmb3IgYW4gaW50cmluc2ljLAorICAvLy8gYW5kIHJldHVybiBpdC4gVGhlIFR5cyBhbmQgbnVtVHlzIGFyZSBmb3IgaW50cmluc2ljcyB3aXRoIG92ZXJsb2FkZWQKKyAgLy8vIHR5cGVzLiBTZWUgYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgIHZpcnR1YWwgRnVuY3Rpb24gKmdldERlY2xhcmF0aW9uKE1vZHVsZSAqTSwgdW5zaWduZWQgSUQsIGNvbnN0IFR5cGUgKipUeXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1UeXMgPSAwKSBjb25zdCA9IDA7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0SklUSW5mby5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRKSVRJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwOGE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0SklUSW5mby5oCkBAIC0wLDAgKzEsMTQyIEBACisvLz09PS0gVGFyZ2V0L1RhcmdldEpJVEluZm8uaCAtIFRhcmdldCBJbmZvcm1hdGlvbiBmb3IgSklUIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBleHBvc2VzIGFuIGFic3RyYWN0IGludGVyZmFjZSB1c2VkIGJ5IHRoZSBKdXN0LUluLVRpbWUgY29kZQorLy8gZ2VuZXJhdG9yIHRvIHBlcmZvcm0gdGFyZ2V0LXNwZWNpZmljIGFjdGl2aXRpZXMsIHN1Y2ggYXMgZW1pdHRpbmcgc3R1YnMuICBJZgorLy8gYSBUYXJnZXRNYWNoaW5lIHN1cHBvcnRzIEpJVCBjb2RlIGdlbmVyYXRpb24sIGl0IHNob3VsZCBwcm92aWRlIG9uZSBvZiB0aGVzZQorLy8gb2JqZWN0cyB0aHJvdWdoIHRoZSBnZXRKSVRJbmZvKCkgbWV0aG9kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfVEFSR0VUSklUSU5GT19ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVEpJVElORk9fSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBHbG9iYWxWYWx1ZTsKKyAgY2xhc3MgSklUQ29kZUVtaXR0ZXI7CisgIGNsYXNzIE1hY2hpbmVSZWxvY2F0aW9uOworCisgIC8vLyBUYXJnZXRKSVRJbmZvIC0gVGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IHRoZSBKdXN0LUluLVRpbWUKKyAgLy8vIGNvZGUgZ2VuZXJhdG9yLgorICBjbGFzcyBUYXJnZXRKSVRJbmZvIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgflRhcmdldEpJVEluZm8oKSB7fQorCisgICAgLy8vIHJlcGxhY2VNYWNoaW5lQ29kZUZvckZ1bmN0aW9uIC0gTWFrZSBpdCBzbyB0aGF0IGNhbGxpbmcgdGhlIGZ1bmN0aW9uCisgICAgLy8vIHdob3NlIG1hY2hpbmUgY29kZSBpcyBhdCBPTEQgdHVybnMgaW50byBhIGNhbGwgdG8gTkVXLCBwZXJoYXBzIGJ5CisgICAgLy8vIG92ZXJ3cml0aW5nIE9MRCB3aXRoIGEgYnJhbmNoIHRvIE5FVy4gIFRoaXMgaXMgdXNlZCBmb3Igc2VsZi1tb2RpZnlpbmcKKyAgICAvLy8gY29kZS4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgcmVwbGFjZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24odm9pZCAqT2xkLCB2b2lkICpOZXcpID0gMDsKKworICAgIC8vLyBlbWl0R2xvYmFsVmFsdWVJbmRpcmVjdFN5bSAtIFVzZSB0aGUgc3BlY2lmaWVkIEpJVENvZGVFbWl0dGVyIG9iamVjdAorICAgIC8vLyB0byBlbWl0IGFuIGluZGlyZWN0IHN5bWJvbCB3aGljaCBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkCisgICAgLy8vIHB0ci4KKyAgICB2aXJ0dWFsIHZvaWQgKmVtaXRHbG9iYWxWYWx1ZUluZGlyZWN0U3ltKGNvbnN0IEdsb2JhbFZhbHVlKiBHViwgdm9pZCAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJkpDRSkgeworICAgICAgYXNzZXJ0KDAgJiYgIlRoaXMgdGFyZ2V0IGRvZXNuJ3QgaW1wbGVtZW50IGVtaXRHbG9iYWxWYWx1ZUluZGlyZWN0U3ltISIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8vIFJlY29yZHMgdGhlIHJlcXVpcmVkIHNpemUgYW5kIGFsaWdubWVudCBmb3IgYSBjYWxsIHN0dWIgaW4gYnl0ZXMuCisgICAgc3RydWN0IFN0dWJMYXlvdXQgeworICAgICAgc2l6ZV90IFNpemU7CisgICAgICBzaXplX3QgQWxpZ25tZW50OworICAgIH07CisgICAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBhbmQgYWxpZ25tZW50IGZvciBhIGNhbGwgc3R1YiBvbiB0aGlzIHRhcmdldC4KKyAgICB2aXJ0dWFsIFN0dWJMYXlvdXQgZ2V0U3R1YkxheW91dCgpIHsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlRoaXMgdGFyZ2V0IGRvZXNuJ3QgaW1wbGVtZW50IGdldFN0dWJMYXlvdXQhIik7CisgICAgICBTdHViTGF5b3V0IFJlc3VsdCA9IHswLCAwfTsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorCisgICAgLy8vIGVtaXRGdW5jdGlvblN0dWIgLSBVc2UgdGhlIHNwZWNpZmllZCBKSVRDb2RlRW1pdHRlciBvYmplY3QgdG8gZW1pdCBhCisgICAgLy8vIHNtYWxsIG5hdGl2ZSBmdW5jdGlvbiB0aGF0IHNpbXBseSBjYWxscyB0aGUgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZAorICAgIC8vLyBhZGRyZXNzLiAgVGhlIEpJVENvZGVFbWl0dGVyIG11c3QgYWxyZWFkeSBoYXZlIHN0b3JhZ2UgYWxsb2NhdGVkIGZvciB0aGUKKyAgICAvLy8gc3R1Yi4gIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVzdWx0YW50IGZ1bmN0aW9uLCB3aGljaCBtYXkgaGF2ZSBiZWVuCisgICAgLy8vIGFsaWduZWQgZnJvbSB0aGUgYWRkcmVzcyB0aGUgSkNFIHdhcyBzZXQgdXAgdG8gZW1pdCBhdC4KKyAgICB2aXJ0dWFsIHZvaWQgKmVtaXRGdW5jdGlvblN0dWIoY29uc3QgRnVuY3Rpb24qIEYsIHZvaWQgKlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJkpDRSkgeworICAgICAgYXNzZXJ0KDAgJiYgIlRoaXMgdGFyZ2V0IGRvZXNuJ3QgaW1wbGVtZW50IGVtaXRGdW5jdGlvblN0dWIhIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLy8gZ2V0UElDSnVtcFRhYmxlRW50cnkgLSBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUganVtcHRhYmxlIGVudHJ5IGZvciB0aGUKKyAgICAvLy8gc3BlY2lmaWMgYmFzaWMgYmxvY2suCisgICAgdmlydHVhbCB1aW50cHRyX3QgZ2V0UElDSnVtcFRhYmxlRW50cnkodWludHB0cl90IEJCLCB1aW50cHRyX3QgSlRCYXNlKSB7CisgICAgICBhc3NlcnQoMCAmJiAiVGhpcyB0YXJnZXQgZG9lc24ndCBpbXBsZW1lbnQgZ2V0UElDSnVtcFRhYmxlRW50cnkhIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLy8gTGF6eVJlc29sdmVyRm4gLSBUaGlzIHR5cGVkZWYgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGZ1bmN0aW9uIHRoYXQKKyAgICAvLy8gdW5yZXNvbHZlZCBjYWxsIHBvaW50cyBzaG91bGQgaW52b2tlLiAgVGhpcyBpcyBhIHRhcmdldCBzcGVjaWZpYworICAgIC8vLyBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byB3YWxrIHRoZSBzdGFjayBhbmQgZmluZCBvdXQgd2hpY2ggc3R1YiB0aGUKKyAgICAvLy8gY2FsbCBpcyBjb21pbmcgZnJvbS4KKyAgICB0eXBlZGVmIHZvaWQgKCpMYXp5UmVzb2x2ZXJGbikoKTsKKworICAgIC8vLyBKSVRDb21waWxlckZuIC0gVGhpcyB0eXBlZGVmIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBKSVQgZnVuY3Rpb24gdGhhdAorICAgIC8vLyBsYXppbHkgY29tcGlsZXMgdGhlIGZ1bmN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHViLiAgVGhlIEpJVCBrZWVwcworICAgIC8vLyB0cmFjayBvZiB0aGUgbWFwcGluZyBiZXR3ZWVuIHN0dWJzIGFuZCBMTFZNIEZ1bmN0aW9ucywgdGhlIHRhcmdldAorICAgIC8vLyBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBmaWd1cmUgb3V0IHRoZSBhZGRyZXNzIG9mIGEgc3R1YiB0aGF0IGlzIGNhbGxlZAorICAgIC8vLyBieSB0aGUgTGF6eVJlc29sdmVyRm4uCisgICAgdHlwZWRlZiB2b2lkKiAoKkpJVENvbXBpbGVyRm4pKHZvaWQgKik7CisKKyAgICAvLy8gZ2V0TGF6eVJlc29sdmVyRnVuY3Rpb24gLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIEpJVCwKKyAgICAvLy8gZ2l2aW5nIHRoZSB0YXJnZXQgdGhlIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY29tcGlsZSBhCisgICAgLy8vIGZ1bmN0aW9uLCBhbmQgZ2l2aW5nIHRoZSBKSVQgdGhlIHRhcmdldCBmdW5jdGlvbiB1c2VkIHRvIGRvIHRoZSBsYXp5CisgICAgLy8vIHJlc29sdmluZy4KKyAgICB2aXJ0dWFsIExhenlSZXNvbHZlckZuIGdldExhenlSZXNvbHZlckZ1bmN0aW9uKEpJVENvbXBpbGVyRm4pIHsKKyAgICAgIGFzc2VydCgwICYmICJOb3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0ISIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8vIHJlbG9jYXRlIC0gQmVmb3JlIHRoZSBKSVQgY2FuIHJ1biBhIGJsb2NrIG9mIGNvZGUgdGhhdCBoYXMgYmVlbiBlbWl0dGVkLAorICAgIC8vLyBpdCBtdXN0IHJld3JpdGUgdGhlIGNvZGUgdG8gY29udGFpbiB0aGUgYWN0dWFsIGFkZHJlc3NlcyBvZiBhbnkKKyAgICAvLy8gcmVmZXJlbmNlZCBnbG9iYWwgc3ltYm9scy4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsb2NhdGUodm9pZCAqRnVuY3Rpb24sIE1hY2hpbmVSZWxvY2F0aW9uICpNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVsb2NzLCB1bnNpZ25lZCBjaGFyKiBHT1RCYXNlKSB7CisgICAgICBhc3NlcnQoTnVtUmVsb2NzID09IDAgJiYgIlRoaXMgdGFyZ2V0IGRvZXMgbm90IGhhdmUgcmVsb2NhdGlvbnMhIik7CisgICAgfQorICAgIAorCisgICAgLy8vIGFsbG9jYXRlVGhyZWFkTG9jYWxNZW1vcnkgLSBFYWNoIHRhcmdldCBoYXMgaXRzIG93biB3YXkgb2YKKyAgICAvLy8gaGFuZGxpbmcgdGhyZWFkIGxvY2FsIHZhcmlhYmxlcy4gVGhpcyBtZXRob2QgcmV0dXJucyBhIHZhbHVlIG9ubHkKKyAgICAvLy8gbWVhbmluZ2Z1bCB0byB0aGUgdGFyZ2V0LgorICAgIHZpcnR1YWwgY2hhciogYWxsb2NhdGVUaHJlYWRMb2NhbE1lbW9yeShzaXplX3Qgc2l6ZSkgeworICAgICAgYXNzZXJ0KDAgJiYgIlRoaXMgdGFyZ2V0IGRvZXMgbm90IGltcGxlbWVudCB0aHJlYWQgbG9jYWwgc3RvcmFnZSEiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vLyBuZWVkc0dPVCAtIEFsbG93cyBhIHRhcmdldCB0byBzcGVjaWZ5IHRoYXQgaXQgd291bGQgbGlrZSB0aGUKKyAgICAvLy8gSklUIHRvIG1hbmFnZSBhIEdPVCBmb3IgaXQuCisgICAgYm9vbCBuZWVkc0dPVCgpIGNvbnN0IHsgcmV0dXJuIHVzZUdPVDsgfQorCisgICAgLy8vIGhhc0N1c3RvbUNvbnN0YW50UG9vbCAtIEFsbG93cyBhIHRhcmdldCB0byBzcGVjaWZ5IHRoYXQgY29uc3RhbnQKKyAgICAvLy8gcG9vbCBhZGRyZXNzIHJlc29sdXRpb24gaXMgaGFuZGxlZCBieSB0aGUgdGFyZ2V0LgorICAgIHZpcnR1YWwgYm9vbCBoYXNDdXN0b21Db25zdGFudFBvb2woKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLy8vIGhhc0N1c3RvbUp1bXBUYWJsZXMgLSBBbGxvd3MgYSB0YXJnZXQgdG8gc3BlY2lmeSB0aGF0IGp1bXB0YWJsZXMKKyAgICAvLy8gYXJlIGVtaXR0ZWQgYnkgdGhlIHRhcmdldC4KKyAgICB2aXJ0dWFsIGJvb2wgaGFzQ3VzdG9tSnVtcFRhYmxlcygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvLy8gYWxsb2NhdGVTZXBhcmF0ZUdWTWVtb3J5IC0gSWYgdHJ1ZSwgZ2xvYmFscyBzaG91bGQgYmUgcGxhY2VkIGluCisgICAgLy8vIHNlcGFyYXRlbHkgYWxsb2NhdGVkIGhlYXAgbWVtb3J5IHJhdGhlciB0aGFuIGluIHRoZSBzYW1lCisgICAgLy8vIGNvZGUgbWVtb3J5IGFsbG9jYXRlZCBieSBKSVRDb2RlRW1pdHRlci4KKyAgICB2aXJ0dWFsIGJvb2wgYWxsb2NhdGVTZXBhcmF0ZUdWTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgcHJvdGVjdGVkOgorICAgIGJvb2wgdXNlR09UOworICB9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2YzdhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaApAQCAtMCwwICsxLDE2OTggQEAKKy8vPT09LS0gbGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCAtIFRhcmdldCBMb3dlcmluZyBJbmZvIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gbG93ZXIgTExWTSBjb2RlIHRvIG1hY2hpbmUgY29kZS4gIFRoaXMgaGFzIHR3bworLy8gbWFpbiBjb21wb25lbnRzOgorLy8KKy8vICAxLiBXaGljaCBWYWx1ZVR5cGVzIGFyZSBuYXRpdmVseSBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldC4KKy8vICAyLiBXaGljaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQgZm9yIHN1cHBvcnRlZCBWYWx1ZVR5cGVzLgorLy8gIDMuIENvc3QgdGhyZXNob2xkcyBmb3IgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zIG9mIGNlcnRhaW4gb3BlcmF0aW9ucy4KKy8vCisvLyBJbiBhZGRpdGlvbiBpdCBoYXMgYSBmZXcgb3RoZXIgY29tcG9uZW50cywgbGlrZSBpbmZvcm1hdGlvbiBhYm91dCBGUAorLy8gaW1tZWRpYXRlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVExPV0VSSU5HX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfVEFSR0VUTE9XRVJJTkdfSAorCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vSW5saW5lQXNtLmgiCisjaW5jbHVkZSAibGx2bS9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1J1bnRpbWVMaWJjYWxscy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQRmxvYXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWdMb2MuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRDYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQWxsb2NhSW5zdDsKKyAgY2xhc3MgQ2FsbEluc3Q7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBGYXN0SVNlbDsKKyAgY2xhc3MgRnVuY3Rpb25Mb3dlcmluZ0luZm87CisgIGNsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworICBjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisgIGNsYXNzIE1hY2hpbmVGcmFtZUluZm87CisgIGNsYXNzIE1hY2hpbmVJbnN0cjsKKyAgY2xhc3MgTWFjaGluZUp1bXBUYWJsZUluZm87CisgIGNsYXNzIE1DQ29udGV4dDsKKyAgY2xhc3MgTUNFeHByOworICBjbGFzcyBTRE5vZGU7CisgIGNsYXNzIFNEVmFsdWU7CisgIGNsYXNzIFNlbGVjdGlvbkRBRzsKKyAgY2xhc3MgVGFyZ2V0RGF0YTsKKyAgY2xhc3MgVGFyZ2V0TWFjaGluZTsKKyAgY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKKyAgY2xhc3MgVmFsdWU7CisKKyAgLy8gRklYTUU6IHNob3VsZCB0aGlzIGJlIGhlcmU/CisgIG5hbWVzcGFjZSBUTFNNb2RlbCB7CisgICAgZW51bSBNb2RlbCB7CisgICAgICBHZW5lcmFsRHluYW1pYywKKyAgICAgIExvY2FsRHluYW1pYywKKyAgICAgIEluaXRpYWxFeGVjLAorICAgICAgTG9jYWxFeGVjCisgICAgfTsKKyAgfQorICBUTFNNb2RlbDo6TW9kZWwgZ2V0VExTTW9kZWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBSZWxvYzo6TW9kZWwgcmVsb2MpOworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVGFyZ2V0TG93ZXJpbmcgLSBUaGlzIGNsYXNzIGRlZmluZXMgaW5mb3JtYXRpb24gdXNlZCB0byBsb3dlciBMTFZNIGNvZGUgdG8KKy8vLyBsZWdhbCBTZWxlY3Rpb25EQUcgb3BlcmF0b3JzIHRoYXQgdGhlIHRhcmdldCBpbnN0cnVjdGlvbiBzZWxlY3RvciBjYW4gYWNjZXB0CisvLy8gbmF0aXZlbHkuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGFsc28gZGVmaW5lcyBjYWxsYmFja3MgdGhhdCB0YXJnZXRzIG11c3QgaW1wbGVtZW50IHRvIGxvd2VyCisvLy8gdGFyZ2V0LXNwZWNpZmljIGNvbnN0cnVjdHMgdG8gU2VsZWN0aW9uREFHIG9wZXJhdG9ycy4KKy8vLworY2xhc3MgVGFyZ2V0TG93ZXJpbmcgeworICBUYXJnZXRMb3dlcmluZyhjb25zdCBUYXJnZXRMb3dlcmluZyYpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBUYXJnZXRMb3dlcmluZyYpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorcHVibGljOgorICAvLy8gTGVnYWxpemVBY3Rpb24gLSBUaGlzIGVudW0gaW5kaWNhdGVzIHdoZXRoZXIgb3BlcmF0aW9ucyBhcmUgdmFsaWQgZm9yIGEKKyAgLy8vIHRhcmdldCwgYW5kIGlmIG5vdCwgd2hhdCBhY3Rpb24gc2hvdWxkIGJlIHVzZWQgdG8gbWFrZSB0aGVtIHZhbGlkLgorICBlbnVtIExlZ2FsaXplQWN0aW9uIHsKKyAgICBMZWdhbCwgICAgICAvLyBUaGUgdGFyZ2V0IG5hdGl2ZWx5IHN1cHBvcnRzIHRoaXMgb3BlcmF0aW9uLgorICAgIFByb21vdGUsICAgIC8vIFRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBpbiBhIGxhcmdlciB0eXBlLgorICAgIEV4cGFuZCwgICAgIC8vIFRyeSB0byBleHBhbmQgdGhpcyB0byBvdGhlciBvcHMsIG90aGVyd2lzZSB1c2UgYSBsaWJjYWxsLgorICAgIEN1c3RvbSAgICAgIC8vIFVzZSB0aGUgTG93ZXJPcGVyYXRpb24gaG9vayB0byBpbXBsZW1lbnQgY3VzdG9tIGxvd2VyaW5nLgorICB9OworCisgIGVudW0gQm9vbGVhbkNvbnRlbnQgeyAvLyBIb3cgdGhlIHRhcmdldCByZXByZXNlbnRzIHRydWUvZmFsc2UgdmFsdWVzLgorICAgIFVuZGVmaW5lZEJvb2xlYW5Db250ZW50LCAgICAvLyBPbmx5IGJpdCAwIGNvdW50cywgdGhlIHJlc3QgY2FuIGhvbGQgZ2FyYmFnZS4KKyAgICBaZXJvT3JPbmVCb29sZWFuQ29udGVudCwgICAgICAgIC8vIEFsbCBiaXRzIHplcm8gZXhjZXB0IGZvciBiaXQgMC4KKyAgICBaZXJvT3JOZWdhdGl2ZU9uZUJvb2xlYW5Db250ZW50IC8vIEFsbCBiaXRzIGVxdWFsIHRvIGJpdCAwLgorICB9OworCisgIC8vLyBOT1RFOiBUaGUgY29uc3RydWN0b3IgdGFrZXMgb3duZXJzaGlwIG9mIFRMT0YuCisgIGV4cGxpY2l0IFRhcmdldExvd2VyaW5nKGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKKyAgdmlydHVhbCB+VGFyZ2V0TG93ZXJpbmcoKTsKKworICBjb25zdCBUYXJnZXRNYWNoaW5lICZnZXRUYXJnZXRNYWNoaW5lKCkgY29uc3QgeyByZXR1cm4gVE07IH0KKyAgY29uc3QgVGFyZ2V0RGF0YSAqZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIFREOyB9CisKKyAgYm9vbCBpc0JpZ0VuZGlhbigpIGNvbnN0IHsgcmV0dXJuICFJc0xpdHRsZUVuZGlhbjsgfQorICBib29sIGlzTGl0dGxlRW5kaWFuKCkgY29uc3QgeyByZXR1cm4gSXNMaXR0bGVFbmRpYW47IH0KKyAgTVZUIGdldFBvaW50ZXJUeSgpIGNvbnN0IHsgcmV0dXJuIFBvaW50ZXJUeTsgfQorICBNVlQgZ2V0U2hpZnRBbW91bnRUeSgpIGNvbnN0IHsgcmV0dXJuIFNoaWZ0QW1vdW50VHk7IH0KKworICAvLy8gaXNTZWxlY3RFeHBlbnNpdmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2VsZWN0IG9wZXJhdGlvbiBpcyBleHBlbnNpdmUgZm9yCisgIC8vLyB0aGlzIHRhcmdldC4KKyAgYm9vbCBpc1NlbGVjdEV4cGVuc2l2ZSgpIGNvbnN0IHsgcmV0dXJuIFNlbGVjdElzRXhwZW5zaXZlOyB9CisKKyAgLy8vIGlzSW50RGl2Q2hlYXAoKSAtIFJldHVybiB0cnVlIGlmIGludGVnZXIgZGl2aWRlIGlzIHVzdWFsbHkgY2hlYXBlciB0aGFuCisgIC8vLyBhIHNlcXVlbmNlIG9mIHNldmVyYWwgc2hpZnRzLCBhZGRzLCBhbmQgbXVsdGlwbGllcyBmb3IgdGhpcyB0YXJnZXQuCisgIGJvb2wgaXNJbnREaXZDaGVhcCgpIGNvbnN0IHsgcmV0dXJuIEludERpdklzQ2hlYXA7IH0KKworICAvLy8gaXNQb3cyRGl2Q2hlYXAoKSAtIFJldHVybiB0cnVlIGlmIHBvdzIgZGl2IGlzIGNoZWFwZXIgdGhhbiBhIGNoYWluIG9mCisgIC8vLyBzcmwvYWRkL3NyYS4KKyAgYm9vbCBpc1BvdzJEaXZDaGVhcCgpIGNvbnN0IHsgcmV0dXJuIFBvdzJEaXZJc0NoZWFwOyB9CisKKyAgLy8vIGdldFNldENDUmVzdWx0VHlwZSAtIFJldHVybiB0aGUgVmFsdWVUeXBlIG9mIHRoZSByZXN1bHQgb2YgU0VUQ0MKKyAgLy8vIG9wZXJhdGlvbnMuICBBbHNvIHVzZWQgdG8gb2J0YWluIHRoZSB0YXJnZXQncyBwcmVmZXJyZWQgdHlwZSBmb3IKKyAgLy8vIHRoZSBjb25kaXRpb24gb3BlcmFuZCBvZiBTRUxFQ1QgYW5kIEJSQ09ORCBub2Rlcy4gIEluIHRoZSBjYXNlIG9mCisgIC8vLyBCUkNPTkQgdGhlIGFyZ3VtZW50IHBhc3NlZCBpcyBNVlQ6Ok90aGVyIHNpbmNlIHRoZXJlIGFyZSBubyBvdGhlcgorICAvLy8gb3BlcmFuZHMgdG8gZ2V0IGEgdHlwZSBoaW50IGZyb20uCisgIHZpcnR1YWwKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0U2V0Q0NSZXN1bHRUeXBlKEVWVCBWVCkgY29uc3Q7CisKKyAgLy8vIGdldENtcExpYmNhbGxSZXR1cm5UeXBlIC0gUmV0dXJuIHRoZSBWYWx1ZVR5cGUgZm9yIGNvbXBhcmlzb24KKyAgLy8vIGxpYmNhbGxzLiBDb21wYXJpb25zIGxpYmNhbGxzIGluY2x1ZGUgZmxvYXRpbmcgcG9pbnQgY29tcGFyaW9uIGNhbGxzLAorICAvLy8gYW5kIE9yZGVyZWQvVW5vcmRlcmVkIGNoZWNrIGNhbGxzIG9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCisgIHZpcnR1YWwKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0Q21wTGliY2FsbFJldHVyblR5cGUoKSBjb25zdDsKKworICAvLy8gZ2V0Qm9vbGVhbkNvbnRlbnRzIC0gRm9yIHRhcmdldHMgd2l0aG91dCBpMSByZWdpc3RlcnMsIHRoaXMgZ2l2ZXMgdGhlCisgIC8vLyBuYXR1cmUgb2YgdGhlIGhpZ2gtYml0cyBvZiBib29sZWFuIHZhbHVlcyBoZWxkIGluIHR5cGVzIHdpZGVyIHRoYW4gaTEuCisgIC8vLyAiQm9vbGVhbiB2YWx1ZXMiIGFyZSBzcGVjaWFsIHRydWUvZmFsc2UgdmFsdWVzIHByb2R1Y2VkIGJ5IG5vZGVzIGxpa2UKKyAgLy8vIFNFVENDIGFuZCBjb25zdW1lZCAoYXMgdGhlIGNvbmRpdGlvbikgYnkgbm9kZXMgbGlrZSBTRUxFQ1QgYW5kIEJSQ09ORC4KKyAgLy8vIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGdlbmVyYWwgdmFsdWVzIHByb21vdGVkIGZyb20gaTEuCisgIEJvb2xlYW5Db250ZW50IGdldEJvb2xlYW5Db250ZW50cygpIGNvbnN0IHsgcmV0dXJuIEJvb2xlYW5Db250ZW50czt9CisKKyAgLy8vIGdldFNjaGVkdWxpbmdQcmVmZXJlbmNlIC0gUmV0dXJuIHRhcmdldCBzY2hlZHVsaW5nIHByZWZlcmVuY2UuCisgIFNjaGVkOjpQcmVmZXJlbmNlIGdldFNjaGVkdWxpbmdQcmVmZXJlbmNlKCkgY29uc3QgeworICAgIHJldHVybiBTY2hlZFByZWZlcmVuY2VJbmZvOworICB9CisKKyAgLy8vIGdldFNjaGVkdWxpbmdQcmVmZXJlbmNlIC0gU29tZSBzY2hlZHVsZXIsIGUuZy4gaHlicmlkLCBjYW4gc3dpdGNoIHRvCisgIC8vLyBkaWZmZXJlbnQgc2NoZWR1bGluZyBoZXVyaXN0aWNzIGZvciBkaWZmZXJlbnQgbm9kZXMuIFRoaXMgZnVuY3Rpb24gcmV0dXJucworICAvLy8gdGhlIHByZWZlcmVuY2UgKG9yIG5vbmUpIGZvciB0aGUgZ2l2ZW4gbm9kZS4KKyAgdmlydHVhbCBTY2hlZDo6UHJlZmVyZW5jZSBnZXRTY2hlZHVsaW5nUHJlZmVyZW5jZShTRE5vZGUgKk4pIGNvbnN0IHsKKyAgICByZXR1cm4gU2NoZWQ6Ok5vbmU7CisgIH0KKworICAvLy8gZ2V0UmVnQ2xhc3NGb3IgLSBSZXR1cm4gdGhlIHJlZ2lzdGVyIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHZhbHVlIHR5cGUuCisgIHZpcnR1YWwgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3NGb3IoRVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KFZULmlzU2ltcGxlKCkgJiYgImdldFJlZ0NsYXNzRm9yIGNhbGxlZCBvbiBpbGxlZ2FsIHR5cGUhIik7CisgICAgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBSZWdDbGFzc0ZvclZUW1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldOworICAgIGFzc2VydChSQyAmJiAiVGhpcyB2YWx1ZSB0eXBlIGlzIG5vdCBuYXRpdmVseSBzdXBwb3J0ZWQhIik7CisgICAgcmV0dXJuIFJDOworICB9CisKKyAgLy8vIGdldFJlcFJlZ0NsYXNzRm9yIC0gUmV0dXJuIHRoZSAncmVwcmVzZW50YXRpdmUnIHJlZ2lzdGVyIGNsYXNzIGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCB2YWx1ZSB0eXBlLiBUaGUgJ3JlcHJlc2VudGF0aXZlJyByZWdpc3RlciBjbGFzcyBpcyB0aGUgbGFyZ2VzdAorICAvLy8gbGVnYWwgc3VwZXItcmVnIHJlZ2lzdGVyIGNsYXNzIGZvciB0aGUgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIHZhbHVlIHR5cGUuCisgIC8vLyBGb3IgZXhhbXBsZSwgb24gaTM4NiB0aGUgcmVwIHJlZ2lzdGVyIGNsYXNzIGZvciBpOCwgaTE2LCBhbmQgaTMyIGFyZSBHUjMyOworICAvLy8gd2hpbGUgdGhlIHJlcCByZWdpc3RlciBjbGFzcyBpcyBHUjY0IG9uIHg4Nl82NC4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpnZXRSZXBSZWdDbGFzc0ZvcihFVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoVlQuaXNTaW1wbGUoKSAmJiAiZ2V0UmVwUmVnQ2xhc3NGb3IgY2FsbGVkIG9uIGlsbGVnYWwgdHlwZSEiKTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IFJlcFJlZ0NsYXNzRm9yVlRbVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeV07CisgICAgcmV0dXJuIFJDOworICB9CisKKyAgLy8vIGdldFJlcFJlZ0NsYXNzQ29zdEZvciAtIFJldHVybiB0aGUgY29zdCBvZiB0aGUgJ3JlcHJlc2VudGF0aXZlJyByZWdpc3RlcgorICAvLy8gY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZS4KKyAgdmlydHVhbCB1aW50OF90IGdldFJlcFJlZ0NsYXNzQ29zdEZvcihFVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoVlQuaXNTaW1wbGUoKSAmJiAiZ2V0UmVwUmVnQ2xhc3NDb3N0Rm9yIGNhbGxlZCBvbiBpbGxlZ2FsIHR5cGUhIik7CisgICAgcmV0dXJuIFJlcFJlZ0NsYXNzQ29zdEZvclZUW1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldOworICB9CisKKyAgLy8vIGdldFJlZ1ByZXNzdXJlTGltaXQgLSBSZXR1cm4gdGhlIHJlZ2lzdGVyIHByZXNzdXJlICJoaWdoIHdhdGVyIG1hcmsiIGZvcgorICAvLy8gdGhlIHNwZWNpZmljIHJlZ2lzdGVyIGNsYXNzLiBUaGUgc2NoZWR1bGVyIGlzIGluIGhpZ2ggcmVnaXN0ZXIgcHJlc3N1cmUKKyAgLy8vIG1vZGUgKGZvciB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIgY2xhc3MpIGlmIGl0IGdvZXMgb3ZlciB0aGUgbGltaXQuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UmVnUHJlc3N1cmVMaW1pdChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBpc1R5cGVMZWdhbCAtIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaGFzIG5hdGl2ZSBzdXBwb3J0IGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCB2YWx1ZSB0eXBlLiAgVGhpcyBtZWFucyB0aGF0IGl0IGhhcyBhIHJlZ2lzdGVyIHRoYXQgZGlyZWN0bHkKKyAgLy8vIGhvbGRzIGl0IHdpdGhvdXQgcHJvbW90aW9ucyBvciBleHBhbnNpb25zLgorICBib29sIGlzVHlwZUxlZ2FsKEVWVCBWVCkgY29uc3QgeworICAgIGFzc2VydCghVlQuaXNTaW1wbGUoKSB8fAorICAgICAgICAgICAodW5zaWduZWQpVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSA8IGFycmF5X2xlbmd0aG9mKFJlZ0NsYXNzRm9yVlQpKTsKKyAgICByZXR1cm4gVlQuaXNTaW1wbGUoKSAmJiBSZWdDbGFzc0ZvclZUW1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldICE9IDA7CisgIH0KKworICAvLy8gaXNUeXBlU3ludGhlc2l6YWJsZSAtIFJldHVybiB0cnVlIGlmIGl0J3MgT0sgZm9yIHRoZSBjb21waWxlciB0byBjcmVhdGUKKyAgLy8vIG5ldyBvcGVyYXRpb25zIG9mIHRoaXMgdHlwZS4gIEFsbCBMZWdhbCB0eXBlcyBhcmUgc3ludGhlc2l6YWJsZSBleGNlcHQKKyAgLy8vIE1NWCB2ZWN0b3IgdHlwZXMgb24gWDg2LiAgTm9uLUxlZ2FsIHR5cGVzIGFyZSBub3Qgc3ludGhlc2l6YWJsZS4KKyAgYm9vbCBpc1R5cGVTeW50aGVzaXphYmxlKEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBpc1R5cGVMZWdhbChWVCkgJiYgU3ludGhlc2l6YWJsZVtWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5XTsKKyAgfQorCisgIGNsYXNzIFZhbHVlVHlwZUFjdGlvbkltcGwgeworICAgIC8vLyBWYWx1ZVR5cGVBY3Rpb25zIC0gRm9yIGVhY2ggdmFsdWUgdHlwZSwga2VlcCBhIExlZ2FsaXplQWN0aW9uIGVudW0KKyAgICAvLy8gdGhhdCBpbmRpY2F0ZXMgaG93IGluc3RydWN0aW9uIHNlbGVjdGlvbiBzaG91bGQgZGVhbCB3aXRoIHRoZSB0eXBlLgorICAgIHVpbnQ4X3QgVmFsdWVUeXBlQWN0aW9uc1tNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKyAgcHVibGljOgorICAgIFZhbHVlVHlwZUFjdGlvbkltcGwoKSB7CisgICAgICBzdGQ6OmZpbGwoVmFsdWVUeXBlQWN0aW9ucywgYXJyYXlfZW5kb2YoVmFsdWVUeXBlQWN0aW9ucyksIDApOworICAgIH0KKyAgICBMZWdhbGl6ZUFjdGlvbiBnZXRUeXBlQWN0aW9uKExMVk1Db250ZXh0ICZDb250ZXh0LCBFVlQgVlQpIGNvbnN0IHsKKyAgICAgIGlmIChWVC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICAgICAgICByZXR1cm4gVlQuaXNQb3cyVmVjdG9yVHlwZSgpID8gRXhwYW5kIDogUHJvbW90ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVlQuaXNJbnRlZ2VyKCkpCisgICAgICAgICAgLy8gRmlyc3QgcHJvbW90ZSB0byBhIHBvd2VyLW9mLXR3byBzaXplLCB0aGVuIGV4cGFuZCBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgcmV0dXJuIFZUID09IFZULmdldFJvdW5kSW50ZWdlclR5cGUoQ29udGV4dCkgPyBFeHBhbmQgOiBQcm9tb3RlOworICAgICAgICBhc3NlcnQoMCAmJiAiVW5zdXBwb3J0ZWQgZXh0ZW5kZWQgdHlwZSEiKTsKKyAgICAgICAgcmV0dXJuIExlZ2FsOworICAgICAgfQorICAgICAgdW5zaWduZWQgSSA9IFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHk7CisgICAgICByZXR1cm4gKExlZ2FsaXplQWN0aW9uKVZhbHVlVHlwZUFjdGlvbnNbSV07CisgICAgfQorICAgIHZvaWQgc2V0VHlwZUFjdGlvbihFVlQgVlQsIExlZ2FsaXplQWN0aW9uIEFjdGlvbikgeworICAgICAgdW5zaWduZWQgSSA9IFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHk7CisgICAgICBWYWx1ZVR5cGVBY3Rpb25zW0ldID0gQWN0aW9uOworICAgIH0KKyAgfTsKKworICBjb25zdCBWYWx1ZVR5cGVBY3Rpb25JbXBsICZnZXRWYWx1ZVR5cGVBY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBWYWx1ZVR5cGVBY3Rpb25zOworICB9CisKKyAgLy8vIGdldFR5cGVBY3Rpb24gLSBSZXR1cm4gaG93IHdlIHNob3VsZCBsZWdhbGl6ZSB2YWx1ZXMgb2YgdGhpcyB0eXBlLCBlaXRoZXIKKyAgLy8vIGl0IGlzIGFscmVhZHkgbGVnYWwgKHJldHVybiAnTGVnYWwnKSBvciB3ZSBuZWVkIHRvIHByb21vdGUgaXQgdG8gYSBsYXJnZXIKKyAgLy8vIHR5cGUgKHJldHVybiAnUHJvbW90ZScpLCBvciB3ZSBuZWVkIHRvIGV4cGFuZCBpdCBpbnRvIG11bHRpcGxlIHJlZ2lzdGVycworICAvLy8gb2Ygc21hbGxlciBpbnRlZ2VyIHR5cGUgKHJldHVybiAnRXhwYW5kJykuICAnQ3VzdG9tJyBpcyBub3QgYW4gb3B0aW9uLgorICBMZWdhbGl6ZUFjdGlvbiBnZXRUeXBlQWN0aW9uKExMVk1Db250ZXh0ICZDb250ZXh0LCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWVUeXBlQWN0aW9ucy5nZXRUeXBlQWN0aW9uKENvbnRleHQsIFZUKTsKKyAgfQorCisgIC8vLyBnZXRUeXBlVG9UcmFuc2Zvcm1UbyAtIEZvciB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldCwgdGhpcyBpcyBhbgorICAvLy8gaWRlbnRpdHkgZnVuY3Rpb24uICBGb3IgdHlwZXMgdGhhdCBtdXN0IGJlIHByb21vdGVkIHRvIGxhcmdlciB0eXBlcywgdGhpcworICAvLy8gcmV0dXJucyB0aGUgbGFyZ2VyIHR5cGUgdG8gcHJvbW90ZSB0by4gIEZvciBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlIGxhcmdlcgorICAvLy8gdGhhbiB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHJlZ2lzdGVyLCB0aGlzIGNvbnRhaW5zIG9uZSBzdGVwIGluIHRoZSBleHBhbnNpb24KKyAgLy8vIHRvIGdldCB0byB0aGUgc21hbGxlciByZWdpc3Rlci4gRm9yIGlsbGVnYWwgZmxvYXRpbmcgcG9pbnQgdHlwZXMsIHRoaXMKKyAgLy8vIHJldHVybnMgdGhlIGludGVnZXIgdHlwZSB0byB0cmFuc2Zvcm0gdG8uCisgIEVWVCBnZXRUeXBlVG9UcmFuc2Zvcm1UbyhMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZUKSBjb25zdCB7CisgICAgaWYgKFZULmlzU2ltcGxlKCkpIHsKKyAgICAgIGFzc2VydCgodW5zaWduZWQpVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSA8CisgICAgICAgICAgICAgYXJyYXlfbGVuZ3Rob2YoVHJhbnNmb3JtVG9UeXBlKSk7CisgICAgICBFVlQgTlZUID0gVHJhbnNmb3JtVG9UeXBlW1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldOworICAgICAgYXNzZXJ0KGdldFR5cGVBY3Rpb24oQ29udGV4dCwgTlZUKSAhPSBQcm9tb3RlICYmCisgICAgICAgICAgICAgIlByb21vdGUgbWF5IG5vdCBmb2xsb3cgRXhwYW5kIG9yIFByb21vdGUiKTsKKyAgICAgIHJldHVybiBOVlQ7CisgICAgfQorCisgICAgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICAgIEVWVCBOVlQgPSBWVC5nZXRQb3cyVmVjdG9yVHlwZShDb250ZXh0KTsKKyAgICAgIGlmIChOVlQgPT0gVlQpIHsKKyAgICAgICAgLy8gVmVjdG9yIGxlbmd0aCBpcyBhIHBvd2VyIG9mIDIgLSBzcGxpdCB0byBoYWxmIHRoZSBzaXplLgorICAgICAgICB1bnNpZ25lZCBOdW1FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgICAgRVZUIEVsdFZUID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIChOdW1FbHRzID09IDEpID8KKyAgICAgICAgICBFbHRWVCA6IEVWVDo6Z2V0VmVjdG9yVlQoQ29udGV4dCwgRWx0VlQsIE51bUVsdHMgLyAyKTsKKyAgICAgIH0KKyAgICAgIC8vIFByb21vdGUgdG8gYSBwb3dlciBvZiB0d28gc2l6ZSwgYXZvaWRpbmcgbXVsdGktc3RlcCBwcm9tb3Rpb24uCisgICAgICByZXR1cm4gZ2V0VHlwZUFjdGlvbihDb250ZXh0LCBOVlQpID09IFByb21vdGUgPworICAgICAgICBnZXRUeXBlVG9UcmFuc2Zvcm1UbyhDb250ZXh0LCBOVlQpIDogTlZUOworICAgIH0gZWxzZSBpZiAoVlQuaXNJbnRlZ2VyKCkpIHsKKyAgICAgIEVWVCBOVlQgPSBWVC5nZXRSb3VuZEludGVnZXJUeXBlKENvbnRleHQpOworICAgICAgaWYgKE5WVCA9PSBWVCkKKyAgICAgICAgLy8gU2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAtIGV4cGFuZCB0byBoYWxmIHRoZSBzaXplLgorICAgICAgICByZXR1cm4gRVZUOjpnZXRJbnRlZ2VyVlQoQ29udGV4dCwgVlQuZ2V0U2l6ZUluQml0cygpIC8gMik7CisgICAgICBlbHNlCisgICAgICAgIC8vIFByb21vdGUgdG8gYSBwb3dlciBvZiB0d28gc2l6ZSwgYXZvaWRpbmcgbXVsdGktc3RlcCBwcm9tb3Rpb24uCisgICAgICAgIHJldHVybiBnZXRUeXBlQWN0aW9uKENvbnRleHQsIE5WVCkgPT0gUHJvbW90ZSA/CisgICAgICAgICAgZ2V0VHlwZVRvVHJhbnNmb3JtVG8oQ29udGV4dCwgTlZUKSA6IE5WVDsKKyAgICB9CisgICAgYXNzZXJ0KDAgJiYgIlVuc3VwcG9ydGVkIGV4dGVuZGVkIHR5cGUhIik7CisgICAgcmV0dXJuIE1WVChNVlQ6Ok90aGVyKTsgLy8gTm90IHJlYWNoZWQKKyAgfQorCisgIC8vLyBnZXRUeXBlVG9FeHBhbmRUbyAtIEZvciB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldCwgdGhpcyBpcyBhbgorICAvLy8gaWRlbnRpdHkgZnVuY3Rpb24uICBGb3IgdHlwZXMgdGhhdCBtdXN0IGJlIGV4cGFuZGVkIChpLmUuIGludGVnZXIgdHlwZXMKKyAgLy8vIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGludGVnZXIgcmVnaXN0ZXIgb3IgaWxsZWdhbCBmbG9hdGluZworICAvLy8gcG9pbnQgdHlwZXMpLCB0aGlzIHJldHVybnMgdGhlIGxhcmdlc3QgbGVnYWwgdHlwZSBpdCB3aWxsIGJlIGV4cGFuZGVkIHRvLgorICBFVlQgZ2V0VHlwZVRvRXhwYW5kVG8oTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCkgY29uc3QgeworICAgIGFzc2VydCghVlQuaXNWZWN0b3IoKSk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoZ2V0VHlwZUFjdGlvbihDb250ZXh0LCBWVCkpIHsKKyAgICAgIGNhc2UgTGVnYWw6CisgICAgICAgIHJldHVybiBWVDsKKyAgICAgIGNhc2UgRXhwYW5kOgorICAgICAgICBWVCA9IGdldFR5cGVUb1RyYW5zZm9ybVRvKENvbnRleHQsIFZUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoZmFsc2UgJiYgIlR5cGUgaXMgbm90IGxlZ2FsIG5vciBpcyBpdCB0byBiZSBleHBhbmRlZCEiKTsKKyAgICAgICAgcmV0dXJuIFZUOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVlQ7CisgIH0KKworICAvLy8gZ2V0VmVjdG9yVHlwZUJyZWFrZG93biAtIFZlY3RvciB0eXBlcyBhcmUgYnJva2VuIGRvd24gaW50byBzb21lIG51bWJlciBvZgorICAvLy8gbGVnYWwgZmlyc3QgY2xhc3MgdHlwZXMuICBGb3IgZXhhbXBsZSwgRVZUOjp2OGYzMiBtYXBzIHRvIDIgRVZUOjp2NGYzMgorICAvLy8gd2l0aCBBbHRpdmVjIG9yIFNTRTEsIG9yIDggcHJvbW90ZWQgRVZUOjpmNjQgdmFsdWVzIHdpdGggdGhlIFg4NiBGUCBzdGFjay4KKyAgLy8vIFNpbWlsYXJseSwgRVZUOjp2Mmk2NCB0dXJucyBpbnRvIDQgRVZUOjppMzIgdmFsdWVzIHdpdGggYm90aCBQUEMgYW5kIFg4Ni4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIG5lZWRlZCwgYW5kIHRoZSBWVCBmb3IgZWFjaAorICAvLy8gcmVnaXN0ZXIuICBJdCBhbHNvIHJldHVybnMgdGhlIFZUIGFuZCBxdWFudGl0eSBvZiB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAvLy8gYmVmb3JlIHRoZXkgYXJlIHByb21vdGVkL2V4cGFuZGVkLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0VmVjdG9yVHlwZUJyZWFrZG93bihMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCAmSW50ZXJtZWRpYXRlVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUludGVybWVkaWF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUICZSZWdpc3RlclZUKSBjb25zdDsKKworICAvLy8gZ2V0VGd0TWVtSW50cmluc2ljOiBHaXZlbiBhbiBpbnRyaW5zaWMsIGNoZWNrcyBpZiBvbiB0aGUgdGFyZ2V0IHRoZQorICAvLy8gaW50cmluc2ljIHdpbGwgbmVlZCB0byBtYXAgdG8gYSBNZW1JbnRyaW5zaWNOb2RlICh0b3VjaGVzIG1lbW9yeSkuIElmCisgIC8vLyB0aGlzIGlzIHRoZSBjYXNlLCBpdCByZXR1cm5zIHRydWUgYW5kIHN0b3JlIHRoZSBpbnRyaW5zaWMKKyAgLy8vIGluZm9ybWF0aW9uIGludG8gdGhlIEludHJpbnNpY0luZm8gdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4KKyAgc3RydWN0IEludHJpbnNpY0luZm8geworICAgIHVuc2lnbmVkICAgICBvcGM7ICAgICAgICAgLy8gdGFyZ2V0IG9wY29kZQorICAgIEVWVCAgICAgICAgICBtZW1WVDsgICAgICAgLy8gbWVtb3J5IFZUCisgICAgY29uc3QgVmFsdWUqIHB0clZhbDsgICAgICAvLyB2YWx1ZSByZXByZXNlbnRpbmcgbWVtb3J5IGxvY2F0aW9uCisgICAgaW50ICAgICAgICAgIG9mZnNldDsgICAgICAvLyBvZmZzZXQgb2ZmIG9mIHB0clZhbAorICAgIHVuc2lnbmVkICAgICBhbGlnbjsgICAgICAgLy8gYWxpZ25tZW50CisgICAgYm9vbCAgICAgICAgIHZvbDsgICAgICAgICAvLyBpcyB2b2xhdGlsZT8KKyAgICBib29sICAgICAgICAgcmVhZE1lbTsgICAgIC8vIHJlYWRzIG1lbW9yeT8KKyAgICBib29sICAgICAgICAgd3JpdGVNZW07ICAgIC8vIHdyaXRlcyBtZW1vcnk/CisgIH07CisKKyAgdmlydHVhbCBib29sIGdldFRndE1lbUludHJpbnNpYyhJbnRyaW5zaWNJbmZvICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxJbnN0ICZJLCB1bnNpZ25lZCBJbnRyaW5zaWMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNGUEltbUxlZ2FsIC0gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgY2FuIGluc3RydWN0aW9uIHNlbGVjdCB0aGUKKyAgLy8vIHNwZWNpZmllZCBGUCBpbW1lZGlhdGUgbmF0aXZlbHkuIElmIGZhbHNlLCB0aGUgbGVnYWxpemVyIHdpbGwgbWF0ZXJpYWxpemUKKyAgLy8vIHRoZSBGUCBpbW1lZGlhdGUgYXMgYSBsb2FkIGZyb20gYSBjb25zdGFudCBwb29sLgorICB2aXJ0dWFsIGJvb2wgaXNGUEltbUxlZ2FsKGNvbnN0IEFQRmxvYXQgJkltbSwgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGlzU2h1ZmZsZU1hc2tMZWdhbCAtIFRhcmdldHMgY2FuIHVzZSB0aGlzIHRvIGluZGljYXRlIHRoYXQgdGhleSBvbmx5CisgIC8vLyBzdXBwb3J0ICpzb21lKiBWRUNUT1JfU0hVRkZMRSBvcGVyYXRpb25zLCB0aG9zZSB3aXRoIHNwZWNpZmljIG1hc2tzLgorICAvLy8gQnkgZGVmYXVsdCwgaWYgYSB0YXJnZXQgc3VwcG9ydHMgdGhlIFZFQ1RPUl9TSFVGRkxFIG5vZGUsIGFsbCBtYXNrIHZhbHVlcworICAvLy8gYXJlIGFzc3VtZWQgdG8gYmUgbGVnYWwuCisgIHZpcnR1YWwgYm9vbCBpc1NodWZmbGVNYXNrTGVnYWwoY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gY2FuT3BUcmFwIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBvcGVyYXRpb24gY2FuIHRyYXAgZm9yIHRoZSB2YWx1ZSB0eXBlLgorICAvLy8gVlQgbXVzdCBiZSBhIGxlZ2FsIHR5cGUuIEJ5IGRlZmF1bHQsIHdlIG9wdGltaXN0aWNhbGx5IGFzc3VtZSBtb3N0CisgIC8vLyBvcGVyYXRpb25zIGRvbid0IHRyYXAgZXhjZXB0IGZvciBkaXZpZGUgYW5kIHJlbWFpbmRlci4KKyAgdmlydHVhbCBib29sIGNhbk9wVHJhcCh1bnNpZ25lZCBPcCwgRVZUIFZUKSBjb25zdDsKKworICAvLy8gaXNWZWN0b3JDbGVhck1hc2tMZWdhbCAtIFNpbWlsYXIgdG8gaXNTaHVmZmxlTWFza0xlZ2FsLiBUaGlzIGlzCisgIC8vLyB1c2VkIGJ5IFRhcmdldHMgY2FuIHVzZSB0aGlzIHRvIGluZGljYXRlIGlmIHRoZXJlIGlzIGEgc3VpdGFibGUKKyAgLy8vIFZFQ1RPUl9TSFVGRkxFIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSBhIFZBTkQgd2l0aCBhIGNvbnN0YW50CisgIC8vLyBwb29sIGVudHJ5LgorICB2aXJ0dWFsIGJvb2wgaXNWZWN0b3JDbGVhck1hc2tMZWdhbChjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGdldE9wZXJhdGlvbkFjdGlvbiAtIFJldHVybiBob3cgdGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIHRyZWF0ZWQ6IGVpdGhlcgorICAvLy8gaXQgaXMgbGVnYWwsIG5lZWRzIHRvIGJlIHByb21vdGVkIHRvIGEgbGFyZ2VyIHNpemUsIG5lZWRzIHRvIGJlCisgIC8vLyBleHBhbmRlZCB0byBzb21lIG90aGVyIGNvZGUgc2VxdWVuY2UsIG9yIHRoZSB0YXJnZXQgaGFzIGEgY3VzdG9tIGV4cGFuZGVyCisgIC8vLyBmb3IgaXQuCisgIExlZ2FsaXplQWN0aW9uIGdldE9wZXJhdGlvbkFjdGlvbih1bnNpZ25lZCBPcCwgRVZUIFZUKSBjb25zdCB7CisgICAgaWYgKFZULmlzRXh0ZW5kZWQoKSkgcmV0dXJuIEV4cGFuZDsKKyAgICBhc3NlcnQoT3AgPCBhcnJheV9sZW5ndGhvZihPcEFjdGlvbnNbMF0pICYmICJUYWJsZSBpc24ndCBiaWcgZW5vdWdoISIpOworICAgIHVuc2lnbmVkIEkgPSAodW5zaWduZWQpIFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHk7CisgICAgcmV0dXJuIChMZWdhbGl6ZUFjdGlvbilPcEFjdGlvbnNbSV1bT3BdOworICB9CisKKyAgLy8vIGlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGlzCisgIC8vLyBsZWdhbCBvbiB0aGlzIHRhcmdldCBvciBjYW4gYmUgbWFkZSBsZWdhbCB3aXRoIGN1c3RvbSBsb3dlcmluZy4gVGhpcworICAvLy8gaXMgdXNlZCB0byBoZWxwIGd1aWRlIGhpZ2gtbGV2ZWwgbG93ZXJpbmcgZGVjaXNpb25zLgorICBib29sIGlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbSh1bnNpZ25lZCBPcCwgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIChWVCA9PSBNVlQ6Ok90aGVyIHx8IGlzVHlwZUxlZ2FsKFZUKSkgJiYKKyAgICAgIChnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBMZWdhbCB8fAorICAgICAgIGdldE9wZXJhdGlvbkFjdGlvbihPcCwgVlQpID09IEN1c3RvbSk7CisgIH0KKworICAvLy8gaXNPcGVyYXRpb25MZWdhbCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGlzIGxlZ2FsIG9uIHRoaXMKKyAgLy8vIHRhcmdldC4KKyAgYm9vbCBpc09wZXJhdGlvbkxlZ2FsKHVuc2lnbmVkIE9wLCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gKFZUID09IE1WVDo6T3RoZXIgfHwgaXNUeXBlTGVnYWwoVlQpKSAmJgorICAgICAgICAgICBnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBMZWdhbDsKKyAgfQorCisgIC8vLyBnZXRMb2FkRXh0QWN0aW9uIC0gUmV0dXJuIGhvdyB0aGlzIGxvYWQgd2l0aCBleHRlbnNpb24gc2hvdWxkIGJlIHRyZWF0ZWQ6CisgIC8vLyBlaXRoZXIgaXQgaXMgbGVnYWwsIG5lZWRzIHRvIGJlIHByb21vdGVkIHRvIGEgbGFyZ2VyIHNpemUsIG5lZWRzIHRvIGJlCisgIC8vLyBleHBhbmRlZCB0byBzb21lIG90aGVyIGNvZGUgc2VxdWVuY2UsIG9yIHRoZSB0YXJnZXQgaGFzIGEgY3VzdG9tIGV4cGFuZGVyCisgIC8vLyBmb3IgaXQuCisgIExlZ2FsaXplQWN0aW9uIGdldExvYWRFeHRBY3Rpb24odW5zaWduZWQgRXh0VHlwZSwgRVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KEV4dFR5cGUgPCBJU0Q6OkxBU1RfTE9BREVYVF9UWVBFICYmCisgICAgICAgICAgICh1bnNpZ25lZClWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5IDwgTVZUOjpMQVNUX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICByZXR1cm4gKExlZ2FsaXplQWN0aW9uKUxvYWRFeHRBY3Rpb25zW1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldW0V4dFR5cGVdOworICB9CisKKyAgLy8vIGlzTG9hZEV4dExlZ2FsIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBsb2FkIHdpdGggZXh0ZW5zaW9uIGlzIGxlZ2FsCisgIC8vLyBvbiB0aGlzIHRhcmdldC4KKyAgYm9vbCBpc0xvYWRFeHRMZWdhbCh1bnNpZ25lZCBFeHRUeXBlLCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gVlQuaXNTaW1wbGUoKSAmJgorICAgICAgKGdldExvYWRFeHRBY3Rpb24oRXh0VHlwZSwgVlQpID09IExlZ2FsIHx8CisgICAgICAgZ2V0TG9hZEV4dEFjdGlvbihFeHRUeXBlLCBWVCkgPT0gQ3VzdG9tKTsKKyAgfQorCisgIC8vLyBnZXRUcnVuY1N0b3JlQWN0aW9uIC0gUmV0dXJuIGhvdyB0aGlzIHN0b3JlIHdpdGggdHJ1bmNhdGlvbiBzaG91bGQgYmUKKyAgLy8vIHRyZWF0ZWQ6IGVpdGhlciBpdCBpcyBsZWdhbCwgbmVlZHMgdG8gYmUgcHJvbW90ZWQgdG8gYSBsYXJnZXIgc2l6ZSwgbmVlZHMKKyAgLy8vIHRvIGJlIGV4cGFuZGVkIHRvIHNvbWUgb3RoZXIgY29kZSBzZXF1ZW5jZSwgb3IgdGhlIHRhcmdldCBoYXMgYSBjdXN0b20KKyAgLy8vIGV4cGFuZGVyIGZvciBpdC4KKyAgTGVnYWxpemVBY3Rpb24gZ2V0VHJ1bmNTdG9yZUFjdGlvbihFVlQgVmFsVlQsIEVWVCBNZW1WVCkgY29uc3QgeworICAgIGFzc2VydCgodW5zaWduZWQpVmFsVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgKHVuc2lnbmVkKU1lbVZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgPCBNVlQ6OkxBU1RfVkFMVUVUWVBFICYmCisgICAgICAgICAgICJUYWJsZSBpc24ndCBiaWcgZW5vdWdoISIpOworICAgIHJldHVybiAoTGVnYWxpemVBY3Rpb24pVHJ1bmNTdG9yZUFjdGlvbnNbVmFsVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW01lbVZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldOworICB9CisKKyAgLy8vIGlzVHJ1bmNTdG9yZUxlZ2FsIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBzdG9yZSB3aXRoIHRydW5jYXRpb24gaXMKKyAgLy8vIGxlZ2FsIG9uIHRoaXMgdGFyZ2V0LgorICBib29sIGlzVHJ1bmNTdG9yZUxlZ2FsKEVWVCBWYWxWVCwgRVZUIE1lbVZUKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVHlwZUxlZ2FsKFZhbFZUKSAmJiBNZW1WVC5pc1NpbXBsZSgpICYmCisgICAgICAoZ2V0VHJ1bmNTdG9yZUFjdGlvbihWYWxWVCwgTWVtVlQpID09IExlZ2FsIHx8CisgICAgICAgZ2V0VHJ1bmNTdG9yZUFjdGlvbihWYWxWVCwgTWVtVlQpID09IEN1c3RvbSk7CisgIH0KKworICAvLy8gZ2V0SW5kZXhlZExvYWRBY3Rpb24gLSBSZXR1cm4gaG93IHRoZSBpbmRleGVkIGxvYWQgc2hvdWxkIGJlIHRyZWF0ZWQ6CisgIC8vLyBlaXRoZXIgaXQgaXMgbGVnYWwsIG5lZWRzIHRvIGJlIHByb21vdGVkIHRvIGEgbGFyZ2VyIHNpemUsIG5lZWRzIHRvIGJlCisgIC8vLyBleHBhbmRlZCB0byBzb21lIG90aGVyIGNvZGUgc2VxdWVuY2UsIG9yIHRoZSB0YXJnZXQgaGFzIGEgY3VzdG9tIGV4cGFuZGVyCisgIC8vLyBmb3IgaXQuCisgIExlZ2FsaXplQWN0aW9uCisgIGdldEluZGV4ZWRMb2FkQWN0aW9uKHVuc2lnbmVkIElkeE1vZGUsIEVWVCBWVCkgY29uc3QgeworICAgIGFzc2VydCggSWR4TW9kZSA8IElTRDo6TEFTVF9JTkRFWEVEX01PREUgJiYKKyAgICAgICAgICAgKCh1bnNpZ25lZClWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgdW5zaWduZWQgVHkgPSAodW5zaWduZWQpVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeTsKKyAgICByZXR1cm4gKExlZ2FsaXplQWN0aW9uKSgoSW5kZXhlZE1vZGVBY3Rpb25zW1R5XVtJZHhNb2RlXSAmIDB4ZjApID4+IDQpOworICB9CisKKyAgLy8vIGlzSW5kZXhlZExvYWRMZWdhbCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXhlZCBsb2FkIGlzIGxlZ2FsCisgIC8vLyBvbiB0aGlzIHRhcmdldC4KKyAgYm9vbCBpc0luZGV4ZWRMb2FkTGVnYWwodW5zaWduZWQgSWR4TW9kZSwgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIFZULmlzU2ltcGxlKCkgJiYKKyAgICAgIChnZXRJbmRleGVkTG9hZEFjdGlvbihJZHhNb2RlLCBWVCkgPT0gTGVnYWwgfHwKKyAgICAgICBnZXRJbmRleGVkTG9hZEFjdGlvbihJZHhNb2RlLCBWVCkgPT0gQ3VzdG9tKTsKKyAgfQorCisgIC8vLyBnZXRJbmRleGVkU3RvcmVBY3Rpb24gLSBSZXR1cm4gaG93IHRoZSBpbmRleGVkIHN0b3JlIHNob3VsZCBiZSB0cmVhdGVkOgorICAvLy8gZWl0aGVyIGl0IGlzIGxlZ2FsLCBuZWVkcyB0byBiZSBwcm9tb3RlZCB0byBhIGxhcmdlciBzaXplLCBuZWVkcyB0byBiZQorICAvLy8gZXhwYW5kZWQgdG8gc29tZSBvdGhlciBjb2RlIHNlcXVlbmNlLCBvciB0aGUgdGFyZ2V0IGhhcyBhIGN1c3RvbSBleHBhbmRlcgorICAvLy8gZm9yIGl0LgorICBMZWdhbGl6ZUFjdGlvbgorICBnZXRJbmRleGVkU3RvcmVBY3Rpb24odW5zaWduZWQgSWR4TW9kZSwgRVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KCBJZHhNb2RlIDwgSVNEOjpMQVNUX0lOREVYRURfTU9ERSAmJgorICAgICAgICAgICAoKHVuc2lnbmVkKVZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIDwgTVZUOjpMQVNUX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICB1bnNpZ25lZCBUeSA9ICh1bnNpZ25lZClWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5OworICAgIHJldHVybiAoTGVnYWxpemVBY3Rpb24pKEluZGV4ZWRNb2RlQWN0aW9uc1tUeV1bSWR4TW9kZV0gJiAweDBmKTsKKyAgfQorCisgIC8vLyBpc0luZGV4ZWRTdG9yZUxlZ2FsIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbmRleGVkIGxvYWQgaXMgbGVnYWwKKyAgLy8vIG9uIHRoaXMgdGFyZ2V0LgorICBib29sIGlzSW5kZXhlZFN0b3JlTGVnYWwodW5zaWduZWQgSWR4TW9kZSwgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIFZULmlzU2ltcGxlKCkgJiYKKyAgICAgIChnZXRJbmRleGVkU3RvcmVBY3Rpb24oSWR4TW9kZSwgVlQpID09IExlZ2FsIHx8CisgICAgICAgZ2V0SW5kZXhlZFN0b3JlQWN0aW9uKElkeE1vZGUsIFZUKSA9PSBDdXN0b20pOworICB9CisKKyAgLy8vIGdldENvbmRDb2RlQWN0aW9uIC0gUmV0dXJuIGhvdyB0aGUgY29uZGl0aW9uIGNvZGUgc2hvdWxkIGJlIHRyZWF0ZWQ6CisgIC8vLyBlaXRoZXIgaXQgaXMgbGVnYWwsIG5lZWRzIHRvIGJlIGV4cGFuZGVkIHRvIHNvbWUgb3RoZXIgY29kZSBzZXF1ZW5jZSwKKyAgLy8vIG9yIHRoZSB0YXJnZXQgaGFzIGEgY3VzdG9tIGV4cGFuZGVyIGZvciBpdC4KKyAgTGVnYWxpemVBY3Rpb24KKyAgZ2V0Q29uZENvZGVBY3Rpb24oSVNEOjpDb25kQ29kZSBDQywgRVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KCh1bnNpZ25lZClDQyA8IGFycmF5X2xlbmd0aG9mKENvbmRDb2RlQWN0aW9ucykgJiYKKyAgICAgICAgICAgKHVuc2lnbmVkKVZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgPCBzaXplb2YoQ29uZENvZGVBY3Rpb25zWzBdKSo0ICYmCisgICAgICAgICAgICJUYWJsZSBpc24ndCBiaWcgZW5vdWdoISIpOworICAgIExlZ2FsaXplQWN0aW9uIEFjdGlvbiA9IChMZWdhbGl6ZUFjdGlvbikKKyAgICAgICgoQ29uZENvZGVBY3Rpb25zW0NDXSA+PiAoMipWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSkgJiAzKTsKKyAgICBhc3NlcnQoQWN0aW9uICE9IFByb21vdGUgJiYgIkNhbid0IHByb21vdGUgY29uZGl0aW9uIGNvZGUhIik7CisgICAgcmV0dXJuIEFjdGlvbjsKKyAgfQorCisgIC8vLyBpc0NvbmRDb2RlTGVnYWwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiBjb2RlIGlzIGxlZ2FsCisgIC8vLyBvbiB0aGlzIHRhcmdldC4KKyAgYm9vbCBpc0NvbmRDb2RlTGVnYWwoSVNEOjpDb25kQ29kZSBDQywgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENvbmRDb2RlQWN0aW9uKENDLCBWVCkgPT0gTGVnYWwgfHwKKyAgICAgICAgICAgZ2V0Q29uZENvZGVBY3Rpb24oQ0MsIFZUKSA9PSBDdXN0b207CisgIH0KKworCisgIC8vLyBnZXRUeXBlVG9Qcm9tb3RlVG8gLSBJZiB0aGUgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbiBpcyB0byBwcm9tb3RlLCB0aGlzCisgIC8vLyBtZXRob2QgcmV0dXJucyB0aGUgVmFsdWVUeXBlIHRvIHByb21vdGUgdG8uCisgIEVWVCBnZXRUeXBlVG9Qcm9tb3RlVG8odW5zaWduZWQgT3AsIEVWVCBWVCkgY29uc3QgeworICAgIGFzc2VydChnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBQcm9tb3RlICYmCisgICAgICAgICAgICJUaGlzIG9wZXJhdGlvbiBpc24ndCBwcm9tb3RlZCEiKTsKKworICAgIC8vIFNlZSBpZiB0aGlzIGhhcyBhbiBleHBsaWNpdCB0eXBlIHNwZWNpZmllZC4KKyAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVDo6U2ltcGxlVmFsdWVUeXBlPiwKKyAgICAgICAgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZT46OmNvbnN0X2l0ZXJhdG9yIFBUVEkgPQorICAgICAgUHJvbW90ZVRvVHlwZS5maW5kKHN0ZDo6bWFrZV9wYWlyKE9wLCBWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSk7CisgICAgaWYgKFBUVEkgIT0gUHJvbW90ZVRvVHlwZS5lbmQoKSkgcmV0dXJuIFBUVEktPnNlY29uZDsKKworICAgIGFzc2VydCgoVlQuaXNJbnRlZ2VyKCkgfHwgVlQuaXNGbG9hdGluZ1BvaW50KCkpICYmCisgICAgICAgICAgICJDYW5ub3QgYXV0b3Byb21vdGUgdGhpcyB0eXBlLCBhZGQgaXQgd2l0aCBBZGRQcm9tb3RlZFRvVHlwZS4iKTsKKworICAgIEVWVCBOVlQgPSBWVDsKKyAgICBkbyB7CisgICAgICBOVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE5WVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KzEpOworICAgICAgYXNzZXJ0KE5WVC5pc0ludGVnZXIoKSA9PSBWVC5pc0ludGVnZXIoKSAmJiBOVlQgIT0gTVZUOjppc1ZvaWQgJiYKKyAgICAgICAgICAgICAiRGlkbid0IGZpbmQgdHlwZSB0byBwcm9tb3RlIHRvISIpOworICAgIH0gd2hpbGUgKCFpc1R5cGVMZWdhbChOVlQpIHx8CisgICAgICAgICAgICAgIGdldE9wZXJhdGlvbkFjdGlvbihPcCwgTlZUKSA9PSBQcm9tb3RlKTsKKyAgICByZXR1cm4gTlZUOworICB9CisKKyAgLy8vIGdldFZhbHVlVHlwZSAtIFJldHVybiB0aGUgRVZUIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBMTFZNIHR5cGUuCisgIC8vLyBUaGlzIGlzIGZpeGVkIGJ5IHRoZSBMTFZNIG9wZXJhdGlvbnMgZXhjZXB0IGZvciB0aGUgcG9pbnRlciBzaXplLiAgSWYKKyAgLy8vIEFsbG93VW5rbm93biBpcyB0cnVlLCB0aGlzIHdpbGwgcmV0dXJuIE1WVDo6T3RoZXIgZm9yIHR5cGVzIHdpdGggbm8gRVZUCisgIC8vLyBjb3VudGVycGFydCAoZS5nLiBzdHJ1Y3RzKSwgb3RoZXJ3aXNlIGl0IHdpbGwgYXNzZXJ0LgorICBFVlQgZ2V0VmFsdWVUeXBlKGNvbnN0IFR5cGUgKlR5LCBib29sIEFsbG93VW5rbm93biA9IGZhbHNlKSBjb25zdCB7CisgICAgRVZUIFZUID0gRVZUOjpnZXRFVlQoVHksIEFsbG93VW5rbm93bik7CisgICAgcmV0dXJuIFZUID09IE1WVDo6aVBUUiA/IFBvaW50ZXJUeSA6IFZUOworICB9CisKKyAgLy8vIGdldEJ5VmFsVHlwZUFsaWdubWVudCAtIFJldHVybiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQgZm9yIEJ5VmFsIGFnZ3JlZ2F0ZQorICAvLy8gZnVuY3Rpb24gYXJndW1lbnRzIGluIHRoZSBjYWxsZXIgcGFyYW1ldGVyIGFyZWEuICBUaGlzIGlzIHRoZSBhY3R1YWwKKyAgLy8vIGFsaWdubWVudCwgbm90IGl0cyBsb2dhcml0aG0uCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0QnlWYWxUeXBlQWxpZ25tZW50KGNvbnN0IFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gZ2V0UmVnaXN0ZXJUeXBlIC0gUmV0dXJuIHRoZSB0eXBlIG9mIHJlZ2lzdGVycyB0aGF0IHRoaXMgVmFsdWVUeXBlIHdpbGwKKyAgLy8vIGV2ZW50dWFsbHkgcmVxdWlyZS4KKyAgRVZUIGdldFJlZ2lzdGVyVHlwZShNVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKHVuc2lnbmVkKVZULlNpbXBsZVR5IDwgYXJyYXlfbGVuZ3Rob2YoUmVnaXN0ZXJUeXBlRm9yVlQpKTsKKyAgICByZXR1cm4gUmVnaXN0ZXJUeXBlRm9yVlRbVlQuU2ltcGxlVHldOworICB9CisKKyAgLy8vIGdldFJlZ2lzdGVyVHlwZSAtIFJldHVybiB0aGUgdHlwZSBvZiByZWdpc3RlcnMgdGhhdCB0aGlzIFZhbHVlVHlwZSB3aWxsCisgIC8vLyBldmVudHVhbGx5IHJlcXVpcmUuCisgIEVWVCBnZXRSZWdpc3RlclR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCkgY29uc3QgeworICAgIGlmIChWVC5pc1NpbXBsZSgpKSB7CisgICAgICBhc3NlcnQoKHVuc2lnbmVkKVZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgPAorICAgICAgICAgICAgICAgIGFycmF5X2xlbmd0aG9mKFJlZ2lzdGVyVHlwZUZvclZUKSk7CisgICAgICByZXR1cm4gUmVnaXN0ZXJUeXBlRm9yVlRbVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeV07CisgICAgfQorICAgIGlmIChWVC5pc1ZlY3RvcigpKSB7CisgICAgICBFVlQgVlQxLCBSZWdpc3RlclZUOworICAgICAgdW5zaWduZWQgTnVtSW50ZXJtZWRpYXRlczsKKyAgICAgICh2b2lkKWdldFZlY3RvclR5cGVCcmVha2Rvd24oQ29udGV4dCwgVlQsIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtSW50ZXJtZWRpYXRlcywgUmVnaXN0ZXJWVCk7CisgICAgICByZXR1cm4gUmVnaXN0ZXJWVDsKKyAgICB9CisgICAgaWYgKFZULmlzSW50ZWdlcigpKSB7CisgICAgICByZXR1cm4gZ2V0UmVnaXN0ZXJUeXBlKENvbnRleHQsIGdldFR5cGVUb1RyYW5zZm9ybVRvKENvbnRleHQsIFZUKSk7CisgICAgfQorICAgIGFzc2VydCgwICYmICJVbnN1cHBvcnRlZCBleHRlbmRlZCB0eXBlISIpOworICAgIHJldHVybiBFVlQoTVZUOjpPdGhlcik7IC8vIE5vdCByZWFjaGVkCisgIH0KKworICAvLy8gZ2V0TnVtUmVnaXN0ZXJzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRoYXQgdGhpcyBWYWx1ZVR5cGUgd2lsbAorICAvLy8gZXZlbnR1YWxseSByZXF1aXJlLiAgVGhpcyBpcyBvbmUgZm9yIGFueSB0eXBlcyBwcm9tb3RlZCB0byBsaXZlIGluIGxhcmdlcgorICAvLy8gcmVnaXN0ZXJzLCBidXQgbWF5IGJlIG1vcmUgdGhhbiBvbmUgZm9yIHR5cGVzIChsaWtlIGk2NCkgdGhhdCBhcmUgc3BsaXQKKyAgLy8vIGludG8gcGllY2VzLiAgRm9yIHR5cGVzIGxpa2UgaTE0MCwgd2hpY2ggYXJlIGZpcnN0IHByb21vdGVkIHRoZW4gZXhwYW5kZWQsCisgIC8vLyBpdCBpcyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBuZWVkZWQgdG8gaG9sZCBhbGwgdGhlIGJpdHMgb2YgdGhlIG9yaWdpbmFsCisgIC8vLyB0eXBlLiAgRm9yIGFuIGkxNDAgb24gYSAzMiBiaXQgbWFjaGluZSB0aGlzIG1lYW5zIDUgcmVnaXN0ZXJzLgorICB1bnNpZ25lZCBnZXROdW1SZWdpc3RlcnMoTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCkgY29uc3QgeworICAgIGlmIChWVC5pc1NpbXBsZSgpKSB7CisgICAgICBhc3NlcnQoKHVuc2lnbmVkKVZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgPAorICAgICAgICAgICAgICAgIGFycmF5X2xlbmd0aG9mKE51bVJlZ2lzdGVyc0ZvclZUKSk7CisgICAgICByZXR1cm4gTnVtUmVnaXN0ZXJzRm9yVlRbVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeV07CisgICAgfQorICAgIGlmIChWVC5pc1ZlY3RvcigpKSB7CisgICAgICBFVlQgVlQxLCBWVDI7CisgICAgICB1bnNpZ25lZCBOdW1JbnRlcm1lZGlhdGVzOworICAgICAgcmV0dXJuIGdldFZlY3RvclR5cGVCcmVha2Rvd24oQ29udGV4dCwgVlQsIFZUMSwgTnVtSW50ZXJtZWRpYXRlcywgVlQyKTsKKyAgICB9CisgICAgaWYgKFZULmlzSW50ZWdlcigpKSB7CisgICAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICAgIHVuc2lnbmVkIFJlZ1dpZHRoID0gZ2V0UmVnaXN0ZXJUeXBlKENvbnRleHQsIFZUKS5nZXRTaXplSW5CaXRzKCk7CisgICAgICByZXR1cm4gKEJpdFdpZHRoICsgUmVnV2lkdGggLSAxKSAvIFJlZ1dpZHRoOworICAgIH0KKyAgICBhc3NlcnQoMCAmJiAiVW5zdXBwb3J0ZWQgZXh0ZW5kZWQgdHlwZSEiKTsKKyAgICByZXR1cm4gMDsgLy8gTm90IHJlYWNoZWQKKyAgfQorCisgIC8vLyBTaG91bGRTaHJpbmtGUENvbnN0YW50IC0gSWYgdHJ1ZSwgdGhlbiBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkCisgIC8vLyBzZWVrIHRvIHNocmluayB0aGUgRlAgY29uc3RhbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRvIGEgc21hbGxlciB0eXBlCisgIC8vLyBpbiBvcmRlciB0byBzYXZlIHNwYWNlIGFuZCAvIG9yIHJlZHVjZSBydW50aW1lLgorICB2aXJ0dWFsIGJvb2wgU2hvdWxkU2hyaW5rRlBDb25zdGFudChFVlQgVlQpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gaGFzVGFyZ2V0REFHQ29tYmluZSAtIElmIHRydWUsIHRoZSB0YXJnZXQgaGFzIGN1c3RvbSBEQUcgY29tYmluZQorICAvLy8gdHJhbnNmb3JtYXRpb25zIHRoYXQgaXQgY2FuIHBlcmZvcm0gZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKyAgYm9vbCBoYXNUYXJnZXREQUdDb21iaW5lKElTRDo6Tm9kZVR5cGUgTlQpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoTlQgPj4gMykgPCBhcnJheV9sZW5ndGhvZihUYXJnZXREQUdDb21iaW5lQXJyYXkpKTsKKyAgICByZXR1cm4gVGFyZ2V0REFHQ29tYmluZUFycmF5W05UID4+IDNdICYgKDEgPDwgKE5UJjcpKTsKKyAgfQorCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0b3JlIG9wZXJhdGlvbnMgcGVybWl0dGVkCisgIC8vLyB0byByZXBsYWNlIGEgY2FsbCB0byBsbHZtLm1lbXNldC4gVGhlIHZhbHVlIGlzIHNldCBieSB0aGUgdGFyZ2V0IGF0IHRoZQorICAvLy8gcGVyZm9ybWFuY2UgdGhyZXNob2xkIGZvciBzdWNoIGEgcmVwbGFjZW1lbnQuCisgIC8vLyBAYnJpZWYgR2V0IG1heGltdW0gIyBvZiBzdG9yZSBvcGVyYXRpb25zIHBlcm1pdHRlZCBmb3IgbGx2bS5tZW1zZXQKKyAgdW5zaWduZWQgZ2V0TWF4U3RvcmVzUGVyTWVtc2V0KCkgY29uc3QgeyByZXR1cm4gbWF4U3RvcmVzUGVyTWVtc2V0OyB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RvcmUgb3BlcmF0aW9ucyBwZXJtaXR0ZWQKKyAgLy8vIHRvIHJlcGxhY2UgYSBjYWxsIHRvIGxsdm0ubWVtY3B5LiBUaGUgdmFsdWUgaXMgc2V0IGJ5IHRoZSB0YXJnZXQgYXQgdGhlCisgIC8vLyBwZXJmb3JtYW5jZSB0aHJlc2hvbGQgZm9yIHN1Y2ggYSByZXBsYWNlbWVudC4KKyAgLy8vIEBicmllZiBHZXQgbWF4aW11bSAjIG9mIHN0b3JlIG9wZXJhdGlvbnMgcGVybWl0dGVkIGZvciBsbHZtLm1lbWNweQorICB1bnNpZ25lZCBnZXRNYXhTdG9yZXNQZXJNZW1jcHkoKSBjb25zdCB7IHJldHVybiBtYXhTdG9yZXNQZXJNZW1jcHk7IH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdG9yZSBvcGVyYXRpb25zIHBlcm1pdHRlZAorICAvLy8gdG8gcmVwbGFjZSBhIGNhbGwgdG8gbGx2bS5tZW1tb3ZlLiBUaGUgdmFsdWUgaXMgc2V0IGJ5IHRoZSB0YXJnZXQgYXQgdGhlCisgIC8vLyBwZXJmb3JtYW5jZSB0aHJlc2hvbGQgZm9yIHN1Y2ggYSByZXBsYWNlbWVudC4KKyAgLy8vIEBicmllZiBHZXQgbWF4aW11bSAjIG9mIHN0b3JlIG9wZXJhdGlvbnMgcGVybWl0dGVkIGZvciBsbHZtLm1lbW1vdmUKKyAgdW5zaWduZWQgZ2V0TWF4U3RvcmVzUGVyTWVtbW92ZSgpIGNvbnN0IHsgcmV0dXJuIG1heFN0b3Jlc1Blck1lbW1vdmU7IH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBhbGxvd3MgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Nlcy4KKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4gVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgaW4gc2l0dWF0aW9ucyB3aGVyZSBhbgorICAvLy8gYXJyYXkgY29weS9tb3ZlL3NldCBpcyAgY29udmVydGVkIHRvIGEgc2VxdWVuY2Ugb2Ygc3RvcmUgb3BlcmF0aW9ucy4gSXQncworICAvLy8gdXNlIGhlbHBzIHRvIGVuc3VyZSB0aGF0IHN1Y2ggcmVwbGFjZW1lbnRzIGRvbid0IGdlbmVyYXRlIGNvZGUgdGhhdCBjYXVzZXMKKyAgLy8vIGFuIGFsaWdubWVudCBlcnJvciAgKHRyYXApIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLgorICB2aXJ0dWFsIGJvb2wgYWxsb3dzVW5hbGlnbmVkTWVtb3J5QWNjZXNzZXMoRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgd291bGQgYmVuZWZpdCBmcm9tIGNvZGUgcGxhY2VtZW50CisgIC8vLyBvcHRpbWl6YXRpb24uCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSB0YXJnZXQgc2hvdWxkIHBlcmZvcm0gY29kZSBwbGFjZW1lbnQgb3B0aW1pemF0aW9uLgorICBib29sIHNob3VsZE9wdGltaXplQ29kZVBsYWNlbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYmVuZWZpdEZyb21Db2RlUGxhY2VtZW50T3B0OworICB9CisKKyAgLy8vIGdldE9wdGltYWxNZW1PcFR5cGUgLSBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlY2lmaWMgb3B0aW1hbCB0eXBlIGZvciBsb2FkCisgIC8vLyBhbmQgc3RvcmUgb3BlcmF0aW9ucyBhcyBhIHJlc3VsdCBvZiBtZW1zZXQsIG1lbWNweSwgYW5kIG1lbW1vdmUKKyAgLy8vIGxvd2VyaW5nLiBJZiBEc3RBbGlnbiBpcyB6ZXJvIHRoYXQgbWVhbnMgaXQncyBzYWZlIHRvIGRlc3RpbmF0aW9uCisgIC8vLyBhbGlnbm1lbnQgY2FuIHNhdGlzZnkgYW55IGNvbnN0cmFpbnQuIFNpbWlsYXJseSBpZiBTcmNBbGlnbiBpcyB6ZXJvIGl0CisgIC8vLyBtZWFucyB0aGVyZSBpc24ndCBhIG5lZWQgdG8gY2hlY2sgaXQgYWdhaW5zdCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQsCisgIC8vLyBwcm9iYWJseSBiZWNhdXNlIHRoZSBzb3VyY2UgZG9lcyBub3QgbmVlZCB0byBiZSBsb2FkZWQuIElmCisgIC8vLyAnTm9uU2NhbGFySW50U2FmZScgaXMgdHJ1ZSwgdGhhdCBtZWFucyBpdCdzIHNhZmUgdG8gcmV0dXJuIGEKKyAgLy8vIG5vbi1zY2FsYXItaW50ZWdlciB0eXBlLCBlLmcuIGVtcHR5IHN0cmluZyBzb3VyY2UsIGNvbnN0YW50LCBvciBsb2FkZWQKKyAgLy8vIGZyb20gbWVtb3J5LiAnTWVtY3B5U3RyU3JjJyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVtY3B5IHNvdXJjZSBpcworICAvLy8gY29uc3RhbnQgc28gaXQgZG9lcyBub3QgbmVlZCB0byBiZSBsb2FkZWQuCisgIC8vLyBJdCByZXR1cm5zIEVWVDo6T3RoZXIgaWYgdGhlIHR5cGUgc2hvdWxkIGJlIGRldGVybWluZWQgdXNpbmcgZ2VuZXJpYworICAvLy8gdGFyZ2V0LWluZGVwZW5kZW50IGxvZ2ljLgorICB2aXJ0dWFsIEVWVCBnZXRPcHRpbWFsTWVtT3BUeXBlKHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRHN0QWxpZ24sIHVuc2lnbmVkIFNyY0FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9uU2NhbGFySW50U2FmZSwgYm9vbCBNZW1jcHlTdHJTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiBNVlQ6Ok90aGVyOworICB9CisKKyAgLy8vIHVzZXNVbmRlcnNjb3JlU2V0Sm1wIC0gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCB1c2UgX3NldGptcCBvciBzZXRqbXAKKyAgLy8vIHRvIGltcGxlbWVudCBsbHZtLnNldGptcC4KKyAgYm9vbCB1c2VzVW5kZXJzY29yZVNldEptcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlVW5kZXJzY29yZVNldEptcDsKKyAgfQorCisgIC8vLyB1c2VzVW5kZXJzY29yZUxvbmdKbXAgLSBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHVzZSBfbG9uZ2ptcCBvciBsb25nam1wCisgIC8vLyB0byBpbXBsZW1lbnQgbGx2bS5sb25nam1wLgorICBib29sIHVzZXNVbmRlcnNjb3JlTG9uZ0ptcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlVW5kZXJzY29yZUxvbmdKbXA7CisgIH0KKworICAvLy8gZ2V0U3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlIC0gSWYgYSBwaHlzaWNhbCByZWdpc3RlciwgdGhpcworICAvLy8gc3BlY2lmaWVzIHRoZSByZWdpc3RlciB0aGF0IGxsdm0uc2F2ZXN0YWNrL2xsdm0ucmVzdG9yZXN0YWNrIHNob3VsZCBzYXZlCisgIC8vLyBhbmQgcmVzdG9yZS4KKyAgdW5zaWduZWQgZ2V0U3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlKCkgY29uc3QgeworICAgIHJldHVybiBTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmU7CisgIH0KKworICAvLy8gZ2V0SnVtcEJ1ZlNpemUgLSByZXR1cm5zIHRoZSB0YXJnZXQncyBqbXBfYnVmIHNpemUgaW4gYnl0ZXMgKGlmIG5ldmVyCisgIC8vLyBzZXQsIHRoZSBkZWZhdWx0IGlzIDIwMCkKKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZlNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIEp1bXBCdWZTaXplOworICB9CisKKyAgLy8vIGdldEp1bXBCdWZBbGlnbm1lbnQgLSByZXR1cm5zIHRoZSB0YXJnZXQncyBqbXBfYnVmIGFsaWdubWVudCBpbiBieXRlcworICAvLy8gKGlmIG5ldmVyIHNldCwgdGhlIGRlZmF1bHQgaXMgMCkKKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZkFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSnVtcEJ1ZkFsaWdubWVudDsKKyAgfQorCisgIC8vLyBnZXRNaW5TdGFja0FyZ3VtZW50QWxpZ25tZW50IC0gcmV0dXJuIHRoZSBtaW5pbXVtIHN0YWNrIGFsaWdubWVudCBvZiBhbgorICAvLy8gYXJndW1lbnQuCisgIHVuc2lnbmVkIGdldE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQ7CisgIH0KKworICAvLy8gZ2V0UHJlZkxvb3BBbGlnbm1lbnQgLSByZXR1cm4gdGhlIHByZWZlcnJlZCBsb29wIGFsaWdubWVudC4KKyAgLy8vCisgIHVuc2lnbmVkIGdldFByZWZMb29wQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBQcmVmTG9vcEFsaWdubWVudDsKKyAgfQorCisgIC8vLyBnZXRTaG91bGRGb2xkQXRvbWljRmVuY2VzIC0gcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWJpbmVyIHNob3VsZCBmb2xkCisgIC8vLyBmZW5jZSBNRU1CQVJSSUVSIGluc3RydWN0aW9ucyBpbnRvIHRoZSBhdG9taWMgaW50cmluc2ljIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIGJvb2wgZ2V0U2hvdWxkRm9sZEF0b21pY0ZlbmNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gU2hvdWxkRm9sZEF0b21pY0ZlbmNlczsKKyAgfQorCisgIC8vLyBnZXRQcmVJbmRleGVkQWRkcmVzc1BhcnRzIC0gcmV0dXJucyB0cnVlIGJ5IHZhbHVlLCBiYXNlIHBvaW50ZXIgYW5kCisgIC8vLyBvZmZzZXQgcG9pbnRlciBhbmQgYWRkcmVzc2luZyBtb2RlIGJ5IHJlZmVyZW5jZSBpZiB0aGUgbm9kZSdzIGFkZHJlc3MKKyAgLy8vIGNhbiBiZSBsZWdhbGx5IHJlcHJlc2VudGVkIGFzIHByZS1pbmRleGVkIGxvYWQgLyBzdG9yZSBhZGRyZXNzLgorICB2aXJ0dWFsIGJvb2wgZ2V0UHJlSW5kZXhlZEFkZHJlc3NQYXJ0cyhTRE5vZGUgKk4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpNZW1JbmRleGVkTW9kZSAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGdldFBvc3RJbmRleGVkQWRkcmVzc1BhcnRzIC0gcmV0dXJucyB0cnVlIGJ5IHZhbHVlLCBiYXNlIHBvaW50ZXIgYW5kCisgIC8vLyBvZmZzZXQgcG9pbnRlciBhbmQgYWRkcmVzc2luZyBtb2RlIGJ5IHJlZmVyZW5jZSBpZiB0aGlzIG5vZGUgY2FuIGJlCisgIC8vLyBjb21iaW5lZCB3aXRoIGEgbG9hZCAvIHN0b3JlIHRvIGZvcm0gYSBwb3N0LWluZGV4ZWQgbG9hZCAvIHN0b3JlLgorICB2aXJ0dWFsIGJvb2wgZ2V0UG9zdEluZGV4ZWRBZGRyZXNzUGFydHMoU0ROb2RlICpOLCBTRE5vZGUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpNZW1JbmRleGVkTW9kZSAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBnZXRKdW1wVGFibGVFbmNvZGluZyAtIFJldHVybiB0aGUgZW50cnkgZW5jb2RpbmcgZm9yIGEganVtcCB0YWJsZSBpbiB0aGUKKyAgLy8vIGN1cnJlbnQgZnVuY3Rpb24uICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBtZW1iZXIgb2YgdGhlCisgIC8vLyBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6SlRFbnRyeUtpbmQgZW51bS4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRKdW1wVGFibGVFbmNvZGluZygpIGNvbnN0OworCisgIHZpcnR1YWwgY29uc3QgTUNFeHByICoKKyAgTG93ZXJDdXN0b21KdW1wVGFibGVFbnRyeShjb25zdCBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqTUpUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCB1bnNpZ25lZCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoMCAmJiAiTmVlZCB0byBpbXBsZW1lbnQgdGhpcyBob29rIGlmIHRhcmdldCBoYXMgY3VzdG9tIEpUSXMiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXRQSUNKdW1wVGFibGVSZWxvY2FCYXNlIC0gUmV0dXJucyByZWxvY2F0aW9uIGJhc2UgZm9yIHRoZSBnaXZlbiBQSUMKKyAgLy8vIGp1bXB0YWJsZS4KKyAgdmlydHVhbCBTRFZhbHVlIGdldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZShTRFZhbHVlIFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLy8gZ2V0UElDSnVtcFRhYmxlUmVsb2NCYXNlRXhwciAtIFRoaXMgcmV0dXJucyB0aGUgcmVsb2NhdGlvbiBiYXNlIGZvciB0aGUKKyAgLy8vIGdpdmVuIFBJQyBqdW1wdGFibGUsIHRoZSBzYW1lIGFzIGdldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZSwgYnV0IGFzIGFuCisgIC8vLyBNQ0V4cHIuCisgIHZpcnR1YWwgY29uc3QgTUNFeHByICoKKyAgZ2V0UElDSnVtcFRhYmxlUmVsb2NCYXNlRXhwcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEpUSSwgTUNDb250ZXh0ICZDdHgpIGNvbnN0OworCisgIC8vLyBpc09mZnNldEZvbGRpbmdMZWdhbCAtIFJldHVybiB0cnVlIGlmIGZvbGRpbmcgYSBjb25zdGFudCBvZmZzZXQKKyAgLy8vIHdpdGggdGhlIGdpdmVuIEdsb2JhbEFkZHJlc3MgaXMgbGVnYWwuICBJdCBpcyBmcmVxdWVudGx5IG5vdCBsZWdhbCBpbgorICAvLy8gUElDIHJlbG9jYXRpb24gbW9kZWxzLgorICB2aXJ0dWFsIGJvb2wgaXNPZmZzZXRGb2xkaW5nTGVnYWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EpIGNvbnN0OworCisgIC8vLyBnZXRGdW5jdGlvbkFsaWdubWVudCAtIFJldHVybiB0aGUgTG9nMiBhbGlnbm1lbnQgb2YgdGhpcyBmdW5jdGlvbi4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRGdW5jdGlvbkFsaWdubWVudChjb25zdCBGdW5jdGlvbiAqKSBjb25zdCA9IDA7CisKKyAgLy8vIGdldFN0YWNrQ29va2llTG9jYXRpb24gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHN0b3JlcyBzdGFjaworICAvLy8gcHJvdGVjdG9yIGNvb2tpZXMgYXQgYSBmaXhlZCBvZmZzZXQgaW4gc29tZSBub24tc3RhbmRhcmQgYWRkcmVzcworICAvLy8gc3BhY2UsIGFuZCBwb3B1bGF0ZXMgdGhlIGFkZHJlc3Mgc3BhY2UgYW5kIG9mZnNldCBhcworICAvLy8gYXBwcm9wcmlhdGUuCisgIHZpcnR1YWwgYm9vbCBnZXRTdGFja0Nvb2tpZUxvY2F0aW9uKHVuc2lnbmVkICZBZGRyZXNzU3BhY2UsIHVuc2lnbmVkICZPZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gZ2V0TWF4aW1hbEdsb2JhbE9mZnNldCAtIFJldHVybnMgdGhlIG1heGltYWwgcG9zc2libGUgb2Zmc2V0IHdoaWNoIGNhbiBiZQorICAvLy8gdXNlZCBmb3IgbG9hZHMgLyBzdG9yZXMgZnJvbSB0aGUgZ2xvYmFsLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1heGltYWxHbG9iYWxPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVGFyZ2V0TG93ZXJpbmcgT3B0aW1pemF0aW9uIE1ldGhvZHMKKyAgLy8KKworICAvLy8gVGFyZ2V0TG93ZXJpbmdPcHQgLSBBIGNvbnZlbmllbmNlIHN0cnVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhIERBRywgYW5kIHR3bworICAvLy8gU0RWYWx1ZXMgZm9yIHJldHVybmluZyBpbmZvcm1hdGlvbiBmcm9tIFRhcmdldExvd2VyaW5nIHRvIGl0cyBjbGllbnRzCisgIC8vLyB0aGF0IHdhbnQgdG8gY29tYmluZQorICBzdHJ1Y3QgVGFyZ2V0TG93ZXJpbmdPcHQgeworICAgIFNlbGVjdGlvbkRBRyAmREFHOworICAgIGJvb2wgTGVnYWxUeXM7CisgICAgYm9vbCBMZWdhbE9wczsKKyAgICBTRFZhbHVlIE9sZDsKKyAgICBTRFZhbHVlIE5ldzsKKworICAgIGV4cGxpY2l0IFRhcmdldExvd2VyaW5nT3B0KFNlbGVjdGlvbkRBRyAmSW5EQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMVCwgYm9vbCBMTykgOgorICAgICAgREFHKEluREFHKSwgTGVnYWxUeXMoTFQpLCBMZWdhbE9wcyhMTykge30KKworICAgIGJvb2wgTGVnYWxUeXBlcygpIGNvbnN0IHsgcmV0dXJuIExlZ2FsVHlzOyB9CisgICAgYm9vbCBMZWdhbE9wZXJhdGlvbnMoKSBjb25zdCB7IHJldHVybiBMZWdhbE9wczsgfQorCisgICAgYm9vbCBDb21iaW5lVG8oU0RWYWx1ZSBPLCBTRFZhbHVlIE4pIHsKKyAgICAgIE9sZCA9IE87CisgICAgICBOZXcgPSBOOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8vIFNocmlua0RlbWFuZGVkQ29uc3RhbnQgLSBDaGVjayB0byBzZWUgaWYgdGhlIHNwZWNpZmllZCBvcGVyYW5kIG9mIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgYSBjb25zdGFudCBpbnRlZ2VyLiAgSWYgc28sIGNoZWNrIHRvIHNlZSBpZgorICAgIC8vLyB0aGVyZSBhcmUgYW55IGJpdHMgc2V0IGluIHRoZSBjb25zdGFudCB0aGF0IGFyZSBub3QgZGVtYW5kZWQuICBJZiBzbywKKyAgICAvLy8gc2hyaW5rIHRoZSBjb25zdGFudCBhbmQgcmV0dXJuIHRydWUuCisgICAgYm9vbCBTaHJpbmtEZW1hbmRlZENvbnN0YW50KFNEVmFsdWUgT3AsIGNvbnN0IEFQSW50ICZEZW1hbmRlZCk7CisKKyAgICAvLy8gU2hyaW5rRGVtYW5kZWRPcCAtIENvbnZlcnQgeCt5IHRvIChWVCkoKFNtYWxsVlQpeCsoU21hbGxWVCl5KSBpZiB0aGUKKyAgICAvLy8gY2FzdHMgYXJlIGZyZWUuICBUaGlzIHVzZXMgaXNaRXh0RnJlZSBhbmQgWkVST19FWFRFTkQgZm9yIHRoZSB3aWRlbmluZworICAgIC8vLyBjYXN0LCBidXQgaXQgY291bGQgYmUgZ2VuZXJhbGl6ZWQgZm9yIHRhcmdldHMgd2l0aCBvdGhlciB0eXBlcyBvZgorICAgIC8vLyBpbXBsaWNpdCB3aWRlbmluZyBjYXN0cy4KKyAgICBib29sIFNocmlua0RlbWFuZGVkT3AoU0RWYWx1ZSBPcCwgdW5zaWduZWQgQml0V2lkdGgsIGNvbnN0IEFQSW50ICZEZW1hbmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpOworICB9OworCisgIC8vLyBTaW1wbGlmeURlbWFuZGVkQml0cyAtIExvb2sgYXQgT3AuICBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHRoYXQgb25seSB0aGUKKyAgLy8vIERlbWFuZGVkTWFzayBiaXRzIG9mIHRoZSByZXN1bHQgb2YgT3AgYXJlIGV2ZXIgdXNlZCBkb3duc3RyZWFtLiAgSWYgd2UgY2FuCisgIC8vLyB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBzaW1wbGlmeSBPcCwgY3JlYXRlIGEgbmV3IHNpbXBsaWZpZWQgREFHIG5vZGUgYW5kCisgIC8vLyByZXR1cm4gdHJ1ZSwgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbCBhbmQgbmV3IG5vZGVzIGluIE9sZCBhbmQgTmV3LgorICAvLy8gT3RoZXJ3aXNlLCBhbmFseXplIHRoZSBleHByZXNzaW9uIGFuZCByZXR1cm4gYSBtYXNrIG9mIEtub3duT25lIGFuZAorICAvLy8gS25vd25aZXJvIGJpdHMgZm9yIHRoZSBleHByZXNzaW9uICh1c2VkIHRvIHNpbXBsaWZ5IHRoZSBjYWxsZXIpLgorICAvLy8gVGhlIEtub3duWmVyby9PbmUgYml0cyBtYXkgb25seSBiZSBhY2N1cmF0ZSBmb3IgdGhvc2UgYml0cyBpbiB0aGUKKyAgLy8vIERlbWFuZGVkTWFzay4KKyAgYm9vbCBTaW1wbGlmeURlbWFuZGVkQml0cyhTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmRGVtYW5kZWRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sIEFQSW50ICZLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZ09wdCAmVExPLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBjb21wdXRlTWFza2VkQml0c0ZvclRhcmdldE5vZGUgLSBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGJpdHMgc3BlY2lmaWVkIGluCisgIC8vLyBNYXNrIGFyZSBrbm93biB0byBiZSBlaXRoZXIgemVybyBvciBvbmUgYW5kIHJldHVybiB0aGVtIGluIHRoZQorICAvLy8gS25vd25aZXJvL0tub3duT25lIGJpdHNldHMuCisgIHZpcnR1YWwgdm9pZCBjb21wdXRlTWFza2VkQml0c0ZvclRhcmdldE5vZGUoY29uc3QgU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25aZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBDb21wdXRlTnVtU2lnbkJpdHNGb3JUYXJnZXROb2RlIC0gVGhpcyBtZXRob2QgY2FuIGJlIGltcGxlbWVudGVkIGJ5CisgIC8vLyB0YXJnZXRzIHRoYXQgd2FudCB0byBleHBvc2UgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBzaWduIGJpdHMgdG8gdGhlCisgIC8vLyBEQUcgQ29tYmluZXIuCisgIHZpcnR1YWwgdW5zaWduZWQgQ29tcHV0ZU51bVNpZ25CaXRzRm9yVGFyZ2V0Tm9kZShTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICBzdHJ1Y3QgREFHQ29tYmluZXJJbmZvIHsKKyAgICB2b2lkICpEQzsgIC8vIFRoZSBEQUcgQ29tYmluZXIgb2JqZWN0LgorICAgIGJvb2wgQmVmb3JlTGVnYWxpemU7CisgICAgYm9vbCBCZWZvcmVMZWdhbGl6ZU9wczsKKyAgICBib29sIENhbGxlZEJ5TGVnYWxpemVyOworICBwdWJsaWM6CisgICAgU2VsZWN0aW9uREFHICZEQUc7CisKKyAgICBEQUdDb21iaW5lckluZm8oU2VsZWN0aW9uREFHICZkYWcsIGJvb2wgYmwsIGJvb2wgYmxvLCBib29sIGNsLCB2b2lkICpkYykKKyAgICAgIDogREMoZGMpLCBCZWZvcmVMZWdhbGl6ZShibCksIEJlZm9yZUxlZ2FsaXplT3BzKGJsbyksCisgICAgICAgIENhbGxlZEJ5TGVnYWxpemVyKGNsKSwgREFHKGRhZykge30KKworICAgIGJvb2wgaXNCZWZvcmVMZWdhbGl6ZSgpIGNvbnN0IHsgcmV0dXJuIEJlZm9yZUxlZ2FsaXplOyB9CisgICAgYm9vbCBpc0JlZm9yZUxlZ2FsaXplT3BzKCkgY29uc3QgeyByZXR1cm4gQmVmb3JlTGVnYWxpemVPcHM7IH0KKyAgICBib29sIGlzQ2FsbGVkQnlMZWdhbGl6ZXIoKSBjb25zdCB7IHJldHVybiBDYWxsZWRCeUxlZ2FsaXplcjsgfQorCisgICAgdm9pZCBBZGRUb1dvcmtsaXN0KFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSBDb21iaW5lVG8oU0ROb2RlICpOLCBjb25zdCBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmVG8sCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRUbyA9IHRydWUpOworICAgIFNEVmFsdWUgQ29tYmluZVRvKFNETm9kZSAqTiwgU0RWYWx1ZSBSZXMsIGJvb2wgQWRkVG8gPSB0cnVlKTsKKyAgICBTRFZhbHVlIENvbWJpbmVUbyhTRE5vZGUgKk4sIFNEVmFsdWUgUmVzMCwgU0RWYWx1ZSBSZXMxLCBib29sIEFkZFRvID0gdHJ1ZSk7CisKKyAgICB2b2lkIENvbW1pdFRhcmdldExvd2VyaW5nT3B0KGNvbnN0IFRhcmdldExvd2VyaW5nT3B0ICZUTE8pOworICB9OworCisgIC8vLyBTaW1wbGlmeVNldENDIC0gVHJ5IHRvIHNpbXBsaWZ5IGEgc2V0Y2MgYnVpbHQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzCisgIC8vLyBhbmQgY2MuIElmIGl0IGlzIHVuYWJsZSB0byBzaW1wbGlmeSBpdCwgcmV0dXJuIGEgbnVsbCBTRFZhbHVlLgorICBTRFZhbHVlIFNpbXBsaWZ5U2V0Q0MoRVZUIFZULCBTRFZhbHVlIE4wLCBTRFZhbHVlIE4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkNvbmRDb2RlIENvbmQsIGJvb2wgZm9sZEJvb2xlYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUdDb21iaW5lckluZm8gJkRDSSwgRGVidWdMb2MgZGwpIGNvbnN0OworCisgIC8vLyBpc0dBUGx1c09mZnNldCAtIFJldHVybnMgdHJ1ZSAoYW5kIHRoZSBHbG9iYWxWYWx1ZSBhbmQgdGhlIG9mZnNldCkgaWYgdGhlCisgIC8vLyBub2RlIGlzIGEgR2xvYmFsQWRkcmVzcyArIG9mZnNldC4KKyAgdmlydHVhbCBib29sCisgIGlzR0FQbHVzT2Zmc2V0KFNETm9kZSAqTiwgY29uc3QgR2xvYmFsVmFsdWUqICZHQSwgaW50NjRfdCAmT2Zmc2V0KSBjb25zdDsKKworICAvLy8gUGVyZm9ybURBR0NvbWJpbmUgLSBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgZm9yIGFsbCB0YXJnZXQgbm9kZXMgYW5kCisgIC8vLyBmb3IgYW55IHRhcmdldC1pbmRlcGVuZGVudCBub2RlcyB0aGF0IHRoZSB0YXJnZXQgaGFzIHJlZ2lzdGVyZWQgd2l0aAorICAvLy8gaW52b2tlIGl0IGZvci4KKyAgLy8vCisgIC8vLyBUaGUgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzOgorICAvLy8gUmV0dXJuIFZhbHVlOgorICAvLy8gICBTRFZhbHVlLlZhbCA9PSAwICAgLSBObyBjaGFuZ2Ugd2FzIG1hZGUKKyAgLy8vICAgU0RWYWx1ZS5WYWwgPT0gTiAgIC0gTiB3YXMgcmVwbGFjZWQsIGlzIGRlYWQsIGFuZCBpcyBhbHJlYWR5IGhhbmRsZWQuCisgIC8vLyAgIG90aGVyd2lzZSAgICAgICAgICAtIE4gc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSByZXR1cm5lZCBPcGVyYW5kLgorICAvLy8KKyAgLy8vIEluIGFkZGl0aW9uLCBtZXRob2RzIHByb3ZpZGVkIGJ5IERBR0NvbWJpbmVySW5mbyBtYXkgYmUgdXNlZCB0byBwZXJmb3JtCisgIC8vLyBtb3JlIGNvbXBsZXggdHJhbnNmb3JtYXRpb25zLgorICAvLy8KKyAgdmlydHVhbCBTRFZhbHVlIFBlcmZvcm1EQUdDb21iaW5lKFNETm9kZSAqTiwgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0OworCisgIC8vLyBpc1R5cGVEZXNpcmFibGVGb3JPcCAtIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaGFzIG5hdGl2ZSBzdXBwb3J0IGZvcgorICAvLy8gdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlIGFuZCBpdCBpcyAnZGVzaXJhYmxlJyB0byB1c2UgdGhlIHR5cGUgZm9yIHRoZQorICAvLy8gZ2l2ZW4gbm9kZSB0eXBlLiBlLmcuIE9uIHg4NiBpMTYgaXMgbGVnYWwsIGJ1dCB1bmRlc2lyYWJsZSBzaW5jZSBpMTYKKyAgLy8vIGluc3RydWN0aW9uIGVuY29kaW5ncyBhcmUgbG9uZ2VyIGFuZCBzb21lIGkxNiBpbnN0cnVjdGlvbnMgYXJlIHNsb3cuCisgIHZpcnR1YWwgYm9vbCBpc1R5cGVEZXNpcmFibGVGb3JPcCh1bnNpZ25lZCBPcGMsIEVWVCBWVCkgY29uc3QgeworICAgIC8vIEJ5IGRlZmF1bHQsIGFzc3VtZSBhbGwgbGVnYWwgdHlwZXMgYXJlIGRlc2lyYWJsZS4KKyAgICByZXR1cm4gaXNUeXBlTGVnYWwoVlQpOworICB9CisKKyAgLy8vIElzRGVzaXJhYmxlVG9Qcm9tb3RlT3AgLSBUaGlzIG1ldGhvZCBxdWVyeSB0aGUgdGFyZ2V0IHdoZXRoZXIgaXQgaXMKKyAgLy8vIGJlbmVmaWNpYWwgZm9yIGRhZyBjb21iaW5lciB0byBwcm9tb3RlIHRoZSBzcGVjaWZpZWQgbm9kZS4gSWYgdHJ1ZSwgaXQKKyAgLy8vIHNob3VsZCByZXR1cm4gdGhlIGRlc2lyZWQgcHJvbW90aW9uIHR5cGUgYnkgcmVmZXJlbmNlLgorICB2aXJ0dWFsIGJvb2wgSXNEZXNpcmFibGVUb1Byb21vdGVPcChTRFZhbHVlIE9wLCBFVlQgJlBWVCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUYXJnZXRMb3dlcmluZyBDb25maWd1cmF0aW9uIE1ldGhvZHMgLSBUaGVzZSBtZXRob2RzIHNob3VsZCBiZSBpbnZva2VkIGJ5CisgIC8vIHRoZSBkZXJpdmVkIGNsYXNzIGNvbnN0cnVjdG9yIHRvIGNvbmZpZ3VyZSB0aGlzIG9iamVjdCBmb3IgdGhlIHRhcmdldC4KKyAgLy8KKworcHJvdGVjdGVkOgorICAvLy8gc2V0U2hpZnRBbW91bnRUeXBlIC0gRGVzY3JpYmUgdGhlIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3Igc2hpZnQKKyAgLy8vIGFtb3VudHMuICBUaGlzIHR5cGUgZGVmYXVsdHMgdG8gdGhlIHBvaW50ZXIgdHlwZS4KKyAgdm9pZCBzZXRTaGlmdEFtb3VudFR5cGUoTVZUIFZUKSB7IFNoaWZ0QW1vdW50VHkgPSBWVDsgfQorCisgIC8vLyBzZXRCb29sZWFuQ29udGVudHMgLSBTcGVjaWZ5IGhvdyB0aGUgdGFyZ2V0IGV4dGVuZHMgdGhlIHJlc3VsdCBvZiBhCisgIC8vLyBib29sZWFuIHZhbHVlIGZyb20gaTEgdG8gYSB3aWRlciB0eXBlLiAgU2VlIGdldEJvb2xlYW5Db250ZW50cy4KKyAgdm9pZCBzZXRCb29sZWFuQ29udGVudHMoQm9vbGVhbkNvbnRlbnQgVHkpIHsgQm9vbGVhbkNvbnRlbnRzID0gVHk7IH0KKworICAvLy8gc2V0U2NoZWR1bGluZ1ByZWZlcmVuY2UgLSBTcGVjaWZ5IHRoZSB0YXJnZXQgc2NoZWR1bGluZyBwcmVmZXJlbmNlLgorICB2b2lkIHNldFNjaGVkdWxpbmdQcmVmZXJlbmNlKFNjaGVkOjpQcmVmZXJlbmNlIFByZWYpIHsKKyAgICBTY2hlZFByZWZlcmVuY2VJbmZvID0gUHJlZjsKKyAgfQorCisgIC8vLyBzZXRVc2VVbmRlcnNjb3JlU2V0Sm1wIC0gSW5kaWNhdGUgd2hldGhlciB0aGlzIHRhcmdldCBwcmVmZXJzIHRvCisgIC8vLyB1c2UgX3NldGptcCB0byBpbXBsZW1lbnQgbGx2bS5zZXRqbXAgb3IgdGhlIG5vbiBfIHZlcnNpb24uCisgIC8vLyBEZWZhdWx0cyB0byBmYWxzZS4KKyAgdm9pZCBzZXRVc2VVbmRlcnNjb3JlU2V0Sm1wKGJvb2wgVmFsKSB7CisgICAgVXNlVW5kZXJzY29yZVNldEptcCA9IFZhbDsKKyAgfQorCisgIC8vLyBzZXRVc2VVbmRlcnNjb3JlTG9uZ0ptcCAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyB0YXJnZXQgcHJlZmVycyB0bworICAvLy8gdXNlIF9sb25nam1wIHRvIGltcGxlbWVudCBsbHZtLmxvbmdqbXAgb3IgdGhlIG5vbiBfIHZlcnNpb24uCisgIC8vLyBEZWZhdWx0cyB0byBmYWxzZS4KKyAgdm9pZCBzZXRVc2VVbmRlcnNjb3JlTG9uZ0ptcChib29sIFZhbCkgeworICAgIFVzZVVuZGVyc2NvcmVMb25nSm1wID0gVmFsOworICB9CisKKyAgLy8vIHNldFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZSAtIElmIHNldCB0byBhIHBoeXNpY2FsIHJlZ2lzdGVyLCB0aGlzCisgIC8vLyBzcGVjaWZpZXMgdGhlIHJlZ2lzdGVyIHRoYXQgbGx2bS5zYXZlc3RhY2svbGx2bS5yZXN0b3Jlc3RhY2sgc2hvdWxkIHNhdmUKKyAgLy8vIGFuZCByZXN0b3JlLgorICB2b2lkIHNldFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZSh1bnNpZ25lZCBSKSB7CisgICAgU3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlID0gUjsKKyAgfQorCisgIC8vLyBTZWxlY3RJc0V4cGVuc2l2ZSAtIFRlbGxzIHRoZSBjb2RlIGdlbmVyYXRvciBub3QgdG8gZXhwYW5kIG9wZXJhdGlvbnMKKyAgLy8vIGludG8gc2VxdWVuY2VzIHRoYXQgdXNlIHRoZSBzZWxlY3Qgb3BlcmF0aW9ucyBpZiBwb3NzaWJsZS4KKyAgdm9pZCBzZXRTZWxlY3RJc0V4cGVuc2l2ZSgpIHsgU2VsZWN0SXNFeHBlbnNpdmUgPSB0cnVlOyB9CisKKyAgLy8vIHNldEludERpdklzQ2hlYXAgLSBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3IgdGhhdCBpbnRlZ2VyIGRpdmlkZSBpcworICAvLy8gZXhwZW5zaXZlLCBhbmQgaWYgcG9zc2libGUsIHNob3VsZCBiZSByZXBsYWNlZCBieSBhbiBhbHRlcm5hdGUgc2VxdWVuY2UKKyAgLy8vIG9mIGluc3RydWN0aW9ucyBub3QgY29udGFpbmluZyBhbiBpbnRlZ2VyIGRpdmlkZS4KKyAgdm9pZCBzZXRJbnREaXZJc0NoZWFwKGJvb2wgaXNDaGVhcCA9IHRydWUpIHsgSW50RGl2SXNDaGVhcCA9IGlzQ2hlYXA7IH0KKworICAvLy8gc2V0UG93MkRpdklzQ2hlYXAgLSBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3IgdGhhdCBpdCBzaG91bGRuJ3QgZ2VuZXJhdGUKKyAgLy8vIHNybC9hZGQvc3JhIGZvciBhIHNpZ25lZCBkaXZpZGUgYnkgcG93ZXIgb2YgdHdvLCBhbmQgbGV0IHRoZSB0YXJnZXQgaGFuZGxlCisgIC8vLyBpdC4KKyAgdm9pZCBzZXRQb3cyRGl2SXNDaGVhcChib29sIGlzQ2hlYXAgPSB0cnVlKSB7IFBvdzJEaXZJc0NoZWFwID0gaXNDaGVhcDsgfQorCisgIC8vLyBhZGRSZWdpc3RlckNsYXNzIC0gQWRkIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MgYXMgYW4gYXZhaWxhYmxlCisgIC8vLyByZWdjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlLiAgVGhpcyBpbmRpY2F0ZXMgdGhlIHNlbGVjdG9yIGNhbgorICAvLy8gaGFuZGxlIHZhbHVlcyBvZiB0aGF0IGNsYXNzIG5hdGl2ZWx5LgorICB2b2lkIGFkZFJlZ2lzdGVyQ2xhc3MoRVZUIFZULCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTeW50aGVzaXphYmxlID0gdHJ1ZSkgeworICAgIGFzc2VydCgodW5zaWduZWQpVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSA8IGFycmF5X2xlbmd0aG9mKFJlZ0NsYXNzRm9yVlQpKTsKKyAgICBBdmFpbGFibGVSZWdDbGFzc2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWVCwgUkMpKTsKKyAgICBSZWdDbGFzc0ZvclZUW1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldID0gUkM7CisgICAgU3ludGhlc2l6YWJsZVtWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5XSA9IGlzU3ludGhlc2l6YWJsZTsKKyAgfQorCisgIC8vLyBmaW5kUmVwcmVzZW50YXRpdmVDbGFzcyAtIFJldHVybiB0aGUgbGFyZ2VzdCBsZWdhbCBzdXBlci1yZWcgcmVnaXN0ZXIgY2xhc3MKKyAgLy8vIG9mIHRoZSByZWdpc3RlciBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBpdHMgYXNzb2NpYXRlZCAiY29zdCIuCisgIHZpcnR1YWwgc3RkOjpwYWlyPGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqLCB1aW50OF90PgorICBmaW5kUmVwcmVzZW50YXRpdmVDbGFzcyhFVlQgVlQpIGNvbnN0OworCisgIC8vLyBjb21wdXRlUmVnaXN0ZXJQcm9wZXJ0aWVzIC0gT25jZSBhbGwgb2YgdGhlIHJlZ2lzdGVyIGNsYXNzZXMgYXJlIGFkZGVkLAorICAvLy8gdGhpcyBhbGxvd3MgdXMgdG8gY29tcHV0ZSBkZXJpdmVkIHByb3BlcnRpZXMgd2UgZXhwb3NlLgorICB2b2lkIGNvbXB1dGVSZWdpc3RlclByb3BlcnRpZXMoKTsKKworICAvLy8gc2V0T3BlcmF0aW9uQWN0aW9uIC0gSW5kaWNhdGUgdGhhdCB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBkb2VzIG5vdCB3b3JrCisgIC8vLyB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgaW5kaWNhdGUgd2hhdCB0byBkbyBhYm91dCBpdC4KKyAgdm9pZCBzZXRPcGVyYXRpb25BY3Rpb24odW5zaWduZWQgT3AsIE1WVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KE9wIDwgYXJyYXlfbGVuZ3Rob2YoT3BBY3Rpb25zWzBdKSAmJiAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICBPcEFjdGlvbnNbKHVuc2lnbmVkKVZULlNpbXBsZVR5XVtPcF0gPSAodWludDhfdClBY3Rpb247CisgIH0KKworICAvLy8gc2V0TG9hZEV4dEFjdGlvbiAtIEluZGljYXRlIHRoYXQgdGhlIHNwZWNpZmllZCBsb2FkIHdpdGggZXh0ZW5zaW9uIGRvZXMKKyAgLy8vIG5vdCB3b3JrIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBpbmRpY2F0ZSB3aGF0IHRvIGRvIGFib3V0IGl0LgorICB2b2lkIHNldExvYWRFeHRBY3Rpb24odW5zaWduZWQgRXh0VHlwZSwgTVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KEV4dFR5cGUgPCBJU0Q6OkxBU1RfTE9BREVYVF9UWVBFICYmCisgICAgICAgICAgICh1bnNpZ25lZClWVC5TaW1wbGVUeSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgTG9hZEV4dEFjdGlvbnNbVlQuU2ltcGxlVHldW0V4dFR5cGVdID0gKHVpbnQ4X3QpQWN0aW9uOworICB9CisKKyAgLy8vIHNldFRydW5jU3RvcmVBY3Rpb24gLSBJbmRpY2F0ZSB0aGF0IHRoZSBzcGVjaWZpZWQgdHJ1bmNhdGluZyBzdG9yZSBkb2VzCisgIC8vLyBub3Qgd29yayB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgaW5kaWNhdGUgd2hhdCB0byBkbyBhYm91dCBpdC4KKyAgdm9pZCBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVCBWYWxWVCwgTVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KCh1bnNpZ25lZClWYWxWVC5TaW1wbGVUeSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgKHVuc2lnbmVkKU1lbVZULlNpbXBsZVR5IDwgTVZUOjpMQVNUX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICBUcnVuY1N0b3JlQWN0aW9uc1tWYWxWVC5TaW1wbGVUeV1bTWVtVlQuU2ltcGxlVHldID0gKHVpbnQ4X3QpQWN0aW9uOworICB9CisKKyAgLy8vIHNldEluZGV4ZWRMb2FkQWN0aW9uIC0gSW5kaWNhdGUgdGhhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZWQgbG9hZCBkb2VzIG9yCisgIC8vLyBkb2VzIG5vdCB3b3JrIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBpbmRpY2F0ZSB3aGF0IHRvIGRvIGFib3J0CisgIC8vLyBpdC4gTk9URTogQWxsIGluZGV4ZWQgbW9kZSBsb2FkcyBhcmUgaW5pdGlhbGl6ZWQgdG8gRXhwYW5kIGluCisgIC8vLyBUYXJnZXRMb3dlcmluZy5jcHAKKyAgdm9pZCBzZXRJbmRleGVkTG9hZEFjdGlvbih1bnNpZ25lZCBJZHhNb2RlLCBNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KCh1bnNpZ25lZClWVC5TaW1wbGVUeSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgSWR4TW9kZSA8IElTRDo6TEFTVF9JTkRFWEVEX01PREUgJiYKKyAgICAgICAgICAgKHVuc2lnbmVkKUFjdGlvbiA8IDB4ZiAmJgorICAgICAgICAgICAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICAvLyBMb2FkIGFjdGlvbiBhcmUga2VwdCBpbiB0aGUgdXBwZXIgaGFsZi4KKyAgICBJbmRleGVkTW9kZUFjdGlvbnNbKHVuc2lnbmVkKVZULlNpbXBsZVR5XVtJZHhNb2RlXSAmPSB+MHhmMDsKKyAgICBJbmRleGVkTW9kZUFjdGlvbnNbKHVuc2lnbmVkKVZULlNpbXBsZVR5XVtJZHhNb2RlXSB8PSAoKHVpbnQ4X3QpQWN0aW9uKSA8PDQ7CisgIH0KKworICAvLy8gc2V0SW5kZXhlZFN0b3JlQWN0aW9uIC0gSW5kaWNhdGUgdGhhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZWQgc3RvcmUgZG9lcyBvcgorICAvLy8gZG9lcyBub3Qgd29yayB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgaW5kaWNhdGUgd2hhdCB0byBkbyBhYm91dAorICAvLy8gaXQuIE5PVEU6IEFsbCBpbmRleGVkIG1vZGUgc3RvcmVzIGFyZSBpbml0aWFsaXplZCB0byBFeHBhbmQgaW4KKyAgLy8vIFRhcmdldExvd2VyaW5nLmNwcAorICB2b2lkIHNldEluZGV4ZWRTdG9yZUFjdGlvbih1bnNpZ25lZCBJZHhNb2RlLCBNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplQWN0aW9uIEFjdGlvbikgeworICAgIGFzc2VydCgodW5zaWduZWQpVlQuU2ltcGxlVHkgPCBNVlQ6OkxBU1RfVkFMVUVUWVBFICYmCisgICAgICAgICAgIElkeE1vZGUgPCBJU0Q6OkxBU1RfSU5ERVhFRF9NT0RFICYmCisgICAgICAgICAgICh1bnNpZ25lZClBY3Rpb24gPCAweGYgJiYKKyAgICAgICAgICAgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgLy8gU3RvcmUgYWN0aW9uIGFyZSBrZXB0IGluIHRoZSBsb3dlciBoYWxmLgorICAgIEluZGV4ZWRNb2RlQWN0aW9uc1sodW5zaWduZWQpVlQuU2ltcGxlVHldW0lkeE1vZGVdICY9IH4weDBmOworICAgIEluZGV4ZWRNb2RlQWN0aW9uc1sodW5zaWduZWQpVlQuU2ltcGxlVHldW0lkeE1vZGVdIHw9ICgodWludDhfdClBY3Rpb24pOworICB9CisKKyAgLy8vIHNldENvbmRDb2RlQWN0aW9uIC0gSW5kaWNhdGUgdGhhdCB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiBjb2RlIGlzIG9yIGlzbid0CisgIC8vLyBzdXBwb3J0ZWQgb24gdGhlIHRhcmdldCBhbmQgaW5kaWNhdGUgd2hhdCB0byBkbyBhYm91dCBpdC4KKyAgdm9pZCBzZXRDb25kQ29kZUFjdGlvbihJU0Q6OkNvbmRDb2RlIENDLCBNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KCh1bnNpZ25lZClWVC5TaW1wbGVUeSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgKHVuc2lnbmVkKUNDIDwgYXJyYXlfbGVuZ3Rob2YoQ29uZENvZGVBY3Rpb25zKSAmJgorICAgICAgICAgICAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICBDb25kQ29kZUFjdGlvbnNbKHVuc2lnbmVkKUNDXSAmPSB+KHVpbnQ2NF90KDNVTCkgIDw8IFZULlNpbXBsZVR5KjIpOworICAgIENvbmRDb2RlQWN0aW9uc1sodW5zaWduZWQpQ0NdIHw9ICh1aW50NjRfdClBY3Rpb24gPDwgVlQuU2ltcGxlVHkqMjsKKyAgfQorCisgIC8vLyBBZGRQcm9tb3RlZFRvVHlwZSAtIElmIE9wYy9PcmlnVlQgaXMgc3BlY2lmaWVkIGFzIGJlaW5nIHByb21vdGVkLCB0aGUKKyAgLy8vIHByb21vdGlvbiBjb2RlIGRlZmF1bHRzIHRvIHRyeWluZyBhIGxhcmdlciBpbnRlZ2VyL2ZwIHVudGlsIGl0IGNhbiBmaW5kCisgIC8vLyBvbmUgdGhhdCB3b3Jrcy4gIElmIHRoYXQgZGVmYXVsdCBpcyBpbnN1ZmZpY2llbnQsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkCisgIC8vLyBieSB0aGUgdGFyZ2V0IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0LgorICB2b2lkIEFkZFByb21vdGVkVG9UeXBlKHVuc2lnbmVkIE9wYywgTVZUIE9yaWdWVCwgTVZUIERlc3RWVCkgeworICAgIFByb21vdGVUb1R5cGVbc3RkOjptYWtlX3BhaXIoT3BjLCBPcmlnVlQuU2ltcGxlVHkpXSA9IERlc3RWVC5TaW1wbGVUeTsKKyAgfQorCisgIC8vLyBzZXRUYXJnZXREQUdDb21iaW5lIC0gVGFyZ2V0cyBzaG91bGQgaW52b2tlIHRoaXMgbWV0aG9kIGZvciBlYWNoIHRhcmdldAorICAvLy8gaW5kZXBlbmRlbnQgbm9kZSB0aGF0IHRoZXkgd2FudCB0byBwcm92aWRlIGEgY3VzdG9tIERBRyBjb21iaW5lciBmb3IgYnkKKyAgLy8vIGltcGxlbWVudGluZyB0aGUgUGVyZm9ybURBR0NvbWJpbmUgdmlydHVhbCBtZXRob2QuCisgIHZvaWQgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6Ok5vZGVUeXBlIE5UKSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE5UID4+IDMpIDwgYXJyYXlfbGVuZ3Rob2YoVGFyZ2V0REFHQ29tYmluZUFycmF5KSk7CisgICAgVGFyZ2V0REFHQ29tYmluZUFycmF5W05UID4+IDNdIHw9IDEgPDwgKE5UJjcpOworICB9CisKKyAgLy8vIHNldEp1bXBCdWZTaXplIC0gU2V0IHRoZSB0YXJnZXQncyByZXF1aXJlZCBqbXBfYnVmIGJ1ZmZlciBzaXplIChpbgorICAvLy8gYnl0ZXMpOyBkZWZhdWx0IGlzIDIwMAorICB2b2lkIHNldEp1bXBCdWZTaXplKHVuc2lnbmVkIFNpemUpIHsKKyAgICBKdW1wQnVmU2l6ZSA9IFNpemU7CisgIH0KKworICAvLy8gc2V0SnVtcEJ1ZkFsaWdubWVudCAtIFNldCB0aGUgdGFyZ2V0J3MgcmVxdWlyZWQgam1wX2J1ZiBidWZmZXIKKyAgLy8vIGFsaWdubWVudCAoaW4gYnl0ZXMpOyBkZWZhdWx0IGlzIDAKKyAgdm9pZCBzZXRKdW1wQnVmQWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgSnVtcEJ1ZkFsaWdubWVudCA9IEFsaWduOworICB9CisKKyAgLy8vIHNldFByZWZMb29wQWxpZ25tZW50IC0gU2V0IHRoZSB0YXJnZXQncyBwcmVmZXJyZWQgbG9vcCBhbGlnbm1lbnQuIERlZmF1bHQKKyAgLy8vIGFsaWdubWVudCBpcyB6ZXJvLCBpdCBtZWFucyB0aGUgdGFyZ2V0IGRvZXMgbm90IGNhcmUgYWJvdXQgbG9vcCBhbGlnbm1lbnQuCisgIHZvaWQgc2V0UHJlZkxvb3BBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pIHsKKyAgICBQcmVmTG9vcEFsaWdubWVudCA9IEFsaWduOworICB9CisKKyAgLy8vIHNldE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQgLSBTZXQgdGhlIG1pbmltdW0gc3RhY2sgYWxpZ25tZW50IG9mIGFuCisgIC8vLyBhcmd1bWVudC4KKyAgdm9pZCBzZXRNaW5TdGFja0FyZ3VtZW50QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgTWluU3RhY2tBcmd1bWVudEFsaWdubWVudCA9IEFsaWduOworICB9CisKKyAgLy8vIHNldFNob3VsZEZvbGRBdG9taWNGZW5jZXMgLSBTZXQgaWYgdGhlIHRhcmdldCdzIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICAvLy8gYXRvbWljIG9wZXJhdGlvbiBpbnRyaW5zaWNzIGluY2x1ZGVzIGxvY2tpbmcuIERlZmF1bHQgaXMgZmFsc2UuCisgIHZvaWQgc2V0U2hvdWxkRm9sZEF0b21pY0ZlbmNlcyhib29sIGZvbGQpIHsKKyAgICBTaG91bGRGb2xkQXRvbWljRmVuY2VzID0gZm9sZDsKKyAgfQorCitwdWJsaWM6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBMb3dlcmluZyBtZXRob2RzIC0gVGhlc2UgbWV0aG9kcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgc28gdGhhdAorICAvLyB0aGUgU2VsZWN0aW9uREFHTG93ZXJpbmcgY29kZSBrbm93cyBob3cgdG8gbG93ZXIgdGhlc2UuCisgIC8vCisKKyAgLy8vIExvd2VyRm9ybWFsQXJndW1lbnRzIC0gVGhpcyBob29rIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gbG93ZXIgdGhlCisgIC8vLyBpbmNvbWluZyAoZm9ybWFsKSBhcmd1bWVudHMsIGRlc2NyaWJlZCBieSB0aGUgSW5zIGFycmF5LCBpbnRvIHRoZQorICAvLy8gc3BlY2lmaWVkIERBRy4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBmaWxsIGluIHRoZSBJblZhbHMgYXJyYXkKKyAgLy8vIHdpdGggbGVnYWwtdHlwZSBhcmd1bWVudCB2YWx1ZXMsIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyB0b2tlbgorICAvLy8gY2hhaW4gdmFsdWUuCisgIC8vLworICB2aXJ0dWFsIFNEVmFsdWUKKyAgICBMb3dlckZvcm1hbEFyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgICBhc3NlcnQoMCAmJiAiTm90IEltcGxlbWVudGVkIik7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsgICAgLy8gdGhpcyBpcyBoZXJlIHRvIHNpbGVuY2UgY29tcGlsZXIgZXJyb3JzCisgIH0KKworICAvLy8gTG93ZXJDYWxsVG8gLSBUaGlzIGZ1bmN0aW9uIGxvd2VycyBhbiBhYnN0cmFjdCBjYWxsIHRvIGEgZnVuY3Rpb24gaW50byBhbgorICAvLy8gYWN0dWFsIGNhbGwuICBUaGlzIHJldHVybnMgYSBwYWlyIG9mIG9wZXJhbmRzLiAgVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlCisgIC8vLyByZXR1cm4gdmFsdWUgZm9yIHRoZSBmdW5jdGlvbiAoaWYgUmV0VHkgaXMgbm90IFZvaWRUeSkuICBUaGUgc2Vjb25kCisgIC8vLyBlbGVtZW50IGlzIHRoZSBvdXRnb2luZyB0b2tlbiBjaGFpbi4gSXQgY2FsbHMgTG93ZXJDYWxsIHRvIGRvIHRoZSBhY3R1YWwKKyAgLy8vIGxvd2VyaW5nLgorICBzdHJ1Y3QgQXJnTGlzdEVudHJ5IHsKKyAgICBTRFZhbHVlIE5vZGU7CisgICAgY29uc3QgVHlwZSogVHk7CisgICAgYm9vbCBpc1NFeHQgIDogMTsKKyAgICBib29sIGlzWkV4dCAgOiAxOworICAgIGJvb2wgaXNJblJlZyA6IDE7CisgICAgYm9vbCBpc1NSZXQgIDogMTsKKyAgICBib29sIGlzTmVzdCAgOiAxOworICAgIGJvb2wgaXNCeVZhbCA6IDE7CisgICAgdWludDE2X3QgQWxpZ25tZW50OworCisgICAgQXJnTGlzdEVudHJ5KCkgOiBpc1NFeHQoZmFsc2UpLCBpc1pFeHQoZmFsc2UpLCBpc0luUmVnKGZhbHNlKSwKKyAgICAgIGlzU1JldChmYWxzZSksIGlzTmVzdChmYWxzZSksIGlzQnlWYWwoZmFsc2UpLCBBbGlnbm1lbnQoMCkgeyB9CisgIH07CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QXJnTGlzdEVudHJ5PiBBcmdMaXN0VHk7CisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPgorICBMb3dlckNhbGxUbyhTRFZhbHVlIENoYWluLCBjb25zdCBUeXBlICpSZXRUeSwgYm9vbCBSZXRTRXh0LCBib29sIFJldFpFeHQsCisgICAgICAgICAgICAgIGJvb2wgaXNWYXJBcmcsIGJvb2wgaXNJbnJlZywgdW5zaWduZWQgTnVtRml4ZWRBcmdzLAorICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgYm9vbCBpc1JldHVyblZhbHVlVXNlZCwgU0RWYWx1ZSBDYWxsZWUsIEFyZ0xpc3RUeSAmQXJncywKKyAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsKSBjb25zdDsKKworICAvLy8gTG93ZXJDYWxsIC0gVGhpcyBob29rIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gbG93ZXIgY2FsbHMgaW50byB0aGUKKyAgLy8vIHRoZSBzcGVjaWZpZWQgREFHLiBUaGUgb3V0Z29pbmcgYXJndW1lbnRzIHRvIHRoZSBjYWxsIGFyZSBkZXNjcmliZWQKKyAgLy8vIGJ5IHRoZSBPdXRzIGFycmF5LCBhbmQgdGhlIHZhbHVlcyB0byBiZSByZXR1cm5lZCBieSB0aGUgY2FsbCBhcmUKKyAgLy8vIGRlc2NyaWJlZCBieSB0aGUgSW5zIGFycmF5LiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGZpbGwgaW4gdGhlCisgIC8vLyBJblZhbHMgYXJyYXkgd2l0aCBsZWdhbC10eXBlIHJldHVybiB2YWx1ZXMgZnJvbSB0aGUgY2FsbCwgYW5kIHJldHVybgorICAvLy8gdGhlIHJlc3VsdGluZyB0b2tlbiBjaGFpbiB2YWx1ZS4KKyAgdmlydHVhbCBTRFZhbHVlCisgICAgTG93ZXJDYWxsKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsIGJvb2wgJmlzVGFpbENhbGwsCisgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgICBhc3NlcnQoMCAmJiAiTm90IEltcGxlbWVudGVkIik7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsgICAgLy8gdGhpcyBpcyBoZXJlIHRvIHNpbGVuY2UgY29tcGlsZXIgZXJyb3JzCisgIH0KKworICAvLy8gQ2FuTG93ZXJSZXR1cm4gLSBUaGlzIGhvb2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlCisgIC8vLyByZXR1cm4gdmFsdWVzIGRlc2NyaWJlZCBieSB0aGUgT3V0cyBhcnJheSBjYW4gZml0IGludG8gdGhlIHJldHVybgorICAvLy8gcmVnaXN0ZXJzLiAgSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGFuIHNyZXQtZGVtb3Rpb24gaXMgcGVyZm9ybWVkLgorICAvLy8KKyAgdmlydHVhbCBib29sIENhbkxvd2VyUmV0dXJuKENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCkgY29uc3QKKyAgeworICAgIC8vIFJldHVybiB0cnVlIGJ5IGRlZmF1bHQgdG8gZ2V0IHByZWV4aXN0aW5nIGJlaGF2aW9yLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIExvd2VyUmV0dXJuIC0gVGhpcyBob29rIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gbG93ZXIgb3V0Z29pbmcKKyAgLy8vIHJldHVybiB2YWx1ZXMsIGRlc2NyaWJlZCBieSB0aGUgT3V0cyBhcnJheSwgaW50byB0aGUgc3BlY2lmaWVkCisgIC8vLyBEQUcuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuIHRoZSByZXN1bHRpbmcgdG9rZW4gY2hhaW4KKyAgLy8vIHZhbHVlLgorICAvLy8KKyAgdmlydHVhbCBTRFZhbHVlCisgICAgTG93ZXJSZXR1cm4oU0RWYWx1ZSBDaGFpbiwgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAgIGFzc2VydCgwICYmICJOb3QgSW1wbGVtZW50ZWQiKTsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOyAgICAvLyB0aGlzIGlzIGhlcmUgdG8gc2lsZW5jZSBjb21waWxlciBlcnJvcnMKKyAgfQorCisgIC8vLyBMb3dlck9wZXJhdGlvbldyYXBwZXIgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgdGhlIHR5cGUgbGVnYWxpemVyCisgIC8vLyB0byBsZWdhbGl6ZSBub2RlcyB3aXRoIGFuIGlsbGVnYWwgb3BlcmFuZCB0eXBlIGJ1dCBsZWdhbCByZXN1bHQgdHlwZXMuCisgIC8vLyBJdCByZXBsYWNlcyB0aGUgTG93ZXJPcGVyYXRpb24gY2FsbGJhY2sgaW4gdGhlIHR5cGUgTGVnYWxpemVyLgorICAvLy8gVGhlIHJlYXNvbiB3ZSBjYW4gbm90IGRvIGF3YXkgd2l0aCBMb3dlck9wZXJhdGlvbiBlbnRpcmVseSBpcyB0aGF0CisgIC8vLyBMZWdhbGl6ZURBRyBpc24ndCB5ZXQgcmVhZHkgdG8gdXNlIHRoaXMgY2FsbGJhY2suCisgIC8vLyBUT0RPOiBDb25zaWRlciBtZXJnaW5nIHdpdGggUmVwbGFjZU5vZGVSZXN1bHRzLgorCisgIC8vLyBUaGUgdGFyZ2V0IHBsYWNlcyBuZXcgcmVzdWx0IHZhbHVlcyBmb3IgdGhlIG5vZGUgaW4gUmVzdWx0cyAodGhlaXIgbnVtYmVyCisgIC8vLyBhbmQgdHlwZXMgbXVzdCBleGFjdGx5IG1hdGNoIHRob3NlIG9mIHRoZSBvcmlnaW5hbCByZXR1cm4gdmFsdWVzIG9mCisgIC8vLyB0aGUgbm9kZSksIG9yIGxlYXZlcyBSZXN1bHRzIGVtcHR5LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgbm9kZSBpcyBub3QKKyAgLy8vIHRvIGJlIGN1c3RvbSBsb3dlcmVkIGFmdGVyIGFsbC4KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIExvd2VyT3BlcmF0aW9uLgorICB2aXJ0dWFsIHZvaWQgTG93ZXJPcGVyYXRpb25XcmFwcGVyKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgIC8vLyBMb3dlck9wZXJhdGlvbiAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBmb3Igb3BlcmF0aW9ucyB0aGF0IGFyZQorICAvLy8gdW5zdXBwb3J0ZWQgYnkgdGhlIHRhcmdldCwgd2hpY2ggYXJlIHJlZ2lzdGVyZWQgdG8gdXNlICdjdXN0b20nIGxvd2VyaW5nLAorICAvLy8gYW5kIHdob3NlIGRlZmluZWQgdmFsdWVzIGFyZSBhbGwgbGVnYWwuCisgIC8vLyBJZiB0aGUgdGFyZ2V0IGhhcyBubyBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBjdXN0b20gbG93ZXJpbmcsIGl0IG5lZWQgbm90CisgIC8vLyBpbXBsZW1lbnQgdGhpcy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgYWJvcnRzLgorICB2aXJ0dWFsIFNEVmFsdWUgTG93ZXJPcGVyYXRpb24oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgIC8vLyBSZXBsYWNlTm9kZVJlc3VsdHMgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIG5vZGUgcmVzdWx0IHR5cGUgaXMKKyAgLy8vIGlsbGVnYWwgZm9yIHRoZSB0YXJnZXQsIGFuZCB0aGUgb3BlcmF0aW9uIHdhcyByZWdpc3RlcmVkIHRvIHVzZSAnY3VzdG9tJworICAvLy8gbG93ZXJpbmcgZm9yIHRoYXQgcmVzdWx0IHR5cGUuICBUaGUgdGFyZ2V0IHBsYWNlcyBuZXcgcmVzdWx0IHZhbHVlcyBmb3IKKyAgLy8vIHRoZSBub2RlIGluIFJlc3VsdHMgKHRoZWlyIG51bWJlciBhbmQgdHlwZXMgbXVzdCBleGFjdGx5IG1hdGNoIHRob3NlIG9mCisgIC8vLyB0aGUgb3JpZ2luYWwgcmV0dXJuIHZhbHVlcyBvZiB0aGUgbm9kZSksIG9yIGxlYXZlcyBSZXN1bHRzIGVtcHR5LCB3aGljaAorICAvLy8gaW5kaWNhdGVzIHRoYXQgdGhlIG5vZGUgaXMgbm90IHRvIGJlIGN1c3RvbSBsb3dlcmVkIGFmdGVyIGFsbC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgdGFyZ2V0IGhhcyBubyBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBjdXN0b20gbG93ZXJpbmcsIGl0IG5lZWQgbm90CisgIC8vLyBpbXBsZW1lbnQgdGhpcy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFib3J0cy4KKyAgdmlydHVhbCB2b2lkIFJlcGxhY2VOb2RlUmVzdWx0cyhTRE5vZGUgKk4sIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAgIGFzc2VydCgwICYmICJSZXBsYWNlTm9kZVJlc3VsdHMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHRhcmdldCEiKTsKKyAgfQorCisgIC8vLyBnZXRUYXJnZXROb2RlTmFtZSgpIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiBhIHRhcmdldCBzcGVjaWZpYworICAvLy8gREFHIG5vZGUuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0VGFyZ2V0Tm9kZU5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW5saW5lIEFzbSBTdXBwb3J0IGhvb2tzCisgIC8vCisKKyAgLy8vIEV4cGFuZElubGluZUFzbSAtIFRoaXMgaG9vayBhbGxvd3MgdGhlIHRhcmdldCB0byBleHBhbmQgYW4gaW5saW5lIGFzbQorICAvLy8gY2FsbCB0byBiZSBleHBsaWNpdCBsbHZtIGNvZGUgaWYgaXQgd2FudHMgdG8uICBUaGlzIGlzIHVzZWZ1bCBmb3IKKyAgLy8vIHR1cm5pbmcgc2ltcGxlIGlubGluZSBhc21zIGludG8gTExWTSBpbnRyaW5zaWNzLCB3aGljaCBnaXZlcyB0aGUKKyAgLy8vIGNvbXBpbGVyIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJlaGF2aW9yIG9mIHRoZSBjb2RlLgorICB2aXJ0dWFsIGJvb2wgRXhwYW5kSW5saW5lQXNtKENhbGxJbnN0ICpDSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGVudW0gQ29uc3RyYWludFR5cGUgeworICAgIENfUmVnaXN0ZXIsICAgICAgICAgICAgLy8gQ29uc3RyYWludCByZXByZXNlbnRzIHNwZWNpZmljIHJlZ2lzdGVyKHMpLgorICAgIENfUmVnaXN0ZXJDbGFzcywgICAgICAgLy8gQ29uc3RyYWludCByZXByZXNlbnRzIGFueSBvZiByZWdpc3RlcihzKSBpbiBjbGFzcy4KKyAgICBDX01lbW9yeSwgICAgICAgICAgICAgIC8vIE1lbW9yeSBjb25zdHJhaW50LgorICAgIENfT3RoZXIsICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGVsc2UuCisgICAgQ19Vbmtub3duICAgICAgICAgICAgICAvLyBVbnN1cHBvcnRlZCBjb25zdHJhaW50LgorICB9OworCisgIC8vLyBBc21PcGVyYW5kSW5mbyAtIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGVhY2ggY29uc3RyYWludCB0aGF0IHdlIGFyZQorICAvLy8gbG93ZXJpbmcuCisgIHN0cnVjdCBBc21PcGVyYW5kSW5mbyA6IHB1YmxpYyBJbmxpbmVBc206OkNvbnN0cmFpbnRJbmZvIHsKKyAgICAvLy8gQ29uc3RyYWludENvZGUgLSBUaGlzIGNvbnRhaW5zIHRoZSBhY3R1YWwgc3RyaW5nIGZvciB0aGUgY29kZSwgbGlrZSAibSIuCisgICAgLy8vIFRhcmdldExvd2VyaW5nIHBpY2tzIHRoZSAnYmVzdCcgY29kZSBmcm9tIENvbnN0cmFpbnRJbmZvOjpDb2RlcyB0aGF0CisgICAgLy8vIG1vc3QgY2xvc2VseSBtYXRjaGVzIHRoZSBvcGVyYW5kLgorICAgIHN0ZDo6c3RyaW5nIENvbnN0cmFpbnRDb2RlOworCisgICAgLy8vIENvbnN0cmFpbnRUeXBlIC0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnN0cmFpbnQgY29kZSwgZS5nLiBSZWdpc3RlciwKKyAgICAvLy8gUmVnaXN0ZXJDbGFzcywgTWVtb3J5LCBPdGhlciwgVW5rbm93bi4KKyAgICBUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUgQ29uc3RyYWludFR5cGU7CisKKyAgICAvLy8gQ2FsbE9wZXJhbmR2YWwgLSBJZiB0aGlzIGlzIHRoZSByZXN1bHQgb3V0cHV0IG9wZXJhbmQgb3IgYQorICAgIC8vLyBjbG9iYmVyLCB0aGlzIGlzIG51bGwsIG90aGVyd2lzZSBpdCBpcyB0aGUgaW5jb21pbmcgb3BlcmFuZCB0byB0aGUKKyAgICAvLy8gQ2FsbEluc3QuICBUaGlzIGdldHMgbW9kaWZpZWQgYXMgdGhlIGFzbSBpcyBwcm9jZXNzZWQuCisgICAgVmFsdWUgKkNhbGxPcGVyYW5kVmFsOworCisgICAgLy8vIENvbnN0cmFpbnRWVCAtIFRoZSBWYWx1ZVR5cGUgZm9yIHRoZSBvcGVyYW5kIHZhbHVlLgorICAgIEVWVCBDb25zdHJhaW50VlQ7CisKKyAgICAvLy8gaXNNYXRjaGluZ0lucHV0Q29uc3RyYWludCAtIFJldHVybiB0cnVlIG9mIHRoaXMgaXMgYW4gaW5wdXQgb3BlcmFuZCB0aGF0CisgICAgLy8vIGlzIGEgbWF0Y2hpbmcgY29uc3RyYWludCBsaWtlICI0Ii4KKyAgICBib29sIGlzTWF0Y2hpbmdJbnB1dENvbnN0cmFpbnQoKSBjb25zdDsKKworICAgIC8vLyBnZXRNYXRjaGVkT3BlcmFuZCAtIElmIHRoaXMgaXMgYW4gaW5wdXQgbWF0Y2hpbmcgY29uc3RyYWludCwgdGhpcyBtZXRob2QKKyAgICAvLy8gcmV0dXJucyB0aGUgb3V0cHV0IG9wZXJhbmQgaXQgbWF0Y2hlcy4KKyAgICB1bnNpZ25lZCBnZXRNYXRjaGVkT3BlcmFuZCgpIGNvbnN0OworCisgICAgQXNtT3BlcmFuZEluZm8oY29uc3QgSW5saW5lQXNtOjpDb25zdHJhaW50SW5mbyAmaW5mbykKKyAgICAgIDogSW5saW5lQXNtOjpDb25zdHJhaW50SW5mbyhpbmZvKSwKKyAgICAgICAgQ29uc3RyYWludFR5cGUoVGFyZ2V0TG93ZXJpbmc6OkNfVW5rbm93biksCisgICAgICAgIENhbGxPcGVyYW5kVmFsKDApLCBDb25zdHJhaW50VlQoTVZUOjpPdGhlcikgeworICAgIH0KKyAgfTsKKworICAvLy8gQ29tcHV0ZUNvbnN0cmFpbnRUb1VzZSAtIERldGVybWluZXMgdGhlIGNvbnN0cmFpbnQgY29kZSBhbmQgY29uc3RyYWludAorICAvLy8gdHlwZSB0byB1c2UgZm9yIHRoZSBzcGVjaWZpYyBBc21PcGVyYW5kSW5mbywgc2V0dGluZworICAvLy8gT3BJbmZvLkNvbnN0cmFpbnRDb2RlIGFuZCBPcEluZm8uQ29uc3RyYWludFR5cGUuICBJZiB0aGUgYWN0dWFsIG9wZXJhbmQKKyAgLy8vIGJlaW5nIHBhc3NlZCBpbiBpcyBhdmFpbGFibGUsIGl0IGNhbiBiZSBwYXNzZWQgaW4gYXMgT3AsIG90aGVyd2lzZSBhbgorICAvLy8gZW1wdHkgU0RWYWx1ZSBjYW4gYmUgcGFzc2VkLiAKKyAgdmlydHVhbCB2b2lkIENvbXB1dGVDb25zdHJhaW50VG9Vc2UoQXNtT3BlcmFuZEluZm8gJk9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICpEQUcgPSAwKSBjb25zdDsKKworICAvLy8gZ2V0Q29uc3RyYWludFR5cGUgLSBHaXZlbiBhIGNvbnN0cmFpbnQsIHJldHVybiB0aGUgdHlwZSBvZiBjb25zdHJhaW50IGl0CisgIC8vLyBpcyBmb3IgdGhpcyB0YXJnZXQuCisgIHZpcnR1YWwgQ29uc3RyYWludFR5cGUgZ2V0Q29uc3RyYWludFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQpIGNvbnN0OworCisgIC8vLyBnZXRSZWdDbGFzc0ZvcklubGluZUFzbUNvbnN0cmFpbnQgLSBHaXZlbiBhIGNvbnN0cmFpbnQgbGV0dGVyIChlLmcuICJyIiksCisgIC8vLyByZXR1cm4gYSBsaXN0IG9mIHJlZ2lzdGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNhdGlzZnkgdGhlIGNvbnN0cmFpbnQuCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIENfUmVnaXN0ZXJDbGFzcyBjb25zdHJhaW50cy4KKyAgdmlydHVhbCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4KKyAgZ2V0UmVnQ2xhc3NGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdDsKKworICAvLy8gZ2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludCAtIEdpdmVuIGEgcGh5c2ljYWwgcmVnaXN0ZXIgY29uc3RyYWludCAoZS5nLgorICAvLy8ge2VkeH0pLCByZXR1cm4gdGhlIHJlZ2lzdGVyIG51bWJlciBhbmQgdGhlIHJlZ2lzdGVyIGNsYXNzIGZvciB0aGUKKyAgLy8vIHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIEdpdmVuIGEgcmVnaXN0ZXIgY2xhc3MgY29uc3RyYWludCwgbGlrZSAncicsIGlmIHRoaXMgY29ycmVzcG9uZHMgZGlyZWN0bHkKKyAgLy8vIHRvIGFuIExMVk0gcmVnaXN0ZXIgY2xhc3MsIHJldHVybiBhIHJlZ2lzdGVyIG9mIDAgYW5kIHRoZSByZWdpc3RlciBjbGFzcworICAvLy8gcG9pbnRlci4KKyAgLy8vCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIENfUmVnaXN0ZXIgY29uc3RyYWludHMuICBPbiBlcnJvciwKKyAgLy8vIHRoaXMgcmV0dXJucyBhIHJlZ2lzdGVyIG51bWJlciBvZiAwIGFuZCBhIG51bGwgcmVnaXN0ZXIgY2xhc3MgcG9pbnRlci4uCisgIHZpcnR1YWwgc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4KKyAgICBnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdDsKKworICAvLy8gTG93ZXJYQ29uc3RyYWludCAtIHRyeSB0byByZXBsYWNlIGFuIFggY29uc3RyYWludCwgd2hpY2ggbWF0Y2hlcyBhbnl0aGluZywKKyAgLy8vIHdpdGggYW5vdGhlciB0aGF0IGhhcyBtb3JlIHNwZWNpZmljIHJlcXVpcmVtZW50cyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgb3BlcmFuZC4gIFRoaXMgcmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHJlcGxhY2VtZW50IHRvCisgIC8vLyBtYWtlLgorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKkxvd2VyWENvbnN0cmFpbnQoRVZUIENvbnN0cmFpbnRWVCkgY29uc3Q7CisKKyAgLy8vIExvd2VyQXNtT3BlcmFuZEZvckNvbnN0cmFpbnQgLSBMb3dlciB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgaW50byB0aGUgT3BzCisgIC8vLyB2ZWN0b3IuICBJZiBpdCBpcyBpbnZhbGlkLCBkb24ndCBhZGQgYW55dGhpbmcgdG8gT3BzLgorICB2aXJ0dWFsIHZvaWQgTG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludChTRFZhbHVlIE9wLCBjaGFyIENvbnN0cmFpbnRMZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW5zdHJ1Y3Rpb24gRW1pdHRpbmcgSG9va3MKKyAgLy8KKworICAvLyBFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIgLSBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cworICAvLyB0aGF0IG1hcmsgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlICd1c2VzQ3VzdG9tSW5zZXJ0ZXInIGZsYWcuICBUaGVzZQorICAvLyBpbnN0cnVjdGlvbnMgYXJlIHNwZWNpYWwgaW4gdmFyaW91cyB3YXlzLCB3aGljaCByZXF1aXJlIHNwZWNpYWwgc3VwcG9ydCB0bworICAvLyBpbnNlcnQuICBUaGUgc3BlY2lmaWVkIE1hY2hpbmVJbnN0ciBpcyBjcmVhdGVkIGJ1dCBub3QgaW5zZXJ0ZWQgaW50byBhbnkKKyAgLy8gYmFzaWMgYmxvY2tzLCBhbmQgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGV4cGFuZCBpdCBpbnRvIGEgc2VxdWVuY2Ugb2YKKyAgLy8gaW5zdHJ1Y3Rpb25zLCBwb3RlbnRpYWxseSBhbHNvIGNyZWF0aW5nIG5ldyBiYXNpYyBibG9ja3MgYW5kIGNvbnRyb2wgZmxvdy4KKyAgdmlydHVhbCBNYWNoaW5lQmFzaWNCbG9jayAqCisgICAgRW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyKE1hY2hpbmVJbnN0ciAqTUksIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBZGRyZXNzaW5nIG1vZGUgZGVzY3JpcHRpb24gaG9va3MgKHVzZWQgYnkgTFNSIGV0YykuCisgIC8vCisKKyAgLy8vIEFkZHJNb2RlIC0gVGhpcyByZXByZXNlbnRzIGFuIGFkZHJlc3NpbmcgbW9kZSBvZjoKKyAgLy8vICAgIEJhc2VHViArIEJhc2VPZmZzICsgQmFzZVJlZyArIFNjYWxlKlNjYWxlUmVnCisgIC8vLyBJZiBCYXNlR1YgaXMgbnVsbCwgIHRoZXJlIGlzIG5vIEJhc2VHVi4KKyAgLy8vIElmIEJhc2VPZmZzIGlzIHplcm8sIHRoZXJlIGlzIG5vIGJhc2Ugb2Zmc2V0LgorICAvLy8gSWYgSGFzQmFzZVJlZyBpcyBmYWxzZSwgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlci4KKyAgLy8vIElmIFNjYWxlIGlzIHplcm8sIHRoZXJlIGlzIG5vIFNjYWxlUmVnLiAgU2NhbGUgb2YgMSBpbmRpY2F0ZXMgYSByZWcgd2l0aAorICAvLy8gbm8gc2NhbGUuCisgIC8vLworICBzdHJ1Y3QgQWRkck1vZGUgeworICAgIEdsb2JhbFZhbHVlICpCYXNlR1Y7CisgICAgaW50NjRfdCAgICAgIEJhc2VPZmZzOworICAgIGJvb2wgICAgICAgICBIYXNCYXNlUmVnOworICAgIGludDY0X3QgICAgICBTY2FsZTsKKyAgICBBZGRyTW9kZSgpIDogQmFzZUdWKDApLCBCYXNlT2ZmcygwKSwgSGFzQmFzZVJlZyhmYWxzZSksIFNjYWxlKDApIHt9CisgIH07CisKKyAgLy8vIGlzTGVnYWxBZGRyZXNzaW5nTW9kZSAtIFJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzaW5nIG1vZGUgcmVwcmVzZW50ZWQgYnkKKyAgLy8vIEFNIGlzIGxlZ2FsIGZvciB0aGlzIHRhcmdldCwgZm9yIGEgbG9hZC9zdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIC8vLyBUaGUgdHlwZSBtYXkgYmUgVm9pZFR5LCBpbiB3aGljaCBjYXNlIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIGFkZHJlc3NpbmcKKyAgLy8vIG1vZGUgaXMgbGVnYWwgZm9yIGEgbG9hZC9zdG9yZSBvZiBhbnkgbGVnYWwgdHlwZS4KKyAgLy8vIFRPRE86IEhhbmRsZSBwcmUvcG9zdGluYyBhcyB3ZWxsLgorICB2aXJ0dWFsIGJvb2wgaXNMZWdhbEFkZHJlc3NpbmdNb2RlKGNvbnN0IEFkZHJNb2RlICZBTSwgY29uc3QgVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBpc1RydW5jYXRlRnJlZSAtIFJldHVybiB0cnVlIGlmIGl0J3MgZnJlZSB0byB0cnVuY2F0ZSBhIHZhbHVlIG9mCisgIC8vLyB0eXBlIFR5MSB0byB0eXBlIFR5Mi4gZS5nLiBPbiB4ODYgaXQncyBmcmVlIHRvIHRydW5jYXRlIGEgaTMyIHZhbHVlIGluCisgIC8vLyByZWdpc3RlciBFQVggdG8gaTE2IGJ5IHJlZmVyZW5jaW5nIGl0cyBzdWItcmVnaXN0ZXIgQVguCisgIHZpcnR1YWwgYm9vbCBpc1RydW5jYXRlRnJlZShjb25zdCBUeXBlICpUeTEsIGNvbnN0IFR5cGUgKlR5MikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc1RydW5jYXRlRnJlZShFVlQgVlQxLCBFVlQgVlQyKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGlzWkV4dEZyZWUgLSBSZXR1cm4gdHJ1ZSBpZiBhbnkgYWN0dWFsIGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcyBhCisgIC8vLyB2YWx1ZSBvZiB0eXBlIFR5MSBpbXBsaWNpdGx5IHplcm8tZXh0ZW5kcyB0aGUgdmFsdWUgdG8gVHkyIGluIHRoZSByZXN1bHQKKyAgLy8vIHJlZ2lzdGVyLiBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGluY2x1ZGUgcmVnaXN0ZXJzIGRlZmluZWQgaW4KKyAgLy8vIHVua25vd24gd2F5cywgc3VjaCBhcyBpbmNvbWluZyBhcmd1bWVudHMsIG9yIGNvcGllcyBmcm9tIHVua25vd24KKyAgLy8vIHZpcnR1YWwgcmVnaXN0ZXJzLiBBbHNvLCBpZiBpc1RydW5jYXRlRnJlZShUeTIsIFR5MSkgaXMgdHJ1ZSwgdGhpcworICAvLy8gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gdHJ1bmNhdGUgaW5zdHJ1Y3Rpb25zLiBlLmcuIG9uIHg4Ni02NCwKKyAgLy8vIGFsbCBpbnN0cnVjdGlvbnMgdGhhdCBkZWZpbmUgMzItYml0IHZhbHVlcyBpbXBsaWNpdCB6ZXJvLWV4dGVuZCB0aGUKKyAgLy8vIHJlc3VsdCBvdXQgdG8gNjQgYml0cy4KKyAgdmlydHVhbCBib29sIGlzWkV4dEZyZWUoY29uc3QgVHlwZSAqVHkxLCBjb25zdCBUeXBlICpUeTIpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNaRXh0RnJlZShFVlQgVlQxLCBFVlQgVlQyKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGlzTmFycm93aW5nUHJvZml0YWJsZSAtIFJldHVybiB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byBuYXJyb3cKKyAgLy8vIG9wZXJhdGlvbnMgb2YgdHlwZSBWVDEgdG8gVlQyLiBlLmcuIG9uIHg4NiwgaXQncyBwcm9maXRhYmxlIHRvIG5hcnJvdworICAvLy8gZnJvbSBpMzIgdG8gaTggYnV0IG5vdCBmcm9tIGkzMiB0byBpMTYuCisgIHZpcnR1YWwgYm9vbCBpc05hcnJvd2luZ1Byb2ZpdGFibGUoRVZUIFZUMSwgRVZUIFZUMikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBpc0xlZ2FsSUNtcEltbWVkaWF0ZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW1tZWRpYXRlIGlzIGxlZ2FsCisgIC8vLyBpY21wIGltbWVkaWF0ZSwgdGhhdCBpcyB0aGUgdGFyZ2V0IGhhcyBpY21wIGluc3RydWN0aW9ucyB3aGljaCBjYW4gY29tcGFyZQorICAvLy8gYSByZWdpc3RlciBhZ2FpbnN0IHRoZSBpbW1lZGlhdGUgd2l0aG91dCBoYXZpbmcgdG8gbWF0ZXJpYWxpemUgdGhlCisgIC8vLyBpbW1lZGlhdGUgaW50byBhIHJlZ2lzdGVyLgorICB2aXJ0dWFsIGJvb2wgaXNMZWdhbElDbXBJbW1lZGlhdGUoaW50NjRfdCBJbW0pIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBEaXYgdXRpbGl0eSBmdW5jdGlvbnMKKyAgLy8KKyAgU0RWYWx1ZSBCdWlsZFNESVYoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRE5vZGUqPiogQ3JlYXRlZCkgY29uc3Q7CisgIFNEVmFsdWUgQnVpbGRVRElWKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U0ROb2RlKj4qIENyZWF0ZWQpIGNvbnN0OworCisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFJ1bnRpbWUgTGlicmFyeSBob29rcworICAvLworCisgIC8vLyBzZXRMaWJjYWxsTmFtZSAtIFJlbmFtZSB0aGUgZGVmYXVsdCBsaWJjYWxsIHJvdXRpbmUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gbGliY2FsbC4KKyAgdm9pZCBzZXRMaWJjYWxsTmFtZShSVExJQjo6TGliY2FsbCBDYWxsLCBjb25zdCBjaGFyICpOYW1lKSB7CisgICAgTGliY2FsbFJvdXRpbmVOYW1lc1tDYWxsXSA9IE5hbWU7CisgIH0KKworICAvLy8gZ2V0TGliY2FsbE5hbWUgLSBHZXQgdGhlIGxpYmNhbGwgcm91dGluZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGxpYmNhbGwuCisgIC8vLworICBjb25zdCBjaGFyICpnZXRMaWJjYWxsTmFtZShSVExJQjo6TGliY2FsbCBDYWxsKSBjb25zdCB7CisgICAgcmV0dXJuIExpYmNhbGxSb3V0aW5lTmFtZXNbQ2FsbF07CisgIH0KKworICAvLy8gc2V0Q21wTGliY2FsbENDIC0gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgQ29uZENvZGUgdG8gYmUgdXNlZCB0byB0ZXN0IHRoZQorICAvLy8gcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGxpYmNhbGwgYWdhaW5zdCB6ZXJvLgorICB2b2lkIHNldENtcExpYmNhbGxDQyhSVExJQjo6TGliY2FsbCBDYWxsLCBJU0Q6OkNvbmRDb2RlIENDKSB7CisgICAgQ21wTGliY2FsbENDc1tDYWxsXSA9IENDOworICB9CisKKyAgLy8vIGdldENtcExpYmNhbGxDQyAtIEdldCB0aGUgQ29uZENvZGUgdGhhdCdzIHRvIGJlIHVzZWQgdG8gdGVzdCB0aGUgcmVzdWx0IG9mCisgIC8vLyB0aGUgY29tcGFyaXNvbiBsaWJjYWxsIGFnYWluc3QgemVyby4KKyAgSVNEOjpDb25kQ29kZSBnZXRDbXBMaWJjYWxsQ0MoUlRMSUI6OkxpYmNhbGwgQ2FsbCkgY29uc3QgeworICAgIHJldHVybiBDbXBMaWJjYWxsQ0NzW0NhbGxdOworICB9CisKKyAgLy8vIHNldExpYmNhbGxDYWxsaW5nQ29udiAtIFNldCB0aGUgQ2FsbGluZ0NvbnYgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgbGliY2FsbC4KKyAgdm9pZCBzZXRMaWJjYWxsQ2FsbGluZ0NvbnYoUlRMSUI6OkxpYmNhbGwgQ2FsbCwgQ2FsbGluZ0NvbnY6OklEIENDKSB7CisgICAgTGliY2FsbENhbGxpbmdDb252c1tDYWxsXSA9IENDOworICB9CisKKyAgLy8vIGdldExpYmNhbGxDYWxsaW5nQ29udiAtIEdldCB0aGUgQ2FsbGluZ0NvbnYgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgbGliY2FsbC4KKyAgQ2FsbGluZ0NvbnY6OklEIGdldExpYmNhbGxDYWxsaW5nQ29udihSVExJQjo6TGliY2FsbCBDYWxsKSBjb25zdCB7CisgICAgcmV0dXJuIExpYmNhbGxDYWxsaW5nQ29udnNbQ2FsbF07CisgIH0KKworcHJpdmF0ZToKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE07CisgIGNvbnN0IFRhcmdldERhdGEgKlREOworCisgIC8vLyBQb2ludGVyVHkgLSBUaGUgdHlwZSB0byB1c2UgZm9yIHBvaW50ZXJzLCB1c3VhbGx5IGkzMiBvciBpNjQuCisgIC8vLworICBNVlQgUG9pbnRlclR5OworCisgIC8vLyBJc0xpdHRsZUVuZGlhbiAtIFRydWUgaWYgdGhpcyBpcyBhIGxpdHRsZSBlbmRpYW4gdGFyZ2V0LgorICAvLy8KKyAgYm9vbCBJc0xpdHRsZUVuZGlhbjsKKworICAvLy8gU2VsZWN0SXNFeHBlbnNpdmUgLSBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3Igbm90IHRvIGV4cGFuZCBvcGVyYXRpb25zCisgIC8vLyBpbnRvIHNlcXVlbmNlcyB0aGF0IHVzZSB0aGUgc2VsZWN0IG9wZXJhdGlvbnMgaWYgcG9zc2libGUuCisgIGJvb2wgU2VsZWN0SXNFeHBlbnNpdmU7CisKKyAgLy8vIEludERpdklzQ2hlYXAgLSBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3Igbm90IHRvIGV4cGFuZCBpbnRlZ2VyIGRpdmlkZXMgYnkKKyAgLy8vIGNvbnN0YW50cyBpbnRvIGEgc2VxdWVuY2Ugb2YgbXVscywgYWRkcywgYW5kIHNoaWZ0cy4gIFRoaXMgaXMgYSBoYWNrIHVudGlsCisgIC8vLyBhIHJlYWwgY29zdCBtb2RlbCBpcyBpbiBwbGFjZS4gIElmIHdlIGV2ZXIgb3B0aW1pemUgZm9yIHNpemUsIHRoaXMgd2lsbCBiZQorICAvLy8gc2V0IHRvIHRydWUgdW5jb25kaXRpb25hbGx5LgorICBib29sIEludERpdklzQ2hlYXA7CisKKyAgLy8vIFBvdzJEaXZJc0NoZWFwIC0gVGVsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgaXQgc2hvdWxkbid0IGdlbmVyYXRlCisgIC8vLyBzcmwvYWRkL3NyYSBmb3IgYSBzaWduZWQgZGl2aWRlIGJ5IHBvd2VyIG9mIHR3bywgYW5kIGxldCB0aGUgdGFyZ2V0IGhhbmRsZQorICAvLy8gaXQuCisgIGJvb2wgUG93MkRpdklzQ2hlYXA7CisKKyAgLy8vIFVzZVVuZGVyc2NvcmVTZXRKbXAgLSBUaGlzIHRhcmdldCBwcmVmZXJzIHRvIHVzZSBfc2V0am1wIHRvIGltcGxlbWVudAorICAvLy8gbGx2bS5zZXRqbXAuICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgYm9vbCBVc2VVbmRlcnNjb3JlU2V0Sm1wOworCisgIC8vLyBVc2VVbmRlcnNjb3JlTG9uZ0ptcCAtIFRoaXMgdGFyZ2V0IHByZWZlcnMgdG8gdXNlIF9sb25nam1wIHRvIGltcGxlbWVudAorICAvLy8gbGx2bS5sb25nam1wLiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgVXNlVW5kZXJzY29yZUxvbmdKbXA7CisKKyAgLy8vIFNoaWZ0QW1vdW50VHkgLSBUaGUgdHlwZSB0byB1c2UgZm9yIHNoaWZ0IGFtb3VudHMsIHVzdWFsbHkgaTggb3Igd2hhdGV2ZXIKKyAgLy8vIFBvaW50ZXJUeSBpcy4KKyAgTVZUIFNoaWZ0QW1vdW50VHk7CisKKyAgLy8vIEJvb2xlYW5Db250ZW50cyAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50cyBvZiB0aGUgaGlnaC1iaXRzIGluCisgIC8vLyBib29sZWFuIHZhbHVlcyBoZWxkIGluIGEgdHlwZSB3aWRlciB0aGFuIGkxLiAgU2VlIGdldEJvb2xlYW5Db250ZW50cy4KKyAgQm9vbGVhbkNvbnRlbnQgQm9vbGVhbkNvbnRlbnRzOworCisgIC8vLyBTY2hlZFByZWZlcmVuY2VJbmZvIC0gVGhlIHRhcmdldCBzY2hlZHVsaW5nIHByZWZlcmVuY2U6IHNob3J0ZXN0IHBvc3NpYmxlCisgIC8vLyB0b3RhbCBjeWNsZXMgb3IgbG93ZXN0IHJlZ2lzdGVyIHVzYWdlLgorICBTY2hlZDo6UHJlZmVyZW5jZSBTY2hlZFByZWZlcmVuY2VJbmZvOworCisgIC8vLyBKdW1wQnVmU2l6ZSAtIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHRhcmdldCdzIGptcF9idWYgYnVmZmVycworICB1bnNpZ25lZCBKdW1wQnVmU2l6ZTsKKworICAvLy8gSnVtcEJ1ZkFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQsIGluIGJ5dGVzLCBvZiB0aGUgdGFyZ2V0J3Mgam1wX2J1ZgorICAvLy8gYnVmZmVycworICB1bnNpZ25lZCBKdW1wQnVmQWxpZ25tZW50OworCisgIC8vLyBNaW5TdGFja0FyZ3VtZW50QWxpZ25tZW50IC0gVGhlIG1pbmltdW0gYWxpZ25tZW50IHRoYXQgYW55IGFyZ3VtZW50CisgIC8vLyBvbiB0aGUgc3RhY2sgbmVlZHMgdG8gaGF2ZS4KKyAgLy8vCisgIHVuc2lnbmVkIE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQ7CisKKyAgLy8vIFByZWZMb29wQWxpZ25tZW50IC0gVGhlIHBlcmZlcnJlZCBsb29wIGFsaWdubWVudC4KKyAgLy8vCisgIHVuc2lnbmVkIFByZWZMb29wQWxpZ25tZW50OworCisgIC8vLyBTaG91bGRGb2xkQXRvbWljRmVuY2VzIC0gV2hldGhlciBmZW5jaW5nIE1FTUJBUlJJRVIgaW5zdHJ1Y3Rpb25zIHNob3VsZAorICAvLy8gYmUgZm9sZGVkIGludG8gdGhlIGVuY2xvc2VkIGF0b21pYyBpbnRyaW5zaWMgaW5zdHJ1Y3Rpb24gYnkgdGhlCisgIC8vLyBjb21iaW5lci4KKyAgYm9vbCBTaG91bGRGb2xkQXRvbWljRmVuY2VzOworCisgIC8vLyBTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUgLSBJZiBzZXQgdG8gYSBwaHlzaWNhbCByZWdpc3RlciwgdGhpcworICAvLy8gc3BlY2lmaWVzIHRoZSByZWdpc3RlciB0aGF0IGxsdm0uc2F2ZXN0YWNrL2xsdm0ucmVzdG9yZXN0YWNrIHNob3VsZCBzYXZlCisgIC8vLyBhbmQgcmVzdG9yZS4KKyAgdW5zaWduZWQgU3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlOworCisgIC8vLyBSZWdDbGFzc0ZvclZUIC0gVGhpcyBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgcmVnaXN0ZXIgY2xhc3MgdG8gdXNlIGZvcgorICAvLy8gZWFjaCBWYWx1ZVR5cGUgdGhlIHRhcmdldCBzdXBwb3J0cyBuYXRpdmVseS4KKyAgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUmVnQ2xhc3NGb3JWVFtNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKyAgdW5zaWduZWQgY2hhciBOdW1SZWdpc3RlcnNGb3JWVFtNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKyAgRVZUIFJlZ2lzdGVyVHlwZUZvclZUW01WVDo6TEFTVF9WQUxVRVRZUEVdOworCisgIC8vLyBSZXBSZWdDbGFzc0ZvclZUIC0gVGhpcyBpbmRpY2F0ZXMgdGhlICJyZXByZXNlbnRhdGl2ZSIgcmVnaXN0ZXIgY2xhc3MgdG8KKyAgLy8vIHVzZSBmb3IgZWFjaCBWYWx1ZVR5cGUgdGhlIHRhcmdldCBzdXBwb3J0cyBuYXRpdmVseS4gVGhpcyBpbmZvcm1hdGlvbiBpcworICAvLy8gdXNlZCBieSB0aGUgc2NoZWR1bGVyIHRvIHRyYWNrIHJlZ2lzdGVyIHByZXNzdXJlLiBCeSBkZWZhdWx0LCB0aGUKKyAgLy8vIHJlcHJlc2VudGF0aXZlIHJlZ2lzdGVyIGNsYXNzIGlzIHRoZSBsYXJnZXN0IGxlZ2FsIHN1cGVyLXJlZyByZWdpc3RlcgorICAvLy8gY2xhc3Mgb2YgdGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4gZS5nLiBPbiB4ODYsIGk4LCBpMTYsCisgIC8vLyBhbmQgaTMyJ3MgcmVwcmVzZW50YXRpdmUgY2xhc3Mgd291bGQgYmUgR1IzMi4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUmVwUmVnQ2xhc3NGb3JWVFtNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKworICAvLy8gUmVwUmVnQ2xhc3NDb3N0Rm9yVlQgLSBUaGlzIGluZGljYXRlcyB0aGUgImNvc3QiIG9mIHRoZSAicmVwcmVzZW50YXRpdmUiCisgIC8vLyByZWdpc3RlciBjbGFzcyBmb3IgZWFjaCBWYWx1ZVR5cGUuIFRoZSBjb3N0IGlzIHVzZWQgYnkgdGhlIHNjaGVkdWxlciB0bworICAvLy8gYXBwcm94aW1hdGUgcmVnaXN0ZXIgcHJlc3N1cmUuCisgIHVpbnQ4X3QgUmVwUmVnQ2xhc3NDb3N0Rm9yVlRbTVZUOjpMQVNUX1ZBTFVFVFlQRV07CisKKyAgLy8vIFN5bnRoZXNpemFibGUgaW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMgT0sgZm9yIHRoZSBjb21waWxlciB0byBjcmVhdGUgbmV3CisgIC8vLyBvcGVyYXRpb25zIHVzaW5nIHRoaXMgdHlwZS4gIEFsbCBMZWdhbCB0eXBlcyBhcmUgU3ludGhlc2l6YWJsZSBleGNlcHQKKyAgLy8vIE1NWCB0eXBlcyBvbiBYODYuICBOb24tTGVnYWwgdHlwZXMgYXJlIG5vdCBTeW50aGVzaXphYmxlLgorICBib29sIFN5bnRoZXNpemFibGVbTVZUOjpMQVNUX1ZBTFVFVFlQRV07CisKKyAgLy8vIFRyYW5zZm9ybVRvVHlwZSAtIEZvciBhbnkgdmFsdWUgdHlwZXMgd2UgYXJlIHByb21vdGluZyBvciBleHBhbmRpbmcsIHRoaXMKKyAgLy8vIGNvbnRhaW5zIHRoZSB2YWx1ZSB0eXBlIHRoYXQgd2UgYXJlIGNoYW5naW5nIHRvLiAgRm9yIEV4cGFuZGVkIHR5cGVzLCB0aGlzCisgIC8vLyBjb250YWlucyBvbmUgc3RlcCBvZiB0aGUgZXhwYW5kIChlLmcuIGk2NCAtPiBpMzIpLCBldmVuIGlmIHRoZXJlIGFyZQorICAvLy8gbXVsdGlwbGUgc3RlcHMgcmVxdWlyZWQgKGUuZy4gaTY0IC0+IGkxNikuICBGb3IgdHlwZXMgbmF0aXZlbHkgc3VwcG9ydGVkCisgIC8vLyBieSB0aGUgc3lzdGVtLCB0aGlzIGhvbGRzIHRoZSBzYW1lIHR5cGUgKGUuZy4gaTMyIC0+IGkzMikuCisgIEVWVCBUcmFuc2Zvcm1Ub1R5cGVbTVZUOjpMQVNUX1ZBTFVFVFlQRV07CisKKyAgLy8vIE9wQWN0aW9ucyAtIEZvciBlYWNoIG9wZXJhdGlvbiBhbmQgZWFjaCB2YWx1ZSB0eXBlLCBrZWVwIGEgTGVnYWxpemVBY3Rpb24KKyAgLy8vIHRoYXQgaW5kaWNhdGVzIGhvdyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkIGRlYWwgd2l0aCB0aGUgb3BlcmF0aW9uLgorICAvLy8gTW9zdCBvcGVyYXRpb25zIGFyZSBMZWdhbCAoYWthLCBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgdGhlIHRhcmdldCksIGJ1dAorICAvLy8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc2hvdWxkIGJlIGRlc2NyaWJlZC4gIE5vdGUgdGhhdCBvcGVyYXRpb25zIG9uCisgIC8vLyBub24tbGVnYWwgdmFsdWUgdHlwZXMgYXJlIG5vdCBkZXNjcmliZWQgaGVyZS4KKyAgdWludDhfdCBPcEFjdGlvbnNbTVZUOjpMQVNUX1ZBTFVFVFlQRV1bSVNEOjpCVUlMVElOX09QX0VORF07CisKKyAgLy8vIExvYWRFeHRBY3Rpb25zIC0gRm9yIGVhY2ggbG9hZCBleHRlbnNpb24gdHlwZSBhbmQgZWFjaCB2YWx1ZSB0eXBlLAorICAvLy8ga2VlcCBhIExlZ2FsaXplQWN0aW9uIHRoYXQgaW5kaWNhdGVzIGhvdyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkIGRlYWwKKyAgLy8vIHdpdGggYSBsb2FkIG9mIGEgc3BlY2lmaWMgdmFsdWUgdHlwZSBhbmQgZXh0ZW5zaW9uIHR5cGUuCisgIHVpbnQ4X3QgTG9hZEV4dEFjdGlvbnNbTVZUOjpMQVNUX1ZBTFVFVFlQRV1bSVNEOjpMQVNUX0xPQURFWFRfVFlQRV07CisKKyAgLy8vIFRydW5jU3RvcmVBY3Rpb25zIC0gRm9yIGVhY2ggdmFsdWUgdHlwZSBwYWlyIGtlZXAgYSBMZWdhbGl6ZUFjdGlvbiB0aGF0CisgIC8vLyBpbmRpY2F0ZXMgd2hldGhlciBhIHRydW5jYXRpbmcgc3RvcmUgb2YgYSBzcGVjaWZpYyB2YWx1ZSB0eXBlIGFuZAorICAvLy8gdHJ1bmNhdGluZyB0eXBlIGlzIGxlZ2FsLgorICB1aW50OF90IFRydW5jU3RvcmVBY3Rpb25zW01WVDo6TEFTVF9WQUxVRVRZUEVdW01WVDo6TEFTVF9WQUxVRVRZUEVdOworCisgIC8vLyBJbmRleGVkTW9kZUFjdGlvbnMgLSBGb3IgZWFjaCBpbmRleGVkIG1vZGUgYW5kIGVhY2ggdmFsdWUgdHlwZSwKKyAgLy8vIGtlZXAgYSBwYWlyIG9mIExlZ2FsaXplQWN0aW9uIHRoYXQgaW5kaWNhdGVzIGhvdyBpbnN0cnVjdGlvbgorICAvLy8gc2VsZWN0aW9uIHNob3VsZCBkZWFsIHdpdGggdGhlIGxvYWQgLyBzdG9yZS4gIFRoZSBmaXJzdCBkaW1lbnNpb24gaXMgdGhlCisgIC8vLyB2YWx1ZV90eXBlIGZvciB0aGUgcmVmZXJlbmNlLiBUaGUgc2Vjb25kIGRpbWVuc2lvbiByZXByZXNlbnRzIHRoZSB2YXJpb3VzCisgIC8vLyBtb2RlcyBmb3IgbG9hZCBzdG9yZS4KKyAgdWludDhfdCBJbmRleGVkTW9kZUFjdGlvbnNbTVZUOjpMQVNUX1ZBTFVFVFlQRV1bSVNEOjpMQVNUX0lOREVYRURfTU9ERV07CisKKyAgLy8vIENvbmRDb2RlQWN0aW9ucyAtIEZvciBlYWNoIGNvbmRpdGlvbiBjb2RlIChJU0Q6OkNvbmRDb2RlKSBrZWVwIGEKKyAgLy8vIExlZ2FsaXplQWN0aW9uIHRoYXQgaW5kaWNhdGVzIGhvdyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkCisgIC8vLyBkZWFsIHdpdGggdGhlIGNvbmRpdGlvbiBjb2RlLgorICB1aW50NjRfdCBDb25kQ29kZUFjdGlvbnNbSVNEOjpTRVRDQ19JTlZBTElEXTsKKworICBWYWx1ZVR5cGVBY3Rpb25JbXBsIFZhbHVlVHlwZUFjdGlvbnM7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEVWVCwgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+ID4gQXZhaWxhYmxlUmVnQ2xhc3NlczsKKworICAvLy8gVGFyZ2V0REFHQ29tYmluZUFycmF5IC0gVGFyZ2V0cyBjYW4gc3BlY2lmeSBJU0Qgbm9kZXMgdGhhdCB0aGV5IHdvdWxkCisgIC8vLyBsaWtlIFBlcmZvcm1EQUdDb21iaW5lIGNhbGxiYWNrcyBmb3IgYnkgY2FsbGluZyBzZXRUYXJnZXREQUdDb21iaW5lKCksCisgIC8vLyB3aGljaCBzZXRzIGEgYml0IGluIHRoaXMgYXJyYXkuCisgIHVuc2lnbmVkIGNoYXIKKyAgVGFyZ2V0REFHQ29tYmluZUFycmF5WyhJU0Q6OkJVSUxUSU5fT1BfRU5EK0NIQVJfQklULTEpL0NIQVJfQklUXTsKKworICAvLy8gUHJvbW90ZVRvVHlwZSAtIEZvciBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBwcm9tb3RlZCB0byBhIHNwZWNpZmljIHR5cGUsCisgIC8vLyB0aGlzIGhvbGRzIHRoZSBkZXN0aW5hdGlvbiB0eXBlLiAgVGhpcyBtYXAgc2hvdWxkIGJlIHNwYXJzZSwgc28gZG9uJ3QgaG9sZAorICAvLy8gaXQgYXMgYW4gYXJyYXkuCisgIC8vLworICAvLy8gVGFyZ2V0cyBhZGQgZW50cmllcyB0byB0aGlzIG1hcCB3aXRoIEFkZFByb21vdGVkVG9UeXBlKC4uKSwgY2xpZW50cyBhY2Nlc3MKKyAgLy8vIHRoaXMgd2l0aCBnZXRUeXBlVG9Qcm9tb3RlVG8oLi4pLgorICBzdGQ6Om1hcDxzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVDo6U2ltcGxlVmFsdWVUeXBlPiwgTVZUOjpTaW1wbGVWYWx1ZVR5cGU+CisgICAgUHJvbW90ZVRvVHlwZTsKKworICAvLy8gTGliY2FsbFJvdXRpbmVOYW1lcyAtIFN0b3JlcyB0aGUgbmFtZSBlYWNoIGxpYmNhbGwuCisgIC8vLworICBjb25zdCBjaGFyICpMaWJjYWxsUm91dGluZU5hbWVzW1JUTElCOjpVTktOT1dOX0xJQkNBTExdOworCisgIC8vLyBDbXBMaWJjYWxsQ0NzIC0gVGhlIElTRDo6Q29uZENvZGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byB0ZXN0IHRoZSByZXN1bHQKKyAgLy8vIG9mIGVhY2ggb2YgdGhlIGNvbXBhcmlzb24gbGliY2FsbCBhZ2FpbnN0IHplcm8uCisgIElTRDo6Q29uZENvZGUgQ21wTGliY2FsbENDc1tSVExJQjo6VU5LTk9XTl9MSUJDQUxMXTsKKworICAvLy8gTGliY2FsbENhbGxpbmdDb252cyAtIFN0b3JlcyB0aGUgQ2FsbGluZ0NvbnYgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaAorICAvLy8gbGliY2FsbC4KKyAgQ2FsbGluZ0NvbnY6OklEIExpYmNhbGxDYWxsaW5nQ29udnNbUlRMSUI6OlVOS05PV05fTElCQ0FMTF07CisKK3Byb3RlY3RlZDoKKyAgLy8vIFdoZW4gbG93ZXJpbmcgXEBsbHZtLm1lbXNldCB0aGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyAgLy8vIHN0b3JlIG9wZXJhdGlvbnMgdGhhdCBtYXkgYmUgc3Vic3RpdHV0ZWQgZm9yIHRoZSBjYWxsIHRvIG1lbXNldC4gVGFyZ2V0cworICAvLy8gbXVzdCBzZXQgdGhpcyB2YWx1ZSBiYXNlZCBvbiB0aGUgY29zdCB0aHJlc2hvbGQgZm9yIHRoYXQgdGFyZ2V0LiBUYXJnZXRzCisgIC8vLyBzaG91bGQgYXNzdW1lIHRoYXQgdGhlIG1lbXNldCB3aWxsIGJlIGRvbmUgdXNpbmcgYXMgbWFueSBvZiB0aGUgbGFyZ2VzdAorICAvLy8gc3RvcmUgb3BlcmF0aW9ucyBmaXJzdCwgZm9sbG93ZWQgYnkgc21hbGxlciBvbmVzLCBpZiBuZWNlc3NhcnksIHBlcgorICAvLy8gYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gRm9yIGV4YW1wbGUsIHN0b3JpbmcgOSBieXRlcyBvbiBhIDMyLWJpdCBtYWNoaW5lCisgIC8vLyB3aXRoIDE2LWJpdCBhbGlnbm1lbnQgd291bGQgcmVzdWx0IGluIGZvdXIgMi1ieXRlIHN0b3JlcyBhbmQgb25lIDEtYnl0ZQorICAvLy8gc3RvcmUuICBUaGlzIG9ubHkgYXBwbGllcyB0byBzZXR0aW5nIGEgY29uc3RhbnQgYXJyYXkgb2YgYSBjb25zdGFudCBzaXplLgorICAvLy8gQGJyaWVmIFNwZWNpZnkgbWF4aW11bSBudW1iZXIgb2Ygc3RvcmUgaW5zdHJ1Y3Rpb25zIHBlciBtZW1zZXQgY2FsbC4KKyAgdW5zaWduZWQgbWF4U3RvcmVzUGVyTWVtc2V0OworCisgIC8vLyBXaGVuIGxvd2VyaW5nIFxAbGx2bS5tZW1jcHkgdGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCisgIC8vLyBzdG9yZSBvcGVyYXRpb25zIHRoYXQgbWF5IGJlIHN1YnN0aXR1dGVkIGZvciBhIGNhbGwgdG8gbWVtY3B5LiBUYXJnZXRzCisgIC8vLyBtdXN0IHNldCB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZSBjb3N0IHRocmVzaG9sZCBmb3IgdGhhdCB0YXJnZXQuIFRhcmdldHMKKyAgLy8vIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgbWVtY3B5IHdpbGwgYmUgZG9uZSB1c2luZyBhcyBtYW55IG9mIHRoZSBsYXJnZXN0CisgIC8vLyBzdG9yZSBvcGVyYXRpb25zIGZpcnN0LCBmb2xsb3dlZCBieSBzbWFsbGVyIG9uZXMsIGlmIG5lY2Vzc2FyeSwgcGVyCisgIC8vLyBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLiBGb3IgZXhhbXBsZSwgc3RvcmluZyA3IGJ5dGVzIG9uIGEgMzItYml0IG1hY2hpbmUKKyAgLy8vIHdpdGggMzItYml0IGFsaWdubWVudCB3b3VsZCByZXN1bHQgaW4gb25lIDQtYnl0ZSBzdG9yZSwgYSBvbmUgMi1ieXRlIHN0b3JlCisgIC8vLyBhbmQgb25lIDEtYnl0ZSBzdG9yZS4gVGhpcyBvbmx5IGFwcGxpZXMgdG8gY29weWluZyBhIGNvbnN0YW50IGFycmF5IG9mCisgIC8vLyBjb25zdGFudCBzaXplLgorICAvLy8gQGJyaWVmIFNwZWNpZnkgbWF4aW11bSBieXRlcyBvZiBzdG9yZSBpbnN0cnVjdGlvbnMgcGVyIG1lbWNweSBjYWxsLgorICB1bnNpZ25lZCBtYXhTdG9yZXNQZXJNZW1jcHk7CisKKyAgLy8vIFdoZW4gbG93ZXJpbmcgXEBsbHZtLm1lbW1vdmUgdGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCisgIC8vLyBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCBtYXkgYmUgc3Vic3RpdHV0ZWQgZm9yIGEgY2FsbCB0byBtZW1tb3ZlLiBUYXJnZXRzCisgIC8vLyBtdXN0IHNldCB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZSBjb3N0IHRocmVzaG9sZCBmb3IgdGhhdCB0YXJnZXQuIFRhcmdldHMKKyAgLy8vIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgbWVtbW92ZSB3aWxsIGJlIGRvbmUgdXNpbmcgYXMgbWFueSBvZiB0aGUgbGFyZ2VzdAorICAvLy8gc3RvcmUgb3BlcmF0aW9ucyBmaXJzdCwgZm9sbG93ZWQgYnkgc21hbGxlciBvbmVzLCBpZiBuZWNlc3NhcnksIHBlcgorICAvLy8gYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gRm9yIGV4YW1wbGUsIG1vdmluZyA5IGJ5dGVzIG9uIGEgMzItYml0IG1hY2hpbmUKKyAgLy8vIHdpdGggOC1iaXQgYWxpZ25tZW50IHdvdWxkIHJlc3VsdCBpbiBuaW5lIDEtYnl0ZSBzdG9yZXMuICBUaGlzIG9ubHkKKyAgLy8vIGFwcGxpZXMgdG8gY29weWluZyBhIGNvbnN0YW50IGFycmF5IG9mIGNvbnN0YW50IHNpemUuCisgIC8vLyBAYnJpZWYgU3BlY2lmeSBtYXhpbXVtIGJ5dGVzIG9mIHN0b3JlIGluc3RydWN0aW9ucyBwZXIgbWVtbW92ZSBjYWxsLgorICB1bnNpZ25lZCBtYXhTdG9yZXNQZXJNZW1tb3ZlOworCisgIC8vLyBUaGlzIGZpZWxkIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB0YXJnZXQgY2FuIGJlbmVmaXQgZnJvbSBjb2RlIHBsYWNlbWVudAorICAvLy8gb3B0aW1pemF0aW9uLgorICBib29sIGJlbmVmaXRGcm9tQ29kZVBsYWNlbWVudE9wdDsKKworcHJpdmF0ZToKKyAgLy8vIGlzTGVnYWxSQyAtIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB0eXBlcyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBieSB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcyBhcmUgYWxsIGxlZ2FsLgorICBib29sIGlzTGVnYWxSQyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3Q7CisKKyAgLy8vIGhhc0xlZ2FsU3VwZXJSZWdSZWdDbGFzc2VzIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcworICAvLy8gaGFzIG9uZSBvciBtb3JlIHN1cGVyLXJlZyByZWdpc3RlciBjbGFzc2VzIHRoYXQgYXJlIGxlZ2FsLgorICBib29sIGhhc0xlZ2FsU3VwZXJSZWdSZWdDbGFzc2VzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdDsKK307CisKKy8vLyBHZXRSZXR1cm5JbmZvIC0gR2l2ZW4gYW4gTExWTSBJUiB0eXBlIGFuZCByZXR1cm4gdHlwZSBhdHRyaWJ1dGVzLAorLy8vIGNvbXB1dGUgdGhlIHJldHVybiB2YWx1ZSBFVlRzIGFuZCBmbGFncywgYW5kIG9wdGlvbmFsbHkgYWxzbworLy8vIHRoZSBvZmZzZXRzLCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGJlaW5nIGxvd2VyZWQgdG8gbWVtb3J5Lgordm9pZCBHZXRSZXR1cm5JbmZvKGNvbnN0IFR5cGUqIFJldHVyblR5cGUsIEF0dHJpYnV0ZXMgYXR0ciwKKyAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEksCisgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVpbnQ2NF90PiAqT2Zmc2V0cyA9IDApOworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTcwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oCkBAIC0wLDAgKzEsMjM1IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oIC0gT2JqZWN0IEluZm8gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGNsYXNzZXMgdXNlZCB0byBoYW5kbGUgbG93ZXJpbmdzIHNwZWNpZmljIHRvIGNvbW1vbgorLy8gb2JqZWN0IGZpbGUgZm9ybWF0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVExPV0VSSU5HT0JKRUNURklMRV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVExPV0VSSU5HT0JKRUNURklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL01DL1NlY3Rpb25LaW5kLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTWFjaGluZU1vZHVsZUluZm87CisgIGNsYXNzIE1hbmdsZXI7CisgIGNsYXNzIE1DQXNtSW5mbzsKKyAgY2xhc3MgTUNDb250ZXh0OworICBjbGFzcyBNQ0V4cHI7CisgIGNsYXNzIE1DU2VjdGlvbjsKKyAgY2xhc3MgTUNTZWN0aW9uTWFjaE87CisgIGNsYXNzIE1DU3ltYm9sOworICBjbGFzcyBNQ1N0cmVhbWVyOworICBjbGFzcyBHbG9iYWxWYWx1ZTsKKyAgY2xhc3MgVGFyZ2V0TWFjaGluZTsKKyAgCitjbGFzcyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgeworICBNQ0NvbnRleHQgKkN0eDsKKyAgCisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZShjb25zdCBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUmKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUmKTsgICAgICAgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3Byb3RlY3RlZDoKKyAgCisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSgpOworICAKKyAgLy8vIFRleHRTZWN0aW9uIC0gU2VjdGlvbiBkaXJlY3RpdmUgZm9yIHN0YW5kYXJkIHRleHQuCisgIC8vLworICBjb25zdCBNQ1NlY3Rpb24gKlRleHRTZWN0aW9uOworICAKKyAgLy8vIERhdGFTZWN0aW9uIC0gU2VjdGlvbiBkaXJlY3RpdmUgZm9yIHN0YW5kYXJkIGRhdGEuCisgIC8vLworICBjb25zdCBNQ1NlY3Rpb24gKkRhdGFTZWN0aW9uOworICAKKyAgLy8vIEJTU1NlY3Rpb24gLSBTZWN0aW9uIHRoYXQgaXMgZGVmYXVsdCBpbml0aWFsaXplZCB0byB6ZXJvLgorICBjb25zdCBNQ1NlY3Rpb24gKkJTU1NlY3Rpb247CisgIAorICAvLy8gUmVhZE9ubHlTZWN0aW9uIC0gU2VjdGlvbiB0aGF0IGlzIHJlYWRvbmx5IGFuZCBjYW4gY29udGFpbiBhcmJpdHJhcnkKKyAgLy8vIGluaXRpYWxpemVkIGRhdGEuICBUYXJnZXRzIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlYWRvbmx5IHNlY3Rpb24uCisgIC8vLyBJZiB0aGV5IGRvbid0LCB2YXJpb3VzIGJpdHMgb2YgY29kZSB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgZGF0YQorICAvLy8gc2VjdGlvbiBmb3IgY29uc3RhbnRzLgorICBjb25zdCBNQ1NlY3Rpb24gKlJlYWRPbmx5U2VjdGlvbjsKKyAgCisgIC8vLyBTdGF0aWNDdG9yU2VjdGlvbiAtIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgc3RhdGljIGNvbnN0cnVjdG9yIHBvaW50ZXIKKyAgLy8vIGxpc3QuCisgIGNvbnN0IE1DU2VjdGlvbiAqU3RhdGljQ3RvclNlY3Rpb247CisKKyAgLy8vIFN0YXRpY0R0b3JTZWN0aW9uIC0gVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBzdGF0aWMgZGVzdHJ1Y3RvciBwb2ludGVyCisgIC8vLyBsaXN0LgorICBjb25zdCBNQ1NlY3Rpb24gKlN0YXRpY0R0b3JTZWN0aW9uOworICAKKyAgLy8vIExTREFTZWN0aW9uIC0gSWYgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0LCB0aGlzIGlzCisgIC8vLyB0aGUgc2VjdGlvbiB0aGUgTGFuZ3VhZ2UgU3BlY2lmaWMgRGF0YSBBcmVhIGluZm9ybWF0aW9uIGlzIGVtaXR0ZWQgdG8uCisgIGNvbnN0IE1DU2VjdGlvbiAqTFNEQVNlY3Rpb247CisgIAorICAvLy8gRUhGcmFtZVNlY3Rpb24gLSBJZiBleGNlcHRpb24gaGFuZGxpbmcgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQsIHRoaXMgaXMKKyAgLy8vIHRoZSBzZWN0aW9uIHRoZSBFSCBGcmFtZSBpcyBlbWl0dGVkIHRvLgorICBjb25zdCBNQ1NlY3Rpb24gKkVIRnJhbWVTZWN0aW9uOworICAKKyAgLy8gRHdhcmYgc2VjdGlvbnMgZm9yIGRlYnVnIGluZm8uICBJZiBhIHRhcmdldCBzdXBwb3J0cyBkZWJ1ZyBpbmZvLCB0aGVzZSBtdXN0CisgIC8vIGJlIHNldC4KKyAgY29uc3QgTUNTZWN0aW9uICpEd2FyZkFiYnJldlNlY3Rpb247CisgIGNvbnN0IE1DU2VjdGlvbiAqRHdhcmZJbmZvU2VjdGlvbjsKKyAgY29uc3QgTUNTZWN0aW9uICpEd2FyZkxpbmVTZWN0aW9uOworICBjb25zdCBNQ1NlY3Rpb24gKkR3YXJmRnJhbWVTZWN0aW9uOworICBjb25zdCBNQ1NlY3Rpb24gKkR3YXJmUHViTmFtZXNTZWN0aW9uOworICBjb25zdCBNQ1NlY3Rpb24gKkR3YXJmUHViVHlwZXNTZWN0aW9uOworICBjb25zdCBNQ1NlY3Rpb24gKkR3YXJmRGVidWdJbmxpbmVTZWN0aW9uOworICBjb25zdCBNQ1NlY3Rpb24gKkR3YXJmU3RyU2VjdGlvbjsKKyAgY29uc3QgTUNTZWN0aW9uICpEd2FyZkxvY1NlY3Rpb247CisgIGNvbnN0IE1DU2VjdGlvbiAqRHdhcmZBUmFuZ2VzU2VjdGlvbjsKKyAgY29uc3QgTUNTZWN0aW9uICpEd2FyZlJhbmdlc1NlY3Rpb247CisgIGNvbnN0IE1DU2VjdGlvbiAqRHdhcmZNYWNyb0luZm9TZWN0aW9uOworICAKKyAgLy8gRXh0cmEgVExTIFZhcmlhYmxlIERhdGEgc2VjdGlvbi4gIElmIHRoZSB0YXJnZXQgbmVlZHMgdG8gcHV0IGFkZGl0aW9uYWwKKyAgLy8gaW5mb3JtYXRpb24gZm9yIGEgVExTIHZhcmlhYmxlLCBpdCdsbCBnbyBoZXJlLgorICBjb25zdCBNQ1NlY3Rpb24gKlRMU0V4dHJhRGF0YVNlY3Rpb247CisgIAorICAvLy8gU3VwcG9ydHNXZWFrRW1wdHlFSEZyYW1lIC0gVHJ1ZSBpZiB0YXJnZXQgb2JqZWN0IGZpbGUgc3VwcG9ydHMgYQorICAvLy8gd2Vha19kZWZpbml0aW9uIG9mIGNvbnN0YW50IDAgZm9yIGFuIG9taXR0ZWQgRUggZnJhbWUuCisgIGJvb2wgU3VwcG9ydHNXZWFrT21pdHRlZEVIRnJhbWU7CisgIAorICAvLy8gSXNGdW5jdGlvbkVIU3ltYm9sR2xvYmFsIC0gVGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIGlmIHRoZSAiLmVoIiBzeW1ib2wKKyAgLy8vIGZvciBhIGZ1bmN0aW9uIHNob3VsZCBiZSBtYXJrZWQgLmdsb2JsLgorICBib29sIElzRnVuY3Rpb25FSFN5bWJvbEdsb2JhbDsKKyAgCisgIC8vLyBJc0Z1bmN0aW9uRUhGcmFtZVN5bWJvbFByaXZhdGUgLSBUaGlzIGZsYWcgaXMgc2V0IHRvIHRydWUgaWYgdGhlCisgIC8vLyAiRUhfZnJhbWUiIHN5bWJvbCBmb3IgRUggaW5mb3JtYXRpb24gc2hvdWxkIGJlIGFuIGFzc2VtYmxlciB0ZW1wb3JhcnkgKGFrYQorICAvLy8gcHJpdmF0ZSBsaW5rYWdlLCBha2EgYW4gTCBvciAuTCBsYWJlbCkgb3IgZmFsc2UgaWYgaXQgc2hvdWxkIGJlIGEgbm9ybWFsCisgIC8vLyBub24tLmdsb2JsIGxhYmVsLiAgVGhpcyBkZWZhdWx0cyB0byB0cnVlLgorICBib29sIElzRnVuY3Rpb25FSEZyYW1lU3ltYm9sUHJpdmF0ZTsKK3B1YmxpYzoKKyAgCisgIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuICpDdHg7IH0KKyAgCisgIHZpcnR1YWwgflRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSgpOworICAKKyAgLy8vIEluaXRpYWxpemUgLSB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IGFjdHVhbCBsb3dlcmluZyBpcworICAvLy8gZG9uZS4gIFRoaXMgc3BlY2lmaWVzIHRoZSBjdXJyZW50IGNvbnRleHQgZm9yIGNvZGVnZW4sIGFuZCBnaXZlcyB0aGUKKyAgLy8vIGxvd2VyaW5nIGltcGxlbWVudGF0aW9ucyBhIGNoYW5jZSB0byBzZXQgdXAgdGhlaXIgZGVmYXVsdCBzZWN0aW9ucy4KKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoTUNDb250ZXh0ICZjdHgsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSB7CisgICAgQ3R4ID0gJmN0eDsKKyAgfQorICAKKyAgYm9vbCBpc0Z1bmN0aW9uRUhTeW1ib2xHbG9iYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIElzRnVuY3Rpb25FSFN5bWJvbEdsb2JhbDsKKyAgfQorICBib29sIGlzRnVuY3Rpb25FSEZyYW1lU3ltYm9sUHJpdmF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNGdW5jdGlvbkVIRnJhbWVTeW1ib2xQcml2YXRlOworICB9CisgIGJvb2wgZ2V0U3VwcG9ydHNXZWFrT21pdHRlZEVIRnJhbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1cHBvcnRzV2Vha09taXR0ZWRFSEZyYW1lOworICB9CisgIAorICBjb25zdCBNQ1NlY3Rpb24gKmdldFRleHRTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gVGV4dFNlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXREYXRhU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIERhdGFTZWN0aW9uOyB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0QlNTU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIEJTU1NlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRTdGF0aWNDdG9yU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFN0YXRpY0N0b3JTZWN0aW9uOyB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0U3RhdGljRHRvclNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBTdGF0aWNEdG9yU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldExTREFTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gTFNEQVNlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRFSEZyYW1lU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIEVIRnJhbWVTZWN0aW9uOyB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0RHdhcmZBYmJyZXZTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZBYmJyZXZTZWN0aW9uOyB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0RHdhcmZJbmZvU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmSW5mb1NlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXREd2FyZkxpbmVTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZMaW5lU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldER3YXJmRnJhbWVTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZGcmFtZVNlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXREd2FyZlB1Yk5hbWVzU2VjdGlvbigpIGNvbnN0e3JldHVybiBEd2FyZlB1Yk5hbWVzU2VjdGlvbjt9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0RHdhcmZQdWJUeXBlc1NlY3Rpb24oKSBjb25zdHtyZXR1cm4gRHdhcmZQdWJUeXBlc1NlY3Rpb247fQorICBjb25zdCBNQ1NlY3Rpb24gKmdldER3YXJmRGVidWdJbmxpbmVTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBEd2FyZkRlYnVnSW5saW5lU2VjdGlvbjsKKyAgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldER3YXJmU3RyU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmU3RyU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldER3YXJmTG9jU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmTG9jU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldER3YXJmQVJhbmdlc1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkFSYW5nZXNTZWN0aW9uO30KKyAgY29uc3QgTUNTZWN0aW9uICpnZXREd2FyZlJhbmdlc1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZlJhbmdlc1NlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXREd2FyZk1hY3JvSW5mb1NlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIER3YXJmTWFjcm9JbmZvU2VjdGlvbjsKKyAgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldFRMU0V4dHJhRGF0YVNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFRMU0V4dHJhRGF0YVNlY3Rpb247CisgIH0KKyAgCisgIC8vLyBzaG91bGRFbWl0VXNlZERpcmVjdGl2ZUZvciAtIFRoaXMgaG9vayBhbGxvd3MgdGFyZ2V0cyB0byBzZWxlY3RpdmVseQorICAvLy8gZGVjaWRlIG5vdCB0byBlbWl0IHRoZSBVc2VkRGlyZWN0aXZlIGZvciBzb21lIHN5bWJvbHMgaW4gbGx2bS51c2VkLgorICAvLy8gRklYTUU6IFJFTU9WRSB0aGlzIChyZGFyOi8vNzA3MTMwMCkKKyAgdmlydHVhbCBib29sIHNob3VsZEVtaXRVc2VkRGlyZWN0aXZlRm9yKGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmdsZXIgKikgY29uc3QgeworICAgIHJldHVybiBHViAhPSAwOworICB9CisgIAorICAvLy8gZ2V0U2VjdGlvbkZvckNvbnN0YW50IC0gR2l2ZW4gYSBjb25zdGFudCB3aXRoIHRoZSBTZWN0aW9uS2luZCwgcmV0dXJuIGEKKyAgLy8vIHNlY3Rpb24gdGhhdCBpdCBzaG91bGQgYmUgcGxhY2VkIGluLgorICB2aXJ0dWFsIGNvbnN0IE1DU2VjdGlvbiAqZ2V0U2VjdGlvbkZvckNvbnN0YW50KFNlY3Rpb25LaW5kIEtpbmQpIGNvbnN0OworICAKKyAgLy8vIGdldEtpbmRGb3JHbG9iYWwgLSBDbGFzc2lmeSB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZSBpbnRvIGEgc2V0IG9mCisgIC8vLyB0YXJnZXQgaW5kZXBlbmRlbnQgY2F0ZWdvcmllcyBlbWJvZGllZCBpbiBTZWN0aW9uS2luZC4KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldEtpbmRGb3JHbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSk7CisgIAorICAvLy8gU2VjdGlvbkZvckdsb2JhbCAtIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIHRvIGVtaXQKKyAgLy8vIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGlzIHNob3VsZCBub3QKKyAgLy8vIGJlIHBhc3NlZCBleHRlcm5hbCAob3IgYXZhaWxhYmxlIGV4dGVybmFsbHkpIGdsb2JhbHMuCisgIGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbkZvckdsb2JhbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kLCBNYW5nbGVyICpNYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0OworICAKKyAgLy8vIFNlY3Rpb25Gb3JHbG9iYWwgLSBUaGlzIG1ldGhvZCBjb21wdXRlcyB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbiB0byBlbWl0CisgIC8vLyB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZSBvciBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhpcyBzaG91bGQgbm90CisgIC8vLyBiZSBwYXNzZWQgZXh0ZXJuYWwgKG9yIGF2YWlsYWJsZSBleHRlcm5hbGx5KSBnbG9iYWxzLgorICBjb25zdCBNQ1NlY3Rpb24gKlNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuZ2xlciAqTWFuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCB7CisgICAgcmV0dXJuIFNlY3Rpb25Gb3JHbG9iYWwoR1YsIGdldEtpbmRGb3JHbG9iYWwoR1YsIFRNKSwgTWFuZywgVE0pOworICB9CisgIAorICAKKyAgCisgIC8vLyBnZXRFeHBsaWNpdFNlY3Rpb25HbG9iYWwgLSBUYXJnZXRzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYXNzaWduCisgIC8vLyBhIHNlY3Rpb24gdG8gZ2xvYmFscyB3aXRoIGFuIGV4cGxpY2l0IHNlY3Rpb24gc3BlY2ZpZWQuICBUaGUKKyAgLy8vIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGNhbiBhc3N1bWUgdGhhdCBHVi0+aGFzU2VjdGlvbigpIGlzIHRydWUuCisgIHZpcnR1YWwgY29uc3QgTUNTZWN0aW9uICoKKyAgZ2V0RXhwbGljaXRTZWN0aW9uR2xvYmFsKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgU2VjdGlvbktpbmQgS2luZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5nbGVyICpNYW5nLCBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3QgPSAwOworICAKKyAgLy8vIGdldFNwZWNpYWxDYXNlZFNlY3Rpb25HbG9iYWxzIC0gQWxsb3cgdGhlIHRhcmdldCB0byBjb21wbGV0ZWx5IG92ZXJyaWRlCisgIC8vLyBzZWN0aW9uIGFzc2lnbm1lbnQgb2YgYSBnbG9iYWwuCisgIHZpcnR1YWwgY29uc3QgTUNTZWN0aW9uICoKKyAgZ2V0U3BlY2lhbENhc2VkU2VjdGlvbkdsb2JhbHMoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBNYW5nbGVyICpNYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIC8vLyBnZXRFeHByRm9yRHdhcmZHbG9iYWxSZWZlcmVuY2UgLSBSZXR1cm4gYW4gTUNFeHByIHRvIHVzZSBmb3IgYSByZWZlcmVuY2UKKyAgLy8vIHRvIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhcmlhYmxlIGZyb20gZXhjZXB0aW9uIGhhbmRsaW5nIGluZm9ybWF0aW9uLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKgorICBnZXRFeHByRm9yRHdhcmZHbG9iYWxSZWZlcmVuY2UoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBNYW5nbGVyICpNYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1vZHVsZUluZm8gKk1NSSwgdW5zaWduZWQgRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N0cmVhbWVyICZTdHJlYW1lcikgY29uc3Q7CisKKyAgLy8vIAorICBjb25zdCBNQ0V4cHIgKgorICBnZXRFeHByRm9yRHdhcmZSZWZlcmVuY2UoY29uc3QgTUNTeW1ib2wgKlN5bSwgTWFuZ2xlciAqTWFuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUksIHVuc2lnbmVkIEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTdHJlYW1lciAmU3RyZWFtZXIpIGNvbnN0OworICAKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRQZXJzb25hbGl0eUVuY29kaW5nKCkgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TFNEQUVuY29kaW5nKCkgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RkRFRW5jb2RpbmcoKSBjb25zdDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRUVHlwZUVuY29kaW5nKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBjb25zdCBNQ1NlY3Rpb24gKgorICBTZWxlY3RTZWN0aW9uRm9yR2xvYmFsKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYW5nbGVyICpNYW5nLCBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczOGM2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oCkBAIC0wLDAgKzEsMzM4IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCAtIFRhcmdldCBJbmZvcm1hdGlvbiAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUYXJnZXRNYWNoaW5lIGFuZCBMTFZNVGFyZ2V0TWFjaGluZSBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfVEFSR0VUTUFDSElORV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVE1BQ0hJTkVfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJdGluZXJhcmllcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFRhcmdldDsKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIFRhcmdldERhdGE7CitjbGFzcyBUYXJnZXRTdWJ0YXJnZXQ7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRJbnRyaW5zaWNJbmZvOworY2xhc3MgVGFyZ2V0SklUSW5mbzsKK2NsYXNzIFRhcmdldExvd2VyaW5nOworY2xhc3MgVGFyZ2V0U2VsZWN0aW9uREFHSW5mbzsKK2NsYXNzIFRhcmdldEZyYW1lSW5mbzsKK2NsYXNzIEpJVENvZGVFbWl0dGVyOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworY2xhc3MgUGFzc01hbmFnZXJCYXNlOworY2xhc3MgUGFzc01hbmFnZXI7CitjbGFzcyBQYXNzOworY2xhc3MgVGFyZ2V0RUxGV3JpdGVySW5mbzsKK2NsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKworLy8gUmVsb2NhdGlvbiBtb2RlbCB0eXBlcy4KK25hbWVzcGFjZSBSZWxvYyB7CisgIGVudW0gTW9kZWwgeworICAgIERlZmF1bHQsCisgICAgU3RhdGljLAorICAgIFBJQ18sICAgICAgICAgLy8gQ2Fubm90IGJlIG5hbWVkIFBJQyBkdWUgdG8gY29sbGlzaW9uIHdpdGggLURQSUMKKyAgICBEeW5hbWljTm9QSUMKKyAgfTsKK30KKworLy8gQ29kZSBtb2RlbCB0eXBlcy4KK25hbWVzcGFjZSBDb2RlTW9kZWwgeworICBlbnVtIE1vZGVsIHsKKyAgICBEZWZhdWx0LAorICAgIFNtYWxsLAorICAgIEtlcm5lbCwKKyAgICBNZWRpdW0sCisgICAgTGFyZ2UKKyAgfTsKK30KKworLy8gQ29kZSBnZW5lcmF0aW9uIG9wdGltaXphdGlvbiBsZXZlbC4KK25hbWVzcGFjZSBDb2RlR2VuT3B0IHsKKyAgZW51bSBMZXZlbCB7CisgICAgTm9uZSwgICAgICAgIC8vIC1PMAorICAgIExlc3MsICAgICAgICAvLyAtTzEKKyAgICBEZWZhdWx0LCAgICAgLy8gLU8yLCAtT3MKKyAgICBBZ2dyZXNzaXZlICAgLy8gLU8zCisgIH07Cit9CisKK25hbWVzcGFjZSBTY2hlZCB7CisgIGVudW0gUHJlZmVyZW5jZSB7CisgICAgTm9uZSwgICAgICAgICAgICAgLy8gTm8gcHJlZmVyZW5jZQorICAgIExhdGVuY3ksICAgICAgICAgIC8vIFNjaGVkdWxpbmcgZm9yIHNob3J0ZXN0IHRvdGFsIGxhdGVuY3kuCisgICAgUmVnUHJlc3N1cmUsICAgICAgLy8gU2NoZWR1bGluZyBmb3IgbG93ZXN0IHJlZ2lzdGVyIHByZXNzdXJlLgorICAgIEh5YnJpZCwgICAgICAgICAgIC8vIFNjaGVkdWxpbmcgZm9yIGJvdGggbGF0ZW5jeSBhbmQgcmVnaXN0ZXIgcHJlc3N1cmUuCisgICAgSUxQICAgICAgICAgICAgICAgLy8gU2NoZWR1bGluZyBmb3IgSUxQIGluIGxvdyByZWdpc3RlciBwcmVzc3VyZSBtb2RlLgorICB9OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gVGFyZ2V0TWFjaGluZSAtIFByaW1hcnkgaW50ZXJmYWNlIHRvIHRoZSBjb21wbGV0ZSBtYWNoaW5lIGRlc2NyaXB0aW9uIGZvcgorLy8vIHRoZSB0YXJnZXQgbWFjaGluZS4gIEFsbCB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGFjY2Vzc2libGUKKy8vLyB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLgorLy8vCitjbGFzcyBUYXJnZXRNYWNoaW5lIHsKKyAgVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXRNYWNoaW5lICYpOyAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVGFyZ2V0TWFjaGluZSAmKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3Byb3RlY3RlZDogLy8gQ2FuIG9ubHkgY3JlYXRlIHN1YmNsYXNzZXMuCisgIFRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICYpOworCisgIC8vLyBnZXRTdWJ0YXJnZXRJbXBsIC0gdmlydHVhbCBtZXRob2QgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0aGF0IHJldHVybnMKKyAgLy8vIGEgcmVmZXJlbmNlIHRvIHRoYXQgdGFyZ2V0J3MgVGFyZ2V0U3VidGFyZ2V0LWRlcml2ZWQgbWVtYmVyIHZhcmlhYmxlLgorICB2aXJ0dWFsIGNvbnN0IFRhcmdldFN1YnRhcmdldCAqZ2V0U3VidGFyZ2V0SW1wbCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAvLy8gVGhlVGFyZ2V0IC0gVGhlIFRhcmdldCB0aGF0IHRoaXMgbWFjaGluZSB3YXMgY3JlYXRlZCBmb3IuCisgIGNvbnN0IFRhcmdldCAmVGhlVGFyZ2V0OworICAKKyAgLy8vIEFzbUluZm8gLSBDb250YWlucyB0YXJnZXQgc3BlY2lmaWMgYXNtIGluZm9ybWF0aW9uLgorICAvLy8KKyAgY29uc3QgTUNBc21JbmZvICpBc21JbmZvOworCisgIHVuc2lnbmVkIE1DUmVsYXhBbGwgOiAxOworCitwdWJsaWM6CisgIHZpcnR1YWwgflRhcmdldE1hY2hpbmUoKTsKKworICBjb25zdCBUYXJnZXQgJmdldFRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIFRoZVRhcmdldDsgfQorCisgIC8vIEludGVyZmFjZXMgdG8gdGhlIG1ham9yIGFzcGVjdHMgb2YgdGFyZ2V0IG1hY2hpbmUgaW5mb3JtYXRpb246CisgIC8vIC0tIEluc3RydWN0aW9uIG9wY29kZSBhbmQgb3BlcmFuZCBpbmZvcm1hdGlvbgorICAvLyAtLSBQaXBlbGluZXMgYW5kIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24KKyAgLy8gLS0gU3RhY2sgZnJhbWUgaW5mb3JtYXRpb24KKyAgLy8gLS0gU2VsZWN0aW9uIERBRyBsb3dlcmluZyBpbmZvcm1hdGlvbgorICAvLworICB2aXJ0dWFsIGNvbnN0IFRhcmdldEluc3RySW5mbyAgICAgICAgKmdldEluc3RySW5mbygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRGcmFtZUluZm8gICAgICAgICpnZXRGcmFtZUluZm8oKSBjb25zdCB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0TG93ZXJpbmcgICAgKmdldFRhcmdldExvd2VyaW5nKCkgY29uc3QgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIGNvbnN0IFRhcmdldFNlbGVjdGlvbkRBR0luZm8gKmdldFNlbGVjdGlvbkRBR0luZm8oKSBjb25zdHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBjb25zdCBUYXJnZXREYXRhICAgICAgICAgICAgKmdldFRhcmdldERhdGEoKSBjb25zdCB7IHJldHVybiAwOyB9CisgIAorICAvLy8gZ2V0TUNBc21JbmZvIC0gUmV0dXJuIHRhcmdldCBzcGVjaWZpYyBhc20gaW5mb3JtYXRpb24uCisgIC8vLworICBjb25zdCBNQ0FzbUluZm8gKmdldE1DQXNtSW5mbygpIGNvbnN0IHsgcmV0dXJuIEFzbUluZm87IH0KKyAgCisgIC8vLyBnZXRTdWJ0YXJnZXQgLSBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIHR5cGUgb2YKKyAgLy8vIFRhcmdldFN1YnRhcmdldC4gIEluIGRlYnVnIGJ1aWxkcywgaXQgdmVyaWZpZXMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nCisgIC8vLyByZXR1cm5lZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTVEM+IGNvbnN0IFNUQyAmZ2V0U3VidGFyZ2V0KCkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgU1RDKj4oZ2V0U3VidGFyZ2V0SW1wbCgpKTsKKyAgfQorCisgIC8vLyBnZXRSZWdpc3RlckluZm8gLSBJZiByZWdpc3RlciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHJldHVybiBpdC4gIElmCisgIC8vLyBub3QsIHJldHVybiBudWxsLiAgVGhpcyBpcyBrZXB0IHNlcGFyYXRlIGZyb20gUmVnSW5mbyB1bnRpbCBSZWdJbmZvIGhhcworICAvLy8gZGV0YWlscyBvZiBncmFwaCBjb2xvcmluZyByZWdpc3RlciBhbGxvY2F0aW9uIHJlbW92ZWQgZnJvbSBpdC4KKyAgLy8vCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiAwOyB9CisgIAorICAvLy8gZ2V0SW50cmluc2ljSW5mbyAtIElmIGludHJpbnNpYyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHJldHVybiBpdC4gIElmCisgIC8vLyBub3QsIHJldHVybiBudWxsLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRJbnRyaW5zaWNJbmZvICpnZXRJbnRyaW5zaWNJbmZvKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vLyBnZXRKSVRJbmZvIC0gSWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgYSBKSVQsIHJldHVybiBpbmZvcm1hdGlvbiBmb3IgaXQsCisgIC8vLyBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIC8vLworICB2aXJ0dWFsIFRhcmdldEpJVEluZm8gKmdldEpJVEluZm8oKSB7IHJldHVybiAwOyB9CisgIAorICAvLy8gZ2V0SW5zdHJJdGluZXJhcnlEYXRhIC0gUmV0dXJucyBpbnN0cnVjdGlvbiBpdGluZXJhcnkgZGF0YSBmb3IgdGhlIHRhcmdldAorICAvLy8gb3Igc3BlY2lmaWMgc3VidGFyZ2V0LgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgZ2V0SW5zdHJJdGluZXJhcnlEYXRhKCkgY29uc3QgeyAgCisgICAgcmV0dXJuIEluc3RySXRpbmVyYXJ5RGF0YSgpOworICB9CisKKyAgLy8vIGdldEVMRldyaXRlckluZm8gLSBJZiB0aGlzIHRhcmdldCBzdXBwb3J0cyBhbiBFTEYgd3JpdGVyLCByZXR1cm4KKyAgLy8vIGluZm9ybWF0aW9uIGZvciBpdCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgorICAvLy8gCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0RUxGV3JpdGVySW5mbyAqZ2V0RUxGV3JpdGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAvLy8gaGFzTUNSZWxheEFsbCAtIENoZWNrIHdoZXRoZXIgYWxsIG1hY2hpbmUgY29kZSBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlCisgIC8vLyByZWxheGVkLgorICBib29sIGhhc01DUmVsYXhBbGwoKSBjb25zdCB7IHJldHVybiBNQ1JlbGF4QWxsOyB9CisKKyAgLy8vIHNldE1DUmVsYXhBbGwgLSBTZXQgd2hldGhlciBhbGwgbWFjaGluZSBjb2RlIGluc3RydWN0aW9ucyBzaG91bGQgYmUKKyAgLy8vIHJlbGF4ZWQuCisgIHZvaWQgc2V0TUNSZWxheEFsbChib29sIFZhbHVlKSB7IE1DUmVsYXhBbGwgPSBWYWx1ZTsgfQorCisgIC8vLyBnZXRSZWxvY2F0aW9uTW9kZWwgLSBSZXR1cm5zIHRoZSBjb2RlIGdlbmVyYXRpb24gcmVsb2NhdGlvbiBtb2RlbC4gVGhlCisgIC8vLyBjaG9pY2VzIGFyZSBzdGF0aWMsIFBJQywgYW5kIGR5bmFtaWMtbm8tcGljLCBhbmQgdGFyZ2V0IGRlZmF1bHQuCisgIHN0YXRpYyBSZWxvYzo6TW9kZWwgZ2V0UmVsb2NhdGlvbk1vZGVsKCk7CisKKyAgLy8vIHNldFJlbG9jYXRpb25Nb2RlbCAtIFNldHMgdGhlIGNvZGUgZ2VuZXJhdGlvbiByZWxvY2F0aW9uIG1vZGVsLgorICAvLy8KKyAgc3RhdGljIHZvaWQgc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpNb2RlbCBNb2RlbCk7CisKKyAgLy8vIGdldENvZGVNb2RlbCAtIFJldHVybnMgdGhlIGNvZGUgbW9kZWwuIFRoZSBjaG9pY2VzIGFyZSBzbWFsbCwga2VybmVsLAorICAvLy8gbWVkaXVtLCBsYXJnZSwgYW5kIHRhcmdldCBkZWZhdWx0LgorICBzdGF0aWMgQ29kZU1vZGVsOjpNb2RlbCBnZXRDb2RlTW9kZWwoKTsKKworICAvLy8gc2V0Q29kZU1vZGVsIC0gU2V0cyB0aGUgY29kZSBtb2RlbC4KKyAgLy8vCisgIHN0YXRpYyB2b2lkIHNldENvZGVNb2RlbChDb2RlTW9kZWw6Ok1vZGVsIE1vZGVsKTsKKworICAvLy8gZ2V0QXNtVmVyYm9zaXR5RGVmYXVsdCAtIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYXNtIHZlcmJvc2l0eS4KKyAgLy8vCisgIHN0YXRpYyBib29sIGdldEFzbVZlcmJvc2l0eURlZmF1bHQoKTsKKworICAvLy8gc2V0QXNtVmVyYm9zaXR5RGVmYXVsdCAtIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhc20gdmVyYm9zaXR5LiBEZWZhdWx0CisgIC8vLyBpcyBmYWxzZS4KKyAgc3RhdGljIHZvaWQgc2V0QXNtVmVyYm9zaXR5RGVmYXVsdChib29sKTsKKworICAvLy8gZ2V0RGF0YVNlY3Rpb25zIC0gUmV0dXJuIHRydWUgaWYgZGF0YSBvYmplY3RzIHNob3VsZCBiZSBlbWl0dGVkIGludG8gdGhlaXIKKyAgLy8vIG93biBzZWN0aW9uLCBjb3JyZXNwb25kcyB0byAtZmRhdGEtc2VjdGlvbnMuCisgIHN0YXRpYyBib29sIGdldERhdGFTZWN0aW9ucygpOworCisgIC8vLyBnZXRGdW5jdGlvblNlY3Rpb25zIC0gUmV0dXJuIHRydWUgaWYgZnVuY3Rpb25zIHNob3VsZCBiZSBlbWl0dGVkIGludG8KKyAgLy8vIHRoZWlyIG93biBzZWN0aW9uLCBjb3JyZXNwb25kaW5nIHRvIC1mZnVuY3Rpb24tc2VjdGlvbnMuCisgIHN0YXRpYyBib29sIGdldEZ1bmN0aW9uU2VjdGlvbnMoKTsKKworICAvLy8gc2V0RGF0YVNlY3Rpb25zIC0gU2V0IGlmIHRoZSBkYXRhIGFyZSBlbWl0IGludG8gc2VwYXJhdGUgc2VjdGlvbnMuCisgIHN0YXRpYyB2b2lkIHNldERhdGFTZWN0aW9ucyhib29sKTsKKworICAvLy8gc2V0RnVuY3Rpb25TZWN0aW9ucyAtIFNldCBpZiB0aGUgZnVuY3Rpb25zIGFyZSBlbWl0IGludG8gc2VwYXJhdGUKKyAgLy8vIHNlY3Rpb25zLgorICBzdGF0aWMgdm9pZCBzZXRGdW5jdGlvblNlY3Rpb25zKGJvb2wpOworCisgIC8vLyBnZXRFbmFibGVUYWlsTWVyZ2VEZWZhdWx0IC0gdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgLWVuYWJsZS10YWlsLW1lcmdlCisgIC8vLyBvbiB0aGlzIHRhcmdldC4gIFVzZXIgZmxhZyBvdmVycmlkZXMuCisgIHZpcnR1YWwgYm9vbCBnZXRFbmFibGVUYWlsTWVyZ2VEZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBhZGRQYXNzZXNUb0VtaXRNYWNoaW5lQ29kZSAtIEFkZCBwYXNzZXMgdG8gdGhlIHNwZWNpZmllZCBwYXNzIG1hbmFnZXIgdG8KKyAgLy8vIGdldCBtYWNoaW5lIGNvZGUgZW1pdHRlZC4gIFRoaXMgdXNlcyBhIEpJVENvZGVFbWl0dGVyIG9iamVjdCB0byBoYW5kbGUKKyAgLy8vIGFjdHVhbGx5IG91dHB1dHRpbmcgdGhlIG1hY2hpbmUgY29kZSBhbmQgcmVzb2x2aW5nIHRoaW5ncyBsaWtlIHRoZSBhZGRyZXNzCisgIC8vLyBvZiBmdW5jdGlvbnMuICBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgbWFjaGluZSBjb2RlIGVtaXNzaW9uIGlzCisgIC8vLyBub3Qgc3VwcG9ydGVkLgorICAvLy8KKyAgdmlydHVhbCBib29sIGFkZFBhc3Nlc1RvRW1pdE1hY2hpbmVDb2RlKFBhc3NNYW5hZ2VyQmFzZSAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gYWRkUGFzc2VzVG9FbWl0TUMgLSBBZGQgcGFzc2VzIHRvIHRoZSBzcGVjaWZpZWQgcGFzcyBtYW5hZ2VyIHRvIGdldAorICAvLy8gbWFjaGluZSBjb2RlIGVtaXR0ZWQgd2l0aCB0aGUgTUNKSVQuIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBtYWNoaW5lCisgIC8vLyBjb2RlIGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGZpbGxzIHRoZSBNQ0NvbnRleHQgQ3R4IHBvaW50ZXIgd2hpY2ggY2FuIGJlCisgIC8vLyB1c2VkIHRvIGJ1aWxkIGN1c3RvbSBNQ1N0cmVhbWVyLgorICAvLy8KKyAgdmlydHVhbCBib29sIGFkZFBhc3Nlc1RvRW1pdE1DKFBhc3NNYW5hZ2VyQmFzZSAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0IComLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworLy8vIExMVk1UYXJnZXRNYWNoaW5lIC0gVGhpcyBjbGFzcyBkZXNjcmliZXMgYSB0YXJnZXQgbWFjaGluZSB0aGF0IGlzCisvLy8gaW1wbGVtZW50ZWQgd2l0aCB0aGUgTExWTSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSBnZW5lcmF0b3IuCisvLy8KK2NsYXNzIExMVk1UYXJnZXRNYWNoaW5lIDogcHVibGljIFRhcmdldE1hY2hpbmUgeworICBzdGQ6OnN0cmluZyBUYXJnZXRUcmlwbGU7CisKK3Byb3RlY3RlZDogLy8gQ2FuIG9ubHkgY3JlYXRlIHN1YmNsYXNzZXMuCisgIExMVk1UYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRhcmdldFRyaXBsZSk7CisgIAorcHJpdmF0ZToKKyAgLy8vIGFkZENvbW1vbkNvZGVHZW5QYXNzZXMgLSBBZGQgc3RhbmRhcmQgTExWTSBjb2RlZ2VuIHBhc3NlcyB1c2VkIGZvcgorICAvLy8gYm90aCBlbWl0dGluZyB0byBhc3NlbWJseSBmaWxlcyBvciBtYWNoaW5lIGNvZGUgb3V0cHV0LgorICAvLy8KKyAgYm9vbCBhZGRDb21tb25Db2RlR2VuUGFzc2VzKFBhc3NNYW5hZ2VyQmFzZSAmLCBDb2RlR2VuT3B0OjpMZXZlbCwgTUNDb250ZXh0IComT3V0Q3R4KTsKKworICB2aXJ0dWFsIHZvaWQgc2V0Q29kZU1vZGVsRm9ySklUKCk7CisgIHZpcnR1YWwgdm9pZCBzZXRDb2RlTW9kZWxGb3JTdGF0aWMoKTsKKyAgCitwdWJsaWM6CisgIAorICAvLy8gYWRkUGFzc2VzVG9FbWl0TWFjaGluZUNvZGUgLSBBZGQgcGFzc2VzIHRvIHRoZSBzcGVjaWZpZWQgcGFzcyBtYW5hZ2VyIHRvCisgIC8vLyBnZXQgbWFjaGluZSBjb2RlIGVtaXR0ZWQuICBUaGlzIHVzZXMgYSBKSVRDb2RlRW1pdHRlciBvYmplY3QgdG8gaGFuZGxlCisgIC8vLyBhY3R1YWxseSBvdXRwdXR0aW5nIHRoZSBtYWNoaW5lIGNvZGUgYW5kIHJlc29sdmluZyB0aGluZ3MgbGlrZSB0aGUgYWRkcmVzcworICAvLy8gb2YgZnVuY3Rpb25zLiAgVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIG1hY2hpbmUgY29kZSBlbWlzc2lvbiBpcworICAvLy8gbm90IHN1cHBvcnRlZC4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBhZGRQYXNzZXNUb0VtaXRNYWNoaW5lQ29kZShQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJk1DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsKTsKKworICAvLy8gYWRkUGFzc2VzVG9FbWl0TUMgLSBBZGQgcGFzc2VzIHRvIHRoZSBzcGVjaWZpZWQgcGFzcyBtYW5hZ2VyIHRvIGdldAorICAvLy8gbWFjaGluZSBjb2RlIGVtaXR0ZWQgd2l0aCB0aGUgTUNKSVQuIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBtYWNoaW5lCisgIC8vLyBjb2RlIGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGZpbGxzIHRoZSBNQ0NvbnRleHQgQ3R4IHBvaW50ZXIgd2hpY2ggY2FuIGJlCisgIC8vLyB1c2VkIHRvIGJ1aWxkIGN1c3RvbSBNQ1N0cmVhbWVyLgorICAvLy8KKyAgdmlydHVhbCBib29sIGFkZFBhc3Nlc1RvRW1pdE1DKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgKiZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisgIAorICAvLy8gVGFyZ2V0LUluZGVwZW5kZW50IENvZGUgR2VuZXJhdG9yIFBhc3MgQ29uZmlndXJhdGlvbiBPcHRpb25zLgorCisgIC8vLyBhZGRQcmVJU2VsUGFzc2VzIC0gVGhpcyBtZXRob2Qgc2hvdWxkIGFkZCBhbnkgImxhc3QgbWludXRlIiBMTFZNLT5MTFZNCisgIC8vLyBwYXNzZXMgKHdoaWNoIGFyZSBydW4ganVzdCBiZWZvcmUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IpLgorICB2aXJ0dWFsIGJvb2wgYWRkUHJlSVNlbChQYXNzTWFuYWdlckJhc2UgJiwgQ29kZUdlbk9wdDo6TGV2ZWwpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBhZGRJbnN0U2VsZWN0b3IgLSBUaGlzIG1ldGhvZCBzaG91bGQgaW5zdGFsbCBhbiBpbnN0cnVjdGlvbiBzZWxlY3RvciBwYXNzLAorICAvLy8gd2hpY2ggY29udmVydHMgZnJvbSBMTFZNIGNvZGUgdG8gbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIHZpcnR1YWwgYm9vbCBhZGRJbnN0U2VsZWN0b3IoUGFzc01hbmFnZXJCYXNlICYsIENvZGVHZW5PcHQ6OkxldmVsKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gYWRkUHJlUmVnQWxsb2MgLSBUaGlzIG1ldGhvZCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IHdhbnQgdG8KKyAgLy8vIHJ1biBwYXNzZXMgaW1tZWRpYXRlbHkgYmVmb3JlIHJlZ2lzdGVyIGFsbG9jYXRpb24uIFRoaXMgc2hvdWxkIHJldHVybgorICAvLy8gdHJ1ZSBpZiAtcHJpbnQtbWFjaGluZWluc3RycyBzaG91bGQgcHJpbnQgYWZ0ZXIgdGhlc2UgcGFzc2VzLgorICB2aXJ0dWFsIGJvb2wgYWRkUHJlUmVnQWxsb2MoUGFzc01hbmFnZXJCYXNlICYsIENvZGVHZW5PcHQ6OkxldmVsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGFkZFBvc3RSZWdBbGxvYyAtIFRoaXMgbWV0aG9kIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudAorICAvLy8gdG8gcnVuIHBhc3NlcyBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uIGJ1dCBiZWZvcmUgcHJvbG9nLWVwaWxvZworICAvLy8gaW5zZXJ0aW9uLiAgVGhpcyBzaG91bGQgcmV0dXJuIHRydWUgaWYgLXByaW50LW1hY2hpbmVpbnN0cnMgc2hvdWxkIHByaW50CisgIC8vLyBhZnRlciB0aGVzZSBwYXNzZXMuCisgIHZpcnR1YWwgYm9vbCBhZGRQb3N0UmVnQWxsb2MoUGFzc01hbmFnZXJCYXNlICYsIENvZGVHZW5PcHQ6OkxldmVsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGFkZFByZVNjaGVkMiAtIFRoaXMgbWV0aG9kIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0bworICAvLy8gcnVuIHBhc3NlcyBhZnRlciBwcm9sb2ctZXBpbG9nIGluc2VydGlvbiBhbmQgYmVmb3JlIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24KKyAgLy8vIHNjaGVkdWxpbmcgcGFzcy4gIFRoaXMgc2hvdWxkIHJldHVybiB0cnVlIGlmIC1wcmludC1tYWNoaW5laW5zdHJzIHNob3VsZAorICAvLy8gcHJpbnQgYWZ0ZXIgdGhlc2UgcGFzc2VzLgorICB2aXJ0dWFsIGJvb2wgYWRkUHJlU2NoZWQyKFBhc3NNYW5hZ2VyQmFzZSAmLCBDb2RlR2VuT3B0OjpMZXZlbCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgLy8vIGFkZFByZUVtaXRQYXNzIC0gVGhpcyBwYXNzIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBydW4KKyAgLy8vIHBhc3NlcyBpbW1lZGlhdGVseSBiZWZvcmUgbWFjaGluZSBjb2RlIGlzIGVtaXR0ZWQuICBUaGlzIHNob3VsZCByZXR1cm4KKyAgLy8vIHRydWUgaWYgLXByaW50LW1hY2hpbmVpbnN0cnMgc2hvdWxkIHByaW50IG91dCB0aGUgY29kZSBhZnRlciB0aGUgcGFzc2VzLgorICB2aXJ0dWFsIGJvb2wgYWRkUHJlRW1pdFBhc3MoUGFzc01hbmFnZXJCYXNlICYsIENvZGVHZW5PcHQ6OkxldmVsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAKKyAgLy8vIGFkZENvZGVFbWl0dGVyIC0gVGhpcyBwYXNzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHRoZSB0YXJnZXQgdG8gYWRkIGEKKyAgLy8vIGNvZGUgZW1pdHRlciwgaWYgc3VwcG9ydGVkLiAgSWYgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLCAndHJ1ZScgc2hvdWxkIGJlCisgIC8vLyByZXR1cm5lZC4KKyAgdmlydHVhbCBib29sIGFkZENvZGVFbWl0dGVyKFBhc3NNYW5hZ2VyQmFzZSAmLCBDb2RlR2VuT3B0OjpMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICYpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBnZXRFbmFibGVUYWlsTWVyZ2VEZWZhdWx0IC0gdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgLWVuYWJsZS10YWlsLW1lcmdlCisgIC8vLyBvbiB0aGlzIHRhcmdldC4gIFVzZXIgZmxhZyBvdmVycmlkZXMuCisgIHZpcnR1YWwgYm9vbCBnZXRFbmFibGVUYWlsTWVyZ2VEZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldE9wY29kZXMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0T3Bjb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZmJhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldE9wY29kZXMuaApAQCAtMCwwICsxLDg2IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldE9wY29kZXMuaCAtIFRhcmdldCBJbmRlcCBPcGNvZGVzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0YXJnZXQgaW5kZXBlbmRlbnQgaW5zdHJ1Y3Rpb24gb3Bjb2Rlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVE9QQ09ERVNfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRPUENPREVTX0gKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gSW52YXJpYW50IG9wY29kZXM6IEFsbCBpbnN0cnVjdGlvbiBzZXRzIGhhdmUgdGhlc2UgYXMgdGhlaXIgbG93IG9wY29kZXMuCisvLy8KKy8vLyBFdmVyeSBpbnN0cnVjdGlvbiBkZWZpbmVkIGhlcmUgbXVzdCBhbHNvIGFwcGVhciBpbiBUYXJnZXQudGQgYW5kIHRoZSBvcmRlcgorLy8vIG11c3QgYmUgdGhlIHNhbWUgYXMgaW4gQ29kZUdlblRhcmdldC5jcHAuCisvLy8KK25hbWVzcGFjZSBUYXJnZXRPcGNvZGUgeworICBlbnVtIHsKKyAgICBQSEkgPSAwLAorICAgIElOTElORUFTTSA9IDEsCisgICAgUFJPTE9HX0xBQkVMID0gMiwKKyAgICBFSF9MQUJFTCA9IDMsCisgICAgR0NfTEFCRUwgPSA0LAorCisgICAgLy8vIEtJTEwgLSBUaGlzIGluc3RydWN0aW9uIGlzIGEgbm9vcCB0aGF0IGlzIHVzZWQgb25seSB0byBhZGp1c3QgdGhlCisgICAgLy8vIGxpdmVuZXNzIG9mIHJlZ2lzdGVycy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoCisgICAgLy8vIHN1Yi1yZWdpc3RlcnMuCisgICAgS0lMTCA9IDUsCisKKyAgICAvLy8gRVhUUkFDVF9TVUJSRUcgLSBUaGlzIGluc3RydWN0aW9uIHRha2VzIHR3byBvcGVyYW5kczogYSByZWdpc3RlcgorICAgIC8vLyB0aGF0IGhhcyBzdWJyZWdpc3RlcnMsIGFuZCBhIHN1YnJlZ2lzdGVyIGluZGV4LiBJdCByZXR1cm5zIHRoZQorICAgIC8vLyBleHRyYWN0ZWQgc3VicmVnaXN0ZXIgdmFsdWUuIFRoaXMgaXMgY29tbW9ubHkgdXNlZCB0byBpbXBsZW1lbnQKKyAgICAvLy8gdHJ1bmNhdGlvbiBvcGVyYXRpb25zIG9uIHRhcmdldCBhcmNoaXRlY3R1cmVzIHdoaWNoIHN1cHBvcnQgaXQuCisgICAgRVhUUkFDVF9TVUJSRUcgPSA2LAorCisgICAgLy8vIElOU0VSVF9TVUJSRUcgLSBUaGlzIGluc3RydWN0aW9uIHRha2VzIHRocmVlIG9wZXJhbmRzOiBhIHJlZ2lzdGVyIHRoYXQKKyAgICAvLy8gaGFzIHN1YnJlZ2lzdGVycywgYSByZWdpc3RlciBwcm92aWRpbmcgYW4gaW5zZXJ0IHZhbHVlLCBhbmQgYQorICAgIC8vLyBzdWJyZWdpc3RlciBpbmRleC4gSXQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IHJlZ2lzdGVyIHdpdGggdGhlCisgICAgLy8vIHZhbHVlIG9mIHRoZSBzZWNvbmQgcmVnaXN0ZXIgaW5zZXJ0ZWQuIFRoZSBmaXJzdCByZWdpc3RlciBpcyBvZnRlbgorICAgIC8vLyBkZWZpbmVkIGJ5IGFuIElNUExJQ0lUX0RFRiwgYmVjYXVzZSBpdCBpcyBjb21tb25seSB1c2VkIHRvIGltcGxlbWVudAorICAgIC8vLyBhbnlleHQgb3BlcmF0aW9ucyBvbiB0YXJnZXQgYXJjaGl0ZWN0dXJlcyB3aGljaCBzdXBwb3J0IGl0LgorICAgIElOU0VSVF9TVUJSRUcgPSA3LAorCisgICAgLy8vIElNUExJQ0lUX0RFRiAtIFRoaXMgaXMgdGhlIE1hY2hpbmVJbnN0ci1sZXZlbCBlcXVpdmFsZW50IG9mIHVuZGVmLgorICAgIElNUExJQ0lUX0RFRiA9IDgsCisKKyAgICAvLy8gU1VCUkVHX1RPX1JFRyAtIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgc2ltaWxhciB0byBJTlNFUlRfU1VCUkVHIGV4Y2VwdCB0aGF0CisgICAgLy8vIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGFuIGltbWVkaWF0ZSBpbnRlZ2VyIGNvbnN0YW50LiBUaGlzIGNvbnN0YW50IGlzCisgICAgLy8vIG9mdGVuIHplcm8sIGJlY2F1c2UgaXQgaXMgY29tbW9ubHkgdXNlZCB0byBhc3NlcnQgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gZGVmaW5pbmcgdGhlIHJlZ2lzdGVyIGltcGxpY2l0bHkgY2xlYXJzIHRoZSBoaWdoIGJpdHMuCisgICAgU1VCUkVHX1RPX1JFRyA9IDksCisKKyAgICAvLy8gQ09QWV9UT19SRUdDTEFTUyAtIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBwbGFjZWhvbGRlciBmb3IgYSBwbGFpbgorICAgIC8vLyByZWdpc3Rlci10by1yZWdpc3RlciBjb3B5IGludG8gYSBzcGVjaWZpYyByZWdpc3RlciBjbGFzcy4gVGhpcyBpcyBvbmx5CisgICAgLy8vIHVzZWQgYmV0d2VlbiBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gYW5kIE1hY2hpbmVJbnN0ciBjcmVhdGlvbiwgYmVmb3JlCisgICAgLy8vIHZpcnR1YWwgcmVnaXN0ZXJzIGhhdmUgYmVlbiBjcmVhdGVkIGZvciBhbGwgdGhlIGluc3RydWN0aW9ucywgYW5kIGl0J3MKKyAgICAvLy8gb25seSBuZWVkZWQgaW4gY2FzZXMgd2hlcmUgdGhlIHJlZ2lzdGVyIGNsYXNzZXMgaW1wbGllZCBieSB0aGUKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zIGFyZSBpbnN1ZmZpY2llbnQuIEl0IGlzIGVtaXR0ZWQgYXMgYSBDT1BZIE1hY2hpbmVJbnN0ci4KKyAgICBDT1BZX1RPX1JFR0NMQVNTID0gMTAsCisKKyAgICAvLy8gREJHX1ZBTFVFIC0gYSBtYXBwaW5nIG9mIHRoZSBsbHZtLmRiZy52YWx1ZSBpbnRyaW5zaWMKKyAgICBEQkdfVkFMVUUgPSAxMSwKKworICAgIC8vLyBSRUdfU0VRVUVOQ0UgLSBUaGlzIHZhcmlhZGljIGluc3RydWN0aW9uIGlzIHVzZWQgdG8gZm9ybSBhIHJlZ2lzdGVyIHRoYXQKKyAgICAvLy8gcmVwcmVzZW50IGEgY29uc2VjdXRpdmUgc2VxdWVuY2Ugb2Ygc3ViLXJlZ2lzdGVycy4gSXQncyB1c2VkIGFzIHJlZ2lzdGVyCisgICAgLy8vIGNvYWxlc2NpbmcgLyBhbGxvY2F0aW9uIGFpZCBhbmQgbXVzdCBiZSBlbGltaW5hdGVkIGJlZm9yZSBjb2RlIGVtaXNzaW9uLgorICAgIC8vLyBlLmcuIHYxMDI3ID0gUkVHX1NFUVVFTkNFIHYxMDI0LCAzLCB2MTAyNSwgNCwgdjEwMjYsIDUKKyAgICAvLy8gQWZ0ZXIgcmVnaXN0ZXIgY29hbGVzY2luZyByZWZlcmVuY2VzIG9mIHYxMDI0IHNob3VsZCBiZSByZXBsYWNlIHdpdGgKKyAgICAvLy8gdjEwMjc6MywgdjEwMjUgd2l0aCB2MTAyNzo0LCBldGMuCisgICAgUkVHX1NFUVVFTkNFID0gMTIsCisKKyAgICAvLy8gQ09QWSAtIFRhcmdldC1pbmRlcGVuZGVudCByZWdpc3RlciBjb3B5LiBUaGlzIGluc3RydWN0aW9uIGNhbiBhbHNvIGJlCisgICAgLy8vIHVzZWQgdG8gY29weSBiZXR3ZWVuIHN1YnJlZ2lzdGVycyBvZiB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgICBDT1BZID0gMTMKKyAgfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBUYXJnZXRPcGNvZGUKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGViOTVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8vPT09LS0gbGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIC0gVGFyZ2V0IE9wdGlvbnMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgY29tbWFuZCBsaW5lIG9wdGlvbiBmbGFncyB0aGF0IGFyZSBzaGFyZWQgYWNyb3NzIHZhcmlvdXMKKy8vIHRhcmdldHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9UQVJHRVRPUFRJT05TX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfVEFSR0VUT1BUSU9OU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworCisgIC8vIFBvc3NpYmxlIGZsb2F0IEFCSSBzZXR0aW5ncy4gVXNlZCB3aXRoIEZsb2F0QUJJVHlwZSBpbiBUYXJnZXRPcHRpb25zLmguCisgIG5hbWVzcGFjZSBGbG9hdEFCSSB7CisgICAgZW51bSBBQklUeXBlIHsKKyAgICAgIERlZmF1bHQsIC8vIFRhcmdldC1zcGVjaWZpYyAoZWl0aGVyIHNvZnQgb2YgaGFyZCBkZXBlbmRpbmcgb24gdHJpcGxlLCBldGMpLgorICAgICAgU29mdCwgLy8gU29mdCBmbG9hdC4KKyAgICAgIEhhcmQgIC8vIEhhcmQgZmxvYXQuCisgICAgfTsKKyAgfQorICAKKyAgLy8vIE5vRnJhbWVQb2ludGVyRWxpbSAtIFRoaXMgZmxhZyBpcyBlbmFibGVkIHdoZW4gdGhlIC1kaXNhYmxlLWZwLWVsaW0gaXMKKyAgLy8vIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWYgdGhlIHRhcmdldCBzdXBwb3J0cyB0aGUgZnJhbWUgcG9pbnRlcgorICAvLy8gZWxpbWluYXRpb24gb3B0aW1pemF0aW9uLCB0aGlzIG9wdGlvbiBzaG91bGQgZGlzYWJsZSBpdC4KKyAgZXh0ZXJuIGJvb2wgTm9GcmFtZVBvaW50ZXJFbGltOworCisgIC8vLyBOb0ZyYW1lUG9pbnRlckVsaW1Ob25MZWFmIC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiB0aGUKKyAgLy8vIC1kaXNhYmxlLW5vbi1sZWFmLWZwLWVsaW0gaXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIElmIHRoZSB0YXJnZXQKKyAgLy8vIHN1cHBvcnRzIHRoZSBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uIG9wdGltaXphdGlvbiwgdGhpcyBvcHRpb24gc2hvdWxkCisgIC8vLyBkaXNhYmxlIGl0IGZvciBub24tbGVhZiBmdW5jdGlvbnMuCisgIGV4dGVybiBib29sIE5vRnJhbWVQb2ludGVyRWxpbU5vbkxlYWY7CisKKyAgLy8vIERpc2FibGVGcmFtZVBvaW50ZXJFbGltIC0gVGhpcyByZXR1cm5zIHRydWUgaWYgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbgorICAvLy8gb3B0aW1pemF0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCBmb3IgdGhlIGdpdmVuIG1hY2hpbmUgZnVuY3Rpb24uCisgIGV4dGVybiBib29sIERpc2FibGVGcmFtZVBvaW50ZXJFbGltKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisgIC8vLyBMZXNzUHJlY2lzZUZQTUFEIC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiB0aGUKKyAgLy8vIC1lbmFibGUtZnAtbWFkIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgV2hlbiB0aGlzIGZsYWcgaXMgb2ZmCisgIC8vLyAodGhlIGRlZmF1bHQpLCB0aGUgY29kZSBnZW5lcmF0b3IgaXMgbm90IGFsbG93ZWQgdG8gZ2VuZXJhdGUgbWFkCisgIC8vLyAobXVsdGlwbHkgYWRkKSBpZiB0aGUgcmVzdWx0IGlzICJsZXNzIHByZWNpc2UiIHRoYW4gZG9pbmcgdGhvc2Ugb3BlcmF0aW9ucworICAvLy8gaW5kaXZpZHVhbGx5LgorICBleHRlcm4gYm9vbCBMZXNzUHJlY2lzZUZQTUFET3B0aW9uOworICBleHRlcm4gYm9vbCBMZXNzUHJlY2lzZUZQTUFEKCk7CisKKyAgLy8vIE5vRXhjZXNzRlBQcmVjaXNpb24gLSBUaGlzIGZsYWcgaXMgZW5hYmxlZCB3aGVuIHRoZQorICAvLy8gLWRpc2FibGUtZXhjZXNzLWZwLXByZWNpc2lvbiBmbGFnIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgV2hlbgorICAvLy8gdGhpcyBmbGFnIGlzIG9mZiAodGhlIGRlZmF1bHQpLCB0aGUgY29kZSBnZW5lcmF0b3IgaXMgYWxsb3dlZCB0byBwcm9kdWNlCisgIC8vLyByZXN1bHRzIHRoYXQgYXJlICJtb3JlIHByZWNpc2UiIHRoYW4gSUVFRSBhbGxvd3MuICBUaGlzIGluY2x1ZGVzIHVzZSBvZgorICAvLy8gRk1BLWxpa2Ugb3BlcmF0aW9ucyBhbmQgdXNlIG9mIHRoZSBYODYgRlAgcmVnaXN0ZXJzIHdpdGhvdXQgcm91bmRpbmcgYWxsCisgIC8vLyBvdmVyIHRoZSBwbGFjZS4KKyAgZXh0ZXJuIGJvb2wgTm9FeGNlc3NGUFByZWNpc2lvbjsKKworICAvLy8gVW5zYWZlRlBNYXRoIC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiB0aGUKKyAgLy8vIC1lbmFibGUtdW5zYWZlLWZwLW1hdGggZmxhZyBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIFdoZW4KKyAgLy8vIHRoaXMgZmxhZyBpcyBvZmYgKHRoZSBkZWZhdWx0KSwgdGhlIGNvZGUgZ2VuZXJhdG9yIGlzIG5vdCBhbGxvd2VkIHRvCisgIC8vLyBwcm9kdWNlIHJlc3VsdHMgdGhhdCBhcmUgImxlc3MgcHJlY2lzZSIgdGhhbiBJRUVFIGFsbG93cy4gIFRoaXMgaW5jbHVkZXMKKyAgLy8vIHVzZSBvZiBYODYgaW5zdHJ1Y3Rpb25zIGxpa2UgRlNJTiBhbmQgRkNPUyBpbnN0ZWFkIG9mIGxpYmNhbGxzLgorICAvLy8gVW5zYWZlRlBNYXRoIGltcGxpZXMgTGVzc1ByZWNpc2VGUE1BRC4KKyAgZXh0ZXJuIGJvb2wgVW5zYWZlRlBNYXRoOworCisgIC8vLyBOb0luZnNGUE1hdGggLSBUaGlzIGZsYWcgaXMgZW5hYmxlZCB3aGVuIHRoZQorICAvLy8gLWVuYWJsZS1uby1pbmZzLWZwLW1hdGggZmxhZyBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gV2hlbgorICAvLy8gdGhpcyBmbGFnIGlzIG9mZiAodGhlIGRlZmF1bHQpLCB0aGUgY29kZSBnZW5lcmF0b3IgaXMgbm90IGFsbG93ZWQgdG8KKyAgLy8vIGFzc3VtZSB0aGUgRlAgYXJpdGhtZXRpYyBhcmd1bWVudHMgYW5kIHJlc3VsdHMgYXJlIG5ldmVyICstSW5mcy4KKyAgZXh0ZXJuIGJvb2wgTm9JbmZzRlBNYXRoOworCisgIC8vLyBOb05hTnNGUE1hdGggLSBUaGlzIGZsYWcgaXMgZW5hYmxlZCB3aGVuIHRoZQorICAvLy8gLWVuYWJsZS1uby1uYW5zLWZwLW1hdGggZmxhZyBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gV2hlbgorICAvLy8gdGhpcyBmbGFnIGlzIG9mZiAodGhlIGRlZmF1bHQpLCB0aGUgY29kZSBnZW5lcmF0b3IgaXMgbm90IGFsbG93ZWQgdG8KKyAgLy8vIGFzc3VtZSB0aGUgRlAgYXJpdGhtZXRpYyBhcmd1bWVudHMgYW5kIHJlc3VsdHMgYXJlIG5ldmVyIE5hTnMuCisgIGV4dGVybiBib29sIE5vTmFOc0ZQTWF0aDsKKworICAvLy8gSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGggLSBUaGlzIHJldHVybnMgdHJ1ZSB3aGVuIHRoZQorICAvLy8gLWVuYWJsZS1zaWduLWRlcGVuZGVudC1yb3VuZGluZy1mcC1tYXRoIGlzIHNwZWNpZmllZC4gIElmIHRoaXMgcmV0dXJucworICAvLy8gZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlIGNvZGUgZ2VuZXJhdG9yIGlzIGFsbG93ZWQgdG8gYXNzdW1lIHRoYXQgdGhlCisgIC8vLyByb3VuZGluZyBiZWhhdmlvciBpcyB0aGUgZGVmYXVsdCAocm91bmQtdG8temVybyBmb3IgYWxsIGZsb2F0aW5nIHBvaW50IHRvCisgIC8vLyBpbnRlZ2VyIGNvbnZlcnNpb25zLCBhbmQgcm91bmQtdG8tbmVhcmVzdCBmb3IgYWxsIG90aGVyIGFyaXRobWV0aWMKKyAgLy8vIHRydW5jYXRpb25zKS4gIElmIHRoaXMgaXMgZW5hYmxlZCAoc2V0IHRvIHRydWUpLCB0aGUgY29kZSBnZW5lcmF0b3IgbXVzdAorICAvLy8gYXNzdW1lIHRoYXQgdGhlIHJvdW5kaW5nIG1vZGUgbWF5IGR5bmFtaWNhbGx5IGNoYW5nZS4KKyAgZXh0ZXJuIGJvb2wgSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGhPcHRpb247CisgIGV4dGVybiBib29sIEhvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nRlBNYXRoKCk7CisgIAorICAvLy8gVXNlU29mdEZsb2F0IC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiB0aGUgLXNvZnQtZmxvYXQgZmxhZyBpcyBzcGVjaWZpZWQKKyAgLy8vIG9uIHRoZSBjb21tYW5kIGxpbmUuICBXaGVuIHRoaXMgZmxhZyBpcyBvbiwgdGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwKKyAgLy8vIGdlbmVyYXRlIGxpYmNhbGxzIHRvIHRoZSBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBsaWJyYXJ5IGluc3RlYWQgb2YKKyAgLy8vIHRhcmdldCBGUCBpbnN0cnVjdGlvbnMuCisgIGV4dGVybiBib29sIFVzZVNvZnRGbG9hdDsKKworICAvLy8gRmxvYXRBQklUeXBlIC0gVGhpcyBzZXR0aW5nIGlzIHNldCBieSAtZmxvYXQtYWJpPXh4eCBvcHRpb24gaXMgc3BlY2ZpZWQKKyAgLy8vIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgc2V0dGluZyBtYXkgZWl0aGVyIGJlIERlZmF1bHQsIFNvZnQsIG9yIEhhcmQuCisgIC8vLyBEZWZhdWx0IHNlbGVjdHMgdGhlIHRhcmdldCdzIGRlZmF1bHQgYmVoYXZpb3IuIFNvZnQgc2VsZWN0cyB0aGUgQUJJIGZvcgorICAvLy8gVXNlU29mdEZsb2F0LCBidXQgZG9lcyBub3QgaW5pZGNhdGUgdGhhdCBGUCBoYXJkd2FyZSBtYXkgbm90IGJlIHVzZWQuCisgIC8vLyBTdWNoIGEgY29tYmluYXRpb24gaXMgdW5mb3J0dW5hdGVseSBwb3B1bGFyIChlLmcuIGFybS1hcHBsZS1kYXJ3aW4pLgorICAvLy8gSGFyZCBwcmVzdW1lcyB0aGF0IHRoZSBub3JtYWwgRlAgQUJJIGlzIHVzZWQuCisgIGV4dGVybiBGbG9hdEFCSTo6QUJJVHlwZSBGbG9hdEFCSVR5cGU7CisKKyAgLy8vIE5vWmVyb3NJbkJTUyAtIEJ5IGRlZmF1bHQgc29tZSBjb2RlZ2VucyBwbGFjZSB6ZXJvLWluaXRpYWxpemVkIGRhdGEgdG8KKyAgLy8vIC5ic3Mgc2VjdGlvbi4gVGhpcyBmbGFnIGRpc2FibGVzIHN1Y2ggYmVoYXZpb3VyIChuZWNlc3NhcnksIGUuZy4gZm9yCisgIC8vLyBjcnQqLm8gY29tcGlsaW5nKS4KKyAgZXh0ZXJuIGJvb2wgTm9aZXJvc0luQlNTOworCisgIC8vLyBHdWFyYW50ZWVkVGFpbENhbGxPcHQgLSBUaGlzIGZsYWcgaXMgZW5hYmxlZCB3aGVuIC10YWlsY2FsbG9wdCBpcworICAvLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZS4gV2hlbiB0aGUgZmxhZyBpcyBvbiwgcGFydGljaXBhdGluZyB0YXJnZXRzCisgIC8vLyB3aWxsIHBlcmZvcm0gdGFpbCBjYWxsIG9wdGltaXphdGlvbiBvbiBhbGwgY2FsbHMgd2hpY2ggdXNlIHRoZSBmYXN0Y2MKKyAgLy8vIGNhbGxpbmcgY29udmVudGlvbiBhbmQgd2hpY2ggc2F0aXNmeSBjZXJ0YWluIHRhcmdldC1pbmRlcGVuZGVudAorICAvLy8gY3JpdGVyaWEgKGJlaW5nIGF0IHRoZSBlbmQgb2YgYSBmdW5jdGlvbiwgaGF2aW5nIHRoZSBzYW1lIHJldHVybiB0eXBlCisgIC8vLyBhcyB0aGVpciBwYXJlbnQgZnVuY3Rpb24sIGV0Yy4pLCB1c2luZyBhbiBhbHRlcm5hdGUgQUJJIGlmIG5lY2Vzc2FyeS4KKyAgZXh0ZXJuIGJvb2wgR3VhcmFudGVlZFRhaWxDYWxsT3B0OworCisgIC8vLyBTdGFja0FsaWdubWVudCAtIE92ZXJyaWRlIGRlZmF1bHQgc3RhY2sgYWxpZ25tZW50IGZvciB0YXJnZXQuCisgIGV4dGVybiB1bnNpZ25lZCBTdGFja0FsaWdubWVudDsKKworICAvLy8gUmVhbGlnblN0YWNrIC0gVGhpcyBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzdGFjayBzaG91bGQgYmUKKyAgLy8vIGF1dG9tYXRpY2FsbHkgcmVhbGlnbmVkLCBpZiBuZWVkZWQuCisgIGV4dGVybiBib29sIFJlYWxpZ25TdGFjazsKKworICAvLy8gRGlzYWJsZUp1bXBUYWJsZXMgLSBUaGlzIGZsYWcgaW5kaWNhdGVzIGp1bXAgdGFibGVzIHNob3VsZCBub3QgYmUgCisgIC8vLyBnZW5lcmF0ZWQuCisgIGV4dGVybiBib29sIERpc2FibGVKdW1wVGFibGVzOworICAKKyAgLy8vIFN0cm9uZ1BISUVsaW0gLSBUaGlzIGZsYWcgZW5hYmxlcyBtb3JlIGFnZ3Jlc3NpdmUgUEhJIGVsaW1pbmF0aW9uCisgIC8vLyB3dGggZWFybGllciBjb3B5IGNvYWxlc2NpbmcuCisgIGV4dGVybiBib29sIFN0cm9uZ1BISUVsaW07CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkNGQwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSw3NzAgQEAKKy8vPT09IFRhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCAtIFRhcmdldCBSZWdpc3RlciBJbmZvcm1hdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyBhbiBhYnN0cmFjdCBpbnRlcmZhY2UgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYQorLy8gdGFyZ2V0IG1hY2hpbmVzIHJlZ2lzdGVyIGZpbGUuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgZm9yIGEgdmFyaWV0eSBvZgorLy8gcHVycG9zZWQsIGVzcGVjaWFsbHkgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVFJFR0lTVEVSSU5GT19ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVFJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJpdFZlY3RvcjsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVNb3ZlOworY2xhc3MgUmVnU2NhdmVuZ2VyOwordGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworCisvLy8gVGFyZ2V0UmVnaXN0ZXJEZXNjIC0gVGhpcyByZWNvcmQgY29udGFpbnMgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBrbm93biBhYm91dAorLy8vIGEgcGFydGljdWxhciByZWdpc3Rlci4gIFRoZSBBbGlhc1NldCBmaWVsZCAoaWYgbm90IG51bGwpIGNvbnRhaW5zIGEgcG9pbnRlcgorLy8vIHRvIGEgWmVybyB0ZXJtaW5hdGVkIGFycmF5IG9mIHJlZ2lzdGVycyB0aGF0IHRoaXMgcmVnaXN0ZXIgYWxpYXNlcy4gIFRoaXMgaXMKKy8vLyBuZWVkZWQgZm9yIGFyY2hpdGVjdHVyZXMgbGlrZSBYODYgd2hpY2ggaGF2ZSBBTCBhbGlhcyBBWCBhbGlhcyBFQVguCisvLy8gUmVnaXN0ZXJzIHRoYXQgdGhpcyBkb2VzIG5vdCBhcHBseSB0byBzaW1wbHkgc2hvdWxkIHNldCB0aGlzIHRvIG51bGwuCisvLy8gVGhlIFN1YlJlZ3MgZmllbGQgaXMgYSB6ZXJvIHRlcm1pbmF0ZWQgYXJyYXkgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlCisvLy8gc3ViLXJlZ2lzdGVycyBvZiB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIsIGUuZy4gQUwsIEFIIGFyZSBzdWItcmVnaXN0ZXJzIG9mIEFYLgorLy8vIFRoZSBTdXBlclJlZ3MgZmllbGQgaXMgYSB6ZXJvIHRlcm1pbmF0ZWQgYXJyYXkgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlCisvLy8gc3VwZXItcmVnaXN0ZXJzIG9mIHRoZSBzcGVjaWZpYyByZWdpc3RlciwgZS5nLiBSQVgsIEVBWCwgYXJlIHN1cGVyLXJlZ2lzdGVycworLy8vIG9mIEFYLgorLy8vCitzdHJ1Y3QgVGFyZ2V0UmVnaXN0ZXJEZXNjIHsKKyAgY29uc3QgY2hhciAgICAgKk5hbWU7ICAgICAgICAgLy8gUHJpbnRhYmxlIG5hbWUgZm9yIHRoZSByZWcgKGZvciBkZWJ1Z2dpbmcpCisgIGNvbnN0IHVuc2lnbmVkICpBbGlhc1NldDsgICAgIC8vIFJlZ2lzdGVyIEFsaWFzIFNldCwgZGVzY3JpYmVkIGFib3ZlCisgIGNvbnN0IHVuc2lnbmVkICpTdWJSZWdzOyAgICAgIC8vIFN1Yi1yZWdpc3RlciBzZXQsIGRlc2NyaWJlZCBhYm92ZQorICBjb25zdCB1bnNpZ25lZCAqU3VwZXJSZWdzOyAgICAvLyBTdXBlci1yZWdpc3RlciBzZXQsIGRlc2NyaWJlZCBhYm92ZQorfTsKKworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzcyB7CitwdWJsaWM6CisgIHR5cGVkZWYgY29uc3QgdW5zaWduZWQqIGl0ZXJhdG9yOworICB0eXBlZGVmIGNvbnN0IHVuc2lnbmVkKiBjb25zdF9pdGVyYXRvcjsKKworICB0eXBlZGVmIGNvbnN0IEVWVCogdnRfaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogY29uc3QgKiBzY19pdGVyYXRvcjsKK3ByaXZhdGU6CisgIHVuc2lnbmVkIElEOworICBjb25zdCBjaGFyICpOYW1lOworICBjb25zdCB2dF9pdGVyYXRvciBWVHM7CisgIGNvbnN0IHNjX2l0ZXJhdG9yIFN1YkNsYXNzZXM7CisgIGNvbnN0IHNjX2l0ZXJhdG9yIFN1cGVyQ2xhc3NlczsKKyAgY29uc3Qgc2NfaXRlcmF0b3IgU3ViUmVnQ2xhc3NlczsKKyAgY29uc3Qgc2NfaXRlcmF0b3IgU3VwZXJSZWdDbGFzc2VzOworICBjb25zdCB1bnNpZ25lZCBSZWdTaXplLCBBbGlnbm1lbnQ7ICAgIC8vIFNpemUgJiBBbGlnbm1lbnQgb2YgcmVnaXN0ZXIgaW4gYnl0ZXMKKyAgY29uc3QgaW50IENvcHlDb3N0OworICBjb25zdCBpdGVyYXRvciBSZWdzQmVnaW4sIFJlZ3NFbmQ7CisgIERlbnNlU2V0PHVuc2lnbmVkPiBSZWdTZXQ7CitwdWJsaWM6CisgIFRhcmdldFJlZ2lzdGVyQ2xhc3ModW5zaWduZWQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFVlQgKnZ0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICogY29uc3QgKnN1YmNzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKiBjb25zdCAqc3VwY3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqIGNvbnN0ICpzdWJyZWdjcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICogY29uc3QgKnN1cGVycmVnY3MsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUlMsIHVuc2lnbmVkIEFsLCBpbnQgQ0MsCisgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgUkIsIGl0ZXJhdG9yIFJFKQorICAgIDogSUQoaWQpLCBOYW1lKG5hbWUpLCBWVHModnRzKSwgU3ViQ2xhc3NlcyhzdWJjcyksIFN1cGVyQ2xhc3NlcyhzdXBjcyksCisgICAgU3ViUmVnQ2xhc3NlcyhzdWJyZWdjcyksIFN1cGVyUmVnQ2xhc3NlcyhzdXBlcnJlZ2NzKSwKKyAgICBSZWdTaXplKFJTKSwgQWxpZ25tZW50KEFsKSwgQ29weUNvc3QoQ0MpLCBSZWdzQmVnaW4oUkIpLCBSZWdzRW5kKFJFKSB7CisgICAgICBmb3IgKGl0ZXJhdG9yIEkgPSBSZWdzQmVnaW4sIEUgPSBSZWdzRW5kOyBJICE9IEU7ICsrSSkKKyAgICAgICAgUmVnU2V0Lmluc2VydCgqSSk7CisgICAgfQorICB2aXJ0dWFsIH5UYXJnZXRSZWdpc3RlckNsYXNzKCkge30gICAgIC8vIEFsbG93IHN1YmNsYXNzZXMKKworICAvLy8gZ2V0SUQoKSAtIFJldHVybiB0aGUgcmVnaXN0ZXIgY2xhc3MgSUQgbnVtYmVyLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBJRDsgfQorCisgIC8vLyBnZXROYW1lKCkgLSBSZXR1cm4gdGhlIHJlZ2lzdGVyIGNsYXNzIG5hbWUgZm9yIGRlYnVnZ2luZy4KKyAgLy8vCisgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgLy8vIGJlZ2luL2VuZCAtIFJldHVybiBhbGwgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGlzIGNsYXNzLgorICAvLy8KKyAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBSZWdzQmVnaW47IH0KKyAgaXRlcmF0b3IgICAgICAgICBlbmQoKSBjb25zdCB7IHJldHVybiBSZWdzRW5kOyB9CisKKyAgLy8vIGdldE51bVJlZ3MgLSBSZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcnMgaW4gdGhpcyBjbGFzcy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE51bVJlZ3MoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpKFJlZ3NFbmQtUmVnc0JlZ2luKTsgfQorCisgIC8vLyBnZXRSZWdpc3RlciAtIFJldHVybiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGluIHRoZSBjbGFzcy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldFJlZ2lzdGVyKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bVJlZ3MoKSAmJiAiUmVnaXN0ZXIgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gUmVnc0JlZ2luW2ldOworICB9CisKKyAgLy8vIGNvbnRhaW5zIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBpcyBpbmNsdWRlZCBpbiB0aGlzCisgIC8vLyByZWdpc3RlciBjbGFzcy4gIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnU2V0LmNvdW50KFJlZyk7CisgIH0KKworICAvLy8gY29udGFpbnMgLSBSZXR1cm4gdHJ1ZSBpZiBib3RoIHJlZ2lzdGVycyBhcmUgaW4gdGhpcyBjbGFzcy4KKyAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBSZWcxLCB1bnNpZ25lZCBSZWcyKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRhaW5zKFJlZzEpICYmIGNvbnRhaW5zKFJlZzIpOworICB9CisKKyAgLy8vIGhhc1R5cGUgLSByZXR1cm4gdHJ1ZSBpZiB0aGlzIFRhcmdldFJlZ2lzdGVyQ2xhc3MgaGFzIHRoZSBWYWx1ZVR5cGUgdnQuCisgIC8vLworICBib29sIGhhc1R5cGUoRVZUIHZ0KSBjb25zdCB7CisgICAgZm9yKGludCBpID0gMDsgVlRzW2ldLmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgIT0gTVZUOjpPdGhlcjsgKytpKQorICAgICAgaWYgKFZUc1tpXSA9PSB2dCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIHZ0X2JlZ2luIC8gdnRfZW5kIC0gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdmFsdWUgdHlwZXMgdGhhdCBjYW4gYmUKKyAgLy8vIHJlcHJlc2VudGVkIGJ5IHZhbHVlcyBpbiB0aGlzIHJlZ2lzdGVyIGNsYXNzLgorICB2dF9pdGVyYXRvciB2dF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gVlRzOworICB9CisKKyAgdnRfaXRlcmF0b3IgdnRfZW5kKCkgY29uc3QgeworICAgIHZ0X2l0ZXJhdG9yIEkgPSBWVHM7CisgICAgd2hpbGUgKEktPmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgIT0gTVZUOjpPdGhlcikgKytJOworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIHN1YnJlZ2NsYXNzZXNfYmVnaW4gLyBzdWJyZWdjbGFzc2VzX2VuZCAtIExvb3Agb3ZlciBhbGwgb2YKKyAgLy8vIHRoZSBzdWJyZWcgcmVnaXN0ZXIgY2xhc3NlcyBvZiB0aGlzIHJlZ2lzdGVyIGNsYXNzLgorICBzY19pdGVyYXRvciBzdWJyZWdjbGFzc2VzX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBTdWJSZWdDbGFzc2VzOworICB9CisKKyAgc2NfaXRlcmF0b3Igc3VicmVnY2xhc3Nlc19lbmQoKSBjb25zdCB7CisgICAgc2NfaXRlcmF0b3IgSSA9IFN1YlJlZ0NsYXNzZXM7CisgICAgd2hpbGUgKCpJICE9IE5VTEwpICsrSTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBnZXRTdWJSZWdpc3RlclJlZ0NsYXNzIC0gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyBvZiBzdWJyZWdpc3RlcnMgd2l0aAorICAvLy8gaW5kZXggU3ViSWR4LCBvciBOVUxMIGlmIG5vIHN1Y2ggY2xhc3MgZXhpc3RzLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBnZXRTdWJSZWdpc3RlclJlZ0NsYXNzKHVuc2lnbmVkIFN1YklkeCkgY29uc3QgeworICAgIGFzc2VydChTdWJJZHg+MCAmJiAiSW52YWxpZCBzdWJyZWdpc3RlciBpbmRleCIpOworICAgIHJldHVybiBTdWJSZWdDbGFzc2VzW1N1YklkeC0xXTsKKyAgfQorCisgIC8vLyBzdXBlcnJlZ2NsYXNzZXNfYmVnaW4gLyBzdXBlcnJlZ2NsYXNzZXNfZW5kIC0gTG9vcCBvdmVyIGFsbCBvZgorICAvLy8gdGhlIHN1cGVycmVnIHJlZ2lzdGVyIGNsYXNzZXMgb2YgdGhpcyByZWdpc3RlciBjbGFzcy4KKyAgc2NfaXRlcmF0b3Igc3VwZXJyZWdjbGFzc2VzX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBTdXBlclJlZ0NsYXNzZXM7CisgIH0KKworICBzY19pdGVyYXRvciBzdXBlcnJlZ2NsYXNzZXNfZW5kKCkgY29uc3QgeworICAgIHNjX2l0ZXJhdG9yIEkgPSBTdXBlclJlZ0NsYXNzZXM7CisgICAgd2hpbGUgKCpJICE9IE5VTEwpICsrSTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBoYXNTdWJDbGFzcyAtIHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVGFyZ2V0UmVnaXN0ZXJDbGFzcworICAvLy8gaXMgYSBwcm9wZXIgc3Vic2V0IG9mIHRoaXMgVGFyZ2V0UmVnaXN0ZXJDbGFzcy4KKyAgYm9vbCBoYXNTdWJDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpjcykgY29uc3QgeworICAgIGZvciAoaW50IGkgPSAwOyBTdWJDbGFzc2VzW2ldICE9IE5VTEw7ICsraSkKKyAgICAgIGlmIChTdWJDbGFzc2VzW2ldID09IGNzKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gc3ViY2xhc3Nlc19iZWdpbiAvIHN1YmNsYXNzZXNfZW5kIC0gTG9vcCBvdmVyIGFsbCBvZiB0aGUgY2xhc3NlcworICAvLy8gdGhhdCBhcmUgcHJvcGVyIHN1YnNldHMgb2YgdGhpcyByZWdpc3RlciBjbGFzcy4KKyAgc2NfaXRlcmF0b3Igc3ViY2xhc3Nlc19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViQ2xhc3NlczsKKyAgfQorCisgIHNjX2l0ZXJhdG9yIHN1YmNsYXNzZXNfZW5kKCkgY29uc3QgeworICAgIHNjX2l0ZXJhdG9yIEkgPSBTdWJDbGFzc2VzOworICAgIHdoaWxlICgqSSAhPSBOVUxMKSArK0k7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gaGFzU3VwZXJDbGFzcyAtIHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVGFyZ2V0UmVnaXN0ZXJDbGFzcyBpcyBhCisgIC8vLyBwcm9wZXIgc3VwZXJzZXQgb2YgdGhpcyBUYXJnZXRSZWdpc3RlckNsYXNzLgorICBib29sIGhhc1N1cGVyQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqY3MpIGNvbnN0IHsKKyAgICBmb3IgKGludCBpID0gMDsgU3VwZXJDbGFzc2VzW2ldICE9IE5VTEw7ICsraSkKKyAgICAgIGlmIChTdXBlckNsYXNzZXNbaV0gPT0gY3MpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBzdXBlcmNsYXNzZXNfYmVnaW4gLyBzdXBlcmNsYXNzZXNfZW5kIC0gTG9vcCBvdmVyIGFsbCBvZiB0aGUgY2xhc3NlcworICAvLy8gdGhhdCBhcmUgcHJvcGVyIHN1cGVyc2V0cyBvZiB0aGlzIHJlZ2lzdGVyIGNsYXNzLgorICBzY19pdGVyYXRvciBzdXBlcmNsYXNzZXNfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIFN1cGVyQ2xhc3NlczsKKyAgfQorCisgIHNjX2l0ZXJhdG9yIHN1cGVyY2xhc3Nlc19lbmQoKSBjb25zdCB7CisgICAgc2NfaXRlcmF0b3IgSSA9IFN1cGVyQ2xhc3NlczsKKyAgICB3aGlsZSAoKkkgIT0gTlVMTCkgKytJOworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIGlzQVN1YkNsYXNzIC0gcmV0dXJuIHRydWUgaWYgdGhpcyBUYXJnZXRSZWdpc3RlckNsYXNzIGlzIGEgc3Vic2V0CisgIC8vLyBjbGFzcyBvZiBhdCBsZWFzdCBvbmUgb3RoZXIgVGFyZ2V0UmVnaXN0ZXJDbGFzcy4KKyAgYm9vbCBpc0FTdWJDbGFzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3VwZXJDbGFzc2VzWzBdICE9IDA7CisgIH0KKworICAvLy8gYWxsb2NhdGlvbl9vcmRlcl9iZWdpbi9lbmQgLSBUaGVzZSBtZXRob2RzIGRlZmluZSBhIHJhbmdlIG9mIHJlZ2lzdGVycworICAvLy8gd2hpY2ggc3BlY2lmeSB0aGUgcmVnaXN0ZXJzIGluIHRoaXMgY2xhc3MgdGhhdCBhcmUgdmFsaWQgdG8gcmVnaXN0ZXIKKyAgLy8vIGFsbG9jYXRlLCBhbmQgdGhlIHByZWZlcnJlZCBvcmRlciB0byBhbGxvY2F0ZSB0aGVtIGluLiAgRm9yIGV4YW1wbGUsCisgIC8vLyBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzIHNob3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBiZWNhdXNlIGl0IGlzCisgIC8vLyBjaGVhcGVyIHRvIGFsbG9jYXRlIGNhbGxlciBzYXZlZCByZWdpc3RlcnMuCisgIC8vLworICAvLy8gVGhlc2UgbWV0aG9kcyB0YWtlIGEgTWFjaGluZUZ1bmN0aW9uIGFyZ3VtZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byB0dW5lCisgIC8vLyB0aGUgYWxsb2NhdGFibGUgcmVnaXN0ZXJzIGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGZ1bmN0aW9uLgorICAvLy8gT25lIHNpbXBsZSBleGFtcGxlIGlzIHRoYXQgdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgaWYKKyAgLy8vIGZyYW1lLXBvaW50ZXItZWxpbWluYXRpb24gaXMgcGVyZm9ybWVkLgorICAvLy8KKyAgLy8vIEJ5IGRlZmF1bHQsIHRoZXNlIG1ldGhvZHMgcmV0dXJuIGFsbCByZWdpc3RlcnMgaW4gdGhlIGNsYXNzLgorICAvLy8KKyAgdmlydHVhbCBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gYmVnaW4oKTsKKyAgfQorICB2aXJ0dWFsIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpICAgY29uc3QgeworICAgIHJldHVybiBlbmQoKTsKKyAgfQorCisgIC8vLyBnZXRTaXplIC0gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSByZWdpc3RlciBpbiBieXRlcywgd2hpY2ggaXMgYWxzbyB0aGUgc2l6ZQorICAvLy8gb2YgYSBzdGFjayBzbG90IGFsbG9jYXRlZCB0byBob2xkIGEgc3BpbGxlZCBjb3B5IG9mIHRoaXMgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIGdldFNpemUoKSBjb25zdCB7IHJldHVybiBSZWdTaXplOyB9CisKKyAgLy8vIGdldEFsaWdubWVudCAtIFJldHVybiB0aGUgbWluaW11bSByZXF1aXJlZCBhbGlnbm1lbnQgZm9yIGEgcmVnaXN0ZXIgb2YKKyAgLy8vIHRoaXMgY2xhc3MuCisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIEFsaWdubWVudDsgfQorCisgIC8vLyBnZXRDb3B5Q29zdCAtIFJldHVybiB0aGUgY29zdCBvZiBjb3B5aW5nIGEgdmFsdWUgYmV0d2VlbiB0d28gcmVnaXN0ZXJzIGluCisgIC8vLyB0aGlzIGNsYXNzLiBBIG5lZ2F0aXZlIG51bWJlciBtZWFucyB0aGUgcmVnaXN0ZXIgY2xhc3MgaXMgdmVyeSBleHBlbnNpdmUKKyAgLy8vIHRvIGNvcHkgZS5nLiBzdGF0dXMgZmxhZyByZWdpc3RlciBjbGFzc2VzLgorICBpbnQgZ2V0Q29weUNvc3QoKSBjb25zdCB7IHJldHVybiBDb3B5Q29zdDsgfQorfTsKKworCisvLy8gVGFyZ2V0UmVnaXN0ZXJJbmZvIGJhc2UgY2xhc3MgLSBXZSBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGRlZmluZXMgYSBzdGF0aWMKKy8vLyBhcnJheSBvZiBUYXJnZXRSZWdpc3RlckRlc2Mgb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhbGwgb2YgdGhlIG1hY2hpbmUKKy8vLyByZWdpc3RlcnMgdGhhdCB0aGUgdGFyZ2V0IGhhcy4gIEFzIHN1Y2gsIHdlIHNpbXBseSBoYXZlIHRvIHRyYWNrIGEgcG9pbnRlcgorLy8vIHRvIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4gdHVybiByZWdpc3RlciBudW1iZXIgaW50byBhIHJlZ2lzdGVyCisvLy8gZGVzY3JpcHRvci4KKy8vLworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvIHsKK3Byb3RlY3RlZDoKKyAgY29uc3QgdW5zaWduZWQqIFN1YnJlZ0hhc2g7CisgIGNvbnN0IHVuc2lnbmVkIFN1YnJlZ0hhc2hTaXplOworICBjb25zdCB1bnNpZ25lZCogQWxpYXNlc0hhc2g7CisgIGNvbnN0IHVuc2lnbmVkIEFsaWFzZXNIYXNoU2l6ZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICogY29uc3QgKiByZWdjbGFzc19pdGVyYXRvcjsKK3ByaXZhdGU6CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyRGVzYyAqRGVzYzsgICAgICAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciBhcnJheQorICBjb25zdCBjaGFyICpjb25zdCAqU3ViUmVnSW5kZXhOYW1lczsgICAgICAgIC8vIE5hbWVzIG9mIHN1YnJlZyBpbmRleGVzLgorICB1bnNpZ25lZCBOdW1SZWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBhcnJheQorCisgIHJlZ2NsYXNzX2l0ZXJhdG9yIFJlZ0NsYXNzQmVnaW4sIFJlZ0NsYXNzRW5kOyAgIC8vIExpc3Qgb2YgcmVnY2xhc3NlcworCisgIGludCBDYWxsRnJhbWVTZXR1cE9wY29kZSwgQ2FsbEZyYW1lRGVzdHJveU9wY29kZTsKKworcHJvdGVjdGVkOgorICBUYXJnZXRSZWdpc3RlckluZm8oY29uc3QgVGFyZ2V0UmVnaXN0ZXJEZXNjICpELCB1bnNpZ25lZCBOUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlZ2NsYXNzX2l0ZXJhdG9yIFJlZ0NsYXNzQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICByZWdjbGFzc19pdGVyYXRvciBSZWdDbGFzc0VuZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0ICpzdWJyZWdpbmRleG5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgaW50IENhbGxGcmFtZVNldHVwT3Bjb2RlID0gLTEsCisgICAgICAgICAgICAgICAgICAgICBpbnQgQ2FsbEZyYW1lRGVzdHJveU9wY29kZSA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQqIHN1YnJlZ3MgPSAwLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgc3VicmVnc2l6ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCogYWxpYXNlcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBhbGlhc2Vzc2l6ZSA9IDApOworICB2aXJ0dWFsIH5UYXJnZXRSZWdpc3RlckluZm8oKTsKK3B1YmxpYzoKKworICBlbnVtIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmUgc29tZSB0YXJnZXQgaW5kZXBlbmRlbnQgY29uc3RhbnRzCisgICAgLy8vIE5vUmVnaXN0ZXIgLSBUaGlzIHBoeXNpY2FsIHJlZ2lzdGVyIGlzIG5vdCBhIHJlYWwgdGFyZ2V0IHJlZ2lzdGVyLiAgSXQKKyAgICAvLy8gaXMgdXNlZnVsIGFzIGEgc2VudGluYWwuCisgICAgTm9SZWdpc3RlciA9IDAsCisKKyAgICAvLy8gRmlyc3RWaXJ0dWFsUmVnaXN0ZXIgLSBUaGlzIGlzIHRoZSBmaXJzdCByZWdpc3RlciBudW1iZXIgdGhhdCBpcworICAgIC8vLyBjb25zaWRlcmVkIHRvIGJlIGEgJ3ZpcnR1YWwnIHJlZ2lzdGVyLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBTU0EKKyAgICAvLy8gbmFtZXNwYWNlLiAgVGhpcyBtdXN0IGJlIHRoZSBzYW1lIGZvciBhbGwgdGFyZ2V0cywgd2hpY2ggbWVhbnMgdGhhdCBlYWNoCisgICAgLy8vIHRhcmdldCBpcyBsaW1pdGVkIHRvIHRoaXMgZml4ZWQgbnVtYmVyIG9mIHJlZ2lzdGVycy4KKyAgICBGaXJzdFZpcnR1YWxSZWdpc3RlciA9IDEwMjQKKyAgfTsKKworICAvLy8gaXNQaHlzaWNhbFJlZ2lzdGVyIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBudW1iZXIgaXMgaW4KKyAgLy8vIHRoZSBwaHlzaWNhbCByZWdpc3RlciBuYW1lc3BhY2UuCisgIHN0YXRpYyBib29sIGlzUGh5c2ljYWxSZWdpc3Rlcih1bnNpZ25lZCBSZWcpIHsKKyAgICBhc3NlcnQoUmVnICYmICJ0aGlzIGlzIG5vdCBhIHJlZ2lzdGVyISIpOworICAgIHJldHVybiBSZWcgPCBGaXJzdFZpcnR1YWxSZWdpc3RlcjsKKyAgfQorCisgIC8vLyBpc1ZpcnR1YWxSZWdpc3RlciAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgbnVtYmVyIGlzIGluCisgIC8vLyB0aGUgdmlydHVhbCByZWdpc3RlciBuYW1lc3BhY2UuCisgIHN0YXRpYyBib29sIGlzVmlydHVhbFJlZ2lzdGVyKHVuc2lnbmVkIFJlZykgeworICAgIGFzc2VydChSZWcgJiYgInRoaXMgaXMgbm90IGEgcmVnaXN0ZXIhIik7CisgICAgcmV0dXJuIFJlZyA+PSBGaXJzdFZpcnR1YWxSZWdpc3RlcjsKKyAgfQorCisgIC8vLyBnZXRNaW5pbWFsUGh5c1JlZ0NsYXNzIC0gUmV0dXJucyB0aGUgUmVnaXN0ZXIgQ2xhc3Mgb2YgYSBwaHlzaWNhbAorICAvLy8gcmVnaXN0ZXIgb2YgdGhlIGdpdmVuIHR5cGUsIHBpY2tpbmcgdGhlIG1vc3Qgc3ViIHJlZ2lzdGVyIGNsYXNzIG9mCisgIC8vLyB0aGUgcmlnaHQgdHlwZSB0aGF0IGNvbnRhaW5zIHRoaXMgcGh5c3JlZy4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgICAgZ2V0TWluaW1hbFBoeXNSZWdDbGFzcyh1bnNpZ25lZCBSZWcsIEVWVCBWVCA9IE1WVDo6T3RoZXIpIGNvbnN0OworCisgIC8vLyBnZXRBbGxvY2F0YWJsZVNldCAtIFJldHVybnMgYSBiaXRzZXQgaW5kZXhlZCBieSByZWdpc3RlciBudW1iZXIKKyAgLy8vIGluZGljYXRpbmcgaWYgYSByZWdpc3RlciBpcyBhbGxvY2F0YWJsZSBvciBub3QuIElmIGEgcmVnaXN0ZXIgY2xhc3MgaXMKKyAgLy8vIHNwZWNpZmllZCwgcmV0dXJucyB0aGUgc3Vic2V0IGZvciB0aGUgY2xhc3MuCisgIEJpdFZlY3RvciBnZXRBbGxvY2F0YWJsZVNldChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBOVUxMKSBjb25zdDsKKworICBjb25zdCBUYXJnZXRSZWdpc3RlckRlc2MgJm9wZXJhdG9yW10odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICBhc3NlcnQoUmVnTm8gPCBOdW1SZWdzICYmCisgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGFjY2VzcyByZWNvcmQgZm9yIGludmFsaWQgcmVnaXN0ZXIgbnVtYmVyISIpOworICAgIHJldHVybiBEZXNjW1JlZ05vXTsKKyAgfQorCisgIC8vLyBQcm92aWRlIGEgZ2V0IG1ldGhvZCwgZXF1aXZhbGVudCB0byBbXSwgYnV0IG1vcmUgdXNlZnVsIGlmIHdlIGhhdmUgYQorICAvLy8gcG9pbnRlciB0byB0aGlzIG9iamVjdC4KKyAgLy8vCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyRGVzYyAmZ2V0KHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIG9wZXJhdG9yW10oUmVnTm8pOworICB9CisKKyAgLy8vIGdldEFsaWFzU2V0IC0gUmV0dXJuIHRoZSBzZXQgb2YgcmVnaXN0ZXJzIGFsaWFzZWQgYnkgdGhlIHNwZWNpZmllZAorICAvLy8gcmVnaXN0ZXIsIG9yIGEgbnVsbCBsaXN0IG9mIHRoZXJlIGFyZSBub25lLiAgVGhlIGxpc3QgcmV0dXJuZWQgaXMgemVybworICAvLy8gdGVybWluYXRlZC4KKyAgLy8vCisgIGNvbnN0IHVuc2lnbmVkICpnZXRBbGlhc1NldCh1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiBnZXQoUmVnTm8pLkFsaWFzU2V0OworICB9CisKKyAgLy8vIGdldFN1YlJlZ2lzdGVycyAtIFJldHVybiB0aGUgbGlzdCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgc3ViLXJlZ2lzdGVycyBvZgorICAvLy8gdGhlIHNwZWNpZmllZCByZWdpc3Rlciwgb3IgYSBudWxsIGxpc3Qgb2YgdGhlcmUgYXJlIG5vbmUuIFRoZSBsaXN0CisgIC8vLyByZXR1cm5lZCBpcyB6ZXJvIHRlcm1pbmF0ZWQgYW5kIHNvcnRlZCBhY2NvcmRpbmcgdG8gc3VwZXItc3ViIHJlZ2lzdGVyCisgIC8vLyByZWxhdGlvbnMuIGUuZy4gWDg2OjpSQVgncyBzdWItcmVnaXN0ZXIgbGlzdCBpcyBFQVgsIEFYLCBBTCwgQUguCisgIC8vLworICBjb25zdCB1bnNpZ25lZCAqZ2V0U3ViUmVnaXN0ZXJzKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIGdldChSZWdObykuU3ViUmVnczsKKyAgfQorCisgIC8vLyBnZXRTdXBlclJlZ2lzdGVycyAtIFJldHVybiB0aGUgbGlzdCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgc3VwZXItcmVnaXN0ZXJzCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLCBvciBhIG51bGwgbGlzdCBvZiB0aGVyZSBhcmUgbm9uZS4gVGhlIGxpc3QKKyAgLy8vIHJldHVybmVkIGlzIHplcm8gdGVybWluYXRlZCBhbmQgc29ydGVkIGFjY29yZGluZyB0byBzdXBlci1zdWIgcmVnaXN0ZXIKKyAgLy8vIHJlbGF0aW9ucy4gZS5nLiBYODY6OkFMJ3Mgc3VwZXItcmVnaXN0ZXIgbGlzdCBpcyBSQVgsIEVBWCwgQVguCisgIC8vLworICBjb25zdCB1bnNpZ25lZCAqZ2V0U3VwZXJSZWdpc3RlcnModW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0KFJlZ05vKS5TdXBlclJlZ3M7CisgIH0KKworICAvLy8gZ2V0TmFtZSAtIFJldHVybiB0aGUgaHVtYW4tcmVhZGFibGUgc3ltYm9saWMgdGFyZ2V0LXNwZWNpZmljIG5hbWUgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyLgorICBjb25zdCBjaGFyICpnZXROYW1lKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIGdldChSZWdObykuTmFtZTsKKyAgfQorCisgIC8vLyBnZXROdW1SZWdzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRoaXMgdGFyZ2V0IGhhcyAodXNlZnVsIGZvcgorICAvLy8gc2l6aW5nIGFycmF5cyBob2xkaW5nIHBlciByZWdpc3RlciBpbmZvcm1hdGlvbikKKyAgdW5zaWduZWQgZ2V0TnVtUmVncygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtUmVnczsKKyAgfQorCisgIC8vLyBnZXRTdWJSZWdJbmRleE5hbWUgLSBSZXR1cm4gdGhlIGh1bWFuLXJlYWRhYmxlIHN5bWJvbGljIHRhcmdldC1zcGVjaWZpYworICAvLy8gbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBTdWJSZWdJbmRleC4KKyAgY29uc3QgY2hhciAqZ2V0U3ViUmVnSW5kZXhOYW1lKHVuc2lnbmVkIFN1YklkeCkgY29uc3QgeworICAgIGFzc2VydChTdWJJZHggJiYgIlRoaXMgaXMgbm90IGEgc3VicmVnaXN0ZXIgaW5kZXgiKTsKKyAgICByZXR1cm4gU3ViUmVnSW5kZXhOYW1lc1tTdWJJZHgtMV07CisgIH0KKworICAvLy8gcmVnc092ZXJsYXAgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byByZWdpc3RlcnMgYXJlIGVxdWFsIG9yIGFsaWFzIGVhY2gKKyAgLy8vIG90aGVyLiBUaGUgcmVnaXN0ZXJzIG1heSBiZSB2aXJ0dWFsIHJlZ2lzdGVyLgorICBib29sIHJlZ3NPdmVybGFwKHVuc2lnbmVkIHJlZ0EsIHVuc2lnbmVkIHJlZ0IpIGNvbnN0IHsKKyAgICBpZiAocmVnQSA9PSByZWdCKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoaXNWaXJ0dWFsUmVnaXN0ZXIocmVnQSkgfHwgaXNWaXJ0dWFsUmVnaXN0ZXIocmVnQikpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyByZWdBIGFuZCByZWdCIGFyZSBkaXN0aW5jdCBwaHlzaWNhbCByZWdpc3RlcnMuIERvIHRoZXkgYWxpYXM/CisgICAgc2l6ZV90IGluZGV4ID0gKHJlZ0EgKyByZWdCICogMzcpICYgKEFsaWFzZXNIYXNoU2l6ZS0xKTsKKyAgICB1bnNpZ25lZCBQcm9iZUFtdCA9IDA7CisgICAgd2hpbGUgKEFsaWFzZXNIYXNoW2luZGV4KjJdICE9IDAgJiYKKyAgICAgICAgICAgQWxpYXNlc0hhc2hbaW5kZXgqMisxXSAhPSAwKSB7CisgICAgICBpZiAoQWxpYXNlc0hhc2hbaW5kZXgqMl0gPT0gcmVnQSAmJiBBbGlhc2VzSGFzaFtpbmRleCoyKzFdID09IHJlZ0IpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBpbmRleCA9IChpbmRleCArIFByb2JlQW10KSAmIChBbGlhc2VzSGFzaFNpemUtMSk7CisgICAgICBQcm9iZUFtdCArPSAyOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBpc1N1YlJlZ2lzdGVyIC0gUmV0dXJucyB0cnVlIGlmIHJlZ0IgaXMgYSBzdWItcmVnaXN0ZXIgb2YgcmVnQS4KKyAgLy8vCisgIGJvb2wgaXNTdWJSZWdpc3Rlcih1bnNpZ25lZCByZWdBLCB1bnNpZ25lZCByZWdCKSBjb25zdCB7CisgICAgLy8gU3VicmVnSGFzaCBpcyBhIHNpbXBsZSBxdWFkcmF0aWNhbGx5IHByb2JlZCBoYXNoIHRhYmxlLgorICAgIHNpemVfdCBpbmRleCA9IChyZWdBICsgcmVnQiAqIDM3KSAmIChTdWJyZWdIYXNoU2l6ZS0xKTsKKyAgICB1bnNpZ25lZCBQcm9iZUFtdCA9IDI7CisgICAgd2hpbGUgKFN1YnJlZ0hhc2hbaW5kZXgqMl0gIT0gMCAmJgorICAgICAgICAgICBTdWJyZWdIYXNoW2luZGV4KjIrMV0gIT0gMCkgeworICAgICAgaWYgKFN1YnJlZ0hhc2hbaW5kZXgqMl0gPT0gcmVnQSAmJiBTdWJyZWdIYXNoW2luZGV4KjIrMV0gPT0gcmVnQikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGluZGV4ID0gKGluZGV4ICsgUHJvYmVBbXQpICYgKFN1YnJlZ0hhc2hTaXplLTEpOworICAgICAgUHJvYmVBbXQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNTdXBlclJlZ2lzdGVyIC0gUmV0dXJucyB0cnVlIGlmIHJlZ0IgaXMgYSBzdXBlci1yZWdpc3RlciBvZiByZWdBLgorICAvLy8KKyAgYm9vbCBpc1N1cGVyUmVnaXN0ZXIodW5zaWduZWQgcmVnQSwgdW5zaWduZWQgcmVnQikgY29uc3QgeworICAgIHJldHVybiBpc1N1YlJlZ2lzdGVyKHJlZ0IsIHJlZ0EpOworICB9CisKKyAgLy8vIGdldENhbGxlZVNhdmVkUmVncyAtIFJldHVybiBhIG51bGwtdGVybWluYXRlZCBsaXN0IG9mIGFsbCBvZiB0aGUKKyAgLy8vIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgb24gdGhpcyB0YXJnZXQuIFRoZSByZWdpc3RlciBzaG91bGQgYmUgaW4gdGhlCisgIC8vLyBvcmRlciBvZiBkZXNpcmVkIGNhbGxlZS1zYXZlIHN0YWNrIGZyYW1lIG9mZnNldC4gVGhlIGZpcnN0IHJlZ2lzdGVyIGlzCisgIC8vLyBjbG9zZWQgdG8gdGhlIGluY29taW5nIHN0YWNrIHBvaW50ZXIgaWYgc3RhY2sgZ3Jvd3MgZG93biwgYW5kIHZpY2UgdmVyc2EuCisgIHZpcnR1YWwgY29uc3QgdW5zaWduZWQqIGdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA9IDA7CisKKworICAvLy8gZ2V0UmVzZXJ2ZWRSZWdzIC0gUmV0dXJucyBhIGJpdHNldCBpbmRleGVkIGJ5IHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlcgorICAvLy8gaW5kaWNhdGluZyBpZiBhIHJlZ2lzdGVyIGlzIGEgc3BlY2lhbCByZWdpc3RlciB0aGF0IGhhcyBwYXJ0aWN1bGFyIHVzZXMKKyAgLy8vIGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCB1bmF2YWlsYWJsZSBhdCBhbGwgdGltZXMsIGUuZy4gU1AsIFJBLiBUaGlzIGlzCisgIC8vLyB1c2VkIGJ5IHJlZ2lzdGVyIHNjYXZlbmdlciB0byBkZXRlcm1pbmUgd2hhdCByZWdpc3RlcnMgYXJlIGZyZWUuCisgIHZpcnR1YWwgQml0VmVjdG9yIGdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCA9IDA7CisKKyAgLy8vIGdldFN1YlJlZyAtIFJldHVybnMgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZiBzdWItcmVnaXN0ZXIgIkluZGV4IgorICAvLy8gZm9yIHBoeXNpY2FsIHJlZ2lzdGVyIFJlZ05vLiBSZXR1cm4gemVybyBpZiB0aGUgc3ViLXJlZ2lzdGVyIGRvZXMgbm90CisgIC8vLyBleGlzdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRTdWJSZWcodW5zaWduZWQgUmVnTm8sIHVuc2lnbmVkIEluZGV4KSBjb25zdCA9IDA7CisKKyAgLy8vIGdldFN1YlJlZ0luZGV4IC0gRm9yIGEgZ2l2ZW4gcmVnaXN0ZXIgcGFpciwgcmV0dXJuIHRoZSBzdWItcmVnaXN0ZXIgaW5kZXgKKyAgLy8vIGlmIHRoZSBzZWNvbmQgcmVnaXN0ZXIgaXMgYSBzdWItcmVnaXN0ZXIgb2YgdGhlIGZpcnN0LiBSZXR1cm4gemVybworICAvLy8gb3RoZXJ3aXNlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFN1YlJlZ0luZGV4KHVuc2lnbmVkIFJlZ05vLCB1bnNpZ25lZCBTdWJSZWdObykgY29uc3QgPSAwOworCisgIC8vLyBnZXRNYXRjaGluZ1N1cGVyUmVnIC0gUmV0dXJuIGEgc3VwZXItcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCByZWdpc3RlcgorICAvLy8gUmVnIHNvIGl0cyBzdWItcmVnaXN0ZXIgb2YgaW5kZXggU3ViSWR4IGlzIFJlZy4KKyAgdW5zaWduZWQgZ2V0TWF0Y2hpbmdTdXBlclJlZyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlNScyA9IGdldFN1cGVyUmVnaXN0ZXJzKFJlZyk7IHVuc2lnbmVkIFNSID0gKlNSczsrK1NScykKKyAgICAgIGlmIChSZWcgPT0gZ2V0U3ViUmVnKFNSLCBTdWJJZHgpICYmIFJDLT5jb250YWlucyhTUikpCisgICAgICAgIHJldHVybiBTUjsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBjYW5Db21iaW5lU3ViUmVnSW5kaWNlcyAtIEdpdmVuIGEgcmVnaXN0ZXIgY2xhc3MgYW5kIGEgbGlzdCBvZgorICAvLy8gc3VicmVnaXN0ZXIgaW5kaWNlcywgcmV0dXJuIHRydWUgaWYgaXQncyBwb3NzaWJsZSB0byBjb21iaW5lIHRoZQorICAvLy8gc3VicmVnaXN0ZXIgaW5kaWNlcyBpbnRvIG9uZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgbGFyZ2VyCisgIC8vLyBzdWJyZWdpc3Rlci4gUmV0dXJuIHRoZSBuZXcgc3VicmVnaXN0ZXIgaW5kZXggYnkgcmVmZXJlbmNlLiBOb3RlIHRoZQorICAvLy8gbmV3IGluZGV4IG1heSBiZSB6ZXJvIGlmIHRoZSBnaXZlbiBzdWJyZWdpc3RlcnMgY2FuIGJlIGNvbWJpbmVkIHRvCisgIC8vLyBmb3JtIHRoZSB3aG9sZSByZWdpc3Rlci4KKyAgdmlydHVhbCBib29sIGNhbkNvbWJpbmVTdWJSZWdJbmRpY2VzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmU3ViSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOZXdTdWJJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXRNYXRjaGluZ1N1cGVyUmVnQ2xhc3MgLSBSZXR1cm4gYSBzdWJjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyCisgIC8vLyBjbGFzcyBBIHNvIHRoYXQgZWFjaCByZWdpc3RlciBpbiBpdCBoYXMgYSBzdWItcmVnaXN0ZXIgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgc3ViLXJlZ2lzdGVyIGluZGV4IHdoaWNoIGlzIGluIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MgQi4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKKyAgZ2V0TWF0Y2hpbmdTdXBlclJlZ0NsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpCLCB1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBjb21wb3NlU3ViUmVnSW5kaWNlcyAtIFJldHVybiB0aGUgc3VicmVnaXN0ZXIgaW5kZXggeW91IGdldCBmcm9tIGNvbXBvc2luZworICAvLy8gdHdvIHN1YnJlZ2lzdGVyIGluZGljZXMuCisgIC8vLworICAvLy8gSWYgUjphOmIgaXMgdGhlIHNhbWUgcmVnaXN0ZXIgYXMgUjpjLCB0aGVuIGNvbXBvc2VTdWJSZWdJbmRpY2VzKGEsIGIpCisgIC8vLyByZXR1cm5zIGMuIE5vdGUgdGhhdCBjb21wb3NlU3ViUmVnSW5kaWNlcyBkb2VzIG5vdCB0ZWxsIHlvdSBhYm91dCBpbGxlZ2FsCisgIC8vLyBjb21wb3NpdGlvbnMuIElmIFIgZG9lcyBub3QgaGF2ZSBhIHN1YnJlZyBhLCBvciBSOmEgZG9lcyBub3QgaGF2ZSBhIHN1YnJlZworICAvLy8gYiwgY29tcG9zZVN1YlJlZ0luZGljZXMgZG9lc24ndCB0ZWxsIHlvdS4KKyAgLy8vCisgIC8vLyBUaGUgQVJNIHJlZ2lzdGVyIFEwIGhhcyB0d28gRCBzdWJyZWdzIGRzdWJfMDpEMCBhbmQgZHN1Yl8xOkQxLiBJdCBhbHNvIGhhcworICAvLy8gc3N1Yl8wOlMwIC0gc3N1Yl8zOlMzIHN1YnJlZ3MuCisgIC8vLyBJZiB5b3UgY29tcG9zZSBzdWJyZWcgaW5kaWNlcyBkc3ViXzEsIHNzdWJfMCB5b3UgZ2V0IHNzdWJfMi4KKyAgLy8vCisgIHZpcnR1YWwgdW5zaWduZWQgY29tcG9zZVN1YlJlZ0luZGljZXModW5zaWduZWQgYSwgdW5zaWduZWQgYikgY29uc3QgeworICAgIC8vIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBjb3JyZWN0IGZvciBtb3N0IHRhcmdldHMuCisgICAgcmV0dXJuIGI7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUmVnaXN0ZXIgQ2xhc3MgSW5mb3JtYXRpb24KKyAgLy8KKworICAvLy8gUmVnaXN0ZXIgY2xhc3MgaXRlcmF0b3JzCisgIC8vLworICByZWdjbGFzc19pdGVyYXRvciByZWdjbGFzc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFJlZ0NsYXNzQmVnaW47IH0KKyAgcmVnY2xhc3NfaXRlcmF0b3IgcmVnY2xhc3NfZW5kKCkgY29uc3QgeyByZXR1cm4gUmVnQ2xhc3NFbmQ7IH0KKworICB1bnNpZ25lZCBnZXROdW1SZWdDbGFzc2VzKCkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpKHJlZ2NsYXNzX2VuZCgpLXJlZ2NsYXNzX2JlZ2luKCkpOworICB9CisKKyAgLy8vIGdldFJlZ0NsYXNzIC0gUmV0dXJucyB0aGUgcmVnaXN0ZXIgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnVtZXJhdGlvbgorICAvLy8gdmFsdWUuICBTZWUgY2xhc3MgVGFyZ2V0T3BlcmFuZEluZm8uCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldFJlZ0NsYXNzKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bVJlZ0NsYXNzZXMoKSAmJiAiUmVnaXN0ZXIgQ2xhc3MgSUQgb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIFJlZ0NsYXNzQmVnaW5baV07CisgIH0KKworICAvLy8gZ2V0UG9pbnRlclJlZ0NsYXNzIC0gUmV0dXJucyBhIFRhcmdldFJlZ2lzdGVyQ2xhc3MgdXNlZCBmb3IgcG9pbnRlcgorICAvLy8gdmFsdWVzLiAgSWYgYSB0YXJnZXQgc3VwcG9ydHMgbXVsdGlwbGUgZGlmZmVyZW50IHBvaW50ZXIgcmVnaXN0ZXIgY2xhc3NlcywKKyAgLy8vIGtpbmQgc3BlY2lmaWVzIHdoaWNoIG9uZSBpcyBpbmRpY2F0ZWQuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UG9pbnRlclJlZ0NsYXNzKHVuc2lnbmVkIEtpbmQ9MCkgY29uc3QgeworICAgIGFzc2VydCgwICYmICJUYXJnZXQgZGlkbid0IGltcGxlbWVudCBnZXRQb2ludGVyUmVnQ2xhc3MhIik7CisgICAgcmV0dXJuIDA7IC8vIE11c3QgcmV0dXJuIGEgdmFsdWUgaW4gb3JkZXIgdG8gY29tcGlsZSB3aXRoIFZTIDIwMDUKKyAgfQorCisgIC8vLyBnZXRDcm9zc0NvcHlSZWdDbGFzcyAtIFJldHVybnMgYSBsZWdhbCByZWdpc3RlciBjbGFzcyB0byBjb3B5IGEgcmVnaXN0ZXIKKyAgLy8vIGluIHRoZSBzcGVjaWZpZWQgY2xhc3MgdG8gb3IgZnJvbS4gUmV0dXJucyBOVUxMIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGNvcHkKKyAgLy8vIGJldHdlZW4gYSB0d28gcmVnaXN0ZXJzIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgIGdldENyb3NzQ29weVJlZ0NsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLy8gZ2V0QWxsb2NhdGlvbk9yZGVyIC0gUmV0dXJucyB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvcmRlciBmb3IgYSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyIGNsYXNzIGluIHRoZSBmb3JtIG9mIGEgcGFpciBvZiBUYXJnZXRSZWdpc3RlckNsYXNzIGl0ZXJhdG9ycy4KKyAgdmlydHVhbCBzdGQ6OnBhaXI8VGFyZ2V0UmVnaXN0ZXJDbGFzczo6aXRlcmF0b3IsVGFyZ2V0UmVnaXN0ZXJDbGFzczo6aXRlcmF0b3I+CisgIGdldEFsbG9jYXRpb25PcmRlcihjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEhpbnRUeXBlLCB1bnNpZ25lZCBIaW50UmVnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihSQy0+YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihNRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJDLT5hbGxvY2F0aW9uX29yZGVyX2VuZChNRikpOworICB9CisKKyAgLy8vIFJlc29sdmVSZWdBbGxvY0hpbnQgLSBSZXNvbHZlcyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGFsbG9jYXRpb24gaGludAorICAvLy8gdG8gYSBwaHlzaWNhbCByZWdpc3Rlci4gUmV0dXJucyB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIgaWYgaXQgaXMgc3VjY2Vzc2Z1bC4KKyAgdmlydHVhbCB1bnNpZ25lZCBSZXNvbHZlUmVnQWxsb2NIaW50KHVuc2lnbmVkIFR5cGUsIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICBpZiAoVHlwZSA9PSAwICYmIFJlZyAmJiBpc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkKKyAgICAgIHJldHVybiBSZWc7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gVXBkYXRlUmVnQWxsb2NIaW50IC0gQSBjYWxsYmFjayB0byBhbGxvdyB0YXJnZXQgYSBjaGFuY2UgdG8gdXBkYXRlCisgIC8vLyByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnRzIHdoZW4gYSByZWdpc3RlciBpcyAiY2hhbmdlZCIgKGUuZy4gY29hbGVzY2VkKQorICAvLy8gdG8gYW5vdGhlciByZWdpc3Rlci4gZS5nLiBPbiBBUk0sIHNvbWUgdmlydHVhbCByZWdpc3RlcnMgc2hvdWxkIHRhcmdldAorICAvLy8gcmVnaXN0ZXIgcGFpcnMsIGlmIG9uZSBvZiBwYWlyIGlzIGNvYWxlc2NlZCB0byBhbm90aGVyIHJlZ2lzdGVyLCB0aGUKKyAgLy8vIGFsbG9jYXRpb24gaGludCBvZiB0aGUgb3RoZXIgaGFsZiBvZiB0aGUgcGFpciBzaG91bGQgYmUgY2hhbmdlZCB0byBwb2ludAorICAvLy8gdG8gdGhlIG5ldyByZWdpc3Rlci4KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVJlZ0FsbG9jSGludCh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIE5ld1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgLy8gRG8gbm90aGluZy4KKyAgfQorCisgIC8vLyB0YXJnZXRIYW5kbGVzU3RhY2tGcmFtZVJvdW5kaW5nIC0gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgaXMKKyAgLy8vIHJlc3BvbnNpYmxlIGZvciByb3VuZGluZyB1cCB0aGUgc3RhY2sgZnJhbWUgKHByb2JhYmx5IGF0IGVtaXRQcm9sb2d1ZQorICAvLy8gdGltZSkuCisgIHZpcnR1YWwgYm9vbCB0YXJnZXRIYW5kbGVzU3RhY2tGcmFtZVJvdW5kaW5nKCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyByZXF1aXJlc1JlZ2lzdGVyU2NhdmVuZ2luZyAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IHJlcXVpcmVzIChhbmQgY2FuCisgIC8vLyBtYWtlIHVzZSBvZikgdGhlIHJlZ2lzdGVyIHNjYXZlbmdlci4KKyAgdmlydHVhbCBib29sIHJlcXVpcmVzUmVnaXN0ZXJTY2F2ZW5naW5nKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gcmVxdWlyZXNGcmFtZUluZGV4U2NhdmVuZ2luZyAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IHJlcXVpcmVzIHBvc3QKKyAgLy8vIFBFSSBzY2F2ZW5naW5nIG9mIHJlZ2lzdGVycyBmb3IgbWF0ZXJpYWxpemluZyBmcmFtZSBpbmRleCBjb25zdGFudHMuCisgIHZpcnR1YWwgYm9vbCByZXF1aXJlc0ZyYW1lSW5kZXhTY2F2ZW5naW5nKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaGFzRlAgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGEgZGVkaWNhdGVkCisgIC8vLyBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyLiBGb3IgbW9zdCB0YXJnZXRzIHRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoZSBmdW5jdGlvbgorICAvLy8gaGFzIHZhcmlhYmxlIHNpemVkIGFsbG9jYXMgb3IgaWYgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbiBpcyBkaXNhYmxlZC4KKyAgdmlydHVhbCBib29sIGhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0ID0gMDsKKworICAvLy8gaGFzUmVzZXJ2ZWRDYWxsRnJhbWUgLSBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgd2hlbiBhIGZyYW1lIHBvaW50ZXIgaXMKKyAgLy8vIG5vdCByZXF1aXJlZCwgd2UgcmVzZXJ2ZSBhcmd1bWVudCBzcGFjZSBmb3IgY2FsbCBzaXRlcyBpbiB0aGUgZnVuY3Rpb24KKyAgLy8vIGltbWVkaWF0ZWx5IG9uIGVudHJ5IHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiBUaGlzIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yCisgIC8vLyBhZGQvc3ViIHNwIGJyYWNrZXRzIGFyb3VuZCBjYWxsIHNpdGVzLiBSZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgZnJhbWUgaXMKKyAgLy8vIGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIHN0YWNrIGZyYW1lLgorICB2aXJ0dWFsIGJvb2wgaGFzUmVzZXJ2ZWRDYWxsRnJhbWUoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiAhaGFzRlAoTUYpOworICB9CisKKyAgLy8vIGNhblNpbXBsaWZ5Q2FsbEZyYW1lUHNldWRvcyAtIFdoZW4gcG9zc2libGUsIGl0J3MgYmVzdCB0byBzaW1wbGlmeSB0aGUKKyAgLy8vIGNhbGwgZnJhbWUgcHNldWRvIG9wcyBiZWZvcmUgZG9pbmcgZnJhbWUgaW5kZXggZWxpbWluYXRpb24uIFRoaXMgaXMKKyAgLy8vIHBvc3NpYmxlIG9ubHkgd2hlbiBmcmFtZSBpbmRleCByZWZlcmVuY2VzIGJldHdlZW4gdGhlIHBzZXVkb3Mgd29uJ3QKKyAgLy8vIG5lZWQgYWRqdXN0aW5nIGZvciB0aGUgY2FsbCBmcmFtZSBhZGp1c3RtZW50cy4gTm9ybWFsbHksIHRoYXQncyB0cnVlCisgIC8vLyBpZiB0aGUgZnVuY3Rpb24gaGFzIGEgcmVzZXJ2ZWQgY2FsbCBmcmFtZSBvciBhIGZyYW1lIHBvaW50ZXIuIFNvbWUKKyAgLy8vIHRhcmdldHMgKFRodW1iMiwgZm9yIGV4YW1wbGUpIG1heSBoYXZlIG1vcmUgY29tcGxpY2F0ZWQgY3JpdGVyaWEsCisgIC8vLyBob3dldmVyLCBhbmQgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IuCisgIHZpcnR1YWwgYm9vbCBjYW5TaW1wbGlmeUNhbGxGcmFtZVBzZXVkb3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiBoYXNSZXNlcnZlZENhbGxGcmFtZShNRikgfHwgaGFzRlAoTUYpOworICB9CisKKyAgLy8vIGhhc1Jlc2VydmVkU3BpbGxTbG90IC0gUmV0dXJuIHRydWUgaWYgdGFyZ2V0IGhhcyByZXNlcnZlZCBhIHNwaWxsIHNsb3QgaW4KKyAgLy8vIHRoZSBzdGFjayBmcmFtZSBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuIGUuZy4gT24KKyAgLy8vIHg4NiwgaWYgdGhlIGZyYW1lIHJlZ2lzdGVyIGlzIHJlcXVpcmVkLCB0aGUgZmlyc3QgZml4ZWQgc3RhY2sgb2JqZWN0IGlzCisgIC8vLyByZXNlcnZlZCBhcyBpdHMgc3BpbGwgc2xvdC4gVGhpcyB0ZWxscyBQRUkgbm90IHRvIGNyZWF0ZSBhIG5ldyBzdGFjayBmcmFtZQorICAvLy8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gcmVnaXN0ZXIuIEl0IHNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlcgorICAvLy8gcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlQ2FsbGVlU2F2ZWRTY2FuKCkuCisgIHZpcnR1YWwgYm9vbCBoYXNSZXNlcnZlZFNwaWxsU2xvdChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIG5lZWRzU3RhY2tSZWFsaWdubWVudCAtIHRydWUgaWYgc3RvcmFnZSB3aXRoaW4gdGhlIGZ1bmN0aW9uIHJlcXVpcmVzIHRoZQorICAvLy8gc3RhY2sgcG9pbnRlciB0byBiZSBhbGlnbmVkIG1vcmUgdGhhbiB0aGUgbm9ybWFsIGNhbGxpbmcgY29udmVudGlvbiBjYWxscworICAvLy8gZm9yLgorICB2aXJ0dWFsIGJvb2wgbmVlZHNTdGFja1JlYWxpZ25tZW50KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gZ2V0Q2FsbEZyYW1lU2V0dXAvRGVzdHJveU9wY29kZSAtIFRoZXNlIG1ldGhvZHMgcmV0dXJuIHRoZSBvcGNvZGUgb2YgdGhlCisgIC8vLyBmcmFtZSBzZXR1cC9kZXN0cm95IGluc3RydWN0aW9ucyBpZiB0aGV5IGV4aXN0ICgtMSBvdGhlcndpc2UpLiAgU29tZQorICAvLy8gdGFyZ2V0cyB1c2UgcHNldWRvIGluc3RydWN0aW9ucyBpbiBvcmRlciB0byBhYnN0cmFjdCBhd2F5IHRoZSBkaWZmZXJlbmNlCisgIC8vLyBiZXR3ZWVuIG9wZXJhdGluZyB3aXRoIGEgZnJhbWUgcG9pbnRlciBhbmQgb3BlcmF0aW5nIHdpdGhvdXQsIHRocm91Z2ggdGhlCisgIC8vLyB1c2Ugb2YgdGhlc2UgdHdvIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIGludCBnZXRDYWxsRnJhbWVTZXR1cE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIENhbGxGcmFtZVNldHVwT3Bjb2RlOyB9CisgIGludCBnZXRDYWxsRnJhbWVEZXN0cm95T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gQ2FsbEZyYW1lRGVzdHJveU9wY29kZTsgfQorCisgIC8vLyBlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0ciAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgcHJvbG9nL2VwaWxvZworICAvLy8gY29kZSBpbnNlcnRpb24gdG8gZWxpbWluYXRlIGNhbGwgZnJhbWUgc2V0dXAgYW5kIGRlc3Ryb3kgcHNldWRvCisgIC8vLyBpbnN0cnVjdGlvbnMgKGJ1dCBvbmx5IGlmIHRoZSBUYXJnZXQgaXMgdXNpbmcgdGhlbSkuICBJdCBpcyByZXNwb25zaWJsZQorICAvLy8gZm9yIGVsaW1pbmF0aW5nIHRoZXNlIGluc3RydWN0aW9ucywgcmVwbGFjaW5nIHRoZW0gd2l0aCBjb25jcmV0ZQorICAvLy8gaW5zdHJ1Y3Rpb25zLiAgVGhpcyBtZXRob2QgbmVlZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmIHVzaW5nIGNhbGwgZnJhbWUKKyAgLy8vIHNldHVwL2Rlc3Ryb3kgcHNldWRvIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZAorICBlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0Q2FsbEZyYW1lU2V0dXBPcGNvZGUoKT09IC0xICYmIGdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKT09IC0xICYmCisgICAgICAgICAgICJlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0ciBtdXN0IGJlIGltcGxlbWVudGVkIGlmIHVzaW5nIgorICAgICAgICAgICAiIGNhbGwgZnJhbWUgc2V0dXAvZGVzdHJveSBwc2V1ZG8gaW5zdHJ1Y3Rpb25zISIpOworICAgIGFzc2VydCgwICYmICJDYWxsIEZyYW1lIFBzZXVkbyBJbnN0cnVjdGlvbnMgZG8gbm90IGV4aXN0IG9uIHRoaXMgdGFyZ2V0ISIpOworICB9CisKKyAgLy8vIHByb2Nlc3NGdW5jdGlvbkJlZm9yZUNhbGxlZVNhdmVkU2NhbiAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbW1lZGlhdGVseQorICAvLy8gYmVmb3JlIFByb2xvZ0VwaWxvZ0luc2VydGVyIHNjYW5zIHRoZSBwaHlzaWNhbCByZWdpc3RlcnMgdXNlZCB0byBkZXRlcm1pbmUKKyAgLy8vIHdoYXQgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyBzaG91bGQgYmUgc3BpbGxlZC4gVGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVDYWxsZWVTYXZlZFNjYW4oTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMgPSBOVUxMKSBjb25zdCB7CisKKyAgfQorCisgIC8vLyBwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZCAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbW1lZGlhdGVseQorICAvLy8gYmVmb3JlIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24ncyBmcmFtZSBsYXlvdXQgKE1GLmdldEZyYW1lSW5mbygpKSBpcworICAvLy8gZmluYWxpemVkLiAgT25jZSB0aGUgZnJhbWUgaXMgZmluYWxpemVkLCBNT19GcmFtZUluZGV4IG9wZXJhbmRzIGFyZQorICAvLy8gcmVwbGFjZWQgd2l0aCBkaXJlY3QgY29uc3RhbnRzLiAgVGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlRnJhbWVGaW5hbGl6ZWQoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICB9CisKKyAgLy8vIHNhdmVTY2F2ZW5nZXJSZWdpc3RlciAtIFNwaWxsIHRoZSByZWdpc3RlciBzbyBpdCBjYW4gYmUgdXNlZCBieSB0aGUKKyAgLy8vIHJlZ2lzdGVyIHNjYXZlbmdlci4gUmV0dXJuIHRydWUgaWYgdGhlIHJlZ2lzdGVyIHdhcyBzcGlsbGVkLCBmYWxzZQorICAvLy8gb3RoZXJ3aXNlLiBJZiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHNwaWxsIHRoZSByZWdpc3RlciwgdGhlIHNjYXZlbmdlcgorICAvLy8gd2lsbCBpbnN0ZWFkIHNwaWxsIGl0IHRvIHRoZSBlbWVyZ2VuY3kgc3BpbGwgc2xvdC4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBzYXZlU2NhdmVuZ2VyUmVnaXN0ZXIoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJlVzZU1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBlbGltaW5hdGVGcmFtZUluZGV4IC0gVGhpcyBtZXRob2QgbXVzdCBiZSBvdmVycmlkZW4gdG8gZWxpbWluYXRlIGFic3RyYWN0CisgIC8vLyBmcmFtZSBpbmRpY2VzIGZyb20gaW5zdHJ1Y3Rpb25zIHdoaWNoIG1heSB1c2UgdGhlbS4gIFRoZSBpbnN0cnVjdGlvbgorICAvLy8gcmVmZXJlbmNlZCBieSB0aGUgaXRlcmF0b3IgY29udGFpbnMgYW4gTU9fRnJhbWVJbmRleCBvcGVyYW5kIHdoaWNoIG11c3QgYmUKKyAgLy8vIGVsaW1pbmF0ZWQgYnkgdGhpcyBtZXRob2QuICBUaGlzIG1ldGhvZCBtYXkgbW9kaWZ5IG9yIHJlcGxhY2UgdGhlCisgIC8vLyBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24sIGFzIGxvbmcgYXMgaXQga2VlcHMgdGhlIGl0ZXJhdG9yIHBvaW50aW5nIGF0IHRoZQorICAvLy8gZmluaXNoZWQgcHJvZHVjdC4gU1BBZGogaXMgdGhlIFNQIGFkanVzdG1lbnQgZHVlIHRvIGNhbGwgZnJhbWUgc2V0dXAKKyAgLy8vIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFdoZW4gLWVuYWJsZS1mcmFtZS1pbmRleC1zY2F2ZW5naW5nIGlzIGVuYWJsZWQsIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyCisgIC8vLyBhbGxvY2F0ZWQgZm9yIHRoaXMgZnJhbWUgaW5kZXggaXMgcmV0dXJuZWQgYW5kIGl0cyB2YWx1ZSBpcyBzdG9yZWQgaW4KKyAgLy8vICpWYWx1ZS4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8dW5zaWduZWQsIGludD4gRnJhbWVJbmRleFZhbHVlOworICB2aXJ0dWFsIHVuc2lnbmVkIGVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlM9TlVMTCkgY29uc3QgPSAwOworCisgIC8vLyBlbWl0UHJvbG9nL2VtaXRFcGlsb2cgLSBUaGVzZSBtZXRob2RzIGluc2VydCBwcm9sb2cgYW5kIGVwaWxvZyBjb2RlIGludG8KKyAgLy8vIHRoZSBmdW5jdGlvbi4KKyAgdmlydHVhbCB2b2lkIGVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCA9IDA7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBEZWJ1ZyBpbmZvcm1hdGlvbiBxdWVyaWVzLgorCisgIC8vLyBnZXREd2FyZlJlZ051bSAtIE1hcCBhIHRhcmdldCByZWdpc3RlciB0byBhbiBlcXVpdmFsZW50IGR3YXJmIHJlZ2lzdGVyCisgIC8vLyBudW1iZXIuICBSZXR1cm5zIC0xIGlmIHRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgdmFsdWUuICBUaGUgc2Vjb25kCisgIC8vLyBwYXJhbWV0ZXIgYWxsb3dzIHRhcmdldHMgdG8gdXNlIGRpZmZlcmVudCBudW1iZXJpbmdzIGZvciBFSCBpbmZvIGFuZAorICAvLy8gZGVidWdnaW5nIGluZm8uCisgIHZpcnR1YWwgaW50IGdldER3YXJmUmVnTnVtKHVuc2lnbmVkIFJlZ051bSwgYm9vbCBpc0VIKSBjb25zdCA9IDA7CisKKyAgLy8vIGdldEZyYW1lUmVnaXN0ZXIgLSBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSByZWdpc3RlciB1c2VkIGFzIGEgYmFzZQorICAvLy8gZm9yIHZhbHVlcyBhbGxvY2F0ZWQgaW4gdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RnJhbWVSZWdpc3Rlcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCA9IDA7CisKKyAgLy8vIGdldEZyYW1lSW5kZXhPZmZzZXQgLSBSZXR1cm5zIHRoZSBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgZnJhbWUgcmVnaXN0ZXIgdG8KKyAgLy8vIHRoZSBzdGFjayBmcmFtZSBvZiB0aGUgc3BlY2lmaWVkIGluZGV4LgorICB2aXJ0dWFsIGludCBnZXRGcmFtZUluZGV4T2Zmc2V0KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludCBGSSkgY29uc3Q7CisKKyAgLy8vIGdldEZyYW1lSW5kZXhSZWZlcmVuY2UgLSBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBiYXNlIHJlZ2lzdGVyCisgIC8vLyBhbmQgb2Zmc2V0IHVzZWQgdG8gcmVmZXJlbmNlIGEgZnJhbWUgaW5kZXggbG9jYXRpb24uIFRoZSBvZmZzZXQgaXMKKyAgLy8vIHJldHVybmVkIGRpcmVjdGx5LCBhbmQgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgcmV0dXJuZWQgdmlhIEZyYW1lUmVnLgorICB2aXJ0dWFsIGludCBnZXRGcmFtZUluZGV4UmVmZXJlbmNlKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRnJhbWVSZWcpIGNvbnN0IHsKKyAgICAvLyBCeSBkZWZhdWx0LCBhc3N1bWUgYWxsIGZyYW1lIGluZGljZXMgYXJlIHJlZmVyZW5jZWQgdmlhIHdoYXRldmVyCisgICAgLy8gZ2V0RnJhbWVSZWdpc3RlcigpIHNheXMuIFRoZSB0YXJnZXQgY2FuIG92ZXJyaWRlIHRoaXMgaWYgaXQncyBkb2luZworICAgIC8vIHNvbWV0aGluZyBkaWZmZXJlbnQuCisgICAgRnJhbWVSZWcgPSBnZXRGcmFtZVJlZ2lzdGVyKE1GKTsKKyAgICByZXR1cm4gZ2V0RnJhbWVJbmRleE9mZnNldChNRiwgRkkpOworICB9CisKKyAgLy8vIGdldFJBUmVnaXN0ZXIgLSBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSByZWdpc3RlciB3aGVyZSB0aGUgcmV0dXJuCisgIC8vLyBhZGRyZXNzIGNhbiBiZSBmb3VuZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRSQVJlZ2lzdGVyKCkgY29uc3QgPSAwOworCisgIC8vLyBnZXRJbml0aWFsRnJhbWVTdGF0ZSAtIFJldHVybnMgYSBsaXN0IG9mIG1hY2hpbmUgbW92ZXMgdGhhdCBhcmUgYXNzdW1lZAorICAvLy8gb24gZW50cnkgdG8gYWxsIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCBMYWJlbElEIGlzIGlnbm9yZWQgKGFzc3VtZWQgdG8gYmUKKyAgLy8vIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uLikKKyAgdmlydHVhbCB2b2lkIGdldEluaXRpYWxGcmFtZVN0YXRlKHN0ZDo6dmVjdG9yPE1hY2hpbmVNb3ZlPiAmTW92ZXMpIGNvbnN0OworfTsKKworCisvLyBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIEluZGV4ZWRNYXBzIGtleWVkIG9uIHZpcnR1YWwgcmVnaXN0ZXJzCitzdHJ1Y3QgVmlydFJlZzJJbmRleEZ1bmN0b3IgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjx1bnNpZ25lZCwgdW5zaWduZWQ+IHsKKyAgdW5zaWduZWQgb3BlcmF0b3IoKSh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnIC0gVGFyZ2V0UmVnaXN0ZXJJbmZvOjpGaXJzdFZpcnR1YWxSZWdpc3RlcjsKKyAgfQorfTsKKworLy8vIGdldENvbW1vblN1YkNsYXNzIC0gZmluZCB0aGUgbGFyZ2VzdCBjb21tb24gc3ViY2xhc3Mgb2YgQSBhbmQgQi4gUmV0dXJuIE5VTEwKKy8vLyBpZiB0aGVyZSBpcyBubyBjb21tb24gc3ViY2xhc3MuCitjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpnZXRDb21tb25TdWJDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQik7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MTdiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgKQEAgLTAsMCArMSw3MjEgQEAKKy8vPT09LS0gVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmggLSBUYXJnZXQgUmVnaXN0cmF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgdGhlIFRhcmdldFJlZ2lzdHJ5IGludGVyZmFjZSwgd2hpY2ggdG9vbHMgY2FuIHVzZSB0byBhY2Nlc3MKKy8vIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQgc3BlY2lmaWMgY2xhc3NlcyAoVGFyZ2V0TWFjaGluZSwgQXNtUHJpbnRlciwgZXRjLikKKy8vIHdoaWNoIGhhdmUgYmVlbiByZWdpc3RlcmVkLgorLy8KKy8vIFRhcmdldCBzcGVjaWZpYyBjbGFzcyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgdXNpbmcgdGhlCisvLyBhcHByb3ByaWF0ZSBUYXJnZXRSZWdpc3RyeSBpbnRlcmZhY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfVEFSR0VUUkVHSVNUUllfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRSRUdJU1RSWV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBc21QcmludGVyOworICBjbGFzcyBNb2R1bGU7CisgIGNsYXNzIE1DQXNzZW1ibGVyOworICBjbGFzcyBNQ0FzbUluZm87CisgIGNsYXNzIE1DQXNtUGFyc2VyOworICBjbGFzcyBNQ0NvZGVFbWl0dGVyOworICBjbGFzcyBNQ0NvbnRleHQ7CisgIGNsYXNzIE1DRGlzYXNzZW1ibGVyOworICBjbGFzcyBNQ0luc3RQcmludGVyOworICBjbGFzcyBNQ1N0cmVhbWVyOworICBjbGFzcyBUYXJnZXRBc21CYWNrZW5kOworICBjbGFzcyBUYXJnZXRBc21MZXhlcjsKKyAgY2xhc3MgVGFyZ2V0QXNtUGFyc2VyOworICBjbGFzcyBUYXJnZXRNYWNoaW5lOworICBjbGFzcyByYXdfb3N0cmVhbTsKKworICAvLy8gVGFyZ2V0IC0gV3JhcHBlciBmb3IgVGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIEZvciByZWdpc3RyYXRpb24gcHVycG9zZXMsIHRoaXMgaXMgYSBQT0QgdHlwZSBzbyB0aGF0IHRhcmdldHMgY2FuIGJlCisgIC8vLyByZWdpc3RlcmVkIHdpdGhvdXQgdGhlIHVzZSBvZiBzdGF0aWMgY29uc3RydWN0b3JzLgorICAvLy8KKyAgLy8vIFRhcmdldHMgc2hvdWxkIGltcGxlbWVudCBhIHNpbmdsZSBnbG9iYWwgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyAod2hpY2gKKyAgLy8vIHdpbGwgYmUgemVybyBpbml0aWFsaXplZCksIGFuZCBwYXNzIHRoYXQgaW5zdGFuY2UgdG8gdGhlIFRhcmdldFJlZ2lzdHJ5IGFzCisgIC8vLyBwYXJ0IG9mIHRoZWlyIGluaXRpYWxpemF0aW9uLgorICBjbGFzcyBUYXJnZXQgeworICBwdWJsaWM6CisgICAgZnJpZW5kIHN0cnVjdCBUYXJnZXRSZWdpc3RyeTsKKworICAgIHR5cGVkZWYgdW5zaWduZWQgKCpUcmlwbGVNYXRjaFF1YWxpdHlGblR5KShjb25zdCBzdGQ6OnN0cmluZyAmVFQpOworCisgICAgdHlwZWRlZiBNQ0FzbUluZm8gKigqQXNtSW5mb0N0b3JGblR5KShjb25zdCBUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVFQpOworICAgIHR5cGVkZWYgVGFyZ2V0TWFjaGluZSAqKCpUYXJnZXRNYWNoaW5lQ3RvclR5KShjb25zdCBUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZlYXR1cmVzKTsKKyAgICB0eXBlZGVmIEFzbVByaW50ZXIgKigqQXNtUHJpbnRlckN0b3JUeSkoVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3RyZWFtZXIgJlN0cmVhbWVyKTsKKyAgICB0eXBlZGVmIFRhcmdldEFzbUJhY2tlbmQgKigqQXNtQmFja2VuZEN0b3JUeSkoY29uc3QgVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVFQpOworICAgIHR5cGVkZWYgVGFyZ2V0QXNtTGV4ZXIgKigqQXNtTGV4ZXJDdG9yVHkpKGNvbnN0IFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUluZm8gJk1BSSk7CisgICAgdHlwZWRlZiBUYXJnZXRBc21QYXJzZXIgKigqQXNtUGFyc2VyQ3RvclR5KShjb25zdCBUYXJnZXQgJlQsTUNBc21QYXJzZXIgJlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRNYWNoaW5lICZUTSk7CisgICAgdHlwZWRlZiBNQ0Rpc2Fzc2VtYmxlciAqKCpNQ0Rpc2Fzc2VtYmxlckN0b3JUeSkoY29uc3QgVGFyZ2V0ICZUKTsKKyAgICB0eXBlZGVmIE1DSW5zdFByaW50ZXIgKigqTUNJbnN0UHJpbnRlckN0b3JUeSkoY29uc3QgVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTeW50YXhWYXJpYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUluZm8gJk1BSSk7CisgICAgdHlwZWRlZiBNQ0NvZGVFbWl0dGVyICooKkNvZGVFbWl0dGVyQ3RvclR5KShjb25zdCBUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KTsKKyAgICB0eXBlZGVmIE1DU3RyZWFtZXIgKigqT2JqZWN0U3RyZWFtZXJDdG9yVHkpKGNvbnN0IFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNtQmFja2VuZCAmVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJl9PUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29kZUVtaXR0ZXIgKl9FbWl0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWxheEFsbCk7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gTmV4dCAtIFRoZSBuZXh0IHJlZ2lzdGVyZWQgdGFyZ2V0IGluIHRoZSBsaW5rZWQgbGlzdCwgbWFpbnRhaW5lZCBieSB0aGUKKyAgICAvLy8gVGFyZ2V0UmVnaXN0cnkuCisgICAgVGFyZ2V0ICpOZXh0OworCisgICAgLy8vIFRyaXBsZU1hdGNoUXVhbGl0eUZuIC0gVGhlIHRhcmdldCBmdW5jdGlvbiBmb3IgcmF0aW5nIHRoZSBtYXRjaCBxdWFsaXR5CisgICAgLy8vIG9mIGEgdHJpcGxlLgorICAgIFRyaXBsZU1hdGNoUXVhbGl0eUZuVHkgVHJpcGxlTWF0Y2hRdWFsaXR5Rm47CisKKyAgICAvLy8gTmFtZSAtIFRoZSB0YXJnZXQgbmFtZS4KKyAgICBjb25zdCBjaGFyICpOYW1lOworCisgICAgLy8vIFNob3J0RGVzYyAtIEEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHRhcmdldC4KKyAgICBjb25zdCBjaGFyICpTaG9ydERlc2M7CisKKyAgICAvLy8gSGFzSklUIC0gV2hldGhlciB0aGlzIHRhcmdldCBzdXBwb3J0cyB0aGUgSklULgorICAgIGJvb2wgSGFzSklUOworCisgICAgQXNtSW5mb0N0b3JGblR5IEFzbUluZm9DdG9yRm47CisKKyAgICAvLy8gVGFyZ2V0TWFjaGluZUN0b3JGbiAtIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAgIC8vLyBUYXJnZXRNYWNoaW5lLCBpZiByZWdpc3RlcmVkLgorICAgIFRhcmdldE1hY2hpbmVDdG9yVHkgVGFyZ2V0TWFjaGluZUN0b3JGbjsKKworICAgIC8vLyBBc21CYWNrZW5kQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzCisgICAgLy8vIFRhcmdldEFzbUJhY2tlbmQsIGlmIHJlZ2lzdGVyZWQuCisgICAgQXNtQmFja2VuZEN0b3JUeSBBc21CYWNrZW5kQ3RvckZuOworCisgICAgLy8vIEFzbUxleGVyQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzIFRhcmdldEFzbUxleGVyLAorICAgIC8vLyBpZiByZWdpc3RlcmVkLgorICAgIEFzbUxleGVyQ3RvclR5IEFzbUxleGVyQ3RvckZuOworCisgICAgLy8vIEFzbVBhcnNlckN0b3JGbiAtIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAgIC8vLyBUYXJnZXRBc21QYXJzZXIsIGlmIHJlZ2lzdGVyZWQuCisgICAgQXNtUGFyc2VyQ3RvclR5IEFzbVBhcnNlckN0b3JGbjsKKworICAgIC8vLyBBc21QcmludGVyQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzIEFzbVByaW50ZXIsCisgICAgLy8vIGlmIHJlZ2lzdGVyZWQuCisgICAgQXNtUHJpbnRlckN0b3JUeSBBc21QcmludGVyQ3RvckZuOworCisgICAgLy8vIE1DRGlzYXNzZW1ibGVyQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzCisgICAgLy8vIE1DRGlzYXNzZW1ibGVyLCBpZiByZWdpc3RlcmVkLgorICAgIE1DRGlzYXNzZW1ibGVyQ3RvclR5IE1DRGlzYXNzZW1ibGVyQ3RvckZuOworCisgICAgLy8vIE1DSW5zdFByaW50ZXJDdG9yRm4gLSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MKKyAgICAvLy8gTUNJbnN0UHJpbnRlciwgaWYgcmVnaXN0ZXJlZC4KKyAgICBNQ0luc3RQcmludGVyQ3RvclR5IE1DSW5zdFByaW50ZXJDdG9yRm47CisKKyAgICAvLy8gQ29kZUVtaXR0ZXJDdG9yRm4gLSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MgQ29kZUVtaXR0ZXIsCisgICAgLy8vIGlmIHJlZ2lzdGVyZWQuCisgICAgQ29kZUVtaXR0ZXJDdG9yVHkgQ29kZUVtaXR0ZXJDdG9yRm47CisKKyAgICAvLy8gT2JqZWN0U3RyZWFtZXJDdG9yRm4gLSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MKKyAgICAvLy8gT2JqZWN0U3RyZWFtZXIsIGlmIHJlZ2lzdGVyZWQuCisgICAgT2JqZWN0U3RyZWFtZXJDdG9yVHkgT2JqZWN0U3RyZWFtZXJDdG9yRm47CisKKyAgcHVibGljOgorICAgIC8vLyBAbmFtZSBUYXJnZXQgSW5mb3JtYXRpb24KKyAgICAvLy8gQHsKKworICAgIC8vIGdldE5leHQgLSBSZXR1cm4gdGhlIG5leHQgcmVnaXN0ZXJlZCB0YXJnZXQuCisgICAgY29uc3QgVGFyZ2V0ICpnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gTmV4dDsgfQorCisgICAgLy8vIGdldE5hbWUgLSBHZXQgdGhlIHRhcmdldCBuYW1lLgorICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgICAvLy8gZ2V0U2hvcnREZXNjcmlwdGlvbiAtIEdldCBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSB0YXJnZXQuCisgICAgY29uc3QgY2hhciAqZ2V0U2hvcnREZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIFNob3J0RGVzYzsgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIEZlYXR1cmUgUHJlZGljYXRlcworICAgIC8vLyBAeworCisgICAgLy8vIGhhc0pJVCAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0cyBzdXBwb3J0cyB0aGUganVzdC1pbi10aW1lIGNvbXBpbGF0aW9uLgorICAgIGJvb2wgaGFzSklUKCkgY29uc3QgeyByZXR1cm4gSGFzSklUOyB9CisKKyAgICAvLy8gaGFzVGFyZ2V0TWFjaGluZSAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIGNvZGUgZ2VuZXJhdGlvbi4KKyAgICBib29sIGhhc1RhcmdldE1hY2hpbmUoKSBjb25zdCB7IHJldHVybiBUYXJnZXRNYWNoaW5lQ3RvckZuICE9IDA7IH0KKworICAgIC8vLyBoYXNBc21CYWNrZW5kIC0gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgLm8gZ2VuZXJhdGlvbi4KKyAgICBib29sIGhhc0FzbUJhY2tlbmQoKSBjb25zdCB7IHJldHVybiBBc21CYWNrZW5kQ3RvckZuICE9IDA7IH0KKworICAgIC8vLyBoYXNBc21MZXhlciAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIC5zIGxleGluZy4KKyAgICBib29sIGhhc0FzbUxleGVyKCkgY29uc3QgeyByZXR1cm4gQXNtTGV4ZXJDdG9yRm4gIT0gMDsgfQorCisgICAgLy8vIGhhc0FzbVBhcnNlciAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIC5zIHBhcnNpbmcuCisgICAgYm9vbCBoYXNBc21QYXJzZXIoKSBjb25zdCB7IHJldHVybiBBc21QYXJzZXJDdG9yRm4gIT0gMDsgfQorCisgICAgLy8vIGhhc0FzbVByaW50ZXIgLSBDaGVjayBpZiB0aGlzIHRhcmdldCBzdXBwb3J0cyAucyBwcmludGluZy4KKyAgICBib29sIGhhc0FzbVByaW50ZXIoKSBjb25zdCB7IHJldHVybiBBc21QcmludGVyQ3RvckZuICE9IDA7IH0KKworICAgIC8vLyBoYXNNQ0Rpc2Fzc2VtYmxlciAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGhhcyBhIGRpc2Fzc2VtYmxlci4KKyAgICBib29sIGhhc01DRGlzYXNzZW1ibGVyKCkgY29uc3QgeyByZXR1cm4gTUNEaXNhc3NlbWJsZXJDdG9yRm4gIT0gMDsgfQorCisgICAgLy8vIGhhc01DSW5zdFByaW50ZXIgLSBDaGVjayBpZiB0aGlzIHRhcmdldCBoYXMgYW4gaW5zdHJ1Y3Rpb24gcHJpbnRlci4KKyAgICBib29sIGhhc01DSW5zdFByaW50ZXIoKSBjb25zdCB7IHJldHVybiBNQ0luc3RQcmludGVyQ3RvckZuICE9IDA7IH0KKworICAgIC8vLyBoYXNDb2RlRW1pdHRlciAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIGluc3RydWN0aW9uIGVuY29kaW5nLgorICAgIGJvb2wgaGFzQ29kZUVtaXR0ZXIoKSBjb25zdCB7IHJldHVybiBDb2RlRW1pdHRlckN0b3JGbiAhPSAwOyB9CisKKyAgICAvLy8gaGFzT2JqZWN0U3RyZWFtZXIgLSBDaGVjayBpZiB0aGlzIHRhcmdldCBzdXBwb3J0cyBzdHJlYW1pbmcgdG8gZmlsZXMuCisgICAgYm9vbCBoYXNPYmplY3RTdHJlYW1lcigpIGNvbnN0IHsgcmV0dXJuIE9iamVjdFN0cmVhbWVyQ3RvckZuICE9IDA7IH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBGZWF0dXJlIENvbnN0cnVjdG9ycworICAgIC8vLyBAeworCisgICAgLy8vIGNyZWF0ZUFzbUluZm8gLSBDcmVhdGUgYSBNQ0FzbUluZm8gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gdGFyZ2V0IHRyaXBsZS4KKyAgICAvLy8KKyAgICAvLy8gXGFyZyBUcmlwbGUgLSBUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0YXJnZXQgbWFjaGluZQorICAgIC8vLyBmZWF0dXJlIHNldDsgaXQgc2hvdWxkIGFsd2F5cyBiZSBwcm92aWRlZC4gR2VuZXJhbGx5IHRoaXMgc2hvdWxkIGJlCisgICAgLy8vIGVpdGhlciB0aGUgdGFyZ2V0IHRyaXBsZSBmcm9tIHRoZSBtb2R1bGUsIG9yIHRoZSB0YXJnZXQgdHJpcGxlIG9mIHRoZQorICAgIC8vLyBob3N0IGlmIHRoYXQgZG9lcyBub3QgZXhpc3QuCisgICAgTUNBc21JbmZvICpjcmVhdGVBc21JbmZvKFN0cmluZ1JlZiBUcmlwbGUpIGNvbnN0IHsKKyAgICAgIGlmICghQXNtSW5mb0N0b3JGbikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gQXNtSW5mb0N0b3JGbigqdGhpcywgVHJpcGxlKTsKKyAgICB9CisKKyAgICAvLy8gY3JlYXRlVGFyZ2V0TWFjaGluZSAtIENyZWF0ZSBhIHRhcmdldCBzcGVjaWZpYyBtYWNoaW5lIGltcGxlbWVudGF0aW9uCisgICAgLy8vIGZvciB0aGUgc3BlY2lmaWVkIFxhcmcgVHJpcGxlLgorICAgIC8vLworICAgIC8vLyBcYXJnIFRyaXBsZSAtIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBtYWNoaW5lCisgICAgLy8vIGZlYXR1cmUgc2V0OyBpdCBzaG91bGQgYWx3YXlzIGJlIHByb3ZpZGVkLiBHZW5lcmFsbHkgdGhpcyBzaG91bGQgYmUKKyAgICAvLy8gZWl0aGVyIHRoZSB0YXJnZXQgdHJpcGxlIGZyb20gdGhlIG1vZHVsZSwgb3IgdGhlIHRhcmdldCB0cmlwbGUgb2YgdGhlCisgICAgLy8vIGhvc3QgaWYgdGhhdCBkb2VzIG5vdCBleGlzdC4KKyAgICBUYXJnZXRNYWNoaW5lICpjcmVhdGVUYXJnZXRNYWNoaW5lKGNvbnN0IHN0ZDo6c3RyaW5nICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRmVhdHVyZXMpIGNvbnN0IHsKKyAgICAgIGlmICghVGFyZ2V0TWFjaGluZUN0b3JGbikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gVGFyZ2V0TWFjaGluZUN0b3JGbigqdGhpcywgVHJpcGxlLCBGZWF0dXJlcyk7CisgICAgfQorCisgICAgLy8vIGNyZWF0ZUFzbUJhY2tlbmQgLSBDcmVhdGUgYSB0YXJnZXQgc3BlY2lmaWMgYXNzZW1ibHkgcGFyc2VyLgorICAgIC8vLworICAgIC8vLyBcYXJnIFRyaXBsZSAtIFRoZSB0YXJnZXQgdHJpcGxlIHN0cmluZy4KKyAgICAvLy8gXGFyZyBCYWNrZW5kIC0gVGhlIHRhcmdldCBpbmRlcGVuZGVudCBhc3NlbWJsZXIgb2JqZWN0LgorICAgIFRhcmdldEFzbUJhY2tlbmQgKmNyZWF0ZUFzbUJhY2tlbmQoY29uc3Qgc3RkOjpzdHJpbmcgJlRyaXBsZSkgY29uc3QgeworICAgICAgaWYgKCFBc21CYWNrZW5kQ3RvckZuKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHJldHVybiBBc21CYWNrZW5kQ3RvckZuKCp0aGlzLCBUcmlwbGUpOworICAgIH0KKworICAgIC8vLyBjcmVhdGVBc21MZXhlciAtIENyZWF0ZSBhIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJseSBsZXhlci4KKyAgICAvLy8KKyAgICBUYXJnZXRBc21MZXhlciAqY3JlYXRlQXNtTGV4ZXIoY29uc3QgTUNBc21JbmZvICZNQUkpIGNvbnN0IHsKKyAgICAgIGlmICghQXNtTGV4ZXJDdG9yRm4pCisgICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIEFzbUxleGVyQ3RvckZuKCp0aGlzLCBNQUkpOworICAgIH0KKworICAgIC8vLyBjcmVhdGVBc21QYXJzZXIgLSBDcmVhdGUgYSB0YXJnZXQgc3BlY2lmaWMgYXNzZW1ibHkgcGFyc2VyLgorICAgIC8vLworICAgIC8vLyBcYXJnIFBhcnNlciAtIFRoZSB0YXJnZXQgaW5kZXBlbmRlbnQgcGFyc2VyIGltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IKKyAgICAvLy8gcGFyc2luZyBhbmQgbGV4aW5nLgorICAgIFRhcmdldEFzbVBhcnNlciAqY3JlYXRlQXNtUGFyc2VyKE1DQXNtUGFyc2VyICZQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IHsKKyAgICAgIGlmICghQXNtUGFyc2VyQ3RvckZuKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHJldHVybiBBc21QYXJzZXJDdG9yRm4oKnRoaXMsIFBhcnNlciwgVE0pOworICAgIH0KKworICAgIC8vLyBjcmVhdGVBc21QcmludGVyIC0gQ3JlYXRlIGEgdGFyZ2V0IHNwZWNpZmljIGFzc2VtYmx5IHByaW50ZXIgcGFzcy4gIFRoaXMKKyAgICAvLy8gdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBNQ1N0cmVhbWVyIG9iamVjdC4KKyAgICBBc21QcmludGVyICpjcmVhdGVBc21QcmludGVyKFRhcmdldE1hY2hpbmUgJlRNLCBNQ1N0cmVhbWVyICZTdHJlYW1lcikgY29uc3R7CisgICAgICBpZiAoIUFzbVByaW50ZXJDdG9yRm4pCisgICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIEFzbVByaW50ZXJDdG9yRm4oVE0sIFN0cmVhbWVyKTsKKyAgICB9CisKKyAgICBNQ0Rpc2Fzc2VtYmxlciAqY3JlYXRlTUNEaXNhc3NlbWJsZXIoKSBjb25zdCB7CisgICAgICBpZiAoIU1DRGlzYXNzZW1ibGVyQ3RvckZuKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHJldHVybiBNQ0Rpc2Fzc2VtYmxlckN0b3JGbigqdGhpcyk7CisgICAgfQorCisgICAgTUNJbnN0UHJpbnRlciAqY3JlYXRlTUNJbnN0UHJpbnRlcih1bnNpZ25lZCBTeW50YXhWYXJpYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICZNQUkpIGNvbnN0IHsKKyAgICAgIGlmICghTUNJbnN0UHJpbnRlckN0b3JGbikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gTUNJbnN0UHJpbnRlckN0b3JGbigqdGhpcywgU3ludGF4VmFyaWFudCwgTUFJKTsKKyAgICB9CisKKworICAgIC8vLyBjcmVhdGVDb2RlRW1pdHRlciAtIENyZWF0ZSBhIHRhcmdldCBzcGVjaWZpYyBjb2RlIGVtaXR0ZXIuCisgICAgTUNDb2RlRW1pdHRlciAqY3JlYXRlQ29kZUVtaXR0ZXIoVGFyZ2V0TWFjaGluZSAmVE0sIE1DQ29udGV4dCAmQ3R4KSBjb25zdCB7CisgICAgICBpZiAoIUNvZGVFbWl0dGVyQ3RvckZuKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHJldHVybiBDb2RlRW1pdHRlckN0b3JGbigqdGhpcywgVE0sIEN0eCk7CisgICAgfQorCisgICAgLy8vIGNyZWF0ZU9iamVjdFN0cmVhbWVyIC0gQ3JlYXRlIGEgdGFyZ2V0IHNwZWNpZmljIE1DU3RyZWFtZXIuCisgICAgLy8vCisgICAgLy8vIFxhcmcgVFQgLSBUaGUgdGFyZ2V0IHRyaXBsZS4KKyAgICAvLy8gXGFyZyBDdHggLSBUaGUgdGFyZ2V0IGNvbnRleHQuCisgICAgLy8vIFxhcmcgVEFCIC0gVGhlIHRhcmdldCBhc3NlbWJsZXIgYmFja2VuZCBvYmplY3QuIFRha2VzIG93bmVyc2hpcC4KKyAgICAvLy8gXGFyZyBfT1MgLSBUaGUgc3RyZWFtIG9iamVjdC4KKyAgICAvLy8gXGFyZyBfRW1pdHRlciAtIFRoZSB0YXJnZXQgaW5kZXBlbmRlbnQgYXNzZW1ibGVyIG9iamVjdC5UYWtlcyBvd25lcnNoaXAuCisgICAgLy8vIFxhcmcgUmVsYXhBbGwgLSBSZWxheCBhbGwgZml4dXBzPworICAgIE1DU3RyZWFtZXIgKmNyZWF0ZU9iamVjdFN0cmVhbWVyKGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNtQmFja2VuZCAmVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZfT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb2RlRW1pdHRlciAqX0VtaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWxheEFsbCkgY29uc3QgeworICAgICAgaWYgKCFPYmplY3RTdHJlYW1lckN0b3JGbikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gT2JqZWN0U3RyZWFtZXJDdG9yRm4oKnRoaXMsIFRULCBDdHgsIFRBQiwgX09TLCBfRW1pdHRlciwgUmVsYXhBbGwpOworICAgIH0KKworICAgIC8vLyBAfQorICB9OworCisgIC8vLyBUYXJnZXRSZWdpc3RyeSAtIEdlbmVyaWMgaW50ZXJmYWNlIHRvIHRhcmdldCBzcGVjaWZpYyBmZWF0dXJlcy4KKyAgc3RydWN0IFRhcmdldFJlZ2lzdHJ5IHsKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICBjb25zdCBUYXJnZXQgKkN1cnJlbnQ7CisgICAgICBleHBsaWNpdCBpdGVyYXRvcihUYXJnZXQgKlQpIDogQ3VycmVudChUKSB7fQorICAgICAgZnJpZW5kIHN0cnVjdCBUYXJnZXRSZWdpc3RyeTsKKyAgICBwdWJsaWM6CisgICAgICBpdGVyYXRvcihjb25zdCBpdGVyYXRvciAmSSkgOiBDdXJyZW50KEkuQ3VycmVudCkge30KKyAgICAgIGl0ZXJhdG9yKCkgOiBDdXJyZW50KDApIHt9CisKKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciAmeCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ3VycmVudCA9PSB4LkN1cnJlbnQ7CisgICAgICB9CisgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3IgJngpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KHgpOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRvciB0cmF2ZXJzYWw6IGZvcndhcmQgaXRlcmF0aW9uIG9ubHkKKyAgICAgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICAgICAgYXNzZXJ0KEN1cnJlbnQgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgICAgICBDdXJyZW50ID0gQ3VycmVudC0+Z2V0TmV4dCgpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICBpdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgICAgICBpdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICAgICAgKysqdGhpczsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICAgIH0KKworICAgICAgY29uc3QgVGFyZ2V0ICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgICAgIGFzc2VydChDdXJyZW50ICYmICJDYW5ub3QgZGVyZWZlcmVuY2UgZW5kIGl0ZXJhdG9yISIpOworICAgICAgICByZXR1cm4gKkN1cnJlbnQ7CisgICAgICB9CisKKyAgICAgIGNvbnN0IFRhcmdldCAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICZvcGVyYXRvciooKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgLy8vIEBuYW1lIFJlZ2lzdHJ5IEFjY2VzcworICAgIC8vLyBAeworCisgICAgc3RhdGljIGl0ZXJhdG9yIGJlZ2luKCk7CisKKyAgICBzdGF0aWMgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorCisgICAgLy8vIGxvb2t1cFRhcmdldCAtIExvb2t1cCBhIHRhcmdldCBiYXNlZCBvbiBhIHRhcmdldCB0cmlwbGUuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBUcmlwbGUgLSBUaGUgdHJpcGxlIHRvIHVzZSBmb3IgZmluZGluZyBhIHRhcmdldC4KKyAgICAvLy8gXHBhcmFtIEVycm9yIC0gT24gZmFpbHVyZSwgYW4gZXJyb3Igc3RyaW5nIGRlc2NyaWJpbmcgd2h5IG5vIHRhcmdldCB3YXMKKyAgICAvLy8gZm91bmQuCisgICAgc3RhdGljIGNvbnN0IFRhcmdldCAqbG9va3VwVGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZFcnJvcik7CisKKyAgICAvLy8gZ2V0Q2xvc2VzdFRhcmdldEZvckpJVCAtIFBpY2sgdGhlIGJlc3QgdGFyZ2V0IHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoCisgICAgLy8vIHRoZSBjdXJyZW50IGhvc3QuICBJZiBubyBjbG9zZSB0YXJnZXQgY2FuIGJlIGZvdW5kLCB0aGlzIHJldHVybnMgbnVsbAorICAgIC8vLyBhbmQgc2V0cyB0aGUgRXJyb3Igc3RyaW5nIHRvIGEgcmVhc29uLgorICAgIC8vLworICAgIC8vLyBNYWludGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHRocm91Z2ggMi42LgorICAgIHN0YXRpYyBjb25zdCBUYXJnZXQgKmdldENsb3Nlc3RUYXJnZXRGb3JKSVQoc3RkOjpzdHJpbmcgJkVycm9yKTsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBUYXJnZXQgUmVnaXN0cmF0aW9uCisgICAgLy8vIEB7CisKKyAgICAvLy8gUmVnaXN0ZXJUYXJnZXQgLSBSZWdpc3RlciB0aGUgZ2l2ZW4gdGFyZ2V0LiBBdHRlbXB0cyB0byByZWdpc3RlciBhCisgICAgLy8vIHRhcmdldCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgd2lsbCBiZSBpZ25vcmVkLgorICAgIC8vLworICAgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAgIC8vLyB0aGlzIGlzIGRvbmUgYnkgaW5pdGlhbGl6aW5nIGFsbCB0YXJnZXRzIGF0IHByb2dyYW0gc3RhcnR1cC4KKyAgICAvLy8KKyAgICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgICAgLy8vIEBwYXJhbSBOYW1lIC0gVGhlIHRhcmdldCBuYW1lLiBUaGlzIHNob3VsZCBiZSBhIHN0YXRpYyBzdHJpbmcuCisgICAgLy8vIEBwYXJhbSBTaG9ydERlc2MgLSBBIHNob3J0IHRhcmdldCBkZXNjcmlwdGlvbi4gVGhpcyBzaG91bGQgYmUgYSBzdGF0aWMKKyAgICAvLy8gc3RyaW5nLgorICAgIC8vLyBAcGFyYW0gVFF1YWxpdHlGbiAtIFRoZSB0cmlwbGUgbWF0Y2ggcXVhbGl0eSBjb21wdXRhdGlvbiBmdW5jdGlvbiBmb3IKKyAgICAvLy8gdGhpcyB0YXJnZXQuCisgICAgLy8vIEBwYXJhbSBIYXNKSVQgLSBXaGV0aGVyIHRoZSB0YXJnZXQgc3VwcG9ydHMgSklUIGNvZGUKKyAgICAvLy8gZ2VuZXJhdGlvbi4KKyAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclRhcmdldChUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTaG9ydERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OjpUcmlwbGVNYXRjaFF1YWxpdHlGblR5IFRRdWFsaXR5Rm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNKSVQgPSBmYWxzZSk7CisKKyAgICAvLy8gUmVnaXN0ZXJBc21JbmZvIC0gUmVnaXN0ZXIgYSBNQ0FzbUluZm8gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAgIC8vLyBnaXZlbiB0YXJnZXQuCisgICAgLy8vCisgICAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgICAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgICAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBNQ0FzbUluZm8gZm9yIHRoZSB0YXJnZXQuCisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJBc21JbmZvKFRhcmdldCAmVCwgVGFyZ2V0OjpBc21JbmZvQ3RvckZuVHkgRm4pIHsKKyAgICAgIC8vIElnbm9yZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uLgorICAgICAgaWYgKCFULkFzbUluZm9DdG9yRm4pCisgICAgICAgIFQuQXNtSW5mb0N0b3JGbiA9IEZuOworICAgIH0KKworICAgIC8vLyBSZWdpc3RlclRhcmdldE1hY2hpbmUgLSBSZWdpc3RlciBhIFRhcmdldE1hY2hpbmUgaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAgIC8vLyBnaXZlbiB0YXJnZXQuCisgICAgLy8vCisgICAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgICAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgICAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBUYXJnZXRNYWNoaW5lIGZvciB0aGUgdGFyZ2V0LgorICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZShUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldDo6VGFyZ2V0TWFjaGluZUN0b3JUeSBGbikgeworICAgICAgLy8gSWdub3JlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24uCisgICAgICBpZiAoIVQuVGFyZ2V0TWFjaGluZUN0b3JGbikKKyAgICAgICAgVC5UYXJnZXRNYWNoaW5lQ3RvckZuID0gRm47CisgICAgfQorCisgICAgLy8vIFJlZ2lzdGVyQXNtQmFja2VuZCAtIFJlZ2lzdGVyIGEgVGFyZ2V0QXNtQmFja2VuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgICAgLy8vIGdpdmVuIHRhcmdldC4KKyAgICAvLy8KKyAgICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhbiBBc21CYWNrZW5kIGZvciB0aGUgdGFyZ2V0LgorICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQXNtQmFja2VuZChUYXJnZXQgJlQsIFRhcmdldDo6QXNtQmFja2VuZEN0b3JUeSBGbikgeworICAgICAgaWYgKCFULkFzbUJhY2tlbmRDdG9yRm4pCisgICAgICAgIFQuQXNtQmFja2VuZEN0b3JGbiA9IEZuOworICAgIH0KKworICAgIC8vLyBSZWdpc3RlckFzbUxleGVyIC0gUmVnaXN0ZXIgYSBUYXJnZXRBc21MZXhlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgICAgLy8vIGdpdmVuIHRhcmdldC4KKyAgICAvLy8KKyAgICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhbiBBc21MZXhlciBmb3IgdGhlIHRhcmdldC4KKyAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckFzbUxleGVyKFRhcmdldCAmVCwgVGFyZ2V0OjpBc21MZXhlckN0b3JUeSBGbikgeworICAgICAgaWYgKCFULkFzbUxleGVyQ3RvckZuKQorICAgICAgICBULkFzbUxleGVyQ3RvckZuID0gRm47CisgICAgfQorCisgICAgLy8vIFJlZ2lzdGVyQXNtUGFyc2VyIC0gUmVnaXN0ZXIgYSBUYXJnZXRBc21QYXJzZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAgIC8vLyBnaXZlbiB0YXJnZXQuCisgICAgLy8vCisgICAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgICAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgICAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gQXNtUGFyc2VyIGZvciB0aGUgdGFyZ2V0LgorICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQXNtUGFyc2VyKFRhcmdldCAmVCwgVGFyZ2V0OjpBc21QYXJzZXJDdG9yVHkgRm4pIHsKKyAgICAgIGlmICghVC5Bc21QYXJzZXJDdG9yRm4pCisgICAgICAgIFQuQXNtUGFyc2VyQ3RvckZuID0gRm47CisgICAgfQorCisgICAgLy8vIFJlZ2lzdGVyQXNtUHJpbnRlciAtIFJlZ2lzdGVyIGFuIEFzbVByaW50ZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBnaXZlbgorICAgIC8vLyB0YXJnZXQuCisgICAgLy8vCisgICAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgICAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgICAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gQXNtUHJpbnRlciBmb3IgdGhlIHRhcmdldC4KKyAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckFzbVByaW50ZXIoVGFyZ2V0ICZULCBUYXJnZXQ6OkFzbVByaW50ZXJDdG9yVHkgRm4pIHsKKyAgICAgIC8vIElnbm9yZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uLgorICAgICAgaWYgKCFULkFzbVByaW50ZXJDdG9yRm4pCisgICAgICAgIFQuQXNtUHJpbnRlckN0b3JGbiA9IEZuOworICAgIH0KKworICAgIC8vLyBSZWdpc3Rlck1DRGlzYXNzZW1ibGVyIC0gUmVnaXN0ZXIgYSBNQ0Rpc2Fzc2VtYmxlciBpbXBsZW1lbnRhdGlvbiBmb3IKKyAgICAvLy8gdGhlIGdpdmVuIHRhcmdldC4KKyAgICAvLy8KKyAgICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhbiBNQ0Rpc2Fzc2VtYmxlciBmb3IgdGhlIHRhcmdldC4KKyAgICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1DRGlzYXNzZW1ibGVyKFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldDo6TUNEaXNhc3NlbWJsZXJDdG9yVHkgRm4pIHsKKyAgICAgIGlmICghVC5NQ0Rpc2Fzc2VtYmxlckN0b3JGbikKKyAgICAgICAgVC5NQ0Rpc2Fzc2VtYmxlckN0b3JGbiA9IEZuOworICAgIH0KKworICAgIC8vLyBSZWdpc3Rlck1DSW5zdFByaW50ZXIgLSBSZWdpc3RlciBhIE1DSW5zdFByaW50ZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAgIC8vLyBnaXZlbiB0YXJnZXQuCisgICAgLy8vCisgICAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgICAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgICAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gTUNJbnN0UHJpbnRlciBmb3IgdGhlIHRhcmdldC4KKyAgICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1DSW5zdFByaW50ZXIoVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ6Ok1DSW5zdFByaW50ZXJDdG9yVHkgRm4pIHsKKyAgICAgIGlmICghVC5NQ0luc3RQcmludGVyQ3RvckZuKQorICAgICAgICBULk1DSW5zdFByaW50ZXJDdG9yRm4gPSBGbjsKKyAgICB9CisKKyAgICAvLy8gUmVnaXN0ZXJDb2RlRW1pdHRlciAtIFJlZ2lzdGVyIGEgTUNDb2RlRW1pdHRlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgICAgLy8vIGdpdmVuIHRhcmdldC4KKyAgICAvLy8KKyAgICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgICAgLy8vCisgICAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhbiBNQ0NvZGVFbWl0dGVyIGZvciB0aGUgdGFyZ2V0LgorICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQ29kZUVtaXR0ZXIoVGFyZ2V0ICZULCBUYXJnZXQ6OkNvZGVFbWl0dGVyQ3RvclR5IEZuKSB7CisgICAgICBpZiAoIVQuQ29kZUVtaXR0ZXJDdG9yRm4pCisgICAgICAgIFQuQ29kZUVtaXR0ZXJDdG9yRm4gPSBGbjsKKyAgICB9CisKKyAgICAvLy8gUmVnaXN0ZXJPYmplY3RTdHJlYW1lciAtIFJlZ2lzdGVyIGFuIE1DU3RyZWFtZXIgaW1wbGVtZW50YXRpb24KKyAgICAvLy8gZm9yIHRoZSBnaXZlbiB0YXJnZXQuCisgICAgLy8vCisgICAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgICAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgICAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gTUNTdHJlYW1lciBmb3IgdGhlIHRhcmdldC4KKyAgICBzdGF0aWMgdm9pZCBSZWdpc3Rlck9iamVjdFN0cmVhbWVyKFRhcmdldCAmVCwgVGFyZ2V0OjpPYmplY3RTdHJlYW1lckN0b3JUeSBGbikgeworICAgICAgaWYgKCFULk9iamVjdFN0cmVhbWVyQ3RvckZuKQorICAgICAgICBULk9iamVjdFN0cmVhbWVyQ3RvckZuID0gRm47CisgICAgfQorCisgICAgLy8vIEB9CisgIH07CisKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gUmVnaXN0ZXJUYXJnZXQgLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0LCBmb3IgdXNlIGluIHRoZQorICAvLy8gdGFyZ2V0J3MgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uIFVzYWdlOgorICAvLy8KKyAgLy8vCisgIC8vLyBUYXJnZXQgVGhlRm9vVGFyZ2V0OyAvLyBUaGUgZ2xvYmFsIHRhcmdldCBpbnN0YW5jZS4KKyAgLy8vCisgIC8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXRJbmZvKCkgeworICAvLy8gICBSZWdpc3RlclRhcmdldDxUcmlwbGU6OmZvbz4gWChUaGVGb29UYXJnZXQsICJmb28iLCAiRm9vIGRlc2NyaXB0aW9uIik7CisgIC8vLyB9CisgIHRlbXBsYXRlPFRyaXBsZTo6QXJjaFR5cGUgVGFyZ2V0QXJjaFR5cGUgPSBUcmlwbGU6OkludmFsaWRBcmNoLAorICAgICAgICAgICBib29sIEhhc0pJVCA9IGZhbHNlPgorICBzdHJ1Y3QgUmVnaXN0ZXJUYXJnZXQgeworICAgIFJlZ2lzdGVyVGFyZ2V0KFRhcmdldCAmVCwgY29uc3QgY2hhciAqTmFtZSwgY29uc3QgY2hhciAqRGVzYykgeworICAgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyVGFyZ2V0KFQsIE5hbWUsIERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdldFRyaXBsZU1hdGNoUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNKSVQpOworICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRUcmlwbGVNYXRjaFF1YWxpdHkoY29uc3Qgc3RkOjpzdHJpbmcgJlRUKSB7CisgICAgICBpZiAoVHJpcGxlKFRUKS5nZXRBcmNoKCkgPT0gVGFyZ2V0QXJjaFR5cGUpCisgICAgICAgIHJldHVybiAyMDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfTsKKworICAvLy8gUmVnaXN0ZXJBc21JbmZvIC0gSGVscGVyIHRlbXBsYXRlIGZvciByZWdpc3RlcmluZyBhIHRhcmdldCBhc3NlbWJseSBpbmZvCisgIC8vLyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaW52b2tlcyB0aGUgc3RhdGljICJDcmVhdGUiIG1ldGhvZCBvbiB0aGUgY2xhc3MgdG8KKyAgLy8vIGFjdHVhbGx5IGRvIHRoZSBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKyAgLy8vCisgIC8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisgIC8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworICAvLy8gICBSZWdpc3RlckFzbUluZm88Rm9vTUNBc21JbmZvPiBYKFRoZUZvb1RhcmdldCk7CisgIC8vLyB9CisgIHRlbXBsYXRlPGNsYXNzIE1DQXNtSW5mb0ltcGw+CisgIHN0cnVjdCBSZWdpc3RlckFzbUluZm8geworICAgIFJlZ2lzdGVyQXNtSW5mbyhUYXJnZXQgJlQpIHsKKyAgICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3RlckFzbUluZm8oVCwgJkFsbG9jYXRvcik7CisgICAgfQorICBwcml2YXRlOgorICAgIHN0YXRpYyBNQ0FzbUluZm8gKkFsbG9jYXRvcihjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCkgeworICAgICAgcmV0dXJuIG5ldyBNQ0FzbUluZm9JbXBsKFQsIFRUKTsKKyAgICB9CisKKyAgfTsKKworICAvLy8gUmVnaXN0ZXJBc21JbmZvRm4gLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0IGFzc2VtYmx5IGluZm8KKyAgLy8vIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpbnZva2VzIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gdG8gZG8gdGhlCisgIC8vLyBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKyAgLy8vCisgIC8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisgIC8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworICAvLy8gICBSZWdpc3RlckFzbUluZm9GbiBYKFRoZUZvb1RhcmdldCwgVGhlRnVuY3Rpb24pOworICAvLy8gfQorICBzdHJ1Y3QgUmVnaXN0ZXJBc21JbmZvRm4geworICAgIFJlZ2lzdGVyQXNtSW5mb0ZuKFRhcmdldCAmVCwgVGFyZ2V0OjpBc21JbmZvQ3RvckZuVHkgRm4pIHsKKyAgICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3RlckFzbUluZm8oVCwgRm4pOworICAgIH0KKyAgfTsKKworCisgIC8vLyBSZWdpc3RlclRhcmdldE1hY2hpbmUgLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0IG1hY2hpbmUKKyAgLy8vIGltcGxlbWVudGF0aW9uLCBmb3IgdXNlIGluIHRoZSB0YXJnZXQgbWFjaGluZSBpbml0aWFsaXphdGlvbgorICAvLy8gZnVuY3Rpb24uIFVzYWdlOgorICAvLy8KKyAgLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldCgpIHsKKyAgLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisgIC8vLyAgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxGb29UYXJnZXRNYWNoaW5lPiBYKFRoZUZvb1RhcmdldCk7CisgIC8vLyB9CisgIHRlbXBsYXRlPGNsYXNzIFRhcmdldE1hY2hpbmVJbXBsPgorICBzdHJ1Y3QgUmVnaXN0ZXJUYXJnZXRNYWNoaW5lIHsKKyAgICBSZWdpc3RlclRhcmdldE1hY2hpbmUoVGFyZ2V0ICZUKSB7CisgICAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJUYXJnZXRNYWNoaW5lKFQsICZBbGxvY2F0b3IpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0YXRpYyBUYXJnZXRNYWNoaW5lICpBbGxvY2F0b3IoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpIHsKKyAgICAgIHJldHVybiBuZXcgVGFyZ2V0TWFjaGluZUltcGwoVCwgVFQsIEZTKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFJlZ2lzdGVyQXNtQmFja2VuZCAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgc3BlY2lmaWMKKyAgLy8vIGFzc2VtYmxlciBiYWNrZW5kLiBVc2FnZToKKyAgLy8vCisgIC8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29Bc21CYWNrZW5kKCkgeworICAvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKyAgLy8vICAgUmVnaXN0ZXJBc21CYWNrZW5kPEZvb0FzbUxleGVyPiBYKFRoZUZvb1RhcmdldCk7CisgIC8vLyB9CisgIHRlbXBsYXRlPGNsYXNzIEFzbUJhY2tlbmRJbXBsPgorICBzdHJ1Y3QgUmVnaXN0ZXJBc21CYWNrZW5kIHsKKyAgICBSZWdpc3RlckFzbUJhY2tlbmQoVGFyZ2V0ICZUKSB7CisgICAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJBc21CYWNrZW5kKFQsICZBbGxvY2F0b3IpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0YXRpYyBUYXJnZXRBc21CYWNrZW5kICpBbGxvY2F0b3IoY29uc3QgVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlRyaXBsZSkgeworICAgICAgcmV0dXJuIG5ldyBBc21CYWNrZW5kSW1wbChULCBUcmlwbGUpOworICAgIH0KKyAgfTsKKworICAvLy8gUmVnaXN0ZXJBc21MZXhlciAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgc3BlY2lmaWMKKyAgLy8vIGFzc2VtYmx5IGxleGVyLCBmb3IgdXNlIGluIHRoZSB0YXJnZXQgbWFjaGluZSBpbml0aWFsaXphdGlvbgorICAvLy8gZnVuY3Rpb24uIFVzYWdlOgorICAvLy8KKyAgLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb0FzbUxleGVyKCkgeworICAvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKyAgLy8vICAgUmVnaXN0ZXJBc21MZXhlcjxGb29Bc21MZXhlcj4gWChUaGVGb29UYXJnZXQpOworICAvLy8gfQorICB0ZW1wbGF0ZTxjbGFzcyBBc21MZXhlckltcGw+CisgIHN0cnVjdCBSZWdpc3RlckFzbUxleGVyIHsKKyAgICBSZWdpc3RlckFzbUxleGVyKFRhcmdldCAmVCkgeworICAgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyQXNtTGV4ZXIoVCwgJkFsbG9jYXRvcik7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RhdGljIFRhcmdldEFzbUxleGVyICpBbGxvY2F0b3IoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBNQ0FzbUluZm8gJk1BSSkgeworICAgICAgcmV0dXJuIG5ldyBBc21MZXhlckltcGwoVCwgTUFJKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFJlZ2lzdGVyQXNtUGFyc2VyIC0gSGVscGVyIHRlbXBsYXRlIGZvciByZWdpc3RlcmluZyBhIHRhcmdldCBzcGVjaWZpYworICAvLy8gYXNzZW1ibHkgcGFyc2VyLCBmb3IgdXNlIGluIHRoZSB0YXJnZXQgbWFjaGluZSBpbml0aWFsaXphdGlvbgorICAvLy8gZnVuY3Rpb24uIFVzYWdlOgorICAvLy8KKyAgLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb0FzbVBhcnNlcigpIHsKKyAgLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisgIC8vLyAgIFJlZ2lzdGVyQXNtUGFyc2VyPEZvb0FzbVBhcnNlcj4gWChUaGVGb29UYXJnZXQpOworICAvLy8gfQorICB0ZW1wbGF0ZTxjbGFzcyBBc21QYXJzZXJJbXBsPgorICBzdHJ1Y3QgUmVnaXN0ZXJBc21QYXJzZXIgeworICAgIFJlZ2lzdGVyQXNtUGFyc2VyKFRhcmdldCAmVCkgeworICAgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyQXNtUGFyc2VyKFQsICZBbGxvY2F0b3IpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0YXRpYyBUYXJnZXRBc21QYXJzZXIgKkFsbG9jYXRvcihjb25zdCBUYXJnZXQgJlQsIE1DQXNtUGFyc2VyICZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRNYWNoaW5lICZUTSkgeworICAgICAgcmV0dXJuIG5ldyBBc21QYXJzZXJJbXBsKFQsIFAsIFRNKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFJlZ2lzdGVyQXNtUHJpbnRlciAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgc3BlY2lmaWMKKyAgLy8vIGFzc2VtYmx5IHByaW50ZXIsIGZvciB1c2UgaW4gdGhlIHRhcmdldCBtYWNoaW5lIGluaXRpYWxpemF0aW9uCisgIC8vLyBmdW5jdGlvbi4gVXNhZ2U6CisgIC8vLworICAvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vQXNtUHJpbnRlcigpIHsKKyAgLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisgIC8vLyAgIFJlZ2lzdGVyQXNtUHJpbnRlcjxGb29Bc21QcmludGVyPiBYKFRoZUZvb1RhcmdldCk7CisgIC8vLyB9CisgIHRlbXBsYXRlPGNsYXNzIEFzbVByaW50ZXJJbXBsPgorICBzdHJ1Y3QgUmVnaXN0ZXJBc21QcmludGVyIHsKKyAgICBSZWdpc3RlckFzbVByaW50ZXIoVGFyZ2V0ICZUKSB7CisgICAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJBc21QcmludGVyKFQsICZBbGxvY2F0b3IpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0YXRpYyBBc21QcmludGVyICpBbGxvY2F0b3IoVGFyZ2V0TWFjaGluZSAmVE0sIE1DU3RyZWFtZXIgJlN0cmVhbWVyKSB7CisgICAgICByZXR1cm4gbmV3IEFzbVByaW50ZXJJbXBsKFRNLCBTdHJlYW1lcik7CisgICAgfQorICB9OworCisgIC8vLyBSZWdpc3RlckNvZGVFbWl0dGVyIC0gSGVscGVyIHRlbXBsYXRlIGZvciByZWdpc3RlcmluZyBhIHRhcmdldCBzcGVjaWZpYworICAvLy8gbWFjaGluZSBjb2RlIGVtaXR0ZXIsIGZvciB1c2UgaW4gdGhlIHRhcmdldCBpbml0aWFsaXphdGlvbgorICAvLy8gZnVuY3Rpb24uIFVzYWdlOgorICAvLy8KKyAgLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb0NvZGVFbWl0dGVyKCkgeworICAvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKyAgLy8vICAgUmVnaXN0ZXJDb2RlRW1pdHRlcjxGb29Db2RlRW1pdHRlcj4gWChUaGVGb29UYXJnZXQpOworICAvLy8gfQorICB0ZW1wbGF0ZTxjbGFzcyBDb2RlRW1pdHRlckltcGw+CisgIHN0cnVjdCBSZWdpc3RlckNvZGVFbWl0dGVyIHsKKyAgICBSZWdpc3RlckNvZGVFbWl0dGVyKFRhcmdldCAmVCkgeworICAgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyQ29kZUVtaXR0ZXIoVCwgJkFsbG9jYXRvcik7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RhdGljIE1DQ29kZUVtaXR0ZXIgKkFsbG9jYXRvcihjb25zdCBUYXJnZXQgJlQsIFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICAgIHJldHVybiBuZXcgQ29kZUVtaXR0ZXJJbXBsKFQsIFRNLCBDdHgpOworICAgIH0KKyAgfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0U2NoZWR1bGUudGQgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFNjaGVkdWxlLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzgzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFNjaGVkdWxlLnRkCkBAIC0wLDAgKzEsOTUgQEAKKy8vPT09LSBUYXJnZXRTY2hlZHVsZS50ZCAtIFRhcmdldCBJbmRlcGVuZGVudCBTY2hlZHVsaW5nIC0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IHNjaGVkdWxpbmcgaW50ZXJmYWNlcyB3aGljaCBzaG91bGQKKy8vIGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggdGFyZ2V0IHdoaWNoIGlzIHVzaW5nIFRhYmxlR2VuIGJhc2VkIHNjaGVkdWxpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByb2Nlc3NvciBmdW5jdGlvbmFsIHVuaXQgLSBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBmdW5jdGlvbiB1bml0cworLy8gYXZhaWxhYmxlIGFjcm9zcyBhbGwgY2hpcCBzZXRzIGZvciB0aGUgdGFyZ2V0LiAgRWcuLCBJbnRVbml0LCBGUFVuaXQsIC4uLgorLy8gVGhlc2UgbWF5IGJlIGluZGVwZW5kZW50IHZhbHVlcyBmb3IgZWFjaCBjaGlwIHNldCBvciBtYXkgYmUgc2hhcmVkIGFjcm9zcworLy8gYWxsIGNoaXAgc2V0cyBvZiB0aGUgdGFyZ2V0LiAgRWFjaCBmdW5jdGlvbmFsIHVuaXQgaXMgdHJlYXRlZCBhcyBhIHJlc291cmNlCisvLyBkdXJpbmcgc2NoZWR1bGluZyBhbmQgaGFzIGFuIGFmZmVjdCBpbnN0cnVjdGlvbiBvcmRlciBiYXNlZCBvbiBhdmFpbGFiaWxpdHkKKy8vIGR1cmluZyBhIHRpbWUgaW50ZXJ2YWwuCisvLyAgCitjbGFzcyBGdW5jVW5pdDsKKworY2xhc3MgUmVzZXJ2YXRpb25LaW5kPGJpdHM8MT4gdmFsPiB7CisgIGludCBWYWx1ZSA9IHZhbDsKK30KKworZGVmIFJlcXVpcmVkIDogUmVzZXJ2YXRpb25LaW5kPDA+OworZGVmIFJlc2VydmVkIDogUmVzZXJ2YXRpb25LaW5kPDE+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gc3RhZ2UgLSBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IGEgbm9uLXBpcGVsaW5lZCBzdGVwIGluCisvLyB0aGUgZXhlY3V0aW9uIG9mIGFuIGluc3RydWN0aW9uLiAgQ3ljbGVzIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZgorLy8gZGlzY3JldGUgdGltZSBzbG90cyBuZWVkZWQgdG8gY29tcGxldGUgdGhlIHN0YWdlLiAgVW5pdHMgcmVwcmVzZW50CisvLyB0aGUgY2hvaWNlIG9mIGZ1bmN0aW9uYWwgdW5pdHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb21wbGV0ZSB0aGUKKy8vIHN0YWdlLiAgRWcuIEludFVuaXQxLCBJbnRVbml0Mi4gTmV4dEN5Y2xlcyBpbmRpY2F0ZXMgaG93IG1hbnkKKy8vIGN5Y2xlcyBzaG91bGQgZWxhcHNlIGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgc3RhZ2UgdG8gdGhlIHN0YXJ0IG9mCisvLyB0aGUgbmV4dCBzdGFnZSBpbiB0aGUgaXRpbmVyYXJ5LiAgRm9yIGV4YW1wbGU6CisvLworLy8gQSBzdGFnZSBpcyBzcGVjaWZpZWQgaW4gb25lIG9mIHR3byB3YXlzOgorLy8KKy8vICAgSW5zdHJTdGFnZTwxLCBbRlVfeCwgRlVfeV0+ICAgICAtIFRpbWVJbmMgZGVmYXVsdHMgdG8gQ3ljbGVzCisvLyAgIEluc3RyU3RhZ2U8MSwgW0ZVX3gsIEZVX3ldLCAwPiAgLSBUaW1lSW5jIGV4cGxpY2l0CisvLworCitjbGFzcyBJbnN0clN0YWdlPGludCBjeWNsZXMsIGxpc3Q8RnVuY1VuaXQ+IHVuaXRzLAorICAgICAgICAgICAgICAgICBpbnQgdGltZWluYyA9IC0xLAorICAgICAgICAgICAgICAgICBSZXNlcnZhdGlvbktpbmQga2luZCA9IFJlcXVpcmVkPiB7CisgIGludCBDeWNsZXMgICAgICAgICAgPSBjeWNsZXM7ICAgICAgIC8vIGxlbmd0aCBvZiBzdGFnZSBpbiBtYWNoaW5lIGN5Y2xlcworICBsaXN0PEZ1bmNVbml0PiBVbml0cyA9IHVuaXRzOyAgICAgICAvLyBjaG9pY2Ugb2YgZnVuY3Rpb25hbCB1bml0cworICBpbnQgVGltZUluYyAgICAgICAgID0gdGltZWluYzsgICAgICAvLyBjeWNsZXMgdGlsbCBzdGFydCBvZiBuZXh0IHN0YWdlCisgIGludCBLaW5kICAgICAgICAgICAgPSBraW5kLlZhbHVlOyAgIC8vIGtpbmQgb2YgRlUgcmVzZXJ2YXRpb24KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGl0aW5lcmFyeSAtIEFuIGl0aW5lcmFyeSByZXByZXNlbnRzIGEgc2VxdWVudGlhbCBzZXJpZXMgb2Ygc3RlcHMKKy8vIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFuIGluc3RydWN0aW9uLiAgSXRpbmVyYXJpZXMgYXJlIHJlcHJlc2VudGVkIGFzIGxpc3RzIG9mCisvLyBpbnN0cnVjdGlvbiBzdGFnZXMuCisvLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5IGNsYXNzZXMgLSBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50ICduYW1lZCcgaW5zdHJ1Y3Rpb24KKy8vIGl0aW5lcmFyeS4gIFVzaW5nIG5hbWVkIGl0aW5lcmFyaWVzIHNpbXBsaWZpZXMgbWFuYWdpbmcgZ3JvdXBzIG9mCisvLyBpbnN0cnVjdGlvbnMgYWNyb3NzIGNoaXAgc2V0cy4gIEFuIGluc3RydWN0aW9uIHVzZXMgdGhlIHNhbWUgaXRpbmVyYXJ5IGNsYXNzCisvLyBhY3Jvc3MgYWxsIGNoaXAgc2V0cy4gIFRodXMgYSBuZXcgY2hpcCBzZXQgY2FuIGJlIGFkZGVkIHdpdGhvdXQgbW9kaWZ5aW5nCisvLyBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbi4KKy8vCitjbGFzcyBJbnN0ckl0aW5DbGFzczsKK2RlZiBOb0l0aW5lcmFyeSA6IEluc3RySXRpbkNsYXNzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5IGRhdGEgLSBUaGVzZSB2YWx1ZXMgcHJvdmlkZSBhIHJ1bnRpbWUgbWFwIG9mIGFuIAorLy8gaW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5IGNsYXNzIChuYW1lKSB0byBpdHMgaXRpbmVyYXJ5IGRhdGEuCisvLworY2xhc3MgSW5zdHJJdGluRGF0YTxJbnN0ckl0aW5DbGFzcyBDbGFzcywgbGlzdDxJbnN0clN0YWdlPiBzdGFnZXMsCisgICAgICAgICAgICAgICAgICAgIGxpc3Q8aW50PiBvcGVyYW5kY3ljbGVzID0gW10+IHsKKyAgSW5zdHJJdGluQ2xhc3MgVGhlQ2xhc3MgPSBDbGFzczsKKyAgbGlzdDxJbnN0clN0YWdlPiBTdGFnZXMgPSBzdGFnZXM7CisgIGxpc3Q8aW50PiBPcGVyYW5kQ3ljbGVzID0gb3BlcmFuZGN5Y2xlczsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByb2Nlc3NvciBpdGluZXJhcmllcyAtIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIHNldCBvZiBhbGwgaXRpbmVyYXJ5CisvLyBjbGFzc2VzIGZvciBhIGdpdmVuIGNoaXAgc2V0LgorLy8KK2NsYXNzIFByb2Nlc3Nvckl0aW5lcmFyaWVzPGxpc3Q8RnVuY1VuaXQ+IGZ1LCBsaXN0PEluc3RySXRpbkRhdGE+IGlpZD4geworICBsaXN0PEZ1bmNVbml0PiBGVSA9IGZ1OworICBsaXN0PEluc3RySXRpbkRhdGE+IElJRCA9IGlpZDsKK30KKworLy8gTm9JdGluZXJhcmllcyAtIEEgbWFya2VyIHRoYXQgY2FuIGJlIHVzZWQgYnkgcHJvY2Vzc29ycyB3aXRob3V0IHNjaGVkdWxlCisvLyBpbmZvLgorZGVmIE5vSXRpbmVyYXJpZXMgOiBQcm9jZXNzb3JJdGluZXJhcmllczxbXSwgW10+OworCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTZWxlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjZiNjJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTZWxlY3QuaApAQCAtMCwwICsxLDEzNSBAQAorLy89PT0tIFRhcmdldFNlbGVjdC5oIC0gVGFyZ2V0IFNlbGVjdGlvbiAmIFJlZ2lzdHJhdGlvbiAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdXRpbGl0aWVzIHRvIG1ha2Ugc3VyZSB0aGF0IGNlcnRhaW4gY2xhc3NlcyBvZiB0YXJnZXRzIGFyZQorLy8gbGlua2VkIGludG8gdGhlIG1haW4gYXBwbGljYXRpb24gZXhlY3V0YWJsZSwgYW5kIGluaXRpYWxpemUgdGhlbSBhcworLy8gYXBwcm9wcmlhdGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9UQVJHRVRTRUxFQ1RfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRTRUxFQ1RfSAorCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKworZXh0ZXJuICJDIiB7CisgIC8vIERlY2xhcmUgYWxsIG9mIHRoZSB0YXJnZXQtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIHRoYXQgYXJlIGF2YWlsYWJsZS4KKyNkZWZpbmUgTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkgdm9pZCBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjVGFyZ2V0SW5mbygpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorCisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldCgpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorICAKKyAgLy8gRGVjbGFyZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBhc3NlbWJseSBwcmludGVyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KKyNkZWZpbmUgTExWTV9BU01fUFJJTlRFUihUYXJnZXROYW1lKSB2b2lkIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNBc21QcmludGVyKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvQXNtUHJpbnRlcnMuZGVmIgorCisgIC8vIERlY2xhcmUgYWxsIG9mIHRoZSBhdmFpbGFibGUgYXNzZW1ibHkgcGFyc2VyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KKyNkZWZpbmUgTExWTV9BU01fUEFSU0VSKFRhcmdldE5hbWUpIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI0FzbVBhcnNlcigpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL0FzbVBhcnNlcnMuZGVmIgorCisgIC8vIERlY2xhcmUgYWxsIG9mIHRoZSBhdmFpbGFibGUgZGlzYXNzZW1ibGVyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KKyNkZWZpbmUgTExWTV9ESVNBU1NFTUJMRVIoVGFyZ2V0TmFtZSkgdm9pZCBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjRGlzYXNzZW1ibGVyKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvRGlzYXNzZW1ibGVycy5kZWYiCit9CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgLy8vIEluaXRpYWxpemVBbGxUYXJnZXRJbmZvcyAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBpZgorICAvLy8gaXQgd2FudHMgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgdGFyZ2V0cyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0bworICAvLy8gc3VwcG9ydCwgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZSB2aWEgdGhlIFRhcmdldFJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSB2b2lkIEluaXRpYWxpemVBbGxUYXJnZXRJbmZvcygpIHsKKyNkZWZpbmUgTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldEluZm8oKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiIKKyAgfQorICAKKyAgLy8vIEluaXRpYWxpemVBbGxUYXJnZXRzIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIGl0CisgIC8vLyB3YW50cyBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSB0YXJnZXQgbWFjaGluZXMgdGhhdCBMTFZNIGlzIGNvbmZpZ3VyZWQgdG8KKyAgLy8vIHN1cHBvcnQsIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgdmlhIHRoZSBUYXJnZXRSZWdpc3RyeS4KKyAgLy8vCisgIC8vLyBJdCBpcyBsZWdhbCBmb3IgYSBjbGllbnQgdG8gbWFrZSBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorICBpbmxpbmUgdm9pZCBJbml0aWFsaXplQWxsVGFyZ2V0cygpIHsKKyAgICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMsIGNsaWVudHMgc2hvdWxkIGRvIGl0LgorICAgIEluaXRpYWxpemVBbGxUYXJnZXRJbmZvcygpOworCisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXQoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiIKKyAgfQorICAKKyAgLy8vIEluaXRpYWxpemVBbGxBc21QcmludGVycyAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBpZgorICAvLy8gaXQgd2FudHMgYWxsIGFzbSBwcmludGVycyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0byBzdXBwb3J0LCB0byBtYWtlIHRoZW0KKyAgLy8vIGF2YWlsYWJsZSB2aWEgdGhlIFRhcmdldFJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSB2b2lkIEluaXRpYWxpemVBbGxBc21QcmludGVycygpIHsKKyNkZWZpbmUgTExWTV9BU01fUFJJTlRFUihUYXJnZXROYW1lKSBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjQXNtUHJpbnRlcigpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL0FzbVByaW50ZXJzLmRlZiIKKyAgfQorICAKKyAgLy8vIEluaXRpYWxpemVBbGxBc21QYXJzZXJzIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIGl0CisgIC8vLyB3YW50cyBhbGwgYXNtIHBhcnNlcnMgdGhhdCBMTFZNIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCwgdG8gbWFrZSB0aGVtCisgIC8vLyBhdmFpbGFibGUgdmlhIHRoZSBUYXJnZXRSZWdpc3RyeS4KKyAgLy8vCisgIC8vLyBJdCBpcyBsZWdhbCBmb3IgYSBjbGllbnQgdG8gbWFrZSBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorICBpbmxpbmUgdm9pZCBJbml0aWFsaXplQWxsQXNtUGFyc2VycygpIHsKKyNkZWZpbmUgTExWTV9BU01fUEFSU0VSKFRhcmdldE5hbWUpIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNBc21QYXJzZXIoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9Bc21QYXJzZXJzLmRlZiIKKyAgfQorICAKKyAgLy8vIEluaXRpYWxpemVBbGxEaXNhc3NlbWJsZXJzIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmCisgIC8vLyBpdCB3YW50cyBhbGwgZGlzYXNzZW1ibGVycyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0byBzdXBwb3J0LCB0byBtYWtlCisgIC8vLyB0aGVtIGF2YWlsYWJsZSB2aWEgdGhlIFRhcmdldFJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSB2b2lkIEluaXRpYWxpemVBbGxEaXNhc3NlbWJsZXJzKCkgeworI2RlZmluZSBMTFZNX0RJU0FTU0VNQkxFUihUYXJnZXROYW1lKSBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjRGlzYXNzZW1ibGVyKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvRGlzYXNzZW1ibGVycy5kZWYiCisgIH0KKyAgCisgIC8vLyBJbml0aWFsaXplTmF0aXZlVGFyZ2V0IC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCisgIC8vLyBpbml0aWFsaXplIHRoZSBuYXRpdmUgdGFyZ2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhvc3QuICBUaGlzIGlzIHVzZWZ1bCAKKyAgLy8vIGZvciBKSVQgYXBwbGljYXRpb25zIHRvIGVuc3VyZSB0aGF0IHRoZSB0YXJnZXQgZ2V0cyBsaW5rZWQgaW4gY29ycmVjdGx5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSBib29sIEluaXRpYWxpemVOYXRpdmVUYXJnZXQoKSB7CisgIC8vIElmIHdlIGhhdmUgYSBuYXRpdmUgdGFyZ2V0LCBpbml0aWFsaXplIGl0IHRvIGVuc3VyZSBpdCBpcyBsaW5rZWQgaW4uCisjaWZkZWYgTExWTV9OQVRJVkVfQVJDSE5BTUUKKyNkZWZpbmUgRG9Jbml0MihUQVJHKSBcCisgICAgTExWTUluaXRpYWxpemUgIyMgVEFSRyAjIyBJbmZvICgpOyAgICAgICAgICBcCisgICAgTExWTUluaXRpYWxpemUgIyMgVEFSRyAoKQorI2RlZmluZSBEb0luaXQoVCkgRG9Jbml0MihUKQorICAgIERvSW5pdChMTFZNX05BVElWRV9BUkNIKTsKKyAgICByZXR1cm4gZmFsc2U7CisjdW5kZWYgRG9Jbml0CisjdW5kZWYgRG9Jbml0MgorI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorICB9ICAKKworICAvLy8gSW5pdGlhbGl6ZU5hdGl2ZVRhcmdldEFzbVByaW50ZXIgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsCisgIC8vLyB0aGlzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIG5hdGl2ZSB0YXJnZXQgYXNtIHByaW50ZXIuCisgIGlubGluZSBib29sIEluaXRpYWxpemVOYXRpdmVUYXJnZXRBc21QcmludGVyKCkgeworICAvLyBJZiB3ZSBoYXZlIGEgbmF0aXZlIHRhcmdldCwgaW5pdGlhbGl6ZSB0aGUgY29ycmVzcG9uZGluZyBhc20gcHJpbnRlci4KKyNpZmRlZiBMTFZNX05BVElWRV9BUkNICisjZGVmaW5lIERvSW5pdDIoVEFSRykgXAorICAgIExMVk1Jbml0aWFsaXplICMjIFRBUkcgIyMgQXNtUHJpbnRlciAoKTsKKyNkZWZpbmUgRG9Jbml0KFQpIERvSW5pdDIoVCkKKyAgICBEb0luaXQoTExWTV9OQVRJVkVfQVJDSE5BTUUpOworICAgIHJldHVybiBmYWxzZTsKKyN1bmRlZiBEb0luaXQKKyN1bmRlZiBEb0luaXQyCisjZWxzZQorICAgIHJldHVybiB0cnVlOworI2VuZGlmCisgIH0gIAorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHLnRkIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTZWxlY3Rpb25EQUcudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjY2ZiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHLnRkCkBAIC0wLDAgKzEsODYxIEBACisvLz09PS0gVGFyZ2V0U2VsZWN0aW9uREFHLnRkIC0gQ29tbW9uIGNvZGUgZm9yIERBRyBpc2VscyAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHVzZWQgYnkgU2VsZWN0aW9uREFHCisvLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gZ2VuZXJhdG9ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2VsZWN0aW9uIERBRyBUeXBlIENvbnN0cmFpbnQgZGVmaW5pdGlvbnMuCisvLworLy8gTm90ZSB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgdGhlc2UgY29uc3RyYWludHMgYXJlIGhhcmQgY29kZWQgaW50byB0YmxnZW4uICBUbworLy8gbW9kaWZ5IG9yIGFkZCBjb25zdHJhaW50cywgeW91IGhhdmUgdG8gaGFjayB0YmxnZW4uCisvLworCitjbGFzcyBTRFR5cGVDb25zdHJhaW50PGludCBvcG51bT4geworICBpbnQgT3BlcmFuZE51bSA9IG9wbnVtOworfQorCisvLyBTRFRDaXNWVCAtIFRoZSBzcGVjaWZpZWQgb3BlcmFuZCBoYXMgZXhhY3RseSB0aGlzIFZULgorY2xhc3MgU0RUQ2lzVlQ8aW50IE9wTnVtLCBWYWx1ZVR5cGUgdnQ+IDogU0RUeXBlQ29uc3RyYWludDxPcE51bT4geworICBWYWx1ZVR5cGUgVlQgPSB2dDsKK30KKworY2xhc3MgU0RUQ2lzUHRyVHk8aW50IE9wTnVtPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+OworCisvLyBTRFRDaXNJbnQgLSBUaGUgc3BlY2lmaWVkIG9wZXJhbmQgaGFzIGludGVnZXIgdHlwZS4KK2NsYXNzIFNEVENpc0ludDxpbnQgT3BOdW0+IDogU0RUeXBlQ29uc3RyYWludDxPcE51bT47CisKKy8vIFNEVENpc0ZQIC0gVGhlIHNwZWNpZmllZCBvcGVyYW5kIGhhcyBmbG9hdGluZy1wb2ludCB0eXBlLgorY2xhc3MgU0RUQ2lzRlA8aW50IE9wTnVtPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+OworCisvLyBTRFRDaXNWZWMgLSBUaGUgc3BlY2lmaWVkIG9wZXJhbmQgaGFzIGEgdmVjdG9yIHR5cGUuCitjbGFzcyBTRFRDaXNWZWM8aW50IE9wTnVtPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+OworCisvLyBTRFRDaXNTYW1lQXMgLSBUaGUgdHdvIHNwZWNpZmllZCBvcGVyYW5kcyBoYXZlIGlkZW50aWNhbCB0eXBlcy4KK2NsYXNzIFNEVENpc1NhbWVBczxpbnQgT3BOdW0sIGludCBPdGhlck9wPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+IHsKKyAgaW50IE90aGVyT3BlcmFuZE51bSA9IE90aGVyT3A7Cit9CisKKy8vIFNEVENpc1ZUU21hbGxlclRoYW5PcCAtIFRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpcyBhIFZUIFNETm9kZSwgYW5kIGl0cyB0eXBlIGlzCisvLyBzbWFsbGVyIHRoYW4gdGhlICdPdGhlcicgb3BlcmFuZC4KK2NsYXNzIFNEVENpc1ZUU21hbGxlclRoYW5PcDxpbnQgT3BOdW0sIGludCBPdGhlck9wPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+IHsKKyAgaW50IE90aGVyT3BlcmFuZE51bSA9IE90aGVyT3A7Cit9CisKK2NsYXNzIFNEVENpc09wU21hbGxlclRoYW5PcDxpbnQgU21hbGxPcCwgaW50IEJpZ09wPiA6IFNEVHlwZUNvbnN0cmFpbnQ8U21hbGxPcD57CisgIGludCBCaWdPcGVyYW5kTnVtID0gQmlnT3A7Cit9CisKKy8vLyBTRFRDaXNFbHRPZlZlYyAtIFRoaXMgaW5kaWNhdGVzIHRoYXQgVGhpc09wIGlzIGEgc2NhbGFyIHR5cGUgb2YgdGhlIHNhbWUKKy8vLyB0eXBlIGFzIHRoZSBlbGVtZW50IHR5cGUgb2YgT3RoZXJPcCwgd2hpY2ggaXMgYSB2ZWN0b3IgdHlwZS4KK2NsYXNzIFNEVENpc0VsdE9mVmVjPGludCBUaGlzT3AsIGludCBPdGhlck9wPgorICA6IFNEVHlwZUNvbnN0cmFpbnQ8VGhpc09wPiB7CisgIGludCBPdGhlck9wTnVtID0gT3RoZXJPcDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNlbGVjdGlvbiBEQUcgVHlwZSBQcm9maWxlIGRlZmluaXRpb25zLgorLy8KKy8vIFRoZXNlIHVzZSB0aGUgY29uc3RyYWludHMgZGVmaW5lZCBhYm92ZSB0byBkZXNjcmliZSB0aGUgdHlwZSByZXF1aXJlbWVudHMgb2YKKy8vIHRoZSB2YXJpb3VzIG5vZGVzLiAgVGhlc2UgYXJlIG5vdCBoYXJkIGNvZGVkIGludG8gdGJsZ2VuLCBhbGxvd2luZyB0YXJnZXRzIHRvCisvLyBhZGQgdGhlaXIgb3duIGlmIG5lZWRlZC4KKy8vCisKKy8vIFNEVHlwZVByb2ZpbGUgLSBUaGlzIHByb2ZpbGUgZGVzY3JpYmVzIHRoZSB0eXBlIHJlcXVpcmVtZW50cyBvZiBhIFNlbGVjdGlvbgorLy8gREFHIG5vZGUuCitjbGFzcyBTRFR5cGVQcm9maWxlPGludCBudW1yZXN1bHRzLCBpbnQgbnVtb3BlcmFuZHMsCisgICAgICAgICAgICAgICAgICAgIGxpc3Q8U0RUeXBlQ29uc3RyYWludD4gY29uc3RyYWludHM+IHsKKyAgaW50IE51bVJlc3VsdHMgPSBudW1yZXN1bHRzOworICBpbnQgTnVtT3BlcmFuZHMgPSBudW1vcGVyYW5kczsKKyAgbGlzdDxTRFR5cGVDb25zdHJhaW50PiBDb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzOworfQorCisvLyBCdWlsdGluIHByb2ZpbGVzLgorZGVmIFNEVEludExlYWY6IFNEVHlwZVByb2ZpbGU8MSwgMCwgW1NEVENpc0ludDwwPl0+OyAgICAgICAgIC8vIGZvciAnaW1tJy4KK2RlZiBTRFRGUExlYWYgOiBTRFR5cGVQcm9maWxlPDEsIDAsIFtTRFRDaXNGUDwwPl0+OyAgICAgICAgICAvLyBmb3IgJ2ZwaW1tJy4KK2RlZiBTRFRQdHJMZWFmOiBTRFR5cGVQcm9maWxlPDEsIDAsIFtTRFRDaXNQdHJUeTwwPl0+OyAgICAgICAvLyBmb3IgJyZnJy4KK2RlZiBTRFRPdGhlciAgOiBTRFR5cGVQcm9maWxlPDEsIDAsIFtTRFRDaXNWVDwwLCBPdGhlclZUPl0+OyAvLyBmb3IgJ3Z0Jy4KK2RlZiBTRFRVTkRFRiAgOiBTRFR5cGVQcm9maWxlPDEsIDAsIFtdPjsgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgJ3VuZGVmJy4KK2RlZiBTRFRVbmFyeU9wICA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgW10+OyAgICAgICAgICAgICAgICAgICAvLyBmb3IgYml0Y29udmVydC4KKworZGVmIFNEVEludEJpbk9wIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbICAgICAvLyBhZGQsIGFuZCwgb3IsIHhvciwgdWRpdiwgZXRjLgorICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzSW50PDA+CitdPjsKK2RlZiBTRFRJbnRTaGlmdE9wIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbICAgLy8gc2hsLCBzcmEsIHNybAorICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc0ludDwwPiwgU0RUQ2lzSW50PDI+CitdPjsKK2RlZiBTRFRJbnRCaW5IaUxvT3AgOiBTRFR5cGVQcm9maWxlPDIsIDIsIFsgLy8gbXVsaGksIG11bGxvLCBzZGl2cmVtLCB1ZGl2cmVtCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNTYW1lQXM8MCwgMz4sU0RUQ2lzSW50PDA+CitdPjsKKworZGVmIFNEVEZQQmluT3AgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFsgICAgICAvLyBmYWRkLCBmbXVsLCBldGMuCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNGUDwwPgorXT47CitkZWYgU0RURlBTaWduT3AgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFsgICAgIC8vIGZjb3B5c2lnbi4KKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNGUDwwPiwgU0RUQ2lzRlA8Mj4KK10+OworZGVmIFNEVEZQVGVybmFyeU9wIDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbICAvLyBmbWFkZCwgZm5tc3ViLCBldGMuCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNTYW1lQXM8MCwgMz4sIFNEVENpc0ZQPDA+CitdPjsKK2RlZiBTRFRJbnRVbmFyeU9wIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbICAgLy8gY3RsegorICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc0ludDwwPgorXT47CitkZWYgU0RUSW50RXh0ZW5kT3AgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgIC8vIHNleHQsIHpleHQsIGFueWV4dAorICBTRFRDaXNJbnQ8MD4sIFNEVENpc0ludDwxPiwgU0RUQ2lzT3BTbWFsbGVyVGhhbk9wPDEsIDA+CitdPjsKK2RlZiBTRFRJbnRUcnVuY09wICA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgLy8gdHJ1bmMKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNJbnQ8MT4sIFNEVENpc09wU21hbGxlclRoYW5PcDwwLCAxPgorXT47CitkZWYgU0RURlBVbmFyeU9wICA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgIC8vIGZuZWcsIGZzcXJ0LCBldGMKKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNGUDwwPgorXT47CitkZWYgU0RURlBSb3VuZE9wICA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgIC8vIGZyb3VuZAorICBTRFRDaXNGUDwwPiwgU0RUQ2lzRlA8MT4sIFNEVENpc09wU21hbGxlclRoYW5PcDwwLCAxPgorXT47CitkZWYgU0RURlBFeHRlbmRPcCAgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgIC8vIGZleHRlbmQKKyAgU0RUQ2lzRlA8MD4sIFNEVENpc0ZQPDE+LCBTRFRDaXNPcFNtYWxsZXJUaGFuT3A8MSwgMD4KK10+OworZGVmIFNEVEludFRvRlBPcCA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgICAvLyBbc3VdaW50X3RvX2ZwIAorICBTRFRDaXNGUDwwPiwgU0RUQ2lzSW50PDE+CitdPjsKK2RlZiBTRFRGUFRvSW50T3AgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgICAgLy8gZnBfdG9fW3N1XWludCAKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNGUDwxPgorXT47CitkZWYgU0RURXh0SW5yZWcgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFsgICAgIC8vIHNleHRfaW5yZWcKKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNJbnQ8MD4sIFNEVENpc1ZUPDIsIE90aGVyVlQ+LAorICBTRFRDaXNWVFNtYWxsZXJUaGFuT3A8MiwgMT4KK10+OworCitkZWYgU0RUU2V0Q0MgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsgICAgICAgIC8vIHNldGNjCisgIFNEVENpc0ludDwwPiwgU0RUQ2lzU2FtZUFzPDEsIDI+LCBTRFRDaXNWVDwzLCBPdGhlclZUPgorXT47CisKK2RlZiBTRFRTZWxlY3QgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsgICAgICAgLy8gc2VsZWN0IAorICBTRFRDaXNJbnQ8MT4sIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzU2FtZUFzPDIsIDM+CitdPjsKKworZGVmIFNEVFNlbGVjdENDIDogU0RUeXBlUHJvZmlsZTwxLCA1LCBbICAgICAvLyBzZWxlY3RfY2MKKyAgU0RUQ2lzU2FtZUFzPDEsIDI+LCBTRFRDaXNTYW1lQXM8MywgND4sIFNEVENpc1NhbWVBczwwLCAzPiwKKyAgU0RUQ2lzVlQ8NSwgT3RoZXJWVD4KK10+OworCitkZWYgU0RUQnIgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFsgICAgICAgICAgIC8vIGJyCisgIFNEVENpc1ZUPDAsIE90aGVyVlQ+CitdPjsKKworZGVmIFNEVEJyY29uZCA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgWyAgICAgICAvLyBicmNvbmQKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNWVDwxLCBPdGhlclZUPgorXT47CisKK2RlZiBTRFRCcmluZCA6IFNEVHlwZVByb2ZpbGU8MCwgMSwgWyAgICAgICAgLy8gYnJpbmQKKyAgU0RUQ2lzUHRyVHk8MD4KK10+OworCitkZWYgU0RUTm9uZSA6IFNEVHlwZVByb2ZpbGU8MCwgMCwgW10+OyAgICAgIC8vIHJldCwgdHJhcAorCitkZWYgU0RUTG9hZCA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgICAgICAgIC8vIGxvYWQKKyAgU0RUQ2lzUHRyVHk8MT4gIAorXT47CisKK2RlZiBTRFRTdG9yZSA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgWyAgICAgICAgLy8gc3RvcmUKKyAgU0RUQ2lzUHRyVHk8MT4gIAorXT47CisKK2RlZiBTRFRJU3RvcmUgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsgICAgICAgLy8gaW5kZXhlZCBzdG9yZQorICBTRFRDaXNTYW1lQXM8MCwgMj4sIFNEVENpc1B0clR5PDA+LCBTRFRDaXNQdHJUeTwzPgorXT47CisKK2RlZiBTRFRWZWNTaHVmZmxlIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDEsIDI+CitdPjsKK2RlZiBTRFRWZWNFeHRyYWN0IDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbICAgLy8gdmVjdG9yIGV4dHJhY3QKKyAgU0RUQ2lzRWx0T2ZWZWM8MCwgMT4sIFNEVENpc1B0clR5PDI+CitdPjsKK2RlZiBTRFRWZWNJbnNlcnQgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsgICAgLy8gdmVjdG9yIGluc2VydAorICBTRFRDaXNFbHRPZlZlYzwyLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNQdHJUeTwzPgorXT47CisKK2RlZiBTVERQcmVmZXRjaCA6IFNEVHlwZVByb2ZpbGU8MCwgMywgWyAgICAgLy8gcHJlZmV0Y2gKKyAgU0RUQ2lzUHRyVHk8MD4sIFNEVENpc1NhbWVBczwxLCAyPiwgU0RUQ2lzSW50PDE+CitdPjsKKworZGVmIFNURE1lbUJhcnJpZXIgOiBTRFR5cGVQcm9maWxlPDAsIDUsIFsgICAvLyBtZW1vcnkgYmFyaWVyCisgIFNEVENpc1NhbWVBczwwLDE+LCAgU0RUQ2lzU2FtZUFzPDAsMj4sICBTRFRDaXNTYW1lQXM8MCwzPiwgU0RUQ2lzU2FtZUFzPDAsND4sCisgIFNEVENpc0ludDwwPgorXT47CitkZWYgU1REQXRvbWljMyA6IFNEVHlwZVByb2ZpbGU8MSwgMywgWworICBTRFRDaXNTYW1lQXM8MCwyPiwgIFNEVENpc1NhbWVBczwwLDM+LCBTRFRDaXNJbnQ8MD4sIFNEVENpc1B0clR5PDE+CitdPjsKK2RlZiBTVERBdG9taWMyIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbCisgIFNEVENpc1NhbWVBczwwLDI+LCBTRFRDaXNJbnQ8MD4sIFNEVENpc1B0clR5PDE+CitdPjsKKworZGVmIFNEVENvbnZlcnRPcCA6IFNEVHlwZVByb2ZpbGU8MSwgNSwgWyAvL2N2dHNzLCBzdSwgdXMsIHV1LCBmZiwgZnMsIGZ1LCBzZiwgc3UKKyAgU0RUQ2lzVlQ8MiwgT3RoZXJWVD4sIFNEVENpc1ZUPDMsIE90aGVyVlQ+LCBTRFRDaXNQdHJUeTw0PiwgU0RUQ2lzUHRyVHk8NT4KK10+OworCitjbGFzcyBTRENhbGxTZXFTdGFydDxsaXN0PFNEVHlwZUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzPiA6CisgICAgICAgIFNEVHlwZVByb2ZpbGU8MCwgMSwgY29uc3RyYWludHM+OworY2xhc3MgU0RDYWxsU2VxRW5kPGxpc3Q8U0RUeXBlQ29uc3RyYWludD4gY29uc3RyYWludHM+IDoKKyAgICAgICAgU0RUeXBlUHJvZmlsZTwwLCAyLCBjb25zdHJhaW50cz47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIE5vZGUgUHJvcGVydGllcy4KKy8vCisvLyBOb3RlOiBUaGVzZSBhcmUgaGFyZCBjb2RlZCBpbnRvIHRibGdlbi4KKy8vCitjbGFzcyBTRE5vZGVQcm9wZXJ0eTsKK2RlZiBTRE5QQ29tbXV0YXRpdmUgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBYIG9wIFkgPT0gWSBvcCBYCitkZWYgU0ROUEFzc29jaWF0aXZlIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gKFggb3AgWSkgb3AgWiA9PSBYIG9wIChZIG9wIFopCitkZWYgU0ROUEhhc0NoYWluICAgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gUi9XIGNoYWluIG9wZXJhbmQgYW5kIHJlc3VsdAorZGVmIFNETlBPdXRGbGFnICAgICA6IFNETm9kZVByb3BlcnR5OyAgIC8vIFdyaXRlIGEgZmxhZyByZXN1bHQKK2RlZiBTRE5QSW5GbGFnICAgICAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBSZWFkIGEgZmxhZyBvcGVyYW5kCitkZWYgU0ROUE9wdEluRmxhZyAgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gT3B0aW9uYWxseSByZWFkIGEgZmxhZyBvcGVyYW5kCitkZWYgU0ROUE1heVN0b3JlICAgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gTWF5IHdyaXRlIHRvIG1lbW9yeSwgc2V0cyAnbWF5U3RvcmUnLgorZGVmIFNETlBNYXlMb2FkICAgICA6IFNETm9kZVByb3BlcnR5OyAgIC8vIE1heSByZWFkIG1lbW9yeSwgc2V0cyAnbWF5TG9hZCcuCitkZWYgU0ROUFNpZGVFZmZlY3QgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gU2V0cyAnSGFzVW5tb2RlbGxlZFNpZGVFZmZlY3RzJy4KK2RlZiBTRE5QTWVtT3BlcmFuZCAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBUb3VjaGVzIG1lbW9yeSwgaGFzIGFzc29jIE1lbU9wZXJhbmQKK2RlZiBTRE5QVmFyaWFkaWMgICAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBOb2RlIGhhcyB2YXJpYWJsZSBhcmd1bWVudHMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIE5vZGUgZGVmaW5pdGlvbnMuCisvLworY2xhc3MgU0ROb2RlPHN0cmluZyBvcGNvZGUsIFNEVHlwZVByb2ZpbGUgdHlwZXByb2YsCisgICAgICAgICAgICAgbGlzdDxTRE5vZGVQcm9wZXJ0eT4gcHJvcHMgPSBbXSwgc3RyaW5nIHNkY2xhc3MgPSAiU0ROb2RlIj4geworICBzdHJpbmcgT3Bjb2RlICA9IG9wY29kZTsKKyAgc3RyaW5nIFNEQ2xhc3MgPSBzZGNsYXNzOworICBsaXN0PFNETm9kZVByb3BlcnR5PiBQcm9wZXJ0aWVzID0gcHJvcHM7CisgIFNEVHlwZVByb2ZpbGUgVHlwZVByb2ZpbGUgPSB0eXBlcHJvZjsKK30KKworLy8gU3BlY2lhbCBUYWJsZUdlbi1yZWNvZ25pemVkIGRhZyBub2RlcworZGVmIHNldDsKK2RlZiBpbXBsaWNpdDsKK2RlZiBub2RlOworZGVmIHNyY3ZhbHVlOworCitkZWYgaW1tICAgICAgICA6IFNETm9kZTwiSVNEOjpDb25zdGFudCIgICwgU0RUSW50TGVhZiAsIFtdLCAiQ29uc3RhbnRTRE5vZGUiPjsKK2RlZiB0aW1tICAgICAgIDogU0ROb2RlPCJJU0Q6OlRhcmdldENvbnN0YW50IixTRFRJbnRMZWFmLCBbXSwgIkNvbnN0YW50U0ROb2RlIj47CitkZWYgZnBpbW0gICAgICA6IFNETm9kZTwiSVNEOjpDb25zdGFudEZQIiwgU0RURlBMZWFmICAsIFtdLCAiQ29uc3RhbnRGUFNETm9kZSI+OworZGVmIHZ0ICAgICAgICAgOiBTRE5vZGU8IklTRDo6VkFMVUVUWVBFIiAsIFNEVE90aGVyICAgLCBbXSwgIlZUU0ROb2RlIj47CitkZWYgYmIgICAgICAgICA6IFNETm9kZTwiSVNEOjpCYXNpY0Jsb2NrIiwgU0RUT3RoZXIgICAsIFtdLCAiQmFzaWNCbG9ja1NETm9kZSI+OworZGVmIGNvbmQgICAgICAgOiBTRE5vZGU8IklTRDo6Q09ORENPREUiICAsIFNEVE90aGVyICAgLCBbXSwgIkNvbmRDb2RlU0ROb2RlIj47CitkZWYgdW5kZWYgICAgICA6IFNETm9kZTwiSVNEOjpVTkRFRiIgICAgICwgU0RUVU5ERUYgICAsIFtdPjsKK2RlZiBnbG9iYWxhZGRyIDogU0ROb2RlPCJJU0Q6Okdsb2JhbEFkZHJlc3MiLCAgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdsb2JhbEFkZHJlc3NTRE5vZGUiPjsKK2RlZiB0Z2xvYmFsYWRkciA6IFNETm9kZTwiSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzIiwgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJHbG9iYWxBZGRyZXNzU0ROb2RlIj47CitkZWYgZ2xvYmFsdGxzYWRkciA6IFNETm9kZTwiSVNEOjpHbG9iYWxUTFNBZGRyZXNzIiwgICAgICAgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkdsb2JhbEFkZHJlc3NTRE5vZGUiPjsKK2RlZiB0Z2xvYmFsdGxzYWRkciA6IFNETm9kZTwiSVNEOjpUYXJnZXRHbG9iYWxUTFNBZGRyZXNzIiwgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdsb2JhbEFkZHJlc3NTRE5vZGUiPjsKK2RlZiBjb25zdHBvb2wgICA6IFNETm9kZTwiSVNEOjpDb25zdGFudFBvb2wiLCAgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJDb25zdGFudFBvb2xTRE5vZGUiPjsKK2RlZiB0Y29uc3Rwb29sICA6IFNETm9kZTwiSVNEOjpUYXJnZXRDb25zdGFudFBvb2wiLCAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJDb25zdGFudFBvb2xTRE5vZGUiPjsKK2RlZiBqdW1wdGFibGUgICA6IFNETm9kZTwiSVNEOjpKdW1wVGFibGUiLCAgICAgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJKdW1wVGFibGVTRE5vZGUiPjsKK2RlZiB0anVtcHRhYmxlICA6IFNETm9kZTwiSVNEOjpUYXJnZXRKdW1wVGFibGUiLCAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJKdW1wVGFibGVTRE5vZGUiPjsKK2RlZiBmcmFtZWluZGV4ICA6IFNETm9kZTwiSVNEOjpGcmFtZUluZGV4IiwgICAgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZUluZGV4U0ROb2RlIj47CitkZWYgdGZyYW1laW5kZXggOiBTRE5vZGU8IklTRDo6VGFyZ2V0RnJhbWVJbmRleCIsICAgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWVJbmRleFNETm9kZSI+OworZGVmIGV4dGVybmFsc3ltIDogU0ROb2RlPCJJU0Q6OkV4dGVybmFsU3ltYm9sIiwgICAgICAgU0RUUHRyTGVhZiwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dGVybmFsU3ltYm9sU0ROb2RlIj47CitkZWYgdGV4dGVybmFsc3ltOiBTRE5vZGU8IklTRDo6VGFyZ2V0RXh0ZXJuYWxTeW1ib2wiLCBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0ZXJuYWxTeW1ib2xTRE5vZGUiPjsKK2RlZiBibG9ja2FkZHJlc3MgOiBTRE5vZGU8IklTRDo6QmxvY2tBZGRyZXNzIiwgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJCbG9ja0FkZHJlc3NTRE5vZGUiPjsKK2RlZiB0YmxvY2thZGRyZXNzOiBTRE5vZGU8IklTRDo6VGFyZ2V0QmxvY2tBZGRyZXNzIiwgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJCbG9ja0FkZHJlc3NTRE5vZGUiPjsKKworZGVmIGFkZCAgICAgICAgOiBTRE5vZGU8IklTRDo6QUREIiAgICAgICAsIFNEVEludEJpbk9wICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgc3ViICAgICAgICA6IFNETm9kZTwiSVNEOjpTVUIiICAgICAgICwgU0RUSW50QmluT3A+OworZGVmIG11bCAgICAgICAgOiBTRE5vZGU8IklTRDo6TVVMIiAgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgbXVsaHMgICAgICA6IFNETm9kZTwiSVNEOjpNVUxIUyIgICAgICwgU0RUSW50QmluT3AsIFtTRE5QQ29tbXV0YXRpdmVdPjsKK2RlZiBtdWxodSAgICAgIDogU0ROb2RlPCJJU0Q6Ok1VTEhVIiAgICAgLCBTRFRJbnRCaW5PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIHNtdWxsb2hpICAgOiBTRE5vZGU8IklTRDo6U01VTF9MT0hJIiAsIFNEVEludEJpbkhpTG9PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIHVtdWxsb2hpICAgOiBTRE5vZGU8IklTRDo6VU1VTF9MT0hJIiAsIFNEVEludEJpbkhpTG9PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIHNkaXYgICAgICAgOiBTRE5vZGU8IklTRDo6U0RJViIgICAgICAsIFNEVEludEJpbk9wPjsKK2RlZiB1ZGl2ICAgICAgIDogU0ROb2RlPCJJU0Q6OlVESVYiICAgICAgLCBTRFRJbnRCaW5PcD47CitkZWYgc3JlbSAgICAgICA6IFNETm9kZTwiSVNEOjpTUkVNIiAgICAgICwgU0RUSW50QmluT3A+OworZGVmIHVyZW0gICAgICAgOiBTRE5vZGU8IklTRDo6VVJFTSIgICAgICAsIFNEVEludEJpbk9wPjsKK2RlZiBzZGl2cmVtICAgIDogU0ROb2RlPCJJU0Q6OlNESVZSRU0iICAgLCBTRFRJbnRCaW5IaUxvT3A+OworZGVmIHVkaXZyZW0gICAgOiBTRE5vZGU8IklTRDo6VURJVlJFTSIgICAsIFNEVEludEJpbkhpTG9PcD47CitkZWYgc3JsICAgICAgICA6IFNETm9kZTwiSVNEOjpTUkwiICAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgc3JhICAgICAgICA6IFNETm9kZTwiSVNEOjpTUkEiICAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgc2hsICAgICAgICA6IFNETm9kZTwiSVNEOjpTSEwiICAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgcm90bCAgICAgICA6IFNETm9kZTwiSVNEOjpST1RMIiAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgcm90ciAgICAgICA6IFNETm9kZTwiSVNEOjpST1RSIiAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgYW5kICAgICAgICA6IFNETm9kZTwiSVNEOjpBTkQiICAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QQXNzb2NpYXRpdmVdPjsKK2RlZiBvciAgICAgICAgIDogU0ROb2RlPCJJU0Q6Ok9SIiAgICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmUsIFNETlBBc3NvY2lhdGl2ZV0+OworZGVmIHhvciAgICAgICAgOiBTRE5vZGU8IklTRDo6WE9SIiAgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgYWRkYyAgICAgICA6IFNETm9kZTwiSVNEOjpBRERDIiAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QT3V0RmxhZ10+OworZGVmIGFkZGUgICAgICAgOiBTRE5vZGU8IklTRDo6QURERSIgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUE91dEZsYWcsIFNETlBJbkZsYWddPjsKK2RlZiBzdWJjICAgICAgIDogU0ROb2RlPCJJU0Q6OlNVQkMiICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QT3V0RmxhZ10+OworZGVmIHN1YmUgICAgICAgOiBTRE5vZGU8IklTRDo6U1VCRSIgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBPdXRGbGFnLCBTRE5QSW5GbGFnXT47CisgICAgICAgICAgICAgICAgICAgICAgICAKK2RlZiBzZXh0X2lucmVnIDogU0ROb2RlPCJJU0Q6OlNJR05fRVhURU5EX0lOUkVHIiwgU0RURXh0SW5yZWc+OworZGVmIGJzd2FwICAgICAgOiBTRE5vZGU8IklTRDo6QlNXQVAiICAgICAgLCBTRFRJbnRVbmFyeU9wPjsKK2RlZiBjdGx6ICAgICAgIDogU0ROb2RlPCJJU0Q6OkNUTFoiICAgICAgICwgU0RUSW50VW5hcnlPcD47CitkZWYgY3R0eiAgICAgICA6IFNETm9kZTwiSVNEOjpDVFRaIiAgICAgICAsIFNEVEludFVuYXJ5T3A+OworZGVmIGN0cG9wICAgICAgOiBTRE5vZGU8IklTRDo6Q1RQT1AiICAgICAgLCBTRFRJbnRVbmFyeU9wPjsKK2RlZiBzZXh0ICAgICAgIDogU0ROb2RlPCJJU0Q6OlNJR05fRVhURU5EIiwgU0RUSW50RXh0ZW5kT3A+OworZGVmIHpleHQgICAgICAgOiBTRE5vZGU8IklTRDo6WkVST19FWFRFTkQiLCBTRFRJbnRFeHRlbmRPcD47CitkZWYgYW55ZXh0ICAgICA6IFNETm9kZTwiSVNEOjpBTllfRVhURU5EIiAsIFNEVEludEV4dGVuZE9wPjsKK2RlZiB0cnVuYyAgICAgIDogU0ROb2RlPCJJU0Q6OlRSVU5DQVRFIiAgICwgU0RUSW50VHJ1bmNPcD47CitkZWYgYml0Y29udmVydCA6IFNETm9kZTwiSVNEOjpCSVRfQ09OVkVSVCIsIFNEVFVuYXJ5T3A+OworZGVmIGV4dHJhY3RlbHQgOiBTRE5vZGU8IklTRDo6RVhUUkFDVF9WRUNUT1JfRUxUIiwgU0RUVmVjRXh0cmFjdD47CitkZWYgaW5zZXJ0ZWx0ICA6IFNETm9kZTwiSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCIsIFNEVFZlY0luc2VydD47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIAorZGVmIGZhZGQgICAgICAgOiBTRE5vZGU8IklTRDo6RkFERCIgICAgICAgLCBTRFRGUEJpbk9wLCBbU0ROUENvbW11dGF0aXZlXT47CitkZWYgZnN1YiAgICAgICA6IFNETm9kZTwiSVNEOjpGU1VCIiAgICAgICAsIFNEVEZQQmluT3A+OworZGVmIGZtdWwgICAgICAgOiBTRE5vZGU8IklTRDo6Rk1VTCIgICAgICAgLCBTRFRGUEJpbk9wLCBbU0ROUENvbW11dGF0aXZlXT47CitkZWYgZmRpdiAgICAgICA6IFNETm9kZTwiSVNEOjpGRElWIiAgICAgICAsIFNEVEZQQmluT3A+OworZGVmIGZyZW0gICAgICAgOiBTRE5vZGU8IklTRDo6RlJFTSIgICAgICAgLCBTRFRGUEJpbk9wPjsKK2RlZiBmYWJzICAgICAgIDogU0ROb2RlPCJJU0Q6OkZBQlMiICAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmbmVnICAgICAgIDogU0ROb2RlPCJJU0Q6OkZORUciICAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmc3FydCAgICAgIDogU0ROb2RlPCJJU0Q6OkZTUVJUIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmc2luICAgICAgIDogU0ROb2RlPCJJU0Q6OkZTSU4iICAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmY29zICAgICAgIDogU0ROb2RlPCJJU0Q6OkZDT1MiICAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmZXhwMiAgICAgIDogU0ROb2RlPCJJU0Q6OkZFWFAyIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmbG9nMiAgICAgIDogU0ROb2RlPCJJU0Q6OkZMT0cyIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmcmludCAgICAgIDogU0ROb2RlPCJJU0Q6OkZSSU5UIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmdHJ1bmMgICAgIDogU0ROb2RlPCJJU0Q6OkZUUlVOQyIgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmY2VpbCAgICAgIDogU0ROb2RlPCJJU0Q6OkZDRUlMIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmZmxvb3IgICAgIDogU0ROb2RlPCJJU0Q6OkZGTE9PUiIgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmbmVhcmJ5aW50IDogU0ROb2RlPCJJU0Q6OkZORUFSQllJTlQiICwgU0RURlBVbmFyeU9wPjsKKworZGVmIGZyb3VuZCAgICAgOiBTRE5vZGU8IklTRDo6RlBfUk9VTkQiICAgLCBTRFRGUFJvdW5kT3A+OworZGVmIGZleHRlbmQgICAgOiBTRE5vZGU8IklTRDo6RlBfRVhURU5EIiAgLCBTRFRGUEV4dGVuZE9wPjsKK2RlZiBmY29weXNpZ24gIDogU0ROb2RlPCJJU0Q6OkZDT1BZU0lHTiIgICwgU0RURlBTaWduT3A+OworCitkZWYgc2ludF90b19mcCA6IFNETm9kZTwiSVNEOjpTSU5UX1RPX0ZQIiAsIFNEVEludFRvRlBPcD47CitkZWYgdWludF90b19mcCA6IFNETm9kZTwiSVNEOjpVSU5UX1RPX0ZQIiAsIFNEVEludFRvRlBPcD47CitkZWYgZnBfdG9fc2ludCA6IFNETm9kZTwiSVNEOjpGUF9UT19TSU5UIiAsIFNEVEZQVG9JbnRPcD47CitkZWYgZnBfdG9fdWludCA6IFNETm9kZTwiSVNEOjpGUF9UT19VSU5UIiAsIFNEVEZQVG9JbnRPcD47CitkZWYgZjE2X3RvX2YzMiA6IFNETm9kZTwiSVNEOjpGUDE2X1RPX0ZQMzIiLCBTRFRJbnRUb0ZQT3A+OworZGVmIGYzMl90b19mMTYgOiBTRE5vZGU8IklTRDo6RlAzMl9UT19GUDE2IiwgU0RURlBUb0ludE9wPjsKKworZGVmIHNldGNjICAgICAgOiBTRE5vZGU8IklTRDo6U0VUQ0MiICAgICAgLCBTRFRTZXRDQz47CitkZWYgc2VsZWN0ICAgICA6IFNETm9kZTwiSVNEOjpTRUxFQ1QiICAgICAsIFNEVFNlbGVjdD47CitkZWYgc2VsZWN0Y2MgICA6IFNETm9kZTwiSVNEOjpTRUxFQ1RfQ0MiICAsIFNEVFNlbGVjdENDPjsKK2RlZiB2c2V0Y2MgICAgIDogU0ROb2RlPCJJU0Q6OlZTRVRDQyIgICAgICwgU0RUU2V0Q0M+OworCitkZWYgYnJjb25kICAgICA6IFNETm9kZTwiSVNEOjpCUkNPTkQiICAgICAsIFNEVEJyY29uZCwgW1NETlBIYXNDaGFpbl0+OworZGVmIGJyaW5kICAgICAgOiBTRE5vZGU8IklTRDo6QlJJTkQiICAgICAgLCBTRFRCcmluZCwgIFtTRE5QSGFzQ2hhaW5dPjsKK2RlZiBiciAgICAgICAgIDogU0ROb2RlPCJJU0Q6OkJSIiAgICAgICAgICwgU0RUQnIsICAgICBbU0ROUEhhc0NoYWluXT47CitkZWYgdHJhcCAgICAgICA6IFNETm9kZTwiSVNEOjpUUkFQIiAgICAgICAsIFNEVE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QU2lkZUVmZmVjdF0+OworCitkZWYgcHJlZmV0Y2ggICA6IFNETm9kZTwiSVNEOjpQUkVGRVRDSCIgICAsIFNURFByZWZldGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heUxvYWQsIFNETlBNYXlTdG9yZV0+OworCitkZWYgbWVtYmFycmllciA6IFNETm9kZTwiSVNEOjpNRU1CQVJSSUVSIiAsIFNURE1lbUJhcnJpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QU2lkZUVmZmVjdF0+OworCitkZWYgYXRvbWljX2NtcF9zd2FwIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19DTVBfU1dBUCIgLCBTVERBdG9taWMzLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX2FkZCA6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9BREQiICwgU1REQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfc3dhcCAgICAgOiBTRE5vZGU8IklTRDo6QVRPTUlDX1NXQVAiLCBTVERBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX3N1YiA6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9TVUIiICwgU1REQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF9hbmQgOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfQU5EIiAsIFNUREF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfb3IgIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX09SIiAsIFNUREF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfeG9yIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX1hPUiIgLCBTVERBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX25hbmQ6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9OQU5EIiwgU1REQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF9taW4gOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfTUlOIiwgU1REQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF9tYXggOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfTUFYIiwgU1REQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF91bWluIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX1VNSU4iLCBTVERBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX3VtYXggOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfVU1BWCIsIFNUREF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CisKKy8vIERvIG5vdCB1c2UgbGQsIHN0IGRpcmVjdGx5LiBVc2UgbG9hZCwgZXh0bG9hZCwgc2V4dGxvYWQsIHpleHRsb2FkLCBzdG9yZSwKKy8vIGFuZCB0cnVuY3N0IChzZWUgYmVsb3cpLgorZGVmIGxkICAgICAgICAgOiBTRE5vZGU8IklTRDo6TE9BRCIgICAgICAgLCBTRFRMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgc3QgICAgICAgICA6IFNETm9kZTwiSVNEOjpTVE9SRSIgICAgICAsIFNEVFN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGlzdCAgICAgICAgOiBTRE5vZGU8IklTRDo6U1RPUkUiICAgICAgLCBTRFRJU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNZW1PcGVyYW5kXT47CisKK2RlZiB2ZWN0b3Jfc2h1ZmZsZSA6IFNETm9kZTwiSVNEOjpWRUNUT1JfU0hVRkZMRSIsIFNEVFZlY1NodWZmbGUsIFtdPjsKK2RlZiBidWlsZF92ZWN0b3IgOiBTRE5vZGU8IklTRDo6QlVJTERfVkVDVE9SIiwgU0RUeXBlUHJvZmlsZTwxLCAtMSwgW10+LCBbXT47CitkZWYgc2NhbGFyX3RvX3ZlY3RvciA6IFNETm9kZTwiSVNEOjpTQ0FMQVJfVE9fVkVDVE9SIiwgU0RUeXBlUHJvZmlsZTwxLCAxLCBbXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47CitkZWYgdmVjdG9yX2V4dHJhY3QgOiBTRE5vZGU8IklTRDo6RVhUUkFDVF9WRUNUT1JfRUxUIiwKKyAgICBTRFR5cGVQcm9maWxlPDEsIDIsIFtTRFRDaXNQdHJUeTwyPl0+LCBbXT47CitkZWYgdmVjdG9yX2luc2VydCA6IFNETm9kZTwiSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCIsCisgICAgU0RUeXBlUHJvZmlsZTwxLCAzLCBbU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNQdHJUeTwzPl0+LCBbXT47CisgICAgCisvLyBOb2RlcyBmb3IgaW50cmluc2ljcywgeW91IHNob3VsZCB1c2UgdGhlIGludHJpbnNpYyBpdHNlbGYgYW5kIGxldCB0YmxnZW4gdXNlCisvLyB0aGVzZSBpbnRlcm5hbGx5LiAgRG9uJ3QgcmVmZXJlbmNlIHRoZXNlIGRpcmVjdGx5LgorZGVmIGludHJpbnNpY192b2lkIDogU0ROb2RlPCJJU0Q6OklOVFJJTlNJQ19WT0lEIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUeXBlUHJvZmlsZTwwLCAtMSwgW1NEVENpc1B0clR5PDA+XT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+OworZGVmIGludHJpbnNpY193X2NoYWluIDogU0ROb2RlPCJJU0Q6OklOVFJJTlNJQ19XX0NIQUlOIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUeXBlUHJvZmlsZTwxLCAtMSwgW1NEVENpc1B0clR5PDE+XT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+OworZGVmIGludHJpbnNpY193b19jaGFpbiA6IFNETm9kZTwiSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUeXBlUHJvZmlsZTwxLCAtMSwgW1NEVENpc1B0clR5PDE+XT4sIFtdPjsKKworLy8gRG8gbm90IHVzZSBjdnQgZGlyZWN0bHkuIFVzZSBjdnQgZm9ybXMgYmVsb3cKK2RlZiBjdnQgOiBTRE5vZGU8IklTRDo6Q09OVkVSVF9STkRTQVQiLCBTRFRDb252ZXJ0T3A+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2VsZWN0aW9uIERBRyBDb25kaXRpb24gQ29kZXMKKworY2xhc3MgQ29uZENvZGU7IC8vIElTRDo6Q29uZENvZGUgZW51bXMKK2RlZiBTRVRPRVEgOiBDb25kQ29kZTsgZGVmIFNFVE9HVCA6IENvbmRDb2RlOworZGVmIFNFVE9HRSA6IENvbmRDb2RlOyBkZWYgU0VUT0xUIDogQ29uZENvZGU7IGRlZiBTRVRPTEUgOiBDb25kQ29kZTsKK2RlZiBTRVRPTkUgOiBDb25kQ29kZTsgZGVmIFNFVE8gICA6IENvbmRDb2RlOyBkZWYgU0VUVU8gIDogQ29uZENvZGU7CitkZWYgU0VUVUVRIDogQ29uZENvZGU7IGRlZiBTRVRVR1QgOiBDb25kQ29kZTsgZGVmIFNFVFVHRSA6IENvbmRDb2RlOworZGVmIFNFVFVMVCA6IENvbmRDb2RlOyBkZWYgU0VUVUxFIDogQ29uZENvZGU7IGRlZiBTRVRVTkUgOiBDb25kQ29kZTsKKworZGVmIFNFVEVRIDogQ29uZENvZGU7IGRlZiBTRVRHVCA6IENvbmRDb2RlOyBkZWYgU0VUR0UgOiBDb25kQ29kZTsKK2RlZiBTRVRMVCA6IENvbmRDb2RlOyBkZWYgU0VUTEUgOiBDb25kQ29kZTsgZGVmIFNFVE5FIDogQ29uZENvZGU7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNlbGVjdGlvbiBEQUcgTm9kZSBUcmFuc2Zvcm1hdGlvbiBGdW5jdGlvbnMuCisvLworLy8gVGhpcyBtZWNoYW5pc20gYWxsb3dzIHRhcmdldHMgdG8gbWFuaXB1bGF0ZSBub2RlcyBpbiB0aGUgb3V0cHV0IERBRyBvbmNlIGEKKy8vIG1hdGNoIGhhcyBiZWVuIGZvcm1lZC4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gbWFuaXB1bGF0ZSBpbW1lZGlhdGUKKy8vIHZhbHVlcy4KKy8vCitjbGFzcyBTRE5vZGVYRm9ybTxTRE5vZGUgb3BjLCBjb2RlIHhmb3JtRnVuY3Rpb24+IHsKKyAgU0ROb2RlIE9wY29kZSA9IG9wYzsKKyAgY29kZSBYRm9ybUZ1bmN0aW9uID0geGZvcm1GdW5jdGlvbjsKK30KKworZGVmIE5PT1BfU0ROb2RlWEZvcm0gOiBTRE5vZGVYRm9ybTxpbW0sIFt7fV0+OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIFBhdHRlcm4gRnJhZ21lbnRzLgorLy8KKy8vIFBhdHRlcm4gZnJhZ21lbnRzIGFyZSByZXVzYWJsZSBjaHVua3Mgb2YgZGFncyB0aGF0IG1hdGNoIHNwZWNpZmljIHRoaW5ncy4KKy8vIFRoZXkgY2FuIHRha2UgYXJndW1lbnRzIGFuZCBoYXZlIEMrKyBwcmVkaWNhdGVzIHRoYXQgY29udHJvbCB3aGV0aGVyIHRoZXkKKy8vIG1hdGNoLiAgVGhleSBhcmUgaW50ZW5kZWQgdG8gbWFrZSB0aGUgcGF0dGVybnMgZm9yIGNvbW1vbiBpbnN0cnVjdGlvbnMgbW9yZQorLy8gY29tcGFjdCBhbmQgcmVhZGFibGUuCisvLworCisvLy8gUGF0RnJhZyAtIFJlcHJlc2VudHMgYSBwYXR0ZXJuIGZyYWdtZW50LiAgVGhpcyBjYW4gbWF0Y2ggc29tZXRoaW5nIG9uIHRoZQorLy8vIERBRywgZnJhbWUgYSBzaW5nbGUgbm9kZSB0byBtdWx0aXBseSBuZXN0ZWQgb3RoZXIgZnJhZ21lbnRzLgorLy8vCitjbGFzcyBQYXRGcmFnPGRhZyBvcHMsIGRhZyBmcmFnLCBjb2RlIHByZWQgPSBbe31dLAorICAgICAgICAgICAgICBTRE5vZGVYRm9ybSB4Zm9ybSA9IE5PT1BfU0ROb2RlWEZvcm0+IHsKKyAgZGFnIE9wZXJhbmRzID0gb3BzOworICBkYWcgRnJhZ21lbnQgPSBmcmFnOworICBjb2RlIFByZWRpY2F0ZSA9IHByZWQ7CisgIFNETm9kZVhGb3JtIE9wZXJhbmRUcmFuc2Zvcm0gPSB4Zm9ybTsKK30KKworLy8gUGF0TGVhZidzIGFyZSBwYXR0ZXJuIGZyYWdtZW50cyB0aGF0IGhhdmUgbm8gb3BlcmFuZHMuICBUaGlzIGlzIGp1c3QgYSBoZWxwZXIKKy8vIHRvIGRlZmluZSBpbW1lZGlhdGVzIGFuZCBvdGhlciBjb21tb24gdGhpbmdzIGNvbmNpc2VseS4KK2NsYXNzIFBhdExlYWY8ZGFnIGZyYWcsIGNvZGUgcHJlZCA9IFt7fV0sIFNETm9kZVhGb3JtIHhmb3JtID0gTk9PUF9TRE5vZGVYRm9ybT4KKyA6IFBhdEZyYWc8KG9wcyksIGZyYWcsIHByZWQsIHhmb3JtPjsKKworLy8gTGVhZiBmcmFnbWVudHMuCisKK2RlZiB2dEludCAgICAgIDogUGF0TGVhZjwodnQpLCAgW3sgcmV0dXJuIE4tPmdldFZUKCkuaXNJbnRlZ2VyKCk7IH1dPjsKK2RlZiB2dEZQICAgICAgIDogUGF0TGVhZjwodnQpLCAgW3sgcmV0dXJuIE4tPmdldFZUKCkuaXNGbG9hdGluZ1BvaW50KCk7IH1dPjsKKworZGVmIGltbUFsbE9uZXNWOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbeworICByZXR1cm4gSVNEOjppc0J1aWxkVmVjdG9yQWxsT25lcyhOKTsKK31dPjsKK2RlZiBpbW1BbGxaZXJvc1Y6IFBhdExlYWY8KGJ1aWxkX3ZlY3RvciksIFt7CisgIHJldHVybiBJU0Q6OmlzQnVpbGRWZWN0b3JBbGxaZXJvcyhOKTsKK31dPjsKKworCisKKy8vIE90aGVyIGhlbHBlciBmcmFnbWVudHMuCitkZWYgbm90ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksICh4b3Igbm9kZTokaW4sIC0xKT47CitkZWYgdm5vdCA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksICh4b3Igbm9kZTokaW4sIGltbUFsbE9uZXNWKT47CitkZWYgaW5lZyA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksIChzdWIgMCwgbm9kZTokaW4pPjsKKworLy8gbG9hZCBmcmFnbWVudHMuCitkZWYgdW5pbmRleGVkbG9hZCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAobGQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEFkZHJlc3NpbmdNb2RlKCkgPT0gSVNEOjpVTklOREVYRUQ7Cit9XT47CitkZWYgbG9hZCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodW5pbmRleGVkbG9hZCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6Tk9OX0VYVExPQUQ7Cit9XT47CisKKy8vIGV4dGVuZGluZyBsb2FkIGZyYWdtZW50cy4KK2RlZiBleHRsb2FkICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHVuaW5kZXhlZGxvYWQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6OkVYVExPQUQ7Cit9XT47CitkZWYgc2V4dGxvYWQgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh1bmluZGV4ZWRsb2FkIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpTRVhUTE9BRDsKK31dPjsKK2RlZiB6ZXh0bG9hZCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHVuaW5kZXhlZGxvYWQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6OlpFWFRMT0FEOworfV0+OworCitkZWYgZXh0bG9hZGkxICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkxOworfV0+OworZGVmIGV4dGxvYWRpOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGV4dGxvYWQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppODsKK31dPjsKK2RlZiBleHRsb2FkaTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChleHRsb2FkIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpID09IE1WVDo6aTE2OworfV0+OworZGVmIGV4dGxvYWRpMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGV4dGxvYWQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppMzI7Cit9XT47CitkZWYgZXh0bG9hZGYzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmYzMjsKK31dPjsKK2RlZiBleHRsb2FkZjY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChleHRsb2FkIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpID09IE1WVDo6ZjY0OworfV0+OworCitkZWYgc2V4dGxvYWRpMSAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHNleHRsb2FkIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpID09IE1WVDo6aTE7Cit9XT47CitkZWYgc2V4dGxvYWRpOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHNleHRsb2FkIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpID09IE1WVDo6aTg7Cit9XT47CitkZWYgc2V4dGxvYWRpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHNleHRsb2FkIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpID09IE1WVDo6aTE2OworfV0+OworZGVmIHNleHRsb2FkaTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChzZXh0bG9hZCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkzMjsKK31dPjsKKworZGVmIHpleHRsb2FkaTEgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh6ZXh0bG9hZCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkxOworfV0+OworZGVmIHpleHRsb2FkaTggIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh6ZXh0bG9hZCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6Omk4OworfV0+OworZGVmIHpleHRsb2FkaTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh6ZXh0bG9hZCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkxNjsKK31dPjsKK2RlZiB6ZXh0bG9hZGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoemV4dGxvYWQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppMzI7Cit9XT47CisKKy8vIHN0b3JlIGZyYWdtZW50cy4KK2RlZiB1bmluZGV4ZWRzdG9yZSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdCBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0QWRkcmVzc2luZ01vZGUoKSA9PSBJU0Q6OlVOSU5ERVhFRDsKK31dPjsKK2RlZiBzdG9yZSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICh1bmluZGV4ZWRzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiAhY2FzdDxTdG9yZVNETm9kZT4oTiktPmlzVHJ1bmNhdGluZ1N0b3JlKCk7Cit9XT47CisKKy8vIHRydW5jc3RvcmUgZnJhZ21lbnRzLgorZGVmIHRydW5jc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1bmluZGV4ZWRzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+aXNUcnVuY2F0aW5nU3RvcmUoKTsKK31dPjsKK2RlZiB0cnVuY3N0b3JlaTggOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRydW5jc3RvcmUgbm9kZTokdmFsLCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppODsKK31dPjsKK2RlZiB0cnVuY3N0b3JlaTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkxNjsKK31dPjsKK2RlZiB0cnVuY3N0b3JlaTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkzMjsKK31dPjsKK2RlZiB0cnVuY3N0b3JlZjMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmYzMjsKK31dPjsKK2RlZiB0cnVuY3N0b3JlZjY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmY2NDsKK31dPjsKKworLy8gaW5kZXhlZCBzdG9yZSBmcmFnbWVudHMuCitkZWYgaXN0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLCBbeworICByZXR1cm4gIWNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5pc1RydW5jYXRpbmdTdG9yZSgpOworfV0+OworCitkZWYgcHJlX3N0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpc3RvcmUgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLCBbeworICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldEFkZHJlc3NpbmdNb2RlKCk7CisgIHJldHVybiBBTSA9PSBJU0Q6OlBSRV9JTkMgfHwgQU0gPT0gSVNEOjpQUkVfREVDOworfV0+OworCitkZWYgaXRydW5jc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaXN0IG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwgW3sKKyAgcmV0dXJuIGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5pc1RydW5jYXRpbmdTdG9yZSgpOworfV0+OworZGVmIHByZV90cnVuY3N0IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0cnVuY3N0b3JlIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwgW3sKKyAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSA9IGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5nZXRBZGRyZXNzaW5nTW9kZSgpOworICByZXR1cm4gQU0gPT0gSVNEOjpQUkVfSU5DIHx8IEFNID09IElTRDo6UFJFX0RFQzsKK31dPjsKK2RlZiBwcmVfdHJ1bmNzdGkxIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlX3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLCBbeworICByZXR1cm4gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppMTsKK31dPjsKK2RlZiBwcmVfdHJ1bmNzdGk4IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlX3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLCBbeworICByZXR1cm4gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppODsKK31dPjsKK2RlZiBwcmVfdHJ1bmNzdGkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkxNjsKK31dPjsKK2RlZiBwcmVfdHJ1bmNzdGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkzMjsKK31dPjsKK2RlZiBwcmVfdHJ1bmNzdGYzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmYzMjsKK31dPjsKKworZGVmIHBvc3Rfc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciwgbm9kZTokb2Zmc2V0KSwgW3sKKyAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSA9IGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5nZXRBZGRyZXNzaW5nTW9kZSgpOworICByZXR1cm4gQU0gPT0gSVNEOjpQT1NUX0lOQyB8fCBBTSA9PSBJU0Q6OlBPU1RfREVDOworfV0+OworCitkZWYgcG9zdF90cnVuY3N0IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksIFt7CisgIElTRDo6TWVtSW5kZXhlZE1vZGUgQU0gPSBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0QWRkcmVzc2luZ01vZGUoKTsKKyAgcmV0dXJuIEFNID09IElTRDo6UE9TVF9JTkMgfHwgQU0gPT0gSVNEOjpQT1NUX0RFQzsKK31dPjsKK2RlZiBwb3N0X3RydW5jc3RpMSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3N0X3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLCBbeworICByZXR1cm4gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppMTsKK31dPjsKK2RlZiBwb3N0X3RydW5jc3RpOCA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3N0X3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLCBbeworICByZXR1cm4gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppODsKK31dPjsKK2RlZiBwb3N0X3RydW5jc3RpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc3RfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkxNjsKK31dPjsKK2RlZiBwb3N0X3RydW5jc3RpMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc3RfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkzMjsKK31dPjsKK2RlZiBwb3N0X3RydW5jc3RmMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc3RfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmYzMjsKK31dPjsKKworLy8gc2V0Y2MgY29udmVuaWVuY2UgZnJhZ21lbnRzLgorZGVmIHNldG9lcSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9FUSk+OworZGVmIHNldG9ndCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9HVCk+OworZGVmIHNldG9nZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9HRSk+OworZGVmIHNldG9sdCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9MVCk+OworZGVmIHNldG9sZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9MRSk+OworZGVmIHNldG9uZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9ORSk+OworZGVmIHNldG8gICA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE8pPjsKK2RlZiBzZXR1byAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRVTyk+OworZGVmIHNldHVlcSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVFUSk+OworZGVmIHNldHVndCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVHVCk+OworZGVmIHNldHVnZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVHRSk+OworZGVmIHNldHVsdCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVMVCk+OworZGVmIHNldHVsZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVMRSk+OworZGVmIHNldHVuZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVORSk+OworZGVmIHNldGVxICA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVEVRKT47CitkZWYgc2V0Z3QgIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgIChzZXRjYyBub2RlOiRsaHMsIG5vZGU6JHJocywgU0VUR1QpPjsKK2RlZiBzZXRnZSAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRHRSk+OworZGVmIHNldGx0ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVExUKT47CitkZWYgc2V0bGUgIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgIChzZXRjYyBub2RlOiRsaHMsIG5vZGU6JHJocywgU0VUTEUpPjsKK2RlZiBzZXRuZSAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRORSk+OworCitkZWYgYXRvbWljX2NtcF9zd2FwXzggOgorICBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHN3YXApLAorICAgICAgICAgIChhdG9taWNfY21wX3N3YXAgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHN3YXApLCBbeworICByZXR1cm4gY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpID09IE1WVDo6aTg7Cit9XT47CitkZWYgYXRvbWljX2NtcF9zd2FwXzE2IDoKKyAgUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiRzd2FwKSwKKyAgICAgICAgICAoYXRvbWljX2NtcF9zd2FwIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiRzd2FwKSwgW3sKKyAgcmV0dXJuIGNhc3Q8QXRvbWljU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkxNjsKK31dPjsKK2RlZiBhdG9taWNfY21wX3N3YXBfMzIgOgorICBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHN3YXApLAorICAgICAgICAgIChhdG9taWNfY21wX3N3YXAgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHN3YXApLCBbeworICByZXR1cm4gY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpID09IE1WVDo6aTMyOworfV0+OworZGVmIGF0b21pY19jbXBfc3dhcF82NCA6CisgIFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokc3dhcCksCisgICAgICAgICAgKGF0b21pY19jbXBfc3dhcCBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokc3dhcCksIFt7CisgIHJldHVybiBjYXN0PEF0b21pY1NETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppNjQ7Cit9XT47CisKK211bHRpY2xhc3MgYmluYXJ5X2F0b21pY19vcDxTRE5vZGUgYXRvbWljX29wPiB7CisgIGRlZiBfOCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JHZhbCksCisgICAgICAgICAgICAgICAgICAgKGF0b21pY19vcCBub2RlOiRwdHIsIG5vZGU6JHZhbCksIFt7CisgICAgcmV0dXJuIGNhc3Q8QXRvbWljU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6Omk4OworICB9XT47CisgIGRlZiBfMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiR2YWwpLAorICAgICAgICAgICAgICAgICAgIChhdG9taWNfb3Agbm9kZTokcHRyLCBub2RlOiR2YWwpLCBbeworICAgIHJldHVybiBjYXN0PEF0b21pY1NETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjppMTY7CisgIH1dPjsKKyAgZGVmIF8zMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JHZhbCksCisgICAgICAgICAgICAgICAgICAgKGF0b21pY19vcCBub2RlOiRwdHIsIG5vZGU6JHZhbCksIFt7CisgICAgcmV0dXJuIGNhc3Q8QXRvbWljU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkzMjsKKyAgfV0+OworICBkZWYgXzY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAoYXRvbWljX29wIG5vZGU6JHB0ciwgbm9kZTokdmFsKSwgW3sKKyAgICByZXR1cm4gY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpID09IE1WVDo6aTY0OworICB9XT47Cit9CisKK2RlZm0gYXRvbWljX2xvYWRfYWRkICA6IGJpbmFyeV9hdG9taWNfb3A8YXRvbWljX2xvYWRfYWRkPjsKK2RlZm0gYXRvbWljX3N3YXAgICAgICA6IGJpbmFyeV9hdG9taWNfb3A8YXRvbWljX3N3YXA+OworZGVmbSBhdG9taWNfbG9hZF9zdWIgIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9zdWI+OworZGVmbSBhdG9taWNfbG9hZF9hbmQgIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9hbmQ+OworZGVmbSBhdG9taWNfbG9hZF9vciAgIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9vcj47CitkZWZtIGF0b21pY19sb2FkX3hvciAgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX3hvcj47CitkZWZtIGF0b21pY19sb2FkX25hbmQgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX25hbmQ+OworZGVmbSBhdG9taWNfbG9hZF9taW4gIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9taW4+OworZGVmbSBhdG9taWNfbG9hZF9tYXggIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9tYXg+OworZGVmbSBhdG9taWNfbG9hZF91bWluIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF91bWluPjsKK2RlZm0gYXRvbWljX2xvYWRfdW1heCA6IGJpbmFyeV9hdG9taWNfb3A8YXRvbWljX2xvYWRfdW1heD47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIENPTlZFUlRfUk5EU0FUIHBhdHRlcm5zCisKK2RlZiBjdnRmZiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGR0eSwgbm9kZTokc3R5LCBub2RlOiRyZCwgbm9kZTokc2F0KSwKKyAgICAoY3Z0IG5vZGU6JHZhbCwgbm9kZTokZHR5LCBub2RlOiRzdHksIG5vZGU6JHJkLCBub2RlOiRzYXQpLCBbeworICAgICAgIHJldHVybiBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKSA9PSBJU0Q6OkNWVF9GRjsKKyAgICB9XT47CisKK2RlZiBjdnRzcyA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGR0eSwgbm9kZTokc3R5LCBub2RlOiRyZCwgbm9kZTokc2F0KSwKKyAgICAoY3Z0IG5vZGU6JHZhbCwgbm9kZTokZHR5LCBub2RlOiRzdHksIG5vZGU6JHJkLCBub2RlOiRzYXQpLCBbeworICAgICAgIHJldHVybiBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKSA9PSBJU0Q6OkNWVF9TUzsKKyAgICB9XT47CisKK2RlZiBjdnRzdSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGR0eSwgbm9kZTokc3R5LCBub2RlOiRyZCwgbm9kZTokc2F0KSwKKyAgICAoY3Z0IG5vZGU6JHZhbCwgbm9kZTokZHR5LCBub2RlOiRzdHksIG5vZGU6JHJkLCBub2RlOiRzYXQpLCBbeworICAgICAgIHJldHVybiBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKSA9PSBJU0Q6OkNWVF9TVTsKKyAgICB9XT47CisKK2RlZiBjdnR1cyA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGR0eSwgbm9kZTokc3R5LCBub2RlOiRyZCwgbm9kZTokc2F0KSwKKyAgICAoY3Z0IG5vZGU6JHZhbCwgbm9kZTokZHR5LCBub2RlOiRzdHksIG5vZGU6JHJkLCBub2RlOiRzYXQpLCBbeworICAgICAgIHJldHVybiBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKSA9PSBJU0Q6OkNWVF9VUzsKKyAgICB9XT47CisKK2RlZiBjdnR1dSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGR0eSwgbm9kZTokc3R5LCBub2RlOiRyZCwgbm9kZTokc2F0KSwKKyAgICAoY3Z0IG5vZGU6JHZhbCwgbm9kZTokZHR5LCBub2RlOiRzdHksIG5vZGU6JHJkLCBub2RlOiRzYXQpLCBbeworICAgICAgIHJldHVybiBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKSA9PSBJU0Q6OkNWVF9VVTsKKyAgICB9XT47CisKK2RlZiBjdnRzZiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGR0eSwgbm9kZTokc3R5LCBub2RlOiRyZCwgbm9kZTokc2F0KSwKKyAgICAoY3Z0IG5vZGU6JHZhbCwgbm9kZTokZHR5LCBub2RlOiRzdHksIG5vZGU6JHJkLCBub2RlOiRzYXQpLCBbeworICAgICAgIHJldHVybiBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKSA9PSBJU0Q6OkNWVF9TRjsKKyAgICB9XT47CisKK2RlZiBjdnR1ZiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGR0eSwgbm9kZTokc3R5LCBub2RlOiRyZCwgbm9kZTokc2F0KSwKKyAgICAoY3Z0IG5vZGU6JHZhbCwgbm9kZTokZHR5LCBub2RlOiRzdHksIG5vZGU6JHJkLCBub2RlOiRzYXQpLCBbeworICAgICAgIHJldHVybiBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKSA9PSBJU0Q6OkNWVF9VRjsKKyAgICB9XT47CisKK2RlZiBjdnRmcyA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGR0eSwgbm9kZTokc3R5LCBub2RlOiRyZCwgbm9kZTokc2F0KSwKKyAgICAoY3Z0IG5vZGU6JHZhbCwgbm9kZTokZHR5LCBub2RlOiRzdHksIG5vZGU6JHJkLCBub2RlOiRzYXQpLCBbeworICAgICAgIHJldHVybiBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKSA9PSBJU0Q6OkNWVF9GUzsKKyAgICB9XT47CisKK2RlZiBjdnRmdSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGR0eSwgbm9kZTokc3R5LCBub2RlOiRyZCwgbm9kZTokc2F0KSwKKyAgICAoY3Z0IG5vZGU6JHZhbCwgbm9kZTokZHR5LCBub2RlOiRzdHksIG5vZGU6JHJkLCBub2RlOiRzYXQpLCBbeworICAgICAgIHJldHVybiBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKSA9PSBJU0Q6OkNWVF9GVTsKKyAgICB9XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIFBhdHRlcm4gU3VwcG9ydC4KKy8vCisvLyBQYXR0ZXJucyBhcmUgd2hhdCBhcmUgYWN0dWFsbHkgbWF0Y2hlZCBhZ2FpbnN0IHRoZSB0YXJnZXQtZmxhdm9yZWQKKy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBEQUcuICBJbnN0cnVjdGlvbnMgZGVmaW5lZCBieSB0aGUgdGFyZ2V0IGltcGxpY2l0bHkKKy8vIGRlZmluZSBwYXR0ZXJucyBpbiBtb3N0IGNhc2VzLCBidXQgcGF0dGVybnMgY2FuIGFsc28gYmUgZXhwbGljaXRseSBhZGRlZCB3aGVuCisvLyBhbiBvcGVyYXRpb24gaXMgZGVmaW5lZCBieSBhIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyAoZS5nLiBsb2FkaW5nIGEgbGFyZ2UKKy8vIGltbWVkaWF0ZSB2YWx1ZSBvbiBSSVNDIHRhcmdldHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpbW1lZGlhdGVzIGFzIGxhcmdlIGFzCisvLyB0aGVpciBHUFJzKS4KKy8vCisKK2NsYXNzIFBhdHRlcm48ZGFnIHBhdHRlcm5Ub01hdGNoLCBsaXN0PGRhZz4gcmVzdWx0SW5zdHJzPiB7CisgIGRhZyAgICAgICAgICAgICBQYXR0ZXJuVG9NYXRjaCAgPSBwYXR0ZXJuVG9NYXRjaDsKKyAgbGlzdDxkYWc+ICAgICAgIFJlc3VsdEluc3RycyAgICA9IHJlc3VsdEluc3RyczsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgICAgICA9IFtdOyAgLy8gU2VlIGNsYXNzIEluc3RydWN0aW9uIGluIFRhcmdldC50ZC4KKyAgaW50ICAgICAgICAgICAgIEFkZGVkQ29tcGxleGl0eSA9IDA7ICAvLyBTZWUgY2xhc3MgSW5zdHJ1Y3Rpb24gaW4gVGFyZ2V0LnRkLgorfQorCisvLyBQYXQgLSBBIHNpbXBsZSAoYnV0IGNvbW1vbikgZm9ybSBvZiBhIHBhdHRlcm4sIHdoaWNoIHByb2R1Y2VzIGEgc2ltcGxlIHJlc3VsdAorLy8gbm90IG5lZWRpbmcgYSBmdWxsIGxpc3QuCitjbGFzcyBQYXQ8ZGFnIHBhdHRlcm4sIGRhZyByZXN1bHQ+IDogUGF0dGVybjxwYXR0ZXJuLCBbcmVzdWx0XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDb21wbGV4IHBhdHRlcm4gZGVmaW5pdGlvbnMuCisvLworCisvLyBDb21wbGV4IHBhdHRlcm5zLCBlLmcuIFg4NiBhZGRyZXNzaW5nIG1vZGUsIHJlcXVpcmVzIHBhdHRlcm4gbWF0Y2hpbmcgY29kZQorLy8gaW4gQysrLiBOdW1PcGVyYW5kcyBpcyB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJldHVybmVkIGJ5IHRoZSBzZWxlY3QgZnVuY3Rpb247CisvLyBTZWxlY3RGdW5jIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB1c2VkIHRvIHBhdHRlcm4gbWF0Y2ggdGhlIG1heC4gcGF0dGVybjsKKy8vIFJvb3ROb2RlcyBhcmUgdGhlIGxpc3Qgb2YgcG9zc2libGUgcm9vdCBub2RlcyBvZiB0aGUgc3ViLWRhZ3MgdG8gbWF0Y2guCisvLyBlLmcuIFg4NiBhZGRyZXNzaW5nIG1vZGUgLSBkZWYgYWRkciA6IENvbXBsZXhQYXR0ZXJuPDQsICJTZWxlY3RBZGRyIiwgW2FkZF0+OworLy8KK2NsYXNzIENvbXBsZXhQYXR0ZXJuPFZhbHVlVHlwZSB0eSwgaW50IG51bW9wcywgc3RyaW5nIGZuLAorICAgICAgICAgICAgICAgICAgICAgbGlzdDxTRE5vZGU+IHJvb3RzID0gW10sIGxpc3Q8U0ROb2RlUHJvcGVydHk+IHByb3BzID0gW10+IHsKKyAgVmFsdWVUeXBlIFR5ID0gdHk7CisgIGludCBOdW1PcGVyYW5kcyA9IG51bW9wczsKKyAgc3RyaW5nIFNlbGVjdEZ1bmMgPSBmbjsKKyAgbGlzdDxTRE5vZGU+IFJvb3ROb2RlcyA9IHJvb3RzOworICBsaXN0PFNETm9kZVByb3BlcnR5PiBQcm9wZXJ0aWVzID0gcHJvcHM7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBR0luZm8uaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTE4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBR0luZm8uaApAQCAtMCwwICsxLDEwMSBAQAorLy89PS0tIGxsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBR0luZm8uaCAtIFNlbGVjdGlvbkRBRyBJbmZvIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFRhcmdldFNlbGVjdGlvbkRBR0luZm8gY2xhc3MsIHdoaWNoIHRhcmdldHMgY2FuCisvLyBzdWJjbGFzcyB0byBwYXJhbWV0ZXJpemUgdGhlIFNlbGVjdGlvbkRBRyBsb3dlcmluZyBhbmQgaW5zdHJ1Y3Rpb24KKy8vIHNlbGVjdGlvbiBwcm9jZXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfVEFSR0VUU0VMRUNUSU9OREFHSU5GT19ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVFNFTEVDVElPTkRBR0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVGFyZ2V0RGF0YTsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVGFyZ2V0U2VsZWN0aW9uREFHSW5mbyAtIFRhcmdldHMgY2FuIHN1YmNsYXNzIHRoaXMgdG8gcGFyYW1ldGVyaXplIHRoZQorLy8vIFNlbGVjdGlvbkRBRyBsb3dlcmluZyBhbmQgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHByb2Nlc3MuCisvLy8KK2NsYXNzIFRhcmdldFNlbGVjdGlvbkRBR0luZm8geworICBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvKGNvbnN0IFRhcmdldFNlbGVjdGlvbkRBR0luZm8gJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVGFyZ2V0U2VsZWN0aW9uREFHSW5mbyAmKTsgICAgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisKKyAgY29uc3QgVGFyZ2V0RGF0YSAqVEQ7CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgVGFyZ2V0RGF0YSAqZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIFREOyB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgVGFyZ2V0U2VsZWN0aW9uREFHSW5mbyhjb25zdCBUYXJnZXRNYWNoaW5lICZUTSk7CisgIHZpcnR1YWwgflRhcmdldFNlbGVjdGlvbkRBR0luZm8oKTsKKworICAvLy8gRW1pdFRhcmdldENvZGVGb3JNZW1jcHkgLSBFbWl0IHRhcmdldC1zcGVjaWZpYyBjb2RlIHRoYXQgcGVyZm9ybXMgYQorICAvLy8gbWVtY3B5LiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHRhcmdldHMgdG8gcHJvdmlkZSBjb2RlIHNlcXVlbmNlcyBmb3IgY2FzZXMKKyAgLy8vIHRoYXQgZG9uJ3QgZml0IHRoZSB0YXJnZXQncyBwYXJhbWV0ZXJzIGZvciBzaW1wbGUgbG9hZHMvc3RvcmVzIGFuZCBjYW4gYmUKKyAgLy8vIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgYSBsaWJyYXJ5IGNhbGwuIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBhIG51bGwKKyAgLy8vIFNEVmFsdWUgaWYgdGhlIHRhcmdldCBkZWNsaW5lcyB0byB1c2UgY3VzdG9tIGNvZGUgYW5kIGEgZGlmZmVyZW50CisgIC8vLyBsb3dlcmluZyBzdHJhdGVneSBzaG91bGQgYmUgdXNlZC4KKyAgLy8vIAorICAvLy8gSWYgQWx3YXlzSW5saW5lIGlzIHRydWUsIHRoZSBzaXplIGlzIGNvbnN0YW50IGFuZCB0aGUgdGFyZ2V0IHNob3VsZCBub3QKKyAgLy8vIGVtaXQgYW55IGNhbGxzIGFuZCBpcyBzdHJvbmdseSBlbmNvdXJhZ2VkIHRvIGF0dGVtcHQgdG8gZW1pdCBpbmxpbmUgY29kZQorICAvLy8gZXZlbiBpZiBpdCBpcyBiZXlvbmQgdGhlIHVzdWFsIHRocmVzaG9sZCBiZWNhdXNlIHRoaXMgaW50cmluc2ljIGlzIGJlaW5nCisgIC8vLyBleHBhbmRlZCBpbiBhIHBsYWNlIHdoZXJlIGNhbGxzIGFyZSBub3QgZmVhc2libGUgKGUuZy4gd2l0aGluIHRoZSBwcm9sb2d1ZQorICAvLy8gZm9yIGFub3RoZXIgY2FsbCkuIElmIHRoZSB0YXJnZXQgY2hvb3NlcyB0byBkZWNsaW5lIGFuIEFsd2F5c0lubGluZQorICAvLy8gcmVxdWVzdCBoZXJlLCBsZWdhbGl6ZSB3aWxsIHJlc29ydCB0byB1c2luZyBzaW1wbGUgbG9hZHMgYW5kIHN0b3Jlcy4KKyAgdmlydHVhbCBTRFZhbHVlCisgIEVtaXRUYXJnZXRDb2RlRm9yTWVtY3B5KFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMywgdW5zaWduZWQgQWxpZ24sIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbHdheXNJbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpEc3RTViwgdWludDY0X3QgRHN0T2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqU3JjU1YsIHVpbnQ2NF90IFNyY09mZikgY29uc3QgeworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICAvLy8gRW1pdFRhcmdldENvZGVGb3JNZW1tb3ZlIC0gRW1pdCB0YXJnZXQtc3BlY2lmaWMgY29kZSB0aGF0IHBlcmZvcm1zIGEKKyAgLy8vIG1lbW1vdmUuIFRoaXMgY2FuIGJlIHVzZWQgYnkgdGFyZ2V0cyB0byBwcm92aWRlIGNvZGUgc2VxdWVuY2VzIGZvciBjYXNlcworICAvLy8gdGhhdCBkb24ndCBmaXQgdGhlIHRhcmdldCdzIHBhcmFtZXRlcnMgZm9yIHNpbXBsZSBsb2Fkcy9zdG9yZXMgYW5kIGNhbiBiZQorICAvLy8gbW9yZSBlZmZpY2llbnQgdGhhbiB1c2luZyBhIGxpYnJhcnkgY2FsbC4gVGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgbnVsbAorICAvLy8gU0RWYWx1ZSBpZiB0aGUgdGFyZ2V0IGRlY2xpbmVzIHRvIHVzZSBjdXN0b20gY29kZSBhbmQgYSBkaWZmZXJlbnQKKyAgLy8vIGxvd2VyaW5nIHN0cmF0ZWd5IHNob3VsZCBiZSB1c2VkLgorICB2aXJ0dWFsIFNEVmFsdWUKKyAgRW1pdFRhcmdldENvZGVGb3JNZW1tb3ZlKFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMywgdW5zaWduZWQgQWxpZ24sIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpEc3RTViwgdWludDY0X3QgRHN0T2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNyY1NWLCB1aW50NjRfdCBTcmNPZmYpIGNvbnN0IHsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisKKyAgLy8vIEVtaXRUYXJnZXRDb2RlRm9yTWVtc2V0IC0gRW1pdCB0YXJnZXQtc3BlY2lmaWMgY29kZSB0aGF0IHBlcmZvcm1zIGEKKyAgLy8vIG1lbXNldC4gVGhpcyBjYW4gYmUgdXNlZCBieSB0YXJnZXRzIHRvIHByb3ZpZGUgY29kZSBzZXF1ZW5jZXMgZm9yIGNhc2VzCisgIC8vLyB0aGF0IGRvbid0IGZpdCB0aGUgdGFyZ2V0J3MgcGFyYW1ldGVycyBmb3Igc2ltcGxlIHN0b3JlcyBhbmQgY2FuIGJlIG1vcmUKKyAgLy8vIGVmZmljaWVudCB0aGFuIHVzaW5nIGEgbGlicmFyeSBjYWxsLiBUaGlzIGZ1bmN0aW9uIGNhbiByZXR1cm4gYSBudWxsCisgIC8vLyBTRFZhbHVlIGlmIHRoZSB0YXJnZXQgZGVjbGluZXMgdG8gdXNlIGN1c3RvbSBjb2RlIGFuZCBhIGRpZmZlcmVudAorICAvLy8gbG93ZXJpbmcgc3RyYXRlZ3kgc2hvdWxkIGJlIHVzZWQuCisgIHZpcnR1YWwgU0RWYWx1ZQorICBFbWl0VGFyZ2V0Q29kZUZvck1lbXNldChTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDMsIHVuc2lnbmVkIEFsaWduLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpEc3RTViwgdWludDY0X3QgRHN0T2ZmKSBjb25zdCB7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFN1YnRhcmdldC5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmIwOWJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuaApAQCAtMCwwICsxLDY3IEBACisvLz09LS0gbGx2bS9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmggLSBUYXJnZXQgSW5mb3JtYXRpb24gLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHN1YnRhcmdldCBvcHRpb25zIG9mIGEgVGFyZ2V0IG1hY2hpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9UQVJHRVRTVUJUQVJHRVRfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRTVUJUQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFNEZXA7CitjbGFzcyBTVW5pdDsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gVGFyZ2V0U3VidGFyZ2V0IC0gR2VuZXJpYyBiYXNlIGNsYXNzIGZvciBhbGwgdGFyZ2V0IHN1YnRhcmdldHMuICBBbGwKKy8vLyBUYXJnZXQtc3BlY2lmaWMgb3B0aW9ucyB0aGF0IGNvbnRyb2wgY29kZSBnZW5lcmF0aW9uIGFuZCBwcmludGluZyBzaG91bGQKKy8vLyBiZSBleHBvc2VkIHRocm91Z2ggYSBUYXJnZXRTdWJ0YXJnZXQtZGVyaXZlZCBjbGFzcy4KKy8vLworY2xhc3MgVGFyZ2V0U3VidGFyZ2V0IHsKKyAgVGFyZ2V0U3VidGFyZ2V0KGNvbnN0IFRhcmdldFN1YnRhcmdldCYpOyAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVGFyZ2V0U3VidGFyZ2V0Jik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLi4uCisgIFRhcmdldFN1YnRhcmdldCgpOworcHVibGljOgorICAvLyBBbnRpRGVwQnJlYWtNb2RlIC0gVHlwZSBvZiBhbnRpLWRlcGVuZGVuY2UgYnJlYWtpbmcgdGhhdCBzaG91bGQKKyAgLy8gYmUgcGVyZm9ybWVkIGJlZm9yZSBwb3N0LVJBIHNjaGVkdWxpbmcuCisgIHR5cGVkZWYgZW51bSB7IEFOVElERVBfTk9ORSwgQU5USURFUF9DUklUSUNBTCwgQU5USURFUF9BTEwgfSBBbnRpRGVwQnJlYWtNb2RlOworICB0eXBlZGVmIFNtYWxsVmVjdG9ySW1wbDxUYXJnZXRSZWdpc3RlckNsYXNzKj4gUmVnQ2xhc3NWZWN0b3I7CisKKyAgdmlydHVhbCB+VGFyZ2V0U3VidGFyZ2V0KCk7CisKKyAgLy8vIGdldFNwZWNpYWxBZGRyZXNzTGF0ZW5jeSAtIEZvciB0YXJnZXRzIHdoZXJlIGl0IGlzIGJlbmVmaWNpYWwgdG8KKyAgLy8vIGJhY2tzY2hlZHVsZSBpbnN0cnVjdGlvbnMgdGhhdCBjb21wdXRlIGFkZHJlc3NlcywgcmV0dXJuIGEgdmFsdWUKKyAgLy8vIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBzY2hlZHVsaW5nIGN5Y2xlcyBvZiBiYWNrc2NoZWR1bGluZyB0aGF0CisgIC8vLyBzaG91bGQgYmUgYXR0ZW1wdGVkLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFNwZWNpYWxBZGRyZXNzTGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAvLyBlbmFibGVQb3N0UkFTY2hlZHVsZXIgLSBJZiB0aGUgdGFyZ2V0IGNhbiBiZW5lZml0IGZyb20gcG9zdC1yZWdhbGxvYworICAvLyBzY2hlZHVsaW5nIGFuZCB0aGUgc3BlY2lmaWVkIG9wdGltaXphdGlvbiBsZXZlbCBtZWV0cyB0aGUgcmVxdWlyZW1lbnQKKyAgLy8gcmV0dXJuIHRydWUgdG8gZW5hYmxlIHBvc3QtcmVnaXN0ZXItYWxsb2NhdGlvbiBzY2hlZHVsaW5nLiBJbgorICAvLyBDcml0aWNhbFBhdGhSQ3MgcmV0dXJuIGFueSByZWdpc3RlciBjbGFzc2VzIHRoYXQgc2hvdWxkIG9ubHkgYmUgYnJva2VuCisgIC8vIGlmIG9uIHRoZSBjcml0aWNhbCBwYXRoLiAKKyAgdmlydHVhbCBib29sIGVuYWJsZVBvc3RSQVNjaGVkdWxlcihDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRpRGVwQnJlYWtNb2RlJiBNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0NsYXNzVmVjdG9yJiBDcml0aWNhbFBhdGhSQ3MpIGNvbnN0OworICAvLyBhZGp1c3RTY2hlZERlcGVuZGVuY3kgLSBQZXJmb3JtIHRhcmdldCBzcGVjaWZpYyBhZGp1c3RtZW50cyB0bworICAvLyB0aGUgbGF0ZW5jeSBvZiBhIHNjaGVkdWxlIGRlcGVuZGVuY3kuCisgIHZpcnR1YWwgdm9pZCBhZGp1c3RTY2hlZERlcGVuZGVuY3koU1VuaXQgKmRlZiwgU1VuaXQgKnVzZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RlcCYgZGVwKSBjb25zdCB7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzY3YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8vPT09LSBsbHZtL1RyYW5zZm9ybXMvSVBPLmggLSBJbnRlcnByb2NlZHVyYWwgVHJhbnNmb3JtYXRpb25zIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHByb3RvdHlwZXMgZm9yIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IGV4cG9zZSBwYXNzZXMKKy8vIGluIHRoZSBJUE8gdHJhbnNmb3JtYXRpb25zIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlUGFzczsKK2NsYXNzIFBhc3M7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBHbG9iYWxWYWx1ZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGVzZSBmdW5jdGlvbnMgcmVtb3ZlcyBzeW1ib2xzIGZyb20gZnVuY3Rpb25zIGFuZCBtb2R1bGVzLiAgSWYgT25seURlYnVnSW5mbworLy8gaXMgdHJ1ZSwgb25seSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUuCisvLworTW9kdWxlUGFzcyAqY3JlYXRlU3RyaXBTeW1ib2xzUGFzcyhib29sIE9ubHlEZWJ1Z0luZm8gPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIHN0cmlwcyBzeW1ib2xzIGZyb20gZnVuY3Rpb25zIGFuZCBtb2R1bGVzLiAgCisvLyBPbmx5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBub3Qgc3RyaXBwZWQuCisvLworTW9kdWxlUGFzcyAqY3JlYXRlU3RyaXBOb25EZWJ1Z1N5bWJvbHNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlc2UgcGFzcyByZW1vdmVzIGxsdm0uZGJnLmRlY2xhcmUgaW50cmluc2ljcy4KK01vZHVsZVBhc3MgKmNyZWF0ZVN0cmlwRGVidWdEZWNsYXJlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZXNlIHBhc3MgcmVtb3ZlcyB1bnVzZWQgc3ltYm9scycgZGVidWcgaW5mby4KK01vZHVsZVBhc3MgKmNyZWF0ZVN0cmlwRGVhZERlYnVnSW5mb1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVMb3dlclNldEptcFBhc3MgLSBUaGlzIGZ1bmN0aW9uIGxvd2VycyB0aGUgc2V0am1wL2xvbmdqbXAgaW50cmluc2ljcworLy8vIHRvIGludm9rZS91bndpbmQgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIHBhcnQgb2YgdGhlIEMvQysrCisvLy8gZnJvbnQtZW5kLCBidXQgaXQncyBzbyBtdWNoIGVhc2llciB0byB3cml0ZSB0cmFuc2Zvcm1hdGlvbnMgaW4gTExWTSBwcm9wZXIuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUxvd2VyU2V0Sm1wUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUNvbnN0YW50TWVyZ2VQYXNzIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IHBhc3MgdGhhdCBtZXJnZXMKKy8vLyBkdXBsaWNhdGUgZ2xvYmFsIGNvbnN0YW50cyB0b2dldGhlciBpbnRvIGEgc2luZ2xlIGNvbnN0YW50IHRoYXQgaXMgc2hhcmVkLgorLy8vIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2Ugc29tZSBwYXNzZXMgKGllIFRyYWNlVmFsdWVzKSBpbnNlcnQgYSBsb3Qgb2Ygc3RyaW5nCisvLy8gY29uc3RhbnRzIGludG8gdGhlIHByb2dyYW0sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhleSBkdXBsaWNhdGUgYW4KKy8vLyBleGlzdGluZyBzdHJpbmcuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUNvbnN0YW50TWVyZ2VQYXNzKCk7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVHbG9iYWxPcHRpbWl6ZXJQYXNzIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IHBhc3MgdGhhdCBvcHRpbWl6ZXMKKy8vLyBub24tYWRkcmVzcyB0YWtlbiBpbnRlcm5hbCBnbG9iYWxzLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVHbG9iYWxPcHRpbWl6ZXJQYXNzKCk7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVEZWFkVHlwZUVsaW1pbmF0aW9uUGFzcyAtIFJldHVybiBhIG5ldyBwYXNzIHRoYXQgZWxpbWluYXRlcyBzeW1ib2wKKy8vLyB0YWJsZSBlbnRyaWVzIGZvciB0eXBlcyB0aGF0IGFyZSBuZXZlciB1c2VkLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVEZWFkVHlwZUVsaW1pbmF0aW9uUGFzcygpOworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlR2xvYmFsRENFUGFzcyAtIFRoaXMgdHJhbnNmb3JtIGlzIGRlc2lnbmVkIHRvIGVsaW1pbmF0ZSB1bnJlYWNoYWJsZQorLy8vIGludGVybmFsIGdsb2JhbHMgKGZ1bmN0aW9ucyBvciBnbG9iYWwgdmFyaWFibGVzKQorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVHbG9iYWxEQ0VQYXNzKCk7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVHVkV4dHJhY3Rpb25QYXNzIC0gSWYgZGVsZXRlRm4gaXMgdHJ1ZSwgdGhpcyBwYXNzIGRlbGV0ZXMgYXMKKy8vLyB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YWx1ZXMuIE90aGVyd2lzZSwgaXQgZGVsZXRlcyBhcyBtdWNoIG9mIHRoZSBtb2R1bGUgYXMKKy8vLyBwb3NzaWJsZSwgZXhjZXB0IGZvciB0aGUgZ2xvYmFsIHZhbHVlcyBzcGVjaWZpZWQuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUdWRXh0cmFjdGlvblBhc3Moc3RkOjp2ZWN0b3I8R2xvYmFsVmFsdWUqPiYgR1ZzLCBib29sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVGbiA9IGZhbHNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWxpbmtDYWxsZWVzID0gZmFsc2UpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzIC0gUmV0dXJuIGEgbmV3IHBhc3Mgb2JqZWN0IHRoYXQgdXNlcyBhIGhldXJpc3RpYworLy8vIHRvIGlubGluZSBkaXJlY3QgZnVuY3Rpb24gY2FsbHMgdG8gc21hbGwgZnVuY3Rpb25zLgorLy8vCitQYXNzICpjcmVhdGVGdW5jdGlvbklubGluaW5nUGFzcygpOworUGFzcyAqY3JlYXRlRnVuY3Rpb25JbmxpbmluZ1Bhc3MoaW50IFRocmVzaG9sZCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlQWx3YXlzSW5saW5lclBhc3MgLSBSZXR1cm4gYSBuZXcgcGFzcyBvYmplY3QgdGhhdCBpbmxpbmVzIG9ubHkgCisvLy8gZnVuY3Rpb25zIHRoYXQgYXJlIG1hcmtlZCBhcyAiYWx3YXlzX2lubGluZSIuCitQYXNzICpjcmVhdGVBbHdheXNJbmxpbmVyUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZVBydW5lRUhQYXNzIC0gUmV0dXJuIGEgbmV3IHBhc3Mgb2JqZWN0IHdoaWNoIHRyYW5zZm9ybXMgaW52b2tlCisvLy8gaW5zdHJ1Y3Rpb25zIGludG8gY2FsbHMsIGlmIHRoZSBjYWxsZWUgY2FuIF9ub3RfIHVud2luZCB0aGUgc3RhY2suCisvLy8KK1Bhc3MgKmNyZWF0ZVBydW5lRUhQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlSW50ZXJuYWxpemVQYXNzIC0gVGhpcyBwYXNzIGxvb3BzIG92ZXIgYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhlCisvLy8gaW5wdXQgbW9kdWxlLCBpbnRlcm5hbGl6aW5nIGFsbCBnbG9iYWxzIChmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcykgbm90IHBhcnQKKy8vLyBvZiB0aGUgYXBpLiAgSWYgYSBsaXN0IG9mIHN5bWJvbHMgaXMgc3BlY2lmaWVkIHdpdGggdGhlCisvLy8gLWludGVybmFsaXplLXB1YmxpYy1hcGktKiBjb21tYW5kIGxpbmUgb3B0aW9ucywgdGhvc2Ugc3ltYm9scyBhcmUgbm90CisvLy8gaW50ZXJuYWxpemVkIGFuZCBhbGwgb3RoZXJzIGFyZS4gIE90aGVyd2lzZSBpZiBBbGxCdXRNYWluIGlzIHNldCBhbmQgdGhlCisvLy8gbWFpbiBmdW5jdGlvbiBpcyBmb3VuZCwgYWxsIG90aGVyIGdsb2JhbHMgYXJlIG1hcmtlZCBhcyBpbnRlcm5hbC4gSWYgbm8gYXBpCisvLy8gaXMgc3VwcGxpZWQgYW5kIEFsbEJ1dE1haW4gaXMgbm90IHNldCwgb3Igbm8gbWFpbiBmdW5jdGlvbiBpcyBmb3VuZCwgbm90aGluZworLy8vIGlzIGludGVybmFsaXplZC4KKy8vLworTW9kdWxlUGFzcyAqY3JlYXRlSW50ZXJuYWxpemVQYXNzKGJvb2wgQWxsQnV0TWFpbik7CisKKy8vLyBjcmVhdGVJbnRlcm5hbGl6ZVBhc3MgLSBUaGlzIHBhc3MgbG9vcHMgb3ZlciBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGUKKy8vLyBpbnB1dCBtb2R1bGUsIGludGVybmFsaXppbmcgYWxsIGdsb2JhbHMgKGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzKSBub3QgaW4gdGhlCisvLy8gZ2l2ZW4gZXhwb3J0TGlzdC4KKy8vLworLy8vIE5vdGUgdGhhdCBjb21tYW5kbGluZSBvcHRpb25zIHRoYXQgYXJlIHVzZWQgd2l0aCB0aGUgYWJvdmUgZnVuY3Rpb24gYXJlIG5vdAorLy8vIHVzZWQgbm93ISBBbHNvLCB3aGVuIGV4cG9ydExpc3QgaXMgZW1wdHksIG5vdGhpbmcgaXMgaW50ZXJuYWxpemVkLgorTW9kdWxlUGFzcyAqY3JlYXRlSW50ZXJuYWxpemVQYXNzKGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJmV4cG9ydExpc3QpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZURlYWRBcmdFbGltaW5hdGlvblBhc3MgLSBUaGlzIHBhc3MgcmVtb3ZlcyBhcmd1bWVudHMgZnJvbSBmdW5jdGlvbnMKKy8vLyB3aGljaCBhcmUgbm90IHVzZWQgYnkgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVEZWFkQXJnRWxpbWluYXRpb25QYXNzKCk7CisKKy8vLyBEZWFkQXJnSGFja2luZyBwYXNzIC0gU2FtZSBhcyBEQUUsIGJ1dCBkZWxldGUgYXJndW1lbnRzIG9mIGV4dGVybmFsCisvLy8gZnVuY3Rpb25zIGFzIHdlbGwuICBUaGlzIGlzIGRlZmluaXRlbHkgbm90IHNhZmUsIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5CisvLy8gYnVncG9pbnQuCitNb2R1bGVQYXNzICpjcmVhdGVEZWFkQXJnSGFja2luZ1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVBcmd1bWVudFByb21vdGlvblBhc3MgLSBUaGlzIHBhc3MgcHJvbW90ZXMgImJ5IHJlZmVyZW5jZSIgYXJndW1lbnRzIHRvCisvLy8gYmUgcGFzc2VkIGJ5IHZhbHVlIGlmIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcGFzc2VkIGlzIHNtYWxsZXIgb3IKKy8vLyBlcXVhbCB0byBtYXhFbGVtZW50cyAobWF4RWxlbWVudHMgPT0gMCBtZWFucyBhbHdheXMgcHJvbW90ZSkuCisvLy8KK1Bhc3MgKmNyZWF0ZUFyZ3VtZW50UHJvbW90aW9uUGFzcyh1bnNpZ25lZCBtYXhFbGVtZW50cyA9IDMpOworUGFzcyAqY3JlYXRlU3RydWN0UmV0UHJvbW90aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUlQQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MgLSBUaGlzIHBhc3MgcHJvcGFnYXRlcyBjb25zdGFudHMgZnJvbSBjYWxsCisvLy8gc2l0ZXMgaW50byB0aGUgYm9kaWVzIG9mIGZ1bmN0aW9ucy4KKy8vLworTW9kdWxlUGFzcyAqY3JlYXRlSVBDb25zdGFudFByb3BhZ2F0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUlQU0NDUFBhc3MgLSBUaGlzIHBhc3MgcHJvcGFnYXRlcyBjb25zdGFudHMgZnJvbSBjYWxsIHNpdGVzIGludG8gdGhlCisvLy8gYm9kaWVzIG9mIGZ1bmN0aW9ucywgYW5kIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgYmFzaWMgYmxvY2tzIGFyZSBleGVjdXRhYmxlCisvLy8gaW4gdGhlIHByb2Nlc3MuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUlQU0NDUFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gY3JlYXRlTG9vcEV4dHJhY3RvclBhc3MgLSBUaGlzIHBhc3MgZXh0cmFjdHMgYWxsIG5hdHVyYWwgbG9vcHMgZnJvbSB0aGUKKy8vLyBwcm9ncmFtIGludG8gYSBmdW5jdGlvbiBpZiBpdCBjYW4uCisvLy8KK1Bhc3MgKmNyZWF0ZUxvb3BFeHRyYWN0b3JQYXNzKCk7CisKKy8vLyBjcmVhdGVTaW5nbGVMb29wRXh0cmFjdG9yUGFzcyAtIFRoaXMgcGFzcyBleHRyYWN0cyBvbmUgbmF0dXJhbCBsb29wIGZyb20gdGhlCisvLy8gcHJvZ3JhbSBpbnRvIGEgZnVuY3Rpb24gaWYgaXQgY2FuLiAgVGhpcyBpcyB1c2VkIGJ5IGJ1Z3BvaW50LgorLy8vCitQYXNzICpjcmVhdGVTaW5nbGVMb29wRXh0cmFjdG9yUGFzcygpOworCisvLy8gY3JlYXRlQmxvY2tFeHRyYWN0b3JQYXNzIC0gVGhpcyBwYXNzIGV4dHJhY3RzIGFsbCBibG9ja3MgKGV4Y2VwdCB0aG9zZQorLy8vIHNwZWNpZmllZCBpbiB0aGUgYXJndW1lbnQgbGlzdCkgZnJvbSB0aGUgZnVuY3Rpb25zIGluIHRoZSBtb2R1bGUuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUJsb2NrRXh0cmFjdG9yUGFzcygpOworCisvLy8gY3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MgLSBUaGlzIHBhc3MgcmVtb3ZlcyBhbnkgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisvLy8gKHByb3RvdHlwZXMpIHRoYXQgYXJlIG5vdCB1c2VkLgorTW9kdWxlUGFzcyAqY3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25QYXNzIC0gVGhpcyBwYXNzIHNwZWNpYWxpemVzIGZ1bmN0aW9ucyBmb3IKKy8vLyBjb25zdGFudCBhcmd1bWVudHMuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVGdW5jdGlvbkF0dHJzUGFzcyAtIFRoaXMgcGFzcyBkaXNjb3ZlcnMgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGFjY2VzcworLy8vIG1lbW9yeSwgb3Igb25seSByZWFkIG1lbW9yeSwgYW5kIGdpdmVzIHRoZW0gdGhlIHJlYWRub25lL3JlYWRvbmx5IGF0dHJpYnV0ZS4KKy8vLyBJdCBhbHNvIGRpc2NvdmVycyBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBhcmUgbm90IGNhcHR1cmVkIGJ5IHRoZSBmdW5jdGlvbgorLy8vIGFuZCBtYXJrcyB0aGVtIHdpdGggdGhlIG5vY2FwdHVyZSBhdHRyaWJ1dGUuCisvLy8KK1Bhc3MgKmNyZWF0ZUZ1bmN0aW9uQXR0cnNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlTWVyZ2VGdW5jdGlvbnNQYXNzIC0gVGhpcyBwYXNzIGRpc2NvdmVycyBpZGVudGljYWwgZnVuY3Rpb25zIGFuZAorLy8vIGNvbGxhcHNlcyB0aGVtLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVNZXJnZUZ1bmN0aW9uc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVQYXJ0aWFsSW5saW5pbmdQYXNzIC0gVGhpcyBwYXNzIGlubGluZXMgcGFydHMgb2YgZnVuY3Rpb25zLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVQYXJ0aWFsSW5saW5pbmdQYXNzKCk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0lubGluZXJQYXNzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vSW5saW5lclBhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM0YzU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0lubGluZXJQYXNzLmgKQEAgLTAsMCArMSw5NyBAQAorLy89PT0tIElubGluZXJQYXNzLmggLSBDb2RlIGNvbW1vbiB0byBhbGwgaW5saW5lcnMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHNpbXBsZSBwb2xpY3ktYmFzZWQgYm90dG9tLXVwIGlubGluZXIuICBUaGlzIGZpbGUKKy8vIGltcGxlbWVudHMgYWxsIG9mIHRoZSBib3JpbmcgbWVjaGFuaWNzIG9mIHRoZSBib3R0b20tdXAgaW5saW5pbmcsIHdoaWxlIHRoZQorLy8gc3ViY2xhc3MgZGV0ZXJtaW5lcyBXSEFUIHRvIGlubGluZSwgd2hpY2ggaXMgdGhlIG11Y2ggbW9yZSBpbnRlcmVzdGluZworLy8gY29tcG9uZW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19JTkxJTkVSUEFTU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fSU5MSU5FUlBBU1NfSAorCisjaW5jbHVkZSAibGx2bS9DYWxsR3JhcGhTQ0NQYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQ2FsbFNpdGU7CisgIGNsYXNzIFRhcmdldERhdGE7CisgIGNsYXNzIElubGluZUNvc3Q7CisgIHRlbXBsYXRlPGNsYXNzIFB0clR5cGUsIHVuc2lnbmVkIFNtYWxsU2l6ZT4KKyAgY2xhc3MgU21hbGxQdHJTZXQ7CisKKy8vLyBJbmxpbmVyIC0gVGhpcyBjbGFzcyBjb250YWlucyBhbGwgb2YgdGhlIGhlbHBlciBjb2RlIHdoaWNoIGlzIHVzZWQgdG8KKy8vLyBwZXJmb3JtIHRoZSBpbmxpbmluZyBvcGVyYXRpb25zIHRoYXQgZG8gbm90IGRlcGVuZCBvbiB0aGUgcG9saWN5LgorLy8vCitzdHJ1Y3QgSW5saW5lciA6IHB1YmxpYyBDYWxsR3JhcGhTQ0NQYXNzIHsKKyAgZXhwbGljaXQgSW5saW5lcihjaGFyICZJRCk7CisgIGV4cGxpY2l0IElubGluZXIoY2hhciAmSUQsIGludCBUaHJlc2hvbGQpOworCisgIC8vLyBnZXRBbmFseXNpc1VzYWdlIC0gRm9yIHRoaXMgY2xhc3MsIHdlIGRlY2xhcmUgdGhhdCB3ZSByZXF1aXJlIGFuZCBwcmVzZXJ2ZQorICAvLy8gdGhlIGNhbGwgZ3JhcGguICBJZiB0aGUgZGVyaXZlZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBleHBsaWNpdGx5IGNhbGwgdGhlIGltcGxlbWVudGF0aW9uIGhlcmUuCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0OworCisgIC8vIE1haW4gcnVuIGludGVyZmFjZSBtZXRob2QsIHRoaXMgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIHJlcXVpcmVkIGJ5IHRoZQorICAvLyBQYXNzIGNsYXNzLgorICB2aXJ0dWFsIGJvb2wgcnVuT25TQ0MoQ2FsbEdyYXBoU0NDICZTQ0MpOworCisgIC8vIGRvRmluYWxpemF0aW9uIC0gUmVtb3ZlIG5vdy1kZWFkIGxpbmtvbmNlIGZ1bmN0aW9ucyBhdCB0aGUgZW5kIG9mCisgIC8vIHByb2Nlc3NpbmcgdG8gYXZvaWQgYnJlYWtpbmcgdGhlIFNDQyB0cmF2ZXJzYWwuCisgIHZpcnR1YWwgYm9vbCBkb0ZpbmFsaXphdGlvbihDYWxsR3JhcGggJkNHKTsKKworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSAtaW5saW5lLXRocmVzaG9sZCB2YWx1ZSwKKyAgLy8vIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhpcyBpcyB0eXBpY2FsbHkgbm90IGRpcmVjdGx5IG5lZWRlZC4KKyAgLy8vCisgIHVuc2lnbmVkIGdldElubGluZVRocmVzaG9sZCgpIGNvbnN0IHsgcmV0dXJuIElubGluZVRocmVzaG9sZDsgfQorCisgIC8vLyBDYWxjdWxhdGUgdGhlIGlubGluZSB0aHJlc2hvbGQgZm9yIGdpdmVuIENhbGxlci4gVGhpcyB0aHJlc2hvbGQgaXMgbG93ZXIKKyAgLy8vIGlmIHRoZSBjYWxsZXIgaXMgbWFya2VkIHdpdGggT3B0aW1pemVGb3JTaXplIGFuZCAtaW5saW5lLXRocmVzaG9sZCBpcyBub3QKKyAgLy8vIGdpdmVuIG9uIHRoZSBjb21hbmQgbGluZS4gSXQgaXMgaGlnaGVyIGlmIHRoZSBjYWxsZWUgaXMgbWFya2VkIHdpdGggdGhlCisgIC8vLyBpbmxpbmVoaW50IGF0dHJpYnV0ZS4KKyAgLy8vCisgIHVuc2lnbmVkIGdldElubGluZVRocmVzaG9sZChDYWxsU2l0ZSBDUykgY29uc3Q7CisKKyAgLy8vIGdldElubGluZUNvc3QgLSBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzdWJjbGFzcyB0bworICAvLy8gZGV0ZXJtaW5lIHRoZSBjb3N0IG9mIGlubGluaW5nIHRoZSBzcGVjaWZpZWQgY2FsbCBzaXRlLiAgSWYgdGhlIGNvc3QKKyAgLy8vIHJldHVybmVkIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbmxpbmUgdGhyZXNob2xkLCB0aGUgY2FsbCBzaXRlIGlzCisgIC8vLyBub3QgaW5saW5lZC4KKyAgLy8vCisgIHZpcnR1YWwgSW5saW5lQ29zdCBnZXRJbmxpbmVDb3N0KENhbGxTaXRlIENTKSA9IDA7CisKKyAgLy8gZ2V0SW5saW5lRnVkZ2VGYWN0b3IgLSBSZXR1cm4gYSA+IDEuMCBmYWN0b3IgaWYgdGhlIGlubGluZXIgc2hvdWxkIHVzZSBhCisgIC8vIGhpZ2hlciB0aHJlc2hvbGQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBjYWxsIHNob3VsZCBiZSBpbmxpbmVkLgorICAvLy8KKyAgdmlydHVhbCBmbG9hdCBnZXRJbmxpbmVGdWRnZUZhY3RvcihDYWxsU2l0ZSBDUykgPSAwOworCisgIC8vLyByZXNldENhY2hlZENvc3RJbmZvIC0gZXJhc2UgYW55IGNhY2hlZCBjb3N0IGRhdGEgZnJvbSB0aGUgZGVyaXZlZCBjbGFzcy4KKyAgLy8vIElmIHRoZSBkZXJpdmVkIGNsYXNzIGhhcyBubyBzdWNoIGRhdGEgdGhpcyBjYW4gYmUgZW1wdHkuCisgIC8vLyAKKyAgdmlydHVhbCB2b2lkIHJlc2V0Q2FjaGVkQ29zdEluZm8oRnVuY3Rpb24qIENhbGxlcikgPSAwOworCisgIC8vLyBncm93Q2FjaGVkQ29zdEluZm8gLSB1cGRhdGUgdGhlIGNhY2hlZCBjb3N0IGluZm8gZm9yIENhbGxlciBhZnRlciBDYWxsZWUKKyAgLy8vIGhhcyBiZWVuIGlubGluZWQuCisgIHZpcnR1YWwgdm9pZCBncm93Q2FjaGVkQ29zdEluZm8oRnVuY3Rpb24gKkNhbGxlciwgRnVuY3Rpb24gKkNhbGxlZSkgPSAwOworCisgIC8vLyByZW1vdmVEZWFkRnVuY3Rpb25zIC0gUmVtb3ZlIGRlYWQgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbgorICAvLy8gRE5SIChEbyBOb3QgUmVtb3ZlKSBsaXN0LgorICBib29sIHJlbW92ZURlYWRGdW5jdGlvbnMoQ2FsbEdyYXBoICZDRywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxjb25zdCBGdW5jdGlvbiAqLCAxNj4gKkROUiA9IE5VTEwpOworcHJpdmF0ZToKKyAgLy8gSW5saW5lVGhyZXNob2xkIC0gQ2FjaGUgdGhlIHZhbHVlIGhlcmUgZm9yIGVhc3kgYWNjZXNzLgorICB1bnNpZ25lZCBJbmxpbmVUaHJlc2hvbGQ7CisKKyAgLy8vIHNob3VsZElubGluZSAtIFJldHVybiB0cnVlIGlmIHRoZSBpbmxpbmVyIHNob3VsZCBhdHRlbXB0IHRvCisgIC8vLyBpbmxpbmUgYXQgdGhlIGdpdmVuIENhbGxTaXRlLgorICBib29sIHNob3VsZElubGluZShDYWxsU2l0ZSBDUyk7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1NzlhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vPT09LSBUcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oIC0gSW5zdHJ1bWVudGF0aW9uIHBhc3NlcyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgY29uc3RydWN0b3IgZnVuY3Rpb25zIGZvciBpbnN0cnVtZW50YXRpb24gcGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lOU1RSVU1FTlRBVElPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JTlNUUlVNRU5UQVRJT05fSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZVBhc3M7CitjbGFzcyBGdW5jdGlvblBhc3M7CisKKy8vIEluc2VydCBlZGdlIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24KK01vZHVsZVBhc3MgKmNyZWF0ZUVkZ2VQcm9maWxlclBhc3MoKTsKKworLy8gSW5zZXJ0IG9wdGltYWwgZWRnZSBwcm9maWxpbmcgaW5zdHJ1bWVudGF0aW9uCitNb2R1bGVQYXNzICpjcmVhdGVPcHRpbWFsRWRnZVByb2ZpbGVyUGFzcygpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1JTUHJvZmlsaW5nLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9SU1Byb2ZpbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDM5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9SU1Byb2ZpbGluZy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LSBSU1Byb2ZpbGluZy5jcHAgLSBWYXJpb3VzIHByb2ZpbGluZyB1c2luZyByYW5kb20gc2FtcGxpbmcgLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2UgdGhhdCBhIHByb2ZpbGVyIG11c3QgaW1wbGVtZW50IHRvCisvLyBzdXBwb3J0IHRoZSByYW5kb20gcHJvZmlsaW5nIHRyYW5zZm9ybS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19SU1BST0ZJTElOR19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19SU1BST0ZJTElOR19ICisKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBWYWx1ZTsKKyAgCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gUlNQcm9maWxlcnMgLSBUaGUgYmFzaWMgUmFuZG9tIFNhbXBsaW5nIFByb2ZpbGVyIEludGVyZmFjZSAgQW55IHByb2ZpbGVyIAorICAvLy8gdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgcmFuZG9tIHNhbXBsaW5nCisgIC8vLyBwYXNzIHRvIGJlIHNhbXBsZSBiYXNlZCByYXRoZXIgdGhhbiBhbHdheXMgb24uCisgIC8vLworICAvLy8gVGhlIG9ubHkgZXhwb3NlZCBmdW5jdGlvbiBjYW4gYmUgcXVlcmllZCB0byBmaW5kIG91dCBpZiBhbiBpbnN0cnVjdGlvbgorICAvLy8gd2FzIG9yaWdpbmFsIG9yIGlmIGl0IHdhcyBpbnNlcnRlZCBieSB0aGUgcHJvZmlsZXIuICBJbXBsZW1lbnRhdGlvbnMgb2YKKyAgLy8vIHRoaXMgaW50ZXJmYWNlIGFyZSBleHBlY3RlZCB0byBjaGFpbiB0byBvdGhlciBpbXBsZW1lbnRhdGlvbnMsIHN1Y2ggdGhhdAorICAvLy8gbXVsdGlwbGUgcHJvZmlsZXJzIGNhbiBiZSBzdXBwb3J0IHNpbXVsdGFuaW91c2x5LgorICBzdHJ1Y3QgUlNQcm9maWxlcnMgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaW5mbworICAgIFJTUHJvZmlsZXJzKCkgOiBNb2R1bGVQYXNzKCZJRCkge30KKworICAgIC8vLyBpc1Byb2ZpbGluZyAtIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgcGFzc2VkIGl0IHdhcyAKKyAgICAvLy8gaW5zZXJ0ZWQgYnkgdGhlIHByb2ZpbGVyLgorICAgIHZpcnR1YWwgYm9vbCBpc1Byb2ZpbGluZyhWYWx1ZSogdikgPSAwOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3ODcxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oCkBAIC0wLDAgKzEsMzQ4IEBACisvLz09PS0tIFNjYWxhci5oIC0gU2NhbGFyIFRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBwcm90b3R5cGVzIGZvciBhY2Nlc3NvciBmdW5jdGlvbnMgdGhhdCBleHBvc2UgcGFzc2VzCisvLyBpbiB0aGUgU2NhbGFyIHRyYW5zZm9ybWF0aW9ucyBsaWJyYXJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uUGFzczsKK2NsYXNzIFBhc3M7CitjbGFzcyBHZXRFbGVtZW50UHRySW5zdDsKK2NsYXNzIFBhc3NJbmZvOworY2xhc3MgVGVybWluYXRvckluc3Q7CitjbGFzcyBUYXJnZXRMb3dlcmluZzsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb25zdGFudFByb3BhZ2F0aW9uIC0gQSB3b3JrbGlzdCBkcml2ZW4gY29uc3RhbnQgcHJvcGFnYXRpb24gcGFzcworLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTQ0NQIC0gU3BhcnNlIGNvbmRpdGlvbmFsIGNvbnN0YW50IHByb3BhZ2F0aW9uLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlU0NDUFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWFkSW5zdEVsaW1pbmF0aW9uIC0gVGhpcyBwYXNzIHF1aWNrbHkgcmVtb3ZlcyB0cml2aWFsbHkgZGVhZCBpbnN0cnVjdGlvbnMKKy8vIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBDRkcgb2YgdGhlIGZ1bmN0aW9uLiAgSXQgaXMgYSBCYXNpY0Jsb2NrUGFzcywgc28gaXQKKy8vIHJ1bnMgZWZmaWNpZW50bHkgd2hlbiBxdWV1ZWQgbmV4dCB0byBvdGhlciBCYXNpY0Jsb2NrUGFzcydzLgorLy8KK1Bhc3MgKmNyZWF0ZURlYWRJbnN0RWxpbWluYXRpb25QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVhZENvZGVFbGltaW5hdGlvbiAtIFRoaXMgcGFzcyBpcyBtb3JlIHBvd2VyZnVsIHRoYW4gRGVhZEluc3RFbGltaW5hdGlvbiwKKy8vIGJlY2F1c2UgaXQgaXMgd29ya2xpc3QgZHJpdmVuIHRoYXQgY2FuIHBvdGVudGlhbGx5IHJldmlzaXQgaW5zdHJ1Y3Rpb25zIHdoZW4KKy8vIHRoZWlyIG90aGVyIGluc3RydWN0aW9ucyBiZWNvbWUgZGVhZCwgdG8gZWxpbWluYXRlIGNoYWlucyBvZiBkZWFkCisvLyBjb21wdXRhdGlvbnMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVEZWFkQ29kZUVsaW1pbmF0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlYWRTdG9yZUVsaW1pbmF0aW9uIC0gVGhpcyBwYXNzIGRlbGV0ZXMgc3RvcmVzIHRoYXQgYXJlIHBvc3QtZG9taW5hdGVkIGJ5CisvLyBtdXN0LWFsaWFzZWQgc3RvcmVzIGFuZCBhcmUgbm90IGxvYWRlZCB1c2VkIGJldHdlZW4gdGhlIHN0b3Jlcy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZURlYWRTdG9yZUVsaW1pbmF0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFnZ3Jlc3NpdmVEQ0UgLSBUaGlzIHBhc3MgdXNlcyB0aGUgU1NBIGJhc2VkIEFnZ3Jlc3NpdmUgRENFIGFsZ29yaXRobS4gIFRoaXMKKy8vIGFsZ29yaXRobSBhc3N1bWVzIGluc3RydWN0aW9ucyBhcmUgZGVhZCB1bnRpbCBwcm92ZW4gb3RoZXJ3aXNlLCB3aGljaCBtYWtlcworLy8gaXQgbW9yZSBzdWNjZXNzZnVsIGFyZSByZW1vdmluZyBub24tb2J2aW91c2x5IGRlYWQgaW5zdHJ1Y3Rpb25zLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQWdncmVzc2l2ZURDRVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTY2FsYXJSZXBsQWdncmVnYXRlcyAtIEJyZWFrIHVwIGFsbG9jYSdzIG9mIGFnZ3JlZ2F0ZXMgaW50byBtdWx0aXBsZSBhbGxvY2FzCisvLyBpZiBwb3NzaWJsZS4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNjYWxhclJlcGxBZ2dyZWdhdGVzUGFzcyhzaWduZWQgVGhyZXNob2xkID0gLTEpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEluZHVjdGlvblZhcmlhYmxlU2ltcGxpZnkgLSBUcmFuc2Zvcm0gaW5kdWN0aW9uIHZhcmlhYmxlcyBpbiBhIHByb2dyYW0gdG8gYWxsCisvLyB1c2UgYSBzaW5nbGUgY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZSBwZXIgbG9vcC4KKy8vCitQYXNzICpjcmVhdGVJbmRWYXJTaW1wbGlmeVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbnN0cnVjdGlvbkNvbWJpbmluZyAtIENvbWJpbmUgaW5zdHJ1Y3Rpb25zIHRvIGZvcm0gZmV3ZXIsIHNpbXBsZQorLy8gaW5zdHJ1Y3Rpb25zLiBUaGlzIHBhc3MgZG9lcyBub3QgbW9kaWZ5IHRoZSBDRkcsIGFuZCBoYXMgYSB0ZW5kZW5jeSB0byBtYWtlCisvLyBpbnN0cnVjdGlvbnMgZGVhZCwgc28gYSBzdWJzZXF1ZW50IERDRSBwYXNzIGlzIHVzZWZ1bC4KKy8vCisvLyBUaGlzIHBhc3MgY29tYmluZXMgdGhpbmdzIGxpa2U6CisvLyAgICAlWSA9IGFkZCBpbnQgMSwgJVgKKy8vICAgICVaID0gYWRkIGludCAxLCAlWQorLy8gaW50bzoKKy8vICAgICVaID0gYWRkIGludCAyLCAlWAorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTElDTSAtIFRoaXMgcGFzcyBpcyBhIGxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uIGFuZCBtZW1vcnkgcHJvbW90aW9uIHBhc3MuCisvLworUGFzcyAqY3JlYXRlTElDTVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wU3RyZW5ndGhSZWR1Y2UgLSBUaGlzIHBhc3MgaXMgc3RyZW5ndGggcmVkdWNlcyBHRVAgaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlCisvLyBhIGxvb3AncyBjYW5vbmljYWwgaW5kdWN0aW9uIHZhcmlhYmxlIGFzIG9uZSBvZiB0aGVpciBpbmRpY2VzLiAgSXQgdGFrZXMgYW4KKy8vIG9wdGlvbmFsIHBhcmFtZXRlciB1c2VkIHRvIGNvbnN1bHQgdGhlIHRhcmdldCBtYWNoaW5lIHdoZXRoZXIgY2VydGFpbgorLy8gdHJhbnNmb3JtYXRpb25zIGFyZSBwcm9maXRhYmxlLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BTdHJlbmd0aFJlZHVjZVBhc3MoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSSA9IDApOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BVbnN3aXRjaCAtIFRoaXMgcGFzcyBpcyBhIHNpbXBsZSBsb29wIHVuc3dpdGNoaW5nIHBhc3MuCisvLworUGFzcyAqY3JlYXRlTG9vcFVuc3dpdGNoUGFzcyhib29sIE9wdGltaXplRm9yU2l6ZSA9IGZhbHNlKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wVW5yb2xsIC0gVGhpcyBwYXNzIGlzIGEgc2ltcGxlIGxvb3AgdW5yb2xsaW5nIHBhc3MuCisvLworUGFzcyAqY3JlYXRlTG9vcFVucm9sbFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wUm90YXRlIC0gVGhpcyBwYXNzIGlzIGEgc2ltcGxlIGxvb3Agcm90YXRpbmcgcGFzcy4KKy8vCitQYXNzICpjcmVhdGVMb29wUm90YXRlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BJbmRleFNwbGl0IC0gVGhpcyBwYXNzIGRpdmlkZXMgbG9vcCdzIGl0ZXJhdGlvbiByYW5nZSBieSBzcGxpdGluZyBsb29wCisvLyBzdWNoIHRoYXQgZWFjaCBpbmRpdmlkdWFsIGxvb3AgaXMgZXhlY3V0ZWQgZWZmaWNpZW50bHkuCisvLworUGFzcyAqY3JlYXRlTG9vcEluZGV4U3BsaXRQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUHJvbW90ZU1lbW9yeVRvUmVnaXN0ZXIgLSBUaGlzIHBhc3MgaXMgdXNlZCB0byBwcm9tb3RlIG1lbW9yeSByZWZlcmVuY2VzIHRvCisvLyBiZSByZWdpc3RlciByZWZlcmVuY2VzLiBBIHNpbXBsZSBleGFtcGxlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBwZXJmb3JtZWQgYnkKKy8vIHRoaXMgcGFzcyBpczoKKy8vCisvLyAgICAgICAgRlJPTSBDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgVE8gQ09ERQorLy8gICAlWCA9IGFsbG9jYSBpMzIsIGkzMiAxICAgICAgICAgICAgICAgICByZXQgaTMyIDQyCisvLyAgIHN0b3JlIGkzMiA0MiwgaTMyIColWAorLy8gICAlWSA9IGxvYWQgaTMyKiAlWAorLy8gICByZXQgaTMyICVZCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVQcm9tb3RlTWVtb3J5VG9SZWdpc3RlclBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZW1vdGVSZWdpc3RlclRvTWVtb3J5UGFzcyAtIFRoaXMgcGFzcyBpcyB1c2VkIHRvIGRlbW90ZSByZWdpc3RlcnMgdG8gbWVtb3J5CisvLyByZWZlcmVuY2VzLiBJbiBiYXNpY2FsbHkgdW5kb2VzIHRoZSBQcm9tb3RlTWVtb3J5VG9SZWdpc3RlciBwYXNzIHRvIG1ha2UgY2ZnCisvLyBoYWNraW5nIGVhc2llci4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZURlbW90ZVJlZ2lzdGVyVG9NZW1vcnlQYXNzKCk7CitleHRlcm4gY2hhciAmRGVtb3RlUmVnaXN0ZXJUb01lbW9yeUlEOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFJlYXNzb2NpYXRlIC0gVGhpcyBwYXNzIHJlYXNzb2NpYXRlcyBjb21tdXRhdGl2ZSBleHByZXNzaW9ucyBpbiBhbiBvcmRlciB0aGF0CisvLyBpcyBkZXNpZ25lZCB0byBwcm9tb3RlIGJldHRlciBjb25zdGFudCBwcm9wYWdhdGlvbiwgR0NTRSwgTElDTSwgUFJFLi4uCisvLworLy8gRm9yIGV4YW1wbGU6ICA0ICsgKHggKyA1KSAgLT4gIHggKyAoNCArIDUpCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVSZWFzc29jaWF0ZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUYWlsRHVwbGljYXRpb24gLSBFbGltaW5hdGUgdW5jb25kaXRpb25hbCBicmFuY2hlcyB0aHJvdWdoIGNvbnRyb2xsZWQgY29kZQorLy8gZHVwbGljYXRpb24sIGNyZWF0aW5nIHNpbXBsZXIgQ0ZHIHN0cnVjdHVyZXMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVUYWlsRHVwbGljYXRpb25QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSnVtcFRocmVhZGluZyAtIFRocmVhZCBjb250cm9sIHRocm91Z2ggbXVsdC1wcmVkL211bHRpLXN1Y2MgYmxvY2tzIHdoZXJlIHNvbWUKKy8vIHByZWRzIGFsd2F5cyBnbyB0byBzb21lIHN1Y2MuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVKdW1wVGhyZWFkaW5nUGFzcygpOworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ0ZHU2ltcGxpZmljYXRpb24gLSBNZXJnZSBiYXNpYyBibG9ja3MsIGVsaW1pbmF0ZSB1bnJlYWNoYWJsZSBibG9ja3MsCisvLyBzaW1wbGlmeSB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucywgZXRjLi4uCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBCcmVha0NyaXRpY2FsRWRnZXMgLSBCcmVhayBhbGwgb2YgdGhlIGNyaXRpY2FsIGVkZ2VzIGluIHRoZSBDRkcgYnkgaW5zZXJ0aW5nCisvLyBhIGR1bW15IGJhc2ljIGJsb2NrLiBUaGlzIHBhc3MgbWF5IGJlICJyZXF1aXJlZCIgYnkgcGFzc2VzIHRoYXQgY2Fubm90IGRlYWwKKy8vIHdpdGggY3JpdGljYWwgZWRnZXMuIEZvciB0aGlzIHVzYWdlLCBhIHBhc3MgbXVzdCBjYWxsOgorLy8KKy8vICAgQVUuYWRkUmVxdWlyZWRJRChCcmVha0NyaXRpY2FsRWRnZXNJRCk7CisvLworLy8gVGhpcyBwYXNzIG9idmlvdXNseSBpbnZhbGlkYXRlcyB0aGUgQ0ZHLCBidXQgY2FuIHVwZGF0ZSBmb3J3YXJkIGRvbWluYXRvcgorLy8gKHNldCwgaW1tZWRpYXRlIGRvbWluYXRvcnMsIHRyZWUsIGFuZCBmcm9udGllcikgaW5mb3JtYXRpb24uCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVCcmVha0NyaXRpY2FsRWRnZXNQYXNzKCk7CitleHRlcm4gY2hhciAmQnJlYWtDcml0aWNhbEVkZ2VzSUQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFNpbXBsaWZ5IC0gSW5zZXJ0IFByZS1oZWFkZXIgYmxvY2tzIGludG8gdGhlIENGRyBmb3IgZXZlcnkgZnVuY3Rpb24gaW4KKy8vIHRoZSBtb2R1bGUuICBUaGlzIHBhc3MgdXBkYXRlcyBkb21pbmF0b3IgaW5mb3JtYXRpb24sIGxvb3AgaW5mb3JtYXRpb24sIGFuZAorLy8gZG9lcyBub3QgYWRkIGNyaXRpY2FsIGVkZ2VzIHRvIHRoZSBDRkcuCisvLworLy8gICBBVS5hZGRSZXF1aXJlZElEKExvb3BTaW1wbGlmeUlEKTsKKy8vCitQYXNzICpjcmVhdGVMb29wU2ltcGxpZnlQYXNzKCk7CitleHRlcm4gY2hhciAmTG9vcFNpbXBsaWZ5SUQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGFpbENhbGxFbGltaW5hdGlvbiAtIFRoaXMgcGFzcyBlbGltaW5hdGVzIGNhbGwgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBjdXJyZW50CisvLyBmdW5jdGlvbiB3aGljaCBvY2N1ciBpbW1lZGlhdGVseSBiZWZvcmUgcmV0dXJuIGluc3RydWN0aW9ucy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVRhaWxDYWxsRWxpbWluYXRpb25QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG93ZXJTd2l0Y2ggLSBUaGlzIHBhc3MgY29udmVydHMgU3dpdGNoSW5zdCBpbnN0cnVjdGlvbnMgaW50byBhIHNlcXVlbmNlIG9mCisvLyBjaGFpbmVkIGJpbmFyeSBicmFuY2ggaW5zdHJ1Y3Rpb25zLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTG93ZXJTd2l0Y2hQYXNzKCk7CitleHRlcm4gY2hhciAmTG93ZXJTd2l0Y2hJRDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb3dlckludm9rZSAtIFRoaXMgcGFzcyBjb252ZXJ0cyBpbnZva2UgYW5kIHVud2luZCBpbnN0cnVjdGlvbnMgdG8gdXNlIHNqbGoKKy8vIGV4Y2VwdGlvbiBoYW5kbGluZyBtZWNoYW5pc21zLiAgTm90ZSB0aGF0IGFmdGVyIHRoaXMgcGFzcyBydW5zIHRoZSBDRkcgaXMgbm90CisvLyBlbnRpcmVseSBhY2N1cmF0ZSAoZXhjZXB0aW9uYWwgY29udHJvbCBmbG93IGVkZ2VzIGFyZSBub3QgY29ycmVjdCBhbnltb3JlKSBzbworLy8gb25seSB2ZXJ5IHNpbXBsZSB0aGluZ3Mgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgdGhlIGxvd2VyaW52b2tlIHBhc3MgaGFzIHJ1bgorLy8gKGxpa2UgZ2VuZXJhdGlvbiBvZiBuYXRpdmUgY29kZSkuICBUaGlzIHNob3VsZCAqTk9UKiBiZSB1c2VkIGFzIGEgZ2VuZXJhbAorLy8gcHVycG9zZSAibXkgTExWTS10by1MTFZNIHBhc3MgZG9lc24ndCBzdXBwb3J0IHRoZSBpbnZva2UgaW5zdHJ1Y3Rpb24geWV0IgorLy8gbG93ZXJpbmcgcGFzcy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUxvd2VySW52b2tlUGFzcyhjb25zdCBUYXJnZXRMb3dlcmluZyAqVExJID0gMCk7CitGdW5jdGlvblBhc3MgKmNyZWF0ZUxvd2VySW52b2tlUGFzcyhjb25zdCBUYXJnZXRMb3dlcmluZyAqVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VFeHBlbnNpdmVFSFN1cHBvcnQpOworZXh0ZXJuIGNoYXIgJkxvd2VySW52b2tlUGFzc0lEOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEJsb2NrUGxhY2VtZW50IC0gVGhpcyBwYXNzIHJlb3JkZXJzIGJhc2ljIGJsb2NrcyBpbiBvcmRlciB0byBpbmNyZWFzZSB0aGUKKy8vIG51bWJlciBvZiBmYWxsLXRocm91Z2ggY29uZGl0aW9uYWwgYnJhbmNoZXMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVCbG9ja1BsYWNlbWVudFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMQ1NTQSAtIFRoaXMgcGFzcyBpbnNlcnRzIHBoaSBub2RlcyBhdCBsb29wIGJvdW5kYXJpZXMgdG8gc2ltcGxpZnkgb3RoZXIgbG9vcAorLy8gb3B0aW1pemF0aW9ucy4KKy8vCitQYXNzICpjcmVhdGVMQ1NTQVBhc3MoKTsKK2V4dGVybiBjaGFyICZMQ1NTQUlEOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEdWTiAtIFRoaXMgcGFzcyBwZXJmb3JtcyBnbG9iYWwgdmFsdWUgbnVtYmVyaW5nIGFuZCByZWR1bmRhbnQgbG9hZCAKKy8vIGVsaW1pbmF0aW9uIGNvdGVtcG9yYW5lb3VzbHkuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVHVk5QYXNzKGJvb2wgTm9Mb2FkcyA9IGZhbHNlKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBNZW1DcHlPcHQgLSBUaGlzIHBhc3MgcGVyZm9ybXMgb3B0aW1pemF0aW9ucyByZWxhdGVkIHRvIGVsaW1pbmF0aW5nIG1lbWNweQorLy8gY2FsbHMgYW5kL29yIGNvbWJpbmluZyBtdWx0aXBsZSBzdG9yZXMgaW50byBtZW1zZXQncy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZU1lbUNweU9wdFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wRGVsZXRpb24gLSBUaGlzIHBhc3MgcGVyZm9ybXMgRENFIG9mIG5vbi1pbmZpbml0ZSBsb29wcyB0aGF0IGl0CisvLyBjYW4gcHJvdmUgYXJlIGRlYWQuCisvLworUGFzcyAqY3JlYXRlTG9vcERlbGV0aW9uUGFzcygpOworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIGNyZWF0ZVNpbXBsaWZ5TGliQ2FsbHNQYXNzIC0gVGhpcyBwYXNzIG9wdGltaXplcyBzcGVjaWZpYyBjYWxscyB0bworLy8vIHNwZWNpZmljIHdlbGwta25vd24gKGxpYnJhcnkpIGZ1bmN0aW9ucy4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlU2ltcGxpZnlMaWJDYWxsc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gY3JlYXRlU2ltcGxpZnlIYWxmUG93ckxpYkNhbGxzUGFzcyAtIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIHBhc3MgdGhhdAorLy8vIG9wdGltaXplcyBzcGVjaWZpYyBoYWxmX3BvdyBmdW5jdGlvbnMuCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNpbXBsaWZ5SGFsZlBvd3JMaWJDYWxsc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb2RlR2VuUHJlcGFyZSAtIFRoaXMgcGFzcyBwcmVwYXJlcyBhIGZ1bmN0aW9uIGZvciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVDb2RlR2VuUHJlcGFyZVBhc3MoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSSA9IDApOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEluc3RydWN0aW9uTmFtZXIgLSBHaXZlIGFueSB1bm5hbWVkIG5vbi12b2lkIGluc3RydWN0aW9ucyAidG1wIiBuYW1lcy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUluc3RydWN0aW9uTmFtZXJQYXNzKCk7CitleHRlcm4gY2hhciAmSW5zdHJ1Y3Rpb25OYW1lcklEOworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU1NJIC0gVGhpcyBwYXNzIGNvbnZlcnRzIGluc3RydWN0aW9ucyB0byBTdGF0aWMgU2luZ2xlIEluZm9ybWF0aW9uIGZvcm0KKy8vIG9uIGRlbWFuZC4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNTSVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTU0kgLSBUaGlzIHBhc3MgY29udmVydHMgZXZlcnkgbm9uLXZvaWQgaW5zdHVjdGlvbiB0byBTdGF0aWMgU2luZ2xlCisvLyBJbmZvcm1hdGlvbiBmb3JtLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlU1NJRXZlcnl0aGluZ1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBHRVBTcGxpdHRlciAtIFNwbGl0IGNvbXBsZXggR0VQcyBpbnRvIHNpbXBsZSBvbmVzCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVHRVBTcGxpdHRlclBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBQkNEIC0gRWxpbWluYXRpb24gb2YgQXJyYXkgQm91bmRzIENoZWNrcyBvbiBEZW1hbmQKKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUFCQ0RQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU2luayAtIENvZGUgU2lua2luZworLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlU2lua2luZ1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb3dlckF0b21pYyAtIExvd2VyIGF0b21pYyBpbnRyaW5zaWNzIHRvIG5vbi1hdG9taWMgZm9ybQorLy8KK1Bhc3MgKmNyZWF0ZUxvd2VyQXRvbWljUGFzcygpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0FkZHJNb2RlTWF0Y2hlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQWRkck1vZGVNYXRjaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2MDFlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0FkZHJNb2RlTWF0Y2hlci5oCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0gQWRkck1vZGVNYXRjaGVyLmggLSBBZGRyZXNzaW5nIG1vZGUgbWF0Y2hpbmcgZmFjaWxpdHkgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFkZHJlc3NpbmdNb2RlTWF0Y2hlciAtIFRoaXMgY2xhc3MgZXhwb3NlcyBhIHNpbmdsZSBwdWJsaWMgbWV0aG9kLCB3aGljaCBpcworLy8gdXNlZCB0byBjb25zdHJ1Y3QgYSAibWF4aW1hbCBtdW5jaCIgb2YgdGhlIGFkZHJlc3NpbmcgbW9kZSBmb3IgdGhlIHRhcmdldAorLy8gc3BlY2lmaWVkIGJ5IFRMSSBmb3IgYW4gYWNjZXNzIHRvICJWIiB3aXRoIGFuIGFjY2VzcyB0eXBlIG9mIEFjY2Vzc1R5LiAgVGhpcworLy8gcmV0dXJucyB0aGUgYWRkcmVzc2luZyBtb2RlIHRoYXQgaXMgYWN0dWFsbHkgbWF0Y2hlZCBieSB2YWx1ZSwgYnV0IGFsc28KKy8vIHJldHVybnMgdGhlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIGludm9sdmVkIGluIHRoYXQgYWRkcmVzc2luZyBjb21wdXRhdGlvbiBpbgorLy8gQWRkck1vZGVJbnN0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19BRERSTU9ERU1BVENIRVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQUREUk1PREVNQVRDSEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgVmFsdWU7CitjbGFzcyBUeXBlOworY2xhc3MgVXNlcjsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gRXh0QWRkck1vZGUgLSBUaGlzIGlzIGFuIGV4dGVuZGVkIHZlcnNpb24gb2YgVGFyZ2V0TG93ZXJpbmc6OkFkZHJNb2RlCisvLy8gd2hpY2ggaG9sZHMgYWN0dWFsIFZhbHVlKidzIGZvciByZWdpc3RlciB2YWx1ZXMuCitzdHJ1Y3QgRXh0QWRkck1vZGUgOiBwdWJsaWMgVGFyZ2V0TG93ZXJpbmc6OkFkZHJNb2RlIHsKKyAgVmFsdWUgKkJhc2VSZWc7CisgIFZhbHVlICpTY2FsZWRSZWc7CisgIEV4dEFkZHJNb2RlKCkgOiBCYXNlUmVnKDApLCBTY2FsZWRSZWcoMCkge30KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK3N0YXRpYyBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBFeHRBZGRyTW9kZSAmQU0pIHsKKyAgQU0ucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK2NsYXNzIEFkZHJlc3NpbmdNb2RlTWF0Y2hlciB7CisgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbio+ICZBZGRyTW9kZUluc3RzOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJOworCisgIC8vLyBBY2Nlc3NUeS9NZW1vcnlJbnN0IC0gVGhpcyBpcyB0aGUgdHlwZSBmb3IgdGhlIGFjY2VzcyAoZS5nLiBkb3VibGUpIGFuZAorICAvLy8gdGhlIG1lbW9yeSBpbnN0cnVjdGlvbiB0aGF0IHdlJ3JlIGNvbXB1dGluZyB0aGlzIGFkZHJlc3MgZm9yLgorICBjb25zdCBUeXBlICpBY2Nlc3NUeTsKKyAgSW5zdHJ1Y3Rpb24gKk1lbW9yeUluc3Q7CisgIAorICAvLy8gQWRkck1vZGUgLSBUaGlzIGlzIHRoZSBhZGRyZXNzaW5nIG1vZGUgdGhhdCB3ZSdyZSBidWlsZGluZyB1cC4gIFRoaXMgaXMKKyAgLy8vIHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGFkZHJlc3NpbmcgbW9kZSBtYXRjaGluZyBzdHVmZi4KKyAgRXh0QWRkck1vZGUgJkFkZHJNb2RlOworICAKKyAgLy8vIElnbm9yZVByb2ZpdGFiaWxpdHkgLSBUaGlzIGlzIHNldCB0byB0cnVlIHdoZW4gd2Ugc2hvdWxkIG5vdCBkbworICAvLy8gcHJvZml0YWJpbGl0eSBjaGVja3MuICBXaGVuIHRydWUsIElzUHJvZml0YWJsZVRvRm9sZEludG9BZGRyZXNzaW5nTW9kZQorICAvLy8gYWx3YXlzIHJldHVybnMgdHJ1ZS4KKyAgYm9vbCBJZ25vcmVQcm9maXRhYmlsaXR5OworICAKKyAgQWRkcmVzc2luZ01vZGVNYXRjaGVyKFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbio+ICZBTUksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVCwgY29uc3QgVHlwZSAqQVQsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqTUksIEV4dEFkZHJNb2RlICZBTSkKKyAgICA6IEFkZHJNb2RlSW5zdHMoQU1JKSwgVExJKFQpLCBBY2Nlc3NUeShBVCksIE1lbW9yeUluc3QoTUkpLCBBZGRyTW9kZShBTSkgeworICAgIElnbm9yZVByb2ZpdGFiaWxpdHkgPSBmYWxzZTsKKyAgfQorcHVibGljOgorICAKKyAgLy8vIE1hdGNoIC0gRmluZCB0aGUgbWF4aW1hbCBhZGRyZXNzaW5nIG1vZGUgdGhhdCBhIGxvYWQvc3RvcmUgb2YgViBjYW4gZm9sZCwKKyAgLy8vIGdpdmUgYW4gYWNjZXNzIHR5cGUgb2YgQWNjZXNzVHkuICBUaGlzIHJldHVybnMgYSBsaXN0IG9mIGludm9sdmVkCisgIC8vLyBpbnN0cnVjdGlvbnMgaW4gQWRkck1vZGVJbnN0cy4KKyAgc3RhdGljIEV4dEFkZHJNb2RlIE1hdGNoKFZhbHVlICpWLCBjb25zdCBUeXBlICpBY2Nlc3NUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpNZW1vcnlJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uKj4gJkFkZHJNb2RlSW5zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJKSB7CisgICAgRXh0QWRkck1vZGUgUmVzdWx0OworCisgICAgYm9vbCBTdWNjZXNzID0gCisgICAgICBBZGRyZXNzaW5nTW9kZU1hdGNoZXIoQWRkck1vZGVJbnN0cywgVExJLCBBY2Nlc3NUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlJbnN0LCBSZXN1bHQpLk1hdGNoQWRkcihWLCAwKTsKKyAgICBTdWNjZXNzID0gU3VjY2VzczsgYXNzZXJ0KFN1Y2Nlc3MgJiYgIkNvdWxkbid0IHNlbGVjdCAqYW55dGhpbmcqPyIpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KK3ByaXZhdGU6CisgIGJvb2wgTWF0Y2hTY2FsZWRWYWx1ZShWYWx1ZSAqU2NhbGVSZWcsIGludDY0X3QgU2NhbGUsIHVuc2lnbmVkIERlcHRoKTsKKyAgYm9vbCBNYXRjaEFkZHIoVmFsdWUgKlYsIHVuc2lnbmVkIERlcHRoKTsKKyAgYm9vbCBNYXRjaE9wZXJhdGlvbkFkZHIoVXNlciAqT3BlcmF0aW9uLCB1bnNpZ25lZCBPcGNvZGUsIHVuc2lnbmVkIERlcHRoKTsKKyAgYm9vbCBJc1Byb2ZpdGFibGVUb0ZvbGRJbnRvQWRkcmVzc2luZ01vZGUoSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dEFkZHJNb2RlICZBTUJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0QWRkck1vZGUgJkFNQWZ0ZXIpOworICBib29sIFZhbHVlQWxyZWFkeUxpdmVBdEluc3QoVmFsdWUgKlZhbCwgVmFsdWUgKktub3duTGl2ZTEsIFZhbHVlICpLbm93bkxpdmUyKTsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQmFzaWNCbG9ja1V0aWxzLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CYXNpY0Jsb2NrVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGQwMzE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQmFzaWNCbG9ja1V0aWxzLmgKQEAgLTAsMCArMSwxODYgQEAKKy8vPT09LS0gVHJhbnNmb3JtL1V0aWxzL0Jhc2ljQmxvY2tVdGlscy5oIC0gQmFzaWNCbG9jayBVdGlscyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmYW1pbHkgb2YgZnVuY3Rpb25zIHBlcmZvcm0gbWFuaXB1bGF0aW9ucyBvbiBiYXNpYyBibG9ja3MsIGFuZAorLy8gaW5zdHJ1Y3Rpb25zIGNvbnRhaW5lZCB3aXRoaW4gYmFzaWMgYmxvY2tzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0JBU0lDQkxPQ0tfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQkFTSUNCTE9DS19ICisKKy8vIEZJWE1FOiBNb3ZlIHRvIHRoaXMgZmlsZTogQmFzaWNCbG9jazo6cmVtb3ZlUHJlZGVjZXNzb3IsIEJCOjpzcGxpdEJhc2ljQmxvY2sKKworI2luY2x1ZGUgImxsdm0vQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIFBhc3M7CitjbGFzcyBBbGlhc0FuYWx5c2lzOworCisvLy8gRGVsZXRlRGVhZEJsb2NrIC0gRGVsZXRlIHRoZSBzcGVjaWZpZWQgYmxvY2ssIHdoaWNoIG11c3QgaGF2ZSBubworLy8vIHByZWRlY2Vzc29ycy4KK3ZvaWQgRGVsZXRlRGVhZEJsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKyAgCisgIAorLy8vIEZvbGRTaW5nbGVFbnRyeVBISU5vZGVzIC0gV2Uga25vdyB0aGF0IEJCIGhhcyBvbmUgcHJlZGVjZXNzb3IuICBJZiB0aGVyZSBhcmUKKy8vLyBhbnkgc2luZ2xlLWVudHJ5IFBISSBub2RlcyBpbiBpdCwgZm9sZCB0aGVtIGF3YXkuICBUaGlzIGhhbmRsZXMgdGhlIGNhc2UKKy8vLyB3aGVuIGFsbCBlbnRyaWVzIHRvIHRoZSBQSEkgbm9kZXMgaW4gYSBibG9jayBhcmUgZ3VhcmFudGVlZCBlcXVhbCwgc3VjaCBhcworLy8vIHdoZW4gdGhlIGJsb2NrIGhhcyBleGFjdGx5IG9uZSBwcmVkZWNlc3Nvci4KK3ZvaWQgRm9sZFNpbmdsZUVudHJ5UEhJTm9kZXMoQmFzaWNCbG9jayAqQkIpOworCisvLy8gRGVsZXRlRGVhZFBISXMgLSBFeGFtaW5lIGVhY2ggUEhJIGluIHRoZSBnaXZlbiBibG9jayBhbmQgZGVsZXRlIGl0IGlmIGl0CisvLy8gaXMgZGVhZC4gQWxzbyByZWN1cnNpdmVseSBkZWxldGUgYW55IG9wZXJhbmRzIHRoYXQgYmVjb21lIGRlYWQgYXMKKy8vLyBhIHJlc3VsdC4gVGhpcyBpbmNsdWRlcyB0cmFjaW5nIHRoZSBkZWYtdXNlIGxpc3QgZnJvbSB0aGUgUEhJIHRvIHNlZSBpZgorLy8vIGl0IGlzIHVsdGltYXRlbHkgdW51c2VkIG9yIGlmIGl0IHJlYWNoZXMgYW4gdW51c2VkIGN5Y2xlLiBSZXR1cm4gdHJ1ZQorLy8vIGlmIGFueSBQSElzIHdlcmUgZGVsZXRlZC4KK2Jvb2wgRGVsZXRlRGVhZFBISXMoQmFzaWNCbG9jayAqQkIpOworCisvLy8gTWVyZ2VCbG9ja0ludG9QcmVkZWNlc3NvciAtIEF0dGVtcHRzIHRvIG1lcmdlIGEgYmxvY2sgaW50byBpdHMgcHJlZGVjZXNzb3IsCisvLy8gaWYgcG9zc2libGUuICBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUuCitib29sIE1lcmdlQmxvY2tJbnRvUHJlZGVjZXNzb3IoQmFzaWNCbG9jayogQkIsIFBhc3MqIFAgPSAwKTsKKworLy8gUmVwbGFjZUluc3RXaXRoVmFsdWUgLSBSZXBsYWNlIGFsbCB1c2VzIG9mIGFuIGluc3RydWN0aW9uIChzcGVjaWZpZWQgYnkgQkkpCisvLyB3aXRoIGEgdmFsdWUsIHRoZW4gcmVtb3ZlIGFuZCBkZWxldGUgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgorLy8KK3ZvaWQgUmVwbGFjZUluc3RXaXRoVmFsdWUoQmFzaWNCbG9jazo6SW5zdExpc3RUeXBlICZCSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yICZCSSwgVmFsdWUgKlYpOworCisvLyBSZXBsYWNlSW5zdFdpdGhJbnN0IC0gUmVwbGFjZSB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGJ5IEJJIHdpdGggdGhlCisvLyBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgYnkgSS4gIFRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiBpcyBkZWxldGVkIGFuZCBCSSBpcworLy8gdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV3IGluc3RydWN0aW9uLgorLy8KK3ZvaWQgUmVwbGFjZUluc3RXaXRoSW5zdChCYXNpY0Jsb2NrOjpJbnN0TGlzdFR5cGUgJkJJTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciAmQkksIEluc3RydWN0aW9uICpJKTsKKworLy8gUmVwbGFjZUluc3RXaXRoSW5zdCAtIFJlcGxhY2UgdGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCBieSBGcm9tIHdpdGggdGhlCisvLyBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgYnkgVG8uCisvLwordm9pZCBSZXBsYWNlSW5zdFdpdGhJbnN0KEluc3RydWN0aW9uICpGcm9tLCBJbnN0cnVjdGlvbiAqVG8pOworCisvLy8gRmluZEZ1bmN0aW9uQmFja2VkZ2VzIC0gQW5hbHl6ZSB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHRvIGZpbmQgYWxsIG9mIHRoZQorLy8vIGxvb3AgYmFja2VkZ2VzIGluIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIHRoZW0uICBUaGlzIGlzIGEgcmVsYXRpdmVseSBjaGVhcAorLy8vIChjb21wYXJlZCB0byBjb21wdXRpbmcgZG9taW5hdG9ycyBhbmQgbG9vcCBpbmZvKSBhbmFseXNpcy4KKy8vLworLy8vIFRoZSBvdXRwdXQgaXMgYWRkZWQgdG8gUmVzdWx0LCBhcyBwYWlycyBvZiA8ZnJvbSx0bz4gZWRnZSBpbmZvLgordm9pZCBGaW5kRnVuY3Rpb25CYWNrZWRnZXMoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGNvbnN0IEJhc2ljQmxvY2sqLGNvbnN0IEJhc2ljQmxvY2sqPiA+ICZSZXN1bHQpOworICAKKworLy8gUmVtb3ZlU3VjY2Vzc29yIC0gQ2hhbmdlIHRoZSBzcGVjaWZpZWQgdGVybWluYXRvciBpbnN0cnVjdGlvbiBzdWNoIHRoYXQgaXRzCisvLyBzdWNjZXNzb3IgI1N1Y2NOdW0gbm8gbG9uZ2VyIGV4aXN0cy4gIEJlY2F1c2UgdGhpcyByZWR1Y2VzIHRoZSBvdXRnb2luZworLy8gZGVncmVlIG9mIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrLCB0aGUgYWN0dWFsIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24gaXRzZWxmCisvLyBtYXkgaGF2ZSB0byBiZSBjaGFuZ2VkLiAgSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGxhc3Qgc3VjY2Vzc29yIG9mIHRoZSBibG9jayBpcworLy8gZGVsZXRlZCwgYSByZXR1cm4gaW5zdHJ1Y3Rpb24gaXMgaW5zZXJ0ZWQgaW4gaXRzIHBsYWNlIHdoaWNoIGNhbiBjYXVzZSBhCisvLyBzdXByaXNpbmcgY2hhbmdlIGluIHByb2dyYW0gYmVoYXZpb3IgaWYgaXQgaXMgbm90IGV4cGVjdGVkLgorLy8KK3ZvaWQgUmVtb3ZlU3VjY2Vzc29yKFRlcm1pbmF0b3JJbnN0ICpUSSwgdW5zaWduZWQgU3VjY051bSk7CisKKy8vLyBHZXRTdWNjZXNzb3JOdW1iZXIgLSBTZWFyY2ggZm9yIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yIG9mIGJhc2ljIGJsb2NrIEJCCisvLy8gYW5kIHJldHVybiBpdHMgcG9zaXRpb24gaW4gdGhlIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24ncyBsaXN0IG9mCisvLy8gc3VjY2Vzc29ycy4gIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB3aXRoIGEgYmxvY2sgdGhhdCBpcyBub3QgYQorLy8vIHN1Y2Nlc3Nvci4KK3Vuc2lnbmVkIEdldFN1Y2Nlc3Nvck51bWJlcihCYXNpY0Jsb2NrICpCQiwgQmFzaWNCbG9jayAqU3VjYyk7CisKKy8vLyBpc0NyaXRpY2FsRWRnZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZWRnZSBpcyBhIGNyaXRpY2FsIGVkZ2UuCisvLy8gQ3JpdGljYWwgZWRnZXMgYXJlIGVkZ2VzIGZyb20gYSBibG9jayB3aXRoIG11bHRpcGxlIHN1Y2Nlc3NvcnMgdG8gYSBibG9jaworLy8vIHdpdGggbXVsdGlwbGUgcHJlZGVjZXNzb3JzLgorLy8vCitib29sIGlzQ3JpdGljYWxFZGdlKGNvbnN0IFRlcm1pbmF0b3JJbnN0ICpUSSwgdW5zaWduZWQgU3VjY051bSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0lkZW50aWNhbEVkZ2VzID0gZmFsc2UpOworCisvLy8gU3BsaXRDcml0aWNhbEVkZ2UgLSBJZiB0aGlzIGVkZ2UgaXMgYSBjcml0aWNhbCBlZGdlLCBpbnNlcnQgYSBuZXcgbm9kZSB0bworLy8vIHNwbGl0IHRoZSBjcml0aWNhbCBlZGdlLiAgVGhpcyB3aWxsIHVwZGF0ZSBEb21pbmF0b3JUcmVlIGFuZAorLy8vIERvbWluYXRvckZyb250aWVyIGluZm9ybWF0aW9uIGlmIGl0IGlzIGF2YWlsYWJsZSwgdGh1cyBjYWxsaW5nIHRoaXMgcGFzcworLy8vIHdpbGwgbm90IGludmFsaWRhdGUgZWl0aGVyIG9mIHRoZW0uIFRoaXMgcmV0dXJucyB0aGUgbmV3IGJsb2NrIGlmIHRoZSBlZGdlCisvLy8gd2FzIHNwbGl0LCBudWxsIG90aGVyd2lzZS4KKy8vLworLy8vIElmIE1lcmdlSWRlbnRpY2FsRWRnZXMgaXMgdHJ1ZSAobm90IHRoZSBkZWZhdWx0KSwgKmFsbCogZWRnZXMgZnJvbSBUSSB0byB0aGUKKy8vLyBzcGVjaWZpZWQgc3VjY2Vzc29yIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIHNhbWUgY3JpdGljYWwgZWRnZSBibG9jay4gIAorLy8vIFRoaXMgaXMgbW9zdCBjb21tb25seSBpbnRlcmVzdGluZyB3aXRoIHN3aXRjaCBpbnN0cnVjdGlvbnMsIHdoaWNoIG1heSAKKy8vLyBoYXZlIG1hbnkgZWRnZXMgdG8gYW55IG9uZSBkZXN0aW5hdGlvbi4gIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBlZGdlcyB0byB0aGF0CisvLy8gZGVzdCBnbyB0byBvbmUgYmxvY2sgaW5zdGVhZCBvZiBlYWNoIGdvaW5nIHRvIGEgZGlmZmVyZW50IGJsb2NrLCBidXQgaXNuJ3QgCisvLy8gdGhlIHN0YW5kYXJkIGRlZmluaXRpb24gb2YgYSAiY3JpdGljYWwgZWRnZSIuCisvLy8KKy8vLyBJdCBpcyBpbnZhbGlkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbiBhIGNyaXRpY2FsIGVkZ2UgdGhhdCBzdGFydHMgYXQgYW4KKy8vLyBJbmRpcmVjdEJySW5zdC4gIFNwbGl0dGluZyB0aGVzZSBlZGdlcyB3aWxsIGFsbW9zdCBhbHdheXMgY3JlYXRlIGFuIGludmFsaWQKKy8vLyBwcm9ncmFtIGJlY2F1c2UgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldyBibG9jayB3b24ndCBiZSB0aGUgb25lIHRoYXQgaXMganVtcGVkCisvLy8gdG8uCisvLy8KK0Jhc2ljQmxvY2sgKlNwbGl0Q3JpdGljYWxFZGdlKFRlcm1pbmF0b3JJbnN0ICpUSSwgdW5zaWduZWQgU3VjY051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3MgKlAgPSAwLCBib29sIE1lcmdlSWRlbnRpY2FsRWRnZXMgPSBmYWxzZSk7CisKK2lubGluZSBCYXNpY0Jsb2NrICpTcGxpdENyaXRpY2FsRWRnZShCYXNpY0Jsb2NrICpCQiwgc3VjY19pdGVyYXRvciBTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzICpQID0gMCkgeworICByZXR1cm4gU3BsaXRDcml0aWNhbEVkZ2UoQkItPmdldFRlcm1pbmF0b3IoKSwgU0kuZ2V0U3VjY2Vzc29ySW5kZXgoKSwgUCk7Cit9CisKKy8vLyBTcGxpdENyaXRpY2FsRWRnZSAtIElmIHRoZSBlZGdlIGZyb20gKlBJIHRvIEJCIGlzIG5vdCBjcml0aWNhbCwgcmV0dXJuCisvLy8gZmFsc2UuICBPdGhlcndpc2UsIHNwbGl0IGFsbCBlZGdlcyBiZXR3ZWVuIHRoZSB0d28gYmxvY2tzIGFuZCByZXR1cm4gdHJ1ZS4KKy8vLyBUaGlzIHVwZGF0ZXMgYWxsIG9mIHRoZSBzYW1lIGFuYWx5c2VzIGFzIHRoZSBvdGhlciBTcGxpdENyaXRpY2FsRWRnZQorLy8vIGZ1bmN0aW9uLiAgSWYgUCBpcyBzcGVjaWZpZWQsIGl0IHVwZGF0ZXMgdGhlIGFuYWx5c2VzCisvLy8gZGVzY3JpYmVkIGFib3ZlLgoraW5saW5lIGJvb2wgU3BsaXRDcml0aWNhbEVkZ2UoQmFzaWNCbG9jayAqU3VjYywgcHJlZF9pdGVyYXRvciBQSSwgUGFzcyAqUCA9IDApIHsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIFRlcm1pbmF0b3JJbnN0ICpUSSA9ICgqUEkpLT5nZXRUZXJtaW5hdG9yKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUSS0+Z2V0TnVtU3VjY2Vzc29ycygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoVEktPmdldFN1Y2Nlc3NvcihpKSA9PSBTdWNjKQorICAgICAgTWFkZUNoYW5nZSB8PSAhIVNwbGl0Q3JpdGljYWxFZGdlKFRJLCBpLCBQKTsKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vLyBTcGxpdENyaXRpY2FsRWRnZSAtIElmIGFuIGVkZ2UgZnJvbSBTcmMgdG8gRHN0IGlzIGNyaXRpY2FsLCBzcGxpdCB0aGUgZWRnZQorLy8vIGFuZCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoYXQgdGhlcmUgYmUKKy8vLyBhbiBlZGdlIGJldHdlZW4gdGhlIHR3byBibG9ja3MuICBJZiBQIGlzIHNwZWNpZmllZCwgaXQgdXBkYXRlcyB0aGUgYW5hbHlzZXMKKy8vLyBkZXNjcmliZWQgYWJvdmUuCitpbmxpbmUgQmFzaWNCbG9jayAqU3BsaXRDcml0aWNhbEVkZ2UoQmFzaWNCbG9jayAqU3JjLCBCYXNpY0Jsb2NrICpEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzcyAqUCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNZXJnZUlkZW50aWNhbEVkZ2VzID0gZmFsc2UpIHsKKyAgVGVybWluYXRvckluc3QgKlRJID0gU3JjLT5nZXRUZXJtaW5hdG9yKCk7CisgIHVuc2lnbmVkIGkgPSAwOworICB3aGlsZSAoMSkgeworICAgIGFzc2VydChpICE9IFRJLT5nZXROdW1TdWNjZXNzb3JzKCkgJiYgIkVkZ2UgZG9lc24ndCBleGlzdCEiKTsKKyAgICBpZiAoVEktPmdldFN1Y2Nlc3NvcihpKSA9PSBEc3QpCisgICAgICByZXR1cm4gU3BsaXRDcml0aWNhbEVkZ2UoVEksIGksIFAsIE1lcmdlSWRlbnRpY2FsRWRnZXMpOworICAgICsraTsKKyAgfQorfQorCisvLy8gU3BsaXRFZGdlIC0gIFNwbGl0IHRoZSBlZGdlIGNvbm5lY3Rpbmcgc3BlY2lmaWVkIGJsb2NrLiBQYXNzIFAgbXVzdCAKKy8vLyBub3QgYmUgTlVMTC4gCitCYXNpY0Jsb2NrICpTcGxpdEVkZ2UoQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8sIFBhc3MgKlApOworCisvLy8gU3BsaXRCbG9jayAtIFNwbGl0IHRoZSBzcGVjaWZpZWQgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiAtIGV2ZXJ5CisvLy8gdGhpbmcgYmVmb3JlIFNwbGl0UHQgc3RheXMgaW4gT2xkIGFuZCBldmVyeXRoaW5nIHN0YXJ0aW5nIHdpdGggU3BsaXRQdCBtb3ZlcworLy8vIHRvIGEgbmV3IGJsb2NrLiAgVGhlIHR3byBibG9ja3MgYXJlIGpvaW5lZCBieSBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCBhbmQKKy8vLyB0aGUgbG9vcCBpbmZvIGlzIHVwZGF0ZWQuCisvLy8KK0Jhc2ljQmxvY2sgKlNwbGl0QmxvY2soQmFzaWNCbG9jayAqT2xkLCBJbnN0cnVjdGlvbiAqU3BsaXRQdCwgUGFzcyAqUCk7CisgCisvLy8gU3BsaXRCbG9ja1ByZWRlY2Vzc29ycyAtIFRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgQkIgYnkgaW50cm9kdWNpbmcgYSBuZXcKKy8vLyBiYXNpYyBibG9jayBpbnRvIHRoZSBmdW5jdGlvbiwgYW5kIG1vdmluZyBzb21lIG9mIHRoZSBwcmVkZWNlc3NvcnMgb2YgQkIgdG8KKy8vLyBiZSBwcmVkZWNlc3NvcnMgb2YgdGhlIG5ldyBibG9jay4gIFRoZSBuZXcgcHJlZGVjZXNzb3JzIGFyZSBpbmRpY2F0ZWQgYnkgdGhlCisvLy8gUHJlZHMgYXJyYXksIHdoaWNoIGhhcyBOdW1QcmVkcyBlbGVtZW50cyBpbiBpdC4gIFRoZSBuZXcgYmxvY2sgaXMgZ2l2ZW4gYQorLy8vIHN1ZmZpeCBvZiAnU3VmZml4Jy4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV3IGJsb2NrLgorLy8vCisvLy8gVGhpcyBjdXJyZW50bHkgdXBkYXRlcyB0aGUgTExWTSBJUiwgQWxpYXNBbmFseXNpcywgRG9taW5hdG9yVHJlZSwKKy8vLyBEb21pbmFuY2VGcm9udGllciwgTG9vcEluZm8sIGFuZCBMQ0NTQSBidXQgbm8gb3RoZXIgYW5hbHlzZXMuCisvLy8gSW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgcHJlc2VydmUgTG9vcFNpbXBsaWZ5IChiZWNhdXNlIGl0J3MKKy8vLyBjb21wbGljYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgb25lIG9mIHRoZSBlZGdlcyBiZWluZyBzcGxpdAorLy8vIGlzIGFuIGV4aXQgb2YgYSBsb29wIHdpdGggb3RoZXIgZXhpdHMpLgorLy8vCitCYXNpY0Jsb2NrICpTcGxpdEJsb2NrUHJlZGVjZXNzb3JzKEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrICpjb25zdCAqUHJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVByZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzICpQID0gMCk7CisgIAorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CYXNpY0lubGluZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Jhc2ljSW5saW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiY2E2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CYXNpY0lubGluZXIuaApAQCAtMCwwICsxLDU1IEBACisvLz09PS0gQmFzaWNJbmxpbmVyLmggLSBCYXNpYyBmdW5jdGlvbiBsZXZlbCBpbmxpbmVyIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgc2ltcGxlIGZ1bmN0aW9uIGJhc2VkIGlubGluZXIgdGhhdCBkb2VzIG5vdCB1c2UKKy8vIGNhbGwgZ3JhcGggaW5mb3JtYXRpb24uIAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQkFTSUNJTkxJTkVSX0gKKyNkZWZpbmUgQkFTSUNJTkxJTkVSX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvSW5saW5lQ29zdC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgRnVuY3Rpb247CisgIGNsYXNzIFRhcmdldERhdGE7CisgIHN0cnVjdCBCYXNpY0lubGluZXJJbXBsOworCisgIC8vLyBCYXNpY0lubGluZXIgLSBCYXNpY0lubGluZXIgcHJvdmlkZXMgZnVuY3Rpb24gbGV2ZWwgaW5saW5pbmcgaW50ZXJmYWNlLgorICAvLy8gQ2xpZW50cyBwcm92aWRlIGxpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZSBpbmxpbmUgd2l0aG91dCB1c2luZworICAvLy8gbW9kdWxlIGxldmVsIGNhbGwgZ3JhcGggaW5mb3JtYXRpb24uIE5vdGUgdGhhdCB0aGUgQmFzaWNJbmxpbmVyIGlzCisgIC8vLyBmcmVlIHRvIGRlbGV0ZSBhIGZ1bmN0aW9uIGlmIGl0IGlzIGlubGluZWQgaW50byBhbGwgY2FsbCBzaXRlcy4KKyAgY2xhc3MgQmFzaWNJbmxpbmVyIHsKKyAgcHVibGljOgorICAgIAorICAgIGV4cGxpY2l0IEJhc2ljSW5saW5lcihUYXJnZXREYXRhICpUID0gTlVMTCk7CisgICAgfkJhc2ljSW5saW5lcigpOworCisgICAgLy8vIGFkZEZ1bmN0aW9uIC0gQWRkIGZ1bmN0aW9uIGludG8gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIHByb2Nlc3MuCisgICAgLy8vIEFsbCBmdW5jdGlvbnMgbXVzdCBiZSBpbnNlcnRlZCB1c2luZyB0aGlzIGludGVyZmFjZSBiZWZvcmUgaW52b2tpbmcKKyAgICAvLy8gaW5saW5lRnVuY3Rpb25zKCkuCisgICAgdm9pZCBhZGRGdW5jdGlvbihGdW5jdGlvbiAqRik7CisKKyAgICAvLy8gbmV2ZXJJbmxpbmVGdW5jdGlvbiAtIFNvbWV0aW1lcyBhIGZ1bmN0aW9uIGlzIG5ldmVyIHRvIGJlIGlubGluZWQgCisgICAgLy8vIGJlY2F1c2Ugb2Ygb25lIG9yIG90aGVyIHJlYXNvbi4gCisgICAgdm9pZCBuZXZlcklubGluZUZ1bmN0aW9uKEZ1bmN0aW9uICpGKTsKKworICAgIC8vLyBpbmxpbmVGdWN0aW9ucyAtIFdhbGsgYWxsIGNhbGwgc2l0ZXMgaW4gYWxsIGZ1bmN0aW9ucyBzdXBwbGllZCBieQorICAgIC8vLyBjbGllbnQuIElubGluZSBhcyBtYW55IGNhbGwgc2l0ZXMgYXMgcG9zc2libGUuIERlbGV0ZSBjb21wbGV0ZWx5CisgICAgLy8vIGlubGluZWQgZnVuY3Rpb25zLgorICAgIHZvaWQgaW5saW5lRnVuY3Rpb25zKCk7CisKKyAgcHJpdmF0ZToKKyAgICBCYXNpY0lubGluZXJJbXBsICpJbXBsOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0J1aWxkTGliQ2FsbHMuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0J1aWxkTGliQ2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzVjMTQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQnVpbGRMaWJDYWxscy5oCkBAIC0wLDAgKzEsMTI0IEBACisvLz09PS0gQnVpbGRMaWJDYWxscy5oIC0gVXRpbGl0eSBidWlsZGVyIGZvciBsaWJjYWxscyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBleHBvc2VzIGFuIGludGVyZmFjZSB0byBidWlsZCBzb21lIEMgbGFuZ3VhZ2UgbGliY2FsbHMgZm9yCisvLyBvcHRpbWl6YXRpb24gcGFzc2VzIHRoYXQgbmVlZCB0byBjYWxsIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFRSQU5TRk9STVNfVVRJTFNfQlVJTERMSUJDQUxMU19ICisjZGVmaW5lIFRSQU5TRk9STVNfVVRJTFNfQlVJTERMSUJDQUxMU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSVJCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgVmFsdWU7CisgIGNsYXNzIFRhcmdldERhdGE7CisgIAorICAvLy8gQ2FzdFRvQ1N0ciAtIFJldHVybiBWIGlmIGl0IGlzIGFuIGk4Kiwgb3RoZXJ3aXNlIGNhc3QgaXQgdG8gaTgqLgorICBWYWx1ZSAqQ2FzdFRvQ1N0cihWYWx1ZSAqViwgSVJCdWlsZGVyPD4gJkIpOworCisgIC8vLyBFbWl0U3RyTGVuIC0gRW1pdCBhIGNhbGwgdG8gdGhlIHN0cmxlbiBmdW5jdGlvbiB0byB0aGUgYnVpbGRlciwgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHBvaW50ZXIuICBQdHIgaXMgcmVxdWlyZWQgdG8gYmUgc29tZSBwb2ludGVyIHR5cGUsIGFuZCB0aGUKKyAgLy8vIHJldHVybiB2YWx1ZSBoYXMgJ2ludHB0cl90JyB0eXBlLgorICBWYWx1ZSAqRW1pdFN0ckxlbihWYWx1ZSAqUHRyLCBJUkJ1aWxkZXI8PiAmQiwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpOworCisgIC8vLyBFbWl0U3RyQ2hyIC0gRW1pdCBhIGNhbGwgdG8gdGhlIHN0cmNociBmdW5jdGlvbiB0byB0aGUgYnVpbGRlciwgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHBvaW50ZXIgYW5kIGNoYXJhY3Rlci4gIFB0ciBpcyByZXF1aXJlZCB0byBiZSBzb21lIHBvaW50ZXIgdHlwZSwKKyAgLy8vIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGhhcyAnaTgqJyB0eXBlLgorICBWYWx1ZSAqRW1pdFN0ckNocihWYWx1ZSAqUHRyLCBjaGFyIEMsIElSQnVpbGRlcjw+ICZCLCBjb25zdCBUYXJnZXREYXRhICpURCk7CisKKyAgLy8vIEVtaXRTdHJOQ21wIC0gRW1pdCBhIGNhbGwgdG8gdGhlIHN0cm5jbXAgZnVuY3Rpb24gdG8gdGhlIGJ1aWxkZXIuCisgIFZhbHVlICpFbWl0U3RyTkNtcChWYWx1ZSAqUHRyMSwgVmFsdWUgKlB0cjIsIFZhbHVlICpMZW4sIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQpOworCisgIC8vLyBFbWl0U3RyQ3B5IC0gRW1pdCBhIGNhbGwgdG8gdGhlIHN0cmNweSBmdW5jdGlvbiB0byB0aGUgYnVpbGRlciwgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHBvaW50ZXIgYXJndW1lbnRzLgorICBWYWx1ZSAqRW1pdFN0ckNweShWYWx1ZSAqRHN0LCBWYWx1ZSAqU3JjLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQsIFN0cmluZ1JlZiBOYW1lID0gInN0cmNweSIpOworCisgIC8vLyBFbWl0U3RyTkNweSAtIEVtaXQgYSBjYWxsIHRvIHRoZSBzdHJuY3B5IGZ1bmN0aW9uIHRvIHRoZSBidWlsZGVyLCBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgcG9pbnRlciBhcmd1bWVudHMgYW5kIGxlbmd0aC4KKyAgVmFsdWUgKkVtaXRTdHJOQ3B5KFZhbHVlICpEc3QsIFZhbHVlICpTcmMsIFZhbHVlICpMZW4sIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCwgU3RyaW5nUmVmIE5hbWUgPSAic3RybmNweSIpOworICAKKyAgLy8vIEVtaXRNZW1DcHkgLSBFbWl0IGEgY2FsbCB0byB0aGUgbWVtY3B5IGZ1bmN0aW9uIHRvIHRoZSBidWlsZGVyLiAgVGhpcworICAvLy8gYWx3YXlzIGV4cGVjdHMgdGhhdCB0aGUgc2l6ZSBoYXMgdHlwZSAnaW50cHRyX3QnIGFuZCBEc3QvU3JjIGFyZSBwb2ludGVycy4KKyAgVmFsdWUgKkVtaXRNZW1DcHkoVmFsdWUgKkRzdCwgVmFsdWUgKlNyYywgVmFsdWUgKkxlbiwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSwgSVJCdWlsZGVyPD4gJkIsIGNvbnN0IFRhcmdldERhdGEgKlREKTsKKworICAvLy8gRW1pdE1lbUNweUNoayAtIEVtaXQgYSBjYWxsIHRvIHRoZSBfX21lbWNweV9jaGsgZnVuY3Rpb24gdG8gdGhlIGJ1aWxkZXIuCisgIC8vLyBUaGlzIGV4cGVjdHMgdGhhdCB0aGUgTGVuIGFuZCBPYmpTaXplIGhhdmUgdHlwZSAnaW50cHRyX3QnIGFuZCBEc3QvU3JjCisgIC8vLyBhcmUgcG9pbnRlcnMuCisgIFZhbHVlICpFbWl0TWVtQ3B5Q2hrKFZhbHVlICpEc3QsIFZhbHVlICpTcmMsIFZhbHVlICpMZW4sIFZhbHVlICpPYmpTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBJUkJ1aWxkZXI8PiAmQiwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpOworCisgIC8vLyBFbWl0TWVtTW92ZSAtIEVtaXQgYSBjYWxsIHRvIHRoZSBtZW1tb3ZlIGZ1bmN0aW9uIHRvIHRoZSBidWlsZGVyLiAgVGhpcworICAvLy8gYWx3YXlzIGV4cGVjdHMgdGhhdCB0aGUgc2l6ZSBoYXMgdHlwZSAnaW50cHRyX3QnIGFuZCBEc3QvU3JjIGFyZSBwb2ludGVycy4KKyAgVmFsdWUgKkVtaXRNZW1Nb3ZlKFZhbHVlICpEc3QsIFZhbHVlICpTcmMsIFZhbHVlICpMZW4sIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlLCBJUkJ1aWxkZXI8PiAmQiwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpOworCisgIC8vLyBFbWl0TWVtQ2hyIC0gRW1pdCBhIGNhbGwgdG8gdGhlIG1lbWNociBmdW5jdGlvbi4gIFRoaXMgYXNzdW1lcyB0aGF0IFB0ciBpcworICAvLy8gYSBwb2ludGVyLCBWYWwgaXMgYW4gaTMyIHZhbHVlLCBhbmQgTGVuIGlzIGFuICdpbnRwdHJfdCcgdmFsdWUuCisgIFZhbHVlICpFbWl0TWVtQ2hyKFZhbHVlICpQdHIsIFZhbHVlICpWYWwsIFZhbHVlICpMZW4sIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCk7CisKKyAgLy8vIEVtaXRNZW1DbXAgLSBFbWl0IGEgY2FsbCB0byB0aGUgbWVtY21wIGZ1bmN0aW9uLgorICBWYWx1ZSAqRW1pdE1lbUNtcChWYWx1ZSAqUHRyMSwgVmFsdWUgKlB0cjIsIFZhbHVlICpMZW4sIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCk7CisKKyAgLy8vIEVtaXRNZW1TZXQgLSBFbWl0IGEgY2FsbCB0byB0aGUgbWVtc2V0IGZ1bmN0aW9uCisgIFZhbHVlICpFbWl0TWVtU2V0KFZhbHVlICpEc3QsIFZhbHVlICpWYWwsIFZhbHVlICpMZW4sIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgSVJCdWlsZGVyPD4gJkIsIGNvbnN0IFRhcmdldERhdGEgKlREKTsKKworICAvLy8gRW1pdFVuYXJ5RmxvYXRGbkNhbGwgLSBFbWl0IGEgY2FsbCB0byB0aGUgdW5hcnkgZnVuY3Rpb24gbmFtZWQgJ05hbWUnCisgIC8vLyAoZS5nLiAgJ2Zsb29yJykuICBUaGlzIGZ1bmN0aW9uIGlzIGtub3duIHRvIHRha2UgYSBzaW5nbGUgb2YgdHlwZSBtYXRjaGluZworICAvLy8gJ09wJyBhbmQgcmV0dXJucyBvbmUgdmFsdWUgd2l0aCB0aGUgc2FtZSB0eXBlLiAgSWYgJ09wJyBpcyBhIGxvbmcgZG91YmxlLAorICAvLy8gJ2wnIGlzIGFkZGVkIGFzIHRoZSBzdWZmaXggb2YgbmFtZSwgaWYgJ09wJyBpcyBhIGZsb2F0LCB3ZSBhZGQgYSAnZicKKyAgLy8vIHN1ZmZpeC4KKyAgVmFsdWUgKkVtaXRVbmFyeUZsb2F0Rm5DYWxsKFZhbHVlICpPcCwgY29uc3QgY2hhciAqTmFtZSwgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyTGlzdFB0ciAmQXR0cnMpOworCisgIC8vLyBFbWl0UHV0Q2hhciAtIEVtaXQgYSBjYWxsIHRvIHRoZSBwdXRjaGFyIGZ1bmN0aW9uLiAgVGhpcyBhc3N1bWVzIHRoYXQgQ2hhcgorICAvLy8gaXMgYW4gaW50ZWdlci4KKyAgVmFsdWUgKkVtaXRQdXRDaGFyKFZhbHVlICpDaGFyLCBJUkJ1aWxkZXI8PiAmQiwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpOworCisgIC8vLyBFbWl0UHV0UyAtIEVtaXQgYSBjYWxsIHRvIHRoZSBwdXRzIGZ1bmN0aW9uLiAgVGhpcyBhc3N1bWVzIHRoYXQgU3RyIGlzCisgIC8vLyBzb21lIHBvaW50ZXIuCisgIHZvaWQgRW1pdFB1dFMoVmFsdWUgKlN0ciwgSVJCdWlsZGVyPD4gJkIsIGNvbnN0IFRhcmdldERhdGEgKlREKTsKKworICAvLy8gRW1pdEZQdXRDIC0gRW1pdCBhIGNhbGwgdG8gdGhlIGZwdXRjIGZ1bmN0aW9uLiAgVGhpcyBhc3N1bWVzIHRoYXQgQ2hhciBpcworICAvLy8gYW4gaTMyLCBhbmQgRmlsZSBpcyBhIHBvaW50ZXIgdG8gRklMRS4KKyAgdm9pZCBFbWl0RlB1dEMoVmFsdWUgKkNoYXIsIFZhbHVlICpGaWxlLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQpOworCisgIC8vLyBFbWl0RlB1dFMgLSBFbWl0IGEgY2FsbCB0byB0aGUgcHV0cyBmdW5jdGlvbi4gIFN0ciBpcyByZXF1aXJlZCB0byBiZSBhCisgIC8vLyBwb2ludGVyIGFuZCBGaWxlIGlzIGEgcG9pbnRlciB0byBGSUxFLgorICB2b2lkIEVtaXRGUHV0UyhWYWx1ZSAqU3RyLCBWYWx1ZSAqRmlsZSwgSVJCdWlsZGVyPD4gJkIsIGNvbnN0IFRhcmdldERhdGEgKlREKTsKKworICAvLy8gRW1pdEZXcml0ZSAtIEVtaXQgYSBjYWxsIHRvIHRoZSBmd3JpdGUgZnVuY3Rpb24uICBUaGlzIGFzc3VtZXMgdGhhdCBQdHIgaXMKKyAgLy8vIGEgcG9pbnRlciwgU2l6ZSBpcyBhbiAnaW50cHRyX3QnLCBhbmQgRmlsZSBpcyBhIHBvaW50ZXIgdG8gRklMRS4KKyAgdm9pZCBFbWl0RldyaXRlKFZhbHVlICpQdHIsIFZhbHVlICpTaXplLCBWYWx1ZSAqRmlsZSwgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCk7CisKKyAgLy8vIFNpbXBsaWZ5Rm9ydGlmaWVkTGliQ2FsbHMgLSBIZWxwZXIgY2xhc3MgZm9yIGZvbGRpbmcgY2hlY2tlZCBsaWJyYXJ5CisgIC8vLyBjYWxscyAoZS5nLiBfX3N0cmNweV9jaGspIGludG8gdGhlaXIgdW5jaGVja2VkIGNvdW50ZXJwYXJ0cy4KKyAgY2xhc3MgU2ltcGxpZnlGb3J0aWZpZWRMaWJDYWxscyB7CisgIHByb3RlY3RlZDoKKyAgICBDYWxsSW5zdCAqQ0k7CisgICAgdmlydHVhbCB2b2lkIHJlcGxhY2VDYWxsKFZhbHVlICpXaXRoKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzRm9sZGFibGUodW5zaWduZWQgU2l6ZUNJT3AsIHVuc2lnbmVkIFNpemVBcmdPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyaW5nKSBjb25zdCA9IDA7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5TaW1wbGlmeUZvcnRpZmllZExpYkNhbGxzKCk7CisgICAgYm9vbCBmb2xkKENhbGxJbnN0ICpDSSwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Nsb25pbmcuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Nsb25pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E0OTgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQ2xvbmluZy5oCkBAIC0wLDAgKzEsMjA1IEBACisvLz09PS0gQ2xvbmluZy5oIC0gQ2xvbmUgdmFyaW91cyBwYXJ0cyBvZiBMTFZNIHByb2dyYW1zIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgdG8gY2xvbmUgY2h1bmtzIG9mIExMVk0KKy8vIGNvZGUgZm9yIHZhcmlvdXMgcHVycG9zZXMuICBUaGlzIHZhcmllcyBmcm9tIGNvcHlpbmcgd2hvbGUgbW9kdWxlcyBpbnRvIG5ldworLy8gbW9kdWxlcywgdG8gY2xvbmluZyBmdW5jdGlvbnMgd2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzLCB0byBpbmxpbmluZworLy8gZnVuY3Rpb25zLCB0byBjb3B5aW5nIGJhc2ljIGJsb2NrcyB0byBzdXBwb3J0IGxvb3AgdW5yb2xsaW5nIG9yIHN1cGVyYmxvY2sKKy8vIGZvcm1hdGlvbiwgZXRjLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0NMT05JTkdfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQ0xPTklOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9WYWx1ZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgUGFzczsKK2NsYXNzIExQUGFzc01hbmFnZXI7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgVmFsdWU7CitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIEludm9rZUluc3Q7CitjbGFzcyBSZXR1cm5JbnN0OworY2xhc3MgQ2FsbFNpdGU7CitjbGFzcyBUcmFjZTsKK2NsYXNzIENhbGxHcmFwaDsKK2NsYXNzIFRhcmdldERhdGE7CitjbGFzcyBMb29wOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBBbGxvY2FJbnN0OworCisvLy8gQ2xvbmVNb2R1bGUgLSBSZXR1cm4gYW4gZXhhY3QgY29weSBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZQorLy8vCitNb2R1bGUgKkNsb25lTW9kdWxlKGNvbnN0IE1vZHVsZSAqTSk7CitNb2R1bGUgKkNsb25lTW9kdWxlKGNvbnN0IE1vZHVsZSAqTSwgVmFsdWVNYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+ICZWTWFwKTsKKworLy8vIENsb25lZENvZGVJbmZvIC0gVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gY2FwdHVyZSBpbmZvcm1hdGlvbiBhYm91dCBjb2RlCisvLy8gYmVpbmcgY2xvbmVkLCB3aGlsZSBpdCBpcyBiZWluZyBjbG9uZWQuCitzdHJ1Y3QgQ2xvbmVkQ29kZUluZm8geworICAvLy8gQ29udGFpbnNDYWxscyAtIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgdGhlIGNsb25lZCBjb2RlIGNvbnRhaW5zIGEgbm9ybWFsCisgIC8vLyBjYWxsIGluc3RydWN0aW9uLgorICBib29sIENvbnRhaW5zQ2FsbHM7CisgIAorICAvLy8gQ29udGFpbnNVbndpbmRzIC0gVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgY2xvbmVkIGNvZGUgY29udGFpbnMgYW4KKyAgLy8vIHVud2luZCBpbnN0cnVjdGlvbi4KKyAgYm9vbCBDb250YWluc1Vud2luZHM7CisgIAorICAvLy8gQ29udGFpbnNEeW5hbWljQWxsb2NhcyAtIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgdGhlIGNsb25lZCBjb2RlIGNvbnRhaW5zCisgIC8vLyBhICdkeW5hbWljJyBhbGxvY2EuICBEeW5hbWljIGFsbG9jYXMgYXJlIGFsbG9jYXMgdGhhdCBhcmUgZWl0aGVyIG5vdCBpbgorICAvLy8gdGhlIGVudHJ5IGJsb2NrIG9yIHRoZXkgYXJlIGluIHRoZSBlbnRyeSBibG9jayBidXQgYXJlIG5vdCBhIGNvbnN0YW50CisgIC8vLyBzaXplLgorICBib29sIENvbnRhaW5zRHluYW1pY0FsbG9jYXM7CisgIAorICBDbG9uZWRDb2RlSW5mbygpIHsKKyAgICBDb250YWluc0NhbGxzID0gZmFsc2U7CisgICAgQ29udGFpbnNVbndpbmRzID0gZmFsc2U7CisgICAgQ29udGFpbnNEeW5hbWljQWxsb2NhcyA9IGZhbHNlOworICB9Cit9OworCisKKy8vLyBDbG9uZUJhc2ljQmxvY2sgLSBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2ssIGJ1dCB3aXRob3V0CisvLy8gZW1iZWRkaW5nIHRoZSBibG9jayBpbnRvIGEgcGFydGljdWxhciBmdW5jdGlvbi4gIFRoZSBibG9jayByZXR1cm5lZCBpcyBhbgorLy8vIGV4YWN0IGNvcHkgb2YgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jaywgd2l0aG91dCBhbnkgcmVtYXBwaW5nIGhhdmluZyBiZWVuCisvLy8gcGVyZm9ybWVkLiAgQmVjYXVzZSBvZiB0aGlzLCB0aGlzIGlzIG9ubHkgc3VpdGFibGUgZm9yIGFwcGxpY2F0aW9ucyB3aGVyZQorLy8vIHRoZSBiYXNpYyBibG9jayB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIHNhbWUgZnVuY3Rpb24gdGhhdCBpdCB3YXMgY2xvbmVkCisvLy8gZnJvbSAobG9vcCB1bnJvbGxpbmcgd291bGQgdXNlIHRoaXMsIGZvciBleGFtcGxlKS4KKy8vLworLy8vIEFsc28sIG5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG1ha2VzIGEgZGlyZWN0IGNvcHkgb2YgdGhlIGJhc2ljIGJsb2NrLCBhbmQKKy8vLyBjYW4gdGh1cyBwcm9kdWNlIGlsbGVnYWwgTExWTSBjb2RlLiAgSW4gcGFydGljdWxhciwgaXQgd2lsbCBjb3B5IGFueSBQSEkKKy8vLyBub2RlcyBmcm9tIHRoZSBvcmlnaW5hbCBibG9jaywgZXZlbiB0aG91Z2ggdGhlcmUgYXJlIG5vIHByZWRlY2Vzc29ycyBmb3IgdGhlCisvLy8gbmV3bHkgY2xvbmVkIGJsb2NrICh0aHVzLCBwaGkgbm9kZXMgd2lsbCBoYXZlIHRvIGJlIHVwZGF0ZWQpLiAgQWxzbywgdGhpcworLy8vIGJsb2NrIHdpbGwgYnJhbmNoIHRvIHRoZSBvbGQgc3VjY2Vzc29ycyBvZiB0aGUgb3JpZ2luYWwgYmxvY2s6IHRoZXNlCisvLy8gc3VjY2Vzc29ycyB3aWxsIGhhdmUgdG8gaGF2ZSBhbnkgUEhJIG5vZGVzIHVwZGF0ZWQgdG8gYWNjb3VudCBmb3IgdGhlIG5ldworLy8vIGluY29taW5nIGVkZ2VzLgorLy8vCisvLy8gVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gaW5zdHJ1Y3Rpb25zIGluIHRoZSBzb3VyY2UgYW5kIHJlc3VsdCBiYXNpYyBibG9ja3MKKy8vLyBpcyByZWNvcmRlZCBpbiB0aGUgVk1hcCBtYXAuCisvLy8KKy8vLyBJZiB5b3UgaGF2ZSBhIHBhcnRpY3VsYXIgc3VmZml4IHlvdSdkIGxpa2UgdG8gdXNlIHRvIGFkZCB0byBhbnkgY2xvbmVkCisvLy8gbmFtZXMsIHNwZWNpZnkgaXQgYXMgdGhlIG9wdGlvbmFsIHRoaXJkIHBhcmFtZXRlci4KKy8vLworLy8vIElmIHlvdSB3b3VsZCBsaWtlIHRoZSBiYXNpYyBibG9jayB0byBiZSBhdXRvLWluc2VydGVkIGludG8gdGhlIGVuZCBvZiBhCisvLy8gZnVuY3Rpb24sIHlvdSBjYW4gc3BlY2lmeSBpdCBhcyB0aGUgb3B0aW9uYWwgZm91cnRoIHBhcmFtZXRlci4KKy8vLworLy8vIElmIHlvdSB3b3VsZCBsaWtlIHRvIGNvbGxlY3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xvbmVkCisvLy8gZnVuY3Rpb24sIHlvdSBjYW4gc3BlY2lmeSBhIENsb25lZENvZGVJbmZvIG9iamVjdCB3aXRoIHRoZSBvcHRpb25hbCBmaWZ0aAorLy8vIHBhcmFtZXRlci4KKy8vLworQmFzaWNCbG9jayAqQ2xvbmVCYXNpY0Jsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWFwPGNvbnN0IFZhbHVlKiwgVmFsdWUqPiAmVk1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN1ZmZpeCA9ICIiLCBGdW5jdGlvbiAqRiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvbmVkQ29kZUluZm8gKkNvZGVJbmZvID0gMCk7CisKKworLy8vIENsb25lTG9vcCAtIENsb25lIExvb3AuIENsb25lIGRvbWluYXRvciBpbmZvIGZvciBsb29wIGluc2lkZXJzLiBQb3B1bGF0ZQorLy8vIFZNYXAgdXNpbmcgb2xkIGJsb2NrcyB0byBuZXcgYmxvY2tzIG1hcHBpbmcuCitMb29wICpDbG9uZUxvb3AoTG9vcCAqTCwgTFBQYXNzTWFuYWdlciAqTFBNLCBMb29wSW5mbyAqTEksIAorICAgICAgICAgICAgICAgIFZhbHVlTWFwPGNvbnN0IFZhbHVlICosIFZhbHVlICo+ICZWTWFwLCBQYXNzICpQKTsKKworLy8vIENsb25lRnVuY3Rpb24gLSBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24sIGJ1dCB3aXRob3V0CisvLy8gZW1iZWRkaW5nIHRoZSBmdW5jdGlvbiBpbnRvIGFub3RoZXIgbW9kdWxlLiAgQWxzbywgYW55IHJlZmVyZW5jZXMgc3BlY2lmaWVkCisvLy8gaW4gdGhlIFZNYXAgYXJlIGNoYW5nZWQgdG8gcmVmZXIgdG8gdGhlaXIgbWFwcGVkIHZhbHVlIGluc3RlYWQgb2YgdGhlCisvLy8gb3JpZ2luYWwgb25lLiAgSWYgYW55IG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uIGFyZSBpbiB0aGUgVk1hcCwKKy8vLyB0aGUgYXJndW1lbnRzIGFyZSBkZWxldGVkIGZyb20gdGhlIHJlc3VsdGFudCBmdW5jdGlvbi4gIFRoZSBWTWFwIGlzCisvLy8gdXBkYXRlZCB0byBpbmNsdWRlIG1hcHBpbmdzIGZyb20gYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgYW5kIGJhc2ljYmxvY2tzIGluCisvLy8gdGhlIGZ1bmN0aW9uIGZyb20gdGhlaXIgb2xkIHRvIG5ldyB2YWx1ZXMuICBUaGUgZmluYWwgYXJndW1lbnQgY2FwdHVyZXMKKy8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xvbmVkIGNvZGUgaWYgbm9uLW51bGwuCisvLy8KK0Z1bmN0aW9uICpDbG9uZUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+ICZWTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2xvbmVkQ29kZUluZm8gKkNvZGVJbmZvID0gMCk7CisKKy8vLyBDbG9uZUZ1bmN0aW9uIC0gVmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gdGhhdCBkb2Vzbid0IG5lZWQgdGhlIFZNYXAuCisvLy8KK2lubGluZSBGdW5jdGlvbiAqQ2xvbmVGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAqRiwgQ2xvbmVkQ29kZUluZm8gKkNvZGVJbmZvID0gMCl7CisgIFZhbHVlTWFwPGNvbnN0IFZhbHVlKiwgVmFsdWUqPiBWTWFwOworICByZXR1cm4gQ2xvbmVGdW5jdGlvbihGLCBWTWFwLCBDb2RlSW5mbyk7Cit9CisKKy8vLyBDbG9uZSBPbGRGdW5jIGludG8gTmV3RnVuYywgdHJhbnNmb3JtaW5nIHRoZSBvbGQgYXJndW1lbnRzIGludG8gcmVmZXJlbmNlcworLy8vIHRvIEFyZ01hcCB2YWx1ZXMuICBOb3RlIHRoYXQgaWYgTmV3RnVuYyBhbHJlYWR5IGhhcyBiYXNpYyBibG9ja3MsIHRoZSBvbmVzCisvLy8gY2xvbmVkIGludG8gaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24KKy8vLyBmaWxscyBpbiBhIGxpc3Qgb2YgcmV0dXJuIGluc3RydWN0aW9ucywgYW5kIGNhbiBvcHRpb25hbGx5IGFwcGVuZCB0aGUKKy8vLyBzcGVjaWZpZWQgc3VmZml4IHRvIGFsbCB2YWx1ZXMgY2xvbmVkLgorLy8vCit2b2lkIENsb25lRnVuY3Rpb25JbnRvKEZ1bmN0aW9uICpOZXdGdW5jLCBjb25zdCBGdW5jdGlvbiAqT2xkRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+ICZWTWFwLAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UmV0dXJuSW5zdCo+ICZSZXR1cm5zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lU3VmZml4ID0gIiIsIAorICAgICAgICAgICAgICAgICAgICAgICBDbG9uZWRDb2RlSW5mbyAqQ29kZUluZm8gPSAwKTsKKworLy8vIENsb25lQW5kUHJ1bmVGdW5jdGlvbkludG8gLSBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSBDbG9uZUZ1bmN0aW9uSW50bywKKy8vLyBleGNlcHQgdGhhdCBpdCBkb2VzIHNvbWUgc2ltcGxlIGNvbnN0YW50IHByb3AgYW5kIERDRSBvbiB0aGUgZmx5LiAgVGhlCisvLy8gZWZmZWN0IG9mIHRoaXMgaXMgdG8gY29weSBzaWduaWZpY2FudGx5IGxlc3MgY29kZSBpbiBjYXNlcyB3aGVyZSAoZm9yCisvLy8gZXhhbXBsZSkgYSBmdW5jdGlvbiBjYWxsIHdpdGggY29uc3RhbnQgYXJndW1lbnRzIGlzIGlubGluZWQsIGFuZCB0aG9zZQorLy8vIGNvbnN0YW50IGFyZ3VtZW50cyBjYXVzZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb2RlIGluIHRoZSBjYWxsZWUgdG8gYmUKKy8vLyBkZWFkLiAgU2luY2UgdGhpcyBkb2Vzbid0IHByb2R1Y2UgYW4gZXhhY3RseSBjb3B5IG9mIHRoZSBpbnB1dCwgaXQgY2FuJ3QgYmUKKy8vLyB1c2VkIGZvciB0aGluZ3MgbGlrZSBDbG9uZUZ1bmN0aW9uIG9yIENsb25lTW9kdWxlLgordm9pZCBDbG9uZUFuZFBydW5lRnVuY3Rpb25JbnRvKEZ1bmN0aW9uICpOZXdGdW5jLCBjb25zdCBGdW5jdGlvbiAqT2xkRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hcDxjb25zdCBWYWx1ZSosIFZhbHVlKj4gJlZNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFJldHVybkluc3QqPiAmUmV0dXJucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lU3VmZml4ID0gIiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb25lZENvZGVJbmZvICpDb2RlSW5mbyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpUaGVDYWxsID0gMCk7CisKKyAgCisvLy8gSW5saW5lRnVuY3Rpb25JbmZvIC0gVGhpcyBjbGFzcyBjYXB0dXJlcyB0aGUgZGF0YSBpbnB1dCB0byB0aGUKKy8vLyBJbmxpbmVGdW5jdGlvbiBjYWxsLCBhbmQgcmVjb3JkcyB0aGUgYXV4aWxpYXJ5IHJlc3VsdHMgcHJvZHVjZWQgYnkgaXQuIAorY2xhc3MgSW5saW5lRnVuY3Rpb25JbmZvIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSW5saW5lRnVuY3Rpb25JbmZvKENhbGxHcmFwaCAqY2cgPSAwLCBjb25zdCBUYXJnZXREYXRhICp0ZCA9IDApCisgICAgOiBDRyhjZyksIFREKHRkKSB7fQorICAKKyAgLy8vIENHIC0gSWYgbm9uLW51bGwsIElubGluZUZ1bmN0aW9uIHdpbGwgdXBkYXRlIHRoZSBjYWxsZ3JhcGggdG8gcmVmbGVjdCB0aGUKKyAgLy8vIGNoYW5nZXMgaXQgbWFrZXMuCisgIENhbGxHcmFwaCAqQ0c7CisgIGNvbnN0IFRhcmdldERhdGEgKlREOworCisgIC8vLyBTdGF0aWNBbGxvY2FzIC0gSW5saW5lRnVuY3Rpb24gZmlsbHMgdGhpcyBpbiB3aXRoIGFsbCBzdGF0aWMgYWxsb2NhcyB0aGF0CisgIC8vLyBnZXQgY29waWVkIGludG8gdGhlIGNhbGxlci4KKyAgU21hbGxWZWN0b3I8QWxsb2NhSW5zdCosIDQ+IFN0YXRpY0FsbG9jYXM7CisKKyAgLy8vIElubGluZWRDYWxscyAtIElubGluZUZ1bmN0aW9uIGZpbGxzIHRoaXMgaW4gd2l0aCBjYWxsc2l0ZXMgdGhhdCB3ZXJlCisgIC8vLyBpbmxpbmVkIGZyb20gdGhlIGNhbGxlZS4gIFRoaXMgaXMgb25seSBmaWxsZWQgaW4gaWYgQ0cgaXMgbm9uLW51bGwuCisgIFNtYWxsVmVjdG9yPFdlYWtWSCwgOD4gSW5saW5lZENhbGxzOworICAKKyAgdm9pZCByZXNldCgpIHsKKyAgICBTdGF0aWNBbGxvY2FzLmNsZWFyKCk7CisgICAgSW5saW5lZENhbGxzLmNsZWFyKCk7CisgIH0KK307CisgIAorLy8vIElubGluZUZ1bmN0aW9uIC0gVGhpcyBmdW5jdGlvbiBpbmxpbmVzIHRoZSBjYWxsZWQgZnVuY3Rpb24gaW50byB0aGUgYmFzaWMKKy8vLyBibG9jayBvZiB0aGUgY2FsbGVyLiAgVGhpcyByZXR1cm5zIGZhbHNlIGlmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbmxpbmUKKy8vLyB0aGlzIGNhbGwuICBUaGUgcHJvZ3JhbSBpcyBzdGlsbCBpbiBhIHdlbGwgZGVmaW5lZCBzdGF0ZSBpZiB0aGlzIG9jY3VycworLy8vIHRob3VnaC4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIG9ubHkgZG9lcyBvbmUgbGV2ZWwgb2YgaW5saW5pbmcuICBGb3IgZXhhbXBsZSwgaWYgdGhlCisvLy8gaW5zdHJ1Y3Rpb24gJ2NhbGwgQicgaXMgaW5saW5lZCwgYW5kICdCJyBjYWxscyAnQycsIHRoZW4gdGhlIGNhbGwgdG8gJ0MnIG5vdworLy8vIGV4aXN0cyBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgU2ltaWxpYXJseSB0aGlzIHdpbGwgaW5saW5lIGEgcmVjdXJzaXZlCisvLy8gZnVuY3Rpb24gYnkgb25lIGxldmVsLgorLy8vCitib29sIElubGluZUZ1bmN0aW9uKENhbGxJbnN0ICpDLCBJbmxpbmVGdW5jdGlvbkluZm8gJklGSSk7Citib29sIElubGluZUZ1bmN0aW9uKEludm9rZUluc3QgKklJLCBJbmxpbmVGdW5jdGlvbkluZm8gJklGSSk7Citib29sIElubGluZUZ1bmN0aW9uKENhbGxTaXRlIENTLCBJbmxpbmVGdW5jdGlvbkluZm8gJklGSSk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRnVuY3Rpb25VdGlscy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRnVuY3Rpb25VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NWIwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9GdW5jdGlvblV0aWxzLmgKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tLSBUcmFuc2Zvcm0vVXRpbHMvRnVuY3Rpb25VdGlscy5oIC0gRnVuY3Rpb24gVXRpbHMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZhbWlseSBvZiB0cmFuc2Zvcm1hdGlvbnMgbWFuaXB1bGF0ZSBMTFZNIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19GVU5DVElPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19GVU5DVElPTl9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQmFzaWNCbG9jazsKKyAgY2xhc3MgRG9taW5hdG9yVHJlZTsKKyAgY2xhc3MgRnVuY3Rpb247CisgIGNsYXNzIExvb3A7CisKKyAgLy8vIEV4dHJhY3RDb2RlUmVnaW9uIC0gcmlwIG91dCBhIHNlcXVlbmNlIG9mIGJhc2ljIGJsb2NrcyBpbnRvIGEgbmV3IGZ1bmN0aW9uCisgIC8vLworICBGdW5jdGlvbiogRXh0cmFjdENvZGVSZWdpb24oRG9taW5hdG9yVHJlZSYgRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gJmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFnZ3JlZ2F0ZUFyZ3MgPSBmYWxzZSk7CisKKyAgLy8vIEV4dHJhY3RMb29wIC0gcmlwIG91dCBhIG5hdHVyYWwgbG9vcCBpbnRvIGEgbmV3IGZ1bmN0aW9uCisgIC8vLworICBGdW5jdGlvbiogRXh0cmFjdExvb3AoRG9taW5hdG9yVHJlZSYgRFQsIExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFnZ3JlZ2F0ZUFyZ3MgPSBmYWxzZSk7CisKKyAgLy8vIEV4dHJhY3RCYXNpY0Jsb2NrIC0gcmlwIG91dCBhIGJhc2ljIGJsb2NrIGludG8gYSBuZXcgZnVuY3Rpb24KKyAgLy8vCisgIEZ1bmN0aW9uKiBFeHRyYWN0QmFzaWNCbG9jayhCYXNpY0Jsb2NrICpCQiwgYm9vbCBBZ2dyZWdhdGVBcmdzID0gZmFsc2UpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzc5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oCkBAIC0wLDAgKzEsMTQ4IEBACisvLz09PS0tIExvY2FsLmggLSBGdW5jdGlvbnMgdG8gcGVyZm9ybSBsb2NhbCB0cmFuc2Zvcm1hdGlvbnMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmFtaWx5IG9mIGZ1bmN0aW9ucyBwZXJmb3JtIHZhcmlvdXMgbG9jYWwgdHJhbnNmb3JtYXRpb25zIHRvIHRoZQorLy8gcHJvZ3JhbS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19MT0NBTF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19MT0NBTF9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVXNlcjsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBCcmFuY2hJbnN0OworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBWYWx1ZTsKK2NsYXNzIFBhc3M7CitjbGFzcyBQSElOb2RlOworY2xhc3MgQWxsb2NhSW5zdDsKK2NsYXNzIENvbnN0YW50RXhwcjsKK2NsYXNzIFRhcmdldERhdGE7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKyAgCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIExvY2FsIGNvbnN0YW50IHByb3BhZ2F0aW9uLgorLy8KKworLy8vIENvbnN0YW50Rm9sZFRlcm1pbmF0b3IgLSBJZiBhIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24gaXMgcHJlZGljYXRlZCBvbiBhCisvLy8gY29uc3RhbnQgdmFsdWUsIGNvbnZlcnQgaXQgaW50byBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byB0aGUgY29uc3RhbnQKKy8vLyBkZXN0aW5hdGlvbi4gIFRoaXMgaXMgYSBub250cml2aWFsIG9wZXJhdGlvbiBiZWNhdXNlIHRoZSBzdWNjZXNzb3JzIG9mIHRoaXMKKy8vLyBiYXNpYyBibG9jayBtdXN0IGhhdmUgdGhlaXIgUEhJIG5vZGVzIHVwZGF0ZWQuCisvLy8KK2Jvb2wgQ29uc3RhbnRGb2xkVGVybWluYXRvcihCYXNpY0Jsb2NrICpCQik7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTG9jYWwgZGVhZCBjb2RlIGVsaW1pbmF0aW9uLgorLy8KKworLy8vIGlzSW5zdHJ1Y3Rpb25Ucml2aWFsbHlEZWFkIC0gUmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUKKy8vLyBpbnN0cnVjdGlvbiBpcyBub3QgdXNlZCwgYW5kIHRoZSBpbnN0cnVjdGlvbiBoYXMgbm8gc2lkZSBlZmZlY3RzLgorLy8vCitib29sIGlzSW5zdHJ1Y3Rpb25Ucml2aWFsbHlEZWFkKEluc3RydWN0aW9uICpJKTsKKworLy8vIFJlY3Vyc2l2ZWx5RGVsZXRlVHJpdmlhbGx5RGVhZEluc3RydWN0aW9ucyAtIElmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYQorLy8vIHRyaXZpYWxseSBkZWFkIGluc3RydWN0aW9uLCBkZWxldGUgaXQuICBJZiB0aGF0IG1ha2VzIGFueSBvZiBpdHMgb3BlcmFuZHMKKy8vLyB0cml2aWFsbHkgZGVhZCwgZGVsZXRlIHRoZW0gdG9vLCByZWN1cnNpdmVseS4gIFJldHVybiB0cnVlIGlmIGFueQorLy8vIGluc3RydWN0aW9ucyB3ZXJlIGRlbGV0ZWQuCitib29sIFJlY3Vyc2l2ZWx5RGVsZXRlVHJpdmlhbGx5RGVhZEluc3RydWN0aW9ucyhWYWx1ZSAqVik7CisKKy8vLyBSZWN1cnNpdmVseURlbGV0ZURlYWRQSElOb2RlIC0gSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBlZmZlY3RpdmVseQorLy8vIGRlYWQgUEhJIG5vZGUsIGR1ZSB0byBiZWluZyBhIGRlZi11c2UgY2hhaW4gb2Ygc2luZ2xlLXVzZSBub2RlcyB0aGF0CisvLy8gZWl0aGVyIGZvcm1zIGEgY3ljbGUgb3IgaXMgdGVybWluYXRlZCBieSBhIHRyaXZpYWxseSBkZWFkIGluc3RydWN0aW9uLAorLy8vIGRlbGV0ZSBpdC4gIElmIHRoYXQgbWFrZXMgYW55IG9mIGl0cyBvcGVyYW5kcyB0cml2aWFsbHkgZGVhZCwgZGVsZXRlIHRoZW0KKy8vLyB0b28sIHJlY3Vyc2l2ZWx5LiAgUmV0dXJuIHRydWUgaWYgdGhlIFBISSBub2RlIGlzIGFjdHVhbGx5IGRlbGV0ZWQuCitib29sIFJlY3Vyc2l2ZWx5RGVsZXRlRGVhZFBISU5vZGUoUEhJTm9kZSAqUE4pOworCisgIAorLy8vIFNpbXBsaWZ5SW5zdHJ1Y3Rpb25zSW5CbG9jayAtIFNjYW4gdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jayBhbmQgdHJ5IHRvCisvLy8gc2ltcGxpZnkgYW55IGluc3RydWN0aW9ucyBpbiBpdCBhbmQgcmVjdXJzaXZlbHkgZGVsZXRlIGRlYWQgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgaXQgY2hhbmdlZCB0aGUgY29kZSwgbm90ZSB0aGF0IGl0IGNhbiBkZWxldGUKKy8vLyBpbnN0cnVjdGlvbnMgaW4gb3RoZXIgYmxvY2tzIGFzIHdlbGwgaW4gdGhpcyBibG9jay4KK2Jvb2wgU2ltcGxpZnlJbnN0cnVjdGlvbnNJbkJsb2NrKEJhc2ljQmxvY2sgKkJCLCBjb25zdCBUYXJnZXREYXRhICpURCA9IDApOworICAgIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBDb250cm9sIEZsb3cgR3JhcGggUmVzdHJ1Y3R1cmluZy4KKy8vCisKKy8vLyBSZW1vdmVQcmVkZWNlc3NvckFuZFNpbXBsaWZ5IC0gTGlrZSBCYXNpY0Jsb2NrOjpyZW1vdmVQcmVkZWNlc3NvciwgdGhpcworLy8vIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB3ZSdyZSBhYm91dCB0byBkZWxldGUgUHJlZCBhcyBhIHByZWRlY2Vzc29yIG9mIEJCLiAgSWYKKy8vLyBCQiBjb250YWlucyBhbnkgUEhJIG5vZGVzLCB0aGlzIGRyb3BzIHRoZSBlbnRyaWVzIGluIHRoZSBQSEkgbm9kZXMgZm9yIFByZWQuCisvLy8KKy8vLyBVbmxpa2UgdGhlIHJlbW92ZVByZWRlY2Vzc29yIG1ldGhvZCwgdGhpcyBhdHRlbXB0cyB0byBzaW1wbGlmeSB1c2VzIG9mIFBISQorLy8vIG5vZGVzIHRoYXQgY29sbGFwc2UgaW50byBpZGVudGl0eSB2YWx1ZXMuICBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZToKKy8vLyAgIHggPSBwaGkoMSwgMCwgMCwgMCkKKy8vLyAgIHkgPSBhbmQgeCwgegorLy8vCisvLy8gLi4gYW5kIGRlbGV0ZSB0aGUgcHJlZGVjZXNzb3IgY29ycmVzcG9uZGluZyB0byB0aGUgJzEnLCB0aGlzIHdpbGwgYXR0ZW1wdCB0bworLy8vIHJlY3Vyc2l2ZWx5IGZvbGQgdGhlICdhbmQnIHRvIDAuCit2b2lkIFJlbW92ZVByZWRlY2Vzc29yQW5kU2ltcGxpZnkoQmFzaWNCbG9jayAqQkIsIEJhc2ljQmxvY2sgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0RGF0YSAqVEQgPSAwKTsKKyAgICAKKyAgCisvLy8gTWVyZ2VCYXNpY0Jsb2NrSW50b09ubHlQcmVkIC0gQkIgaXMgYSBibG9jayB3aXRoIG9uZSBwcmVkZWNlc3NvciBhbmQgaXRzCisvLy8gcHJlZGVjZXNzb3IgaXMga25vd24gdG8gaGF2ZSBvbmUgc3VjY2Vzc29yIChCQiEpLiAgRWxpbWluYXRlIHRoZSBlZGdlCisvLy8gYmV0d2VlbiB0aGVtLCBtb3ZpbmcgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgcHJlZGVjZXNzb3IgaW50byBCQi4gIFRoaXMKKy8vLyBkZWxldGVzIHRoZSBwcmVkZWNlc3NvciBibG9jay4KKy8vLwordm9pZCBNZXJnZUJhc2ljQmxvY2tJbnRvT25seVByZWQoQmFzaWNCbG9jayAqQkIsIFBhc3MgKlAgPSAwKTsKKyAgICAKKworLy8vIFRyeVRvU2ltcGxpZnlVbmNvbmRCcmFuY2hGcm9tRW1wdHlCbG9jayAtIEJCIGlzIGtub3duIHRvIGNvbnRhaW4gYW4KKy8vLyB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIGNvbnRhaW5zIG5vIGluc3RydWN0aW9ucyBvdGhlciB0aGFuIFBISSBub2RlcywKKy8vLyBwb3RlbnRpYWwgZGVidWcgaW50cmluc2ljcyBhbmQgdGhlIGJyYW5jaC4gIElmIHBvc3NpYmxlLCBlbGltaW5hdGUgQkIgYnkKKy8vLyByZXdyaXRpbmcgYWxsIHRoZSBwcmVkZWNlc3NvcnMgdG8gYnJhbmNoIHRvIHRoZSBzdWNjZXNzb3IgYmxvY2sgYW5kIHJldHVybgorLy8vIHRydWUuICBJZiB3ZSBjYW4ndCB0cmFuc2Zvcm0sIHJldHVybiBmYWxzZS4KK2Jvb2wgVHJ5VG9TaW1wbGlmeVVuY29uZEJyYW5jaEZyb21FbXB0eUJsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKworLy8vIEVsaW1pbmF0ZUR1cGxpY2F0ZVBISU5vZGVzIC0gQ2hlY2sgZm9yIGFuZCBlbGltaW5hdGUgZHVwbGljYXRlIFBISQorLy8vIG5vZGVzIGluIHRoaXMgYmxvY2suIFRoaXMgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFib3V0IFBISSBub2RlcworLy8vIHdoaWNoIGRpZmZlciBvbmx5IGluIHRoZSBvcmRlciBvZiB0aGUgaW5jb21pbmcgdmFsdWVzLCBidXQgaW5zdGNvbWJpbmUKKy8vLyBvcmRlcnMgdGhlbSBzbyBpdCB1c3VhbGx5IHdvbid0IG1hdHRlci4KKy8vLworYm9vbCBFbGltaW5hdGVEdXBsaWNhdGVQSElOb2RlcyhCYXNpY0Jsb2NrICpCQik7CisKKy8vLyBTaW1wbGlmeUNGRyAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkbyBzaW1wbGlmaWNhdGlvbiBvZiBhIENGRy4gIEZvcgorLy8vIGV4YW1wbGUsIGl0IGFkanVzdHMgYnJhbmNoZXMgdG8gYnJhbmNoZXMgdG8gZWxpbWluYXRlIHRoZSBleHRyYSBob3AsIGl0CisvLy8gZWxpbWluYXRlcyB1bnJlYWNoYWJsZSBiYXNpYyBibG9ja3MsIGFuZCBkb2VzIG90aGVyICJwZWVwaG9sZSIgb3B0aW1pemF0aW9uCisvLy8gb2YgdGhlIENGRy4gIEl0IHJldHVybnMgdHJ1ZSBpZiBhIG1vZGlmaWNhdGlvbiB3YXMgbWFkZSwgcG9zc2libHkgZGVsZXRpbmcKKy8vLyB0aGUgYmFzaWMgYmxvY2sgdGhhdCB3YXMgcG9pbnRlZCB0by4KKy8vLworLy8vIFdBUk5JTkc6ICBUaGUgZW50cnkgbm9kZSBvZiBhIG1ldGhvZCBtYXkgbm90IGJlIHNpbXBsaWZpZWQuCisvLy8KK2Jvb2wgU2ltcGxpZnlDRkcoQmFzaWNCbG9jayAqQkIsIGNvbnN0IFRhcmdldERhdGEgKlREID0gMCk7CisKKy8vLyBGb2xkQnJhbmNoVG9Db21tb25EZXN0IC0gSWYgdGhpcyBiYXNpYyBibG9jayBpcyBPTkxZIGEgc2V0Y2MgYW5kIGEgYnJhbmNoLAorLy8vIGFuZCBpZiBhIHByZWRlY2Vzc29yIGJyYW5jaGVzIHRvIHVzIGFuZCBvbmUgb2Ygb3VyIHN1Y2Nlc3NvcnMsIGZvbGQgdGhlCisvLy8gc2V0Y2MgaW50byB0aGUgcHJlZGVjZXNzb3IgYW5kIHVzZSBsb2dpY2FsIG9wZXJhdGlvbnMgdG8gcGljayB0aGUgcmlnaHQKKy8vLyBkZXN0aW5hdGlvbi4KK2Jvb2wgRm9sZEJyYW5jaFRvQ29tbW9uRGVzdChCcmFuY2hJbnN0ICpCSSk7CisKKy8vLyBEZW1vdGVSZWdUb1N0YWNrIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHZpcnR1YWwgcmVnaXN0ZXIgY29tcHV0ZWQgYnkgYW4KKy8vLyBJbnN0cnVjdGlvbiBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhIHNsb3QgaW4gdGhlIHN0YWNrIGZyYW1lLCBhbGxvY2F0ZWQgdmlhCisvLy8gYWxsb2NhLiAgVGhpcyBhbGxvd3MgdGhlIENGRyB0byBiZSBjaGFuZ2VkIGFyb3VuZCB3aXRob3V0IGZlYXIgb2YKKy8vLyBpbnZhbGlkYXRpbmcgdGhlIFNTQSBpbmZvcm1hdGlvbiBmb3IgdGhlIHZhbHVlLiAgSXQgcmV0dXJucyB0aGUgcG9pbnRlciB0bworLy8vIHRoZSBhbGxvY2EgaW5zZXJ0ZWQgdG8gY3JlYXRlIGEgc3RhY2sgc2xvdCBmb3IgWC4KKy8vLworQWxsb2NhSW5zdCAqRGVtb3RlUmVnVG9TdGFjayhJbnN0cnVjdGlvbiAmWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWb2xhdGlsZUxvYWRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpBbGxvY2FQb2ludCA9IDApOworCisvLy8gRGVtb3RlUEhJVG9TdGFjayAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSB2aXJ0dWFsIHJlZ2lzdGVyIGNvbXB1dGVkIGJ5IGEgcGhpCisvLy8gbm9kZSBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhIHNsb3QgaW4gdGhlIHN0YWNrIGZyYW1lLCBhbGxvY2F0ZWQgdmlhIGFsbG9jYS4KKy8vLyBUaGUgcGhpIG5vZGUgaXMgZGVsZXRlZCBhbmQgaXQgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgYWxsb2NhIGluc2VydGVkLiAKK0FsbG9jYUluc3QgKkRlbW90ZVBISVRvU3RhY2soUEhJTm9kZSAqUCwgSW5zdHJ1Y3Rpb24gKkFsbG9jYVBvaW50ID0gMCk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvUHJvbW90ZU1lbVRvUmVnLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Qcm9tb3RlTWVtVG9SZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWNmYWRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvUHJvbW90ZU1lbVRvUmVnLmgKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tIFByb21vdGVNZW1Ub1JlZy5oIC0gUHJvbW90ZSBBbGxvY2FzIHRvIFNjYWxhcnMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZXhwb3NlcyBhbiBpbnRlcmZhY2UgdG8gcHJvbW90ZSBhbGxvY2EgaW5zdHJ1Y3Rpb25zIHRvIFNTQQorLy8gcmVnaXN0ZXJzLCBieSB1c2luZyB0aGUgU1NBIGNvbnN0cnVjdGlvbiBhbGdvcml0aG0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBUUkFOU0ZPUk1TX1VUSUxTX1BST01PVEVNRU1UT1JFR19ICisjZGVmaW5lIFRSQU5TRk9STVNfVVRJTFNfUFJPTU9URU1FTVRPUkVHX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGxvY2FJbnN0OworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIERvbWluYW5jZUZyb250aWVyOworY2xhc3MgQWxpYXNTZXRUcmFja2VyOworCisvLy8gaXNBbGxvY2FQcm9tb3RhYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBhbGxvY2EgaXMgbGVnYWwgZm9yIHByb21vdGlvbi4KKy8vLyBUaGlzIGlzIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgbG9hZHMgYW5kIHN0b3JlcyB0byB0aGUgYWxsb2NhLi4uCisvLy8KK2Jvb2wgaXNBbGxvY2FQcm9tb3RhYmxlKGNvbnN0IEFsbG9jYUluc3QgKkFJKTsKKworLy8vIFByb21vdGVNZW1Ub1JlZyAtIFByb21vdGUgdGhlIHNwZWNpZmllZCBsaXN0IG9mIGFsbG9jYSBpbnN0cnVjdGlvbnMgaW50bworLy8vIHNjYWxhciByZWdpc3RlcnMsIGluc2VydGluZyBQSEkgbm9kZXMgYXMgYXBwcm9wcmlhdGUuICBUaGlzIGZ1bmN0aW9uIG1ha2VzCisvLy8gdXNlIG9mIERvbWluYW5jZUZyb250aWVyIGluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgdGhlIENGRworLy8vIG9mIHRoZSBmdW5jdGlvbiBhdCBhbGwuICBBbGwgYWxsb2NhcyBtdXN0IGJlIGZyb20gdGhlIHNhbWUgZnVuY3Rpb24uCisvLy8KKy8vLyBJZiBBU1QgaXMgc3BlY2lmaWVkLCB0aGUgc3BlY2lmaWVkIHRyYWNrZXIgaXMgdXBkYXRlZCB0byByZWZsZWN0IGNoYW5nZXMKKy8vLyBtYWRlIHRvIHRoZSBJUi4KKy8vLwordm9pZCBQcm9tb3RlTWVtVG9SZWcoY29uc3Qgc3RkOjp2ZWN0b3I8QWxsb2NhSW5zdCo+ICZBbGxvY2FzLAorICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAmRFQsIERvbWluYW5jZUZyb250aWVyICZERiwKKyAgICAgICAgICAgICAgICAgICAgIEFsaWFzU2V0VHJhY2tlciAqQVNUID0gMCk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU1NBVXBkYXRlci5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU1NBVXBkYXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTg0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TU0FVcGRhdGVyLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8vPT09LS0gU1NBVXBkYXRlci5oIC0gVW5zdHJ1Y3R1cmVkIFNTQSBVcGRhdGUgVG9vbCAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTU0FVcGRhdGVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NTQVVQREFURVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU1NBVVBEQVRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgVmFsdWU7CisgIGNsYXNzIEJhc2ljQmxvY2s7CisgIGNsYXNzIFVzZTsKKyAgY2xhc3MgUEhJTm9kZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTU0FVcGRhdGVyVHJhaXRzOworICBjbGFzcyBCdW1wUHRyQWxsb2NhdG9yOworCisvLy8gU1NBVXBkYXRlciAtIFRoaXMgY2xhc3MgdXBkYXRlcyBTU0EgZm9ybSBmb3IgYSBzZXQgb2YgdmFsdWVzIGRlZmluZWQgaW4KKy8vLyBtdWx0aXBsZSBibG9ja3MuICBUaGlzIGlzIHVzZWQgd2hlbiBjb2RlIGR1cGxpY2F0aW9uIG9yIGFub3RoZXIgdW5zdHJ1Y3R1cmVkCisvLy8gdHJhbnNmb3JtYXRpb24gd2FudHMgdG8gcmV3cml0ZSBhIHNldCBvZiB1c2VzIG9mIG9uZSB2YWx1ZSB3aXRoIHVzZXMgb2YgYQorLy8vIHNldCBvZiB2YWx1ZXMuCitjbGFzcyBTU0FVcGRhdGVyIHsKKyAgZnJpZW5kIGNsYXNzIFNTQVVwZGF0ZXJUcmFpdHM8U1NBVXBkYXRlcj47CisKK3ByaXZhdGU6CisgIC8vLyBBdmFpbGFibGVWYWxzIC0gVGhpcyBrZWVwcyB0cmFjayBvZiB3aGljaCB2YWx1ZSB0byB1c2Ugb24gYSBwZXItYmxvY2sKKyAgLy8vIGJhc2lzLiAgV2hlbiB3ZSBpbnNlcnQgUEhJIG5vZGVzLCB3ZSBrZWVwIHRyYWNrIG9mIHRoZW0gaGVyZS4KKyAgLy90eXBlZGVmIERlbnNlTWFwPEJhc2ljQmxvY2sqLCBWYWx1ZSo+IEF2YWlsYWJsZVZhbHNUeTsKKyAgdm9pZCAqQVY7CisKKyAgLy8vIFByb3RvdHlwZVZhbHVlIGlzIGFuIGFyYml0cmFyeSByZXByZXNlbnRhdGl2ZSB2YWx1ZSwgd2hpY2ggd2UgZGVyaXZlIG5hbWVzCisgIC8vLyBhbmQgYSB0eXBlIGZvciBQSEkgbm9kZXMuCisgIFZhbHVlICpQcm90b3R5cGVWYWx1ZTsKKworICAvLy8gSW5zZXJ0ZWRQSElzIC0gSWYgdGhpcyBpcyBub24tbnVsbCwgdGhlIFNTQVVwZGF0ZXIgYWRkcyBhbGwgUEhJIG5vZGVzIHRoYXQKKyAgLy8vIGl0IGNyZWF0ZXMgdG8gdGhlIHZlY3Rvci4KKyAgU21hbGxWZWN0b3JJbXBsPFBISU5vZGUqPiAqSW5zZXJ0ZWRQSElzOworCitwdWJsaWM6CisgIC8vLyBTU0FVcGRhdGVyIGNvbnN0cnVjdG9yLiAgSWYgSW5zZXJ0ZWRQSElzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSBmaWxsZWQKKyAgLy8vIGluIHdpdGggYWxsIFBISSBOb2RlcyBjcmVhdGVkIGJ5IHJld3JpdGluZy4KKyAgZXhwbGljaXQgU1NBVXBkYXRlcihTbWFsbFZlY3RvckltcGw8UEhJTm9kZSo+ICpJbnNlcnRlZFBISXMgPSAwKTsKKyAgflNTQVVwZGF0ZXIoKTsKKworICAvLy8gSW5pdGlhbGl6ZSAtIFJlc2V0IHRoaXMgb2JqZWN0IHRvIGdldCByZWFkeSBmb3IgYSBuZXcgc2V0IG9mIFNTQQorICAvLy8gdXBkYXRlcy4gIFByb3RvVmFsdWUgaXMgdGhlIHZhbHVlIHVzZWQgdG8gbmFtZSBQSEkgbm9kZXMuCisgIHZvaWQgSW5pdGlhbGl6ZShWYWx1ZSAqUHJvdG9WYWx1ZSk7CisKKyAgLy8vIEFkZEF2YWlsYWJsZVZhbHVlIC0gSW5kaWNhdGUgdGhhdCBhIHJld3JpdHRlbiB2YWx1ZSBpcyBhdmFpbGFibGUgYXQgdGhlCisgIC8vLyBlbmQgb2YgdGhlIHNwZWNpZmllZCBibG9jayB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIHZvaWQgQWRkQXZhaWxhYmxlVmFsdWUoQmFzaWNCbG9jayAqQkIsIFZhbHVlICpWKTsKKworICAvLy8gSGFzVmFsdWVGb3JCbG9jayAtIFJldHVybiB0cnVlIGlmIHRoZSBTU0FVcGRhdGVyIGFscmVhZHkgaGFzIGEgdmFsdWUgZm9yCisgIC8vLyB0aGUgc3BlY2lmaWVkIGJsb2NrLgorICBib29sIEhhc1ZhbHVlRm9yQmxvY2soQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vLyBHZXRWYWx1ZUF0RW5kT2ZCbG9jayAtIENvbnN0cnVjdCBTU0EgZm9ybSwgbWF0ZXJpYWxpemluZyBhIHZhbHVlIHRoYXQgaXMKKyAgLy8vIGxpdmUgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLgorICBWYWx1ZSAqR2V0VmFsdWVBdEVuZE9mQmxvY2soQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBHZXRWYWx1ZUluTWlkZGxlT2ZCbG9jayAtIENvbnN0cnVjdCBTU0EgZm9ybSwgbWF0ZXJpYWxpemluZyBhIHZhbHVlIHRoYXQKKyAgLy8vIGlzIGxpdmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLgorICAvLy8KKyAgLy8vIEdldFZhbHVlSW5NaWRkbGVPZkJsb2NrIGlzIHRoZSBzYW1lIGFzIEdldFZhbHVlQXRFbmRPZkJsb2NrIGV4Y2VwdCBpbiBvbmUKKyAgLy8vIGltcG9ydGFudCBjYXNlOiBpZiB0aGVyZSBpcyBhIGRlZmluaXRpb24gb2YgdGhlIHJld3JpdHRlbiB2YWx1ZSBhZnRlciB0aGUKKyAgLy8vICd1c2UnIGluIEJCLiAgQ29uc2lkZXIgY29kZSBsaWtlIHRoaXM6CisgIC8vLworICAvLy8gICAgICBYMSA9IC4uLgorICAvLy8gICBTb21lQkI6CisgIC8vLyAgICAgIHVzZShYKQorICAvLy8gICAgICBYMiA9IC4uLgorICAvLy8gICAgICBiciBDb25kLCBTb21lQkIsIE91dEJCCisgIC8vLworICAvLy8gSW4gdGhpcyBjYXNlLCB0aGVyZSBhcmUgdHdvIHZhbHVlcyAoWDEgYW5kIFgyKSBhZGRlZCB0byB0aGUgQXZhaWxhYmxlVmFscworICAvLy8gc2V0IGJ5IHRoZSBjbGllbnQgb2YgdGhlIHJld3JpdGVyLCBhbmQgdGhvc2UgdmFsdWVzIGFyZSBib3RoIGxpdmUgb3V0IG9mCisgIC8vLyB0aGVpciByZXNwZWN0aXZlIGJsb2Nrcy4gIEhvd2V2ZXIsIHRoZSB1c2Ugb2YgWCBoYXBwZW5zIGluIHRoZSAqbWlkZGxlKiBvZgorICAvLy8gYSBibG9jay4gIEJlY2F1c2Ugb2YgdGhpcywgd2UgbmVlZCB0byBpbnNlcnQgYSBuZXcgUEhJIG5vZGUgaW4gU29tZUJCIHRvCisgIC8vLyBtZXJnZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLCBhbmQgdGhpcyB2YWx1ZSBpc24ndCBsaXZlIG91dCBvZiB0aGUgYmxvY2suCisgIC8vLworICBWYWx1ZSAqR2V0VmFsdWVJbk1pZGRsZU9mQmxvY2soQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBSZXdyaXRlVXNlIC0gUmV3cml0ZSBhIHVzZSBvZiB0aGUgc3ltYm9saWMgdmFsdWUuICBUaGlzIGhhbmRsZXMgUEhJIG5vZGVzLAorICAvLy8gd2hpY2ggdXNlIHRoZWlyIHZhbHVlIGluIHRoZSBjb3JyZXNwb25kaW5nIHByZWRlY2Vzc29yLiAgTm90ZSB0aGF0IHRoaXMKKyAgLy8vIHdpbGwgbm90IHdvcmsgaWYgdGhlIHVzZSBpcyBzdXBwb3NlZCB0byBiZSByZXdyaXR0ZW4gdG8gYSB2YWx1ZSBkZWZpbmVkIGluCisgIC8vLyB0aGUgc2FtZSBibG9jayBhcyB0aGUgdXNlLCBidXQgYWJvdmUgaXQuICBBbnkgJ0FkZEF2YWlsYWJsZVZhbHVlJ3MgYWRkZWQKKyAgLy8vIGZvciB0aGUgdXNlJ3MgYmxvY2sgd2lsbCBiZSBjb25zaWRlcmVkIHRvIGJlIGJlbG93IGl0LgorICB2b2lkIFJld3JpdGVVc2UoVXNlICZVKTsKKworcHJpdmF0ZToKKyAgVmFsdWUgKkdldFZhbHVlQXRFbmRPZkJsb2NrSW50ZXJuYWwoQmFzaWNCbG9jayAqQkIpOworCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNTQVVwZGF0ZXImKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICBTU0FVcGRhdGVyKGNvbnN0IFNTQVVwZGF0ZXImKTsgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU1NBVXBkYXRlckltcGwuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXJJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwM2QyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXJJbXBsLmgKQEAgLTAsMCArMSw0NjkgQEAKKy8vPT09LS0gU1NBVXBkYXRlckltcGwuaCAtIFNTQSBVcGRhdGVyIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgdGVtcGxhdGUgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb3JlIGFsZ29yaXRobSBmb3IgdGhlCisvLyBTU0FVcGRhdGVyIGFuZCBNYWNoaW5lU1NBVXBkYXRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19TU0FVUERBVEVSSU1QTF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19TU0FVUERBVEVSSU1QTF9ICisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU1NBVXBkYXRlclRyYWl0czsKKwordGVtcGxhdGU8dHlwZW5hbWUgVXBkYXRlclQ+CitjbGFzcyBTU0FVcGRhdGVySW1wbCB7Citwcml2YXRlOgorICBVcGRhdGVyVCAqVXBkYXRlcjsKKworICB0eXBlZGVmIFNTQVVwZGF0ZXJUcmFpdHM8VXBkYXRlclQ+IFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkJsa1QgQmxrVDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlZhbFQgVmFsVDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlBoaVQgUGhpVDsKKworICAvLy8gQkJJbmZvIC0gUGVyLWJhc2ljIGJsb2NrIGluZm9ybWF0aW9uIHVzZWQgaW50ZXJuYWxseSBieSBTU0FVcGRhdGVySW1wbC4KKyAgLy8vIFRoZSBwcmVkZWNlc3NvcnMgb2YgZWFjaCBibG9jayBhcmUgY2FjaGVkIGhlcmUgc2luY2UgcHJlZF9pdGVyYXRvciBpcworICAvLy8gc2xvdyBhbmQgd2UgbmVlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGJsb2NrcyBhdCBsZWFzdCBhIGZldyB0aW1lcy4KKyAgY2xhc3MgQkJJbmZvIHsKKyAgcHVibGljOgorICAgIEJsa1QgKkJCOyAgICAgICAgICAvLyBCYWNrLXBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2suCisgICAgVmFsVCBBdmFpbGFibGVWYWw7IC8vIFZhbHVlIHRvIHVzZSBpbiB0aGlzIGJsb2NrLgorICAgIEJCSW5mbyAqRGVmQkI7ICAgICAvLyBCbG9jayB0aGF0IGRlZmluZXMgdGhlIGF2YWlsYWJsZSB2YWx1ZS4KKyAgICBpbnQgQmxrTnVtOyAgICAgICAgLy8gUG9zdG9yZGVyIG51bWJlci4KKyAgICBCQkluZm8gKklEb207ICAgICAgLy8gSW1tZWRpYXRlIGRvbWluYXRvci4KKyAgICB1bnNpZ25lZCBOdW1QcmVkczsgLy8gTnVtYmVyIG9mIHByZWRlY2Vzc29yIGJsb2Nrcy4KKyAgICBCQkluZm8gKipQcmVkczsgICAgLy8gQXJyYXlbTnVtUHJlZHNdIG9mIHByZWRlY2Vzc29yIGJsb2Nrcy4KKyAgICBQaGlUICpQSElUYWc7ICAgICAgLy8gTWFya2VyIGZvciBleGlzdGluZyBQSElzIHRoYXQgbWF0Y2guCisKKyAgICBCQkluZm8oQmxrVCAqVGhpc0JCLCBWYWxUIFYpCisgICAgICA6IEJCKFRoaXNCQiksIEF2YWlsYWJsZVZhbChWKSwgRGVmQkIoViA/IHRoaXMgOiAwKSwgQmxrTnVtKDApLCBJRG9tKDApLAorICAgICAgTnVtUHJlZHMoMCksIFByZWRzKDApLCBQSElUYWcoMCkgeyB9CisgIH07CisKKyAgdHlwZWRlZiBEZW5zZU1hcDxCbGtUKiwgVmFsVD4gQXZhaWxhYmxlVmFsc1R5OworICBBdmFpbGFibGVWYWxzVHkgKkF2YWlsYWJsZVZhbHM7CisKKyAgU21hbGxWZWN0b3JJbXBsPFBoaVQqPiAqSW5zZXJ0ZWRQSElzOworCisgIHR5cGVkZWYgU21hbGxWZWN0b3JJbXBsPEJCSW5mbyo+IEJsb2NrTGlzdFR5OworICB0eXBlZGVmIERlbnNlTWFwPEJsa1QqLCBCQkluZm8qPiBCQk1hcFR5OworICBCQk1hcFR5IEJCTWFwOworICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKKworcHVibGljOgorICBleHBsaWNpdCBTU0FVcGRhdGVySW1wbChVcGRhdGVyVCAqVSwgQXZhaWxhYmxlVmFsc1R5ICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UGhpVCo+ICpJbnMpIDoKKyAgICBVcGRhdGVyKFUpLCBBdmFpbGFibGVWYWxzKEEpLCBJbnNlcnRlZFBISXMoSW5zKSB7IH0KKworICAvLy8gR2V0VmFsdWUgLSBDaGVjayB0byBzZWUgaWYgQXZhaWxhYmxlVmFscyBoYXMgYW4gZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIEJCIGFuZCBpZiBzbywgcmV0dXJuIGl0LiAgSWYgbm90LCBjb25zdHJ1Y3QgU1NBIGZvcm0gYnkgZmlyc3QKKyAgLy8vIGNhbGN1bGF0aW5nIHRoZSByZXF1aXJlZCBwbGFjZW1lbnQgb2YgUEhJcyBhbmQgdGhlbiBpbnNlcnRpbmcgbmV3IFBISXMKKyAgLy8vIHdoZXJlIG5lZWRlZC4KKyAgVmFsVCBHZXRWYWx1ZShCbGtUICpCQikgeworICAgIFNtYWxsVmVjdG9yPEJCSW5mbyosIDEwMD4gQmxvY2tMaXN0OworICAgIEJCSW5mbyAqUHNldWRvRW50cnkgPSBCdWlsZEJsb2NrTGlzdChCQiwgJkJsb2NrTGlzdCk7CisKKyAgICAvLyBTcGVjaWFsIGNhc2U6IGJhaWwgb3V0IGlmIEJCIGlzIHVucmVhY2hhYmxlLgorICAgIGlmIChCbG9ja0xpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgIFZhbFQgViA9IFRyYWl0czo6R2V0VW5kZWZWYWwoQkIsIFVwZGF0ZXIpOworICAgICAgKCpBdmFpbGFibGVWYWxzKVtCQl0gPSBWOworICAgICAgcmV0dXJuIFY7CisgICAgfQorCisgICAgRmluZERvbWluYXRvcnMoJkJsb2NrTGlzdCwgUHNldWRvRW50cnkpOworICAgIEZpbmRQSElQbGFjZW1lbnQoJkJsb2NrTGlzdCk7CisgICAgRmluZEF2YWlsYWJsZVZhbHMoJkJsb2NrTGlzdCk7CisKKyAgICByZXR1cm4gQkJNYXBbQkJdLT5EZWZCQi0+QXZhaWxhYmxlVmFsOworICB9CisKKyAgLy8vIEJ1aWxkQmxvY2tMaXN0IC0gU3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLCB0cmF2ZXJzZSBiYWNrCisgIC8vLyB0aHJvdWdoIGl0cyBwcmVkZWNlc3NvcnMgdW50aWwgcmVhY2hpbmcgYmxvY2tzIHdpdGgga25vd24gdmFsdWVzLgorICAvLy8gQ3JlYXRlIEJCSW5mbyBzdHJ1Y3R1cmVzIGZvciB0aGUgYmxvY2tzIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgYmxvY2sKKyAgLy8vIGxpc3QuCisgIEJCSW5mbyAqQnVpbGRCbG9ja0xpc3QoQmxrVCAqQkIsIEJsb2NrTGlzdFR5ICpCbG9ja0xpc3QpIHsKKyAgICBTbWFsbFZlY3RvcjxCQkluZm8qLCAxMD4gUm9vdExpc3Q7CisgICAgU21hbGxWZWN0b3I8QkJJbmZvKiwgNjQ+IFdvcmtMaXN0OworCisgICAgQkJJbmZvICpJbmZvID0gbmV3IChBbGxvY2F0b3IpIEJCSW5mbyhCQiwgMCk7CisgICAgQkJNYXBbQkJdID0gSW5mbzsKKyAgICBXb3JrTGlzdC5wdXNoX2JhY2soSW5mbyk7CisKKyAgICAvLyBTZWFyY2ggYmFja3dhcmQgZnJvbSBCQiwgY3JlYXRpbmcgQkJJbmZvcyBhbG9uZyB0aGUgd2F5IGFuZCBzdG9wcGluZworICAgIC8vIHdoZW4gcmVhY2hpbmcgYmxvY2tzIHRoYXQgZGVmaW5lIHRoZSB2YWx1ZS4gIFJlY29yZCB0aG9zZSBkZWZpbmluZworICAgIC8vIGJsb2NrcyBvbiB0aGUgUm9vdExpc3QuCisgICAgU21hbGxWZWN0b3I8QmxrVCosIDEwPiBQcmVkczsKKyAgICB3aGlsZSAoIVdvcmtMaXN0LmVtcHR5KCkpIHsKKyAgICAgIEluZm8gPSBXb3JrTGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgIFByZWRzLmNsZWFyKCk7CisgICAgICBUcmFpdHM6OkZpbmRQcmVkZWNlc3NvckJsb2NrcyhJbmZvLT5CQiwgJlByZWRzKTsKKyAgICAgIEluZm8tPk51bVByZWRzID0gUHJlZHMuc2l6ZSgpOworICAgICAgaWYgKEluZm8tPk51bVByZWRzID09IDApCisgICAgICAgIEluZm8tPlByZWRzID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgSW5mby0+UHJlZHMgPSBzdGF0aWNfY2FzdDxCQkluZm8qKj4KKyAgICAgICAgICAoQWxsb2NhdG9yLkFsbG9jYXRlKEluZm8tPk51bVByZWRzICogc2l6ZW9mKEJCSW5mbyopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25PZjxCQkluZm8qPjo6QWxpZ25tZW50KSk7CisKKyAgICAgIGZvciAodW5zaWduZWQgcCA9IDA7IHAgIT0gSW5mby0+TnVtUHJlZHM7ICsrcCkgeworICAgICAgICBCbGtUICpQcmVkID0gUHJlZHNbcF07CisgICAgICAgIC8vIENoZWNrIGlmIEJCTWFwIGFscmVhZHkgaGFzIGEgQkJJbmZvIGZvciB0aGUgcHJlZGVjZXNzb3IgYmxvY2suCisgICAgICAgIHR5cGVuYW1lIEJCTWFwVHk6OnZhbHVlX3R5cGUgJkJCTWFwQnVja2V0ID0KKyAgICAgICAgICBCQk1hcC5GaW5kQW5kQ29uc3RydWN0KFByZWQpOworICAgICAgICBpZiAoQkJNYXBCdWNrZXQuc2Vjb25kKSB7CisgICAgICAgICAgSW5mby0+UHJlZHNbcF0gPSBCQk1hcEJ1Y2tldC5zZWNvbmQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgQkJJbmZvIGZvciB0aGUgcHJlZGVjZXNzb3IuCisgICAgICAgIFZhbFQgUHJlZFZhbCA9IEF2YWlsYWJsZVZhbHMtPmxvb2t1cChQcmVkKTsKKyAgICAgICAgQkJJbmZvICpQcmVkSW5mbyA9IG5ldyAoQWxsb2NhdG9yKSBCQkluZm8oUHJlZCwgUHJlZFZhbCk7CisgICAgICAgIEJCTWFwQnVja2V0LnNlY29uZCA9IFByZWRJbmZvOworICAgICAgICBJbmZvLT5QcmVkc1twXSA9IFByZWRJbmZvOworCisgICAgICAgIGlmIChQcmVkSW5mby0+QXZhaWxhYmxlVmFsKSB7CisgICAgICAgICAgUm9vdExpc3QucHVzaF9iYWNrKFByZWRJbmZvKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soUHJlZEluZm8pOworICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdyB0aGF0IHdlIGtub3cgd2hhdCBibG9ja3MgYXJlIGJhY2t3YXJkcy1yZWFjaGFibGUgZnJvbSB0aGUgc3RhcnRpbmcKKyAgICAvLyBibG9jaywgZG8gYSBmb3J3YXJkIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCB0byBhc3NpZ24gcG9zdG9yZGVyIG51bWJlcnMKKyAgICAvLyB0byB0aG9zZSBibG9ja3MuCisgICAgQkJJbmZvICpQc2V1ZG9FbnRyeSA9IG5ldyAoQWxsb2NhdG9yKSBCQkluZm8oMCwgMCk7CisgICAgdW5zaWduZWQgQmxrTnVtID0gMTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHdvcmtsaXN0IHdpdGggdGhlIHJvb3RzIGZyb20gdGhlIGJhY2t3YXJkIHRyYXZlcnNhbC4KKyAgICB3aGlsZSAoIVJvb3RMaXN0LmVtcHR5KCkpIHsKKyAgICAgIEluZm8gPSBSb290TGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgIEluZm8tPklEb20gPSBQc2V1ZG9FbnRyeTsKKyAgICAgIEluZm8tPkJsa051bSA9IC0xOworICAgICAgV29ya0xpc3QucHVzaF9iYWNrKEluZm8pOworICAgIH0KKworICAgIHdoaWxlICghV29ya0xpc3QuZW1wdHkoKSkgeworICAgICAgSW5mbyA9IFdvcmtMaXN0LmJhY2soKTsKKworICAgICAgaWYgKEluZm8tPkJsa051bSA9PSAtMikgeworICAgICAgICAvLyBBbGwgdGhlIHN1Y2Nlc3NvcnMgaGF2ZSBiZWVuIGhhbmRsZWQ7IGFzc2lnbiB0aGUgcG9zdG9yZGVyIG51bWJlci4KKyAgICAgICAgSW5mby0+QmxrTnVtID0gQmxrTnVtKys7CisgICAgICAgIC8vIElmIG5vdCBhIHJvb3QsIHB1dCBpdCBvbiB0aGUgQmxvY2tMaXN0LgorICAgICAgICBpZiAoIUluZm8tPkF2YWlsYWJsZVZhbCkKKyAgICAgICAgICBCbG9ja0xpc3QtPnB1c2hfYmFjayhJbmZvKTsKKyAgICAgICAgV29ya0xpc3QucG9wX2JhY2soKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIExlYXZlIHRoaXMgZW50cnkgb24gdGhlIHdvcmtsaXN0LCBidXQgc2V0IGl0cyBCbGtOdW0gdG8gbWFyayB0aGF0IGl0cworICAgICAgLy8gc3VjY2Vzc29ycyBoYXZlIGJlZW4gcHV0IG9uIHRoZSB3b3JrbGlzdC4gIFdoZW4gaXQgcmV0dXJucyB0byB0aGUgdG9wCisgICAgICAvLyB0aGUgbGlzdCwgYWZ0ZXIgaGFuZGxpbmcgaXRzIHN1Y2Nlc3NvcnMsIGl0IHdpbGwgYmUgYXNzaWduZWQgYQorICAgICAgLy8gbnVtYmVyLgorICAgICAgSW5mby0+QmxrTnVtID0gLTI7CisKKyAgICAgIC8vIEFkZCB1bnZpc2l0ZWQgc3VjY2Vzc29ycyB0byB0aGUgd29yayBsaXN0LgorICAgICAgZm9yICh0eXBlbmFtZSBUcmFpdHM6OkJsa1N1Y2NfaXRlcmF0b3IgU0kgPQorICAgICAgICAgICAgIFRyYWl0czo6QmxrU3VjY19iZWdpbihJbmZvLT5CQiksCisgICAgICAgICAgICAgRSA9IFRyYWl0czo6QmxrU3VjY19lbmQoSW5mby0+QkIpOyBTSSAhPSBFOyArK1NJKSB7CisgICAgICAgIEJCSW5mbyAqU3VjY0luZm8gPSBCQk1hcFsqU0ldOworICAgICAgICBpZiAoIVN1Y2NJbmZvIHx8IFN1Y2NJbmZvLT5CbGtOdW0pCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIFN1Y2NJbmZvLT5CbGtOdW0gPSAtMTsKKyAgICAgICAgV29ya0xpc3QucHVzaF9iYWNrKFN1Y2NJbmZvKTsKKyAgICAgIH0KKyAgICB9CisgICAgUHNldWRvRW50cnktPkJsa051bSA9IEJsa051bTsKKyAgICByZXR1cm4gUHNldWRvRW50cnk7CisgIH0KKworICAvLy8gSW50ZXJzZWN0RG9taW5hdG9ycyAtIFRoaXMgaXMgdGhlIGRhdGFmbG93IGxhdHRpY2UgIm1lZXQiIG9wZXJhdGlvbiBmb3IKKyAgLy8vIGZpbmRpbmcgZG9taW5hdG9ycy4gIEdpdmVuIHR3byBiYXNpYyBibG9ja3MsIGl0IHdhbGtzIHVwIHRoZSBkb21pbmF0b3IKKyAgLy8vIHRyZWUgdW50aWwgaXQgZmluZHMgYSBjb21tb24gZG9taW5hdG9yIG9mIGJvdGguICBJdCB1c2VzIHRoZSBwb3N0b3JkZXIKKyAgLy8vIG51bWJlciBvZiB0aGUgYmxvY2tzIHRvIGRldGVybWluZSBob3cgdG8gZG8gdGhhdC4KKyAgQkJJbmZvICpJbnRlcnNlY3REb21pbmF0b3JzKEJCSW5mbyAqQmxrMSwgQkJJbmZvICpCbGsyKSB7CisgICAgd2hpbGUgKEJsazEgIT0gQmxrMikgeworICAgICAgd2hpbGUgKEJsazEtPkJsa051bSA8IEJsazItPkJsa051bSkgeworICAgICAgICBCbGsxID0gQmxrMS0+SURvbTsKKyAgICAgICAgaWYgKCFCbGsxKQorICAgICAgICAgIHJldHVybiBCbGsyOworICAgICAgfQorICAgICAgd2hpbGUgKEJsazItPkJsa051bSA8IEJsazEtPkJsa051bSkgeworICAgICAgICBCbGsyID0gQmxrMi0+SURvbTsKKyAgICAgICAgaWYgKCFCbGsyKQorICAgICAgICAgIHJldHVybiBCbGsxOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQmxrMTsKKyAgfQorCisgIC8vLyBGaW5kRG9taW5hdG9ycyAtIENhbGN1bGF0ZSB0aGUgZG9taW5hdG9yIHRyZWUgZm9yIHRoZSBzdWJzZXQgb2YgdGhlIENGRworICAvLy8gY29ycmVzcG9uZGluZyB0byB0aGUgYmFzaWMgYmxvY2tzIG9uIHRoZSBCbG9ja0xpc3QuICBUaGlzIHVzZXMgdGhlCisgIC8vLyBhbGdvcml0aG0gZnJvbTogIkEgU2ltcGxlLCBGYXN0IERvbWluYW5jZSBBbGdvcml0aG0iIGJ5IENvb3BlciwgSGFydmV5CisgIC8vLyBhbmQgS2VubmVkeSwgcHVibGlzaGVkIGluIFNvZnR3YXJlLS1QcmFjdGljZSBhbmQgRXhwZXJpZW5jZSwgMjAwMSwKKyAgLy8vIDQ6MS0xMC4gIEJlY2F1c2UgdGhlIENGRyBzdWJzZXQgZG9lcyBub3QgaW5jbHVkZSBhbnkgZWRnZXMgbGVhZGluZyBpbnRvCisgIC8vLyBibG9ja3MgdGhhdCBkZWZpbmUgdGhlIHZhbHVlLCB0aGUgcmVzdWx0cyBhcmUgbm90IHRoZSB1c3VhbCBkb21pbmF0b3IKKyAgLy8vIHRyZWUuICBUaGUgQ0ZHIHN1YnNldCBoYXMgYSBzaW5nbGUgcHNldWRvLWVudHJ5IG5vZGUgd2l0aCBlZGdlcyB0byBhIHNldAorICAvLy8gb2Ygcm9vdCBub2RlcyBmb3IgYmxvY2tzIHRoYXQgZGVmaW5lIHRoZSB2YWx1ZS4gIFRoZSBkb21pbmF0b3JzIGZvciB0aGlzCisgIC8vLyBzdWJzZXQgQ0ZHIGFyZSBub3QgdGhlIHN0YW5kYXJkIGRvbWluYXRvcnMgYnV0IHRoZXkgYXJlIGFkZXF1YXRlIGZvcgorICAvLy8gcGxhY2luZyBQSElzIHdpdGhpbiB0aGUgc3Vic2V0IENGRy4KKyAgdm9pZCBGaW5kRG9taW5hdG9ycyhCbG9ja0xpc3RUeSAqQmxvY2tMaXN0LCBCQkluZm8gKlBzZXVkb0VudHJ5KSB7CisgICAgYm9vbCBDaGFuZ2VkOworICAgIGRvIHsKKyAgICAgIENoYW5nZWQgPSBmYWxzZTsKKyAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBpbiByZXZlcnNlIG9yZGVyLCBpLmUuLCBmb3J3YXJkIG9uIENGRyBlZGdlcy4KKyAgICAgIGZvciAodHlwZW5hbWUgQmxvY2tMaXN0VHk6OnJldmVyc2VfaXRlcmF0b3IgSSA9IEJsb2NrTGlzdC0+cmJlZ2luKCksCisgICAgICAgICAgICAgRSA9IEJsb2NrTGlzdC0+cmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBCQkluZm8gKkluZm8gPSAqSTsKKyAgICAgICAgQkJJbmZvICpOZXdJRG9tID0gMDsKKworICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGJsb2NrJ3MgcHJlZGVjZXNzb3JzLgorICAgICAgICBmb3IgKHVuc2lnbmVkIHAgPSAwOyBwICE9IEluZm8tPk51bVByZWRzOyArK3ApIHsKKyAgICAgICAgICBCQkluZm8gKlByZWQgPSBJbmZvLT5QcmVkc1twXTsKKworICAgICAgICAgIC8vIFRyZWF0IGFuIHVucmVhY2hhYmxlIHByZWRlY2Vzc29yIGFzIGEgZGVmaW5pdGlvbiB3aXRoICd1bmRlZicuCisgICAgICAgICAgaWYgKFByZWQtPkJsa051bSA9PSAwKSB7CisgICAgICAgICAgICBQcmVkLT5BdmFpbGFibGVWYWwgPSBUcmFpdHM6OkdldFVuZGVmVmFsKFByZWQtPkJCLCBVcGRhdGVyKTsKKyAgICAgICAgICAgICgqQXZhaWxhYmxlVmFscylbUHJlZC0+QkJdID0gUHJlZC0+QXZhaWxhYmxlVmFsOworICAgICAgICAgICAgUHJlZC0+RGVmQkIgPSBQcmVkOworICAgICAgICAgICAgUHJlZC0+QmxrTnVtID0gUHNldWRvRW50cnktPkJsa051bTsKKyAgICAgICAgICAgIFBzZXVkb0VudHJ5LT5CbGtOdW0rKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIU5ld0lEb20pCisgICAgICAgICAgICBOZXdJRG9tID0gUHJlZDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBOZXdJRG9tID0gSW50ZXJzZWN0RG9taW5hdG9ycyhOZXdJRG9tLCBQcmVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBJRG9tIHZhbHVlIGhhcyBjaGFuZ2VkLgorICAgICAgICBpZiAoTmV3SURvbSAmJiBOZXdJRG9tICE9IEluZm8tPklEb20pIHsKKyAgICAgICAgICBJbmZvLT5JRG9tID0gTmV3SURvbTsKKyAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKENoYW5nZWQpOworICB9CisKKyAgLy8vIElzRGVmSW5Eb21Gcm9udGllciAtIFNlYXJjaCB1cCB0aGUgZG9taW5hdG9yIHRyZWUgZnJvbSBQcmVkIHRvIElEb20gZm9yCisgIC8vLyBhbnkgYmxvY2tzIGNvbnRhaW5pbmcgZGVmaW5pdGlvbnMgb2YgdGhlIHZhbHVlLiAgSWYgb25lIGlzIGZvdW5kLCB0aGVuCisgIC8vLyB0aGUgc3VjY2Vzc29yIG9mIFByZWQgaXMgaW4gdGhlIGRvbWluYW5jZSBmcm9udGllciBmb3IgdGhlIGRlZmluaXRpb24sCisgIC8vLyBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUuCisgIGJvb2wgSXNEZWZJbkRvbUZyb250aWVyKGNvbnN0IEJCSW5mbyAqUHJlZCwgY29uc3QgQkJJbmZvICpJRG9tKSB7CisgICAgZm9yICg7IFByZWQgIT0gSURvbTsgUHJlZCA9IFByZWQtPklEb20pIHsKKyAgICAgIGlmIChQcmVkLT5EZWZCQiA9PSBQcmVkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEZpbmRQSElQbGFjZW1lbnQgLSBQSElzIGFyZSBuZWVkZWQgaW4gdGhlIGl0ZXJhdGVkIGRvbWluYW5jZSBmcm9udGllcnMKKyAgLy8vIG9mIHRoZSBrbm93biBkZWZpbml0aW9ucy4gIEl0ZXJhdGl2ZWx5IGFkZCBQSElzIGluIHRoZSBkb20gZnJvbnRpZXJzCisgIC8vLyB1bnRpbCBub3RoaW5nIGNoYW5nZXMuICBBbG9uZyB0aGUgd2F5LCBrZWVwIHRyYWNrIG9mIHRoZSBuZWFyZXN0CisgIC8vLyBkb21pbmF0aW5nIGRlZmluaXRpb25zIGZvciBub24tUEhJIGJsb2Nrcy4KKyAgdm9pZCBGaW5kUEhJUGxhY2VtZW50KEJsb2NrTGlzdFR5ICpCbG9ja0xpc3QpIHsKKyAgICBib29sIENoYW5nZWQ7CisgICAgZG8geworICAgICAgQ2hhbmdlZCA9IGZhbHNlOworICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBsaXN0IGluIHJldmVyc2Ugb3JkZXIsIGkuZS4sIGZvcndhcmQgb24gQ0ZHIGVkZ2VzLgorICAgICAgZm9yICh0eXBlbmFtZSBCbG9ja0xpc3RUeTo6cmV2ZXJzZV9pdGVyYXRvciBJID0gQmxvY2tMaXN0LT5yYmVnaW4oKSwKKyAgICAgICAgICAgICBFID0gQmxvY2tMaXN0LT5yZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIEJCSW5mbyAqSW5mbyA9ICpJOworCisgICAgICAgIC8vIElmIHRoaXMgYmxvY2sgYWxyZWFkeSBuZWVkcyBhIFBISSwgdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlLgorICAgICAgICBpZiAoSW5mby0+RGVmQkIgPT0gSW5mbykKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBEZWZhdWx0IHRvIHVzZSB0aGUgc2FtZSBkZWYgYXMgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3IuCisgICAgICAgIEJCSW5mbyAqTmV3RGVmQkIgPSBJbmZvLT5JRG9tLT5EZWZCQjsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBwID0gMDsgcCAhPSBJbmZvLT5OdW1QcmVkczsgKytwKSB7CisgICAgICAgICAgaWYgKElzRGVmSW5Eb21Gcm9udGllcihJbmZvLT5QcmVkc1twXSwgSW5mby0+SURvbSkpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgYSBQSEkgaGVyZS4KKyAgICAgICAgICAgIE5ld0RlZkJCID0gSW5mbzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIGFueXRoaW5nIGNoYW5nZWQuCisgICAgICAgIGlmIChOZXdEZWZCQiAhPSBJbmZvLT5EZWZCQikgeworICAgICAgICAgIEluZm8tPkRlZkJCID0gTmV3RGVmQkI7CisgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlIChDaGFuZ2VkKTsKKyAgfQorCisgIC8vLyBGaW5kQXZhaWxhYmxlVmFsIC0gSWYgdGhpcyBibG9jayByZXF1aXJlcyBhIFBISSwgZmlyc3QgY2hlY2sgaWYgYW4KKyAgLy8vIGV4aXN0aW5nIFBISSBtYXRjaGVzIHRoZSBQSEkgcGxhY2VtZW50IGFuZCByZWFjaGluZyBkZWZpbml0aW9ucyBjb21wdXRlZAorICAvLy8gZWFybGllciwgYW5kIGlmIG5vdCwgY3JlYXRlIGEgbmV3IFBISS4gIFZpc2l0IGFsbCB0aGUgYmxvY2sncworICAvLy8gcHJlZGVjZXNzb3JzIHRvIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIHZhbHVlIGZvciBlYWNoIG9uZSBhbmQgZmlsbCBpbgorICAvLy8gdGhlIGluY29taW5nIHZhbHVlcyBmb3IgYSBuZXcgUEhJLgorICB2b2lkIEZpbmRBdmFpbGFibGVWYWxzKEJsb2NrTGlzdFR5ICpCbG9ja0xpc3QpIHsKKyAgICAvLyBHbyB0aHJvdWdoIHRoZSB3b3JrbGlzdCBpbiBmb3J3YXJkIG9yZGVyIChpLmUuLCBiYWNrd2FyZCB0aHJvdWdoIHRoZSBDRkcpCisgICAgLy8gYW5kIGNoZWNrIGlmIGV4aXN0aW5nIFBISXMgY2FuIGJlIHVzZWQuICBJZiBub3QsIGNyZWF0ZSBlbXB0eSBQSElzIHdoZXJlCisgICAgLy8gdGhleSBhcmUgbmVlZGVkLgorICAgIGZvciAodHlwZW5hbWUgQmxvY2tMaXN0VHk6Oml0ZXJhdG9yIEkgPSBCbG9ja0xpc3QtPmJlZ2luKCksCisgICAgICAgICAgIEUgPSBCbG9ja0xpc3QtPmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgQkJJbmZvICpJbmZvID0gKkk7CisgICAgICAvLyBDaGVjayBpZiB0aGVyZSBuZWVkcyB0byBiZSBhIFBISSBpbiBCQi4KKyAgICAgIGlmIChJbmZvLT5EZWZCQiAhPSBJbmZvKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gTG9vayBmb3IgYW4gZXhpc3RpbmcgUEhJLgorICAgICAgRmluZEV4aXN0aW5nUEhJKEluZm8tPkJCLCBCbG9ja0xpc3QpOworICAgICAgaWYgKEluZm8tPkF2YWlsYWJsZVZhbCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIFZhbFQgUEhJID0gVHJhaXRzOjpDcmVhdGVFbXB0eVBISShJbmZvLT5CQiwgSW5mby0+TnVtUHJlZHMsIFVwZGF0ZXIpOworICAgICAgSW5mby0+QXZhaWxhYmxlVmFsID0gUEhJOworICAgICAgKCpBdmFpbGFibGVWYWxzKVtJbmZvLT5CQl0gPSBQSEk7CisgICAgfQorCisgICAgLy8gTm93IGdvIGJhY2sgdGhyb3VnaCB0aGUgd29ya2xpc3QgaW4gcmV2ZXJzZSBvcmRlciB0byBmaWxsIGluIHRoZQorICAgIC8vIGFyZ3VtZW50cyBmb3IgYW55IG5ldyBQSElzIGFkZGVkIGluIHRoZSBmb3J3YXJkIHRyYXZlcnNhbC4KKyAgICBmb3IgKHR5cGVuYW1lIEJsb2NrTGlzdFR5OjpyZXZlcnNlX2l0ZXJhdG9yIEkgPSBCbG9ja0xpc3QtPnJiZWdpbigpLAorICAgICAgICAgICBFID0gQmxvY2tMaXN0LT5yZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBCQkluZm8gKkluZm8gPSAqSTsKKworICAgICAgaWYgKEluZm8tPkRlZkJCICE9IEluZm8pIHsKKyAgICAgICAgLy8gUmVjb3JkIHRoZSBhdmFpbGFibGUgdmFsdWUgYXQgam9pbiBub2RlcyB0byBzcGVlZCB1cCBzdWJzZXF1ZW50CisgICAgICAgIC8vIHVzZXMgb2YgdGhpcyBTU0FVcGRhdGVyIGZvciB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgICAgaWYgKEluZm8tPk51bVByZWRzID4gMSkKKyAgICAgICAgICAoKkF2YWlsYWJsZVZhbHMpW0luZm8tPkJCXSA9IEluZm8tPkRlZkJCLT5BdmFpbGFibGVWYWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBDaGVjayBpZiB0aGlzIGJsb2NrIGNvbnRhaW5zIGEgbmV3bHkgYWRkZWQgUEhJLgorICAgICAgUGhpVCAqUEhJID0gVHJhaXRzOjpWYWx1ZUlzTmV3UEhJKEluZm8tPkF2YWlsYWJsZVZhbCwgVXBkYXRlcik7CisgICAgICBpZiAoIVBISSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYmxvY2sncyBwcmVkZWNlc3NvcnMuCisgICAgICBmb3IgKHVuc2lnbmVkIHAgPSAwOyBwICE9IEluZm8tPk51bVByZWRzOyArK3ApIHsKKyAgICAgICAgQkJJbmZvICpQcmVkSW5mbyA9IEluZm8tPlByZWRzW3BdOworICAgICAgICBCbGtUICpQcmVkID0gUHJlZEluZm8tPkJCOworICAgICAgICAvLyBTa2lwIHRvIHRoZSBuZWFyZXN0IHByZWNlZGluZyBkZWZpbml0aW9uLgorICAgICAgICBpZiAoUHJlZEluZm8tPkRlZkJCICE9IFByZWRJbmZvKQorICAgICAgICAgIFByZWRJbmZvID0gUHJlZEluZm8tPkRlZkJCOworICAgICAgICBUcmFpdHM6OkFkZFBISU9wZXJhbmQoUEhJLCBQcmVkSW5mby0+QXZhaWxhYmxlVmFsLCBQcmVkKTsKKyAgICAgIH0KKworICAgICAgREVCVUcoZGJncygpIDw8ICIgIEluc2VydGVkIFBISTogIiA8PCAqUEhJIDw8ICJcbiIpOworCisgICAgICAvLyBJZiB0aGUgY2xpZW50IHdhbnRzIHRvIGtub3cgYWJvdXQgYWxsIG5ldyBpbnN0cnVjdGlvbnMsIHRlbGwgaXQuCisgICAgICBpZiAoSW5zZXJ0ZWRQSElzKSBJbnNlcnRlZFBISXMtPnB1c2hfYmFjayhQSEkpOworICAgIH0KKyAgfQorCisgIC8vLyBGaW5kRXhpc3RpbmdQSEkgLSBMb29rIHRocm91Z2ggdGhlIFBISSBub2RlcyBpbiBhIGJsb2NrIHRvIHNlZSBpZiBhbnkgb2YKKyAgLy8vIHRoZW0gbWF0Y2ggd2hhdCBpcyBuZWVkZWQuCisgIHZvaWQgRmluZEV4aXN0aW5nUEhJKEJsa1QgKkJCLCBCbG9ja0xpc3RUeSAqQmxvY2tMaXN0KSB7CisgICAgZm9yICh0eXBlbmFtZSBCbGtUOjppdGVyYXRvciBCQkkgPSBCQi0+YmVnaW4oKSwgQkJFID0gQkItPmVuZCgpOworICAgICAgICAgQkJJICE9IEJCRTsgKytCQkkpIHsKKyAgICAgIFBoaVQgKlNvbWVQSEkgPSBUcmFpdHM6Okluc3RySXNQSEkoQkJJKTsKKyAgICAgIGlmICghU29tZVBISSkKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoQ2hlY2tJZlBISU1hdGNoZXMoU29tZVBISSkpIHsKKyAgICAgICAgUmVjb3JkTWF0Y2hpbmdQSEkoU29tZVBISSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gTWF0Y2ggZmFpbGVkOiBjbGVhciBhbGwgdGhlIFBISVRhZyB2YWx1ZXMuCisgICAgICBmb3IgKHR5cGVuYW1lIEJsb2NrTGlzdFR5OjppdGVyYXRvciBJID0gQmxvY2tMaXN0LT5iZWdpbigpLAorICAgICAgICAgICAgIEUgPSBCbG9ja0xpc3QtPmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgKCpJKS0+UEhJVGFnID0gMDsKKyAgICB9CisgIH0KKworICAvLy8gQ2hlY2tJZlBISU1hdGNoZXMgLSBDaGVjayBpZiBhIFBISSBub2RlIG1hdGNoZXMgdGhlIHBsYWNlbWVudCBhbmQgdmFsdWVzCisgIC8vLyBpbiB0aGUgQkJNYXAuCisgIGJvb2wgQ2hlY2tJZlBISU1hdGNoZXMoUGhpVCAqUEhJKSB7CisgICAgU21hbGxWZWN0b3I8UGhpVCosIDIwPiBXb3JrTGlzdDsKKyAgICBXb3JrTGlzdC5wdXNoX2JhY2soUEhJKTsKKworICAgIC8vIE1hcmsgdGhhdCB0aGUgYmxvY2sgY29udGFpbmluZyB0aGlzIFBISSBoYXMgYmVlbiB2aXNpdGVkLgorICAgIEJCTWFwW1BISS0+Z2V0UGFyZW50KCldLT5QSElUYWcgPSBQSEk7CisKKyAgICB3aGlsZSAoIVdvcmtMaXN0LmVtcHR5KCkpIHsKKyAgICAgIFBISSA9IFdvcmtMaXN0LnBvcF9iYWNrX3ZhbCgpOworCisgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIFBISSdzIGluY29taW5nIHZhbHVlcy4KKyAgICAgIGZvciAodHlwZW5hbWUgVHJhaXRzOjpQSElfaXRlcmF0b3IgSSA9IFRyYWl0czo6UEhJX2JlZ2luKFBISSksCisgICAgICAgICAgICAgRSA9IFRyYWl0czo6UEhJX2VuZChQSEkpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBWYWxUIEluY29taW5nVmFsID0gSS5nZXRJbmNvbWluZ1ZhbHVlKCk7CisgICAgICAgIEJCSW5mbyAqUHJlZEluZm8gPSBCQk1hcFtJLmdldEluY29taW5nQmxvY2soKV07CisgICAgICAgIC8vIFNraXAgdG8gdGhlIG5lYXJlc3QgcHJlY2VkaW5nIGRlZmluaXRpb24uCisgICAgICAgIGlmIChQcmVkSW5mby0+RGVmQkIgIT0gUHJlZEluZm8pCisgICAgICAgICAgUHJlZEluZm8gPSBQcmVkSW5mby0+RGVmQkI7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgaXQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgdmFsdWUuCisgICAgICAgIGlmIChQcmVkSW5mby0+QXZhaWxhYmxlVmFsKSB7CisgICAgICAgICAgaWYgKEluY29taW5nVmFsID09IFByZWRJbmZvLT5BdmFpbGFibGVWYWwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBQSEkgaW4gdGhlIGNvcnJlY3QgYmxvY2suCisgICAgICAgIFBoaVQgKkluY29taW5nUEhJVmFsID0gVHJhaXRzOjpWYWx1ZUlzUEhJKEluY29taW5nVmFsLCBVcGRhdGVyKTsKKyAgICAgICAgaWYgKCFJbmNvbWluZ1BISVZhbCB8fCBJbmNvbWluZ1BISVZhbC0+Z2V0UGFyZW50KCkgIT0gUHJlZEluZm8tPkJCKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBJZiB0aGlzIGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCwgY2hlY2sgaWYgdGhpcyBQSEkgbWF0Y2hlcy4KKyAgICAgICAgaWYgKFByZWRJbmZvLT5QSElUYWcpIHsKKyAgICAgICAgICBpZiAoSW5jb21pbmdQSElWYWwgPT0gUHJlZEluZm8tPlBISVRhZykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBQcmVkSW5mby0+UEhJVGFnID0gSW5jb21pbmdQSElWYWw7CisKKyAgICAgICAgV29ya0xpc3QucHVzaF9iYWNrKEluY29taW5nUEhJVmFsKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmVjb3JkTWF0Y2hpbmdQSEkgLSBGb3IgYSBQSEkgbm9kZSB0aGF0IG1hdGNoZXMsIHJlY29yZCBpdCBhbmQgaXRzIGlucHV0CisgIC8vLyBQSElzIGluIGJvdGggdGhlIEJCTWFwIGFuZCB0aGUgQXZhaWxhYmxlVmFscyBtYXBwaW5nLgorICB2b2lkIFJlY29yZE1hdGNoaW5nUEhJKFBoaVQgKlBISSkgeworICAgIFNtYWxsVmVjdG9yPFBoaVQqLCAyMD4gV29ya0xpc3Q7CisgICAgV29ya0xpc3QucHVzaF9iYWNrKFBISSk7CisKKyAgICAvLyBSZWNvcmQgdGhpcyBQSEkuCisgICAgQmxrVCAqQkIgPSBQSEktPmdldFBhcmVudCgpOworICAgIFZhbFQgUEhJVmFsID0gVHJhaXRzOjpHZXRQSElWYWx1ZShQSEkpOworICAgICgqQXZhaWxhYmxlVmFscylbQkJdID0gUEhJVmFsOworICAgIEJCTWFwW0JCXS0+QXZhaWxhYmxlVmFsID0gUEhJVmFsOworCisgICAgd2hpbGUgKCFXb3JrTGlzdC5lbXB0eSgpKSB7CisgICAgICBQSEkgPSBXb3JrTGlzdC5wb3BfYmFja192YWwoKTsKKworICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBQSEkncyBpbmNvbWluZyB2YWx1ZXMuCisgICAgICBmb3IgKHR5cGVuYW1lIFRyYWl0czo6UEhJX2l0ZXJhdG9yIEkgPSBUcmFpdHM6OlBISV9iZWdpbihQSEkpLAorICAgICAgICAgICAgIEUgPSBUcmFpdHM6OlBISV9lbmQoUEhJKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgVmFsVCBJbmNvbWluZ1ZhbCA9IEkuZ2V0SW5jb21pbmdWYWx1ZSgpOworICAgICAgICBQaGlUICpJbmNvbWluZ1BISSA9IFRyYWl0czo6VmFsdWVJc1BISShJbmNvbWluZ1ZhbCwgVXBkYXRlcik7CisgICAgICAgIGlmICghSW5jb21pbmdQSEkpIGNvbnRpbnVlOworICAgICAgICBCQiA9IEluY29taW5nUEhJLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgQkJJbmZvICpJbmZvID0gQkJNYXBbQkJdOworICAgICAgICBpZiAoIUluZm8gfHwgSW5mby0+QXZhaWxhYmxlVmFsKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIFJlY29yZCB0aGUgUEhJIGFuZCBhZGQgaXQgdG8gdGhlIHdvcmtsaXN0LgorICAgICAgICAoKkF2YWlsYWJsZVZhbHMpW0JCXSA9IEluY29taW5nVmFsOworICAgICAgICBJbmZvLT5BdmFpbGFibGVWYWwgPSBJbmNvbWluZ1ZhbDsKKyAgICAgICAgV29ya0xpc3QucHVzaF9iYWNrKEluY29taW5nUEhJKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU1NJLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TU0kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjRlMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU1NJLmgKQEAgLTAsMCArMSw5MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tIFNTSS5oIC0gQ3JlYXRlcyBTU0kgUmVwcmVzZW50YXRpb24gLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgY29udmVydHMgYSBsaXN0IG9mIHZhcmlhYmxlcyB0byB0aGUgU3RhdGljIFNpbmdsZSBJbmZvcm1hdGlvbgorLy8gZm9ybS4gVGhpcyBpcyBhIHByb2dyYW0gcmVwcmVzZW50YXRpb24gZGVzY3JpYmVkIGJ5IFNjb3R0IEFuYW5pYW4gaW4gaGlzCisvLyBNYXN0ZXIgVGhlc2lzOiAiVGhlIFN0YXRpYyBTaW5nbGUgSW5mb3JtYXRpb24gRm9ybSAoMTk5OSkiLgorLy8gV2UgYXJlIGJ1aWxkaW5nIGFuIG9uLWRlbWFuZCByZXByZXNlbnRhdGlvbiwgdGhhdCBpcywgd2UgZG8gbm90IGNvbnZlcnQKKy8vIGV2ZXJ5IHNpbmdsZSB2YXJpYWJsZSBpbiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIHRvIFNTSSBmb3JtLiBSYXRoZXIsIHdlIHJlY2VpdmUKKy8vIGEgbGlzdCBvZiB0YXJnZXQgdmFyaWFibGVzIHRoYXQgbXVzdCBiZSBjb252ZXJ0ZWQuIFdlIGFsc28gZG8gbm90CisvLyBjb21wbGV0ZWx5IGNvbnZlcnQgYSB0YXJnZXQgdmFyaWFibGUgdG8gdGhlIFNTSSBmb3JtYXQuIEluc3RlYWQsIHdlIG9ubHkKKy8vIGNoYW5nZSB0aGUgdmFyaWFibGUgaW4gdGhlIHBvaW50cyB3aGVyZSBuZXcgaW5mb3JtYXRpb24gY2FuIGJlIGF0dGFjaGVkCisvLyB0byBpdHMgbGl2ZSByYW5nZSwgdGhhdCBpcywgYXQgYnJhbmNoIHBvaW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19TU0lfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU1NJX0gKKworI2luY2x1ZGUgImxsdm0vSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgRG9taW5hdG9yVHJlZTsKKyAgY2xhc3MgUEhJTm9kZTsKKyAgY2xhc3MgSW5zdHJ1Y3Rpb247CisgIGNsYXNzIENtcEluc3Q7CisKKyAgY2xhc3MgU1NJIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQuCisgICAgICBTU0koKSA6CisgICAgICAgIEZ1bmN0aW9uUGFzcyhJRCkgeworICAgICAgfQorCisgICAgICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0OworCisgICAgICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24mKTsKKworICAgICAgdm9pZCBjcmVhdGVTU0koU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZ2YWx1ZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gVmFyaWFibGVzIGFsd2F5cyBsaXZlCisgICAgICBEb21pbmF0b3JUcmVlICpEVF87CisKKyAgICAgIC8vIFN0b3JlcyB2YXJpYWJsZXMgY3JlYXRlZCBieSBTU0kKKyAgICAgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uICosIDE2PiBjcmVhdGVkOworCisgICAgICAvLyBQaGlzIGNyZWF0ZWQgYnkgU1NJCisgICAgICBEZW5zZU1hcDxQSElOb2RlICosIEluc3RydWN0aW9uKj4gcGhpczsKKworICAgICAgLy8gU2lnbWFzIGNyZWF0ZWQgYnkgU1NJCisgICAgICBEZW5zZU1hcDxQSElOb2RlICosIEluc3RydWN0aW9uKj4gc2lnbWFzOworCisgICAgICAvLyBQaGkgbm9kZXMgdGhhdCBoYXZlIGEgcGhpIGFzIG9wZXJhbmQgYW5kIGhhcyB0byBiZSBmaXhlZAorICAgICAgU21hbGxQdHJTZXQ8UEhJTm9kZSAqLCAxPiBwaGlzVG9GaXg7CisKKyAgICAgIC8vIExpc3Qgb2YgZGVmaW5pdGlvbiBwb2ludHMgZm9yIGV2ZXJ5IHZhcmlhYmxlCisgICAgICBEZW5zZU1hcDxJbnN0cnVjdGlvbiosIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCA0PiA+IGRlZnNpdGVzOworCisgICAgICAvLyBCYXNpYyBCbG9jayBvZiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvZiBlYWNoIHZhcmlhYmxlCisgICAgICBEZW5zZU1hcDxJbnN0cnVjdGlvbiosIEJhc2ljQmxvY2sqPiB2YWx1ZV9vcmlnaW5hbDsKKworICAgICAgLy8gU3RhY2sgb2YgbGFzdCBzZWVuIGRlZmluaXRpb24gb2YgYSB2YXJpYWJsZQorICAgICAgRGVuc2VNYXA8SW5zdHJ1Y3Rpb24qLCBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiAqLCAxPiA+IHZhbHVlX3N0YWNrOworCisgICAgICB2b2lkIGluc2VydFNpZ21hRnVuY3Rpb25zKFNtYWxsUHRyU2V0PEluc3RydWN0aW9uKiwgND4gJnZhbHVlKTsKKyAgICAgIHZvaWQgaW5zZXJ0U2lnbWEoVGVybWluYXRvckluc3QgKlRJLCBJbnN0cnVjdGlvbiAqSSk7CisgICAgICB2b2lkIGluc2VydFBoaUZ1bmN0aW9ucyhTbWFsbFB0clNldDxJbnN0cnVjdGlvbiosIDQ+ICZ2YWx1ZSk7CisgICAgICB2b2lkIHJlbmFtZUluaXQoU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24qLCA0PiAmdmFsdWUpOworICAgICAgdm9pZCByZW5hbWUoQmFzaWNCbG9jayAqQkIpOworCisgICAgICB2b2lkIHN1YnN0aXR1dGVVc2UoSW5zdHJ1Y3Rpb24gKkkpOworICAgICAgYm9vbCBkb21pbmF0ZUFueShCYXNpY0Jsb2NrICpCQiwgSW5zdHJ1Y3Rpb24gKnZhbHVlKTsKKyAgICAgIHZvaWQgZml4UGhpcygpOworCisgICAgICBJbnN0cnVjdGlvbiogZ2V0UG9zaXRpb25QaGkoUEhJTm9kZSAqUE4pOworICAgICAgSW5zdHJ1Y3Rpb24qIGdldFBvc2l0aW9uU2lnbWEoUEhJTm9kZSAqUE4pOworCisgICAgICB2b2lkIGluaXQoU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZ2YWx1ZSk7CisgICAgICB2b2lkIGNsZWFuKCk7CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvVW5pZnlGdW5jdGlvbkV4aXROb2Rlcy5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvVW5pZnlGdW5jdGlvbkV4aXROb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMWM2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9VbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tLSBVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmggLSBFbnN1cmUgZm4ncyBoYXZlIG9uZSByZXR1cm4gLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBmdW5jdGlvbnMgaGF2ZSBhdCBtb3N0IG9uZSByZXR1cm4gYW5kIG9uZQorLy8gdW53aW5kIGluc3RydWN0aW9uIGluIHRoZW0uICBBZGRpdGlvbmFsbHksIGl0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIG5vZGUgaXMKKy8vIHRoZSBuZXcgZXhpdCBub2RlIG9mIHRoZSBDRkcuICBJZiB0aGVyZSBhcmUgbm8gcmV0dXJuIG9yIHVud2luZCBpbnN0cnVjdGlvbnMKKy8vIGluIHRoZSBmdW5jdGlvbiwgdGhlIGdldFJldHVybkJsb2NrL2dldFVud2luZEJsb2NrIG1ldGhvZHMgd2lsbCByZXR1cm4gYSBudWxsCisvLyBwb2ludGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VOSUZZRlVOQ1RJT05FWElUTk9ERVNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVU5JRllGVU5DVElPTkVYSVROT0RFU19ICisKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgVW5pZnlGdW5jdGlvbkV4aXROb2RlcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBCYXNpY0Jsb2NrICpSZXR1cm5CbG9jaywgKlVucmVhY2hhYmxlQmxvY2s7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgIFVuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMoKSA6IEZ1bmN0aW9uUGFzcyhJRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkJsb2NrKDApIHt9CisKKyAgLy8gV2UgY2FuIHByZXNlcnZlIG5vbi1jcml0aWNhbC1lZGdlbmVzcyB3aGVuIHdlIHVuaWZ5IGZ1bmN0aW9uIGV4aXQgbm9kZXMKKyAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0OworCisgIC8vIGdldFJldHVybnxVbndpbmR8VW5yZWFjaGFibGVCbG9jayAtIFJldHVybiB0aGUgbmV3IHNpbmdsZSAob3Igbm9uZXhpc3RhbnQpCisgIC8vIHJldHVybiwgdW53aW5kLCBvciB1bnJlYWNoYWJsZSAgYmFzaWMgYmxvY2tzIGluIHRoZSBDRkcuCisgIC8vCisgIEJhc2ljQmxvY2sgKmdldFJldHVybkJsb2NrKCkgY29uc3QgeyByZXR1cm4gUmV0dXJuQmxvY2s7IH0KKyAgQmFzaWNCbG9jayAqZ2V0VW5yZWFjaGFibGVCbG9jaygpIGNvbnN0IHsgcmV0dXJuIFVucmVhY2hhYmxlQmxvY2s7IH0KKworICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7Cit9OworCitQYXNzICpjcmVhdGVVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzUGFzcygpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Vucm9sbExvb3AuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Vucm9sbExvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDVlZTFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvVW5yb2xsTG9vcC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LSBsbHZtL1RyYW5zZm9ybXMvVXRpbHMvVW5yb2xsTG9vcC5oIC0gVW5yb2xsaW5nIHV0aWxpdGllcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgc29tZSBsb29wIHVucm9sbGluZyB1dGlsaXRpZXMuIEl0IGRvZXMgbm90IGRlZmluZSBhbnkKKy8vIGFjdHVhbCBwYXNzIG9yIHBvbGljeSwgYnV0IHByb3ZpZGVzIGEgc2luZ2xlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gbG9vcAorLy8gdW5yb2xsaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1VOUk9MTExPT1BfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfVU5ST0xMTE9PUF9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTG9vcDsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgTFBQYXNzTWFuYWdlcjsKKworYm9vbCBVbnJvbGxMb29wKExvb3AgKkwsIHVuc2lnbmVkIENvdW50LCBMb29wSW5mbyogTEksIExQUGFzc01hbmFnZXIqIExQTSk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHlwZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTdlZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1R5cGUuaApAQCAtMCwwICsxLDU2NCBAQAorLy89PT0tLSBsbHZtL1R5cGUuaCAtIENsYXNzZXMgZm9yIGhhbmRsaW5nIGRhdGEgdHlwZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RZUEVfSAorI2RlZmluZSBMTFZNX1RZUEVfSAorCisjaW5jbHVkZSAibGx2bS9BYnN0cmFjdFR5cGVVc2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGVyaXZlZFR5cGU7CitjbGFzcyBQb2ludGVyVHlwZTsKK2NsYXNzIEludGVnZXJUeXBlOworY2xhc3MgVHlwZU1hcEJhc2U7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIExMVk1Db250ZXh0OworCisvLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgVHlwZSBjbGFzcy4gIEZvciBtb3JlICJUeXBlIiB0eXBlCisvLy8gc3R1ZmYsIGxvb2sgaW4gRGVyaXZlZFR5cGVzLmguCisvLy8KKy8vLyBUaGUgaW5zdGFuY2VzIG9mIHRoZSBUeXBlIGNsYXNzIGFyZSBpbW11dGFibGU6IG9uY2UgdGhleSBhcmUgY3JlYXRlZCwKKy8vLyB0aGV5IGFyZSBuZXZlciBjaGFuZ2VkLiAgQWxzbyBub3RlIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyCisvLy8gdHlwZSBpcyBldmVyIGNyZWF0ZWQuICBUaHVzIHNlZWluZyBpZiB0d28gdHlwZXMgYXJlIGVxdWFsIGlzIGEgbWF0dGVyIG9mCisvLy8gZG9pbmcgYSB0cml2aWFsIHBvaW50ZXIgY29tcGFyaXNvbi4gVG8gZW5mb3JjZSB0aGF0IG5vIHR3byBlcXVhbCBpbnN0YW5jZXMKKy8vLyBhcmUgY3JlYXRlZCwgVHlwZSBpbnN0YW5jZXMgY2FuIG9ubHkgYmUgY3JlYXRlZCB2aWEgc3RhdGljIGZhY3RvcnkgbWV0aG9kcyAKKy8vLyBpbiBjbGFzcyBUeXBlIGFuZCBpbiBkZXJpdmVkIGNsYXNzZXMuCisvLy8gCisvLy8gT25jZSBhbGxvY2F0ZWQsIFR5cGVzIGFyZSBuZXZlciBmcmVlJ2QsIHVubGVzcyB0aGV5IGFyZSBhbiBhYnN0cmFjdCB0eXBlCisvLy8gdGhhdCBpcyByZXNvbHZlZCB0byBhIG1vcmUgY29uY3JldGUgdHlwZS4KKy8vLyAKKy8vLyBUeXBlcyB0aGVtc2VsZiBkb24ndCBoYXZlIGEgbmFtZSwgYW5kIGNhbiBiZSBuYW1lZCBlaXRoZXIgYnk6CisvLy8gLSB1c2luZyBTeW1ib2xUYWJsZSBpbnN0YW5jZSwgdHlwaWNhbGx5IGZyb20gc29tZSBNb2R1bGUsCisvLy8gLSB1c2luZyBjb252ZW5pZW5jZSBtZXRob2RzIGluIHRoZSBNb2R1bGUgY2xhc3MgKHdoaWNoIHVzZXMgbW9kdWxlJ3MgCisvLy8gICAgU3ltYm9sVGFibGUgdG9vKS4KKy8vLworLy8vIE9wYXF1ZSB0eXBlcyBhcmUgc2ltcGxlIGRlcml2ZWQgdHlwZXMgd2l0aCBubyBzdGF0ZS4gIFRoZXJlIG1heSBiZSBtYW55CisvLy8gZGlmZmVyZW50IE9wYXF1ZSB0eXBlIG9iamVjdHMgZmxvYXRpbmcgYXJvdW5kLCBidXQgdHdvIGFyZSBvbmx5IGNvbnNpZGVyZWQKKy8vLyBpZGVudGljYWwgaWYgdGhleSBhcmUgcG9pbnRlciBlcXVhbHMgb2YgZWFjaCBvdGhlci4gIFRoaXMgYWxsb3dzIHVzIHRvIGhhdmUKKy8vLyB0d28gb3BhcXVlIHR5cGVzIHRoYXQgZW5kIHVwIHJlc29sdmluZyB0byBkaWZmZXJlbnQgY29uY3JldGUgdHlwZXMgbGF0ZXIuCisvLy8KKy8vLyBPcGFxdWUgdHlwZXMgYXJlIGFsc28ga2luZGEgd2VpcmQgYW5kIHNjYXJ5IGFuZCBkaWZmZXJlbnQgYmVjYXVzZSB0aGV5IGhhdmUKKy8vLyB0byBrZWVwIGEgbGlzdCBvZiB1c2VzIG9mIHRoZSB0eXBlLiAgV2hlbiwgdGhyb3VnaCBsaW5raW5nLCBwYXJzaW5nLCBvcgorLy8vIGJpdGNvZGUgcmVhZGluZywgdGhleSBiZWNvbWUgcmVzb2x2ZWQsIHRoZXkgbmVlZCB0byBmaW5kIGFuZCB1cGRhdGUgYWxsCisvLy8gdXNlcnMgb2YgdGhlIHVua25vd24gdHlwZSwgY2F1c2luZyB0aGVtIHRvIHJlZmVyZW5jZSBhIG5ldywgbW9yZSBjb25jcmV0ZQorLy8vIHR5cGUuICBPcGFxdWUgdHlwZXMgYXJlIGRlbGV0ZWQgd2hlbiB0aGVpciB1c2UgbGlzdCBkd2luZGxlcyB0byB6ZXJvIHVzZXJzLgorLy8vCisvLy8gQGJyaWVmIFJvb3Qgb2YgdHlwZSBoaWVyYXJjaHkKK2NsYXNzIFR5cGUgOiBwdWJsaWMgQWJzdHJhY3RUeXBlVXNlciB7CitwdWJsaWM6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBEZWZpbml0aW9ucyBvZiBhbGwgb2YgdGhlIGJhc2UgdHlwZXMgZm9yIHRoZSBUeXBlIHN5c3RlbS4gIEJhc2VkIG9uIHRoaXMKKyAgLy8vIHZhbHVlLCB5b3UgY2FuIGNhc3QgdG8gYSAiRGVyaXZlZFR5cGUiIHN1YmNsYXNzIChzZWUgRGVyaXZlZFR5cGVzLmgpCisgIC8vLyBOb3RlOiBJZiB5b3UgYWRkIGFuIGVsZW1lbnQgdG8gdGhpcywgeW91IG5lZWQgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlCisgIC8vLyBUeXBlOjpnZXRQcmltaXRpdmVUeXBlIGZ1bmN0aW9uLCBvciBlbHNlIHRoaW5ncyB3aWxsIGJyZWFrIQorICAvLy8gQWxzbyB1cGRhdGUgTExWTVR5cGVLaW5kIGFuZCBMTFZNR2V0VHlwZUtpbmQgKCkgaW4gdGhlIEMgYmluZGluZy4KKyAgLy8vCisgIGVudW0gVHlwZUlEIHsKKyAgICAvLyBQcmltaXRpdmVUeXBlcyAuLiBtYWtlIHN1cmUgTGFzdFByaW1pdGl2ZVR5SUQgc3RheXMgdXAgdG8gZGF0ZQorICAgIFZvaWRUeUlEID0gMCwgICAgLy8vPCAgMDogdHlwZSB3aXRoIG5vIHNpemUKKyAgICBGbG9hdFR5SUQsICAgICAgIC8vLzwgIDE6IDMyIGJpdCBmbG9hdGluZyBwb2ludCB0eXBlCisgICAgRG91YmxlVHlJRCwgICAgICAvLy88ICAyOiA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgdHlwZQorICAgIFg4Nl9GUDgwVHlJRCwgICAgLy8vPCAgMzogODAgYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKFg4NykKKyAgICBGUDEyOFR5SUQsICAgICAgIC8vLzwgIDQ6IDEyOCBiaXQgZmxvYXRpbmcgcG9pbnQgdHlwZSAoMTEyLWJpdCBtYW50aXNzYSkKKyAgICBQUENfRlAxMjhUeUlELCAgIC8vLzwgIDU6IDEyOCBiaXQgZmxvYXRpbmcgcG9pbnQgdHlwZSAodHdvIDY0LWJpdHMpCisgICAgTGFiZWxUeUlELCAgICAgICAvLy88ICA2OiBMYWJlbHMKKyAgICBNZXRhZGF0YVR5SUQsICAgIC8vLzwgIDc6IE1ldGFkYXRhCisKKyAgICAvLyBEZXJpdmVkIHR5cGVzLi4uIHNlZSBEZXJpdmVkVHlwZXMuaCBmaWxlLi4uCisgICAgLy8gTWFrZSBzdXJlIEZpcnN0RGVyaXZlZFR5SUQgc3RheXMgdXAgdG8gZGF0ZSEhIQorICAgIEludGVnZXJUeUlELCAgICAgLy8vPCAgODogQXJiaXRyYXJ5IGJpdCB3aWR0aCBpbnRlZ2VycworICAgIEZ1bmN0aW9uVHlJRCwgICAgLy8vPCAgOTogRnVuY3Rpb25zCisgICAgU3RydWN0VHlJRCwgICAgICAvLy88IDEwOiBTdHJ1Y3R1cmVzCisgICAgVW5pb25UeUlELCAgICAgICAvLy88IDExOiBVbmlvbnMKKyAgICBBcnJheVR5SUQsICAgICAgIC8vLzwgMTI6IEFycmF5cworICAgIFBvaW50ZXJUeUlELCAgICAgLy8vPCAxMzogUG9pbnRlcnMKKyAgICBPcGFxdWVUeUlELCAgICAgIC8vLzwgMTQ6IE9wYXF1ZTogdHlwZSB3aXRoIHVua25vd24gc3RydWN0dXJlCisgICAgVmVjdG9yVHlJRCwgICAgICAvLy88IDE1OiBTSU1EICdwYWNrZWQnIGZvcm1hdCwgb3Igb3RoZXIgdmVjdG9yIHR5cGUKKworICAgIE51bVR5cGVJRHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11c3QgcmVtYWluIGFzIGxhc3QgZGVmaW5lZCBJRAorICAgIExhc3RQcmltaXRpdmVUeUlEID0gTWV0YWRhdGFUeUlELAorICAgIEZpcnN0RGVyaXZlZFR5SUQgPSBJbnRlZ2VyVHlJRAorICB9OworCitwcml2YXRlOgorICBUeXBlSUQgICBJRCA6IDg7ICAgIC8vIFRoZSBjdXJyZW50IGJhc2UgdHlwZSBvZiB0aGlzIHR5cGUuCisgIGJvb2wgICAgIEFic3RyYWN0IDogMTsgIC8vIFRydWUgaWYgdHlwZSBjb250YWlucyBhbiBPcGFxdWVUeXBlCisgIHVuc2lnbmVkIFN1YmNsYXNzRGF0YSA6IDIzOyAvL1NwYWNlIGZvciBzdWJjbGFzc2VzIHRvIHN0b3JlIGRhdGEKKworICAvLy8gUmVmQ291bnQgLSBUaGlzIGNvdW50cyB0aGUgbnVtYmVyIG9mIFBBVHlwZUhvbGRlcnMgdGhhdCBhcmUgcG9pbnRpbmcgdG8KKyAgLy8vIHRoaXMgdHlwZS4gIFdoZW4gdGhpcyBudW1iZXIgZmFsbHMgdG8gemVybywgaWYgdGhlIHR5cGUgaXMgYWJzdHJhY3QgYW5kCisgIC8vLyBoYXMgbm8gQWJzdHJhY3RUeXBlVXNlcnMsIHRoZSB0eXBlIGlzIGRlbGV0ZWQuICBUaGlzIGlzIG9ubHkgc2Vuc2ljYWwgZm9yCisgIC8vLyBkZXJpdmVkIHR5cGVzLgorICAvLy8KKyAgbXV0YWJsZSB1bnNpZ25lZCBSZWZDb3VudDsKKworICAvLy8gQ29udGV4dCAtIFRoaXMgcmVmZXJzIHRvIHRoZSBMTFZNQ29udGV4dCBpbiB3aGljaCB0aGlzIHR5cGUgd2FzIHVuaXF1ZWQuCisgIExMVk1Db250ZXh0ICZDb250ZXh0OworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworCisgIGNvbnN0IFR5cGUgKmdldEZvcndhcmRlZFR5cGVJbnRlcm5hbCgpIGNvbnN0OworCisgIC8vIFNvbWUgVHlwZSBpbnN0YW5jZXMgYXJlIGFsbG9jYXRlZCBhcyBhcnJheXMsIHNvbWUgYXJlbid0LiBTbyB3ZSBwcm92aWRlCisgIC8vIHRoaXMgbWV0aG9kIHRvIGdldCB0aGUgcmlnaHQga2luZCBvZiBkZXN0cnVjdGlvbiBmb3IgdGhlIHR5cGUgb2YgVHlwZS4KKyAgdm9pZCBkZXN0cm95KCkgY29uc3Q7IC8vIGNvbnN0IGlzIGEgbGllLCB0aGlzIGRvZXMgImRlbGV0ZSB0aGlzIiEKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBUeXBlKExMVk1Db250ZXh0ICZDLCBUeXBlSUQgaWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQoaWQpLCBBYnN0cmFjdChmYWxzZSksIFN1YmNsYXNzRGF0YSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmQ291bnQoMCksIENvbnRleHQoQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcndhcmRUeXBlKDApLCBOdW1Db250YWluZWRUeXMoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lZFR5cygwKSB7fQorICB2aXJ0dWFsIH5UeXBlKCkgeworICAgIGFzc2VydChBYnN0cmFjdFR5cGVVc2Vycy5lbXB0eSgpICYmICJBYnN0cmFjdCB0eXBlcyByZW1haW4iKTsKKyAgfQorCisgIC8vLyBUeXBlcyBjYW4gYmVjb21lIG5vbmFic3RyYWN0IGxhdGVyLCBpZiB0aGV5IGFyZSByZWZpbmVkLgorICAvLy8KKyAgaW5saW5lIHZvaWQgc2V0QWJzdHJhY3QoYm9vbCBWYWwpIHsgQWJzdHJhY3QgPSBWYWw7IH0KKworICB1bnNpZ25lZCBnZXRSZWZDb3VudCgpIGNvbnN0IHsgcmV0dXJuIFJlZkNvdW50OyB9CisKKyAgdW5zaWduZWQgZ2V0U3ViY2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gU3ViY2xhc3NEYXRhOyB9CisgIHZvaWQgc2V0U3ViY2xhc3NEYXRhKHVuc2lnbmVkIHZhbCkgeyBTdWJjbGFzc0RhdGEgPSB2YWw7IH0KKworICAvLy8gRm9yd2FyZFR5cGUgLSBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSB1bmlvbiBmaW5kIHNjaGVtZSBmb3IKKyAgLy8vIGFic3RyYWN0IHR5cGVzLiAgV2hlbiB0eXBlcyBhcmUgcmVmaW5lZCB0byBvdGhlciB0eXBlcywgdGhpcyBmaWVsZCBpcyBzZXQKKyAgLy8vIHRvIHRoZSBtb3JlIHJlZmluZWQgdHlwZS4gIE9ubHkgYWJzdHJhY3QgdHlwZXMgY2FuIGJlIGZvcndhcmRlZC4KKyAgbXV0YWJsZSBjb25zdCBUeXBlICpGb3J3YXJkVHlwZTsKKworCisgIC8vLyBBYnN0cmFjdFR5cGVVc2VycyAtIEltcGxlbWVudCBhIGxpc3Qgb2YgdGhlIHVzZXJzIHRoYXQgbmVlZCB0byBiZSBub3RpZmllZAorICAvLy8gaWYgSSBhbSBhIHR5cGUsIGFuZCBJIGdldCByZXNvbHZlZCBpbnRvIGEgbW9yZSBjb25jcmV0ZSB0eXBlLgorICAvLy8KKyAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxBYnN0cmFjdFR5cGVVc2VyICo+IEFic3RyYWN0VHlwZVVzZXJzOworCisgIC8vLyBOdW1Db250YWluZWRUeXMgLSBLZWVwcyB0cmFjayBvZiBob3cgbWFueSBQQVR5cGVIYW5kbGUgaW5zdGFuY2VzIHRoZXJlCisgIC8vLyBhcmUgYXQgdGhlIGVuZCBvZiB0aGlzIHR5cGUgaW5zdGFuY2UgZm9yIHRoZSBsaXN0IG9mIGNvbnRhaW5lZCB0eXBlcy4gSXQKKyAgLy8vIGlzIHRoZSBzdWJjbGFzc2VzIHJlc3BvbnNpYmlsaXR5IHRvIHNldCB0aGlzIHVwLiBTZXQgdG8gMCBpZiB0aGVyZSBhcmUgbm8KKyAgLy8vIGNvbnRhaW5lZCB0eXBlcyBpbiB0aGlzIHR5cGUuCisgIHVuc2lnbmVkIE51bUNvbnRhaW5lZFR5czsKKworICAvLy8gQ29udGFpbmVkVHlzIC0gQSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBUeXBlcyAoUEFUeXBlSGFuZGxlKSBjb250YWluZWQgCisgIC8vLyBieSB0aGlzIFR5cGUuICBGb3IgZXhhbXBsZSwgdGhpcyBpbmNsdWRlcyB0aGUgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gCisgIC8vLyB0eXBlLCB0aGUgZWxlbWVudHMgb2YgYSBzdHJ1Y3R1cmUsIHRoZSBwb2ludGVlIG9mIGEgcG9pbnRlciwgdGhlIGVsZW1lbnQKKyAgLy8vIHR5cGUgb2YgYW4gYXJyYXksIGV0Yy4gIFRoaXMgcG9pbnRlciBtYXkgYmUgMCBmb3IgdHlwZXMgdGhhdCBkb24ndCAKKyAgLy8vIGNvbnRhaW4gb3RoZXIgdHlwZXMgKEludGVnZXIsIERvdWJsZSwgRmxvYXQpLiAgSW4gZ2VuZXJhbCwgdGhlIHN1YmNsYXNzIAorICAvLy8gc2hvdWxkIGFycmFuZ2UgZm9yIHNwYWNlIGZvciB0aGUgUEFUeXBlSGFuZGxlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgCisgIC8vLyBhbGxvY2F0aW9uIG9mIHRoZSB0eXBlIG9iamVjdCBhbmQgc2V0IHRoaXMgcG9pbnRlciB0byB0aGUgYWRkcmVzcyBvZiB0aGUgCisgIC8vLyBmaXJzdCBlbGVtZW50LiBUaGlzIGFsbG93cyB0aGUgVHlwZSBjbGFzcyB0byBtYW5pcHVsYXRlIHRoZSBDb250YWluZWRUeXMgCisgIC8vLyB3aXRob3V0IHVuZGVyc3RhbmRpbmcgdGhlIHN1YmNsYXNzJ3MgcGxhY2VtZW50IGZvciB0aGlzIGFycmF5LiAga2VlcGluZyAKKyAgLy8vIGl0IGhlcmUgYWxzbyBhbGxvd3MgdGhlIHN1YnR5cGVfKiBtZW1iZXJzIHRvIGJlIGltcGxlbWVudGVkIE1VQ0ggbW9yZSAKKyAgLy8vIGVmZmljaWVudGx5LCBhbmQgZHluYW1pY2FsbHkgdmVyeSBmZXcgdHlwZXMgZG8gbm90IGNvbnRhaW4gYW55IGVsZW1lbnRzLgorICBQQVR5cGVIYW5kbGUgKkNvbnRhaW5lZFR5czsKKworcHVibGljOgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKKworICAvLy8gQGJyaWVmIERlYnVnZ2luZyBzdXBwb3J0OiBwcmludCB0byBzdGRlcnIKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBEZWJ1Z2dpbmcgc3VwcG9ydDogcHJpbnQgdG8gc3RkZXJyICh1c2UgdHlwZSBuYW1lcyBmcm9tIGNvbnRleHQKKyAgLy8vIG1vZHVsZSkuCisgIHZvaWQgZHVtcChjb25zdCBNb2R1bGUgKkNvbnRleHQpIGNvbnN0OworCisgIC8vLyBnZXRDb250ZXh0IC0gRmV0Y2ggdGhlIExMVk1Db250ZXh0IGluIHdoaWNoIHRoaXMgdHlwZSB3YXMgdW5pcXVlZC4KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZGVhbGluZyB3aXRoIHR5cGVzLi4uIFNvbWUgb2YgdGhlc2UgdmlydHVhbCBtZXRob2RzCisgIC8vIGFyZSBkZWZpbmVkIGluIHByaXZhdGUgY2xhc3NlcyBkZWZpbmVkIGluIFR5cGUuY3BwIGZvciBwcmltaXRpdmUgdHlwZXMuCisgIC8vCisKKyAgLy8vIGdldERlc2NyaXB0aW9uIC0gUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUuCisgIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3Q7CisKKyAgLy8vIGdldFR5cGVJRCAtIFJldHVybiB0aGUgdHlwZSBpZCBmb3IgdGhlIHR5cGUuICBUaGlzIHdpbGwgcmV0dXJuIG9uZQorICAvLy8gb2YgdGhlIFR5cGVJRCBlbnVtIGVsZW1lbnRzIGRlZmluZWQgYWJvdmUuCisgIC8vLworICBpbmxpbmUgVHlwZUlEIGdldFR5cGVJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKKyAgLy8vIGlzVm9pZFR5IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyAndm9pZCcuCisgIGJvb2wgaXNWb2lkVHkoKSBjb25zdCB7IHJldHVybiBJRCA9PSBWb2lkVHlJRDsgfQorCisgIC8vLyBpc0Zsb2F0VHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICdmbG9hdCcsIGEgMzItYml0IElFRUUgZnAgdHlwZS4KKyAgYm9vbCBpc0Zsb2F0VHkoKSBjb25zdCB7IHJldHVybiBJRCA9PSBGbG9hdFR5SUQ7IH0KKyAgCisgIC8vLyBpc0RvdWJsZVR5IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyAnZG91YmxlJywgYSA2NC1iaXQgSUVFRSBmcCB0eXBlLgorICBib29sIGlzRG91YmxlVHkoKSBjb25zdCB7IHJldHVybiBJRCA9PSBEb3VibGVUeUlEOyB9CisKKyAgLy8vIGlzWDg2X0ZQODBUeSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgeDg2IGxvbmcgZG91YmxlLgorICBib29sIGlzWDg2X0ZQODBUeSgpIGNvbnN0IHsgcmV0dXJuIElEID09IFg4Nl9GUDgwVHlJRDsgfQorCisgIC8vLyBpc0ZQMTI4VHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICdmcDEyOCcuCisgIGJvb2wgaXNGUDEyOFR5KCkgY29uc3QgeyByZXR1cm4gSUQgPT0gRlAxMjhUeUlEOyB9CisKKyAgLy8vIGlzUFBDX0ZQMTI4VHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHBvd2VycGMgbG9uZyBkb3VibGUuCisgIGJvb2wgaXNQUENfRlAxMjhUeSgpIGNvbnN0IHsgcmV0dXJuIElEID09IFBQQ19GUDEyOFR5SUQ7IH0KKworICAvLy8gaXNGbG9hdGluZ1BvaW50VHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgZml2ZSBmbG9hdGluZyBwb2ludAorICAvLy8gdHlwZXMKKyAgYm9vbCBpc0Zsb2F0aW5nUG9pbnRUeSgpIGNvbnN0IHsgcmV0dXJuIElEID09IEZsb2F0VHlJRCB8fCBJRCA9PSBEb3VibGVUeUlEIHx8CisgICAgICBJRCA9PSBYODZfRlA4MFR5SUQgfHwgSUQgPT0gRlAxMjhUeUlEIHx8IElEID09IFBQQ19GUDEyOFR5SUQ7IH0KKworICAvLy8gaXNGUE9yRlBWZWN0b3JUeSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBGUCB0eXBlIG9yIGEgdmVjdG9yIG9mIEZQLgorICAvLy8KKyAgYm9vbCBpc0ZQT3JGUFZlY3RvclR5KCkgY29uc3Q7CisgCisgIC8vLyBpc0xhYmVsVHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICdsYWJlbCcuCisgIGJvb2wgaXNMYWJlbFR5KCkgY29uc3QgeyByZXR1cm4gSUQgPT0gTGFiZWxUeUlEOyB9CisKKyAgLy8vIGlzTWV0YWRhdGFUeSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgJ21ldGFkYXRhJy4KKyAgYm9vbCBpc01ldGFkYXRhVHkoKSBjb25zdCB7IHJldHVybiBJRCA9PSBNZXRhZGF0YVR5SUQ7IH0KKworICAvLy8gaXNJbnRlZ2VyVHkgLSBUcnVlIGlmIHRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgSW50ZWdlclR5cGUuCisgIC8vLworICBib29sIGlzSW50ZWdlclR5KCkgY29uc3QgeyByZXR1cm4gSUQgPT0gSW50ZWdlclR5SUQ7IH0gCisKKyAgLy8vIGlzSW50ZWdlclR5IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBJbnRlZ2VyVHlwZSBvZiB0aGUgZ2l2ZW4gd2lkdGguCisgIGJvb2wgaXNJbnRlZ2VyVHkodW5zaWduZWQgQml0d2lkdGgpIGNvbnN0OworCisgIC8vLyBpc0ludE9ySW50VmVjdG9yVHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGludGVnZXIgdHlwZSBvciBhIHZlY3RvciBvZgorICAvLy8gaW50ZWdlciB0eXBlcy4KKyAgLy8vCisgIGJvb2wgaXNJbnRPckludFZlY3RvclR5KCkgY29uc3Q7CisgIAorICAvLy8gaXNGdW5jdGlvblR5IC0gVHJ1ZSBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIEZ1bmN0aW9uVHlwZS4KKyAgLy8vCisgIGJvb2wgaXNGdW5jdGlvblR5KCkgY29uc3QgeyByZXR1cm4gSUQgPT0gRnVuY3Rpb25UeUlEOyB9CisKKyAgLy8vIGlzU3RydWN0VHkgLSBUcnVlIGlmIHRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgU3RydWN0VHlwZS4KKyAgLy8vCisgIGJvb2wgaXNTdHJ1Y3RUeSgpIGNvbnN0IHsgcmV0dXJuIElEID09IFN0cnVjdFR5SUQ7IH0KKworICAvLy8gaXNVbmlvblR5IC0gVHJ1ZSBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIFVuaW9uVHlwZS4KKyAgLy8vCisgIGJvb2wgaXNVbmlvblR5KCkgY29uc3QgeyByZXR1cm4gSUQgPT0gVW5pb25UeUlEOyB9CisKKyAgLy8vIGlzQXJyYXlUeSAtIFRydWUgaWYgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBBcnJheVR5cGUuCisgIC8vLworICBib29sIGlzQXJyYXlUeSgpIGNvbnN0IHsgcmV0dXJuIElEID09IEFycmF5VHlJRDsgfQorCisgIC8vLyBpc1BvaW50ZXJUeSAtIFRydWUgaWYgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBQb2ludGVyVHlwZS4KKyAgLy8vCisgIGJvb2wgaXNQb2ludGVyVHkoKSBjb25zdCB7IHJldHVybiBJRCA9PSBQb2ludGVyVHlJRDsgfQorCisgIC8vLyBpc09wYXF1ZVR5IC0gVHJ1ZSBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIE9wYXF1ZVR5cGUuCisgIC8vLworICBib29sIGlzT3BhcXVlVHkoKSBjb25zdCB7IHJldHVybiBJRCA9PSBPcGFxdWVUeUlEOyB9CisKKyAgLy8vIGlzVmVjdG9yVHkgLSBUcnVlIGlmIHRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgVmVjdG9yVHlwZS4KKyAgLy8vCisgIGJvb2wgaXNWZWN0b3JUeSgpIGNvbnN0IHsgcmV0dXJuIElEID09IFZlY3RvclR5SUQ7IH0KKworICAvLy8gaXNBYnN0cmFjdCAtIFRydWUgaWYgdGhlIHR5cGUgaXMgZWl0aGVyIGFuIE9wYXF1ZSB0eXBlLCBvciBpcyBhIGRlcml2ZWQKKyAgLy8vIHR5cGUgdGhhdCBpbmNsdWRlcyBhbiBvcGFxdWUgdHlwZSBzb21ld2hlcmUgaW4gaXQuCisgIC8vLworICBpbmxpbmUgYm9vbCBpc0Fic3RyYWN0KCkgY29uc3QgeyByZXR1cm4gQWJzdHJhY3Q7IH0KKworICAvLy8gY2FuTG9zc2xlc3NseUJpdENhc3RUbyAtIFJldHVybiB0cnVlIGlmIHRoaXMgdHlwZSBjb3VsZCBiZSBjb252ZXJ0ZWQgCisgIC8vLyB3aXRoIGEgbG9zc2xlc3MgQml0Q2FzdCB0byB0eXBlICdUeScuIEZvciBleGFtcGxlLCBpOCogdG8gaTMyKi4gQml0Q2FzdHMgCisgIC8vLyBhcmUgdmFsaWQgZm9yIHR5cGVzIG9mIHRoZSBzYW1lIHNpemUgb25seSB3aGVyZSBubyByZS1pbnRlcnByZXRhdGlvbiBvZiAKKyAgLy8vIHRoZSBiaXRzIGlzIGRvbmUuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgdHlwZSBjb3VsZCBiZSBsb3NzbGVzc2x5IGJpdGNhc3QgdG8gVHkKKyAgYm9vbCBjYW5Mb3NzbGVzc2x5Qml0Q2FzdFRvKGNvbnN0IFR5cGUgKlR5KSBjb25zdDsKKworCisgIC8vLyBIZXJlIGFyZSBzb21lIHVzZWZ1bCBsaXR0bGUgbWV0aG9kcyB0byBxdWVyeSB3aGF0IHR5cGUgZGVyaXZlZCB0eXBlcyBhcmUKKyAgLy8vIE5vdGUgdGhhdCBhbGwgb3RoZXIgdHlwZXMgY2FuIGp1c3QgY29tcGFyZSB0byBzZWUgaWYgdGhpcyA9PSBUeXBlOjp4eHhUeTsKKyAgLy8vCisgIGlubGluZSBib29sIGlzUHJpbWl0aXZlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIElEIDw9IExhc3RQcmltaXRpdmVUeUlEOyB9CisgIGlubGluZSBib29sIGlzRGVyaXZlZFR5cGUoKSAgIGNvbnN0IHsgcmV0dXJuIElEID49IEZpcnN0RGVyaXZlZFR5SUQ7IH0KKworICAvLy8gaXNGaXJzdENsYXNzVHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzICJmaXJzdCBjbGFzcyIsIG1lYW5pbmcgaXQKKyAgLy8vIGlzIGEgdmFsaWQgdHlwZSBmb3IgYSBWYWx1ZS4KKyAgLy8vCisgIGlubGluZSBib29sIGlzRmlyc3RDbGFzc1R5cGUoKSBjb25zdCB7CisgICAgLy8gVGhlcmUgYXJlIG1vcmUgZmlyc3QtY2xhc3Mga2luZHMgdGhhbiBub24tZmlyc3QtY2xhc3Mga2luZHMsIHNvIGEKKyAgICAvLyBuZWdhdGl2ZSB0ZXN0IGlzIHNpbXBsZXIgdGhhbiBhIHBvc2l0aXZlIG9uZS4KKyAgICByZXR1cm4gSUQgIT0gRnVuY3Rpb25UeUlEICYmIElEICE9IFZvaWRUeUlEICYmIElEICE9IE9wYXF1ZVR5SUQ7CisgIH0KKworICAvLy8gaXNTaW5nbGVWYWx1ZVR5cGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHZhbGlkIHR5cGUgZm9yIGEKKyAgLy8vIHZpcnR1YWwgcmVnaXN0ZXIgaW4gY29kZWdlbi4gIFRoaXMgaW5jbHVkZXMgYWxsIGZpcnN0LWNsYXNzIHR5cGVzCisgIC8vLyBleGNlcHQgc3RydWN0IGFuZCBhcnJheSB0eXBlcy4KKyAgLy8vCisgIGlubGluZSBib29sIGlzU2luZ2xlVmFsdWVUeXBlKCkgY29uc3QgeworICAgIHJldHVybiAoSUQgIT0gVm9pZFR5SUQgJiYgSUQgPD0gTGFzdFByaW1pdGl2ZVR5SUQpIHx8CisgICAgICAgICAgICBJRCA9PSBJbnRlZ2VyVHlJRCB8fCBJRCA9PSBQb2ludGVyVHlJRCB8fCBJRCA9PSBWZWN0b3JUeUlEOworICB9CisKKyAgLy8vIGlzQWdncmVnYXRlVHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIGFuIGFnZ3JlZ2F0ZSB0eXBlLiBUaGlzCisgIC8vLyBtZWFucyBpdCBpcyB2YWxpZCBhcyB0aGUgZmlyc3Qgb3BlcmFuZCBvZiBhbiBpbnNlcnR2YWx1ZSBvcgorICAvLy8gZXh0cmFjdHZhbHVlIGluc3RydWN0aW9uLiBUaGlzIGluY2x1ZGVzIHN0cnVjdCBhbmQgYXJyYXkgdHlwZXMsIGJ1dAorICAvLy8gZG9lcyBub3QgaW5jbHVkZSB2ZWN0b3IgdHlwZXMuCisgIC8vLworICBpbmxpbmUgYm9vbCBpc0FnZ3JlZ2F0ZVR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIElEID09IFN0cnVjdFR5SUQgfHwgSUQgPT0gQXJyYXlUeUlEIHx8IElEID09IFVuaW9uVHlJRDsKKyAgfQorCisgIC8vLyBpc1NpemVkIC0gUmV0dXJuIHRydWUgaWYgaXQgbWFrZXMgc2Vuc2UgdG8gdGFrZSB0aGUgc2l6ZSBvZiB0aGlzIHR5cGUuICBUbworICAvLy8gZ2V0IHRoZSBhY3R1YWwgc2l6ZSBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCwgaXQgaXMgcmVhc29uYWJsZSB0byB1c2UgdGhlCisgIC8vLyBUYXJnZXREYXRhIHN1YnN5c3RlbSB0byBkbyB0aGlzLgorICAvLy8KKyAgYm9vbCBpc1NpemVkKCkgY29uc3QgeworICAgIC8vIElmIGl0J3MgYSBwcmltaXRpdmUsIGl0IGlzIGFsd2F5cyBzaXplZC4KKyAgICBpZiAoSUQgPT0gSW50ZWdlclR5SUQgfHwgaXNGbG9hdGluZ1BvaW50VHkoKSB8fCBJRCA9PSBQb2ludGVyVHlJRCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIC8vIElmIGl0IGlzIG5vdCBzb21ldGhpbmcgdGhhdCBjYW4gaGF2ZSBhIHNpemUgKGUuZy4gYSBmdW5jdGlvbiBvciBsYWJlbCksCisgICAgLy8gaXQgZG9lc24ndCBoYXZlIGEgc2l6ZS4KKyAgICBpZiAoSUQgIT0gU3RydWN0VHlJRCAmJiBJRCAhPSBBcnJheVR5SUQgJiYgSUQgIT0gVmVjdG9yVHlJRCAmJgorICAgICAgICBJRCAhPSBVbmlvblR5SUQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gSWYgaXQgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGhhdmUgYSBzaXplIGFuZCBpdCdzIGNvbmNyZXRlLCBpdCBkZWZpbml0ZWx5CisgICAgLy8gaGFzIGEgc2l6ZSwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gdHJ5IGhhcmRlciB0byBkZWNpZGUuCisgICAgcmV0dXJuICFpc0Fic3RyYWN0KCkgfHwgaXNTaXplZERlcml2ZWRUeXBlKCk7CisgIH0KKworICAvLy8gZ2V0UHJpbWl0aXZlU2l6ZUluQml0cyAtIFJldHVybiB0aGUgYmFzaWMgc2l6ZSBvZiB0aGlzIHR5cGUgaWYgaXQgaXMgYQorICAvLy8gcHJpbWl0aXZlIHR5cGUuICBUaGVzZSBhcmUgZml4ZWQgYnkgTExWTSBhbmQgYXJlIG5vdCB0YXJnZXQgZGVwZW5kZW50LgorICAvLy8gVGhpcyB3aWxsIHJldHVybiB6ZXJvIGlmIHRoZSB0eXBlIGRvZXMgbm90IGhhdmUgYSBzaXplIG9yIGlzIG5vdCBhCisgIC8vLyBwcmltaXRpdmUgdHlwZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBtYXkgbm90IHJlZmxlY3QgdGhlIHNpemUgb2YgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYW4KKyAgLy8vIGluc3RhbmNlIG9mIHRoZSB0eXBlIG9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgd3JpdHRlbiB3aGVuIGFuCisgIC8vLyBpbnN0YW5jZSBvZiB0aGUgdHlwZSBpcyBzdG9yZWQgdG8gbWVtb3J5LiBUaGUgVGFyZ2V0RGF0YSBjbGFzcyBwcm92aWRlcworICAvLy8gYWRkaXRpb25hbCBxdWVyeSBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0UHJpbWl0aXZlU2l6ZUluQml0cygpIGNvbnN0OworCisgIC8vLyBnZXRTY2FsYXJTaXplSW5CaXRzIC0gSWYgdGhpcyBpcyBhIHZlY3RvciB0eXBlLCByZXR1cm4gdGhlCisgIC8vLyBnZXRQcmltaXRpdmVTaXplSW5CaXRzIHZhbHVlIGZvciB0aGUgZWxlbWVudCB0eXBlLiBPdGhlcndpc2UgcmV0dXJuIHRoZQorICAvLy8gZ2V0UHJpbWl0aXZlU2l6ZUluQml0cyB2YWx1ZSBmb3IgdGhpcyB0eXBlLgorICB1bnNpZ25lZCBnZXRTY2FsYXJTaXplSW5CaXRzKCkgY29uc3Q7CisKKyAgLy8vIGdldEZQTWFudGlzc2FXaWR0aCAtIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIG1hbnRpc3NhIG9mIHRoaXMgdHlwZS4gIFRoaXMKKyAgLy8vIGlzIG9ubHkgdmFsaWQgb24gZmxvYXRpbmcgcG9pbnQgdHlwZXMuICBJZiB0aGUgRlAgdHlwZSBkb2VzIG5vdAorICAvLy8gaGF2ZSBhIHN0YWJsZSBtYW50aXNzYSAoZS5nLiBwcGMgbG9uZyBkb3VibGUpLCB0aGlzIG1ldGhvZCByZXR1cm5zIC0xLgorICBpbnQgZ2V0RlBNYW50aXNzYVdpZHRoKCkgY29uc3Q7CisKKyAgLy8vIGdldEZvcndhcmRlZFR5cGUgLSBSZXR1cm4gdGhlIHR5cGUgdGhhdCB0aGlzIHR5cGUgaGFzIGJlZW4gcmVzb2x2ZWQgdG8gaWYKKyAgLy8vIGl0IGhhcyBiZWVuIHJlc29sdmVkIHRvIGFueXRoaW5nLiAgVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUKKyAgLy8vIHVuaW9uLWZpbmQgYWxnb3JpdGhtIGZvciB0eXBlIHJlc29sdXRpb24sIGFuZCBzaG91bGRuJ3QgYmUgdXNlZCBieSBnZW5lcmFsCisgIC8vLyBwdXJwb3NlIGNsaWVudHMuCisgIGNvbnN0IFR5cGUgKmdldEZvcndhcmRlZFR5cGUoKSBjb25zdCB7CisgICAgaWYgKCFGb3J3YXJkVHlwZSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIGdldEZvcndhcmRlZFR5cGVJbnRlcm5hbCgpOworICB9CisKKyAgLy8vIGdldFZBQXJnc1Byb21vdGVkVHlwZSAtIFJldHVybiB0aGUgdHlwZSBhbiBhcmd1bWVudCBvZiB0aGlzIHR5cGUKKyAgLy8vIHdpbGwgYmUgcHJvbW90ZWQgdG8gaWYgcGFzc2VkIHRocm91Z2ggYSB2YXJpYWJsZSBhcmd1bWVudAorICAvLy8gZnVuY3Rpb24uCisgIGNvbnN0IFR5cGUgKmdldFZBQXJnc1Byb21vdGVkVHlwZShMTFZNQ29udGV4dCAmQykgY29uc3Q7IAorCisgIC8vLyBnZXRTY2FsYXJUeXBlIC0gSWYgdGhpcyBpcyBhIHZlY3RvciB0eXBlLCByZXR1cm4gdGhlIGVsZW1lbnQgdHlwZSwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm4gdGhpcy4KKyAgY29uc3QgVHlwZSAqZ2V0U2NhbGFyVHlwZSgpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUeXBlIEl0ZXJhdGlvbiBzdXBwb3J0CisgIC8vCisgIHR5cGVkZWYgUEFUeXBlSGFuZGxlICpzdWJ0eXBlX2l0ZXJhdG9yOworICBzdWJ0eXBlX2l0ZXJhdG9yIHN1YnR5cGVfYmVnaW4oKSBjb25zdCB7IHJldHVybiBDb250YWluZWRUeXM7IH0KKyAgc3VidHlwZV9pdGVyYXRvciBzdWJ0eXBlX2VuZCgpIGNvbnN0IHsgcmV0dXJuICZDb250YWluZWRUeXNbTnVtQ29udGFpbmVkVHlzXTt9CisKKyAgLy8vIGdldENvbnRhaW5lZFR5cGUgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgdHlwZSBpdGVyYXRvcgorICAvLy8gKGRlZmluZWQgYSB0aGUgZW5kIG9mIHRoZSBmaWxlKS4gIEZvciBkZXJpdmVkIHR5cGVzLCB0aGlzIHJldHVybnMgdGhlCisgIC8vLyB0eXBlcyAnY29udGFpbmVkJyBpbiB0aGUgZGVyaXZlZCB0eXBlLgorICAvLy8KKyAgY29uc3QgVHlwZSAqZ2V0Q29udGFpbmVkVHlwZSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOdW1Db250YWluZWRUeXMgJiYgIkluZGV4IG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gQ29udGFpbmVkVHlzW2ldLmdldCgpOworICB9CisKKyAgLy8vIGdldE51bUNvbnRhaW5lZFR5cGVzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgdHlwZXMgaW4gdGhlIGRlcml2ZWQgdHlwZS4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE51bUNvbnRhaW5lZFR5cGVzKCkgY29uc3QgeyByZXR1cm4gTnVtQ29udGFpbmVkVHlzOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFN0YXRpYyBtZW1iZXJzIGV4cG9ydGVkIGJ5IHRoZSBUeXBlIGNsYXNzIGl0c2VsZi4gIFVzZWZ1bCBmb3IgZ2V0dGluZworICAvLyBpbnN0YW5jZXMgb2YgVHlwZS4KKyAgLy8KKworICAvLy8gZ2V0UHJpbWl0aXZlVHlwZSAtIFJldHVybiBhIHR5cGUgYmFzZWQgb24gYW4gaWRlbnRpZmllci4KKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldFByaW1pdGl2ZVR5cGUoTExWTUNvbnRleHQgJkMsIFR5cGVJRCBJRE51bWJlcik7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFRoZXNlIGFyZSB0aGUgYnVpbHRpbiB0eXBlcyB0aGF0IGFyZSBhbHdheXMgYXZhaWxhYmxlLi4uCisgIC8vCisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXRWb2lkVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgY29uc3QgVHlwZSAqZ2V0TGFiZWxUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXRGbG9hdFR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldERvdWJsZVR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldE1ldGFkYXRhVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgY29uc3QgVHlwZSAqZ2V0WDg2X0ZQODBUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBjb25zdCBUeXBlICpnZXRGUDEyOFR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIGNvbnN0IFR5cGUgKmdldFBQQ19GUDEyOFR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIGNvbnN0IEludGVnZXJUeXBlICpnZXRJbnROVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIE4pOworICBzdGF0aWMgY29uc3QgSW50ZWdlclR5cGUgKmdldEludDFUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBjb25zdCBJbnRlZ2VyVHlwZSAqZ2V0SW50OFR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIGNvbnN0IEludGVnZXJUeXBlICpnZXRJbnQxNlR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIGNvbnN0IEludGVnZXJUeXBlICpnZXRJbnQzMlR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIGNvbnN0IEludGVnZXJUeXBlICpnZXRJbnQ2NFR5KExMVk1Db250ZXh0ICZDKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZ2V0dGluZyBwb2ludGVyIHR5cGVzIHdpdGggb25lIG9mIHRoZSBhYm92ZSBidWlsdGluCisgIC8vIHR5cGVzIGFzIHBvaW50ZWUuCisgIC8vCisgIHN0YXRpYyBjb25zdCBQb2ludGVyVHlwZSAqZ2V0RmxvYXRQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIGNvbnN0IFBvaW50ZXJUeXBlICpnZXREb3VibGVQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIGNvbnN0IFBvaW50ZXJUeXBlICpnZXRYODZfRlA4MFB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgY29uc3QgUG9pbnRlclR5cGUgKmdldEZQMTI4UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBjb25zdCBQb2ludGVyVHlwZSAqZ2V0UFBDX0ZQMTI4UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBjb25zdCBQb2ludGVyVHlwZSAqZ2V0SW50TlB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgY29uc3QgUG9pbnRlclR5cGUgKmdldEludDFQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIGNvbnN0IFBvaW50ZXJUeXBlICpnZXRJbnQ4UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBjb25zdCBQb2ludGVyVHlwZSAqZ2V0SW50MTZQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIGNvbnN0IFBvaW50ZXJUeXBlICpnZXRJbnQzMlB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgY29uc3QgUG9pbnRlclR5cGUgKmdldEludDY0UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZvaWQgYWRkUmVmKCkgY29uc3QgeworICAgIGFzc2VydChpc0Fic3RyYWN0KCkgJiYgIkNhbm5vdCBhZGQgYSByZWZlcmVuY2UgdG8gYSBub24tYWJzdHJhY3QgdHlwZSEiKTsKKyAgICArK1JlZkNvdW50OworICB9CisKKyAgdm9pZCBkcm9wUmVmKCkgY29uc3QgeworICAgIGFzc2VydChpc0Fic3RyYWN0KCkgJiYgIkNhbm5vdCBkcm9wIGEgcmVmZXJlbmNlIHRvIGEgbm9uLWFic3RyYWN0IHR5cGUhIik7CisgICAgYXNzZXJ0KFJlZkNvdW50ICYmICJObyBvYmplY3RzIGFyZSBjdXJyZW50bHkgcmVmZXJlbmNpbmcgdGhpcyBvYmplY3QhIik7CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IFBBVHlwZUhvbGRlciB1c2luZyB0aGlzIG9iamVjdCwgYW5kIHRoZXJlIGFyZSBubworICAgIC8vIFBBVHlwZUhhbmRsZXMgdXNpbmcgaXQsIHRoZSB0eXBlIGlzIGRlYWQsIGRlbGV0ZSBpdCBub3cuCisgICAgaWYgKC0tUmVmQ291bnQgPT0gMCAmJiBBYnN0cmFjdFR5cGVVc2Vycy5lbXB0eSgpKQorICAgICAgdGhpcy0+ZGVzdHJveSgpOworICB9CisgIAorICAvLy8gYWRkQWJzdHJhY3RUeXBlVXNlciAtIE5vdGlmeSBhbiBhYnN0cmFjdCB0eXBlIHRoYXQgdGhlcmUgaXMgYSBuZXcgdXNlciBvZgorICAvLy8gaXQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwcmltYXJpbHkgYnkgdGhlIFBBVHlwZUhhbmRsZSBjbGFzcy4KKyAgLy8vCisgIHZvaWQgYWRkQWJzdHJhY3RUeXBlVXNlcihBYnN0cmFjdFR5cGVVc2VyICpVKSBjb25zdDsKKyAgCisgIC8vLyByZW1vdmVBYnN0cmFjdFR5cGVVc2VyIC0gTm90aWZ5IGFuIGFic3RyYWN0IHR5cGUgdGhhdCBhIHVzZXIgb2YgdGhlIGNsYXNzCisgIC8vLyBubyBsb25nZXIgaGFzIGEgaGFuZGxlIHRvIHRoZSB0eXBlLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcHJpbWFyaWx5IGJ5CisgIC8vLyB0aGUgUEFUeXBlSGFuZGxlIGNsYXNzLiAgV2hlbiB0aGVyZSBhcmUgbm8gdXNlcnMgb2YgdGhlIGFic3RyYWN0IHR5cGUsIGl0CisgIC8vLyBpcyBhbm5paGlsYXRlZCwgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIGl0IGV2ZXIKKyAgLy8vIGFnYWluLgorICAvLy8KKyAgdm9pZCByZW1vdmVBYnN0cmFjdFR5cGVVc2VyKEFic3RyYWN0VHlwZVVzZXIgKlUpIGNvbnN0OworCisgIC8vLyBnZXRQb2ludGVyVG8gLSBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHR5cGUuICBUaGlzIGlzIGVxdWl2YWxlbnQKKyAgLy8vIHRvIFBvaW50ZXJUeXBlOjpnZXQoRm9vLCBBZGRyU3BhY2UpLgorICBjb25zdCBQb2ludGVyVHlwZSAqZ2V0UG9pbnRlclRvKHVuc2lnbmVkIEFkZHJTcGFjZSA9IDApIGNvbnN0OworCitwcml2YXRlOgorICAvLy8gaXNTaXplZERlcml2ZWRUeXBlIC0gRGVyaXZlZCB0eXBlcyBsaWtlIHN0cnVjdHVyZXMgYW5kIGFycmF5cyBhcmUgc2l6ZWQKKyAgLy8vIGlmZiBhbGwgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIHR5cGUgYXJlIHNpemVkIGFzIHdlbGwuICBTaW5jZSBhc2tpbmcgZm9yCisgIC8vLyB0aGVpciBzaXplIGlzIHJlbGF0aXZlbHkgdW5jb21tb24sIG1vdmUgdGhpcyBvcGVyYXRpb24gb3V0IG9mIGxpbmUuCisgIGJvb2wgaXNTaXplZERlcml2ZWRUeXBlKCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIHJlZmluZUFic3RyYWN0VHlwZShjb25zdCBEZXJpdmVkVHlwZSAqT2xkVHksIGNvbnN0IFR5cGUgKk5ld1R5KTsKKyAgdmlydHVhbCB2b2lkIHR5cGVCZWNhbWVDb25jcmV0ZShjb25zdCBEZXJpdmVkVHlwZSAqQWJzVHkpOworCitwcm90ZWN0ZWQ6CisgIC8vIFByb21vdGVBYnN0cmFjdFRvQ29uY3JldGUgLSBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIHRvIGNhbGN1bGF0ZQorICAvLyBjaGFuZ2UgIkFic3RyYWN0IiBmcm9tIHRydWUgdG8gZmFsc2Ugd2hlbiB0eXBlcyBhcmUgcmVmaW5lZC4KKyAgdm9pZCBQcm9tb3RlQWJzdHJhY3RUb0NvbmNyZXRlKCk7CisgIGZyaWVuZCBjbGFzcyBUeXBlTWFwQmFzZTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWZpbmUgc29tZSBpbmxpbmUgbWV0aG9kcyBmb3IgdGhlIEFic3RyYWN0VHlwZVVzZXIuaDpQQVR5cGVIYW5kbGUgY2xhc3MuCisvLyBUaGVzZSBhcmUgZGVmaW5lZCBoZXJlIGJlY2F1c2UgdGhleSBNVVNUIGJlIGlubGluZWQsIHlldCBhcmUgZGVwZW5kZW50IG9uCisvLyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgVHlwZSBjbGFzcy4KKy8vCitpbmxpbmUgdm9pZCBQQVR5cGVIYW5kbGU6OmFkZFVzZXIoKSB7CisgIGFzc2VydChUeSAmJiAiVHlwZSBIYW5kbGUgaGFzIGEgbnVsbCB0eXBlISIpOworICBpZiAoVHktPmlzQWJzdHJhY3QoKSkKKyAgICBUeS0+YWRkQWJzdHJhY3RUeXBlVXNlcihVc2VyKTsKK30KK2lubGluZSB2b2lkIFBBVHlwZUhhbmRsZTo6cmVtb3ZlVXNlcigpIHsKKyAgaWYgKFR5LT5pc0Fic3RyYWN0KCkpCisgICAgVHktPnJlbW92ZUFic3RyYWN0VHlwZVVzZXIoVXNlcik7Cit9CisKKy8vIERlZmluZSBpbmxpbmUgbWV0aG9kcyBmb3IgUEFUeXBlSG9sZGVyLgorCisvLy8gZ2V0IC0gVGhpcyBpbXBsZW1lbnRzIHRoZSBmb3J3YXJkaW5nIHBhcnQgb2YgdGhlIHVuaW9uLWZpbmQgYWxnb3JpdGhtIGZvcgorLy8vIGFic3RyYWN0IHR5cGVzLiAgQmVmb3JlIGV2ZXJ5IGFjY2VzcyB0byB0aGUgVHlwZSosIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUKKy8vLyB0eXBlIHdlIGFyZSBwb2ludGluZyB0byBpcyBmb3J3YXJkaW5nIHRvIGEgbmV3IHR5cGUuICBJZiBzbywgd2UgZHJvcCBvdXIKKy8vLyByZWZlcmVuY2UgdG8gdGhlIHR5cGUuCisvLy8KK2lubGluZSBUeXBlKiBQQVR5cGVIb2xkZXI6OmdldCgpIGNvbnN0IHsKKyAgaWYgKFR5ID09IDApIHJldHVybiAwOworICBjb25zdCBUeXBlICpOZXdUeSA9IFR5LT5nZXRGb3J3YXJkZWRUeXBlKCk7CisgIGlmICghTmV3VHkpIHJldHVybiBjb25zdF9jYXN0PFR5cGUqPihUeSk7CisgIHJldHVybiAqY29uc3RfY2FzdDxQQVR5cGVIb2xkZXIqPih0aGlzKSA9IE5ld1R5OworfQorCitpbmxpbmUgdm9pZCBQQVR5cGVIb2xkZXI6OmFkZFJlZigpIHsKKyAgaWYgKFR5ICYmIFR5LT5pc0Fic3RyYWN0KCkpCisgICAgVHktPmFkZFJlZigpOworfQorCitpbmxpbmUgdm9pZCBQQVR5cGVIb2xkZXI6OmRyb3BSZWYoKSB7CisgIGlmIChUeSAmJiBUeS0+aXNBYnN0cmFjdCgpKQorICAgIFR5LT5kcm9wUmVmKCk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYSB0eXBlIGFzIGEKKy8vIGdyYXBoIG9mIHN1YiB0eXBlcy4uLgorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8VHlwZSo+IHsKKyAgdHlwZWRlZiBUeXBlIE5vZGVUeXBlOworICB0eXBlZGVmIFR5cGU6OnN1YnR5cGVfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisKKyAgc3RhdGljIGlubGluZSBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKFR5cGUgKlQpIHsgcmV0dXJuIFQ7IH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSAqTikgeworICAgIHJldHVybiBOLT5zdWJ0eXBlX2JlZ2luKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTi0+c3VidHlwZV9lbmQoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IFR5cGUqPiB7CisgIHR5cGVkZWYgY29uc3QgVHlwZSBOb2RlVHlwZTsKKyAgdHlwZWRlZiBUeXBlOjpzdWJ0eXBlX2l0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgTm9kZVR5cGUgKmdldEVudHJ5Tm9kZShjb25zdCBUeXBlICpUKSB7IHJldHVybiBUOyB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsKKyAgICByZXR1cm4gTi0+c3VidHlwZV9iZWdpbigpOworICB9CisgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7CisgICAgcmV0dXJuIE4tPnN1YnR5cGVfZW5kKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxQb2ludGVyVHlwZSwgVHlwZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBUeXBlICZUeSkgeworICAgIHJldHVybiBUeS5nZXRUeXBlSUQoKSA9PSBUeXBlOjpQb2ludGVyVHlJRDsKKyAgfQorfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBUeXBlICZUKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHlwZVN5bWJvbFRhYmxlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVHlwZVN5bWJvbFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiMWRiZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9UeXBlU3ltYm9sVGFibGUuaApAQCAtMCwwICsxLDE1MyBAQAorLy89PT0tLSBsbHZtL1R5cGVTeW1ib2xUYWJsZS5oIC0gSW1wbGVtZW50IGEgVHlwZSBTeW10YWIgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbmFtZS90eXBlIHN5bWJvbCB0YWJsZSBmb3IgTExWTS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFlQRV9TWU1CT0xfVEFCTEVfSAorI2RlZmluZSBMTFZNX1RZUEVfU1lNQk9MX1RBQkxFX0gKKworI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTdHJpbmdSZWY7CisKKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc3ltYm9sIHRhYmxlIG9mIG5hbWUvdHlwZSBwYWlycyB3aXRoIG9wZXJhdGlvbnMgdG8KKy8vLyBzdXBwb3J0IGNvbnN0cnVjdGluZywgc2VhcmNoaW5nIGFuZCBpdGVyYXRpbmcgb3ZlciB0aGUgc3ltYm9sIHRhYmxlLiBUaGUKKy8vLyBjbGFzcyBkZXJpdmVzIGZyb20gQWJzdHJhY3RUeXBlVXNlciBzbyB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgc3ltYm9sCisvLy8gdGFibGUgY2FuIGJlIHVwZGF0ZWQgd2hlbiBhYnN0cmFjdCB0eXBlcyBiZWNvbWUgY29uY3JldGUuCitjbGFzcyBUeXBlU3ltYm9sVGFibGUgOiBwdWJsaWMgQWJzdHJhY3RUeXBlVXNlciB7CisKKy8vLyBAbmFtZSBUeXBlcworLy8vIEB7CitwdWJsaWM6CisKKyAgLy8vIEBicmllZiBBIG1hcHBpbmcgb2YgbmFtZXMgdG8gdHlwZXMuCisgIHR5cGVkZWYgc3RkOjptYXA8Y29uc3Qgc3RkOjpzdHJpbmcsIGNvbnN0IFR5cGUqPiBUeXBlTWFwOworCisgIC8vLyBAYnJpZWYgQW4gaXRlcmF0b3Igb3ZlciB0aGUgVHlwZU1hcC4KKyAgdHlwZWRlZiBUeXBlTWFwOjppdGVyYXRvciBpdGVyYXRvcjsKKworICAvLy8gQGJyaWVmIEEgY29uc3RfaXRlcmF0b3Igb3ZlciB0aGUgVHlwZU1hcC4KKyAgdHlwZWRlZiBUeXBlTWFwOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworLy8vIEB9CisvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisvLy8gQHsKK3B1YmxpYzoKKworICBUeXBlU3ltYm9sVGFibGUoKTpMYXN0VW5pcXVlKDApIHt9CisgIH5UeXBlU3ltYm9sVGFibGUoKTsKKworLy8vIEB9CisvLy8gQG5hbWUgQWNjZXNzb3JzCisvLy8gQHsKK3B1YmxpYzoKKworICAvLy8gR2VuZXJhdGVzIGEgdW5pcXVlIG5hbWUgZm9yIGEgdHlwZSBiYXNlZCBvbiB0aGUgXHAgQmFzZU5hbWUgYnkKKyAgLy8vIGluY3JlbWVudGluZyBhbiBpbnRlZ2VyIGFuZCBhcHBlbmRpbmcgaXQgdG8gdGhlIG5hbWUsIGlmIG5lY2Vzc2FyeQorICAvLy8gQHJldHVybnMgdGhlIHVuaXF1ZSBuYW1lCisgIC8vLyBAYnJpZWYgR2V0IGEgdW5pcXVlIG5hbWUgZm9yIGEgdHlwZQorICBzdGQ6OnN0cmluZyBnZXRVbmlxdWVOYW1lKFN0cmluZ1JlZiBCYXNlTmFtZSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGZpbmRzIHRoZSB0eXBlIHdpdGggdGhlIGdpdmVuIFxwIG5hbWUgaW4gdGhlIHR5cGUgbWFwCisgIC8vLyBhbmQgcmV0dXJucyBpdC4KKyAgLy8vIEByZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kLCBvdGhlcndpc2UgdGhlIFR5cGUKKyAgLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgXHAgbmFtZS4KKyAgLy8vIEBicmllZiBMb29rdXAgYSB0eXBlIGJ5IG5hbWUuCisgIFR5cGUgKmxvb2t1cChTdHJpbmdSZWYgbmFtZSkgY29uc3Q7CisKKyAgLy8vIExvb2t1cCB0aGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggbmFtZS4KKyAgLy8vIEByZXR1cm5zIGVuZCgpIGlmIHRoZSBuYW1lIGlzIG5vdCBmb3VuZCwgb3IgYW4gaXRlcmF0b3IgYXQgdGhlIGVudHJ5IGZvcgorICAvLy8gVHlwZS4KKyAgaXRlcmF0b3IgZmluZChTdHJpbmdSZWYgTmFtZSkgeworICAgIHJldHVybiB0bWFwLmZpbmQoTmFtZSk7CisgIH0KKworICAvLy8gTG9va3VwIHRoZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBuYW1lLgorICAvLy8gQHJldHVybnMgZW5kKCkgaWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kLCBvciBhbiBpdGVyYXRvciBhdCB0aGUgZW50cnkgZm9yCisgIC8vLyBUeXBlLgorICBjb25zdF9pdGVyYXRvciBmaW5kKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIHRtYXAuZmluZChOYW1lKTsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGUgc3ltYm9sIHRhYmxlIGlzIGVtcHR5LgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgc3ltYm9sIHRhYmxlIGlzIGVtcHR5CisgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gdG1hcC5lbXB0eSgpOyB9CisKKyAgLy8vIEByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdGFibGUKKyAgLy8vIEBicmllZiBUaGUgbnVtYmVyIG9mIG5hbWUvdHlwZSBwYWlycyBpcyByZXR1cm5lZC4KKyAgaW5saW5lIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiB1bnNpZ25lZCh0bWFwLnNpemUoKSk7IH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmcm9tIHRoZSBkZWJ1Z2dlciB0byBkaXNwbGF5IHRoZQorICAvLy8gY29udGVudCBvZiB0aGUgc3ltYm9sIHRhYmxlIHdoaWxlIGRlYnVnZ2luZy4KKyAgLy8vIEBicmllZiBQcmludCBvdXQgc3ltYm9sIHRhYmxlIG9uIHN0ZGVycgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgSXRlcmF0aW9uCisvLy8gQHsKK3B1YmxpYzoKKyAgLy8vIEdldCBhbiBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlIHN5bWJvbCB0YWJsZQorICBpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB0bWFwLmJlZ2luKCk7IH0KKworICAvLy8gQGJyaWVmIEdldCBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZSBzdGFydCBvZiB0aGUgc3ltYm9sIHRhYmxlCisgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHRtYXAuYmVnaW4oKTsgfQorCisgIC8vLyBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLgorICBpbmxpbmUgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gdG1hcC5lbmQoKTsgfQorCisgIC8vLyBHZXQgYSBjb25zdF9pdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUuCisgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiB0bWFwLmVuZCgpOyB9CisKKy8vLyBAfQorLy8vIEBuYW1lIE11dGF0b3JzCisvLy8gQHsKK3B1YmxpYzoKKworICAvLy8gSW5zZXJ0cyBhIHR5cGUgaW50byB0aGUgc3ltYm9sIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGVyZSBjYW4gYmUKKyAgLy8vIGEgbWFueS10by1vbmUgbWFwcGluZyBiZXR3ZWVuIG5hbWVzIGFuZCB0eXBlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGEgdHlwZQorICAvLy8gd2l0aCBhbiBleGlzdGluZyBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlIHRvIGdldCBhIG5ldyBuYW1lLgorICAvLy8gQGJyaWVmIEluc2VydCBhIHR5cGUgdW5kZXIgYSBuZXcgbmFtZS4KKyAgdm9pZCBpbnNlcnQoU3RyaW5nUmVmIE5hbWUsIGNvbnN0IFR5cGUgKlR5cCk7CisKKyAgLy8vIFJlbW92ZSBhIHR5cGUgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLgorICAvLy8gQHJldHVybnMgdGhlIHJlbW92ZWQgVHlwZS4KKyAgLy8vIEByZXR1cm5zIHRoZSBUeXBlIHRoYXQgd2FzIGVyYXNlZCBmcm9tIHRoZSBzeW1ib2wgdGFibGUuCisgIFR5cGUqIHJlbW92ZShpdGVyYXRvciBUSSk7CisKKy8vLyBAfQorLy8vIEBuYW1lIEFic3RyYWN0VHlwZVVzZXIgTWV0aG9kcworLy8vIEB7Citwcml2YXRlOgorICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBvbmUgb2YgdGhlIHR5cGVzIGluIHRoZSB0eXBlIHBsYW5lCisgIC8vLyBpcyByZWZpbmVkLgorICB2aXJ0dWFsIHZvaWQgcmVmaW5lQWJzdHJhY3RUeXBlKGNvbnN0IERlcml2ZWRUeXBlICpPbGRUeSwgY29uc3QgVHlwZSAqTmV3VHkpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIG1hcmtlcyBhIHR5cGUgYXMgYmVpbmcgY29uY3JldGUgKGRlZmluZWQpLgorICB2aXJ0dWFsIHZvaWQgdHlwZUJlY2FtZUNvbmNyZXRlKGNvbnN0IERlcml2ZWRUeXBlICpBYnNUeSk7CisKKy8vLyBAfQorLy8vIEBuYW1lIEludGVybmFsIERhdGEKKy8vLyBAeworcHJpdmF0ZToKKyAgVHlwZU1hcCB0bWFwOyAvLy88IFRoaXMgaXMgdGhlIG1hcHBpbmcgb2YgbmFtZXMgdG8gdHlwZXMuCisgIG11dGFibGUgdWludDMyX3QgTGFzdFVuaXF1ZTsgLy8vPCBDb3VudGVyIGZvciB0cmFja2luZyB1bmlxdWUgbmFtZXMKKworLy8vIEB9CisKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1VzZS5oIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1VzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZWJjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVXNlLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8vPT09LS0gbGx2bS9Vc2UuaCAtIERlZmluaXRpb24gb2YgdGhlIFVzZSBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBkZWZpbmVzIHRoZSBVc2UgY2xhc3MuICBUaGUgVXNlIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9wZXJhbmQgb2YgYW4KKy8vIGluc3RydWN0aW9uIG9yIHNvbWUgb3RoZXIgVXNlciBpbnN0YW5jZSB3aGljaCByZWZlcnMgdG8gYSBWYWx1ZS4gIFRoZSBVc2UKKy8vIGNsYXNzIGtlZXBzIHRoZSAidXNlIGxpc3QiIG9mIHRoZSByZWZlcmVuY2VkIHZhbHVlIHVwIHRvIGRhdGUuCisvLworLy8gUG9pbnRlciB0YWdnaW5nIGlzIHVzZWQgdG8gZWZmaWNpZW50bHkgZmluZCB0aGUgVXNlciBjb3JyZXNwb25kaW5nCisvLyB0byBhIFVzZSB3aXRob3V0IGhhdmluZyB0byBzdG9yZSBhIFVzZXIgcG9pbnRlciBpbiBldmVyeSBVc2UuIEEKKy8vIFVzZXIgaXMgcHJlY2VkZWQgaW4gbWVtb3J5IGJ5IGFsbCB0aGUgVXNlcyBjb3JyZXNwb25kaW5nIHRvIGl0cworLy8gb3BlcmFuZHMsIGFuZCB0aGUgbG93IGJpdHMgb2Ygb25lIG9mIHRoZSBmaWVsZHMgKFByZXYpIG9mIHRoZSBVc2UKKy8vIGNsYXNzIGFyZSB1c2VkIHRvIGVuY29kZSBvZmZzZXRzIHRvIGJlIGFibGUgdG8gZmluZCB0aGF0IFVzZXIgZ2l2ZW4KKy8vIGEgcG9pbnRlciB0byBhbnkgVXNlLiBGb3IgZGV0YWlscywgc2VlOgorLy8KKy8vICAgaHR0cDovL3d3dy5sbHZtLm9yZy9kb2NzL1Byb2dyYW1tZXJzTWFudWFsLmh0bWwjVXNlckxheW91dAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9VU0VfSAorI2RlZmluZSBMTFZNX1VTRV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBWYWx1ZTsKK2NsYXNzIFVzZXI7CitjbGFzcyBVc2U7CisKKy8vLyBUYWcgLSBnZW5lcmljIHRhZyB0eXBlIGZvciAoYXQgbGVhc3QgMzIgYml0KSBwb2ludGVycworZW51bSBUYWcgeyBub1RhZywgdGFnT25lLCB0YWdUd28sIHRhZ1RocmVlIH07CisKKy8vIFVzZSoqIGlzIG9ubHkgNC1ieXRlIGFsaWduZWQuCit0ZW1wbGF0ZTw+CitjbGFzcyBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VXNlKio+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFVzZSoqIFApIHsgcmV0dXJuIFA7IH0KKyAgc3RhdGljIGlubGluZSBVc2UgKipnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxVc2UqKj4oUCk7CisgIH0KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAyIH07Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVXNlIGlzIGhlcmUgdG8gbWFrZSBrZWVwaW5nIHRoZSAidXNlIiBsaXN0IG9mIGEgVmFsdWUgdXAtdG8tZGF0ZSByZWFsbHkKKy8vLyBlYXN5LgorY2xhc3MgVXNlIHsKK3B1YmxpYzoKKyAgLy8vIHN3YXAgLSBwcm92aWRlIGEgZmFzdCBzdWJzdGl0dXRlIHRvIHN0ZDo6c3dhcDxVc2U+CisgIC8vLyB0aGF0IGFsc28gd29ya3Mgd2l0aCBsZXNzIHN0YW5kYXJkLWNvbXBsaWFudCBjb21waWxlcnMKKyAgdm9pZCBzd2FwKFVzZSAmUkhTKTsKKworcHJpdmF0ZToKKyAgLy8vIENvcHkgY3RvciAtIGRvIG5vdCBpbXBsZW1lbnQKKyAgVXNlKGNvbnN0IFVzZSAmVSk7CisKKyAgLy8vIERlc3RydWN0b3IgLSBPbmx5IGZvciB6YXAoKQorICBpbmxpbmUgflVzZSgpIHsKKyAgICBpZiAoVmFsKSByZW1vdmVGcm9tTGlzdCgpOworICB9CisKKyAgLy8vIERlZmF1bHQgY3RvciAtIFRoaXMgbGVhdmVzIHRoZSBVc2UgY29tcGxldGVseSB1bmluaXRpYWxpemVkLiAgVGhlIG9ubHkKKyAgLy8vIHRoaW5nIHRoYXQgaXMgdmFsaWQgdG8gZG8gd2l0aCB0aGlzIHVzZSBpcyB0byBjYWxsIHRoZSAiaW5pdCIgbWV0aG9kLgorICBpbmxpbmUgVXNlKCkge30KKyAgZW51bSBQcmV2UHRyVGFnIHsgemVyb0RpZ2l0VGFnID0gbm9UYWcKKyAgICAgICAgICAgICAgICAgICwgb25lRGlnaXRUYWcgPSB0YWdPbmUKKyAgICAgICAgICAgICAgICAgICwgc3RvcFRhZyA9IHRhZ1R3bworICAgICAgICAgICAgICAgICAgLCBmdWxsU3RvcFRhZyA9IHRhZ1RocmVlIH07CisKK3B1YmxpYzoKKyAgLy8vIE5vcm1hbGx5IFVzZSB3aWxsIGp1c3QgaW1wbGljaXRseSBjb252ZXJ0IHRvIGEgVmFsdWUqIHRoYXQgaXQgaG9sZHMuCisgIG9wZXJhdG9yIFZhbHVlKigpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorICAKKyAgLy8vIElmIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVmFsdWUqIGRvZXNuJ3Qgd29yaywgdGhlIGdldCgpIG1ldGhvZCByZXR1cm5zCisgIC8vLyB0aGUgVmFsdWUqLgorICBWYWx1ZSAqZ2V0KCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisgIAorICAvLy8gZ2V0VXNlciAtIFRoaXMgcmV0dXJucyB0aGUgVXNlciB0aGF0IGNvbnRhaW5zIHRoaXMgVXNlLiAgRm9yIGFuCisgIC8vLyBpbnN0cnVjdGlvbiBvcGVyYW5kLCBmb3IgZXhhbXBsZSwgdGhpcyB3aWxsIHJldHVybiB0aGUgaW5zdHJ1Y3Rpb24uCisgIFVzZXIgKmdldFVzZXIoKSBjb25zdDsKKworICBpbmxpbmUgdm9pZCBzZXQoVmFsdWUgKlZhbCk7CisKKyAgVmFsdWUgKm9wZXJhdG9yPShWYWx1ZSAqUkhTKSB7CisgICAgc2V0KFJIUyk7CisgICAgcmV0dXJuIFJIUzsKKyAgfQorICBjb25zdCBVc2UgJm9wZXJhdG9yPShjb25zdCBVc2UgJlJIUykgeworICAgIHNldChSSFMuVmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAgICAgICBWYWx1ZSAqb3BlcmF0b3ItPigpICAgICAgIHsgcmV0dXJuIFZhbDsgfQorICBjb25zdCBWYWx1ZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgIFVzZSAqZ2V0TmV4dCgpIGNvbnN0IHsgcmV0dXJuIE5leHQ7IH0KKworICAKKyAgLy8vIHphcCAtIFRoaXMgaXMgdXNlZCB0byBkZXN0cm95IFVzZSBvcGVyYW5kcyB3aGVuIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgb2YKKyAgLy8vIGEgVXNlciBjaGFuZ2VzLgorICBzdGF0aWMgdm9pZCB6YXAoVXNlICpTdGFydCwgY29uc3QgVXNlICpTdG9wLCBib29sIGRlbCA9IGZhbHNlKTsKKworICAvLy8gZ2V0UHJlZml4IC0gUmV0dXJuIGRlbGV0YWJsZSBwb2ludGVyIGlmIGFwcHJvcHJpYXRlCisgIFVzZSAqZ2V0UHJlZml4KCk7Citwcml2YXRlOgorICBjb25zdCBVc2UqIGdldEltcGxpZWRVc2VyKCkgY29uc3Q7CisgIHN0YXRpYyBVc2UgKmluaXRUYWdzKFVzZSAqU3RhcnQsIFVzZSAqU3RvcCwgcHRyZGlmZl90IERvbmUgPSAwKTsKKyAgCisgIFZhbHVlICpWYWw7CisgIFVzZSAqTmV4dDsKKyAgUG9pbnRlckludFBhaXI8VXNlKiosIDIsIFByZXZQdHJUYWc+IFByZXY7CisKKyAgdm9pZCBzZXRQcmV2KFVzZSAqKk5ld1ByZXYpIHsKKyAgICBQcmV2LnNldFBvaW50ZXIoTmV3UHJldik7CisgIH0KKyAgdm9pZCBhZGRUb0xpc3QoVXNlICoqTGlzdCkgeworICAgIE5leHQgPSAqTGlzdDsKKyAgICBpZiAoTmV4dCkgTmV4dC0+c2V0UHJldigmTmV4dCk7CisgICAgc2V0UHJldihMaXN0KTsKKyAgICAqTGlzdCA9IHRoaXM7CisgIH0KKyAgdm9pZCByZW1vdmVGcm9tTGlzdCgpIHsKKyAgICBVc2UgKipTdHJpcHBlZFByZXYgPSBQcmV2LmdldFBvaW50ZXIoKTsKKyAgICAqU3RyaXBwZWRQcmV2ID0gTmV4dDsKKyAgICBpZiAoTmV4dCkgTmV4dC0+c2V0UHJldihTdHJpcHBlZFByZXYpOworICB9CisKKyAgZnJpZW5kIGNsYXNzIFZhbHVlOworICBmcmllbmQgY2xhc3MgVXNlcjsKK307CisKKy8vIHNpbXBsaWZ5X3R5cGUgLSBBbGxvdyBjbGllbnRzIHRvIHRyZWF0IHVzZXMganVzdCBsaWtlIHZhbHVlcyB3aGVuIHVzaW5nCisvLyBjYXN0aW5nIG9wZXJhdG9ycy4KK3RlbXBsYXRlPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8VXNlPiB7CisgIHR5cGVkZWYgVmFsdWUqIFNpbXBsZVR5cGU7CisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBVc2UgJlZhbCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTaW1wbGVUeXBlPihWYWwuZ2V0KCkpOworICB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBVc2U+IHsKKyAgdHlwZWRlZiBWYWx1ZSogU2ltcGxlVHlwZTsKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IFVzZSAmVmFsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNpbXBsZVR5cGU+KFZhbC5nZXQoKSk7CisgIH0KK307CisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBVc2VyVHk+ICAvLyBVc2VyVHkgPT0gJ1VzZXInIG9yICdjb25zdCBVc2VyJworY2xhc3MgdmFsdWVfdXNlX2l0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJUeSosIHB0cmRpZmZfdD4geworICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgVXNlclR5KiwgcHRyZGlmZl90PiBzdXBlcjsKKyAgdHlwZWRlZiB2YWx1ZV91c2VfaXRlcmF0b3I8VXNlclR5PiBfU2VsZjsKKworICBVc2UgKlU7CisgIGV4cGxpY2l0IHZhbHVlX3VzZV9pdGVyYXRvcihVc2UgKnUpIDogVSh1KSB7fQorICBmcmllbmQgY2xhc3MgVmFsdWU7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXI6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXI6OnBvaW50ZXIgcG9pbnRlcjsKKworICB2YWx1ZV91c2VfaXRlcmF0b3IoY29uc3QgX1NlbGYgJkkpIDogVShJLlUpIHt9CisgIHZhbHVlX3VzZV9pdGVyYXRvcigpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9TZWxmICZ4KSBjb25zdCB7CisgICAgcmV0dXJuIFUgPT0geC5VOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfU2VsZiAmeCkgY29uc3QgeworICAgIHJldHVybiAhb3BlcmF0b3I9PSh4KTsKKyAgfQorCisgIC8vLyBhdEVuZCAtIHJldHVybiB0cnVlIGlmIHRoaXMgaXRlcmF0b3IgaXMgZXF1YWwgdG8gdXNlX2VuZCgpIG9uIHRoZSB2YWx1ZS4KKyAgYm9vbCBhdEVuZCgpIGNvbnN0IHsgcmV0dXJuIFUgPT0gMDsgfQorCisgIC8vIEl0ZXJhdG9yIHRyYXZlcnNhbDogZm9yd2FyZCBpdGVyYXRpb24gb25seQorICBfU2VsZiAmb3BlcmF0b3IrKygpIHsgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgYXNzZXJ0KFUgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgIFUgPSBVLT5nZXROZXh0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7ICAgICAgICAvLyBQb3N0aW5jcmVtZW50CisgICAgX1NlbGYgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KKworICAvLyBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgVXNlci4KKyAgVXNlclR5ICpvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KFUgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBlbmQgaXRlcmF0b3IhIik7CisgICAgcmV0dXJuIFUtPmdldFVzZXIoKTsKKyAgfQorCisgIFVzZXJUeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisKKyAgVXNlICZnZXRVc2UoKSBjb25zdCB7IHJldHVybiAqVTsgfQorICAKKyAgLy8vIGdldE9wZXJhbmRObyAtIFJldHVybiB0aGUgb3BlcmFuZCAjIG9mIHRoaXMgdXNlIGluIGl0cyBVc2VyLiAgRGVmaW5lZCBpbgorICAvLy8gVXNlci5oCisgIC8vLworICB1bnNpZ25lZCBnZXRPcGVyYW5kTm8oKSBjb25zdDsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1VzZXIuaCBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Vc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyNzc5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9Vc2VyLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8vPT09LS0gbGx2bS9Vc2VyLmggLSBVc2VyIGNsYXNzIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdGhhdCBvbmUgd2hvICd1c2UncyBhIFZhbHVlIG11c3QgaW1wbGVtZW50LgorLy8gRWFjaCBpbnN0YW5jZSBvZiB0aGUgVmFsdWUgY2xhc3Mga2VlcHMgdHJhY2sgb2Ygd2hhdCBVc2VyJ3MgaGF2ZSBoYW5kbGVzCisvLyB0byBpdC4KKy8vCisvLyAgKiBJbnN0cnVjdGlvbnMgYXJlIHRoZSBsYXJnZXN0IGNsYXNzIG9mIFVzZXIncy4KKy8vICAqIENvbnN0YW50cyBtYXkgYmUgdXNlcnMgb2Ygb3RoZXIgY29uc3RhbnRzICh0aGluayBhcnJheXMgYW5kIHN0dWZmKQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9VU0VSX0gKKyNkZWZpbmUgTExWTV9VU0VSX0gKKworI2luY2x1ZGUgImxsdm0vVmFsdWUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gT3BlcmFuZFRyYWl0cyAtIENvbXBpbGUtdGltZSBjdXN0b21pemF0aW9uIG9mCisvLy8gb3BlcmFuZC1yZWxhdGVkIGFsbG9jYXRvcnMgYW5kIGFjY2Vzc29ycworLy8vIGZvciB1c2Ugb2YgdGhlIFVzZXIgY2xhc3MKK3RlbXBsYXRlIDxjbGFzcz4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzOworCitjbGFzcyBVc2VyOworCisvLy8gT3BlcmFuZFRyYWl0czxVc2VyPiAtIHNwZWNpYWxpemF0aW9uIHRvIFVzZXIKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxVc2VyPiB7CisgIHN0YXRpYyBpbmxpbmUgVXNlICpvcF9iZWdpbihVc2VyKik7CisgIHN0YXRpYyBpbmxpbmUgVXNlICpvcF9lbmQoVXNlciopOworICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIG9wZXJhbmRzKGNvbnN0IFVzZXIqKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFU+CisgIHN0cnVjdCBMYXlvdXQgeworICAgIHR5cGVkZWYgVSBvdmVybGF5OworICB9OworfTsKKworY2xhc3MgVXNlciA6IHB1YmxpYyBWYWx1ZSB7CisgIFVzZXIoY29uc3QgVXNlciAmKTsgICAgICAgICAgICAgLy8gRG8gbm90IGltcGxlbWVudAorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90KTsgICAgIC8vIERvIG5vdCBpbXBsZW1lbnQKKyAgdGVtcGxhdGUgPHVuc2lnbmVkPgorICBmcmllbmQgc3RydWN0IEh1bmdvZmZPcGVyYW5kVHJhaXRzOworcHJvdGVjdGVkOgorICAvLy8gT3BlcmFuZExpc3QgLSBUaGlzIGlzIGEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgVXNlcyBmb3IgdGhpcyBVc2VyLgorICAvLy8gRm9yIG5vZGVzIG9mIGZpeGVkIGFyaXR5IChlLmcuIGEgYmluYXJ5IG9wZXJhdG9yKSB0aGlzIGFycmF5IHdpbGwgbGl2ZQorICAvLy8gcHJlZml4ZWQgdG8gc29tZSBkZXJpdmVkIGNsYXNzIGluc3RhbmNlLiAgRm9yIG5vZGVzIG9mIHJlc2l6YWJsZSB2YXJpYWJsZQorICAvLy8gYXJpdHkgKGUuZy4gUEhJTm9kZXMsIFN3aXRjaEluc3QgZXRjLiksIHRoaXMgbWVtb3J5IHdpbGwgYmUgZHluYW1pY2FsbHkKKyAgLy8vIGFsbG9jYXRlZCBhbmQgc2hvdWxkIGJlIGRlc3Ryb3llZCBieSB0aGUgY2xhc3NlcycgdmlydHVhbCBkdG9yLgorICBVc2UgKk9wZXJhbmRMaXN0OworCisgIC8vLyBOdW1PcGVyYW5kcyAtIFRoZSBudW1iZXIgb2YgdmFsdWVzIHVzZWQgYnkgdGhpcyBVc2VyLgorICAvLy8KKyAgdW5zaWduZWQgTnVtT3BlcmFuZHM7CisKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzLCB1bnNpZ25lZCBVcyk7CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcywgdW5zaWduZWQgVXMsIGJvb2wgUHJlZml4KTsKKyAgVXNlcihjb25zdCBUeXBlICp0eSwgdW5zaWduZWQgdnR5LCBVc2UgKk9wTGlzdCwgdW5zaWduZWQgTnVtT3BzKQorICAgIDogVmFsdWUodHksIHZ0eSksIE9wZXJhbmRMaXN0KE9wTGlzdCksIE51bU9wZXJhbmRzKE51bU9wcykge30KKyAgVXNlICphbGxvY0h1bmdvZmZVc2VzKHVuc2lnbmVkKSBjb25zdDsKKyAgdm9pZCBkcm9wSHVuZ29mZlVzZXMoVXNlICpVKSB7CisgICAgaWYgKE9wZXJhbmRMaXN0ID09IFUpIHsKKyAgICAgIE9wZXJhbmRMaXN0ID0gMDsKKyAgICAgIE51bU9wZXJhbmRzID0gMDsKKyAgICB9CisgICAgVXNlOjp6YXAoVSwgVS0+Z2V0SW1wbGllZFVzZXIoKSwgdHJ1ZSk7CisgIH0KK3B1YmxpYzoKKyAgflVzZXIoKSB7CisgICAgaWYgKChpbnRwdHJfdChPcGVyYW5kTGlzdCkgJiAxKSA9PSAwKQorICAgICAgVXNlOjp6YXAoT3BlcmFuZExpc3QsIE9wZXJhbmRMaXN0ICsgTnVtT3BlcmFuZHMpOworICB9CisgIC8vLyBvcGVyYXRvciBkZWxldGUgLSBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIFVzZXIgYW5kIFVzZSBvYmplY3RzCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKlVzcik7CisgIC8vLyBwbGFjZW1lbnQgZGVsZXRlIC0gcmVxdWlyZWQgYnkgc3RkLCBidXQgbmV2ZXIgY2FsbGVkLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgdW5zaWduZWQpIHsKKyAgICBhc3NlcnQoMCAmJiAiQ29uc3RydWN0b3IgdGhyb3dzPyIpOworICB9CisgIC8vLyBwbGFjZW1lbnQgZGVsZXRlIC0gcmVxdWlyZWQgYnkgc3RkLCBidXQgbmV2ZXIgY2FsbGVkLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgdW5zaWduZWQsIGJvb2wpIHsKKyAgICBhc3NlcnQoMCAmJiAiQ29uc3RydWN0b3IgdGhyb3dzPyIpOworICB9Citwcm90ZWN0ZWQ6CisgIHRlbXBsYXRlIDxpbnQgSWR4LCB0eXBlbmFtZSBVPiBzdGF0aWMgVXNlICZPcEZyb20oY29uc3QgVSAqdGhhdCkgeworICAgIHJldHVybiBJZHggPCAwCisgICAgICA/IE9wZXJhbmRUcmFpdHM8VT46Om9wX2VuZChjb25zdF9jYXN0PFUqPih0aGF0KSlbSWR4XQorICAgICAgOiBPcGVyYW5kVHJhaXRzPFU+OjpvcF9iZWdpbihjb25zdF9jYXN0PFUqPih0aGF0KSlbSWR4XTsKKyAgfQorICB0ZW1wbGF0ZSA8aW50IElkeD4gVXNlICZPcCgpIHsKKyAgICByZXR1cm4gT3BGcm9tPElkeD4odGhpcyk7CisgIH0KKyAgdGVtcGxhdGUgPGludCBJZHg+IGNvbnN0IFVzZSAmT3AoKSBjb25zdCB7CisgICAgcmV0dXJuIE9wRnJvbTxJZHg+KHRoaXMpOworICB9CitwdWJsaWM6CisgIFZhbHVlICpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE51bU9wZXJhbmRzICYmICJnZXRPcGVyYW5kKCkgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBPcGVyYW5kTGlzdFtpXTsKKyAgfQorICB2b2lkIHNldE9wZXJhbmQodW5zaWduZWQgaSwgVmFsdWUgKlZhbCkgeworICAgIGFzc2VydChpIDwgTnVtT3BlcmFuZHMgJiYgInNldE9wZXJhbmQoKSBvdXQgb2YgcmFuZ2UhIik7CisgICAgYXNzZXJ0KCghaXNhPENvbnN0YW50PigoY29uc3QgVmFsdWUqKXRoaXMpIHx8CisgICAgICAgICAgICBpc2E8R2xvYmFsVmFsdWU+KChjb25zdCBWYWx1ZSopdGhpcykpICYmCisgICAgICAgICAgICJDYW5ub3QgbXV0YXRlIGEgY29uc3RhbnQgd2l0aCBzZXRPcGVyYW5kISIpOworICAgIE9wZXJhbmRMaXN0W2ldID0gVmFsOworICB9CisgIGNvbnN0IFVzZSAmZ2V0T3BlcmFuZFVzZSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOdW1PcGVyYW5kcyAmJiAiZ2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gT3BlcmFuZExpc3RbaV07CisgIH0KKyAgVXNlICZnZXRPcGVyYW5kVXNlKHVuc2lnbmVkIGkpIHsKKyAgICBhc3NlcnQoaSA8IE51bU9wZXJhbmRzICYmICJnZXRPcGVyYW5kKCkgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBPcGVyYW5kTGlzdFtpXTsKKyAgfQorICAKKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBOdW1PcGVyYW5kczsgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBPcGVyYW5kIEl0ZXJhdG9yIGludGVyZmFjZS4uLgorICAvLworICB0eXBlZGVmIFVzZSogICAgICAgb3BfaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgVXNlKiBjb25zdF9vcF9pdGVyYXRvcjsKKworICBpbmxpbmUgb3BfaXRlcmF0b3IgICAgICAgb3BfYmVnaW4oKSAgICAgICB7IHJldHVybiBPcGVyYW5kTGlzdDsgfQorICBpbmxpbmUgY29uc3Rfb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSBjb25zdCB7IHJldHVybiBPcGVyYW5kTGlzdDsgfQorICBpbmxpbmUgb3BfaXRlcmF0b3IgICAgICAgb3BfZW5kKCkgICAgICAgICB7IHJldHVybiBPcGVyYW5kTGlzdCtOdW1PcGVyYW5kczsgfQorICBpbmxpbmUgY29uc3Rfb3BfaXRlcmF0b3Igb3BfZW5kKCkgICBjb25zdCB7IHJldHVybiBPcGVyYW5kTGlzdCtOdW1PcGVyYW5kczsgfQorCisgIC8vIGRyb3BBbGxSZWZlcmVuY2VzKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGluIGNoYXJnZSBvZiAibGV0dGluZyBnbyIgb2YgYWxsCisgIC8vIG9iamVjdHMgdGhhdCB0aGlzIFVzZXIgcmVmZXJzIHRvLiAgVGhpcyBhbGxvd3Mgb25lIHRvCisgIC8vICdkZWxldGUnIGEgd2hvbGUgY2xhc3MgYXQgYSB0aW1lLCBldmVuIHRob3VnaCB0aGVyZSBtYXkgYmUgY2lyY3VsYXIKKyAgLy8gcmVmZXJlbmNlcy4uLiAgRmlyc3QgYWxsIHJlZmVyZW5jZXMgYXJlIGRyb3BwZWQsIGFuZCBhbGwgdXNlIGNvdW50cyBnbyB0bworICAvLyB6ZXJvLiAgVGhlbiBldmVyeXRoaW5nIGlzIGRlbGV0ZWQgZm9yIHJlYWwuICBOb3RlIHRoYXQgbm8gb3BlcmF0aW9ucyBhcmUKKyAgLy8gdmFsaWQgb24gYW4gb2JqZWN0IHRoYXQgaGFzICJkcm9wcGVkIGFsbCByZWZlcmVuY2VzIiwgZXhjZXB0IG9wZXJhdG9yCisgIC8vIGRlbGV0ZS4KKyAgLy8KKyAgdm9pZCBkcm9wQWxsUmVmZXJlbmNlcygpIHsKKyAgICBmb3IgKG9wX2l0ZXJhdG9yIGkgPSBvcF9iZWdpbigpLCBlID0gb3BfZW5kKCk7IGkgIT0gZTsgKytpKQorICAgICAgaS0+c2V0KDApOworICB9CisKKyAgLy8vIHJlcGxhY2VVc2VzT2ZXaXRoIC0gUmVwbGFjZXMgYWxsIHJlZmVyZW5jZXMgdG8gdGhlICJGcm9tIiBkZWZpbml0aW9uIHdpdGgKKyAgLy8vIHJlZmVyZW5jZXMgdG8gdGhlICJUbyIgZGVmaW5pdGlvbi4KKyAgLy8vCisgIHZvaWQgcmVwbGFjZVVzZXNPZldpdGgoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVXNlciAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgfHwgaXNhPENvbnN0YW50PihWKTsKKyAgfQorfTsKKworaW5saW5lIFVzZSAqT3BlcmFuZFRyYWl0czxVc2VyPjo6b3BfYmVnaW4oVXNlciAqVSkgeworICByZXR1cm4gVS0+b3BfYmVnaW4oKTsKK30KKworaW5saW5lIFVzZSAqT3BlcmFuZFRyYWl0czxVc2VyPjo6b3BfZW5kKFVzZXIgKlUpIHsKKyAgcmV0dXJuIFUtPm9wX2VuZCgpOworfQorCitpbmxpbmUgdW5zaWduZWQgT3BlcmFuZFRyYWl0czxVc2VyPjo6b3BlcmFuZHMoY29uc3QgVXNlciAqVSkgeworICByZXR1cm4gVS0+Z2V0TnVtT3BlcmFuZHMoKTsKK30KKwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxVc2VyOjpvcF9pdGVyYXRvcj4geworICB0eXBlZGVmIFZhbHVlKiBTaW1wbGVUeXBlOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBVc2VyOjpvcF9pdGVyYXRvciAmVmFsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNpbXBsZVR5cGU+KFZhbC0+Z2V0KCkpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFVzZXI6Om9wX2l0ZXJhdG9yPgorICA6IHB1YmxpYyBzaW1wbGlmeV90eXBlPFVzZXI6Om9wX2l0ZXJhdG9yPiB7fTsKKwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxVc2VyOjpjb25zdF9vcF9pdGVyYXRvcj4geworICB0eXBlZGVmIFZhbHVlKiBTaW1wbGVUeXBlOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBVc2VyOjpjb25zdF9vcF9pdGVyYXRvciAmVmFsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNpbXBsZVR5cGU+KFZhbC0+Z2V0KCkpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yPgorICA6IHB1YmxpYyBzaW1wbGlmeV90eXBlPFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yPiB7fTsKKworCisvLyB2YWx1ZV91c2VfaXRlcmF0b3I6OmdldE9wZXJhbmRObyAtIFJlcXVpcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBVc2VyIGNsYXNzLgordGVtcGxhdGU8dHlwZW5hbWUgVXNlclR5PgordW5zaWduZWQgdmFsdWVfdXNlX2l0ZXJhdG9yPFVzZXJUeT46OmdldE9wZXJhbmRObygpIGNvbnN0IHsKKyAgcmV0dXJuIFUgLSBVLT5nZXRVc2VyKCktPm9wX2JlZ2luKCk7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1ZhbHVlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzMwNjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vaW5jbHVkZS9sbHZtL1ZhbHVlLmgKQEAgLTAsMCArMSw0MTAgQEAKKy8vPT09LS0gbGx2bS9WYWx1ZS5oIC0gRGVmaW5pdGlvbiBvZiB0aGUgVmFsdWUgY2xhc3MgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBWYWx1ZSBjbGFzcy4gCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1ZBTFVFX0gKKyNkZWZpbmUgTExWTV9WQUxVRV9ICisKKyNpbmNsdWRlICJsbHZtL0Fic3RyYWN0VHlwZVVzZXIuaCIKKyNpbmNsdWRlICJsbHZtL1VzZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbnN0YW50OworY2xhc3MgQXJndW1lbnQ7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBHbG9iYWxBbGlhczsKK2NsYXNzIElubGluZUFzbTsKK2NsYXNzIFZhbHVlU3ltYm9sVGFibGU7CitjbGFzcyBUeXBlU3ltYm9sVGFibGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5PiBjbGFzcyBTdHJpbmdNYXBFbnRyeTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5ID0gVmFsdWU+CitjbGFzcyBBc3NlcnRpbmdWSDsKK3R5cGVkZWYgU3RyaW5nTWFwRW50cnk8VmFsdWUqPiBWYWx1ZU5hbWU7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlcjsKK2NsYXNzIFZhbHVlSGFuZGxlQmFzZTsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgVHdpbmU7CitjbGFzcyBNRE5vZGU7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBpcyBhIHZlcnkgaW1wb3J0YW50IExMVk0gY2xhc3MuIEl0IGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCB2YWx1ZXMgCisvLy8gY29tcHV0ZWQgYnkgYSBwcm9ncmFtIHRoYXQgbWF5IGJlIHVzZWQgYXMgb3BlcmFuZHMgdG8gb3RoZXIgdmFsdWVzLiBWYWx1ZSBpcworLy8vIHRoZSBzdXBlciBjbGFzcyBvZiBvdGhlciBpbXBvcnRhbnQgY2xhc3NlcyBzdWNoIGFzIEluc3RydWN0aW9uIGFuZCBGdW5jdGlvbi4KKy8vLyBBbGwgVmFsdWVzIGhhdmUgYSBUeXBlLiBUeXBlIGlzIG5vdCBhIHN1YmNsYXNzIG9mIFZhbHVlLiBBbGwgdHlwZXMgY2FuIGhhdmUKKy8vLyBhIG5hbWUgYW5kIHRoZXkgc2hvdWxkIGJlbG9uZyB0byBzb21lIE1vZHVsZS4gU2V0dGluZyB0aGUgbmFtZSBvbiB0aGUgVmFsdWUKKy8vLyBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIG1vZHVsZSdzIHN5bWJvbCB0YWJsZS4KKy8vLworLy8vIEV2ZXJ5IHZhbHVlIGhhcyBhICJ1c2UgbGlzdCIgdGhhdCBrZWVwcyB0cmFjayBvZiB3aGljaCBvdGhlciBWYWx1ZXMgYXJlCisvLy8gdXNpbmcgdGhpcyBWYWx1ZS4gIEEgVmFsdWUgY2FuIGFsc28gaGF2ZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFZhbHVlSGFuZGxlCisvLy8gb2JqZWN0cyB0aGF0IHdhdGNoIGl0IGFuZCBsaXN0ZW4gdG8gUkFVVyBhbmQgRGVzdHJveSBldmVudHMuICBTZWUKKy8vLyBsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCBmb3IgZGV0YWlscy4KKy8vLworLy8vIEBicmllZiBMTFZNIFZhbHVlIFJlcHJlc2VudGF0aW9uCitjbGFzcyBWYWx1ZSB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgU3ViY2xhc3NJRDsgICAvLyBTdWJjbGFzcyBpZGVudGlmaWVyIChmb3IgaXNhL2R5bl9jYXN0KQorICB1bnNpZ25lZCBjaGFyIEhhc1ZhbHVlSGFuZGxlIDogMTsgLy8gSGFzIGEgVmFsdWVIYW5kbGUgcG9pbnRpbmcgdG8gdGhpcz8KK3Byb3RlY3RlZDoKKyAgLy8vIFN1YmNsYXNzT3B0aW9uYWxEYXRhIC0gVGhpcyBtZW1iZXIgaXMgc2ltaWxhciB0byBTdWJjbGFzc0RhdGEsIGhvd2V2ZXIgaXQKKyAgLy8vIGlzIGZvciBob2xkaW5nIGluZm9ybWF0aW9uIHdoaWNoIG1heSBiZSB1c2VkIHRvIGFpZCBvcHRpbWl6YXRpb24sIGJ1dAorICAvLy8gd2hpY2ggbWF5IGJlIGNsZWFyZWQgdG8gemVybyB3aXRob3V0IGFmZmVjdGluZyBjb25zZXJ2YXRpdmUKKyAgLy8vIGludGVycHJldGF0aW9uLgorICB1bnNpZ25lZCBjaGFyIFN1YmNsYXNzT3B0aW9uYWxEYXRhIDogNzsKKworcHJpdmF0ZToKKyAgLy8vIFN1YmNsYXNzRGF0YSAtIFRoaXMgbWVtYmVyIGlzIGRlZmluZWQgYnkgdGhpcyBjbGFzcywgYnV0IGlzIG5vdCB1c2VkIGZvcgorICAvLy8gYW55dGhpbmcuICBTdWJjbGFzc2VzIGNhbiB1c2UgaXQgdG8gaG9sZCB3aGF0ZXZlciBzdGF0ZSB0aGV5IGZpbmQgdXNlZnVsLgorICAvLy8gVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCB0byB6ZXJvIGJ5IHRoZSBjdG9yLgorICB1bnNpZ25lZCBzaG9ydCBTdWJjbGFzc0RhdGE7CisKKyAgUEFUeXBlSG9sZGVyIFZUeTsKKyAgVXNlICpVc2VMaXN0OworCisgIGZyaWVuZCBjbGFzcyBWYWx1ZVN5bWJvbFRhYmxlOyAvLyBBbGxvdyBWYWx1ZVN5bWJvbFRhYmxlIHRvIGRpcmVjdGx5IG1vZCBOYW1lLgorICBmcmllbmQgY2xhc3MgVmFsdWVIYW5kbGVCYXNlOworICBmcmllbmQgY2xhc3MgQWJzdHJhY3RUeXBlVXNlcjsKKyAgVmFsdWVOYW1lICpOYW1lOworCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlICYpOyAgICAgLy8gRG8gbm90IGltcGxlbWVudAorICBWYWx1ZShjb25zdCBWYWx1ZSAmKTsgICAgICAgICAgICAgIC8vIERvIG5vdCBpbXBsZW1lbnQKKworcHJvdGVjdGVkOgorICAvLy8gcHJpbnRDdXN0b20gLSBWYWx1ZSBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGltcGxlbWVudCBjdXN0b20KKyAgLy8vIHByaW50aW5nIGJlaGF2aW9yLgorICB2aXJ0dWFsIHZvaWQgcHJpbnRDdXN0b20ocmF3X29zdHJlYW0gJk8pIGNvbnN0OworCisgIFZhbHVlKGNvbnN0IFR5cGUgKlR5LCB1bnNpZ25lZCBzY2lkKTsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VmFsdWUoKTsKKworICAvLy8gZHVtcCAtIFN1cHBvcnQgZm9yIGRlYnVnZ2luZywgY2FsbGFibGUgaW4gR0RCOiBWLT5kdW1wKCkKKyAgLy8KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIHByaW50IC0gSW1wbGVtZW50IG9wZXJhdG9yPDwgb24gVmFsdWUuCisgIC8vLworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBBc3NlbWJseUFubm90YXRpb25Xcml0ZXIgKkFBVyA9IDApIGNvbnN0OworCisgIC8vLyBBbGwgdmFsdWVzIGFyZSB0eXBlZCwgZ2V0IHRoZSB0eXBlIG9mIHRoaXMgdmFsdWUuCisgIC8vLworICBpbmxpbmUgY29uc3QgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFZUeTsgfQorCisgIC8vLyBBbGwgdmFsdWVzIGhvbGQgYSBjb250ZXh0IHRocm91Z2ggdGhlaXIgdHlwZS4KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdDsKKworICAvLyBBbGwgdmFsdWVzIGNhbiBwb3RlbnRpYWxseSBiZSBuYW1lZC4uLgorICBpbmxpbmUgYm9vbCBoYXNOYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZSAhPSAwOyB9CisgIFZhbHVlTmFtZSAqZ2V0VmFsdWVOYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICAKKyAgLy8vIGdldE5hbWUoKSAtIFJldHVybiBhIGNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgdmFsdWUncyBuYW1lLiBUaGlzIGlzIGNoZWFwCisgIC8vLyBhbmQgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgcmVmZXJlbmNlIGFzIGxvbmcgYXMgdGhlIHZhbHVlIGlzIG5vdAorICAvLy8gbW9kaWZpZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyBjdXJyZW50bHkgZ3VhcmFudGVlZCB0byByZXR1cm4gYSBTdHJpbmdSZWYgZm9yIHdoaWNoIGRhdGEoKSBwb2ludHMKKyAgLy8vIHRvIGEgdmFsaWQgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4gVGhlIHVzZSBvZiBTdHJpbmdSZWYuZGF0YSgpIGlzIAorICAvLy8gZGVwcmVjYXRlZCBoZXJlLCBob3dldmVyLCBhbmQgY2xpZW50cyBzaG91bGQgbm90IHJlbHkgb24gaXQuIElmIHN1Y2ggCisgIC8vLyBiZWhhdmlvciBpcyBuZWVkZWQsIGNsaWVudHMgc2hvdWxkIHVzZSBleHBlbnNpdmUgZ2V0TmFtZVN0cigpLCBvciBzd2l0Y2ggCisgIC8vLyB0byBhbiBpbnRlcmZhY2UgdGhhdCBkb2VzIG5vdCBkZXBlbmQgb24gbnVsbCB0ZXJtaW5hdGlvbi4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdDsKKworICAvLy8gZ2V0TmFtZVN0cigpIC0gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsICpjb25zdHJ1Y3RpbmcgYQorICAvLy8gc3RyaW5nKiB0byBob2xkIGl0LiAgVGhpcyBpcyBndWFyYW50ZWVkIHRvIGNvbnN0cnVjdCBhIHN0cmluZyBhbmQgaXMgdmVyeQorICAvLy8gZXhwZW5zaXZlLCBjbGllbnRzIHNob3VsZCB1c2UgZ2V0TmFtZSgpIHVubGVzcyBuZWNlc3NhcnkuCisgIHN0ZDo6c3RyaW5nIGdldE5hbWVTdHIoKSBjb25zdDsKKworICAvLy8gc2V0TmFtZSgpIC0gQ2hhbmdlIHRoZSBuYW1lIG9mIHRoZSB2YWx1ZSwgY2hvb3NpbmcgYSBuZXcgdW5pcXVlIG5hbWUgaWYKKyAgLy8vIHRoZSBwcm92aWRlZCBuYW1lIGlzIHRha2VuLgorICAvLy8KKyAgLy8vIFxhcmcgTmFtZSAtIFRoZSBuZXcgbmFtZTsgb3IgIiIgaWYgdGhlIHZhbHVlJ3MgbmFtZSBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgdm9pZCBzZXROYW1lKGNvbnN0IFR3aW5lICZOYW1lKTsKKworICAKKyAgLy8vIHRha2VOYW1lIC0gdHJhbnNmZXIgdGhlIG5hbWUgZnJvbSBWIHRvIHRoaXMgdmFsdWUsIHNldHRpbmcgVidzIG5hbWUgdG8KKyAgLy8vIGVtcHR5LiAgSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBWLT50YWtlTmFtZShWKS4gCisgIHZvaWQgdGFrZU5hbWUoVmFsdWUgKlYpOworCisgIC8vLyByZXBsYWNlQWxsVXNlc1dpdGggLSBHbyB0aHJvdWdoIHRoZSB1c2VzIGxpc3QgZm9yIHRoaXMgZGVmaW5pdGlvbiBhbmQgbWFrZQorICAvLy8gZWFjaCB1c2UgcG9pbnQgdG8gIlYiIGluc3RlYWQgb2YgInRoaXMiLiAgQWZ0ZXIgdGhpcyBjb21wbGV0ZXMsICd0aGlzJ3MKKyAgLy8vIHVzZSBsaXN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgZW1wdHkuCisgIC8vLworICB2b2lkIHJlcGxhY2VBbGxVc2VzV2l0aChWYWx1ZSAqVik7CisKKyAgLy8gdW5jaGVja2VkUmVwbGFjZUFsbFVzZXNXaXRoIC0gSnVzdCBsaWtlIHJlcGxhY2VBbGxVc2VzV2l0aCBidXQgZGFuZ2Vyb3VzLgorICAvLyBPbmx5IHVzZSB3aGVuIGluIHR5cGUgcmVzb2x1dGlvbiBzaXR1YXRpb25zIQorICB2b2lkIHVuY2hlY2tlZFJlcGxhY2VBbGxVc2VzV2l0aChWYWx1ZSAqVik7CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1ldGhvZHMgZm9yIGhhbmRsaW5nIHRoZSBjaGFpbiBvZiB1c2VzIG9mIHRoaXMgVmFsdWUuCisgIC8vCisgIHR5cGVkZWYgdmFsdWVfdXNlX2l0ZXJhdG9yPFVzZXI+ICAgICAgIHVzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB2YWx1ZV91c2VfaXRlcmF0b3I8Y29uc3QgVXNlcj4gY29uc3RfdXNlX2l0ZXJhdG9yOworCisgIGJvb2wgICAgICAgICAgICAgICB1c2VfZW1wdHkoKSBjb25zdCB7IHJldHVybiBVc2VMaXN0ID09IDA7IH0KKyAgdXNlX2l0ZXJhdG9yICAgICAgIHVzZV9iZWdpbigpICAgICAgIHsgcmV0dXJuIHVzZV9pdGVyYXRvcihVc2VMaXN0KTsgfQorICBjb25zdF91c2VfaXRlcmF0b3IgdXNlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfdXNlX2l0ZXJhdG9yKFVzZUxpc3QpOyB9CisgIHVzZV9pdGVyYXRvciAgICAgICB1c2VfZW5kKCkgICAgICAgICB7IHJldHVybiB1c2VfaXRlcmF0b3IoMCk7ICAgfQorICBjb25zdF91c2VfaXRlcmF0b3IgdXNlX2VuZCgpICAgY29uc3QgeyByZXR1cm4gY29uc3RfdXNlX2l0ZXJhdG9yKDApOyAgIH0KKyAgVXNlciAgICAgICAgICAgICAgKnVzZV9iYWNrKCkgICAgICAgIHsgcmV0dXJuICp1c2VfYmVnaW4oKTsgfQorICBjb25zdCBVc2VyICAgICAgICAqdXNlX2JhY2soKSAgY29uc3QgeyByZXR1cm4gKnVzZV9iZWdpbigpOyB9CisKKyAgLy8vIGhhc09uZVVzZSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIHVzZXIgb2YgdGhpcyB2YWx1ZS4gIFRoaXMKKyAgLy8vIGlzIHNwZWNpYWxpemVkIGJlY2F1c2UgaXQgaXMgYSBjb21tb24gcmVxdWVzdCBhbmQgZG9lcyBub3QgcmVxdWlyZQorICAvLy8gdHJhdmVyc2luZyB0aGUgd2hvbGUgdXNlIGxpc3QuCisgIC8vLworICBib29sIGhhc09uZVVzZSgpIGNvbnN0IHsKKyAgICBjb25zdF91c2VfaXRlcmF0b3IgSSA9IHVzZV9iZWdpbigpLCBFID0gdXNlX2VuZCgpOworICAgIGlmIChJID09IEUpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gKytJID09IEU7CisgIH0KKworICAvLy8gaGFzTlVzZXMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFZhbHVlIGhhcyBleGFjdGx5IE4gdXNlcnMuCisgIC8vLworICBib29sIGhhc05Vc2VzKHVuc2lnbmVkIE4pIGNvbnN0OworCisgIC8vLyBoYXNOVXNlc09yTW9yZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgdmFsdWUgaGFzIE4gdXNlcnMgb3IgbW9yZS4gIFRoaXMgaXMKKyAgLy8vIGxvZ2ljYWxseSBlcXVpdmFsZW50IHRvIGdldE51bVVzZXMoKSA+PSBOLgorICAvLy8KKyAgYm9vbCBoYXNOVXNlc09yTW9yZSh1bnNpZ25lZCBOKSBjb25zdDsKKworICBib29sIGlzVXNlZEluQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIGdldE51bVVzZXMgLSBUaGlzIG1ldGhvZCBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgdGhpcyBWYWx1ZS4gIFRoaXMKKyAgLy8vIGlzIGEgbGluZWFyIHRpbWUgb3BlcmF0aW9uLiAgVXNlIGhhc09uZVVzZSwgaGFzTlVzZXMsIG9yIGhhc01vcmVUaGFuTlVzZXMKKyAgLy8vIHRvIGNoZWNrIGZvciBzcGVjaWZpYyB2YWx1ZXMuCisgIHVuc2lnbmVkIGdldE51bVVzZXMoKSBjb25zdDsKKworICAvLy8gYWRkVXNlIC0gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgVXNlIGNsYXNzLgorICAvLy8KKyAgdm9pZCBhZGRVc2UoVXNlICZVKSB7IFUuYWRkVG9MaXN0KCZVc2VMaXN0KTsgfQorCisgIC8vLyBBbiBlbnVtZXJhdGlvbiBmb3Iga2VlcGluZyB0cmFjayBvZiB0aGUgY29uY3JldGUgc3ViY2xhc3Mgb2YgVmFsdWUgdGhhdAorICAvLy8gaXMgYWN0dWFsbHkgaW5zdGFudGlhdGVkLiBWYWx1ZXMgb2YgdGhpcyBlbnVtZXJhdGlvbiBhcmUga2VwdCBpbiB0aGUgCisgIC8vLyBWYWx1ZSBjbGFzc2VzIFN1YmNsYXNzSUQgZmllbGQuIFRoZXkgYXJlIHVzZWQgZm9yIGNvbmNyZXRlIHR5cGUKKyAgLy8vIGlkZW50aWZpY2F0aW9uLgorICBlbnVtIFZhbHVlVHkgeworICAgIEFyZ3VtZW50VmFsLCAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBBcmd1bWVudAorICAgIEJhc2ljQmxvY2tWYWwsICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBCYXNpY0Jsb2NrCisgICAgRnVuY3Rpb25WYWwsICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIEZ1bmN0aW9uCisgICAgR2xvYmFsQWxpYXNWYWwsICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIEdsb2JhbEFsaWFzCisgICAgR2xvYmFsVmFyaWFibGVWYWwsICAgICAgICAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIEdsb2JhbFZhcmlhYmxlCisgICAgVW5kZWZWYWx1ZVZhbCwgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIFVuZGVmVmFsdWUKKyAgICBCbG9ja0FkZHJlc3NWYWwsICAgICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgQmxvY2tBZGRyZXNzCisgICAgQ29uc3RhbnRFeHByVmFsLCAgICAgICAgICAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIENvbnN0YW50RXhwcgorICAgIENvbnN0YW50QWdncmVnYXRlWmVyb1ZhbCwgLy8gVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBDb25zdGFudEFnZ3JlZ2F0ZVplcm8KKyAgICBDb25zdGFudEludFZhbCwgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgQ29uc3RhbnRJbnQKKyAgICBDb25zdGFudEZQVmFsLCAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgQ29uc3RhbnRGUAorICAgIENvbnN0YW50QXJyYXlWYWwsICAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBDb25zdGFudEFycmF5CisgICAgQ29uc3RhbnRTdHJ1Y3RWYWwsICAgICAgICAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIENvbnN0YW50U3RydWN0CisgICAgQ29uc3RhbnRVbmlvblZhbCwgICAgICAgICAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIENvbnN0YW50VW5pb24KKyAgICBDb25zdGFudFZlY3RvclZhbCwgICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgQ29uc3RhbnRWZWN0b3IKKyAgICBDb25zdGFudFBvaW50ZXJOdWxsVmFsLCAgIC8vIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgQ29uc3RhbnRQb2ludGVyTnVsbAorICAgIE1ETm9kZVZhbCwgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBNRE5vZGUKKyAgICBNRFN0cmluZ1ZhbCwgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgTURTdHJpbmcKKyAgICBJbmxpbmVBc21WYWwsICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgSW5saW5lQXNtCisgICAgUHNldWRvU291cmNlVmFsdWVWYWwsICAgICAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIFBzZXVkb1NvdXJjZVZhbHVlCisgICAgRml4ZWRTdGFja1BzZXVkb1NvdXJjZVZhbHVlVmFsLCAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZWRTdGFja1BzZXVkb1NvdXJjZVZhbHVlCisgICAgSW5zdHJ1Y3Rpb25WYWwsICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIEluc3RydWN0aW9uCisgICAgLy8gRW51bSB2YWx1ZXMgc3RhcnRpbmcgYXQgSW5zdHJ1Y3Rpb25WYWwgYXJlIHVzZWQgZm9yIEluc3RydWN0aW9uczsKKyAgICAvLyBkb24ndCBhZGQgbmV3IHZhbHVlcyBoZXJlIQorCisgICAgLy8gTWFya2VyczoKKyAgICBDb25zdGFudEZpcnN0VmFsID0gRnVuY3Rpb25WYWwsCisgICAgQ29uc3RhbnRMYXN0VmFsICA9IENvbnN0YW50UG9pbnRlck51bGxWYWwKKyAgfTsKKworICAvLy8gZ2V0VmFsdWVJRCAtIFJldHVybiBhbiBJRCBmb3IgdGhlIGNvbmNyZXRlIHR5cGUgb2YgdGhpcyBvYmplY3QuICBUaGlzIGlzCisgIC8vLyB1c2VkIHRvIGltcGxlbWVudCB0aGUgY2xhc3NvZiBjaGVja3MuICBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYW55CisgIC8vLyBvdGhlciBwdXJwb3NlLCBhcyB0aGUgdmFsdWVzIG1heSBjaGFuZ2UgYXMgTExWTSBldm9sdmVzLiAgQWxzbywgbm90ZSB0aGF0CisgIC8vLyBmb3IgaW5zdHJ1Y3Rpb25zLCB0aGUgSW5zdHJ1Y3Rpb24ncyBvcGNvZGUgaXMgYWRkZWQgdG8gSW5zdHJ1Y3Rpb25WYWwuIFNvCisgIC8vLyB0aGlzIG1lYW5zIHRocmVlIHRoaW5nczoKKyAgLy8vICMgdGhlcmUgaXMgbm8gdmFsdWUgd2l0aCBjb2RlIEluc3RydWN0aW9uVmFsIChubyBvcGNvZGU9PTApLgorICAvLy8gIyB0aGVyZSBhcmUgbW9yZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSB2YWx1ZSB0eXBlIHRoYW4gaW4gVmFsdWVUeSBlbnVtLgorICAvLy8gIyB0aGUgSW5zdHJ1Y3Rpb25WYWwgZW51bWVyYXRvciBtdXN0IGJlIHRoZSBoaWdoZXN0IHZhbHVlZCBlbnVtZXJhdG9yIGluCisgIC8vLyAgIHRoZSBWYWx1ZVR5IGVudW0uCisgIHVuc2lnbmVkIGdldFZhbHVlSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YmNsYXNzSUQ7CisgIH0KKworICAvLy8gZ2V0UmF3U3ViY2xhc3NPcHRpb25hbERhdGEgLSBSZXR1cm4gdGhlIHJhdyBvcHRpb25hbCBmbGFncyB2YWx1ZQorICAvLy8gY29udGFpbmVkIGluIHRoaXMgdmFsdWUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRlc3RpbmcgdHdvCisgIC8vLyBWYWx1ZXMgZm9yIGVxdWl2YWxlbmNlLgorICB1bnNpZ25lZCBnZXRSYXdTdWJjbGFzc09wdGlvbmFsRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViY2xhc3NPcHRpb25hbERhdGE7CisgIH0KKworICAvLy8gaGFzU2FtZVN1YmNsYXNzT3B0aW9uYWxEYXRhIC0gVGVzdCB3aGV0aGVyIHRoZSBvcHRpb25hbCBmbGFncyBjb250YWluZWQKKyAgLy8vIGluIHRoaXMgdmFsdWUgYXJlIGVxdWFsIHRvIHRoZSBvcHRpb25hbCBmbGFncyBpbiB0aGUgZ2l2ZW4gdmFsdWUuCisgIGJvb2wgaGFzU2FtZVN1YmNsYXNzT3B0aW9uYWxEYXRhKGNvbnN0IFZhbHVlICpWKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YmNsYXNzT3B0aW9uYWxEYXRhID09IFYtPlN1YmNsYXNzT3B0aW9uYWxEYXRhOworICB9CisKKyAgLy8vIGludGVyc2VjdE9wdGlvbmFsRGF0YVdpdGggLSBDbGVhciBhbnkgb3B0aW9uYWwgZmxhZ3MgaW4gdGhpcyB2YWx1ZQorICAvLy8gdGhhdCBhcmUgbm90IGFsc28gc2V0IGluIHRoZSBnaXZlbiB2YWx1ZS4KKyAgdm9pZCBpbnRlcnNlY3RPcHRpb25hbERhdGFXaXRoKGNvbnN0IFZhbHVlICpWKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgJj0gVi0+U3ViY2xhc3NPcHRpb25hbERhdGE7CisgIH0KKworICAvLy8gaGFzVmFsdWVIYW5kbGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbHVlIGhhbmRsZSBhc3NvY2lhdGVkIHdpdGgKKyAgLy8vIHRoaXMgdmFsdWUuCisgIGJvb2wgaGFzVmFsdWVIYW5kbGUoKSBjb25zdCB7IHJldHVybiBIYXNWYWx1ZUhhbmRsZTsgfQorICAKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKikgeworICAgIHJldHVybiB0cnVlOyAvLyBWYWx1ZXMgYXJlIGFsd2F5cyB2YWx1ZXMuCisgIH0KKworICAvLy8gZ2V0UmF3VHlwZSAtIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHZtY29yZSBsaWJyYXJ5LgorICAvLy8KKyAgY29uc3QgVHlwZSAqZ2V0UmF3VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFZUeS5nZXRSYXdUeXBlKCk7IH0KKworICAvLy8gc3RyaXBQb2ludGVyQ2FzdHMgLSBUaGlzIG1ldGhvZCBzdHJpcHMgb2ZmIGFueSB1bm5lZWRlZCBwb2ludGVyCisgIC8vLyBjYXN0cyBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybmluZyB0aGUgb3JpZ2luYWwgdW5jYXN0ZWQgdmFsdWUuCisgIC8vLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHZhbHVlIGhhcyBwb2ludGVyIHR5cGUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBkb2VzLgorICBWYWx1ZSAqc3RyaXBQb2ludGVyQ2FzdHMoKTsKKyAgY29uc3QgVmFsdWUgKnN0cmlwUG9pbnRlckNhc3RzKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4odGhpcyktPnN0cmlwUG9pbnRlckNhc3RzKCk7CisgIH0KKworICAvLy8gZ2V0VW5kZXJseWluZ09iamVjdCAtIFRoaXMgbWV0aG9kIHN0cmlwcyBvZmYgYW55IEdFUCBhZGRyZXNzIGFkanVzdG1lbnRzCisgIC8vLyBhbmQgcG9pbnRlciBjYXN0cyBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybmluZyB0aGUgb3JpZ2luYWwgb2JqZWN0CisgIC8vLyBiZWluZyBhZGRyZXNzZWQuICBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHZhbHVlIGhhcyBwb2ludGVyIHR5cGUgaWYgdGhlCisgIC8vLyBzcGVjaWZpZWQgdmFsdWUgZG9lcy4gIElmIHRoZSBNYXhMb29rdXAgdmFsdWUgaXMgbm9uLXplcm8sIGl0IGxpbWl0cyB0aGUKKyAgLy8vIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gYmUgc3RyaXBwZWQgb2ZmLgorICBWYWx1ZSAqZ2V0VW5kZXJseWluZ09iamVjdCh1bnNpZ25lZCBNYXhMb29rdXAgPSA2KTsKKyAgY29uc3QgVmFsdWUgKmdldFVuZGVybHlpbmdPYmplY3QodW5zaWduZWQgTWF4TG9va3VwID0gNikgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4odGhpcyktPmdldFVuZGVybHlpbmdPYmplY3QoTWF4TG9va3VwKTsKKyAgfQorICAKKyAgLy8vIERvUEhJVHJhbnNsYXRpb24gLSBJZiB0aGlzIHZhbHVlIGlzIGEgUEhJIG5vZGUgd2l0aCBDdXJCQiBhcyBpdHMgcGFyZW50LAorICAvLy8gcmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgUEhJIG5vZGUgY29ycmVzcG9uZGluZyB0byBQcmVkQkIuICBJZiBub3QsIHJldHVybgorICAvLy8gb3Vyc2VsZi4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGtub3cgdGhlIHZhbHVlIHNvbWV0aGluZyBoYXMgaW4gYQorICAvLy8gcHJlZGVjZXNzb3IgYmxvY2suCisgIFZhbHVlICpEb1BISVRyYW5zbGF0aW9uKGNvbnN0IEJhc2ljQmxvY2sgKkN1ckJCLCBjb25zdCBCYXNpY0Jsb2NrICpQcmVkQkIpOworCisgIGNvbnN0IFZhbHVlICpEb1BISVRyYW5zbGF0aW9uKGNvbnN0IEJhc2ljQmxvY2sgKkN1ckJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrICpQcmVkQkIpIGNvbnN0eworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4odGhpcyktPkRvUEhJVHJhbnNsYXRpb24oQ3VyQkIsIFByZWRCQik7CisgIH0KKyAgCisgIC8vLyBNYXhpbXVtQWxpZ25tZW50IC0gVGhpcyBpcyB0aGUgZ3JlYXRlc3QgYWxpZ25tZW50IHZhbHVlIHN1cHBvcnRlZCBieQorICAvLy8gbG9hZCwgc3RvcmUsIGFuZCBhbGxvY2EgaW5zdHJ1Y3Rpb25zLCBhbmQgZ2xvYmFsIHZhbHVlcy4KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1heGltdW1BbGlnbm1lbnQgPSAxdSA8PCAyOTsKKyAgCitwcm90ZWN0ZWQ6CisgIHVuc2lnbmVkIHNob3J0IGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFN1YmNsYXNzRGF0YTsgfQorICB2b2lkIHNldFZhbHVlU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsgU3ViY2xhc3NEYXRhID0gRDsgfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVmFsdWUgJlYpIHsKKyAgVi5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKyAgCit2b2lkIFVzZTo6c2V0KFZhbHVlICpWKSB7CisgIGlmIChWYWwpIHJlbW92ZUZyb21MaXN0KCk7CisgIFZhbCA9IFY7CisgIGlmIChWKSBWLT5hZGRVc2UoKnRoaXMpOworfQorCisKKy8vIGlzYSAtIFByb3ZpZGUgc29tZSBzcGVjaWFsaXphdGlvbnMgb2YgaXNhIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBpbmNsdWRlCisvLyB0aGUgc3VidHlwZSBoZWFkZXIgZmlsZXMgdG8gdGVzdCB0byBzZWUgaWYgdGhlIHZhbHVlIGlzIGEgc3ViY2xhc3MuLi4KKy8vCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8Q29uc3RhbnQsIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFZhbHVlSUQoKSA+PSBWYWx1ZTo6Q29uc3RhbnRGaXJzdFZhbCAmJgorICAgICAgVmFsLmdldFZhbHVlSUQoKSA8PSBWYWx1ZTo6Q29uc3RhbnRMYXN0VmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8QXJndW1lbnQsIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0IChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OkFyZ3VtZW50VmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8SW5saW5lQXNtLCBWYWx1ZT4geyAKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpID09IFZhbHVlOjpJbmxpbmVBc21WYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxJbnN0cnVjdGlvbiwgVmFsdWU+IHsgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFZhbHVlSUQoKSA+PSBWYWx1ZTo6SW5zdHJ1Y3Rpb25WYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxCYXNpY0Jsb2NrLCBWYWx1ZT4geyAKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpID09IFZhbHVlOjpCYXNpY0Jsb2NrVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8RnVuY3Rpb24sIFZhbHVlPiB7IAorICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OkZ1bmN0aW9uVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8R2xvYmFsVmFyaWFibGUsIFZhbHVlPiB7IAorICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okdsb2JhbFZhcmlhYmxlVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8R2xvYmFsQWxpYXMsIFZhbHVlPiB7IAorICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okdsb2JhbEFsaWFzVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8R2xvYmFsVmFsdWUsIFZhbHVlPiB7IAorICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIGlzYTxHbG9iYWxWYXJpYWJsZT4oVmFsKSB8fCBpc2E8RnVuY3Rpb24+KFZhbCkgfHwKKyAgICAgIGlzYTxHbG9iYWxBbGlhcz4oVmFsKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPE1ETm9kZSwgVmFsdWU+IHsgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6TUROb2RlVmFsOworICB9Cit9OworICAKKy8vIFZhbHVlKiBpcyBvbmx5IDQtYnl0ZSBhbGlnbmVkLgordGVtcGxhdGU8PgorY2xhc3MgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFZhbHVlKj4geworICB0eXBlZGVmIFZhbHVlKiBQVDsKK3B1YmxpYzoKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFBUIFApIHsgcmV0dXJuIFA7IH0KKyAgc3RhdGljIGlubGluZSBQVCBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQVD4oUCk7CisgIH0KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAyIH07Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2luY2x1ZGUvbGx2bS9WYWx1ZVN5bWJvbFRhYmxlLmggYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVmFsdWVTeW1ib2xUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmM5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9pbmNsdWRlL2xsdm0vVmFsdWVTeW1ib2xUYWJsZS5oCkBAIC0wLDAgKzEsMTMzIEBACisvLz09PS0tIGxsdm0vVmFsdWVTeW1ib2xUYWJsZS5oIC0gSW1wbGVtZW50IGEgVmFsdWUgU3ltdGFiIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBuYW1lL1ZhbHVlIHN5bWJvbCB0YWJsZSBmb3IgTExWTS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVkFMVUVfU1lNQk9MX1RBQkxFX0gKKyNkZWZpbmUgTExWTV9WQUxVRV9TWU1CT0xfVEFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlU3ViQ2xhc3MsIHR5cGVuYW1lIEl0ZW1QYXJlbnRDbGFzcz4KKyAgICAgICAgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzOworICBjbGFzcyBCYXNpY0Jsb2NrOworICBjbGFzcyBGdW5jdGlvbjsKKyAgY2xhc3MgTmFtZWRNRE5vZGU7CisgIGNsYXNzIE1vZHVsZTsKKyAgY2xhc3MgU3RyaW5nUmVmOworCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIHN5bWJvbCB0YWJsZSBvZiBuYW1lL3ZhbHVlIHBhaXJzLiBJdCBpcyBlc3NlbnRpYWxseQorLy8vIGEgc3RkOjptYXA8c3RkOjpzdHJpbmcsVmFsdWUqPiBidXQgaGFzIGEgY29udHJvbGxlZCBpbnRlcmZhY2UgcHJvdmlkZWQgYnkKKy8vLyBMTFZNIGFzIHdlbGwgYXMgZW5zdXJpbmcgdW5pcXVlbmVzcyBvZiBuYW1lcy4KKy8vLworY2xhc3MgVmFsdWVTeW1ib2xUYWJsZSB7CisgIGZyaWVuZCBjbGFzcyBWYWx1ZTsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxBcmd1bWVudCwgRnVuY3Rpb24+OworICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEJhc2ljQmxvY2ssIEZ1bmN0aW9uPjsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxJbnN0cnVjdGlvbiwgQmFzaWNCbG9jaz47CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8RnVuY3Rpb24sIE1vZHVsZT47CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsVmFyaWFibGUsIE1vZHVsZT47CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsQWxpYXMsIE1vZHVsZT47CisvLy8gQG5hbWUgVHlwZXMKKy8vLyBAeworcHVibGljOgorICAvLy8gQGJyaWVmIEEgbWFwcGluZyBvZiBuYW1lcyB0byB2YWx1ZXMuCisgIHR5cGVkZWYgU3RyaW5nTWFwPFZhbHVlKj4gVmFsdWVNYXA7CisKKyAgLy8vIEBicmllZiBBbiBpdGVyYXRvciBvdmVyIGEgVmFsdWVNYXAuCisgIHR5cGVkZWYgVmFsdWVNYXA6Oml0ZXJhdG9yIGl0ZXJhdG9yOworCisgIC8vLyBAYnJpZWYgQSBjb25zdF9pdGVyYXRvciBvdmVyIGEgVmFsdWVNYXAuCisgIHR5cGVkZWYgVmFsdWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisvLy8gQH0KKy8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKy8vLyBAeworcHVibGljOgorCisgIFZhbHVlU3ltYm9sVGFibGUoKSA6IHZtYXAoMCksIExhc3RVbmlxdWUoMCkge30KKyAgflZhbHVlU3ltYm9sVGFibGUoKTsKKworLy8vIEB9CisvLy8gQG5hbWUgQWNjZXNzb3JzCisvLy8gQHsKK3B1YmxpYzoKKworICAvLy8gVGhpcyBtZXRob2QgZmluZHMgdGhlIHZhbHVlIHdpdGggdGhlIGdpdmVuIFxwIE5hbWUgaW4gdGhlCisgIC8vLyB0aGUgc3ltYm9sIHRhYmxlLiAKKyAgLy8vIEByZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIFxwIE5hbWUKKyAgLy8vIEBicmllZiBMb29rdXAgYSBuYW1lZCBWYWx1ZS4KKyAgVmFsdWUgKmxvb2t1cChTdHJpbmdSZWYgTmFtZSkgY29uc3QgeyByZXR1cm4gdm1hcC5sb29rdXAoTmFtZSk7IH0KKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIHN5bWJvbCB0YWJsZSBpcyBlbXB0eQorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgc3ltYm9sIHRhYmxlIGlzIGVtcHR5CisgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gdm1hcC5lbXB0eSgpOyB9CisKKyAgLy8vIEBicmllZiBUaGUgbnVtYmVyIG9mIG5hbWUvdHlwZSBwYWlycyBpcyByZXR1cm5lZC4KKyAgaW5saW5lIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiB1bnNpZ25lZCh2bWFwLnNpemUoKSk7IH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmcm9tIHRoZSBkZWJ1Z2dlciB0byBkaXNwbGF5IHRoZQorICAvLy8gY29udGVudCBvZiB0aGUgc3ltYm9sIHRhYmxlIHdoaWxlIGRlYnVnZ2luZy4KKyAgLy8vIEBicmllZiBQcmludCBvdXQgc3ltYm9sIHRhYmxlIG9uIHN0ZGVycgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgSXRlcmF0aW9uCisvLy8gQHsKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBHZXQgYW4gaXRlcmF0b3IgdGhhdCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN5bWJvbCB0YWJsZS4KKyAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gdm1hcC5iZWdpbigpOyB9CisKKyAgLy8vIEBicmllZiBHZXQgYSBjb25zdF9pdGVyYXRvciB0aGF0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ltYm9sIHRhYmxlLgorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiB2bWFwLmJlZ2luKCk7IH0KKworICAvLy8gQGJyaWVmIEdldCBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUuCisgIGlubGluZSBpdGVyYXRvciBlbmQoKSB7IHJldHVybiB2bWFwLmVuZCgpOyB9CisKKyAgLy8vIEBicmllZiBHZXQgYSBjb25zdF9pdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUuCisgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiB2bWFwLmVuZCgpOyB9CisgIAorLy8vIEB9CisvLy8gQG5hbWUgTXV0YXRvcnMKKy8vLyBAeworcHJpdmF0ZToKKyAgLy8vIFRoaXMgbWV0aG9kIGFkZHMgdGhlIHByb3ZpZGVkIHZhbHVlIFxwIE4gdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoZSBWYWx1ZQorICAvLy8gbXVzdCBoYXZlIGEgbmFtZSB3aGljaCBpcyB1c2VkIHRvIHBsYWNlIHRoZSB2YWx1ZSBpbiB0aGUgc3ltYm9sIHRhYmxlLiAKKyAgLy8vIElmIHRoZSBpbnNlcnRlZCBuYW1lIGNvbmZsaWN0cywgdGhpcyByZW5hbWVzIHRoZSB2YWx1ZS4KKyAgLy8vIEBicmllZiBBZGQgYSBuYW1lZCB2YWx1ZSB0byB0aGUgc3ltYm9sIHRhYmxlCisgIHZvaWQgcmVpbnNlcnRWYWx1ZShWYWx1ZSAqVik7CisgICAgCisgIC8vLyBjcmVhdGVWYWx1ZU5hbWUgLSBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBjcmVhdGUgYSB2YWx1ZSBuYW1lIGFuZCBpbnNlcnQKKyAgLy8vIGl0IGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gIElmIGl0IGNvbmZsaWN0cywgaXQKKyAgLy8vIGF1dG8tcmVuYW1lcyB0aGUgbmFtZSBhbmQgcmV0dXJucyB0aGF0IGluc3RlYWQuCisgIFZhbHVlTmFtZSAqY3JlYXRlVmFsdWVOYW1lKFN0cmluZ1JlZiBOYW1lLCBWYWx1ZSAqVik7CisgIAorICAvLy8gVGhpcyBtZXRob2QgcmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGxlYXZlcyB0aGUKKyAgLy8vIFZhbHVlTmFtZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUsIGJ1dCBpdCBpcyBubyBsb25nZXIgaW5zZXJ0ZWQgaW4gdGhlCisgIC8vLyBzeW10YWIuCisgIHZvaWQgcmVtb3ZlVmFsdWVOYW1lKFZhbHVlTmFtZSAqVik7CisgIAorLy8vIEB9CisvLy8gQG5hbWUgSW50ZXJuYWwgRGF0YQorLy8vIEB7Citwcml2YXRlOgorICBWYWx1ZU1hcCB2bWFwOyAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgbWFwIHRoYXQgaG9sZHMgdGhlIHN5bWJvbCB0YWJsZS4KKyAgbXV0YWJsZSB1aW50MzJfdCBMYXN0VW5pcXVlOyAvLy88IENvdW50ZXIgZm9yIHRyYWNraW5nIHVuaXF1ZSBuYW1lcworCisvLy8gQH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuY3BwIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjQ4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5jcHAKQEAgLTAsMCArMSwzMjcgQEAKKy8vPT09LSBBbGlhc0FuYWx5c2lzLmNwcCAtIEdlbmVyaWMgQWxpYXMgQW5hbHlzaXMgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGdlbmVyaWMgQWxpYXNBbmFseXNpcyBpbnRlcmZhY2Ugd2hpY2ggaXMgdXNlZCBhcyB0aGUKKy8vIGNvbW1vbiBpbnRlcmZhY2UgdXNlZCBieSBhbGwgY2xpZW50cyBhbmQgaW1wbGVtZW50YXRpb25zIG9mIGFsaWFzIGFuYWx5c2lzLgorLy8KKy8vIFRoaXMgZmlsZSBhbHNvIGltcGxlbWVudHMgdGhlIGRlZmF1bHQgdmVyc2lvbiBvZiB0aGUgQWxpYXNBbmFseXNpcyBpbnRlcmZhY2UKKy8vIHRoYXQgaXMgdG8gYmUgdXNlZCB3aGVuIG5vIG90aGVyIGltcGxlbWVudGF0aW9uIGlzIHNwZWNpZmllZC4gIFRoaXMgZG9lcyBzb21lCisvLyBzaW1wbGUgdGVzdHMgdGhhdCBkZXRlY3Qgb2J2aW91cyBjYXNlczogdHdvIGRpZmZlcmVudCBnbG9iYWwgcG9pbnRlcnMgY2Fubm90CisvLyBhbGlhcywgYSBnbG9iYWwgY2Fubm90IGFsaWFzIGEgbWFsbG9jLCB0d28gZGlmZmVyZW50IG1hbGxvY3MgY2Fubm90IGFsaWFzLAorLy8gZXRjLgorLy8KKy8vIFRoaXMgYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24gcmVhbGx5IGlzbid0IHZlcnkgZ29vZCBmb3IgYW55dGhpbmcsIGJ1dAorLy8gaXQgaXMgdmVyeSBmYXN0LCBhbmQgbWFrZXMgYSBuaWNlIGNsZWFuIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uICBCZWNhdXNlIGl0CisvLyBoYW5kbGVzIGxvdHMgb2YgbGl0dGxlIGNvcm5lciBjYXNlcywgb3RoZXIsIG1vcmUgY29tcGxleCwgYWxpYXMgYW5hbHlzaXMKKy8vIGltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIHRvIHJlbHkgb24gdGhpcyBwYXNzIHRvIHJlc29sdmUgdGhlc2Ugc2ltcGxlIGFuZAorLy8gZWFzeSBjYXNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIFJlZ2lzdGVyIHRoZSBBbGlhc0FuYWx5c2lzIGludGVyZmFjZSwgcHJvdmlkaW5nIGEgbmljZSBuYW1lIHRvIHJlZmVyIHRvLgorc3RhdGljIFJlZ2lzdGVyQW5hbHlzaXNHcm91cDxBbGlhc0FuYWx5c2lzPiBaKCJBbGlhcyBBbmFseXNpcyIpOworY2hhciBBbGlhc0FuYWx5c2lzOjpJRCA9IDA7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWZhdWx0IGNoYWluaW5nIG1ldGhvZHMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0FsaWFzQW5hbHlzaXM6OkFsaWFzUmVzdWx0CitBbGlhc0FuYWx5c2lzOjphbGlhcyhjb25zdCBWYWx1ZSAqVjEsIHVuc2lnbmVkIFYxU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpWMiwgdW5zaWduZWQgVjJTaXplKSB7CisgIGFzc2VydChBQSAmJiAiQUEgZGlkbid0IGNhbGwgSW5pdGlhbGl6ZUFsaWFzQW5hbHlzaXMgaW4gaXRzIHJ1biBtZXRob2QhIik7CisgIHJldHVybiBBQS0+YWxpYXMoVjEsIFYxU2l6ZSwgVjIsIFYyU2l6ZSk7Cit9CisKK2Jvb2wgQWxpYXNBbmFseXNpczo6cG9pbnRzVG9Db25zdGFudE1lbW9yeShjb25zdCBWYWx1ZSAqUCkgeworICBhc3NlcnQoQUEgJiYgIkFBIGRpZG4ndCBjYWxsIEluaXRpYWxpemVBbGlhc0FuYWx5c2lzIGluIGl0cyBydW4gbWV0aG9kISIpOworICByZXR1cm4gQUEtPnBvaW50c1RvQ29uc3RhbnRNZW1vcnkoUCk7Cit9CisKK3ZvaWQgQWxpYXNBbmFseXNpczo6ZGVsZXRlVmFsdWUoVmFsdWUgKlYpIHsKKyAgYXNzZXJ0KEFBICYmICJBQSBkaWRuJ3QgY2FsbCBJbml0aWFsaXplQWxpYXNBbmFseXNpcyBpbiBpdHMgcnVuIG1ldGhvZCEiKTsKKyAgQUEtPmRlbGV0ZVZhbHVlKFYpOworfQorCit2b2lkIEFsaWFzQW5hbHlzaXM6OmNvcHlWYWx1ZShWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvKSB7CisgIGFzc2VydChBQSAmJiAiQUEgZGlkbid0IGNhbGwgSW5pdGlhbGl6ZUFsaWFzQW5hbHlzaXMgaW4gaXRzIHJ1biBtZXRob2QhIik7CisgIEFBLT5jb3B5VmFsdWUoRnJvbSwgVG8pOworfQorCitBbGlhc0FuYWx5c2lzOjpNb2RSZWZSZXN1bHQKK0FsaWFzQW5hbHlzaXM6OmdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpQLCB1bnNpZ25lZCBTaXplKSB7CisgIC8vIERvbid0IGFzc2VydCBBQSBiZWNhdXNlIEJhc2ljQUEgY2FsbHMgdXMgaW4gb3JkZXIgdG8gbWFrZSB1c2Ugb2YgdGhlCisgIC8vIGxvZ2ljIGhlcmUuCisKKyAgTW9kUmVmQmVoYXZpb3IgTVJCID0gZ2V0TW9kUmVmQmVoYXZpb3IoQ1MpOworICBpZiAoTVJCID09IERvZXNOb3RBY2Nlc3NNZW1vcnkpCisgICAgcmV0dXJuIE5vTW9kUmVmOworCisgIE1vZFJlZlJlc3VsdCBNYXNrID0gTW9kUmVmOworICBpZiAoTVJCID09IE9ubHlSZWFkc01lbW9yeSkKKyAgICBNYXNrID0gUmVmOworICBlbHNlIGlmIChNUkIgPT0gQWxpYXNBbmFseXNpczo6QWNjZXNzZXNBcmd1bWVudHMpIHsKKyAgICBib29sIGRvZXNBbGlhcyA9IGZhbHNlOworICAgIGZvciAoSW1tdXRhYmxlQ2FsbFNpdGU6OmFyZ19pdGVyYXRvciBBSSA9IENTLmFyZ19iZWdpbigpLCBBRSA9IENTLmFyZ19lbmQoKTsKKyAgICAgICAgIEFJICE9IEFFOyArK0FJKQorICAgICAgaWYgKCFpc05vQWxpYXMoKkFJLCB+MFUsIFAsIFNpemUpKSB7CisgICAgICAgIGRvZXNBbGlhcyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgaWYgKCFkb2VzQWxpYXMpCisgICAgICByZXR1cm4gTm9Nb2RSZWY7CisgIH0KKworICAvLyBJZiBQIHBvaW50cyB0byBhIGNvbnN0YW50IG1lbW9yeSBsb2NhdGlvbiwgdGhlIGNhbGwgZGVmaW5pdGVseSBjb3VsZCBub3QKKyAgLy8gbW9kaWZ5IHRoZSBtZW1vcnkgbG9jYXRpb24uCisgIGlmICgoTWFzayAmIE1vZCkgJiYgcG9pbnRzVG9Db25zdGFudE1lbW9yeShQKSkKKyAgICBNYXNrID0gTW9kUmVmUmVzdWx0KE1hc2sgJiB+TW9kKTsKKworICAvLyBJZiB0aGlzIGlzIEJhc2ljQUEsIGRvbid0IGZvcndhcmQuCisgIGlmICghQUEpIHJldHVybiBNYXNrOworCisgIC8vIE90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIHRoZSBuZXh0IEFBIGluIHRoZSBjaGFpbi4gQnV0IHdlIGNhbiBtZXJnZQorICAvLyBpbiBhbnkgbWFzayB3ZSd2ZSBtYW5hZ2VkIHRvIGNvbXB1dGUuCisgIHJldHVybiBNb2RSZWZSZXN1bHQoQUEtPmdldE1vZFJlZkluZm8oQ1MsIFAsIFNpemUpICYgTWFzayk7Cit9CisKK0FsaWFzQW5hbHlzaXM6Ok1vZFJlZlJlc3VsdAorQWxpYXNBbmFseXNpczo6Z2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUzEsIEltbXV0YWJsZUNhbGxTaXRlIENTMikgeworICAvLyBEb24ndCBhc3NlcnQgQUEgYmVjYXVzZSBCYXNpY0FBIGNhbGxzIHVzIGluIG9yZGVyIHRvIG1ha2UgdXNlIG9mIHRoZQorICAvLyBsb2dpYyBoZXJlLgorCisgIC8vIElmIENTMSBvciBDUzIgYXJlIHJlYWRub25lLCB0aGV5IGRvbid0IGludGVyYWN0LgorICBNb2RSZWZCZWhhdmlvciBDUzFCID0gZ2V0TW9kUmVmQmVoYXZpb3IoQ1MxKTsKKyAgaWYgKENTMUIgPT0gRG9lc05vdEFjY2Vzc01lbW9yeSkgcmV0dXJuIE5vTW9kUmVmOworCisgIE1vZFJlZkJlaGF2aW9yIENTMkIgPSBnZXRNb2RSZWZCZWhhdmlvcihDUzIpOworICBpZiAoQ1MyQiA9PSBEb2VzTm90QWNjZXNzTWVtb3J5KSByZXR1cm4gTm9Nb2RSZWY7CisKKyAgLy8gSWYgdGhleSBib3RoIG9ubHkgcmVhZCBmcm9tIG1lbW9yeSwgdGhlcmUgaXMgbm8gZGVwZW5kZW5jZS4KKyAgaWYgKENTMUIgPT0gT25seVJlYWRzTWVtb3J5ICYmIENTMkIgPT0gT25seVJlYWRzTWVtb3J5KQorICAgIHJldHVybiBOb01vZFJlZjsKKworICBBbGlhc0FuYWx5c2lzOjpNb2RSZWZSZXN1bHQgTWFzayA9IE1vZFJlZjsKKworICAvLyBJZiBDUzEgb25seSByZWFkcyBtZW1vcnksIHRoZSBvbmx5IGRlcGVuZGVuY2Ugb24gQ1MyIGNhbiBiZQorICAvLyBmcm9tIENTMSByZWFkaW5nIG1lbW9yeSB3cml0dGVuIGJ5IENTMi4KKyAgaWYgKENTMUIgPT0gT25seVJlYWRzTWVtb3J5KQorICAgIE1hc2sgPSBNb2RSZWZSZXN1bHQoTWFzayAmIFJlZik7CisKKyAgLy8gSWYgQ1MyIG9ubHkgYWNjZXNzIG1lbW9yeSB0aHJvdWdoIGFyZ3VtZW50cywgYWNjdW11bGF0ZSB0aGUgbW9kL3JlZgorICAvLyBpbmZvcm1hdGlvbiBmcm9tIENTMSdzIHJlZmVyZW5jZXMgdG8gdGhlIG1lbW9yeSByZWZlcmVuY2VkIGJ5CisgIC8vIENTMidzIGFyZ3VtZW50cy4KKyAgaWYgKENTMkIgPT0gQWNjZXNzZXNBcmd1bWVudHMpIHsKKyAgICBBbGlhc0FuYWx5c2lzOjpNb2RSZWZSZXN1bHQgUiA9IE5vTW9kUmVmOworICAgIGZvciAoSW1tdXRhYmxlQ2FsbFNpdGU6OmFyZ19pdGVyYXRvcgorICAgICAgICAgSSA9IENTMi5hcmdfYmVnaW4oKSwgRSA9IENTMi5hcmdfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBSID0gTW9kUmVmUmVzdWx0KChSIHwgZ2V0TW9kUmVmSW5mbyhDUzEsICpJLCBVbmtub3duU2l6ZSkpICYgTWFzayk7CisgICAgICBpZiAoUiA9PSBNYXNrKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFI7CisgIH0KKworICAvLyBJZiBDUzEgb25seSBhY2Nlc3NlcyBtZW1vcnkgdGhyb3VnaCBhcmd1bWVudHMsIGNoZWNrIGlmIENTMiByZWZlcmVuY2VzCisgIC8vIGFueSBvZiB0aGUgbWVtb3J5IHJlZmVyZW5jZWQgYnkgQ1MxJ3MgYXJndW1lbnRzLiBJZiBub3QsIHJldHVybiBOb01vZFJlZi4KKyAgaWYgKENTMUIgPT0gQWNjZXNzZXNBcmd1bWVudHMpIHsKKyAgICBBbGlhc0FuYWx5c2lzOjpNb2RSZWZSZXN1bHQgUiA9IE5vTW9kUmVmOworICAgIGZvciAoSW1tdXRhYmxlQ2FsbFNpdGU6OmFyZ19pdGVyYXRvcgorICAgICAgICAgSSA9IENTMS5hcmdfYmVnaW4oKSwgRSA9IENTMS5hcmdfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKGdldE1vZFJlZkluZm8oQ1MyLCAqSSwgVW5rbm93blNpemUpICE9IE5vTW9kUmVmKSB7CisgICAgICAgIFIgPSBNYXNrOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBpZiAoUiA9PSBOb01vZFJlZikKKyAgICAgIHJldHVybiBSOworICB9CisKKyAgLy8gSWYgdGhpcyBpcyBCYXNpY0FBLCBkb24ndCBmb3J3YXJkLgorICBpZiAoIUFBKSByZXR1cm4gTWFzazsKKworICAvLyBPdGhlcndpc2UsIGZhbGwgYmFjayB0byB0aGUgbmV4dCBBQSBpbiB0aGUgY2hhaW4uIEJ1dCB3ZSBjYW4gbWVyZ2UKKyAgLy8gaW4gYW55IG1hc2sgd2UndmUgbWFuYWdlZCB0byBjb21wdXRlLgorICByZXR1cm4gTW9kUmVmUmVzdWx0KEFBLT5nZXRNb2RSZWZJbmZvKENTMSwgQ1MyKSAmIE1hc2spOworfQorCitBbGlhc0FuYWx5c2lzOjpNb2RSZWZCZWhhdmlvcgorQWxpYXNBbmFseXNpczo6Z2V0TW9kUmVmQmVoYXZpb3IoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpIHsKKyAgLy8gRG9uJ3QgYXNzZXJ0IEFBIGJlY2F1c2UgQmFzaWNBQSBjYWxscyB1cyBpbiBvcmRlciB0byBtYWtlIHVzZSBvZiB0aGUKKyAgLy8gbG9naWMgaGVyZS4KKworICBNb2RSZWZCZWhhdmlvciBNaW4gPSBVbmtub3duTW9kUmVmQmVoYXZpb3I7CisKKyAgLy8gQ2FsbCBiYWNrIGludG8gdGhlIGFsaWFzIGFuYWx5c2lzIHdpdGggdGhlIG90aGVyIGZvcm0gb2YgZ2V0TW9kUmVmQmVoYXZpb3IKKyAgLy8gdG8gc2VlIGlmIGl0IGNhbiBnaXZlIGEgYmV0dGVyIHJlc3BvbnNlLgorICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBDUy5nZXRDYWxsZWRGdW5jdGlvbigpKQorICAgIE1pbiA9IGdldE1vZFJlZkJlaGF2aW9yKEYpOworCisgIC8vIElmIHRoaXMgaXMgQmFzaWNBQSwgZG9uJ3QgZm9yd2FyZC4KKyAgaWYgKCFBQSkgcmV0dXJuIE1pbjsKKworICAvLyBPdGhlcndpc2UsIGZhbGwgYmFjayB0byB0aGUgbmV4dCBBQSBpbiB0aGUgY2hhaW4uIEJ1dCB3ZSBjYW4gbWVyZ2UKKyAgLy8gaW4gYW55IHJlc3VsdCB3ZSd2ZSBtYW5hZ2VkIHRvIGNvbXB1dGUuCisgIHJldHVybiBzdGQ6Om1pbihBQS0+Z2V0TW9kUmVmQmVoYXZpb3IoQ1MpLCBNaW4pOworfQorCitBbGlhc0FuYWx5c2lzOjpNb2RSZWZCZWhhdmlvcgorQWxpYXNBbmFseXNpczo6Z2V0TW9kUmVmQmVoYXZpb3IoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgYXNzZXJ0KEFBICYmICJBQSBkaWRuJ3QgY2FsbCBJbml0aWFsaXplQWxpYXNBbmFseXNpcyBpbiBpdHMgcnVuIG1ldGhvZCEiKTsKKyAgcmV0dXJuIEFBLT5nZXRNb2RSZWZCZWhhdmlvcihGKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQWxpYXNBbmFseXNpcyBub24tdmlydHVhbCBoZWxwZXIgbWV0aG9kIGltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitBbGlhc0FuYWx5c2lzOjpNb2RSZWZSZXN1bHQKK0FsaWFzQW5hbHlzaXM6OmdldE1vZFJlZkluZm8oY29uc3QgTG9hZEluc3QgKkwsIGNvbnN0IFZhbHVlICpQLCB1bnNpZ25lZCBTaXplKSB7CisgIC8vIEJlIGNvbnNlcnZhdGl2ZSBpbiB0aGUgZmFjZSBvZiB2b2xhdGlsZS4KKyAgaWYgKEwtPmlzVm9sYXRpbGUoKSkKKyAgICByZXR1cm4gTW9kUmVmOworCisgIC8vIElmIHRoZSBsb2FkIGFkZHJlc3MgZG9lc24ndCBhbGlhcyB0aGUgZ2l2ZW4gYWRkcmVzcywgaXQgZG9lc24ndCByZWFkCisgIC8vIG9yIHdyaXRlIHRoZSBzcGVjaWZpZWQgbWVtb3J5LgorICBpZiAoIWFsaWFzKEwtPmdldE9wZXJhbmQoMCksIGdldFR5cGVTdG9yZVNpemUoTC0+Z2V0VHlwZSgpKSwgUCwgU2l6ZSkpCisgICAgcmV0dXJuIE5vTW9kUmVmOworCisgIC8vIE90aGVyd2lzZSwgYSBsb2FkIGp1c3QgcmVhZHMuCisgIHJldHVybiBSZWY7Cit9CisKK0FsaWFzQW5hbHlzaXM6Ok1vZFJlZlJlc3VsdAorQWxpYXNBbmFseXNpczo6Z2V0TW9kUmVmSW5mbyhjb25zdCBTdG9yZUluc3QgKlMsIGNvbnN0IFZhbHVlICpQLCB1bnNpZ25lZCBTaXplKSB7CisgIC8vIEJlIGNvbnNlcnZhdGl2ZSBpbiB0aGUgZmFjZSBvZiB2b2xhdGlsZS4KKyAgaWYgKFMtPmlzVm9sYXRpbGUoKSkKKyAgICByZXR1cm4gTW9kUmVmOworCisgIC8vIElmIHRoZSBzdG9yZSBhZGRyZXNzIGNhbm5vdCBhbGlhcyB0aGUgcG9pbnRlciBpbiBxdWVzdGlvbiwgdGhlbiB0aGUKKyAgLy8gc3BlY2lmaWVkIG1lbW9yeSBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhlIHN0b3JlLgorICBpZiAoIWFsaWFzKFMtPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgZ2V0VHlwZVN0b3JlU2l6ZShTLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpLCBQLCBTaXplKSkKKyAgICByZXR1cm4gTm9Nb2RSZWY7CisKKyAgLy8gSWYgdGhlIHBvaW50ZXIgaXMgYSBwb2ludGVyIHRvIGNvbnN0YW50IG1lbW9yeSwgdGhlbiBpdCBjb3VsZCBub3QgaGF2ZSBiZWVuCisgIC8vIG1vZGlmaWVkIGJ5IHRoaXMgc3RvcmUuCisgIGlmIChwb2ludHNUb0NvbnN0YW50TWVtb3J5KFApKQorICAgIHJldHVybiBOb01vZFJlZjsKKworICAvLyBPdGhlcndpc2UsIGEgc3RvcmUganVzdCB3cml0ZXMuCisgIHJldHVybiBNb2Q7Cit9CisKK0FsaWFzQW5hbHlzaXM6Ok1vZFJlZkJlaGF2aW9yCitBbGlhc0FuYWx5c2lzOjpnZXRJbnRyaW5zaWNNb2RSZWZCZWhhdmlvcih1bnNpZ25lZCBpaWQpIHsKKyNkZWZpbmUgR0VUX0lOVFJJTlNJQ19NT0RSRUZfQkVIQVZJT1IKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuZ2VuIgorI3VuZGVmIEdFVF9JTlRSSU5TSUNfTU9EUkVGX0JFSEFWSU9SCit9CisKKy8vIEFsaWFzQW5hbHlzaXMgZGVzdHJ1Y3RvcjogRE8gTk9UIG1vdmUgdGhpcyB0byB0aGUgaGVhZGVyIGZpbGUgZm9yCisvLyBBbGlhc0FuYWx5c2lzIG9yIGVsc2UgY2xpZW50cyBvZiB0aGUgQWxpYXNBbmFseXNpcyBjbGFzcyBtYXkgbm90IGRlcGVuZCBvbgorLy8gdGhlIEFsaWFzQW5hbHlzaXMubyBmaWxlIGluIHRoZSBjdXJyZW50IC5hIGZpbGUsIGNhdXNpbmcgYWxpYXMgYW5hbHlzaXMKKy8vIHN1cHBvcnQgdG8gbm90IGJlIGluY2x1ZGVkIGluIHRoZSB0b29sIGNvcnJlY3RseSEKKy8vCitBbGlhc0FuYWx5c2lzOjp+QWxpYXNBbmFseXNpcygpIHt9CisKKy8vLyBJbml0aWFsaXplQWxpYXNBbmFseXNpcyAtIFN1YmNsYXNzZXMgbXVzdCBjYWxsIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgdGhlCisvLy8gQWxpYXNBbmFseXNpcyBpbnRlcmZhY2UgYmVmb3JlIGFueSBvdGhlciBtZXRob2RzIGFyZSBjYWxsZWQuCisvLy8KK3ZvaWQgQWxpYXNBbmFseXNpczo6SW5pdGlhbGl6ZUFsaWFzQW5hbHlzaXMoUGFzcyAqUCkgeworICBURCA9IFAtPmdldEFuYWx5c2lzSWZBdmFpbGFibGU8VGFyZ2V0RGF0YT4oKTsKKyAgQUEgPSAmUC0+Z2V0QW5hbHlzaXM8QWxpYXNBbmFseXNpcz4oKTsKK30KKworLy8gZ2V0QW5hbHlzaXNVc2FnZSAtIEFsbCBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGludm9rZSB0aGlzCisvLyBkaXJlY3RseSAodXNpbmcgQWxpYXNBbmFseXNpczo6Z2V0QW5hbHlzaXNVc2FnZShBVSkpLgordm9pZCBBbGlhc0FuYWx5c2lzOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgIEFVLmFkZFJlcXVpcmVkPEFsaWFzQW5hbHlzaXM+KCk7ICAgICAgICAgLy8gQWxsIEFBJ3MgY2hhaW4KK30KKworLy8vIGdldFR5cGVTdG9yZVNpemUgLSBSZXR1cm4gdGhlIFRhcmdldERhdGEgc3RvcmUgc2l6ZSBmb3IgdGhlIGdpdmVuIHR5cGUsCisvLy8gaWYga25vd24sIG9yIGEgY29uc2VydmF0aXZlIHZhbHVlIG90aGVyd2lzZS4KKy8vLwordW5zaWduZWQgQWxpYXNBbmFseXNpczo6Z2V0VHlwZVN0b3JlU2l6ZShjb25zdCBUeXBlICpUeSkgeworICByZXR1cm4gVEQgPyBURC0+Z2V0VHlwZVN0b3JlU2l6ZShUeSkgOiB+MHU7Cit9CisKKy8vLyBjYW5CYXNpY0Jsb2NrTW9kaWZ5IC0gUmV0dXJuIHRydWUgaWYgaXQgaXMgcG9zc2libGUgZm9yIGV4ZWN1dGlvbiBvZiB0aGUKKy8vLyBzcGVjaWZpZWQgYmFzaWMgYmxvY2sgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IFB0ci4KKy8vLworYm9vbCBBbGlhc0FuYWx5c2lzOjpjYW5CYXNpY0Jsb2NrTW9kaWZ5KGNvbnN0IEJhc2ljQmxvY2sgJkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpQdHIsIHVuc2lnbmVkIFNpemUpIHsKKyAgcmV0dXJuIGNhbkluc3RydWN0aW9uUmFuZ2VNb2RpZnkoQkIuZnJvbnQoKSwgQkIuYmFjaygpLCBQdHIsIFNpemUpOworfQorCisvLy8gY2FuSW5zdHJ1Y3Rpb25SYW5nZU1vZGlmeSAtIFJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgZXhlY3V0aW9uCisvLy8gb2YgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbnMgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IFB0ci4gIFRoZQorLy8vIGluc3RydWN0aW9ucyB0byBjb25zaWRlciBhcmUgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHJhbmdlIG9mIFtJMSxJMl0KKy8vLyBJTkNMVVNJVkUuICBJMSBhbmQgSTIgbXVzdCBiZSBpbiB0aGUgc2FtZSBiYXNpYyBibG9jay4KKy8vLworYm9vbCBBbGlhc0FuYWx5c2lzOjpjYW5JbnN0cnVjdGlvblJhbmdlTW9kaWZ5KGNvbnN0IEluc3RydWN0aW9uICZJMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAmSTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlB0ciwgdW5zaWduZWQgU2l6ZSkgeworICBhc3NlcnQoSTEuZ2V0UGFyZW50KCkgPT0gSTIuZ2V0UGFyZW50KCkgJiYKKyAgICAgICAgICJJbnN0cnVjdGlvbnMgbm90IGluIHNhbWUgYmFzaWMgYmxvY2shIik7CisgIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSAmSTE7CisgIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEUgPSAmSTI7CisgICsrRTsgIC8vIENvbnZlcnQgZnJvbSBpbmNsdXNpdmUgdG8gZXhjbHVzaXZlIHJhbmdlLgorCisgIGZvciAoOyBJICE9IEU7ICsrSSkgLy8gQ2hlY2sgZXZlcnkgaW5zdHJ1Y3Rpb24gaW4gcmFuZ2UKKyAgICBpZiAoZ2V0TW9kUmVmSW5mbyhJLCBQdHIsIFNpemUpICYgTW9kKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzTm9BbGlhc0NhbGwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBvaW50ZXIgaXMgcmV0dXJuZWQgYnkgYSBub2FsaWFzCisvLy8gZnVuY3Rpb24uCitib29sIGxsdm06OmlzTm9BbGlhc0NhbGwoY29uc3QgVmFsdWUgKlYpIHsKKyAgaWYgKGlzYTxDYWxsSW5zdD4oVikgfHwgSVNBX0lOVk9LRV9JTlNUKFYpKQorICAgIHJldHVybiBJbW11dGFibGVDYWxsU2l0ZShjYXN0PEluc3RydWN0aW9uPihWKSkKKyAgICAgIC5wYXJhbUhhc0F0dHIoMCwgQXR0cmlidXRlOjpOb0FsaWFzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNJZGVudGlmaWVkT2JqZWN0IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBwb2ludGVyIHJlZmVycyB0byBhIGRpc3RpbmN0IGFuZAorLy8vIGlkZW50aWZpYWJsZSBvYmplY3QuICBUaGlzIHJldHVybnMgdHJ1ZSBmb3I6CisvLy8gICAgR2xvYmFsIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zIChidXQgbm90IEdsb2JhbCBBbGlhc2VzKQorLy8vICAgIEFsbG9jYXMgYW5kIE1hbGxvY3MKKy8vLyAgICBCeVZhbCBhbmQgTm9BbGlhcyBBcmd1bWVudHMKKy8vLyAgICBOb0FsaWFzIHJldHVybnMKKy8vLworYm9vbCBsbHZtOjppc0lkZW50aWZpZWRPYmplY3QoY29uc3QgVmFsdWUgKlYpIHsKKyAgaWYgKGlzYTxBbGxvY2FJbnN0PihWKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKGlzYTxHbG9iYWxWYWx1ZT4oVikgJiYgIWlzYTxHbG9iYWxBbGlhcz4oVikpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChpc05vQWxpYXNDYWxsKFYpKQorICAgIHJldHVybiB0cnVlOworICBpZiAoY29uc3QgQXJndW1lbnQgKkEgPSBkeW5fY2FzdDxBcmd1bWVudD4oVikpCisgICAgcmV0dXJuIEEtPmhhc05vQWxpYXNBdHRyKCkgfHwgQS0+aGFzQnlWYWxBdHRyKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gQmVjYXVzZSBvZiB0aGUgd2F5IC5hIGZpbGVzIHdvcmssIHdlIG11c3QgZm9yY2UgdGhlIEJhc2ljQUEgaW1wbGVtZW50YXRpb24gdG8KKy8vIGJlIHB1bGxlZCBpbiBpZiB0aGUgQWxpYXNBbmFseXNpcyBjbGFzc2VzIGFyZSBwdWxsZWQgaW4uICBPdGhlcndpc2Ugd2UgcnVuCisvLyB0aGUgcmlzayBvZiBBbGlhc0FuYWx5c2lzIGJlaW5nIHVzZWQsIGJ1dCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBub3QKKy8vIGJlaW5nIGxpbmtlZCBpbnRvIHRoZSB0b29sIHRoYXQgdXNlcyBpdC4KK0RFRklOSU5HX0ZJTEVfRk9SKEFsaWFzQW5hbHlzaXMpCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmNwcCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9BbGlhc1NldFRyYWNrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDZmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmNwcApAQCAtMCwwICsxLDU4MyBAQAorLy89PT0tIEFsaWFzU2V0VHJhY2tlci5jcHAgLSBBbGlhcyBTZXRzIFRyYWNrZXIgaW1wbGVtZW50YXRpb24tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQWxpYXNTZXRUcmFja2VyIGFuZCBBbGlhc1NldCBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzU2V0VHJhY2tlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSW5zdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBtZXJnZVNldEluIC0gTWVyZ2UgdGhlIHNwZWNpZmllZCBhbGlhcyBzZXQgaW50byB0aGlzIGFsaWFzIHNldC4KKy8vLwordm9pZCBBbGlhc1NldDo6bWVyZ2VTZXRJbihBbGlhc1NldCAmQVMsIEFsaWFzU2V0VHJhY2tlciAmQVNUKSB7CisgIGFzc2VydCghQVMuRm9yd2FyZCAmJiAiQWxpYXMgc2V0IGlzIGFscmVhZHkgZm9yd2FyZGluZyEiKTsKKyAgYXNzZXJ0KCFGb3J3YXJkICYmICJUaGlzIHNldCBpcyBhIGZvcndhcmRpbmcgc2V0ISEiKTsKKworICAvLyBVcGRhdGUgdGhlIGFsaWFzIGFuZCBhY2Nlc3MgdHlwZXMgb2YgdGhpcyBzZXQuLi4KKyAgQWNjZXNzVHkgfD0gQVMuQWNjZXNzVHk7CisgIEFsaWFzVHkgIHw9IEFTLkFsaWFzVHk7CisKKyAgaWYgKEFsaWFzVHkgPT0gTXVzdEFsaWFzKSB7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGVzZSB0d28gbWVyZ2VkIHNldHMgcmVhbGx5IGFyZSBtdXN0IGFsaWFzZXMuICBTaW5jZSBib3RoCisgICAgLy8gdXNlZCB0byBiZSBtdXN0LWFsaWFzIHNldHMsIHdlIGNhbiBqdXN0IGNoZWNrIGFueSBwb2ludGVyIGZyb20gZWFjaCBzZXQKKyAgICAvLyBmb3IgYWxpYXNpbmcuCisgICAgQWxpYXNBbmFseXNpcyAmQUEgPSBBU1QuZ2V0QWxpYXNBbmFseXNpcygpOworICAgIFBvaW50ZXJSZWMgKkwgPSBnZXRTb21lUG9pbnRlcigpOworICAgIFBvaW50ZXJSZWMgKlIgPSBBUy5nZXRTb21lUG9pbnRlcigpOworCisgICAgLy8gSWYgdGhlIHBvaW50ZXJzIGFyZSBub3QgYSBtdXN0LWFsaWFzIHBhaXIsIHRoaXMgc2V0IGJlY29tZXMgYSBtYXkgYWxpYXMuCisgICAgaWYgKEFBLmFsaWFzKEwtPmdldFZhbHVlKCksIEwtPmdldFNpemUoKSwgUi0+Z2V0VmFsdWUoKSwgUi0+Z2V0U2l6ZSgpKQorICAgICAgICAhPSBBbGlhc0FuYWx5c2lzOjpNdXN0QWxpYXMpCisgICAgICBBbGlhc1R5ID0gTWF5QWxpYXM7CisgIH0KKworICBpZiAoQ2FsbFNpdGVzLmVtcHR5KCkpIHsgICAgICAgICAgICAvLyBNZXJnZSBjYWxsIHNpdGVzLi4uCisgICAgaWYgKCFBUy5DYWxsU2l0ZXMuZW1wdHkoKSkKKyAgICAgIHN0ZDo6c3dhcChDYWxsU2l0ZXMsIEFTLkNhbGxTaXRlcyk7CisgIH0gZWxzZSBpZiAoIUFTLkNhbGxTaXRlcy5lbXB0eSgpKSB7CisgICAgQ2FsbFNpdGVzLmluc2VydChDYWxsU2l0ZXMuZW5kKCksIEFTLkNhbGxTaXRlcy5iZWdpbigpLCBBUy5DYWxsU2l0ZXMuZW5kKCkpOworICAgIEFTLkNhbGxTaXRlcy5jbGVhcigpOworICB9CisKKyAgQVMuRm9yd2FyZCA9IHRoaXM7ICAvLyBGb3J3YXJkIGFjcm9zcyBBUyBub3cuLi4KKyAgYWRkUmVmKCk7ICAgICAgICAgICAvLyBBUyBpcyBub3cgcG9pbnRpbmcgdG8gdXMuLi4KKworICAvLyBNZXJnZSB0aGUgbGlzdCBvZiBjb25zdGl0dWVudCBwb2ludGVycy4uLgorICBpZiAoQVMuUHRyTGlzdCkgeworICAgICpQdHJMaXN0RW5kID0gQVMuUHRyTGlzdDsKKyAgICBBUy5QdHJMaXN0LT5zZXRQcmV2SW5MaXN0KFB0ckxpc3RFbmQpOworICAgIFB0ckxpc3RFbmQgPSBBUy5QdHJMaXN0RW5kOworCisgICAgQVMuUHRyTGlzdCA9IDA7CisgICAgQVMuUHRyTGlzdEVuZCA9ICZBUy5QdHJMaXN0OworICAgIGFzc2VydCgqQVMuUHRyTGlzdEVuZCA9PSAwICYmICJFbmQgb2YgbGlzdCBpcyBub3QgbnVsbD8iKTsKKyAgfQorfQorCit2b2lkIEFsaWFzU2V0VHJhY2tlcjo6cmVtb3ZlQWxpYXNTZXQoQWxpYXNTZXQgKkFTKSB7CisgIGlmIChBbGlhc1NldCAqRndkID0gQVMtPkZvcndhcmQpIHsKKyAgICBGd2QtPmRyb3BSZWYoKnRoaXMpOworICAgIEFTLT5Gb3J3YXJkID0gMDsKKyAgfQorICBBbGlhc1NldHMuZXJhc2UoQVMpOworfQorCit2b2lkIEFsaWFzU2V0OjpyZW1vdmVGcm9tVHJhY2tlcihBbGlhc1NldFRyYWNrZXIgJkFTVCkgeworICBhc3NlcnQoUmVmQ291bnQgPT0gMCAmJiAiQ2Fubm90IHJlbW92ZSBub24tZGVhZCBhbGlhcyBzZXQgZnJvbSB0cmFja2VyISIpOworICBBU1QucmVtb3ZlQWxpYXNTZXQodGhpcyk7Cit9CisKK3ZvaWQgQWxpYXNTZXQ6OmFkZFBvaW50ZXIoQWxpYXNTZXRUcmFja2VyICZBU1QsIFBvaW50ZXJSZWMgJkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplLCBib29sIEtub3duTXVzdEFsaWFzKSB7CisgIGFzc2VydCghRW50cnkuaGFzQWxpYXNTZXQoKSAmJiAiRW50cnkgYWxyZWFkeSBpbiBzZXQhIik7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgdG8gZG93bmdyYWRlIHRvIF9tYXlfIGFsaWFzLgorICBpZiAoaXNNdXN0QWxpYXMoKSAmJiAhS25vd25NdXN0QWxpYXMpCisgICAgaWYgKFBvaW50ZXJSZWMgKlAgPSBnZXRTb21lUG9pbnRlcigpKSB7CisgICAgICBBbGlhc0FuYWx5c2lzICZBQSA9IEFTVC5nZXRBbGlhc0FuYWx5c2lzKCk7CisgICAgICBBbGlhc0FuYWx5c2lzOjpBbGlhc1Jlc3VsdCBSZXN1bHQgPQorICAgICAgICBBQS5hbGlhcyhQLT5nZXRWYWx1ZSgpLCBQLT5nZXRTaXplKCksIEVudHJ5LmdldFZhbHVlKCksIFNpemUpOworICAgICAgaWYgKFJlc3VsdCA9PSBBbGlhc0FuYWx5c2lzOjpNYXlBbGlhcykKKyAgICAgICAgQWxpYXNUeSA9IE1heUFsaWFzOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGVudHJ5IG9mIG11c3QgYWxpYXMgbXVzdCBoYXZlIG1heGltdW0gc2l6ZSEKKyAgICAgICAgUC0+dXBkYXRlU2l6ZShTaXplKTsKKyAgICAgIGFzc2VydChSZXN1bHQgIT0gQWxpYXNBbmFseXNpczo6Tm9BbGlhcyAmJiAiQ2Fubm90IGJlIHBhcnQgb2YgbXVzdCBzZXQhIik7CisgICAgfQorCisgIEVudHJ5LnNldEFsaWFzU2V0KHRoaXMpOworICBFbnRyeS51cGRhdGVTaXplKFNpemUpOworCisgIC8vIEFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0Li4uCisgIGFzc2VydCgqUHRyTGlzdEVuZCA9PSAwICYmICJFbmQgb2YgbGlzdCBpcyBub3QgbnVsbD8iKTsKKyAgKlB0ckxpc3RFbmQgPSAmRW50cnk7CisgIFB0ckxpc3RFbmQgPSBFbnRyeS5zZXRQcmV2SW5MaXN0KFB0ckxpc3RFbmQpOworICBhc3NlcnQoKlB0ckxpc3RFbmQgPT0gMCAmJiAiRW5kIG9mIGxpc3QgaXMgbm90IG51bGw/Iik7CisgIGFkZFJlZigpOyAgICAgICAgICAgICAgIC8vIEVudHJ5IHBvaW50cyB0byBhbGlhcyBzZXQuLi4KK30KKwordm9pZCBBbGlhc1NldDo6YWRkQ2FsbFNpdGUoQ2FsbFNpdGUgQ1MsIEFsaWFzQW5hbHlzaXMgJkFBKSB7CisgIENhbGxTaXRlcy5wdXNoX2JhY2soQ1MpOworCisgIEFsaWFzQW5hbHlzaXM6Ok1vZFJlZkJlaGF2aW9yIEJlaGF2aW9yID0gQUEuZ2V0TW9kUmVmQmVoYXZpb3IoQ1MpOworICBpZiAoQmVoYXZpb3IgPT0gQWxpYXNBbmFseXNpczo6RG9lc05vdEFjY2Vzc01lbW9yeSkKKyAgICByZXR1cm47CisgIGVsc2UgaWYgKEJlaGF2aW9yID09IEFsaWFzQW5hbHlzaXM6Ok9ubHlSZWFkc01lbW9yeSkgeworICAgIEFsaWFzVHkgPSBNYXlBbGlhczsKKyAgICBBY2Nlc3NUeSB8PSBSZWZzOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgbW9kL3JlZiBpbmZvcm1hdGlvbiB0byBtYWtlIHRoaXMgbm90IHN1Y2sgc28gYmFkCisgIEFsaWFzVHkgPSBNYXlBbGlhczsKKyAgQWNjZXNzVHkgPSBNb2RSZWY7Cit9CisKKy8vLyBhbGlhc2VzUG9pbnRlciAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnRlciAibWF5IiAob3IgbXVzdCkKKy8vLyBhbGlhcyBvbmUgb2YgdGhlIG1lbWJlcnMgaW4gdGhlIHNldC4KKy8vLworYm9vbCBBbGlhc1NldDo6YWxpYXNlc1BvaW50ZXIoY29uc3QgVmFsdWUgKlB0ciwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgJkFBKSBjb25zdCB7CisgIGlmIChBbGlhc1R5ID09IE11c3RBbGlhcykgeworICAgIGFzc2VydChDYWxsU2l0ZXMuZW1wdHkoKSAmJiAiSWxsZWdhbCBtdXN0IGFsaWFzIHNldCEiKTsKKworICAgIC8vIElmIHRoaXMgaXMgYSBzZXQgb2YgTXVzdEFsaWFzZXMsIG9ubHkgY2hlY2sgdG8gc2VlIGlmIHRoZSBwb2ludGVyIGFsaWFzZXMKKyAgICAvLyBTT01FIHZhbHVlIGluIHRoZSBzZXQuLi4KKyAgICBQb2ludGVyUmVjICpTb21lUHRyID0gZ2V0U29tZVBvaW50ZXIoKTsKKyAgICBhc3NlcnQoU29tZVB0ciAmJiAiRW1wdHkgbXVzdC1hbGlhcyBzZXQ/PyIpOworICAgIHJldHVybiBBQS5hbGlhcyhTb21lUHRyLT5nZXRWYWx1ZSgpLCBTb21lUHRyLT5nZXRTaXplKCksIFB0ciwgU2l6ZSk7CisgIH0KKworICAvLyBJZiB0aGlzIGlzIGEgbWF5LWFsaWFzIHNldCwgd2UgaGF2ZSB0byBjaGVjayBhbGwgb2YgdGhlIHBvaW50ZXJzIGluIHRoZSBzZXQKKyAgLy8gdG8gYmUgc3VyZSBpdCBkb2Vzbid0IGFsaWFzIHRoZSBzZXQuLi4KKyAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoQUEuYWxpYXMoUHRyLCBTaXplLCBJLmdldFBvaW50ZXIoKSwgSS5nZXRTaXplKCkpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gQ2hlY2sgdGhlIGNhbGwgc2l0ZXMgbGlzdCBhbmQgaW52b2tlIGxpc3QuLi4KKyAgaWYgKCFDYWxsU2l0ZXMuZW1wdHkoKSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDYWxsU2l0ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChBQS5nZXRNb2RSZWZJbmZvKENhbGxTaXRlc1tpXSwgUHRyLCBTaXplKQorICAgICAgICAgICAgICAgICAgICE9IEFsaWFzQW5hbHlzaXM6Ok5vTW9kUmVmKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBbGlhc1NldDo6YWxpYXNlc0NhbGxTaXRlKENhbGxTaXRlIENTLCBBbGlhc0FuYWx5c2lzICZBQSkgY29uc3QgeworICBpZiAoQUEuZG9lc05vdEFjY2Vzc01lbW9yeShDUykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDYWxsU2l0ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoQUEuZ2V0TW9kUmVmSW5mbyhDYWxsU2l0ZXNbaV0sIENTKSAhPSBBbGlhc0FuYWx5c2lzOjpOb01vZFJlZiB8fAorICAgICAgICBBQS5nZXRNb2RSZWZJbmZvKENTLCBDYWxsU2l0ZXNbaV0pICE9IEFsaWFzQW5hbHlzaXM6Ok5vTW9kUmVmKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoQUEuZ2V0TW9kUmVmSW5mbyhDUywgSS5nZXRQb2ludGVyKCksIEkuZ2V0U2l6ZSgpKSAhPQorICAgICAgICAgICBBbGlhc0FuYWx5c2lzOjpOb01vZFJlZikKKyAgICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBbGlhc1NldFRyYWNrZXI6OmNsZWFyKCkgeworICAvLyBEZWxldGUgYWxsIHRoZSBQb2ludGVyUmVjIGVudHJpZXMuCisgIGZvciAoUG9pbnRlck1hcFR5cGU6Oml0ZXJhdG9yIEkgPSBQb2ludGVyTWFwLmJlZ2luKCksIEUgPSBQb2ludGVyTWFwLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIEktPnNlY29uZC0+ZXJhc2VGcm9tTGlzdCgpOworICAKKyAgUG9pbnRlck1hcC5jbGVhcigpOworICAKKyAgLy8gVGhlIGFsaWFzIHNldHMgc2hvdWxkIGFsbCBiZSBjbGVhciBub3cuCisgIEFsaWFzU2V0cy5jbGVhcigpOworfQorCisKKy8vLyBmaW5kQWxpYXNTZXRGb3JQb2ludGVyIC0gR2l2ZW4gYSBwb2ludGVyLCBmaW5kIHRoZSBvbmUgYWxpYXMgc2V0IHRvIHB1dCB0aGUKKy8vLyBpbnN0cnVjdGlvbiByZWZlcnJpbmcgdG8gdGhlIHBvaW50ZXIgaW50by4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBhbGlhcyBzZXRzCisvLy8gdGhhdCBtYXkgYWxpYXMgdGhlIHBvaW50ZXIsIG1lcmdlIHRoZW0gdG9nZXRoZXIgYW5kIHJldHVybiB0aGUgdW5pZmllZCBzZXQuCisvLy8KK0FsaWFzU2V0ICpBbGlhc1NldFRyYWNrZXI6OmZpbmRBbGlhc1NldEZvclBvaW50ZXIoY29uc3QgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgeworICBBbGlhc1NldCAqRm91bmRTZXQgPSAwOworICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmICghSS0+Rm9yd2FyZCAmJiBJLT5hbGlhc2VzUG9pbnRlcihQdHIsIFNpemUsIEFBKSkgeworICAgICAgaWYgKEZvdW5kU2V0ID09IDApIHsgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGFsaWFzIHNldCBwdHIgY2FuIGdvIGludG8uCisgICAgICAgIEZvdW5kU2V0ID0gSTsgICAgICAgLy8gUmVtZW1iZXIgaXQuCisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBtdXN0IG1lcmdlIHRoZSBzZXRzLgorICAgICAgICBGb3VuZFNldC0+bWVyZ2VTZXRJbigqSSwgKnRoaXMpOyAgICAgLy8gTWVyZ2UgaW4gY29udGVudHMuCisgICAgICB9CisgICAgfQorCisgIHJldHVybiBGb3VuZFNldDsKK30KKworLy8vIGNvbnRhaW5zUG9pbnRlciAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaXMgcmVwcmVzZW50ZWQgYnkKKy8vLyB0aGlzIGFsaWFzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLiAgVGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIEFTVCBvYmplY3Qgb3IKKy8vLyBhbGlhcyBzZXRzLgorYm9vbCBBbGlhc1NldFRyYWNrZXI6OmNvbnRhaW5zUG9pbnRlcihWYWx1ZSAqUHRyLCB1bnNpZ25lZCBTaXplKSBjb25zdCB7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFJLT5Gb3J3YXJkICYmIEktPmFsaWFzZXNQb2ludGVyKFB0ciwgU2l6ZSwgQUEpKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworCisKK0FsaWFzU2V0ICpBbGlhc1NldFRyYWNrZXI6OmZpbmRBbGlhc1NldEZvckNhbGxTaXRlKENhbGxTaXRlIENTKSB7CisgIEFsaWFzU2V0ICpGb3VuZFNldCA9IDA7CisgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFJLT5Gb3J3YXJkICYmIEktPmFsaWFzZXNDYWxsU2l0ZShDUywgQUEpKSB7CisgICAgICBpZiAoRm91bmRTZXQgPT0gMCkgeyAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgYWxpYXMgc2V0IHB0ciBjYW4gZ28gaW50by4KKyAgICAgICAgRm91bmRTZXQgPSBJOyAgICAgICAvLyBSZW1lbWJlciBpdC4KKyAgICAgIH0gZWxzZSBpZiAoIUktPkZvcndhcmQpIHsgICAgIC8vIE90aGVyd2lzZSwgd2UgbXVzdCBtZXJnZSB0aGUgc2V0cy4KKyAgICAgICAgRm91bmRTZXQtPm1lcmdlU2V0SW4oKkksICp0aGlzKTsgICAgIC8vIE1lcmdlIGluIGNvbnRlbnRzLgorICAgICAgfQorICAgIH0KKworICByZXR1cm4gRm91bmRTZXQ7Cit9CisKKworCisKKy8vLyBnZXRBbGlhc1NldEZvclBvaW50ZXIgLSBSZXR1cm4gdGhlIGFsaWFzIHNldCB0aGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlcgorLy8vIGxpdmVzIGluLgorQWxpYXNTZXQgJkFsaWFzU2V0VHJhY2tlcjo6Z2V0QWxpYXNTZXRGb3JQb2ludGVyKFZhbHVlICpQb2ludGVyLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKk5ldykgeworICBBbGlhc1NldDo6UG9pbnRlclJlYyAmRW50cnkgPSBnZXRFbnRyeUZvcihQb2ludGVyKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHBvaW50ZXIgaXMgYWxyZWFkeSBrbm93bi4uLgorICBpZiAoRW50cnkuaGFzQWxpYXNTZXQoKSkgeworICAgIEVudHJ5LnVwZGF0ZVNpemUoU2l6ZSk7CisgICAgLy8gUmV0dXJuIHRoZSBzZXQhCisgICAgcmV0dXJuICpFbnRyeS5nZXRBbGlhc1NldCgqdGhpcyktPmdldEZvcndhcmRlZFRhcmdldCgqdGhpcyk7CisgIH0gZWxzZSBpZiAoQWxpYXNTZXQgKkFTID0gZmluZEFsaWFzU2V0Rm9yUG9pbnRlcihQb2ludGVyLCBTaXplKSkgeworICAgIC8vIEFkZCBpdCB0byB0aGUgYWxpYXMgc2V0IGl0IGFsaWFzZXMuLi4KKyAgICBBUy0+YWRkUG9pbnRlcigqdGhpcywgRW50cnksIFNpemUpOworICAgIHJldHVybiAqQVM7CisgIH0gZWxzZSB7CisgICAgaWYgKE5ldykgKk5ldyA9IHRydWU7CisgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBhbGlhcyBzZXQgdG8gaG9sZCB0aGUgbG9hZGVkIHBvaW50ZXIuLi4KKyAgICBBbGlhc1NldHMucHVzaF9iYWNrKG5ldyBBbGlhc1NldCgpKTsKKyAgICBBbGlhc1NldHMuYmFjaygpLmFkZFBvaW50ZXIoKnRoaXMsIEVudHJ5LCBTaXplKTsKKyAgICByZXR1cm4gQWxpYXNTZXRzLmJhY2soKTsKKyAgfQorfQorCitib29sIEFsaWFzU2V0VHJhY2tlcjo6YWRkKFZhbHVlICpQdHIsIHVuc2lnbmVkIFNpemUpIHsKKyAgYm9vbCBOZXdQdHI7CisgIGFkZFBvaW50ZXIoUHRyLCBTaXplLCBBbGlhc1NldDo6Tm9Nb2RSZWYsIE5ld1B0cik7CisgIHJldHVybiBOZXdQdHI7Cit9CisKKworYm9vbCBBbGlhc1NldFRyYWNrZXI6OmFkZChMb2FkSW5zdCAqTEkpIHsKKyAgYm9vbCBOZXdQdHI7CisgIEFsaWFzU2V0ICZBUyA9IGFkZFBvaW50ZXIoTEktPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEuZ2V0VHlwZVN0b3JlU2l6ZShMSS0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc1NldDo6UmVmcywgTmV3UHRyKTsKKyAgaWYgKExJLT5pc1ZvbGF0aWxlKCkpIEFTLnNldFZvbGF0aWxlKCk7CisgIHJldHVybiBOZXdQdHI7Cit9CisKK2Jvb2wgQWxpYXNTZXRUcmFja2VyOjphZGQoU3RvcmVJbnN0ICpTSSkgeworICBib29sIE5ld1B0cjsKKyAgVmFsdWUgKlZhbCA9IFNJLT5nZXRPcGVyYW5kKDApOworICBBbGlhc1NldCAmQVMgPSBhZGRQb2ludGVyKFNJLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLmdldFR5cGVTdG9yZVNpemUoVmFsLT5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzU2V0OjpNb2RzLCBOZXdQdHIpOworICBpZiAoU0ktPmlzVm9sYXRpbGUoKSkgQVMuc2V0Vm9sYXRpbGUoKTsKKyAgcmV0dXJuIE5ld1B0cjsKK30KKworYm9vbCBBbGlhc1NldFRyYWNrZXI6OmFkZChDYWxsU2l0ZSBDUykgeworICBpZiAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKENTLmdldEluc3RydWN0aW9uKCkpKSAKKyAgICByZXR1cm4gdHJ1ZTsgLy8gSWdub3JlIERiZ0luZm8gSW50cmluc2ljcy4KKyAgaWYgKEFBLmRvZXNOb3RBY2Nlc3NNZW1vcnkoQ1MpKQorICAgIHJldHVybiB0cnVlOyAvLyBkb2Vzbid0IGFsaWFzIGFueXRoaW5nCisKKyAgQWxpYXNTZXQgKkFTID0gZmluZEFsaWFzU2V0Rm9yQ2FsbFNpdGUoQ1MpOworICBpZiAoIUFTKSB7CisgICAgQWxpYXNTZXRzLnB1c2hfYmFjayhuZXcgQWxpYXNTZXQoKSk7CisgICAgQVMgPSAmQWxpYXNTZXRzLmJhY2soKTsKKyAgICBBUy0+YWRkQ2FsbFNpdGUoQ1MsIEFBKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBUy0+YWRkQ2FsbFNpdGUoQ1MsIEFBKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBBbGlhc1NldFRyYWNrZXI6OmFkZChJbnN0cnVjdGlvbiAqSSkgeworICAvLyBEaXNwYXRjaCB0byBvbmUgb2YgdGhlIG90aGVyIGFkZCBtZXRob2RzLi4uCisgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSSkpCisgICAgcmV0dXJuIGFkZChMSSk7CisgIGVsc2UgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEkpKQorICAgIHJldHVybiBhZGQoU0kpOworICBlbHNlIGlmIChDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oSSkpCisgICAgcmV0dXJuIGFkZChDSSk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEFsaWFzU2V0VHJhY2tlcjo6YWRkKEJhc2ljQmxvY2sgJkJCKSB7CisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLmJlZ2luKCksIEUgPSBCQi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgYWRkKEkpOworfQorCit2b2lkIEFsaWFzU2V0VHJhY2tlcjo6YWRkKGNvbnN0IEFsaWFzU2V0VHJhY2tlciAmQVNUKSB7CisgIGFzc2VydCgmQUEgPT0gJkFTVC5BQSAmJgorICAgICAgICAgIk1lcmdpbmcgQWxpYXNTZXRUcmFja2VyIG9iamVjdHMgd2l0aCBkaWZmZXJlbnQgQWxpYXMgQW5hbHlzZXMhIik7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgYWxpYXMgc2V0cyBpbiBBU1QsIGFkZGluZyB0aGUgcG9pbnRlcnMgY29udGFpbmVkCisgIC8vIHRoZXJlaW4gaW50byB0aGUgY3VycmVudCBhbGlhcyBzZXRzLiAgVGhpcyBjYW4gY2F1c2UgYWxpYXMgc2V0cyB0byBiZQorICAvLyBtZXJnZWQgdG9nZXRoZXIgaW4gdGhlIGN1cnJlbnQgQVNULgorICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBBU1QuYmVnaW4oKSwgRSA9IEFTVC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFJLT5Gb3J3YXJkKSB7ICAgLy8gSWdub3JlIGZvcndhcmRpbmcgYWxpYXMgc2V0cworICAgICAgQWxpYXNTZXQgJkFTID0gY29uc3RfY2FzdDxBbGlhc1NldCY+KCpJKTsKKworICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBjYWxsIHNpdGVzIGluIHRoZSBhbGlhcyBzZXQsIGFkZCB0aGVtIHRvIHRoaXMgQVNULgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFTLkNhbGxTaXRlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBhZGQoQVMuQ2FsbFNpdGVzW2ldKTsKKworICAgICAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgcG9pbnRlcnMgaW4gdGhpcyBhbGlhcyBzZXQuLi4KKyAgICAgIEFsaWFzU2V0OjppdGVyYXRvciBJID0gQVMuYmVnaW4oKSwgRSA9IEFTLmVuZCgpOworICAgICAgYm9vbCBYOworICAgICAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIEFsaWFzU2V0ICZOZXdBUyA9IGFkZFBvaW50ZXIoSS5nZXRQb2ludGVyKCksIEkuZ2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbGlhc1NldDo6QWNjZXNzVHlwZSlBUy5BY2Nlc3NUeSwgWCk7CisgICAgICAgIGlmIChBUy5pc1ZvbGF0aWxlKCkpIE5ld0FTLnNldFZvbGF0aWxlKCk7CisgICAgICB9CisgICAgfQorfQorCisvLy8gcmVtb3ZlIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgKHBvdGVudGlhbGx5IG5vbi1lbXB0eSkgYWxpYXMgc2V0IGZyb20gdGhlCisvLy8gdHJhY2tlci4KK3ZvaWQgQWxpYXNTZXRUcmFja2VyOjpyZW1vdmUoQWxpYXNTZXQgJkFTKSB7CisgIC8vIERyb3AgYWxsIGNhbGwgc2l0ZXMuCisgIEFTLkNhbGxTaXRlcy5jbGVhcigpOworICAKKyAgLy8gQ2xlYXIgdGhlIGFsaWFzIHNldC4KKyAgdW5zaWduZWQgTnVtUmVmcyA9IDA7CisgIHdoaWxlICghQVMuZW1wdHkoKSkgeworICAgIEFsaWFzU2V0OjpQb2ludGVyUmVjICpQID0gQVMuUHRyTGlzdDsKKworICAgIFZhbHVlICpWYWxUb1JlbW92ZSA9IFAtPmdldFZhbHVlKCk7CisgICAgCisgICAgLy8gVW5saW5rIGFuZCBkZWxldGUgZW50cnkgZnJvbSB0aGUgbGlzdCBvZiB2YWx1ZXMuCisgICAgUC0+ZXJhc2VGcm9tTGlzdCgpOworICAgIAorICAgIC8vIFJlbWVtYmVyIGhvdyBtYW55IHJlZmVyZW5jZXMgbmVlZCB0byBiZSBkcm9wcGVkLgorICAgICsrTnVtUmVmczsKKworICAgIC8vIEZpbmFsbHksIHJlbW92ZSB0aGUgZW50cnkuCisgICAgUG9pbnRlck1hcC5lcmFzZShWYWxUb1JlbW92ZSk7CisgIH0KKyAgCisgIC8vIFN0b3AgdXNpbmcgdGhlIGFsaWFzIHNldCwgcmVtb3ZpbmcgaXQuCisgIEFTLlJlZkNvdW50IC09IE51bVJlZnM7CisgIGlmIChBUy5SZWZDb3VudCA9PSAwKQorICAgIEFTLnJlbW92ZUZyb21UcmFja2VyKCp0aGlzKTsKK30KKworYm9vbCBBbGlhc1NldFRyYWNrZXI6OnJlbW92ZShWYWx1ZSAqUHRyLCB1bnNpZ25lZCBTaXplKSB7CisgIEFsaWFzU2V0ICpBUyA9IGZpbmRBbGlhc1NldEZvclBvaW50ZXIoUHRyLCBTaXplKTsKKyAgaWYgKCFBUykgcmV0dXJuIGZhbHNlOworICByZW1vdmUoKkFTKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWxpYXNTZXRUcmFja2VyOjpyZW1vdmUoTG9hZEluc3QgKkxJKSB7CisgIHVuc2lnbmVkIFNpemUgPSBBQS5nZXRUeXBlU3RvcmVTaXplKExJLT5nZXRUeXBlKCkpOworICBBbGlhc1NldCAqQVMgPSBmaW5kQWxpYXNTZXRGb3JQb2ludGVyKExJLT5nZXRPcGVyYW5kKDApLCBTaXplKTsKKyAgaWYgKCFBUykgcmV0dXJuIGZhbHNlOworICByZW1vdmUoKkFTKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWxpYXNTZXRUcmFja2VyOjpyZW1vdmUoU3RvcmVJbnN0ICpTSSkgeworICB1bnNpZ25lZCBTaXplID0gQUEuZ2V0VHlwZVN0b3JlU2l6ZShTSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKTsKKyAgQWxpYXNTZXQgKkFTID0gZmluZEFsaWFzU2V0Rm9yUG9pbnRlcihTSS0+Z2V0T3BlcmFuZCgxKSwgU2l6ZSk7CisgIGlmICghQVMpIHJldHVybiBmYWxzZTsKKyAgcmVtb3ZlKCpBUyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEFsaWFzU2V0VHJhY2tlcjo6cmVtb3ZlKENhbGxTaXRlIENTKSB7CisgIGlmIChBQS5kb2VzTm90QWNjZXNzTWVtb3J5KENTKSkKKyAgICByZXR1cm4gZmFsc2U7IC8vIGRvZXNuJ3QgYWxpYXMgYW55dGhpbmcKKworICBBbGlhc1NldCAqQVMgPSBmaW5kQWxpYXNTZXRGb3JDYWxsU2l0ZShDUyk7CisgIGlmICghQVMpIHJldHVybiBmYWxzZTsKKyAgcmVtb3ZlKCpBUyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEFsaWFzU2V0VHJhY2tlcjo6cmVtb3ZlKEluc3RydWN0aW9uICpJKSB7CisgIC8vIERpc3BhdGNoIHRvIG9uZSBvZiB0aGUgb3RoZXIgcmVtb3ZlIG1ldGhvZHMuLi4KKyAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihJKSkKKyAgICByZXR1cm4gcmVtb3ZlKExJKTsKKyAgZWxzZSBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oSSkpCisgICAgcmV0dXJuIHJlbW92ZShTSSk7CisgIGVsc2UgaWYgKENhbGxJbnN0ICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PihJKSkKKyAgICByZXR1cm4gcmVtb3ZlKENJKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gZGVsZXRlVmFsdWUgbWV0aG9kIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZW1vdmUgYSBwb2ludGVyIHZhbHVlIGZyb20gdGhlCisvLyBBbGlhc1NldFRyYWNrZXIgZW50aXJlbHkuICBJdCBzaG91bGQgYmUgdXNlZCB3aGVuIGFuIGluc3RydWN0aW9uIGlzIGRlbGV0ZWQKKy8vIGZyb20gdGhlIHByb2dyYW0gdG8gdXBkYXRlIHRoZSBBU1QuICBJZiB5b3UgZG9uJ3QgdXNlIHRoaXMsIHlvdSB3b3VsZCBoYXZlCisvLyBkYW5nbGluZyBwb2ludGVycyB0byBkZWxldGVkIGluc3RydWN0aW9ucy4KKy8vCit2b2lkIEFsaWFzU2V0VHJhY2tlcjo6ZGVsZXRlVmFsdWUoVmFsdWUgKlB0clZhbCkgeworICAvLyBOb3RpZnkgdGhlIGFsaWFzIGFuYWx5c2lzIGltcGxlbWVudGF0aW9uIHRoYXQgdGhpcyB2YWx1ZSBpcyBnb25lLgorICBBQS5kZWxldGVWYWx1ZShQdHJWYWwpOworCisgIC8vIElmIHRoaXMgaXMgYSBjYWxsIGluc3RydWN0aW9uLCByZW1vdmUgdGhlIGNhbGxzaXRlIGZyb20gdGhlIGFwcHJvcHJpYXRlCisgIC8vIEFsaWFzU2V0LgorICBpZiAoQ2FsbFNpdGUgQ1MgPSBQdHJWYWwpCisgICAgaWYgKCFBQS5kb2VzTm90QWNjZXNzTWVtb3J5KENTKSkKKyAgICAgIGlmIChBbGlhc1NldCAqQVMgPSBmaW5kQWxpYXNTZXRGb3JDYWxsU2l0ZShDUykpCisgICAgICAgIEFTLT5yZW1vdmVDYWxsU2l0ZShDUyk7CisKKyAgLy8gRmlyc3QsIGxvb2sgdXAgdGhlIFBvaW50ZXJSZWMgZm9yIHRoaXMgcG9pbnRlci4KKyAgUG9pbnRlck1hcFR5cGU6Oml0ZXJhdG9yIEkgPSBQb2ludGVyTWFwLmZpbmQoUHRyVmFsKTsKKyAgaWYgKEkgPT0gUG9pbnRlck1hcC5lbmQoKSkgcmV0dXJuOyAgLy8gTm9vcAorCisgIC8vIElmIHdlIGZvdW5kIG9uZSwgcmVtb3ZlIHRoZSBwb2ludGVyIGZyb20gdGhlIGFsaWFzIHNldCBpdCBpcyBpbi4KKyAgQWxpYXNTZXQ6OlBvaW50ZXJSZWMgKlB0clZhbEVudCA9IEktPnNlY29uZDsKKyAgQWxpYXNTZXQgKkFTID0gUHRyVmFsRW50LT5nZXRBbGlhc1NldCgqdGhpcyk7CisKKyAgLy8gVW5saW5rIGFuZCBkZWxldGUgZnJvbSB0aGUgbGlzdCBvZiB2YWx1ZXMuCisgIFB0clZhbEVudC0+ZXJhc2VGcm9tTGlzdCgpOworICAKKyAgLy8gU3RvcCB1c2luZyB0aGUgYWxpYXMgc2V0LgorICBBUy0+ZHJvcFJlZigqdGhpcyk7CisgIAorICBQb2ludGVyTWFwLmVyYXNlKEkpOworfQorCisvLyBjb3B5VmFsdWUgLSBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciBhIHByZWV4aXN0aW5nIHZhbHVlIGluIHRoZQorLy8gcHJvZ3JhbSBpcyBjb3BpZWQgb3IgY2xvbmVkLCBpbnRyb2R1Y2luZyBhIG5ldyB2YWx1ZS4gIE5vdGUgdGhhdCBpdCBpcyBvayBmb3IKKy8vIGNsaWVudHMgdGhhdCB1c2UgdGhpcyBtZXRob2QgdG8gaW50cm9kdWNlIHRoZSBzYW1lIHZhbHVlIG11bHRpcGxlIHRpbWVzOiBpZgorLy8gdGhlIHRyYWNrZXIgYWxyZWFkeSBrbm93cyBhYm91dCBhIHZhbHVlLCBpdCB3aWxsIGlnbm9yZSB0aGUgcmVxdWVzdC4KKy8vCit2b2lkIEFsaWFzU2V0VHJhY2tlcjo6Y29weVZhbHVlKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pIHsKKyAgLy8gTm90aWZ5IHRoZSBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IHRoaXMgdmFsdWUgaXMgY29waWVkLgorICBBQS5jb3B5VmFsdWUoRnJvbSwgVG8pOworCisgIC8vIEZpcnN0LCBsb29rIHVwIHRoZSBQb2ludGVyUmVjIGZvciB0aGlzIHBvaW50ZXIuCisgIFBvaW50ZXJNYXBUeXBlOjppdGVyYXRvciBJID0gUG9pbnRlck1hcC5maW5kKEZyb20pOworICBpZiAoSSA9PSBQb2ludGVyTWFwLmVuZCgpKQorICAgIHJldHVybjsgIC8vIE5vb3AKKyAgYXNzZXJ0KEktPnNlY29uZC0+aGFzQWxpYXNTZXQoKSAmJiAiRGVhZCBlbnRyeT8iKTsKKworICBBbGlhc1NldDo6UG9pbnRlclJlYyAmRW50cnkgPSBnZXRFbnRyeUZvcihUbyk7CisgIGlmIChFbnRyeS5oYXNBbGlhc1NldCgpKSByZXR1cm47ICAgIC8vIEFscmVhZHkgaW4gdGhlIHRyYWNrZXIhCisKKyAgLy8gQWRkIGl0IHRvIHRoZSBhbGlhcyBzZXQgaXQgYWxpYXNlcy4uLgorICBJID0gUG9pbnRlck1hcC5maW5kKEZyb20pOworICBBbGlhc1NldCAqQVMgPSBJLT5zZWNvbmQtPmdldEFsaWFzU2V0KCp0aGlzKTsKKyAgQVMtPmFkZFBvaW50ZXIoKnRoaXMsIEVudHJ5LCBJLT5zZWNvbmQtPmdldFNpemUoKSwgdHJ1ZSk7Cit9CisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICBBbGlhc1NldC9BbGlhc1NldFRyYWNrZXIgUHJpbnRpbmcgU3VwcG9ydAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBBbGlhc1NldDo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICIgIEFsaWFzU2V0WyIgPDwgZm9ybWF0KCIweCVwIiwgKHZvaWQqKXRoaXMpIDw8ICIsIiA8PCBSZWZDb3VudCA8PCAiXSAiOworICBPUyA8PCAoQWxpYXNUeSA9PSBNdXN0QWxpYXMgPyAibXVzdCIgOiAibWF5IikgPDwgIiBhbGlhcywgIjsKKyAgc3dpdGNoIChBY2Nlc3NUeSkgeworICBjYXNlIE5vTW9kUmVmOiBPUyA8PCAiTm8gYWNjZXNzICI7IGJyZWFrOworICBjYXNlIFJlZnMgICAgOiBPUyA8PCAiUmVmICAgICAgICI7IGJyZWFrOworICBjYXNlIE1vZHMgICAgOiBPUyA8PCAiTW9kICAgICAgICI7IGJyZWFrOworICBjYXNlIE1vZFJlZiAgOiBPUyA8PCAiTW9kL1JlZiAgICI7IGJyZWFrOworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJCYWQgdmFsdWUgZm9yIEFjY2Vzc1R5ISIpOworICB9CisgIGlmIChpc1ZvbGF0aWxlKCkpIE9TIDw8ICJbdm9sYXRpbGVdICI7CisgIGlmIChGb3J3YXJkKQorICAgIE9TIDw8ICIgZm9yd2FyZGluZyB0byAiIDw8ICh2b2lkKilGb3J3YXJkOworCisKKyAgaWYgKCFlbXB0eSgpKSB7CisgICAgT1MgPDwgIlBvaW50ZXJzOiAiOworICAgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChJICE9IGJlZ2luKCkpIE9TIDw8ICIsICI7CisgICAgICBXcml0ZUFzT3BlcmFuZChPUyA8PCAiKCIsIEkuZ2V0UG9pbnRlcigpKTsKKyAgICAgIE9TIDw8ICIsICIgPDwgSS5nZXRTaXplKCkgPDwgIikiOworICAgIH0KKyAgfQorICBpZiAoIUNhbGxTaXRlcy5lbXB0eSgpKSB7CisgICAgT1MgPDwgIlxuICAgICIgPDwgQ2FsbFNpdGVzLnNpemUoKSA8PCAiIENhbGwgU2l0ZXM6ICI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENhbGxTaXRlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoaSkgT1MgPDwgIiwgIjsKKyAgICAgIFdyaXRlQXNPcGVyYW5kKE9TLCBDYWxsU2l0ZXNbaV0uZ2V0Q2FsbGVkVmFsdWUoKSk7CisgICAgfQorICB9CisgIE9TIDw8ICJcbiI7Cit9CisKK3ZvaWQgQWxpYXNTZXRUcmFja2VyOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIkFsaWFzIFNldCBUcmFja2VyOiAiIDw8IEFsaWFzU2V0cy5zaXplKCkgPDwgIiBhbGlhcyBzZXRzIGZvciAiCisgICAgIDw8IFBvaW50ZXJNYXAuc2l6ZSgpIDw8ICIgcG9pbnRlciB2YWx1ZXMuXG4iOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIEktPnByaW50KE9TKTsKKyAgT1MgPDwgIlxuIjsKK30KKwordm9pZCBBbGlhc1NldDo6ZHVtcCgpIGNvbnN0IHsgcHJpbnQoZGJncygpKTsgfQordm9pZCBBbGlhc1NldFRyYWNrZXI6OmR1bXAoKSBjb25zdCB7IHByaW50KGRiZ3MoKSk7IH0KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgQVNUQ2FsbGJhY2tWSCBDbGFzcyBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBBbGlhc1NldFRyYWNrZXI6OkFTVENhbGxiYWNrVkg6OmRlbGV0ZWQoKSB7CisgIGFzc2VydChBU1QgJiYgIkFTVENhbGxiYWNrVkggY2FsbGVkIHdpdGggYSBudWxsIEFsaWFzU2V0VHJhY2tlciEiKTsKKyAgQVNULT5kZWxldGVWYWx1ZShnZXRWYWxQdHIoKSk7CisgIC8vIHRoaXMgbm93IGRhbmdsZXMhCit9CisKK0FsaWFzU2V0VHJhY2tlcjo6QVNUQ2FsbGJhY2tWSDo6QVNUQ2FsbGJhY2tWSChWYWx1ZSAqViwgQWxpYXNTZXRUcmFja2VyICphc3QpCisgIDogQ2FsbGJhY2tWSChWKSwgQVNUKGFzdCkge30KKworQWxpYXNTZXRUcmFja2VyOjpBU1RDYWxsYmFja1ZIICYKK0FsaWFzU2V0VHJhY2tlcjo6QVNUQ2FsbGJhY2tWSDo6b3BlcmF0b3I9KFZhbHVlICpWKSB7CisgIHJldHVybiAqdGhpcyA9IEFTVENhbGxiYWNrVkgoViwgQVNUKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzU2V0UHJpbnRlciBQYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgeworICBjbGFzcyBBbGlhc1NldFByaW50ZXIgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgICBBbGlhc1NldFRyYWNrZXIgKlRyYWNrZXI7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIEFsaWFzU2V0UHJpbnRlcigpIDogRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8QWxpYXNBbmFseXNpcz4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICAgICAgVHJhY2tlciA9IG5ldyBBbGlhc1NldFRyYWNrZXIoZ2V0QW5hbHlzaXM8QWxpYXNBbmFseXNpcz4oKSk7CisKKyAgICAgIGZvciAoaW5zdF9pdGVyYXRvciBJID0gaW5zdF9iZWdpbihGKSwgRSA9IGluc3RfZW5kKEYpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgVHJhY2tlci0+YWRkKCYqSSk7CisgICAgICBUcmFja2VyLT5wcmludChlcnJzKCkpOworICAgICAgZGVsZXRlIFRyYWNrZXI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9OworfQorCitjaGFyIEFsaWFzU2V0UHJpbnRlcjo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKEFsaWFzU2V0UHJpbnRlciwgInByaW50LWFsaWFzLXNldHMiLAorICAgICAgICAgICAgICAgICJBbGlhcyBTZXQgUHJpbnRlciIsIGZhbHNlLCB0cnVlKTsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9CYXNpY0FsaWFzQW5hbHlzaXMuY3BwIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0Jhc2ljQWxpYXNBbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5N2ZhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9CYXNpY0FsaWFzQW5hbHlzaXMuY3BwCkBAIC0wLDAgKzEsODQyIEBACisvLz09PS0gQmFzaWNBbGlhc0FuYWx5c2lzLmNwcCAtIExvY2FsIEFsaWFzIEFuYWx5c2lzIEltcGwgLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBBbGlhcyBBbmFseXNpcyBpbnRlcmZhY2UKKy8vIHRoYXQgc2ltcGx5IGltcGxlbWVudHMgYSBmZXcgaWRlbnRpdGllcyAodHdvIGRpZmZlcmVudCBnbG9iYWxzIGNhbm5vdCBhbGlhcywKKy8vIGV0YyksIGJ1dCBvdGhlcndpc2UgZG9lcyBubyBhbmFseXNpcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NhcHR1cmVUcmFja2luZy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVmFsdWVUcmFja2luZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFVzZWZ1bCBwcmVkaWNhdGVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gaXNLbm93bk5vbk51bGwgLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBrbm93IHRoYXQgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBuZXZlcgorLy8vIG51bGwuCitzdGF0aWMgYm9vbCBpc0tub3duTm9uTnVsbChjb25zdCBWYWx1ZSAqVikgeworICAvLyBBbGxvY2EgbmV2ZXIgcmV0dXJucyBudWxsLCBtYWxsb2MgbWlnaHQuCisgIGlmIChpc2E8QWxsb2NhSW5zdD4oVikpIHJldHVybiB0cnVlOworICAKKyAgLy8gQSBieXZhbCBhcmd1bWVudCBpcyBuZXZlciBudWxsLgorICBpZiAoY29uc3QgQXJndW1lbnQgKkEgPSBkeW5fY2FzdDxBcmd1bWVudD4oVikpCisgICAgcmV0dXJuIEEtPmhhc0J5VmFsQXR0cigpOworCisgIC8vIEdsb2JhbCB2YWx1ZXMgYXJlIG5vdCBudWxsIHVubGVzcyBleHRlcm4gd2Vhay4KKyAgaWYgKGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhbHVlPihWKSkKKyAgICByZXR1cm4gIUdWLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzTm9uRXNjYXBpbmdMb2NhbE9iamVjdCAtIFJldHVybiB0cnVlIGlmIHRoZSBwb2ludGVyIGlzIHRvIGEgZnVuY3Rpb24tbG9jYWwKKy8vLyBvYmplY3QgdGhhdCBuZXZlciBlc2NhcGVzIGZyb20gdGhlIGZ1bmN0aW9uLgorc3RhdGljIGJvb2wgaXNOb25Fc2NhcGluZ0xvY2FsT2JqZWN0KGNvbnN0IFZhbHVlICpWKSB7CisgIC8vIElmIHRoaXMgaXMgYSBsb2NhbCBhbGxvY2F0aW9uLCBjaGVjayB0byBzZWUgaWYgaXQgZXNjYXBlcy4KKyAgaWYgKGlzYTxBbGxvY2FJbnN0PihWKSB8fCBpc05vQWxpYXNDYWxsKFYpKQorICAgIC8vIFNldCBTdG9yZUNhcHR1cmVzIHRvIFRydWUgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGluIG91ciBjYWxsZXJzIHRoYXQgdGhlCisgICAgLy8gcG9pbnRlciBpcyBub3QgdGhlIHJlc3VsdCBvZiBhIGxvYWQgaW5zdHJ1Y3Rpb24uIEN1cnJlbnRseQorICAgIC8vIFBvaW50ZXJNYXlCZUNhcHR1cmVkIGRvZXNuJ3QgaGF2ZSBhbnkgc3BlY2lhbCBhbmFseXNpcyBmb3IgdGhlCisgICAgLy8gU3RvcmVDYXB0dXJlcz1mYWxzZSBjYXNlOyBpZiBpdCBkaWQsIG91ciBjYWxsZXJzIGNvdWxkIGJlIHJlZmluZWQgdG8gYmUKKyAgICAvLyBtb3JlIHByZWNpc2UuCisgICAgcmV0dXJuICFQb2ludGVyTWF5QmVDYXB0dXJlZChWLCBmYWxzZSwgLypTdG9yZUNhcHR1cmVzPSovdHJ1ZSk7CisKKyAgLy8gSWYgdGhpcyBpcyBhbiBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgYnl2YWwgb3Igbm9hbGlhcyBhcmd1bWVudCwKKyAgLy8gdGhlbiBpdCBoYXMgbm90IGVzY2FwZWQgYmVmb3JlIGVudGVyaW5nIHRoZSBmdW5jdGlvbi4gIENoZWNrIGlmIGl0IGVzY2FwZXMKKyAgLy8gaW5zaWRlIHRoZSBmdW5jdGlvbi4KKyAgaWYgKGNvbnN0IEFyZ3VtZW50ICpBID0gZHluX2Nhc3Q8QXJndW1lbnQ+KFYpKQorICAgIGlmIChBLT5oYXNCeVZhbEF0dHIoKSB8fCBBLT5oYXNOb0FsaWFzQXR0cigpKSB7CisgICAgICAvLyBEb24ndCBib3RoZXIgYW5hbHl6aW5nIGFyZ3VtZW50cyBhbHJlYWR5IGtub3duIG5vdCB0byBlc2NhcGUuCisgICAgICBpZiAoQS0+aGFzTm9DYXB0dXJlQXR0cigpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiAhUG9pbnRlck1heUJlQ2FwdHVyZWQoViwgZmFsc2UsIC8qU3RvcmVDYXB0dXJlcz0qL3RydWUpOworICAgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNFc2NhcGVTb3VyY2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcG9pbnRlciBpcyBvbmUgd2hpY2ggd291bGQgaGF2ZQorLy8vIGJlZW4gY29uc2lkZXJlZCBhbiBlc2NhcGUgYnkgaXNOb25Fc2NhcGluZ0xvY2FsT2JqZWN0Lgorc3RhdGljIGJvb2wgaXNFc2NhcGVTb3VyY2UoY29uc3QgVmFsdWUgKlYpIHsKKyAgaWYgKGlzYTxDYWxsSW5zdD4oVikgfHwgSVNBX0lOVk9LRV9JTlNUKFYpIHx8IGlzYTxBcmd1bWVudD4oVikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gVGhlIGxvYWQgY2FzZSB3b3JrcyBiZWNhdXNlIGlzTm9uRXNjYXBpbmdMb2NhbE9iamVjdCBjb25zaWRlcnMgYWxsCisgIC8vIHN0b3JlcyB0byBiZSBlc2NhcGVzIChpdCBwYXNzZXMgdHJ1ZSBmb3IgdGhlIFN0b3JlQ2FwdHVyZXMgYXJndW1lbnQKKyAgLy8gdG8gUG9pbnRlck1heUJlQ2FwdHVyZWQpLgorICBpZiAoaXNhPExvYWRJbnN0PihWKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBpc09iamVjdFNtYWxsZXJUaGFuIC0gUmV0dXJuIHRydWUgaWYgd2UgY2FuIHByb3ZlIHRoYXQgdGhlIG9iamVjdCBzcGVjaWZpZWQKKy8vLyBieSBWIGlzIHNtYWxsZXIgdGhhbiBTaXplLgorc3RhdGljIGJvb2wgaXNPYmplY3RTbWFsbGVyVGhhbihjb25zdCBWYWx1ZSAqViwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAmVEQpIHsKKyAgY29uc3QgVHlwZSAqQWNjZXNzVHk7CisgIGlmIChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oVikpIHsKKyAgICBBY2Nlc3NUeSA9IEdWLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCk7CisgIH0gZWxzZSBpZiAoY29uc3QgQWxsb2NhSW5zdCAqQUkgPSBkeW5fY2FzdDxBbGxvY2FJbnN0PihWKSkgeworICAgIGlmICghQUktPmlzQXJyYXlBbGxvY2F0aW9uKCkpCisgICAgICBBY2Nlc3NUeSA9IEFJLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKGNvbnN0IEFyZ3VtZW50ICpBID0gZHluX2Nhc3Q8QXJndW1lbnQ+KFYpKSB7CisgICAgaWYgKEEtPmhhc0J5VmFsQXR0cigpKQorICAgICAgQWNjZXNzVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihBLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIGlmIChBY2Nlc3NUeS0+aXNTaXplZCgpKQorICAgIHJldHVybiBURC5nZXRUeXBlQWxsb2NTaXplKEFjY2Vzc1R5KSA8IFNpemU7CisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE5vQUEgUGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbmFtZXNwYWNlIHsKKyAgLy8vIE5vQUEgLSBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIC1uby1hYSBwYXNzLCB3aGljaCBhbHdheXMgcmV0dXJucyAiSQorICAvLy8gZG9uJ3Qga25vdyIgZm9yIGFsaWFzIHF1ZXJpZXMuICBOb0FBIGlzIHVubGlrZSBvdGhlciBhbGlhcyBhbmFseXNpcworICAvLy8gaW1wbGVtZW50YXRpb25zLCBpbiB0aGF0IGl0IGRvZXMgbm90IGNoYWluIHRvIGEgcHJldmlvdXMgYW5hbHlzaXMuICBBcworICAvLy8gc3VjaCBpdCBkb2Vzbid0IGZvbGxvdyBtYW55IG9mIHRoZSBydWxlcyB0aGF0IG90aGVyIGFsaWFzIGFuYWx5c2VzIG11c3QuCisgIC8vLworICBzdHJ1Y3QgTm9BQSA6IHB1YmxpYyBJbW11dGFibGVQYXNzLCBwdWJsaWMgQWxpYXNBbmFseXNpcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIENsYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWluZm8KKyAgICBOb0FBKCkgOiBJbW11dGFibGVQYXNzKElEKSB7fQorICAgIGV4cGxpY2l0IE5vQUEoY2hhciAmUElEKSA6IEltbXV0YWJsZVBhc3MoUElEKSB7IH0KKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVQYXNzKCkgeworICAgICAgVEQgPSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFRhcmdldERhdGE+KCk7CisgICAgfQorCisgICAgdmlydHVhbCBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBWYWx1ZSAqVjEsIHVuc2lnbmVkIFYxU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpWMiwgdW5zaWduZWQgVjJTaXplKSB7CisgICAgICByZXR1cm4gTWF5QWxpYXM7CisgICAgfQorCisgICAgdmlydHVhbCBNb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUykgeworICAgICAgcmV0dXJuIFVua25vd25Nb2RSZWZCZWhhdmlvcjsKKyAgICB9CisgICAgdmlydHVhbCBNb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihjb25zdCBGdW5jdGlvbiAqRikgeworICAgICAgcmV0dXJuIFVua25vd25Nb2RSZWZCZWhhdmlvcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcG9pbnRzVG9Db25zdGFudE1lbW9yeShjb25zdCBWYWx1ZSAqUCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIE1vZFJlZlJlc3VsdCBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlAsIHVuc2lnbmVkIFNpemUpIHsKKyAgICAgIHJldHVybiBNb2RSZWY7CisgICAgfQorICAgIHZpcnR1YWwgTW9kUmVmUmVzdWx0IGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MyKSB7CisgICAgICByZXR1cm4gTW9kUmVmOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVWYWx1ZShWYWx1ZSAqVikge30KKyAgICB2aXJ0dWFsIHZvaWQgY29weVZhbHVlKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pIHt9CisgICAgCisgICAgLy8vIGdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIGEgcGFzcyBpbXBsZW1lbnRzCisgICAgLy8vIGFuIGFuYWx5c2lzIGludGVyZmFjZSB0aHJvdWdoIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgSWYgbmVlZGVkLCBpdAorICAgIC8vLyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBhZGp1c3QgdGhlIHRoaXMgcG9pbnRlciBhcyBuZWVkZWQgZm9yIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgcGFzcyBpbmZvLgorICAgIHZpcnR1YWwgdm9pZCAqZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIoY29uc3Qgdm9pZCAqSUQpIHsKKyAgICAgIGlmIChJRCA9PSAmQWxpYXNBbmFseXNpczo6SUQpCisgICAgICAgIHJldHVybiAoQWxpYXNBbmFseXNpcyopdGhpczsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfTsKK30gIC8vIEVuZCBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIFJlZ2lzdGVyIHRoaXMgcGFzcy4uLgorY2hhciBOb0FBOjpJRCA9IDA7CitJTklUSUFMSVpFX0FHX1BBU1MoTm9BQSwgQWxpYXNBbmFseXNpcywgIm5vLWFhIiwKKyAgICAgICAgICAgICAgICAgICAiTm8gQWxpYXMgQW5hbHlzaXMgKGFsd2F5cyByZXR1cm5zICdtYXknIGFsaWFzKSIsCisgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOworCitJbW11dGFibGVQYXNzICpsbHZtOjpjcmVhdGVOb0FBUGFzcygpIHsgcmV0dXJuIG5ldyBOb0FBKCk7IH0KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJhc2ljQWxpYXNBbmFseXNpcyBQYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE5ERUJVRworc3RhdGljIGNvbnN0IEZ1bmN0aW9uICpnZXRQYXJlbnQoY29uc3QgVmFsdWUgKlYpIHsKKyAgaWYgKGNvbnN0IEluc3RydWN0aW9uICppbnN0ID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKQorICAgIHJldHVybiBpbnN0LT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisKKyAgaWYgKGNvbnN0IEFyZ3VtZW50ICphcmcgPSBkeW5fY2FzdDxBcmd1bWVudD4oVikpCisgICAgcmV0dXJuIGFyZy0+Z2V0UGFyZW50KCk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIG5vdERpZmZlcmVudFBhcmVudChjb25zdCBWYWx1ZSAqTzEsIGNvbnN0IFZhbHVlICpPMikgeworCisgIGNvbnN0IEZ1bmN0aW9uICpGMSA9IGdldFBhcmVudChPMSk7CisgIGNvbnN0IEZ1bmN0aW9uICpGMiA9IGdldFBhcmVudChPMik7CisKKyAgcmV0dXJuICFGMSB8fCAhRjIgfHwgRjEgPT0gRjI7Cit9CisjZW5kaWYKKworbmFtZXNwYWNlIHsKKyAgLy8vIEJhc2ljQWxpYXNBbmFseXNpcyAtIFRoaXMgaXMgdGhlIGRlZmF1bHQgYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24uCisgIC8vLyBCZWNhdXNlIGl0IGRvZXNuJ3QgY2hhaW4gdG8gYSBwcmV2aW91cyBhbGlhcyBhbmFseXNpcyAobGlrZSAtbm8tYWEpLCBpdAorICAvLy8gZGVyaXZlcyBmcm9tIHRoZSBOb0FBIGNsYXNzLgorICBzdHJ1Y3QgQmFzaWNBbGlhc0FuYWx5c2lzIDogcHVibGljIE5vQUEgeworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBDbGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpbmZvCisgICAgQmFzaWNBbGlhc0FuYWx5c2lzKCkgOiBOb0FBKElEKSB7fQorCisgICAgdmlydHVhbCBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBWYWx1ZSAqVjEsIHVuc2lnbmVkIFYxU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpWMiwgdW5zaWduZWQgVjJTaXplKSB7CisgICAgICBhc3NlcnQoVmlzaXRlZC5lbXB0eSgpICYmICJWaXNpdGVkIG11c3QgYmUgY2xlYXJlZCBhZnRlciB1c2UhIik7CisgICAgICBhc3NlcnQobm90RGlmZmVyZW50UGFyZW50KFYxLCBWMikgJiYKKyAgICAgICAgICAgICAiQmFzaWNBbGlhc0FuYWx5c2lzIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlcnByb2NlZHVyYWwgcXVlcmllcy4iKTsKKyAgICAgIEFsaWFzUmVzdWx0IEFsaWFzID0gYWxpYXNDaGVjayhWMSwgVjFTaXplLCBWMiwgVjJTaXplKTsKKyAgICAgIFZpc2l0ZWQuY2xlYXIoKTsKKyAgICAgIHJldHVybiBBbGlhczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIE1vZFJlZlJlc3VsdCBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlAsIHVuc2lnbmVkIFNpemUpOworCisgICAgdmlydHVhbCBNb2RSZWZSZXN1bHQgZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVDYWxsU2l0ZSBDUzIpIHsKKyAgICAgIC8vIFRoZSBBbGlhc0FuYWx5c2lzIGJhc2UgY2xhc3MgaGFzIHNvbWUgc21hcnRzLCBsZXRzIHVzZSB0aGVtLgorICAgICAgcmV0dXJuIEFsaWFzQW5hbHlzaXM6OmdldE1vZFJlZkluZm8oQ1MxLCBDUzIpOworICAgIH0KKworICAgIC8vLyBwb2ludHNUb0NvbnN0YW50TWVtb3J5IC0gQ2hhc2UgcG9pbnRlcnMgdW50aWwgd2UgZmluZCBhIChjb25zdGFudAorICAgIC8vLyBnbG9iYWwpIG9yIG5vdC4KKyAgICB2aXJ0dWFsIGJvb2wgcG9pbnRzVG9Db25zdGFudE1lbW9yeShjb25zdCBWYWx1ZSAqUCk7CisKKyAgICAvLy8gZ2V0TW9kUmVmQmVoYXZpb3IgLSBSZXR1cm4gdGhlIGJlaGF2aW9yIHdoZW4gY2FsbGluZyB0aGUgZ2l2ZW4KKyAgICAvLy8gY2FsbCBzaXRlLgorICAgIHZpcnR1YWwgTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpOworCisgICAgLy8vIGdldE1vZFJlZkJlaGF2aW9yIC0gUmV0dXJuIHRoZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uLgorICAgIC8vLyBGb3IgdXNlIHdoZW4gdGhlIGNhbGwgc2l0ZSBpcyBub3Qga25vd24uCisgICAgdmlydHVhbCBNb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihjb25zdCBGdW5jdGlvbiAqRik7CisKKyAgICAvLy8gZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gYSBwYXNzIGltcGxlbWVudHMKKyAgICAvLy8gYW4gYW5hbHlzaXMgaW50ZXJmYWNlIHRocm91Z2ggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiBuZWVkZWQsIGl0CisgICAgLy8vIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGFkanVzdCB0aGUgdGhpcyBwb2ludGVyIGFzIG5lZWRlZCBmb3IgdGhlCisgICAgLy8vIHNwZWNpZmllZCBwYXNzIGluZm8uCisgICAgdmlydHVhbCB2b2lkICpnZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlcihjb25zdCB2b2lkICpJRCkgeworICAgICAgaWYgKElEID09ICZBbGlhc0FuYWx5c2lzOjpJRCkKKyAgICAgICAgcmV0dXJuIChBbGlhc0FuYWx5c2lzKil0aGlzOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICBwcml2YXRlOgorICAgIC8vIFZpc2l0ZWQgLSBUcmFjayBpbnN0cnVjdGlvbnMgdmlzaXRlZCBieSBhIGFsaWFzUEhJLCBhbGlhc1NlbGVjdCgpLCBhbmQgYWxpYXNHRVAoKS4KKyAgICBTbWFsbFB0clNldDxjb25zdCBWYWx1ZSosIDE2PiBWaXNpdGVkOworCisgICAgLy8gYWxpYXNHRVAgLSBQcm92aWRlIGEgYnVuY2ggb2YgYWQtaG9jIHJ1bGVzIHRvIGRpc2FtYmlndWF0ZSBhIEdFUAorICAgIC8vIGluc3RydWN0aW9uIGFnYWluc3QgYW5vdGhlci4KKyAgICBBbGlhc1Jlc3VsdCBhbGlhc0dFUChjb25zdCBHRVBPcGVyYXRvciAqVjEsIHVuc2lnbmVkIFYxU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVjIsIHVuc2lnbmVkIFYyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVW5kZXJseWluZ1YxLCBjb25zdCBWYWx1ZSAqVW5kZXJseWluZ1YyKTsKKworICAgIC8vIGFsaWFzUEhJIC0gUHJvdmlkZSBhIGJ1bmNoIG9mIGFkLWhvYyBydWxlcyB0byBkaXNhbWJpZ3VhdGUgYSBQSEkKKyAgICAvLyBpbnN0cnVjdGlvbiBhZ2FpbnN0IGFub3RoZXIuCisgICAgQWxpYXNSZXN1bHQgYWxpYXNQSEkoY29uc3QgUEhJTm9kZSAqUE4sIHVuc2lnbmVkIFBOU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVjIsIHVuc2lnbmVkIFYyU2l6ZSk7CisKKyAgICAvLy8gYWxpYXNTZWxlY3QgLSBEaXNhbWJpZ3VhdGUgYSBTZWxlY3QgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhbm90aGVyIHZhbHVlLgorICAgIEFsaWFzUmVzdWx0IGFsaWFzU2VsZWN0KGNvbnN0IFNlbGVjdEluc3QgKlNJLCB1bnNpZ25lZCBTSVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlYyLCB1bnNpZ25lZCBWMlNpemUpOworCisgICAgQWxpYXNSZXN1bHQgYWxpYXNDaGVjayhjb25zdCBWYWx1ZSAqVjEsIHVuc2lnbmVkIFYxU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpWMiwgdW5zaWduZWQgVjJTaXplKTsKKyAgfTsKK30gIC8vIEVuZCBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIFJlZ2lzdGVyIHRoaXMgcGFzcy4uLgorY2hhciBCYXNpY0FsaWFzQW5hbHlzaXM6OklEID0gMDsKK0lOSVRJQUxJWkVfQUdfUEFTUyhCYXNpY0FsaWFzQW5hbHlzaXMsIEFsaWFzQW5hbHlzaXMsICJiYXNpY2FhIiwKKyAgICAgICAgICAgICAgICAgICAiQmFzaWMgQWxpYXMgQW5hbHlzaXMgKGRlZmF1bHQgQUEgaW1wbCkiLAorICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCB0cnVlKTsKKworSW1tdXRhYmxlUGFzcyAqbGx2bTo6Y3JlYXRlQmFzaWNBbGlhc0FuYWx5c2lzUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBCYXNpY0FsaWFzQW5hbHlzaXMoKTsKK30KKworCisvLy8gcG9pbnRzVG9Db25zdGFudE1lbW9yeSAtIENoYXNlIHBvaW50ZXJzIHVudGlsIHdlIGZpbmQgYSAoY29uc3RhbnQKKy8vLyBnbG9iYWwpIG9yIG5vdC4KK2Jvb2wgQmFzaWNBbGlhc0FuYWx5c2lzOjpwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IFZhbHVlICpQKSB7CisgIGlmIChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YgPSAKKyAgICAgICAgZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KFAtPmdldFVuZGVybHlpbmdPYmplY3QoKSkpCisgICAgLy8gTm90ZTogdGhpcyBkb2Vzbid0IHJlcXVpcmUgR1YgdG8gYmUgIk9EUiIgYmVjYXVzZSBpdCBpc24ndCBsZWdhbCBmb3IgYQorICAgIC8vIGdsb2JhbCB0byBiZSBtYXJrZWQgY29uc3RhbnQgaW4gc29tZSBtb2R1bGVzIGFuZCBub24tY29uc3RhbnQgaW4gb3RoZXJzLgorICAgIC8vIEdWIG1heSBldmVuIGJlIGEgZGVjbGFyYXRpb24sIG5vdCBhIGRlZmluaXRpb24uCisgICAgcmV0dXJuIEdWLT5pc0NvbnN0YW50KCk7CisKKyAgcmV0dXJuIE5vQUE6OnBvaW50c1RvQ29uc3RhbnRNZW1vcnkoUCk7Cit9CisKKy8vLyBnZXRNb2RSZWZCZWhhdmlvciAtIFJldHVybiB0aGUgYmVoYXZpb3Igd2hlbiBjYWxsaW5nIHRoZSBnaXZlbiBjYWxsIHNpdGUuCitBbGlhc0FuYWx5c2lzOjpNb2RSZWZCZWhhdmlvcgorQmFzaWNBbGlhc0FuYWx5c2lzOjpnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUykgeworICBpZiAoQ1MuZG9lc05vdEFjY2Vzc01lbW9yeSgpKQorICAgIC8vIENhbid0IGRvIGJldHRlciB0aGFuIHRoaXMuCisgICAgcmV0dXJuIERvZXNOb3RBY2Nlc3NNZW1vcnk7CisKKyAgTW9kUmVmQmVoYXZpb3IgTWluID0gVW5rbm93bk1vZFJlZkJlaGF2aW9yOworCisgIC8vIElmIHRoZSBjYWxsc2l0ZSBrbm93cyBpdCBvbmx5IHJlYWRzIG1lbW9yeSwgZG9uJ3QgcmV0dXJuIHdvcnNlCisgIC8vIHRoYW4gdGhhdC4KKyAgaWYgKENTLm9ubHlSZWFkc01lbW9yeSgpKQorICAgIE1pbiA9IE9ubHlSZWFkc01lbW9yeTsKKworICAvLyBUaGUgQWxpYXNBbmFseXNpcyBiYXNlIGNsYXNzIGhhcyBzb21lIHNtYXJ0cywgbGV0cyB1c2UgdGhlbS4KKyAgcmV0dXJuIHN0ZDo6bWluKEFsaWFzQW5hbHlzaXM6OmdldE1vZFJlZkJlaGF2aW9yKENTKSwgTWluKTsKK30KKworLy8vIGdldE1vZFJlZkJlaGF2aW9yIC0gUmV0dXJuIHRoZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uLgorLy8vIEZvciB1c2Ugd2hlbiB0aGUgY2FsbCBzaXRlIGlzIG5vdCBrbm93bi4KK0FsaWFzQW5hbHlzaXM6Ok1vZFJlZkJlaGF2aW9yCitCYXNpY0FsaWFzQW5hbHlzaXM6OmdldE1vZFJlZkJlaGF2aW9yKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIGlmIChGLT5kb2VzTm90QWNjZXNzTWVtb3J5KCkpCisgICAgLy8gQ2FuJ3QgZG8gYmV0dGVyIHRoYW4gdGhpcy4KKyAgICByZXR1cm4gRG9lc05vdEFjY2Vzc01lbW9yeTsKKyAgaWYgKEYtPm9ubHlSZWFkc01lbW9yeSgpKQorICAgIHJldHVybiBPbmx5UmVhZHNNZW1vcnk7CisgIGlmICh1bnNpZ25lZCBpZCA9IEYtPmdldEludHJpbnNpY0lEKCkpCisgICAgcmV0dXJuIGdldEludHJpbnNpY01vZFJlZkJlaGF2aW9yKGlkKTsKKworICByZXR1cm4gTm9BQTo6Z2V0TW9kUmVmQmVoYXZpb3IoRik7Cit9CisKKy8vLyBnZXRNb2RSZWZJbmZvIC0gQ2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpZWQgY2FsbHNpdGUgY2FuIGNsb2JiZXIgdGhlCisvLy8gc3BlY2lmaWVkIG1lbW9yeSBvYmplY3QuICBTaW5jZSB3ZSBvbmx5IGxvb2sgYXQgbG9jYWwgcHJvcGVydGllcyBvZiB0aGlzCisvLy8gZnVuY3Rpb24sIHdlIHJlYWxseSBjYW4ndCBzYXkgbXVjaCBhYm91dCB0aGlzIHF1ZXJ5LiAgV2UgZG8sIGhvd2V2ZXIsIHVzZQorLy8vIHNpbXBsZSAiYWRkcmVzcyB0YWtlbiIgYW5hbHlzaXMgb24gbG9jYWwgb2JqZWN0cy4KK0FsaWFzQW5hbHlzaXM6Ok1vZFJlZlJlc3VsdAorQmFzaWNBbGlhc0FuYWx5c2lzOjpnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpQLCB1bnNpZ25lZCBTaXplKSB7CisgIGFzc2VydChub3REaWZmZXJlbnRQYXJlbnQoQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSwgUCkgJiYKKyAgICAgICAgICJBbGlhc0FuYWx5c2lzIHF1ZXJ5IGludm9sdmluZyBtdWx0aXBsZSBmdW5jdGlvbnMhIik7CisKKyAgY29uc3QgVmFsdWUgKk9iamVjdCA9IFAtPmdldFVuZGVybHlpbmdPYmplY3QoKTsKKyAgCisgIC8vIElmIHRoaXMgaXMgYSB0YWlsIGNhbGwgYW5kIFAgcG9pbnRzIHRvIGEgc3RhY2sgbG9jYXRpb24sIHdlIGtub3cgdGhhdAorICAvLyB0aGUgdGFpbCBjYWxsIGNhbm5vdCBhY2Nlc3Mgb3IgbW9kaWZ5IHRoZSBsb2NhbCBzdGFjay4KKyAgLy8gV2UgY2Fubm90IGV4Y2x1ZGUgYnl2YWwgYXJndW1lbnRzIGhlcmU7IHRoZXNlIGJlbG9uZyB0byB0aGUgY2FsbGVyIG9mCisgIC8vIHRoZSBjdXJyZW50IGZ1bmN0aW9uIG5vdCB0byB0aGUgY3VycmVudCBmdW5jdGlvbiwgYW5kIGEgdGFpbCBjYWxsZWUKKyAgLy8gbWF5IHJlZmVyZW5jZSB0aGVtLgorICBpZiAoaXNhPEFsbG9jYUluc3Q+KE9iamVjdCkpCisgICAgaWYgKGNvbnN0IENhbGxJbnN0ICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PihDUy5nZXRJbnN0cnVjdGlvbigpKSkKKyAgICAgIGlmIChDSS0+aXNUYWlsQ2FsbCgpKQorICAgICAgICByZXR1cm4gTm9Nb2RSZWY7CisgIAorICAvLyBJZiB0aGUgcG9pbnRlciBpcyB0byBhIGxvY2FsbHkgYWxsb2NhdGVkIG9iamVjdCB0aGF0IGRvZXMgbm90IGVzY2FwZSwKKyAgLy8gdGhlbiB0aGUgY2FsbCBjYW4gbm90IG1vZC9yZWYgdGhlIHBvaW50ZXIgdW5sZXNzIHRoZSBjYWxsIHRha2VzIHRoZSBwb2ludGVyCisgIC8vIGFzIGFuIGFyZ3VtZW50LCBhbmQgaXRzZWxmIGRvZXNuJ3QgY2FwdHVyZSBpdC4KKyAgaWYgKCFpc2E8Q29uc3RhbnQ+KE9iamVjdCkgJiYgQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSAhPSBPYmplY3QgJiYKKyAgICAgIGlzTm9uRXNjYXBpbmdMb2NhbE9iamVjdChPYmplY3QpKSB7CisgICAgYm9vbCBQYXNzZWRBc0FyZyA9IGZhbHNlOworICAgIHVuc2lnbmVkIEFyZ05vID0gMDsKKyAgICBmb3IgKEltbXV0YWJsZUNhbGxTaXRlOjphcmdfaXRlcmF0b3IgQ0kgPSBDUy5hcmdfYmVnaW4oKSwgQ0UgPSBDUy5hcmdfZW5kKCk7CisgICAgICAgICBDSSAhPSBDRTsgKytDSSwgKytBcmdObykgeworICAgICAgLy8gT25seSBsb29rIGF0IHRoZSBuby1jYXB0dXJlIHBvaW50ZXIgYXJndW1lbnRzLgorICAgICAgaWYgKCEoKkNJKS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpIHx8CisgICAgICAgICAgIUNTLnBhcmFtSGFzQXR0cihBcmdObysxLCBBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBJZiAgdGhpcyBpcyBhIG5vLWNhcHR1cmUgcG9pbnRlciBhcmd1bWVudCwgc2VlIGlmIHdlIGNhbiB0ZWxsIHRoYXQgaXQKKyAgICAgIC8vIGlzIGltcG9zc2libGUgdG8gYWxpYXMgdGhlIHBvaW50ZXIgd2UncmUgY2hlY2tpbmcuICBJZiBub3QsIHdlIGhhdmUgdG8KKyAgICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjYWxsIGNvdWxkIHRvdWNoIHRoZSBwb2ludGVyLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0CisgICAgICAvLyBlc2NhcGUuCisgICAgICBpZiAoIWlzTm9BbGlhcyhjYXN0PFZhbHVlPihDSSksIFVua25vd25TaXplLCBQLCBVbmtub3duU2l6ZSkpIHsKKyAgICAgICAgUGFzc2VkQXNBcmcgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFQYXNzZWRBc0FyZykKKyAgICAgIHJldHVybiBOb01vZFJlZjsKKyAgfQorCisgIC8vIEZpbmFsbHksIGhhbmRsZSBzcGVjaWZpYyBrbm93bGVkZ2Ugb2YgaW50cmluc2ljcy4KKyAgY29uc3QgSW50cmluc2ljSW5zdCAqSUkgPSBkeW5fY2FzdDxJbnRyaW5zaWNJbnN0PihDUy5nZXRJbnN0cnVjdGlvbigpKTsKKyAgaWYgKElJICE9IDApCisgICAgc3dpdGNoIChJSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHk6CisgICAgY2FzZSBJbnRyaW5zaWM6Om1lbW1vdmU6IHsKKyAgICAgIHVuc2lnbmVkIExlbiA9IFVua25vd25TaXplOworICAgICAgaWYgKENvbnN0YW50SW50ICpMZW5DSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJSS0+Z2V0QXJnT3BlcmFuZCgyKSkpCisgICAgICAgIExlbiA9IExlbkNJLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIFZhbHVlICpEZXN0ID0gSUktPmdldEFyZ09wZXJhbmQoMCk7CisgICAgICBWYWx1ZSAqU3JjID0gSUktPmdldEFyZ09wZXJhbmQoMSk7CisgICAgICBpZiAoaXNOb0FsaWFzKERlc3QsIExlbiwgUCwgU2l6ZSkpIHsKKyAgICAgICAgaWYgKGlzTm9BbGlhcyhTcmMsIExlbiwgUCwgU2l6ZSkpCisgICAgICAgICAgcmV0dXJuIE5vTW9kUmVmOworICAgICAgICByZXR1cm4gUmVmOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSW50cmluc2ljOjptZW1zZXQ6CisgICAgICAvLyBTaW5jZSBtZW1zZXQgaXMgJ2FjY2Vzc2VzIGFyZ3VtZW50cycgb25seSwgdGhlIEFsaWFzQW5hbHlzaXMgYmFzZSBjbGFzcworICAgICAgLy8gd2lsbCBoYW5kbGUgaXQgZm9yIHRoZSB2YXJpYWJsZSBsZW5ndGggY2FzZS4KKyAgICAgIGlmIChDb25zdGFudEludCAqTGVuQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSUktPmdldEFyZ09wZXJhbmQoMikpKSB7CisgICAgICAgIHVuc2lnbmVkIExlbiA9IExlbkNJLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgVmFsdWUgKkRlc3QgPSBJSS0+Z2V0QXJnT3BlcmFuZCgwKTsKKyAgICAgICAgaWYgKGlzTm9BbGlhcyhEZXN0LCBMZW4sIFAsIFNpemUpKQorICAgICAgICAgIHJldHVybiBOb01vZFJlZjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjphdG9taWNfY21wX3N3YXA6CisgICAgY2FzZSBJbnRyaW5zaWM6OmF0b21pY19zd2FwOgorICAgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF9hZGQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmF0b21pY19sb2FkX3N1YjoKKyAgICBjYXNlIEludHJpbnNpYzo6YXRvbWljX2xvYWRfYW5kOgorICAgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF9uYW5kOgorICAgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF9vcjoKKyAgICBjYXNlIEludHJpbnNpYzo6YXRvbWljX2xvYWRfeG9yOgorICAgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF9tYXg6CisgICAgY2FzZSBJbnRyaW5zaWM6OmF0b21pY19sb2FkX21pbjoKKyAgICBjYXNlIEludHJpbnNpYzo6YXRvbWljX2xvYWRfdW1heDoKKyAgICBjYXNlIEludHJpbnNpYzo6YXRvbWljX2xvYWRfdW1pbjoKKyAgICAgIGlmIChURCkgeworICAgICAgICBWYWx1ZSAqT3AxID0gSUktPmdldEFyZ09wZXJhbmQoMCk7CisgICAgICAgIHVuc2lnbmVkIE9wMVNpemUgPSBURC0+Z2V0VHlwZVN0b3JlU2l6ZShPcDEtPmdldFR5cGUoKSk7CisgICAgICAgIGlmIChpc05vQWxpYXMoT3AxLCBPcDFTaXplLCBQLCBTaXplKSkKKyAgICAgICAgICByZXR1cm4gTm9Nb2RSZWY7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6bGlmZXRpbWVfc3RhcnQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmxpZmV0aW1lX2VuZDoKKyAgICBjYXNlIEludHJpbnNpYzo6aW52YXJpYW50X3N0YXJ0OiB7CisgICAgICB1bnNpZ25lZCBQdHJTaXplID0KKyAgICAgICAgY2FzdDxDb25zdGFudEludD4oSUktPmdldEFyZ09wZXJhbmQoMCkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIGlmIChpc05vQWxpYXMoSUktPmdldEFyZ09wZXJhbmQoMSksIFB0clNpemUsIFAsIFNpemUpKQorICAgICAgICByZXR1cm4gTm9Nb2RSZWY7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBJbnRyaW5zaWM6OmludmFyaWFudF9lbmQ6IHsKKyAgICAgIHVuc2lnbmVkIFB0clNpemUgPQorICAgICAgICBjYXN0PENvbnN0YW50SW50PihJSS0+Z2V0QXJnT3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpOworICAgICAgaWYgKGlzTm9BbGlhcyhJSS0+Z2V0QXJnT3BlcmFuZCgyKSwgUHRyU2l6ZSwgUCwgU2l6ZSkpCisgICAgICAgIHJldHVybiBOb01vZFJlZjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgLy8gVGhlIEFsaWFzQW5hbHlzaXMgYmFzZSBjbGFzcyBoYXMgc29tZSBzbWFydHMsIGxldHMgdXNlIHRoZW0uCisgIHJldHVybiBBbGlhc0FuYWx5c2lzOjpnZXRNb2RSZWZJbmZvKENTLCBQLCBTaXplKTsKK30KKworCisvLy8gR2V0SW5kZXhEaWZmZXJlbmNlIC0gRGVzdCBhbmQgU3JjIGFyZSB0aGUgdmFyaWFibGUgaW5kaWNlcyBmcm9tIHR3bworLy8vIGRlY29tcG9zZWQgR2V0RWxlbWVudFB0ciBpbnN0cnVjdGlvbnMgR0VQMSBhbmQgR0VQMiB3aGljaCBoYXZlIGNvbW1vbiBiYXNlCisvLy8gcG9pbnRlcnMuICBTdWJ0cmFjdCB0aGUgR0VQMiBpbmRpY2VzIGZyb20gR0VQMSB0byBmaW5kIHRoZSBzeW1ib2xpYworLy8vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzLiAKK3N0YXRpYyB2b2lkIEdldEluZGV4RGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGNvbnN0IFZhbHVlKiwgaW50NjRfdD4gPiAmRGVzdCwKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGNvbnN0IFZhbHVlKiwgaW50NjRfdD4gPiAmU3JjKSB7CisgIGlmIChTcmMuZW1wdHkoKSkgcmV0dXJuOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTcmMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IFZhbHVlICpWID0gU3JjW2ldLmZpcnN0OworICAgIGludDY0X3QgU2NhbGUgPSBTcmNbaV0uc2Vjb25kOworICAgIAorICAgIC8vIEZpbmQgViBpbiBEZXN0LiAgVGhpcyBpcyBOXjIsIGJ1dCBwb2ludGVyIGluZGljZXMgYWxtb3N0IG5ldmVyIGhhdmUgbW9yZQorICAgIC8vIHRoYW4gYSBmZXcgdmFyaWFibGUgaW5kZXhlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gRGVzdC5zaXplKCk7IGogIT0gZTsgKytqKSB7CisgICAgICBpZiAoRGVzdFtqXS5maXJzdCAhPSBWKSBjb250aW51ZTsKKyAgICAgIAorICAgICAgLy8gSWYgd2UgZm91bmQgaXQsIHN1YnRyYWN0IG9mZiBTY2FsZSBWJ3MgZnJvbSB0aGUgZW50cnkgaW4gRGVzdC4gIElmIGl0CisgICAgICAvLyBnb2VzIHRvIHplcm8sIHJlbW92ZSB0aGUgZW50cnkuCisgICAgICBpZiAoRGVzdFtqXS5zZWNvbmQgIT0gU2NhbGUpCisgICAgICAgIERlc3Rbal0uc2Vjb25kIC09IFNjYWxlOworICAgICAgZWxzZQorICAgICAgICBEZXN0LmVyYXNlKERlc3QuYmVnaW4oKStqKTsKKyAgICAgIFNjYWxlID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB3ZSBkaWRuJ3QgY29uc3VtZSB0aGlzIGVudHJ5LCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgRGVzdCBsaXN0LgorICAgIGlmIChTY2FsZSkKKyAgICAgIERlc3QucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFYsIC1TY2FsZSkpOworICB9Cit9CisKKy8vLyBhbGlhc0dFUCAtIFByb3ZpZGUgYSBidW5jaCBvZiBhZC1ob2MgcnVsZXMgdG8gZGlzYW1iaWd1YXRlIGEgR0VQIGluc3RydWN0aW9uCisvLy8gYWdhaW5zdCBhbm90aGVyIHBvaW50ZXIuICBXZSBrbm93IHRoYXQgVjEgaXMgYSBHRVAsIGJ1dCB3ZSBkb24ndCBrbm93CisvLy8gYW55dGhpbmcgYWJvdXQgVjIuICBVbmRlcmx5aW5nVjEgaXMgR0VQMS0+Z2V0VW5kZXJseWluZ09iamVjdCgpLAorLy8vIFVuZGVybHlpbmdWMiBpcyB0aGUgc2FtZSBmb3IgVjIuCisvLy8KK0FsaWFzQW5hbHlzaXM6OkFsaWFzUmVzdWx0CitCYXNpY0FsaWFzQW5hbHlzaXM6OmFsaWFzR0VQKGNvbnN0IEdFUE9wZXJhdG9yICpHRVAxLCB1bnNpZ25lZCBWMVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpWMiwgdW5zaWduZWQgVjJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVW5kZXJseWluZ1YxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVW5kZXJseWluZ1YyKSB7CisgIC8vIElmIHRoaXMgR0VQIGhhcyBiZWVuIHZpc2l0ZWQgYmVmb3JlLCB3ZSdyZSBvbiBhIHVzZS1kZWYgY3ljbGUuCisgIC8vIFN1Y2ggY3ljbGVzIGFyZSBvbmx5IHZhbGlkIHdoZW4gUEhJIG5vZGVzIGFyZSBpbnZvbHZlZCBvciBpbiB1bnJlYWNoYWJsZQorICAvLyBjb2RlLiBUaGUgdmlzaXRQSEkgZnVuY3Rpb24gY2F0Y2hlcyBjeWNsZXMgY29udGFpbmluZyBQSElzLCBidXQgdGhlcmUKKyAgLy8gY291bGQgc3RpbGwgYmUgYSBjeWNsZSB3aXRob3V0IFBISXMgaW4gdW5yZWFjaGFibGUgY29kZS4KKyAgaWYgKCFWaXNpdGVkLmluc2VydChHRVAxKSkKKyAgICByZXR1cm4gTWF5QWxpYXM7CisKKyAgaW50NjRfdCBHRVAxQmFzZU9mZnNldDsKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IFZhbHVlKiwgaW50NjRfdD4sIDQ+IEdFUDFWYXJpYWJsZUluZGljZXM7CisKKyAgLy8gSWYgd2UgaGF2ZSB0d28gZ2VwIGluc3RydWN0aW9ucyB3aXRoIG11c3QtYWxpYXMnaW5nIGJhc2UgcG9pbnRlcnMsIGZpZ3VyZQorICAvLyBvdXQgaWYgdGhlIGluZGV4ZXMgdG8gdGhlIEdFUCB0ZWxsIHVzIGFueXRoaW5nIGFib3V0IHRoZSBkZXJpdmVkIHBvaW50ZXIuCisgIGlmIChjb25zdCBHRVBPcGVyYXRvciAqR0VQMiA9IGR5bl9jYXN0PEdFUE9wZXJhdG9yPihWMikpIHsKKyAgICAvLyBEbyB0aGUgYmFzZSBwb2ludGVycyBhbGlhcz8KKyAgICBBbGlhc1Jlc3VsdCBCYXNlQWxpYXMgPSBhbGlhc0NoZWNrKFVuZGVybHlpbmdWMSwgVW5rbm93blNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmRlcmx5aW5nVjIsIFVua25vd25TaXplKTsKKyAgICAKKyAgICAvLyBJZiB3ZSBnZXQgYSBObyBvciBNYXksIHRoZW4gcmV0dXJuIGl0IGltbWVkaWF0ZWx5LCBubyBhbW91bnQgb2YgYW5hbHlzaXMKKyAgICAvLyB3aWxsIGltcHJvdmUgdGhpcyBzaXR1YXRpb24uCisgICAgaWYgKEJhc2VBbGlhcyAhPSBNdXN0QWxpYXMpIHJldHVybiBCYXNlQWxpYXM7CisgICAgCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgTXVzdEFsaWFzLiAgU2luY2UgdGhlIGJhc2UgcG9pbnRlcnMgYWxpYXMgZWFjaCBvdGhlcgorICAgIC8vIGV4YWN0bHksIHNlZSBpZiB0aGUgY29tcHV0ZWQgb2Zmc2V0IGZyb20gdGhlIGNvbW1vbiBwb2ludGVyIHRlbGxzIHVzCisgICAgLy8gYWJvdXQgdGhlIHJlbGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgcG9pbnRlci4KKyAgICBjb25zdCBWYWx1ZSAqR0VQMUJhc2VQdHIgPQorICAgICAgRGVjb21wb3NlR0VQRXhwcmVzc2lvbihHRVAxLCBHRVAxQmFzZU9mZnNldCwgR0VQMVZhcmlhYmxlSW5kaWNlcywgVEQpOworICAgIAorICAgIGludDY0X3QgR0VQMkJhc2VPZmZzZXQ7CisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IFZhbHVlKiwgaW50NjRfdD4sIDQ+IEdFUDJWYXJpYWJsZUluZGljZXM7CisgICAgY29uc3QgVmFsdWUgKkdFUDJCYXNlUHRyID0KKyAgICAgIERlY29tcG9zZUdFUEV4cHJlc3Npb24oR0VQMiwgR0VQMkJhc2VPZmZzZXQsIEdFUDJWYXJpYWJsZUluZGljZXMsIFREKTsKKyAgICAKKyAgICAvLyBJZiBEZWNvbXBvc2VHRVBFeHByZXNzaW9uIGlzbid0IGFibGUgdG8gbG9vayBhbGwgdGhlIHdheSB0aHJvdWdoIHRoZQorICAgIC8vIGFkZHJlc3Npbmcgb3BlcmF0aW9uLCB3ZSBtdXN0IG5vdCBoYXZlIFREIGFuZCB0aGlzIGlzIHRvbyBjb21wbGV4IGZvciB1cworICAgIC8vIHRvIGhhbmRsZSB3aXRob3V0IGl0LgorICAgIGlmIChHRVAxQmFzZVB0ciAhPSBVbmRlcmx5aW5nVjEgfHwgR0VQMkJhc2VQdHIgIT0gVW5kZXJseWluZ1YyKSB7CisgICAgICBhc3NlcnQoVEQgPT0gMCAmJgorICAgICAgICAgICAgICJEZWNvbXBvc2VHRVBFeHByZXNzaW9uIGFuZCBnZXRVbmRlcmx5aW5nT2JqZWN0IGRpc2FncmVlISIpOworICAgICAgcmV0dXJuIE1heUFsaWFzOworICAgIH0KKyAgICAKKyAgICAvLyBTdWJ0cmFjdCB0aGUgR0VQMiBwb2ludGVyIGZyb20gdGhlIEdFUDEgcG9pbnRlciB0byBmaW5kIG91dCB0aGVpcgorICAgIC8vIHN5bWJvbGljIGRpZmZlcmVuY2UuCisgICAgR0VQMUJhc2VPZmZzZXQgLT0gR0VQMkJhc2VPZmZzZXQ7CisgICAgR2V0SW5kZXhEaWZmZXJlbmNlKEdFUDFWYXJpYWJsZUluZGljZXMsIEdFUDJWYXJpYWJsZUluZGljZXMpOworICAgIAorICB9IGVsc2UgeworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVzZSB0d28gcG9pbnRlcnMgYXJlIHJlbGF0ZWQgYnkgdGhlIGdldGVsZW1lbnRwdHIKKyAgICAvLyBpbnN0cnVjdGlvbi4gIElmIG9uZSBwb2ludGVyIGlzIGEgR0VQIHdpdGggYSBub24temVybyBpbmRleCBvZiB0aGUgb3RoZXIKKyAgICAvLyBwb2ludGVyLCB3ZSBrbm93IHRoZXkgY2Fubm90IGFsaWFzLgorCisgICAgLy8gSWYgYm90aCBhY2Nlc3NlcyBhcmUgdW5rbm93biBzaXplLCB3ZSBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgaGVyZS4KKyAgICBpZiAoVjFTaXplID09IFVua25vd25TaXplICYmIFYyU2l6ZSA9PSBVbmtub3duU2l6ZSkKKyAgICAgIHJldHVybiBNYXlBbGlhczsKKworICAgIEFsaWFzUmVzdWx0IFIgPSBhbGlhc0NoZWNrKFVuZGVybHlpbmdWMSwgVW5rbm93blNpemUsIFYyLCBWMlNpemUpOworICAgIGlmIChSICE9IE11c3RBbGlhcykKKyAgICAgIC8vIElmIFYyIG1heSBhbGlhcyBHRVAgYmFzZSBwb2ludGVyLCBjb25zZXJ2YXRpdmVseSByZXR1cm5zIE1heUFsaWFzLgorICAgICAgLy8gSWYgVjIgaXMga25vd24gbm90IHRvIGFsaWFzIEdFUCBiYXNlIHBvaW50ZXIsIHRoZW4gdGhlIHR3byB2YWx1ZXMKKyAgICAgIC8vIGNhbm5vdCBhbGlhcyBwZXIgR0VQIHNlbWFudGljczogIkEgcG9pbnRlciB2YWx1ZSBmb3JtZWQgZnJvbSBhCisgICAgICAvLyBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRkcmVzc2VzIGFzc29jaWF0ZWQKKyAgICAgIC8vIHdpdGggdGhlIGZpcnN0IG9wZXJhbmQgb2YgdGhlIGdldGVsZW1lbnRwdHIiLgorICAgICAgcmV0dXJuIFI7CisKKyAgICBjb25zdCBWYWx1ZSAqR0VQMUJhc2VQdHIgPQorICAgICAgRGVjb21wb3NlR0VQRXhwcmVzc2lvbihHRVAxLCBHRVAxQmFzZU9mZnNldCwgR0VQMVZhcmlhYmxlSW5kaWNlcywgVEQpOworICAgIAorICAgIC8vIElmIERlY29tcG9zZUdFUEV4cHJlc3Npb24gaXNuJ3QgYWJsZSB0byBsb29rIGFsbCB0aGUgd2F5IHRocm91Z2ggdGhlCisgICAgLy8gYWRkcmVzc2luZyBvcGVyYXRpb24sIHdlIG11c3Qgbm90IGhhdmUgVEQgYW5kIHRoaXMgaXMgdG9vIGNvbXBsZXggZm9yIHVzCisgICAgLy8gdG8gaGFuZGxlIHdpdGhvdXQgaXQuCisgICAgaWYgKEdFUDFCYXNlUHRyICE9IFVuZGVybHlpbmdWMSkgeworICAgICAgYXNzZXJ0KFREID09IDAgJiYKKyAgICAgICAgICAgICAiRGVjb21wb3NlR0VQRXhwcmVzc2lvbiBhbmQgZ2V0VW5kZXJseWluZ09iamVjdCBkaXNhZ3JlZSEiKTsKKyAgICAgIHJldHVybiBNYXlBbGlhczsKKyAgICB9CisgIH0KKyAgCisgIC8vIEluIHRoZSB0d28gR0VQIENhc2UsIGlmIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlIG9mZnNldHMgb2YgdGhlCisgIC8vIGNvbXB1dGVkIHBvaW50ZXJzLCB0aGUgcmVzdWx0YW50IHBvaW50ZXJzIGFyZSBhIG11c3QgYWxpYXMuICBUaGlzCisgIC8vIGhhcGVucyB3aGVuIHdlIGhhdmUgdHdvIGxleGljYWxseSBpZGVudGljYWwgR0VQJ3MgKGZvciBleGFtcGxlKS4KKyAgLy8KKyAgLy8gSW4gdGhlIG90aGVyIGNhc2UsIGlmIHdlIGhhdmUgZ2V0ZWxlbWVudHB0ciA8cHRyPiwgMCwgMCwgMCwgMCwgLi4uIGFuZCBWMgorICAvLyBtdXN0IGFsaWFzZXMgdGhlIEdFUCwgdGhlIGVuZCByZXN1bHQgaXMgYSBtdXN0IGFsaWFzIGFsc28uCisgIGlmIChHRVAxQmFzZU9mZnNldCA9PSAwICYmIEdFUDFWYXJpYWJsZUluZGljZXMuZW1wdHkoKSkKKyAgICByZXR1cm4gTXVzdEFsaWFzOworCisgIC8vIElmIHdlIGhhdmUgYSBrbm93biBjb25zdGFudCBvZmZzZXQsIHNlZSBpZiB0aGlzIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUKKyAgLy8gYWNjZXNzIHNpemUgYmVpbmcgcXVlcmllZC4gIElmIHNvLCBhbmQgaWYgbm8gdmFyaWFibGUgaW5kaWNlcyBjYW4gcmVtb3ZlCisgIC8vIHBpZWNlcyBvZiB0aGlzIGNvbnN0YW50LCB0aGVuIHdlIGtub3cgd2UgaGF2ZSBhIG5vLWFsaWFzLiAgRm9yIGV4YW1wbGUsCisgIC8vICAgJkFbMTAwXSAhPSAmQS4KKyAgCisgIC8vIEluIG9yZGVyIHRvIGhhbmRsZSBjYXNlcyBsaWtlICZBWzEwMF1baV0gd2hlcmUgaSBpcyBhbiBvdXQgb2YgcmFuZ2UKKyAgLy8gc3Vic2NyaXB0LCB3ZSBoYXZlIHRvIGlnbm9yZSBhbGwgY29uc3RhbnQgb2Zmc2V0IHBpZWNlcyB0aGF0IGFyZSBhIG11bHRpcGxlCisgIC8vIG9mIGEgc2NhbGVkIGluZGV4LiAgRG8gdGhpcyBieSByZW1vdmluZyBjb25zdGFudCBvZmZzZXRzIHRoYXQgYXJlIGEKKyAgLy8gbXVsdGlwbGUgb2YgYW55IG9mIG91ciB2YXJpYWJsZSBpbmRpY2VzLiAgVGhpcyBhbGxvd3MgdXMgdG8gdHJhbnNmb3JtCisgIC8vIHRoaW5ncyBsaWtlICZBW2ldWzFdIGJlY2F1c2UgaSBoYXMgYSBzdHJpZGUgb2YgKGUuZy4pIDggYnl0ZXMgYnV0IHRoZSAxCisgIC8vIHByb3ZpZGVzIGFuIG9mZnNldCBvZiA0IGJ5dGVzIChhc3N1bWluZyBhIDw9IDQgYnl0ZSBhY2Nlc3MpLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gR0VQMVZhcmlhYmxlSW5kaWNlcy5zaXplKCk7CisgICAgICAgaSAhPSBlICYmIEdFUDFCYXNlT2Zmc2V0OysraSkKKyAgICBpZiAoaW50NjRfdCBSZW1vdmVkT2Zmc2V0ID0gR0VQMUJhc2VPZmZzZXQvR0VQMVZhcmlhYmxlSW5kaWNlc1tpXS5zZWNvbmQpCisgICAgICBHRVAxQmFzZU9mZnNldCAtPSBSZW1vdmVkT2Zmc2V0KkdFUDFWYXJpYWJsZUluZGljZXNbaV0uc2Vjb25kOworICAKKyAgLy8gSWYgb3VyIGtub3duIG9mZnNldCBpcyBiaWdnZXIgdGhhbiB0aGUgYWNjZXNzIHNpemUsIHdlIGtub3cgd2UgZG9uJ3QgaGF2ZQorICAvLyBhbiBhbGlhcy4KKyAgaWYgKEdFUDFCYXNlT2Zmc2V0KSB7CisgICAgaWYgKEdFUDFCYXNlT2Zmc2V0ID49IChpbnQ2NF90KVYyU2l6ZSB8fAorICAgICAgICBHRVAxQmFzZU9mZnNldCA8PSAtKGludDY0X3QpVjFTaXplKQorICAgICAgcmV0dXJuIE5vQWxpYXM7CisgIH0KKyAgCisgIHJldHVybiBNYXlBbGlhczsKK30KKworLy8vIGFsaWFzU2VsZWN0IC0gUHJvdmlkZSBhIGJ1bmNoIG9mIGFkLWhvYyBydWxlcyB0byBkaXNhbWJpZ3VhdGUgYSBTZWxlY3QKKy8vLyBpbnN0cnVjdGlvbiBhZ2FpbnN0IGFub3RoZXIuCitBbGlhc0FuYWx5c2lzOjpBbGlhc1Jlc3VsdAorQmFzaWNBbGlhc0FuYWx5c2lzOjphbGlhc1NlbGVjdChjb25zdCBTZWxlY3RJbnN0ICpTSSwgdW5zaWduZWQgU0lTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVjIsIHVuc2lnbmVkIFYyU2l6ZSkgeworICAvLyBJZiB0aGlzIHNlbGVjdCBoYXMgYmVlbiB2aXNpdGVkIGJlZm9yZSwgd2UncmUgb24gYSB1c2UtZGVmIGN5Y2xlLgorICAvLyBTdWNoIGN5Y2xlcyBhcmUgb25seSB2YWxpZCB3aGVuIFBISSBub2RlcyBhcmUgaW52b2x2ZWQgb3IgaW4gdW5yZWFjaGFibGUKKyAgLy8gY29kZS4gVGhlIHZpc2l0UEhJIGZ1bmN0aW9uIGNhdGNoZXMgY3ljbGVzIGNvbnRhaW5pbmcgUEhJcywgYnV0IHRoZXJlCisgIC8vIGNvdWxkIHN0aWxsIGJlIGEgY3ljbGUgd2l0aG91dCBQSElzIGluIHVucmVhY2hhYmxlIGNvZGUuCisgIGlmICghVmlzaXRlZC5pbnNlcnQoU0kpKQorICAgIHJldHVybiBNYXlBbGlhczsKKworICAvLyBJZiB0aGUgdmFsdWVzIGFyZSBTZWxlY3RzIHdpdGggdGhlIHNhbWUgY29uZGl0aW9uLCB3ZSBjYW4gZG8gYSBtb3JlIHByZWNpc2UKKyAgLy8gY2hlY2s6IGp1c3QgY2hlY2sgZm9yIGFsaWFzZXMgYmV0d2VlbiB0aGUgdmFsdWVzIG9uIGNvcnJlc3BvbmRpbmcgYXJtcy4KKyAgaWYgKGNvbnN0IFNlbGVjdEluc3QgKlNJMiA9IGR5bl9jYXN0PFNlbGVjdEluc3Q+KFYyKSkKKyAgICBpZiAoU0ktPmdldENvbmRpdGlvbigpID09IFNJMi0+Z2V0Q29uZGl0aW9uKCkpIHsKKyAgICAgIEFsaWFzUmVzdWx0IEFsaWFzID0KKyAgICAgICAgYWxpYXNDaGVjayhTSS0+Z2V0VHJ1ZVZhbHVlKCksIFNJU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBTSTItPmdldFRydWVWYWx1ZSgpLCBWMlNpemUpOworICAgICAgaWYgKEFsaWFzID09IE1heUFsaWFzKQorICAgICAgICByZXR1cm4gTWF5QWxpYXM7CisgICAgICBBbGlhc1Jlc3VsdCBUaGlzQWxpYXMgPQorICAgICAgICBhbGlhc0NoZWNrKFNJLT5nZXRGYWxzZVZhbHVlKCksIFNJU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBTSTItPmdldEZhbHNlVmFsdWUoKSwgVjJTaXplKTsKKyAgICAgIGlmIChUaGlzQWxpYXMgIT0gQWxpYXMpCisgICAgICAgIHJldHVybiBNYXlBbGlhczsKKyAgICAgIHJldHVybiBBbGlhczsKKyAgICB9CisKKyAgLy8gSWYgYm90aCBhcm1zIG9mIHRoZSBTZWxlY3Qgbm9kZSBOb0FsaWFzIG9yIE11c3RBbGlhcyBWMiwgdGhlbiByZXR1cm5zCisgIC8vIE5vQWxpYXMgLyBNdXN0QWxpYXMuIE90aGVyd2lzZSwgcmV0dXJucyBNYXlBbGlhcy4KKyAgQWxpYXNSZXN1bHQgQWxpYXMgPQorICAgIGFsaWFzQ2hlY2soVjIsIFYyU2l6ZSwgU0ktPmdldFRydWVWYWx1ZSgpLCBTSVNpemUpOworICBpZiAoQWxpYXMgPT0gTWF5QWxpYXMpCisgICAgcmV0dXJuIE1heUFsaWFzOworCisgIC8vIElmIFYyIGlzIHZpc2l0ZWQsIHRoZSByZWN1cnNpdmUgY2FzZSB3aWxsIGhhdmUgYmVlbiBjYXVnaHQgaW4gdGhlCisgIC8vIGFib3ZlIGFsaWFzQ2hlY2sgY2FsbCwgc28gdGhlc2Ugc3Vic2VxdWVudCBjYWxscyB0byBhbGlhc0NoZWNrCisgIC8vIGRvbid0IG5lZWQgdG8gYXNzdW1lIHRoYXQgVjIgaXMgYmVpbmcgdmlzaXRlZCByZWN1cnNpdmVseS4KKyAgVmlzaXRlZC5lcmFzZShWMik7CisKKyAgQWxpYXNSZXN1bHQgVGhpc0FsaWFzID0KKyAgICBhbGlhc0NoZWNrKFYyLCBWMlNpemUsIFNJLT5nZXRGYWxzZVZhbHVlKCksIFNJU2l6ZSk7CisgIGlmIChUaGlzQWxpYXMgIT0gQWxpYXMpCisgICAgcmV0dXJuIE1heUFsaWFzOworICByZXR1cm4gQWxpYXM7Cit9CisKKy8vIGFsaWFzUEhJIC0gUHJvdmlkZSBhIGJ1bmNoIG9mIGFkLWhvYyBydWxlcyB0byBkaXNhbWJpZ3VhdGUgYSBQSEkgaW5zdHJ1Y3Rpb24KKy8vIGFnYWluc3QgYW5vdGhlci4KK0FsaWFzQW5hbHlzaXM6OkFsaWFzUmVzdWx0CitCYXNpY0FsaWFzQW5hbHlzaXM6OmFsaWFzUEhJKGNvbnN0IFBISU5vZGUgKlBOLCB1bnNpZ25lZCBQTlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpWMiwgdW5zaWduZWQgVjJTaXplKSB7CisgIC8vIFRoZSBQSEkgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIHZpc2l0ZWQsIGF2b2lkIHJlY3Vyc2lvbiBhbnkgZnVydGhlci4KKyAgaWYgKCFWaXNpdGVkLmluc2VydChQTikpCisgICAgcmV0dXJuIE1heUFsaWFzOworCisgIC8vIElmIHRoZSB2YWx1ZXMgYXJlIFBISXMgaW4gdGhlIHNhbWUgYmxvY2ssIHdlIGNhbiBkbyBhIG1vcmUgcHJlY2lzZQorICAvLyBhcyB3ZWxsIGFzIGVmZmljaWVudCBjaGVjazoganVzdCBjaGVjayBmb3IgYWxpYXNlcyBiZXR3ZWVuIHRoZSB2YWx1ZXMKKyAgLy8gb24gY29ycmVzcG9uZGluZyBlZGdlcy4KKyAgaWYgKGNvbnN0IFBISU5vZGUgKlBOMiA9IGR5bl9jYXN0PFBISU5vZGU+KFYyKSkKKyAgICBpZiAoUE4yLT5nZXRQYXJlbnQoKSA9PSBQTi0+Z2V0UGFyZW50KCkpIHsKKyAgICAgIEFsaWFzUmVzdWx0IEFsaWFzID0KKyAgICAgICAgYWxpYXNDaGVjayhQTi0+Z2V0SW5jb21pbmdWYWx1ZSgwKSwgUE5TaXplLAorICAgICAgICAgICAgICAgICAgIFBOMi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKFBOLT5nZXRJbmNvbWluZ0Jsb2NrKDApKSwKKyAgICAgICAgICAgICAgICAgICBWMlNpemUpOworICAgICAgaWYgKEFsaWFzID09IE1heUFsaWFzKQorICAgICAgICByZXR1cm4gTWF5QWxpYXM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIEFsaWFzUmVzdWx0IFRoaXNBbGlhcyA9CisgICAgICAgICAgYWxpYXNDaGVjayhQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKSwgUE5TaXplLAorICAgICAgICAgICAgICAgICAgICAgUE4yLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soUE4tPmdldEluY29taW5nQmxvY2soaSkpLAorICAgICAgICAgICAgICAgICAgICAgVjJTaXplKTsKKyAgICAgICAgaWYgKFRoaXNBbGlhcyAhPSBBbGlhcykKKyAgICAgICAgICByZXR1cm4gTWF5QWxpYXM7CisgICAgICB9CisgICAgICByZXR1cm4gQWxpYXM7CisgICAgfQorCisgIFNtYWxsUHRyU2V0PFZhbHVlKiwgND4gVW5pcXVlU3JjOworICBTbWFsbFZlY3RvcjxWYWx1ZSosIDQ+IFYxU3JjczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgIFZhbHVlICpQVjEgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKTsKKyAgICBpZiAoaXNhPFBISU5vZGU+KFBWMSkpCisgICAgICAvLyBJZiBhbnkgb2YgdGhlIHNvdXJjZSBpdHNlbGYgaXMgYSBQSEksIHJldHVybiBNYXlBbGlhcyBjb25zZXJ2YXRpdmVseQorICAgICAgLy8gdG8gYXZvaWQgY29tcGlsZSB0aW1lIGV4cGxvc2lvbi4gVGhlIHdvcnN0IHBvc3NpYmxlIGNhc2UgaXMgaWYgYm90aAorICAgICAgLy8gc2lkZXMgYXJlIFBISSBub2Rlcy4gSW4gd2hpY2ggY2FzZSwgdGhpcyBpcyBPKG0geCBuKSB0aW1lIHdoZXJlICdtJworICAgICAgLy8gYW5kICduJyBhcmUgdGhlIG51bWJlciBvZiBQSEkgc291cmNlcy4KKyAgICAgIHJldHVybiBNYXlBbGlhczsKKyAgICBpZiAoVW5pcXVlU3JjLmluc2VydChQVjEpKQorICAgICAgVjFTcmNzLnB1c2hfYmFjayhQVjEpOworICB9CisKKyAgQWxpYXNSZXN1bHQgQWxpYXMgPSBhbGlhc0NoZWNrKFYyLCBWMlNpemUsIFYxU3Jjc1swXSwgUE5TaXplKTsKKyAgLy8gRWFybHkgZXhpdCBpZiB0aGUgY2hlY2sgb2YgdGhlIGZpcnN0IFBISSBzb3VyY2UgYWdhaW5zdCBWMiBpcyBNYXlBbGlhcy4KKyAgLy8gT3RoZXIgcmVzdWx0cyBhcmUgbm90IHBvc3NpYmxlLgorICBpZiAoQWxpYXMgPT0gTWF5QWxpYXMpCisgICAgcmV0dXJuIE1heUFsaWFzOworCisgIC8vIElmIGFsbCBzb3VyY2VzIG9mIHRoZSBQSEkgbm9kZSBOb0FsaWFzIG9yIE11c3RBbGlhcyBWMiwgdGhlbiByZXR1cm5zCisgIC8vIE5vQWxpYXMgLyBNdXN0QWxpYXMuIE90aGVyd2lzZSwgcmV0dXJucyBNYXlBbGlhcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFYxU3Jjcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgVmFsdWUgKlYgPSBWMVNyY3NbaV07CisKKyAgICAvLyBJZiBWMiBpcyB2aXNpdGVkLCB0aGUgcmVjdXJzaXZlIGNhc2Ugd2lsbCBoYXZlIGJlZW4gY2F1Z2h0IGluIHRoZQorICAgIC8vIGFib3ZlIGFsaWFzQ2hlY2sgY2FsbCwgc28gdGhlc2Ugc3Vic2VxdWVudCBjYWxscyB0byBhbGlhc0NoZWNrCisgICAgLy8gZG9uJ3QgbmVlZCB0byBhc3N1bWUgdGhhdCBWMiBpcyBiZWluZyB2aXNpdGVkIHJlY3Vyc2l2ZWx5LgorICAgIFZpc2l0ZWQuZXJhc2UoVjIpOworCisgICAgQWxpYXNSZXN1bHQgVGhpc0FsaWFzID0gYWxpYXNDaGVjayhWMiwgVjJTaXplLCBWLCBQTlNpemUpOworICAgIGlmIChUaGlzQWxpYXMgIT0gQWxpYXMgfHwgVGhpc0FsaWFzID09IE1heUFsaWFzKQorICAgICAgcmV0dXJuIE1heUFsaWFzOworICB9CisKKyAgcmV0dXJuIEFsaWFzOworfQorCisvLyBhbGlhc0NoZWNrIC0gUHJvdmlkZSBhIGJ1bmNoIG9mIGFkLWhvYyBydWxlcyB0byBkaXNhbWJpZ3VhdGUgaW4gY29tbW9uIGNhc2VzLAorLy8gc3VjaCBhcyBhcnJheSByZWZlcmVuY2VzLgorLy8KK0FsaWFzQW5hbHlzaXM6OkFsaWFzUmVzdWx0CitCYXNpY0FsaWFzQW5hbHlzaXM6OmFsaWFzQ2hlY2soY29uc3QgVmFsdWUgKlYxLCB1bnNpZ25lZCBWMVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlYyLCB1bnNpZ25lZCBWMlNpemUpIHsKKyAgLy8gSWYgZWl0aGVyIG9mIHRoZSBtZW1vcnkgcmVmZXJlbmNlcyBpcyBlbXB0eSwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUKKyAgLy8gcG9pbnRlciB2YWx1ZXMgYXJlLgorICBpZiAoVjFTaXplID09IDAgfHwgVjJTaXplID09IDApCisgICAgcmV0dXJuIE5vQWxpYXM7CisKKyAgLy8gU3RyaXAgb2ZmIGFueSBjYXN0cyBpZiB0aGV5IGV4aXN0LgorICBWMSA9IFYxLT5zdHJpcFBvaW50ZXJDYXN0cygpOworICBWMiA9IFYyLT5zdHJpcFBvaW50ZXJDYXN0cygpOworCisgIC8vIEFyZSB3ZSBjaGVja2luZyBmb3IgYWxpYXMgb2YgdGhlIHNhbWUgdmFsdWU/CisgIGlmIChWMSA9PSBWMikgcmV0dXJuIE11c3RBbGlhczsKKworICBpZiAoIVYxLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkgfHwgIVYyLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgcmV0dXJuIE5vQWxpYXM7ICAvLyBTY2FsYXJzIGNhbm5vdCBhbGlhcyBlYWNoIG90aGVyCisKKyAgLy8gRmlndXJlIG91dCB3aGF0IG9iamVjdHMgdGhlc2UgdGhpbmdzIGFyZSBwb2ludGluZyB0byBpZiB3ZSBjYW4uCisgIGNvbnN0IFZhbHVlICpPMSA9IFYxLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCk7CisgIGNvbnN0IFZhbHVlICpPMiA9IFYyLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCk7CisKKyAgLy8gTnVsbCB2YWx1ZXMgaW4gdGhlIGRlZmF1bHQgYWRkcmVzcyBzcGFjZSBkb24ndCBwb2ludCB0byBhbnkgb2JqZWN0LCBzbyB0aGV5CisgIC8vIGRvbid0IGFsaWFzIGFueSBvdGhlciBwb2ludGVyLgorICBpZiAoY29uc3QgQ29uc3RhbnRQb2ludGVyTnVsbCAqQ1BOID0gZHluX2Nhc3Q8Q29uc3RhbnRQb2ludGVyTnVsbD4oTzEpKQorICAgIGlmIChDUE4tPmdldFR5cGUoKS0+Z2V0QWRkcmVzc1NwYWNlKCkgPT0gMCkKKyAgICAgIHJldHVybiBOb0FsaWFzOworICBpZiAoY29uc3QgQ29uc3RhbnRQb2ludGVyTnVsbCAqQ1BOID0gZHluX2Nhc3Q8Q29uc3RhbnRQb2ludGVyTnVsbD4oTzIpKQorICAgIGlmIChDUE4tPmdldFR5cGUoKS0+Z2V0QWRkcmVzc1NwYWNlKCkgPT0gMCkKKyAgICAgIHJldHVybiBOb0FsaWFzOworCisgIGlmIChPMSAhPSBPMikgeworICAgIC8vIElmIFYxL1YyIHBvaW50IHRvIHR3byBkaWZmZXJlbnQgb2JqZWN0cyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBubyBhbGlhcy4KKyAgICBpZiAoaXNJZGVudGlmaWVkT2JqZWN0KE8xKSAmJiBpc0lkZW50aWZpZWRPYmplY3QoTzIpKQorICAgICAgcmV0dXJuIE5vQWxpYXM7CisKKyAgICAvLyBDb25zdGFudCBwb2ludGVycyBjYW4ndCBhbGlhcyB3aXRoIG5vbi1jb25zdCBpc0lkZW50aWZpZWRPYmplY3Qgb2JqZWN0cy4KKyAgICBpZiAoKGlzYTxDb25zdGFudD4oTzEpICYmIGlzSWRlbnRpZmllZE9iamVjdChPMikgJiYgIWlzYTxDb25zdGFudD4oTzIpKSB8fAorICAgICAgICAoaXNhPENvbnN0YW50PihPMikgJiYgaXNJZGVudGlmaWVkT2JqZWN0KE8xKSAmJiAhaXNhPENvbnN0YW50PihPMSkpKQorICAgICAgcmV0dXJuIE5vQWxpYXM7CisKKyAgICAvLyBBcmd1bWVudHMgY2FuJ3QgYWxpYXMgd2l0aCBsb2NhbCBhbGxvY2F0aW9ucyBvciBub2FsaWFzIGNhbGxzCisgICAgLy8gaW4gdGhlIHNhbWUgZnVuY3Rpb24uCisgICAgaWYgKCgoaXNhPEFyZ3VtZW50PihPMSkgJiYgKGlzYTxBbGxvY2FJbnN0PihPMikgfHwgaXNOb0FsaWFzQ2FsbChPMikpKSB8fAorICAgICAgICAgKGlzYTxBcmd1bWVudD4oTzIpICYmIChpc2E8QWxsb2NhSW5zdD4oTzEpIHx8IGlzTm9BbGlhc0NhbGwoTzEpKSkpKQorICAgICAgcmV0dXJuIE5vQWxpYXM7CisKKyAgICAvLyBNb3N0IG9iamVjdHMgY2FuJ3QgYWxpYXMgbnVsbC4KKyAgICBpZiAoKGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihPMikgJiYgaXNLbm93bk5vbk51bGwoTzEpKSB8fAorICAgICAgICAoaXNhPENvbnN0YW50UG9pbnRlck51bGw+KE8xKSAmJiBpc0tub3duTm9uTnVsbChPMikpKQorICAgICAgcmV0dXJuIE5vQWxpYXM7CisgIAorICAgIC8vIElmIG9uZSBwb2ludGVyIGlzIHRoZSByZXN1bHQgb2YgYSBjYWxsL2ludm9rZSBvciBsb2FkIGFuZCB0aGUgb3RoZXIgaXMgYQorICAgIC8vIG5vbi1lc2NhcGluZyBsb2NhbCBvYmplY3Qgd2l0aGluIHRoZSBzYW1lIGZ1bmN0aW9uLCB0aGVuIHdlIGtub3cgdGhlCisgICAgLy8gb2JqZWN0IGNvdWxkbid0IGVzY2FwZSB0byBhIHBvaW50IHdoZXJlIHRoZSBjYWxsIGNvdWxkIHJldHVybiBpdC4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCBpZiB0aGUgcG9pbnRlcnMgYXJlIGluIGRpZmZlcmVudCBmdW5jdGlvbnMsIHRoZXJlIGFyZSBhCisgICAgLy8gdmFyaWV0eSBvZiBjb21wbGljYXRpb25zLiBBIGNhbGwgd2l0aCBhIG5vY2FwdHVyZSBhcmd1bWVudCBtYXkgc3RpbGwKKyAgICAvLyB0ZW1wb3Jhcnkgc3RvcmUgdGhlIG5vY2FwdHVyZSBhcmd1bWVudCdzIHZhbHVlIGluIGEgdGVtcG9yYXJ5IG1lbW9yeQorICAgIC8vIGxvY2F0aW9uIGlmIHRoYXQgbWVtb3J5IGxvY2F0aW9uIGRvZXNuJ3QgZXNjYXBlLiBPciBpdCBtYXkgcGFzcyBhCisgICAgLy8gbm9jYXB0dXJlIHZhbHVlIHRvIG90aGVyIGZ1bmN0aW9ucyBhcyBsb25nIGFzIHRoZXkgZG9uJ3QgY2FwdHVyZSBpdC4KKyAgICBpZiAoaXNFc2NhcGVTb3VyY2UoTzEpICYmIGlzTm9uRXNjYXBpbmdMb2NhbE9iamVjdChPMikpCisgICAgICByZXR1cm4gTm9BbGlhczsKKyAgICBpZiAoaXNFc2NhcGVTb3VyY2UoTzIpICYmIGlzTm9uRXNjYXBpbmdMb2NhbE9iamVjdChPMSkpCisgICAgICByZXR1cm4gTm9BbGlhczsKKyAgfQorCisgIC8vIElmIHRoZSBzaXplIG9mIG9uZSBhY2Nlc3MgaXMgbGFyZ2VyIHRoYW4gdGhlIGVudGlyZSBvYmplY3Qgb24gdGhlIG90aGVyCisgIC8vIHNpZGUsIHRoZW4gd2Uga25vdyBzdWNoIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBhbmQgY2FuIGFzc3VtZSBubyBhbGlhcy4KKyAgaWYgKFREKQorICAgIGlmICgoVjFTaXplICE9IFVua25vd25TaXplICYmIGlzT2JqZWN0U21hbGxlclRoYW4oTzIsIFYxU2l6ZSwgKlREKSkgfHwKKyAgICAgICAgKFYyU2l6ZSAhPSBVbmtub3duU2l6ZSAmJiBpc09iamVjdFNtYWxsZXJUaGFuKE8xLCBWMlNpemUsICpURCkpKQorICAgICAgcmV0dXJuIE5vQWxpYXM7CisgIAorICAvLyBGSVhNRTogVGhpcyBpc24ndCBhZ2dyZXNzaXZlbHkgaGFuZGxpbmcgYWxpYXMoR0VQLCBQSEkpIGZvciBleGFtcGxlOiBpZiB0aGUKKyAgLy8gR0VQIGNhbid0IHNpbXBsaWZ5LCB3ZSBkb24ndCBldmVuIGxvb2sgYXQgdGhlIFBISSBjYXNlcy4KKyAgaWYgKCFpc2E8R0VQT3BlcmF0b3I+KFYxKSAmJiBpc2E8R0VQT3BlcmF0b3I+KFYyKSkgeworICAgIHN0ZDo6c3dhcChWMSwgVjIpOworICAgIHN0ZDo6c3dhcChWMVNpemUsIFYyU2l6ZSk7CisgICAgc3RkOjpzd2FwKE8xLCBPMik7CisgIH0KKyAgaWYgKGNvbnN0IEdFUE9wZXJhdG9yICpHVjEgPSBkeW5fY2FzdDxHRVBPcGVyYXRvcj4oVjEpKQorICAgIHJldHVybiBhbGlhc0dFUChHVjEsIFYxU2l6ZSwgVjIsIFYyU2l6ZSwgTzEsIE8yKTsKKworICBpZiAoaXNhPFBISU5vZGU+KFYyKSAmJiAhaXNhPFBISU5vZGU+KFYxKSkgeworICAgIHN0ZDo6c3dhcChWMSwgVjIpOworICAgIHN0ZDo6c3dhcChWMVNpemUsIFYyU2l6ZSk7CisgIH0KKyAgaWYgKGNvbnN0IFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVjEpKQorICAgIHJldHVybiBhbGlhc1BISShQTiwgVjFTaXplLCBWMiwgVjJTaXplKTsKKworICBpZiAoaXNhPFNlbGVjdEluc3Q+KFYyKSAmJiAhaXNhPFNlbGVjdEluc3Q+KFYxKSkgeworICAgIHN0ZDo6c3dhcChWMSwgVjIpOworICAgIHN0ZDo6c3dhcChWMVNpemUsIFYyU2l6ZSk7CisgIH0KKyAgaWYgKGNvbnN0IFNlbGVjdEluc3QgKlMxID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oVjEpKQorICAgIHJldHVybiBhbGlhc1NlbGVjdChTMSwgVjFTaXplLCBWMiwgVjJTaXplKTsKKworICByZXR1cm4gTm9BQTo6YWxpYXMoVjEsIFYxU2l6ZSwgVjIsIFYyU2l6ZSk7Cit9CisKKy8vIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIHRoYXQgdXNlcyBBbGlhc0FuYWx5c2lzIHB1bGxzIGluIHRoaXMgZmlsZS4KK0RFRklOSU5HX0ZJTEVfRk9SKEJhc2ljQWxpYXNBbmFseXNpcykKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJhYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNTMgQEAKK2FkZF9sbHZtX2xpYnJhcnkoTExWTUFuYWx5c2lzCisgIEFsaWFzQW5hbHlzaXMuY3BwCisgIEFsaWFzQW5hbHlzaXNDb3VudGVyLmNwcAorICBBbGlhc0FuYWx5c2lzRXZhbHVhdG9yLmNwcAorICBBbGlhc0RlYnVnZ2VyLmNwcAorICBBbGlhc1NldFRyYWNrZXIuY3BwCisgIEFuYWx5c2lzLmNwcAorICBCYXNpY0FsaWFzQW5hbHlzaXMuY3BwCisgIENGR1ByaW50ZXIuY3BwCisgIENhcHR1cmVUcmFja2luZy5jcHAKKyAgQ29uc3RhbnRGb2xkaW5nLmNwcAorICBEYmdJbmZvUHJpbnRlci5jcHAKKyAgRGVidWdJbmZvLmNwcAorICBEb21QcmludGVyLmNwcAorICBJVlVzZXJzLmNwcAorICBJbmxpbmVDb3N0LmNwcAorICBJbnN0Q291bnQuY3BwCisgIEluc3RydWN0aW9uU2ltcGxpZnkuY3BwCisgIEludGVydmFsLmNwcAorICBJbnRlcnZhbFBhcnRpdGlvbi5jcHAKKyAgTGF6eVZhbHVlSW5mby5jcHAKKyAgTGliQ2FsbEFsaWFzQW5hbHlzaXMuY3BwCisgIExpYkNhbGxTZW1hbnRpY3MuY3BwCisgIExpbnQuY3BwCisgIExpdmVWYWx1ZXMuY3BwCisgIExvYWRzLmNwcAorICBMb29wRGVwZW5kZW5jZUFuYWx5c2lzLmNwcAorICBMb29wSW5mby5jcHAKKyAgTG9vcFBhc3MuY3BwCisgIE1lbW9yeUJ1aWx0aW5zLmNwcAorICBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMuY3BwCisgIE1vZHVsZURlYnVnSW5mb1ByaW50ZXIuY3BwCisgIFBISVRyYW5zQWRkci5jcHAKKyAgUG9pbnRlclRyYWNraW5nLmNwcAorICBQb3N0RG9taW5hdG9ycy5jcHAKKyAgUHJvZmlsZUVzdGltYXRvclBhc3MuY3BwCisgIFByb2ZpbGVJbmZvLmNwcAorICBQcm9maWxlSW5mb0xvYWRlci5jcHAKKyAgUHJvZmlsZUluZm9Mb2FkZXJQYXNzLmNwcAorICBQcm9maWxlVmVyaWZpZXJQYXNzLmNwcAorICBSZWdpb25JbmZvLmNwcAorICBSZWdpb25QcmludGVyLmNwcAorICBTY2FsYXJFdm9sdXRpb24uY3BwCisgIFNjYWxhckV2b2x1dGlvbkFsaWFzQW5hbHlzaXMuY3BwCisgIFNjYWxhckV2b2x1dGlvbkV4cGFuZGVyLmNwcAorICBTY2FsYXJFdm9sdXRpb25Ob3JtYWxpemF0aW9uLmNwcAorICBTcGFyc2VQcm9wYWdhdGlvbi5jcHAKKyAgVHJhY2UuY3BwCisgIFR5cGVCYXNlZEFsaWFzQW5hbHlzaXMuY3BwCisgIFZhbHVlVHJhY2tpbmcuY3BwCisgICkKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChMTFZNQW5hbHlzaXMgTExWTVN1cHBvcnQpCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvQ2FwdHVyZVRyYWNraW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9DYXB0dXJlVHJhY2tpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MjhkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvQ2FwdHVyZVRyYWNraW5nLmNwcApAQCAtMCwwICsxLDEyMCBAQAorLy89PT0tLS0gQ2FwdHVyZVRyYWNraW5nLmNwcCAtIERldGVybWluZSB3aGV0aGVyIGEgcG9pbnRlciBpcyBjYXB0dXJlZCAtLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdGhhdCBoZWxwIGRldGVybWluZSB3aGljaCBwb2ludGVycyBhcmUgY2FwdHVyZWQuCisvLyBBIHBvaW50ZXIgdmFsdWUgaXMgY2FwdHVyZWQgaWYgdGhlIGZ1bmN0aW9uIG1ha2VzIGEgY29weSBvZiBhbnkgcGFydCBvZiB0aGUKKy8vIHBvaW50ZXIgdGhhdCBvdXRsaXZlcyB0aGUgY2FsbC4gIE5vdCBiZWluZyBjYXB0dXJlZCBtZWFucywgbW9yZSBvciBsZXNzLCB0aGF0CisvLyB0aGUgcG9pbnRlciBpcyBvbmx5IGRlcmVmZXJlbmNlZCBhbmQgbm90IHN0b3JlZCBpbiBhIGdsb2JhbC4gIFJldHVybmluZyBwYXJ0CisvLyBvZiB0aGUgcG9pbnRlciBhcyB0aGUgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG1heSBvciBtYXkgbm90IGNvdW50IGFzIGNhcHR1cmluZworLy8gdGhlIHBvaW50ZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DYXB0dXJlVHJhY2tpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIEFzIGl0cyBjb21tZW50IG1lbnRpb25zLCBQb2ludGVyTWF5QmVDYXB0dXJlZCBjYW4gYmUgZXhwZW5zaXZlLgorLy8vIEhvd2V2ZXIsIGl0J3Mgbm90IGVhc3kgZm9yIEJhc2ljQUEgdG8gY2FjaGUgdGhlIHJlc3VsdCwgYmVjYXVzZQorLy8vIGl0J3MgYW4gSW1tdXRhYmxlUGFzcy4gVG8gd29yayBhcm91bmQgdGhpcywgYm91bmQgcXVlcmllcyBhdCBhCisvLy8gZml4ZWQgbnVtYmVyIG9mIHVzZXMuCisvLy8KKy8vLyBUT0RPOiBXcml0ZSBhIG5ldyBGdW5jdGlvblBhc3MgQWxpYXNBbmFseXNpcyBzbyB0aGF0IGl0IGNhbiBrZWVwCisvLy8gYSBjYWNoZS4gVGhlbiB3ZSBjYW4gbW92ZSB0aGUgY29kZSBmcm9tIEJhc2ljQWxpYXNBbmFseXNpcyBpbnRvCisvLy8gdGhhdCBwYXRoLCBhbmQgcmVtb3ZlIHRoaXMgdGhyZXNob2xkLgorc3RhdGljIGludCBjb25zdCBUaHJlc2hvbGQgPSAyMDsKKworLy8vIFBvaW50ZXJNYXlCZUNhcHR1cmVkIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBwb2ludGVyIHZhbHVlIG1heSBiZSBjYXB0dXJlZAorLy8vIGJ5IHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24gKHdoaWNoIGlzIHJlcXVpcmVkIHRvIGV4aXN0KS4gIFRoaXMgcm91dGluZSBjYW4KKy8vLyBiZSBleHBlbnNpdmUsIHNvIGNvbnNpZGVyIGNhY2hpbmcgdGhlIHJlc3VsdHMuICBUaGUgYm9vbGVhbiBSZXR1cm5DYXB0dXJlcworLy8vIHNwZWNpZmllcyB3aGV0aGVyIHJldHVybmluZyB0aGUgdmFsdWUgKG9yIHBhcnQgb2YgaXQpIGZyb20gdGhlIGZ1bmN0aW9uCisvLy8gY291bnRzIGFzIGNhcHR1cmluZyBpdCBvciBub3QuICBUaGUgYm9vbGVhbiBTdG9yZUNhcHR1cmVzIHNwZWNpZmllZCB3aGV0aGVyCisvLy8gc3RvcmluZyB0aGUgdmFsdWUgKG9yIHBhcnQgb2YgaXQpIGludG8gbWVtb3J5IGFueXdoZXJlIGF1dG9tYXRpY2FsbHkKKy8vLyBjb3VudHMgYXMgY2FwdHVyaW5nIGl0IG9yIG5vdC4KK2Jvb2wgbGx2bTo6UG9pbnRlck1heUJlQ2FwdHVyZWQoY29uc3QgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmV0dXJuQ2FwdHVyZXMsIGJvb2wgU3RvcmVDYXB0dXJlcykgeworICBhc3NlcnQoVi0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICYmICJDYXB0dXJlIGlzIGZvciBwb2ludGVycyBvbmx5ISIpOworICBTbWFsbFZlY3RvcjxVc2UqLCBUaHJlc2hvbGQ+IFdvcmtsaXN0OworICBTbWFsbFNldDxVc2UqLCBUaHJlc2hvbGQ+IFZpc2l0ZWQ7CisgIGludCBDb3VudCA9IDA7CisKKyAgZm9yIChWYWx1ZTo6Y29uc3RfdXNlX2l0ZXJhdG9yIFVJID0gVi0+dXNlX2JlZ2luKCksIFVFID0gVi0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IFVFOyArK1VJKSB7CisgICAgLy8gSWYgdGhlcmUgYXJlIGxvdHMgb2YgdXNlcywgY29uc2VydmF0aXZlbHkgc2F5IHRoYXQgdGhlIHZhbHVlCisgICAgLy8gaXMgY2FwdHVyZWQgdG8gYXZvaWQgdGFraW5nIHRvbyBtdWNoIGNvbXBpbGUgdGltZS4KKyAgICBpZiAoQ291bnQrKyA+PSBUaHJlc2hvbGQpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIFVzZSAqVSA9ICZVSS5nZXRVc2UoKTsKKyAgICBWaXNpdGVkLmluc2VydChVKTsKKyAgICBXb3JrbGlzdC5wdXNoX2JhY2soVSk7CisgIH0KKworICB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpIHsKKyAgICBVc2UgKlUgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KFUtPmdldFVzZXIoKSk7CisgICAgViA9IFUtPmdldCgpOworCisgICAgc3dpdGNoIChJLT5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhbGw6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6TG9hZDoKKyAgICAgIC8vIExvYWRpbmcgZnJvbSBhIHBvaW50ZXIgZG9lcyBub3QgY2F1c2UgaXQgdG8gYmUgY2FwdHVyZWQuCisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpSZXQ6CisgICAgICBpZiAoUmV0dXJuQ2FwdHVyZXMpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U3RvcmU6CisgICAgICBpZiAoViA9PSBJLT5nZXRPcGVyYW5kKDApKQorICAgICAgICAvLyBTdG9yZWQgdGhlIHBvaW50ZXIgLSBjb25zZXJ2YXRpdmVseSBhc3N1bWUgaXQgbWF5IGJlIGNhcHR1cmVkLgorICAgICAgICAvLyBUT0RPOiBJZiBTdG9yZUNhcHR1cmVzIGlzIG5vdCB0cnVlLCB3ZSBjb3VsZCBkbyBGYW5jeSBhbmFseXNpcworICAgICAgICAvLyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHN0b3JlIGlzIG5vdCBhY3R1YWxseSBhbiBlc2NhcGUgcG9pbnQuCisgICAgICAgIC8vIEluIHRoYXQgY2FzZSwgQmFzaWNBbGlhc0FuYWx5c2lzIHNob3VsZCBiZSB1cGRhdGVkIGFzIHdlbGwgdG8KKyAgICAgICAgLy8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAvLyBTdG9yaW5nIHRvIHRoZSBwb2ludGVlIGRvZXMgbm90IGNhdXNlIHRoZSBwb2ludGVyIHRvIGJlIGNhcHR1cmVkLgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlBISToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6CisgICAgICAvLyBUaGUgb3JpZ2luYWwgdmFsdWUgaXMgbm90IGNhcHR1cmVkIHZpYSB0aGlzIGlmIHRoZSBuZXcgdmFsdWUgaXNuJ3QuCisgICAgICBmb3IgKEluc3RydWN0aW9uOjp1c2VfaXRlcmF0b3IgVUkgPSBJLT51c2VfYmVnaW4oKSwgVUUgPSBJLT51c2VfZW5kKCk7CisgICAgICAgICAgIFVJICE9IFVFOyArK1VJKSB7CisgICAgICAgIFVzZSAqVSA9ICZVSS5nZXRVc2UoKTsKKyAgICAgICAgaWYgKFZpc2l0ZWQuaW5zZXJ0KFUpKQorICAgICAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhVKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OklDbXA6CisgICAgICAvLyBEb24ndCBjb3VudCBjb21wYXJpc29ucyBvZiBhIG5vLWFsaWFzIHJldHVybiB2YWx1ZSBhZ2FpbnN0IG51bGwgYXMKKyAgICAgIC8vIGNhcHR1cmVzLiBUaGlzIGFsbG93cyB1cyB0byBpZ25vcmUgY29tcGFyaXNvbnMgb2YgbWFsbG9jIHJlc3VsdHMKKyAgICAgIC8vIHdpdGggbnVsbCwgZm9yIGV4YW1wbGUuCisgICAgICBpZiAoaXNOb0FsaWFzQ2FsbChWLT5zdHJpcFBvaW50ZXJDYXN0cygpKSkKKyAgICAgICAgaWYgKENvbnN0YW50UG9pbnRlck51bGwgKkNQTiA9CisgICAgICAgICAgICAgIGR5bl9jYXN0PENvbnN0YW50UG9pbnRlck51bGw+KEktPmdldE9wZXJhbmQoMSkpKQorICAgICAgICAgIGlmIChDUE4tPmdldFR5cGUoKS0+Z2V0QWRkcmVzc1NwYWNlKCkgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgLy8gT3RoZXJ3aXNlLCBiZSBjb25zZXJ2YXRpdmUuIFRoZXJlIGFyZSBjcmF6eSB3YXlzIHRvIGNhcHR1cmUgcG9pbnRlcnMKKyAgICAgIC8vIHVzaW5nIGNvbXBhcmlzb25zLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vIFNvbWV0aGluZyBlbHNlIC0gYmUgY29uc2VydmF0aXZlIGFuZCBzYXkgaXQgaXMgY2FwdHVyZWQuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBBbGwgdXNlcyBleGFtaW5lZCAtIG5vdCBjYXB0dXJlZC4KKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5jcHAgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY3OTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5jcHAKQEAgLTAsMCArMSwxMjg4IEBACisvLz09PS0tIENvbnN0YW50Rm9sZGluZy5jcHAgLSBGb2xkIGluc3RydWN0aW9ucyBpbnRvIGNvbnN0YW50cyAtLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHJvdXRpbmVzIGZvciBmb2xkaW5nIGluc3RydWN0aW9ucyBpbnRvIGNvbnN0YW50cy4KKy8vCisvLyBBbHNvLCB0byBzdXBwbGVtZW50IHRoZSBiYXNpYyBWTUNvcmUgQ29uc3RhbnRFeHByIHNpbXBsaWZpY2F0aW9ucywKKy8vIHRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgYWRkaXRpb25hbCBmb2xkaW5nIHJvdXRpbmVzIHRoYXQgY2FuIG1ha2UgdXNlIG9mCisvLyBUYXJnZXREYXRhIGluZm9ybWF0aW9uLiBUaGVzZSBmdW5jdGlvbnMgY2Fubm90IGdvIGluIFZNQ29yZSBkdWUgdG8gbGlicmFyeQorLy8gZGVwZW5kZW5jeSBpc3N1ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y21hdGg+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbnN0YW50IEZvbGRpbmcgaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEZvbGRCaXRDYXN0IC0gQ29uc3RhbnQgZm9sZCBiaXRjYXN0LCBzeW1ib2xpY2FsbHkgZXZhbHVhdGluZyBpdCB3aXRoIAorLy8vIFRhcmdldERhdGEuICBUaGlzIGFsd2F5cyByZXR1cm5zIGEgbm9uLW51bGwgY29uc3RhbnQsIGJ1dCBpdCBtYXkgYmUgYQorLy8vIENvbnN0YW50RXhwciBpZiB1bmZvbGRhYmxlLgorc3RhdGljIENvbnN0YW50ICpGb2xkQml0Q2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICZURCkgeworICAKKyAgLy8gVGhpcyBvbmx5IGhhbmRsZXMgY2FzdHMgdG8gdmVjdG9ycyBjdXJyZW50bHkuCisgIGNvbnN0IFZlY3RvclR5cGUgKkRlc3RWVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihEZXN0VHkpOworICBpZiAoRGVzdFZUeSA9PSAwKQorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoQywgRGVzdFR5KTsKKyAgCisgIC8vIElmIHRoaXMgaXMgYSBzY2FsYXIgLT4gdmVjdG9yIGNhc3QsIGNvbnZlcnQgdGhlIGlucHV0IGludG8gYSA8MSB4IHNjYWxhcj4KKyAgLy8gdmVjdG9yIHNvIHRoZSBjb2RlIGJlbG93IGNhbiBoYW5kbGUgaXQgdW5pZm9ybWx5LgorICBpZiAoaXNhPENvbnN0YW50RlA+KEMpIHx8IGlzYTxDb25zdGFudEludD4oQykpIHsKKyAgICBDb25zdGFudCAqT3BzID0gQzsgLy8gZG9uJ3QgdGFrZSB0aGUgYWRkcmVzcyBvZiBDIQorICAgIHJldHVybiBGb2xkQml0Q2FzdChDb25zdGFudFZlY3Rvcjo6Z2V0KCZPcHMsIDEpLCBEZXN0VHksIFREKTsKKyAgfQorICAKKyAgLy8gSWYgdGhpcyBpcyBhIGJpdGNhc3QgZnJvbSBjb25zdGFudCB2ZWN0b3IgLT4gdmVjdG9yLCBmb2xkIGl0LgorICBDb25zdGFudFZlY3RvciAqQ1YgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oQyk7CisgIGlmIChDViA9PSAwKQorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoQywgRGVzdFR5KTsKKyAgCisgIC8vIElmIHRoZSBlbGVtZW50IHR5cGVzIG1hdGNoLCBWTUNvcmUgY2FuIGZvbGQgaXQuCisgIHVuc2lnbmVkIE51bURzdEVsdCA9IERlc3RWVHktPmdldE51bUVsZW1lbnRzKCk7CisgIHVuc2lnbmVkIE51bVNyY0VsdCA9IENWLT5nZXROdW1PcGVyYW5kcygpOworICBpZiAoTnVtRHN0RWx0ID09IE51bVNyY0VsdCkKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KEMsIERlc3RUeSk7CisgIAorICBjb25zdCBUeXBlICpTcmNFbHRUeSA9IENWLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCk7CisgIGNvbnN0IFR5cGUgKkRzdEVsdFR5ID0gRGVzdFZUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgCisgIC8vIE90aGVyd2lzZSwgd2UncmUgY2hhbmdpbmcgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHZlY3Rvciwgd2hpY2ggCisgIC8vIHJlcXVpcmVzIGVuZGlhbm5lc3MgaW5mb3JtYXRpb24gdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLiAgRm9yIGV4YW1wbGUsCisgIC8vICAgIGJpdGNhc3QgKDwyIHggaTY0PiA8aTY0IDAsIGk2NCAxPiB0byA8NCB4IGkzMj4pCisgIC8vIGZvbGRzIHRvIChsaXR0bGUgZW5kaWFuKToKKyAgLy8gICAgPDQgeCBpMzI+IDxpMzIgMCwgaTMyIDAsIGkzMiAxLCBpMzIgMD4KKyAgLy8gYW5kIHRvIChiaWcgZW5kaWFuKToKKyAgLy8gICAgPDQgeCBpMzI+IDxpMzIgMCwgaTMyIDAsIGkzMiAwLCBpMzIgMT4KKyAgCisgIC8vIEZpcnN0IHRoaW5nIGlzIGZpcnN0LiAgV2Ugb25seSB3YW50IHRvIHRoaW5rIGFib3V0IGludGVnZXIgaGVyZSwgc28gaWYKKyAgLy8gd2UgaGF2ZSBzb21ldGhpbmcgaW4gRlAgZm9ybSwgcmVjYXN0IGl0IGFzIGludGVnZXIuCisgIGlmIChEc3RFbHRUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSkgeworICAgIC8vIEZvbGQgdG8gYW4gdmVjdG9yIG9mIGludGVnZXJzIHdpdGggc2FtZSBzaXplIGFzIG91ciBGUCB0eXBlLgorICAgIHVuc2lnbmVkIEZQV2lkdGggPSBEc3RFbHRUeS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworICAgIGNvbnN0IFR5cGUgKkRlc3RJVlR5ID0KKyAgICAgIFZlY3RvclR5cGU6OmdldChJbnRlZ2VyVHlwZTo6Z2V0KEMtPmdldENvbnRleHQoKSwgRlBXaWR0aCksIE51bURzdEVsdCk7CisgICAgLy8gUmVjdXJzaXZlbHkgaGFuZGxlIHRoaXMgaW50ZWdlciBjb252ZXJzaW9uLCBpZiBwb3NzaWJsZS4KKyAgICBDID0gRm9sZEJpdENhc3QoQywgRGVzdElWVHksIFREKTsKKyAgICBpZiAoIUMpIHJldHVybiBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoQywgRGVzdFR5KTsKKyAgICAKKyAgICAvLyBGaW5hbGx5LCBWTUNvcmUgY2FuIGhhbmRsZSB0aGlzIG5vdyB0aGF0ICNlbHRzIGxpbmUgdXAuCisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChDLCBEZXN0VHkpOworICB9CisgIAorICAvLyBPa2F5LCB3ZSBrbm93IHRoZSBkZXN0aW5hdGlvbiBpcyBpbnRlZ2VyLCBpZiB0aGUgaW5wdXQgaXMgRlAsIGNvbnZlcnQKKyAgLy8gaXQgdG8gaW50ZWdlciBmaXJzdC4KKyAgaWYgKFNyY0VsdFR5LT5pc0Zsb2F0aW5nUG9pbnRUeSgpKSB7CisgICAgdW5zaWduZWQgRlBXaWR0aCA9IFNyY0VsdFR5LT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgICAgY29uc3QgVHlwZSAqU3JjSVZUeSA9CisgICAgICBWZWN0b3JUeXBlOjpnZXQoSW50ZWdlclR5cGU6OmdldChDLT5nZXRDb250ZXh0KCksIEZQV2lkdGgpLCBOdW1TcmNFbHQpOworICAgIC8vIEFzayBWTUNvcmUgdG8gZG8gdGhlIGNvbnZlcnNpb24gbm93IHRoYXQgI2VsdHMgbGluZSB1cC4KKyAgICBDID0gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KEMsIFNyY0lWVHkpOworICAgIENWID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KEMpOworICAgIGlmICghQ1YpICAvLyBJZiBWTUNvcmUgd2Fzbid0IGFibGUgdG8gZm9sZCBpdCwgYmFpbCBvdXQuCisgICAgICByZXR1cm4gQzsKKyAgfQorICAKKyAgLy8gTm93IHdlIGtub3cgdGhhdCB0aGUgaW5wdXQgYW5kIG91dHB1dCB2ZWN0b3JzIGFyZSBib3RoIGludGVnZXIgdmVjdG9ycworICAvLyBvZiB0aGUgc2FtZSBzaXplLCBhbmQgdGhhdCB0aGVpciAjZWxlbWVudHMgaXMgbm90IHRoZSBzYW1lLiAgRG8gdGhlCisgIC8vIGNvbnZlcnNpb24gaGVyZSwgd2hpY2ggZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBpbnB1dCBvciBvdXRwdXQgaGFzCisgIC8vIG1vcmUgZWxlbWVudHMuCisgIGJvb2wgaXNMaXR0bGVFbmRpYW4gPSBURC5pc0xpdHRsZUVuZGlhbigpOworICAKKyAgU21hbGxWZWN0b3I8Q29uc3RhbnQqLCAzMj4gUmVzdWx0OworICBpZiAoTnVtRHN0RWx0IDwgTnVtU3JjRWx0KSB7CisgICAgLy8gSGFuZGxlOiBiaXRjYXN0ICg8NCB4IGkzMj4gPGkzMiAwLCBpMzIgMSwgaTMyIDIsIGkzMiAzPiB0byA8MiB4IGk2ND4pCisgICAgQ29uc3RhbnQgKlplcm8gPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKERzdEVsdFR5KTsKKyAgICB1bnNpZ25lZCBSYXRpbyA9IE51bVNyY0VsdC9OdW1Ec3RFbHQ7CisgICAgdW5zaWduZWQgU3JjQml0U2l6ZSA9IFNyY0VsdFR5LT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgICAgdW5zaWduZWQgU3JjRWx0ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bURzdEVsdDsgKytpKSB7CisgICAgICAvLyBCdWlsZCBlYWNoIGVsZW1lbnQgb2YgdGhlIHJlc3VsdC4KKyAgICAgIENvbnN0YW50ICpFbHQgPSBaZXJvOworICAgICAgdW5zaWduZWQgU2hpZnRBbXQgPSBpc0xpdHRsZUVuZGlhbiA/IDAgOiBTcmNCaXRTaXplKihSYXRpby0xKTsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gUmF0aW87ICsraikgeworICAgICAgICBDb25zdGFudCAqU3JjID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENWLT5nZXRPcGVyYW5kKFNyY0VsdCsrKSk7CisgICAgICAgIGlmICghU3JjKSAgLy8gUmVqZWN0IGNvbnN0YW50ZXhwciBlbGVtZW50cy4KKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KEMsIERlc3RUeSk7CisgICAgICAgIAorICAgICAgICAvLyBaZXJvIGV4dGVuZCB0aGUgZWxlbWVudCB0byB0aGUgcmlnaHQgc2l6ZS4KKyAgICAgICAgU3JjID0gQ29uc3RhbnRFeHByOjpnZXRaRXh0KFNyYywgRWx0LT5nZXRUeXBlKCkpOworICAgICAgICAKKyAgICAgICAgLy8gU2hpZnQgaXQgdG8gdGhlIHJpZ2h0IHBsYWNlLCBkZXBlbmRpbmcgb24gZW5kaWFubmVzcy4KKyAgICAgICAgU3JjID0gQ29uc3RhbnRFeHByOjpnZXRTaGwoU3JjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChTcmMtPmdldFR5cGUoKSwgU2hpZnRBbXQpKTsKKyAgICAgICAgU2hpZnRBbXQgKz0gaXNMaXR0bGVFbmRpYW4gPyBTcmNCaXRTaXplIDogLVNyY0JpdFNpemU7CisgICAgICAgIAorICAgICAgICAvLyBNaXggaXQgaW4uCisgICAgICAgIEVsdCA9IENvbnN0YW50RXhwcjo6Z2V0T3IoRWx0LCBTcmMpOworICAgICAgfQorICAgICAgUmVzdWx0LnB1c2hfYmFjayhFbHQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBIYW5kbGU6IGJpdGNhc3QgKDwyIHggaTY0PiA8aTY0IDAsIGk2NCAxPiB0byA8NCB4IGkzMj4pCisgICAgdW5zaWduZWQgUmF0aW8gPSBOdW1Ec3RFbHQvTnVtU3JjRWx0OworICAgIHVuc2lnbmVkIERzdEJpdFNpemUgPSBEc3RFbHRUeS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworICAgIAorICAgIC8vIExvb3Agb3ZlciBlYWNoIHNvdXJjZSB2YWx1ZSwgZXhwYW5kaW5nIGludG8gbXVsdGlwbGUgcmVzdWx0cy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVNyY0VsdDsgKytpKSB7CisgICAgICBDb25zdGFudCAqU3JjID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENWLT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIGlmICghU3JjKSAgLy8gUmVqZWN0IGNvbnN0YW50ZXhwciBlbGVtZW50cy4KKyAgICAgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChDLCBEZXN0VHkpOworICAgICAgCisgICAgICB1bnNpZ25lZCBTaGlmdEFtdCA9IGlzTGl0dGxlRW5kaWFuID8gMCA6IERzdEJpdFNpemUqKFJhdGlvLTEpOworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiAhPSBSYXRpbzsgKytqKSB7CisgICAgICAgIC8vIFNoaWZ0IHRoZSBwaWVjZSBvZiB0aGUgdmFsdWUgaW50byB0aGUgcmlnaHQgcGxhY2UsIGRlcGVuZGluZyBvbgorICAgICAgICAvLyBlbmRpYW5uZXNzLgorICAgICAgICBDb25zdGFudCAqRWx0ID0gQ29uc3RhbnRFeHByOjpnZXRMU2hyKFNyYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFNyYy0+Z2V0VHlwZSgpLCBTaGlmdEFtdCkpOworICAgICAgICBTaGlmdEFtdCArPSBpc0xpdHRsZUVuZGlhbiA/IERzdEJpdFNpemUgOiAtRHN0Qml0U2l6ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFRydW5jYXRlIGFuZCByZW1lbWJlciB0aGlzIHBpZWNlLgorICAgICAgICBSZXN1bHQucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0VHJ1bmMoRWx0LCBEc3RFbHRUeSkpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoUmVzdWx0LmRhdGEoKSwgUmVzdWx0LnNpemUoKSk7Cit9CisKKworLy8vIElzQ29uc3RhbnRPZmZzZXRGcm9tR2xvYmFsIC0gSWYgdGhpcyBjb25zdGFudCBpcyBhY3R1YWxseSBhIGNvbnN0YW50IG9mZnNldAorLy8vIGZyb20gYSBnbG9iYWwsIHJldHVybiB0aGUgZ2xvYmFsIGFuZCB0aGUgY29uc3RhbnQuICBCZWNhdXNlIG9mCisvLy8gY29uc3RhbnRleHBycywgdGhpcyBmdW5jdGlvbiBpcyByZWN1cnNpdmUuCitzdGF0aWMgYm9vbCBJc0NvbnN0YW50T2Zmc2V0RnJvbUdsb2JhbChDb25zdGFudCAqQywgR2xvYmFsVmFsdWUgKiZHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJk9mZnNldCwgY29uc3QgVGFyZ2V0RGF0YSAmVEQpIHsKKyAgLy8gVHJpdmlhbCBjYXNlLCBjb25zdGFudCBpcyB0aGUgZ2xvYmFsLgorICBpZiAoKEdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KEMpKSkgeworICAgIE9mZnNldCA9IDA7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIC8vIE90aGVyd2lzZSwgaWYgdGhpcyBpc24ndCBhIGNvbnN0YW50IGV4cHIsIGJhaWwgb3V0LgorICBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDKTsKKyAgaWYgKCFDRSkgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gTG9vayB0aHJvdWdoIHB0ci0+aW50IGFuZCBwdHItPnB0ciBjYXN0cy4KKyAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQgfHwKKyAgICAgIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCkKKyAgICByZXR1cm4gSXNDb25zdGFudE9mZnNldEZyb21HbG9iYWwoQ0UtPmdldE9wZXJhbmQoMCksIEdWLCBPZmZzZXQsIFREKTsKKyAgCisgIC8vIGkzMiogZ2V0ZWxlbWVudHB0ciAoWzUgeCBpMzJdKiBAYSwgaTMyIDAsIGkzMiA1KSAgICAKKyAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cikgeworICAgIC8vIENhbm5vdCBjb21wdXRlIHRoaXMgaWYgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgcG9pbnRlciBpcyBtaXNzaW5nIHNpemUKKyAgICAvLyBpbmZvLgorICAgIGlmICghY2FzdDxQb2ludGVyVHlwZT4oQ0UtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgLT5nZXRFbGVtZW50VHlwZSgpLT5pc1NpemVkKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgLy8gSWYgdGhlIGJhc2UgaXNuJ3QgYSBnbG9iYWwrY29uc3RhbnQsIHdlIGFyZW4ndCBlaXRoZXIuCisgICAgaWYgKCFJc0NvbnN0YW50T2Zmc2V0RnJvbUdsb2JhbChDRS0+Z2V0T3BlcmFuZCgwKSwgR1YsIE9mZnNldCwgVEQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIC8vIE90aGVyd2lzZSwgYWRkIGFueSBvZmZzZXQgdGhhdCBvdXIgb3BlcmFuZHMgcHJvdmlkZS4KKyAgICBnZXBfdHlwZV9pdGVyYXRvciBHVEkgPSBnZXBfdHlwZV9iZWdpbihDRSk7CisgICAgZm9yIChVc2VyOjpjb25zdF9vcF9pdGVyYXRvciBpID0gQ0UtPm9wX2JlZ2luKCkgKyAxLCBlID0gQ0UtPm9wX2VuZCgpOworICAgICAgICAgaSAhPSBlOyArK2ksICsrR1RJKSB7CisgICAgICBDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oKmkpOworICAgICAgaWYgKCFDSSkgcmV0dXJuIGZhbHNlOyAgLy8gSW5kZXggaXNuJ3QgYSBzaW1wbGUgY29uc3RhbnQ/CisgICAgICBpZiAoQ0ktPmlzWmVybygpKSBjb250aW51ZTsgIC8vIE5vdCBhZGRpbmcgYW55dGhpbmcuCisgICAgICAKKyAgICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVCA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KCpHVEkpKSB7CisgICAgICAgIC8vIE4gPSBOICsgT2Zmc2V0CisgICAgICAgIE9mZnNldCArPSBURC5nZXRTdHJ1Y3RMYXlvdXQoU1QpLT5nZXRFbGVtZW50T2Zmc2V0KENJLT5nZXRaRXh0VmFsdWUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBTZXF1ZW50aWFsVHlwZSAqU1FUID0gY2FzdDxTZXF1ZW50aWFsVHlwZT4oKkdUSSk7CisgICAgICAgIE9mZnNldCArPSBURC5nZXRUeXBlQWxsb2NTaXplKFNRVC0+Z2V0RWxlbWVudFR5cGUoKSkqQ0ktPmdldFNFeHRWYWx1ZSgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUmVhZERhdGFGcm9tR2xvYmFsIC0gUmVjdXJzaXZlIGhlbHBlciB0byByZWFkIGJpdHMgb3V0IG9mIGdsb2JhbC4gIEMgaXMgdGhlCisvLy8gY29uc3RhbnQgYmVpbmcgY29waWVkIG91dCBvZi4gQnl0ZU9mZnNldCBpcyBhbiBvZmZzZXQgaW50byBDLiAgQ3VyUHRyIGlzIHRoZQorLy8vIHBvaW50ZXIgdG8gY29weSByZXN1bHRzIGludG8gYW5kIEJ5dGVzTGVmdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgaW4KKy8vLyB0aGUgQ3VyUHRyIGJ1ZmZlci4gIFREIGlzIHRoZSB0YXJnZXQgZGF0YS4KK3N0YXRpYyBib29sIFJlYWREYXRhRnJvbUdsb2JhbChDb25zdGFudCAqQywgdWludDY0X3QgQnl0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpDdXJQdHIsIHVuc2lnbmVkIEJ5dGVzTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICZURCkgeworICBhc3NlcnQoQnl0ZU9mZnNldCA8PSBURC5nZXRUeXBlQWxsb2NTaXplKEMtPmdldFR5cGUoKSkgJiYKKyAgICAgICAgICJPdXQgb2YgcmFuZ2UgYWNjZXNzIik7CisgIAorICAvLyBJZiB0aGlzIGVsZW1lbnQgaXMgemVybyBvciB1bmRlZmluZWQsIHdlIGNhbiBqdXN0IHJldHVybiBzaW5jZSAqQ3VyUHRyIGlzCisgIC8vIHplcm8gaW5pdGlhbGl6ZWQuCisgIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihDKSB8fCBpc2E8VW5kZWZWYWx1ZT4oQykpCisgICAgcmV0dXJuIHRydWU7CisgIAorICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEMpKSB7CisgICAgaWYgKENJLT5nZXRCaXRXaWR0aCgpID4gNjQgfHwKKyAgICAgICAgKENJLT5nZXRCaXRXaWR0aCgpICYgNykgIT0gMCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICB1aW50NjRfdCBWYWwgPSBDSS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgdW5zaWduZWQgSW50Qnl0ZXMgPSB1bnNpZ25lZChDSS0+Z2V0Qml0V2lkdGgoKS84KTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IEJ5dGVzTGVmdCAmJiBCeXRlT2Zmc2V0ICE9IEludEJ5dGVzOyArK2kpIHsKKyAgICAgIEN1clB0cltpXSA9ICh1bnNpZ25lZCBjaGFyKShWYWwgPj4gKEJ5dGVPZmZzZXQgKiA4KSk7CisgICAgICArK0J5dGVPZmZzZXQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBpZiAoQ29uc3RhbnRGUCAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oQykpIHsKKyAgICBpZiAoQ0ZQLT5nZXRUeXBlKCktPmlzRG91YmxlVHkoKSkgeworICAgICAgQyA9IEZvbGRCaXRDYXN0KEMsIFR5cGU6OmdldEludDY0VHkoQy0+Z2V0Q29udGV4dCgpKSwgVEQpOworICAgICAgcmV0dXJuIFJlYWREYXRhRnJvbUdsb2JhbChDLCBCeXRlT2Zmc2V0LCBDdXJQdHIsIEJ5dGVzTGVmdCwgVEQpOworICAgIH0KKyAgICBpZiAoQ0ZQLT5nZXRUeXBlKCktPmlzRmxvYXRUeSgpKXsKKyAgICAgIEMgPSBGb2xkQml0Q2FzdChDLCBUeXBlOjpnZXRJbnQzMlR5KEMtPmdldENvbnRleHQoKSksIFREKTsKKyAgICAgIHJldHVybiBSZWFkRGF0YUZyb21HbG9iYWwoQywgQnl0ZU9mZnNldCwgQ3VyUHRyLCBCeXRlc0xlZnQsIFREKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKENvbnN0YW50U3RydWN0ICpDUyA9IGR5bl9jYXN0PENvbnN0YW50U3RydWN0PihDKSkgeworICAgIGNvbnN0IFN0cnVjdExheW91dCAqU0wgPSBURC5nZXRTdHJ1Y3RMYXlvdXQoQ1MtPmdldFR5cGUoKSk7CisgICAgdW5zaWduZWQgSW5kZXggPSBTTC0+Z2V0RWxlbWVudENvbnRhaW5pbmdPZmZzZXQoQnl0ZU9mZnNldCk7CisgICAgdWludDY0X3QgQ3VyRWx0T2Zmc2V0ID0gU0wtPmdldEVsZW1lbnRPZmZzZXQoSW5kZXgpOworICAgIEJ5dGVPZmZzZXQgLT0gQ3VyRWx0T2Zmc2V0OworICAgIAorICAgIHdoaWxlICgxKSB7CisgICAgICAvLyBJZiB0aGUgZWxlbWVudCBhY2Nlc3MgaXMgdG8gdGhlIGVsZW1lbnQgaXRzZWxmIGFuZCBub3QgdG8gdGFpbCBwYWRkaW5nLAorICAgICAgLy8gcmVhZCB0aGUgYnl0ZXMgZnJvbSB0aGUgZWxlbWVudC4KKyAgICAgIHVpbnQ2NF90IEVsdFNpemUgPSBURC5nZXRUeXBlQWxsb2NTaXplKENTLT5nZXRPcGVyYW5kKEluZGV4KS0+Z2V0VHlwZSgpKTsKKworICAgICAgaWYgKEJ5dGVPZmZzZXQgPCBFbHRTaXplICYmCisgICAgICAgICAgIVJlYWREYXRhRnJvbUdsb2JhbChDUy0+Z2V0T3BlcmFuZChJbmRleCksIEJ5dGVPZmZzZXQsIEN1clB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzTGVmdCwgVEQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAKKyAgICAgICsrSW5kZXg7CisgICAgICAKKyAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSByZWFkIGZyb20gdGhlIGxhc3Qgc3RydWN0IGVsZW1lbnQsIGlmIHNvIHdlJ3JlIGRvbmUuCisgICAgICBpZiAoSW5kZXggPT0gQ1MtPmdldFR5cGUoKS0+Z2V0TnVtRWxlbWVudHMoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIElmIHdlIHJlYWQgYWxsIG9mIHRoZSBieXRlcyB3ZSBuZWVkZWQgZnJvbSB0aGlzIGVsZW1lbnQgd2UncmUgZG9uZS4KKyAgICAgIHVpbnQ2NF90IE5leHRFbHRPZmZzZXQgPSBTTC0+Z2V0RWxlbWVudE9mZnNldChJbmRleCk7CisKKyAgICAgIGlmIChCeXRlc0xlZnQgPD0gTmV4dEVsdE9mZnNldC1DdXJFbHRPZmZzZXQtQnl0ZU9mZnNldCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIE1vdmUgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgc3RydWN0LgorICAgICAgQ3VyUHRyICs9IE5leHRFbHRPZmZzZXQtQ3VyRWx0T2Zmc2V0LUJ5dGVPZmZzZXQ7CisgICAgICBCeXRlc0xlZnQgLT0gTmV4dEVsdE9mZnNldC1DdXJFbHRPZmZzZXQtQnl0ZU9mZnNldDsKKyAgICAgIEJ5dGVPZmZzZXQgPSAwOworICAgICAgQ3VyRWx0T2Zmc2V0ID0gTmV4dEVsdE9mZnNldDsKKyAgICB9CisgICAgLy8gbm90IHJlYWNoZWQuCisgIH0KKworICBpZiAoQ29uc3RhbnRBcnJheSAqQ0EgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihDKSkgeworICAgIHVpbnQ2NF90IEVsdFNpemUgPSBURC5nZXRUeXBlQWxsb2NTaXplKENBLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIHVpbnQ2NF90IEluZGV4ID0gQnl0ZU9mZnNldCAvIEVsdFNpemU7CisgICAgdWludDY0X3QgT2Zmc2V0ID0gQnl0ZU9mZnNldCAtIEluZGV4ICogRWx0U2l6ZTsKKyAgICBmb3IgKDsgSW5kZXggIT0gQ0EtPmdldFR5cGUoKS0+Z2V0TnVtRWxlbWVudHMoKTsgKytJbmRleCkgeworICAgICAgaWYgKCFSZWFkRGF0YUZyb21HbG9iYWwoQ0EtPmdldE9wZXJhbmQoSW5kZXgpLCBPZmZzZXQsIEN1clB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzTGVmdCwgVEQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoRWx0U2l6ZSA+PSBCeXRlc0xlZnQpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgCisgICAgICBPZmZzZXQgPSAwOworICAgICAgQnl0ZXNMZWZ0IC09IEVsdFNpemU7CisgICAgICBDdXJQdHIgKz0gRWx0U2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIGlmIChDb25zdGFudFZlY3RvciAqQ1YgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oQykpIHsKKyAgICB1aW50NjRfdCBFbHRTaXplID0gVEQuZ2V0VHlwZUFsbG9jU2l6ZShDVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICB1aW50NjRfdCBJbmRleCA9IEJ5dGVPZmZzZXQgLyBFbHRTaXplOworICAgIHVpbnQ2NF90IE9mZnNldCA9IEJ5dGVPZmZzZXQgLSBJbmRleCAqIEVsdFNpemU7CisgICAgZm9yICg7IEluZGV4ICE9IENWLT5nZXRUeXBlKCktPmdldE51bUVsZW1lbnRzKCk7ICsrSW5kZXgpIHsKKyAgICAgIGlmICghUmVhZERhdGFGcm9tR2xvYmFsKENWLT5nZXRPcGVyYW5kKEluZGV4KSwgT2Zmc2V0LCBDdXJQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlc0xlZnQsIFREKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKEVsdFNpemUgPj0gQnl0ZXNMZWZ0KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIAorICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgIEJ5dGVzTGVmdCAtPSBFbHRTaXplOworICAgICAgQ3VyUHRyICs9IEVsdFNpemU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIAorICAvLyBPdGhlcndpc2UsIHVua25vd24gaW5pdGlhbGl6ZXIgdHlwZS4KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgQ29uc3RhbnQgKkZvbGRSZWludGVycHJldExvYWRGcm9tQ29uc3RQdHIoQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAmVEQpIHsKKyAgY29uc3QgVHlwZSAqTG9hZFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oQy0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgY29uc3QgSW50ZWdlclR5cGUgKkludFR5cGUgPSBkeW5fY2FzdDxJbnRlZ2VyVHlwZT4oTG9hZFR5KTsKKyAgCisgIC8vIElmIHRoaXMgaXNuJ3QgYW4gaW50ZWdlciBsb2FkIHdlIGNhbid0IGZvbGQgaXQgZGlyZWN0bHkuCisgIGlmICghSW50VHlwZSkgeworICAgIC8vIElmIHRoaXMgaXMgYSBmbG9hdC9kb3VibGUgbG9hZCwgd2UgY2FuIHRyeSBmb2xkaW5nIGl0IGFzIGFuIGludDMyLzY0IGxvYWQKKyAgICAvLyBhbmQgdGhlbiBiaXRjYXN0IHRoZSByZXN1bHQuICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHVuaW9uIGNhc2VzLiAgTm90ZQorICAgIC8vIHRoYXQgYWRkcmVzcyBzcGFjZXMgZG9uJ3QgbWF0dGVyIGhlcmUgc2luY2Ugd2UncmUgbm90IGdvaW5nIHRvIHJlc3VsdCBpbgorICAgIC8vIGFuIGFjdHVhbCBuZXcgbG9hZC4KKyAgICBjb25zdCBUeXBlICpNYXBUeTsKKyAgICBpZiAoTG9hZFR5LT5pc0Zsb2F0VHkoKSkKKyAgICAgIE1hcFR5ID0gVHlwZTo6Z2V0SW50MzJQdHJUeShDLT5nZXRDb250ZXh0KCkpOworICAgIGVsc2UgaWYgKExvYWRUeS0+aXNEb3VibGVUeSgpKQorICAgICAgTWFwVHkgPSBUeXBlOjpnZXRJbnQ2NFB0clR5KEMtPmdldENvbnRleHQoKSk7CisgICAgZWxzZSBpZiAoTG9hZFR5LT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIE1hcFR5ID0gSW50ZWdlclR5cGU6OmdldChDLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEQuZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyhMb2FkVHkpKTsKKyAgICAgIE1hcFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChNYXBUeSk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gMDsKKworICAgIEMgPSBGb2xkQml0Q2FzdChDLCBNYXBUeSwgVEQpOworICAgIGlmIChDb25zdGFudCAqUmVzID0gRm9sZFJlaW50ZXJwcmV0TG9hZEZyb21Db25zdFB0cihDLCBURCkpCisgICAgICByZXR1cm4gRm9sZEJpdENhc3QoUmVzLCBMb2FkVHksIFREKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgdW5zaWduZWQgQnl0ZXNMb2FkZWQgPSAoSW50VHlwZS0+Z2V0Qml0V2lkdGgoKSArIDcpIC8gODsKKyAgaWYgKEJ5dGVzTG9hZGVkID4gMzIgfHwgQnl0ZXNMb2FkZWQgPT0gMCkgcmV0dXJuIDA7CisgIAorICBHbG9iYWxWYWx1ZSAqR1ZhbDsKKyAgaW50NjRfdCBPZmZzZXQ7CisgIGlmICghSXNDb25zdGFudE9mZnNldEZyb21HbG9iYWwoQywgR1ZhbCwgT2Zmc2V0LCBURCkpCisgICAgcmV0dXJuIDA7CisgIAorICBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oR1ZhbCk7CisgIGlmICghR1YgfHwgIUdWLT5pc0NvbnN0YW50KCkgfHwgIUdWLT5oYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIoKSB8fAorICAgICAgIUdWLT5nZXRJbml0aWFsaXplcigpLT5nZXRUeXBlKCktPmlzU2l6ZWQoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBJZiB3ZSdyZSBsb2FkaW5nIG9mZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnbG9iYWwsIHNvbWUgYnl0ZXMgbWF5IGJlIHZhbGlkLAorICAvLyBidXQgd2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSB0aGlzLgorICBpZiAoT2Zmc2V0IDwgMCkgcmV0dXJuIDA7CisgIAorICAvLyBJZiB3ZSdyZSBub3QgYWNjZXNzaW5nIGFueXRoaW5nIGluIHRoaXMgY29uc3RhbnQsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgorICBpZiAodWludDY0X3QoT2Zmc2V0KSA+PSBURC5nZXRUeXBlQWxsb2NTaXplKEdWLT5nZXRJbml0aWFsaXplcigpLT5nZXRUeXBlKCkpKQorICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoSW50VHlwZSk7CisgIAorICB1bnNpZ25lZCBjaGFyIFJhd0J5dGVzWzMyXSA9IHswfTsKKyAgaWYgKCFSZWFkRGF0YUZyb21HbG9iYWwoR1YtPmdldEluaXRpYWxpemVyKCksIE9mZnNldCwgUmF3Qnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzTG9hZGVkLCBURCkpCisgICAgcmV0dXJuIDA7CisKKyAgQVBJbnQgUmVzdWx0VmFsID0gQVBJbnQoSW50VHlwZS0+Z2V0Qml0V2lkdGgoKSwgUmF3Qnl0ZXNbQnl0ZXNMb2FkZWQtMV0pOworICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IEJ5dGVzTG9hZGVkOyArK2kpIHsKKyAgICBSZXN1bHRWYWwgPDw9IDg7CisgICAgUmVzdWx0VmFsIHw9IFJhd0J5dGVzW0J5dGVzTG9hZGVkLTEtaV07CisgIH0KKworICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChJbnRUeXBlLT5nZXRDb250ZXh0KCksIFJlc3VsdFZhbCk7Cit9CisKKy8vLyBDb25zdGFudEZvbGRMb2FkRnJvbUNvbnN0UHRyIC0gUmV0dXJuIHRoZSB2YWx1ZSB0aGF0IGEgbG9hZCBmcm9tIEMgd291bGQKKy8vLyBwcm9kdWNlIGlmIGl0IGlzIGNvbnN0YW50IGFuZCBkZXRlcm1pbmFibGUuICBJZiB0aGlzIGlzIG5vdCBkZXRlcm1pbmFibGUsCisvLy8gcmV0dXJuIG51bGwuCitDb25zdGFudCAqbGx2bTo6Q29uc3RhbnRGb2xkTG9hZEZyb21Db25zdFB0cihDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIC8vIEZpcnN0LCB0cnkgdGhlIGVhc3kgY2FzZXM6CisgIGlmIChHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oQykpCisgICAgaWYgKEdWLT5pc0NvbnN0YW50KCkgJiYgR1YtPmhhc0RlZmluaXRpdmVJbml0aWFsaXplcigpKQorICAgICAgcmV0dXJuIEdWLT5nZXRJbml0aWFsaXplcigpOworCisgIC8vIElmIHRoZSBsb2FkZWQgdmFsdWUgaXNuJ3QgYSBjb25zdGFudCBleHByLCB3ZSBjYW4ndCBoYW5kbGUgaXQuCisgIENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KEMpOworICBpZiAoIUNFKSByZXR1cm4gMDsKKyAgCisgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpIHsKKyAgICBpZiAoR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KENFLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgIGlmIChHVi0+aXNDb25zdGFudCgpICYmIEdWLT5oYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIoKSkKKyAgICAgICAgaWYgKENvbnN0YW50ICpWID0gCisgICAgICAgICAgICAgQ29uc3RhbnRGb2xkTG9hZFRocm91Z2hHRVBDb25zdGFudEV4cHIoR1YtPmdldEluaXRpYWxpemVyKCksIENFKSkKKyAgICAgICAgICByZXR1cm4gVjsKKyAgfQorICAKKyAgLy8gSW5zdGVhZCBvZiBsb2FkaW5nIGNvbnN0YW50IGMgc3RyaW5nLCB1c2UgY29ycmVzcG9uZGluZyBpbnRlZ2VyIHZhbHVlCisgIC8vIGRpcmVjdGx5IGlmIHN0cmluZyBsZW5ndGggaXMgc21hbGwgZW5vdWdoLgorICBzdGQ6OnN0cmluZyBTdHI7CisgIGlmIChURCAmJiBHZXRDb25zdGFudFN0cmluZ0luZm8oQ0UsIFN0cikgJiYgIVN0ci5lbXB0eSgpKSB7CisgICAgdW5zaWduZWQgU3RyTGVuID0gU3RyLmxlbmd0aCgpOworICAgIGNvbnN0IFR5cGUgKlR5ID0gY2FzdDxQb2ludGVyVHlwZT4oQ0UtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgdW5zaWduZWQgTnVtQml0cyA9IFR5LT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgICAgLy8gUmVwbGFjZSBsb2FkIHdpdGggaW1tZWRpYXRlIGludGVnZXIgaWYgdGhlIHJlc3VsdCBpcyBhbiBpbnRlZ2VyIG9yIGZwCisgICAgLy8gdmFsdWUuCisgICAgaWYgKChOdW1CaXRzID4+IDMpID09IFN0ckxlbiArIDEgJiYgKE51bUJpdHMgJiA3KSA9PSAwICYmCisgICAgICAgIChpc2E8SW50ZWdlclR5cGU+KFR5KSB8fCBUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSkpIHsKKyAgICAgIEFQSW50IFN0clZhbChOdW1CaXRzLCAwKTsKKyAgICAgIEFQSW50IFNpbmdsZUNoYXIoTnVtQml0cywgMCk7CisgICAgICBpZiAoVEQtPmlzTGl0dGxlRW5kaWFuKCkpIHsKKyAgICAgICAgZm9yIChzaWduZWQgaSA9IFN0ckxlbi0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgIFNpbmdsZUNoYXIgPSAodWludDY0X3QpIFN0cltpXSAmIFVDSEFSX01BWDsKKyAgICAgICAgICBTdHJWYWwgPSAoU3RyVmFsIDw8IDgpIHwgU2luZ2xlQ2hhcjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFN0ckxlbjsgaSsrKSB7CisgICAgICAgICAgU2luZ2xlQ2hhciA9ICh1aW50NjRfdCkgU3RyW2ldICYgVUNIQVJfTUFYOworICAgICAgICAgIFN0clZhbCA9IChTdHJWYWwgPDwgOCkgfCBTaW5nbGVDaGFyOworICAgICAgICB9CisgICAgICAgIC8vIEFwcGVuZCBOVUxMIGF0IHRoZSBlbmQuCisgICAgICAgIFNpbmdsZUNoYXIgPSAwOworICAgICAgICBTdHJWYWwgPSAoU3RyVmFsIDw8IDgpIHwgU2luZ2xlQ2hhcjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgQ29uc3RhbnQgKlJlcyA9IENvbnN0YW50SW50OjpnZXQoQ0UtPmdldENvbnRleHQoKSwgU3RyVmFsKTsKKyAgICAgIGlmIChUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSkKKyAgICAgICAgUmVzID0gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KFJlcywgVHkpOworICAgICAgcmV0dXJuIFJlczsKKyAgICB9CisgIH0KKyAgCisgIC8vIElmIHRoaXMgbG9hZCBjb21lcyBmcm9tIGFueXdoZXJlIGluIGEgY29uc3RhbnQgZ2xvYmFsLCBhbmQgaWYgdGhlIGdsb2JhbAorICAvLyBpcyBhbGwgdW5kZWYgb3IgemVybywgd2Uga25vdyB3aGF0IGl0IGxvYWRzLgorICBpZiAoR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KENFLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCkpKXsKKyAgICBpZiAoR1YtPmlzQ29uc3RhbnQoKSAmJiBHVi0+aGFzRGVmaW5pdGl2ZUluaXRpYWxpemVyKCkpIHsKKyAgICAgIGNvbnN0IFR5cGUgKlJlc1R5ID0gY2FzdDxQb2ludGVyVHlwZT4oQy0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgIGlmIChHVi0+Z2V0SW5pdGlhbGl6ZXIoKS0+aXNOdWxsVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoUmVzVHkpOworICAgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihHVi0+Z2V0SW5pdGlhbGl6ZXIoKSkpCisgICAgICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoUmVzVHkpOworICAgIH0KKyAgfQorICAKKyAgLy8gVHJ5IGhhcmQgdG8gZm9sZCBsb2FkcyBmcm9tIGJpdGNhc3RlZCBzdHJhbmdlIGFuZCBub24tdHlwZS1zYWZlIHRoaW5ncy4gIFdlCisgIC8vIGN1cnJlbnRseSBkb24ndCBkbyBhbnkgb2YgdGhpcyBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zLiAgSXQgY2FuIGJlCisgIC8vIGdlbmVyYWxpemVkIGluIHRoZSBmdXR1cmUgaWYgc29tZW9uZSBpcyBpbnRlcmVzdGVkLgorICBpZiAoVEQgJiYgVEQtPmlzTGl0dGxlRW5kaWFuKCkpCisgICAgcmV0dXJuIEZvbGRSZWludGVycHJldExvYWRGcm9tQ29uc3RQdHIoQ0UsICpURCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgQ29uc3RhbnQgKkNvbnN0YW50Rm9sZExvYWRJbnN0KGNvbnN0IExvYWRJbnN0ICpMSSwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpeworICBpZiAoTEktPmlzVm9sYXRpbGUoKSkgcmV0dXJuIDA7CisgIAorICBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEktPmdldE9wZXJhbmQoMCkpKQorICAgIHJldHVybiBDb25zdGFudEZvbGRMb2FkRnJvbUNvbnN0UHRyKEMsIFREKTsKKworICByZXR1cm4gMDsKK30KKworLy8vIFN5bWJvbGljYWxseUV2YWx1YXRlQmlub3AgLSBPbmUgb2YgT3AwL09wMSBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24uCisvLy8gQXR0ZW1wdCB0byBzeW1ib2xpY2FsbHkgZXZhbHVhdGUgdGhlIHJlc3VsdCBvZiBhIGJpbmFyeSBvcGVyYXRvciBtZXJnaW5nCisvLy8gdGhlc2UgdG9nZXRoZXIuICBJZiB0YXJnZXQgZGF0YSBpbmZvIGlzIGF2YWlsYWJsZSwgaXQgaXMgcHJvdmlkZWQgYXMgVEQsIAorLy8vIG90aGVyd2lzZSBURCBpcyBudWxsLgorc3RhdGljIENvbnN0YW50ICpTeW1ib2xpY2FsbHlFdmFsdWF0ZUJpbm9wKHVuc2lnbmVkIE9wYywgQ29uc3RhbnQgKk9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqT3AxLCBjb25zdCBUYXJnZXREYXRhICpURCl7CisgIC8vIFNST0EKKyAgCisgIC8vIEZvbGQgKGFuZCAweGZmZmZmZmZmMDAwMDAwMDAsIChzaGwgeCwgMzIpKSAtPiBzaGwuCisgIC8vIEZvbGQgKGxzaHIgKG9yIFgsIFkpLCAzMikgLT4gKGxzaHIgW1gvWV0sIDMyKSBpZiBvbmUgZG9lc24ndCBjb250cmlidXRlCisgIC8vIGJpdHMuCisgIAorICAKKyAgLy8gSWYgdGhlIGNvbnN0YW50IGV4cHIgaXMgc29tZXRoaW5nIGxpa2UgJkFbMTIzXSAtICZBWzRdLmYsIGZvbGQgdGhpcyBpbnRvIGEKKyAgLy8gY29uc3RhbnQuICBUaGlzIGhhcHBlbnMgZnJlcXVlbnRseSB3aGVuIGl0ZXJhdGluZyBvdmVyIGEgZ2xvYmFsIGFycmF5LgorICBpZiAoT3BjID09IEluc3RydWN0aW9uOjpTdWIgJiYgVEQpIHsKKyAgICBHbG9iYWxWYWx1ZSAqR1YxLCAqR1YyOworICAgIGludDY0X3QgT2ZmczEsIE9mZnMyOworICAgIAorICAgIGlmIChJc0NvbnN0YW50T2Zmc2V0RnJvbUdsb2JhbChPcDAsIEdWMSwgT2ZmczEsICpURCkpCisgICAgICBpZiAoSXNDb25zdGFudE9mZnNldEZyb21HbG9iYWwoT3AxLCBHVjIsIE9mZnMyLCAqVEQpICYmCisgICAgICAgICAgR1YxID09IEdWMikgeworICAgICAgICAvLyAoJkdWK0MxKSAtICgmR1YrQzIpIC0+IEMxLUMyLCBwb2ludGVyIGFyaXRobWV0aWMgY2Fubm90IG92ZXJmbG93LgorICAgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChPcDAtPmdldFR5cGUoKSwgT2ZmczEtT2ZmczIpOworICAgICAgfQorICB9CisgICAgCisgIHJldHVybiAwOworfQorCisvLy8gQ2FzdEdFUEluZGljZXMgLSBJZiBhcnJheSBpbmRpY2VzIGFyZSBub3QgcG9pbnRlci1zaXplZCBpbnRlZ2VycywKKy8vLyBleHBsaWNpdGx5IGNhc3QgdGhlbSBzbyB0aGF0IHRoZXkgYXJlbid0IGltcGxpY2l0bHkgY2FzdGVkIGJ5IHRoZQorLy8vIGdldGVsZW1lbnRwdHIuCitzdGF0aWMgQ29uc3RhbnQgKkNhc3RHRVBJbmRpY2VzKENvbnN0YW50ICpjb25zdCAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlJlc3VsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICBpZiAoIVREKSByZXR1cm4gMDsKKyAgY29uc3QgVHlwZSAqSW50UHRyVHkgPSBURC0+Z2V0SW50UHRyVHlwZShSZXN1bHRUeS0+Z2V0Q29udGV4dCgpKTsKKworICBib29sIEFueSA9IGZhbHNlOworICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDMyPiBOZXdJZHhzOworICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IE51bU9wczsgKytpKSB7CisgICAgaWYgKChpID09IDEgfHwKKyAgICAgICAgICFpc2E8U3RydWN0VHlwZT4oR2V0RWxlbWVudFB0ckluc3Q6OmdldEluZGV4ZWRUeXBlKE9wc1swXS0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxWYWx1ZSAqY29uc3QgKj4oT3BzKzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0xKSkpICYmCisgICAgICAgIE9wc1tpXS0+Z2V0VHlwZSgpICE9IEludFB0clR5KSB7CisgICAgICBBbnkgPSB0cnVlOworICAgICAgTmV3SWR4cy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRDYXN0KENhc3RJbnN0OjpnZXRDYXN0T3Bjb2RlKE9wc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFB0clR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wc1tpXSwgSW50UHRyVHkpKTsKKyAgICB9IGVsc2UKKyAgICAgIE5ld0lkeHMucHVzaF9iYWNrKE9wc1tpXSk7CisgIH0KKyAgaWYgKCFBbnkpIHJldHVybiAwOworCisgIENvbnN0YW50ICpDID0KKyAgICBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoT3BzWzBdLCAmTmV3SWR4c1swXSwgTmV3SWR4cy5zaXplKCkpOworICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oQykpCisgICAgaWYgKENvbnN0YW50ICpGb2xkZWQgPSBDb25zdGFudEZvbGRDb25zdGFudEV4cHJlc3Npb24oQ0UsIFREKSkKKyAgICAgIEMgPSBGb2xkZWQ7CisgIHJldHVybiBDOworfQorCisvLy8gU3ltYm9saWNhbGx5RXZhbHVhdGVHRVAgLSBJZiB3ZSBjYW4gc3ltYm9saWNhbGx5IGV2YWx1YXRlIHRoZSBzcGVjaWZpZWQgR0VQCisvLy8gY29uc3RhbnQgZXhwcmVzc2lvbiwgZG8gc28uCitzdGF0aWMgQ29uc3RhbnQgKlN5bWJvbGljYWxseUV2YWx1YXRlR0VQKENvbnN0YW50ICpjb25zdCAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlJlc3VsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICBDb25zdGFudCAqUHRyID0gT3BzWzBdOworICBpZiAoIVREIHx8ICFjYXN0PFBvaW50ZXJUeXBlPihQdHItPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCktPmlzU2l6ZWQoKSkKKyAgICByZXR1cm4gMDsKKworICB1bnNpZ25lZCBCaXRXaWR0aCA9CisgICAgVEQtPmdldFR5cGVTaXplSW5CaXRzKFRELT5nZXRJbnRQdHJUeXBlKFB0ci0+Z2V0Q29udGV4dCgpKSk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIGNvbnN0YW50IGV4cHIgZ2VwIHRoYXQgaXMgZWZmZWN0aXZlbHkgY29tcHV0aW5nIGFuCisgIC8vICJvZmZzZXRvZiIsIGZvbGQgaXQgaW50byAnY2FzdCBpbnQgU2l6ZSB0byBUKicgaW5zdGVhZCBvZiAnZ2VwIDAsIDAsIDEyJworICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IE51bU9wczsgKytpKQorICAgIGlmICghaXNhPENvbnN0YW50SW50PihPcHNbaV0pKQorICAgICAgcmV0dXJuIDA7CisgIAorICBBUEludCBPZmZzZXQgPSBBUEludChCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgVEQtPmdldEluZGV4ZWRPZmZzZXQoUHRyLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWYWx1ZSoqKU9wcysxLCBOdW1PcHMtMSkpOworICBQdHIgPSBjYXN0PENvbnN0YW50PihQdHItPnN0cmlwUG9pbnRlckNhc3RzKCkpOworCisgIC8vIElmIHRoaXMgaXMgYSBHRVAgb2YgYSBHRVAsIGZvbGQgaXQgYWxsIGludG8gYSBzaW5nbGUgR0VQLgorICB3aGlsZSAoR0VQT3BlcmF0b3IgKkdFUCA9IGR5bl9jYXN0PEdFUE9wZXJhdG9yPihQdHIpKSB7CisgICAgU21hbGxWZWN0b3I8VmFsdWUgKiwgND4gTmVzdGVkT3BzKEdFUC0+b3BfYmVnaW4oKSsxLCBHRVAtPm9wX2VuZCgpKTsKKworICAgIC8vIERvIG5vdCB0cnkgdGhlIGluY29ycG9yYXRlIHRoZSBzdWItR0VQIGlmIHNvbWUgaW5kZXggaXMgbm90IGEgbnVtYmVyLgorICAgIGJvb2wgQWxsQ29uc3RhbnRJbnQgPSB0cnVlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOZXN0ZWRPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICghaXNhPENvbnN0YW50SW50PihOZXN0ZWRPcHNbaV0pKSB7CisgICAgICAgIEFsbENvbnN0YW50SW50ID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGlmICghQWxsQ29uc3RhbnRJbnQpCisgICAgICBicmVhazsKKworICAgIFB0ciA9IGNhc3Q8Q29uc3RhbnQ+KEdFUC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgT2Zmc2V0ICs9IEFQSW50KEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBURC0+Z2V0SW5kZXhlZE9mZnNldChQdHItPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZhbHVlKiopTmVzdGVkT3BzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkT3BzLnNpemUoKSkpOworICAgIFB0ciA9IGNhc3Q8Q29uc3RhbnQ+KFB0ci0+c3RyaXBQb2ludGVyQ2FzdHMoKSk7CisgIH0KKworICAvLyBJZiB0aGUgYmFzZSB2YWx1ZSBmb3IgdGhpcyBhZGRyZXNzIGlzIGEgbGl0ZXJhbCBpbnRlZ2VyIHZhbHVlLCBmb2xkIHRoZQorICAvLyBnZXRlbGVtZW50cHRyIHRvIHRoZSByZXN1bHRpbmcgaW50ZWdlciB2YWx1ZSBjYXN0ZWQgdG8gdGhlIHBvaW50ZXIgdHlwZS4KKyAgQVBJbnQgQmFzZVB0cihCaXRXaWR0aCwgMCk7CisgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihQdHIpKQorICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkludFRvUHRyKQorICAgICAgaWYgKENvbnN0YW50SW50ICpCYXNlID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENFLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgICBCYXNlUHRyID0gQmFzZS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgQmFzZVB0ci56ZXh0T3JUcnVuYyhCaXRXaWR0aCk7CisgICAgICB9CisgIGlmIChQdHItPmlzTnVsbFZhbHVlKCkgfHwgQmFzZVB0ciAhPSAwKSB7CisgICAgQ29uc3RhbnQgKkMgPSBDb25zdGFudEludDo6Z2V0KFB0ci0+Z2V0Q29udGV4dCgpLCBPZmZzZXQrQmFzZVB0cik7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoQywgUmVzdWx0VHkpOworICB9CisKKyAgLy8gT3RoZXJ3aXNlIGZvcm0gYSByZWd1bGFyIGdldGVsZW1lbnRwdHIuIFJlY29tcHV0ZSB0aGUgaW5kaWNlcyBzbyB0aGF0CisgIC8vIHdlIGVsaW1pbmF0ZSBvdmVyLWluZGV4aW5nIG9mIHRoZSBub3Rpb25hbCBzdGF0aWMgdHlwZSBhcnJheSBib3VuZHMuCisgIC8vIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBkZXRlcm1pbmUgaWYgdGhlIGdldGVsZW1lbnRwdHIgaXMgImluYm91bmRzIi4KKyAgLy8gQWxzbywgdGhpcyBoZWxwcyBHbG9iYWxPcHQgZG8gU1JPQSBvbiBHbG9iYWxWYXJpYWJsZXMuCisgIGNvbnN0IFR5cGUgKlR5ID0gUHRyLT5nZXRUeXBlKCk7CisgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgMzI+IE5ld0lkeHM7CisgIGRvIHsKKyAgICBpZiAoY29uc3QgU2VxdWVudGlhbFR5cGUgKkFUeSA9IGR5bl9jYXN0PFNlcXVlbnRpYWxUeXBlPihUeSkpIHsKKyAgICAgIGlmIChBVHktPmlzUG9pbnRlclR5KCkpIHsKKyAgICAgICAgLy8gVGhlIG9ubHkgcG9pbnRlciBpbmRleGluZyB3ZSdsbCBkbyBpcyBvbiB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIEdFUC4KKyAgICAgICAgaWYgKCFOZXdJZHhzLmVtcHR5KCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgCisgICAgICAgIC8vIE9ubHkgaGFuZGxlIHBvaW50ZXJzIHRvIHNpemVkIHR5cGVzLCBub3QgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLgorICAgICAgICBpZiAoIUFUeS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNTaXplZCgpKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgICAKKyAgICAgIC8vIERldGVybWluZSB3aGljaCBlbGVtZW50IG9mIHRoZSBhcnJheSB0aGUgb2Zmc2V0IHBvaW50cyBpbnRvLgorICAgICAgQVBJbnQgRWxlbVNpemUoQml0V2lkdGgsIFRELT5nZXRUeXBlQWxsb2NTaXplKEFUeS0+Z2V0RWxlbWVudFR5cGUoKSkpOworICAgICAgaWYgKEVsZW1TaXplID09IDApCisgICAgICAgIHJldHVybiAwOworICAgICAgQVBJbnQgTmV3SWR4ID0gT2Zmc2V0LnVkaXYoRWxlbVNpemUpOworICAgICAgT2Zmc2V0IC09IE5ld0lkeCAqIEVsZW1TaXplOworICAgICAgTmV3SWR4cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChURC0+Z2V0SW50UHRyVHlwZShUeS0+Z2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3SWR4KSk7CisgICAgICBUeSA9IEFUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkgeworICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGZpZWxkIG9mIHRoZSBzdHJ1Y3QgdGhlIG9mZnNldCBwb2ludHMgaW50by4gVGhlCisgICAgICAvLyBnZXRaRXh0VmFsdWUgaXMgYXQgbGVhc3QgYXMgc2FmZSBhcyB0aGUgU3RydWN0TGF5b3V0IEFQSSBiZWNhdXNlIHdlCisgICAgICAvLyBrbm93IHRoZSBvZmZzZXQgaXMgd2l0aGluIHRoZSBzdHJ1Y3QgYXQgdGhpcyBwb2ludC4KKyAgICAgIGNvbnN0IFN0cnVjdExheW91dCAmU0wgPSAqVEQtPmdldFN0cnVjdExheW91dChTVHkpOworICAgICAgdW5zaWduZWQgRWxJZHggPSBTTC5nZXRFbGVtZW50Q29udGFpbmluZ09mZnNldChPZmZzZXQuZ2V0WkV4dFZhbHVlKCkpOworICAgICAgTmV3SWR4cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFR5LT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbElkeCkpOworICAgICAgT2Zmc2V0IC09IEFQSW50KEJpdFdpZHRoLCBTTC5nZXRFbGVtZW50T2Zmc2V0KEVsSWR4KSk7CisgICAgICBUeSA9IFNUeS0+Z2V0VHlwZUF0SW5kZXgoRWxJZHgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSd2ZSByZWFjaGVkIHNvbWUgbm9uLWluZGV4YWJsZSB0eXBlLgorICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlIChUeSAhPSBjYXN0PFBvaW50ZXJUeXBlPihSZXN1bHRUeSktPmdldEVsZW1lbnRUeXBlKCkpOworCisgIC8vIElmIHdlIGhhdmVuJ3QgdXNlZCB1cCB0aGUgZW50aXJlIG9mZnNldCBieSBkZXNjZW5kaW5nIHRoZSBzdGF0aWMKKyAgLy8gdHlwZSwgdGhlbiB0aGUgb2Zmc2V0IGlzIHBvaW50aW5nIGludG8gdGhlIG1pZGRsZSBvZiBhbiBpbmRpdmlzaWJsZQorICAvLyBtZW1iZXIsIHNvIHdlIGNhbid0IHNpbXBsaWZ5IGl0LgorICBpZiAoT2Zmc2V0ICE9IDApCisgICAgcmV0dXJuIDA7CisKKyAgLy8gQ3JlYXRlIGEgR0VQLgorICBDb25zdGFudCAqQyA9CisgICAgQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKFB0ciwgJk5ld0lkeHNbMF0sIE5ld0lkeHMuc2l6ZSgpKTsKKyAgYXNzZXJ0KGNhc3Q8UG9pbnRlclR5cGU+KEMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkgPT0gVHkgJiYKKyAgICAgICAgICJDb21wdXRlZCBHZXRFbGVtZW50UHRyIGhhcyB1bmV4cGVjdGVkIHR5cGUhIik7CisKKyAgLy8gSWYgd2UgZW5kZWQgdXAgaW5kZXhpbmcgYSBtZW1iZXIgd2l0aCBhIHR5cGUgdGhhdCBkb2Vzbid0IG1hdGNoCisgIC8vIHRoZSB0eXBlIG9mIHdoYXQgdGhlIG9yaWdpbmFsIGluZGljZXMgaW5kZXhlZCwgYWRkIGEgY2FzdC4KKyAgaWYgKFR5ICE9IGNhc3Q8UG9pbnRlclR5cGU+KFJlc3VsdFR5KS0+Z2V0RWxlbWVudFR5cGUoKSkKKyAgICBDID0gRm9sZEJpdENhc3QoQywgUmVzdWx0VHksICpURCk7CisKKyAgcmV0dXJuIEM7Cit9CisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29uc3RhbnQgRm9sZGluZyBwdWJsaWMgQVBJcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLy8gQ29uc3RhbnRGb2xkSW5zdHJ1Y3Rpb24gLSBBdHRlbXB0IHRvIGNvbnN0YW50IGZvbGQgdGhlIHNwZWNpZmllZAorLy8vIGluc3RydWN0aW9uLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGNvbnN0YW50IHJlc3VsdCBpcyByZXR1cm5lZCwgaWYgbm90LCBudWxsCisvLy8gaXMgcmV0dXJuZWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBmYWlsIHdoZW4gYXR0ZW1wdGluZyB0byBmb2xkCisvLy8gaW5zdHJ1Y3Rpb25zIGxpa2UgbG9hZHMgYW5kIHN0b3Jlcywgd2hpY2ggaGF2ZSBubyBjb25zdGFudCBleHByZXNzaW9uIGZvcm0uCisvLy8KK0NvbnN0YW50ICpsbHZtOjpDb25zdGFudEZvbGRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpIHsKKyAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSSkpIHsKKyAgICBpZiAoUE4tPmdldE51bUluY29taW5nVmFsdWVzKCkgPT0gMCkKKyAgICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoUE4tPmdldFR5cGUoKSk7CisKKyAgICBDb25zdGFudCAqUmVzdWx0ID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFBOLT5nZXRJbmNvbWluZ1ZhbHVlKDApKTsKKyAgICBpZiAoUmVzdWx0ID09IDApIHJldHVybiAwOworCisgICAgLy8gSGFuZGxlIFBISSBub2RlcyBzcGVjaWFsbHkgaGVyZS4uLgorICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoUE4tPmdldEluY29taW5nVmFsdWUoaSkgIT0gUmVzdWx0ICYmIFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpICE9IFBOKQorICAgICAgICByZXR1cm4gMDsgICAvLyBOb3QgYWxsIHRoZSBzYW1lIGluY29taW5nIGNvbnN0YW50cy4uLgorCisgICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgYWxsIGluY29taW5nIHZhbHVlcyBhcmUgdGhlIHNhbWUgY29uc3RhbnQuCisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vIFNjYW4gdGhlIG9wZXJhbmQgbGlzdCwgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXkgYXJlIGFsbCBjb25zdGFudHMsIGlmIHNvLAorICAvLyBoYW5kIG9mZiB0byBDb25zdGFudEZvbGRJbnN0T3BlcmFuZHMuCisgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgOD4gT3BzOworICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIGkgPSBJLT5vcF9iZWdpbigpLCBlID0gSS0+b3BfZW5kKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChDb25zdGFudCAqT3AgPSBkeW5fY2FzdDxDb25zdGFudD4oKmkpKQorICAgICAgT3BzLnB1c2hfYmFjayhPcCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7ICAvLyBBbGwgb3BlcmFuZHMgbm90IGNvbnN0YW50IQorCisgIGlmIChjb25zdCBDbXBJbnN0ICpDSSA9IGR5bl9jYXN0PENtcEluc3Q+KEkpKQorICAgIHJldHVybiBDb25zdGFudEZvbGRDb21wYXJlSW5zdE9wZXJhbmRzKENJLT5nZXRQcmVkaWNhdGUoKSwgT3BzWzBdLCBPcHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEQpOworICAKKyAgaWYgKGNvbnN0IExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihJKSkKKyAgICByZXR1cm4gQ29uc3RhbnRGb2xkTG9hZEluc3QoTEksIFREKTsKKyAgCisgIHJldHVybiBDb25zdGFudEZvbGRJbnN0T3BlcmFuZHMoSS0+Z2V0T3Bjb2RlKCksIEktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMuZGF0YSgpLCBPcHMuc2l6ZSgpLCBURCk7Cit9CisKKy8vLyBDb25zdGFudEZvbGRDb25zdGFudEV4cHJlc3Npb24gLSBBdHRlbXB0IHRvIGZvbGQgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24KKy8vLyB1c2luZyB0aGUgc3BlY2lmaWVkIFRhcmdldERhdGEuICBJZiBzdWNjZXNzZnVsLCB0aGUgY29uc3RhbnQgcmVzdWx0IGlzCisvLy8gcmVzdWx0IGlzIHJldHVybmVkLCBpZiBub3QsIG51bGwgaXMgcmV0dXJuZWQuCitDb25zdGFudCAqbGx2bTo6Q29uc3RhbnRGb2xkQ29uc3RhbnRFeHByZXNzaW9uKGNvbnN0IENvbnN0YW50RXhwciAqQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgOD4gT3BzOworICBmb3IgKFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yIGkgPSBDRS0+b3BfYmVnaW4oKSwgZSA9IENFLT5vcF9lbmQoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDb25zdGFudCAqTmV3QyA9IGNhc3Q8Q29uc3RhbnQ+KCppKTsKKyAgICAvLyBSZWN1cnNpdmVseSBmb2xkIHRoZSBDb25zdGFudEV4cHIncyBvcGVyYW5kcy4KKyAgICBpZiAoQ29uc3RhbnRFeHByICpOZXdDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oTmV3QykpCisgICAgICBOZXdDID0gQ29uc3RhbnRGb2xkQ29uc3RhbnRFeHByZXNzaW9uKE5ld0NFLCBURCk7CisgICAgT3BzLnB1c2hfYmFjayhOZXdDKTsKKyAgfQorCisgIGlmIChDRS0+aXNDb21wYXJlKCkpCisgICAgcmV0dXJuIENvbnN0YW50Rm9sZENvbXBhcmVJbnN0T3BlcmFuZHMoQ0UtPmdldFByZWRpY2F0ZSgpLCBPcHNbMF0sIE9wc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURCk7CisgIHJldHVybiBDb25zdGFudEZvbGRJbnN0T3BlcmFuZHMoQ0UtPmdldE9wY29kZSgpLCBDRS0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wcy5kYXRhKCksIE9wcy5zaXplKCksIFREKTsKK30KKworLy8vIENvbnN0YW50Rm9sZEluc3RPcGVyYW5kcyAtIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhbiBpbnN0cnVjdGlvbiB3aXRoIHRoZQorLy8vIHNwZWNpZmllZCBvcGNvZGUgYW5kIG9wZXJhbmRzLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGNvbnN0YW50IHJlc3VsdCBpcworLy8vIHJldHVybmVkLCBpZiBub3QsIG51bGwgaXMgcmV0dXJuZWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gZmFpbCB3aGVuCisvLy8gYXR0ZW1wdGluZyB0byBmb2xkIGluc3RydWN0aW9ucyBsaWtlIGxvYWRzIGFuZCBzdG9yZXMsIHdoaWNoIGhhdmUgbm8KKy8vLyBjb25zdGFudCBleHByZXNzaW9uIGZvcm0uCisvLy8KKy8vLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIG5laXRoZXIgdXRpbGl6ZXMgbm9yIHByZXNlcnZlcyBuc3cvbnV3L2luYm91bmRzL2V0YworLy8vIGluZm9ybWF0aW9uLCBkdWUgdG8gb25seSBiZWluZyBwYXNzZWQgYW4gb3Bjb2RlIGFuZCBvcGVyYW5kcy4gQ29uc3RhbnQKKy8vLyBmb2xkaW5nIHVzaW5nIHRoaXMgZnVuY3Rpb24gc3RyaXBzIHRoaXMgaW5mb3JtYXRpb24uCisvLy8KK0NvbnN0YW50ICpsbHZtOjpDb25zdGFudEZvbGRJbnN0T3BlcmFuZHModW5zaWduZWQgT3Bjb2RlLCBjb25zdCBUeXBlICpEZXN0VHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCogY29uc3QqIE9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICAvLyBIYW5kbGUgZWFzeSBiaW5vcHMgZmlyc3QuCisgIGlmIChJbnN0cnVjdGlvbjo6aXNCaW5hcnlPcChPcGNvZGUpKSB7CisgICAgaWYgKGlzYTxDb25zdGFudEV4cHI+KE9wc1swXSkgfHwgaXNhPENvbnN0YW50RXhwcj4oT3BzWzFdKSkKKyAgICAgIGlmIChDb25zdGFudCAqQyA9IFN5bWJvbGljYWxseUV2YWx1YXRlQmlub3AoT3Bjb2RlLCBPcHNbMF0sIE9wc1sxXSwgVEQpKQorICAgICAgICByZXR1cm4gQzsKKyAgICAKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXQoT3Bjb2RlLCBPcHNbMF0sIE9wc1sxXSk7CisgIH0KKyAgCisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGRlZmF1bHQ6IHJldHVybiAwOworICBjYXNlIEluc3RydWN0aW9uOjpJQ21wOgorICBjYXNlIEluc3RydWN0aW9uOjpGQ21wOiBhc3NlcnQoMCAmJiAiSW52YWxpZCBmb3IgY29tcGFyZXMiKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Q2FsbDoKKyAgICBpZiAoRnVuY3Rpb24gKkYgPSBkeW5fY2FzdDxGdW5jdGlvbj4oT3BzW051bU9wcyAtIDFdKSkKKyAgICAgIGlmIChjYW5Db25zdGFudEZvbGRDYWxsVG8oRikpCisgICAgICAgIHJldHVybiBDb25zdGFudEZvbGRDYWxsKEYsIE9wcywgTnVtT3BzIC0gMSk7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OgorICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIGludHRvcHRyLCBlbGltaW5hdGUgdGhlIHBhaXIuICBUaGlzIHJlcXVpcmVzIGtub3dpbmcKKyAgICAvLyB0aGUgd2lkdGggb2YgYSBwb2ludGVyLCBzbyBpdCBjYW4ndCBiZSBkb25lIGluIENvbnN0YW50RXhwcjo6Z2V0Q2FzdC4KKyAgICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oT3BzWzBdKSkgeworICAgICAgaWYgKFREICYmIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW50VG9QdHIpIHsKKyAgICAgICAgQ29uc3RhbnQgKklucHV0ID0gQ0UtPmdldE9wZXJhbmQoMCk7CisgICAgICAgIHVuc2lnbmVkIEluV2lkdGggPSBJbnB1dC0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICAgIGlmIChURC0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKSA8IEluV2lkdGgpIHsKKyAgICAgICAgICBDb25zdGFudCAqTWFzayA9IAorICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChDRS0+Z2V0Q29udGV4dCgpLCBBUEludDo6Z2V0TG93Qml0c1NldChJbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURC0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKSkpOworICAgICAgICAgIElucHV0ID0gQ29uc3RhbnRFeHByOjpnZXRBbmQoSW5wdXQsIE1hc2spOworICAgICAgICB9CisgICAgICAgIC8vIERvIGEgemV4dCBvciB0cnVuYyB0byBnZXQgdG8gdGhlIGRlc3Qgc2l6ZS4KKyAgICAgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW50ZWdlckNhc3QoSW5wdXQsIERlc3RUeSwgZmFsc2UpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRDYXN0KE9wY29kZSwgT3BzWzBdLCBEZXN0VHkpOworICBjYXNlIEluc3RydWN0aW9uOjpJbnRUb1B0cjoKKyAgICAvLyBJZiB0aGUgaW5wdXQgaXMgYSBwdHJ0b2ludCwgdHVybiB0aGUgcGFpciBpbnRvIGEgcHRyIHRvIHB0ciBiaXRjYXN0IGlmCisgICAgLy8gdGhlIGludCBzaXplIGlzID49IHRoZSBwdHIgc2l6ZS4gIFRoaXMgcmVxdWlyZXMga25vd2luZyB0aGUgd2lkdGggb2YgYQorICAgIC8vIHBvaW50ZXIsIHNvIGl0IGNhbid0IGJlIGRvbmUgaW4gQ29uc3RhbnRFeHByOjpnZXRDYXN0LgorICAgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihPcHNbMF0pKQorICAgICAgaWYgKFREICYmCisgICAgICAgICAgVEQtPmdldFBvaW50ZXJTaXplSW5CaXRzKCkgPD0gQ0UtPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpICYmCisgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpQdHJUb0ludCkKKyAgICAgICAgcmV0dXJuIEZvbGRCaXRDYXN0KENFLT5nZXRPcGVyYW5kKDApLCBEZXN0VHksICpURCk7CisKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRDYXN0KE9wY29kZSwgT3BzWzBdLCBEZXN0VHkpOworICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICBjYXNlIEluc3RydWN0aW9uOjpGUFRvVUk6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSToKKyAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldENhc3QoT3Bjb2RlLCBPcHNbMF0sIERlc3RUeSk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6CisgICAgaWYgKFREKQorICAgICAgcmV0dXJuIEZvbGRCaXRDYXN0KE9wc1swXSwgRGVzdFR5LCAqVEQpOworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoT3BzWzBdLCBEZXN0VHkpOworICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0U2VsZWN0KE9wc1swXSwgT3BzWzFdLCBPcHNbMl0pOworICBjYXNlIEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudDoKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0RWxlbWVudChPcHNbMF0sIE9wc1sxXSk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246Okluc2VydEVsZW1lbnQ6CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0RWxlbWVudChPcHNbMF0sIE9wc1sxXSwgT3BzWzJdKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2h1ZmZsZVZlY3RvcjoKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRTaHVmZmxlVmVjdG9yKE9wc1swXSwgT3BzWzFdLCBPcHNbMl0pOworICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOgorICAgIGlmIChDb25zdGFudCAqQyA9IENhc3RHRVBJbmRpY2VzKE9wcywgTnVtT3BzLCBEZXN0VHksIFREKSkKKyAgICAgIHJldHVybiBDOworICAgIGlmIChDb25zdGFudCAqQyA9IFN5bWJvbGljYWxseUV2YWx1YXRlR0VQKE9wcywgTnVtT3BzLCBEZXN0VHksIFREKSkKKyAgICAgIHJldHVybiBDOworICAgIAorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoT3BzWzBdLCBPcHMrMSwgTnVtT3BzLTEpOworICB9Cit9CisKKy8vLyBDb25zdGFudEZvbGRDb21wYXJlSW5zdE9wZXJhbmRzIC0gQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGEgY29tcGFyZQorLy8vIGluc3RydWN0aW9uIChpY21wL2ZjbXApIHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYW5kcy4gIElmIGl0IGZhaWxzLCBpdAorLy8vIHJldHVybnMgYSBjb25zdGFudCBleHByZXNzaW9uIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmFuZHMuCisvLy8KK0NvbnN0YW50ICpsbHZtOjpDb25zdGFudEZvbGRDb21wYXJlSW5zdE9wZXJhbmRzKHVuc2lnbmVkIFByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpPcHMwLCBDb25zdGFudCAqT3BzMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICAvLyBmb2xkOiBpY21wIChpbnR0b3B0ciB4KSwgbnVsbCAgICAgICAgIC0+IGljbXAgeCwgMAorICAvLyBmb2xkOiBpY21wIChwdHJ0b2ludCB4KSwgMCAgICAgICAgICAgIC0+IGljbXAgeCwgbnVsbAorICAvLyBmb2xkOiBpY21wIChpbnR0b3B0ciB4KSwgKGludHRvcHRyIHkpIC0+IGljbXAgdHJ1bmMvemV4dCB4LCB0cnVuYy96ZXh0IHkKKyAgLy8gZm9sZDogaWNtcCAocHRydG9pbnQgeCksIChwdHJ0b2ludCB5KSAtPiBpY21wIHgsIHkKKyAgLy8KKyAgLy8gQ29uc3RhbnRFeHByOjpnZXRDb21wYXJlIGNhbm5vdCBkbyB0aGlzLCBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBURAorICAvLyBhcm91bmQgdG8ga25vdyBpZiBiaXQgdHJ1bmNhdGlvbiBpcyBoYXBwZW5pbmcuCisgIGlmIChDb25zdGFudEV4cHIgKkNFMCA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oT3BzMCkpIHsKKyAgICBpZiAoVEQgJiYgT3BzMS0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgY29uc3QgVHlwZSAqSW50UHRyVHkgPSBURC0+Z2V0SW50UHRyVHlwZShDRTAtPmdldENvbnRleHQoKSk7CisgICAgICBpZiAoQ0UwLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW50VG9QdHIpIHsKKyAgICAgICAgLy8gQ29udmVydCB0aGUgaW50ZWdlciB2YWx1ZSB0byB0aGUgcmlnaHQgc2l6ZSB0byBlbnN1cmUgd2UgZ2V0IHRoZQorICAgICAgICAvLyBwcm9wZXIgZXh0ZW5zaW9uIG9yIHRydW5jYXRpb24uCisgICAgICAgIENvbnN0YW50ICpDID0gQ29uc3RhbnRFeHByOjpnZXRJbnRlZ2VyQ2FzdChDRTAtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRQdHJUeSwgZmFsc2UpOworICAgICAgICBDb25zdGFudCAqTnVsbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoQy0+Z2V0VHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZENvbXBhcmVJbnN0T3BlcmFuZHMoUHJlZGljYXRlLCBDLCBOdWxsLCBURCk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIE9ubHkgZG8gdGhpcyB0cmFuc2Zvcm1hdGlvbiBpZiB0aGUgaW50IGlzIGludHB0cnR5IGluIHNpemUsIG90aGVyd2lzZQorICAgICAgLy8gdGhlcmUgaXMgYSB0cnVuY2F0aW9uIG9yIGV4dGVuc2lvbiB0aGF0IHdlIGFyZW4ndCBtb2RlbGluZy4KKyAgICAgIGlmIChDRTAtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpQdHJUb0ludCAmJiAKKyAgICAgICAgICBDRTAtPmdldFR5cGUoKSA9PSBJbnRQdHJUeSkgeworICAgICAgICBDb25zdGFudCAqQyA9IENFMC0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgQ29uc3RhbnQgKk51bGwgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEMtPmdldFR5cGUoKSk7CisgICAgICAgIHJldHVybiBDb25zdGFudEZvbGRDb21wYXJlSW5zdE9wZXJhbmRzKFByZWRpY2F0ZSwgQywgTnVsbCwgVEQpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoQ29uc3RhbnRFeHByICpDRTEgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KE9wczEpKSB7CisgICAgICBpZiAoVEQgJiYgQ0UwLT5nZXRPcGNvZGUoKSA9PSBDRTEtPmdldE9wY29kZSgpKSB7CisgICAgICAgIGNvbnN0IFR5cGUgKkludFB0clR5ID0gVEQtPmdldEludFB0clR5cGUoQ0UwLT5nZXRDb250ZXh0KCkpOworCisgICAgICAgIGlmIChDRTAtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJbnRUb1B0cikgeworICAgICAgICAgIC8vIENvbnZlcnQgdGhlIGludGVnZXIgdmFsdWUgdG8gdGhlIHJpZ2h0IHNpemUgdG8gZW5zdXJlIHdlIGdldCB0aGUKKyAgICAgICAgICAvLyBwcm9wZXIgZXh0ZW5zaW9uIG9yIHRydW5jYXRpb24uCisgICAgICAgICAgQ29uc3RhbnQgKkMwID0gQ29uc3RhbnRFeHByOjpnZXRJbnRlZ2VyQ2FzdChDRTAtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRQdHJUeSwgZmFsc2UpOworICAgICAgICAgIENvbnN0YW50ICpDMSA9IENvbnN0YW50RXhwcjo6Z2V0SW50ZWdlckNhc3QoQ0UxLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50UHRyVHksIGZhbHNlKTsKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkQ29tcGFyZUluc3RPcGVyYW5kcyhQcmVkaWNhdGUsIEMwLCBDMSwgVEQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT25seSBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uIGlmIHRoZSBpbnQgaXMgaW50cHRydHkgaW4gc2l6ZSwgb3RoZXJ3aXNlCisgICAgICAgIC8vIHRoZXJlIGlzIGEgdHJ1bmNhdGlvbiBvciBleHRlbnNpb24gdGhhdCB3ZSBhcmVuJ3QgbW9kZWxpbmcuCisgICAgICAgIGlmICgoQ0UwLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQgJiYKKyAgICAgICAgICAgICBDRTAtPmdldFR5cGUoKSA9PSBJbnRQdHJUeSAmJgorICAgICAgICAgICAgIENFMC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IENFMS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKSkKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkQ29tcGFyZUluc3RPcGVyYW5kcyhQcmVkaWNhdGUsIENFMC0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRTEtPmdldE9wZXJhbmQoMCksIFREKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gaWNtcCBlcSAob3IgeCwgeSksIDAgLT4gKGljbXAgZXEgeCwgMCkgJiAoaWNtcCBlcSB5LCAwKQorICAgIC8vIGljbXAgbmUgKG9yIHgsIHkpLCAwIC0+IChpY21wIG5lIHgsIDApIHwgKGljbXAgbmUgeSwgMCkKKyAgICBpZiAoKFByZWRpY2F0ZSA9PSBJQ21wSW5zdDo6SUNNUF9FUSB8fCBQcmVkaWNhdGUgPT0gSUNtcEluc3Q6OklDTVBfTkUpICYmCisgICAgICAgIENFMC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Ok9yICYmIE9wczEtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgIENvbnN0YW50ICpMSFMgPSAKKyAgICAgICAgQ29uc3RhbnRGb2xkQ29tcGFyZUluc3RPcGVyYW5kcyhQcmVkaWNhdGUsIENFMC0+Z2V0T3BlcmFuZCgwKSwgT3BzMSxURCk7CisgICAgICBDb25zdGFudCAqUkhTID0gCisgICAgICAgIENvbnN0YW50Rm9sZENvbXBhcmVJbnN0T3BlcmFuZHMoUHJlZGljYXRlLCBDRTAtPmdldE9wZXJhbmQoMSksIE9wczEsVEQpOworICAgICAgdW5zaWduZWQgT3BDID0gCisgICAgICAgIFByZWRpY2F0ZSA9PSBJQ21wSW5zdDo6SUNNUF9FUSA/IEluc3RydWN0aW9uOjpBbmQgOiBJbnN0cnVjdGlvbjo6T3I7CisgICAgICBDb25zdGFudCAqT3BzW10gPSB7IExIUywgUkhTIH07CisgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkSW5zdE9wZXJhbmRzKE9wQywgTEhTLT5nZXRUeXBlKCksIE9wcywgMiwgVEQpOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Q29tcGFyZShQcmVkaWNhdGUsIE9wczAsIE9wczEpOworfQorCisKKy8vLyBDb25zdGFudEZvbGRMb2FkVGhyb3VnaEdFUENvbnN0YW50RXhwciAtIEdpdmVuIGEgY29uc3RhbnQgYW5kIGEKKy8vLyBnZXRlbGVtZW50cHRyIGNvbnN0YW50ZXhwciwgcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZSBiZWluZyBhZGRyZXNzZWQgYnkgdGhlCisvLy8gY29uc3RhbnQgZXhwcmVzc2lvbiwgb3IgbnVsbCBpZiBzb21ldGhpbmcgaXMgZnVubnkgYW5kIHdlIGNhbid0IGRlY2lkZS4KK0NvbnN0YW50ICpsbHZtOjpDb25zdGFudEZvbGRMb2FkVGhyb3VnaEdFUENvbnN0YW50RXhwcihDb25zdGFudCAqQywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByICpDRSkgeworICBpZiAoQ0UtPmdldE9wZXJhbmQoMSkgIT0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShDRS0+Z2V0T3BlcmFuZCgxKS0+Z2V0VHlwZSgpKSkKKyAgICByZXR1cm4gMDsgIC8vIERvIG5vdCBhbGxvdyBzdGVwcGluZyBvdmVyIHRoZSB2YWx1ZSEKKyAgCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIG9wZXJhbmRzLCB0cmFja2luZyBkb3duIHdoaWNoIHZhbHVlIHdlIGFyZQorICAvLyBhZGRyZXNzaW5nLi4uCisgIGdlcF90eXBlX2l0ZXJhdG9yIEkgPSBnZXBfdHlwZV9iZWdpbihDRSksIEUgPSBnZXBfdHlwZV9lbmQoQ0UpOworICBmb3IgKCsrSTsgSSAhPSBFOyArK0kpCisgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KCpJKSkgeworICAgICAgQ29uc3RhbnRJbnQgKkNVID0gY2FzdDxDb25zdGFudEludD4oSS5nZXRPcGVyYW5kKCkpOworICAgICAgYXNzZXJ0KENVLT5nZXRaRXh0VmFsdWUoKSA8IFNUeS0+Z2V0TnVtRWxlbWVudHMoKSAmJgorICAgICAgICAgICAgICJTdHJ1Y3QgaW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgICAgdW5zaWduZWQgRWwgPSAodW5zaWduZWQpQ1UtPmdldFpFeHRWYWx1ZSgpOworICAgICAgaWYgKENvbnN0YW50U3RydWN0ICpDUyA9IGR5bl9jYXN0PENvbnN0YW50U3RydWN0PihDKSkgeworICAgICAgICBDID0gQ1MtPmdldE9wZXJhbmQoRWwpOworICAgICAgfSBlbHNlIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihDKSkgeworICAgICAgICBDID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShTVHktPmdldEVsZW1lbnRUeXBlKEVsKSk7CisgICAgICB9IGVsc2UgaWYgKGlzYTxVbmRlZlZhbHVlPihDKSkgeworICAgICAgICBDID0gVW5kZWZWYWx1ZTo6Z2V0KFNUeS0+Z2V0RWxlbWVudFR5cGUoRWwpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEkuZ2V0T3BlcmFuZCgpKSkgeworICAgICAgaWYgKGNvbnN0IEFycmF5VHlwZSAqQVR5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPigqSSkpIHsKKyAgICAgICAgaWYgKENJLT5nZXRaRXh0VmFsdWUoKSA+PSBBVHktPmdldE51bUVsZW1lbnRzKCkpCisgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKENvbnN0YW50QXJyYXkgKkNBID0gZHluX2Nhc3Q8Q29uc3RhbnRBcnJheT4oQykpCisgICAgICAgICAgQyA9IENBLT5nZXRPcGVyYW5kKENJLT5nZXRaRXh0VmFsdWUoKSk7CisgICAgICAgIGVsc2UgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEMpKQorICAgICAgICAgIEMgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEFUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICAgIGVsc2UgaWYgKGlzYTxVbmRlZlZhbHVlPihDKSkKKyAgICAgICAgICBDID0gVW5kZWZWYWx1ZTo6Z2V0KEFUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0gZWxzZSBpZiAoY29uc3QgVmVjdG9yVHlwZSAqVlR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oKkkpKSB7CisgICAgICAgIGlmIChDSS0+Z2V0WkV4dFZhbHVlKCkgPj0gVlR5LT5nZXROdW1FbGVtZW50cygpKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoQ29uc3RhbnRWZWN0b3IgKkNQID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KEMpKQorICAgICAgICAgIEMgPSBDUC0+Z2V0T3BlcmFuZChDSS0+Z2V0WkV4dFZhbHVlKCkpOworICAgICAgICBlbHNlIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihDKSkKKyAgICAgICAgICBDID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShWVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgICBlbHNlIGlmIChpc2E8VW5kZWZWYWx1ZT4oQykpCisgICAgICAgICAgQyA9IFVuZGVmVmFsdWU6OmdldChWVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gQzsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIENvbnN0YW50IEZvbGRpbmcgZm9yIENhbGxzCisvLworCisvLy8gY2FuQ29uc3RhbnRGb2xkQ2FsbFRvIC0gUmV0dXJuIHRydWUgaWYgaXRzIGV2ZW4gcG9zc2libGUgdG8gZm9sZCBhIGNhbGwgdG8KKy8vLyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLgorYm9vbAorbGx2bTo6Y2FuQ29uc3RhbnRGb2xkQ2FsbFRvKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIHN3aXRjaCAoRi0+Z2V0SW50cmluc2ljSUQoKSkgeworICBjYXNlIEludHJpbnNpYzo6c3FydDoKKyAgY2FzZSBJbnRyaW5zaWM6OnBvd2k6CisgIGNhc2UgSW50cmluc2ljOjpic3dhcDoKKyAgY2FzZSBJbnRyaW5zaWM6OmN0cG9wOgorICBjYXNlIEludHJpbnNpYzo6Y3RsejoKKyAgY2FzZSBJbnRyaW5zaWM6OmN0dHo6CisgIGNhc2UgSW50cmluc2ljOjp1YWRkX3dpdGhfb3ZlcmZsb3c6CisgIGNhc2UgSW50cmluc2ljOjp1c3ViX3dpdGhfb3ZlcmZsb3c6CisgIGNhc2UgSW50cmluc2ljOjpzYWRkX3dpdGhfb3ZlcmZsb3c6CisgIGNhc2UgSW50cmluc2ljOjpzc3ViX3dpdGhfb3ZlcmZsb3c6CisgIGNhc2UgSW50cmluc2ljOjpjb252ZXJ0X2Zyb21fZnAxNjoKKyAgY2FzZSBJbnRyaW5zaWM6OmNvbnZlcnRfdG9fZnAxNjoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgMDogYnJlYWs7CisgIH0KKworICBpZiAoIUYtPmhhc05hbWUoKSkgcmV0dXJuIGZhbHNlOworICBTdHJpbmdSZWYgTmFtZSA9IEYtPmdldE5hbWUoKTsKKyAgCisgIC8vIEluIHRoZXNlIGNhc2VzLCB0aGUgY2hlY2sgb2YgdGhlIGxlbmd0aCBpcyByZXF1aXJlZC4gIFdlIGRvbid0IHdhbnQgdG8KKyAgLy8gcmV0dXJuIHRydWUgZm9yIGEgbmFtZSBsaWtlICJjb3NcMGJsYWgiIHdoaWNoIHN0cmNtcCB3b3VsZCByZXR1cm4gZXF1YWwgdG8KKyAgLy8gImNvcyIsIGJ1dCBoYXMgbGVuZ3RoIDguCisgIHN3aXRjaCAoTmFtZVswXSkgeworICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgIGNhc2UgJ2EnOgorICAgIHJldHVybiBOYW1lID09ICJhY29zIiB8fCBOYW1lID09ICJhc2luIiB8fCAKKyAgICAgIE5hbWUgPT0gImF0YW4iIHx8IE5hbWUgPT0gImF0YW4yIjsKKyAgY2FzZSAnYyc6CisgICAgcmV0dXJuIE5hbWUgPT0gImNvcyIgfHwgTmFtZSA9PSAiY2VpbCIgfHwgTmFtZSA9PSAiY29zZiIgfHwgTmFtZSA9PSAiY29zaCI7CisgIGNhc2UgJ2UnOgorICAgIHJldHVybiBOYW1lID09ICJleHAiOworICBjYXNlICdmJzoKKyAgICByZXR1cm4gTmFtZSA9PSAiZmFicyIgfHwgTmFtZSA9PSAiZm1vZCIgfHwgTmFtZSA9PSAiZmxvb3IiOworICBjYXNlICdsJzoKKyAgICByZXR1cm4gTmFtZSA9PSAibG9nIiB8fCBOYW1lID09ICJsb2cxMCI7CisgIGNhc2UgJ3AnOgorICAgIHJldHVybiBOYW1lID09ICJwb3ciOworICBjYXNlICdzJzoKKyAgICByZXR1cm4gTmFtZSA9PSAic2luIiB8fCBOYW1lID09ICJzaW5oIiB8fCBOYW1lID09ICJzcXJ0IiB8fAorICAgICAgTmFtZSA9PSAic2luZiIgfHwgTmFtZSA9PSAic3FydGYiOworICBjYXNlICd0JzoKKyAgICByZXR1cm4gTmFtZSA9PSAidGFuIiB8fCBOYW1lID09ICJ0YW5oIjsKKyAgfQorfQorCitzdGF0aWMgQ29uc3RhbnQgKkNvbnN0YW50Rm9sZEZQKGRvdWJsZSAoKk5hdGl2ZUZQKShkb3VibGUpLCBkb3VibGUgViwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIGVycm5vID0gMDsKKyAgViA9IE5hdGl2ZUZQKFYpOworICBpZiAoZXJybm8gIT0gMCkgeworICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaWYgKFR5LT5pc0Zsb2F0VHkoKSkKKyAgICByZXR1cm4gQ29uc3RhbnRGUDo6Z2V0KFR5LT5nZXRDb250ZXh0KCksIEFQRmxvYXQoKGZsb2F0KVYpKTsKKyAgaWYgKFR5LT5pc0RvdWJsZVR5KCkpCisgICAgcmV0dXJuIENvbnN0YW50RlA6OmdldChUeS0+Z2V0Q29udGV4dCgpLCBBUEZsb2F0KFYpKTsKKyAgbGx2bV91bnJlYWNoYWJsZSgiQ2FuIG9ubHkgY29uc3RhbnQgZm9sZCBmbG9hdC9kb3VibGUiKTsKKyAgcmV0dXJuIDA7IC8vIGR1bW15IHJldHVybiB0byBzdXBwcmVzcyB3YXJuaW5nCit9CisKK3N0YXRpYyBDb25zdGFudCAqQ29uc3RhbnRGb2xkQmluYXJ5RlAoZG91YmxlICgqTmF0aXZlRlApKGRvdWJsZSwgZG91YmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIFYsIGRvdWJsZSBXLCBjb25zdCBUeXBlICpUeSkgeworICBlcnJubyA9IDA7CisgIFYgPSBOYXRpdmVGUChWLCBXKTsKKyAgaWYgKGVycm5vICE9IDApIHsKKyAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGlmIChUeS0+aXNGbG9hdFR5KCkpCisgICAgcmV0dXJuIENvbnN0YW50RlA6OmdldChUeS0+Z2V0Q29udGV4dCgpLCBBUEZsb2F0KChmbG9hdClWKSk7CisgIGlmIChUeS0+aXNEb3VibGVUeSgpKQorICAgIHJldHVybiBDb25zdGFudEZQOjpnZXQoVHktPmdldENvbnRleHQoKSwgQVBGbG9hdChWKSk7CisgIGxsdm1fdW5yZWFjaGFibGUoIkNhbiBvbmx5IGNvbnN0YW50IGZvbGQgZmxvYXQvZG91YmxlIik7CisgIHJldHVybiAwOyAvLyBkdW1teSByZXR1cm4gdG8gc3VwcHJlc3Mgd2FybmluZworfQorCisvLy8gQ29uc3RhbnRGb2xkQ2FsbCAtIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhIGNhbGwgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbgorLy8vIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMsIHJldHVybmluZyBudWxsIGlmIHVuc3VjY2Vzc2Z1bC4KK0NvbnN0YW50ICoKK2xsdm06OkNvbnN0YW50Rm9sZENhbGwoRnVuY3Rpb24gKkYsIAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqY29uc3QgKk9wZXJhbmRzLCB1bnNpZ25lZCBOdW1PcGVyYW5kcykgeworICBpZiAoIUYtPmhhc05hbWUoKSkgcmV0dXJuIDA7CisgIFN0cmluZ1JlZiBOYW1lID0gRi0+Z2V0TmFtZSgpOworCisgIGNvbnN0IFR5cGUgKlR5ID0gRi0+Z2V0UmV0dXJuVHlwZSgpOworICBpZiAoTnVtT3BlcmFuZHMgPT0gMSkgeworICAgIGlmIChDb25zdGFudEZQICpPcCA9IGR5bl9jYXN0PENvbnN0YW50RlA+KE9wZXJhbmRzWzBdKSkgeworICAgICAgaWYgKE5hbWUgPT0gImxsdm0uY29udmVydC50by5mcDE2IikgeworICAgICAgICBBUEZsb2F0IFZhbChPcC0+Z2V0VmFsdWVBUEYoKSk7CisKKyAgICAgICAgYm9vbCBsb3N0ID0gZmFsc2U7CisgICAgICAgIFZhbC5jb252ZXJ0KEFQRmxvYXQ6OklFRUVoYWxmLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuLCAmbG9zdCk7CisKKyAgICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoRi0+Z2V0Q29udGV4dCgpLCBWYWwuYml0Y2FzdFRvQVBJbnQoKSk7CisgICAgICB9CisKKyAgICAgIGlmICghVHktPmlzRmxvYXRUeSgpICYmICFUeS0+aXNEb3VibGVUeSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIC8vLyBDdXJyZW50bHkgQVBGbG9hdCB2ZXJzaW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgZG8gbm90IGV4aXN0LCBzbyB3ZSB1c2UKKyAgICAgIC8vLyB0aGUgaG9zdCBuYXRpdmUgZG91YmxlIHZlcnNpb25zLiAgRmxvYXQgdmVyc2lvbnMgYXJlIG5vdCBjYWxsZWQKKyAgICAgIC8vLyBkaXJlY3RseSBidXQgZm9yIGFsbCB0aGVzZSBpdCBpcyB0cnVlIChmbG9hdCkoZigoZG91YmxlKWFyZykpID09CisgICAgICAvLy8gZihhcmcpLiAgTG9uZyBkb3VibGUgbm90IHN1cHBvcnRlZCB5ZXQuCisgICAgICBkb3VibGUgViA9IFR5LT5pc0Zsb2F0VHkoKSA/IChkb3VibGUpT3AtPmdldFZhbHVlQVBGKCkuY29udmVydFRvRmxvYXQoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AtPmdldFZhbHVlQVBGKCkuY29udmVydFRvRG91YmxlKCk7CisgICAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICAgIGNhc2UgJ2EnOgorICAgICAgICBpZiAoTmFtZSA9PSAiYWNvcyIpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEZQKGFjb3MsIFYsIFR5KTsKKyAgICAgICAgZWxzZSBpZiAoTmFtZSA9PSAiYXNpbiIpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEZQKGFzaW4sIFYsIFR5KTsKKyAgICAgICAgZWxzZSBpZiAoTmFtZSA9PSAiYXRhbiIpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEZQKGF0YW4sIFYsIFR5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjJzoKKyAgICAgICAgaWYgKE5hbWUgPT0gImNlaWwiKQorICAgICAgICAgIHJldHVybiBDb25zdGFudEZvbGRGUChjZWlsLCBWLCBUeSk7CisgICAgICAgIGVsc2UgaWYgKE5hbWUgPT0gImNvcyIpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEZQKGNvcywgViwgVHkpOworICAgICAgICBlbHNlIGlmIChOYW1lID09ICJjb3NoIikKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkRlAoY29zaCwgViwgVHkpOworICAgICAgICBlbHNlIGlmIChOYW1lID09ICJjb3NmIikKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkRlAoY29zLCBWLCBUeSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnZSc6CisgICAgICAgIGlmIChOYW1lID09ICJleHAiKQorICAgICAgICAgIHJldHVybiBDb25zdGFudEZvbGRGUChleHAsIFYsIFR5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdmJzoKKyAgICAgICAgaWYgKE5hbWUgPT0gImZhYnMiKQorICAgICAgICAgIHJldHVybiBDb25zdGFudEZvbGRGUChmYWJzLCBWLCBUeSk7CisgICAgICAgIGVsc2UgaWYgKE5hbWUgPT0gImZsb29yIikKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkRlAoZmxvb3IsIFYsIFR5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdsJzoKKyAgICAgICAgaWYgKE5hbWUgPT0gImxvZyIgJiYgViA+IDApCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEZQKGxvZywgViwgVHkpOworICAgICAgICBlbHNlIGlmIChOYW1lID09ICJsb2cxMCIgJiYgViA+IDApCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEZQKGxvZzEwLCBWLCBUeSk7CisgICAgICAgIGVsc2UgaWYgKE5hbWUgPT0gImxsdm0uc3FydC5mMzIiIHx8CisgICAgICAgICAgICAgICAgIE5hbWUgPT0gImxsdm0uc3FydC5mNjQiKSB7CisgICAgICAgICAgaWYgKFYgPj0gLTAuMCkKKyAgICAgICAgICAgIHJldHVybiBDb25zdGFudEZvbGRGUChzcXJ0LCBWLCBUeSk7CisgICAgICAgICAgZWxzZSAvLyBVbmRlZmluZWQKKyAgICAgICAgICAgIHJldHVybiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3MnOgorICAgICAgICBpZiAoTmFtZSA9PSAic2luIikKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkRlAoc2luLCBWLCBUeSk7CisgICAgICAgIGVsc2UgaWYgKE5hbWUgPT0gInNpbmgiKQorICAgICAgICAgIHJldHVybiBDb25zdGFudEZvbGRGUChzaW5oLCBWLCBUeSk7CisgICAgICAgIGVsc2UgaWYgKE5hbWUgPT0gInNxcnQiICYmIFYgPj0gMCkKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkRlAoc3FydCwgViwgVHkpOworICAgICAgICBlbHNlIGlmIChOYW1lID09ICJzcXJ0ZiIgJiYgViA+PSAwKQorICAgICAgICAgIHJldHVybiBDb25zdGFudEZvbGRGUChzcXJ0LCBWLCBUeSk7CisgICAgICAgIGVsc2UgaWYgKE5hbWUgPT0gInNpbmYiKQorICAgICAgICAgIHJldHVybiBDb25zdGFudEZvbGRGUChzaW4sIFYsIFR5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd0JzoKKyAgICAgICAgaWYgKE5hbWUgPT0gInRhbiIpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEZQKHRhbiwgViwgVHkpOworICAgICAgICBlbHNlIGlmIChOYW1lID09ICJ0YW5oIikKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkRlAodGFuaCwgViwgVHkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIAorICAgIGlmIChDb25zdGFudEludCAqT3AgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3BlcmFuZHNbMF0pKSB7CisgICAgICBpZiAoTmFtZS5zdGFydHN3aXRoKCJsbHZtLmJzd2FwIikpCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KEYtPmdldENvbnRleHQoKSwgT3AtPmdldFZhbHVlKCkuYnl0ZVN3YXAoKSk7CisgICAgICBlbHNlIGlmIChOYW1lLnN0YXJ0c3dpdGgoImxsdm0uY3Rwb3AiKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoVHksIE9wLT5nZXRWYWx1ZSgpLmNvdW50UG9wdWxhdGlvbigpKTsKKyAgICAgIGVsc2UgaWYgKE5hbWUuc3RhcnRzd2l0aCgibGx2bS5jdHR6IikpCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFR5LCBPcC0+Z2V0VmFsdWUoKS5jb3VudFRyYWlsaW5nWmVyb3MoKSk7CisgICAgICBlbHNlIGlmIChOYW1lLnN0YXJ0c3dpdGgoImxsdm0uY3RseiIpKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChUeSwgT3AtPmdldFZhbHVlKCkuY291bnRMZWFkaW5nWmVyb3MoKSk7CisgICAgICBlbHNlIGlmIChOYW1lID09ICJsbHZtLmNvbnZlcnQuZnJvbS5mcDE2IikgeworICAgICAgICBBUEZsb2F0IFZhbChPcC0+Z2V0VmFsdWUoKSk7CisKKyAgICAgICAgYm9vbCBsb3N0ID0gZmFsc2U7CisgICAgICAgIEFQRmxvYXQ6Om9wU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgVmFsLmNvbnZlcnQoQVBGbG9hdDo6SUVFRXNpbmdsZSwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbiwgJmxvc3QpOworCisgICAgICAgIC8vIENvbnZlcnNpb24gaXMgYWx3YXlzIHByZWNpc2UuCisgICAgICAgIHN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgYXNzZXJ0KHN0YXR1cyA9PSBBUEZsb2F0OjpvcE9LICYmICFsb3N0ICYmCisgICAgICAgICAgICAgICAiUHJlY2lzaW9uIGxvc3QgZHVyaW5nIGZwMTYgY29uc3Rmb2xkaW5nIik7CisKKyAgICAgICAgcmV0dXJuIENvbnN0YW50RlA6OmdldChGLT5nZXRDb250ZXh0KCksIFZhbCk7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihPcGVyYW5kc1swXSkpIHsKKyAgICAgIGlmIChOYW1lLnN0YXJ0c3dpdGgoImxsdm0uYnN3YXAiKSkKKyAgICAgICAgcmV0dXJuIE9wZXJhbmRzWzBdOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGlmIChOdW1PcGVyYW5kcyA9PSAyKSB7CisgICAgaWYgKENvbnN0YW50RlAgKk9wMSA9IGR5bl9jYXN0PENvbnN0YW50RlA+KE9wZXJhbmRzWzBdKSkgeworICAgICAgaWYgKCFUeS0+aXNGbG9hdFR5KCkgJiYgIVR5LT5pc0RvdWJsZVR5KCkpCisgICAgICAgIHJldHVybiAwOworICAgICAgZG91YmxlIE9wMVYgPSBUeS0+aXNGbG9hdFR5KCkgPyAKKyAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKU9wMS0+Z2V0VmFsdWVBUEYoKS5jb252ZXJ0VG9GbG9hdCgpIDoKKyAgICAgICAgICAgICAgICAgICAgICBPcDEtPmdldFZhbHVlQVBGKCkuY29udmVydFRvRG91YmxlKCk7CisgICAgICBpZiAoQ29uc3RhbnRGUCAqT3AyID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oT3BlcmFuZHNbMV0pKSB7CisgICAgICAgIGlmIChPcDItPmdldFR5cGUoKSAhPSBPcDEtPmdldFR5cGUoKSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisgICAgICAgIGRvdWJsZSBPcDJWID0gVHktPmlzRmxvYXRUeSgpID8gCisgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlPcDItPmdldFZhbHVlQVBGKCkuY29udmVydFRvRmxvYXQoKToKKyAgICAgICAgICAgICAgICAgICAgICBPcDItPmdldFZhbHVlQVBGKCkuY29udmVydFRvRG91YmxlKCk7CisKKyAgICAgICAgaWYgKE5hbWUgPT0gInBvdyIpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEJpbmFyeUZQKHBvdywgT3AxViwgT3AyViwgVHkpOworICAgICAgICBpZiAoTmFtZSA9PSAiZm1vZCIpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEJpbmFyeUZQKGZtb2QsIE9wMVYsIE9wMlYsIFR5KTsKKyAgICAgICAgaWYgKE5hbWUgPT0gImF0YW4yIikKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkQmluYXJ5RlAoYXRhbjIsIE9wMVYsIE9wMlYsIFR5KTsKKyAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRJbnQgKk9wMkMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3BlcmFuZHNbMV0pKSB7CisgICAgICAgIGlmIChOYW1lID09ICJsbHZtLnBvd2kuZjMyIikKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGUDo6Z2V0KEYtPmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQRmxvYXQoKGZsb2F0KXN0ZDo6cG93KChmbG9hdClPcDFWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpT3AyQy0+Z2V0WkV4dFZhbHVlKCkpKSk7CisgICAgICAgIGlmIChOYW1lID09ICJsbHZtLnBvd2kuZjY0IikKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRGUDo6Z2V0KEYtPmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQRmxvYXQoKGRvdWJsZSlzdGQ6OnBvdygoZG91YmxlKU9wMVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KU9wMkMtPmdldFpFeHRWYWx1ZSgpKSkpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIAorICAgIGlmIChDb25zdGFudEludCAqT3AxID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wZXJhbmRzWzBdKSkgeworICAgICAgaWYgKENvbnN0YW50SW50ICpPcDIgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3BlcmFuZHNbMV0pKSB7CisgICAgICAgIHN3aXRjaCAoRi0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSBJbnRyaW5zaWM6OnVhZGRfd2l0aF9vdmVyZmxvdzogeworICAgICAgICAgIENvbnN0YW50ICpSZXMgPSBDb25zdGFudEV4cHI6OmdldEFkZChPcDEsIE9wMik7ICAgICAgICAgICAvLyByZXN1bHQuCisgICAgICAgICAgQ29uc3RhbnQgKk9wc1tdID0geworICAgICAgICAgICAgUmVzLCBDb25zdGFudEV4cHI6OmdldElDbXAoQ21wSW5zdDo6SUNNUF9VTFQsIFJlcywgT3AxKSAvLyBvdmVyZmxvdy4KKyAgICAgICAgICB9OworICAgICAgICAgIHJldHVybiBDb25zdGFudFN0cnVjdDo6Z2V0KEYtPmdldENvbnRleHQoKSwgT3BzLCAyLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBJbnRyaW5zaWM6OnVzdWJfd2l0aF9vdmVyZmxvdzogeworICAgICAgICAgIENvbnN0YW50ICpSZXMgPSBDb25zdGFudEV4cHI6OmdldFN1YihPcDEsIE9wMik7ICAgICAgICAgICAvLyByZXN1bHQuCisgICAgICAgICAgQ29uc3RhbnQgKk9wc1tdID0geworICAgICAgICAgICAgUmVzLCBDb25zdGFudEV4cHI6OmdldElDbXAoQ21wSW5zdDo6SUNNUF9VR1QsIFJlcywgT3AxKSAvLyBvdmVyZmxvdy4KKyAgICAgICAgICB9OworICAgICAgICAgIHJldHVybiBDb25zdGFudFN0cnVjdDo6Z2V0KEYtPmdldENvbnRleHQoKSwgT3BzLCAyLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBJbnRyaW5zaWM6OnNhZGRfd2l0aF9vdmVyZmxvdzogeworICAgICAgICAgIENvbnN0YW50ICpSZXMgPSBDb25zdGFudEV4cHI6OmdldEFkZChPcDEsIE9wMik7ICAgICAgICAgICAvLyByZXN1bHQuCisgICAgICAgICAgQ29uc3RhbnQgKk92ZXJmbG93ID0gQ29uc3RhbnRFeHByOjpnZXRTZWxlY3QoCisgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0SUNtcChDbXBJbnN0OjpJQ01QX1NHVCwKKyAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KE9wMS0+Z2V0VHlwZSgpLCAwKSwgT3AxKSwKKyAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRJQ21wKENtcEluc3Q6OklDTVBfU0dULCBSZXMsIE9wMiksIAorICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldElDbXAoQ21wSW5zdDo6SUNNUF9TTFQsIFJlcywgT3AyKSk7IC8vIG92ZXJmbG93LgorCisgICAgICAgICAgQ29uc3RhbnQgKk9wc1tdID0geyBSZXMsIE92ZXJmbG93IH07CisgICAgICAgICAgcmV0dXJuIENvbnN0YW50U3RydWN0OjpnZXQoRi0+Z2V0Q29udGV4dCgpLCBPcHMsIDIsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEludHJpbnNpYzo6c3N1Yl93aXRoX292ZXJmbG93OiB7CisgICAgICAgICAgQ29uc3RhbnQgKlJlcyA9IENvbnN0YW50RXhwcjo6Z2V0U3ViKE9wMSwgT3AyKTsgICAgICAgICAgIC8vIHJlc3VsdC4KKyAgICAgICAgICBDb25zdGFudCAqT3ZlcmZsb3cgPSBDb25zdGFudEV4cHI6OmdldFNlbGVjdCgKKyAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRJQ21wKENtcEluc3Q6OklDTVBfU0dULAorICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoT3AyLT5nZXRUeXBlKCksIDApLCBPcDIpLAorICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldElDbXAoQ21wSW5zdDo6SUNNUF9TTFQsIFJlcywgT3AxKSwgCisgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0SUNtcChDbXBJbnN0OjpJQ01QX1NHVCwgUmVzLCBPcDEpKTsgLy8gb3ZlcmZsb3cuCisKKyAgICAgICAgICBDb25zdGFudCAqT3BzW10gPSB7IFJlcywgT3ZlcmZsb3cgfTsKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChGLT5nZXRDb250ZXh0KCksIE9wcywgMiwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvRGVidWdJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9EZWJ1Z0luZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjBkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvRGVidWdJbmZvLmNwcApAQCAtMCwwICsxLDE0MzcgQEAKKy8vPT09LS0tIERlYnVnSW5mby5jcHAgLSBEZWJ1ZyBJbmZvcm1hdGlvbiBIZWxwZXIgQ2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGhlbHBlciBjbGFzc2VzIHVzZWQgdG8gYnVpbGQgYW5kIGludGVycHJldCBkZWJ1ZworLy8gaW5mb3JtYXRpb24gaW4gTExWTSBJUiBmb3JtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RlYnVnSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9WYWx1ZVRyYWNraW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBuYW1lc3BhY2UgbGx2bTo6ZHdhcmY7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBESURlc2NyaXB0b3IKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0RJRGVzY3JpcHRvcjo6RElEZXNjcmlwdG9yKGNvbnN0IERJRmlsZSBGKSA6IERiZ05vZGUoRi5EYmdOb2RlKSB7Cit9CisKK0RJRGVzY3JpcHRvcjo6RElEZXNjcmlwdG9yKGNvbnN0IERJU3VicHJvZ3JhbSBGKSA6IERiZ05vZGUoRi5EYmdOb2RlKSB7Cit9CisKK0RJRGVzY3JpcHRvcjo6RElEZXNjcmlwdG9yKGNvbnN0IERJTGV4aWNhbEJsb2NrIEYpIDogRGJnTm9kZShGLkRiZ05vZGUpIHsKK30KKworRElEZXNjcmlwdG9yOjpESURlc2NyaXB0b3IoY29uc3QgRElWYXJpYWJsZSBGKSA6IERiZ05vZGUoRi5EYmdOb2RlKSB7Cit9CisKK0RJRGVzY3JpcHRvcjo6RElEZXNjcmlwdG9yKGNvbnN0IERJVHlwZSBGKSA6IERiZ05vZGUoRi5EYmdOb2RlKSB7Cit9CisKK1N0cmluZ1JlZgorRElEZXNjcmlwdG9yOjpnZXRTdHJpbmdGaWVsZCh1bnNpZ25lZCBFbHQpIGNvbnN0IHsKKyAgaWYgKERiZ05vZGUgPT0gMCkKKyAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisKKyAgaWYgKEVsdCA8IERiZ05vZGUtPmdldE51bU9wZXJhbmRzKCkpCisgICAgaWYgKE1EU3RyaW5nICpNRFMgPSBkeW5fY2FzdF9vcl9udWxsPE1EU3RyaW5nPihEYmdOb2RlLT5nZXRPcGVyYW5kKEVsdCkpKQorICAgICAgcmV0dXJuIE1EUy0+Z2V0U3RyaW5nKCk7CisKKyAgcmV0dXJuIFN0cmluZ1JlZigpOworfQorCit1aW50NjRfdCBESURlc2NyaXB0b3I6OmdldFVJbnQ2NEZpZWxkKHVuc2lnbmVkIEVsdCkgY29uc3QgeworICBpZiAoRGJnTm9kZSA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChFbHQgPCBEYmdOb2RlLT5nZXROdW1PcGVyYW5kcygpKQorICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oRGJnTm9kZS0+Z2V0T3BlcmFuZChFbHQpKSkKKyAgICAgIHJldHVybiBDSS0+Z2V0WkV4dFZhbHVlKCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK0RJRGVzY3JpcHRvciBESURlc2NyaXB0b3I6OmdldERlc2NyaXB0b3JGaWVsZCh1bnNpZ25lZCBFbHQpIGNvbnN0IHsKKyAgaWYgKERiZ05vZGUgPT0gMCkKKyAgICByZXR1cm4gRElEZXNjcmlwdG9yKCk7CisKKyAgaWYgKEVsdCA8IERiZ05vZGUtPmdldE51bU9wZXJhbmRzKCkpCisgICAgcmV0dXJuCisgICAgICBESURlc2NyaXB0b3IoZHluX2Nhc3Rfb3JfbnVsbDxjb25zdCBNRE5vZGU+KERiZ05vZGUtPmdldE9wZXJhbmQoRWx0KSkpOworICByZXR1cm4gRElEZXNjcmlwdG9yKCk7Cit9CisKK0dsb2JhbFZhcmlhYmxlICpESURlc2NyaXB0b3I6OmdldEdsb2JhbFZhcmlhYmxlRmllbGQodW5zaWduZWQgRWx0KSBjb25zdCB7CisgIGlmIChEYmdOb2RlID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKEVsdCA8IERiZ05vZGUtPmdldE51bU9wZXJhbmRzKCkpCisgICAgICByZXR1cm4gZHluX2Nhc3Rfb3JfbnVsbDxHbG9iYWxWYXJpYWJsZT4oRGJnTm9kZS0+Z2V0T3BlcmFuZChFbHQpKTsKKyAgcmV0dXJuIDA7Cit9CisKK0NvbnN0YW50ICpESURlc2NyaXB0b3I6OmdldENvbnN0YW50RmllbGQodW5zaWduZWQgRWx0KSBjb25zdCB7CisgIGlmIChEYmdOb2RlID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKEVsdCA8IERiZ05vZGUtPmdldE51bU9wZXJhbmRzKCkpCisgICAgICByZXR1cm4gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudD4oRGJnTm9kZS0+Z2V0T3BlcmFuZChFbHQpKTsKKyAgcmV0dXJuIDA7Cit9CisKK0Z1bmN0aW9uICpESURlc2NyaXB0b3I6OmdldEZ1bmN0aW9uRmllbGQodW5zaWduZWQgRWx0KSBjb25zdCB7CisgIGlmIChEYmdOb2RlID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKEVsdCA8IERiZ05vZGUtPmdldE51bU9wZXJhbmRzKCkpCisgICAgICByZXR1cm4gZHluX2Nhc3Rfb3JfbnVsbDxGdW5jdGlvbj4oRGJnTm9kZS0+Z2V0T3BlcmFuZChFbHQpKTsKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIERJVmFyaWFibGU6OmdldE51bUFkZHJFbGVtZW50cygpIGNvbnN0IHsKKyAgcmV0dXJuIERiZ05vZGUtPmdldE51bU9wZXJhbmRzKCktNjsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHJlZGljYXRlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGlzQmFzaWNUeXBlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0YWcgaXMgbGVnYWwgZm9yCisvLy8gRElCYXNpY1R5cGUuCitib29sIERJRGVzY3JpcHRvcjo6aXNCYXNpY1R5cGUoKSBjb25zdCB7CisgIHJldHVybiBEYmdOb2RlICYmIGdldFRhZygpID09IGR3YXJmOjpEV19UQUdfYmFzZV90eXBlOworfQorCisvLy8gaXNEZXJpdmVkVHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdGFnIGlzIGxlZ2FsIGZvciBESURlcml2ZWRUeXBlLgorYm9vbCBESURlc2NyaXB0b3I6OmlzRGVyaXZlZFR5cGUoKSBjb25zdCB7CisgIGlmICghRGJnTm9kZSkgcmV0dXJuIGZhbHNlOworICBzd2l0Y2ggKGdldFRhZygpKSB7CisgIGNhc2UgZHdhcmY6OkRXX1RBR190eXBlZGVmOgorICBjYXNlIGR3YXJmOjpEV19UQUdfcG9pbnRlcl90eXBlOgorICBjYXNlIGR3YXJmOjpEV19UQUdfcmVmZXJlbmNlX3R5cGU6CisgIGNhc2UgZHdhcmY6OkRXX1RBR19jb25zdF90eXBlOgorICBjYXNlIGR3YXJmOjpEV19UQUdfdm9sYXRpbGVfdHlwZToKKyAgY2FzZSBkd2FyZjo6RFdfVEFHX3Jlc3RyaWN0X3R5cGU6CisgIGNhc2UgZHdhcmY6OkRXX1RBR19tZW1iZXI6CisgIGNhc2UgZHdhcmY6OkRXX1RBR19pbmhlcml0YW5jZToKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmYXVsdDoKKyAgICAvLyBDb21wb3NpdGVUeXBlcyBhcmUgY3VycmVudGx5IG1vZGVsbGVkIGFzIERlcml2ZWRUeXBlcy4KKyAgICByZXR1cm4gaXNDb21wb3NpdGVUeXBlKCk7CisgIH0KK30KKworLy8vIGlzQ29tcG9zaXRlVHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdGFnIGlzIGxlZ2FsIGZvcgorLy8vIERJQ29tcG9zaXRlVHlwZS4KK2Jvb2wgRElEZXNjcmlwdG9yOjppc0NvbXBvc2l0ZVR5cGUoKSBjb25zdCB7CisgIGlmICghRGJnTm9kZSkgcmV0dXJuIGZhbHNlOworICBzd2l0Y2ggKGdldFRhZygpKSB7CisgIGNhc2UgZHdhcmY6OkRXX1RBR19hcnJheV90eXBlOgorICBjYXNlIGR3YXJmOjpEV19UQUdfc3RydWN0dXJlX3R5cGU6CisgIGNhc2UgZHdhcmY6OkRXX1RBR191bmlvbl90eXBlOgorICBjYXNlIGR3YXJmOjpEV19UQUdfZW51bWVyYXRpb25fdHlwZToKKyAgY2FzZSBkd2FyZjo6RFdfVEFHX3ZlY3Rvcl90eXBlOgorICBjYXNlIGR3YXJmOjpEV19UQUdfc3Vicm91dGluZV90eXBlOgorICBjYXNlIGR3YXJmOjpEV19UQUdfY2xhc3NfdHlwZToKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8vIGlzVmFyaWFibGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHRhZyBpcyBsZWdhbCBmb3IgRElWYXJpYWJsZS4KK2Jvb2wgRElEZXNjcmlwdG9yOjppc1ZhcmlhYmxlKCkgY29uc3QgeworICBpZiAoIURiZ05vZGUpIHJldHVybiBmYWxzZTsKKyAgc3dpdGNoIChnZXRUYWcoKSkgeworICBjYXNlIGR3YXJmOjpEV19UQUdfYXV0b192YXJpYWJsZToKKyAgY2FzZSBkd2FyZjo6RFdfVEFHX2FyZ192YXJpYWJsZToKKyAgY2FzZSBkd2FyZjo6RFdfVEFHX3JldHVybl92YXJpYWJsZToKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8vIGlzVHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdGFnIGlzIGxlZ2FsIGZvciBESVR5cGUuCitib29sIERJRGVzY3JpcHRvcjo6aXNUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNCYXNpY1R5cGUoKSB8fCBpc0NvbXBvc2l0ZVR5cGUoKSB8fCBpc0Rlcml2ZWRUeXBlKCk7Cit9CisKKy8vLyBpc1N1YnByb2dyYW0gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHRhZyBpcyBsZWdhbCBmb3IKKy8vLyBESVN1YnByb2dyYW0uCitib29sIERJRGVzY3JpcHRvcjo6aXNTdWJwcm9ncmFtKCkgY29uc3QgeworICByZXR1cm4gRGJnTm9kZSAmJiBnZXRUYWcoKSA9PSBkd2FyZjo6RFdfVEFHX3N1YnByb2dyYW07Cit9CisKKy8vLyBpc0dsb2JhbFZhcmlhYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0YWcgaXMgbGVnYWwgZm9yCisvLy8gRElHbG9iYWxWYXJpYWJsZS4KK2Jvb2wgRElEZXNjcmlwdG9yOjppc0dsb2JhbFZhcmlhYmxlKCkgY29uc3QgeworICByZXR1cm4gRGJnTm9kZSAmJiAoZ2V0VGFnKCkgPT0gZHdhcmY6OkRXX1RBR192YXJpYWJsZSB8fAorICAgICAgICAgICAgICAgICAgICAgZ2V0VGFnKCkgPT0gZHdhcmY6OkRXX1RBR19jb25zdGFudCk7Cit9CisKKy8vLyBpc0dsb2JhbCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdGFnIGlzIGxlZ2FsIGZvciBESUdsb2JhbC4KK2Jvb2wgRElEZXNjcmlwdG9yOjppc0dsb2JhbCgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzR2xvYmFsVmFyaWFibGUoKTsKK30KKworLy8vIGlzU2NvcGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHRhZyBpcyBvbmUgb2YgdGhlIHNjb3BlCisvLy8gcmVsYXRlZCB0YWcuCitib29sIERJRGVzY3JpcHRvcjo6aXNTY29wZSgpIGNvbnN0IHsKKyAgaWYgKCFEYmdOb2RlKSByZXR1cm4gZmFsc2U7CisgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgY2FzZSBkd2FyZjo6RFdfVEFHX2NvbXBpbGVfdW5pdDoKKyAgY2FzZSBkd2FyZjo6RFdfVEFHX2xleGljYWxfYmxvY2s6CisgIGNhc2UgZHdhcmY6OkRXX1RBR19zdWJwcm9ncmFtOgorICBjYXNlIGR3YXJmOjpEV19UQUdfbmFtZXNwYWNlOgorICAgIHJldHVybiB0cnVlOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzQ29tcGlsZVVuaXQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHRhZyBpcyBEV19UQUdfY29tcGlsZV91bml0LgorYm9vbCBESURlc2NyaXB0b3I6OmlzQ29tcGlsZVVuaXQoKSBjb25zdCB7CisgIHJldHVybiBEYmdOb2RlICYmIGdldFRhZygpID09IGR3YXJmOjpEV19UQUdfY29tcGlsZV91bml0OworfQorCisvLy8gaXNGaWxlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0YWcgaXMgRFdfVEFHX2ZpbGVfdHlwZS4KK2Jvb2wgRElEZXNjcmlwdG9yOjppc0ZpbGUoKSBjb25zdCB7CisgIHJldHVybiBEYmdOb2RlICYmIGdldFRhZygpID09IGR3YXJmOjpEV19UQUdfZmlsZV90eXBlOworfQorCisvLy8gaXNOYW1lU3BhY2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHRhZyBpcyBEV19UQUdfbmFtZXNwYWNlLgorYm9vbCBESURlc2NyaXB0b3I6OmlzTmFtZVNwYWNlKCkgY29uc3QgeworICByZXR1cm4gRGJnTm9kZSAmJiBnZXRUYWcoKSA9PSBkd2FyZjo6RFdfVEFHX25hbWVzcGFjZTsKK30KKworLy8vIGlzTGV4aWNhbEJsb2NrIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0YWcgaXMgRFdfVEFHX2xleGljYWxfYmxvY2suCitib29sIERJRGVzY3JpcHRvcjo6aXNMZXhpY2FsQmxvY2soKSBjb25zdCB7CisgIHJldHVybiBEYmdOb2RlICYmIGdldFRhZygpID09IGR3YXJmOjpEV19UQUdfbGV4aWNhbF9ibG9jazsKK30KKworLy8vIGlzU3VicmFuZ2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHRhZyBpcyBEV19UQUdfc3VicmFuZ2VfdHlwZS4KK2Jvb2wgRElEZXNjcmlwdG9yOjppc1N1YnJhbmdlKCkgY29uc3QgeworICByZXR1cm4gRGJnTm9kZSAmJiBnZXRUYWcoKSA9PSBkd2FyZjo6RFdfVEFHX3N1YnJhbmdlX3R5cGU7Cit9CisKKy8vLyBpc0VudW1lcmF0b3IgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHRhZyBpcyBEV19UQUdfZW51bWVyYXRvci4KK2Jvb2wgRElEZXNjcmlwdG9yOjppc0VudW1lcmF0b3IoKSBjb25zdCB7CisgIHJldHVybiBEYmdOb2RlICYmIGdldFRhZygpID09IGR3YXJmOjpEV19UQUdfZW51bWVyYXRvcjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNpbXBsZSBEZXNjcmlwdG9yIENvbnN0cnVjdG9ycyBhbmQgb3RoZXIgTWV0aG9kcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworRElUeXBlOjpESVR5cGUoY29uc3QgTUROb2RlICpOKSA6IERJU2NvcGUoTikgeworICBpZiAoIU4pIHJldHVybjsKKyAgaWYgKCFpc0Jhc2ljVHlwZSgpICYmICFpc0Rlcml2ZWRUeXBlKCkgJiYgIWlzQ29tcG9zaXRlVHlwZSgpKSB7CisgICAgRGJnTm9kZSA9IDA7CisgIH0KK30KKwordW5zaWduZWQgRElBcnJheTo6Z2V0TnVtRWxlbWVudHMoKSBjb25zdCB7CisgIGlmICghRGJnTm9kZSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIERiZ05vZGUtPmdldE51bU9wZXJhbmRzKCk7Cit9CisKKy8vLyByZXBsYWNlQWxsVXNlc1dpdGggLSBSZXBsYWNlIGFsbCB1c2VzIG9mIGRlYnVnIGluZm8gcmVmZXJlbmNlZCBieQorLy8vIHRoaXMgZGVzY3JpcHRvci4KK3ZvaWQgRElEZXJpdmVkVHlwZTo6cmVwbGFjZUFsbFVzZXNXaXRoKERJRGVzY3JpcHRvciAmRCkgeworICBpZiAoIURiZ05vZGUpCisgICAgcmV0dXJuOworCisgIC8vIFNpbmNlIHdlIHVzZSBhIFRyYWNraW5nVkggZm9yIHRoZSBub2RlLCBpdHMgZWFzeSBmb3IgY2xpZW50cyB0byBtYW51ZmFjdHVyZQorICAvLyBsZWdpdGltYXRlIHNpdHVhdGlvbnMgd2hlcmUgdGhleSB3YW50IHRvIHJlcGxhY2VBbGxVc2VzV2l0aCgpIG9uIHNvbWV0aGluZworICAvLyB3aGljaCwgZHVlIHRvIHVuaXF1aW5nLCBoYXMgbWVyZ2VkIHdpdGggdGhlIHNvdXJjZS4gV2Ugc2hpZWxkIGNsaWVudHMgZnJvbQorICAvLyB0aGlzIGRldGFpbCBieSBhbGxvd2luZyBhIHZhbHVlIHRvIGJlIHJlcGxhY2VkIHdpdGggcmVwbGFjZUFsbFVzZXNXaXRoKCkKKyAgLy8gaXRzZWxmLgorICBpZiAoRGJnTm9kZSAhPSBEKSB7CisgICAgTUROb2RlICpOb2RlID0gY29uc3RfY2FzdDxNRE5vZGUqPihEYmdOb2RlKTsKKyAgICBjb25zdCBNRE5vZGUgKkROID0gRDsKKyAgICBjb25zdCBWYWx1ZSAqViA9IGNhc3Rfb3JfbnVsbDxWYWx1ZT4oRE4pOworICAgIE5vZGUtPnJlcGxhY2VBbGxVc2VzV2l0aChjb25zdF9jYXN0PFZhbHVlKj4oVikpOworICB9Cit9CisKKy8vLyBWZXJpZnkgLSBWZXJpZnkgdGhhdCBhIGNvbXBpbGUgdW5pdCBpcyB3ZWxsIGZvcm1lZC4KK2Jvb2wgRElDb21waWxlVW5pdDo6VmVyaWZ5KCkgY29uc3QgeworICBpZiAoIURiZ05vZGUpCisgICAgcmV0dXJuIGZhbHNlOworICBTdHJpbmdSZWYgTiA9IGdldEZpbGVuYW1lKCk7CisgIGlmIChOLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IGRpcmVjdG9yeSBhbmQgcHJvZHVjZSBzdHJpbmcgaXMgZW1wdHkuCisgIHJldHVybiB0cnVlOworfQorCisvLy8gVmVyaWZ5IC0gVmVyaWZ5IHRoYXQgYSB0eXBlIGRlc2NyaXB0b3IgaXMgd2VsbCBmb3JtZWQuCitib29sIERJVHlwZTo6VmVyaWZ5KCkgY29uc3QgeworICBpZiAoIURiZ05vZGUpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldENvbnRleHQoKS5WZXJpZnkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRElDb21waWxlVW5pdCBDVSA9IGdldENvbXBpbGVVbml0KCk7CisgIGlmICghQ1UuVmVyaWZ5KCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFZlcmlmeSAtIFZlcmlmeSB0aGF0IGEgY29tcG9zaXRlIHR5cGUgZGVzY3JpcHRvciBpcyB3ZWxsIGZvcm1lZC4KK2Jvb2wgRElDb21wb3NpdGVUeXBlOjpWZXJpZnkoKSBjb25zdCB7CisgIGlmICghRGJnTm9kZSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0Q29udGV4dCgpLlZlcmlmeSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBESUNvbXBpbGVVbml0IENVID0gZ2V0Q29tcGlsZVVuaXQoKTsKKyAgaWYgKCFDVS5WZXJpZnkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gVmVyaWZ5IC0gVmVyaWZ5IHRoYXQgYSBzdWJwcm9ncmFtIGRlc2NyaXB0b3IgaXMgd2VsbCBmb3JtZWQuCitib29sIERJU3VicHJvZ3JhbTo6VmVyaWZ5KCkgY29uc3QgeworICBpZiAoIURiZ05vZGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghZ2V0Q29udGV4dCgpLlZlcmlmeSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBESUNvbXBpbGVVbml0IENVID0gZ2V0Q29tcGlsZVVuaXQoKTsKKyAgaWYgKCFDVS5WZXJpZnkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRElDb21wb3NpdGVUeXBlIFR5ID0gZ2V0VHlwZSgpOworICBpZiAoIVR5LlZlcmlmeSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBWZXJpZnkgLSBWZXJpZnkgdGhhdCBhIGdsb2JhbCB2YXJpYWJsZSBkZXNjcmlwdG9yIGlzIHdlbGwgZm9ybWVkLgorYm9vbCBESUdsb2JhbFZhcmlhYmxlOjpWZXJpZnkoKSBjb25zdCB7CisgIGlmICghRGJnTm9kZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGdldERpc3BsYXlOYW1lKCkuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFnZXRDb250ZXh0KCkuVmVyaWZ5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIERJQ29tcGlsZVVuaXQgQ1UgPSBnZXRDb21waWxlVW5pdCgpOworICBpZiAoIUNVLlZlcmlmeSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBESVR5cGUgVHkgPSBnZXRUeXBlKCk7CisgIGlmICghVHkuVmVyaWZ5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghZ2V0R2xvYmFsKCkgJiYgIWdldENvbnN0YW50KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gVmVyaWZ5IC0gVmVyaWZ5IHRoYXQgYSB2YXJpYWJsZSBkZXNjcmlwdG9yIGlzIHdlbGwgZm9ybWVkLgorYm9vbCBESVZhcmlhYmxlOjpWZXJpZnkoKSBjb25zdCB7CisgIGlmICghRGJnTm9kZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFnZXRDb250ZXh0KCkuVmVyaWZ5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghZ2V0Q29tcGlsZVVuaXQoKS5WZXJpZnkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRElUeXBlIFR5ID0gZ2V0VHlwZSgpOworICBpZiAoIVR5LlZlcmlmeSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFZlcmlmeSAtIFZlcmlmeSB0aGF0IGEgbG9jYXRpb24gZGVzY3JpcHRvciBpcyB3ZWxsIGZvcm1lZC4KK2Jvb2wgRElMb2NhdGlvbjo6VmVyaWZ5KCkgY29uc3QgeworICBpZiAoIURiZ05vZGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiBEYmdOb2RlLT5nZXROdW1PcGVyYW5kcygpID09IDQ7Cit9CisKKy8vLyBWZXJpZnkgLSBWZXJpZnkgdGhhdCBhIG5hbWVzcGFjZSBkZXNjcmlwdG9yIGlzIHdlbGwgZm9ybWVkLgorYm9vbCBESU5hbWVTcGFjZTo6VmVyaWZ5KCkgY29uc3QgeworICBpZiAoIURiZ05vZGUpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoZ2V0TmFtZSgpLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldENvbXBpbGVVbml0KCkuVmVyaWZ5KCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGdldE9yaWdpbmFsVHlwZVNpemUgLSBJZiB0aGlzIHR5cGUgaXMgZGVyaXZlZCBmcm9tIGEgYmFzZSB0eXBlIHRoZW4KKy8vLyByZXR1cm4gYmFzZSB0eXBlIHNpemUuCit1aW50NjRfdCBESURlcml2ZWRUeXBlOjpnZXRPcmlnaW5hbFR5cGVTaXplKCkgY29uc3QgeworICB1bnNpZ25lZCBUYWcgPSBnZXRUYWcoKTsKKyAgaWYgKFRhZyA9PSBkd2FyZjo6RFdfVEFHX21lbWJlciB8fCBUYWcgPT0gZHdhcmY6OkRXX1RBR190eXBlZGVmIHx8CisgICAgICBUYWcgPT0gZHdhcmY6OkRXX1RBR19jb25zdF90eXBlIHx8IFRhZyA9PSBkd2FyZjo6RFdfVEFHX3ZvbGF0aWxlX3R5cGUgfHwKKyAgICAgIFRhZyA9PSBkd2FyZjo6RFdfVEFHX3Jlc3RyaWN0X3R5cGUpIHsKKyAgICBESVR5cGUgQmFzZVR5cGUgPSBnZXRUeXBlRGVyaXZlZEZyb20oKTsKKyAgICAvLyBJZiB0aGlzIHR5cGUgaXMgbm90IGRlcml2ZWQgZnJvbSBhbnkgdHlwZSB0aGVuIHRha2UgY29uc2VydmF0aXZlCisgICAgLy8gYXBwcm9hY2guCisgICAgaWYgKCFCYXNlVHlwZS5pc1ZhbGlkKCkpCisgICAgICByZXR1cm4gZ2V0U2l6ZUluQml0cygpOworICAgIGlmIChCYXNlVHlwZS5pc0Rlcml2ZWRUeXBlKCkpCisgICAgICByZXR1cm4gRElEZXJpdmVkVHlwZShCYXNlVHlwZSkuZ2V0T3JpZ2luYWxUeXBlU2l6ZSgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBCYXNlVHlwZS5nZXRTaXplSW5CaXRzKCk7CisgIH0KKworICByZXR1cm4gZ2V0U2l6ZUluQml0cygpOworfQorCisvLy8gaXNJbmxpbmVkRm5Bcmd1bWVudCAtIFJldHVybiB0cnVlIGlmIHRoaXMgdmFyaWFibGUgcHJvdmlkZXMgZGVidWdnaW5nCisvLy8gaW5mb3JtYXRpb24gZm9yIGFuIGlubGluZWQgZnVuY3Rpb24gYXJndW1lbnRzLgorYm9vbCBESVZhcmlhYmxlOjppc0lubGluZWRGbkFyZ3VtZW50KGNvbnN0IEZ1bmN0aW9uICpDdXJGbikgeworICBhc3NlcnQoQ3VyRm4gJiYgIkludmFsaWQgZnVuY3Rpb24iKTsKKyAgaWYgKCFnZXRDb250ZXh0KCkuaXNTdWJwcm9ncmFtKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBUaGlzIHZhcmlhYmxlIGlzIG5vdCBpbmxpbmVkIGZ1bmN0aW9uIGFyZ3VtZW50IGlmIGl0cyBzY29wZQorICAvLyBkb2VzIG5vdCBkZXNjcmliZSBjdXJyZW50IGZ1bmN0aW9uLgorICByZXR1cm4gIShESVN1YnByb2dyYW0oZ2V0Q29udGV4dCgpKS5kZXNjcmliZXMoQ3VyRm4pKTsKK30KKworLy8vIGRlc2NyaWJlcyAtIFJldHVybiB0cnVlIGlmIHRoaXMgc3VicHJvZ3JhbSBwcm92aWRlcyBkZWJ1Z2dpbmcKKy8vLyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIEYuCitib29sIERJU3VicHJvZ3JhbTo6ZGVzY3JpYmVzKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIGFzc2VydChGICYmICJJbnZhbGlkIGZ1bmN0aW9uIik7CisgIGlmIChGID09IGdldEZ1bmN0aW9uKCkpCisgICAgcmV0dXJuIHRydWU7CisgIFN0cmluZ1JlZiBOYW1lID0gZ2V0TGlua2FnZU5hbWUoKTsKKyAgaWYgKE5hbWUuZW1wdHkoKSkKKyAgICBOYW1lID0gZ2V0TmFtZSgpOworICBpZiAoRi0+Z2V0TmFtZSgpID09IE5hbWUpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKwordW5zaWduZWQgRElTdWJwcm9ncmFtOjppc09wdGltaXplZCgpIGNvbnN0IHsKKyAgYXNzZXJ0IChEYmdOb2RlICYmICJJbnZhbGlkIHN1YnByb2dyYW0gZGVzY3JpcHRvciEiKTsKKyAgaWYgKERiZ05vZGUtPmdldE51bU9wZXJhbmRzKCkgPT0gMTYpCisgICAgcmV0dXJuIGdldFVuc2lnbmVkRmllbGQoMTUpOworICByZXR1cm4gMDsKK30KKworU3RyaW5nUmVmIERJU2NvcGU6OmdldEZpbGVuYW1lKCkgY29uc3QgeworICBpZiAoIURiZ05vZGUpCisgICAgcmV0dXJuIFN0cmluZ1JlZigpOworICBpZiAoaXNMZXhpY2FsQmxvY2soKSkKKyAgICByZXR1cm4gRElMZXhpY2FsQmxvY2soRGJnTm9kZSkuZ2V0RmlsZW5hbWUoKTsKKyAgaWYgKGlzU3VicHJvZ3JhbSgpKQorICAgIHJldHVybiBESVN1YnByb2dyYW0oRGJnTm9kZSkuZ2V0RmlsZW5hbWUoKTsKKyAgaWYgKGlzQ29tcGlsZVVuaXQoKSkKKyAgICByZXR1cm4gRElDb21waWxlVW5pdChEYmdOb2RlKS5nZXRGaWxlbmFtZSgpOworICBpZiAoaXNOYW1lU3BhY2UoKSkKKyAgICByZXR1cm4gRElOYW1lU3BhY2UoRGJnTm9kZSkuZ2V0RmlsZW5hbWUoKTsKKyAgaWYgKGlzVHlwZSgpKQorICAgIHJldHVybiBESVR5cGUoRGJnTm9kZSkuZ2V0RmlsZW5hbWUoKTsKKyAgaWYgKGlzRmlsZSgpKQorICAgIHJldHVybiBESUZpbGUoRGJnTm9kZSkuZ2V0RmlsZW5hbWUoKTsKKyAgYXNzZXJ0KDAgJiYgIkludmFsaWQgRElTY29wZSEiKTsKKyAgcmV0dXJuIFN0cmluZ1JlZigpOworfQorCitTdHJpbmdSZWYgRElTY29wZTo6Z2V0RGlyZWN0b3J5KCkgY29uc3QgeworICBpZiAoIURiZ05vZGUpCisgICAgcmV0dXJuIFN0cmluZ1JlZigpOworICBpZiAoaXNMZXhpY2FsQmxvY2soKSkKKyAgICByZXR1cm4gRElMZXhpY2FsQmxvY2soRGJnTm9kZSkuZ2V0RGlyZWN0b3J5KCk7CisgIGlmIChpc1N1YnByb2dyYW0oKSkKKyAgICByZXR1cm4gRElTdWJwcm9ncmFtKERiZ05vZGUpLmdldERpcmVjdG9yeSgpOworICBpZiAoaXNDb21waWxlVW5pdCgpKQorICAgIHJldHVybiBESUNvbXBpbGVVbml0KERiZ05vZGUpLmdldERpcmVjdG9yeSgpOworICBpZiAoaXNOYW1lU3BhY2UoKSkKKyAgICByZXR1cm4gRElOYW1lU3BhY2UoRGJnTm9kZSkuZ2V0RGlyZWN0b3J5KCk7CisgIGlmIChpc1R5cGUoKSkKKyAgICByZXR1cm4gRElUeXBlKERiZ05vZGUpLmdldERpcmVjdG9yeSgpOworICBpZiAoaXNGaWxlKCkpCisgICAgcmV0dXJuIERJRmlsZShEYmdOb2RlKS5nZXREaXJlY3RvcnkoKTsKKyAgYXNzZXJ0KDAgJiYgIkludmFsaWQgRElTY29wZSEiKTsKKyAgcmV0dXJuIFN0cmluZ1JlZigpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRElEZXNjcmlwdG9yOiBkdW1wIHJvdXRpbmVzIGZvciBhbGwgZGVzY3JpcHRvcnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vLyBwcmludCAtIFByaW50IGRlc2NyaXB0b3IuCit2b2lkIERJRGVzY3JpcHRvcjo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICJbIiA8PCBkd2FyZjo6VGFnU3RyaW5nKGdldFRhZygpKSA8PCAiXSAiOworICBPUy53cml0ZV9oZXgoKGludHB0cl90KSAmKkRiZ05vZGUpIDw8ICddJzsKK30KKworLy8vIHByaW50IC0gUHJpbnQgY29tcGlsZSB1bml0Lgordm9pZCBESUNvbXBpbGVVbml0OjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgaWYgKGdldExhbmd1YWdlKCkpCisgICAgT1MgPDwgIiBbIiA8PCBkd2FyZjo6TGFuZ3VhZ2VTdHJpbmcoZ2V0TGFuZ3VhZ2UoKSkgPDwgIl0gIjsKKworICBPUyA8PCAiIFsiIDw8IGdldERpcmVjdG9yeSgpIDw8ICIvIiA8PCBnZXRGaWxlbmFtZSgpIDw8ICJdIjsKK30KKworLy8vIHByaW50IC0gUHJpbnQgdHlwZS4KK3ZvaWQgRElUeXBlOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgaWYgKCFEYmdOb2RlKSByZXR1cm47CisKKyAgU3RyaW5nUmVmIFJlcyA9IGdldE5hbWUoKTsKKyAgaWYgKCFSZXMuZW1wdHkoKSkKKyAgICBPUyA8PCAiIFsiIDw8IFJlcyA8PCAiXSAiOworCisgIHVuc2lnbmVkIFRhZyA9IGdldFRhZygpOworICBPUyA8PCAiIFsiIDw8IGR3YXJmOjpUYWdTdHJpbmcoVGFnKSA8PCAiXSAiOworCisgIC8vIFRPRE8gOiBQcmludCBjb250ZXh0CisgIGdldENvbXBpbGVVbml0KCkucHJpbnQoT1MpOworICBPUyA8PCAiIFsiCisgICAgICAgICA8PCAibGluZSAiIDw8IGdldExpbmVOdW1iZXIoKSA8PCAiLCAiCisgICAgICAgICA8PCBnZXRTaXplSW5CaXRzKCkgPDwgIiBiaXRzLCAiCisgICAgICAgICA8PCBnZXRBbGlnbkluQml0cygpIDw8ICIgYml0IGFsaWdubWVudCwgIgorICAgICAgICAgPDwgZ2V0T2Zmc2V0SW5CaXRzKCkgPDwgIiBiaXQgb2Zmc2V0IgorICAgICAgICAgPDwgIl0gIjsKKworICBpZiAoaXNQcml2YXRlKCkpCisgICAgT1MgPDwgIiBbcHJpdmF0ZV0gIjsKKyAgZWxzZSBpZiAoaXNQcm90ZWN0ZWQoKSkKKyAgICBPUyA8PCAiIFtwcm90ZWN0ZWRdICI7CisKKyAgaWYgKGlzRm9yd2FyZERlY2woKSkKKyAgICBPUyA8PCAiIFtmd2RdICI7CisKKyAgaWYgKGlzQmFzaWNUeXBlKCkpCisgICAgRElCYXNpY1R5cGUoRGJnTm9kZSkucHJpbnQoT1MpOworICBlbHNlIGlmIChpc0Rlcml2ZWRUeXBlKCkpCisgICAgRElEZXJpdmVkVHlwZShEYmdOb2RlKS5wcmludChPUyk7CisgIGVsc2UgaWYgKGlzQ29tcG9zaXRlVHlwZSgpKQorICAgIERJQ29tcG9zaXRlVHlwZShEYmdOb2RlKS5wcmludChPUyk7CisgIGVsc2UgeworICAgIE9TIDw8ICJJbnZhbGlkIERJVHlwZVxuIjsKKyAgICByZXR1cm47CisgIH0KKworICBPUyA8PCAiXG4iOworfQorCisvLy8gcHJpbnQgLSBQcmludCBiYXNpYyB0eXBlLgordm9pZCBESUJhc2ljVHlwZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICIgWyIgPDwgZHdhcmY6OkF0dHJpYnV0ZUVuY29kaW5nU3RyaW5nKGdldEVuY29kaW5nKCkpIDw8ICJdICI7Cit9CisKKy8vLyBwcmludCAtIFByaW50IGRlcml2ZWQgdHlwZS4KK3ZvaWQgRElEZXJpdmVkVHlwZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICJcblx0IERlcml2ZWQgRnJvbTogIjsgZ2V0VHlwZURlcml2ZWRGcm9tKCkucHJpbnQoT1MpOworfQorCisvLy8gcHJpbnQgLSBQcmludCBjb21wb3NpdGUgdHlwZS4KK3ZvaWQgRElDb21wb3NpdGVUeXBlOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgRElBcnJheSBBID0gZ2V0VHlwZUFycmF5KCk7CisgIE9TIDw8ICIgWyIgPDwgQS5nZXROdW1FbGVtZW50cygpIDw8ICIgZWxlbWVudHNdIjsKK30KKworLy8vIHByaW50IC0gUHJpbnQgc3VicHJvZ3JhbS4KK3ZvaWQgRElTdWJwcm9ncmFtOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgU3RyaW5nUmVmIFJlcyA9IGdldE5hbWUoKTsKKyAgaWYgKCFSZXMuZW1wdHkoKSkKKyAgICBPUyA8PCAiIFsiIDw8IFJlcyA8PCAiXSAiOworCisgIHVuc2lnbmVkIFRhZyA9IGdldFRhZygpOworICBPUyA8PCAiIFsiIDw8IGR3YXJmOjpUYWdTdHJpbmcoVGFnKSA8PCAiXSAiOworCisgIC8vIFRPRE8gOiBQcmludCBjb250ZXh0CisgIGdldENvbXBpbGVVbml0KCkucHJpbnQoT1MpOworICBPUyA8PCAiIFsiIDw8IGdldExpbmVOdW1iZXIoKSA8PCAiXSAiOworCisgIGlmIChpc0xvY2FsVG9Vbml0KCkpCisgICAgT1MgPDwgIiBbbG9jYWxdICI7CisKKyAgaWYgKGlzRGVmaW5pdGlvbigpKQorICAgIE9TIDw8ICIgW2RlZl0gIjsKKworICBPUyA8PCAiXG4iOworfQorCisvLy8gcHJpbnQgLSBQcmludCBnbG9iYWwgdmFyaWFibGUuCit2b2lkIERJR2xvYmFsVmFyaWFibGU6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBPUyA8PCAiIFsiOworICBTdHJpbmdSZWYgUmVzID0gZ2V0TmFtZSgpOworICBpZiAoIVJlcy5lbXB0eSgpKQorICAgIE9TIDw8ICIgWyIgPDwgUmVzIDw8ICJdICI7CisKKyAgdW5zaWduZWQgVGFnID0gZ2V0VGFnKCk7CisgIE9TIDw8ICIgWyIgPDwgZHdhcmY6OlRhZ1N0cmluZyhUYWcpIDw8ICJdICI7CisKKyAgLy8gVE9ETyA6IFByaW50IGNvbnRleHQKKyAgZ2V0Q29tcGlsZVVuaXQoKS5wcmludChPUyk7CisgIE9TIDw8ICIgWyIgPDwgZ2V0TGluZU51bWJlcigpIDw8ICJdICI7CisKKyAgaWYgKGlzTG9jYWxUb1VuaXQoKSkKKyAgICBPUyA8PCAiIFtsb2NhbF0gIjsKKworICBpZiAoaXNEZWZpbml0aW9uKCkpCisgICAgT1MgPDwgIiBbZGVmXSAiOworCisgIGlmIChpc0dsb2JhbFZhcmlhYmxlKCkpCisgICAgRElHbG9iYWxWYXJpYWJsZShEYmdOb2RlKS5wcmludChPUyk7CisgIE9TIDw8ICJdXG4iOworfQorCisvLy8gcHJpbnQgLSBQcmludCB2YXJpYWJsZS4KK3ZvaWQgRElWYXJpYWJsZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIFN0cmluZ1JlZiBSZXMgPSBnZXROYW1lKCk7CisgIGlmICghUmVzLmVtcHR5KCkpCisgICAgT1MgPDwgIiBbIiA8PCBSZXMgPDwgIl0gIjsKKworICBnZXRDb21waWxlVW5pdCgpLnByaW50KE9TKTsKKyAgT1MgPDwgIiBbIiA8PCBnZXRMaW5lTnVtYmVyKCkgPDwgIl0gIjsKKyAgZ2V0VHlwZSgpLnByaW50KE9TKTsKKyAgT1MgPDwgIlxuIjsKKworICAvLyBGSVhNRTogRHVtcCBjb21wbGV4IGFkZHJlc3NlcworfQorCisvLy8gZHVtcCAtIFByaW50IGRlc2NyaXB0b3IgdG8gZGJncygpIHdpdGggYSBuZXdsaW5lLgordm9pZCBESURlc2NyaXB0b3I6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7IGRiZ3MoKSA8PCAnXG4nOworfQorCisvLy8gZHVtcCAtIFByaW50IGNvbXBpbGUgdW5pdCB0byBkYmdzKCkgd2l0aCBhIG5ld2xpbmUuCit2b2lkIERJQ29tcGlsZVVuaXQ6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7IGRiZ3MoKSA8PCAnXG4nOworfQorCisvLy8gZHVtcCAtIFByaW50IHR5cGUgdG8gZGJncygpIHdpdGggYSBuZXdsaW5lLgordm9pZCBESVR5cGU6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7IGRiZ3MoKSA8PCAnXG4nOworfQorCisvLy8gZHVtcCAtIFByaW50IGJhc2ljIHR5cGUgdG8gZGJncygpIHdpdGggYSBuZXdsaW5lLgordm9pZCBESUJhc2ljVHlwZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsgZGJncygpIDw8ICdcbic7Cit9CisKKy8vLyBkdW1wIC0gUHJpbnQgZGVyaXZlZCB0eXBlIHRvIGRiZ3MoKSB3aXRoIGEgbmV3bGluZS4KK3ZvaWQgRElEZXJpdmVkVHlwZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsgZGJncygpIDw8ICdcbic7Cit9CisKKy8vLyBkdW1wIC0gUHJpbnQgY29tcG9zaXRlIHR5cGUgdG8gZGJncygpIHdpdGggYSBuZXdsaW5lLgordm9pZCBESUNvbXBvc2l0ZVR5cGU6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7IGRiZ3MoKSA8PCAnXG4nOworfQorCisvLy8gZHVtcCAtIFByaW50IHN1YnByb2dyYW0gdG8gZGJncygpIHdpdGggYSBuZXdsaW5lLgordm9pZCBESVN1YnByb2dyYW06OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7IGRiZ3MoKSA8PCAnXG4nOworfQorCisvLy8gZHVtcCAtIFByaW50IGdsb2JhbCB2YXJpYWJsZS4KK3ZvaWQgRElHbG9iYWxWYXJpYWJsZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsgZGJncygpIDw8ICdcbic7Cit9CisKKy8vLyBkdW1wIC0gUHJpbnQgdmFyaWFibGUuCit2b2lkIERJVmFyaWFibGU6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7IGRiZ3MoKSA8PCAnXG4nOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRElGYWN0b3J5OiBCYXNpYyBIZWxwZXJzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitESUZhY3Rvcnk6OkRJRmFjdG9yeShNb2R1bGUgJm0pCisgIDogTShtKSwgVk1Db250ZXh0KE0uZ2V0Q29udGV4dCgpKSwgRGVjbGFyZUZuKDApLCBWYWx1ZUZuKDApIHt9CisKK0NvbnN0YW50ICpESUZhY3Rvcnk6OkdldFRhZ0NvbnN0YW50KHVuc2lnbmVkIFRBRykgeworICBhc3NlcnQoKFRBRyAmIExMVk1EZWJ1Z1ZlcnNpb25NYXNrKSA9PSAwICYmCisgICAgICAgICAiVGFnIHRvbyBsYXJnZSBmb3IgZGVidWcgZW5jb2RpbmchIik7CisgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgVEFHIHwgTExWTURlYnVnVmVyc2lvbik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBESUZhY3Rvcnk6IFByaW1hcnkgQ29uc3RydWN0b3JzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gR2V0T3JDcmVhdGVBcnJheSAtIENyZWF0ZSBhbiBkZXNjcmlwdG9yIGZvciBhbiBhcnJheSBvZiBkZXNjcmlwdG9ycy4KKy8vLyBUaGlzIGltcGxpY2l0bHkgdW5pcXVlcyB0aGUgYXJyYXlzIGNyZWF0ZWQuCitESUFycmF5IERJRmFjdG9yeTo6R2V0T3JDcmVhdGVBcnJheShESURlc2NyaXB0b3IgKlR5cywgdW5zaWduZWQgTnVtVHlzKSB7CisgIFNtYWxsVmVjdG9yPFZhbHVlKiwgMTY+IEVsdHM7CisKKyAgaWYgKE51bVR5cyA9PSAwKQorICAgIEVsdHMucHVzaF9iYWNrKGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpKSk7CisgIGVsc2UKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVR5czsgKytpKQorICAgICAgRWx0cy5wdXNoX2JhY2soVHlzW2ldKTsKKworICByZXR1cm4gRElBcnJheShNRE5vZGU6OmdldChWTUNvbnRleHQsRWx0cy5kYXRhKCksIEVsdHMuc2l6ZSgpKSk7Cit9CisKKy8vLyBHZXRPckNyZWF0ZVN1YnJhbmdlIC0gQ3JlYXRlIGEgZGVzY3JpcHRvciBmb3IgYSB2YWx1ZSByYW5nZS4gIFRoaXMKKy8vLyBpbXBsaWNpdGx5IHVuaXF1ZXMgdGhlIHZhbHVlcyByZXR1cm5lZC4KK0RJU3VicmFuZ2UgRElGYWN0b3J5OjpHZXRPckNyZWF0ZVN1YnJhbmdlKGludDY0X3QgTG8sIGludDY0X3QgSGkpIHsKKyAgVmFsdWUgKkVsdHNbXSA9IHsKKyAgICBHZXRUYWdDb25zdGFudChkd2FyZjo6RFdfVEFHX3N1YnJhbmdlX3R5cGUpLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShWTUNvbnRleHQpLCBMbyksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KFZNQ29udGV4dCksIEhpKQorICB9OworCisgIHJldHVybiBESVN1YnJhbmdlKE1ETm9kZTo6Z2V0KFZNQ29udGV4dCwgJkVsdHNbMF0sIDMpKTsKK30KKworCisKKy8vLyBDcmVhdGVDb21waWxlVW5pdCAtIENyZWF0ZSBhIG5ldyBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbXBpbGUKKy8vLyB1bml0LiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgdW5pcXVlIGNvbXBpbGUgdW5pdHMgd2l0aGluIHRoZSBtb2R1bGUuCitESUNvbXBpbGVVbml0IERJRmFjdG9yeTo6Q3JlYXRlQ29tcGlsZVVuaXQodW5zaWduZWQgTGFuZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBQcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3B0aW1pemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSdW5UaW1lVmVyKSB7CisgIFZhbHVlICpFbHRzW10gPSB7CisgICAgR2V0VGFnQ29uc3RhbnQoZHdhcmY6OkRXX1RBR19jb21waWxlX3VuaXQpLAorICAgIGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgTGFuZ0lEKSwKKyAgICBNRFN0cmluZzo6Z2V0KFZNQ29udGV4dCwgRmlsZW5hbWUpLAorICAgIE1EU3RyaW5nOjpnZXQoVk1Db250ZXh0LCBEaXJlY3RvcnkpLAorICAgIE1EU3RyaW5nOjpnZXQoVk1Db250ZXh0LCBQcm9kdWNlciksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxVHkoVk1Db250ZXh0KSwgaXNNYWluKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDFUeShWTUNvbnRleHQpLCBpc09wdGltaXplZCksCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIEZsYWdzKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgUnVuVGltZVZlcikKKyAgfTsKKworICByZXR1cm4gRElDb21waWxlVW5pdChNRE5vZGU6OmdldChWTUNvbnRleHQsICZFbHRzWzBdLCAxMCkpOworfQorCisvLy8gQ3JlYXRlRmlsZSAtICBDcmVhdGUgYSBuZXcgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgorRElGaWxlIERJRmFjdG9yeTo6Q3JlYXRlRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQ29tcGlsZVVuaXQgQ1UpIHsKKyAgVmFsdWUgKkVsdHNbXSA9IHsKKyAgICBHZXRUYWdDb25zdGFudChkd2FyZjo6RFdfVEFHX2ZpbGVfdHlwZSksCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIEZpbGVuYW1lKSwKKyAgICBNRFN0cmluZzo6Z2V0KFZNQ29udGV4dCwgRGlyZWN0b3J5KSwKKyAgICBDVQorICB9OworCisgIHJldHVybiBESUZpbGUoTUROb2RlOjpnZXQoVk1Db250ZXh0LCAmRWx0c1swXSwgNCkpOworfQorCisvLy8gQ3JlYXRlRW51bWVyYXRvciAtIENyZWF0ZSBhIHNpbmdsZSBlbnVtZXJhdG9yIHZhbHVlLgorRElFbnVtZXJhdG9yIERJRmFjdG9yeTo6Q3JlYXRlRW51bWVyYXRvcihTdHJpbmdSZWYgTmFtZSwgdWludDY0X3QgVmFsKXsKKyAgVmFsdWUgKkVsdHNbXSA9IHsKKyAgICBHZXRUYWdDb25zdGFudChkd2FyZjo6RFdfVEFHX2VudW1lcmF0b3IpLAorICAgIE1EU3RyaW5nOjpnZXQoVk1Db250ZXh0LCBOYW1lKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoVk1Db250ZXh0KSwgVmFsKQorICB9OworICByZXR1cm4gRElFbnVtZXJhdG9yKE1ETm9kZTo6Z2V0KFZNQ29udGV4dCwgJkVsdHNbMF0sIDMpKTsKK30KKworCisvLy8gQ3JlYXRlQmFzaWNUeXBlIC0gQ3JlYXRlIGEgYmFzaWMgdHlwZSBsaWtlIGludCwgZmxvYXQsIGV0Yy4KK0RJQmFzaWNUeXBlIERJRmFjdG9yeTo6Q3JlYXRlQmFzaWNUeXBlKERJRGVzY3JpcHRvciBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsIHVuc2lnbmVkIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRW5jb2RpbmcpIHsKKyAgVmFsdWUgKkVsdHNbXSA9IHsKKyAgICBHZXRUYWdDb25zdGFudChkd2FyZjo6RFdfVEFHX2Jhc2VfdHlwZSksCisgICAgQ29udGV4dCwKKyAgICBNRFN0cmluZzo6Z2V0KFZNQ29udGV4dCwgTmFtZSksCisgICAgRiwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgTGluZU51bWJlciksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KFZNQ29udGV4dCksIFNpemVJbkJpdHMpLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShWTUNvbnRleHQpLCBBbGlnbkluQml0cyksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KFZNQ29udGV4dCksIE9mZnNldEluQml0cyksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCksIEZsYWdzKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgRW5jb2RpbmcpCisgIH07CisgIHJldHVybiBESUJhc2ljVHlwZShNRE5vZGU6OmdldChWTUNvbnRleHQsICZFbHRzWzBdLCAxMCkpOworfQorCisKKy8vLyBDcmVhdGVCYXNpY1R5cGUgLSBDcmVhdGUgYSBiYXNpYyB0eXBlIGxpa2UgaW50LCBmbG9hdCwgZXRjLgorRElCYXNpY1R5cGUgRElGYWN0b3J5OjpDcmVhdGVCYXNpY1R5cGVFeChESURlc2NyaXB0b3IgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqT2Zmc2V0SW5CaXRzLCB1bnNpZ25lZCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRW5jb2RpbmcpIHsKKyAgVmFsdWUgKkVsdHNbXSA9IHsKKyAgICBHZXRUYWdDb25zdGFudChkd2FyZjo6RFdfVEFHX2Jhc2VfdHlwZSksCisgICAgQ29udGV4dCwKKyAgICBNRFN0cmluZzo6Z2V0KFZNQ29udGV4dCwgTmFtZSksCisgICAgRiwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgTGluZU51bWJlciksCisgICAgU2l6ZUluQml0cywKKyAgICBBbGlnbkluQml0cywKKyAgICBPZmZzZXRJbkJpdHMsCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCksIEZsYWdzKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgRW5jb2RpbmcpCisgIH07CisgIHJldHVybiBESUJhc2ljVHlwZShNRE5vZGU6OmdldChWTUNvbnRleHQsICZFbHRzWzBdLCAxMCkpOworfQorCisvLy8gQ3JlYXRlQXJ0aWZpY2lhbFR5cGUgLSBDcmVhdGUgYSBuZXcgRElUeXBlIHdpdGggImFydGlmaWNpYWwiIGZsYWcgc2V0LgorRElUeXBlIERJRmFjdG9yeTo6Q3JlYXRlQXJ0aWZpY2lhbFR5cGUoRElUeXBlIFR5KSB7CisgIGlmIChUeS5pc0FydGlmaWNpYWwoKSkKKyAgICByZXR1cm4gVHk7CisKKyAgU21hbGxWZWN0b3I8VmFsdWUgKiwgOT4gRWx0czsKKyAgTUROb2RlICpOID0gVHk7CisgIGFzc2VydCAoTiAmJiAiVW5leHBlY3RlZCBpbnB1dCBESVR5cGUhIik7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChWYWx1ZSAqViA9IE4tPmdldE9wZXJhbmQoaSkpCisgICAgICBFbHRzLnB1c2hfYmFjayhWKTsKKyAgICBlbHNlCisgICAgICBFbHRzLnB1c2hfYmFjayhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSkpOworICB9CisKKyAgdW5zaWduZWQgQ3VyRmxhZ3MgPSBUeS5nZXRGbGFncygpOworICBDdXJGbGFncyA9IEN1ckZsYWdzIHwgRElUeXBlOjpGbGFnQXJ0aWZpY2lhbDsKKworICAvLyBGbGFncyBhcmUgc3RvcmVkIGF0IHRoaXMgc2xvdC4KKyAgRWx0c1s4XSA9ICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgQ3VyRmxhZ3MpOworCisgIHJldHVybiBESVR5cGUoTUROb2RlOjpnZXQoVk1Db250ZXh0LCBFbHRzLmRhdGEoKSwgRWx0cy5zaXplKCkpKTsKK30KKworLy8vIENyZWF0ZURlcml2ZWRUeXBlIC0gQ3JlYXRlIGEgZGVyaXZlZCB0eXBlIGxpa2UgY29uc3QgcXVhbGlmaWVkIHR5cGUsCisvLy8gcG9pbnRlciwgdHlwZWRlZiwgZXRjLgorRElEZXJpdmVkVHlwZSBESUZhY3Rvcnk6OkNyZWF0ZURlcml2ZWRUeXBlKHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESURlc2NyaXB0b3IgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZSBEZXJpdmVkRnJvbSkgeworICBWYWx1ZSAqRWx0c1tdID0geworICAgIEdldFRhZ0NvbnN0YW50KFRhZyksCisgICAgQ29udGV4dCwKKyAgICBNRFN0cmluZzo6Z2V0KFZNQ29udGV4dCwgTmFtZSksCisgICAgRiwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgTGluZU51bWJlciksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KFZNQ29udGV4dCksIFNpemVJbkJpdHMpLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShWTUNvbnRleHQpLCBBbGlnbkluQml0cyksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KFZNQ29udGV4dCksIE9mZnNldEluQml0cyksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCksIEZsYWdzKSwKKyAgICBEZXJpdmVkRnJvbSwKKyAgfTsKKyAgcmV0dXJuIERJRGVyaXZlZFR5cGUoTUROb2RlOjpnZXQoVk1Db250ZXh0LCAmRWx0c1swXSwgMTApKTsKK30KKworCisvLy8gQ3JlYXRlRGVyaXZlZFR5cGUgLSBDcmVhdGUgYSBkZXJpdmVkIHR5cGUgbGlrZSBjb25zdCBxdWFsaWZpZWQgdHlwZSwKKy8vLyBwb2ludGVyLCB0eXBlZGVmLCBldGMuCitESURlcml2ZWRUeXBlIERJRmFjdG9yeTo6Q3JlYXRlRGVyaXZlZFR5cGVFeCh1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESURlc2NyaXB0b3IgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgRGVyaXZlZEZyb20pIHsKKyAgVmFsdWUgKkVsdHNbXSA9IHsKKyAgICBHZXRUYWdDb25zdGFudChUYWcpLAorICAgIENvbnRleHQsCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIE5hbWUpLAorICAgIEYsCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCksIExpbmVOdW1iZXIpLAorICAgIFNpemVJbkJpdHMsCisgICAgQWxpZ25JbkJpdHMsCisgICAgT2Zmc2V0SW5CaXRzLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBGbGFncyksCisgICAgRGVyaXZlZEZyb20sCisgIH07CisgIHJldHVybiBESURlcml2ZWRUeXBlKE1ETm9kZTo6Z2V0KFZNQ29udGV4dCwgJkVsdHNbMF0sIDEwKSk7Cit9CisKKworLy8vIENyZWF0ZUNvbXBvc2l0ZVR5cGUgLSBDcmVhdGUgYSBjb21wb3NpdGUgdHlwZSBsaWtlIGFycmF5LCBzdHJ1Y3QsIGV0Yy4KK0RJQ29tcG9zaXRlVHlwZSBESUZhY3Rvcnk6OkNyZWF0ZUNvbXBvc2l0ZVR5cGUodW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESURlc2NyaXB0b3IgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlIERlcml2ZWRGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUFycmF5IEVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSdW50aW1lTGFuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpDb250YWluaW5nVHlwZSkgeworCisgIFZhbHVlICpFbHRzW10gPSB7CisgICAgR2V0VGFnQ29uc3RhbnQoVGFnKSwKKyAgICBDb250ZXh0LAorICAgIE1EU3RyaW5nOjpnZXQoVk1Db250ZXh0LCBOYW1lKSwKKyAgICBGLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBMaW5lTnVtYmVyKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoVk1Db250ZXh0KSwgU2l6ZUluQml0cyksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KFZNQ29udGV4dCksIEFsaWduSW5CaXRzKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoVk1Db250ZXh0KSwgT2Zmc2V0SW5CaXRzKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgRmxhZ3MpLAorICAgIERlcml2ZWRGcm9tLAorICAgIEVsZW1lbnRzLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBSdW50aW1lTGFuZyksCisgICAgQ29udGFpbmluZ1R5cGUKKyAgfTsKKworICBNRE5vZGUgKk5vZGUgPSBNRE5vZGU6OmdldChWTUNvbnRleHQsICZFbHRzWzBdLCAxMyk7CisgIC8vIENyZWF0ZSBhIG5hbWVkIG1ldGFkYXRhIHNvIHRoYXQgd2UgZG8gbm90IGxvc2UgdGhpcyBlbnVtIGluZm8uCisgIGlmIChUYWcgPT0gZHdhcmY6OkRXX1RBR19lbnVtZXJhdGlvbl90eXBlKSB7CisgICAgTmFtZWRNRE5vZGUgKk5NRCA9IE0uZ2V0T3JJbnNlcnROYW1lZE1ldGFkYXRhKCJsbHZtLmRiZy5lbnVtIik7CisgICAgTk1ELT5hZGRPcGVyYW5kKE5vZGUpOworICB9CisgIHJldHVybiBESUNvbXBvc2l0ZVR5cGUoTm9kZSk7Cit9CisKKworLy8vIENyZWF0ZUNvbXBvc2l0ZVR5cGUgLSBDcmVhdGUgYSBjb21wb3NpdGUgdHlwZSBsaWtlIGFycmF5LCBzdHJ1Y3QsIGV0Yy4KK0RJQ29tcG9zaXRlVHlwZSBESUZhY3Rvcnk6OkNyZWF0ZUNvbXBvc2l0ZVR5cGVFeCh1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElEZXNjcmlwdG9yIENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKk9mZnNldEluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgRGVyaXZlZEZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElBcnJheSBFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSdW50aW1lTGFuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkNvbnRhaW5pbmdUeXBlKSB7CisgIFZhbHVlICpFbHRzW10gPSB7CisgICAgR2V0VGFnQ29uc3RhbnQoVGFnKSwKKyAgICBDb250ZXh0LAorICAgIE1EU3RyaW5nOjpnZXQoVk1Db250ZXh0LCBOYW1lKSwKKyAgICBGLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBMaW5lTnVtYmVyKSwKKyAgICBTaXplSW5CaXRzLAorICAgIEFsaWduSW5CaXRzLAorICAgIE9mZnNldEluQml0cywKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVk1Db250ZXh0KSwgRmxhZ3MpLAorICAgIERlcml2ZWRGcm9tLAorICAgIEVsZW1lbnRzLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBSdW50aW1lTGFuZyksCisgICAgQ29udGFpbmluZ1R5cGUKKyAgfTsKKyAgTUROb2RlICpOb2RlID0gTUROb2RlOjpnZXQoVk1Db250ZXh0LCAmRWx0c1swXSwgMTMpOworICAvLyBDcmVhdGUgYSBuYW1lZCBtZXRhZGF0YSBzbyB0aGF0IHdlIGRvIG5vdCBsb3NlIHRoaXMgZW51bSBpbmZvLgorICBpZiAoVGFnID09IGR3YXJmOjpEV19UQUdfZW51bWVyYXRpb25fdHlwZSkgeworICAgIE5hbWVkTUROb2RlICpOTUQgPSBNLmdldE9ySW5zZXJ0TmFtZWRNZXRhZGF0YSgibGx2bS5kYmcuZW51bSIpOworICAgIE5NRC0+YWRkT3BlcmFuZChOb2RlKTsKKyAgfQorICByZXR1cm4gRElDb21wb3NpdGVUeXBlKE5vZGUpOworfQorCisKKy8vLyBDcmVhdGVTdWJwcm9ncmFtIC0gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgc3VicHJvZ3JhbS4KKy8vLyBTZWUgY29tbWVudHMgaW4gRElTdWJwcm9ncmFtIGZvciBkZXNjcmlwdGlvbnMgb2YgdGhlc2UgZmllbGRzLiAgVGhpcworLy8vIG1ldGhvZCBkb2VzIG5vdCB1bmlxdWUgdGhlIGdlbmVyYXRlZCBkZXNjcmlwdG9ycy4KK0RJU3VicHJvZ3JhbSBESUZhY3Rvcnk6OkNyZWF0ZVN1YnByb2dyYW0oRElEZXNjcmlwdG9yIENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGlzcGxheU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBMaW5rYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmVObywgRElUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTG9jYWxUb1VuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWSywgdW5zaWduZWQgVkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgQ29udGFpbmluZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBcnRpZmljaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3B0aW1pemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiAqRm4pIHsKKworICBWYWx1ZSAqRWx0c1tdID0geworICAgIEdldFRhZ0NvbnN0YW50KGR3YXJmOjpEV19UQUdfc3VicHJvZ3JhbSksCisgICAgbGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCkpLAorICAgIENvbnRleHQsCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIE5hbWUpLAorICAgIE1EU3RyaW5nOjpnZXQoVk1Db250ZXh0LCBEaXNwbGF5TmFtZSksCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIExpbmthZ2VOYW1lKSwKKyAgICBGLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBMaW5lTm8pLAorICAgIFR5LAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KFZNQ29udGV4dCksIGlzTG9jYWxUb1VuaXQpLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KFZNQ29udGV4dCksIGlzRGVmaW5pdGlvbiksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCksICh1bnNpZ25lZClWSyksCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCksIFZJbmRleCksCisgICAgQ29udGFpbmluZ1R5cGUsCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxVHkoVk1Db250ZXh0KSwgaXNBcnRpZmljaWFsKSwKKyAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDFUeShWTUNvbnRleHQpLCBpc09wdGltaXplZCksCisgICAgRm4KKyAgfTsKKyAgTUROb2RlICpOb2RlID0gTUROb2RlOjpnZXQoVk1Db250ZXh0LCAmRWx0c1swXSwgMTcpOworCisgIC8vIENyZWF0ZSBhIG5hbWVkIG1ldGFkYXRhIHNvIHRoYXQgd2UgZG8gbm90IGxvc2UgdGhpcyBtZG5vZGUuCisgIE5hbWVkTUROb2RlICpOTUQgPSBNLmdldE9ySW5zZXJ0TmFtZWRNZXRhZGF0YSgibGx2bS5kYmcuc3AiKTsKKyAgTk1ELT5hZGRPcGVyYW5kKE5vZGUpOworICByZXR1cm4gRElTdWJwcm9ncmFtKE5vZGUpOworfQorCisvLy8gQ3JlYXRlU3VicHJvZ3JhbURlZmluaXRpb24gLSBDcmVhdGUgbmV3IHN1YnByb2dyYW0gZGVzY3JpcHRvciBmb3IgdGhlCisvLy8gZ2l2ZW4gZGVjbGFyYXRpb24uCitESVN1YnByb2dyYW0gRElGYWN0b3J5OjpDcmVhdGVTdWJwcm9ncmFtRGVmaW5pdGlvbihESVN1YnByb2dyYW0gJlNQRGVjbGFyYXRpb24peworICBpZiAoU1BEZWNsYXJhdGlvbi5pc0RlZmluaXRpb24oKSkKKyAgICByZXR1cm4gRElTdWJwcm9ncmFtKFNQRGVjbGFyYXRpb24pOworCisgIE1ETm9kZSAqRGVjbE5vZGUgPSBTUERlY2xhcmF0aW9uOworICBWYWx1ZSAqRWx0c1tdID0geworICAgIEdldFRhZ0NvbnN0YW50KGR3YXJmOjpEV19UQUdfc3VicHJvZ3JhbSksCisgICAgbGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCkpLAorICAgIERlY2xOb2RlLT5nZXRPcGVyYW5kKDIpLCAvLyBDb250ZXh0CisgICAgRGVjbE5vZGUtPmdldE9wZXJhbmQoMyksIC8vIE5hbWUKKyAgICBEZWNsTm9kZS0+Z2V0T3BlcmFuZCg0KSwgLy8gRGlzcGxheU5hbWUKKyAgICBEZWNsTm9kZS0+Z2V0T3BlcmFuZCg1KSwgLy8gTGlua2FnZU5hbWUKKyAgICBEZWNsTm9kZS0+Z2V0T3BlcmFuZCg2KSwgLy8gQ29tcGlsZVVuaXQKKyAgICBEZWNsTm9kZS0+Z2V0T3BlcmFuZCg3KSwgLy8gTGluZU5vCisgICAgRGVjbE5vZGUtPmdldE9wZXJhbmQoOCksIC8vIFR5cGUKKyAgICBEZWNsTm9kZS0+Z2V0T3BlcmFuZCg5KSwgLy8gaXNMb2NhbFRvVW5pdAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KFZNQ29udGV4dCksIHRydWUpLAorICAgIERlY2xOb2RlLT5nZXRPcGVyYW5kKDExKSwgLy8gVmlydHVhbGl0eQorICAgIERlY2xOb2RlLT5nZXRPcGVyYW5kKDEyKSwgLy8gVkluZGV4CisgICAgRGVjbE5vZGUtPmdldE9wZXJhbmQoMTMpLCAvLyBDb250YWludGluZyBUeXBlCisgICAgRGVjbE5vZGUtPmdldE9wZXJhbmQoMTQpLCAvLyBpc0FydGlmaWNpYWwKKyAgICBEZWNsTm9kZS0+Z2V0T3BlcmFuZCgxNSksIC8vIGlzT3B0aW1pemVkCisgICAgU1BEZWNsYXJhdGlvbi5nZXRGdW5jdGlvbigpCisgIH07CisgIE1ETm9kZSAqTm9kZSA9TUROb2RlOjpnZXQoVk1Db250ZXh0LCAmRWx0c1swXSwgMTYpOworCisgIC8vIENyZWF0ZSBhIG5hbWVkIG1ldGFkYXRhIHNvIHRoYXQgd2UgZG8gbm90IGxvc2UgdGhpcyBtZG5vZGUuCisgIE5hbWVkTUROb2RlICpOTUQgPSBNLmdldE9ySW5zZXJ0TmFtZWRNZXRhZGF0YSgibGx2bS5kYmcuc3AiKTsKKyAgTk1ELT5hZGRPcGVyYW5kKE5vZGUpOworICByZXR1cm4gRElTdWJwcm9ncmFtKE5vZGUpOworfQorCisvLy8gQ3JlYXRlR2xvYmFsVmFyaWFibGUgLSBDcmVhdGUgYSBuZXcgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBnbG9iYWwuCitESUdsb2JhbFZhcmlhYmxlCitESUZhY3Rvcnk6OkNyZWF0ZUdsb2JhbFZhcmlhYmxlKERJRGVzY3JpcHRvciBDb250ZXh0LCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTGlua2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTm8sIERJVHlwZSBUeSxib29sIGlzTG9jYWxUb1VuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZWZpbml0aW9uLCBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqVmFsKSB7CisgIFZhbHVlICpFbHRzW10gPSB7CisgICAgR2V0VGFnQ29uc3RhbnQoZHdhcmY6OkRXX1RBR192YXJpYWJsZSksCisgICAgbGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCkpLAorICAgIENvbnRleHQsCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIE5hbWUpLAorICAgIE1EU3RyaW5nOjpnZXQoVk1Db250ZXh0LCBEaXNwbGF5TmFtZSksCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIExpbmthZ2VOYW1lKSwKKyAgICBGLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBMaW5lTm8pLAorICAgIFR5LAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KFZNQ29udGV4dCksIGlzTG9jYWxUb1VuaXQpLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KFZNQ29udGV4dCksIGlzRGVmaW5pdGlvbiksCisgICAgVmFsCisgIH07CisKKyAgVmFsdWUgKmNvbnN0ICpWcyA9ICZFbHRzWzBdOworICBNRE5vZGUgKk5vZGUgPSBNRE5vZGU6OmdldChWTUNvbnRleHQsVnMsIDEyKTsKKworICAvLyBDcmVhdGUgYSBuYW1lZCBtZXRhZGF0YSBzbyB0aGF0IHdlIGRvIG5vdCBsb3NlIHRoaXMgbWRub2RlLgorICBOYW1lZE1ETm9kZSAqTk1EID0gTS5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEoImxsdm0uZGJnLmd2Iik7CisgIE5NRC0+YWRkT3BlcmFuZChOb2RlKTsKKworICByZXR1cm4gRElHbG9iYWxWYXJpYWJsZShOb2RlKTsKK30KKworLy8vIENyZWF0ZUdsb2JhbFZhcmlhYmxlIC0gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQuCitESUdsb2JhbFZhcmlhYmxlCitESUZhY3Rvcnk6OkNyZWF0ZUdsb2JhbFZhcmlhYmxlKERJRGVzY3JpcHRvciBDb250ZXh0LCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTGlua2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTm8sIERJVHlwZSBUeSxib29sIGlzTG9jYWxUb1VuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZWZpbml0aW9uLCBsbHZtOjpDb25zdGFudCAqVmFsKSB7CisgIFZhbHVlICpFbHRzW10gPSB7CisgICAgR2V0VGFnQ29uc3RhbnQoZHdhcmY6OkRXX1RBR19jb25zdGFudCksCisgICAgbGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCkpLAorICAgIENvbnRleHQsCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIE5hbWUpLAorICAgIE1EU3RyaW5nOjpnZXQoVk1Db250ZXh0LCBEaXNwbGF5TmFtZSksCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIExpbmthZ2VOYW1lKSwKKyAgICBGLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBMaW5lTm8pLAorICAgIFR5LAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KFZNQ29udGV4dCksIGlzTG9jYWxUb1VuaXQpLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KFZNQ29udGV4dCksIGlzRGVmaW5pdGlvbiksCisgICAgVmFsCisgIH07CisKKyAgVmFsdWUgKmNvbnN0ICpWcyA9ICZFbHRzWzBdOworICBNRE5vZGUgKk5vZGUgPSBNRE5vZGU6OmdldChWTUNvbnRleHQsVnMsIDEyKTsKKworICAvLyBDcmVhdGUgYSBuYW1lZCBtZXRhZGF0YSBzbyB0aGF0IHdlIGRvIG5vdCBsb3NlIHRoaXMgbWRub2RlLgorICBOYW1lZE1ETm9kZSAqTk1EID0gTS5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEoImxsdm0uZGJnLmd2Iik7CisgIE5NRC0+YWRkT3BlcmFuZChOb2RlKTsKKworICByZXR1cm4gRElHbG9iYWxWYXJpYWJsZShOb2RlKTsKK30KKworLy8vIENyZWF0ZVZhcmlhYmxlIC0gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUuCitESVZhcmlhYmxlIERJRmFjdG9yeTo6Q3JlYXRlVmFyaWFibGUodW5zaWduZWQgVGFnLCBESURlc2NyaXB0b3IgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlIFR5LCBib29sIEFsd2F5c1ByZXNlcnZlKSB7CisgIFZhbHVlICpFbHRzW10gPSB7CisgICAgR2V0VGFnQ29uc3RhbnQoVGFnKSwKKyAgICBDb250ZXh0LAorICAgIE1EU3RyaW5nOjpnZXQoVk1Db250ZXh0LCBOYW1lKSwKKyAgICBGLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBMaW5lTm8pLAorICAgIFR5LAorICB9OworICBNRE5vZGUgKk5vZGUgPSBNRE5vZGU6OmdldChWTUNvbnRleHQsICZFbHRzWzBdLCA2KTsKKyAgaWYgKEFsd2F5c1ByZXNlcnZlKSB7CisgICAgLy8gVGhlIG9wdGltaXplciBtYXkgcmVtb3ZlIGxvY2FsIHZhcmlhYmxlLiBJZiB0aGVyZSBpcyBhbiBpbnRlcmVzdAorICAgIC8vIHRvIHByZXNlcnZlIHZhcmlhYmxlIGluZm8gaW4gc3VjaCBzaXR1YXRpb24gdGhlbiBzdGFzaCBpdCBpbiBhCisgICAgLy8gbmFtZWQgbWRub2RlLgorICAgIERJU3VicHJvZ3JhbSBGbihnZXRESVN1YnByb2dyYW0oQ29udGV4dCkpOworICAgIFN0cmluZ1JlZiBGTmFtZSA9ICJmbiI7CisgICAgaWYgKEZuLmdldEZ1bmN0aW9uKCkpCisgICAgICBGTmFtZSA9IEZuLmdldEZ1bmN0aW9uKCktPmdldE5hbWUoKTsKKyAgICBjaGFyIE9uZSA9ICdcMSc7CisgICAgaWYgKEZOYW1lLnN0YXJ0c3dpdGgoU3RyaW5nUmVmKCZPbmUsIDEpKSkKKyAgICAgIEZOYW1lID0gRk5hbWUuc3Vic3RyKDEpOworCisgICAgU21hbGxTdHJpbmc8MzI+IE91dDsKKyAgICBOYW1lZE1ETm9kZSAqRm5Mb2NhbHMgPQorICAgICAgTS5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEoVHdpbmUoImxsdm0uZGJnLmx2LiIsIEZOYW1lKS50b1N0cmluZ1JlZihPdXQpKTsKKyAgICBGbkxvY2Fscy0+YWRkT3BlcmFuZChOb2RlKTsKKyAgfQorICByZXR1cm4gRElWYXJpYWJsZShOb2RlKTsKK30KKworCisvLy8gQ3JlYXRlQ29tcGxleFZhcmlhYmxlIC0gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUKKy8vLyB3aGljaCBoYXMgYSBjb21wbGV4IGFkZHJlc3MgZXhwcmVzc2lvbiBmb3IgaXRzIGFkZHJlc3MuCitESVZhcmlhYmxlIERJRmFjdG9yeTo6Q3JlYXRlQ29tcGxleFZhcmlhYmxlKHVuc2lnbmVkIFRhZywgRElEZXNjcmlwdG9yIENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPFZhbHVlICosIDk+ICZhZGRyKSB7CisgIFNtYWxsVmVjdG9yPFZhbHVlICosIDk+IEVsdHM7CisgIEVsdHMucHVzaF9iYWNrKEdldFRhZ0NvbnN0YW50KFRhZykpOworICBFbHRzLnB1c2hfYmFjayhDb250ZXh0KTsKKyAgRWx0cy5wdXNoX2JhY2soTURTdHJpbmc6OmdldChWTUNvbnRleHQsIE5hbWUpKTsKKyAgRWx0cy5wdXNoX2JhY2soRik7CisgIEVsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBMaW5lTm8pKTsKKyAgRWx0cy5wdXNoX2JhY2soVHkpOworICBFbHRzLmluc2VydChFbHRzLmVuZCgpLCBhZGRyLmJlZ2luKCksIGFkZHIuZW5kKCkpOworCisgIHJldHVybiBESVZhcmlhYmxlKE1ETm9kZTo6Z2V0KFZNQ29udGV4dCwgJkVsdHNbMF0sIDYrYWRkci5zaXplKCkpKTsKK30KKworCisvLy8gQ3JlYXRlQmxvY2sgLSBUaGlzIGNyZWF0ZXMgYSBkZXNjcmlwdG9yIGZvciBhIGxleGljYWwgYmxvY2sgd2l0aCB0aGUKKy8vLyBzcGVjaWZpZWQgcGFyZW50IFZNQ29udGV4dC4KK0RJTGV4aWNhbEJsb2NrIERJRmFjdG9yeTo6Q3JlYXRlTGV4aWNhbEJsb2NrKERJRGVzY3JpcHRvciBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlIEYsIHVuc2lnbmVkIExpbmVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbCkgeworICAvLyBEZWZlYXQgTUROb2RlIHVuaXFpbmcgZm9yIGxleGljYWwgYmxvY2tzLgorICBzdGF0aWMgdW5zaWduZWQgaW50IHVuaXF1ZV9pZCA9IDA7CisgIFZhbHVlICpFbHRzW10gPSB7CisgICAgR2V0VGFnQ29uc3RhbnQoZHdhcmY6OkRXX1RBR19sZXhpY2FsX2Jsb2NrKSwKKyAgICBDb250ZXh0LAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBMaW5lTm8pLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBDb2wpLAorICAgIEYsCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCksIHVuaXF1ZV9pZCsrKQorICB9OworICByZXR1cm4gRElMZXhpY2FsQmxvY2soTUROb2RlOjpnZXQoVk1Db250ZXh0LCAmRWx0c1swXSwgNikpOworfQorCisvLy8gQ3JlYXRlTmFtZVNwYWNlIC0gVGhpcyBjcmVhdGVzIG5ldyBkZXNjcmlwdG9yIGZvciBhIG5hbWVzcGFjZQorLy8vIHdpdGggdGhlIHNwZWNpZmllZCBwYXJlbnQgY29udGV4dC4KK0RJTmFtZVNwYWNlIERJRmFjdG9yeTo6Q3JlYXRlTmFtZVNwYWNlKERJRGVzY3JpcHRvciBDb250ZXh0LCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZU5vKSB7CisgIFZhbHVlICpFbHRzW10gPSB7CisgICAgR2V0VGFnQ29uc3RhbnQoZHdhcmY6OkRXX1RBR19uYW1lc3BhY2UpLAorICAgIENvbnRleHQsCisgICAgTURTdHJpbmc6OmdldChWTUNvbnRleHQsIE5hbWUpLAorICAgIEYsCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFZNQ29udGV4dCksIExpbmVObykKKyAgfTsKKyAgcmV0dXJuIERJTmFtZVNwYWNlKE1ETm9kZTo6Z2V0KFZNQ29udGV4dCwgJkVsdHNbMF0sIDUpKTsKK30KKworLy8vIENyZWF0ZUxvY2F0aW9uIC0gQ3JlYXRlcyBhIGRlYnVnIGluZm8gbG9jYXRpb24uCitESUxvY2F0aW9uIERJRmFjdG9yeTo6Q3JlYXRlTG9jYXRpb24odW5zaWduZWQgTGluZU5vLCB1bnNpZ25lZCBDb2x1bW5ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNjb3BlIFMsIERJTG9jYXRpb24gT3JpZ0xvYykgeworICBWYWx1ZSAqRWx0c1tdID0geworICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBMaW5lTm8pLAorICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWTUNvbnRleHQpLCBDb2x1bW5ObyksCisgICAgUywKKyAgICBPcmlnTG9jLAorICB9OworICByZXR1cm4gRElMb2NhdGlvbihNRE5vZGU6OmdldChWTUNvbnRleHQsICZFbHRzWzBdLCA0KSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWJ1Z0luZm9GaW5kZXIgaW1wbGVtZW50YXRpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIHByb2Nlc3NNb2R1bGUgLSBQcm9jZXNzIGVudGlyZSBtb2R1bGUgYW5kIGNvbGxlY3QgZGVidWcgaW5mby4KK3ZvaWQgRGVidWdJbmZvRmluZGVyOjpwcm9jZXNzTW9kdWxlKE1vZHVsZSAmTSkgeworICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgSSA9IE0uYmVnaW4oKSwgRSA9IE0uZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEZJID0gKCpJKS5iZWdpbigpLCBGRSA9ICgqSSkuZW5kKCk7IEZJICE9IEZFOyArK0ZJKQorICAgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBCSSA9ICgqRkkpLmJlZ2luKCksIEJFID0gKCpGSSkuZW5kKCk7IEJJICE9IEJFOworICAgICAgICAgICArK0JJKSB7CisgICAgICAgIERlYnVnTG9jIExvYyA9IEJJLT5nZXREZWJ1Z0xvYygpOworICAgICAgICBpZiAoTG9jLmlzVW5rbm93bigpKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIExMVk1Db250ZXh0ICZDdHggPSBCSS0+Z2V0Q29udGV4dCgpOworICAgICAgICBESURlc2NyaXB0b3IgU2NvcGUoTG9jLmdldFNjb3BlKEN0eCkpOworCisgICAgICAgIGlmIChTY29wZS5pc0NvbXBpbGVVbml0KCkpCisgICAgICAgICAgYWRkQ29tcGlsZVVuaXQoRElDb21waWxlVW5pdChTY29wZSkpOworICAgICAgICBlbHNlIGlmIChTY29wZS5pc1N1YnByb2dyYW0oKSkKKyAgICAgICAgICBwcm9jZXNzU3VicHJvZ3JhbShESVN1YnByb2dyYW0oU2NvcGUpKTsKKyAgICAgICAgZWxzZSBpZiAoU2NvcGUuaXNMZXhpY2FsQmxvY2soKSkKKyAgICAgICAgICBwcm9jZXNzTGV4aWNhbEJsb2NrKERJTGV4aWNhbEJsb2NrKFNjb3BlKSk7CisKKyAgICAgICAgaWYgKE1ETm9kZSAqSUEgPSBMb2MuZ2V0SW5saW5lZEF0KEN0eCkpCisgICAgICAgICAgcHJvY2Vzc0xvY2F0aW9uKERJTG9jYXRpb24oSUEpKTsKKyAgICAgIH0KKworICBpZiAoTmFtZWRNRE5vZGUgKk5NRCA9IE0uZ2V0TmFtZWRNZXRhZGF0YSgibGx2bS5kYmcuZ3YiKSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOTUQtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBESUdsb2JhbFZhcmlhYmxlIERJRyhjYXN0PE1ETm9kZT4oTk1ELT5nZXRPcGVyYW5kKGkpKSk7CisgICAgICBpZiAoYWRkR2xvYmFsVmFyaWFibGUoRElHKSkgeworICAgICAgICBhZGRDb21waWxlVW5pdChESUcuZ2V0Q29tcGlsZVVuaXQoKSk7CisgICAgICAgIHByb2Nlc3NUeXBlKERJRy5nZXRUeXBlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChOYW1lZE1ETm9kZSAqTk1EID0gTS5nZXROYW1lZE1ldGFkYXRhKCJsbHZtLmRiZy5zcCIpKQorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOTUQtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgcHJvY2Vzc1N1YnByb2dyYW0oRElTdWJwcm9ncmFtKE5NRC0+Z2V0T3BlcmFuZChpKSkpOworfQorCisvLy8gcHJvY2Vzc0xvY2F0aW9uIC0gUHJvY2VzcyBESUxvY2F0aW9uLgordm9pZCBEZWJ1Z0luZm9GaW5kZXI6OnByb2Nlc3NMb2NhdGlvbihESUxvY2F0aW9uIExvYykgeworICBpZiAoIUxvYy5WZXJpZnkoKSkgcmV0dXJuOworICBESURlc2NyaXB0b3IgUyhMb2MuZ2V0U2NvcGUoKSk7CisgIGlmIChTLmlzQ29tcGlsZVVuaXQoKSkKKyAgICBhZGRDb21waWxlVW5pdChESUNvbXBpbGVVbml0KFMpKTsKKyAgZWxzZSBpZiAoUy5pc1N1YnByb2dyYW0oKSkKKyAgICBwcm9jZXNzU3VicHJvZ3JhbShESVN1YnByb2dyYW0oUykpOworICBlbHNlIGlmIChTLmlzTGV4aWNhbEJsb2NrKCkpCisgICAgcHJvY2Vzc0xleGljYWxCbG9jayhESUxleGljYWxCbG9jayhTKSk7CisgIHByb2Nlc3NMb2NhdGlvbihMb2MuZ2V0T3JpZ0xvY2F0aW9uKCkpOworfQorCisvLy8gcHJvY2Vzc1R5cGUgLSBQcm9jZXNzIERJVHlwZS4KK3ZvaWQgRGVidWdJbmZvRmluZGVyOjpwcm9jZXNzVHlwZShESVR5cGUgRFQpIHsKKyAgaWYgKCFhZGRUeXBlKERUKSkKKyAgICByZXR1cm47CisKKyAgYWRkQ29tcGlsZVVuaXQoRFQuZ2V0Q29tcGlsZVVuaXQoKSk7CisgIGlmIChEVC5pc0NvbXBvc2l0ZVR5cGUoKSkgeworICAgIERJQ29tcG9zaXRlVHlwZSBEQ1QoRFQpOworICAgIHByb2Nlc3NUeXBlKERDVC5nZXRUeXBlRGVyaXZlZEZyb20oKSk7CisgICAgRElBcnJheSBEQSA9IERDVC5nZXRUeXBlQXJyYXkoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gREEuZ2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIERJRGVzY3JpcHRvciBEID0gREEuZ2V0RWxlbWVudChpKTsKKyAgICAgIGlmIChELmlzVHlwZSgpKQorICAgICAgICBwcm9jZXNzVHlwZShESVR5cGUoRCkpOworICAgICAgZWxzZSBpZiAoRC5pc1N1YnByb2dyYW0oKSkKKyAgICAgICAgcHJvY2Vzc1N1YnByb2dyYW0oRElTdWJwcm9ncmFtKEQpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoRFQuaXNEZXJpdmVkVHlwZSgpKSB7CisgICAgRElEZXJpdmVkVHlwZSBERFQoRFQpOworICAgIHByb2Nlc3NUeXBlKEREVC5nZXRUeXBlRGVyaXZlZEZyb20oKSk7CisgIH0KK30KKworLy8vIHByb2Nlc3NMZXhpY2FsQmxvY2sKK3ZvaWQgRGVidWdJbmZvRmluZGVyOjpwcm9jZXNzTGV4aWNhbEJsb2NrKERJTGV4aWNhbEJsb2NrIExCKSB7CisgIERJU2NvcGUgQ29udGV4dCA9IExCLmdldENvbnRleHQoKTsKKyAgaWYgKENvbnRleHQuaXNMZXhpY2FsQmxvY2soKSkKKyAgICByZXR1cm4gcHJvY2Vzc0xleGljYWxCbG9jayhESUxleGljYWxCbG9jayhDb250ZXh0KSk7CisgIGVsc2UKKyAgICByZXR1cm4gcHJvY2Vzc1N1YnByb2dyYW0oRElTdWJwcm9ncmFtKENvbnRleHQpKTsKK30KKworLy8vIHByb2Nlc3NTdWJwcm9ncmFtIC0gUHJvY2VzcyBESVN1YnByb2dyYW0uCit2b2lkIERlYnVnSW5mb0ZpbmRlcjo6cHJvY2Vzc1N1YnByb2dyYW0oRElTdWJwcm9ncmFtIFNQKSB7CisgIGlmICghYWRkU3VicHJvZ3JhbShTUCkpCisgICAgcmV0dXJuOworICBhZGRDb21waWxlVW5pdChTUC5nZXRDb21waWxlVW5pdCgpKTsKKyAgcHJvY2Vzc1R5cGUoU1AuZ2V0VHlwZSgpKTsKK30KKworLy8vIGFkZFR5cGUgLSBBZGQgdHlwZSBpbnRvIFR5cy4KK2Jvb2wgRGVidWdJbmZvRmluZGVyOjphZGRUeXBlKERJVHlwZSBEVCkgeworICBpZiAoIURULmlzVmFsaWQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFOb2Rlc1NlZW4uaW5zZXJ0KERUKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgVFlzLnB1c2hfYmFjayhEVCk7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gYWRkQ29tcGlsZVVuaXQgLSBBZGQgY29tcGlsZSB1bml0IGludG8gQ1VzLgorYm9vbCBEZWJ1Z0luZm9GaW5kZXI6OmFkZENvbXBpbGVVbml0KERJQ29tcGlsZVVuaXQgQ1UpIHsKKyAgaWYgKCFDVS5WZXJpZnkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFOb2Rlc1NlZW4uaW5zZXJ0KENVKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1VzLnB1c2hfYmFjayhDVSk7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gYWRkR2xvYmFsVmFyaWFibGUgLSBBZGQgZ2xvYmFsIHZhcmlhYmxlIGludG8gR1ZzLgorYm9vbCBEZWJ1Z0luZm9GaW5kZXI6OmFkZEdsb2JhbFZhcmlhYmxlKERJR2xvYmFsVmFyaWFibGUgRElHKSB7CisgIGlmICghRElEZXNjcmlwdG9yKERJRykuaXNHbG9iYWxWYXJpYWJsZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIU5vZGVzU2Vlbi5pbnNlcnQoRElHKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgR1ZzLnB1c2hfYmFjayhESUcpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gYWRkU3VicHJvZ3JhbSAtIEFkZCBzdWJwcmdvcmFtIGludG8gU1BzLgorYm9vbCBEZWJ1Z0luZm9GaW5kZXI6OmFkZFN1YnByb2dyYW0oRElTdWJwcm9ncmFtIFNQKSB7CisgIGlmICghRElEZXNjcmlwdG9yKFNQKS5pc1N1YnByb2dyYW0oKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFOb2Rlc1NlZW4uaW5zZXJ0KFNQKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU1BzLnB1c2hfYmFjayhTUCk7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gRmluZCB0aGUgZGVidWcgaW5mbyBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBnbG9iYWwgdmFyaWFibGUuCitzdGF0aWMgVmFsdWUgKmZpbmREYmdHbG9iYWxEZWNsYXJlKEdsb2JhbFZhcmlhYmxlICpWKSB7CisgIGNvbnN0IE1vZHVsZSAqTSA9IFYtPmdldFBhcmVudCgpOworICBOYW1lZE1ETm9kZSAqTk1EID0gTS0+Z2V0TmFtZWRNZXRhZGF0YSgibGx2bS5kYmcuZ3YiKTsKKyAgaWYgKCFOTUQpCisgICAgcmV0dXJuIDA7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5NRC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBESURlc2NyaXB0b3IgRElHKGNhc3Q8TUROb2RlPihOTUQtPmdldE9wZXJhbmQoaSkpKTsKKyAgICBpZiAoIURJRy5pc0dsb2JhbFZhcmlhYmxlKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoRElHbG9iYWxWYXJpYWJsZShESUcpLmdldEdsb2JhbCgpID09IFYpCisgICAgICByZXR1cm4gRElHOworICB9CisgIHJldHVybiAwOworfQorCitib29sIGxsdm06OmdldExvY2F0aW9uSW5mbyhjb25zdCBWYWx1ZSAqViwgc3RkOjpzdHJpbmcgJkRpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlR5cGUsIHVuc2lnbmVkICZMaW5lTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRmlsZSwgc3RkOjpzdHJpbmcgJkRpcikgeworICBESUNvbXBpbGVVbml0IFVuaXQ7CisgIERJVHlwZSBUeXBlRDsKKworICBpZiAoR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KGNvbnN0X2Nhc3Q8VmFsdWUqPihWKSkpIHsKKyAgICBWYWx1ZSAqRElHViA9IGZpbmREYmdHbG9iYWxEZWNsYXJlKEdWKTsKKyAgICBpZiAoIURJR1YpIHJldHVybiBmYWxzZTsKKyAgICBESUdsb2JhbFZhcmlhYmxlIFZhcihjYXN0PE1ETm9kZT4oRElHVikpOworCisgICAgU3RyaW5nUmVmIEQgPSBWYXIuZ2V0RGlzcGxheU5hbWUoKTsKKyAgICBpZiAoIUQuZW1wdHkoKSkKKyAgICAgIERpc3BsYXlOYW1lID0gRDsKKyAgICBMaW5lTm8gPSBWYXIuZ2V0TGluZU51bWJlcigpOworICAgIFVuaXQgPSBWYXIuZ2V0Q29tcGlsZVVuaXQoKTsKKyAgICBUeXBlRCA9IFZhci5nZXRUeXBlKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU3RyaW5nUmVmIFQgPSBUeXBlRC5nZXROYW1lKCk7CisgIGlmICghVC5lbXB0eSgpKQorICAgIFR5cGUgPSBUOworICBTdHJpbmdSZWYgRiA9IFVuaXQuZ2V0RmlsZW5hbWUoKTsKKyAgaWYgKCFGLmVtcHR5KCkpCisgICAgRmlsZSA9IEY7CisgIFN0cmluZ1JlZiBEID0gVW5pdC5nZXREaXJlY3RvcnkoKTsKKyAgaWYgKCFELmVtcHR5KCkpCisgICAgRGlyID0gRDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBnZXRESVN1YnByb2dyYW0gLSBGaW5kIHN1YnByb2dyYW0gdGhhdCBpcyBlbmNsb3NpbmcgdGhpcyBzY29wZS4KK0RJU3VicHJvZ3JhbSBsbHZtOjpnZXRESVN1YnByb2dyYW0oY29uc3QgTUROb2RlICpTY29wZSkgeworICBESURlc2NyaXB0b3IgRChTY29wZSk7CisgIGlmIChELmlzU3VicHJvZ3JhbSgpKQorICAgIHJldHVybiBESVN1YnByb2dyYW0oU2NvcGUpOworCisgIGlmIChELmlzTGV4aWNhbEJsb2NrKCkpCisgICAgcmV0dXJuIGdldERJU3VicHJvZ3JhbShESUxleGljYWxCbG9jayhTY29wZSkuZ2V0Q29udGV4dCgpKTsKKworICByZXR1cm4gRElTdWJwcm9ncmFtKCk7Cit9CisKKy8vLyBnZXRESUNvbXBvc2l0ZVR5cGUgLSBGaW5kIHVuZGVybHlpbmcgY29tcG9zaXRlIHR5cGUuCitESUNvbXBvc2l0ZVR5cGUgbGx2bTo6Z2V0RElDb21wb3NpdGVUeXBlKERJVHlwZSBUKSB7CisgIGlmIChULmlzQ29tcG9zaXRlVHlwZSgpKQorICAgIHJldHVybiBESUNvbXBvc2l0ZVR5cGUoVCk7CisKKyAgaWYgKFQuaXNEZXJpdmVkVHlwZSgpKQorICAgIHJldHVybiBnZXRESUNvbXBvc2l0ZVR5cGUoRElEZXJpdmVkVHlwZShUKS5nZXRUeXBlRGVyaXZlZEZyb20oKSk7CisKKyAgcmV0dXJuIERJQ29tcG9zaXRlVHlwZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0lQQS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JUEEvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3YWQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JUEEvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1pcGEKKyAgQ2FsbEdyYXBoLmNwcAorICBDYWxsR3JhcGhTQ0NQYXNzLmNwcAorICBGaW5kVXNlZFR5cGVzLmNwcAorICBHbG9iYWxzTW9kUmVmLmNwcAorICApCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvSVBBL0NhbGxHcmFwaC5jcHAgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvSVBBL0NhbGxHcmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2MzUyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JUEEvQ2FsbEdyYXBoLmNwcApAQCAtMCwwICsxLDMyNCBAQAorLy89PT0tIENhbGxHcmFwaC5jcHAgLSBCdWlsZCBhIE1vZHVsZSdzIGNhbGwgZ3JhcGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQ2FsbEdyYXBoIGNsYXNzIGFuZCBwcm92aWRlcyB0aGUgQmFzaWNDYWxsR3JhcGgKKy8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCYXNpY0NhbGxHcmFwaCBjbGFzcyBkZWZpbml0aW9uCisvLworY2xhc3MgQmFzaWNDYWxsR3JhcGggOiBwdWJsaWMgTW9kdWxlUGFzcywgcHVibGljIENhbGxHcmFwaCB7CisgIC8vIFJvb3QgaXMgcm9vdCBvZiB0aGUgY2FsbCBncmFwaCwgb3IgdGhlIGV4dGVybmFsIG5vZGUgaWYgYSAnbWFpbicgZnVuY3Rpb24KKyAgLy8gY291bGRuJ3QgYmUgZm91bmQuCisgIC8vCisgIENhbGxHcmFwaE5vZGUgKlJvb3Q7CisKKyAgLy8gRXh0ZXJuYWxDYWxsaW5nTm9kZSAtIFRoaXMgbm9kZSBoYXMgZWRnZXMgdG8gYWxsIGV4dGVybmFsIGZ1bmN0aW9ucyBhbmQKKyAgLy8gdGhvc2UgaW50ZXJuYWwgZnVuY3Rpb25zIHRoYXQgaGF2ZSB0aGVpciBhZGRyZXNzIHRha2VuLgorICBDYWxsR3JhcGhOb2RlICpFeHRlcm5hbENhbGxpbmdOb2RlOworCisgIC8vIENhbGxzRXh0ZXJuYWxOb2RlIC0gVGhpcyBub2RlIGhhcyBlZGdlcyB0byBpdCBmcm9tIGFsbCBmdW5jdGlvbnMgbWFraW5nCisgIC8vIGluZGlyZWN0IGNhbGxzIG9yIGNhbGxpbmcgYW4gZXh0ZXJuYWwgZnVuY3Rpb24uCisgIENhbGxHcmFwaE5vZGUgKkNhbGxzRXh0ZXJuYWxOb2RlOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBDbGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpbmZvCisgIEJhc2ljQ2FsbEdyYXBoKCkgOiBNb2R1bGVQYXNzKElEKSwgUm9vdCgwKSwgCisgICAgRXh0ZXJuYWxDYWxsaW5nTm9kZSgwKSwgQ2FsbHNFeHRlcm5hbE5vZGUoMCkge30KKworICAvLyBydW5Pbk1vZHVsZSAtIENvbXB1dGUgdGhlIGNhbGwgZ3JhcGggZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLgorICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKSB7CisgICAgQ2FsbEdyYXBoOjppbml0aWFsaXplKE0pOworICAgIAorICAgIEV4dGVybmFsQ2FsbGluZ05vZGUgPSBnZXRPckluc2VydEZ1bmN0aW9uKDApOworICAgIENhbGxzRXh0ZXJuYWxOb2RlID0gbmV3IENhbGxHcmFwaE5vZGUoMCk7CisgICAgUm9vdCA9IDA7CisgIAorICAgIC8vIEFkZCBldmVyeSBmdW5jdGlvbiB0byB0aGUgY2FsbCBncmFwaC4KKyAgICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgSSA9IE0uYmVnaW4oKSwgRSA9IE0uZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgYWRkVG9DYWxsR3JhcGgoSSk7CisgIAorICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGEgbWFpbiBmdW5jdGlvbiwgdXNlIHRoZSBleHRlcm5hbCBjYWxsIGdyYXBoIG5vZGUKKyAgICBpZiAoUm9vdCA9PSAwKSBSb290ID0gRXh0ZXJuYWxDYWxsaW5nTm9kZTsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICopIGNvbnN0IHsKKyAgICBPUyA8PCAiQ2FsbEdyYXBoIFJvb3QgaXM6ICI7CisgICAgaWYgKEZ1bmN0aW9uICpGID0gZ2V0Um9vdCgpLT5nZXRGdW5jdGlvbigpKQorICAgICAgT1MgPDwgRi0+Z2V0TmFtZSgpIDw8ICJcbiI7CisgICAgZWxzZSB7CisgICAgICBPUyA8PCAiPDxudWxsIGZ1bmN0aW9uOiAweCIgPDwgZ2V0Um9vdCgpIDw8ICI+PlxuIjsKKyAgICB9CisgICAgCisgICAgQ2FsbEdyYXBoOjpwcmludChPUywgMCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpIHsKKyAgICBkZXN0cm95KCk7CisgIH0KKyAgCisgIC8vLyBnZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlciAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBhIHBhc3MgaW1wbGVtZW50cworICAvLy8gYW4gYW5hbHlzaXMgaW50ZXJmYWNlIHRocm91Z2ggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiBuZWVkZWQsIGl0IHNob3VsZAorICAvLy8gb3ZlcnJpZGUgdGhpcyB0byBhZGp1c3QgdGhlIHRoaXMgcG9pbnRlciBhcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpZWQgcGFzcworICAvLy8gaW5mby4KKyAgdmlydHVhbCB2b2lkICpnZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlcihBbmFseXNpc0lEIFBJKSB7CisgICAgaWYgKFBJID09ICZDYWxsR3JhcGg6OklEKQorICAgICAgcmV0dXJuIChDYWxsR3JhcGgqKXRoaXM7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKyAgCisgIENhbGxHcmFwaE5vZGUqIGdldEV4dGVybmFsQ2FsbGluZ05vZGUoKSBjb25zdCB7IHJldHVybiBFeHRlcm5hbENhbGxpbmdOb2RlOyB9CisgIENhbGxHcmFwaE5vZGUqIGdldENhbGxzRXh0ZXJuYWxOb2RlKCkgICBjb25zdCB7IHJldHVybiBDYWxsc0V4dGVybmFsTm9kZTsgfQorCisgIC8vIGdldFJvb3QgLSBSZXR1cm4gdGhlIHJvb3Qgb2YgdGhlIGNhbGwgZ3JhcGgsIHdoaWNoIGlzIGVpdGhlciBtYWluLCBvciBpZgorICAvLyBtYWluIGNhbm5vdCBiZSBmb3VuZCwgdGhlIGV4dGVybmFsIG5vZGUuCisgIC8vCisgIENhbGxHcmFwaE5vZGUgKmdldFJvb3QoKSAgICAgICAgICAgICB7IHJldHVybiBSb290OyB9CisgIGNvbnN0IENhbGxHcmFwaE5vZGUgKmdldFJvb3QoKSBjb25zdCB7IHJldHVybiBSb290OyB9CisKK3ByaXZhdGU6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEltcGxlbWVudGF0aW9uIG9mIENhbGxHcmFwaCBjb25zdHJ1Y3Rpb24KKyAgLy8KKworICAvLyBhZGRUb0NhbGxHcmFwaCAtIEFkZCBhIGZ1bmN0aW9uIHRvIHRoZSBjYWxsIGdyYXBoLCBhbmQgbGluayB0aGUgbm9kZSB0byBhbGwKKyAgLy8gb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IGl0IGNhbGxzLgorICAvLworICB2b2lkIGFkZFRvQ2FsbEdyYXBoKEZ1bmN0aW9uICpGKSB7CisgICAgQ2FsbEdyYXBoTm9kZSAqTm9kZSA9IGdldE9ySW5zZXJ0RnVuY3Rpb24oRik7CisKKyAgICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGhhcyBleHRlcm5hbCBsaW5rYWdlLCBhbnl0aGluZyBjb3VsZCBjYWxsIGl0LgorICAgIGlmICghRi0+aGFzTG9jYWxMaW5rYWdlKCkpIHsKKyAgICAgIEV4dGVybmFsQ2FsbGluZ05vZGUtPmFkZENhbGxlZEZ1bmN0aW9uKENhbGxTaXRlKCksIE5vZGUpOworCisgICAgICAvLyBGb3VuZCB0aGUgZW50cnkgcG9pbnQ/CisgICAgICBpZiAoRi0+Z2V0TmFtZSgpID09ICJtYWluIikgeworICAgICAgICBpZiAoUm9vdCkgICAgLy8gRm91bmQgbXVsdGlwbGUgZXh0ZXJuYWwgbWFpbnM/ICBEb24ndCBwaWNrIG9uZS4KKyAgICAgICAgICBSb290ID0gRXh0ZXJuYWxDYWxsaW5nTm9kZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFJvb3QgPSBOb2RlOyAgICAgICAgICAvLyBGb3VuZCBhIG1haW4sIGtlZXAgdHJhY2sgb2YgaXQhCisgICAgICB9CisgICAgfQorCisgICAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdXNlcnMgb2YgdGhlIGZ1bmN0aW9uLCBsb29raW5nIGZvciBub24tY2FsbCB1c2VzLgorICAgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBJID0gRi0+dXNlX2JlZ2luKCksIEUgPSBGLT51c2VfZW5kKCk7IEkgIT0gRTsgKytJKXsKKyAgICAgIFVzZXIgKlUgPSAqSTsKKyAgICAgIGlmICgoIWlzYTxDYWxsSW5zdD4oVSkgJiYgIWlzYTxJbnZva2VJbnN0PihVKSkKKyAgICAgICAgICB8fCAhQ2FsbFNpdGUoY2FzdDxJbnN0cnVjdGlvbj4oVSkpLmlzQ2FsbGVlKEkpKSB7CisgICAgICAgIC8vIE5vdCBhIGNhbGwsIG9yIGJlaW5nIHVzZWQgYXMgYSBwYXJhbWV0ZXIgcmF0aGVyIHRoYW4gYXMgdGhlIGNhbGxlZS4KKyAgICAgICAgRXh0ZXJuYWxDYWxsaW5nTm9kZS0+YWRkQ2FsbGVkRnVuY3Rpb24oQ2FsbFNpdGUoKSwgTm9kZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoaXMgZnVuY3Rpb24gaXMgbm90IGRlZmluZWQgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0LCBpdCBjb3VsZCBjYWxsCisgICAgLy8gYW55dGhpbmcuCisgICAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSAmJiAhRi0+aXNJbnRyaW5zaWMoKSkKKyAgICAgIE5vZGUtPmFkZENhbGxlZEZ1bmN0aW9uKENhbGxTaXRlKCksIENhbGxzRXh0ZXJuYWxOb2RlKTsKKworICAgIC8vIExvb2sgZm9yIGNhbGxzIGJ5IHRoaXMgZnVuY3Rpb24uCisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBCQkUgPSBGLT5lbmQoKTsgQkIgIT0gQkJFOyArK0JCKQorICAgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSA9IEJCLT5iZWdpbigpLCBJRSA9IEJCLT5lbmQoKTsKKyAgICAgICAgICAgSUkgIT0gSUU7ICsrSUkpIHsKKyAgICAgICAgQ2FsbFNpdGUgQ1MoY2FzdDxWYWx1ZT4oSUkpKTsKKyAgICAgICAgaWYgKENTICYmICFpc2E8RGJnSW5mb0ludHJpbnNpYz4oSUkpKSB7CisgICAgICAgICAgY29uc3QgRnVuY3Rpb24gKkNhbGxlZSA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCk7CisgICAgICAgICAgaWYgKENhbGxlZSkKKyAgICAgICAgICAgIE5vZGUtPmFkZENhbGxlZEZ1bmN0aW9uKENTLCBnZXRPckluc2VydEZ1bmN0aW9uKENhbGxlZSkpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE5vZGUtPmFkZENhbGxlZEZ1bmN0aW9uKENTLCBDYWxsc0V4dGVybmFsTm9kZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIC8vCisgIC8vIGRlc3Ryb3kgLSBSZWxlYXNlIG1lbW9yeSBmb3IgdGhlIGNhbGwgZ3JhcGgKKyAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKSB7CisgICAgLy8vIENhbGxzRXh0ZXJuYWxOb2RlIGlzIG5vdCBpbiB0aGUgZnVuY3Rpb24gbWFwLCBkZWxldGUgaXQgZXhwbGljaXRseS4KKyAgICBpZiAoQ2FsbHNFeHRlcm5hbE5vZGUpIHsKKyAgICAgIENhbGxzRXh0ZXJuYWxOb2RlLT5hbGxSZWZlcmVuY2VzRHJvcHBlZCgpOworICAgICAgZGVsZXRlIENhbGxzRXh0ZXJuYWxOb2RlOworICAgICAgQ2FsbHNFeHRlcm5hbE5vZGUgPSAwOworICAgIH0KKyAgICBDYWxsR3JhcGg6OmRlc3Ryb3koKTsKKyAgfQorfTsKKworfSAvL0VuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK3N0YXRpYyBSZWdpc3RlckFuYWx5c2lzR3JvdXA8Q2FsbEdyYXBoPiBYKCJDYWxsIEdyYXBoIik7CitJTklUSUFMSVpFX0FHX1BBU1MoQmFzaWNDYWxsR3JhcGgsIENhbGxHcmFwaCwgImJhc2ljY2ciLAorICAgICAgICAgICAgICAgICAgICJCYXNpYyBDYWxsR3JhcGggQ29uc3RydWN0aW9uIiwgZmFsc2UsIHRydWUsIHRydWUpOworCitjaGFyIENhbGxHcmFwaDo6SUQgPSAwOworY2hhciBCYXNpY0NhbGxHcmFwaDo6SUQgPSAwOworCit2b2lkIENhbGxHcmFwaDo6aW5pdGlhbGl6ZShNb2R1bGUgJk0pIHsKKyAgTW9kID0gJk07Cit9CisKK3ZvaWQgQ2FsbEdyYXBoOjpkZXN0cm95KCkgeworICBpZiAoRnVuY3Rpb25NYXAuZW1wdHkoKSkgcmV0dXJuOworICAKKyAgLy8gUmVzZXQgYWxsIG5vZGUncyB1c2UgY291bnRzIHRvIHplcm8gYmVmb3JlIGRlbGV0aW5nIHRoZW0gdG8gcHJldmVudCBhbgorICAvLyBhc3NlcnRpb24gZnJvbSBmaXJpbmcuCisjaWZuZGVmIE5ERUJVRworICBmb3IgKEZ1bmN0aW9uTWFwVHk6Oml0ZXJhdG9yIEkgPSBGdW5jdGlvbk1hcC5iZWdpbigpLCBFID0gRnVuY3Rpb25NYXAuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgSS0+c2Vjb25kLT5hbGxSZWZlcmVuY2VzRHJvcHBlZCgpOworI2VuZGlmCisgIAorICBmb3IgKEZ1bmN0aW9uTWFwVHk6Oml0ZXJhdG9yIEkgPSBGdW5jdGlvbk1hcC5iZWdpbigpLCBFID0gRnVuY3Rpb25NYXAuZW5kKCk7CisgICAgICBJICE9IEU7ICsrSSkKKyAgICBkZWxldGUgSS0+c2Vjb25kOworICBGdW5jdGlvbk1hcC5jbGVhcigpOworfQorCit2b2lkIENhbGxHcmFwaDo6cHJpbnQocmF3X29zdHJlYW0gJk9TLCBNb2R1bGUqKSBjb25zdCB7CisgIGZvciAoQ2FsbEdyYXBoOjpjb25zdF9pdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBJLT5zZWNvbmQtPnByaW50KE9TKTsKK30KK3ZvaWQgQ2FsbEdyYXBoOjpkdW1wKCkgY29uc3QgeworICBwcmludChkYmdzKCksIDApOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW1wbGVtZW50YXRpb25zIG9mIHB1YmxpYyBtb2RpZmljYXRpb24gbWV0aG9kcworLy8KKworLy8gcmVtb3ZlRnVuY3Rpb25Gcm9tTW9kdWxlIC0gVW5saW5rIHRoZSBmdW5jdGlvbiBmcm9tIHRoaXMgbW9kdWxlLCByZXR1cm5pbmcKKy8vIGl0LiAgQmVjYXVzZSB0aGlzIHJlbW92ZXMgdGhlIGZ1bmN0aW9uIGZyb20gdGhlIG1vZHVsZSwgdGhlIGNhbGwgZ3JhcGggbm9kZQorLy8gaXMgZGVzdHJveWVkLiAgVGhpcyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjYWxsIGFueSBvdGhlcgorLy8gZnVuY3Rpb25zIChpZSwgdGhlcmUgYXJlIG5vIGVkZ2VzIGluIGl0J3MgQ0dOKS4gIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzCisvLyBpcyB0byBkcm9wQWxsUmVmZXJlbmNlcyBiZWZvcmUgY2FsbGluZyB0aGlzLgorLy8KK0Z1bmN0aW9uICpDYWxsR3JhcGg6OnJlbW92ZUZ1bmN0aW9uRnJvbU1vZHVsZShDYWxsR3JhcGhOb2RlICpDR04pIHsKKyAgYXNzZXJ0KENHTi0+ZW1wdHkoKSAmJiAiQ2Fubm90IHJlbW92ZSBmdW5jdGlvbiBmcm9tIGNhbGwgIgorICAgICAgICAgImdyYXBoIGlmIGl0IHJlZmVyZW5jZXMgb3RoZXIgZnVuY3Rpb25zISIpOworICBGdW5jdGlvbiAqRiA9IENHTi0+Z2V0RnVuY3Rpb24oKTsgLy8gR2V0IHRoZSBmdW5jdGlvbiBmb3IgdGhlIGNhbGwgZ3JhcGggbm9kZQorICBkZWxldGUgQ0dOOyAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBjYWxsIGdyYXBoIG5vZGUgZm9yIHRoaXMgZnVuYworICBGdW5jdGlvbk1hcC5lcmFzZShGKTsgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjYWxsIGdyYXBoIG5vZGUgZnJvbSB0aGUgbWFwCisKKyAgTW9kLT5nZXRGdW5jdGlvbkxpc3QoKS5yZW1vdmUoRik7CisgIHJldHVybiBGOworfQorCisvLyBnZXRPckluc2VydEZ1bmN0aW9uIC0gVGhpcyBtZXRob2QgaXMgaWRlbnRpY2FsIHRvIGNhbGxpbmcgb3BlcmF0b3JbXSwgYnV0CisvLyBpdCB3aWxsIGluc2VydCBhIG5ldyBDYWxsR3JhcGhOb2RlIGZvciB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlmIG9uZSBkb2VzCisvLyBub3QgYWxyZWFkeSBleGlzdC4KK0NhbGxHcmFwaE5vZGUgKkNhbGxHcmFwaDo6Z2V0T3JJbnNlcnRGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAqRikgeworICBDYWxsR3JhcGhOb2RlIComQ0dOID0gRnVuY3Rpb25NYXBbRl07CisgIGlmIChDR04pIHJldHVybiBDR047CisgIAorICBhc3NlcnQoKCFGIHx8IEYtPmdldFBhcmVudCgpID09IE1vZCkgJiYgIkZ1bmN0aW9uIG5vdCBpbiBjdXJyZW50IG1vZHVsZSEiKTsKKyAgcmV0dXJuIENHTiA9IG5ldyBDYWxsR3JhcGhOb2RlKGNvbnN0X2Nhc3Q8RnVuY3Rpb24qPihGKSk7Cit9CisKK3ZvaWQgQ2FsbEdyYXBoTm9kZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmIChGdW5jdGlvbiAqRiA9IGdldEZ1bmN0aW9uKCkpCisgICAgT1MgPDwgIkNhbGwgZ3JhcGggbm9kZSBmb3IgZnVuY3Rpb246ICciIDw8IEYtPmdldE5hbWUoKSA8PCAiJyI7CisgIGVsc2UKKyAgICBPUyA8PCAiQ2FsbCBncmFwaCBub2RlIDw8bnVsbCBmdW5jdGlvbj4+IjsKKyAgCisgIE9TIDw8ICI8PCIgPDwgdGhpcyA8PCAiPj4gICN1c2VzPSIgPDwgZ2V0TnVtUmVmZXJlbmNlcygpIDw8ICdcbic7CisKKyAgZm9yIChjb25zdF9pdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE9TIDw8ICIgIENTPCIgPDwgSS0+Zmlyc3QgPDwgIj4gY2FsbHMgIjsKKyAgICBpZiAoRnVuY3Rpb24gKkZJID0gSS0+c2Vjb25kLT5nZXRGdW5jdGlvbigpKQorICAgICAgT1MgPDwgImZ1bmN0aW9uICciIDw8IEZJLT5nZXROYW1lKCkgPDwiJ1xuIjsKKyAgICBlbHNlCisgICAgICBPUyA8PCAiZXh0ZXJuYWwgbm9kZVxuIjsKKyAgfQorICBPUyA8PCAnXG4nOworfQorCit2b2lkIENhbGxHcmFwaE5vZGU6OmR1bXAoKSBjb25zdCB7IHByaW50KGRiZ3MoKSk7IH0KKworLy8vIHJlbW92ZUNhbGxFZGdlRm9yIC0gVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgZWRnZSBpbiB0aGUgbm9kZSBmb3IgdGhlCisvLy8gc3BlY2lmaWVkIGNhbGwgc2l0ZS4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCB0YWtlcyBsaW5lYXIgdGltZSwgc28gaXQKKy8vLyBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCit2b2lkIENhbGxHcmFwaE5vZGU6OnJlbW92ZUNhbGxFZGdlRm9yKENhbGxTaXRlIENTKSB7CisgIGZvciAoQ2FsbGVkRnVuY3Rpb25zVmVjdG9yOjppdGVyYXRvciBJID0gQ2FsbGVkRnVuY3Rpb25zLmJlZ2luKCk7IDsgKytJKSB7CisgICAgYXNzZXJ0KEkgIT0gQ2FsbGVkRnVuY3Rpb25zLmVuZCgpICYmICJDYW5ub3QgZmluZCBjYWxsc2l0ZSB0byByZW1vdmUhIik7CisgICAgaWYgKEktPmZpcnN0ID09IENTLmdldEluc3RydWN0aW9uKCkpIHsKKyAgICAgIEktPnNlY29uZC0+RHJvcFJlZigpOworICAgICAgKkkgPSBDYWxsZWRGdW5jdGlvbnMuYmFjaygpOworICAgICAgQ2FsbGVkRnVuY3Rpb25zLnBvcF9iYWNrKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKKworLy8gcmVtb3ZlQW55Q2FsbEVkZ2VUbyAtIFRoaXMgbWV0aG9kIHJlbW92ZXMgYW55IGNhbGwgZWRnZXMgZnJvbSB0aGlzIG5vZGUgdG8KKy8vIHRoZSBzcGVjaWZpZWQgY2FsbGVlIGZ1bmN0aW9uLiAgVGhpcyB0YWtlcyBtb3JlIHRpbWUgdG8gZXhlY3V0ZSB0aGFuCisvLyByZW1vdmVDYWxsRWRnZVRvLCBzbyBpdCBzaG91bGQgbm90IGJlIHVzZWQgdW5sZXNzIG5lY2Vzc2FyeS4KK3ZvaWQgQ2FsbEdyYXBoTm9kZTo6cmVtb3ZlQW55Q2FsbEVkZ2VUbyhDYWxsR3JhcGhOb2RlICpDYWxsZWUpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENhbGxlZEZ1bmN0aW9ucy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChDYWxsZWRGdW5jdGlvbnNbaV0uc2Vjb25kID09IENhbGxlZSkgeworICAgICAgQ2FsbGVlLT5Ecm9wUmVmKCk7CisgICAgICBDYWxsZWRGdW5jdGlvbnNbaV0gPSBDYWxsZWRGdW5jdGlvbnMuYmFjaygpOworICAgICAgQ2FsbGVkRnVuY3Rpb25zLnBvcF9iYWNrKCk7CisgICAgICAtLWk7IC0tZTsKKyAgICB9Cit9CisKKy8vLyByZW1vdmVPbmVBYnN0cmFjdEVkZ2VUbyAtIFJlbW92ZSBvbmUgZWRnZSBhc3NvY2lhdGVkIHdpdGggYSBudWxsIGNhbGxzaXRlCisvLy8gZnJvbSB0aGlzIG5vZGUgdG8gdGhlIHNwZWNpZmllZCBjYWxsZWUgZnVuY3Rpb24uCit2b2lkIENhbGxHcmFwaE5vZGU6OnJlbW92ZU9uZUFic3RyYWN0RWRnZVRvKENhbGxHcmFwaE5vZGUgKkNhbGxlZSkgeworICBmb3IgKENhbGxlZEZ1bmN0aW9uc1ZlY3Rvcjo6aXRlcmF0b3IgSSA9IENhbGxlZEZ1bmN0aW9ucy5iZWdpbigpOyA7ICsrSSkgeworICAgIGFzc2VydChJICE9IENhbGxlZEZ1bmN0aW9ucy5lbmQoKSAmJiAiQ2Fubm90IGZpbmQgY2FsbGVlIHRvIHJlbW92ZSEiKTsKKyAgICBDYWxsUmVjb3JkICZDUiA9ICpJOworICAgIGlmIChDUi5zZWNvbmQgPT0gQ2FsbGVlICYmIENSLmZpcnN0ID09IDApIHsKKyAgICAgIENhbGxlZS0+RHJvcFJlZigpOworICAgICAgKkkgPSBDYWxsZWRGdW5jdGlvbnMuYmFjaygpOworICAgICAgQ2FsbGVkRnVuY3Rpb25zLnBvcF9iYWNrKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKKy8vLyByZXBsYWNlQ2FsbEVkZ2UgLSBUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgZWRnZSBpbiB0aGUgbm9kZSBmb3IgdGhlCisvLy8gc3BlY2lmaWVkIGNhbGwgc2l0ZSB3aXRoIGEgbmV3IG9uZS4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCB0YWtlcyBsaW5lYXIKKy8vLyB0aW1lLCBzbyBpdCBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCit2b2lkIENhbGxHcmFwaE5vZGU6OnJlcGxhY2VDYWxsRWRnZShDYWxsU2l0ZSBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxTaXRlIE5ld0NTLCBDYWxsR3JhcGhOb2RlICpOZXdOb2RlKXsKKyAgZm9yIChDYWxsZWRGdW5jdGlvbnNWZWN0b3I6Oml0ZXJhdG9yIEkgPSBDYWxsZWRGdW5jdGlvbnMuYmVnaW4oKTsgOyArK0kpIHsKKyAgICBhc3NlcnQoSSAhPSBDYWxsZWRGdW5jdGlvbnMuZW5kKCkgJiYgIkNhbm5vdCBmaW5kIGNhbGxzaXRlIHRvIHJlbW92ZSEiKTsKKyAgICBpZiAoSS0+Zmlyc3QgPT0gQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSkgeworICAgICAgSS0+c2Vjb25kLT5Ecm9wUmVmKCk7CisgICAgICBJLT5maXJzdCA9IE5ld0NTLmdldEluc3RydWN0aW9uKCk7CisgICAgICBJLT5zZWNvbmQgPSBOZXdOb2RlOworICAgICAgTmV3Tm9kZS0+QWRkUmVmKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKKy8vIEVudXNlIHRoYXQgdXNlcnMgb2YgQ2FsbEdyYXBoLmggYWxzbyBsaW5rIHdpdGggdGhpcyBmaWxlCitERUZJTklOR19GSUxFX0ZPUihDYWxsR3JhcGgpCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvSVBBL0NhbGxHcmFwaFNDQ1Bhc3MuY3BwIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0lQQS9DYWxsR3JhcGhTQ0NQYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2EyN2NiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0lQQS9DYWxsR3JhcGhTQ0NQYXNzLmNwcApAQCAtMCwwICsxLDYwOSBAQAorLy89PT0tIENhbGxHcmFwaFNDQ1Bhc3MuY3BwIC0gUGFzcyB0aGF0IG9wZXJhdGVzIEJVIG9uIGNhbGwgZ3JhcGggLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQ2FsbEdyYXBoU0NDUGFzcyBjbGFzcywgd2hpY2ggaXMgdXNlZCBmb3IgcGFzc2VzCisvLyB3aGljaCBhcmUgaW1wbGVtZW50ZWQgYXMgYm90dG9tLXVwIHRyYXZlcnNhbHMgb24gdGhlIGNhbGwgZ3JhcGguICBCZWNhdXNlCisvLyB0aGVyZSBtYXkgYmUgY3ljbGVzIGluIHRoZSBjYWxsIGdyYXBoLCBwYXNzZXMgb2YgdGhpcyB0eXBlIG9wZXJhdGUgb24gdGhlCisvLyBjYWxsLWdyYXBoIGluIFNDQyBvcmRlcjogdGhhdCBpcywgdGhleSBwcm9jZXNzIGZ1bmN0aW9uIGJvdHRvbS11cCwgZXhjZXB0IGZvcgorLy8gcmVjdXJzaXZlIGZ1bmN0aW9ucywgd2hpY2ggdGhleSBwcm9jZXNzIGFsbCBhdCBvbmNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiY2dzY2MtcGFzc21nciIKKyNpbmNsdWRlICJsbHZtL0NhbGxHcmFwaFNDQ1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzTWFuYWdlcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NhbGxHcmFwaC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NDQ0l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RpbWVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIGNsOjpvcHQ8dW5zaWduZWQ+IAorTWF4SXRlcmF0aW9ucygibWF4LWNnLXNjYy1pdGVyYXRpb25zIiwgY2w6OlJlYWxseUhpZGRlbiwgY2w6OmluaXQoNCkpOworCitTVEFUSVNUSUMoTWF4U0NDSXRlcmF0aW9ucywgIk1heGltdW0gQ0dTQ0NQYXNzTWdyIGl0ZXJhdGlvbnMgb24gb25lIFNDQyIpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ0dQYXNzTWFuYWdlcgorLy8KKy8vLyBDR1Bhc3NNYW5hZ2VyIG1hbmFnZXMgRlBQYXNzTWFuYWdlcnMgYW5kIENhbGxHcmFwaFNDQ1Bhc3Nlcy4KKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ0dQYXNzTWFuYWdlciA6IHB1YmxpYyBNb2R1bGVQYXNzLCBwdWJsaWMgUE1EYXRhTWFuYWdlciB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBleHBsaWNpdCBDR1Bhc3NNYW5hZ2VyKGludCBEZXB0aCkgCisgICAgOiBNb2R1bGVQYXNzKElEKSwgUE1EYXRhTWFuYWdlcihEZXB0aCkgeyB9CisKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisgIC8vLyB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBtb2R1bGUsIGFuZCBpZiBzbywgcmV0dXJuIHRydWUuCisgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICBib29sIGRvSW5pdGlhbGl6YXRpb24oQ2FsbEdyYXBoICZDRyk7CisgIGJvb2wgZG9GaW5hbGl6YXRpb24oQ2FsbEdyYXBoICZDRyk7CisKKyAgLy8vIFBhc3MgTWFuYWdlciBpdHNlbGYgZG9lcyBub3QgaW52YWxpZGF0ZSBhbnkgYW5hbHlzaXMgaW5mby4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0IHsKKyAgICAvLyBDR1Bhc3NNYW5hZ2VyIHdhbGtzIFNDQyBhbmQgaXQgbmVlZHMgQ2FsbEdyYXBoLgorICAgIEluZm8uYWRkUmVxdWlyZWQ8Q2FsbEdyYXBoPigpOworICAgIEluZm8uc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiQ2FsbEdyYXBoIFBhc3MgTWFuYWdlciI7CisgIH0KKworICB2aXJ0dWFsIFBNRGF0YU1hbmFnZXIgKmdldEFzUE1EYXRhTWFuYWdlcigpIHsgcmV0dXJuIHRoaXM7IH0KKyAgdmlydHVhbCBQYXNzICpnZXRBc1Bhc3MoKSB7IHJldHVybiB0aGlzOyB9CisKKyAgLy8gUHJpbnQgcGFzc2VzIG1hbmFnZWQgYnkgdGhpcyBtYW5hZ2VyCisgIHZvaWQgZHVtcFBhc3NTdHJ1Y3R1cmUodW5zaWduZWQgT2Zmc2V0KSB7CisgICAgZXJycygpLmluZGVudChPZmZzZXQqMikgPDwgIkNhbGwgR3JhcGggU0NDIFBhc3MgTWFuYWdlclxuIjsKKyAgICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRQYXNzZXMoKTsgKytJbmRleCkgeworICAgICAgUGFzcyAqUCA9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgICAgUC0+ZHVtcFBhc3NTdHJ1Y3R1cmUoT2Zmc2V0ICsgMSk7CisgICAgICBkdW1wTGFzdFVzZXMoUCwgT2Zmc2V0KzEpOworICAgIH0KKyAgfQorCisgIFBhc3MgKmdldENvbnRhaW5lZFBhc3ModW5zaWduZWQgTikgeworICAgIGFzc2VydChOIDwgUGFzc1ZlY3Rvci5zaXplKCkgJiYgIlBhc3MgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UGFzcyAqPihQYXNzVmVjdG9yW05dKTsKKyAgfQorCisgIHZpcnR1YWwgUGFzc01hbmFnZXJUeXBlIGdldFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IHsgCisgICAgcmV0dXJuIFBNVF9DYWxsR3JhcGhQYXNzTWFuYWdlcjsgCisgIH0KKyAgCitwcml2YXRlOgorICBib29sIFJ1bkFsbFBhc3Nlc09uU0NDKENhbGxHcmFwaFNDQyAmQ3VyU0NDLCBDYWxsR3JhcGggJkNHLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkRldmlydHVhbGl6ZWRDYWxsKTsKKyAgCisgIGJvb2wgUnVuUGFzc09uU0NDKFBhc3MgKlAsIENhbGxHcmFwaFNDQyAmQ3VyU0NDLAorICAgICAgICAgICAgICAgICAgICBDYWxsR3JhcGggJkNHLCBib29sICZDYWxsR3JhcGhVcFRvRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAmRGV2aXJ0dWFsaXplZENhbGwpOworICBib29sIFJlZnJlc2hDYWxsR3JhcGgoQ2FsbEdyYXBoU0NDICZDdXJTQ0MsIENhbGxHcmFwaCAmQ0csCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ2hlY2tpbmdNb2RlKTsKK307CisKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKK2NoYXIgQ0dQYXNzTWFuYWdlcjo6SUQgPSAwOworCisKK2Jvb2wgQ0dQYXNzTWFuYWdlcjo6UnVuUGFzc09uU0NDKFBhc3MgKlAsIENhbGxHcmFwaFNDQyAmQ3VyU0NDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEdyYXBoICZDRywgYm9vbCAmQ2FsbEdyYXBoVXBUb0RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZEZXZpcnR1YWxpemVkQ2FsbCkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgUE1EYXRhTWFuYWdlciAqUE0gPSBQLT5nZXRBc1BNRGF0YU1hbmFnZXIoKTsKKworICBpZiAoUE0gPT0gMCkgeworICAgIENhbGxHcmFwaFNDQ1Bhc3MgKkNHU1AgPSAoQ2FsbEdyYXBoU0NDUGFzcyopUDsKKyAgICBpZiAoIUNhbGxHcmFwaFVwVG9EYXRlKSB7CisgICAgICBEZXZpcnR1YWxpemVkQ2FsbCB8PSBSZWZyZXNoQ2FsbEdyYXBoKEN1clNDQywgQ0csIGZhbHNlKTsKKyAgICAgIENhbGxHcmFwaFVwVG9EYXRlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB7CisgICAgICBUaW1lUmVnaW9uIFBhc3NUaW1lcihnZXRQYXNzVGltZXIoQ0dTUCkpOworICAgICAgQ2hhbmdlZCA9IENHU1AtPnJ1bk9uU0NDKEN1clNDQyk7CisgICAgfQorICAgIAorICAgIC8vIEFmdGVyIHRoZSBDR1NDQ1Bhc3MgaXMgZG9uZSwgd2hlbiBhc3NlcnRpb25zIGFyZSBlbmFibGVkLCB1c2UKKyAgICAvLyBSZWZyZXNoQ2FsbEdyYXBoIHRvIHZlcmlmeSB0aGF0IHRoZSBjYWxsZ3JhcGggd2FzIGNvcnJlY3RseSB1cGRhdGVkLgorI2lmbmRlZiBOREVCVUcKKyAgICBpZiAoQ2hhbmdlZCkKKyAgICAgIFJlZnJlc2hDYWxsR3JhcGgoQ3VyU0NDLCBDRywgdHJ1ZSk7CisjZW5kaWYKKyAgICAKKyAgICByZXR1cm4gQ2hhbmdlZDsKKyAgfQorICAKKyAgCisgIGFzc2VydChQTS0+Z2V0UGFzc01hbmFnZXJUeXBlKCkgPT0gUE1UX0Z1bmN0aW9uUGFzc01hbmFnZXIgJiYKKyAgICAgICAgICJJbnZhbGlkIENHUGFzc01hbmFnZXIgbWVtYmVyIik7CisgIEZQUGFzc01hbmFnZXIgKkZQUCA9IChGUFBhc3NNYW5hZ2VyKilQOworICAKKyAgLy8gUnVuIHBhc3MgUCBvbiBhbGwgZnVuY3Rpb25zIGluIHRoZSBjdXJyZW50IFNDQy4KKyAgZm9yIChDYWxsR3JhcGhTQ0M6Oml0ZXJhdG9yIEkgPSBDdXJTQ0MuYmVnaW4oKSwgRSA9IEN1clNDQy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChGdW5jdGlvbiAqRiA9ICgqSSktPmdldEZ1bmN0aW9uKCkpIHsKKyAgICAgIGR1bXBQYXNzSW5mbyhQLCBFWEVDVVRJT05fTVNHLCBPTl9GVU5DVElPTl9NU0csIEYtPmdldE5hbWUoKSk7CisgICAgICBUaW1lUmVnaW9uIFBhc3NUaW1lcihnZXRQYXNzVGltZXIoRlBQKSk7CisgICAgICBDaGFuZ2VkIHw9IEZQUC0+cnVuT25GdW5jdGlvbigqRik7CisgICAgfQorICB9CisgIAorICAvLyBUaGUgZnVuY3Rpb24gcGFzcyhlcykgbW9kaWZpZWQgdGhlIElSLCB0aGV5IG1heSBoYXZlIGNsb2JiZXJlZCB0aGUKKyAgLy8gY2FsbGdyYXBoLgorICBpZiAoQ2hhbmdlZCAmJiBDYWxsR3JhcGhVcFRvRGF0ZSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiQ0dTQ0NQQVNTTUdSOiBQYXNzIERpcnRpZWQgU0NDOiAiCisgICAgICAgICAgICAgICAgIDw8IFAtPmdldFBhc3NOYW1lKCkgPDwgJ1xuJyk7CisgICAgQ2FsbEdyYXBoVXBUb0RhdGUgPSBmYWxzZTsKKyAgfQorICByZXR1cm4gQ2hhbmdlZDsKK30KKworCisvLy8gUmVmcmVzaENhbGxHcmFwaCAtIFNjYW4gdGhlIGZ1bmN0aW9ucyBpbiB0aGUgc3BlY2lmaWVkIENGRyBhbmQgcmVzeW5jIHRoZQorLy8vIGNhbGxncmFwaCB3aXRoIHRoZSBjYWxsIHNpdGVzIGZvdW5kIGluIGl0LiAgVGhpcyBpcyB1c2VkIGFmdGVyCisvLy8gRnVuY3Rpb25QYXNzZXMgaGF2ZSBwb3RlbnRpYWxseSBtdW5nZWQgdGhlIGNhbGxncmFwaCwgYW5kIGNhbiBiZSB1c2VkIGFmdGVyCisvLy8gQ2FsbEdyYXBoU0NDIHBhc3NlcyB0byB2ZXJpZnkgdGhhdCB0aGV5IGNvcnJlY3RseSB1cGRhdGVkIHRoZSBjYWxsZ3JhcGguCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBpdCBkZXZpcnR1YWxpemVkIGFuIGV4aXN0aW5nIGZ1bmN0aW9uIGNhbGwsCisvLy8gbWVhbmluZyBpdCB0dXJuZWQgYW4gaW5kaXJlY3QgY2FsbCBpbnRvIGEgZGlyZWN0IGNhbGwuICBUaGlzIGhhcHBlbnMgd2hlbgorLy8vIGEgZnVuY3Rpb24gcGFzcyBsaWtlIEdWTiBvcHRpbWl6ZXMgYXdheSBzdHVmZiBmZWVkaW5nIHRoZSBpbmRpcmVjdCBjYWxsLgorLy8vIFRoaXMgbmV2ZXIgaGFwcGVucyBpbiBjaGVja2luZyBtb2RlLgorLy8vCitib29sIENHUGFzc01hbmFnZXI6OlJlZnJlc2hDYWxsR3JhcGgoQ2FsbEdyYXBoU0NDICZDdXJTQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEdyYXBoICZDRywgYm9vbCBDaGVja2luZ01vZGUpIHsKKyAgRGVuc2VNYXA8VmFsdWUqLCBDYWxsR3JhcGhOb2RlKj4gQ2FsbFNpdGVzOworICAKKyAgREVCVUcoZGJncygpIDw8ICJDR1NDQ1BBU1NNR1I6IFJlZnJlc2hpbmcgU0NDIHdpdGggIiA8PCBDdXJTQ0Muc2l6ZSgpCisgICAgICAgICAgICAgICA8PCAiIG5vZGVzOlxuIjsKKyAgICAgICAgZm9yIChDYWxsR3JhcGhTQ0M6Oml0ZXJhdG9yIEkgPSBDdXJTQ0MuYmVnaW4oKSwgRSA9IEN1clNDQy5lbmQoKTsKKyAgICAgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgICAgICAoKkkpLT5kdW1wKCk7CisgICAgICAgICk7CisKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIGJvb2wgRGV2aXJ0dWFsaXplZENhbGwgPSBmYWxzZTsKKyAgCisgIC8vIFNjYW4gYWxsIGZ1bmN0aW9ucyBpbiB0aGUgU0NDLgorICB1bnNpZ25lZCBGdW5jdGlvbk5vID0gMDsKKyAgZm9yIChDYWxsR3JhcGhTQ0M6Oml0ZXJhdG9yIFNDQ0lkeCA9IEN1clNDQy5iZWdpbigpLCBFID0gQ3VyU0NDLmVuZCgpOworICAgICAgIFNDQ0lkeCAhPSBFOyArK1NDQ0lkeCwgKytGdW5jdGlvbk5vKSB7CisgICAgQ2FsbEdyYXBoTm9kZSAqQ0dOID0gKlNDQ0lkeDsKKyAgICBGdW5jdGlvbiAqRiA9IENHTi0+Z2V0RnVuY3Rpb24oKTsKKyAgICBpZiAoRiA9PSAwIHx8IEYtPmlzRGVjbGFyYXRpb24oKSkgY29udGludWU7CisgICAgCisgICAgLy8gV2FsayB0aGUgZnVuY3Rpb24gYm9keSBsb29raW5nIGZvciBjYWxsIHNpdGVzLiAgU3luYyB1cCB0aGUgY2FsbCBzaXRlcyBpbgorICAgIC8vIENHTiB3aXRoIHRob3NlIGFjdHVhbGx5IGluIHRoZSBmdW5jdGlvbi4KKworICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBkaXJlY3QgYW5kIGluZGlyZWN0IGNhbGxzIHRoYXQgd2VyZQorICAgIC8vIGludmFsaWRhdGVkIGFuZCByZW1vdmVkLgorICAgIHVuc2lnbmVkIE51bURpcmVjdFJlbW92ZWQgPSAwLCBOdW1JbmRpcmVjdFJlbW92ZWQgPSAwOworICAgIAorICAgIC8vIEdldCB0aGUgc2V0IG9mIGNhbGwgc2l0ZXMgY3VycmVudGx5IGluIHRoZSBmdW5jdGlvbi4KKyAgICBmb3IgKENhbGxHcmFwaE5vZGU6Oml0ZXJhdG9yIEkgPSBDR04tPmJlZ2luKCksIEUgPSBDR04tPmVuZCgpOyBJICE9IEU7ICkgeworICAgICAgLy8gSWYgdGhpcyBjYWxsIHNpdGUgaXMgbnVsbCwgdGhlbiB0aGUgZnVuY3Rpb24gcGFzcyBkZWxldGVkIHRoZSBjYWxsCisgICAgICAvLyBlbnRpcmVseSBhbmQgdGhlIFdlYWtWSCBudWxsZWQgaXQgb3V0LiAgCisgICAgICBpZiAoSS0+Zmlyc3QgPT0gMCB8fAorICAgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGNhbGwgc2l0ZSwgdGhlbiB0aGUgRnVuY3Rpb25QYXNzIFJBVVcnZAorICAgICAgICAgIC8vIG9uZSBjYWxsIHdpdGggYW5vdGhlciwgd2hpY2ggcmVzdWx0ZWQgaW4gdHdvICJ1c2VzIiBpbiB0aGUgZWRnZQorICAgICAgICAgIC8vIGxpc3Qgb2YgdGhlIHNhbWUgY2FsbC4KKyAgICAgICAgICBDYWxsU2l0ZXMuY291bnQoSS0+Zmlyc3QpIHx8CisKKyAgICAgICAgICAvLyBJZiB0aGUgY2FsbCBlZGdlIGlzIG5vdCBmcm9tIGEgY2FsbCBvciBpbnZva2UsIHRoZW4gdGhlIGZ1bmN0aW9uCisgICAgICAgICAgLy8gcGFzcyBSQVVXJ2QgYSBjYWxsIHdpdGggYW5vdGhlciB2YWx1ZS4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuCisgICAgICAgICAgLy8gY29uc3RhbnQgZm9sZGluZyBoYXBwZW5zIG9mIHdlbGwga25vd24gZnVuY3Rpb25zIGV0Yy4KKyAgICAgICAgICAhQ2FsbFNpdGUoSS0+Zmlyc3QpKSB7CisgICAgICAgIGFzc2VydCghQ2hlY2tpbmdNb2RlICYmCisgICAgICAgICAgICAgICAiQ2FsbEdyYXBoU0NDUGFzcyBkaWQgbm90IHVwZGF0ZSB0aGUgQ2FsbEdyYXBoIGNvcnJlY3RseSEiKTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoaXMgd2FzIGFuIGluZGlyZWN0IGNhbGwgc2l0ZSwgY291bnQgaXQuCisgICAgICAgIGlmIChJLT5zZWNvbmQtPmdldEZ1bmN0aW9uKCkgPT0gMCkKKyAgICAgICAgICArK051bUluZGlyZWN0UmVtb3ZlZDsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICArK051bURpcmVjdFJlbW92ZWQ7CisgICAgICAgIAorICAgICAgICAvLyBKdXN0IHJlbW92ZSB0aGUgZWRnZSBmcm9tIHRoZSBzZXQgb2YgY2FsbGVlcywga2VlcCB0cmFjayBvZiB3aGV0aGVyCisgICAgICAgIC8vIEkgcG9pbnRzIHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHZlY3Rvci4KKyAgICAgICAgYm9vbCBXYXNMYXN0ID0gSSArIDEgPT0gRTsKKyAgICAgICAgQ0dOLT5yZW1vdmVDYWxsRWRnZShJKTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIEkgcG9pbnRlZCB0byB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSB2ZWN0b3IsIHdlIGhhdmUgdG8gYmFpbCBvdXQ6CisgICAgICAgIC8vIGl0ZXJhdG9yIGNoZWNraW5nIHJlamVjdHMgY29tcGFyaXNvbnMgb2YgdGhlIHJlc3VsdGFudCBwb2ludGVyIHdpdGgKKyAgICAgICAgLy8gZW5kLgorICAgICAgICBpZiAoV2FzTGFzdCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgRSA9IENHTi0+ZW5kKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICBhc3NlcnQoIUNhbGxTaXRlcy5jb3VudChJLT5maXJzdCkgJiYKKyAgICAgICAgICAgICAiQ2FsbCBzaXRlIG9jY3VycyBpbiBub2RlIG11bHRpcGxlIHRpbWVzIik7CisgICAgICBDYWxsU2l0ZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEktPmZpcnN0LCBJLT5zZWNvbmQpKTsKKyAgICAgICsrSTsKKyAgICB9CisgICAgCisgICAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmdW5jdGlvbiwgZ2V0dGluZyB0aGUgY2FsbHNpdGVzLgorICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBkaXJlY3QvaW5kaXJlY3QgY2FsbHMgYWRkZWQuCisgICAgdW5zaWduZWQgTnVtRGlyZWN0QWRkZWQgPSAwLCBOdW1JbmRpcmVjdEFkZGVkID0gMDsKKyAgICAKKyAgICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCQiA9IEYtPmJlZ2luKCksIEUgPSBGLT5lbmQoKTsgQkIgIT0gRTsgKytCQikKKyAgICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICAgIENhbGxTaXRlIENTKGNhc3Q8VmFsdWU+KEkpKTsKKyAgICAgICAgaWYgKCFDUyB8fCBpc2E8RGJnSW5mb0ludHJpbnNpYz4oSSkpIGNvbnRpbnVlOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhpcyBjYWxsIHNpdGUgYWxyZWFkeSBleGlzdGVkIGluIHRoZSBjYWxsZ3JhcGgsIGp1c3QgdmVyaWZ5IGl0CisgICAgICAgIC8vIG1hdGNoZXMgdXAgdG8gZXhwZWN0YXRpb25zIGFuZCByZW1vdmUgaXQgZnJvbSBDYWxsU2l0ZXMuCisgICAgICAgIERlbnNlTWFwPFZhbHVlKiwgQ2FsbEdyYXBoTm9kZSo+OjppdGVyYXRvciBFeGlzdGluZ0l0ID0KKyAgICAgICAgICBDYWxsU2l0ZXMuZmluZChDUy5nZXRJbnN0cnVjdGlvbigpKTsKKyAgICAgICAgaWYgKEV4aXN0aW5nSXQgIT0gQ2FsbFNpdGVzLmVuZCgpKSB7CisgICAgICAgICAgQ2FsbEdyYXBoTm9kZSAqRXhpc3RpbmdOb2RlID0gRXhpc3RpbmdJdC0+c2Vjb25kOworCisgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gQ2FsbFNpdGVzIHNpbmNlIHdlIGhhdmUgbm93IHNlZW4gaXQuCisgICAgICAgICAgQ2FsbFNpdGVzLmVyYXNlKEV4aXN0aW5nSXQpOworICAgICAgICAgIAorICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjYWxsZWUgaXMgcmlnaHQuCisgICAgICAgICAgaWYgKEV4aXN0aW5nTm9kZS0+Z2V0RnVuY3Rpb24oKSA9PSBDUy5nZXRDYWxsZWRGdW5jdGlvbigpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgCisgICAgICAgICAgLy8gSWYgd2UgYXJlIGluIGNoZWNraW5nIG1vZGUsIHdlIGFyZSBub3QgYWxsb3dlZCB0byBhY3R1YWxseSBtdXRhdGUKKyAgICAgICAgICAvLyB0aGUgY2FsbGdyYXBoLiAgSWYgdGhpcyBpcyBhIGNhc2Ugd2hlcmUgd2UgY2FuIGluZmVyIHRoYXQgdGhlCisgICAgICAgICAgLy8gY2FsbGdyYXBoIGlzIGxlc3MgcHJlY2lzZSB0aGFuIGl0IGNvdWxkIGJlIChlLmcuIGFuIGluZGlyZWN0IGNhbGwKKyAgICAgICAgICAvLyBzaXRlIGNvdWxkIGJlIHR1cm5lZCBkaXJlY3QpLCBkb24ndCByZWplY3QgaXQgaW4gY2hlY2tpbmcgbW9kZSwgYW5kCisgICAgICAgICAgLy8gZG9uJ3QgdHdlYWsgaXQgdG8gYmUgbW9yZSBwcmVjaXNlLgorICAgICAgICAgIGlmIChDaGVja2luZ01vZGUgJiYgQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKSAmJgorICAgICAgICAgICAgICBFeGlzdGluZ05vZGUtPmdldEZ1bmN0aW9uKCkgPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIAorICAgICAgICAgIGFzc2VydCghQ2hlY2tpbmdNb2RlICYmCisgICAgICAgICAgICAgICAgICJDYWxsR3JhcGhTQ0NQYXNzIGRpZCBub3QgdXBkYXRlIHRoZSBDYWxsR3JhcGggY29ycmVjdGx5ISIpOworICAgICAgICAgIAorICAgICAgICAgIC8vIElmIG5vdCwgd2UgZWl0aGVyIHdlbnQgZnJvbSBhIGRpcmVjdCBjYWxsIHRvIGluZGlyZWN0LCBpbmRpcmVjdCB0bworICAgICAgICAgIC8vIGRpcmVjdCwgb3IgZGlyZWN0IHRvIGRpZmZlcmVudCBkaXJlY3QuCisgICAgICAgICAgQ2FsbEdyYXBoTm9kZSAqQ2FsbGVlTm9kZTsKKyAgICAgICAgICBpZiAoRnVuY3Rpb24gKkNhbGxlZSA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCkpIHsKKyAgICAgICAgICAgIENhbGxlZU5vZGUgPSBDRy5nZXRPckluc2VydEZ1bmN0aW9uKENhbGxlZSk7CisgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgdHVybmVkIGFuIGluZGlyZWN0IGNhbGwgaW50byBhIGRpcmVjdAorICAgICAgICAgICAgLy8gb25lLgorICAgICAgICAgICAgaWYgKEV4aXN0aW5nTm9kZS0+Z2V0RnVuY3Rpb24oKSA9PSAwKSB7CisgICAgICAgICAgICAgIERldmlydHVhbGl6ZWRDYWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIENHU0NDUEFTU01HUjogRGV2aXJ0dWFsaXplZCBjYWxsIHRvICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBDYWxsZWUtPmdldE5hbWUoKSA8PCAiJ1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENhbGxlZU5vZGUgPSBDRy5nZXRDYWxsc0V4dGVybmFsTm9kZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZWRnZSB0YXJnZXQgaW4gQ0dOLgorICAgICAgICAgIENHTi0+cmVwbGFjZUNhbGxFZGdlKENTLCBDUywgQ2FsbGVlTm9kZSk7CisgICAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFzc2VydCghQ2hlY2tpbmdNb2RlICYmCisgICAgICAgICAgICAgICAiQ2FsbEdyYXBoU0NDUGFzcyBkaWQgbm90IHVwZGF0ZSB0aGUgQ2FsbEdyYXBoIGNvcnJlY3RseSEiKTsKKworICAgICAgICAvLyBJZiB0aGUgY2FsbCBzaXRlIGRpZG4ndCBleGlzdCBpbiB0aGUgQ0dOIHlldCwgYWRkIGl0LgorICAgICAgICBDYWxsR3JhcGhOb2RlICpDYWxsZWVOb2RlOworICAgICAgICBpZiAoRnVuY3Rpb24gKkNhbGxlZSA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCkpIHsKKyAgICAgICAgICBDYWxsZWVOb2RlID0gQ0cuZ2V0T3JJbnNlcnRGdW5jdGlvbihDYWxsZWUpOworICAgICAgICAgICsrTnVtRGlyZWN0QWRkZWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ2FsbGVlTm9kZSA9IENHLmdldENhbGxzRXh0ZXJuYWxOb2RlKCk7CisgICAgICAgICAgKytOdW1JbmRpcmVjdEFkZGVkOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBDR04tPmFkZENhbGxlZEZ1bmN0aW9uKENTLCBDYWxsZWVOb2RlKTsKKyAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICB9CisgICAgCisgICAgLy8gV2Ugc2Nhbm5lZCB0aGUgb2xkIGNhbGxncmFwaCBub2RlLCByZW1vdmluZyBpbnZhbGlkYXRlZCBjYWxsIHNpdGVzIGFuZAorICAgIC8vIHRoZW4gYWRkZWQgYmFjayBuZXdseSBmb3VuZCBjYWxsIHNpdGVzLiAgT25lIHRoaW5nIHRoYXQgY2FuIGhhcHBlbiBpcworICAgIC8vIHRoYXQgYW4gb2xkIGluZGlyZWN0IGNhbGwgc2l0ZSB3YXMgZGVsZXRlZCBhbmQgcmVwbGFjZWQgd2l0aCBhIG5ldyBkaXJlY3QKKyAgICAvLyBjYWxsLiAgSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIGRldmlydHVhbGl6ZWQgYSBjYWxsLCBhbmQgQ0dTQ0NQTSB3b3VsZCBsaWtlCisgICAgLy8gdG8gaXRlcmF0aXZlbHkgb3B0aW1pemUgdGhlIG5ldyBjb2RlLiAgVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3QgcmVhbGx5CisgICAgLy8gaGF2ZSBhIGdyZWF0IHdheSB0byBkZXRlY3Qgd2hlbiB0aGlzIGhhcHBlbnMuICBBcyBhbiBhcHByb3hpbWF0aW9uLCB3ZQorICAgIC8vIGp1c3QgbG9vayBhdCB3aGV0aGVyIHRoZSBudW1iZXIgb2YgaW5kaXJlY3QgY2FsbHMgaXMgcmVkdWNlZCBhbmQgdGhlCisgICAgLy8gbnVtYmVyIG9mIGRpcmVjdCBjYWxscyBpcyBpbmNyZWFzZWQuICBUaGVyZSBhcmUgdG9ucyBvZiB3YXlzIHRvIGZvb2wgdGhpcworICAgIC8vIChlLmcuIERDRSdpbmcgYW4gaW5kaXJlY3QgY2FsbCBhbmQgZHVwbGljYXRpbmcgYW4gdW5yZWxhdGVkIGJsb2NrIHdpdGggYQorICAgIC8vIGRpcmVjdCBjYWxsKSBidXQgdGhpcyBpcyBjbG9zZSBlbm91Z2guCisgICAgaWYgKE51bUluZGlyZWN0UmVtb3ZlZCA+IE51bUluZGlyZWN0QWRkZWQgJiYKKyAgICAgICAgTnVtRGlyZWN0UmVtb3ZlZCA8IE51bURpcmVjdEFkZGVkKQorICAgICAgRGV2aXJ0dWFsaXplZENhbGwgPSB0cnVlOworICAgIAorICAgIC8vIEFmdGVyIHNjYW5uaW5nIHRoaXMgZnVuY3Rpb24sIGlmIHdlIHN0aWxsIGhhdmUgZW50cmllcyBpbiBjYWxsc2l0ZXMsIHRoZW4KKyAgICAvLyB0aGV5IGFyZSBkYW5nbGluZyBwb2ludGVycy4gIFdlYWtWSCBzaG91bGQgc2F2ZSB1cyBmb3IgdGhpcywgc28gYWJvcnQgaWYKKyAgICAvLyB0aGlzIGhhcHBlbnMuCisgICAgYXNzZXJ0KENhbGxTaXRlcy5lbXB0eSgpICYmICJEYW5nbGluZyBwb2ludGVycyBmb3VuZCBpbiBjYWxsIHNpdGVzIG1hcCIpOworICAgIAorICAgIC8vIFBlcmlvZGljYWxseSBkbyBhbiBleHBsaWNpdCBjbGVhciB0byByZW1vdmUgdG9tYnN0b25lcyB3aGVuIHByb2Nlc3NpbmcKKyAgICAvLyBsYXJnZSBzY2Mncy4KKyAgICBpZiAoKEZ1bmN0aW9uTm8gJiAxNSkgPT0gMTUpCisgICAgICBDYWxsU2l0ZXMuY2xlYXIoKTsKKyAgfQorCisgIERFQlVHKGlmIChNYWRlQ2hhbmdlKSB7CisgICAgICAgICAgZGJncygpIDw8ICJDR1NDQ1BBU1NNR1I6IFJlZnJlc2hlZCBTQ0MgaXMgbm93OlxuIjsKKyAgICAgICAgICBmb3IgKENhbGxHcmFwaFNDQzo6aXRlcmF0b3IgSSA9IEN1clNDQy5iZWdpbigpLCBFID0gQ3VyU0NDLmVuZCgpOworICAgICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICAgICAgICAgICgqSSktPmR1bXAoKTsKKyAgICAgICAgICBpZiAoRGV2aXJ0dWFsaXplZENhbGwpCisgICAgICAgICAgICBkYmdzKCkgPDwgIkNHU0NDUEFTU01HUjogUmVmcmVzaCBkZXZpcnR1YWxpemVkIGEgY2FsbCFcbiI7CisKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGRiZ3MoKSA8PCAiQ0dTQ0NQQVNTTUdSOiBTQ0MgUmVmcmVzaCBkaWRuJ3QgY2hhbmdlIGNhbGwgZ3JhcGguXG4iOworICAgICAgICAgfQorICAgICAgICApOworCisgIHJldHVybiBEZXZpcnR1YWxpemVkQ2FsbDsKK30KKworLy8vIFJ1bkFsbFBhc3Nlc09uU0NDIC0gIEV4ZWN1dGUgdGhlIGJvZHkgb2YgdGhlIGVudGlyZSBwYXNzIG1hbmFnZXIgb24gdGhlCisvLy8gc3BlY2lmaWVkIFNDQy4gIFRoaXMga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBhIGZ1bmN0aW9uIHBhc3MgZGV2aXJ0dWFsaXplcworLy8vIGFueSBjYWxscyBhbmQgcmV0dXJucyBpdCBpbiBEZXZpcnR1YWxpemVkQ2FsbC4KK2Jvb2wgQ0dQYXNzTWFuYWdlcjo6UnVuQWxsUGFzc2VzT25TQ0MoQ2FsbEdyYXBoU0NDICZDdXJTQ0MsIENhbGxHcmFwaCAmQ0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkRldmlydHVhbGl6ZWRDYWxsKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICAKKyAgLy8gQ2FsbEdyYXBoVXBUb0RhdGUgLSBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGNhbGxncmFwaCBpcyBrbm93biB0byBiZQorICAvLyB1cC10by1kYXRlIG9yIG5vdC4gIFRoZSBDR1NTQyBwYXNzIG1hbmFnZXIgcnVucyB0d28gdHlwZXMgb2YgcGFzc2VzOgorICAvLyBDYWxsR3JhcGhTQ0MgUGFzc2VzIGFuZCBvdGhlciByYW5kb20gZnVuY3Rpb24gcGFzc2VzLiAgQmVjYXVzZSBvdGhlcgorICAvLyByYW5kb20gZnVuY3Rpb24gcGFzc2VzIGFyZSBub3QgQ2FsbEdyYXBoIGF3YXJlLCB0aGV5IG1heSBjbG9iYmVyIHRoZQorICAvLyBjYWxsIGdyYXBoIGJ5IGludHJvZHVjaW5nIG5ldyBjYWxscyBvciBkZWxldGluZyBvdGhlciBvbmVzLiAgVGhpcyBmbGFnCisgIC8vIGlzIHNldCB0byBmYWxzZSB3aGVuIHdlIHJ1biBhIGZ1bmN0aW9uIHBhc3Mgc28gdGhhdCB3ZSBrbm93IHRvIGNsZWFuIHVwCisgIC8vIHRoZSBjYWxsZ3JhcGggd2hlbiB3ZSBuZWVkIHRvIHJ1biBhIENHU0NDUGFzcyBhZ2Fpbi4KKyAgYm9vbCBDYWxsR3JhcGhVcFRvRGF0ZSA9IHRydWU7CisKKyAgLy8gUnVuIGFsbCBwYXNzZXMgb24gY3VycmVudCBTQ0MuCisgIGZvciAodW5zaWduZWQgUGFzc05vID0gMCwgZSA9IGdldE51bUNvbnRhaW5lZFBhc3NlcygpOworICAgICAgIFBhc3NObyAhPSBlOyArK1Bhc3NObykgeworICAgIFBhc3MgKlAgPSBnZXRDb250YWluZWRQYXNzKFBhc3NObyk7CisgICAgCisgICAgLy8gSWYgd2UncmUgaW4gLWRlYnVnLXBhc3M9RXhlY3V0aW9ucyBtb2RlLCBjb25zdHJ1Y3QgdGhlIFNDQyBub2RlIGxpc3QsCisgICAgLy8gb3RoZXJ3aXNlIGF2b2lkIGNvbnN0cnVjdGluZyB0aGlzIHN0cmluZyBhcyBpdCBpcyBleHBlbnNpdmUuCisgICAgaWYgKGlzUGFzc0RlYnVnZ2luZ0V4ZWN1dGlvbnNPck1vcmUoKSkgeworICAgICAgc3RkOjpzdHJpbmcgRnVuY3Rpb25zOworICAjaWZuZGVmIE5ERUJVRworICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKEZ1bmN0aW9ucyk7CisgICAgICBmb3IgKENhbGxHcmFwaFNDQzo6aXRlcmF0b3IgSSA9IEN1clNDQy5iZWdpbigpLCBFID0gQ3VyU0NDLmVuZCgpOworICAgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgICBpZiAoSSAhPSBDdXJTQ0MuYmVnaW4oKSkgT1MgPDwgIiwgIjsKKyAgICAgICAgKCpJKS0+cHJpbnQoT1MpOworICAgICAgfQorICAgICAgT1MuZmx1c2goKTsKKyAgI2VuZGlmCisgICAgICBkdW1wUGFzc0luZm8oUCwgRVhFQ1VUSU9OX01TRywgT05fQ0dfTVNHLCBGdW5jdGlvbnMpOworICAgIH0KKyAgICBkdW1wUmVxdWlyZWRTZXQoUCk7CisgICAgCisgICAgaW5pdGlhbGl6ZUFuYWx5c2lzSW1wbChQKTsKKyAgICAKKyAgICAvLyBBY3R1YWxseSBydW4gdGhpcyBwYXNzIG9uIHRoZSBjdXJyZW50IFNDQy4KKyAgICBDaGFuZ2VkIHw9IFJ1blBhc3NPblNDQyhQLCBDdXJTQ0MsIENHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxHcmFwaFVwVG9EYXRlLCBEZXZpcnR1YWxpemVkQ2FsbCk7CisgICAgCisgICAgaWYgKENoYW5nZWQpCisgICAgICBkdW1wUGFzc0luZm8oUCwgTU9ESUZJQ0FUSU9OX01TRywgT05fQ0dfTVNHLCAiIik7CisgICAgZHVtcFByZXNlcnZlZFNldChQKTsKKyAgICAKKyAgICB2ZXJpZnlQcmVzZXJ2ZWRBbmFseXNpcyhQKTsgICAgICAKKyAgICByZW1vdmVOb3RQcmVzZXJ2ZWRBbmFseXNpcyhQKTsKKyAgICByZWNvcmRBdmFpbGFibGVBbmFseXNpcyhQKTsKKyAgICByZW1vdmVEZWFkUGFzc2VzKFAsICIiLCBPTl9DR19NU0cpOworICB9CisgIAorICAvLyBJZiB0aGUgY2FsbGdyYXBoIHdhcyBsZWZ0IG91dCBvZiBkYXRlIChiZWNhdXNlIHRoZSBsYXN0IHBhc3MgcnVuIHdhcyBhCisgIC8vIGZ1bmN0aW9ucGFzcyksIHJlZnJlc2ggaXQgYmVmb3JlIHdlIG1vdmUgb24gdG8gdGhlIG5leHQgU0NDLgorICBpZiAoIUNhbGxHcmFwaFVwVG9EYXRlKQorICAgIERldmlydHVhbGl6ZWRDYWxsIHw9IFJlZnJlc2hDYWxsR3JhcGgoQ3VyU0NDLCBDRywgZmFsc2UpOworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisvLy8gd2hldGhlciBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllcyB0aGUgbW9kdWxlLCBhbmQgaWYgc28sIHJldHVybiB0cnVlLgorYm9vbCBDR1Bhc3NNYW5hZ2VyOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgQ2FsbEdyYXBoICZDRyA9IGdldEFuYWx5c2lzPENhbGxHcmFwaD4oKTsKKyAgYm9vbCBDaGFuZ2VkID0gZG9Jbml0aWFsaXphdGlvbihDRyk7CisgIAorICAvLyBXYWxrIHRoZSBjYWxsZ3JhcGggaW4gYm90dG9tLXVwIFNDQyBvcmRlci4KKyAgc2NjX2l0ZXJhdG9yPENhbGxHcmFwaCo+IENHSSA9IHNjY19iZWdpbigmQ0cpOworCisgIENhbGxHcmFwaFNDQyBDdXJTQ0MoJkNHSSk7CisgIHdoaWxlICghQ0dJLmlzQXRFbmQoKSkgeworICAgIC8vIENvcHkgdGhlIGN1cnJlbnQgU0NDIGFuZCBpbmNyZW1lbnQgcGFzdCBpdCBzbyB0aGF0IHRoZSBwYXNzIGNhbiBoYWNrCisgICAgLy8gb24gdGhlIFNDQyBpZiBpdCB3YW50cyB0byB3aXRob3V0IGludmFsaWRhdGluZyBvdXIgaXRlcmF0b3IuCisgICAgc3RkOjp2ZWN0b3I8Q2FsbEdyYXBoTm9kZSo+ICZOb2RlVmVjID0gKkNHSTsKKyAgICBDdXJTQ0MuaW5pdGlhbGl6ZSgmTm9kZVZlY1swXSwgJk5vZGVWZWNbMF0rTm9kZVZlYy5zaXplKCkpOworICAgICsrQ0dJOworICAgIAorICAgIC8vIEF0IHRoZSB0b3AgbGV2ZWwsIHdlIHJ1biBhbGwgdGhlIHBhc3NlcyBpbiB0aGlzIHBhc3MgbWFuYWdlciBvbiB0aGUKKyAgICAvLyBmdW5jdGlvbnMgaW4gdGhpcyBTQ0MuICBIb3dldmVyLCB3ZSBzdXBwb3J0IGl0ZXJhdGl2ZSBjb21waWxhdGlvbiBpbiB0aGUKKyAgICAvLyBjYXNlIHdoZXJlIGEgZnVuY3Rpb24gcGFzcyBkZXZpcnR1YWxpemVzIGEgY2FsbCB0byBhIGZ1bmN0aW9uLiAgRm9yCisgICAgLy8gZXhhbXBsZSwgaXQgaXMgdmVyeSBjb21tb24gZm9yIGEgZnVuY3Rpb24gcGFzcyAob2Z0ZW4gR1ZOIG9yIGluc3Rjb21iaW5lKQorICAgIC8vIHRvIGVsaW1pbmF0ZSB0aGUgYWRkcmVzc2luZyB0aGF0IGZlZWRzIGludG8gYSBjYWxsLiAgV2l0aCB0aGF0IGltcHJvdmVkCisgICAgLy8gaW5mb3JtYXRpb24sIHdlIHdvdWxkIGxpa2UgdGhlIGNhbGwgdG8gYmUgYW4gaW5saW5lIGNhbmRpZGF0ZSwgaW5mZXIKKyAgICAvLyBtb2QtcmVmIGluZm9ybWF0aW9uIGV0Yy4KKyAgICAvLworICAgIC8vIEJlY2F1c2Ugb2YgdGhpcywgd2UgYWxsb3cgaXRlcmF0aW9uIHVwIHRvIGEgc3BlY2lmaWVkIGl0ZXJhdGlvbiBjb3VudC4KKyAgICAvLyBUaGlzIG9ubHkgaGFwcGVucyBpbiB0aGUgY2FzZSBvZiBhIGRldmlydHVhbGl6ZWQgY2FsbCwgc28gd2Ugb25seSBidXJuCisgICAgLy8gY29tcGlsZSB0aW1lIGluIHRoZSBjYXNlIHRoYXQgd2UncmUgbWFraW5nIHByb2dyZXNzLiAgV2UgYWxzbyBoYXZlIGEgaGFyZAorICAgIC8vIGl0ZXJhdGlvbiBjb3VudCBsaW1pdCBpbiBjYXNlIHRoZXJlIGlzIGNyYXp5IGNvZGUuCisgICAgdW5zaWduZWQgSXRlcmF0aW9uID0gMDsKKyAgICBib29sIERldmlydHVhbGl6ZWRDYWxsID0gZmFsc2U7CisgICAgZG8geworICAgICAgREVCVUcoaWYgKEl0ZXJhdGlvbikKKyAgICAgICAgICAgICAgZGJncygpIDw8ICIgIFNDQ1BBU1NNR1I6IFJlLXZpc2l0aW5nIFNDQywgaXRlcmF0aW9uICMiCisgICAgICAgICAgICAgICAgICAgICA8PCBJdGVyYXRpb24gPDwgJ1xuJyk7CisgICAgICBEZXZpcnR1YWxpemVkQ2FsbCA9IGZhbHNlOworICAgICAgQ2hhbmdlZCB8PSBSdW5BbGxQYXNzZXNPblNDQyhDdXJTQ0MsIENHLCBEZXZpcnR1YWxpemVkQ2FsbCk7CisgICAgfSB3aGlsZSAoSXRlcmF0aW9uKysgPCBNYXhJdGVyYXRpb25zICYmIERldmlydHVhbGl6ZWRDYWxsKTsKKyAgICAKKyAgICBpZiAoRGV2aXJ0dWFsaXplZENhbGwpCisgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgQ0dTQ0NQQVNTTUdSOiBTdG9wcGVkIGl0ZXJhdGlvbiBhZnRlciAiIDw8IEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgICAgIDw8ICIgdGltZXMsIGR1ZSB0byAtbWF4LWNnLXNjYy1pdGVyYXRpb25zXG4iKTsKKyAgICAKKyAgICBpZiAoSXRlcmF0aW9uID4gTWF4U0NDSXRlcmF0aW9ucykKKyAgICAgIE1heFNDQ0l0ZXJhdGlvbnMgPSBJdGVyYXRpb247CisgICAgCisgIH0KKyAgQ2hhbmdlZCB8PSBkb0ZpbmFsaXphdGlvbihDRyk7CisgIHJldHVybiBDaGFuZ2VkOworfQorCisKKy8vLyBJbml0aWFsaXplIENHCitib29sIENHUGFzc01hbmFnZXI6OmRvSW5pdGlhbGl6YXRpb24oQ2FsbEdyYXBoICZDRykgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bUNvbnRhaW5lZFBhc3NlcygpOyBpICE9IGU7ICsraSkgeyAgCisgICAgaWYgKFBNRGF0YU1hbmFnZXIgKlBNID0gZ2V0Q29udGFpbmVkUGFzcyhpKS0+Z2V0QXNQTURhdGFNYW5hZ2VyKCkpIHsKKyAgICAgIGFzc2VydChQTS0+Z2V0UGFzc01hbmFnZXJUeXBlKCkgPT0gUE1UX0Z1bmN0aW9uUGFzc01hbmFnZXIgJiYKKyAgICAgICAgICAgICAiSW52YWxpZCBDR1Bhc3NNYW5hZ2VyIG1lbWJlciIpOworICAgICAgQ2hhbmdlZCB8PSAoKEZQUGFzc01hbmFnZXIqKVBNKS0+ZG9Jbml0aWFsaXphdGlvbihDRy5nZXRNb2R1bGUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENoYW5nZWQgfD0gKChDYWxsR3JhcGhTQ0NQYXNzKilnZXRDb250YWluZWRQYXNzKGkpKS0+ZG9Jbml0aWFsaXphdGlvbihDRyk7CisgICAgfQorICB9CisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gRmluYWxpemUgQ0cKK2Jvb2wgQ0dQYXNzTWFuYWdlcjo6ZG9GaW5hbGl6YXRpb24oQ2FsbEdyYXBoICZDRykgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bUNvbnRhaW5lZFBhc3NlcygpOyBpICE9IGU7ICsraSkgeyAgCisgICAgaWYgKFBNRGF0YU1hbmFnZXIgKlBNID0gZ2V0Q29udGFpbmVkUGFzcyhpKS0+Z2V0QXNQTURhdGFNYW5hZ2VyKCkpIHsKKyAgICAgIGFzc2VydChQTS0+Z2V0UGFzc01hbmFnZXJUeXBlKCkgPT0gUE1UX0Z1bmN0aW9uUGFzc01hbmFnZXIgJiYKKyAgICAgICAgICAgICAiSW52YWxpZCBDR1Bhc3NNYW5hZ2VyIG1lbWJlciIpOworICAgICAgQ2hhbmdlZCB8PSAoKEZQUGFzc01hbmFnZXIqKVBNKS0+ZG9GaW5hbGl6YXRpb24oQ0cuZ2V0TW9kdWxlKCkpOworICAgIH0gZWxzZSB7CisgICAgICBDaGFuZ2VkIHw9ICgoQ2FsbEdyYXBoU0NDUGFzcyopZ2V0Q29udGFpbmVkUGFzcyhpKSktPmRvRmluYWxpemF0aW9uKENHKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDYWxsR3JhcGhTQ0MgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBSZXBsYWNlTm9kZSAtIFRoaXMgaW5mb3JtcyB0aGUgU0NDIGFuZCB0aGUgcGFzcyBtYW5hZ2VyIHRoYXQgdGhlIHNwZWNpZmllZAorLy8vIE9sZCBub2RlIGhhcyBiZWVuIGRlbGV0ZWQsIGFuZCBOZXcgaXMgdG8gYmUgdXNlZCBpbiBpdHMgcGxhY2UuCit2b2lkIENhbGxHcmFwaFNDQzo6UmVwbGFjZU5vZGUoQ2FsbEdyYXBoTm9kZSAqT2xkLCBDYWxsR3JhcGhOb2RlICpOZXcpIHsKKyAgYXNzZXJ0KE9sZCAhPSBOZXcgJiYgIlNob3VsZCBub3QgcmVwbGFjZSBub2RlIHdpdGggc2VsZiIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyA7ICsraSkgeworICAgIGFzc2VydChpICE9IE5vZGVzLnNpemUoKSAmJiAiTm9kZSBub3QgaW4gU0NDIik7CisgICAgaWYgKE5vZGVzW2ldICE9IE9sZCkgY29udGludWU7CisgICAgTm9kZXNbaV0gPSBOZXc7CisgICAgYnJlYWs7CisgIH0KKyAgCisgIC8vIFVwZGF0ZSB0aGUgYWN0aXZlIHNjY19pdGVyYXRvciBzbyB0aGF0IGl0IGRvZXNuJ3QgY29udGFpbiBkYW5nbGluZworICAvLyBwb2ludGVycyB0byB0aGUgb2xkIENhbGxHcmFwaE5vZGUuCisgIHNjY19pdGVyYXRvcjxDYWxsR3JhcGgqPiAqQ0dJID0gKHNjY19pdGVyYXRvcjxDYWxsR3JhcGgqPiopQ29udGV4dDsKKyAgQ0dJLT5SZXBsYWNlTm9kZShPbGQsIE5ldyk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENhbGxHcmFwaFNDQ1Bhc3MgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBBc3NpZ24gcGFzcyBtYW5hZ2VyIHRvIG1hbmFnZSB0aGlzIHBhc3MuCit2b2lkIENhbGxHcmFwaFNDQ1Bhc3M6OmFzc2lnblBhc3NNYW5hZ2VyKFBNU3RhY2sgJlBNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc01hbmFnZXJUeXBlIFByZWZlcnJlZFR5cGUpIHsKKyAgLy8gRmluZCBDR1Bhc3NNYW5hZ2VyIAorICB3aGlsZSAoIVBNUy5lbXB0eSgpICYmCisgICAgICAgICBQTVMudG9wKCktPmdldFBhc3NNYW5hZ2VyVHlwZSgpID4gUE1UX0NhbGxHcmFwaFBhc3NNYW5hZ2VyKQorICAgIFBNUy5wb3AoKTsKKworICBhc3NlcnQoIVBNUy5lbXB0eSgpICYmICJVbmFibGUgdG8gaGFuZGxlIENhbGwgR3JhcGggUGFzcyIpOworICBDR1Bhc3NNYW5hZ2VyICpDR1A7CisgIAorICBpZiAoUE1TLnRvcCgpLT5nZXRQYXNzTWFuYWdlclR5cGUoKSA9PSBQTVRfQ2FsbEdyYXBoUGFzc01hbmFnZXIpCisgICAgQ0dQID0gKENHUGFzc01hbmFnZXIqKVBNUy50b3AoKTsKKyAgZWxzZSB7CisgICAgLy8gQ3JlYXRlIG5ldyBDYWxsIEdyYXBoIFNDQyBQYXNzIE1hbmFnZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QuIAorICAgIGFzc2VydCghUE1TLmVtcHR5KCkgJiYgIlVuYWJsZSB0byBjcmVhdGUgQ2FsbCBHcmFwaCBQYXNzIE1hbmFnZXIiKTsKKyAgICBQTURhdGFNYW5hZ2VyICpQTUQgPSBQTVMudG9wKCk7CisKKyAgICAvLyBbMV0gQ3JlYXRlIG5ldyBDYWxsIEdyYXBoIFBhc3MgTWFuYWdlcgorICAgIENHUCA9IG5ldyBDR1Bhc3NNYW5hZ2VyKFBNRC0+Z2V0RGVwdGgoKSArIDEpOworCisgICAgLy8gWzJdIFNldCB1cCBuZXcgbWFuYWdlcidzIHRvcCBsZXZlbCBtYW5hZ2VyCisgICAgUE1Ub3BMZXZlbE1hbmFnZXIgKlRQTSA9IFBNRC0+Z2V0VG9wTGV2ZWxNYW5hZ2VyKCk7CisgICAgVFBNLT5hZGRJbmRpcmVjdFBhc3NNYW5hZ2VyKENHUCk7CisKKyAgICAvLyBbM10gQXNzaWduIG1hbmFnZXIgdG8gbWFuYWdlIHRoaXMgbmV3IG1hbmFnZXIuIFRoaXMgbWF5IGNyZWF0ZQorICAgIC8vIGFuZCBwdXNoIG5ldyBtYW5hZ2VycyBpbnRvIFBNUworICAgIFBhc3MgKlAgPSBDR1A7CisgICAgVFBNLT5zY2hlZHVsZVBhc3MoUCk7CisKKyAgICAvLyBbNF0gUHVzaCBuZXcgbWFuYWdlciBpbnRvIFBNUworICAgIFBNUy5wdXNoKENHUCk7CisgIH0KKworICBDR1AtPmFkZCh0aGlzKTsKK30KKworLy8vIGdldEFuYWx5c2lzVXNhZ2UgLSBGb3IgdGhpcyBjbGFzcywgd2UgZGVjbGFyZSB0aGF0IHdlIHJlcXVpcmUgYW5kIHByZXNlcnZlCisvLy8gdGhlIGNhbGwgZ3JhcGguICBJZiB0aGUgZGVyaXZlZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kLCBpdCBzaG91bGQKKy8vLyBhbHdheXMgZXhwbGljaXRseSBjYWxsIHRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlLgordm9pZCBDYWxsR3JhcGhTQ0NQYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgIEFVLmFkZFJlcXVpcmVkPENhbGxHcmFwaD4oKTsKKyAgQVUuYWRkUHJlc2VydmVkPENhbGxHcmFwaD4oKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHJpbnRDYWxsR3JhcGhQYXNzIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgeworICAvLy8gUHJpbnRDYWxsR3JhcGhQYXNzIC0gUHJpbnQgYSBNb2R1bGUgY29ycmVzcG9uZGluZyB0byBhIGNhbGwgZ3JhcGguCisgIC8vLworICBjbGFzcyBQcmludENhbGxHcmFwaFBhc3MgOiBwdWJsaWMgQ2FsbEdyYXBoU0NDUGFzcyB7CisgICAgc3RkOjpzdHJpbmcgQmFubmVyOworICAgIHJhd19vc3RyZWFtICZPdXQ7ICAgICAgIC8vIHJhd19vc3RyZWFtIHRvIHByaW50IG9uLgorICAgIAorICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgUHJpbnRDYWxsR3JhcGhQYXNzKCkgOiBDYWxsR3JhcGhTQ0NQYXNzKElEKSwgT3V0KGRiZ3MoKSkge30KKyAgICBQcmludENhbGxHcmFwaFBhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJkIsIHJhd19vc3RyZWFtICZvKQorICAgICAgOiBDYWxsR3JhcGhTQ0NQYXNzKElEKSwgQmFubmVyKEIpLCBPdXQobykge30KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgfQorICAgIAorICAgIGJvb2wgcnVuT25TQ0MoQ2FsbEdyYXBoU0NDICZTQ0MpIHsKKyAgICAgIE91dCA8PCBCYW5uZXI7CisgICAgICBmb3IgKENhbGxHcmFwaFNDQzo6aXRlcmF0b3IgSSA9IFNDQy5iZWdpbigpLCBFID0gU0NDLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgKCpJKS0+Z2V0RnVuY3Rpb24oKS0+cHJpbnQoT3V0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH07CisgIAorfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZS4KKworY2hhciBQcmludENhbGxHcmFwaFBhc3M6OklEID0gMDsKKworUGFzcyAqQ2FsbEdyYXBoU0NDUGFzczo6Y3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSBjb25zdCB7CisgIHJldHVybiBuZXcgUHJpbnRDYWxsR3JhcGhQYXNzKEJhbm5lciwgTyk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JUEEvRmluZFVzZWRUeXBlcy5jcHAgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvSVBBL0ZpbmRVc2VkVHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZWQ5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvSVBBL0ZpbmRVc2VkVHlwZXMuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvLz09PS0gRmluZFVzZWRUeXBlcy5jcHAgLSBGaW5kIGFsbCBUeXBlcyB1c2VkIGJ5IGEgbW9kdWxlIC0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpcyB1c2VkIHRvIHNlZWsgb3V0IGFsbCBvZiB0aGUgdHlwZXMgaW4gdXNlIGJ5IHRoZSBwcm9ncmFtLiAgTm90ZQorLy8gdGhhdCB0aGlzIGFuYWx5c2lzIGV4cGxpY2l0bHkgZG9lcyBub3QgaW5jbHVkZSB0eXBlcyBvbmx5IHVzZWQgYnkgdGhlIHN5bWJvbAorLy8gdGFibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRmluZFVzZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0luc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK2NoYXIgRmluZFVzZWRUeXBlczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKEZpbmRVc2VkVHlwZXMsICJwcmludC11c2VkLXR5cGVzIiwKKyAgICAgICAgICAgICAgICAiRmluZCBVc2VkIFR5cGVzIiwgZmFsc2UsIHRydWUpOworCisvLyBJbmNvcnBvcmF0ZVR5cGUgLSBJbmNvcnBvcmF0ZSBvbmUgdHlwZSBhbmQgYWxsIG9mIGl0cyBzdWJ0eXBlcyBpbnRvIHRoZQorLy8gY29sbGVjdGlvbiBvZiB1c2VkIHR5cGVzLgorLy8KK3ZvaWQgRmluZFVzZWRUeXBlczo6SW5jb3Jwb3JhdGVUeXBlKGNvbnN0IFR5cGUgKlR5KSB7CisgIC8vIElmIHR5IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgdXNlZCB0eXBlcyBtYXAsIGFkZCBpdCBub3csIG90aGVyd2lzZQorICAvLyByZXR1cm4uCisgIGlmICghVXNlZFR5cGVzLmluc2VydChUeSkuc2Vjb25kKSByZXR1cm47ICAvLyBBbHJlYWR5IGNvbnRhaW4gVHkuCisKKyAgLy8gTWFrZSBzdXJlIHRvIGFkZCBhbnkgdHlwZXMgdGhpcyB0eXBlIHJlZmVyZW5jZXMgbm93LgorICAvLworICBmb3IgKFR5cGU6OnN1YnR5cGVfaXRlcmF0b3IgSSA9IFR5LT5zdWJ0eXBlX2JlZ2luKCksIEUgPSBUeS0+c3VidHlwZV9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBJbmNvcnBvcmF0ZVR5cGUoKkkpOworfQorCit2b2lkIEZpbmRVc2VkVHlwZXM6OkluY29ycG9yYXRlVmFsdWUoY29uc3QgVmFsdWUgKlYpIHsKKyAgSW5jb3Jwb3JhdGVUeXBlKFYtPmdldFR5cGUoKSk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIGNvbnN0YW50LCBpdCBjb3VsZCBiZSB1c2luZyBvdGhlciB0eXBlcy4uLgorICBpZiAoY29uc3QgQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpIHsKKyAgICBpZiAoIWlzYTxHbG9iYWxWYWx1ZT4oQykpCisgICAgICBmb3IgKFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yIE9JID0gQy0+b3BfYmVnaW4oKSwgT0UgPSBDLT5vcF9lbmQoKTsKKyAgICAgICAgICAgT0kgIT0gT0U7ICsrT0kpCisgICAgICAgIEluY29ycG9yYXRlVmFsdWUoKk9JKTsKKyAgfQorfQorCisKKy8vIHJ1biAtIFRoaXMgaW5jb3Jwb3JhdGVzIGFsbCB0eXBlcyB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQgbW9kdWxlCisvLworYm9vbCBGaW5kVXNlZFR5cGVzOjpydW5Pbk1vZHVsZShNb2R1bGUgJm0pIHsKKyAgVXNlZFR5cGVzLmNsZWFyKCk7ICAvLyByZXNldCBpZiBydW4gbXVsdGlwbGUgdGltZXMuLi4KKworICAvLyBMb29wIG92ZXIgZ2xvYmFsIHZhcmlhYmxlcywgaW5jb3Jwb3JhdGluZyB0aGVpciB0eXBlcworICBmb3IgKE1vZHVsZTo6Y29uc3RfZ2xvYmFsX2l0ZXJhdG9yIEkgPSBtLmdsb2JhbF9iZWdpbigpLCBFID0gbS5nbG9iYWxfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBJbmNvcnBvcmF0ZVR5cGUoSS0+Z2V0VHlwZSgpKTsKKyAgICBpZiAoSS0+aGFzSW5pdGlhbGl6ZXIoKSkKKyAgICAgIEluY29ycG9yYXRlVmFsdWUoSS0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgIH0KKworICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgTUkgPSBtLmJlZ2luKCksIE1FID0gbS5lbmQoKTsgTUkgIT0gTUU7ICsrTUkpIHsKKyAgICBJbmNvcnBvcmF0ZVR5cGUoTUktPmdldFR5cGUoKSk7CisgICAgY29uc3QgRnVuY3Rpb24gJkYgPSAqTUk7CisKKyAgICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGZ1bmN0aW9uLCBhZGRpbmcgdGhlaXIgcmV0dXJuCisgICAgLy8gdHlwZSBhcyB3ZWxsIGFzIHRoZSB0eXBlcyBvZiB0aGVpciBvcGVyYW5kcy4KKyAgICAvLworICAgIGZvciAoY29uc3RfaW5zdF9pdGVyYXRvciBJSSA9IGluc3RfYmVnaW4oRiksIElFID0gaW5zdF9lbmQoRik7CisgICAgICAgICBJSSAhPSBJRTsgKytJSSkgeworICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gJkkgPSAqSUk7CisKKyAgICAgIEluY29ycG9yYXRlVHlwZShJLmdldFR5cGUoKSk7ICAvLyBJbmNvcnBvcmF0ZSB0aGUgdHlwZSBvZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAgIGZvciAoVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3IgT0kgPSBJLm9wX2JlZ2luKCksIE9FID0gSS5vcF9lbmQoKTsKKyAgICAgICAgICAgT0kgIT0gT0U7ICsrT0kpCisgICAgICAgIEluY29ycG9yYXRlVmFsdWUoKk9JKTsgIC8vIEluc2VydCBpbnN0IG9wZXJhbmQgdHlwZXMgYXMgd2VsbAorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUHJpbnQgdGhlIHR5cGVzIGZvdW5kIGluIHRoZSBtb2R1bGUuICBJZiB0aGUgb3B0aW9uYWwgTW9kdWxlIHBhcmFtZXRlciBpcworLy8gcGFzc2VkIGluLCB0aGVuIHRoZSB0eXBlcyBhcmUgcHJpbnRlZCBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUsIHVzaW5nIHRoZQorLy8gc3ltYm9sIHRhYmxlIGZyb20gdGhlIG1vZHVsZS4KKy8vCit2b2lkIEZpbmRVc2VkVHlwZXM6OnByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNKSBjb25zdCB7CisgIE9TIDw8ICJUeXBlcyBpbiB1c2UgYnkgdGhpcyBtb2R1bGU6XG4iOworICBmb3IgKHN0ZDo6c2V0PGNvbnN0IFR5cGUgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBVc2VkVHlwZXMuYmVnaW4oKSwKKyAgICAgICBFID0gVXNlZFR5cGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE9TIDw8ICIgICAiOworICAgIFdyaXRlVHlwZVN5bWJvbGljKE9TLCAqSSwgTSk7CisgICAgT1MgPDwgJ1xuJzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0lQQS9HbG9iYWxzTW9kUmVmLmNwcCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JUEEvR2xvYmFsc01vZFJlZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhNjFkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JUEEvR2xvYmFsc01vZFJlZi5jcHAKQEAgLTAsMCArMSw1ODYgQEAKKy8vPT09LSBHbG9iYWxzTW9kUmVmLmNwcCAtIFNpbXBsZSBNb2QvUmVmIEFuYWx5c2lzIGZvciBHbG9iYWxzIC0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBzaW1wbGUgcGFzcyBwcm92aWRlcyBhbGlhcyBhbmQgbW9kL3JlZiBpbmZvcm1hdGlvbiBmb3IgZ2xvYmFsIHZhbHVlcworLy8gdGhhdCBkbyBub3QgaGF2ZSB0aGVpciBhZGRyZXNzIHRha2VuLCBhbmQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBmdW5jdGlvbnMKKy8vIHJlYWQgb3Igd3JpdGUgbWVtb3J5IChhcmUgInB1cmUiKS4gIEZvciB0aGlzIHNpbXBsZSAoYnV0IHZlcnkgY29tbW9uKSBjYXNlLAorLy8gd2UgY2FuIHByb3ZpZGUgcHJldHR5IGFjY3VyYXRlIGFuZCB1c2VmdWwgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJnbG9iYWxzbW9kcmVmLWFhIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NhbGxHcmFwaC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5QnVpbHRpbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSW5zdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU0NDSXRlcmF0b3IuaCIKKyNpbmNsdWRlIDxzZXQ+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bU5vbkFkZHJUYWtlbkdsb2JhbFZhcnMsCisgICAgICAgICAgIk51bWJlciBvZiBnbG9iYWwgdmFycyB3aXRob3V0IGFkZHJlc3MgdGFrZW4iKTsKK1NUQVRJU1RJQyhOdW1Ob25BZGRyVGFrZW5GdW5jdGlvbnMsIk51bWJlciBvZiBmdW5jdGlvbnMgd2l0aG91dCBhZGRyZXNzIHRha2VuIik7CitTVEFUSVNUSUMoTnVtTm9NZW1GdW5jdGlvbnMsICJOdW1iZXIgb2YgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGFjY2VzcyBtZW1vcnkiKTsKK1NUQVRJU1RJQyhOdW1SZWFkTWVtRnVuY3Rpb25zLCAiTnVtYmVyIG9mIGZ1bmN0aW9ucyB0aGF0IG9ubHkgcmVhZCBtZW1vcnkiKTsKK1NUQVRJU1RJQyhOdW1JbmRpcmVjdEdsb2JhbFZhcnMsICJOdW1iZXIgb2YgaW5kaXJlY3QgZ2xvYmFsIG9iamVjdHMiKTsKKworbmFtZXNwYWNlIHsKKyAgLy8vIEZ1bmN0aW9uUmVjb3JkIC0gT25lIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIGlzIHN0b3JlZCBmb3IgZXZlcnkKKyAgLy8vIGZ1bmN0aW9uIGluIHRoZSBwcm9ncmFtLiAgTGF0ZXIsIHRoZSBlbnRyaWVzIGZvciB0aGVzZSBmdW5jdGlvbnMgYXJlCisgIC8vLyByZW1vdmVkIGlmIHRoZSBmdW5jdGlvbiBpcyBmb3VuZCB0byBjYWxsIGFuIGV4dGVybmFsIGZ1bmN0aW9uIChpbiB3aGljaAorICAvLy8gY2FzZSB3ZSBrbm93IG5vdGhpbmcgYWJvdXQgaXQuCisgIHN0cnVjdCBGdW5jdGlvblJlY29yZCB7CisgICAgLy8vIEdsb2JhbEluZm8gLSBNYWludGFpbiBtb2QvcmVmIGluZm8gZm9yIGFsbCBvZiB0aGUgZ2xvYmFscyB3aXRob3V0CisgICAgLy8vIGFkZHJlc3NlcyB0YWtlbiB0aGF0IGFyZSByZWFkIG9yIHdyaXR0ZW4gKHRyYW5zaXRpdmVseSkgYnkgdGhpcworICAgIC8vLyBmdW5jdGlvbi4KKyAgICBzdGQ6Om1hcDxjb25zdCBHbG9iYWxWYWx1ZSosIHVuc2lnbmVkPiBHbG9iYWxJbmZvOworCisgICAgLy8vIE1heVJlYWRBbnlHbG9iYWwgLSBNYXkgcmVhZCBnbG9iYWwgdmFyaWFibGVzLCBidXQgaXQgaXMgbm90IGtub3duIHdoaWNoLgorICAgIGJvb2wgTWF5UmVhZEFueUdsb2JhbDsKKworICAgIHVuc2lnbmVkIGdldEluZm9Gb3JHbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWKSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBFZmZlY3QgPSBNYXlSZWFkQW55R2xvYmFsID8gQWxpYXNBbmFseXNpczo6UmVmIDogMDsKKyAgICAgIHN0ZDo6bWFwPGNvbnN0IEdsb2JhbFZhbHVlKiwgdW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBJID0KKyAgICAgICAgR2xvYmFsSW5mby5maW5kKEdWKTsKKyAgICAgIGlmIChJICE9IEdsb2JhbEluZm8uZW5kKCkpCisgICAgICAgIEVmZmVjdCB8PSBJLT5zZWNvbmQ7CisgICAgICByZXR1cm4gRWZmZWN0OworICAgIH0KKworICAgIC8vLyBGdW5jdGlvbkVmZmVjdCAtIENhcHR1cmUgd2hldGhlciBvciBub3QgdGhpcyBmdW5jdGlvbiByZWFkcyBvciB3cml0ZXMgdG8KKyAgICAvLy8gQU5ZIG1lbW9yeS4gIElmIG5vdCwgd2UgY2FuIGRvIGEgbG90IG9mIGFnZ3Jlc3NpdmUgYW5hbHlzaXMgb24gaXQuCisgICAgdW5zaWduZWQgRnVuY3Rpb25FZmZlY3Q7CisKKyAgICBGdW5jdGlvblJlY29yZCgpIDogTWF5UmVhZEFueUdsb2JhbCAoZmFsc2UpLCBGdW5jdGlvbkVmZmVjdCgwKSB7fQorICB9OworCisgIC8vLyBHbG9iYWxzTW9kUmVmIC0gVGhlIGFjdHVhbCBhbmFseXNpcyBwYXNzLgorICBjbGFzcyBHbG9iYWxzTW9kUmVmIDogcHVibGljIE1vZHVsZVBhc3MsIHB1YmxpYyBBbGlhc0FuYWx5c2lzIHsKKyAgICAvLy8gTm9uQWRkcmVzc1Rha2VuR2xvYmFscyAtIFRoZSBnbG9iYWxzIHRoYXQgZG8gbm90IGhhdmUgdGhlaXIgYWRkcmVzc2VzCisgICAgLy8vIHRha2VuLgorICAgIHN0ZDo6c2V0PGNvbnN0IEdsb2JhbFZhbHVlKj4gTm9uQWRkcmVzc1Rha2VuR2xvYmFsczsKKworICAgIC8vLyBJbmRpcmVjdEdsb2JhbHMgLSBUaGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgdGhpcyBnbG9iYWwgaXMga25vd24gdG8gYmUKKyAgICAvLy8gJ293bmVkJyBieSB0aGUgZ2xvYmFsLgorICAgIHN0ZDo6c2V0PGNvbnN0IEdsb2JhbFZhbHVlKj4gSW5kaXJlY3RHbG9iYWxzOworCisgICAgLy8vIEFsbG9jc0ZvckluZGlyZWN0R2xvYmFscyAtIElmIGFuIGluc3RydWN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yIGFuCisgICAgLy8vIGluZGlyZWN0IGdsb2JhbCwgdGhpcyBtYXAgaW5kaWNhdGVzIHdoaWNoIG9uZS4KKyAgICBzdGQ6Om1hcDxjb25zdCBWYWx1ZSosIGNvbnN0IEdsb2JhbFZhbHVlKj4gQWxsb2NzRm9ySW5kaXJlY3RHbG9iYWxzOworCisgICAgLy8vIEZ1bmN0aW9uSW5mbyAtIEZvciBlYWNoIGZ1bmN0aW9uLCBrZWVwIHRyYWNrIG9mIHdoYXQgZ2xvYmFscyBhcmUKKyAgICAvLy8gbW9kaWZpZWQgb3IgcmVhZC4KKyAgICBzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiosIEZ1bmN0aW9uUmVjb3JkPiBGdW5jdGlvbkluZm87CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworICAgIEdsb2JhbHNNb2RSZWYoKSA6IE1vZHVsZVBhc3MoSUQpIHt9CisKKyAgICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICAgICAgSW5pdGlhbGl6ZUFsaWFzQW5hbHlzaXModGhpcyk7ICAgICAgICAgICAgICAgICAvLyBzZXQgdXAgc3VwZXIgY2xhc3MKKyAgICAgIEFuYWx5emVHbG9iYWxzKE0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBub24tYWRkciB0YWtlbiBnbG9iYWxzCisgICAgICBBbmFseXplQ2FsbEdyYXBoKGdldEFuYWx5c2lzPENhbGxHcmFwaD4oKSwgTSk7IC8vIFByb3BhZ2F0ZSBvbiBDRworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBbGlhc0FuYWx5c2lzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPENhbGxHcmFwaD4oKTsKKyAgICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2VzIG5vdCB0cmFuc2Zvcm0gY29kZQorICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW1wbGVtZW50IHRoZSBBbGlhc0FuYWx5c2lzIEFQSQorICAgIC8vCisgICAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgVmFsdWUgKlYxLCB1bnNpZ25lZCBWMVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlYyLCB1bnNpZ25lZCBWMlNpemUpOworICAgIE1vZFJlZlJlc3VsdCBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpQLCB1bnNpZ25lZCBTaXplKTsKKyAgICBNb2RSZWZSZXN1bHQgZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MyKSB7CisgICAgICByZXR1cm4gQWxpYXNBbmFseXNpczo6Z2V0TW9kUmVmSW5mbyhDUzEsIENTMik7CisgICAgfQorCisgICAgLy8vIGdldE1vZFJlZkJlaGF2aW9yIC0gUmV0dXJuIHRoZSBiZWhhdmlvciBvZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlmCisgICAgLy8vIGNhbGxlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY2FsbCBzaXRlLiAgVGhlIGNhbGwgc2l0ZSBtYXkgYmUgbnVsbCBpbiB3aGljaAorICAgIC8vLyBjYXNlIHRoZSBtb3N0IGdlbmVyaWMgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICAgIGlmIChGdW5jdGlvblJlY29yZCAqRlIgPSBnZXRGdW5jdGlvbkluZm8oRikpIHsKKyAgICAgICAgaWYgKEZSLT5GdW5jdGlvbkVmZmVjdCA9PSAwKQorICAgICAgICAgIHJldHVybiBEb2VzTm90QWNjZXNzTWVtb3J5OworICAgICAgICBlbHNlIGlmICgoRlItPkZ1bmN0aW9uRWZmZWN0ICYgTW9kKSA9PSAwKQorICAgICAgICAgIHJldHVybiBPbmx5UmVhZHNNZW1vcnk7CisgICAgICB9CisgICAgICByZXR1cm4gQWxpYXNBbmFseXNpczo6Z2V0TW9kUmVmQmVoYXZpb3IoRik7CisgICAgfQorICAgIAorICAgIC8vLyBnZXRNb2RSZWZCZWhhdmlvciAtIFJldHVybiB0aGUgYmVoYXZpb3Igb2YgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpZgorICAgIC8vLyBjYWxsZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGNhbGwgc2l0ZS4gIFRoZSBjYWxsIHNpdGUgbWF5IGJlIG51bGwgaW4gd2hpY2gKKyAgICAvLy8gY2FzZSB0aGUgbW9zdCBnZW5lcmljIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJldHVybmVkLgorICAgIE1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKEltbXV0YWJsZUNhbGxTaXRlIENTKSB7CisgICAgICBjb25zdCBGdW5jdGlvbiogRiA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCk7CisgICAgICBpZiAoIUYpIHJldHVybiBBbGlhc0FuYWx5c2lzOjpnZXRNb2RSZWZCZWhhdmlvcihDUyk7CisgICAgICBpZiAoRnVuY3Rpb25SZWNvcmQgKkZSID0gZ2V0RnVuY3Rpb25JbmZvKEYpKSB7CisgICAgICAgIGlmIChGUi0+RnVuY3Rpb25FZmZlY3QgPT0gMCkKKyAgICAgICAgICByZXR1cm4gRG9lc05vdEFjY2Vzc01lbW9yeTsKKyAgICAgICAgZWxzZSBpZiAoKEZSLT5GdW5jdGlvbkVmZmVjdCAmIE1vZCkgPT0gMCkKKyAgICAgICAgICByZXR1cm4gT25seVJlYWRzTWVtb3J5OworICAgICAgfQorICAgICAgcmV0dXJuIEFsaWFzQW5hbHlzaXM6OmdldE1vZFJlZkJlaGF2aW9yKENTKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlVmFsdWUoVmFsdWUgKlYpOworICAgIHZpcnR1YWwgdm9pZCBjb3B5VmFsdWUoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKKyAgICAvLy8gZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gYSBwYXNzIGltcGxlbWVudHMKKyAgICAvLy8gYW4gYW5hbHlzaXMgaW50ZXJmYWNlIHRocm91Z2ggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiBuZWVkZWQsIGl0CisgICAgLy8vIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGFkanVzdCB0aGUgdGhpcyBwb2ludGVyIGFzIG5lZWRlZCBmb3IgdGhlCisgICAgLy8vIHNwZWNpZmllZCBwYXNzIGluZm8uCisgICAgdmlydHVhbCB2b2lkICpnZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlcihBbmFseXNpc0lEIFBJKSB7CisgICAgICBpZiAoUEkgPT0gJkFsaWFzQW5hbHlzaXM6OklEKQorICAgICAgICByZXR1cm4gKEFsaWFzQW5hbHlzaXMqKXRoaXM7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgIHByaXZhdGU6CisgICAgLy8vIGdldEZ1bmN0aW9uSW5mbyAtIFJldHVybiB0aGUgZnVuY3Rpb24gaW5mbyBmb3IgdGhlIGZ1bmN0aW9uLCBvciBudWxsIGlmCisgICAgLy8vIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdXNlZnVsIHRvIHNheSBhYm91dCBpdC4KKyAgICBGdW5jdGlvblJlY29yZCAqZ2V0RnVuY3Rpb25JbmZvKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgICBzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiosIEZ1bmN0aW9uUmVjb3JkPjo6aXRlcmF0b3IgSSA9CisgICAgICAgIEZ1bmN0aW9uSW5mby5maW5kKEYpOworICAgICAgaWYgKEkgIT0gRnVuY3Rpb25JbmZvLmVuZCgpKQorICAgICAgICByZXR1cm4gJkktPnNlY29uZDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZvaWQgQW5hbHl6ZUdsb2JhbHMoTW9kdWxlICZNKTsKKyAgICB2b2lkIEFuYWx5emVDYWxsR3JhcGgoQ2FsbEdyYXBoICZDRywgTW9kdWxlICZNKTsKKyAgICBib29sIEFuYWx5emVVc2VzT2ZQb2ludGVyKFZhbHVlICpWLCBzdGQ6OnZlY3RvcjxGdW5jdGlvbio+ICZSZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RnVuY3Rpb24qPiAmV3JpdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlICpPa2F5U3RvcmVEZXN0ID0gMCk7CisgICAgYm9vbCBBbmFseXplSW5kaXJlY3RHbG9iYWxNZW1vcnkoR2xvYmFsVmFsdWUgKkdWKTsKKyAgfTsKK30KKworY2hhciBHbG9iYWxzTW9kUmVmOjpJRCA9IDA7CitzdGF0aWMgUmVnaXN0ZXJQYXNzPEdsb2JhbHNNb2RSZWY+CitYKCJnbG9iYWxzbW9kcmVmLWFhIiwgIlNpbXBsZSBtb2QvcmVmIGFuYWx5c2lzIGZvciBnbG9iYWxzIiwgZmFsc2UsIHRydWUpOworc3RhdGljIFJlZ2lzdGVyQW5hbHlzaXNHcm91cDxBbGlhc0FuYWx5c2lzPiBZKFgpOworCitQYXNzICpsbHZtOjpjcmVhdGVHbG9iYWxzTW9kUmVmUGFzcygpIHsgcmV0dXJuIG5ldyBHbG9iYWxzTW9kUmVmKCk7IH0KKworLy8vIEFuYWx5emVHbG9iYWxzIC0gU2NhbiB0aHJvdWdoIHRoZSB1c2VycyBvZiBhbGwgb2YgdGhlIGludGVybmFsCisvLy8gR2xvYmFsVmFsdWUncyBpbiB0aGUgcHJvZ3JhbS4gIElmIG5vbmUgb2YgdGhlbSBoYXZlIHRoZWlyICJhZGRyZXNzIHRha2VuIgorLy8vIChyZWFsbHksIHRoZWlyIGFkZHJlc3MgcGFzc2VkIHRvIHNvbWV0aGluZyBub250cml2aWFsKSwgcmVjb3JkIHRoaXMgZmFjdCwKKy8vLyBhbmQgcmVjb3JkIHRoZSBmdW5jdGlvbnMgdGhhdCB0aGV5IGFyZSB1c2VkIGRpcmVjdGx5IGluLgordm9pZCBHbG9iYWxzTW9kUmVmOjpBbmFseXplR2xvYmFscyhNb2R1bGUgJk0pIHsKKyAgc3RkOjp2ZWN0b3I8RnVuY3Rpb24qPiBSZWFkZXJzLCBXcml0ZXJzOworICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgSSA9IE0uYmVnaW4oKSwgRSA9IE0uZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChJLT5oYXNMb2NhbExpbmthZ2UoKSkgeworICAgICAgaWYgKCFBbmFseXplVXNlc09mUG9pbnRlcihJLCBSZWFkZXJzLCBXcml0ZXJzKSkgeworICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHdlIGFyZSB0cmFja2luZyB0aGlzIGdsb2JhbC4KKyAgICAgICAgTm9uQWRkcmVzc1Rha2VuR2xvYmFscy5pbnNlcnQoSSk7CisgICAgICAgICsrTnVtTm9uQWRkclRha2VuRnVuY3Rpb25zOworICAgICAgfQorICAgICAgUmVhZGVycy5jbGVhcigpOyBXcml0ZXJzLmNsZWFyKCk7CisgICAgfQorCisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBpZiAoSS0+aGFzTG9jYWxMaW5rYWdlKCkpIHsKKyAgICAgIGlmICghQW5hbHl6ZVVzZXNPZlBvaW50ZXIoSSwgUmVhZGVycywgV3JpdGVycykpIHsKKyAgICAgICAgLy8gUmVtZW1iZXIgdGhhdCB3ZSBhcmUgdHJhY2tpbmcgdGhpcyBnbG9iYWwsIGFuZCB0aGUgbW9kL3JlZiBmbnMKKyAgICAgICAgTm9uQWRkcmVzc1Rha2VuR2xvYmFscy5pbnNlcnQoSSk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlYWRlcnMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBGdW5jdGlvbkluZm9bUmVhZGVyc1tpXV0uR2xvYmFsSW5mb1tJXSB8PSBSZWY7CisKKyAgICAgICAgaWYgKCFJLT5pc0NvbnN0YW50KCkpICAvLyBObyBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd3JpdGVycyB0byBjb25zdGFudHMKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gV3JpdGVycy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgRnVuY3Rpb25JbmZvW1dyaXRlcnNbaV1dLkdsb2JhbEluZm9bSV0gfD0gTW9kOworICAgICAgICArK051bU5vbkFkZHJUYWtlbkdsb2JhbFZhcnM7CisKKyAgICAgICAgLy8gSWYgdGhpcyBnbG9iYWwgaG9sZHMgYSBwb2ludGVyIHR5cGUsIHNlZSBpZiBpdCBpcyBhbiBpbmRpcmVjdCBnbG9iYWwuCisgICAgICAgIGlmIChJLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCktPmlzUG9pbnRlclR5KCkgJiYKKyAgICAgICAgICAgIEFuYWx5emVJbmRpcmVjdEdsb2JhbE1lbW9yeShJKSkKKyAgICAgICAgICArK051bUluZGlyZWN0R2xvYmFsVmFyczsKKyAgICAgIH0KKyAgICAgIFJlYWRlcnMuY2xlYXIoKTsgV3JpdGVycy5jbGVhcigpOworICAgIH0KK30KKworLy8vIEFuYWx5emVVc2VzT2ZQb2ludGVyIC0gTG9vayBhdCBhbGwgb2YgdGhlIHVzZXJzIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnRlci4KKy8vLyBJZiB0aGlzIGlzIHVzZWQgYnkgYW55dGhpbmcgY29tcGxleCAoaS5lLiwgdGhlIGFkZHJlc3MgZXNjYXBlcyksIHJldHVybgorLy8vIHRydWUuICBBbHNvLCB3aGlsZSB3ZSBhcmUgYXQgaXQsIGtlZXAgdHJhY2sgb2YgdGhvc2UgZnVuY3Rpb25zIHRoYXQgcmVhZCBhbmQKKy8vLyB3cml0ZSB0byB0aGUgdmFsdWUuCisvLy8KKy8vLyBJZiBPa2F5U3RvcmVEZXN0IGlzIG5vbi1udWxsLCBzdG9yZXMgaW50byB0aGlzIGdsb2JhbCBhcmUgYWxsb3dlZC4KK2Jvb2wgR2xvYmFsc01vZFJlZjo6QW5hbHl6ZVVzZXNPZlBvaW50ZXIoVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uKj4gJlJlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uKj4gJldyaXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlICpPa2F5U3RvcmVEZXN0KSB7CisgIGlmICghVi0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSByZXR1cm4gdHJ1ZTsKKworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRT1WLT51c2VfZW5kKCk7IFVJICE9IEU7ICsrVUkpIHsKKyAgICBVc2VyICpVID0gKlVJOworICAgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oVSkpIHsKKyAgICAgIFJlYWRlcnMucHVzaF9iYWNrKExJLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkpOworICAgIH0gZWxzZSBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oVSkpIHsKKyAgICAgIGlmIChWID09IFNJLT5nZXRPcGVyYW5kKDEpKSB7CisgICAgICAgIFdyaXRlcnMucHVzaF9iYWNrKFNJLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkpOworICAgICAgfSBlbHNlIGlmIChTSS0+Z2V0T3BlcmFuZCgxKSAhPSBPa2F5U3RvcmVEZXN0KSB7CisgICAgICAgIHJldHVybiB0cnVlOyAgLy8gU3RvcmluZyB0aGUgcG9pbnRlcgorICAgICAgfQorICAgIH0gZWxzZSBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUCA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihVKSkgeworICAgICAgaWYgKEFuYWx5emVVc2VzT2ZQb2ludGVyKEdFUCwgUmVhZGVycywgV3JpdGVycykpIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoQml0Q2FzdEluc3QgKkJDSSA9IGR5bl9jYXN0PEJpdENhc3RJbnN0PihVKSkgeworICAgICAgaWYgKEFuYWx5emVVc2VzT2ZQb2ludGVyKEJDSSwgUmVhZGVycywgV3JpdGVycywgT2theVN0b3JlRGVzdCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXNGcmVlQ2FsbChVKSkgeworICAgICAgV3JpdGVycy5wdXNoX2JhY2soY2FzdDxJbnN0cnVjdGlvbj4oVSktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKSk7CisgICAgfSBlbHNlIGlmIChDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oVSkpIHsKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMganVzdCB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLCBub3QgdGhhdCBpdCBpcworICAgICAgLy8gcGFzc2luZyBpbnRvIHRoZSBmdW5jdGlvbi4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDSS0+Z2V0TnVtQXJnT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChDSS0+Z2V0QXJnT3BlcmFuZChpKSA9PSBWKSByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKEludm9rZUluc3QgKklJID0gZHluX2Nhc3Q8SW52b2tlSW5zdD4oVSkpIHsKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMganVzdCB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLCBub3QgdGhhdCBpdCBpcworICAgICAgLy8gcGFzc2luZyBpbnRvIHRoZSBmdW5jdGlvbi4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJSS0+Z2V0TnVtQXJnT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChJSS0+Z2V0QXJnT3BlcmFuZChpKSA9PSBWKSByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFUpKSB7CisgICAgICBpZiAoQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyIHx8CisgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpCaXRDYXN0KSB7CisgICAgICAgIGlmIChBbmFseXplVXNlc09mUG9pbnRlcihDRSwgUmVhZGVycywgV3JpdGVycykpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKElDbXBJbnN0ICpJQ0kgPSBkeW5fY2FzdDxJQ21wSW5zdD4oVSkpIHsKKyAgICAgIGlmICghaXNhPENvbnN0YW50UG9pbnRlck51bGw+KElDSS0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICAgIHJldHVybiB0cnVlOyAgLy8gQWxsb3cgY29tcGFyaXNvbiBhZ2FpbnN0IG51bGwuCisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEFuYWx5emVJbmRpcmVjdEdsb2JhbE1lbW9yeSAtIFdlIGZvdW5kIGFuIG5vbi1hZGRyZXNzLXRha2VuIGdsb2JhbCB2YXJpYWJsZQorLy8vIHdoaWNoIGhvbGRzIGEgcG9pbnRlciB0eXBlLiAgU2VlIGlmIHRoZSBnbG9iYWwgYWx3YXlzIHBvaW50cyB0byBub24tYWxpYXNlZAorLy8vIGhlYXAgbWVtb3J5OiB0aGF0IGlzLCBhbGwgaW5pdGlhbGl6ZXJzIG9mIHRoZSBnbG9iYWxzIGFyZSBhbGxvY2F0aW9ucywgYW5kCisvLy8gdGhvc2UgYWxsb2NhdGlvbnMgaGF2ZSBubyB1c2Ugb3RoZXIgdGhhbiBpbml0aWFsaXphdGlvbiBvZiB0aGUgZ2xvYmFsLgorLy8vIEZ1cnRoZXIsIGFsbCBsb2FkcyBvdXQgb2YgR1YgbXVzdCBkaXJlY3RseSB1c2UgdGhlIG1lbW9yeSwgbm90IHN0b3JlIHRoZQorLy8vIHBvaW50ZXIgc29tZXdoZXJlLiAgSWYgdGhpcyBpcyB0cnVlLCB3ZSBjb25zaWRlciB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkKKy8vLyBHViB0byBiZSBvd25lZCBieSBHViBhbmQgY2FuIGRpc2FtYmlndWF0ZSBvdGhlciBwb2ludGVycyBmcm9tIGl0LgorYm9vbCBHbG9iYWxzTW9kUmVmOjpBbmFseXplSW5kaXJlY3RHbG9iYWxNZW1vcnkoR2xvYmFsVmFsdWUgKkdWKSB7CisgIC8vIEtlZXAgdHJhY2sgb2YgdmFsdWVzIHJlbGF0ZWQgdG8gdGhlIGFsbG9jYXRpb24gb2YgdGhlIG1lbW9yeSwgZi5lLiB0aGUKKyAgLy8gdmFsdWUgcHJvZHVjZWQgYnkgdGhlIG1hbGxvYyBjYWxsIGFuZCBhbnkgY2FzdHMuCisgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQWxsb2NSZWxhdGVkVmFsdWVzOworCisgIC8vIFdhbGsgdGhlIHVzZXIgbGlzdCBvZiB0aGUgZ2xvYmFsLiAgSWYgd2UgZmluZCBhbnl0aGluZyBvdGhlciB0aGFuIGEgZGlyZWN0CisgIC8vIGxvYWQgb3Igc3RvcmUsIGJhaWwgb3V0LgorICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgSSA9IEdWLT51c2VfYmVnaW4oKSwgRSA9IEdWLT51c2VfZW5kKCk7IEkgIT0gRTsgKytJKXsKKyAgICBVc2VyICpVID0gKkk7CisgICAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihVKSkgeworICAgICAgLy8gVGhlIHBvaW50ZXIgbG9hZGVkIGZyb20gdGhlIGdsb2JhbCBjYW4gb25seSBiZSB1c2VkIGluIHNpbXBsZSB3YXlzOgorICAgICAgLy8gd2UgYWxsb3cgYWRkcmVzc2luZyBvZiBpdCBhbmQgbG9hZGluZyBzdG9yaW5nIHRvIGl0LiAgV2UgZG8gKm5vdCogYWxsb3cKKyAgICAgIC8vIHN0b3JpbmcgdGhlIGxvYWRlZCBwb2ludGVyIHNvbWV3aGVyZSBlbHNlIG9yIHBhc3NpbmcgdG8gYSBmdW5jdGlvbi4KKyAgICAgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uKj4gUmVhZGVyc1dyaXRlcnM7CisgICAgICBpZiAoQW5hbHl6ZVVzZXNPZlBvaW50ZXIoTEksIFJlYWRlcnNXcml0ZXJzLCBSZWFkZXJzV3JpdGVycykpCisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIExvYWRlZCBwb2ludGVyIGVzY2FwZXMuCisgICAgICAvLyBUT0RPOiBDb3VsZCB0cnkgc29tZSBJUCBtb2QvcmVmIG9mIHRoZSBsb2FkZWQgcG9pbnRlci4KKyAgICB9IGVsc2UgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFUpKSB7CisgICAgICAvLyBTdG9yaW5nIHRoZSBnbG9iYWwgaXRzZWxmLgorICAgICAgaWYgKFNJLT5nZXRPcGVyYW5kKDApID09IEdWKSByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8vIElmIHN0b3JpbmcgdGhlIG51bGwgcG9pbnRlciwgaWdub3JlIGl0LgorICAgICAgaWYgKGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihTSS0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBDaGVjayB0aGUgdmFsdWUgYmVpbmcgc3RvcmVkLgorICAgICAgVmFsdWUgKlB0ciA9IFNJLT5nZXRPcGVyYW5kKDApLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCk7CisKKyAgICAgIGlmIChpc01hbGxvYyhQdHIpKSB7CisgICAgICAgIC8vIE9rYXksIGVhc3kgY2FzZS4KKyAgICAgIH0gZWxzZSBpZiAoQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KFB0cikpIHsKKyAgICAgICAgRnVuY3Rpb24gKkYgPSBDSS0+Z2V0Q2FsbGVkRnVuY3Rpb24oKTsKKyAgICAgICAgaWYgKCFGIHx8ICFGLT5pc0RlY2xhcmF0aW9uKCkpIHJldHVybiBmYWxzZTsgICAgIC8vIFRvbyBoYXJkIHRvIGFuYWx5emUuCisgICAgICAgIGlmIChGLT5nZXROYW1lKCkgIT0gImNhbGxvYyIpIHJldHVybiBmYWxzZTsgICAvLyBOb3QgY2FsbG9jLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gVG9vIGhhcmQgdG8gYW5hbHl6ZS4KKyAgICAgIH0KKworICAgICAgLy8gQW5hbHl6ZSBhbGwgdXNlcyBvZiB0aGUgYWxsb2NhdGlvbi4gIElmIGFueSBvZiB0aGVtIGFyZSB1c2VkIGluIGEKKyAgICAgIC8vIG5vbi1zaW1wbGUgd2F5IChlLmcuIHN0b3JlZCB0byBhbm90aGVyIGdsb2JhbCkgYmFpbCBvdXQuCisgICAgICBzdGQ6OnZlY3RvcjxGdW5jdGlvbio+IFJlYWRlcnNXcml0ZXJzOworICAgICAgaWYgKEFuYWx5emVVc2VzT2ZQb2ludGVyKFB0ciwgUmVhZGVyc1dyaXRlcnMsIFJlYWRlcnNXcml0ZXJzLCBHVikpCisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIExvYWRlZCBwb2ludGVyIGVzY2FwZXMuCisKKyAgICAgIC8vIFJlbWVtYmVyIHRoYXQgdGhpcyBhbGxvY2F0aW9uIGlzIHJlbGF0ZWQgdG8gdGhlIGluZGlyZWN0IGdsb2JhbC4KKyAgICAgIEFsbG9jUmVsYXRlZFZhbHVlcy5wdXNoX2JhY2soUHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU29tZXRoaW5nIGNvbXBsZXgsIGJhaWwgb3V0LgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIE9rYXksIHRoaXMgaXMgYW4gaW5kaXJlY3QgZ2xvYmFsLiAgUmVtZW1iZXIgYWxsIG9mIHRoZSBhbGxvY2F0aW9ucyBmb3IKKyAgLy8gdGhpcyBnbG9iYWwgaW4gQWxsb2NzRm9ySW5kaXJlY3RHbG9iYWxzLgorICB3aGlsZSAoIUFsbG9jUmVsYXRlZFZhbHVlcy5lbXB0eSgpKSB7CisgICAgQWxsb2NzRm9ySW5kaXJlY3RHbG9iYWxzW0FsbG9jUmVsYXRlZFZhbHVlcy5iYWNrKCldID0gR1Y7CisgICAgQWxsb2NSZWxhdGVkVmFsdWVzLnBvcF9iYWNrKCk7CisgIH0KKyAgSW5kaXJlY3RHbG9iYWxzLmluc2VydChHVik7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gQW5hbHl6ZUNhbGxHcmFwaCAtIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhlIGZ1bmN0aW9ucyB3aGVyZSBnbG9iYWxzIGFyZQorLy8vIGltbWVkaWF0ZWx5IHN0b3JlZCB0byBhbmQgcmVhZCBmcm9tLiAgUHJvcGFnYXRlIHRoaXMgaW5mb3JtYXRpb24gdXAgdGhlIGNhbGwKKy8vLyBncmFwaCB0byBhbGwgY2FsbGVycyBhbmQgY29tcHV0ZSB0aGUgbW9kL3JlZiBpbmZvIGZvciBhbGwgbWVtb3J5IGZvciBlYWNoCisvLy8gZnVuY3Rpb24uCit2b2lkIEdsb2JhbHNNb2RSZWY6OkFuYWx5emVDYWxsR3JhcGgoQ2FsbEdyYXBoICZDRywgTW9kdWxlICZNKSB7CisgIC8vIFdlIGRvIGEgYm90dG9tLXVwIFNDQyB0cmF2ZXJzYWwgb2YgdGhlIGNhbGwgZ3JhcGguICBJbiBvdGhlciB3b3Jkcywgd2UKKyAgLy8gdmlzaXQgYWxsIGNhbGxlZXMgYmVmb3JlIGNhbGxlcnMgKGxlYWYtZmlyc3QpLgorICBmb3IgKHNjY19pdGVyYXRvcjxDYWxsR3JhcGgqPiBJID0gc2NjX2JlZ2luKCZDRyksIEUgPSBzY2NfZW5kKCZDRyk7IEkgIT0gRTsKKyAgICAgICArK0kpIHsKKyAgICBzdGQ6OnZlY3RvcjxDYWxsR3JhcGhOb2RlICo+ICZTQ0MgPSAqSTsKKyAgICBhc3NlcnQoIVNDQy5lbXB0eSgpICYmICJTQ0Mgd2l0aCBubyBmdW5jdGlvbnM/Iik7CisKKyAgICBpZiAoIVNDQ1swXS0+Z2V0RnVuY3Rpb24oKSkgeworICAgICAgLy8gQ2FsbHMgZXh0ZXJuYWxseSAtIGNhbid0IHNheSBhbnl0aGluZyB1c2VmdWwuICBSZW1vdmUgYW55IGV4aXN0aW5nCisgICAgICAvLyBmdW5jdGlvbiByZWNvcmRzIChtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBzY2FubmluZyBnbG9iYWxzKS4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTQ0Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgRnVuY3Rpb25JbmZvLmVyYXNlKFNDQ1tpXS0+Z2V0RnVuY3Rpb24oKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBGdW5jdGlvblJlY29yZCAmRlIgPSBGdW5jdGlvbkluZm9bU0NDWzBdLT5nZXRGdW5jdGlvbigpXTsKKworICAgIGJvb2wgS25vd05vdGhpbmcgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBGdW5jdGlvbkVmZmVjdCA9IDA7CisKKyAgICAvLyBDb2xsZWN0IHRoZSBtb2QvcmVmIHByb3BlcnRpZXMgZHVlIHRvIGNhbGxlZCBmdW5jdGlvbnMuICBXZSBvbmx5IGNvbXB1dGUKKyAgICAvLyBvbmUgbW9kLXJlZiBzZXQuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNDQy5zaXplKCk7IGkgIT0gZSAmJiAhS25vd05vdGhpbmc7ICsraSkgeworICAgICAgRnVuY3Rpb24gKkYgPSBTQ0NbaV0tPmdldEZ1bmN0aW9uKCk7CisgICAgICBpZiAoIUYpIHsKKyAgICAgICAgS25vd05vdGhpbmcgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSkgeworICAgICAgICAvLyBUcnkgdG8gZ2V0IG1vZC9yZWYgYmVoYXZpb3VyIGZyb20gZnVuY3Rpb24gYXR0cmlidXRlcy4KKyAgICAgICAgaWYgKEYtPmRvZXNOb3RBY2Nlc3NNZW1vcnkoKSkgeworICAgICAgICAgIC8vIENhbid0IGRvIGJldHRlciB0aGFuIHRoYXQhCisgICAgICAgIH0gZWxzZSBpZiAoRi0+b25seVJlYWRzTWVtb3J5KCkpIHsKKyAgICAgICAgICBGdW5jdGlvbkVmZmVjdCB8PSBSZWY7CisgICAgICAgICAgaWYgKCFGLT5pc0ludHJpbnNpYygpKQorICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBtaWdodCBjYWxsIGJhY2sgaW50byB0aGUgbW9kdWxlIGFuZCByZWFkIGEgZ2xvYmFsIC0KKyAgICAgICAgICAgIC8vIGNvbnNpZGVyIGV2ZXJ5IGdsb2JhbCBhcyBwb3NzaWJseSBiZWluZyByZWFkIGJ5IHRoaXMgZnVuY3Rpb24uCisgICAgICAgICAgICBGUi5NYXlSZWFkQW55R2xvYmFsID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGdW5jdGlvbkVmZmVjdCB8PSBNb2RSZWY7CisgICAgICAgICAgLy8gQ2FuJ3Qgc2F5IGFueXRoaW5nIHVzZWZ1bCB1bmxlc3MgaXQncyBhbiBpbnRyaW5zaWMgLSB0aGV5IGRvbid0CisgICAgICAgICAgLy8gcmVhZCBvciB3cml0ZSBnbG9iYWwgdmFyaWFibGVzIG9mIHRoZSBraW5kIGNvbnNpZGVyZWQgaGVyZS4KKyAgICAgICAgICBLbm93Tm90aGluZyA9ICFGLT5pc0ludHJpbnNpYygpOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmb3IgKENhbGxHcmFwaE5vZGU6Oml0ZXJhdG9yIENJID0gU0NDW2ldLT5iZWdpbigpLCBFID0gU0NDW2ldLT5lbmQoKTsKKyAgICAgICAgICAgQ0kgIT0gRSAmJiAhS25vd05vdGhpbmc7ICsrQ0kpCisgICAgICAgIGlmIChGdW5jdGlvbiAqQ2FsbGVlID0gQ0ktPnNlY29uZC0+Z2V0RnVuY3Rpb24oKSkgeworICAgICAgICAgIGlmIChGdW5jdGlvblJlY29yZCAqQ2FsbGVlRlIgPSBnZXRGdW5jdGlvbkluZm8oQ2FsbGVlKSkgeworICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGZ1bmN0aW9uIGVmZmVjdCB1cC4KKyAgICAgICAgICAgIEZ1bmN0aW9uRWZmZWN0IHw9IENhbGxlZUZSLT5GdW5jdGlvbkVmZmVjdDsKKworICAgICAgICAgICAgLy8gSW5jb3Jwb3JhdGUgY2FsbGVlJ3MgZWZmZWN0cyBvbiBnbG9iYWxzIGludG8gb3VyIGluZm8uCisgICAgICAgICAgICBmb3IgKHN0ZDo6bWFwPGNvbnN0IEdsb2JhbFZhbHVlKiwgdW5zaWduZWQ+OjppdGVyYXRvciBHSSA9CisgICAgICAgICAgICAgICAgICAgQ2FsbGVlRlItPkdsb2JhbEluZm8uYmVnaW4oKSwgRSA9IENhbGxlZUZSLT5HbG9iYWxJbmZvLmVuZCgpOworICAgICAgICAgICAgICAgICBHSSAhPSBFOyArK0dJKQorICAgICAgICAgICAgICBGUi5HbG9iYWxJbmZvW0dJLT5maXJzdF0gfD0gR0ktPnNlY29uZDsKKyAgICAgICAgICAgIEZSLk1heVJlYWRBbnlHbG9iYWwgfD0gQ2FsbGVlRlItPk1heVJlYWRBbnlHbG9iYWw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENhbid0IHNheSBhbnl0aGluZyBhYm91dCBpdC4gIEhvd2V2ZXIsIGlmIGl0IGlzIGluc2lkZSBvdXIgU0NDLAorICAgICAgICAgICAgLy8gdGhlbiBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUuCisgICAgICAgICAgICBDYWxsR3JhcGhOb2RlICpDYWxsZWVOb2RlID0gQ0dbQ2FsbGVlXTsKKyAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoU0NDLmJlZ2luKCksIFNDQy5lbmQoKSwgQ2FsbGVlTm9kZSkgPT0gU0NDLmVuZCgpKQorICAgICAgICAgICAgICBLbm93Tm90aGluZyA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEtub3dOb3RoaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHdlIGNhbid0IHNheSBhbnl0aGluZyB1c2VmdWwgYWJvdXQgdGhpcyBTQ0MsIHJlbW92ZSBhbGwgU0NDIGZ1bmN0aW9ucworICAgIC8vIGZyb20gdGhlIEZ1bmN0aW9uSW5mbyBtYXAuCisgICAgaWYgKEtub3dOb3RoaW5nKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU0NDLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIEZ1bmN0aW9uSW5mby5lcmFzZShTQ0NbaV0tPmdldEZ1bmN0aW9uKCkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gU2NhbiB0aGUgZnVuY3Rpb24gYm9kaWVzIGZvciBleHBsaWNpdCBsb2FkcyBvciBzdG9yZXMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNDQy5zaXplKCk7IGkgIT0gZSAmJiBGdW5jdGlvbkVmZmVjdCAhPSBNb2RSZWY7KytpKQorICAgICAgZm9yIChpbnN0X2l0ZXJhdG9yIElJID0gaW5zdF9iZWdpbihTQ0NbaV0tPmdldEZ1bmN0aW9uKCkpLAorICAgICAgICAgICAgIEUgPSBpbnN0X2VuZChTQ0NbaV0tPmdldEZ1bmN0aW9uKCkpOworICAgICAgICAgICBJSSAhPSBFICYmIEZ1bmN0aW9uRWZmZWN0ICE9IE1vZFJlZjsgKytJSSkKKyAgICAgICAgaWYgKGlzYTxMb2FkSW5zdD4oKklJKSkgeworICAgICAgICAgIEZ1bmN0aW9uRWZmZWN0IHw9IFJlZjsKKyAgICAgICAgICBpZiAoY2FzdDxMb2FkSW5zdD4oKklJKS5pc1ZvbGF0aWxlKCkpCisgICAgICAgICAgICAvLyBWb2xhdGlsZSBsb2FkcyBtYXkgaGF2ZSBzaWRlLWVmZmVjdHMsIHNvIG1hcmsgdGhlbSBhcyB3cml0aW5nCisgICAgICAgICAgICAvLyBtZW1vcnkgKGZvciBleGFtcGxlLCBhIGZsYWcgaW5zaWRlIHRoZSBwcm9jZXNzb3IpLgorICAgICAgICAgICAgRnVuY3Rpb25FZmZlY3QgfD0gTW9kOworICAgICAgICB9IGVsc2UgaWYgKGlzYTxTdG9yZUluc3Q+KCpJSSkpIHsKKyAgICAgICAgICBGdW5jdGlvbkVmZmVjdCB8PSBNb2Q7CisgICAgICAgICAgaWYgKGNhc3Q8U3RvcmVJbnN0PigqSUkpLmlzVm9sYXRpbGUoKSkKKyAgICAgICAgICAgIC8vIFRyZWF0IHZvbGF0aWxlIHN0b3JlcyBhcyByZWFkaW5nIG1lbW9yeSBzb21ld2hlcmUuCisgICAgICAgICAgICBGdW5jdGlvbkVmZmVjdCB8PSBSZWY7CisgICAgICAgIH0gZWxzZSBpZiAoaXNNYWxsb2MoJmNhc3Q8SW5zdHJ1Y3Rpb24+KCpJSSkpIHx8CisgICAgICAgICAgICAgICAgICAgaXNGcmVlQ2FsbCgmY2FzdDxJbnN0cnVjdGlvbj4oKklJKSkpIHsKKyAgICAgICAgICBGdW5jdGlvbkVmZmVjdCB8PSBNb2RSZWY7CisgICAgICAgIH0KKworICAgIGlmICgoRnVuY3Rpb25FZmZlY3QgJiBNb2QpID09IDApCisgICAgICArK051bVJlYWRNZW1GdW5jdGlvbnM7CisgICAgaWYgKEZ1bmN0aW9uRWZmZWN0ID09IDApCisgICAgICArK051bU5vTWVtRnVuY3Rpb25zOworICAgIEZSLkZ1bmN0aW9uRWZmZWN0ID0gRnVuY3Rpb25FZmZlY3Q7CisKKyAgICAvLyBGaW5hbGx5LCBub3cgdGhhdCB3ZSBrbm93IHRoZSBmdWxsIGVmZmVjdCBvbiB0aGlzIFNDQywgY2xvbmUgdGhlCisgICAgLy8gaW5mb3JtYXRpb24gdG8gZWFjaCBmdW5jdGlvbiBpbiB0aGUgU0NDLgorICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBTQ0Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIEZ1bmN0aW9uSW5mb1tTQ0NbaV0tPmdldEZ1bmN0aW9uKCldID0gRlI7CisgIH0KK30KKworCisKKy8vLyBhbGlhcyAtIElmIG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgdG8gYSBnbG9iYWwgdGhhdCB3ZSBhcmUgdHJhY2tpbmcsIGFuZCB0aGUKKy8vLyBvdGhlciBpcyBzb21lIHJhbmRvbSBwb2ludGVyLCB3ZSBrbm93IHRoZXJlIGNhbm5vdCBiZSBhbiBhbGlhcywgYmVjYXVzZSB0aGUKKy8vLyBhZGRyZXNzIG9mIHRoZSBnbG9iYWwgaXNuJ3QgdGFrZW4uCitBbGlhc0FuYWx5c2lzOjpBbGlhc1Jlc3VsdAorR2xvYmFsc01vZFJlZjo6YWxpYXMoY29uc3QgVmFsdWUgKlYxLCB1bnNpZ25lZCBWMVNpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVjIsIHVuc2lnbmVkIFYyU2l6ZSkgeworICAvLyBHZXQgdGhlIGJhc2Ugb2JqZWN0IHRoZXNlIHBvaW50ZXJzIHBvaW50IHRvLgorICBjb25zdCBWYWx1ZSAqVVYxID0gVjEtPmdldFVuZGVybHlpbmdPYmplY3QoKTsKKyAgY29uc3QgVmFsdWUgKlVWMiA9IFYyLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCk7CisKKyAgLy8gSWYgZWl0aGVyIG9mIHRoZSB1bmRlcmx5aW5nIHZhbHVlcyBpcyBhIGdsb2JhbCwgdGhleSBtYXkgYmUgbm9uLWFkZHItdGFrZW4KKyAgLy8gZ2xvYmFscywgd2hpY2ggd2UgY2FuIGFuc3dlciBxdWVyaWVzIGFib3V0LgorICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YxID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KFVWMSk7CisgIGNvbnN0IEdsb2JhbFZhbHVlICpHVjIgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oVVYyKTsKKyAgaWYgKEdWMSB8fCBHVjIpIHsKKyAgICAvLyBJZiB0aGUgZ2xvYmFsJ3MgYWRkcmVzcyBpcyB0YWtlbiwgcHJldGVuZCB3ZSBkb24ndCBrbm93IGl0J3MgYSBwb2ludGVyIHRvCisgICAgLy8gdGhlIGdsb2JhbC4KKyAgICBpZiAoR1YxICYmICFOb25BZGRyZXNzVGFrZW5HbG9iYWxzLmNvdW50KEdWMSkpIEdWMSA9IDA7CisgICAgaWYgKEdWMiAmJiAhTm9uQWRkcmVzc1Rha2VuR2xvYmFscy5jb3VudChHVjIpKSBHVjIgPSAwOworCisgICAgLy8gSWYgdGhlIHR3byBwb2ludGVycyBhcmUgZGVyaXZlZCBmcm9tIHR3byBkaWZmZXJlbnQgbm9uLWFkZHItdGFrZW4KKyAgICAvLyBnbG9iYWxzLCBvciBpZiBvbmUgaXMgYW5kIHRoZSBvdGhlciBpc24ndCwgd2Uga25vdyB0aGVzZSBjYW4ndCBhbGlhcy4KKyAgICBpZiAoKEdWMSB8fCBHVjIpICYmIEdWMSAhPSBHVjIpCisgICAgICByZXR1cm4gTm9BbGlhczsKKworICAgIC8vIE90aGVyd2lzZSBpZiB0aGV5IGFyZSBib3RoIGRlcml2ZWQgZnJvbSB0aGUgc2FtZSBhZGRyLXRha2VuIGdsb2JhbCwgd2UKKyAgICAvLyBjYW4ndCBrbm93IHRoZSB0d28gYWNjZXNzZXMgZG9uJ3Qgb3ZlcmxhcC4KKyAgfQorCisgIC8vIFRoZXNlIHBvaW50ZXJzIG1heSBiZSBiYXNlZCBvbiB0aGUgbWVtb3J5IG93bmVkIGJ5IGFuIGluZGlyZWN0IGdsb2JhbC4gIElmCisgIC8vIHNvLCB3ZSBtYXkgYmUgYWJsZSB0byBoYW5kbGUgdGhpcy4gIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgYmFzZSBwb2ludGVyCisgIC8vIGlzIGEgZGlyZWN0IGxvYWQgZnJvbSBhbiBpbmRpcmVjdCBnbG9iYWwuCisgIEdWMSA9IEdWMiA9IDA7CisgIGlmIChjb25zdCBMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oVVYxKSkKKyAgICBpZiAoR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KExJLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgIGlmIChJbmRpcmVjdEdsb2JhbHMuY291bnQoR1YpKQorICAgICAgICBHVjEgPSBHVjsKKyAgaWYgKGNvbnN0IExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihVVjIpKQorICAgIGlmIChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oTEktPmdldE9wZXJhbmQoMCkpKQorICAgICAgaWYgKEluZGlyZWN0R2xvYmFscy5jb3VudChHVikpCisgICAgICAgIEdWMiA9IEdWOworCisgIC8vIFRoZXNlIHBvaW50ZXJzIG1heSBhbHNvIGJlIGZyb20gYW4gYWxsb2NhdGlvbiBmb3IgdGhlIGluZGlyZWN0IGdsb2JhbC4gIElmCisgIC8vIHNvLCBhbHNvIGhhbmRsZSB0aGVtLgorICBpZiAoQWxsb2NzRm9ySW5kaXJlY3RHbG9iYWxzLmNvdW50KFVWMSkpCisgICAgR1YxID0gQWxsb2NzRm9ySW5kaXJlY3RHbG9iYWxzW1VWMV07CisgIGlmIChBbGxvY3NGb3JJbmRpcmVjdEdsb2JhbHMuY291bnQoVVYyKSkKKyAgICBHVjIgPSBBbGxvY3NGb3JJbmRpcmVjdEdsb2JhbHNbVVYyXTsKKworICAvLyBOb3cgdGhhdCB3ZSBrbm93IHdoZXRoZXIgdGhlIHR3byBwb2ludGVycyBhcmUgcmVsYXRlZCB0byBpbmRpcmVjdCBnbG9iYWxzLAorICAvLyB1c2UgdGhpcyB0byBkaXNhbWJpZ3VhdGUgdGhlIHBvaW50ZXJzLiAgSWYgZWl0aGVyIHBvaW50ZXIgaXMgYmFzZWQgb24gYW4KKyAgLy8gaW5kaXJlY3QgZ2xvYmFsIGFuZCBpZiB0aGV5IGFyZSBub3QgYm90aCBiYXNlZCBvbiB0aGUgc2FtZSBpbmRpcmVjdCBnbG9iYWwsCisgIC8vIHRoZXkgY2Fubm90IGFsaWFzLgorICBpZiAoKEdWMSB8fCBHVjIpICYmIEdWMSAhPSBHVjIpCisgICAgcmV0dXJuIE5vQWxpYXM7CisKKyAgcmV0dXJuIEFsaWFzQW5hbHlzaXM6OmFsaWFzKFYxLCBWMVNpemUsIFYyLCBWMlNpemUpOworfQorCitBbGlhc0FuYWx5c2lzOjpNb2RSZWZSZXN1bHQKK0dsb2JhbHNNb2RSZWY6OmdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpQLCB1bnNpZ25lZCBTaXplKSB7CisgIHVuc2lnbmVkIEtub3duID0gTW9kUmVmOworCisgIC8vIElmIHdlIGFyZSBhc2tpbmcgZm9yIG1vZC9yZWYgaW5mbyBvZiBhIGRpcmVjdCBjYWxsIHdpdGggYSBwb2ludGVyIHRvIGEKKyAgLy8gZ2xvYmFsIHdlIGFyZSB0cmFja2luZywgcmV0dXJuIGluZm9ybWF0aW9uIGlmIHdlIGhhdmUgaXQuCisgIGlmIChjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oUC0+Z2V0VW5kZXJseWluZ09iamVjdCgpKSkKKyAgICBpZiAoR1YtPmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgaWYgKGNvbnN0IEZ1bmN0aW9uICpGID0gQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKSkKKyAgICAgICAgaWYgKE5vbkFkZHJlc3NUYWtlbkdsb2JhbHMuY291bnQoR1YpKQorICAgICAgICAgIGlmIChjb25zdCBGdW5jdGlvblJlY29yZCAqRlIgPSBnZXRGdW5jdGlvbkluZm8oRikpCisgICAgICAgICAgICBLbm93biA9IEZSLT5nZXRJbmZvRm9yR2xvYmFsKEdWKTsKKworICBpZiAoS25vd24gPT0gTm9Nb2RSZWYpCisgICAgcmV0dXJuIE5vTW9kUmVmOyAvLyBObyBuZWVkIHRvIHF1ZXJ5IG90aGVyIG1vZC9yZWYgYW5hbHlzZXMKKyAgcmV0dXJuIE1vZFJlZlJlc3VsdChLbm93biAmIEFsaWFzQW5hbHlzaXM6OmdldE1vZFJlZkluZm8oQ1MsIFAsIFNpemUpKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWV0aG9kcyB0byB1cGRhdGUgdGhlIGFuYWx5c2lzIGFzIGEgcmVzdWx0IG9mIHRoZSBjbGllbnQgdHJhbnNmb3JtYXRpb24uCisvLwordm9pZCBHbG9iYWxzTW9kUmVmOjpkZWxldGVWYWx1ZShWYWx1ZSAqVikgeworICBpZiAoR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KFYpKSB7CisgICAgaWYgKE5vbkFkZHJlc3NUYWtlbkdsb2JhbHMuZXJhc2UoR1YpKSB7CisgICAgICAvLyBUaGlzIGdsb2JhbCBtaWdodCBiZSBhbiBpbmRpcmVjdCBnbG9iYWwuICBJZiBzbywgcmVtb3ZlIGl0IGFuZCByZW1vdmUKKyAgICAgIC8vIGFueSBBbGxvY1JlbGF0ZWRWYWx1ZXMgZm9yIGl0LgorICAgICAgaWYgKEluZGlyZWN0R2xvYmFscy5lcmFzZShHVikpIHsKKyAgICAgICAgLy8gUmVtb3ZlIGFueSBlbnRyaWVzIGluIEFsbG9jc0ZvckluZGlyZWN0R2xvYmFscyBmb3IgdGhpcyBnbG9iYWwuCisgICAgICAgIGZvciAoc3RkOjptYXA8Y29uc3QgVmFsdWUqLCBjb25zdCBHbG9iYWxWYWx1ZSo+OjppdGVyYXRvcgorICAgICAgICAgICAgIEkgPSBBbGxvY3NGb3JJbmRpcmVjdEdsb2JhbHMuYmVnaW4oKSwKKyAgICAgICAgICAgICBFID0gQWxsb2NzRm9ySW5kaXJlY3RHbG9iYWxzLmVuZCgpOyBJICE9IEU7ICkgeworICAgICAgICAgIGlmIChJLT5zZWNvbmQgPT0gR1YpIHsKKyAgICAgICAgICAgIEFsbG9jc0ZvckluZGlyZWN0R2xvYmFscy5lcmFzZShJKyspOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK0k7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBpZiB0aGlzIGlzIGFuIGFsbG9jYXRpb24gcmVsYXRlZCB0byBhbiBpbmRpcmVjdCBnbG9iYWwsIHJlbW92ZQorICAvLyBpdC4KKyAgQWxsb2NzRm9ySW5kaXJlY3RHbG9iYWxzLmVyYXNlKFYpOworCisgIEFsaWFzQW5hbHlzaXM6OmRlbGV0ZVZhbHVlKFYpOworfQorCit2b2lkIEdsb2JhbHNNb2RSZWY6OmNvcHlWYWx1ZShWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvKSB7CisgIEFsaWFzQW5hbHlzaXM6OmNvcHlWYWx1ZShGcm9tLCBUbyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvSVBBL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0lQQS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODUwYzlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0lQQS9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL0FuYWx5c2lzL0lQQS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1pcGEKK0JVSUxEX0FSQ0hJVkUgPSAxCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JVlVzZXJzLmNwcCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JVlVzZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQzMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0lWVXNlcnMuY3BwCkBAIC0wLDAgKzEsMjU1IEBACisvLz09PS0gSVZVc2Vycy5jcHAgLSBJbmR1Y3Rpb24gVmFyaWFibGUgVXNlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGJvb2trZWVwaW5nIGZvciAiaW50ZXJlc3RpbmciIHVzZXJzIG9mIGV4cHJlc3Npb25zCisvLyBjb21wdXRlZCBmcm9tIGluZHVjdGlvbiB2YXJpYWJsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJpdi11c2VycyIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0lWVXNlcnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvQXNtQW5ub3RhdGlvbldyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitjaGFyIElWVXNlcnM6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhJVlVzZXJzLCAiaXYtdXNlcnMiLCAiSW5kdWN0aW9uIFZhcmlhYmxlIFVzZXJzIiwgZmFsc2UsIHRydWUpOworCitQYXNzICpsbHZtOjpjcmVhdGVJVlVzZXJzUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBJVlVzZXJzKCk7Cit9CisKKy8vLyBpc0ludGVyZXN0aW5nIC0gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzICJpbnRlcmVzdGluZyIgd2hlbgorLy8vIHVzZWQgYnkgdGhlIGdpdmVuIGV4cHJlc3Npb24sIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbmFseXppbmcgdGhlCisvLy8gZ2l2ZW4gbG9vcC4KK3N0YXRpYyBib29sIGlzSW50ZXJlc3RpbmcoY29uc3QgU0NFViAqUywgY29uc3QgSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IExvb3AgKkwpIHsKKyAgLy8gQW55dGhpbmcgbG9vcC1pbnZhcmlhbnQgaXMgaW50ZXJlc3RpbmcuCisgIGlmICghaXNhPFNDRVZVbmtub3duPihTKSAmJiBTLT5pc0xvb3BJbnZhcmlhbnQoTCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gQW4gYWRkcmVjIGlzIGludGVyZXN0aW5nIGlmIGl0J3MgYWZmaW5lIG9yIGlmIGl0IGhhcyBhbiBpbnRlcmVzdGluZyBzdGFydC4KKyAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihTKSkgeworICAgIC8vIEtlZXAgdGhpbmdzIHNpbXBsZS4gRG9uJ3QgdG91Y2ggbG9vcC12YXJpYW50IHN0cmlkZXMuCisgICAgaWYgKEFSLT5nZXRMb29wKCkgPT0gTCkKKyAgICAgIHJldHVybiBBUi0+aXNBZmZpbmUoKSB8fCAhTC0+Y29udGFpbnMoSSk7CisgICAgLy8gT3RoZXJ3aXNlIHJlY3Vyc2UgdG8gc2VlIGlmIHRoZSBzdGFydCB2YWx1ZSBpcyBpbnRlcmVzdGluZy4KKyAgICByZXR1cm4gaXNJbnRlcmVzdGluZyhBUi0+Z2V0U3RhcnQoKSwgSSwgTCk7CisgIH0KKworICAvLyBBbiBhZGQgaXMgaW50ZXJlc3RpbmcgaWYgYW55IG9mIGl0cyBvcGVyYW5kcyBpcy4KKyAgaWYgKGNvbnN0IFNDRVZBZGRFeHByICpBZGQgPSBkeW5fY2FzdDxTQ0VWQWRkRXhwcj4oUykpIHsKKyAgICBmb3IgKFNDRVZBZGRFeHByOjpvcF9pdGVyYXRvciBPSSA9IEFkZC0+b3BfYmVnaW4oKSwgT0UgPSBBZGQtPm9wX2VuZCgpOworICAgICAgICAgT0kgIT0gT0U7ICsrT0kpCisgICAgICBpZiAoaXNJbnRlcmVzdGluZygqT0ksIEksIEwpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBOb3RoaW5nIGVsc2UgaXMgaW50ZXJlc3RpbmcgaGVyZS4KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gQWRkVXNlcnNJZkludGVyZXN0aW5nIC0gSW5zcGVjdCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYQorLy8vIHJlZHVjaWJsZSBTQ0VWLCByZWN1cnNpdmVseSBhZGQgaXRzIHVzZXJzIHRvIHRoZSBJVlVzZXNCeVN0cmlkZSBzZXQgYW5kCisvLy8gcmV0dXJuIHRydWUuICBPdGhlcndpc2UsIHJldHVybiBmYWxzZS4KK2Jvb2wgSVZVc2Vyczo6QWRkVXNlcnNJZkludGVyZXN0aW5nKEluc3RydWN0aW9uICpJKSB7CisgIGlmICghU0UtPmlzU0NFVmFibGUoSS0+Z2V0VHlwZSgpKSkKKyAgICByZXR1cm4gZmFsc2U7ICAgLy8gVm9pZCBhbmQgRlAgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHJlZHVjZWQuCisKKyAgLy8gTFNSIGlzIG5vdCBBUEludCBjbGVhbiwgZG8gbm90IHRvdWNoIGludGVnZXJzIGJpZ2dlciB0aGFuIDY0LWJpdHMuCisgIGlmIChTRS0+Z2V0VHlwZVNpemVJbkJpdHMoSS0+Z2V0VHlwZSgpKSA+IDY0KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIVByb2Nlc3NlZC5pbnNlcnQoSSkpCisgICAgcmV0dXJuIHRydWU7ICAgIC8vIEluc3RydWN0aW9uIGFscmVhZHkgaGFuZGxlZC4KKworICAvLyBHZXQgdGhlIHN5bWJvbGljIGV4cHJlc3Npb24gZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIGNvbnN0IFNDRVYgKklTRSA9IFNFLT5nZXRTQ0VWKEkpOworCisgIC8vIElmIHdlJ3ZlIGNvbWUgdG8gYW4gdW5pbnRlcmVzdGluZyBleHByZXNzaW9uLCBzdG9wIHRoZSB0cmF2ZXJzYWwgYW5kCisgIC8vIGNhbGwgdGhpcyBhIHVzZXIuCisgIGlmICghaXNJbnRlcmVzdGluZyhJU0UsIEksIEwpKQorICAgIHJldHVybiBmYWxzZTsKKworICBTbWFsbFB0clNldDxJbnN0cnVjdGlvbiAqLCA0PiBVbmlxdWVVc2VyczsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gSS0+dXNlX2JlZ2luKCksIEUgPSBJLT51c2VfZW5kKCk7CisgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgIEluc3RydWN0aW9uICpVc2VyID0gY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKyAgICBpZiAoIVVuaXF1ZVVzZXJzLmluc2VydChVc2VyKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gRG8gbm90IGluZmluaXRlbHkgcmVjdXJzZSBvbiBQSEkgbm9kZXMuCisgICAgaWYgKGlzYTxQSElOb2RlPihVc2VyKSAmJiBQcm9jZXNzZWQuY291bnQoVXNlcikpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIERlc2NlbmQgcmVjdXJzaXZlbHksIGJ1dCBub3QgaW50byBQSEkgbm9kZXMgb3V0c2lkZSB0aGUgY3VycmVudCBsb29wLgorICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIHNlZSB0aGUgZW50aXJlIGV4cHJlc3Npb24gb3V0c2lkZSB0aGUgbG9vcCB0byBnZXQKKyAgICAvLyBjaG9pY2VzIHRoYXQgZGVwZW5kIG9uIGFkZHJlc3NpbmcgbW9kZSB1c2UgcmlnaHQsIGFsdGhvdWdoIHdlIHdvbid0CisgICAgLy8gY29uc2lkZXIgcmVmZXJlbmNlcyBvdXRzaWRlIHRoZSBsb29wIGluIGFsbCBjYXNlcy4KKyAgICAvLyBJZiBVc2VyIGlzIGFscmVhZHkgaW4gUHJvY2Vzc2VkLCB3ZSBkb24ndCB3YW50IHRvIHJlY3Vyc2UgaW50byBpdCBhZ2FpbiwKKyAgICAvLyBidXQgZG8gd2FudCB0byByZWNvcmQgYSBzZWNvbmQgcmVmZXJlbmNlIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLgorICAgIGJvb2wgQWRkVXNlclRvSVZVc2VycyA9IGZhbHNlOworICAgIGlmIChMSS0+Z2V0TG9vcEZvcihVc2VyLT5nZXRQYXJlbnQoKSkgIT0gTCkgeworICAgICAgaWYgKGlzYTxQSElOb2RlPihVc2VyKSB8fCBQcm9jZXNzZWQuY291bnQoVXNlcikgfHwKKyAgICAgICAgICAhQWRkVXNlcnNJZkludGVyZXN0aW5nKFVzZXIpKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRk9VTkQgVVNFUiBpbiBvdGhlciBsb29wOiAiIDw8ICpVc2VyIDw8ICdcbicKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgICBPRiBTQ0VWOiAiIDw8ICpJU0UgPDwgJ1xuJyk7CisgICAgICAgIEFkZFVzZXJUb0lWVXNlcnMgPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoUHJvY2Vzc2VkLmNvdW50KFVzZXIpIHx8CisgICAgICAgICAgICAgICAhQWRkVXNlcnNJZkludGVyZXN0aW5nKFVzZXIpKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkZPVU5EIFVTRVI6ICIgPDwgKlVzZXIgPDwgJ1xuJworICAgICAgICAgICAgICAgICAgIDw8ICIgICBPRiBTQ0VWOiAiIDw8ICpJU0UgPDwgJ1xuJyk7CisgICAgICBBZGRVc2VyVG9JVlVzZXJzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoQWRkVXNlclRvSVZVc2VycykgeworICAgICAgLy8gT2theSwgd2UgZm91bmQgYSB1c2VyIHRoYXQgd2UgY2Fubm90IHJlZHVjZS4KKyAgICAgIElWVXNlcy5wdXNoX2JhY2sobmV3IElWU3RyaWRlVXNlKHRoaXMsIFVzZXIsIEkpKTsKKyAgICAgIElWU3RyaWRlVXNlICZOZXdVc2UgPSBJVlVzZXMuYmFjaygpOworICAgICAgLy8gVHJhbnNmb3JtIHRoZSBleHByZXNzaW9uIGludG8gYSBub3JtYWxpemVkIGZvcm0uCisgICAgICBJU0UgPSBUcmFuc2Zvcm1Gb3JQb3N0SW5jVXNlKE5vcm1hbGl6ZUF1dG9kZXRlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRSwgVXNlciwgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3VXNlLlBvc3RJbmNMb29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlNFLCAqRFQpOworICAgICAgREVCVUcoZGJncygpIDw8ICIgICBOT1JNQUxJWkVEIFRPOiAiIDw8ICpJU0UgPDwgJ1xuJyk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitJVlN0cmlkZVVzZSAmSVZVc2Vyczo6QWRkVXNlcihJbnN0cnVjdGlvbiAqVXNlciwgVmFsdWUgKk9wZXJhbmQpIHsKKyAgSVZVc2VzLnB1c2hfYmFjayhuZXcgSVZTdHJpZGVVc2UodGhpcywgVXNlciwgT3BlcmFuZCkpOworICByZXR1cm4gSVZVc2VzLmJhY2soKTsKK30KKworSVZVc2Vyczo6SVZVc2VycygpCisgOiBMb29wUGFzcyhJRCkgeworfQorCit2b2lkIElWVXNlcnM6OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuYWRkUmVxdWlyZWQ8TG9vcEluZm8+KCk7CisgIEFVLmFkZFJlcXVpcmVkPERvbWluYXRvclRyZWU+KCk7CisgIEFVLmFkZFJlcXVpcmVkPFNjYWxhckV2b2x1dGlvbj4oKTsKKyAgQVUuc2V0UHJlc2VydmVzQWxsKCk7Cit9CisKK2Jvb2wgSVZVc2Vyczo6cnVuT25Mb29wKExvb3AgKmwsIExQUGFzc01hbmFnZXIgJkxQTSkgeworCisgIEwgPSBsOworICBMSSA9ICZnZXRBbmFseXNpczxMb29wSW5mbz4oKTsKKyAgRFQgPSAmZ2V0QW5hbHlzaXM8RG9taW5hdG9yVHJlZT4oKTsKKyAgU0UgPSAmZ2V0QW5hbHlzaXM8U2NhbGFyRXZvbHV0aW9uPigpOworCisgIC8vIEZpbmQgYWxsIHVzZXMgb2YgaW5kdWN0aW9uIHZhcmlhYmxlcyBpbiB0aGlzIGxvb3AsIGFuZCBjYXRlZ29yaXplCisgIC8vIHRoZW0gYnkgc3RyaWRlLiAgU3RhcnQgYnkgZmluZGluZyBhbGwgb2YgdGhlIFBISSBub2RlcyBpbiB0aGUgaGVhZGVyIGZvcgorICAvLyB0aGlzIGxvb3AuICBJZiB0aGV5IGFyZSBpbmR1Y3Rpb24gdmFyaWFibGVzLCBpbnNwZWN0IHRoZWlyIHVzZXMuCisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEwtPmdldEhlYWRlcigpLT5iZWdpbigpOyBpc2E8UEhJTm9kZT4oSSk7ICsrSSkKKyAgICAodm9pZClBZGRVc2Vyc0lmSW50ZXJlc3RpbmcoSSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIElWVXNlcnM6OnByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNKSBjb25zdCB7CisgIE9TIDw8ICJJViBVc2VycyBmb3IgbG9vcCAiOworICBXcml0ZUFzT3BlcmFuZChPUywgTC0+Z2V0SGVhZGVyKCksIGZhbHNlKTsKKyAgaWYgKFNFLT5oYXNMb29wSW52YXJpYW50QmFja2VkZ2VUYWtlbkNvdW50KEwpKSB7CisgICAgT1MgPDwgIiB3aXRoIGJhY2tlZGdlLXRha2VuIGNvdW50ICIKKyAgICAgICA8PCAqU0UtPmdldEJhY2tlZGdlVGFrZW5Db3VudChMKTsKKyAgfQorICBPUyA8PCAiOlxuIjsKKworICAvLyBVc2UgYSBkZWZhdWx0IEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlciB0byBzdXBwcmVzcyB0aGUgZGVmYXVsdCBpbmZvCisgIC8vIGNvbW1lbnRzLCB3aGljaCBhcmVuJ3QgcmVsZXZhbnQgaGVyZS4KKyAgQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyIEFubm90YXRvcjsKKyAgZm9yIChpbGlzdDxJVlN0cmlkZVVzZT46OmNvbnN0X2l0ZXJhdG9yIFVJID0gSVZVc2VzLmJlZ2luKCksCisgICAgICAgRSA9IElWVXNlcy5lbmQoKTsgVUkgIT0gRTsgKytVSSkgeworICAgIE9TIDw8ICIgICI7CisgICAgV3JpdGVBc09wZXJhbmQoT1MsIFVJLT5nZXRPcGVyYW5kVmFsVG9SZXBsYWNlKCksIGZhbHNlKTsKKyAgICBPUyA8PCAiID0gIiA8PCAqZ2V0UmVwbGFjZW1lbnRFeHByKCpVSSk7CisgICAgZm9yIChQb3N0SW5jTG9vcFNldDo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIEkgPSBVSS0+UG9zdEluY0xvb3BzLmJlZ2luKCksCisgICAgICAgICBFID0gVUktPlBvc3RJbmNMb29wcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIE9TIDw8ICIgKHBvc3QtaW5jIHdpdGggbG9vcCAiOworICAgICAgV3JpdGVBc09wZXJhbmQoT1MsICgqSSktPmdldEhlYWRlcigpLCBmYWxzZSk7CisgICAgICBPUyA8PCAiKSI7CisgICAgfQorICAgIE9TIDw8ICIgaW4gICI7CisgICAgVUktPmdldFVzZXIoKS0+cHJpbnQoT1MsICZBbm5vdGF0b3IpOworICAgIE9TIDw8ICdcbic7CisgIH0KK30KKwordm9pZCBJVlVzZXJzOjpkdW1wKCkgY29uc3QgeworICBwcmludChkYmdzKCkpOworfQorCit2b2lkIElWVXNlcnM6OnJlbGVhc2VNZW1vcnkoKSB7CisgIFByb2Nlc3NlZC5jbGVhcigpOworICBJVlVzZXMuY2xlYXIoKTsKK30KKworLy8vIGdldFJlcGxhY2VtZW50RXhwciAtIFJldHVybiBhIFNDRVYgZXhwcmVzc2lvbiB3aGljaCBjb21wdXRlcyB0aGUKKy8vLyB2YWx1ZSBvZiB0aGUgT3BlcmFuZFZhbFRvUmVwbGFjZS4KK2NvbnN0IFNDRVYgKklWVXNlcnM6OmdldFJlcGxhY2VtZW50RXhwcihjb25zdCBJVlN0cmlkZVVzZSAmSVUpIGNvbnN0IHsKKyAgcmV0dXJuIFNFLT5nZXRTQ0VWKElVLmdldE9wZXJhbmRWYWxUb1JlcGxhY2UoKSk7Cit9CisKKy8vLyBnZXRFeHByIC0gUmV0dXJuIHRoZSBleHByZXNzaW9uIGZvciB0aGUgdXNlLgorY29uc3QgU0NFViAqSVZVc2Vyczo6Z2V0RXhwcihjb25zdCBJVlN0cmlkZVVzZSAmSVUpIGNvbnN0IHsKKyAgcmV0dXJuCisgICAgVHJhbnNmb3JtRm9yUG9zdEluY1VzZShOb3JtYWxpemUsIGdldFJlcGxhY2VtZW50RXhwcihJVSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJVS5nZXRVc2VyKCksIElVLmdldE9wZXJhbmRWYWxUb1JlcGxhY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8UG9zdEluY0xvb3BTZXQgJj4oSVUuZ2V0UG9zdEluY0xvb3BzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKlNFLCAqRFQpOworfQorCitzdGF0aWMgY29uc3QgU0NFVkFkZFJlY0V4cHIgKmZpbmRBZGRSZWNGb3JMb29wKGNvbnN0IFNDRVYgKlMsIGNvbnN0IExvb3AgKkwpIHsKKyAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihTKSkgeworICAgIGlmIChBUi0+Z2V0TG9vcCgpID09IEwpCisgICAgICByZXR1cm4gQVI7CisgICAgcmV0dXJuIGZpbmRBZGRSZWNGb3JMb29wKEFSLT5nZXRTdGFydCgpLCBMKTsKKyAgfQorCisgIGlmIChjb25zdCBTQ0VWQWRkRXhwciAqQWRkID0gZHluX2Nhc3Q8U0NFVkFkZEV4cHI+KFMpKSB7CisgICAgZm9yIChTQ0VWQWRkRXhwcjo6b3BfaXRlcmF0b3IgSSA9IEFkZC0+b3BfYmVnaW4oKSwgRSA9IEFkZC0+b3BfZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIgPSBmaW5kQWRkUmVjRm9yTG9vcCgqSSwgTCkpCisgICAgICAgIHJldHVybiBBUjsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAwOworfQorCitjb25zdCBTQ0VWICpJVlVzZXJzOjpnZXRTdHJpZGUoY29uc3QgSVZTdHJpZGVVc2UgJklVLCBjb25zdCBMb29wICpMKSBjb25zdCB7CisgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIgPSBmaW5kQWRkUmVjRm9yTG9vcChnZXRFeHByKElVKSwgTCkpCisgICAgcmV0dXJuIEFSLT5nZXRTdGVwUmVjdXJyZW5jZSgqU0UpOworICByZXR1cm4gMDsKK30KKwordm9pZCBJVlN0cmlkZVVzZTo6dHJhbnNmb3JtVG9Qb3N0SW5jKGNvbnN0IExvb3AgKkwpIHsKKyAgUG9zdEluY0xvb3BzLmluc2VydChMKTsKK30KKwordm9pZCBJVlN0cmlkZVVzZTo6ZGVsZXRlZCgpIHsKKyAgLy8gUmVtb3ZlIHRoaXMgdXNlciBmcm9tIHRoZSBsaXN0LgorICBQYXJlbnQtPklWVXNlcy5lcmFzZSh0aGlzKTsKKyAgLy8gdGhpcyBub3cgZGFuZ2xlcyEKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmNwcCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGNkMzQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0luc3RydWN0aW9uU2ltcGxpZnkuY3BwCkBAIC0wLDAgKzEsNDg2IEBACisvLz09PS0gSW5zdHJ1Y3Rpb25TaW1wbGlmeS5jcHAgLSBGb2xkIGluc3RydWN0aW9uIG9wZXJhbmRzIC0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHJvdXRpbmVzIGZvciBmb2xkaW5nIGluc3RydWN0aW9ucyBpbnRvIHNpbXBsZXIgZm9ybXMKKy8vIHRoYXQgZG8gbm90IHJlcXVpcmUgY3JlYXRpbmcgbmV3IGluc3RydWN0aW9ucy4gIEZvciBleGFtcGxlLCB0aGlzIGRvZXMKKy8vIGNvbnN0YW50IGZvbGRpbmcsIGFuZCBjYW4gaGFuZGxlIGlkZW50aXRpZXMgbGlrZSAoWCYwKS0+MC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Db25zdGFudEZvbGRpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXR0ZXJuTWF0Y2guaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIGxsdm06OlBhdHRlcm5NYXRjaDsKKworLy8vIFNpbXBsaWZ5QWRkSW5zdCAtIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBBZGQsIHNlZSBpZiB3ZSBjYW4KKy8vLyBmb2xkIHRoZSByZXN1bHQuICBJZiBub3QsIHRoaXMgcmV0dXJucyBudWxsLgorVmFsdWUgKmxsdm06OlNpbXBsaWZ5QWRkSW5zdChWYWx1ZSAqT3AwLCBWYWx1ZSAqT3AxLCBib29sIGlzTlNXLCBib29sIGlzTlVXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICBpZiAoQ29uc3RhbnQgKkNMSFMgPSBkeW5fY2FzdDxDb25zdGFudD4oT3AwKSkgeworICAgIGlmIChDb25zdGFudCAqQ1JIUyA9IGR5bl9jYXN0PENvbnN0YW50PihPcDEpKSB7CisgICAgICBDb25zdGFudCAqT3BzW10gPSB7IENMSFMsIENSSFMgfTsKKyAgICAgIHJldHVybiBDb25zdGFudEZvbGRJbnN0T3BlcmFuZHMoSW5zdHJ1Y3Rpb246OkFkZCwgQ0xIUy0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsIDIsIFREKTsKKyAgICB9CisgICAgCisgICAgLy8gQ2Fub25pY2FsaXplIHRoZSBjb25zdGFudCB0byB0aGUgUkhTLgorICAgIHN0ZDo6c3dhcChPcDAsIE9wMSk7CisgIH0KKyAgCisgIGlmIChDb25zdGFudCAqT3AxQyA9IGR5bl9jYXN0PENvbnN0YW50PihPcDEpKSB7CisgICAgLy8gWCArIHVuZGVmIC0+IHVuZGVmCisgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihPcDFDKSkKKyAgICAgIHJldHVybiBPcDFDOworICAgIAorICAgIC8vIFggKyAwIC0tPiBYCisgICAgaWYgKE9wMUMtPmlzTnVsbFZhbHVlKCkpCisgICAgICByZXR1cm4gT3AwOworICB9CisgIAorICAvLyBGSVhNRTogQ291bGQgcHVsbCBzZXZlcmFsIG1vcmUgb3V0IG9mIGluc3Rjb21iaW5lLgorICByZXR1cm4gMDsKK30KKworLy8vIFNpbXBsaWZ5QW5kSW5zdCAtIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBBbmQsIHNlZSBpZiB3ZSBjYW4KKy8vLyBmb2xkIHRoZSByZXN1bHQuICBJZiBub3QsIHRoaXMgcmV0dXJucyBudWxsLgorVmFsdWUgKmxsdm06OlNpbXBsaWZ5QW5kSW5zdChWYWx1ZSAqT3AwLCBWYWx1ZSAqT3AxLCBjb25zdCBUYXJnZXREYXRhICpURCkgeworICBpZiAoQ29uc3RhbnQgKkNMSFMgPSBkeW5fY2FzdDxDb25zdGFudD4oT3AwKSkgeworICAgIGlmIChDb25zdGFudCAqQ1JIUyA9IGR5bl9jYXN0PENvbnN0YW50PihPcDEpKSB7CisgICAgICBDb25zdGFudCAqT3BzW10gPSB7IENMSFMsIENSSFMgfTsKKyAgICAgIHJldHVybiBDb25zdGFudEZvbGRJbnN0T3BlcmFuZHMoSW5zdHJ1Y3Rpb246OkFuZCwgQ0xIUy0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsIDIsIFREKTsKKyAgICB9CisgIAorICAgIC8vIENhbm9uaWNhbGl6ZSB0aGUgY29uc3RhbnQgdG8gdGhlIFJIUy4KKyAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOworICB9CisgIAorICAvLyBYICYgdW5kZWYgLT4gMAorICBpZiAoaXNhPFVuZGVmVmFsdWU+KE9wMSkpCisgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoT3AwLT5nZXRUeXBlKCkpOworICAKKyAgLy8gWCAmIFggPSBYCisgIGlmIChPcDAgPT0gT3AxKQorICAgIHJldHVybiBPcDA7CisgIAorICAvLyBYICYgPDAsMD4gPSA8MCwwPgorICBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oT3AxKSkKKyAgICByZXR1cm4gT3AxOworICAKKyAgLy8gWCAmIDwtMSwtMT4gPSBYCisgIGlmIChDb25zdGFudFZlY3RvciAqQ1AgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oT3AxKSkKKyAgICBpZiAoQ1AtPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICByZXR1cm4gT3AwOworICAKKyAgaWYgKENvbnN0YW50SW50ICpPcDFDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDEpKSB7CisgICAgLy8gWCAmIDAgPSAwCisgICAgaWYgKE9wMUNJLT5pc1plcm8oKSkKKyAgICAgIHJldHVybiBPcDFDSTsKKyAgICAvLyBYICYgLTEgPSBYCisgICAgaWYgKE9wMUNJLT5pc0FsbE9uZXNWYWx1ZSgpKQorICAgICAgcmV0dXJuIE9wMDsKKyAgfQorICAKKyAgLy8gQSAmIH5BICA9ICB+QSAmIEEgID0gIDAKKyAgVmFsdWUgKkEsICpCOworICBpZiAoKG1hdGNoKE9wMCwgbV9Ob3QobV9WYWx1ZShBKSkpICYmIEEgPT0gT3AxKSB8fAorICAgICAgKG1hdGNoKE9wMSwgbV9Ob3QobV9WYWx1ZShBKSkpICYmIEEgPT0gT3AwKSkKKyAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShPcDAtPmdldFR5cGUoKSk7CisgIAorICAvLyAoQSB8ID8pICYgQSA9IEEKKyAgaWYgKG1hdGNoKE9wMCwgbV9PcihtX1ZhbHVlKEEpLCBtX1ZhbHVlKEIpKSkgJiYKKyAgICAgIChBID09IE9wMSB8fCBCID09IE9wMSkpCisgICAgcmV0dXJuIE9wMTsKKyAgCisgIC8vIEEgJiAoQSB8ID8pID0gQQorICBpZiAobWF0Y2goT3AxLCBtX09yKG1fVmFsdWUoQSksIG1fVmFsdWUoQikpKSAmJgorICAgICAgKEEgPT0gT3AwIHx8IEIgPT0gT3AwKSkKKyAgICByZXR1cm4gT3AwOworICAKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBTaW1wbGlmeU9ySW5zdCAtIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBPciwgc2VlIGlmIHdlIGNhbgorLy8vIGZvbGQgdGhlIHJlc3VsdC4gIElmIG5vdCwgdGhpcyByZXR1cm5zIG51bGwuCitWYWx1ZSAqbGx2bTo6U2ltcGxpZnlPckluc3QoVmFsdWUgKk9wMCwgVmFsdWUgKk9wMSwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpIHsKKyAgaWYgKENvbnN0YW50ICpDTEhTID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KE9wMCkpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkNSSFMgPSBkeW5fY2FzdDxDb25zdGFudD4oT3AxKSkgeworICAgICAgQ29uc3RhbnQgKk9wc1tdID0geyBDTEhTLCBDUkhTIH07CisgICAgICByZXR1cm4gQ29uc3RhbnRGb2xkSW5zdE9wZXJhbmRzKEluc3RydWN0aW9uOjpPciwgQ0xIUy0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsIDIsIFREKTsKKyAgICB9CisgICAgCisgICAgLy8gQ2Fub25pY2FsaXplIHRoZSBjb25zdGFudCB0byB0aGUgUkhTLgorICAgIHN0ZDo6c3dhcChPcDAsIE9wMSk7CisgIH0KKyAgCisgIC8vIFggfCB1bmRlZiAtPiAtMQorICBpZiAoaXNhPFVuZGVmVmFsdWU+KE9wMSkpCisgICAgcmV0dXJuIENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoT3AwLT5nZXRUeXBlKCkpOworICAKKyAgLy8gWCB8IFggPSBYCisgIGlmIChPcDAgPT0gT3AxKQorICAgIHJldHVybiBPcDA7CisKKyAgLy8gWCB8IDwwLDA+ID0gWAorICBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oT3AxKSkKKyAgICByZXR1cm4gT3AwOworICAKKyAgLy8gWCB8IDwtMSwtMT4gPSA8LTEsLTE+CisgIGlmIChDb25zdGFudFZlY3RvciAqQ1AgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oT3AxKSkKKyAgICBpZiAoQ1AtPmlzQWxsT25lc1ZhbHVlKCkpICAgICAgICAgICAgCisgICAgICByZXR1cm4gT3AxOworICAKKyAgaWYgKENvbnN0YW50SW50ICpPcDFDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDEpKSB7CisgICAgLy8gWCB8IDAgPSBYCisgICAgaWYgKE9wMUNJLT5pc1plcm8oKSkKKyAgICAgIHJldHVybiBPcDA7CisgICAgLy8gWCB8IC0xID0gLTEKKyAgICBpZiAoT3AxQ0ktPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICByZXR1cm4gT3AxQ0k7CisgIH0KKyAgCisgIC8vIEEgfCB+QSAgPSAgfkEgfCBBICA9ICAtMQorICBWYWx1ZSAqQSwgKkI7CisgIGlmICgobWF0Y2goT3AwLCBtX05vdChtX1ZhbHVlKEEpKSkgJiYgQSA9PSBPcDEpIHx8CisgICAgICAobWF0Y2goT3AxLCBtX05vdChtX1ZhbHVlKEEpKSkgJiYgQSA9PSBPcDApKQorICAgIHJldHVybiBDb25zdGFudDo6Z2V0QWxsT25lc1ZhbHVlKE9wMC0+Z2V0VHlwZSgpKTsKKyAgCisgIC8vIChBICYgPykgfCBBID0gQQorICBpZiAobWF0Y2goT3AwLCBtX0FuZChtX1ZhbHVlKEEpLCBtX1ZhbHVlKEIpKSkgJiYKKyAgICAgIChBID09IE9wMSB8fCBCID09IE9wMSkpCisgICAgcmV0dXJuIE9wMTsKKyAgCisgIC8vIEEgfCAoQSAmID8pID0gQQorICBpZiAobWF0Y2goT3AxLCBtX0FuZChtX1ZhbHVlKEEpLCBtX1ZhbHVlKEIpKSkgJiYKKyAgICAgIChBID09IE9wMCB8fCBCID09IE9wMCkpCisgICAgcmV0dXJuIE9wMDsKKyAgCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBUeXBlICpHZXRDb21wYXJlVHkoVmFsdWUgKk9wKSB7CisgIHJldHVybiBDbXBJbnN0OjptYWtlQ21wUmVzdWx0VHlwZShPcC0+Z2V0VHlwZSgpKTsKK30KKworCisvLy8gU2ltcGxpZnlJQ21wSW5zdCAtIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBJQ21wSW5zdCwgc2VlIGlmIHdlIGNhbgorLy8vIGZvbGQgdGhlIHJlc3VsdC4gIElmIG5vdCwgdGhpcyByZXR1cm5zIG51bGwuCitWYWx1ZSAqbGx2bTo6U2ltcGxpZnlJQ21wSW5zdCh1bnNpZ25lZCBQcmVkaWNhdGUsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICBDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCA9IChDbXBJbnN0OjpQcmVkaWNhdGUpUHJlZGljYXRlOworICBhc3NlcnQoQ21wSW5zdDo6aXNJbnRQcmVkaWNhdGUoUHJlZCkgJiYgIk5vdCBhbiBpbnRlZ2VyIGNvbXBhcmUhIik7CisgIAorICBpZiAoQ29uc3RhbnQgKkNMSFMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkgeworICAgIGlmIChDb25zdGFudCAqQ1JIUyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZENvbXBhcmVJbnN0T3BlcmFuZHMoUHJlZCwgQ0xIUywgQ1JIUywgVEQpOworCisgICAgLy8gSWYgd2UgaGF2ZSBhIGNvbnN0YW50LCBtYWtlIHN1cmUgaXQgaXMgb24gdGhlIFJIUy4KKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgIFByZWQgPSBDbXBJbnN0OjpnZXRTd2FwcGVkUHJlZGljYXRlKFByZWQpOworICB9CisgIAorICAvLyBJVHkgLSBUaGlzIGlzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgY29tcGFyZSB3ZSdyZSBjb25zaWRlcmluZy4KKyAgY29uc3QgVHlwZSAqSVR5ID0gR2V0Q29tcGFyZVR5KExIUyk7CisgIAorICAvLyBpY21wIFgsIFggLT4gdHJ1ZS9mYWxzZQorICAvLyBYIGljbXAgdW5kZWYgLT4gdHJ1ZS9mYWxzZS4gIEZvciBleGFtcGxlLCBpY21wIHVndCAlWCwgdW5kZWYgLT4gZmFsc2UKKyAgLy8gYmVjYXVzZSBYIGNvdWxkIGJlIDAuCisgIGlmIChMSFMgPT0gUkhTIHx8IGlzYTxVbmRlZlZhbHVlPihSSFMpKQorICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KElUeSwgQ21wSW5zdDo6aXNUcnVlV2hlbkVxdWFsKFByZWQpKTsKKyAgCisgIC8vIGljbXAgPGdsb2JhbC9hbGxvY2EqL251bGw+LCA8Z2xvYmFsL2FsbG9jYSovbnVsbD4gLSBHbG9iYWwvU3RhY2sgdmFsdWUKKyAgLy8gYWRkcmVzc2VzIG5ldmVyIGVxdWFsIGVhY2ggb3RoZXIhICBXZSBhbHJlYWR5IGtub3cgdGhhdCBPcDAgIT0gT3AxLgorICBpZiAoKGlzYTxHbG9iYWxWYWx1ZT4oTEhTKSB8fCBpc2E8QWxsb2NhSW5zdD4oTEhTKSB8fCAKKyAgICAgICBpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oTEhTKSkgJiYKKyAgICAgIChpc2E8R2xvYmFsVmFsdWU+KFJIUykgfHwgaXNhPEFsbG9jYUluc3Q+KFJIUykgfHwgCisgICAgICAgaXNhPENvbnN0YW50UG9pbnRlck51bGw+KFJIUykpKQorICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KElUeSwgQ21wSW5zdDo6aXNGYWxzZVdoZW5FcXVhbChQcmVkKSk7CisgIAorICAvLyBTZWUgaWYgd2UgYXJlIGRvaW5nIGEgY29tcGFyaXNvbiB3aXRoIGEgY29uc3RhbnQuCisgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oUkhTKSkgeworICAgIC8vIElmIHdlIGhhdmUgYW4gaWNtcCBsZSBvciBpY21wIGdlIGluc3RydWN0aW9uLCB0dXJuIGl0IGludG8gdGhlCisgICAgLy8gYXBwcm9wcmlhdGUgaWNtcCBsdCBvciBpY21wIGd0IGluc3RydWN0aW9uLiAgVGhpcyBhbGxvd3MgdXMgdG8gcmVseSBvbgorICAgIC8vIHRoZW0gYmVpbmcgZm9sZGVkIGluIHRoZSBjb2RlIGJlbG93LgorICAgIHN3aXRjaCAoUHJlZCkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxFOgorICAgICAgaWYgKENJLT5pc01heFZhbHVlKGZhbHNlKSkgICAgICAgICAgICAgICAgIC8vIEEgPD11IE1BWCAtPiBUUlVFCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0VHJ1ZShDSS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xFOgorICAgICAgaWYgKENJLT5pc01heFZhbHVlKHRydWUpKSAgICAgICAgICAgICAgICAgIC8vIEEgPD1zIE1BWCAtPiBUUlVFCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0VHJ1ZShDSS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOgorICAgICAgaWYgKENJLT5pc01pblZhbHVlKGZhbHNlKSkgICAgICAgICAgICAgICAgIC8vIEEgPj11IE1JTiAtPiBUUlVFCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0VHJ1ZShDSS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOgorICAgICAgaWYgKENJLT5pc01pblZhbHVlKHRydWUpKSAgICAgICAgICAgICAgICAgIC8vIEEgPj1zIE1JTiAtPiBUUlVFCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0VHJ1ZShDSS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAKKyAgCisgIHJldHVybiAwOworfQorCisvLy8gU2ltcGxpZnlGQ21wSW5zdCAtIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBGQ21wSW5zdCwgc2VlIGlmIHdlIGNhbgorLy8vIGZvbGQgdGhlIHJlc3VsdC4gIElmIG5vdCwgdGhpcyByZXR1cm5zIG51bGwuCitWYWx1ZSAqbGx2bTo6U2ltcGxpZnlGQ21wSW5zdCh1bnNpZ25lZCBQcmVkaWNhdGUsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICBDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCA9IChDbXBJbnN0OjpQcmVkaWNhdGUpUHJlZGljYXRlOworICBhc3NlcnQoQ21wSW5zdDo6aXNGUFByZWRpY2F0ZShQcmVkKSAmJiAiTm90IGFuIEZQIGNvbXBhcmUhIik7CisKKyAgaWYgKENvbnN0YW50ICpDTEhTID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkNSSFMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgIHJldHVybiBDb25zdGFudEZvbGRDb21wYXJlSW5zdE9wZXJhbmRzKFByZWQsIENMSFMsIENSSFMsIFREKTsKKyAgIAorICAgIC8vIElmIHdlIGhhdmUgYSBjb25zdGFudCwgbWFrZSBzdXJlIGl0IGlzIG9uIHRoZSBSSFMuCisgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgICBQcmVkID0gQ21wSW5zdDo6Z2V0U3dhcHBlZFByZWRpY2F0ZShQcmVkKTsKKyAgfQorICAKKyAgLy8gRm9sZCB0cml2aWFsIHByZWRpY2F0ZXMuCisgIGlmIChQcmVkID09IEZDbXBJbnN0OjpGQ01QX0ZBTFNFKQorICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KEdldENvbXBhcmVUeShMSFMpLCAwKTsKKyAgaWYgKFByZWQgPT0gRkNtcEluc3Q6OkZDTVBfVFJVRSkKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChHZXRDb21wYXJlVHkoTEhTKSwgMSk7CisKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihSSFMpKSAgICAgICAgICAgICAgICAgIC8vIGZjbXAgcHJlZCBYLCB1bmRlZiAtPiB1bmRlZgorICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoR2V0Q29tcGFyZVR5KExIUykpOworCisgIC8vIGZjbXAgeCx4IC0+IHRydWUvZmFsc2UuICBOb3QgYWxsIGNvbXBhcmVzIGFyZSBmb2xkYWJsZS4KKyAgaWYgKExIUyA9PSBSSFMpIHsKKyAgICBpZiAoQ21wSW5zdDo6aXNUcnVlV2hlbkVxdWFsKFByZWQpKQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoR2V0Q29tcGFyZVR5KExIUyksIDEpOworICAgIGlmIChDbXBJbnN0Ojppc0ZhbHNlV2hlbkVxdWFsKFByZWQpKQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoR2V0Q29tcGFyZVR5KExIUyksIDApOworICB9CisgIAorICAvLyBIYW5kbGUgZmNtcCB3aXRoIGNvbnN0YW50IFJIUworICBpZiAoQ29uc3RhbnQgKlJIU0MgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkgeworICAgIC8vIElmIHRoZSBjb25zdGFudCBpcyBhIG5hbiwgc2VlIGlmIHdlIGNhbiBmb2xkIHRoZSBjb21wYXJpc29uIGJhc2VkIG9uIGl0LgorICAgIGlmIChDb25zdGFudEZQICpDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQPihSSFNDKSkgeworICAgICAgaWYgKENGUC0+Z2V0VmFsdWVBUEYoKS5pc05hTigpKSB7CisgICAgICAgIGlmIChGQ21wSW5zdDo6aXNPcmRlcmVkKFByZWQpKSAgIC8vIFRydWUgImlmIG9yZGVyZWQgYW5kIGZvbyIKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldEZhbHNlKENGUC0+Z2V0Q29udGV4dCgpKTsKKyAgICAgICAgYXNzZXJ0KEZDbXBJbnN0Ojppc1Vub3JkZXJlZChQcmVkKSAmJgorICAgICAgICAgICAgICAgIkNvbXBhcmlzb24gbXVzdCBiZSBlaXRoZXIgb3JkZXJlZCBvciB1bm9yZGVyZWQhIik7CisgICAgICAgIC8vIFRydWUgaWYgdW5vcmRlcmVkLgorICAgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldFRydWUoQ0ZQLT5nZXRDb250ZXh0KCkpOworICAgICAgfQorICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29uc3RhbnQgaXMgYW4gaW5maW5pdHkuCisgICAgICBpZiAoQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzSW5maW5pdHkoKSkgeworICAgICAgICBpZiAoQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzTmVnYXRpdmUoKSkgeworICAgICAgICAgIHN3aXRjaCAoUHJlZCkgeworICAgICAgICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xUOgorICAgICAgICAgICAgLy8gTm8gdmFsdWUgaXMgb3JkZXJlZCBhbmQgbGVzcyB0aGFuIG5lZ2F0aXZlIGluZmluaXR5LgorICAgICAgICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXRGYWxzZShDRlAtPmdldENvbnRleHQoKSk7CisgICAgICAgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VR0U6CisgICAgICAgICAgICAvLyBBbGwgdmFsdWVzIGFyZSB1bm9yZGVyZWQgd2l0aCBvciBhdCBsZWFzdCBuZWdhdGl2ZSBpbmZpbml0eS4KKyAgICAgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0VHJ1ZShDRlAtPmdldENvbnRleHQoKSk7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzd2l0Y2ggKFByZWQpIHsKKyAgICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HVDoKKyAgICAgICAgICAgIC8vIE5vIHZhbHVlIGlzIG9yZGVyZWQgYW5kIGdyZWF0ZXIgdGhhbiBpbmZpbml0eS4KKyAgICAgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0RmFsc2UoQ0ZQLT5nZXRDb250ZXh0KCkpOworICAgICAgICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxFOgorICAgICAgICAgICAgLy8gQWxsIHZhbHVlcyBhcmUgdW5vcmRlcmVkIHdpdGggYW5kIGF0IG1vc3QgaW5maW5pdHkuCisgICAgICAgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldFRydWUoQ0ZQLT5nZXRDb250ZXh0KCkpOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCisvLy8gU2ltcGxpZnlTZWxlY3RJbnN0IC0gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgU2VsZWN0SW5zdCwgc2VlIGlmIHdlIGNhbiBmb2xkCisvLy8gdGhlIHJlc3VsdC4gIElmIG5vdCwgdGhpcyByZXR1cm5zIG51bGwuCitWYWx1ZSAqbGx2bTo6U2ltcGxpZnlTZWxlY3RJbnN0KFZhbHVlICpDb25kVmFsLCBWYWx1ZSAqVHJ1ZVZhbCwgVmFsdWUgKkZhbHNlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICAvLyBzZWxlY3QgdHJ1ZSwgWCwgWSAgLT4gWAorICAvLyBzZWxlY3QgZmFsc2UsIFgsIFkgLT4gWQorICBpZiAoQ29uc3RhbnRJbnQgKkNCID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENvbmRWYWwpKQorICAgIHJldHVybiBDQi0+Z2V0WkV4dFZhbHVlKCkgPyBUcnVlVmFsIDogRmFsc2VWYWw7CisgIAorICAvLyBzZWxlY3QgQywgWCwgWCAtPiBYCisgIGlmIChUcnVlVmFsID09IEZhbHNlVmFsKQorICAgIHJldHVybiBUcnVlVmFsOworICAKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihUcnVlVmFsKSkgICAvLyBzZWxlY3QgQywgdW5kZWYsIFggLT4gWAorICAgIHJldHVybiBGYWxzZVZhbDsKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihGYWxzZVZhbCkpICAgLy8gc2VsZWN0IEMsIFgsIHVuZGVmIC0+IFgKKyAgICByZXR1cm4gVHJ1ZVZhbDsKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihDb25kVmFsKSkgeyAgLy8gc2VsZWN0IHVuZGVmLCBYLCBZIC0+IFggb3IgWQorICAgIGlmIChpc2E8Q29uc3RhbnQ+KFRydWVWYWwpKQorICAgICAgcmV0dXJuIFRydWVWYWw7CisgICAgcmV0dXJuIEZhbHNlVmFsOworICB9CisgIAorICAKKyAgCisgIHJldHVybiAwOworfQorCisKKy8vLyBTaW1wbGlmeUdFUEluc3QgLSBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gR2V0RWxlbWVudFB0ckluc3QsIHNlZSBpZiB3ZSBjYW4KKy8vLyBmb2xkIHRoZSByZXN1bHQuICBJZiBub3QsIHRoaXMgcmV0dXJucyBudWxsLgorVmFsdWUgKmxsdm06OlNpbXBsaWZ5R0VQSW5zdChWYWx1ZSAqY29uc3QgKk9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICAvLyBnZXRlbGVtZW50cHRyIFAgLT4gUC4KKyAgaWYgKE51bU9wcyA9PSAxKQorICAgIHJldHVybiBPcHNbMF07CisKKyAgLy8gVE9ETy4KKyAgLy9pZiAoaXNhPFVuZGVmVmFsdWU+KE9wc1swXSkpCisgIC8vICByZXR1cm4gVW5kZWZWYWx1ZTo6Z2V0KEdFUC5nZXRUeXBlKCkpOworCisgIC8vIGdldGVsZW1lbnRwdHIgUCwgMCAtPiBQLgorICBpZiAoTnVtT3BzID09IDIpCisgICAgaWYgKENvbnN0YW50SW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wc1sxXSkpCisgICAgICBpZiAoQy0+aXNaZXJvKCkpCisgICAgICAgIHJldHVybiBPcHNbMF07CisgIAorICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBjb25zdGFudCBmb2xkYWJsZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHM7ICsraSkKKyAgICBpZiAoIWlzYTxDb25zdGFudD4oT3BzW2ldKSkKKyAgICAgIHJldHVybiAwOworICAKKyAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihjYXN0PENvbnN0YW50PihPcHNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb25zdGFudCAqY29uc3QqKU9wcysxLCBOdW1PcHMtMSk7Cit9CisKKworLy89PT0gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaGlnaGVyIHVwIHRoZSBjbGFzcyBoaWVyYXJjaHkuCisKKy8vLyBTaW1wbGlmeUJpbk9wIC0gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgQmluYXJ5T3BlcmF0b3IsIHNlZSBpZiB3ZSBjYW4KKy8vLyBmb2xkIHRoZSByZXN1bHQuICBJZiBub3QsIHRoaXMgcmV0dXJucyBudWxsLgorVmFsdWUgKmxsdm06OlNpbXBsaWZ5QmluT3AodW5zaWduZWQgT3Bjb2RlLCBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDogcmV0dXJuIFNpbXBsaWZ5QW5kSW5zdChMSFMsIFJIUywgVEQpOworICBjYXNlIEluc3RydWN0aW9uOjpPcjogIHJldHVybiBTaW1wbGlmeU9ySW5zdChMSFMsIFJIUywgVEQpOworICBkZWZhdWx0OgorICAgIGlmIChDb25zdGFudCAqQ0xIUyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKENvbnN0YW50ICpDUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpIHsKKyAgICAgICAgQ29uc3RhbnQgKkNPcHNbXSA9IHtDTEhTLCBDUkhTfTsKKyAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEluc3RPcGVyYW5kcyhPcGNvZGUsIExIUy0+Z2V0VHlwZSgpLCBDT3BzLCAyLCBURCk7CisgICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworLy8vIFNpbXBsaWZ5Q21wSW5zdCAtIEdpdmVuIG9wZXJhbmRzIGZvciBhIENtcEluc3QsIHNlZSBpZiB3ZSBjYW4KKy8vLyBmb2xkIHRoZSByZXN1bHQuCitWYWx1ZSAqbGx2bTo6U2ltcGxpZnlDbXBJbnN0KHVuc2lnbmVkIFByZWRpY2F0ZSwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQpIHsKKyAgaWYgKENtcEluc3Q6OmlzSW50UHJlZGljYXRlKChDbXBJbnN0OjpQcmVkaWNhdGUpUHJlZGljYXRlKSkKKyAgICByZXR1cm4gU2ltcGxpZnlJQ21wSW5zdChQcmVkaWNhdGUsIExIUywgUkhTLCBURCk7CisgIHJldHVybiBTaW1wbGlmeUZDbXBJbnN0KFByZWRpY2F0ZSwgTEhTLCBSSFMsIFREKTsKK30KKworCisvLy8gU2ltcGxpZnlJbnN0cnVjdGlvbiAtIFNlZSBpZiB3ZSBjYW4gY29tcHV0ZSBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGlzCisvLy8gaW5zdHJ1Y3Rpb24uICBJZiBub3QsIHRoaXMgcmV0dXJucyBudWxsLgorVmFsdWUgKmxsdm06OlNpbXBsaWZ5SW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gQ29uc3RhbnRGb2xkSW5zdHJ1Y3Rpb24oSSwgVEQpOworICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgICAgcmV0dXJuIFNpbXBsaWZ5QWRkSW5zdChJLT5nZXRPcGVyYW5kKDApLCBJLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxCaW5hcnlPcGVyYXRvcj4oSSktPmhhc05vU2lnbmVkV3JhcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxCaW5hcnlPcGVyYXRvcj4oSSktPmhhc05vVW5zaWduZWRXcmFwKCksIFREKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QW5kOgorICAgIHJldHVybiBTaW1wbGlmeUFuZEluc3QoSS0+Z2V0T3BlcmFuZCgwKSwgSS0+Z2V0T3BlcmFuZCgxKSwgVEQpOworICBjYXNlIEluc3RydWN0aW9uOjpPcjoKKyAgICByZXR1cm4gU2ltcGxpZnlPckluc3QoSS0+Z2V0T3BlcmFuZCgwKSwgSS0+Z2V0T3BlcmFuZCgxKSwgVEQpOworICBjYXNlIEluc3RydWN0aW9uOjpJQ21wOgorICAgIHJldHVybiBTaW1wbGlmeUlDbXBJbnN0KGNhc3Q8SUNtcEluc3Q+KEkpLT5nZXRQcmVkaWNhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLT5nZXRPcGVyYW5kKDApLCBJLT5nZXRPcGVyYW5kKDEpLCBURCk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZDbXA6CisgICAgcmV0dXJuIFNpbXBsaWZ5RkNtcEluc3QoY2FzdDxGQ21wSW5zdD4oSSktPmdldFByZWRpY2F0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEktPmdldE9wZXJhbmQoMCksIEktPmdldE9wZXJhbmQoMSksIFREKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2VsZWN0OgorICAgIHJldHVybiBTaW1wbGlmeVNlbGVjdEluc3QoSS0+Z2V0T3BlcmFuZCgwKSwgSS0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEktPmdldE9wZXJhbmQoMiksIFREKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cjogeworICAgIFNtYWxsVmVjdG9yPFZhbHVlKiwgOD4gT3BzKEktPm9wX2JlZ2luKCksIEktPm9wX2VuZCgpKTsKKyAgICByZXR1cm4gU2ltcGxpZnlHRVBJbnN0KCZPcHNbMF0sIE9wcy5zaXplKCksIFREKTsKKyAgfQorICB9Cit9CisKKy8vLyBSZXBsYWNlQW5kU2ltcGxpZnlBbGxVc2VzIC0gUGVyZm9ybSBGcm9tLT5yZXBsYWNlQWxsVXNlc1dpdGgoVG8pIGFuZCB0aGVuCisvLy8gZGVsZXRlIHRoZSBGcm9tIGluc3RydWN0aW9uLiAgSW4gYWRkaXRpb24gdG8gYSBiYXNpYyBSQVVXLCB0aGlzIGRvZXMgYQorLy8vIHJlY3Vyc2l2ZSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgbmV3bHkgZm9ybWVkIGluc3RydWN0aW9ucy4gIFRoaXMgY2F0Y2hlcworLy8vIHRoaW5ncyB3aGVyZSBvbmUgc2ltcGxpZmljYXRpb24gZXhwb3NlcyBvdGhlciBvcHBvcnR1bml0aWVzLiAgVGhpcyBvbmx5CisvLy8gc2ltcGxpZmllcyBhbmQgZGVsZXRlcyBzY2FsYXIgb3BlcmF0aW9ucywgaXQgZG9lcyBub3QgY2hhbmdlIHRoZSBDRkcuCisvLy8KK3ZvaWQgbGx2bTo6UmVwbGFjZUFuZFNpbXBsaWZ5QWxsVXNlcyhJbnN0cnVjdGlvbiAqRnJvbSwgVmFsdWUgKlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIGFzc2VydChGcm9tICE9IFRvICYmICJSZXBsYWNlQW5kU2ltcGxpZnlBbGxVc2VzKFgsWCkgaXMgbm90IHZhbGlkISIpOworICAKKyAgLy8gRnJvbUhhbmRsZS9Ub0hhbmRsZSAtIFRoaXMga2VlcHMgYSBXZWFrVkggb24gdGhlIGZyb20vdG8gdmFsdWVzIHNvIHRoYXQKKyAgLy8gd2UgY2FuIGtub3cgaWYgaXQgZ2V0cyBkZWxldGVkIG91dCBmcm9tIHVuZGVyIHVzIG9yIHJlcGxhY2VkIGluIGEKKyAgLy8gcmVjdXJzaXZlIHNpbXBsaWZpY2F0aW9uLgorICBXZWFrVkggRnJvbUhhbmRsZShGcm9tKTsKKyAgV2Vha1ZIIFRvSGFuZGxlKFRvKTsKKyAgCisgIHdoaWxlICghRnJvbS0+dXNlX2VtcHR5KCkpIHsKKyAgICAvLyBVcGRhdGUgdGhlIGluc3RydWN0aW9uIHRvIHVzZSB0aGUgbmV3IHZhbHVlLgorICAgIFVzZSAmVGhlVXNlID0gRnJvbS0+dXNlX2JlZ2luKCkuZ2V0VXNlKCk7CisgICAgSW5zdHJ1Y3Rpb24gKlVzZXIgPSBjYXN0PEluc3RydWN0aW9uPihUaGVVc2UuZ2V0VXNlcigpKTsKKyAgICBUaGVVc2UgPSBUbzsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gY2FuIGJlIGZvbGRlZCBkdWUgdG8gdGhlIG9wZXJhbmQKKyAgICAvLyByZXBsYWNlbWVudC4gIEZvciBleGFtcGxlIGNoYW5naW5nIChvciBYLCBZKSBpbnRvIChvciBYLCAtMSkgY2FuIHJlcGxhY2UKKyAgICAvLyB0aGUgJ29yJyB3aXRoIC0xLgorICAgIFZhbHVlICpTaW1wbGlmaWVkVmFsOworICAgIHsKKyAgICAgIC8vIFNhbml0eSBjaGVjayB0byBtYWtlIHN1cmUgJ1VzZXInIGRvZXNuJ3QgZGFuZ2xlIGFjcm9zcworICAgICAgLy8gU2ltcGxpZnlJbnN0cnVjdGlvbi4KKyAgICAgIEFzc2VydGluZ1ZIPD4gVXNlckhhbmRsZShVc2VyKTsKKyAgICAKKyAgICAgIFNpbXBsaWZpZWRWYWwgPSBTaW1wbGlmeUluc3RydWN0aW9uKFVzZXIsIFREKTsKKyAgICAgIGlmIChTaW1wbGlmaWVkVmFsID09IDApIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvLyBSZWN1cnNpdmVseSBzaW1wbGlmeSB0aGlzIHVzZXIgdG8gdGhlIG5ldyB2YWx1ZS4KKyAgICBSZXBsYWNlQW5kU2ltcGxpZnlBbGxVc2VzKFVzZXIsIFNpbXBsaWZpZWRWYWwsIFREKTsKKyAgICBGcm9tID0gZHluX2Nhc3Rfb3JfbnVsbDxJbnN0cnVjdGlvbj4oKFZhbHVlKilGcm9tSGFuZGxlKTsKKyAgICBUbyA9IFRvSGFuZGxlOworICAgICAgCisgICAgYXNzZXJ0KFRvSGFuZGxlICYmICJUbyB2YWx1ZSBkZWxldGVkIGJ5IHJlY3Vyc2l2ZSBzaW1wbGlmaWNhdGlvbj8iKTsKKyAgICAgIAorICAgIC8vIElmIHRoZSByZWN1cnNpdmUgc2ltcGxpZmljYXRpb24gZW5kZWQgdXAgcmV2aXNpdGluZyBhbmQgZGVsZXRpbmcKKyAgICAvLyAnRnJvbScgdGhlbiB3ZSdyZSBkb25lLgorICAgIGlmIChGcm9tID09IDApCisgICAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIElmICdGcm9tJyBoYXMgdmFsdWUgaGFuZGxlcyByZWZlcnJpbmcgdG8gaXQsIGRvIGEgcmVhbCBSQVVXIHRvIHVwZGF0ZSB0aGVtLgorICBGcm9tLT5yZXBsYWNlQWxsVXNlc1dpdGgoVG8pOworICAKKyAgRnJvbS0+ZXJhc2VGcm9tUGFyZW50KCk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9Mb2Fkcy5jcHAgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvTG9hZHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZGZmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvTG9hZHMuY3BwCkBAIC0wLDAgKzEsMjM1IEBACisvLz09PS0gTG9hZHMuY3BwIC0gTG9jYWwgbG9hZCBhbmFseXNpcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNpbXBsZSBsb2NhbCBhbmFseXNlcyBmb3IgbG9hZCBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9hZHMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxBbGlhcy5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gQXJlRXF1aXZhbGVudEFkZHJlc3NWYWx1ZXMgLSBUZXN0IGlmIEEgYW5kIEIgd2lsbCBvYnZpb3VzbHkgaGF2ZSB0aGUgc2FtZQorLy8vIHZhbHVlLiBUaGlzIGluY2x1ZGVzIHJlY29nbml6aW5nIHRoYXQgJXQwIGFuZCAldDEgd2lsbCBoYXZlIHRoZSBzYW1lCisvLy8gdmFsdWUgaW4gY29kZSBsaWtlIHRoaXM6CisvLy8gICAldDAgPSBnZXRlbGVtZW50cHRyIFxAYSwgMCwgMworLy8vICAgc3RvcmUgaTMyIDAsIGkzMiogJXQwCisvLy8gICAldDEgPSBnZXRlbGVtZW50cHRyIFxAYSwgMCwgMworLy8vICAgJXQyID0gbG9hZCBpMzIqICV0MQorLy8vCitzdGF0aWMgYm9vbCBBcmVFcXVpdmFsZW50QWRkcmVzc1ZhbHVlcyhjb25zdCBWYWx1ZSAqQSwgY29uc3QgVmFsdWUgKkIpIHsKKyAgLy8gVGVzdCBpZiB0aGUgdmFsdWVzIGFyZSB0cml2aWFsbHkgZXF1aXZhbGVudC4KKyAgaWYgKEEgPT0gQikgcmV0dXJuIHRydWU7CisgIAorICAvLyBUZXN0IGlmIHRoZSB2YWx1ZXMgY29tZSBmcm9tIGlkZW50aWNhbCBhcml0aG1ldGljIGluc3RydWN0aW9ucy4KKyAgLy8gVXNlIGlzSWRlbnRpY2FsVG9XaGVuRGVmaW5lZCBpbnN0ZWFkIG9mIGlzSWRlbnRpY2FsVG8gYmVjYXVzZQorICAvLyB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB3aGVuIG9uZSBhZGRyZXNzIHVzZSBkb21pbmF0ZXMgdGhlCisgIC8vIG90aGVyLCB3aGljaCBtZWFucyB0aGF0IHRoZXknbGwgYWx3YXlzIGVpdGhlciBoYXZlIHRoZSBzYW1lCisgIC8vIHZhbHVlIG9yIG9uZSBvZiB0aGVtIHdpbGwgaGF2ZSBhbiB1bmRlZmluZWQgdmFsdWUuCisgIGlmIChpc2E8QmluYXJ5T3BlcmF0b3I+KEEpIHx8IGlzYTxDYXN0SW5zdD4oQSkgfHwKKyAgICAgIGlzYTxQSElOb2RlPihBKSB8fCBpc2E8R2V0RWxlbWVudFB0ckluc3Q+KEEpKQorICAgIGlmIChjb25zdCBJbnN0cnVjdGlvbiAqQkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oQikpCisgICAgICBpZiAoY2FzdDxJbnN0cnVjdGlvbj4oQSktPmlzSWRlbnRpY2FsVG9XaGVuRGVmaW5lZChCSSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gT3RoZXJ3aXNlIHRoZXkgbWF5IG5vdCBiZSBlcXVpdmFsZW50LgorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBnZXRVbmRlcmx5aW5nT2JqZWN0V2l0aE9mZnNldCAtIFN0cmlwIG9mZiB1cCB0byBNYXhMb29rdXAgR0VQcyBhbmQKKy8vLyBiaXRjYXN0cyB0byBnZXQgYmFjayB0byB0aGUgdW5kZXJseWluZyBvYmplY3QgYmVpbmcgYWRkcmVzc2VkLCBrZWVwaW5nCisvLy8gdHJhY2sgb2YgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBHRVBzIHJlbGF0aXZlIHRvIHRoZSByZXN1bHQuCisvLy8gVGhpcyBpcyBjbG9zZWx5IHJlbGF0ZWQgdG8gVmFsdWU6OmdldFVuZGVybHlpbmdPYmplY3QgYnV0IGlzIGxvY2F0ZWQKKy8vLyBoZXJlIHRvIGF2b2lkIG1ha2luZyBWTUNvcmUgZGVwZW5kIG9uIFRhcmdldERhdGEuCitzdGF0aWMgVmFsdWUgKmdldFVuZGVybHlpbmdPYmplY3RXaXRoT2Zmc2V0KFZhbHVlICpWLCBjb25zdCBUYXJnZXREYXRhICpURCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJkJ5dGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heExvb2t1cCA9IDYpIHsKKyAgaWYgKCFWLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgcmV0dXJuIFY7CisgIGZvciAodW5zaWduZWQgQ291bnQgPSAwOyBNYXhMb29rdXAgPT0gMCB8fCBDb3VudCA8IE1heExvb2t1cDsgKytDb3VudCkgeworICAgIGlmIChHRVBPcGVyYXRvciAqR0VQID0gZHluX2Nhc3Q8R0VQT3BlcmF0b3I+KFYpKSB7CisgICAgICBpZiAoIUdFUC0+aGFzQWxsQ29uc3RhbnRJbmRpY2VzKCkpCisgICAgICAgIHJldHVybiBWOworICAgICAgU21hbGxWZWN0b3I8VmFsdWUqLCA4PiBJbmRpY2VzKEdFUC0+b3BfYmVnaW4oKSArIDEsIEdFUC0+b3BfZW5kKCkpOworICAgICAgQnl0ZU9mZnNldCArPSBURC0+Z2V0SW5kZXhlZE9mZnNldChHRVAtPmdldFBvaW50ZXJPcGVyYW5kVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5kaWNlc1swXSwgSW5kaWNlcy5zaXplKCkpOworICAgICAgViA9IEdFUC0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgICB9IGVsc2UgaWYgKE9wZXJhdG9yOjpnZXRPcGNvZGUoVikgPT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QpIHsKKyAgICAgIFYgPSBjYXN0PE9wZXJhdG9yPihWKS0+Z2V0T3BlcmFuZCgwKTsKKyAgICB9IGVsc2UgaWYgKEdsb2JhbEFsaWFzICpHQSA9IGR5bl9jYXN0PEdsb2JhbEFsaWFzPihWKSkgeworICAgICAgaWYgKEdBLT5tYXlCZU92ZXJyaWRkZW4oKSkKKyAgICAgICAgcmV0dXJuIFY7CisgICAgICBWID0gR0EtPmdldEFsaWFzZWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFY7CisgICAgfQorICAgIGFzc2VydChWLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkgJiYgIlVuZXhwZWN0ZWQgb3BlcmFuZCB0eXBlISIpOworICB9CisgIHJldHVybiBWOworfQorCisvLy8gaXNTYWZlVG9Mb2FkVW5jb25kaXRpb25hbGx5IC0gUmV0dXJuIHRydWUgaWYgd2Uga25vdyB0aGF0IGV4ZWN1dGluZyBhIGxvYWQKKy8vLyBmcm9tIHRoaXMgdmFsdWUgY2Fubm90IHRyYXAuICBJZiBpdCBpcyBub3Qgb2J2aW91c2x5IHNhZmUgdG8gbG9hZCBmcm9tIHRoZQorLy8vIHNwZWNpZmllZCBwb2ludGVyLCB3ZSBkbyBhIHF1aWNrIGxvY2FsIHNjYW4gb2YgdGhlIGJhc2ljIGJsb2NrIGNvbnRhaW5pbmcKKy8vLyBTY2FuRnJvbSwgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhZGRyZXNzIGlzIGFscmVhZHkgYWNjZXNzZWQuCitib29sIGxsdm06OmlzU2FmZVRvTG9hZFVuY29uZGl0aW9uYWxseShWYWx1ZSAqViwgSW5zdHJ1Y3Rpb24gKlNjYW5Gcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIHVpbnQ2NF90IEJ5dGVPZmZzZXQgPSAwOworICBWYWx1ZSAqQmFzZSA9IFY7CisgIGlmIChURCkKKyAgICBCYXNlID0gZ2V0VW5kZXJseWluZ09iamVjdFdpdGhPZmZzZXQoViwgVEQsIEJ5dGVPZmZzZXQpOworCisgIGNvbnN0IFR5cGUgKkJhc2VUeXBlID0gMDsKKyAgdW5zaWduZWQgQmFzZUFsaWduID0gMDsKKyAgaWYgKGNvbnN0IEFsbG9jYUluc3QgKkFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oQmFzZSkpIHsKKyAgICAvLyBBbiBhbGxvY2EgaXMgc2FmZSB0byBsb2FkIGZyb20gYXMgbG9hZCBhcyBpdCBpcyBzdWl0YWJseSBhbGlnbmVkLgorICAgIEJhc2VUeXBlID0gQUktPmdldEFsbG9jYXRlZFR5cGUoKTsKKyAgICBCYXNlQWxpZ24gPSBBSS0+Z2V0QWxpZ25tZW50KCk7CisgIH0gZWxzZSBpZiAoY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KEJhc2UpKSB7CisgICAgLy8gR2xvYmFsIHZhcmlhYmxlcyBhcmUgc2FmZSB0byBsb2FkIGZyb20gYnV0IHRoZWlyIHNpemUgY2Fubm90IGJlCisgICAgLy8gZ3VhcmFudGVlZCBpZiB0aGV5IGFyZSBvdmVycmlkZGVuLgorICAgIGlmICghaXNhPEdsb2JhbEFsaWFzPihHVikgJiYgIUdWLT5tYXlCZU92ZXJyaWRkZW4oKSkgeworICAgICAgQmFzZVR5cGUgPSBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgQmFzZUFsaWduID0gR1YtPmdldEFsaWdubWVudCgpOworICAgIH0KKyAgfQorCisgIGlmIChCYXNlVHlwZSAmJiBCYXNlVHlwZS0+aXNTaXplZCgpKSB7CisgICAgaWYgKFREICYmIEJhc2VBbGlnbiA9PSAwKQorICAgICAgQmFzZUFsaWduID0gVEQtPmdldFByZWZUeXBlQWxpZ25tZW50KEJhc2VUeXBlKTsKKworICAgIGlmIChBbGlnbiA8PSBCYXNlQWxpZ24pIHsKKyAgICAgIGlmICghVEQpCisgICAgICAgIHJldHVybiB0cnVlOyAvLyBMb2FkaW5nIGRpcmVjdGx5IGZyb20gYW4gYWxsb2NhIG9yIGdsb2JhbCBpcyBPSy4KKworICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxvYWQgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHVuZGVybHlpbmcgb2JqZWN0LgorICAgICAgY29uc3QgUG9pbnRlclR5cGUgKkFkZHJUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KFYtPmdldFR5cGUoKSk7CisgICAgICB1aW50NjRfdCBMb2FkU2l6ZSA9IFRELT5nZXRUeXBlU3RvcmVTaXplKEFkZHJUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICBpZiAoQnl0ZU9mZnNldCArIExvYWRTaXplIDw9IFRELT5nZXRUeXBlQWxsb2NTaXplKEJhc2VUeXBlKSAmJgorICAgICAgICAgIChBbGlnbiA9PSAwIHx8IChCeXRlT2Zmc2V0ICUgQWxpZ24pID09IDApKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBPdGhlcndpc2UsIGJlIGEgbGl0dGxlIGJpdCBhZ2dyZXNzaXZlIGJ5IHNjYW5uaW5nIHRoZSBsb2NhbCBibG9jayB3aGVyZSB3ZQorICAvLyB3YW50IHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgcG9pbnRlciBpcyBhbHJlYWR5IGJlaW5nIGxvYWRlZCBvciBzdG9yZWQKKyAgLy8gZnJvbS90by4gIElmIHNvLCB0aGUgcHJldmlvdXMgbG9hZCBvciBzdG9yZSB3b3VsZCBoYXZlIGFscmVhZHkgdHJhcHBlZCwKKyAgLy8gc28gdGhlcmUgaXMgbm8gaGFybSBkb2luZyBhbiBleHRyYSBsb2FkIChhbHNvLCBDU0Ugd2lsbCBsYXRlciBlbGltaW5hdGUKKyAgLy8gdGhlIGxvYWQgZW50aXJlbHkpLgorICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSBTY2FuRnJvbSwgRSA9IFNjYW5Gcm9tLT5nZXRQYXJlbnQoKS0+YmVnaW4oKTsKKworICB3aGlsZSAoQkJJICE9IEUpIHsKKyAgICAtLUJCSTsKKworICAgIC8vIElmIHdlIHNlZSBhIGZyZWUgb3IgYSBjYWxsIHdoaWNoIG1heSB3cml0ZSB0byBtZW1vcnkgKGkuZS4gd2hpY2ggbWlnaHQgZG8KKyAgICAvLyBhIGZyZWUpIHRoZSBwb2ludGVyIGNvdWxkIGJlIG1hcmtlZCBpbnZhbGlkLgorICAgIGlmIChpc2E8Q2FsbEluc3Q+KEJCSSkgJiYgQkJJLT5tYXlXcml0ZVRvTWVtb3J5KCkgJiYKKyAgICAgICAgIUlTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhCQkkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihCQkkpKSB7CisgICAgICBpZiAoQXJlRXF1aXZhbGVudEFkZHJlc3NWYWx1ZXMoTEktPmdldE9wZXJhbmQoMCksIFYpKSByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEJCSSkpIHsKKyAgICAgIGlmIChBcmVFcXVpdmFsZW50QWRkcmVzc1ZhbHVlcyhTSS0+Z2V0T3BlcmFuZCgxKSwgVikpIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBGaW5kQXZhaWxhYmxlTG9hZGVkVmFsdWUgLSBTY2FuIHRoZSBTY2FuQkIgYmxvY2sgYmFja3dhcmRzIChzdGFydGluZyBhdCB0aGUKKy8vLyBpbnN0cnVjdGlvbiBiZWZvcmUgU2NhbkZyb20pIGNoZWNraW5nIHRvIHNlZSBpZiB3ZSBoYXZlIHRoZSB2YWx1ZSBhdCB0aGUKKy8vLyBtZW1vcnkgYWRkcmVzcyAqUHRyIGxvY2FsbHkgYXZhaWxhYmxlIHdpdGhpbiBhIHNtYWxsIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuCisvLy8gSWYgdGhlIHZhbHVlIGlzIGF2YWlsYWJsZSwgcmV0dXJuIGl0LgorLy8vCisvLy8gSWYgbm90LCByZXR1cm4gdGhlIGl0ZXJhdG9yIGZvciB0aGUgbGFzdCB2YWxpZGF0ZWQgaW5zdHJ1Y3Rpb24gdGhhdCB0aGUgCisvLy8gdmFsdWUgd291bGQgYmUgbGl2ZSB0aHJvdWdoLiAgSWYgd2Ugc2Nhbm5lZCB0aGUgZW50aXJlIGJsb2NrIGFuZCBkaWRuJ3QgZmluZAorLy8vIHNvbWV0aGluZyB0aGF0IGludmFsaWRhdGVzICpQdHIgb3IgcHJvdmlkZXMgaXQsIFNjYW5Gcm9tIHdvdWxkIGJlIGxlZnQgYXQKKy8vLyBiZWdpbigpIGFuZCB0aGlzIHJldHVybnMgbnVsbC4gIFNjYW5Gcm9tIGNvdWxkIGFsc28gYmUgbGVmdCAKKy8vLworLy8vIE1heEluc3RzVG9TY2FuIHNwZWNpZmllcyB0aGUgbWF4aW11bSBpbnN0cnVjdGlvbnMgdG8gc2NhbiBpbiB0aGUgYmxvY2suICBJZgorLy8vIGl0IGlzIHNldCB0byAwLCBpdCB3aWxsIHNjYW4gdGhlIHdob2xlIGJsb2NrLiBZb3UgY2FuIGFsc28gb3B0aW9uYWxseQorLy8vIHNwZWNpZnkgYW4gYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24sIHdoaWNoIG1ha2VzIHRoaXMgbW9yZSBwcmVjaXNlLgorVmFsdWUgKmxsdm06OkZpbmRBdmFpbGFibGVMb2FkZWRWYWx1ZShWYWx1ZSAqUHRyLCBCYXNpY0Jsb2NrICpTY2FuQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yICZTY2FuRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4SW5zdHNUb1NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBKSB7CisgIGlmIChNYXhJbnN0c1RvU2NhbiA9PSAwKSBNYXhJbnN0c1RvU2NhbiA9IH4wVTsKKworICAvLyBJZiB3ZSdyZSB1c2luZyBhbGlhcyBhbmFseXNpcyB0byBkaXNhbWJpZ3VhdGUgZ2V0IHRoZSBzaXplIG9mICpQdHIuCisgIHVuc2lnbmVkIEFjY2Vzc1NpemUgPSAwOworICBpZiAoQUEpIHsKKyAgICBjb25zdCBUeXBlICpBY2Nlc3NUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICBBY2Nlc3NTaXplID0gQUEtPmdldFR5cGVTdG9yZVNpemUoQWNjZXNzVHkpOworICB9CisgIAorICB3aGlsZSAoU2NhbkZyb20gIT0gU2NhbkJCLT5iZWdpbigpKSB7CisgICAgLy8gV2UgbXVzdCBpZ25vcmUgZGVidWcgaW5mbyBkaXJlY3RpdmVzIHdoZW4gY291bnRpbmcgKG90aGVyd2lzZSB0aGV5CisgICAgLy8gd291bGQgYWZmZWN0IGNvZGVnZW4pLgorICAgIEluc3RydWN0aW9uICpJbnN0ID0gLS1TY2FuRnJvbTsKKyAgICBpZiAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEluc3QpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBSZXN0b3JlIFNjYW5Gcm9tIHRvIGV4cGVjdGVkIHZhbHVlIGluIGNhc2UgbmV4dCB0ZXN0IHN1Y2NlZWRzCisgICAgU2NhbkZyb20rKzsKKyAgIAorICAgIC8vIERvbid0IHNjYW4gaHVnZSBibG9ja3MuCisgICAgaWYgKE1heEluc3RzVG9TY2FuLS0gPT0gMCkgcmV0dXJuIDA7CisgICAgCisgICAgLS1TY2FuRnJvbTsKKyAgICAvLyBJZiB0aGlzIGlzIGEgbG9hZCBvZiBQdHIsIHRoZSBsb2FkZWQgdmFsdWUgaXMgYXZhaWxhYmxlLgorICAgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSW5zdCkpCisgICAgICBpZiAoQXJlRXF1aXZhbGVudEFkZHJlc3NWYWx1ZXMoTEktPmdldE9wZXJhbmQoMCksIFB0cikpCisgICAgICAgIHJldHVybiBMSTsKKyAgICAKKyAgICBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oSW5zdCkpIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBzdG9yZSB0aHJvdWdoIFB0ciwgdGhlIHZhbHVlIGlzIGF2YWlsYWJsZSEKKyAgICAgIGlmIChBcmVFcXVpdmFsZW50QWRkcmVzc1ZhbHVlcyhTSS0+Z2V0T3BlcmFuZCgxKSwgUHRyKSkKKyAgICAgICAgcmV0dXJuIFNJLT5nZXRPcGVyYW5kKDApOworICAgICAgCisgICAgICAvLyBJZiBQdHIgaXMgYW4gYWxsb2NhIGFuZCB0aGlzIGlzIGEgc3RvcmUgdG8gYSBkaWZmZXJlbnQgYWxsb2NhLCBpZ25vcmUKKyAgICAgIC8vIHRoZSBzdG9yZS4gIFRoaXMgaXMgYSB0cml2aWFsIGZvcm0gb2YgYWxpYXMgYW5hbHlzaXMgdGhhdCBpcyBpbXBvcnRhbnQKKyAgICAgIC8vIGZvciByZWcybWVtJ2QgY29kZS4KKyAgICAgIGlmICgoaXNhPEFsbG9jYUluc3Q+KFB0cikgfHwgaXNhPEdsb2JhbFZhcmlhYmxlPihQdHIpKSAmJgorICAgICAgICAgIChpc2E8QWxsb2NhSW5zdD4oU0ktPmdldE9wZXJhbmQoMSkpIHx8CisgICAgICAgICAgIGlzYTxHbG9iYWxWYXJpYWJsZT4oU0ktPmdldE9wZXJhbmQoMSkpKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIElmIHdlIGhhdmUgYWxpYXMgYW5hbHlzaXMgYW5kIGl0IHNheXMgdGhlIHN0b3JlIHdvbid0IG1vZGlmeSB0aGUgbG9hZGVkCisgICAgICAvLyB2YWx1ZSwgaWdub3JlIHRoZSBzdG9yZS4KKyAgICAgIGlmIChBQSAmJgorICAgICAgICAgIChBQS0+Z2V0TW9kUmVmSW5mbyhTSSwgUHRyLCBBY2Nlc3NTaXplKSAmIEFsaWFzQW5hbHlzaXM6Ok1vZCkgPT0gMCkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSB0aGUgc3RvcmUgdGhhdCBtYXkgb3IgbWF5IG5vdCBhbGlhcyB0aGUgcG9pbnRlciwgYmFpbCBvdXQuCisgICAgICArK1NjYW5Gcm9tOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIC8vIElmIHRoaXMgaXMgc29tZSBvdGhlciBpbnN0cnVjdGlvbiB0aGF0IG1heSBjbG9iYmVyIFB0ciwgYmFpbCBvdXQuCisgICAgaWYgKEluc3QtPm1heVdyaXRlVG9NZW1vcnkoKSkgeworICAgICAgLy8gSWYgYWxpYXMgYW5hbHlzaXMgY2xhaW1zIHRoYXQgaXQgcmVhbGx5IHdvbid0IG1vZGlmeSB0aGUgbG9hZCwKKyAgICAgIC8vIGlnbm9yZSBpdC4KKyAgICAgIGlmIChBQSAmJgorICAgICAgICAgIChBQS0+Z2V0TW9kUmVmSW5mbyhJbnN0LCBQdHIsIEFjY2Vzc1NpemUpICYgQWxpYXNBbmFseXNpczo6TW9kKSA9PSAwKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgLy8gTWF5IG1vZGlmeSB0aGUgcG9pbnRlciwgYmFpbCBvdXQuCisgICAgICArK1NjYW5Gcm9tOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIAorICAvLyBHb3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jaywgd2UgZGlkbid0IGZpbmQgaXQsIGJ1dCBhcmUgZG9uZSBmb3IgdGhpcworICAvLyBibG9jay4KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvTG9vcEluZm8uY3BwIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0xvb3BJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjIxOWQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0xvb3BJbmZvLmNwcApAQCAtMCwwICsxLDQxMyBAQAorLy89PT0tIExvb3BJbmZvLmNwcCAtIE5hdHVyYWwgTG9vcCBDYWxjdWxhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTG9vcEluZm8gY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IG5hdHVyYWwgbG9vcHMKKy8vIGFuZCBkZXRlcm1pbmUgdGhlIGxvb3AgZGVwdGggb2YgdmFyaW91cyBub2RlcyBvZiB0aGUgQ0ZHLiAgTm90ZSB0aGF0IHRoZQorLy8gbG9vcHMgaWRlbnRpZmllZCBtYXkgYWN0dWFsbHkgYmUgc2V2ZXJhbCBuYXR1cmFsIGxvb3BzIHRoYXQgc2hhcmUgdGhlIHNhbWUKKy8vIGhlYWRlciBub2RlLi4uIG5vdCBqdXN0IGEgc2luZ2xlIG5hdHVyYWwgbG9vcC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1dyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBBbHdheXMgdmVyaWZ5IGxvb3BpbmZvIGlmIGV4cGVuc2l2ZSBjaGVja2luZyBpcyBlbmFibGVkLgorI2lmZGVmIFhERUJVRworc3RhdGljIGJvb2wgVmVyaWZ5TG9vcEluZm8gPSB0cnVlOworI2Vsc2UKK3N0YXRpYyBib29sIFZlcmlmeUxvb3BJbmZvID0gZmFsc2U7CisjZW5kaWYKK3N0YXRpYyBjbDo6b3B0PGJvb2wsdHJ1ZT4KK1ZlcmlmeUxvb3BJbmZvWCgidmVyaWZ5LWxvb3AtaW5mbyIsIGNsOjpsb2NhdGlvbihWZXJpZnlMb29wSW5mbyksCisgICAgICAgICAgICAgICAgY2w6OmRlc2MoIlZlcmlmeSBsb29wIGluZm8gKHRpbWUgY29uc3VtaW5nKSIpKTsKKworY2hhciBMb29wSW5mbzo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKExvb3BJbmZvLCAibG9vcHMiLCAiTmF0dXJhbCBMb29wIEluZm9ybWF0aW9uIiwgdHJ1ZSwgdHJ1ZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBMb29wIGltcGxlbWVudGF0aW9uCisvLworCisvLy8gaXNMb29wSW52YXJpYW50IC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBsb29wIGludmFyaWFudAorLy8vCitib29sIExvb3A6OmlzTG9vcEludmFyaWFudChWYWx1ZSAqVikgY29uc3QgeworICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpCisgICAgcmV0dXJuIGlzTG9vcEludmFyaWFudChJKTsKKyAgcmV0dXJuIHRydWU7ICAvLyBBbGwgbm9uLWluc3RydWN0aW9ucyBhcmUgbG9vcCBpbnZhcmlhbnQKK30KKworLy8vIGlzTG9vcEludmFyaWFudCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMKKy8vLyBsb29wLWludmFyaWFudC4KKy8vLworYm9vbCBMb29wOjppc0xvb3BJbnZhcmlhbnQoSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHsKKyAgcmV0dXJuICFjb250YWlucyhJKTsKK30KKworLy8vIG1ha2VMb29wSW52YXJpYW50IC0gSWYgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGluc3RydWNpdG9uIGluc2lkZSBvZiB0aGUKKy8vLyBsb29wIGFuZCBpdCBjYW4gYmUgaG9pc3RlZCwgZG8gc28gdG8gbWFrZSBpdCB0cml2aWFsbHkgbG9vcC1pbnZhcmlhbnQuCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGFmdGVyIGFueSBob2lzdGluZyBpcyBsb29wIGludmFyaWFudC4gVGhpcworLy8vIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGFzIGEgc2xpZ2h0bHkgbW9yZSBhZ2dyZXNzaXZlIHJlcGxhY2VtZW50IGZvcgorLy8vIGlzTG9vcEludmFyaWFudC4KKy8vLworLy8vIElmIEluc2VydFB0IGlzIHNwZWNpZmllZCwgaXQgaXMgdGhlIHBvaW50IHRvIGhvaXN0IGluc3RydWN0aW9ucyB0by4KKy8vLyBJZiBudWxsLCB0aGUgdGVybWluYXRvciBvZiB0aGUgbG9vcCBwcmVoZWFkZXIgaXMgdXNlZC4KKy8vLworYm9vbCBMb29wOjptYWtlTG9vcEludmFyaWFudChWYWx1ZSAqViwgYm9vbCAmQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydFB0KSBjb25zdCB7CisgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkKKyAgICByZXR1cm4gbWFrZUxvb3BJbnZhcmlhbnQoSSwgQ2hhbmdlZCwgSW5zZXJ0UHQpOworICByZXR1cm4gdHJ1ZTsgIC8vIEFsbCBub24taW5zdHJ1Y3Rpb25zIGFyZSBsb29wLWludmFyaWFudC4KK30KKworLy8vIG1ha2VMb29wSW52YXJpYW50IC0gSWYgdGhlIGdpdmVuIGluc3RydWN0aW9uIGlzIGluc2lkZSBvZiB0aGUKKy8vLyBsb29wIGFuZCBpdCBjYW4gYmUgaG9pc3RlZCwgZG8gc28gdG8gbWFrZSBpdCB0cml2aWFsbHkgbG9vcC1pbnZhcmlhbnQuCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGFmdGVyIGFueSBob2lzdGluZyBpcyBsb29wIGludmFyaWFudC4gVGhpcworLy8vIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGFzIGEgc2xpZ2h0bHkgbW9yZSBhZ2dyZXNzaXZlIHJlcGxhY2VtZW50IGZvcgorLy8vIGlzTG9vcEludmFyaWFudC4KKy8vLworLy8vIElmIEluc2VydFB0IGlzIHNwZWNpZmllZCwgaXQgaXMgdGhlIHBvaW50IHRvIGhvaXN0IGluc3RydWN0aW9ucyB0by4KKy8vLyBJZiBudWxsLCB0aGUgdGVybWluYXRvciBvZiB0aGUgbG9vcCBwcmVoZWFkZXIgaXMgdXNlZC4KKy8vLworYm9vbCBMb29wOjptYWtlTG9vcEludmFyaWFudChJbnN0cnVjdGlvbiAqSSwgYm9vbCAmQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydFB0KSBjb25zdCB7CisgIC8vIFRlc3QgaWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbG9vcC1pbnZhcmlhbnQuCisgIGlmIChpc0xvb3BJbnZhcmlhbnQoSSkpCisgICAgcmV0dXJuIHRydWU7CisgIGlmICghSS0+aXNTYWZlVG9TcGVjdWxhdGl2ZWx5RXhlY3V0ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKEktPm1heVJlYWRGcm9tTWVtb3J5KCkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBEZXRlcm1pbmUgdGhlIGluc2VydGlvbiBwb2ludCwgdW5sZXNzIG9uZSB3YXMgZ2l2ZW4uCisgIGlmICghSW5zZXJ0UHQpIHsKKyAgICBCYXNpY0Jsb2NrICpQcmVoZWFkZXIgPSBnZXRMb29wUHJlaGVhZGVyKCk7CisgICAgLy8gV2l0aG91dCBhIHByZWhlYWRlciwgaG9pc3RpbmcgaXMgbm90IGZlYXNpYmxlLgorICAgIGlmICghUHJlaGVhZGVyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIEluc2VydFB0ID0gUHJlaGVhZGVyLT5nZXRUZXJtaW5hdG9yKCk7CisgIH0KKyAgLy8gRG9uJ3QgaG9pc3QgaW5zdHJ1Y3Rpb25zIHdpdGggbG9vcC12YXJpYW50IG9wZXJhbmRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFtYWtlTG9vcEludmFyaWFudChJLT5nZXRPcGVyYW5kKGkpLCBDaGFuZ2VkLCBJbnNlcnRQdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIC8vIEhvaXN0LgorICBJLT5tb3ZlQmVmb3JlKEluc2VydFB0KTsKKyAgQ2hhbmdlZCA9IHRydWU7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gZ2V0Q2Fub25pY2FsSW5kdWN0aW9uVmFyaWFibGUgLSBDaGVjayB0byBzZWUgaWYgdGhlIGxvb3AgaGFzIGEgY2Fub25pY2FsCisvLy8gaW5kdWN0aW9uIHZhcmlhYmxlOiBhbiBpbnRlZ2VyIHJlY3VycmVuY2UgdGhhdCBzdGFydHMgYXQgMCBhbmQgaW5jcmVtZW50cworLy8vIGJ5IG9uZSBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcC4gIElmIHNvLCByZXR1cm4gdGhlIHBoaSBub2RlIHRoYXQKKy8vLyBjb3JyZXNwb25kcyB0byBpdC4KKy8vLworLy8vIFRoZSBJbmRWYXJTaW1wbGlmeSBwYXNzIHRyYW5zZm9ybXMgbG9vcHMgdG8gaGF2ZSBhIGNhbm9uaWNhbCBpbmR1Y3Rpb24KKy8vLyB2YXJpYWJsZS4KKy8vLworUEhJTm9kZSAqTG9vcDo6Z2V0Q2Fub25pY2FsSW5kdWN0aW9uVmFyaWFibGUoKSBjb25zdCB7CisgIEJhc2ljQmxvY2sgKkggPSBnZXRIZWFkZXIoKTsKKworICBCYXNpY0Jsb2NrICpJbmNvbWluZyA9IDAsICpCYWNrZWRnZSA9IDA7CisgIHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEgpOworICBhc3NlcnQoUEkgIT0gcHJlZF9lbmQoSCkgJiYKKyAgICAgICAgICJMb29wIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYmFja2VkZ2UhIik7CisgIEJhY2tlZGdlID0gKlBJKys7CisgIGlmIChQSSA9PSBwcmVkX2VuZChIKSkgcmV0dXJuIDA7ICAvLyBkZWFkIGxvb3AKKyAgSW5jb21pbmcgPSAqUEkrKzsKKyAgaWYgKFBJICE9IHByZWRfZW5kKEgpKSByZXR1cm4gMDsgIC8vIG11bHRpcGxlIGJhY2tlZGdlcz8KKworICBpZiAoY29udGFpbnMoSW5jb21pbmcpKSB7CisgICAgaWYgKGNvbnRhaW5zKEJhY2tlZGdlKSkKKyAgICAgIHJldHVybiAwOworICAgIHN0ZDo6c3dhcChJbmNvbWluZywgQmFja2VkZ2UpOworICB9IGVsc2UgaWYgKCFjb250YWlucyhCYWNrZWRnZSkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgUEhJIG5vZGVzLCBsb29raW5nIGZvciBhIGNhbm9uaWNhbCBpbmR2YXIuCisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEgtPmJlZ2luKCk7IGlzYTxQSElOb2RlPihJKTsgKytJKSB7CisgICAgUEhJTm9kZSAqUE4gPSBjYXN0PFBISU5vZGU+KEkpOworICAgIGlmIChDb25zdGFudEludCAqQ0kgPQorICAgICAgICBkeW5fY2FzdDxDb25zdGFudEludD4oUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhJbmNvbWluZykpKQorICAgICAgaWYgKENJLT5pc051bGxWYWx1ZSgpKQorICAgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKkluYyA9CisgICAgICAgICAgICBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhCYWNrZWRnZSkpKQorICAgICAgICAgIGlmIChJbmMtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQgJiYKKyAgICAgICAgICAgICAgICBJbmMtPmdldE9wZXJhbmQoMCkgPT0gUE4pCisgICAgICAgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEluYy0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICAgICAgICAgIGlmIChDSS0+ZXF1YWxzSW50KDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBQTjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGdldFRyaXBDb3VudCAtIFJldHVybiBhIGxvb3AtaW52YXJpYW50IExMVk0gdmFsdWUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mCisvLy8gdGltZXMgdGhlIGxvb3Agd2lsbCBiZSBleGVjdXRlZC4gIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoYXQgdGhlIGJhY2tlZGdlCisvLy8gb2YgdGhlIGxvb3AgZXhlY3V0ZXMgTi0xIHRpbWVzLiAgSWYgdGhlIHRyaXAtY291bnQgY2Fubm90IGJlIGRldGVybWluZWQsCisvLy8gdGhpcyByZXR1cm5zIG51bGwuCisvLy8KKy8vLyBUaGUgSW5kVmFyU2ltcGxpZnkgcGFzcyB0cmFuc2Zvcm1zIGxvb3BzIHRvIGhhdmUgYSBmb3JtIHRoYXQgdGhpcworLy8vIGZ1bmN0aW9uIGVhc2lseSB1bmRlcnN0YW5kcy4KKy8vLworVmFsdWUgKkxvb3A6OmdldFRyaXBDb3VudCgpIGNvbnN0IHsKKyAgLy8gQ2Fub25pY2FsIGxvb3BzIHdpbGwgZW5kIHdpdGggYSAnY21wIG5lIEksIFYnLCB3aGVyZSBJIGlzIHRoZSBpbmNyZW1lbnRlZAorICAvLyBjYW5vbmljYWwgaW5kdWN0aW9uIHZhcmlhYmxlIGFuZCBWIGlzIHRoZSB0cmlwIGNvdW50IG9mIHRoZSBsb29wLgorICBQSElOb2RlICpJViA9IGdldENhbm9uaWNhbEluZHVjdGlvblZhcmlhYmxlKCk7CisgIGlmIChJViA9PSAwIHx8IElWLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpICE9IDIpIHJldHVybiAwOworCisgIGJvb2wgUDBJbkxvb3AgPSBjb250YWlucyhJVi0+Z2V0SW5jb21pbmdCbG9jaygwKSk7CisgIFZhbHVlICpJbmMgPSBJVi0+Z2V0SW5jb21pbmdWYWx1ZSghUDBJbkxvb3ApOworICBCYXNpY0Jsb2NrICpCYWNrZWRnZUJsb2NrID0gSVYtPmdldEluY29taW5nQmxvY2soIVAwSW5Mb29wKTsKKworICBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihCYWNrZWRnZUJsb2NrLT5nZXRUZXJtaW5hdG9yKCkpKQorICAgIGlmIChCSS0+aXNDb25kaXRpb25hbCgpKSB7CisgICAgICBpZiAoSUNtcEluc3QgKklDSSA9IGR5bl9jYXN0PElDbXBJbnN0PihCSS0+Z2V0Q29uZGl0aW9uKCkpKSB7CisgICAgICAgIGlmIChJQ0ktPmdldE9wZXJhbmQoMCkgPT0gSW5jKSB7CisgICAgICAgICAgaWYgKEJJLT5nZXRTdWNjZXNzb3IoMCkgPT0gZ2V0SGVhZGVyKCkpIHsKKyAgICAgICAgICAgIGlmIChJQ0ktPmdldFByZWRpY2F0ZSgpID09IElDbXBJbnN0OjpJQ01QX05FKQorICAgICAgICAgICAgICByZXR1cm4gSUNJLT5nZXRPcGVyYW5kKDEpOworICAgICAgICAgIH0gZWxzZSBpZiAoSUNJLT5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9FUSkgeworICAgICAgICAgICAgcmV0dXJuIElDSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBnZXRTbWFsbENvbnN0YW50VHJpcENvdW50IC0gUmV0dXJucyB0aGUgdHJpcCBjb3VudCBvZiB0aGlzIGxvb3AgYXMgYQorLy8vIG5vcm1hbCB1bnNpZ25lZCB2YWx1ZSwgaWYgcG9zc2libGUuIFJldHVybnMgMCBpZiB0aGUgdHJpcCBjb3VudCBpcyB1bmtub3duCisvLy8gb2Ygbm90IGNvbnN0YW50LiBXaWxsIGFsc28gcmV0dXJuIDAgaWYgdGhlIHRyaXAgY291bnQgaXMgdmVyeSBsYXJnZQorLy8vICg+PSAyXjMyKQordW5zaWduZWQgTG9vcDo6Z2V0U21hbGxDb25zdGFudFRyaXBDb3VudCgpIGNvbnN0IHsKKyAgVmFsdWUqIFRyaXBDb3VudCA9IHRoaXMtPmdldFRyaXBDb3VudCgpOworICBpZiAoVHJpcENvdW50KSB7CisgICAgaWYgKENvbnN0YW50SW50ICpUcmlwQ291bnRDID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFRyaXBDb3VudCkpIHsKKyAgICAgIC8vIEd1YXJkIGFnYWluc3QgaHVnZSB0cmlwIGNvdW50cy4KKyAgICAgIGlmIChUcmlwQ291bnRDLT5nZXRWYWx1ZSgpLmdldEFjdGl2ZUJpdHMoKSA8PSAzMikgeworICAgICAgICByZXR1cm4gKHVuc2lnbmVkKVRyaXBDb3VudEMtPmdldFpFeHRWYWx1ZSgpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGdldFNtYWxsQ29uc3RhbnRUcmlwTXVsdGlwbGUgLSBSZXR1cm5zIHRoZSBsYXJnZXN0IGNvbnN0YW50IGRpdmlzb3Igb2YgdGhlCisvLy8gdHJpcCBjb3VudCBvZiB0aGlzIGxvb3AgYXMgYSBub3JtYWwgdW5zaWduZWQgdmFsdWUsIGlmIHBvc3NpYmxlLiBUaGlzCisvLy8gbWVhbnMgdGhhdCB0aGUgYWN0dWFsIHRyaXAgY291bnQgaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgdGhlIHJldHVybmVkCisvLy8gdmFsdWUgKGRvbid0IGZvcmdldCB0aGUgdHJpcCBjb3VudCBjb3VsZCB2ZXJ5IHdlbGwgYmUgemVybyBhcyB3ZWxsISkuCisvLy8KKy8vLyBSZXR1cm5zIDEgaWYgdGhlIHRyaXAgY291bnQgaXMgdW5rbm93biBvciBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGUKKy8vLyBtdWx0aXBsZSBvZiBhIGNvbnN0YW50ICh3aGljaCBpcyBhbHNvIHRoZSBjYXNlIGlmIHRoZSB0cmlwIGNvdW50IGlzIHNpbXBseQorLy8vIGNvbnN0YW50LCB1c2UgZ2V0U21hbGxDb25zdGFudFRyaXBDb3VudCBmb3IgdGhhdCBjYXNlKSwgV2lsbCBhbHNvIHJldHVybiAxCisvLy8gaWYgdGhlIHRyaXAgY291bnQgaXMgdmVyeSBsYXJnZSAoPj0gMl4zMikuCit1bnNpZ25lZCBMb29wOjpnZXRTbWFsbENvbnN0YW50VHJpcE11bHRpcGxlKCkgY29uc3QgeworICBWYWx1ZSogVHJpcENvdW50ID0gdGhpcy0+Z2V0VHJpcENvdW50KCk7CisgIC8vIFRoaXMgd2lsbCBob2xkIHRoZSBDb25zdGFudEludCByZXN1bHQsIGlmIGFueQorICBDb25zdGFudEludCAqUmVzdWx0ID0gTlVMTDsKKyAgaWYgKFRyaXBDb3VudCkgeworICAgIC8vIFNlZSBpZiB0aGUgdHJpcCBjb3VudCBpcyBjb25zdGFudCBpdHNlbGYKKyAgICBSZXN1bHQgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVHJpcENvdW50KTsKKyAgICAvLyBpZiBub3QsIHNlZSBpZiBpdCBpcyBhIG11bHRpcGxpY2F0aW9uCisgICAgaWYgKCFSZXN1bHQpCisgICAgICBpZiAoQmluYXJ5T3BlcmF0b3IgKkJPID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KFRyaXBDb3VudCkpIHsKKyAgICAgICAgc3dpdGNoIChCTy0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcjo6TXVsOgorICAgICAgICAgIFJlc3VsdCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihCTy0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3I6OlNobDoKKyAgICAgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEJPLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICAgICAgIGlmIChDSS0+Z2V0VmFsdWUoKS5nZXRBY3RpdmVCaXRzKCkgPD0gNSkKKyAgICAgICAgICAgICAgcmV0dXJuIDF1IDw8IENJLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICB9CisgIC8vIEd1YXJkIGFnYWluc3QgaHVnZSB0cmlwIGNvdW50cy4KKyAgaWYgKFJlc3VsdCAmJiBSZXN1bHQtPmdldFZhbHVlKCkuZ2V0QWN0aXZlQml0cygpIDw9IDMyKSB7CisgICAgcmV0dXJuICh1bnNpZ25lZClSZXN1bHQtPmdldFpFeHRWYWx1ZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiAxOworICB9Cit9CisKKy8vLyBpc0xDU1NBRm9ybSAtIFJldHVybiB0cnVlIGlmIHRoZSBMb29wIGlzIGluIExDU1NBIGZvcm0KK2Jvb2wgTG9vcDo6aXNMQ1NTQUZvcm0oRG9taW5hdG9yVHJlZSAmRFQpIGNvbnN0IHsKKyAgLy8gU29ydCB0aGUgYmxvY2tzIHZlY3RvciBzbyB0aGF0IHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaCB0byBkbyBxdWljaworICAvLyBsb29rdXBzLgorICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgMTY+IExvb3BCQnMoYmxvY2tfYmVnaW4oKSwgYmxvY2tfZW5kKCkpOworCisgIGZvciAoYmxvY2tfaXRlcmF0b3IgQkkgPSBibG9ja19iZWdpbigpLCBFID0gYmxvY2tfZW5kKCk7IEJJICE9IEU7ICsrQkkpIHsKKyAgICBCYXNpY0Jsb2NrICpCQiA9ICpCSTsKKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSSAhPSBFOysrSSkKKyAgICAgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEktPnVzZV9iZWdpbigpLCBFID0gSS0+dXNlX2VuZCgpOyBVSSAhPSBFOworICAgICAgICAgICArK1VJKSB7CisgICAgICAgIFVzZXIgKlUgPSAqVUk7CisgICAgICAgIEJhc2ljQmxvY2sgKlVzZXJCQiA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KFUpLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKFBISU5vZGUgKlAgPSBkeW5fY2FzdDxQSElOb2RlPihVKSkKKyAgICAgICAgICBVc2VyQkIgPSBQLT5nZXRJbmNvbWluZ0Jsb2NrKFVJKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBibG9jaywgYXMgYSBmYXN0LXBhdGgsIGJlZm9yZSBjaGVja2luZyB3aGV0aGVyCisgICAgICAgIC8vIHRoZSB1c2UgaXMgYW55d2hlcmUgaW4gdGhlIGxvb3AuICBNb3N0IHZhbHVlcyBhcmUgdXNlZCBpbiB0aGUgc2FtZQorICAgICAgICAvLyBibG9jayB0aGV5IGFyZSBkZWZpbmVkIGluLiAgQWxzbywgYmxvY2tzIG5vdCByZWFjaGFibGUgZnJvbSB0aGUKKyAgICAgICAgLy8gZW50cnkgYXJlIHNwZWNpYWw7IHVzZXMgaW4gdGhlbSBkb24ndCBuZWVkIHRvIGdvIHRocm91Z2ggUEhJcy4KKyAgICAgICAgaWYgKFVzZXJCQiAhPSBCQiAmJgorICAgICAgICAgICAgIUxvb3BCQnMuY291bnQoVXNlckJCKSAmJgorICAgICAgICAgICAgRFQuaXNSZWFjaGFibGVGcm9tRW50cnkoVXNlckJCKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzTG9vcFNpbXBsaWZ5Rm9ybSAtIFJldHVybiB0cnVlIGlmIHRoZSBMb29wIGlzIGluIHRoZSBmb3JtIHRoYXQKKy8vLyB0aGUgTG9vcFNpbXBsaWZ5IGZvcm0gdHJhbnNmb3JtcyBsb29wcyB0bywgd2hpY2ggaXMgc29tZXRpbWVzIGNhbGxlZAorLy8vIG5vcm1hbCBmb3JtLgorYm9vbCBMb29wOjppc0xvb3BTaW1wbGlmeUZvcm0oKSBjb25zdCB7CisgIC8vIE5vcm1hbC1mb3JtIGxvb3BzIGhhdmUgYSBwcmVoZWFkZXIsIGEgc2luZ2xlIGJhY2tlZGdlLCBhbmQgYWxsIG9mIHRoZWlyCisgIC8vIGV4aXRzIGhhdmUgYWxsIHRoZWlyIHByZWRlY2Vzc29ycyBpbnNpZGUgdGhlIGxvb3AuCisgIHJldHVybiBnZXRMb29wUHJlaGVhZGVyKCkgJiYgZ2V0TG9vcExhdGNoKCkgJiYgaGFzRGVkaWNhdGVkRXhpdHMoKTsKK30KKworLy8vIGhhc0RlZGljYXRlZEV4aXRzIC0gUmV0dXJuIHRydWUgaWYgbm8gZXhpdCBibG9jayBmb3IgdGhlIGxvb3AKKy8vLyBoYXMgYSBwcmVkZWNlc3NvciB0aGF0IGlzIG91dHNpZGUgdGhlIGxvb3AuCitib29sIExvb3A6Omhhc0RlZGljYXRlZEV4aXRzKCkgY29uc3QgeworICAvLyBTb3J0IHRoZSBibG9ja3MgdmVjdG9yIHNvIHRoYXQgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvIGRvIHF1aWNrCisgIC8vIGxvb2t1cHMuCisgIFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sgKiwgMTY+IExvb3BCQnMoYmxvY2tfYmVnaW4oKSwgYmxvY2tfZW5kKCkpOworICAvLyBFYWNoIHByZWRlY2Vzc29yIG9mIGVhY2ggZXhpdCBibG9jayBvZiBhIG5vcm1hbCBsb29wIGlzIGNvbnRhaW5lZAorICAvLyB3aXRoaW4gdGhlIGxvb3AuCisgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sgKiwgND4gRXhpdEJsb2NrczsKKyAgZ2V0RXhpdEJsb2NrcyhFeGl0QmxvY2tzKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEV4aXRCbG9ja3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBmb3IgKHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEV4aXRCbG9ja3NbaV0pLAorICAgICAgICAgUEUgPSBwcmVkX2VuZChFeGl0QmxvY2tzW2ldKTsgUEkgIT0gUEU7ICsrUEkpCisgICAgICBpZiAoIUxvb3BCQnMuY291bnQoKlBJKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAvLyBBbGwgdGhlIHJlcXVpcmVtZW50cyBhcmUgbWV0LgorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGdldFVuaXF1ZUV4aXRCbG9ja3MgLSBSZXR1cm4gYWxsIHVuaXF1ZSBzdWNjZXNzb3IgYmxvY2tzIG9mIHRoaXMgbG9vcC4KKy8vLyBUaGVzZSBhcmUgdGhlIGJsb2NrcyBfb3V0c2lkZSBvZiB0aGUgY3VycmVudCBsb29wXyB3aGljaCBhcmUgYnJhbmNoZWQgdG8uCisvLy8gVGhpcyBhc3N1bWVzIHRoYXQgbG9vcCBleGl0cyBhcmUgaW4gY2Fub25pY2FsIGZvcm0uCisvLy8KK3ZvaWQKK0xvb3A6OmdldFVuaXF1ZUV4aXRCbG9ja3MoU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sgKj4gJkV4aXRCbG9ja3MpIGNvbnN0IHsKKyAgYXNzZXJ0KGhhc0RlZGljYXRlZEV4aXRzKCkgJiYKKyAgICAgICAgICJnZXRVbmlxdWVFeGl0QmxvY2tzIGFzc3VtZXMgdGhlIGxvb3AgaGFzIGNhbm9uaWNhbCBmb3JtIGV4aXRzISIpOworCisgIC8vIFNvcnQgdGhlIGJsb2NrcyB2ZWN0b3Igc28gdGhhdCB3ZSBjYW4gdXNlIGJpbmFyeSBzZWFyY2ggdG8gZG8gcXVpY2sKKyAgLy8gbG9va3Vwcy4KKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayAqLCAxMjg+IExvb3BCQnMoYmxvY2tfYmVnaW4oKSwgYmxvY2tfZW5kKCkpOworICBzdGQ6OnNvcnQoTG9vcEJCcy5iZWdpbigpLCBMb29wQkJzLmVuZCgpKTsKKworICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrICosIDMyPiBzd2l0Y2hFeGl0QmxvY2tzOworCisgIGZvciAoYmxvY2tfaXRlcmF0b3IgQkkgPSBibG9ja19iZWdpbigpLCBCRSA9IGJsb2NrX2VuZCgpOyBCSSAhPSBCRTsgKytCSSkgeworCisgICAgQmFzaWNCbG9jayAqY3VycmVudCA9ICpCSTsKKyAgICBzd2l0Y2hFeGl0QmxvY2tzLmNsZWFyKCk7CisKKyAgICBmb3IgKHN1Y2NfaXRlcmF0b3IgSSA9IHN1Y2NfYmVnaW4oKkJJKSwgRSA9IHN1Y2NfZW5kKCpCSSk7IEkgIT0gRTsgKytJKSB7CisgICAgICAvLyBJZiBibG9jayBpcyBpbnNpZGUgdGhlIGxvb3AgdGhlbiBpdCBpcyBub3QgYSBleGl0IGJsb2NrLgorICAgICAgaWYgKHN0ZDo6YmluYXJ5X3NlYXJjaChMb29wQkJzLmJlZ2luKCksIExvb3BCQnMuZW5kKCksICpJKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKCpJKTsKKyAgICAgIEJhc2ljQmxvY2sgKmZpcnN0UHJlZCA9ICpQSTsKKworICAgICAgLy8gSWYgY3VycmVudCBiYXNpYyBibG9jayBpcyB0aGlzIGV4aXQgYmxvY2sncyBmaXJzdCBwcmVkZWNlc3NvcgorICAgICAgLy8gdGhlbiBvbmx5IGluc2VydCBleGl0IGJsb2NrIGluIHRvIHRoZSBvdXRwdXQgRXhpdEJsb2NrcyB2ZWN0b3IuCisgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBzYW1lIGV4aXQgYmxvY2sgaXMgbm90IGluc2VydGVkIHR3aWNlIGludG8KKyAgICAgIC8vIEV4aXRCbG9ja3MgdmVjdG9yLgorICAgICAgaWYgKGN1cnJlbnQgIT0gZmlyc3RQcmVkKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gSWYgYSB0ZXJtaW5hdG9yIGhhcyBtb3JlIHRoZW4gdHdvIHN1Y2Nlc3NvcnMsIGZvciBleGFtcGxlIFN3aXRjaEluc3QsCisgICAgICAvLyB0aGVuIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIGVkZ2VzIGZyb20gY3VycmVudCBibG9jaworICAgICAgLy8gdG8gb25lIGV4aXQgYmxvY2suCisgICAgICBpZiAoc3RkOjpkaXN0YW5jZShzdWNjX2JlZ2luKGN1cnJlbnQpLCBzdWNjX2VuZChjdXJyZW50KSkgPD0gMikgeworICAgICAgICBFeGl0QmxvY2tzLnB1c2hfYmFjaygqSSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBJbiBjYXNlIG9mIG11bHRpcGxlIGVkZ2VzIGZyb20gY3VycmVudCBibG9jayB0byBleGl0IGJsb2NrLCBjb2xsZWN0CisgICAgICAvLyBvbmx5IG9uZSBlZGdlIGluIEV4aXRCbG9ja3MuIFVzZSBzd2l0Y2hFeGl0QmxvY2tzIHRvIGtlZXAgdHJhY2sgb2YKKyAgICAgIC8vIGR1cGxpY2F0ZSBlZGdlcy4KKyAgICAgIGlmIChzdGQ6OmZpbmQoc3dpdGNoRXhpdEJsb2Nrcy5iZWdpbigpLCBzd2l0Y2hFeGl0QmxvY2tzLmVuZCgpLCAqSSkKKyAgICAgICAgICA9PSBzd2l0Y2hFeGl0QmxvY2tzLmVuZCgpKSB7CisgICAgICAgIHN3aXRjaEV4aXRCbG9ja3MucHVzaF9iYWNrKCpJKTsKKyAgICAgICAgRXhpdEJsb2Nrcy5wdXNoX2JhY2soKkkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gZ2V0VW5pcXVlRXhpdEJsb2NrIC0gSWYgZ2V0VW5pcXVlRXhpdEJsb2NrcyB3b3VsZCByZXR1cm4gZXhhY3RseSBvbmUKKy8vLyBibG9jaywgcmV0dXJuIHRoYXQgYmxvY2suIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KK0Jhc2ljQmxvY2sgKkxvb3A6OmdldFVuaXF1ZUV4aXRCbG9jaygpIGNvbnN0IHsKKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayAqLCA4PiBVbmlxdWVFeGl0QmxvY2tzOworICBnZXRVbmlxdWVFeGl0QmxvY2tzKFVuaXF1ZUV4aXRCbG9ja3MpOworICBpZiAoVW5pcXVlRXhpdEJsb2Nrcy5zaXplKCkgPT0gMSkKKyAgICByZXR1cm4gVW5pcXVlRXhpdEJsb2Nrc1swXTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgTG9vcDo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIExvb3BJbmZvIGltcGxlbWVudGF0aW9uCisvLworYm9vbCBMb29wSW5mbzo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiAmKSB7CisgIHJlbGVhc2VNZW1vcnkoKTsKKyAgTEkuQ2FsY3VsYXRlKGdldEFuYWx5c2lzPERvbWluYXRvclRyZWU+KCkuZ2V0QmFzZSgpKTsgICAgLy8gVXBkYXRlCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBMb29wSW5mbzo6dmVyaWZ5QW5hbHlzaXMoKSBjb25zdCB7CisgIC8vIExvb3BJbmZvIGlzIGEgRnVuY3Rpb25QYXNzLCBidXQgdmVyaWZ5aW5nIGV2ZXJ5IGxvb3AgaW4gdGhlIGZ1bmN0aW9uCisgIC8vIGVhY2ggdGltZSB2ZXJpZnlBbmFseXNpcyBpcyBjYWxsZWQgaXMgdmVyeSBleHBlbnNpdmUuIFRoZQorICAvLyAtdmVyaWZ5LWxvb3AtaW5mbyBvcHRpb24gY2FuIGVuYWJsZSB0aGlzLiBJbiBvcmRlciB0byBwZXJmb3JtIHNvbWUKKyAgLy8gY2hlY2tpbmcgYnkgZGVmYXVsdCwgTG9vcFBhc3MgaGFzIGJlZW4gdGF1Z2h0IHRvIGNhbGwgdmVyaWZ5TG9vcAorICAvLyBtYW51YWxseSBkdXJpbmcgbG9vcCBwYXNzIHNlcXVlbmNlcy4KKworICBpZiAoIVZlcmlmeUxvb3BJbmZvKSByZXR1cm47CisKKyAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGFzc2VydCghKCpJKS0+Z2V0UGFyZW50TG9vcCgpICYmICJUb3AtbGV2ZWwgbG9vcCBoYXMgYSBwYXJlbnQhIik7CisgICAgKCpJKS0+dmVyaWZ5TG9vcE5lc3QoKTsKKyAgfQorCisgIC8vIFRPRE86IGNoZWNrIEJCTWFwIGNvbnNpc3RlbmN5LgorfQorCit2b2lkIExvb3BJbmZvOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICBBVS5hZGRSZXF1aXJlZDxEb21pbmF0b3JUcmVlPigpOworfQorCit2b2lkIExvb3BJbmZvOjpwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSopIGNvbnN0IHsKKyAgTEkucHJpbnQoT1MpOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvTG9vcFBhc3MuY3BwIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0xvb3BQYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTdlMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL0xvb3BQYXNzLmNwcApAQCAtMCwwICsxLDQwNCBAQAorLy89PT0tIExvb3BQYXNzLmNwcCAtIExvb3AgUGFzcyBhbmQgTG9vcCBQYXNzIE1hbmFnZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBMb29wUGFzcyBhbmQgTFBQYXNzTWFuYWdlci4gQWxsIGxvb3Agb3B0aW1pemF0aW9uCisvLyBhbmQgdHJhbnNmb3JtYXRpb24gcGFzc2VzIGFyZSBkZXJpdmVkIGZyb20gTG9vcFBhc3MuIExQUGFzc01hbmFnZXIgaXMKKy8vIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBMb29wUGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9QcmludE1vZHVsZVBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGltZXIuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworCisvLy8gUHJpbnRMb29wUGFzcyAtIFByaW50IGEgRnVuY3Rpb24gY29ycmVzcG9uZGluZyB0byBhIExvb3AuCisvLy8KK2NsYXNzIFByaW50TG9vcFBhc3MgOiBwdWJsaWMgTG9vcFBhc3MgeworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgQmFubmVyOworICByYXdfb3N0cmVhbSAmT3V0OyAgICAgICAvLyByYXdfb3N0cmVhbSB0byBwcmludCBvbi4KKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgUHJpbnRMb29wUGFzcygpIDogTG9vcFBhc3MoSUQpLCBPdXQoZGJncygpKSB7fQorICBQcmludExvb3BQYXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZCLCByYXdfb3N0cmVhbSAmbykKKyAgICAgIDogTG9vcFBhc3MoSUQpLCBCYW5uZXIoQiksIE91dChvKSB7fQorCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICBib29sIHJ1bk9uTG9vcChMb29wICpMLCBMUFBhc3NNYW5hZ2VyICYpIHsKKyAgICBPdXQgPDwgQmFubmVyOworICAgIGZvciAoTG9vcDo6YmxvY2tfaXRlcmF0b3IgYiA9IEwtPmJsb2NrX2JlZ2luKCksIGJlID0gTC0+YmxvY2tfZW5kKCk7CisgICAgICAgICBiICE9IGJlOworICAgICAgICAgKytiKSB7CisgICAgICAoKmIpLT5wcmludChPdXQpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NoYXIgUHJpbnRMb29wUGFzczo6SUQgPSAwOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTFBQYXNzTWFuYWdlcgorLy8KKworY2hhciBMUFBhc3NNYW5hZ2VyOjpJRCA9IDA7CisKK0xQUGFzc01hbmFnZXI6OkxQUGFzc01hbmFnZXIoaW50IERlcHRoKSAKKyAgOiBGdW5jdGlvblBhc3MoSUQpLCBQTURhdGFNYW5hZ2VyKERlcHRoKSB7IAorICBza2lwVGhpc0xvb3AgPSBmYWxzZTsKKyAgcmVkb1RoaXNMb29wID0gZmFsc2U7CisgIExJID0gTlVMTDsKKyAgQ3VycmVudExvb3AgPSBOVUxMOworfQorCisvLy8gRGVsZXRlIGxvb3AgZnJvbSB0aGUgbG9vcCBxdWV1ZSBhbmQgbG9vcCBoaWVyYXJjaHkgKExvb3BJbmZvKS4gCit2b2lkIExQUGFzc01hbmFnZXI6OmRlbGV0ZUxvb3BGcm9tUXVldWUoTG9vcCAqTCkgeworCisgIGlmIChMb29wICpQYXJlbnRMb29wID0gTC0+Z2V0UGFyZW50TG9vcCgpKSB7IC8vIE5vdCBhIHRvcC1sZXZlbCBsb29wLgorICAgIC8vIFJlcGFyZW50IGFsbCBvZiB0aGUgYmxvY2tzIGluIHRoaXMgbG9vcC4gIFNpbmNlIEJCTG9vcCBoYWQgYSBwYXJlbnQsCisgICAgLy8gdGhleSBhcmUgbm93IGFsbCBpbiBpdC4KKyAgICBmb3IgKExvb3A6OmJsb2NrX2l0ZXJhdG9yIEkgPSBMLT5ibG9ja19iZWdpbigpLCBFID0gTC0+YmxvY2tfZW5kKCk7IAorICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBpZiAoTEktPmdldExvb3BGb3IoKkkpID09IEwpICAgIC8vIERvbid0IGNoYW5nZSBibG9ja3MgaW4gc3VibG9vcHMuCisgICAgICAgIExJLT5jaGFuZ2VMb29wRm9yKCpJLCBQYXJlbnRMb29wKTsKKyAgICAKKyAgICAvLyBSZW1vdmUgdGhlIGxvb3AgZnJvbSBpdHMgcGFyZW50IGxvb3AuCisgICAgZm9yIChMb29wOjppdGVyYXRvciBJID0gUGFyZW50TG9vcC0+YmVnaW4oKSwgRSA9IFBhcmVudExvb3AtPmVuZCgpOzsKKyAgICAgICAgICsrSSkgeworICAgICAgYXNzZXJ0KEkgIT0gRSAmJiAiQ291bGRuJ3QgZmluZCBsb29wIik7CisgICAgICBpZiAoKkkgPT0gTCkgeworICAgICAgICBQYXJlbnRMb29wLT5yZW1vdmVDaGlsZExvb3AoSSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBNb3ZlIGFsbCBzdWJsb29wcyBpbnRvIHRoZSBwYXJlbnQgbG9vcC4KKyAgICB3aGlsZSAoIUwtPmVtcHR5KCkpCisgICAgICBQYXJlbnRMb29wLT5hZGRDaGlsZExvb3AoTC0+cmVtb3ZlQ2hpbGRMb29wKEwtPmVuZCgpLTEpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBSZXBhcmVudCBhbGwgb2YgdGhlIGJsb2NrcyBpbiB0aGlzIGxvb3AuICBTaW5jZSBCQkxvb3AgaGFkIG5vIHBhcmVudCwKKyAgICAvLyB0aGV5IG5vIGxvbmdlciBpbiBhIGxvb3AgYXQgYWxsLgorICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTC0+Z2V0QmxvY2tzKCkuc2l6ZSgpOyArK2kpIHsKKyAgICAgIC8vIERvbid0IGNoYW5nZSBibG9ja3MgaW4gc3VibG9vcHMuCisgICAgICBpZiAoTEktPmdldExvb3BGb3IoTC0+Z2V0QmxvY2tzKClbaV0pID09IEwpIHsKKyAgICAgICAgTEktPnJlbW92ZUJsb2NrKEwtPmdldEJsb2NrcygpW2ldKTsKKyAgICAgICAgLS1pOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJlbW92ZSB0aGUgbG9vcCBmcm9tIHRoZSB0b3AtbGV2ZWwgTG9vcEluZm8gb2JqZWN0LgorICAgIGZvciAoTG9vcEluZm86Oml0ZXJhdG9yIEkgPSBMSS0+YmVnaW4oKSwgRSA9IExJLT5lbmQoKTs7ICsrSSkgeworICAgICAgYXNzZXJ0KEkgIT0gRSAmJiAiQ291bGRuJ3QgZmluZCBsb29wIik7CisgICAgICBpZiAoKkkgPT0gTCkgeworICAgICAgICBMSS0+cmVtb3ZlTG9vcChJKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8gTW92ZSBhbGwgb2YgdGhlIHN1Ymxvb3BzIHRvIHRoZSB0b3AtbGV2ZWwuCisgICAgd2hpbGUgKCFMLT5lbXB0eSgpKQorICAgICAgTEktPmFkZFRvcExldmVsTG9vcChMLT5yZW1vdmVDaGlsZExvb3AoTC0+ZW5kKCktMSkpOworICB9CisKKyAgZGVsZXRlIEw7CisKKyAgLy8gSWYgTCBpcyBjdXJyZW50IGxvb3AgdGhlbiBza2lwIHJlc3Qgb2YgdGhlIHBhc3NlcyBhbmQgbGV0CisgIC8vIHJ1bk9uRnVuY3Rpb24gcmVtb3ZlIEwgZnJvbSBMUS4gT3RoZXJ3aXNlLCByZW1vdmUgTCBmcm9tIExRIG5vdworICAvLyBhbmQgY29udGludWUgYXBwbHlpbmcgb3RoZXIgcGFzc2VzIG9uIEN1cnJlbnRMb29wLgorICBpZiAoQ3VycmVudExvb3AgPT0gTCkgeworICAgIHNraXBUaGlzTG9vcCA9IHRydWU7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChzdGQ6OmRlcXVlPExvb3AgKj46Oml0ZXJhdG9yIEkgPSBMUS5iZWdpbigpLAorICAgICAgICAgRSA9IExRLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGlmICgqSSA9PSBMKSB7CisgICAgICBMUS5lcmFzZShJKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvLyBJbnNldCBsb29wIGludG8gbG9vcCBuZXN0IChMb29wSW5mbykgYW5kIGxvb3AgcXVldWUgKExRKS4KK3ZvaWQgTFBQYXNzTWFuYWdlcjo6aW5zZXJ0TG9vcChMb29wICpMLCBMb29wICpQYXJlbnRMb29wKSB7CisKKyAgYXNzZXJ0IChDdXJyZW50TG9vcCAhPSBMICYmICJDYW5ub3QgaW5zZXJ0IEN1cnJlbnRMb29wIik7CisKKyAgLy8gSW5zZXJ0IGludG8gbG9vcCBuZXN0CisgIGlmIChQYXJlbnRMb29wKQorICAgIFBhcmVudExvb3AtPmFkZENoaWxkTG9vcChMKTsKKyAgZWxzZQorICAgIExJLT5hZGRUb3BMZXZlbExvb3AoTCk7CisKKyAgaW5zZXJ0TG9vcEludG9RdWV1ZShMKTsKK30KKwordm9pZCBMUFBhc3NNYW5hZ2VyOjppbnNlcnRMb29wSW50b1F1ZXVlKExvb3AgKkwpIHsKKyAgLy8gSW5zZXJ0IEwgaW50byBsb29wIHF1ZXVlCisgIGlmIChMID09IEN1cnJlbnRMb29wKSAKKyAgICByZWRvTG9vcChMKTsKKyAgZWxzZSBpZiAoIUwtPmdldFBhcmVudExvb3AoKSkKKyAgICAvLyBUaGlzIGlzIHRvcCBsZXZlbCBsb29wLiAKKyAgICBMUS5wdXNoX2Zyb250KEwpOworICBlbHNlIHsKKyAgICAvLyBJbnNlcnQgTCBhZnRlciB0aGUgcGFyZW50IGxvb3AuCisgICAgZm9yIChzdGQ6OmRlcXVlPExvb3AgKj46Oml0ZXJhdG9yIEkgPSBMUS5iZWdpbigpLAorICAgICAgICAgICBFID0gTFEuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoKkkgPT0gTC0+Z2V0UGFyZW50TG9vcCgpKSB7CisgICAgICAgIC8vIGRlcXVlIGRvZXMgbm90IHN1cHBvcnQgaW5zZXJ0IGFmdGVyLgorICAgICAgICArK0k7CisgICAgICAgIExRLmluc2VydChJLCAxLCBMKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIFJlb3B0aW1pemUgdGhpcyBsb29wLiBMUFBhc3NNYW5hZ2VyIHdpbGwgcmUtaW5zZXJ0IHRoaXMgbG9vcCBpbnRvIHRoZQorLy8gcXVldWUuIFRoaXMgYWxsb3dzIExvb3BQYXNzIHRvIGNoYW5nZSBsb29wIG5lc3QgZm9yIHRoZSBsb29wLiBUaGlzCisvLyB1dGlsaXR5IG1heSBzZW5kIExQUGFzc01hbmFnZXIgaW50byBpbmZpbml0ZSBsb29wcyBzbyB1c2UgY2F1dGlvbi4KK3ZvaWQgTFBQYXNzTWFuYWdlcjo6cmVkb0xvb3AoTG9vcCAqTCkgeworICBhc3NlcnQgKEN1cnJlbnRMb29wID09IEwgJiYgIkNhbiByZWRvIG9ubHkgQ3VycmVudExvb3AiKTsKKyAgcmVkb1RoaXNMb29wID0gdHJ1ZTsKK30KKworLy8vIGNsb25lQmFzaWNCbG9ja1NpbXBsZUFuYWx5c2lzIC0gSW52b2tlIGNsb25lQmFzaWNCbG9ja0FuYWx5c2lzIGhvb2sgZm9yCisvLy8gYWxsIGxvb3AgcGFzc2VzLgordm9pZCBMUFBhc3NNYW5hZ2VyOjpjbG9uZUJhc2ljQmxvY2tTaW1wbGVBbmFseXNpcyhCYXNpY0Jsb2NrICpGcm9tLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVG8sIExvb3AgKkwpIHsKKyAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpIHsgIAorICAgIExvb3BQYXNzICpMUCA9IChMb29wUGFzcyAqKWdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgIExQLT5jbG9uZUJhc2ljQmxvY2tBbmFseXNpcyhGcm9tLCBUbywgTCk7CisgIH0KK30KKworLy8vIGRlbGV0ZVNpbXBsZUFuYWx5c2lzVmFsdWUgLSBJbnZva2UgZGVsZXRlQW5hbHlzaXNWYWx1ZSBob29rIGZvciBhbGwgcGFzc2VzLgordm9pZCBMUFBhc3NNYW5hZ2VyOjpkZWxldGVTaW1wbGVBbmFseXNpc1ZhbHVlKFZhbHVlICpWLCBMb29wICpMKSB7CisgIGlmIChCYXNpY0Jsb2NrICpCQiA9IGR5bl9jYXN0PEJhc2ljQmxvY2s+KFYpKSB7CisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBCSSA9IEJCLT5iZWdpbigpLCBCRSA9IEJCLT5lbmQoKTsgQkkgIT0gQkU7IAorICAgICAgICAgKytCSSkgeworICAgICAgSW5zdHJ1Y3Rpb24gJkkgPSAqQkk7CisgICAgICBkZWxldGVTaW1wbGVBbmFseXNpc1ZhbHVlKCZJLCBMKTsKKyAgICB9CisgIH0KKyAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpIHsgIAorICAgIExvb3BQYXNzICpMUCA9IChMb29wUGFzcyAqKWdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgIExQLT5kZWxldGVBbmFseXNpc1ZhbHVlKFYsIEwpOworICB9Cit9CisKKworLy8gUmVjdXJzZSB0aHJvdWdoIGFsbCBzdWJsb29wcyBhbmQgYWxsIGxvb3BzICBpbnRvIExRLgorc3RhdGljIHZvaWQgYWRkTG9vcEludG9RdWV1ZShMb29wICpMLCBzdGQ6OmRlcXVlPExvb3AgKj4gJkxRKSB7CisgIExRLnB1c2hfYmFjayhMKTsKKyAgZm9yIChMb29wOjppdGVyYXRvciBJID0gTC0+YmVnaW4oKSwgRSA9IEwtPmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBhZGRMb29wSW50b1F1ZXVlKCpJLCBMUSk7Cit9CisKKy8vLyBQYXNzIE1hbmFnZXIgaXRzZWxmIGRvZXMgbm90IGludmFsaWRhdGUgYW55IGFuYWx5c2lzIGluZm8uCit2b2lkIExQUGFzc01hbmFnZXI6OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmSW5mbykgY29uc3QgeworICAvLyBMUFBhc3NNYW5hZ2VyIG5lZWRzIExvb3BJbmZvLiBJbiB0aGUgbG9uZyB0ZXJtIExvb3BJbmZvIGNsYXNzIHdpbGwgCisgIC8vIGJlY29tZSBwYXJ0IG9mIExQUGFzc01hbmFnZXIuCisgIEluZm8uYWRkUmVxdWlyZWQ8TG9vcEluZm8+KCk7CisgIEluZm8uc2V0UHJlc2VydmVzQWxsKCk7Cit9CisKKy8vLyBydW4gLSBFeGVjdXRlIGFsbCBvZiB0aGUgcGFzc2VzIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uLiAgS2VlcCB0cmFjayBvZgorLy8vIHdoZXRoZXIgYW55IG9mIHRoZSBwYXNzZXMgbW9kaWZpZXMgdGhlIGZ1bmN0aW9uLCBhbmQgaWYgc28sIHJldHVybiB0cnVlLgorYm9vbCBMUFBhc3NNYW5hZ2VyOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgIExJID0gJmdldEFuYWx5c2lzPExvb3BJbmZvPigpOworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICAvLyBDb2xsZWN0IGluaGVyaXRlZCBhbmFseXNpcyBmcm9tIE1vZHVsZSBsZXZlbCBwYXNzIG1hbmFnZXIuCisgIHBvcHVsYXRlSW5oZXJpdGVkQW5hbHlzaXMoVFBNLT5hY3RpdmVTdGFjayk7CisKKyAgLy8gUG9wdWxhdGUgTG9vcCBRdWV1ZQorICBmb3IgKExvb3BJbmZvOjppdGVyYXRvciBJID0gTEktPmJlZ2luKCksIEUgPSBMSS0+ZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGFkZExvb3BJbnRvUXVldWUoKkksIExRKTsKKworICBpZiAoTFEuZW1wdHkoKSkgLy8gTm8gbG9vcHMsIHNraXAgY2FsbGluZyBmaW5hbGl6ZXJzCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEluaXRpYWxpemF0aW9uCisgIGZvciAoc3RkOjpkZXF1ZTxMb29wICo+Ojpjb25zdF9pdGVyYXRvciBJID0gTFEuYmVnaW4oKSwgRSA9IExRLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgTG9vcCAqTCA9ICpJOworICAgIGZvciAodW5zaWduZWQgSW5kZXggPSAwOyBJbmRleCA8IGdldE51bUNvbnRhaW5lZFBhc3NlcygpOyArK0luZGV4KSB7ICAKKyAgICAgIExvb3BQYXNzICpQID0gKExvb3BQYXNzKilnZXRDb250YWluZWRQYXNzKEluZGV4KTsKKyAgICAgIENoYW5nZWQgfD0gUC0+ZG9Jbml0aWFsaXphdGlvbihMLCAqdGhpcyk7CisgICAgfQorICB9CisKKyAgLy8gV2FsayBMb29wcworICB3aGlsZSAoIUxRLmVtcHR5KCkpIHsKKyAgICAgIAorICAgIEN1cnJlbnRMb29wICA9IExRLmJhY2soKTsKKyAgICBza2lwVGhpc0xvb3AgPSBmYWxzZTsKKyAgICByZWRvVGhpc0xvb3AgPSBmYWxzZTsKKworICAgIC8vIFJ1biBhbGwgcGFzc2VzIG9uIHRoZSBjdXJyZW50IExvb3AuCisgICAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpIHsgIAorICAgICAgTG9vcFBhc3MgKlAgPSAoTG9vcFBhc3MqKWdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworCisgICAgICBkdW1wUGFzc0luZm8oUCwgRVhFQ1VUSU9OX01TRywgT05fTE9PUF9NU0csCisgICAgICAgICAgICAgICAgICAgQ3VycmVudExvb3AtPmdldEhlYWRlcigpLT5nZXROYW1lKCkpOworICAgICAgZHVtcFJlcXVpcmVkU2V0KFApOworCisgICAgICBpbml0aWFsaXplQW5hbHlzaXNJbXBsKFApOworCisgICAgICB7CisgICAgICAgIFBhc3NNYW5hZ2VyUHJldHR5U3RhY2tFbnRyeSBYKFAsICpDdXJyZW50TG9vcC0+Z2V0SGVhZGVyKCkpOworICAgICAgICBUaW1lUmVnaW9uIFBhc3NUaW1lcihnZXRQYXNzVGltZXIoUCkpOworCisgICAgICAgIENoYW5nZWQgfD0gUC0+cnVuT25Mb29wKEN1cnJlbnRMb29wLCAqdGhpcyk7CisgICAgICB9CisKKyAgICAgIGlmIChDaGFuZ2VkKQorICAgICAgICBkdW1wUGFzc0luZm8oUCwgTU9ESUZJQ0FUSU9OX01TRywgT05fTE9PUF9NU0csCisgICAgICAgICAgICAgICAgICAgICBza2lwVGhpc0xvb3AgPyAiPGRlbGV0ZWQ+IiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50TG9vcC0+Z2V0SGVhZGVyKCktPmdldE5hbWUoKSk7CisgICAgICBkdW1wUHJlc2VydmVkU2V0KFApOworCisgICAgICBpZiAoIXNraXBUaGlzTG9vcCkgeworICAgICAgICAvLyBNYW51YWxseSBjaGVjayB0aGF0IHRoaXMgbG9vcCBpcyBzdGlsbCBoZWFsdGh5LiBUaGlzIGlzIGRvbmUKKyAgICAgICAgLy8gaW5zdGVhZCBvZiByZWx5aW5nIG9uIExvb3BJbmZvOjp2ZXJpZnlMb29wIHNpbmNlIExvb3BJbmZvCisgICAgICAgIC8vIGlzIGEgZnVuY3Rpb24gcGFzcyBhbmQgaXQncyByZWFsbHkgZXhwZW5zaXZlIHRvIHZlcmlmeSBldmVyeQorICAgICAgICAvLyBsb29wIGluIHRoZSBmdW5jdGlvbiBldmVyeSB0aW1lLiBUaGF0IGxldmVsIG9mIGNoZWNraW5nIGNhbiBiZQorICAgICAgICAvLyBlbmFibGVkIHdpdGggdGhlIC12ZXJpZnktbG9vcC1pbmZvIG9wdGlvbi4KKyAgICAgICAgeworICAgICAgICAgIFRpbWVSZWdpb24gUGFzc1RpbWVyKGdldFBhc3NUaW1lcihMSSkpOworICAgICAgICAgIEN1cnJlbnRMb29wLT52ZXJpZnlMb29wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVuIGNhbGwgdGhlIHJlZ3VsYXIgdmVyaWZ5QW5hbHlzaXMgZnVuY3Rpb25zLgorICAgICAgICB2ZXJpZnlQcmVzZXJ2ZWRBbmFseXNpcyhQKTsKKyAgICAgIH0KKworICAgICAgcmVtb3ZlTm90UHJlc2VydmVkQW5hbHlzaXMoUCk7CisgICAgICByZWNvcmRBdmFpbGFibGVBbmFseXNpcyhQKTsKKyAgICAgIHJlbW92ZURlYWRQYXNzZXMoUCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2tpcFRoaXNMb29wID8gIjxkZWxldGVkPiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50TG9vcC0+Z2V0SGVhZGVyKCktPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgT05fTE9PUF9NU0cpOworCisgICAgICBpZiAoc2tpcFRoaXNMb29wKQorICAgICAgICAvLyBEbyBub3QgcnVuIG90aGVyIHBhc3NlcyBvbiB0aGlzIGxvb3AuCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGUgbG9vcCB3YXMgZGVsZXRlZCwgcmVsZWFzZSBhbGwgdGhlIGxvb3AgcGFzc2VzLiBUaGlzIGZyZWVzIHVwCisgICAgLy8gc29tZSBtZW1vcnksIGFuZCBhdm9pZHMgdHJvdWJsZSB3aXRoIHRoZSBwYXNzIG1hbmFnZXIgdHJ5aW5nIHRvIGNhbGwKKyAgICAvLyB2ZXJpZnlBbmFseXNpcyBvbiB0aGVtLgorICAgIGlmIChza2lwVGhpc0xvb3ApCisgICAgICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRQYXNzZXMoKTsgKytJbmRleCkgeyAgCisgICAgICAgIFBhc3MgKlAgPSBnZXRDb250YWluZWRQYXNzKEluZGV4KTsKKyAgICAgICAgZnJlZVBhc3MoUCwgIjxkZWxldGVkPiIsIE9OX0xPT1BfTVNHKTsKKyAgICAgIH0KKworICAgIC8vIFBvcCB0aGUgbG9vcCBmcm9tIHF1ZXVlIGFmdGVyIHJ1bm5pbmcgYWxsIHBhc3Nlcy4KKyAgICBMUS5wb3BfYmFjaygpOworICAgIAorICAgIGlmIChyZWRvVGhpc0xvb3ApCisgICAgICBMUS5wdXNoX2JhY2soQ3VycmVudExvb3ApOworICB9CisgIAorICAvLyBGaW5hbGl6YXRpb24KKyAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpIHsKKyAgICBMb29wUGFzcyAqUCA9IChMb29wUGFzcyAqKWdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgIENoYW5nZWQgfD0gUC0+ZG9GaW5hbGl6YXRpb24oKTsKKyAgfQorCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gUHJpbnQgcGFzc2VzIG1hbmFnZWQgYnkgdGhpcyBtYW5hZ2VyCit2b2lkIExQUGFzc01hbmFnZXI6OmR1bXBQYXNzU3RydWN0dXJlKHVuc2lnbmVkIE9mZnNldCkgeworICBlcnJzKCkuaW5kZW50KE9mZnNldCoyKSA8PCAiTG9vcCBQYXNzIE1hbmFnZXJcbiI7CisgIGZvciAodW5zaWduZWQgSW5kZXggPSAwOyBJbmRleCA8IGdldE51bUNvbnRhaW5lZFBhc3NlcygpOyArK0luZGV4KSB7CisgICAgUGFzcyAqUCA9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgIFAtPmR1bXBQYXNzU3RydWN0dXJlKE9mZnNldCArIDEpOworICAgIGR1bXBMYXN0VXNlcyhQLCBPZmZzZXQrMSk7CisgIH0KK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTG9vcFBhc3MKKworUGFzcyAqTG9vcFBhc3M6OmNyZWF0ZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBQcmludExvb3BQYXNzKEJhbm5lciwgTyk7Cit9CisKKy8vIENoZWNrIGlmIHRoaXMgcGFzcyBpcyBzdWl0YWJsZSBmb3IgdGhlIGN1cnJlbnQgTFBQYXNzTWFuYWdlciwgaWYKKy8vIGF2YWlsYWJsZS4gVGhpcyBwYXNzIFAgaXMgbm90IHN1aXRhYmxlIGZvciBhIExQUGFzc01hbmFnZXIgaWYgUAorLy8gaXMgbm90IHByZXNlcnZpbmcgaGlnaGVyIGxldmVsIGFuYWx5c2lzIGluZm8gdXNlZCBieSBvdGhlcgorLy8gTFBQYXNzTWFuYWdlciBwYXNzZXMuIEluIHN1Y2ggY2FzZSwgcG9wIExQUGFzc01hbmFnZXIgZnJvbSB0aGUKKy8vIHN0YWNrLiBUaGlzIHdpbGwgZm9yY2UgYXNzaWduUGFzc01hbmFnZXIoKSB0byBjcmVhdGUgbmV3CisvLyBMUFBhc3NNYW5nZXIgYXMgZXhwZWN0ZWQuCit2b2lkIExvb3BQYXNzOjpwcmVwYXJlUGFzc01hbmFnZXIoUE1TdGFjayAmUE1TKSB7CisKKyAgLy8gRmluZCBMUFBhc3NNYW5hZ2VyIAorICB3aGlsZSAoIVBNUy5lbXB0eSgpICYmCisgICAgICAgICBQTVMudG9wKCktPmdldFBhc3NNYW5hZ2VyVHlwZSgpID4gUE1UX0xvb3BQYXNzTWFuYWdlcikKKyAgICBQTVMucG9wKCk7CisKKyAgLy8gSWYgdGhpcyBwYXNzIGlzIGRlc3Ryb3lpbmcgaGlnaCBsZXZlbCBpbmZvcm1hdGlvbiB0aGF0IGlzIHVzZWQKKyAgLy8gYnkgb3RoZXIgcGFzc2VzIHRoYXQgYXJlIG1hbmFnZWQgYnkgTFBNIHRoZW4gZG8gbm90IGluc2VydAorICAvLyB0aGlzIHBhc3MgaW4gY3VycmVudCBMUE0uIFVzZSBuZXcgTFBQYXNzTWFuYWdlci4KKyAgaWYgKFBNUy50b3AoKS0+Z2V0UGFzc01hbmFnZXJUeXBlKCkgPT0gUE1UX0xvb3BQYXNzTWFuYWdlciAmJgorICAgICAgIVBNUy50b3AoKS0+cHJlc2VydmVIaWdoZXJMZXZlbEFuYWx5c2lzKHRoaXMpKSAKKyAgICBQTVMucG9wKCk7Cit9CisKKy8vLyBBc3NpZ24gcGFzcyBtYW5hZ2VyIHRvIG1hbmFnZSB0aGlzIHBhc3MuCit2b2lkIExvb3BQYXNzOjphc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTWFuYWdlclR5cGUgUHJlZmVycmVkVHlwZSkgeworICAvLyBGaW5kIExQUGFzc01hbmFnZXIgCisgIHdoaWxlICghUE1TLmVtcHR5KCkgJiYKKyAgICAgICAgIFBNUy50b3AoKS0+Z2V0UGFzc01hbmFnZXJUeXBlKCkgPiBQTVRfTG9vcFBhc3NNYW5hZ2VyKQorICAgIFBNUy5wb3AoKTsKKworICBMUFBhc3NNYW5hZ2VyICpMUFBNOworICBpZiAoUE1TLnRvcCgpLT5nZXRQYXNzTWFuYWdlclR5cGUoKSA9PSBQTVRfTG9vcFBhc3NNYW5hZ2VyKQorICAgIExQUE0gPSAoTFBQYXNzTWFuYWdlciopUE1TLnRvcCgpOworICBlbHNlIHsKKyAgICAvLyBDcmVhdGUgbmV3IExvb3AgUGFzcyBNYW5hZ2VyIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAKKyAgICBhc3NlcnQgKCFQTVMuZW1wdHkoKSAmJiAiVW5hYmxlIHRvIGNyZWF0ZSBMb29wIFBhc3MgTWFuYWdlciIpOworICAgIFBNRGF0YU1hbmFnZXIgKlBNRCA9IFBNUy50b3AoKTsKKworICAgIC8vIFsxXSBDcmVhdGUgbmV3IENhbGwgR3JhcGggUGFzcyBNYW5hZ2VyCisgICAgTFBQTSA9IG5ldyBMUFBhc3NNYW5hZ2VyKFBNRC0+Z2V0RGVwdGgoKSArIDEpOworICAgIExQUE0tPnBvcHVsYXRlSW5oZXJpdGVkQW5hbHlzaXMoUE1TKTsKKworICAgIC8vIFsyXSBTZXQgdXAgbmV3IG1hbmFnZXIncyB0b3AgbGV2ZWwgbWFuYWdlcgorICAgIFBNVG9wTGV2ZWxNYW5hZ2VyICpUUE0gPSBQTUQtPmdldFRvcExldmVsTWFuYWdlcigpOworICAgIFRQTS0+YWRkSW5kaXJlY3RQYXNzTWFuYWdlcihMUFBNKTsKKworICAgIC8vIFszXSBBc3NpZ24gbWFuYWdlciB0byBtYW5hZ2UgdGhpcyBuZXcgbWFuYWdlci4gVGhpcyBtYXkgY3JlYXRlCisgICAgLy8gYW5kIHB1c2ggbmV3IG1hbmFnZXJzIGludG8gUE1TCisgICAgUGFzcyAqUCA9IExQUE0tPmdldEFzUGFzcygpOworICAgIFRQTS0+c2NoZWR1bGVQYXNzKFApOworCisgICAgLy8gWzRdIFB1c2ggbmV3IG1hbmFnZXIgaW50byBQTVMKKyAgICBQTVMucHVzaChMUFBNKTsKKyAgfQorCisgIExQUE0tPmFkZCh0aGlzKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY2ZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMjPT09LSBsaWIvQW5hbHlzaXMvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUFuYWx5c2lzCitESVJTID0gSVBBCitCVUlMRF9BUkNISVZFID0gMQorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmNwcCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9NZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDZmODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmNwcApAQCAtMCwwICsxLDEyMjYgQEAKKy8vPT09LSBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMuY3BwIC0gTWVtIERlcHMgSW1wbGVtZW50YXRpb24gIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYW4gYW5hbHlzaXMgdGhhdCBkZXRlcm1pbmVzLCBmb3IgYSBnaXZlbiBtZW1vcnkKKy8vIG9wZXJhdGlvbiwgd2hhdCBwcmVjZWRpbmcgbWVtb3J5IG9wZXJhdGlvbnMgaXQgZGVwZW5kcyBvbi4gIEl0IGJ1aWxkcyBvbiAKKy8vIGFsaWFzIGFuYWx5c2lzIGluZm9ybWF0aW9uLCBhbmQgdHJpZXMgdG8gcHJvdmlkZSBhIGxhenksIGNhY2hpbmcgaW50ZXJmYWNlIHRvCisvLyBhIGNvbW1vbiBraW5kIG9mIGFsaWFzIGluZm9ybWF0aW9uIHF1ZXJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibWVtZGVwIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9QSElUcmFuc0FkZHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJlZEl0ZXJhdG9yQ2FjaGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtQ2FjaGVOb25Mb2NhbCwgIk51bWJlciBvZiBmdWxseSBjYWNoZWQgbm9uLWxvY2FsIHJlc3BvbnNlcyIpOworU1RBVElTVElDKE51bUNhY2hlRGlydHlOb25Mb2NhbCwgIk51bWJlciBvZiBkaXJ0eSBjYWNoZWQgbm9uLWxvY2FsIHJlc3BvbnNlcyIpOworU1RBVElTVElDKE51bVVuY2FjaGVOb25Mb2NhbCwgIk51bWJlciBvZiB1bmNhY2hlZCBub24tbG9jYWwgcmVzcG9uc2VzIik7CisKK1NUQVRJU1RJQyhOdW1DYWNoZU5vbkxvY2FsUHRyLAorICAgICAgICAgICJOdW1iZXIgb2YgZnVsbHkgY2FjaGVkIG5vbi1sb2NhbCBwdHIgcmVzcG9uc2VzIik7CitTVEFUSVNUSUMoTnVtQ2FjaGVEaXJ0eU5vbkxvY2FsUHRyLAorICAgICAgICAgICJOdW1iZXIgb2YgY2FjaGVkLCBidXQgZGlydHksIG5vbi1sb2NhbCBwdHIgcmVzcG9uc2VzIik7CitTVEFUSVNUSUMoTnVtVW5jYWNoZU5vbkxvY2FsUHRyLAorICAgICAgICAgICJOdW1iZXIgb2YgdW5jYWNoZWQgbm9uLWxvY2FsIHB0ciByZXNwb25zZXMiKTsKK1NUQVRJU1RJQyhOdW1DYWNoZUNvbXBsZXRlTm9uTG9jYWxQdHIsCisgICAgICAgICAgIk51bWJlciBvZiBibG9jayBxdWVyaWVzIHRoYXQgd2VyZSBjb21wbGV0ZWx5IGNhY2hlZCIpOworCitjaGFyIE1lbW9yeURlcGVuZGVuY2VBbmFseXNpczo6SUQgPSAwOworICAKKy8vIFJlZ2lzdGVyIHRoaXMgcGFzcy4uLgorSU5JVElBTElaRV9QQVNTKE1lbW9yeURlcGVuZGVuY2VBbmFseXNpcywgIm1lbWRlcCIsCisgICAgICAgICAgICAgICAgIk1lbW9yeSBEZXBlbmRlbmNlIEFuYWx5c2lzIiwgZmFsc2UsIHRydWUpOworCitNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6Ok1lbW9yeURlcGVuZGVuY2VBbmFseXNpcygpCis6IEZ1bmN0aW9uUGFzcyhJRCksIFByZWRDYWNoZSgwKSB7Cit9CitNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6On5NZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMoKSB7Cit9CisKKy8vLyBDbGVhbiB1cCBtZW1vcnkgaW4gYmV0d2VlbiBydW5zCit2b2lkIE1lbW9yeURlcGVuZGVuY2VBbmFseXNpczo6cmVsZWFzZU1lbW9yeSgpIHsKKyAgTG9jYWxEZXBzLmNsZWFyKCk7CisgIE5vbkxvY2FsRGVwcy5jbGVhcigpOworICBOb25Mb2NhbFBvaW50ZXJEZXBzLmNsZWFyKCk7CisgIFJldmVyc2VMb2NhbERlcHMuY2xlYXIoKTsKKyAgUmV2ZXJzZU5vbkxvY2FsRGVwcy5jbGVhcigpOworICBSZXZlcnNlTm9uTG9jYWxQdHJEZXBzLmNsZWFyKCk7CisgIFByZWRDYWNoZS0+Y2xlYXIoKTsKK30KKworCisKKy8vLyBnZXRBbmFseXNpc1VzYWdlIC0gRG9lcyBub3QgbW9kaWZ5IGFueXRoaW5nLiAgSXQgdXNlcyBBbGlhcyBBbmFseXNpcy4KKy8vLwordm9pZCBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIEFVLmFkZFJlcXVpcmVkVHJhbnNpdGl2ZTxBbGlhc0FuYWx5c2lzPigpOworfQorCitib29sIE1lbW9yeURlcGVuZGVuY2VBbmFseXNpczo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiAmKSB7CisgIEFBID0gJmdldEFuYWx5c2lzPEFsaWFzQW5hbHlzaXM+KCk7CisgIGlmIChQcmVkQ2FjaGUgPT0gMCkKKyAgICBQcmVkQ2FjaGUucmVzZXQobmV3IFByZWRJdGVyYXRvckNhY2hlKCkpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBSZW1vdmVGcm9tUmV2ZXJzZU1hcCAtIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZW1vdmVzIFZhbCBmcm9tCisvLy8gJ0luc3QncyBzZXQgaW4gUmV2ZXJzZU1hcC4gIElmIHRoZSBzZXQgYmVjb21lcyBlbXB0eSwgcmVtb3ZlIEluc3QncyBlbnRyeS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlUeT4KK3N0YXRpYyB2b2lkIFJlbW92ZUZyb21SZXZlcnNlTWFwKERlbnNlTWFwPEluc3RydWN0aW9uKiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxLZXlUeSwgND4gPiAmUmV2ZXJzZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnN0LCBLZXlUeSBWYWwpIHsKKyAgdHlwZW5hbWUgRGVuc2VNYXA8SW5zdHJ1Y3Rpb24qLCBTbWFsbFB0clNldDxLZXlUeSwgND4gPjo6aXRlcmF0b3IKKyAgSW5zdEl0ID0gUmV2ZXJzZU1hcC5maW5kKEluc3QpOworICBhc3NlcnQoSW5zdEl0ICE9IFJldmVyc2VNYXAuZW5kKCkgJiYgIlJldmVyc2UgbWFwIG91dCBvZiBzeW5jPyIpOworICBib29sIEZvdW5kID0gSW5zdEl0LT5zZWNvbmQuZXJhc2UoVmFsKTsKKyAgYXNzZXJ0KEZvdW5kICYmICJJbnZhbGlkIHJldmVyc2UgbWFwISIpOyBGb3VuZD1Gb3VuZDsKKyAgaWYgKEluc3RJdC0+c2Vjb25kLmVtcHR5KCkpCisgICAgUmV2ZXJzZU1hcC5lcmFzZShJbnN0SXQpOworfQorCisKKy8vLyBnZXRDYWxsU2l0ZURlcGVuZGVuY3lGcm9tIC0gUHJpdmF0ZSBoZWxwZXIgZm9yIGZpbmRpbmcgdGhlIGxvY2FsCisvLy8gZGVwZW5kZW5jaWVzIG9mIGEgY2FsbCBzaXRlLgorTWVtRGVwUmVzdWx0IE1lbW9yeURlcGVuZGVuY2VBbmFseXNpczo6CitnZXRDYWxsU2l0ZURlcGVuZGVuY3lGcm9tKENhbGxTaXRlIENTLCBib29sIGlzUmVhZE9ubHlDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTY2FuSXQsIEJhc2ljQmxvY2sgKkJCKSB7CisgIC8vIFdhbGsgYmFja3dhcmRzIHRocm91Z2ggdGhlIGJsb2NrLCBsb29raW5nIGZvciBkZXBlbmRlbmNpZXMKKyAgd2hpbGUgKFNjYW5JdCAhPSBCQi0+YmVnaW4oKSkgeworICAgIEluc3RydWN0aW9uICpJbnN0ID0gLS1TY2FuSXQ7CisgICAgCisgICAgLy8gSWYgdGhpcyBpbnN0IGlzIGEgbWVtb3J5IG9wLCBnZXQgdGhlIHBvaW50ZXIgaXQgYWNjZXNzZWQKKyAgICBWYWx1ZSAqUG9pbnRlciA9IDA7CisgICAgdWludDY0X3QgUG9pbnRlclNpemUgPSAwOworICAgIGlmIChTdG9yZUluc3QgKlMgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEluc3QpKSB7CisgICAgICBQb2ludGVyID0gUy0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgICAgIFBvaW50ZXJTaXplID0gQUEtPmdldFR5cGVTdG9yZVNpemUoUy0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKTsKKyAgICB9IGVsc2UgaWYgKENhbGxTaXRlIEluc3RDUyA9IGNhc3Q8VmFsdWU+KEluc3QpKSB7CisgICAgICAvLyBEZWJ1ZyBpbnRyaW5zaWNzIGRvbid0IGNhdXNlIGRlcGVuZGVuY2VzLgorICAgICAgaWYgKElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJbnN0KSkgY29udGludWU7CisgICAgICAvLyBJZiB0aGVzZSB0d28gY2FsbHMgZG8gbm90IGludGVyZmVyZSwgbG9vayBwYXN0IGl0LgorICAgICAgc3dpdGNoIChBQS0+Z2V0TW9kUmVmSW5mbyhDUywgSW5zdENTKSkgeworICAgICAgY2FzZSBBbGlhc0FuYWx5c2lzOjpOb01vZFJlZjoKKyAgICAgICAgLy8gSWYgdGhlIHR3byBjYWxscyBhcmUgdGhlIHNhbWUsIHJldHVybiBJbnN0Q1MgYXMgYSBEZWYsIHNvIHRoYXQKKyAgICAgICAgLy8gQ1MgY2FuIGJlIGZvdW5kIHJlZHVuZGFudCBhbmQgZWxpbWluYXRlZC4KKyAgICAgICAgaWYgKGlzUmVhZE9ubHlDYWxsICYmIEluc3RDUy5vbmx5UmVhZHNNZW1vcnkoKSAmJgorICAgICAgICAgICAgQ1MuZ2V0SW5zdHJ1Y3Rpb24oKS0+aXNJZGVudGljYWxUb1doZW5EZWZpbmVkKEluc3QpKQorICAgICAgICAgIHJldHVybiBNZW1EZXBSZXN1bHQ6OmdldERlZihJbnN0KTsKKworICAgICAgICAvLyBPdGhlcndpc2UgaWYgdGhlIHR3byBjYWxscyBkb24ndCBpbnRlcmFjdCAoZS5nLiBJbnN0Q1MgaXMgcmVhZG5vbmUpCisgICAgICAgIC8vIGtlZXAgc2Nhbm5pbmcuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1lbURlcFJlc3VsdDo6Z2V0Q2xvYmJlcihJbnN0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gTm9uLW1lbW9yeSBpbnN0cnVjdGlvbi4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBpZiAoQUEtPmdldE1vZFJlZkluZm8oQ1MsIFBvaW50ZXIsIFBvaW50ZXJTaXplKSAhPSBBbGlhc0FuYWx5c2lzOjpOb01vZFJlZikKKyAgICAgIHJldHVybiBNZW1EZXBSZXN1bHQ6OmdldENsb2JiZXIoSW5zdCk7CisgIH0KKyAgCisgIC8vIE5vIGRlcGVuZGVuY2UgZm91bmQuICBJZiB0aGlzIGlzIHRoZSBlbnRyeSBibG9jayBvZiB0aGUgZnVuY3Rpb24sIGl0IGlzIGEKKyAgLy8gY2xvYmJlciwgb3RoZXJ3aXNlIGl0IGlzIG5vbi1sb2NhbC4KKyAgaWYgKEJCICE9ICZCQi0+Z2V0UGFyZW50KCktPmdldEVudHJ5QmxvY2soKSkKKyAgICByZXR1cm4gTWVtRGVwUmVzdWx0OjpnZXROb25Mb2NhbCgpOworICByZXR1cm4gTWVtRGVwUmVzdWx0OjpnZXRDbG9iYmVyKFNjYW5JdCk7Cit9CisKKy8vLyBnZXRQb2ludGVyRGVwZW5kZW5jeUZyb20gLSBSZXR1cm4gdGhlIGluc3RydWN0aW9uIG9uIHdoaWNoIGEgbWVtb3J5CisvLy8gbG9jYXRpb24gZGVwZW5kcy4gIElmIGlzTG9hZCBpcyB0cnVlLCB0aGlzIHJvdXRpbmUgaWdub3JlIG1heS1hbGlhc2VzIHdpdGgKKy8vLyByZWFkLW9ubHkgb3BlcmF0aW9ucy4KK01lbURlcFJlc3VsdCBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6OgorZ2V0UG9pbnRlckRlcGVuZGVuY3lGcm9tKFZhbHVlICpNZW1QdHIsIHVpbnQ2NF90IE1lbVNpemUsIGJvb2wgaXNMb2FkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTY2FuSXQsIEJhc2ljQmxvY2sgKkJCKSB7CisKKyAgVmFsdWUgKkludmFyaWFudFRhZyA9IDA7CisKKyAgLy8gV2FsayBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgYmFzaWMgYmxvY2ssIGxvb2tpbmcgZm9yIGRlcGVuZGVuY2llcy4KKyAgd2hpbGUgKFNjYW5JdCAhPSBCQi0+YmVnaW4oKSkgeworICAgIEluc3RydWN0aW9uICpJbnN0ID0gLS1TY2FuSXQ7CisKKyAgICAvLyBJZiB3ZSdyZSBpbiBhbiBpbnZhcmlhbnQgcmVnaW9uLCBubyBkZXBlbmRlbmNpZXMgY2FuIGJlIGZvdW5kIGJlZm9yZQorICAgIC8vIHdlIHBhc3MgYW4gaW52YXJpYW50LWJlZ2luIG1hcmtlci4KKyAgICBpZiAoSW52YXJpYW50VGFnID09IEluc3QpIHsKKyAgICAgIEludmFyaWFudFRhZyA9IDA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgaWYgKEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oSW5zdCkpIHsKKyAgICAgIC8vIERlYnVnIGludHJpbnNpY3MgZG9uJ3QgY2F1c2UgZGVwZW5kZW5jZXMuCisgICAgICBpZiAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEluc3QpKSBjb250aW51ZTsKKyAgICAgIAorICAgICAgLy8gSWYgd2UgcGFzcyBhbiBpbnZhcmlhbnQtZW5kIG1hcmtlciwgdGhlbiB3ZSd2ZSBqdXN0IGVudGVyZWQgYW4KKyAgICAgIC8vIGludmFyaWFudCByZWdpb24gYW5kIGNhbiBzdGFydCBpZ25vcmluZyBkZXBlbmRlbmNpZXMuCisgICAgICBpZiAoSUktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjppbnZhcmlhbnRfZW5kKSB7CisgICAgICAgIC8vIEZJWE1FOiBUaGlzIG9ubHkgY29uc2lkZXJzIHF1ZXJpZXMgZGlyZWN0bHkgb24gdGhlIGludmFyaWFudC10YWdnZWQKKyAgICAgICAgLy8gcG9pbnRlciwgbm90IG9uIHF1ZXJ5IHBvaW50ZXJzIHRoYXQgYXJlIGluZGV4ZWQgb2ZmIG9mIHRoZW0uICBJdCdkCisgICAgICAgIC8vIGJlIG5pY2UgdG8gaGFuZGxlIHRoYXQgYXQgc29tZSBwb2ludC4KKyAgICAgICAgQWxpYXNBbmFseXNpczo6QWxpYXNSZXN1bHQgUiA9IEFBLT5hbGlhcyhJSS0+Z2V0QXJnT3BlcmFuZCgyKSwgTWVtUHRyKTsKKyAgICAgICAgaWYgKFIgPT0gQWxpYXNBbmFseXNpczo6TXVzdEFsaWFzKSB7CisgICAgICAgICAgSW52YXJpYW50VGFnID0gSUktPmdldEFyZ09wZXJhbmQoMCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLy8gSWYgd2UgcmVhY2ggYSBsaWZldGltZSBiZWdpbiBvciBlbmQgbWFya2VyLCB0aGVuIHRoZSBxdWVyeSBlbmRzIGhlcmUKKyAgICAgIC8vIGJlY2F1c2UgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZC4KKyAgICAgIH0gZWxzZSBpZiAoSUktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpsaWZldGltZV9zdGFydCkgeworICAgICAgICAvLyBGSVhNRTogVGhpcyBvbmx5IGNvbnNpZGVycyBxdWVyaWVzIGRpcmVjdGx5IG9uIHRoZSBpbnZhcmlhbnQtdGFnZ2VkCisgICAgICAgIC8vIHBvaW50ZXIsIG5vdCBvbiBxdWVyeSBwb2ludGVycyB0aGF0IGFyZSBpbmRleGVkIG9mZiBvZiB0aGVtLiAgSXQnZAorICAgICAgICAvLyBiZSBuaWNlIHRvIGhhbmRsZSB0aGF0IGF0IHNvbWUgcG9pbnQuCisgICAgICAgIEFsaWFzQW5hbHlzaXM6OkFsaWFzUmVzdWx0IFIgPSBBQS0+YWxpYXMoSUktPmdldEFyZ09wZXJhbmQoMSksIE1lbVB0cik7CisgICAgICAgIGlmIChSID09IEFsaWFzQW5hbHlzaXM6Ok11c3RBbGlhcykKKyAgICAgICAgICByZXR1cm4gTWVtRGVwUmVzdWx0OjpnZXREZWYoSUkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHdlJ3JlIHF1ZXJ5aW5nIG9uIGEgbG9hZCBhbmQgd2UncmUgaW4gYW4gaW52YXJpYW50IHJlZ2lvbiwgd2UncmUgZG9uZQorICAgIC8vIGF0IHRoaXMgcG9pbnQuIE5vdGhpbmcgYSBsb2FkIGRlcGVuZHMgb24gY2FuIGxpdmUgaW4gYW4gaW52YXJpYW50IHJlZ2lvbi4KKyAgICBpZiAoaXNMb2FkICYmIEludmFyaWFudFRhZykgY29udGludWU7CisKKyAgICAvLyBWYWx1ZXMgZGVwZW5kIG9uIGxvYWRzIGlmIHRoZSBwb2ludGVycyBhcmUgbXVzdCBhbGlhc2VkLiAgVGhpcyBtZWFucyB0aGF0CisgICAgLy8gYSBsb2FkIGRlcGVuZHMgb24gYW5vdGhlciBtdXN0IGFsaWFzZWQgbG9hZCBmcm9tIHRoZSBzYW1lIHZhbHVlLgorICAgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSW5zdCkpIHsKKyAgICAgIFZhbHVlICpQb2ludGVyID0gTEktPmdldFBvaW50ZXJPcGVyYW5kKCk7CisgICAgICB1aW50NjRfdCBQb2ludGVyU2l6ZSA9IEFBLT5nZXRUeXBlU3RvcmVTaXplKExJLT5nZXRUeXBlKCkpOworICAgICAgCisgICAgICAvLyBJZiB3ZSBmb3VuZCBhIHBvaW50ZXIsIGNoZWNrIGlmIGl0IGNvdWxkIGJlIHRoZSBzYW1lIGFzIG91ciBwb2ludGVyLgorICAgICAgQWxpYXNBbmFseXNpczo6QWxpYXNSZXN1bHQgUiA9CisgICAgICAgIEFBLT5hbGlhcyhQb2ludGVyLCBQb2ludGVyU2l6ZSwgTWVtUHRyLCBNZW1TaXplKTsKKyAgICAgIGlmIChSID09IEFsaWFzQW5hbHlzaXM6Ok5vQWxpYXMpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBNYXktYWxpYXMgbG9hZHMgZG9uJ3QgZGVwZW5kIG9uIGVhY2ggb3RoZXIgd2l0aG91dCBhIGRlcGVuZGVuY2UuCisgICAgICBpZiAoaXNMb2FkICYmIFIgPT0gQWxpYXNBbmFseXNpczo6TWF5QWxpYXMpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gU3RvcmVzIGRlcGVuZCBvbiBtYXkgYW5kIG11c3QgYWxpYXNlZCBsb2FkcywgbG9hZHMgZGVwZW5kIG9uIG11c3QtYWxpYXMKKyAgICAgIC8vIGxvYWRzLgorICAgICAgcmV0dXJuIE1lbURlcFJlc3VsdDo6Z2V0RGVmKEluc3QpOworICAgIH0KKyAgICAKKyAgICBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oSW5zdCkpIHsKKyAgICAgIC8vIFRoZXJlIGNhbid0IGJlIHN0b3JlcyB0byB0aGUgdmFsdWUgd2UgY2FyZSBhYm91dCBpbnNpZGUgYW4gCisgICAgICAvLyBpbnZhcmlhbnQgcmVnaW9uLgorICAgICAgaWYgKEludmFyaWFudFRhZykgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIElmIGFsaWFzIGFuYWx5c2lzIGNhbiB0ZWxsIHRoYXQgdGhpcyBzdG9yZSBpcyBndWFyYW50ZWVkIHRvIG5vdCBtb2RpZnkKKyAgICAgIC8vIHRoZSBxdWVyeSBwb2ludGVyLCBpZ25vcmUgaXQuICBVc2UgZ2V0TW9kUmVmSW5mbyB0byBoYW5kbGUgY2FzZXMgd2hlcmUKKyAgICAgIC8vIHRoZSBxdWVyeSBwb2ludGVyIHBvaW50cyB0byBjb25zdGFudCBtZW1vcnkgZXRjLgorICAgICAgaWYgKEFBLT5nZXRNb2RSZWZJbmZvKFNJLCBNZW1QdHIsIE1lbVNpemUpID09IEFsaWFzQW5hbHlzaXM6Ok5vTW9kUmVmKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gT2ssIHRoaXMgc3RvcmUgbWlnaHQgY2xvYmJlciB0aGUgcXVlcnkgcG9pbnRlci4gIENoZWNrIHRvIHNlZSBpZiBpdCBpcworICAgICAgLy8gYSBtdXN0IGFsaWFzOiBpbiB0aGlzIGNhc2UsIHdlIHdhbnQgdG8gcmV0dXJuIHRoaXMgYXMgYSBkZWYuCisgICAgICBWYWx1ZSAqUG9pbnRlciA9IFNJLT5nZXRQb2ludGVyT3BlcmFuZCgpOworICAgICAgdWludDY0X3QgUG9pbnRlclNpemUgPSBBQS0+Z2V0VHlwZVN0b3JlU2l6ZShTSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKTsKKyAgICAgIAorICAgICAgLy8gSWYgd2UgZm91bmQgYSBwb2ludGVyLCBjaGVjayBpZiBpdCBjb3VsZCBiZSB0aGUgc2FtZSBhcyBvdXIgcG9pbnRlci4KKyAgICAgIEFsaWFzQW5hbHlzaXM6OkFsaWFzUmVzdWx0IFIgPQorICAgICAgICBBQS0+YWxpYXMoUG9pbnRlciwgUG9pbnRlclNpemUsIE1lbVB0ciwgTWVtU2l6ZSk7CisgICAgICAKKyAgICAgIGlmIChSID09IEFsaWFzQW5hbHlzaXM6Ok5vQWxpYXMpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKFIgPT0gQWxpYXNBbmFseXNpczo6TWF5QWxpYXMpCisgICAgICAgIHJldHVybiBNZW1EZXBSZXN1bHQ6OmdldENsb2JiZXIoSW5zdCk7CisgICAgICByZXR1cm4gTWVtRGVwUmVzdWx0OjpnZXREZWYoSW5zdCk7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBpcyBhbiBhbGxvY2F0aW9uLCBhbmQgaWYgd2Uga25vdyB0aGF0IHRoZSBhY2Nlc3NlZCBwb2ludGVyIGlzIHRvCisgICAgLy8gdGhlIGFsbG9jYXRpb24sIHJldHVybiBEZWYuICBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gZGVwZW5kZW5jZSBhbmQKKyAgICAvLyB0aGUgYWNjZXNzIGNhbiBiZSBvcHRpbWl6ZWQgYmFzZWQgb24gdGhhdC4gIEZvciBleGFtcGxlLCBhIGxvYWQgY291bGQKKyAgICAvLyB0dXJuIGludG8gdW5kZWYuCisgICAgLy8gTm90ZTogT25seSBkZXRlcm1pbmUgdGhpcyB0byBiZSBhIG1hbGxvYyBpZiBJbnN0IGlzIHRoZSBtYWxsb2MgY2FsbCwgbm90CisgICAgLy8gYSBzdWJzZXF1ZW50IGJpdGNhc3Qgb2YgdGhlIG1hbGxvYyBjYWxsIHJlc3VsdC4gIFRoZXJlIGNhbiBiZSBzdG9yZXMgdG8KKyAgICAvLyB0aGUgbWFsbG9jZWQgbWVtb3J5IGJldHdlZW4gdGhlIG1hbGxvYyBjYWxsIGFuZCBpdHMgYml0Y2FzdCB1c2VzLCBhbmQgd2UKKyAgICAvLyBuZWVkIHRvIGNvbnRpbnVlIHNjYW5uaW5nIHVudGlsIHRoZSBtYWxsb2MgY2FsbC4KKyAgICBpZiAoaXNhPEFsbG9jYUluc3Q+KEluc3QpKSB7CisgICAgICBWYWx1ZSAqQWNjZXNzUHRyID0gTWVtUHRyLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCk7CisgICAgICAKKyAgICAgIGlmIChBY2Nlc3NQdHIgPT0gSW5zdCB8fAorICAgICAgICAgIEFBLT5hbGlhcyhJbnN0LCAxLCBBY2Nlc3NQdHIsIDEpID09IEFsaWFzQW5hbHlzaXM6Ok11c3RBbGlhcykKKyAgICAgICAgcmV0dXJuIE1lbURlcFJlc3VsdDo6Z2V0RGVmKEluc3QpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gU2VlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gKGUuZy4gYSBjYWxsIG9yIHZhYXJnKSBtb2QvcmVmJ3MgdGhlIHBvaW50ZXIuCisgICAgc3dpdGNoIChBQS0+Z2V0TW9kUmVmSW5mbyhJbnN0LCBNZW1QdHIsIE1lbVNpemUpKSB7CisgICAgY2FzZSBBbGlhc0FuYWx5c2lzOjpOb01vZFJlZjoKKyAgICAgIC8vIElmIHRoZSBjYWxsIGhhcyBubyBlZmZlY3Qgb24gdGhlIHF1ZXJpZWQgcG9pbnRlciwganVzdCBpZ25vcmUgaXQuCisgICAgICBjb250aW51ZTsKKyAgICBjYXNlIEFsaWFzQW5hbHlzaXM6Ok1vZDoKKyAgICAgIC8vIElmIHdlJ3JlIGluIGFuIGludmFyaWFudCByZWdpb24sIHdlIGNhbiBpZ25vcmUgY2FsbHMgdGhhdCBPTkxZCisgICAgICAvLyBtb2RpZnkgdGhlIHBvaW50ZXIuCisgICAgICBpZiAoSW52YXJpYW50VGFnKSBjb250aW51ZTsKKyAgICAgIHJldHVybiBNZW1EZXBSZXN1bHQ6OmdldENsb2JiZXIoSW5zdCk7CisgICAgY2FzZSBBbGlhc0FuYWx5c2lzOjpSZWY6CisgICAgICAvLyBJZiB0aGUgY2FsbCBpcyBrbm93biB0byBuZXZlciBzdG9yZSB0byB0aGUgcG9pbnRlciwgYW5kIGlmIHRoaXMgaXMgYQorICAgICAgLy8gbG9hZCBxdWVyeSwgd2UgY2FuIHNhZmVseSBpZ25vcmUgaXQgKHNjYW4gcGFzdCBpdCkuCisgICAgICBpZiAoaXNMb2FkKQorICAgICAgICBjb250aW51ZTsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gT3RoZXJ3aXNlLCB0aGVyZSBpcyBhIHBvdGVudGlhbCBkZXBlbmRlbmNlLiAgUmV0dXJuIGEgY2xvYmJlci4KKyAgICAgIHJldHVybiBNZW1EZXBSZXN1bHQ6OmdldENsb2JiZXIoSW5zdCk7CisgICAgfQorICB9CisgIAorICAvLyBObyBkZXBlbmRlbmNlIGZvdW5kLiAgSWYgdGhpcyBpcyB0aGUgZW50cnkgYmxvY2sgb2YgdGhlIGZ1bmN0aW9uLCBpdCBpcyBhCisgIC8vIGNsb2JiZXIsIG90aGVyd2lzZSBpdCBpcyBub24tbG9jYWwuCisgIGlmIChCQiAhPSAmQkItPmdldFBhcmVudCgpLT5nZXRFbnRyeUJsb2NrKCkpCisgICAgcmV0dXJuIE1lbURlcFJlc3VsdDo6Z2V0Tm9uTG9jYWwoKTsKKyAgcmV0dXJuIE1lbURlcFJlc3VsdDo6Z2V0Q2xvYmJlcihTY2FuSXQpOworfQorCisvLy8gZ2V0RGVwZW5kZW5jeSAtIFJldHVybiB0aGUgaW5zdHJ1Y3Rpb24gb24gd2hpY2ggYSBtZW1vcnkgb3BlcmF0aW9uCisvLy8gZGVwZW5kcy4KK01lbURlcFJlc3VsdCBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6OmdldERlcGVuZGVuY3koSW5zdHJ1Y3Rpb24gKlF1ZXJ5SW5zdCkgeworICBJbnN0cnVjdGlvbiAqU2NhblBvcyA9IFF1ZXJ5SW5zdDsKKyAgCisgIC8vIENoZWNrIGZvciBhIGNhY2hlZCByZXN1bHQKKyAgTWVtRGVwUmVzdWx0ICZMb2NhbENhY2hlID0gTG9jYWxEZXBzW1F1ZXJ5SW5zdF07CisgIAorICAvLyBJZiB0aGUgY2FjaGVkIGVudHJ5IGlzIG5vbi1kaXJ0eSwganVzdCByZXR1cm4gaXQuICBOb3RlIHRoYXQgdGhpcyBkZXBlbmRzCisgIC8vIG9uIE1lbURlcFJlc3VsdCdzIGRlZmF1bHQgY29uc3RydWN0aW5nIHRvICdkaXJ0eScuCisgIGlmICghTG9jYWxDYWNoZS5pc0RpcnR5KCkpCisgICAgcmV0dXJuIExvY2FsQ2FjaGU7CisgICAgCisgIC8vIE90aGVyd2lzZSwgaWYgd2UgaGF2ZSBhIGRpcnR5IGVudHJ5LCB3ZSBrbm93IHdlIGNhbiBzdGFydCB0aGUgc2NhbiBhdCB0aGF0CisgIC8vIGluc3RydWN0aW9uLCB3aGljaCBtYXkgc2F2ZSB1cyBzb21lIHdvcmsuCisgIGlmIChJbnN0cnVjdGlvbiAqSW5zdCA9IExvY2FsQ2FjaGUuZ2V0SW5zdCgpKSB7CisgICAgU2NhblBvcyA9IEluc3Q7CisgICAKKyAgICBSZW1vdmVGcm9tUmV2ZXJzZU1hcChSZXZlcnNlTG9jYWxEZXBzLCBJbnN0LCBRdWVyeUluc3QpOworICB9CisgIAorICBCYXNpY0Jsb2NrICpRdWVyeVBhcmVudCA9IFF1ZXJ5SW5zdC0+Z2V0UGFyZW50KCk7CisgIAorICBWYWx1ZSAqTWVtUHRyID0gMDsKKyAgdWludDY0X3QgTWVtU2l6ZSA9IDA7CisgIAorICAvLyBEbyB0aGUgc2Nhbi4KKyAgaWYgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yKFF1ZXJ5SW5zdCkgPT0gUXVlcnlQYXJlbnQtPmJlZ2luKCkpIHsKKyAgICAvLyBObyBkZXBlbmRlbmNlIGZvdW5kLiAgSWYgdGhpcyBpcyB0aGUgZW50cnkgYmxvY2sgb2YgdGhlIGZ1bmN0aW9uLCBpdCBpcyBhCisgICAgLy8gY2xvYmJlciwgb3RoZXJ3aXNlIGl0IGlzIG5vbi1sb2NhbC4KKyAgICBpZiAoUXVlcnlQYXJlbnQgIT0gJlF1ZXJ5UGFyZW50LT5nZXRQYXJlbnQoKS0+Z2V0RW50cnlCbG9jaygpKQorICAgICAgTG9jYWxDYWNoZSA9IE1lbURlcFJlc3VsdDo6Z2V0Tm9uTG9jYWwoKTsKKyAgICBlbHNlCisgICAgICBMb2NhbENhY2hlID0gTWVtRGVwUmVzdWx0OjpnZXRDbG9iYmVyKFF1ZXJ5SW5zdCk7CisgIH0gZWxzZSBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oUXVlcnlJbnN0KSkgeworICAgIC8vIElmIHRoaXMgaXMgYSB2b2xhdGlsZSBzdG9yZSwgZG9uJ3QgbWVzcyBhcm91bmQgd2l0aCBpdC4gIEp1c3QgcmV0dXJuIHRoZQorICAgIC8vIHByZXZpb3VzIGluc3RydWN0aW9uIGFzIGEgY2xvYmJlci4KKyAgICBpZiAoU0ktPmlzVm9sYXRpbGUoKSkKKyAgICAgIExvY2FsQ2FjaGUgPSBNZW1EZXBSZXN1bHQ6OmdldENsb2JiZXIoLS1CYXNpY0Jsb2NrOjppdGVyYXRvcihTY2FuUG9zKSk7CisgICAgZWxzZSB7CisgICAgICBNZW1QdHIgPSBTSS0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgICAgIE1lbVNpemUgPSBBQS0+Z2V0VHlwZVN0b3JlU2l6ZShTSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFF1ZXJ5SW5zdCkpIHsKKyAgICAvLyBJZiB0aGlzIGlzIGEgdm9sYXRpbGUgbG9hZCwgZG9uJ3QgbWVzcyBhcm91bmQgd2l0aCBpdC4gIEp1c3QgcmV0dXJuIHRoZQorICAgIC8vIHByZXZpb3VzIGluc3RydWN0aW9uIGFzIGEgY2xvYmJlci4KKyAgICBpZiAoTEktPmlzVm9sYXRpbGUoKSkKKyAgICAgIExvY2FsQ2FjaGUgPSBNZW1EZXBSZXN1bHQ6OmdldENsb2JiZXIoLS1CYXNpY0Jsb2NrOjppdGVyYXRvcihTY2FuUG9zKSk7CisgICAgZWxzZSB7CisgICAgICBNZW1QdHIgPSBMSS0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgICAgIE1lbVNpemUgPSBBQS0+Z2V0VHlwZVN0b3JlU2l6ZShMSS0+Z2V0VHlwZSgpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaXNhPENhbGxJbnN0PihRdWVyeUluc3QpIHx8IElTQV9JTlZPS0VfSU5TVChRdWVyeUluc3QpKSB7CisgICAgaW50IEludHJpbnNpY0lEID0gMDsgIC8vIEludHJpbnNpYyBJRHMgc3RhcnQgYXQgMS4KKyAgICBJbnRyaW5zaWNJbnN0ICpJSSA9IGR5bl9jYXN0PEludHJpbnNpY0luc3Q+KFF1ZXJ5SW5zdCk7CisgICAgaWYgKElJKQorICAgICAgSW50cmluc2ljSUQgPSBJSS0+Z2V0SW50cmluc2ljSUQoKTsKKworICAgIHN3aXRjaCAoSW50cmluc2ljSUQpIHsKKyAgICBjYXNlIEludHJpbnNpYzo6bGlmZXRpbWVfc3RhcnQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmxpZmV0aW1lX2VuZDoKKyAgICBjYXNlIEludHJpbnNpYzo6aW52YXJpYW50X3N0YXJ0OgorICAgICAgTWVtUHRyID0gSUktPmdldEFyZ09wZXJhbmQoMSk7CisgICAgICBNZW1TaXplID0gY2FzdDxDb25zdGFudEludD4oSUktPmdldEFyZ09wZXJhbmQoMCkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjppbnZhcmlhbnRfZW5kOgorICAgICAgTWVtUHRyID0gSUktPmdldEFyZ09wZXJhbmQoMik7CisgICAgICBNZW1TaXplID0gY2FzdDxDb25zdGFudEludD4oSUktPmdldEFyZ09wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBDYWxsU2l0ZSBRdWVyeUNTKFF1ZXJ5SW5zdCk7CisgICAgICBib29sIGlzUmVhZE9ubHkgPSBBQS0+b25seVJlYWRzTWVtb3J5KFF1ZXJ5Q1MpOworICAgICAgTG9jYWxDYWNoZSA9IGdldENhbGxTaXRlRGVwZW5kZW5jeUZyb20oUXVlcnlDUywgaXNSZWFkT25seSwgU2NhblBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5UGFyZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBOb24tbWVtb3J5IGluc3RydWN0aW9uLgorICAgIExvY2FsQ2FjaGUgPSBNZW1EZXBSZXN1bHQ6OmdldENsb2JiZXIoLS1CYXNpY0Jsb2NrOjppdGVyYXRvcihTY2FuUG9zKSk7CisgIH0KKyAgCisgIC8vIElmIHdlIG5lZWQgdG8gZG8gYSBwb2ludGVyIHNjYW4sIG1ha2UgaXQgaGFwcGVuLgorICBpZiAoTWVtUHRyKSB7CisgICAgYm9vbCBpc0xvYWQgPSAhUXVlcnlJbnN0LT5tYXlXcml0ZVRvTWVtb3J5KCk7CisgICAgaWYgKEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8TWVtb3J5VXNlSW50cmluc2ljPihRdWVyeUluc3QpKSB7CisgICAgICBpc0xvYWQgfD0gSUktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpsaWZldGltZV9lbmQ7CisgICAgfQorICAgIExvY2FsQ2FjaGUgPSBnZXRQb2ludGVyRGVwZW5kZW5jeUZyb20oTWVtUHRyLCBNZW1TaXplLCBpc0xvYWQsIFNjYW5Qb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVBhcmVudCk7CisgIH0KKyAgCisgIC8vIFJlbWVtYmVyIHRoZSByZXN1bHQhCisgIGlmIChJbnN0cnVjdGlvbiAqSSA9IExvY2FsQ2FjaGUuZ2V0SW5zdCgpKQorICAgIFJldmVyc2VMb2NhbERlcHNbSV0uaW5zZXJ0KFF1ZXJ5SW5zdCk7CisgIAorICByZXR1cm4gTG9jYWxDYWNoZTsKK30KKworI2lmbmRlZiBOREVCVUcKKy8vLyBBc3NlcnRTb3J0ZWQgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gLWRlYnVnIGlzIHNwZWNpZmllZCB0byB2ZXJpZnkgdGhhdAorLy8vIGNhY2hlIGFycmF5cyBhcmUgcHJvcGVybHkga2VwdCBzb3J0ZWQuCitzdGF0aWMgdm9pZCBBc3NlcnRTb3J0ZWQoTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzOjpOb25Mb2NhbERlcEluZm8gJkNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb3VudCA9IC0xKSB7CisgIGlmIChDb3VudCA9PSAtMSkgQ291bnQgPSBDYWNoZS5zaXplKCk7CisgIGlmIChDb3VudCA9PSAwKSByZXR1cm47CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSB1bnNpZ25lZChDb3VudCk7ICsraSkKKyAgICBhc3NlcnQoIShDYWNoZVtpXSA8IENhY2hlW2ktMV0pICYmICJDYWNoZSBpc24ndCBzb3J0ZWQhIik7Cit9CisjZW5kaWYKKworLy8vIGdldE5vbkxvY2FsQ2FsbERlcGVuZGVuY3kgLSBQZXJmb3JtIGEgZnVsbCBkZXBlbmRlbmN5IHF1ZXJ5IGZvciB0aGUKKy8vLyBzcGVjaWZpZWQgY2FsbCwgcmV0dXJuaW5nIHRoZSBzZXQgb2YgYmxvY2tzIHRoYXQgdGhlIHZhbHVlIGlzCisvLy8gcG90ZW50aWFsbHkgbGl2ZSBhY3Jvc3MuICBUaGUgcmV0dXJuZWQgc2V0IG9mIHJlc3VsdHMgd2lsbCBpbmNsdWRlIGEKKy8vLyAiTm9uTG9jYWwiIHJlc3VsdCBmb3IgYWxsIGJsb2NrcyB3aGVyZSB0aGUgdmFsdWUgaXMgbGl2ZSBhY3Jvc3MuCisvLy8KKy8vLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBpbnN0cnVjdGlvbiByZXR1cm5zIGEgIk5vbkxvY2FsIiBkZXBlbmRlbmN5CisvLy8gd2l0aGluIGl0cyBvd24gYmxvY2suCisvLy8KKy8vLyBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBtYXkgYmUKKy8vLyBpbnZhbGlkYXRlZCBvbiB0aGUgbmV4dCBub24tbG9jYWwgcXVlcnkgb3Igd2hlbiBhbiBpbnN0cnVjdGlvbiBpcworLy8vIHJlbW92ZWQuICBDbGllbnRzIG11c3QgY29weSB0aGlzIGRhdGEgaWYgdGhleSB3YW50IGl0IGFyb3VuZCBsb25nZXIgdGhhbgorLy8vIHRoYXQuCitjb25zdCBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6Ok5vbkxvY2FsRGVwSW5mbyAmCitNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6OmdldE5vbkxvY2FsQ2FsbERlcGVuZGVuY3koQ2FsbFNpdGUgUXVlcnlDUykgeworICBhc3NlcnQoZ2V0RGVwZW5kZW5jeShRdWVyeUNTLmdldEluc3RydWN0aW9uKCkpLmlzTm9uTG9jYWwoKSAmJgorICJnZXROb25Mb2NhbENhbGxEZXBlbmRlbmN5IHNob3VsZCBvbmx5IGJlIHVzZWQgb24gY2FsbHMgd2l0aCBub24tbG9jYWwgZGVwcyEiKTsKKyAgUGVySW5zdE5MSW5mbyAmQ2FjaGVQID0gTm9uTG9jYWxEZXBzW1F1ZXJ5Q1MuZ2V0SW5zdHJ1Y3Rpb24oKV07CisgIE5vbkxvY2FsRGVwSW5mbyAmQ2FjaGUgPSBDYWNoZVAuZmlyc3Q7CisKKyAgLy8vIERpcnR5QmxvY2tzIC0gVGhpcyBpcyB0aGUgc2V0IG9mIGJsb2NrcyB0aGF0IG5lZWQgdG8gYmUgcmVjb21wdXRlZC4gIEluCisgIC8vLyB0aGUgY2FjaGVkIGNhc2UsIHRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gaW5zdHJ1Y3Rpb25zIGJlaW5nIGRlbGV0ZWQgZXRjLiBJbgorICAvLy8gdGhlIHVuY2FjaGVkIGNhc2UsIHRoaXMgc3RhcnRzIG91dCBhcyB0aGUgc2V0IG9mIHByZWRlY2Vzc29ycyB3ZSBjYXJlCisgIC8vLyBhYm91dC4KKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDMyPiBEaXJ0eUJsb2NrczsKKyAgCisgIGlmICghQ2FjaGUuZW1wdHkoKSkgeworICAgIC8vIE9rYXksIHdlIGhhdmUgYSBjYWNoZSBlbnRyeS4gIElmIHdlIGtub3cgaXQgaXMgbm90IGRpcnR5LCBqdXN0IHJldHVybiBpdAorICAgIC8vIHdpdGggbm8gY29tcHV0YXRpb24uCisgICAgaWYgKCFDYWNoZVAuc2Vjb25kKSB7CisgICAgICArK051bUNhY2hlTm9uTG9jYWw7CisgICAgICByZXR1cm4gQ2FjaGU7CisgICAgfQorICAgIAorICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhIHBhcnRpYWxseSBjb21wdXRlZCBzZXQgb2YgcmVzdWx0cywgc2NhbiB0aGVtIHRvCisgICAgLy8gZGV0ZXJtaW5lIHdoYXQgaXMgZGlydHksIHNlZWRpbmcgb3VyIGluaXRpYWwgRGlydHlCbG9ja3Mgd29ya2xpc3QuCisgICAgZm9yIChOb25Mb2NhbERlcEluZm86Oml0ZXJhdG9yIEkgPSBDYWNoZS5iZWdpbigpLCBFID0gQ2FjaGUuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBpZiAoSS0+Z2V0UmVzdWx0KCkuaXNEaXJ0eSgpKQorICAgICAgICBEaXJ0eUJsb2Nrcy5wdXNoX2JhY2soSS0+Z2V0QkIoKSk7CisgICAgCisgICAgLy8gU29ydCB0aGUgY2FjaGUgc28gdGhhdCB3ZSBjYW4gZG8gZmFzdCBiaW5hcnkgc2VhcmNoIGxvb2t1cHMgYmVsb3cuCisgICAgc3RkOjpzb3J0KENhY2hlLmJlZ2luKCksIENhY2hlLmVuZCgpKTsKKyAgICAKKyAgICArK051bUNhY2hlRGlydHlOb25Mb2NhbDsKKyAgICAvL2NlcnIgPDwgIkNBQ0hFRCBDQVNFOiAiIDw8IERpcnR5QmxvY2tzLnNpemUoKSA8PCAiIGRpcnR5OiAiCisgICAgLy8gICAgIDw8IENhY2hlLnNpemUoKSA8PCAiIGNhY2hlZDogIiA8PCAqUXVlcnlJbnN0OworICB9IGVsc2UgeworICAgIC8vIFNlZWQgRGlydHlCbG9ja3Mgd2l0aCBlYWNoIG9mIHRoZSBwcmVkcyBvZiBRdWVyeUluc3QncyBibG9jay4KKyAgICBCYXNpY0Jsb2NrICpRdWVyeUJCID0gUXVlcnlDUy5nZXRJbnN0cnVjdGlvbigpLT5nZXRQYXJlbnQoKTsKKyAgICBmb3IgKEJhc2ljQmxvY2sgKipQSSA9IFByZWRDYWNoZS0+R2V0UHJlZHMoUXVlcnlCQik7ICpQSTsgKytQSSkKKyAgICAgIERpcnR5QmxvY2tzLnB1c2hfYmFjaygqUEkpOworICAgICsrTnVtVW5jYWNoZU5vbkxvY2FsOworICB9CisgIAorICAvLyBpc1JlYWRvbmx5Q2FsbCAtIElmIHRoaXMgaXMgYSByZWFkLW9ubHkgY2FsbCwgd2UgY2FuIGJlIG1vcmUgYWdncmVzc2l2ZS4KKyAgYm9vbCBpc1JlYWRvbmx5Q2FsbCA9IEFBLT5vbmx5UmVhZHNNZW1vcnkoUXVlcnlDUyk7CisKKyAgU21hbGxQdHJTZXQ8QmFzaWNCbG9jayosIDY0PiBWaXNpdGVkOworICAKKyAgdW5zaWduZWQgTnVtU29ydGVkRW50cmllcyA9IENhY2hlLnNpemUoKTsKKyAgREVCVUcoQXNzZXJ0U29ydGVkKENhY2hlKSk7CisgIAorICAvLyBJdGVyYXRlIHdoaWxlIHdlIHN0aWxsIGhhdmUgYmxvY2tzIHRvIHVwZGF0ZS4KKyAgd2hpbGUgKCFEaXJ0eUJsb2Nrcy5lbXB0eSgpKSB7CisgICAgQmFzaWNCbG9jayAqRGlydHlCQiA9IERpcnR5QmxvY2tzLmJhY2soKTsKKyAgICBEaXJ0eUJsb2Nrcy5wb3BfYmFjaygpOworICAgIAorICAgIC8vIEFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgYmxvY2s/CisgICAgaWYgKCFWaXNpdGVkLmluc2VydChEaXJ0eUJCKSkKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIC8vIERvIGEgYmluYXJ5IHNlYXJjaCB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGVudHJ5IGZvciB0aGlzIGJsb2NrIGluCisgICAgLy8gdGhlIGNhY2hlIHNldC4gIElmIHNvLCBmaW5kIGl0LgorICAgIERFQlVHKEFzc2VydFNvcnRlZChDYWNoZSwgTnVtU29ydGVkRW50cmllcykpOworICAgIE5vbkxvY2FsRGVwSW5mbzo6aXRlcmF0b3IgRW50cnkgPSAKKyAgICAgIHN0ZDo6dXBwZXJfYm91bmQoQ2FjaGUuYmVnaW4oKSwgQ2FjaGUuYmVnaW4oKStOdW1Tb3J0ZWRFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICBOb25Mb2NhbERlcEVudHJ5KERpcnR5QkIpKTsKKyAgICBpZiAoRW50cnkgIT0gQ2FjaGUuYmVnaW4oKSAmJiBwcmlvcihFbnRyeSktPmdldEJCKCkgPT0gRGlydHlCQikKKyAgICAgIC0tRW50cnk7CisgICAgCisgICAgTm9uTG9jYWxEZXBFbnRyeSAqRXhpc3RpbmdSZXN1bHQgPSAwOworICAgIGlmIChFbnRyeSAhPSBDYWNoZS5iZWdpbigpK051bVNvcnRlZEVudHJpZXMgJiYgCisgICAgICAgIEVudHJ5LT5nZXRCQigpID09IERpcnR5QkIpIHsKKyAgICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSwgYW5kIGlmIGl0IGlzbid0IGFscmVhZHkgZGlydHksIHRoZSBibG9jaworICAgICAgLy8gaXMgZG9uZS4KKyAgICAgIGlmICghRW50cnktPmdldFJlc3VsdCgpLmlzRGlydHkoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhpcyBzbG90IHNvIHdlIGNhbiB1cGRhdGUgdGhlIHZhbHVlLgorICAgICAgRXhpc3RpbmdSZXN1bHQgPSAmKkVudHJ5OworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGUgZGlydHkgZW50cnkgaGFzIGEgcG9pbnRlciwgc3RhcnQgc2Nhbm5pbmcgZnJvbSBpdCBzbyB3ZSBkb24ndCBoYXZlCisgICAgLy8gdG8gcmVzY2FuIHRoZSBlbnRpcmUgYmxvY2suCisgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgU2NhblBvcyA9IERpcnR5QkItPmVuZCgpOworICAgIGlmIChFeGlzdGluZ1Jlc3VsdCkgeworICAgICAgaWYgKEluc3RydWN0aW9uICpJbnN0ID0gRXhpc3RpbmdSZXN1bHQtPmdldFJlc3VsdCgpLmdldEluc3QoKSkgeworICAgICAgICBTY2FuUG9zID0gSW5zdDsKKyAgICAgICAgLy8gV2UncmUgcmVtb3ZpbmcgUXVlcnlJbnN0J3MgdXNlIG9mIEluc3QuCisgICAgICAgIFJlbW92ZUZyb21SZXZlcnNlTWFwKFJldmVyc2VOb25Mb2NhbERlcHMsIEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5Q1MuZ2V0SW5zdHJ1Y3Rpb24oKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIEZpbmQgb3V0IGlmIHRoaXMgYmxvY2sgaGFzIGEgbG9jYWwgZGVwZW5kZW5jeSBmb3IgUXVlcnlJbnN0LgorICAgIE1lbURlcFJlc3VsdCBEZXA7CisgICAgCisgICAgaWYgKFNjYW5Qb3MgIT0gRGlydHlCQi0+YmVnaW4oKSkgeworICAgICAgRGVwID0gZ2V0Q2FsbFNpdGVEZXBlbmRlbmN5RnJvbShRdWVyeUNTLCBpc1JlYWRvbmx5Q2FsbCxTY2FuUG9zLCBEaXJ0eUJCKTsKKyAgICB9IGVsc2UgaWYgKERpcnR5QkIgIT0gJkRpcnR5QkItPmdldFBhcmVudCgpLT5nZXRFbnRyeUJsb2NrKCkpIHsKKyAgICAgIC8vIE5vIGRlcGVuZGVuY2UgZm91bmQuICBJZiB0aGlzIGlzIHRoZSBlbnRyeSBibG9jayBvZiB0aGUgZnVuY3Rpb24sIGl0IGlzCisgICAgICAvLyBhIGNsb2JiZXIsIG90aGVyd2lzZSBpdCBpcyBub24tbG9jYWwuCisgICAgICBEZXAgPSBNZW1EZXBSZXN1bHQ6OmdldE5vbkxvY2FsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIERlcCA9IE1lbURlcFJlc3VsdDo6Z2V0Q2xvYmJlcihTY2FuUG9zKTsKKyAgICB9CisgICAgCisgICAgLy8gSWYgd2UgaGFkIGEgZGlydHkgZW50cnkgZm9yIHRoZSBibG9jaywgdXBkYXRlIGl0LiAgT3RoZXJ3aXNlLCBqdXN0IGFkZAorICAgIC8vIGEgbmV3IGVudHJ5LgorICAgIGlmIChFeGlzdGluZ1Jlc3VsdCkKKyAgICAgIEV4aXN0aW5nUmVzdWx0LT5zZXRSZXN1bHQoRGVwKTsKKyAgICBlbHNlCisgICAgICBDYWNoZS5wdXNoX2JhY2soTm9uTG9jYWxEZXBFbnRyeShEaXJ0eUJCLCBEZXApKTsKKyAgICAKKyAgICAvLyBJZiB0aGUgYmxvY2sgaGFzIGEgZGVwZW5kZW5jeSAoaS5lLiBpdCBpc24ndCBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvCisgICAgLy8gdGhlIHZhbHVlKSwgcmVtZW1iZXIgdGhlIGFzc29jaWF0aW9uIQorICAgIGlmICghRGVwLmlzTm9uTG9jYWwoKSkgeworICAgICAgLy8gS2VlcCB0aGUgUmV2ZXJzZU5vbkxvY2FsRGVwcyBtYXAgdXAgdG8gZGF0ZSBzbyB3ZSBjYW4gZWZmaWNpZW50bHkKKyAgICAgIC8vIHVwZGF0ZSB0aGlzIHdoZW4gd2UgcmVtb3ZlIGluc3RydWN0aW9ucy4KKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqSW5zdCA9IERlcC5nZXRJbnN0KCkpCisgICAgICAgIFJldmVyc2VOb25Mb2NhbERlcHNbSW5zdF0uaW5zZXJ0KFF1ZXJ5Q1MuZ2V0SW5zdHJ1Y3Rpb24oKSk7CisgICAgfSBlbHNlIHsKKyAgICAKKyAgICAgIC8vIElmIHRoZSBibG9jayAqaXMqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gdGhlIGxvYWQsIHdlIG5lZWQgdG8gY2hlY2sKKyAgICAgIC8vIHRoZSBwcmVkZWNlc3NvcnMgb2YgdGhpcyBibG9jay4gIEFkZCB0aGVtIHRvIG91ciB3b3JrbGlzdC4KKyAgICAgIGZvciAoQmFzaWNCbG9jayAqKlBJID0gUHJlZENhY2hlLT5HZXRQcmVkcyhEaXJ0eUJCKTsgKlBJOyArK1BJKQorICAgICAgICBEaXJ0eUJsb2Nrcy5wdXNoX2JhY2soKlBJKTsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiBDYWNoZTsKK30KKworLy8vIGdldE5vbkxvY2FsUG9pbnRlckRlcGVuZGVuY3kgLSBQZXJmb3JtIGEgZnVsbCBkZXBlbmRlbmN5IHF1ZXJ5IGZvciBhbgorLy8vIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIChub24tdm9sYXRpbGUpIG1lbW9yeSBsb2NhdGlvbiwgcmV0dXJuaW5nIHRoZQorLy8vIHNldCBvZiBpbnN0cnVjdGlvbnMgdGhhdCBlaXRoZXIgZGVmaW5lIG9yIGNsb2JiZXIgdGhlIHZhbHVlLgorLy8vCisvLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgcG9pbnRlciBoYXMgYSAiTm9uTG9jYWwiIGRlcGVuZGVuY3kgd2l0aGluIGl0cworLy8vIG93biBibG9jay4KKy8vLwordm9pZCBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6OgorZ2V0Tm9uTG9jYWxQb2ludGVyRGVwZW5kZW5jeShWYWx1ZSAqUG9pbnRlciwgYm9vbCBpc0xvYWQsIEJhc2ljQmxvY2sgKkZyb21CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE5vbkxvY2FsRGVwUmVzdWx0PiAmUmVzdWx0KSB7CisgIGFzc2VydChQb2ludGVyLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkgJiYKKyAgICAgICAgICJDYW4ndCBnZXQgcG9pbnRlciBkZXBzIG9mIGEgbm9uLXBvaW50ZXIhIik7CisgIFJlc3VsdC5jbGVhcigpOworICAKKyAgLy8gV2Uga25vdyB0aGF0IHRoZSBwb2ludGVyIHZhbHVlIGlzIGxpdmUgaW50byBGcm9tQkIgZmluZCB0aGUgZGVmL2Nsb2JiZXJzCisgIC8vIGZyb20gcHJlc2VjZXNzb3JzLgorICBjb25zdCBUeXBlICpFbHRUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KFBvaW50ZXItPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgIHVpbnQ2NF90IFBvaW50ZWVTaXplID0gQUEtPmdldFR5cGVTdG9yZVNpemUoRWx0VHkpOworICAKKyAgUEhJVHJhbnNBZGRyIEFkZHJlc3MoUG9pbnRlciwgVEQpOworICAKKyAgLy8gVGhpcyBpcyB0aGUgc2V0IG9mIGJsb2NrcyB3ZSd2ZSBpbnNwZWN0ZWQsIGFuZCB0aGUgcG9pbnRlciB3ZSBjb25zaWRlciBpbgorICAvLyBlYWNoIGJsb2NrLiAgQmVjYXVzZSBvZiBjcml0aWNhbCBlZGdlcywgd2UgY3VycmVudGx5IGJhaWwgb3V0IGlmIHF1ZXJ5aW5nCisgIC8vIGEgYmxvY2sgd2l0aCBtdWx0aXBsZSBkaWZmZXJlbnQgcG9pbnRlcnMuICBUaGlzIGNhbiBoYXBwZW4gZHVyaW5nIFBISQorICAvLyB0cmFuc2xhdGlvbi4KKyAgRGVuc2VNYXA8QmFzaWNCbG9jayosIFZhbHVlKj4gVmlzaXRlZDsKKyAgaWYgKCFnZXROb25Mb2NhbFBvaW50ZXJEZXBGcm9tQkIoQWRkcmVzcywgUG9pbnRlZVNpemUsIGlzTG9hZCwgRnJvbUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQsIFZpc2l0ZWQsIHRydWUpKQorICAgIHJldHVybjsKKyAgUmVzdWx0LmNsZWFyKCk7CisgIFJlc3VsdC5wdXNoX2JhY2soTm9uTG9jYWxEZXBSZXN1bHQoRnJvbUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbURlcFJlc3VsdDo6Z2V0Q2xvYmJlcihGcm9tQkItPmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIpKTsKK30KKworLy8vIEdldE5vbkxvY2FsSW5mb0ZvckJsb2NrIC0gQ29tcHV0ZSB0aGUgbWVtZGVwIHZhbHVlIGZvciBCQiB3aXRoCisvLy8gUG9pbnRlci9Qb2ludGVlU2l6ZSB1c2luZyBlaXRoZXIgY2FjaGVkIGluZm9ybWF0aW9uIGluIENhY2hlIG9yIGJ5IGRvaW5nIGEKKy8vLyBsb29rdXAgKHdoaWNoIG1heSB1c2UgZGlydHkgY2FjaGUgaW5mbyBpZiBhdmFpbGFibGUpLiAgSWYgd2UgZG8gYSBsb29rdXAsCisvLy8gYWRkIHRoZSByZXN1bHQgdG8gdGhlIGNhY2hlLgorTWVtRGVwUmVzdWx0IE1lbW9yeURlcGVuZGVuY2VBbmFseXNpczo6CitHZXROb25Mb2NhbEluZm9Gb3JCbG9jayhWYWx1ZSAqUG9pbnRlciwgdWludDY0X3QgUG9pbnRlZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTG9hZCwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICBOb25Mb2NhbERlcEluZm8gKkNhY2hlLCB1bnNpZ25lZCBOdW1Tb3J0ZWRFbnRyaWVzKSB7CisgIAorICAvLyBEbyBhIGJpbmFyeSBzZWFyY2ggdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSBmb3IgdGhpcyBibG9jayBpbgorICAvLyB0aGUgY2FjaGUgc2V0LiAgSWYgc28sIGZpbmQgaXQuCisgIE5vbkxvY2FsRGVwSW5mbzo6aXRlcmF0b3IgRW50cnkgPQorICAgIHN0ZDo6dXBwZXJfYm91bmQoQ2FjaGUtPmJlZ2luKCksIENhY2hlLT5iZWdpbigpK051bVNvcnRlZEVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICBOb25Mb2NhbERlcEVudHJ5KEJCKSk7CisgIGlmIChFbnRyeSAhPSBDYWNoZS0+YmVnaW4oKSAmJiAoRW50cnktMSktPmdldEJCKCkgPT0gQkIpCisgICAgLS1FbnRyeTsKKyAgCisgIE5vbkxvY2FsRGVwRW50cnkgKkV4aXN0aW5nUmVzdWx0ID0gMDsKKyAgaWYgKEVudHJ5ICE9IENhY2hlLT5iZWdpbigpK051bVNvcnRlZEVudHJpZXMgJiYgRW50cnktPmdldEJCKCkgPT0gQkIpCisgICAgRXhpc3RpbmdSZXN1bHQgPSAmKkVudHJ5OworICAKKyAgLy8gSWYgd2UgaGF2ZSBhIGNhY2hlZCBlbnRyeSwgYW5kIGl0IGlzIG5vbi1kaXJ0eSwgdXNlIGl0IGFzIHRoZSB2YWx1ZSBmb3IKKyAgLy8gdGhpcyBkZXBlbmRlbmN5LgorICBpZiAoRXhpc3RpbmdSZXN1bHQgJiYgIUV4aXN0aW5nUmVzdWx0LT5nZXRSZXN1bHQoKS5pc0RpcnR5KCkpIHsKKyAgICArK051bUNhY2hlTm9uTG9jYWxQdHI7CisgICAgcmV0dXJuIEV4aXN0aW5nUmVzdWx0LT5nZXRSZXN1bHQoKTsKKyAgfSAgICAKKyAgCisgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBzY2FuIGZvciB0aGUgdmFsdWUuICBJZiB3ZSBoYXZlIGEgZGlydHkgY2FjaGUKKyAgLy8gZW50cnksIHN0YXJ0IHNjYW5uaW5nIGZyb20gaXRzIHBvc2l0aW9uLCBvdGhlcndpc2Ugd2Ugc2NhbiBmcm9tIHRoZSBlbmQKKyAgLy8gb2YgdGhlIGJsb2NrLgorICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTY2FuUG9zID0gQkItPmVuZCgpOworICBpZiAoRXhpc3RpbmdSZXN1bHQgJiYgRXhpc3RpbmdSZXN1bHQtPmdldFJlc3VsdCgpLmdldEluc3QoKSkgeworICAgIGFzc2VydChFeGlzdGluZ1Jlc3VsdC0+Z2V0UmVzdWx0KCkuZ2V0SW5zdCgpLT5nZXRQYXJlbnQoKSA9PSBCQiAmJgorICAgICAgICAgICAiSW5zdHJ1Y3Rpb24gaW52YWxpZGF0ZWQ/Iik7CisgICAgKytOdW1DYWNoZURpcnR5Tm9uTG9jYWxQdHI7CisgICAgU2NhblBvcyA9IEV4aXN0aW5nUmVzdWx0LT5nZXRSZXN1bHQoKS5nZXRJbnN0KCk7CisgICAgCisgICAgLy8gRWxpbWluYXRpbmcgdGhlIGRpcnR5IGVudHJ5IGZyb20gJ0NhY2hlJywgc28gdXBkYXRlIHRoZSByZXZlcnNlIGluZm8uCisgICAgVmFsdWVJc0xvYWRQYWlyIENhY2hlS2V5KFBvaW50ZXIsIGlzTG9hZCk7CisgICAgUmVtb3ZlRnJvbVJldmVyc2VNYXAoUmV2ZXJzZU5vbkxvY2FsUHRyRGVwcywgU2NhblBvcywgQ2FjaGVLZXkpOworICB9IGVsc2UgeworICAgICsrTnVtVW5jYWNoZU5vbkxvY2FsUHRyOworICB9CisgIAorICAvLyBTY2FuIHRoZSBibG9jayBmb3IgdGhlIGRlcGVuZGVuY3kuCisgIE1lbURlcFJlc3VsdCBEZXAgPSBnZXRQb2ludGVyRGVwZW5kZW5jeUZyb20oUG9pbnRlciwgUG9pbnRlZVNpemUsIGlzTG9hZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhblBvcywgQkIpOworICAKKyAgLy8gSWYgd2UgaGFkIGEgZGlydHkgZW50cnkgZm9yIHRoZSBibG9jaywgdXBkYXRlIGl0LiAgT3RoZXJ3aXNlLCBqdXN0IGFkZAorICAvLyBhIG5ldyBlbnRyeS4KKyAgaWYgKEV4aXN0aW5nUmVzdWx0KQorICAgIEV4aXN0aW5nUmVzdWx0LT5zZXRSZXN1bHQoRGVwKTsKKyAgZWxzZQorICAgIENhY2hlLT5wdXNoX2JhY2soTm9uTG9jYWxEZXBFbnRyeShCQiwgRGVwKSk7CisgIAorICAvLyBJZiB0aGUgYmxvY2sgaGFzIGEgZGVwZW5kZW5jeSAoaS5lLiBpdCBpc24ndCBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvCisgIC8vIHRoZSB2YWx1ZSksIHJlbWVtYmVyIHRoZSByZXZlcnNlIGFzc29jaWF0aW9uIGJlY2F1c2Ugd2UganVzdCBhZGRlZCBpdAorICAvLyB0byBDYWNoZSEKKyAgaWYgKERlcC5pc05vbkxvY2FsKCkpCisgICAgcmV0dXJuIERlcDsKKyAgCisgIC8vIEtlZXAgdGhlIFJldmVyc2VOb25Mb2NhbFB0ckRlcHMgbWFwIHVwIHRvIGRhdGUgc28gd2UgY2FuIGVmZmljaWVudGx5CisgIC8vIHVwZGF0ZSBNZW1EZXAgd2hlbiB3ZSByZW1vdmUgaW5zdHJ1Y3Rpb25zLgorICBJbnN0cnVjdGlvbiAqSW5zdCA9IERlcC5nZXRJbnN0KCk7CisgIGFzc2VydChJbnN0ICYmICJEaWRuJ3QgZGVwZW5kIG9uIGFueXRoaW5nPyIpOworICBWYWx1ZUlzTG9hZFBhaXIgQ2FjaGVLZXkoUG9pbnRlciwgaXNMb2FkKTsKKyAgUmV2ZXJzZU5vbkxvY2FsUHRyRGVwc1tJbnN0XS5pbnNlcnQoQ2FjaGVLZXkpOworICByZXR1cm4gRGVwOworfQorCisvLy8gU29ydE5vbkxvY2FsRGVwSW5mb0NhY2hlIC0gU29ydCB0aGUgYSBOb25Mb2NhbERlcEluZm8gY2FjaGUsIGdpdmVuIGEgY2VydGFpbgorLy8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgdGhhdCBhcmUgYWxyZWFkeSBwcm9wZXJseSBvcmRlcmVkLiAgVGhpcyBpcworLy8vIG9wdGltaXplZCBmb3IgdGhlIGNhc2Ugd2hlbiBvbmx5IGEgZmV3IGVudHJpZXMgYXJlIGFkZGVkLgorc3RhdGljIHZvaWQgCitTb3J0Tm9uTG9jYWxEZXBJbmZvQ2FjaGUoTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzOjpOb25Mb2NhbERlcEluZm8gJkNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVNvcnRlZEVudHJpZXMpIHsKKyAgc3dpdGNoIChDYWNoZS5zaXplKCkgLSBOdW1Tb3J0ZWRFbnRyaWVzKSB7CisgIGNhc2UgMDoKKyAgICAvLyBkb25lLCBubyBuZXcgZW50cmllcy4KKyAgICBicmVhazsKKyAgY2FzZSAyOiB7CisgICAgLy8gVHdvIG5ldyBlbnRyaWVzLCBpbnNlcnQgdGhlIGxhc3Qgb25lIGludG8gcGxhY2UuCisgICAgTm9uTG9jYWxEZXBFbnRyeSBWYWwgPSBDYWNoZS5iYWNrKCk7CisgICAgQ2FjaGUucG9wX2JhY2soKTsKKyAgICBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6Ok5vbkxvY2FsRGVwSW5mbzo6aXRlcmF0b3IgRW50cnkgPQorICAgICAgc3RkOjp1cHBlcl9ib3VuZChDYWNoZS5iZWdpbigpLCBDYWNoZS5lbmQoKS0xLCBWYWwpOworICAgIENhY2hlLmluc2VydChFbnRyeSwgVmFsKTsKKyAgICAvLyBGQUxMIFRIUk9VR0guCisgIH0KKyAgY2FzZSAxOgorICAgIC8vIE9uZSBuZXcgZW50cnksIEp1c3QgaW5zZXJ0IHRoZSBuZXcgdmFsdWUgYXQgdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uLgorICAgIGlmIChDYWNoZS5zaXplKCkgIT0gMSkgeworICAgICAgTm9uTG9jYWxEZXBFbnRyeSBWYWwgPSBDYWNoZS5iYWNrKCk7CisgICAgICBDYWNoZS5wb3BfYmFjaygpOworICAgICAgTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzOjpOb25Mb2NhbERlcEluZm86Oml0ZXJhdG9yIEVudHJ5ID0KKyAgICAgICAgc3RkOjp1cHBlcl9ib3VuZChDYWNoZS5iZWdpbigpLCBDYWNoZS5lbmQoKSwgVmFsKTsKKyAgICAgIENhY2hlLmluc2VydChFbnRyeSwgVmFsKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgLy8gQWRkZWQgbWFueSB2YWx1ZXMsIGRvIGEgZnVsbCBzY2FsZSBzb3J0LgorICAgIHN0ZDo6c29ydChDYWNoZS5iZWdpbigpLCBDYWNoZS5lbmQoKSk7CisgICAgYnJlYWs7CisgIH0KK30KKworLy8vIGdldE5vbkxvY2FsUG9pbnRlckRlcEZyb21CQiAtIFBlcmZvcm0gYSBkZXBlbmRlbmN5IHF1ZXJ5IGJhc2VkIG9uCisvLy8gcG9pbnRlci9wb2ludGVlc2l6ZSBzdGFydGluZyBhdCB0aGUgZW5kIG9mIFN0YXJ0QkIuICBBZGQgYW55IGNsb2JiZXIvZGVmCisvLy8gcmVzdWx0cyB0byB0aGUgcmVzdWx0cyB2ZWN0b3IgYW5kIGtlZXAgdHJhY2sgb2Ygd2hpY2ggYmxvY2tzIGFyZSB2aXNpdGVkIGluCisvLy8gJ1Zpc2l0ZWQnLgorLy8vCisvLy8gVGhpcyBoYXMgc3BlY2lhbCBiZWhhdmlvciBmb3IgdGhlIGZpcnN0IGJsb2NrIHF1ZXJpZXMgKHdoZW4gU2tpcEZpcnN0QmxvY2sKKy8vLyBpcyB0cnVlKS4gIEluIHRoaXMgc3BlY2lhbCBjYXNlLCBpdCBpZ25vcmVzIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkCisvLy8gYmxvY2sgYW5kIHN0YXJ0cyByZXR1cm5pbmcgZGVwZW5kZW5jZSBpbmZvIGZvciBpdHMgcHJlZGVjZXNzb3JzLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIG9uIHN1Y2Nlc3MsIG9yIHRydWUgdG8gaW5kaWNhdGUgdGhhdCBpdCBjb3VsZAorLy8vIG5vdCBjb21wdXRlIGRlcGVuZGVuY2UgaW5mb3JtYXRpb24gZm9yIHNvbWUgcmVhc29uLiAgVGhpcyBzaG91bGQgYmUgdHJlYXRlZAorLy8vIGFzIGEgY2xvYmJlciBkZXBlbmRlbmNlIG9uIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGUgcHJlZGVjZXNzb3IgYmxvY2suCitib29sIE1lbW9yeURlcGVuZGVuY2VBbmFseXNpczo6CitnZXROb25Mb2NhbFBvaW50ZXJEZXBGcm9tQkIoY29uc3QgUEhJVHJhbnNBZGRyICZQb2ludGVyLCB1aW50NjRfdCBQb2ludGVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTG9hZCwgQmFzaWNCbG9jayAqU3RhcnRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Tm9uTG9jYWxEZXBSZXN1bHQ+ICZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8QmFzaWNCbG9jayosIFZhbHVlKj4gJlZpc2l0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTa2lwRmlyc3RCbG9jaykgeworICAKKyAgLy8gTG9vayB1cCB0aGUgY2FjaGVkIGluZm8gZm9yIFBvaW50ZXIuCisgIFZhbHVlSXNMb2FkUGFpciBDYWNoZUtleShQb2ludGVyLmdldEFkZHIoKSwgaXNMb2FkKTsKKyAgCisgIHN0ZDo6cGFpcjxCQlNraXBGaXJzdEJsb2NrUGFpciwgTm9uTG9jYWxEZXBJbmZvPiAqQ2FjaGVJbmZvID0KKyAgICAmTm9uTG9jYWxQb2ludGVyRGVwc1tDYWNoZUtleV07CisgIE5vbkxvY2FsRGVwSW5mbyAqQ2FjaGUgPSAmQ2FjaGVJbmZvLT5zZWNvbmQ7CisKKyAgLy8gSWYgd2UgaGF2ZSB2YWxpZCBjYWNoZWQgaW5mb3JtYXRpb24gZm9yIGV4YWN0bHkgdGhlIGJsb2NrIHdlIGFyZQorICAvLyBpbnZlc3RpZ2F0aW5nLCBqdXN0IHJldHVybiBpdCB3aXRoIG5vIHJlY29tcHV0YXRpb24uCisgIGlmIChDYWNoZUluZm8tPmZpcnN0ID09IEJCU2tpcEZpcnN0QmxvY2tQYWlyKFN0YXJ0QkIsIFNraXBGaXJzdEJsb2NrKSkgeworICAgIC8vIFdlIGhhdmUgYSBmdWxseSBjYWNoZWQgcmVzdWx0IGZvciB0aGlzIHF1ZXJ5IHRoZW4gd2UgY2FuIGp1c3QgcmV0dXJuIHRoZQorICAgIC8vIGNhY2hlZCByZXN1bHRzIGFuZCBwb3B1bGF0ZSB0aGUgdmlzaXRlZCBzZXQuICBIb3dldmVyLCB3ZSBoYXZlIHRvIHZlcmlmeQorICAgIC8vIHRoYXQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGNvbmZsaWN0aW5nIHJlc3VsdHMgZm9yIHRoZXNlIGJsb2Nrcy4gIENoZWNrCisgICAgLy8gdG8gZW5zdXJlIHRoYXQgaWYgYSBibG9jayBpbiB0aGUgcmVzdWx0cyBzZXQgaXMgaW4gdGhlIHZpc2l0ZWQgc2V0IHRoYXQKKyAgICAvLyBpdCB3YXMgZm9yIHRoZSBzYW1lIHBvaW50ZXIgcXVlcnkuCisgICAgaWYgKCFWaXNpdGVkLmVtcHR5KCkpIHsKKyAgICAgIGZvciAoTm9uTG9jYWxEZXBJbmZvOjppdGVyYXRvciBJID0gQ2FjaGUtPmJlZ2luKCksIEUgPSBDYWNoZS0+ZW5kKCk7CisgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAgIERlbnNlTWFwPEJhc2ljQmxvY2sqLCBWYWx1ZSo+OjppdGVyYXRvciBWSSA9IFZpc2l0ZWQuZmluZChJLT5nZXRCQigpKTsKKyAgICAgICAgaWYgKFZJID09IFZpc2l0ZWQuZW5kKCkgfHwgVkktPnNlY29uZCA9PSBQb2ludGVyLmdldEFkZHIoKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFdlIGhhdmUgYSBwb2ludGVyIG1pc21hdGNoIGluIGEgYmxvY2suICBKdXN0IHJldHVybiBjbG9iYmVyLCBzYXlpbmcKKyAgICAgICAgLy8gdGhhdCBzb21ldGhpbmcgd2FzIGNsb2JiZXJlZCBpbiB0aGlzIHJlc3VsdC4gIFdlIGNvdWxkIGFsc28gZG8gYQorICAgICAgICAvLyBub24tZnVsbHkgY2FjaGVkIHF1ZXJ5LCBidXQgdGhlcmUgaXMgbGl0dGxlIHBvaW50IGluIGRvaW5nIHRoaXMuCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBWYWx1ZSAqQWRkciA9IFBvaW50ZXIuZ2V0QWRkcigpOworICAgIGZvciAoTm9uTG9jYWxEZXBJbmZvOjppdGVyYXRvciBJID0gQ2FjaGUtPmJlZ2luKCksIEUgPSBDYWNoZS0+ZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgVmlzaXRlZC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSS0+Z2V0QkIoKSwgQWRkcikpOworICAgICAgaWYgKCFJLT5nZXRSZXN1bHQoKS5pc05vbkxvY2FsKCkpCisgICAgICAgIFJlc3VsdC5wdXNoX2JhY2soTm9uTG9jYWxEZXBSZXN1bHQoSS0+Z2V0QkIoKSwgSS0+Z2V0UmVzdWx0KCksIEFkZHIpKTsKKyAgICB9CisgICAgKytOdW1DYWNoZUNvbXBsZXRlTm9uTG9jYWxQdHI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLyBPdGhlcndpc2UsIGVpdGhlciB0aGlzIGlzIGEgbmV3IGJsb2NrLCBhIGJsb2NrIHdpdGggYW4gaW52YWxpZCBjYWNoZQorICAvLyBwb2ludGVyIG9yIG9uZSB0aGF0IHdlJ3JlIGFib3V0IHRvIGludmFsaWRhdGUgYnkgcHV0dGluZyBtb3JlIGluZm8gaW50byBpdAorICAvLyB0aGFuIGl0cyB2YWxpZCBjYWNoZSBpbmZvLiAgSWYgZW1wdHksIHRoZSByZXN1bHQgd2lsbCBiZSB2YWxpZCBjYWNoZSBpbmZvLAorICAvLyBvdGhlcndpc2UgaXQgaXNuJ3QuCisgIGlmIChDYWNoZS0+ZW1wdHkoKSkKKyAgICBDYWNoZUluZm8tPmZpcnN0ID0gQkJTa2lwRmlyc3RCbG9ja1BhaXIoU3RhcnRCQiwgU2tpcEZpcnN0QmxvY2spOworICBlbHNlCisgICAgQ2FjaGVJbmZvLT5maXJzdCA9IEJCU2tpcEZpcnN0QmxvY2tQYWlyKCk7CisgIAorICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgMzI+IFdvcmtsaXN0OworICBXb3JrbGlzdC5wdXNoX2JhY2soU3RhcnRCQik7CisgIAorICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBlbnRyaWVzIHRoYXQgd2Uga25vdyBhcmUgc29ydGVkLiAgUHJldmlvdXNseSBjYWNoZWQKKyAgLy8gZW50cmllcyB3aWxsIGFsbCBiZSBzb3J0ZWQuICBUaGUgZW50cmllcyB3ZSBhZGQgd2Ugb25seSBzb3J0IG9uIGRlbWFuZCAod2UKKyAgLy8gZG9uJ3QgaW5zZXJ0IGV2ZXJ5IGVsZW1lbnQgaW50byBpdHMgc29ydGVkIHBvc2l0aW9uKS4gIFdlIGtub3cgdGhhdCB3ZQorICAvLyB3b24ndCBnZXQgYW55IHJldXNlIGZyb20gY3VycmVudGx5IGluc2VydGVkIHZhbHVlcywgYmVjYXVzZSB3ZSBkb24ndAorICAvLyByZXZpc2l0IGJsb2NrcyBhZnRlciB3ZSBpbnNlcnQgaW5mbyBmb3IgdGhlbS4KKyAgdW5zaWduZWQgTnVtU29ydGVkRW50cmllcyA9IENhY2hlLT5zaXplKCk7CisgIERFQlVHKEFzc2VydFNvcnRlZCgqQ2FjaGUpKTsKKyAgCisgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgIEJhc2ljQmxvY2sgKkJCID0gV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgCisgICAgLy8gU2tpcCB0aGUgZmlyc3QgYmxvY2sgaWYgd2UgaGF2ZSBpdC4KKyAgICBpZiAoIVNraXBGaXJzdEJsb2NrKSB7CisgICAgICAvLyBBbmFseXplIHRoZSBkZXBlbmRlbmN5IG9mICpQb2ludGVyIGluIEZyb21CQi4gIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUKKyAgICAgIC8vIGJlZW4gaGVyZS4KKyAgICAgIGFzc2VydChWaXNpdGVkLmNvdW50KEJCKSAmJiAiU2hvdWxkIGNoZWNrICd2aXNpdGVkJyBiZWZvcmUgYWRkaW5nIHRvIFdMIik7CisKKyAgICAgIC8vIEdldCB0aGUgZGVwZW5kZW5jeSBpbmZvIGZvciBQb2ludGVyIGluIEJCLiAgSWYgd2UgaGF2ZSBjYWNoZWQKKyAgICAgIC8vIGluZm9ybWF0aW9uLCB3ZSB3aWxsIHVzZSBpdCwgb3RoZXJ3aXNlIHdlIGNvbXB1dGUgaXQuCisgICAgICBERUJVRyhBc3NlcnRTb3J0ZWQoKkNhY2hlLCBOdW1Tb3J0ZWRFbnRyaWVzKSk7CisgICAgICBNZW1EZXBSZXN1bHQgRGVwID0gR2V0Tm9uTG9jYWxJbmZvRm9yQmxvY2soUG9pbnRlci5nZXRBZGRyKCksIFBvaW50ZWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZCwgQkIsIENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNvcnRlZEVudHJpZXMpOworICAgICAgCisgICAgICAvLyBJZiB3ZSBnb3QgYSBEZWYgb3IgQ2xvYmJlciwgYWRkIHRoaXMgdG8gdGhlIGxpc3Qgb2YgcmVzdWx0cy4KKyAgICAgIGlmICghRGVwLmlzTm9uTG9jYWwoKSkgeworICAgICAgICBSZXN1bHQucHVzaF9iYWNrKE5vbkxvY2FsRGVwUmVzdWx0KEJCLCBEZXAsIFBvaW50ZXIuZ2V0QWRkcigpKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBJZiAnUG9pbnRlcicgaXMgYW4gaW5zdHJ1Y3Rpb24gZGVmaW5lZCBpbiB0aGlzIGJsb2NrLCB0aGVuIHdlIG5lZWQgdG8gZG8KKyAgICAvLyBwaGkgdHJhbnNsYXRpb24gdG8gY2hhbmdlIGl0IGludG8gYSB2YWx1ZSBsaXZlIGluIHRoZSBwcmVkZWNlc3NvciBibG9jay4KKyAgICAvLyBJZiBub3QsIHdlIGp1c3QgYWRkIHRoZSBwcmVkZWNlc3NvcnMgdG8gdGhlIHdvcmtsaXN0IGFuZCBzY2FuIHRoZW0gd2l0aAorICAgIC8vIHRoZSBzYW1lIFBvaW50ZXIuCisgICAgaWYgKCFQb2ludGVyLk5lZWRzUEhJVHJhbnNsYXRpb25Gcm9tQmxvY2soQkIpKSB7CisgICAgICBTa2lwRmlyc3RCbG9jayA9IGZhbHNlOworICAgICAgZm9yIChCYXNpY0Jsb2NrICoqUEkgPSBQcmVkQ2FjaGUtPkdldFByZWRzKEJCKTsgKlBJOyArK1BJKSB7CisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGhhdmVuJ3QgbG9va2VkIGF0IHRoaXMgYmxvY2sgeWV0LgorICAgICAgICBzdGQ6OnBhaXI8RGVuc2VNYXA8QmFzaWNCbG9jayosVmFsdWUqPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgICAgICAgSW5zZXJ0UmVzID0gVmlzaXRlZC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKlBJLCBQb2ludGVyLmdldEFkZHIoKSkpOworICAgICAgICBpZiAoSW5zZXJ0UmVzLnNlY29uZCkgeworICAgICAgICAgIC8vIEZpcnN0IHRpbWUgd2UndmUgbG9va2VkIGF0ICpQSS4KKyAgICAgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soKlBJKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBzZWVuIHRoaXMgYmxvY2sgYmVmb3JlLCBidXQgaXQgd2FzIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgICAgLy8gcG9pbnRlciB0aGVuIHdlIGhhdmUgYSBwaGkgdHJhbnNsYXRpb24gZmFpbHVyZSBhbmQgd2UgaGF2ZSB0byB0cmVhdAorICAgICAgICAvLyB0aGlzIGFzIGEgY2xvYmJlci4KKyAgICAgICAgaWYgKEluc2VydFJlcy5maXJzdC0+c2Vjb25kICE9IFBvaW50ZXIuZ2V0QWRkcigpKQorICAgICAgICAgIGdvdG8gUHJlZFRyYW5zbGF0aW9uRmFpbHVyZTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvLyBXZSBkbyBuZWVkIHRvIGRvIHBoaSB0cmFuc2xhdGlvbiwgaWYgd2Uga25vdyBhaGVhZCBvZiB0aW1lIHdlIGNhbid0IHBoaQorICAgIC8vIHRyYW5zbGF0ZSB0aGlzIHZhbHVlLCBkb24ndCBldmVuIHRyeS4KKyAgICBpZiAoIVBvaW50ZXIuSXNQb3RlbnRpYWxseVBISVRyYW5zbGF0YWJsZSgpKQorICAgICAgZ290byBQcmVkVHJhbnNsYXRpb25GYWlsdXJlOworICAgIAorICAgIC8vIFdlIG1heSBoYXZlIGFkZGVkIHZhbHVlcyB0byB0aGUgY2FjaGUgbGlzdCBiZWZvcmUgdGhpcyBQSEkgdHJhbnNsYXRpb24uCisgICAgLy8gSWYgc28sIHdlIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB0byBlbnN1cmUgdGhhdCB0aGUgY2FjaGUgcmVtYWlucyBzb3J0ZWQuCisgICAgLy8gU29ydCBpdCBub3cgKGlmIG5lZWRlZCkgc28gdGhhdCByZWN1cnNpdmUgaW52b2NhdGlvbnMgb2YKKyAgICAvLyBnZXROb25Mb2NhbFBvaW50ZXJEZXBGcm9tQkIgYW5kIG90aGVyIHJvdXRpbmVzIHRoYXQgY291bGQgcmV1c2UgdGhlIGNhY2hlCisgICAgLy8gdmFsdWUgd2lsbCBvbmx5IHNlZSBwcm9wZXJseSBzb3J0ZWQgY2FjaGUgYXJyYXlzLgorICAgIGlmIChDYWNoZSAmJiBOdW1Tb3J0ZWRFbnRyaWVzICE9IENhY2hlLT5zaXplKCkpIHsKKyAgICAgIFNvcnROb25Mb2NhbERlcEluZm9DYWNoZSgqQ2FjaGUsIE51bVNvcnRlZEVudHJpZXMpOworICAgICAgTnVtU29ydGVkRW50cmllcyA9IENhY2hlLT5zaXplKCk7CisgICAgfQorICAgIENhY2hlID0gMDsKKyAgICAKKyAgICBmb3IgKEJhc2ljQmxvY2sgKipQSSA9IFByZWRDYWNoZS0+R2V0UHJlZHMoQkIpOyAqUEk7ICsrUEkpIHsKKyAgICAgIEJhc2ljQmxvY2sgKlByZWQgPSAqUEk7CisgICAgICAKKyAgICAgIC8vIEdldCB0aGUgUEhJIHRyYW5zbGF0ZWQgcG9pbnRlciBpbiB0aGlzIHByZWRlY2Vzc29yLiAgVGhpcyBjYW4gZmFpbCBpZgorICAgICAgLy8gbm90IHRyYW5zbGF0YWJsZSwgaW4gd2hpY2ggY2FzZSB0aGUgZ2V0QWRkcigpIHJldHVybnMgbnVsbC4KKyAgICAgIFBISVRyYW5zQWRkciBQcmVkUG9pbnRlcihQb2ludGVyKTsKKyAgICAgIFByZWRQb2ludGVyLlBISVRyYW5zbGF0ZVZhbHVlKEJCLCBQcmVkLCAwKTsKKworICAgICAgVmFsdWUgKlByZWRQdHJWYWwgPSBQcmVkUG9pbnRlci5nZXRBZGRyKCk7CisgICAgICAKKyAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgdmlzaXRlZCB0aGlzIHByZWQgYmxvY2sgd2l0aCBhbm90aGVyCisgICAgICAvLyBwb2ludGVyLiAgSWYgc28sIHdlIGNhbid0IGRvIHRoaXMgbG9va3VwLiAgVGhpcyBmYWlsdXJlIGNhbiBvY2N1cgorICAgICAgLy8gd2l0aCBQSEkgdHJhbnNsYXRpb24gd2hlbiBhIGNyaXRpY2FsIGVkZ2UgZXhpc3RzIGFuZCB0aGUgUEhJIG5vZGUgaW4KKyAgICAgIC8vIHRoZSBzdWNjZXNzb3IgdHJhbnNsYXRlcyB0byBhIHBvaW50ZXIgdmFsdWUgZGlmZmVyZW50IHRoYW4gdGhlCisgICAgICAvLyBwb2ludGVyIHRoZSBibG9jayB3YXMgZmlyc3QgYW5hbHl6ZWQgd2l0aC4KKyAgICAgIHN0ZDo6cGFpcjxEZW5zZU1hcDxCYXNpY0Jsb2NrKixWYWx1ZSo+OjppdGVyYXRvciwgYm9vbD4KKyAgICAgICAgSW5zZXJ0UmVzID0gVmlzaXRlZC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUHJlZCwgUHJlZFB0clZhbCkpOworCisgICAgICBpZiAoIUluc2VydFJlcy5zZWNvbmQpIHsKKyAgICAgICAgLy8gSWYgdGhlIHByZWRlY2Vzc29yIHdhcyB2aXNpdGVkIHdpdGggUHJlZFB0ciwgdGhlbiB3ZSBhbHJlYWR5IGRpZAorICAgICAgICAvLyB0aGUgYW5hbHlzaXMgYW5kIGNhbiBpZ25vcmUgaXQuCisgICAgICAgIGlmIChJbnNlcnRSZXMuZmlyc3QtPnNlY29uZCA9PSBQcmVkUHRyVmFsKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgYmxvY2sgd2FzIHByZXZpb3VzbHkgYW5hbHl6ZWQgd2l0aCBhIGRpZmZlcmVudAorICAgICAgICAvLyBwb2ludGVyLiAgV2UgY2FuJ3QgcmVwcmVzZW50IHRoZSByZXN1bHQgb2YgdGhpcyBjYXNlLCBzbyB3ZSBqdXN0CisgICAgICAgIC8vIHRyZWF0IHRoaXMgYXMgYSBwaGkgdHJhbnNsYXRpb24gZmFpbHVyZS4KKyAgICAgICAgZ290byBQcmVkVHJhbnNsYXRpb25GYWlsdXJlOworICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiBQSEkgdHJhbnNsYXRpb24gd2FzIHVuYWJsZSB0byBmaW5kIGFuIGF2YWlsYWJsZSBwb2ludGVyIGluIHRoaXMKKyAgICAgIC8vIHByZWRlY2Vzc29yLCB0aGVuIHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIHBvaW50ZXIgaXMgY2xvYmJlcmVkIGluCisgICAgICAvLyB0aGF0IHByZWRlY2Vzc29yLiAgV2UgY2FuIHN0aWxsIGRvIFBSRSBvZiB0aGUgbG9hZCwgd2hpY2ggd291bGQgaW5zZXJ0CisgICAgICAvLyBhIGNvbXB1dGF0aW9uIG9mIHRoZSBwb2ludGVyIGluIHRoaXMgcHJlZGVjZXNzb3IuCisgICAgICBpZiAoUHJlZFB0clZhbCA9PSAwKSB7CisgICAgICAgIC8vIEFkZCB0aGUgZW50cnkgdG8gdGhlIFJlc3VsdCBsaXN0LgorICAgICAgICBOb25Mb2NhbERlcFJlc3VsdCBFbnRyeShQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1EZXBSZXN1bHQ6OmdldENsb2JiZXIoUHJlZC0+Z2V0VGVybWluYXRvcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZFB0clZhbCk7CisgICAgICAgIFJlc3VsdC5wdXNoX2JhY2soRW50cnkpOworCisgICAgICAgIC8vIFNpbmNlIHdlIGhhZCBhIHBoaSB0cmFuc2xhdGlvbiBmYWlsdXJlLCB0aGUgY2FjaGUgZm9yIENhY2hlS2V5IHdvbid0CisgICAgICAgIC8vIGluY2x1ZGUgYWxsIG9mIHRoZSBlbnRyaWVzIHRoYXQgd2UgbmVlZCB0byBpbW1lZGlhdGVseSBzYXRpc2Z5IGZ1dHVyZQorICAgICAgICAvLyBxdWVyaWVzLiAgTWFyayB0aGlzIGluIE5vbkxvY2FsUG9pbnRlckRlcHMgYnkgc2V0dGluZyB0aGUKKyAgICAgICAgLy8gQkJTa2lwRmlyc3RCbG9ja1BhaXIgcG9pbnRlciB0byBudWxsLiAgVGhpcyByZXF1aXJlcyByZXVzZSBvZiB0aGUKKyAgICAgICAgLy8gY2FjaGVkIHZhbHVlIHRvIGRvIG1vcmUgd29yayBidXQgbm90IG1pc3MgdGhlIHBoaSB0cmFucyBmYWlsdXJlLgorICAgICAgICBOb25Mb2NhbFBvaW50ZXJEZXBzW0NhY2hlS2V5XS5maXJzdCA9IEJCU2tpcEZpcnN0QmxvY2tQYWlyKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBGSVhNRTogaXQgaXMgZW50aXJlbHkgcG9zc2libGUgdGhhdCBQSEkgdHJhbnNsYXRpbmcgd2lsbCBlbmQgdXAgd2l0aAorICAgICAgLy8gdGhlIHNhbWUgdmFsdWUuICBDb25zaWRlciBQSEkgdHJhbnNsYXRpbmcgc29tZXRoaW5nIGxpa2U6CisgICAgICAvLyBYID0gcGhpIFt4LCBiYjFdLCBbeSwgYmIyXS4gIFBISSB0cmFuc2xhdGluZyBmb3IgYmIxIGRvZXNuJ3QgKm5lZWQqCisgICAgICAvLyB0byByZWN1cnNlIGhlcmUsIHBlZGFudGljYWxseSBzcGVha2luZy4KKyAgICAgIAorICAgICAgLy8gSWYgd2UgaGF2ZSBhIHByb2JsZW0gcGhpIHRyYW5zbGF0aW5nLCBmYWxsIHRocm91Z2ggdG8gdGhlIGNvZGUgYmVsb3cKKyAgICAgIC8vIHRvIGhhbmRsZSB0aGUgZmFpbHVyZSBjb25kaXRpb24uCisgICAgICBpZiAoZ2V0Tm9uTG9jYWxQb2ludGVyRGVwRnJvbUJCKFByZWRQb2ludGVyLCBQb2ludGVlU2l6ZSwgaXNMb2FkLCBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQsIFZpc2l0ZWQpKQorICAgICAgICBnb3RvIFByZWRUcmFuc2xhdGlvbkZhaWx1cmU7CisgICAgfQorICAgIAorICAgIC8vIFJlZnJlc2ggdGhlIENhY2hlSW5mby9DYWNoZSBwb2ludGVyIHNvIHRoYXQgaXQgaXNuJ3QgaW52YWxpZGF0ZWQuCisgICAgQ2FjaGVJbmZvID0gJk5vbkxvY2FsUG9pbnRlckRlcHNbQ2FjaGVLZXldOworICAgIENhY2hlID0gJkNhY2hlSW5mby0+c2Vjb25kOworICAgIE51bVNvcnRlZEVudHJpZXMgPSBDYWNoZS0+c2l6ZSgpOworICAgIAorICAgIC8vIFNpbmNlIHdlIGRpZCBwaGkgdHJhbnNsYXRpb24sIHRoZSAiQ2FjaGUiIHNldCB3b24ndCBjb250YWluIGFsbCBvZiB0aGUKKyAgICAvLyByZXN1bHRzIGZvciB0aGUgcXVlcnkuICBUaGlzIGlzIG9rICh3ZSBjYW4gc3RpbGwgdXNlIGl0IHRvIGFjY2VsZXJhdGUKKyAgICAvLyBzcGVjaWZpYyBibG9jayBxdWVyaWVzKSBidXQgd2UgY2FuJ3QgZG8gdGhlIGZhc3RwYXRoICJyZXR1cm4gYWxsCisgICAgLy8gcmVzdWx0cyBmcm9tIHRoZSBzZXQiICBDbGVhciBvdXQgdGhlIGluZGljYXRvciBmb3IgdGhpcy4KKyAgICBDYWNoZUluZm8tPmZpcnN0ID0gQkJTa2lwRmlyc3RCbG9ja1BhaXIoKTsKKyAgICBTa2lwRmlyc3RCbG9jayA9IGZhbHNlOworICAgIGNvbnRpbnVlOworCisgIFByZWRUcmFuc2xhdGlvbkZhaWx1cmU6CisgICAgCisgICAgaWYgKENhY2hlID09IDApIHsKKyAgICAgIC8vIFJlZnJlc2ggdGhlIENhY2hlSW5mby9DYWNoZSBwb2ludGVyIGlmIGl0IGdvdCBpbnZhbGlkYXRlZC4KKyAgICAgIENhY2hlSW5mbyA9ICZOb25Mb2NhbFBvaW50ZXJEZXBzW0NhY2hlS2V5XTsKKyAgICAgIENhY2hlID0gJkNhY2hlSW5mby0+c2Vjb25kOworICAgICAgTnVtU29ydGVkRW50cmllcyA9IENhY2hlLT5zaXplKCk7CisgICAgfQorICAgIAorICAgIC8vIFNpbmNlIHdlIGZhaWxlZCBwaGkgdHJhbnNsYXRpb24sIHRoZSAiQ2FjaGUiIHNldCB3b24ndCBjb250YWluIGFsbCBvZiB0aGUKKyAgICAvLyByZXN1bHRzIGZvciB0aGUgcXVlcnkuICBUaGlzIGlzIG9rICh3ZSBjYW4gc3RpbGwgdXNlIGl0IHRvIGFjY2VsZXJhdGUKKyAgICAvLyBzcGVjaWZpYyBibG9jayBxdWVyaWVzKSBidXQgd2UgY2FuJ3QgZG8gdGhlIGZhc3RwYXRoICJyZXR1cm4gYWxsCisgICAgLy8gcmVzdWx0cyBmcm9tIHRoZSBzZXQiLiAgQ2xlYXIgb3V0IHRoZSBpbmRpY2F0b3IgZm9yIHRoaXMuCisgICAgQ2FjaGVJbmZvLT5maXJzdCA9IEJCU2tpcEZpcnN0QmxvY2tQYWlyKCk7CisgICAgCisgICAgLy8gSWYgKm5vdGhpbmcqIHdvcmtzLCBtYXJrIHRoZSBwb2ludGVyIGFzIGJlaW5nIGNsb2JiZXJlZCBieSB0aGUgZmlyc3QKKyAgICAvLyBpbnN0cnVjdGlvbiBpbiB0aGlzIGJsb2NrLgorICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgbWFnaWMgZmlyc3QgYmxvY2ssIHJldHVybiB0aGlzIGFzIGEgY2xvYmJlciBvZiB0aGUgd2hvbGUKKyAgICAvLyBpbmNvbWluZyB2YWx1ZS4gIFNpbmNlIHdlIGNhbid0IHBoaSB0cmFuc2xhdGUgdG8gb25lIG9mIHRoZSBwcmVkZWNlc3NvcnMsCisgICAgLy8gd2UgaGF2ZSB0byBiYWlsIG91dC4KKyAgICBpZiAoU2tpcEZpcnN0QmxvY2spCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICBmb3IgKE5vbkxvY2FsRGVwSW5mbzo6cmV2ZXJzZV9pdGVyYXRvciBJID0gQ2FjaGUtPnJiZWdpbigpOyA7ICsrSSkgeworICAgICAgYXNzZXJ0KEkgIT0gQ2FjaGUtPnJlbmQoKSAmJiAiRGlkbid0IGZpbmQgY3VycmVudCBibG9jaz8/Iik7CisgICAgICBpZiAoSS0+Z2V0QkIoKSAhPSBCQikKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIGFzc2VydChJLT5nZXRSZXN1bHQoKS5pc05vbkxvY2FsKCkgJiYKKyAgICAgICAgICAgICAiU2hvdWxkIG9ubHkgYmUgaGVyZSB3aXRoIHRyYW5zcGFyZW50IGJsb2NrIik7CisgICAgICBJLT5zZXRSZXN1bHQoTWVtRGVwUmVzdWx0OjpnZXRDbG9iYmVyKEJCLT5iZWdpbigpKSk7CisgICAgICBSZXZlcnNlTm9uTG9jYWxQdHJEZXBzW0JCLT5iZWdpbigpXS5pbnNlcnQoQ2FjaGVLZXkpOworICAgICAgUmVzdWx0LnB1c2hfYmFjayhOb25Mb2NhbERlcFJlc3VsdChJLT5nZXRCQigpLCBJLT5nZXRSZXN1bHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlci5nZXRBZGRyKCkpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIE9rYXksIHdlJ3JlIGRvbmUgbm93LiAgSWYgd2UgYWRkZWQgbmV3IHZhbHVlcyB0byB0aGUgY2FjaGUsIHJlLXNvcnQgaXQuCisgIFNvcnROb25Mb2NhbERlcEluZm9DYWNoZSgqQ2FjaGUsIE51bVNvcnRlZEVudHJpZXMpOworICBERUJVRyhBc3NlcnRTb3J0ZWQoKkNhY2hlKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFJlbW92ZUNhY2hlZE5vbkxvY2FsUG9pbnRlckRlcGVuZGVuY2llcyAtIElmIFAgZXhpc3RzIGluCisvLy8gQ2FjaGVkTm9uTG9jYWxQb2ludGVySW5mbywgcmVtb3ZlIGl0Lgordm9pZCBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6OgorUmVtb3ZlQ2FjaGVkTm9uTG9jYWxQb2ludGVyRGVwZW5kZW5jaWVzKFZhbHVlSXNMb2FkUGFpciBQKSB7CisgIENhY2hlZE5vbkxvY2FsUG9pbnRlckluZm86Oml0ZXJhdG9yIEl0ID0gCisgICAgTm9uTG9jYWxQb2ludGVyRGVwcy5maW5kKFApOworICBpZiAoSXQgPT0gTm9uTG9jYWxQb2ludGVyRGVwcy5lbmQoKSkgcmV0dXJuOworICAKKyAgLy8gUmVtb3ZlIGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGUgQkItPnZhbCBtYXAuICBUaGlzIGludm9sdmVzIHJlbW92aW5nCisgIC8vIGluc3RydWN0aW9ucyBmcm9tIHRoZSByZXZlcnNlIG1hcC4KKyAgTm9uTG9jYWxEZXBJbmZvICZQSW5mbyA9IEl0LT5zZWNvbmQuc2Vjb25kOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBJbmZvLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBJbnN0cnVjdGlvbiAqVGFyZ2V0ID0gUEluZm9baV0uZ2V0UmVzdWx0KCkuZ2V0SW5zdCgpOworICAgIGlmIChUYXJnZXQgPT0gMCkgY29udGludWU7ICAvLyBJZ25vcmUgbm9uLWxvY2FsIGRlcCByZXN1bHRzLgorICAgIGFzc2VydChUYXJnZXQtPmdldFBhcmVudCgpID09IFBJbmZvW2ldLmdldEJCKCkpOworICAgIAorICAgIC8vIEVsaW1pbmF0aW5nIHRoZSBkaXJ0eSBlbnRyeSBmcm9tICdDYWNoZScsIHNvIHVwZGF0ZSB0aGUgcmV2ZXJzZSBpbmZvLgorICAgIFJlbW92ZUZyb21SZXZlcnNlTWFwKFJldmVyc2VOb25Mb2NhbFB0ckRlcHMsIFRhcmdldCwgUCk7CisgIH0KKyAgCisgIC8vIFJlbW92ZSBQIGZyb20gTm9uTG9jYWxQb2ludGVyRGVwcyAod2hpY2ggZGVsZXRlcyBOb25Mb2NhbERlcEluZm8pLgorICBOb25Mb2NhbFBvaW50ZXJEZXBzLmVyYXNlKEl0KTsKK30KKworCisvLy8gaW52YWxpZGF0ZUNhY2hlZFBvaW50ZXJJbmZvIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbnZhbGlkYXRlIGNhY2hlZAorLy8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciwgYmVjYXVzZSBpdCBtYXkgYmUgdG9vCisvLy8gY29uc2VydmF0aXZlIGluIG1lbWRlcC4gIFRoaXMgaXMgYW4gb3B0aW9uYWwgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHdoZW4KKy8vLyB0aGUgY2xpZW50IGRldGVjdHMgYW4gZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgcG9pbnRlciBhbmQgc29tZSBvdGhlcgorLy8vIHZhbHVlIGFuZCByZXBsYWNlcyB0aGUgb3RoZXIgdmFsdWUgd2l0aCBwdHIuIFRoaXMgY2FuIG1ha2UgUHRyIGF2YWlsYWJsZQorLy8vIGluIG1vcmUgcGxhY2VzIHRoYXQgY2FjaGVkIGluZm8gZG9lcyBub3QgbmVjZXNzYXJpbHkga2VlcC4KK3ZvaWQgTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzOjppbnZhbGlkYXRlQ2FjaGVkUG9pbnRlckluZm8oVmFsdWUgKlB0cikgeworICAvLyBJZiBQdHIgaXNuJ3QgcmVhbGx5IGEgcG9pbnRlciwganVzdCBpZ25vcmUgaXQuCisgIGlmICghUHRyLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpIHJldHVybjsKKyAgLy8gRmx1c2ggc3RvcmUgaW5mbyBmb3IgdGhlIHBvaW50ZXIuCisgIFJlbW92ZUNhY2hlZE5vbkxvY2FsUG9pbnRlckRlcGVuZGVuY2llcyhWYWx1ZUlzTG9hZFBhaXIoUHRyLCBmYWxzZSkpOworICAvLyBGbHVzaCBsb2FkIGluZm8gZm9yIHRoZSBwb2ludGVyLgorICBSZW1vdmVDYWNoZWROb25Mb2NhbFBvaW50ZXJEZXBlbmRlbmNpZXMoVmFsdWVJc0xvYWRQYWlyKFB0ciwgdHJ1ZSkpOworfQorCisvLy8gaW52YWxpZGF0ZUNhY2hlZFByZWRlY2Vzc29ycyAtIENsZWFyIHRoZSBQcmVkSXRlcmF0b3JDYWNoZSBpbmZvLgorLy8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSB3aGVuIHRoZSBDRkcgY2hhbmdlcywgZS5nLiwgZHVlIHRvIHNwbGl0dGluZworLy8vIGNyaXRpY2FsIGVkZ2VzLgordm9pZCBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM6OmludmFsaWRhdGVDYWNoZWRQcmVkZWNlc3NvcnMoKSB7CisgIFByZWRDYWNoZS0+Y2xlYXIoKTsKK30KKworLy8vIHJlbW92ZUluc3RydWN0aW9uIC0gUmVtb3ZlIGFuIGluc3RydWN0aW9uIGZyb20gdGhlIGRlcGVuZGVuY2UgYW5hbHlzaXMsCisvLy8gdXBkYXRpbmcgdGhlIGRlcGVuZGVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgcHJldmlvdXNseSBkZXBlbmRlZCBvbiBpdC4KKy8vLyBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBrZWVwIHRoZSBjYWNoZSBjb2hlcmVudCB1c2luZyB0aGUgcmV2ZXJzZSBtYXAuCit2b2lkIE1lbW9yeURlcGVuZGVuY2VBbmFseXNpczo6cmVtb3ZlSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKlJlbUluc3QpIHsKKyAgLy8gV2FsayB0aHJvdWdoIHRoZSBOb24tbG9jYWwgZGVwZW5kZW5jaWVzLCByZW1vdmluZyB0aGlzIG9uZSBhcyB0aGUgdmFsdWUKKyAgLy8gZm9yIGFueSBjYWNoZWQgcXVlcmllcy4KKyAgTm9uTG9jYWxEZXBNYXBUeXBlOjppdGVyYXRvciBOTERJID0gTm9uTG9jYWxEZXBzLmZpbmQoUmVtSW5zdCk7CisgIGlmIChOTERJICE9IE5vbkxvY2FsRGVwcy5lbmQoKSkgeworICAgIE5vbkxvY2FsRGVwSW5mbyAmQmxvY2tNYXAgPSBOTERJLT5zZWNvbmQuZmlyc3Q7CisgICAgZm9yIChOb25Mb2NhbERlcEluZm86Oml0ZXJhdG9yIERJID0gQmxvY2tNYXAuYmVnaW4oKSwgREUgPSBCbG9ja01hcC5lbmQoKTsKKyAgICAgICAgIERJICE9IERFOyArK0RJKQorICAgICAgaWYgKEluc3RydWN0aW9uICpJbnN0ID0gREktPmdldFJlc3VsdCgpLmdldEluc3QoKSkKKyAgICAgICAgUmVtb3ZlRnJvbVJldmVyc2VNYXAoUmV2ZXJzZU5vbkxvY2FsRGVwcywgSW5zdCwgUmVtSW5zdCk7CisgICAgTm9uTG9jYWxEZXBzLmVyYXNlKE5MREkpOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSBhIGNhY2hlZCBsb2NhbCBkZXBlbmRlbmNlIHF1ZXJ5IGZvciB0aGlzIGluc3RydWN0aW9uLCByZW1vdmUgaXQuCisgIC8vCisgIExvY2FsRGVwTWFwVHlwZTo6aXRlcmF0b3IgTG9jYWxEZXBFbnRyeSA9IExvY2FsRGVwcy5maW5kKFJlbUluc3QpOworICBpZiAoTG9jYWxEZXBFbnRyeSAhPSBMb2NhbERlcHMuZW5kKCkpIHsKKyAgICAvLyBSZW1vdmUgdXMgZnJvbSBEZXBJbnN0J3MgcmV2ZXJzZSBzZXQgbm93IHRoYXQgdGhlIGxvY2FsIGRlcCBpbmZvIGlzIGdvbmUuCisgICAgaWYgKEluc3RydWN0aW9uICpJbnN0ID0gTG9jYWxEZXBFbnRyeS0+c2Vjb25kLmdldEluc3QoKSkKKyAgICAgIFJlbW92ZUZyb21SZXZlcnNlTWFwKFJldmVyc2VMb2NhbERlcHMsIEluc3QsIFJlbUluc3QpOworCisgICAgLy8gUmVtb3ZlIHRoaXMgbG9jYWwgZGVwZW5kZW5jeSBpbmZvLgorICAgIExvY2FsRGVwcy5lcmFzZShMb2NhbERlcEVudHJ5KTsKKyAgfQorICAKKyAgLy8gSWYgd2UgaGF2ZSBhbnkgY2FjaGVkIHBvaW50ZXIgZGVwZW5kZW5jaWVzIG9uIHRoaXMgaW5zdHJ1Y3Rpb24sIHJlbW92ZQorICAvLyB0aGVtLiAgSWYgdGhlIGluc3RydWN0aW9uIGhhcyBub24tcG9pbnRlciB0eXBlLCB0aGVuIGl0IGNhbid0IGJlIGEgcG9pbnRlcgorICAvLyBiYXNlLgorICAKKyAgLy8gUmVtb3ZlIGl0IGZyb20gYm90aCB0aGUgbG9hZCBpbmZvIGFuZCB0aGUgc3RvcmUgaW5mby4gIFRoZSBpbnN0cnVjdGlvbgorICAvLyBjYW4ndCBiZSBpbiBlaXRoZXIgb2YgdGhlc2UgbWFwcyBpZiBpdCBpcyBub24tcG9pbnRlci4KKyAgaWYgKFJlbUluc3QtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkgeworICAgIFJlbW92ZUNhY2hlZE5vbkxvY2FsUG9pbnRlckRlcGVuZGVuY2llcyhWYWx1ZUlzTG9hZFBhaXIoUmVtSW5zdCwgZmFsc2UpKTsKKyAgICBSZW1vdmVDYWNoZWROb25Mb2NhbFBvaW50ZXJEZXBlbmRlbmNpZXMoVmFsdWVJc0xvYWRQYWlyKFJlbUluc3QsIHRydWUpKTsKKyAgfQorICAKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdGhpbmdzIHRoYXQgZGVwZW5kIG9uIHRoZSBpbnN0cnVjdGlvbiB3ZSdyZSByZW1vdmluZy4KKyAgLy8gCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxJbnN0cnVjdGlvbiosIEluc3RydWN0aW9uKj4sIDg+IFJldmVyc2VEZXBzVG9BZGQ7CisKKyAgLy8gSWYgd2UgZmluZCBSZW1JbnN0IGFzIGEgY2xvYmJlciBvciBEZWYgaW4gYW55IG9mIHRoZSBtYXBzIGZvciBvdGhlciB2YWx1ZXMsCisgIC8vIHdlIG5lZWQgdG8gcmVwbGFjZSBpdHMgZW50cnkgd2l0aCBhIGRpcnR5IHZlcnNpb24gb2YgdGhlIGluc3RydWN0aW9uIGFmdGVyCisgIC8vIGl0LiAgSWYgUmVtSW5zdCBpcyBhIHRlcm1pbmF0b3IsIHdlIHVzZSBhIG51bGwgZGlydHkgdmFsdWUuCisgIC8vCisgIC8vIFVzaW5nIGEgZGlydHkgdmVyc2lvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgUmVtSW5zdCBzYXZlcyBoYXZpbmcgdG8gc2NhbgorICAvLyB0aGUgZW50aXJlIGJsb2NrIHRvIGdldCB0byB0aGlzIHBvaW50LgorICBNZW1EZXBSZXN1bHQgTmV3RGlydHlWYWw7CisgIGlmICghUmVtSW5zdC0+aXNUZXJtaW5hdG9yKCkpCisgICAgTmV3RGlydHlWYWwgPSBNZW1EZXBSZXN1bHQ6OmdldERpcnR5KCsrQmFzaWNCbG9jazo6aXRlcmF0b3IoUmVtSW5zdCkpOworICAKKyAgUmV2ZXJzZURlcE1hcFR5cGU6Oml0ZXJhdG9yIFJldmVyc2VEZXBJdCA9IFJldmVyc2VMb2NhbERlcHMuZmluZChSZW1JbnN0KTsKKyAgaWYgKFJldmVyc2VEZXBJdCAhPSBSZXZlcnNlTG9jYWxEZXBzLmVuZCgpKSB7CisgICAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24qLCA0PiAmUmV2ZXJzZURlcHMgPSBSZXZlcnNlRGVwSXQtPnNlY29uZDsKKyAgICAvLyBSZW1JbnN0IGNhbid0IGJlIHRoZSB0ZXJtaW5hdG9yIGlmIGl0IGhhcyBsb2NhbCBzdHVmZiBkZXBlbmRpbmcgb24gaXQuCisgICAgYXNzZXJ0KCFSZXZlcnNlRGVwcy5lbXB0eSgpICYmICFpc2E8VGVybWluYXRvckluc3Q+KFJlbUluc3QpICYmCisgICAgICAgICAgICJOb3RoaW5nIGNhbiBsb2NhbGx5IGRlcGVuZCBvbiBhIHRlcm1pbmF0b3IiKTsKKyAgICAKKyAgICBmb3IgKFNtYWxsUHRyU2V0PEluc3RydWN0aW9uKiwgND46Oml0ZXJhdG9yIEkgPSBSZXZlcnNlRGVwcy5iZWdpbigpLAorICAgICAgICAgRSA9IFJldmVyc2VEZXBzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgSW5zdHJ1Y3Rpb24gKkluc3REZXBlbmRpbmdPblJlbUluc3QgPSAqSTsKKyAgICAgIGFzc2VydChJbnN0RGVwZW5kaW5nT25SZW1JbnN0ICE9IFJlbUluc3QgJiYKKyAgICAgICAgICAgICAiQWxyZWFkeSByZW1vdmVkIG91ciBsb2NhbCBkZXAgaW5mbyIpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBMb2NhbERlcHNbSW5zdERlcGVuZGluZ09uUmVtSW5zdF0gPSBOZXdEaXJ0eVZhbDsKKyAgICAgIAorICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlbWVtYmVyIHRoYXQgbmV3IHRoaW5ncyBkZXBlbmQgb24gTmV3RGVwSW5zdC4KKyAgICAgIGFzc2VydChOZXdEaXJ0eVZhbC5nZXRJbnN0KCkgJiYgIlRoZXJlIGlzIG5vIHdheSBzb21ldGhpbmcgZWxzZSBjYW4gaGF2ZSAiCisgICAgICAgICAgICAgImEgbG9jYWwgZGVwIG9uIHRoaXMgaWYgaXQgaXMgYSB0ZXJtaW5hdG9yISIpOworICAgICAgUmV2ZXJzZURlcHNUb0FkZC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTmV3RGlydHlWYWwuZ2V0SW5zdCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3REZXBlbmRpbmdPblJlbUluc3QpKTsKKyAgICB9CisgICAgCisgICAgUmV2ZXJzZUxvY2FsRGVwcy5lcmFzZShSZXZlcnNlRGVwSXQpOworCisgICAgLy8gQWRkIG5ldyByZXZlcnNlIGRlcHMgYWZ0ZXIgc2Nhbm5pbmcgdGhlIHNldCwgdG8gYXZvaWQgaW52YWxpZGF0aW5nIHRoZQorICAgIC8vICdSZXZlcnNlRGVwcycgcmVmZXJlbmNlLgorICAgIHdoaWxlICghUmV2ZXJzZURlcHNUb0FkZC5lbXB0eSgpKSB7CisgICAgICBSZXZlcnNlTG9jYWxEZXBzW1JldmVyc2VEZXBzVG9BZGQuYmFjaygpLmZpcnN0XQorICAgICAgICAuaW5zZXJ0KFJldmVyc2VEZXBzVG9BZGQuYmFjaygpLnNlY29uZCk7CisgICAgICBSZXZlcnNlRGVwc1RvQWRkLnBvcF9iYWNrKCk7CisgICAgfQorICB9CisgIAorICBSZXZlcnNlRGVwSXQgPSBSZXZlcnNlTm9uTG9jYWxEZXBzLmZpbmQoUmVtSW5zdCk7CisgIGlmIChSZXZlcnNlRGVwSXQgIT0gUmV2ZXJzZU5vbkxvY2FsRGVwcy5lbmQoKSkgeworICAgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uKiwgND4gJlNldCA9IFJldmVyc2VEZXBJdC0+c2Vjb25kOworICAgIGZvciAoU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24qLCA0Pjo6aXRlcmF0b3IgSSA9IFNldC5iZWdpbigpLCBFID0gU2V0LmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGFzc2VydCgqSSAhPSBSZW1JbnN0ICYmICJBbHJlYWR5IHJlbW92ZWQgTm9uTG9jYWxEZXAgaW5mbyBmb3IgUmVtSW5zdCIpOworICAgICAgCisgICAgICBQZXJJbnN0TkxJbmZvICZJTkxEID0gTm9uTG9jYWxEZXBzWypJXTsKKyAgICAgIC8vIFRoZSBpbmZvcm1hdGlvbiBpcyBub3cgZGlydHkhCisgICAgICBJTkxELnNlY29uZCA9IHRydWU7CisgICAgICAKKyAgICAgIGZvciAoTm9uTG9jYWxEZXBJbmZvOjppdGVyYXRvciBESSA9IElOTEQuZmlyc3QuYmVnaW4oKSwgCisgICAgICAgICAgIERFID0gSU5MRC5maXJzdC5lbmQoKTsgREkgIT0gREU7ICsrREkpIHsKKyAgICAgICAgaWYgKERJLT5nZXRSZXN1bHQoKS5nZXRJbnN0KCkgIT0gUmVtSW5zdCkgY29udGludWU7CisgICAgICAgIAorICAgICAgICAvLyBDb252ZXJ0IHRvIGEgZGlydHkgZW50cnkgZm9yIHRoZSBzdWJzZXF1ZW50IGluc3RydWN0aW9uLgorICAgICAgICBESS0+c2V0UmVzdWx0KE5ld0RpcnR5VmFsKTsKKyAgICAgICAgCisgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqTmV4dEkgPSBOZXdEaXJ0eVZhbC5nZXRJbnN0KCkpCisgICAgICAgICAgUmV2ZXJzZURlcHNUb0FkZC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTmV4dEksICpJKSk7CisgICAgICB9CisgICAgfQorCisgICAgUmV2ZXJzZU5vbkxvY2FsRGVwcy5lcmFzZShSZXZlcnNlRGVwSXQpOworCisgICAgLy8gQWRkIG5ldyByZXZlcnNlIGRlcHMgYWZ0ZXIgc2Nhbm5pbmcgdGhlIHNldCwgdG8gYXZvaWQgaW52YWxpZGF0aW5nICdTZXQnCisgICAgd2hpbGUgKCFSZXZlcnNlRGVwc1RvQWRkLmVtcHR5KCkpIHsKKyAgICAgIFJldmVyc2VOb25Mb2NhbERlcHNbUmV2ZXJzZURlcHNUb0FkZC5iYWNrKCkuZmlyc3RdCisgICAgICAgIC5pbnNlcnQoUmV2ZXJzZURlcHNUb0FkZC5iYWNrKCkuc2Vjb25kKTsKKyAgICAgIFJldmVyc2VEZXBzVG9BZGQucG9wX2JhY2soKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBpbiBSZXZlcnNlTm9uTG9jYWxQdHJEZXBzIHRoZW4gaXQgYXBwZWFycyBhcyBhCisgIC8vIHZhbHVlIGluIHRoZSBOb25Mb2NhbFBvaW50ZXJEZXBzIGluZm8uCisgIFJldmVyc2VOb25Mb2NhbFB0ckRlcFR5OjppdGVyYXRvciBSZXZlcnNlUHRyRGVwSXQgPQorICAgIFJldmVyc2VOb25Mb2NhbFB0ckRlcHMuZmluZChSZW1JbnN0KTsKKyAgaWYgKFJldmVyc2VQdHJEZXBJdCAhPSBSZXZlcnNlTm9uTG9jYWxQdHJEZXBzLmVuZCgpKSB7CisgICAgU21hbGxQdHJTZXQ8VmFsdWVJc0xvYWRQYWlyLCA0PiAmU2V0ID0gUmV2ZXJzZVB0ckRlcEl0LT5zZWNvbmQ7CisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPEluc3RydWN0aW9uKiwgVmFsdWVJc0xvYWRQYWlyPiw4PiBSZXZlcnNlUHRyRGVwc1RvQWRkOworICAgIAorICAgIGZvciAoU21hbGxQdHJTZXQ8VmFsdWVJc0xvYWRQYWlyLCA0Pjo6aXRlcmF0b3IgSSA9IFNldC5iZWdpbigpLAorICAgICAgICAgRSA9IFNldC5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIFZhbHVlSXNMb2FkUGFpciBQID0gKkk7CisgICAgICBhc3NlcnQoUC5nZXRQb2ludGVyKCkgIT0gUmVtSW5zdCAmJgorICAgICAgICAgICAgICJBbHJlYWR5IHJlbW92ZWQgTm9uTG9jYWxQb2ludGVyRGVwcyBpbmZvIGZvciBSZW1JbnN0Iik7CisgICAgICAKKyAgICAgIE5vbkxvY2FsRGVwSW5mbyAmTkxQREkgPSBOb25Mb2NhbFBvaW50ZXJEZXBzW1BdLnNlY29uZDsKKyAgICAgIAorICAgICAgLy8gVGhlIGNhY2hlIGlzIG5vdCB2YWxpZCBmb3IgYW55IHNwZWNpZmljIGJsb2NrIGFueW1vcmUuCisgICAgICBOb25Mb2NhbFBvaW50ZXJEZXBzW1BdLmZpcnN0ID0gQkJTa2lwRmlyc3RCbG9ja1BhaXIoKTsKKyAgICAgIAorICAgICAgLy8gVXBkYXRlIGFueSBlbnRyaWVzIGZvciBSZW1JbnN0IHRvIHVzZSB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgaXQuCisgICAgICBmb3IgKE5vbkxvY2FsRGVwSW5mbzo6aXRlcmF0b3IgREkgPSBOTFBESS5iZWdpbigpLCBERSA9IE5MUERJLmVuZCgpOworICAgICAgICAgICBESSAhPSBERTsgKytESSkgeworICAgICAgICBpZiAoREktPmdldFJlc3VsdCgpLmdldEluc3QoKSAhPSBSZW1JbnN0KSBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIENvbnZlcnQgdG8gYSBkaXJ0eSBlbnRyeSBmb3IgdGhlIHN1YnNlcXVlbnQgaW5zdHJ1Y3Rpb24uCisgICAgICAgIERJLT5zZXRSZXN1bHQoTmV3RGlydHlWYWwpOworICAgICAgICAKKyAgICAgICAgaWYgKEluc3RydWN0aW9uICpOZXdEaXJ0eUluc3QgPSBOZXdEaXJ0eVZhbC5nZXRJbnN0KCkpCisgICAgICAgICAgUmV2ZXJzZVB0ckRlcHNUb0FkZC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTmV3RGlydHlJbnN0LCBQKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFJlLXNvcnQgdGhlIE5vbkxvY2FsRGVwSW5mby4gIENoYW5naW5nIHRoZSBkaXJ0eSBlbnRyeSB0byBpdHMKKyAgICAgIC8vIHN1YnNlcXVlbnQgdmFsdWUgbWF5IGludmFsaWRhdGUgdGhlIHNvcnRlZG5lc3MuCisgICAgICBzdGQ6OnNvcnQoTkxQREkuYmVnaW4oKSwgTkxQREkuZW5kKCkpOworICAgIH0KKyAgICAKKyAgICBSZXZlcnNlTm9uTG9jYWxQdHJEZXBzLmVyYXNlKFJldmVyc2VQdHJEZXBJdCk7CisgICAgCisgICAgd2hpbGUgKCFSZXZlcnNlUHRyRGVwc1RvQWRkLmVtcHR5KCkpIHsKKyAgICAgIFJldmVyc2VOb25Mb2NhbFB0ckRlcHNbUmV2ZXJzZVB0ckRlcHNUb0FkZC5iYWNrKCkuZmlyc3RdCisgICAgICAgIC5pbnNlcnQoUmV2ZXJzZVB0ckRlcHNUb0FkZC5iYWNrKCkuc2Vjb25kKTsKKyAgICAgIFJldmVyc2VQdHJEZXBzVG9BZGQucG9wX2JhY2soKTsKKyAgICB9CisgIH0KKyAgCisgIAorICBhc3NlcnQoIU5vbkxvY2FsRGVwcy5jb3VudChSZW1JbnN0KSAmJiAiUmVtSW5zdCBnb3QgcmVpbnNlcnRlZD8iKTsKKyAgQUEtPmRlbGV0ZVZhbHVlKFJlbUluc3QpOworICBERUJVRyh2ZXJpZnlSZW1vdmVkKFJlbUluc3QpKTsKK30KKy8vLyB2ZXJpZnlSZW1vdmVkIC0gVmVyaWZ5IHRoYXQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBkb2VzIG5vdCBvY2N1cgorLy8vIGluIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCit2b2lkIE1lbW9yeURlcGVuZGVuY2VBbmFseXNpczo6dmVyaWZ5UmVtb3ZlZChJbnN0cnVjdGlvbiAqRCkgY29uc3QgeworICBmb3IgKExvY2FsRGVwTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IgSSA9IExvY2FsRGVwcy5iZWdpbigpLAorICAgICAgIEUgPSBMb2NhbERlcHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgYXNzZXJ0KEktPmZpcnN0ICE9IEQgJiYgIkluc3Qgb2NjdXJzIGluIGRhdGEgc3RydWN0dXJlcyIpOworICAgIGFzc2VydChJLT5zZWNvbmQuZ2V0SW5zdCgpICE9IEQgJiYKKyAgICAgICAgICAgIkluc3Qgb2NjdXJzIGluIGRhdGEgc3RydWN0dXJlcyIpOworICB9CisgIAorICBmb3IgKENhY2hlZE5vbkxvY2FsUG9pbnRlckluZm86OmNvbnN0X2l0ZXJhdG9yIEkgPU5vbkxvY2FsUG9pbnRlckRlcHMuYmVnaW4oKSwKKyAgICAgICBFID0gTm9uTG9jYWxQb2ludGVyRGVwcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+Zmlyc3QuZ2V0UG9pbnRlcigpICE9IEQgJiYgIkluc3Qgb2NjdXJzIGluIE5MUEQgbWFwIGtleSIpOworICAgIGNvbnN0IE5vbkxvY2FsRGVwSW5mbyAmVmFsID0gSS0+c2Vjb25kLnNlY29uZDsKKyAgICBmb3IgKE5vbkxvY2FsRGVwSW5mbzo6Y29uc3RfaXRlcmF0b3IgSUkgPSBWYWwuYmVnaW4oKSwgRSA9IFZhbC5lbmQoKTsKKyAgICAgICAgIElJICE9IEU7ICsrSUkpCisgICAgICBhc3NlcnQoSUktPmdldFJlc3VsdCgpLmdldEluc3QoKSAhPSBEICYmICJJbnN0IG9jY3VycyBhcyBOTFBEIHZhbHVlIik7CisgIH0KKyAgCisgIGZvciAoTm9uTG9jYWxEZXBNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gTm9uTG9jYWxEZXBzLmJlZ2luKCksCisgICAgICAgRSA9IE5vbkxvY2FsRGVwcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+Zmlyc3QgIT0gRCAmJiAiSW5zdCBvY2N1cnMgaW4gZGF0YSBzdHJ1Y3R1cmVzIik7CisgICAgY29uc3QgUGVySW5zdE5MSW5mbyAmSU5MRCA9IEktPnNlY29uZDsKKyAgICBmb3IgKE5vbkxvY2FsRGVwSW5mbzo6Y29uc3RfaXRlcmF0b3IgSUkgPSBJTkxELmZpcnN0LmJlZ2luKCksCisgICAgICAgICBFRSA9IElOTEQuZmlyc3QuZW5kKCk7IElJICAhPSBFRTsgKytJSSkKKyAgICAgIGFzc2VydChJSS0+Z2V0UmVzdWx0KCkuZ2V0SW5zdCgpICE9IEQgJiYgIkluc3Qgb2NjdXJzIGluIGRhdGEgc3RydWN0dXJlcyIpOworICB9CisgIAorICBmb3IgKFJldmVyc2VEZXBNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gUmV2ZXJzZUxvY2FsRGVwcy5iZWdpbigpLAorICAgICAgIEUgPSBSZXZlcnNlTG9jYWxEZXBzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGFzc2VydChJLT5maXJzdCAhPSBEICYmICJJbnN0IG9jY3VycyBpbiBkYXRhIHN0cnVjdHVyZXMiKTsKKyAgICBmb3IgKFNtYWxsUHRyU2V0PEluc3RydWN0aW9uKiwgND46OmNvbnN0X2l0ZXJhdG9yIElJID0gSS0+c2Vjb25kLmJlZ2luKCksCisgICAgICAgICBFRSA9IEktPnNlY29uZC5lbmQoKTsgSUkgIT0gRUU7ICsrSUkpCisgICAgICBhc3NlcnQoKklJICE9IEQgJiYgIkluc3Qgb2NjdXJzIGluIGRhdGEgc3RydWN0dXJlcyIpOworICB9CisgIAorICBmb3IgKFJldmVyc2VEZXBNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gUmV2ZXJzZU5vbkxvY2FsRGVwcy5iZWdpbigpLAorICAgICAgIEUgPSBSZXZlcnNlTm9uTG9jYWxEZXBzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgYXNzZXJ0KEktPmZpcnN0ICE9IEQgJiYgIkluc3Qgb2NjdXJzIGluIGRhdGEgc3RydWN0dXJlcyIpOworICAgIGZvciAoU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24qLCA0Pjo6Y29uc3RfaXRlcmF0b3IgSUkgPSBJLT5zZWNvbmQuYmVnaW4oKSwKKyAgICAgICAgIEVFID0gSS0+c2Vjb25kLmVuZCgpOyBJSSAhPSBFRTsgKytJSSkKKyAgICAgIGFzc2VydCgqSUkgIT0gRCAmJiAiSW5zdCBvY2N1cnMgaW4gZGF0YSBzdHJ1Y3R1cmVzIik7CisgIH0KKyAgCisgIGZvciAoUmV2ZXJzZU5vbkxvY2FsUHRyRGVwVHk6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgSSA9IFJldmVyc2VOb25Mb2NhbFB0ckRlcHMuYmVnaW4oKSwKKyAgICAgICBFID0gUmV2ZXJzZU5vbkxvY2FsUHRyRGVwcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+Zmlyc3QgIT0gRCAmJiAiSW5zdCBvY2N1cnMgaW4gcmV2IE5MUEQgbWFwIik7CisgICAgCisgICAgZm9yIChTbWFsbFB0clNldDxWYWx1ZUlzTG9hZFBhaXIsIDQ+Ojpjb25zdF9pdGVyYXRvciBJSSA9IEktPnNlY29uZC5iZWdpbigpLAorICAgICAgICAgRSA9IEktPnNlY29uZC5lbmQoKTsgSUkgIT0gRTsgKytJSSkKKyAgICAgIGFzc2VydCgqSUkgIT0gVmFsdWVJc0xvYWRQYWlyKEQsIGZhbHNlKSAmJgorICAgICAgICAgICAgICpJSSAhPSBWYWx1ZUlzTG9hZFBhaXIoRCwgdHJ1ZSkgJiYKKyAgICAgICAgICAgICAiSW5zdCBvY2N1cnMgaW4gUmV2ZXJzZU5vbkxvY2FsUHRyRGVwcyBtYXAiKTsKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9QSElUcmFuc0FkZHIuY3BwIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL1BISVRyYW5zQWRkci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhNmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9QSElUcmFuc0FkZHIuY3BwCkBAIC0wLDAgKzEsNDI3IEBACisvLz09PS0gUEhJVHJhbnNBZGRyLmNwcCAtIFBISSBUcmFuc2xhdGlvbiBmb3IgQWRkcmVzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBQSElUcmFuc0FkZHIgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUEhJVHJhbnNBZGRyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIGJvb2wgQ2FuUEhJVHJhbnMoSW5zdHJ1Y3Rpb24gKkluc3QpIHsKKyAgaWYgKGlzYTxQSElOb2RlPihJbnN0KSB8fAorICAgICAgaXNhPEJpdENhc3RJbnN0PihJbnN0KSB8fAorICAgICAgaXNhPEdldEVsZW1lbnRQdHJJbnN0PihJbnN0KSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIGlmIChJbnN0LT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWRkICYmCisgICAgICBpc2E8Q29uc3RhbnRJbnQ+KEluc3QtPmdldE9wZXJhbmQoMSkpKQorICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gICBjZXJyIDw8ICJNRU1ERVA6IENvdWxkIG5vdCBQSEkgdHJhbnNsYXRlOiAiIDw8ICpQb2ludGVyOworICAvLyAgIGlmIChpc2E8Qml0Q2FzdEluc3Q+KFB0ckluc3QpIHx8IGlzYTxHZXRFbGVtZW50UHRySW5zdD4oUHRySW5zdCkpCisgIC8vICAgICBjZXJyIDw8ICJPUDpcdFx0XHRcdCIgPDwgKlB0ckluc3QtPmdldE9wZXJhbmQoMCk7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBQSElUcmFuc0FkZHI6OmR1bXAoKSBjb25zdCB7CisgIGlmIChBZGRyID09IDApIHsKKyAgICBkYmdzKCkgPDwgIlBISVRyYW5zQWRkcjogbnVsbFxuIjsKKyAgICByZXR1cm47CisgIH0KKyAgZGJncygpIDw8ICJQSElUcmFuc0FkZHI6ICIgPDwgKkFkZHIgPDwgIlxuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3RJbnB1dHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBkYmdzKCkgPDwgIiAgSW5wdXQgIyIgPDwgaSA8PCAiIGlzICIgPDwgKkluc3RJbnB1dHNbaV0gPDwgIlxuIjsKK30KKworCitzdGF0aWMgYm9vbCBWZXJpZnlTdWJFeHByKFZhbHVlICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24qPiAmSW5zdElucHV0cykgeworICAvLyBJZiB0aGlzIGlzIGEgbm9uLWluc3RydWN0aW9uIHZhbHVlLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgorICBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihFeHByKTsKKyAgaWYgKEkgPT0gMCkgcmV0dXJuIHRydWU7CisgIAorICAvLyBJZiBpdCdzIGFuIGluc3RydWN0aW9uLCBpdCBpcyBlaXRoZXIgaW4gVG1wIG9yIGl0cyBvcGVyYW5kcyByZWN1cnNpdmVseQorICAvLyBhcmUuCisgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbio+OjppdGVyYXRvciBFbnRyeSA9CisgICAgc3RkOjpmaW5kKEluc3RJbnB1dHMuYmVnaW4oKSwgSW5zdElucHV0cy5lbmQoKSwgSSk7CisgIGlmIChFbnRyeSAhPSBJbnN0SW5wdXRzLmVuZCgpKSB7CisgICAgSW5zdElucHV0cy5lcmFzZShFbnRyeSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIC8vIElmIGl0IGlzbid0IGluIHRoZSBJbnN0SW5wdXRzIGxpc3QgaXQgaXMgYSBzdWJleHByIGluY29ycG9yYXRlZCBpbnRvIHRoZQorICAvLyBhZGRyZXNzLiAgU2FuaXR5IGNoZWNrIHRoYXQgaXQgaXMgcGhpIHRyYW5zbGF0YWJsZS4KKyAgaWYgKCFDYW5QSElUcmFucyhJKSkgeworICAgIGVycnMoKSA8PCAiTm9uIHBoaSB0cmFuc2xhdGFibGUgaW5zdHJ1Y3Rpb24gZm91bmQgaW4gUEhJVHJhbnNBZGRyLCBlaXRoZXIgIgorICAgICAgICAgICAgICAic29tZXRoaW5nIGlzIG1pc3NpbmcgZnJvbSBJbnN0SW5wdXRzIG9yIENhblBISVRyYW5zIGlzIHdyb25nOlxuIjsKKyAgICBlcnJzKCkgPDwgKkkgPDwgJ1xuJzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIFZhbGlkYXRlIHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoIVZlcmlmeVN1YkV4cHIoSS0+Z2V0T3BlcmFuZChpKSwgSW5zdElucHV0cykpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBWZXJpZnkgLSBDaGVjayBpbnRlcm5hbCBjb25zaXN0ZW5jeSBvZiB0aGlzIGRhdGEgc3RydWN0dXJlLiAgSWYgdGhlCisvLy8gc3RydWN0dXJlIGlzIHZhbGlkLCBpdCByZXR1cm5zIHRydWUuICBJZiBpbnZhbGlkLCBpdCBwcmludHMgZXJyb3JzIGFuZAorLy8vIHJldHVybnMgZmFsc2UuCitib29sIFBISVRyYW5zQWRkcjo6VmVyaWZ5KCkgY29uc3QgeworICBpZiAoQWRkciA9PSAwKSByZXR1cm4gdHJ1ZTsKKyAgCisgIFNtYWxsVmVjdG9yPEluc3RydWN0aW9uKiwgOD4gVG1wKEluc3RJbnB1dHMuYmVnaW4oKSwgSW5zdElucHV0cy5lbmQoKSk7ICAKKyAgCisgIGlmICghVmVyaWZ5U3ViRXhwcihBZGRyLCBUbXApKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGlmICghVG1wLmVtcHR5KCkpIHsKKyAgICBlcnJzKCkgPDwgIlBISVRyYW5zQWRkciBpbmNvbnNpc3RlbnQsIGNvbnRhaW5zIGV4dHJhIGluc3RydWN0aW9uczpcbiI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3RJbnB1dHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGVycnMoKSA8PCAiICBJbnN0SW5wdXQgIyIgPDwgaSA8PCAiIGlzICIgPDwgKkluc3RJbnB1dHNbaV0gPDwgIlxuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIGEtb2suCisgIHJldHVybiB0cnVlOworfQorCisKKy8vLyBJc1BvdGVudGlhbGx5UEhJVHJhbnNsYXRhYmxlIC0gSWYgdGhpcyBuZWVkcyBQSEkgdHJhbnNsYXRpb24sIHJldHVybiB0cnVlCisvLy8gaWYgd2UgaGF2ZSBzb21lIGhvcGUgb2YgZG9pbmcgaXQuICBUaGlzIHNob3VsZCBiZSB1c2VkIGFzIGEgZmlsdGVyIHRvCisvLy8gYXZvaWQgY2FsbGluZyBQSElUcmFuc2xhdGVWYWx1ZSBpbiBob3BlbGVzcyBzaXR1YXRpb25zLgorYm9vbCBQSElUcmFuc0FkZHI6OklzUG90ZW50aWFsbHlQSElUcmFuc2xhdGFibGUoKSBjb25zdCB7CisgIC8vIElmIHRoZSBpbnB1dCB2YWx1ZSBpcyBub3QgYW4gaW5zdHJ1Y3Rpb24sIG9yIGlmIGl0IGlzIG5vdCBkZWZpbmVkIGluIEN1ckJCLAorICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gcGhpIHRyYW5zbGF0ZSBpdC4KKyAgSW5zdHJ1Y3Rpb24gKkluc3QgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oQWRkcik7CisgIHJldHVybiBJbnN0ID09IDAgfHwgQ2FuUEhJVHJhbnMoSW5zdCk7Cit9CisKKworc3RhdGljIHZvaWQgUmVtb3ZlSW5zdElucHV0cyhWYWx1ZSAqViwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbio+ICZJbnN0SW5wdXRzKSB7CisgIEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpOworICBpZiAoSSA9PSAwKSByZXR1cm47CisgIAorICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgaW4gdGhlIEluc3RJbnB1dHMgbGlzdCwgcmVtb3ZlIGl0LgorICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24qPjo6aXRlcmF0b3IgRW50cnkgPQorICAgIHN0ZDo6ZmluZChJbnN0SW5wdXRzLmJlZ2luKCksIEluc3RJbnB1dHMuZW5kKCksIEkpOworICBpZiAoRW50cnkgIT0gSW5zdElucHV0cy5lbmQoKSkgeworICAgIEluc3RJbnB1dHMuZXJhc2UoRW50cnkpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgYXNzZXJ0KCFpc2E8UEhJTm9kZT4oSSkgJiYgIkVycm9yLCByZW1vdmluZyBzb21ldGhpbmcgdGhhdCBpc24ndCBhbiBpbnB1dCIpOworICAKKyAgLy8gT3RoZXJ3aXNlLCBpdCBtdXN0IGhhdmUgaW5zdHJ1Y3Rpb24gaW5wdXRzIGl0c2VsZi4gIFphcCB0aGVtIHJlY3Vyc2l2ZWx5LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKk9wID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KEktPmdldE9wZXJhbmQoaSkpKQorICAgICAgUmVtb3ZlSW5zdElucHV0cyhPcCwgSW5zdElucHV0cyk7CisgIH0KK30KKworVmFsdWUgKlBISVRyYW5zQWRkcjo6UEhJVHJhbnNsYXRlU3ViRXhwcihWYWx1ZSAqViwgQmFzaWNCbG9jayAqQ3VyQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlByZWRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQpIHsKKyAgLy8gSWYgdGhpcyBpcyBhIG5vbi1pbnN0cnVjdGlvbiB2YWx1ZSwgaXQgY2FuJ3QgcmVxdWlyZSBQSEkgdHJhbnNsYXRpb24uCisgIEluc3RydWN0aW9uICpJbnN0ID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpOworICBpZiAoSW5zdCA9PSAwKSByZXR1cm4gVjsKKyAgCisgIC8vIERldGVybWluZSB3aGV0aGVyICdJbnN0JyBpcyBhbiBpbnB1dCB0byBvdXIgUEhJIHRyYW5zbGF0YWJsZSBleHByZXNzaW9uLgorICBib29sIGlzSW5wdXQgPSBzdGQ6OmNvdW50KEluc3RJbnB1dHMuYmVnaW4oKSwgSW5zdElucHV0cy5lbmQoKSwgSW5zdCk7CisKKyAgLy8gSGFuZGxlIGlucHV0cyBpbnN0cnVjdGlvbnMgaWYgbmVlZGVkLgorICBpZiAoaXNJbnB1dCkgeworICAgIGlmIChJbnN0LT5nZXRQYXJlbnQoKSAhPSBDdXJCQikgeworICAgICAgLy8gSWYgaXQgaXMgYW4gaW5wdXQgZGVmaW5lZCBpbiBhIGRpZmZlcmVudCBibG9jaywgdGhlbiBpdCByZW1haW5zIGFuCisgICAgICAvLyBpbnB1dC4KKyAgICAgIHJldHVybiBJbnN0OworICAgIH0KKworICAgIC8vIElmICdJbnN0JyBpcyBkZWZpbmVkIGluIHRoaXMgYmxvY2sgYW5kIGlzIGFuIGlucHV0IHRoYXQgbmVlZHMgdG8gYmUgcGhpCisgICAgLy8gdHJhbnNsYXRlZCwgd2UgbmVlZCB0byBpbmNvcnBvcmF0ZSB0aGUgdmFsdWUgaW50byB0aGUgZXhwcmVzc2lvbiBvciBmYWlsLgorCisgICAgLy8gSW4gZWl0aGVyIGNhc2UsIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYgaXNuJ3QgYW4gaW5wdXQgYW55IGxvbmdlci4KKyAgICBJbnN0SW5wdXRzLmVyYXNlKHN0ZDo6ZmluZChJbnN0SW5wdXRzLmJlZ2luKCksIEluc3RJbnB1dHMuZW5kKCksIEluc3QpKTsKKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGEgUEhJLCBnbyBhaGVhZCBhbmQgdHJhbnNsYXRlIGl0LgorICAgIGlmIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEluc3QpKQorICAgICAgcmV0dXJuIEFkZEFzSW5wdXQoUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhQcmVkQkIpKTsKKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGEgbm9uLXBoaSB2YWx1ZSwgYW5kIGl0IGlzIGFuYWx5emFibGUsIHdlIGNhbiBpbmNvcnBvcmF0ZSBpdAorICAgIC8vIGludG8gdGhlIGV4cHJlc3Npb24gYnkgbWFraW5nIGFsbCBpbnN0cnVjdGlvbiBvcGVyYW5kcyBiZSBpbnB1dHMuCisgICAgaWYgKCFDYW5QSElUcmFucyhJbnN0KSkKKyAgICAgIHJldHVybiAwOworICAgCisgICAgLy8gQWxsIGluc3RydWN0aW9uIG9wZXJhbmRzIGFyZSBub3cgaW5wdXRzIChhbmQgb2YgY291cnNlLCB0aGV5IG1heSBhbHNvIGJlCisgICAgLy8gZGVmaW5lZCBpbiB0aGlzIGJsb2NrLCBzbyB0aGV5IG1heSBuZWVkIHRvIGJlIHBoaSB0cmFuc2xhdGVkIHRoZW1zZWx2ZXMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3QtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKEluc3RydWN0aW9uICpPcCA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihJbnN0LT5nZXRPcGVyYW5kKGkpKSkKKyAgICAgICAgSW5zdElucHV0cy5wdXNoX2JhY2soT3ApOworICB9CisKKyAgLy8gT2ssIGl0IG11c3QgYmUgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdCAoZWl0aGVyIGJlY2F1c2UgaXQgc3RhcnRlZCB0aGF0IHdheQorICAvLyBvciBiZWNhdXNlIHdlIGp1c3QgaW5jb3Jwb3JhdGVkIGl0IGludG8gdGhlIGV4cHJlc3Npb24pLiAgU2VlIGlmIGl0cworICAvLyBvcGVyYW5kcyBuZWVkIHRvIGJlIHBoaSB0cmFuc2xhdGVkLCBhbmQgaWYgc28sIHJlY29uc3RydWN0IGl0LgorICAKKyAgaWYgKEJpdENhc3RJbnN0ICpCQyA9IGR5bl9jYXN0PEJpdENhc3RJbnN0PihJbnN0KSkgeworICAgIFZhbHVlICpQSElJbiA9IFBISVRyYW5zbGF0ZVN1YkV4cHIoQkMtPmdldE9wZXJhbmQoMCksIEN1ckJCLCBQcmVkQkIsIERUKTsKKyAgICBpZiAoUEhJSW4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKFBISUluID09IEJDLT5nZXRPcGVyYW5kKDApKQorICAgICAgcmV0dXJuIEJDOworICAgIAorICAgIC8vIEZpbmQgYW4gYXZhaWxhYmxlIHZlcnNpb24gb2YgdGhpcyBjYXN0LgorICAgIAorICAgIC8vIENvbnN0YW50cyBhcmUgdHJpdmlhbCB0byBmaW5kLgorICAgIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihQSElJbikpCisgICAgICByZXR1cm4gQWRkQXNJbnB1dChDb25zdGFudEV4cHI6OmdldEJpdENhc3QoQywgQkMtPmdldFR5cGUoKSkpOworICAgIAorICAgIC8vIE90aGVyd2lzZSB3ZSBoYXZlIHRvIHNlZSBpZiBhIGJpdGNhc3RlZCB2ZXJzaW9uIG9mIHRoZSBpbmNvbWluZyBwb2ludGVyCisgICAgLy8gaXMgYXZhaWxhYmxlLiAgSWYgc28sIHdlIGNhbiB1c2UgaXQsIG90aGVyd2lzZSB3ZSBoYXZlIHRvIGZhaWwuCisgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gUEhJSW4tPnVzZV9iZWdpbigpLCBFID0gUEhJSW4tPnVzZV9lbmQoKTsKKyAgICAgICAgIFVJICE9IEU7ICsrVUkpIHsKKyAgICAgIGlmIChCaXRDYXN0SW5zdCAqQkNJID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KCpVSSkpCisgICAgICAgIGlmIChCQ0ktPmdldFR5cGUoKSA9PSBCQy0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAoIURUIHx8IERULT5kb21pbmF0ZXMoQkNJLT5nZXRQYXJlbnQoKSwgUHJlZEJCKSkpCisgICAgICAgICAgcmV0dXJuIEJDSTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIC8vIEhhbmRsZSBnZXRlbGVtZW50cHRyIHdpdGggYXQgbGVhc3Qgb25lIFBISSB0cmFuc2xhdGFibGUgb3BlcmFuZC4KKyAgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oSW5zdCkpIHsKKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IEdFUE9wczsKKyAgICBib29sIEFueUNoYW5nZWQgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gR0VQLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgVmFsdWUgKkdFUE9wID0gUEhJVHJhbnNsYXRlU3ViRXhwcihHRVAtPmdldE9wZXJhbmQoaSksIEN1ckJCLCBQcmVkQkIsIERUKTsKKyAgICAgIGlmIChHRVBPcCA9PSAwKSByZXR1cm4gMDsKKyAgICAgIAorICAgICAgQW55Q2hhbmdlZCB8PSBHRVBPcCAhPSBHRVAtPmdldE9wZXJhbmQoaSk7CisgICAgICBHRVBPcHMucHVzaF9iYWNrKEdFUE9wKTsKKyAgICB9CisgICAgCisgICAgaWYgKCFBbnlDaGFuZ2VkKQorICAgICAgcmV0dXJuIEdFUDsKKyAgICAKKyAgICAvLyBTaW1wbGlmeSB0aGUgR0VQIHRvIGhhbmRsZSAnZ2VwIHgsIDAnIC0+IHggZXRjLgorICAgIGlmIChWYWx1ZSAqViA9IFNpbXBsaWZ5R0VQSW5zdCgmR0VQT3BzWzBdLCBHRVBPcHMuc2l6ZSgpLCBURCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBHRVBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgUmVtb3ZlSW5zdElucHV0cyhHRVBPcHNbaV0sIEluc3RJbnB1dHMpOworICAgICAgCisgICAgICByZXR1cm4gQWRkQXNJbnB1dChWKTsKKyAgICB9CisgICAgCisgICAgLy8gU2NhbiB0byBzZWUgaWYgd2UgaGF2ZSB0aGlzIEdFUCBhdmFpbGFibGUuCisgICAgVmFsdWUgKkFQSElPcCA9IEdFUE9wc1swXTsKKyAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBBUEhJT3AtPnVzZV9iZWdpbigpLCBFID0gQVBISU9wLT51c2VfZW5kKCk7CisgICAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgICBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUEkgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oKlVJKSkKKyAgICAgICAgaWYgKEdFUEktPmdldFR5cGUoKSA9PSBHRVAtPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgR0VQSS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSBHRVBPcHMuc2l6ZSgpICYmCisgICAgICAgICAgICBHRVBJLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkgPT0gQ3VyQkItPmdldFBhcmVudCgpICYmCisgICAgICAgICAgICAoIURUIHx8IERULT5kb21pbmF0ZXMoR0VQSS0+Z2V0UGFyZW50KCksIFByZWRCQikpKSB7CisgICAgICAgICAgYm9vbCBNaXNtYXRjaCA9IGZhbHNlOworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBHRVBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICAgIGlmIChHRVBJLT5nZXRPcGVyYW5kKGkpICE9IEdFUE9wc1tpXSkgeworICAgICAgICAgICAgICBNaXNtYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmICghTWlzbWF0Y2gpCisgICAgICAgICAgICByZXR1cm4gR0VQSTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgLy8gSGFuZGxlIGFkZCB3aXRoIGEgY29uc3RhbnQgUkhTLgorICBpZiAoSW5zdC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFkZCAmJgorICAgICAgaXNhPENvbnN0YW50SW50PihJbnN0LT5nZXRPcGVyYW5kKDEpKSkgeworICAgIC8vIFBISSB0cmFuc2xhdGUgdGhlIExIUy4KKyAgICBDb25zdGFudCAqUkhTID0gY2FzdDxDb25zdGFudEludD4oSW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgYm9vbCBpc05TVyA9IGNhc3Q8QmluYXJ5T3BlcmF0b3I+KEluc3QpLT5oYXNOb1NpZ25lZFdyYXAoKTsKKyAgICBib29sIGlzTlVXID0gY2FzdDxCaW5hcnlPcGVyYXRvcj4oSW5zdCktPmhhc05vVW5zaWduZWRXcmFwKCk7CisgICAgCisgICAgVmFsdWUgKkxIUyA9IFBISVRyYW5zbGF0ZVN1YkV4cHIoSW5zdC0+Z2V0T3BlcmFuZCgwKSwgQ3VyQkIsIFByZWRCQiwgRFQpOworICAgIGlmIChMSFMgPT0gMCkgcmV0dXJuIDA7CisgICAgCisgICAgLy8gSWYgdGhlIFBISSB0cmFuc2xhdGVkIExIUyBpcyBhbiBhZGQgb2YgYSBjb25zdGFudCwgZm9sZCB0aGUgaW1tZWRpYXRlcy4KKyAgICBpZiAoQmluYXJ5T3BlcmF0b3IgKkJPcCA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihMSFMpKQorICAgICAgaWYgKEJPcC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFkZCkKKyAgICAgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihCT3AtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgICAgTEhTID0gQk9wLT5nZXRPcGVyYW5kKDApOworICAgICAgICAgIFJIUyA9IENvbnN0YW50RXhwcjo6Z2V0QWRkKFJIUywgQ0kpOworICAgICAgICAgIGlzTlNXID0gaXNOVVcgPSBmYWxzZTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBJZiB0aGUgb2xkICdMSFMnIHdhcyBhbiBpbnB1dCwgYWRkIHRoZSBuZXcgJ0xIUycgYXMgYW4gaW5wdXQuCisgICAgICAgICAgaWYgKHN0ZDo6Y291bnQoSW5zdElucHV0cy5iZWdpbigpLCBJbnN0SW5wdXRzLmVuZCgpLCBCT3ApKSB7CisgICAgICAgICAgICBSZW1vdmVJbnN0SW5wdXRzKEJPcCwgSW5zdElucHV0cyk7CisgICAgICAgICAgICBBZGRBc0lucHV0KExIUyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgCisgICAgLy8gU2VlIGlmIHRoZSBhZGQgc2ltcGxpZmllcyBhd2F5LgorICAgIGlmIChWYWx1ZSAqUmVzID0gU2ltcGxpZnlBZGRJbnN0KExIUywgUkhTLCBpc05TVywgaXNOVVcsIFREKSkgeworICAgICAgLy8gSWYgd2Ugc2ltcGxpZmllZCB0aGUgb3BlcmFuZHMsIHRoZSBMSFMgaXMgbm8gbG9uZ2VyIGFuIGlucHV0LCBidXQgUmVzCisgICAgICAvLyBpcy4KKyAgICAgIFJlbW92ZUluc3RJbnB1dHMoTEhTLCBJbnN0SW5wdXRzKTsKKyAgICAgIHJldHVybiBBZGRBc0lucHV0KFJlcyk7CisgICAgfQorCisgICAgLy8gSWYgd2UgZGlkbid0IG1vZGlmeSB0aGUgYWRkLCBqdXN0IHJldHVybiBpdC4KKyAgICBpZiAoTEhTID09IEluc3QtPmdldE9wZXJhbmQoMCkgJiYgUkhTID09IEluc3QtPmdldE9wZXJhbmQoMSkpCisgICAgICByZXR1cm4gSW5zdDsKKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIHNlZSBpZiB3ZSBoYXZlIHRoaXMgYWRkIGF2YWlsYWJsZSBzb21ld2hlcmUuCisgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gTEhTLT51c2VfYmVnaW4oKSwgRSA9IExIUy0+dXNlX2VuZCgpOworICAgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgICAgaWYgKEJpbmFyeU9wZXJhdG9yICpCTyA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPigqVUkpKQorICAgICAgICBpZiAoQk8tPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQgJiYKKyAgICAgICAgICAgIEJPLT5nZXRPcGVyYW5kKDApID09IExIUyAmJiBCTy0+Z2V0T3BlcmFuZCgxKSA9PSBSSFMgJiYKKyAgICAgICAgICAgIEJPLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkgPT0gQ3VyQkItPmdldFBhcmVudCgpICYmCisgICAgICAgICAgICAoIURUIHx8IERULT5kb21pbmF0ZXMoQk8tPmdldFBhcmVudCgpLCBQcmVkQkIpKSkKKyAgICAgICAgICByZXR1cm4gQk87CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworICB9CisgIAorICAvLyBPdGhlcndpc2UsIHdlIGZhaWxlZC4KKyAgcmV0dXJuIDA7Cit9CisKKworLy8vIFBISVRyYW5zbGF0ZVZhbHVlIC0gUEhJIHRyYW5zbGF0ZSB0aGUgY3VycmVudCBhZGRyZXNzIHVwIHRoZSBDRkcgZnJvbQorLy8vIEN1ckJCIHRvIFByZWQsIHVwZGF0aW5nIG91ciBzdGF0ZSB0byByZWZsZWN0IGFueSBuZWVkZWQgY2hhbmdlcy4gIElmIHRoZQorLy8vIGRvbWluYXRvciB0cmVlIERUIGlzIG5vbi1udWxsLCB0aGUgdHJhbnNsYXRlZCB2YWx1ZSBtdXN0IGRvbWluYXRlCisvLy8gUHJlZEJCLiAgVGhpcyByZXR1cm5zIHRydWUgb24gZmFpbHVyZSBhbmQgc2V0cyBBZGRyIHRvIG51bGwuCitib29sIFBISVRyYW5zQWRkcjo6UEhJVHJhbnNsYXRlVmFsdWUoQmFzaWNCbG9jayAqQ3VyQkIsIEJhc2ljQmxvY2sgKlByZWRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCkgeworICBhc3NlcnQoVmVyaWZ5KCkgJiYgIkludmFsaWQgUEhJVHJhbnNBZGRyISIpOworICBBZGRyID0gUEhJVHJhbnNsYXRlU3ViRXhwcihBZGRyLCBDdXJCQiwgUHJlZEJCLCBEVCk7CisgIGFzc2VydChWZXJpZnkoKSAmJiAiSW52YWxpZCBQSElUcmFuc0FkZHIhIik7CisKKyAgaWYgKERUKSB7CisgICAgLy8gTWFrZSBzdXJlIHRoZSB2YWx1ZSBpcyBsaXZlIGluIHRoZSBwcmVkZWNlc3Nvci4KKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkluc3QgPSBkeW5fY2FzdF9vcl9udWxsPEluc3RydWN0aW9uPihBZGRyKSkKKyAgICAgIGlmICghRFQtPmRvbWluYXRlcyhJbnN0LT5nZXRQYXJlbnQoKSwgUHJlZEJCKSkKKyAgICAgICAgQWRkciA9IDA7CisgIH0KKworICByZXR1cm4gQWRkciA9PSAwOworfQorCisvLy8gUEhJVHJhbnNsYXRlV2l0aEluc2VydGlvbiAtIFBISSB0cmFuc2xhdGUgdGhpcyB2YWx1ZSBpbnRvIHRoZSBzcGVjaWZpZWQKKy8vLyBwcmVkZWNlc3NvciBibG9jaywgaW5zZXJ0aW5nIGEgY29tcHV0YXRpb24gb2YgdGhlIHZhbHVlIGlmIGl0IGlzCisvLy8gdW5hdmFpbGFibGUuCisvLy8KKy8vLyBBbGwgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBOZXdJbnN0cyBsaXN0LiAgVGhpcworLy8vIHJldHVybnMgbnVsbCBvbiBmYWlsdXJlLgorLy8vCitWYWx1ZSAqUEhJVHJhbnNBZGRyOjoKK1BISVRyYW5zbGF0ZVdpdGhJbnNlcnRpb24oQmFzaWNCbG9jayAqQ3VyQkIsIEJhc2ljQmxvY2sgKlByZWRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAmRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbio+ICZOZXdJbnN0cykgeworICB1bnNpZ25lZCBOSVNpemUgPSBOZXdJbnN0cy5zaXplKCk7CisgIAorICAvLyBBdHRlbXB0IHRvIFBISSB0cmFuc2xhdGUgd2l0aCBpbnNlcnRpb24uCisgIEFkZHIgPSBJbnNlcnRQSElUcmFuc2xhdGVkU3ViRXhwcihBZGRyLCBDdXJCQiwgUHJlZEJCLCBEVCwgTmV3SW5zdHMpOworICAKKyAgLy8gSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCisgIGlmIChBZGRyKSByZXR1cm4gQWRkcjsKKyAgCisgIC8vIElmIG5vdCwgZGVzdHJveSBhbnkgaW50ZXJtZWRpYXRlIGluc3RydWN0aW9ucyBpbnNlcnRlZC4KKyAgd2hpbGUgKE5ld0luc3RzLnNpemUoKSAhPSBOSVNpemUpCisgICAgTmV3SW5zdHMucG9wX2JhY2tfdmFsKCktPmVyYXNlRnJvbVBhcmVudCgpOworICByZXR1cm4gMDsKK30KKworCisvLy8gSW5zZXJ0UEhJVHJhbnNsYXRlZFBvaW50ZXIgLSBJbnNlcnQgYSBjb21wdXRhdGlvbiBvZiB0aGUgUEhJIHRyYW5zbGF0ZWQKKy8vLyB2ZXJzaW9uIG9mICdWJyBmb3IgdGhlIGVkZ2UgUHJlZEJCLT5DdXJCQiBpbnRvIHRoZSBlbmQgb2YgdGhlIFByZWRCQgorLy8vIGJsb2NrLiAgQWxsIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb25zIGFyZSBhZGRlZCB0byB0aGUgTmV3SW5zdHMgbGlzdC4KKy8vLyBUaGlzIHJldHVybnMgbnVsbCBvbiBmYWlsdXJlLgorLy8vCitWYWx1ZSAqUEhJVHJhbnNBZGRyOjoKK0luc2VydFBISVRyYW5zbGF0ZWRTdWJFeHByKFZhbHVlICpJblZhbCwgQmFzaWNCbG9jayAqQ3VyQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpQcmVkQkIsIGNvbnN0IERvbWluYXRvclRyZWUgJkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uKj4gJk5ld0luc3RzKSB7CisgIC8vIFNlZSBpZiB3ZSBoYXZlIGEgdmVyc2lvbiBvZiB0aGlzIHZhbHVlIGFscmVhZHkgYXZhaWxhYmxlIGFuZCBkb21pbmF0aW5nCisgIC8vIFByZWRCQi4gIElmIHNvLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluc2VydCBhIG5ldyBpbnN0YW5jZSBvZiBpdC4KKyAgUEhJVHJhbnNBZGRyIFRtcChJblZhbCwgVEQpOworICBpZiAoIVRtcC5QSElUcmFuc2xhdGVWYWx1ZShDdXJCQiwgUHJlZEJCLCAmRFQpKQorICAgIHJldHVybiBUbXAuZ2V0QWRkcigpOworCisgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gYXZhaWxhYmxlIHZlcnNpb24gb2YgdGhpcyB2YWx1ZSwgaXQgbXVzdCBiZSBhbgorICAvLyBpbnN0cnVjdGlvbi4KKyAgSW5zdHJ1Y3Rpb24gKkluc3QgPSBjYXN0PEluc3RydWN0aW9uPihJblZhbCk7CisgIAorICAvLyBIYW5kbGUgYml0Y2FzdCBvZiBQSEkgdHJhbnNsYXRhYmxlIHZhbHVlLgorICBpZiAoQml0Q2FzdEluc3QgKkJDID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KEluc3QpKSB7CisgICAgVmFsdWUgKk9wVmFsID0gSW5zZXJ0UEhJVHJhbnNsYXRlZFN1YkV4cHIoQkMtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyQkIsIFByZWRCQiwgRFQsIE5ld0luc3RzKTsKKyAgICBpZiAoT3BWYWwgPT0gMCkgcmV0dXJuIDA7CisgICAgCisgICAgLy8gT3RoZXJ3aXNlIGluc2VydCBhIGJpdGNhc3QgYXQgdGhlIGVuZCBvZiBQcmVkQkIuCisgICAgQml0Q2FzdEluc3QgKk5ldyA9IG5ldyBCaXRDYXN0SW5zdChPcFZhbCwgSW5WYWwtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWRCQi0+Z2V0VGVybWluYXRvcigpKTsKKyAgICBOZXdJbnN0cy5wdXNoX2JhY2soTmV3KTsKKyAgICByZXR1cm4gTmV3OworICB9CisgIAorICAvLyBIYW5kbGUgZ2V0ZWxlbWVudHB0ciB3aXRoIGF0IGxlYXN0IG9uZSBQSEkgb3BlcmFuZC4KKyAgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oSW5zdCkpIHsKKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IEdFUE9wczsKKyAgICBCYXNpY0Jsb2NrICpDdXJCQiA9IEdFUC0+Z2V0UGFyZW50KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEdFUC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFZhbHVlICpPcFZhbCA9IEluc2VydFBISVRyYW5zbGF0ZWRTdWJFeHByKEdFUC0+Z2V0T3BlcmFuZChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckJCLCBQcmVkQkIsIERULCBOZXdJbnN0cyk7CisgICAgICBpZiAoT3BWYWwgPT0gMCkgcmV0dXJuIDA7CisgICAgICBHRVBPcHMucHVzaF9iYWNrKE9wVmFsKTsKKyAgICB9CisgICAgCisgICAgR2V0RWxlbWVudFB0ckluc3QgKlJlc3VsdCA9IAorICAgIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoR0VQT3BzWzBdLCBHRVBPcHMuYmVnaW4oKSsxLCBHRVBPcHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkQkItPmdldFRlcm1pbmF0b3IoKSk7CisgICAgUmVzdWx0LT5zZXRJc0luQm91bmRzKEdFUC0+aXNJbkJvdW5kcygpKTsKKyAgICBOZXdJbnN0cy5wdXNoX2JhY2soUmVzdWx0KTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisgIAorI2lmIDAKKyAgLy8gRklYTUU6IFRoaXMgY29kZSB3b3JrcywgYnV0IGl0IGlzIHVuY2xlYXIgdGhhdCB3ZSBhY3R1YWxseSB3YW50IHRvIGluc2VydAorICAvLyBhIGJpZyBjaGFpbiBvZiBjb21wdXRhdGlvbiBpbiBvcmRlciB0byBtYWtlIGEgdmFsdWUgYXZhaWxhYmxlIGluIGEgYmxvY2suCisgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZXZhbHVhdGVkIGNhcmVmdWxseSB0byBjb25zaWRlciBpdHMgY29zdCB0cmFkZSBvZmZzLgorICAKKyAgLy8gSGFuZGxlIGFkZCB3aXRoIGEgY29uc3RhbnQgUkhTLgorICBpZiAoSW5zdC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFkZCAmJgorICAgICAgaXNhPENvbnN0YW50SW50PihJbnN0LT5nZXRPcGVyYW5kKDEpKSkgeworICAgIC8vIFBISSB0cmFuc2xhdGUgdGhlIExIUy4KKyAgICBWYWx1ZSAqT3BWYWwgPSBJbnNlcnRQSElUcmFuc2xhdGVkU3ViRXhwcihJbnN0LT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckJCLCBQcmVkQkIsIERULCBOZXdJbnN0cyk7CisgICAgaWYgKE9wVmFsID09IDApIHJldHVybiAwOworICAgIAorICAgIEJpbmFyeU9wZXJhdG9yICpSZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKE9wVmFsLCBJbnN0LT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluVmFsLT5nZXROYW1lKCkrIi5waGkudHJhbnMuaW5zZXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkQkItPmdldFRlcm1pbmF0b3IoKSk7CisgICAgUmVzLT5zZXRIYXNOb1NpZ25lZFdyYXAoY2FzdDxCaW5hcnlPcGVyYXRvcj4oSW5zdCktPmhhc05vU2lnbmVkV3JhcCgpKTsKKyAgICBSZXMtPnNldEhhc05vVW5zaWduZWRXcmFwKGNhc3Q8QmluYXJ5T3BlcmF0b3I+KEluc3QpLT5oYXNOb1Vuc2lnbmVkV3JhcCgpKTsKKyAgICBOZXdJbnN0cy5wdXNoX2JhY2soUmVzKTsKKyAgICByZXR1cm4gUmVzOworICB9CisjZW5kaWYKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FuYWx5c2lzL1Byb2ZpbGVJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9Qcm9maWxlSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3ZjI4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9Qcm9maWxlSW5mby5jcHAKQEAgLTAsMCArMSwxMTAyIEBACisvLz09PS0gUHJvZmlsZUluZm8uY3BwIC0gUHJvZmlsZSBJbmZvIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBhYnN0cmFjdCBQcm9maWxlSW5mbyBpbnRlcmZhY2UsIGFuZCB0aGUgZGVmYXVsdAorLy8gIm5vIHByb2ZpbGUiIGltcGxlbWVudGF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjZGVmaW5lIERFQlVHX1RZUEUgInByb2ZpbGUtaW5mbyIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUHJvZmlsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPGxpbWl0cz4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBSZWdpc3RlciB0aGUgUHJvZmlsZUluZm8gaW50ZXJmYWNlLCBwcm92aWRpbmcgYSBuaWNlIG5hbWUgdG8gcmVmZXIgdG8uCitzdGF0aWMgUmVnaXN0ZXJBbmFseXNpc0dyb3VwPFByb2ZpbGVJbmZvPiBaKCJQcm9maWxlIEluZm9ybWF0aW9uIik7CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPD4KK1Byb2ZpbGVJbmZvVDxNYWNoaW5lRnVuY3Rpb24sIE1hY2hpbmVCYXNpY0Jsb2NrPjo6UHJvZmlsZUluZm9UKCkge30KK3RlbXBsYXRlIDw+CitQcm9maWxlSW5mb1Q8TWFjaGluZUZ1bmN0aW9uLCBNYWNoaW5lQmFzaWNCbG9jaz46On5Qcm9maWxlSW5mb1QoKSB7fQorCit0ZW1wbGF0ZSA8PgorUHJvZmlsZUluZm9UPEZ1bmN0aW9uLCBCYXNpY0Jsb2NrPjo6UHJvZmlsZUluZm9UKCkgeworICBNYWNoaW5lUHJvZmlsZSA9IDA7Cit9Cit0ZW1wbGF0ZSA8PgorUHJvZmlsZUluZm9UPEZ1bmN0aW9uLCBCYXNpY0Jsb2NrPjo6flByb2ZpbGVJbmZvVCgpIHsKKyAgaWYgKE1hY2hpbmVQcm9maWxlKSBkZWxldGUgTWFjaGluZVByb2ZpbGU7Cit9CisKK3RlbXBsYXRlPD4KK2NoYXIgUHJvZmlsZUluZm9UPEZ1bmN0aW9uLEJhc2ljQmxvY2s+OjpJRCA9IDA7CisKK3RlbXBsYXRlPD4KK2NoYXIgUHJvZmlsZUluZm9UPE1hY2hpbmVGdW5jdGlvbiwgTWFjaGluZUJhc2ljQmxvY2s+OjpJRCA9IDA7CisKK3RlbXBsYXRlPD4KK2NvbnN0IGRvdWJsZSBQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46Ok1pc3NpbmdWYWx1ZSA9IC0xOworCit0ZW1wbGF0ZTw+IGNvbnN0Citkb3VibGUgUHJvZmlsZUluZm9UPE1hY2hpbmVGdW5jdGlvbiwgTWFjaGluZUJhc2ljQmxvY2s+OjpNaXNzaW5nVmFsdWUgPSAtMTsKKwordGVtcGxhdGU8PiBkb3VibGUKK1Byb2ZpbGVJbmZvVDxGdW5jdGlvbixCYXNpY0Jsb2NrPjo6Z2V0RXhlY3V0aW9uQ291bnQoY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgc3RkOjptYXA8Y29uc3QgRnVuY3Rpb24qLCBCbG9ja0NvdW50cz46Oml0ZXJhdG9yIEogPQorICAgIEJsb2NrSW5mb3JtYXRpb24uZmluZChCQi0+Z2V0UGFyZW50KCkpOworICBpZiAoSiAhPSBCbG9ja0luZm9ybWF0aW9uLmVuZCgpKSB7CisgICAgQmxvY2tDb3VudHM6Oml0ZXJhdG9yIEkgPSBKLT5zZWNvbmQuZmluZChCQik7CisgICAgaWYgKEkgIT0gSi0+c2Vjb25kLmVuZCgpKQorICAgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCisgIGRvdWJsZSBDb3VudCA9IE1pc3NpbmdWYWx1ZTsKKworICBjb25zdF9wcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihCQiksIFBFID0gcHJlZF9lbmQoQkIpOworCisgIC8vIEFyZSB0aGVyZSB6ZXJvIHByZWRlY2Vzc29ycyBvZiB0aGlzIGJsb2NrPworICBpZiAoUEkgPT0gUEUpIHsKKyAgICBFZGdlIGUgPSBnZXRFZGdlKDAsIEJCKTsKKyAgICBDb3VudCA9IGdldEVkZ2VXZWlnaHQoZSk7CisgIH0gZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGVyZSBhcmUgcHJlZGVjZXNzb3JzLCB0aGUgZXhlY3V0aW9uIGNvdW50IG9mIHRoaXMgYmxvY2sgaXMKKyAgICAvLyB0aGUgc3VtIG9mIHRoZSBlZGdlIGZyZXF1ZW5jaWVzIGZyb20gdGhlIGluY29taW5nIGVkZ2VzLgorICAgIHN0ZDo6c2V0PGNvbnN0IEJhc2ljQmxvY2sqPiBQcm9jZXNzZWRQcmVkczsKKyAgICBDb3VudCA9IDA7CisgICAgZm9yICg7IFBJICE9IFBFOyArK1BJKSB7CisgICAgICBjb25zdCBCYXNpY0Jsb2NrICpQID0gKlBJOworICAgICAgaWYgKFByb2Nlc3NlZFByZWRzLmluc2VydChQKS5zZWNvbmQpIHsKKyAgICAgICAgZG91YmxlIHcgPSBnZXRFZGdlV2VpZ2h0KGdldEVkZ2UoUCwgQkIpKTsKKyAgICAgICAgaWYgKHcgPT0gTWlzc2luZ1ZhbHVlKSB7CisgICAgICAgICAgQ291bnQgPSBNaXNzaW5nVmFsdWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQ291bnQgKz0gdzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgcHJlZGVjZXNzb3JzIGRpZCBub3Qgc3VmZmljZSB0byBnZXQgYmxvY2sgd2VpZ2h0LCB0cnkgc3VjY2Vzc29ycy4KKyAgaWYgKENvdW50ID09IE1pc3NpbmdWYWx1ZSkgeworCisgICAgc3VjY19jb25zdF9pdGVyYXRvciBTSSA9IHN1Y2NfYmVnaW4oQkIpLCBTRSA9IHN1Y2NfZW5kKEJCKTsKKworICAgIC8vIEFyZSB0aGVyZSB6ZXJvIHN1Y2Nlc3NvcnMgb2YgdGhpcyBibG9jaz8KKyAgICBpZiAoU0kgPT0gU0UpIHsKKyAgICAgIEVkZ2UgZSA9IGdldEVkZ2UoQkIsMCk7CisgICAgICBDb3VudCA9IGdldEVkZ2VXZWlnaHQoZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6c2V0PGNvbnN0IEJhc2ljQmxvY2sqPiBQcm9jZXNzZWRTdWNjczsKKyAgICAgIENvdW50ID0gMDsKKyAgICAgIGZvciAoOyBTSSAhPSBTRTsgKytTSSkKKyAgICAgICAgaWYgKFByb2Nlc3NlZFN1Y2NzLmluc2VydCgqU0kpLnNlY29uZCkgeworICAgICAgICAgIGRvdWJsZSB3ID0gZ2V0RWRnZVdlaWdodChnZXRFZGdlKEJCLCAqU0kpKTsKKyAgICAgICAgICBpZiAodyA9PSBNaXNzaW5nVmFsdWUpIHsKKyAgICAgICAgICAgIENvdW50ID0gTWlzc2luZ1ZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIENvdW50ICs9IHc7CisgICAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoQ291bnQgIT0gTWlzc2luZ1ZhbHVlKSBCbG9ja0luZm9ybWF0aW9uW0JCLT5nZXRQYXJlbnQoKV1bQkJdID0gQ291bnQ7CisgIHJldHVybiBDb3VudDsKK30KKwordGVtcGxhdGU8PgorZG91YmxlIFByb2ZpbGVJbmZvVDxNYWNoaW5lRnVuY3Rpb24sIE1hY2hpbmVCYXNpY0Jsb2NrPjo6CisgICAgICAgIGdldEV4ZWN1dGlvbkNvdW50KGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgc3RkOjptYXA8Y29uc3QgTWFjaGluZUZ1bmN0aW9uKiwgQmxvY2tDb3VudHM+OjppdGVyYXRvciBKID0KKyAgICBCbG9ja0luZm9ybWF0aW9uLmZpbmQoTUJCLT5nZXRQYXJlbnQoKSk7CisgIGlmIChKICE9IEJsb2NrSW5mb3JtYXRpb24uZW5kKCkpIHsKKyAgICBCbG9ja0NvdW50czo6aXRlcmF0b3IgSSA9IEotPnNlY29uZC5maW5kKE1CQik7CisgICAgaWYgKEkgIT0gSi0+c2Vjb25kLmVuZCgpKQorICAgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCisgIHJldHVybiBNaXNzaW5nVmFsdWU7Cit9CisKK3RlbXBsYXRlPD4KK2RvdWJsZSBQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46OmdldEV4ZWN1dGlvbkNvdW50KGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIHN0ZDo6bWFwPGNvbnN0IEZ1bmN0aW9uKiwgZG91YmxlPjo6aXRlcmF0b3IgSiA9CisgICAgRnVuY3Rpb25JbmZvcm1hdGlvbi5maW5kKEYpOworICBpZiAoSiAhPSBGdW5jdGlvbkluZm9ybWF0aW9uLmVuZCgpKQorICAgIHJldHVybiBKLT5zZWNvbmQ7CisKKyAgLy8gaXNEZWNsYXJhdGlvbigpIGlzIGNoZWNrZWQgaGVyZSBhbmQgbm90IGF0IHN0YXJ0IG9mIGZ1bmN0aW9uIHRvIGFsbG93CisgIC8vIGZ1bmN0aW9ucyB3aXRob3V0IGEgYm9keSBzdGlsbCB0byBoYXZlIGEgZXhlY3V0aW9uIGNvdW50LgorICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpKSByZXR1cm4gTWlzc2luZ1ZhbHVlOworCisgIGRvdWJsZSBDb3VudCA9IGdldEV4ZWN1dGlvbkNvdW50KCZGLT5nZXRFbnRyeUJsb2NrKCkpOworICBpZiAoQ291bnQgIT0gTWlzc2luZ1ZhbHVlKSBGdW5jdGlvbkluZm9ybWF0aW9uW0ZdID0gQ291bnQ7CisgIHJldHVybiBDb3VudDsKK30KKwordGVtcGxhdGU8PgorZG91YmxlIFByb2ZpbGVJbmZvVDxNYWNoaW5lRnVuY3Rpb24sIE1hY2hpbmVCYXNpY0Jsb2NrPjo6CisgICAgICAgIGdldEV4ZWN1dGlvbkNvdW50KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYpIHsKKyAgc3RkOjptYXA8Y29uc3QgTWFjaGluZUZ1bmN0aW9uKiwgZG91YmxlPjo6aXRlcmF0b3IgSiA9CisgICAgRnVuY3Rpb25JbmZvcm1hdGlvbi5maW5kKE1GKTsKKyAgaWYgKEogIT0gRnVuY3Rpb25JbmZvcm1hdGlvbi5lbmQoKSkKKyAgICByZXR1cm4gSi0+c2Vjb25kOworCisgIGRvdWJsZSBDb3VudCA9IGdldEV4ZWN1dGlvbkNvdW50KCZNRi0+ZnJvbnQoKSk7CisgIGlmIChDb3VudCAhPSBNaXNzaW5nVmFsdWUpIEZ1bmN0aW9uSW5mb3JtYXRpb25bTUZdID0gQ291bnQ7CisgIHJldHVybiBDb3VudDsKK30KKwordGVtcGxhdGU8Pgordm9pZCBQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46OgorICAgICAgICBzZXRFeGVjdXRpb25Db3VudChjb25zdCBCYXNpY0Jsb2NrICpCQiwgZG91YmxlIHcpIHsKKyAgREVCVUcoZGJncygpIDw8ICJDcmVhdGluZyBCbG9jayAiIDw8IEJCLT5nZXROYW1lKCkgCisgICAgICAgICAgICAgICA8PCAiICh3ZWlnaHQ6ICIgPDwgZm9ybWF0KCIlLjIwZyIsdykgPDwgIilcbiIpOworICBCbG9ja0luZm9ybWF0aW9uW0JCLT5nZXRQYXJlbnQoKV1bQkJdID0gdzsKK30KKwordGVtcGxhdGU8Pgordm9pZCBQcm9maWxlSW5mb1Q8TWFjaGluZUZ1bmN0aW9uLCBNYWNoaW5lQmFzaWNCbG9jaz46OgorICAgICAgICBzZXRFeGVjdXRpb25Db3VudChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCBkb3VibGUgdykgeworICBERUJVRyhkYmdzKCkgPDwgIkNyZWF0aW5nIEJsb2NrICIgPDwgTUJCLT5nZXRCYXNpY0Jsb2NrKCktPmdldE5hbWUoKQorICAgICAgICAgICAgICAgPDwgIiAod2VpZ2h0OiAiIDw8IGZvcm1hdCgiJS4yMGciLHcpIDw8ICIpXG4iKTsKKyAgQmxvY2tJbmZvcm1hdGlvbltNQkItPmdldFBhcmVudCgpXVtNQkJdID0gdzsKK30KKwordGVtcGxhdGU8Pgordm9pZCBQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46OmFkZEVkZ2VXZWlnaHQoRWRnZSBlLCBkb3VibGUgdykgeworICBkb3VibGUgb2xkdyA9IGdldEVkZ2VXZWlnaHQoZSk7CisgIGFzc2VydCAob2xkdyAhPSBNaXNzaW5nVmFsdWUgJiYgIkFkZGluZyB3ZWlnaHQgdG8gRWRnZSB3aXRoIG5vIHByZXZpb3VzIHdlaWdodCIpOworICBERUJVRyhkYmdzKCkgPDwgIkFkZGluZyB0byBFZGdlICIgPDwgZQorICAgICAgICAgICAgICAgPDwgIiAobmV3IHdlaWdodDogIiA8PCBmb3JtYXQoIiUuMjBnIixvbGR3ICsgdykgPDwgIilcbiIpOworICBFZGdlSW5mb3JtYXRpb25bZ2V0RnVuY3Rpb24oZSldW2VdID0gb2xkdyArIHc7Cit9CisKK3RlbXBsYXRlPD4KK3ZvaWQgUHJvZmlsZUluZm9UPEZ1bmN0aW9uLEJhc2ljQmxvY2s+OjoKKyAgICAgICAgYWRkRXhlY3V0aW9uQ291bnQoY29uc3QgQmFzaWNCbG9jayAqQkIsIGRvdWJsZSB3KSB7CisgIGRvdWJsZSBvbGR3ID0gZ2V0RXhlY3V0aW9uQ291bnQoQkIpOworICBhc3NlcnQgKG9sZHcgIT0gTWlzc2luZ1ZhbHVlICYmICJBZGRpbmcgd2VpZ2h0IHRvIEJsb2NrIHdpdGggbm8gcHJldmlvdXMgd2VpZ2h0Iik7CisgIERFQlVHKGRiZ3MoKSA8PCAiQWRkaW5nIHRvIEJsb2NrICIgPDwgQkItPmdldE5hbWUoKQorICAgICAgICAgICAgICAgPDwgIiAobmV3IHdlaWdodDogIiA8PCBmb3JtYXQoIiUuMjBnIixvbGR3ICsgdykgPDwgIilcbiIpOworICBCbG9ja0luZm9ybWF0aW9uW0JCLT5nZXRQYXJlbnQoKV1bQkJdID0gb2xkdyArIHc7Cit9CisKK3RlbXBsYXRlPD4KK3ZvaWQgUHJvZmlsZUluZm9UPEZ1bmN0aW9uLEJhc2ljQmxvY2s+OjpyZW1vdmVCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICBzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiosIEJsb2NrQ291bnRzPjo6aXRlcmF0b3IgSiA9CisgICAgQmxvY2tJbmZvcm1hdGlvbi5maW5kKEJCLT5nZXRQYXJlbnQoKSk7CisgIGlmIChKID09IEJsb2NrSW5mb3JtYXRpb24uZW5kKCkpIHJldHVybjsKKworICBERUJVRyhkYmdzKCkgPDwgIkRlbGV0aW5nICIgPDwgQkItPmdldE5hbWUoKSA8PCAiXG4iKTsKKyAgSi0+c2Vjb25kLmVyYXNlKEJCKTsKK30KKwordGVtcGxhdGU8Pgordm9pZCBQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46OnJlbW92ZUVkZ2UoRWRnZSBlKSB7CisgIHN0ZDo6bWFwPGNvbnN0IEZ1bmN0aW9uKiwgRWRnZVdlaWdodHM+OjppdGVyYXRvciBKID0KKyAgICBFZGdlSW5mb3JtYXRpb24uZmluZChnZXRGdW5jdGlvbihlKSk7CisgIGlmIChKID09IEVkZ2VJbmZvcm1hdGlvbi5lbmQoKSkgcmV0dXJuOworCisgIERFQlVHKGRiZ3MoKSA8PCAiRGVsZXRpbmciIDw8IGUgPDwgIlxuIik7CisgIEotPnNlY29uZC5lcmFzZShlKTsKK30KKwordGVtcGxhdGU8Pgordm9pZCBQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46OgorICAgICAgICByZXBsYWNlRWRnZShjb25zdCBFZGdlICZvbGRlZGdlLCBjb25zdCBFZGdlICZuZXdlZGdlKSB7CisgIGRvdWJsZSB3OworICBpZiAoKHcgPSBnZXRFZGdlV2VpZ2h0KG5ld2VkZ2UpKSA9PSBNaXNzaW5nVmFsdWUpIHsKKyAgICB3ID0gZ2V0RWRnZVdlaWdodChvbGRlZGdlKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlJlcGxhY2luZyAiIDw8IG9sZGVkZ2UgPDwgIiB3aXRoICIgPDwgbmV3ZWRnZSAgPDwgIlxuIik7CisgIH0gZWxzZSB7CisgICAgdyArPSBnZXRFZGdlV2VpZ2h0KG9sZGVkZ2UpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiQWRkaW5nICIgPDwgb2xkZWRnZSA8PCAiIHRvICIgPDwgbmV3ZWRnZSAgPDwgIlxuIik7CisgIH0KKyAgc2V0RWRnZVdlaWdodChuZXdlZGdlLHcpOworICByZW1vdmVFZGdlKG9sZGVkZ2UpOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBCYXNpY0Jsb2NrICpQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46OgorICAgICAgICBHZXRQYXRoKGNvbnN0IEJhc2ljQmxvY2sgKlNyYywgY29uc3QgQmFzaWNCbG9jayAqRGVzdCwKKyAgICAgICAgICAgICAgICBQYXRoICZQLCB1bnNpZ25lZCBNb2RlKSB7CisgIGNvbnN0IEJhc2ljQmxvY2sgKkJCID0gMDsKKyAgYm9vbCBoYXNGb3VuZFBhdGggPSBmYWxzZTsKKworICBzdGQ6OnF1ZXVlPGNvbnN0IEJhc2ljQmxvY2sgKj4gQkZTOworICBCRlMucHVzaChTcmMpOworCisgIHdoaWxlKEJGUy5zaXplKCkgJiYgIWhhc0ZvdW5kUGF0aCkgeworICAgIEJCID0gQkZTLmZyb250KCk7CisgICAgQkZTLnBvcCgpOworCisgICAgc3VjY19jb25zdF9pdGVyYXRvciBTdWNjID0gc3VjY19iZWdpbihCQiksIEVuZCA9IHN1Y2NfZW5kKEJCKTsKKyAgICBpZiAoU3VjYyA9PSBFbmQpIHsKKyAgICAgIFBbMF0gPSBCQjsKKyAgICAgIGlmIChNb2RlICYgR2V0UGF0aFRvRXhpdCkgeworICAgICAgICBoYXNGb3VuZFBhdGggPSB0cnVlOworICAgICAgICBCQiA9IDA7CisgICAgICB9CisgICAgfQorICAgIGZvcig7U3VjYyAhPSBFbmQ7ICsrU3VjYykgeworICAgICAgaWYgKFAuZmluZCgqU3VjYykgIT0gUC5lbmQoKSkgY29udGludWU7CisgICAgICBFZGdlIGUgPSBnZXRFZGdlKEJCLCpTdWNjKTsKKyAgICAgIGlmICgoTW9kZSAmIEdldFBhdGhXaXRoTmV3RWRnZXMpICYmIChnZXRFZGdlV2VpZ2h0KGUpICE9IE1pc3NpbmdWYWx1ZSkpIGNvbnRpbnVlOworICAgICAgUFsqU3VjY10gPSBCQjsKKyAgICAgIEJGUy5wdXNoKCpTdWNjKTsKKyAgICAgIGlmICgoTW9kZSAmIEdldFBhdGhUb0Rlc3QpICYmICpTdWNjID09IERlc3QpIHsKKyAgICAgICAgaGFzRm91bmRQYXRoID0gdHJ1ZTsKKyAgICAgICAgQkIgPSAqU3VjYzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoKE1vZGUgJiBHZXRQYXRoVG9WYWx1ZSkgJiYgKGdldEV4ZWN1dGlvbkNvdW50KCpTdWNjKSAhPSBNaXNzaW5nVmFsdWUpKSB7CisgICAgICAgIGhhc0ZvdW5kUGF0aCA9IHRydWU7CisgICAgICAgIEJCID0gKlN1Y2M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBCQjsKK30KKwordGVtcGxhdGU8Pgordm9pZCBQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46OgorICAgICAgICBkaXZlcnRGbG93KGNvbnN0IEVkZ2UgJm9sZGVkZ2UsIGNvbnN0IEVkZ2UgJm5ld2VkZ2UpIHsKKyAgREVCVUcoZGJncygpIDw8ICJEaXZlcnRpbmcgIiA8PCBvbGRlZGdlIDw8ICIgdmlhICIgPDwgbmV3ZWRnZSApOworCisgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZSBvbGQgZWRnZSB3YXMgdGFrZW4sIGlmIG5vdCwganVzdCBkZWxldGUgaXQuLi4KKyAgaWYgKGdldEVkZ2VXZWlnaHQob2xkZWRnZSkgPT0gMCkgeworICAgIHJlbW92ZUVkZ2Uob2xkZWRnZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgUGF0aCBQOworICBQW25ld2VkZ2UuZmlyc3RdID0gMDsKKyAgUFtuZXdlZGdlLnNlY29uZF0gPSBuZXdlZGdlLmZpcnN0OworICBjb25zdCBCYXNpY0Jsb2NrICpCQiA9IEdldFBhdGgobmV3ZWRnZS5zZWNvbmQsb2xkZWRnZS5zZWNvbmQsUCxHZXRQYXRoVG9FeGl0IHwgR2V0UGF0aFRvRGVzdCk7CisKKyAgZG91YmxlIHcgPSBnZXRFZGdlV2VpZ2h0IChvbGRlZGdlKTsKKyAgREVCVUcoZGJncygpIDw8ICIsIFdlaWdodDogIiA8PCBmb3JtYXQoIiUuMjBnIix3KSA8PCAiXG4iKTsKKyAgZG8geworICAgIGNvbnN0IEJhc2ljQmxvY2sgKlBhcmVudCA9IFAuZmluZChCQiktPnNlY29uZDsKKyAgICBFZGdlIGUgPSBnZXRFZGdlKFBhcmVudCxCQik7CisgICAgZG91YmxlIG9sZHcgPSBnZXRFZGdlV2VpZ2h0KGUpOworICAgIGRvdWJsZSBvbGRjID0gZ2V0RXhlY3V0aW9uQ291bnQoZS5maXJzdCk7CisgICAgc2V0RWRnZVdlaWdodChlLCB3K29sZHcpOworICAgIGlmIChQYXJlbnQgIT0gb2xkZWRnZS5maXJzdCkgeworICAgICAgc2V0RXhlY3V0aW9uQ291bnQoZS5maXJzdCwgdytvbGRjKTsKKyAgICB9CisgICAgQkIgPSBQYXJlbnQ7CisgIH0gd2hpbGUgKEJCICE9IG5ld2VkZ2UuZmlyc3QpOworICByZW1vdmVFZGdlKG9sZGVkZ2UpOworfQorCisvLy8gUmVwbGFjZXMgYWxsIG9jY3VyZW5jZXMgb2YgUm1CQiBpbiB0aGUgUHJvZmlsaW5nSW5mbyB3aXRoIERlc3RCQi4KKy8vLyBUaGlzIGNoZWNrcyBhbGwgZWRnZXMgb2YgdGhlIGZ1bmN0aW9uIHRoZSBibG9ja3MgcmVzaWRlIGluIGFuZCByZXBsYWNlcyB0aGUKKy8vLyBvY2N1cmVuY2VzIG9mIFJtQkIgd2l0aCBEZXN0QkIuCit0ZW1wbGF0ZTw+Cit2b2lkIFByb2ZpbGVJbmZvVDxGdW5jdGlvbixCYXNpY0Jsb2NrPjo6CisgICAgICAgIHJlcGxhY2VBbGxVc2VzKGNvbnN0IEJhc2ljQmxvY2sgKlJtQkIsIGNvbnN0IEJhc2ljQmxvY2sgKkRlc3RCQikgeworICBERUJVRyhkYmdzKCkgPDwgIlJlcGxhY2luZyAiIDw8IFJtQkItPmdldE5hbWUoKQorICAgICAgICAgICAgICAgPDwgIiB3aXRoICIgPDwgRGVzdEJCLT5nZXROYW1lKCkgPDwgIlxuIik7CisgIGNvbnN0IEZ1bmN0aW9uICpGID0gRGVzdEJCLT5nZXRQYXJlbnQoKTsKKyAgc3RkOjptYXA8Y29uc3QgRnVuY3Rpb24qLCBFZGdlV2VpZ2h0cz46Oml0ZXJhdG9yIEogPQorICAgIEVkZ2VJbmZvcm1hdGlvbi5maW5kKEYpOworICBpZiAoSiA9PSBFZGdlSW5mb3JtYXRpb24uZW5kKCkpIHJldHVybjsKKworICBFZGdlIGUsIG5ld2VkZ2U7CisgIGJvb2wgZXJhc2VkZWRnZSA9IGZhbHNlOworICBFZGdlV2VpZ2h0czo6aXRlcmF0b3IgSSA9IEotPnNlY29uZC5iZWdpbigpLCBFID0gSi0+c2Vjb25kLmVuZCgpOworICB3aGlsZShJICE9IEUpIHsKKyAgICBlID0gKEkrKyktPmZpcnN0OworICAgIGJvb2wgZm91bmRlZGdlID0gZmFsc2U7IGJvb2wgZXJhc2VlZGdlID0gZmFsc2U7CisgICAgaWYgKGUuZmlyc3QgPT0gUm1CQikgeworICAgICAgaWYgKGUuc2Vjb25kID09IERlc3RCQikgeworICAgICAgICBlcmFzZWVkZ2UgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3ZWRnZSA9IGdldEVkZ2UoRGVzdEJCLCBlLnNlY29uZCk7CisgICAgICAgIGZvdW5kZWRnZSA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChlLnNlY29uZCA9PSBSbUJCKSB7CisgICAgICBpZiAoZS5maXJzdCA9PSBEZXN0QkIpIHsKKyAgICAgICAgZXJhc2VlZGdlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ld2VkZ2UgPSBnZXRFZGdlKGUuZmlyc3QsIERlc3RCQik7CisgICAgICAgIGZvdW5kZWRnZSA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChmb3VuZGVkZ2UpIHsKKyAgICAgIHJlcGxhY2VFZGdlKGUsIG5ld2VkZ2UpOworICAgIH0KKyAgICBpZiAoZXJhc2VlZGdlKSB7CisgICAgICBpZiAoZXJhc2VkZWRnZSkgeworICAgICAgICBFZGdlIG5ld2VkZ2UgPSBnZXRFZGdlKERlc3RCQiwgRGVzdEJCKTsKKyAgICAgICAgcmVwbGFjZUVkZ2UoZSwgbmV3ZWRnZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW1vdmVFZGdlKGUpOworICAgICAgICBlcmFzZWRlZGdlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8vIFNwbGl0cyBhbiBlZGdlIGluIHRoZSBQcm9maWxlSW5mbyBhbmQgcmVkaXJlY3RzIGZsb3cgb3ZlciBOZXdCQi4KKy8vLyBTaW5jZSBpdHMgcG9zc2libGUgdGhhdCB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGVkZ2UgaW4gdGhlIENGRyBmcm9tIEZyaXN0QkIKKy8vLyB0byBTZWNvbmRCQiBpdHMgbmVjZXNzYXJ5IHRvIHJlZGlyZWN0IHRoZSBmbG93IHByb3BvcmlvbmFsbHkuCit0ZW1wbGF0ZTw+Cit2b2lkIFByb2ZpbGVJbmZvVDxGdW5jdGlvbixCYXNpY0Jsb2NrPjo6c3BsaXRFZGdlKGNvbnN0IEJhc2ljQmxvY2sgKkZpcnN0QkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2ljQmxvY2sgKlNlY29uZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrICpOZXdCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNZXJnZUlkZW50aWNhbEVkZ2VzKSB7CisgIGNvbnN0IEZ1bmN0aW9uICpGID0gRmlyc3RCQi0+Z2V0UGFyZW50KCk7CisgIHN0ZDo6bWFwPGNvbnN0IEZ1bmN0aW9uKiwgRWRnZVdlaWdodHM+OjppdGVyYXRvciBKID0KKyAgICBFZGdlSW5mb3JtYXRpb24uZmluZChGKTsKKyAgaWYgKEogPT0gRWRnZUluZm9ybWF0aW9uLmVuZCgpKSByZXR1cm47CisKKyAgLy8gR2VuZXJhdGUgZWRnZXMgYW5kIHJlYWQgY3VycmVudCB3ZWlnaHQuCisgIEVkZ2UgZSAgPSBnZXRFZGdlKEZpcnN0QkIsIFNlY29uZEJCKTsKKyAgRWRnZSBuMSA9IGdldEVkZ2UoRmlyc3RCQiwgTmV3QkIpOworICBFZGdlIG4yID0gZ2V0RWRnZShOZXdCQiwgU2Vjb25kQkIpOworICBFZGdlV2VpZ2h0cyAmRUNzID0gSi0+c2Vjb25kOworICBkb3VibGUgdyA9IEVDc1tlXTsKKworICBpbnQgc3VjY19jb3VudCA9IDA7CisgIGlmICghTWVyZ2VJZGVudGljYWxFZGdlcykgeworICAgIC8vIEZpcnN0IGNvdW50IHRoZSBlZGdlcyBmcm9tIEZyaXN0QkIgdG8gU2Vjb25kQkIsIGlmIHRoZXJlIGlzIG1vcmUgdGhhbgorICAgIC8vIG9uZSwgb25seSBzbGljZSBvdXQgYSBwcm9wb3Jpb25hbCBwYXJ0IGZvciBOZXdCQi4KKyAgICBmb3Ioc3VjY19jb25zdF9pdGVyYXRvciBCQkkgPSBzdWNjX2JlZ2luKEZpcnN0QkIpLCBCQkUgPSBzdWNjX2VuZChGaXJzdEJCKTsKKyAgICAgICAgQkJJICE9IEJCRTsgKytCQkkpIHsKKyAgICAgIGlmICgqQkJJID09IFNlY29uZEJCKSBzdWNjX2NvdW50Kys7ICAKKyAgICB9CisgICAgLy8gV2hlbiB0aGUgTmV3QkIgaXMgY29tcGxldGVseSBuZXcsIGluY3JlbWVudCB0aGUgY291bnQgYnkgb25lIHNvIHRoYXQKKyAgICAvLyB0aGUgY291bnRzIGFyZSBwcm9wZXJseSBkaXN0cmlidXRlZC4KKyAgICBpZiAoZ2V0RXhlY3V0aW9uQ291bnQoTmV3QkIpID09IFByb2ZpbGVJbmZvOjpNaXNzaW5nVmFsdWUpIHN1Y2NfY291bnQrKzsKKyAgfSBlbHNlIHsKKyAgICAvLyBXaGVuIHRoZSBlZGdlcyBhcmUgbWVyZ2VkIGFueXdheSwgdGhlbiByZWRpcmVjdCBhbGwgZmxvdy4KKyAgICBzdWNjX2NvdW50ID0gMTsKKyAgfQorCisgIC8vIFdlIGtub3cgbm93IGhvdyBtYW55IGVkZ2VzIHRoZXJlIGFyZSBmcm9tIEZpcnN0QkIgdG8gU2Vjb25kQkIsIHJlcm91dGUgYQorICAvLyBwcm9wb3J0aW9uYWwgcGFydCBvZiB0aGUgZWRnZSB3ZWlnaHQgb3ZlciBOZXdCQi4KKyAgZG91YmxlIG5ld3cgPSBmbG9vcih3IC8gc3VjY19jb3VudCk7CisgIEVDc1tuMV0gKz0gbmV3dzsKKyAgRUNzW24yXSArPSBuZXd3OworICBCbG9ja0luZm9ybWF0aW9uW0ZdW05ld0JCXSArPSBuZXd3OworICBpZiAoc3VjY19jb3VudCA9PSAxKSB7CisgICAgRUNzLmVyYXNlKGUpOworICB9IGVsc2UgeworICAgIEVDc1tlXSAtPSBuZXd3OworICB9Cit9CisKK3RlbXBsYXRlPD4KK3ZvaWQgUHJvZmlsZUluZm9UPEZ1bmN0aW9uLEJhc2ljQmxvY2s+OjpzcGxpdEJsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKk9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2ljQmxvY2sqIE5ldykgeworICBjb25zdCBGdW5jdGlvbiAqRiA9IE9sZC0+Z2V0UGFyZW50KCk7CisgIHN0ZDo6bWFwPGNvbnN0IEZ1bmN0aW9uKiwgRWRnZVdlaWdodHM+OjppdGVyYXRvciBKID0KKyAgICBFZGdlSW5mb3JtYXRpb24uZmluZChGKTsKKyAgaWYgKEogPT0gRWRnZUluZm9ybWF0aW9uLmVuZCgpKSByZXR1cm47CisKKyAgREVCVUcoZGJncygpIDw8ICJTcGxpdHRpbmcgIiA8PCBPbGQtPmdldE5hbWUoKSA8PCAiIHRvICIgPDwgTmV3LT5nZXROYW1lKCkgPDwgIlxuIik7CisKKyAgc3RkOjpzZXQ8RWRnZT4gRWRnZXM7CisgIGZvciAoRWRnZVdlaWdodHM6Oml0ZXJhdG9yIGV3aSA9IEotPnNlY29uZC5iZWdpbigpLCBld2UgPSBKLT5zZWNvbmQuZW5kKCk7IAorICAgICAgIGV3aSAhPSBld2U7ICsrZXdpKSB7CisgICAgRWRnZSBvbGQgPSBld2ktPmZpcnN0OworICAgIGlmIChvbGQuZmlyc3QgPT0gT2xkKSB7CisgICAgICBFZGdlcy5pbnNlcnQob2xkKTsKKyAgICB9CisgIH0KKyAgZm9yIChzdGQ6OnNldDxFZGdlPjo6aXRlcmF0b3IgRUkgPSBFZGdlcy5iZWdpbigpLCBFRSA9IEVkZ2VzLmVuZCgpOyAKKyAgICAgICBFSSAhPSBFRTsgKytFSSkgeworICAgIEVkZ2UgbmV3ZWRnZSA9IGdldEVkZ2UoTmV3LCBFSS0+c2Vjb25kKTsKKyAgICByZXBsYWNlRWRnZSgqRUksIG5ld2VkZ2UpOworICB9CisKKyAgZG91YmxlIHcgPSBnZXRFeGVjdXRpb25Db3VudChPbGQpOworICBzZXRFZGdlV2VpZ2h0KGdldEVkZ2UoT2xkLCBOZXcpLCB3KTsKKyAgc2V0RXhlY3V0aW9uQ291bnQoTmV3LCB3KTsKK30KKwordGVtcGxhdGU8Pgordm9pZCBQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46OnNwbGl0QmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrKiBOZXdCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKmNvbnN0ICpQcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVByZWRzKSB7CisgIGNvbnN0IEZ1bmN0aW9uICpGID0gQkItPmdldFBhcmVudCgpOworICBzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiosIEVkZ2VXZWlnaHRzPjo6aXRlcmF0b3IgSiA9CisgICAgRWRnZUluZm9ybWF0aW9uLmZpbmQoRik7CisgIGlmIChKID09IEVkZ2VJbmZvcm1hdGlvbi5lbmQoKSkgcmV0dXJuOworCisgIERFQlVHKGRiZ3MoKSA8PCAiU3BsaXR0aW5nICIgPDwgTnVtUHJlZHMgPDwgIiBFZGdlcyBmcm9tICIgPDwgQkItPmdldE5hbWUoKSAKKyAgICAgICAgICAgICAgIDw8ICIgdG8gIiA8PCBOZXdCQi0+Z2V0TmFtZSgpIDw8ICJcbiIpOworCisgIC8vIENvbGxlY3Qgd2VpZ2h0IHRoYXQgd2FzIHJlZGlyZWN0ZWQgb3ZlciBOZXdCQi4KKyAgZG91YmxlIG5ld3dlaWdodCA9IDA7CisgIAorICBzdGQ6OnNldDxjb25zdCBCYXNpY0Jsb2NrICo+IFByb2Nlc3NlZFByZWRzOworICAvLyBGb3IgYWxsIHJlcXVlc3RlcyBQcmVkZWNlc3NvcnMuCisgIGZvciAodW5zaWduZWQgcHJlZCA9IDA7IHByZWQgPCBOdW1QcmVkczsgKytwcmVkKSB7CisgICAgY29uc3QgQmFzaWNCbG9jayAqIFByZWQgPSBQcmVkc1twcmVkXTsKKyAgICBpZiAoUHJvY2Vzc2VkUHJlZHMuaW5zZXJ0KFByZWQpLnNlY29uZCkgeworICAgICAgLy8gQ3JlYXRlIGVkZ2VzIGFuZCByZWFkIG9sZCB3ZWlnaHQuCisgICAgICBFZGdlIG9sZGVkZ2UgPSBnZXRFZGdlKFByZWQsIEJCKTsKKyAgICAgIEVkZ2UgbmV3ZWRnZSA9IGdldEVkZ2UoUHJlZCwgTmV3QkIpOworCisgICAgICAvLyBSZW1lbWJlciBob3cgbXVjaCB3ZWlnaHQgd2FzIHJlZGlyZWN0ZWQuCisgICAgICBuZXd3ZWlnaHQgKz0gZ2V0RWRnZVdlaWdodChvbGRlZGdlKTsKKyAgICAKKyAgICAgIHJlcGxhY2VFZGdlKG9sZGVkZ2UsbmV3ZWRnZSk7CisgICAgfQorICB9CisKKyAgRWRnZSBuZXdlZGdlID0gZ2V0RWRnZShOZXdCQixCQik7CisgIHNldEVkZ2VXZWlnaHQobmV3ZWRnZSwgbmV3d2VpZ2h0KTsKKyAgc2V0RXhlY3V0aW9uQ291bnQoTmV3QkIsIG5ld3dlaWdodCk7Cit9CisKK3RlbXBsYXRlPD4KK3ZvaWQgUHJvZmlsZUluZm9UPEZ1bmN0aW9uLEJhc2ljQmxvY2s+Ojp0cmFuc2Zlcihjb25zdCBGdW5jdGlvbiAqT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICpOZXcpIHsKKyAgREVCVUcoZGJncygpIDw8ICJSZXBsYWNpbmcgRnVuY3Rpb24gIiA8PCBPbGQtPmdldE5hbWUoKSA8PCAiIHdpdGggIgorICAgICAgICAgICAgICAgPDwgTmV3LT5nZXROYW1lKCkgPDwgIlxuIik7CisgIHN0ZDo6bWFwPGNvbnN0IEZ1bmN0aW9uKiwgRWRnZVdlaWdodHM+OjppdGVyYXRvciBKID0KKyAgICBFZGdlSW5mb3JtYXRpb24uZmluZChPbGQpOworICBpZihKICE9IEVkZ2VJbmZvcm1hdGlvbi5lbmQoKSkgeworICAgIEVkZ2VJbmZvcm1hdGlvbltOZXddID0gSi0+c2Vjb25kOworICB9CisgIEVkZ2VJbmZvcm1hdGlvbi5lcmFzZShPbGQpOworICBCbG9ja0luZm9ybWF0aW9uLmVyYXNlKE9sZCk7CisgIEZ1bmN0aW9uSW5mb3JtYXRpb24uZXJhc2UoT2xkKTsKK30KKworc3RhdGljIGRvdWJsZSByZWFkRWRnZU9yUmVtZW1iZXIoUHJvZmlsZUluZm86OkVkZ2UgZWRnZSwgZG91YmxlIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlSW5mbzo6RWRnZSAmdG9jYWxjLCB1bnNpZ25lZCAmdW5jYWxjKSB7CisgIGlmICh3ID09IFByb2ZpbGVJbmZvOjpNaXNzaW5nVmFsdWUpIHsKKyAgICB0b2NhbGMgPSBlZGdlOworICAgIHVuY2FsYysrOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiB3OworICB9Cit9CisKK3RlbXBsYXRlPD4KK2Jvb2wgUHJvZmlsZUluZm9UPEZ1bmN0aW9uLEJhc2ljQmxvY2s+OjoKKyAgICAgICAgQ2FsY3VsYXRlTWlzc2luZ0VkZ2UoY29uc3QgQmFzaWNCbG9jayAqQkIsIEVkZ2UgJnJlbW92ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXNzdW1lRW1wdHlTZWxmKSB7CisgIEVkZ2UgZWRnZXRvY2FsYzsKKyAgdW5zaWduZWQgdW5jYWxjdWxhdGVkID0gMDsKKworICAvLyBjb2xsZWN0IHdlaWdodHMgb2YgYWxsIGluY29taW5nIGFuZCBvdXRnb2luZyBlZGdlcywgcmVtZW1lciBlZGdlcyB0aGF0CisgIC8vIGhhdmUgbm8gdmFsdWUKKyAgZG91YmxlIGluY291bnQgPSAwOworICBTbWFsbFNldDxjb25zdCBCYXNpY0Jsb2NrKiw4PiBwcmVkX3Zpc2l0ZWQ7CisgIGNvbnN0X3ByZWRfaXRlcmF0b3IgYmJpID0gcHJlZF9iZWdpbihCQiksIGJiZSA9IHByZWRfZW5kKEJCKTsKKyAgaWYgKGJiaT09YmJlKSB7CisgICAgRWRnZSBlID0gZ2V0RWRnZSgwLEJCKTsKKyAgICBpbmNvdW50ICs9IHJlYWRFZGdlT3JSZW1lbWJlcihlLCBnZXRFZGdlV2VpZ2h0KGUpICxlZGdldG9jYWxjLHVuY2FsY3VsYXRlZCk7CisgIH0KKyAgZm9yICg7YmJpICE9IGJiZTsgKytiYmkpIHsKKyAgICBpZiAocHJlZF92aXNpdGVkLmluc2VydCgqYmJpKSkgeworICAgICAgRWRnZSBlID0gZ2V0RWRnZSgqYmJpLEJCKTsKKyAgICAgIGluY291bnQgKz0gcmVhZEVkZ2VPclJlbWVtYmVyKGUsIGdldEVkZ2VXZWlnaHQoZSkgLGVkZ2V0b2NhbGMsdW5jYWxjdWxhdGVkKTsKKyAgICB9CisgIH0KKworICBkb3VibGUgb3V0Y291bnQgPSAwOworICBTbWFsbFNldDxjb25zdCBCYXNpY0Jsb2NrKiw4PiBzdWNjX3Zpc2l0ZWQ7CisgIHN1Y2NfY29uc3RfaXRlcmF0b3Igc2JiaSA9IHN1Y2NfYmVnaW4oQkIpLCBzYmJlID0gc3VjY19lbmQoQkIpOworICBpZiAoc2JiaT09c2JiZSkgeworICAgIEVkZ2UgZSA9IGdldEVkZ2UoQkIsMCk7CisgICAgaWYgKGdldEVkZ2VXZWlnaHQoZSkgPT0gTWlzc2luZ1ZhbHVlKSB7CisgICAgICBkb3VibGUgdyA9IGdldEV4ZWN1dGlvbkNvdW50KEJCKTsKKyAgICAgIGlmICh3ICE9IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICBzZXRFZGdlV2VpZ2h0KGUsdyk7CisgICAgICAgIHJlbW92ZWQgPSBlOworICAgICAgfQorICAgIH0KKyAgICBvdXRjb3VudCArPSByZWFkRWRnZU9yUmVtZW1iZXIoZSwgZ2V0RWRnZVdlaWdodChlKSwgZWRnZXRvY2FsYywgdW5jYWxjdWxhdGVkKTsKKyAgfQorICBmb3IgKDtzYmJpICE9IHNiYmU7ICsrc2JiaSkgeworICAgIGlmIChzdWNjX3Zpc2l0ZWQuaW5zZXJ0KCpzYmJpKSkgeworICAgICAgRWRnZSBlID0gZ2V0RWRnZShCQiwqc2JiaSk7CisgICAgICBvdXRjb3VudCArPSByZWFkRWRnZU9yUmVtZW1iZXIoZSwgZ2V0RWRnZVdlaWdodChlKSwgZWRnZXRvY2FsYywgdW5jYWxjdWxhdGVkKTsKKyAgICB9CisgIH0KKworICAvLyBpZiBleGFjdGx5IG9uZSBlZGdlIHdlaWdodCB3YXMgbWlzc2luZywgY2FsY3VsYXRlIGl0IGFuZCByZW1vdmUgaXQgZnJvbQorICAvLyBzcGFubmluZyB0cmVlCisgIGlmICh1bmNhbGN1bGF0ZWQgPT0gMCApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlCisgIGlmICh1bmNhbGN1bGF0ZWQgPT0gMSkgeworICAgIGlmIChpbmNvdW50IDwgb3V0Y291bnQpIHsKKyAgICAgIEVkZ2VJbmZvcm1hdGlvbltCQi0+Z2V0UGFyZW50KCldW2VkZ2V0b2NhbGNdID0gb3V0Y291bnQtaW5jb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgRWRnZUluZm9ybWF0aW9uW0JCLT5nZXRQYXJlbnQoKV1bZWRnZXRvY2FsY10gPSBpbmNvdW50LW91dGNvdW50OworICAgIH0KKyAgICBERUJVRyhkYmdzKCkgPDwgIi0tQ2FsYyBFZGdlIENvdW50ZXIgZm9yICIgPDwgZWRnZXRvY2FsYyA8PCAiOiAiCisgICAgICAgICAgICAgICAgIDw8IGZvcm1hdCgiJS4yMGciLCBnZXRFZGdlV2VpZ2h0KGVkZ2V0b2NhbGMpKSA8PCAiXG4iKTsKKyAgICByZW1vdmVkID0gZWRnZXRvY2FsYzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIAorICBpZiAodW5jYWxjdWxhdGVkID09IDIgJiYgYXNzdW1lRW1wdHlTZWxmICYmIGVkZ2V0b2NhbGMuZmlyc3QgPT0gZWRnZXRvY2FsYy5zZWNvbmQgJiYgaW5jb3VudCA9PSBvdXRjb3VudCkgeworICAgIHNldEVkZ2VXZWlnaHQoZWRnZXRvY2FsYywgaW5jb3VudCAqIDEwKTsKKyAgICByZW1vdmVkID0gZWRnZXRvY2FsYzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworc3RhdGljIHZvaWQgcmVhZEVkZ2UoUHJvZmlsZUluZm8gKlBJLCBQcm9maWxlSW5mbzo6RWRnZSBlLCBkb3VibGUgJmNhbGN3LCBzdGQ6OnNldDxQcm9maWxlSW5mbzo6RWRnZT4gJm1pc3Njb3VudCkgeworICBkb3VibGUgdyA9IFBJLT5nZXRFZGdlV2VpZ2h0KGUpOworICBpZiAodyAhPSBQcm9maWxlSW5mbzo6TWlzc2luZ1ZhbHVlKSB7CisgICAgY2FsY3cgKz0gdzsKKyAgfSBlbHNlIHsKKyAgICBtaXNzY291bnQuaW5zZXJ0KGUpOworICB9Cit9CisKK3RlbXBsYXRlPD4KK2Jvb2wgUHJvZmlsZUluZm9UPEZ1bmN0aW9uLEJhc2ljQmxvY2s+OjpFc3RpbWF0ZU1pc3NpbmdFZGdlcyhjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICBkb3VibGUgaW5XZWlnaHQgPSAwOworICBzdGQ6OnNldDxFZGdlPiBpbk1pc3Npbmc7CisgIHN0ZDo6c2V0PGNvbnN0IEJhc2ljQmxvY2sqPiBQcm9jZXNzZWRQcmVkczsKKyAgY29uc3RfcHJlZF9pdGVyYXRvciBiYmkgPSBwcmVkX2JlZ2luKEJCKSwgYmJlID0gcHJlZF9lbmQoQkIpOworICBpZiAoYmJpID09IGJiZSkgeworICAgIHJlYWRFZGdlKHRoaXMsZ2V0RWRnZSgwLEJCKSxpbldlaWdodCxpbk1pc3NpbmcpOworICB9CisgIGZvciggOyBiYmkgIT0gYmJlOyArK2JiaSApIHsKKyAgICBpZiAoUHJvY2Vzc2VkUHJlZHMuaW5zZXJ0KCpiYmkpLnNlY29uZCkgeworICAgICAgcmVhZEVkZ2UodGhpcyxnZXRFZGdlKCpiYmksQkIpLGluV2VpZ2h0LGluTWlzc2luZyk7CisgICAgfQorICB9CisKKyAgZG91YmxlIG91dFdlaWdodCA9IDA7CisgIHN0ZDo6c2V0PEVkZ2U+IG91dE1pc3Npbmc7CisgIHN0ZDo6c2V0PGNvbnN0IEJhc2ljQmxvY2sqPiBQcm9jZXNzZWRTdWNjczsKKyAgc3VjY19jb25zdF9pdGVyYXRvciBzYmJpID0gc3VjY19iZWdpbihCQiksIHNiYmUgPSBzdWNjX2VuZChCQik7CisgIGlmIChzYmJpID09IHNiYmUpCisgICAgcmVhZEVkZ2UodGhpcyxnZXRFZGdlKEJCLDApLG91dFdlaWdodCxvdXRNaXNzaW5nKTsKKyAgZm9yICggOyBzYmJpICE9IHNiYmU7ICsrc2JiaSApIHsKKyAgICBpZiAoUHJvY2Vzc2VkU3VjY3MuaW5zZXJ0KCpzYmJpKS5zZWNvbmQpIHsKKyAgICAgIHJlYWRFZGdlKHRoaXMsZ2V0RWRnZShCQiwqc2JiaSksb3V0V2VpZ2h0LG91dE1pc3NpbmcpOworICAgIH0KKyAgfQorCisgIGRvdWJsZSBzaGFyZTsKKyAgc3RkOjpzZXQ8RWRnZT46Oml0ZXJhdG9yIGVpLGVlOworICBpZiAoaW5NaXNzaW5nLnNpemUoKSA9PSAwICYmIG91dE1pc3Npbmcuc2l6ZSgpID4gMCkgeworICAgIGVpID0gb3V0TWlzc2luZy5iZWdpbigpOworICAgIGVlID0gb3V0TWlzc2luZy5lbmQoKTsKKyAgICBzaGFyZSA9IGluV2VpZ2h0L291dE1pc3Npbmcuc2l6ZSgpOworICAgIHNldEV4ZWN1dGlvbkNvdW50KEJCLGluV2VpZ2h0KTsKKyAgfSBlbHNlCisgIGlmIChpbk1pc3Npbmcuc2l6ZSgpID4gMCAmJiBvdXRNaXNzaW5nLnNpemUoKSA9PSAwICYmIG91dFdlaWdodCA9PSAwKSB7CisgICAgZWkgPSBpbk1pc3NpbmcuYmVnaW4oKTsKKyAgICBlZSA9IGluTWlzc2luZy5lbmQoKTsKKyAgICBzaGFyZSA9IDA7CisgICAgc2V0RXhlY3V0aW9uQ291bnQoQkIsMCk7CisgIH0gZWxzZQorICBpZiAoaW5NaXNzaW5nLnNpemUoKSA9PSAwICYmIG91dE1pc3Npbmcuc2l6ZSgpID09IDApIHsKKyAgICBzZXRFeGVjdXRpb25Db3VudChCQixvdXRXZWlnaHQpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBmb3IgKCA7IGVpICE9IGVlOyArK2VpICkgeworICAgIHNldEVkZ2VXZWlnaHQoKmVpLHNoYXJlKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8Pgordm9pZCBQcm9maWxlSW5mb1Q8RnVuY3Rpb24sQmFzaWNCbG9jaz46OnJlcGFpcihjb25zdCBGdW5jdGlvbiAqRikgeworLy8gIGlmIChnZXRFeGVjdXRpb25Db3VudCgmKEYtPmdldEVudHJ5QmxvY2soKSkpID09IDApIHsKKy8vICAgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEZJID0gRi0+YmVnaW4oKSwgRkUgPSBGLT5lbmQoKTsKKy8vICAgICAgICAgRkkgIT0gRkU7ICsrRkkpIHsKKy8vICAgICAgY29uc3QgQmFzaWNCbG9jayogQkIgPSAmKCpGSSk7CisvLyAgICAgIHsKKy8vICAgICAgICBjb25zdF9wcmVkX2l0ZXJhdG9yIE5CQiA9IHByZWRfYmVnaW4oQkIpLCBFbmQgPSBwcmVkX2VuZChCQik7CisvLyAgICAgICAgaWYgKE5CQiA9PSBFbmQpIHsKKy8vICAgICAgICAgIHNldEVkZ2VXZWlnaHQoZ2V0RWRnZSgwLEJCKSwwKTsKKy8vICAgICAgICB9CisvLyAgICAgICAgZm9yKDtOQkIgIT0gRW5kOyArK05CQikgeworLy8gICAgICAgICAgc2V0RWRnZVdlaWdodChnZXRFZGdlKCpOQkIsQkIpLDApOworLy8gICAgICAgIH0KKy8vICAgICAgfQorLy8gICAgICB7CisvLyAgICAgICAgc3VjY19jb25zdF9pdGVyYXRvciBOQkIgPSBzdWNjX2JlZ2luKEJCKSwgRW5kID0gc3VjY19lbmQoQkIpOworLy8gICAgICAgIGlmIChOQkIgPT0gRW5kKSB7CisvLyAgICAgICAgICBzZXRFZGdlV2VpZ2h0KGdldEVkZ2UoMCxCQiksMCk7CisvLyAgICAgICAgfQorLy8gICAgICAgIGZvcig7TkJCICE9IEVuZDsgKytOQkIpIHsKKy8vICAgICAgICAgIHNldEVkZ2VXZWlnaHQoZ2V0RWRnZSgqTkJCLEJCKSwwKTsKKy8vICAgICAgICB9CisvLyAgICAgIH0KKy8vICAgIH0KKy8vICAgIHJldHVybjsKKy8vICB9CisgIC8vIFRoZSBzZXQgb2YgQmFzaWNCbG9ja3MgdGhhdCBhcmUgc3RpbGwgdW52aXNpdGVkLgorICBzdGQ6OnNldDxjb25zdCBCYXNpY0Jsb2NrKj4gVW52aXNpdGVkOworCisgIC8vIFRoZSBzZXQgb2YgcmV0dXJuIGVkZ2VzIChFZGdlcyB3aXRoIG5vIHN1Y2Nlc3NvcnMpLgorICBzdGQ6OnNldDxFZGdlPiBSZXR1cm5FZGdlczsKKyAgZG91YmxlIFJldHVybldlaWdodCA9IDA7CisgIAorICAvLyBGaXJzdCBpdGVyYXRlIG92ZXIgdGhlIHdob2xlIGZ1bmN0aW9uIGFuZCBjb2xsZWN0OgorICAvLyAxKSBUaGUgYmxvY2tzIGluIHRoaXMgZnVuY3Rpb24gaW4gdGhlIFVudmlzaXRlZCBzZXQuCisgIC8vIDIpIFRoZSByZXR1cm4gZWRnZXMgaW4gdGhlIFJldHVybkVkZ2VzIHNldC4KKyAgLy8gMykgVGhlIGZsb3cgdGhhdCBpcyBsZWF2aW5nIHRoZSBmdW5jdGlvbiBhbHJlYWR5IHZpYSByZXR1cm4gZWRnZXMuCisKKyAgLy8gRGF0YSBzdHJ1Y3R1cmUgZm9yIHNlYXJjaGluZyB0aGUgZnVuY3Rpb24uCisgIHN0ZDo6cXVldWU8Y29uc3QgQmFzaWNCbG9jayAqPiBCRlM7CisgIGNvbnN0IEJhc2ljQmxvY2sgKkJCID0gJihGLT5nZXRFbnRyeUJsb2NrKCkpOworICBCRlMucHVzaChCQik7CisgIFVudmlzaXRlZC5pbnNlcnQoQkIpOworCisgIHdoaWxlIChCRlMuc2l6ZSgpKSB7CisgICAgQkIgPSBCRlMuZnJvbnQoKTsgQkZTLnBvcCgpOworICAgIHN1Y2NfY29uc3RfaXRlcmF0b3IgTkJCID0gc3VjY19iZWdpbihCQiksIEVuZCA9IHN1Y2NfZW5kKEJCKTsKKyAgICBpZiAoTkJCID09IEVuZCkgeworICAgICAgRWRnZSBlID0gZ2V0RWRnZShCQiwwKTsKKyAgICAgIGRvdWJsZSB3ID0gZ2V0RWRnZVdlaWdodChlKTsKKyAgICAgIGlmICh3ID09IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICAvLyBJZiB0aGUgcmV0dXJuIGVkZ2UgaGFzIG5vIHZhbHVlLCB0cnkgdG8gcmVhZCB2YWx1ZSBmcm9tIGJsb2NrLgorICAgICAgICBkb3VibGUgYncgPSBnZXRFeGVjdXRpb25Db3VudChCQik7CisgICAgICAgIGlmIChidyAhPSBNaXNzaW5nVmFsdWUpIHsKKyAgICAgICAgICBzZXRFZGdlV2VpZ2h0KGUsYncpOworICAgICAgICAgIFJldHVybldlaWdodCArPSBidzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBJZiBib3RoIHJldHVybiBlZGdlIGFuZCBibG9jayBwcm92aWRlIG5vIHZhbHVlLCBjb2xsZWN0IGVkZ2UuCisgICAgICAgICAgUmV0dXJuRWRnZXMuaW5zZXJ0KGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGUgcmV0dXJuIGVkZ2UgaGFzIGEgcHJvcGVyIHZhbHVlLCBjb2xsZWN0IGl0LgorICAgICAgICBSZXR1cm5XZWlnaHQgKz0gdzsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yICg7TkJCICE9IEVuZDsgKytOQkIpIHsKKyAgICAgIGlmIChVbnZpc2l0ZWQuaW5zZXJ0KCpOQkIpLnNlY29uZCkgeworICAgICAgICBCRlMucHVzaCgqTkJCKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB3aGlsZSAoVW52aXNpdGVkLnNpemUoKSA+IDApIHsKKyAgICB1bnNpZ25lZCBvbGRVbnZpc2l0ZWRDb3VudCA9IFVudmlzaXRlZC5zaXplKCk7CisgICAgYm9vbCBGb3VuZFBhdGggPSBmYWxzZTsKKworICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIGVkZ2UgbGVmdCwgY2FsY3VsYXRlIGl0LgorICAgIGlmIChSZXR1cm5FZGdlcy5zaXplKCkgPT0gMSkgeworICAgICAgUmV0dXJuV2VpZ2h0ID0gZ2V0RXhlY3V0aW9uQ291bnQoJihGLT5nZXRFbnRyeUJsb2NrKCkpKSAtIFJldHVybldlaWdodDsKKworICAgICAgRWRnZSBlID0gKlJldHVybkVkZ2VzLmJlZ2luKCk7CisgICAgICBzZXRFZGdlV2VpZ2h0KGUsUmV0dXJuV2VpZ2h0KTsKKyAgICAgIHNldEV4ZWN1dGlvbkNvdW50KGUuZmlyc3QsUmV0dXJuV2VpZ2h0KTsKKworICAgICAgVW52aXNpdGVkLmVyYXNlKGUuZmlyc3QpOworICAgICAgUmV0dXJuRWRnZXMuZXJhc2UoZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgYWxsIGJsb2NrcyB3aGVyZSBvbmx5IG9uZSBlZGdlIGlzIG1pc3NpbmcsIHRoaXMgbWF5IGFsc28KKyAgICAvLyByZXNvbHZlIGZ1cmh0ZXIgcmV0dXJuIGVkZ2VzLgorICAgIHN0ZDo6c2V0PGNvbnN0IEJhc2ljQmxvY2sgKj46Oml0ZXJhdG9yIEZJID0gVW52aXNpdGVkLmJlZ2luKCksIEZFID0gVW52aXNpdGVkLmVuZCgpOworICAgIHdoaWxlKEZJICE9IEZFKSB7CisgICAgICBjb25zdCBCYXNpY0Jsb2NrICpCQiA9ICpGSTsgKytGSTsKKyAgICAgIEVkZ2UgZTsKKyAgICAgIGlmKENhbGN1bGF0ZU1pc3NpbmdFZGdlKEJCLGUsdHJ1ZSkpIHsKKyAgICAgICAgaWYgKEJsb2NrSW5mb3JtYXRpb25bRl0uZmluZChCQikgPT0gQmxvY2tJbmZvcm1hdGlvbltGXS5lbmQoKSkgeworICAgICAgICAgIHNldEV4ZWN1dGlvbkNvdW50KEJCLGdldEV4ZWN1dGlvbkNvdW50KEJCKSk7CisgICAgICAgIH0KKyAgICAgICAgVW52aXNpdGVkLmVyYXNlKEJCKTsKKyAgICAgICAgaWYgKGUuZmlyc3QgIT0gMCAmJiBlLnNlY29uZCA9PSAwKSB7CisgICAgICAgICAgUmV0dXJuRWRnZXMuZXJhc2UoZSk7CisgICAgICAgICAgUmV0dXJuV2VpZ2h0ICs9IGdldEVkZ2VXZWlnaHQoZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG9sZFVudmlzaXRlZENvdW50ID4gVW52aXNpdGVkLnNpemUoKSkgY29udGludWU7CisKKyAgICAvLyBFc3RpbWF0ZSBlZGdlIHdlaWdodHMgYnkgZGl2aWRpbmcgdGhlIGZsb3cgcHJvcG9ydGlvbmFsbHkuCisgICAgRkkgPSBVbnZpc2l0ZWQuYmVnaW4oKSwgRkUgPSBVbnZpc2l0ZWQuZW5kKCk7CisgICAgd2hpbGUoRkkgIT0gRkUpIHsKKyAgICAgIGNvbnN0IEJhc2ljQmxvY2sgKkJCID0gKkZJOyArK0ZJOworICAgICAgY29uc3QgQmFzaWNCbG9jayAqRGVzdCA9IDA7CisgICAgICBib29sIEFsbEVkZ2VzSGF2ZVNhbWVSZXR1cm4gPSB0cnVlOworICAgICAgLy8gQ2hlY2sgZWFjaCBTdWNjZXNzb3IsIHRoZXNlIG11c3QgYWxsIGVuZCB1cCBpbiB0aGUgc2FtZSBvciBhbiBlbXB0eQorICAgICAgLy8gcmV0dXJuIGJsb2NrIG90aGVyd2lzZSBpdHMgZGFuZ2Vyb3VzIHRvIGRvIGFuIGVzdGltYXRpb24gb24gdGhlbS4KKyAgICAgIGZvciAoc3VjY19jb25zdF9pdGVyYXRvciBTdWNjID0gc3VjY19iZWdpbihCQiksIEVuZCA9IHN1Y2NfZW5kKEJCKTsKKyAgICAgICAgICAgU3VjYyAhPSBFbmQ7ICsrU3VjYykgeworICAgICAgICBQYXRoIFA7CisgICAgICAgIEdldFBhdGgoKlN1Y2MsIDAsIFAsIEdldFBhdGhUb0V4aXQpOworICAgICAgICBpZiAoRGVzdCAmJiBEZXN0ICE9IFBbMF0pIHsKKyAgICAgICAgICBBbGxFZGdlc0hhdmVTYW1lUmV0dXJuID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgRGVzdCA9IFBbMF07CisgICAgICB9CisgICAgICBpZiAoQWxsRWRnZXNIYXZlU2FtZVJldHVybikgeworICAgICAgICBpZihFc3RpbWF0ZU1pc3NpbmdFZGdlcyhCQikpIHsKKyAgICAgICAgICBVbnZpc2l0ZWQuZXJhc2UoQkIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChvbGRVbnZpc2l0ZWRDb3VudCA+IFVudmlzaXRlZC5zaXplKCkpIGNvbnRpbnVlOworCisgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYXRoIHRvIGFuIGJsb2NrIHRoYXQgaGFzIGEga25vd24gdmFsdWUgYW5kIHJlZGlyZWN0CisgICAgLy8gZmxvdyBhY2NvcmRpbmdseS4KKyAgICBGSSA9IFVudmlzaXRlZC5iZWdpbigpLCBGRSA9IFVudmlzaXRlZC5lbmQoKTsKKyAgICB3aGlsZShGSSAhPSBGRSAmJiAhRm91bmRQYXRoKSB7CisgICAgICAvLyBGZXRjaCBwYXRoLgorICAgICAgY29uc3QgQmFzaWNCbG9jayAqQkIgPSAqRkk7ICsrRkk7CisgICAgICBQYXRoIFA7CisgICAgICBjb25zdCBCYXNpY0Jsb2NrICpEZXN0ID0gR2V0UGF0aChCQiwgMCwgUCwgR2V0UGF0aFRvVmFsdWUpOworCisgICAgICAvLyBDYWxjdWxhdGUgaW5jb21pbmcgZmxvdy4KKyAgICAgIGRvdWJsZSBpdyA9IDA7IHVuc2lnbmVkIGlubWlzc2luZyA9IDA7IHVuc2lnbmVkIGluY291bnQgPSAwOyB1bnNpZ25lZCBpbnZhbGlkID0gMDsKKyAgICAgIHN0ZDo6c2V0PGNvbnN0IEJhc2ljQmxvY2sgKj4gUHJvY2Vzc2VkOworICAgICAgZm9yIChjb25zdF9wcmVkX2l0ZXJhdG9yIE5CQiA9IHByZWRfYmVnaW4oQkIpLCBFbmQgPSBwcmVkX2VuZChCQik7CisgICAgICAgICAgIE5CQiAhPSBFbmQ7ICsrTkJCKSB7CisgICAgICAgIGlmIChQcm9jZXNzZWQuaW5zZXJ0KCpOQkIpLnNlY29uZCkgeworICAgICAgICAgIEVkZ2UgZSA9IGdldEVkZ2UoKk5CQiwgQkIpOworICAgICAgICAgIGRvdWJsZSBldyA9IGdldEVkZ2VXZWlnaHQoZSk7CisgICAgICAgICAgaWYgKGV3ICE9IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICAgICAgaXcgKz0gZXc7CisgICAgICAgICAgICBpbnZhbGlkKys7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwYXRoIGNvbnRhaW5zIHRoZSBzdWNjZXNzb3IsIHRoaXMgbWVhbnMgaXRzIGEgYmFja2VkZ2UsCisgICAgICAgICAgICAvLyBkbyBub3QgY291bnQgYXMgbWlzc2luZy4KKyAgICAgICAgICAgIGlmIChQLmZpbmQoKk5CQikgPT0gUC5lbmQoKSkKKyAgICAgICAgICAgICAgaW5taXNzaW5nKys7CisgICAgICAgICAgfQorICAgICAgICAgIGluY291bnQrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGlubWlzc2luZyA9PSBpbmNvdW50KSBjb250aW51ZTsKKyAgICAgIGlmIChpbnZhbGlkID09IDApIGNvbnRpbnVlOworCisgICAgICAvLyBTdWJ0cmFjdCAoYWxyZWFkeSkgb3V0Z29pbmcgZmxvdy4KKyAgICAgIFByb2Nlc3NlZC5jbGVhcigpOworICAgICAgZm9yIChzdWNjX2NvbnN0X2l0ZXJhdG9yIE5CQiA9IHN1Y2NfYmVnaW4oQkIpLCBFbmQgPSBzdWNjX2VuZChCQik7CisgICAgICAgICAgIE5CQiAhPSBFbmQ7ICsrTkJCKSB7CisgICAgICAgIGlmIChQcm9jZXNzZWQuaW5zZXJ0KCpOQkIpLnNlY29uZCkgeworICAgICAgICAgIEVkZ2UgZSA9IGdldEVkZ2UoQkIsICpOQkIpOworICAgICAgICAgIGRvdWJsZSBldyA9IGdldEVkZ2VXZWlnaHQoZSk7CisgICAgICAgICAgaWYgKGV3ICE9IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICAgICAgaXcgLT0gZXc7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaXcgPCAwKSBjb250aW51ZTsKKworICAgICAgLy8gQ2hlY2sgdGhlIHJlY2lldmluZyBlbmQgb2YgdGhlIHBhdGggaWYgaXQgY2FuIGhhbmRsZSB0aGUgZmxvdy4KKyAgICAgIGRvdWJsZSBvdyA9IGdldEV4ZWN1dGlvbkNvdW50KERlc3QpOworICAgICAgUHJvY2Vzc2VkLmNsZWFyKCk7CisgICAgICBmb3IgKHN1Y2NfY29uc3RfaXRlcmF0b3IgTkJCID0gc3VjY19iZWdpbihCQiksIEVuZCA9IHN1Y2NfZW5kKEJCKTsKKyAgICAgICAgICAgTkJCICE9IEVuZDsgKytOQkIpIHsKKyAgICAgICAgaWYgKFByb2Nlc3NlZC5pbnNlcnQoKk5CQikuc2Vjb25kKSB7CisgICAgICAgICAgRWRnZSBlID0gZ2V0RWRnZShCQiwgKk5CQik7CisgICAgICAgICAgZG91YmxlIGV3ID0gZ2V0RWRnZVdlaWdodChlKTsKKyAgICAgICAgICBpZiAoZXcgIT0gTWlzc2luZ1ZhbHVlKSB7CisgICAgICAgICAgICBvdyAtPSBldzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChvdyA8IDApIGNvbnRpbnVlOworCisgICAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggZmxvdyBzaGFsbCBiZSB1c2VkLgorICAgICAgZG91YmxlIGV3ID0gZ2V0RWRnZVdlaWdodChnZXRFZGdlKFBbRGVzdF0sRGVzdCkpOworICAgICAgaWYgKGV3ICE9IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICBldyA9IGV3PG93P2V3Om93OworICAgICAgICBldyA9IGV3PGl3P2V3Oml3OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlubWlzc2luZyA9PSAwKQorICAgICAgICAgIGV3ID0gaXc7CisgICAgICB9CisKKyAgICAgIC8vIENyZWF0ZSBmbG93LgorICAgICAgaWYgKGV3ICE9IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICBkbyB7CisgICAgICAgICAgRWRnZSBlID0gZ2V0RWRnZShQW0Rlc3RdLERlc3QpOworICAgICAgICAgIGlmIChnZXRFZGdlV2VpZ2h0KGUpID09IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICAgICAgc2V0RWRnZVdlaWdodChlLGV3KTsKKyAgICAgICAgICAgIEZvdW5kUGF0aCA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIERlc3QgPSBQW0Rlc3RdOworICAgICAgICB9IHdoaWxlIChEZXN0ICE9IEJCKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKEZvdW5kUGF0aCkgY29udGludWU7CisKKyAgICAvLyBDYWxjdWxhdGUgYSBibG9jayB3aXRoIHNlbGYgbG9vcC4KKyAgICBGSSA9IFVudmlzaXRlZC5iZWdpbigpLCBGRSA9IFVudmlzaXRlZC5lbmQoKTsKKyAgICB3aGlsZShGSSAhPSBGRSAmJiAhRm91bmRQYXRoKSB7CisgICAgICBjb25zdCBCYXNpY0Jsb2NrICpCQiA9ICpGSTsgKytGSTsKKyAgICAgIGJvb2wgU2VsZkVkZ2VGb3VuZCA9IGZhbHNlOworICAgICAgZm9yIChzdWNjX2NvbnN0X2l0ZXJhdG9yIE5CQiA9IHN1Y2NfYmVnaW4oQkIpLCBFbmQgPSBzdWNjX2VuZChCQik7CisgICAgICAgICAgIE5CQiAhPSBFbmQ7ICsrTkJCKSB7CisgICAgICAgIGlmICgqTkJCID09IEJCKSB7CisgICAgICAgICAgU2VsZkVkZ2VGb3VuZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChTZWxmRWRnZUZvdW5kKSB7CisgICAgICAgIEVkZ2UgZSA9IGdldEVkZ2UoQkIsQkIpOworICAgICAgICBpZiAoZ2V0RWRnZVdlaWdodChlKSA9PSBNaXNzaW5nVmFsdWUpIHsKKyAgICAgICAgICBkb3VibGUgaXcgPSAwOworICAgICAgICAgIHN0ZDo6c2V0PGNvbnN0IEJhc2ljQmxvY2sgKj4gUHJvY2Vzc2VkOworICAgICAgICAgIGZvciAoY29uc3RfcHJlZF9pdGVyYXRvciBOQkIgPSBwcmVkX2JlZ2luKEJCKSwgRW5kID0gcHJlZF9lbmQoQkIpOworICAgICAgICAgICAgICAgTkJCICE9IEVuZDsgKytOQkIpIHsKKyAgICAgICAgICAgIGlmIChQcm9jZXNzZWQuaW5zZXJ0KCpOQkIpLnNlY29uZCkgeworICAgICAgICAgICAgICBFZGdlIGUgPSBnZXRFZGdlKCpOQkIsIEJCKTsKKyAgICAgICAgICAgICAgZG91YmxlIGV3ID0gZ2V0RWRnZVdlaWdodChlKTsKKyAgICAgICAgICAgICAgaWYgKGV3ICE9IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICAgICAgICAgIGl3ICs9IGV3OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHNldEVkZ2VXZWlnaHQoZSxpdyAqIDEwKTsKKyAgICAgICAgICBGb3VuZFBhdGggPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChGb3VuZFBhdGgpIGNvbnRpbnVlOworCisgICAgLy8gRGV0ZXJtaW5lIGJhY2tlZGdlcywgc2V0IHRoZW0gdG8gemVyby4KKyAgICBGSSA9IFVudmlzaXRlZC5iZWdpbigpLCBGRSA9IFVudmlzaXRlZC5lbmQoKTsKKyAgICB3aGlsZShGSSAhPSBGRSAmJiAhRm91bmRQYXRoKSB7CisgICAgICBjb25zdCBCYXNpY0Jsb2NrICpCQiA9ICpGSTsgKytGSTsKKyAgICAgIGNvbnN0IEJhc2ljQmxvY2sgKkRlc3Q7CisgICAgICBQYXRoIFA7CisgICAgICBib29sIEJhY2tFZGdlRm91bmQgPSBmYWxzZTsKKyAgICAgIGZvciAoY29uc3RfcHJlZF9pdGVyYXRvciBOQkIgPSBwcmVkX2JlZ2luKEJCKSwgRW5kID0gcHJlZF9lbmQoQkIpOworICAgICAgICAgICBOQkIgIT0gRW5kOyArK05CQikgeworICAgICAgICBEZXN0ID0gR2V0UGF0aChCQiwgKk5CQiwgUCwgR2V0UGF0aFRvRGVzdCB8IEdldFBhdGhXaXRoTmV3RWRnZXMpOworICAgICAgICBpZiAoRGVzdCA9PSAqTkJCKSB7CisgICAgICAgICAgQmFja0VkZ2VGb3VuZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChCYWNrRWRnZUZvdW5kKSB7CisgICAgICAgIEVkZ2UgZSA9IGdldEVkZ2UoRGVzdCxCQik7CisgICAgICAgIGRvdWJsZSB3ID0gZ2V0RWRnZVdlaWdodChlKTsKKyAgICAgICAgaWYgKHcgPT0gTWlzc2luZ1ZhbHVlKSB7CisgICAgICAgICAgc2V0RWRnZVdlaWdodChlLDApOworICAgICAgICAgIEZvdW5kUGF0aCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZG8geworICAgICAgICAgIEVkZ2UgZSA9IGdldEVkZ2UoUFtEZXN0XSwgRGVzdCk7CisgICAgICAgICAgZG91YmxlIHcgPSBnZXRFZGdlV2VpZ2h0KGUpOworICAgICAgICAgIGlmICh3ID09IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICAgICAgc2V0RWRnZVdlaWdodChlLDApOworICAgICAgICAgICAgRm91bmRQYXRoID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgRGVzdCA9IFBbRGVzdF07CisgICAgICAgIH0gd2hpbGUgKERlc3QgIT0gQkIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoRm91bmRQYXRoKSBjb250aW51ZTsKKworICAgIC8vIENoYW5uZWwgZmxvdyB0byByZXR1cm4gYmxvY2suCisgICAgRkkgPSBVbnZpc2l0ZWQuYmVnaW4oKSwgRkUgPSBVbnZpc2l0ZWQuZW5kKCk7CisgICAgd2hpbGUoRkkgIT0gRkUgJiYgIUZvdW5kUGF0aCkgeworICAgICAgY29uc3QgQmFzaWNCbG9jayAqQkIgPSAqRkk7ICsrRkk7CisKKyAgICAgIFBhdGggUDsKKyAgICAgIGNvbnN0IEJhc2ljQmxvY2sgKkRlc3QgPSBHZXRQYXRoKEJCLCAwLCBQLCBHZXRQYXRoVG9FeGl0IHwgR2V0UGF0aFdpdGhOZXdFZGdlcyk7CisgICAgICBEZXN0ID0gUFswXTsKKyAgICAgIGlmICghRGVzdCkgY29udGludWU7CisKKyAgICAgIGlmIChnZXRFZGdlV2VpZ2h0KGdldEVkZ2UoRGVzdCwwKSkgPT0gTWlzc2luZ1ZhbHVlKSB7CisgICAgICAgIC8vIENhbGN1bGF0ZSBpbmNvbWluZyBmbG93LgorICAgICAgICBkb3VibGUgaXcgPSAwOworICAgICAgICBzdGQ6OnNldDxjb25zdCBCYXNpY0Jsb2NrICo+IFByb2Nlc3NlZDsKKyAgICAgICAgZm9yIChjb25zdF9wcmVkX2l0ZXJhdG9yIE5CQiA9IHByZWRfYmVnaW4oQkIpLCBFbmQgPSBwcmVkX2VuZChCQik7CisgICAgICAgICAgICAgTkJCICE9IEVuZDsgKytOQkIpIHsKKyAgICAgICAgICBpZiAoUHJvY2Vzc2VkLmluc2VydCgqTkJCKS5zZWNvbmQpIHsKKyAgICAgICAgICAgIEVkZ2UgZSA9IGdldEVkZ2UoKk5CQiwgQkIpOworICAgICAgICAgICAgZG91YmxlIGV3ID0gZ2V0RWRnZVdlaWdodChlKTsKKyAgICAgICAgICAgIGlmIChldyAhPSBNaXNzaW5nVmFsdWUpIHsKKyAgICAgICAgICAgICAgaXcgKz0gZXc7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRvIHsKKyAgICAgICAgICBFZGdlIGUgPSBnZXRFZGdlKFBbRGVzdF0sIERlc3QpOworICAgICAgICAgIGRvdWJsZSB3ID0gZ2V0RWRnZVdlaWdodChlKTsKKyAgICAgICAgICBpZiAodyA9PSBNaXNzaW5nVmFsdWUpIHsKKyAgICAgICAgICAgIHNldEVkZ2VXZWlnaHQoZSxpdyk7CisgICAgICAgICAgICBGb3VuZFBhdGggPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoMCAmJiAiRWRnZSBzaG91bGQgbm90IGhhdmUgdmFsdWUgYWxyZWFkeSEiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgRGVzdCA9IFBbRGVzdF07CisgICAgICAgIH0gd2hpbGUgKERlc3QgIT0gQkIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoRm91bmRQYXRoKSBjb250aW51ZTsKKworICAgIC8vIFNwZWN1bGF0aXZlbHkgc2V0IGVkZ2VzIHRvIHplcm8uCisgICAgRkkgPSBVbnZpc2l0ZWQuYmVnaW4oKSwgRkUgPSBVbnZpc2l0ZWQuZW5kKCk7CisgICAgd2hpbGUoRkkgIT0gRkUgJiYgIUZvdW5kUGF0aCkgeworICAgICAgY29uc3QgQmFzaWNCbG9jayAqQkIgPSAqRkk7ICsrRkk7CisKKyAgICAgIGZvciAoY29uc3RfcHJlZF9pdGVyYXRvciBOQkIgPSBwcmVkX2JlZ2luKEJCKSwgRW5kID0gcHJlZF9lbmQoQkIpOworICAgICAgICAgICBOQkIgIT0gRW5kOyArK05CQikgeworICAgICAgICBFZGdlIGUgPSBnZXRFZGdlKCpOQkIsQkIpOworICAgICAgICBkb3VibGUgdyA9IGdldEVkZ2VXZWlnaHQoZSk7CisgICAgICAgIGlmICh3ID09IE1pc3NpbmdWYWx1ZSkgeworICAgICAgICAgIHNldEVkZ2VXZWlnaHQoZSwwKTsKKyAgICAgICAgICBGb3VuZFBhdGggPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChGb3VuZFBhdGgpIGNvbnRpbnVlOworCisgICAgZXJycygpIDw8ICJ7IjsKKyAgICBGSSA9IFVudmlzaXRlZC5iZWdpbigpLCBGRSA9IFVudmlzaXRlZC5lbmQoKTsKKyAgICB3aGlsZShGSSAhPSBGRSkgeworICAgICAgY29uc3QgQmFzaWNCbG9jayAqQkIgPSAqRkk7ICsrRkk7CisgICAgICBkYmdzKCkgPDwgQkItPmdldE5hbWUoKTsKKyAgICAgIGlmIChGSSAhPSBGRSkKKyAgICAgICAgZGJncygpIDw8ICIsIjsKKyAgICB9CisgICAgZXJycygpIDw8ICJ9IjsKKworICAgIGVycnMoKSA8PCAiQVNTRVJUOiBjb3VsZCBub3QgcmVwYWlyIGZ1bmN0aW9uIjsKKyAgICBhc3NlcnQoMCAmJiAiY291bGQgbm90IHJlcGFpciBmdW5jdGlvbiIpOworICB9CisKKyAgRWRnZVdlaWdodHMgSiA9IEVkZ2VJbmZvcm1hdGlvbltGXTsKKyAgZm9yIChFZGdlV2VpZ2h0czo6aXRlcmF0b3IgRUkgPSBKLmJlZ2luKCksIEVFID0gSi5lbmQoKTsgRUkgIT0gRUU7ICsrRUkpIHsKKyAgICBFZGdlIGUgPSBFSS0+Zmlyc3Q7CisKKyAgICBib29sIFN1Y2NGb3VuZCA9IGZhbHNlOworICAgIGlmIChlLmZpcnN0ICE9IDApIHsKKyAgICAgIHN1Y2NfY29uc3RfaXRlcmF0b3IgTkJCID0gc3VjY19iZWdpbihlLmZpcnN0KSwgRW5kID0gc3VjY19lbmQoZS5maXJzdCk7CisgICAgICBpZiAoTkJCID09IEVuZCkgeworICAgICAgICBpZiAoMCA9PSBlLnNlY29uZCkgeworICAgICAgICAgIFN1Y2NGb3VuZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoO05CQiAhPSBFbmQ7ICsrTkJCKSB7CisgICAgICAgIGlmICgqTkJCID09IGUuc2Vjb25kKSB7CisgICAgICAgICAgU3VjY0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFTdWNjRm91bmQpIHsKKyAgICAgICAgcmVtb3ZlRWRnZShlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk8sIGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIHJldHVybiBPIDw8IEYtPmdldE5hbWUoKTsKK30KKworcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk8sIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYpIHsKKyAgcmV0dXJuIE8gPDwgTUYtPmdldEZ1bmN0aW9uKCktPmdldE5hbWUoKSA8PCAiKE1GKSI7Cit9CisKK3Jhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPLCBjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gTyA8PCBCQi0+Z2V0TmFtZSgpOworfQorCityYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmTywgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICByZXR1cm4gTyA8PCBNQkItPmdldEJhc2ljQmxvY2soKS0+Z2V0TmFtZSgpIDw8ICIoTUIpIjsKK30KKworcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk8sIHN0ZDo6cGFpcjxjb25zdCBCYXNpY0Jsb2NrICosIGNvbnN0IEJhc2ljQmxvY2sgKj4gRSkgeworICBPIDw8ICIoIjsKKworICBpZiAoRS5maXJzdCkKKyAgICBPIDw8IEUuZmlyc3Q7CisgIGVsc2UKKyAgICBPIDw8ICIwIjsKKworICBPIDw8ICIsIjsKKworICBpZiAoRS5zZWNvbmQpCisgICAgTyA8PCBFLnNlY29uZDsKKyAgZWxzZQorICAgIE8gPDwgIjAiOworCisgIHJldHVybiBPIDw8ICIpIjsKK30KKworcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk8sIHN0ZDo6cGFpcjxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqLCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqPiBFKSB7CisgIE8gPDwgIigiOworCisgIGlmIChFLmZpcnN0KQorICAgIE8gPDwgRS5maXJzdDsKKyAgZWxzZQorICAgIE8gPDwgIjAiOworCisgIE8gPDwgIiwiOworCisgIGlmIChFLnNlY29uZCkKKyAgICBPIDw8IEUuc2Vjb25kOworICBlbHNlCisgICAgTyA8PCAiMCI7CisKKyAgcmV0dXJuIE8gPDwgIikiOworfQorCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTm9Qcm9maWxlIFByb2ZpbGVJbmZvIGltcGxlbWVudGF0aW9uCisvLworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgTm9Qcm9maWxlSW5mbyA6IHB1YmxpYyBJbW11dGFibGVQYXNzLCBwdWJsaWMgUHJvZmlsZUluZm8geworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBDbGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpbmZvCisgICAgTm9Qcm9maWxlSW5mbygpIDogSW1tdXRhYmxlUGFzcyhJRCkge30KKyAgICAKKyAgICAvLy8gZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gYSBwYXNzIGltcGxlbWVudHMKKyAgICAvLy8gYW4gYW5hbHlzaXMgaW50ZXJmYWNlIHRocm91Z2ggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiBuZWVkZWQsIGl0CisgICAgLy8vIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGFkanVzdCB0aGUgdGhpcyBwb2ludGVyIGFzIG5lZWRlZCBmb3IgdGhlCisgICAgLy8vIHNwZWNpZmllZCBwYXNzIGluZm8uCisgICAgdmlydHVhbCB2b2lkICpnZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlcihBbmFseXNpc0lEIFBJKSB7CisgICAgICBpZiAoUEkgPT0gJlByb2ZpbGVJbmZvOjpJRCkKKyAgICAgICAgcmV0dXJuIChQcm9maWxlSW5mbyopdGhpczsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJOb1Byb2ZpbGVJbmZvIjsKKyAgICB9CisgIH07Cit9ICAvLyBFbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCitjaGFyIE5vUHJvZmlsZUluZm86OklEID0gMDsKKy8vIFJlZ2lzdGVyIHRoaXMgcGFzcy4uLgorSU5JVElBTElaRV9BR19QQVNTKE5vUHJvZmlsZUluZm8sIFByb2ZpbGVJbmZvLCAibm8tcHJvZmlsZSIsCisgICAgICAgICAgICAgICAgICAgIk5vIFByb2ZpbGUgSW5mb3JtYXRpb24iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisKK0ltbXV0YWJsZVBhc3MgKmxsdm06OmNyZWF0ZU5vUHJvZmlsZUluZm9QYXNzKCkgeyByZXR1cm4gbmV3IE5vUHJvZmlsZUluZm8oKTsgfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FuYWx5c2lzL1JFQURNRS50eHQgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTk2ZTRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL1JFQURNRS50eHQKQEAgLTAsMCArMSwzMCBAQAorQW5hbHlzaXMgT3Bwb3J0dW5pdGllczoKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbiB0ZXN0L1RyYW5zZm9ybXMvTG9vcFN0cmVuZ3RoUmVkdWNlL3F1YWRyYWRpYy1leGl0LXZhbHVlLmxsLCB0aGUKK1NjYWxhckV2b2x1dGlvbiBleHByZXNzaW9uIGZvciAlciBpcyB0aGlzOgorCisgIHsxLCssMywrLDJ9PGxvb3A+CisKK091dHNpZGUgdGhlIGxvb3AsIHRoaXMgY291bGQgYmUgZXZhbHVhdGVkIHNpbXBseSBhcyAoJW4gKiAlbiksIGhvd2V2ZXIKK1NjYWxhckV2b2x1dGlvbiBjdXJyZW50bHkgZXZhbHVhdGVzIGl0IGFzCisKKyAgKC0yICsgKDIgKiAodHJ1bmMgaTY1ICgoKHpleHQgaTY0ICgtMiArICVuKSB0byBpNjUpICogKHpleHQgaTY0ICgtMSArICVuKSB0byBpNjUpKSAvdSAyKSB0byBpNjQpKSArICgzICogJW4pKQorCitJbiBhZGRpdGlvbiB0byBiZWluZyBtdWNoIG1vcmUgY29tcGxpY2F0ZWQsIGl0IGludm9sdmVzIGk2NSBhcml0aG1ldGljLAord2hpY2ggaXMgdmVyeSBpbmVmZmljaWVudCB3aGVuIGV4cGFuZGVkIGludG8gY29kZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbiBmb3JtYXRWYWx1ZSBpbiB0ZXN0L0NvZGVHZW4vWDg2L2xzci1kZWxheWVkLWZvbGQubGwsCisKK1NjYWxhckV2b2x1dGlvbiBpcyBmb3JtaW5nIHRoaXMgZXhwcmVzc2lvbjoKKworKCh0cnVuYyBpNjQgKC0xICogJWFyZzUpIHRvIGkzMikgKyAodHJ1bmMgaTY0ICVhcmc1IHRvIGkzMikgKyAoLTEgKiAodHJ1bmMgaTY0IHVuZGVmIHRvIGkzMikpKQorCitUaGlzIGNvdWxkIGJlIGZvbGRlZCB0bworCisoLTEgKiAodHJ1bmMgaTY0IHVuZGVmIHRvIGkzMikpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uY3BwIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkZGZjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uY3BwCkBAIC0wLDAgKzEsNTg2MiBAQAorLy89PT0tIFNjYWxhckV2b2x1dGlvbi5jcHAgLSBTY2FsYXIgRXZvbHV0aW9uIEFuYWx5c2lzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzY2FsYXIgZXZvbHV0aW9uIGFuYWx5c2lzCisvLyBlbmdpbmUsIHdoaWNoIGlzIHVzZWQgcHJpbWFyaWx5IHRvIGFuYWx5emUgZXhwcmVzc2lvbnMgaW52b2x2aW5nIGluZHVjdGlvbgorLy8gdmFyaWFibGVzIGluIGxvb3BzLgorLy8KKy8vIFRoZXJlIGFyZSBzZXZlcmFsIGFzcGVjdHMgdG8gdGhpcyBsaWJyYXJ5LiAgRmlyc3QgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mCisvLyBzY2FsYXIgZXhwcmVzc2lvbnMsIHdoaWNoIGFyZSByZXByZXNlbnRlZCBhcyBzdWJjbGFzc2VzIG9mIHRoZSBTQ0VWIGNsYXNzLgorLy8gVGhlc2UgY2xhc3NlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgY2VydGFpbiB0eXBlcyBvZiBzdWJleHByZXNzaW9ucyB0aGF0IHdlCisvLyBjYW4gaGFuZGxlLiBXZSBvbmx5IGNyZWF0ZSBvbmUgU0NFViBvZiBhIHBhcnRpY3VsYXIgc2hhcGUsIHNvCisvLyBwb2ludGVyLWNvbXBhcmlzb25zIGZvciBlcXVhbGl0eSBhcmUgbGVnYWwuCisvLworLy8gT25lIGltcG9ydGFudCBhc3BlY3Qgb2YgdGhlIFNDRVYgb2JqZWN0cyBpcyB0aGF0IHRoZXkgYXJlIG5ldmVyIGN5Y2xpYywgZXZlbgorLy8gaWYgdGhlcmUgaXMgYSBjeWNsZSBpbiB0aGUgZGF0YWZsb3cgZm9yIGFuIGV4cHJlc3Npb24gKGllLCBhIFBISSBub2RlKS4gIElmCisvLyB0aGUgUEhJIG5vZGUgaXMgb25lIG9mIHRoZSBpZGlvbXMgdGhhdCB3ZSBjYW4gcmVwcmVzZW50IChlLmcuLCBhIHBvbHlub21pYWwKKy8vIHJlY3VycmVuY2UpIHRoZW4gd2UgcmVwcmVzZW50IGl0IGRpcmVjdGx5IGFzIGEgcmVjdXJyZW5jZSBub2RlLCBvdGhlcndpc2Ugd2UKKy8vIHJlcHJlc2VudCBpdCBhcyBhIFNDRVZVbmtub3duIG5vZGUuCisvLworLy8gSW4gYWRkaXRpb24gdG8gYmVpbmcgYWJsZSB0byByZXByZXNlbnQgZXhwcmVzc2lvbnMgb2YgdmFyaW91cyB0eXBlcywgd2UgYWxzbworLy8gaGF2ZSBmb2xkZXJzIHRoYXQgYXJlIHVzZWQgdG8gYnVpbGQgdGhlICpjYW5vbmljYWwqIHJlcHJlc2VudGF0aW9uIGZvciBhCisvLyBwYXJ0aWN1bGFyIGV4cHJlc3Npb24uICBUaGVzZSBmb2xkZXJzIGFyZSBjYXBhYmxlIG9mIHVzaW5nIGEgdmFyaWV0eSBvZgorLy8gcmV3cml0ZSBydWxlcyB0byBzaW1wbGlmeSB0aGUgZXhwcmVzc2lvbnMuCisvLworLy8gT25jZSB0aGUgZm9sZGVycyBhcmUgZGVmaW5lZCwgd2UgY2FuIGltcGxlbWVudCB0aGUgbW9yZSBpbnRlcmVzdGluZworLy8gaGlnaGVyLWxldmVsIGNvZGUsIHN1Y2ggYXMgdGhlIGNvZGUgdGhhdCByZWNvZ25pemVzIFBISSBub2RlcyBvZiB2YXJpb3VzCisvLyB0eXBlcywgY29tcHV0ZXMgdGhlIGV4ZWN1dGlvbiBjb3VudCBvZiBhIGxvb3AsIGV0Yy4KKy8vCisvLyBUT0RPOiBXZSBzaG91bGQgdXNlIHRoZXNlIHJvdXRpbmVzIGFuZCB2YWx1ZSByZXByZXNlbnRhdGlvbnMgdG8gaW1wbGVtZW50CisvLyBkZXBlbmRlbmNlIGFuYWx5c2lzIQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlcmUgYXJlIHNldmVyYWwgZ29vZCByZWZlcmVuY2VzIGZvciB0aGUgdGVjaG5pcXVlcyB1c2VkIGluIHRoaXMgYW5hbHlzaXMuCisvLworLy8gIENoYWlucyBvZiByZWN1cnJlbmNlcyAtLSBhIG1ldGhvZCB0byBleHBlZGl0ZSB0aGUgZXZhbHVhdGlvbgorLy8gIG9mIGNsb3NlZC1mb3JtIGZ1bmN0aW9ucworLy8gIE9sYWYgQmFjaG1hbm4sIFBhdWwgUy4gV2FuZywgRXVnZW5lIFYuIFppbWEKKy8vCisvLyAgT24gY29tcHV0YXRpb25hbCBwcm9wZXJ0aWVzIG9mIGNoYWlucyBvZiByZWN1cnJlbmNlcworLy8gIEV1Z2VuZSBWLiBaaW1hCisvLworLy8gIFN5bWJvbGljIEV2YWx1YXRpb24gb2YgQ2hhaW5zIG9mIFJlY3VycmVuY2VzIGZvciBMb29wIE9wdGltaXphdGlvbgorLy8gIFJvYmVydCBBLiB2YW4gRW5nZWxlbgorLy8KKy8vICBFZmZpY2llbnQgU3ltYm9saWMgQW5hbHlzaXMgZm9yIE9wdGltaXppbmcgQ29tcGlsZXJzCisvLyAgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuCisvLworLy8gIFVzaW5nIHRoZSBjaGFpbnMgb2YgcmVjdXJyZW5jZXMgYWxnZWJyYSBmb3IgZGF0YSBkZXBlbmRlbmNlIHRlc3RpbmcgYW5kCisvLyAgaW5kdWN0aW9uIHZhcmlhYmxlIHN1YnN0aXR1dGlvbgorLy8gIE1TIFRoZXNpcywgSm9obmllIEJpcmNoCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzY2FsYXItZXZvbHV0aW9uIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwcmVzc2lvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsQWxpYXMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL09wZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Db25zdGFudEZvbGRpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9WYWx1ZVRyYWNraW5nLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbnN0YW50UmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0luc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUFycmF5TGVuSXRDb3VudHMsCisgICAgICAgICAgIk51bWJlciBvZiB0cmlwIGNvdW50cyBjb21wdXRlZCB3aXRoIGFycmF5IGxlbmd0aCIpOworU1RBVElTVElDKE51bVRyaXBDb3VudHNDb21wdXRlZCwKKyAgICAgICAgICAiTnVtYmVyIG9mIGxvb3BzIHdpdGggcHJlZGljdGFibGUgbG9vcCBjb3VudHMiKTsKK1NUQVRJU1RJQyhOdW1UcmlwQ291bnRzTm90Q29tcHV0ZWQsCisgICAgICAgICAgIk51bWJlciBvZiBsb29wcyB3aXRob3V0IHByZWRpY3RhYmxlIGxvb3AgY291bnRzIik7CitTVEFUSVNUSUMoTnVtQnJ1dGVGb3JjZVRyaXBDb3VudHNDb21wdXRlZCwKKyAgICAgICAgICAiTnVtYmVyIG9mIGxvb3BzIHdpdGggdHJpcCBjb3VudHMgY29tcHV0ZWQgYnkgZm9yY2UiKTsKKworc3RhdGljIGNsOjpvcHQ8dW5zaWduZWQ+CitNYXhCcnV0ZUZvcmNlSXRlcmF0aW9ucygic2NhbGFyLWV2b2x1dGlvbi1tYXgtaXRlcmF0aW9ucyIsIGNsOjpSZWFsbHlIaWRkZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBTQ0VWIHdpbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bWJvbGljYWxseSBleGVjdXRlIGEgY29uc3RhbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcml2ZWQgbG9vcCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoMTAwKSk7CisKK0lOSVRJQUxJWkVfUEFTUyhTY2FsYXJFdm9sdXRpb24sICJzY2FsYXItZXZvbHV0aW9uIiwKKyAgICAgICAgICAgICAgICAiU2NhbGFyIEV2b2x1dGlvbiBBbmFseXNpcyIsIGZhbHNlLCB0cnVlKTsKK2NoYXIgU2NhbGFyRXZvbHV0aW9uOjpJRCA9IDA7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVYgY2xhc3MgZGVmaW5pdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0NFViBjbGFzcy4KKy8vCisKK1NDRVY6On5TQ0VWKCkge30KKwordm9pZCBTQ0VWOjpkdW1wKCkgY29uc3QgeworICBwcmludChkYmdzKCkpOworICBkYmdzKCkgPDwgJ1xuJzsKK30KKworYm9vbCBTQ0VWOjppc1plcm8oKSBjb25zdCB7CisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKlNDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50Pih0aGlzKSkKKyAgICByZXR1cm4gU0MtPmdldFZhbHVlKCktPmlzWmVybygpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU0NFVjo6aXNPbmUoKSBjb25zdCB7CisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKlNDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50Pih0aGlzKSkKKyAgICByZXR1cm4gU0MtPmdldFZhbHVlKCktPmlzT25lKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTQ0VWOjppc0FsbE9uZXNWYWx1ZSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqU0MgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KHRoaXMpKQorICAgIHJldHVybiBTQy0+Z2V0VmFsdWUoKS0+aXNBbGxPbmVzVmFsdWUoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitTQ0VWQ291bGROb3RDb21wdXRlOjpTQ0VWQ291bGROb3RDb21wdXRlKCkgOgorICBTQ0VWKEZvbGRpbmdTZXROb2RlSURSZWYoKSwgc2NDb3VsZE5vdENvbXB1dGUpIHt9CisKK2Jvb2wgU0NFVkNvdWxkTm90Q29tcHV0ZTo6aXNMb29wSW52YXJpYW50KGNvbnN0IExvb3AgKkwpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiQXR0ZW1wdCB0byB1c2UgYSBTQ0VWQ291bGROb3RDb21wdXRlIG9iamVjdCEiKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitjb25zdCBUeXBlICpTQ0VWQ291bGROb3RDb21wdXRlOjpnZXRUeXBlKCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJBdHRlbXB0IHRvIHVzZSBhIFNDRVZDb3VsZE5vdENvbXB1dGUgb2JqZWN0ISIpOworICByZXR1cm4gMDsKK30KKworYm9vbCBTQ0VWQ291bGROb3RDb21wdXRlOjpoYXNDb21wdXRhYmxlTG9vcEV2b2x1dGlvbihjb25zdCBMb29wICpMKSBjb25zdCB7CisgIGxsdm1fdW5yZWFjaGFibGUoIkF0dGVtcHQgdG8gdXNlIGEgU0NFVkNvdWxkTm90Q29tcHV0ZSBvYmplY3QhIik7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTQ0VWQ291bGROb3RDb21wdXRlOjpoYXNPcGVyYW5kKGNvbnN0IFNDRVYgKikgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJBdHRlbXB0IHRvIHVzZSBhIFNDRVZDb3VsZE5vdENvbXB1dGUgb2JqZWN0ISIpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU0NFVkNvdWxkTm90Q29tcHV0ZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICIqKipDT1VMRE5PVENPTVBVVEUqKioiOworfQorCitib29sIFNDRVZDb3VsZE5vdENvbXB1dGU6OmNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY0NvdWxkTm90Q29tcHV0ZTsKK30KKworY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRDb25zdGFudChDb25zdGFudEludCAqVikgeworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBJRC5BZGRJbnRlZ2VyKHNjQ29uc3RhbnQpOworICBJRC5BZGRQb2ludGVyKFYpOworICB2b2lkICpJUCA9IDA7CisgIGlmIChjb25zdCBTQ0VWICpTID0gVW5pcXVlU0NFVnMuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKSByZXR1cm4gUzsKKyAgU0NFViAqUyA9IG5ldyAoU0NFVkFsbG9jYXRvcikgU0NFVkNvbnN0YW50KElELkludGVybihTQ0VWQWxsb2NhdG9yKSwgVik7CisgIFVuaXF1ZVNDRVZzLkluc2VydE5vZGUoUywgSVApOworICByZXR1cm4gUzsKK30KKworY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRDb25zdGFudChjb25zdCBBUEludCYgVmFsKSB7CisgIHJldHVybiBnZXRDb25zdGFudChDb25zdGFudEludDo6Z2V0KGdldENvbnRleHQoKSwgVmFsKSk7Cit9CisKK2NvbnN0IFNDRVYgKgorU2NhbGFyRXZvbHV0aW9uOjpnZXRDb25zdGFudChjb25zdCBUeXBlICpUeSwgdWludDY0X3QgViwgYm9vbCBpc1NpZ25lZCkgeworICBjb25zdCBJbnRlZ2VyVHlwZSAqSVR5ID0gY2FzdDxJbnRlZ2VyVHlwZT4oZ2V0RWZmZWN0aXZlU0NFVlR5cGUoVHkpKTsKKyAgcmV0dXJuIGdldENvbnN0YW50KENvbnN0YW50SW50OjpnZXQoSVR5LCBWLCBpc1NpZ25lZCkpOworfQorCitjb25zdCBUeXBlICpTQ0VWQ29uc3RhbnQ6OmdldFR5cGUoKSBjb25zdCB7IHJldHVybiBWLT5nZXRUeXBlKCk7IH0KKwordm9pZCBTQ0VWQ29uc3RhbnQ6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBXcml0ZUFzT3BlcmFuZChPUywgViwgZmFsc2UpOworfQorCitTQ0VWQ2FzdEV4cHI6OlNDRVZDYXN0RXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU0NFVlR5LCBjb25zdCBTQ0VWICpvcCwgY29uc3QgVHlwZSAqdHkpCisgIDogU0NFVihJRCwgU0NFVlR5KSwgT3Aob3ApLCBUeSh0eSkge30KKworYm9vbCBTQ0VWQ2FzdEV4cHI6OmRvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0IHsKKyAgcmV0dXJuIE9wLT5kb21pbmF0ZXMoQkIsIERUKTsKK30KKworYm9vbCBTQ0VWQ2FzdEV4cHI6OnByb3Blcmx5RG9taW5hdGVzKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCkgY29uc3QgeworICByZXR1cm4gT3AtPnByb3Blcmx5RG9taW5hdGVzKEJCLCBEVCk7Cit9CisKK1NDRVZUcnVuY2F0ZUV4cHI6OlNDRVZUcnVuY2F0ZUV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqb3AsIGNvbnN0IFR5cGUgKnR5KQorICA6IFNDRVZDYXN0RXhwcihJRCwgc2NUcnVuY2F0ZSwgb3AsIHR5KSB7CisgIGFzc2VydCgoT3AtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSB8fCBPcC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgKFR5LT5pc0ludGVnZXJUeSgpIHx8IFR5LT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgIkNhbm5vdCB0cnVuY2F0ZSBub24taW50ZWdlciB2YWx1ZSEiKTsKK30KKwordm9pZCBTQ0VWVHJ1bmNhdGVFeHByOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIih0cnVuYyAiIDw8ICpPcC0+Z2V0VHlwZSgpIDw8ICIgIiA8PCAqT3AgPDwgIiB0byAiIDw8ICpUeSA8PCAiKSI7Cit9CisKK1NDRVZaZXJvRXh0ZW5kRXhwcjo6U0NFVlplcm9FeHRlbmRFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpvcCwgY29uc3QgVHlwZSAqdHkpCisgIDogU0NFVkNhc3RFeHByKElELCBzY1plcm9FeHRlbmQsIG9wLCB0eSkgeworICBhc3NlcnQoKE9wLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkgfHwgT3AtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgIChUeS0+aXNJbnRlZ2VyVHkoKSB8fCBUeS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgICJDYW5ub3QgemVybyBleHRlbmQgbm9uLWludGVnZXIgdmFsdWUhIik7Cit9CisKK3ZvaWQgU0NFVlplcm9FeHRlbmRFeHByOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIih6ZXh0ICIgPDwgKk9wLT5nZXRUeXBlKCkgPDwgIiAiIDw8ICpPcCA8PCAiIHRvICIgPDwgKlR5IDw8ICIpIjsKK30KKworU0NFVlNpZ25FeHRlbmRFeHByOjpTQ0VWU2lnbkV4dGVuZEV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKm9wLCBjb25zdCBUeXBlICp0eSkKKyAgOiBTQ0VWQ2FzdEV4cHIoSUQsIHNjU2lnbkV4dGVuZCwgb3AsIHR5KSB7CisgIGFzc2VydCgoT3AtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSB8fCBPcC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgKFR5LT5pc0ludGVnZXJUeSgpIHx8IFR5LT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgIkNhbm5vdCBzaWduIGV4dGVuZCBub24taW50ZWdlciB2YWx1ZSEiKTsKK30KKwordm9pZCBTQ0VWU2lnbkV4dGVuZEV4cHI6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBPUyA8PCAiKHNleHQgIiA8PCAqT3AtPmdldFR5cGUoKSA8PCAiICIgPDwgKk9wIDw8ICIgdG8gIiA8PCAqVHkgPDwgIikiOworfQorCit2b2lkIFNDRVZDb21tdXRhdGl2ZUV4cHI6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBjb25zdCBjaGFyICpPcFN0ciA9IGdldE9wZXJhdGlvblN0cigpOworICBPUyA8PCAiKCI7CisgIGZvciAob3BfaXRlcmF0b3IgSSA9IG9wX2JlZ2luKCksIEUgPSBvcF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBPUyA8PCAqKkk7CisgICAgaWYgKGxsdm06Om5leHQoSSkgIT0gRSkKKyAgICAgIE9TIDw8IE9wU3RyOworICB9CisgIE9TIDw8ICIpIjsKK30KKworYm9vbCBTQ0VWTkFyeUV4cHI6OmRvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0IHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKCFnZXRPcGVyYW5kKGkpLT5kb21pbmF0ZXMoQkIsIERUKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTQ0VWTkFyeUV4cHI6OnByb3Blcmx5RG9taW5hdGVzKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCkgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoIWdldE9wZXJhbmQoaSktPnByb3Blcmx5RG9taW5hdGVzKEJCLCBEVCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU0NFVlVEaXZFeHByOjpkb21pbmF0ZXMoQmFzaWNCbG9jayAqQkIsIERvbWluYXRvclRyZWUgKkRUKSBjb25zdCB7CisgIHJldHVybiBMSFMtPmRvbWluYXRlcyhCQiwgRFQpICYmIFJIUy0+ZG9taW5hdGVzKEJCLCBEVCk7Cit9CisKK2Jvb2wgU0NFVlVEaXZFeHByOjpwcm9wZXJseURvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0IHsKKyAgcmV0dXJuIExIUy0+cHJvcGVybHlEb21pbmF0ZXMoQkIsIERUKSAmJiBSSFMtPnByb3Blcmx5RG9taW5hdGVzKEJCLCBEVCk7Cit9CisKK3ZvaWQgU0NFVlVEaXZFeHByOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIigiIDw8ICpMSFMgPDwgIiAvdSAiIDw8ICpSSFMgPDwgIikiOworfQorCitjb25zdCBUeXBlICpTQ0VWVURpdkV4cHI6OmdldFR5cGUoKSBjb25zdCB7CisgIC8vIEluIG1vc3QgY2FzZXMgdGhlIHR5cGVzIG9mIExIUyBhbmQgUkhTIHdpbGwgYmUgdGhlIHNhbWUsIGJ1dCBpbiBzb21lCisgIC8vIGNyYXp5IGNhc2VzIG9uZSBvciB0aGUgb3RoZXIgbWF5IGJlIGEgcG9pbnRlci4gU2NhbGFyRXZvbHV0aW9uIGRvZXNuJ3QKKyAgLy8gZGVwZW5kIG9uIHRoZSB0eXBlIGZvciBjb3JyZWN0bmVzcywgYnV0IGhhbmRsaW5nIHR5cGVzIGNhcmVmdWxseSBjYW4KKyAgLy8gYXZvaWQgZXh0cmEgY2FzdHMgaW4gdGhlIFNDRVZFeHBhbmRlci4gVGhlIExIUyBpcyBtb3JlIGxpa2VseSB0byBiZQorICAvLyBhIHBvaW50ZXIgdHlwZSB0aGFuIHRoZSBSSFMsIHNvIHVzZSB0aGUgUkhTJyB0eXBlIGhlcmUuCisgIHJldHVybiBSSFMtPmdldFR5cGUoKTsKK30KKworYm9vbCBTQ0VWQWRkUmVjRXhwcjo6aXNMb29wSW52YXJpYW50KGNvbnN0IExvb3AgKlF1ZXJ5TG9vcCkgY29uc3QgeworICAvLyBBZGQgcmVjdXJyZW5jZXMgYXJlIG5ldmVyIGludmFyaWFudCBpbiB0aGUgZnVuY3Rpb24tYm9keSAobnVsbCBsb29wKS4KKyAgaWYgKCFRdWVyeUxvb3ApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFRoaXMgcmVjdXJyZW5jZSBpcyB2YXJpYW50IHcuci50LiBRdWVyeUxvb3AgaWYgUXVlcnlMb29wIGNvbnRhaW5zIEwuCisgIGlmIChRdWVyeUxvb3AtPmNvbnRhaW5zKEwpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBUaGlzIHJlY3VycmVuY2UgaXMgdmFyaWFudCB3LnIudC4gUXVlcnlMb29wIGlmIGFueSBvZiBpdHMgb3BlcmFuZHMKKyAgLy8gYXJlIHZhcmlhbnQuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoIWdldE9wZXJhbmQoaSktPmlzTG9vcEludmFyaWFudChRdWVyeUxvb3ApKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE90aGVyd2lzZSBpdCdzIGxvb3AtaW52YXJpYW50LgorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbAorU0NFVkFkZFJlY0V4cHI6OmRvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0IHsKKyAgcmV0dXJuIERULT5kb21pbmF0ZXMoTC0+Z2V0SGVhZGVyKCksIEJCKSAmJgorICAgICAgICAgU0NFVk5BcnlFeHByOjpkb21pbmF0ZXMoQkIsIERUKTsKK30KKworYm9vbAorU0NFVkFkZFJlY0V4cHI6OnByb3Blcmx5RG9taW5hdGVzKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCkgY29uc3QgeworICAvLyBUaGlzIHVzZXMgYSAiZG9taW5hdGVzIiBxdWVyeSBpbnN0ZWFkIG9mICJwcm9wZXJseSBkb21pbmF0ZXMiIHF1ZXJ5IGJlY2F1c2UKKyAgLy8gdGhlIGluc3RydWN0aW9uIHdoaWNoIHByb2R1Y2VzIHRoZSBhZGRyZWMncyB2YWx1ZSBpcyBhIFBISSwgYW5kIGEgUEhJCisgIC8vIGVmZmVjdGl2ZWx5IHByb3Blcmx5IGRvbWluYXRlcyBpdHMgZW50aXJlIGNvbnRhaW5pbmcgYmxvY2suCisgIHJldHVybiBEVC0+ZG9taW5hdGVzKEwtPmdldEhlYWRlcigpLCBCQikgJiYKKyAgICAgICAgIFNDRVZOQXJ5RXhwcjo6cHJvcGVybHlEb21pbmF0ZXMoQkIsIERUKTsKK30KKwordm9pZCBTQ0VWQWRkUmVjRXhwcjo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICJ7IiA8PCAqT3BlcmFuZHNbMF07CisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBOdW1PcGVyYW5kczsgaSAhPSBlOyArK2kpCisgICAgT1MgPDwgIiwrLCIgPDwgKk9wZXJhbmRzW2ldOworICBPUyA8PCAifTwiOworICBXcml0ZUFzT3BlcmFuZChPUywgTC0+Z2V0SGVhZGVyKCksIC8qUHJpbnRUeXBlPSovZmFsc2UpOworICBPUyA8PCAiPiI7Cit9CisKK3ZvaWQgU0NFVlVua25vd246OmRlbGV0ZWQoKSB7CisgIC8vIENsZWFyIHRoaXMgU0NFVlVua25vd24gZnJvbSBWYWx1ZXNBdFNjb3Blcy4KKyAgU0UtPlZhbHVlc0F0U2NvcGVzLmVyYXNlKHRoaXMpOworCisgIC8vIFJlbW92ZSB0aGlzIFNDRVZVbmtub3duIGZyb20gdGhlIHVuaXF1aW5nIG1hcC4KKyAgU0UtPlVuaXF1ZVNDRVZzLlJlbW92ZU5vZGUodGhpcyk7CisKKyAgLy8gUmVsZWFzZSB0aGUgdmFsdWUuCisgIHNldFZhbFB0cigwKTsKK30KKwordm9pZCBTQ0VWVW5rbm93bjo6YWxsVXNlc1JlcGxhY2VkV2l0aChWYWx1ZSAqTmV3KSB7CisgIC8vIENsZWFyIHRoaXMgU0NFVlVua25vd24gZnJvbSBWYWx1ZXNBdFNjb3Blcy4KKyAgU0UtPlZhbHVlc0F0U2NvcGVzLmVyYXNlKHRoaXMpOworCisgIC8vIFJlbW92ZSB0aGlzIFNDRVZVbmtub3duIGZyb20gdGhlIHVuaXF1aW5nIG1hcC4KKyAgU0UtPlVuaXF1ZVNDRVZzLlJlbW92ZU5vZGUodGhpcyk7CisKKyAgLy8gVXBkYXRlIHRoaXMgU0NFVlVua25vd24gdG8gcG9pbnQgdG8gdGhlIG5ldyB2YWx1ZS4gVGhpcyBpcyBuZWVkZWQKKyAgLy8gYmVjYXVzZSB0aGVyZSBtYXkgc3RpbGwgYmUgb3V0c3RhbmRpbmcgU0NFVnMgd2hpY2ggc3RpbGwgcG9pbnQgdG8KKyAgLy8gdGhpcyBTQ0VWVW5rbm93bi4KKyAgc2V0VmFsUHRyKE5ldyk7Cit9CisKK2Jvb2wgU0NFVlVua25vd246OmlzTG9vcEludmFyaWFudChjb25zdCBMb29wICpMKSBjb25zdCB7CisgIC8vIEFsbCBub24taW5zdHJ1Y3Rpb24gdmFsdWVzIGFyZSBsb29wIGludmFyaWFudC4gIEFsbCBpbnN0cnVjdGlvbnMgYXJlIGxvb3AKKyAgLy8gaW52YXJpYW50IGlmIHRoZXkgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBsb29wLgorICAvLyBJbnN0cnVjdGlvbnMgYXJlIG5ldmVyIGNvbnNpZGVyZWQgaW52YXJpYW50IGluIHRoZSBmdW5jdGlvbiBib2R5CisgIC8vIChudWxsIGxvb3ApIGJlY2F1c2UgdGhleSBhcmUgZGVmaW5lZCB3aXRoaW4gdGhlICJsb29wIi4KKyAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KGdldFZhbHVlKCkpKQorICAgIHJldHVybiBMICYmICFMLT5jb250YWlucyhJKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU0NFVlVua25vd246OmRvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0IHsKKyAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KGdldFZhbHVlKCkpKQorICAgIHJldHVybiBEVC0+ZG9taW5hdGVzKEktPmdldFBhcmVudCgpLCBCQik7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFNDRVZVbmtub3duOjpwcm9wZXJseURvbWluYXRlcyhCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQpIGNvbnN0IHsKKyAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KGdldFZhbHVlKCkpKQorICAgIHJldHVybiBEVC0+cHJvcGVybHlEb21pbmF0ZXMoSS0+Z2V0UGFyZW50KCksIEJCKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IFR5cGUgKlNDRVZVbmtub3duOjpnZXRUeXBlKCkgY29uc3QgeworICByZXR1cm4gZ2V0VmFsdWUoKS0+Z2V0VHlwZSgpOworfQorCitib29sIFNDRVZVbmtub3duOjppc1NpemVPZihjb25zdCBUeXBlIComQWxsb2NUeSkgY29uc3QgeworICBpZiAoQ29uc3RhbnRFeHByICpWQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KGdldFZhbHVlKCkpKQorICAgIGlmIChWQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpQdHJUb0ludCkKKyAgICAgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihWQ0UtPmdldE9wZXJhbmQoMCkpKQorICAgICAgICBpZiAoQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyICYmCisgICAgICAgICAgICBDRS0+Z2V0T3BlcmFuZCgwKS0+aXNOdWxsVmFsdWUoKSAmJgorICAgICAgICAgICAgQ0UtPmdldE51bU9wZXJhbmRzKCkgPT0gMikKKyAgICAgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENFLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICAgICAgIGlmIChDSS0+aXNPbmUoKSkgeworICAgICAgICAgICAgICBBbGxvY1R5ID0gY2FzdDxQb2ludGVyVHlwZT4oQ0UtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNDRVZVbmtub3duOjppc0FsaWduT2YoY29uc3QgVHlwZSAqJkFsbG9jVHkpIGNvbnN0IHsKKyAgaWYgKENvbnN0YW50RXhwciAqVkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihnZXRWYWx1ZSgpKSkKKyAgICBpZiAoVkNFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQpCisgICAgICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVkNFLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0ciAmJgorICAgICAgICAgICAgQ0UtPmdldE9wZXJhbmQoMCktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgICBjb25zdCBUeXBlICpUeSA9CisgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihDRS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oVHkpKQorICAgICAgICAgICAgaWYgKCFTVHktPmlzUGFja2VkKCkgJiYKKyAgICAgICAgICAgICAgICBDRS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAzICYmCisgICAgICAgICAgICAgICAgQ0UtPmdldE9wZXJhbmQoMSktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDRS0+Z2V0T3BlcmFuZCgyKSkpCisgICAgICAgICAgICAgICAgaWYgKENJLT5pc09uZSgpICYmCisgICAgICAgICAgICAgICAgICAgIFNUeS0+Z2V0TnVtRWxlbWVudHMoKSA9PSAyICYmCisgICAgICAgICAgICAgICAgICAgIFNUeS0+Z2V0RWxlbWVudFR5cGUoMCktPmlzSW50ZWdlclR5KDEpKSB7CisgICAgICAgICAgICAgICAgICBBbGxvY1R5ID0gU1R5LT5nZXRFbGVtZW50VHlwZSgxKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTQ0VWVW5rbm93bjo6aXNPZmZzZXRPZihjb25zdCBUeXBlIComQ1R5LCBDb25zdGFudCAqJkZpZWxkTm8pIGNvbnN0IHsKKyAgaWYgKENvbnN0YW50RXhwciAqVkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihnZXRWYWx1ZSgpKSkKKyAgICBpZiAoVkNFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQpCisgICAgICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVkNFLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0ciAmJgorICAgICAgICAgICAgQ0UtPmdldE51bU9wZXJhbmRzKCkgPT0gMyAmJgorICAgICAgICAgICAgQ0UtPmdldE9wZXJhbmQoMCktPmlzTnVsbFZhbHVlKCkgJiYKKyAgICAgICAgICAgIENFLT5nZXRPcGVyYW5kKDEpLT5pc051bGxWYWx1ZSgpKSB7CisgICAgICAgICAgY29uc3QgVHlwZSAqVHkgPQorICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oQ0UtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICAgICAgLy8gSWdub3JlIHZlY3RvciB0eXBlcyBoZXJlIHNvIHRoYXQgU2NhbGFyRXZvbHV0aW9uRXhwYW5kZXIgZG9lc24ndAorICAgICAgICAgIC8vIGVtaXQgZ2V0ZWxlbWVudHB0cnMgdGhhdCBpbmRleCBpbnRvIHZlY3RvcnMuCisgICAgICAgICAgaWYgKFR5LT5pc1N0cnVjdFR5KCkgfHwgVHktPmlzQXJyYXlUeSgpKSB7CisgICAgICAgICAgICBDVHkgPSBUeTsKKyAgICAgICAgICAgIEZpZWxkTm8gPSBDRS0+Z2V0T3BlcmFuZCgyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTQ0VWVW5rbm93bjo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGNvbnN0IFR5cGUgKkFsbG9jVHk7CisgIGlmIChpc1NpemVPZihBbGxvY1R5KSkgeworICAgIE9TIDw8ICJzaXplb2YoIiA8PCAqQWxsb2NUeSA8PCAiKSI7CisgICAgcmV0dXJuOworICB9CisgIGlmIChpc0FsaWduT2YoQWxsb2NUeSkpIHsKKyAgICBPUyA8PCAiYWxpZ25vZigiIDw8ICpBbGxvY1R5IDw8ICIpIjsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBUeXBlICpDVHk7CisgIENvbnN0YW50ICpGaWVsZE5vOworICBpZiAoaXNPZmZzZXRPZihDVHksIEZpZWxkTm8pKSB7CisgICAgT1MgPDwgIm9mZnNldG9mKCIgPDwgKkNUeSA8PCAiLCAiOworICAgIFdyaXRlQXNPcGVyYW5kKE9TLCBGaWVsZE5vLCBmYWxzZSk7CisgICAgT1MgPDwgIikiOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE90aGVyd2lzZSBqdXN0IHByaW50IGl0IG5vcm1hbGx5LgorICBXcml0ZUFzT3BlcmFuZChPUywgZ2V0VmFsdWUoKSwgZmFsc2UpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NFViBVdGlsaXRpZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3N0YXRpYyBib29sIENvbXBhcmVUeXBlcyhjb25zdCBUeXBlICpBLCBjb25zdCBUeXBlICpCKSB7CisgIGlmIChBLT5nZXRUeXBlSUQoKSAhPSBCLT5nZXRUeXBlSUQoKSkKKyAgICByZXR1cm4gQS0+Z2V0VHlwZUlEKCkgPCBCLT5nZXRUeXBlSUQoKTsKKyAgaWYgKGNvbnN0IEludGVnZXJUeXBlICpBSSA9IGR5bl9jYXN0PEludGVnZXJUeXBlPihBKSkgeworICAgIGNvbnN0IEludGVnZXJUeXBlICpCSSA9IGNhc3Q8SW50ZWdlclR5cGU+KEIpOworICAgIHJldHVybiBBSS0+Z2V0Qml0V2lkdGgoKSA8IEJJLT5nZXRCaXRXaWR0aCgpOworICB9CisgIGlmIChjb25zdCBQb2ludGVyVHlwZSAqQUkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oQSkpIHsKKyAgICBjb25zdCBQb2ludGVyVHlwZSAqQkkgPSBjYXN0PFBvaW50ZXJUeXBlPihCKTsKKyAgICByZXR1cm4gQ29tcGFyZVR5cGVzKEFJLT5nZXRFbGVtZW50VHlwZSgpLCBCSS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIH0KKyAgaWYgKGNvbnN0IEFycmF5VHlwZSAqQUkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KEEpKSB7CisgICAgY29uc3QgQXJyYXlUeXBlICpCSSA9IGNhc3Q8QXJyYXlUeXBlPihCKTsKKyAgICBpZiAoQUktPmdldE51bUVsZW1lbnRzKCkgIT0gQkktPmdldE51bUVsZW1lbnRzKCkpCisgICAgICByZXR1cm4gQUktPmdldE51bUVsZW1lbnRzKCkgPCBCSS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICByZXR1cm4gQ29tcGFyZVR5cGVzKEFJLT5nZXRFbGVtZW50VHlwZSgpLCBCSS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIH0KKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKkFJID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oQSkpIHsKKyAgICBjb25zdCBWZWN0b3JUeXBlICpCSSA9IGNhc3Q8VmVjdG9yVHlwZT4oQik7CisgICAgaWYgKEFJLT5nZXROdW1FbGVtZW50cygpICE9IEJJLT5nZXROdW1FbGVtZW50cygpKQorICAgICAgcmV0dXJuIEFJLT5nZXROdW1FbGVtZW50cygpIDwgQkktPmdldE51bUVsZW1lbnRzKCk7CisgICAgcmV0dXJuIENvbXBhcmVUeXBlcyhBSS0+Z2V0RWxlbWVudFR5cGUoKSwgQkktPmdldEVsZW1lbnRUeXBlKCkpOworICB9CisgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpBSSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KEEpKSB7CisgICAgY29uc3QgU3RydWN0VHlwZSAqQkkgPSBjYXN0PFN0cnVjdFR5cGU+KEIpOworICAgIGlmIChBSS0+Z2V0TnVtRWxlbWVudHMoKSAhPSBCSS0+Z2V0TnVtRWxlbWVudHMoKSkKKyAgICAgIHJldHVybiBBSS0+Z2V0TnVtRWxlbWVudHMoKSA8IEJJLT5nZXROdW1FbGVtZW50cygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBSS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoQ29tcGFyZVR5cGVzKEFJLT5nZXRFbGVtZW50VHlwZShpKSwgQkktPmdldEVsZW1lbnRUeXBlKGkpKSB8fAorICAgICAgICAgIENvbXBhcmVUeXBlcyhCSS0+Z2V0RWxlbWVudFR5cGUoaSksIEFJLT5nZXRFbGVtZW50VHlwZShpKSkpCisgICAgICAgIHJldHVybiBDb21wYXJlVHlwZXMoQUktPmdldEVsZW1lbnRUeXBlKGkpLCBCSS0+Z2V0RWxlbWVudFR5cGUoaSkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworbmFtZXNwYWNlIHsKKyAgLy8vIFNDRVZDb21wbGV4aXR5Q29tcGFyZSAtIFJldHVybiB0cnVlIGlmIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBMSFMgaXMgbGVzcworICAvLy8gdGhhbiB0aGUgY29tcGxleGl0eSBvZiB0aGUgUkhTLiAgVGhpcyBjb21wYXJhdG9yIGlzIHVzZWQgdG8gY2Fub25pY2FsaXplCisgIC8vLyBleHByZXNzaW9ucy4KKyAgY2xhc3MgU0NFVkNvbXBsZXhpdHlDb21wYXJlIHsKKyAgICBjb25zdCBMb29wSW5mbyAqTEk7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTQ0VWQ29tcGxleGl0eUNvbXBhcmUoY29uc3QgTG9vcEluZm8gKmxpKSA6IExJKGxpKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKSBjb25zdCB7CisgICAgICAvLyBGYXN0LXBhdGg6IFNDRVZzIGFyZSB1bmlxdWVkIHNvIHdlIGNhbiBkbyBhIHF1aWNrIGVxdWFsaXR5IGNoZWNrLgorICAgICAgaWYgKExIUyA9PSBSSFMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gUHJpbWFyaWx5LCBzb3J0IHRoZSBTQ0VWcyBieSB0aGVpciBnZXRTQ0VWVHlwZSgpLgorICAgICAgdW5zaWduZWQgTFR5cGUgPSBMSFMtPmdldFNDRVZUeXBlKCksIFJUeXBlID0gUkhTLT5nZXRTQ0VWVHlwZSgpOworICAgICAgaWYgKExUeXBlICE9IFJUeXBlKQorICAgICAgICByZXR1cm4gTFR5cGUgPCBSVHlwZTsKKworICAgICAgLy8gQXNpZGUgZnJvbSB0aGUgZ2V0U0NFVlR5cGUoKSBvcmRlcmluZywgdGhlIHBhcnRpY3VsYXIgb3JkZXJpbmcKKyAgICAgIC8vIGlzbid0IHZlcnkgaW1wb3J0YW50IGV4Y2VwdCB0aGF0IGl0J3MgYmVuZWZpY2lhbCB0byBiZSBjb25zaXN0ZW50LAorICAgICAgLy8gc28gdGhhdCAoYSArIGIpIGFuZCAoYiArIGEpIGRvbid0IGVuZCB1cCBhcyBkaWZmZXJlbnQgZXhwcmVzc2lvbnMuCisKKyAgICAgIC8vIFNvcnQgU0NFVlVua25vd24gdmFsdWVzIHdpdGggc29tZSBsb29zZSBoZXVyaXN0aWNzLiBUT0RPOiBUaGlzIGlzCisgICAgICAvLyBub3QgYXMgY29tcGxldGUgYXMgaXQgY291bGQgYmUuCisgICAgICBpZiAoY29uc3QgU0NFVlVua25vd24gKkxVID0gZHluX2Nhc3Q8U0NFVlVua25vd24+KExIUykpIHsKKyAgICAgICAgY29uc3QgU0NFVlVua25vd24gKlJVID0gY2FzdDxTQ0VWVW5rbm93bj4oUkhTKTsKKworICAgICAgICAvLyBPcmRlciBwb2ludGVyIHZhbHVlcyBhZnRlciBpbnRlZ2VyIHZhbHVlcy4gVGhpcyBoZWxwcyBTQ0VWRXhwYW5kZXIKKyAgICAgICAgLy8gZm9ybSBHRVBzLgorICAgICAgICBib29sIExJc1BvaW50ZXIgPSBMVS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpLAorICAgICAgICAgICAgIFJJc1BvaW50ZXIgPSBSVS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpOworICAgICAgICBpZiAoTElzUG9pbnRlciAhPSBSSXNQb2ludGVyKQorICAgICAgICAgIHJldHVybiBSSXNQb2ludGVyOworCisgICAgICAgIC8vIENvbXBhcmUgZ2V0VmFsdWVJRCB2YWx1ZXMuCisgICAgICAgIHVuc2lnbmVkIExJRCA9IExVLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZUlEKCksCisgICAgICAgICAgICAgICAgIFJJRCA9IFJVLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZUlEKCk7CisgICAgICAgIGlmIChMSUQgIT0gUklEKQorICAgICAgICAgIHJldHVybiBMSUQgPCBSSUQ7CisKKyAgICAgICAgLy8gU29ydCBhcmd1bWVudHMgYnkgdGhlaXIgcG9zaXRpb24uCisgICAgICAgIGlmIChjb25zdCBBcmd1bWVudCAqTEEgPSBkeW5fY2FzdDxBcmd1bWVudD4oTFUtPmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgY29uc3QgQXJndW1lbnQgKlJBID0gY2FzdDxBcmd1bWVudD4oUlUtPmdldFZhbHVlKCkpOworICAgICAgICAgIHJldHVybiBMQS0+Z2V0QXJnTm8oKSA8IFJBLT5nZXRBcmdObygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yIGluc3RydWN0aW9ucywgY29tcGFyZSB0aGVpciBsb29wIGRlcHRoLCBhbmQgdGhlaXIgb3Bjb2RlLgorICAgICAgICAvLyBUaGlzIGlzIHByZXR0eSBsb29zZS4KKyAgICAgICAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpMViA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihMVS0+Z2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqUlYgPSBjYXN0PEluc3RydWN0aW9uPihSVS0+Z2V0VmFsdWUoKSk7CisKKyAgICAgICAgICAvLyBDb21wYXJlIGxvb3AgZGVwdGhzLgorICAgICAgICAgIHVuc2lnbmVkIExEZXB0aCA9IExJLT5nZXRMb29wRGVwdGgoTFYtPmdldFBhcmVudCgpKSwKKyAgICAgICAgICAgICAgICAgICBSRGVwdGggPSBMSS0+Z2V0TG9vcERlcHRoKFJWLT5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgaWYgKExEZXB0aCAhPSBSRGVwdGgpCisgICAgICAgICAgICByZXR1cm4gTERlcHRoIDwgUkRlcHRoOworCisgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzLgorICAgICAgICAgIHVuc2lnbmVkIExOdW1PcHMgPSBMVi0+Z2V0TnVtT3BlcmFuZHMoKSwKKyAgICAgICAgICAgICAgICAgICBSTnVtT3BzID0gUlYtPmdldE51bU9wZXJhbmRzKCk7CisgICAgICAgICAgaWYgKExOdW1PcHMgIT0gUk51bU9wcykKKyAgICAgICAgICAgIHJldHVybiBMTnVtT3BzIDwgUk51bU9wczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gQ29tcGFyZSBjb25zdGFudCB2YWx1ZXMuCisgICAgICBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpMQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oTEhTKSkgeworICAgICAgICBjb25zdCBTQ0VWQ29uc3RhbnQgKlJDID0gY2FzdDxTQ0VWQ29uc3RhbnQ+KFJIUyk7CisgICAgICAgIGNvbnN0IENvbnN0YW50SW50ICpMQ0MgPSBMQy0+Z2V0VmFsdWUoKTsKKyAgICAgICAgY29uc3QgQ29uc3RhbnRJbnQgKlJDQyA9IFJDLT5nZXRWYWx1ZSgpOworICAgICAgICB1bnNpZ25lZCBMQml0V2lkdGggPSBMQ0MtPmdldEJpdFdpZHRoKCksIFJCaXRXaWR0aCA9IFJDQy0+Z2V0Qml0V2lkdGgoKTsKKyAgICAgICAgaWYgKExCaXRXaWR0aCAhPSBSQml0V2lkdGgpCisgICAgICAgICAgcmV0dXJuIExCaXRXaWR0aCA8IFJCaXRXaWR0aDsKKyAgICAgICAgcmV0dXJuIExDQy0+Z2V0VmFsdWUoKS51bHQoUkNDLT5nZXRWYWx1ZSgpKTsKKyAgICAgIH0KKworICAgICAgLy8gQ29tcGFyZSBhZGRyZWMgbG9vcCBkZXB0aHMuCisgICAgICBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkxBID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KExIUykpIHsKKyAgICAgICAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKlJBID0gY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUkhTKTsKKyAgICAgICAgdW5zaWduZWQgTERlcHRoID0gTEEtPmdldExvb3AoKS0+Z2V0TG9vcERlcHRoKCksCisgICAgICAgICAgICAgICAgIFJEZXB0aCA9IFJBLT5nZXRMb29wKCktPmdldExvb3BEZXB0aCgpOworICAgICAgICBpZiAoTERlcHRoICE9IFJEZXB0aCkKKyAgICAgICAgICByZXR1cm4gTERlcHRoIDwgUkRlcHRoOworICAgICAgfQorCisgICAgICAvLyBMZXhpY29ncmFwaGljYWxseSBjb21wYXJlIG4tYXJ5IGV4cHJlc3Npb25zLgorICAgICAgaWYgKGNvbnN0IFNDRVZOQXJ5RXhwciAqTEMgPSBkeW5fY2FzdDxTQ0VWTkFyeUV4cHI+KExIUykpIHsKKyAgICAgICAgY29uc3QgU0NFVk5BcnlFeHByICpSQyA9IGNhc3Q8U0NFVk5BcnlFeHByPihSSFMpOworICAgICAgICB1bnNpZ25lZCBMTnVtT3BzID0gTEMtPmdldE51bU9wZXJhbmRzKCksIFJOdW1PcHMgPSBSQy0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBMTnVtT3BzOyArK2kpIHsKKyAgICAgICAgICBpZiAoaSA+PSBSTnVtT3BzKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNvbnN0IFNDRVYgKkxPcCA9IExDLT5nZXRPcGVyYW5kKGkpLCAqUk9wID0gUkMtPmdldE9wZXJhbmQoaSk7CisgICAgICAgICAgaWYgKG9wZXJhdG9yKCkoTE9wLCBST3ApKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgaWYgKG9wZXJhdG9yKCkoUk9wLCBMT3ApKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBMTnVtT3BzIDwgUk51bU9wczsKKyAgICAgIH0KKworICAgICAgLy8gTGV4aWNvZ3JhcGhpY2FsbHkgY29tcGFyZSB1ZGl2IGV4cHJlc3Npb25zLgorICAgICAgaWYgKGNvbnN0IFNDRVZVRGl2RXhwciAqTEMgPSBkeW5fY2FzdDxTQ0VWVURpdkV4cHI+KExIUykpIHsKKyAgICAgICAgY29uc3QgU0NFVlVEaXZFeHByICpSQyA9IGNhc3Q8U0NFVlVEaXZFeHByPihSSFMpOworICAgICAgICBjb25zdCBTQ0VWICpMTCA9IExDLT5nZXRMSFMoKSwgKkxSID0gTEMtPmdldFJIUygpLAorICAgICAgICAgICAgICAgICAgICpSTCA9IFJDLT5nZXRMSFMoKSwgKlJSID0gUkMtPmdldFJIUygpOworICAgICAgICBpZiAob3BlcmF0b3IoKShMTCwgUkwpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob3BlcmF0b3IoKShSTCwgTEwpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG9wZXJhdG9yKCkoTFIsIFJSKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG9wZXJhdG9yKCkoUlIsIExSKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gQ29tcGFyZSBjYXN0IGV4cHJlc3Npb25zIGJ5IG9wZXJhbmQuCisgICAgICBpZiAoY29uc3QgU0NFVkNhc3RFeHByICpMQyA9IGR5bl9jYXN0PFNDRVZDYXN0RXhwcj4oTEhTKSkgeworICAgICAgICBjb25zdCBTQ0VWQ2FzdEV4cHIgKlJDID0gY2FzdDxTQ0VWQ2FzdEV4cHI+KFJIUyk7CisgICAgICAgIHJldHVybiBvcGVyYXRvcigpKExDLT5nZXRPcGVyYW5kKCksIFJDLT5nZXRPcGVyYW5kKCkpOworICAgICAgfQorCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIFNDRVYga2luZCEiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH07Cit9CisKKy8vLyBHcm91cEJ5Q29tcGxleGl0eSAtIEdpdmVuIGEgbGlzdCBvZiBTQ0VWIG9iamVjdHMsIG9yZGVyIHRoZW0gYnkgdGhlaXIKKy8vLyBjb21wbGV4aXR5LCBhbmQgZ3JvdXAgb2JqZWN0cyBvZiB0aGUgc2FtZSBjb21wbGV4aXR5IHRvZ2V0aGVyIGJ5IHZhbHVlLgorLy8vIFdoZW4gdGhpcyByb3V0aW5lIGlzIGZpbmlzaGVkLCB3ZSBrbm93IHRoYXQgYW55IGR1cGxpY2F0ZXMgaW4gdGhlIHZlY3RvciBhcmUKKy8vLyBjb25zZWN1dGl2ZSBhbmQgdGhhdCBjb21wbGV4aXR5IGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4KKy8vLworLy8vIE5vdGUgdGhhdCB3ZSBnbyB0YWtlIHNwZWNpYWwgcHJlY2F1dGlvbnMgdG8gZW5zdXJlIHRoYXQgd2UgZ2V0IGRldGVybWluaXN0aWMKKy8vLyByZXN1bHRzIGZyb20gdGhpcyByb3V0aW5lLiAgSW4gb3RoZXIgd29yZHMsIHdlIGRvbid0IHdhbnQgdGhlIHJlc3VsdHMgb2YKKy8vLyB0aGlzIHRvIGRlcGVuZCBvbiB3aGVyZSB0aGUgYWRkcmVzc2VzIG9mIHZhcmlvdXMgU0NFViBvYmplY3RzIGhhcHBlbmVkIHRvCisvLy8gbGFuZCBpbiBtZW1vcnkuCisvLy8KK3N0YXRpYyB2b2lkIEdyb3VwQnlDb21wbGV4aXR5KFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEkpIHsKKyAgaWYgKE9wcy5zaXplKCkgPCAyKSByZXR1cm47ICAvLyBOb29wCisgIGlmIChPcHMuc2l6ZSgpID09IDIpIHsKKyAgICAvLyBUaGlzIGlzIHRoZSBjb21tb24gY2FzZSwgd2hpY2ggYWxzbyBoYXBwZW5zIHRvIGJlIHRyaXZpYWxseSBzaW1wbGUuCisgICAgLy8gU3BlY2lhbCBjYXNlIGl0LgorICAgIGlmIChTQ0VWQ29tcGxleGl0eUNvbXBhcmUoTEkpKE9wc1sxXSwgT3BzWzBdKSkKKyAgICAgIHN0ZDo6c3dhcChPcHNbMF0sIE9wc1sxXSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRG8gdGhlIHJvdWdoIHNvcnQgYnkgY29tcGxleGl0eS4KKyAgc3RkOjpzdGFibGVfc29ydChPcHMuYmVnaW4oKSwgT3BzLmVuZCgpLCBTQ0VWQ29tcGxleGl0eUNvbXBhcmUoTEkpKTsKKworICAvLyBOb3cgdGhhdCB3ZSBhcmUgc29ydGVkIGJ5IGNvbXBsZXhpdHksIGdyb3VwIGVsZW1lbnRzIG9mIHRoZSBzYW1lCisgIC8vIGNvbXBsZXhpdHkuICBOb3RlIHRoYXQgdGhpcyBpcywgYXQgd29yc3QsIE5eMiwgYnV0IHRoZSB2ZWN0b3IgaXMgbGlrZWx5IHRvCisgIC8vIGJlIGV4dHJlbWVseSBzaG9ydCBpbiBwcmFjdGljZS4gIE5vdGUgdGhhdCB3ZSB0YWtlIHRoaXMgYXBwcm9hY2ggYmVjYXVzZSB3ZQorICAvLyBkbyBub3Qgd2FudCB0byBkZXBlbmQgb24gdGhlIGFkZHJlc3NlcyBvZiB0aGUgb2JqZWN0cyB3ZSBhcmUgZ3JvdXBpbmcuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGUtMjsgKytpKSB7CisgICAgY29uc3QgU0NFViAqUyA9IE9wc1tpXTsKKyAgICB1bnNpZ25lZCBDb21wbGV4aXR5ID0gUy0+Z2V0U0NFVlR5cGUoKTsKKworICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgb2JqZWN0cyBvZiB0aGUgc2FtZSBjb21wbGV4aXR5IGFuZCBzYW1lIHZhbHVlIGFzIHRoaXMKKyAgICAvLyBvbmUsIGdyb3VwIHRoZW0uCisgICAgZm9yICh1bnNpZ25lZCBqID0gaSsxOyBqICE9IGUgJiYgT3BzW2pdLT5nZXRTQ0VWVHlwZSgpID09IENvbXBsZXhpdHk7ICsraikgeworICAgICAgaWYgKE9wc1tqXSA9PSBTKSB7IC8vIEZvdW5kIGEgZHVwbGljYXRlLgorICAgICAgICAvLyBNb3ZlIGl0IHRvIGltbWVkaWF0ZWx5IGFmdGVyIGkndGggZWxlbWVudC4KKyAgICAgICAgc3RkOjpzd2FwKE9wc1tpKzFdLCBPcHNbal0pOworICAgICAgICArK2k7ICAgLy8gbm8gbmVlZCB0byByZXNjYW4gaXQuCisgICAgICAgIGlmIChpID09IGUtMikgcmV0dXJuOyAgLy8gRG9uZSEKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICBTaW1wbGUgU0NFViBtZXRob2QgaW1wbGVtZW50YXRpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQmlub21pYWxDb2VmZmljaWVudCAtIENvbXB1dGUgQkMoSXQsIEspLiAgVGhlIHJlc3VsdCBoYXMgd2lkdGggVy4KKy8vLyBBc3N1bWUsIEsgPiAwLgorc3RhdGljIGNvbnN0IFNDRVYgKkJpbm9taWFsQ29lZmZpY2llbnQoY29uc3QgU0NFViAqSXQsIHVuc2lnbmVkIEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSogUmVzdWx0VHkpIHsKKyAgLy8gSGFuZGxlIHRoZSBzaW1wbGVzdCBjYXNlIGVmZmljaWVudGx5LgorICBpZiAoSyA9PSAxKQorICAgIHJldHVybiBTRS5nZXRUcnVuY2F0ZU9yWmVyb0V4dGVuZChJdCwgUmVzdWx0VHkpOworCisgIC8vIFdlIGFyZSB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGEgZm9yIEJDKEl0LCBLKToKKyAgLy8KKyAgLy8gICBCQyhJdCwgSykgPSAoSXQgKiAoSXQgLSAxKSAqIC4uLiAqIChJdCAtIEsgKyAxKSkgLyBLIQorICAvLworICAvLyBTdXBwb3NlLCBXIGlzIHRoZSBiaXR3aWR0aCBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgV2UgbXVzdCBiZSBwcmVwYXJlZCBmb3IKKyAgLy8gb3ZlcmZsb3cuICBIZW5jZSwgd2UgbXVzdCBhc3N1cmUgdGhhdCB0aGUgcmVzdWx0IG9mIG91ciBjb21wdXRhdGlvbiBpcworICAvLyBlcXVhbCB0byB0aGUgYWNjdXJhdGUgb25lIG1vZHVsbyAyXlcuICBVbmZvcnR1bmF0ZWx5LCBkaXZpc2lvbiBpc24ndAorICAvLyBzYWZlIGluIG1vZHVsYXIgYXJpdGhtZXRpYy4KKyAgLy8KKyAgLy8gSG93ZXZlciwgdGhpcyBjb2RlIGRvZXNuJ3QgdXNlIGV4YWN0bHkgdGhhdCBmb3JtdWxhOyB0aGUgZm9ybXVsYSBpdCB1c2VzCisgIC8vIGlzIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcsIHdoZXJlIFQgaXMgdGhlIG51bWJlciBvZiBmYWN0b3JzIG9mIDIgaW4KKyAgLy8gSyEgKGkuZS4gdHJhaWxpbmcgemVyb3MgaW4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBLISksIGFuZCBeIGlzCisgIC8vIGV4cG9uZW50aWF0aW9uOgorICAvLworICAvLyAgIEJDKEl0LCBLKSA9IChJdCAqIChJdCAtIDEpICogLi4uICogKEl0IC0gSyArIDEpKSAvIDJeVCAvIChLISAvIDJeVCkKKyAgLy8KKyAgLy8gVGhpcyBmb3JtdWxhIGlzIHRyaXZpYWxseSBlcXVpdmFsZW50IHRvIHRoZSBwcmV2aW91cyBmb3JtdWxhLiAgSG93ZXZlciwKKyAgLy8gdGhpcyBmb3JtdWxhIGNhbiBiZSBpbXBsZW1lbnRlZCBtdWNoIG1vcmUgZWZmaWNpZW50bHkuICBUaGUgdHJpY2sgaXMgdGhhdAorICAvLyBLISAvIDJeVCBpcyBvZGQsIGFuZCBleGFjdCBkaXZpc2lvbiBieSBhbiBvZGQgbnVtYmVyICppcyogc2FmZSBpbiBtb2R1bGFyCisgIC8vIGFyaXRobWV0aWMuICBUbyBkbyBleGFjdCBkaXZpc2lvbiBpbiBtb2R1bGFyIGFyaXRobWV0aWMsIGFsbCB3ZSBoYXZlCisgIC8vIHRvIGRvIGlzIG11bHRpcGx5IGJ5IHRoZSBpbnZlcnNlLiAgVGhlcmVmb3JlLCB0aGlzIHN0ZXAgY2FuIGJlIGRvbmUgYXQKKyAgLy8gd2lkdGggVy4KKyAgLy8KKyAgLy8gVGhlIG5leHQgaXNzdWUgaXMgaG93IHRvIHNhZmVseSBkbyB0aGUgZGl2aXNpb24gYnkgMl5ULiAgVGhlIHdheSB0aGlzCisgIC8vIGlzIGRvbmUgaXMgYnkgZG9pbmcgdGhlIG11bHRpcGxpY2F0aW9uIHN0ZXAgYXQgYSB3aWR0aCBvZiBhdCBsZWFzdCBXICsgVAorICAvLyBiaXRzLiAgVGhpcyB3YXksIHRoZSBib3R0b20gVytUIGJpdHMgb2YgdGhlIHByb2R1Y3QgYXJlIGFjY3VyYXRlLiBUaGVuLAorICAvLyB3aGVuIHdlIHBlcmZvcm0gdGhlIGRpdmlzaW9uIGJ5IDJeVCAod2hpY2ggaXMgZXF1aXZhbGVudCB0byBhIHJpZ2h0IHNoaWZ0CisgIC8vIGJ5IFQpLCB0aGUgYm90dG9tIFcgYml0cyBhcmUgYWNjdXJhdGUuICBFeHRyYSBiaXRzIGFyZSBva2F5OyB0aGV5J2xsIGdldAorICAvLyB0cnVuY2F0ZWQgb3V0IGFmdGVyIHRoZSBkaXZpc2lvbiBieSAyXlQuCisgIC8vCisgIC8vIEluIGNvbXBhcmlzb24gdG8ganVzdCBkaXJlY3RseSB1c2luZyB0aGUgZmlyc3QgZm9ybXVsYSwgdGhpcyB0ZWNobmlxdWUKKyAgLy8gaXMgbXVjaCBtb3JlIGVmZmljaWVudDsgdXNpbmcgdGhlIGZpcnN0IGZvcm11bGEgcmVxdWlyZXMgVyAqIEsgYml0cywKKyAgLy8gYnV0IHRoaXMgZm9ybXVsYSBsZXNzIHRoYW4gVyArIEsgYml0cy4gQWxzbywgdGhlIGZpcnN0IGZvcm11bGEgcmVxdWlyZXMKKyAgLy8gYSBkaXZpc2lvbiBzdGVwLCB3aGVyZWFzIHRoaXMgZm9ybXVsYSBvbmx5IHJlcXVpcmVzIG11bHRpcGxpZXMgYW5kIHNoaWZ0cy4KKyAgLy8KKyAgLy8gSXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgc3VidHJhY3Rpb24gc3RlcCBpcyBkb25lIGluIHRoZSBjYWxjdWxhdGlvbgorICAvLyB3aWR0aCBvciB0aGUgaW5wdXQgaXRlcmF0aW9uIGNvdW50J3Mgd2lkdGg7IGlmIHRoZSBzdWJ0cmFjdGlvbiBvdmVyZmxvd3MsCisgIC8vIHRoZSByZXN1bHQgbXVzdCBiZSB6ZXJvIGFueXdheS4gIFdlIHByZWZlciBoZXJlIHRvIGRvIGl0IGluIHRoZSB3aWR0aCBvZgorICAvLyB0aGUgaW5kdWN0aW9uIHZhcmlhYmxlIGJlY2F1c2UgaXQgaGVscHMgYSBsb3QgZm9yIGNlcnRhaW4gY2FzZXM7IENvZGVHZW4KKyAgLy8gaXNuJ3Qgc21hcnQgZW5vdWdoIHRvIGlnbm9yZSB0aGUgb3ZlcmZsb3csIHdoaWNoIGxlYWRzIHRvIG11Y2ggbGVzcworICAvLyBlZmZpY2llbnQgY29kZSBpZiB0aGUgd2lkdGggb2YgdGhlIHN1YnRyYWN0aW9uIGlzIHdpZGVyIHRoYW4gdGhlIG5hdGl2ZQorICAvLyByZWdpc3RlciB3aWR0aC4KKyAgLy8KKyAgLy8gKEl0J3MgcG9zc2libGUgdG8gbm90IHdpZGVuIGF0IGFsbCBieSBwdWxsaW5nIG91dCBmYWN0b3JzIG9mIDIgYmVmb3JlCisgIC8vIHRoZSBtdWx0aXBsaWNhdGlvbjsgZm9yIGV4YW1wbGUsIEs9MiBjYW4gYmUgY2FsY3VsYXRlZCBhcworICAvLyBJdC8yKihJdCsoSXQqSU5UX01JTi9JTlRfTUlOKSstMSkuIEhvd2V2ZXIsIGl0IHJlcXVpcmVzCisgIC8vIGV4dHJhIGFyaXRobWV0aWMsIHNvIGl0J3Mgbm90IGFuIG9idmlvdXMgd2luLCBhbmQgaXQgZ2V0cworICAvLyBtdWNoIG1vcmUgY29tcGxpY2F0ZWQgZm9yIEsgPiAzLikKKworICAvLyBQcm90ZWN0aW9uIGZyb20gaW5zYW5lIFNDRVZzOyB0aGlzIGJvdW5kIGlzIGNvbnNlcnZhdGl2ZSwKKyAgLy8gYnV0IGl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyLgorICBpZiAoSyA+IDEwMDApCisgICAgcmV0dXJuIFNFLmdldENvdWxkTm90Q29tcHV0ZSgpOworCisgIHVuc2lnbmVkIFcgPSBTRS5nZXRUeXBlU2l6ZUluQml0cyhSZXN1bHRUeSk7CisKKyAgLy8gQ2FsY3VsYXRlIEshIC8gMl5UIGFuZCBUOyB3ZSBkaXZpZGUgb3V0IHRoZSBmYWN0b3JzIG9mIHR3byBiZWZvcmUKKyAgLy8gbXVsdGlwbHlpbmcgZm9yIGNhbGN1bGF0aW5nIEshIC8gMl5UIHRvIGF2b2lkIG92ZXJmbG93LgorICAvLyBPdGhlciBvdmVyZmxvdyBkb2Vzbid0IG1hdHRlciBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgYm90dG9tCisgIC8vIFcgYml0cyBvZiB0aGUgcmVzdWx0LgorICBBUEludCBPZGRGYWN0b3JpYWwoVywgMSk7CisgIHVuc2lnbmVkIFQgPSAxOworICBmb3IgKHVuc2lnbmVkIGkgPSAzOyBpIDw9IEs7ICsraSkgeworICAgIEFQSW50IE11bHQoVywgaSk7CisgICAgdW5zaWduZWQgVHdvRmFjdG9ycyA9IE11bHQuY291bnRUcmFpbGluZ1plcm9zKCk7CisgICAgVCArPSBUd29GYWN0b3JzOworICAgIE11bHQgPSBNdWx0LmxzaHIoVHdvRmFjdG9ycyk7CisgICAgT2RkRmFjdG9yaWFsICo9IE11bHQ7CisgIH0KKworICAvLyBXZSBuZWVkIGF0IGxlYXN0IFcgKyBUIGJpdHMgZm9yIHRoZSBtdWx0aXBsaWNhdGlvbiBzdGVwCisgIHVuc2lnbmVkIENhbGN1bGF0aW9uQml0cyA9IFcgKyBUOworCisgIC8vIENhbGN1bGF0ZSAyXlQsIGF0IHdpZHRoIFQrVy4KKyAgQVBJbnQgRGl2RmFjdG9yID0gQVBJbnQoQ2FsY3VsYXRpb25CaXRzLCAxKS5zaGwoVCk7CisKKyAgLy8gQ2FsY3VsYXRlIHRoZSBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIEshIC8gMl5UOworICAvLyB0aGlzIG11bHRpcGxpY2F0aW9uIGZhY3RvciB3aWxsIHBlcmZvcm0gdGhlIGV4YWN0IGRpdmlzaW9uIGJ5CisgIC8vIEshIC8gMl5ULgorICBBUEludCBNb2QgPSBBUEludDo6Z2V0U2lnbmVkTWluVmFsdWUoVysxKTsKKyAgQVBJbnQgTXVsdGlwbHlGYWN0b3IgPSBPZGRGYWN0b3JpYWwuemV4dChXKzEpOworICBNdWx0aXBseUZhY3RvciA9IE11bHRpcGx5RmFjdG9yLm11bHRpcGxpY2F0aXZlSW52ZXJzZShNb2QpOworICBNdWx0aXBseUZhY3RvciA9IE11bHRpcGx5RmFjdG9yLnRydW5jKFcpOworCisgIC8vIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCwgYXQgd2lkdGggVCtXCisgIGNvbnN0IEludGVnZXJUeXBlICpDYWxjdWxhdGlvblR5ID0gSW50ZWdlclR5cGU6OmdldChTRS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGlvbkJpdHMpOworICBjb25zdCBTQ0VWICpEaXZpZGVuZCA9IFNFLmdldFRydW5jYXRlT3JaZXJvRXh0ZW5kKEl0LCBDYWxjdWxhdGlvblR5KTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBLOyArK2kpIHsKKyAgICBjb25zdCBTQ0VWICpTID0gU0UuZ2V0TWludXNTQ0VWKEl0LCBTRS5nZXRDb25zdGFudChJdC0+Z2V0VHlwZSgpLCBpKSk7CisgICAgRGl2aWRlbmQgPSBTRS5nZXRNdWxFeHByKERpdmlkZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRS5nZXRUcnVuY2F0ZU9yWmVyb0V4dGVuZChTLCBDYWxjdWxhdGlvblR5KSk7CisgIH0KKworICAvLyBEaXZpZGUgYnkgMl5UCisgIGNvbnN0IFNDRVYgKkRpdlJlc3VsdCA9IFNFLmdldFVEaXZFeHByKERpdmlkZW5kLCBTRS5nZXRDb25zdGFudChEaXZGYWN0b3IpKTsKKworICAvLyBUcnVuY2F0ZSB0aGUgcmVzdWx0LCBhbmQgZGl2aWRlIGJ5IEshIC8gMl5ULgorCisgIHJldHVybiBTRS5nZXRNdWxFeHByKFNFLmdldENvbnN0YW50KE11bHRpcGx5RmFjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU0UuZ2V0VHJ1bmNhdGVPclplcm9FeHRlbmQoRGl2UmVzdWx0LCBSZXN1bHRUeSkpOworfQorCisvLy8gZXZhbHVhdGVBdEl0ZXJhdGlvbiAtIFJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBjaGFpbiBvZiByZWN1cnJlbmNlcyBhdAorLy8vIHRoZSBzcGVjaWZpZWQgaXRlcmF0aW9uIG51bWJlci4gIFdlIGNhbiBldmFsdWF0ZSB0aGlzIHJlY3VycmVuY2UgYnkKKy8vLyBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgaW4gdGhlIGNoYWluIGJ5IHRoZSBiaW5vbWlhbCBjb2VmZmljaWVudAorLy8vIGNvcnJlc3BvbmRpbmcgdG8gaXQuICBJbiBvdGhlciB3b3Jkcywgd2UgY2FuIGV2YWx1YXRlIHtBLCssQiwrLEMsKyxEfSBhczoKKy8vLworLy8vICAgQSpCQyhJdCwgMCkgKyBCKkJDKEl0LCAxKSArIEMqQkMoSXQsIDIpICsgRCpCQyhJdCwgMykKKy8vLworLy8vIHdoZXJlIEJDKEl0LCBrKSBzdGFuZHMgZm9yIGJpbm9taWFsIGNvZWZmaWNpZW50LgorLy8vCitjb25zdCBTQ0VWICpTQ0VWQWRkUmVjRXhwcjo6ZXZhbHVhdGVBdEl0ZXJhdGlvbihjb25zdCBTQ0VWICpJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UpIGNvbnN0IHsKKyAgY29uc3QgU0NFViAqUmVzdWx0ID0gZ2V0U3RhcnQoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gVGhlIGNvbXB1dGF0aW9uIGlzIGNvcnJlY3QgaW4gdGhlIGZhY2Ugb2Ygb3ZlcmZsb3cgcHJvdmlkZWQgdGhhdCB0aGUKKyAgICAvLyBtdWx0aXBsaWNhdGlvbiBpcyBwZXJmb3JtZWQgX2FmdGVyXyB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgYmlub21pYWwKKyAgICAvLyBjb2VmZmljaWVudC4KKyAgICBjb25zdCBTQ0VWICpDb2VmZiA9IEJpbm9taWFsQ29lZmZpY2llbnQoSXQsIGksIFNFLCBnZXRUeXBlKCkpOworICAgIGlmIChpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oQ29lZmYpKQorICAgICAgcmV0dXJuIENvZWZmOworCisgICAgUmVzdWx0ID0gU0UuZ2V0QWRkRXhwcihSZXN1bHQsIFNFLmdldE11bEV4cHIoZ2V0T3BlcmFuZChpKSwgQ29lZmYpKTsKKyAgfQorICByZXR1cm4gUmVzdWx0OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgIFNDRVYgRXhwcmVzc2lvbiBmb2xkZXIgaW1wbGVtZW50YXRpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldFRydW5jYXRlRXhwcihjb25zdCBTQ0VWICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIGFzc2VydChnZXRUeXBlU2l6ZUluQml0cyhPcC0+Z2V0VHlwZSgpKSA+IGdldFR5cGVTaXplSW5CaXRzKFR5KSAmJgorICAgICAgICAgIlRoaXMgaXMgbm90IGEgdHJ1bmNhdGluZyBjb252ZXJzaW9uISIpOworICBhc3NlcnQoaXNTQ0VWYWJsZShUeSkgJiYKKyAgICAgICAgICJUaGlzIGlzIG5vdCBhIGNvbnZlcnNpb24gdG8gYSBTQ0VWYWJsZSB0eXBlISIpOworICBUeSA9IGdldEVmZmVjdGl2ZVNDRVZUeXBlKFR5KTsKKworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBJRC5BZGRJbnRlZ2VyKHNjVHJ1bmNhdGUpOworICBJRC5BZGRQb2ludGVyKE9wKTsKKyAgSUQuQWRkUG9pbnRlcihUeSk7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKGNvbnN0IFNDRVYgKlMgPSBVbmlxdWVTQ0VWcy5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpIHJldHVybiBTOworCisgIC8vIEZvbGQgaWYgdGhlIG9wZXJhbmQgaXMgY29uc3RhbnQuCisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKlNDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihPcCkpCisgICAgcmV0dXJuIGdldENvbnN0YW50KAorICAgICAgY2FzdDxDb25zdGFudEludD4oQ29uc3RhbnRFeHByOjpnZXRUcnVuYyhTQy0+Z2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWZmZWN0aXZlU0NFVlR5cGUoVHkpKSkpOworCisgIC8vIHRydW5jKHRydW5jKHgpKSAtLT4gdHJ1bmMoeCkKKyAgaWYgKGNvbnN0IFNDRVZUcnVuY2F0ZUV4cHIgKlNUID0gZHluX2Nhc3Q8U0NFVlRydW5jYXRlRXhwcj4oT3ApKQorICAgIHJldHVybiBnZXRUcnVuY2F0ZUV4cHIoU1QtPmdldE9wZXJhbmQoKSwgVHkpOworCisgIC8vIHRydW5jKHNleHQoeCkpIC0tPiBzZXh0KHgpIGlmIHdpZGVuaW5nIG9yIHRydW5jKHgpIGlmIG5hcnJvd2luZworICBpZiAoY29uc3QgU0NFVlNpZ25FeHRlbmRFeHByICpTUyA9IGR5bl9jYXN0PFNDRVZTaWduRXh0ZW5kRXhwcj4oT3ApKQorICAgIHJldHVybiBnZXRUcnVuY2F0ZU9yU2lnbkV4dGVuZChTUy0+Z2V0T3BlcmFuZCgpLCBUeSk7CisKKyAgLy8gdHJ1bmMoemV4dCh4KSkgLS0+IHpleHQoeCkgaWYgd2lkZW5pbmcgb3IgdHJ1bmMoeCkgaWYgbmFycm93aW5nCisgIGlmIChjb25zdCBTQ0VWWmVyb0V4dGVuZEV4cHIgKlNaID0gZHluX2Nhc3Q8U0NFVlplcm9FeHRlbmRFeHByPihPcCkpCisgICAgcmV0dXJuIGdldFRydW5jYXRlT3JaZXJvRXh0ZW5kKFNaLT5nZXRPcGVyYW5kKCksIFR5KTsKKworICAvLyBJZiB0aGUgaW5wdXQgdmFsdWUgaXMgYSBjaHJlYyBzY2V2LCB0cnVuY2F0ZSB0aGUgY2hyZWMncyBvcGVyYW5kcy4KKyAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBZGRSZWMgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oT3ApKSB7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiBPcGVyYW5kczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQWRkUmVjLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhnZXRUcnVuY2F0ZUV4cHIoQWRkUmVjLT5nZXRPcGVyYW5kKGkpLCBUeSkpOworICAgIHJldHVybiBnZXRBZGRSZWNFeHByKE9wZXJhbmRzLCBBZGRSZWMtPmdldExvb3AoKSk7CisgIH0KKworICAvLyBBcyBhIHNwZWNpYWwgY2FzZSwgZm9sZCB0cnVuYyh1bmRlZikgdG8gdW5kZWYuIFdlIGRvbid0IHdhbnQgdG8KKyAgLy8ga25vdyB0b28gbXVjaCBhYm91dCBTQ0VWVW5rbm93bnMsIGJ1dCB0aGlzIHNwZWNpYWwgY2FzZSBpcyBoYW5keQorICAvLyBhbmQgaGFybWxlc3MuCisgIGlmIChjb25zdCBTQ0VWVW5rbm93biAqVSA9IGR5bl9jYXN0PFNDRVZVbmtub3duPihPcCkpCisgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihVLT5nZXRWYWx1ZSgpKSkKKyAgICAgIHJldHVybiBnZXRTQ0VWKFVuZGVmVmFsdWU6OmdldChUeSkpOworCisgIC8vIFRoZSBjYXN0IHdhc24ndCBmb2xkZWQ7IGNyZWF0ZSBhbiBleHBsaWNpdCBjYXN0IG5vZGUuIFdlIGNhbiByZXVzZQorICAvLyB0aGUgZXhpc3RpbmcgaW5zZXJ0IHBvc2l0aW9uIHNpbmNlIGlmIHdlIGdldCBoZXJlLCB3ZSB3b24ndCBoYXZlCisgIC8vIG1hZGUgYW55IGNoYW5nZXMgd2hpY2ggd291bGQgaW52YWxpZGF0ZSBpdC4KKyAgU0NFViAqUyA9IG5ldyAoU0NFVkFsbG9jYXRvcikgU0NFVlRydW5jYXRlRXhwcihJRC5JbnRlcm4oU0NFVkFsbG9jYXRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AsIFR5KTsKKyAgVW5pcXVlU0NFVnMuSW5zZXJ0Tm9kZShTLCBJUCk7CisgIHJldHVybiBTOworfQorCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldFplcm9FeHRlbmRFeHByKGNvbnN0IFNDRVYgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBhc3NlcnQoZ2V0VHlwZVNpemVJbkJpdHMoT3AtPmdldFR5cGUoKSkgPCBnZXRUeXBlU2l6ZUluQml0cyhUeSkgJiYKKyAgICAgICAgICJUaGlzIGlzIG5vdCBhbiBleHRlbmRpbmcgY29udmVyc2lvbiEiKTsKKyAgYXNzZXJ0KGlzU0NFVmFibGUoVHkpICYmCisgICAgICAgICAiVGhpcyBpcyBub3QgYSBjb252ZXJzaW9uIHRvIGEgU0NFVmFibGUgdHlwZSEiKTsKKyAgVHkgPSBnZXRFZmZlY3RpdmVTQ0VWVHlwZShUeSk7CisKKyAgLy8gRm9sZCBpZiB0aGUgb3BlcmFuZCBpcyBjb25zdGFudC4KKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqU0MgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KE9wKSkKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoCisgICAgICBjYXN0PENvbnN0YW50SW50PihDb25zdGFudEV4cHI6OmdldFpFeHQoU0MtPmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWZmZWN0aXZlU0NFVlR5cGUoVHkpKSkpOworCisgIC8vIHpleHQoemV4dCh4KSkgLS0+IHpleHQoeCkKKyAgaWYgKGNvbnN0IFNDRVZaZXJvRXh0ZW5kRXhwciAqU1ogPSBkeW5fY2FzdDxTQ0VWWmVyb0V4dGVuZEV4cHI+KE9wKSkKKyAgICByZXR1cm4gZ2V0WmVyb0V4dGVuZEV4cHIoU1otPmdldE9wZXJhbmQoKSwgVHkpOworCisgIC8vIEJlZm9yZSBkb2luZyBhbnkgZXhwZW5zaXZlIGFuYWx5c2lzLCBjaGVjayB0byBzZWUgaWYgd2UndmUgYWxyZWFkeQorICAvLyBjb21wdXRlZCBhIFNDRVYgZm9yIHRoaXMgT3AgYW5kIFR5LgorICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBJRC5BZGRJbnRlZ2VyKHNjWmVyb0V4dGVuZCk7CisgIElELkFkZFBvaW50ZXIoT3ApOworICBJRC5BZGRQb2ludGVyKFR5KTsKKyAgdm9pZCAqSVAgPSAwOworICBpZiAoY29uc3QgU0NFViAqUyA9IFVuaXF1ZVNDRVZzLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkgcmV0dXJuIFM7CisKKyAgLy8gSWYgdGhlIGlucHV0IHZhbHVlIGlzIGEgY2hyZWMgc2NldiwgYW5kIHdlIGNhbiBwcm92ZSB0aGF0IHRoZSB2YWx1ZQorICAvLyBkaWQgbm90IG92ZXJmbG93IHRoZSBvbGQsIHNtYWxsZXIsIHZhbHVlLCB3ZSBjYW4gemVybyBleHRlbmQgYWxsIG9mIHRoZQorICAvLyBvcGVyYW5kcyAob2Z0ZW4gY29uc3RhbnRzKS4gIFRoaXMgYWxsb3dzIGFuYWx5c2lzIG9mIHNvbWV0aGluZyBsaWtlCisgIC8vIHRoaXM6ICBmb3IgKHVuc2lnbmVkIGNoYXIgWCA9IDA7IFggPCAxMDA7ICsrWCkgeyBpbnQgWSA9IFg7IH0KKyAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihPcCkpCisgICAgaWYgKEFSLT5pc0FmZmluZSgpKSB7CisgICAgICBjb25zdCBTQ0VWICpTdGFydCA9IEFSLT5nZXRTdGFydCgpOworICAgICAgY29uc3QgU0NFViAqU3RlcCA9IEFSLT5nZXRTdGVwUmVjdXJyZW5jZSgqdGhpcyk7CisgICAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IGdldFR5cGVTaXplSW5CaXRzKEFSLT5nZXRUeXBlKCkpOworICAgICAgY29uc3QgTG9vcCAqTCA9IEFSLT5nZXRMb29wKCk7CisKKyAgICAgIC8vIElmIHdlIGhhdmUgc3BlY2lhbCBrbm93bGVkZ2UgdGhhdCB0aGlzIGFkZHJlYyB3b24ndCBvdmVyZmxvdywKKyAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IGZ1cnRoZXIgYW5hbHlzaXMuCisgICAgICBpZiAoQVItPmhhc05vVW5zaWduZWRXcmFwKCkpCisgICAgICAgIHJldHVybiBnZXRBZGRSZWNFeHByKGdldFplcm9FeHRlbmRFeHByKFN0YXJ0LCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFplcm9FeHRlbmRFeHByKFN0ZXAsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCk7CisKKyAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGJhY2tlZGdlLXRha2VuIGNvdW50IGlzIFNDRVZDb3VsZE5vdENvbXB1dGUuCisgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBzZXJ2ZXMgdHdvIHB1cnBvc2VzOiBJdCBmaWx0ZXJzIG91dCBsb29wcyB0aGF0IGFyZQorICAgICAgLy8gc2ltcGx5IG5vdCBhbmFseXphYmxlLCBhbmQgaXQgY292ZXJzIHRoZSBjYXNlIHdoZXJlIHRoaXMgY29kZSBpcworICAgICAgLy8gYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGJhY2tlZGdlLXRha2VuIGNvdW50IGFuYWx5c2lzLCBzdWNoIHRoYXQKKyAgICAgIC8vIGF0dGVtcHRpbmcgdG8gYXNrIGZvciB0aGUgYmFja2VkZ2UtdGFrZW4gY291bnQgd291bGQgbGlrZWx5IHJlc3VsdAorICAgICAgLy8gaW4gaW5maW5pdGUgcmVjdXJzaW9uLiBJbiB0aGUgbGF0ZXIgY2FzZSwgdGhlIGFuYWx5c2lzIGNvZGUgd2lsbAorICAgICAgLy8gY29wZSB3aXRoIGEgY29uc2VydmF0aXZlIHZhbHVlLCBhbmQgaXQgd2lsbCB0YWtlIGNhcmUgdG8gcHVyZ2UKKyAgICAgIC8vIHRoYXQgdmFsdWUgb25jZSBpdCBoYXMgZmluaXNoZWQuCisgICAgICBjb25zdCBTQ0VWICpNYXhCRUNvdW50ID0gZ2V0TWF4QmFja2VkZ2VUYWtlbkNvdW50KEwpOworICAgICAgaWYgKCFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oTWF4QkVDb3VudCkpIHsKKyAgICAgICAgLy8gTWFudWFsbHkgY29tcHV0ZSB0aGUgZmluYWwgdmFsdWUgZm9yIEFSLCBjaGVja2luZyBmb3IKKyAgICAgICAgLy8gb3ZlcmZsb3cuCisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYmFja2VkZ2UtdGFrZW4gY291bnQgY2FuIGJlIGxvc3NsZXNzbHkgY2FzdGVkIHRvCisgICAgICAgIC8vIHRoZSBhZGRyZWMncyB0eXBlLiBUaGUgY291bnQgaXMgYWx3YXlzIHVuc2lnbmVkLgorICAgICAgICBjb25zdCBTQ0VWICpDYXN0ZWRNYXhCRUNvdW50ID0KKyAgICAgICAgICBnZXRUcnVuY2F0ZU9yWmVyb0V4dGVuZChNYXhCRUNvdW50LCBTdGFydC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgY29uc3QgU0NFViAqUmVjYXN0ZWRNYXhCRUNvdW50ID0KKyAgICAgICAgICBnZXRUcnVuY2F0ZU9yWmVyb0V4dGVuZChDYXN0ZWRNYXhCRUNvdW50LCBNYXhCRUNvdW50LT5nZXRUeXBlKCkpOworICAgICAgICBpZiAoTWF4QkVDb3VudCA9PSBSZWNhc3RlZE1heEJFQ291bnQpIHsKKyAgICAgICAgICBjb25zdCBUeXBlICpXaWRlVHkgPSBJbnRlZ2VyVHlwZTo6Z2V0KGdldENvbnRleHQoKSwgQml0V2lkdGggKiAyKTsKKyAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIFN0YXJ0K1N0ZXAqTWF4QkVDb3VudCBoYXMgbm8gdW5zaWduZWQgb3ZlcmZsb3cuCisgICAgICAgICAgY29uc3QgU0NFViAqWk11bCA9IGdldE11bEV4cHIoQ2FzdGVkTWF4QkVDb3VudCwgU3RlcCk7CisgICAgICAgICAgY29uc3QgU0NFViAqQWRkID0gZ2V0QWRkRXhwcihTdGFydCwgWk11bCk7CisgICAgICAgICAgY29uc3QgU0NFViAqT3BlcmFuZEV4dGVuZGVkQWRkID0KKyAgICAgICAgICAgIGdldEFkZEV4cHIoZ2V0WmVyb0V4dGVuZEV4cHIoU3RhcnQsIFdpZGVUeSksCisgICAgICAgICAgICAgICAgICAgICAgIGdldE11bEV4cHIoZ2V0WmVyb0V4dGVuZEV4cHIoQ2FzdGVkTWF4QkVDb3VudCwgV2lkZVR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRaZXJvRXh0ZW5kRXhwcihTdGVwLCBXaWRlVHkpKSk7CisgICAgICAgICAgaWYgKGdldFplcm9FeHRlbmRFeHByKEFkZCwgV2lkZVR5KSA9PSBPcGVyYW5kRXh0ZW5kZWRBZGQpCisgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGV4cHJlc3Npb24gd2l0aCB0aGUgYWRkcmVjIG9uIHRoZSBvdXRzaWRlLgorICAgICAgICAgICAgcmV0dXJuIGdldEFkZFJlY0V4cHIoZ2V0WmVyb0V4dGVuZEV4cHIoU3RhcnQsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFplcm9FeHRlbmRFeHByKFN0ZXAsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwpOworCisgICAgICAgICAgLy8gU2ltaWxhciB0byBhYm92ZSwgb25seSB0aGlzIHRpbWUgdHJlYXQgdGhlIHN0ZXAgdmFsdWUgYXMgc2lnbmVkLgorICAgICAgICAgIC8vIFRoaXMgY292ZXJzIGxvb3BzIHRoYXQgY291bnQgZG93bi4KKyAgICAgICAgICBjb25zdCBTQ0VWICpTTXVsID0gZ2V0TXVsRXhwcihDYXN0ZWRNYXhCRUNvdW50LCBTdGVwKTsKKyAgICAgICAgICBBZGQgPSBnZXRBZGRFeHByKFN0YXJ0LCBTTXVsKTsKKyAgICAgICAgICBPcGVyYW5kRXh0ZW5kZWRBZGQgPQorICAgICAgICAgICAgZ2V0QWRkRXhwcihnZXRaZXJvRXh0ZW5kRXhwcihTdGFydCwgV2lkZVR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0TXVsRXhwcihnZXRaZXJvRXh0ZW5kRXhwcihDYXN0ZWRNYXhCRUNvdW50LCBXaWRlVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNpZ25FeHRlbmRFeHByKFN0ZXAsIFdpZGVUeSkpKTsKKyAgICAgICAgICBpZiAoZ2V0WmVyb0V4dGVuZEV4cHIoQWRkLCBXaWRlVHkpID09IE9wZXJhbmRFeHRlbmRlZEFkZCkKKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZXhwcmVzc2lvbiB3aXRoIHRoZSBhZGRyZWMgb24gdGhlIG91dHNpZGUuCisgICAgICAgICAgICByZXR1cm4gZ2V0QWRkUmVjRXhwcihnZXRaZXJvRXh0ZW5kRXhwcihTdGFydCwgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbkV4dGVuZEV4cHIoU3RlcCwgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgYmFja2VkZ2UgaXMgZ3VhcmRlZCBieSBhIGNvbXBhcmlzb24gd2l0aCB0aGUgcHJlLWluYyB2YWx1ZQorICAgICAgICAvLyB0aGUgYWRkcmVjIGlzIHNhZmUuIEFsc28sIGlmIHRoZSBlbnRyeSBpcyBndWFyZGVkIGJ5IGEgY29tcGFyaXNvbgorICAgICAgICAvLyB3aXRoIHRoZSBzdGFydCB2YWx1ZSBhbmQgdGhlIGJhY2tlZGdlIGlzIGd1YXJkZWQgYnkgYSBjb21wYXJpc29uCisgICAgICAgIC8vIHdpdGggdGhlIHBvc3QtaW5jIHZhbHVlLCB0aGUgYWRkcmVjIGlzIHNhZmUuCisgICAgICAgIGlmIChpc0tub3duUG9zaXRpdmUoU3RlcCkpIHsKKyAgICAgICAgICBjb25zdCBTQ0VWICpOID0gZ2V0Q29uc3RhbnQoQVBJbnQ6OmdldE1pblZhbHVlKEJpdFdpZHRoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVuc2lnbmVkUmFuZ2UoU3RlcCkuZ2V0VW5zaWduZWRNYXgoKSk7CisgICAgICAgICAgaWYgKGlzTG9vcEJhY2tlZGdlR3VhcmRlZEJ5Q29uZChMLCBJQ21wSW5zdDo6SUNNUF9VTFQsIEFSLCBOKSB8fAorICAgICAgICAgICAgICAoaXNMb29wRW50cnlHdWFyZGVkQnlDb25kKEwsIElDbXBJbnN0OjpJQ01QX1VMVCwgU3RhcnQsIE4pICYmCisgICAgICAgICAgICAgICBpc0xvb3BCYWNrZWRnZUd1YXJkZWRCeUNvbmQoTCwgSUNtcEluc3Q6OklDTVBfVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSLT5nZXRQb3N0SW5jRXhwcigqdGhpcyksIE4pKSkKKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZXhwcmVzc2lvbiB3aXRoIHRoZSBhZGRyZWMgb24gdGhlIG91dHNpZGUuCisgICAgICAgICAgICByZXR1cm4gZ2V0QWRkUmVjRXhwcihnZXRaZXJvRXh0ZW5kRXhwcihTdGFydCwgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0WmVyb0V4dGVuZEV4cHIoU3RlcCwgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNLbm93bk5lZ2F0aXZlKFN0ZXApKSB7CisgICAgICAgICAgY29uc3QgU0NFViAqTiA9IGdldENvbnN0YW50KEFQSW50OjpnZXRNYXhWYWx1ZShCaXRXaWR0aCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaWduZWRSYW5nZShTdGVwKS5nZXRTaWduZWRNaW4oKSk7CisgICAgICAgICAgaWYgKGlzTG9vcEJhY2tlZGdlR3VhcmRlZEJ5Q29uZChMLCBJQ21wSW5zdDo6SUNNUF9VR1QsIEFSLCBOKSB8fAorICAgICAgICAgICAgICAoaXNMb29wRW50cnlHdWFyZGVkQnlDb25kKEwsIElDbXBJbnN0OjpJQ01QX1VHVCwgU3RhcnQsIE4pICYmCisgICAgICAgICAgICAgICBpc0xvb3BCYWNrZWRnZUd1YXJkZWRCeUNvbmQoTCwgSUNtcEluc3Q6OklDTVBfVUdULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSLT5nZXRQb3N0SW5jRXhwcigqdGhpcyksIE4pKSkKKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZXhwcmVzc2lvbiB3aXRoIHRoZSBhZGRyZWMgb24gdGhlIG91dHNpZGUuCisgICAgICAgICAgICByZXR1cm4gZ2V0QWRkUmVjRXhwcihnZXRaZXJvRXh0ZW5kRXhwcihTdGFydCwgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbkV4dGVuZEV4cHIoU3RlcCwgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgLy8gVGhlIGNhc3Qgd2Fzbid0IGZvbGRlZDsgY3JlYXRlIGFuIGV4cGxpY2l0IGNhc3Qgbm9kZS4KKyAgLy8gUmVjb21wdXRlIHRoZSBpbnNlcnQgcG9zaXRpb24sIGFzIGl0IG1heSBoYXZlIGJlZW4gaW52YWxpZGF0ZWQuCisgIGlmIChjb25zdCBTQ0VWICpTID0gVW5pcXVlU0NFVnMuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKSByZXR1cm4gUzsKKyAgU0NFViAqUyA9IG5ldyAoU0NFVkFsbG9jYXRvcikgU0NFVlplcm9FeHRlbmRFeHByKElELkludGVybihTQ0VWQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLCBUeSk7CisgIFVuaXF1ZVNDRVZzLkluc2VydE5vZGUoUywgSVApOworICByZXR1cm4gUzsKK30KKworY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRTaWduRXh0ZW5kRXhwcihjb25zdCBTQ0VWICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgYXNzZXJ0KGdldFR5cGVTaXplSW5CaXRzKE9wLT5nZXRUeXBlKCkpIDwgZ2V0VHlwZVNpemVJbkJpdHMoVHkpICYmCisgICAgICAgICAiVGhpcyBpcyBub3QgYW4gZXh0ZW5kaW5nIGNvbnZlcnNpb24hIik7CisgIGFzc2VydChpc1NDRVZhYmxlKFR5KSAmJgorICAgICAgICAgIlRoaXMgaXMgbm90IGEgY29udmVyc2lvbiB0byBhIFNDRVZhYmxlIHR5cGUhIik7CisgIFR5ID0gZ2V0RWZmZWN0aXZlU0NFVlR5cGUoVHkpOworCisgIC8vIEZvbGQgaWYgdGhlIG9wZXJhbmQgaXMgY29uc3RhbnQuCisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKlNDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihPcCkpCisgICAgcmV0dXJuIGdldENvbnN0YW50KAorICAgICAgY2FzdDxDb25zdGFudEludD4oQ29uc3RhbnRFeHByOjpnZXRTRXh0KFNDLT5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVmZmVjdGl2ZVNDRVZUeXBlKFR5KSkpKTsKKworICAvLyBzZXh0KHNleHQoeCkpIC0tPiBzZXh0KHgpCisgIGlmIChjb25zdCBTQ0VWU2lnbkV4dGVuZEV4cHIgKlNTID0gZHluX2Nhc3Q8U0NFVlNpZ25FeHRlbmRFeHByPihPcCkpCisgICAgcmV0dXJuIGdldFNpZ25FeHRlbmRFeHByKFNTLT5nZXRPcGVyYW5kKCksIFR5KTsKKworICAvLyBCZWZvcmUgZG9pbmcgYW55IGV4cGVuc2l2ZSBhbmFseXNpcywgY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGFscmVhZHkKKyAgLy8gY29tcHV0ZWQgYSBTQ0VWIGZvciB0aGlzIE9wIGFuZCBUeS4KKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgSUQuQWRkSW50ZWdlcihzY1NpZ25FeHRlbmQpOworICBJRC5BZGRQb2ludGVyKE9wKTsKKyAgSUQuQWRkUG9pbnRlcihUeSk7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKGNvbnN0IFNDRVYgKlMgPSBVbmlxdWVTQ0VWcy5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpIHJldHVybiBTOworCisgIC8vIElmIHRoZSBpbnB1dCB2YWx1ZSBpcyBhIGNocmVjIHNjZXYsIGFuZCB3ZSBjYW4gcHJvdmUgdGhhdCB0aGUgdmFsdWUKKyAgLy8gZGlkIG5vdCBvdmVyZmxvdyB0aGUgb2xkLCBzbWFsbGVyLCB2YWx1ZSwgd2UgY2FuIHNpZ24gZXh0ZW5kIGFsbCBvZiB0aGUKKyAgLy8gb3BlcmFuZHMgKG9mdGVuIGNvbnN0YW50cykuICBUaGlzIGFsbG93cyBhbmFseXNpcyBvZiBzb21ldGhpbmcgbGlrZQorICAvLyB0aGlzOiAgZm9yIChzaWduZWQgY2hhciBYID0gMDsgWCA8IDEwMDsgKytYKSB7IGludCBZID0gWDsgfQorICBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KE9wKSkKKyAgICBpZiAoQVItPmlzQWZmaW5lKCkpIHsKKyAgICAgIGNvbnN0IFNDRVYgKlN0YXJ0ID0gQVItPmdldFN0YXJ0KCk7CisgICAgICBjb25zdCBTQ0VWICpTdGVwID0gQVItPmdldFN0ZXBSZWN1cnJlbmNlKCp0aGlzKTsKKyAgICAgIHVuc2lnbmVkIEJpdFdpZHRoID0gZ2V0VHlwZVNpemVJbkJpdHMoQVItPmdldFR5cGUoKSk7CisgICAgICBjb25zdCBMb29wICpMID0gQVItPmdldExvb3AoKTsKKworICAgICAgLy8gSWYgd2UgaGF2ZSBzcGVjaWFsIGtub3dsZWRnZSB0aGF0IHRoaXMgYWRkcmVjIHdvbid0IG92ZXJmbG93LAorICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgZnVydGhlciBhbmFseXNpcy4KKyAgICAgIGlmIChBUi0+aGFzTm9TaWduZWRXcmFwKCkpCisgICAgICAgIHJldHVybiBnZXRBZGRSZWNFeHByKGdldFNpZ25FeHRlbmRFeHByKFN0YXJ0LCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNpZ25FeHRlbmRFeHByKFN0ZXAsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCk7CisKKyAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGJhY2tlZGdlLXRha2VuIGNvdW50IGlzIFNDRVZDb3VsZE5vdENvbXB1dGUuCisgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBzZXJ2ZXMgdHdvIHB1cnBvc2VzOiBJdCBmaWx0ZXJzIG91dCBsb29wcyB0aGF0IGFyZQorICAgICAgLy8gc2ltcGx5IG5vdCBhbmFseXphYmxlLCBhbmQgaXQgY292ZXJzIHRoZSBjYXNlIHdoZXJlIHRoaXMgY29kZSBpcworICAgICAgLy8gYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGJhY2tlZGdlLXRha2VuIGNvdW50IGFuYWx5c2lzLCBzdWNoIHRoYXQKKyAgICAgIC8vIGF0dGVtcHRpbmcgdG8gYXNrIGZvciB0aGUgYmFja2VkZ2UtdGFrZW4gY291bnQgd291bGQgbGlrZWx5IHJlc3VsdAorICAgICAgLy8gaW4gaW5maW5pdGUgcmVjdXJzaW9uLiBJbiB0aGUgbGF0ZXIgY2FzZSwgdGhlIGFuYWx5c2lzIGNvZGUgd2lsbAorICAgICAgLy8gY29wZSB3aXRoIGEgY29uc2VydmF0aXZlIHZhbHVlLCBhbmQgaXQgd2lsbCB0YWtlIGNhcmUgdG8gcHVyZ2UKKyAgICAgIC8vIHRoYXQgdmFsdWUgb25jZSBpdCBoYXMgZmluaXNoZWQuCisgICAgICBjb25zdCBTQ0VWICpNYXhCRUNvdW50ID0gZ2V0TWF4QmFja2VkZ2VUYWtlbkNvdW50KEwpOworICAgICAgaWYgKCFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oTWF4QkVDb3VudCkpIHsKKyAgICAgICAgLy8gTWFudWFsbHkgY29tcHV0ZSB0aGUgZmluYWwgdmFsdWUgZm9yIEFSLCBjaGVja2luZyBmb3IKKyAgICAgICAgLy8gb3ZlcmZsb3cuCisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYmFja2VkZ2UtdGFrZW4gY291bnQgY2FuIGJlIGxvc3NsZXNzbHkgY2FzdGVkIHRvCisgICAgICAgIC8vIHRoZSBhZGRyZWMncyB0eXBlLiBUaGUgY291bnQgaXMgYWx3YXlzIHVuc2lnbmVkLgorICAgICAgICBjb25zdCBTQ0VWICpDYXN0ZWRNYXhCRUNvdW50ID0KKyAgICAgICAgICBnZXRUcnVuY2F0ZU9yWmVyb0V4dGVuZChNYXhCRUNvdW50LCBTdGFydC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgY29uc3QgU0NFViAqUmVjYXN0ZWRNYXhCRUNvdW50ID0KKyAgICAgICAgICBnZXRUcnVuY2F0ZU9yWmVyb0V4dGVuZChDYXN0ZWRNYXhCRUNvdW50LCBNYXhCRUNvdW50LT5nZXRUeXBlKCkpOworICAgICAgICBpZiAoTWF4QkVDb3VudCA9PSBSZWNhc3RlZE1heEJFQ291bnQpIHsKKyAgICAgICAgICBjb25zdCBUeXBlICpXaWRlVHkgPSBJbnRlZ2VyVHlwZTo6Z2V0KGdldENvbnRleHQoKSwgQml0V2lkdGggKiAyKTsKKyAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIFN0YXJ0K1N0ZXAqTWF4QkVDb3VudCBoYXMgbm8gc2lnbmVkIG92ZXJmbG93LgorICAgICAgICAgIGNvbnN0IFNDRVYgKlNNdWwgPSBnZXRNdWxFeHByKENhc3RlZE1heEJFQ291bnQsIFN0ZXApOworICAgICAgICAgIGNvbnN0IFNDRVYgKkFkZCA9IGdldEFkZEV4cHIoU3RhcnQsIFNNdWwpOworICAgICAgICAgIGNvbnN0IFNDRVYgKk9wZXJhbmRFeHRlbmRlZEFkZCA9CisgICAgICAgICAgICBnZXRBZGRFeHByKGdldFNpZ25FeHRlbmRFeHByKFN0YXJ0LCBXaWRlVHkpLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRNdWxFeHByKGdldFplcm9FeHRlbmRFeHByKENhc3RlZE1heEJFQ291bnQsIFdpZGVUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbkV4dGVuZEV4cHIoU3RlcCwgV2lkZVR5KSkpOworICAgICAgICAgIGlmIChnZXRTaWduRXh0ZW5kRXhwcihBZGQsIFdpZGVUeSkgPT0gT3BlcmFuZEV4dGVuZGVkQWRkKQorICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBleHByZXNzaW9uIHdpdGggdGhlIGFkZHJlYyBvbiB0aGUgb3V0c2lkZS4KKyAgICAgICAgICAgIHJldHVybiBnZXRBZGRSZWNFeHByKGdldFNpZ25FeHRlbmRFeHByKFN0YXJ0LCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaWduRXh0ZW5kRXhwcihTdGVwLCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMKTsKKworICAgICAgICAgIC8vIFNpbWlsYXIgdG8gYWJvdmUsIG9ubHkgdGhpcyB0aW1lIHRyZWF0IHRoZSBzdGVwIHZhbHVlIGFzIHVuc2lnbmVkLgorICAgICAgICAgIC8vIFRoaXMgY292ZXJzIGxvb3BzIHRoYXQgY291bnQgdXAgd2l0aCBhbiB1bnNpZ25lZCBzdGVwLgorICAgICAgICAgIGNvbnN0IFNDRVYgKlVNdWwgPSBnZXRNdWxFeHByKENhc3RlZE1heEJFQ291bnQsIFN0ZXApOworICAgICAgICAgIEFkZCA9IGdldEFkZEV4cHIoU3RhcnQsIFVNdWwpOworICAgICAgICAgIE9wZXJhbmRFeHRlbmRlZEFkZCA9CisgICAgICAgICAgICBnZXRBZGRFeHByKGdldFNpZ25FeHRlbmRFeHByKFN0YXJ0LCBXaWRlVHkpLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRNdWxFeHByKGdldFplcm9FeHRlbmRFeHByKENhc3RlZE1heEJFQ291bnQsIFdpZGVUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0WmVyb0V4dGVuZEV4cHIoU3RlcCwgV2lkZVR5KSkpOworICAgICAgICAgIGlmIChnZXRTaWduRXh0ZW5kRXhwcihBZGQsIFdpZGVUeSkgPT0gT3BlcmFuZEV4dGVuZGVkQWRkKQorICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBleHByZXNzaW9uIHdpdGggdGhlIGFkZHJlYyBvbiB0aGUgb3V0c2lkZS4KKyAgICAgICAgICAgIHJldHVybiBnZXRBZGRSZWNFeHByKGdldFNpZ25FeHRlbmRFeHByKFN0YXJ0LCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRaZXJvRXh0ZW5kRXhwcihTdGVwLCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBiYWNrZWRnZSBpcyBndWFyZGVkIGJ5IGEgY29tcGFyaXNvbiB3aXRoIHRoZSBwcmUtaW5jIHZhbHVlCisgICAgICAgIC8vIHRoZSBhZGRyZWMgaXMgc2FmZS4gQWxzbywgaWYgdGhlIGVudHJ5IGlzIGd1YXJkZWQgYnkgYSBjb21wYXJpc29uCisgICAgICAgIC8vIHdpdGggdGhlIHN0YXJ0IHZhbHVlIGFuZCB0aGUgYmFja2VkZ2UgaXMgZ3VhcmRlZCBieSBhIGNvbXBhcmlzb24KKyAgICAgICAgLy8gd2l0aCB0aGUgcG9zdC1pbmMgdmFsdWUsIHRoZSBhZGRyZWMgaXMgc2FmZS4KKyAgICAgICAgaWYgKGlzS25vd25Qb3NpdGl2ZShTdGVwKSkgeworICAgICAgICAgIGNvbnN0IFNDRVYgKk4gPSBnZXRDb25zdGFudChBUEludDo6Z2V0U2lnbmVkTWluVmFsdWUoQml0V2lkdGgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbmVkUmFuZ2UoU3RlcCkuZ2V0U2lnbmVkTWF4KCkpOworICAgICAgICAgIGlmIChpc0xvb3BCYWNrZWRnZUd1YXJkZWRCeUNvbmQoTCwgSUNtcEluc3Q6OklDTVBfU0xULCBBUiwgTikgfHwKKyAgICAgICAgICAgICAgKGlzTG9vcEVudHJ5R3VhcmRlZEJ5Q29uZChMLCBJQ21wSW5zdDo6SUNNUF9TTFQsIFN0YXJ0LCBOKSAmJgorICAgICAgICAgICAgICAgaXNMb29wQmFja2VkZ2VHdWFyZGVkQnlDb25kKEwsIElDbXBJbnN0OjpJQ01QX1NMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUi0+Z2V0UG9zdEluY0V4cHIoKnRoaXMpLCBOKSkpCisgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGV4cHJlc3Npb24gd2l0aCB0aGUgYWRkcmVjIG9uIHRoZSBvdXRzaWRlLgorICAgICAgICAgICAgcmV0dXJuIGdldEFkZFJlY0V4cHIoZ2V0U2lnbkV4dGVuZEV4cHIoU3RhcnQsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNpZ25FeHRlbmRFeHByKFN0ZXAsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwpOworICAgICAgICB9IGVsc2UgaWYgKGlzS25vd25OZWdhdGl2ZShTdGVwKSkgeworICAgICAgICAgIGNvbnN0IFNDRVYgKk4gPSBnZXRDb25zdGFudChBUEludDo6Z2V0U2lnbmVkTWF4VmFsdWUoQml0V2lkdGgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbmVkUmFuZ2UoU3RlcCkuZ2V0U2lnbmVkTWluKCkpOworICAgICAgICAgIGlmIChpc0xvb3BCYWNrZWRnZUd1YXJkZWRCeUNvbmQoTCwgSUNtcEluc3Q6OklDTVBfU0dULCBBUiwgTikgfHwKKyAgICAgICAgICAgICAgKGlzTG9vcEVudHJ5R3VhcmRlZEJ5Q29uZChMLCBJQ21wSW5zdDo6SUNNUF9TR1QsIFN0YXJ0LCBOKSAmJgorICAgICAgICAgICAgICAgaXNMb29wQmFja2VkZ2VHdWFyZGVkQnlDb25kKEwsIElDbXBJbnN0OjpJQ01QX1NHVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUi0+Z2V0UG9zdEluY0V4cHIoKnRoaXMpLCBOKSkpCisgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGV4cHJlc3Npb24gd2l0aCB0aGUgYWRkcmVjIG9uIHRoZSBvdXRzaWRlLgorICAgICAgICAgICAgcmV0dXJuIGdldEFkZFJlY0V4cHIoZ2V0U2lnbkV4dGVuZEV4cHIoU3RhcnQsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNpZ25FeHRlbmRFeHByKFN0ZXAsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIC8vIFRoZSBjYXN0IHdhc24ndCBmb2xkZWQ7IGNyZWF0ZSBhbiBleHBsaWNpdCBjYXN0IG5vZGUuCisgIC8vIFJlY29tcHV0ZSB0aGUgaW5zZXJ0IHBvc2l0aW9uLCBhcyBpdCBtYXkgaGF2ZSBiZWVuIGludmFsaWRhdGVkLgorICBpZiAoY29uc3QgU0NFViAqUyA9IFVuaXF1ZVNDRVZzLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkgcmV0dXJuIFM7CisgIFNDRVYgKlMgPSBuZXcgKFNDRVZBbGxvY2F0b3IpIFNDRVZTaWduRXh0ZW5kRXhwcihJRC5JbnRlcm4oU0NFVkFsbG9jYXRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcCwgVHkpOworICBVbmlxdWVTQ0VWcy5JbnNlcnROb2RlKFMsIElQKTsKKyAgcmV0dXJuIFM7Cit9CisKKy8vLyBnZXRBbnlFeHRlbmRFeHByIC0gUmV0dXJuIGEgU0NFViBmb3IgdGhlIGdpdmVuIG9wZXJhbmQgZXh0ZW5kZWQgd2l0aAorLy8vIHVuc3BlY2lmaWVkIGJpdHMgb3V0IHRvIHRoZSBnaXZlbiB0eXBlLgorLy8vCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldEFueUV4dGVuZEV4cHIoY29uc3QgU0NFViAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgYXNzZXJ0KGdldFR5cGVTaXplSW5CaXRzKE9wLT5nZXRUeXBlKCkpIDwgZ2V0VHlwZVNpemVJbkJpdHMoVHkpICYmCisgICAgICAgICAiVGhpcyBpcyBub3QgYW4gZXh0ZW5kaW5nIGNvbnZlcnNpb24hIik7CisgIGFzc2VydChpc1NDRVZhYmxlKFR5KSAmJgorICAgICAgICAgIlRoaXMgaXMgbm90IGEgY29udmVyc2lvbiB0byBhIFNDRVZhYmxlIHR5cGUhIik7CisgIFR5ID0gZ2V0RWZmZWN0aXZlU0NFVlR5cGUoVHkpOworCisgIC8vIFNpZ24tZXh0ZW5kIG5lZ2F0aXZlIGNvbnN0YW50cy4KKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqU0MgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KE9wKSkKKyAgICBpZiAoU0MtPmdldFZhbHVlKCktPmdldFZhbHVlKCkuaXNOZWdhdGl2ZSgpKQorICAgICAgcmV0dXJuIGdldFNpZ25FeHRlbmRFeHByKE9wLCBUeSk7CisKKyAgLy8gUGVlbCBvZmYgYSB0cnVuY2F0ZSBjYXN0LgorICBpZiAoY29uc3QgU0NFVlRydW5jYXRlRXhwciAqVCA9IGR5bl9jYXN0PFNDRVZUcnVuY2F0ZUV4cHI+KE9wKSkgeworICAgIGNvbnN0IFNDRVYgKk5ld09wID0gVC0+Z2V0T3BlcmFuZCgpOworICAgIGlmIChnZXRUeXBlU2l6ZUluQml0cyhOZXdPcC0+Z2V0VHlwZSgpKSA8IGdldFR5cGVTaXplSW5CaXRzKFR5KSkKKyAgICAgIHJldHVybiBnZXRBbnlFeHRlbmRFeHByKE5ld09wLCBUeSk7CisgICAgcmV0dXJuIGdldFRydW5jYXRlT3JOb29wKE5ld09wLCBUeSk7CisgIH0KKworICAvLyBOZXh0IHRyeSBhIHpleHQgY2FzdC4gSWYgdGhlIGNhc3QgaXMgZm9sZGVkLCB1c2UgaXQuCisgIGNvbnN0IFNDRVYgKlpFeHQgPSBnZXRaZXJvRXh0ZW5kRXhwcihPcCwgVHkpOworICBpZiAoIWlzYTxTQ0VWWmVyb0V4dGVuZEV4cHI+KFpFeHQpKQorICAgIHJldHVybiBaRXh0OworCisgIC8vIE5leHQgdHJ5IGEgc2V4dCBjYXN0LiBJZiB0aGUgY2FzdCBpcyBmb2xkZWQsIHVzZSBpdC4KKyAgY29uc3QgU0NFViAqU0V4dCA9IGdldFNpZ25FeHRlbmRFeHByKE9wLCBUeSk7CisgIGlmICghaXNhPFNDRVZTaWduRXh0ZW5kRXhwcj4oU0V4dCkpCisgICAgcmV0dXJuIFNFeHQ7CisKKyAgLy8gRm9yY2UgdGhlIGNhc3QgdG8gYmUgZm9sZGVkIGludG8gdGhlIG9wZXJhbmRzIG9mIGFuIGFkZHJlYy4KKyAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihPcCkpIHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE9wczsKKyAgICBmb3IgKFNDRVZBZGRSZWNFeHByOjpvcF9pdGVyYXRvciBJID0gQVItPm9wX2JlZ2luKCksIEUgPSBBUi0+b3BfZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIE9wcy5wdXNoX2JhY2soZ2V0QW55RXh0ZW5kRXhwcigqSSwgVHkpKTsKKyAgICByZXR1cm4gZ2V0QWRkUmVjRXhwcihPcHMsIEFSLT5nZXRMb29wKCkpOworICB9CisKKyAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIGZvbGQgYW55ZXh0KHVuZGVmKSB0byB1bmRlZi4gV2UgZG9uJ3Qgd2FudCB0bworICAvLyBrbm93IHRvbyBtdWNoIGFib3V0IFNDRVZVbmtub3ducywgYnV0IHRoaXMgc3BlY2lhbCBjYXNlIGlzIGhhbmR5CisgIC8vIGFuZCBoYXJtbGVzcy4KKyAgaWYgKGNvbnN0IFNDRVZVbmtub3duICpVID0gZHluX2Nhc3Q8U0NFVlVua25vd24+KE9wKSkKKyAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KFUtPmdldFZhbHVlKCkpKQorICAgICAgcmV0dXJuIGdldFNDRVYoVW5kZWZWYWx1ZTo6Z2V0KFR5KSk7CisKKyAgLy8gSWYgdGhlIGV4cHJlc3Npb24gaXMgb2J2aW91c2x5IHNpZ25lZCwgdXNlIHRoZSBzZXh0IGNhc3QgdmFsdWUuCisgIGlmIChpc2E8U0NFVlNNYXhFeHByPihPcCkpCisgICAgcmV0dXJuIFNFeHQ7CisKKyAgLy8gQWJzZW50IGFueSBvdGhlciBpbmZvcm1hdGlvbiwgdXNlIHRoZSB6ZXh0IGNhc3QgdmFsdWUuCisgIHJldHVybiBaRXh0OworfQorCisvLy8gQ29sbGVjdEFkZE9wZXJhbmRzV2l0aFNjYWxlcyAtIFByb2Nlc3MgdGhlIGdpdmVuIE9wcyBsaXN0LCB3aGljaCBpcworLy8vIGEgbGlzdCBvZiBvcGVyYW5kcyB0byBiZSBhZGRlZCB1bmRlciB0aGUgZ2l2ZW4gc2NhbGUsIHVwZGF0ZSB0aGUgZ2l2ZW4KKy8vLyBtYXAuIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdldEFkZFJlY0V4cHIuIEFzIGFuIGV4YW1wbGUgb2YKKy8vLyB3aGF0IGl0IGRvZXMsIGdpdmVuIGEgc2VxdWVuY2Ugb2Ygb3BlcmFuZHMgdGhhdCB3b3VsZCBmb3JtIGFuIGFkZAorLy8vIGV4cHJlc3Npb24gbGlrZSB0aGlzOgorLy8vCisvLy8gICAgbSArIG4gKyAxMyArIChBICogKG8gKyBwICsgKEIgKiBxICsgbSArIDI5KSkpICsgciArICgtMSAqIHIpCisvLy8KKy8vLyB3aGVyZSBBIGFuZCBCIGFyZSBjb25zdGFudHMsIHVwZGF0ZSB0aGUgbWFwIHdpdGggdGhlc2UgdmFsdWVzOgorLy8vCisvLy8gICAgKG0sIDErQSpCKSwgKG4sIDEpLCAobywgQSksIChwLCBBKSwgKHEsIEEqQiksIChyLCAwKQorLy8vCisvLy8gYW5kIGFkZCAxMyArIEEqQioyOSB0byBBY2N1bXVsYXRlZENvbnN0YW50LgorLy8vIFRoaXMgd2lsbCBhbGxvdyBnZXRBZGRSZWNFeHByIHRvIHByb2R1Y2UgdGhpczoKKy8vLworLy8vICAgIDEzK0EqQioyOSArIG4gKyAobSAqICgxK0EqQikpICsgKChvICsgcCkgKiBBKSArIChxICogQSpCKQorLy8vCisvLy8gVGhpcyBmb3JtIG9mdGVuIGV4cG9zZXMgZm9sZGluZyBvcHBvcnR1bml0aWVzIHRoYXQgYXJlIGhpZGRlbiBpbgorLy8vIHRoZSBvcmlnaW5hbCBvcGVyYW5kIGxpc3QuCisvLy8KKy8vLyBSZXR1cm4gdHJ1ZSBpZmYgaXQgYXBwZWFycyB0aGF0IGFueSBpbnRlcmVzdGluZyBmb2xkaW5nIG9wcG9ydHVuaXRpZXMKKy8vLyBtYXkgYmUgZXhwb3NlZC4gVGhpcyBoZWxwcyBnZXRBZGRSZWNFeHByIHNob3J0LWNpcmN1aXQgZXh0cmEgd29yayBpbgorLy8vIHRoZSBjb21tb24gY2FzZSB3aGVyZSBubyBpbnRlcmVzdGluZyBvcHBvcnR1bml0aWVzIGFyZSBwcmVzZW50LCBhbmQKKy8vLyBpcyBhbHNvIHVzZWQgYXMgYSBjaGVjayB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uCisvLy8KK3N0YXRpYyBib29sCitDb2xsZWN0QWRkT3BlcmFuZHNXaXRoU2NhbGVzKERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgQVBJbnQ+ICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+ICZOZXdPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZBY2N1bXVsYXRlZENvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpjb25zdCAqT3BzLCBzaXplX3QgTnVtT3BlcmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSkgeworICBib29sIEludGVyZXN0aW5nID0gZmFsc2U7CisKKyAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBhZGQgb3BlcmFuZHMuIFRoZXkgYXJlIHNvcnRlZCwgd2l0aCBjb25zdGFudHMgZmlyc3QuCisgIHVuc2lnbmVkIGkgPSAwOworICB3aGlsZSAoY29uc3QgU0NFVkNvbnN0YW50ICpDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihPcHNbaV0pKSB7CisgICAgKytpOworICAgIC8vIFB1bGwgYSBidXJpZWQgY29uc3RhbnQgb3V0IHRvIHRoZSBvdXRzaWRlLgorICAgIGlmIChTY2FsZSAhPSAxIHx8IEFjY3VtdWxhdGVkQ29uc3RhbnQgIT0gMCB8fCBDLT5nZXRWYWx1ZSgpLT5pc1plcm8oKSkKKyAgICAgIEludGVyZXN0aW5nID0gdHJ1ZTsKKyAgICBBY2N1bXVsYXRlZENvbnN0YW50ICs9IFNjYWxlICogQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgfQorCisgIC8vIE5leHQgY29tZXMgZXZlcnl0aGluZyBlbHNlLiBXZSdyZSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gbXVsdGlwbGllcworICAvLyBoZXJlLCBidXQgdGhleSdyZSBpbiB0aGUgbWlkZGxlLCBzbyBqdXN0IHZpc2l0IHRoZSByZXN0IHdpdGggb25lIGxvb3AuCisgIGZvciAoOyBpICE9IE51bU9wZXJhbmRzOyArK2kpIHsKKyAgICBjb25zdCBTQ0VWTXVsRXhwciAqTXVsID0gZHluX2Nhc3Q8U0NFVk11bEV4cHI+KE9wc1tpXSk7CisgICAgaWYgKE11bCAmJiBpc2E8U0NFVkNvbnN0YW50PihNdWwtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICBBUEludCBOZXdTY2FsZSA9CisgICAgICAgIFNjYWxlICogY2FzdDxTQ0VWQ29uc3RhbnQ+KE11bC0+Z2V0T3BlcmFuZCgwKSktPmdldFZhbHVlKCktPmdldFZhbHVlKCk7CisgICAgICBpZiAoTXVsLT5nZXROdW1PcGVyYW5kcygpID09IDIgJiYgaXNhPFNDRVZBZGRFeHByPihNdWwtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgIC8vIEEgbXVsdGlwbGljYXRpb24gb2YgYSBjb25zdGFudCB3aXRoIGFub3RoZXIgYWRkOyByZWN1cnNlLgorICAgICAgICBjb25zdCBTQ0VWQWRkRXhwciAqQWRkID0gY2FzdDxTQ0VWQWRkRXhwcj4oTXVsLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgSW50ZXJlc3RpbmcgfD0KKyAgICAgICAgICBDb2xsZWN0QWRkT3BlcmFuZHNXaXRoU2NhbGVzKE0sIE5ld09wcywgQWNjdW11bGF0ZWRDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZC0+b3BfYmVnaW4oKSwgQWRkLT5nZXROdW1PcGVyYW5kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3U2NhbGUsIFNFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEEgbXVsdGlwbGljYXRpb24gb2YgYSBjb25zdGFudCB3aXRoIHNvbWUgb3RoZXIgdmFsdWUuIFVwZGF0ZQorICAgICAgICAvLyB0aGUgbWFwLgorICAgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE11bE9wcyhNdWwtPm9wX2JlZ2luKCkrMSwgTXVsLT5vcF9lbmQoKSk7CisgICAgICAgIGNvbnN0IFNDRVYgKktleSA9IFNFLmdldE11bEV4cHIoTXVsT3BzKTsKKyAgICAgICAgc3RkOjpwYWlyPERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgQVBJbnQ+OjppdGVyYXRvciwgYm9vbD4gUGFpciA9CisgICAgICAgICAgTS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoS2V5LCBOZXdTY2FsZSkpOworICAgICAgICBpZiAoUGFpci5zZWNvbmQpIHsKKyAgICAgICAgICBOZXdPcHMucHVzaF9iYWNrKFBhaXIuZmlyc3QtPmZpcnN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBQYWlyLmZpcnN0LT5zZWNvbmQgKz0gTmV3U2NhbGU7CisgICAgICAgICAgLy8gVGhlIG1hcCBhbHJlYWR5IGhhZCBhbiBlbnRyeSBmb3IgdGhpcyB2YWx1ZSwgd2hpY2ggbWF5IGluZGljYXRlCisgICAgICAgICAgLy8gYSBmb2xkaW5nIG9wcG9ydHVuaXR5LgorICAgICAgICAgIEludGVyZXN0aW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBBbiBvcmRpbmFyeSBvcGVyYW5kLiBVcGRhdGUgdGhlIG1hcC4KKyAgICAgIHN0ZDo6cGFpcjxEZW5zZU1hcDxjb25zdCBTQ0VWICosIEFQSW50Pjo6aXRlcmF0b3IsIGJvb2w+IFBhaXIgPQorICAgICAgICBNLmluc2VydChzdGQ6Om1ha2VfcGFpcihPcHNbaV0sIFNjYWxlKSk7CisgICAgICBpZiAoUGFpci5zZWNvbmQpIHsKKyAgICAgICAgTmV3T3BzLnB1c2hfYmFjayhQYWlyLmZpcnN0LT5maXJzdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQYWlyLmZpcnN0LT5zZWNvbmQgKz0gU2NhbGU7CisgICAgICAgIC8vIFRoZSBtYXAgYWxyZWFkeSBoYWQgYW4gZW50cnkgZm9yIHRoaXMgdmFsdWUsIHdoaWNoIG1heSBpbmRpY2F0ZQorICAgICAgICAvLyBhIGZvbGRpbmcgb3Bwb3J0dW5pdHkuCisgICAgICAgIEludGVyZXN0aW5nID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gSW50ZXJlc3Rpbmc7Cit9CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBBUEludENvbXBhcmUgeworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBUEludCAmTEhTLCBjb25zdCBBUEludCAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gTEhTLnVsdChSSFMpOworICAgIH0KKyAgfTsKK30KKworLy8vIGdldEFkZEV4cHIgLSBHZXQgYSBjYW5vbmljYWwgYWRkIGV4cHJlc3Npb24sIG9yIHNvbWV0aGluZyBzaW1wbGVyIGlmCisvLy8gcG9zc2libGUuCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldEFkZEV4cHIoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVywgYm9vbCBIYXNOU1cpIHsKKyAgYXNzZXJ0KCFPcHMuZW1wdHkoKSAmJiAiQ2Fubm90IGdldCBlbXB0eSBhZGQhIik7CisgIGlmIChPcHMuc2l6ZSgpID09IDEpIHJldHVybiBPcHNbMF07CisjaWZuZGVmIE5ERUJVRworICBjb25zdCBUeXBlICpFVHkgPSBnZXRFZmZlY3RpdmVTQ0VWVHlwZShPcHNbMF0tPmdldFR5cGUoKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBhc3NlcnQoZ2V0RWZmZWN0aXZlU0NFVlR5cGUoT3BzW2ldLT5nZXRUeXBlKCkpID09IEVUeSAmJgorICAgICAgICAgICAiU0NFVkFkZEV4cHIgb3BlcmFuZCB0eXBlcyBkb24ndCBtYXRjaCEiKTsKKyNlbmRpZgorCisgIC8vIElmIEhhc05TVyBpcyB0cnVlIGFuZCBhbGwgdGhlIG9wZXJhbmRzIGFyZSBub24tbmVnYXRpdmUsIGluZmVyIEhhc05VVy4KKyAgaWYgKCFIYXNOVVcgJiYgSGFzTlNXKSB7CisgICAgYm9vbCBBbGwgPSB0cnVlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICghaXNLbm93bk5vbk5lZ2F0aXZlKE9wc1tpXSkpIHsKKyAgICAgICAgQWxsID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGlmIChBbGwpIEhhc05VVyA9IHRydWU7CisgIH0KKworICAvLyBTb3J0IGJ5IGNvbXBsZXhpdHksIHRoaXMgZ3JvdXBzIGFsbCBzaW1pbGFyIGV4cHJlc3Npb24gdHlwZXMgdG9nZXRoZXIuCisgIEdyb3VwQnlDb21wbGV4aXR5KE9wcywgTEkpOworCisgIC8vIElmIHRoZXJlIGFyZSBhbnkgY29uc3RhbnRzLCBmb2xkIHRoZW0gdG9nZXRoZXIuCisgIHVuc2lnbmVkIElkeCA9IDA7CisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKkxIU0MgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KE9wc1swXSkpIHsKKyAgICArK0lkeDsKKyAgICBhc3NlcnQoSWR4IDwgT3BzLnNpemUoKSk7CisgICAgd2hpbGUgKGNvbnN0IFNDRVZDb25zdGFudCAqUkhTQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oT3BzW0lkeF0pKSB7CisgICAgICAvLyBXZSBmb3VuZCB0d28gY29uc3RhbnRzLCBmb2xkIHRoZW0gdG9nZXRoZXIhCisgICAgICBPcHNbMF0gPSBnZXRDb25zdGFudChMSFNDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0MtPmdldFZhbHVlKCktPmdldFZhbHVlKCkpOworICAgICAgaWYgKE9wcy5zaXplKCkgPT0gMikgcmV0dXJuIE9wc1swXTsKKyAgICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKSsxKTsgIC8vIEVyYXNlIHRoZSBmb2xkZWQgZWxlbWVudAorICAgICAgTEhTQyA9IGNhc3Q8U0NFVkNvbnN0YW50PihPcHNbMF0pOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSBsZWZ0IHdpdGggYSBjb25zdGFudCB6ZXJvIGJlaW5nIGFkZGVkLCBzdHJpcCBpdCBvZmYuCisgICAgaWYgKExIU0MtPmdldFZhbHVlKCktPmlzWmVybygpKSB7CisgICAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkpOworICAgICAgLS1JZHg7CisgICAgfQorCisgICAgaWYgKE9wcy5zaXplKCkgPT0gMSkgcmV0dXJuIE9wc1swXTsKKyAgfQorCisgIC8vIE9rYXksIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2FtZSB2YWx1ZSBvY2N1cnMgaW4gdGhlIG9wZXJhbmQgbGlzdCB0d2ljZS4gIElmCisgIC8vIHNvLCBtZXJnZSB0aGVtIHRvZ2V0aGVyIGludG8gYW4gbXVsdGlwbHkgZXhwcmVzc2lvbi4gIFNpbmNlIHdlIHNvcnRlZCB0aGUKKyAgLy8gbGlzdCwgdGhlc2UgdmFsdWVzIGFyZSByZXF1aXJlZCB0byBiZSBhZGphY2VudC4KKyAgY29uc3QgVHlwZSAqVHkgPSBPcHNbMF0tPmdldFR5cGUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCktMTsgaSAhPSBlOyArK2kpCisgICAgaWYgKE9wc1tpXSA9PSBPcHNbaSsxXSkgeyAgICAgIC8vICBYICsgWSArIFkgIC0tPiAgWCArIFkqMgorICAgICAgLy8gRm91bmQgYSBtYXRjaCwgbWVyZ2UgdGhlIHR3byB2YWx1ZXMgaW50byBhIG11bHRpcGx5LCBhbmQgYWRkIGFueQorICAgICAgLy8gcmVtYWluaW5nIHZhbHVlcyB0byB0aGUgcmVzdWx0LgorICAgICAgY29uc3QgU0NFViAqVHdvID0gZ2V0Q29uc3RhbnQoVHksIDIpOworICAgICAgY29uc3QgU0NFViAqTXVsID0gZ2V0TXVsRXhwcihPcHNbaV0sIFR3byk7CisgICAgICBpZiAoT3BzLnNpemUoKSA9PSAyKQorICAgICAgICByZXR1cm4gTXVsOworICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK2ksIE9wcy5iZWdpbigpK2krMik7CisgICAgICBPcHMucHVzaF9iYWNrKE11bCk7CisgICAgICByZXR1cm4gZ2V0QWRkRXhwcihPcHMsIEhhc05VVywgSGFzTlNXKTsKKyAgICB9CisKKyAgLy8gQ2hlY2sgZm9yIHRydW5jYXRlcy4gSWYgYWxsIHRoZSBvcGVyYW5kcyBhcmUgdHJ1bmNhdGVkIGZyb20gdGhlIHNhbWUKKyAgLy8gdHlwZSwgc2VlIGlmIGZhY3RvcmluZyBvdXQgdGhlIHRydW5jYXRlIHdvdWxkIHBlcm1pdCB0aGUgcmVzdWx0IHRvIGJlCisgIC8vIGZvbGRlZC4gZWcuLCB0cnVuYyh4KSArIG0qdHJ1bmMobikgLS0+IHRydW5jKHggKyB0cnVuYyhtKSpuKQorICAvLyBpZiB0aGUgY29udGVudHMgb2YgdGhlIHJlc3VsdGluZyBvdXRlciB0cnVuYyBmb2xkIHRvIHNvbWV0aGluZyBzaW1wbGUuCisgIGZvciAoOyBJZHggPCBPcHMuc2l6ZSgpICYmIGlzYTxTQ0VWVHJ1bmNhdGVFeHByPihPcHNbSWR4XSk7ICsrSWR4KSB7CisgICAgY29uc3QgU0NFVlRydW5jYXRlRXhwciAqVHJ1bmMgPSBjYXN0PFNDRVZUcnVuY2F0ZUV4cHI+KE9wc1tJZHhdKTsKKyAgICBjb25zdCBUeXBlICpEc3RUeXBlID0gVHJ1bmMtPmdldFR5cGUoKTsKKyAgICBjb25zdCBUeXBlICpTcmNUeXBlID0gVHJ1bmMtPmdldE9wZXJhbmQoKS0+Z2V0VHlwZSgpOworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgOD4gTGFyZ2VPcHM7CisgICAgYm9vbCBPayA9IHRydWU7CisgICAgLy8gQ2hlY2sgYWxsIHRoZSBvcGVyYW5kcyB0byBzZWUgaWYgdGhleSBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gdGhlCisgICAgLy8gc291cmNlIHR5cGUgb2YgdGhlIHRydW5jYXRlLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKGNvbnN0IFNDRVZUcnVuY2F0ZUV4cHIgKlQgPSBkeW5fY2FzdDxTQ0VWVHJ1bmNhdGVFeHByPihPcHNbaV0pKSB7CisgICAgICAgIGlmIChULT5nZXRPcGVyYW5kKCktPmdldFR5cGUoKSAhPSBTcmNUeXBlKSB7CisgICAgICAgICAgT2sgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBMYXJnZU9wcy5wdXNoX2JhY2soVC0+Z2V0T3BlcmFuZCgpKTsKKyAgICAgIH0gZWxzZSBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihPcHNbaV0pKSB7CisgICAgICAgIExhcmdlT3BzLnB1c2hfYmFjayhnZXRBbnlFeHRlbmRFeHByKEMsIFNyY1R5cGUpKTsKKyAgICAgIH0gZWxzZSBpZiAoY29uc3QgU0NFVk11bEV4cHIgKk0gPSBkeW5fY2FzdDxTQ0VWTXVsRXhwcj4oT3BzW2ldKSkgeworICAgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IExhcmdlTXVsT3BzOworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBmID0gTS0+Z2V0TnVtT3BlcmFuZHMoKTsgaiAhPSBmICYmIE9rOyArK2opIHsKKyAgICAgICAgICBpZiAoY29uc3QgU0NFVlRydW5jYXRlRXhwciAqVCA9CisgICAgICAgICAgICAgICAgZHluX2Nhc3Q8U0NFVlRydW5jYXRlRXhwcj4oTS0+Z2V0T3BlcmFuZChqKSkpIHsKKyAgICAgICAgICAgIGlmIChULT5nZXRPcGVyYW5kKCktPmdldFR5cGUoKSAhPSBTcmNUeXBlKSB7CisgICAgICAgICAgICAgIE9rID0gZmFsc2U7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGFyZ2VNdWxPcHMucHVzaF9iYWNrKFQtPmdldE9wZXJhbmQoKSk7CisgICAgICAgICAgfSBlbHNlIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKkMgPQorICAgICAgICAgICAgICAgICAgICAgICBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KE0tPmdldE9wZXJhbmQoaikpKSB7CisgICAgICAgICAgICBMYXJnZU11bE9wcy5wdXNoX2JhY2soZ2V0QW55RXh0ZW5kRXhwcihDLCBTcmNUeXBlKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKE9rKQorICAgICAgICAgIExhcmdlT3BzLnB1c2hfYmFjayhnZXRNdWxFeHByKExhcmdlTXVsT3BzKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBPayA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKE9rKSB7CisgICAgICAvLyBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBpbiB0aGUgbGFyZ2VyIHR5cGUuCisgICAgICBjb25zdCBTQ0VWICpGb2xkID0gZ2V0QWRkRXhwcihMYXJnZU9wcywgSGFzTlVXLCBIYXNOU1cpOworICAgICAgLy8gSWYgaXQgZm9sZHMgdG8gc29tZXRoaW5nIHNpbXBsZSwgdXNlIGl0LiBPdGhlcndpc2UsIGRvbid0LgorICAgICAgaWYgKGlzYTxTQ0VWQ29uc3RhbnQ+KEZvbGQpIHx8IGlzYTxTQ0VWVW5rbm93bj4oRm9sZCkpCisgICAgICAgIHJldHVybiBnZXRUcnVuY2F0ZUV4cHIoRm9sZCwgRHN0VHlwZSk7CisgICAgfQorICB9CisKKyAgLy8gU2tpcCBwYXN0IGFueSBvdGhlciBjYXN0IFNDRVZzLgorICB3aGlsZSAoSWR4IDwgT3BzLnNpemUoKSAmJiBPcHNbSWR4XS0+Z2V0U0NFVlR5cGUoKSA8IHNjQWRkRXhwcikKKyAgICArK0lkeDsKKworICAvLyBJZiB0aGVyZSBhcmUgYWRkIG9wZXJhbmRzIHRoZXkgd291bGQgYmUgbmV4dC4KKyAgaWYgKElkeCA8IE9wcy5zaXplKCkpIHsKKyAgICBib29sIERlbGV0ZWRBZGQgPSBmYWxzZTsKKyAgICB3aGlsZSAoY29uc3QgU0NFVkFkZEV4cHIgKkFkZCA9IGR5bl9jYXN0PFNDRVZBZGRFeHByPihPcHNbSWR4XSkpIHsKKyAgICAgIC8vIElmIHdlIGhhdmUgYW4gYWRkLCBleHBhbmQgdGhlIGFkZCBvcGVyYW5kcyBvbnRvIHRoZSBlbmQgb2YgdGhlIG9wZXJhbmRzCisgICAgICAvLyBsaXN0LgorICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK0lkeCk7CisgICAgICBPcHMuYXBwZW5kKEFkZC0+b3BfYmVnaW4oKSwgQWRkLT5vcF9lbmQoKSk7CisgICAgICBEZWxldGVkQWRkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBkZWxldGVkIGF0IGxlYXN0IG9uZSBhZGQsIHdlIGFkZGVkIG9wZXJhbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsCisgICAgLy8gYW5kIHRoZXkgYXJlIG5vdCBuZWNlc3NhcmlseSBzb3J0ZWQuICBSZWN1cnNlIHRvIHJlc29ydCBhbmQgcmVzaW1wbGlmeQorICAgIC8vIGFueSBvcGVyYW5kcyB3ZSBqdXN0IGFjcXVpcmVkLgorICAgIGlmIChEZWxldGVkQWRkKQorICAgICAgcmV0dXJuIGdldEFkZEV4cHIoT3BzKTsKKyAgfQorCisgIC8vIFNraXAgb3ZlciB0aGUgYWRkIGV4cHJlc3Npb24gdW50aWwgd2UgZ2V0IHRvIGEgbXVsdGlwbHkuCisgIHdoaWxlIChJZHggPCBPcHMuc2l6ZSgpICYmIE9wc1tJZHhdLT5nZXRTQ0VWVHlwZSgpIDwgc2NNdWxFeHByKQorICAgICsrSWR4OworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGZvbGRpbmcgb3Bwb3J0dW5pdGllcyBwcmVzZW50IHdpdGgKKyAgLy8gb3BlcmFuZHMgbXVsdGlwbGllZCBieSBjb25zdGFudCB2YWx1ZXMuCisgIGlmIChJZHggPCBPcHMuc2l6ZSgpICYmIGlzYTxTQ0VWTXVsRXhwcj4oT3BzW0lkeF0pKSB7CisgICAgdWludDY0X3QgQml0V2lkdGggPSBnZXRUeXBlU2l6ZUluQml0cyhUeSk7CisgICAgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBBUEludD4gTTsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IE5ld09wczsKKyAgICBBUEludCBBY2N1bXVsYXRlZENvbnN0YW50KEJpdFdpZHRoLCAwKTsKKyAgICBpZiAoQ29sbGVjdEFkZE9wZXJhbmRzV2l0aFNjYWxlcyhNLCBOZXdPcHMsIEFjY3VtdWxhdGVkQ29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLmRhdGEoKSwgT3BzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludChCaXRXaWR0aCwgMSksICp0aGlzKSkgeworICAgICAgLy8gU29tZSBpbnRlcmVzdGluZyBmb2xkaW5nIG9wcG9ydHVuaXR5IGlzIHByZXNlbnQsIHNvIGl0cyB3b3J0aHdoaWxlIHRvCisgICAgICAvLyByZS1nZW5lcmF0ZSB0aGUgb3BlcmFuZHMgbGlzdC4gR3JvdXAgdGhlIG9wZXJhbmRzIGJ5IGNvbnN0YW50IHNjYWxlLAorICAgICAgLy8gdG8gYXZvaWQgbXVsdGlwbHlpbmcgYnkgdGhlIHNhbWUgY29uc3RhbnQgc2NhbGUgbXVsdGlwbGUgdGltZXMuCisgICAgICBzdGQ6Om1hcDxBUEludCwgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiwgQVBJbnRDb21wYXJlPiBNdWxPcExpc3RzOworICAgICAgZm9yIChTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+OjppdGVyYXRvciBJID0gTmV3T3BzLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBOZXdPcHMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICBNdWxPcExpc3RzW00uZmluZCgqSSktPnNlY29uZF0ucHVzaF9iYWNrKCpJKTsKKyAgICAgIC8vIFJlLWdlbmVyYXRlIHRoZSBvcGVyYW5kcyBsaXN0LgorICAgICAgT3BzLmNsZWFyKCk7CisgICAgICBpZiAoQWNjdW11bGF0ZWRDb25zdGFudCAhPSAwKQorICAgICAgICBPcHMucHVzaF9iYWNrKGdldENvbnN0YW50KEFjY3VtdWxhdGVkQ29uc3RhbnQpKTsKKyAgICAgIGZvciAoc3RkOjptYXA8QVBJbnQsIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4sIEFQSW50Q29tcGFyZT46Oml0ZXJhdG9yCisgICAgICAgICAgIEkgPSBNdWxPcExpc3RzLmJlZ2luKCksIEUgPSBNdWxPcExpc3RzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgaWYgKEktPmZpcnN0ICE9IDApCisgICAgICAgICAgT3BzLnB1c2hfYmFjayhnZXRNdWxFeHByKGdldENvbnN0YW50KEktPmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWRkRXhwcihJLT5zZWNvbmQpKSk7CisgICAgICBpZiAoT3BzLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBnZXRDb25zdGFudChUeSwgMCk7CisgICAgICBpZiAoT3BzLnNpemUoKSA9PSAxKQorICAgICAgICByZXR1cm4gT3BzWzBdOworICAgICAgcmV0dXJuIGdldEFkZEV4cHIoT3BzKTsKKyAgICB9CisgIH0KKworICAvLyBJZiB3ZSBhcmUgYWRkaW5nIHNvbWV0aGluZyB0byBhIG11bHRpcGx5IGV4cHJlc3Npb24sIG1ha2Ugc3VyZSB0aGUKKyAgLy8gc29tZXRoaW5nIGlzIG5vdCBhbHJlYWR5IGFuIG9wZXJhbmQgb2YgdGhlIG11bHRpcGx5LiAgSWYgc28sIG1lcmdlIGl0IGludG8KKyAgLy8gdGhlIG11bHRpcGx5LgorICBmb3IgKDsgSWR4IDwgT3BzLnNpemUoKSAmJiBpc2E8U0NFVk11bEV4cHI+KE9wc1tJZHhdKTsgKytJZHgpIHsKKyAgICBjb25zdCBTQ0VWTXVsRXhwciAqTXVsID0gY2FzdDxTQ0VWTXVsRXhwcj4oT3BzW0lkeF0pOworICAgIGZvciAodW5zaWduZWQgTXVsT3AgPSAwLCBlID0gTXVsLT5nZXROdW1PcGVyYW5kcygpOyBNdWxPcCAhPSBlOyArK011bE9wKSB7CisgICAgICBjb25zdCBTQ0VWICpNdWxPcFNDRVYgPSBNdWwtPmdldE9wZXJhbmQoTXVsT3ApOworICAgICAgZm9yICh1bnNpZ25lZCBBZGRPcCA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBBZGRPcCAhPSBlOyArK0FkZE9wKQorICAgICAgICBpZiAoTXVsT3BTQ0VWID09IE9wc1tBZGRPcF0gJiYgIWlzYTxTQ0VWQ29uc3RhbnQ+KE9wc1tBZGRPcF0pKSB7CisgICAgICAgICAgLy8gRm9sZCBXICsgWCArIChYICogWSAqIFopICAtLT4gIFcgKyAoWCAqICgoWSpaKSsxKSkKKyAgICAgICAgICBjb25zdCBTQ0VWICpJbm5lck11bCA9IE11bC0+Z2V0T3BlcmFuZChNdWxPcCA9PSAwKTsKKyAgICAgICAgICBpZiAoTXVsLT5nZXROdW1PcGVyYW5kcygpICE9IDIpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBtdWx0aXBseSBoYXMgbW9yZSB0aGFuIHR3byBvcGVyYW5kcywgd2UgbXVzdCBnZXQgdGhlCisgICAgICAgICAgICAvLyBZKlogdGVybS4KKyAgICAgICAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gTXVsT3BzKE11bC0+b3BfYmVnaW4oKSwgTXVsLT5vcF9lbmQoKSk7CisgICAgICAgICAgICBNdWxPcHMuZXJhc2UoTXVsT3BzLmJlZ2luKCkrTXVsT3ApOworICAgICAgICAgICAgSW5uZXJNdWwgPSBnZXRNdWxFeHByKE11bE9wcyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnN0IFNDRVYgKk9uZSA9IGdldENvbnN0YW50KFR5LCAxKTsKKyAgICAgICAgICBjb25zdCBTQ0VWICpBZGRPbmUgPSBnZXRBZGRFeHByKElubmVyTXVsLCBPbmUpOworICAgICAgICAgIGNvbnN0IFNDRVYgKk91dGVyTXVsID0gZ2V0TXVsRXhwcihBZGRPbmUsIE9wc1tBZGRPcF0pOworICAgICAgICAgIGlmIChPcHMuc2l6ZSgpID09IDIpIHJldHVybiBPdXRlck11bDsKKyAgICAgICAgICBpZiAoQWRkT3AgPCBJZHgpIHsKKyAgICAgICAgICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKStBZGRPcCk7CisgICAgICAgICAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkrSWR4LTEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkrSWR4KTsKKyAgICAgICAgICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKStBZGRPcC0xKTsKKyAgICAgICAgICB9CisgICAgICAgICAgT3BzLnB1c2hfYmFjayhPdXRlck11bCk7CisgICAgICAgICAgcmV0dXJuIGdldEFkZEV4cHIoT3BzKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDaGVjayB0aGlzIG11bHRpcGx5IGFnYWluc3Qgb3RoZXIgbXVsdGlwbGllcyBiZWluZyBhZGRlZCB0b2dldGhlci4KKyAgICAgIGZvciAodW5zaWduZWQgT3RoZXJNdWxJZHggPSBJZHgrMTsKKyAgICAgICAgICAgT3RoZXJNdWxJZHggPCBPcHMuc2l6ZSgpICYmIGlzYTxTQ0VWTXVsRXhwcj4oT3BzW090aGVyTXVsSWR4XSk7CisgICAgICAgICAgICsrT3RoZXJNdWxJZHgpIHsKKyAgICAgICAgY29uc3QgU0NFVk11bEV4cHIgKk90aGVyTXVsID0gY2FzdDxTQ0VWTXVsRXhwcj4oT3BzW090aGVyTXVsSWR4XSk7CisgICAgICAgIC8vIElmIE11bE9wIG9jY3VycyBpbiBPdGhlck11bCwgd2UgY2FuIGZvbGQgdGhlIHR3byBtdWx0aXBsaWVzCisgICAgICAgIC8vIHRvZ2V0aGVyLgorICAgICAgICBmb3IgKHVuc2lnbmVkIE9NdWxPcCA9IDAsIGUgPSBPdGhlck11bC0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgICAgICAgICBPTXVsT3AgIT0gZTsgKytPTXVsT3ApCisgICAgICAgICAgaWYgKE90aGVyTXVsLT5nZXRPcGVyYW5kKE9NdWxPcCkgPT0gTXVsT3BTQ0VWKSB7CisgICAgICAgICAgICAvLyBGb2xkIFggKyAoQSpCKkMpICsgKEEqRCpFKSAtLT4gWCArIChBKihCKkMrRCpFKSkKKyAgICAgICAgICAgIGNvbnN0IFNDRVYgKklubmVyTXVsMSA9IE11bC0+Z2V0T3BlcmFuZChNdWxPcCA9PSAwKTsKKyAgICAgICAgICAgIGlmIChNdWwtPmdldE51bU9wZXJhbmRzKCkgIT0gMikgeworICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE11bE9wcyhNdWwtPm9wX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bC0+b3BfZW5kKCkpOworICAgICAgICAgICAgICBNdWxPcHMuZXJhc2UoTXVsT3BzLmJlZ2luKCkrTXVsT3ApOworICAgICAgICAgICAgICBJbm5lck11bDEgPSBnZXRNdWxFeHByKE11bE9wcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBTQ0VWICpJbm5lck11bDIgPSBPdGhlck11bC0+Z2V0T3BlcmFuZChPTXVsT3AgPT0gMCk7CisgICAgICAgICAgICBpZiAoT3RoZXJNdWwtPmdldE51bU9wZXJhbmRzKCkgIT0gMikgeworICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE11bE9wcyhPdGhlck11bC0+b3BfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJNdWwtPm9wX2VuZCgpKTsKKyAgICAgICAgICAgICAgTXVsT3BzLmVyYXNlKE11bE9wcy5iZWdpbigpK09NdWxPcCk7CisgICAgICAgICAgICAgIElubmVyTXVsMiA9IGdldE11bEV4cHIoTXVsT3BzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IFNDRVYgKklubmVyTXVsU3VtID0gZ2V0QWRkRXhwcihJbm5lck11bDEsSW5uZXJNdWwyKTsKKyAgICAgICAgICAgIGNvbnN0IFNDRVYgKk91dGVyTXVsID0gZ2V0TXVsRXhwcihNdWxPcFNDRVYsIElubmVyTXVsU3VtKTsKKyAgICAgICAgICAgIGlmIChPcHMuc2l6ZSgpID09IDIpIHJldHVybiBPdXRlck11bDsKKyAgICAgICAgICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKStJZHgpOworICAgICAgICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK090aGVyTXVsSWR4LTEpOworICAgICAgICAgICAgT3BzLnB1c2hfYmFjayhPdXRlck11bCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0QWRkRXhwcihPcHMpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBJZiB0aGVyZSBhcmUgYW55IGFkZCByZWN1cnJlbmNlcyBpbiB0aGUgb3BlcmFuZHMgbGlzdCwgc2VlIGlmIGFueSBvdGhlcgorICAvLyBhZGRlZCB2YWx1ZXMgYXJlIGxvb3AgaW52YXJpYW50LiAgSWYgc28sIHdlIGNhbiBmb2xkIHRoZW0gaW50byB0aGUKKyAgLy8gcmVjdXJyZW5jZS4KKyAgd2hpbGUgKElkeCA8IE9wcy5zaXplKCkgJiYgT3BzW0lkeF0tPmdldFNDRVZUeXBlKCkgPCBzY0FkZFJlY0V4cHIpCisgICAgKytJZHg7CisKKyAgLy8gU2NhbiBvdmVyIGFsbCByZWN1cnJlbmNlcywgdHJ5aW5nIHRvIGZvbGQgbG9vcCBpbnZhcmlhbnRzIGludG8gdGhlbS4KKyAgZm9yICg7IElkeCA8IE9wcy5zaXplKCkgJiYgaXNhPFNDRVZBZGRSZWNFeHByPihPcHNbSWR4XSk7ICsrSWR4KSB7CisgICAgLy8gU2NhbiBhbGwgb2YgdGhlIG90aGVyIG9wZXJhbmRzIHRvIHRoaXMgYWRkIGFuZCBhZGQgdGhlbSB0byB0aGUgdmVjdG9yIGlmCisgICAgLy8gdGhleSBhcmUgbG9vcCBpbnZhcmlhbnQgdy5yLnQuIHRoZSByZWN1cnJlbmNlLgorICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgOD4gTElPcHM7CisgICAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFkZFJlYyA9IGNhc3Q8U0NFVkFkZFJlY0V4cHI+KE9wc1tJZHhdKTsKKyAgICBjb25zdCBMb29wICpBZGRSZWNMb29wID0gQWRkUmVjLT5nZXRMb29wKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKE9wc1tpXS0+aXNMb29wSW52YXJpYW50KEFkZFJlY0xvb3ApKSB7CisgICAgICAgIExJT3BzLnB1c2hfYmFjayhPcHNbaV0pOworICAgICAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkraSk7CisgICAgICAgIC0taTsgLS1lOworICAgICAgfQorCisgICAgLy8gSWYgd2UgZm91bmQgc29tZSBsb29wIGludmFyaWFudHMsIGZvbGQgdGhlbSBpbnRvIHRoZSByZWN1cnJlbmNlLgorICAgIGlmICghTElPcHMuZW1wdHkoKSkgeworICAgICAgLy8gIE5MSSArIExJICsge1N0YXJ0LCssU3RlcH0gIC0tPiAgTkxJICsge0xJK1N0YXJ0LCssU3RlcH0KKyAgICAgIExJT3BzLnB1c2hfYmFjayhBZGRSZWMtPmdldFN0YXJ0KCkpOworCisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IEFkZFJlY09wcyhBZGRSZWMtPm9wX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRSZWMtPm9wX2VuZCgpKTsKKyAgICAgIEFkZFJlY09wc1swXSA9IGdldEFkZEV4cHIoTElPcHMpOworCisgICAgICAvLyBCdWlsZCB0aGUgbmV3IGFkZHJlYy4gUHJvcGFnYXRlIHRoZSBOVVcgYW5kIE5TVyBmbGFncyBpZiBib3RoIHRoZQorICAgICAgLy8gb3V0ZXIgYWRkIGFuZCB0aGUgaW5uZXIgYWRkcmVjIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgbm8gb3ZlcmZsb3cuCisgICAgICBjb25zdCBTQ0VWICpOZXdSZWMgPSBnZXRBZGRSZWNFeHByKEFkZFJlY09wcywgQWRkUmVjTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzTlVXICYmIEFkZFJlYy0+aGFzTm9VbnNpZ25lZFdyYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzTlNXICYmIEFkZFJlYy0+aGFzTm9TaWduZWRXcmFwKCkpOworCisgICAgICAvLyBJZiBhbGwgb2YgdGhlIG90aGVyIG9wZXJhbmRzIHdlcmUgbG9vcCBpbnZhcmlhbnQsIHdlIGFyZSBkb25lLgorICAgICAgaWYgKE9wcy5zaXplKCkgPT0gMSkgcmV0dXJuIE5ld1JlYzsKKworICAgICAgLy8gT3RoZXJ3aXNlLCBhZGQgdGhlIGZvbGRlZCBBZGRSZWMgYnkgdGhlIG5vbi1saXYgcGFydHMuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOzsgKytpKQorICAgICAgICBpZiAoT3BzW2ldID09IEFkZFJlYykgeworICAgICAgICAgIE9wc1tpXSA9IE5ld1JlYzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIGdldEFkZEV4cHIoT3BzKTsKKyAgICB9CisKKyAgICAvLyBPa2F5LCBpZiB0aGVyZSB3ZXJlbid0IGFueSBsb29wIGludmFyaWFudHMgdG8gYmUgZm9sZGVkLCBjaGVjayB0byBzZWUgaWYKKyAgICAvLyB0aGVyZSBhcmUgbXVsdGlwbGUgQWRkUmVjJ3Mgd2l0aCB0aGUgc2FtZSBsb29wIGluZHVjdGlvbiB2YXJpYWJsZSBiZWluZworICAgIC8vIGFkZGVkIHRvZ2V0aGVyLiAgSWYgc28sIHdlIGNhbiBmb2xkIHRoZW0uCisgICAgZm9yICh1bnNpZ25lZCBPdGhlcklkeCA9IElkeCsxOworICAgICAgICAgT3RoZXJJZHggPCBPcHMuc2l6ZSgpICYmIGlzYTxTQ0VWQWRkUmVjRXhwcj4oT3BzW090aGVySWR4XSk7KytPdGhlcklkeCkKKyAgICAgIGlmIChPdGhlcklkeCAhPSBJZHgpIHsKKyAgICAgICAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKk90aGVyQWRkUmVjID0gY2FzdDxTQ0VWQWRkUmVjRXhwcj4oT3BzW090aGVySWR4XSk7CisgICAgICAgIGlmIChBZGRSZWNMb29wID09IE90aGVyQWRkUmVjLT5nZXRMb29wKCkpIHsKKyAgICAgICAgICAvLyBPdGhlciArIHtBLCssQn0gKyB7QywrLER9ICAtLT4gIE90aGVyICsge0ErQywrLEIrRH0KKyAgICAgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE5ld09wcyhBZGRSZWMtPm9wX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUmVjLT5vcF9lbmQoKSk7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE90aGVyQWRkUmVjLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKGkgPj0gTmV3T3BzLnNpemUoKSkgeworICAgICAgICAgICAgICBOZXdPcHMuYXBwZW5kKE90aGVyQWRkUmVjLT5vcF9iZWdpbigpK2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJBZGRSZWMtPm9wX2VuZCgpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOZXdPcHNbaV0gPSBnZXRBZGRFeHByKE5ld09wc1tpXSwgT3RoZXJBZGRSZWMtPmdldE9wZXJhbmQoaSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb25zdCBTQ0VWICpOZXdBZGRSZWMgPSBnZXRBZGRSZWNFeHByKE5ld09wcywgQWRkUmVjTG9vcCk7CisKKyAgICAgICAgICBpZiAoT3BzLnNpemUoKSA9PSAyKSByZXR1cm4gTmV3QWRkUmVjOworCisgICAgICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK0lkeCk7CisgICAgICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK090aGVySWR4LTEpOworICAgICAgICAgIE9wcy5wdXNoX2JhY2soTmV3QWRkUmVjKTsKKyAgICAgICAgICByZXR1cm4gZ2V0QWRkRXhwcihPcHMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAvLyBPdGhlcndpc2UgY291bGRuJ3QgZm9sZCBhbnl0aGluZyBpbnRvIHRoaXMgcmVjdXJyZW5jZS4gIE1vdmUgb250byB0aGUKKyAgICAvLyBuZXh0IG9uZS4KKyAgfQorCisgIC8vIE9rYXksIGl0IGxvb2tzIGxpa2Ugd2UgcmVhbGx5IERPIG5lZWQgYW4gYWRkIGV4cHIuICBDaGVjayB0byBzZWUgaWYgd2UKKyAgLy8gYWxyZWFkeSBoYXZlIG9uZSwgb3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBvbmUuCisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIElELkFkZEludGVnZXIoc2NBZGRFeHByKTsKKyAgSUQuQWRkSW50ZWdlcihPcHMuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIElELkFkZFBvaW50ZXIoT3BzW2ldKTsKKyAgdm9pZCAqSVAgPSAwOworICBTQ0VWQWRkRXhwciAqUyA9CisgICAgc3RhdGljX2Nhc3Q8U0NFVkFkZEV4cHIgKj4oVW5pcXVlU0NFVnMuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKTsKKyAgaWYgKCFTKSB7CisgICAgY29uc3QgU0NFViAqKk8gPSBTQ0VWQWxsb2NhdG9yLkFsbG9jYXRlPGNvbnN0IFNDRVYgKj4oT3BzLnNpemUoKSk7CisgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoT3BzLmJlZ2luKCksIE9wcy5lbmQoKSwgTyk7CisgICAgUyA9IG5ldyAoU0NFVkFsbG9jYXRvcikgU0NFVkFkZEV4cHIoSUQuSW50ZXJuKFNDRVZBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8sIE9wcy5zaXplKCkpOworICAgIFVuaXF1ZVNDRVZzLkluc2VydE5vZGUoUywgSVApOworICB9CisgIGlmIChIYXNOVVcpIFMtPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICBpZiAoSGFzTlNXKSBTLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgIHJldHVybiBTOworfQorCisvLy8gZ2V0TXVsRXhwciAtIEdldCBhIGNhbm9uaWNhbCBtdWx0aXBseSBleHByZXNzaW9uLCBvciBzb21ldGhpbmcgc2ltcGxlciBpZgorLy8vIHBvc3NpYmxlLgorY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRNdWxFeHByKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcsIGJvb2wgSGFzTlNXKSB7CisgIGFzc2VydCghT3BzLmVtcHR5KCkgJiYgIkNhbm5vdCBnZXQgZW1wdHkgbXVsISIpOworICBpZiAoT3BzLnNpemUoKSA9PSAxKSByZXR1cm4gT3BzWzBdOworI2lmbmRlZiBOREVCVUcKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGFzc2VydChnZXRFZmZlY3RpdmVTQ0VWVHlwZShPcHNbaV0tPmdldFR5cGUoKSkgPT0KKyAgICAgICAgICAgZ2V0RWZmZWN0aXZlU0NFVlR5cGUoT3BzWzBdLT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICJTQ0VWTXVsRXhwciBvcGVyYW5kIHR5cGVzIGRvbid0IG1hdGNoISIpOworI2VuZGlmCisKKyAgLy8gSWYgSGFzTlNXIGlzIHRydWUgYW5kIGFsbCB0aGUgb3BlcmFuZHMgYXJlIG5vbi1uZWdhdGl2ZSwgaW5mZXIgSGFzTlVXLgorICBpZiAoIUhhc05VVyAmJiBIYXNOU1cpIHsKKyAgICBib29sIEFsbCA9IHRydWU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKCFpc0tub3duTm9uTmVnYXRpdmUoT3BzW2ldKSkgeworICAgICAgICBBbGwgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgaWYgKEFsbCkgSGFzTlVXID0gdHJ1ZTsKKyAgfQorCisgIC8vIFNvcnQgYnkgY29tcGxleGl0eSwgdGhpcyBncm91cHMgYWxsIHNpbWlsYXIgZXhwcmVzc2lvbiB0eXBlcyB0b2dldGhlci4KKyAgR3JvdXBCeUNvbXBsZXhpdHkoT3BzLCBMSSk7CisKKyAgLy8gSWYgdGhlcmUgYXJlIGFueSBjb25zdGFudHMsIGZvbGQgdGhlbSB0b2dldGhlci4KKyAgdW5zaWduZWQgSWR4ID0gMDsKKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqTEhTQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oT3BzWzBdKSkgeworCisgICAgLy8gQzEqKEMyK1YpIC0+IEMxKkMyICsgQzEqVgorICAgIGlmIChPcHMuc2l6ZSgpID09IDIpCisgICAgICBpZiAoY29uc3QgU0NFVkFkZEV4cHIgKkFkZCA9IGR5bl9jYXN0PFNDRVZBZGRFeHByPihPcHNbMV0pKQorICAgICAgICBpZiAoQWRkLT5nZXROdW1PcGVyYW5kcygpID09IDIgJiYKKyAgICAgICAgICAgIGlzYTxTQ0VWQ29uc3RhbnQ+KEFkZC0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICAgICAgcmV0dXJuIGdldEFkZEV4cHIoZ2V0TXVsRXhwcihMSFNDLCBBZGQtPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE11bEV4cHIoTEhTQywgQWRkLT5nZXRPcGVyYW5kKDEpKSk7CisKKyAgICArK0lkeDsKKyAgICB3aGlsZSAoY29uc3QgU0NFVkNvbnN0YW50ICpSSFNDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihPcHNbSWR4XSkpIHsKKyAgICAgIC8vIFdlIGZvdW5kIHR3byBjb25zdGFudHMsIGZvbGQgdGhlbSB0b2dldGhlciEKKyAgICAgIENvbnN0YW50SW50ICpGb2xkID0gQ29uc3RhbnRJbnQ6OmdldChnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKSk7CisgICAgICBPcHNbMF0gPSBnZXRDb25zdGFudChGb2xkKTsKKyAgICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKSsxKTsgIC8vIEVyYXNlIHRoZSBmb2xkZWQgZWxlbWVudAorICAgICAgaWYgKE9wcy5zaXplKCkgPT0gMSkgcmV0dXJuIE9wc1swXTsKKyAgICAgIExIU0MgPSBjYXN0PFNDRVZDb25zdGFudD4oT3BzWzBdKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBhcmUgbGVmdCB3aXRoIGEgY29uc3RhbnQgb25lIGJlaW5nIG11bHRpcGxpZWQsIHN0cmlwIGl0IG9mZi4KKyAgICBpZiAoY2FzdDxTQ0VWQ29uc3RhbnQ+KE9wc1swXSktPmdldFZhbHVlKCktPmVxdWFsc0ludCgxKSkgeworICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpKTsKKyAgICAgIC0tSWR4OworICAgIH0gZWxzZSBpZiAoY2FzdDxTQ0VWQ29uc3RhbnQ+KE9wc1swXSktPmdldFZhbHVlKCktPmlzWmVybygpKSB7CisgICAgICAvLyBJZiB3ZSBoYXZlIGEgbXVsdGlwbHkgb2YgemVybywgaXQgd2lsbCBhbHdheXMgYmUgemVyby4KKyAgICAgIHJldHVybiBPcHNbMF07CisgICAgfSBlbHNlIGlmIChPcHNbMF0tPmlzQWxsT25lc1ZhbHVlKCkpIHsKKyAgICAgIC8vIElmIHdlIGhhdmUgYSBtdWwgYnkgLTEgb2YgYW4gYWRkLCB0cnkgZGlzdHJpYnV0aW5nIHRoZSAtMSBhbW9uZyB0aGUKKyAgICAgIC8vIGFkZCBvcGVyYW5kcy4KKyAgICAgIGlmIChPcHMuc2l6ZSgpID09IDIpCisgICAgICAgIGlmIChjb25zdCBTQ0VWQWRkRXhwciAqQWRkID0gZHluX2Nhc3Q8U0NFVkFkZEV4cHI+KE9wc1sxXSkpIHsKKyAgICAgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE5ld09wczsKKyAgICAgICAgICBib29sIEFueUZvbGRlZCA9IGZhbHNlOworICAgICAgICAgIGZvciAoU0NFVkFkZFJlY0V4cHI6Om9wX2l0ZXJhdG9yIEkgPSBBZGQtPm9wX2JlZ2luKCksIEUgPSBBZGQtPm9wX2VuZCgpOworICAgICAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgICAgIGNvbnN0IFNDRVYgKk11bCA9IGdldE11bEV4cHIoT3BzWzBdLCAqSSk7CisgICAgICAgICAgICBpZiAoIWlzYTxTQ0VWTXVsRXhwcj4oTXVsKSkgQW55Rm9sZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIE5ld09wcy5wdXNoX2JhY2soTXVsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKEFueUZvbGRlZCkKKyAgICAgICAgICAgIHJldHVybiBnZXRBZGRFeHByKE5ld09wcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoT3BzLnNpemUoKSA9PSAxKQorICAgICAgcmV0dXJuIE9wc1swXTsKKyAgfQorCisgIC8vIFNraXAgb3ZlciB0aGUgYWRkIGV4cHJlc3Npb24gdW50aWwgd2UgZ2V0IHRvIGEgbXVsdGlwbHkuCisgIHdoaWxlIChJZHggPCBPcHMuc2l6ZSgpICYmIE9wc1tJZHhdLT5nZXRTQ0VWVHlwZSgpIDwgc2NNdWxFeHByKQorICAgICsrSWR4OworCisgIC8vIElmIHRoZXJlIGFyZSBtdWwgb3BlcmFuZHMgaW5saW5lIHRoZW0gYWxsIGludG8gdGhpcyBleHByZXNzaW9uLgorICBpZiAoSWR4IDwgT3BzLnNpemUoKSkgeworICAgIGJvb2wgRGVsZXRlZE11bCA9IGZhbHNlOworICAgIHdoaWxlIChjb25zdCBTQ0VWTXVsRXhwciAqTXVsID0gZHluX2Nhc3Q8U0NFVk11bEV4cHI+KE9wc1tJZHhdKSkgeworICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBtdWwsIGV4cGFuZCB0aGUgbXVsIG9wZXJhbmRzIG9udG8gdGhlIGVuZCBvZiB0aGUgb3BlcmFuZHMKKyAgICAgIC8vIGxpc3QuCisgICAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkrSWR4KTsKKyAgICAgIE9wcy5hcHBlbmQoTXVsLT5vcF9iZWdpbigpLCBNdWwtPm9wX2VuZCgpKTsKKyAgICAgIERlbGV0ZWRNdWwgPSB0cnVlOworICAgIH0KKworICAgIC8vIElmIHdlIGRlbGV0ZWQgYXQgbGVhc3Qgb25lIG11bCwgd2UgYWRkZWQgb3BlcmFuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwKKyAgICAvLyBhbmQgdGhleSBhcmUgbm90IG5lY2Vzc2FyaWx5IHNvcnRlZC4gIFJlY3Vyc2UgdG8gcmVzb3J0IGFuZCByZXNpbXBsaWZ5CisgICAgLy8gYW55IG9wZXJhbmRzIHdlIGp1c3QgYWNxdWlyZWQuCisgICAgaWYgKERlbGV0ZWRNdWwpCisgICAgICByZXR1cm4gZ2V0TXVsRXhwcihPcHMpOworICB9CisKKyAgLy8gSWYgdGhlcmUgYXJlIGFueSBhZGQgcmVjdXJyZW5jZXMgaW4gdGhlIG9wZXJhbmRzIGxpc3QsIHNlZSBpZiBhbnkgb3RoZXIKKyAgLy8gYWRkZWQgdmFsdWVzIGFyZSBsb29wIGludmFyaWFudC4gIElmIHNvLCB3ZSBjYW4gZm9sZCB0aGVtIGludG8gdGhlCisgIC8vIHJlY3VycmVuY2UuCisgIHdoaWxlIChJZHggPCBPcHMuc2l6ZSgpICYmIE9wc1tJZHhdLT5nZXRTQ0VWVHlwZSgpIDwgc2NBZGRSZWNFeHByKQorICAgICsrSWR4OworCisgIC8vIFNjYW4gb3ZlciBhbGwgcmVjdXJyZW5jZXMsIHRyeWluZyB0byBmb2xkIGxvb3AgaW52YXJpYW50cyBpbnRvIHRoZW0uCisgIGZvciAoOyBJZHggPCBPcHMuc2l6ZSgpICYmIGlzYTxTQ0VWQWRkUmVjRXhwcj4oT3BzW0lkeF0pOyArK0lkeCkgeworICAgIC8vIFNjYW4gYWxsIG9mIHRoZSBvdGhlciBvcGVyYW5kcyB0byB0aGlzIG11bCBhbmQgYWRkIHRoZW0gdG8gdGhlIHZlY3RvciBpZgorICAgIC8vIHRoZXkgYXJlIGxvb3AgaW52YXJpYW50IHcuci50LiB0aGUgcmVjdXJyZW5jZS4KKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IExJT3BzOworICAgIGNvbnN0IFNDRVZBZGRSZWNFeHByICpBZGRSZWMgPSBjYXN0PFNDRVZBZGRSZWNFeHByPihPcHNbSWR4XSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKE9wc1tpXS0+aXNMb29wSW52YXJpYW50KEFkZFJlYy0+Z2V0TG9vcCgpKSkgeworICAgICAgICBMSU9wcy5wdXNoX2JhY2soT3BzW2ldKTsKKyAgICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK2kpOworICAgICAgICAtLWk7IC0tZTsKKyAgICAgIH0KKworICAgIC8vIElmIHdlIGZvdW5kIHNvbWUgbG9vcCBpbnZhcmlhbnRzLCBmb2xkIHRoZW0gaW50byB0aGUgcmVjdXJyZW5jZS4KKyAgICBpZiAoIUxJT3BzLmVtcHR5KCkpIHsKKyAgICAgIC8vICBOTEkgKiBMSSAqIHtTdGFydCwrLFN0ZXB9ICAtLT4gIE5MSSAqIHtMSSpTdGFydCwrLExJKlN0ZXB9CisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE5ld09wczsKKyAgICAgIE5ld09wcy5yZXNlcnZlKEFkZFJlYy0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgICAgICBjb25zdCBTQ0VWICpTY2FsZSA9IGdldE11bEV4cHIoTElPcHMpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFkZFJlYy0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIE5ld09wcy5wdXNoX2JhY2soZ2V0TXVsRXhwcihTY2FsZSwgQWRkUmVjLT5nZXRPcGVyYW5kKGkpKSk7CisKKyAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgYWRkcmVjLiBQcm9wYWdhdGUgdGhlIE5VVyBhbmQgTlNXIGZsYWdzIGlmIGJvdGggdGhlCisgICAgICAvLyBvdXRlciBtdWwgYW5kIHRoZSBpbm5lciBhZGRyZWMgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBubyBvdmVyZmxvdy4KKyAgICAgIGNvbnN0IFNDRVYgKk5ld1JlYyA9IGdldEFkZFJlY0V4cHIoTmV3T3BzLCBBZGRSZWMtPmdldExvb3AoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzTlVXICYmIEFkZFJlYy0+aGFzTm9VbnNpZ25lZFdyYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzTlNXICYmIEFkZFJlYy0+aGFzTm9TaWduZWRXcmFwKCkpOworCisgICAgICAvLyBJZiBhbGwgb2YgdGhlIG90aGVyIG9wZXJhbmRzIHdlcmUgbG9vcCBpbnZhcmlhbnQsIHdlIGFyZSBkb25lLgorICAgICAgaWYgKE9wcy5zaXplKCkgPT0gMSkgcmV0dXJuIE5ld1JlYzsKKworICAgICAgLy8gT3RoZXJ3aXNlLCBtdWx0aXBseSB0aGUgZm9sZGVkIEFkZFJlYyBieSB0aGUgbm9uLWxpdiBwYXJ0cy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7OyArK2kpCisgICAgICAgIGlmIChPcHNbaV0gPT0gQWRkUmVjKSB7CisgICAgICAgICAgT3BzW2ldID0gTmV3UmVjOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICByZXR1cm4gZ2V0TXVsRXhwcihPcHMpOworICAgIH0KKworICAgIC8vIE9rYXksIGlmIHRoZXJlIHdlcmVuJ3QgYW55IGxvb3AgaW52YXJpYW50cyB0byBiZSBmb2xkZWQsIGNoZWNrIHRvIHNlZSBpZgorICAgIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSBBZGRSZWMncyB3aXRoIHRoZSBzYW1lIGxvb3AgaW5kdWN0aW9uIHZhcmlhYmxlIGJlaW5nCisgICAgLy8gbXVsdGlwbGllZCB0b2dldGhlci4gIElmIHNvLCB3ZSBjYW4gZm9sZCB0aGVtLgorICAgIGZvciAodW5zaWduZWQgT3RoZXJJZHggPSBJZHgrMTsKKyAgICAgICAgIE90aGVySWR4IDwgT3BzLnNpemUoKSAmJiBpc2E8U0NFVkFkZFJlY0V4cHI+KE9wc1tPdGhlcklkeF0pOysrT3RoZXJJZHgpCisgICAgICBpZiAoT3RoZXJJZHggIT0gSWR4KSB7CisgICAgICAgIGNvbnN0IFNDRVZBZGRSZWNFeHByICpPdGhlckFkZFJlYyA9IGNhc3Q8U0NFVkFkZFJlY0V4cHI+KE9wc1tPdGhlcklkeF0pOworICAgICAgICBpZiAoQWRkUmVjLT5nZXRMb29wKCkgPT0gT3RoZXJBZGRSZWMtPmdldExvb3AoKSkgeworICAgICAgICAgIC8vIEYgKiBHICAtLT4gIHtBLCssQn0gKiB7QywrLER9ICAtLT4gIHtBKkMsKyxGKkQgKyBHKkIgKyBCKkR9CisgICAgICAgICAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKkYgPSBBZGRSZWMsICpHID0gT3RoZXJBZGRSZWM7CisgICAgICAgICAgY29uc3QgU0NFViAqTmV3U3RhcnQgPSBnZXRNdWxFeHByKEYtPmdldFN0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRy0+Z2V0U3RhcnQoKSk7CisgICAgICAgICAgY29uc3QgU0NFViAqQiA9IEYtPmdldFN0ZXBSZWN1cnJlbmNlKCp0aGlzKTsKKyAgICAgICAgICBjb25zdCBTQ0VWICpEID0gRy0+Z2V0U3RlcFJlY3VycmVuY2UoKnRoaXMpOworICAgICAgICAgIGNvbnN0IFNDRVYgKk5ld1N0ZXAgPSBnZXRBZGRFeHByKGdldE11bEV4cHIoRiwgRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNdWxFeHByKEcsIEIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TXVsRXhwcihCLCBEKSk7CisgICAgICAgICAgY29uc3QgU0NFViAqTmV3QWRkUmVjID0gZ2V0QWRkUmVjRXhwcihOZXdTdGFydCwgTmV3U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi0+Z2V0TG9vcCgpKTsKKyAgICAgICAgICBpZiAoT3BzLnNpemUoKSA9PSAyKSByZXR1cm4gTmV3QWRkUmVjOworCisgICAgICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK0lkeCk7CisgICAgICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK090aGVySWR4LTEpOworICAgICAgICAgIE9wcy5wdXNoX2JhY2soTmV3QWRkUmVjKTsKKyAgICAgICAgICByZXR1cm4gZ2V0TXVsRXhwcihPcHMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAvLyBPdGhlcndpc2UgY291bGRuJ3QgZm9sZCBhbnl0aGluZyBpbnRvIHRoaXMgcmVjdXJyZW5jZS4gIE1vdmUgb250byB0aGUKKyAgICAvLyBuZXh0IG9uZS4KKyAgfQorCisgIC8vIE9rYXksIGl0IGxvb2tzIGxpa2Ugd2UgcmVhbGx5IERPIG5lZWQgYW4gbXVsIGV4cHIuICBDaGVjayB0byBzZWUgaWYgd2UKKyAgLy8gYWxyZWFkeSBoYXZlIG9uZSwgb3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBvbmUuCisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIElELkFkZEludGVnZXIoc2NNdWxFeHByKTsKKyAgSUQuQWRkSW50ZWdlcihPcHMuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIElELkFkZFBvaW50ZXIoT3BzW2ldKTsKKyAgdm9pZCAqSVAgPSAwOworICBTQ0VWTXVsRXhwciAqUyA9CisgICAgc3RhdGljX2Nhc3Q8U0NFVk11bEV4cHIgKj4oVW5pcXVlU0NFVnMuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKTsKKyAgaWYgKCFTKSB7CisgICAgY29uc3QgU0NFViAqKk8gPSBTQ0VWQWxsb2NhdG9yLkFsbG9jYXRlPGNvbnN0IFNDRVYgKj4oT3BzLnNpemUoKSk7CisgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoT3BzLmJlZ2luKCksIE9wcy5lbmQoKSwgTyk7CisgICAgUyA9IG5ldyAoU0NFVkFsbG9jYXRvcikgU0NFVk11bEV4cHIoSUQuSW50ZXJuKFNDRVZBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8sIE9wcy5zaXplKCkpOworICAgIFVuaXF1ZVNDRVZzLkluc2VydE5vZGUoUywgSVApOworICB9CisgIGlmIChIYXNOVVcpIFMtPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICBpZiAoSGFzTlNXKSBTLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgIHJldHVybiBTOworfQorCisvLy8gZ2V0VURpdkV4cHIgLSBHZXQgYSBjYW5vbmljYWwgdW5zaWduZWQgZGl2aXNpb24gZXhwcmVzc2lvbiwgb3Igc29tZXRoaW5nCisvLy8gc2ltcGxlciBpZiBwb3NzaWJsZS4KK2NvbnN0IFNDRVYgKlNjYWxhckV2b2x1dGlvbjo6Z2V0VURpdkV4cHIoY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMpIHsKKyAgYXNzZXJ0KGdldEVmZmVjdGl2ZVNDRVZUeXBlKExIUy0+Z2V0VHlwZSgpKSA9PQorICAgICAgICAgZ2V0RWZmZWN0aXZlU0NFVlR5cGUoUkhTLT5nZXRUeXBlKCkpICYmCisgICAgICAgICAiU0NFVlVEaXZFeHByIG9wZXJhbmQgdHlwZXMgZG9uJ3QgbWF0Y2ghIik7CisKKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqUkhTQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oUkhTKSkgeworICAgIGlmIChSSFNDLT5nZXRWYWx1ZSgpLT5lcXVhbHNJbnQoMSkpCisgICAgICByZXR1cm4gTEhTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYIHVkaXYgMSAtLT4geAorICAgIC8vIElmIHRoZSBkZW5vbWluYXRvciBpcyB6ZXJvLCB0aGUgcmVzdWx0IG9mIHRoZSB1ZGl2IGlzIHVuZGVmaW5lZC4gRG9uJ3QKKyAgICAvLyB0cnkgdG8gYW5hbHl6ZSBpdCwgYmVjYXVzZSB0aGUgcmVzb2x1dGlvbiBjaG9zZW4gaGVyZSBtYXkgZGlmZmVyIGZyb20KKyAgICAvLyB0aGUgcmVzb2x1dGlvbiBjaG9zZW4gaW4gb3RoZXIgcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICAgIGlmICghUkhTQy0+Z2V0VmFsdWUoKS0+aXNaZXJvKCkpIHsKKyAgICAgIC8vIERldGVybWluZSBpZiB0aGUgZGl2aXNpb24gY2FuIGJlIGZvbGRlZCBpbnRvIHRoZSBvcGVyYW5kcyBvZgorICAgICAgLy8gaXRzIG9wZXJhbmRzLgorICAgICAgLy8gVE9ETzogR2VuZXJhbGl6ZSB0aGlzIHRvIG5vbi1jb25zdGFudHMgYnkgdXNpbmcga25vd24tYml0cyBpbmZvcm1hdGlvbi4KKyAgICAgIGNvbnN0IFR5cGUgKlR5ID0gTEhTLT5nZXRUeXBlKCk7CisgICAgICB1bnNpZ25lZCBMWiA9IFJIU0MtPmdldFZhbHVlKCktPmdldFZhbHVlKCkuY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgICAgIHVuc2lnbmVkIE1heFNoaWZ0QW10ID0gZ2V0VHlwZVNpemVJbkJpdHMoVHkpIC0gTFogLSAxOworICAgICAgLy8gRm9yIG5vbi1wb3dlci1vZi10d28gdmFsdWVzLCBlZmZlY3RpdmVseSByb3VuZCB0aGUgdmFsdWUgdXAgdG8gdGhlCisgICAgICAvLyBuZWFyZXN0IHBvd2VyIG9mIHR3by4KKyAgICAgIGlmICghUkhTQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKS5pc1Bvd2VyT2YyKCkpCisgICAgICAgICsrTWF4U2hpZnRBbXQ7CisgICAgICBjb25zdCBJbnRlZ2VyVHlwZSAqRXh0VHkgPQorICAgICAgICBJbnRlZ2VyVHlwZTo6Z2V0KGdldENvbnRleHQoKSwgZ2V0VHlwZVNpemVJbkJpdHMoVHkpICsgTWF4U2hpZnRBbXQpOworICAgICAgLy8ge1gsKyxOfS9DIC0tPiB7WC9DLCssTi9DfSBpZiBzYWZlIGFuZCBOL0MgY2FuIGJlIGZvbGRlZC4KKyAgICAgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oTEhTKSkKKyAgICAgICAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqU3RlcCA9CisgICAgICAgICAgICAgIGR5bl9jYXN0PFNDRVZDb25zdGFudD4oQVItPmdldFN0ZXBSZWN1cnJlbmNlKCp0aGlzKSkpCisgICAgICAgICAgaWYgKCFTdGVwLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpCisgICAgICAgICAgICAgICAgLnVyZW0oUkhTQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKSkgJiYKKyAgICAgICAgICAgICAgZ2V0WmVyb0V4dGVuZEV4cHIoQVIsIEV4dFR5KSA9PQorICAgICAgICAgICAgICBnZXRBZGRSZWNFeHByKGdldFplcm9FeHRlbmRFeHByKEFSLT5nZXRTdGFydCgpLCBFeHRUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0WmVyb0V4dGVuZEV4cHIoU3RlcCwgRXh0VHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSLT5nZXRMb29wKCkpKSB7CisgICAgICAgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE9wZXJhbmRzOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFSLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKGdldFVEaXZFeHByKEFSLT5nZXRPcGVyYW5kKGkpLCBSSFMpKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRBZGRSZWNFeHByKE9wZXJhbmRzLCBBUi0+Z2V0TG9vcCgpKTsKKyAgICAgICAgICB9CisgICAgICAvLyAoQSpCKS9DIC0tPiBBKihCL0MpIGlmIHNhZmUgYW5kIEIvQyBjYW4gYmUgZm9sZGVkLgorICAgICAgaWYgKGNvbnN0IFNDRVZNdWxFeHByICpNID0gZHluX2Nhc3Q8U0NFVk11bEV4cHI+KExIUykpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiBPcGVyYW5kczsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE0tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhnZXRaZXJvRXh0ZW5kRXhwcihNLT5nZXRPcGVyYW5kKGkpLCBFeHRUeSkpOworICAgICAgICBpZiAoZ2V0WmVyb0V4dGVuZEV4cHIoTSwgRXh0VHkpID09IGdldE11bEV4cHIoT3BlcmFuZHMpKQorICAgICAgICAgIC8vIEZpbmQgYW4gb3BlcmFuZCB0aGF0J3Mgc2FmZWx5IGRpdmlzaWJsZS4KKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IFNDRVYgKk9wID0gTS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRpdiA9IGdldFVEaXZFeHByKE9wLCBSSFNDKTsKKyAgICAgICAgICAgIGlmICghaXNhPFNDRVZVRGl2RXhwcj4oRGl2KSAmJiBnZXRNdWxFeHByKERpdiwgUkhTQykgPT0gT3ApIHsKKyAgICAgICAgICAgICAgT3BlcmFuZHMgPSBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+KE0tPm9wX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNLT5vcF9lbmQoKSk7CisgICAgICAgICAgICAgIE9wZXJhbmRzW2ldID0gRGl2OworICAgICAgICAgICAgICByZXR1cm4gZ2V0TXVsRXhwcihPcGVyYW5kcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gKEErQikvQyAtLT4gKEEvQyArIEIvQykgaWYgc2FmZSBhbmQgQS9DIGFuZCBCL0MgY2FuIGJlIGZvbGRlZC4KKyAgICAgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQSA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihMSFMpKSB7CisgICAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gT3BlcmFuZHM7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soZ2V0WmVyb0V4dGVuZEV4cHIoQS0+Z2V0T3BlcmFuZChpKSwgRXh0VHkpKTsKKyAgICAgICAgaWYgKGdldFplcm9FeHRlbmRFeHByKEEsIEV4dFR5KSA9PSBnZXRBZGRFeHByKE9wZXJhbmRzKSkgeworICAgICAgICAgIE9wZXJhbmRzLmNsZWFyKCk7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEEtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBTQ0VWICpPcCA9IGdldFVEaXZFeHByKEEtPmdldE9wZXJhbmQoaSksIFJIUyk7CisgICAgICAgICAgICBpZiAoaXNhPFNDRVZVRGl2RXhwcj4oT3ApIHx8CisgICAgICAgICAgICAgICAgZ2V0TXVsRXhwcihPcCwgUkhTKSAhPSBBLT5nZXRPcGVyYW5kKGkpKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhPcCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChPcGVyYW5kcy5zaXplKCkgPT0gQS0+Z2V0TnVtT3BlcmFuZHMoKSkKKyAgICAgICAgICAgIHJldHVybiBnZXRBZGRFeHByKE9wZXJhbmRzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBGb2xkIGlmIGJvdGggb3BlcmFuZHMgYXJlIGNvbnN0YW50LgorICAgICAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqTEhTQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oTEhTKSkgeworICAgICAgICBDb25zdGFudCAqTEhTQ1YgPSBMSFNDLT5nZXRWYWx1ZSgpOworICAgICAgICBDb25zdGFudCAqUkhTQ1YgPSBSSFNDLT5nZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnQoY2FzdDxDb25zdGFudEludD4oQ29uc3RhbnRFeHByOjpnZXRVRGl2KExIU0NWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0NWKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIElELkFkZEludGVnZXIoc2NVRGl2RXhwcik7CisgIElELkFkZFBvaW50ZXIoTEhTKTsKKyAgSUQuQWRkUG9pbnRlcihSSFMpOworICB2b2lkICpJUCA9IDA7CisgIGlmIChjb25zdCBTQ0VWICpTID0gVW5pcXVlU0NFVnMuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKSByZXR1cm4gUzsKKyAgU0NFViAqUyA9IG5ldyAoU0NFVkFsbG9jYXRvcikgU0NFVlVEaXZFeHByKElELkludGVybihTQ0VWQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIUywgUkhTKTsKKyAgVW5pcXVlU0NFVnMuSW5zZXJ0Tm9kZShTLCBJUCk7CisgIHJldHVybiBTOworfQorCisKKy8vLyBnZXRBZGRSZWNFeHByIC0gR2V0IGFuIGFkZCByZWN1cnJlbmNlIGV4cHJlc3Npb24gZm9yIHRoZSBzcGVjaWZpZWQgbG9vcC4KKy8vLyBTaW1wbGlmeSB0aGUgZXhwcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLgorY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRBZGRSZWNFeHByKGNvbnN0IFNDRVYgKlN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlN0ZXAsIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcsIGJvb2wgSGFzTlNXKSB7CisgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gT3BlcmFuZHM7CisgIE9wZXJhbmRzLnB1c2hfYmFjayhTdGFydCk7CisgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqU3RlcENocmVjID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KFN0ZXApKQorICAgIGlmIChTdGVwQ2hyZWMtPmdldExvb3AoKSA9PSBMKSB7CisgICAgICBPcGVyYW5kcy5hcHBlbmQoU3RlcENocmVjLT5vcF9iZWdpbigpLCBTdGVwQ2hyZWMtPm9wX2VuZCgpKTsKKyAgICAgIHJldHVybiBnZXRBZGRSZWNFeHByKE9wZXJhbmRzLCBMKTsKKyAgICB9CisKKyAgT3BlcmFuZHMucHVzaF9iYWNrKFN0ZXApOworICByZXR1cm4gZ2V0QWRkUmVjRXhwcihPcGVyYW5kcywgTCwgSGFzTlVXLCBIYXNOU1cpOworfQorCisvLy8gZ2V0QWRkUmVjRXhwciAtIEdldCBhbiBhZGQgcmVjdXJyZW5jZSBleHByZXNzaW9uIGZvciB0aGUgc3BlY2lmaWVkIGxvb3AuCisvLy8gU2ltcGxpZnkgdGhlIGV4cHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZS4KK2NvbnN0IFNDRVYgKgorU2NhbGFyRXZvbHV0aW9uOjpnZXRBZGRSZWNFeHByKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcGVyYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXLCBib29sIEhhc05TVykgeworICBpZiAoT3BlcmFuZHMuc2l6ZSgpID09IDEpIHJldHVybiBPcGVyYW5kc1swXTsKKyNpZm5kZWYgTkRFQlVHCisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBPcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGFzc2VydChnZXRFZmZlY3RpdmVTQ0VWVHlwZShPcGVyYW5kc1tpXS0+Z2V0VHlwZSgpKSA9PQorICAgICAgICAgICBnZXRFZmZlY3RpdmVTQ0VWVHlwZShPcGVyYW5kc1swXS0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgICAiU0NFVkFkZFJlY0V4cHIgb3BlcmFuZCB0eXBlcyBkb24ndCBtYXRjaCEiKTsKKyNlbmRpZgorCisgIGlmIChPcGVyYW5kcy5iYWNrKCktPmlzWmVybygpKSB7CisgICAgT3BlcmFuZHMucG9wX2JhY2soKTsKKyAgICByZXR1cm4gZ2V0QWRkUmVjRXhwcihPcGVyYW5kcywgTCwgSGFzTlVXLCBIYXNOU1cpOyAvLyB7WCwrLDB9ICAtLT4gIFgKKyAgfQorCisgIC8vIEl0J3MgdGVtcHRpbmcgdG8gd2FudCB0byBjYWxsIGdldE1heEJhY2tlZGdlVGFrZW5Db3VudCBjb3VudCBoZXJlIGFuZAorICAvLyB1c2UgdGhhdCBpbmZvcm1hdGlvbiB0byBpbmZlciBOVVcgYW5kIE5TVyBmbGFncy4gSG93ZXZlciwgY29tcHV0aW5nIGEKKyAgLy8gQkUgY291bnQgcmVxdWlyZXMgY2FsbGluZyBnZXRBZGRSZWNFeHByLCBzbyB3ZSBtYXkgbm90IHlldCBoYXZlIGEKKyAgLy8gbWVhbmluZ2Z1bCBCRSBjb3VudCBhdCB0aGlzIHBvaW50IChhbmQgaWYgd2UgZG9uJ3QsIHdlJ2QgYmUgc3R1Y2sKKyAgLy8gd2l0aCBhIFNDRVZDb3VsZE5vdENvbXB1dGUgYXMgdGhlIGNhY2hlZCBCRSBjb3VudCkuCisKKyAgLy8gSWYgSGFzTlNXIGlzIHRydWUgYW5kIGFsbCB0aGUgb3BlcmFuZHMgYXJlIG5vbi1uZWdhdGl2ZSwgaW5mZXIgSGFzTlVXLgorICBpZiAoIUhhc05VVyAmJiBIYXNOU1cpIHsKKyAgICBib29sIEFsbCA9IHRydWU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoIWlzS25vd25Ob25OZWdhdGl2ZShPcGVyYW5kc1tpXSkpIHsKKyAgICAgICAgQWxsID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGlmIChBbGwpIEhhc05VVyA9IHRydWU7CisgIH0KKworICAvLyBDYW5vbmljYWxpemUgbmVzdGVkIEFkZFJlY3MgaW4gYnkgbmVzdGluZyB0aGVtIGluIG9yZGVyIG9mIGxvb3AgZGVwdGguCisgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqTmVzdGVkQVIgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oT3BlcmFuZHNbMF0pKSB7CisgICAgY29uc3QgTG9vcCAqTmVzdGVkTG9vcCA9IE5lc3RlZEFSLT5nZXRMb29wKCk7CisgICAgaWYgKEwtPmNvbnRhaW5zKE5lc3RlZExvb3AtPmdldEhlYWRlcigpKSA/CisgICAgICAgIChMLT5nZXRMb29wRGVwdGgoKSA8IE5lc3RlZExvb3AtPmdldExvb3BEZXB0aCgpKSA6CisgICAgICAgICghTmVzdGVkTG9vcC0+Y29udGFpbnMoTC0+Z2V0SGVhZGVyKCkpICYmCisgICAgICAgICBEVC0+ZG9taW5hdGVzKEwtPmdldEhlYWRlcigpLCBOZXN0ZWRMb29wLT5nZXRIZWFkZXIoKSkpKSB7CisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE5lc3RlZE9wZXJhbmRzKE5lc3RlZEFSLT5vcF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWRBUi0+b3BfZW5kKCkpOworICAgICAgT3BlcmFuZHNbMF0gPSBOZXN0ZWRBUi0+Z2V0U3RhcnQoKTsKKyAgICAgIC8vIEFkZFJlY3MgcmVxdWlyZSB0aGVpciBvcGVyYW5kcyBiZSBsb29wLWludmFyaWFudCB3aXRoIHJlc3BlY3QgdG8gdGhlaXIKKyAgICAgIC8vIGxvb3BzLiBEb24ndCBwZXJmb3JtIHRoaXMgdHJhbnNmb3JtYXRpb24gaWYgaXQgd291bGQgYnJlYWsgdGhpcworICAgICAgLy8gcmVxdWlyZW1lbnQuCisgICAgICBib29sIEFsbEludmFyaWFudCA9IHRydWU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKCFPcGVyYW5kc1tpXS0+aXNMb29wSW52YXJpYW50KEwpKSB7CisgICAgICAgICAgQWxsSW52YXJpYW50ID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGlmIChBbGxJbnZhcmlhbnQpIHsKKyAgICAgICAgTmVzdGVkT3BlcmFuZHNbMF0gPSBnZXRBZGRSZWNFeHByKE9wZXJhbmRzLCBMKTsKKyAgICAgICAgQWxsSW52YXJpYW50ID0gdHJ1ZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5lc3RlZE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgaWYgKCFOZXN0ZWRPcGVyYW5kc1tpXS0+aXNMb29wSW52YXJpYW50KE5lc3RlZExvb3ApKSB7CisgICAgICAgICAgICBBbGxJbnZhcmlhbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgaWYgKEFsbEludmFyaWFudCkKKyAgICAgICAgICAvLyBPaywgYm90aCBhZGQgcmVjdXJyZW5jZXMgYXJlIHZhbGlkIGFmdGVyIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICByZXR1cm4gZ2V0QWRkUmVjRXhwcihOZXN0ZWRPcGVyYW5kcywgTmVzdGVkTG9vcCwgSGFzTlVXLCBIYXNOU1cpOworICAgICAgfQorICAgICAgLy8gUmVzZXQgT3BlcmFuZHMgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLgorICAgICAgT3BlcmFuZHNbMF0gPSBOZXN0ZWRBUjsKKyAgICB9CisgIH0KKworICAvLyBPa2F5LCBpdCBsb29rcyBsaWtlIHdlIHJlYWxseSBETyBuZWVkIGFuIGFkZHJlYyBleHByLiAgQ2hlY2sgdG8gc2VlIGlmIHdlCisgIC8vIGFscmVhZHkgaGF2ZSBvbmUsIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgb25lLgorICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBJRC5BZGRJbnRlZ2VyKHNjQWRkUmVjRXhwcik7CisgIElELkFkZEludGVnZXIoT3BlcmFuZHMuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgSUQuQWRkUG9pbnRlcihPcGVyYW5kc1tpXSk7CisgIElELkFkZFBvaW50ZXIoTCk7CisgIHZvaWQgKklQID0gMDsKKyAgU0NFVkFkZFJlY0V4cHIgKlMgPQorICAgIHN0YXRpY19jYXN0PFNDRVZBZGRSZWNFeHByICo+KFVuaXF1ZVNDRVZzLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSk7CisgIGlmICghUykgeworICAgIGNvbnN0IFNDRVYgKipPID0gU0NFVkFsbG9jYXRvci5BbGxvY2F0ZTxjb25zdCBTQ0VWICo+KE9wZXJhbmRzLnNpemUoKSk7CisgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoT3BlcmFuZHMuYmVnaW4oKSwgT3BlcmFuZHMuZW5kKCksIE8pOworICAgIFMgPSBuZXcgKFNDRVZBbGxvY2F0b3IpIFNDRVZBZGRSZWNFeHByKElELkludGVybihTQ0VWQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLCBPcGVyYW5kcy5zaXplKCksIEwpOworICAgIFVuaXF1ZVNDRVZzLkluc2VydE5vZGUoUywgSVApOworICB9CisgIGlmIChIYXNOVVcpIFMtPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICBpZiAoSGFzTlNXKSBTLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgIHJldHVybiBTOworfQorCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldFNNYXhFeHByKGNvbnN0IFNDRVYgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUkhTKSB7CisgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gT3BzOworICBPcHMucHVzaF9iYWNrKExIUyk7CisgIE9wcy5wdXNoX2JhY2soUkhTKTsKKyAgcmV0dXJuIGdldFNNYXhFeHByKE9wcyk7Cit9CisKK2NvbnN0IFNDRVYgKgorU2NhbGFyRXZvbHV0aW9uOjpnZXRTTWF4RXhwcihTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmT3BzKSB7CisgIGFzc2VydCghT3BzLmVtcHR5KCkgJiYgIkNhbm5vdCBnZXQgZW1wdHkgc21heCEiKTsKKyAgaWYgKE9wcy5zaXplKCkgPT0gMSkgcmV0dXJuIE9wc1swXTsKKyNpZm5kZWYgTkRFQlVHCisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBhc3NlcnQoZ2V0RWZmZWN0aXZlU0NFVlR5cGUoT3BzW2ldLT5nZXRUeXBlKCkpID09CisgICAgICAgICAgIGdldEVmZmVjdGl2ZVNDRVZUeXBlKE9wc1swXS0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgICAiU0NFVlNNYXhFeHByIG9wZXJhbmQgdHlwZXMgZG9uJ3QgbWF0Y2ghIik7CisjZW5kaWYKKworICAvLyBTb3J0IGJ5IGNvbXBsZXhpdHksIHRoaXMgZ3JvdXBzIGFsbCBzaW1pbGFyIGV4cHJlc3Npb24gdHlwZXMgdG9nZXRoZXIuCisgIEdyb3VwQnlDb21wbGV4aXR5KE9wcywgTEkpOworCisgIC8vIElmIHRoZXJlIGFyZSBhbnkgY29uc3RhbnRzLCBmb2xkIHRoZW0gdG9nZXRoZXIuCisgIHVuc2lnbmVkIElkeCA9IDA7CisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKkxIU0MgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KE9wc1swXSkpIHsKKyAgICArK0lkeDsKKyAgICBhc3NlcnQoSWR4IDwgT3BzLnNpemUoKSk7CisgICAgd2hpbGUgKGNvbnN0IFNDRVZDb25zdGFudCAqUkhTQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oT3BzW0lkeF0pKSB7CisgICAgICAvLyBXZSBmb3VuZCB0d28gY29uc3RhbnRzLCBmb2xkIHRoZW0gdG9nZXRoZXIhCisgICAgICBDb25zdGFudEludCAqRm9sZCA9IENvbnN0YW50SW50OjpnZXQoZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnRPcHM6OnNtYXgoTEhTQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0MtPmdldFZhbHVlKCktPmdldFZhbHVlKCkpKTsKKyAgICAgIE9wc1swXSA9IGdldENvbnN0YW50KEZvbGQpOworICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpKzEpOyAgLy8gRXJhc2UgdGhlIGZvbGRlZCBlbGVtZW50CisgICAgICBpZiAoT3BzLnNpemUoKSA9PSAxKSByZXR1cm4gT3BzWzBdOworICAgICAgTEhTQyA9IGNhc3Q8U0NFVkNvbnN0YW50PihPcHNbMF0pOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSBsZWZ0IHdpdGggYSBjb25zdGFudCBtaW5pbXVtLWludCwgc3RyaXAgaXQgb2ZmLgorICAgIGlmIChjYXN0PFNDRVZDb25zdGFudD4oT3BzWzBdKS0+Z2V0VmFsdWUoKS0+aXNNaW5WYWx1ZSh0cnVlKSkgeworICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpKTsKKyAgICAgIC0tSWR4OworICAgIH0gZWxzZSBpZiAoY2FzdDxTQ0VWQ29uc3RhbnQ+KE9wc1swXSktPmdldFZhbHVlKCktPmlzTWF4VmFsdWUodHJ1ZSkpIHsKKyAgICAgIC8vIElmIHdlIGhhdmUgYW4gc21heCB3aXRoIGEgY29uc3RhbnQgbWF4aW11bS1pbnQsIGl0IHdpbGwgYWx3YXlzIGJlCisgICAgICAvLyBtYXhpbXVtLWludC4KKyAgICAgIHJldHVybiBPcHNbMF07CisgICAgfQorCisgICAgaWYgKE9wcy5zaXplKCkgPT0gMSkgcmV0dXJuIE9wc1swXTsKKyAgfQorCisgIC8vIEZpbmQgdGhlIGZpcnN0IFNNYXgKKyAgd2hpbGUgKElkeCA8IE9wcy5zaXplKCkgJiYgT3BzW0lkeF0tPmdldFNDRVZUeXBlKCkgPCBzY1NNYXhFeHByKQorICAgICsrSWR4OworCisgIC8vIENoZWNrIHRvIHNlZSBpZiBvbmUgb2YgdGhlIG9wZXJhbmRzIGlzIGFuIFNNYXguIElmIHNvLCBleHBhbmQgaXRzIG9wZXJhbmRzCisgIC8vIG9udG8gb3VyIG9wZXJhbmQgbGlzdCwgYW5kIHJlY3Vyc2UgdG8gc2ltcGxpZnkuCisgIGlmIChJZHggPCBPcHMuc2l6ZSgpKSB7CisgICAgYm9vbCBEZWxldGVkU01heCA9IGZhbHNlOworICAgIHdoaWxlIChjb25zdCBTQ0VWU01heEV4cHIgKlNNYXggPSBkeW5fY2FzdDxTQ0VWU01heEV4cHI+KE9wc1tJZHhdKSkgeworICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK0lkeCk7CisgICAgICBPcHMuYXBwZW5kKFNNYXgtPm9wX2JlZ2luKCksIFNNYXgtPm9wX2VuZCgpKTsKKyAgICAgIERlbGV0ZWRTTWF4ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoRGVsZXRlZFNNYXgpCisgICAgICByZXR1cm4gZ2V0U01heEV4cHIoT3BzKTsKKyAgfQorCisgIC8vIE9rYXksIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2FtZSB2YWx1ZSBvY2N1cnMgaW4gdGhlIG9wZXJhbmQgbGlzdCB0d2ljZS4gIElmCisgIC8vIHNvLCBkZWxldGUgb25lLiAgU2luY2Ugd2Ugc29ydGVkIHRoZSBsaXN0LCB0aGVzZSB2YWx1ZXMgYXJlIHJlcXVpcmVkIHRvCisgIC8vIGJlIGFkamFjZW50LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BzLnNpemUoKS0xOyBpICE9IGU7ICsraSkKKyAgICAvLyAgWCBzbWF4IFkgc21heCBZICAtLT4gIFggc21heCBZCisgICAgLy8gIFggc21heCBZICAgICAgICAgLS0+ICBYLCBpZiBYIGlzIGFsd2F5cyBncmVhdGVyIHRoYW4gWQorICAgIGlmIChPcHNbaV0gPT0gT3BzW2krMV0gfHwKKyAgICAgICAgaXNLbm93blByZWRpY2F0ZShJQ21wSW5zdDo6SUNNUF9TR0UsIE9wc1tpXSwgT3BzW2krMV0pKSB7CisgICAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkraSsxLCBPcHMuYmVnaW4oKStpKzIpOworICAgICAgLS1pOyAtLWU7CisgICAgfSBlbHNlIGlmIChpc0tub3duUHJlZGljYXRlKElDbXBJbnN0OjpJQ01QX1NMRSwgT3BzW2ldLCBPcHNbaSsxXSkpIHsKKyAgICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKStpLCBPcHMuYmVnaW4oKStpKzEpOworICAgICAgLS1pOyAtLWU7CisgICAgfQorCisgIGlmIChPcHMuc2l6ZSgpID09IDEpIHJldHVybiBPcHNbMF07CisKKyAgYXNzZXJ0KCFPcHMuZW1wdHkoKSAmJiAiUmVkdWNlZCBzbWF4IGRvd24gdG8gbm90aGluZyEiKTsKKworICAvLyBPa2F5LCBpdCBsb29rcyBsaWtlIHdlIHJlYWxseSBETyBuZWVkIGFuIHNtYXggZXhwci4gIENoZWNrIHRvIHNlZSBpZiB3ZQorICAvLyBhbHJlYWR5IGhhdmUgb25lLCBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IG9uZS4KKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgSUQuQWRkSW50ZWdlcihzY1NNYXhFeHByKTsKKyAgSUQuQWRkSW50ZWdlcihPcHMuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIElELkFkZFBvaW50ZXIoT3BzW2ldKTsKKyAgdm9pZCAqSVAgPSAwOworICBpZiAoY29uc3QgU0NFViAqUyA9IFVuaXF1ZVNDRVZzLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkgcmV0dXJuIFM7CisgIGNvbnN0IFNDRVYgKipPID0gU0NFVkFsbG9jYXRvci5BbGxvY2F0ZTxjb25zdCBTQ0VWICo+KE9wcy5zaXplKCkpOworICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShPcHMuYmVnaW4oKSwgT3BzLmVuZCgpLCBPKTsKKyAgU0NFViAqUyA9IG5ldyAoU0NFVkFsbG9jYXRvcikgU0NFVlNNYXhFeHByKElELkludGVybihTQ0VWQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8sIE9wcy5zaXplKCkpOworICBVbmlxdWVTQ0VWcy5JbnNlcnROb2RlKFMsIElQKTsKKyAgcmV0dXJuIFM7Cit9CisKK2NvbnN0IFNDRVYgKlNjYWxhckV2b2x1dGlvbjo6Z2V0VU1heEV4cHIoY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMpIHsKKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBPcHM7CisgIE9wcy5wdXNoX2JhY2soTEhTKTsKKyAgT3BzLnB1c2hfYmFjayhSSFMpOworICByZXR1cm4gZ2V0VU1heEV4cHIoT3BzKTsKK30KKworY29uc3QgU0NFViAqCitTY2FsYXJFdm9sdXRpb246OmdldFVNYXhFeHByKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcHMpIHsKKyAgYXNzZXJ0KCFPcHMuZW1wdHkoKSAmJiAiQ2Fubm90IGdldCBlbXB0eSB1bWF4ISIpOworICBpZiAoT3BzLnNpemUoKSA9PSAxKSByZXR1cm4gT3BzWzBdOworI2lmbmRlZiBOREVCVUcKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGFzc2VydChnZXRFZmZlY3RpdmVTQ0VWVHlwZShPcHNbaV0tPmdldFR5cGUoKSkgPT0KKyAgICAgICAgICAgZ2V0RWZmZWN0aXZlU0NFVlR5cGUoT3BzWzBdLT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICJTQ0VWVU1heEV4cHIgb3BlcmFuZCB0eXBlcyBkb24ndCBtYXRjaCEiKTsKKyNlbmRpZgorCisgIC8vIFNvcnQgYnkgY29tcGxleGl0eSwgdGhpcyBncm91cHMgYWxsIHNpbWlsYXIgZXhwcmVzc2lvbiB0eXBlcyB0b2dldGhlci4KKyAgR3JvdXBCeUNvbXBsZXhpdHkoT3BzLCBMSSk7CisKKyAgLy8gSWYgdGhlcmUgYXJlIGFueSBjb25zdGFudHMsIGZvbGQgdGhlbSB0b2dldGhlci4KKyAgdW5zaWduZWQgSWR4ID0gMDsKKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqTEhTQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oT3BzWzBdKSkgeworICAgICsrSWR4OworICAgIGFzc2VydChJZHggPCBPcHMuc2l6ZSgpKTsKKyAgICB3aGlsZSAoY29uc3QgU0NFVkNvbnN0YW50ICpSSFNDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihPcHNbSWR4XSkpIHsKKyAgICAgIC8vIFdlIGZvdW5kIHR3byBjb25zdGFudHMsIGZvbGQgdGhlbSB0b2dldGhlciEKKyAgICAgIENvbnN0YW50SW50ICpGb2xkID0gQ29uc3RhbnRJbnQ6OmdldChnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludE9wczo6dW1heChMSFNDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKSkpOworICAgICAgT3BzWzBdID0gZ2V0Q29uc3RhbnQoRm9sZCk7CisgICAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkrMSk7ICAvLyBFcmFzZSB0aGUgZm9sZGVkIGVsZW1lbnQKKyAgICAgIGlmIChPcHMuc2l6ZSgpID09IDEpIHJldHVybiBPcHNbMF07CisgICAgICBMSFNDID0gY2FzdDxTQ0VWQ29uc3RhbnQ+KE9wc1swXSk7CisgICAgfQorCisgICAgLy8gSWYgd2UgYXJlIGxlZnQgd2l0aCBhIGNvbnN0YW50IG1pbmltdW0taW50LCBzdHJpcCBpdCBvZmYuCisgICAgaWYgKGNhc3Q8U0NFVkNvbnN0YW50PihPcHNbMF0pLT5nZXRWYWx1ZSgpLT5pc01pblZhbHVlKGZhbHNlKSkgeworICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpKTsKKyAgICAgIC0tSWR4OworICAgIH0gZWxzZSBpZiAoY2FzdDxTQ0VWQ29uc3RhbnQ+KE9wc1swXSktPmdldFZhbHVlKCktPmlzTWF4VmFsdWUoZmFsc2UpKSB7CisgICAgICAvLyBJZiB3ZSBoYXZlIGFuIHVtYXggd2l0aCBhIGNvbnN0YW50IG1heGltdW0taW50LCBpdCB3aWxsIGFsd2F5cyBiZQorICAgICAgLy8gbWF4aW11bS1pbnQuCisgICAgICByZXR1cm4gT3BzWzBdOworICAgIH0KKworICAgIGlmIChPcHMuc2l6ZSgpID09IDEpIHJldHVybiBPcHNbMF07CisgIH0KKworICAvLyBGaW5kIHRoZSBmaXJzdCBVTWF4CisgIHdoaWxlIChJZHggPCBPcHMuc2l6ZSgpICYmIE9wc1tJZHhdLT5nZXRTQ0VWVHlwZSgpIDwgc2NVTWF4RXhwcikKKyAgICArK0lkeDsKKworICAvLyBDaGVjayB0byBzZWUgaWYgb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBhIFVNYXguIElmIHNvLCBleHBhbmQgaXRzIG9wZXJhbmRzCisgIC8vIG9udG8gb3VyIG9wZXJhbmQgbGlzdCwgYW5kIHJlY3Vyc2UgdG8gc2ltcGxpZnkuCisgIGlmIChJZHggPCBPcHMuc2l6ZSgpKSB7CisgICAgYm9vbCBEZWxldGVkVU1heCA9IGZhbHNlOworICAgIHdoaWxlIChjb25zdCBTQ0VWVU1heEV4cHIgKlVNYXggPSBkeW5fY2FzdDxTQ0VWVU1heEV4cHI+KE9wc1tJZHhdKSkgeworICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK0lkeCk7CisgICAgICBPcHMuYXBwZW5kKFVNYXgtPm9wX2JlZ2luKCksIFVNYXgtPm9wX2VuZCgpKTsKKyAgICAgIERlbGV0ZWRVTWF4ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoRGVsZXRlZFVNYXgpCisgICAgICByZXR1cm4gZ2V0VU1heEV4cHIoT3BzKTsKKyAgfQorCisgIC8vIE9rYXksIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2FtZSB2YWx1ZSBvY2N1cnMgaW4gdGhlIG9wZXJhbmQgbGlzdCB0d2ljZS4gIElmCisgIC8vIHNvLCBkZWxldGUgb25lLiAgU2luY2Ugd2Ugc29ydGVkIHRoZSBsaXN0LCB0aGVzZSB2YWx1ZXMgYXJlIHJlcXVpcmVkIHRvCisgIC8vIGJlIGFkamFjZW50LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BzLnNpemUoKS0xOyBpICE9IGU7ICsraSkKKyAgICAvLyAgWCB1bWF4IFkgdW1heCBZICAtLT4gIFggdW1heCBZCisgICAgLy8gIFggdW1heCBZICAgICAgICAgLS0+ICBYLCBpZiBYIGlzIGFsd2F5cyBncmVhdGVyIHRoYW4gWQorICAgIGlmIChPcHNbaV0gPT0gT3BzW2krMV0gfHwKKyAgICAgICAgaXNLbm93blByZWRpY2F0ZShJQ21wSW5zdDo6SUNNUF9VR0UsIE9wc1tpXSwgT3BzW2krMV0pKSB7CisgICAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkraSsxLCBPcHMuYmVnaW4oKStpKzIpOworICAgICAgLS1pOyAtLWU7CisgICAgfSBlbHNlIGlmIChpc0tub3duUHJlZGljYXRlKElDbXBJbnN0OjpJQ01QX1VMRSwgT3BzW2ldLCBPcHNbaSsxXSkpIHsKKyAgICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKStpLCBPcHMuYmVnaW4oKStpKzEpOworICAgICAgLS1pOyAtLWU7CisgICAgfQorCisgIGlmIChPcHMuc2l6ZSgpID09IDEpIHJldHVybiBPcHNbMF07CisKKyAgYXNzZXJ0KCFPcHMuZW1wdHkoKSAmJiAiUmVkdWNlZCB1bWF4IGRvd24gdG8gbm90aGluZyEiKTsKKworICAvLyBPa2F5LCBpdCBsb29rcyBsaWtlIHdlIHJlYWxseSBETyBuZWVkIGEgdW1heCBleHByLiAgQ2hlY2sgdG8gc2VlIGlmIHdlCisgIC8vIGFscmVhZHkgaGF2ZSBvbmUsIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgb25lLgorICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBJRC5BZGRJbnRlZ2VyKHNjVU1heEV4cHIpOworICBJRC5BZGRJbnRlZ2VyKE9wcy5zaXplKCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgSUQuQWRkUG9pbnRlcihPcHNbaV0pOworICB2b2lkICpJUCA9IDA7CisgIGlmIChjb25zdCBTQ0VWICpTID0gVW5pcXVlU0NFVnMuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKSByZXR1cm4gUzsKKyAgY29uc3QgU0NFViAqKk8gPSBTQ0VWQWxsb2NhdG9yLkFsbG9jYXRlPGNvbnN0IFNDRVYgKj4oT3BzLnNpemUoKSk7CisgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KE9wcy5iZWdpbigpLCBPcHMuZW5kKCksIE8pOworICBTQ0VWICpTID0gbmV3IChTQ0VWQWxsb2NhdG9yKSBTQ0VWVU1heEV4cHIoSUQuSW50ZXJuKFNDRVZBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTywgT3BzLnNpemUoKSk7CisgIFVuaXF1ZVNDRVZzLkluc2VydE5vZGUoUywgSVApOworICByZXR1cm4gUzsKK30KKworY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRTTWluRXhwcihjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUykgeworICAvLyB+c21heCh+eCwgfnkpID09IHNtaW4oeCwgeSkuCisgIHJldHVybiBnZXROb3RTQ0VWKGdldFNNYXhFeHByKGdldE5vdFNDRVYoTEhTKSwgZ2V0Tm90U0NFVihSSFMpKSk7Cit9CisKK2NvbnN0IFNDRVYgKlNjYWxhckV2b2x1dGlvbjo6Z2V0VU1pbkV4cHIoY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMpIHsKKyAgLy8gfnVtYXgofngsIH55KSA9PSB1bWluKHgsIHkpCisgIHJldHVybiBnZXROb3RTQ0VWKGdldFVNYXhFeHByKGdldE5vdFNDRVYoTEhTKSwgZ2V0Tm90U0NFVihSSFMpKSk7Cit9CisKK2NvbnN0IFNDRVYgKlNjYWxhckV2b2x1dGlvbjo6Z2V0U2l6ZU9mRXhwcihjb25zdCBUeXBlICpBbGxvY1R5KSB7CisgIC8vIElmIHdlIGhhdmUgVGFyZ2V0RGF0YSwgd2UgY2FuIGJ5cGFzcyBjcmVhdGluZyBhIHRhcmdldC1pbmRlcGVuZGVudAorICAvLyBjb25zdGFudCBleHByZXNzaW9uIGFuZCB0aGVuIGZvbGRpbmcgaXQgYmFjayBpbnRvIGEgQ29uc3RhbnRJbnQuCisgIC8vIFRoaXMgaXMganVzdCBhIGNvbXBpbGUtdGltZSBvcHRpbWl6YXRpb24uCisgIGlmIChURCkKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoVEQtPmdldEludFB0clR5cGUoZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgVEQtPmdldFR5cGVBbGxvY1NpemUoQWxsb2NUeSkpOworCisgIENvbnN0YW50ICpDID0gQ29uc3RhbnRFeHByOjpnZXRTaXplT2YoQWxsb2NUeSk7CisgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDKSkKKyAgICBpZiAoQ29uc3RhbnQgKkZvbGRlZCA9IENvbnN0YW50Rm9sZENvbnN0YW50RXhwcmVzc2lvbihDRSwgVEQpKQorICAgICAgQyA9IEZvbGRlZDsKKyAgY29uc3QgVHlwZSAqVHkgPSBnZXRFZmZlY3RpdmVTQ0VWVHlwZShQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEFsbG9jVHkpKTsKKyAgcmV0dXJuIGdldFRydW5jYXRlT3JaZXJvRXh0ZW5kKGdldFNDRVYoQyksIFR5KTsKK30KKworY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRBbGlnbk9mRXhwcihjb25zdCBUeXBlICpBbGxvY1R5KSB7CisgIENvbnN0YW50ICpDID0gQ29uc3RhbnRFeHByOjpnZXRBbGlnbk9mKEFsbG9jVHkpOworICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oQykpCisgICAgaWYgKENvbnN0YW50ICpGb2xkZWQgPSBDb25zdGFudEZvbGRDb25zdGFudEV4cHJlc3Npb24oQ0UsIFREKSkKKyAgICAgIEMgPSBGb2xkZWQ7CisgIGNvbnN0IFR5cGUgKlR5ID0gZ2V0RWZmZWN0aXZlU0NFVlR5cGUoUG9pbnRlclR5cGU6OmdldFVucXVhbChBbGxvY1R5KSk7CisgIHJldHVybiBnZXRUcnVuY2F0ZU9yWmVyb0V4dGVuZChnZXRTQ0VWKEMpLCBUeSk7Cit9CisKK2NvbnN0IFNDRVYgKlNjYWxhckV2b2x1dGlvbjo6Z2V0T2Zmc2V0T2ZFeHByKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpZWxkTm8pIHsKKyAgLy8gSWYgd2UgaGF2ZSBUYXJnZXREYXRhLCB3ZSBjYW4gYnlwYXNzIGNyZWF0aW5nIGEgdGFyZ2V0LWluZGVwZW5kZW50CisgIC8vIGNvbnN0YW50IGV4cHJlc3Npb24gYW5kIHRoZW4gZm9sZGluZyBpdCBiYWNrIGludG8gYSBDb25zdGFudEludC4KKyAgLy8gVGhpcyBpcyBqdXN0IGEgY29tcGlsZS10aW1lIG9wdGltaXphdGlvbi4KKyAgaWYgKFREKQorICAgIHJldHVybiBnZXRDb25zdGFudChURC0+Z2V0SW50UHRyVHlwZShnZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICBURC0+Z2V0U3RydWN0TGF5b3V0KFNUeSktPmdldEVsZW1lbnRPZmZzZXQoRmllbGRObykpOworCisgIENvbnN0YW50ICpDID0gQ29uc3RhbnRFeHByOjpnZXRPZmZzZXRPZihTVHksIEZpZWxkTm8pOworICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oQykpCisgICAgaWYgKENvbnN0YW50ICpGb2xkZWQgPSBDb25zdGFudEZvbGRDb25zdGFudEV4cHJlc3Npb24oQ0UsIFREKSkKKyAgICAgIEMgPSBGb2xkZWQ7CisgIGNvbnN0IFR5cGUgKlR5ID0gZ2V0RWZmZWN0aXZlU0NFVlR5cGUoUG9pbnRlclR5cGU6OmdldFVucXVhbChTVHkpKTsKKyAgcmV0dXJuIGdldFRydW5jYXRlT3JaZXJvRXh0ZW5kKGdldFNDRVYoQyksIFR5KTsKK30KKworY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRPZmZzZXRPZkV4cHIoY29uc3QgVHlwZSAqQ1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkZpZWxkTm8pIHsKKyAgQ29uc3RhbnQgKkMgPSBDb25zdGFudEV4cHI6OmdldE9mZnNldE9mKENUeSwgRmllbGRObyk7CisgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDKSkKKyAgICBpZiAoQ29uc3RhbnQgKkZvbGRlZCA9IENvbnN0YW50Rm9sZENvbnN0YW50RXhwcmVzc2lvbihDRSwgVEQpKQorICAgICAgQyA9IEZvbGRlZDsKKyAgY29uc3QgVHlwZSAqVHkgPSBnZXRFZmZlY3RpdmVTQ0VWVHlwZShQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKENUeSkpOworICByZXR1cm4gZ2V0VHJ1bmNhdGVPclplcm9FeHRlbmQoZ2V0U0NFVihDKSwgVHkpOworfQorCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldFVua25vd24oVmFsdWUgKlYpIHsKKyAgLy8gRG9uJ3QgYXR0ZW1wdCB0byBkbyBhbnl0aGluZyBvdGhlciB0aGFuIGNyZWF0ZSBhIFNDRVZVbmtub3duIG9iamVjdAorICAvLyBoZXJlLiAgY3JlYXRlU0NFViBvbmx5IGNhbGxzIGdldFVua25vd24gYWZ0ZXIgY2hlY2tpbmcgZm9yIGFsbCBvdGhlcgorICAvLyBpbnRlcmVzdGluZyBwb3NzaWJpbGl0aWVzLCBhbmQgYW55IG90aGVyIGNvZGUgdGhhdCBjYWxscyBnZXRVbmtub3duCisgIC8vIGlzIGRvaW5nIHNvIGluIG9yZGVyIHRvIGhpZGUgYSB2YWx1ZSBmcm9tIFNDRVYgY2Fub25pY2FsaXphdGlvbi4KKworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBJRC5BZGRJbnRlZ2VyKHNjVW5rbm93bik7CisgIElELkFkZFBvaW50ZXIoVik7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKFNDRVYgKlMgPSBVbmlxdWVTQ0VWcy5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpIHsKKyAgICBhc3NlcnQoY2FzdDxTQ0VWVW5rbm93bj4oUyktPmdldFZhbHVlKCkgPT0gViAmJgorICAgICAgICAgICAiU3RhbGUgU0NFVlVua25vd24gaW4gdW5pcXVpbmcgbWFwISIpOworICAgIHJldHVybiBTOworICB9CisgIFNDRVYgKlMgPSBuZXcgKFNDRVZBbGxvY2F0b3IpIFNDRVZVbmtub3duKElELkludGVybihTQ0VWQWxsb2NhdG9yKSwgViwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlyc3RVbmtub3duKTsKKyAgRmlyc3RVbmtub3duID0gY2FzdDxTQ0VWVW5rbm93bj4oUyk7CisgIFVuaXF1ZVNDRVZzLkluc2VydE5vZGUoUywgSVApOworICByZXR1cm4gUzsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgQmFzaWMgU0NFViBBbmFseXNpcyBhbmQgUEhJIElkaW9tIFJlY29nbml0aW9uIENvZGUKKy8vCisKKy8vLyBpc1NDRVZhYmxlIC0gVGVzdCBpZiB2YWx1ZXMgb2YgdGhlIGdpdmVuIHR5cGUgYXJlIGFuYWx5emFibGUgd2l0aGluCisvLy8gdGhlIFNDRVYgZnJhbWV3b3JrLiBUaGlzIHByaW1hcmlseSBpbmNsdWRlcyBpbnRlZ2VyIHR5cGVzLCBhbmQgaXQKKy8vLyBjYW4gb3B0aW9uYWxseSBpbmNsdWRlIHBvaW50ZXIgdHlwZXMgaWYgdGhlIFNjYWxhckV2b2x1dGlvbiBjbGFzcworLy8vIGhhcyBhY2Nlc3MgdG8gdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uLgorYm9vbCBTY2FsYXJFdm9sdXRpb246OmlzU0NFVmFibGUoY29uc3QgVHlwZSAqVHkpIGNvbnN0IHsKKyAgLy8gSW50ZWdlcnMgYW5kIHBvaW50ZXJzIGFyZSBhbHdheXMgU0NFVmFibGUuCisgIHJldHVybiBUeS0+aXNJbnRlZ2VyVHkoKSB8fCBUeS0+aXNQb2ludGVyVHkoKTsKK30KKworLy8vIGdldFR5cGVTaXplSW5CaXRzIC0gUmV0dXJuIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLAorLy8vIGZvciB3aGljaCBpc1NDRVZhYmxlIG11c3QgcmV0dXJuIHRydWUuCit1aW50NjRfdCBTY2FsYXJFdm9sdXRpb246OmdldFR5cGVTaXplSW5CaXRzKGNvbnN0IFR5cGUgKlR5KSBjb25zdCB7CisgIGFzc2VydChpc1NDRVZhYmxlKFR5KSAmJiAiVHlwZSBpcyBub3QgU0NFVmFibGUhIik7CisKKyAgLy8gSWYgd2UgaGF2ZSBhIFRhcmdldERhdGEsIHVzZSBpdCEKKyAgaWYgKFREKQorICAgIHJldHVybiBURC0+Z2V0VHlwZVNpemVJbkJpdHMoVHkpOworCisgIC8vIEludGVnZXIgdHlwZXMgaGF2ZSBmaXhlZCBzaXplcy4KKyAgaWYgKFR5LT5pc0ludGVnZXJUeSgpKQorICAgIHJldHVybiBUeS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworCisgIC8vIFRoZSBvbmx5IG90aGVyIHN1cHBvcnQgdHlwZSBpcyBwb2ludGVyLiBXaXRob3V0IFRhcmdldERhdGEsIGNvbnNlcnZhdGl2ZWx5CisgIC8vIGFzc3VtZSBwb2ludGVycyBhcmUgNjQtYml0LgorICBhc3NlcnQoVHktPmlzUG9pbnRlclR5KCkgJiYgImlzU0NFVmFibGUgcGVybWl0dGVkIGEgbm9uLVNDRVZhYmxlIHR5cGUhIik7CisgIHJldHVybiA2NDsKK30KKworLy8vIGdldEVmZmVjdGl2ZVNDRVZUeXBlIC0gUmV0dXJuIGEgdHlwZSB3aXRoIHRoZSBzYW1lIGJpdHdpZHRoIGFzCisvLy8gdGhlIGdpdmVuIHR5cGUgYW5kIHdoaWNoIHJlcHJlc2VudHMgaG93IFNDRVYgd2lsbCB0cmVhdCB0aGUgZ2l2ZW4KKy8vLyB0eXBlLCBmb3Igd2hpY2ggaXNTQ0VWYWJsZSBtdXN0IHJldHVybiB0cnVlLiBGb3IgcG9pbnRlciB0eXBlcywKKy8vLyB0aGlzIGlzIHRoZSBwb2ludGVyLXNpemVkIGludGVnZXIgdHlwZS4KK2NvbnN0IFR5cGUgKlNjYWxhckV2b2x1dGlvbjo6Z2V0RWZmZWN0aXZlU0NFVlR5cGUoY29uc3QgVHlwZSAqVHkpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzU0NFVmFibGUoVHkpICYmICJUeXBlIGlzIG5vdCBTQ0VWYWJsZSEiKTsKKworICBpZiAoVHktPmlzSW50ZWdlclR5KCkpCisgICAgcmV0dXJuIFR5OworCisgIC8vIFRoZSBvbmx5IG90aGVyIHN1cHBvcnQgdHlwZSBpcyBwb2ludGVyLgorICBhc3NlcnQoVHktPmlzUG9pbnRlclR5KCkgJiYgIlVuZXhwZWN0ZWQgbm9uLXBvaW50ZXIgbm9uLWludGVnZXIgdHlwZSEiKTsKKyAgaWYgKFREKSByZXR1cm4gVEQtPmdldEludFB0clR5cGUoZ2V0Q29udGV4dCgpKTsKKworICAvLyBXaXRob3V0IFRhcmdldERhdGEsIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSBwb2ludGVycyBhcmUgNjQtYml0LgorICByZXR1cm4gVHlwZTo6Z2V0SW50NjRUeShnZXRDb250ZXh0KCkpOworfQorCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldENvdWxkTm90Q29tcHV0ZSgpIHsKKyAgcmV0dXJuICZDb3VsZE5vdENvbXB1dGU7Cit9CisKKy8vLyBnZXRTQ0VWIC0gUmV0dXJuIGFuIGV4aXN0aW5nIFNDRVYgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYW5hbHl6ZSB0aGUKKy8vLyBleHByZXNzaW9uIGFuZCBjcmVhdGUgYSBuZXcgb25lLgorY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRTQ0VWKFZhbHVlICpWKSB7CisgIGFzc2VydChpc1NDRVZhYmxlKFYtPmdldFR5cGUoKSkgJiYgIlZhbHVlIGlzIG5vdCBTQ0VWYWJsZSEiKTsKKworICBzdGQ6Om1hcDxTQ0VWQ2FsbGJhY2tWSCwgY29uc3QgU0NFViAqPjo6aXRlcmF0b3IgSSA9IFNjYWxhcnMuZmluZChWKTsKKyAgaWYgKEkgIT0gU2NhbGFycy5lbmQoKSkgcmV0dXJuIEktPnNlY29uZDsKKyAgY29uc3QgU0NFViAqUyA9IGNyZWF0ZVNDRVYoVik7CisgIFNjYWxhcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFNDRVZDYWxsYmFja1ZIKFYsIHRoaXMpLCBTKSk7CisgIHJldHVybiBTOworfQorCisvLy8gZ2V0TmVnYXRpdmVTQ0VWIC0gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIC1WID0gLTEqVgorLy8vCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldE5lZ2F0aXZlU0NFVihjb25zdCBTQ0VWICpWKSB7CisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKlZDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihWKSkKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoCisgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50SW50PihDb25zdGFudEV4cHI6OmdldE5lZyhWQy0+Z2V0VmFsdWUoKSkpKTsKKworICBjb25zdCBUeXBlICpUeSA9IFYtPmdldFR5cGUoKTsKKyAgVHkgPSBnZXRFZmZlY3RpdmVTQ0VWVHlwZShUeSk7CisgIHJldHVybiBnZXRNdWxFeHByKFYsCisgICAgICAgICAgICAgICAgICBnZXRDb25zdGFudChjYXN0PENvbnN0YW50SW50PihDb25zdGFudDo6Z2V0QWxsT25lc1ZhbHVlKFR5KSkpKTsKK30KKworLy8vIGdldE5vdFNDRVYgLSBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gflYgPSAtMS1WCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldE5vdFNDRVYoY29uc3QgU0NFViAqVikgeworICBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpWQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oVikpCisgICAgcmV0dXJuIGdldENvbnN0YW50KAorICAgICAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KENvbnN0YW50RXhwcjo6Z2V0Tm90KFZDLT5nZXRWYWx1ZSgpKSkpOworCisgIGNvbnN0IFR5cGUgKlR5ID0gVi0+Z2V0VHlwZSgpOworICBUeSA9IGdldEVmZmVjdGl2ZVNDRVZUeXBlKFR5KTsKKyAgY29uc3QgU0NFViAqQWxsT25lcyA9CisgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RhbnQoY2FzdDxDb25zdGFudEludD4oQ29uc3RhbnQ6OmdldEFsbE9uZXNWYWx1ZShUeSkpKTsKKyAgcmV0dXJuIGdldE1pbnVzU0NFVihBbGxPbmVzLCBWKTsKK30KKworLy8vIGdldE1pbnVzU0NFViAtIFJldHVybiBhIFNDRVYgY29ycmVzcG9uZGluZyB0byBMSFMgLSBSSFMuCisvLy8KK2NvbnN0IFNDRVYgKlNjYWxhckV2b2x1dGlvbjo6Z2V0TWludXNTQ0VWKGNvbnN0IFNDRVYgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUykgeworICAvLyBGYXN0IHBhdGg6IFggLSBYIC0tPiAwLgorICBpZiAoTEhTID09IFJIUykKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoTEhTLT5nZXRUeXBlKCksIDApOworCisgIC8vIFggLSBZIC0tPiBYICsgLVkKKyAgcmV0dXJuIGdldEFkZEV4cHIoTEhTLCBnZXROZWdhdGl2ZVNDRVYoUkhTKSk7Cit9CisKKy8vLyBnZXRUcnVuY2F0ZU9yWmVyb0V4dGVuZCAtIFJldHVybiBhIFNDRVYgY29ycmVzcG9uZGluZyB0byBhIGNvbnZlcnNpb24gb2YgdGhlCisvLy8gaW5wdXQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiAgSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwgaXQgaXMgemVybworLy8vIGV4dGVuZGVkLgorY29uc3QgU0NFViAqCitTY2FsYXJFdm9sdXRpb246OmdldFRydW5jYXRlT3JaZXJvRXh0ZW5kKGNvbnN0IFNDRVYgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIGNvbnN0IFR5cGUgKlNyY1R5ID0gVi0+Z2V0VHlwZSgpOworICBhc3NlcnQoKFNyY1R5LT5pc0ludGVnZXJUeSgpIHx8IFNyY1R5LT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgKFR5LT5pc0ludGVnZXJUeSgpIHx8IFR5LT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgIkNhbm5vdCB0cnVuY2F0ZSBvciB6ZXJvIGV4dGVuZCB3aXRoIG5vbi1pbnRlZ2VyIGFyZ3VtZW50cyEiKTsKKyAgaWYgKGdldFR5cGVTaXplSW5CaXRzKFNyY1R5KSA9PSBnZXRUeXBlU2l6ZUluQml0cyhUeSkpCisgICAgcmV0dXJuIFY7ICAvLyBObyBjb252ZXJzaW9uCisgIGlmIChnZXRUeXBlU2l6ZUluQml0cyhTcmNUeSkgPiBnZXRUeXBlU2l6ZUluQml0cyhUeSkpCisgICAgcmV0dXJuIGdldFRydW5jYXRlRXhwcihWLCBUeSk7CisgIHJldHVybiBnZXRaZXJvRXh0ZW5kRXhwcihWLCBUeSk7Cit9CisKKy8vLyBnZXRUcnVuY2F0ZU9yU2lnbkV4dGVuZCAtIFJldHVybiBhIFNDRVYgY29ycmVzcG9uZGluZyB0byBhIGNvbnZlcnNpb24gb2YgdGhlCisvLy8gaW5wdXQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiAgSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwgaXQgaXMgc2lnbgorLy8vIGV4dGVuZGVkLgorY29uc3QgU0NFViAqCitTY2FsYXJFdm9sdXRpb246OmdldFRydW5jYXRlT3JTaWduRXh0ZW5kKGNvbnN0IFNDRVYgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIGNvbnN0IFR5cGUgKlNyY1R5ID0gVi0+Z2V0VHlwZSgpOworICBhc3NlcnQoKFNyY1R5LT5pc0ludGVnZXJUeSgpIHx8IFNyY1R5LT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgKFR5LT5pc0ludGVnZXJUeSgpIHx8IFR5LT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgIkNhbm5vdCB0cnVuY2F0ZSBvciB6ZXJvIGV4dGVuZCB3aXRoIG5vbi1pbnRlZ2VyIGFyZ3VtZW50cyEiKTsKKyAgaWYgKGdldFR5cGVTaXplSW5CaXRzKFNyY1R5KSA9PSBnZXRUeXBlU2l6ZUluQml0cyhUeSkpCisgICAgcmV0dXJuIFY7ICAvLyBObyBjb252ZXJzaW9uCisgIGlmIChnZXRUeXBlU2l6ZUluQml0cyhTcmNUeSkgPiBnZXRUeXBlU2l6ZUluQml0cyhUeSkpCisgICAgcmV0dXJuIGdldFRydW5jYXRlRXhwcihWLCBUeSk7CisgIHJldHVybiBnZXRTaWduRXh0ZW5kRXhwcihWLCBUeSk7Cit9CisKKy8vLyBnZXROb29wT3JaZXJvRXh0ZW5kIC0gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbiBvZiB0aGUKKy8vLyBpbnB1dCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuICBJZiB0aGUgdHlwZSBtdXN0IGJlIGV4dGVuZGVkLCBpdCBpcyB6ZXJvCisvLy8gZXh0ZW5kZWQuICBUaGUgY29udmVyc2lvbiBtdXN0IG5vdCBiZSBuYXJyb3dpbmcuCitjb25zdCBTQ0VWICoKK1NjYWxhckV2b2x1dGlvbjo6Z2V0Tm9vcE9yWmVyb0V4dGVuZChjb25zdCBTQ0VWICpWLCBjb25zdCBUeXBlICpUeSkgeworICBjb25zdCBUeXBlICpTcmNUeSA9IFYtPmdldFR5cGUoKTsKKyAgYXNzZXJ0KChTcmNUeS0+aXNJbnRlZ2VyVHkoKSB8fCBTcmNUeS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgIChUeS0+aXNJbnRlZ2VyVHkoKSB8fCBUeS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgICJDYW5ub3Qgbm9vcCBvciB6ZXJvIGV4dGVuZCB3aXRoIG5vbi1pbnRlZ2VyIGFyZ3VtZW50cyEiKTsKKyAgYXNzZXJ0KGdldFR5cGVTaXplSW5CaXRzKFNyY1R5KSA8PSBnZXRUeXBlU2l6ZUluQml0cyhUeSkgJiYKKyAgICAgICAgICJnZXROb29wT3JaZXJvRXh0ZW5kIGNhbm5vdCB0cnVuY2F0ZSEiKTsKKyAgaWYgKGdldFR5cGVTaXplSW5CaXRzKFNyY1R5KSA9PSBnZXRUeXBlU2l6ZUluQml0cyhUeSkpCisgICAgcmV0dXJuIFY7ICAvLyBObyBjb252ZXJzaW9uCisgIHJldHVybiBnZXRaZXJvRXh0ZW5kRXhwcihWLCBUeSk7Cit9CisKKy8vLyBnZXROb29wT3JTaWduRXh0ZW5kIC0gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbiBvZiB0aGUKKy8vLyBpbnB1dCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuICBJZiB0aGUgdHlwZSBtdXN0IGJlIGV4dGVuZGVkLCBpdCBpcyBzaWduCisvLy8gZXh0ZW5kZWQuICBUaGUgY29udmVyc2lvbiBtdXN0IG5vdCBiZSBuYXJyb3dpbmcuCitjb25zdCBTQ0VWICoKK1NjYWxhckV2b2x1dGlvbjo6Z2V0Tm9vcE9yU2lnbkV4dGVuZChjb25zdCBTQ0VWICpWLCBjb25zdCBUeXBlICpUeSkgeworICBjb25zdCBUeXBlICpTcmNUeSA9IFYtPmdldFR5cGUoKTsKKyAgYXNzZXJ0KChTcmNUeS0+aXNJbnRlZ2VyVHkoKSB8fCBTcmNUeS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgIChUeS0+aXNJbnRlZ2VyVHkoKSB8fCBUeS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgICJDYW5ub3Qgbm9vcCBvciBzaWduIGV4dGVuZCB3aXRoIG5vbi1pbnRlZ2VyIGFyZ3VtZW50cyEiKTsKKyAgYXNzZXJ0KGdldFR5cGVTaXplSW5CaXRzKFNyY1R5KSA8PSBnZXRUeXBlU2l6ZUluQml0cyhUeSkgJiYKKyAgICAgICAgICJnZXROb29wT3JTaWduRXh0ZW5kIGNhbm5vdCB0cnVuY2F0ZSEiKTsKKyAgaWYgKGdldFR5cGVTaXplSW5CaXRzKFNyY1R5KSA9PSBnZXRUeXBlU2l6ZUluQml0cyhUeSkpCisgICAgcmV0dXJuIFY7ICAvLyBObyBjb252ZXJzaW9uCisgIHJldHVybiBnZXRTaWduRXh0ZW5kRXhwcihWLCBUeSk7Cit9CisKKy8vLyBnZXROb29wT3JBbnlFeHRlbmQgLSBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uIG9mCisvLy8gdGhlIGlucHV0IHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwKKy8vLyBpdCBpcyBleHRlbmRlZCB3aXRoIHVuc3BlY2lmaWVkIGJpdHMuIFRoZSBjb252ZXJzaW9uIG11c3Qgbm90IGJlCisvLy8gbmFycm93aW5nLgorY29uc3QgU0NFViAqCitTY2FsYXJFdm9sdXRpb246OmdldE5vb3BPckFueUV4dGVuZChjb25zdCBTQ0VWICpWLCBjb25zdCBUeXBlICpUeSkgeworICBjb25zdCBUeXBlICpTcmNUeSA9IFYtPmdldFR5cGUoKTsKKyAgYXNzZXJ0KChTcmNUeS0+aXNJbnRlZ2VyVHkoKSB8fCBTcmNUeS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgIChUeS0+aXNJbnRlZ2VyVHkoKSB8fCBUeS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgICJDYW5ub3Qgbm9vcCBvciBhbnkgZXh0ZW5kIHdpdGggbm9uLWludGVnZXIgYXJndW1lbnRzISIpOworICBhc3NlcnQoZ2V0VHlwZVNpemVJbkJpdHMoU3JjVHkpIDw9IGdldFR5cGVTaXplSW5CaXRzKFR5KSAmJgorICAgICAgICAgImdldE5vb3BPckFueUV4dGVuZCBjYW5ub3QgdHJ1bmNhdGUhIik7CisgIGlmIChnZXRUeXBlU2l6ZUluQml0cyhTcmNUeSkgPT0gZ2V0VHlwZVNpemVJbkJpdHMoVHkpKQorICAgIHJldHVybiBWOyAgLy8gTm8gY29udmVyc2lvbgorICByZXR1cm4gZ2V0QW55RXh0ZW5kRXhwcihWLCBUeSk7Cit9CisKKy8vLyBnZXRUcnVuY2F0ZU9yTm9vcCAtIFJldHVybiBhIFNDRVYgY29ycmVzcG9uZGluZyB0byBhIGNvbnZlcnNpb24gb2YgdGhlCisvLy8gaW5wdXQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiAgVGhlIGNvbnZlcnNpb24gbXVzdCBub3QgYmUgd2lkZW5pbmcuCitjb25zdCBTQ0VWICoKK1NjYWxhckV2b2x1dGlvbjo6Z2V0VHJ1bmNhdGVPck5vb3AoY29uc3QgU0NFViAqViwgY29uc3QgVHlwZSAqVHkpIHsKKyAgY29uc3QgVHlwZSAqU3JjVHkgPSBWLT5nZXRUeXBlKCk7CisgIGFzc2VydCgoU3JjVHktPmlzSW50ZWdlclR5KCkgfHwgU3JjVHktPmlzUG9pbnRlclR5KCkpICYmCisgICAgICAgICAoVHktPmlzSW50ZWdlclR5KCkgfHwgVHktPmlzUG9pbnRlclR5KCkpICYmCisgICAgICAgICAiQ2Fubm90IHRydW5jYXRlIG9yIG5vb3Agd2l0aCBub24taW50ZWdlciBhcmd1bWVudHMhIik7CisgIGFzc2VydChnZXRUeXBlU2l6ZUluQml0cyhTcmNUeSkgPj0gZ2V0VHlwZVNpemVJbkJpdHMoVHkpICYmCisgICAgICAgICAiZ2V0VHJ1bmNhdGVPck5vb3AgY2Fubm90IGV4dGVuZCEiKTsKKyAgaWYgKGdldFR5cGVTaXplSW5CaXRzKFNyY1R5KSA9PSBnZXRUeXBlU2l6ZUluQml0cyhUeSkpCisgICAgcmV0dXJuIFY7ICAvLyBObyBjb252ZXJzaW9uCisgIHJldHVybiBnZXRUcnVuY2F0ZUV4cHIoViwgVHkpOworfQorCisvLy8gZ2V0VU1heEZyb21NaXNtYXRjaGVkVHlwZXMgLSBQcm9tb3RlIHRoZSBvcGVyYW5kcyB0byB0aGUgd2lkZXIgb2YKKy8vLyB0aGUgdHlwZXMgdXNpbmcgemVyby1leHRlbnNpb24sIGFuZCB0aGVuIHBlcmZvcm0gYSB1bWF4IG9wZXJhdGlvbgorLy8vIHdpdGggdGhlbS4KK2NvbnN0IFNDRVYgKlNjYWxhckV2b2x1dGlvbjo6Z2V0VU1heEZyb21NaXNtYXRjaGVkVHlwZXMoY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMpIHsKKyAgY29uc3QgU0NFViAqUHJvbW90ZWRMSFMgPSBMSFM7CisgIGNvbnN0IFNDRVYgKlByb21vdGVkUkhTID0gUkhTOworCisgIGlmIChnZXRUeXBlU2l6ZUluQml0cyhMSFMtPmdldFR5cGUoKSkgPiBnZXRUeXBlU2l6ZUluQml0cyhSSFMtPmdldFR5cGUoKSkpCisgICAgUHJvbW90ZWRSSFMgPSBnZXRaZXJvRXh0ZW5kRXhwcihSSFMsIExIUy0+Z2V0VHlwZSgpKTsKKyAgZWxzZQorICAgIFByb21vdGVkTEhTID0gZ2V0Tm9vcE9yWmVyb0V4dGVuZChMSFMsIFJIUy0+Z2V0VHlwZSgpKTsKKworICByZXR1cm4gZ2V0VU1heEV4cHIoUHJvbW90ZWRMSFMsIFByb21vdGVkUkhTKTsKK30KKworLy8vIGdldFVNaW5Gcm9tTWlzbWF0Y2hlZFR5cGVzIC0gUHJvbW90ZSB0aGUgb3BlcmFuZHMgdG8gdGhlIHdpZGVyIG9mCisvLy8gdGhlIHR5cGVzIHVzaW5nIHplcm8tZXh0ZW5zaW9uLCBhbmQgdGhlbiBwZXJmb3JtIGEgdW1pbiBvcGVyYXRpb24KKy8vLyB3aXRoIHRoZW0uCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldFVNaW5Gcm9tTWlzbWF0Y2hlZFR5cGVzKGNvbnN0IFNDRVYgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUkhTKSB7CisgIGNvbnN0IFNDRVYgKlByb21vdGVkTEhTID0gTEhTOworICBjb25zdCBTQ0VWICpQcm9tb3RlZFJIUyA9IFJIUzsKKworICBpZiAoZ2V0VHlwZVNpemVJbkJpdHMoTEhTLT5nZXRUeXBlKCkpID4gZ2V0VHlwZVNpemVJbkJpdHMoUkhTLT5nZXRUeXBlKCkpKQorICAgIFByb21vdGVkUkhTID0gZ2V0WmVyb0V4dGVuZEV4cHIoUkhTLCBMSFMtPmdldFR5cGUoKSk7CisgIGVsc2UKKyAgICBQcm9tb3RlZExIUyA9IGdldE5vb3BPclplcm9FeHRlbmQoTEhTLCBSSFMtPmdldFR5cGUoKSk7CisKKyAgcmV0dXJuIGdldFVNaW5FeHByKFByb21vdGVkTEhTLCBQcm9tb3RlZFJIUyk7Cit9CisKKy8vLyBQdXNoRGVmVXNlQ2hpbGRyZW4gLSBQdXNoIHVzZXJzIG9mIHRoZSBnaXZlbiBJbnN0cnVjdGlvbgorLy8vIG9udG8gdGhlIGdpdmVuIFdvcmtsaXN0Lgorc3RhdGljIHZvaWQKK1B1c2hEZWZVc2VDaGlsZHJlbihJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJldvcmtsaXN0KSB7CisgIC8vIFB1c2ggdGhlIGRlZi11c2UgY2hpbGRyZW4gb250byB0aGUgV29ya2xpc3Qgc3RhY2suCisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEktPnVzZV9iZWdpbigpLCBVRSA9IEktPnVzZV9lbmQoKTsKKyAgICAgICBVSSAhPSBVRTsgKytVSSkKKyAgICBXb3JrbGlzdC5wdXNoX2JhY2soY2FzdDxJbnN0cnVjdGlvbj4oKlVJKSk7Cit9CisKKy8vLyBGb3JnZXRTeW1ib2xpY1ZhbHVlIC0gVGhpcyBsb29rcyB1cCBjb21wdXRlZCBTQ0VWIHZhbHVlcyBmb3IgYWxsCisvLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgZGVwZW5kIG9uIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBhbmQgcmVtb3ZlcyB0aGVtIGZyb20KKy8vLyB0aGUgU2NhbGFycyBtYXAgaWYgdGhleSByZWZlcmVuY2UgU3ltTmFtZS4gVGhpcyBpcyB1c2VkIGR1cmluZyBQSEkKKy8vLyByZXNvbHV0aW9uLgordm9pZAorU2NhbGFyRXZvbHV0aW9uOjpGb3JnZXRTeW1ib2xpY05hbWUoSW5zdHJ1Y3Rpb24gKlBOLCBjb25zdCBTQ0VWICpTeW1OYW1lKSB7CisgIFNtYWxsVmVjdG9yPEluc3RydWN0aW9uICosIDE2PiBXb3JrbGlzdDsKKyAgUHVzaERlZlVzZUNoaWxkcmVuKFBOLCBXb3JrbGlzdCk7CisKKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24gKiwgOD4gVmlzaXRlZDsKKyAgVmlzaXRlZC5pbnNlcnQoUE4pOworICB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpIHsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgIGlmICghVmlzaXRlZC5pbnNlcnQoSSkpIGNvbnRpbnVlOworCisgICAgc3RkOjptYXA8U0NFVkNhbGxiYWNrVkgsIGNvbnN0IFNDRVYgKj46Oml0ZXJhdG9yIEl0ID0KKyAgICAgIFNjYWxhcnMuZmluZChzdGF0aWNfY2FzdDxWYWx1ZSAqPihJKSk7CisgICAgaWYgKEl0ICE9IFNjYWxhcnMuZW5kKCkpIHsKKyAgICAgIC8vIFNob3J0LWNpcmN1aXQgdGhlIGRlZi11c2UgdHJhdmVyc2FsIGlmIHRoZSBzeW1ib2xpYyBuYW1lCisgICAgICAvLyBjZWFzZXMgdG8gYXBwZWFyIGluIGV4cHJlc3Npb25zLgorICAgICAgaWYgKEl0LT5zZWNvbmQgIT0gU3ltTmFtZSAmJiAhSXQtPnNlY29uZC0+aGFzT3BlcmFuZChTeW1OYW1lKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFNDRVZVbmtub3duIGZvciBhIFBISSBlaXRoZXIgbWVhbnMgdGhhdCBpdCBoYXMgYW4gdW5yZWNvZ25pemVkCisgICAgICAvLyBzdHJ1Y3R1cmUsIGl0J3MgYSBQSEkgdGhhdCdzIGluIHRoZSBwcm9ncmVzcyBvZiBiZWluZyBjb21wdXRlZAorICAgICAgLy8gYnkgY3JlYXRlTm9kZUZvclBISSwgb3IgaXQncyBhIHNpbmdsZS12YWx1ZSBQSEkuIEluIHRoZSBmaXJzdCBjYXNlLAorICAgICAgLy8gYWRkaXRpb25hbCBsb29wIHRyaXAgY291bnQgaW5mb3JtYXRpb24gaXNuJ3QgZ29pbmcgdG8gY2hhbmdlIGFueXRoaW5nLgorICAgICAgLy8gSW4gdGhlIHNlY29uZCBjYXNlLCBjcmVhdGVOb2RlRm9yUEhJIHdpbGwgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5CisgICAgICAvLyB1cGRhdGVzIG9uIGl0cyBvd24gd2hlbiBpdCBnZXRzIHRvIHRoYXQgcG9pbnQuIEluIHRoZSB0aGlyZCwgd2UgZG8KKyAgICAgIC8vIHdhbnQgdG8gZm9yZ2V0IHRoZSBTQ0VWVW5rbm93bi4KKyAgICAgIGlmICghaXNhPFBISU5vZGU+KEkpIHx8CisgICAgICAgICAgIWlzYTxTQ0VWVW5rbm93bj4oSXQtPnNlY29uZCkgfHwKKyAgICAgICAgICAoSSAhPSBQTiAmJiBJdC0+c2Vjb25kID09IFN5bU5hbWUpKSB7CisgICAgICAgIFZhbHVlc0F0U2NvcGVzLmVyYXNlKEl0LT5zZWNvbmQpOworICAgICAgICBTY2FsYXJzLmVyYXNlKEl0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBQdXNoRGVmVXNlQ2hpbGRyZW4oSSwgV29ya2xpc3QpOworICB9Cit9CisKKy8vLyBjcmVhdGVOb2RlRm9yUEhJIC0gUEhJIG5vZGVzIGhhdmUgdHdvIGNhc2VzLiAgRWl0aGVyIHRoZSBQSEkgbm9kZSBleGlzdHMgaW4KKy8vLyBhIGxvb3AgaGVhZGVyLCBtYWtpbmcgaXQgYSBwb3RlbnRpYWwgcmVjdXJyZW5jZSwgb3IgaXQgZG9lc24ndC4KKy8vLworY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpjcmVhdGVOb2RlRm9yUEhJKFBISU5vZGUgKlBOKSB7CisgIGlmIChjb25zdCBMb29wICpMID0gTEktPmdldExvb3BGb3IoUE4tPmdldFBhcmVudCgpKSkKKyAgICBpZiAoTC0+Z2V0SGVhZGVyKCkgPT0gUE4tPmdldFBhcmVudCgpKSB7CisgICAgICAvLyBUaGUgbG9vcCBtYXkgaGF2ZSBtdWx0aXBsZSBlbnRyYW5jZXMgb3IgbXVsdGlwbGUgZXhpdHM7IHdlIGNhbiBhbmFseXplCisgICAgICAvLyB0aGlzIHBoaSBhcyBhbiBhZGRyZWMgaWYgaXQgaGFzIGEgdW5pcXVlIGVudHJ5IHZhbHVlIGFuZCBhIHVuaXF1ZQorICAgICAgLy8gYmFja2VkZ2UgdmFsdWUuCisgICAgICBWYWx1ZSAqQkVWYWx1ZVYgPSAwLCAqU3RhcnRWYWx1ZVYgPSAwOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBWYWx1ZSAqViA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpOworICAgICAgICBpZiAoTC0+Y29udGFpbnMoUE4tPmdldEluY29taW5nQmxvY2soaSkpKSB7CisgICAgICAgICAgaWYgKCFCRVZhbHVlVikgeworICAgICAgICAgICAgQkVWYWx1ZVYgPSBWOworICAgICAgICAgIH0gZWxzZSBpZiAoQkVWYWx1ZVYgIT0gVikgeworICAgICAgICAgICAgQkVWYWx1ZVYgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFTdGFydFZhbHVlVikgeworICAgICAgICAgIFN0YXJ0VmFsdWVWID0gVjsKKyAgICAgICAgfSBlbHNlIGlmIChTdGFydFZhbHVlViAhPSBWKSB7CisgICAgICAgICAgU3RhcnRWYWx1ZVYgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoQkVWYWx1ZVYgJiYgU3RhcnRWYWx1ZVYpIHsKKyAgICAgICAgLy8gV2hpbGUgd2UgYXJlIGFuYWx5emluZyB0aGlzIFBISSBub2RlLCBoYW5kbGUgaXRzIHZhbHVlIHN5bWJvbGljYWxseS4KKyAgICAgICAgY29uc3QgU0NFViAqU3ltYm9saWNOYW1lID0gZ2V0VW5rbm93bihQTik7CisgICAgICAgIGFzc2VydChTY2FsYXJzLmZpbmQoUE4pID09IFNjYWxhcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICJQSEkgbm9kZSBhbHJlYWR5IHByb2Nlc3NlZD8iKTsKKyAgICAgICAgU2NhbGFycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoU0NFVkNhbGxiYWNrVkgoUE4sIHRoaXMpLCBTeW1ib2xpY05hbWUpKTsKKworICAgICAgICAvLyBVc2luZyB0aGlzIHN5bWJvbGljIG5hbWUgZm9yIHRoZSBQSEksIGFuYWx5emUgdGhlIHZhbHVlIGNvbWluZyBhcm91bmQKKyAgICAgICAgLy8gdGhlIGJhY2stZWRnZS4KKyAgICAgICAgY29uc3QgU0NFViAqQkVWYWx1ZSA9IGdldFNDRVYoQkVWYWx1ZVYpOworCisgICAgICAgIC8vIE5PVEU6IElmIEJFVmFsdWUgaXMgbG9vcCBpbnZhcmlhbnQsIHdlIGtub3cgdGhhdCB0aGUgUEhJIG5vZGUganVzdAorICAgICAgICAvLyBoYXMgYSBzcGVjaWFsIHZhbHVlIGZvciB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wLgorCisgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBjb21pbmcgYXJvdW5kIHRoZSBiYWNrZWRnZSBpcyBhbiBhZGQgd2l0aCB0aGUgc3ltYm9saWMKKyAgICAgICAgLy8gdmFsdWUgd2UganVzdCBpbnNlcnRlZCwgdGhlbiB3ZSBmb3VuZCBhIHNpbXBsZSBpbmR1Y3Rpb24gdmFyaWFibGUhCisgICAgICAgIGlmIChjb25zdCBTQ0VWQWRkRXhwciAqQWRkID0gZHluX2Nhc3Q8U0NFVkFkZEV4cHI+KEJFVmFsdWUpKSB7CisgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzaW5nbGUgb2NjdXJyZW5jZSBvZiB0aGUgc3ltYm9saWMgdmFsdWUsIHJlcGxhY2UgaXQKKyAgICAgICAgICAvLyB3aXRoIGEgcmVjdXJyZW5jZS4KKyAgICAgICAgICB1bnNpZ25lZCBGb3VuZEluZGV4ID0gQWRkLT5nZXROdW1PcGVyYW5kcygpOworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBZGQtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgaWYgKEFkZC0+Z2V0T3BlcmFuZChpKSA9PSBTeW1ib2xpY05hbWUpCisgICAgICAgICAgICAgIGlmIChGb3VuZEluZGV4ID09IGUpIHsKKyAgICAgICAgICAgICAgICBGb3VuZEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKEZvdW5kSW5kZXggIT0gQWRkLT5nZXROdW1PcGVyYW5kcygpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gYWRkIHdpdGggZXZlcnl0aGluZyBidXQgdGhlIHNwZWNpZmllZCBvcGVyYW5kLgorICAgICAgICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBPcHM7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQWRkLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICAgICAgaWYgKGkgIT0gRm91bmRJbmRleCkKKyAgICAgICAgICAgICAgICBPcHMucHVzaF9iYWNrKEFkZC0+Z2V0T3BlcmFuZChpKSk7CisgICAgICAgICAgICBjb25zdCBTQ0VWICpBY2N1bSA9IGdldEFkZEV4cHIoT3BzKTsKKworICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB2YWxpZCBhZGRyZWMgaWYgdGhlIHN0ZXAgYW1vdW50IGlzIHZhcnlpbmcgZWFjaAorICAgICAgICAgICAgLy8gbG9vcCBpdGVyYXRpb24sIGJ1dCBpcyBub3QgaXRzZWxmIGFuIGFkZHJlYyBpbiB0aGlzIGxvb3AuCisgICAgICAgICAgICBpZiAoQWNjdW0tPmlzTG9vcEludmFyaWFudChMKSB8fAorICAgICAgICAgICAgICAgIChpc2E8U0NFVkFkZFJlY0V4cHI+KEFjY3VtKSAmJgorICAgICAgICAgICAgICAgICBjYXN0PFNDRVZBZGRSZWNFeHByPihBY2N1bSktPmdldExvb3AoKSA9PSBMKSkgeworICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlOworICAgICAgICAgICAgICBib29sIEhhc05TVyA9IGZhbHNlOworCisgICAgICAgICAgICAgIC8vIElmIHRoZSBpbmNyZW1lbnQgZG9lc24ndCBvdmVyZmxvdywgdGhlbiBuZWl0aGVyIHRoZSBhZGRyZWMgbm9yCisgICAgICAgICAgICAgIC8vIHRoZSBwb3N0LWluY3JlbWVudCB3aWxsIG92ZXJmbG93LgorICAgICAgICAgICAgICBpZiAoY29uc3QgQWRkT3BlcmF0b3IgKk9CTyA9IGR5bl9jYXN0PEFkZE9wZXJhdG9yPihCRVZhbHVlVikpIHsKKyAgICAgICAgICAgICAgICBpZiAoT0JPLT5oYXNOb1Vuc2lnbmVkV3JhcCgpKQorICAgICAgICAgICAgICAgICAgSGFzTlVXID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoT0JPLT5oYXNOb1NpZ25lZFdyYXAoKSkKKyAgICAgICAgICAgICAgICAgIEhhc05TVyA9IHRydWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb25zdCBTQ0VWICpTdGFydFZhbCA9IGdldFNDRVYoU3RhcnRWYWx1ZVYpOworICAgICAgICAgICAgICBjb25zdCBTQ0VWICpQSElTQ0VWID0KKyAgICAgICAgICAgICAgICBnZXRBZGRSZWNFeHByKFN0YXJ0VmFsLCBBY2N1bSwgTCwgSGFzTlVXLCBIYXNOU1cpOworCisgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBuby13cmFwIGZsYWdzIGFyZSBvbiB0aGUgaW5jcmVtZW50LCB0aGV5IGFwcGx5IHRvIHRoZQorICAgICAgICAgICAgICAvLyBwb3N0LWluY3JlbWVudGVkIHZhbHVlIGFzIHdlbGwuCisgICAgICAgICAgICAgIGlmIChBY2N1bS0+aXNMb29wSW52YXJpYW50KEwpKQorICAgICAgICAgICAgICAgICh2b2lkKWdldEFkZFJlY0V4cHIoZ2V0QWRkRXhwcihTdGFydFZhbCwgQWNjdW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjdW0sIEwsIEhhc05VVywgSGFzTlNXKTsKKworICAgICAgICAgICAgICAvLyBPa2F5LCBmb3IgdGhlIGVudGlyZSBhbmFseXNpcyBvZiB0aGlzIGVkZ2Ugd2UgYXNzdW1lZCB0aGUgUEhJCisgICAgICAgICAgICAgIC8vIHRvIGJlIHN5bWJvbGljLiAgV2Ugbm93IG5lZWQgdG8gZ28gYmFjayBhbmQgcHVyZ2UgYWxsIG9mIHRoZQorICAgICAgICAgICAgICAvLyBlbnRyaWVzIGZvciB0aGUgc2NhbGFycyB0aGF0IHVzZSB0aGUgc3ltYm9saWMgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgICAgRm9yZ2V0U3ltYm9saWNOYW1lKFBOLCBTeW1ib2xpY05hbWUpOworICAgICAgICAgICAgICBTY2FsYXJzW1NDRVZDYWxsYmFja1ZIKFBOLCB0aGlzKV0gPSBQSElTQ0VWOworICAgICAgICAgICAgICByZXR1cm4gUEhJU0NFVjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFkZFJlYyA9CisgICAgICAgICAgICAgICAgICAgICBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oQkVWYWx1ZSkpIHsKKyAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoaXMgY291bGQgYmUgYSBsb29wIGxpa2UgdGhpczoKKyAgICAgICAgICAvLyAgICAgaSA9IDA7ICBmb3IgKGogPSAxOyAuLjsgKytqKSB7IC4uLi4gIGkgPSBqOyB9CisgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBqID0gezEsKywxfSAgYW5kIEJFVmFsdWUgaXMgai4KKyAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBvdGhlciBpbi12YWx1ZSBvZiBpICgwKSBmaXRzIHRoZSBldm9sdXRpb24gb2YgQkVWYWx1ZQorICAgICAgICAgIC8vIGkgcmVhbGx5IGlzIGFuIGFkZHJlYyBldm9sdXRpb24uCisgICAgICAgICAgaWYgKEFkZFJlYy0+Z2V0TG9vcCgpID09IEwgJiYgQWRkUmVjLT5pc0FmZmluZSgpKSB7CisgICAgICAgICAgICBjb25zdCBTQ0VWICpTdGFydFZhbCA9IGdldFNDRVYoU3RhcnRWYWx1ZVYpOworCisgICAgICAgICAgICAvLyBJZiBTdGFydFZhbCA9IGouc3RhcnQgLSBqLnN0cmlkZSwgd2UgY2FuIHVzZSBTdGFydFZhbCBhcyB0aGUKKyAgICAgICAgICAgIC8vIGluaXRpYWwgc3RlcCBvZiB0aGUgYWRkcmVjIGV2b2x1dGlvbi4KKyAgICAgICAgICAgIGlmIChTdGFydFZhbCA9PSBnZXRNaW51c1NDRVYoQWRkUmVjLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRSZWMtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlBISVNDRVYgPQorICAgICAgICAgICAgICAgICBnZXRBZGRSZWNFeHByKFN0YXJ0VmFsLCBBZGRSZWMtPmdldE9wZXJhbmQoMSksIEwpOworCisgICAgICAgICAgICAgIC8vIE9rYXksIGZvciB0aGUgZW50aXJlIGFuYWx5c2lzIG9mIHRoaXMgZWRnZSB3ZSBhc3N1bWVkIHRoZSBQSEkKKyAgICAgICAgICAgICAgLy8gdG8gYmUgc3ltYm9saWMuICBXZSBub3cgbmVlZCB0byBnbyBiYWNrIGFuZCBwdXJnZSBhbGwgb2YgdGhlCisgICAgICAgICAgICAgIC8vIGVudHJpZXMgZm9yIHRoZSBzY2FsYXJzIHRoYXQgdXNlIHRoZSBzeW1ib2xpYyBleHByZXNzaW9uLgorICAgICAgICAgICAgICBGb3JnZXRTeW1ib2xpY05hbWUoUE4sIFN5bWJvbGljTmFtZSk7CisgICAgICAgICAgICAgIFNjYWxhcnNbU0NFVkNhbGxiYWNrVkgoUE4sIHRoaXMpXSA9IFBISVNDRVY7CisgICAgICAgICAgICAgIHJldHVybiBQSElTQ0VWOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAvLyBJZiB0aGUgUEhJIGhhcyBhIHNpbmdsZSBpbmNvbWluZyB2YWx1ZSwgZm9sbG93IHRoYXQgdmFsdWUsIHVubGVzcyB0aGUKKyAgLy8gUEhJJ3MgaW5jb21pbmcgYmxvY2tzIGFyZSBpbiBhIGRpZmZlcmVudCBsb29wLCBpbiB3aGljaCBjYXNlIGRvaW5nIHNvCisgIC8vIHJpc2tzIGJyZWFraW5nIExDU1NBIGZvcm0uIEluc3Rjb21iaW5lIHdvdWxkIG5vcm1hbGx5IHphcCB0aGVzZSwgYnV0CisgIC8vIGl0IGRvZXNuJ3QgaGF2ZSBEb21pbmF0b3JUcmVlIGluZm9ybWF0aW9uLCBzbyBpdCBtYXkgbWlzcyBjYXNlcy4KKyAgaWYgKFZhbHVlICpWID0gUE4tPmhhc0NvbnN0YW50VmFsdWUoRFQpKSB7CisgICAgYm9vbCBBbGxTYW1lTG9vcCA9IHRydWU7CisgICAgTG9vcCAqUE5Mb29wID0gTEktPmdldExvb3BGb3IoUE4tPmdldFBhcmVudCgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChMSS0+Z2V0TG9vcEZvcihQTi0+Z2V0SW5jb21pbmdCbG9jayhpKSkgIT0gUE5Mb29wKSB7CisgICAgICAgIEFsbFNhbWVMb29wID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGlmIChBbGxTYW1lTG9vcCkKKyAgICAgIHJldHVybiBnZXRTQ0VWKFYpOworICB9CisKKyAgLy8gSWYgaXQncyBub3QgYSBsb29wIHBoaSwgd2UgY2FuJ3QgaGFuZGxlIGl0IHlldC4KKyAgcmV0dXJuIGdldFVua25vd24oUE4pOworfQorCisvLy8gY3JlYXRlTm9kZUZvckdFUCAtIEV4cGFuZCBHRVAgaW5zdHJ1Y3Rpb25zIGludG8gYWRkIGFuZCBtdWx0aXBseQorLy8vIG9wZXJhdGlvbnMuIFRoaXMgYWxsb3dzIHRoZW0gdG8gYmUgYW5hbHl6ZWQgYnkgcmVndWxhciBTQ0VWIGNvZGUuCisvLy8KK2NvbnN0IFNDRVYgKlNjYWxhckV2b2x1dGlvbjo6Y3JlYXRlTm9kZUZvckdFUChHRVBPcGVyYXRvciAqR0VQKSB7CisKKyAgLy8gRG9uJ3QgYmxpbmRseSB0cmFuc2ZlciB0aGUgaW5ib3VuZHMgZmxhZyBmcm9tIHRoZSBHRVAgaW5zdHJ1Y3Rpb24gdG8gdGhlCisgIC8vIEFkZCBleHByZXNzaW9uLCBiZWNhdXNlIHRoZSBJbnN0cnVjdGlvbiBtYXkgYmUgZ3VhcmRlZCBieSBjb250cm9sIGZsb3cKKyAgLy8gYW5kIHRoZSBuby1vdmVyZmxvdyBiaXRzIG1heSBub3QgYmUgdmFsaWQgZm9yIHRoZSBleHByZXNzaW9uIGluIGFueQorICAvLyBjb250ZXh0LgorCisgIGNvbnN0IFR5cGUgKkludFB0clR5ID0gZ2V0RWZmZWN0aXZlU0NFVlR5cGUoR0VQLT5nZXRUeXBlKCkpOworICBWYWx1ZSAqQmFzZSA9IEdFUC0+Z2V0T3BlcmFuZCgwKTsKKyAgLy8gRG9uJ3QgYXR0ZW1wdCB0byBhbmFseXplIEdFUHMgb3ZlciB1bnNpemVkIG9iamVjdHMuCisgIGlmICghY2FzdDxQb2ludGVyVHlwZT4oQmFzZS0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNTaXplZCgpKQorICAgIHJldHVybiBnZXRVbmtub3duKEdFUCk7CisgIGNvbnN0IFNDRVYgKlRvdGFsT2Zmc2V0ID0gZ2V0Q29uc3RhbnQoSW50UHRyVHksIDApOworICBnZXBfdHlwZV9pdGVyYXRvciBHVEkgPSBnZXBfdHlwZV9iZWdpbihHRVApOworICBmb3IgKEdldEVsZW1lbnRQdHJJbnN0OjpvcF9pdGVyYXRvciBJID0gbGx2bTo6bmV4dChHRVAtPm9wX2JlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gR0VQLT5vcF9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIFZhbHVlICpJbmRleCA9ICpJOworICAgIC8vIENvbXB1dGUgdGhlIChwb3RlbnRpYWxseSBzeW1ib2xpYykgb2Zmc2V0IGluIGJ5dGVzIGZvciB0aGlzIGluZGV4LgorICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPigqR1RJKyspKSB7CisgICAgICAvLyBGb3IgYSBzdHJ1Y3QsIGFkZCB0aGUgbWVtYmVyIG9mZnNldC4KKyAgICAgIHVuc2lnbmVkIEZpZWxkTm8gPSBjYXN0PENvbnN0YW50SW50PihJbmRleCktPmdldFpFeHRWYWx1ZSgpOworICAgICAgY29uc3QgU0NFViAqRmllbGRPZmZzZXQgPSBnZXRPZmZzZXRPZkV4cHIoU1R5LCBGaWVsZE5vKTsKKworICAgICAgLy8gQWRkIHRoZSBmaWVsZCBvZmZzZXQgdG8gdGhlIHJ1bm5pbmcgdG90YWwgb2Zmc2V0LgorICAgICAgVG90YWxPZmZzZXQgPSBnZXRBZGRFeHByKFRvdGFsT2Zmc2V0LCBGaWVsZE9mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEZvciBhbiBhcnJheSwgYWRkIHRoZSBlbGVtZW50IG9mZnNldCwgZXhwbGljaXRseSBzY2FsZWQuCisgICAgICBjb25zdCBTQ0VWICpFbGVtZW50U2l6ZSA9IGdldFNpemVPZkV4cHIoKkdUSSk7CisgICAgICBjb25zdCBTQ0VWICpJbmRleFMgPSBnZXRTQ0VWKEluZGV4KTsKKyAgICAgIC8vIEdldGVsZW1lbnRwdHIgaW5kaWNlcyBhcmUgc2lnbmVkLgorICAgICAgSW5kZXhTID0gZ2V0VHJ1bmNhdGVPclNpZ25FeHRlbmQoSW5kZXhTLCBJbnRQdHJUeSk7CisKKyAgICAgIC8vIE11bHRpcGx5IHRoZSBpbmRleCBieSB0aGUgZWxlbWVudCBzaXplIHRvIGNvbXB1dGUgdGhlIGVsZW1lbnQgb2Zmc2V0LgorICAgICAgY29uc3QgU0NFViAqTG9jYWxPZmZzZXQgPSBnZXRNdWxFeHByKEluZGV4UywgRWxlbWVudFNpemUpOworCisgICAgICAvLyBBZGQgdGhlIGVsZW1lbnQgb2Zmc2V0IHRvIHRoZSBydW5uaW5nIHRvdGFsIG9mZnNldC4KKyAgICAgIFRvdGFsT2Zmc2V0ID0gZ2V0QWRkRXhwcihUb3RhbE9mZnNldCwgTG9jYWxPZmZzZXQpOworICAgIH0KKyAgfQorCisgIC8vIEdldCB0aGUgU0NFViBmb3IgdGhlIEdFUCBiYXNlLgorICBjb25zdCBTQ0VWICpCYXNlUyA9IGdldFNDRVYoQmFzZSk7CisKKyAgLy8gQWRkIHRoZSB0b3RhbCBvZmZzZXQgZnJvbSBhbGwgdGhlIEdFUCBpbmRpY2VzIHRvIHRoZSBiYXNlLgorICByZXR1cm4gZ2V0QWRkRXhwcihCYXNlUywgVG90YWxPZmZzZXQpOworfQorCisvLy8gR2V0TWluVHJhaWxpbmdaZXJvcyAtIERldGVybWluZSB0aGUgbWluaW11bSBudW1iZXIgb2YgemVybyBiaXRzIHRoYXQgUyBpcworLy8vIGd1YXJhbnRlZWQgdG8gZW5kIGluIChhdCBldmVyeSBsb29wIGl0ZXJhdGlvbikuICBJdCBpcywgYXQgdGhlIHNhbWUgdGltZSwKKy8vLyB0aGUgbWluaW11bSBudW1iZXIgb2YgdGltZXMgUyBpcyBkaXZpc2libGUgYnkgMi4gIEZvciBleGFtcGxlLCBnaXZlbiB7NCwrLDh9CisvLy8gaXQgcmV0dXJucyAyLiAgSWYgUyBpcyBndWFyYW50ZWVkIHRvIGJlIDAsIGl0IHJldHVybnMgdGhlIGJpdHdpZHRoIG9mIFMuCit1aW50MzJfdAorU2NhbGFyRXZvbHV0aW9uOjpHZXRNaW5UcmFpbGluZ1plcm9zKGNvbnN0IFNDRVYgKlMpIHsKKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oUykpCisgICAgcmV0dXJuIEMtPmdldFZhbHVlKCktPmdldFZhbHVlKCkuY291bnRUcmFpbGluZ1plcm9zKCk7CisKKyAgaWYgKGNvbnN0IFNDRVZUcnVuY2F0ZUV4cHIgKlQgPSBkeW5fY2FzdDxTQ0VWVHJ1bmNhdGVFeHByPihTKSkKKyAgICByZXR1cm4gc3RkOjptaW4oR2V0TWluVHJhaWxpbmdaZXJvcyhULT5nZXRPcGVyYW5kKCkpLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZ2V0VHlwZVNpemVJbkJpdHMoVC0+Z2V0VHlwZSgpKSk7CisKKyAgaWYgKGNvbnN0IFNDRVZaZXJvRXh0ZW5kRXhwciAqRSA9IGR5bl9jYXN0PFNDRVZaZXJvRXh0ZW5kRXhwcj4oUykpIHsKKyAgICB1aW50MzJfdCBPcFJlcyA9IEdldE1pblRyYWlsaW5nWmVyb3MoRS0+Z2V0T3BlcmFuZCgpKTsKKyAgICByZXR1cm4gT3BSZXMgPT0gZ2V0VHlwZVNpemVJbkJpdHMoRS0+Z2V0T3BlcmFuZCgpLT5nZXRUeXBlKCkpID8KKyAgICAgICAgICAgICBnZXRUeXBlU2l6ZUluQml0cyhFLT5nZXRUeXBlKCkpIDogT3BSZXM7CisgIH0KKworICBpZiAoY29uc3QgU0NFVlNpZ25FeHRlbmRFeHByICpFID0gZHluX2Nhc3Q8U0NFVlNpZ25FeHRlbmRFeHByPihTKSkgeworICAgIHVpbnQzMl90IE9wUmVzID0gR2V0TWluVHJhaWxpbmdaZXJvcyhFLT5nZXRPcGVyYW5kKCkpOworICAgIHJldHVybiBPcFJlcyA9PSBnZXRUeXBlU2l6ZUluQml0cyhFLT5nZXRPcGVyYW5kKCktPmdldFR5cGUoKSkgPworICAgICAgICAgICAgIGdldFR5cGVTaXplSW5CaXRzKEUtPmdldFR5cGUoKSkgOiBPcFJlczsKKyAgfQorCisgIGlmIChjb25zdCBTQ0VWQWRkRXhwciAqQSA9IGR5bl9jYXN0PFNDRVZBZGRFeHByPihTKSkgeworICAgIC8vIFRoZSByZXN1bHQgaXMgdGhlIG1pbiBvZiBhbGwgb3BlcmFuZHMgcmVzdWx0cy4KKyAgICB1aW50MzJfdCBNaW5PcFJlcyA9IEdldE1pblRyYWlsaW5nWmVyb3MoQS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IEEtPmdldE51bU9wZXJhbmRzKCk7IE1pbk9wUmVzICYmIGkgIT0gZTsgKytpKQorICAgICAgTWluT3BSZXMgPSBzdGQ6Om1pbihNaW5PcFJlcywgR2V0TWluVHJhaWxpbmdaZXJvcyhBLT5nZXRPcGVyYW5kKGkpKSk7CisgICAgcmV0dXJuIE1pbk9wUmVzOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZNdWxFeHByICpNID0gZHluX2Nhc3Q8U0NFVk11bEV4cHI+KFMpKSB7CisgICAgLy8gVGhlIHJlc3VsdCBpcyB0aGUgc3VtIG9mIGFsbCBvcGVyYW5kcyByZXN1bHRzLgorICAgIHVpbnQzMl90IFN1bU9wUmVzID0gR2V0TWluVHJhaWxpbmdaZXJvcyhNLT5nZXRPcGVyYW5kKDApKTsKKyAgICB1aW50MzJfdCBCaXRXaWR0aCA9IGdldFR5cGVTaXplSW5CaXRzKE0tPmdldFR5cGUoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE0tPmdldE51bU9wZXJhbmRzKCk7CisgICAgICAgICBTdW1PcFJlcyAhPSBCaXRXaWR0aCAmJiBpICE9IGU7ICsraSkKKyAgICAgIFN1bU9wUmVzID0gc3RkOjptaW4oU3VtT3BSZXMgKyBHZXRNaW5UcmFpbGluZ1plcm9zKE0tPmdldE9wZXJhbmQoaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRXaWR0aCk7CisgICAgcmV0dXJuIFN1bU9wUmVzOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KFMpKSB7CisgICAgLy8gVGhlIHJlc3VsdCBpcyB0aGUgbWluIG9mIGFsbCBvcGVyYW5kcyByZXN1bHRzLgorICAgIHVpbnQzMl90IE1pbk9wUmVzID0gR2V0TWluVHJhaWxpbmdaZXJvcyhBLT5nZXRPcGVyYW5kKDApKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gQS0+Z2V0TnVtT3BlcmFuZHMoKTsgTWluT3BSZXMgJiYgaSAhPSBlOyArK2kpCisgICAgICBNaW5PcFJlcyA9IHN0ZDo6bWluKE1pbk9wUmVzLCBHZXRNaW5UcmFpbGluZ1plcm9zKEEtPmdldE9wZXJhbmQoaSkpKTsKKyAgICByZXR1cm4gTWluT3BSZXM7CisgIH0KKworICBpZiAoY29uc3QgU0NFVlNNYXhFeHByICpNID0gZHluX2Nhc3Q8U0NFVlNNYXhFeHByPihTKSkgeworICAgIC8vIFRoZSByZXN1bHQgaXMgdGhlIG1pbiBvZiBhbGwgb3BlcmFuZHMgcmVzdWx0cy4KKyAgICB1aW50MzJfdCBNaW5PcFJlcyA9IEdldE1pblRyYWlsaW5nWmVyb3MoTS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE0tPmdldE51bU9wZXJhbmRzKCk7IE1pbk9wUmVzICYmIGkgIT0gZTsgKytpKQorICAgICAgTWluT3BSZXMgPSBzdGQ6Om1pbihNaW5PcFJlcywgR2V0TWluVHJhaWxpbmdaZXJvcyhNLT5nZXRPcGVyYW5kKGkpKSk7CisgICAgcmV0dXJuIE1pbk9wUmVzOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZVTWF4RXhwciAqTSA9IGR5bl9jYXN0PFNDRVZVTWF4RXhwcj4oUykpIHsKKyAgICAvLyBUaGUgcmVzdWx0IGlzIHRoZSBtaW4gb2YgYWxsIG9wZXJhbmRzIHJlc3VsdHMuCisgICAgdWludDMyX3QgTWluT3BSZXMgPSBHZXRNaW5UcmFpbGluZ1plcm9zKE0tPmdldE9wZXJhbmQoMCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBNLT5nZXROdW1PcGVyYW5kcygpOyBNaW5PcFJlcyAmJiBpICE9IGU7ICsraSkKKyAgICAgIE1pbk9wUmVzID0gc3RkOjptaW4oTWluT3BSZXMsIEdldE1pblRyYWlsaW5nWmVyb3MoTS0+Z2V0T3BlcmFuZChpKSkpOworICAgIHJldHVybiBNaW5PcFJlczsKKyAgfQorCisgIGlmIChjb25zdCBTQ0VWVW5rbm93biAqVSA9IGR5bl9jYXN0PFNDRVZVbmtub3duPihTKSkgeworICAgIC8vIEZvciBhIFNDRVZVbmtub3duLCBhc2sgVmFsdWVUcmFja2luZy4KKyAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IGdldFR5cGVTaXplSW5CaXRzKFUtPmdldFR5cGUoKSk7CisgICAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpOworICAgIEFQSW50IFplcm9zKEJpdFdpZHRoLCAwKSwgT25lcyhCaXRXaWR0aCwgMCk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoVS0+Z2V0VmFsdWUoKSwgTWFzaywgWmVyb3MsIE9uZXMpOworICAgIHJldHVybiBaZXJvcy5jb3VudFRyYWlsaW5nT25lcygpOworICB9CisKKyAgLy8gU0NFVlVEaXZFeHByCisgIHJldHVybiAwOworfQorCisvLy8gZ2V0VW5zaWduZWRSYW5nZSAtIERldGVybWluZSB0aGUgdW5zaWduZWQgcmFuZ2UgZm9yIGEgcGFydGljdWxhciBTQ0VWLgorLy8vCitDb25zdGFudFJhbmdlCitTY2FsYXJFdm9sdXRpb246OmdldFVuc2lnbmVkUmFuZ2UoY29uc3QgU0NFViAqUykgeworCisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KFMpKQorICAgIHJldHVybiBDb25zdGFudFJhbmdlKEMtPmdldFZhbHVlKCktPmdldFZhbHVlKCkpOworCisgIHVuc2lnbmVkIEJpdFdpZHRoID0gZ2V0VHlwZVNpemVJbkJpdHMoUy0+Z2V0VHlwZSgpKTsKKyAgQ29uc3RhbnRSYW5nZSBDb25zZXJ2YXRpdmVSZXN1bHQoQml0V2lkdGgsIC8qaXNGdWxsU2V0PSovdHJ1ZSk7CisKKyAgLy8gSWYgdGhlIHZhbHVlIGhhcyBrbm93biB6ZXJvcywgdGhlIG1heGltdW0gdW5zaWduZWQgdmFsdWUgd2lsbCBoYXZlIHRob3NlCisgIC8vIGtub3duIHplcm9zIGFzIHdlbGwuCisgIHVpbnQzMl90IFRaID0gR2V0TWluVHJhaWxpbmdaZXJvcyhTKTsKKyAgaWYgKFRaICE9IDApCisgICAgQ29uc2VydmF0aXZlUmVzdWx0ID0KKyAgICAgIENvbnN0YW50UmFuZ2UoQVBJbnQ6OmdldE1pblZhbHVlKEJpdFdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldE1heFZhbHVlKEJpdFdpZHRoKS5sc2hyKFRaKS5zaGwoVFopICsgMSk7CisKKyAgaWYgKGNvbnN0IFNDRVZBZGRFeHByICpBZGQgPSBkeW5fY2FzdDxTQ0VWQWRkRXhwcj4oUykpIHsKKyAgICBDb25zdGFudFJhbmdlIFggPSBnZXRVbnNpZ25lZFJhbmdlKEFkZC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IEFkZC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBYID0gWC5hZGQoZ2V0VW5zaWduZWRSYW5nZShBZGQtPmdldE9wZXJhbmQoaSkpKTsKKyAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0LmludGVyc2VjdFdpdGgoWCk7CisgIH0KKworICBpZiAoY29uc3QgU0NFVk11bEV4cHIgKk11bCA9IGR5bl9jYXN0PFNDRVZNdWxFeHByPihTKSkgeworICAgIENvbnN0YW50UmFuZ2UgWCA9IGdldFVuc2lnbmVkUmFuZ2UoTXVsLT5nZXRPcGVyYW5kKDApKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gTXVsLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIFggPSBYLm11bHRpcGx5KGdldFVuc2lnbmVkUmFuZ2UoTXVsLT5nZXRPcGVyYW5kKGkpKSk7CisgICAgcmV0dXJuIENvbnNlcnZhdGl2ZVJlc3VsdC5pbnRlcnNlY3RXaXRoKFgpOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZTTWF4RXhwciAqU01heCA9IGR5bl9jYXN0PFNDRVZTTWF4RXhwcj4oUykpIHsKKyAgICBDb25zdGFudFJhbmdlIFggPSBnZXRVbnNpZ25lZFJhbmdlKFNNYXgtPmdldE9wZXJhbmQoMCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBTTWF4LT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIFggPSBYLnNtYXgoZ2V0VW5zaWduZWRSYW5nZShTTWF4LT5nZXRPcGVyYW5kKGkpKSk7CisgICAgcmV0dXJuIENvbnNlcnZhdGl2ZVJlc3VsdC5pbnRlcnNlY3RXaXRoKFgpOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZVTWF4RXhwciAqVU1heCA9IGR5bl9jYXN0PFNDRVZVTWF4RXhwcj4oUykpIHsKKyAgICBDb25zdGFudFJhbmdlIFggPSBnZXRVbnNpZ25lZFJhbmdlKFVNYXgtPmdldE9wZXJhbmQoMCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBVTWF4LT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIFggPSBYLnVtYXgoZ2V0VW5zaWduZWRSYW5nZShVTWF4LT5nZXRPcGVyYW5kKGkpKSk7CisgICAgcmV0dXJuIENvbnNlcnZhdGl2ZVJlc3VsdC5pbnRlcnNlY3RXaXRoKFgpOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZVRGl2RXhwciAqVURpdiA9IGR5bl9jYXN0PFNDRVZVRGl2RXhwcj4oUykpIHsKKyAgICBDb25zdGFudFJhbmdlIFggPSBnZXRVbnNpZ25lZFJhbmdlKFVEaXYtPmdldExIUygpKTsKKyAgICBDb25zdGFudFJhbmdlIFkgPSBnZXRVbnNpZ25lZFJhbmdlKFVEaXYtPmdldFJIUygpKTsKKyAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0LmludGVyc2VjdFdpdGgoWC51ZGl2KFkpKTsKKyAgfQorCisgIGlmIChjb25zdCBTQ0VWWmVyb0V4dGVuZEV4cHIgKlpFeHQgPSBkeW5fY2FzdDxTQ0VWWmVyb0V4dGVuZEV4cHI+KFMpKSB7CisgICAgQ29uc3RhbnRSYW5nZSBYID0gZ2V0VW5zaWduZWRSYW5nZShaRXh0LT5nZXRPcGVyYW5kKCkpOworICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQuaW50ZXJzZWN0V2l0aChYLnplcm9FeHRlbmQoQml0V2lkdGgpKTsKKyAgfQorCisgIGlmIChjb25zdCBTQ0VWU2lnbkV4dGVuZEV4cHIgKlNFeHQgPSBkeW5fY2FzdDxTQ0VWU2lnbkV4dGVuZEV4cHI+KFMpKSB7CisgICAgQ29uc3RhbnRSYW5nZSBYID0gZ2V0VW5zaWduZWRSYW5nZShTRXh0LT5nZXRPcGVyYW5kKCkpOworICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQuaW50ZXJzZWN0V2l0aChYLnNpZ25FeHRlbmQoQml0V2lkdGgpKTsKKyAgfQorCisgIGlmIChjb25zdCBTQ0VWVHJ1bmNhdGVFeHByICpUcnVuYyA9IGR5bl9jYXN0PFNDRVZUcnVuY2F0ZUV4cHI+KFMpKSB7CisgICAgQ29uc3RhbnRSYW5nZSBYID0gZ2V0VW5zaWduZWRSYW5nZShUcnVuYy0+Z2V0T3BlcmFuZCgpKTsKKyAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0LmludGVyc2VjdFdpdGgoWC50cnVuY2F0ZShCaXRXaWR0aCkpOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBZGRSZWMgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUykpIHsKKyAgICAvLyBJZiB0aGVyZSdzIG5vIHVuc2lnbmVkIHdyYXAsIHRoZSB2YWx1ZSB3aWxsIG5ldmVyIGJlIGxlc3MgdGhhbiBpdHMKKyAgICAvLyBpbml0aWFsIHZhbHVlLgorICAgIGlmIChBZGRSZWMtPmhhc05vVW5zaWduZWRXcmFwKCkpCisgICAgICBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihBZGRSZWMtPmdldFN0YXJ0KCkpKQorICAgICAgICBpZiAoIUMtPmdldFZhbHVlKCktPmlzWmVybygpKQorICAgICAgICAgIENvbnNlcnZhdGl2ZVJlc3VsdCA9CisgICAgICAgICAgICBDb25zZXJ2YXRpdmVSZXN1bHQuaW50ZXJzZWN0V2l0aCgKKyAgICAgICAgICAgICAgQ29uc3RhbnRSYW5nZShDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLCBBUEludChCaXRXaWR0aCwgMCkpKTsKKworICAgIC8vIFRPRE86IG5vbi1hZmZpbmUgYWRkcmVjCisgICAgaWYgKEFkZFJlYy0+aXNBZmZpbmUoKSkgeworICAgICAgY29uc3QgVHlwZSAqVHkgPSBBZGRSZWMtPmdldFR5cGUoKTsKKyAgICAgIGNvbnN0IFNDRVYgKk1heEJFQ291bnQgPSBnZXRNYXhCYWNrZWRnZVRha2VuQ291bnQoQWRkUmVjLT5nZXRMb29wKCkpOworICAgICAgaWYgKCFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oTWF4QkVDb3VudCkgJiYKKyAgICAgICAgICBnZXRUeXBlU2l6ZUluQml0cyhNYXhCRUNvdW50LT5nZXRUeXBlKCkpIDw9IEJpdFdpZHRoKSB7CisgICAgICAgIE1heEJFQ291bnQgPSBnZXROb29wT3JaZXJvRXh0ZW5kKE1heEJFQ291bnQsIFR5KTsKKworICAgICAgICBjb25zdCBTQ0VWICpTdGFydCA9IEFkZFJlYy0+Z2V0U3RhcnQoKTsKKyAgICAgICAgY29uc3QgU0NFViAqU3RlcCA9IEFkZFJlYy0+Z2V0U3RlcFJlY3VycmVuY2UoKnRoaXMpOworCisgICAgICAgIENvbnN0YW50UmFuZ2UgU3RhcnRSYW5nZSA9IGdldFVuc2lnbmVkUmFuZ2UoU3RhcnQpOworICAgICAgICBDb25zdGFudFJhbmdlIFN0ZXBSYW5nZSA9IGdldFNpZ25lZFJhbmdlKFN0ZXApOworICAgICAgICBDb25zdGFudFJhbmdlIE1heEJFQ291bnRSYW5nZSA9IGdldFVuc2lnbmVkUmFuZ2UoTWF4QkVDb3VudCk7CisgICAgICAgIENvbnN0YW50UmFuZ2UgRW5kUmFuZ2UgPQorICAgICAgICAgIFN0YXJ0UmFuZ2UuYWRkKE1heEJFQ291bnRSYW5nZS5tdWx0aXBseShTdGVwUmFuZ2UpKTsKKworICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cuIFRoaXMgbXVzdCBiZSBkb25lIHdpdGggQ29uc3RhbnRSYW5nZSBhcml0aG1ldGljCisgICAgICAgIC8vIGJlY2F1c2Ugd2UgY291bGQgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBTY2FsYXJFdm9sdXRpb24gb3ZlcmZsb3cKKyAgICAgICAgLy8gY2hlY2tpbmcgY29kZS4KKyAgICAgICAgQ29uc3RhbnRSYW5nZSBFeHRTdGFydFJhbmdlID0gU3RhcnRSYW5nZS56ZXh0T3JUcnVuYyhCaXRXaWR0aCoyKzEpOworICAgICAgICBDb25zdGFudFJhbmdlIEV4dFN0ZXBSYW5nZSA9IFN0ZXBSYW5nZS5zZXh0T3JUcnVuYyhCaXRXaWR0aCoyKzEpOworICAgICAgICBDb25zdGFudFJhbmdlIEV4dE1heEJFQ291bnRSYW5nZSA9CisgICAgICAgICAgTWF4QkVDb3VudFJhbmdlLnpleHRPclRydW5jKEJpdFdpZHRoKjIrMSk7CisgICAgICAgIENvbnN0YW50UmFuZ2UgRXh0RW5kUmFuZ2UgPSBFbmRSYW5nZS56ZXh0T3JUcnVuYyhCaXRXaWR0aCoyKzEpOworICAgICAgICBpZiAoRXh0U3RhcnRSYW5nZS5hZGQoRXh0TWF4QkVDb3VudFJhbmdlLm11bHRpcGx5KEV4dFN0ZXBSYW5nZSkpICE9CisgICAgICAgICAgICBFeHRFbmRSYW5nZSkKKyAgICAgICAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0OworCisgICAgICAgIEFQSW50IE1pbiA9IEFQSW50T3BzOjp1bWluKFN0YXJ0UmFuZ2UuZ2V0VW5zaWduZWRNaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kUmFuZ2UuZ2V0VW5zaWduZWRNaW4oKSk7CisgICAgICAgIEFQSW50IE1heCA9IEFQSW50T3BzOjp1bWF4KFN0YXJ0UmFuZ2UuZ2V0VW5zaWduZWRNYXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kUmFuZ2UuZ2V0VW5zaWduZWRNYXgoKSk7CisgICAgICAgIGlmIChNaW4uaXNNaW5WYWx1ZSgpICYmIE1heC5pc01heFZhbHVlKCkpCisgICAgICAgICAgcmV0dXJuIENvbnNlcnZhdGl2ZVJlc3VsdDsKKyAgICAgICAgcmV0dXJuIENvbnNlcnZhdGl2ZVJlc3VsdC5pbnRlcnNlY3RXaXRoKENvbnN0YW50UmFuZ2UoTWluLCBNYXgrMSkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQ7CisgIH0KKworICBpZiAoY29uc3QgU0NFVlVua25vd24gKlUgPSBkeW5fY2FzdDxTQ0VWVW5rbm93bj4oUykpIHsKKyAgICAvLyBGb3IgYSBTQ0VWVW5rbm93biwgYXNrIFZhbHVlVHJhY2tpbmcuCisgICAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpOworICAgIEFQSW50IFplcm9zKEJpdFdpZHRoLCAwKSwgT25lcyhCaXRXaWR0aCwgMCk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoVS0+Z2V0VmFsdWUoKSwgTWFzaywgWmVyb3MsIE9uZXMsIFREKTsKKyAgICBpZiAoT25lcyA9PSB+WmVyb3MgKyAxKQorICAgICAgcmV0dXJuIENvbnNlcnZhdGl2ZVJlc3VsdDsKKyAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0LmludGVyc2VjdFdpdGgoQ29uc3RhbnRSYW5nZShPbmVzLCB+WmVyb3MgKyAxKSk7CisgIH0KKworICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0OworfQorCisvLy8gZ2V0U2lnbmVkUmFuZ2UgLSBEZXRlcm1pbmUgdGhlIHNpZ25lZCByYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIFNDRVYuCisvLy8KK0NvbnN0YW50UmFuZ2UKK1NjYWxhckV2b2x1dGlvbjo6Z2V0U2lnbmVkUmFuZ2UoY29uc3QgU0NFViAqUykgeworCisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KFMpKQorICAgIHJldHVybiBDb25zdGFudFJhbmdlKEMtPmdldFZhbHVlKCktPmdldFZhbHVlKCkpOworCisgIHVuc2lnbmVkIEJpdFdpZHRoID0gZ2V0VHlwZVNpemVJbkJpdHMoUy0+Z2V0VHlwZSgpKTsKKyAgQ29uc3RhbnRSYW5nZSBDb25zZXJ2YXRpdmVSZXN1bHQoQml0V2lkdGgsIC8qaXNGdWxsU2V0PSovdHJ1ZSk7CisKKyAgLy8gSWYgdGhlIHZhbHVlIGhhcyBrbm93biB6ZXJvcywgdGhlIG1heGltdW0gc2lnbmVkIHZhbHVlIHdpbGwgaGF2ZSB0aG9zZQorICAvLyBrbm93biB6ZXJvcyBhcyB3ZWxsLgorICB1aW50MzJfdCBUWiA9IEdldE1pblRyYWlsaW5nWmVyb3MoUyk7CisgIGlmIChUWiAhPSAwKQorICAgIENvbnNlcnZhdGl2ZVJlc3VsdCA9CisgICAgICBDb25zdGFudFJhbmdlKEFQSW50OjpnZXRTaWduZWRNaW5WYWx1ZShCaXRXaWR0aCksCisgICAgICAgICAgICAgICAgICAgIEFQSW50OjpnZXRTaWduZWRNYXhWYWx1ZShCaXRXaWR0aCkuYXNocihUWikuc2hsKFRaKSArIDEpOworCisgIGlmIChjb25zdCBTQ0VWQWRkRXhwciAqQWRkID0gZHluX2Nhc3Q8U0NFVkFkZEV4cHI+KFMpKSB7CisgICAgQ29uc3RhbnRSYW5nZSBYID0gZ2V0U2lnbmVkUmFuZ2UoQWRkLT5nZXRPcGVyYW5kKDApKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gQWRkLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIFggPSBYLmFkZChnZXRTaWduZWRSYW5nZShBZGQtPmdldE9wZXJhbmQoaSkpKTsKKyAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0LmludGVyc2VjdFdpdGgoWCk7CisgIH0KKworICBpZiAoY29uc3QgU0NFVk11bEV4cHIgKk11bCA9IGR5bl9jYXN0PFNDRVZNdWxFeHByPihTKSkgeworICAgIENvbnN0YW50UmFuZ2UgWCA9IGdldFNpZ25lZFJhbmdlKE11bC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE11bC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBYID0gWC5tdWx0aXBseShnZXRTaWduZWRSYW5nZShNdWwtPmdldE9wZXJhbmQoaSkpKTsKKyAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0LmludGVyc2VjdFdpdGgoWCk7CisgIH0KKworICBpZiAoY29uc3QgU0NFVlNNYXhFeHByICpTTWF4ID0gZHluX2Nhc3Q8U0NFVlNNYXhFeHByPihTKSkgeworICAgIENvbnN0YW50UmFuZ2UgWCA9IGdldFNpZ25lZFJhbmdlKFNNYXgtPmdldE9wZXJhbmQoMCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBTTWF4LT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIFggPSBYLnNtYXgoZ2V0U2lnbmVkUmFuZ2UoU01heC0+Z2V0T3BlcmFuZChpKSkpOworICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQuaW50ZXJzZWN0V2l0aChYKTsKKyAgfQorCisgIGlmIChjb25zdCBTQ0VWVU1heEV4cHIgKlVNYXggPSBkeW5fY2FzdDxTQ0VWVU1heEV4cHI+KFMpKSB7CisgICAgQ29uc3RhbnRSYW5nZSBYID0gZ2V0U2lnbmVkUmFuZ2UoVU1heC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFVNYXgtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgWCA9IFgudW1heChnZXRTaWduZWRSYW5nZShVTWF4LT5nZXRPcGVyYW5kKGkpKSk7CisgICAgcmV0dXJuIENvbnNlcnZhdGl2ZVJlc3VsdC5pbnRlcnNlY3RXaXRoKFgpOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZVRGl2RXhwciAqVURpdiA9IGR5bl9jYXN0PFNDRVZVRGl2RXhwcj4oUykpIHsKKyAgICBDb25zdGFudFJhbmdlIFggPSBnZXRTaWduZWRSYW5nZShVRGl2LT5nZXRMSFMoKSk7CisgICAgQ29uc3RhbnRSYW5nZSBZID0gZ2V0U2lnbmVkUmFuZ2UoVURpdi0+Z2V0UkhTKCkpOworICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQuaW50ZXJzZWN0V2l0aChYLnVkaXYoWSkpOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZaZXJvRXh0ZW5kRXhwciAqWkV4dCA9IGR5bl9jYXN0PFNDRVZaZXJvRXh0ZW5kRXhwcj4oUykpIHsKKyAgICBDb25zdGFudFJhbmdlIFggPSBnZXRTaWduZWRSYW5nZShaRXh0LT5nZXRPcGVyYW5kKCkpOworICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQuaW50ZXJzZWN0V2l0aChYLnplcm9FeHRlbmQoQml0V2lkdGgpKTsKKyAgfQorCisgIGlmIChjb25zdCBTQ0VWU2lnbkV4dGVuZEV4cHIgKlNFeHQgPSBkeW5fY2FzdDxTQ0VWU2lnbkV4dGVuZEV4cHI+KFMpKSB7CisgICAgQ29uc3RhbnRSYW5nZSBYID0gZ2V0U2lnbmVkUmFuZ2UoU0V4dC0+Z2V0T3BlcmFuZCgpKTsKKyAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0LmludGVyc2VjdFdpdGgoWC5zaWduRXh0ZW5kKEJpdFdpZHRoKSk7CisgIH0KKworICBpZiAoY29uc3QgU0NFVlRydW5jYXRlRXhwciAqVHJ1bmMgPSBkeW5fY2FzdDxTQ0VWVHJ1bmNhdGVFeHByPihTKSkgeworICAgIENvbnN0YW50UmFuZ2UgWCA9IGdldFNpZ25lZFJhbmdlKFRydW5jLT5nZXRPcGVyYW5kKCkpOworICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQuaW50ZXJzZWN0V2l0aChYLnRydW5jYXRlKEJpdFdpZHRoKSk7CisgIH0KKworICBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFkZFJlYyA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihTKSkgeworICAgIC8vIElmIHRoZXJlJ3Mgbm8gc2lnbmVkIHdyYXAsIGFuZCBhbGwgdGhlIG9wZXJhbmRzIGhhdmUgdGhlIHNhbWUgc2lnbiBvcgorICAgIC8vIHplcm8sIHRoZSB2YWx1ZSB3b24ndCBldmVyIGNoYW5nZSBzaWduLgorICAgIGlmIChBZGRSZWMtPmhhc05vU2lnbmVkV3JhcCgpKSB7CisgICAgICBib29sIEFsbE5vbk5lZyA9IHRydWU7CisgICAgICBib29sIEFsbE5vblBvcyA9IHRydWU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQWRkUmVjLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBpZiAoIWlzS25vd25Ob25OZWdhdGl2ZShBZGRSZWMtPmdldE9wZXJhbmQoaSkpKSBBbGxOb25OZWcgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFpc0tub3duTm9uUG9zaXRpdmUoQWRkUmVjLT5nZXRPcGVyYW5kKGkpKSkgQWxsTm9uUG9zID0gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoQWxsTm9uTmVnKQorICAgICAgICBDb25zZXJ2YXRpdmVSZXN1bHQgPSBDb25zZXJ2YXRpdmVSZXN1bHQuaW50ZXJzZWN0V2l0aCgKKyAgICAgICAgICBDb25zdGFudFJhbmdlKEFQSW50KEJpdFdpZHRoLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50OjpnZXRTaWduZWRNaW5WYWx1ZShCaXRXaWR0aCkpKTsKKyAgICAgIGVsc2UgaWYgKEFsbE5vblBvcykKKyAgICAgICAgQ29uc2VydmF0aXZlUmVzdWx0ID0gQ29uc2VydmF0aXZlUmVzdWx0LmludGVyc2VjdFdpdGgoCisgICAgICAgICAgQ29uc3RhbnRSYW5nZShBUEludDo6Z2V0U2lnbmVkTWluVmFsdWUoQml0V2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQoQml0V2lkdGgsIDEpKSk7CisgICAgfQorCisgICAgLy8gVE9ETzogbm9uLWFmZmluZSBhZGRyZWMKKyAgICBpZiAoQWRkUmVjLT5pc0FmZmluZSgpKSB7CisgICAgICBjb25zdCBUeXBlICpUeSA9IEFkZFJlYy0+Z2V0VHlwZSgpOworICAgICAgY29uc3QgU0NFViAqTWF4QkVDb3VudCA9IGdldE1heEJhY2tlZGdlVGFrZW5Db3VudChBZGRSZWMtPmdldExvb3AoKSk7CisgICAgICBpZiAoIWlzYTxTQ0VWQ291bGROb3RDb21wdXRlPihNYXhCRUNvdW50KSAmJgorICAgICAgICAgIGdldFR5cGVTaXplSW5CaXRzKE1heEJFQ291bnQtPmdldFR5cGUoKSkgPD0gQml0V2lkdGgpIHsKKyAgICAgICAgTWF4QkVDb3VudCA9IGdldE5vb3BPclplcm9FeHRlbmQoTWF4QkVDb3VudCwgVHkpOworCisgICAgICAgIGNvbnN0IFNDRVYgKlN0YXJ0ID0gQWRkUmVjLT5nZXRTdGFydCgpOworICAgICAgICBjb25zdCBTQ0VWICpTdGVwID0gQWRkUmVjLT5nZXRTdGVwUmVjdXJyZW5jZSgqdGhpcyk7CisKKyAgICAgICAgQ29uc3RhbnRSYW5nZSBTdGFydFJhbmdlID0gZ2V0U2lnbmVkUmFuZ2UoU3RhcnQpOworICAgICAgICBDb25zdGFudFJhbmdlIFN0ZXBSYW5nZSA9IGdldFNpZ25lZFJhbmdlKFN0ZXApOworICAgICAgICBDb25zdGFudFJhbmdlIE1heEJFQ291bnRSYW5nZSA9IGdldFVuc2lnbmVkUmFuZ2UoTWF4QkVDb3VudCk7CisgICAgICAgIENvbnN0YW50UmFuZ2UgRW5kUmFuZ2UgPQorICAgICAgICAgIFN0YXJ0UmFuZ2UuYWRkKE1heEJFQ291bnRSYW5nZS5tdWx0aXBseShTdGVwUmFuZ2UpKTsKKworICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cuIFRoaXMgbXVzdCBiZSBkb25lIHdpdGggQ29uc3RhbnRSYW5nZSBhcml0aG1ldGljCisgICAgICAgIC8vIGJlY2F1c2Ugd2UgY291bGQgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBTY2FsYXJFdm9sdXRpb24gb3ZlcmZsb3cKKyAgICAgICAgLy8gY2hlY2tpbmcgY29kZS4KKyAgICAgICAgQ29uc3RhbnRSYW5nZSBFeHRTdGFydFJhbmdlID0gU3RhcnRSYW5nZS5zZXh0T3JUcnVuYyhCaXRXaWR0aCoyKzEpOworICAgICAgICBDb25zdGFudFJhbmdlIEV4dFN0ZXBSYW5nZSA9IFN0ZXBSYW5nZS5zZXh0T3JUcnVuYyhCaXRXaWR0aCoyKzEpOworICAgICAgICBDb25zdGFudFJhbmdlIEV4dE1heEJFQ291bnRSYW5nZSA9CisgICAgICAgICAgTWF4QkVDb3VudFJhbmdlLnpleHRPclRydW5jKEJpdFdpZHRoKjIrMSk7CisgICAgICAgIENvbnN0YW50UmFuZ2UgRXh0RW5kUmFuZ2UgPSBFbmRSYW5nZS5zZXh0T3JUcnVuYyhCaXRXaWR0aCoyKzEpOworICAgICAgICBpZiAoRXh0U3RhcnRSYW5nZS5hZGQoRXh0TWF4QkVDb3VudFJhbmdlLm11bHRpcGx5KEV4dFN0ZXBSYW5nZSkpICE9CisgICAgICAgICAgICBFeHRFbmRSYW5nZSkKKyAgICAgICAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0OworCisgICAgICAgIEFQSW50IE1pbiA9IEFQSW50T3BzOjpzbWluKFN0YXJ0UmFuZ2UuZ2V0U2lnbmVkTWluKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZFJhbmdlLmdldFNpZ25lZE1pbigpKTsKKyAgICAgICAgQVBJbnQgTWF4ID0gQVBJbnRPcHM6OnNtYXgoU3RhcnRSYW5nZS5nZXRTaWduZWRNYXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kUmFuZ2UuZ2V0U2lnbmVkTWF4KCkpOworICAgICAgICBpZiAoTWluLmlzTWluU2lnbmVkVmFsdWUoKSAmJiBNYXguaXNNYXhTaWduZWRWYWx1ZSgpKQorICAgICAgICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQ7CisgICAgICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQuaW50ZXJzZWN0V2l0aChDb25zdGFudFJhbmdlKE1pbiwgTWF4KzEpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0OworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZVbmtub3duICpVID0gZHluX2Nhc3Q8U0NFVlVua25vd24+KFMpKSB7CisgICAgLy8gRm9yIGEgU0NFVlVua25vd24sIGFzayBWYWx1ZVRyYWNraW5nLgorICAgIGlmICghVS0+Z2V0VmFsdWUoKS0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpICYmICFURCkKKyAgICAgIHJldHVybiBDb25zZXJ2YXRpdmVSZXN1bHQ7CisgICAgdW5zaWduZWQgTlMgPSBDb21wdXRlTnVtU2lnbkJpdHMoVS0+Z2V0VmFsdWUoKSwgVEQpOworICAgIGlmIChOUyA9PSAxKQorICAgICAgcmV0dXJuIENvbnNlcnZhdGl2ZVJlc3VsdDsKKyAgICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0LmludGVyc2VjdFdpdGgoCisgICAgICBDb25zdGFudFJhbmdlKEFQSW50OjpnZXRTaWduZWRNaW5WYWx1ZShCaXRXaWR0aCkuYXNocihOUyAtIDEpLAorICAgICAgICAgICAgICAgICAgICBBUEludDo6Z2V0U2lnbmVkTWF4VmFsdWUoQml0V2lkdGgpLmFzaHIoTlMgLSAxKSsxKSk7CisgIH0KKworICByZXR1cm4gQ29uc2VydmF0aXZlUmVzdWx0OworfQorCisvLy8gY3JlYXRlU0NFViAtIFdlIGtub3cgdGhhdCB0aGVyZSBpcyBubyBTQ0VWIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgorLy8vIEFuYWx5emUgdGhlIGV4cHJlc3Npb24uCisvLy8KK2NvbnN0IFNDRVYgKlNjYWxhckV2b2x1dGlvbjo6Y3JlYXRlU0NFVihWYWx1ZSAqVikgeworICBpZiAoIWlzU0NFVmFibGUoVi0+Z2V0VHlwZSgpKSkKKyAgICByZXR1cm4gZ2V0VW5rbm93bihWKTsKKworICB1bnNpZ25lZCBPcGNvZGUgPSBJbnN0cnVjdGlvbjo6VXNlck9wMTsKKyAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKSB7CisgICAgT3Bjb2RlID0gSS0+Z2V0T3Bjb2RlKCk7CisKKyAgICAvLyBEb24ndCBhdHRlbXB0IHRvIGFuYWx5emUgaW5zdHJ1Y3Rpb25zIGluIGJsb2NrcyB0aGF0IGFyZW4ndAorICAgIC8vIHJlYWNoYWJsZS4gU3VjaCBpbnN0cnVjdGlvbnMgZG9uJ3QgbWF0dGVyLCBhbmQgdGhleSBhcmVuJ3QgcmVxdWlyZWQKKyAgICAvLyB0byBvYmV5IGJhc2ljIHJ1bGVzIGZvciBkZWZpbml0aW9ucyBkb21pbmF0aW5nIHVzZXMgd2hpY2ggdGhpcworICAgIC8vIGFuYWx5c2lzIGRlcGVuZHMgb24uCisgICAgaWYgKCFEVC0+aXNSZWFjaGFibGVGcm9tRW50cnkoSS0+Z2V0UGFyZW50KCkpKQorICAgICAgcmV0dXJuIGdldFVua25vd24oVik7CisgIH0gZWxzZSBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVikpCisgICAgT3Bjb2RlID0gQ0UtPmdldE9wY29kZSgpOworICBlbHNlIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpCisgICAgcmV0dXJuIGdldENvbnN0YW50KENJKTsKKyAgZWxzZSBpZiAoaXNhPENvbnN0YW50UG9pbnRlck51bGw+KFYpKQorICAgIHJldHVybiBnZXRDb25zdGFudChWLT5nZXRUeXBlKCksIDApOworICBlbHNlIGlmIChHbG9iYWxBbGlhcyAqR0EgPSBkeW5fY2FzdDxHbG9iYWxBbGlhcz4oVikpCisgICAgcmV0dXJuIEdBLT5tYXlCZU92ZXJyaWRkZW4oKSA/IGdldFVua25vd24oVikgOiBnZXRTQ0VWKEdBLT5nZXRBbGlhc2VlKCkpOworICBlbHNlCisgICAgcmV0dXJuIGdldFVua25vd24oVik7CisKKyAgT3BlcmF0b3IgKlUgPSBjYXN0PE9wZXJhdG9yPihWKTsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICAgIHJldHVybiBnZXRBZGRFeHByKGdldFNDRVYoVS0+Z2V0T3BlcmFuZCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDEpKSk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDoKKyAgICByZXR1cm4gZ2V0TXVsRXhwcihnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgIGdldFNDRVYoVS0+Z2V0T3BlcmFuZCgxKSkpOworICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICAgIHJldHVybiBnZXRVRGl2RXhwcihnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMSkpKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICAgIHJldHVybiBnZXRNaW51c1NDRVYoZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNDRVYoVS0+Z2V0T3BlcmFuZCgxKSkpOworICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgLy8gRm9yIGFuIGV4cHJlc3Npb24gbGlrZSB4JjI1NSB0aGF0IG1lcmVseSBtYXNrcyBvZmYgdGhlIGhpZ2ggYml0cywKKyAgICAvLyB1c2UgemV4dCh0cnVuYyh4KSkgYXMgdGhlIFNDRVYgZXhwcmVzc2lvbi4KKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFUtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBpZiAoQ0ktPmlzTnVsbFZhbHVlKCkpCisgICAgICAgIHJldHVybiBnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMSkpOworICAgICAgaWYgKENJLT5pc0FsbE9uZXNWYWx1ZSgpKQorICAgICAgICByZXR1cm4gZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIGNvbnN0IEFQSW50ICZBID0gQ0ktPmdldFZhbHVlKCk7CisKKyAgICAgIC8vIEluc3Rjb21iaW5lJ3MgU2hyaW5rRGVtYW5kZWRDb25zdGFudCBtYXkgc3RyaXAgYml0cyBvdXQgb2YKKyAgICAgIC8vIGNvbnN0YW50cywgb2JzY3VyaW5nIHdoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGEgbG93LWJpdHMgbWFzay4KKyAgICAgIC8vIFVzZSBDb21wdXRlTWFza2VkQml0cyB0byBjb21wdXRlIHdoYXQgU2hyaW5rRGVtYW5kZWRDb25zdGFudAorICAgICAgLy8ga25ldyBhYm91dCB0byByZWNvbnN0cnVjdCBhIGxvdy1iaXRzIG1hc2sgdmFsdWUuCisgICAgICB1bnNpZ25lZCBMWiA9IEEuY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgICAgIHVuc2lnbmVkIEJpdFdpZHRoID0gQS5nZXRCaXRXaWR0aCgpOworICAgICAgQVBJbnQgQWxsT25lcyA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpOworICAgICAgQVBJbnQgS25vd25aZXJvKEJpdFdpZHRoLCAwKSwgS25vd25PbmUoQml0V2lkdGgsIDApOworICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoVS0+Z2V0T3BlcmFuZCgwKSwgQWxsT25lcywgS25vd25aZXJvLCBLbm93bk9uZSwgVEQpOworCisgICAgICBBUEludCBFZmZlY3RpdmVNYXNrID0gQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsIEJpdFdpZHRoIC0gTFopOworCisgICAgICBpZiAoTFogIT0gMCAmJiAhKCh+QSAmIH5Lbm93blplcm8pICYgRWZmZWN0aXZlTWFzaykpCisgICAgICAgIHJldHVybgorICAgICAgICAgIGdldFplcm9FeHRlbmRFeHByKGdldFRydW5jYXRlRXhwcihnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyVHlwZTo6Z2V0KGdldENvbnRleHQoKSwgQml0V2lkdGggLSBMWikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUtPmdldFR5cGUoKSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICAgIC8vIElmIHRoZSBSSFMgb2YgdGhlIE9yIGlzIGEgY29uc3RhbnQsIHdlIG1heSBoYXZlIHNvbWV0aGluZyBsaWtlOgorICAgIC8vIFgqNCsxIHdoaWNoIGdvdCB0dXJuZWQgaW50byBYKjR8MS4gIEhhbmRsZSB0aGlzIGFzIGFuIEFkZCBzbyBsb29wCisgICAgLy8gb3B0aW1pemF0aW9ucyB3aWxsIHRyYW5zcGFyZW50bHkgaGFuZGxlIHRoaXMgY2FzZS4KKyAgICAvLworICAgIC8vIEluIG9yZGVyIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uIHRvIGJlIHNhZmUsIHRoZSBMSFMgbXVzdCBiZSBvZiB0aGUKKyAgICAvLyBmb3JtIFgqKDJebikgYW5kIHRoZSBPciBjb25zdGFudCBtdXN0IGJlIGxlc3MgdGhhbiAyXm4uCisgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihVLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgY29uc3QgU0NFViAqTEhTID0gZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIGNvbnN0IEFQSW50ICZDSVZhbCA9IENJLT5nZXRWYWx1ZSgpOworICAgICAgaWYgKEdldE1pblRyYWlsaW5nWmVyb3MoTEhTKSA+PQorICAgICAgICAgIChDSVZhbC5nZXRCaXRXaWR0aCgpIC0gQ0lWYWwuY291bnRMZWFkaW5nWmVyb3MoKSkpIHsKKyAgICAgICAgLy8gQnVpbGQgYSBwbGFpbiBhZGQgU0NFVi4KKyAgICAgICAgY29uc3QgU0NFViAqUyA9IGdldEFkZEV4cHIoTEhTLCBnZXRTQ0VWKENJKSk7CisgICAgICAgIC8vIElmIHRoZSBMSFMgb2YgdGhlIGFkZCB3YXMgYW4gYWRkcmVjIGFuZCBpdCBoYXMgbm8td3JhcCBmbGFncywKKyAgICAgICAgLy8gdHJhbnNmZXIgdGhlIG5vLXdyYXAgZmxhZ3MsIHNpbmNlIGFuIG9yIHdvbid0IGludHJvZHVjZSBhIHdyYXAuCisgICAgICAgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqTmV3QVIgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUykpIHsKKyAgICAgICAgICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqT2xkQVIgPSBjYXN0PFNDRVZBZGRSZWNFeHByPihMSFMpOworICAgICAgICAgIGlmIChPbGRBUi0+aGFzTm9VbnNpZ25lZFdyYXAoKSkKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8U0NFVkFkZFJlY0V4cHIgKj4oTmV3QVIpLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCh0cnVlKTsKKyAgICAgICAgICBpZiAoT2xkQVItPmhhc05vU2lnbmVkV3JhcCgpKQorICAgICAgICAgICAgY29uc3RfY2FzdDxTQ0VWQWRkUmVjRXhwciAqPihOZXdBUiktPnNldEhhc05vU2lnbmVkV3JhcCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUzsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFUtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAvLyBJZiB0aGUgUkhTIG9mIHRoZSB4b3IgaXMgYSBzaWduYml0LCB0aGVuIHRoaXMgaXMganVzdCBhbiBhZGQuCisgICAgICAvLyBJbnN0Y29tYmluZSB0dXJucyBhZGQgb2Ygc2lnbmJpdCBpbnRvIHhvciBhcyBhIHN0cmVuZ3RoIHJlZHVjdGlvbiBzdGVwLgorICAgICAgaWYgKENJLT5nZXRWYWx1ZSgpLmlzU2lnbkJpdCgpKQorICAgICAgICByZXR1cm4gZ2V0QWRkRXhwcihnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMSkpKTsKKworICAgICAgLy8gSWYgdGhlIFJIUyBvZiB4b3IgaXMgLTEsIHRoZW4gdGhpcyBpcyBhIG5vdCBvcGVyYXRpb24uCisgICAgICBpZiAoQ0ktPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICAgIHJldHVybiBnZXROb3RTQ0VWKGdldFNDRVYoVS0+Z2V0T3BlcmFuZCgwKSkpOworCisgICAgICAvLyBNb2RlbCB4b3IoYW5kKHgsIEMpLCBDKSBhcyBhbmQofngsIEMpLCBpZiBDIGlzIGEgbG93LWJpdHMgbWFzay4KKyAgICAgIC8vIFRoaXMgaXMgYSB2YXJpYW50IG9mIHRoZSBjaGVjayBmb3IgeG9yIHdpdGggLTEsIGFuZCBpdCBoYW5kbGVzCisgICAgICAvLyB0aGUgY2FzZSB3aGVyZSBpbnN0Y29tYmluZSBoYXMgdHJpbW1lZCBub24tZGVtYW5kZWQgYml0cyBvdXQKKyAgICAgIC8vIG9mIGFuIHhvciB3aXRoIC0xLgorICAgICAgaWYgKEJpbmFyeU9wZXJhdG9yICpCTyA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihVLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgaWYgKENvbnN0YW50SW50ICpMQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQk8tPmdldE9wZXJhbmQoMSkpKQorICAgICAgICAgIGlmIChCTy0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFuZCAmJgorICAgICAgICAgICAgICBMQ0ktPmdldFZhbHVlKCkgPT0gQ0ktPmdldFZhbHVlKCkpCisgICAgICAgICAgICBpZiAoY29uc3QgU0NFVlplcm9FeHRlbmRFeHByICpaID0KKyAgICAgICAgICAgICAgICAgIGR5bl9jYXN0PFNDRVZaZXJvRXh0ZW5kRXhwcj4oZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDApKSkpIHsKKyAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVVR5ID0gVS0+Z2V0VHlwZSgpOworICAgICAgICAgICAgICBjb25zdCBTQ0VWICpaMCA9IFotPmdldE9wZXJhbmQoKTsKKyAgICAgICAgICAgICAgY29uc3QgVHlwZSAqWjBUeSA9IFowLT5nZXRUeXBlKCk7CisgICAgICAgICAgICAgIHVuc2lnbmVkIFowVHlTaXplID0gZ2V0VHlwZVNpemVJbkJpdHMoWjBUeSk7CisKKyAgICAgICAgICAgICAgLy8gSWYgQyBpcyBhIGxvdy1iaXRzIG1hc2ssIHRoZSB6ZXJvIGV4dGVuZCBpcyBzZXJ2aW5nIHRvCisgICAgICAgICAgICAgIC8vIG1hc2sgb2ZmIHRoZSBoaWdoIGJpdHMuIENvbXBsZW1lbnQgdGhlIG9wZXJhbmQgYW5kCisgICAgICAgICAgICAgIC8vIHJlLWFwcGx5IHRoZSB6ZXh0LgorICAgICAgICAgICAgICBpZiAoQVBJbnRPcHM6OmlzTWFzayhaMFR5U2l6ZSwgQ0ktPmdldFZhbHVlKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRaZXJvRXh0ZW5kRXhwcihnZXROb3RTQ0VWKFowKSwgVVR5KTsKKworICAgICAgICAgICAgICAvLyBJZiBDIGlzIGEgc2luZ2xlIGJpdCwgaXQgbWF5IGJlIGluIHRoZSBzaWduLWJpdCBwb3NpdGlvbgorICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHplcm8tZXh0ZW5kLiBJbiB0aGlzIGNhc2UsIHJlcHJlc2VudCB0aGUgeG9yCisgICAgICAgICAgICAgIC8vIHVzaW5nIGFuIGFkZCwgd2hpY2ggaXMgZXF1aXZhbGVudCwgYW5kIHJlLWFwcGx5IHRoZSB6ZXh0LgorICAgICAgICAgICAgICBBUEludCBUcnVuYyA9IEFQSW50KENJLT5nZXRWYWx1ZSgpKS50cnVuYyhaMFR5U2l6ZSk7CisgICAgICAgICAgICAgIGlmIChBUEludChUcnVuYykuemV4dChnZXRUeXBlU2l6ZUluQml0cyhVVHkpKSA9PSBDSS0+Z2V0VmFsdWUoKSAmJgorICAgICAgICAgICAgICAgICAgVHJ1bmMuaXNTaWduQml0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFplcm9FeHRlbmRFeHByKGdldEFkZEV4cHIoWjAsIGdldENvbnN0YW50KFRydW5jKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVUeSk7CisgICAgICAgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDoKKyAgICAvLyBUdXJuIHNoaWZ0IGxlZnQgb2YgYSBjb25zdGFudCBhbW91bnQgaW50byBhIG11bHRpcGx5LgorICAgIGlmIChDb25zdGFudEludCAqU0EgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHVpbnQzMl90IEJpdFdpZHRoID0gY2FzdDxJbnRlZ2VyVHlwZT4oVS0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKTsKKworICAgICAgLy8gSWYgdGhlIHNoaWZ0IGNvdW50IGlzIG5vdCBsZXNzIHRoYW4gdGhlIGJpdHdpZHRoLCB0aGUgcmVzdWx0IG9mCisgICAgICAvLyB0aGUgc2hpZnQgaXMgdW5kZWZpbmVkLiBEb24ndCB0cnkgdG8gYW5hbHl6ZSBpdCwgYmVjYXVzZSB0aGUKKyAgICAgIC8vIHJlc29sdXRpb24gY2hvc2VuIGhlcmUgbWF5IGRpZmZlciBmcm9tIHRoZSByZXNvbHV0aW9uIGNob3NlbiBpbgorICAgICAgLy8gb3RoZXIgcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICAgICAgaWYgKFNBLT5nZXRWYWx1ZSgpLnVnZShCaXRXaWR0aCkpCisgICAgICAgIGJyZWFrOworCisgICAgICBDb25zdGFudCAqWCA9IENvbnN0YW50SW50OjpnZXQoZ2V0Q29udGV4dCgpLAorICAgICAgICBBUEludChCaXRXaWR0aCwgMSkuc2hsKFNBLT5nZXRaRXh0VmFsdWUoKSkpOworICAgICAgcmV0dXJuIGdldE11bEV4cHIoZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDApKSwgZ2V0U0NFVihYKSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6CisgICAgLy8gVHVybiBsb2dpY2FsIHNoaWZ0IHJpZ2h0IG9mIGEgY29uc3RhbnQgaW50byBhIHVuc2lnbmVkIGRpdmlkZS4KKyAgICBpZiAoQ29uc3RhbnRJbnQgKlNBID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFUtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICB1aW50MzJfdCBCaXRXaWR0aCA9IGNhc3Q8SW50ZWdlclR5cGU+KFUtPmdldFR5cGUoKSktPmdldEJpdFdpZHRoKCk7CisKKyAgICAgIC8vIElmIHRoZSBzaGlmdCBjb3VudCBpcyBub3QgbGVzcyB0aGFuIHRoZSBiaXR3aWR0aCwgdGhlIHJlc3VsdCBvZgorICAgICAgLy8gdGhlIHNoaWZ0IGlzIHVuZGVmaW5lZC4gRG9uJ3QgdHJ5IHRvIGFuYWx5emUgaXQsIGJlY2F1c2UgdGhlCisgICAgICAvLyByZXNvbHV0aW9uIGNob3NlbiBoZXJlIG1heSBkaWZmZXIgZnJvbSB0aGUgcmVzb2x1dGlvbiBjaG9zZW4gaW4KKyAgICAgIC8vIG90aGVyIHBhcnRzIG9mIHRoZSBjb21waWxlci4KKyAgICAgIGlmIChTQS0+Z2V0VmFsdWUoKS51Z2UoQml0V2lkdGgpKQorICAgICAgICBicmVhazsKKworICAgICAgQ29uc3RhbnQgKlggPSBDb25zdGFudEludDo6Z2V0KGdldENvbnRleHQoKSwKKyAgICAgICAgQVBJbnQoQml0V2lkdGgsIDEpLnNobChTQS0+Z2V0WkV4dFZhbHVlKCkpKTsKKyAgICAgIHJldHVybiBnZXRVRGl2RXhwcihnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMCkpLCBnZXRTQ0VWKFgpKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICAvLyBGb3IgYSB0d28tc2hpZnQgc2V4dC1pbnJlZywgdXNlIHNleHQodHJ1bmMoeCkpIGFzIHRoZSBTQ0VWIGV4cHJlc3Npb24uCisgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihVLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIGlmIChPcGVyYXRvciAqTCA9IGR5bl9jYXN0PE9wZXJhdG9yPihVLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgaWYgKEwtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGwgJiYKKyAgICAgICAgICAgIEwtPmdldE9wZXJhbmQoMSkgPT0gVS0+Z2V0T3BlcmFuZCgxKSkgeworICAgICAgICAgIHVpbnQ2NF90IEJpdFdpZHRoID0gZ2V0VHlwZVNpemVJbkJpdHMoVS0+Z2V0VHlwZSgpKTsKKworICAgICAgICAgIC8vIElmIHRoZSBzaGlmdCBjb3VudCBpcyBub3QgbGVzcyB0aGFuIHRoZSBiaXR3aWR0aCwgdGhlIHJlc3VsdCBvZgorICAgICAgICAgIC8vIHRoZSBzaGlmdCBpcyB1bmRlZmluZWQuIERvbid0IHRyeSB0byBhbmFseXplIGl0LCBiZWNhdXNlIHRoZQorICAgICAgICAgIC8vIHJlc29sdXRpb24gY2hvc2VuIGhlcmUgbWF5IGRpZmZlciBmcm9tIHRoZSByZXNvbHV0aW9uIGNob3NlbiBpbgorICAgICAgICAgIC8vIG90aGVyIHBhcnRzIG9mIHRoZSBjb21waWxlci4KKyAgICAgICAgICBpZiAoQ0ktPmdldFZhbHVlKCkudWdlKEJpdFdpZHRoKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgdWludDY0X3QgQW10ID0gQml0V2lkdGggLSBDSS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgICAgaWYgKEFtdCA9PSBCaXRXaWR0aCkKKyAgICAgICAgICAgIHJldHVybiBnZXRTQ0VWKEwtPmdldE9wZXJhbmQoMCkpOyAgICAgICAvLyBzaGlmdCBieSB6ZXJvIC0tPiBub29wCisgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBnZXRTaWduRXh0ZW5kRXhwcihnZXRUcnVuY2F0ZUV4cHIoZ2V0U0NFVihMLT5nZXRPcGVyYW5kKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyVHlwZTo6Z2V0KGdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFtdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVS0+Z2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICAgIHJldHVybiBnZXRUcnVuY2F0ZUV4cHIoZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDApKSwgVS0+Z2V0VHlwZSgpKTsKKworICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICAgIHJldHVybiBnZXRaZXJvRXh0ZW5kRXhwcihnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMCkpLCBVLT5nZXRUeXBlKCkpOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6CisgICAgcmV0dXJuIGdldFNpZ25FeHRlbmRFeHByKGdldFNDRVYoVS0+Z2V0T3BlcmFuZCgwKSksIFUtPmdldFR5cGUoKSk7CisKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICAvLyBCaXRDYXN0cyBhcmUgbm8tb3AgY2FzdHMgc28gd2UganVzdCBlbGltaW5hdGUgdGhlIGNhc3QuCisgICAgaWYgKGlzU0NFVmFibGUoVS0+Z2V0VHlwZSgpKSAmJiBpc1NDRVZhYmxlKFUtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkpCisgICAgICByZXR1cm4gZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDApKTsKKyAgICBicmVhazsKKworICAvLyBJdCdzIHRlbXB0aW5nIHRvIGhhbmRsZSBpbnR0b3B0ciBhbmQgcHRydG9pbnQgYXMgbm8tb3BzLCBob3dldmVyIHRoaXMgY2FuCisgIC8vIGxlYWQgdG8gcG9pbnRlciBleHByZXNzaW9ucyB3aGljaCBjYW5ub3Qgc2FmZWx5IGJlIGV4cGFuZGVkIHRvIEdFUHMsCisgIC8vIGJlY2F1c2UgU2NhbGFyRXZvbHV0aW9uIGRvZXNuJ3QgcmVzcGVjdCB0aGUgR0VQIGFsaWFzaW5nIHJ1bGVzIHdoZW4KKyAgLy8gc2ltcGxpZnlpbmcgaW50ZWdlciBleHByZXNzaW9ucy4KKworICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOgorICAgIHJldHVybiBjcmVhdGVOb2RlRm9yR0VQKGNhc3Q8R0VQT3BlcmF0b3I+KFUpKTsKKworICBjYXNlIEluc3RydWN0aW9uOjpQSEk6CisgICAgcmV0dXJuIGNyZWF0ZU5vZGVGb3JQSEkoY2FzdDxQSElOb2RlPihVKSk7CisKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2VsZWN0OgorICAgIC8vIFRoaXMgY291bGQgYmUgYSBzbWF4IG9yIHVtYXggdGhhdCB3YXMgbG93ZXJlZCBlYXJsaWVyLgorICAgIC8vIFRyeSB0byByZWNvdmVyIGl0LgorICAgIGlmIChJQ21wSW5zdCAqSUNJID0gZHluX2Nhc3Q8SUNtcEluc3Q+KFUtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICBWYWx1ZSAqTEhTID0gSUNJLT5nZXRPcGVyYW5kKDApOworICAgICAgVmFsdWUgKlJIUyA9IElDSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgIHN3aXRjaCAoSUNJLT5nZXRQcmVkaWNhdGUoKSkgeworICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTFQ6CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRToKKyAgICAgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHVDoKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOgorICAgICAgICAvLyBhID5zIGIgPyBhK3ggOiBiK3ggIC0+ICBzbWF4KGEsIGIpK3gKKyAgICAgICAgLy8gYSA+cyBiID8gYit4IDogYSt4ICAtPiAgc21pbihhLCBiKSt4CisgICAgICAgIGlmIChMSFMtPmdldFR5cGUoKSA9PSBVLT5nZXRUeXBlKCkpIHsKKyAgICAgICAgICBjb25zdCBTQ0VWICpMUyA9IGdldFNDRVYoTEhTKTsKKyAgICAgICAgICBjb25zdCBTQ0VWICpSUyA9IGdldFNDRVYoUkhTKTsKKyAgICAgICAgICBjb25zdCBTQ0VWICpMQSA9IGdldFNDRVYoVS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAgICAgY29uc3QgU0NFViAqUkEgPSBnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMikpOworICAgICAgICAgIGNvbnN0IFNDRVYgKkxEaWZmID0gZ2V0TWludXNTQ0VWKExBLCBMUyk7CisgICAgICAgICAgY29uc3QgU0NFViAqUkRpZmYgPSBnZXRNaW51c1NDRVYoUkEsIFJTKTsKKyAgICAgICAgICBpZiAoTERpZmYgPT0gUkRpZmYpCisgICAgICAgICAgICByZXR1cm4gZ2V0QWRkRXhwcihnZXRTTWF4RXhwcihMUywgUlMpLCBMRGlmZik7CisgICAgICAgICAgTERpZmYgPSBnZXRNaW51c1NDRVYoTEEsIFJTKTsKKyAgICAgICAgICBSRGlmZiA9IGdldE1pbnVzU0NFVihSQSwgTFMpOworICAgICAgICAgIGlmIChMRGlmZiA9PSBSRGlmZikKKyAgICAgICAgICAgIHJldHVybiBnZXRBZGRFeHByKGdldFNNaW5FeHByKExTLCBSUyksIExEaWZmKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOgorICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTEU6CisgICAgICAgIHN0ZDo6c3dhcChMSFMsIFJIUyk7CisgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHRToKKyAgICAgICAgLy8gYSA+dSBiID8gYSt4IDogYit4ICAtPiAgdW1heChhLCBiKSt4CisgICAgICAgIC8vIGEgPnUgYiA/IGIreCA6IGEreCAgLT4gIHVtaW4oYSwgYikreAorICAgICAgICBpZiAoTEhTLT5nZXRUeXBlKCkgPT0gVS0+Z2V0VHlwZSgpKSB7CisgICAgICAgICAgY29uc3QgU0NFViAqTFMgPSBnZXRTQ0VWKExIUyk7CisgICAgICAgICAgY29uc3QgU0NFViAqUlMgPSBnZXRTQ0VWKFJIUyk7CisgICAgICAgICAgY29uc3QgU0NFViAqTEEgPSBnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMSkpOworICAgICAgICAgIGNvbnN0IFNDRVYgKlJBID0gZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDIpKTsKKyAgICAgICAgICBjb25zdCBTQ0VWICpMRGlmZiA9IGdldE1pbnVzU0NFVihMQSwgTFMpOworICAgICAgICAgIGNvbnN0IFNDRVYgKlJEaWZmID0gZ2V0TWludXNTQ0VWKFJBLCBSUyk7CisgICAgICAgICAgaWYgKExEaWZmID09IFJEaWZmKQorICAgICAgICAgICAgcmV0dXJuIGdldEFkZEV4cHIoZ2V0VU1heEV4cHIoTFMsIFJTKSwgTERpZmYpOworICAgICAgICAgIExEaWZmID0gZ2V0TWludXNTQ0VWKExBLCBSUyk7CisgICAgICAgICAgUkRpZmYgPSBnZXRNaW51c1NDRVYoUkEsIExTKTsKKyAgICAgICAgICBpZiAoTERpZmYgPT0gUkRpZmYpCisgICAgICAgICAgICByZXR1cm4gZ2V0QWRkRXhwcihnZXRVTWluRXhwcihMUywgUlMpLCBMRGlmZik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOgorICAgICAgICAvLyBuICE9IDAgPyBuK3ggOiAxK3ggIC0+ICB1bWF4KG4sIDEpK3gKKyAgICAgICAgaWYgKExIUy0+Z2V0VHlwZSgpID09IFUtPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgaXNhPENvbnN0YW50SW50PihSSFMpICYmCisgICAgICAgICAgICBjYXN0PENvbnN0YW50SW50PihSSFMpLT5pc1plcm8oKSkgeworICAgICAgICAgIGNvbnN0IFNDRVYgKk9uZSA9IGdldENvbnN0YW50KExIUy0+Z2V0VHlwZSgpLCAxKTsKKyAgICAgICAgICBjb25zdCBTQ0VWICpMUyA9IGdldFNDRVYoTEhTKTsKKyAgICAgICAgICBjb25zdCBTQ0VWICpMQSA9IGdldFNDRVYoVS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAgICAgY29uc3QgU0NFViAqUkEgPSBnZXRTQ0VWKFUtPmdldE9wZXJhbmQoMikpOworICAgICAgICAgIGNvbnN0IFNDRVYgKkxEaWZmID0gZ2V0TWludXNTQ0VWKExBLCBMUyk7CisgICAgICAgICAgY29uc3QgU0NFViAqUkRpZmYgPSBnZXRNaW51c1NDRVYoUkEsIE9uZSk7CisgICAgICAgICAgaWYgKExEaWZmID09IFJEaWZmKQorICAgICAgICAgICAgcmV0dXJuIGdldEFkZEV4cHIoZ2V0VU1heEV4cHIoTFMsIE9uZSksIExEaWZmKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6CisgICAgICAgIC8vIG4gPT0gMCA/IDEreCA6IG4reCAgLT4gIHVtYXgobiwgMSkreAorICAgICAgICBpZiAoTEhTLT5nZXRUeXBlKCkgPT0gVS0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICBpc2E8Q29uc3RhbnRJbnQ+KFJIUykgJiYKKyAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KFJIUyktPmlzWmVybygpKSB7CisgICAgICAgICAgY29uc3QgU0NFViAqT25lID0gZ2V0Q29uc3RhbnQoTEhTLT5nZXRUeXBlKCksIDEpOworICAgICAgICAgIGNvbnN0IFNDRVYgKkxTID0gZ2V0U0NFVihMSFMpOworICAgICAgICAgIGNvbnN0IFNDRVYgKkxBID0gZ2V0U0NFVihVLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgICBjb25zdCBTQ0VWICpSQSA9IGdldFNDRVYoVS0+Z2V0T3BlcmFuZCgyKSk7CisgICAgICAgICAgY29uc3QgU0NFViAqTERpZmYgPSBnZXRNaW51c1NDRVYoTEEsIE9uZSk7CisgICAgICAgICAgY29uc3QgU0NFViAqUkRpZmYgPSBnZXRNaW51c1NDRVYoUkEsIExTKTsKKyAgICAgICAgICBpZiAoTERpZmYgPT0gUkRpZmYpCisgICAgICAgICAgICByZXR1cm4gZ2V0QWRkRXhwcihnZXRVTWF4RXhwcihMUywgT25lKSwgTERpZmYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgIGRlZmF1bHQ6IC8vIFdlIGNhbm5vdCBhbmFseXplIHRoaXMgZXhwcmVzc2lvbi4KKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBnZXRVbmtub3duKFYpOworfQorCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgIEl0ZXJhdGlvbiBDb3VudCBDb21wdXRhdGlvbiBDb2RlCisvLworCisvLy8gZ2V0QmFja2VkZ2VUYWtlbkNvdW50IC0gSWYgdGhlIHNwZWNpZmllZCBsb29wIGhhcyBhIHByZWRpY3RhYmxlCisvLy8gYmFja2VkZ2UtdGFrZW4gY291bnQsIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVybiBhIFNDRVZDb3VsZE5vdENvbXB1dGUKKy8vLyBvYmplY3QuIFRoZSBiYWNrZWRnZS10YWtlbiBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBsb29wIGhlYWRlcgorLy8vIHdpbGwgYmUgYnJhbmNoZWQgdG8gZnJvbSB3aXRoaW4gdGhlIGxvb3AuIFRoaXMgaXMgb25lIGxlc3MgdGhhbiB0aGUKKy8vLyB0cmlwIGNvdW50IG9mIHRoZSBsb29wLCBzaW5jZSBpdCBkb2Vzbid0IGNvdW50IHRoZSBmaXJzdCBpdGVyYXRpb24sCisvLy8gd2hlbiB0aGUgaGVhZGVyIGlzIGJyYW5jaGVkIHRvIGZyb20gb3V0c2lkZSB0aGUgbG9vcC4KKy8vLworLy8vIE5vdGUgdGhhdCBpdCBpcyBub3QgdmFsaWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBvbiBhIGxvb3Agd2l0aG91dCBhCisvLy8gbG9vcC1pbnZhcmlhbnQgYmFja2VkZ2UtdGFrZW4gY291bnQgKHNlZQorLy8vIGhhc0xvb3BJbnZhcmlhbnRCYWNrZWRnZVRha2VuQ291bnQpLgorLy8vCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldEJhY2tlZGdlVGFrZW5Db3VudChjb25zdCBMb29wICpMKSB7CisgIHJldHVybiBnZXRCYWNrZWRnZVRha2VuSW5mbyhMKS5FeGFjdDsKK30KKworLy8vIGdldE1heEJhY2tlZGdlVGFrZW5Db3VudCAtIFNpbWlsYXIgdG8gZ2V0QmFja2VkZ2VUYWtlbkNvdW50LCBleGNlcHQKKy8vLyByZXR1cm4gdGhlIGxlYXN0IFNDRVYgdmFsdWUgdGhhdCBpcyBrbm93biBuZXZlciB0byBiZSBsZXNzIHRoYW4gdGhlCisvLy8gYWN0dWFsIGJhY2tlZGdlIHRha2VuIGNvdW50LgorY29uc3QgU0NFViAqU2NhbGFyRXZvbHV0aW9uOjpnZXRNYXhCYWNrZWRnZVRha2VuQ291bnQoY29uc3QgTG9vcCAqTCkgeworICByZXR1cm4gZ2V0QmFja2VkZ2VUYWtlbkluZm8oTCkuTWF4OworfQorCisvLy8gUHVzaExvb3BQSElzIC0gUHVzaCBQSEkgbm9kZXMgaW4gdGhlIGhlYWRlciBvZiB0aGUgZ2l2ZW4gbG9vcAorLy8vIG9udG8gdGhlIGdpdmVuIFdvcmtsaXN0Lgorc3RhdGljIHZvaWQKK1B1c2hMb29wUEhJcyhjb25zdCBMb29wICpMLCBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJldvcmtsaXN0KSB7CisgIEJhc2ljQmxvY2sgKkhlYWRlciA9IEwtPmdldEhlYWRlcigpOworCisgIC8vIFB1c2ggYWxsIExvb3AtaGVhZGVyIFBISXMgb250byB0aGUgV29ya2xpc3Qgc3RhY2suCisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEhlYWRlci0+YmVnaW4oKTsKKyAgICAgICBQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEkpOyArK0kpCisgICAgV29ya2xpc3QucHVzaF9iYWNrKFBOKTsKK30KKworY29uc3QgU2NhbGFyRXZvbHV0aW9uOjpCYWNrZWRnZVRha2VuSW5mbyAmCitTY2FsYXJFdm9sdXRpb246OmdldEJhY2tlZGdlVGFrZW5JbmZvKGNvbnN0IExvb3AgKkwpIHsKKyAgLy8gSW5pdGlhbGx5IGluc2VydCBhIENvdWxkTm90Q29tcHV0ZSBmb3IgdGhpcyBsb29wLiBJZiB0aGUgaW5zZXJ0aW9uCisgIC8vIHN1Y2NlZWRzLCBwcm9jZWVkIHRvIGFjdHVhbGx5IGNvbXB1dGUgYSBiYWNrZWRnZS10YWtlbiBjb3VudCBhbmQKKyAgLy8gdXBkYXRlIHRoZSB2YWx1ZS4gVGhlIHRlbXBvcmFyeSBDb3VsZE5vdENvbXB1dGUgdmFsdWUgdGVsbHMgU0NFVgorICAvLyBjb2RlIGVsc2V3aGVyZSB0aGF0IGl0IHNob3VsZG4ndCBhdHRlbXB0IHRvIHJlcXVlc3QgYSBuZXcKKyAgLy8gYmFja2VkZ2UtdGFrZW4gY291bnQsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBpbmZpbml0ZSByZWN1cnNpb24uCisgIHN0ZDo6cGFpcjxzdGQ6Om1hcDxjb25zdCBMb29wICosIEJhY2tlZGdlVGFrZW5JbmZvPjo6aXRlcmF0b3IsIGJvb2w+IFBhaXIgPQorICAgIEJhY2tlZGdlVGFrZW5Db3VudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEwsIGdldENvdWxkTm90Q29tcHV0ZSgpKSk7CisgIGlmIChQYWlyLnNlY29uZCkgeworICAgIEJhY2tlZGdlVGFrZW5JbmZvIEJFQ291bnQgPSBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50KEwpOworICAgIGlmIChCRUNvdW50LkV4YWN0ICE9IGdldENvdWxkTm90Q29tcHV0ZSgpKSB7CisgICAgICBhc3NlcnQoQkVDb3VudC5FeGFjdC0+aXNMb29wSW52YXJpYW50KEwpICYmCisgICAgICAgICAgICAgQkVDb3VudC5NYXgtPmlzTG9vcEludmFyaWFudChMKSAmJgorICAgICAgICAgICAgICJDb21wdXRlZCBiYWNrZWRnZS10YWtlbiBjb3VudCBpc24ndCBsb29wIGludmFyaWFudCBmb3IgbG9vcCEiKTsKKyAgICAgICsrTnVtVHJpcENvdW50c0NvbXB1dGVkOworCisgICAgICAvLyBVcGRhdGUgdGhlIHZhbHVlIGluIHRoZSBtYXAuCisgICAgICBQYWlyLmZpcnN0LT5zZWNvbmQgPSBCRUNvdW50OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoQkVDb3VudC5NYXggIT0gZ2V0Q291bGROb3RDb21wdXRlKCkpCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdmFsdWUgaW4gdGhlIG1hcC4KKyAgICAgICAgUGFpci5maXJzdC0+c2Vjb25kID0gQkVDb3VudDsKKyAgICAgIGlmIChpc2E8UEhJTm9kZT4oTC0+Z2V0SGVhZGVyKCktPmJlZ2luKCkpKQorICAgICAgICAvLyBPbmx5IGNvdW50IGxvb3BzIHRoYXQgaGF2ZSBwaGkgbm9kZXMgYXMgbm90IGJlaW5nIGNvbXB1dGFibGUuCisgICAgICAgICsrTnVtVHJpcENvdW50c05vdENvbXB1dGVkOworICAgIH0KKworICAgIC8vIE5vdyB0aGF0IHdlIGtub3cgbW9yZSBhYm91dCB0aGUgdHJpcCBjb3VudCBmb3IgdGhpcyBsb29wLCBmb3JnZXQgYW55CisgICAgLy8gZXhpc3RpbmcgU0NFViB2YWx1ZXMgZm9yIFBISSBub2RlcyBpbiB0aGlzIGxvb3Agc2luY2UgdGhleSBhcmUgb25seQorICAgIC8vIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgbWFkZSB3aXRob3V0IHRoZSBiZW5lZml0IG9mIHRyaXAgY291bnQKKyAgICAvLyBpbmZvcm1hdGlvbi4gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBjb2RlIGluIGZvcmdldExvb3AsIGV4Y2VwdCB0aGF0CisgICAgLy8gaXQgaGFuZGxlcyBTQ0VWVW5rbm93biBQSEkgbm9kZXMgc3BlY2lhbGx5LgorICAgIGlmIChCRUNvdW50Lmhhc0FueUluZm8oKSkgeworICAgICAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24gKiwgMTY+IFdvcmtsaXN0OworICAgICAgUHVzaExvb3BQSElzKEwsIFdvcmtsaXN0KTsKKworICAgICAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24gKiwgOD4gVmlzaXRlZDsKKyAgICAgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgICAgICBJbnN0cnVjdGlvbiAqSSA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgICAgICBpZiAoIVZpc2l0ZWQuaW5zZXJ0KEkpKSBjb250aW51ZTsKKworICAgICAgICBzdGQ6Om1hcDxTQ0VWQ2FsbGJhY2tWSCwgY29uc3QgU0NFViAqPjo6aXRlcmF0b3IgSXQgPQorICAgICAgICAgIFNjYWxhcnMuZmluZChzdGF0aWNfY2FzdDxWYWx1ZSAqPihJKSk7CisgICAgICAgIGlmIChJdCAhPSBTY2FsYXJzLmVuZCgpKSB7CisgICAgICAgICAgLy8gU0NFVlVua25vd24gZm9yIGEgUEhJIGVpdGhlciBtZWFucyB0aGF0IGl0IGhhcyBhbiB1bnJlY29nbml6ZWQKKyAgICAgICAgICAvLyBzdHJ1Y3R1cmUsIG9yIGl0J3MgYSBQSEkgdGhhdCdzIGluIHRoZSBwcm9ncmVzcyBvZiBiZWluZyBjb21wdXRlZAorICAgICAgICAgIC8vIGJ5IGNyZWF0ZU5vZGVGb3JQSEkuICBJbiB0aGUgZm9ybWVyIGNhc2UsIGFkZGl0aW9uYWwgbG9vcCB0cmlwCisgICAgICAgICAgLy8gY291bnQgaW5mb3JtYXRpb24gaXNuJ3QgZ29pbmcgdG8gY2hhbmdlIGFueXRoaW5nLiBJbiB0aGUgbGF0ZXIKKyAgICAgICAgICAvLyBjYXNlLCBjcmVhdGVOb2RlRm9yUEhJIHdpbGwgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IHVwZGF0ZXMgb24gaXRzCisgICAgICAgICAgLy8gb3duIHdoZW4gaXQgZ2V0cyB0byB0aGF0IHBvaW50LgorICAgICAgICAgIGlmICghaXNhPFBISU5vZGU+KEkpIHx8ICFpc2E8U0NFVlVua25vd24+KEl0LT5zZWNvbmQpKSB7CisgICAgICAgICAgICBWYWx1ZXNBdFNjb3Blcy5lcmFzZShJdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIFNjYWxhcnMuZXJhc2UoSXQpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJKSkKKyAgICAgICAgICAgIENvbnN0YW50RXZvbHV0aW9uTG9vcEV4aXRWYWx1ZS5lcmFzZShQTik7CisgICAgICAgIH0KKworICAgICAgICBQdXNoRGVmVXNlQ2hpbGRyZW4oSSwgV29ya2xpc3QpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gUGFpci5maXJzdC0+c2Vjb25kOworfQorCisvLy8gZm9yZ2V0TG9vcCAtIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNsaWVudCB3aGVuIGl0IGhhcworLy8vIGNoYW5nZWQgYSBsb29wIGluIGEgd2F5IHRoYXQgbWF5IGVmZmVjdCBTY2FsYXJFdm9sdXRpb24ncyBhYmlsaXR5IHRvCisvLy8gY29tcHV0ZSBhIHRyaXAgY291bnQsIG9yIGlmIHRoZSBsb29wIGlzIGRlbGV0ZWQuCit2b2lkIFNjYWxhckV2b2x1dGlvbjo6Zm9yZ2V0TG9vcChjb25zdCBMb29wICpMKSB7CisgIC8vIERyb3AgYW55IHN0b3JlZCB0cmlwIGNvdW50IHZhbHVlLgorICBCYWNrZWRnZVRha2VuQ291bnRzLmVyYXNlKEwpOworCisgIC8vIERyb3AgaW5mb3JtYXRpb24gYWJvdXQgZXhwcmVzc2lvbnMgYmFzZWQgb24gbG9vcC1oZWFkZXIgUEhJcy4KKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24gKiwgMTY+IFdvcmtsaXN0OworICBQdXNoTG9vcFBISXMoTCwgV29ya2xpc3QpOworCisgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uICosIDg+IFZpc2l0ZWQ7CisgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgIEluc3RydWN0aW9uICpJID0gV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgaWYgKCFWaXNpdGVkLmluc2VydChJKSkgY29udGludWU7CisKKyAgICBzdGQ6Om1hcDxTQ0VWQ2FsbGJhY2tWSCwgY29uc3QgU0NFViAqPjo6aXRlcmF0b3IgSXQgPQorICAgICAgU2NhbGFycy5maW5kKHN0YXRpY19jYXN0PFZhbHVlICo+KEkpKTsKKyAgICBpZiAoSXQgIT0gU2NhbGFycy5lbmQoKSkgeworICAgICAgVmFsdWVzQXRTY29wZXMuZXJhc2UoSXQtPnNlY29uZCk7CisgICAgICBTY2FsYXJzLmVyYXNlKEl0KTsKKyAgICAgIGlmIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEkpKQorICAgICAgICBDb25zdGFudEV2b2x1dGlvbkxvb3BFeGl0VmFsdWUuZXJhc2UoUE4pOworICAgIH0KKworICAgIFB1c2hEZWZVc2VDaGlsZHJlbihJLCBXb3JrbGlzdCk7CisgIH0KK30KKworLy8vIGZvcmdldFZhbHVlIC0gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgY2xpZW50IHdoZW4gaXQgaGFzCisvLy8gY2hhbmdlZCBhIHZhbHVlIGluIGEgd2F5IHRoYXQgbWF5IGVmZmVjdCBpdHMgdmFsdWUsIG9yIHdoaWNoIG1heQorLy8vIGRpc2Nvbm5lY3QgaXQgZnJvbSBhIGRlZi11c2UgY2hhaW4gbGlua2luZyBpdCB0byBhIGxvb3AuCit2b2lkIFNjYWxhckV2b2x1dGlvbjo6Zm9yZ2V0VmFsdWUoVmFsdWUgKlYpIHsKKyAgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVik7CisgIGlmICghSSkgcmV0dXJuOworCisgIC8vIERyb3AgaW5mb3JtYXRpb24gYWJvdXQgZXhwcmVzc2lvbnMgYmFzZWQgb24gbG9vcC1oZWFkZXIgUEhJcy4KKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24gKiwgMTY+IFdvcmtsaXN0OworICBXb3JrbGlzdC5wdXNoX2JhY2soSSk7CisKKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24gKiwgOD4gVmlzaXRlZDsKKyAgd2hpbGUgKCFXb3JrbGlzdC5lbXB0eSgpKSB7CisgICAgSSA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgIGlmICghVmlzaXRlZC5pbnNlcnQoSSkpIGNvbnRpbnVlOworCisgICAgc3RkOjptYXA8U0NFVkNhbGxiYWNrVkgsIGNvbnN0IFNDRVYgKj46Oml0ZXJhdG9yIEl0ID0KKyAgICAgIFNjYWxhcnMuZmluZChzdGF0aWNfY2FzdDxWYWx1ZSAqPihJKSk7CisgICAgaWYgKEl0ICE9IFNjYWxhcnMuZW5kKCkpIHsKKyAgICAgIFZhbHVlc0F0U2NvcGVzLmVyYXNlKEl0LT5zZWNvbmQpOworICAgICAgU2NhbGFycy5lcmFzZShJdCk7CisgICAgICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJKSkKKyAgICAgICAgQ29uc3RhbnRFdm9sdXRpb25Mb29wRXhpdFZhbHVlLmVyYXNlKFBOKTsKKyAgICB9CisKKyAgICBQdXNoRGVmVXNlQ2hpbGRyZW4oSSwgV29ya2xpc3QpOworICB9Cit9CisKKy8vLyBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50IC0gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBiYWNrZWRnZQorLy8vIG9mIHRoZSBzcGVjaWZpZWQgbG9vcCB3aWxsIGV4ZWN1dGUuCitTY2FsYXJFdm9sdXRpb246OkJhY2tlZGdlVGFrZW5JbmZvCitTY2FsYXJFdm9sdXRpb246OkNvbXB1dGVCYWNrZWRnZVRha2VuQ291bnQoY29uc3QgTG9vcCAqTCkgeworICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrICosIDg+IEV4aXRpbmdCbG9ja3M7CisgIEwtPmdldEV4aXRpbmdCbG9ja3MoRXhpdGluZ0Jsb2Nrcyk7CisKKyAgLy8gRXhhbWluZSBhbGwgZXhpdHMgYW5kIHBpY2sgdGhlIG1vc3QgY29uc2VydmF0aXZlIHZhbHVlcy4KKyAgY29uc3QgU0NFViAqQkVDb3VudCA9IGdldENvdWxkTm90Q29tcHV0ZSgpOworICBjb25zdCBTQ0VWICpNYXhCRUNvdW50ID0gZ2V0Q291bGROb3RDb21wdXRlKCk7CisgIGJvb2wgQ291bGROb3RDb21wdXRlQkVDb3VudCA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRXhpdGluZ0Jsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQmFja2VkZ2VUYWtlbkluZm8gTmV3QlRJID0KKyAgICAgIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRGcm9tRXhpdChMLCBFeGl0aW5nQmxvY2tzW2ldKTsKKworICAgIGlmIChOZXdCVEkuRXhhY3QgPT0gZ2V0Q291bGROb3RDb21wdXRlKCkpIHsKKyAgICAgIC8vIFdlIGNvdWxkbid0IGNvbXB1dGUgYW4gZXhhY3QgdmFsdWUgZm9yIHRoaXMgZXhpdCwgc28KKyAgICAgIC8vIHdlIHdvbid0IGJlIGFibGUgdG8gY29tcHV0ZSBhbiBleGFjdCB2YWx1ZSBmb3IgdGhlIGxvb3AuCisgICAgICBDb3VsZE5vdENvbXB1dGVCRUNvdW50ID0gdHJ1ZTsKKyAgICAgIEJFQ291bnQgPSBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgICB9IGVsc2UgaWYgKCFDb3VsZE5vdENvbXB1dGVCRUNvdW50KSB7CisgICAgICBpZiAoQkVDb3VudCA9PSBnZXRDb3VsZE5vdENvbXB1dGUoKSkKKyAgICAgICAgQkVDb3VudCA9IE5ld0JUSS5FeGFjdDsKKyAgICAgIGVsc2UKKyAgICAgICAgQkVDb3VudCA9IGdldFVNaW5Gcm9tTWlzbWF0Y2hlZFR5cGVzKEJFQ291bnQsIE5ld0JUSS5FeGFjdCk7CisgICAgfQorICAgIGlmIChNYXhCRUNvdW50ID09IGdldENvdWxkTm90Q29tcHV0ZSgpKQorICAgICAgTWF4QkVDb3VudCA9IE5ld0JUSS5NYXg7CisgICAgZWxzZSBpZiAoTmV3QlRJLk1heCAhPSBnZXRDb3VsZE5vdENvbXB1dGUoKSkKKyAgICAgIE1heEJFQ291bnQgPSBnZXRVTWluRnJvbU1pc21hdGNoZWRUeXBlcyhNYXhCRUNvdW50LCBOZXdCVEkuTWF4KTsKKyAgfQorCisgIHJldHVybiBCYWNrZWRnZVRha2VuSW5mbyhCRUNvdW50LCBNYXhCRUNvdW50KTsKK30KKworLy8vIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRGcm9tRXhpdCAtIENvbXB1dGUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYmFja2VkZ2UKKy8vLyBvZiB0aGUgc3BlY2lmaWVkIGxvb3Agd2lsbCBleGVjdXRlIGlmIGl0IGV4aXRzIHZpYSB0aGUgc3BlY2lmaWVkIGJsb2NrLgorU2NhbGFyRXZvbHV0aW9uOjpCYWNrZWRnZVRha2VuSW5mbworU2NhbGFyRXZvbHV0aW9uOjpDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RnJvbUV4aXQoY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkV4aXRpbmdCbG9jaykgeworCisgIC8vIE9rYXksIHdlJ3ZlIGNob3NlbiBhbiBleGl0aW5nIGJsb2NrLiAgU2VlIHdoYXQgY29uZGl0aW9uIGNhdXNlcyB1cyB0bworICAvLyBleGl0IGF0IHRoaXMgYmxvY2suCisgIC8vCisgIC8vIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgc3dpdGNoIGluc3RydWN0aW9ucyAod2l0aCBhIHNpbmdsZSBleGl0KQorICBCcmFuY2hJbnN0ICpFeGl0QnIgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihFeGl0aW5nQmxvY2stPmdldFRlcm1pbmF0b3IoKSk7CisgIGlmIChFeGl0QnIgPT0gMCkgcmV0dXJuIGdldENvdWxkTm90Q29tcHV0ZSgpOworICBhc3NlcnQoRXhpdEJyLT5pc0NvbmRpdGlvbmFsKCkgJiYgIklmIHVuY29uZGl0aW9uYWwsIGl0IGNhbid0IGJlIGluIGxvb3AhIik7CisKKyAgLy8gQXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSBoYXZlIGEgY29uZGl0aW9uYWwgYnJhbmNoIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyCisgIC8vIHRoZSBsb29wIGlzIGV4aXRlZC4gIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhlIGJyYW5jaCBpcyBleGVjdXRlZCBlYWNoCisgIC8vIHRpbWUgdGhyb3VnaCB0aGUgbG9vcC4gIElmIG5vdCwgdGhlbiB0aGUgZXhlY3V0aW9uIGNvdW50IG9mIHRoZSBicmFuY2ggd2lsbAorICAvLyBub3QgYmUgZXF1YWwgdG8gdGhlIHRyaXAgY291bnQgb2YgdGhlIGxvb3AuCisgIC8vCisgIC8vIEN1cnJlbnRseSB3ZSBjaGVjayBmb3IgdGhpcyBieSBjaGVja2luZyB0byBzZWUgaWYgdGhlIEV4aXQgYnJhbmNoIGdvZXMgdG8KKyAgLy8gdGhlIGxvb3AgaGVhZGVyLiAgSWYgc28sIHdlIGtub3cgaXQgd2lsbCBhbHdheXMgZXhlY3V0ZSB0aGUgc2FtZSBudW1iZXIgb2YKKyAgLy8gdGltZXMgYXMgdGhlIGxvb3AuICBXZSBhbHNvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgZXhpdCBibG9jayAqaXMqIHRoZQorICAvLyBsb29wIGhlYWRlci4gIFRoaXMgaXMgY29tbW9uIGZvciB1bi1yb3RhdGVkIGxvb3BzLgorICAvLworICAvLyBJZiBib3RoIG9mIHRob3NlIHRlc3RzIGZhaWwsIHdhbGsgdXAgdGhlIHVuaXF1ZSBwcmVkZWNlc3NvciBjaGFpbiB0byB0aGUKKyAgLy8gaGVhZGVyLCBzdG9wcGluZyBpZiB0aGVyZSBpcyBhbiBlZGdlIHRoYXQgZG9lc24ndCBleGl0IHRoZSBsb29wLiBJZiB0aGUKKyAgLy8gaGVhZGVyIGlzIHJlYWNoZWQsIHRoZSBleGVjdXRpb24gY291bnQgb2YgdGhlIGJyYW5jaCB3aWxsIGJlIGVxdWFsIHRvIHRoZQorICAvLyB0cmlwIGNvdW50IG9mIHRoZSBsb29wLgorICAvLworICAvLyAgTW9yZSBleHRlbnNpdmUgYW5hbHlzaXMgY291bGQgYmUgZG9uZSB0byBoYW5kbGUgbW9yZSBjYXNlcyBoZXJlLgorICAvLworICBpZiAoRXhpdEJyLT5nZXRTdWNjZXNzb3IoMCkgIT0gTC0+Z2V0SGVhZGVyKCkgJiYKKyAgICAgIEV4aXRCci0+Z2V0U3VjY2Vzc29yKDEpICE9IEwtPmdldEhlYWRlcigpICYmCisgICAgICBFeGl0QnItPmdldFBhcmVudCgpICE9IEwtPmdldEhlYWRlcigpKSB7CisgICAgLy8gVGhlIHNpbXBsZSBjaGVja3MgZmFpbGVkLCB0cnkgY2xpbWJpbmcgdGhlIHVuaXF1ZSBwcmVkZWNlc3NvciBjaGFpbgorICAgIC8vIHVwIHRvIHRoZSBoZWFkZXIuCisgICAgYm9vbCBPayA9IGZhbHNlOworICAgIGZvciAoQmFzaWNCbG9jayAqQkIgPSBFeGl0QnItPmdldFBhcmVudCgpOyBCQjsgKSB7CisgICAgICBCYXNpY0Jsb2NrICpQcmVkID0gQkItPmdldFVuaXF1ZVByZWRlY2Vzc29yKCk7CisgICAgICBpZiAoIVByZWQpCisgICAgICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgICAgIFRlcm1pbmF0b3JJbnN0ICpQcmVkVGVybSA9IFByZWQtPmdldFRlcm1pbmF0b3IoKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcmVkVGVybS0+Z2V0TnVtU3VjY2Vzc29ycygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBCYXNpY0Jsb2NrICpQcmVkU3VjYyA9IFByZWRUZXJtLT5nZXRTdWNjZXNzb3IoaSk7CisgICAgICAgIGlmIChQcmVkU3VjYyA9PSBCQikKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gSWYgdGhlIHByZWRlY2Vzc29yIGhhcyBhIHN1Y2Nlc3NvciB0aGF0IGlzbid0IEJCIGFuZCBpc24ndAorICAgICAgICAvLyBvdXRzaWRlIHRoZSBsb29wLCBhc3N1bWUgdGhlIHdvcnN0LgorICAgICAgICBpZiAoTC0+Y29udGFpbnMoUHJlZFN1Y2MpKQorICAgICAgICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgICAgIH0KKyAgICAgIGlmIChQcmVkID09IEwtPmdldEhlYWRlcigpKSB7CisgICAgICAgIE9rID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBCQiA9IFByZWQ7CisgICAgfQorICAgIGlmICghT2spCisgICAgICByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7CisgIH0KKworICAvLyBQcm9jZWVkIHRvIHRoZSBuZXh0IGxldmVsIHRvIGV4YW1pbmUgdGhlIGV4aXQgY29uZGl0aW9uIGV4cHJlc3Npb24uCisgIHJldHVybiBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RnJvbUV4aXRDb25kKEwsIEV4aXRCci0+Z2V0Q29uZGl0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXRCci0+Z2V0U3VjY2Vzc29yKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGl0QnItPmdldFN1Y2Nlc3NvcigxKSk7Cit9CisKKy8vLyBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RnJvbUV4aXRDb25kIC0gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZQorLy8vIGJhY2tlZGdlIG9mIHRoZSBzcGVjaWZpZWQgbG9vcCB3aWxsIGV4ZWN1dGUgaWYgaXRzIGV4aXQgY29uZGl0aW9uCisvLy8gd2VyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaCBvZiBFeGl0Q29uZCwgVEJCLCBhbmQgRkJCLgorU2NhbGFyRXZvbHV0aW9uOjpCYWNrZWRnZVRha2VuSW5mbworU2NhbGFyRXZvbHV0aW9uOjpDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RnJvbUV4aXRDb25kKGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkV4aXRDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpGQkIpIHsKKyAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRyb2xsaW5nIGV4cHJlc3Npb24gZm9yIHRoaXMgbG9vcCBpcyBhbiBBbmQgb3IgT3IuCisgIGlmIChCaW5hcnlPcGVyYXRvciAqQk8gPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oRXhpdENvbmQpKSB7CisgICAgaWYgKEJPLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kKSB7CisgICAgICAvLyBSZWN1cnNlIG9uIHRoZSBvcGVyYW5kcyBvZiB0aGUgYW5kLgorICAgICAgQmFja2VkZ2VUYWtlbkluZm8gQlRJMCA9CisgICAgICAgIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRGcm9tRXhpdENvbmQoTCwgQk8tPmdldE9wZXJhbmQoMCksIFRCQiwgRkJCKTsKKyAgICAgIEJhY2tlZGdlVGFrZW5JbmZvIEJUSTEgPQorICAgICAgICBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RnJvbUV4aXRDb25kKEwsIEJPLT5nZXRPcGVyYW5kKDEpLCBUQkIsIEZCQik7CisgICAgICBjb25zdCBTQ0VWICpCRUNvdW50ID0gZ2V0Q291bGROb3RDb21wdXRlKCk7CisgICAgICBjb25zdCBTQ0VWICpNYXhCRUNvdW50ID0gZ2V0Q291bGROb3RDb21wdXRlKCk7CisgICAgICBpZiAoTC0+Y29udGFpbnMoVEJCKSkgeworICAgICAgICAvLyBCb3RoIGNvbmRpdGlvbnMgbXVzdCBiZSB0cnVlIGZvciB0aGUgbG9vcCB0byBjb250aW51ZSBleGVjdXRpbmcuCisgICAgICAgIC8vIENob29zZSB0aGUgbGVzcyBjb25zZXJ2YXRpdmUgY291bnQuCisgICAgICAgIGlmIChCVEkwLkV4YWN0ID09IGdldENvdWxkTm90Q29tcHV0ZSgpIHx8CisgICAgICAgICAgICBCVEkxLkV4YWN0ID09IGdldENvdWxkTm90Q29tcHV0ZSgpKQorICAgICAgICAgIEJFQ291bnQgPSBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEJFQ291bnQgPSBnZXRVTWluRnJvbU1pc21hdGNoZWRUeXBlcyhCVEkwLkV4YWN0LCBCVEkxLkV4YWN0KTsKKyAgICAgICAgaWYgKEJUSTAuTWF4ID09IGdldENvdWxkTm90Q29tcHV0ZSgpKQorICAgICAgICAgIE1heEJFQ291bnQgPSBCVEkxLk1heDsKKyAgICAgICAgZWxzZSBpZiAoQlRJMS5NYXggPT0gZ2V0Q291bGROb3RDb21wdXRlKCkpCisgICAgICAgICAgTWF4QkVDb3VudCA9IEJUSTAuTWF4OworICAgICAgICBlbHNlCisgICAgICAgICAgTWF4QkVDb3VudCA9IGdldFVNaW5Gcm9tTWlzbWF0Y2hlZFR5cGVzKEJUSTAuTWF4LCBCVEkxLk1heCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBCb3RoIGNvbmRpdGlvbnMgbXVzdCBiZSB0cnVlIGF0IHRoZSBzYW1lIHRpbWUgZm9yIHRoZSBsb29wIHRvIGV4aXQuCisgICAgICAgIC8vIEZvciBub3csIGJlIGNvbnNlcnZhdGl2ZS4KKyAgICAgICAgYXNzZXJ0KEwtPmNvbnRhaW5zKEZCQikgJiYgIkxvb3AgYmxvY2sgaGFzIG5vIHN1Y2Nlc3NvciBpbiBsb29wISIpOworICAgICAgICBpZiAoQlRJMC5NYXggPT0gQlRJMS5NYXgpCisgICAgICAgICAgTWF4QkVDb3VudCA9IEJUSTAuTWF4OworICAgICAgICBpZiAoQlRJMC5FeGFjdCA9PSBCVEkxLkV4YWN0KQorICAgICAgICAgIEJFQ291bnQgPSBCVEkwLkV4YWN0OworICAgICAgfQorCisgICAgICByZXR1cm4gQmFja2VkZ2VUYWtlbkluZm8oQkVDb3VudCwgTWF4QkVDb3VudCk7CisgICAgfQorICAgIGlmIChCTy0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Ok9yKSB7CisgICAgICAvLyBSZWN1cnNlIG9uIHRoZSBvcGVyYW5kcyBvZiB0aGUgb3IuCisgICAgICBCYWNrZWRnZVRha2VuSW5mbyBCVEkwID0KKyAgICAgICAgQ29tcHV0ZUJhY2tlZGdlVGFrZW5Db3VudEZyb21FeGl0Q29uZChMLCBCTy0+Z2V0T3BlcmFuZCgwKSwgVEJCLCBGQkIpOworICAgICAgQmFja2VkZ2VUYWtlbkluZm8gQlRJMSA9CisgICAgICAgIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRGcm9tRXhpdENvbmQoTCwgQk8tPmdldE9wZXJhbmQoMSksIFRCQiwgRkJCKTsKKyAgICAgIGNvbnN0IFNDRVYgKkJFQ291bnQgPSBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgICAgIGNvbnN0IFNDRVYgKk1heEJFQ291bnQgPSBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgICAgIGlmIChMLT5jb250YWlucyhGQkIpKSB7CisgICAgICAgIC8vIEJvdGggY29uZGl0aW9ucyBtdXN0IGJlIGZhbHNlIGZvciB0aGUgbG9vcCB0byBjb250aW51ZSBleGVjdXRpbmcuCisgICAgICAgIC8vIENob29zZSB0aGUgbGVzcyBjb25zZXJ2YXRpdmUgY291bnQuCisgICAgICAgIGlmIChCVEkwLkV4YWN0ID09IGdldENvdWxkTm90Q29tcHV0ZSgpIHx8CisgICAgICAgICAgICBCVEkxLkV4YWN0ID09IGdldENvdWxkTm90Q29tcHV0ZSgpKQorICAgICAgICAgIEJFQ291bnQgPSBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEJFQ291bnQgPSBnZXRVTWluRnJvbU1pc21hdGNoZWRUeXBlcyhCVEkwLkV4YWN0LCBCVEkxLkV4YWN0KTsKKyAgICAgICAgaWYgKEJUSTAuTWF4ID09IGdldENvdWxkTm90Q29tcHV0ZSgpKQorICAgICAgICAgIE1heEJFQ291bnQgPSBCVEkxLk1heDsKKyAgICAgICAgZWxzZSBpZiAoQlRJMS5NYXggPT0gZ2V0Q291bGROb3RDb21wdXRlKCkpCisgICAgICAgICAgTWF4QkVDb3VudCA9IEJUSTAuTWF4OworICAgICAgICBlbHNlCisgICAgICAgICAgTWF4QkVDb3VudCA9IGdldFVNaW5Gcm9tTWlzbWF0Y2hlZFR5cGVzKEJUSTAuTWF4LCBCVEkxLk1heCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBCb3RoIGNvbmRpdGlvbnMgbXVzdCBiZSBmYWxzZSBhdCB0aGUgc2FtZSB0aW1lIGZvciB0aGUgbG9vcCB0byBleGl0LgorICAgICAgICAvLyBGb3Igbm93LCBiZSBjb25zZXJ2YXRpdmUuCisgICAgICAgIGFzc2VydChMLT5jb250YWlucyhUQkIpICYmICJMb29wIGJsb2NrIGhhcyBubyBzdWNjZXNzb3IgaW4gbG9vcCEiKTsKKyAgICAgICAgaWYgKEJUSTAuTWF4ID09IEJUSTEuTWF4KQorICAgICAgICAgIE1heEJFQ291bnQgPSBCVEkwLk1heDsKKyAgICAgICAgaWYgKEJUSTAuRXhhY3QgPT0gQlRJMS5FeGFjdCkKKyAgICAgICAgICBCRUNvdW50ID0gQlRJMC5FeGFjdDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIEJhY2tlZGdlVGFrZW5JbmZvKEJFQ291bnQsIE1heEJFQ291bnQpOworICAgIH0KKyAgfQorCisgIC8vIFdpdGggYW4gaWNtcCwgaXQgbWF5IGJlIGZlYXNpYmxlIHRvIGNvbXB1dGUgYW4gZXhhY3QgYmFja2VkZ2UtdGFrZW4gY291bnQuCisgIC8vIFByb2NlZWQgdG8gdGhlIG5leHQgbGV2ZWwgdG8gZXhhbWluZSB0aGUgaWNtcC4KKyAgaWYgKElDbXBJbnN0ICpFeGl0Q29uZElDbXAgPSBkeW5fY2FzdDxJQ21wSW5zdD4oRXhpdENvbmQpKQorICAgIHJldHVybiBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RnJvbUV4aXRDb25kSUNtcChMLCBFeGl0Q29uZElDbXAsIFRCQiwgRkJCKTsKKworICAvLyBDaGVjayBmb3IgYSBjb25zdGFudCBjb25kaXRpb24uIFRoZXNlIGFyZSBub3JtYWxseSBzdHJpcHBlZCBvdXQgYnkKKyAgLy8gU2ltcGxpZnlDRkcsIGJ1dCBTY2FsYXJFdm9sdXRpb24gbWF5IGJlIHVzZWQgYnkgYSBwYXNzIHdoaWNoIHdpc2hlcyB0bworICAvLyBwcmVzZXJ2ZSB0aGUgQ0ZHIGFuZCBpcyB0ZW1wb3JhcmlseSBsZWF2aW5nIGNvbnN0YW50IGNvbmRpdGlvbnMKKyAgLy8gaW4gcGxhY2UuCisgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oRXhpdENvbmQpKSB7CisgICAgaWYgKEwtPmNvbnRhaW5zKEZCQikgPT0gIUNJLT5nZXRaRXh0VmFsdWUoKSkKKyAgICAgIC8vIFRoZSBiYWNrZWRnZSBpcyBhbHdheXMgdGFrZW4uCisgICAgICByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7CisgICAgZWxzZQorICAgICAgLy8gVGhlIGJhY2tlZGdlIGlzIG5ldmVyIHRha2VuLgorICAgICAgcmV0dXJuIGdldENvbnN0YW50KENJLT5nZXRUeXBlKCksIDApOworICB9CisKKyAgLy8gSWYgaXQncyBub3QgYW4gaW50ZWdlciBvciBwb2ludGVyIGNvbXBhcmlzb24gdGhlbiBjb21wdXRlIGl0IHRoZSBoYXJkIHdheS4KKyAgcmV0dXJuIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRFeGhhdXN0aXZlbHkoTCwgRXhpdENvbmQsICFMLT5jb250YWlucyhUQkIpKTsKK30KKworLy8vIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRGcm9tRXhpdENvbmRJQ21wIC0gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZQorLy8vIGJhY2tlZGdlIG9mIHRoZSBzcGVjaWZpZWQgbG9vcCB3aWxsIGV4ZWN1dGUgaWYgaXRzIGV4aXQgY29uZGl0aW9uCisvLy8gd2VyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaCBvZiB0aGUgSUNtcEluc3QgRXhpdENvbmQsIFRCQiwgYW5kIEZCQi4KK1NjYWxhckV2b2x1dGlvbjo6QmFja2VkZ2VUYWtlbkluZm8KK1NjYWxhckV2b2x1dGlvbjo6Q29tcHV0ZUJhY2tlZGdlVGFrZW5Db3VudEZyb21FeGl0Q29uZElDbXAoY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3QgKkV4aXRDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkZCQikgeworCisgIC8vIElmIHRoZSBjb25kaXRpb24gd2FzIGV4aXQgb24gdHJ1ZSwgY29udmVydCB0aGUgY29uZGl0aW9uIHRvIGV4aXQgb24gZmFsc2UKKyAgSUNtcEluc3Q6OlByZWRpY2F0ZSBDb25kOworICBpZiAoIUwtPmNvbnRhaW5zKEZCQikpCisgICAgQ29uZCA9IEV4aXRDb25kLT5nZXRQcmVkaWNhdGUoKTsKKyAgZWxzZQorICAgIENvbmQgPSBFeGl0Q29uZC0+Z2V0SW52ZXJzZVByZWRpY2F0ZSgpOworCisgIC8vIEhhbmRsZSBjb21tb24gbG9vcHMgbGlrZTogZm9yIChYID0gInN0cmluZyI7ICpYOyArK1gpCisgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oRXhpdENvbmQtPmdldE9wZXJhbmQoMCkpKQorICAgIGlmIChDb25zdGFudCAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEV4aXRDb25kLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgQmFja2VkZ2VUYWtlbkluZm8gSXRDbnQgPQorICAgICAgICBDb21wdXRlTG9hZENvbnN0YW50Q29tcGFyZUJhY2tlZGdlVGFrZW5Db3VudChMSSwgUkhTLCBMLCBDb25kKTsKKyAgICAgIGlmIChJdENudC5oYXNBbnlJbmZvKCkpCisgICAgICAgIHJldHVybiBJdENudDsKKyAgICB9CisKKyAgY29uc3QgU0NFViAqTEhTID0gZ2V0U0NFVihFeGl0Q29uZC0+Z2V0T3BlcmFuZCgwKSk7CisgIGNvbnN0IFNDRVYgKlJIUyA9IGdldFNDRVYoRXhpdENvbmQtPmdldE9wZXJhbmQoMSkpOworCisgIC8vIFRyeSB0byBldmFsdWF0ZSBhbnkgZGVwZW5kZW5jaWVzIG91dCBvZiB0aGUgbG9vcC4KKyAgTEhTID0gZ2V0U0NFVkF0U2NvcGUoTEhTLCBMKTsKKyAgUkhTID0gZ2V0U0NFVkF0U2NvcGUoUkhTLCBMKTsKKworICAvLyBBdCB0aGlzIHBvaW50LCB3ZSB3b3VsZCBsaWtlIHRvIGNvbXB1dGUgaG93IG1hbnkgaXRlcmF0aW9ucyBvZiB0aGUKKyAgLy8gbG9vcCB0aGUgcHJlZGljYXRlIHdpbGwgcmV0dXJuIHRydWUgZm9yIHRoZXNlIGlucHV0cy4KKyAgaWYgKExIUy0+aXNMb29wSW52YXJpYW50KEwpICYmICFSSFMtPmlzTG9vcEludmFyaWFudChMKSkgeworICAgIC8vIElmIHRoZXJlIGlzIGEgbG9vcC1pbnZhcmlhbnQsIGZvcmNlIGl0IGludG8gdGhlIFJIUy4KKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgIENvbmQgPSBJQ21wSW5zdDo6Z2V0U3dhcHBlZFByZWRpY2F0ZShDb25kKTsKKyAgfQorCisgIC8vIFNpbXBsaWZ5IHRoZSBvcGVyYW5kcyBiZWZvcmUgYW5hbHl6aW5nIHRoZW0uCisgICh2b2lkKVNpbXBsaWZ5SUNtcE9wZXJhbmRzKENvbmQsIExIUywgUkhTKTsKKworICAvLyBJZiB3ZSBoYXZlIGEgY29tcGFyaXNvbiBvZiBhIGNocmVjIGFnYWluc3QgYSBjb25zdGFudCwgdHJ5IHRvIHVzZSB2YWx1ZQorICAvLyByYW5nZXMgdG8gYW5zd2VyIHRoaXMgcXVlcnkuCisgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKlJIU0MgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KFJIUykpCisgICAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBZGRSZWMgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oTEhTKSkKKyAgICAgIGlmIChBZGRSZWMtPmdldExvb3AoKSA9PSBMKSB7CisgICAgICAgIC8vIEZvcm0gdGhlIGNvbnN0YW50IHJhbmdlLgorICAgICAgICBDb25zdGFudFJhbmdlIENvbXBSYW5nZSgKKyAgICAgICAgICAgIElDbXBJbnN0OjptYWtlQ29uc3RhbnRSYW5nZShDb25kLCBSSFNDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpKSk7CisKKyAgICAgICAgY29uc3QgU0NFViAqUmV0ID0gQWRkUmVjLT5nZXROdW1JdGVyYXRpb25zSW5SYW5nZShDb21wUmFuZ2UsICp0aGlzKTsKKyAgICAgICAgaWYgKCFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oUmV0KSkgcmV0dXJuIFJldDsKKyAgICAgIH0KKworICBzd2l0Y2ggKENvbmQpIHsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORTogeyAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlIChYICE9IFkpCisgICAgLy8gQ29udmVydCB0bzogd2hpbGUgKFgtWSAhPSAwKQorICAgIEJhY2tlZGdlVGFrZW5JbmZvIEJUSSA9IEhvd0ZhclRvWmVybyhnZXRNaW51c1NDRVYoTEhTLCBSSFMpLCBMKTsKKyAgICBpZiAoQlRJLmhhc0FueUluZm8oKSkgcmV0dXJuIEJUSTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiB7ICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUgKFggPT0gWSkKKyAgICAvLyBDb252ZXJ0IHRvOiB3aGlsZSAoWC1ZID09IDApCisgICAgQmFja2VkZ2VUYWtlbkluZm8gQlRJID0gSG93RmFyVG9Ob25aZXJvKGdldE1pbnVzU0NFVihMSFMsIFJIUyksIEwpOworICAgIGlmIChCVEkuaGFzQW55SW5mbygpKSByZXR1cm4gQlRJOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiB7CisgICAgQmFja2VkZ2VUYWtlbkluZm8gQlRJID0gSG93TWFueUxlc3NUaGFucyhMSFMsIFJIUywgTCwgdHJ1ZSk7CisgICAgaWYgKEJUSS5oYXNBbnlJbmZvKCkpIHJldHVybiBCVEk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6IHsKKyAgICBCYWNrZWRnZVRha2VuSW5mbyBCVEkgPSBIb3dNYW55TGVzc1RoYW5zKGdldE5vdFNDRVYoTEhTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vdFNDRVYoUkhTKSwgTCwgdHJ1ZSk7CisgICAgaWYgKEJUSS5oYXNBbnlJbmZvKCkpIHJldHVybiBCVEk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6IHsKKyAgICBCYWNrZWRnZVRha2VuSW5mbyBCVEkgPSBIb3dNYW55TGVzc1RoYW5zKExIUywgUkhTLCBMLCBmYWxzZSk7CisgICAgaWYgKEJUSS5oYXNBbnlJbmZvKCkpIHJldHVybiBCVEk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6IHsKKyAgICBCYWNrZWRnZVRha2VuSW5mbyBCVEkgPSBIb3dNYW55TGVzc1RoYW5zKGdldE5vdFNDRVYoTEhTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vdFNDRVYoUkhTKSwgTCwgZmFsc2UpOworICAgIGlmIChCVEkuaGFzQW55SW5mbygpKSByZXR1cm4gQlRJOworICAgIGJyZWFrOworICB9CisgIGRlZmF1bHQ6CisjaWYgMAorICAgIGRiZ3MoKSA8PCAiQ29tcHV0ZUJhY2tlZGdlVGFrZW5Db3VudCAiOworICAgIGlmIChFeGl0Q29uZC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc1Vuc2lnbmVkKCkpCisgICAgICBkYmdzKCkgPDwgIlt1bnNpZ25lZF0gIjsKKyAgICBkYmdzKCkgPDwgKkxIUyA8PCAiICAgIgorICAgICAgICAgPDwgSW5zdHJ1Y3Rpb246OmdldE9wY29kZU5hbWUoSW5zdHJ1Y3Rpb246OklDbXApCisgICAgICAgICA8PCAiICAgIiA8PCAqUkhTIDw8ICJcbiI7CisjZW5kaWYKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4KKyAgICBDb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50RXhoYXVzdGl2ZWx5KEwsIEV4aXRDb25kLCAhTC0+Y29udGFpbnMoVEJCKSk7Cit9CisKK3N0YXRpYyBDb25zdGFudEludCAqCitFdmFsdWF0ZUNvbnN0YW50Q2hyZWNBdENvbnN0YW50KGNvbnN0IFNDRVZBZGRSZWNFeHByICpBZGRSZWMsIENvbnN0YW50SW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFKSB7CisgIGNvbnN0IFNDRVYgKkluVmFsID0gU0UuZ2V0Q29uc3RhbnQoQyk7CisgIGNvbnN0IFNDRVYgKlZhbCA9IEFkZFJlYy0+ZXZhbHVhdGVBdEl0ZXJhdGlvbihJblZhbCwgU0UpOworICBhc3NlcnQoaXNhPFNDRVZDb25zdGFudD4oVmFsKSAmJgorICAgICAgICAgIkV2YWx1YXRpb24gb2YgU0NFViBhdCBjb25zdGFudCBkaWRuJ3QgZm9sZCBjb3JyZWN0bHk/Iik7CisgIHJldHVybiBjYXN0PFNDRVZDb25zdGFudD4oVmFsKS0+Z2V0VmFsdWUoKTsKK30KKworLy8vIEdldEFkZHJlc3NlZEVsZW1lbnRGcm9tR2xvYmFsIC0gR2l2ZW4gYSBnbG9iYWwgdmFyaWFibGUgd2l0aCBhbiBpbml0aWFsaXplcgorLy8vIGFuZCBhIEdFUCBleHByZXNzaW9uIChtaXNzaW5nIHRoZSBwb2ludGVyIGluZGV4KSBpbmRleGluZyBpbnRvIGl0LCByZXR1cm4KKy8vLyB0aGUgYWRkcmVzc2VkIGVsZW1lbnQgb2YgdGhlIGluaXRpYWxpemVyIG9yIG51bGwgaWYgdGhlIGluZGV4IGV4cHJlc3Npb24gaXMKKy8vLyBpbnZhbGlkLgorc3RhdGljIENvbnN0YW50ICoKK0dldEFkZHJlc3NlZEVsZW1lbnRGcm9tR2xvYmFsKEdsb2JhbFZhcmlhYmxlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50SW50Kj4gJkluZGljZXMpIHsKKyAgQ29uc3RhbnQgKkluaXQgPSBHVi0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluZGljZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVpbnQ2NF90IElkeCA9IEluZGljZXNbaV0tPmdldFpFeHRWYWx1ZSgpOworICAgIGlmIChDb25zdGFudFN0cnVjdCAqQ1MgPSBkeW5fY2FzdDxDb25zdGFudFN0cnVjdD4oSW5pdCkpIHsKKyAgICAgIGFzc2VydChJZHggPCBDUy0+Z2V0TnVtT3BlcmFuZHMoKSAmJiAiQmFkIHN0cnVjdCBpbmRleCEiKTsKKyAgICAgIEluaXQgPSBjYXN0PENvbnN0YW50PihDUy0+Z2V0T3BlcmFuZChJZHgpKTsKKyAgICB9IGVsc2UgaWYgKENvbnN0YW50QXJyYXkgKkNBID0gZHluX2Nhc3Q8Q29uc3RhbnRBcnJheT4oSW5pdCkpIHsKKyAgICAgIGlmIChJZHggPj0gQ0EtPmdldE51bU9wZXJhbmRzKCkpIHJldHVybiAwOyAgLy8gQm9ndXMgcHJvZ3JhbQorICAgICAgSW5pdCA9IGNhc3Q8Q29uc3RhbnQ+KENBLT5nZXRPcGVyYW5kKElkeCkpOworICAgIH0gZWxzZSBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oSW5pdCkpIHsKKyAgICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihJbml0LT5nZXRUeXBlKCkpKSB7CisgICAgICAgIGFzc2VydChJZHggPCBTVHktPmdldE51bUVsZW1lbnRzKCkgJiYgIkJhZCBzdHJ1Y3QgaW5kZXghIik7CisgICAgICAgIEluaXQgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFNUeS0+Z2V0RWxlbWVudFR5cGUoSWR4KSk7CisgICAgICB9IGVsc2UgaWYgKGNvbnN0IEFycmF5VHlwZSAqQVR5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihJbml0LT5nZXRUeXBlKCkpKSB7CisgICAgICAgIGlmIChJZHggPj0gQVR5LT5nZXROdW1FbGVtZW50cygpKSByZXR1cm4gMDsgIC8vIEJvZ3VzIHByb2dyYW0KKyAgICAgICAgSW5pdCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoQVR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29uc3RhbnQgYWdncmVnYXRlIHR5cGUhIik7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDA7IC8vIFVua25vd24gaW5pdGlhbGl6ZXIgdHlwZQorICAgIH0KKyAgfQorICByZXR1cm4gSW5pdDsKK30KKworLy8vIENvbXB1dGVMb2FkQ29uc3RhbnRDb21wYXJlQmFja2VkZ2VUYWtlbkNvdW50IC0gR2l2ZW4gYW4gZXhpdCBjb25kaXRpb24gb2YKKy8vLyAnaWNtcCBvcCBsb2FkIFgsIGNzdCcsIHRyeSB0byBzZWUgaWYgd2UgY2FuIGNvbXB1dGUgdGhlIGJhY2tlZGdlCisvLy8gZXhlY3V0aW9uIGNvdW50LgorU2NhbGFyRXZvbHV0aW9uOjpCYWNrZWRnZVRha2VuSW5mbworU2NhbGFyRXZvbHV0aW9uOjpDb21wdXRlTG9hZENvbnN0YW50Q29tcGFyZUJhY2tlZGdlVGFrZW5Db3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRJbnN0ICpMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKKyAgaWYgKExJLT5pc1ZvbGF0aWxlKCkpIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGxvYWRlZCBwb2ludGVyIGlzIGEgZ2V0ZWxlbWVudHB0ciBvZiBhIGdsb2JhbC4KKyAgLy8gVE9ETzogVXNlIFNDRVYgaW5zdGVhZCBvZiBtYW51YWxseSBncnViYmluZyB3aXRoIEdFUHMuCisgIEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oTEktPmdldE9wZXJhbmQoMCkpOworICBpZiAoIUdFUCkgcmV0dXJuIGdldENvdWxkTm90Q29tcHV0ZSgpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGlzIHJlYWxseSBhIGNvbnN0YW50IGdsb2JhbCB3ZSBhcmUgZ2VwcGluZywgd2l0aCBhbgorICAvLyBpbml0aWFsaXplciwgYW5kIG1ha2Ugc3VyZSB0aGUgZmlyc3QgSURYIGlzIHJlYWxseSAwLgorICBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oR0VQLT5nZXRPcGVyYW5kKDApKTsKKyAgaWYgKCFHViB8fCAhR1YtPmlzQ29uc3RhbnQoKSB8fCAhR1YtPmhhc0RlZmluaXRpdmVJbml0aWFsaXplcigpIHx8CisgICAgICBHRVAtPmdldE51bU9wZXJhbmRzKCkgPCAzIHx8ICFpc2E8Q29uc3RhbnQ+KEdFUC0+Z2V0T3BlcmFuZCgxKSkgfHwKKyAgICAgICFjYXN0PENvbnN0YW50PihHRVAtPmdldE9wZXJhbmQoMSkpLT5pc051bGxWYWx1ZSgpKQorICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKworICAvLyBPa2F5LCB3ZSBhbGxvdyBvbmUgbm9uLWNvbnN0YW50IGluZGV4IGludG8gdGhlIEdFUCBpbnN0cnVjdGlvbi4KKyAgVmFsdWUgKlZhcklkeCA9IDA7CisgIHN0ZDo6dmVjdG9yPENvbnN0YW50SW50Kj4gSW5kZXhlczsKKyAgdW5zaWduZWQgVmFySWR4TnVtID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMiwgZSA9IEdFUC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihHRVAtPmdldE9wZXJhbmQoaSkpKSB7CisgICAgICBJbmRleGVzLnB1c2hfYmFjayhDSSk7CisgICAgfSBlbHNlIGlmICghaXNhPENvbnN0YW50SW50PihHRVAtPmdldE9wZXJhbmQoaSkpKSB7CisgICAgICBpZiAoVmFySWR4KSByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7ICAvLyBNdWx0aXBsZSBub24tY29uc3RhbnQgaWR4J3MuCisgICAgICBWYXJJZHggPSBHRVAtPmdldE9wZXJhbmQoaSk7CisgICAgICBWYXJJZHhOdW0gPSBpLTI7CisgICAgICBJbmRleGVzLnB1c2hfYmFjaygwKTsKKyAgICB9CisKKyAgLy8gT2theSwgd2Uga25vdyB3ZSBoYXZlIGEgKGxvYWQgKGdlcCBHViwgMCwgWCkpIGNvbXBhcmlzb24gd2l0aCBhIGNvbnN0YW50LgorICAvLyBDaGVjayB0byBzZWUgaWYgWCBpcyBhIGxvb3AgdmFyaWFudCB2YXJpYWJsZSB2YWx1ZSBub3cuCisgIGNvbnN0IFNDRVYgKklkeCA9IGdldFNDRVYoVmFySWR4KTsKKyAgSWR4ID0gZ2V0U0NFVkF0U2NvcGUoSWR4LCBMKTsKKworICAvLyBXZSBjYW4gb25seSByZWNvZ25pemUgdmVyeSBsaW1pdGVkIGZvcm1zIG9mIGxvb3AgaW5kZXggZXhwcmVzc2lvbnMsIGluCisgIC8vIHBhcnRpY3VsYXIsIG9ubHkgYWZmaW5lIEFkZFJlYydzIGxpa2Uge0MxLCssQzJ9LgorICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqSWR4RXhwciA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihJZHgpOworICBpZiAoIUlkeEV4cHIgfHwgIUlkeEV4cHItPmlzQWZmaW5lKCkgfHwgSWR4RXhwci0+aXNMb29wSW52YXJpYW50KEwpIHx8CisgICAgICAhaXNhPFNDRVZDb25zdGFudD4oSWR4RXhwci0+Z2V0T3BlcmFuZCgwKSkgfHwKKyAgICAgICFpc2E8U0NFVkNvbnN0YW50PihJZHhFeHByLT5nZXRPcGVyYW5kKDEpKSkKKyAgICByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7CisKKyAgdW5zaWduZWQgTWF4U3RlcHMgPSBNYXhCcnV0ZUZvcmNlSXRlcmF0aW9uczsKKyAgZm9yICh1bnNpZ25lZCBJdGVyYXRpb25OdW0gPSAwOyBJdGVyYXRpb25OdW0gIT0gTWF4U3RlcHM7ICsrSXRlcmF0aW9uTnVtKSB7CisgICAgQ29uc3RhbnRJbnQgKkl0Q3N0ID0gQ29uc3RhbnRJbnQ6OmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8SW50ZWdlclR5cGU+KElkeEV4cHItPmdldFR5cGUoKSksIEl0ZXJhdGlvbk51bSk7CisgICAgQ29uc3RhbnRJbnQgKlZhbCA9IEV2YWx1YXRlQ29uc3RhbnRDaHJlY0F0Q29uc3RhbnQoSWR4RXhwciwgSXRDc3QsICp0aGlzKTsKKworICAgIC8vIEZvcm0gdGhlIEdFUCBvZmZzZXQuCisgICAgSW5kZXhlc1tWYXJJZHhOdW1dID0gVmFsOworCisgICAgQ29uc3RhbnQgKlJlc3VsdCA9IEdldEFkZHJlc3NlZEVsZW1lbnRGcm9tR2xvYmFsKEdWLCBJbmRleGVzKTsKKyAgICBpZiAoUmVzdWx0ID09IDApIGJyZWFrOyAgLy8gQ2Fubm90IGNvbXB1dGUhCisKKyAgICAvLyBFdmFsdWF0ZSB0aGUgY29uZGl0aW9uIGZvciB0aGlzIGl0ZXJhdGlvbi4KKyAgICBSZXN1bHQgPSBDb25zdGFudEV4cHI6OmdldElDbXAocHJlZGljYXRlLCBSZXN1bHQsIFJIUyk7CisgICAgaWYgKCFpc2E8Q29uc3RhbnRJbnQ+KFJlc3VsdCkpIGJyZWFrOyAgLy8gQ291bGRuJ3QgZGVjaWRlIGZvciBzdXJlCisgICAgaWYgKGNhc3Q8Q29uc3RhbnRJbnQ+KFJlc3VsdCktPmdldFZhbHVlKCkuaXNNaW5WYWx1ZSgpKSB7CisjaWYgMAorICAgICAgZGJncygpIDw8ICJcbioqKlxuKioqIENvbXB1dGVkIGxvb3AgY291bnQgIiA8PCAqSXRDc3QKKyAgICAgICAgICAgICA8PCAiXG4qKiogRnJvbSBnbG9iYWwgIiA8PCAqR1YgPDwgIioqKiBCQjogIiA8PCAqTC0+Z2V0SGVhZGVyKCkKKyAgICAgICAgICAgICA8PCAiKioqXG4iOworI2VuZGlmCisgICAgICArK051bUFycmF5TGVuSXRDb3VudHM7CisgICAgICByZXR1cm4gZ2V0Q29uc3RhbnQoSXRDc3QpOyAgIC8vIEZvdW5kIHRlcm1pbmF0aW5nIGl0ZXJhdGlvbiEKKyAgICB9CisgIH0KKyAgcmV0dXJuIGdldENvdWxkTm90Q29tcHV0ZSgpOworfQorCisKKy8vLyBDYW5Db25zdGFudEZvbGQgLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gY29uc3RhbnQgZm9sZCBhbiBpbnN0cnVjdGlvbiBvZiB0aGUKKy8vLyBzcGVjaWZpZWQgdHlwZSwgYXNzdW1pbmcgdGhhdCBhbGwgb3BlcmFuZHMgd2VyZSBjb25zdGFudHMuCitzdGF0aWMgYm9vbCBDYW5Db25zdGFudEZvbGQoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgaWYgKGlzYTxCaW5hcnlPcGVyYXRvcj4oSSkgfHwgaXNhPENtcEluc3Q+KEkpIHx8CisgICAgICBpc2E8U2VsZWN0SW5zdD4oSSkgfHwgaXNhPENhc3RJbnN0PihJKSB8fCBpc2E8R2V0RWxlbWVudFB0ckluc3Q+KEkpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChjb25zdCBDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oSSkpCisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uICpGID0gQ0ktPmdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICByZXR1cm4gY2FuQ29uc3RhbnRGb2xkQ2FsbFRvKEYpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBnZXRDb25zdGFudEV2b2x2aW5nUEhJIC0gR2l2ZW4gYW4gTExWTSB2YWx1ZSBhbmQgYSBsb29wLCByZXR1cm4gYSBQSEkgbm9kZQorLy8vIGluIHRoZSBsb29wIHRoYXQgViBpcyBkZXJpdmVkIGZyb20uICBXZSBhbGxvdyBhcmJpdHJhcnkgb3BlcmF0aW9ucyBhbG9uZyB0aGUKKy8vLyB3YXksIGJ1dCB0aGUgb3BlcmFuZHMgb2YgYW4gb3BlcmF0aW9uIG11c3QgZWl0aGVyIGJlIGNvbnN0YW50cyBvciBhIHZhbHVlCisvLy8gZGVyaXZlZCBmcm9tIGEgY29uc3RhbnQgUEhJLiAgSWYgdGhpcyBleHByZXNzaW9uIGRvZXMgbm90IGZpdCB3aXRoIHRoZXNlCisvLy8gY29uc3RyYWludHMsIHJldHVybiBudWxsLgorc3RhdGljIFBISU5vZGUgKmdldENvbnN0YW50RXZvbHZpbmdQSEkoVmFsdWUgKlYsIGNvbnN0IExvb3AgKkwpIHsKKyAgLy8gSWYgdGhpcyBpcyBub3QgYW4gaW5zdHJ1Y3Rpb24sIG9yIGlmIHRoaXMgaXMgYW4gaW5zdHJ1Y3Rpb24gb3V0c2lkZSBvZiB0aGUKKyAgLy8gbG9vcCwgaXQgY2FuJ3QgYmUgZGVyaXZlZCBmcm9tIGEgbG9vcCBQSEkuCisgIEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpOworICBpZiAoSSA9PSAwIHx8ICFMLT5jb250YWlucyhJKSkgcmV0dXJuIDA7CisKKyAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSSkpIHsKKyAgICBpZiAoTC0+Z2V0SGVhZGVyKCkgPT0gSS0+Z2V0UGFyZW50KCkpCisgICAgICByZXR1cm4gUE47CisgICAgZWxzZQorICAgICAgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGtlZXAgdHJhY2sgb2YgdGhlIGNvbnRyb2wgZmxvdyBuZWVkZWQgdG8gZXZhbHVhdGUKKyAgICAgIC8vIFBISXMsIHNvIHdlIGNhbm5vdCBoYW5kbGUgUEhJcyBpbnNpZGUgb2YgbG9vcHMuCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIElmIHdlIHdvbid0IGJlIGFibGUgdG8gY29uc3RhbnQgZm9sZCB0aGlzIGV4cHJlc3Npb24gZXZlbiBpZiB0aGUgb3BlcmFuZHMKKyAgLy8gYXJlIGNvbnN0YW50cywgcmV0dXJuIGVhcmx5LgorICBpZiAoIUNhbkNvbnN0YW50Rm9sZChJKSkgcmV0dXJuIDA7CisKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBjYW4gZXZhbHVhdGUgdGhpcyBpbnN0cnVjdGlvbiBpZiBhbGwgb2YgaXRzIG9wZXJhbmRzIGFyZQorICAvLyBjb25zdGFudCBvciBkZXJpdmVkIGZyb20gYSBQSEkgbm9kZSB0aGVtc2VsdmVzLgorICBQSElOb2RlICpQSEkgPSAwOworICBmb3IgKHVuc2lnbmVkIE9wID0gMCwgZSA9IEktPmdldE51bU9wZXJhbmRzKCk7IE9wICE9IGU7ICsrT3ApCisgICAgaWYgKCFpc2E8Q29uc3RhbnQ+KEktPmdldE9wZXJhbmQoT3ApKSkgeworICAgICAgUEhJTm9kZSAqUCA9IGdldENvbnN0YW50RXZvbHZpbmdQSEkoSS0+Z2V0T3BlcmFuZChPcCksIEwpOworICAgICAgaWYgKFAgPT0gMCkgcmV0dXJuIDA7ICAvLyBOb3QgZXZvbHZpbmcgZnJvbSBQSEkKKyAgICAgIGlmIChQSEkgPT0gMCkKKyAgICAgICAgUEhJID0gUDsKKyAgICAgIGVsc2UgaWYgKFBISSAhPSBQKQorICAgICAgICByZXR1cm4gMDsgIC8vIEV2b2x2aW5nIGZyb20gbXVsdGlwbGUgZGlmZmVyZW50IFBISXMuCisgICAgfQorCisgIC8vIFRoaXMgaXMgYSBleHByZXNzaW9uIGV2b2x2aW5nIGZyb20gYSBjb25zdGFudCBQSEkhCisgIHJldHVybiBQSEk7Cit9CisKKy8vLyBFdmFsdWF0ZUV4cHJlc3Npb24gLSBHaXZlbiBhbiBleHByZXNzaW9uIHRoYXQgcGFzc2VzIHRoZQorLy8vIGdldENvbnN0YW50RXZvbHZpbmdQSEkgcHJlZGljYXRlLCBldmFsdWF0ZSBpdHMgdmFsdWUgYXNzdW1pbmcgdGhlIFBISSBub2RlCisvLy8gaW4gdGhlIGxvb3AgaGFzIHRoZSB2YWx1ZSBQSElWYWwuICBJZiB3ZSBjYW4ndCBmb2xkIHRoaXMgZXhwcmVzc2lvbiBmb3Igc29tZQorLy8vIHJlYXNvbiwgcmV0dXJuIG51bGwuCitzdGF0aWMgQ29uc3RhbnQgKkV2YWx1YXRlRXhwcmVzc2lvbihWYWx1ZSAqViwgQ29uc3RhbnQgKlBISVZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIGlmIChpc2E8UEhJTm9kZT4oVikpIHJldHVybiBQSElWYWw7CisgIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkgcmV0dXJuIEM7CisgIEluc3RydWN0aW9uICpJID0gY2FzdDxJbnN0cnVjdGlvbj4oVik7CisKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBPcGVyYW5kcyhJLT5nZXROdW1PcGVyYW5kcygpKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBPcGVyYW5kc1tpXSA9IEV2YWx1YXRlRXhwcmVzc2lvbihJLT5nZXRPcGVyYW5kKGkpLCBQSElWYWwsIFREKTsKKyAgICBpZiAoT3BlcmFuZHNbaV0gPT0gMCkgcmV0dXJuIDA7CisgIH0KKworICBpZiAoY29uc3QgQ21wSW5zdCAqQ0kgPSBkeW5fY2FzdDxDbXBJbnN0PihJKSkKKyAgICByZXR1cm4gQ29uc3RhbnRGb2xkQ29tcGFyZUluc3RPcGVyYW5kcyhDSS0+Z2V0UHJlZGljYXRlKCksIE9wZXJhbmRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRzWzFdLCBURCk7CisgIHJldHVybiBDb25zdGFudEZvbGRJbnN0T3BlcmFuZHMoSS0+Z2V0T3Bjb2RlKCksIEktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmT3BlcmFuZHNbMF0sIE9wZXJhbmRzLnNpemUoKSwgVEQpOworfQorCisvLy8gZ2V0Q29uc3RhbnRFdm9sdXRpb25Mb29wRXhpdFZhbHVlIC0gSWYgd2Uga25vdyB0aGF0IHRoZSBzcGVjaWZpZWQgUGhpIGlzCisvLy8gaW4gdGhlIGhlYWRlciBvZiBpdHMgY29udGFpbmluZyBsb29wLCB3ZSBrbm93IHRoZSBsb29wIGV4ZWN1dGVzIGEKKy8vLyBjb25zdGFudCBudW1iZXIgb2YgdGltZXMsIGFuZCB0aGUgUEhJIG5vZGUgaXMganVzdCBhIHJlY3VycmVuY2UKKy8vLyBpbnZvbHZpbmcgY29uc3RhbnRzLCBmb2xkIGl0LgorQ29uc3RhbnQgKgorU2NhbGFyRXZvbHV0aW9uOjpnZXRDb25zdGFudEV2b2x1dGlvbkxvb3BFeGl0VmFsdWUoUEhJTm9kZSAqUE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmQkVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCkgeworICBzdGQ6Om1hcDxQSElOb2RlKiwgQ29uc3RhbnQqPjo6aXRlcmF0b3IgSSA9CisgICAgQ29uc3RhbnRFdm9sdXRpb25Mb29wRXhpdFZhbHVlLmZpbmQoUE4pOworICBpZiAoSSAhPSBDb25zdGFudEV2b2x1dGlvbkxvb3BFeGl0VmFsdWUuZW5kKCkpCisgICAgcmV0dXJuIEktPnNlY29uZDsKKworICBpZiAoQkVzLnVndChNYXhCcnV0ZUZvcmNlSXRlcmF0aW9ucykpCisgICAgcmV0dXJuIENvbnN0YW50RXZvbHV0aW9uTG9vcEV4aXRWYWx1ZVtQTl0gPSAwOyAgLy8gTm90IGdvaW5nIHRvIGV2YWx1YXRlIGl0LgorCisgIENvbnN0YW50IComUmV0VmFsID0gQ29uc3RhbnRFdm9sdXRpb25Mb29wRXhpdFZhbHVlW1BOXTsKKworICAvLyBTaW5jZSB0aGUgbG9vcCBpcyBjYW5vbmljYWxpemVkLCB0aGUgUEhJIG5vZGUgbXVzdCBoYXZlIHR3byBlbnRyaWVzLiAgT25lCisgIC8vIGVudHJ5IG11c3QgYmUgYSBjb25zdGFudCAoY29taW5nIGluIGZyb20gb3V0c2lkZSBvZiB0aGUgbG9vcCksIGFuZCB0aGUKKyAgLy8gc2Vjb25kIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRoZSBzYW1lIFBISS4KKyAgYm9vbCBTZWNvbmRJc0JhY2tlZGdlID0gTC0+Y29udGFpbnMoUE4tPmdldEluY29taW5nQmxvY2soMSkpOworICBDb25zdGFudCAqU3RhcnRDU1QgPQorICAgIGR5bl9jYXN0PENvbnN0YW50PihQTi0+Z2V0SW5jb21pbmdWYWx1ZSghU2Vjb25kSXNCYWNrZWRnZSkpOworICBpZiAoU3RhcnRDU1QgPT0gMCkKKyAgICByZXR1cm4gUmV0VmFsID0gMDsgIC8vIE11c3QgYmUgYSBjb25zdGFudC4KKworICBWYWx1ZSAqQkVWYWx1ZSA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlKFNlY29uZElzQmFja2VkZ2UpOworICBpZiAoZ2V0Q29uc3RhbnRFdm9sdmluZ1BISShCRVZhbHVlLCBMKSAhPSBQTiAmJgorICAgICAgIWlzYTxDb25zdGFudD4oQkVWYWx1ZSkpCisgICAgcmV0dXJuIFJldFZhbCA9IDA7ICAvLyBOb3QgZGVyaXZlZCBmcm9tIHNhbWUgUEhJLgorCisgIC8vIEV4ZWN1dGUgdGhlIGxvb3Agc3ltYm9saWNhbGx5IHRvIGRldGVybWluZSB0aGUgZXhpdCB2YWx1ZS4KKyAgaWYgKEJFcy5nZXRBY3RpdmVCaXRzKCkgPj0gMzIpCisgICAgcmV0dXJuIFJldFZhbCA9IDA7IC8vIE1vcmUgdGhhbiAyXjMyLTEgaXRlcmF0aW9ucz8/IE5vdCBkb2luZyBpdCEKKworICB1bnNpZ25lZCBOdW1JdGVyYXRpb25zID0gQkVzLmdldFpFeHRWYWx1ZSgpOyAvLyBtdXN0IGJlIGluIHJhbmdlCisgIHVuc2lnbmVkIEl0ZXJhdGlvbk51bSA9IDA7CisgIGZvciAoQ29uc3RhbnQgKlBISVZhbCA9IFN0YXJ0Q1NUOyA7ICsrSXRlcmF0aW9uTnVtKSB7CisgICAgaWYgKEl0ZXJhdGlvbk51bSA9PSBOdW1JdGVyYXRpb25zKQorICAgICAgcmV0dXJuIFJldFZhbCA9IFBISVZhbDsgIC8vIEdvdCBleGl0IHZhbHVlIQorCisgICAgLy8gQ29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIFBISSBub2RlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisgICAgQ29uc3RhbnQgKk5leHRQSEkgPSBFdmFsdWF0ZUV4cHJlc3Npb24oQkVWYWx1ZSwgUEhJVmFsLCBURCk7CisgICAgaWYgKE5leHRQSEkgPT0gUEhJVmFsKQorICAgICAgcmV0dXJuIFJldFZhbCA9IE5leHRQSEk7ICAvLyBTdG9wcGVkIGV2b2x2aW5nIQorICAgIGlmIChOZXh0UEhJID09IDApCisgICAgICByZXR1cm4gMDsgICAgICAgIC8vIENvdWxkbid0IGV2YWx1YXRlIQorICAgIFBISVZhbCA9IE5leHRQSEk7CisgIH0KK30KKworLy8vIENvbXB1dGVCYWNrZWRnZVRha2VuQ291bnRFeGhhdXN0aXZlbHkgLSBJZiB0aGUgbG9vcCBpcyBrbm93biB0byBleGVjdXRlIGEKKy8vLyBjb25zdGFudCBudW1iZXIgb2YgdGltZXMgKHRoZSBjb25kaXRpb24gZXZvbHZlcyBvbmx5IGZyb20gY29uc3RhbnRzKSwKKy8vLyB0cnkgdG8gZXZhbHVhdGUgYSBmZXcgaXRlcmF0aW9ucyBvZiB0aGUgbG9vcCB1bnRpbCB3ZSBnZXQgdGhlIGV4aXQKKy8vLyBjb25kaXRpb24gZ2V0cyBhIHZhbHVlIG9mIEV4aXRXaGVuICh0cnVlIG9yIGZhbHNlKS4gIElmIHdlIGNhbm5vdAorLy8vIGV2YWx1YXRlIHRoZSB0cmlwIGNvdW50IG9mIHRoZSBsb29wLCByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCkuCitjb25zdCBTQ0VWICoKK1NjYWxhckV2b2x1dGlvbjo6Q29tcHV0ZUJhY2tlZGdlVGFrZW5Db3VudEV4aGF1c3RpdmVseShjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhpdFdoZW4pIHsKKyAgUEhJTm9kZSAqUE4gPSBnZXRDb25zdGFudEV2b2x2aW5nUEhJKENvbmQsIEwpOworICBpZiAoUE4gPT0gMCkgcmV0dXJuIGdldENvdWxkTm90Q29tcHV0ZSgpOworCisgIC8vIElmIHRoZSBsb29wIGlzIGNhbm9uaWNhbGl6ZWQsIHRoZSBQSEkgd2lsbCBoYXZlIGV4YWN0bHkgdHdvIGVudHJpZXMuCisgIC8vIFRoYXQncyB0aGUgb25seSBmb3JtIHdlIHN1cHBvcnQgaGVyZS4KKyAgaWYgKFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpICE9IDIpIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKworICAvLyBPbmUgZW50cnkgbXVzdCBiZSBhIGNvbnN0YW50IChjb21pbmcgaW4gZnJvbSBvdXRzaWRlIG9mIHRoZSBsb29wKSwgYW5kIHRoZQorICAvLyBzZWNvbmQgbXVzdCBiZSBkZXJpdmVkIGZyb20gdGhlIHNhbWUgUEhJLgorICBib29sIFNlY29uZElzQmFja2VkZ2UgPSBMLT5jb250YWlucyhQTi0+Z2V0SW5jb21pbmdCbG9jaygxKSk7CisgIENvbnN0YW50ICpTdGFydENTVCA9CisgICAgZHluX2Nhc3Q8Q29uc3RhbnQ+KFBOLT5nZXRJbmNvbWluZ1ZhbHVlKCFTZWNvbmRJc0JhY2tlZGdlKSk7CisgIGlmIChTdGFydENTVCA9PSAwKSByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7ICAvLyBNdXN0IGJlIGEgY29uc3RhbnQuCisKKyAgVmFsdWUgKkJFVmFsdWUgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZShTZWNvbmRJc0JhY2tlZGdlKTsKKyAgaWYgKGdldENvbnN0YW50RXZvbHZpbmdQSEkoQkVWYWx1ZSwgTCkgIT0gUE4gJiYKKyAgICAgICFpc2E8Q29uc3RhbnQ+KEJFVmFsdWUpKQorICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsgIC8vIE5vdCBkZXJpdmVkIGZyb20gc2FtZSBQSEkuCisKKyAgLy8gT2theSwgd2UgZmluZCBhIFBISSBub2RlIHRoYXQgZGVmaW5lcyB0aGUgdHJpcCBjb3VudCBvZiB0aGlzIGxvb3AuICBFeGVjdXRlCisgIC8vIHRoZSBsb29wIHN5bWJvbGljYWxseSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgY29uZGl0aW9uIGdldHMgYSB2YWx1ZSBvZgorICAvLyAiRXhpdFdoZW4iLgorICB1bnNpZ25lZCBJdGVyYXRpb25OdW0gPSAwOworICB1bnNpZ25lZCBNYXhJdGVyYXRpb25zID0gTWF4QnJ1dGVGb3JjZUl0ZXJhdGlvbnM7ICAgLy8gTGltaXQgYW5hbHlzaXMuCisgIGZvciAoQ29uc3RhbnQgKlBISVZhbCA9IFN0YXJ0Q1NUOworICAgICAgIEl0ZXJhdGlvbk51bSAhPSBNYXhJdGVyYXRpb25zOyArK0l0ZXJhdGlvbk51bSkgeworICAgIENvbnN0YW50SW50ICpDb25kVmFsID0KKyAgICAgIGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRJbnQ+KEV2YWx1YXRlRXhwcmVzc2lvbihDb25kLCBQSElWYWwsIFREKSk7CisKKyAgICAvLyBDb3VsZG4ndCBzeW1ib2xpY2FsbHkgZXZhbHVhdGUuCisgICAgaWYgKCFDb25kVmFsKSByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7CisKKyAgICBpZiAoQ29uZFZhbC0+Z2V0VmFsdWUoKSA9PSB1aW50NjRfdChFeGl0V2hlbikpIHsKKyAgICAgICsrTnVtQnJ1dGVGb3JjZVRyaXBDb3VudHNDb21wdXRlZDsKKyAgICAgIHJldHVybiBnZXRDb25zdGFudChUeXBlOjpnZXRJbnQzMlR5KGdldENvbnRleHQoKSksIEl0ZXJhdGlvbk51bSk7CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIFBISSBub2RlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisgICAgQ29uc3RhbnQgKk5leHRQSEkgPSBFdmFsdWF0ZUV4cHJlc3Npb24oQkVWYWx1ZSwgUEhJVmFsLCBURCk7CisgICAgaWYgKE5leHRQSEkgPT0gMCB8fCBOZXh0UEhJID09IFBISVZhbCkKKyAgICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsvLyBDb3VsZG4ndCBldmFsdWF0ZSBvciBub3QgbWFraW5nIHByb2dyZXNzLi4uCisgICAgUEhJVmFsID0gTmV4dFBISTsKKyAgfQorCisgIC8vIFRvbyBtYW55IGl0ZXJhdGlvbnMgd2VyZSBuZWVkZWQgdG8gZXZhbHVhdGUuCisgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKK30KKworLy8vIGdldFNDRVZBdFNjb3BlIC0gUmV0dXJuIGEgU0NFViBleHByZXNzaW9uIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlCisvLy8gYXQgdGhlIHNwZWNpZmllZCBzY29wZSBpbiB0aGUgcHJvZ3JhbS4gIFRoZSBMIHZhbHVlIHNwZWNpZmllcyBhIGxvb3AKKy8vLyBuZXN0IHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGF0LCB3aGVyZSBudWxsIGlzIHRoZSB0b3AtbGV2ZWwgb3IgYQorLy8vIHNwZWNpZmllZCBsb29wIGlzIGltbWVkaWF0ZWx5IGluc2lkZSBvZiB0aGUgbG9vcC4KKy8vLworLy8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGV4aXQgdmFsdWUgZm9yIGEgdmFyaWFibGUgZGVmaW5lZAorLy8vIGluIGEgbG9vcCBieSBxdWVyeWluZyB3aGF0IHRoZSB2YWx1ZSB3aWxsIGhvbGQgaW4gdGhlIHBhcmVudCBsb29wLgorLy8vCisvLy8gSW4gdGhlIGNhc2UgdGhhdCBhIHJlbGV2YW50IGxvb3AgZXhpdCB2YWx1ZSBjYW5ub3QgYmUgY29tcHV0ZWQsIHRoZQorLy8vIG9yaWdpbmFsIHZhbHVlIFYgaXMgcmV0dXJuZWQuCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldFNDRVZBdFNjb3BlKGNvbnN0IFNDRVYgKlYsIGNvbnN0IExvb3AgKkwpIHsKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGZvbGRlZCB0aGlzIGV4cHJlc3Npb24gYXQgdGhpcyBsb29wIGJlZm9yZS4KKyAgc3RkOjptYXA8Y29uc3QgTG9vcCAqLCBjb25zdCBTQ0VWICo+ICZWYWx1ZXMgPSBWYWx1ZXNBdFNjb3Blc1tWXTsKKyAgc3RkOjpwYWlyPHN0ZDo6bWFwPGNvbnN0IExvb3AgKiwgY29uc3QgU0NFViAqPjo6aXRlcmF0b3IsIGJvb2w+IFBhaXIgPQorICAgIFZhbHVlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTCwgc3RhdGljX2Nhc3Q8Y29uc3QgU0NFViAqPigwKSkpOworICBpZiAoIVBhaXIuc2Vjb25kKQorICAgIHJldHVybiBQYWlyLmZpcnN0LT5zZWNvbmQgPyBQYWlyLmZpcnN0LT5zZWNvbmQgOiBWOworCisgIC8vIE90aGVyd2lzZSBjb21wdXRlIGl0LgorICBjb25zdCBTQ0VWICpDID0gY29tcHV0ZVNDRVZBdFNjb3BlKFYsIEwpOworICBWYWx1ZXNBdFNjb3Blc1tWXVtMXSA9IEM7CisgIHJldHVybiBDOworfQorCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmNvbXB1dGVTQ0VWQXRTY29wZShjb25zdCBTQ0VWICpWLCBjb25zdCBMb29wICpMKSB7CisgIGlmIChpc2E8U0NFVkNvbnN0YW50PihWKSkgcmV0dXJuIFY7CisKKyAgLy8gSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBldm9sdmVkIGZyb20gYSBjb25zdGFudC1ldm9sdmluZyBQSEksIGNvbXB1dGUgdGhlCisgIC8vIGV4aXQgdmFsdWUgZnJvbSB0aGUgbG9vcCB3aXRob3V0IHVzaW5nIFNDRVZzLgorICBpZiAoY29uc3QgU0NFVlVua25vd24gKlNVID0gZHluX2Nhc3Q8U0NFVlVua25vd24+KFYpKSB7CisgICAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFNVLT5nZXRWYWx1ZSgpKSkgeworICAgICAgY29uc3QgTG9vcCAqTEkgPSAoKnRoaXMtPkxJKVtJLT5nZXRQYXJlbnQoKV07CisgICAgICBpZiAoTEkgJiYgTEktPmdldFBhcmVudExvb3AoKSA9PSBMKSAgLy8gTG9va2luZyBmb3IgbG9vcCBleGl0IHZhbHVlLgorICAgICAgICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJKSkKKyAgICAgICAgICBpZiAoUE4tPmdldFBhcmVudCgpID09IExJLT5nZXRIZWFkZXIoKSkgeworICAgICAgICAgICAgLy8gT2theSwgdGhlcmUgaXMgbm8gY2xvc2VkIGZvcm0gc29sdXRpb24gZm9yIHRoZSBQSEkgbm9kZS4gIENoZWNrCisgICAgICAgICAgICAvLyB0byBzZWUgaWYgdGhlIGxvb3AgdGhhdCBjb250YWlucyBpdCBoYXMgYSBrbm93biBiYWNrZWRnZS10YWtlbgorICAgICAgICAgICAgLy8gY291bnQuICBJZiBzbywgd2UgbWF5IGJlIGFibGUgdG8gZm9yY2UgY29tcHV0YXRpb24gb2YgdGhlIGV4aXQKKyAgICAgICAgICAgIC8vIHZhbHVlLgorICAgICAgICAgICAgY29uc3QgU0NFViAqQmFja2VkZ2VUYWtlbkNvdW50ID0gZ2V0QmFja2VkZ2VUYWtlbkNvdW50KExJKTsKKyAgICAgICAgICAgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKkJUQ0MgPQorICAgICAgICAgICAgICAgICAgZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihCYWNrZWRnZVRha2VuQ291bnQpKSB7CisgICAgICAgICAgICAgIC8vIE9rYXksIHdlIGtub3cgaG93IG1hbnkgdGltZXMgdGhlIGNvbnRhaW5pbmcgbG9vcCBleGVjdXRlcy4gIElmCisgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBjb25zdGFudCBldm9sdmluZyBQSEkgbm9kZSwgZ2V0IHRoZSBmaW5hbCB2YWx1ZSBhdAorICAgICAgICAgICAgICAvLyB0aGUgc3BlY2lmaWVkIGl0ZXJhdGlvbiBudW1iZXIuCisgICAgICAgICAgICAgIENvbnN0YW50ICpSViA9IGdldENvbnN0YW50RXZvbHV0aW9uTG9vcEV4aXRWYWx1ZShQTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQ0MtPmdldFZhbHVlKCktPmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSSk7CisgICAgICAgICAgICAgIGlmIChSVikgcmV0dXJuIGdldFNDRVYoUlYpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgLy8gT2theSwgdGhpcyBpcyBhbiBleHByZXNzaW9uIHRoYXQgd2UgY2Fubm90IHN5bWJvbGljYWxseSBldmFsdWF0ZQorICAgICAgLy8gaW50byBhIFNDRVYuICBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBzeW1ib2xpY2FsbHkgZXZhbHVhdGUKKyAgICAgIC8vIHRoZSBhcmd1bWVudHMgaW50byBjb25zdGFudHMsIGFuZCBpZiBzbywgdHJ5IHRvIGNvbnN0YW50IHByb3BhZ2F0ZSB0aGUKKyAgICAgIC8vIHJlc3VsdC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY29tcHV0aW5nIGxvb3AgZXhpdCB2YWx1ZXMuCisgICAgICBpZiAoQ2FuQ29uc3RhbnRGb2xkKEkpKSB7CisgICAgICAgIFNtYWxsVmVjdG9yPENvbnN0YW50ICosIDQ+IE9wZXJhbmRzOworICAgICAgICBib29sIE1hZGVJbXByb3ZlbWVudCA9IGZhbHNlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBWYWx1ZSAqT3AgPSBJLT5nZXRPcGVyYW5kKGkpOworICAgICAgICAgIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihPcCkpIHsKKyAgICAgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhDKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgb3BlcmFuZHMgaXMgbm9uLWNvbnN0YW50IGFuZCBpZiB0aGV5IGFyZQorICAgICAgICAgIC8vIG5vbi1pbnRlZ2VyIGFuZCBub24tcG9pbnRlciwgZG9uJ3QgZXZlbiB0cnkgdG8gYW5hbHl6ZSB0aGVtCisgICAgICAgICAgLy8gd2l0aCBzY2V2IHRlY2huaXF1ZXMuCisgICAgICAgICAgaWYgKCFpc1NDRVZhYmxlKE9wLT5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIFY7CisKKyAgICAgICAgICBjb25zdCBTQ0VWICpPcmlnViA9IGdldFNDRVYoT3ApOworICAgICAgICAgIGNvbnN0IFNDRVYgKk9wViA9IGdldFNDRVZBdFNjb3BlKE9yaWdWLCBMKTsKKyAgICAgICAgICBNYWRlSW1wcm92ZW1lbnQgfD0gT3JpZ1YgIT0gT3BWOworCisgICAgICAgICAgQ29uc3RhbnQgKkMgPSAwOworICAgICAgICAgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKlNDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihPcFYpKQorICAgICAgICAgICAgQyA9IFNDLT5nZXRWYWx1ZSgpOworICAgICAgICAgIGlmIChjb25zdCBTQ0VWVW5rbm93biAqU1UgPSBkeW5fY2FzdDxTQ0VWVW5rbm93bj4oT3BWKSkKKyAgICAgICAgICAgIEMgPSBkeW5fY2FzdDxDb25zdGFudD4oU1UtPmdldFZhbHVlKCkpOworICAgICAgICAgIGlmICghQykgcmV0dXJuIFY7CisgICAgICAgICAgaWYgKEMtPmdldFR5cGUoKSAhPSBPcC0+Z2V0VHlwZSgpKQorICAgICAgICAgICAgQyA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChDYXN0SW5zdDo6Z2V0Q2FzdE9wY29kZShDLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLCBPcC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soQyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgZ2V0U0NFVkF0U2NvcGUgYWN0dWFsbHkgbWFkZSBhbiBpbXByb3ZlbWVudC4KKyAgICAgICAgaWYgKE1hZGVJbXByb3ZlbWVudCkgeworICAgICAgICAgIENvbnN0YW50ICpDID0gMDsKKyAgICAgICAgICBpZiAoY29uc3QgQ21wSW5zdCAqQ0kgPSBkeW5fY2FzdDxDbXBJbnN0PihJKSkKKyAgICAgICAgICAgIEMgPSBDb25zdGFudEZvbGRDb21wYXJlSW5zdE9wZXJhbmRzKENJLT5nZXRQcmVkaWNhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRzWzBdLCBPcGVyYW5kc1sxXSwgVEQpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEMgPSBDb25zdGFudEZvbGRJbnN0T3BlcmFuZHMoSS0+Z2V0T3Bjb2RlKCksIEktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk9wZXJhbmRzWzBdLCBPcGVyYW5kcy5zaXplKCksIFREKTsKKyAgICAgICAgICBpZiAoIUMpIHJldHVybiBWOworICAgICAgICAgIHJldHVybiBnZXRTQ0VWKEMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBzb21lIG90aGVyIHR5cGUgb2YgU0NFVlVua25vd24sIGp1c3QgcmV0dXJuIGl0LgorICAgIHJldHVybiBWOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZDb21tdXRhdGl2ZUV4cHIgKkNvbW0gPSBkeW5fY2FzdDxTQ0VWQ29tbXV0YXRpdmVFeHByPihWKSkgeworICAgIC8vIEF2b2lkIHBlcmZvcm1pbmcgdGhlIGxvb2stdXAgaW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHRoZSBzcGVjaWZpZWQKKyAgICAvLyBleHByZXNzaW9uIGhhcyBubyBsb29wLXZhcmlhbnQgcG9ydGlvbnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvbW0tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBTQ0VWICpPcEF0U2NvcGUgPSBnZXRTQ0VWQXRTY29wZShDb21tLT5nZXRPcGVyYW5kKGkpLCBMKTsKKyAgICAgIGlmIChPcEF0U2NvcGUgIT0gQ29tbS0+Z2V0T3BlcmFuZChpKSkgeworICAgICAgICAvLyBPa2F5LCBhdCBsZWFzdCBvbmUgb2YgdGhlc2Ugb3BlcmFuZHMgaXMgbG9vcCB2YXJpYW50IGJ1dCBtaWdodCBiZQorICAgICAgICAvLyBmb2xkYWJsZS4gIEJ1aWxkIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBmb2xkZWQgY29tbXV0YXRpdmUgZXhwcmVzc2lvbi4KKyAgICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBOZXdPcHMoQ29tbS0+b3BfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbS0+b3BfYmVnaW4oKStpKTsKKyAgICAgICAgTmV3T3BzLnB1c2hfYmFjayhPcEF0U2NvcGUpOworCisgICAgICAgIGZvciAoKytpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIE9wQXRTY29wZSA9IGdldFNDRVZBdFNjb3BlKENvbW0tPmdldE9wZXJhbmQoaSksIEwpOworICAgICAgICAgIE5ld09wcy5wdXNoX2JhY2soT3BBdFNjb3BlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNhPFNDRVZBZGRFeHByPihDb21tKSkKKyAgICAgICAgICByZXR1cm4gZ2V0QWRkRXhwcihOZXdPcHMpOworICAgICAgICBpZiAoaXNhPFNDRVZNdWxFeHByPihDb21tKSkKKyAgICAgICAgICByZXR1cm4gZ2V0TXVsRXhwcihOZXdPcHMpOworICAgICAgICBpZiAoaXNhPFNDRVZTTWF4RXhwcj4oQ29tbSkpCisgICAgICAgICAgcmV0dXJuIGdldFNNYXhFeHByKE5ld09wcyk7CisgICAgICAgIGlmIChpc2E8U0NFVlVNYXhFeHByPihDb21tKSkKKyAgICAgICAgICByZXR1cm4gZ2V0VU1heEV4cHIoTmV3T3BzKTsKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBjb21tdXRhdGl2ZSBTQ0VWIHR5cGUhIik7CisgICAgICB9CisgICAgfQorICAgIC8vIElmIHdlIGdvdCBoZXJlLCBhbGwgb3BlcmFuZHMgYXJlIGxvb3AgaW52YXJpYW50LgorICAgIHJldHVybiBDb21tOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZVRGl2RXhwciAqRGl2ID0gZHluX2Nhc3Q8U0NFVlVEaXZFeHByPihWKSkgeworICAgIGNvbnN0IFNDRVYgKkxIUyA9IGdldFNDRVZBdFNjb3BlKERpdi0+Z2V0TEhTKCksIEwpOworICAgIGNvbnN0IFNDRVYgKlJIUyA9IGdldFNDRVZBdFNjb3BlKERpdi0+Z2V0UkhTKCksIEwpOworICAgIGlmIChMSFMgPT0gRGl2LT5nZXRMSFMoKSAmJiBSSFMgPT0gRGl2LT5nZXRSSFMoKSkKKyAgICAgIHJldHVybiBEaXY7ICAgLy8gbXVzdCBiZSBsb29wIGludmFyaWFudAorICAgIHJldHVybiBnZXRVRGl2RXhwcihMSFMsIFJIUyk7CisgIH0KKworICAvLyBJZiB0aGlzIGlzIGEgbG9vcCByZWN1cnJlbmNlIGZvciBhIGxvb3AgdGhhdCBkb2VzIG5vdCBjb250YWluIEwsIHRoZW4gd2UKKyAgLy8gYXJlIGRlYWxpbmcgd2l0aCB0aGUgZmluYWwgdmFsdWUgY29tcHV0ZWQgYnkgdGhlIGxvb3AuCisgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQWRkUmVjID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KFYpKSB7CisgICAgLy8gRmlyc3QsIGF0dGVtcHQgdG8gZXZhbHVhdGUgZWFjaCBvcGVyYW5kLgorICAgIC8vIEF2b2lkIHBlcmZvcm1pbmcgdGhlIGxvb2stdXAgaW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHRoZSBzcGVjaWZpZWQKKyAgICAvLyBleHByZXNzaW9uIGhhcyBubyBsb29wLXZhcmlhbnQgcG9ydGlvbnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFkZFJlYy0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IFNDRVYgKk9wQXRTY29wZSA9IGdldFNDRVZBdFNjb3BlKEFkZFJlYy0+Z2V0T3BlcmFuZChpKSwgTCk7CisgICAgICBpZiAoT3BBdFNjb3BlID09IEFkZFJlYy0+Z2V0T3BlcmFuZChpKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIE9rYXksIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBvcGVyYW5kcyBpcyBsb29wIHZhcmlhbnQgYnV0IG1pZ2h0IGJlCisgICAgICAvLyBmb2xkYWJsZS4gIEJ1aWxkIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBmb2xkZWQgY29tbXV0YXRpdmUgZXhwcmVzc2lvbi4KKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgOD4gTmV3T3BzKEFkZFJlYy0+b3BfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJlYy0+b3BfYmVnaW4oKStpKTsKKyAgICAgIE5ld09wcy5wdXNoX2JhY2soT3BBdFNjb3BlKTsKKyAgICAgIGZvciAoKytpOyBpICE9IGU7ICsraSkKKyAgICAgICAgTmV3T3BzLnB1c2hfYmFjayhnZXRTQ0VWQXRTY29wZShBZGRSZWMtPmdldE9wZXJhbmQoaSksIEwpKTsKKworICAgICAgQWRkUmVjID0gY2FzdDxTQ0VWQWRkUmVjRXhwcj4oZ2V0QWRkUmVjRXhwcihOZXdPcHMsIEFkZFJlYy0+Z2V0TG9vcCgpKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgc2NvcGUgaXMgb3V0c2lkZSB0aGUgYWRkcmVjJ3MgbG9vcCwgZXZhbHVhdGUgaXQgYnkgdXNpbmcgdGhlCisgICAgLy8gbG9vcCBleGl0IHZhbHVlIG9mIHRoZSBhZGRyZWMuCisgICAgaWYgKCFBZGRSZWMtPmdldExvb3AoKS0+Y29udGFpbnMoTCkpIHsKKyAgICAgIC8vIFRvIGV2YWx1YXRlIHRoaXMgcmVjdXJyZW5jZSwgd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IHRpbWVzIHRoZSBBZGRSZWMKKyAgICAgIC8vIGxvb3AgaXRlcmF0ZXMuICBDb21wdXRlIHRoaXMgbm93LgorICAgICAgY29uc3QgU0NFViAqQmFja2VkZ2VUYWtlbkNvdW50ID0gZ2V0QmFja2VkZ2VUYWtlbkNvdW50KEFkZFJlYy0+Z2V0TG9vcCgpKTsKKyAgICAgIGlmIChCYWNrZWRnZVRha2VuQ291bnQgPT0gZ2V0Q291bGROb3RDb21wdXRlKCkpIHJldHVybiBBZGRSZWM7CisKKyAgICAgIC8vIFRoZW4sIGV2YWx1YXRlIHRoZSBBZGRSZWMuCisgICAgICByZXR1cm4gQWRkUmVjLT5ldmFsdWF0ZUF0SXRlcmF0aW9uKEJhY2tlZGdlVGFrZW5Db3VudCwgKnRoaXMpOworICAgIH0KKworICAgIHJldHVybiBBZGRSZWM7CisgIH0KKworICBpZiAoY29uc3QgU0NFVlplcm9FeHRlbmRFeHByICpDYXN0ID0gZHluX2Nhc3Q8U0NFVlplcm9FeHRlbmRFeHByPihWKSkgeworICAgIGNvbnN0IFNDRVYgKk9wID0gZ2V0U0NFVkF0U2NvcGUoQ2FzdC0+Z2V0T3BlcmFuZCgpLCBMKTsKKyAgICBpZiAoT3AgPT0gQ2FzdC0+Z2V0T3BlcmFuZCgpKQorICAgICAgcmV0dXJuIENhc3Q7ICAvLyBtdXN0IGJlIGxvb3AgaW52YXJpYW50CisgICAgcmV0dXJuIGdldFplcm9FeHRlbmRFeHByKE9wLCBDYXN0LT5nZXRUeXBlKCkpOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZTaWduRXh0ZW5kRXhwciAqQ2FzdCA9IGR5bl9jYXN0PFNDRVZTaWduRXh0ZW5kRXhwcj4oVikpIHsKKyAgICBjb25zdCBTQ0VWICpPcCA9IGdldFNDRVZBdFNjb3BlKENhc3QtPmdldE9wZXJhbmQoKSwgTCk7CisgICAgaWYgKE9wID09IENhc3QtPmdldE9wZXJhbmQoKSkKKyAgICAgIHJldHVybiBDYXN0OyAgLy8gbXVzdCBiZSBsb29wIGludmFyaWFudAorICAgIHJldHVybiBnZXRTaWduRXh0ZW5kRXhwcihPcCwgQ2FzdC0+Z2V0VHlwZSgpKTsKKyAgfQorCisgIGlmIChjb25zdCBTQ0VWVHJ1bmNhdGVFeHByICpDYXN0ID0gZHluX2Nhc3Q8U0NFVlRydW5jYXRlRXhwcj4oVikpIHsKKyAgICBjb25zdCBTQ0VWICpPcCA9IGdldFNDRVZBdFNjb3BlKENhc3QtPmdldE9wZXJhbmQoKSwgTCk7CisgICAgaWYgKE9wID09IENhc3QtPmdldE9wZXJhbmQoKSkKKyAgICAgIHJldHVybiBDYXN0OyAgLy8gbXVzdCBiZSBsb29wIGludmFyaWFudAorICAgIHJldHVybiBnZXRUcnVuY2F0ZUV4cHIoT3AsIENhc3QtPmdldFR5cGUoKSk7CisgIH0KKworICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIFNDRVYgdHlwZSEiKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBnZXRTQ0VWQXRTY29wZSAtIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB3aGljaCBkb2VzCisvLy8gZ2V0U0NFVkF0U2NvcGUoZ2V0U0NFVihWKSwgTCkuCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldFNDRVZBdFNjb3BlKFZhbHVlICpWLCBjb25zdCBMb29wICpMKSB7CisgIHJldHVybiBnZXRTQ0VWQXRTY29wZShnZXRTQ0VWKFYpLCBMKTsKK30KKworLy8vIFNvbHZlTGluRXF1YXRpb25XaXRoT3ZlcmZsb3cgLSBGaW5kcyB0aGUgbWluaW11bSB1bnNpZ25lZCByb290IG9mIHRoZQorLy8vIGZvbGxvd2luZyBlcXVhdGlvbjoKKy8vLworLy8vICAgICBBICogWCA9IEIgKG1vZCBOKQorLy8vCisvLy8gd2hlcmUgTiA9IDJeQlcgYW5kIEJXIGlzIHRoZSBjb21tb24gYml0IHdpZHRoIG9mIEEgYW5kIEIuIFRoZSBzaWduZWRuZXNzIG9mCisvLy8gQSBhbmQgQiBpc24ndCBpbXBvcnRhbnQuCisvLy8KKy8vLyBJZiB0aGUgZXF1YXRpb24gZG9lcyBub3QgaGF2ZSBhIHNvbHV0aW9uLCBTQ0VWQ291bGROb3RDb21wdXRlIGlzIHJldHVybmVkLgorc3RhdGljIGNvbnN0IFNDRVYgKlNvbHZlTGluRXF1YXRpb25XaXRoT3ZlcmZsb3coY29uc3QgQVBJbnQgJkEsIGNvbnN0IEFQSW50ICZCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFKSB7CisgIHVpbnQzMl90IEJXID0gQS5nZXRCaXRXaWR0aCgpOworICBhc3NlcnQoQlcgPT0gQi5nZXRCaXRXaWR0aCgpICYmICJCaXQgd2lkdGhzIG11c3QgYmUgdGhlIHNhbWUuIik7CisgIGFzc2VydChBICE9IDAgJiYgIkEgbXVzdCBiZSBub24temVyby4iKTsKKworICAvLyAxLiBEID0gZ2NkKEEsIE4pCisgIC8vCisgIC8vIFRoZSBnY2Qgb2YgQSBhbmQgTiBtYXkgaGF2ZSBvbmx5IG9uZSBwcmltZSBmYWN0b3I6IDIuIFRoZSBudW1iZXIgb2YKKyAgLy8gdHJhaWxpbmcgemVyb3MgaW4gQSBpcyBpdHMgbXVsdGlwbGljaXR5CisgIHVpbnQzMl90IE11bHQyID0gQS5jb3VudFRyYWlsaW5nWmVyb3MoKTsKKyAgLy8gRCA9IDJeTXVsdDIKKworICAvLyAyLiBDaGVjayBpZiBCIGlzIGRpdmlzaWJsZSBieSBELgorICAvLworICAvLyBCIGlzIGRpdmlzaWJsZSBieSBEIGlmIGFuZCBvbmx5IGlmIHRoZSBtdWx0aXBsaWNpdHkgb2YgcHJpbWUgZmFjdG9yIDIgZm9yIEIKKyAgLy8gaXMgbm90IGxlc3MgdGhhbiBtdWx0aXBsaWNpdHkgb2YgdGhpcyBwcmltZSBmYWN0b3IgZm9yIEQuCisgIGlmIChCLmNvdW50VHJhaWxpbmdaZXJvcygpIDwgTXVsdDIpCisgICAgcmV0dXJuIFNFLmdldENvdWxkTm90Q29tcHV0ZSgpOworCisgIC8vIDMuIENvbXB1dGUgSTogdGhlIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YgKEEgLyBEKSBpbiBhcml0aG1ldGljCisgIC8vIG1vZHVsbyAoTiAvIEQpLgorICAvLworICAvLyAoTiAvIEQpIG1heSBuZWVkIEJXKzEgYml0cyBpbiBpdHMgcmVwcmVzZW50YXRpb24uICBIZW5jZSwgd2UnbGwgdXNlIHRoaXMKKyAgLy8gYml0IHdpZHRoIGR1cmluZyBjb21wdXRhdGlvbnMuCisgIEFQSW50IEFEID0gQS5sc2hyKE11bHQyKS56ZXh0KEJXICsgMSk7ICAvLyBBRCA9IEEgLyBECisgIEFQSW50IE1vZChCVyArIDEsIDApOworICBNb2Quc2V0KEJXIC0gTXVsdDIpOyAgLy8gTW9kID0gTiAvIEQKKyAgQVBJbnQgSSA9IEFELm11bHRpcGxpY2F0aXZlSW52ZXJzZShNb2QpOworCisgIC8vIDQuIENvbXB1dGUgdGhlIG1pbmltdW0gdW5zaWduZWQgcm9vdCBvZiB0aGUgZXF1YXRpb246CisgIC8vIEkgKiAoQiAvIEQpIG1vZCAoTiAvIEQpCisgIEFQSW50IFJlc3VsdCA9IChJICogQi5sc2hyKE11bHQyKS56ZXh0KEJXICsgMSkpLnVyZW0oTW9kKTsKKworICAvLyBUaGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgbGVzcyB0aGFuIDJeQlcgc28gd2UgbWF5IHRydW5jYXRlIGl0IHRvIEJXCisgIC8vIGJpdHMuCisgIHJldHVybiBTRS5nZXRDb25zdGFudChSZXN1bHQudHJ1bmMoQlcpKTsKK30KKworLy8vIFNvbHZlUXVhZHJhdGljRXF1YXRpb24gLSBGaW5kIHRoZSByb290cyBvZiB0aGUgcXVhZHJhdGljIGVxdWF0aW9uIGZvciB0aGUKKy8vLyBnaXZlbiBxdWFkcmF0aWMgY2hyZWMge0wsKyxNLCssTn0uICBUaGlzIHJldHVybnMgZWl0aGVyIHRoZSB0d28gcm9vdHMgKHdoaWNoCisvLy8gbWlnaHQgYmUgdGhlIHNhbWUpIG9yIHR3byBTQ0VWQ291bGROb3RDb21wdXRlIG9iamVjdHMuCisvLy8KK3N0YXRpYyBzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLGNvbnN0IFNDRVYgKj4KK1NvbHZlUXVhZHJhdGljRXF1YXRpb24oY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFkZFJlYywgU2NhbGFyRXZvbHV0aW9uICZTRSkgeworICBhc3NlcnQoQWRkUmVjLT5nZXROdW1PcGVyYW5kcygpID09IDMgJiYgIlRoaXMgaXMgbm90IGEgcXVhZHJhdGljIGNocmVjISIpOworICBjb25zdCBTQ0VWQ29uc3RhbnQgKkxDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihBZGRSZWMtPmdldE9wZXJhbmQoMCkpOworICBjb25zdCBTQ0VWQ29uc3RhbnQgKk1DID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihBZGRSZWMtPmdldE9wZXJhbmQoMSkpOworICBjb25zdCBTQ0VWQ29uc3RhbnQgKk5DID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihBZGRSZWMtPmdldE9wZXJhbmQoMikpOworCisgIC8vIFdlIGN1cnJlbnRseSBjYW4gb25seSBzb2x2ZSB0aGlzIGlmIHRoZSBjb2VmZmljaWVudHMgYXJlIGNvbnN0YW50cy4KKyAgaWYgKCFMQyB8fCAhTUMgfHwgIU5DKSB7CisgICAgY29uc3QgU0NFViAqQ05DID0gU0UuZ2V0Q291bGROb3RDb21wdXRlKCk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKENOQywgQ05DKTsKKyAgfQorCisgIHVpbnQzMl90IEJpdFdpZHRoID0gTEMtPmdldFZhbHVlKCktPmdldFZhbHVlKCkuZ2V0Qml0V2lkdGgoKTsKKyAgY29uc3QgQVBJbnQgJkwgPSBMQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgY29uc3QgQVBJbnQgJk0gPSBNQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgY29uc3QgQVBJbnQgJk4gPSBOQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgQVBJbnQgVHdvKEJpdFdpZHRoLCAyKTsKKyAgQVBJbnQgRm91cihCaXRXaWR0aCwgNCk7CisKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBBUEludE9wczsKKyAgICBjb25zdCBBUEludCYgQyA9IEw7CisgICAgLy8gQ29udmVydCBmcm9tIGNocmVjIGNvZWZmaWNpZW50cyB0byBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyBBWF4yK0JYK0MKKyAgICAvLyBUaGUgQiBjb2VmZmljaWVudCBpcyBNLU4vMgorICAgIEFQSW50IEIoTSk7CisgICAgQiAtPSBzZGl2KE4sVHdvKTsKKworICAgIC8vIFRoZSBBIGNvZWZmaWNpZW50IGlzIE4vMgorICAgIEFQSW50IEEoTi5zZGl2KFR3bykpOworCisgICAgLy8gQ29tcHV0ZSB0aGUgQl4yLTRhYyB0ZXJtLgorICAgIEFQSW50IFNxcnRUZXJtKEIpOworICAgIFNxcnRUZXJtICo9IEI7CisgICAgU3FydFRlcm0gLT0gRm91ciAqIChBICogQyk7CisKKyAgICAvLyBDb21wdXRlIHNxcnQoQl4yLTRhYykuIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgbmVhcmVzdAorICAgIC8vIGludGVnZXIgdmFsdWUgb3IgZWxzZSBBUEludDo6c3FydCgpIHdpbGwgYXNzZXJ0LgorICAgIEFQSW50IFNxcnRWYWwoU3FydFRlcm0uc3FydCgpKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHR3byBzb2x1dGlvbnMgZm9yIHRoZSBxdWFkcmF0aWMgZm9ybXVsYS4KKyAgICAvLyBUaGUgZGl2aXNpb25zIG11c3QgYmUgcGVyZm9ybWVkIGFzIHNpZ25lZCBkaXZpc2lvbnMuCisgICAgQVBJbnQgTmVnQigtQik7CisgICAgQVBJbnQgVHdvQSggQSA8PCAxICk7CisgICAgaWYgKFR3b0EuaXNNaW5WYWx1ZSgpKSB7CisgICAgICBjb25zdCBTQ0VWICpDTkMgPSBTRS5nZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihDTkMsIENOQyk7CisgICAgfQorCisgICAgTExWTUNvbnRleHQgJkNvbnRleHQgPSBTRS5nZXRDb250ZXh0KCk7CisKKyAgICBDb25zdGFudEludCAqU29sdXRpb24xID0KKyAgICAgIENvbnN0YW50SW50OjpnZXQoQ29udGV4dCwgKE5lZ0IgKyBTcXJ0VmFsKS5zZGl2KFR3b0EpKTsKKyAgICBDb25zdGFudEludCAqU29sdXRpb24yID0KKyAgICAgIENvbnN0YW50SW50OjpnZXQoQ29udGV4dCwgKE5lZ0IgLSBTcXJ0VmFsKS5zZGl2KFR3b0EpKTsKKworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTRS5nZXRDb25zdGFudChTb2x1dGlvbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRS5nZXRDb25zdGFudChTb2x1dGlvbjIpKTsKKyAgICB9IC8vIGVuZCBBUEludE9wcyBuYW1lc3BhY2UKK30KKworLy8vIEhvd0ZhclRvWmVybyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgYmFja2VkZ2UgY29tcGFyaW5nIHRoZSBzcGVjaWZpZWQKKy8vLyB2YWx1ZSB0byB6ZXJvIHdpbGwgZXhlY3V0ZS4gIElmIG5vdCBjb21wdXRhYmxlLCByZXR1cm4gQ291bGROb3RDb21wdXRlLgorU2NhbGFyRXZvbHV0aW9uOjpCYWNrZWRnZVRha2VuSW5mbworU2NhbGFyRXZvbHV0aW9uOjpIb3dGYXJUb1plcm8oY29uc3QgU0NFViAqViwgY29uc3QgTG9vcCAqTCkgeworICAvLyBJZiB0aGUgdmFsdWUgaXMgYSBjb25zdGFudAorICBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihWKSkgeworICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHplcm8sIHRoZSBicmFuY2ggd2lsbCBleGVjdXRlIHplcm8gdGltZXMuCisgICAgaWYgKEMtPmdldFZhbHVlKCktPmlzWmVybygpKSByZXR1cm4gQzsKKyAgICByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7ICAvLyBPdGhlcndpc2UgaXQgd2lsbCBsb29wIGluZmluaXRlbHkuCisgIH0KKworICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqQWRkUmVjID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KFYpOworICBpZiAoIUFkZFJlYyB8fCBBZGRSZWMtPmdldExvb3AoKSAhPSBMKQorICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKworICBpZiAoQWRkUmVjLT5pc0FmZmluZSgpKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhbiBhZmZpbmUgZXhwcmVzc2lvbiwgdGhlIGV4ZWN1dGlvbiBjb3VudCBvZiB0aGlzIGJyYW5jaCBpcworICAgIC8vIHRoZSBtaW5pbXVtIHVuc2lnbmVkIHJvb3Qgb2YgdGhlIGZvbGxvd2luZyBlcXVhdGlvbjoKKyAgICAvLworICAgIC8vICAgICBTdGFydCArIFN0ZXAqTiA9IDAgKG1vZCAyXkJXKQorICAgIC8vCisgICAgLy8gZXF1aXZhbGVudCB0bzoKKyAgICAvLworICAgIC8vICAgICAgICAgICAgIFN0ZXAqTiA9IC1TdGFydCAobW9kIDJeQlcpCisgICAgLy8KKyAgICAvLyB3aGVyZSBCVyBpcyB0aGUgY29tbW9uIGJpdCB3aWR0aCBvZiBTdGFydCBhbmQgU3RlcC4KKworICAgIC8vIEdldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGxvb3AuCisgICAgY29uc3QgU0NFViAqU3RhcnQgPSBnZXRTQ0VWQXRTY29wZShBZGRSZWMtPmdldFN0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMLT5nZXRQYXJlbnRMb29wKCkpOworICAgIGNvbnN0IFNDRVYgKlN0ZXAgPSBnZXRTQ0VWQXRTY29wZShBZGRSZWMtPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwtPmdldFBhcmVudExvb3AoKSk7CisKKyAgICBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpTdGVwQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oU3RlcCkpIHsKKyAgICAgIC8vIEZvciBub3cgd2UgaGFuZGxlIG9ubHkgY29uc3RhbnQgc3RlcHMuCisKKyAgICAgIC8vIEZpcnN0LCBoYW5kbGUgdW5pdGFyeSBzdGVwcy4KKyAgICAgIGlmIChTdGVwQy0+Z2V0VmFsdWUoKS0+ZXF1YWxzSW50KDEpKSAgICAgIC8vIDEqTiA9IC1TdGFydCAobW9kIDJeQlcpLCBzbzoKKyAgICAgICAgcmV0dXJuIGdldE5lZ2F0aXZlU0NFVihTdGFydCk7ICAgICAgICAgIC8vICAgTiA9IC1TdGFydCAoYXMgdW5zaWduZWQpCisgICAgICBpZiAoU3RlcEMtPmdldFZhbHVlKCktPmlzQWxsT25lc1ZhbHVlKCkpICAvLyAtMSpOID0gLVN0YXJ0IChtb2QgMl5CVyksIHNvOgorICAgICAgICByZXR1cm4gU3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgTiA9IFN0YXJ0IChhcyB1bnNpZ25lZCkKKworICAgICAgLy8gVGhlbiwgdHJ5IHRvIHNvbHZlIHRoZSBhYm92ZSBlcXVhdGlvbiBwcm92aWRlZCB0aGF0IFN0YXJ0IGlzIGNvbnN0YW50LgorICAgICAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqU3RhcnRDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihTdGFydCkpCisgICAgICAgIHJldHVybiBTb2x2ZUxpbkVxdWF0aW9uV2l0aE92ZXJmbG93KFN0ZXBDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtU3RhcnRDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhpcyk7CisgICAgfQorICB9IGVsc2UgaWYgKEFkZFJlYy0+aXNRdWFkcmF0aWMoKSAmJiBBZGRSZWMtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkgeworICAgIC8vIElmIHRoaXMgaXMgYSBxdWFkcmF0aWMgKDMtdGVybSkgQWRkUmVjIHtMLCssTSwrLE59LCBmaW5kIHRoZSByb290cyBvZgorICAgIC8vIHRoZSBxdWFkcmF0aWMgZXF1YXRpb24gdG8gc29sdmUgaXQuCisgICAgc3RkOjpwYWlyPGNvbnN0IFNDRVYgKixjb25zdCBTQ0VWICo+IFJvb3RzID0gU29sdmVRdWFkcmF0aWNFcXVhdGlvbihBZGRSZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aGlzKTsKKyAgICBjb25zdCBTQ0VWQ29uc3RhbnQgKlIxID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihSb290cy5maXJzdCk7CisgICAgY29uc3QgU0NFVkNvbnN0YW50ICpSMiA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oUm9vdHMuc2Vjb25kKTsKKyAgICBpZiAoUjEpIHsKKyNpZiAwCisgICAgICBkYmdzKCkgPDwgIkhGVFo6ICIgPDwgKlYgPDwgIiAtIHNvbCMxOiAiIDw8ICpSMQorICAgICAgICAgICAgIDw8ICIgIHNvbCMyOiAiIDw8ICpSMiA8PCAiXG4iOworI2VuZGlmCisgICAgICAvLyBQaWNrIHRoZSBzbWFsbGVzdCBwb3NpdGl2ZSByb290IHZhbHVlLgorICAgICAgaWYgKENvbnN0YW50SW50ICpDQiA9CisgICAgICAgICAgZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENvbnN0YW50RXhwcjo6Z2V0SUNtcChJQ21wSW5zdDo6SUNNUF9VTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIxLT5nZXRWYWx1ZSgpLCBSMi0+Z2V0VmFsdWUoKSkpKSB7CisgICAgICAgIGlmIChDQi0+Z2V0WkV4dFZhbHVlKCkgPT0gZmFsc2UpCisgICAgICAgICAgc3RkOjpzd2FwKFIxLCBSMik7ICAgLy8gUjEgaXMgdGhlIG1pbmltdW0gcm9vdCBub3cuCisKKyAgICAgICAgLy8gV2UgY2FuIG9ubHkgdXNlIHRoaXMgdmFsdWUgaWYgdGhlIGNocmVjIGVuZHMgdXAgd2l0aCBhbiBleGFjdCB6ZXJvCisgICAgICAgIC8vIHZhbHVlIGF0IHRoaXMgaW5kZXguICBXaGVuIHNvbHZpbmcgZm9yICJYKlggIT0gNSIsIGZvciBleGFtcGxlLCB3ZQorICAgICAgICAvLyBzaG91bGQgbm90IGFjY2VwdCBhIHJvb3Qgb2YgMi4KKyAgICAgICAgY29uc3QgU0NFViAqVmFsID0gQWRkUmVjLT5ldmFsdWF0ZUF0SXRlcmF0aW9uKFIxLCAqdGhpcyk7CisgICAgICAgIGlmIChWYWwtPmlzWmVybygpKQorICAgICAgICAgIHJldHVybiBSMTsgIC8vIFdlIGZvdW5kIGEgcXVhZHJhdGljIHJvb3QhCisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGdldENvdWxkTm90Q29tcHV0ZSgpOworfQorCisvLy8gSG93RmFyVG9Ob25aZXJvIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgYSBiYWNrZWRnZSBjaGVja2luZyB0aGUKKy8vLyBzcGVjaWZpZWQgdmFsdWUgZm9yIG5vbnplcm8gd2lsbCBleGVjdXRlLiAgSWYgbm90IGNvbXB1dGFibGUsIHJldHVybgorLy8vIENvdWxkTm90Q29tcHV0ZQorU2NhbGFyRXZvbHV0aW9uOjpCYWNrZWRnZVRha2VuSW5mbworU2NhbGFyRXZvbHV0aW9uOjpIb3dGYXJUb05vblplcm8oY29uc3QgU0NFViAqViwgY29uc3QgTG9vcCAqTCkgeworICAvLyBMb29wcyB0aGF0IGxvb2sgbGlrZTogd2hpbGUgKFggPT0gMCkgYXJlIHZlcnkgc3RyYW5nZSBpbmRlZWQuICBXZSBkb24ndAorICAvLyBoYW5kbGUgdGhlbSB5ZXQgZXhjZXB0IGZvciB0aGUgdHJpdmlhbCBjYXNlLiAgVGhpcyBjb3VsZCBiZSBleHBhbmRlZCBpbiB0aGUKKyAgLy8gZnV0dXJlIGFzIG5lZWRlZC4KKworICAvLyBJZiB0aGUgdmFsdWUgaXMgYSBjb25zdGFudCwgY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGtub3duIHRvIGJlIG5vbi16ZXJvCisgIC8vIGFscmVhZHkuICBJZiBzbywgdGhlIGJhY2tlZGdlIHdpbGwgZXhlY3V0ZSB6ZXJvIHRpbWVzLgorICBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihWKSkgeworICAgIGlmICghQy0+Z2V0VmFsdWUoKS0+aXNOdWxsVmFsdWUoKSkKKyAgICAgIHJldHVybiBnZXRDb25zdGFudChDLT5nZXRUeXBlKCksIDApOworICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsgIC8vIE90aGVyd2lzZSBpdCB3aWxsIGxvb3AgaW5maW5pdGVseS4KKyAgfQorCisgIC8vIFdlIGNvdWxkIGltcGxlbWVudCBvdGhlcnMsIGJ1dCBJIHJlYWxseSBkb3VidCBhbnlvbmUgd3JpdGVzIGxvb3BzIGxpa2UKKyAgLy8gdGhpcywgYW5kIGlmIHRoZXkgZGlkLCB0aGV5IHdvdWxkIGFscmVhZHkgYmUgY29uc3RhbnQgZm9sZGVkLgorICByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7Cit9CisKKy8vLyBnZXRQcmVkZWNlc3NvcldpdGhVbmlxdWVTdWNjZXNzb3JGb3JCQiAtIFJldHVybiBhIHByZWRlY2Vzc29yIG9mIEJCCisvLy8gKHdoaWNoIG1heSBub3QgYmUgYW4gaW1tZWRpYXRlIHByZWRlY2Vzc29yKSB3aGljaCBoYXMgZXhhY3RseSBvbmUKKy8vLyBzdWNjZXNzb3IgZnJvbSB3aGljaCBCQiBpcyByZWFjaGFibGUsIG9yIG51bGwgaWYgbm8gc3VjaCBibG9jayBpcworLy8vIGZvdW5kLgorLy8vCitzdGQ6OnBhaXI8QmFzaWNCbG9jayAqLCBCYXNpY0Jsb2NrICo+CitTY2FsYXJFdm9sdXRpb246OmdldFByZWRlY2Vzc29yV2l0aFVuaXF1ZVN1Y2Nlc3NvckZvckJCKEJhc2ljQmxvY2sgKkJCKSB7CisgIC8vIElmIHRoZSBibG9jayBoYXMgYSB1bmlxdWUgcHJlZGVjZXNzb3IsIHRoZW4gdGhlcmUgaXMgbm8gcGF0aCBmcm9tIHRoZQorICAvLyBwcmVkZWNlc3NvciB0byB0aGUgYmxvY2sgdGhhdCBkb2VzIG5vdCBnbyB0aHJvdWdoIHRoZSBkaXJlY3QgZWRnZQorICAvLyBmcm9tIHRoZSBwcmVkZWNlc3NvciB0byB0aGUgYmxvY2suCisgIGlmIChCYXNpY0Jsb2NrICpQcmVkID0gQkItPmdldFNpbmdsZVByZWRlY2Vzc29yKCkpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFByZWQsIEJCKTsKKworICAvLyBBIGxvb3AncyBoZWFkZXIgaXMgZGVmaW5lZCB0byBiZSBhIGJsb2NrIHRoYXQgZG9taW5hdGVzIHRoZSBsb29wLgorICAvLyBJZiB0aGUgaGVhZGVyIGhhcyBhIHVuaXF1ZSBwcmVkZWNlc3NvciBvdXRzaWRlIHRoZSBsb29wLCBpdCBtdXN0IGJlCisgIC8vIGEgYmxvY2sgdGhhdCBoYXMgZXhhY3RseSBvbmUgc3VjY2Vzc29yIHRoYXQgY2FuIHJlYWNoIHRoZSBsb29wLgorICBpZiAoTG9vcCAqTCA9IExJLT5nZXRMb29wRm9yKEJCKSkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTC0+Z2V0TG9vcFByZWRlY2Vzc29yKCksIEwtPmdldEhlYWRlcigpKTsKKworICByZXR1cm4gc3RkOjpwYWlyPEJhc2ljQmxvY2sgKiwgQmFzaWNCbG9jayAqPigpOworfQorCisvLy8gSGFzU2FtZVZhbHVlIC0gU0NFViBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlIGlzIHVzdWFsbHkgc3VmZmljaWVudCBmb3IKKy8vLyB0ZXN0aW5nIHdoZXRoZXIgdHdvIGV4cHJlc3Npb25zIGFyZSBlcXVhbCwgaG93ZXZlciBmb3IgdGhlIHB1cnBvc2VzIG9mCisvLy8gbG9va2luZyBmb3IgYSBjb25kaXRpb24gZ3VhcmRpbmcgYSBsb29wLCBpdCBjYW4gYmUgdXNlZnVsIHRvIGJlIGEgbGl0dGxlCisvLy8gbW9yZSBnZW5lcmFsLCBzaW5jZSBhIGZyb250LWVuZCBtYXkgaGF2ZSByZXBsaWNhdGVkIHRoZSBjb250cm9sbGluZworLy8vIGV4cHJlc3Npb24uCisvLy8KK3N0YXRpYyBib29sIEhhc1NhbWVWYWx1ZShjb25zdCBTQ0VWICpBLCBjb25zdCBTQ0VWICpCKSB7CisgIC8vIFF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBTQ0VWLgorICBpZiAoQSA9PSBCKSByZXR1cm4gdHJ1ZTsKKworICAvLyBPdGhlcndpc2UsIGlmIHRoZXkncmUgYm90aCBTQ0VWVW5rbm93biwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZXkgaG9sZAorICAvLyB0d28gZGlmZmVyZW50IGluc3RydWN0aW9ucyB3aXRoIHRoZSBzYW1lIHZhbHVlLiBDaGVjayBmb3IgdGhpcyBjYXNlLgorICBpZiAoY29uc3QgU0NFVlVua25vd24gKkFVID0gZHluX2Nhc3Q8U0NFVlVua25vd24+KEEpKQorICAgIGlmIChjb25zdCBTQ0VWVW5rbm93biAqQlUgPSBkeW5fY2FzdDxTQ0VWVW5rbm93bj4oQikpCisgICAgICBpZiAoY29uc3QgSW5zdHJ1Y3Rpb24gKkFJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KEFVLT5nZXRWYWx1ZSgpKSkKKyAgICAgICAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpCSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihCVS0+Z2V0VmFsdWUoKSkpCisgICAgICAgICAgaWYgKEFJLT5pc0lkZW50aWNhbFRvKEJJKSAmJiAhQUktPm1heVJlYWRGcm9tTWVtb3J5KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBPdGhlcndpc2UgYXNzdW1lIHRoZXkgbWF5IGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUuCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFNpbXBsaWZ5SUNtcE9wZXJhbmRzIC0gU2ltcGxpZnkgTEhTIGFuZCBSSFMgaW4gYSBjb21wYXJpc29uIHdpdGgKKy8vLyBwcmVkaWNhdGUgUHJlZC4gUmV0dXJuIHRydWUgaWZmIGFueSBjaGFuZ2VzIHdlcmUgbWFkZS4KKy8vLworYm9vbCBTY2FsYXJFdm9sdXRpb246OlNpbXBsaWZ5SUNtcE9wZXJhbmRzKElDbXBJbnN0OjpQcmVkaWNhdGUgJlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqJkxIUywgY29uc3QgU0NFViAqJlJIUykgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICAvLyBDYW5vbmljYWxpemUgYSBjb25zdGFudCB0byB0aGUgcmlnaHQgc2lkZS4KKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqTEhTQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oTEhTKSkgeworICAgIC8vIENoZWNrIGZvciBib3RoIG9wZXJhbmRzIGNvbnN0YW50LgorICAgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKlJIU0MgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KFJIUykpIHsKKyAgICAgIGlmIChDb25zdGFudEV4cHI6OmdldElDbXAoUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTQy0+Z2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTQy0+Z2V0VmFsdWUoKSktPmlzTnVsbFZhbHVlKCkpCisgICAgICAgIGdvdG8gdHJpdmlhbGx5X2ZhbHNlOworICAgICAgZWxzZQorICAgICAgICBnb3RvIHRyaXZpYWxseV90cnVlOworICAgIH0KKyAgICAvLyBPdGhlcndpc2Ugc3dhcCB0aGUgb3BlcmFuZHMgdG8gcHV0IHRoZSBjb25zdGFudCBvbiB0aGUgcmlnaHQuCisgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgICBQcmVkID0gSUNtcEluc3Q6OmdldFN3YXBwZWRQcmVkaWNhdGUoUHJlZCk7CisgICAgQ2hhbmdlZCA9IHRydWU7CisgIH0KKworICAvLyBJZiB3ZSdyZSBjb21wYXJpbmcgYW4gYWRkcmVjIHdpdGggYSB2YWx1ZSB3aGljaCBpcyBsb29wLWludmFyaWFudCBpbiB0aGUKKyAgLy8gYWRkcmVjJ3MgbG9vcCwgcHV0IHRoZSBhZGRyZWMgb24gdGhlIGxlZnQuIEFsc28gbWFrZSBhIGRvbWluYW5jZSBjaGVjaywKKyAgLy8gYXMgYm90aCBvcGVyYW5kcyBjb3VsZCBiZSBhZGRyZWNzIGxvb3AtaW52YXJpYW50IGluIGVhY2ggb3RoZXIncyBsb29wLgorICBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KFJIUykpIHsKKyAgICBjb25zdCBMb29wICpMID0gQVItPmdldExvb3AoKTsKKyAgICBpZiAoTEhTLT5pc0xvb3BJbnZhcmlhbnQoTCkgJiYgTEhTLT5wcm9wZXJseURvbWluYXRlcyhMLT5nZXRIZWFkZXIoKSwgRFQpKSB7CisgICAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgICAgUHJlZCA9IElDbXBJbnN0OjpnZXRTd2FwcGVkUHJlZGljYXRlKFByZWQpOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlcmUncyBhIGNvbnN0YW50IG9wZXJhbmQsIGNhbm9uaWNhbGl6ZSBjb21wYXJpc29ucyB3aXRoIGJvdW5kYXJ5CisgIC8vIGNhc2VzLCBhbmQgY2Fub25pY2FsaXplICotb3ItZXF1YWwgY29tcGFyaXNvbnMgdG8gcmVndWxhciBjb21wYXJpc29ucy4KKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KFJIUykpIHsKKyAgICBjb25zdCBBUEludCAmUkEgPSBSQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgICBzd2l0Y2ggKFByZWQpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIElDbXBJbnN0OjpQcmVkaWNhdGUgdmFsdWUhIik7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUToKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6CisgICAgICBpZiAoKFJBIC0gMSkuaXNNaW5WYWx1ZSgpKSB7CisgICAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9ORTsKKyAgICAgICAgUkhTID0gZ2V0Q29uc3RhbnQoUkEgLSAxKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKFJBLmlzTWF4VmFsdWUoKSkgeworICAgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfRVE7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChSQS5pc01pblZhbHVlKCkpIGdvdG8gdHJpdmlhbGx5X3RydWU7CisKKyAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9VR1Q7CisgICAgICBSSFMgPSBnZXRDb25zdGFudChSQSAtIDEpOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRToKKyAgICAgIGlmICgoUkEgKyAxKS5pc01heFZhbHVlKCkpIHsKKyAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX05FOworICAgICAgICBSSFMgPSBnZXRDb25zdGFudChSQSArIDEpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoUkEuaXNNaW5WYWx1ZSgpKSB7CisgICAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9FUTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKFJBLmlzTWF4VmFsdWUoKSkgZ290byB0cml2aWFsbHlfdHJ1ZTsKKworICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1VMVDsKKyAgICAgIFJIUyA9IGdldENvbnN0YW50KFJBICsgMSk7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOgorICAgICAgaWYgKChSQSAtIDEpLmlzTWluU2lnbmVkVmFsdWUoKSkgeworICAgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfTkU7CisgICAgICAgIFJIUyA9IGdldENvbnN0YW50KFJBIC0gMSk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChSQS5pc01heFNpZ25lZFZhbHVlKCkpIHsKKyAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX0VROworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoUkEuaXNNaW5TaWduZWRWYWx1ZSgpKSBnb3RvIHRyaXZpYWxseV90cnVlOworCisgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfU0dUOworICAgICAgUkhTID0gZ2V0Q29uc3RhbnQoUkEgLSAxKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6CisgICAgICBpZiAoKFJBICsgMSkuaXNNYXhTaWduZWRWYWx1ZSgpKSB7CisgICAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9ORTsKKyAgICAgICAgUkhTID0gZ2V0Q29uc3RhbnQoUkEgKyAxKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKFJBLmlzTWluU2lnbmVkVmFsdWUoKSkgeworICAgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfRVE7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChSQS5pc01heFNpZ25lZFZhbHVlKCkpIGdvdG8gdHJpdmlhbGx5X3RydWU7CisKKyAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9TTFQ7CisgICAgICBSSFMgPSBnZXRDb25zdGFudChSQSArIDEpOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDoKKyAgICAgIGlmIChSQS5pc01pblZhbHVlKCkpIHsKKyAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX05FOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoKFJBICsgMSkuaXNNYXhWYWx1ZSgpKSB7CisgICAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9FUTsKKyAgICAgICAgUkhTID0gZ2V0Q29uc3RhbnQoUkEgKyAxKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKFJBLmlzTWF4VmFsdWUoKSkgZ290byB0cml2aWFsbHlfZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDoKKyAgICAgIGlmIChSQS5pc01heFZhbHVlKCkpIHsKKyAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX05FOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoKFJBIC0gMSkuaXNNaW5WYWx1ZSgpKSB7CisgICAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9FUTsKKyAgICAgICAgUkhTID0gZ2V0Q29uc3RhbnQoUkEgLSAxKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKFJBLmlzTWluVmFsdWUoKSkgZ290byB0cml2aWFsbHlfZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHVDoKKyAgICAgIGlmIChSQS5pc01pblNpZ25lZFZhbHVlKCkpIHsKKyAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX05FOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoKFJBICsgMSkuaXNNYXhTaWduZWRWYWx1ZSgpKSB7CisgICAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9FUTsKKyAgICAgICAgUkhTID0gZ2V0Q29uc3RhbnQoUkEgKyAxKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKFJBLmlzTWF4U2lnbmVkVmFsdWUoKSkgZ290byB0cml2aWFsbHlfZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDoKKyAgICAgIGlmIChSQS5pc01heFNpZ25lZFZhbHVlKCkpIHsKKyAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX05FOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoKFJBIC0gMSkuaXNNaW5TaWduZWRWYWx1ZSgpKSB7CisgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX0VROworICAgICAgIFJIUyA9IGdldENvbnN0YW50KFJBIC0gMSk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKFJBLmlzTWluU2lnbmVkVmFsdWUoKSkgZ290byB0cml2aWFsbHlfZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBmb3Igb2J2aW91cyBlcXVhbGl0eS4KKyAgaWYgKEhhc1NhbWVWYWx1ZShMSFMsIFJIUykpIHsKKyAgICBpZiAoSUNtcEluc3Q6OmlzVHJ1ZVdoZW5FcXVhbChQcmVkKSkKKyAgICAgIGdvdG8gdHJpdmlhbGx5X3RydWU7CisgICAgaWYgKElDbXBJbnN0Ojppc0ZhbHNlV2hlbkVxdWFsKFByZWQpKQorICAgICAgZ290byB0cml2aWFsbHlfZmFsc2U7CisgIH0KKworICAvLyBJZiBwb3NzaWJsZSwgY2Fub25pY2FsaXplIEdFL0xFIGNvbXBhcmlzb25zIHRvIEdUL0xUIGNvbXBhcmlzb25zLCBieQorICAvLyBhZGRpbmcgb3Igc3VidHJhY3RpbmcgMSBmcm9tIG9uZSBvZiB0aGUgb3BlcmFuZHMuCisgIHN3aXRjaCAoUHJlZCkgeworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRToKKyAgICBpZiAoIWdldFNpZ25lZFJhbmdlKFJIUykuZ2V0U2lnbmVkTWF4KCkuaXNNYXhTaWduZWRWYWx1ZSgpKSB7CisgICAgICBSSFMgPSBnZXRBZGRFeHByKGdldENvbnN0YW50KFJIUy0+Z2V0VHlwZSgpLCAxLCB0cnVlKSwgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAvKkhhc05VVz0qL2ZhbHNlLCAvKkhhc05TVz0qL3RydWUpOworICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1NMVDsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWdldFNpZ25lZFJhbmdlKExIUykuZ2V0U2lnbmVkTWluKCkuaXNNaW5TaWduZWRWYWx1ZSgpKSB7CisgICAgICBMSFMgPSBnZXRBZGRFeHByKGdldENvbnN0YW50KFJIUy0+Z2V0VHlwZSgpLCAodWludDY0X3QpLTEsIHRydWUpLCBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgIC8qSGFzTlVXPSovZmFsc2UsIC8qSGFzTlNXPSovdHJ1ZSk7CisgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfU0xUOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRToKKyAgICBpZiAoIWdldFNpZ25lZFJhbmdlKFJIUykuZ2V0U2lnbmVkTWluKCkuaXNNaW5TaWduZWRWYWx1ZSgpKSB7CisgICAgICBSSFMgPSBnZXRBZGRFeHByKGdldENvbnN0YW50KFJIUy0+Z2V0VHlwZSgpLCAodWludDY0X3QpLTEsIHRydWUpLCBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgIC8qSGFzTlVXPSovZmFsc2UsIC8qSGFzTlNXPSovdHJ1ZSk7CisgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfU0dUOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmICghZ2V0U2lnbmVkUmFuZ2UoTEhTKS5nZXRTaWduZWRNYXgoKS5pc01heFNpZ25lZFZhbHVlKCkpIHsKKyAgICAgIExIUyA9IGdldEFkZEV4cHIoZ2V0Q29uc3RhbnQoUkhTLT5nZXRUeXBlKCksIDEsIHRydWUpLCBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgIC8qSGFzTlVXPSovZmFsc2UsIC8qSGFzTlNXPSovdHJ1ZSk7CisgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfU0dUOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRToKKyAgICBpZiAoIWdldFVuc2lnbmVkUmFuZ2UoUkhTKS5nZXRVbnNpZ25lZE1heCgpLmlzTWF4VmFsdWUoKSkgeworICAgICAgUkhTID0gZ2V0QWRkRXhwcihnZXRDb25zdGFudChSSFMtPmdldFR5cGUoKSwgMSwgdHJ1ZSksIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgLypIYXNOVVc9Ki90cnVlLCAvKkhhc05TVz0qL2ZhbHNlKTsKKyAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9VTFQ7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFnZXRVbnNpZ25lZFJhbmdlKExIUykuZ2V0VW5zaWduZWRNaW4oKS5pc01pblZhbHVlKCkpIHsKKyAgICAgIExIUyA9IGdldEFkZEV4cHIoZ2V0Q29uc3RhbnQoUkhTLT5nZXRUeXBlKCksICh1aW50NjRfdCktMSwgdHJ1ZSksIExIUywKKyAgICAgICAgICAgICAgICAgICAgICAgLypIYXNOVVc9Ki90cnVlLCAvKkhhc05TVz0qL2ZhbHNlKTsKKyAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9VTFQ7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOgorICAgIGlmICghZ2V0VW5zaWduZWRSYW5nZShSSFMpLmdldFVuc2lnbmVkTWluKCkuaXNNaW5WYWx1ZSgpKSB7CisgICAgICBSSFMgPSBnZXRBZGRFeHByKGdldENvbnN0YW50KFJIUy0+Z2V0VHlwZSgpLCAodWludDY0X3QpLTEsIHRydWUpLCBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgIC8qSGFzTlVXPSovdHJ1ZSwgLypIYXNOU1c9Ki9mYWxzZSk7CisgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfVUdUOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmICghZ2V0VW5zaWduZWRSYW5nZShMSFMpLmdldFVuc2lnbmVkTWF4KCkuaXNNYXhWYWx1ZSgpKSB7CisgICAgICBMSFMgPSBnZXRBZGRFeHByKGdldENvbnN0YW50KFJIUy0+Z2V0VHlwZSgpLCAxLCB0cnVlKSwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAvKkhhc05VVz0qL3RydWUsIC8qSGFzTlNXPSovZmFsc2UpOworICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1VHVDsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorCisgIC8vIFRPRE86IE1vcmUgc2ltcGxpZmljYXRpb25zIGFyZSBwb3NzaWJsZSBoZXJlLgorCisgIHJldHVybiBDaGFuZ2VkOworCit0cml2aWFsbHlfdHJ1ZToKKyAgLy8gUmV0dXJuIDAgPT0gMC4KKyAgTEhTID0gUkhTID0gZ2V0Q29uc3RhbnQoVHlwZTo6Z2V0SW50MVR5KGdldENvbnRleHQoKSksIDApOworICBQcmVkID0gSUNtcEluc3Q6OklDTVBfRVE7CisgIHJldHVybiB0cnVlOworCit0cml2aWFsbHlfZmFsc2U6CisgIC8vIFJldHVybiAwICE9IDAuCisgIExIUyA9IFJIUyA9IGdldENvbnN0YW50KFR5cGU6OmdldEludDFUeShnZXRDb250ZXh0KCkpLCAwKTsKKyAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX05FOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTY2FsYXJFdm9sdXRpb246OmlzS25vd25OZWdhdGl2ZShjb25zdCBTQ0VWICpTKSB7CisgIHJldHVybiBnZXRTaWduZWRSYW5nZShTKS5nZXRTaWduZWRNYXgoKS5pc05lZ2F0aXZlKCk7Cit9CisKK2Jvb2wgU2NhbGFyRXZvbHV0aW9uOjppc0tub3duUG9zaXRpdmUoY29uc3QgU0NFViAqUykgeworICByZXR1cm4gZ2V0U2lnbmVkUmFuZ2UoUykuZ2V0U2lnbmVkTWluKCkuaXNTdHJpY3RseVBvc2l0aXZlKCk7Cit9CisKK2Jvb2wgU2NhbGFyRXZvbHV0aW9uOjppc0tub3duTm9uTmVnYXRpdmUoY29uc3QgU0NFViAqUykgeworICByZXR1cm4gIWdldFNpZ25lZFJhbmdlKFMpLmdldFNpZ25lZE1pbigpLmlzTmVnYXRpdmUoKTsKK30KKworYm9vbCBTY2FsYXJFdm9sdXRpb246OmlzS25vd25Ob25Qb3NpdGl2ZShjb25zdCBTQ0VWICpTKSB7CisgIHJldHVybiAhZ2V0U2lnbmVkUmFuZ2UoUykuZ2V0U2lnbmVkTWF4KCkuaXNTdHJpY3RseVBvc2l0aXZlKCk7Cit9CisKK2Jvb2wgU2NhbGFyRXZvbHV0aW9uOjppc0tub3duTm9uWmVybyhjb25zdCBTQ0VWICpTKSB7CisgIHJldHVybiBpc0tub3duTmVnYXRpdmUoUykgfHwgaXNLbm93blBvc2l0aXZlKFMpOworfQorCitib29sIFNjYWxhckV2b2x1dGlvbjo6aXNLbm93blByZWRpY2F0ZShJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUykgeworICAvLyBDYW5vbmljYWxpemUgdGhlIGlucHV0cyBmaXJzdC4KKyAgKHZvaWQpU2ltcGxpZnlJQ21wT3BlcmFuZHMoUHJlZCwgTEhTLCBSSFMpOworCisgIC8vIElmIExIUyBvciBSSFMgaXMgYW4gYWRkcmVjLCBjaGVjayB0byBzZWUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIGluCisgIC8vIGV2ZXJ5IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcC4KKyAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihMSFMpKQorICAgIGlmIChpc0xvb3BFbnRyeUd1YXJkZWRCeUNvbmQoCisgICAgICAgICAgQVItPmdldExvb3AoKSwgUHJlZCwgQVItPmdldFN0YXJ0KCksIFJIUykgJiYKKyAgICAgICAgaXNMb29wQmFja2VkZ2VHdWFyZGVkQnlDb25kKAorICAgICAgICAgIEFSLT5nZXRMb29wKCksIFByZWQsIEFSLT5nZXRQb3N0SW5jRXhwcigqdGhpcyksIFJIUykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihSSFMpKQorICAgIGlmIChpc0xvb3BFbnRyeUd1YXJkZWRCeUNvbmQoCisgICAgICAgICAgQVItPmdldExvb3AoKSwgUHJlZCwgTEhTLCBBUi0+Z2V0U3RhcnQoKSkgJiYKKyAgICAgICAgaXNMb29wQmFja2VkZ2VHdWFyZGVkQnlDb25kKAorICAgICAgICAgIEFSLT5nZXRMb29wKCksIFByZWQsIExIUywgQVItPmdldFBvc3RJbmNFeHByKCp0aGlzKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBPdGhlcndpc2Ugc2VlIHdoYXQgY2FuIGJlIGRvbmUgd2l0aCBrbm93biBjb25zdGFudCByYW5nZXMuCisgIHJldHVybiBpc0tub3duUHJlZGljYXRlV2l0aFJhbmdlcyhQcmVkLCBMSFMsIFJIUyk7Cit9CisKK2Jvb2wKK1NjYWxhckV2b2x1dGlvbjo6aXNLbm93blByZWRpY2F0ZVdpdGhSYW5nZXMoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUykgeworICBpZiAoSGFzU2FtZVZhbHVlKExIUywgUkhTKSkKKyAgICByZXR1cm4gSUNtcEluc3Q6OmlzVHJ1ZVdoZW5FcXVhbChQcmVkKTsKKworICAvLyBUaGlzIGNvZGUgaXMgc3BsaXQgb3V0IGZyb20gaXNLbm93blByZWRpY2F0ZSBiZWNhdXNlIGl0IGlzIGNhbGxlZCBmcm9tCisgIC8vIHdpdGhpbiBpc0xvb3BFbnRyeUd1YXJkZWRCeUNvbmQuCisgIHN3aXRjaCAoUHJlZCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgSUNtcEluc3Q6OlByZWRpY2F0ZSB2YWx1ZSEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6CisgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1NMVDsKKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogeworICAgIENvbnN0YW50UmFuZ2UgTEhTUmFuZ2UgPSBnZXRTaWduZWRSYW5nZShMSFMpOworICAgIENvbnN0YW50UmFuZ2UgUkhTUmFuZ2UgPSBnZXRTaWduZWRSYW5nZShSSFMpOworICAgIGlmIChMSFNSYW5nZS5nZXRTaWduZWRNYXgoKS5zbHQoUkhTUmFuZ2UuZ2V0U2lnbmVkTWluKCkpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKExIU1JhbmdlLmdldFNpZ25lZE1pbigpLnNnZShSSFNSYW5nZS5nZXRTaWduZWRNYXgoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR0U6CisgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1NMRTsKKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRTogeworICAgIENvbnN0YW50UmFuZ2UgTEhTUmFuZ2UgPSBnZXRTaWduZWRSYW5nZShMSFMpOworICAgIENvbnN0YW50UmFuZ2UgUkhTUmFuZ2UgPSBnZXRTaWduZWRSYW5nZShSSFMpOworICAgIGlmIChMSFNSYW5nZS5nZXRTaWduZWRNYXgoKS5zbGUoUkhTUmFuZ2UuZ2V0U2lnbmVkTWluKCkpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKExIU1JhbmdlLmdldFNpZ25lZE1pbigpLnNndChSSFNSYW5nZS5nZXRTaWduZWRNYXgoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6CisgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1VMVDsKKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDogeworICAgIENvbnN0YW50UmFuZ2UgTEhTUmFuZ2UgPSBnZXRVbnNpZ25lZFJhbmdlKExIUyk7CisgICAgQ29uc3RhbnRSYW5nZSBSSFNSYW5nZSA9IGdldFVuc2lnbmVkUmFuZ2UoUkhTKTsKKyAgICBpZiAoTEhTUmFuZ2UuZ2V0VW5zaWduZWRNYXgoKS51bHQoUkhTUmFuZ2UuZ2V0VW5zaWduZWRNaW4oKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoTEhTUmFuZ2UuZ2V0VW5zaWduZWRNaW4oKS51Z2UoUkhTUmFuZ2UuZ2V0VW5zaWduZWRNYXgoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6CisgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1VMRTsKKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRTogeworICAgIENvbnN0YW50UmFuZ2UgTEhTUmFuZ2UgPSBnZXRVbnNpZ25lZFJhbmdlKExIUyk7CisgICAgQ29uc3RhbnRSYW5nZSBSSFNSYW5nZSA9IGdldFVuc2lnbmVkUmFuZ2UoUkhTKTsKKyAgICBpZiAoTEhTUmFuZ2UuZ2V0VW5zaWduZWRNYXgoKS51bGUoUkhTUmFuZ2UuZ2V0VW5zaWduZWRNaW4oKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoTEhTUmFuZ2UuZ2V0VW5zaWduZWRNaW4oKS51Z3QoUkhTUmFuZ2UuZ2V0VW5zaWduZWRNYXgoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORTogeworICAgIGlmIChnZXRVbnNpZ25lZFJhbmdlKExIUykuaW50ZXJzZWN0V2l0aChnZXRVbnNpZ25lZFJhbmdlKFJIUykpLmlzRW1wdHlTZXQoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChnZXRTaWduZWRSYW5nZShMSFMpLmludGVyc2VjdFdpdGgoZ2V0U2lnbmVkUmFuZ2UoUkhTKSkuaXNFbXB0eVNldCgpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjb25zdCBTQ0VWICpEaWZmID0gZ2V0TWludXNTQ0VWKExIUywgUkhTKTsKKyAgICBpZiAoaXNLbm93bk5vblplcm8oRGlmZikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROgorICAgIC8vIFRoZSBjaGVjayBhdCB0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbiBjYXRjaGVzIHRoZSBjYXNlIHdoZXJlCisgICAgLy8gdGhlIHZhbHVlcyBhcmUga25vd24gdG8gYmUgZXF1YWwuCisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNMb29wQmFja2VkZ2VHdWFyZGVkQnlDb25kIC0gVGVzdCB3aGV0aGVyIHRoZSBiYWNrZWRnZSBvZiB0aGUgbG9vcCBpcworLy8vIHByb3RlY3RlZCBieSBhIGNvbmRpdGlvbmFsIGJldHdlZW4gTEhTIGFuZCBSSFMuICBUaGlzIGlzIHVzZWQgdG8KKy8vLyB0byBlbGltaW5hdGUgY2FzdHMuCitib29sCitTY2FsYXJFdm9sdXRpb246OmlzTG9vcEJhY2tlZGdlR3VhcmRlZEJ5Q29uZChjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpIHsKKyAgLy8gSW50ZXJwcmV0IGEgbnVsbCBhcyBtZWFuaW5nIG5vIGxvb3AsIHdoZXJlIHRoZXJlIGlzIG9idmlvdXNseSBubyBndWFyZAorICAvLyAoaW50ZXJwcm9jZWR1cmFsIGNvbmRpdGlvbnMgbm90d2l0aHN0YW5kaW5nKS4KKyAgaWYgKCFMKSByZXR1cm4gdHJ1ZTsKKworICBCYXNpY0Jsb2NrICpMYXRjaCA9IEwtPmdldExvb3BMYXRjaCgpOworICBpZiAoIUxhdGNoKQorICAgIHJldHVybiBmYWxzZTsKKworICBCcmFuY2hJbnN0ICpMb29wQ29udGludWVQcmVkaWNhdGUgPQorICAgIGR5bl9jYXN0PEJyYW5jaEluc3Q+KExhdGNoLT5nZXRUZXJtaW5hdG9yKCkpOworICBpZiAoIUxvb3BDb250aW51ZVByZWRpY2F0ZSB8fAorICAgICAgTG9vcENvbnRpbnVlUHJlZGljYXRlLT5pc1VuY29uZGl0aW9uYWwoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIGlzSW1wbGllZENvbmQoUHJlZCwgTEhTLCBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgIExvb3BDb250aW51ZVByZWRpY2F0ZS0+Z2V0Q29uZGl0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgIExvb3BDb250aW51ZVByZWRpY2F0ZS0+Z2V0U3VjY2Vzc29yKDApICE9IEwtPmdldEhlYWRlcigpKTsKK30KKworLy8vIGlzTG9vcEVudHJ5R3VhcmRlZEJ5Q29uZCAtIFRlc3Qgd2hldGhlciBlbnRyeSB0byB0aGUgbG9vcCBpcyBwcm90ZWN0ZWQKKy8vLyBieSBhIGNvbmRpdGlvbmFsIGJldHdlZW4gTEhTIGFuZCBSSFMuICBUaGlzIGlzIHVzZWQgdG8gaGVscCBhdm9pZCBtYXgKKy8vLyBleHByZXNzaW9ucyBpbiBsb29wIHRyaXAgY291bnRzLCBhbmQgdG8gZWxpbWluYXRlIGNhc3RzLgorYm9vbAorU2NhbGFyRXZvbHV0aW9uOjppc0xvb3BFbnRyeUd1YXJkZWRCeUNvbmQoY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKSB7CisgIC8vIEludGVycHJldCBhIG51bGwgYXMgbWVhbmluZyBubyBsb29wLCB3aGVyZSB0aGVyZSBpcyBvYnZpb3VzbHkgbm8gZ3VhcmQKKyAgLy8gKGludGVycHJvY2VkdXJhbCBjb25kaXRpb25zIG5vdHdpdGhzdGFuZGluZykuCisgIGlmICghTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIFN0YXJ0aW5nIGF0IHRoZSBsb29wIHByZWRlY2Vzc29yLCBjbGltYiB1cCB0aGUgcHJlZGVjZXNzb3IgY2hhaW4sIGFzIGxvbmcKKyAgLy8gYXMgdGhlcmUgYXJlIHByZWRlY2Vzc29ycyB0aGF0IGNhbiBiZSBmb3VuZCB0aGF0IGhhdmUgdW5pcXVlIHN1Y2Nlc3NvcnMKKyAgLy8gbGVhZGluZyB0byB0aGUgb3JpZ2luYWwgaGVhZGVyLgorICBmb3IgKHN0ZDo6cGFpcjxCYXNpY0Jsb2NrICosIEJhc2ljQmxvY2sgKj4KKyAgICAgICAgIFBhaXIoTC0+Z2V0TG9vcFByZWRlY2Vzc29yKCksIEwtPmdldEhlYWRlcigpKTsKKyAgICAgICBQYWlyLmZpcnN0OworICAgICAgIFBhaXIgPSBnZXRQcmVkZWNlc3NvcldpdGhVbmlxdWVTdWNjZXNzb3JGb3JCQihQYWlyLmZpcnN0KSkgeworCisgICAgQnJhbmNoSW5zdCAqTG9vcEVudHJ5UHJlZGljYXRlID0KKyAgICAgIGR5bl9jYXN0PEJyYW5jaEluc3Q+KFBhaXIuZmlyc3QtPmdldFRlcm1pbmF0b3IoKSk7CisgICAgaWYgKCFMb29wRW50cnlQcmVkaWNhdGUgfHwKKyAgICAgICAgTG9vcEVudHJ5UHJlZGljYXRlLT5pc1VuY29uZGl0aW9uYWwoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGlzSW1wbGllZENvbmQoUHJlZCwgTEhTLCBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgTG9vcEVudHJ5UHJlZGljYXRlLT5nZXRDb25kaXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICBMb29wRW50cnlQcmVkaWNhdGUtPmdldFN1Y2Nlc3NvcigwKSAhPSBQYWlyLnNlY29uZCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzSW1wbGllZENvbmQgLSBUZXN0IHdoZXRoZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgTEhTLAorLy8vIGFuZCBSSFMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgZ2l2ZW4gQ29uZCB2YWx1ZSBldmFsdWF0ZXMgdG8gdHJ1ZS4KK2Jvb2wgU2NhbGFyRXZvbHV0aW9uOjppc0ltcGxpZWRDb25kKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkZvdW5kQ29uZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbnZlcnNlKSB7CisgIC8vIFJlY3Vyc2l2ZWx5IGhhbmRsZSBBbmQgYW5kIE9yIGNvbmRpdGlvbnMuCisgIGlmIChCaW5hcnlPcGVyYXRvciAqQk8gPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oRm91bmRDb25kVmFsdWUpKSB7CisgICAgaWYgKEJPLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kKSB7CisgICAgICBpZiAoIUludmVyc2UpCisgICAgICAgIHJldHVybiBpc0ltcGxpZWRDb25kKFByZWQsIExIUywgUkhTLCBCTy0+Z2V0T3BlcmFuZCgwKSwgSW52ZXJzZSkgfHwKKyAgICAgICAgICAgICAgIGlzSW1wbGllZENvbmQoUHJlZCwgTEhTLCBSSFMsIEJPLT5nZXRPcGVyYW5kKDEpLCBJbnZlcnNlKTsKKyAgICB9IGVsc2UgaWYgKEJPLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6T3IpIHsKKyAgICAgIGlmIChJbnZlcnNlKQorICAgICAgICByZXR1cm4gaXNJbXBsaWVkQ29uZChQcmVkLCBMSFMsIFJIUywgQk8tPmdldE9wZXJhbmQoMCksIEludmVyc2UpIHx8CisgICAgICAgICAgICAgICBpc0ltcGxpZWRDb25kKFByZWQsIExIUywgUkhTLCBCTy0+Z2V0T3BlcmFuZCgxKSwgSW52ZXJzZSk7CisgICAgfQorICB9CisKKyAgSUNtcEluc3QgKklDSSA9IGR5bl9jYXN0PElDbXBJbnN0PihGb3VuZENvbmRWYWx1ZSk7CisgIGlmICghSUNJKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gQmFpbCBpZiB0aGUgSUNtcCdzIG9wZXJhbmRzJyB0eXBlcyBhcmUgd2lkZXIgdGhhbiB0aGUgbmVlZGVkIHR5cGUKKyAgLy8gYmVmb3JlIGF0dGVtcHRpbmcgdG8gY2FsbCBnZXRTQ0VWIG9uIHRoZW0uIFRoaXMgYXZvaWRzIGluZmluaXRlCisgIC8vIHJlY3Vyc2lvbiwgc2luY2UgdGhlIGFuYWx5c2lzIG9mIHdpZGVuaW5nIGNhc3RzIGNhbiByZXF1aXJlIGxvb3AKKyAgLy8gZXhpdCBjb25kaXRpb24gaW5mb3JtYXRpb24gZm9yIG92ZXJmbG93IGNoZWNraW5nLCB3aGljaCB3b3VsZAorICAvLyBsZWFkIGJhY2sgaGVyZS4KKyAgaWYgKGdldFR5cGVTaXplSW5CaXRzKExIUy0+Z2V0VHlwZSgpKSA8CisgICAgICBnZXRUeXBlU2l6ZUluQml0cyhJQ0ktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE5vdyB0aGF0IHdlIGZvdW5kIGEgY29uZGl0aW9uYWwgYnJhbmNoIHRoYXQgZG9taW5hdGVzIHRoZSBsb29wLCBjaGVjayB0bworICAvLyBzZWUgaWYgaXQgaXMgdGhlIGNvbXBhcmlzb24gd2UgYXJlIGxvb2tpbmcgZm9yLgorICBJQ21wSW5zdDo6UHJlZGljYXRlIEZvdW5kUHJlZDsKKyAgaWYgKEludmVyc2UpCisgICAgRm91bmRQcmVkID0gSUNJLT5nZXRJbnZlcnNlUHJlZGljYXRlKCk7CisgIGVsc2UKKyAgICBGb3VuZFByZWQgPSBJQ0ktPmdldFByZWRpY2F0ZSgpOworCisgIGNvbnN0IFNDRVYgKkZvdW5kTEhTID0gZ2V0U0NFVihJQ0ktPmdldE9wZXJhbmQoMCkpOworICBjb25zdCBTQ0VWICpGb3VuZFJIUyA9IGdldFNDRVYoSUNJLT5nZXRPcGVyYW5kKDEpKTsKKworICAvLyBCYWxhbmNlIHRoZSB0eXBlcy4gVGhlIGNhc2Ugd2hlcmUgRm91bmRMSFMnIHR5cGUgaXMgd2lkZXIgdGhhbgorICAvLyBMSFMnIHR5cGUgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCisgIGlmIChnZXRUeXBlU2l6ZUluQml0cyhMSFMtPmdldFR5cGUoKSkgPgorICAgICAgZ2V0VHlwZVNpemVJbkJpdHMoRm91bmRMSFMtPmdldFR5cGUoKSkpIHsKKyAgICBpZiAoQ21wSW5zdDo6aXNTaWduZWQoUHJlZCkpIHsKKyAgICAgIEZvdW5kTEhTID0gZ2V0U2lnbkV4dGVuZEV4cHIoRm91bmRMSFMsIExIUy0+Z2V0VHlwZSgpKTsKKyAgICAgIEZvdW5kUkhTID0gZ2V0U2lnbkV4dGVuZEV4cHIoRm91bmRSSFMsIExIUy0+Z2V0VHlwZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgRm91bmRMSFMgPSBnZXRaZXJvRXh0ZW5kRXhwcihGb3VuZExIUywgTEhTLT5nZXRUeXBlKCkpOworICAgICAgRm91bmRSSFMgPSBnZXRaZXJvRXh0ZW5kRXhwcihGb3VuZFJIUywgTEhTLT5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCisgIC8vIENhbm9uaWNhbGl6ZSB0aGUgcXVlcnkgdG8gbWF0Y2ggdGhlIHdheSBpbnN0Y29tYmluZSB3aWxsIGhhdmUKKyAgLy8gY2Fub25pY2FsaXplZCB0aGUgY29tcGFyaXNvbi4KKyAgaWYgKFNpbXBsaWZ5SUNtcE9wZXJhbmRzKFByZWQsIExIUywgUkhTKSkKKyAgICBpZiAoTEhTID09IFJIUykKKyAgICAgIHJldHVybiBDbXBJbnN0Ojppc1RydWVXaGVuRXF1YWwoUHJlZCk7CisgIGlmIChTaW1wbGlmeUlDbXBPcGVyYW5kcyhGb3VuZFByZWQsIEZvdW5kTEhTLCBGb3VuZFJIUykpCisgICAgaWYgKEZvdW5kTEhTID09IEZvdW5kUkhTKQorICAgICAgcmV0dXJuIENtcEluc3Q6OmlzRmFsc2VXaGVuRXF1YWwoUHJlZCk7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBtYWtlIHRoZSBMSFMgb3IgUkhTIG1hdGNoLgorICBpZiAoTEhTID09IEZvdW5kUkhTIHx8IFJIUyA9PSBGb3VuZExIUykgeworICAgIGlmIChpc2E8U0NFVkNvbnN0YW50PihSSFMpKSB7CisgICAgICBzdGQ6OnN3YXAoRm91bmRMSFMsIEZvdW5kUkhTKTsKKyAgICAgIEZvdW5kUHJlZCA9IElDbXBJbnN0OjpnZXRTd2FwcGVkUHJlZGljYXRlKEZvdW5kUHJlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6c3dhcChMSFMsIFJIUyk7CisgICAgICBQcmVkID0gSUNtcEluc3Q6OmdldFN3YXBwZWRQcmVkaWNhdGUoUHJlZCk7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZm91bmQgcHJlZGljYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXNpcmVkIHByZWRpY2F0ZS4KKyAgaWYgKEZvdW5kUHJlZCA9PSBQcmVkKQorICAgIHJldHVybiBpc0ltcGxpZWRDb25kT3BlcmFuZHMoUHJlZCwgTEhTLCBSSFMsIEZvdW5kTEhTLCBGb3VuZFJIUyk7CisKKyAgLy8gQ2hlY2sgd2hldGhlciBzd2FwcGluZyB0aGUgZm91bmQgcHJlZGljYXRlIG1ha2VzIGl0IHRoZSBzYW1lIGFzIHRoZQorICAvLyBkZXNpcmVkIHByZWRpY2F0ZS4KKyAgaWYgKElDbXBJbnN0OjpnZXRTd2FwcGVkUHJlZGljYXRlKEZvdW5kUHJlZCkgPT0gUHJlZCkgeworICAgIGlmIChpc2E8U0NFVkNvbnN0YW50PihSSFMpKQorICAgICAgcmV0dXJuIGlzSW1wbGllZENvbmRPcGVyYW5kcyhQcmVkLCBMSFMsIFJIUywgRm91bmRSSFMsIEZvdW5kTEhTKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gaXNJbXBsaWVkQ29uZE9wZXJhbmRzKElDbXBJbnN0OjpnZXRTd2FwcGVkUHJlZGljYXRlKFByZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMsIExIUywgRm91bmRMSFMsIEZvdW5kUkhTKTsKKyAgfQorCisgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGFjdHVhbCBjb25kaXRpb24gaXMgYmV5b25kIHN1ZmZpY2llbnQuCisgIGlmIChGb3VuZFByZWQgPT0gSUNtcEluc3Q6OklDTVBfRVEpCisgICAgaWYgKElDbXBJbnN0Ojppc1RydWVXaGVuRXF1YWwoUHJlZCkpCisgICAgICBpZiAoaXNJbXBsaWVkQ29uZE9wZXJhbmRzKFByZWQsIExIUywgUkhTLCBGb3VuZExIUywgRm91bmRSSFMpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKFByZWQgPT0gSUNtcEluc3Q6OklDTVBfTkUpCisgICAgaWYgKCFJQ21wSW5zdDo6aXNUcnVlV2hlbkVxdWFsKEZvdW5kUHJlZCkpCisgICAgICBpZiAoaXNJbXBsaWVkQ29uZE9wZXJhbmRzKEZvdW5kUHJlZCwgTEhTLCBSSFMsIEZvdW5kTEhTLCBGb3VuZFJIUykpCisgICAgICAgIHJldHVybiB0cnVlOworCisgIC8vIE90aGVyd2lzZSBhc3N1bWUgdGhlIHdvcnN0LgorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBpc0ltcGxpZWRDb25kT3BlcmFuZHMgLSBUZXN0IHdoZXRoZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwKKy8vLyBMSFMsIGFuZCBSSFMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBGb3VuZExIUywKKy8vLyBhbmQgRm91bmRSSFMgaXMgdHJ1ZS4KK2Jvb2wgU2NhbGFyRXZvbHV0aW9uOjppc0ltcGxpZWRDb25kT3BlcmFuZHMoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRm91bmRMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkZvdW5kUkhTKSB7CisgIHJldHVybiBpc0ltcGxpZWRDb25kT3BlcmFuZHNIZWxwZXIoUHJlZCwgTEhTLCBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm91bmRMSFMsIEZvdW5kUkhTKSB8fAorICAgICAgICAgLy8gfnggPCB+eSAtLT4geCA+IHkKKyAgICAgICAgIGlzSW1wbGllZENvbmRPcGVyYW5kc0hlbHBlcihQcmVkLCBMSFMsIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb3RTQ0VWKEZvdW5kUkhTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb3RTQ0VWKEZvdW5kTEhTKSk7Cit9CisKKy8vLyBpc0ltcGxpZWRDb25kT3BlcmFuZHNIZWxwZXIgLSBUZXN0IHdoZXRoZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkKKy8vLyBQcmVkLCBMSFMsIGFuZCBSSFMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLAorLy8vIEZvdW5kTEhTLCBhbmQgRm91bmRSSFMgaXMgdHJ1ZS4KK2Jvb2wKK1NjYWxhckV2b2x1dGlvbjo6aXNJbXBsaWVkQ29uZE9wZXJhbmRzSGVscGVyKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRm91bmRMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpGb3VuZFJIUykgeworICBzd2l0Y2ggKFByZWQpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBJQ21wSW5zdDo6UHJlZGljYXRlIHZhbHVlISIpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROgorICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOgorICAgIGlmIChIYXNTYW1lVmFsdWUoTEhTLCBGb3VuZExIUykgJiYgSGFzU2FtZVZhbHVlKFJIUywgRm91bmRSSFMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOgorICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRToKKyAgICBpZiAoaXNLbm93blByZWRpY2F0ZVdpdGhSYW5nZXMoSUNtcEluc3Q6OklDTVBfU0xFLCBMSFMsIEZvdW5kTEhTKSAmJgorICAgICAgICBpc0tub3duUHJlZGljYXRlV2l0aFJhbmdlcyhJQ21wSW5zdDo6SUNNUF9TR0UsIFJIUywgRm91bmRSSFMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOgorICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRToKKyAgICBpZiAoaXNLbm93blByZWRpY2F0ZVdpdGhSYW5nZXMoSUNtcEluc3Q6OklDTVBfU0dFLCBMSFMsIEZvdW5kTEhTKSAmJgorICAgICAgICBpc0tub3duUHJlZGljYXRlV2l0aFJhbmdlcyhJQ21wSW5zdDo6SUNNUF9TTEUsIFJIUywgRm91bmRSSFMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOgorICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRToKKyAgICBpZiAoaXNLbm93blByZWRpY2F0ZVdpdGhSYW5nZXMoSUNtcEluc3Q6OklDTVBfVUxFLCBMSFMsIEZvdW5kTEhTKSAmJgorICAgICAgICBpc0tub3duUHJlZGljYXRlV2l0aFJhbmdlcyhJQ21wSW5zdDo6SUNNUF9VR0UsIFJIUywgRm91bmRSSFMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOgorICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHRToKKyAgICBpZiAoaXNLbm93blByZWRpY2F0ZVdpdGhSYW5nZXMoSUNtcEluc3Q6OklDTVBfVUdFLCBMSFMsIEZvdW5kTEhTKSAmJgorICAgICAgICBpc0tub3duUHJlZGljYXRlV2l0aFJhbmdlcyhJQ21wSW5zdDo6SUNNUF9VTEUsIFJIUywgRm91bmRSSFMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBnZXRCRUNvdW50IC0gU3VidHJhY3QgdGhlIGVuZCBhbmQgc3RhcnQgdmFsdWVzIGFuZCBkaXZpZGUgYnkgdGhlIHN0ZXAsCisvLy8gcm91bmRpbmcgdXAsIHRvIGdldCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBiYWNrZWRnZSBpcyBleGVjdXRlZC4gUmV0dXJuCisvLy8gQ291bGROb3RDb21wdXRlIGlmIGFuIGludGVybWVkaWF0ZSBjb21wdXRhdGlvbiBvdmVyZmxvd3MuCitjb25zdCBTQ0VWICpTY2FsYXJFdm9sdXRpb246OmdldEJFQ291bnQoY29uc3QgU0NFViAqU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb1dyYXApIHsKKyAgYXNzZXJ0KCFpc0tub3duTmVnYXRpdmUoU3RlcCkgJiYKKyAgICAgICAgICJUaGlzIGNvZGUgZG9lc24ndCBoYW5kbGUgbmVnYXRpdmUgc3RyaWRlcyB5ZXQhIik7CisKKyAgY29uc3QgVHlwZSAqVHkgPSBTdGFydC0+Z2V0VHlwZSgpOworICBjb25zdCBTQ0VWICpOZWdPbmUgPSBnZXRDb25zdGFudChUeSwgKHVpbnQ2NF90KS0xKTsKKyAgY29uc3QgU0NFViAqRGlmZiA9IGdldE1pbnVzU0NFVihFbmQsIFN0YXJ0KTsKKyAgY29uc3QgU0NFViAqUm91bmRVcCA9IGdldEFkZEV4cHIoU3RlcCwgTmVnT25lKTsKKworICAvLyBBZGQgYW4gYWRqdXN0bWVudCB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEVuZCBhbmQgU3RhcnQgc28gdGhhdAorICAvLyB0aGUgZGl2aXNpb24gd2lsbCBlZmZlY3RpdmVseSByb3VuZCB1cC4KKyAgY29uc3QgU0NFViAqQWRkID0gZ2V0QWRkRXhwcihEaWZmLCBSb3VuZFVwKTsKKworICBpZiAoIU5vV3JhcCkgeworICAgIC8vIENoZWNrIEFkZCBmb3IgdW5zaWduZWQgb3ZlcmZsb3cuCisgICAgLy8gVE9ETzogTW9yZSBzb3BoaXN0aWNhdGVkIHRoaW5ncyBjb3VsZCBiZSBkb25lIGhlcmUuCisgICAgY29uc3QgVHlwZSAqV2lkZVR5ID0gSW50ZWdlclR5cGU6OmdldChnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlU2l6ZUluQml0cyhUeSkgKyAxKTsKKyAgICBjb25zdCBTQ0VWICpFRGlmZiA9IGdldFplcm9FeHRlbmRFeHByKERpZmYsIFdpZGVUeSk7CisgICAgY29uc3QgU0NFViAqRVJvdW5kVXAgPSBnZXRaZXJvRXh0ZW5kRXhwcihSb3VuZFVwLCBXaWRlVHkpOworICAgIGNvbnN0IFNDRVYgKk9wZXJhbmRFeHRlbmRlZEFkZCA9IGdldEFkZEV4cHIoRURpZmYsIEVSb3VuZFVwKTsKKyAgICBpZiAoZ2V0WmVyb0V4dGVuZEV4cHIoQWRkLCBXaWRlVHkpICE9IE9wZXJhbmRFeHRlbmRlZEFkZCkKKyAgICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgfQorCisgIHJldHVybiBnZXRVRGl2RXhwcihBZGQsIFN0ZXApOworfQorCisvLy8gSG93TWFueUxlc3NUaGFucyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgYmFja2VkZ2UgY29udGFpbmluZyB0aGUKKy8vLyBzcGVjaWZpZWQgbGVzcy10aGFuIGNvbXBhcmlzb24gd2lsbCBleGVjdXRlLiAgSWYgbm90IGNvbXB1dGFibGUsIHJldHVybgorLy8vIENvdWxkTm90Q29tcHV0ZS4KK1NjYWxhckV2b2x1dGlvbjo6QmFja2VkZ2VUYWtlbkluZm8KK1NjYWxhckV2b2x1dGlvbjo6SG93TWFueUxlc3NUaGFucyhjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLCBib29sIGlzU2lnbmVkKSB7CisgIC8vIE9ubHkgaGFuZGxlOiAgIkFERFJFQyA8IExvb3BJbnZhcmlhbnQiLgorICBpZiAoIVJIUy0+aXNMb29wSW52YXJpYW50KEwpKSByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7CisKKyAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFkZFJlYyA9IGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihMSFMpOworICBpZiAoIUFkZFJlYyB8fCBBZGRSZWMtPmdldExvb3AoKSAhPSBMKQorICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGZsYWcgd2hpY2ggbWFrZXMgYW5hbHlzaXMgZWFzeS4KKyAgYm9vbCBOb1dyYXAgPSBpc1NpZ25lZCA/IEFkZFJlYy0+aGFzTm9TaWduZWRXcmFwKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUmVjLT5oYXNOb1Vuc2lnbmVkV3JhcCgpOworCisgIGlmIChBZGRSZWMtPmlzQWZmaW5lKCkpIHsKKyAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IGdldFR5cGVTaXplSW5CaXRzKEFkZFJlYy0+Z2V0VHlwZSgpKTsKKyAgICBjb25zdCBTQ0VWICpTdGVwID0gQWRkUmVjLT5nZXRTdGVwUmVjdXJyZW5jZSgqdGhpcyk7CisKKyAgICBpZiAoU3RlcC0+aXNaZXJvKCkpCisgICAgICByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7CisgICAgaWYgKFN0ZXAtPmlzT25lKCkpIHsKKyAgICAgIC8vIFdpdGggdW5pdCBzdHJpZGUsIHRoZSBpdGVyYXRpb24gbmV2ZXIgc3RlcHMgcGFzdCB0aGUgbGltaXQgdmFsdWUuCisgICAgfSBlbHNlIGlmIChpc0tub3duUG9zaXRpdmUoU3RlcCkpIHsKKyAgICAgIC8vIFRlc3Qgd2hldGhlciBhIHBvc2l0aXZlIGl0ZXJhdGlvbiBjYW4gc3RlcCBwYXN0IHRoZSBsaW1pdAorICAgICAgLy8gdmFsdWUgYW5kIHBhc3QgdGhlIG1heGltdW0gdmFsdWUgZm9yIGl0cyB0eXBlIGluIGEgc2luZ2xlIHN0ZXAuCisgICAgICAvLyBOb3RlIHRoYXQgaXQncyBub3Qgc3VmZmljaWVudCB0byBjaGVjayBOb1dyYXAgaGVyZSwgYmVjYXVzZSBldmVuCisgICAgICAvLyB0aG91Z2ggdGhlIHZhbHVlIGFmdGVyIGEgd3JhcCBpcyB1bmRlZmluZWQsIGl0J3Mgbm90IHVuZGVmaW5lZAorICAgICAgLy8gYmVoYXZpb3IsIHNvIGlmIHdyYXAgZG9lcyBvY2N1ciwgdGhlIGxvb3AgY291bGQgZWl0aGVyIHRlcm1pbmF0ZSBvcgorICAgICAgLy8gbG9vcCBpbmZpbml0ZWx5LCBidXQgaW4gZWl0aGVyIGNhc2UsIHRoZSBsb29wIGlzIGd1YXJhbnRlZWQgdG8KKyAgICAgIC8vIGl0ZXJhdGUgYXQgbGVhc3QgdW50aWwgdGhlIGl0ZXJhdGlvbiB3aGVyZSB0aGUgd3JhcHBpbmcgb2NjdXJzLgorICAgICAgY29uc3QgU0NFViAqT25lID0gZ2V0Q29uc3RhbnQoU3RlcC0+Z2V0VHlwZSgpLCAxKTsKKyAgICAgIGlmIChpc1NpZ25lZCkgeworICAgICAgICBBUEludCBNYXggPSBBUEludDo6Z2V0U2lnbmVkTWF4VmFsdWUoQml0V2lkdGgpOworICAgICAgICBpZiAoKE1heCAtIGdldFNpZ25lZFJhbmdlKGdldE1pbnVzU0NFVihTdGVwLCBPbmUpKS5nZXRTaWduZWRNYXgoKSkKKyAgICAgICAgICAgICAgLnNsdChnZXRTaWduZWRSYW5nZShSSFMpLmdldFNpZ25lZE1heCgpKSkKKyAgICAgICAgICByZXR1cm4gZ2V0Q291bGROb3RDb21wdXRlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBUEludCBNYXggPSBBUEludDo6Z2V0TWF4VmFsdWUoQml0V2lkdGgpOworICAgICAgICBpZiAoKE1heCAtIGdldFVuc2lnbmVkUmFuZ2UoZ2V0TWludXNTQ0VWKFN0ZXAsIE9uZSkpLmdldFVuc2lnbmVkTWF4KCkpCisgICAgICAgICAgICAgIC51bHQoZ2V0VW5zaWduZWRSYW5nZShSSFMpLmdldFVuc2lnbmVkTWF4KCkpKQorICAgICAgICAgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgIC8vIFRPRE86IEhhbmRsZSBuZWdhdGl2ZSBzdHJpZGVzIGhlcmUgYW5kIGJlbG93LgorICAgICAgcmV0dXJuIGdldENvdWxkTm90Q29tcHV0ZSgpOworCisgICAgLy8gV2Uga25vdyB0aGUgTEhTIGlzIG9mIHRoZSBmb3JtIHtuLCssc30gYW5kIHRoZSBSSFMgaXMgc29tZSBsb29wLWludmFyaWFudAorICAgIC8vIG0uICBTbywgd2UgY291bnQgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIGluIHdoaWNoIHtuLCssc30gPCBtIGlzIHRydWUuCisgICAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBzaW1wbHkgcmV0dXJuIG1heChtLW4sMCkvcyBiZWNhdXNlIGl0J3Mgbm90IHNhZmUgdG8KKyAgICAvLyB0cmVhdCBtLW4gYXMgc2lnbmVkIG5vciB1bnNpZ25lZCBkdWUgdG8gb3ZlcmZsb3cgcG9zc2liaWxpdHkuCisKKyAgICAvLyBGaXJzdCwgd2UgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgTEhTIGluIHRoZSBmaXJzdCBpdGVyYXRpb246IG4KKyAgICBjb25zdCBTQ0VWICpTdGFydCA9IEFkZFJlYy0+Z2V0T3BlcmFuZCgwKTsKKworICAgIC8vIERldGVybWluZSB0aGUgbWluaW11bSBjb25zdGFudCBzdGFydCB2YWx1ZS4KKyAgICBjb25zdCBTQ0VWICpNaW5TdGFydCA9IGdldENvbnN0YW50KGlzU2lnbmVkID8KKyAgICAgIGdldFNpZ25lZFJhbmdlKFN0YXJ0KS5nZXRTaWduZWRNaW4oKSA6CisgICAgICBnZXRVbnNpZ25lZFJhbmdlKFN0YXJ0KS5nZXRVbnNpZ25lZE1pbigpKTsKKworICAgIC8vIElmIHdlIGtub3cgdGhhdCB0aGUgY29uZGl0aW9uIGlzIHRydWUgaW4gb3JkZXIgdG8gZW50ZXIgdGhlIGxvb3AsCisgICAgLy8gdGhlbiB3ZSBrbm93IHRoYXQgaXQgd2lsbCBydW4gZXhhY3RseSAobS1uKS9zIHRpbWVzLiBPdGhlcndpc2UsIHdlCisgICAgLy8gb25seSBrbm93IHRoYXQgaXQgd2lsbCBleGVjdXRlIChtYXgobSxuKS1uKS9zIHRpbWVzLiBJbiBib3RoIGNhc2VzLAorICAgIC8vIHRoZSBkaXZpc2lvbiBtdXN0IHJvdW5kIHVwLgorICAgIGNvbnN0IFNDRVYgKkVuZCA9IFJIUzsKKyAgICBpZiAoIWlzTG9vcEVudHJ5R3VhcmRlZEJ5Q29uZChMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbmVkID8gSUNtcEluc3Q6OklDTVBfU0xUIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDbXBJbnN0OjpJQ01QX1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNaW51c1NDRVYoU3RhcnQsIFN0ZXApLCBSSFMpKQorICAgICAgRW5kID0gaXNTaWduZWQgPyBnZXRTTWF4RXhwcihSSFMsIFN0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgOiBnZXRVTWF4RXhwcihSSFMsIFN0YXJ0KTsKKworICAgIC8vIERldGVybWluZSB0aGUgbWF4aW11bSBjb25zdGFudCBlbmQgdmFsdWUuCisgICAgY29uc3QgU0NFViAqTWF4RW5kID0gZ2V0Q29uc3RhbnQoaXNTaWduZWQgPworICAgICAgZ2V0U2lnbmVkUmFuZ2UoRW5kKS5nZXRTaWduZWRNYXgoKSA6CisgICAgICBnZXRVbnNpZ25lZFJhbmdlKEVuZCkuZ2V0VW5zaWduZWRNYXgoKSk7CisKKyAgICAvLyBJZiBNYXhFbmQgaXMgd2l0aGluIGEgc3RlcCBvZiB0aGUgbWF4aW11bSBpbnRlZ2VyIHZhbHVlIGluIGl0cyB0eXBlLAorICAgIC8vIGFkanVzdCBpdCBkb3duIHRvIHRoZSBtaW5pbXVtIHZhbHVlIHdoaWNoIHdvdWxkIHByb2R1Y2UgdGhlIHNhbWUgZWZmZWN0LgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBzdWJzZXF1ZW50IGNlaWxpbmcgZGl2aXNpb24gb2YgKE4rKHN0ZXAtMSkpL3N0ZXAgdG8KKyAgICAvLyBjb21wdXRlIHRoZSBjb3JyZWN0IHZhbHVlLgorICAgIGNvbnN0IFNDRVYgKlN0ZXBNaW51c09uZSA9IGdldE1pbnVzU0NFVihTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25zdGFudChTdGVwLT5nZXRUeXBlKCksIDEpKTsKKyAgICBNYXhFbmQgPSBpc1NpZ25lZCA/CisgICAgICBnZXRTTWluRXhwcihNYXhFbmQsCisgICAgICAgICAgICAgICAgICBnZXRNaW51c1NDRVYoZ2V0Q29uc3RhbnQoQVBJbnQ6OmdldFNpZ25lZE1heFZhbHVlKEJpdFdpZHRoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RlcE1pbnVzT25lKSkgOgorICAgICAgZ2V0VU1pbkV4cHIoTWF4RW5kLAorICAgICAgICAgICAgICAgICAgZ2V0TWludXNTQ0VWKGdldENvbnN0YW50KEFQSW50OjpnZXRNYXhWYWx1ZShCaXRXaWR0aCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZXBNaW51c09uZSkpOworCisgICAgLy8gRmluYWxseSwgd2Ugc3VidHJhY3QgdGhlc2UgdHdvIHZhbHVlcyBhbmQgZGl2aWRlLCByb3VuZGluZyB1cCwgdG8gZ2V0CisgICAgLy8gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYmFja2VkZ2UgaXMgZXhlY3V0ZWQuCisgICAgY29uc3QgU0NFViAqQkVDb3VudCA9IGdldEJFQ291bnQoU3RhcnQsIEVuZCwgU3RlcCwgTm9XcmFwKTsKKworICAgIC8vIFRoZSBtYXhpbXVtIGJhY2tlZGdlIGNvdW50IGlzIHNpbWlsYXIsIGV4Y2VwdCB1c2luZyB0aGUgbWluaW11bSBzdGFydAorICAgIC8vIHZhbHVlIGFuZCB0aGUgbWF4aW11bSBlbmQgdmFsdWUuCisgICAgY29uc3QgU0NFViAqTWF4QkVDb3VudCA9IGdldEJFQ291bnQoTWluU3RhcnQsIE1heEVuZCwgU3RlcCwgTm9XcmFwKTsKKworICAgIHJldHVybiBCYWNrZWRnZVRha2VuSW5mbyhCRUNvdW50LCBNYXhCRUNvdW50KTsKKyAgfQorCisgIHJldHVybiBnZXRDb3VsZE5vdENvbXB1dGUoKTsKK30KKworLy8vIGdldE51bUl0ZXJhdGlvbnNJblJhbmdlIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvZiB0aGlzIGxvb3AgdGhhdAorLy8vIHByb2R1Y2UgdmFsdWVzIGluIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgcmFuZ2UuICBBbm90aGVyIHdheSBvZiBsb29raW5nIGF0CisvLy8gdGhpcyBpcyB0aGF0IGl0IHJldHVybnMgdGhlIGZpcnN0IGl0ZXJhdGlvbiBudW1iZXIgd2hlcmUgdGhlIHZhbHVlIGlzIG5vdCBpbgorLy8vIHRoZSBjb25kaXRpb24sIHRodXMgY29tcHV0aW5nIHRoZSBleGl0IGNvdW50LiBJZiB0aGUgaXRlcmF0aW9uIGNvdW50IGNhbid0CisvLy8gYmUgY29tcHV0ZWQsIGFuIGluc3RhbmNlIG9mIFNDRVZDb3VsZE5vdENvbXB1dGUgaXMgcmV0dXJuZWQuCitjb25zdCBTQ0VWICpTQ0VWQWRkUmVjRXhwcjo6Z2V0TnVtSXRlcmF0aW9uc0luUmFuZ2UoQ29uc3RhbnRSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFKSBjb25zdCB7CisgIGlmIChSYW5nZS5pc0Z1bGxTZXQoKSkgIC8vIEluZmluaXRlIGxvb3AuCisgICAgcmV0dXJuIFNFLmdldENvdWxkTm90Q29tcHV0ZSgpOworCisgIC8vIElmIHRoZSBzdGFydCBpcyBhIG5vbi16ZXJvIGNvbnN0YW50LCBzaGlmdCB0aGUgcmFuZ2UgdG8gc2ltcGxpZnkgdGhpbmdzLgorICBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpTQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oZ2V0U3RhcnQoKSkpCisgICAgaWYgKCFTQy0+Z2V0VmFsdWUoKS0+aXNaZXJvKCkpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gT3BlcmFuZHMob3BfYmVnaW4oKSwgb3BfZW5kKCkpOworICAgICAgT3BlcmFuZHNbMF0gPSBTRS5nZXRDb25zdGFudChTQy0+Z2V0VHlwZSgpLCAwKTsKKyAgICAgIGNvbnN0IFNDRVYgKlNoaWZ0ZWQgPSBTRS5nZXRBZGRSZWNFeHByKE9wZXJhbmRzLCBnZXRMb29wKCkpOworICAgICAgaWYgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpTaGlmdGVkQWRkUmVjID0KKyAgICAgICAgICAgIGR5bl9jYXN0PFNDRVZBZGRSZWNFeHByPihTaGlmdGVkKSkKKyAgICAgICAgcmV0dXJuIFNoaWZ0ZWRBZGRSZWMtPmdldE51bUl0ZXJhdGlvbnNJblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2Uuc3VidHJhY3QoU0MtPmdldFZhbHVlKCktPmdldFZhbHVlKCkpLCBTRSk7CisgICAgICAvLyBUaGlzIGlzIHN0cmFuZ2UgYW5kIHNob3VsZG4ndCBoYXBwZW4uCisgICAgICByZXR1cm4gU0UuZ2V0Q291bGROb3RDb21wdXRlKCk7CisgICAgfQorCisgIC8vIFRoZSBvbmx5IHRpbWUgd2UgY2FuIHNvbHZlIHRoaXMgaXMgd2hlbiB3ZSBoYXZlIGFsbCBjb25zdGFudCBpbmRpY2VzLgorICAvLyBPdGhlcndpc2UsIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG92ZXJmbG93IGNvbmRpdGlvbnMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoIWlzYTxTQ0VWQ29uc3RhbnQ+KGdldE9wZXJhbmQoaSkpKQorICAgICAgcmV0dXJuIFNFLmdldENvdWxkTm90Q29tcHV0ZSgpOworCisKKyAgLy8gT2theSBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBhbGwgZWxlbWVudHMgb2YgdGhlIGNocmVjIGFyZSBjb25zdGFudHMgYW5kCisgIC8vIHRoYXQgdGhlIHN0YXJ0IGVsZW1lbnQgaXMgemVyby4KKworICAvLyBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlIHJhbmdlIGNvbnRhaW5zIHplcm8uICBJZiBub3QsIHRoZSBmaXJzdAorICAvLyBpdGVyYXRpb24gZXhpdHMuCisgIHVuc2lnbmVkIEJpdFdpZHRoID0gU0UuZ2V0VHlwZVNpemVJbkJpdHMoZ2V0VHlwZSgpKTsKKyAgaWYgKCFSYW5nZS5jb250YWlucyhBUEludChCaXRXaWR0aCwgMCkpKQorICAgIHJldHVybiBTRS5nZXRDb25zdGFudChnZXRUeXBlKCksIDApOworCisgIGlmIChpc0FmZmluZSgpKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhbiBhZmZpbmUgZXhwcmVzc2lvbiB0aGVuIHdlIGhhdmUgdGhpcyBzaXR1YXRpb246CisgICAgLy8gICBTb2x2ZSB7MCwrLEF9IGluIFJhbmdlICA9PT0gIEF4IGluIFJhbmdlCisKKyAgICAvLyBXZSBrbm93IHRoYXQgemVybyBpcyBpbiB0aGUgcmFuZ2UuICBJZiBBIGlzIHBvc2l0aXZlIHRoZW4gd2Uga25vdyB0aGF0CisgICAgLy8gdGhlIHVwcGVyIHZhbHVlIG9mIHRoZSByYW5nZSBtdXN0IGJlIHRoZSBmaXJzdCBwb3NzaWJsZSBleGl0IHZhbHVlLgorICAgIC8vIElmIEEgaXMgbmVnYXRpdmUgdGhlbiB0aGUgbG93ZXIgb2YgdGhlIHJhbmdlIGlzIHRoZSBsYXN0IHBvc3NpYmxlIGxvb3AKKyAgICAvLyB2YWx1ZS4gIEFsc28gbm90ZSB0aGF0IHdlIGFscmVhZHkgY2hlY2tlZCBmb3IgYSBmdWxsIHJhbmdlLgorICAgIEFQSW50IE9uZShCaXRXaWR0aCwxKTsKKyAgICBBUEludCBBICAgICA9IGNhc3Q8U0NFVkNvbnN0YW50PihnZXRPcGVyYW5kKDEpKS0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgICBBUEludCBFbmQgPSBBLnNnZShPbmUpID8gKFJhbmdlLmdldFVwcGVyKCkgLSBPbmUpIDogUmFuZ2UuZ2V0TG93ZXIoKTsKKworICAgIC8vIFRoZSBleGl0IHZhbHVlIHNob3VsZCBiZSAoRW5kK0EpL0EuCisgICAgQVBJbnQgRXhpdFZhbCA9IChFbmQgKyBBKS51ZGl2KEEpOworICAgIENvbnN0YW50SW50ICpFeGl0VmFsdWUgPSBDb25zdGFudEludDo6Z2V0KFNFLmdldENvbnRleHQoKSwgRXhpdFZhbCk7CisKKyAgICAvLyBFdmFsdWF0ZSBhdCB0aGUgZXhpdCB2YWx1ZS4gIElmIHdlIHJlYWxseSBkaWQgZmFsbCBvdXQgb2YgdGhlIHZhbGlkCisgICAgLy8gcmFuZ2UsIHRoZW4gd2UgY29tcHV0ZWQgb3VyIHRyaXAgY291bnQsIG90aGVyd2lzZSB3cmFwIGFyb3VuZCBvciBvdGhlcgorICAgIC8vIHRoaW5ncyBtdXN0IGhhdmUgaGFwcGVuZWQuCisgICAgQ29uc3RhbnRJbnQgKlZhbCA9IEV2YWx1YXRlQ29uc3RhbnRDaHJlY0F0Q29uc3RhbnQodGhpcywgRXhpdFZhbHVlLCBTRSk7CisgICAgaWYgKFJhbmdlLmNvbnRhaW5zKFZhbC0+Z2V0VmFsdWUoKSkpCisgICAgICByZXR1cm4gU0UuZ2V0Q291bGROb3RDb21wdXRlKCk7ICAvLyBTb21ldGhpbmcgc3RyYW5nZSBoYXBwZW5lZAorCisgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHByZXZpb3VzIHZhbHVlIGlzIGluIHRoZSByYW5nZS4gIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2suCisgICAgYXNzZXJ0KFJhbmdlLmNvbnRhaW5zKAorICAgICAgICAgICBFdmFsdWF0ZUNvbnN0YW50Q2hyZWNBdENvbnN0YW50KHRoaXMsCisgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoU0UuZ2V0Q29udGV4dCgpLCBFeGl0VmFsIC0gT25lKSwgU0UpLT5nZXRWYWx1ZSgpKSAmJgorICAgICAgICAgICAiTGluZWFyIHNjZXYgY29tcHV0YXRpb24gaXMgb2ZmIGluIGEgYmFkIHdheSEiKTsKKyAgICByZXR1cm4gU0UuZ2V0Q29uc3RhbnQoRXhpdFZhbHVlKTsKKyAgfSBlbHNlIGlmIChpc1F1YWRyYXRpYygpKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhIHF1YWRyYXRpYyAoMy10ZXJtKSBBZGRSZWMge0wsKyxNLCssTn0sIGZpbmQgdGhlIHJvb3RzIG9mIHRoZQorICAgIC8vIHF1YWRyYXRpYyBlcXVhdGlvbiB0byBzb2x2ZSBpdC4gIFRvIGRvIHRoaXMsIHdlIG11c3QgZnJhbWUgb3VyIHByb2JsZW0gaW4KKyAgICAvLyB0ZXJtcyBvZiBmaWd1cmluZyBvdXQgd2hlbiB6ZXJvIGlzIGNyb3NzZWQsIGluc3RlYWQgb2Ygd2hlbgorICAgIC8vIFJhbmdlLmdldFVwcGVyKCkgaXMgY3Jvc3NlZC4KKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE5ld09wcyhvcF9iZWdpbigpLCBvcF9lbmQoKSk7CisgICAgTmV3T3BzWzBdID0gU0UuZ2V0TmVnYXRpdmVTQ0VWKFNFLmdldENvbnN0YW50KFJhbmdlLmdldFVwcGVyKCkpKTsKKyAgICBjb25zdCBTQ0VWICpOZXdBZGRSZWMgPSBTRS5nZXRBZGRSZWNFeHByKE5ld09wcywgZ2V0TG9vcCgpKTsKKworICAgIC8vIE5leHQsIHNvbHZlIHRoZSBjb25zdHJ1Y3RlZCBhZGRyZWMKKyAgICBzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLGNvbnN0IFNDRVYgKj4gUm9vdHMgPQorICAgICAgU29sdmVRdWFkcmF0aWNFcXVhdGlvbihjYXN0PFNDRVZBZGRSZWNFeHByPihOZXdBZGRSZWMpLCBTRSk7CisgICAgY29uc3QgU0NFVkNvbnN0YW50ICpSMSA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oUm9vdHMuZmlyc3QpOworICAgIGNvbnN0IFNDRVZDb25zdGFudCAqUjIgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KFJvb3RzLnNlY29uZCk7CisgICAgaWYgKFIxKSB7CisgICAgICAvLyBQaWNrIHRoZSBzbWFsbGVzdCBwb3NpdGl2ZSByb290IHZhbHVlLgorICAgICAgaWYgKENvbnN0YW50SW50ICpDQiA9CisgICAgICAgICAgZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENvbnN0YW50RXhwcjo6Z2V0SUNtcChJQ21wSW5zdDo6SUNNUF9VTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUjEtPmdldFZhbHVlKCksIFIyLT5nZXRWYWx1ZSgpKSkpIHsKKyAgICAgICAgaWYgKENCLT5nZXRaRXh0VmFsdWUoKSA9PSBmYWxzZSkKKyAgICAgICAgICBzdGQ6OnN3YXAoUjEsIFIyKTsgICAvLyBSMSBpcyB0aGUgbWluaW11bSByb290IG5vdy4KKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJvb3QgaXMgbm90IG9mZiBieSBvbmUuICBUaGUgcmV0dXJuZWQgaXRlcmF0aW9uIHNob3VsZAorICAgICAgICAvLyBub3QgYmUgaW4gdGhlIHJhbmdlLCBidXQgdGhlIHByZXZpb3VzIG9uZSBzaG91bGQgYmUuICBXaGVuIHNvbHZpbmcKKyAgICAgICAgLy8gZm9yICJYKlggPCA1IiwgZm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgcmV0dXJuIGEgcm9vdCBvZiAyLgorICAgICAgICBDb25zdGFudEludCAqUjFWYWwgPSBFdmFsdWF0ZUNvbnN0YW50Q2hyZWNBdENvbnN0YW50KHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUjEtPmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UpOworICAgICAgICBpZiAoUmFuZ2UuY29udGFpbnMoUjFWYWwtPmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgLy8gVGhlIG5leHQgaXRlcmF0aW9uIG11c3QgYmUgb3V0IG9mIHRoZSByYW5nZS4uLgorICAgICAgICAgIENvbnN0YW50SW50ICpOZXh0VmFsID0KKyAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFNFLmdldENvbnRleHQoKSwgUjEtPmdldFZhbHVlKCktPmdldFZhbHVlKCkrMSk7CisKKyAgICAgICAgICBSMVZhbCA9IEV2YWx1YXRlQ29uc3RhbnRDaHJlY0F0Q29uc3RhbnQodGhpcywgTmV4dFZhbCwgU0UpOworICAgICAgICAgIGlmICghUmFuZ2UuY29udGFpbnMoUjFWYWwtPmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIFNFLmdldENvbnN0YW50KE5leHRWYWwpOworICAgICAgICAgIHJldHVybiBTRS5nZXRDb3VsZE5vdENvbXB1dGUoKTsgIC8vIFNvbWV0aGluZyBzdHJhbmdlIGhhcHBlbmVkCisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBSMSB3YXMgbm90IGluIHRoZSByYW5nZSwgdGhlbiBpdCBpcyBhIGdvb2QgcmV0dXJuIHZhbHVlLiAgTWFrZQorICAgICAgICAvLyBzdXJlIHRoYXQgUjEtMSBXQVMgaW4gdGhlIHJhbmdlIHRob3VnaCwganVzdCBpbiBjYXNlLgorICAgICAgICBDb25zdGFudEludCAqTmV4dFZhbCA9CisgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFNFLmdldENvbnRleHQoKSwgUjEtPmdldFZhbHVlKCktPmdldFZhbHVlKCktMSk7CisgICAgICAgIFIxVmFsID0gRXZhbHVhdGVDb25zdGFudENocmVjQXRDb25zdGFudCh0aGlzLCBOZXh0VmFsLCBTRSk7CisgICAgICAgIGlmIChSYW5nZS5jb250YWlucyhSMVZhbC0+Z2V0VmFsdWUoKSkpCisgICAgICAgICAgcmV0dXJuIFIxOworICAgICAgICByZXR1cm4gU0UuZ2V0Q291bGROb3RDb21wdXRlKCk7ICAvLyBTb21ldGhpbmcgc3RyYW5nZSBoYXBwZW5lZAorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBTRS5nZXRDb3VsZE5vdENvbXB1dGUoKTsKK30KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICBTQ0VWQ2FsbGJhY2tWSCBDbGFzcyBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBTY2FsYXJFdm9sdXRpb246OlNDRVZDYWxsYmFja1ZIOjpkZWxldGVkKCkgeworICBhc3NlcnQoU0UgJiYgIlNDRVZDYWxsYmFja1ZIIGNhbGxlZCB3aXRoIGEgbnVsbCBTY2FsYXJFdm9sdXRpb24hIik7CisgIGlmIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KGdldFZhbFB0cigpKSkKKyAgICBTRS0+Q29uc3RhbnRFdm9sdXRpb25Mb29wRXhpdFZhbHVlLmVyYXNlKFBOKTsKKyAgU0UtPlNjYWxhcnMuZXJhc2UoZ2V0VmFsUHRyKCkpOworICAvLyB0aGlzIG5vdyBkYW5nbGVzIQorfQorCit2b2lkIFNjYWxhckV2b2x1dGlvbjo6U0NFVkNhbGxiYWNrVkg6OmFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKlYpIHsKKyAgYXNzZXJ0KFNFICYmICJTQ0VWQ2FsbGJhY2tWSCBjYWxsZWQgd2l0aCBhIG51bGwgU2NhbGFyRXZvbHV0aW9uISIpOworCisgIC8vIEZvcmdldCBhbGwgdGhlIGV4cHJlc3Npb25zIGFzc29jaWF0ZWQgd2l0aCB1c2VycyBvZiB0aGUgb2xkIHZhbHVlLAorICAvLyBzbyB0aGF0IGZ1dHVyZSBxdWVyaWVzIHdpbGwgcmVjb21wdXRlIHRoZSBleHByZXNzaW9ucyB1c2luZyB0aGUgbmV3CisgIC8vIHZhbHVlLgorICBWYWx1ZSAqT2xkID0gZ2V0VmFsUHRyKCk7CisgIFNtYWxsVmVjdG9yPFVzZXIgKiwgMTY+IFdvcmtsaXN0OworICBTbWFsbFB0clNldDxVc2VyICosIDg+IFZpc2l0ZWQ7CisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IE9sZC0+dXNlX2JlZ2luKCksIFVFID0gT2xkLT51c2VfZW5kKCk7CisgICAgICAgVUkgIT0gVUU7ICsrVUkpCisgICAgV29ya2xpc3QucHVzaF9iYWNrKCpVSSk7CisgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgIFVzZXIgKlUgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAvLyBEZWxldGluZyB0aGUgT2xkIHZhbHVlIHdpbGwgY2F1c2UgdGhpcyB0byBkYW5nbGUuIFBvc3Rwb25lCisgICAgLy8gdGhhdCB1bnRpbCBldmVyeXRoaW5nIGVsc2UgaXMgZG9uZS4KKyAgICBpZiAoVSA9PSBPbGQpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIVZpc2l0ZWQuaW5zZXJ0KFUpKQorICAgICAgY29udGludWU7CisgICAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVSkpCisgICAgICBTRS0+Q29uc3RhbnRFdm9sdXRpb25Mb29wRXhpdFZhbHVlLmVyYXNlKFBOKTsKKyAgICBTRS0+U2NhbGFycy5lcmFzZShVKTsKKyAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBVLT51c2VfYmVnaW4oKSwgVUUgPSBVLT51c2VfZW5kKCk7CisgICAgICAgICBVSSAhPSBVRTsgKytVSSkKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjaygqVUkpOworICB9CisgIC8vIERlbGV0ZSB0aGUgT2xkIHZhbHVlLgorICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihPbGQpKQorICAgIFNFLT5Db25zdGFudEV2b2x1dGlvbkxvb3BFeGl0VmFsdWUuZXJhc2UoUE4pOworICBTRS0+U2NhbGFycy5lcmFzZShPbGQpOworICAvLyB0aGlzIG5vdyBkYW5nbGVzIQorfQorCitTY2FsYXJFdm9sdXRpb246OlNDRVZDYWxsYmFja1ZIOjpTQ0VWQ2FsbGJhY2tWSChWYWx1ZSAqViwgU2NhbGFyRXZvbHV0aW9uICpzZSkKKyAgOiBDYWxsYmFja1ZIKFYpLCBTRShzZSkge30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiBDbGFzcyBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworU2NhbGFyRXZvbHV0aW9uOjpTY2FsYXJFdm9sdXRpb24oKQorICA6IEZ1bmN0aW9uUGFzcyhJRCksIEZpcnN0VW5rbm93bigwKSB7Cit9CisKK2Jvb2wgU2NhbGFyRXZvbHV0aW9uOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgIHRoaXMtPkYgPSAmRjsKKyAgTEkgPSAmZ2V0QW5hbHlzaXM8TG9vcEluZm8+KCk7CisgIFREID0gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxUYXJnZXREYXRhPigpOworICBEVCA9ICZnZXRBbmFseXNpczxEb21pbmF0b3JUcmVlPigpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2NhbGFyRXZvbHV0aW9uOjpyZWxlYXNlTWVtb3J5KCkgeworICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBTQ0VWVW5rbm93biBpbnN0YW5jZXMgYW5kIGNhbGwgdGhlaXIKKyAgLy8gZGVzdHJ1Y3RvcnMsIHNvIHRoYXQgdGhleSByZWxlYXNlIHRoZWlyIHJlZmVyZW5jZXMgdG8gdGhlaXIgdmFsdWVzLgorICBmb3IgKFNDRVZVbmtub3duICpVID0gRmlyc3RVbmtub3duOyBVOyBVID0gVS0+TmV4dCkKKyAgICBVLT5+U0NFVlVua25vd24oKTsKKyAgRmlyc3RVbmtub3duID0gMDsKKworICBTY2FsYXJzLmNsZWFyKCk7CisgIEJhY2tlZGdlVGFrZW5Db3VudHMuY2xlYXIoKTsKKyAgQ29uc3RhbnRFdm9sdXRpb25Mb29wRXhpdFZhbHVlLmNsZWFyKCk7CisgIFZhbHVlc0F0U2NvcGVzLmNsZWFyKCk7CisgIFVuaXF1ZVNDRVZzLmNsZWFyKCk7CisgIFNDRVZBbGxvY2F0b3IuUmVzZXQoKTsKK30KKwordm9pZCBTY2FsYXJFdm9sdXRpb246OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIEFVLmFkZFJlcXVpcmVkVHJhbnNpdGl2ZTxMb29wSW5mbz4oKTsKKyAgQVUuYWRkUmVxdWlyZWRUcmFuc2l0aXZlPERvbWluYXRvclRyZWU+KCk7Cit9CisKK2Jvb2wgU2NhbGFyRXZvbHV0aW9uOjpoYXNMb29wSW52YXJpYW50QmFja2VkZ2VUYWtlbkNvdW50KGNvbnN0IExvb3AgKkwpIHsKKyAgcmV0dXJuICFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oZ2V0QmFja2VkZ2VUYWtlbkNvdW50KEwpKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRMb29wSW5mbyhyYXdfb3N0cmVhbSAmT1MsIFNjYWxhckV2b2x1dGlvbiAqU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwpIHsKKyAgLy8gUHJpbnQgYWxsIGlubmVyIGxvb3BzIGZpcnN0CisgIGZvciAoTG9vcDo6aXRlcmF0b3IgSSA9IEwtPmJlZ2luKCksIEUgPSBMLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgUHJpbnRMb29wSW5mbyhPUywgU0UsICpJKTsKKworICBPUyA8PCAiTG9vcCAiOworICBXcml0ZUFzT3BlcmFuZChPUywgTC0+Z2V0SGVhZGVyKCksIC8qUHJpbnRUeXBlPSovZmFsc2UpOworICBPUyA8PCAiOiAiOworCisgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sgKiwgOD4gRXhpdEJsb2NrczsKKyAgTC0+Z2V0RXhpdEJsb2NrcyhFeGl0QmxvY2tzKTsKKyAgaWYgKEV4aXRCbG9ja3Muc2l6ZSgpICE9IDEpCisgICAgT1MgPDwgIjxtdWx0aXBsZSBleGl0cz4gIjsKKworICBpZiAoU0UtPmhhc0xvb3BJbnZhcmlhbnRCYWNrZWRnZVRha2VuQ291bnQoTCkpIHsKKyAgICBPUyA8PCAiYmFja2VkZ2UtdGFrZW4gY291bnQgaXMgIiA8PCAqU0UtPmdldEJhY2tlZGdlVGFrZW5Db3VudChMKTsKKyAgfSBlbHNlIHsKKyAgICBPUyA8PCAiVW5wcmVkaWN0YWJsZSBiYWNrZWRnZS10YWtlbiBjb3VudC4gIjsKKyAgfQorCisgIE9TIDw8ICJcbiIKKyAgICAgICAgIkxvb3AgIjsKKyAgV3JpdGVBc09wZXJhbmQoT1MsIEwtPmdldEhlYWRlcigpLCAvKlByaW50VHlwZT0qL2ZhbHNlKTsKKyAgT1MgPDwgIjogIjsKKworICBpZiAoIWlzYTxTQ0VWQ291bGROb3RDb21wdXRlPihTRS0+Z2V0TWF4QmFja2VkZ2VUYWtlbkNvdW50KEwpKSkgeworICAgIE9TIDw8ICJtYXggYmFja2VkZ2UtdGFrZW4gY291bnQgaXMgIiA8PCAqU0UtPmdldE1heEJhY2tlZGdlVGFrZW5Db3VudChMKTsKKyAgfSBlbHNlIHsKKyAgICBPUyA8PCAiVW5wcmVkaWN0YWJsZSBtYXggYmFja2VkZ2UtdGFrZW4gY291bnQuICI7CisgIH0KKworICBPUyA8PCAiXG4iOworfQorCit2b2lkIFNjYWxhckV2b2x1dGlvbjo6cHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKikgY29uc3QgeworICAvLyBTY2FsYXJFdm9sdXRpb24ncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHJpbnQgbWV0aG9kIGlzIHRvIHByaW50CisgIC8vIG91dCBTQ0VWIHZhbHVlcyBvZiBhbGwgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGludGVyZXN0aW5nLiBEb2luZworICAvLyB0aGlzIHBvdGVudGlhbGx5IGNhdXNlcyBpdCB0byBjcmVhdGUgbmV3IFNDRVYgb2JqZWN0cyB0aG91Z2gsCisgIC8vIHdoaWNoIHRlY2huaWNhbGx5IGNvbmZsaWN0cyB3aXRoIHRoZSBjb25zdCBxdWFsaWZpZXIuIFRoaXMgaXNuJ3QKKyAgLy8gb2JzZXJ2YWJsZSBmcm9tIG91dHNpZGUgdGhlIGNsYXNzIHRob3VnaCwgc28gY2FzdGluZyBhd2F5IHRoZQorICAvLyBjb25zdCBpc24ndCBkYW5nZXJvdXMuCisgIFNjYWxhckV2b2x1dGlvbiAmU0UgPSAqY29uc3RfY2FzdDxTY2FsYXJFdm9sdXRpb24gKj4odGhpcyk7CisKKyAgT1MgPDwgIkNsYXNzaWZ5aW5nIGV4cHJlc3Npb25zIGZvcjogIjsKKyAgV3JpdGVBc09wZXJhbmQoT1MsIEYsIC8qUHJpbnRUeXBlPSovZmFsc2UpOworICBPUyA8PCAiXG4iOworICBmb3IgKGluc3RfaXRlcmF0b3IgSSA9IGluc3RfYmVnaW4oRiksIEUgPSBpbnN0X2VuZChGKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKGlzU0NFVmFibGUoSS0+Z2V0VHlwZSgpKSAmJiAhaXNhPENtcEluc3Q+KCpJKSkgeworICAgICAgT1MgPDwgKkkgPDwgJ1xuJzsKKyAgICAgIE9TIDw8ICIgIC0tPiAgIjsKKyAgICAgIGNvbnN0IFNDRVYgKlNWID0gU0UuZ2V0U0NFVigmKkkpOworICAgICAgU1YtPnByaW50KE9TKTsKKworICAgICAgY29uc3QgTG9vcCAqTCA9IExJLT5nZXRMb29wRm9yKCgqSSkuZ2V0UGFyZW50KCkpOworCisgICAgICBjb25zdCBTQ0VWICpBdFVzZSA9IFNFLmdldFNDRVZBdFNjb3BlKFNWLCBMKTsKKyAgICAgIGlmIChBdFVzZSAhPSBTVikgeworICAgICAgICBPUyA8PCAiICAtLT4gICI7CisgICAgICAgIEF0VXNlLT5wcmludChPUyk7CisgICAgICB9CisKKyAgICAgIGlmIChMKSB7CisgICAgICAgIE9TIDw8ICJcdFx0IiAiRXhpdHM6ICI7CisgICAgICAgIGNvbnN0IFNDRVYgKkV4aXRWYWx1ZSA9IFNFLmdldFNDRVZBdFNjb3BlKFNWLCBMLT5nZXRQYXJlbnRMb29wKCkpOworICAgICAgICBpZiAoIUV4aXRWYWx1ZS0+aXNMb29wSW52YXJpYW50KEwpKSB7CisgICAgICAgICAgT1MgPDwgIjw8VW5rbm93bj4+IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBPUyA8PCAqRXhpdFZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIE9TIDw8ICJcbiI7CisgICAgfQorCisgIE9TIDw8ICJEZXRlcm1pbmluZyBsb29wIGV4ZWN1dGlvbiBjb3VudHMgZm9yOiAiOworICBXcml0ZUFzT3BlcmFuZChPUywgRiwgLypQcmludFR5cGU9Ki9mYWxzZSk7CisgIE9TIDw8ICJcbiI7CisgIGZvciAoTG9vcEluZm86Oml0ZXJhdG9yIEkgPSBMSS0+YmVnaW4oKSwgRSA9IExJLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgUHJpbnRMb29wSW5mbyhPUywgJlNFLCAqSSk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHBhbmRlci5jcHAgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwYW5kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzEyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwYW5kZXIuY3BwCkBAIC0wLDAgKzEsMTM1OSBAQAorLy89PT0tIFNjYWxhckV2b2x1dGlvbkV4cGFuZGVyLmNwcCAtIFNjYWxhciBFdm9sdXRpb24gQW5hbHlzaXMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzY2FsYXIgZXZvbHV0aW9uIGV4cGFuZGVyLAorLy8gd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc2NhbGFyIGV2b2x1dGlvbgorLy8gZXhwcmVzc2lvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHBhbmRlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBSZXVzZU9yQ3JlYXRlQ2FzdCAtIEFycmFuZ2UgZm9yIHRoZXJlIHRvIGJlIGEgY2FzdCBvZiBWIHRvIFR5IGF0IElQLAorLy8vIHJldXNpbmcgYW4gZXhpc3RpbmcgY2FzdCBpZiBhIHN1aXRhYmxlIG9uZSBleGlzdHMsIG1vdmluZyBhbiBleGlzdGluZworLy8vIGNhc3QgaWYgYSBzdWl0YWJsZSBvbmUgZXhpc3RzIGJ1dCBpc24ndCBpbiB0aGUgcmlnaHQgcGxhY2UsIG9yCisvLy8gY3JlYXRpbmcgYSBuZXcgb25lLgorVmFsdWUgKlNDRVZFeHBhbmRlcjo6UmV1c2VPckNyZWF0ZUNhc3QoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCkgeworICAvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGNhc3QhCisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IFYtPnVzZV9iZWdpbigpLCBFID0gVi0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IEU7ICsrVUkpIHsKKyAgICBVc2VyICpVID0gKlVJOworICAgIGlmIChVLT5nZXRUeXBlKCkgPT0gVHkpCisgICAgICBpZiAoQ2FzdEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FzdEluc3Q+KFUpKQorICAgICAgICBpZiAoQ0ktPmdldE9wY29kZSgpID09IE9wKSB7CisgICAgICAgICAgLy8gSWYgdGhlIGNhc3QgaXNuJ3Qgd2hlcmUgd2Ugd2FudCBpdCwgZml4IGl0LgorICAgICAgICAgIGlmIChCYXNpY0Jsb2NrOjppdGVyYXRvcihDSSkgIT0gSVApIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjYXN0LCBhbmQgbGVhdmUgdGhlIG9sZCBjYXN0IGluIHBsYWNlIGluIGNhc2UKKyAgICAgICAgICAgIC8vIGl0IGlzIGJlaW5nIHVzZWQgYXMgYW4gaW5zZXJ0IHBvaW50LiBDbGVhciBpdHMgb3BlcmFuZAorICAgICAgICAgICAgLy8gc28gdGhhdCBpdCBkb2Vzbid0IGhvbGQgYW55dGhpbmcgbGl2ZS4KKyAgICAgICAgICAgIEluc3RydWN0aW9uICpOZXdDSSA9IENhc3RJbnN0OjpDcmVhdGUoT3AsIFYsIFR5LCBJUCk7CisgICAgICAgICAgICBOZXdDSS0+dGFrZU5hbWUoQ0kpOworICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChOZXdDSSk7CisgICAgICAgICAgICBDSS0+c2V0T3BlcmFuZCgwLCBVbmRlZlZhbHVlOjpnZXQoVi0+Z2V0VHlwZSgpKSk7CisgICAgICAgICAgICByZW1lbWJlckluc3RydWN0aW9uKE5ld0NJKTsKKyAgICAgICAgICAgIHJldHVybiBOZXdDSTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVtZW1iZXJJbnN0cnVjdGlvbihDSSk7CisgICAgICAgICAgcmV0dXJuIENJOworICAgICAgICB9CisgIH0KKworICAvLyBDcmVhdGUgYSBuZXcgY2FzdC4KKyAgSW5zdHJ1Y3Rpb24gKkkgPSBDYXN0SW5zdDo6Q3JlYXRlKE9wLCBWLCBUeSwgSVApOworICByZW1lbWJlckluc3RydWN0aW9uKEkpOworICByZXR1cm4gSTsKK30KKworLy8vIEluc2VydE5vb3BDYXN0T2ZUbyAtIEluc2VydCBhIGNhc3Qgb2YgViB0byB0aGUgc3BlY2lmaWVkIHR5cGUsCisvLy8gd2hpY2ggbXVzdCBiZSBwb3NzaWJsZSB3aXRoIGEgbm9vcCBjYXN0LCBkb2luZyB3aGF0IHdlIGNhbiB0byBzaGFyZQorLy8vIHRoZSBjYXN0cy4KK1ZhbHVlICpTQ0VWRXhwYW5kZXI6Okluc2VydE5vb3BDYXN0T2ZUbyhWYWx1ZSAqViwgY29uc3QgVHlwZSAqVHkpIHsKKyAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgT3AgPSBDYXN0SW5zdDo6Z2V0Q2FzdE9wY29kZShWLCBmYWxzZSwgVHksIGZhbHNlKTsKKyAgYXNzZXJ0KChPcCA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCB8fAorICAgICAgICAgIE9wID09IEluc3RydWN0aW9uOjpQdHJUb0ludCB8fAorICAgICAgICAgIE9wID09IEluc3RydWN0aW9uOjpJbnRUb1B0cikgJiYKKyAgICAgICAgICJJbnNlcnROb29wQ2FzdE9mVG8gY2Fubm90IHBlcmZvcm0gbm9uLW5vb3AgY2FzdHMhIik7CisgIGFzc2VydChTRS5nZXRUeXBlU2l6ZUluQml0cyhWLT5nZXRUeXBlKCkpID09IFNFLmdldFR5cGVTaXplSW5CaXRzKFR5KSAmJgorICAgICAgICAgIkluc2VydE5vb3BDYXN0T2ZUbyBjYW5ub3QgY2hhbmdlIHNpemVzISIpOworCisgIC8vIFNob3J0LWNpcmN1aXQgdW5uZWNlc3NhcnkgYml0Y2FzdHMuCisgIGlmIChPcCA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCAmJiBWLT5nZXRUeXBlKCkgPT0gVHkpCisgICAgcmV0dXJuIFY7CisKKyAgLy8gU2hvcnQtY2lyY3VpdCB1bm5lY2Vzc2FyeSBpbnR0b3B0cjwtPnB0cnRvaW50IGNhc3RzLgorICBpZiAoKE9wID09IEluc3RydWN0aW9uOjpQdHJUb0ludCB8fCBPcCA9PSBJbnN0cnVjdGlvbjo6SW50VG9QdHIpICYmCisgICAgICBTRS5nZXRUeXBlU2l6ZUluQml0cyhUeSkgPT0gU0UuZ2V0VHlwZVNpemVJbkJpdHMoVi0+Z2V0VHlwZSgpKSkgeworICAgIGlmIChDYXN0SW5zdCAqQ0kgPSBkeW5fY2FzdDxDYXN0SW5zdD4oVikpCisgICAgICBpZiAoKENJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQgfHwKKyAgICAgICAgICAgQ0ktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJbnRUb1B0cikgJiYKKyAgICAgICAgICBTRS5nZXRUeXBlU2l6ZUluQml0cyhDSS0+Z2V0VHlwZSgpKSA9PQorICAgICAgICAgIFNFLmdldFR5cGVTaXplSW5CaXRzKENJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpKQorICAgICAgICByZXR1cm4gQ0ktPmdldE9wZXJhbmQoMCk7CisgICAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKQorICAgICAgaWYgKChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlB0clRvSW50IHx8CisgICAgICAgICAgIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW50VG9QdHIpICYmCisgICAgICAgICAgU0UuZ2V0VHlwZVNpemVJbkJpdHMoQ0UtPmdldFR5cGUoKSkgPT0KKyAgICAgICAgICBTRS5nZXRUeXBlU2l6ZUluQml0cyhDRS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKSkKKyAgICAgICAgcmV0dXJuIENFLT5nZXRPcGVyYW5kKDApOworICB9CisKKyAgLy8gRm9sZCBhIGNhc3Qgb2YgYSBjb25zdGFudC4KKyAgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldENhc3QoT3AsIEMsIFR5KTsKKworICAvLyBDYXN0IHRoZSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlbnRyeSBibG9jaywgYWZ0ZXIKKyAgLy8gYW55IGJpdGNhc3RzIG9mIG90aGVyIGFyZ3VtZW50cy4KKyAgaWYgKEFyZ3VtZW50ICpBID0gZHluX2Nhc3Q8QXJndW1lbnQ+KFYpKSB7CisgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVAgPSBBLT5nZXRQYXJlbnQoKS0+Z2V0RW50cnlCbG9jaygpLmJlZ2luKCk7CisgICAgd2hpbGUgKChpc2E8Qml0Q2FzdEluc3Q+KElQKSAmJgorICAgICAgICAgICAgaXNhPEFyZ3VtZW50PihjYXN0PEJpdENhc3RJbnN0PihJUCktPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgICAgICBjYXN0PEJpdENhc3RJbnN0PihJUCktPmdldE9wZXJhbmQoMCkgIT0gQSkpCisgICAgICArK0lQOworICAgIHJldHVybiBSZXVzZU9yQ3JlYXRlQ2FzdChBLCBUeSwgT3AsIElQKTsKKyAgfQorCisgIC8vIENhc3QgdGhlIGluc3RydWN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBpbnN0cnVjdGlvbi4KKyAgSW5zdHJ1Y3Rpb24gKkkgPSBjYXN0PEluc3RydWN0aW9uPihWKTsKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVAgPSBJOyArK0lQOworICB3aGlsZSAoaXNhPFBISU5vZGU+KElQKSkgKytJUDsKKyAgcmV0dXJuIFJldXNlT3JDcmVhdGVDYXN0KEksIFR5LCBPcCwgSVApOworfQorCisvLy8gSW5zZXJ0Qmlub3AgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBiaW5hcnkgb3BlcmF0b3IsIGRvaW5nIGEgc21hbGwgYW1vdW50CisvLy8gb2Ygd29yayB0byBhdm9pZCBpbnNlcnRpbmcgYW4gb2J2aW91c2x5IHJlZHVuZGFudCBvcGVyYXRpb24uCitWYWx1ZSAqU0NFVkV4cGFuZGVyOjpJbnNlcnRCaW5vcChJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgLy8gRm9sZCBhIGJpbm9wIHdpdGggY29uc3RhbnQgb3BlcmFuZHMuCisgIGlmIChDb25zdGFudCAqQ0xIUyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgIGlmIChDb25zdGFudCAqQ1JIUyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0KE9wY29kZSwgQ0xIUywgQ1JIUyk7CisKKyAgLy8gRG8gYSBxdWljayBzY2FuIHRvIHNlZSBpZiB3ZSBoYXZlIHRoaXMgYmlub3AgbmVhcmJ5LiAgSWYgc28sIHJldXNlIGl0LgorICB1bnNpZ25lZCBTY2FuTGltaXQgPSA2OworICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCbG9ja0JlZ2luID0gQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpLT5iZWdpbigpOworICAvLyBTY2FubmluZyBzdGFydHMgZnJvbSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGluc2VydGlvbiBwb2ludC4KKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVAgPSBCdWlsZGVyLkdldEluc2VydFBvaW50KCk7CisgIGlmIChJUCAhPSBCbG9ja0JlZ2luKSB7CisgICAgLS1JUDsKKyAgICBmb3IgKDsgU2NhbkxpbWl0OyAtLUlQLCAtLVNjYW5MaW1pdCkgeworICAgICAgLy8gRG9uJ3QgY291bnQgZGJnLnZhbHVlIGFnYWluc3QgdGhlIFNjYW5MaW1pdCwgdG8gYXZvaWQgcGVydHVyYmluZyB0aGUKKyAgICAgIC8vIGdlbmVyYXRlZCBjb2RlLgorICAgICAgaWYgKElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJUCkpCisgICAgICAgIFNjYW5MaW1pdCsrOworICAgICAgaWYgKElQLT5nZXRPcGNvZGUoKSA9PSAodW5zaWduZWQpT3Bjb2RlICYmIElQLT5nZXRPcGVyYW5kKDApID09IExIUyAmJgorICAgICAgICAgIElQLT5nZXRPcGVyYW5kKDEpID09IFJIUykKKyAgICAgICAgcmV0dXJuIElQOworICAgICAgaWYgKElQID09IEJsb2NrQmVnaW4pIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIGluc2VydGlvbiBwb2ludCBzbyB3ZSBjYW4gcmVzdG9yZSBpdCB3aGVuIHdlJ3JlIGRvbmUuCisgIEJhc2ljQmxvY2sgKlNhdmVJbnNlcnRCQiA9IEJ1aWxkZXIuR2V0SW5zZXJ0QmxvY2soKTsKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgU2F2ZUluc2VydFB0ID0gQnVpbGRlci5HZXRJbnNlcnRQb2ludCgpOworCisgIC8vIE1vdmUgdGhlIGluc2VydGlvbiBwb2ludCBvdXQgb2YgYXMgbWFueSBsb29wcyBhcyB3ZSBjYW4uCisgIHdoaWxlIChjb25zdCBMb29wICpMID0gU0UuTEktPmdldExvb3BGb3IoQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpKSkgeworICAgIGlmICghTC0+aXNMb29wSW52YXJpYW50KExIUykgfHwgIUwtPmlzTG9vcEludmFyaWFudChSSFMpKSBicmVhazsKKyAgICBCYXNpY0Jsb2NrICpQcmVoZWFkZXIgPSBMLT5nZXRMb29wUHJlaGVhZGVyKCk7CisgICAgaWYgKCFQcmVoZWFkZXIpIGJyZWFrOworCisgICAgLy8gT2ssIG1vdmUgdXAgYSBsZXZlbC4KKyAgICBCdWlsZGVyLlNldEluc2VydFBvaW50KFByZWhlYWRlciwgUHJlaGVhZGVyLT5nZXRUZXJtaW5hdG9yKCkpOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZW4ndCBmb3VuZCB0aGlzIGJpbm9wLCBpbnNlcnQgaXQuCisgIFZhbHVlICpCTyA9IEJ1aWxkZXIuQ3JlYXRlQmluT3AoT3Bjb2RlLCBMSFMsIFJIUyk7CisgIHJlbWVtYmVySW5zdHJ1Y3Rpb24oQk8pOworCisgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGluc2VydCBwb2ludC4KKyAgaWYgKFNhdmVJbnNlcnRCQikKKyAgICByZXN0b3JlSW5zZXJ0UG9pbnQoU2F2ZUluc2VydEJCLCBTYXZlSW5zZXJ0UHQpOworCisgIHJldHVybiBCTzsKK30KKworLy8vIEZhY3Rvck91dENvbnN0YW50IC0gVGVzdCBpZiBTIGlzIGRpdmlzaWJsZSBieSBGYWN0b3IsIHVzaW5nIHNpZ25lZAorLy8vIGRpdmlzaW9uLiBJZiBzbywgdXBkYXRlIFMgd2l0aCBGYWN0b3IgZGl2aWRlZCBvdXQgYW5kIHJldHVybiB0cnVlLgorLy8vIFMgbmVlZCBub3QgYmUgZXZlbmx5IGRpdmlzaWJsZSBpZiBhIHJlYXNvbmFibGUgcmVtYWluZGVyIGNhbiBiZQorLy8vIGNvbXB1dGVkLgorLy8vIFRPRE86IFdoZW4gU2NhbGFyRXZvbHV0aW9uIGdldHMgYSBTQ0VWU0RpdkV4cHIsIHRoaXMgY2FuIGJlIG1hZGUKKy8vLyB1bm5lY2Vzc2FyeTsgaW4gaXRzIHBsYWNlLCBqdXN0IHNpZ25lZC1kaXZpZGUgT3BzW2ldIGJ5IHRoZSBzY2FsZSBhbmQKKy8vLyBjaGVjayB0byBzZWUgaWYgdGhlIGRpdmlkZSB3YXMgZm9sZGVkLgorc3RhdGljIGJvb2wgRmFjdG9yT3V0Q29uc3RhbnQoY29uc3QgU0NFViAqJlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComUmVtYWluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIC8vIEV2ZXJ5dGhpbmcgaXMgZGl2aXNpYmxlIGJ5IG9uZS4KKyAgaWYgKEZhY3Rvci0+aXNPbmUoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyB4L3ggPT0gMS4KKyAgaWYgKFMgPT0gRmFjdG9yKSB7CisgICAgUyA9IFNFLmdldENvbnN0YW50KFMtPmdldFR5cGUoKSwgMSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBGb3IgYSBDb25zdGFudCwgY2hlY2sgZm9yIGEgbXVsdGlwbGUgb2YgdGhlIGdpdmVuIGZhY3Rvci4KKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oUykpIHsKKyAgICAvLyAwL3ggPT0gMC4KKyAgICBpZiAoQy0+aXNaZXJvKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBDaGVjayBmb3IgZGl2aXNpYmlsaXR5LgorICAgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKkZDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihGYWN0b3IpKSB7CisgICAgICBDb25zdGFudEludCAqQ0kgPQorICAgICAgICBDb25zdGFudEludDo6Z2V0KFNFLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLnNkaXYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKSkpOworICAgICAgLy8gSWYgdGhlIHF1b3RpZW50IGlzIHplcm8gYW5kIHRoZSByZW1haW5kZXIgaXMgbm9uLXplcm8sIHJlamVjdAorICAgICAgLy8gdGhlIHZhbHVlIGF0IHRoaXMgc2NhbGUuIEl0IHdpbGwgYmUgY29uc2lkZXJlZCBmb3Igc3Vic2VxdWVudAorICAgICAgLy8gc21hbGxlciBzY2FsZXMuCisgICAgICBpZiAoIUNJLT5pc1plcm8oKSkgeworICAgICAgICBjb25zdCBTQ0VWICpEaXYgPSBTRS5nZXRDb25zdGFudChDSSk7CisgICAgICAgIFMgPSBEaXY7CisgICAgICAgIFJlbWFpbmRlciA9CisgICAgICAgICAgU0UuZ2V0QWRkRXhwcihSZW1haW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBTRS5nZXRDb25zdGFudChDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLnNyZW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBJbiBhIE11bCwgY2hlY2sgaWYgdGhlcmUgaXMgYSBjb25zdGFudCBvcGVyYW5kIHdoaWNoIGlzIGEgbXVsdGlwbGUKKyAgLy8gb2YgdGhlIGdpdmVuIGZhY3Rvci4KKyAgaWYgKGNvbnN0IFNDRVZNdWxFeHByICpNID0gZHluX2Nhc3Q8U0NFVk11bEV4cHI+KFMpKSB7CisgICAgaWYgKFREKSB7CisgICAgICAvLyBXaXRoIFRhcmdldERhdGEsIHRoZSBzaXplIGlzIGtub3duLiBDaGVjayBpZiB0aGVyZSBpcyBhIGNvbnN0YW50CisgICAgICAvLyBvcGVyYW5kIHdoaWNoIGlzIGEgbXVsdGlwbGUgb2YgdGhlIGdpdmVuIGZhY3Rvci4gSWYgc28sIHdlIGNhbgorICAgICAgLy8gZmFjdG9yIGl0LgorICAgICAgY29uc3QgU0NFVkNvbnN0YW50ICpGQyA9IGNhc3Q8U0NFVkNvbnN0YW50PihGYWN0b3IpOworICAgICAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oTS0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICAgIGlmICghQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKS5zcmVtKEZDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gTmV3TXVsT3BzKE0tPm9wX2JlZ2luKCksIE0tPm9wX2VuZCgpKTsKKyAgICAgICAgICBOZXdNdWxPcHNbMF0gPQorICAgICAgICAgICAgU0UuZ2V0Q29uc3RhbnQoQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKS5zZGl2KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkMtPmdldFZhbHVlKCktPmdldFZhbHVlKCkpKTsKKyAgICAgICAgICBTID0gU0UuZ2V0TXVsRXhwcihOZXdNdWxPcHMpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdpdGhvdXQgVGFyZ2V0RGF0YSwgY2hlY2sgaWYgRmFjdG9yIGNhbiBiZSBmYWN0b3JlZCBvdXQgb2YgYW55IG9mIHRoZQorICAgICAgLy8gTXVsJ3Mgb3BlcmFuZHMuIElmIHNvLCB3ZSBjYW4ganVzdCByZW1vdmUgaXQuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgY29uc3QgU0NFViAqU09wID0gTS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgY29uc3QgU0NFViAqUmVtYWluZGVyID0gU0UuZ2V0Q29uc3RhbnQoU09wLT5nZXRUeXBlKCksIDApOworICAgICAgICBpZiAoRmFjdG9yT3V0Q29uc3RhbnQoU09wLCBSZW1haW5kZXIsIEZhY3RvciwgU0UsIFREKSAmJgorICAgICAgICAgICAgUmVtYWluZGVyLT5pc1plcm8oKSkgeworICAgICAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gTmV3TXVsT3BzKE0tPm9wX2JlZ2luKCksIE0tPm9wX2VuZCgpKTsKKyAgICAgICAgICBOZXdNdWxPcHNbaV0gPSBTT3A7CisgICAgICAgICAgUyA9IFNFLmdldE11bEV4cHIoTmV3TXVsT3BzKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEluIGFuIEFkZFJlYywgY2hlY2sgaWYgYm90aCBzdGFydCBhbmQgc3RlcCBhcmUgZGl2aXNpYmxlLgorICBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkEgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUykpIHsKKyAgICBjb25zdCBTQ0VWICpTdGVwID0gQS0+Z2V0U3RlcFJlY3VycmVuY2UoU0UpOworICAgIGNvbnN0IFNDRVYgKlN0ZXBSZW0gPSBTRS5nZXRDb25zdGFudChTdGVwLT5nZXRUeXBlKCksIDApOworICAgIGlmICghRmFjdG9yT3V0Q29uc3RhbnQoU3RlcCwgU3RlcFJlbSwgRmFjdG9yLCBTRSwgVEQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghU3RlcFJlbS0+aXNaZXJvKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgU0NFViAqU3RhcnQgPSBBLT5nZXRTdGFydCgpOworICAgIGlmICghRmFjdG9yT3V0Q29uc3RhbnQoU3RhcnQsIFJlbWFpbmRlciwgRmFjdG9yLCBTRSwgVEQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFMgPSBTRS5nZXRBZGRSZWNFeHByKFN0YXJ0LCBTdGVwLCBBLT5nZXRMb29wKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gU2ltcGxpZnlBZGRPcGVyYW5kcyAtIFNvcnQgYW5kIHNpbXBsaWZ5IGEgbGlzdCBvZiBhZGQgb3BlcmFuZHMuIE51bUFkZFJlY3MKKy8vLyBpcyB0aGUgbnVtYmVyIG9mIFNDRVZBZGRSZWNFeHBycyBwcmVzZW50LCB3aGljaCBhcmUga2VwdCBhdCB0aGUgZW5kIG9mCisvLy8gdGhlIGxpc3QuCisvLy8KK3N0YXRpYyB2b2lkIFNpbXBsaWZ5QWRkT3BlcmFuZHMoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UpIHsKKyAgdW5zaWduZWQgTnVtQWRkUmVjcyA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IE9wcy5zaXplKCk7IGkgPiAwICYmIGlzYTxTQ0VWQWRkUmVjRXhwcj4oT3BzW2ktMV0pOyAtLWkpCisgICAgKytOdW1BZGRSZWNzOworICAvLyBHcm91cCBPcHMgaW50byBub24tYWRkcmVjcyBhbmQgYWRkcmVjcy4KKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBOb0FkZFJlY3MoT3BzLmJlZ2luKCksIE9wcy5lbmQoKSAtIE51bUFkZFJlY3MpOworICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IEFkZFJlY3MoT3BzLmVuZCgpIC0gTnVtQWRkUmVjcywgT3BzLmVuZCgpKTsKKyAgLy8gTGV0IFNjYWxhckV2b2x1dGlvbiBzb3J0IGFuZCBzaW1wbGlmeSB0aGUgbm9uLWFkZHJlY3MgbGlzdC4KKyAgY29uc3QgU0NFViAqU3VtID0gTm9BZGRSZWNzLmVtcHR5KCkgPworICAgICAgICAgICAgICAgICAgICBTRS5nZXRDb25zdGFudChUeSwgMCkgOgorICAgICAgICAgICAgICAgICAgICBTRS5nZXRBZGRFeHByKE5vQWRkUmVjcyk7CisgIC8vIElmIGl0IHJldHVybmVkIGFuIGFkZCwgdXNlIHRoZSBvcGVyYW5kcy4gT3RoZXJ3aXNlIGl0IHNpbXBsaWZpZWQKKyAgLy8gdGhlIHN1bSBpbnRvIGEgc2luZ2xlIHZhbHVlLCBzbyBqdXN0IHVzZSB0aGF0LgorICBPcHMuY2xlYXIoKTsKKyAgaWYgKGNvbnN0IFNDRVZBZGRFeHByICpBZGQgPSBkeW5fY2FzdDxTQ0VWQWRkRXhwcj4oU3VtKSkKKyAgICBPcHMuYXBwZW5kKEFkZC0+b3BfYmVnaW4oKSwgQWRkLT5vcF9lbmQoKSk7CisgIGVsc2UgaWYgKCFTdW0tPmlzWmVybygpKQorICAgIE9wcy5wdXNoX2JhY2soU3VtKTsKKyAgLy8gVGhlbiBhcHBlbmQgdGhlIGFkZHJlY3MuCisgIE9wcy5hcHBlbmQoQWRkUmVjcy5iZWdpbigpLCBBZGRSZWNzLmVuZCgpKTsKK30KKworLy8vIFNwbGl0QWRkUmVjcyAtIEZsYXR0ZW4gYSBsaXN0IG9mIGFkZCBvcGVyYW5kcywgbW92aW5nIGFkZHJlYyBzdGFydCB2YWx1ZXMKKy8vLyBvdXQgdG8gdGhlIHRvcCBsZXZlbC4gRm9yIGV4YW1wbGUsIGNvbnZlcnQge2EgKyBiLCssY30gdG8gYSwgYiwgezAsKyxkfS4KKy8vLyBUaGlzIGhlbHBzIGV4cG9zZSBtb3JlIG9wcG9ydHVuaXRpZXMgZm9yIGZvbGRpbmcgcGFydHMgb2YgdGhlIGV4cHJlc3Npb25zCisvLy8gaW50byBHRVAgaW5kaWNlcy4KKy8vLworc3RhdGljIHZvaWQgU3BsaXRBZGRSZWNzKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSkgeworICAvLyBGaW5kIHRoZSBhZGRyZWNzLgorICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IEFkZFJlY3M7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICB3aGlsZSAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkEgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oT3BzW2ldKSkgeworICAgICAgY29uc3QgU0NFViAqU3RhcnQgPSBBLT5nZXRTdGFydCgpOworICAgICAgaWYgKFN0YXJ0LT5pc1plcm8oKSkgYnJlYWs7CisgICAgICBjb25zdCBTQ0VWICpaZXJvID0gU0UuZ2V0Q29uc3RhbnQoVHksIDApOworICAgICAgQWRkUmVjcy5wdXNoX2JhY2soU0UuZ2V0QWRkUmVjRXhwcihaZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLT5nZXRTdGVwUmVjdXJyZW5jZShTRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEtPmdldExvb3AoKSkpOworICAgICAgaWYgKGNvbnN0IFNDRVZBZGRFeHByICpBZGQgPSBkeW5fY2FzdDxTQ0VWQWRkRXhwcj4oU3RhcnQpKSB7CisgICAgICAgIE9wc1tpXSA9IFplcm87CisgICAgICAgIE9wcy5hcHBlbmQoQWRkLT5vcF9iZWdpbigpLCBBZGQtPm9wX2VuZCgpKTsKKyAgICAgICAgZSArPSBBZGQtPmdldE51bU9wZXJhbmRzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBPcHNbaV0gPSBTdGFydDsKKyAgICAgIH0KKyAgICB9CisgIGlmICghQWRkUmVjcy5lbXB0eSgpKSB7CisgICAgLy8gQWRkIHRoZSBhZGRyZWNzIG9udG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICBPcHMuYXBwZW5kKEFkZFJlY3MuYmVnaW4oKSwgQWRkUmVjcy5lbmQoKSk7CisgICAgLy8gUmVzb3J0IHRoZSBvcGVyYW5kIGxpc3QsIG1vdmluZyBhbnkgY29uc3RhbnRzIHRvIHRoZSBmcm9udC4KKyAgICBTaW1wbGlmeUFkZE9wZXJhbmRzKE9wcywgVHksIFNFKTsKKyAgfQorfQorCisvLy8gZXhwYW5kQWRkVG9HRVAgLSBFeHBhbmQgYW4gYWRkaXRpb24gZXhwcmVzc2lvbiB3aXRoIGEgcG9pbnRlciB0eXBlIGludG8KKy8vLyBhIEdFUCBpbnN0ZWFkIG9mIHVzaW5nIHB0cnRvaW50K2FyaXRobWV0aWMraW50dG9wdHIuIFRoaXMgaGVscHMKKy8vLyBCYXNpY0FsaWFzQW5hbHlzaXMgYW5kIG90aGVyIHBhc3NlcyBhbmFseXplIHRoZSByZXN1bHQuIFNlZSB0aGUgcnVsZXMKKy8vLyBmb3IgZ2V0ZWxlbWVudHB0ciB2cy4gaW50dG9wdHIgaW4KKy8vLyBodHRwOi8vbGx2bS5vcmcvZG9jcy9MYW5nUmVmLmh0bWwjcG9pbnRlcmFsaWFzaW5nCisvLy8gZm9yIGRldGFpbHMuCisvLy8KKy8vLyBEZXNpZ24gbm90ZTogVGhlIGNvcnJlY3RuZXNzIG9mIHVzaW5nIGdldGVsZW1lbnRwdHIgaGVyZSBkZXBlbmRzIG9uCisvLy8gU2NhbGFyRXZvbHV0aW9uIG5vdCByZWNvZ25pemluZyBpbnR0b3B0ciBhbmQgcHRydG9pbnQgb3BlcmF0b3JzLCBhcworLy8vIHRoZXkgbWF5IGludHJvZHVjZSBwb2ludGVyIGFyaXRobWV0aWMgd2hpY2ggbWF5IG5vdCBiZSBzYWZlbHkgY29udmVydGVkCisvLy8gaW50byBnZXRlbGVtZW50cHRyLgorLy8vCisvLy8gRGVzaWduIG5vdGU6IEl0IG1pZ2h0IHNlZW0gZGVzaXJhYmxlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIG1vcmUKKy8vLyBsb29wLWF3YXJlLiBJZiBzb21lIG9mIHRoZSBpbmRpY2VzIGFyZSBsb29wLWludmFyaWFudCB3aGlsZSBvdGhlcnMKKy8vLyBhcmVuJ3QsIGl0IG1pZ2h0IHNlZW0gZGVzaXJhYmxlIHRvIGVtaXQgbXVsdGlwbGUgR0VQcywga2VlcGluZyB0aGUKKy8vLyBsb29wLWludmFyaWFudCBwb3J0aW9ucyBvZiB0aGUgb3ZlcmFsbCBjb21wdXRhdGlvbiBvdXRzaWRlIHRoZSBsb29wLgorLy8vIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIGZldyByZWFzb25zIHRoaXMgaXMgbm90IGRvbmUgaGVyZS4gSG9pc3Rpbmcgc2ltcGxlCisvLy8gYXJpdGhtZXRpYyBpcyBhIGxvdy1sZXZlbCBvcHRpbWl6YXRpb24gdGhhdCBvZnRlbiBpc24ndCB2ZXJ5CisvLy8gaW1wb3J0YW50IHVudGlsIGxhdGUgaW4gdGhlIG9wdGltaXphdGlvbiBwcm9jZXNzLiBJbiBmYWN0LCBwYXNzZXMKKy8vLyBsaWtlIEluc3RydWN0aW9uQ29tYmluaW5nIHdpbGwgY29tYmluZSBHRVBzLCBldmVuIGlmIGl0IG1lYW5zCisvLy8gcHVzaGluZyBsb29wLWludmFyaWFudCBjb21wdXRhdGlvbiBkb3duIGludG8gbG9vcHMsIHNvIGV2ZW4gaWYgdGhlCisvLy8gR0VQcyB3ZXJlIHNwbGl0IGhlcmUsIHRoZSB3b3JrIHdvdWxkIHF1aWNrbHkgYmUgdW5kb25lLiBUaGUKKy8vLyBMb29wU3RyZW5ndGhSZWR1Y3Rpb24gcGFzcywgd2hpY2ggaXMgdXN1YWxseSBydW4gcXVpdGUgbGF0ZSAoYW5kCisvLy8gYWZ0ZXIgdGhlIGxhc3QgSW5zdHJ1Y3Rpb25Db21iaW5pbmcgcGFzcyksIHRha2VzIGNhcmUgb2YgaG9pc3RpbmcKKy8vLyBsb29wLWludmFyaWFudCBwb3J0aW9ucyBvZiBleHByZXNzaW9ucywgYWZ0ZXIgY29uc2lkZXJpbmcgd2hhdAorLy8vIGNhbiBiZSBmb2xkZWQgdXNpbmcgdGFyZ2V0IGFkZHJlc3NpbmcgbW9kZXMuCisvLy8KK1ZhbHVlICpTQ0VWRXhwYW5kZXI6OmV4cGFuZEFkZFRvR0VQKGNvbnN0IFNDRVYgKmNvbnN0ICpvcF9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKmNvbnN0ICpvcF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyVHlwZSAqUFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqVikgeworICBjb25zdCBUeXBlICpFbFR5ID0gUFR5LT5nZXRFbGVtZW50VHlwZSgpOworICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCA0PiBHZXBJbmRpY2VzOworICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IE9wcyhvcF9iZWdpbiwgb3BfZW5kKTsKKyAgYm9vbCBBbnlOb25aZXJvSW5kaWNlcyA9IGZhbHNlOworCisgIC8vIFNwbGl0IEFkZFJlY3MgdXAgaW50byBwYXJ0cyBhcyBlaXRoZXIgb2YgdGhlIHBhcnRzIG1heSBiZSB1c2FibGUKKyAgLy8gd2l0aG91dCB0aGUgb3RoZXIuCisgIFNwbGl0QWRkUmVjcyhPcHMsIFR5LCBTRSk7CisKKyAgLy8gRGVzY2VuZCBkb3duIHRoZSBwb2ludGVyJ3MgdHlwZSBhbmQgYXR0ZW1wdCB0byBjb252ZXJ0IHRoZSBvdGhlcgorICAvLyBvcGVyYW5kcyBpbnRvIEdFUCBpbmRpY2VzLCBhdCBlYWNoIGxldmVsLiBUaGUgZmlyc3QgaW5kZXggaW4gYSBHRVAKKyAgLy8gaW5kZXhlcyBpbnRvIHRoZSBhcnJheSBpbXBsaWVkIGJ5IHRoZSBwb2ludGVyIG9wZXJhbmQ7IHRoZSByZXN0IG9mCisgIC8vIHRoZSBpbmRpY2VzIGluZGV4IGludG8gdGhlIGVsZW1lbnQgb3IgZmllbGQgdHlwZSBzZWxlY3RlZCBieSB0aGUKKyAgLy8gcHJlY2VkaW5nIGluZGV4LgorICBmb3IgKDs7KSB7CisgICAgLy8gSWYgdGhlIHNjYWxlIHNpemUgaXMgbm90IDAsIGF0dGVtcHQgdG8gZmFjdG9yIG91dCBhIHNjYWxlIGZvcgorICAgIC8vIGFycmF5IGluZGV4aW5nLgorICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgOD4gU2NhbGVkT3BzOworICAgIGlmIChFbFR5LT5pc1NpemVkKCkpIHsKKyAgICAgIGNvbnN0IFNDRVYgKkVsU2l6ZSA9IFNFLmdldFNpemVPZkV4cHIoRWxUeSk7CisgICAgICBpZiAoIUVsU2l6ZS0+aXNaZXJvKCkpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBOZXdPcHM7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIGNvbnN0IFNDRVYgKk9wID0gT3BzW2ldOworICAgICAgICAgIGNvbnN0IFNDRVYgKlJlbWFpbmRlciA9IFNFLmdldENvbnN0YW50KFR5LCAwKTsKKyAgICAgICAgICBpZiAoRmFjdG9yT3V0Q29uc3RhbnQoT3AsIFJlbWFpbmRlciwgRWxTaXplLCBTRSwgU0UuVEQpKSB7CisgICAgICAgICAgICAvLyBPcCBub3cgaGFzIEVsU2l6ZSBmYWN0b3JlZCBvdXQuCisgICAgICAgICAgICBTY2FsZWRPcHMucHVzaF9iYWNrKE9wKTsKKyAgICAgICAgICAgIGlmICghUmVtYWluZGVyLT5pc1plcm8oKSkKKyAgICAgICAgICAgICAgTmV3T3BzLnB1c2hfYmFjayhSZW1haW5kZXIpOworICAgICAgICAgICAgQW55Tm9uWmVyb0luZGljZXMgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgb3BlcmFuZCB3YXMgbm90IGRpdmlzaWJsZSwgc28gYWRkIGl0IHRvIHRoZSBsaXN0IG9mIG9wZXJhbmRzCisgICAgICAgICAgICAvLyB3ZSdsbCBzY2FuIG5leHQgaXRlcmF0aW9uLgorICAgICAgICAgICAgTmV3T3BzLnB1c2hfYmFjayhPcHNbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSBtYWRlIGFueSBjaGFuZ2VzLCB1cGRhdGUgT3BzLgorICAgICAgICBpZiAoIVNjYWxlZE9wcy5lbXB0eSgpKSB7CisgICAgICAgICAgT3BzID0gTmV3T3BzOworICAgICAgICAgIFNpbXBsaWZ5QWRkT3BlcmFuZHMoT3BzLCBUeSwgU0UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gUmVjb3JkIHRoZSBzY2FsZWQgYXJyYXkgaW5kZXggZm9yIHRoaXMgbGV2ZWwgb2YgdGhlIHR5cGUuIElmCisgICAgLy8gd2UgZGlkbid0IGZpbmQgYW55IG9wZXJhbmRzIHRoYXQgY291bGQgYmUgZmFjdG9yZWQsIHRlbnRhdGl2ZWx5CisgICAgLy8gYXNzdW1lIHRoYXQgZWxlbWVudCB6ZXJvIHdhcyBzZWxlY3RlZCAoc2luY2UgdGhlIHplcm8gb2Zmc2V0CisgICAgLy8gd291bGQgb2J2aW91c2x5IGJlIGZvbGRlZCBhd2F5KS4KKyAgICBWYWx1ZSAqU2NhbGVkID0gU2NhbGVkT3BzLmVtcHR5KCkgPworICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5KSA6CisgICAgICAgICAgICAgICAgICAgIGV4cGFuZENvZGVGb3IoU0UuZ2V0QWRkRXhwcihTY2FsZWRPcHMpLCBUeSk7CisgICAgR2VwSW5kaWNlcy5wdXNoX2JhY2soU2NhbGVkKTsKKworICAgIC8vIENvbGxlY3Qgc3RydWN0IGZpZWxkIGluZGV4IG9wZXJhbmRzLgorICAgIHdoaWxlIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihFbFR5KSkgeworICAgICAgYm9vbCBGb3VuZEZpZWxkTm8gPSBmYWxzZTsKKyAgICAgIC8vIEFuIGVtcHR5IHN0cnVjdCBoYXMgbm8gZmllbGRzLgorICAgICAgaWYgKFNUeS0+Z2V0TnVtRWxlbWVudHMoKSA9PSAwKSBicmVhazsKKyAgICAgIGlmIChTRS5URCkgeworICAgICAgICAvLyBXaXRoIFRhcmdldERhdGEsIGZpZWxkIG9mZnNldHMgYXJlIGtub3duLiBTZWUgaWYgYSBjb25zdGFudCBvZmZzZXQKKyAgICAgICAgLy8gZmFsbHMgd2l0aGluIGFueSBvZiB0aGUgc3RydWN0IGZpZWxkcy4KKyAgICAgICAgaWYgKE9wcy5lbXB0eSgpKSBicmVhazsKKyAgICAgICAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oT3BzWzBdKSkKKyAgICAgICAgICBpZiAoU0UuZ2V0VHlwZVNpemVJbkJpdHMoQy0+Z2V0VHlwZSgpKSA8PSA2NCkgeworICAgICAgICAgICAgY29uc3QgU3RydWN0TGF5b3V0ICZTTCA9ICpTRS5URC0+Z2V0U3RydWN0TGF5b3V0KFNUeSk7CisgICAgICAgICAgICB1aW50NjRfdCBGdWxsT2Zmc2V0ID0gQy0+Z2V0VmFsdWUoKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoRnVsbE9mZnNldCA8IFNMLmdldFNpemVJbkJ5dGVzKCkpIHsKKyAgICAgICAgICAgICAgdW5zaWduZWQgRWxJZHggPSBTTC5nZXRFbGVtZW50Q29udGFpbmluZ09mZnNldChGdWxsT2Zmc2V0KTsKKyAgICAgICAgICAgICAgR2VwSW5kaWNlcy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVHktPmdldENvbnRleHQoKSksIEVsSWR4KSk7CisgICAgICAgICAgICAgIEVsVHkgPSBTVHktPmdldFR5cGVBdEluZGV4KEVsSWR4KTsKKyAgICAgICAgICAgICAgT3BzWzBdID0KKyAgICAgICAgICAgICAgICBTRS5nZXRDb25zdGFudChUeSwgRnVsbE9mZnNldCAtIFNMLmdldEVsZW1lbnRPZmZzZXQoRWxJZHgpKTsKKyAgICAgICAgICAgICAgQW55Tm9uWmVyb0luZGljZXMgPSB0cnVlOworICAgICAgICAgICAgICBGb3VuZEZpZWxkTm8gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdpdGhvdXQgVGFyZ2V0RGF0YSwganVzdCBjaGVjayBmb3IgYW4gb2Zmc2V0b2YgZXhwcmVzc2lvbiBvZiB0aGUKKyAgICAgICAgLy8gYXBwcm9wcmlhdGUgc3RydWN0IHR5cGUuCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBpZiAoY29uc3QgU0NFVlVua25vd24gKlUgPSBkeW5fY2FzdDxTQ0VWVW5rbm93bj4oT3BzW2ldKSkgeworICAgICAgICAgICAgY29uc3QgVHlwZSAqQ1R5OworICAgICAgICAgICAgQ29uc3RhbnQgKkZpZWxkTm87CisgICAgICAgICAgICBpZiAoVS0+aXNPZmZzZXRPZihDVHksIEZpZWxkTm8pICYmIENUeSA9PSBTVHkpIHsKKyAgICAgICAgICAgICAgR2VwSW5kaWNlcy5wdXNoX2JhY2soRmllbGRObyk7CisgICAgICAgICAgICAgIEVsVHkgPQorICAgICAgICAgICAgICAgIFNUeS0+Z2V0VHlwZUF0SW5kZXgoY2FzdDxDb25zdGFudEludD4oRmllbGRObyktPmdldFpFeHRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgT3BzW2ldID0gU0UuZ2V0Q29uc3RhbnQoVHksIDApOworICAgICAgICAgICAgICBBbnlOb25aZXJvSW5kaWNlcyA9IHRydWU7CisgICAgICAgICAgICAgIEZvdW5kRmllbGRObyA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIElmIG5vIHN0cnVjdCBmaWVsZCBvZmZzZXRzIHdlcmUgZm91bmQsIHRlbnRhdGl2ZWx5IGFzc3VtZSB0aGF0CisgICAgICAvLyBmaWVsZCB6ZXJvIHdhcyBzZWxlY3RlZCAoc2luY2UgdGhlIHplcm8gb2Zmc2V0IHdvdWxkIG9idmlvdXNseQorICAgICAgLy8gYmUgZm9sZGVkIGF3YXkpLgorICAgICAgaWYgKCFGb3VuZEZpZWxkTm8pIHsKKyAgICAgICAgRWxUeSA9IFNUeS0+Z2V0VHlwZUF0SW5kZXgoMHUpOworICAgICAgICBHZXBJbmRpY2VzLnB1c2hfYmFjaygKKyAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDMyVHkoVHktPmdldENvbnRleHQoKSkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29uc3QgQXJyYXlUeXBlICpBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KEVsVHkpKQorICAgICAgRWxUeSA9IEFUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorCisgIC8vIElmIG5vbmUgb2YgdGhlIG9wZXJhbmRzIHdlcmUgY29udmVydGlibGUgdG8gcHJvcGVyIEdFUCBpbmRpY2VzLCBjYXN0CisgIC8vIHRoZSBiYXNlIHRvIGk4KiBhbmQgZG8gYW4gdWdseSBnZXRlbGVtZW50cHRyIHdpdGggdGhhdC4gSXQncyBzdGlsbAorICAvLyBiZXR0ZXIgdGhhbiBwdHJ0b2ludCthcml0aG1ldGljK2ludHRvcHRyIGF0IGxlYXN0LgorICBpZiAoIUFueU5vblplcm9JbmRpY2VzKSB7CisgICAgLy8gQ2FzdCB0aGUgYmFzZSB0byBpOCouCisgICAgViA9IEluc2VydE5vb3BDYXN0T2ZUbyhWLAorICAgICAgIFR5cGU6OmdldEludDhQdHJUeShUeS0+Z2V0Q29udGV4dCgpLCBQVHktPmdldEFkZHJlc3NTcGFjZSgpKSk7CisKKyAgICAvLyBFeHBhbmQgdGhlIG9wZXJhbmRzIGZvciBhIHBsYWluIGJ5dGUgb2Zmc2V0LgorICAgIFZhbHVlICpJZHggPSBleHBhbmRDb2RlRm9yKFNFLmdldEFkZEV4cHIoT3BzKSwgVHkpOworCisgICAgLy8gRm9sZCBhIEdFUCB3aXRoIGNvbnN0YW50IG9wZXJhbmRzLgorICAgIGlmIChDb25zdGFudCAqQ0xIUyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIGlmIChDb25zdGFudCAqQ1JIUyA9IGR5bl9jYXN0PENvbnN0YW50PihJZHgpKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKENMSFMsICZDUkhTLCAxKTsKKworICAgIC8vIERvIGEgcXVpY2sgc2NhbiB0byBzZWUgaWYgd2UgaGF2ZSB0aGlzIEdFUCBuZWFyYnkuICBJZiBzbywgcmV1c2UgaXQuCisgICAgdW5zaWduZWQgU2NhbkxpbWl0ID0gNjsKKyAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCbG9ja0JlZ2luID0gQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpLT5iZWdpbigpOworICAgIC8vIFNjYW5uaW5nIHN0YXJ0cyBmcm9tIHRoZSBsYXN0IGluc3RydWN0aW9uIGJlZm9yZSB0aGUgaW5zZXJ0aW9uIHBvaW50LgorICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElQID0gQnVpbGRlci5HZXRJbnNlcnRQb2ludCgpOworICAgIGlmIChJUCAhPSBCbG9ja0JlZ2luKSB7CisgICAgICAtLUlQOworICAgICAgZm9yICg7IFNjYW5MaW1pdDsgLS1JUCwgLS1TY2FuTGltaXQpIHsKKyAgICAgICAgLy8gRG9uJ3QgY291bnQgZGJnLnZhbHVlIGFnYWluc3QgdGhlIFNjYW5MaW1pdCwgdG8gYXZvaWQgcGVydHVyYmluZyB0aGUKKyAgICAgICAgLy8gZ2VuZXJhdGVkIGNvZGUuCisgICAgICAgIGlmIChJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoSVApKQorICAgICAgICAgIFNjYW5MaW1pdCsrOworICAgICAgICBpZiAoSVAtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyICYmCisgICAgICAgICAgICBJUC0+Z2V0T3BlcmFuZCgwKSA9PSBWICYmIElQLT5nZXRPcGVyYW5kKDEpID09IElkeCkKKyAgICAgICAgICByZXR1cm4gSVA7CisgICAgICAgIGlmIChJUCA9PSBCbG9ja0JlZ2luKSBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCBpbnNlcnRpb24gcG9pbnQgc28gd2UgY2FuIHJlc3RvcmUgaXQgd2hlbiB3ZSdyZSBkb25lLgorICAgIEJhc2ljQmxvY2sgKlNhdmVJbnNlcnRCQiA9IEJ1aWxkZXIuR2V0SW5zZXJ0QmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTYXZlSW5zZXJ0UHQgPSBCdWlsZGVyLkdldEluc2VydFBvaW50KCk7CisKKyAgICAvLyBNb3ZlIHRoZSBpbnNlcnRpb24gcG9pbnQgb3V0IG9mIGFzIG1hbnkgbG9vcHMgYXMgd2UgY2FuLgorICAgIHdoaWxlIChjb25zdCBMb29wICpMID0gU0UuTEktPmdldExvb3BGb3IoQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpKSkgeworICAgICAgaWYgKCFMLT5pc0xvb3BJbnZhcmlhbnQoVikgfHwgIUwtPmlzTG9vcEludmFyaWFudChJZHgpKSBicmVhazsKKyAgICAgIEJhc2ljQmxvY2sgKlByZWhlYWRlciA9IEwtPmdldExvb3BQcmVoZWFkZXIoKTsKKyAgICAgIGlmICghUHJlaGVhZGVyKSBicmVhazsKKworICAgICAgLy8gT2ssIG1vdmUgdXAgYSBsZXZlbC4KKyAgICAgIEJ1aWxkZXIuU2V0SW5zZXJ0UG9pbnQoUHJlaGVhZGVyLCBQcmVoZWFkZXItPmdldFRlcm1pbmF0b3IoKSk7CisgICAgfQorCisgICAgLy8gRW1pdCBhIEdFUC4KKyAgICBWYWx1ZSAqR0VQID0gQnVpbGRlci5DcmVhdGVHRVAoViwgSWR4KTsKKyAgICByZW1lbWJlckluc3RydWN0aW9uKEdFUCk7CisKKyAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBpbnNlcnQgcG9pbnQuCisgICAgaWYgKFNhdmVJbnNlcnRCQikKKyAgICAgIHJlc3RvcmVJbnNlcnRQb2ludChTYXZlSW5zZXJ0QkIsIFNhdmVJbnNlcnRQdCk7CisKKyAgICByZXR1cm4gR0VQOworICB9CisKKyAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgaW5zZXJ0aW9uIHBvaW50IHNvIHdlIGNhbiByZXN0b3JlIGl0IHdoZW4gd2UncmUgZG9uZS4KKyAgQmFzaWNCbG9jayAqU2F2ZUluc2VydEJCID0gQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpOworICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTYXZlSW5zZXJ0UHQgPSBCdWlsZGVyLkdldEluc2VydFBvaW50KCk7CisKKyAgLy8gTW92ZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG91dCBvZiBhcyBtYW55IGxvb3BzIGFzIHdlIGNhbi4KKyAgd2hpbGUgKGNvbnN0IExvb3AgKkwgPSBTRS5MSS0+Z2V0TG9vcEZvcihCdWlsZGVyLkdldEluc2VydEJsb2NrKCkpKSB7CisgICAgaWYgKCFMLT5pc0xvb3BJbnZhcmlhbnQoVikpIGJyZWFrOworCisgICAgYm9vbCBBbnlJbmRleE5vdExvb3BJbnZhcmlhbnQgPSBmYWxzZTsKKyAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxWYWx1ZSAqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IEdlcEluZGljZXMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBHZXBJbmRpY2VzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmICghTC0+aXNMb29wSW52YXJpYW50KCpJKSkgeworICAgICAgICBBbnlJbmRleE5vdExvb3BJbnZhcmlhbnQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBpZiAoQW55SW5kZXhOb3RMb29wSW52YXJpYW50KQorICAgICAgYnJlYWs7CisKKyAgICBCYXNpY0Jsb2NrICpQcmVoZWFkZXIgPSBMLT5nZXRMb29wUHJlaGVhZGVyKCk7CisgICAgaWYgKCFQcmVoZWFkZXIpIGJyZWFrOworCisgICAgLy8gT2ssIG1vdmUgdXAgYSBsZXZlbC4KKyAgICBCdWlsZGVyLlNldEluc2VydFBvaW50KFByZWhlYWRlciwgUHJlaGVhZGVyLT5nZXRUZXJtaW5hdG9yKCkpOworICB9CisKKyAgLy8gSW5zZXJ0IGEgcHJldHR5IGdldGVsZW1lbnRwdHIuIE5vdGUgdGhhdCB0aGlzIEdFUCBpcyBub3QgbWFya2VkIGluYm91bmRzLAorICAvLyBiZWNhdXNlIFNjYWxhckV2b2x1dGlvbiBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBhZGRyZXNzIGFyaXRobWV0aWMgdG8KKyAgLy8gY29tcHV0ZSBhIHZhbHVlIHdoaWNoIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBhbGxvY2F0ZWQgb2JqZWN0LgorICBWYWx1ZSAqQ2FzdGVkID0gVjsKKyAgaWYgKFYtPmdldFR5cGUoKSAhPSBQVHkpCisgICAgQ2FzdGVkID0gSW5zZXJ0Tm9vcENhc3RPZlRvKENhc3RlZCwgUFR5KTsKKyAgVmFsdWUgKkdFUCA9IEJ1aWxkZXIuQ3JlYXRlR0VQKENhc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlcEluZGljZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlcEluZGljZXMuZW5kKCkpOworICBPcHMucHVzaF9iYWNrKFNFLmdldFVua25vd24oR0VQKSk7CisgIHJlbWVtYmVySW5zdHJ1Y3Rpb24oR0VQKTsKKworICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBpbnNlcnQgcG9pbnQuCisgIGlmIChTYXZlSW5zZXJ0QkIpCisgICAgcmVzdG9yZUluc2VydFBvaW50KFNhdmVJbnNlcnRCQiwgU2F2ZUluc2VydFB0KTsKKworICByZXR1cm4gZXhwYW5kKFNFLmdldEFkZEV4cHIoT3BzKSk7Cit9CisKKy8vLyBpc05vbkNvbnN0YW50TmVnYXRpdmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHNjZXYgaXMgbmVnYXRlZCwgYnV0CisvLy8gbm90IGEgY29uc3RhbnQuCitzdGF0aWMgYm9vbCBpc05vbkNvbnN0YW50TmVnYXRpdmUoY29uc3QgU0NFViAqRikgeworICBjb25zdCBTQ0VWTXVsRXhwciAqTXVsID0gZHluX2Nhc3Q8U0NFVk11bEV4cHI+KEYpOworICBpZiAoIU11bCkgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHRoZXJlIGlzIGEgY29uc3RhbnQgZmFjdG9yLCBpdCB3aWxsIGJlIGZpcnN0LgorICBjb25zdCBTQ0VWQ29uc3RhbnQgKlNDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihNdWwtPmdldE9wZXJhbmQoMCkpOworICBpZiAoIVNDKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLCB0aGlzIG1hdGNoZXMgdGhpbmdzIGxpa2UgKC00MiAqIFYpLgorICByZXR1cm4gU0MtPmdldFZhbHVlKCktPmdldFZhbHVlKCkuaXNOZWdhdGl2ZSgpOworfQorCisvLy8gUGlja01vc3RSZWxldmFudExvb3AgLSBHaXZlbiB0d28gbG9vcHMgcGljayB0aGUgb25lIHRoYXQncyBtb3N0IHJlbGV2YW50IGZvcgorLy8vIFNDRVYgZXhwYW5zaW9uLiBJZiB0aGV5IGFyZSBuZXN0ZWQsIHRoaXMgaXMgdGhlIG1vc3QgbmVzdGVkLiBJZiB0aGV5IGFyZQorLy8vIG5laWdoYm9yaW5nLCBwaWNrIHRoZSBsYXRlci4KK3N0YXRpYyBjb25zdCBMb29wICpQaWNrTW9zdFJlbGV2YW50TG9vcChjb25zdCBMb29wICpBLCBjb25zdCBMb29wICpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgJkRUKSB7CisgIGlmICghQSkgcmV0dXJuIEI7CisgIGlmICghQikgcmV0dXJuIEE7CisgIGlmIChBLT5jb250YWlucyhCKSkgcmV0dXJuIEI7CisgIGlmIChCLT5jb250YWlucyhBKSkgcmV0dXJuIEE7CisgIGlmIChEVC5kb21pbmF0ZXMoQS0+Z2V0SGVhZGVyKCksIEItPmdldEhlYWRlcigpKSkgcmV0dXJuIEI7CisgIGlmIChEVC5kb21pbmF0ZXMoQi0+Z2V0SGVhZGVyKCksIEEtPmdldEhlYWRlcigpKSkgcmV0dXJuIEE7CisgIHJldHVybiBBOyAvLyBBcmJpdHJhcmlseSBicmVhayB0aGUgdGllLgorfQorCisvLy8gR2V0UmVsZXZhbnRMb29wIC0gR2V0IHRoZSBtb3N0IHJlbGV2YW50IGxvb3AgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorLy8vIGV4cHJlc3Npb24sIGFjY29yZGluZyB0byBQaWNrTW9zdFJlbGV2YW50TG9vcC4KK3N0YXRpYyBjb25zdCBMb29wICpHZXRSZWxldmFudExvb3AoY29uc3QgU0NFViAqUywgTG9vcEluZm8gJkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICZEVCkgeworICBpZiAoaXNhPFNDRVZDb25zdGFudD4oUykpCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25zdCBTQ0VWVW5rbm93biAqVSA9IGR5bl9jYXN0PFNDRVZVbmtub3duPihTKSkgeworICAgIGlmIChjb25zdCBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihVLT5nZXRWYWx1ZSgpKSkKKyAgICAgIHJldHVybiBMSS5nZXRMb29wRm9yKEktPmdldFBhcmVudCgpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoY29uc3QgU0NFVk5BcnlFeHByICpOID0gZHluX2Nhc3Q8U0NFVk5BcnlFeHByPihTKSkgeworICAgIGNvbnN0IExvb3AgKkwgPSAwOworICAgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUykpCisgICAgICBMID0gQVItPmdldExvb3AoKTsKKyAgICBmb3IgKFNDRVZOQXJ5RXhwcjo6b3BfaXRlcmF0b3IgSSA9IE4tPm9wX2JlZ2luKCksIEUgPSBOLT5vcF9lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgTCA9IFBpY2tNb3N0UmVsZXZhbnRMb29wKEwsIEdldFJlbGV2YW50TG9vcCgqSSwgTEksIERUKSwgRFQpOworICAgIHJldHVybiBMOworICB9CisgIGlmIChjb25zdCBTQ0VWQ2FzdEV4cHIgKkMgPSBkeW5fY2FzdDxTQ0VWQ2FzdEV4cHI+KFMpKQorICAgIHJldHVybiBHZXRSZWxldmFudExvb3AoQy0+Z2V0T3BlcmFuZCgpLCBMSSwgRFQpOworICBpZiAoY29uc3QgU0NFVlVEaXZFeHByICpEID0gZHluX2Nhc3Q8U0NFVlVEaXZFeHByPihTKSkKKyAgICByZXR1cm4gUGlja01vc3RSZWxldmFudExvb3AoR2V0UmVsZXZhbnRMb29wKEQtPmdldExIUygpLCBMSSwgRFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRSZWxldmFudExvb3AoRC0+Z2V0UkhTKCksIExJLCBEVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUKTsKKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBTQ0VWIHR5cGUhIik7Cit9CisKK25hbWVzcGFjZSB7CisKKy8vLyBMb29wQ29tcGFyZSAtIENvbXBhcmUgbG9vcHMgYnkgUGlja01vc3RSZWxldmFudExvb3AuCitjbGFzcyBMb29wQ29tcGFyZSB7CisgIERvbWluYXRvclRyZWUgJkRUOworcHVibGljOgorICBleHBsaWNpdCBMb29wQ29tcGFyZShEb21pbmF0b3JUcmVlICZkdCkgOiBEVChkdCkge30KKworICBib29sIG9wZXJhdG9yKCkoc3RkOjpwYWlyPGNvbnN0IExvb3AgKiwgY29uc3QgU0NFViAqPiBMSFMsCisgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Y29uc3QgTG9vcCAqLCBjb25zdCBTQ0VWICo+IFJIUykgY29uc3QgeworICAgIC8vIEtlZXAgcG9pbnRlciBvcGVyYW5kcyBzb3J0ZWQgYXQgdGhlIGVuZC4KKyAgICBpZiAoTEhTLnNlY29uZC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICE9CisgICAgICAgIFJIUy5zZWNvbmQtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgIHJldHVybiBMSFMuc2Vjb25kLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCk7CisKKyAgICAvLyBDb21wYXJlIGxvb3BzIHdpdGggUGlja01vc3RSZWxldmFudExvb3AuCisgICAgaWYgKExIUy5maXJzdCAhPSBSSFMuZmlyc3QpCisgICAgICByZXR1cm4gUGlja01vc3RSZWxldmFudExvb3AoTEhTLmZpcnN0LCBSSFMuZmlyc3QsIERUKSAhPSBMSFMuZmlyc3Q7CisKKyAgICAvLyBJZiBvbmUgb3BlcmFuZCBpcyBhIG5vbi1jb25zdGFudCBuZWdhdGl2ZSBhbmQgdGhlIG90aGVyIGlzIG5vdCwKKyAgICAvLyBwdXQgdGhlIG5vbi1jb25zdGFudCBuZWdhdGl2ZSBvbiB0aGUgcmlnaHQgc28gdGhhdCBhIHN1YiBjYW4KKyAgICAvLyBiZSB1c2VkIGluc3RlYWQgb2YgYSBuZWdhdGUgYW5kIGFkZC4KKyAgICBpZiAoaXNOb25Db25zdGFudE5lZ2F0aXZlKExIUy5zZWNvbmQpKSB7CisgICAgICBpZiAoIWlzTm9uQ29uc3RhbnROZWdhdGl2ZShSSFMuc2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoaXNOb25Db25zdGFudE5lZ2F0aXZlKFJIUy5zZWNvbmQpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBPdGhlcndpc2UgdGhleSBhcmUgZXF1aXZhbGVudCBhY2NvcmRpbmcgdG8gdGhpcyBjb21wYXJpc29uLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworfQorCitWYWx1ZSAqU0NFVkV4cGFuZGVyOjp2aXNpdEFkZEV4cHIoY29uc3QgU0NFVkFkZEV4cHIgKlMpIHsKKyAgY29uc3QgVHlwZSAqVHkgPSBTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShTLT5nZXRUeXBlKCkpOworCisgIC8vIENvbGxlY3QgYWxsIHRoZSBhZGQgb3BlcmFuZHMgaW4gYSBsb29wLCBhbG9uZyB3aXRoIHRoZWlyIGFzc29jaWF0ZWQgbG9vcHMuCisgIC8vIEl0ZXJhdGUgaW4gcmV2ZXJzZSBzbyB0aGF0IGNvbnN0YW50cyBhcmUgZW1pdHRlZCBsYXN0LCBhbGwgZWxzZSBlcXVhbCwgYW5kCisgIC8vIHNvIHRoYXQgcG9pbnRlciBvcGVyYW5kcyBhcmUgaW5zZXJ0ZWQgZmlyc3QsIHdoaWNoIHRoZSBjb2RlIGJlbG93IHJlbGllcyBvbgorICAvLyB0byBmb3JtIG1vcmUgaW52b2x2ZWQgR0VQcy4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IExvb3AgKiwgY29uc3QgU0NFViAqPiwgOD4gT3BzQW5kTG9vcHM7CisgIGZvciAoc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPFNDRVZBZGRFeHByOjpvcF9pdGVyYXRvcj4gSShTLT5vcF9lbmQoKSksCisgICAgICAgRShTLT5vcF9iZWdpbigpKTsgSSAhPSBFOyArK0kpCisgICAgT3BzQW5kTG9vcHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEdldFJlbGV2YW50TG9vcCgqSSwgKlNFLkxJLCAqU0UuRFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSSkpOworCisgIC8vIFNvcnQgYnkgbG9vcC4gVXNlIGEgc3RhYmxlIHNvcnQgc28gdGhhdCBjb25zdGFudHMgZm9sbG93IG5vbi1jb25zdGFudHMgYW5kCisgIC8vIHBvaW50ZXIgb3BlcmFuZHMgcHJlY2VkZSBub24tcG9pbnRlciBvcGVyYW5kcy4KKyAgc3RkOjpzdGFibGVfc29ydChPcHNBbmRMb29wcy5iZWdpbigpLCBPcHNBbmRMb29wcy5lbmQoKSwgTG9vcENvbXBhcmUoKlNFLkRUKSk7CisKKyAgLy8gRW1pdCBpbnN0cnVjdGlvbnMgdG8gYWRkIGFsbCB0aGUgb3BlcmFuZHMuIEhvaXN0IGFzIG11Y2ggYXMgcG9zc2libGUKKyAgLy8gb3V0IG9mIGxvb3BzLCBhbmQgZm9ybSBtZWFuaW5nZnVsIGdldGVsZW1lbnRwdHJzIHdoZXJlIHBvc3NpYmxlLgorICBWYWx1ZSAqU3VtID0gMDsKKyAgZm9yIChTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGNvbnN0IExvb3AgKiwgY29uc3QgU0NFViAqPiA+OjppdGVyYXRvcgorICAgICAgIEkgPSBPcHNBbmRMb29wcy5iZWdpbigpLCBFID0gT3BzQW5kTG9vcHMuZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgY29uc3QgTG9vcCAqQ3VyTG9vcCA9IEktPmZpcnN0OworICAgIGNvbnN0IFNDRVYgKk9wID0gSS0+c2Vjb25kOworICAgIGlmICghU3VtKSB7CisgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBvcGVyYW5kLiBKdXN0IGV4cGFuZCBpdC4KKyAgICAgIFN1bSA9IGV4cGFuZChPcCk7CisgICAgICArK0k7CisgICAgfSBlbHNlIGlmIChjb25zdCBQb2ludGVyVHlwZSAqUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFN1bS0+Z2V0VHlwZSgpKSkgeworICAgICAgLy8gVGhlIHJ1bm5pbmcgc3VtIGV4cHJlc3Npb24gaXMgYSBwb2ludGVyLiBUcnkgdG8gZm9ybSBhIGdldGVsZW1lbnRwdHIKKyAgICAgIC8vIGF0IHRoaXMgbGV2ZWwgd2l0aCB0aGF0IGFzIHRoZSBiYXNlLgorICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiBOZXdPcHM7CisgICAgICBmb3IgKDsgSSAhPSBFICYmIEktPmZpcnN0ID09IEN1ckxvb3A7ICsrSSkgeworICAgICAgICAvLyBJZiB0aGUgb3BlcmFuZCBpcyBTQ0VWVW5rbm93biBhbmQgbm90IGluc3RydWN0aW9ucywgcGVlayB0aHJvdWdoCisgICAgICAgIC8vIGl0LCB0byBlbmFibGUgbW9yZSBvZiBpdCB0byBiZSBmb2xkZWQgaW50byB0aGUgR0VQLgorICAgICAgICBjb25zdCBTQ0VWICpYID0gSS0+c2Vjb25kOworICAgICAgICBpZiAoY29uc3QgU0NFVlVua25vd24gKlUgPSBkeW5fY2FzdDxTQ0VWVW5rbm93bj4oWCkpCisgICAgICAgICAgaWYgKCFpc2E8SW5zdHJ1Y3Rpb24+KFUtPmdldFZhbHVlKCkpKQorICAgICAgICAgICAgWCA9IFNFLmdldFNDRVYoVS0+Z2V0VmFsdWUoKSk7CisgICAgICAgIE5ld09wcy5wdXNoX2JhY2soWCk7CisgICAgICB9CisgICAgICBTdW0gPSBleHBhbmRBZGRUb0dFUChOZXdPcHMuYmVnaW4oKSwgTmV3T3BzLmVuZCgpLCBQVHksIFR5LCBTdW0pOworICAgIH0gZWxzZSBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlBUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihPcC0+Z2V0VHlwZSgpKSkgeworICAgICAgLy8gVGhlIHJ1bm5pbmcgc3VtIGlzIGFuIGludGVnZXIsIGFuZCB0aGVyZSdzIGEgcG9pbnRlciBhdCB0aGlzIGxldmVsLgorICAgICAgLy8gVHJ5IHRvIGZvcm0gYSBnZXRlbGVtZW50cHRyLiBJZiB0aGUgcnVubmluZyBzdW0gaXMgaW5zdHJ1Y3Rpb25zLAorICAgICAgLy8gdXNlIGEgU0NFVlVua25vd24gdG8gYXZvaWQgcmUtYW5hbHl6aW5nIHRoZW0uCisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE5ld09wczsKKyAgICAgIE5ld09wcy5wdXNoX2JhY2soaXNhPEluc3RydWN0aW9uPihTdW0pID8gU0UuZ2V0VW5rbm93bihTdW0pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UuZ2V0U0NFVihTdW0pKTsKKyAgICAgIGZvciAoKytJOyBJICE9IEUgJiYgSS0+Zmlyc3QgPT0gQ3VyTG9vcDsgKytJKQorICAgICAgICBOZXdPcHMucHVzaF9iYWNrKEktPnNlY29uZCk7CisgICAgICBTdW0gPSBleHBhbmRBZGRUb0dFUChOZXdPcHMuYmVnaW4oKSwgTmV3T3BzLmVuZCgpLCBQVHksIFR5LCBleHBhbmQoT3ApKTsKKyAgICB9IGVsc2UgaWYgKGlzTm9uQ29uc3RhbnROZWdhdGl2ZShPcCkpIHsKKyAgICAgIC8vIEluc3RlYWQgb2YgZG9pbmcgYSBuZWdhdGUgYW5kIGFkZCwganVzdCBkbyBhIHN1YnRyYWN0LgorICAgICAgVmFsdWUgKlcgPSBleHBhbmRDb2RlRm9yKFNFLmdldE5lZ2F0aXZlU0NFVihPcCksIFR5KTsKKyAgICAgIFN1bSA9IEluc2VydE5vb3BDYXN0T2ZUbyhTdW0sIFR5KTsKKyAgICAgIFN1bSA9IEluc2VydEJpbm9wKEluc3RydWN0aW9uOjpTdWIsIFN1bSwgVyk7CisgICAgICArK0k7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEEgc2ltcGxlIGFkZC4KKyAgICAgIFZhbHVlICpXID0gZXhwYW5kQ29kZUZvcihPcCwgVHkpOworICAgICAgU3VtID0gSW5zZXJ0Tm9vcENhc3RPZlRvKFN1bSwgVHkpOworICAgICAgLy8gQ2Fub25pY2FsaXplIGEgY29uc3RhbnQgdG8gdGhlIFJIUy4KKyAgICAgIGlmIChpc2E8Q29uc3RhbnQ+KFN1bSkpIHN0ZDo6c3dhcChTdW0sIFcpOworICAgICAgU3VtID0gSW5zZXJ0Qmlub3AoSW5zdHJ1Y3Rpb246OkFkZCwgU3VtLCBXKTsKKyAgICAgICsrSTsKKyAgICB9CisgIH0KKworICByZXR1cm4gU3VtOworfQorCitWYWx1ZSAqU0NFVkV4cGFuZGVyOjp2aXNpdE11bEV4cHIoY29uc3QgU0NFVk11bEV4cHIgKlMpIHsKKyAgY29uc3QgVHlwZSAqVHkgPSBTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShTLT5nZXRUeXBlKCkpOworCisgIC8vIENvbGxlY3QgYWxsIHRoZSBtdWwgb3BlcmFuZHMgaW4gYSBsb29wLCBhbG9uZyB3aXRoIHRoZWlyIGFzc29jaWF0ZWQgbG9vcHMuCisgIC8vIEl0ZXJhdGUgaW4gcmV2ZXJzZSBzbyB0aGF0IGNvbnN0YW50cyBhcmUgZW1pdHRlZCBsYXN0LCBhbGwgZWxzZSBlcXVhbC4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IExvb3AgKiwgY29uc3QgU0NFViAqPiwgOD4gT3BzQW5kTG9vcHM7CisgIGZvciAoc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPFNDRVZNdWxFeHByOjpvcF9pdGVyYXRvcj4gSShTLT5vcF9lbmQoKSksCisgICAgICAgRShTLT5vcF9iZWdpbigpKTsgSSAhPSBFOyArK0kpCisgICAgT3BzQW5kTG9vcHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEdldFJlbGV2YW50TG9vcCgqSSwgKlNFLkxJLCAqU0UuRFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSSkpOworCisgIC8vIFNvcnQgYnkgbG9vcC4gVXNlIGEgc3RhYmxlIHNvcnQgc28gdGhhdCBjb25zdGFudHMgZm9sbG93IG5vbi1jb25zdGFudHMuCisgIHN0ZDo6c3RhYmxlX3NvcnQoT3BzQW5kTG9vcHMuYmVnaW4oKSwgT3BzQW5kTG9vcHMuZW5kKCksIExvb3BDb21wYXJlKCpTRS5EVCkpOworCisgIC8vIEVtaXQgaW5zdHJ1Y3Rpb25zIHRvIG11bCBhbGwgdGhlIG9wZXJhbmRzLiBIb2lzdCBhcyBtdWNoIGFzIHBvc3NpYmxlCisgIC8vIG91dCBvZiBsb29wcy4KKyAgVmFsdWUgKlByb2QgPSAwOworICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8Y29uc3QgTG9vcCAqLCBjb25zdCBTQ0VWICo+ID46Oml0ZXJhdG9yCisgICAgICAgSSA9IE9wc0FuZExvb3BzLmJlZ2luKCksIEUgPSBPcHNBbmRMb29wcy5lbmQoKTsgSSAhPSBFOyApIHsKKyAgICBjb25zdCBTQ0VWICpPcCA9IEktPnNlY29uZDsKKyAgICBpZiAoIVByb2QpIHsKKyAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IG9wZXJhbmQuIEp1c3QgZXhwYW5kIGl0LgorICAgICAgUHJvZCA9IGV4cGFuZChPcCk7CisgICAgICArK0k7CisgICAgfSBlbHNlIGlmIChPcC0+aXNBbGxPbmVzVmFsdWUoKSkgeworICAgICAgLy8gSW5zdGVhZCBvZiBkb2luZyBhIG11bHRpcGx5IGJ5IG5lZ2F0aXZlIG9uZSwganVzdCBkbyBhIG5lZ2F0ZS4KKyAgICAgIFByb2QgPSBJbnNlcnROb29wQ2FzdE9mVG8oUHJvZCwgVHkpOworICAgICAgUHJvZCA9IEluc2VydEJpbm9wKEluc3RydWN0aW9uOjpTdWIsIENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpLCBQcm9kKTsKKyAgICAgICsrSTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQSBzaW1wbGUgbXVsLgorICAgICAgVmFsdWUgKlcgPSBleHBhbmRDb2RlRm9yKE9wLCBUeSk7CisgICAgICBQcm9kID0gSW5zZXJ0Tm9vcENhc3RPZlRvKFByb2QsIFR5KTsKKyAgICAgIC8vIENhbm9uaWNhbGl6ZSBhIGNvbnN0YW50IHRvIHRoZSBSSFMuCisgICAgICBpZiAoaXNhPENvbnN0YW50PihQcm9kKSkgc3RkOjpzd2FwKFByb2QsIFcpOworICAgICAgUHJvZCA9IEluc2VydEJpbm9wKEluc3RydWN0aW9uOjpNdWwsIFByb2QsIFcpOworICAgICAgKytJOworICAgIH0KKyAgfQorCisgIHJldHVybiBQcm9kOworfQorCitWYWx1ZSAqU0NFVkV4cGFuZGVyOjp2aXNpdFVEaXZFeHByKGNvbnN0IFNDRVZVRGl2RXhwciAqUykgeworICBjb25zdCBUeXBlICpUeSA9IFNFLmdldEVmZmVjdGl2ZVNDRVZUeXBlKFMtPmdldFR5cGUoKSk7CisKKyAgVmFsdWUgKkxIUyA9IGV4cGFuZENvZGVGb3IoUy0+Z2V0TEhTKCksIFR5KTsKKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqU0MgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KFMtPmdldFJIUygpKSkgeworICAgIGNvbnN0IEFQSW50ICZSSFMgPSBTQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgICBpZiAoUkhTLmlzUG93ZXJPZjIoKSkKKyAgICAgIHJldHVybiBJbnNlcnRCaW5vcChJbnN0cnVjdGlvbjo6TFNociwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHksIFJIUy5sb2dCYXNlMigpKSk7CisgIH0KKworICBWYWx1ZSAqUkhTID0gZXhwYW5kQ29kZUZvcihTLT5nZXRSSFMoKSwgVHkpOworICByZXR1cm4gSW5zZXJ0Qmlub3AoSW5zdHJ1Y3Rpb246OlVEaXYsIExIUywgUkhTKTsKK30KKworLy8vIE1vdmUgcGFydHMgb2YgQmFzZSBpbnRvIFJlc3QgdG8gbGVhdmUgQmFzZSB3aXRoIHRoZSBtaW5pbWFsCisvLy8gZXhwcmVzc2lvbiB0aGF0IHByb3ZpZGVzIGEgcG9pbnRlciBvcGVyYW5kIHN1aXRhYmxlIGZvciBhCisvLy8gR0VQIGV4cGFuc2lvbi4KK3N0YXRpYyB2b2lkIEV4cG9zZVBvaW50ZXJCYXNlKGNvbnN0IFNDRVYgKiZCYXNlLCBjb25zdCBTQ0VWIComUmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UpIHsKKyAgd2hpbGUgKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KEJhc2UpKSB7CisgICAgQmFzZSA9IEEtPmdldFN0YXJ0KCk7CisgICAgUmVzdCA9IFNFLmdldEFkZEV4cHIoUmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRS5nZXRBZGRSZWNFeHByKFNFLmdldENvbnN0YW50KEEtPmdldFR5cGUoKSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLT5nZXRTdGVwUmVjdXJyZW5jZShTRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLT5nZXRMb29wKCkpKTsKKyAgfQorICBpZiAoY29uc3QgU0NFVkFkZEV4cHIgKkEgPSBkeW5fY2FzdDxTQ0VWQWRkRXhwcj4oQmFzZSkpIHsKKyAgICBCYXNlID0gQS0+Z2V0T3BlcmFuZChBLT5nZXROdW1PcGVyYW5kcygpLTEpOworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgOD4gTmV3QWRkT3BzKEEtPm9wX2JlZ2luKCksIEEtPm9wX2VuZCgpKTsKKyAgICBOZXdBZGRPcHMuYmFjaygpID0gUmVzdDsKKyAgICBSZXN0ID0gU0UuZ2V0QWRkRXhwcihOZXdBZGRPcHMpOworICAgIEV4cG9zZVBvaW50ZXJCYXNlKEJhc2UsIFJlc3QsIFNFKTsKKyAgfQorfQorCisvLy8gZ2V0QWRkUmVjRXhwclBISUxpdGVyYWxseSAtIEhlbHBlciBmb3IgZXhwYW5kQWRkUmVjRXhwckxpdGVyYWxseS4gRXhwYW5kCisvLy8gdGhlIGJhc2UgYWRkcmVjLCB3aGljaCBpcyB0aGUgYWRkcmVjIHdpdGhvdXQgYW55IG5vbi1sb29wLWRvbWluYXRpbmcKKy8vLyB2YWx1ZXMsIGFuZCByZXR1cm4gdGhlIFBISS4KK1BISU5vZGUgKgorU0NFVkV4cGFuZGVyOjpnZXRBZGRSZWNFeHByUEhJTGl0ZXJhbGx5KGNvbnN0IFNDRVZBZGRSZWNFeHByICpOb3JtYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqRXhwYW5kVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqSW50VHkpIHsKKyAgLy8gUmV1c2UgYSBwcmV2aW91c2x5LWluc2VydGVkIFBISSwgaWYgcHJlc2VudC4KKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTC0+Z2V0SGVhZGVyKCktPmJlZ2luKCk7CisgICAgICAgUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJKTsgKytJKQorICAgIGlmIChTRS5pc1NDRVZhYmxlKFBOLT5nZXRUeXBlKCkpICYmCisgICAgICAgIChTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShQTi0+Z2V0VHlwZSgpKSA9PQorICAgICAgICAgU0UuZ2V0RWZmZWN0aXZlU0NFVlR5cGUoTm9ybWFsaXplZC0+Z2V0VHlwZSgpKSkgJiYKKyAgICAgICAgU0UuZ2V0U0NFVihQTikgPT0gTm9ybWFsaXplZCkKKyAgICAgIGlmIChCYXNpY0Jsb2NrICpMYXRjaEJsb2NrID0gTC0+Z2V0TG9vcExhdGNoKCkpIHsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gKkluY1YgPQorICAgICAgICAgIGNhc3Q8SW5zdHJ1Y3Rpb24+KFBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soTGF0Y2hCbG9jaykpOworCisgICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgd2VsbC1iZWhhdmVkIGNoYWluIG9mIGluc3RydWN0aW9ucyBsZWFkaW5nCisgICAgICAgIC8vIGJhY2sgdG8gdGhlIFBISS4gSXQgcHJvYmFibHkgd2lsbCBiZSwgaWYgd2UncmUgc2Nhbm5pbmcgYW4gaW5uZXIKKyAgICAgICAgLy8gbG9vcCBhbHJlYWR5IHZpc2l0ZWQgYnkgTFNSIGZvciBleGFtcGxlLCBidXQgaXQgd291bGRuJ3QgaGF2ZQorICAgICAgICAvLyB0byBiZS4KKyAgICAgICAgZG8geworICAgICAgICAgIGlmIChJbmNWLT5nZXROdW1PcGVyYW5kcygpID09IDAgfHwgaXNhPFBISU5vZGU+KEluY1YpKSB7CisgICAgICAgICAgICBJbmNWID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIG9wZXJhbmRzIGRvbid0IGRvbWluYXRlIHRoZSBpbnNlcnQgcG9zaXRpb24sIGJhaWwuCisgICAgICAgICAgLy8gQWRkcmVjIG9wZXJhbmRzIGFyZSBhbHdheXMgbG9vcC1pbnZhcmlhbnQsIHNvIHRoaXMgY2FuIG9ubHkgaGFwcGVuCisgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGluc3RydWN0aW9ucyB3aGljaCBoYXZlbid0IGJlZW4gaG9pc3RlZC4KKyAgICAgICAgICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIE9JID0gSW5jVi0+b3BfYmVnaW4oKSsxLAorICAgICAgICAgICAgICAgT0UgPSBJbmNWLT5vcF9lbmQoKTsgT0kgIT0gT0U7ICsrT0kpCisgICAgICAgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKk9JbnN0ID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KE9JKSkKKyAgICAgICAgICAgICAgaWYgKCFTRS5EVC0+ZG9taW5hdGVzKE9JbnN0LCBJVkluY0luc2VydFBvcykpIHsKKyAgICAgICAgICAgICAgICBJbmNWID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIGlmICghSW5jVikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgSW5jViA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihJbmNWLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgICBpZiAoIUluY1YpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoSW5jVi0+bWF5SGF2ZVNpZGVFZmZlY3RzKCkpIHsKKyAgICAgICAgICAgIEluY1YgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChJbmNWICE9IFBOKTsKKworICAgICAgICBpZiAoSW5jVikgeworICAgICAgICAgIC8vIE9rLCB0aGUgYWRkIHJlY3VycmVuY2UgbG9va3MgdXNhYmxlLgorICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgUEhJLCBldmVuIGluIHBvc3QtaW5jIG1vZGUuCisgICAgICAgICAgSW5zZXJ0ZWRWYWx1ZXMuaW5zZXJ0KFBOKTsKKyAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgaW5jcmVtZW50LgorICAgICAgICAgIEluY1YgPSBjYXN0PEluc3RydWN0aW9uPihQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKExhdGNoQmxvY2spKTsKKyAgICAgICAgICByZW1lbWJlckluc3RydWN0aW9uKEluY1YpOworICAgICAgICAgIGlmIChMID09IElWSW5jSW5zZXJ0TG9vcCkKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgaWYgKFNFLkRULT5kb21pbmF0ZXMoSW5jViwgSVZJbmNJbnNlcnRQb3MpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGluY3JlbWVudCBpcyB3aGVyZSB3ZSB3YW50IGl0LiBCdXQgZG9uJ3QgbW92ZSBpdAorICAgICAgICAgICAgICAvLyBkb3duIHBhc3QgYSBwb3RlbnRpYWwgZXhpc3RpbmcgcG9zdC1pbmMgdXNlci4KKyAgICAgICAgICAgICAgSW5jVi0+bW92ZUJlZm9yZShJVkluY0luc2VydFBvcyk7CisgICAgICAgICAgICAgIElWSW5jSW5zZXJ0UG9zID0gSW5jVjsKKyAgICAgICAgICAgICAgSW5jViA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KEluY1YtPmdldE9wZXJhbmQoMCkpOworICAgICAgICAgICAgfSB3aGlsZSAoSW5jViAhPSBQTik7CisgICAgICAgICAgcmV0dXJuIFBOOworICAgICAgICB9CisgICAgICB9CisKKyAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgaW5zZXJ0aW9uIHBvaW50IHNvIHdlIGNhbiByZXN0b3JlIGl0IHdoZW4gd2UncmUgZG9uZS4KKyAgQmFzaWNCbG9jayAqU2F2ZUluc2VydEJCID0gQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpOworICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTYXZlSW5zZXJ0UHQgPSBCdWlsZGVyLkdldEluc2VydFBvaW50KCk7CisKKyAgLy8gRXhwYW5kIGNvZGUgZm9yIHRoZSBzdGFydCB2YWx1ZS4KKyAgVmFsdWUgKlN0YXJ0ViA9IGV4cGFuZENvZGVGb3IoTm9ybWFsaXplZC0+Z2V0U3RhcnQoKSwgRXhwYW5kVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwtPmdldEhlYWRlcigpLT5iZWdpbigpKTsKKworICAvLyBFeHBhbmQgY29kZSBmb3IgdGhlIHN0ZXAgdmFsdWUuIEluc2VydCBpbnN0cnVjdGlvbnMgcmlnaHQgYmVmb3JlIHRoZQorICAvLyB0ZXJtaW5hdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJhY2stZWRnZS4gRG8gdGhpcyBiZWZvcmUgY3JlYXRpbmcgdGhlIFBISQorICAvLyBzbyB0aGF0IFBISSByZXVzZSBjb2RlIGRvZXNuJ3Qgc2VlIGFuIGluY29tcGxldGUgUEhJLiBJZiB0aGUgc3RyaWRlIGlzCisgIC8vIG5lZ2F0aXZlLCBpbnNlcnQgYSBzdWIgaW5zdGVhZCBvZiBhbiBhZGQgZm9yIHRoZSBpbmNyZW1lbnQgKHVubGVzcyBpdCdzIGEKKyAgLy8gY29uc3RhbnQsIGJlY2F1c2Ugc3VidHJhY3RzIG9mIGNvbnN0YW50cyBhcmUgY2Fub25pY2FsaXplZCB0byBhZGRzKS4KKyAgY29uc3QgU0NFViAqU3RlcCA9IE5vcm1hbGl6ZWQtPmdldFN0ZXBSZWN1cnJlbmNlKFNFKTsKKyAgYm9vbCBpc1BvaW50ZXIgPSBFeHBhbmRUeS0+aXNQb2ludGVyVHkoKTsKKyAgYm9vbCBpc05lZ2F0aXZlID0gIWlzUG9pbnRlciAmJiBpc05vbkNvbnN0YW50TmVnYXRpdmUoU3RlcCk7CisgIGlmIChpc05lZ2F0aXZlKQorICAgIFN0ZXAgPSBTRS5nZXROZWdhdGl2ZVNDRVYoU3RlcCk7CisgIFZhbHVlICpTdGVwViA9IGV4cGFuZENvZGVGb3IoU3RlcCwgSW50VHksIEwtPmdldEhlYWRlcigpLT5iZWdpbigpKTsKKworICAvLyBDcmVhdGUgdGhlIFBISS4KKyAgQnVpbGRlci5TZXRJbnNlcnRQb2ludChMLT5nZXRIZWFkZXIoKSwgTC0+Z2V0SGVhZGVyKCktPmJlZ2luKCkpOworICBQSElOb2RlICpQTiA9IEJ1aWxkZXIuQ3JlYXRlUEhJKEV4cGFuZFR5KTsKKyAgcmVtZW1iZXJJbnN0cnVjdGlvbihQTik7CisKKyAgLy8gQ3JlYXRlIHRoZSBzdGVwIGluc3RydWN0aW9ucyBhbmQgcG9wdWxhdGUgdGhlIFBISS4KKyAgQmFzaWNCbG9jayAqSGVhZGVyID0gTC0+Z2V0SGVhZGVyKCk7CisgIGZvciAocHJlZF9pdGVyYXRvciBIUEkgPSBwcmVkX2JlZ2luKEhlYWRlciksIEhQRSA9IHByZWRfZW5kKEhlYWRlcik7CisgICAgICAgSFBJICE9IEhQRTsgKytIUEkpIHsKKyAgICBCYXNpY0Jsb2NrICpQcmVkID0gKkhQSTsKKworICAgIC8vIEFkZCBhIHN0YXJ0IHZhbHVlLgorICAgIGlmICghTC0+Y29udGFpbnMoUHJlZCkpIHsKKyAgICAgIFBOLT5hZGRJbmNvbWluZyhTdGFydFYsIFByZWQpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgc3RlcCB2YWx1ZSBhbmQgYWRkIGl0IHRvIHRoZSBQSEkuIElmIElWSW5jSW5zZXJ0TG9vcCBpcworICAgIC8vIG5vbi1udWxsIGFuZCBlcXVhbCB0byB0aGUgYWRkcmVjJ3MgbG9vcCwgaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbnMKKyAgICAvLyBhdCBJVkluY0luc2VydFBvcy4KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0UG9zID0gTCA9PSBJVkluY0luc2VydExvb3AgPworICAgICAgSVZJbmNJbnNlcnRQb3MgOiBQcmVkLT5nZXRUZXJtaW5hdG9yKCk7CisgICAgQnVpbGRlci5TZXRJbnNlcnRQb2ludChJbnNlcnRQb3MtPmdldFBhcmVudCgpLCBJbnNlcnRQb3MpOworICAgIFZhbHVlICpJbmNWOworICAgIC8vIElmIHRoZSBQSEkgaXMgYSBwb2ludGVyLCB1c2UgYSBHRVAsIG90aGVyd2lzZSB1c2UgYW4gYWRkIG9yIHN1Yi4KKyAgICBpZiAoaXNQb2ludGVyKSB7CisgICAgICBjb25zdCBQb2ludGVyVHlwZSAqR0VQUHRyVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihFeHBhbmRUeSk7CisgICAgICAvLyBJZiB0aGUgc3RlcCBpc24ndCBjb25zdGFudCwgZG9uJ3QgdXNlIGFuIGltcGxpY2l0bHkgc2NhbGVkIEdFUCwgYmVjYXVzZQorICAgICAgLy8gdGhhdCB3b3VsZCByZXF1aXJlIGEgbXVsdGlwbHkgaW5zaWRlIHRoZSBsb29wLgorICAgICAgaWYgKCFpc2E8Q29uc3RhbnRJbnQ+KFN0ZXBWKSkKKyAgICAgICAgR0VQUHRyVHkgPSBQb2ludGVyVHlwZTo6Z2V0KFR5cGU6OmdldEludDFUeShTRS5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VQUHRyVHktPmdldEFkZHJlc3NTcGFjZSgpKTsKKyAgICAgIGNvbnN0IFNDRVYgKmNvbnN0IFN0ZXBBcnJheVsxXSA9IHsgU0UuZ2V0U0NFVihTdGVwVikgfTsKKyAgICAgIEluY1YgPSBleHBhbmRBZGRUb0dFUChTdGVwQXJyYXksIFN0ZXBBcnJheSsxLCBHRVBQdHJUeSwgSW50VHksIFBOKTsKKyAgICAgIGlmIChJbmNWLT5nZXRUeXBlKCkgIT0gUE4tPmdldFR5cGUoKSkgeworICAgICAgICBJbmNWID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KEluY1YsIFBOLT5nZXRUeXBlKCkpOworICAgICAgICByZW1lbWJlckluc3RydWN0aW9uKEluY1YpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBJbmNWID0gaXNOZWdhdGl2ZSA/CisgICAgICAgIEJ1aWxkZXIuQ3JlYXRlU3ViKFBOLCBTdGVwVikgOgorICAgICAgICBCdWlsZGVyLkNyZWF0ZUFkZChQTiwgU3RlcFYpOworICAgICAgcmVtZW1iZXJJbnN0cnVjdGlvbihJbmNWKTsKKyAgICB9CisgICAgUE4tPmFkZEluY29taW5nKEluY1YsIFByZWQpOworICB9CisKKyAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgaW5zZXJ0IHBvaW50LgorICBpZiAoU2F2ZUluc2VydEJCKQorICAgIHJlc3RvcmVJbnNlcnRQb2ludChTYXZlSW5zZXJ0QkIsIFNhdmVJbnNlcnRQdCk7CisKKyAgLy8gUmVtZW1iZXIgdGhpcyBQSEksIGV2ZW4gaW4gcG9zdC1pbmMgbW9kZS4KKyAgSW5zZXJ0ZWRWYWx1ZXMuaW5zZXJ0KFBOKTsKKworICByZXR1cm4gUE47Cit9CisKK1ZhbHVlICpTQ0VWRXhwYW5kZXI6OmV4cGFuZEFkZFJlY0V4cHJMaXRlcmFsbHkoY29uc3QgU0NFVkFkZFJlY0V4cHIgKlMpIHsKKyAgY29uc3QgVHlwZSAqU1R5ID0gUy0+Z2V0VHlwZSgpOworICBjb25zdCBUeXBlICpJbnRUeSA9IFNFLmdldEVmZmVjdGl2ZVNDRVZUeXBlKFNUeSk7CisgIGNvbnN0IExvb3AgKkwgPSBTLT5nZXRMb29wKCk7CisKKyAgLy8gRGV0ZXJtaW5lIGEgbm9ybWFsaXplZCBmb3JtIG9mIHRoaXMgZXhwcmVzc2lvbiwgd2hpY2ggaXMgdGhlIGV4cHJlc3Npb24KKyAgLy8gYmVmb3JlIGFueSBwb3N0LWluYyBhZGp1c3RtZW50IGlzIG1hZGUuCisgIGNvbnN0IFNDRVZBZGRSZWNFeHByICpOb3JtYWxpemVkID0gUzsKKyAgaWYgKFBvc3RJbmNMb29wcy5jb3VudChMKSkgeworICAgIFBvc3RJbmNMb29wU2V0IExvb3BzOworICAgIExvb3BzLmluc2VydChMKTsKKyAgICBOb3JtYWxpemVkID0KKyAgICAgIGNhc3Q8U0NFVkFkZFJlY0V4cHI+KFRyYW5zZm9ybUZvclBvc3RJbmNVc2UoTm9ybWFsaXplLCBTLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wcywgU0UsICpTRS5EVCkpOworICB9CisKKyAgLy8gU3RyaXAgb2ZmIGFueSBub24tbG9vcC1kb21pbmF0aW5nIGNvbXBvbmVudCBmcm9tIHRoZSBhZGRyZWMgc3RhcnQuCisgIGNvbnN0IFNDRVYgKlN0YXJ0ID0gTm9ybWFsaXplZC0+Z2V0U3RhcnQoKTsKKyAgY29uc3QgU0NFViAqUG9zdExvb3BPZmZzZXQgPSAwOworICBpZiAoIVN0YXJ0LT5wcm9wZXJseURvbWluYXRlcyhMLT5nZXRIZWFkZXIoKSwgU0UuRFQpKSB7CisgICAgUG9zdExvb3BPZmZzZXQgPSBTdGFydDsKKyAgICBTdGFydCA9IFNFLmdldENvbnN0YW50KE5vcm1hbGl6ZWQtPmdldFR5cGUoKSwgMCk7CisgICAgTm9ybWFsaXplZCA9CisgICAgICBjYXN0PFNDRVZBZGRSZWNFeHByPihTRS5nZXRBZGRSZWNFeHByKFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVkLT5nZXRTdGVwUmVjdXJyZW5jZShTRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZWQtPmdldExvb3AoKSkpOworICB9CisKKyAgLy8gU3RyaXAgb2ZmIGFueSBub24tbG9vcC1kb21pbmF0aW5nIGNvbXBvbmVudCBmcm9tIHRoZSBhZGRyZWMgc3RlcC4KKyAgY29uc3QgU0NFViAqU3RlcCA9IE5vcm1hbGl6ZWQtPmdldFN0ZXBSZWN1cnJlbmNlKFNFKTsKKyAgY29uc3QgU0NFViAqUG9zdExvb3BTY2FsZSA9IDA7CisgIGlmICghU3RlcC0+ZG9taW5hdGVzKEwtPmdldEhlYWRlcigpLCBTRS5EVCkpIHsKKyAgICBQb3N0TG9vcFNjYWxlID0gU3RlcDsKKyAgICBTdGVwID0gU0UuZ2V0Q29uc3RhbnQoTm9ybWFsaXplZC0+Z2V0VHlwZSgpLCAxKTsKKyAgICBOb3JtYWxpemVkID0KKyAgICAgIGNhc3Q8U0NFVkFkZFJlY0V4cHI+KFNFLmdldEFkZFJlY0V4cHIoU3RhcnQsIFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZWQtPmdldExvb3AoKSkpOworICB9CisKKyAgLy8gRXhwYW5kIHRoZSBjb3JlIGFkZHJlYy4gSWYgd2UgbmVlZCBwb3N0LWxvb3Agc2NhbGluZywgZm9yY2UgaXQgdG8KKyAgLy8gZXhwYW5kIHRvIGFuIGludGVnZXIgdHlwZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgYWRkaXRpb25hbCBjYXN0aW5nLgorICBjb25zdCBUeXBlICpFeHBhbmRUeSA9IFBvc3RMb29wU2NhbGUgPyBJbnRUeSA6IFNUeTsKKyAgUEhJTm9kZSAqUE4gPSBnZXRBZGRSZWNFeHByUEhJTGl0ZXJhbGx5KE5vcm1hbGl6ZWQsIEwsIEV4cGFuZFR5LCBJbnRUeSk7CisKKyAgLy8gQWNjb21tb2RhdGUgcG9zdC1pbmMgbW9kZSwgaWYgbmVjZXNzYXJ5LgorICBWYWx1ZSAqUmVzdWx0OworICBpZiAoIVBvc3RJbmNMb29wcy5jb3VudChMKSkKKyAgICBSZXN1bHQgPSBQTjsKKyAgZWxzZSB7CisgICAgLy8gSW4gUG9zdEluYyBtb2RlLCB1c2UgdGhlIHBvc3QtaW5jcmVtZW50ZWQgdmFsdWUuCisgICAgQmFzaWNCbG9jayAqTGF0Y2hCbG9jayA9IEwtPmdldExvb3BMYXRjaCgpOworICAgIGFzc2VydChMYXRjaEJsb2NrICYmICJQb3N0SW5jIG1vZGUgcmVxdWlyZXMgYSB1bmlxdWUgbG9vcCBsYXRjaCEiKTsKKyAgICBSZXN1bHQgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKExhdGNoQmxvY2spOworICB9CisKKyAgLy8gUmUtYXBwbHkgYW55IG5vbi1sb29wLWRvbWluYXRpbmcgc2NhbGUuCisgIGlmIChQb3N0TG9vcFNjYWxlKSB7CisgICAgUmVzdWx0ID0gSW5zZXJ0Tm9vcENhc3RPZlRvKFJlc3VsdCwgSW50VHkpOworICAgIFJlc3VsdCA9IEJ1aWxkZXIuQ3JlYXRlTXVsKFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRDb2RlRm9yKFBvc3RMb29wU2NhbGUsIEludFR5KSk7CisgICAgcmVtZW1iZXJJbnN0cnVjdGlvbihSZXN1bHQpOworICB9CisKKyAgLy8gUmUtYXBwbHkgYW55IG5vbi1sb29wLWRvbWluYXRpbmcgb2Zmc2V0LgorICBpZiAoUG9zdExvb3BPZmZzZXQpIHsKKyAgICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlBUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihFeHBhbmRUeSkpIHsKKyAgICAgIGNvbnN0IFNDRVYgKmNvbnN0IE9mZnNldEFycmF5WzFdID0geyBQb3N0TG9vcE9mZnNldCB9OworICAgICAgUmVzdWx0ID0gZXhwYW5kQWRkVG9HRVAoT2Zmc2V0QXJyYXksIE9mZnNldEFycmF5KzEsIFBUeSwgSW50VHksIFJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFJlc3VsdCA9IEluc2VydE5vb3BDYXN0T2ZUbyhSZXN1bHQsIEludFR5KTsKKyAgICAgIFJlc3VsdCA9IEJ1aWxkZXIuQ3JlYXRlQWRkKFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZENvZGVGb3IoUG9zdExvb3BPZmZzZXQsIEludFR5KSk7CisgICAgICByZW1lbWJlckluc3RydWN0aW9uKFJlc3VsdCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworVmFsdWUgKlNDRVZFeHBhbmRlcjo6dmlzaXRBZGRSZWNFeHByKGNvbnN0IFNDRVZBZGRSZWNFeHByICpTKSB7CisgIGlmICghQ2Fub25pY2FsTW9kZSkgcmV0dXJuIGV4cGFuZEFkZFJlY0V4cHJMaXRlcmFsbHkoUyk7CisKKyAgY29uc3QgVHlwZSAqVHkgPSBTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShTLT5nZXRUeXBlKCkpOworICBjb25zdCBMb29wICpMID0gUy0+Z2V0TG9vcCgpOworCisgIC8vIEZpcnN0IGNoZWNrIGZvciBhbiBleGlzdGluZyBjYW5vbmljYWwgSVYgaW4gYSBzdWl0YWJsZSB0eXBlLgorICBQSElOb2RlICpDYW5vbmljYWxJViA9IDA7CisgIGlmIChQSElOb2RlICpQTiA9IEwtPmdldENhbm9uaWNhbEluZHVjdGlvblZhcmlhYmxlKCkpCisgICAgaWYgKFNFLmdldFR5cGVTaXplSW5CaXRzKFBOLT5nZXRUeXBlKCkpID49IFNFLmdldFR5cGVTaXplSW5CaXRzKFR5KSkKKyAgICAgIENhbm9uaWNhbElWID0gUE47CisKKyAgLy8gUmV3cml0ZSBhbiBBZGRSZWMgaW4gdGVybXMgb2YgdGhlIGNhbm9uaWNhbCBpbmR1Y3Rpb24gdmFyaWFibGUsIGlmCisgIC8vIGl0cyB0eXBlIGlzIG1vcmUgbmFycm93LgorICBpZiAoQ2Fub25pY2FsSVYgJiYKKyAgICAgIFNFLmdldFR5cGVTaXplSW5CaXRzKENhbm9uaWNhbElWLT5nZXRUeXBlKCkpID4KKyAgICAgIFNFLmdldFR5cGVTaXplSW5CaXRzKFR5KSkgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gTmV3T3BzKFMtPmdldE51bU9wZXJhbmRzKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIE5ld09wc1tpXSA9IFNFLmdldEFueUV4dGVuZEV4cHIoUy0+b3BfYmVnaW4oKVtpXSwgQ2Fub25pY2FsSVYtPmdldFR5cGUoKSk7CisgICAgVmFsdWUgKlYgPSBleHBhbmQoU0UuZ2V0QWRkUmVjRXhwcihOZXdPcHMsIFMtPmdldExvb3AoKSkpOworICAgIEJhc2ljQmxvY2sgKlNhdmVJbnNlcnRCQiA9IEJ1aWxkZXIuR2V0SW5zZXJ0QmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTYXZlSW5zZXJ0UHQgPSBCdWlsZGVyLkdldEluc2VydFBvaW50KCk7CisgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgTmV3SW5zZXJ0UHQgPQorICAgICAgbGx2bTo6bmV4dChCYXNpY0Jsb2NrOjppdGVyYXRvcihjYXN0PEluc3RydWN0aW9uPihWKSkpOworICAgIHdoaWxlIChpc2E8UEhJTm9kZT4oTmV3SW5zZXJ0UHQpIHx8IElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhOZXdJbnNlcnRQdCkpCisgICAgICArK05ld0luc2VydFB0OworICAgIFYgPSBleHBhbmRDb2RlRm9yKFNFLmdldFRydW5jYXRlRXhwcihTRS5nZXRVbmtub3duKFYpLCBUeSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgTmV3SW5zZXJ0UHQpOworICAgIHJlc3RvcmVJbnNlcnRQb2ludChTYXZlSW5zZXJ0QkIsIFNhdmVJbnNlcnRQdCk7CisgICAgcmV0dXJuIFY7CisgIH0KKworICAvLyB7WCwrLEZ9IC0tPiBYICsgezAsKyxGfQorICBpZiAoIVMtPmdldFN0YXJ0KCktPmlzWmVybygpKSB7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiBOZXdPcHMoUy0+b3BfYmVnaW4oKSwgUy0+b3BfZW5kKCkpOworICAgIE5ld09wc1swXSA9IFNFLmdldENvbnN0YW50KFR5LCAwKTsKKyAgICBjb25zdCBTQ0VWICpSZXN0ID0gU0UuZ2V0QWRkUmVjRXhwcihOZXdPcHMsIEwpOworCisgICAgLy8gVHVybiB0aGluZ3MgbGlrZSBwdHJ0b2ludCthcml0aG1ldGljK2ludHRvcHRyIGludG8gR0VQLiBTZWUgdGhlCisgICAgLy8gY29tbWVudHMgb24gZXhwYW5kQWRkVG9HRVAgZm9yIGRldGFpbHMuCisgICAgY29uc3QgU0NFViAqQmFzZSA9IFMtPmdldFN0YXJ0KCk7CisgICAgY29uc3QgU0NFViAqUmVzdEFycmF5WzFdID0geyBSZXN0IH07CisgICAgLy8gRGlnIGludG8gdGhlIGV4cHJlc3Npb24gdG8gZmluZCB0aGUgcG9pbnRlciBiYXNlIGZvciBhIEdFUC4KKyAgICBFeHBvc2VQb2ludGVyQmFzZShCYXNlLCBSZXN0QXJyYXlbMF0sIFNFKTsKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIHBvaW50ZXIsIGV4cGFuZCB0aGUgQWRkUmVjIHdpdGggYSBHRVAuCisgICAgaWYgKGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oQmFzZS0+Z2V0VHlwZSgpKSkgeworICAgICAgLy8gTWFrZSBzdXJlIHRoZSBCYXNlIGlzbid0IHNvbWV0aGluZyBleG90aWMsIHN1Y2ggYXMgYSBtdWx0aXBsaWVkCisgICAgICAvLyBvciBkaXZpZGVkIHBvaW50ZXIgdmFsdWUuIEluIHRob3NlIGNhc2VzLCB0aGUgcmVzdWx0IHR5cGUgaXNuJ3QKKyAgICAgIC8vIGFjdHVhbGx5IGEgcG9pbnRlciB0eXBlLgorICAgICAgaWYgKCFpc2E8U0NFVk11bEV4cHI+KEJhc2UpICYmICFpc2E8U0NFVlVEaXZFeHByPihCYXNlKSkgeworICAgICAgICBWYWx1ZSAqU3RhcnRWID0gZXhwYW5kKEJhc2UpOworICAgICAgICBhc3NlcnQoU3RhcnRWLT5nZXRUeXBlKCkgPT0gUFR5ICYmICJQb2ludGVyIHR5cGUgbWlzbWF0Y2ggZm9yIEdFUCEiKTsKKyAgICAgICAgcmV0dXJuIGV4cGFuZEFkZFRvR0VQKFJlc3RBcnJheSwgUmVzdEFycmF5KzEsIFBUeSwgVHksIFN0YXJ0Vik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSnVzdCBkbyBhIG5vcm1hbCBhZGQuIFByZS1leHBhbmQgdGhlIG9wZXJhbmRzIHRvIHN1cHByZXNzIGZvbGRpbmcuCisgICAgcmV0dXJuIGV4cGFuZChTRS5nZXRBZGRFeHByKFNFLmdldFVua25vd24oZXhwYW5kKFMtPmdldFN0YXJ0KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UuZ2V0VW5rbm93bihleHBhbmQoUmVzdCkpKSk7CisgIH0KKworICAvLyBJZiB3ZSBkb24ndCB5ZXQgaGF2ZSBhIGNhbm9uaWNhbCBJViwgY3JlYXRlIG9uZS4KKyAgaWYgKCFDYW5vbmljYWxJVikgeworICAgIC8vIENyZWF0ZSBhbmQgaW5zZXJ0IHRoZSBQSEkgbm9kZSBmb3IgdGhlIGluZHVjdGlvbiB2YXJpYWJsZSBpbiB0aGUKKyAgICAvLyBzcGVjaWZpZWQgbG9vcC4KKyAgICBCYXNpY0Jsb2NrICpIZWFkZXIgPSBMLT5nZXRIZWFkZXIoKTsKKyAgICBDYW5vbmljYWxJViA9IFBISU5vZGU6OkNyZWF0ZShUeSwgSGVhZGVyLT5iZWdpbigpKTsKKyAgICByZW1lbWJlckluc3RydWN0aW9uKENhbm9uaWNhbElWKTsKKworICAgIENvbnN0YW50ICpPbmUgPSBDb25zdGFudEludDo6Z2V0KFR5LCAxKTsKKyAgICBmb3IgKHByZWRfaXRlcmF0b3IgSFBJID0gcHJlZF9iZWdpbihIZWFkZXIpLCBIUEUgPSBwcmVkX2VuZChIZWFkZXIpOworICAgICAgICAgSFBJICE9IEhQRTsgKytIUEkpIHsKKyAgICAgIEJhc2ljQmxvY2sgKkhQID0gKkhQSTsKKyAgICAgIGlmIChMLT5jb250YWlucyhIUCkpIHsKKyAgICAgICAgLy8gSW5zZXJ0IGEgdW5pdCBhZGQgaW5zdHJ1Y3Rpb24gcmlnaHQgYmVmb3JlIHRoZSB0ZXJtaW5hdG9yCisgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJhY2stZWRnZS4KKyAgICAgICAgSW5zdHJ1Y3Rpb24gKkFkZCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoQ2Fub25pY2FsSVYsIE9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFAtPmdldFRlcm1pbmF0b3IoKSk7CisgICAgICAgIHJlbWVtYmVySW5zdHJ1Y3Rpb24oQWRkKTsKKyAgICAgICAgQ2Fub25pY2FsSVYtPmFkZEluY29taW5nKEFkZCwgSFApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ2Fub25pY2FsSVYtPmFkZEluY29taW5nKENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpLCBIUCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gezAsKywxfSAtLT4gSW5zZXJ0IGEgY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZSBpbnRvIHRoZSBsb29wIQorICBpZiAoUy0+aXNBZmZpbmUoKSAmJiBTLT5nZXRPcGVyYW5kKDEpLT5pc09uZSgpKSB7CisgICAgYXNzZXJ0KFR5ID09IFNFLmdldEVmZmVjdGl2ZVNDRVZUeXBlKENhbm9uaWNhbElWLT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICJJVnMgd2l0aCB0eXBlcyBkaWZmZXJlbnQgZnJvbSB0aGUgY2Fub25pY2FsIElWIHNob3VsZCAiCisgICAgICAgICAgICJhbHJlYWR5IGhhdmUgYmVlbiBoYW5kbGVkISIpOworICAgIHJldHVybiBDYW5vbmljYWxJVjsKKyAgfQorCisgIC8vIHswLCssRn0gLS0+IHswLCssMX0gKiBGCisKKyAgLy8gSWYgdGhpcyBpcyBhIHNpbXBsZSBsaW5lYXIgYWRkcmVjLCBlbWl0IGl0IG5vdyBhcyBhIHNwZWNpYWwgY2FzZS4KKyAgaWYgKFMtPmlzQWZmaW5lKCkpICAgIC8vIHswLCssRn0gLS0+IGkqRgorICAgIHJldHVybgorICAgICAgZXhwYW5kKFNFLmdldFRydW5jYXRlT3JOb29wKAorICAgICAgICBTRS5nZXRNdWxFeHByKFNFLmdldFVua25vd24oQ2Fub25pY2FsSVYpLAorICAgICAgICAgICAgICAgICAgICAgIFNFLmdldE5vb3BPckFueUV4dGVuZChTLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5vbmljYWxJVi0+Z2V0VHlwZSgpKSksCisgICAgICAgIFR5KSk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIGNoYWluIG9mIHJlY3VycmVuY2VzLCB0dXJuIGl0IGludG8gYSBjbG9zZWQgZm9ybSwgdXNpbmcgdGhlCisgIC8vIGZvbGRlcnMsIHRoZW4gZXhwYW5kQ29kZUZvciB0aGUgY2xvc2VkIGZvcm0uICBUaGlzIGFsbG93cyB0aGUgZm9sZGVycyB0bworICAvLyBzaW1wbGlmeSB0aGUgZXhwcmVzc2lvbiB3aXRob3V0IGhhdmluZyB0byBidWlsZCBhIGJ1bmNoIG9mIHNwZWNpYWwgY29kZQorICAvLyBpbnRvIHRoaXMgZm9sZGVyLgorICBjb25zdCBTQ0VWICpJSCA9IFNFLmdldFVua25vd24oQ2Fub25pY2FsSVYpOyAgIC8vIEdldCBJIGFzIGEgInN5bWJvbGljIiBTQ0VWLgorCisgIC8vIFByb21vdGUgUyB1cCB0byB0aGUgY2Fub25pY2FsIElWIHR5cGUsIGlmIHRoZSBjYXN0IGlzIGZvbGRhYmxlLgorICBjb25zdCBTQ0VWICpOZXdTID0gUzsKKyAgY29uc3QgU0NFViAqRXh0ID0gU0UuZ2V0Tm9vcE9yQW55RXh0ZW5kKFMsIENhbm9uaWNhbElWLT5nZXRUeXBlKCkpOworICBpZiAoaXNhPFNDRVZBZGRSZWNFeHByPihFeHQpKQorICAgIE5ld1MgPSBFeHQ7CisKKyAgY29uc3QgU0NFViAqViA9IGNhc3Q8U0NFVkFkZFJlY0V4cHI+KE5ld1MpLT5ldmFsdWF0ZUF0SXRlcmF0aW9uKElILCBTRSk7CisgIC8vY2VyciA8PCAiRXZhbHVhdGVkOiAiIDw8ICp0aGlzIDw8ICJcbiAgICAgdG86ICIgPDwgKlYgPDwgIlxuIjsKKworICAvLyBUcnVuY2F0ZSB0aGUgcmVzdWx0IGRvd24gdG8gdGhlIG9yaWdpbmFsIHR5cGUsIGlmIG5lZWRlZC4KKyAgY29uc3QgU0NFViAqVCA9IFNFLmdldFRydW5jYXRlT3JOb29wKFYsIFR5KTsKKyAgcmV0dXJuIGV4cGFuZChUKTsKK30KKworVmFsdWUgKlNDRVZFeHBhbmRlcjo6dmlzaXRUcnVuY2F0ZUV4cHIoY29uc3QgU0NFVlRydW5jYXRlRXhwciAqUykgeworICBjb25zdCBUeXBlICpUeSA9IFNFLmdldEVmZmVjdGl2ZVNDRVZUeXBlKFMtPmdldFR5cGUoKSk7CisgIFZhbHVlICpWID0gZXhwYW5kQ29kZUZvcihTLT5nZXRPcGVyYW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShTLT5nZXRPcGVyYW5kKCktPmdldFR5cGUoKSkpOworICBWYWx1ZSAqSSA9IEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoViwgVHkpOworICByZW1lbWJlckluc3RydWN0aW9uKEkpOworICByZXR1cm4gSTsKK30KKworVmFsdWUgKlNDRVZFeHBhbmRlcjo6dmlzaXRaZXJvRXh0ZW5kRXhwcihjb25zdCBTQ0VWWmVyb0V4dGVuZEV4cHIgKlMpIHsKKyAgY29uc3QgVHlwZSAqVHkgPSBTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShTLT5nZXRUeXBlKCkpOworICBWYWx1ZSAqViA9IGV4cGFuZENvZGVGb3IoUy0+Z2V0T3BlcmFuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UuZ2V0RWZmZWN0aXZlU0NFVlR5cGUoUy0+Z2V0T3BlcmFuZCgpLT5nZXRUeXBlKCkpKTsKKyAgVmFsdWUgKkkgPSBCdWlsZGVyLkNyZWF0ZVpFeHQoViwgVHkpOworICByZW1lbWJlckluc3RydWN0aW9uKEkpOworICByZXR1cm4gSTsKK30KKworVmFsdWUgKlNDRVZFeHBhbmRlcjo6dmlzaXRTaWduRXh0ZW5kRXhwcihjb25zdCBTQ0VWU2lnbkV4dGVuZEV4cHIgKlMpIHsKKyAgY29uc3QgVHlwZSAqVHkgPSBTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShTLT5nZXRUeXBlKCkpOworICBWYWx1ZSAqViA9IGV4cGFuZENvZGVGb3IoUy0+Z2V0T3BlcmFuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UuZ2V0RWZmZWN0aXZlU0NFVlR5cGUoUy0+Z2V0T3BlcmFuZCgpLT5nZXRUeXBlKCkpKTsKKyAgVmFsdWUgKkkgPSBCdWlsZGVyLkNyZWF0ZVNFeHQoViwgVHkpOworICByZW1lbWJlckluc3RydWN0aW9uKEkpOworICByZXR1cm4gSTsKK30KKworVmFsdWUgKlNDRVZFeHBhbmRlcjo6dmlzaXRTTWF4RXhwcihjb25zdCBTQ0VWU01heEV4cHIgKlMpIHsKKyAgVmFsdWUgKkxIUyA9IGV4cGFuZChTLT5nZXRPcGVyYW5kKFMtPmdldE51bU9wZXJhbmRzKCktMSkpOworICBjb25zdCBUeXBlICpUeSA9IExIUy0+Z2V0VHlwZSgpOworICBmb3IgKGludCBpID0gUy0+Z2V0TnVtT3BlcmFuZHMoKS0yOyBpID49IDA7IC0taSkgeworICAgIC8vIEluIHRoZSBjYXNlIG9mIG1peGVkIGludGVnZXIgYW5kIHBvaW50ZXIgdHlwZXMsIGRvIHRoZQorICAgIC8vIHJlc3Qgb2YgdGhlIGNvbXBhcmlzb25zIGFzIGludGVnZXIuCisgICAgaWYgKFMtPmdldE9wZXJhbmQoaSktPmdldFR5cGUoKSAhPSBUeSkgeworICAgICAgVHkgPSBTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShUeSk7CisgICAgICBMSFMgPSBJbnNlcnROb29wQ2FzdE9mVG8oTEhTLCBUeSk7CisgICAgfQorICAgIFZhbHVlICpSSFMgPSBleHBhbmRDb2RlRm9yKFMtPmdldE9wZXJhbmQoaSksIFR5KTsKKyAgICBWYWx1ZSAqSUNtcCA9IEJ1aWxkZXIuQ3JlYXRlSUNtcFNHVChMSFMsIFJIUyk7CisgICAgcmVtZW1iZXJJbnN0cnVjdGlvbihJQ21wKTsKKyAgICBWYWx1ZSAqU2VsID0gQnVpbGRlci5DcmVhdGVTZWxlY3QoSUNtcCwgTEhTLCBSSFMpOworICAgIHJlbWVtYmVySW5zdHJ1Y3Rpb24oU2VsKTsKKyAgICBMSFMgPSBTZWw7CisgIH0KKyAgLy8gSW4gdGhlIGNhc2Ugb2YgbWl4ZWQgaW50ZWdlciBhbmQgcG9pbnRlciB0eXBlcywgY2FzdCB0aGUKKyAgLy8gZmluYWwgcmVzdWx0IGJhY2sgdG8gdGhlIHBvaW50ZXIgdHlwZS4KKyAgaWYgKExIUy0+Z2V0VHlwZSgpICE9IFMtPmdldFR5cGUoKSkKKyAgICBMSFMgPSBJbnNlcnROb29wQ2FzdE9mVG8oTEhTLCBTLT5nZXRUeXBlKCkpOworICByZXR1cm4gTEhTOworfQorCitWYWx1ZSAqU0NFVkV4cGFuZGVyOjp2aXNpdFVNYXhFeHByKGNvbnN0IFNDRVZVTWF4RXhwciAqUykgeworICBWYWx1ZSAqTEhTID0gZXhwYW5kKFMtPmdldE9wZXJhbmQoUy0+Z2V0TnVtT3BlcmFuZHMoKS0xKSk7CisgIGNvbnN0IFR5cGUgKlR5ID0gTEhTLT5nZXRUeXBlKCk7CisgIGZvciAoaW50IGkgPSBTLT5nZXROdW1PcGVyYW5kcygpLTI7IGkgPj0gMDsgLS1pKSB7CisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbWl4ZWQgaW50ZWdlciBhbmQgcG9pbnRlciB0eXBlcywgZG8gdGhlCisgICAgLy8gcmVzdCBvZiB0aGUgY29tcGFyaXNvbnMgYXMgaW50ZWdlci4KKyAgICBpZiAoUy0+Z2V0T3BlcmFuZChpKS0+Z2V0VHlwZSgpICE9IFR5KSB7CisgICAgICBUeSA9IFNFLmdldEVmZmVjdGl2ZVNDRVZUeXBlKFR5KTsKKyAgICAgIExIUyA9IEluc2VydE5vb3BDYXN0T2ZUbyhMSFMsIFR5KTsKKyAgICB9CisgICAgVmFsdWUgKlJIUyA9IGV4cGFuZENvZGVGb3IoUy0+Z2V0T3BlcmFuZChpKSwgVHkpOworICAgIFZhbHVlICpJQ21wID0gQnVpbGRlci5DcmVhdGVJQ21wVUdUKExIUywgUkhTKTsKKyAgICByZW1lbWJlckluc3RydWN0aW9uKElDbXApOworICAgIFZhbHVlICpTZWwgPSBCdWlsZGVyLkNyZWF0ZVNlbGVjdChJQ21wLCBMSFMsIFJIUyk7CisgICAgcmVtZW1iZXJJbnN0cnVjdGlvbihTZWwpOworICAgIExIUyA9IFNlbDsKKyAgfQorICAvLyBJbiB0aGUgY2FzZSBvZiBtaXhlZCBpbnRlZ2VyIGFuZCBwb2ludGVyIHR5cGVzLCBjYXN0IHRoZQorICAvLyBmaW5hbCByZXN1bHQgYmFjayB0byB0aGUgcG9pbnRlciB0eXBlLgorICBpZiAoTEhTLT5nZXRUeXBlKCkgIT0gUy0+Z2V0VHlwZSgpKQorICAgIExIUyA9IEluc2VydE5vb3BDYXN0T2ZUbyhMSFMsIFMtPmdldFR5cGUoKSk7CisgIHJldHVybiBMSFM7Cit9CisKK1ZhbHVlICpTQ0VWRXhwYW5kZXI6OmV4cGFuZENvZGVGb3IoY29uc3QgU0NFViAqU0gsIGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSSkgeworICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCA9IEk7CisgIHdoaWxlIChpc0luc2VydGVkSW5zdHJ1Y3Rpb24oSVApIHx8IElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJUCkpCisgICAgKytJUDsKKyAgQnVpbGRlci5TZXRJbnNlcnRQb2ludChJUC0+Z2V0UGFyZW50KCksIElQKTsKKyAgcmV0dXJuIGV4cGFuZENvZGVGb3IoU0gsIFR5KTsKK30KKworVmFsdWUgKlNDRVZFeHBhbmRlcjo6ZXhwYW5kQ29kZUZvcihjb25zdCBTQ0VWICpTSCwgY29uc3QgVHlwZSAqVHkpIHsKKyAgLy8gRXhwYW5kIHRoZSBjb2RlIGZvciB0aGlzIFNDRVYuCisgIFZhbHVlICpWID0gZXhwYW5kKFNIKTsKKyAgaWYgKFR5KSB7CisgICAgYXNzZXJ0KFNFLmdldFR5cGVTaXplSW5CaXRzKFR5KSA9PSBTRS5nZXRUeXBlU2l6ZUluQml0cyhTSC0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgICAibm9uLXRyaXZpYWwgY2FzdHMgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGUgU0NFVnMgZGlyZWN0bHkhIik7CisgICAgViA9IEluc2VydE5vb3BDYXN0T2ZUbyhWLCBUeSk7CisgIH0KKyAgcmV0dXJuIFY7Cit9CisKK1ZhbHVlICpTQ0VWRXhwYW5kZXI6OmV4cGFuZChjb25zdCBTQ0VWICpTKSB7CisgIC8vIENvbXB1dGUgYW4gaW5zZXJ0aW9uIHBvaW50IGZvciB0aGlzIFNDRVYgb2JqZWN0LiBIb2lzdCB0aGUgaW5zdHJ1Y3Rpb25zCisgIC8vIGFzIGZhciBvdXQgaW4gdGhlIGxvb3AgbmVzdCBhcyBwb3NzaWJsZS4KKyAgSW5zdHJ1Y3Rpb24gKkluc2VydFB0ID0gQnVpbGRlci5HZXRJbnNlcnRQb2ludCgpOworICBmb3IgKExvb3AgKkwgPSBTRS5MSS0+Z2V0TG9vcEZvcihCdWlsZGVyLkdldEluc2VydEJsb2NrKCkpOyA7CisgICAgICAgTCA9IEwtPmdldFBhcmVudExvb3AoKSkKKyAgICBpZiAoUy0+aXNMb29wSW52YXJpYW50KEwpKSB7CisgICAgICBpZiAoIUwpIGJyZWFrOworICAgICAgaWYgKEJhc2ljQmxvY2sgKlByZWhlYWRlciA9IEwtPmdldExvb3BQcmVoZWFkZXIoKSkKKyAgICAgICAgSW5zZXJ0UHQgPSBQcmVoZWFkZXItPmdldFRlcm1pbmF0b3IoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgdGhlIFNDRVYgaXMgY29tcHV0YWJsZSBhdCB0aGlzIGxldmVsLCBpbnNlcnQgaXQgaW50byB0aGUgaGVhZGVyCisgICAgICAvLyBhZnRlciB0aGUgUEhJcyAoYW5kIGFmdGVyIGFueSBvdGhlciBpbnN0cnVjdGlvbnMgdGhhdCB3ZSd2ZSBpbnNlcnRlZAorICAgICAgLy8gdGhlcmUpIHNvIHRoYXQgaXQgaXMgZ3VhcmFudGVlZCB0byBkb21pbmF0ZSBhbnkgdXNlciBpbnNpZGUgdGhlIGxvb3AuCisgICAgICBpZiAoTCAmJiBTLT5oYXNDb21wdXRhYmxlTG9vcEV2b2x1dGlvbihMKSAmJiAhUG9zdEluY0xvb3BzLmNvdW50KEwpKQorICAgICAgICBJbnNlcnRQdCA9IEwtPmdldEhlYWRlcigpLT5nZXRGaXJzdE5vblBISSgpOworICAgICAgd2hpbGUgKGlzSW5zZXJ0ZWRJbnN0cnVjdGlvbihJbnNlcnRQdCkgfHwgSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEluc2VydFB0KSkKKyAgICAgICAgSW5zZXJ0UHQgPSBsbHZtOjpuZXh0KEJhc2ljQmxvY2s6Oml0ZXJhdG9yKEluc2VydFB0KSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgZXhwYW5kZWQgdGhpcyBoZXJlLgorICBzdGQ6Om1hcDxzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLCBJbnN0cnVjdGlvbiAqPiwKKyAgICAgICAgICAgQXNzZXJ0aW5nVkg8VmFsdWU+ID46Oml0ZXJhdG9yIEkgPQorICAgIEluc2VydGVkRXhwcmVzc2lvbnMuZmluZChzdGQ6Om1ha2VfcGFpcihTLCBJbnNlcnRQdCkpOworICBpZiAoSSAhPSBJbnNlcnRlZEV4cHJlc3Npb25zLmVuZCgpKQorICAgIHJldHVybiBJLT5zZWNvbmQ7CisKKyAgQmFzaWNCbG9jayAqU2F2ZUluc2VydEJCID0gQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpOworICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTYXZlSW5zZXJ0UHQgPSBCdWlsZGVyLkdldEluc2VydFBvaW50KCk7CisgIEJ1aWxkZXIuU2V0SW5zZXJ0UG9pbnQoSW5zZXJ0UHQtPmdldFBhcmVudCgpLCBJbnNlcnRQdCk7CisKKyAgLy8gRXhwYW5kIHRoZSBleHByZXNzaW9uIGludG8gaW5zdHJ1Y3Rpb25zLgorICBWYWx1ZSAqViA9IHZpc2l0KFMpOworCisgIC8vIFJlbWVtYmVyIHRoZSBleHBhbmRlZCB2YWx1ZSBmb3IgdGhpcyBTQ0VWIGF0IHRoaXMgbG9jYXRpb24uCisgIGlmIChQb3N0SW5jTG9vcHMuZW1wdHkoKSkKKyAgICBJbnNlcnRlZEV4cHJlc3Npb25zW3N0ZDo6bWFrZV9wYWlyKFMsIEluc2VydFB0KV0gPSBWOworCisgIHJlc3RvcmVJbnNlcnRQb2ludChTYXZlSW5zZXJ0QkIsIFNhdmVJbnNlcnRQdCk7CisgIHJldHVybiBWOworfQorCit2b2lkIFNDRVZFeHBhbmRlcjo6cmVtZW1iZXJJbnN0cnVjdGlvbihWYWx1ZSAqSSkgeworICBpZiAoIVBvc3RJbmNMb29wcy5lbXB0eSgpKQorICAgIEluc2VydGVkUG9zdEluY1ZhbHVlcy5pbnNlcnQoSSk7CisgIGVsc2UKKyAgICBJbnNlcnRlZFZhbHVlcy5pbnNlcnQoSSk7CisKKyAgLy8gSWYgd2UganVzdCBjbGFpbWVkIGFuIGV4aXN0aW5nIGluc3RydWN0aW9uIGFuZCB0aGF0IGluc3RydWN0aW9uIGhhZAorICAvLyBiZWVuIHRoZSBpbnNlcnQgcG9pbnQsIGFkanVzdCB0aGUgaW5zZXJ0IHBvaW50IGZvcndhcmQgc28gdGhhdCAKKyAgLy8gc3Vic2VxdWVudGx5IGluc2VydGVkIGNvZGUgd2lsbCBiZSBkb21pbmF0ZWQuCisgIGlmIChCdWlsZGVyLkdldEluc2VydFBvaW50KCkgPT0gSSkgeworICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEl0ID0gY2FzdDxJbnN0cnVjdGlvbj4oSSk7CisgICAgZG8geyArK0l0OyB9IHdoaWxlIChpc0luc2VydGVkSW5zdHJ1Y3Rpb24oSXQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoSXQpKTsKKyAgICBCdWlsZGVyLlNldEluc2VydFBvaW50KEJ1aWxkZXIuR2V0SW5zZXJ0QmxvY2soKSwgSXQpOworICB9Cit9CisKK3ZvaWQgU0NFVkV4cGFuZGVyOjpyZXN0b3JlSW5zZXJ0UG9pbnQoQmFzaWNCbG9jayAqQkIsIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsKKyAgLy8gSWYgd2UgYWNxdWlyZWQgbW9yZSBpbnN0cnVjdGlvbnMgc2luY2UgdGhlIG9sZCBpbnNlcnQgcG9pbnQgd2FzIHNhdmVkLAorICAvLyBhZHZhbmNlIHBhc3QgdGhlbS4KKyAgd2hpbGUgKGlzSW5zZXJ0ZWRJbnN0cnVjdGlvbihJKSB8fCBJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoSSkpICsrSTsKKworICBCdWlsZGVyLlNldEluc2VydFBvaW50KEJCLCBJKTsKK30KKworLy8vIGdldE9ySW5zZXJ0Q2Fub25pY2FsSW5kdWN0aW9uVmFyaWFibGUgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZQorLy8vIGNhbm9uaWNhbCBpbmR1Y3Rpb24gdmFyaWFibGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGZvciB0aGUgc3BlY2lmaWVkCisvLy8gbG9vcCAoaW5zZXJ0aW5nIG9uZSBpZiB0aGVyZSBpcyBub25lKS4gIEEgY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZQorLy8vIHN0YXJ0cyBhdCB6ZXJvIGFuZCBzdGVwcyBieSBvbmUgb24gZWFjaCBpdGVyYXRpb24uCitQSElOb2RlICoKK1NDRVZFeHBhbmRlcjo6Z2V0T3JJbnNlcnRDYW5vbmljYWxJbmR1Y3Rpb25WYXJpYWJsZShjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIGFzc2VydChUeS0+aXNJbnRlZ2VyVHkoKSAmJiAiQ2FuIG9ubHkgaW5zZXJ0IGludGVnZXIgaW5kdWN0aW9uIHZhcmlhYmxlcyEiKTsKKworICAvLyBCdWlsZCBhIFNDRVYgZm9yIHswLCssMX08TD4uCisgIGNvbnN0IFNDRVYgKkggPSBTRS5nZXRBZGRSZWNFeHByKFNFLmdldENvbnN0YW50KFR5LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UuZ2V0Q29uc3RhbnQoVHksIDEpLCBMKTsKKworICAvLyBFbWl0IGNvZGUgZm9yIGl0LgorICBCYXNpY0Jsb2NrICpTYXZlSW5zZXJ0QkIgPSBCdWlsZGVyLkdldEluc2VydEJsb2NrKCk7CisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIFNhdmVJbnNlcnRQdCA9IEJ1aWxkZXIuR2V0SW5zZXJ0UG9pbnQoKTsKKyAgUEhJTm9kZSAqViA9IGNhc3Q8UEhJTm9kZT4oZXhwYW5kQ29kZUZvcihILCAwLCBMLT5nZXRIZWFkZXIoKS0+YmVnaW4oKSkpOworICBpZiAoU2F2ZUluc2VydEJCKQorICAgIHJlc3RvcmVJbnNlcnRQb2ludChTYXZlSW5zZXJ0QkIsIFNhdmVJbnNlcnRQdCk7CisKKyAgcmV0dXJuIFY7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5jcHAgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4Mzg3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25Ob3JtYWxpemF0aW9uLmNwcApAQCAtMCwwICsxLDE3OCBAQAorLy89PT0tIFNjYWxhckV2b2x1dGlvbk5vcm1hbGl6YXRpb24uY3BwIC0gU2VlIGJlbG93IC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCAibm9ybWFsaXplZCIgZXhwcmVzc2lvbnMuCisvLyBTZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5oIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBJVlVzZVNob3VsZFVzZVBvc3RJbmNWYWx1ZSAtIFdlIGhhdmUgZGlzY292ZXJlZCBhICJVc2VyIiBvZiBhbiBJViBleHByZXNzaW9uCisvLy8gYW5kIG5vdyB3ZSBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCB1c2UgdGhlIHByZWluYyBvciBwb3N0LWluYworLy8vIHZhbHVlLiAgSWYgdGhpcyB1c2VyIHNob3VsZCB1c2UgdGhlIHBvc3QtaW5jIHZlcnNpb24gb2YgdGhlIElWLCByZXR1cm4gdHJ1ZS4KKy8vLworLy8vIENob29zaW5nIHdyb25nIGhlcmUgY2FuIGJyZWFrIGRvbWluYW5jZSBwcm9wZXJ0aWVzIChpZiB3ZSBjaG9vc2UgdG8gdXNlIHRoZQorLy8vIHBvc3QtaW5jIHZhbHVlIHdoZW4gd2UgY2Fubm90KSBvciBpdCBjYW4gZW5kIHVwIGFkZGluZyBleHRyYSBsaXZlLXJhbmdlcyB0bworLy8vIHRoZSBsb29wLCByZXN1bHRpbmcgaW4gcmVnLXJlZyBjb3BpZXMgKGlmIHdlIHVzZSB0aGUgcHJlLWluYyB2YWx1ZSB3aGVuIHdlCisvLy8gc2hvdWxkIHVzZSB0aGUgcG9zdC1pbmMgdmFsdWUpLgorc3RhdGljIGJvb2wgSVZVc2VTaG91bGRVc2VQb3N0SW5jVmFsdWUoSW5zdHJ1Y3Rpb24gKlVzZXIsIFZhbHVlICpPcGVyYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwgRG9taW5hdG9yVHJlZSAqRFQpIHsKKyAgLy8gSWYgdGhlIHVzZXIgaXMgaW4gdGhlIGxvb3AsIHVzZSB0aGUgcHJlaW5jIHZhbHVlLgorICBpZiAoTC0+Y29udGFpbnMoVXNlcikpIHJldHVybiBmYWxzZTsKKworICBCYXNpY0Jsb2NrICpMYXRjaEJsb2NrID0gTC0+Z2V0TG9vcExhdGNoKCk7CisgIGlmICghTGF0Y2hCbG9jaykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gT2ssIHRoZSB1c2VyIGlzIG91dHNpZGUgb2YgdGhlIGxvb3AuICBJZiBpdCBpcyBkb21pbmF0ZWQgYnkgdGhlIGxhdGNoCisgIC8vIGJsb2NrLCB1c2UgdGhlIHBvc3QtaW5jIHZhbHVlLgorICBpZiAoRFQtPmRvbWluYXRlcyhMYXRjaEJsb2NrLCBVc2VyLT5nZXRQYXJlbnQoKSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gVGhlcmUgaXMgb25lIGNhc2Ugd2UgaGF2ZSB0byBiZSBjYXJlZnVsIG9mOiBQSEkgbm9kZXMuICBUaGVzZSBsaXR0bGUgZ3V5cworICAvLyBjYW4gbGl2ZSBpbiBibG9ja3MgdGhhdCBhcmUgbm90IGRvbWluYXRlZCBieSB0aGUgbGF0Y2ggYmxvY2ssIGJ1dCAoc2luY2UKKyAgLy8gdGhlaXIgdXNlcyBvY2N1ciBpbiB0aGUgcHJlZGVjZXNzb3IgYmxvY2ssIG5vdCB0aGUgYmxvY2sgdGhlIFBISSBsaXZlcyBpbikKKyAgLy8gc2hvdWxkIHN0aWxsIHVzZSB0aGUgcG9zdC1pbmMgdmFsdWUuICBDaGVjayBmb3IgdGhpcyBjYXNlIG5vdy4KKyAgUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihVc2VyKTsKKyAgaWYgKCFQTiB8fCAhT3BlcmFuZCkgcmV0dXJuIGZhbHNlOyAvLyBub3QgYSBwaGksIG5vdCBkb21pbmF0ZWQgYnkgbGF0Y2ggYmxvY2suCisKKyAgLy8gTG9vayBhdCBhbGwgb2YgdGhlIHVzZXMgb2YgT3BlcmFuZCBieSB0aGUgUEhJIG5vZGUuICBJZiBhbnkgdXNlIGNvcnJlc3BvbmRzCisgIC8vIHRvIGEgYmxvY2sgdGhhdCBpcyBub3QgZG9taW5hdGVkIGJ5IHRoZSBsYXRjaCBibG9jaywgZ2l2ZSB1cCBhbmQgdXNlIHRoZQorICAvLyBwcmVpbmNyZW1lbnRlZCB2YWx1ZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoUE4tPmdldEluY29taW5nVmFsdWUoaSkgPT0gT3BlcmFuZCAmJgorICAgICAgICAhRFQtPmRvbWluYXRlcyhMYXRjaEJsb2NrLCBQTi0+Z2V0SW5jb21pbmdCbG9jayhpKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gT2theSwgYWxsIHVzZXMgb2YgT3BlcmFuZCBieSBQTiBhcmUgaW4gcHJlZGVjZXNzb3IgYmxvY2tzIHRoYXQgcmVhbGx5IGFyZQorICAvLyBkb21pbmF0ZWQgYnkgdGhlIGxhdGNoIGJsb2NrLiAgVXNlIHRoZSBwb3N0LWluY3JlbWVudGVkIHZhbHVlLgorICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgU0NFViAqbGx2bTo6VHJhbnNmb3JtRm9yUG9zdEluY1VzZShUcmFuc2Zvcm1LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpVc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqT3BlcmFuZFZhbFRvUmVwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zdEluY0xvb3BTZXQgJkxvb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICZEVCkgeworICBpZiAoaXNhPFNDRVZDb25zdGFudD4oUykgfHwgaXNhPFNDRVZVbmtub3duPihTKSkKKyAgICByZXR1cm4gUzsKKworICBpZiAoY29uc3QgU0NFVkNhc3RFeHByICpYID0gZHluX2Nhc3Q8U0NFVkNhc3RFeHByPihTKSkgeworICAgIGNvbnN0IFNDRVYgKk8gPSBYLT5nZXRPcGVyYW5kKCk7CisgICAgY29uc3QgU0NFViAqTiA9IFRyYW5zZm9ybUZvclBvc3RJbmNVc2UoS2luZCwgTywgVXNlciwgT3BlcmFuZFZhbFRvUmVwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wcywgU0UsIERUKTsKKyAgICBpZiAoTyAhPSBOKQorICAgICAgc3dpdGNoIChTLT5nZXRTQ0VWVHlwZSgpKSB7CisgICAgICBjYXNlIHNjWmVyb0V4dGVuZDogcmV0dXJuIFNFLmdldFplcm9FeHRlbmRFeHByKE4sIFMtPmdldFR5cGUoKSk7CisgICAgICBjYXNlIHNjU2lnbkV4dGVuZDogcmV0dXJuIFNFLmdldFNpZ25FeHRlbmRFeHByKE4sIFMtPmdldFR5cGUoKSk7CisgICAgICBjYXNlIHNjVHJ1bmNhdGU6IHJldHVybiBTRS5nZXRUcnVuY2F0ZUV4cHIoTiwgUy0+Z2V0VHlwZSgpKTsKKyAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgU0NFVkNhc3RFeHByIGtpbmQhIik7CisgICAgICB9CisgICAgcmV0dXJuIFM7CisgIH0KKworICBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KFMpKSB7CisgICAgLy8gQW4gYWRkcmVjLiBUaGlzIGlzIHRoZSBpbnRlcmVzdGluZyBwYXJ0LgorICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgOD4gT3BlcmFuZHM7CisgICAgY29uc3QgTG9vcCAqTCA9IEFSLT5nZXRMb29wKCk7CisgICAgLy8gVGhlIGFkZHJlYyBjb25jZXB0dWFsbHkgdXNlcyBpdHMgb3BlcmFuZHMgYXQgbG9vcCBlbnRyeS4KKyAgICBJbnN0cnVjdGlvbiAqTFVzZXIgPSBMLT5nZXRIZWFkZXIoKS0+YmVnaW4oKTsKKyAgICAvLyBUcmFuc2Zvcm0gZWFjaCBvcGVyYW5kLgorICAgIGZvciAoU0NFVk5BcnlFeHByOjpvcF9pdGVyYXRvciBJID0gQVItPm9wX2JlZ2luKCksIEUgPSBBUi0+b3BfZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgY29uc3QgU0NFViAqTyA9ICpJOworICAgICAgY29uc3QgU0NFViAqTiA9IFRyYW5zZm9ybUZvclBvc3RJbmNVc2UoS2luZCwgTywgTFVzZXIsIDAsIExvb3BzLCBTRSwgRFQpOworICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKE4pOworICAgIH0KKyAgICBjb25zdCBTQ0VWICpSZXN1bHQgPSBTRS5nZXRBZGRSZWNFeHByKE9wZXJhbmRzLCBMKTsKKyAgICBzd2l0Y2ggKEtpbmQpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHRyYW5zZm9ybSBuYW1lISIpOworICAgIGNhc2UgTm9ybWFsaXplQXV0b2RldGVjdDoKKyAgICAgIGlmIChJVlVzZVNob3VsZFVzZVBvc3RJbmNWYWx1ZShVc2VyLCBPcGVyYW5kVmFsVG9SZXBsYWNlLCBMLCAmRFQpKSB7CisgICAgICAgIGNvbnN0IFNDRVYgKlRyYW5zZm9ybWVkU3RlcCA9CisgICAgICAgICAgVHJhbnNmb3JtRm9yUG9zdEluY1VzZShLaW5kLCBBUi0+Z2V0U3RlcFJlY3VycmVuY2UoU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciwgT3BlcmFuZFZhbFRvUmVwbGFjZSwgTG9vcHMsIFNFLCBEVCk7CisgICAgICAgIFJlc3VsdCA9IFNFLmdldE1pbnVzU0NFVihSZXN1bHQsIFRyYW5zZm9ybWVkU3RlcCk7CisgICAgICAgIExvb3BzLmluc2VydChMKTsKKyAgICAgIH0KKyNpZmRlZiBYREVCVUcKKyAgICAgIGFzc2VydChTID09IFRyYW5zZm9ybUZvclBvc3RJbmNVc2UoRGVub3JtYWxpemUsIFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciwgT3BlcmFuZFZhbFRvUmVwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcHMsIFNFLCBEVCkgJiYKKyAgICAgICAgICAgICAiU0NFViBub3JtYWxpemF0aW9uIGlzIG5vdCBpbnZlcnRpYmxlISIpOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIE5vcm1hbGl6ZToKKyAgICAgIGlmIChMb29wcy5jb3VudChMKSkgeworICAgICAgICBjb25zdCBTQ0VWICpUcmFuc2Zvcm1lZFN0ZXAgPQorICAgICAgICAgIFRyYW5zZm9ybUZvclBvc3RJbmNVc2UoS2luZCwgQVItPmdldFN0ZXBSZWN1cnJlbmNlKFNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIsIE9wZXJhbmRWYWxUb1JlcGxhY2UsIExvb3BzLCBTRSwgRFQpOworICAgICAgICBSZXN1bHQgPSBTRS5nZXRNaW51c1NDRVYoUmVzdWx0LCBUcmFuc2Zvcm1lZFN0ZXApOworICAgICAgfQorI2lmZGVmIFhERUJVRworICAgICAgYXNzZXJ0KFMgPT0gVHJhbnNmb3JtRm9yUG9zdEluY1VzZShEZW5vcm1hbGl6ZSwgUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyLCBPcGVyYW5kVmFsVG9SZXBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wcywgU0UsIERUKSAmJgorICAgICAgICAgICAgICJTQ0VWIG5vcm1hbGl6YXRpb24gaXMgbm90IGludmVydGlibGUhIik7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRGVub3JtYWxpemU6CisgICAgICBpZiAoTG9vcHMuY291bnQoTCkpCisgICAgICAgIFJlc3VsdCA9IGNhc3Q8U0NFVkFkZFJlY0V4cHI+KFJlc3VsdCktPmdldFBvc3RJbmNFeHByKFNFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZOQXJ5RXhwciAqWCA9IGR5bl9jYXN0PFNDRVZOQXJ5RXhwcj4oUykpIHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IE9wZXJhbmRzOworICAgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICAgIC8vIFRyYW5zZm9ybSBlYWNoIG9wZXJhbmQuCisgICAgZm9yIChTQ0VWTkFyeUV4cHI6Om9wX2l0ZXJhdG9yIEkgPSBYLT5vcF9iZWdpbigpLCBFID0gWC0+b3BfZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgY29uc3QgU0NFViAqTyA9ICpJOworICAgICAgY29uc3QgU0NFViAqTiA9IFRyYW5zZm9ybUZvclBvc3RJbmNVc2UoS2luZCwgTywgVXNlciwgT3BlcmFuZFZhbFRvUmVwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BzLCBTRSwgRFQpOworICAgICAgQ2hhbmdlZCB8PSBOICE9IE87CisgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soTik7CisgICAgfQorICAgIC8vIElmIGFueSBvcGVyYW5kIGFjdHVhbGx5IGNoYW5nZWQsIHJldHVybiBhIHRyYW5zZm9ybWVkIHJlc3VsdC4KKyAgICBpZiAoQ2hhbmdlZCkKKyAgICAgIHN3aXRjaCAoUy0+Z2V0U0NFVlR5cGUoKSkgeworICAgICAgY2FzZSBzY0FkZEV4cHI6IHJldHVybiBTRS5nZXRBZGRFeHByKE9wZXJhbmRzKTsKKyAgICAgIGNhc2Ugc2NNdWxFeHByOiByZXR1cm4gU0UuZ2V0TXVsRXhwcihPcGVyYW5kcyk7CisgICAgICBjYXNlIHNjU01heEV4cHI6IHJldHVybiBTRS5nZXRTTWF4RXhwcihPcGVyYW5kcyk7CisgICAgICBjYXNlIHNjVU1heEV4cHI6IHJldHVybiBTRS5nZXRVTWF4RXhwcihPcGVyYW5kcyk7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIFNDRVZOQXJ5RXhwciBraW5kISIpOworICAgICAgfQorICAgIHJldHVybiBTOworICB9CisKKyAgaWYgKGNvbnN0IFNDRVZVRGl2RXhwciAqWCA9IGR5bl9jYXN0PFNDRVZVRGl2RXhwcj4oUykpIHsKKyAgICBjb25zdCBTQ0VWICpMTyA9IFgtPmdldExIUygpOworICAgIGNvbnN0IFNDRVYgKlJPID0gWC0+Z2V0UkhTKCk7CisgICAgY29uc3QgU0NFViAqTE4gPSBUcmFuc2Zvcm1Gb3JQb3N0SW5jVXNlKEtpbmQsIExPLCBVc2VyLCBPcGVyYW5kVmFsVG9SZXBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wcywgU0UsIERUKTsKKyAgICBjb25zdCBTQ0VWICpSTiA9IFRyYW5zZm9ybUZvclBvc3RJbmNVc2UoS2luZCwgUk8sIFVzZXIsIE9wZXJhbmRWYWxUb1JlcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BzLCBTRSwgRFQpOworICAgIGlmIChMTyAhPSBMTiB8fCBSTyAhPSBSTikKKyAgICAgIHJldHVybiBTRS5nZXRVRGl2RXhwcihMTiwgUk4pOworICAgIHJldHVybiBTOworICB9CisKKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBTQ0VWIGtpbmQhIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuY3BwIGIvc3JjL0xMVk0vbGliL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzY2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQW5hbHlzaXMvVmFsdWVUcmFja2luZy5jcHAKQEAgLTAsMCArMSwxNTY4IEBACisvLz09PS0gVmFsdWVUcmFja2luZy5jcHAgLSBXYWxrIGNvbXB1dGF0aW9ucyB0byBjb21wdXRlIHByb3BlcnRpZXMgLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGhlbHAgYW5hbHl6ZSBwcm9wZXJ0aWVzIHRoYXQgY2hhaW5zIG9mCisvLyBjb21wdXRhdGlvbnMgaGF2ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9WYWx1ZVRyYWNraW5nLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbEFsaWFzLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gQ29tcHV0ZU1hc2tlZEJpdHMgLSBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGJpdHMgc3BlY2lmaWVkIGluIE1hc2sgYXJlCisvLy8ga25vd24gdG8gYmUgZWl0aGVyIHplcm8gb3Igb25lIGFuZCByZXR1cm4gdGhlbSBpbiB0aGUgS25vd25aZXJvL0tub3duT25lCisvLy8gYml0IHNldHMuICBUaGlzIGNvZGUgb25seSBhbmFseXplcyBiaXRzIGluIE1hc2ssIGluIG9yZGVyIHRvIHNob3J0LWNpcmN1aXQKKy8vLyBwcm9jZXNzaW5nLgorLy8vIE5PVEU6IHdlIGNhbm5vdCBjb25zaWRlciAndW5kZWYnIHRvIGJlICJJc1plcm8iIGhlcmUuICBUaGUgcHJvYmxlbSBpcyB0aGF0CisvLy8gd2UgY2Fubm90IG9wdGltaXplIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQgaXMgemVybyB3aXRob3V0IGNoYW5naW5nCisvLy8gaXQgdG8gYmUgYW4gZXhwbGljaXQgemVyby4gIElmIHdlIGRvbid0IGNoYW5nZSBpdCB0byB6ZXJvLCBvdGhlciBjb2RlIGNvdWxkCisvLy8gb3B0aW1pemVkIGJhc2VkIG9uIHRoZSBjb250cmFkaWN0b3J5IGFzc3VtcHRpb24gdGhhdCBpdCBpcyBub24temVyby4KKy8vLyBCZWNhdXNlIGluc3Rjb21iaW5lIGFnZ3Jlc3NpdmVseSBmb2xkcyBvcGVyYXRpb25zIHdpdGggdW5kZWYgYXJncyBhbnl3YXksCisvLy8gdGhpcyB3b24ndCBsb3NlIHVzIGNvZGUgcXVhbGl0eS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBvbiB2YWx1ZXMgd2l0aCBpbnRlZ2VyIHR5cGUsIHZhbHVlcyB3aXRoIHBvaW50ZXIKKy8vLyB0eXBlIChidXQgb25seSBpZiBURCBpcyBub24tbnVsbCksIGFuZCB2ZWN0b3JzIG9mIGludGVnZXJzLiAgSW4gdGhlIGNhc2UKKy8vLyB3aGVyZSBWIGlzIGEgdmVjdG9yLCB0aGUgbWFzaywga25vd24gemVybywgYW5kIGtub3duIG9uZSB2YWx1ZXMgYXJlIHRoZQorLy8vIHNhbWUgd2lkdGggYXMgdGhlIHZlY3RvciBlbGVtZW50LCBhbmQgdGhlIGJpdCBpcyBzZXQgb25seSBpZiBpdCBpcyB0cnVlCisvLy8gZm9yIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KK3ZvaWQgbGx2bTo6Q29tcHV0ZU1hc2tlZEJpdHMoVmFsdWUgKlYsIGNvbnN0IEFQSW50ICZNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25aZXJvLCBBUEludCAmS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlRELCB1bnNpZ25lZCBEZXB0aCkgeworICBjb25zdCB1bnNpZ25lZCBNYXhEZXB0aCA9IDY7CisgIGFzc2VydChWICYmICJObyBWYWx1ZT8iKTsKKyAgYXNzZXJ0KERlcHRoIDw9IE1heERlcHRoICYmICJMaW1pdCBTZWFyY2ggRGVwdGgiKTsKKyAgdW5zaWduZWQgQml0V2lkdGggPSBNYXNrLmdldEJpdFdpZHRoKCk7CisgIGFzc2VydCgoVi0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSB8fCBWLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgICAgICAmJiAiTm90IGludGVnZXIgb3IgcG9pbnRlciB0eXBlISIpOworICBhc3NlcnQoKCFURCB8fAorICAgICAgICAgIFRELT5nZXRUeXBlU2l6ZUluQml0cyhWLT5nZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKSkgPT0gQml0V2lkdGgpICYmCisgICAgICAgICAoIVYtPmdldFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkgfHwKKyAgICAgICAgICBWLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKSA9PSBCaXRXaWR0aCkgJiYKKyAgICAgICAgIEtub3duWmVyby5nZXRCaXRXaWR0aCgpID09IEJpdFdpZHRoICYmIAorICAgICAgICAgS25vd25PbmUuZ2V0Qml0V2lkdGgoKSA9PSBCaXRXaWR0aCAmJgorICAgICAgICAgIlYsIE1hc2ssIEtub3duT25lIGFuZCBLbm93blplcm8gc2hvdWxkIGhhdmUgc2FtZSBCaXRXaWR0aCIpOworCisgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpIHsKKyAgICAvLyBXZSBrbm93IGFsbCBvZiB0aGUgYml0cyBmb3IgYSBjb25zdGFudCEKKyAgICBLbm93bk9uZSA9IENJLT5nZXRWYWx1ZSgpICYgTWFzazsKKyAgICBLbm93blplcm8gPSB+S25vd25PbmUgJiBNYXNrOworICAgIHJldHVybjsKKyAgfQorICAvLyBOdWxsIGFuZCBhZ2dyZWdhdGUtemVybyBhcmUgYWxsLXplcm9zLgorICBpZiAoaXNhPENvbnN0YW50UG9pbnRlck51bGw+KFYpIHx8CisgICAgICBpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihWKSkgeworICAgIEtub3duT25lLmNsZWFyKCk7CisgICAgS25vd25aZXJvID0gTWFzazsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gSGFuZGxlIGEgY29uc3RhbnQgdmVjdG9yIGJ5IHRha2luZyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBrbm93biBiaXRzIG9mCisgIC8vIGVhY2ggZWxlbWVudC4KKyAgaWYgKENvbnN0YW50VmVjdG9yICpDViA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihWKSkgeworICAgIEtub3duWmVyby5zZXQoKTsgS25vd25PbmUuc2V0KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENWLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgQVBJbnQgS25vd25aZXJvMihCaXRXaWR0aCwgMCksIEtub3duT25lMihCaXRXaWR0aCwgMCk7CisgICAgICBDb21wdXRlTWFza2VkQml0cyhDVi0+Z2V0T3BlcmFuZChpKSwgTWFzaywgS25vd25aZXJvMiwgS25vd25PbmUyLAorICAgICAgICAgICAgICAgICAgICAgICAgVEQsIERlcHRoKTsKKyAgICAgIEtub3duWmVybyAmPSBLbm93blplcm8yOworICAgICAgS25vd25PbmUgJj0gS25vd25PbmUyOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgLy8gVGhlIGFkZHJlc3Mgb2YgYW4gYWxpZ25lZCBHbG9iYWxWYWx1ZSBoYXMgdHJhaWxpbmcgemVyb3MuCisgIGlmIChHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oVikpIHsKKyAgICB1bnNpZ25lZCBBbGlnbiA9IEdWLT5nZXRBbGlnbm1lbnQoKTsKKyAgICBpZiAoQWxpZ24gPT0gMCAmJiBURCAmJiBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpLT5pc1NpemVkKCkpIHsKKyAgICAgIGNvbnN0IFR5cGUgKk9iamVjdFR5cGUgPSBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgLy8gSWYgdGhlIG9iamVjdCBpcyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IE1vZHVsZSwgd2UnbGwgYmUgZ2l2aW5nCisgICAgICAvLyBpdCB0aGUgcHJlZmVycmVkIGFsaWdubWVudC4gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IGl0CisgICAgICAvLyBtYXkgb25seSBoYXZlIHRoZSBtaW5pbXVtIEFCSSBhbGlnbm1lbnQuCisgICAgICBpZiAoIUdWLT5pc0RlY2xhcmF0aW9uKCkgJiYgIUdWLT5tYXlCZU92ZXJyaWRkZW4oKSkKKyAgICAgICAgQWxpZ24gPSBURC0+Z2V0UHJlZlR5cGVBbGlnbm1lbnQoT2JqZWN0VHlwZSk7CisgICAgICBlbHNlCisgICAgICAgIEFsaWduID0gVEQtPmdldEFCSVR5cGVBbGlnbm1lbnQoT2JqZWN0VHlwZSk7CisgICAgfQorICAgIGlmIChBbGlnbiA+IDApCisgICAgICBLbm93blplcm8gPSBNYXNrICYgQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRUcmFpbGluZ1plcm9zXzMyKEFsaWduKSk7CisgICAgZWxzZQorICAgICAgS25vd25aZXJvLmNsZWFyKCk7CisgICAgS25vd25PbmUuY2xlYXIoKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gQSB3ZWFrIEdsb2JhbEFsaWFzIGlzIHRvdGFsbHkgdW5rbm93bi4gQSBub24td2VhayBHbG9iYWxBbGlhcyBoYXMKKyAgLy8gdGhlIGJpdHMgb2YgaXRzIGFsaWFzZWUuCisgIGlmIChHbG9iYWxBbGlhcyAqR0EgPSBkeW5fY2FzdDxHbG9iYWxBbGlhcz4oVikpIHsKKyAgICBpZiAoR0EtPm1heUJlT3ZlcnJpZGRlbigpKSB7CisgICAgICBLbm93blplcm8uY2xlYXIoKTsgS25vd25PbmUuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoR0EtPmdldEFsaWFzZWUoKSwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRELCBEZXB0aCsxKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgS25vd25aZXJvLmNsZWFyKCk7IEtub3duT25lLmNsZWFyKCk7ICAgLy8gU3RhcnQgb3V0IG5vdCBrbm93aW5nIGFueXRoaW5nLgorCisgIGlmIChEZXB0aCA9PSBNYXhEZXB0aCB8fCBNYXNrID09IDApCisgICAgcmV0dXJuOyAgLy8gTGltaXQgc2VhcmNoIGRlcHRoLgorCisgIE9wZXJhdG9yICpJID0gZHluX2Nhc3Q8T3BlcmF0b3I+KFYpOworICBpZiAoIUkpIHJldHVybjsKKworICBBUEludCBLbm93blplcm8yKEtub3duWmVybyksIEtub3duT25lMihLbm93bk9uZSk7CisgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDogeworICAgIC8vIElmIGVpdGhlciB0aGUgTEhTIG9yIHRoZSBSSFMgYXJlIFplcm8sIHRoZSByZXN1bHQgaXMgemVyby4KKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDEpLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBURCwgRGVwdGgrMSk7CisgICAgQVBJbnQgTWFzazIoTWFzayAmIH5Lbm93blplcm8pOworICAgIENvbXB1dGVNYXNrZWRCaXRzKEktPmdldE9wZXJhbmQoMCksIE1hc2syLCBLbm93blplcm8yLCBLbm93bk9uZTIsIFRELAorICAgICAgICAgICAgICAgICAgICAgIERlcHRoKzEpOworICAgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICBhc3NlcnQoKEtub3duWmVybzIgJiBLbm93bk9uZTIpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICAKKyAgICAvLyBPdXRwdXQga25vd24tMSBiaXRzIGFyZSBvbmx5IGtub3duIGlmIHNldCBpbiBib3RoIHRoZSBMSFMgJiBSSFMuCisgICAgS25vd25PbmUgJj0gS25vd25PbmUyOworICAgIC8vIE91dHB1dCBrbm93bi0wIGFyZSBrbm93biB0byBiZSBjbGVhciBpZiB6ZXJvIGluIGVpdGhlciB0aGUgTEhTIHwgUkhTLgorICAgIEtub3duWmVybyB8PSBLbm93blplcm8yOworICAgIHJldHVybjsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpPcjogeworICAgIENvbXB1dGVNYXNrZWRCaXRzKEktPmdldE9wZXJhbmQoMSksIE1hc2ssIEtub3duWmVybywgS25vd25PbmUsIFRELCBEZXB0aCsxKTsKKyAgICBBUEludCBNYXNrMihNYXNrICYgfktub3duT25lKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDApLCBNYXNrMiwgS25vd25aZXJvMiwgS25vd25PbmUyLCBURCwKKyAgICAgICAgICAgICAgICAgICAgICBEZXB0aCsxKTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgYXNzZXJ0KChLbm93blplcm8yICYgS25vd25PbmUyKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgCisgICAgLy8gT3V0cHV0IGtub3duLTAgYml0cyBhcmUgb25seSBrbm93biBpZiBjbGVhciBpbiBib3RoIHRoZSBMSFMgJiBSSFMuCisgICAgS25vd25aZXJvICY9IEtub3duWmVybzI7CisgICAgLy8gT3V0cHV0IGtub3duLTEgYXJlIGtub3duIHRvIGJlIHNldCBpZiBzZXQgaW4gZWl0aGVyIHRoZSBMSFMgfCBSSFMuCisgICAgS25vd25PbmUgfD0gS25vd25PbmUyOworICAgIHJldHVybjsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpYb3I6IHsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDEpLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBURCwgRGVwdGgrMSk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSS0+Z2V0T3BlcmFuZCgwKSwgTWFzaywgS25vd25aZXJvMiwgS25vd25PbmUyLCBURCwKKyAgICAgICAgICAgICAgICAgICAgICBEZXB0aCsxKTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgYXNzZXJ0KChLbm93blplcm8yICYgS25vd25PbmUyKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgCisgICAgLy8gT3V0cHV0IGtub3duLTAgYml0cyBhcmUga25vd24gaWYgY2xlYXIgb3Igc2V0IGluIGJvdGggdGhlIExIUyAmIFJIUy4KKyAgICBBUEludCBLbm93blplcm9PdXQgPSAoS25vd25aZXJvICYgS25vd25aZXJvMikgfCAoS25vd25PbmUgJiBLbm93bk9uZTIpOworICAgIC8vIE91dHB1dCBrbm93bi0xIGFyZSBrbm93biB0byBiZSBzZXQgaWYgc2V0IGluIG9ubHkgb25lIG9mIHRoZSBMSFMsIFJIUy4KKyAgICBLbm93bk9uZSA9IChLbm93blplcm8gJiBLbm93bk9uZTIpIHwgKEtub3duT25lICYgS25vd25aZXJvMik7CisgICAgS25vd25aZXJvID0gS25vd25aZXJvT3V0OworICAgIHJldHVybjsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpNdWw6IHsKKyAgICBBUEludCBNYXNrMiA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpOworICAgIENvbXB1dGVNYXNrZWRCaXRzKEktPmdldE9wZXJhbmQoMSksIE1hc2syLCBLbm93blplcm8sIEtub3duT25lLCBURCxEZXB0aCsxKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDApLCBNYXNrMiwgS25vd25aZXJvMiwgS25vd25PbmUyLCBURCwKKyAgICAgICAgICAgICAgICAgICAgICBEZXB0aCsxKTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgYXNzZXJ0KChLbm93blplcm8yICYgS25vd25PbmUyKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgCisgICAgLy8gSWYgbG93IGJpdHMgYXJlIHplcm8gaW4gZWl0aGVyIG9wZXJhbmQsIG91dHB1dCBsb3cga25vd24tMCBiaXRzLgorICAgIC8vIEFsc28gY29tcHV0ZSBhIGNvbnNlcmF0aXZlIGVzdGltYXRlIGZvciBoaWdoIGtub3duLTAgYml0cy4KKyAgICAvLyBNb3JlIHRyaWNraW5lc3MgaXMgcG9zc2libGUsIGJ1dCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIHRoZQorICAgIC8vIGludGVyZXN0aW5nIGNhc2Ugb2YgYWxpZ25tZW50IGNvbXB1dGF0aW9uLgorICAgIEtub3duT25lLmNsZWFyKCk7CisgICAgdW5zaWduZWQgVHJhaWxaID0gS25vd25aZXJvLmNvdW50VHJhaWxpbmdPbmVzKCkgKworICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybzIuY291bnRUcmFpbGluZ09uZXMoKTsKKyAgICB1bnNpZ25lZCBMZWFkWiA9ICBzdGQ6Om1heChLbm93blplcm8uY291bnRMZWFkaW5nT25lcygpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8yLmNvdW50TGVhZGluZ09uZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRXaWR0aCkgLSBCaXRXaWR0aDsKKworICAgIFRyYWlsWiA9IHN0ZDo6bWluKFRyYWlsWiwgQml0V2lkdGgpOworICAgIExlYWRaID0gc3RkOjptaW4oTGVhZFosIEJpdFdpZHRoKTsKKyAgICBLbm93blplcm8gPSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwgVHJhaWxaKSB8CisgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBMZWFkWik7CisgICAgS25vd25aZXJvICY9IE1hc2s7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVEaXY6IHsKKyAgICAvLyBGb3IgdGhlIHB1cnBvc2VzIG9mIGNvbXB1dGluZyBsZWFkaW5nIHplcm9zIHdlIGNhbiBjb25zZXJ2YXRpdmVseQorICAgIC8vIHRyZWF0IGEgdWRpdiBhcyBhIGxvZ2ljYWwgcmlnaHQgc2hpZnQgYnkgdGhlIHBvd2VyIG9mIDIga25vd24gdG8KKyAgICAvLyBiZSBsZXNzIHRoYW4gdGhlIGRlbm9taW5hdG9yLgorICAgIEFQSW50IEFsbE9uZXMgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgIEFsbE9uZXMsIEtub3duWmVybzIsIEtub3duT25lMiwgVEQsIERlcHRoKzEpOworICAgIHVuc2lnbmVkIExlYWRaID0gS25vd25aZXJvMi5jb3VudExlYWRpbmdPbmVzKCk7CisKKyAgICBLbm93bk9uZTIuY2xlYXIoKTsKKyAgICBLbm93blplcm8yLmNsZWFyKCk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSS0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICBBbGxPbmVzLCBLbm93blplcm8yLCBLbm93bk9uZTIsIFRELCBEZXB0aCsxKTsKKyAgICB1bnNpZ25lZCBSSFNVbmtub3duTGVhZGluZ09uZXMgPSBLbm93bk9uZTIuY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgICBpZiAoUkhTVW5rbm93bkxlYWRpbmdPbmVzICE9IEJpdFdpZHRoKQorICAgICAgTGVhZFogPSBzdGQ6Om1pbihCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgTGVhZFogKyBCaXRXaWR0aCAtIFJIU1Vua25vd25MZWFkaW5nT25lcyAtIDEpOworCisgICAgS25vd25aZXJvID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBMZWFkWikgJiBNYXNrOworICAgIHJldHVybjsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSS0+Z2V0T3BlcmFuZCgyKSwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSwgVEQsIERlcHRoKzEpOworICAgIENvbXB1dGVNYXNrZWRCaXRzKEktPmdldE9wZXJhbmQoMSksIE1hc2ssIEtub3duWmVybzIsIEtub3duT25lMiwgVEQsCisgICAgICAgICAgICAgICAgICAgICAgRGVwdGgrMSk7CisgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIGFzc2VydCgoS25vd25aZXJvMiAmIEtub3duT25lMikgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorCisgICAgLy8gT25seSBrbm93biBpZiBrbm93biBpbiBib3RoIHRoZSBMSFMgYW5kIFJIUy4KKyAgICBLbm93bk9uZSAmPSBLbm93bk9uZTI7CisgICAgS25vd25aZXJvICY9IEtub3duWmVybzI7CisgICAgcmV0dXJuOworICBjYXNlIEluc3RydWN0aW9uOjpGUFRydW5jOgorICBjYXNlIEluc3RydWN0aW9uOjpGUEV4dDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJOgorICBjYXNlIEluc3RydWN0aW9uOjpGUFRvU0k6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNJVG9GUDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VUlUb0ZQOgorICAgIHJldHVybjsgLy8gQ2FuJ3Qgd29yayB3aXRoIGZsb2F0aW5nIHBvaW50LgorICBjYXNlIEluc3RydWN0aW9uOjpQdHJUb0ludDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6SW50VG9QdHI6CisgICAgLy8gV2UgY2FuJ3QgaGFuZGxlIHRoZXNlIGlmIHdlIGRvbid0IGtub3cgdGhlIHBvaW50ZXIgc2l6ZS4KKyAgICBpZiAoIVREKSByZXR1cm47CisgICAgLy8gRkFMTCBUSFJPVUdIIGFuZCBoYW5kbGUgdGhlbSB0aGUgc2FtZSBhcyB6ZXh0L3RydW5jLgorICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzogeworICAgIGNvbnN0IFR5cGUgKlNyY1R5ID0gSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpOworICAgIAorICAgIHVuc2lnbmVkIFNyY0JpdFdpZHRoOworICAgIC8vIE5vdGUgdGhhdCB3ZSBoYW5kbGUgcG9pbnRlciBvcGVyYW5kcyBoZXJlIGJlY2F1c2Ugb2YgaW50dG9wdHIvcHRydG9pbnQKKyAgICAvLyB3aGljaCBmYWxsIHRocm91Z2ggaGVyZS4KKyAgICBpZiAoU3JjVHktPmlzUG9pbnRlclR5KCkpCisgICAgICBTcmNCaXRXaWR0aCA9IFRELT5nZXRUeXBlU2l6ZUluQml0cyhTcmNUeSk7CisgICAgZWxzZQorICAgICAgU3JjQml0V2lkdGggPSBTcmNUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgIAorICAgIEFQSW50IE1hc2tJbihNYXNrKTsKKyAgICBNYXNrSW4uemV4dE9yVHJ1bmMoU3JjQml0V2lkdGgpOworICAgIEtub3duWmVyby56ZXh0T3JUcnVuYyhTcmNCaXRXaWR0aCk7CisgICAgS25vd25PbmUuemV4dE9yVHJ1bmMoU3JjQml0V2lkdGgpOworICAgIENvbXB1dGVNYXNrZWRCaXRzKEktPmdldE9wZXJhbmQoMCksIE1hc2tJbiwgS25vd25aZXJvLCBLbm93bk9uZSwgVEQsCisgICAgICAgICAgICAgICAgICAgICAgRGVwdGgrMSk7CisgICAgS25vd25aZXJvLnpleHRPclRydW5jKEJpdFdpZHRoKTsKKyAgICBLbm93bk9uZS56ZXh0T3JUcnVuYyhCaXRXaWR0aCk7CisgICAgLy8gQW55IHRvcCBiaXRzIGFyZSBrbm93biB0byBiZSB6ZXJvLgorICAgIGlmIChCaXRXaWR0aCA+IFNyY0JpdFdpZHRoKQorICAgICAgS25vd25aZXJvIHw9IEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgQml0V2lkdGggLSBTcmNCaXRXaWR0aCk7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6IHsKKyAgICBjb25zdCBUeXBlICpTcmNUeSA9IEktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsKKyAgICBpZiAoKFNyY1R5LT5pc0ludGVnZXJUeSgpIHx8IFNyY1R5LT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAvLyBUT0RPOiBGb3Igbm93LCBub3QgaGFuZGxpbmcgY29udmVyc2lvbnMgbGlrZToKKyAgICAgICAgLy8gKGJpdGNhc3QgaTY0ICV4IHRvIDwyIHggaTMyPikKKyAgICAgICAgIUktPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDApLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBURCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHRoKzEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OiB7CisgICAgLy8gQ29tcHV0ZSB0aGUgYml0cyBpbiB0aGUgcmVzdWx0IHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBpbnB1dC4KKyAgICB1bnNpZ25lZCBTcmNCaXRXaWR0aCA9IEktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgICAgCisgICAgQVBJbnQgTWFza0luKE1hc2spOyAKKyAgICBNYXNrSW4udHJ1bmMoU3JjQml0V2lkdGgpOworICAgIEtub3duWmVyby50cnVuYyhTcmNCaXRXaWR0aCk7CisgICAgS25vd25PbmUudHJ1bmMoU3JjQml0V2lkdGgpOworICAgIENvbXB1dGVNYXNrZWRCaXRzKEktPmdldE9wZXJhbmQoMCksIE1hc2tJbiwgS25vd25aZXJvLCBLbm93bk9uZSwgVEQsCisgICAgICAgICAgICAgICAgICAgICAgRGVwdGgrMSk7CisgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIEtub3duWmVyby56ZXh0KEJpdFdpZHRoKTsKKyAgICBLbm93bk9uZS56ZXh0KEJpdFdpZHRoKTsKKworICAgIC8vIElmIHRoZSBzaWduIGJpdCBvZiB0aGUgaW5wdXQgaXMga25vd24gc2V0IG9yIGNsZWFyLCB0aGVuIHdlIGtub3cgdGhlCisgICAgLy8gdG9wIGJpdHMgb2YgdGhlIHJlc3VsdC4KKyAgICBpZiAoS25vd25aZXJvW1NyY0JpdFdpZHRoLTFdKSAgICAgICAgICAgICAvLyBJbnB1dCBzaWduIGJpdCBrbm93biB6ZXJvCisgICAgICBLbm93blplcm8gfD0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBCaXRXaWR0aCAtIFNyY0JpdFdpZHRoKTsKKyAgICBlbHNlIGlmIChLbm93bk9uZVtTcmNCaXRXaWR0aC0xXSkgICAgICAgICAgIC8vIElucHV0IHNpZ24gYml0IGtub3duIHNldAorICAgICAgS25vd25PbmUgfD0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBCaXRXaWR0aCAtIFNyY0JpdFdpZHRoKTsKKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgIC8vIChzaGwgWCwgQzEpICYgQzIgPT0gMCAgIGlmZiAgIChYICYgQzIgPj51IEMxKSA9PSAwCisgICAgaWYgKENvbnN0YW50SW50ICpTQSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgdWludDY0X3QgU2hpZnRBbXQgPSBTQS0+Z2V0TGltaXRlZFZhbHVlKEJpdFdpZHRoKTsKKyAgICAgIEFQSW50IE1hc2syKE1hc2subHNocihTaGlmdEFtdCkpOworICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSS0+Z2V0T3BlcmFuZCgwKSwgTWFzazIsIEtub3duWmVybywgS25vd25PbmUsIFRELAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwdGgrMSk7CisgICAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgICBLbm93blplcm8gPDw9IFNoaWZ0QW10OworICAgICAgS25vd25PbmUgIDw8PSBTaGlmdEFtdDsKKyAgICAgIEtub3duWmVybyB8PSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwgU2hpZnRBbXQpOyAvLyBsb3cgYml0cyBrbm93biAwCisgICAgICByZXR1cm47CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOgorICAgIC8vICh1c2hyIFgsIEMxKSAmIEMyID09IDAgICBpZmYgICgtMSA+PiBDMSkgJiBDMiA9PSAwCisgICAgaWYgKENvbnN0YW50SW50ICpTQSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGJpdHMgdGhhdCBhcmUgYXQgdGhlIHRvcCBub3cuCisgICAgICB1aW50NjRfdCBTaGlmdEFtdCA9IFNBLT5nZXRMaW1pdGVkVmFsdWUoQml0V2lkdGgpOworICAgICAgCisgICAgICAvLyBVbnNpZ25lZCBzaGlmdCByaWdodC4KKyAgICAgIEFQSW50IE1hc2syKE1hc2suc2hsKFNoaWZ0QW10KSk7CisgICAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDApLCBNYXNrMiwgS25vd25aZXJvLEtub3duT25lLCBURCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHRoKzEpOworICAgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgICAgS25vd25aZXJvID0gQVBJbnRPcHM6OmxzaHIoS25vd25aZXJvLCBTaGlmdEFtdCk7CisgICAgICBLbm93bk9uZSAgPSBBUEludE9wczo6bHNocihLbm93bk9uZSwgU2hpZnRBbXQpOworICAgICAgLy8gaGlnaCBiaXRzIGtub3duIHplcm8uCisgICAgICBLbm93blplcm8gfD0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBTaGlmdEFtdCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpBU2hyOgorICAgIC8vIChhc2hyIFgsIEMxKSAmIEMyID09IDAgICBpZmYgICgtMSA+PiBDMSkgJiBDMiA9PSAwCisgICAgaWYgKENvbnN0YW50SW50ICpTQSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGJpdHMgdGhhdCBhcmUgYXQgdGhlIHRvcCBub3cuCisgICAgICB1aW50NjRfdCBTaGlmdEFtdCA9IFNBLT5nZXRMaW1pdGVkVmFsdWUoQml0V2lkdGgpOworICAgICAgCisgICAgICAvLyBTaWduZWQgc2hpZnQgcmlnaHQuCisgICAgICBBUEludCBNYXNrMihNYXNrLnNobChTaGlmdEFtdCkpOworICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSS0+Z2V0T3BlcmFuZCgwKSwgTWFzazIsIEtub3duWmVybywgS25vd25PbmUsIFRELAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwdGgrMSk7CisgICAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgICBLbm93blplcm8gPSBBUEludE9wczo6bHNocihLbm93blplcm8sIFNoaWZ0QW10KTsKKyAgICAgIEtub3duT25lICA9IEFQSW50T3BzOjpsc2hyKEtub3duT25lLCBTaGlmdEFtdCk7CisgICAgICAgIAorICAgICAgQVBJbnQgSGlnaEJpdHMoQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBTaGlmdEFtdCkpOworICAgICAgaWYgKEtub3duWmVyb1tCaXRXaWR0aC1TaGlmdEFtdC0xXSkgICAgLy8gTmV3IGJpdHMgYXJlIGtub3duIHplcm8uCisgICAgICAgIEtub3duWmVybyB8PSBIaWdoQml0czsKKyAgICAgIGVsc2UgaWYgKEtub3duT25lW0JpdFdpZHRoLVNoaWZ0QW10LTFdKSAgLy8gTmV3IGJpdHMgYXJlIGtub3duIG9uZS4KKyAgICAgICAgS25vd25PbmUgfD0gSGlnaEJpdHM7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTdWI6IHsKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNMSFMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSS0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgdG9wIGJpdHMgb2YgQy1YIGFyZSBjbGVhciBpZiBYIGNvbnRhaW5zIGxlc3MgYml0cworICAgICAgLy8gdGhhbiBDIChpLmUuIG5vIHdyYXAtYXJvdW5kIGNhbiBoYXBwZW4pLiAgRm9yIGV4YW1wbGUsIDIwLVggaXMKKyAgICAgIC8vIHBvc2l0aXZlIGlmIHdlIGNhbiBwcm92ZSB0aGF0IFggaXMgPj0gMCBhbmQgPCAxNi4KKyAgICAgIGlmICghQ0xIUy0+Z2V0VmFsdWUoKS5pc05lZ2F0aXZlKCkpIHsKKyAgICAgICAgdW5zaWduZWQgTkxaID0gKENMSFMtPmdldFZhbHVlKCkrMSkuY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgICAgICAgLy8gTkxaIGNhbid0IGJlIEJpdFdpZHRoIHdpdGggbm8gc2lnbiBiaXQKKyAgICAgICAgQVBJbnQgTWFza1YgPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIE5MWisxKTsKKyAgICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSS0+Z2V0T3BlcmFuZCgxKSwgTWFza1YsIEtub3duWmVybzIsIEtub3duT25lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEQsIERlcHRoKzEpOworICAgIAorICAgICAgICAvLyBJZiBhbGwgb2YgdGhlIE1hc2tWIGJpdHMgYXJlIGtub3duIHRvIGJlIHplcm8sIHRoZW4gd2Uga25vdyB0aGUKKyAgICAgICAgLy8gb3V0cHV0IHRvcCBiaXRzIGFyZSB6ZXJvLCBiZWNhdXNlIHdlIG5vdyBrbm93IHRoYXQgdGhlIG91dHB1dCBpcworICAgICAgICAvLyBmcm9tIFswLUNdLgorICAgICAgICBpZiAoKEtub3duWmVybzIgJiBNYXNrVikgPT0gTWFza1YpIHsKKyAgICAgICAgICB1bnNpZ25lZCBOTFoyID0gQ0xIUy0+Z2V0VmFsdWUoKS5jb3VudExlYWRpbmdaZXJvcygpOworICAgICAgICAgIC8vIFRvcCBiaXRzIGtub3duIHplcm8uCisgICAgICAgICAgS25vd25aZXJvID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBOTFoyKSAmIE1hc2s7CisgICAgICAgIH0KKyAgICAgIH0gICAgICAgIAorICAgIH0KKyAgfQorICAvLyBmYWxsIHRocm91Z2gKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOiB7CisgICAgLy8gSWYgb25lIG9mIHRoZSBvcGVyYW5kcyBoYXMgdHJhaWxpbmcgemVyb3MsIHRoZW4gdGhlIGJpdHMgdGhhdCB0aGUKKyAgICAvLyBvdGhlciBvcGVyYW5kIGhhcyBpbiB0aG9zZSBiaXQgcG9zaXRpb25zIHdpbGwgYmUgcHJlc2VydmVkIGluIHRoZQorICAgIC8vIHJlc3VsdC4gRm9yIGFuIGFkZCwgdGhpcyB3b3JrcyB3aXRoIGVpdGhlciBvcGVyYW5kLiBGb3IgYSBzdWJ0cmFjdCwKKyAgICAvLyB0aGlzIG9ubHkgd29ya3MgaWYgdGhlIGtub3duIHplcm9zIGFyZSBpbiB0aGUgcmlnaHQgb3BlcmFuZC4KKyAgICBBUEludCBMSFNLbm93blplcm8oQml0V2lkdGgsIDApLCBMSFNLbm93bk9uZShCaXRXaWR0aCwgMCk7CisgICAgQVBJbnQgTWFzazIgPSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFdpZHRoIC0gTWFzay5jb3VudExlYWRpbmdaZXJvcygpKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDApLCBNYXNrMiwgTEhTS25vd25aZXJvLCBMSFNLbm93bk9uZSwgVEQsCisgICAgICAgICAgICAgICAgICAgICAgRGVwdGgrMSk7CisgICAgYXNzZXJ0KChMSFNLbm93blplcm8gJiBMSFNLbm93bk9uZSkgPT0gMCAmJgorICAgICAgICAgICAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7CisgICAgdW5zaWduZWQgTEhTS25vd25aZXJvT3V0ID0gTEhTS25vd25aZXJvLmNvdW50VHJhaWxpbmdPbmVzKCk7CisKKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDEpLCBNYXNrMiwgS25vd25aZXJvMiwgS25vd25PbmUyLCBURCwgCisgICAgICAgICAgICAgICAgICAgICAgRGVwdGgrMSk7CisgICAgYXNzZXJ0KChLbm93blplcm8yICYgS25vd25PbmUyKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgdW5zaWduZWQgUkhTS25vd25aZXJvT3V0ID0gS25vd25aZXJvMi5jb3VudFRyYWlsaW5nT25lcygpOworCisgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmQgaGFzIG1vcmUgdHJhaWxpbmcgemVyb3MsIGFuZCB1c2UgdGhhdAorICAgIC8vIG1hbnkgYml0cyBmcm9tIHRoZSBvdGhlciBvcGVyYW5kLgorICAgIGlmIChMSFNLbm93blplcm9PdXQgPiBSSFNLbm93blplcm9PdXQpIHsKKyAgICAgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWRkKSB7CisgICAgICAgIEFQSW50IE1hc2sgPSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwgTEhTS25vd25aZXJvT3V0KTsKKyAgICAgICAgS25vd25aZXJvIHw9IEtub3duWmVybzIgJiBNYXNrOworICAgICAgICBLbm93bk9uZSAgfD0gS25vd25PbmUyICYgTWFzazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHRoZSBrbm93biB6ZXJvcyBhcmUgaW4gdGhlIGxlZnQgb3BlcmFuZCBmb3IgYSBzdWJ0cmFjdCwKKyAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBtaW5pbXVtIGtub3duIHplcm9zIGluIGJvdGggb3BlcmFuZHMuCisgICAgICAgIEtub3duWmVybyB8PSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKExIU0tub3duWmVyb091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0tub3duWmVyb091dCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoUkhTS25vd25aZXJvT3V0ID49IExIU0tub3duWmVyb091dCkgeworICAgICAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLCBSSFNLbm93blplcm9PdXQpOworICAgICAgS25vd25aZXJvIHw9IExIU0tub3duWmVybyAmIE1hc2s7CisgICAgICBLbm93bk9uZSAgfD0gTEhTS25vd25PbmUgJiBNYXNrOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICBpZiAoQ29uc3RhbnRJbnQgKlJlbSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgQVBJbnQgUkEgPSBSZW0tPmdldFZhbHVlKCkuYWJzKCk7CisgICAgICBpZiAoUkEuaXNQb3dlck9mMigpKSB7CisgICAgICAgIEFQSW50IExvd0JpdHMgPSBSQSAtIDE7CisgICAgICAgIEFQSW50IE1hc2syID0gTG93Qml0cyB8IEFQSW50OjpnZXRTaWduQml0KEJpdFdpZHRoKTsKKyAgICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSS0+Z2V0T3BlcmFuZCgwKSwgTWFzazIsIEtub3duWmVybzIsIEtub3duT25lMiwgVEQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXB0aCsxKTsKKworICAgICAgICAvLyBUaGUgbG93IGJpdHMgb2YgdGhlIGZpcnN0IG9wZXJhbmQgYXJlIHVuY2hhbmdlZCBieSB0aGUgc3JlbS4KKyAgICAgICAgS25vd25aZXJvID0gS25vd25aZXJvMiAmIExvd0JpdHM7CisgICAgICAgIEtub3duT25lID0gS25vd25PbmUyICYgTG93Qml0czsKKworICAgICAgICAvLyBJZiB0aGUgZmlyc3Qgb3BlcmFuZCBpcyBub24tbmVnYXRpdmUgb3IgaGFzIGFsbCBsb3cgYml0cyB6ZXJvLCB0aGVuCisgICAgICAgIC8vIHRoZSB1cHBlciBiaXRzIGFyZSBhbGwgemVyby4KKyAgICAgICAgaWYgKEtub3duWmVybzJbQml0V2lkdGgtMV0gfHwgKChLbm93blplcm8yICYgTG93Qml0cykgPT0gTG93Qml0cykpCisgICAgICAgICAgS25vd25aZXJvIHw9IH5Mb3dCaXRzOworCisgICAgICAgIC8vIElmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIG5lZ2F0aXZlIGFuZCBub3QgYWxsIGxvdyBiaXRzIGFyZSB6ZXJvLCB0aGVuCisgICAgICAgIC8vIHRoZSB1cHBlciBiaXRzIGFyZSBhbGwgb25lLgorICAgICAgICBpZiAoS25vd25PbmUyW0JpdFdpZHRoLTFdICYmICgoS25vd25PbmUyICYgTG93Qml0cykgIT0gMCkpCisgICAgICAgICAgS25vd25PbmUgfD0gfkxvd0JpdHM7CisKKyAgICAgICAgS25vd25aZXJvICY9IE1hc2s7CisgICAgICAgIEtub3duT25lICY9IE1hc2s7CisKKyAgICAgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbTogeworICAgIGlmIChDb25zdGFudEludCAqUmVtID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEktPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBBUEludCBSQSA9IFJlbS0+Z2V0VmFsdWUoKTsKKyAgICAgIGlmIChSQS5pc1Bvd2VyT2YyKCkpIHsKKyAgICAgICAgQVBJbnQgTG93Qml0cyA9IChSQSAtIDEpOworICAgICAgICBBUEludCBNYXNrMiA9IExvd0JpdHMgJiBNYXNrOworICAgICAgICBLbm93blplcm8gfD0gfkxvd0JpdHMgJiBNYXNrOworICAgICAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDApLCBNYXNrMiwgS25vd25aZXJvLCBLbm93bk9uZSwgVEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHRoKzEpOworICAgICAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8gU2luY2UgdGhlIHJlc3VsdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZWl0aGVyIG9wZXJhbmQsIGFueSBsZWFkaW5nCisgICAgLy8gemVybyBiaXRzIGluIGVpdGhlciBvcGVyYW5kIG11c3QgYWxzbyBleGlzdCBpbiB0aGUgcmVzdWx0LgorICAgIEFQSW50IEFsbE9uZXMgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDApLCBBbGxPbmVzLCBLbm93blplcm8sIEtub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgIFRELCBEZXB0aCsxKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDEpLCBBbGxPbmVzLCBLbm93blplcm8yLCBLbm93bk9uZTIsCisgICAgICAgICAgICAgICAgICAgICAgVEQsIERlcHRoKzEpOworCisgICAgdW5zaWduZWQgTGVhZGVycyA9IHN0ZDo6bWF4KEtub3duWmVyby5jb3VudExlYWRpbmdPbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybzIuY291bnRMZWFkaW5nT25lcygpKTsKKyAgICBLbm93bk9uZS5jbGVhcigpOworICAgIEtub3duWmVybyA9IEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgTGVhZGVycykgJiBNYXNrOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QWxsb2NhOiB7CisgICAgQWxsb2NhSW5zdCAqQUkgPSBjYXN0PEFsbG9jYUluc3Q+KFYpOworICAgIHVuc2lnbmVkIEFsaWduID0gQUktPmdldEFsaWdubWVudCgpOworICAgIGlmIChBbGlnbiA9PSAwICYmIFREKQorICAgICAgQWxpZ24gPSBURC0+Z2V0QUJJVHlwZUFsaWdubWVudChBSS0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICAKKyAgICBpZiAoQWxpZ24gPiAwKQorICAgICAgS25vd25aZXJvID0gTWFzayAmIEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50VHJhaWxpbmdaZXJvc18zMihBbGlnbikpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHI6IHsKKyAgICAvLyBBbmFseXplIGFsbCBvZiB0aGUgc3Vic2NyaXB0cyBvZiB0aGlzIGdldGVsZW1lbnRwdHIgaW5zdHJ1Y3Rpb24KKyAgICAvLyB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHByb3ZlIGtub3duIGxvdyB6ZXJvIGJpdHMuCisgICAgQVBJbnQgTG9jYWxNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShCaXRXaWR0aCk7CisgICAgQVBJbnQgTG9jYWxLbm93blplcm8oQml0V2lkdGgsIDApLCBMb2NhbEtub3duT25lKEJpdFdpZHRoLCAwKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDApLCBMb2NhbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgTG9jYWxLbm93blplcm8sIExvY2FsS25vd25PbmUsIFRELCBEZXB0aCsxKTsKKyAgICB1bnNpZ25lZCBUcmFpbFogPSBMb2NhbEtub3duWmVyby5jb3VudFRyYWlsaW5nT25lcygpOworCisgICAgZ2VwX3R5cGVfaXRlcmF0b3IgR1RJID0gZ2VwX3R5cGVfYmVnaW4oSSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IEktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpLCArK0dUSSkgeworICAgICAgVmFsdWUgKkluZGV4ID0gSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPigqR1RJKSkgeworICAgICAgICAvLyBIYW5kbGUgc3RydWN0IG1lbWJlciBvZmZzZXQgYXJpdGhtZXRpYy4KKyAgICAgICAgaWYgKCFURCkgcmV0dXJuOworICAgICAgICBjb25zdCBTdHJ1Y3RMYXlvdXQgKlNMID0gVEQtPmdldFN0cnVjdExheW91dChTVHkpOworICAgICAgICB1bnNpZ25lZCBJZHggPSBjYXN0PENvbnN0YW50SW50PihJbmRleCktPmdldFpFeHRWYWx1ZSgpOworICAgICAgICB1aW50NjRfdCBPZmZzZXQgPSBTTC0+Z2V0RWxlbWVudE9mZnNldChJZHgpOworICAgICAgICBUcmFpbFogPSBzdGQ6Om1pbihUcmFpbFosCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50VHJhaWxpbmdaZXJvc182NChPZmZzZXQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEhhbmRsZSBhcnJheSBpbmRleCBhcml0aG1ldGljLgorICAgICAgICBjb25zdCBUeXBlICpJbmRleGVkVHkgPSBHVEkuZ2V0SW5kZXhlZFR5cGUoKTsKKyAgICAgICAgaWYgKCFJbmRleGVkVHktPmlzU2l6ZWQoKSkgcmV0dXJuOworICAgICAgICB1bnNpZ25lZCBHRVBPcGlCaXRzID0gSW5kZXgtPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgICAgICB1aW50NjRfdCBUeXBlU2l6ZSA9IFREID8gVEQtPmdldFR5cGVBbGxvY1NpemUoSW5kZXhlZFR5KSA6IDE7CisgICAgICAgIExvY2FsTWFzayA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoR0VQT3BpQml0cyk7CisgICAgICAgIExvY2FsS25vd25aZXJvID0gTG9jYWxLbm93bk9uZSA9IEFQSW50KEdFUE9waUJpdHMsIDApOworICAgICAgICBDb21wdXRlTWFza2VkQml0cyhJbmRleCwgTG9jYWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEtub3duWmVybywgTG9jYWxLbm93bk9uZSwgVEQsIERlcHRoKzEpOworICAgICAgICBUcmFpbFogPSBzdGQ6Om1pbihUcmFpbFosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKENvdW50VHJhaWxpbmdaZXJvc182NChUeXBlU2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEtub3duWmVyby5jb3VudFRyYWlsaW5nT25lcygpKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIEtub3duWmVybyA9IEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLCBUcmFpbFopICYgTWFzazsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpQSEk6IHsKKyAgICBQSElOb2RlICpQID0gY2FzdDxQSElOb2RlPihJKTsKKyAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzaW1wbGUgdHdvLXByZWRlY2Vzc29yIHJlY3VycmVuY2UgUEhJLgorICAgIC8vIFRoZXJlJ3MgYSBsb3QgbW9yZSB0aGF0IGNvdWxkIHRoZW9yZXRpY2FsbHkgYmUgZG9uZSBoZXJlLCBidXQKKyAgICAvLyB0aGlzIGlzIHN1ZmZpY2llbnQgdG8gY2F0Y2ggc29tZSBpbnRlcmVzdGluZyBjYXNlcy4KKyAgICBpZiAoUC0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKSA9PSAyKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDI7ICsraSkgeworICAgICAgICBWYWx1ZSAqTCA9IFAtPmdldEluY29taW5nVmFsdWUoaSk7CisgICAgICAgIFZhbHVlICpSID0gUC0+Z2V0SW5jb21pbmdWYWx1ZSghaSk7CisgICAgICAgIE9wZXJhdG9yICpMVSA9IGR5bl9jYXN0PE9wZXJhdG9yPihMKTsKKyAgICAgICAgaWYgKCFMVSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdW5zaWduZWQgT3Bjb2RlID0gTFUtPmdldE9wY29kZSgpOworICAgICAgICAvLyBDaGVjayBmb3Igb3BlcmF0aW9ucyB0aGF0IGhhdmUgdGhlIHByb3BlcnR5IHRoYXQgaWYKKyAgICAgICAgLy8gYm90aCB0aGVpciBvcGVyYW5kcyBoYXZlIGxvdyB6ZXJvIGJpdHMsIHRoZSByZXN1bHQKKyAgICAgICAgLy8gd2lsbCBoYXZlIGxvdyB6ZXJvIGJpdHMuCisgICAgICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OkFkZCB8fAorICAgICAgICAgICAgT3Bjb2RlID09IEluc3RydWN0aW9uOjpTdWIgfHwKKyAgICAgICAgICAgIE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6QW5kIHx8CisgICAgICAgICAgICBPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246Ok9yIHx8CisgICAgICAgICAgICBPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246Ok11bCkgeworICAgICAgICAgIFZhbHVlICpMTCA9IExVLT5nZXRPcGVyYW5kKDApOworICAgICAgICAgIFZhbHVlICpMUiA9IExVLT5nZXRPcGVyYW5kKDEpOworICAgICAgICAgIC8vIEZpbmQgYSByZWN1cnJlbmNlLgorICAgICAgICAgIGlmIChMTCA9PSBJKQorICAgICAgICAgICAgTCA9IExSOworICAgICAgICAgIGVsc2UgaWYgKExSID09IEkpCisgICAgICAgICAgICBMID0gTEw7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgLy8gT2ssIHdlIGhhdmUgYSBQSEkgb2YgdGhlIGZvcm0gTCBvcD0gUi4gQ2hlY2sgZm9yIGxvdworICAgICAgICAgIC8vIHplcm8gYml0cy4KKyAgICAgICAgICBBUEludCBNYXNrMiA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpOworICAgICAgICAgIENvbXB1dGVNYXNrZWRCaXRzKFIsIE1hc2syLCBLbm93blplcm8yLCBLbm93bk9uZTIsIFRELCBEZXB0aCsxKTsKKyAgICAgICAgICBNYXNrMiA9IEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvMi5jb3VudFRyYWlsaW5nT25lcygpKTsKKworICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdGFrZSB0aGUgbWluaW11bSBudW1iZXIgb2Yga25vd24gYml0cworICAgICAgICAgIEFQSW50IEtub3duWmVybzMoS25vd25aZXJvKSwgS25vd25PbmUzKEtub3duT25lKTsKKyAgICAgICAgICBDb21wdXRlTWFza2VkQml0cyhMLCBNYXNrMiwgS25vd25aZXJvMywgS25vd25PbmUzLCBURCwgRGVwdGgrMSk7CisKKyAgICAgICAgICBLbm93blplcm8gPSBNYXNrICYKKyAgICAgICAgICAgICAgICAgICAgICBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihLbm93blplcm8yLmNvdW50VHJhaWxpbmdPbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvMy5jb3VudFRyYWlsaW5nT25lcygpKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UgdGFrZSB0aGUgdW5pb25zIG9mIHRoZSBrbm93biBiaXQgc2V0cyBvZiB0aGUgb3BlcmFuZHMsCisgICAgLy8gdGFraW5nIGNvbnNlcnZhdGl2ZSBjYXJlIHRvIGF2b2lkIGV4Y2Vzc2l2ZSByZWN1cnNpb24uCisgICAgaWYgKERlcHRoIDwgTWF4RGVwdGggLSAxICYmICFLbm93blplcm8gJiYgIUtub3duT25lKSB7CisgICAgICBLbm93blplcm8gPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKTsKKyAgICAgIEtub3duT25lID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShCaXRXaWR0aCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUC0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgLy8gU2tpcCBkaXJlY3Qgc2VsZiByZWZlcmVuY2VzLgorICAgICAgICBpZiAoUC0+Z2V0SW5jb21pbmdWYWx1ZShpKSA9PSBQKSBjb250aW51ZTsKKworICAgICAgICBLbm93blplcm8yID0gQVBJbnQoQml0V2lkdGgsIDApOworICAgICAgICBLbm93bk9uZTIgPSBBUEludChCaXRXaWR0aCwgMCk7CisgICAgICAgIC8vIFJlY3Vyc2UsIGJ1dCBjYXAgdGhlIHJlY3Vyc2lvbiB0byBvbmUgbGV2ZWwsIGJlY2F1c2Ugd2UgZG9uJ3QKKyAgICAgICAgLy8gd2FudCB0byB3YXN0ZSB0aW1lIHNwaW5uaW5nIGFyb3VuZCBpbiBsb29wcy4KKyAgICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoUC0+Z2V0SW5jb21pbmdWYWx1ZShpKSwgS25vd25aZXJvIHwgS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybzIsIEtub3duT25lMiwgVEQsIE1heERlcHRoLTEpOworICAgICAgICBLbm93blplcm8gJj0gS25vd25aZXJvMjsKKyAgICAgICAgS25vd25PbmUgJj0gS25vd25PbmUyOworICAgICAgICAvLyBJZiBhbGwgYml0cyBoYXZlIGJlZW4gcnVsZWQgb3V0LCB0aGVyZSdzIG5vIG5lZWQgdG8gY2hlY2sKKyAgICAgICAgLy8gbW9yZSBvcGVyYW5kcy4KKyAgICAgICAgaWYgKCFLbm93blplcm8gJiYgIUtub3duT25lKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpDYWxsOgorICAgIGlmIChJbnRyaW5zaWNJbnN0ICpJSSA9IGR5bl9jYXN0PEludHJpbnNpY0luc3Q+KEkpKSB7CisgICAgICBzd2l0Y2ggKElJLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgSW50cmluc2ljOjpjdHBvcDoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpjdGx6OgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmN0dHo6IHsKKyAgICAgICAgdW5zaWduZWQgTG93Qml0cyA9IExvZzJfMzIoQml0V2lkdGgpKzE7CisgICAgICAgIEtub3duWmVybyA9IEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgQml0V2lkdGggLSBMb3dCaXRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9Cit9CisKKy8vLyBNYXNrZWRWYWx1ZUlzWmVybyAtIFJldHVybiB0cnVlIGlmICdWICYgTWFzaycgaXMga25vd24gdG8gYmUgemVyby4gIFdlIHVzZQorLy8vIHRoaXMgcHJlZGljYXRlIHRvIHNpbXBsaWZ5IG9wZXJhdGlvbnMgZG93bnN0cmVhbS4gIE1hc2sgaXMga25vd24gdG8gYmUgemVybworLy8vIGZvciBiaXRzIHRoYXQgViBjYW5ub3QgaGF2ZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBvbiB2YWx1ZXMgd2l0aCBpbnRlZ2VyIHR5cGUsIHZhbHVlcyB3aXRoIHBvaW50ZXIKKy8vLyB0eXBlIChidXQgb25seSBpZiBURCBpcyBub24tbnVsbCksIGFuZCB2ZWN0b3JzIG9mIGludGVnZXJzLiAgSW4gdGhlIGNhc2UKKy8vLyB3aGVyZSBWIGlzIGEgdmVjdG9yLCB0aGUgbWFzaywga25vd24gemVybywgYW5kIGtub3duIG9uZSB2YWx1ZXMgYXJlIHRoZQorLy8vIHNhbWUgd2lkdGggYXMgdGhlIHZlY3RvciBlbGVtZW50LCBhbmQgdGhlIGJpdCBpcyBzZXQgb25seSBpZiBpdCBpcyB0cnVlCisvLy8gZm9yIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KK2Jvb2wgbGx2bTo6TWFza2VkVmFsdWVJc1plcm8oVmFsdWUgKlYsIGNvbnN0IEFQSW50ICZNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCwgdW5zaWduZWQgRGVwdGgpIHsKKyAgQVBJbnQgS25vd25aZXJvKE1hc2suZ2V0Qml0V2lkdGgoKSwgMCksIEtub3duT25lKE1hc2suZ2V0Qml0V2lkdGgoKSwgMCk7CisgIENvbXB1dGVNYXNrZWRCaXRzKFYsIE1hc2ssIEtub3duWmVybywgS25vd25PbmUsIFRELCBEZXB0aCk7CisgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgcmV0dXJuIChLbm93blplcm8gJiBNYXNrKSA9PSBNYXNrOworfQorCisKKworLy8vIENvbXB1dGVOdW1TaWduQml0cyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzaWduIGJpdCBvZiB0aGUKKy8vLyByZWdpc3RlciBpcyByZXBsaWNhdGVkIGludG8gdGhlIG90aGVyIGJpdHMuICBXZSBrbm93IHRoYXQgYXQgbGVhc3QgMSBiaXQKKy8vLyBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIHNpZ24gYml0IChpdHNlbGYpLCBidXQgb3RoZXIgY2FzZXMgY2FuIGdpdmUgdXMKKy8vLyBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBpbW1lZGlhdGVseSBhZnRlciBhbiAiYXNociBYLCAyIiwgd2Uga25vdyB0aGF0CisvLy8gdGhlIHRvcCAzIGJpdHMgYXJlIGFsbCBlcXVhbCB0byBlYWNoIG90aGVyLCBzbyB3ZSByZXR1cm4gMy4KKy8vLworLy8vICdPcCcgbXVzdCBoYXZlIGEgc2NhbGFyIGludGVnZXIgdHlwZS4KKy8vLwordW5zaWduZWQgbGx2bTo6Q29tcHV0ZU51bVNpZ25CaXRzKFZhbHVlICpWLCBjb25zdCBUYXJnZXREYXRhICpURCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCkgeworICBhc3NlcnQoKFREIHx8IFYtPmdldFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkpICYmCisgICAgICAgICAiQ29tcHV0ZU51bVNpZ25CaXRzIHJlcXVpcmVzIGEgVGFyZ2V0RGF0YSBvYmplY3QgdG8gb3BlcmF0ZSAiCisgICAgICAgICAib24gbm9uLWludGVnZXIgdmFsdWVzISIpOworICBjb25zdCBUeXBlICpUeSA9IFYtPmdldFR5cGUoKTsKKyAgdW5zaWduZWQgVHlCaXRzID0gVEQgPyBURC0+Z2V0VHlwZVNpemVJbkJpdHMoVi0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJUeXBlKCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICB1bnNpZ25lZCBUbXAsIFRtcDI7CisgIHVuc2lnbmVkIEZpcnN0QW5zd2VyID0gMTsKKworICAvLyBOb3RlIHRoYXQgQ29uc3RhbnRJbnQgaXMgaGFuZGxlZCBieSB0aGUgZ2VuZXJhbCBDb21wdXRlTWFza2VkQml0cyBjYXNlCisgIC8vIGJlbG93LgorCisgIGlmIChEZXB0aCA9PSA2KQorICAgIHJldHVybiAxOyAgLy8gTGltaXQgc2VhcmNoIGRlcHRoLgorICAKKyAgT3BlcmF0b3IgKlUgPSBkeW5fY2FzdDxPcGVyYXRvcj4oVik7CisgIHN3aXRjaCAoT3BlcmF0b3I6OmdldE9wY29kZShWKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDoKKyAgICBUbXAgPSBUeUJpdHMgLSBVLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICByZXR1cm4gQ29tcHV0ZU51bVNpZ25CaXRzKFUtPmdldE9wZXJhbmQoMCksIFRELCBEZXB0aCsxKSArIFRtcDsKKyAgICAKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICBUbXAgPSBDb21wdXRlTnVtU2lnbkJpdHMoVS0+Z2V0T3BlcmFuZCgwKSwgVEQsIERlcHRoKzEpOworICAgIC8vIGFzaHIgWCwgQyAgIC0+IGFkZHMgQyBzaWduIGJpdHMuCisgICAgaWYgKENvbnN0YW50SW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFUtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBUbXAgKz0gQy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBpZiAoVG1wID4gVHlCaXRzKSBUbXAgPSBUeUJpdHM7CisgICAgfQorICAgIHJldHVybiBUbXA7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDoKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIC8vIHNobCBkZXN0cm95cyBzaWduIGJpdHMuCisgICAgICBUbXAgPSBDb21wdXRlTnVtU2lnbkJpdHMoVS0+Z2V0T3BlcmFuZCgwKSwgVEQsIERlcHRoKzEpOworICAgICAgaWYgKEMtPmdldFpFeHRWYWx1ZSgpID49IFR5Qml0cyB8fCAgICAgIC8vIEJhZCBzaGlmdC4KKyAgICAgICAgICBDLT5nZXRaRXh0VmFsdWUoKSA+PSBUbXApIGJyZWFrOyAgICAvLyBTaGlmdGVkIGFsbCBzaWduIGJpdHMgb3V0LgorICAgICAgcmV0dXJuIFRtcCAtIEMtPmdldFpFeHRWYWx1ZSgpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QW5kOgorICBjYXNlIEluc3RydWN0aW9uOjpPcjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOiAgICAvLyBOT1QgaXMgaGFuZGxlZCBoZXJlLgorICAgIC8vIExvZ2ljYWwgYmluYXJ5IG9wcyBwcmVzZXJ2ZSB0aGUgbnVtYmVyIG9mIHNpZ24gYml0cyBhdCB0aGUgd29yc3QuCisgICAgVG1wID0gQ29tcHV0ZU51bVNpZ25CaXRzKFUtPmdldE9wZXJhbmQoMCksIFRELCBEZXB0aCsxKTsKKyAgICBpZiAoVG1wICE9IDEpIHsKKyAgICAgIFRtcDIgPSBDb21wdXRlTnVtU2lnbkJpdHMoVS0+Z2V0T3BlcmFuZCgxKSwgVEQsIERlcHRoKzEpOworICAgICAgRmlyc3RBbnN3ZXIgPSBzdGQ6Om1pbihUbXAsIFRtcDIpOworICAgICAgLy8gV2UgY29tcHV0ZWQgd2hhdCB3ZSBrbm93IGFib3V0IHRoZSBzaWduIGJpdHMgYXMgb3VyIGZpcnN0CisgICAgICAvLyBhbnN3ZXIuIE5vdyBwcm9jZWVkIHRvIHRoZSBnZW5lcmljIGNvZGUgdGhhdCB1c2VzCisgICAgICAvLyBDb21wdXRlTWFza2VkQml0cywgYW5kIHBpY2sgd2hpY2hldmVyIGFuc3dlciBpcyBiZXR0ZXIuCisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNlbGVjdDoKKyAgICBUbXAgPSBDb21wdXRlTnVtU2lnbkJpdHMoVS0+Z2V0T3BlcmFuZCgxKSwgVEQsIERlcHRoKzEpOworICAgIGlmIChUbXAgPT0gMSkgcmV0dXJuIDE7ICAvLyBFYXJseSBvdXQuCisgICAgVG1wMiA9IENvbXB1dGVOdW1TaWduQml0cyhVLT5nZXRPcGVyYW5kKDIpLCBURCwgRGVwdGgrMSk7CisgICAgcmV0dXJuIHN0ZDo6bWluKFRtcCwgVG1wMik7CisgICAgCisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICAvLyBBZGQgY2FuIGhhdmUgYXQgbW9zdCBvbmUgY2FycnkgYml0LiAgVGh1cyB3ZSBrbm93IHRoYXQgdGhlIG91dHB1dAorICAgIC8vIGlzLCBhdCB3b3JzdCwgb25lIG1vcmUgYml0IHRoYW4gdGhlIGlucHV0cy4KKyAgICBUbXAgPSBDb21wdXRlTnVtU2lnbkJpdHMoVS0+Z2V0T3BlcmFuZCgwKSwgVEQsIERlcHRoKzEpOworICAgIGlmIChUbXAgPT0gMSkgcmV0dXJuIDE7ICAvLyBFYXJseSBvdXQuCisgICAgICAKKyAgICAvLyBTcGVjaWFsIGNhc2UgZGVjcmVtZW50aW5nIGEgdmFsdWUgKEFERCBYLCAtMSk6CisgICAgaWYgKENvbnN0YW50SW50ICpDUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFUtPmdldE9wZXJhbmQoMSkpKQorICAgICAgaWYgKENSSFMtPmlzQWxsT25lc1ZhbHVlKCkpIHsKKyAgICAgICAgQVBJbnQgS25vd25aZXJvKFR5Qml0cywgMCksIEtub3duT25lKFR5Qml0cywgMCk7CisgICAgICAgIEFQSW50IE1hc2sgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKFR5Qml0cyk7CisgICAgICAgIENvbXB1dGVNYXNrZWRCaXRzKFUtPmdldE9wZXJhbmQoMCksIE1hc2ssIEtub3duWmVybywgS25vd25PbmUsIFRELAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXB0aCsxKTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBrbm93biB0byBiZSAwIG9yIDEsIHRoZSBvdXRwdXQgaXMgMC8tMSwgd2hpY2ggaXMgYWxsCisgICAgICAgIC8vIHNpZ24gYml0cyBzZXQuCisgICAgICAgIGlmICgoS25vd25aZXJvIHwgQVBJbnQoVHlCaXRzLCAxKSkgPT0gTWFzaykKKyAgICAgICAgICByZXR1cm4gVHlCaXRzOworICAgICAgICAKKyAgICAgICAgLy8gSWYgd2UgYXJlIHN1YnRyYWN0aW5nIG9uZSBmcm9tIGEgcG9zaXRpdmUgbnVtYmVyLCB0aGVyZSBpcyBubyBjYXJyeQorICAgICAgICAvLyBvdXQgb2YgdGhlIHJlc3VsdC4KKyAgICAgICAgaWYgKEtub3duWmVyby5pc05lZ2F0aXZlKCkpCisgICAgICAgICAgcmV0dXJuIFRtcDsKKyAgICAgIH0KKyAgICAgIAorICAgIFRtcDIgPSBDb21wdXRlTnVtU2lnbkJpdHMoVS0+Z2V0T3BlcmFuZCgxKSwgVEQsIERlcHRoKzEpOworICAgIGlmIChUbXAyID09IDEpIHJldHVybiAxOworICAgIHJldHVybiBzdGQ6Om1pbihUbXAsIFRtcDIpLTE7CisgICAgCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgICBUbXAyID0gQ29tcHV0ZU51bVNpZ25CaXRzKFUtPmdldE9wZXJhbmQoMSksIFRELCBEZXB0aCsxKTsKKyAgICBpZiAoVG1wMiA9PSAxKSByZXR1cm4gMTsKKyAgICAgIAorICAgIC8vIEhhbmRsZSBORUcuCisgICAgaWYgKENvbnN0YW50SW50ICpDTEhTID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFUtPmdldE9wZXJhbmQoMCkpKQorICAgICAgaWYgKENMSFMtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgQVBJbnQgS25vd25aZXJvKFR5Qml0cywgMCksIEtub3duT25lKFR5Qml0cywgMCk7CisgICAgICAgIEFQSW50IE1hc2sgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKFR5Qml0cyk7CisgICAgICAgIENvbXB1dGVNYXNrZWRCaXRzKFUtPmdldE9wZXJhbmQoMSksIE1hc2ssIEtub3duWmVybywgS25vd25PbmUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBURCwgRGVwdGgrMSk7CisgICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBrbm93biB0byBiZSAwIG9yIDEsIHRoZSBvdXRwdXQgaXMgMC8tMSwgd2hpY2ggaXMgYWxsCisgICAgICAgIC8vIHNpZ24gYml0cyBzZXQuCisgICAgICAgIGlmICgoS25vd25aZXJvIHwgQVBJbnQoVHlCaXRzLCAxKSkgPT0gTWFzaykKKyAgICAgICAgICByZXR1cm4gVHlCaXRzOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGtub3duIHRvIGJlIHBvc2l0aXZlICh0aGUgc2lnbiBiaXQgaXMga25vd24gY2xlYXIpLAorICAgICAgICAvLyB0aGUgb3V0cHV0IG9mIHRoZSBORUcgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBzaWduIGJpdHMgYXMgdGhlIGlucHV0LgorICAgICAgICBpZiAoS25vd25aZXJvLmlzTmVnYXRpdmUoKSkKKyAgICAgICAgICByZXR1cm4gVG1wMjsKKyAgICAgICAgCisgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgdHJlYXQgdGhpcyBsaWtlIGEgU1VCLgorICAgICAgfQorICAgIAorICAgIC8vIFN1YiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBjYXJyeSBiaXQuICBUaHVzIHdlIGtub3cgdGhhdCB0aGUgb3V0cHV0CisgICAgLy8gaXMsIGF0IHdvcnN0LCBvbmUgbW9yZSBiaXQgdGhhbiB0aGUgaW5wdXRzLgorICAgIFRtcCA9IENvbXB1dGVOdW1TaWduQml0cyhVLT5nZXRPcGVyYW5kKDApLCBURCwgRGVwdGgrMSk7CisgICAgaWYgKFRtcCA9PSAxKSByZXR1cm4gMTsgIC8vIEVhcmx5IG91dC4KKyAgICByZXR1cm4gc3RkOjptaW4oVG1wLCBUbXAyKS0xOworICAgICAgCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlBISTogeworICAgIFBISU5vZGUgKlBOID0gY2FzdDxQSElOb2RlPihVKTsKKyAgICAvLyBEb24ndCBhbmFseXplIGxhcmdlIGluLWRlZ3JlZSBQSElzLgorICAgIGlmIChQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKSA+IDQpIGJyZWFrOworICAgIAorICAgIC8vIFRha2UgdGhlIG1pbmltdW0gb2YgYWxsIGluY29taW5nIHZhbHVlcy4gIFRoaXMgY2FuJ3QgaW5maW5pdGVseSBsb29wCisgICAgLy8gYmVjYXVzZSBvZiBvdXIgZGVwdGggdGhyZXNob2xkLgorICAgIFRtcCA9IENvbXB1dGVOdW1TaWduQml0cyhQTi0+Z2V0SW5jb21pbmdWYWx1ZSgwKSwgVEQsIERlcHRoKzEpOworICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChUbXAgPT0gMSkgcmV0dXJuIFRtcDsKKyAgICAgIFRtcCA9IHN0ZDo6bWluKFRtcCwKKyAgICAgICAgICAgICAgICAgICAgIENvbXB1dGVOdW1TaWduQml0cyhQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKSwgVEQsIERlcHRoKzEpKTsKKyAgICB9CisgICAgcmV0dXJuIFRtcDsKKyAgfQorCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICAgIC8vIEZJWE1FOiBpdCdzIHRyaWNreSB0byBkbyBhbnl0aGluZyB1c2VmdWwgZm9yIHRoaXMsIGJ1dCBpdCBpcyBhbiBpbXBvcnRhbnQKKyAgICAvLyBjYXNlIGZvciB0YXJnZXRzIGxpa2UgWDg2LgorICAgIGJyZWFrOworICB9CisgIAorICAvLyBGaW5hbGx5LCBpZiB3ZSBjYW4gcHJvdmUgdGhhdCB0aGUgdG9wIGJpdHMgb2YgdGhlIHJlc3VsdCBhcmUgMCdzIG9yIDEncywKKyAgLy8gdXNlIHRoaXMgaW5mb3JtYXRpb24uCisgIEFQSW50IEtub3duWmVybyhUeUJpdHMsIDApLCBLbm93bk9uZShUeUJpdHMsIDApOworICBBUEludCBNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShUeUJpdHMpOworICBDb21wdXRlTWFza2VkQml0cyhWLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBURCwgRGVwdGgpOworICAKKyAgaWYgKEtub3duWmVyby5pc05lZ2F0aXZlKCkpIHsgICAgICAgIC8vIHNpZ24gYml0IGlzIDAKKyAgICBNYXNrID0gS25vd25aZXJvOworICB9IGVsc2UgaWYgKEtub3duT25lLmlzTmVnYXRpdmUoKSkgeyAgLy8gc2lnbiBiaXQgaXMgMTsKKyAgICBNYXNrID0gS25vd25PbmU7CisgIH0gZWxzZSB7CisgICAgLy8gTm90aGluZyBrbm93bi4KKyAgICByZXR1cm4gRmlyc3RBbnN3ZXI7CisgIH0KKyAgCisgIC8vIE9rYXksIHdlIGtub3cgdGhhdCB0aGUgc2lnbiBiaXQgaW4gTWFzayBpcyBzZXQuICBVc2UgQ0xaIHRvIGRldGVybWluZQorICAvLyB0aGUgbnVtYmVyIG9mIGlkZW50aWNhbCBiaXRzIGluIHRoZSB0b3Agb2YgdGhlIGlucHV0IHZhbHVlLgorICBNYXNrID0gfk1hc2s7CisgIE1hc2sgPDw9IE1hc2suZ2V0Qml0V2lkdGgoKS1UeUJpdHM7CisgIC8vIFJldHVybiAjIGxlYWRpbmcgemVyb3MuICBXZSB1c2UgJ21pbicgaGVyZSBpbiBjYXNlIFZhbCB3YXMgemVybyBiZWZvcmUKKyAgLy8gc2hpZnRpbmcuICBXZSBkb24ndCB3YW50IHRvIHJldHVybiAnNjQnIGFzIGZvciBhbiBpMzIgIjAiLgorICByZXR1cm4gc3RkOjptYXgoRmlyc3RBbnN3ZXIsIHN0ZDo6bWluKFR5Qml0cywgTWFzay5jb3VudExlYWRpbmdaZXJvcygpKSk7Cit9CisKKy8vLyBDb21wdXRlTXVsdGlwbGUgLSBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBpbnRlZ2VyIG11bHRpcGxlIG9mIEJhc2UgdGhhdAorLy8vIGVxdWFscyBWLiAgSWYgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyB0cnVlIGFuZCByZXR1cm5zIHRoZSBtdWx0aXBsZSBpbgorLy8vIE11bHRpcGxlLiAgSWYgdW5zdWNjZXNzZnVsLCBpdCByZXR1cm5zIGZhbHNlLiBJdCBsb29rcworLy8vIHRocm91Z2ggU0V4dCBpbnN0cnVjdGlvbnMgb25seSBpZiBMb29rVGhyb3VnaFNFeHQgaXMgdHJ1ZS4KK2Jvb2wgbGx2bTo6Q29tcHV0ZU11bHRpcGxlKFZhbHVlICpWLCB1bnNpZ25lZCBCYXNlLCBWYWx1ZSAqJk11bHRpcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaFNFeHQsIHVuc2lnbmVkIERlcHRoKSB7CisgIGNvbnN0IHVuc2lnbmVkIE1heERlcHRoID0gNjsKKworICBhc3NlcnQoViAmJiAiTm8gVmFsdWU/Iik7CisgIGFzc2VydChEZXB0aCA8PSBNYXhEZXB0aCAmJiAiTGltaXQgU2VhcmNoIERlcHRoIik7CisgIGFzc2VydChWLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkgJiYgIk5vdCBpbnRlZ2VyIG9yIHBvaW50ZXIgdHlwZSEiKTsKKworICBjb25zdCBUeXBlICpUID0gVi0+Z2V0VHlwZSgpOworCisgIENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKTsKKworICBpZiAoQmFzZSA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgaWYgKEJhc2UgPT0gMSkgeworICAgIE11bHRpcGxlID0gVjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIENvbnN0YW50RXhwciAqQ08gPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpOworICBDb25zdGFudCAqQmFzZVZhbCA9IENvbnN0YW50SW50OjpnZXQoVCwgQmFzZSk7CisgIGlmIChDTyAmJiBDTyA9PSBCYXNlVmFsKSB7CisgICAgLy8gTXVsdGlwbGUgaXMgMS4KKyAgICBNdWx0aXBsZSA9IENvbnN0YW50SW50OjpnZXQoVCwgMSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoQ0kgJiYgQ0ktPmdldFpFeHRWYWx1ZSgpICUgQmFzZSA9PSAwKSB7CisgICAgTXVsdGlwbGUgPSBDb25zdGFudEludDo6Z2V0KFQsIENJLT5nZXRaRXh0VmFsdWUoKSAvIEJhc2UpOworICAgIHJldHVybiB0cnVlOyAgCisgIH0KKyAgCisgIGlmIChEZXB0aCA9PSBNYXhEZXB0aCkgcmV0dXJuIGZhbHNlOyAgLy8gTGltaXQgc2VhcmNoIGRlcHRoLgorICAgICAgICAKKyAgT3BlcmF0b3IgKkkgPSBkeW5fY2FzdDxPcGVyYXRvcj4oVik7CisgIGlmICghSSkgcmV0dXJuIGZhbHNlOworCisgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6CisgICAgaWYgKCFMb29rVGhyb3VnaFNFeHQpIHJldHVybiBmYWxzZTsKKyAgICAvLyBvdGhlcndpc2UgZmFsbCB0aHJvdWdoIHRvIFpFeHQKKyAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDoKKyAgICByZXR1cm4gQ29tcHV0ZU11bHRpcGxlKEktPmdldE9wZXJhbmQoMCksIEJhc2UsIE11bHRpcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va1Rocm91Z2hTRXh0LCBEZXB0aCsxKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICBjYXNlIEluc3RydWN0aW9uOjpNdWw6IHsKKyAgICBWYWx1ZSAqT3AwID0gSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBWYWx1ZSAqT3AxID0gSS0+Z2V0T3BlcmFuZCgxKTsKKworICAgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U2hsKSB7CisgICAgICBDb25zdGFudEludCAqT3AxQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AxKTsKKyAgICAgIGlmICghT3AxQ0kpIHJldHVybiBmYWxzZTsKKyAgICAgIC8vIFR1cm4gT3AwIDw8IE9wMSBpbnRvIE9wMCAqIDJeT3AxCisgICAgICBBUEludCBPcDFJbnQgPSBPcDFDSS0+Z2V0VmFsdWUoKTsKKyAgICAgIHVpbnQ2NF90IEJpdFRvU2V0ID0gT3AxSW50LmdldExpbWl0ZWRWYWx1ZShPcDFJbnQuZ2V0Qml0V2lkdGgoKSAtIDEpOworICAgICAgT3AxID0gQ29uc3RhbnRJbnQ6OmdldChWLT5nZXRDb250ZXh0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludChPcDFJbnQuZ2V0Qml0V2lkdGgoKSwgMCkuc2V0KEJpdFRvU2V0KSk7CisgICAgfQorCisgICAgVmFsdWUgKk11bDAgPSBOVUxMOworICAgIFZhbHVlICpNdWwxID0gTlVMTDsKKyAgICBib29sIE0wID0gQ29tcHV0ZU11bHRpcGxlKE9wMCwgQmFzZSwgTXVsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2tUaHJvdWdoU0V4dCwgRGVwdGgrMSk7CisgICAgYm9vbCBNMSA9IENvbXB1dGVNdWx0aXBsZShPcDEsIEJhc2UsIE11bDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rVGhyb3VnaFNFeHQsIERlcHRoKzEpOworCisgICAgaWYgKE0wKSB7CisgICAgICBpZiAoaXNhPENvbnN0YW50PihPcDEpICYmIGlzYTxDb25zdGFudD4oTXVsMCkpIHsKKyAgICAgICAgLy8gViA9PSBCYXNlICogKE11bDAgKiBPcDEpLCBzbyByZXR1cm4gKE11bDAgKiBPcDEpCisgICAgICAgIE11bHRpcGxlID0gQ29uc3RhbnRFeHByOjpnZXRNdWwoY2FzdDxDb25zdGFudD4oTXVsMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25zdGFudD4oT3AxKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoQ29uc3RhbnRJbnQgKk11bDBDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihNdWwwKSkKKyAgICAgICAgaWYgKE11bDBDSS0+Z2V0VmFsdWUoKSA9PSAxKSB7CisgICAgICAgICAgLy8gViA9PSBCYXNlICogT3AxLCBzbyByZXR1cm4gT3AxCisgICAgICAgICAgTXVsdGlwbGUgPSBPcDE7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTTEpIHsKKyAgICAgIGlmIChpc2E8Q29uc3RhbnQ+KE9wMCkgJiYgaXNhPENvbnN0YW50PihNdWwxKSkgeworICAgICAgICAvLyBWID09IEJhc2UgKiAoTXVsMSAqIE9wMCksIHNvIHJldHVybiAoTXVsMSAqIE9wMCkKKyAgICAgICAgTXVsdGlwbGUgPSBDb25zdGFudEV4cHI6OmdldE11bChjYXN0PENvbnN0YW50PihNdWwxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50PihPcDApKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChDb25zdGFudEludCAqTXVsMUNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE11bDEpKQorICAgICAgICBpZiAoTXVsMUNJLT5nZXRWYWx1ZSgpID09IDEpIHsKKyAgICAgICAgICAvLyBWID09IEJhc2UgKiBPcDAsIHNvIHJldHVybiBPcDAKKyAgICAgICAgICBNdWx0aXBsZSA9IE9wMDsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorICB9CisKKyAgLy8gV2UgY291bGQgbm90IGRldGVybWluZSBpZiBWIGlzIGEgbXVsdGlwbGUgb2YgQmFzZS4KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gQ2Fubm90QmVOZWdhdGl2ZVplcm8gLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gcHJvdmUgdGhhdCB0aGUgc3BlY2lmaWVkIEZQIAorLy8vIHZhbHVlIGlzIG5ldmVyIGVxdWFsIHRvIC0wLjAuCisvLy8KKy8vLyBOT1RFOiB0aGlzIGZ1bmN0aW9uIHdpbGwgbmVlZCB0byBiZSByZXZpc2l0ZWQgd2hlbiB3ZSBzdXBwb3J0IG5vbi1kZWZhdWx0CisvLy8gcm91bmRpbmcgbW9kZXMhCisvLy8KK2Jvb2wgbGx2bTo6Q2Fubm90QmVOZWdhdGl2ZVplcm8oY29uc3QgVmFsdWUgKlYsIHVuc2lnbmVkIERlcHRoKSB7CisgIGlmIChjb25zdCBDb25zdGFudEZQICpDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQPihWKSkKKyAgICByZXR1cm4gIUNGUC0+Z2V0VmFsdWVBUEYoKS5pc05lZ1plcm8oKTsKKyAgCisgIGlmIChEZXB0aCA9PSA2KQorICAgIHJldHVybiAxOyAgLy8gTGltaXQgc2VhcmNoIGRlcHRoLgorCisgIGNvbnN0IE9wZXJhdG9yICpJID0gZHluX2Nhc3Q8T3BlcmF0b3I+KFYpOworICBpZiAoSSA9PSAwKSByZXR1cm4gZmFsc2U7CisgIAorICAvLyAoYWRkIHgsIDAuMCkgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gKzAuMCwgbm90IC0wLjAuCisgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkFkZCAmJgorICAgICAgaXNhPENvbnN0YW50RlA+KEktPmdldE9wZXJhbmQoMSkpICYmIAorICAgICAgY2FzdDxDb25zdGFudEZQPihJLT5nZXRPcGVyYW5kKDEpKS0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgLy8gc2l0b2ZwIGFuZCB1aXRvZnAgdHVybiBpbnRvICswLjAgZm9yIHplcm8uCisgIGlmIChpc2E8U0lUb0ZQSW5zdD4oSSkgfHwgaXNhPFVJVG9GUEluc3Q+KEkpKQorICAgIHJldHVybiB0cnVlOworICAKKyAgaWYgKGNvbnN0IEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oSSkpCisgICAgLy8gc3FydCgtMC4wKSA9IC0wLjAsIG5vIG90aGVyIG5lZ2F0aXZlIHJlc3VsdHMgYXJlIHBvc3NpYmxlLgorICAgIGlmIChJSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6OnNxcnQpCisgICAgICByZXR1cm4gQ2Fubm90QmVOZWdhdGl2ZVplcm8oSUktPmdldEFyZ09wZXJhbmQoMCksIERlcHRoKzEpOworICAKKyAgaWYgKGNvbnN0IENhbGxJbnN0ICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PihJKSkKKyAgICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBDSS0+Z2V0Q2FsbGVkRnVuY3Rpb24oKSkgeworICAgICAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSkgeworICAgICAgICAvLyBhYnMoeCkgIT0gLTAuMAorICAgICAgICBpZiAoRi0+Z2V0TmFtZSgpID09ICJhYnMiKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgLy8gZmFic1tsZl0oeCkgIT0gLTAuMAorICAgICAgICBpZiAoRi0+Z2V0TmFtZSgpID09ICJmYWJzIikgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChGLT5nZXROYW1lKCkgPT0gImZhYnNmIikgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChGLT5nZXROYW1lKCkgPT0gImZhYnNsIikgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChGLT5nZXROYW1lKCkgPT0gInNxcnQiIHx8IEYtPmdldE5hbWUoKSA9PSAic3FydGYiIHx8CisgICAgICAgICAgICBGLT5nZXROYW1lKCkgPT0gInNxcnRsIikKKyAgICAgICAgICByZXR1cm4gQ2Fubm90QmVOZWdhdGl2ZVplcm8oQ0ktPmdldEFyZ09wZXJhbmQoMCksIERlcHRoKzEpOworICAgICAgfQorICAgIH0KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gR2V0TGluZWFyRXhwcmVzc2lvbiAtIEFuYWx5emUgdGhlIHNwZWNpZmllZCB2YWx1ZSBhcyBhIGxpbmVhciBleHByZXNzaW9uOgorLy8vICJBKlYgKyBCIiwgd2hlcmUgQSBhbmQgQiBhcmUgY29uc3RhbnQgaW50ZWdlcnMuICBSZXR1cm4gdGhlIHNjYWxlIGFuZCBvZmZzZXQKKy8vLyB2YWx1ZXMgYXMgQVBJbnRzIGFuZCByZXR1cm4gViBhcyBhIFZhbHVlKi4gIFRoZSBpbmNvbWluZyBWYWx1ZSBpcyBrbm93biB0bworLy8vIGhhdmUgSW50ZWdlclR5cGUuICBOb3RlIHRoYXQgdGhpcyBsb29rcyB0aHJvdWdoIGV4dGVuZHMsIHNvIHRoZSBoaWdoIGJpdHMKKy8vLyBtYXkgbm90IGJlIHJlcHJlc2VudGVkIGluIHRoZSByZXN1bHQuCitzdGF0aWMgVmFsdWUgKkdldExpbmVhckV4cHJlc3Npb24oVmFsdWUgKlYsIEFQSW50ICZTY2FsZSwgQVBJbnQgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCwgdW5zaWduZWQgRGVwdGgpIHsKKyAgYXNzZXJ0KFYtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSAmJiAiTm90IGFuIGludGVnZXIgdmFsdWUiKTsKKworICAvLyBMaW1pdCBvdXIgcmVjdXJzaW9uIGRlcHRoLgorICBpZiAoRGVwdGggPT0gNikgeworICAgIFNjYWxlID0gMTsKKyAgICBPZmZzZXQgPSAwOworICAgIHJldHVybiBWOworICB9CisgIAorICBpZiAoQmluYXJ5T3BlcmF0b3IgKkJPcCA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihWKSkgeworICAgIGlmIChDb25zdGFudEludCAqUkhTQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihCT3AtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBzd2l0Y2ggKEJPcC0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgICAgICAgIC8vIFh8QyA9PSBYK0MgaWYgYWxsIHRoZSBiaXRzIGluIEMgYXJlIHVuc2V0IGluIFguICBPdGhlcndpc2Ugd2UgY2FuJ3QKKyAgICAgICAgLy8gYW5hbHl6ZSBpdC4KKyAgICAgICAgaWYgKCFNYXNrZWRWYWx1ZUlzWmVybyhCT3AtPmdldE9wZXJhbmQoMCksIFJIU0MtPmdldFZhbHVlKCksIFREKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gRkFMTCBUSFJPVUdILgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICAgICAgICBWID0gR2V0TGluZWFyRXhwcmVzc2lvbihCT3AtPmdldE9wZXJhbmQoMCksIFNjYWxlLCBPZmZzZXQsIFRELCBEZXB0aCsxKTsKKyAgICAgICAgT2Zmc2V0ICs9IFJIU0MtPmdldFZhbHVlKCk7CisgICAgICAgIHJldHVybiBWOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICAgICAgICBWID0gR2V0TGluZWFyRXhwcmVzc2lvbihCT3AtPmdldE9wZXJhbmQoMCksIFNjYWxlLCBPZmZzZXQsIFRELCBEZXB0aCsxKTsKKyAgICAgICAgT2Zmc2V0ICo9IFJIU0MtPmdldFZhbHVlKCk7CisgICAgICAgIFNjYWxlICo9IFJIU0MtPmdldFZhbHVlKCk7CisgICAgICAgIHJldHVybiBWOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgICAgICBWID0gR2V0TGluZWFyRXhwcmVzc2lvbihCT3AtPmdldE9wZXJhbmQoMCksIFNjYWxlLCBPZmZzZXQsIFRELCBEZXB0aCsxKTsKKyAgICAgICAgT2Zmc2V0IDw8PSBSSFNDLT5nZXRWYWx1ZSgpLmdldExpbWl0ZWRWYWx1ZSgpOworICAgICAgICBTY2FsZSA8PD0gUkhTQy0+Z2V0VmFsdWUoKS5nZXRMaW1pdGVkVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIFY7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvLyBTaW5jZSBjbGllbnRzIGRvbid0IGNhcmUgYWJvdXQgdGhlIGhpZ2ggYml0cyBvZiB0aGUgdmFsdWUsIGp1c3Qgc2NhbGVzIGFuZAorICAvLyBvZmZzZXRzLCB3ZSBjYW4gbG9vayB0aHJvdWdoIGV4dGVuc2lvbnMuCisgIGlmIChpc2E8U0V4dEluc3Q+KFYpIHx8IGlzYTxaRXh0SW5zdD4oVikpIHsKKyAgICBWYWx1ZSAqQ2FzdE9wID0gY2FzdDxDYXN0SW5zdD4oViktPmdldE9wZXJhbmQoMCk7CisgICAgdW5zaWduZWQgT2xkV2lkdGggPSBTY2FsZS5nZXRCaXRXaWR0aCgpOworICAgIHVuc2lnbmVkIFNtYWxsV2lkdGggPSBDYXN0T3AtPmdldFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworICAgIFNjYWxlLnRydW5jKFNtYWxsV2lkdGgpOworICAgIE9mZnNldC50cnVuYyhTbWFsbFdpZHRoKTsKKyAgICBWYWx1ZSAqUmVzdWx0ID0gR2V0TGluZWFyRXhwcmVzc2lvbihDYXN0T3AsIFNjYWxlLCBPZmZzZXQsIFRELCBEZXB0aCsxKTsKKyAgICBTY2FsZS56ZXh0KE9sZFdpZHRoKTsKKyAgICBPZmZzZXQuemV4dChPbGRXaWR0aCk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorICAKKyAgU2NhbGUgPSAxOworICBPZmZzZXQgPSAwOworICByZXR1cm4gVjsKK30KKworLy8vIERlY29tcG9zZUdFUEV4cHJlc3Npb24gLSBJZiBWIGlzIGEgc3ltYm9saWMgcG9pbnRlciBleHByZXNzaW9uLCBkZWNvbXBvc2UgaXQKKy8vLyBpbnRvIGEgYmFzZSBwb2ludGVyIHdpdGggYSBjb25zdGFudCBvZmZzZXQgYW5kIGEgbnVtYmVyIG9mIHNjYWxlZCBzeW1ib2xpYworLy8vIG9mZnNldHMuCisvLy8KKy8vLyBUaGUgc2NhbGVkIHN5bWJvbGljIG9mZnNldHMgKHJlcHJlc2VudGVkIGJ5IHBhaXJzIG9mIGEgVmFsdWUqIGFuZCBhIHNjYWxlIGluCisvLy8gdGhlIFZhckluZGljZXMgdmVjdG9yKSBhcmUgVmFsdWUqJ3MgdGhhdCBhcmUga25vd24gdG8gYmUgc2NhbGVkIGJ5IHRoZQorLy8vIHNwZWNpZmllZCBhbW91bnQsIGJ1dCB3aGljaCBtYXkgaGF2ZSBvdGhlciB1bnJlcHJlc2VudGVkIGhpZ2ggYml0cy4gQXMgc3VjaCwKKy8vLyB0aGUgZ2VwIGNhbm5vdCBuZWNlc3NhcmlseSBiZSByZWNvbnN0cnVjdGVkIGZyb20gaXRzIGRlY29tcG9zZWQgZm9ybS4KKy8vLworLy8vIFdoZW4gVGFyZ2V0RGF0YSBpcyBhcm91bmQsIHRoaXMgZnVuY3Rpb24gaXMgY2FwYWJsZSBvZiBhbmFseXppbmcgZXZlcnl0aGluZworLy8vIHRoYXQgVmFsdWU6OmdldFVuZGVybHlpbmdPYmplY3QoKSBjYW4gbG9vayB0aHJvdWdoLiAgV2hlbiBub3QsIGl0IGp1c3QgbG9va3MKKy8vLyB0aHJvdWdoIHBvaW50ZXIgY2FzdHMuCisvLy8KK2NvbnN0IFZhbHVlICpsbHZtOjpEZWNvbXBvc2VHRVBFeHByZXNzaW9uKGNvbnN0IFZhbHVlICpWLCBpbnQ2NF90ICZCYXNlT2ZmcywKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxjb25zdCBWYWx1ZSosIGludDY0X3Q+ID4gJlZhckluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICAvLyBMaW1pdCByZWN1cnNpb24gZGVwdGggdG8gbGltaXQgY29tcGlsZSB0aW1lIGluIGNyYXp5IGNhc2VzLgorICB1bnNpZ25lZCBNYXhMb29rdXAgPSA2OworICAKKyAgQmFzZU9mZnMgPSAwOworICBkbyB7CisgICAgLy8gU2VlIGlmIHRoaXMgaXMgYSBiaXRjYXN0IG9yIEdFUC4KKyAgICBjb25zdCBPcGVyYXRvciAqT3AgPSBkeW5fY2FzdDxPcGVyYXRvcj4oVik7CisgICAgaWYgKE9wID09IDApIHsKKyAgICAgIC8vIFRoZSBvbmx5IG5vbi1vcGVyYXRvciBjYXNlIHdlIGNhbiBoYW5kbGUgYXJlIEdsb2JhbEFsaWFzZXMuCisgICAgICBpZiAoY29uc3QgR2xvYmFsQWxpYXMgKkdBID0gZHluX2Nhc3Q8R2xvYmFsQWxpYXM+KFYpKSB7CisgICAgICAgIGlmICghR0EtPm1heUJlT3ZlcnJpZGRlbigpKSB7CisgICAgICAgICAgViA9IEdBLT5nZXRBbGlhc2VlKCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBWOworICAgIH0KKyAgICAKKyAgICBpZiAoT3AtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpCaXRDYXN0KSB7CisgICAgICBWID0gT3AtPmdldE9wZXJhbmQoMCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgY29uc3QgR0VQT3BlcmF0b3IgKkdFUE9wID0gZHluX2Nhc3Q8R0VQT3BlcmF0b3I+KE9wKTsKKyAgICBpZiAoR0VQT3AgPT0gMCkKKyAgICAgIHJldHVybiBWOworICAgIAorICAgIC8vIERvbid0IGF0dGVtcHQgdG8gYW5hbHl6ZSBHRVBzIG92ZXIgdW5zaXplZCBvYmplY3RzLgorICAgIGlmICghY2FzdDxQb2ludGVyVHlwZT4oR0VQT3AtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkKKyAgICAgICAgLT5nZXRFbGVtZW50VHlwZSgpLT5pc1NpemVkKCkpCisgICAgICByZXR1cm4gVjsKKyAgICAKKyAgICAvLyBJZiB3ZSBhcmUgbGFja2luZyBUYXJnZXREYXRhIGluZm9ybWF0aW9uLCB3ZSBjYW4ndCBjb21wdXRlIHRoZSBvZmZldHMgb2YKKyAgICAvLyBlbGVtZW50cyBjb21wdXRlZCBieSBHRVBzLiAgSG93ZXZlciwgd2UgY2FuIGhhbmRsZSBiaXRjYXN0IGVxdWl2YWxlbnQKKyAgICAvLyBHRVBzLgorICAgIGlmICghVEQpIHsKKyAgICAgIGlmICghR0VQT3AtPmhhc0FsbFplcm9JbmRpY2VzKCkpCisgICAgICAgIHJldHVybiBWOworICAgICAgViA9IEdFUE9wLT5nZXRPcGVyYW5kKDApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8vIFdhbGsgdGhlIGluZGljZXMgb2YgdGhlIEdFUCwgYWNjdW11bGF0aW5nIHRoZW0gaW50byBCYXNlT2ZmL1ZhckluZGljZXMuCisgICAgZ2VwX3R5cGVfaXRlcmF0b3IgR1RJID0gZ2VwX3R5cGVfYmVnaW4oR0VQT3ApOworICAgIGZvciAoVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3IgSSA9IEdFUE9wLT5vcF9iZWdpbigpKzEsCisgICAgICAgICBFID0gR0VQT3AtPm9wX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgVmFsdWUgKkluZGV4ID0gKkk7CisgICAgICAvLyBDb21wdXRlIHRoZSAocG90ZW50aWFsbHkgc3ltYm9saWMpIG9mZnNldCBpbiBieXRlcyBmb3IgdGhpcyBpbmRleC4KKyAgICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPigqR1RJKyspKSB7CisgICAgICAgIC8vIEZvciBhIHN0cnVjdCwgYWRkIHRoZSBtZW1iZXIgb2Zmc2V0LgorICAgICAgICB1bnNpZ25lZCBGaWVsZE5vID0gY2FzdDxDb25zdGFudEludD4oSW5kZXgpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgaWYgKEZpZWxkTm8gPT0gMCkgY29udGludWU7CisgICAgICAgIAorICAgICAgICBCYXNlT2ZmcyArPSBURC0+Z2V0U3RydWN0TGF5b3V0KFNUeSktPmdldEVsZW1lbnRPZmZzZXQoRmllbGRObyk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICAvLyBGb3IgYW4gYXJyYXkvcG9pbnRlciwgYWRkIHRoZSBlbGVtZW50IG9mZnNldCwgZXhwbGljaXRseSBzY2FsZWQuCisgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJZHggPSBkeW5fY2FzdDxDb25zdGFudEludD4oSW5kZXgpKSB7CisgICAgICAgIGlmIChDSWR4LT5pc1plcm8oKSkgY29udGludWU7CisgICAgICAgIEJhc2VPZmZzICs9IFRELT5nZXRUeXBlQWxsb2NTaXplKCpHVEkpKkNJZHgtPmdldFNFeHRWYWx1ZSgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdWludDY0X3QgU2NhbGUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZSgqR1RJKTsKKyAgICAgIAorICAgICAgLy8gVXNlIEdldExpbmVhckV4cHJlc3Npb24gdG8gZGVjb21wb3NlIHRoZSBpbmRleCBpbnRvIGEgQzEqVitDMiBmb3JtLgorICAgICAgdW5zaWduZWQgV2lkdGggPSBjYXN0PEludGVnZXJUeXBlPihJbmRleC0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAgIEFQSW50IEluZGV4U2NhbGUoV2lkdGgsIDApLCBJbmRleE9mZnNldChXaWR0aCwgMCk7CisgICAgICBJbmRleCA9IEdldExpbmVhckV4cHJlc3Npb24oSW5kZXgsIEluZGV4U2NhbGUsIEluZGV4T2Zmc2V0LCBURCwgMCk7CisgICAgICAKKyAgICAgIC8vIFRoZSBHRVAgaW5kZXggc2NhbGUgKCJTY2FsZSIpIHNjYWxlcyBDMSpWK0MyLCB5aWVsZGluZyAoQzEqVitDMikqU2NhbGUuCisgICAgICAvLyBUaGlzIGdpdmVzIHVzIGFuIGFnZ3JlZ2F0ZSBjb21wdXRhdGlvbiBvZiAoQzEqU2NhbGUpKlYgKyBDMipTY2FsZS4KKyAgICAgIEJhc2VPZmZzICs9IEluZGV4T2Zmc2V0LmdldFpFeHRWYWx1ZSgpKlNjYWxlOworICAgICAgU2NhbGUgKj0gSW5kZXhTY2FsZS5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIAorICAgICAgCisgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBhbiBvY2N1cnJhbmNlIG9mIHRoaXMgaW5kZXggdmFyaWFibGUsIG1lcmdlIHRoaXMKKyAgICAgIC8vIHNjYWxlIGludG8gaXQuICBGb3IgZXhhbXBsZSwgd2Ugd2FudCB0byBoYW5kbGU6CisgICAgICAvLyAgIEFbeF1beF0gLT4geCoxNiArIHgqNCAtPiB4KjIwCisgICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyB0aGF0ICd4JyBvbmx5IGFwcGVhcnMgaW4gdGhlIGluZGV4IGxpc3Qgb25jZS4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYXJJbmRpY2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgaWYgKFZhckluZGljZXNbaV0uZmlyc3QgPT0gSW5kZXgpIHsKKyAgICAgICAgICBTY2FsZSArPSBWYXJJbmRpY2VzW2ldLnNlY29uZDsKKyAgICAgICAgICBWYXJJbmRpY2VzLmVyYXNlKFZhckluZGljZXMuYmVnaW4oKStpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgc2NhbGUgdGhhdCBtYWtlcyBzZW5zZSBmb3IgdGhpcyB0YXJnZXQncworICAgICAgLy8gcG9pbnRlciBzaXplLgorICAgICAgaWYgKHVuc2lnbmVkIFNoaWZ0Qml0cyA9IDY0LVRELT5nZXRQb2ludGVyU2l6ZUluQml0cygpKSB7CisgICAgICAgIFNjYWxlIDw8PSBTaGlmdEJpdHM7CisgICAgICAgIFNjYWxlID4+PSBTaGlmdEJpdHM7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChTY2FsZSkKKyAgICAgICAgVmFySW5kaWNlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoSW5kZXgsIFNjYWxlKSk7CisgICAgfQorICAgIAorICAgIC8vIEFuYWx5emUgdGhlIGJhc2UgcG9pbnRlciBuZXh0LgorICAgIFYgPSBHRVBPcC0+Z2V0T3BlcmFuZCgwKTsKKyAgfSB3aGlsZSAoLS1NYXhMb29rdXApOworICAKKyAgLy8gSWYgdGhlIGNoYWluIG9mIGV4cHJlc3Npb25zIGlzIHRvbyBkZWVwLCBqdXN0IHJldHVybiBlYXJseS4KKyAgcmV0dXJuIFY7Cit9CisKKworLy8gVGhpcyBpcyB0aGUgcmVjdXJzaXZlIHZlcnNpb24gb2YgQnVpbGRTdWJBZ2dyZWdhdGUuIEl0IHRha2VzIGEgZmV3IGRpZmZlcmVudAorLy8gYXJndW1lbnRzLiBJZHhzIGlzIHRoZSBpbmRleCB3aXRoaW4gdGhlIG5lc3RlZCBzdHJ1Y3QgRnJvbSB0aGF0IHdlIGFyZQorLy8gbG9va2luZyBhdCBub3cgKHdoaWNoIGlzIG9mIHR5cGUgSW5kZXhlZFR5cGUpLiBJZHhTa2lwIGlzIHRoZSBudW1iZXIgb2YKKy8vIGluZGljZXMgZnJvbSBJZHhzIHRoYXQgc2hvdWxkIGJlIGxlZnQgb3V0IHdoZW4gaW5zZXJ0aW5nIGludG8gdGhlIHJlc3VsdGluZworLy8gc3RydWN0LiBUbyBpcyB0aGUgcmVzdWx0IHN0cnVjdCBidWlsdCBzbyBmYXIsIG5ldyBpbnNlcnR2YWx1ZSBpbnN0cnVjdGlvbnMKKy8vIGJ1aWxkIG9uIHRoYXQuCitzdGF0aWMgVmFsdWUgKkJ1aWxkU3ViQWdncmVnYXRlKFZhbHVlICpGcm9tLCBWYWx1ZSogVG8sIGNvbnN0IFR5cGUgKkluZGV4ZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMTA+ICZJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJZHhTa2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKSB7CisgIGNvbnN0IGxsdm06OlN0cnVjdFR5cGUgKlNUeSA9IGxsdm06OmR5bl9jYXN0PGxsdm06OlN0cnVjdFR5cGU+KEluZGV4ZWRUeXBlKTsKKyAgaWYgKFNUeSkgeworICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIFRvIGFyZ3VtZW50IHNvIHdlIGNhbiBtb2RpZnkgaXQKKyAgICBWYWx1ZSAqT3JpZ1RvID0gVG87CisgICAgLy8gR2VuZXJhbCBjYXNlLCB0aGUgdHlwZSBpbmRleGVkIGJ5IElkeHMgaXMgYSBzdHJ1Y3QKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU1R5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgLy8gUHJvY2VzcyBlYWNoIHN0cnVjdCBlbGVtZW50IHJlY3Vyc2l2ZWx5CisgICAgICBJZHhzLnB1c2hfYmFjayhpKTsKKyAgICAgIFZhbHVlICpQcmV2VG8gPSBUbzsKKyAgICAgIFRvID0gQnVpbGRTdWJBZ2dyZWdhdGUoRnJvbSwgVG8sIFNUeS0+Z2V0RWxlbWVudFR5cGUoaSksIElkeHMsIElkeFNraXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZSk7CisgICAgICBJZHhzLnBvcF9iYWNrKCk7CisgICAgICBpZiAoIVRvKSB7CisgICAgICAgIC8vIENvdWxkbid0IGZpbmQgYW55IGluc2VydGVkIHZhbHVlIGZvciB0aGlzIGluZGV4PyBDbGVhbnVwCisgICAgICAgIHdoaWxlIChQcmV2VG8gIT0gT3JpZ1RvKSB7CisgICAgICAgICAgSW5zZXJ0VmFsdWVJbnN0KiBEZWwgPSBjYXN0PEluc2VydFZhbHVlSW5zdD4oUHJldlRvKTsKKyAgICAgICAgICBQcmV2VG8gPSBEZWwtPmdldEFnZ3JlZ2F0ZU9wZXJhbmQoKTsKKyAgICAgICAgICBEZWwtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIC8vIFN0b3AgcHJvY2Vzc2luZyBlbGVtZW50cworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgd2Ugc3VjY2VzZnVsbHkgZm91bmQgYSB2YWx1ZSBmb3IgZWFjaCBvZiBvdXIgc3ViYWdncmVnYXRlcyAKKyAgICBpZiAoVG8pCisgICAgICByZXR1cm4gVG87CisgIH0KKyAgLy8gQmFzZSBjYXNlLCB0aGUgdHlwZSBpbmRleGVkIGJ5IFNvdXJjZUlkeHMgaXMgbm90IGEgc3RydWN0LCBvciBub3QgYWxsIG9mCisgIC8vIHRoZSBzdHJ1Y3QncyBlbGVtZW50cyBoYWQgYSB2YWx1ZSB0aGF0IHdhcyBpbnNlcnRlZCBkaXJlY3RseS4gSW4gdGhlIGxhdHRlcgorICAvLyBjYXNlLCBwZXJoYXBzIHdlIGNhbid0IGRldGVybWluZSBlYWNoIG9mIHRoZSBzdWJlbGVtZW50cyBpbmRpdmlkdWFsbHksIGJ1dAorICAvLyB3ZSBtaWdodCBiZSBhYmxlIHRvIGZpbmQgdGhlIGNvbXBsZXRlIHN0cnVjdCBzb21ld2hlcmUuCisgIAorICAvLyBGaW5kIHRoZSB2YWx1ZSB0aGF0IGlzIGF0IHRoYXQgcGFydGljdWxhciBzcG90CisgIFZhbHVlICpWID0gRmluZEluc2VydGVkVmFsdWUoRnJvbSwgSWR4cy5iZWdpbigpLCBJZHhzLmVuZCgpKTsKKworICBpZiAoIVYpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLy8gSW5zZXJ0IHRoZSB2YWx1ZSBpbiB0aGUgbmV3IChzdWIpIGFnZ3JlZ3JhdGUKKyAgcmV0dXJuIGxsdm06Okluc2VydFZhbHVlSW5zdDo6Q3JlYXRlKFRvLCBWLCBJZHhzLmJlZ2luKCkgKyBJZHhTa2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4cy5lbmQoKSwgSW5zZXJ0QmVmb3JlKTsKK30KKworLy8gVGhpcyBoZWxwZXIgdGFrZXMgYSBuZXN0ZWQgc3RydWN0IGFuZCBleHRyYWN0cyBhIHBhcnQgb2YgaXQgKHdoaWNoIGlzIGFnYWluIGEKKy8vIHN0cnVjdCkgaW50byBhIG5ldyB2YWx1ZS4gRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBzdHJ1Y3Q6CisvLyB7IGEsIHsgYiwgeyBjLCBkIH0sIGUgfSB9CisvLyBhbmQgdGhlIGluZGljZXMgIjEsIDEiIHRoaXMgcmV0dXJucworLy8geyBjLCBkIH0uCisvLworLy8gSXQgZG9lcyB0aGlzIGJ5IGluc2VydGluZyBhbiBpbnNlcnR2YWx1ZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSByZXN1bHRpbmcKKy8vIHN0cnVjdCwgYXMgb3Bwb3NlZCB0byBqdXN0IGluc2VydGluZyBhIHNpbmdsZSBzdHJ1Y3QuIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYKKy8vIGVhY2ggb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJzdHJ1Y3QgYXJlIGtub3duIChpZSwgaW5zZXJ0ZWQgaW50byBGcm9tIGJ5IGFuCisvLyBpbnNlcnR2YWx1ZSBpbnN0cnVjdGlvbiBzb21ld2hlcmUpLgorLy8KKy8vIEFsbCBpbnNlcnRlZCBpbnNlcnR2YWx1ZSBpbnN0cnVjdGlvbnMgYXJlIGluc2VydGVkIGJlZm9yZSBJbnNlcnRCZWZvcmUKK3N0YXRpYyBWYWx1ZSAqQnVpbGRTdWJBZ2dyZWdhdGUoVmFsdWUgKkZyb20sIGNvbnN0IHVuc2lnbmVkICppZHhfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICppZHhfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKSB7CisgIGFzc2VydChJbnNlcnRCZWZvcmUgJiYgIk11c3QgaGF2ZSBzb21lcGxhY2UgdG8gaW5zZXJ0ISIpOworICBjb25zdCBUeXBlICpJbmRleGVkVHlwZSA9IEV4dHJhY3RWYWx1ZUluc3Q6OmdldEluZGV4ZWRUeXBlKEZyb20tPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4X2VuZCk7CisgIFZhbHVlICpUbyA9IFVuZGVmVmFsdWU6OmdldChJbmRleGVkVHlwZSk7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAxMD4gSWR4cyhpZHhfYmVnaW4sIGlkeF9lbmQpOworICB1bnNpZ25lZCBJZHhTa2lwID0gSWR4cy5zaXplKCk7CisKKyAgcmV0dXJuIEJ1aWxkU3ViQWdncmVnYXRlKEZyb20sIFRvLCBJbmRleGVkVHlwZSwgSWR4cywgSWR4U2tpcCwgSW5zZXJ0QmVmb3JlKTsKK30KKworLy8vIEZpbmRJbnNlcnRlZFZhbHVlIC0gR2l2ZW4gYW4gYWdncmVncmF0ZSBhbmQgYW4gc2VxdWVuY2Ugb2YgaW5kaWNlcywgc2VlIGlmCisvLy8gdGhlIHNjYWxhciB2YWx1ZSBpbmRleGVkIGlzIGFscmVhZHkgYXJvdW5kIGFzIGEgcmVnaXN0ZXIsIGZvciBleGFtcGxlIGlmIGl0CisvLy8gd2VyZSBpbnNlcnRlZCBkaXJlY3RseSBpbnRvIHRoZSBhZ2dyZWdyYXRlLgorLy8vCisvLy8gSWYgSW5zZXJ0QmVmb3JlIGlzIG5vdCBudWxsLCB0aGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIChtb2RpZmllZCkKKy8vLyBpbnNlcnR2YWx1ZXMgd2hlbiBhIHBhcnQgb2YgYSBuZXN0ZWQgc3RydWN0IGlzIGV4dHJhY3RlZC4KK1ZhbHVlICpsbHZtOjpGaW5kSW5zZXJ0ZWRWYWx1ZShWYWx1ZSAqViwgY29uc3QgdW5zaWduZWQgKmlkeF9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqaWR4X2VuZCwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkgeworICAvLyBOb3RoaW5nIHRvIGluZGV4PyBKdXN0IHJldHVybiBWIHRoZW4gKHRoaXMgaXMgdXNlZnVsIGF0IHRoZSBlbmQgb2Ygb3VyCisgIC8vIHJlY3Vyc2lvbikKKyAgaWYgKGlkeF9iZWdpbiA9PSBpZHhfZW5kKQorICAgIHJldHVybiBWOworICAvLyBXZSBoYXZlIGluZGljZXMsIHNvIFYgc2hvdWxkIGhhdmUgYW4gaW5kZXhhYmxlIHR5cGUKKyAgYXNzZXJ0KChWLT5nZXRUeXBlKCktPmlzU3RydWN0VHkoKSB8fCBWLT5nZXRUeXBlKCktPmlzQXJyYXlUeSgpKQorICAgICAgICAgJiYgIk5vdCBsb29raW5nIGF0IGEgc3RydWN0IG9yIGFycmF5PyIpOworICBhc3NlcnQoRXh0cmFjdFZhbHVlSW5zdDo6Z2V0SW5kZXhlZFR5cGUoVi0+Z2V0VHlwZSgpLCBpZHhfYmVnaW4sIGlkeF9lbmQpCisgICAgICAgICAmJiAiSW52YWxpZCBpbmRpY2VzIGZvciB0eXBlPyIpOworICBjb25zdCBDb21wb3NpdGVUeXBlICpQVHkgPSBjYXN0PENvbXBvc2l0ZVR5cGU+KFYtPmdldFR5cGUoKSk7CisKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihWKSkKKyAgICByZXR1cm4gVW5kZWZWYWx1ZTo6Z2V0KEV4dHJhY3RWYWx1ZUluc3Q6OmdldEluZGV4ZWRUeXBlKFBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4X2JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhfZW5kKSk7CisgIGVsc2UgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KFYpKQorICAgIHJldHVybiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEV4dHJhY3RWYWx1ZUluc3Q6OmdldEluZGV4ZWRUeXBlKFBUeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhfZW5kKSk7CisgIGVsc2UgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKSB7CisgICAgaWYgKGlzYTxDb25zdGFudEFycmF5PihDKSB8fCBpc2E8Q29uc3RhbnRTdHJ1Y3Q+KEMpKQorICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyB0aGlzIGNvbnN0YW50CisgICAgICByZXR1cm4gRmluZEluc2VydGVkVmFsdWUoQy0+Z2V0T3BlcmFuZCgqaWR4X2JlZ2luKSwgaWR4X2JlZ2luICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhfZW5kLCBJbnNlcnRCZWZvcmUpOworICB9IGVsc2UgaWYgKEluc2VydFZhbHVlSW5zdCAqSSA9IGR5bl9jYXN0PEluc2VydFZhbHVlSW5zdD4oVikpIHsKKyAgICAvLyBMb29wIHRoZSBpbmRpY2VzIGZvciB0aGUgaW5zZXJ0dmFsdWUgaW5zdHJ1Y3Rpb24gaW4gcGFyYWxsZWwgd2l0aCB0aGUKKyAgICAvLyByZXF1ZXN0ZWQgaW5kaWNlcworICAgIGNvbnN0IHVuc2lnbmVkICpyZXFfaWR4ID0gaWR4X2JlZ2luOworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKmkgPSBJLT5pZHhfYmVnaW4oKSwgKmUgPSBJLT5pZHhfZW5kKCk7CisgICAgICAgICBpICE9IGU7ICsraSwgKytyZXFfaWR4KSB7CisgICAgICBpZiAocmVxX2lkeCA9PSBpZHhfZW5kKSB7CisgICAgICAgIGlmIChJbnNlcnRCZWZvcmUpCisgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBpbmRleCBpZGVudGlmaWVzIGEgcGFydCBvZiBhIG5lc3RlZCBhZ2dyZWdhdGUuIEhhbmRsZQorICAgICAgICAgIC8vIHRoaXMgc3BlY2lhbGx5LiBGb3IgZXhhbXBsZSwKKyAgICAgICAgICAvLyAlQSA9IGluc2VydHZhbHVlIHsgaTMyLCB7aTMyLCBpMzIgfSB9IHVuZGVmLCBpMzIgMTAsIDEsIDAKKyAgICAgICAgICAvLyAlQiA9IGluc2VydHZhbHVlIHsgaTMyLCB7aTMyLCBpMzIgfSB9ICVBLCBpMzIgMTEsIDEsIDEKKyAgICAgICAgICAvLyAlQyA9IGV4dHJhY3R2YWx1ZSB7aTMyLCB7IGkzMiwgaTMyIH0gfSAlQiwgMQorICAgICAgICAgIC8vIFRoaXMgY2FuIGJlIGNoYW5nZWQgaW50bworICAgICAgICAgIC8vICVBID0gaW5zZXJ0dmFsdWUge2kzMiwgaTMyIH0gdW5kZWYsIGkzMiAxMCwgMAorICAgICAgICAgIC8vICVDID0gaW5zZXJ0dmFsdWUge2kzMiwgaTMyIH0gJUEsIGkzMiAxMSwgMQorICAgICAgICAgIC8vIHdoaWNoIGFsbG93cyB0aGUgdW51c2VkIDAsMCBlbGVtZW50IGZyb20gdGhlIG5lc3RlZCBzdHJ1Y3QgdG8gYmUKKyAgICAgICAgICAvLyByZW1vdmVkLgorICAgICAgICAgIHJldHVybiBCdWlsZFN1YkFnZ3JlZ2F0ZShWLCBpZHhfYmVnaW4sIHJlcV9pZHgsIEluc2VydEJlZm9yZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvLyBXZSBjYW4ndCBoYW5kbGUgdGhpcyB3aXRob3V0IGluc2VydGluZyBpbnNlcnR2YWx1ZXMKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gVGhpcyBpbnNlcnQgdmFsdWUgaW5zZXJ0cyBzb21ldGhpbmcgZWxzZSB0aGFuIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLgorICAgICAgLy8gU2VlIGlmIHRoZSAoYWdncmVncmF0ZSkgdmFsdWUgaW5zZXJ0ZWQgaW50byBoYXMgdGhlIHZhbHVlIHdlIGFyZQorICAgICAgLy8gbG9va2luZyBmb3IsIHRoZW4uCisgICAgICBpZiAoKnJlcV9pZHggIT0gKmkpCisgICAgICAgIHJldHVybiBGaW5kSW5zZXJ0ZWRWYWx1ZShJLT5nZXRBZ2dyZWdhdGVPcGVyYW5kKCksIGlkeF9iZWdpbiwgaWR4X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZSk7CisgICAgfQorICAgIC8vIElmIHdlIGVuZCB1cCBoZXJlLCB0aGUgaW5kaWNlcyBvZiB0aGUgaW5zZXJ0dmFsdWUgbWF0Y2ggd2l0aCB0aG9zZQorICAgIC8vIHJlcXVlc3RlZCAodGhvdWdoIHBvc3NpYmx5IG9ubHkgcGFydGlhbGx5KS4gTm93IHdlIHJlY3Vyc2l2ZWx5IGxvb2sgYXQKKyAgICAvLyB0aGUgaW5zZXJ0ZWQgdmFsdWUsIHBhc3NpbmcgYW55IHJlbWFpbmluZyBpbmRpY2VzLgorICAgIHJldHVybiBGaW5kSW5zZXJ0ZWRWYWx1ZShJLT5nZXRJbnNlcnRlZFZhbHVlT3BlcmFuZCgpLCByZXFfaWR4LCBpZHhfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmUpOworICB9IGVsc2UgaWYgKEV4dHJhY3RWYWx1ZUluc3QgKkkgPSBkeW5fY2FzdDxFeHRyYWN0VmFsdWVJbnN0PihWKSkgeworICAgIC8vIElmIHdlJ3JlIGV4dHJhY3RpbmcgYSB2YWx1ZSBmcm9tIGFuIGFnZ3JlZ3JhdGUgdGhhdCB3YXMgZXh0cmFjdGVkIGZyb20KKyAgICAvLyBzb21ldGhpbmcgZWxzZSwgd2UgY2FuIGV4dHJhY3QgZnJvbSB0aGF0IHNvbWV0aGluZyBlbHNlIGRpcmVjdGx5IGluc3RlYWQuCisgICAgLy8gSG93ZXZlciwgd2Ugd2lsbCBuZWVkIHRvIGNoYWluIEkncyBpbmRpY2VzIHdpdGggdGhlIHJlcXVlc3RlZCBpbmRpY2VzLgorICAgCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgaW5kaWNlcyByZXF1aXJlZCAKKyAgICB1bnNpZ25lZCBzaXplID0gSS0+Z2V0TnVtSW5kaWNlcygpICsgKGlkeF9lbmQgLSBpZHhfYmVnaW4pOworICAgIC8vIEFsbG9jYXRlIHNvbWUgc3BhY2UgdG8gcHV0IHRoZSBuZXcgaW5kaWNlcyBpbgorICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA1PiBJZHhzOworICAgIElkeHMucmVzZXJ2ZShzaXplKTsKKyAgICAvLyBBZGQgaW5kaWNlcyBmcm9tIHRoZSBleHRyYWN0IHZhbHVlIGluc3RydWN0aW9uCisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqaSA9IEktPmlkeF9iZWdpbigpLCAqZSA9IEktPmlkeF9lbmQoKTsKKyAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgSWR4cy5wdXNoX2JhY2soKmkpOworICAgIAorICAgIC8vIEFkZCByZXF1ZXN0ZWQgaW5kaWNlcworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKmkgPSBpZHhfYmVnaW4sICplID0gaWR4X2VuZDsgaSAhPSBlOyArK2kpCisgICAgICBJZHhzLnB1c2hfYmFjaygqaSk7CisKKyAgICBhc3NlcnQoSWR4cy5zaXplKCkgPT0gc2l6ZSAKKyAgICAgICAgICAgJiYgIk51bWJlciBvZiBpbmRpY2VzIGFkZGVkIG5vdCBjb3JyZWN0PyIpOworICAgIAorICAgIHJldHVybiBGaW5kSW5zZXJ0ZWRWYWx1ZShJLT5nZXRBZ2dyZWdhdGVPcGVyYW5kKCksIElkeHMuYmVnaW4oKSwgSWR4cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKTsKKyAgfQorICAvLyBPdGhlcndpc2UsIHdlIGRvbid0IGtub3cgKHN1Y2ggYXMsIGV4dHJhY3RpbmcgZnJvbSBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAvLyBvciBsb2FkIGluc3RydWN0aW9uKQorICByZXR1cm4gMDsKK30KKworLy8vIEdldENvbnN0YW50U3RyaW5nSW5mbyAtIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGxlbmd0aCBvZiBhCisvLy8gbnVsbC10ZXJtaW5hdGVkIEMgc3RyaW5nIHBvaW50ZWQgdG8gYnkgVi4gIElmIHN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgdHJ1ZQorLy8vIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgaW4gU3RyLiAgSWYgdW5zdWNjZXNzZnVsLCBpdCByZXR1cm5zIGZhbHNlLgorYm9vbCBsbHZtOjpHZXRDb25zdGFudFN0cmluZ0luZm8oY29uc3QgVmFsdWUgKlYsIHN0ZDo6c3RyaW5nICZTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN0b3BBdE51bCkgeworICAvLyBJZiBWIGlzIE5VTEwgdGhlbiByZXR1cm4gZmFsc2U7CisgIGlmIChWID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBMb29rIHRocm91Z2ggYml0Y2FzdCBpbnN0cnVjdGlvbnMuCisgIGlmIChjb25zdCBCaXRDYXN0SW5zdCAqQkNJID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KFYpKQorICAgIHJldHVybiBHZXRDb25zdGFudFN0cmluZ0luZm8oQkNJLT5nZXRPcGVyYW5kKDApLCBTdHIsIE9mZnNldCwgU3RvcEF0TnVsKTsKKyAgCisgIC8vIElmIHRoZSB2YWx1ZSBpcyBub3QgYSBHRVAgaW5zdHJ1Y3Rpb24gbm9yIGEgY29uc3RhbnQgZXhwcmVzc2lvbiB3aXRoIGEKKyAgLy8gR0VQIGluc3RydWN0aW9uLCB0aGVuIHJldHVybiBmYWxzZSBiZWNhdXNlIENvbnN0YW50QXJyYXkgY2FuJ3Qgb2NjdXIKKyAgLy8gYW55IG90aGVyIHdheQorICBjb25zdCBVc2VyICpHRVAgPSAwOworICBpZiAoY29uc3QgR2V0RWxlbWVudFB0ckluc3QgKkdFUEkgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVikpIHsKKyAgICBHRVAgPSBHRVBJOworICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKSB7CisgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCkKKyAgICAgIHJldHVybiBHZXRDb25zdGFudFN0cmluZ0luZm8oQ0UtPmdldE9wZXJhbmQoMCksIFN0ciwgT2Zmc2V0LCBTdG9wQXROdWwpOworICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgR0VQID0gQ0U7CisgIH0KKyAgCisgIGlmIChHRVApIHsKKyAgICAvLyBNYWtlIHN1cmUgdGhlIEdFUCBoYXMgZXhhY3RseSB0aHJlZSBhcmd1bWVudHMuCisgICAgaWYgKEdFUC0+Z2V0TnVtT3BlcmFuZHMoKSAhPSAzKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW5kZXgtZWUgaXMgYSBwb2ludGVyIHRvIGFycmF5IG9mIGk4LgorICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQVCA9IGNhc3Q8UG9pbnRlclR5cGU+KEdFUC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKTsKKyAgICBjb25zdCBBcnJheVR5cGUgKkFUID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihQVC0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgaWYgKEFUID09IDAgfHwgIUFULT5nZXRFbGVtZW50VHlwZSgpLT5pc0ludGVnZXJUeSg4KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3Qgb3BlcmFuZCBvZiB0aGUgR0VQIGlzIGFuIGludGVnZXIgYW5kCisgICAgLy8gaGFzIHZhbHVlIDAgc28gdGhhdCB3ZSBhcmUgc3VyZSB3ZSdyZSBpbmRleGluZyBpbnRvIHRoZSBpbml0aWFsaXplci4KKyAgICBjb25zdCBDb25zdGFudEludCAqRmlyc3RJZHggPSBkeW5fY2FzdDxDb25zdGFudEludD4oR0VQLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoRmlyc3RJZHggPT0gMCB8fCAhRmlyc3RJZHgtPmlzWmVybygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIC8vIElmIHRoZSBzZWNvbmQgaW5kZXggaXNuJ3QgYSBDb25zdGFudEludCwgdGhlbiB0aGlzIGlzIGEgdmFyaWFibGUgaW5kZXgKKyAgICAvLyBpbnRvIHRoZSBhcnJheS4gIElmIHRoaXMgb2NjdXJzLCB3ZSBjYW4ndCBzYXkgYW55dGhpbmcgbWVhbmluZ2Z1bCBhYm91dAorICAgIC8vIHRoZSBzdHJpbmcuCisgICAgdWludDY0X3QgU3RhcnRJZHggPSAwOworICAgIGlmIChjb25zdCBDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oR0VQLT5nZXRPcGVyYW5kKDIpKSkKKyAgICAgIFN0YXJ0SWR4ID0gQ0ktPmdldFpFeHRWYWx1ZSgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gR2V0Q29uc3RhbnRTdHJpbmdJbmZvKEdFUC0+Z2V0T3BlcmFuZCgwKSwgU3RyLCBTdGFydElkeCtPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wQXROdWwpOworICB9CisgIAorICAvLyBUaGUgR0VQIGluc3RydWN0aW9uLCBjb25zdGFudCBvciBpbnN0cnVjdGlvbiwgbXVzdCByZWZlcmVuY2UgYSBnbG9iYWwKKyAgLy8gdmFyaWFibGUgdGhhdCBpcyBhIGNvbnN0YW50IGFuZCBpcyBpbml0aWFsaXplZC4gVGhlIHJlZmVyZW5jZWQgY29uc3RhbnQKKyAgLy8gaW5pdGlhbGl6ZXIgaXMgdGhlIGFycmF5IHRoYXQgd2UnbGwgdXNlIGZvciBvcHRpbWl6YXRpb24uCisgIGNvbnN0IEdsb2JhbFZhcmlhYmxlKiBHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihWKTsKKyAgaWYgKCFHViB8fCAhR1YtPmlzQ29uc3RhbnQoKSB8fCAhR1YtPmhhc0RlZmluaXRpdmVJbml0aWFsaXplcigpKQorICAgIHJldHVybiBmYWxzZTsKKyAgY29uc3QgQ29uc3RhbnQgKkdsb2JhbEluaXQgPSBHVi0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgCisgIC8vIEhhbmRsZSB0aGUgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvIGNhc2UKKyAgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEdsb2JhbEluaXQpKSB7CisgICAgLy8gVGhpcyBpcyBhIGRlZ2VuZXJhdGUgY2FzZS4gVGhlIGluaXRpYWxpemVyIGlzIGNvbnN0YW50IHplcm8gc28gdGhlCisgICAgLy8gbGVuZ3RoIG9mIHRoZSBzdHJpbmcgbXVzdCBiZSB6ZXJvLgorICAgIFN0ci5jbGVhcigpOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICAvLyBNdXN0IGJlIGEgQ29uc3RhbnQgQXJyYXkKKyAgY29uc3QgQ29uc3RhbnRBcnJheSAqQXJyYXkgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihHbG9iYWxJbml0KTsKKyAgaWYgKEFycmF5ID09IDAgfHwgIUFycmF5LT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCktPmlzSW50ZWdlclR5KDgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQorICB1aW50NjRfdCBOdW1FbHRzID0gQXJyYXktPmdldFR5cGUoKS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgCisgIGlmIChPZmZzZXQgPiBOdW1FbHRzKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIFRyYXZlcnNlIHRoZSBjb25zdGFudCBhcnJheSBmcm9tICdPZmZzZXQnIHdoaWNoIGlzIHRoZSBwbGFjZSB0aGUgR0VQIHJlZmVycworICAvLyB0byBpbiB0aGUgYXJyYXkuCisgIFN0ci5yZXNlcnZlKE51bUVsdHMtT2Zmc2V0KTsKKyAgZm9yICh1bnNpZ25lZCBpID0gT2Zmc2V0OyBpICE9IE51bUVsdHM7ICsraSkgeworICAgIGNvbnN0IENvbnN0YW50ICpFbHQgPSBBcnJheS0+Z2V0T3BlcmFuZChpKTsKKyAgICBjb25zdCBDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oRWx0KTsKKyAgICBpZiAoIUNJKSAvLyBUaGlzIGFycmF5IGlzbid0IHN1aXRhYmxlLCBub24taW50IGluaXRpYWxpemVyLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChTdG9wQXROdWwgJiYgQ0ktPmlzWmVybygpKQorICAgICAgcmV0dXJuIHRydWU7IC8vIHdlIGZvdW5kIGVuZCBvZiBzdHJpbmcsIHN1Y2Nlc3MhCisgICAgU3RyICs9IChjaGFyKUNJLT5nZXRaRXh0VmFsdWUoKTsKKyAgfQorICAKKyAgLy8gVGhlIGFycmF5IGlzbid0IG51bGwgdGVybWluYXRlZCwgYnV0IG1heWJlIHRoaXMgaXMgYSBtZW1jcHksIG5vdCBhIHN0cmNweS4KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRoZXNlIG5leHQgdHdvIGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhlIGFib3ZlLCBidXQgYWxzbyBsb29rIHRocm91Z2ggUEhJCisvLyBub2Rlcy4KKy8vIFRPRE86IFNlZSBpZiB3ZSBjYW4gaW50ZWdyYXRlIHRoZXNlIHR3byB0b2dldGhlci4KKworLy8vIEdldFN0cmluZ0xlbmd0aEggLSBJZiB3ZSBjYW4gY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieQorLy8vIHRoZSBzcGVjaWZpZWQgcG9pbnRlciwgcmV0dXJuICdsZW4rMScuICBJZiB3ZSBjYW4ndCwgcmV0dXJuIDAuCitzdGF0aWMgdWludDY0X3QgR2V0U3RyaW5nTGVuZ3RoSChWYWx1ZSAqViwgU21hbGxQdHJTZXQ8UEhJTm9kZSosIDMyPiAmUEhJcykgeworICAvLyBMb29rIHRocm91Z2ggbm9vcCBiaXRjYXN0IGluc3RydWN0aW9ucy4KKyAgaWYgKEJpdENhc3RJbnN0ICpCQ0kgPSBkeW5fY2FzdDxCaXRDYXN0SW5zdD4oVikpCisgICAgcmV0dXJuIEdldFN0cmluZ0xlbmd0aEgoQkNJLT5nZXRPcGVyYW5kKDApLCBQSElzKTsKKworICAvLyBJZiB0aGlzIGlzIGEgUEhJIG5vZGUsIHRoZXJlIGFyZSB0d28gY2FzZXM6IGVpdGhlciB3ZSBoYXZlIGFscmVhZHkgc2VlbiBpdAorICAvLyBvciB3ZSBoYXZlbid0LgorICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihWKSkgeworICAgIGlmICghUEhJcy5pbnNlcnQoUE4pKQorICAgICAgcmV0dXJuIH4wVUxMOyAgLy8gYWxyZWFkeSBpbiB0aGUgc2V0LgorCisgICAgLy8gSWYgaXQgd2FzIG5ldywgc2VlIGlmIGFsbCB0aGUgaW5wdXQgc3RyaW5ncyBhcmUgdGhlIHNhbWUgbGVuZ3RoLgorICAgIHVpbnQ2NF90IExlblNvRmFyID0gfjBVTEw7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgICAgdWludDY0X3QgTGVuID0gR2V0U3RyaW5nTGVuZ3RoSChQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKSwgUEhJcyk7CisgICAgICBpZiAoTGVuID09IDApIHJldHVybiAwOyAvLyBVbmtub3duIGxlbmd0aCAtPiB1bmtub3duLgorCisgICAgICBpZiAoTGVuID09IH4wVUxMKSBjb250aW51ZTsKKworICAgICAgaWYgKExlbiAhPSBMZW5Tb0ZhciAmJiBMZW5Tb0ZhciAhPSB+MFVMTCkKKyAgICAgICAgcmV0dXJuIDA7ICAgIC8vIERpc2FncmVlIC0+IHVua25vd24uCisgICAgICBMZW5Tb0ZhciA9IExlbjsKKyAgICB9CisKKyAgICAvLyBTdWNjZXNzLCBhbGwgYWdyZWUuCisgICAgcmV0dXJuIExlblNvRmFyOworICB9CisKKyAgLy8gc3RybGVuKHNlbGVjdChjLHgseSkpIC0+IHN0cmxlbih4KSBeIHN0cmxlbih5KQorICBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihWKSkgeworICAgIHVpbnQ2NF90IExlbjEgPSBHZXRTdHJpbmdMZW5ndGhIKFNJLT5nZXRUcnVlVmFsdWUoKSwgUEhJcyk7CisgICAgaWYgKExlbjEgPT0gMCkgcmV0dXJuIDA7CisgICAgdWludDY0X3QgTGVuMiA9IEdldFN0cmluZ0xlbmd0aEgoU0ktPmdldEZhbHNlVmFsdWUoKSwgUEhJcyk7CisgICAgaWYgKExlbjIgPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKExlbjEgPT0gfjBVTEwpIHJldHVybiBMZW4yOworICAgIGlmIChMZW4yID09IH4wVUxMKSByZXR1cm4gTGVuMTsKKyAgICBpZiAoTGVuMSAhPSBMZW4yKSByZXR1cm4gMDsKKyAgICByZXR1cm4gTGVuMTsKKyAgfQorCisgIC8vIElmIHRoZSB2YWx1ZSBpcyBub3QgYSBHRVAgaW5zdHJ1Y3Rpb24gbm9yIGEgY29uc3RhbnQgZXhwcmVzc2lvbiB3aXRoIGEKKyAgLy8gR0VQIGluc3RydWN0aW9uLCB0aGVuIHJldHVybiB1bmtub3duLgorICBVc2VyICpHRVAgPSAwOworICBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUEkgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVikpIHsKKyAgICBHRVAgPSBHRVBJOworICB9IGVsc2UgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKSB7CisgICAgaWYgKENFLT5nZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cikKKyAgICAgIHJldHVybiAwOworICAgIEdFUCA9IENFOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBHRVAgaGFzIGV4YWN0bHkgdGhyZWUgYXJndW1lbnRzLgorICBpZiAoR0VQLT5nZXROdW1PcGVyYW5kcygpICE9IDMpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IG9wZXJhbmQgb2YgdGhlIEdFUCBpcyBhbiBpbnRlZ2VyIGFuZAorICAvLyBoYXMgdmFsdWUgMCBzbyB0aGF0IHdlIGFyZSBzdXJlIHdlJ3JlIGluZGV4aW5nIGludG8gdGhlIGluaXRpYWxpemVyLgorICBpZiAoQ29uc3RhbnRJbnQgKklkeCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihHRVAtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgaWYgKCFJZHgtPmlzWmVybygpKQorICAgICAgcmV0dXJuIDA7CisgIH0gZWxzZQorICAgIHJldHVybiAwOworCisgIC8vIElmIHRoZSBzZWNvbmQgaW5kZXggaXNuJ3QgYSBDb25zdGFudEludCwgdGhlbiB0aGlzIGlzIGEgdmFyaWFibGUgaW5kZXgKKyAgLy8gaW50byB0aGUgYXJyYXkuICBJZiB0aGlzIG9jY3Vycywgd2UgY2FuJ3Qgc2F5IGFueXRoaW5nIG1lYW5pbmdmdWwgYWJvdXQKKyAgLy8gdGhlIHN0cmluZy4KKyAgdWludDY0X3QgU3RhcnRJZHggPSAwOworICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEdFUC0+Z2V0T3BlcmFuZCgyKSkpCisgICAgU3RhcnRJZHggPSBDSS0+Z2V0WkV4dFZhbHVlKCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKKworICAvLyBUaGUgR0VQIGluc3RydWN0aW9uLCBjb25zdGFudCBvciBpbnN0cnVjdGlvbiwgbXVzdCByZWZlcmVuY2UgYSBnbG9iYWwKKyAgLy8gdmFyaWFibGUgdGhhdCBpcyBhIGNvbnN0YW50IGFuZCBpcyBpbml0aWFsaXplZC4gVGhlIHJlZmVyZW5jZWQgY29uc3RhbnQKKyAgLy8gaW5pdGlhbGl6ZXIgaXMgdGhlIGFycmF5IHRoYXQgd2UnbGwgdXNlIGZvciBvcHRpbWl6YXRpb24uCisgIEdsb2JhbFZhcmlhYmxlKiBHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihHRVAtPmdldE9wZXJhbmQoMCkpOworICBpZiAoIUdWIHx8ICFHVi0+aXNDb25zdGFudCgpIHx8ICFHVi0+aGFzSW5pdGlhbGl6ZXIoKSB8fAorICAgICAgR1YtPm1heUJlT3ZlcnJpZGRlbigpKQorICAgIHJldHVybiAwOworICBDb25zdGFudCAqR2xvYmFsSW5pdCA9IEdWLT5nZXRJbml0aWFsaXplcigpOworCisgIC8vIEhhbmRsZSB0aGUgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvIGNhc2UsIHdoaWNoIGlzIGEgZGVnZW5lcmF0ZSBjYXNlLiBUaGUKKyAgLy8gaW5pdGlhbGl6ZXIgaXMgY29uc3RhbnQgemVybyBzbyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgbXVzdCBiZSB6ZXJvLgorICBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oR2xvYmFsSW5pdCkpCisgICAgcmV0dXJuIDE7ICAvLyBMZW4gPSAwIG9mZnNldCBieSAxLgorCisgIC8vIE11c3QgYmUgYSBDb25zdGFudCBBcnJheQorICBDb25zdGFudEFycmF5ICpBcnJheSA9IGR5bl9jYXN0PENvbnN0YW50QXJyYXk+KEdsb2JhbEluaXQpOworICBpZiAoIUFycmF5IHx8ICFBcnJheS0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpLT5pc0ludGVnZXJUeSg4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgIHVpbnQ2NF90IE51bUVsdHMgPSBBcnJheS0+Z2V0VHlwZSgpLT5nZXROdW1FbGVtZW50cygpOworCisgIC8vIFRyYXZlcnNlIHRoZSBjb25zdGFudCBhcnJheSBmcm9tIFN0YXJ0SWR4IChkZXJpdmVkIGFib3ZlKSB3aGljaCBpcworICAvLyB0aGUgcGxhY2UgdGhlIEdFUCByZWZlcnMgdG8gaW4gdGhlIGFycmF5LgorICBmb3IgKHVuc2lnbmVkIGkgPSBTdGFydElkeDsgaSAhPSBOdW1FbHRzOyArK2kpIHsKKyAgICBDb25zdGFudCAqRWx0ID0gQXJyYXktPmdldE9wZXJhbmQoaSk7CisgICAgQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEVsdCk7CisgICAgaWYgKCFDSSkgLy8gVGhpcyBhcnJheSBpc24ndCBzdWl0YWJsZSwgbm9uLWludCBpbml0aWFsaXplci4KKyAgICAgIHJldHVybiAwOworICAgIGlmIChDSS0+aXNaZXJvKCkpCisgICAgICByZXR1cm4gaS1TdGFydElkeCsxOyAvLyBXZSBmb3VuZCBlbmQgb2Ygc3RyaW5nLCBzdWNjZXNzIQorICB9CisKKyAgcmV0dXJuIDA7IC8vIFRoZSBhcnJheSBpc24ndCBudWxsIHRlcm1pbmF0ZWQsIGNvbnNlcnZhdGl2ZWx5IHJldHVybiAndW5rbm93bicuCit9CisKKy8vLyBHZXRTdHJpbmdMZW5ndGggLSBJZiB3ZSBjYW4gY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieQorLy8vIHRoZSBzcGVjaWZpZWQgcG9pbnRlciwgcmV0dXJuICdsZW4rMScuICBJZiB3ZSBjYW4ndCwgcmV0dXJuIDAuCit1aW50NjRfdCBsbHZtOjpHZXRTdHJpbmdMZW5ndGgoVmFsdWUgKlYpIHsKKyAgaWYgKCFWLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpIHJldHVybiAwOworCisgIFNtYWxsUHRyU2V0PFBISU5vZGUqLCAzMj4gUEhJczsKKyAgdWludDY0X3QgTGVuID0gR2V0U3RyaW5nTGVuZ3RoSChWLCBQSElzKTsKKyAgLy8gSWYgTGVuIGlzIH4wVUxMLCB3ZSBoYWQgYW4gaW5maW5pdGUgcGhpIGN5Y2xlOiB0aGlzIGlzIGRlYWQgY29kZSwgc28gcmV0dXJuCisgIC8vIGFuIGVtcHR5IHN0cmluZyBhcyBhIGxlbmd0aC4KKyAgcmV0dXJuIExlbiA9PSB+MFVMTCA/IDEgOiBMZW47Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQXJjaGl2ZS9BcmNoaXZlLmNwcCBiL3NyYy9MTFZNL2xpYi9BcmNoaXZlL0FyY2hpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzcxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQXJjaGl2ZS9BcmNoaXZlLmNwcApAQCAtMCwwICsxLDI1NSBAQAorLy89PT0tLSBBcmNoaXZlLmNwcCAtIEdlbmVyaWMgTExWTSBhcmNoaXZlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBcmNoaXZlIGFuZCBBcmNoaXZlTWVtYmVyCisvLyBjbGFzc2VzIHRoYXQgaXMgY29tbW9uIHRvIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBhcmNoaXZlcy4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkFyY2hpdmVJbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvUmVhZGVyV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUHJvY2Vzcy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxjc3RyaW5nPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIGdldE1lbWJlclNpemUgLSBjb21wdXRlIHRoZSBhY3R1YWwgcGh5c2ljYWwgc2l6ZSBvZiB0aGUgZmlsZSBtZW1iZXIgYXMgc2VlbgorLy8gb24gZGlzay4gVGhpcyBpc24ndCB0aGUgc2l6ZSBvZiBtZW1iZXIncyBwYXlsb2FkLiBVc2UgZ2V0U2l6ZSgpIGZvciB0aGF0LgordW5zaWduZWQKK0FyY2hpdmVNZW1iZXI6OmdldE1lbWJlclNpemUoKSBjb25zdCB7CisgIC8vIEJhc2ljYWxseSBpdHMgdGhlIGZpbGUgc2l6ZSBwbHVzIHRoZSBoZWFkZXIgc2l6ZQorICB1bnNpZ25lZCByZXN1bHQgPSAgaW5mby5maWxlU2l6ZSArIHNpemVvZihBcmNoaXZlTWVtYmVySGVhZGVyKTsKKworICAvLyBJZiBpdCBoYXMgYSBsb25nIGZpbGVuYW1lLCBpbmNsdWRlIHRoZSBuYW1lIGxlbmd0aAorICBpZiAoaGFzTG9uZ0ZpbGVuYW1lKCkpCisgICAgcmVzdWx0ICs9IHBhdGguc3RyKCkubGVuZ3RoKCkgKyAxOworCisgIC8vIElmIGl0cyBub3cgb2RkIGxlbmd0aGVkLCBpbmNsdWRlIHRoZSBwYWRkaW5nIGJ5dGUKKyAgaWYgKHJlc3VsdCAlIDIgIT0gMCApCisgICAgcmVzdWx0Kys7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIG9ubHkgdXNlIGJ5IHRoZSBpbGlzdCB3aGVuIGl0IGNyZWF0ZXMgaXRzCisvLyBzZW50cnkgbm9kZS4gV2UgZ2l2ZSBpdCBzcGVjaWZpYyBzdGF0aWMgdmFsdWVzIHRvIG1ha2UgaXQgc3RhbmQgb3V0IGEgYml0LgorQXJjaGl2ZU1lbWJlcjo6QXJjaGl2ZU1lbWJlcigpCisgIDogcGFyZW50KDApLCBwYXRoKCItLWludmFsaWQtLSIpLCBmbGFncygwKSwgZGF0YSgwKQoreworICBpbmZvLnVzZXIgPSBzeXM6OlByb2Nlc3M6OkdldEN1cnJlbnRVc2VySWQoKTsKKyAgaW5mby5ncm91cCA9IHN5czo6UHJvY2Vzczo6R2V0Q3VycmVudEdyb3VwSWQoKTsKKyAgaW5mby5tb2RlID0gMDc3NzsKKyAgaW5mby5maWxlU2l6ZSA9IDA7CisgIGluZm8ubW9kVGltZSA9IHN5czo6VGltZVZhbHVlOjpub3coKTsKK30KKworLy8gVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgdGhhdCB0aGUgQXJjaGl2ZSBjbGFzcyB1c2VzIHdoZW4gaXQgaXMgYnVpbGRpbmcgb3IKKy8vIHJlYWRpbmcgYW4gYXJjaGl2ZS4gSXQganVzdCBkZWZhdWx0cyBhIGZldyB0aGluZ3MgYW5kIGVuc3VyZXMgdGhlIHBhcmVudCBpcworLy8gc2V0IGZvciB0aGUgaXBsaXN0LiBUaGUgQXJjaGl2ZSBjbGFzcyBmaWxscyBpbiB0aGUgQXJjaGl2ZU1lbWJlcidzIGRhdGEuCisvLyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgY29ycmVjdGx5IHNldHRpbmcgdGhlIGRhdGEgbWF5IGRlcGVuZCBvbiBvdGhlcgorLy8gdGhpbmdzIGluIHRoZSBBcmNoaXZlLgorQXJjaGl2ZU1lbWJlcjo6QXJjaGl2ZU1lbWJlcihBcmNoaXZlKiBQQVIpCisgIDogcGFyZW50KFBBUiksIHBhdGgoKSwgZmxhZ3MoMCksIGRhdGEoMCkKK3sKK30KKworLy8gVGhpcyBtZXRob2QgYWxsb3dzIGFuIEFyY2hpdmVNZW1iZXIgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgZGF0YSBmb3IgYQorLy8gZGlmZmVyZW50IGZpbGUsIHByZXN1bWFibHkgYXMgYW4gdXBkYXRlIHRvIHRoZSBtZW1iZXIuIEl0IGFsc28gbWFrZXMgc3VyZQorLy8gdGhlIGZsYWdzIGFyZSByZXNldCBjb3JyZWN0bHkuCitib29sIEFyY2hpdmVNZW1iZXI6OnJlcGxhY2VXaXRoKGNvbnN0IHN5czo6UGF0aCYgbmV3RmlsZSwgc3RkOjpzdHJpbmcqIEVyck1zZykgeworICBpZiAoIW5ld0ZpbGUuZXhpc3RzKCkpIHsKKyAgICBpZiAoRXJyTXNnKSAKKyAgICAgICpFcnJNc2cgPSAiQ2FuIG5vdCByZXBsYWNlIGFuIGFyY2hpdmUgbWVtYmVyIHdpdGggYSBub24tZXhpc3RlbnQgZmlsZSI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBkYXRhID0gMDsKKyAgcGF0aCA9IG5ld0ZpbGU7CisKKyAgLy8gU1ZSNCBzeW1ib2wgdGFibGVzIGhhdmUgYW4gZW1wdHkgbmFtZQorICBpZiAocGF0aC5zdHIoKSA9PSBBUkZJTEVfU1ZSNF9TWU1UQUJfTkFNRSkKKyAgICBmbGFncyB8PSBTVlI0U3ltYm9sVGFibGVGbGFnOworICBlbHNlCisgICAgZmxhZ3MgJj0gflNWUjRTeW1ib2xUYWJsZUZsYWc7CisKKyAgLy8gQlNENC40IHN5bWJvbCB0YWJsZXMgaGF2ZSBhIHNwZWNpYWwgbmFtZQorICBpZiAocGF0aC5zdHIoKSA9PSBBUkZJTEVfQlNENF9TWU1UQUJfTkFNRSkKKyAgICBmbGFncyB8PSBCU0Q0U3ltYm9sVGFibGVGbGFnOworICBlbHNlCisgICAgZmxhZ3MgJj0gfkJTRDRTeW1ib2xUYWJsZUZsYWc7CisKKyAgLy8gTExWTSBzeW1ib2wgdGFibGVzIGhhdmUgYSB2ZXJ5IHNwZWNpZmljIG5hbWUKKyAgaWYgKHBhdGguc3RyKCkgPT0gQVJGSUxFX0xMVk1fU1lNVEFCX05BTUUpCisgICAgZmxhZ3MgfD0gTExWTVN5bWJvbFRhYmxlRmxhZzsKKyAgZWxzZQorICAgIGZsYWdzICY9IH5MTFZNU3ltYm9sVGFibGVGbGFnOworCisgIC8vIFN0cmluZyB0YWJsZSBuYW1lCisgIGlmIChwYXRoLnN0cigpID09IEFSRklMRV9TVFJUQUJfTkFNRSkKKyAgICBmbGFncyB8PSBTdHJpbmdUYWJsZUZsYWc7CisgIGVsc2UKKyAgICBmbGFncyAmPSB+U3RyaW5nVGFibGVGbGFnOworCisgIC8vIElmIGl0IGhhcyBhIHNsYXNoIHRoZW4gaXQgaGFzIGEgcGF0aAorICBib29sIGhhc1NsYXNoID0gcGF0aC5zdHIoKS5maW5kKCcvJykgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgIGlmIChoYXNTbGFzaCkKKyAgICBmbGFncyB8PSBIYXNQYXRoRmxhZzsKKyAgZWxzZQorICAgIGZsYWdzICY9IH5IYXNQYXRoRmxhZzsKKworICAvLyBJZiBpdCBoYXMgYSBzbGFzaCBvciBpdHMgb3ZlciAxNSBjaGFycyB0aGVuIGl0cyBhIGxvbmcgZmlsZW5hbWUgZm9ybWF0CisgIGlmIChoYXNTbGFzaCB8fCBwYXRoLnN0cigpLmxlbmd0aCgpID4gMTUpCisgICAgZmxhZ3MgfD0gSGFzTG9uZ0ZpbGVuYW1lRmxhZzsKKyAgZWxzZQorICAgIGZsYWdzICY9IH5IYXNMb25nRmlsZW5hbWVGbGFnOworCisgIC8vIEdldCB0aGUgc2lnbmF0dXJlIGFuZCBzdGF0dXMgaW5mbworICBjb25zdCBjaGFyKiBzaWduYXR1cmUgPSAoY29uc3QgY2hhciopIGRhdGE7CisgIHN0ZDo6c3RyaW5nIG1hZ2ljOworICBpZiAoIXNpZ25hdHVyZSkgeworICAgIHBhdGguZ2V0TWFnaWNOdW1iZXIobWFnaWMsNCk7CisgICAgc2lnbmF0dXJlID0gbWFnaWMuY19zdHIoKTsKKyAgICBzdGQ6OnN0cmluZyBlcnI7CisgICAgY29uc3Qgc3lzOjpGaWxlU3RhdHVzICpGU2luZm8gPSBwYXRoLmdldEZpbGVTdGF0dXMoZmFsc2UsIEVyck1zZyk7CisgICAgaWYgKEZTaW5mbykKKyAgICAgIGluZm8gPSAqRlNpbmZvOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gRGV0ZXJtaW5lIHdoYXQga2luZCBvZiBmaWxlIGl0IGlzLgorICBzd2l0Y2ggKHN5czo6SWRlbnRpZnlGaWxlVHlwZShzaWduYXR1cmUsNCkpIHsKKyAgICBjYXNlIHN5czo6Qml0Y29kZV9GaWxlVHlwZToKKyAgICAgIGZsYWdzIHw9IEJpdGNvZGVGbGFnOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZsYWdzICY9IH5CaXRjb2RlRmxhZzsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gQXJjaGl2ZSBjb25zdHJ1Y3RvciAtIHRoaXMgaXMgdGhlIG9ubHkgY29uc3RydWN0b3IgdGhhdCBnZXRzIHVzZWQgZm9yIHRoZQorLy8gQXJjaGl2ZSBjbGFzcy4gRXZlcnl0aGluZyBlbHNlIChkZWZhdWx0LGNvcHkpIGlzIGRlcHJlY2F0ZWQuIFRoaXMganVzdAorLy8gaW5pdGlhbGl6ZXMgYW5kIG1hcHMgdGhlIGZpbGUgaW50byBtZW1vcnksIGlmIHJlcXVlc3RlZC4KK0FyY2hpdmU6OkFyY2hpdmUoY29uc3Qgc3lzOjpQYXRoJiBmaWxlbmFtZSwgTExWTUNvbnRleHQmIEMpCisgIDogYXJjaFBhdGgoZmlsZW5hbWUpLCBtZW1iZXJzKCksIG1hcGZpbGUoMCksIGJhc2UoMCksIHN5bVRhYigpLCBzdHJ0YWIoKSwKKyAgICBzeW1UYWJTaXplKDApLCBmaXJzdEZpbGVPZmZzZXQoMCksIG1vZHVsZXMoKSwgZm9yZWlnblNUKDApLCBDb250ZXh0KEMpIHsKK30KKworYm9vbAorQXJjaGl2ZTo6bWFwVG9NZW1vcnkoc3RkOjpzdHJpbmcqIEVyck1zZykgeworICBtYXBmaWxlID0gTWVtb3J5QnVmZmVyOjpnZXRGaWxlKGFyY2hQYXRoLmNfc3RyKCksIEVyck1zZyk7CisgIGlmIChtYXBmaWxlID09IDApCisgICAgcmV0dXJuIHRydWU7CisgIGJhc2UgPSBtYXBmaWxlLT5nZXRCdWZmZXJTdGFydCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXJjaGl2ZTo6Y2xlYW5VcE1lbW9yeSgpIHsKKyAgLy8gU2h1dGRvd24gdGhlIGZpbGUgbWFwcGluZworICBkZWxldGUgbWFwZmlsZTsKKyAgbWFwZmlsZSA9IDA7CisgIGJhc2UgPSAwOworICAKKyAgLy8gRm9yZ2V0IHRoZSBlbnRpcmUgc3ltYm9sIHRhYmxlCisgIHN5bVRhYi5jbGVhcigpOworICBzeW1UYWJTaXplID0gMDsKKyAgCisgIGZpcnN0RmlsZU9mZnNldCA9IDA7CisgIAorICAvLyBGcmVlIHRoZSBmb3JlaWduIHN5bWJvbCB0YWJsZSBtZW1iZXIKKyAgaWYgKGZvcmVpZ25TVCkgeworICAgIGRlbGV0ZSBmb3JlaWduU1Q7CisgICAgZm9yZWlnblNUID0gMDsKKyAgfQorICAKKyAgLy8gRGVsZXRlIGFueSBNb2R1bGVzIGFuZCBBcmNoaXZlTWVtYmVyJ3Mgd2UndmUgYWxsb2NhdGVkIGFzIGEgcmVzdWx0IG9mCisgIC8vIHN5bWJvbCB0YWJsZSBzZWFyY2hlcy4KKyAgZm9yIChNb2R1bGVNYXA6Oml0ZXJhdG9yIEk9bW9kdWxlcy5iZWdpbigpLCBFPW1vZHVsZXMuZW5kKCk7IEkgIT0gRTsgKytJICkgeworICAgIGRlbGV0ZSBJLT5zZWNvbmQuZmlyc3Q7CisgICAgZGVsZXRlIEktPnNlY29uZC5zZWNvbmQ7CisgIH0KK30KKworLy8gQXJjaGl2ZSBkZXN0cnVjdG9yIC0ganVzdCBjbGVhbiB1cCBtZW1vcnkKK0FyY2hpdmU6On5BcmNoaXZlKCkgeworICBjbGVhblVwTWVtb3J5KCk7Cit9CisKKworCitzdGF0aWMgdm9pZCBnZXRTeW1ib2xzKE1vZHVsZSpNLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN5bWJvbHMpIHsKKyAgLy8gTG9vcCBvdmVyIGdsb2JhbCB2YXJpYWJsZXMKKyAgZm9yIChNb2R1bGU6Omdsb2JhbF9pdGVyYXRvciBHSSA9IE0tPmdsb2JhbF9iZWdpbigpLCBHRT1NLT5nbG9iYWxfZW5kKCk7IEdJICE9IEdFOyArK0dJKQorICAgIGlmICghR0ktPmlzRGVjbGFyYXRpb24oKSAmJiAhR0ktPmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgaWYgKCFHSS0+Z2V0TmFtZSgpLmVtcHR5KCkpCisgICAgICAgIHN5bWJvbHMucHVzaF9iYWNrKEdJLT5nZXROYW1lKCkpOworICAKKyAgLy8gTG9vcCBvdmVyIGZ1bmN0aW9ucworICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgRkkgPSBNLT5iZWdpbigpLCBGRSA9IE0tPmVuZCgpOyBGSSAhPSBGRTsgKytGSSkKKyAgICBpZiAoIUZJLT5pc0RlY2xhcmF0aW9uKCkgJiYgIUZJLT5oYXNMb2NhbExpbmthZ2UoKSkKKyAgICAgIGlmICghRkktPmdldE5hbWUoKS5lbXB0eSgpKQorICAgICAgICBzeW1ib2xzLnB1c2hfYmFjayhGSS0+Z2V0TmFtZSgpKTsKKworICAvLyBMb29wIG92ZXIgYWxpYXNlcworICBmb3IgKE1vZHVsZTo6YWxpYXNfaXRlcmF0b3IgQUkgPSBNLT5hbGlhc19iZWdpbigpLCBBRSA9IE0tPmFsaWFzX2VuZCgpOworICAgICAgIEFJICE9IEFFOyArK0FJKSB7CisgICAgaWYgKEFJLT5oYXNOYW1lKCkpCisgICAgICBzeW1ib2xzLnB1c2hfYmFjayhBSS0+Z2V0TmFtZSgpKTsKKyAgfQorfQorCisvLyBHZXQganVzdCB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIGRlZmluZWQgc3ltYm9scyBmcm9tIHRoZSBiaXRjb2RlCitib29sIGxsdm06OkdldEJpdGNvZGVTeW1ib2xzKGNvbnN0IHN5czo6UGF0aCYgZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0JiBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBFcnJNc2cpIHsKKyAgc3RkOjphdXRvX3B0cjxNZW1vcnlCdWZmZXI+IEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5QnVmZmVyOjpnZXRGaWxlT3JTVERJTihmTmFtZS5jX3N0cigpKSk7CisgIGlmICghQnVmZmVyLmdldCgpKSB7CisgICAgaWYgKEVyck1zZykgKkVyck1zZyA9ICJDb3VsZCBub3Qgb3BlbiBmaWxlICciICsgZk5hbWUuc3RyKCkgKyAiJyI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIE1vZHVsZSAqTSA9IFBhcnNlQml0Y29kZUZpbGUoQnVmZmVyLmdldCgpLCBDb250ZXh0LCBFcnJNc2cpOworICBpZiAoIU0pCisgICAgcmV0dXJuIHRydWU7CisgIAorICAvLyBHZXQgdGhlIHN5bWJvbHMKKyAgZ2V0U3ltYm9scyhNLCBzeW1ib2xzKTsKKyAgCisgIC8vIERvbmUgd2l0aCB0aGUgbW9kdWxlLgorICBkZWxldGUgTTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK01vZHVsZSoKK2xsdm06OkdldEJpdGNvZGVTeW1ib2xzKGNvbnN0IGNoYXIgKkJ1ZlB0ciwgdW5zaWduZWQgTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE1vZHVsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQmIENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogRXJyTXNnKSB7CisgIC8vIEdldCB0aGUgbW9kdWxlLgorICBzdGQ6OmF1dG9fcHRyPE1lbW9yeUJ1ZmZlcj4gQnVmZmVyKAorICAgIE1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyQ29weShTdHJpbmdSZWYoQnVmUHRyLCBMZW5ndGgpLE1vZHVsZUlELmNfc3RyKCkpKTsKKyAgCisgIE1vZHVsZSAqTSA9IFBhcnNlQml0Y29kZUZpbGUoQnVmZmVyLmdldCgpLCBDb250ZXh0LCBFcnJNc2cpOworICBpZiAoIU0pCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBHZXQgdGhlIHN5bWJvbHMKKyAgZ2V0U3ltYm9scyhNLCBzeW1ib2xzKTsKKyAgCisgIC8vIERvbmUgd2l0aCB0aGUgbW9kdWxlLiBOb3RlIHRoYXQgaXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlCisgIC8vIHRoZSBNb2R1bGUuCisgIHJldHVybiBNOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FyY2hpdmUvQXJjaGl2ZUludGVybmFscy5oIGIvc3JjL0xMVk0vbGliL0FyY2hpdmUvQXJjaGl2ZUludGVybmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjIwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQXJjaGl2ZS9BcmNoaXZlSW50ZXJuYWxzLmgKQEAgLTAsMCArMSw4OSBAQAorLy89PT0tLSBsaWIvQXJjaGl2ZS9BcmNoaXZlSW50ZXJuYWxzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGhlYWRlciBmb3IgTExWTSBBcmNoaXZlIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTElCX0FSQ0hJVkVfQVJDSElWRUlOVEVSTkFMU19ICisjZGVmaW5lIExJQl9BUkNISVZFX0FSQ0hJVkVJTlRFUk5BTFNfSAorCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0FyY2hpdmUuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaW1lVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKworI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNkZWZpbmUgQVJGSUxFX01BR0lDICIhPGFyY2g+XG4iICAgICAgICAgICAgICAgICAgIC8vLzwgbWFnaWMgc3RyaW5nCisjZGVmaW5lIEFSRklMRV9NQUdJQ19MRU4gKHNpemVvZihBUkZJTEVfTUFHSUMpLTEpICAvLy88IGxlbmd0aCBvZiBtYWdpYyBzdHJpbmcKKyNkZWZpbmUgQVJGSUxFX1NWUjRfU1lNVEFCX05BTUUgIi8gICAgICAgICAgICAgICAiIC8vLzwgU1ZSNCBzeW10YWIgZW50cnkgbmFtZQorI2RlZmluZSBBUkZJTEVfTExWTV9TWU1UQUJfTkFNRSAiI19MTFZNX1NZTV9UQUJfIyIgLy8vPCBMTFZNIHN5bXRhYiBlbnRyeSBuYW1lCisjZGVmaW5lIEFSRklMRV9CU0Q0X1NZTVRBQl9OQU1FICJfXy5TWU1ERUYgU09SVEVEIiAvLy88IEJTRDQgc3ltdGFiIGVudHJ5IG5hbWUKKyNkZWZpbmUgQVJGSUxFX1NUUlRBQl9OQU1FICAgICAgIi8vICAgICAgICAgICAgICAiIC8vLzwgTmFtZSBvZiBzdHJpbmcgdGFibGUKKyNkZWZpbmUgQVJGSUxFX1BBRCAiXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW50ZXItZmlsZSBhbGlnbiBwYWRkaW5nCisjZGVmaW5lIEFSRklMRV9NRU1CRVJfTUFHSUMgImBcbiIgICAgICAgICAgICAgICAgICAvLy88IGZtYWcgZmllbGQgbWFnaWMgIworCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgTExWTUNvbnRleHQ7CisKKyAgLy8vIFRoZSBBcmNoaXZlTWVtYmVySGVhZGVyIHN0cnVjdHVyZSBpcyB1c2VkIGludGVybmFsbHkgZm9yIGJpdGNvZGUKKyAgLy8vIGFyY2hpdmVzLgorICAvLy8gVGhlIGhlYWRlciBwcmVjZWRlcyBlYWNoIGZpbGUgbWVtYmVyIGluIHRoZSBhcmNoaXZlLiBUaGlzIHN0cnVjdHVyZSBpcworICAvLy8gZGVmaW5lZCB1c2luZyBjaGFyYWN0ZXIgYXJyYXlzIGZvciBkaXJlY3QgYW5kIGNvcnJlY3QgaW50ZXJwcmV0YXRpb24KKyAgLy8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbmVzcyBvZiB0aGUgbWFjaGluZSB0aGF0IHByb2R1Y2VkIGl0LgorICAvLy8gQGJyaWVmIEFyY2hpdmUgRmlsZSBNZW1iZXIgSGVhZGVyCisgIGNsYXNzIEFyY2hpdmVNZW1iZXJIZWFkZXIgeworICAgIC8vLyBAbmFtZSBEYXRhCisgICAgLy8vIEB7CisgICAgcHVibGljOgorICAgICAgY2hhciBuYW1lWzE2XTsgIC8vLzwgTmFtZSBvZiB0aGUgZmlsZSBtZW1iZXIuCisgICAgICBjaGFyIGRhdGVbMTJdOyAgLy8vPCBGaWxlIGRhdGUsIGRlY2ltYWwgc2Vjb25kcyBzaW5jZSBFcG9jaAorICAgICAgY2hhciB1aWRbNl07ICAgIC8vLzwgdXNlciBpZCBpbiBBU0NJSSBkZWNpbWFsCisgICAgICBjaGFyIGdpZFs2XTsgICAgLy8vPCBncm91cCBpZCBpbiBBU0NJSSBkZWNpbWFsCisgICAgICBjaGFyIG1vZGVbOF07ICAgLy8vPCBmaWxlIG1vZGUgaW4gQVNDSUkgb2N0YWwKKyAgICAgIGNoYXIgc2l6ZVsxMF07ICAvLy88IGZpbGUgc2l6ZSBpbiBBU0NJSSBkZWNpbWFsCisgICAgICBjaGFyIGZtYWdbMl07ICAgLy8vPCBBbHdheXMgY29udGFpbnMgQVJGSUxFX01BR0lDX1RFUk1JTkFUT1IKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBNZXRob2RzCisgICAgLy8vIEB7CisgICAgcHVibGljOgorICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgIG1lbXNldChuYW1lLCcgJywxNik7CisgICAgICBtZW1zZXQoZGF0ZSwnICcsMTIpOworICAgICAgbWVtc2V0KHVpZCwnICcsNik7CisgICAgICBtZW1zZXQoZ2lkLCcgJyw2KTsKKyAgICAgIG1lbXNldChtb2RlLCcgJyw4KTsKKyAgICAgIG1lbXNldChzaXplLCcgJywxMCk7CisgICAgICBmbWFnWzBdID0gJ2AnOworICAgICAgZm1hZ1sxXSA9ICdcbic7CisgICAgfQorCisgICAgYm9vbCBjaGVja1NpZ25hdHVyZSgpIHsKKyAgICAgIHJldHVybiAwID09IG1lbWNtcChmbWFnLCBBUkZJTEVfTUVNQkVSX01BR0lDLDIpOworICAgIH0KKyAgfTsKKyAgCisgIC8vIEdldCBqdXN0IHRoZSBleHRlcm5hbGx5IHZpc2libGUgZGVmaW5lZCBzeW1ib2xzIGZyb20gdGhlIGJpdGNvZGUKKyAgYm9vbCBHZXRCaXRjb2RlU3ltYm9scyhjb25zdCBzeXM6OlBhdGgmIGZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCYgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBzeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogRXJyTXNnKTsKKyAgCisgIE1vZHVsZSogR2V0Qml0Y29kZVN5bWJvbHMoY29uc3QgY2hhciAqQnVmZmVyLCB1bnNpZ25lZCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE1vZHVsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0JiBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogRXJyTXNnKTsKK30KKworI2VuZGlmCisKKy8vIHZpbTogc3c9MiBhaQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FyY2hpdmUvQXJjaGl2ZVJlYWRlci5jcHAgYi9zcmMvTExWTS9saWIvQXJjaGl2ZS9BcmNoaXZlUmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY2ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FyY2hpdmUvQXJjaGl2ZVJlYWRlci5jcHAKQEAgLTAsMCArMSw2MzAgQEAKKy8vPT09LS0gQXJjaGl2ZVJlYWRlci5jcHAgLSBSZWFkIExMVk0gYXJjaGl2ZSBmaWxlcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQnVpbGRzIHVwIHN0YW5kYXJkIHVuaXggYXJjaGl2ZSBmaWxlcyAoLmEpIGNvbnRhaW5pbmcgTExWTSBiaXRjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJBcmNoaXZlSW50ZXJuYWxzLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL1JlYWRlcldyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8bWVtb3J5PgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBSZWFkIGEgdmFyaWFibGUtYml0LXJhdGUgZW5jb2RlZCB1bnNpZ25lZCBpbnRlZ2VyCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHJlYWRJbnRlZ2VyKGNvbnN0IGNoYXIqJkF0LCBjb25zdCBjaGFyKkVuZCkgeworICB1bnNpZ25lZCBTaGlmdCA9IDA7CisgIHVuc2lnbmVkIFJlc3VsdCA9IDA7CisKKyAgZG8geworICAgIGlmIChBdCA9PSBFbmQpCisgICAgICByZXR1cm4gUmVzdWx0OworICAgIFJlc3VsdCB8PSAodW5zaWduZWQpKCgqQXQrKykgJiAweDdGKSA8PCBTaGlmdDsKKyAgICBTaGlmdCArPSA3OworICB9IHdoaWxlIChBdFstMV0gJiAweDgwKTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8gQ29tcGxldGVseSBwYXJzZSB0aGUgQXJjaGl2ZSdzIHN5bWJvbCB0YWJsZSBhbmQgcG9wdWxhdGUgc3ltVGFiIG1lbWJlciB2YXIuCitib29sCitBcmNoaXZlOjpwYXJzZVN5bWJvbFRhYmxlKGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIHNpemUsIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworICBjb25zdCBjaGFyKiBBdCA9IChjb25zdCBjaGFyKikgZGF0YTsKKyAgY29uc3QgY2hhciogRW5kID0gQXQgKyBzaXplOworICB3aGlsZSAoQXQgPCBFbmQpIHsKKyAgICB1bnNpZ25lZCBvZmZzZXQgPSByZWFkSW50ZWdlcihBdCwgRW5kKTsKKyAgICBpZiAoQXQgPT0gRW5kKSB7CisgICAgICBpZiAoZXJyb3IpCisgICAgICAgICplcnJvciA9ICJSYW4gb3V0IG9mIGRhdGEgcmVhZGluZyB2YnJfdWludCBmb3Igc3ltdGFiIG9mZnNldCEiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1bnNpZ25lZCBsZW5ndGggPSByZWFkSW50ZWdlcihBdCwgRW5kKTsKKyAgICBpZiAoQXQgPT0gRW5kKSB7CisgICAgICBpZiAoZXJyb3IpCisgICAgICAgICplcnJvciA9ICJSYW4gb3V0IG9mIGRhdGEgcmVhZGluZyB2YnJfdWludCBmb3Igc3ltdGFiIGxlbmd0aCEiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoQXQgKyBsZW5ndGggPiBFbmQpIHsKKyAgICAgIGlmIChlcnJvcikKKyAgICAgICAgKmVycm9yID0gIk1hbGZvcm1lZCBzeW1ib2wgdGFibGU6IGxlbmd0aCBub3QgY29uc2lzdGVudCB3aXRoIHNpemUiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyB3ZSBkb24ndCBjYXJlIGlmIGl0IGNhbid0IGJlIGluc2VydGVkIChkdXBsaWNhdGUgZW50cnkpCisgICAgc3ltVGFiLmluc2VydChzdGQ6Om1ha2VfcGFpcihzdGQ6OnN0cmluZyhBdCwgbGVuZ3RoKSwgb2Zmc2V0KSk7CisgICAgQXQgKz0gbGVuZ3RoOworICB9CisgIHN5bVRhYlNpemUgPSBzaXplOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVGhpcyBtZW1iZXIgcGFyc2VzIGFuIEFyY2hpdmVNZW1iZXJIZWFkZXIgdGhhdCBpcyBwcmVzdW1lZCB0byBiZSBwb2ludGVkIHRvCisvLyBieSBBdC4gVGhlIEF0IHBvaW50ZXIgaXMgdXBkYXRlZCB0byB0aGUgYnl0ZSBqdXN0IGFmdGVyIHRoZSBoZWFkZXIsIHdoaWNoCisvLyBjYW4gYmUgdmFyaWFibGUgaW4gc2l6ZS4KK0FyY2hpdmVNZW1iZXIqCitBcmNoaXZlOjpwYXJzZU1lbWJlckhlYWRlcihjb25zdCBjaGFyKiYgQXQsIGNvbnN0IGNoYXIqIEVuZCwgc3RkOjpzdHJpbmcqIGVycm9yKQoreworICBpZiAoQXQgKyBzaXplb2YoQXJjaGl2ZU1lbWJlckhlYWRlcikgPj0gRW5kKSB7CisgICAgaWYgKGVycm9yKQorICAgICAgKmVycm9yID0gIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gQ2FzdCBhcmNoaXZlIG1lbWJlciBoZWFkZXIKKyAgQXJjaGl2ZU1lbWJlckhlYWRlciogSGRyID0gKEFyY2hpdmVNZW1iZXJIZWFkZXIqKUF0OworICBBdCArPSBzaXplb2YoQXJjaGl2ZU1lbWJlckhlYWRlcik7CisKKyAgLy8gRXh0cmFjdCB0aGUgc2l6ZSBhbmQgZGV0ZXJtaW5lIGlmIHRoZSBmaWxlIGlzCisgIC8vIGNvbXByZXNzZWQgb3Igbm90IChuZWdhdGl2ZSBsZW5ndGgpLgorICBpbnQgZmxhZ3MgPSAwOworICBpbnQgTWVtYmVyU2l6ZSA9IGF0b2koSGRyLT5zaXplKTsKKyAgaWYgKE1lbWJlclNpemUgPCAwKSB7CisgICAgZmxhZ3MgfD0gQXJjaGl2ZU1lbWJlcjo6Q29tcHJlc3NlZEZsYWc7CisgICAgTWVtYmVyU2l6ZSA9IC1NZW1iZXJTaXplOworICB9CisKKyAgLy8gQ2hlY2sgdGhlIHNpemUgb2YgdGhlIG1lbWJlciBmb3Igc2FuaXR5CisgIGlmIChBdCArIE1lbWJlclNpemUgPiBFbmQpIHsKKyAgICBpZiAoZXJyb3IpCisgICAgICAqZXJyb3IgPSAiaW52YWxpZCBtZW1iZXIgbGVuZ3RoIGluIGFyY2hpdmUgZmlsZSI7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBDaGVjayB0aGUgbWVtYmVyIHNpZ25hdHVyZQorICBpZiAoIUhkci0+Y2hlY2tTaWduYXR1cmUoKSkgeworICAgIGlmIChlcnJvcikKKyAgICAgICplcnJvciA9ICJpbnZhbGlkIGZpbGUgbWVtYmVyIHNpZ25hdHVyZSI7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBDb252ZXJ0IGFuZCBjaGVjayB0aGUgbWVtYmVyIG5hbWUKKyAgLy8gVGhlIGVtcHR5IG5hbWUgKCAnLycgYW5kIDE1IGJsYW5rcykgaXMgZm9yIGEgZm9yZWlnbiAobm9uLUxMVk0pIHN5bWJvbAorICAvLyB0YWJsZS4gVGhlIHNwZWNpYWwgbmFtZSAiLy8iIGFuZCAxNCBibGFua3MgaXMgZm9yIGEgc3RyaW5nIHRhYmxlLCB1c2VkCisgIC8vIGZvciBsb25nIGZpbGUgbmFtZXMuIFRoaXMgbGlicmFyeSBkb2Vzbid0IGdlbmVyYXRlIGVpdGhlciBvZiB0aG9zZSBidXQKKyAgLy8gaXQgd2lsbCBhY2NlcHQgdGhlbS4gSWYgdGhlIG5hbWUgc3RhcnRzIHdpdGggIzEvIGFuZCB0aGUgcmVtYWluZGVyIGlzCisgIC8vIGRpZ2l0cywgdGhlbiB0aG9zZSBkaWdpdHMgc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIHRoYXQgaXMKKyAgLy8gc3RvcmVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgaGVhZGVyLiBUaGUgc3BlY2lhbCBuYW1lCisgIC8vIF9fTExWTV9TWU1fVEFCX18gaWRlbnRpZmllcyB0aGUgc3ltYm9sIHRhYmxlIGZvciBMTFZNIGJpdGNvZGUuCisgIC8vIEFueXRoaW5nIGVsc2UgaXMgYSByZWd1bGFyLCBzaG9ydCBmaWxlbmFtZSB0aGF0IGlzIHRlcm1pbmF0ZWQgd2l0aAorICAvLyBhICcvJyBhbmQgYmxhbmtzLgorCisgIHN0ZDo6c3RyaW5nIHBhdGhuYW1lOworICBzd2l0Y2ggKEhkci0+bmFtZVswXSkgeworICAgIGNhc2UgJyMnOgorICAgICAgaWYgKEhkci0+bmFtZVsxXSA9PSAnMScgJiYgSGRyLT5uYW1lWzJdID09ICcvJykgeworICAgICAgICBpZiAoaXNkaWdpdChIZHItPm5hbWVbM10pKSB7CisgICAgICAgICAgdW5zaWduZWQgbGVuID0gYXRvaSgmSGRyLT5uYW1lWzNdKTsKKyAgICAgICAgICBjb25zdCBjaGFyICpudWxwID0gKGNvbnN0IGNoYXIgKiltZW1jaHIoQXQsICdcMCcsIGxlbik7CisgICAgICAgICAgcGF0aG5hbWUuYXNzaWduKEF0LCBudWxwICE9IDAgPyAodWludHB0cl90KShudWxwIC0gQXQpIDogbGVuKTsKKyAgICAgICAgICBBdCArPSBsZW47CisgICAgICAgICAgTWVtYmVyU2l6ZSAtPSBsZW47CisgICAgICAgICAgZmxhZ3MgfD0gQXJjaGl2ZU1lbWJlcjo6SGFzTG9uZ0ZpbGVuYW1lRmxhZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICAqZXJyb3IgPSAiaW52YWxpZCBsb25nIGZpbGVuYW1lIjsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChIZHItPm5hbWVbMV0gPT0gJ18nICYmCisgICAgICAgICAgICAgICAgICgwID09IG1lbWNtcChIZHItPm5hbWUsIEFSRklMRV9MTFZNX1NZTVRBQl9OQU1FLCAxNikpKSB7CisgICAgICAgIC8vIFRoZSBtZW1iZXIgaXMgdXNpbmcgYSBsb25nIGZpbGUgbmFtZSAoPjE1IGNoYXJzKSBmb3JtYXQuCisgICAgICAgIC8vIFRoaXMgZm9ybWF0IGlzIHN0YW5kYXJkIGZvciA0LjRCU0QgYW5kIE1hYyBPU1ggb3BlcmF0aW5nCisgICAgICAgIC8vIHN5c3RlbXMuIExMVk0gdXNlcyBpdCBzaW1pbGFybHkuIEluIHRoaXMgZm9ybWF0LCB0aGUKKyAgICAgICAgLy8gcmVtYWluZGVyIG9mIHRoZSBuYW1lIGZpZWxkIChhZnRlciAjMS8pIHNwZWNpZmllcyB0aGUKKyAgICAgICAgLy8gbGVuZ3RoIG9mIHRoZSBmaWxlIG5hbWUgd2hpY2ggb2NjdXB5IHRoZSBmaXJzdCBieXRlcyBvZgorICAgICAgICAvLyB0aGUgbWVtYmVyJ3MgZGF0YS4gVGhlIHBhdGhuYW1lIGFscmVhZHkgaGFzIHRoZSAjMS8gc3RyaXBwZWQuCisgICAgICAgIHBhdGhuYW1lLmFzc2lnbihBUkZJTEVfTExWTV9TWU1UQUJfTkFNRSk7CisgICAgICAgIGZsYWdzIHw9IEFyY2hpdmVNZW1iZXI6OkxMVk1TeW1ib2xUYWJsZUZsYWc7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICcvJzoKKyAgICAgIGlmIChIZHItPm5hbWVbMV09PSAnLycpIHsKKyAgICAgICAgaWYgKDAgPT0gbWVtY21wKEhkci0+bmFtZSwgQVJGSUxFX1NUUlRBQl9OQU1FLCAxNikpIHsKKyAgICAgICAgICBwYXRobmFtZS5hc3NpZ24oQVJGSUxFX1NUUlRBQl9OQU1FKTsKKyAgICAgICAgICBmbGFncyB8PSBBcmNoaXZlTWVtYmVyOjpTdHJpbmdUYWJsZUZsYWc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgKmVycm9yID0gImludmFsaWQgc3RyaW5nIHRhYmxlIG5hbWUiOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKEhkci0+bmFtZVsxXSA9PSAnICcpIHsKKyAgICAgICAgaWYgKDAgPT0gbWVtY21wKEhkci0+bmFtZSwgQVJGSUxFX1NWUjRfU1lNVEFCX05BTUUsIDE2KSkgeworICAgICAgICAgIHBhdGhuYW1lLmFzc2lnbihBUkZJTEVfU1ZSNF9TWU1UQUJfTkFNRSk7CisgICAgICAgICAgZmxhZ3MgfD0gQXJjaGl2ZU1lbWJlcjo6U1ZSNFN5bWJvbFRhYmxlRmxhZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICAqZXJyb3IgPSAiaW52YWxpZCBTVlI0IHN5bWJvbCB0YWJsZSBuYW1lIjsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KEhkci0+bmFtZVsxXSkpIHsKKyAgICAgICAgdW5zaWduZWQgaW5kZXggPSBhdG9pKCZIZHItPm5hbWVbMV0pOworICAgICAgICBpZiAoaW5kZXggPCBzdHJ0YWIubGVuZ3RoKCkpIHsKKyAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lcCA9IHN0cnRhYi5jX3N0cigpICsgaW5kZXg7CisgICAgICAgICAgY29uc3QgY2hhciogZW5kcCA9IHN0cnRhYi5jX3N0cigpICsgc3RydGFiLmxlbmd0aCgpOworICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBuYW1lcDsKKyAgICAgICAgICBjb25zdCBjaGFyKiBsYXN0X3AgPSBwOworICAgICAgICAgIHdoaWxlIChwIDwgZW5kcCkgeworICAgICAgICAgICAgaWYgKCpwID09ICdcbicgJiYgKmxhc3RfcCA9PSAnLycpIHsKKyAgICAgICAgICAgICAgcGF0aG5hbWUuYXNzaWduKG5hbWVwLCBsYXN0X3AgLSBuYW1lcCk7CisgICAgICAgICAgICAgIGZsYWdzIHw9IEFyY2hpdmVNZW1iZXI6Okhhc0xvbmdGaWxlbmFtZUZsYWc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdF9wID0gcDsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHAgPj0gZW5kcCkgeworICAgICAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgICAqZXJyb3IgPSAibWlzc2luZyBuYW1lIHRlcm1pYW50b3IgaW4gc3RyaW5nIHRhYmxlIjsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICAqZXJyb3IgPSAibmFtZSBpbmRleCBiZXlvbmQgc3RyaW5nIHRhYmxlIjsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnXyc6CisgICAgICBpZiAoSGRyLT5uYW1lWzFdID09ICdfJyAmJgorICAgICAgICAgICgwID09IG1lbWNtcChIZHItPm5hbWUsIEFSRklMRV9CU0Q0X1NZTVRBQl9OQU1FLCAxNikpKSB7CisgICAgICAgIHBhdGhuYW1lLmFzc2lnbihBUkZJTEVfQlNENF9TWU1UQUJfTkFNRSk7CisgICAgICAgIGZsYWdzIHw9IEFyY2hpdmVNZW1iZXI6OkJTRDRTeW1ib2xUYWJsZUZsYWc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICBkZWZhdWx0OgorICAgICAgY2hhciogc2xhc2ggPSAoY2hhciopIG1lbWNocihIZHItPm5hbWUsICcvJywgMTYpOworICAgICAgaWYgKHNsYXNoID09IDApCisgICAgICAgIHNsYXNoID0gSGRyLT5uYW1lICsgMTY7CisgICAgICBwYXRobmFtZS5hc3NpZ24oSGRyLT5uYW1lLCBzbGFzaCAtIEhkci0+bmFtZSk7CisgICAgICBicmVhazsKKyAgfQorCisgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgYml0Y29kZSBmaWxlCisgIHN3aXRjaCAoc3lzOjpJZGVudGlmeUZpbGVUeXBlKEF0LCA0KSkgeworICAgIGNhc2Ugc3lzOjpCaXRjb2RlX0ZpbGVUeXBlOgorICAgICAgZmxhZ3MgfD0gQXJjaGl2ZU1lbWJlcjo6Qml0Y29kZUZsYWc7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZmxhZ3MgJj0gfkFyY2hpdmVNZW1iZXI6OkJpdGNvZGVGbGFnOworICAgICAgYnJlYWs7CisgIH0KKworICAvLyBJbnN0YW50aWF0ZSB0aGUgQXJjaGl2ZU1lbWJlciB0byBiZSBmaWxsZWQKKyAgQXJjaGl2ZU1lbWJlciogbWVtYmVyID0gbmV3IEFyY2hpdmVNZW1iZXIodGhpcyk7CisKKyAgLy8gRmlsbCBpbiBmaWVsZHMgb2YgdGhlIEFyY2hpdmVNZW1iZXIKKyAgbWVtYmVyLT5wYXJlbnQgPSB0aGlzOworICBtZW1iZXItPnBhdGguc2V0KHBhdGhuYW1lKTsKKyAgbWVtYmVyLT5pbmZvLmZpbGVTaXplID0gTWVtYmVyU2l6ZTsKKyAgbWVtYmVyLT5pbmZvLm1vZFRpbWUuZnJvbUVwb2NoVGltZShhdG9pKEhkci0+ZGF0ZSkpOworICB1bnNpZ25lZCBpbnQgbW9kZTsKKyAgc3NjYW5mKEhkci0+bW9kZSwgIiVvIiwgJm1vZGUpOworICBtZW1iZXItPmluZm8ubW9kZSA9IG1vZGU7CisgIG1lbWJlci0+aW5mby51c2VyID0gYXRvaShIZHItPnVpZCk7CisgIG1lbWJlci0+aW5mby5ncm91cCA9IGF0b2koSGRyLT5naWQpOworICBtZW1iZXItPmZsYWdzID0gZmxhZ3M7CisgIG1lbWJlci0+ZGF0YSA9IEF0OworCisgIHJldHVybiBtZW1iZXI7Cit9CisKK2Jvb2wKK0FyY2hpdmU6OmNoZWNrU2lnbmF0dXJlKHN0ZDo6c3RyaW5nKiBlcnJvcikgeworICAvLyBDaGVjayB0aGUgbWFnaWMgc3RyaW5nIGF0IGZpbGUncyBoZWFkZXIKKyAgaWYgKG1hcGZpbGUtPmdldEJ1ZmZlclNpemUoKSA8IDggfHwgbWVtY21wKGJhc2UsIEFSRklMRV9NQUdJQywgOCkpIHsKKyAgICBpZiAoZXJyb3IpCisgICAgICAqZXJyb3IgPSAiaW52YWxpZCBzaWduYXR1cmUgZm9yIGFuIGFyY2hpdmUgZmlsZSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGxvYWRzIHRoZSBlbnRpcmUgYXJjaGl2ZSBhbmQgZnVsbHkgcG9wdWxhdGVzIGl0cyBpbGlzdCB3aXRoCisvLyB0aGUgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSBmaWxlLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGluIHByZXBhcmF0aW9uIGZvcgorLy8gZWRpdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFyY2hpdmUuCitib29sCitBcmNoaXZlOjpsb2FkQXJjaGl2ZShzdGQ6OnN0cmluZyogZXJyb3IpIHsKKworICAvLyBTZXQgdXAgcGFyc2luZworICBtZW1iZXJzLmNsZWFyKCk7CisgIHN5bVRhYi5jbGVhcigpOworICBjb25zdCBjaGFyICpBdCA9IGJhc2U7CisgIGNvbnN0IGNoYXIgKkVuZCA9IG1hcGZpbGUtPmdldEJ1ZmZlckVuZCgpOworCisgIGlmICghY2hlY2tTaWduYXR1cmUoZXJyb3IpKQorICAgIHJldHVybiBmYWxzZTsKKworICBBdCArPSA4OyAgLy8gU2tpcCB0aGUgbWFnaWMgc3RyaW5nLgorCisgIGJvb2wgc2VlblN5bWJvbFRhYmxlID0gZmFsc2U7CisgIGJvb2wgZm91bmRGaXJzdEZpbGUgPSBmYWxzZTsKKyAgd2hpbGUgKEF0IDwgRW5kKSB7CisgICAgLy8gcGFyc2UgdGhlIG1lbWJlciBoZWFkZXIKKyAgICBjb25zdCBjaGFyKiBTYXZlID0gQXQ7CisgICAgQXJjaGl2ZU1lbWJlciogbWJyID0gcGFyc2VNZW1iZXJIZWFkZXIoQXQsIEVuZCwgZXJyb3IpOworICAgIGlmICghbWJyKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgZm9yZWlnbiBzeW1ib2wgdGFibGUKKyAgICBpZiAobWJyLT5pc1NWUjRTeW1ib2xUYWJsZSgpIHx8IG1ici0+aXNCU0Q0U3ltYm9sVGFibGUoKSkgeworICAgICAgLy8gV2UganVzdCBzYXZlIHRoaXMgYnV0IGRvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwKKyAgICAgIC8vIHdpdGggaXQuIEl0IGRvZXNuJ3QgY291bnQgYXMgdGhlICJmaXJzdCBmaWxlIi4KKyAgICAgIGlmIChmb3JlaWduU1QpIHsKKyAgICAgICAgLy8gV2hhdD8gTXVsdGlwbGUgZm9yZWlnbiBzeW1ib2wgdGFibGVzPyBKdXN0IGNodWNrIGl0CisgICAgICAgIC8vIGFuZCByZXRhaW4gdGhlIGxhc3Qgb25lIGZvdW5kLgorICAgICAgICBkZWxldGUgZm9yZWlnblNUOworICAgICAgfQorICAgICAgZm9yZWlnblNUID0gbWJyOworICAgICAgQXQgKz0gbWJyLT5nZXRTaXplKCk7CisgICAgICBpZiAoKGludHB0cl90KEF0KSAmIDEpID09IDEpCisgICAgICAgIEF0Kys7CisgICAgfSBlbHNlIGlmIChtYnItPmlzU3RyaW5nVGFibGUoKSkgeworICAgICAgLy8gU2ltcGx5IHN1Y2sgdGhlIGVudGlyZSBzdHJpbmcgdGFibGUgaW50byBhIHN0cmluZworICAgICAgLy8gdmFyaWFibGUuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdldCB0aGUgbmFtZXMgb2YgdGhlCisgICAgICAvLyBtZW1iZXJzIHRoYXQgdXNlIHRoZSAiL2RkZCIgZm9ybWF0IGZvciB0aGVpciBuYW1lcworICAgICAgLy8gKFNWUjQgc3R5bGUgbG9uZyBuYW1lcykuCisgICAgICBzdHJ0YWIuYXNzaWduKEF0LCBtYnItPmdldFNpemUoKSk7CisgICAgICBBdCArPSBtYnItPmdldFNpemUoKTsKKyAgICAgIGlmICgoaW50cHRyX3QoQXQpICYgMSkgPT0gMSkKKyAgICAgICAgQXQrKzsKKyAgICAgIGRlbGV0ZSBtYnI7CisgICAgfSBlbHNlIGlmIChtYnItPmlzTExWTVN5bWJvbFRhYmxlKCkpIHsKKyAgICAgIC8vIFRoaXMgaXMgdGhlIExMVk0gc3ltYm9sIHRhYmxlIGZvciB0aGUgYXJjaGl2ZS4gSWYgd2UndmUgc2VlbiBpdAorICAgICAgLy8gYWxyZWFkeSwgaXRzIGFuIGVycm9yLiBPdGhlcndpc2UsIHBhcnNlIHRoZSBzeW1ib2wgdGFibGUgYW5kIG1vdmUgb24uCisgICAgICBpZiAoc2VlblN5bWJvbFRhYmxlKSB7CisgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICAqZXJyb3IgPSAiaW52YWxpZCBhcmNoaXZlOiBtdWx0aXBsZSBzeW1ib2wgdGFibGVzIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKCFwYXJzZVN5bWJvbFRhYmxlKG1ici0+Z2V0RGF0YSgpLCBtYnItPmdldFNpemUoKSwgZXJyb3IpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBzZWVuU3ltYm9sVGFibGUgPSB0cnVlOworICAgICAgQXQgKz0gbWJyLT5nZXRTaXplKCk7CisgICAgICBpZiAoKGludHB0cl90KEF0KSAmIDEpID09IDEpCisgICAgICAgIEF0Kys7CisgICAgICBkZWxldGUgbWJyOyAvLyBXZSBkb24ndCBuZWVkIHRoaXMgbWVtYmVyIGluIHRoZSBsaXN0IG9mIG1lbWJlcnMuCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoaXMgaXMganVzdCBhIHJlZ3VsYXIgZmlsZS4gSWYgaXRzIHRoZSBmaXJzdCBvbmUsIHNhdmUgaXRzIG9mZnNldC4KKyAgICAgIC8vIE90aGVyd2lzZSBqdXN0IHB1c2ggaXQgb24gdGhlIGxpc3QgYW5kIG1vdmUgb24gdG8gdGhlIG5leHQgZmlsZS4KKyAgICAgIGlmICghZm91bmRGaXJzdEZpbGUpIHsKKyAgICAgICAgZmlyc3RGaWxlT2Zmc2V0ID0gU2F2ZSAtIGJhc2U7CisgICAgICAgIGZvdW5kRmlyc3RGaWxlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIG1lbWJlcnMucHVzaF9iYWNrKG1icik7CisgICAgICBBdCArPSBtYnItPmdldFNpemUoKTsKKyAgICAgIGlmICgoaW50cHRyX3QoQXQpICYgMSkgPT0gMSkKKyAgICAgICAgQXQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIE9wZW4gYW5kIGNvbXBsZXRlbHkgbG9hZCB0aGUgYXJjaGl2ZSBmaWxlLgorQXJjaGl2ZSoKK0FyY2hpdmU6Ok9wZW5BbmRMb2FkKGNvbnN0IHN5czo6UGF0aCYgZmlsZSwgTExWTUNvbnRleHQmIEMsIAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIEVycm9yTWVzc2FnZSkgeworICBzdGQ6OmF1dG9fcHRyPEFyY2hpdmU+IHJlc3VsdCAoIG5ldyBBcmNoaXZlKGZpbGUsIEMpKTsKKyAgaWYgKHJlc3VsdC0+bWFwVG9NZW1vcnkoRXJyb3JNZXNzYWdlKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFyZXN1bHQtPmxvYWRBcmNoaXZlKEVycm9yTWVzc2FnZSkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOworfQorCisvLyBHZXQgYWxsIHRoZSBiaXRjb2RlIG1vZHVsZXMgZnJvbSB0aGUgYXJjaGl2ZQorYm9vbAorQXJjaGl2ZTo6Z2V0QWxsTW9kdWxlcyhzdGQ6OnZlY3RvcjxNb2R1bGUqPiYgTW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIEVyck1lc3NhZ2UpIHsKKworICBmb3IgKGl0ZXJhdG9yIEk9YmVnaW4oKSwgRT1lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aXNCaXRjb2RlKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIEZ1bGxNZW1iZXJOYW1lID0gYXJjaFBhdGguc3RyKCkgKworICAgICAgICAiKCIgKyBJLT5nZXRQYXRoKCkuc3RyKCkgKyAiKSI7CisgICAgICBNZW1vcnlCdWZmZXIgKkJ1ZmZlciA9CisgICAgICAgIE1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyQ29weShTdHJpbmdSZWYoSS0+Z2V0RGF0YSgpLCBJLT5nZXRTaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVsbE1lbWJlck5hbWUuY19zdHIoKSk7CisgICAgICAKKyAgICAgIE1vZHVsZSAqTSA9IFBhcnNlQml0Y29kZUZpbGUoQnVmZmVyLCBDb250ZXh0LCBFcnJNZXNzYWdlKTsKKyAgICAgIGRlbGV0ZSBCdWZmZXI7CisgICAgICBpZiAoIU0pCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBNb2R1bGVzLnB1c2hfYmFjayhNKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBMb2FkIGp1c3QgdGhlIHN5bWJvbCB0YWJsZSBmcm9tIHRoZSBhcmNoaXZlIGZpbGUKK2Jvb2wKK0FyY2hpdmU6OmxvYWRTeW1ib2xUYWJsZShzdGQ6OnN0cmluZyogRXJyb3JNc2cpIHsKKworICAvLyBTZXQgdXAgcGFyc2luZworICBtZW1iZXJzLmNsZWFyKCk7CisgIHN5bVRhYi5jbGVhcigpOworICBjb25zdCBjaGFyICpBdCA9IGJhc2U7CisgIGNvbnN0IGNoYXIgKkVuZCA9IG1hcGZpbGUtPmdldEJ1ZmZlckVuZCgpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBkZWFsaW5nIHdpdGggYW4gYXJjaGl2ZQorICBpZiAoIWNoZWNrU2lnbmF0dXJlKEVycm9yTXNnKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQXQgKz0gODsgLy8gU2tpcCBzaWduYXR1cmUKKworICAvLyBQYXJzZSB0aGUgZmlyc3QgZmlsZSBtZW1iZXIgaGVhZGVyCisgIGNvbnN0IGNoYXIqIEZpcnN0RmlsZSA9IEF0OworICBBcmNoaXZlTWVtYmVyKiBtYnIgPSBwYXJzZU1lbWJlckhlYWRlcihBdCwgRW5kLCBFcnJvck1zZyk7CisgIGlmICghbWJyKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobWJyLT5pc1NWUjRTeW1ib2xUYWJsZSgpIHx8IG1ici0+aXNCU0Q0U3ltYm9sVGFibGUoKSkgeworICAgIC8vIFNraXAgdGhlIGZvcmVpZ24gc3ltYm9sIHRhYmxlLCB3ZSBkb24ndCBkbyBhbnl0aGluZyB3aXRoIGl0CisgICAgQXQgKz0gbWJyLT5nZXRTaXplKCk7CisgICAgaWYgKChpbnRwdHJfdChBdCkgJiAxKSA9PSAxKQorICAgICAgQXQrKzsKKyAgICBkZWxldGUgbWJyOworCisgICAgLy8gUmVhZCB0aGUgbmV4dCBvbmUKKyAgICBGaXJzdEZpbGUgPSBBdDsKKyAgICBtYnIgPSBwYXJzZU1lbWJlckhlYWRlcihBdCwgRW5kLCBFcnJvck1zZyk7CisgICAgaWYgKCFtYnIpIHsKKyAgICAgIGRlbGV0ZSBtYnI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKG1ici0+aXNTdHJpbmdUYWJsZSgpKSB7CisgICAgLy8gUHJvY2VzcyB0aGUgc3RyaW5nIHRhYmxlIGVudHJ5CisgICAgc3RydGFiLmFzc2lnbigoY29uc3QgY2hhciopbWJyLT5nZXREYXRhKCksIG1ici0+Z2V0U2l6ZSgpKTsKKyAgICBBdCArPSBtYnItPmdldFNpemUoKTsKKyAgICBpZiAoKGludHB0cl90KEF0KSAmIDEpID09IDEpCisgICAgICBBdCsrOworICAgIGRlbGV0ZSBtYnI7CisgICAgLy8gR2V0IHRoZSBuZXh0IG9uZQorICAgIEZpcnN0RmlsZSA9IEF0OworICAgIG1iciA9IHBhcnNlTWVtYmVySGVhZGVyKEF0LCBFbmQsIEVycm9yTXNnKTsKKyAgICBpZiAoIW1icikgeworICAgICAgZGVsZXRlIG1icjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBTZWUgaWYgaXRzIHRoZSBzeW1ib2wgdGFibGUKKyAgaWYgKG1ici0+aXNMTFZNU3ltYm9sVGFibGUoKSkgeworICAgIGlmICghcGFyc2VTeW1ib2xUYWJsZShtYnItPmdldERhdGEoKSwgbWJyLT5nZXRTaXplKCksIEVycm9yTXNnKSkgeworICAgICAgZGVsZXRlIG1icjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBdCArPSBtYnItPmdldFNpemUoKTsKKyAgICBpZiAoKGludHB0cl90KEF0KSAmIDEpID09IDEpCisgICAgICBBdCsrOworICAgIGRlbGV0ZSBtYnI7CisgICAgLy8gQ2FuJ3QgYmUgYW55IG1vcmUgc3ltdGFiIGhlYWRlcnMgc28ganVzdCBhZHZhbmNlCisgICAgRmlyc3RGaWxlID0gQXQ7CisgIH0gZWxzZSB7CisgICAgLy8gVGhlcmUncyBubyBzeW1ib2wgdGFibGUgaW4gdGhlIGZpbGUuIFdlIGhhdmUgdG8gcmVidWlsZCBpdCBmcm9tIHNjcmF0Y2gKKyAgICAvLyBiZWNhdXNlIHRoZSBpbnRlbnQgb2YgdGhpcyBtZXRob2QgaXMgdG8gZ2V0IHRoZSBzeW1ib2wgdGFibGUgbG9hZGVkIHNvCisgICAgLy8gaXQgY2FuIGJlIHNlYXJjaGVkIGVmZmljaWVudGx5LgorICAgIC8vIEFkZCB0aGUgbWVtYmVyIHRvIHRoZSBtZW1iZXJzIGxpc3QKKyAgICBtZW1iZXJzLnB1c2hfYmFjayhtYnIpOworICB9CisKKyAgZmlyc3RGaWxlT2Zmc2V0ID0gRmlyc3RGaWxlIC0gYmFzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIE9wZW4gdGhlIGFyY2hpdmUgYW5kIGxvYWQganVzdCB0aGUgc3ltYm9sIHRhYmxlcworQXJjaGl2ZSogQXJjaGl2ZTo6T3BlbkFuZExvYWRTeW1ib2xzKGNvbnN0IHN5czo6UGF0aCYgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCYgQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogRXJyb3JNZXNzYWdlKSB7CisgIHN0ZDo6YXV0b19wdHI8QXJjaGl2ZT4gcmVzdWx0ICggbmV3IEFyY2hpdmUoZmlsZSwgQykgKTsKKyAgaWYgKHJlc3VsdC0+bWFwVG9NZW1vcnkoRXJyb3JNZXNzYWdlKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFyZXN1bHQtPmxvYWRTeW1ib2xUYWJsZShFcnJvck1lc3NhZ2UpKQorICAgIHJldHVybiAwOworICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsKK30KKworLy8gTG9vayB1cCBvbmUgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIHJldHVybiB0aGUgbW9kdWxlIHRoYXQgZGVmaW5lcworLy8gdGhhdCBzeW1ib2wuCitNb2R1bGUqCitBcmNoaXZlOjpmaW5kTW9kdWxlRGVmaW5pbmdTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIEVyck1zZykgeworICBTeW1UYWJUeXBlOjppdGVyYXRvciBTSSA9IHN5bVRhYi5maW5kKHN5bWJvbCk7CisgIGlmIChTSSA9PSBzeW1UYWIuZW5kKCkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gVGhlIHN5bWJvbCB0YWJsZSB3YXMgcHJldmlvdXNseSBjb25zdHJ1Y3RlZCBhc3N1bWluZyB0aGF0IHRoZSBtZW1iZXJzIHdlcmUKKyAgLy8gd3JpdHRlbiB3aXRob3V0IHRoZSBzeW1ib2wgdGFibGUgaGVhZGVyLiBCZWNhdXNlIFZCUiBlbmNvZGluZyBpcyB1c2VkLCB0aGUKKyAgLy8gdmFsdWVzIGNvdWxkIG5vdCBiZSBhZGp1c3RlZCB0byBhY2NvdW50IGZvciB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wgdGFibGUKKyAgLy8gYmVjYXVzZSB0aGF0IGNvdWxkIGFmZmVjdCB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGR1ZSB0byBWQlIgZW5jb2RpbmcuCisgIC8vIFdlIG5vdyBoYXZlIHRvIGFjY291bnQgZm9yIHRoaXMgYnkgYWRqdXN0aW5nIHRoZSBvZmZzZXQgYnkgdGhlIHNpemUgb2YgdGhlCisgIC8vIHN5bWJvbCB0YWJsZSBhbmQgaXRzIGhlYWRlci4KKyAgdW5zaWduZWQgZmlsZU9mZnNldCA9CisgICAgU0ktPnNlY29uZCArICAgICAgICAgICAgICAgIC8vIG9mZnNldCBpbiBzeW1ib2wtdGFibGUtbGVzcyBmaWxlCisgICAgZmlyc3RGaWxlT2Zmc2V0OyAgICAgICAgICAgIC8vIGFkZCBvZmZzZXQgdG8gZmlyc3QgInJlYWwiIGZpbGUgaW4gYXJjaGl2ZQorCisgIC8vIFNlZSBpZiB0aGUgbW9kdWxlIGlzIGFscmVhZHkgbG9hZGVkCisgIE1vZHVsZU1hcDo6aXRlcmF0b3IgTUkgPSBtb2R1bGVzLmZpbmQoZmlsZU9mZnNldCk7CisgIGlmIChNSSAhPSBtb2R1bGVzLmVuZCgpKQorICAgIHJldHVybiBNSS0+c2Vjb25kLmZpcnN0OworCisgIC8vIE1vZHVsZSBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0LCB3ZSBuZWVkIHRvIGxvYWQgaXQKKyAgY29uc3QgY2hhciogbW9kcHRyID0gYmFzZSArIGZpbGVPZmZzZXQ7CisgIEFyY2hpdmVNZW1iZXIqIG1iciA9IHBhcnNlTWVtYmVySGVhZGVyKG1vZHB0ciwgbWFwZmlsZS0+Z2V0QnVmZmVyRW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVyck1zZyk7CisgIGlmICghbWJyKQorICAgIHJldHVybiAwOworCisgIC8vIE5vdywgbG9hZCB0aGUgYml0Y29kZSBtb2R1bGUgdG8gZ2V0IHRoZSBNb2R1bGUuCisgIHN0ZDo6c3RyaW5nIEZ1bGxNZW1iZXJOYW1lID0gYXJjaFBhdGguc3RyKCkgKyAiKCIgKworICAgIG1ici0+Z2V0UGF0aCgpLnN0cigpICsgIikiOworICBNZW1vcnlCdWZmZXIgKkJ1ZmZlciA9CisgICAgTWVtb3J5QnVmZmVyOjpnZXRNZW1CdWZmZXJDb3B5KFN0cmluZ1JlZihtYnItPmdldERhdGEoKSwgbWJyLT5nZXRTaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdWxsTWVtYmVyTmFtZS5jX3N0cigpKTsKKyAgCisgIE1vZHVsZSAqbSA9IGdldExhenlCaXRjb2RlTW9kdWxlKEJ1ZmZlciwgQ29udGV4dCwgRXJyTXNnKTsKKyAgaWYgKCFtKQorICAgIHJldHVybiAwOworCisgIG1vZHVsZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGZpbGVPZmZzZXQsIHN0ZDo6bWFrZV9wYWlyKG0sIG1icikpKTsKKworICByZXR1cm4gbTsKK30KKworLy8gTG9vayB1cCBtdWx0aXBsZSBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIHJldHVybiBhIHNldCBvZgorLy8gTW9kdWxlcyB0aGF0IGRlZmluZSB0aG9zZSBzeW1ib2xzLgorYm9vbAorQXJjaGl2ZTo6ZmluZE1vZHVsZXNEZWZpbmluZ1N5bWJvbHMoc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBzeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8TW9kdWxlKj4mIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworICBpZiAoIW1hcGZpbGUgfHwgIWJhc2UpIHsKKyAgICBpZiAoZXJyb3IpCisgICAgICAqZXJyb3IgPSAiRW1wdHkgYXJjaGl2ZSBpbnZhbGlkIGZvciBmaW5kaW5nIG1vZHVsZXMgZGVmaW5pbmcgc3ltYm9scyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHN5bVRhYi5lbXB0eSgpKSB7CisgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIHN5bWJvbCB0YWJsZSwgc28gd2UgbXVzdCBidWlsZCBpdCBub3cgYnV0IGxldHMgYWxzbworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIHBvcHVsYXRlIHRoZSBtb2R1bGVzIHRhYmxlIGFzIHdlIGRvIHRoaXMgdG8gZW5zdXJlCisgICAgLy8gdGhhdCB3ZSBkb24ndCBsb2FkIHRoZW0gdHdpY2Ugd2hlbiBmaW5kTW9kdWxlRGVmaW5pbmdTeW1ib2wgaXMgY2FsbGVkCisgICAgLy8gYmVsb3cuCisKKyAgICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBmaWxlCisgICAgY29uc3QgY2hhciogQXQgID0gYmFzZSArIGZpcnN0RmlsZU9mZnNldDsKKyAgICBjb25zdCBjaGFyKiBFbmQgPSBtYXBmaWxlLT5nZXRCdWZmZXJFbmQoKTsKKworICAgIHdoaWxlICggQXQgPCBFbmQpIHsKKyAgICAgIC8vIENvbXB1dGUgdGhlIG9mZnNldCB0byBiZSBwdXQgaW4gdGhlIHN5bWJvbCB0YWJsZQorICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gQXQgLSBiYXNlIC0gZmlyc3RGaWxlT2Zmc2V0OworCisgICAgICAvLyBQYXJzZSB0aGUgZmlsZSdzIGhlYWRlcgorICAgICAgQXJjaGl2ZU1lbWJlciogbWJyID0gcGFyc2VNZW1iZXJIZWFkZXIoQXQsIEVuZCwgZXJyb3IpOworICAgICAgaWYgKCFtYnIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gSWYgaXQgY29udGFpbnMgc3ltYm9scworICAgICAgaWYgKG1ici0+aXNCaXRjb2RlKCkpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBzeW1ib2xzCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzeW1ib2xzOworICAgICAgICBzdGQ6OnN0cmluZyBGdWxsTWVtYmVyTmFtZSA9IGFyY2hQYXRoLnN0cigpICsgIigiICsKKyAgICAgICAgICBtYnItPmdldFBhdGgoKS5zdHIoKSArICIpIjsKKyAgICAgICAgTW9kdWxlKiBNID0gCisgICAgICAgICAgR2V0Qml0Y29kZVN5bWJvbHMoQXQsIG1ici0+Z2V0U2l6ZSgpLCBGdWxsTWVtYmVyTmFtZSwgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzLCBlcnJvcik7CisKKyAgICAgICAgaWYgKE0pIHsKKyAgICAgICAgICAvLyBJbnNlcnQgdGhlIG1vZHVsZSdzIHN5bWJvbHMgaW50byB0aGUgc3ltYm9sIHRhYmxlCisgICAgICAgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIEkgPSBzeW1ib2xzLmJlZ2luKCksCisgICAgICAgICAgICAgICBFPXN5bWJvbHMuZW5kKCk7IEkgIT0gRTsgKytJICkgeworICAgICAgICAgICAgc3ltVGFiLmluc2VydChzdGQ6Om1ha2VfcGFpcigqSSwgb2Zmc2V0KSk7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEluc2VydCB0aGUgTW9kdWxlIGFuZCB0aGUgQXJjaGl2ZU1lbWJlciBpbnRvIHRoZSB0YWJsZSBvZgorICAgICAgICAgIC8vIG1vZHVsZXMuCisgICAgICAgICAgbW9kdWxlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIob2Zmc2V0LCBzdGQ6Om1ha2VfcGFpcihNLCBtYnIpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgKmVycm9yID0gIkNhbid0IHBhcnNlIGJpdGNvZGUgbWVtYmVyOiAiICsgCisgICAgICAgICAgICAgIG1ici0+Z2V0UGF0aCgpLnN0cigpICsgIjogIiArICplcnJvcjsKKyAgICAgICAgICBkZWxldGUgbWJyOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBHbyB0byB0aGUgbmV4dCBmaWxlIGxvY2F0aW9uCisgICAgICBBdCArPSBtYnItPmdldFNpemUoKTsKKyAgICAgIGlmICgoaW50cHRyX3QoQXQpICYgMSkgPT0gMSkKKyAgICAgICAgQXQrKzsKKyAgICB9CisgIH0KKworICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSB2YWxpZCBzeW1ib2wgdGFibGUgKG9uZSB3YXkgb3IgYW5vdGhlcikgc28gd2UKKyAgLy8ganVzdCB1c2UgaXQgdG8gcXVpY2tseSBmaW5kIHRoZSBzeW1ib2xzIHJlcXVlc3RlZC4KKworICBmb3IgKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgST1zeW1ib2xzLmJlZ2luKCksCisgICAgICAgRT1zeW1ib2xzLmVuZCgpOyBJICE9IEU7KSB7CisgICAgLy8gU2VlIGlmIHRoaXMgc3ltYm9sIGV4aXN0cworICAgIE1vZHVsZSogbSA9IGZpbmRNb2R1bGVEZWZpbmluZ1N5bWJvbCgqSSxlcnJvcik7CisgICAgaWYgKG0pIHsKKyAgICAgIC8vIFRoZSBzeW1ib2wgZXhpc3RzLCBpbnNlcnQgdGhlIE1vZHVsZSBpbnRvIG91ciByZXN1bHQsIGR1cGxpY2F0ZXMgd2lsbAorICAgICAgLy8gYmUgaWdub3JlZC4KKyAgICAgIHJlc3VsdC5pbnNlcnQobSk7CisKKyAgICAgIC8vIFJlbW92ZSB0aGUgc3ltYm9sIG5vdyB0aGF0IGl0cyBiZWVuIHJlc29sdmVkLCBiZWluZyBjYXJlZnVsIHRvCisgICAgICAvLyBwb3N0LWluY3JlbWVudCB0aGUgaXRlcmF0b3IuCisgICAgICBzeW1ib2xzLmVyYXNlKEkrKyk7CisgICAgfSBlbHNlIHsKKyAgICAgICsrSTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQXJjaGl2ZTo6aXNCaXRjb2RlQXJjaGl2ZSgpIHsKKyAgLy8gTWFrZSBzdXJlIHRoZSBzeW1UYWIgaGFzIGJlZW4gbG9hZGVkLiBJbiBtb3N0IGNhc2VzIHRoaXMgc2hvdWxkIGhhdmUgYmVlbgorICAvLyBkb25lIHdoZW4gdGhlIGFyY2hpdmUgd2FzIGNvbnN0cnVjdGVkLCBidXQgc3RpbGwsICB0aGlzIGlzIGp1c3QgaW4gY2FzZS4KKyAgaWYgKHN5bVRhYi5lbXB0eSgpKQorICAgIGlmICghbG9hZFN5bWJvbFRhYmxlKDApKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE5vdyB0aGF0IHdlIGtub3cgaXQncyBiZWVuIGxvYWRlZCwgcmV0dXJuIHRydWUKKyAgLy8gaWYgaXQgaGFzIGEgc2l6ZQorICBpZiAoc3ltVGFiLnNpemUoKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gV2Ugc3RpbGwgY2FuJ3QgYmUgc3VyZSBpdCBpc24ndCBhIGJpdGNvZGUgYXJjaGl2ZQorICBpZiAoIWxvYWRBcmNoaXZlKDApKQorICAgIHJldHVybiBmYWxzZTsKKworICBzdGQ6OnZlY3RvcjxNb2R1bGUgKj4gTW9kdWxlczsKKyAgc3RkOjpzdHJpbmcgRXJyb3JNZXNzYWdlOworCisgIC8vIFNjYW4gdGhlIGFyY2hpdmUsIHRyeWluZyB0byBsb2FkIGEgYml0Y29kZSBtZW1iZXIuICBXZSBvbmx5IGxvYWQgb25lIHRvCisgIC8vIHNlZSBpZiB0aGlzIHdvcmtzLgorICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKCFJLT5pc0JpdGNvZGUoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIHN0ZDo6c3RyaW5nIEZ1bGxNZW1iZXJOYW1lID0gCisgICAgICBhcmNoUGF0aC5zdHIoKSArICIoIiArIEktPmdldFBhdGgoKS5zdHIoKSArICIpIjsKKworICAgIE1lbW9yeUJ1ZmZlciAqQnVmZmVyID0KKyAgICAgIE1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyQ29weShTdHJpbmdSZWYoSS0+Z2V0RGF0YSgpLCBJLT5nZXRTaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGxNZW1iZXJOYW1lLmNfc3RyKCkpOworICAgIE1vZHVsZSAqTSA9IFBhcnNlQml0Y29kZUZpbGUoQnVmZmVyLCBDb250ZXh0KTsKKyAgICBkZWxldGUgQnVmZmVyOworICAgIGlmICghTSkKKyAgICAgIHJldHVybiBmYWxzZTsgIC8vIENvdWxkbid0IHBhcnNlIGJpdGNvZGUsIG5vdCBhIGJpdGNvZGUgYXJjaGl2ZS4KKyAgICBkZWxldGUgTTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FyY2hpdmUvQXJjaGl2ZVdyaXRlci5jcHAgYi9zcmMvTExWTS9saWIvQXJjaGl2ZS9BcmNoaXZlV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWVlYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FyY2hpdmUvQXJjaGl2ZVdyaXRlci5jcHAKQEAgLTAsMCArMSw0NzYgQEAKKy8vPT09LS0gQXJjaGl2ZVdyaXRlci5jcHAgLSBXcml0ZSBMTFZNIGFyY2hpdmUgZmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQnVpbGRzIHVwIGFuIExMVk0gYXJjaGl2ZSBmaWxlICguYSkgY29udGFpbmluZyBMTFZNIGJpdGNvZGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkFyY2hpdmVJbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorI2luY2x1ZGUgImxsdm0vQml0Y29kZS9SZWFkZXJXcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUHJvY2Vzcy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1NpZ25hbHMuaCIKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBXcml0ZSBhbiBpbnRlZ2VyIHVzaW5nIHZhcmlhYmxlIGJpdCByYXRlIGVuY29kaW5nLiBUaGlzIHNhdmVzIGEgZmV3IGJ5dGVzCisvLyBwZXIgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZS4KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZUludGVnZXIodW5zaWduZWQgbnVtLCBzdGQ6Om9mc3RyZWFtJiBBUkZpbGUpIHsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAobnVtIDwgMHg4MCkgeyAvLyBkb25lPworICAgICAgQVJGaWxlIDw8ICh1bnNpZ25lZCBjaGFyKW51bTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOb3BlLCB3ZSBhcmUgYmlnZ2VyIHRoYW4gYSBjaGFyYWN0ZXIsIG91dHB1dCB0aGUgbmV4dCA3IGJpdHMgYW5kIHNldCB0aGUKKyAgICAvLyBoaWdoIGJpdCB0byBzYXkgdGhhdCB0aGVyZSBpcyBtb3JlIGNvbWluZy4uLgorICAgIEFSRmlsZSA8PCAodW5zaWduZWQgY2hhcikoMHg4MCB8ICgodW5zaWduZWQgY2hhciludW0gJiAweDdGKSk7CisgICAgbnVtID4+PSA3OyAgLy8gU2hpZnQgb3V0IDcgYml0cyBub3cuLi4KKyAgfQorfQorCisvLyBDb21wdXRlIGhvdyBtYW55IGJ5dGVzIGFyZSB0YWtlbiBieSBhIGdpdmVuIFZCUiBlbmNvZGVkIHZhbHVlLiBUaGlzIGlzIG5lZWRlZAorLy8gdG8gcHJlLWNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbnVtVmJyQnl0ZXModW5zaWduZWQgbnVtKSB7CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgbmVzdGVkIGlmcyBhcmUgc29tZXdoYXQgZXF1aXZhbGVudCB0byBhIGJpbmFyeQorICAvLyBzZWFyY2guIFdlIHNwbGl0IGl0IGluIGhhbGYgYnkgY29tcGFyaW5nIGFnYWluc3QgMl4xNCBmaXJzdC4gVGhpcyBhbGxvd3MKKyAgLy8gbW9zdCByZWFzb25hYmxlIHZhbHVlcyB0byBiZSBkb25lIGluIDIgY29tcGFyaXNvbnMgaW5zdGVhZCBvZiAxIGZvcgorICAvLyBzbWFsbCBvbmVzIGFuZCBmb3VyIGZvciBsYXJnZSBvbmVzLiBXZSBleHBlY3QgdGhpcyB0byBhY2Nlc3MgZmlsZSBvZmZzZXRzCisgIC8vIGluIHRoZSAyXjEwIHRvIDJeMjQgcmFuZ2UgYW5kIHN5bWJvbCBsZW5ndGhzIGluIHRoZSAyXjAgdG8gMl44IHJhbmdlLAorICAvLyBzbyB0aGlzIGFwcHJvYWNoIGlzIHJlYXNvbmFibGUuCisgIGlmIChudW0gPCAxPDwxNCkgeworICAgIGlmIChudW0gPCAxPDw3KQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYgKG51bSA8IDE8PDIxKQorICAgIHJldHVybiAzOworCisgIGlmIChudW0gPCAxPDwyOCkKKyAgICByZXR1cm4gNDsKKyAgcmV0dXJuIDU7IC8vIGFueXRoaW5nID49IDJeMjggdGFrZXMgNSBieXRlcworfQorCisvLyBDcmVhdGUgYW4gZW1wdHkgYXJjaGl2ZS4KK0FyY2hpdmUqIEFyY2hpdmU6OkNyZWF0ZUVtcHR5KGNvbnN0IHN5czo6UGF0aCYgRmlsZVBhdGgsIExMVk1Db250ZXh0JiBDKSB7CisgIEFyY2hpdmUqIHJlc3VsdCA9IG5ldyBBcmNoaXZlKEZpbGVQYXRoLCBDKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gRmlsbCB0aGUgQXJjaGl2ZU1lbWJlckhlYWRlciB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmcm9tIGEgbWVtYmVyLiBJZgorLy8gVHJ1bmNhdGVOYW1lcyBpcyB0cnVlLCBuYW1lcyBhcmUgZmxhdHRlbmVkIHRvIDE1IGNoYXJzIG9yIGxlc3MuIFRoZSBzeiBmaWVsZAorLy8gaXMgcHJvdmlkZWQgaGVyZSBpbnN0ZWFkIG9mIGNvbWluZyBmcm9tIHRoZSBtYnIgYmVjYXVzZSB0aGUgbWVtYmVyIG1pZ2h0IGJlCisvLyBzdG9yZWQgY29tcHJlc3NlZCBhbmQgdGhlIGNvbXByZXNzZWQgc2l6ZSBpcyBub3QgdGhlIEFyY2hpdmVNZW1iZXIncyBzaXplLgorLy8gRnVydGhlcm1vcmUgY29tcHJlc3NlZCBmaWxlcyBoYXZlIG5lZ2F0aXZlIHNpemUgZmllbGRzIHRvIGlkZW50aWZ5IHRoZW0gYXMKKy8vIGNvbXByZXNzZWQuCitib29sCitBcmNoaXZlOjpmaWxsSGVhZGVyKGNvbnN0IEFyY2hpdmVNZW1iZXIgJm1iciwgQXJjaGl2ZU1lbWJlckhlYWRlciYgaGRyLAorICAgICAgICAgICAgICAgICAgICBpbnQgc3osIGJvb2wgVHJ1bmNhdGVOYW1lcykgY29uc3QgeworCisgIC8vIFNldCB0aGUgcGVybWlzc2lvbnMgbW9kZSwgdWlkIGFuZCBnaWQKKyAgaGRyLmluaXQoKTsKKyAgY2hhciBidWZmZXJbMzJdOworICBzcHJpbnRmKGJ1ZmZlciwgIiUtOG8iLCBtYnIuZ2V0TW9kZSgpKTsKKyAgbWVtY3B5KGhkci5tb2RlLGJ1ZmZlciw4KTsKKyAgc3ByaW50ZihidWZmZXIsICAiJS02dSIsIG1ici5nZXRVc2VyKCkpOworICBtZW1jcHkoaGRyLnVpZCxidWZmZXIsNik7CisgIHNwcmludGYoYnVmZmVyLCAgIiUtNnUiLCBtYnIuZ2V0R3JvdXAoKSk7CisgIG1lbWNweShoZHIuZ2lkLGJ1ZmZlciw2KTsKKworICAvLyBTZXQgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUKKyAgdWludDY0X3Qgc2Vjb25kc1NpbmNlRXBvY2ggPSBtYnIuZ2V0TW9kVGltZSgpLnRvRXBvY2hUaW1lKCk7CisgIHNwcmludGYoYnVmZmVyLCIlLTEydSIsIHVuc2lnbmVkKHNlY29uZHNTaW5jZUVwb2NoKSk7CisgIG1lbWNweShoZHIuZGF0ZSxidWZmZXIsMTIpOworCisgIC8vIEdldCByaWQgb2YgdHJhaWxpbmcgYmxhbmtzIGluIHRoZSBuYW1lCisgIHN0ZDo6c3RyaW5nIG1iclBhdGggPSBtYnIuZ2V0UGF0aCgpLnN0cigpOworICBzaXplX3QgbWJyTGVuID0gbWJyUGF0aC5sZW5ndGgoKTsKKyAgd2hpbGUgKG1ickxlbiA+IDAgJiYgbWJyUGF0aFttYnJMZW4tMV0gPT0gJyAnKSB7CisgICAgbWJyUGF0aC5lcmFzZShtYnJMZW4tMSwxKTsKKyAgICBtYnJMZW4tLTsKKyAgfQorCisgIC8vIFNldCB0aGUgbmFtZSBmaWVsZCBpbiBvbmUgb2YgaXRzIHZhcmlvdXMgZmxhdm9ycy4KKyAgYm9vbCB3cml0ZUxvbmdOYW1lID0gZmFsc2U7CisgIGlmIChtYnIuaXNTdHJpbmdUYWJsZSgpKSB7CisgICAgbWVtY3B5KGhkci5uYW1lLEFSRklMRV9TVFJUQUJfTkFNRSwxNik7CisgIH0gZWxzZSBpZiAobWJyLmlzU1ZSNFN5bWJvbFRhYmxlKCkpIHsKKyAgICBtZW1jcHkoaGRyLm5hbWUsQVJGSUxFX1NWUjRfU1lNVEFCX05BTUUsMTYpOworICB9IGVsc2UgaWYgKG1ici5pc0JTRDRTeW1ib2xUYWJsZSgpKSB7CisgICAgbWVtY3B5KGhkci5uYW1lLEFSRklMRV9CU0Q0X1NZTVRBQl9OQU1FLDE2KTsKKyAgfSBlbHNlIGlmIChtYnIuaXNMTFZNU3ltYm9sVGFibGUoKSkgeworICAgIG1lbWNweShoZHIubmFtZSxBUkZJTEVfTExWTV9TWU1UQUJfTkFNRSwxNik7CisgIH0gZWxzZSBpZiAoVHJ1bmNhdGVOYW1lcykgeworICAgIGNvbnN0IGNoYXIqIG5tID0gbWJyUGF0aC5jX3N0cigpOworICAgIHVuc2lnbmVkIGxlbiA9IG1iclBhdGgubGVuZ3RoKCk7CisgICAgc2l6ZV90IHNsYXNocG9zID0gbWJyUGF0aC5yZmluZCgnLycpOworICAgIGlmIChzbGFzaHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgbm0gKz0gc2xhc2hwb3MgKyAxOworICAgICAgbGVuIC09IHNsYXNocG9zICsxOworICAgIH0KKyAgICBpZiAobGVuID4gMTUpCisgICAgICBsZW4gPSAxNTsKKyAgICBtZW1jcHkoaGRyLm5hbWUsbm0sbGVuKTsKKyAgICBoZHIubmFtZVtsZW5dID0gJy8nOworICB9IGVsc2UgaWYgKG1iclBhdGgubGVuZ3RoKCkgPCAxNiAmJiBtYnJQYXRoLmZpbmQoJy8nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIG1lbWNweShoZHIubmFtZSxtYnJQYXRoLmNfc3RyKCksbWJyUGF0aC5sZW5ndGgoKSk7CisgICAgaGRyLm5hbWVbbWJyUGF0aC5sZW5ndGgoKV0gPSAnLyc7CisgIH0gZWxzZSB7CisgICAgc3RkOjpzdHJpbmcgbm0gPSAiIzEvIjsKKyAgICBubSArPSB1dG9zdHIobWJyUGF0aC5sZW5ndGgoKSk7CisgICAgbWVtY3B5KGhkci5uYW1lLG5tLmRhdGEoKSxubS5sZW5ndGgoKSk7CisgICAgaWYgKHN6IDwgMCkKKyAgICAgIHN6IC09IG1iclBhdGgubGVuZ3RoKCk7CisgICAgZWxzZQorICAgICAgc3ogKz0gbWJyUGF0aC5sZW5ndGgoKTsKKyAgICB3cml0ZUxvbmdOYW1lID0gdHJ1ZTsKKyAgfQorCisgIC8vIFNldCB0aGUgc2l6ZSBmaWVsZAorICBpZiAoc3ogPCAwKSB7CisgICAgYnVmZmVyWzBdID0gJy0nOworICAgIHNwcmludGYoJmJ1ZmZlclsxXSwiJS05dSIsKHVuc2lnbmVkKS1zeik7CisgIH0gZWxzZSB7CisgICAgc3ByaW50ZihidWZmZXIsICIlLTEwdSIsICh1bnNpZ25lZClzeik7CisgIH0KKyAgbWVtY3B5KGhkci5zaXplLGJ1ZmZlciwxMCk7CisKKyAgcmV0dXJuIHdyaXRlTG9uZ05hbWU7Cit9CisKKy8vIEluc2VydCBhIGZpbGUgaW50byB0aGUgYXJjaGl2ZSBiZWZvcmUgc29tZSBvdGhlciBtZW1iZXIuIFRoaXMgYWxzbyB0YWtlcyBjYXJlCisvLyBvZiBleHRyYWN0aW5nIHRoZSBuZWNlc3NhcnkgZmxhZ3MgYW5kIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGUuCitib29sCitBcmNoaXZlOjphZGRGaWxlQmVmb3JlKGNvbnN0IHN5czo6UGF0aCYgZmlsZVBhdGgsIGl0ZXJhdG9yIHdoZXJlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBFcnJNc2cpIHsKKyAgaWYgKCFmaWxlUGF0aC5leGlzdHMoKSkgeworICAgIGlmIChFcnJNc2cpCisgICAgICAqRXJyTXNnID0gIkNhbiBub3QgYWRkIGEgbm9uLWV4aXN0ZW50IGZpbGUgdG8gYXJjaGl2ZSI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBBcmNoaXZlTWVtYmVyKiBtYnIgPSBuZXcgQXJjaGl2ZU1lbWJlcih0aGlzKTsKKworICBtYnItPmRhdGEgPSAwOworICBtYnItPnBhdGggPSBmaWxlUGF0aDsKKyAgY29uc3Qgc3lzOjpGaWxlU3RhdHVzICpGU0luZm8gPSBtYnItPnBhdGguZ2V0RmlsZVN0YXR1cyhmYWxzZSwgRXJyTXNnKTsKKyAgaWYgKCFGU0luZm8pIHsKKyAgICBkZWxldGUgbWJyOworICAgIHJldHVybiB0cnVlOworICB9CisgIG1ici0+aW5mbyA9ICpGU0luZm87CisKKyAgdW5zaWduZWQgZmxhZ3MgPSAwOworICBib29sIGhhc1NsYXNoID0gZmlsZVBhdGguc3RyKCkuZmluZCgnLycpICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICBpZiAoaGFzU2xhc2gpCisgICAgZmxhZ3MgfD0gQXJjaGl2ZU1lbWJlcjo6SGFzUGF0aEZsYWc7CisgIGlmIChoYXNTbGFzaCB8fCBmaWxlUGF0aC5zdHIoKS5sZW5ndGgoKSA+IDE1KQorICAgIGZsYWdzIHw9IEFyY2hpdmVNZW1iZXI6Okhhc0xvbmdGaWxlbmFtZUZsYWc7CisgIHN0ZDo6c3RyaW5nIG1hZ2ljOworICBtYnItPnBhdGguZ2V0TWFnaWNOdW1iZXIobWFnaWMsNCk7CisgIHN3aXRjaCAoc3lzOjpJZGVudGlmeUZpbGVUeXBlKG1hZ2ljLmNfc3RyKCksNCkpIHsKKyAgICBjYXNlIHN5czo6Qml0Y29kZV9GaWxlVHlwZToKKyAgICAgIGZsYWdzIHw9IEFyY2hpdmVNZW1iZXI6OkJpdGNvZGVGbGFnOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIG1ici0+ZmxhZ3MgPSBmbGFnczsKKyAgbWVtYmVycy5pbnNlcnQod2hlcmUsbWJyKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBXcml0ZSBvbmUgbWVtYmVyIG91dCB0byB0aGUgZmlsZS4KK2Jvb2wKK0FyY2hpdmU6OndyaXRlTWVtYmVyKAorICBjb25zdCBBcmNoaXZlTWVtYmVyJiBtZW1iZXIsCisgIHN0ZDo6b2ZzdHJlYW0mIEFSRmlsZSwKKyAgYm9vbCBDcmVhdGVTeW1ib2xUYWJsZSwKKyAgYm9vbCBUcnVuY2F0ZU5hbWVzLAorICBib29sIFNob3VsZENvbXByZXNzLAorICBzdGQ6OnN0cmluZyogRXJyTXNnCispIHsKKworICB1bnNpZ25lZCBmaWxlcG9zID0gQVJGaWxlLnRlbGxwKCk7CisgIGZpbGVwb3MgLT0gODsKKworICAvLyBHZXQgdGhlIGRhdGEgYW5kIGl0cyBzaXplIGVpdGhlciBmcm9tIHRoZQorICAvLyBtZW1iZXIncyBpbi1tZW1vcnkgZGF0YSBvciBkaXJlY3RseSBmcm9tIHRoZSBmaWxlLgorICBzaXplX3QgZlNpemUgPSBtZW1iZXIuZ2V0U2l6ZSgpOworICBjb25zdCBjaGFyICpkYXRhID0gKGNvbnN0IGNoYXIqKW1lbWJlci5nZXREYXRhKCk7CisgIE1lbW9yeUJ1ZmZlciAqbUZpbGUgPSAwOworICBpZiAoIWRhdGEpIHsKKyAgICBtRmlsZSA9IE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShtZW1iZXIuZ2V0UGF0aCgpLmNfc3RyKCksIEVyck1zZyk7CisgICAgaWYgKG1GaWxlID09IDApCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkYXRhID0gbUZpbGUtPmdldEJ1ZmZlclN0YXJ0KCk7CisgICAgZlNpemUgPSBtRmlsZS0+Z2V0QnVmZmVyU2l6ZSgpOworICB9CisKKyAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgZGF0YSBpbiBtZW1vcnksIHVwZGF0ZSB0aGUKKyAgLy8gc3ltYm9sIHRhYmxlIGlmIGl0J3MgYSBiaXRjb2RlIGZpbGUuCisgIGlmIChDcmVhdGVTeW1ib2xUYWJsZSAmJiBtZW1iZXIuaXNCaXRjb2RlKCkpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3ltYm9sczsKKyAgICBzdGQ6OnN0cmluZyBGdWxsTWVtYmVyTmFtZSA9IGFyY2hQYXRoLnN0cigpICsgIigiICsgbWVtYmVyLmdldFBhdGgoKS5zdHIoKQorICAgICAgKyAiKSI7CisgICAgTW9kdWxlKiBNID0gCisgICAgICBHZXRCaXRjb2RlU3ltYm9scyhkYXRhLCBmU2l6ZSwgRnVsbE1lbWJlck5hbWUsIENvbnRleHQsIHN5bWJvbHMsIEVyck1zZyk7CisKKyAgICAvLyBJZiB0aGUgYml0Y29kZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5CisgICAgaWYgKCBNICkgeworICAgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIFNJID0gc3ltYm9scy5iZWdpbigpLAorICAgICAgICAgICBTRSA9IHN5bWJvbHMuZW5kKCk7IFNJICE9IFNFOyArK1NJKSB7CisKKyAgICAgICAgc3RkOjpwYWlyPFN5bVRhYlR5cGU6Oml0ZXJhdG9yLGJvb2w+IFJlcyA9CisgICAgICAgICAgc3ltVGFiLmluc2VydChzdGQ6Om1ha2VfcGFpcigqU0ksZmlsZXBvcykpOworCisgICAgICAgIGlmIChSZXMuc2Vjb25kKSB7CisgICAgICAgICAgc3ltVGFiU2l6ZSArPSBTSS0+bGVuZ3RoKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgbnVtVmJyQnl0ZXMoU0ktPmxlbmd0aCgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICBudW1WYnJCeXRlcyhmaWxlcG9zKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGlzIG1vZHVsZSBhbnkgbW9yZS4KKyAgICAgIGRlbGV0ZSBNOworICAgIH0gZWxzZSB7CisgICAgICBkZWxldGUgbUZpbGU7CisgICAgICBpZiAoRXJyTXNnKQorICAgICAgICAqRXJyTXNnID0gIkNhbid0IHBhcnNlIGJpdGNvZGUgbWVtYmVyOiAiICsgbWVtYmVyLmdldFBhdGgoKS5zdHIoKQorICAgICAgICAgICsgIjogIiArICpFcnJNc2c7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpbnQgaGRyU2l6ZSA9IGZTaXplOworCisgIC8vIENvbXB1dGUgdGhlIGZpZWxkcyBvZiB0aGUgaGVhZGVyCisgIEFyY2hpdmVNZW1iZXJIZWFkZXIgSGRyOworICBib29sIHdyaXRlTG9uZ05hbWUgPSBmaWxsSGVhZGVyKG1lbWJlcixIZHIsaGRyU2l6ZSxUcnVuY2F0ZU5hbWVzKTsKKworICAvLyBXcml0ZSBoZWFkZXIgdG8gYXJjaGl2ZSBmaWxlCisgIEFSRmlsZS53cml0ZSgoY2hhciopJkhkciwgc2l6ZW9mKEhkcikpOworCisgIC8vIFdyaXRlIHRoZSBsb25nIGZpbGVuYW1lIGlmIGl0cyBsb25nCisgIGlmICh3cml0ZUxvbmdOYW1lKSB7CisgICAgQVJGaWxlLndyaXRlKG1lbWJlci5nZXRQYXRoKCkuc3RyKCkuZGF0YSgpLAorICAgICAgICAgICAgICAgICBtZW1iZXIuZ2V0UGF0aCgpLnN0cigpLmxlbmd0aCgpKTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSAocG9zc2libHkgY29tcHJlc3NlZCkgbWVtYmVyJ3MgY29udGVudCB0byB0aGUgZmlsZS4KKyAgQVJGaWxlLndyaXRlKGRhdGEsZlNpemUpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgbWVtYmVyIGlzIGFuIGV2ZW4gbGVuZ3RoCisgIGlmICgoQVJGaWxlLnRlbGxwKCkgJiAxKSA9PSAxKQorICAgIEFSRmlsZSA8PCBBUkZJTEVfUEFEOworCisgIC8vIENsb3NlIHRoZSBtYXBwZWQgZmlsZSBpZiBpdCB3YXMgb3BlbmVkCisgIGRlbGV0ZSBtRmlsZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBXcml0ZSBvdXQgdGhlIExMVk0gc3ltYm9sIHRhYmxlIGFzIGFuIGFyY2hpdmUgbWVtYmVyIHRvIHRoZSBmaWxlLgordm9pZAorQXJjaGl2ZTo6d3JpdGVTeW1ib2xUYWJsZShzdGQ6Om9mc3RyZWFtJiBBUkZpbGUpIHsKKworICAvLyBDb25zdHJ1Y3QgdGhlIHN5bWJvbCB0YWJsZSdzIGhlYWRlcgorICBBcmNoaXZlTWVtYmVySGVhZGVyIEhkcjsKKyAgSGRyLmluaXQoKTsKKyAgbWVtY3B5KEhkci5uYW1lLEFSRklMRV9MTFZNX1NZTVRBQl9OQU1FLDE2KTsKKyAgdWludDY0X3Qgc2Vjb25kc1NpbmNlRXBvY2ggPSBzeXM6OlRpbWVWYWx1ZTo6bm93KCkudG9FcG9jaFRpbWUoKTsKKyAgY2hhciBidWZmZXJbMzJdOworICBzcHJpbnRmKGJ1ZmZlciwgIiUtOG8iLCAwNjQ0KTsKKyAgbWVtY3B5KEhkci5tb2RlLGJ1ZmZlciw4KTsKKyAgc3ByaW50ZihidWZmZXIsICIlLTZ1Iiwgc3lzOjpQcm9jZXNzOjpHZXRDdXJyZW50VXNlcklkKCkpOworICBtZW1jcHkoSGRyLnVpZCxidWZmZXIsNik7CisgIHNwcmludGYoYnVmZmVyLCAiJS02dSIsIHN5czo6UHJvY2Vzczo6R2V0Q3VycmVudEdyb3VwSWQoKSk7CisgIG1lbWNweShIZHIuZ2lkLGJ1ZmZlciw2KTsKKyAgc3ByaW50ZihidWZmZXIsIiUtMTJ1IiwgdW5zaWduZWQoc2Vjb25kc1NpbmNlRXBvY2gpKTsKKyAgbWVtY3B5KEhkci5kYXRlLGJ1ZmZlciwxMik7CisgIHNwcmludGYoYnVmZmVyLCIlLTEwdSIsc3ltVGFiU2l6ZSk7CisgIG1lbWNweShIZHIuc2l6ZSxidWZmZXIsMTApOworCisgIC8vIFdyaXRlIHRoZSBoZWFkZXIKKyAgQVJGaWxlLndyaXRlKChjaGFyKikmSGRyLCBzaXplb2YoSGRyKSk7CisKKyNpZm5kZWYgTkRFQlVHCisgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBzeW1ib2wgdGFibGVzIGRhdGEgY29udGVudC4KKyAgdW5zaWduZWQgc3RhcnRwb3MgPSBBUkZpbGUudGVsbHAoKTsKKyNlbmRpZgorCisgIC8vIFdyaXRlIG91dCB0aGUgc3ltYm9scyBzZXF1ZW50aWFsbHkKKyAgZm9yICggQXJjaGl2ZTo6U3ltVGFiVHlwZTo6aXRlcmF0b3IgSSA9IHN5bVRhYi5iZWdpbigpLCBFID0gc3ltVGFiLmVuZCgpOworICAgICAgICBJICE9IEU7ICsrSSkKKyAgeworICAgIC8vIFdyaXRlIG91dCB0aGUgZmlsZSBpbmRleAorICAgIHdyaXRlSW50ZWdlcihJLT5zZWNvbmQsIEFSRmlsZSk7CisgICAgLy8gV3JpdGUgb3V0IHRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbAorICAgIHdyaXRlSW50ZWdlcihJLT5maXJzdC5sZW5ndGgoKSwgQVJGaWxlKTsKKyAgICAvLyBXcml0ZSBvdXQgdGhlIHN5bWJvbAorICAgIEFSRmlsZS53cml0ZShJLT5maXJzdC5kYXRhKCksIEktPmZpcnN0Lmxlbmd0aCgpKTsKKyAgfQorCisjaWZuZGVmIE5ERUJVRworICAvLyBOb3cgdGhhdCB3ZSdyZSBkb25lIHdpdGggdGhlIHN5bWJvbCB0YWJsZSwgZ2V0IHRoZSBlbmRpbmcgZmlsZSBwb3NpdGlvbgorICB1bnNpZ25lZCBlbmRwb3MgPSBBUkZpbGUudGVsbHAoKTsKKyNlbmRpZgorCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBhbW91bnQgd2Ugd3JvdGUgaXMgd2hhdCB3ZSBwcmUtY29tcHV0ZWQuIFRoaXMgaXMKKyAgLy8gY3JpdGljYWwgZm9yIGZpbGUgaW50ZWdyaXR5IHB1cnBvc2VzLgorICBhc3NlcnQoZW5kcG9zIC0gc3RhcnRwb3MgPT0gc3ltVGFiU2l6ZSAmJiAiSW52YWxpZCBzeW1UYWJTaXplIGNvbXB1dGF0aW9uIik7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBzeW1ib2wgdGFibGUgaXMgZXZlbiBzaXplZAorICBpZiAoc3ltVGFiU2l6ZSAlIDIgIT0gMCApCisgICAgQVJGaWxlIDw8IEFSRklMRV9QQUQ7Cit9CisKKy8vIFdyaXRlIHRoZSBlbnRpcmUgYXJjaGl2ZSB0byB0aGUgZmlsZSBzcGVjaWZpZWQgd2hlbiB0aGUgYXJjaGl2ZSB3YXMgY3JlYXRlZC4KKy8vIFRoaXMgd3JpdGVzIHRvIGEgdGVtcG9yYXJ5IGZpbGUgZmlyc3QuIE9wdGlvbnMgYXJlIGZvciBjcmVhdGluZyBhIHN5bWJvbAorLy8gdGFibGUsIGZsYXR0ZW5pbmcgdGhlIGZpbGUgbmFtZXMgKG5vIGRpcmVjdG9yaWVzLCAxNSBjaGFycyBtYXgpIGFuZAorLy8gY29tcHJlc3NpbmcgZWFjaCBhcmNoaXZlIG1lbWJlci4KK2Jvb2wKK0FyY2hpdmU6OndyaXRlVG9EaXNrKGJvb2wgQ3JlYXRlU3ltYm9sVGFibGUsIGJvb2wgVHJ1bmNhdGVOYW1lcywgYm9vbCBDb21wcmVzcywKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBFcnJNc2cpCit7CisgIC8vIE1ha2Ugc3VyZSB0aGV5IGhhdmVuJ3Qgb3BlbmVkIHVwIHRoZSBmaWxlLCBub3QgbG9hZGVkIGl0LAorICAvLyBidXQgYXJlIG5vdyB0cnlpbmcgdG8gd3JpdGUgaXQgd2hpY2ggd291bGQgd2lwZSBvdXQgdGhlIGZpbGUuCisgIGlmIChtZW1iZXJzLmVtcHR5KCkgJiYgbWFwZmlsZSAmJiBtYXBmaWxlLT5nZXRCdWZmZXJTaXplKCkgPiA4KSB7CisgICAgaWYgKEVyck1zZykKKyAgICAgICpFcnJNc2cgPSAiQ2FuJ3Qgd3JpdGUgYW4gYXJjaGl2ZSBub3Qgb3BlbmVkIGZvciB3cml0aW5nIjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHRvIHN0b3JlIHRoZSBhcmNoaXZlIGluCisgIHN5czo6UGF0aCBUbXBBcmNoaXZlID0gYXJjaFBhdGg7CisgIGlmIChUbXBBcmNoaXZlLmNyZWF0ZVRlbXBvcmFyeUZpbGVPbkRpc2soRXJyTXNnKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBNYWtlIHN1cmUgdGhlIHRlbXBvcmFyeSBnZXRzIHJlbW92ZWQgaWYgd2UgY3Jhc2gKKyAgc3lzOjpSZW1vdmVGaWxlT25TaWduYWwoVG1wQXJjaGl2ZSk7CisKKyAgLy8gQ3JlYXRlIGFyY2hpdmUgZmlsZSBmb3Igb3V0cHV0LgorICBzdGQ6Omlvczo6b3Blbm1vZGUgaW9fbW9kZSA9IHN0ZDo6aW9zOjpvdXQgfCBzdGQ6Omlvczo6dHJ1bmMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zOjpiaW5hcnk7CisgIHN0ZDo6b2ZzdHJlYW0gQXJjaGl2ZUZpbGUoVG1wQXJjaGl2ZS5jX3N0cigpLCBpb19tb2RlKTsKKworICAvLyBDaGVjayBmb3IgZXJyb3JzIG9wZW5pbmcgb3IgY3JlYXRpbmcgYXJjaGl2ZSBmaWxlLgorICBpZiAoIUFyY2hpdmVGaWxlLmlzX29wZW4oKSB8fCBBcmNoaXZlRmlsZS5iYWQoKSkgeworICAgIFRtcEFyY2hpdmUuZXJhc2VGcm9tRGlzaygpOworICAgIGlmIChFcnJNc2cpCisgICAgICAqRXJyTXNnID0gIkVycm9yIG9wZW5pbmcgYXJjaGl2ZSBmaWxlOiAiICsgYXJjaFBhdGguc3RyKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBJZiB3ZSdyZSBjcmVhdGluZyBhIHN5bWJvbCB0YWJsZSwgcmVzZXQgaXQgbm93CisgIGlmIChDcmVhdGVTeW1ib2xUYWJsZSkgeworICAgIHN5bVRhYlNpemUgPSAwOworICAgIHN5bVRhYi5jbGVhcigpOworICB9CisKKyAgLy8gV3JpdGUgbWFnaWMgc3RyaW5nIHRvIGFyY2hpdmUuCisgIEFyY2hpdmVGaWxlIDw8IEFSRklMRV9NQUdJQzsKKworICAvLyBMb29wIG92ZXIgYWxsIG1lbWJlciBmaWxlcywgYW5kIHdyaXRlIHRoZW0gb3V0LiBOb3RlIHRoYXQgdGhpcyBhbHNvCisgIC8vIGJ1aWxkcyB0aGUgc3ltYm9sIHRhYmxlLCBzeW1UYWIuCisgIGZvciAoTWVtYmVyc0xpc3Q6Oml0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKHdyaXRlTWVtYmVyKCpJLCBBcmNoaXZlRmlsZSwgQ3JlYXRlU3ltYm9sVGFibGUsCisgICAgICAgICAgICAgICAgICAgICBUcnVuY2F0ZU5hbWVzLCBDb21wcmVzcywgRXJyTXNnKSkgeworICAgICAgVG1wQXJjaGl2ZS5lcmFzZUZyb21EaXNrKCk7CisgICAgICBBcmNoaXZlRmlsZS5jbG9zZSgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgLy8gQ2xvc2UgYXJjaGl2ZSBmaWxlLgorICBBcmNoaXZlRmlsZS5jbG9zZSgpOworCisgIC8vIFdyaXRlIHRoZSBzeW1ib2wgdGFibGUKKyAgaWYgKENyZWF0ZVN5bWJvbFRhYmxlKSB7CisgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHdyaXR0ZW4gYSBmaWxlIHRoYXQgaXMgYSBsZWdhbCBhcmNoaXZlIGJ1dCBpdAorICAgIC8vIGRvZXNuJ3QgaGF2ZSBhIHN5bWJvbCB0YWJsZSBpbiBpdC4gVG8gYWlkIGluIGZhc3RlciByZWFkaW5nIGFuZCB0bworICAgIC8vIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXJjaGl2ZXJzIHdlIG5lZWQgdG8gcHV0IHRoZSBzeW1ib2wKKyAgICAvLyB0YWJsZSBmaXJzdCBpbiB0aGUgZmlsZS4gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyBtYXBwaW5nIHRoZSBmaWxlCisgICAgLy8gd2UganVzdCB3cm90ZSBiYWNrIGluIGFuZCBjb3B5aW5nIGl0IHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgorICAgIHN5czo6UGF0aCBGaW5hbEZpbGVQYXRoID0gYXJjaFBhdGg7CisKKyAgICAvLyBNYXAgaW4gdGhlIGFyY2hpdmUgd2UganVzdCB3cm90ZS4KKyAgICB7CisgICAgT3duaW5nUHRyPE1lbW9yeUJ1ZmZlcj4gYXJjaChNZW1vcnlCdWZmZXI6OmdldEZpbGUoVG1wQXJjaGl2ZS5jX3N0cigpKSk7CisgICAgaWYgKGFyY2ggPT0gMCkgcmV0dXJuIHRydWU7CisgICAgY29uc3QgY2hhciogYmFzZSA9IGFyY2gtPmdldEJ1ZmZlclN0YXJ0KCk7CisKKyAgICAvLyBPcGVuIGFub3RoZXIgdGVtcG9yYXJ5IGZpbGUgaW4gb3JkZXIgdG8gYXZvaWQgaW52YWxpZGF0aW5nIHRoZSAKKyAgICAvLyBtbWFwcGVkIGRhdGEKKyAgICBpZiAoRmluYWxGaWxlUGF0aC5jcmVhdGVUZW1wb3JhcnlGaWxlT25EaXNrKEVyck1zZykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBzeXM6OlJlbW92ZUZpbGVPblNpZ25hbChGaW5hbEZpbGVQYXRoKTsKKworICAgIHN0ZDo6b2ZzdHJlYW0gRmluYWxGaWxlKEZpbmFsRmlsZVBhdGguY19zdHIoKSwgaW9fbW9kZSk7CisgICAgaWYgKCFGaW5hbEZpbGUuaXNfb3BlbigpIHx8IEZpbmFsRmlsZS5iYWQoKSkgeworICAgICAgVG1wQXJjaGl2ZS5lcmFzZUZyb21EaXNrKCk7CisgICAgICBpZiAoRXJyTXNnKQorICAgICAgICAqRXJyTXNnID0gIkVycm9yIG9wZW5pbmcgYXJjaGl2ZSBmaWxlOiAiICsgRmluYWxGaWxlUGF0aC5zdHIoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBmaWxlIG1hZ2ljIG51bWJlcgorICAgIEZpbmFsRmlsZSA8PCBBUkZJTEVfTUFHSUM7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhIGZvcmVpZ24gc3ltYm9sIHRhYmxlLCBwdXQgaXQgaW50byB0aGUgZmlsZSBub3cuIE1vc3QKKyAgICAvLyBhcigxKSBpbXBsZW1lbnRhdGlvbnMgcmVxdWlyZSB0aGUgc3ltYm9sIHRhYmxlIHRvIGJlIGZpcnN0IGJ1dCBsbHZtLWFyCisgICAgLy8gY2FuIGRlYWwgd2l0aCBpdCBiZWluZyBhZnRlciBhIGZvcmVpZ24gc3ltYm9sIHRhYmxlLiBUaGlzIGVuc3VyZXMKKyAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXIoMSkgaW1wbGVtZW50YXRpb25zIGFzIHdlbGwgYXMgYWxsb3dpbmcgdGhlCisgICAgLy8gYXJjaGl2ZSB0byBzdG9yZSBib3RoIG5hdGl2ZSAubyBhbmQgTExWTSAuYmMgZmlsZXMsIGJvdGggaW5kZXhlZC4KKyAgICBpZiAoZm9yZWlnblNUKSB7CisgICAgICBpZiAod3JpdGVNZW1iZXIoKmZvcmVpZ25TVCwgRmluYWxGaWxlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBFcnJNc2cpKSB7CisgICAgICAgIEZpbmFsRmlsZS5jbG9zZSgpOworICAgICAgICBUbXBBcmNoaXZlLmVyYXNlRnJvbURpc2soKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUHV0IG91dCB0aGUgTExWTSBzeW1ib2wgdGFibGUgbm93LgorICAgIHdyaXRlU3ltYm9sVGFibGUoRmluYWxGaWxlKTsKKworICAgIC8vIENvcHkgdGhlIHRlbXBvcmFyeSBmaWxlIGNvbnRlbnRzIGJlaW5nIHN1cmUgdG8gc2tpcCB0aGUgZmlsZSdzIG1hZ2ljCisgICAgLy8gbnVtYmVyLgorICAgIEZpbmFsRmlsZS53cml0ZShiYXNlICsgc2l6ZW9mKEFSRklMRV9NQUdJQyktMSwKKyAgICAgIGFyY2gtPmdldEJ1ZmZlclNpemUoKS1zaXplb2YoQVJGSUxFX01BR0lDKSsxKTsKKworICAgIC8vIENsb3NlIHVwIHNob3AKKyAgICBGaW5hbEZpbGUuY2xvc2UoKTsKKyAgICB9IC8vIGZyZWUgYXJjaC4KKyAgICAKKyAgICAvLyBNb3ZlIHRoZSBmaW5hbCBmaWxlIG92ZXIgdG9wIG9mIFRtcEFyY2hpdmUKKyAgICBpZiAoRmluYWxGaWxlUGF0aC5yZW5hbWVQYXRoT25EaXNrKFRtcEFyY2hpdmUsIEVyck1zZykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgLy8gQmVmb3JlIHdlIHJlcGxhY2UgdGhlIGFjdHVhbCBhcmNoaXZlLCB3ZSBuZWVkIHRvIGZvcmdldCBhbGwgdGhlCisgIC8vIG1lbWJlcnMsIHNpbmNlIHRoZXkgcG9pbnQgdG8gZGF0YSBpbiB0aGF0IG9sZCBhcmNoaXZlLiBXZSBuZWVkIHRvIGRvCisgIC8vIHRoaXMgYmVjYXVzZSB3ZSBjYW5ub3QgcmVwbGFjZSBhbiBvcGVuIGZpbGUgb24gV2luZG93cy4KKyAgY2xlYW5VcE1lbW9yeSgpOworICAKKyAgaWYgKFRtcEFyY2hpdmUucmVuYW1lUGF0aE9uRGlzayhhcmNoUGF0aCwgRXJyTXNnKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBTZXQgY29ycmVjdCByZWFkIGFuZCB3cml0ZSBwZXJtaXNzaW9ucyBhZnRlciB0ZW1wb3JhcnkgZmlsZSBpcyBtb3ZlZAorICAvLyB0byBmaW5hbCBkZXN0aW5hdGlvbiBwYXRoLgorICBpZiAoYXJjaFBhdGgubWFrZVJlYWRhYmxlT25EaXNrKEVyck1zZykpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChhcmNoUGF0aC5tYWtlV3JpdGVhYmxlT25EaXNrKEVyck1zZykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FyY2hpdmUvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvQXJjaGl2ZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY0NzhhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FyY2hpdmUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1BcmNoaXZlCisgIEFyY2hpdmUuY3BwCisgIEFyY2hpdmVSZWFkZXIuY3BwCisgIEFyY2hpdmVXcml0ZXIuY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9BcmNoaXZlL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL0FyY2hpdmUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5NzgwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9BcmNoaXZlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMjPT09LSBsaWIvQXJjaGl2ZS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUFyY2hpdmUKKworIyBXZSBvbmx5IHdhbnQgYW4gYXJjaGl2ZSBzbyBvbmx5IHRob3NlIG1vZHVsZXMgYWN0dWFsbHkgdXNlZCBieSBhIHRvb2wgYXJlCisjIGluY2x1ZGVkLgorQlVJTERfQVJDSElWRSA6PSAxCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQXNtUGFyc2VyL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL0FzbVBhcnNlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODVlYmUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FzbVBhcnNlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKKyMgQXNtUGFyc2VyCithZGRfbGx2bV9saWJyYXJ5KExMVk1Bc21QYXJzZXIKKyAgTExMZXhlci5jcHAKKyAgTExQYXJzZXIuY3BwCisgIFBhcnNlci5jcHAKKyAgKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FzbVBhcnNlci9MTExleGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvTExMZXhlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjMGU1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvTExMZXhlci5jcHAKQEAgLTAsMCArMSw4NjcgQEAKKy8vPT09LSBMTExleGVyLmNwcCAtIExleGVyIGZvciAubGwgRmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW1wbGVtZW50IHRoZSBMZXhlciBmb3IgLmxsIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJMTExleGVyLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvUGFyc2VyLmgiCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitib29sIExMTGV4ZXI6OkVycm9yKExvY1R5IEVycm9yTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTXNnKSBjb25zdCB7CisgIEVycm9ySW5mbyA9IFNNLkdldE1lc3NhZ2UoRXJyb3JMb2MsIE1zZywgImVycm9yIik7CisgIHJldHVybiB0cnVlOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSGVscGVyIGZ1bmN0aW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIGF0b3VsbCAtIENvbnZlcnQgYW4gYXNjaWkgc3RyaW5nIG9mIGRlY2ltYWwgZGlnaXRzIGludG8gdGhlIHVuc2lnbmVkIGxvbmcKKy8vIGxvbmcgcmVwcmVzZW50YXRpb24uLi4gdGhpcyBkb2VzIG5vdCBoYXZlIHRvIGRvIGlucHV0IGVycm9yIGNoZWNraW5nLAorLy8gYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlIGlucHV0IHdpbGwgYmUgbWF0Y2hlZCBieSBhIHN1aXRhYmxlIHJlZ2V4Li4uCisvLwordWludDY0X3QgTExMZXhlcjo6YXRvdWxsKGNvbnN0IGNoYXIgKkJ1ZmZlciwgY29uc3QgY2hhciAqRW5kKSB7CisgIHVpbnQ2NF90IFJlc3VsdCA9IDA7CisgIGZvciAoOyBCdWZmZXIgIT0gRW5kOyBCdWZmZXIrKykgeworICAgIHVpbnQ2NF90IE9sZFJlcyA9IFJlc3VsdDsKKyAgICBSZXN1bHQgKj0gMTA7CisgICAgUmVzdWx0ICs9ICpCdWZmZXItJzAnOworICAgIGlmIChSZXN1bHQgPCBPbGRSZXMpIHsgIC8vIFVoLCBvaCwgb3ZlcmZsb3cgZGV0ZWN0ZWQhISEKKyAgICAgIEVycm9yKCJjb25zdGFudCBiaWdnZXIgdGhhbiA2NCBiaXRzIGRldGVjdGVkISIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK3VpbnQ2NF90IExMTGV4ZXI6OkhleEludFRvVmFsKGNvbnN0IGNoYXIgKkJ1ZmZlciwgY29uc3QgY2hhciAqRW5kKSB7CisgIHVpbnQ2NF90IFJlc3VsdCA9IDA7CisgIGZvciAoOyBCdWZmZXIgIT0gRW5kOyArK0J1ZmZlcikgeworICAgIHVpbnQ2NF90IE9sZFJlcyA9IFJlc3VsdDsKKyAgICBSZXN1bHQgKj0gMTY7CisgICAgY2hhciBDID0gKkJ1ZmZlcjsKKyAgICBpZiAoQyA+PSAnMCcgJiYgQyA8PSAnOScpCisgICAgICBSZXN1bHQgKz0gQy0nMCc7CisgICAgZWxzZSBpZiAoQyA+PSAnQScgJiYgQyA8PSAnRicpCisgICAgICBSZXN1bHQgKz0gQy0nQScrMTA7CisgICAgZWxzZSBpZiAoQyA+PSAnYScgJiYgQyA8PSAnZicpCisgICAgICBSZXN1bHQgKz0gQy0nYScrMTA7CisKKyAgICBpZiAoUmVzdWx0IDwgT2xkUmVzKSB7ICAgLy8gVWgsIG9oLCBvdmVyZmxvdyBkZXRlY3RlZCEhIQorICAgICAgRXJyb3IoImNvbnN0YW50IGJpZ2dlciB0aGFuIDY0IGJpdHMgZGV0ZWN0ZWQhIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFJlc3VsdDsKK30KKwordm9pZCBMTExleGVyOjpIZXhUb0ludFBhaXIoY29uc3QgY2hhciAqQnVmZmVyLCBjb25zdCBjaGFyICpFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBQYWlyWzJdKSB7CisgIFBhaXJbMF0gPSAwOworICBmb3IgKGludCBpPTA7IGk8MTY7IGkrKywgQnVmZmVyKyspIHsKKyAgICBhc3NlcnQoQnVmZmVyICE9IEVuZCk7CisgICAgUGFpclswXSAqPSAxNjsKKyAgICBjaGFyIEMgPSAqQnVmZmVyOworICAgIGlmIChDID49ICcwJyAmJiBDIDw9ICc5JykKKyAgICAgIFBhaXJbMF0gKz0gQy0nMCc7CisgICAgZWxzZSBpZiAoQyA+PSAnQScgJiYgQyA8PSAnRicpCisgICAgICBQYWlyWzBdICs9IEMtJ0EnKzEwOworICAgIGVsc2UgaWYgKEMgPj0gJ2EnICYmIEMgPD0gJ2YnKQorICAgICAgUGFpclswXSArPSBDLSdhJysxMDsKKyAgfQorICBQYWlyWzFdID0gMDsKKyAgZm9yIChpbnQgaT0wOyBpPDE2ICYmIEJ1ZmZlciAhPSBFbmQ7IGkrKywgQnVmZmVyKyspIHsKKyAgICBQYWlyWzFdICo9IDE2OworICAgIGNoYXIgQyA9ICpCdWZmZXI7CisgICAgaWYgKEMgPj0gJzAnICYmIEMgPD0gJzknKQorICAgICAgUGFpclsxXSArPSBDLScwJzsKKyAgICBlbHNlIGlmIChDID49ICdBJyAmJiBDIDw9ICdGJykKKyAgICAgIFBhaXJbMV0gKz0gQy0nQScrMTA7CisgICAgZWxzZSBpZiAoQyA+PSAnYScgJiYgQyA8PSAnZicpCisgICAgICBQYWlyWzFdICs9IEMtJ2EnKzEwOworICB9CisgIGlmIChCdWZmZXIgIT0gRW5kKQorICAgIEVycm9yKCJjb25zdGFudCBiaWdnZXIgdGhhbiAxMjggYml0cyBkZXRlY3RlZCEiKTsKK30KKworLy8vIEZQODBIZXhUb0ludFBhaXIgLSB0cmFuc2xhdGUgYW4gODAgYml0IEZQODAgbnVtYmVyICgyMCBoZXhpdHMpIGludG8KKy8vLyB7IGxvdzY0LCBoaWdoMTYgfSBhcyB1c3VhbCBmb3IgYW4gQVBJbnQuCit2b2lkIExMTGV4ZXI6OkZQODBIZXhUb0ludFBhaXIoY29uc3QgY2hhciAqQnVmZmVyLCBjb25zdCBjaGFyICpFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBQYWlyWzJdKSB7CisgIFBhaXJbMV0gPSAwOworICBmb3IgKGludCBpPTA7IGk8NCAmJiBCdWZmZXIgIT0gRW5kOyBpKyssIEJ1ZmZlcisrKSB7CisgICAgYXNzZXJ0KEJ1ZmZlciAhPSBFbmQpOworICAgIFBhaXJbMV0gKj0gMTY7CisgICAgY2hhciBDID0gKkJ1ZmZlcjsKKyAgICBpZiAoQyA+PSAnMCcgJiYgQyA8PSAnOScpCisgICAgICBQYWlyWzFdICs9IEMtJzAnOworICAgIGVsc2UgaWYgKEMgPj0gJ0EnICYmIEMgPD0gJ0YnKQorICAgICAgUGFpclsxXSArPSBDLSdBJysxMDsKKyAgICBlbHNlIGlmIChDID49ICdhJyAmJiBDIDw9ICdmJykKKyAgICAgIFBhaXJbMV0gKz0gQy0nYScrMTA7CisgIH0KKyAgUGFpclswXSA9IDA7CisgIGZvciAoaW50IGk9MDsgaTwxNjsgaSsrLCBCdWZmZXIrKykgeworICAgIFBhaXJbMF0gKj0gMTY7CisgICAgY2hhciBDID0gKkJ1ZmZlcjsKKyAgICBpZiAoQyA+PSAnMCcgJiYgQyA8PSAnOScpCisgICAgICBQYWlyWzBdICs9IEMtJzAnOworICAgIGVsc2UgaWYgKEMgPj0gJ0EnICYmIEMgPD0gJ0YnKQorICAgICAgUGFpclswXSArPSBDLSdBJysxMDsKKyAgICBlbHNlIGlmIChDID49ICdhJyAmJiBDIDw9ICdmJykKKyAgICAgIFBhaXJbMF0gKz0gQy0nYScrMTA7CisgIH0KKyAgaWYgKEJ1ZmZlciAhPSBFbmQpCisgICAgRXJyb3IoImNvbnN0YW50IGJpZ2dlciB0aGFuIDEyOCBiaXRzIGRldGVjdGVkISIpOworfQorCisvLyBVbkVzY2FwZUxleGVkIC0gUnVuIHRocm91Z2ggdGhlIHNwZWNpZmllZCBidWZmZXIgYW5kIGNoYW5nZSBceHggY29kZXMgdG8gdGhlCisvLyBhcHByb3ByaWF0ZSBjaGFyYWN0ZXIuCitzdGF0aWMgdm9pZCBVbkVzY2FwZUxleGVkKHN0ZDo6c3RyaW5nICZTdHIpIHsKKyAgaWYgKFN0ci5lbXB0eSgpKSByZXR1cm47CisKKyAgY2hhciAqQnVmZmVyID0gJlN0clswXSwgKkVuZEJ1ZmZlciA9IEJ1ZmZlcitTdHIuc2l6ZSgpOworICBjaGFyICpCT3V0ID0gQnVmZmVyOworICBmb3IgKGNoYXIgKkJJbiA9IEJ1ZmZlcjsgQkluICE9IEVuZEJ1ZmZlcjsgKSB7CisgICAgaWYgKEJJblswXSA9PSAnXFwnKSB7CisgICAgICBpZiAoQkluIDwgRW5kQnVmZmVyLTEgJiYgQkluWzFdID09ICdcXCcpIHsKKyAgICAgICAgKkJPdXQrKyA9ICdcXCc7IC8vIFR3byBcIGJlY29tZXMgb25lCisgICAgICAgIEJJbiArPSAyOworICAgICAgfSBlbHNlIGlmIChCSW4gPCBFbmRCdWZmZXItMiAmJiBpc3hkaWdpdChCSW5bMV0pICYmIGlzeGRpZ2l0KEJJblsyXSkpIHsKKyAgICAgICAgY2hhciBUbXAgPSBCSW5bM107IEJJblszXSA9IDA7ICAgICAgLy8gVGVybWluYXRlIHN0cmluZworICAgICAgICAqQk91dCA9IChjaGFyKXN0cnRvbChCSW4rMSwgMCwgMTYpOyAvLyBDb252ZXJ0IHRvIG51bWJlcgorICAgICAgICBCSW5bM10gPSBUbXA7ICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGNoYXJhY3RlcgorICAgICAgICBCSW4gKz0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgaGFuZGxlZCBjaGFycworICAgICAgICArK0JPdXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAqQk91dCsrID0gKkJJbisrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAqQk91dCsrID0gKkJJbisrOworICAgIH0KKyAgfQorICBTdHIucmVzaXplKEJPdXQtQnVmZmVyKTsKK30KKworLy8vIGlzTGFiZWxDaGFyIC0gUmV0dXJuIHRydWUgZm9yIFstYS16QS1aJC5fMC05XS4KK3N0YXRpYyBib29sIGlzTGFiZWxDaGFyKGNoYXIgQykgeworICByZXR1cm4gaXNhbG51bShDKSB8fCBDID09ICctJyB8fCBDID09ICckJyB8fCBDID09ICcuJyB8fCBDID09ICdfJzsKK30KKworCisvLy8gaXNMYWJlbFRhaWwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIGEgdmFsaWQgZW5kIG9mIGEgbGFiZWwuCitzdGF0aWMgY29uc3QgY2hhciAqaXNMYWJlbFRhaWwoY29uc3QgY2hhciAqQ3VyUHRyKSB7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKEN1clB0clswXSA9PSAnOicpIHJldHVybiBDdXJQdHIrMTsKKyAgICBpZiAoIWlzTGFiZWxDaGFyKEN1clB0clswXSkpIHJldHVybiAwOworICAgICsrQ3VyUHRyOworICB9Cit9CisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTGV4ZXIgZGVmaW5pdGlvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0xMTGV4ZXI6OkxMTGV4ZXIoTWVtb3J5QnVmZmVyICpTdGFydEJ1ZiwgU291cmNlTWdyICZzbSwgU01EaWFnbm9zdGljICZFcnIsCisgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDKQorICA6IEN1ckJ1ZihTdGFydEJ1ZiksIEVycm9ySW5mbyhFcnIpLCBTTShzbSksIENvbnRleHQoQyksIEFQRmxvYXRWYWwoMC4wKSB7CisgIEN1clB0ciA9IEN1ckJ1Zi0+Z2V0QnVmZmVyU3RhcnQoKTsKK30KKworc3RkOjpzdHJpbmcgTExMZXhlcjo6Z2V0RmlsZW5hbWUoKSBjb25zdCB7CisgIHJldHVybiBDdXJCdWYtPmdldEJ1ZmZlcklkZW50aWZpZXIoKTsKK30KKworaW50IExMTGV4ZXI6OmdldE5leHRDaGFyKCkgeworICBjaGFyIEN1ckNoYXIgPSAqQ3VyUHRyKys7CisgIHN3aXRjaCAoQ3VyQ2hhcikgeworICBkZWZhdWx0OiByZXR1cm4gKHVuc2lnbmVkIGNoYXIpQ3VyQ2hhcjsKKyAgY2FzZSAwOgorICAgIC8vIEEgbnVsIGNoYXJhY3RlciBpbiB0aGUgc3RyZWFtIGlzIGVpdGhlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBvcgorICAgIC8vIGEgcmFuZG9tIG51bCBpbiB0aGUgZmlsZS4gIERpc2FtYmlndWF0ZSB0aGF0IGhlcmUuCisgICAgaWYgKEN1clB0ci0xICE9IEN1ckJ1Zi0+Z2V0QnVmZmVyRW5kKCkpCisgICAgICByZXR1cm4gMDsgIC8vIEp1c3Qgd2hpdGVzcGFjZS4KKworICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIGVuZCBvZiBmaWxlLgorICAgIC0tQ3VyUHRyOyAgLy8gQW5vdGhlciBjYWxsIHRvIGxleCB3aWxsIHJldHVybiBFT0YgYWdhaW4uCisgICAgcmV0dXJuIEVPRjsKKyAgfQorfQorCisKK2xsdG9rOjpLaW5kIExMTGV4ZXI6OkxleFRva2VuKCkgeworICBUb2tTdGFydCA9IEN1clB0cjsKKworICBpbnQgQ3VyQ2hhciA9IGdldE5leHRDaGFyKCk7CisgIHN3aXRjaCAoQ3VyQ2hhcikgeworICBkZWZhdWx0OgorICAgIC8vIEhhbmRsZSBsZXR0ZXJzOiBbYS16QS1aX10KKyAgICBpZiAoaXNhbHBoYShDdXJDaGFyKSB8fCBDdXJDaGFyID09ICdfJykKKyAgICAgIHJldHVybiBMZXhJZGVudGlmaWVyKCk7CisKKyAgICByZXR1cm4gbGx0b2s6OkVycm9yOworICBjYXNlIEVPRjogcmV0dXJuIGxsdG9rOjpFb2Y7CisgIGNhc2UgMDoKKyAgY2FzZSAnICc6CisgIGNhc2UgJ1x0JzoKKyAgY2FzZSAnXG4nOgorICBjYXNlICdccic6CisgICAgLy8gSWdub3JlIHdoaXRlc3BhY2UuCisgICAgcmV0dXJuIExleFRva2VuKCk7CisgIGNhc2UgJysnOiByZXR1cm4gTGV4UG9zaXRpdmUoKTsKKyAgY2FzZSAnQCc6IHJldHVybiBMZXhBdCgpOworICBjYXNlICclJzogcmV0dXJuIExleFBlcmNlbnQoKTsKKyAgY2FzZSAnIic6IHJldHVybiBMZXhRdW90ZSgpOworICBjYXNlICcuJzoKKyAgICBpZiAoY29uc3QgY2hhciAqUHRyID0gaXNMYWJlbFRhaWwoQ3VyUHRyKSkgeworICAgICAgQ3VyUHRyID0gUHRyOworICAgICAgU3RyVmFsLmFzc2lnbihUb2tTdGFydCwgQ3VyUHRyLTEpOworICAgICAgcmV0dXJuIGxsdG9rOjpMYWJlbFN0cjsKKyAgICB9CisgICAgaWYgKEN1clB0clswXSA9PSAnLicgJiYgQ3VyUHRyWzFdID09ICcuJykgeworICAgICAgQ3VyUHRyICs9IDI7CisgICAgICByZXR1cm4gbGx0b2s6OmRvdGRvdGRvdDsKKyAgICB9CisgICAgcmV0dXJuIGxsdG9rOjpFcnJvcjsKKyAgY2FzZSAnJCc6CisgICAgaWYgKGNvbnN0IGNoYXIgKlB0ciA9IGlzTGFiZWxUYWlsKEN1clB0cikpIHsKKyAgICAgIEN1clB0ciA9IFB0cjsKKyAgICAgIFN0clZhbC5hc3NpZ24oVG9rU3RhcnQsIEN1clB0ci0xKTsKKyAgICAgIHJldHVybiBsbHRvazo6TGFiZWxTdHI7CisgICAgfQorICAgIHJldHVybiBsbHRvazo6RXJyb3I7CisgIGNhc2UgJzsnOgorICAgIFNraXBMaW5lQ29tbWVudCgpOworICAgIHJldHVybiBMZXhUb2tlbigpOworICBjYXNlICchJzogcmV0dXJuIExleEV4Y2xhaW0oKTsKKyAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgIGNhc2UgJy0nOgorICAgIHJldHVybiBMZXhEaWdpdE9yTmVnYXRpdmUoKTsKKyAgY2FzZSAnPSc6IHJldHVybiBsbHRvazo6ZXF1YWw7CisgIGNhc2UgJ1snOiByZXR1cm4gbGx0b2s6OmxzcXVhcmU7CisgIGNhc2UgJ10nOiByZXR1cm4gbGx0b2s6OnJzcXVhcmU7CisgIGNhc2UgJ3snOiByZXR1cm4gbGx0b2s6OmxicmFjZTsKKyAgY2FzZSAnfSc6IHJldHVybiBsbHRvazo6cmJyYWNlOworICBjYXNlICc8JzogcmV0dXJuIGxsdG9rOjpsZXNzOworICBjYXNlICc+JzogcmV0dXJuIGxsdG9rOjpncmVhdGVyOworICBjYXNlICcoJzogcmV0dXJuIGxsdG9rOjpscGFyZW47CisgIGNhc2UgJyknOiByZXR1cm4gbGx0b2s6OnJwYXJlbjsKKyAgY2FzZSAnLCc6IHJldHVybiBsbHRvazo6Y29tbWE7CisgIGNhc2UgJyonOiByZXR1cm4gbGx0b2s6OnN0YXI7CisgIGNhc2UgJ1xcJzogcmV0dXJuIGxsdG9rOjpiYWNrc2xhc2g7CisgIH0KK30KKwordm9pZCBMTExleGVyOjpTa2lwTGluZUNvbW1lbnQoKSB7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKEN1clB0clswXSA9PSAnXG4nIHx8IEN1clB0clswXSA9PSAnXHInIHx8IGdldE5leHRDaGFyKCkgPT0gRU9GKQorICAgICAgcmV0dXJuOworICB9Cit9CisKKy8vLyBMZXhBdCAtIExleCBhbGwgdG9rZW5zIHRoYXQgc3RhcnQgd2l0aCBhbiBAIGNoYXJhY3RlcjoKKy8vLyAgIEdsb2JhbFZhciAgIEBcIlteXCJdKlwiCisvLy8gICBHbG9iYWxWYXIgICBAWy1hLXpBLVokLl9dWy1hLXpBLVokLl8wLTldKgorLy8vICAgR2xvYmFsVmFySUQgQFswLTldKworbGx0b2s6OktpbmQgTExMZXhlcjo6TGV4QXQoKSB7CisgIC8vIEhhbmRsZSBBdFN0cmluZ0NvbnN0YW50OiBAXCJbXlwiXSpcIgorICBpZiAoQ3VyUHRyWzBdID09ICciJykgeworICAgICsrQ3VyUHRyOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGludCBDdXJDaGFyID0gZ2V0TmV4dENoYXIoKTsKKworICAgICAgaWYgKEN1ckNoYXIgPT0gRU9GKSB7CisgICAgICAgIEVycm9yKCJlbmQgb2YgZmlsZSBpbiBnbG9iYWwgdmFyaWFibGUgbmFtZSIpOworICAgICAgICByZXR1cm4gbGx0b2s6OkVycm9yOworICAgICAgfQorICAgICAgaWYgKEN1ckNoYXIgPT0gJyInKSB7CisgICAgICAgIFN0clZhbC5hc3NpZ24oVG9rU3RhcnQrMiwgQ3VyUHRyLTEpOworICAgICAgICBVbkVzY2FwZUxleGVkKFN0clZhbCk7CisgICAgICAgIHJldHVybiBsbHRvazo6R2xvYmFsVmFyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEhhbmRsZSBHbG9iYWxWYXJOYW1lOiBAWy1hLXpBLVokLl9dWy1hLXpBLVokLl8wLTldKgorICBpZiAoaXNhbHBoYShDdXJQdHJbMF0pIHx8IEN1clB0clswXSA9PSAnLScgfHwgQ3VyUHRyWzBdID09ICckJyB8fAorICAgICAgQ3VyUHRyWzBdID09ICcuJyB8fCBDdXJQdHJbMF0gPT0gJ18nKSB7CisgICAgKytDdXJQdHI7CisgICAgd2hpbGUgKGlzYWxudW0oQ3VyUHRyWzBdKSB8fCBDdXJQdHJbMF0gPT0gJy0nIHx8IEN1clB0clswXSA9PSAnJCcgfHwKKyAgICAgICAgICAgQ3VyUHRyWzBdID09ICcuJyB8fCBDdXJQdHJbMF0gPT0gJ18nKQorICAgICAgKytDdXJQdHI7CisKKyAgICBTdHJWYWwuYXNzaWduKFRva1N0YXJ0KzEsIEN1clB0cik7ICAgLy8gU2tpcCBACisgICAgcmV0dXJuIGxsdG9rOjpHbG9iYWxWYXI7CisgIH0KKworICAvLyBIYW5kbGUgR2xvYmFsVmFySUQ6IEBbMC05XSsKKyAgaWYgKGlzZGlnaXQoQ3VyUHRyWzBdKSkgeworICAgIGZvciAoKytDdXJQdHI7IGlzZGlnaXQoQ3VyUHRyWzBdKTsgKytDdXJQdHIpCisgICAgICAvKmVtcHR5Ki87CisKKyAgICB1aW50NjRfdCBWYWwgPSBhdG91bGwoVG9rU3RhcnQrMSwgQ3VyUHRyKTsKKyAgICBpZiAoKHVuc2lnbmVkKVZhbCAhPSBWYWwpCisgICAgICBFcnJvcigiaW52YWxpZCB2YWx1ZSBudW1iZXIgKHRvbyBsYXJnZSkhIik7CisgICAgVUludFZhbCA9IHVuc2lnbmVkKFZhbCk7CisgICAgcmV0dXJuIGxsdG9rOjpHbG9iYWxJRDsKKyAgfQorCisgIHJldHVybiBsbHRvazo6RXJyb3I7Cit9CisKKworLy8vIExleFBlcmNlbnQgLSBMZXggYWxsIHRva2VucyB0aGF0IHN0YXJ0IHdpdGggYSAlIGNoYXJhY3RlcjoKKy8vLyAgIExvY2FsVmFyICAgOjo9ICVcIlteXCJdKlwiCisvLy8gICBMb2NhbFZhciAgIDo6PSAlWy1hLXpBLVokLl9dWy1hLXpBLVokLl8wLTldKgorLy8vICAgTG9jYWxWYXJJRCA6Oj0gJVswLTldKworbGx0b2s6OktpbmQgTExMZXhlcjo6TGV4UGVyY2VudCgpIHsKKyAgLy8gSGFuZGxlIExvY2FsVmFyTmFtZTogJVwiW15cIl0qXCIKKyAgaWYgKEN1clB0clswXSA9PSAnIicpIHsKKyAgICArK0N1clB0cjsKKworICAgIHdoaWxlICgxKSB7CisgICAgICBpbnQgQ3VyQ2hhciA9IGdldE5leHRDaGFyKCk7CisKKyAgICAgIGlmIChDdXJDaGFyID09IEVPRikgeworICAgICAgICBFcnJvcigiZW5kIG9mIGZpbGUgaW4gc3RyaW5nIGNvbnN0YW50Iik7CisgICAgICAgIHJldHVybiBsbHRvazo6RXJyb3I7CisgICAgICB9CisgICAgICBpZiAoQ3VyQ2hhciA9PSAnIicpIHsKKyAgICAgICAgU3RyVmFsLmFzc2lnbihUb2tTdGFydCsyLCBDdXJQdHItMSk7CisgICAgICAgIFVuRXNjYXBlTGV4ZWQoU3RyVmFsKTsKKyAgICAgICAgcmV0dXJuIGxsdG9rOjpMb2NhbFZhcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBIYW5kbGUgTG9jYWxWYXJOYW1lOiAlWy1hLXpBLVokLl9dWy1hLXpBLVokLl8wLTldKgorICBpZiAoaXNhbHBoYShDdXJQdHJbMF0pIHx8IEN1clB0clswXSA9PSAnLScgfHwgQ3VyUHRyWzBdID09ICckJyB8fAorICAgICAgQ3VyUHRyWzBdID09ICcuJyB8fCBDdXJQdHJbMF0gPT0gJ18nKSB7CisgICAgKytDdXJQdHI7CisgICAgd2hpbGUgKGlzYWxudW0oQ3VyUHRyWzBdKSB8fCBDdXJQdHJbMF0gPT0gJy0nIHx8IEN1clB0clswXSA9PSAnJCcgfHwKKyAgICAgICAgICAgQ3VyUHRyWzBdID09ICcuJyB8fCBDdXJQdHJbMF0gPT0gJ18nKQorICAgICAgKytDdXJQdHI7CisKKyAgICBTdHJWYWwuYXNzaWduKFRva1N0YXJ0KzEsIEN1clB0cik7ICAgLy8gU2tpcCAlCisgICAgcmV0dXJuIGxsdG9rOjpMb2NhbFZhcjsKKyAgfQorCisgIC8vIEhhbmRsZSBMb2NhbFZhcklEOiAlWzAtOV0rCisgIGlmIChpc2RpZ2l0KEN1clB0clswXSkpIHsKKyAgICBmb3IgKCsrQ3VyUHRyOyBpc2RpZ2l0KEN1clB0clswXSk7ICsrQ3VyUHRyKQorICAgICAgLyplbXB0eSovOworCisgICAgdWludDY0X3QgVmFsID0gYXRvdWxsKFRva1N0YXJ0KzEsIEN1clB0cik7CisgICAgaWYgKCh1bnNpZ25lZClWYWwgIT0gVmFsKQorICAgICAgRXJyb3IoImludmFsaWQgdmFsdWUgbnVtYmVyICh0b28gbGFyZ2UpISIpOworICAgIFVJbnRWYWwgPSB1bnNpZ25lZChWYWwpOworICAgIHJldHVybiBsbHRvazo6TG9jYWxWYXJJRDsKKyAgfQorCisgIHJldHVybiBsbHRvazo6RXJyb3I7Cit9CisKKy8vLyBMZXhRdW90ZSAtIExleCBhbGwgdG9rZW5zIHRoYXQgc3RhcnQgd2l0aCBhICIgY2hhcmFjdGVyOgorLy8vICAgUXVvdGVMYWJlbCAgICAgICAgIlteIl0rIjoKKy8vLyAgIFN0cmluZ0NvbnN0YW50ICAgICJbXiJdKiIKK2xsdG9rOjpLaW5kIExMTGV4ZXI6OkxleFF1b3RlKCkgeworICB3aGlsZSAoMSkgeworICAgIGludCBDdXJDaGFyID0gZ2V0TmV4dENoYXIoKTsKKworICAgIGlmIChDdXJDaGFyID09IEVPRikgeworICAgICAgRXJyb3IoImVuZCBvZiBmaWxlIGluIHF1b3RlZCBzdHJpbmciKTsKKyAgICAgIHJldHVybiBsbHRvazo6RXJyb3I7CisgICAgfQorCisgICAgaWYgKEN1ckNoYXIgIT0gJyInKSBjb250aW51ZTsKKworICAgIGlmIChDdXJQdHJbMF0gIT0gJzonKSB7CisgICAgICBTdHJWYWwuYXNzaWduKFRva1N0YXJ0KzEsIEN1clB0ci0xKTsKKyAgICAgIFVuRXNjYXBlTGV4ZWQoU3RyVmFsKTsKKyAgICAgIHJldHVybiBsbHRvazo6U3RyaW5nQ29uc3RhbnQ7CisgICAgfQorCisgICAgKytDdXJQdHI7CisgICAgU3RyVmFsLmFzc2lnbihUb2tTdGFydCsxLCBDdXJQdHItMik7CisgICAgVW5Fc2NhcGVMZXhlZChTdHJWYWwpOworICAgIHJldHVybiBsbHRvazo6TGFiZWxTdHI7CisgIH0KK30KKworc3RhdGljIGJvb2wgSnVzdFdoaXRlc3BhY2VOZXdMaW5lKGNvbnN0IGNoYXIgKiZQdHIpIHsKKyAgY29uc3QgY2hhciAqVGhpc1B0ciA9IFB0cjsKKyAgd2hpbGUgKCpUaGlzUHRyID09ICcgJyB8fCAqVGhpc1B0ciA9PSAnXHQnKQorICAgICsrVGhpc1B0cjsKKyAgaWYgKCpUaGlzUHRyID09ICdcbicgfHwgKlRoaXNQdHIgPT0gJ1xyJykgeworICAgIFB0ciA9IFRoaXNQdHI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gTGV4RXhjbGFpbToKKy8vLyAgICAhZm9vCisvLy8gICAgIQorbGx0b2s6OktpbmQgTExMZXhlcjo6TGV4RXhjbGFpbSgpIHsKKyAgLy8gTGV4IGEgbWV0YWRhdGEgbmFtZSBhcyBhIE1ldGFkYXRhVmFyLgorICBpZiAoaXNhbHBoYShDdXJQdHJbMF0pKSB7CisgICAgKytDdXJQdHI7CisgICAgd2hpbGUgKGlzYWxudW0oQ3VyUHRyWzBdKSB8fCBDdXJQdHJbMF0gPT0gJy0nIHx8IEN1clB0clswXSA9PSAnJCcgfHwKKyAgICAgICAgICAgQ3VyUHRyWzBdID09ICcuJyB8fCBDdXJQdHJbMF0gPT0gJ18nKQorICAgICAgKytDdXJQdHI7CisKKyAgICBTdHJWYWwuYXNzaWduKFRva1N0YXJ0KzEsIEN1clB0cik7ICAgLy8gU2tpcCAhCisgICAgcmV0dXJuIGxsdG9rOjpNZXRhZGF0YVZhcjsKKyAgfQorICByZXR1cm4gbGx0b2s6OmV4Y2xhaW07Cit9CisgIAorLy8vIExleElkZW50aWZpZXI6IEhhbmRsZSBzZXZlcmFsIHJlbGF0ZWQgcHJvZHVjdGlvbnM6CisvLy8gICAgTGFiZWwgICAgICAgICAgIFstYS16QS1aJC5fMC05XSs6CisvLy8gICAgSW50ZWdlclR5cGUgICAgIGlbMC05XSsKKy8vLyAgICBLZXl3b3JkICAgICAgICAgc2RpdiwgZmxvYXQsIC4uLgorLy8vICAgIEhleEludENvbnN0YW50ICBbdXNdMHhbMC05QS1GYS1mXSsKK2xsdG9rOjpLaW5kIExMTGV4ZXI6OkxleElkZW50aWZpZXIoKSB7CisgIGNvbnN0IGNoYXIgKlN0YXJ0Q2hhciA9IEN1clB0cjsKKyAgY29uc3QgY2hhciAqSW50RW5kID0gQ3VyUHRyWy0xXSA9PSAnaScgPyAwIDogU3RhcnRDaGFyOworICBjb25zdCBjaGFyICpLZXl3b3JkRW5kID0gMDsKKworICBmb3IgKDsgaXNMYWJlbENoYXIoKkN1clB0cik7ICsrQ3VyUHRyKSB7CisgICAgLy8gSWYgd2UgZGVjaWRlIHRoaXMgaXMgYW4gaW50ZWdlciwgcmVtZW1iZXIgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuCisgICAgaWYgKCFJbnRFbmQgJiYgIWlzZGlnaXQoKkN1clB0cikpIEludEVuZCA9IEN1clB0cjsKKyAgICBpZiAoIUtleXdvcmRFbmQgJiYgIWlzYWxudW0oKkN1clB0cikgJiYgKkN1clB0ciAhPSAnXycpIEtleXdvcmRFbmQgPSBDdXJQdHI7CisgIH0KKworICAvLyBJZiB3ZSBzdG9wcGVkIGR1ZSB0byBhIGNvbG9uLCB0aGlzIHJlYWxseSBpcyBhIGxhYmVsLgorICBpZiAoKkN1clB0ciA9PSAnOicpIHsKKyAgICBTdHJWYWwuYXNzaWduKFN0YXJ0Q2hhci0xLCBDdXJQdHIrKyk7CisgICAgcmV0dXJuIGxsdG9rOjpMYWJlbFN0cjsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgdGhpcyB3YXNuJ3QgYSBsYWJlbC4gIElmIHRoaXMgd2FzIHZhbGlkIGFzIGFuIGludGVnZXIgdHlwZSwKKyAgLy8gcmV0dXJuIGl0LgorICBpZiAoSW50RW5kID09IDApIEludEVuZCA9IEN1clB0cjsKKyAgaWYgKEludEVuZCAhPSBTdGFydENoYXIpIHsKKyAgICBDdXJQdHIgPSBJbnRFbmQ7CisgICAgdWludDY0X3QgTnVtQml0cyA9IGF0b3VsbChTdGFydENoYXIsIEN1clB0cik7CisgICAgaWYgKE51bUJpdHMgPCBJbnRlZ2VyVHlwZTo6TUlOX0lOVF9CSVRTIHx8CisgICAgICAgIE51bUJpdHMgPiBJbnRlZ2VyVHlwZTo6TUFYX0lOVF9CSVRTKSB7CisgICAgICBFcnJvcigiYml0d2lkdGggZm9yIGludGVnZXIgdHlwZSBvdXQgb2YgcmFuZ2UhIik7CisgICAgICByZXR1cm4gbGx0b2s6OkVycm9yOworICAgIH0KKyAgICBUeVZhbCA9IEludGVnZXJUeXBlOjpnZXQoQ29udGV4dCwgTnVtQml0cyk7CisgICAgcmV0dXJuIGxsdG9rOjpUeXBlOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIHdhcyBhIGxldHRlciBzZXF1ZW5jZS4gIFNlZSB3aGljaCBrZXl3b3JkIHRoaXMgaXMuCisgIGlmIChLZXl3b3JkRW5kID09IDApIEtleXdvcmRFbmQgPSBDdXJQdHI7CisgIEN1clB0ciA9IEtleXdvcmRFbmQ7CisgIC0tU3RhcnRDaGFyOworICB1bnNpZ25lZCBMZW4gPSBDdXJQdHItU3RhcnRDaGFyOworI2RlZmluZSBLRVlXT1JEKFNUUikgXAorICBpZiAoTGVuID09IHN0cmxlbigjU1RSKSAmJiAhbWVtY21wKFN0YXJ0Q2hhciwgI1NUUiwgc3RybGVuKCNTVFIpKSkgXAorICAgIHJldHVybiBsbHRvazo6a3dfIyNTVFI7CisKKyAgS0VZV09SRChiZWdpbik7ICAgS0VZV09SRChlbmQpOworICBLRVlXT1JEKHRydWUpOyAgICBLRVlXT1JEKGZhbHNlKTsKKyAgS0VZV09SRChkZWNsYXJlKTsgS0VZV09SRChkZWZpbmUpOworICBLRVlXT1JEKGdsb2JhbCk7ICBLRVlXT1JEKGNvbnN0YW50KTsKKworICBLRVlXT1JEKHByaXZhdGUpOworICBLRVlXT1JEKGxpbmtlcl9wcml2YXRlKTsKKyAgS0VZV09SRChsaW5rZXJfcHJpdmF0ZV93ZWFrKTsKKyAgS0VZV09SRChpbnRlcm5hbCk7CisgIEtFWVdPUkQoYXZhaWxhYmxlX2V4dGVybmFsbHkpOworICBLRVlXT1JEKGxpbmtvbmNlKTsKKyAgS0VZV09SRChsaW5rb25jZV9vZHIpOworICBLRVlXT1JEKHdlYWspOworICBLRVlXT1JEKHdlYWtfb2RyKTsKKyAgS0VZV09SRChhcHBlbmRpbmcpOworICBLRVlXT1JEKGRsbGltcG9ydCk7CisgIEtFWVdPUkQoZGxsZXhwb3J0KTsKKyAgS0VZV09SRChjb21tb24pOworICBLRVlXT1JEKGRlZmF1bHQpOworICBLRVlXT1JEKGhpZGRlbik7CisgIEtFWVdPUkQocHJvdGVjdGVkKTsKKyAgS0VZV09SRChleHRlcm5fd2Vhayk7CisgIEtFWVdPUkQoZXh0ZXJuYWwpOworICBLRVlXT1JEKHRocmVhZF9sb2NhbCk7CisgIEtFWVdPUkQoemVyb2luaXRpYWxpemVyKTsKKyAgS0VZV09SRCh1bmRlZik7CisgIEtFWVdPUkQobnVsbCk7CisgIEtFWVdPUkQodG8pOworICBLRVlXT1JEKHRhaWwpOworICBLRVlXT1JEKHRhcmdldCk7CisgIEtFWVdPUkQodHJpcGxlKTsKKyAgS0VZV09SRChkZXBsaWJzKTsKKyAgS0VZV09SRChkYXRhbGF5b3V0KTsKKyAgS0VZV09SRCh2b2xhdGlsZSk7CisgIEtFWVdPUkQobnV3KTsKKyAgS0VZV09SRChuc3cpOworICBLRVlXT1JEKGV4YWN0KTsKKyAgS0VZV09SRChpbmJvdW5kcyk7CisgIEtFWVdPUkQoYWxpZ24pOworICBLRVlXT1JEKGFkZHJzcGFjZSk7CisgIEtFWVdPUkQoc2VjdGlvbik7CisgIEtFWVdPUkQoYWxpYXMpOworICBLRVlXT1JEKG1vZHVsZSk7CisgIEtFWVdPUkQoYXNtKTsKKyAgS0VZV09SRChzaWRlZWZmZWN0KTsKKyAgS0VZV09SRChhbGlnbnN0YWNrKTsKKyAgS0VZV09SRChnYyk7CisKKyAgS0VZV09SRChjY2MpOworICBLRVlXT1JEKGZhc3RjYyk7CisgIEtFWVdPUkQoY29sZGNjKTsKKyAgS0VZV09SRCh4ODZfc3RkY2FsbGNjKTsKKyAgS0VZV09SRCh4ODZfZmFzdGNhbGxjYyk7CisgIEtFWVdPUkQoeDg2X3RoaXNjYWxsY2MpOworICBLRVlXT1JEKGFybV9hcGNzY2MpOworICBLRVlXT1JEKGFybV9hYXBjc2NjKTsKKyAgS0VZV09SRChhcm1fYWFwY3NfdmZwY2MpOworICBLRVlXT1JEKG1zcDQzMF9pbnRyY2MpOworCisgIEtFWVdPUkQoY2MpOworICBLRVlXT1JEKGMpOworCisgIEtFWVdPUkQoc2lnbmV4dCk7CisgIEtFWVdPUkQoemVyb2V4dCk7CisgIEtFWVdPUkQoaW5yZWcpOworICBLRVlXT1JEKHNyZXQpOworICBLRVlXT1JEKG5vdW53aW5kKTsKKyAgS0VZV09SRChub3JldHVybik7CisgIEtFWVdPUkQobm9hbGlhcyk7CisgIEtFWVdPUkQobm9jYXB0dXJlKTsKKyAgS0VZV09SRChieXZhbCk7CisgIEtFWVdPUkQobmVzdCk7CisgIEtFWVdPUkQocmVhZG5vbmUpOworICBLRVlXT1JEKHJlYWRvbmx5KTsKKworICBLRVlXT1JEKGlubGluZWhpbnQpOworICBLRVlXT1JEKG5vaW5saW5lKTsKKyAgS0VZV09SRChhbHdheXNpbmxpbmUpOworICBLRVlXT1JEKG9wdHNpemUpOworICBLRVlXT1JEKHNzcCk7CisgIEtFWVdPUkQoc3NwcmVxKTsKKyAgS0VZV09SRChub3JlZHpvbmUpOworICBLRVlXT1JEKG5vaW1wbGljaXRmbG9hdCk7CisgIEtFWVdPUkQobmFrZWQpOworCisgIEtFWVdPUkQodHlwZSk7CisgIEtFWVdPUkQob3BhcXVlKTsKKyAgS0VZV09SRCh1bmlvbik7CisKKyAgS0VZV09SRChlcSk7IEtFWVdPUkQobmUpOyBLRVlXT1JEKHNsdCk7IEtFWVdPUkQoc2d0KTsgS0VZV09SRChzbGUpOworICBLRVlXT1JEKHNnZSk7IEtFWVdPUkQodWx0KTsgS0VZV09SRCh1Z3QpOyBLRVlXT1JEKHVsZSk7IEtFWVdPUkQodWdlKTsKKyAgS0VZV09SRChvZXEpOyBLRVlXT1JEKG9uZSk7IEtFWVdPUkQob2x0KTsgS0VZV09SRChvZ3QpOyBLRVlXT1JEKG9sZSk7CisgIEtFWVdPUkQob2dlKTsgS0VZV09SRChvcmQpOyBLRVlXT1JEKHVubyk7IEtFWVdPUkQodWVxKTsgS0VZV09SRCh1bmUpOworCisgIEtFWVdPUkQoeCk7CisgIEtFWVdPUkQoYmxvY2thZGRyZXNzKTsKKyN1bmRlZiBLRVlXT1JECisKKyAgLy8gS2V5d29yZHMgZm9yIHR5cGVzLgorI2RlZmluZSBUWVBFS0VZV09SRChTVFIsIExMVk1UWSkgXAorICBpZiAoTGVuID09IHN0cmxlbihTVFIpICYmICFtZW1jbXAoU3RhcnRDaGFyLCBTVFIsIHN0cmxlbihTVFIpKSkgeyBcCisgICAgVHlWYWwgPSBMTFZNVFk7IHJldHVybiBsbHRvazo6VHlwZTsgfQorICBUWVBFS0VZV09SRCgidm9pZCIsICAgICAgVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpKTsKKyAgVFlQRUtFWVdPUkQoImZsb2F0IiwgICAgIFR5cGU6OmdldEZsb2F0VHkoQ29udGV4dCkpOworICBUWVBFS0VZV09SRCgiZG91YmxlIiwgICAgVHlwZTo6Z2V0RG91YmxlVHkoQ29udGV4dCkpOworICBUWVBFS0VZV09SRCgieDg2X2ZwODAiLCAgVHlwZTo6Z2V0WDg2X0ZQODBUeShDb250ZXh0KSk7CisgIFRZUEVLRVlXT1JEKCJmcDEyOCIsICAgICBUeXBlOjpnZXRGUDEyOFR5KENvbnRleHQpKTsKKyAgVFlQRUtFWVdPUkQoInBwY19mcDEyOCIsIFR5cGU6OmdldFBQQ19GUDEyOFR5KENvbnRleHQpKTsKKyAgVFlQRUtFWVdPUkQoImxhYmVsIiwgICAgIFR5cGU6OmdldExhYmVsVHkoQ29udGV4dCkpOworICBUWVBFS0VZV09SRCgibWV0YWRhdGEiLCAgVHlwZTo6Z2V0TWV0YWRhdGFUeShDb250ZXh0KSk7CisjdW5kZWYgVFlQRUtFWVdPUkQKKworICAvLyBIYW5kbGUgc3BlY2lhbCBmb3JtcyBmb3IgYXV0b3VwZ3JhZGluZy4gIERyb3AgdGhlc2UgaW4gTExWTSAzLjAuICBUaGlzIGlzCisgIC8vIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGggdGhlIHNleHQvemV4dCBpbnN0cnVjdGlvbnMsIGJlbG93LgorICBpZiAoTGVuID09IDQgJiYgIW1lbWNtcChTdGFydENoYXIsICJzZXh0IiwgNCkpIHsKKyAgICAvLyBTY2FuIEN1clB0ciBhaGVhZCwgc2VlaW5nIGlmIHRoZXJlIGlzIGp1c3Qgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIG5ld2xpbmUuCisgICAgaWYgKEp1c3RXaGl0ZXNwYWNlTmV3TGluZShDdXJQdHIpKQorICAgICAgcmV0dXJuIGxsdG9rOjprd19zaWduZXh0OworICB9IGVsc2UgaWYgKExlbiA9PSA0ICYmICFtZW1jbXAoU3RhcnRDaGFyLCAiemV4dCIsIDQpKSB7CisgICAgLy8gU2NhbiBDdXJQdHIgYWhlYWQsIHNlZWluZyBpZiB0aGVyZSBpcyBqdXN0IHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBuZXdsaW5lLgorICAgIGlmIChKdXN0V2hpdGVzcGFjZU5ld0xpbmUoQ3VyUHRyKSkKKyAgICAgIHJldHVybiBsbHRvazo6a3dfemVyb2V4dDsKKyAgfSBlbHNlIGlmIChMZW4gPT0gNiAmJiAhbWVtY21wKFN0YXJ0Q2hhciwgIm1hbGxvYyIsIDYpKSB7CisgICAgLy8gRklYTUU6IFJlbW92ZSBpbiBMTFZNIDMuMC4KKyAgICAvLyBBdXRvdXBncmFkZSBtYWxsb2MgaW5zdHJ1Y3Rpb24uCisgICAgcmV0dXJuIGxsdG9rOjprd19tYWxsb2M7CisgIH0gZWxzZSBpZiAoTGVuID09IDQgJiYgIW1lbWNtcChTdGFydENoYXIsICJmcmVlIiwgNCkpIHsKKyAgICAvLyBGSVhNRTogUmVtb3ZlIGluIExMVk0gMy4wLgorICAgIC8vIEF1dG91cGdyYWRlIG1hbGxvYyBpbnN0cnVjdGlvbi4KKyAgICByZXR1cm4gbGx0b2s6Omt3X2ZyZWU7CisgIH0KKworICAvLyBLZXl3b3JkcyBmb3IgaW5zdHJ1Y3Rpb25zLgorI2RlZmluZSBJTlNUS0VZV09SRChTVFIsIEVudW0pIFwKKyAgaWYgKExlbiA9PSBzdHJsZW4oI1NUUikgJiYgIW1lbWNtcChTdGFydENoYXIsICNTVFIsIHN0cmxlbigjU1RSKSkpIHsgXAorICAgIFVJbnRWYWwgPSBJbnN0cnVjdGlvbjo6RW51bTsgcmV0dXJuIGxsdG9rOjprd18jI1NUUjsgfQorCisgIElOU1RLRVlXT1JEKGFkZCwgICBBZGQpOyAgSU5TVEtFWVdPUkQoZmFkZCwgICBGQWRkKTsKKyAgSU5TVEtFWVdPUkQoc3ViLCAgIFN1Yik7ICBJTlNUS0VZV09SRChmc3ViLCAgIEZTdWIpOworICBJTlNUS0VZV09SRChtdWwsICAgTXVsKTsgIElOU1RLRVlXT1JEKGZtdWwsICAgRk11bCk7CisgIElOU1RLRVlXT1JEKHVkaXYsICBVRGl2KTsgSU5TVEtFWVdPUkQoc2RpdiwgIFNEaXYpOyBJTlNUS0VZV09SRChmZGl2LCAgRkRpdik7CisgIElOU1RLRVlXT1JEKHVyZW0sICBVUmVtKTsgSU5TVEtFWVdPUkQoc3JlbSwgIFNSZW0pOyBJTlNUS0VZV09SRChmcmVtLCAgRlJlbSk7CisgIElOU1RLRVlXT1JEKHNobCwgICBTaGwpOyAgSU5TVEtFWVdPUkQobHNociwgIExTaHIpOyBJTlNUS0VZV09SRChhc2hyLCAgQVNocik7CisgIElOU1RLRVlXT1JEKGFuZCwgICBBbmQpOyAgSU5TVEtFWVdPUkQob3IsICAgIE9yKTsgICBJTlNUS0VZV09SRCh4b3IsICAgWG9yKTsKKyAgSU5TVEtFWVdPUkQoaWNtcCwgIElDbXApOyBJTlNUS0VZV09SRChmY21wLCAgRkNtcCk7CisKKyAgSU5TVEtFWVdPUkQocGhpLCAgICAgICAgIFBISSk7CisgIElOU1RLRVlXT1JEKGNhbGwsICAgICAgICBDYWxsKTsKKyAgSU5TVEtFWVdPUkQodHJ1bmMsICAgICAgIFRydW5jKTsKKyAgSU5TVEtFWVdPUkQoemV4dCwgICAgICAgIFpFeHQpOworICBJTlNUS0VZV09SRChzZXh0LCAgICAgICAgU0V4dCk7CisgIElOU1RLRVlXT1JEKGZwdHJ1bmMsICAgICBGUFRydW5jKTsKKyAgSU5TVEtFWVdPUkQoZnBleHQsICAgICAgIEZQRXh0KTsKKyAgSU5TVEtFWVdPUkQodWl0b2ZwLCAgICAgIFVJVG9GUCk7CisgIElOU1RLRVlXT1JEKHNpdG9mcCwgICAgICBTSVRvRlApOworICBJTlNUS0VZV09SRChmcHRvdWksICAgICAgRlBUb1VJKTsKKyAgSU5TVEtFWVdPUkQoZnB0b3NpLCAgICAgIEZQVG9TSSk7CisgIElOU1RLRVlXT1JEKGludHRvcHRyLCAgICBJbnRUb1B0cik7CisgIElOU1RLRVlXT1JEKHB0cnRvaW50LCAgICBQdHJUb0ludCk7CisgIElOU1RLRVlXT1JEKGJpdGNhc3QsICAgICBCaXRDYXN0KTsKKyAgSU5TVEtFWVdPUkQoc2VsZWN0LCAgICAgIFNlbGVjdCk7CisgIElOU1RLRVlXT1JEKHZhX2FyZywgICAgICBWQUFyZyk7CisgIElOU1RLRVlXT1JEKHJldCwgICAgICAgICBSZXQpOworICBJTlNUS0VZV09SRChiciwgICAgICAgICAgQnIpOworICBJTlNUS0VZV09SRChzd2l0Y2gsICAgICAgU3dpdGNoKTsKKyAgSU5TVEtFWVdPUkQoaW5kaXJlY3RiciwgIEluZGlyZWN0QnIpOworICBJTlNUS0VZV09SRChpbnZva2UsICAgICAgSW52b2tlKTsKKyAgSU5TVEtFWVdPUkQodW53aW5kLCAgICAgIFVud2luZCk7CisgIElOU1RLRVlXT1JEKHVucmVhY2hhYmxlLCBVbnJlYWNoYWJsZSk7CisKKyAgSU5TVEtFWVdPUkQoYWxsb2NhLCAgICAgIEFsbG9jYSk7CisgIElOU1RLRVlXT1JEKGxvYWQsICAgICAgICBMb2FkKTsKKyAgSU5TVEtFWVdPUkQoc3RvcmUsICAgICAgIFN0b3JlKTsKKyAgSU5TVEtFWVdPUkQoZ2V0ZWxlbWVudHB0ciwgR2V0RWxlbWVudFB0cik7CisKKyAgSU5TVEtFWVdPUkQoZXh0cmFjdGVsZW1lbnQsIEV4dHJhY3RFbGVtZW50KTsKKyAgSU5TVEtFWVdPUkQoaW5zZXJ0ZWxlbWVudCwgIEluc2VydEVsZW1lbnQpOworICBJTlNUS0VZV09SRChzaHVmZmxldmVjdG9yLCAgU2h1ZmZsZVZlY3Rvcik7CisgIElOU1RLRVlXT1JEKGdldHJlc3VsdCwgICAgICBFeHRyYWN0VmFsdWUpOworICBJTlNUS0VZV09SRChleHRyYWN0dmFsdWUsICAgRXh0cmFjdFZhbHVlKTsKKyAgSU5TVEtFWVdPUkQoaW5zZXJ0dmFsdWUsICAgIEluc2VydFZhbHVlKTsKKyN1bmRlZiBJTlNUS0VZV09SRAorCisgIC8vIENoZWNrIGZvciBbdXNdMHhbMC05QS1GYS1mXSsgd2hpY2ggYXJlIEhleGFkZWNpbWFsIGNvbnN0YW50IGdlbmVyYXRlZCBieQorICAvLyB0aGUgQ0ZFIHRvIGF2b2lkIGZvcmNpbmcgaXQgdG8gZGVhbCB3aXRoIDY0LWJpdCBudW1iZXJzLgorICBpZiAoKFRva1N0YXJ0WzBdID09ICd1JyB8fCBUb2tTdGFydFswXSA9PSAncycpICYmCisgICAgICBUb2tTdGFydFsxXSA9PSAnMCcgJiYgVG9rU3RhcnRbMl0gPT0gJ3gnICYmIGlzeGRpZ2l0KFRva1N0YXJ0WzNdKSkgeworICAgIGludCBsZW4gPSBDdXJQdHItVG9rU3RhcnQtMzsKKyAgICB1aW50MzJfdCBiaXRzID0gbGVuICogNDsKKyAgICBBUEludCBUbXAoYml0cywgU3RyaW5nUmVmKFRva1N0YXJ0KzMsIGxlbiksIDE2KTsKKyAgICB1aW50MzJfdCBhY3RpdmVCaXRzID0gVG1wLmdldEFjdGl2ZUJpdHMoKTsKKyAgICBpZiAoYWN0aXZlQml0cyA+IDAgJiYgYWN0aXZlQml0cyA8IGJpdHMpCisgICAgICBUbXAudHJ1bmMoYWN0aXZlQml0cyk7CisgICAgQVBTSW50VmFsID0gQVBTSW50KFRtcCwgVG9rU3RhcnRbMF0gPT0gJ3UnKTsKKyAgICByZXR1cm4gbGx0b2s6OkFQU0ludDsKKyAgfQorCisgIC8vIElmIHRoaXMgaXMgImNjMTIzNCIsIHJldHVybiB0aGlzIGFzIGp1c3QgImNjIi4KKyAgaWYgKFRva1N0YXJ0WzBdID09ICdjJyAmJiBUb2tTdGFydFsxXSA9PSAnYycpIHsKKyAgICBDdXJQdHIgPSBUb2tTdGFydCsyOworICAgIHJldHVybiBsbHRvazo6a3dfY2M7CisgIH0KKworICAvLyBJZiB0aGlzIHN0YXJ0cyB3aXRoICJjYWxsIiwgcmV0dXJuIGl0IGFzIENBTEwuICBUaGlzIGlzIHRvIHN1cHBvcnQgb2xkCisgIC8vIGJyb2tlbiAubGwgZmlsZXMuICBGSVhNRTogcmVtb3ZlIHRoaXMgd2l0aCBMTFZNIDMuMC4KKyAgaWYgKEN1clB0ci1Ub2tTdGFydCA+IDQgJiYgIW1lbWNtcChUb2tTdGFydCwgImNhbGwiLCA0KSkgeworICAgIEN1clB0ciA9IFRva1N0YXJ0KzQ7CisgICAgVUludFZhbCA9IEluc3RydWN0aW9uOjpDYWxsOworICAgIHJldHVybiBsbHRvazo6a3dfY2FsbDsKKyAgfQorCisgIC8vIEZpbmFsbHksIGlmIHRoaXMgaXNuJ3Qga25vd24sIHJldHVybiBhbiBlcnJvci4KKyAgQ3VyUHRyID0gVG9rU3RhcnQrMTsKKyAgcmV0dXJuIGxsdG9rOjpFcnJvcjsKK30KKworCisvLy8gTGV4MHg6IEhhbmRsZSBwcm9kdWN0aW9ucyB0aGF0IHN0YXJ0IHdpdGggMHgsIGtub3dpbmcgdGhhdCBpdCBtYXRjaGVzIGFuZAorLy8vIHRoYXQgdGhpcyBpcyBub3QgYSBsYWJlbDoKKy8vLyAgICBIZXhGUENvbnN0YW50ICAgICAweFswLTlBLUZhLWZdKworLy8vICAgIEhleEZQODBDb25zdGFudCAgIDB4S1swLTlBLUZhLWZdKworLy8vICAgIEhleEZQMTI4Q29uc3RhbnQgIDB4TFswLTlBLUZhLWZdKworLy8vICAgIEhleFBQQzEyOENvbnN0YW50IDB4TVswLTlBLUZhLWZdKworbGx0b2s6OktpbmQgTExMZXhlcjo6TGV4MHgoKSB7CisgIEN1clB0ciA9IFRva1N0YXJ0ICsgMjsKKworICBjaGFyIEtpbmQ7CisgIGlmIChDdXJQdHJbMF0gPj0gJ0snICYmIEN1clB0clswXSA8PSAnTScpIHsKKyAgICBLaW5kID0gKkN1clB0cisrOworICB9IGVsc2UgeworICAgIEtpbmQgPSAnSic7CisgIH0KKworICBpZiAoIWlzeGRpZ2l0KEN1clB0clswXSkpIHsKKyAgICAvLyBCYWQgdG9rZW4sIHJldHVybiBpdCBhcyBhbiBlcnJvci4KKyAgICBDdXJQdHIgPSBUb2tTdGFydCsxOworICAgIHJldHVybiBsbHRvazo6RXJyb3I7CisgIH0KKworICB3aGlsZSAoaXN4ZGlnaXQoQ3VyUHRyWzBdKSkKKyAgICArK0N1clB0cjsKKworICBpZiAoS2luZCA9PSAnSicpIHsKKyAgICAvLyBIZXhGUENvbnN0YW50IC0gRmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgcmVwcmVzZW50ZWQgaW4gSUVFRSBmb3JtYXQgYXMgYQorICAgIC8vIGhleGFkZWNpbWFsIG51bWJlciBmb3Igd2hlbiBleHBvbmVudGlhbCBub3RhdGlvbiBpcyBub3QgcHJlY2lzZSBlbm91Z2guCisgICAgLy8gRmxvYXQgYW5kIGRvdWJsZSBvbmx5LgorICAgIEFQRmxvYXRWYWwgPSBBUEZsb2F0KEJpdHNUb0RvdWJsZShIZXhJbnRUb1ZhbChUb2tTdGFydCsyLCBDdXJQdHIpKSk7CisgICAgcmV0dXJuIGxsdG9rOjpBUEZsb2F0OworICB9CisKKyAgdWludDY0X3QgUGFpclsyXTsKKyAgc3dpdGNoIChLaW5kKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24ga2luZCEiKTsKKyAgY2FzZSAnSyc6CisgICAgLy8gRjgwSGV4RlBDb25zdGFudCAtIHg4NyBsb25nIGRvdWJsZSBpbiBoZXhhZGVjaW1hbCBmb3JtYXQgKDEwIGJ5dGVzKQorICAgIEZQODBIZXhUb0ludFBhaXIoVG9rU3RhcnQrMywgQ3VyUHRyLCBQYWlyKTsKKyAgICBBUEZsb2F0VmFsID0gQVBGbG9hdChBUEludCg4MCwgMiwgUGFpcikpOworICAgIHJldHVybiBsbHRvazo6QVBGbG9hdDsKKyAgY2FzZSAnTCc6CisgICAgLy8gRjEyOEhleEZQQ29uc3RhbnQgLSBJRUVFIDEyOC1iaXQgaW4gaGV4YWRlY2ltYWwgZm9ybWF0ICgxNiBieXRlcykKKyAgICBIZXhUb0ludFBhaXIoVG9rU3RhcnQrMywgQ3VyUHRyLCBQYWlyKTsKKyAgICBBUEZsb2F0VmFsID0gQVBGbG9hdChBUEludCgxMjgsIDIsIFBhaXIpLCB0cnVlKTsKKyAgICByZXR1cm4gbGx0b2s6OkFQRmxvYXQ7CisgIGNhc2UgJ00nOgorICAgIC8vIFBQQzEyOEhleEZQQ29uc3RhbnQgLSBQb3dlclBDIDEyOC1iaXQgaW4gaGV4YWRlY2ltYWwgZm9ybWF0ICgxNiBieXRlcykKKyAgICBIZXhUb0ludFBhaXIoVG9rU3RhcnQrMywgQ3VyUHRyLCBQYWlyKTsKKyAgICBBUEZsb2F0VmFsID0gQVBGbG9hdChBUEludCgxMjgsIDIsIFBhaXIpKTsKKyAgICByZXR1cm4gbGx0b2s6OkFQRmxvYXQ7CisgIH0KK30KKworLy8vIExleElkZW50aWZpZXI6IEhhbmRsZSBzZXZlcmFsIHJlbGF0ZWQgcHJvZHVjdGlvbnM6CisvLy8gICAgTGFiZWwgICAgICAgICAgICAgWy1hLXpBLVokLl8wLTldKzoKKy8vLyAgICBOSW50ZWdlciAgICAgICAgICAtWzAtOV0rCisvLy8gICAgRlBDb25zdGFudCAgICAgICAgWy0rXT9bMC05XStbLl1bMC05XSooW2VFXVstK10/WzAtOV0rKT8KKy8vLyAgICBQSW50ZWdlciAgICAgICAgICBbMC05XSsKKy8vLyAgICBIZXhGUENvbnN0YW50ICAgICAweFswLTlBLUZhLWZdKworLy8vICAgIEhleEZQODBDb25zdGFudCAgIDB4S1swLTlBLUZhLWZdKworLy8vICAgIEhleEZQMTI4Q29uc3RhbnQgIDB4TFswLTlBLUZhLWZdKworLy8vICAgIEhleFBQQzEyOENvbnN0YW50IDB4TVswLTlBLUZhLWZdKworbGx0b2s6OktpbmQgTExMZXhlcjo6TGV4RGlnaXRPck5lZ2F0aXZlKCkgeworICAvLyBJZiB0aGUgbGV0dGVyIGFmdGVyIHRoZSBuZWdhdGl2ZSBpcyBhIG51bWJlciwgdGhpcyBpcyBwcm9iYWJseSBhIGxhYmVsLgorICBpZiAoIWlzZGlnaXQoVG9rU3RhcnRbMF0pICYmICFpc2RpZ2l0KEN1clB0clswXSkpIHsKKyAgICAvLyBPa2F5LCB0aGlzIGlzIG5vdCBhIG51bWJlciBhZnRlciB0aGUgLSwgaXQncyBwcm9iYWJseSBhIGxhYmVsLgorICAgIGlmIChjb25zdCBjaGFyICpFbmQgPSBpc0xhYmVsVGFpbChDdXJQdHIpKSB7CisgICAgICBTdHJWYWwuYXNzaWduKFRva1N0YXJ0LCBFbmQtMSk7CisgICAgICBDdXJQdHIgPSBFbmQ7CisgICAgICByZXR1cm4gbGx0b2s6OkxhYmVsU3RyOworICAgIH0KKworICAgIHJldHVybiBsbHRvazo6RXJyb3I7CisgIH0KKworICAvLyBBdCB0aGlzIHBvaW50LCBpdCBpcyBlaXRoZXIgYSBsYWJlbCwgaW50IG9yIGZwIGNvbnN0YW50LgorCisgIC8vIFNraXAgZGlnaXRzLCB3ZSBoYXZlIGF0IGxlYXN0IG9uZS4KKyAgZm9yICg7IGlzZGlnaXQoQ3VyUHRyWzBdKTsgKytDdXJQdHIpCisgICAgLyplbXB0eSovOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHJlYWxseSBpcyBhIGxhYmVsIGFmdGVyYWxsLCBlLmcuICItMToiLgorICBpZiAoaXNMYWJlbENoYXIoQ3VyUHRyWzBdKSB8fCBDdXJQdHJbMF0gPT0gJzonKSB7CisgICAgaWYgKGNvbnN0IGNoYXIgKkVuZCA9IGlzTGFiZWxUYWlsKEN1clB0cikpIHsKKyAgICAgIFN0clZhbC5hc3NpZ24oVG9rU3RhcnQsIEVuZC0xKTsKKyAgICAgIEN1clB0ciA9IEVuZDsKKyAgICAgIHJldHVybiBsbHRvazo6TGFiZWxTdHI7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgJy4nLCB0aGVuIGl0IGlzIGEgZnAgdmFsdWUsIG90aGVyd2lzZSBpdHMKKyAgLy8gaW50ZWdlci4KKyAgaWYgKEN1clB0clswXSAhPSAnLicpIHsKKyAgICBpZiAoVG9rU3RhcnRbMF0gPT0gJzAnICYmIFRva1N0YXJ0WzFdID09ICd4JykKKyAgICAgIHJldHVybiBMZXgweCgpOworICAgIHVuc2lnbmVkIExlbiA9IEN1clB0ci1Ub2tTdGFydDsKKyAgICB1aW50MzJfdCBudW1CaXRzID0gKChMZW4gKiA2NCkgLyAxOSkgKyAyOworICAgIEFQSW50IFRtcChudW1CaXRzLCBTdHJpbmdSZWYoVG9rU3RhcnQsIExlbiksIDEwKTsKKyAgICBpZiAoVG9rU3RhcnRbMF0gPT0gJy0nKSB7CisgICAgICB1aW50MzJfdCBtaW5CaXRzID0gVG1wLmdldE1pblNpZ25lZEJpdHMoKTsKKyAgICAgIGlmIChtaW5CaXRzID4gMCAmJiBtaW5CaXRzIDwgbnVtQml0cykKKyAgICAgICAgVG1wLnRydW5jKG1pbkJpdHMpOworICAgICAgQVBTSW50VmFsID0gQVBTSW50KFRtcCwgZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICB1aW50MzJfdCBhY3RpdmVCaXRzID0gVG1wLmdldEFjdGl2ZUJpdHMoKTsKKyAgICAgIGlmIChhY3RpdmVCaXRzID4gMCAmJiBhY3RpdmVCaXRzIDwgbnVtQml0cykKKyAgICAgICAgVG1wLnRydW5jKGFjdGl2ZUJpdHMpOworICAgICAgQVBTSW50VmFsID0gQVBTSW50KFRtcCwgdHJ1ZSk7CisgICAgfQorICAgIHJldHVybiBsbHRvazo6QVBTSW50OworICB9CisKKyAgKytDdXJQdHI7CisKKyAgLy8gU2tpcCBvdmVyIFswLTldKihbZUVdWy0rXT9bMC05XSspPworICB3aGlsZSAoaXNkaWdpdChDdXJQdHJbMF0pKSArK0N1clB0cjsKKworICBpZiAoQ3VyUHRyWzBdID09ICdlJyB8fCBDdXJQdHJbMF0gPT0gJ0UnKSB7CisgICAgaWYgKGlzZGlnaXQoQ3VyUHRyWzFdKSB8fAorICAgICAgICAoKEN1clB0clsxXSA9PSAnLScgfHwgQ3VyUHRyWzFdID09ICcrJykgJiYgaXNkaWdpdChDdXJQdHJbMl0pKSkgeworICAgICAgQ3VyUHRyICs9IDI7CisgICAgICB3aGlsZSAoaXNkaWdpdChDdXJQdHJbMF0pKSArK0N1clB0cjsKKyAgICB9CisgIH0KKworICBBUEZsb2F0VmFsID0gQVBGbG9hdChhdG9mKFRva1N0YXJ0KSk7CisgIHJldHVybiBsbHRvazo6QVBGbG9hdDsKK30KKworLy8vICAgIEZQQ29uc3RhbnQgIFstK10/WzAtOV0rWy5dWzAtOV0qKFtlRV1bLStdP1swLTldKyk/CitsbHRvazo6S2luZCBMTExleGVyOjpMZXhQb3NpdGl2ZSgpIHsKKyAgLy8gSWYgdGhlIGxldHRlciBhZnRlciB0aGUgbmVnYXRpdmUgaXMgYSBudW1iZXIsIHRoaXMgaXMgcHJvYmFibHkgbm90IGEKKyAgLy8gbGFiZWwuCisgIGlmICghaXNkaWdpdChDdXJQdHJbMF0pKQorICAgIHJldHVybiBsbHRvazo6RXJyb3I7CisKKyAgLy8gU2tpcCBkaWdpdHMuCisgIGZvciAoKytDdXJQdHI7IGlzZGlnaXQoQ3VyUHRyWzBdKTsgKytDdXJQdHIpCisgICAgLyplbXB0eSovOworCisgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgYSAnLicuCisgIGlmIChDdXJQdHJbMF0gIT0gJy4nKSB7CisgICAgQ3VyUHRyID0gVG9rU3RhcnQrMTsKKyAgICByZXR1cm4gbGx0b2s6OkVycm9yOworICB9CisKKyAgKytDdXJQdHI7CisKKyAgLy8gU2tpcCBvdmVyIFswLTldKihbZUVdWy0rXT9bMC05XSspPworICB3aGlsZSAoaXNkaWdpdChDdXJQdHJbMF0pKSArK0N1clB0cjsKKworICBpZiAoQ3VyUHRyWzBdID09ICdlJyB8fCBDdXJQdHJbMF0gPT0gJ0UnKSB7CisgICAgaWYgKGlzZGlnaXQoQ3VyUHRyWzFdKSB8fAorICAgICAgICAoKEN1clB0clsxXSA9PSAnLScgfHwgQ3VyUHRyWzFdID09ICcrJykgJiYgaXNkaWdpdChDdXJQdHJbMl0pKSkgeworICAgICAgQ3VyUHRyICs9IDI7CisgICAgICB3aGlsZSAoaXNkaWdpdChDdXJQdHJbMF0pKSArK0N1clB0cjsKKyAgICB9CisgIH0KKworICBBUEZsb2F0VmFsID0gQVBGbG9hdChhdG9mKFRva1N0YXJ0KSk7CisgIHJldHVybiBsbHRvazo6QVBGbG9hdDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvTExMZXhlci5oIGIvc3JjL0xMVk0vbGliL0FzbVBhcnNlci9MTExleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmMWNmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvTExMZXhlci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vPT09LSBMTExleGVyLmggLSBMZXhlciBmb3IgTExWTSBBc3NlbWJseSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBMZXhlciBmb3IgLmxsIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTElCX0FTTVBBUlNFUl9MTExFWEVSX0gKKyNkZWZpbmUgTElCX0FTTVBBUlNFUl9MTExFWEVSX0gKKworI2luY2x1ZGUgIkxMVG9rZW4uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUFNJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNZW1vcnlCdWZmZXI7CisgIGNsYXNzIFR5cGU7CisgIGNsYXNzIFNNRGlhZ25vc3RpYzsKKyAgY2xhc3MgTExWTUNvbnRleHQ7CisKKyAgY2xhc3MgTExMZXhlciB7CisgICAgY29uc3QgY2hhciAqQ3VyUHRyOworICAgIE1lbW9yeUJ1ZmZlciAqQ3VyQnVmOworICAgIFNNRGlhZ25vc3RpYyAmRXJyb3JJbmZvOworICAgIFNvdXJjZU1nciAmU007CisgICAgTExWTUNvbnRleHQgJkNvbnRleHQ7CisKKyAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB0b2tlbi4KKyAgICBjb25zdCBjaGFyICpUb2tTdGFydDsKKyAgICBsbHRvazo6S2luZCBDdXJLaW5kOworICAgIHN0ZDo6c3RyaW5nIFN0clZhbDsKKyAgICB1bnNpZ25lZCBVSW50VmFsOworICAgIGNvbnN0IFR5cGUgKlR5VmFsOworICAgIEFQRmxvYXQgQVBGbG9hdFZhbDsKKyAgICBBUFNJbnQgIEFQU0ludFZhbDsKKworICAgIHN0ZDo6c3RyaW5nIFRoZUVycm9yOworICBwdWJsaWM6CisgICAgZXhwbGljaXQgTExMZXhlcihNZW1vcnlCdWZmZXIgKlN0YXJ0QnVmLCBTb3VyY2VNZ3IgJlNNLCBTTURpYWdub3N0aWMgJiwKKyAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDKTsKKyAgICB+TExMZXhlcigpIHt9CisKKyAgICBsbHRvazo6S2luZCBMZXgoKSB7CisgICAgICByZXR1cm4gQ3VyS2luZCA9IExleFRva2VuKCk7CisgICAgfQorCisgICAgdHlwZWRlZiBTTUxvYyBMb2NUeTsKKyAgICBMb2NUeSBnZXRMb2MoKSBjb25zdCB7IHJldHVybiBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoVG9rU3RhcnQpOyB9CisgICAgbGx0b2s6OktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEN1cktpbmQ7IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0U3RyVmFsKCkgY29uc3QgeyByZXR1cm4gU3RyVmFsOyB9CisgICAgY29uc3QgVHlwZSAqZ2V0VHlWYWwoKSBjb25zdCB7IHJldHVybiBUeVZhbDsgfQorICAgIHVuc2lnbmVkIGdldFVJbnRWYWwoKSBjb25zdCB7IHJldHVybiBVSW50VmFsOyB9CisgICAgY29uc3QgQVBTSW50ICZnZXRBUFNJbnRWYWwoKSBjb25zdCB7IHJldHVybiBBUFNJbnRWYWw7IH0KKyAgICBjb25zdCBBUEZsb2F0ICZnZXRBUEZsb2F0VmFsKCkgY29uc3QgeyByZXR1cm4gQVBGbG9hdFZhbDsgfQorCisKKyAgICBib29sIEVycm9yKExvY1R5IEwsIGNvbnN0IHN0ZDo6c3RyaW5nICZNc2cpIGNvbnN0OworICAgIGJvb2wgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJk1zZykgY29uc3QgeyByZXR1cm4gRXJyb3IoZ2V0TG9jKCksIE1zZyk7IH0KKyAgICBzdGQ6OnN0cmluZyBnZXRGaWxlbmFtZSgpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgbGx0b2s6OktpbmQgTGV4VG9rZW4oKTsKKworICAgIGludCBnZXROZXh0Q2hhcigpOworICAgIHZvaWQgU2tpcExpbmVDb21tZW50KCk7CisgICAgbGx0b2s6OktpbmQgTGV4SWRlbnRpZmllcigpOworICAgIGxsdG9rOjpLaW5kIExleERpZ2l0T3JOZWdhdGl2ZSgpOworICAgIGxsdG9rOjpLaW5kIExleFBvc2l0aXZlKCk7CisgICAgbGx0b2s6OktpbmQgTGV4QXQoKTsKKyAgICBsbHRvazo6S2luZCBMZXhFeGNsYWltKCk7CisgICAgbGx0b2s6OktpbmQgTGV4UGVyY2VudCgpOworICAgIGxsdG9rOjpLaW5kIExleFF1b3RlKCk7CisgICAgbGx0b2s6OktpbmQgTGV4MHgoKTsKKworICAgIHVpbnQ2NF90IGF0b3VsbChjb25zdCBjaGFyICpCdWZmZXIsIGNvbnN0IGNoYXIgKkVuZCk7CisgICAgdWludDY0X3QgSGV4SW50VG9WYWwoY29uc3QgY2hhciAqQnVmZmVyLCBjb25zdCBjaGFyICpFbmQpOworICAgIHZvaWQgSGV4VG9JbnRQYWlyKGNvbnN0IGNoYXIgKkJ1ZmZlciwgY29uc3QgY2hhciAqRW5kLCB1aW50NjRfdCBQYWlyWzJdKTsKKyAgICB2b2lkIEZQODBIZXhUb0ludFBhaXIoY29uc3QgY2hhciAqQnVmZiwgY29uc3QgY2hhciAqRW5kLCB1aW50NjRfdCBQYWlyWzJdKTsKKyAgfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FzbVBhcnNlci9MTFBhcnNlci5jcHAgYi9zcmMvTExWTS9saWIvQXNtUGFyc2VyL0xMUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTVhMTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FzbVBhcnNlci9MTFBhcnNlci5jcHAKQEAgLTAsMCArMSw0MDE2IEBACisvLz09PS0tIExMUGFyc2VyLmNwcCAtIFBhcnNlciBDbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcGFyc2VyIGNsYXNzIGZvciAubGwgZmlsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkxMUGFyc2VyLmgiCisjaW5jbHVkZSAibGx2bS9BdXRvVXBncmFkZS5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vVmFsdWVTeW1ib2xUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gUnVuOiBtb2R1bGUgOjo9IHRvcGxldmVsZW50aXR5KgorYm9vbCBMTFBhcnNlcjo6UnVuKCkgeworICAvLyBQcmltZSB0aGUgbGV4ZXIuCisgIExleC5MZXgoKTsKKworICByZXR1cm4gUGFyc2VUb3BMZXZlbEVudGl0aWVzKCkgfHwKKyAgICAgICAgIFZhbGlkYXRlRW5kT2ZNb2R1bGUoKTsKK30KKworLy8vIFZhbGlkYXRlRW5kT2ZNb2R1bGUgLSBEbyBmaW5hbCB2YWxpZGl0eSBhbmQgc2FuaXR5IGNoZWNrcyBhdCB0aGUgZW5kIG9mIHRoZQorLy8vIG1vZHVsZS4KK2Jvb2wgTExQYXJzZXI6OlZhbGlkYXRlRW5kT2ZNb2R1bGUoKSB7CisgIC8vIEhhbmRsZSBhbnkgaW5zdHJ1Y3Rpb24gbWV0YWRhdGEgZm9yd2FyZCByZWZlcmVuY2VzLgorICBpZiAoIUZvcndhcmRSZWZJbnN0TWV0YWRhdGEuZW1wdHkoKSkgeworICAgIGZvciAoRGVuc2VNYXA8SW5zdHJ1Y3Rpb24qLCBzdGQ6OnZlY3RvcjxNRFJlZj4gPjo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSBGb3J3YXJkUmVmSW5zdE1ldGFkYXRhLmJlZ2luKCksIEUgPSBGb3J3YXJkUmVmSW5zdE1ldGFkYXRhLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIEluc3RydWN0aW9uICpJbnN0ID0gSS0+Zmlyc3Q7CisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNRFJlZj4gJk1ETGlzdCA9IEktPnNlY29uZDsKKyAgICAgIAorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1ETGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIFNsb3RObyA9IE1ETGlzdFtpXS5NRFNsb3Q7CisgICAgICAgIAorICAgICAgICBpZiAoU2xvdE5vID49IE51bWJlcmVkTWV0YWRhdGEuc2l6ZSgpIHx8IE51bWJlcmVkTWV0YWRhdGFbU2xvdE5vXSA9PSAwKQorICAgICAgICAgIHJldHVybiBFcnJvcihNRExpc3RbaV0uTG9jLCAidXNlIG9mIHVuZGVmaW5lZCBtZXRhZGF0YSAnISIgKworICAgICAgICAgICAgICAgICAgICAgICB1dG9zdHIoU2xvdE5vKSArICInIik7CisgICAgICAgIEluc3QtPnNldE1ldGFkYXRhKE1ETGlzdFtpXS5NREtpbmQsIE51bWJlcmVkTWV0YWRhdGFbU2xvdE5vXSk7CisgICAgICB9CisgICAgfQorICAgIEZvcndhcmRSZWZJbnN0TWV0YWRhdGEuY2xlYXIoKTsKKyAgfQorICAKKyAgCisgIC8vIFVwZGF0ZSBhdXRvLXVwZ3JhZGVkIG1hbGxvYyBjYWxscyB0byAibWFsbG9jIi4KKyAgLy8gRklYTUU6IFJlbW92ZSBpbiBMTFZNIDMuMC4KKyAgaWYgKE1hbGxvY0YpIHsKKyAgICBNYWxsb2NGLT5zZXROYW1lKCJtYWxsb2MiKTsKKyAgICAvLyBJZiBzZXROYW1lKCkgZG9lcyBub3Qgc2V0IHRoZSBuYW1lIHRvICJtYWxsb2MiLCB0aGVuIHRoZXJlIGlzIGFscmVhZHkgYSAKKyAgICAvLyBkZWNsYXJhdGlvbiBvZiAibWFsbG9jIi4gIEluIHRoYXQgY2FzZSwgaXRlcmF0ZSBvdmVyIGFsbCBjYWxscyB0byBNYWxsb2NGCisgICAgLy8gYW5kIGdldCB0aGVtIHRvIGNhbGwgdGhlIGRlY2xhcmVkICJtYWxsb2MiIGluc3RlYWQuCisgICAgaWYgKE1hbGxvY0YtPmdldE5hbWUoKSAhPSAibWFsbG9jIikgeworICAgICAgQ29uc3RhbnQgKlJlYWxNYWxsb2NGID0gTS0+Z2V0RnVuY3Rpb24oIm1hbGxvYyIpOworICAgICAgaWYgKFJlYWxNYWxsb2NGLT5nZXRUeXBlKCkgIT0gTWFsbG9jRi0+Z2V0VHlwZSgpKQorICAgICAgICBSZWFsTWFsbG9jRiA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChSZWFsTWFsbG9jRiwgTWFsbG9jRi0+Z2V0VHlwZSgpKTsKKyAgICAgIE1hbGxvY0YtPnJlcGxhY2VBbGxVc2VzV2l0aChSZWFsTWFsbG9jRik7CisgICAgICBNYWxsb2NGLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIE1hbGxvY0YgPSBOVUxMOworICAgIH0KKyAgfQorICAKKyAgCisgIC8vIElmIHRoZXJlIGFyZSBlbnRyaWVzIGluIEZvcndhcmRSZWZCbG9ja0FkZHJlc3NlcyBhdCB0aGlzIHBvaW50LCB0aGV5IGFyZQorICAvLyByZWZlcmVuY2VzIGFmdGVyIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZC4gIFJlc29sdmUgdGhvc2Ugbm93LgorICB3aGlsZSAoIUZvcndhcmRSZWZCbG9ja0FkZHJlc3Nlcy5lbXB0eSgpKSB7CisgICAgLy8gT2theSwgd2UgYXJlIHJlZmVyZW5jaW5nIGFuIGFscmVhZHktcGFyc2VkIGZ1bmN0aW9uLCByZXNvbHZlIHRoZW0gbm93LgorICAgIEZ1bmN0aW9uICpUaGVGbiA9IDA7CisgICAgY29uc3QgVmFsSUQgJkZuID0gRm9yd2FyZFJlZkJsb2NrQWRkcmVzc2VzLmJlZ2luKCktPmZpcnN0OworICAgIGlmIChGbi5LaW5kID09IFZhbElEOjp0X0dsb2JhbE5hbWUpCisgICAgICBUaGVGbiA9IE0tPmdldEZ1bmN0aW9uKEZuLlN0clZhbCk7CisgICAgZWxzZSBpZiAoRm4uVUludFZhbCA8IE51bWJlcmVkVmFscy5zaXplKCkpCisgICAgICBUaGVGbiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihOdW1iZXJlZFZhbHNbRm4uVUludFZhbF0pOworICAgIAorICAgIGlmIChUaGVGbiA9PSAwKQorICAgICAgcmV0dXJuIEVycm9yKEZuLkxvYywgInVua25vd24gZnVuY3Rpb24gcmVmZXJlbmNlZCBieSBibG9ja2FkZHJlc3MiKTsKKyAgICAKKyAgICAvLyBSZXNvbHZlIGFsbCB0aGVzZSByZWZlcmVuY2VzLgorICAgIGlmIChSZXNvbHZlRm9yd2FyZFJlZkJsb2NrQWRkcmVzc2VzKFRoZUZuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yd2FyZFJlZkJsb2NrQWRkcmVzc2VzLmJlZ2luKCktPnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIEZvcndhcmRSZWZCbG9ja0FkZHJlc3Nlcy5lcmFzZShGb3J3YXJkUmVmQmxvY2tBZGRyZXNzZXMuYmVnaW4oKSk7CisgIH0KKyAgCisgIAorICBpZiAoIUZvcndhcmRSZWZUeXBlcy5lbXB0eSgpKQorICAgIHJldHVybiBFcnJvcihGb3J3YXJkUmVmVHlwZXMuYmVnaW4oKS0+c2Vjb25kLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgInVzZSBvZiB1bmRlZmluZWQgdHlwZSBuYW1lZCAnIiArCisgICAgICAgICAgICAgICAgIEZvcndhcmRSZWZUeXBlcy5iZWdpbigpLT5maXJzdCArICInIik7CisgIGlmICghRm9yd2FyZFJlZlR5cGVJRHMuZW1wdHkoKSkKKyAgICByZXR1cm4gRXJyb3IoRm9yd2FyZFJlZlR5cGVJRHMuYmVnaW4oKS0+c2Vjb25kLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgInVzZSBvZiB1bmRlZmluZWQgdHlwZSAnJSIgKworICAgICAgICAgICAgICAgICB1dG9zdHIoRm9yd2FyZFJlZlR5cGVJRHMuYmVnaW4oKS0+Zmlyc3QpICsgIiciKTsKKworICBpZiAoIUZvcndhcmRSZWZWYWxzLmVtcHR5KCkpCisgICAgcmV0dXJuIEVycm9yKEZvcndhcmRSZWZWYWxzLmJlZ2luKCktPnNlY29uZC5zZWNvbmQsCisgICAgICAgICAgICAgICAgICJ1c2Ugb2YgdW5kZWZpbmVkIHZhbHVlICdAIiArIEZvcndhcmRSZWZWYWxzLmJlZ2luKCktPmZpcnN0ICsKKyAgICAgICAgICAgICAgICAgIiciKTsKKworICBpZiAoIUZvcndhcmRSZWZWYWxJRHMuZW1wdHkoKSkKKyAgICByZXR1cm4gRXJyb3IoRm9yd2FyZFJlZlZhbElEcy5iZWdpbigpLT5zZWNvbmQuc2Vjb25kLAorICAgICAgICAgICAgICAgICAidXNlIG9mIHVuZGVmaW5lZCB2YWx1ZSAnQCIgKworICAgICAgICAgICAgICAgICB1dG9zdHIoRm9yd2FyZFJlZlZhbElEcy5iZWdpbigpLT5maXJzdCkgKyAiJyIpOworCisgIGlmICghRm9yd2FyZFJlZk1ETm9kZXMuZW1wdHkoKSkKKyAgICByZXR1cm4gRXJyb3IoRm9yd2FyZFJlZk1ETm9kZXMuYmVnaW4oKS0+c2Vjb25kLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgInVzZSBvZiB1bmRlZmluZWQgbWV0YWRhdGEgJyEiICsKKyAgICAgICAgICAgICAgICAgdXRvc3RyKEZvcndhcmRSZWZNRE5vZGVzLmJlZ2luKCktPmZpcnN0KSArICInIik7CisKKworICAvLyBMb29rIGZvciBpbnRyaW5zaWMgZnVuY3Rpb25zIGFuZCBDYWxsSW5zdCB0aGF0IG5lZWQgdG8gYmUgdXBncmFkZWQKKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEZJID0gTS0+YmVnaW4oKSwgRkUgPSBNLT5lbmQoKTsgRkkgIT0gRkU7ICkKKyAgICBVcGdyYWRlQ2FsbHNUb0ludHJpbnNpYyhGSSsrKTsgLy8gbXVzdCBiZSBwb3N0LWluY3JlbWVudCwgYXMgd2UgcmVtb3ZlCisKKyAgLy8gQ2hlY2sgZGVidWcgaW5mbyBpbnRyaW5zaWNzLgorICBDaGVja0RlYnVnSW5mb0ludHJpbnNpY3MoTSk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBMTFBhcnNlcjo6UmVzb2x2ZUZvcndhcmRSZWZCbG9ja0FkZHJlc3NlcyhGdW5jdGlvbiAqVGhlRm4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8VmFsSUQsIEdsb2JhbFZhbHVlKj4gPiAmUmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyRnVuY3Rpb25TdGF0ZSAqUEZTKSB7CisgIC8vIExvb3Agb3ZlciBhbGwgdGhlIHJlZmVyZW5jZXMsIHJlc29sdmluZyB0aGVtLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVmcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQmFzaWNCbG9jayAqUmVzOworICAgIGlmIChQRlMpIHsKKyAgICAgIGlmIChSZWZzW2ldLmZpcnN0LktpbmQgPT0gVmFsSUQ6OnRfTG9jYWxOYW1lKQorICAgICAgICBSZXMgPSBQRlMtPkdldEJCKFJlZnNbaV0uZmlyc3QuU3RyVmFsLCBSZWZzW2ldLmZpcnN0LkxvYyk7CisgICAgICBlbHNlCisgICAgICAgIFJlcyA9IFBGUy0+R2V0QkIoUmVmc1tpXS5maXJzdC5VSW50VmFsLCBSZWZzW2ldLmZpcnN0LkxvYyk7CisgICAgfSBlbHNlIGlmIChSZWZzW2ldLmZpcnN0LktpbmQgPT0gVmFsSUQ6OnRfTG9jYWxJRCkgeworICAgICAgcmV0dXJuIEVycm9yKFJlZnNbaV0uZmlyc3QuTG9jLAorICAgICAgICJjYW5ub3QgdGFrZSBhZGRyZXNzIG9mIG51bWVyaWMgbGFiZWwgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgUmVzID0gZHluX2Nhc3Rfb3JfbnVsbDxCYXNpY0Jsb2NrPigKKyAgICAgICAgICAgICAgICAgICAgIFRoZUZuLT5nZXRWYWx1ZVN5bWJvbFRhYmxlKCkubG9va3VwKFJlZnNbaV0uZmlyc3QuU3RyVmFsKSk7CisgICAgfQorICAgIAorICAgIGlmIChSZXMgPT0gMCkKKyAgICAgIHJldHVybiBFcnJvcihSZWZzW2ldLmZpcnN0LkxvYywKKyAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlZCB2YWx1ZSBpcyBub3QgYSBiYXNpYyBibG9jayIpOworICAgIAorICAgIC8vIEdldCB0aGUgQmxvY2tBZGRyZXNzIGZvciB0aGlzIGFuZCB1cGRhdGUgcmVmZXJlbmNlcyB0byB1c2UgaXQuCisgICAgQmxvY2tBZGRyZXNzICpCQSA9IEJsb2NrQWRkcmVzczo6Z2V0KFRoZUZuLCBSZXMpOworICAgIFJlZnNbaV0uc2Vjb25kLT5yZXBsYWNlQWxsVXNlc1dpdGgoQkEpOworICAgIFJlZnNbaV0uc2Vjb25kLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRvcC1MZXZlbCBFbnRpdGllcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworYm9vbCBMTFBhcnNlcjo6UGFyc2VUb3BMZXZlbEVudGl0aWVzKCkgeworICB3aGlsZSAoMSkgeworICAgIHN3aXRjaCAoTGV4LmdldEtpbmQoKSkgeworICAgIGRlZmF1bHQ6ICAgICAgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCB0b3AtbGV2ZWwgZW50aXR5Iik7CisgICAgY2FzZSBsbHRvazo6RW9mOiByZXR1cm4gZmFsc2U7CisgICAgLy9jYXNlIGxsdG9rOjprd19kZWZpbmU6CisgICAgY2FzZSBsbHRvazo6a3dfZGVjbGFyZTogaWYgKFBhcnNlRGVjbGFyZSgpKSByZXR1cm4gdHJ1ZTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfZGVmaW5lOiAgaWYgKFBhcnNlRGVmaW5lKCkpIHJldHVybiB0cnVlOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19tb2R1bGU6ICBpZiAoUGFyc2VNb2R1bGVBc20oKSkgcmV0dXJuIHRydWU7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3RhcmdldDogIGlmIChQYXJzZVRhcmdldERlZmluaXRpb24oKSkgcmV0dXJuIHRydWU7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X2RlcGxpYnM6IGlmIChQYXJzZURlcExpYnMoKSkgcmV0dXJuIHRydWU7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3R5cGU6ICAgIGlmIChQYXJzZVVubmFtZWRUeXBlKCkpIHJldHVybiB0cnVlOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjpMb2NhbFZhcklEOiBpZiAoUGFyc2VVbm5hbWVkVHlwZSgpKSByZXR1cm4gdHJ1ZTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6U3RyaW5nQ29uc3RhbnQ6IC8vIEZJWE1FOiBSRU1PVkUgSU4gTExWTSAzLjAKKyAgICBjYXNlIGxsdG9rOjpMb2NhbFZhcjogICBpZiAoUGFyc2VOYW1lZFR5cGUoKSkgcmV0dXJuIHRydWU7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Okdsb2JhbElEOiAgIGlmIChQYXJzZVVubmFtZWRHbG9iYWwoKSkgcmV0dXJuIHRydWU7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Okdsb2JhbFZhcjogIGlmIChQYXJzZU5hbWVkR2xvYmFsKCkpIHJldHVybiB0cnVlOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjpleGNsYWltOiAgICBpZiAoUGFyc2VTdGFuZGFsb25lTWV0YWRhdGEoKSkgcmV0dXJuIHRydWU7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Ok1ldGFkYXRhVmFyOiBpZiAoUGFyc2VOYW1lZE1ldGFkYXRhKCkpIHJldHVybiB0cnVlOyBicmVhazsKKworICAgIC8vIFRoZSBHbG9iYWwgdmFyaWFibGUgcHJvZHVjdGlvbiB3aXRoIG5vIG5hbWUgY2FuIGhhdmUgbWFueSBkaWZmZXJlbnQKKyAgICAvLyBvcHRpb25hbCBsZWFkaW5nIHByZWZpeGVzLCB0aGUgcHJvZHVjdGlvbiBpczoKKyAgICAvLyBHbG9iYWxWYXIgOjo9IE9wdGlvbmFsTGlua2FnZSBPcHRpb25hbFZpc2liaWxpdHkgT3B0aW9uYWxUaHJlYWRMb2NhbAorICAgIC8vICAgICAgICAgICAgICAgT3B0aW9uYWxBZGRyU3BhY2UgKCdjb25zdGFudCd8J2dsb2JhbCcpIC4uLgorICAgIGNhc2UgbGx0b2s6Omt3X3ByaXZhdGU6ICAgICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2xpbmtlcl9wcml2YXRlOiAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2xpbmtlcl9wcml2YXRlX3dlYWs6IC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2ludGVybmFsOiAgICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X3dlYWs6ICAgICAgICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X3dlYWtfb2RyOiAgICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2xpbmtvbmNlOiAgICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2xpbmtvbmNlX29kcjogICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2FwcGVuZGluZzogICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2RsbGV4cG9ydDogICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2NvbW1vbjogICAgICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2RsbGltcG9ydDogICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2V4dGVybl93ZWFrOiAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgIGNhc2UgbGx0b2s6Omt3X2V4dGVybmFsOiB7ICAgICAgICAgIC8vIE9wdGlvbmFsTGlua2FnZQorICAgICAgdW5zaWduZWQgTGlua2FnZSwgVmlzaWJpbGl0eTsKKyAgICAgIGlmIChQYXJzZU9wdGlvbmFsTGlua2FnZShMaW5rYWdlKSB8fAorICAgICAgICAgIFBhcnNlT3B0aW9uYWxWaXNpYmlsaXR5KFZpc2liaWxpdHkpIHx8CisgICAgICAgICAgUGFyc2VHbG9iYWwoIiIsIFNNTG9jKCksIExpbmthZ2UsIHRydWUsIFZpc2liaWxpdHkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGxsdG9rOjprd19kZWZhdWx0OiAgICAgICAvLyBPcHRpb25hbFZpc2liaWxpdHkKKyAgICBjYXNlIGxsdG9rOjprd19oaWRkZW46ICAgICAgICAvLyBPcHRpb25hbFZpc2liaWxpdHkKKyAgICBjYXNlIGxsdG9rOjprd19wcm90ZWN0ZWQ6IHsgICAvLyBPcHRpb25hbFZpc2liaWxpdHkKKyAgICAgIHVuc2lnbmVkIFZpc2liaWxpdHk7CisgICAgICBpZiAoUGFyc2VPcHRpb25hbFZpc2liaWxpdHkoVmlzaWJpbGl0eSkgfHwKKyAgICAgICAgICBQYXJzZUdsb2JhbCgiIiwgU01Mb2MoKSwgMCwgZmFsc2UsIFZpc2liaWxpdHkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgbGx0b2s6Omt3X3RocmVhZF9sb2NhbDogIC8vIE9wdGlvbmFsVGhyZWFkTG9jYWwKKyAgICBjYXNlIGxsdG9rOjprd19hZGRyc3BhY2U6ICAgICAvLyBPcHRpb25hbEFkZHJTcGFjZQorICAgIGNhc2UgbGx0b2s6Omt3X2NvbnN0YW50OiAgICAgIC8vIEdsb2JhbFR5cGUKKyAgICBjYXNlIGxsdG9rOjprd19nbG9iYWw6ICAgICAgICAvLyBHbG9iYWxUeXBlCisgICAgICBpZiAoUGFyc2VHbG9iYWwoIiIsIFNNTG9jKCksIDAsIGZhbHNlLCAwKSkgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCisvLy8gdG9wbGV2ZWxlbnRpdHkKKy8vLyAgIDo6PSAnbW9kdWxlJyAnYXNtJyBTVFJJTkdDT05TVEFOVAorYm9vbCBMTFBhcnNlcjo6UGFyc2VNb2R1bGVBc20oKSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjprd19tb2R1bGUpOworICBMZXguTGV4KCk7CisKKyAgc3RkOjpzdHJpbmcgQXNtU3RyOworICBpZiAoUGFyc2VUb2tlbihsbHRvazo6a3dfYXNtLCAiZXhwZWN0ZWQgJ21vZHVsZSBhc20nIikgfHwKKyAgICAgIFBhcnNlU3RyaW5nQ29uc3RhbnQoQXNtU3RyKSkgcmV0dXJuIHRydWU7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJkFzbVNvRmFyID0gTS0+Z2V0TW9kdWxlSW5saW5lQXNtKCk7CisgIGlmIChBc21Tb0Zhci5lbXB0eSgpKQorICAgIE0tPnNldE1vZHVsZUlubGluZUFzbShBc21TdHIpOworICBlbHNlCisgICAgTS0+c2V0TW9kdWxlSW5saW5lQXNtKEFzbVNvRmFyKyJcbiIrQXNtU3RyKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gdG9wbGV2ZWxlbnRpdHkKKy8vLyAgIDo6PSAndGFyZ2V0JyAndHJpcGxlJyAnPScgU1RSSU5HQ09OU1RBTlQKKy8vLyAgIDo6PSAndGFyZ2V0JyAnZGF0YWxheW91dCcgJz0nIFNUUklOR0NPTlNUQU5UCitib29sIExMUGFyc2VyOjpQYXJzZVRhcmdldERlZmluaXRpb24oKSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjprd190YXJnZXQpOworICBzdGQ6OnN0cmluZyBTdHI7CisgIHN3aXRjaCAoTGV4LkxleCgpKSB7CisgIGRlZmF1bHQ6IHJldHVybiBUb2tFcnJvcigidW5rbm93biB0YXJnZXQgcHJvcGVydHkiKTsKKyAgY2FzZSBsbHRvazo6a3dfdHJpcGxlOgorICAgIExleC5MZXgoKTsKKyAgICBpZiAoUGFyc2VUb2tlbihsbHRvazo6ZXF1YWwsICJleHBlY3RlZCAnPScgYWZ0ZXIgdGFyZ2V0IHRyaXBsZSIpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nQ29uc3RhbnQoU3RyKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIE0tPnNldFRhcmdldFRyaXBsZShTdHIpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBsbHRvazo6a3dfZGF0YWxheW91dDoKKyAgICBMZXguTGV4KCk7CisgICAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OmVxdWFsLCAiZXhwZWN0ZWQgJz0nIGFmdGVyIHRhcmdldCBkYXRhbGF5b3V0IikgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdDb25zdGFudChTdHIpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgTS0+c2V0RGF0YUxheW91dChTdHIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLy8gdG9wbGV2ZWxlbnRpdHkKKy8vLyAgIDo6PSAnZGVwbGlicycgJz0nICdbJyAnXScKKy8vLyAgIDo6PSAnZGVwbGlicycgJz0nICdbJyBTVFJJTkdDT05TVEFOVCAoJywnIFNUUklOR0NPTlNUQU5UKSogJ10nCitib29sIExMUGFyc2VyOjpQYXJzZURlcExpYnMoKSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjprd19kZXBsaWJzKTsKKyAgTGV4LkxleCgpOworICBpZiAoUGFyc2VUb2tlbihsbHRvazo6ZXF1YWwsICJleHBlY3RlZCAnPScgYWZ0ZXIgZGVwbGlicyIpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpsc3F1YXJlLCAiZXhwZWN0ZWQgJz0nIGFmdGVyIGRlcGxpYnMiKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoRWF0SWZQcmVzZW50KGxsdG9rOjpyc3F1YXJlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3RkOjpzdHJpbmcgU3RyOworICBpZiAoUGFyc2VTdHJpbmdDb25zdGFudChTdHIpKSByZXR1cm4gdHJ1ZTsKKyAgTS0+YWRkTGlicmFyeShTdHIpOworCisgIHdoaWxlIChFYXRJZlByZXNlbnQobGx0b2s6OmNvbW1hKSkgeworICAgIGlmIChQYXJzZVN0cmluZ0NvbnN0YW50KFN0cikpIHJldHVybiB0cnVlOworICAgIE0tPmFkZExpYnJhcnkoU3RyKTsKKyAgfQorCisgIHJldHVybiBQYXJzZVRva2VuKGxsdG9rOjpyc3F1YXJlLCAiZXhwZWN0ZWQgJ10nIGF0IGVuZCBvZiBsaXN0Iik7Cit9CisKKy8vLyBQYXJzZVVubmFtZWRUeXBlOgorLy8vICAgOjo9ICd0eXBlJyB0eXBlCisvLy8gICA6Oj0gTG9jYWxWYXJJRCAnPScgJ3R5cGUnIHR5cGUKK2Jvb2wgTExQYXJzZXI6OlBhcnNlVW5uYW1lZFR5cGUoKSB7CisgIHVuc2lnbmVkIFR5cGVJRCA9IE51bWJlcmVkVHlwZXMuc2l6ZSgpOworCisgIC8vIEhhbmRsZSB0aGUgTG9jYWxWYXJJRCBmb3JtLgorICBpZiAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6TG9jYWxWYXJJRCkgeworICAgIGlmIChMZXguZ2V0VUludFZhbCgpICE9IFR5cGVJRCkKKyAgICAgIHJldHVybiBFcnJvcihMZXguZ2V0TG9jKCksICJ0eXBlIGV4cGVjdGVkIHRvIGJlIG51bWJlcmVkICclIiArCisgICAgICAgICAgICAgICAgICAgdXRvc3RyKFR5cGVJRCkgKyAiJyIpOworICAgIExleC5MZXgoKTsgLy8gZWF0IExvY2FsVmFySUQ7CisKKyAgICBpZiAoUGFyc2VUb2tlbihsbHRvazo6ZXF1YWwsICJleHBlY3RlZCAnPScgYWZ0ZXIgbmFtZSIpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBMb2NUeSBUeXBlTG9jID0gTGV4LmdldExvYygpOworICBpZiAoUGFyc2VUb2tlbihsbHRvazo6a3dfdHlwZSwgImV4cGVjdGVkICd0eXBlJyBhZnRlciAnPSciKSkgcmV0dXJuIHRydWU7CisKKyAgUEFUeXBlSG9sZGVyIFR5KFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgIGlmIChQYXJzZVR5cGUoVHkpKSByZXR1cm4gdHJ1ZTsKKworICAvLyBTZWUgaWYgdGhpcyB0eXBlIHdhcyBwcmV2aW91c2x5IHJlZmVyZW5jZWQuCisgIHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnBhaXI8UEFUeXBlSG9sZGVyLCBMb2NUeT4gPjo6aXRlcmF0b3IKKyAgICBGSSA9IEZvcndhcmRSZWZUeXBlSURzLmZpbmQoVHlwZUlEKTsKKyAgaWYgKEZJICE9IEZvcndhcmRSZWZUeXBlSURzLmVuZCgpKSB7CisgICAgaWYgKEZJLT5zZWNvbmQuZmlyc3QuZ2V0KCkgPT0gVHkpCisgICAgICByZXR1cm4gRXJyb3IoVHlwZUxvYywgInNlbGYgcmVmZXJlbnRpYWwgdHlwZSBpcyBpbnZhbGlkIik7CisKKyAgICBjYXN0PERlcml2ZWRUeXBlPihGSS0+c2Vjb25kLmZpcnN0LmdldCgpKS0+cmVmaW5lQWJzdHJhY3RUeXBlVG8oVHkpOworICAgIFR5ID0gRkktPnNlY29uZC5maXJzdC5nZXQoKTsKKyAgICBGb3J3YXJkUmVmVHlwZUlEcy5lcmFzZShGSSk7CisgIH0KKworICBOdW1iZXJlZFR5cGVzLnB1c2hfYmFjayhUeSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gdG9wbGV2ZWxlbnRpdHkKKy8vLyAgIDo6PSBMb2NhbFZhciAnPScgJ3R5cGUnIHR5cGUKK2Jvb2wgTExQYXJzZXI6OlBhcnNlTmFtZWRUeXBlKCkgeworICBzdGQ6OnN0cmluZyBOYW1lID0gTGV4LmdldFN0clZhbCgpOworICBMb2NUeSBOYW1lTG9jID0gTGV4LmdldExvYygpOworICBMZXguTGV4KCk7ICAvLyBlYXQgTG9jYWxWYXIuCisKKyAgUEFUeXBlSG9sZGVyIFR5KFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisKKyAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OmVxdWFsLCAiZXhwZWN0ZWQgJz0nIGFmdGVyIG5hbWUiKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6a3dfdHlwZSwgImV4cGVjdGVkICd0eXBlJyBhZnRlciBuYW1lIikgfHwKKyAgICAgIFBhcnNlVHlwZShUeSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gU2V0IHRoZSB0eXBlIG5hbWUsIGNoZWNraW5nIGZvciBjb25mbGljdHMgYXMgd2UgZG8gc28uCisgIGJvb2wgQWxyZWFkeUV4aXN0cyA9IE0tPmFkZFR5cGVOYW1lKE5hbWUsIFR5KTsKKyAgaWYgKCFBbHJlYWR5RXhpc3RzKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2VlIGlmIHRoaXMgdHlwZSBpcyBhIGZvcndhcmQgcmVmZXJlbmNlLiAgV2UgbmVlZCB0byBlYWdlcmx5IHJlc29sdmUKKyAgLy8gdHlwZXMgdG8gYWxsb3cgcmVjdXJzaXZlIHR5cGUgcmVkZWZpbml0aW9ucyBiZWxvdy4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxQQVR5cGVIb2xkZXIsIExvY1R5PiA+OjppdGVyYXRvcgorICBGSSA9IEZvcndhcmRSZWZUeXBlcy5maW5kKE5hbWUpOworICBpZiAoRkkgIT0gRm9yd2FyZFJlZlR5cGVzLmVuZCgpKSB7CisgICAgaWYgKEZJLT5zZWNvbmQuZmlyc3QuZ2V0KCkgPT0gVHkpCisgICAgICByZXR1cm4gRXJyb3IoTmFtZUxvYywgInNlbGYgcmVmZXJlbnRpYWwgdHlwZSBpcyBpbnZhbGlkIik7CisKKyAgICBjYXN0PERlcml2ZWRUeXBlPihGSS0+c2Vjb25kLmZpcnN0LmdldCgpKS0+cmVmaW5lQWJzdHJhY3RUeXBlVG8oVHkpOworICAgIFR5ID0gRkktPnNlY29uZC5maXJzdC5nZXQoKTsKKyAgICBGb3J3YXJkUmVmVHlwZXMuZXJhc2UoRkkpOworICB9CisKKyAgLy8gSW5zZXJ0aW5nIGEgbmFtZSB0aGF0IGlzIGFscmVhZHkgZGVmaW5lZCwgZ2V0IHRoZSBleGlzdGluZyBuYW1lLgorICBjb25zdCBUeXBlICpFeGlzdGluZyA9IE0tPmdldFR5cGVCeU5hbWUoTmFtZSk7CisgIGFzc2VydChFeGlzdGluZyAmJiAiQ29uZmxpY3QgYnV0IG5vIG1hdGNoaW5nIHR5cGU/ISIpOworCisgIC8vIE90aGVyd2lzZSwgdGhpcyBpcyBhbiBhdHRlbXB0IHRvIHJlZGVmaW5lIGEgdHlwZS4gVGhhdCdzIG9rYXkgaWYKKyAgLy8gdGhlIHJlZGVmaW5pdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsLgorICAvLyBGSVhNRTogUkVNT1ZFIFJFREVGSU5JVElPTlMgSU4gTExWTSAzLjAKKyAgaWYgKEV4aXN0aW5nID09IFR5KSByZXR1cm4gZmFsc2U7CisKKyAgLy8gQW55IG90aGVyIGtpbmQgb2YgKG5vbi1lcXVpdmFsZW50KSByZWRlZmluaXRpb24gaXMgYW4gZXJyb3IuCisgIHJldHVybiBFcnJvcihOYW1lTG9jLCAicmVkZWZpbml0aW9uIG9mIHR5cGUgbmFtZWQgJyIgKyBOYW1lICsgIicgb2YgdHlwZSAnIiArCisgICAgICAgICAgICAgICBUeS0+Z2V0RGVzY3JpcHRpb24oKSArICInIik7Cit9CisKKworLy8vIHRvcGxldmVsZW50aXR5CisvLy8gICA6Oj0gJ2RlY2xhcmUnIEZ1bmN0aW9uSGVhZGVyCitib29sIExMUGFyc2VyOjpQYXJzZURlY2xhcmUoKSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjprd19kZWNsYXJlKTsKKyAgTGV4LkxleCgpOworCisgIEZ1bmN0aW9uICpGOworICByZXR1cm4gUGFyc2VGdW5jdGlvbkhlYWRlcihGLCBmYWxzZSk7Cit9CisKKy8vLyB0b3BsZXZlbGVudGl0eQorLy8vICAgOjo9ICdkZWZpbmUnIEZ1bmN0aW9uSGVhZGVyICd7JyAuLi4KK2Jvb2wgTExQYXJzZXI6OlBhcnNlRGVmaW5lKCkgeworICBhc3NlcnQoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6a3dfZGVmaW5lKTsKKyAgTGV4LkxleCgpOworCisgIEZ1bmN0aW9uICpGOworICByZXR1cm4gUGFyc2VGdW5jdGlvbkhlYWRlcihGLCB0cnVlKSB8fAorICAgICAgICAgUGFyc2VGdW5jdGlvbkJvZHkoKkYpOworfQorCisvLy8gUGFyc2VHbG9iYWxUeXBlCisvLy8gICA6Oj0gJ2NvbnN0YW50JworLy8vICAgOjo9ICdnbG9iYWwnCitib29sIExMUGFyc2VyOjpQYXJzZUdsb2JhbFR5cGUoYm9vbCAmSXNDb25zdGFudCkgeworICBpZiAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6a3dfY29uc3RhbnQpCisgICAgSXNDb25zdGFudCA9IHRydWU7CisgIGVsc2UgaWYgKExleC5nZXRLaW5kKCkgPT0gbGx0b2s6Omt3X2dsb2JhbCkKKyAgICBJc0NvbnN0YW50ID0gZmFsc2U7CisgIGVsc2UgeworICAgIElzQ29uc3RhbnQgPSBmYWxzZTsKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkICdnbG9iYWwnIG9yICdjb25zdGFudCciKTsKKyAgfQorICBMZXguTGV4KCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlVW5uYW1lZEdsb2JhbDoKKy8vLyAgIE9wdGlvbmFsVmlzaWJpbGl0eSBBTElBUyAuLi4KKy8vLyAgIE9wdGlvbmFsTGlua2FnZSBPcHRpb25hbFZpc2liaWxpdHkgLi4uICAgLT4gZ2xvYmFsIHZhcmlhYmxlCisvLy8gICBHbG9iYWxJRCAnPScgT3B0aW9uYWxWaXNpYmlsaXR5IEFMSUFTIC4uLgorLy8vICAgR2xvYmFsSUQgJz0nIE9wdGlvbmFsTGlua2FnZSBPcHRpb25hbFZpc2liaWxpdHkgLi4uICAgLT4gZ2xvYmFsIHZhcmlhYmxlCitib29sIExMUGFyc2VyOjpQYXJzZVVubmFtZWRHbG9iYWwoKSB7CisgIHVuc2lnbmVkIFZhcklEID0gTnVtYmVyZWRWYWxzLnNpemUoKTsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgTG9jVHkgTmFtZUxvYyA9IExleC5nZXRMb2MoKTsKKworICAvLyBIYW5kbGUgdGhlIEdsb2JhbElEIGZvcm0uCisgIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpHbG9iYWxJRCkgeworICAgIGlmIChMZXguZ2V0VUludFZhbCgpICE9IFZhcklEKQorICAgICAgcmV0dXJuIEVycm9yKExleC5nZXRMb2MoKSwgInZhcmlhYmxlIGV4cGVjdGVkIHRvIGJlIG51bWJlcmVkICclIiArCisgICAgICAgICAgICAgICAgICAgdXRvc3RyKFZhcklEKSArICInIik7CisgICAgTGV4LkxleCgpOyAvLyBlYXQgR2xvYmFsSUQ7CisKKyAgICBpZiAoUGFyc2VUb2tlbihsbHRvazo6ZXF1YWwsICJleHBlY3RlZCAnPScgYWZ0ZXIgbmFtZSIpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIEhhc0xpbmthZ2U7CisgIHVuc2lnbmVkIExpbmthZ2UsIFZpc2liaWxpdHk7CisgIGlmIChQYXJzZU9wdGlvbmFsTGlua2FnZShMaW5rYWdlLCBIYXNMaW5rYWdlKSB8fAorICAgICAgUGFyc2VPcHRpb25hbFZpc2liaWxpdHkoVmlzaWJpbGl0eSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKEhhc0xpbmthZ2UgfHwgTGV4LmdldEtpbmQoKSAhPSBsbHRvazo6a3dfYWxpYXMpCisgICAgcmV0dXJuIFBhcnNlR2xvYmFsKE5hbWUsIE5hbWVMb2MsIExpbmthZ2UsIEhhc0xpbmthZ2UsIFZpc2liaWxpdHkpOworICByZXR1cm4gUGFyc2VBbGlhcyhOYW1lLCBOYW1lTG9jLCBWaXNpYmlsaXR5KTsKK30KKworLy8vIFBhcnNlTmFtZWRHbG9iYWw6CisvLy8gICBHbG9iYWxWYXIgJz0nIE9wdGlvbmFsVmlzaWJpbGl0eSBBTElBUyAuLi4KKy8vLyAgIEdsb2JhbFZhciAnPScgT3B0aW9uYWxMaW5rYWdlIE9wdGlvbmFsVmlzaWJpbGl0eSAuLi4gICAtPiBnbG9iYWwgdmFyaWFibGUKK2Jvb2wgTExQYXJzZXI6OlBhcnNlTmFtZWRHbG9iYWwoKSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpHbG9iYWxWYXIpOworICBMb2NUeSBOYW1lTG9jID0gTGV4LmdldExvYygpOworICBzdGQ6OnN0cmluZyBOYW1lID0gTGV4LmdldFN0clZhbCgpOworICBMZXguTGV4KCk7CisKKyAgYm9vbCBIYXNMaW5rYWdlOworICB1bnNpZ25lZCBMaW5rYWdlLCBWaXNpYmlsaXR5OworICBpZiAoUGFyc2VUb2tlbihsbHRvazo6ZXF1YWwsICJleHBlY3RlZCAnPScgaW4gZ2xvYmFsIHZhcmlhYmxlIikgfHwKKyAgICAgIFBhcnNlT3B0aW9uYWxMaW5rYWdlKExpbmthZ2UsIEhhc0xpbmthZ2UpIHx8CisgICAgICBQYXJzZU9wdGlvbmFsVmlzaWJpbGl0eShWaXNpYmlsaXR5KSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoSGFzTGlua2FnZSB8fCBMZXguZ2V0S2luZCgpICE9IGxsdG9rOjprd19hbGlhcykKKyAgICByZXR1cm4gUGFyc2VHbG9iYWwoTmFtZSwgTmFtZUxvYywgTGlua2FnZSwgSGFzTGlua2FnZSwgVmlzaWJpbGl0eSk7CisgIHJldHVybiBQYXJzZUFsaWFzKE5hbWUsIE5hbWVMb2MsIFZpc2liaWxpdHkpOworfQorCisvLyBNRFN0cmluZzoKKy8vICAgOjo9ICchJyBTVFJJTkdDT05TVEFOVAorYm9vbCBMTFBhcnNlcjo6UGFyc2VNRFN0cmluZyhNRFN0cmluZyAqJlJlc3VsdCkgeworICBzdGQ6OnN0cmluZyBTdHI7CisgIGlmIChQYXJzZVN0cmluZ0NvbnN0YW50KFN0cikpIHJldHVybiB0cnVlOworICBSZXN1bHQgPSBNRFN0cmluZzo6Z2V0KENvbnRleHQsIFN0cik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gTUROb2RlOgorLy8gICA6Oj0gJyEnIE1ETm9kZU51bWJlcgorLy8KKy8vLyBUaGlzIHZlcnNpb24gb2YgUGFyc2VNRE5vZGVJRCByZXR1cm5zIHRoZSBzbG90IG51bWJlciBhbmQgbnVsbCBpbiB0aGUgY2FzZQorLy8vIG9mIGEgZm9yd2FyZCByZWZlcmVuY2UuCitib29sIExMUGFyc2VyOjpQYXJzZU1ETm9kZUlEKE1ETm9kZSAqJlJlc3VsdCwgdW5zaWduZWQgJlNsb3RObykgeworICAvLyAheyAuLi4sICE0MiwgLi4uIH0KKyAgaWYgKFBhcnNlVUludDMyKFNsb3RObykpIHJldHVybiB0cnVlOworCisgIC8vIENoZWNrIGV4aXN0aW5nIE1ETm9kZS4KKyAgaWYgKFNsb3RObyA8IE51bWJlcmVkTWV0YWRhdGEuc2l6ZSgpICYmIE51bWJlcmVkTWV0YWRhdGFbU2xvdE5vXSAhPSAwKQorICAgIFJlc3VsdCA9IE51bWJlcmVkTWV0YWRhdGFbU2xvdE5vXTsKKyAgZWxzZQorICAgIFJlc3VsdCA9IDA7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBMTFBhcnNlcjo6UGFyc2VNRE5vZGVJRChNRE5vZGUgKiZSZXN1bHQpIHsKKyAgLy8gIXsgLi4uLCAhNDIsIC4uLiB9CisgIHVuc2lnbmVkIE1JRCA9IDA7CisgIGlmIChQYXJzZU1ETm9kZUlEKFJlc3VsdCwgTUlEKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gSWYgbm90IGEgZm9yd2FyZCByZWZlcmVuY2UsIGp1c3QgcmV0dXJuIGl0IG5vdy4KKyAgaWYgKFJlc3VsdCkgcmV0dXJuIGZhbHNlOworCisgIC8vIE90aGVyd2lzZSwgY3JlYXRlIE1ETm9kZSBmb3J3YXJkIHJlZmVyZW5jZS4KKworICAvLyBGSVhNRTogVGhpcyBpcyBub3QgdW5pcXVlIGVub3VnaCEKKyAgc3RkOjpzdHJpbmcgRndkUmVmTmFtZSA9ICJsbHZtLm1kbm9kZS5md2RyZWYuIiArIHV0b3N0cihNSUQpOworICBWYWx1ZSAqViA9IE1EU3RyaW5nOjpnZXQoQ29udGV4dCwgRndkUmVmTmFtZSk7CisgIE1ETm9kZSAqRndkTm9kZSA9IE1ETm9kZTo6Z2V0KENvbnRleHQsICZWLCAxKTsKKyAgRm9yd2FyZFJlZk1ETm9kZXNbTUlEXSA9IHN0ZDo6bWFrZV9wYWlyKEZ3ZE5vZGUsIExleC5nZXRMb2MoKSk7CisgIAorICBpZiAoTnVtYmVyZWRNZXRhZGF0YS5zaXplKCkgPD0gTUlEKQorICAgIE51bWJlcmVkTWV0YWRhdGEucmVzaXplKE1JRCsxKTsKKyAgTnVtYmVyZWRNZXRhZGF0YVtNSURdID0gRndkTm9kZTsKKyAgUmVzdWx0ID0gRndkTm9kZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VOYW1lZE1ldGFkYXRhOgorLy8vICAgIWZvbyA9ICF7ICExLCAhMiB9Citib29sIExMUGFyc2VyOjpQYXJzZU5hbWVkTWV0YWRhdGEoKSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpNZXRhZGF0YVZhcik7CisgIHN0ZDo6c3RyaW5nIE5hbWUgPSBMZXguZ2V0U3RyVmFsKCk7CisgIExleC5MZXgoKTsKKworICBpZiAoUGFyc2VUb2tlbihsbHRvazo6ZXF1YWwsICJleHBlY3RlZCAnPScgaGVyZSIpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpleGNsYWltLCAiRXhwZWN0ZWQgJyEnIGhlcmUiKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6bGJyYWNlLCAiRXhwZWN0ZWQgJ3snIGhlcmUiKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBOYW1lZE1ETm9kZSAqTk1EID0gTS0+Z2V0T3JJbnNlcnROYW1lZE1ldGFkYXRhKE5hbWUpOworICBpZiAoTGV4LmdldEtpbmQoKSAhPSBsbHRvazo6cmJyYWNlKQorICAgIGRvIHsKKyAgICAgIGlmIChQYXJzZVRva2VuKGxsdG9rOjpleGNsYWltLCAiRXhwZWN0ZWQgJyEnIGhlcmUiKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgICBNRE5vZGUgKk4gPSAwOworICAgICAgaWYgKFBhcnNlTUROb2RlSUQoTikpIHJldHVybiB0cnVlOworICAgICAgTk1ELT5hZGRPcGVyYW5kKE4pOworICAgIH0gd2hpbGUgKEVhdElmUHJlc2VudChsbHRvazo6Y29tbWEpKTsKKworICBpZiAoUGFyc2VUb2tlbihsbHRvazo6cmJyYWNlLCAiZXhwZWN0ZWQgZW5kIG9mIG1ldGFkYXRhIG5vZGUiKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZVN0YW5kYWxvbmVNZXRhZGF0YToKKy8vLyAgICE0MiA9ICF7Li4ufQorYm9vbCBMTFBhcnNlcjo6UGFyc2VTdGFuZGFsb25lTWV0YWRhdGEoKSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpleGNsYWltKTsKKyAgTGV4LkxleCgpOworICB1bnNpZ25lZCBNZXRhZGF0YUlEID0gMDsKKworICBMb2NUeSBUeUxvYzsKKyAgUEFUeXBlSG9sZGVyIFR5KFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgIFNtYWxsVmVjdG9yPFZhbHVlICosIDE2PiBFbHRzOworICBpZiAoUGFyc2VVSW50MzIoTWV0YWRhdGFJRCkgfHwKKyAgICAgIFBhcnNlVG9rZW4obGx0b2s6OmVxdWFsLCAiZXhwZWN0ZWQgJz0nIGhlcmUiKSB8fAorICAgICAgUGFyc2VUeXBlKFR5LCBUeUxvYykgfHwKKyAgICAgIFBhcnNlVG9rZW4obGx0b2s6OmV4Y2xhaW0sICJFeHBlY3RlZCAnIScgaGVyZSIpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpsYnJhY2UsICJFeHBlY3RlZCAneycgaGVyZSIpIHx8CisgICAgICBQYXJzZU1ETm9kZVZlY3RvcihFbHRzLCBOVUxMKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6cmJyYWNlLCAiZXhwZWN0ZWQgZW5kIG9mIG1ldGFkYXRhIG5vZGUiKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBNRE5vZGUgKkluaXQgPSBNRE5vZGU6OmdldChDb250ZXh0LCBFbHRzLmRhdGEoKSwgRWx0cy5zaXplKCkpOworICAKKyAgLy8gU2VlIGlmIHRoaXMgd2FzIGZvcndhcmQgcmVmZXJlbmNlZCwgaWYgc28sIGhhbmRsZSBpdC4KKyAgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6cGFpcjxUcmFja2luZ1ZIPE1ETm9kZT4sIExvY1R5PiA+OjppdGVyYXRvcgorICAgIEZJID0gRm9yd2FyZFJlZk1ETm9kZXMuZmluZChNZXRhZGF0YUlEKTsKKyAgaWYgKEZJICE9IEZvcndhcmRSZWZNRE5vZGVzLmVuZCgpKSB7CisgICAgRkktPnNlY29uZC5maXJzdC0+cmVwbGFjZUFsbFVzZXNXaXRoKEluaXQpOworICAgIEZvcndhcmRSZWZNRE5vZGVzLmVyYXNlKEZJKTsKKyAgICAKKyAgICBhc3NlcnQoTnVtYmVyZWRNZXRhZGF0YVtNZXRhZGF0YUlEXSA9PSBJbml0ICYmICJUcmFja2luZyBWSCBkaWRuJ3Qgd29yayIpOworICB9IGVsc2UgeworICAgIGlmIChNZXRhZGF0YUlEID49IE51bWJlcmVkTWV0YWRhdGEuc2l6ZSgpKQorICAgICAgTnVtYmVyZWRNZXRhZGF0YS5yZXNpemUoTWV0YWRhdGFJRCsxKTsKKworICAgIGlmIChOdW1iZXJlZE1ldGFkYXRhW01ldGFkYXRhSURdICE9IDApCisgICAgICByZXR1cm4gVG9rRXJyb3IoIk1ldGFkYXRhIGlkIGlzIGFscmVhZHkgdXNlZCIpOworICAgIE51bWJlcmVkTWV0YWRhdGFbTWV0YWRhdGFJRF0gPSBJbml0OworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VBbGlhczoKKy8vLyAgIDo6PSBHbG9iYWxWYXIgJz0nIE9wdGlvbmFsVmlzaWJpbGl0eSAnYWxpYXMnIE9wdGlvbmFsTGlua2FnZSBBbGlhc2VlCisvLy8gQWxpYXNlZQorLy8vICAgOjo9IFR5cGVBbmRWYWx1ZQorLy8vICAgOjo9ICdiaXRjYXN0JyAnKCcgVHlwZUFuZFZhbHVlICd0bycgVHlwZSAnKScKKy8vLyAgIDo6PSAnZ2V0ZWxlbWVudHB0cicgJ2luYm91bmRzJz8gJygnIC4uLiAnKScKKy8vLworLy8vIEV2ZXJ5dGhpbmcgdGhyb3VnaCB2aXNpYmlsaXR5IGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLgorLy8vCitib29sIExMUGFyc2VyOjpQYXJzZUFsaWFzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBMb2NUeSBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWaXNpYmlsaXR5KSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjprd19hbGlhcyk7CisgIExleC5MZXgoKTsKKyAgdW5zaWduZWQgTGlua2FnZTsKKyAgTG9jVHkgTGlua2FnZUxvYyA9IExleC5nZXRMb2MoKTsKKyAgaWYgKFBhcnNlT3B0aW9uYWxMaW5rYWdlKExpbmthZ2UpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChMaW5rYWdlICE9IEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UgJiYKKyAgICAgIExpbmthZ2UgIT0gR2xvYmFsVmFsdWU6OldlYWtBbnlMaW5rYWdlICYmCisgICAgICBMaW5rYWdlICE9IEdsb2JhbFZhbHVlOjpXZWFrT0RSTGlua2FnZSAmJgorICAgICAgTGlua2FnZSAhPSBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlICYmCisgICAgICBMaW5rYWdlICE9IEdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSAmJgorICAgICAgTGlua2FnZSAhPSBHbG9iYWxWYWx1ZTo6TGlua2VyUHJpdmF0ZUxpbmthZ2UgJiYKKyAgICAgIExpbmthZ2UgIT0gR2xvYmFsVmFsdWU6OkxpbmtlclByaXZhdGVXZWFrTGlua2FnZSkKKyAgICByZXR1cm4gRXJyb3IoTGlua2FnZUxvYywgImludmFsaWQgbGlua2FnZSB0eXBlIGZvciBhbGlhcyIpOworCisgIENvbnN0YW50ICpBbGlhc2VlOworICBMb2NUeSBBbGlhc2VlTG9jID0gTGV4LmdldExvYygpOworICBpZiAoTGV4LmdldEtpbmQoKSAhPSBsbHRvazo6a3dfYml0Y2FzdCAmJgorICAgICAgTGV4LmdldEtpbmQoKSAhPSBsbHRvazo6a3dfZ2V0ZWxlbWVudHB0cikgeworICAgIGlmIChQYXJzZUdsb2JhbFR5cGVBbmRWYWx1ZShBbGlhc2VlKSkgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIGJpdGNhc3QgZGVzdCB0eXBlIGlzIG5vdCBwcmVzZW50LCBpdCBpcyBpbXBsaWVkIGJ5IHRoZSBkZXN0IHR5cGUuCisgICAgVmFsSUQgSUQ7CisgICAgaWYgKFBhcnNlVmFsSUQoSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoSUQuS2luZCAhPSBWYWxJRDo6dF9Db25zdGFudCkKKyAgICAgIHJldHVybiBFcnJvcihBbGlhc2VlTG9jLCAiaW52YWxpZCBhbGlhc2VlIik7CisgICAgQWxpYXNlZSA9IElELkNvbnN0YW50VmFsOworICB9CisKKyAgaWYgKCFBbGlhc2VlLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgcmV0dXJuIEVycm9yKEFsaWFzZWVMb2MsICJhbGlhcyBtdXN0IGhhdmUgcG9pbnRlciB0eXBlIik7CisKKyAgLy8gT2theSwgY3JlYXRlIHRoZSBhbGlhcyBidXQgZG8gbm90IGluc2VydCBpdCBpbnRvIHRoZSBtb2R1bGUgeWV0LgorICBHbG9iYWxBbGlhcyogR0EgPSBuZXcgR2xvYmFsQWxpYXMoQWxpYXNlZS0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMpTGlua2FnZSwgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzZWUpOworICBHQS0+c2V0VmlzaWJpbGl0eSgoR2xvYmFsVmFsdWU6OlZpc2liaWxpdHlUeXBlcylWaXNpYmlsaXR5KTsKKworICAvLyBTZWUgaWYgdGhpcyB2YWx1ZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSWYgc28sIGl0IGlzIGVpdGhlcgorICAvLyBhIHJlZGVmaW5pdGlvbiBvciBhIGRlZmluaXRpb24gb2YgYSBmb3J3YXJkIHJlZmVyZW5jZS4KKyAgaWYgKEdsb2JhbFZhbHVlICpWYWwgPSBNLT5nZXROYW1lZFZhbHVlKE5hbWUpKSB7CisgICAgLy8gU2VlIGlmIHRoaXMgd2FzIGEgcmVkZWZpbml0aW9uLiAgSWYgc28sIHRoZXJlIGlzIG5vIGVudHJ5IGluCisgICAgLy8gRm9yd2FyZFJlZlZhbHMuCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxHbG9iYWxWYWx1ZSosIExvY1R5PiA+OjppdGVyYXRvcgorICAgICAgSSA9IEZvcndhcmRSZWZWYWxzLmZpbmQoTmFtZSk7CisgICAgaWYgKEkgPT0gRm9yd2FyZFJlZlZhbHMuZW5kKCkpCisgICAgICByZXR1cm4gRXJyb3IoTmFtZUxvYywgInJlZGVmaW5pdGlvbiBvZiBnbG9iYWwgbmFtZWQgJ0AiICsgTmFtZSArICInIik7CisKKyAgICAvLyBPdGhlcndpc2UsIHRoaXMgd2FzIGEgZGVmaW5pdGlvbiBvZiBmb3J3YXJkIHJlZi4gIFZlcmlmeSB0aGF0IHR5cGVzCisgICAgLy8gYWdyZWUuCisgICAgaWYgKFZhbC0+Z2V0VHlwZSgpICE9IEdBLT5nZXRUeXBlKCkpCisgICAgICByZXR1cm4gRXJyb3IoTmFtZUxvYywKKyAgICAgICAgICAgICAgImZvcndhcmQgcmVmZXJlbmNlIGFuZCBkZWZpbml0aW9uIG9mIGFsaWFzIGhhdmUgZGlmZmVyZW50IHR5cGVzIik7CisKKyAgICAvLyBJZiB0aGV5IGFncmVlLCBqdXN0IFJBVVcgdGhlIG9sZCB2YWx1ZSB3aXRoIHRoZSBhbGlhcyBhbmQgcmVtb3ZlIHRoZQorICAgIC8vIGZvcndhcmQgcmVmIGluZm8uCisgICAgVmFsLT5yZXBsYWNlQWxsVXNlc1dpdGgoR0EpOworICAgIFZhbC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgRm9yd2FyZFJlZlZhbHMuZXJhc2UoSSk7CisgIH0KKworICAvLyBJbnNlcnQgaW50byB0aGUgbW9kdWxlLCB3ZSBrbm93IGl0cyBuYW1lIHdvbid0IGNvbGxpZGUgbm93LgorICBNLT5nZXRBbGlhc0xpc3QoKS5wdXNoX2JhY2soR0EpOworICBhc3NlcnQoR0EtPmdldE5hbWVTdHIoKSA9PSBOYW1lICYmICJTaG91bGQgbm90IGJlIGEgbmFtZSBjb25mbGljdCEiKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZUdsb2JhbAorLy8vICAgOjo9IEdsb2JhbFZhciAnPScgT3B0aW9uYWxMaW5rYWdlIE9wdGlvbmFsVmlzaWJpbGl0eSBPcHRpb25hbFRocmVhZExvY2FsCisvLy8gICAgICAgT3B0aW9uYWxBZGRyU3BhY2UgR2xvYmFsVHlwZSBUeXBlIENvbnN0CisvLy8gICA6Oj0gT3B0aW9uYWxMaW5rYWdlIE9wdGlvbmFsVmlzaWJpbGl0eSBPcHRpb25hbFRocmVhZExvY2FsCisvLy8gICAgICAgT3B0aW9uYWxBZGRyU3BhY2UgR2xvYmFsVHlwZSBUeXBlIENvbnN0CisvLy8KKy8vLyBFdmVyeXRoaW5nIHRocm91Z2ggdmlzaWJpbGl0eSBoYXMgYmVlbiBwYXJzZWQgYWxyZWFkeS4KKy8vLworYm9vbCBMTFBhcnNlcjo6UGFyc2VHbG9iYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIExvY1R5IE5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5rYWdlLCBib29sIEhhc0xpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWaXNpYmlsaXR5KSB7CisgIHVuc2lnbmVkIEFkZHJTcGFjZTsKKyAgYm9vbCBUaHJlYWRMb2NhbCwgSXNDb25zdGFudDsKKyAgTG9jVHkgVHlMb2M7CisKKyAgUEFUeXBlSG9sZGVyIFR5KFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgIGlmIChQYXJzZU9wdGlvbmFsVG9rZW4obGx0b2s6Omt3X3RocmVhZF9sb2NhbCwgVGhyZWFkTG9jYWwpIHx8CisgICAgICBQYXJzZU9wdGlvbmFsQWRkclNwYWNlKEFkZHJTcGFjZSkgfHwKKyAgICAgIFBhcnNlR2xvYmFsVHlwZShJc0NvbnN0YW50KSB8fAorICAgICAgUGFyc2VUeXBlKFR5LCBUeUxvYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gSWYgdGhlIGxpbmthZ2UgaXMgc3BlY2lmaWVkIGFuZCBpcyBleHRlcm5hbCwgdGhlbiBubyBpbml0aWFsaXplciBpcworICAvLyBwcmVzZW50LgorICBDb25zdGFudCAqSW5pdCA9IDA7CisgIGlmICghSGFzTGlua2FnZSB8fCAoTGlua2FnZSAhPSBHbG9iYWxWYWx1ZTo6RExMSW1wb3J0TGlua2FnZSAmJgorICAgICAgICAgICAgICAgICAgICAgIExpbmthZ2UgIT0gR2xvYmFsVmFsdWU6OkV4dGVybmFsV2Vha0xpbmthZ2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICBMaW5rYWdlICE9IEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UpKSB7CisgICAgaWYgKFBhcnNlR2xvYmFsVmFsdWUoVHksIEluaXQpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoVHktPmlzRnVuY3Rpb25UeSgpIHx8IFR5LT5pc0xhYmVsVHkoKSkKKyAgICByZXR1cm4gRXJyb3IoVHlMb2MsICJpbnZhbGlkIHR5cGUgZm9yIGdsb2JhbCB2YXJpYWJsZSIpOworCisgIEdsb2JhbFZhcmlhYmxlICpHViA9IDA7CisKKyAgLy8gU2VlIGlmIHRoZSBnbG9iYWwgd2FzIGZvcndhcmQgcmVmZXJlbmNlZCwgaWYgc28sIHVzZSB0aGUgZ2xvYmFsLgorICBpZiAoIU5hbWUuZW1wdHkoKSkgeworICAgIGlmIChHbG9iYWxWYWx1ZSAqR1ZhbCA9IE0tPmdldE5hbWVkVmFsdWUoTmFtZSkpIHsKKyAgICAgIGlmICghRm9yd2FyZFJlZlZhbHMuZXJhc2UoTmFtZSkgfHwgIWlzYTxHbG9iYWxWYWx1ZT4oR1ZhbCkpCisgICAgICAgIHJldHVybiBFcnJvcihOYW1lTG9jLCAicmVkZWZpbml0aW9uIG9mIGdsb2JhbCAnQCIgKyBOYW1lICsgIiciKTsKKyAgICAgIEdWID0gY2FzdDxHbG9iYWxWYXJpYWJsZT4oR1ZhbCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnBhaXI8R2xvYmFsVmFsdWUqLCBMb2NUeT4gPjo6aXRlcmF0b3IKKyAgICAgIEkgPSBGb3J3YXJkUmVmVmFsSURzLmZpbmQoTnVtYmVyZWRWYWxzLnNpemUoKSk7CisgICAgaWYgKEkgIT0gRm9yd2FyZFJlZlZhbElEcy5lbmQoKSkgeworICAgICAgR1YgPSBjYXN0PEdsb2JhbFZhcmlhYmxlPihJLT5zZWNvbmQuZmlyc3QpOworICAgICAgRm9yd2FyZFJlZlZhbElEcy5lcmFzZShJKTsKKyAgICB9CisgIH0KKworICBpZiAoR1YgPT0gMCkgeworICAgIEdWID0gbmV3IEdsb2JhbFZhcmlhYmxlKCpNLCBUeSwgZmFsc2UsIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSwgMCwgZmFsc2UsIEFkZHJTcGFjZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKEdWLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkgIT0gVHkpCisgICAgICByZXR1cm4gRXJyb3IoVHlMb2MsCisgICAgICAgICAgICAiZm9yd2FyZCByZWZlcmVuY2UgYW5kIGRlZmluaXRpb24gb2YgZ2xvYmFsIGhhdmUgZGlmZmVyZW50IHR5cGVzIik7CisKKyAgICAvLyBNb3ZlIHRoZSBmb3J3YXJkLXJlZmVyZW5jZSB0byB0aGUgY29ycmVjdCBzcG90IGluIHRoZSBtb2R1bGUuCisgICAgTS0+Z2V0R2xvYmFsTGlzdCgpLnNwbGljZShNLT5nbG9iYWxfZW5kKCksIE0tPmdldEdsb2JhbExpc3QoKSwgR1YpOworICB9CisKKyAgaWYgKE5hbWUuZW1wdHkoKSkKKyAgICBOdW1iZXJlZFZhbHMucHVzaF9iYWNrKEdWKTsKKworICAvLyBTZXQgdGhlIHBhcnNlZCBwcm9wZXJ0aWVzIG9uIHRoZSBnbG9iYWwuCisgIGlmIChJbml0KQorICAgIEdWLT5zZXRJbml0aWFsaXplcihJbml0KTsKKyAgR1YtPnNldENvbnN0YW50KElzQ29uc3RhbnQpOworICBHVi0+c2V0TGlua2FnZSgoR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcylMaW5rYWdlKTsKKyAgR1YtPnNldFZpc2liaWxpdHkoKEdsb2JhbFZhbHVlOjpWaXNpYmlsaXR5VHlwZXMpVmlzaWJpbGl0eSk7CisgIEdWLT5zZXRUaHJlYWRMb2NhbChUaHJlYWRMb2NhbCk7CisKKyAgLy8gUGFyc2UgYXR0cmlidXRlcyBvbiB0aGUgZ2xvYmFsLgorICB3aGlsZSAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6Y29tbWEpIHsKKyAgICBMZXguTGV4KCk7CisKKyAgICBpZiAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6a3dfc2VjdGlvbikgeworICAgICAgTGV4LkxleCgpOworICAgICAgR1YtPnNldFNlY3Rpb24oTGV4LmdldFN0clZhbCgpKTsKKyAgICAgIGlmIChQYXJzZVRva2VuKGxsdG9rOjpTdHJpbmdDb25zdGFudCwgImV4cGVjdGVkIGdsb2JhbCBzZWN0aW9uIHN0cmluZyIpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKExleC5nZXRLaW5kKCkgPT0gbGx0b2s6Omt3X2FsaWduKSB7CisgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQ7CisgICAgICBpZiAoUGFyc2VPcHRpb25hbEFsaWdubWVudChBbGlnbm1lbnQpKSByZXR1cm4gdHJ1ZTsKKyAgICAgIEdWLT5zZXRBbGlnbm1lbnQoQWxpZ25tZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgVG9rRXJyb3IoInVua25vd24gZ2xvYmFsIHZhcmlhYmxlIHByb3BlcnR5ISIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR2xvYmFsVmFsdWUgUmVmZXJlbmNlL1Jlc29sdXRpb24gUm91dGluZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gR2V0R2xvYmFsVmFsIC0gR2V0IGEgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgb3IgSUQsIGNyZWF0aW5nIGEKKy8vLyBmb3J3YXJkIHJlZmVyZW5jZSByZWNvcmQgaWYgbmVlZGVkLiAgVGhpcyBjYW4gcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlCisvLy8gZXhpc3RzIGJ1dCBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCB0eXBlLgorR2xvYmFsVmFsdWUgKkxMUGFyc2VyOjpHZXRHbG9iYWxWYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jVHkgTG9jKSB7CisgIGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oVHkpOworICBpZiAoUFR5ID09IDApIHsKKyAgICBFcnJvcihMb2MsICJnbG9iYWwgdmFyaWFibGUgcmVmZXJlbmNlIG11c3QgaGF2ZSBwb2ludGVyIHR5cGUiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIExvb2sgdGhpcyBuYW1lIHVwIGluIHRoZSBub3JtYWwgZnVuY3Rpb24gc3ltYm9sIHRhYmxlLgorICBHbG9iYWxWYWx1ZSAqVmFsID0KKyAgICBjYXN0X29yX251bGw8R2xvYmFsVmFsdWU+KE0tPmdldFZhbHVlU3ltYm9sVGFibGUoKS5sb29rdXAoTmFtZSkpOworCisgIC8vIElmIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSBmb3IgdGhlIHZhbHVlLCBzZWUgaWYgd2UgYWxyZWFkeSBjcmVhdGVkIGEKKyAgLy8gZm9yd2FyZCByZWYgcmVjb3JkLgorICBpZiAoVmFsID09IDApIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpwYWlyPEdsb2JhbFZhbHVlKiwgTG9jVHk+ID46Oml0ZXJhdG9yCisgICAgICBJID0gRm9yd2FyZFJlZlZhbHMuZmluZChOYW1lKTsKKyAgICBpZiAoSSAhPSBGb3J3YXJkUmVmVmFscy5lbmQoKSkKKyAgICAgIFZhbCA9IEktPnNlY29uZC5maXJzdDsKKyAgfQorCisgIC8vIElmIHdlIGhhdmUgdGhlIHZhbHVlIGluIHRoZSBzeW1ib2wgdGFibGUgb3IgZndkLXJlZiB0YWJsZSwgcmV0dXJuIGl0LgorICBpZiAoVmFsKSB7CisgICAgaWYgKFZhbC0+Z2V0VHlwZSgpID09IFR5KSByZXR1cm4gVmFsOworICAgIEVycm9yKExvYywgIidAIiArIE5hbWUgKyAiJyBkZWZpbmVkIHdpdGggdHlwZSAnIiArCisgICAgICAgICAgVmFsLT5nZXRUeXBlKCktPmdldERlc2NyaXB0aW9uKCkgKyAiJyIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgZm9yd2FyZCByZWZlcmVuY2UgZm9yIHRoaXMgdmFsdWUgYW5kIHJlbWVtYmVyIGl0LgorICBHbG9iYWxWYWx1ZSAqRndkVmFsOworICBpZiAoY29uc3QgRnVuY3Rpb25UeXBlICpGVCA9IGR5bl9jYXN0PEZ1bmN0aW9uVHlwZT4oUFR5LT5nZXRFbGVtZW50VHlwZSgpKSkgeworICAgIC8vIEZ1bmN0aW9uIHR5cGVzIGNhbiByZXR1cm4gb3BhcXVlIGJ1dCBmdW5jdGlvbnMgY2FuJ3QuCisgICAgaWYgKEZULT5nZXRSZXR1cm5UeXBlKCktPmlzT3BhcXVlVHkoKSkgeworICAgICAgRXJyb3IoTG9jLCAiZnVuY3Rpb24gbWF5IG5vdCByZXR1cm4gb3BhcXVlIHR5cGUiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEZ3ZFZhbCA9IEZ1bmN0aW9uOjpDcmVhdGUoRlQsIEdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlLCBOYW1lLCBNKTsKKyAgfSBlbHNlIHsKKyAgICBGd2RWYWwgPSBuZXcgR2xvYmFsVmFyaWFibGUoKk0sIFBUeS0+Z2V0RWxlbWVudFR5cGUoKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlLCAwLCBOYW1lKTsKKyAgfQorCisgIEZvcndhcmRSZWZWYWxzW05hbWVdID0gc3RkOjptYWtlX3BhaXIoRndkVmFsLCBMb2MpOworICByZXR1cm4gRndkVmFsOworfQorCitHbG9iYWxWYWx1ZSAqTExQYXJzZXI6OkdldEdsb2JhbFZhbCh1bnNpZ25lZCBJRCwgY29uc3QgVHlwZSAqVHksIExvY1R5IExvYykgeworICBjb25zdCBQb2ludGVyVHlwZSAqUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFR5KTsKKyAgaWYgKFBUeSA9PSAwKSB7CisgICAgRXJyb3IoTG9jLCAiZ2xvYmFsIHZhcmlhYmxlIHJlZmVyZW5jZSBtdXN0IGhhdmUgcG9pbnRlciB0eXBlIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBHbG9iYWxWYWx1ZSAqVmFsID0gSUQgPCBOdW1iZXJlZFZhbHMuc2l6ZSgpID8gTnVtYmVyZWRWYWxzW0lEXSA6IDA7CisKKyAgLy8gSWYgdGhpcyBpcyBhIGZvcndhcmQgcmVmZXJlbmNlIGZvciB0aGUgdmFsdWUsIHNlZSBpZiB3ZSBhbHJlYWR5IGNyZWF0ZWQgYQorICAvLyBmb3J3YXJkIHJlZiByZWNvcmQuCisgIGlmIChWYWwgPT0gMCkgeworICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnBhaXI8R2xvYmFsVmFsdWUqLCBMb2NUeT4gPjo6aXRlcmF0b3IKKyAgICAgIEkgPSBGb3J3YXJkUmVmVmFsSURzLmZpbmQoSUQpOworICAgIGlmIChJICE9IEZvcndhcmRSZWZWYWxJRHMuZW5kKCkpCisgICAgICBWYWwgPSBJLT5zZWNvbmQuZmlyc3Q7CisgIH0KKworICAvLyBJZiB3ZSBoYXZlIHRoZSB2YWx1ZSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9yIGZ3ZC1yZWYgdGFibGUsIHJldHVybiBpdC4KKyAgaWYgKFZhbCkgeworICAgIGlmIChWYWwtPmdldFR5cGUoKSA9PSBUeSkgcmV0dXJuIFZhbDsKKyAgICBFcnJvcihMb2MsICInQCIgKyB1dG9zdHIoSUQpICsgIicgZGVmaW5lZCB3aXRoIHR5cGUgJyIgKworICAgICAgICAgIFZhbC0+Z2V0VHlwZSgpLT5nZXREZXNjcmlwdGlvbigpICsgIiciKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IGZvcndhcmQgcmVmZXJlbmNlIGZvciB0aGlzIHZhbHVlIGFuZCByZW1lbWJlciBpdC4KKyAgR2xvYmFsVmFsdWUgKkZ3ZFZhbDsKKyAgaWYgKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPSBkeW5fY2FzdDxGdW5jdGlvblR5cGU+KFBUeS0+Z2V0RWxlbWVudFR5cGUoKSkpIHsKKyAgICAvLyBGdW5jdGlvbiB0eXBlcyBjYW4gcmV0dXJuIG9wYXF1ZSBidXQgZnVuY3Rpb25zIGNhbid0LgorICAgIGlmIChGVC0+Z2V0UmV0dXJuVHlwZSgpLT5pc09wYXF1ZVR5KCkpIHsKKyAgICAgIEVycm9yKExvYywgImZ1bmN0aW9uIG1heSBub3QgcmV0dXJuIG9wYXF1ZSB0eXBlIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgRndkVmFsID0gRnVuY3Rpb246OkNyZWF0ZShGVCwgR2xvYmFsVmFsdWU6OkV4dGVybmFsV2Vha0xpbmthZ2UsICIiLCBNKTsKKyAgfSBlbHNlIHsKKyAgICBGd2RWYWwgPSBuZXcgR2xvYmFsVmFyaWFibGUoKk0sIFBUeS0+Z2V0RWxlbWVudFR5cGUoKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlLCAwLCAiIik7CisgIH0KKworICBGb3J3YXJkUmVmVmFsSURzW0lEXSA9IHN0ZDo6bWFrZV9wYWlyKEZ3ZFZhbCwgTG9jKTsKKyAgcmV0dXJuIEZ3ZFZhbDsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSGVscGVyIFJvdXRpbmVzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFBhcnNlVG9rZW4gLSBJZiB0aGUgY3VycmVudCB0b2tlbiBoYXMgdGhlIHNwZWNpZmllZCBraW5kLCBlYXQgaXQgYW5kIHJldHVybgorLy8vIHN1Y2Nlc3MuICBPdGhlcndpc2UsIGVtaXQgdGhlIHNwZWNpZmllZCBlcnJvciBhbmQgcmV0dXJuIGZhaWx1cmUuCitib29sIExMUGFyc2VyOjpQYXJzZVRva2VuKGxsdG9rOjpLaW5kIFQsIGNvbnN0IGNoYXIgKkVyck1zZykgeworICBpZiAoTGV4LmdldEtpbmQoKSAhPSBUKQorICAgIHJldHVybiBUb2tFcnJvcihFcnJNc2cpOworICBMZXguTGV4KCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlU3RyaW5nQ29uc3RhbnQKKy8vLyAgIDo6PSBTdHJpbmdDb25zdGFudAorYm9vbCBMTFBhcnNlcjo6UGFyc2VTdHJpbmdDb25zdGFudChzdGQ6OnN0cmluZyAmUmVzdWx0KSB7CisgIGlmIChMZXguZ2V0S2luZCgpICE9IGxsdG9rOjpTdHJpbmdDb25zdGFudCkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIHN0cmluZyBjb25zdGFudCIpOworICBSZXN1bHQgPSBMZXguZ2V0U3RyVmFsKCk7CisgIExleC5MZXgoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VVSW50MzIKKy8vLyAgIDo6PSB1aW50MzIKK2Jvb2wgTExQYXJzZXI6OlBhcnNlVUludDMyKHVuc2lnbmVkICZWYWwpIHsKKyAgaWYgKExleC5nZXRLaW5kKCkgIT0gbGx0b2s6OkFQU0ludCB8fCBMZXguZ2V0QVBTSW50VmFsKCkuaXNTaWduZWQoKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIGludGVnZXIiKTsKKyAgdWludDY0X3QgVmFsNjQgPSBMZXguZ2V0QVBTSW50VmFsKCkuZ2V0TGltaXRlZFZhbHVlKDB4RkZGRkZGRkZVTEwrMSk7CisgIGlmIChWYWw2NCAhPSB1bnNpZ25lZChWYWw2NCkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCAzMi1iaXQgaW50ZWdlciAodG9vIGxhcmdlKSIpOworICBWYWwgPSBWYWw2NDsKKyAgTGV4LkxleCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIFBhcnNlT3B0aW9uYWxBZGRyU3BhY2UKKy8vLyAgIDo9IC8qZW1wdHkqLworLy8vICAgOj0gJ2FkZHJzcGFjZScgJygnIHVpbnQzMiAnKScKK2Jvb2wgTExQYXJzZXI6OlBhcnNlT3B0aW9uYWxBZGRyU3BhY2UodW5zaWduZWQgJkFkZHJTcGFjZSkgeworICBBZGRyU3BhY2UgPSAwOworICBpZiAoIUVhdElmUHJlc2VudChsbHRvazo6a3dfYWRkcnNwYWNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBQYXJzZVRva2VuKGxsdG9rOjpscGFyZW4sICJleHBlY3RlZCAnKCcgaW4gYWRkcmVzcyBzcGFjZSIpIHx8CisgICAgICAgICBQYXJzZVVJbnQzMihBZGRyU3BhY2UpIHx8CisgICAgICAgICBQYXJzZVRva2VuKGxsdG9rOjpycGFyZW4sICJleHBlY3RlZCAnKScgaW4gYWRkcmVzcyBzcGFjZSIpOworfQorCisvLy8gUGFyc2VPcHRpb25hbEF0dHJzIC0gUGFyc2UgYSBwb3RlbnRpYWxseSBlbXB0eSBhdHRyaWJ1dGUgbGlzdC4gIEF0dHJLaW5kCisvLy8gaW5kaWNhdGVzIHdoYXQga2luZCBvZiBhdHRyaWJ1dGUgbGlzdCB0aGlzIGlzOiAwOiBmdW5jdGlvbiBhcmcsIDE6IHJlc3VsdCwKKy8vLyAyOiBmdW5jdGlvbiBhdHRyLgorLy8vIDM6IGZ1bmN0aW9uIGFyZyBhZnRlciB2YWx1ZTogRklYTUU6IFJFTU9WRSBJTiBMTFZNIDMuMAorYm9vbCBMTFBhcnNlcjo6UGFyc2VPcHRpb25hbEF0dHJzKHVuc2lnbmVkICZBdHRycywgdW5zaWduZWQgQXR0cktpbmQpIHsKKyAgQXR0cnMgPSBBdHRyaWJ1dGU6Ok5vbmU7CisgIExvY1R5IEF0dHJMb2MgPSBMZXguZ2V0TG9jKCk7CisKKyAgd2hpbGUgKDEpIHsKKyAgICBzd2l0Y2ggKExleC5nZXRLaW5kKCkpIHsKKyAgICBjYXNlIGxsdG9rOjprd19zZXh0OgorICAgIGNhc2UgbGx0b2s6Omt3X3pleHQ6CisgICAgICAvLyBUcmVhdCB0aGVzZSBhcyBzaWduZXh0L3plcm9leHQgaWYgdGhleSBvY2N1ciBpbiB0aGUgYXJndW1lbnQgbGlzdCBhZnRlcgorICAgICAgLy8gdGhlIHZhbHVlLCBhcyBpbiAiY2FsbCBpOCBAZm9vKGk4IDEwIHNleHQpIi4gIElmIHRoZXkgb2NjdXIgYmVmb3JlIHRoZQorICAgICAgLy8gdmFsdWUsIGFzIGluICJjYWxsIGk4IEBmb28oaTggc2V4dCAoIiB0aGVuIGl0IGlzIHBhcnQgb2YgYSBjb25zdGFudAorICAgICAgLy8gZXhwci4KKyAgICAgIC8vIEZJWE1FOiBSRU1PVkUgVEhJUyBJTiBMTFZNIDMuMAorICAgICAgaWYgKEF0dHJLaW5kID09IDMpIHsKKyAgICAgICAgaWYgKExleC5nZXRLaW5kKCkgPT0gbGx0b2s6Omt3X3NleHQpCisgICAgICAgICAgQXR0cnMgfD0gQXR0cmlidXRlOjpTRXh0OworICAgICAgICBlbHNlCisgICAgICAgICAgQXR0cnMgfD0gQXR0cmlidXRlOjpaRXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIEZBTEwgVEhST1VHSC4KKyAgICBkZWZhdWx0OiAgLy8gRW5kIG9mIGF0dHJpYnV0ZXMuCisgICAgICBpZiAoQXR0cktpbmQgIT0gMiAmJiAoQXR0cnMgJiBBdHRyaWJ1dGU6OkZ1bmN0aW9uT25seSkpCisgICAgICAgIHJldHVybiBFcnJvcihBdHRyTG9jLCAiaW52YWxpZCB1c2Ugb2YgZnVuY3Rpb24tb25seSBhdHRyaWJ1dGUiKTsKKworICAgICAgaWYgKEF0dHJLaW5kICE9IDAgJiYgQXR0cktpbmQgIT0gMyAmJiAoQXR0cnMgJiBBdHRyaWJ1dGU6OlBhcmFtZXRlck9ubHkpKQorICAgICAgICByZXR1cm4gRXJyb3IoQXR0ckxvYywgImludmFsaWQgdXNlIG9mIHBhcmFtZXRlci1vbmx5IGF0dHJpYnV0ZSIpOworCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBsbHRvazo6a3dfemVyb2V4dDogICAgICAgICBBdHRycyB8PSBBdHRyaWJ1dGU6OlpFeHQ7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3NpZ25leHQ6ICAgICAgICAgQXR0cnMgfD0gQXR0cmlidXRlOjpTRXh0OyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19pbnJlZzogICAgICAgICAgIEF0dHJzIHw9IEF0dHJpYnV0ZTo6SW5SZWc7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3NyZXQ6ICAgICAgICAgICAgQXR0cnMgfD0gQXR0cmlidXRlOjpTdHJ1Y3RSZXQ7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X25vYWxpYXM6ICAgICAgICAgQXR0cnMgfD0gQXR0cmlidXRlOjpOb0FsaWFzOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19ub2NhcHR1cmU6ICAgICAgIEF0dHJzIHw9IEF0dHJpYnV0ZTo6Tm9DYXB0dXJlOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19ieXZhbDogICAgICAgICAgIEF0dHJzIHw9IEF0dHJpYnV0ZTo6QnlWYWw7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X25lc3Q6ICAgICAgICAgICAgQXR0cnMgfD0gQXR0cmlidXRlOjpOZXN0OyBicmVhazsKKworICAgIGNhc2UgbGx0b2s6Omt3X25vcmV0dXJuOiAgICAgICAgQXR0cnMgfD0gQXR0cmlidXRlOjpOb1JldHVybjsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfbm91bndpbmQ6ICAgICAgICBBdHRycyB8PSBBdHRyaWJ1dGU6Ok5vVW53aW5kOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19ub2lubGluZTogICAgICAgIEF0dHJzIHw9IEF0dHJpYnV0ZTo6Tm9JbmxpbmU7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3JlYWRub25lOiAgICAgICAgQXR0cnMgfD0gQXR0cmlidXRlOjpSZWFkTm9uZTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfcmVhZG9ubHk6ICAgICAgICBBdHRycyB8PSBBdHRyaWJ1dGU6OlJlYWRPbmx5OyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19pbmxpbmVoaW50OiAgICAgIEF0dHJzIHw9IEF0dHJpYnV0ZTo6SW5saW5lSGludDsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfYWx3YXlzaW5saW5lOiAgICBBdHRycyB8PSBBdHRyaWJ1dGU6OkFsd2F5c0lubGluZTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfb3B0c2l6ZTogICAgICAgICBBdHRycyB8PSBBdHRyaWJ1dGU6Ok9wdGltaXplRm9yU2l6ZTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfc3NwOiAgICAgICAgICAgICBBdHRycyB8PSBBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdDsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfc3NwcmVxOiAgICAgICAgICBBdHRycyB8PSBBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdFJlcTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfbm9yZWR6b25lOiAgICAgICBBdHRycyB8PSBBdHRyaWJ1dGU6Ok5vUmVkWm9uZTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfbm9pbXBsaWNpdGZsb2F0OiBBdHRycyB8PSBBdHRyaWJ1dGU6Ok5vSW1wbGljaXRGbG9hdDsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfbmFrZWQ6ICAgICAgICAgICBBdHRycyB8PSBBdHRyaWJ1dGU6Ok5ha2VkOyBicmVhazsKKworICAgIGNhc2UgbGx0b2s6Omt3X2FsaWduc3RhY2s6IHsKKyAgICAgIHVuc2lnbmVkIEFsaWdubWVudDsKKyAgICAgIGlmIChQYXJzZU9wdGlvbmFsU3RhY2tBbGlnbm1lbnQoQWxpZ25tZW50KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBBdHRycyB8PSBBdHRyaWJ1dGU6OmNvbnN0cnVjdFN0YWNrQWxpZ25tZW50RnJvbUludChBbGlnbm1lbnQpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgY2FzZSBsbHRvazo6a3dfYWxpZ246IHsKKyAgICAgIHVuc2lnbmVkIEFsaWdubWVudDsKKyAgICAgIGlmIChQYXJzZU9wdGlvbmFsQWxpZ25tZW50KEFsaWdubWVudCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgQXR0cnMgfD0gQXR0cmlidXRlOjpjb25zdHJ1Y3RBbGlnbm1lbnRGcm9tSW50KEFsaWdubWVudCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB9CisgICAgTGV4LkxleCgpOworICB9Cit9CisKKy8vLyBQYXJzZU9wdGlvbmFsTGlua2FnZQorLy8vICAgOjo9IC8qZW1wdHkqLworLy8vICAgOjo9ICdwcml2YXRlJworLy8vICAgOjo9ICdsaW5rZXJfcHJpdmF0ZScKKy8vLyAgIDo6PSAnbGlua2VyX3ByaXZhdGVfd2VhaycKKy8vLyAgIDo6PSAnaW50ZXJuYWwnCisvLy8gICA6Oj0gJ3dlYWsnCisvLy8gICA6Oj0gJ3dlYWtfb2RyJworLy8vICAgOjo9ICdsaW5rb25jZScKKy8vLyAgIDo6PSAnbGlua29uY2Vfb2RyJworLy8vICAgOjo9ICdhdmFpbGFibGVfZXh0ZXJuYWxseScKKy8vLyAgIDo6PSAnYXBwZW5kaW5nJworLy8vICAgOjo9ICdkbGxleHBvcnQnCisvLy8gICA6Oj0gJ2NvbW1vbicKKy8vLyAgIDo6PSAnZGxsaW1wb3J0JworLy8vICAgOjo9ICdleHRlcm5fd2VhaycKKy8vLyAgIDo6PSAnZXh0ZXJuYWwnCitib29sIExMUGFyc2VyOjpQYXJzZU9wdGlvbmFsTGlua2FnZSh1bnNpZ25lZCAmUmVzLCBib29sICZIYXNMaW5rYWdlKSB7CisgIEhhc0xpbmthZ2UgPSBmYWxzZTsKKyAgc3dpdGNoIChMZXguZ2V0S2luZCgpKSB7CisgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICBSZXM9R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZTsgcmV0dXJuIGZhbHNlOworICBjYXNlIGxsdG9rOjprd19wcml2YXRlOiAgICAgICAgUmVzID0gR2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlOyAgICAgICBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfbGlua2VyX3ByaXZhdGU6IFJlcyA9IEdsb2JhbFZhbHVlOjpMaW5rZXJQcml2YXRlTGlua2FnZTsgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X2xpbmtlcl9wcml2YXRlX3dlYWs6CisgICAgUmVzID0gR2xvYmFsVmFsdWU6OkxpbmtlclByaXZhdGVXZWFrTGlua2FnZTsKKyAgICBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfaW50ZXJuYWw6ICAgICAgIFJlcyA9IEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2U7ICAgICAgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X3dlYWs6ICAgICAgICAgICBSZXMgPSBHbG9iYWxWYWx1ZTo6V2Vha0FueUxpbmthZ2U7ICAgICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjprd193ZWFrX29kcjogICAgICAgUmVzID0gR2xvYmFsVmFsdWU6OldlYWtPRFJMaW5rYWdlOyAgICAgICBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfbGlua29uY2U6ICAgICAgIFJlcyA9IEdsb2JhbFZhbHVlOjpMaW5rT25jZUFueUxpbmthZ2U7ICAgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X2xpbmtvbmNlX29kcjogICBSZXMgPSBHbG9iYWxWYWx1ZTo6TGlua09uY2VPRFJMaW5rYWdlOyAgIGJyZWFrOworICBjYXNlIGxsdG9rOjprd19hdmFpbGFibGVfZXh0ZXJuYWxseToKKyAgICBSZXMgPSBHbG9iYWxWYWx1ZTo6QXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2U7CisgICAgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X2FwcGVuZGluZzogICAgICBSZXMgPSBHbG9iYWxWYWx1ZTo6QXBwZW5kaW5nTGlua2FnZTsgICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjprd19kbGxleHBvcnQ6ICAgICAgUmVzID0gR2xvYmFsVmFsdWU6OkRMTEV4cG9ydExpbmthZ2U7ICAgICBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfY29tbW9uOiAgICAgICAgIFJlcyA9IEdsb2JhbFZhbHVlOjpDb21tb25MaW5rYWdlOyAgICAgICAgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X2RsbGltcG9ydDogICAgICBSZXMgPSBHbG9iYWxWYWx1ZTo6RExMSW1wb3J0TGlua2FnZTsgICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjprd19leHRlcm5fd2VhazogICAgUmVzID0gR2xvYmFsVmFsdWU6OkV4dGVybmFsV2Vha0xpbmthZ2U7ICBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfZXh0ZXJuYWw6ICAgICAgIFJlcyA9IEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2U7ICAgICAgYnJlYWs7CisgIH0KKyAgTGV4LkxleCgpOworICBIYXNMaW5rYWdlID0gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VPcHRpb25hbFZpc2liaWxpdHkKKy8vLyAgIDo6PSAvKmVtcHR5Ki8KKy8vLyAgIDo6PSAnZGVmYXVsdCcKKy8vLyAgIDo6PSAnaGlkZGVuJworLy8vICAgOjo9ICdwcm90ZWN0ZWQnCisvLy8KK2Jvb2wgTExQYXJzZXI6OlBhcnNlT3B0aW9uYWxWaXNpYmlsaXR5KHVuc2lnbmVkICZSZXMpIHsKKyAgc3dpdGNoIChMZXguZ2V0S2luZCgpKSB7CisgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgUmVzID0gR2xvYmFsVmFsdWU6OkRlZmF1bHRWaXNpYmlsaXR5OyByZXR1cm4gZmFsc2U7CisgIGNhc2UgbGx0b2s6Omt3X2RlZmF1bHQ6ICAgUmVzID0gR2xvYmFsVmFsdWU6OkRlZmF1bHRWaXNpYmlsaXR5OyBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfaGlkZGVuOiAgICBSZXMgPSBHbG9iYWxWYWx1ZTo6SGlkZGVuVmlzaWJpbGl0eTsgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X3Byb3RlY3RlZDogUmVzID0gR2xvYmFsVmFsdWU6OlByb3RlY3RlZFZpc2liaWxpdHk7IGJyZWFrOworICB9CisgIExleC5MZXgoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VPcHRpb25hbENhbGxpbmdDb252CisvLy8gICA6Oj0gLyplbXB0eSovCisvLy8gICA6Oj0gJ2NjYycKKy8vLyAgIDo6PSAnZmFzdGNjJworLy8vICAgOjo9ICdjb2xkY2MnCisvLy8gICA6Oj0gJ3g4Nl9zdGRjYWxsY2MnCisvLy8gICA6Oj0gJ3g4Nl9mYXN0Y2FsbGNjJworLy8vICAgOjo9ICd4ODZfdGhpc2NhbGxjYycKKy8vLyAgIDo6PSAnYXJtX2FwY3NjYycKKy8vLyAgIDo6PSAnYXJtX2FhcGNzY2MnCisvLy8gICA6Oj0gJ2FybV9hYXBjc192ZnBjYycKKy8vLyAgIDo6PSAnbXNwNDMwX2ludHJjYycKKy8vLyAgIDo6PSAnY2MnIFVJTlQKKy8vLworYm9vbCBMTFBhcnNlcjo6UGFyc2VPcHRpb25hbENhbGxpbmdDb252KENhbGxpbmdDb252OjpJRCAmQ0MpIHsKKyAgc3dpdGNoIChMZXguZ2V0S2luZCgpKSB7CisgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICBDQyA9IENhbGxpbmdDb252OjpDOyByZXR1cm4gZmFsc2U7CisgIGNhc2UgbGx0b2s6Omt3X2NjYzogICAgICAgICAgICBDQyA9IENhbGxpbmdDb252OjpDOyBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfZmFzdGNjOiAgICAgICAgIENDID0gQ2FsbGluZ0NvbnY6OkZhc3Q7IGJyZWFrOworICBjYXNlIGxsdG9rOjprd19jb2xkY2M6ICAgICAgICAgQ0MgPSBDYWxsaW5nQ29udjo6Q29sZDsgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X3g4Nl9zdGRjYWxsY2M6ICBDQyA9IENhbGxpbmdDb252OjpYODZfU3RkQ2FsbDsgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X3g4Nl9mYXN0Y2FsbGNjOiBDQyA9IENhbGxpbmdDb252OjpYODZfRmFzdENhbGw7IGJyZWFrOworICBjYXNlIGxsdG9rOjprd194ODZfdGhpc2NhbGxjYzogQ0MgPSBDYWxsaW5nQ29udjo6WDg2X1RoaXNDYWxsOyBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfYXJtX2FwY3NjYzogICAgIENDID0gQ2FsbGluZ0NvbnY6OkFSTV9BUENTOyBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfYXJtX2FhcGNzY2M6ICAgIENDID0gQ2FsbGluZ0NvbnY6OkFSTV9BQVBDUzsgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X2FybV9hYXBjc192ZnBjYzpDQyA9IENhbGxpbmdDb252OjpBUk1fQUFQQ1NfVkZQOyBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfbXNwNDMwX2ludHJjYzogIENDID0gQ2FsbGluZ0NvbnY6Ok1TUDQzMF9JTlRSOyBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfY2M6IHsKKyAgICAgIHVuc2lnbmVkIEFyYml0cmFyeUNDOworICAgICAgTGV4LkxleCgpOworICAgICAgaWYgKFBhcnNlVUludDMyKEFyYml0cmFyeUNDKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZQorICAgICAgICBDQyA9IHN0YXRpY19jYXN0PENhbGxpbmdDb252OjpJRD4oQXJiaXRyYXJ5Q0MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgTGV4LkxleCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZUluc3RydWN0aW9uTWV0YWRhdGEKKy8vLyAgIDo6PSAhZGJnICE0MiAoJywnICFkYmcgITU3KSoKK2Jvb2wgTExQYXJzZXI6OlBhcnNlSW5zdHJ1Y3Rpb25NZXRhZGF0YShJbnN0cnVjdGlvbiAqSW5zdCkgeworICBkbyB7CisgICAgaWYgKExleC5nZXRLaW5kKCkgIT0gbGx0b2s6Ok1ldGFkYXRhVmFyKQorICAgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBtZXRhZGF0YSBhZnRlciBjb21tYSIpOworCisgICAgc3RkOjpzdHJpbmcgTmFtZSA9IExleC5nZXRTdHJWYWwoKTsKKyAgICBMZXguTGV4KCk7CisKKyAgICBNRE5vZGUgKk5vZGU7CisgICAgdW5zaWduZWQgTm9kZUlEOworICAgIFNNTG9jIExvYyA9IExleC5nZXRMb2MoKTsKKyAgICBpZiAoUGFyc2VUb2tlbihsbHRvazo6ZXhjbGFpbSwgImV4cGVjdGVkICchJyBoZXJlIikgfHwKKyAgICAgICAgUGFyc2VNRE5vZGVJRChOb2RlLCBOb2RlSUQpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB1bnNpZ25lZCBNREsgPSBNLT5nZXRNREtpbmRJRChOYW1lLmNfc3RyKCkpOworICAgIGlmIChOb2RlKSB7CisgICAgICAvLyBJZiB3ZSBnb3QgdGhlIG5vZGUsIGFkZCBpdCB0byB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgICBJbnN0LT5zZXRNZXRhZGF0YShNREssIE5vZGUpOworICAgIH0gZWxzZSB7CisgICAgICBNRFJlZiBSID0geyBMb2MsIE1ESywgTm9kZUlEIH07CisgICAgICAvLyBPdGhlcndpc2UsIHJlbWVtYmVyIHRoYXQgdGhpcyBzaG91bGQgYmUgcmVzb2x2ZWQgbGF0ZXIuCisgICAgICBGb3J3YXJkUmVmSW5zdE1ldGFkYXRhW0luc3RdLnB1c2hfYmFjayhSKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHdlJ3JlIGRvbmUuCisgIH0gd2hpbGUgKEVhdElmUHJlc2VudChsbHRvazo6Y29tbWEpKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VPcHRpb25hbEFsaWdubWVudAorLy8vICAgOjo9IC8qIGVtcHR5ICovCisvLy8gICA6Oj0gJ2FsaWduJyA0Citib29sIExMUGFyc2VyOjpQYXJzZU9wdGlvbmFsQWxpZ25tZW50KHVuc2lnbmVkICZBbGlnbm1lbnQpIHsKKyAgQWxpZ25tZW50ID0gMDsKKyAgaWYgKCFFYXRJZlByZXNlbnQobGx0b2s6Omt3X2FsaWduKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIExvY1R5IEFsaWduTG9jID0gTGV4LmdldExvYygpOworICBpZiAoUGFyc2VVSW50MzIoQWxpZ25tZW50KSkgcmV0dXJuIHRydWU7CisgIGlmICghaXNQb3dlck9mMl8zMihBbGlnbm1lbnQpKQorICAgIHJldHVybiBFcnJvcihBbGlnbkxvYywgImFsaWdubWVudCBpcyBub3QgYSBwb3dlciBvZiB0d28iKTsKKyAgaWYgKEFsaWdubWVudCA+IFZhbHVlOjpNYXhpbXVtQWxpZ25tZW50KQorICAgIHJldHVybiBFcnJvcihBbGlnbkxvYywgImh1Z2UgYWxpZ25tZW50cyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VPcHRpb25hbENvbW1hQWxpZ24KKy8vLyAgIDo6PSAKKy8vLyAgIDo6PSAnLCcgYWxpZ24gNAorLy8vCisvLy8gVGhpcyByZXR1cm5zIHdpdGggQXRlRXh0cmFDb21tYSBzZXQgdG8gdHJ1ZSBpZiBpdCBhdGUgYW4gZXhjZXNzIGNvbW1hIGF0IHRoZQorLy8vIGVuZC4KK2Jvb2wgTExQYXJzZXI6OlBhcnNlT3B0aW9uYWxDb21tYUFsaWduKHVuc2lnbmVkICZBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZBdGVFeHRyYUNvbW1hKSB7CisgIEF0ZUV4dHJhQ29tbWEgPSBmYWxzZTsKKyAgd2hpbGUgKEVhdElmUHJlc2VudChsbHRvazo6Y29tbWEpKSB7CisgICAgLy8gTWV0YWRhdGEgYXQgdGhlIGVuZCBpcyBhbiBlYXJseSBleGl0LgorICAgIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpNZXRhZGF0YVZhcikgeworICAgICAgQXRlRXh0cmFDb21tYSA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGlmIChMZXguZ2V0S2luZCgpICE9IGxsdG9rOjprd19hbGlnbikKKyAgICAgIHJldHVybiBFcnJvcihMZXguZ2V0TG9jKCksICJleHBlY3RlZCBtZXRhZGF0YSBvciAnYWxpZ24nIik7CisgICAgCisgICAgTG9jVHkgQWxpZ25Mb2MgPSBMZXguZ2V0TG9jKCk7CisgICAgaWYgKFBhcnNlT3B0aW9uYWxBbGlnbm1lbnQoQWxpZ25tZW50KSkgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZU9wdGlvbmFsU3RhY2tBbGlnbm1lbnQKKy8vLyAgIDo6PSAvKiBlbXB0eSAqLworLy8vICAgOjo9ICdhbGlnbnN0YWNrJyAnKCcgNCAnKScKK2Jvb2wgTExQYXJzZXI6OlBhcnNlT3B0aW9uYWxTdGFja0FsaWdubWVudCh1bnNpZ25lZCAmQWxpZ25tZW50KSB7CisgIEFsaWdubWVudCA9IDA7CisgIGlmICghRWF0SWZQcmVzZW50KGxsdG9rOjprd19hbGlnbnN0YWNrKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIExvY1R5IFBhcmVuTG9jID0gTGV4LmdldExvYygpOworICBpZiAoIUVhdElmUHJlc2VudChsbHRvazo6bHBhcmVuKSkKKyAgICByZXR1cm4gRXJyb3IoUGFyZW5Mb2MsICJleHBlY3RlZCAnKCciKTsKKyAgTG9jVHkgQWxpZ25Mb2MgPSBMZXguZ2V0TG9jKCk7CisgIGlmIChQYXJzZVVJbnQzMihBbGlnbm1lbnQpKSByZXR1cm4gdHJ1ZTsKKyAgUGFyZW5Mb2MgPSBMZXguZ2V0TG9jKCk7CisgIGlmICghRWF0SWZQcmVzZW50KGxsdG9rOjpycGFyZW4pKQorICAgIHJldHVybiBFcnJvcihQYXJlbkxvYywgImV4cGVjdGVkICcpJyIpOworICBpZiAoIWlzUG93ZXJPZjJfMzIoQWxpZ25tZW50KSkKKyAgICByZXR1cm4gRXJyb3IoQWxpZ25Mb2MsICJzdGFjayBhbGlnbm1lbnQgaXMgbm90IGEgcG93ZXIgb2YgdHdvIik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlSW5kZXhMaXN0IC0gVGhpcyBwYXJzZXMgdGhlIGluZGV4IGxpc3QgZm9yIGFuIGluc2VydC9leHRyYWN0dmFsdWUKKy8vLyBpbnN0cnVjdGlvbi4gIFRoaXMgc2V0cyBBdGVFeHRyYUNvbW1hIGluIHRoZSBjYXNlIHdoZXJlIHdlIGVhdCBhbiBleHRyYQorLy8vIGNvbW1hIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgYW5kIGZpbmQgdGhhdCBpdCBpcyBmb2xsb3dlZCBieSBtZXRhZGF0YS4KKy8vLyBDbGllbnRzIHRoYXQgZG9uJ3QgYWxsb3cgbWV0YWRhdGEgY2FuIGNhbGwgdGhlIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiB0aGF0CisvLy8gb25seSB0YWtlcyBvbmUgYXJndW1lbnQuCisvLy8KKy8vLyBQYXJzZUluZGV4TGlzdAorLy8vICAgIDo6PSAgKCcsJyB1aW50MzIpKworLy8vCitib29sIExMUGFyc2VyOjpQYXJzZUluZGV4TGlzdChTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQXRlRXh0cmFDb21tYSkgeworICBBdGVFeHRyYUNvbW1hID0gZmFsc2U7CisgIAorICBpZiAoTGV4LmdldEtpbmQoKSAhPSBsbHRvazo6Y29tbWEpCisgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCAnLCcgYXMgc3RhcnQgb2YgaW5kZXggbGlzdCIpOworCisgIHdoaWxlIChFYXRJZlByZXNlbnQobGx0b2s6OmNvbW1hKSkgeworICAgIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpNZXRhZGF0YVZhcikgeworICAgICAgQXRlRXh0cmFDb21tYSA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVuc2lnbmVkIElkeDsKKyAgICBpZiAoUGFyc2VVSW50MzIoSWR4KSkgcmV0dXJuIHRydWU7CisgICAgSW5kaWNlcy5wdXNoX2JhY2soSWR4KTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFR5cGUgUGFyc2luZy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBQYXJzZVR5cGUgLSBQYXJzZSBhbmQgcmVzb2x2ZSBhIGZ1bGwgdHlwZS4KK2Jvb2wgTExQYXJzZXI6OlBhcnNlVHlwZShQQVR5cGVIb2xkZXIgJlJlc3VsdCwgYm9vbCBBbGxvd1ZvaWQpIHsKKyAgTG9jVHkgVHlwZUxvYyA9IExleC5nZXRMb2MoKTsKKyAgaWYgKFBhcnNlVHlwZVJlYyhSZXN1bHQpKSByZXR1cm4gdHJ1ZTsKKworICAvLyBWZXJpZnkgbm8gdW5yZXNvbHZlZCB1cHJlZnMuCisgIGlmICghVXBSZWZzLmVtcHR5KCkpCisgICAgcmV0dXJuIEVycm9yKFVwUmVmcy5iYWNrKCkuTG9jLCAiaW52YWxpZCB1bnJlc29sdmVkIHR5cGUgdXAgcmVmZXJlbmNlIik7CisKKyAgaWYgKCFBbGxvd1ZvaWQgJiYgUmVzdWx0LmdldCgpLT5pc1ZvaWRUeSgpKQorICAgIHJldHVybiBFcnJvcihUeXBlTG9jLCAidm9pZCB0eXBlIG9ubHkgYWxsb3dlZCBmb3IgZnVuY3Rpb24gcmVzdWx0cyIpOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEhhbmRsZVVwUmVmcyAtIEV2ZXJ5IHRpbWUgd2UgZmluaXNoIGEgbmV3IGxheWVyIG9mIHR5cGVzLCB0aGlzIGZ1bmN0aW9uIGlzCisvLy8gY2FsbGVkLiAgSXQgbG9vcHMgdGhyb3VnaCB0aGUgVXBSZWZzIHZlY3Rvciwgd2hpY2ggaXMgYSBsaXN0IG9mIHRoZQorLy8vIGN1cnJlbnRseSBhY3RpdmUgdHlwZXMuICBGb3IgZWFjaCB0eXBlLCBpZiB0aGUgdXAtcmVmZXJlbmNlIGlzIGNvbnRhaW5lZCBpbgorLy8vIHRoZSBuZXdseSBjb21wbGV0ZWQgdHlwZSwgd2UgZGVjcmVtZW50IHRoZSBsZXZlbCBjb3VudC4gIFdoZW4gdGhlIGxldmVsCisvLy8gY291bnQgcmVhY2hlcyB6ZXJvLCB0aGUgdXAtcmVmZXJlbmNlZCB0eXBlIGlzIHRoZSB0eXBlIHRoYXQgaXMgcGFzc2VkIGluOgorLy8vIHRodXMgd2UgY2FuIGNvbXBsZXRlIHRoZSBjeWNsZS4KKy8vLworUEFUeXBlSG9sZGVyIExMUGFyc2VyOjpIYW5kbGVVcFJlZnMoY29uc3QgVHlwZSAqdHkpIHsKKyAgLy8gSWYgVHkgaXNuJ3QgYWJzdHJhY3QsIG9yIGlmIHRoZXJlIGFyZSBubyB1cC1yZWZlcmVuY2VzIGluIGl0LCB0aGVuIHRoZXJlIGlzCisgIC8vIG5vdGhpbmcgdG8gcmVzb2x2ZSBoZXJlLgorICBpZiAoIXR5LT5pc0Fic3RyYWN0KCkgfHwgVXBSZWZzLmVtcHR5KCkpIHJldHVybiB0eTsKKworICBQQVR5cGVIb2xkZXIgVHkodHkpOworI2lmIDAKKyAgZGJncygpIDw8ICJUeXBlICciIDw8IFR5LT5nZXREZXNjcmlwdGlvbigpCisgICAgICAgICA8PCAiJyBuZXdseSBmb3JtZWQuICBSZXNvbHZpbmcgdXByZWZlcmVuY2VzLlxuIgorICAgICAgICAgPDwgVXBSZWZzLnNpemUoKSA8PCAiIHVwcmVmZXJlbmNlcyBhY3RpdmUhXG4iOworI2VuZGlmCisKKyAgLy8gSWYgd2UgZmluZCBhbnkgcmVzb2x2YWJsZSB1cHJlZmVyZW5jZXMgKGkuZS4sIHRob3NlIHdob3NlIE5lc3RpbmdMZXZlbCBnb2VzCisgIC8vIHRvIHplcm8pLCB3ZSByZXNvbHZlIHRoZW0gYWxsIHRvZ2V0aGVyIGJlZm9yZSB3ZSByZXNvbHZlIHRoZW0gdG8gVHkuICBBdAorICAvLyB0aGUgZW5kIG9mIHRoZSBsb29wLCBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byByZXNvbHZlIHRvIFR5LCBpdCB3aWxsIGJlIGluCisgIC8vIHRoaXMgdmFyaWFibGUuCisgIE9wYXF1ZVR5cGUgKlR5cGVUb1Jlc29sdmUgPSAwOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gVXBSZWZzLnNpemUoKTsgKytpKSB7CisgICAgLy8gRGV0ZXJtaW5lIGlmICdUeScgZGlyZWN0bHkgY29udGFpbnMgdGhpcyB1cC1yZWZlcmVuY2VzICdMYXN0Q29udGFpbmVkVHknLgorICAgIGJvb2wgQ29udGFpbnNUeXBlID0KKyAgICAgIHN0ZDo6ZmluZChUeS0+c3VidHlwZV9iZWdpbigpLCBUeS0+c3VidHlwZV9lbmQoKSwKKyAgICAgICAgICAgICAgICBVcFJlZnNbaV0uTGFzdENvbnRhaW5lZFR5KSAhPSBUeS0+c3VidHlwZV9lbmQoKTsKKworI2lmIDAKKyAgICBkYmdzKCkgPDwgIiAgVVIjIiA8PCBpIDw8ICIgLSBUeXBlQ29udGFpbnMoIiA8PCBUeS0+Z2V0RGVzY3JpcHRpb24oKSA8PCAiLCAiCisgICAgICAgICAgIDw8IFVwUmVmc1tpXS5MYXN0Q29udGFpbmVkVHktPmdldERlc2NyaXB0aW9uKCkgPDwgIikgPSAiCisgICAgICAgICAgIDw8IChDb250YWluc1R5cGUgPyAidHJ1ZSIgOiAiZmFsc2UiKQorICAgICAgICAgICA8PCAiIGxldmVsPSIgPDwgVXBSZWZzW2ldLk5lc3RpbmdMZXZlbCA8PCAiXG4iOworI2VuZGlmCisgICAgaWYgKCFDb250YWluc1R5cGUpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIERlY3JlbWVudCBsZXZlbCBvZiB1cHJlZmVyZW5jZQorICAgIHVuc2lnbmVkIExldmVsID0gLS1VcFJlZnNbaV0uTmVzdGluZ0xldmVsOworICAgIFVwUmVmc1tpXS5MYXN0Q29udGFpbmVkVHkgPSBUeTsKKworICAgIC8vIElmIHRoZSBVcC1yZWZlcmVuY2UgaGFzIGEgbm9uLXplcm8gbGV2ZWwsIGl0IHNob3VsZG4ndCBiZSByZXNvbHZlZCB5ZXQuCisgICAgaWYgKExldmVsICE9IDApCisgICAgICBjb250aW51ZTsKKworI2lmIDAKKyAgICBkYmdzKCkgPDwgIiAgKiBSZXNvbHZpbmcgdXByZWZlcmVuY2UgZm9yICIgPDwgVXBSZWZzW2ldLlVwUmVmVHkgPDwgIlxuIjsKKyNlbmRpZgorICAgIGlmICghVHlwZVRvUmVzb2x2ZSkKKyAgICAgIFR5cGVUb1Jlc29sdmUgPSBVcFJlZnNbaV0uVXBSZWZUeTsKKyAgICBlbHNlCisgICAgICBVcFJlZnNbaV0uVXBSZWZUeS0+cmVmaW5lQWJzdHJhY3RUeXBlVG8oVHlwZVRvUmVzb2x2ZSk7CisgICAgVXBSZWZzLmVyYXNlKFVwUmVmcy5iZWdpbigpK2kpOyAgICAgLy8gUmVtb3ZlIGZyb20gdXByZWZlcmVuY2UgbGlzdC4KKyAgICAtLWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3Qgc2tpcCB0aGUgbmV4dCBlbGVtZW50LgorICB9CisKKyAgaWYgKFR5cGVUb1Jlc29sdmUpCisgICAgVHlwZVRvUmVzb2x2ZS0+cmVmaW5lQWJzdHJhY3RUeXBlVG8oVHkpOworCisgIHJldHVybiBUeTsKK30KKworCisvLy8gUGFyc2VUeXBlUmVjIC0gVGhlIHJlY3Vyc2l2ZSBmdW5jdGlvbiB1c2VkIHRvIHByb2Nlc3MgdGhlIGludGVybmFsCisvLy8gaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiB0eXBlcy4KK2Jvb2wgTExQYXJzZXI6OlBhcnNlVHlwZVJlYyhQQVR5cGVIb2xkZXIgJlJlc3VsdCkgeworICBzd2l0Y2ggKExleC5nZXRLaW5kKCkpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIHR5cGUiKTsKKyAgY2FzZSBsbHRvazo6VHlwZToKKyAgICAvLyBUeXBlUmVjIDo6PSAnZmxvYXQnIHwgJ3ZvaWQnIChldGMpCisgICAgUmVzdWx0ID0gTGV4LmdldFR5VmFsKCk7CisgICAgTGV4LkxleCgpOworICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjprd19vcGFxdWU6CisgICAgLy8gVHlwZVJlYyA6Oj0gJ29wYXF1ZScKKyAgICBSZXN1bHQgPSBPcGFxdWVUeXBlOjpnZXQoQ29udGV4dCk7CisgICAgTGV4LkxleCgpOworICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjpsYnJhY2U6CisgICAgLy8gVHlwZVJlYyA6Oj0gJ3snIC4uLiAnfScKKyAgICBpZiAoUGFyc2VTdHJ1Y3RUeXBlKFJlc3VsdCwgZmFsc2UpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X3VuaW9uOgorICAgIC8vIFR5cGVSZWMgOjo9ICd1bmlvbicgJ3snIC4uLiAnfScKKyAgICBpZiAoUGFyc2VVbmlvblR5cGUoUmVzdWx0KSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjpsc3F1YXJlOgorICAgIC8vIFR5cGVSZWMgOjo9ICdbJyAuLi4gJ10nCisgICAgTGV4LkxleCgpOyAvLyBlYXQgdGhlIGxzcXVhcmUuCisgICAgaWYgKFBhcnNlQXJyYXlWZWN0b3JUeXBlKFJlc3VsdCwgZmFsc2UpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omxlc3M6IC8vIEVpdGhlciB2ZWN0b3Igb3IgcGFja2VkIHN0cnVjdC4KKyAgICAvLyBUeXBlUmVjIDo6PSAnPCcgLi4uICc+JworICAgIExleC5MZXgoKTsKKyAgICBpZiAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6bGJyYWNlKSB7CisgICAgICBpZiAoUGFyc2VTdHJ1Y3RUeXBlKFJlc3VsdCwgdHJ1ZSkgfHwKKyAgICAgICAgICBQYXJzZVRva2VuKGxsdG9rOjpncmVhdGVyLCAiZXhwZWN0ZWQgJz4nIGF0IGVuZCBvZiBwYWNrZWQgc3RydWN0IikpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoUGFyc2VBcnJheVZlY3RvclR5cGUoUmVzdWx0LCB0cnVlKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjpMb2NhbFZhcjoKKyAgY2FzZSBsbHRvazo6U3RyaW5nQ29uc3RhbnQ6ICAvLyBGSVhNRTogUkVNT1ZFIElOIExMVk0gMy4wCisgICAgLy8gVHlwZVJlYyA6Oj0gJWZvbworICAgIGlmIChjb25zdCBUeXBlICpUID0gTS0+Z2V0VHlwZUJ5TmFtZShMZXguZ2V0U3RyVmFsKCkpKSB7CisgICAgICBSZXN1bHQgPSBUOworICAgIH0gZWxzZSB7CisgICAgICBSZXN1bHQgPSBPcGFxdWVUeXBlOjpnZXQoQ29udGV4dCk7CisgICAgICBGb3J3YXJkUmVmVHlwZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKExleC5nZXRTdHJWYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXguZ2V0TG9jKCkpKSk7CisgICAgICBNLT5hZGRUeXBlTmFtZShMZXguZ2V0U3RyVmFsKCksIFJlc3VsdC5nZXQoKSk7CisgICAgfQorICAgIExleC5MZXgoKTsKKyAgICBicmVhazsKKworICBjYXNlIGxsdG9rOjpMb2NhbFZhcklEOgorICAgIC8vIFR5cGVSZWMgOjo9ICU0CisgICAgaWYgKExleC5nZXRVSW50VmFsKCkgPCBOdW1iZXJlZFR5cGVzLnNpemUoKSkKKyAgICAgIFJlc3VsdCA9IE51bWJlcmVkVHlwZXNbTGV4LmdldFVJbnRWYWwoKV07CisgICAgZWxzZSB7CisgICAgICBzdGQ6Om1hcDx1bnNpZ25lZCwgc3RkOjpwYWlyPFBBVHlwZUhvbGRlciwgTG9jVHk+ID46Oml0ZXJhdG9yCisgICAgICAgIEkgPSBGb3J3YXJkUmVmVHlwZUlEcy5maW5kKExleC5nZXRVSW50VmFsKCkpOworICAgICAgaWYgKEkgIT0gRm9yd2FyZFJlZlR5cGVJRHMuZW5kKCkpCisgICAgICAgIFJlc3VsdCA9IEktPnNlY29uZC5maXJzdDsKKyAgICAgIGVsc2UgeworICAgICAgICBSZXN1bHQgPSBPcGFxdWVUeXBlOjpnZXQoQ29udGV4dCk7CisgICAgICAgIEZvcndhcmRSZWZUeXBlSURzLmluc2VydChzdGQ6Om1ha2VfcGFpcihMZXguZ2V0VUludFZhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV4LmdldExvYygpKSkpOworICAgICAgfQorICAgIH0KKyAgICBMZXguTGV4KCk7CisgICAgYnJlYWs7CisgIGNhc2UgbGx0b2s6OmJhY2tzbGFzaDogeworICAgIC8vIFR5cGVSZWMgOjo9ICdcJyA0CisgICAgTGV4LkxleCgpOworICAgIHVuc2lnbmVkIFZhbDsKKyAgICBpZiAoUGFyc2VVSW50MzIoVmFsKSkgcmV0dXJuIHRydWU7CisgICAgT3BhcXVlVHlwZSAqT1QgPSBPcGFxdWVUeXBlOjpnZXQoQ29udGV4dCk7IC8vVXNlIHRlbXBvcmFyeSBwbGFjZWhvbGRlci4KKyAgICBVcFJlZnMucHVzaF9iYWNrKFVwUmVmUmVjb3JkKExleC5nZXRMb2MoKSwgVmFsLCBPVCkpOworICAgIFJlc3VsdCA9IE9UOworICAgIGJyZWFrOworICB9CisgIH0KKworICAvLyBQYXJzZSB0aGUgdHlwZSBzdWZmaXhlcy4KKyAgd2hpbGUgKDEpIHsKKyAgICBzd2l0Y2ggKExleC5nZXRLaW5kKCkpIHsKKyAgICAvLyBFbmQgb2YgdHlwZS4KKyAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUeXBlUmVjIDo6PSBUeXBlUmVjICcqJworICAgIGNhc2UgbGx0b2s6OnN0YXI6CisgICAgICBpZiAoUmVzdWx0LmdldCgpLT5pc0xhYmVsVHkoKSkKKyAgICAgICAgcmV0dXJuIFRva0Vycm9yKCJiYXNpYyBibG9jayBwb2ludGVycyBhcmUgaW52YWxpZCIpOworICAgICAgaWYgKFJlc3VsdC5nZXQoKS0+aXNWb2lkVHkoKSkKKyAgICAgICAgcmV0dXJuIFRva0Vycm9yKCJwb2ludGVycyB0byB2b2lkIGFyZSBpbnZhbGlkOyB1c2UgaTgqIGluc3RlYWQiKTsKKyAgICAgIGlmICghUG9pbnRlclR5cGU6OmlzVmFsaWRFbGVtZW50VHlwZShSZXN1bHQuZ2V0KCkpKQorICAgICAgICByZXR1cm4gVG9rRXJyb3IoInBvaW50ZXIgdG8gdGhpcyB0eXBlIGlzIGludmFsaWQiKTsKKyAgICAgIFJlc3VsdCA9IEhhbmRsZVVwUmVmcyhQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFJlc3VsdC5nZXQoKSkpOworICAgICAgTGV4LkxleCgpOworICAgICAgYnJlYWs7CisKKyAgICAvLyBUeXBlUmVjIDo6PSBUeXBlUmVjICdhZGRyc3BhY2UnICcoJyB1aW50MzIgJyknICcqJworICAgIGNhc2UgbGx0b2s6Omt3X2FkZHJzcGFjZTogeworICAgICAgaWYgKFJlc3VsdC5nZXQoKS0+aXNMYWJlbFR5KCkpCisgICAgICAgIHJldHVybiBUb2tFcnJvcigiYmFzaWMgYmxvY2sgcG9pbnRlcnMgYXJlIGludmFsaWQiKTsKKyAgICAgIGlmIChSZXN1bHQuZ2V0KCktPmlzVm9pZFR5KCkpCisgICAgICAgIHJldHVybiBUb2tFcnJvcigicG9pbnRlcnMgdG8gdm9pZCBhcmUgaW52YWxpZDsgdXNlIGk4KiBpbnN0ZWFkIik7CisgICAgICBpZiAoIVBvaW50ZXJUeXBlOjppc1ZhbGlkRWxlbWVudFR5cGUoUmVzdWx0LmdldCgpKSkKKyAgICAgICAgcmV0dXJuIFRva0Vycm9yKCJwb2ludGVyIHRvIHRoaXMgdHlwZSBpcyBpbnZhbGlkIik7CisgICAgICB1bnNpZ25lZCBBZGRyU3BhY2U7CisgICAgICBpZiAoUGFyc2VPcHRpb25hbEFkZHJTcGFjZShBZGRyU3BhY2UpIHx8CisgICAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6c3RhciwgImV4cGVjdGVkICcqJyBpbiBhZGRyZXNzIHNwYWNlIikpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBSZXN1bHQgPSBIYW5kbGVVcFJlZnMoUG9pbnRlclR5cGU6OmdldChSZXN1bHQuZ2V0KCksIEFkZHJTcGFjZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8vIFR5cGVzICcoJyBBcmdUeXBlTGlzdEkgJyknIE9wdEZ1bmNBdHRycworICAgIGNhc2UgbGx0b2s6OmxwYXJlbjoKKyAgICAgIGlmIChQYXJzZUZ1bmN0aW9uVHlwZShSZXN1bHQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvLy8gUGFyc2VQYXJhbWV0ZXJMaXN0CisvLy8gICAgOjo9ICcoJyAnKScKKy8vLyAgICA6Oj0gJygnIEFyZyAoJywnIEFyZykqICcpJworLy8vICBBcmcKKy8vLyAgICA6Oj0gVHlwZSBPcHRpb25hbEF0dHJpYnV0ZXMgVmFsdWUgT3B0aW9uYWxBdHRyaWJ1dGVzCitib29sIExMUGFyc2VyOjpQYXJzZVBhcmFtZXRlckxpc3QoU21hbGxWZWN0b3JJbXBsPFBhcmFtSW5mbz4gJkFyZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIGlmIChQYXJzZVRva2VuKGxsdG9rOjpscGFyZW4sICJleHBlY3RlZCAnKCcgaW4gY2FsbCIpKQorICAgIHJldHVybiB0cnVlOworCisgIHdoaWxlIChMZXguZ2V0S2luZCgpICE9IGxsdG9rOjpycGFyZW4pIHsKKyAgICAvLyBJZiB0aGlzIGlzbid0IHRoZSBmaXJzdCBhcmd1bWVudCwgd2UgbmVlZCBhIGNvbW1hLgorICAgIGlmICghQXJnTGlzdC5lbXB0eSgpICYmCisgICAgICAgIFBhcnNlVG9rZW4obGx0b2s6OmNvbW1hLCAiZXhwZWN0ZWQgJywnIGluIGFyZ3VtZW50IGxpc3QiKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gUGFyc2UgdGhlIGFyZ3VtZW50LgorICAgIExvY1R5IEFyZ0xvYzsKKyAgICBQQVR5cGVIb2xkZXIgQXJnVHkoVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpKTsKKyAgICB1bnNpZ25lZCBBcmdBdHRyczEgPSBBdHRyaWJ1dGU6Ok5vbmU7CisgICAgdW5zaWduZWQgQXJnQXR0cnMyID0gQXR0cmlidXRlOjpOb25lOworICAgIFZhbHVlICpWOworICAgIGlmIChQYXJzZVR5cGUoQXJnVHksIEFyZ0xvYykpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE90aGVyd2lzZSwgaGFuZGxlIG5vcm1hbCBvcGVyYW5kcy4KKyAgICBpZiAoUGFyc2VPcHRpb25hbEF0dHJzKEFyZ0F0dHJzMSwgMCkgfHwKKyAgICAgICAgUGFyc2VWYWx1ZShBcmdUeSwgViwgUEZTKSB8fAorICAgICAgICAvLyBGSVhNRTogU2hvdWxkIG5vdCBhbGxvdyBhdHRyaWJ1dGVzIGFmdGVyIHRoZSBhcmd1bWVudCwgcmVtb3ZlIHRoaXMKKyAgICAgICAgLy8gaW4gTExWTSAzLjAuCisgICAgICAgIFBhcnNlT3B0aW9uYWxBdHRycyhBcmdBdHRyczIsIDMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgQXJnTGlzdC5wdXNoX2JhY2soUGFyYW1JbmZvKEFyZ0xvYywgViwgQXJnQXR0cnMxfEFyZ0F0dHJzMikpOworICB9CisKKyAgTGV4LkxleCgpOyAgLy8gTGV4IHRoZSAnKScuCisgIHJldHVybiBmYWxzZTsKK30KKworCisKKy8vLyBQYXJzZUFyZ3VtZW50TGlzdCAtIFBhcnNlIHRoZSBhcmd1bWVudCBsaXN0IGZvciBhIGZ1bmN0aW9uIHR5cGUgb3IgZnVuY3Rpb24KKy8vLyBwcm90b3R5cGUuICBJZiAnaW5UeXBlJyBpcyB0cnVlIHRoZW4gd2UgYXJlIHBhcnNpbmcgYSBGdW5jdGlvblR5cGUuCisvLy8gICA6Oj0gJygnIEFyZ1R5cGVMaXN0SSAnKScKKy8vLyBBcmdUeXBlTGlzdEkKKy8vLyAgIDo6PSAvKmVtcHR5Ki8KKy8vLyAgIDo6PSAnLi4uJworLy8vICAgOjo9IEFyZ1R5cGVMaXN0ICcsJyAnLi4uJworLy8vICAgOjo9IEFyZ1R5cGUgKCcsJyBBcmdUeXBlKSoKKy8vLworYm9vbCBMTFBhcnNlcjo6UGFyc2VBcmd1bWVudExpc3Qoc3RkOjp2ZWN0b3I8QXJnSW5mbz4gJkFyZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1ZhckFyZywgYm9vbCBpblR5cGUpIHsKKyAgaXNWYXJBcmcgPSBmYWxzZTsKKyAgYXNzZXJ0KExleC5nZXRLaW5kKCkgPT0gbGx0b2s6OmxwYXJlbik7CisgIExleC5MZXgoKTsgLy8gZWF0IHRoZSAoLgorCisgIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpycGFyZW4pIHsKKyAgICAvLyBlbXB0eQorICB9IGVsc2UgaWYgKExleC5nZXRLaW5kKCkgPT0gbGx0b2s6OmRvdGRvdGRvdCkgeworICAgIGlzVmFyQXJnID0gdHJ1ZTsKKyAgICBMZXguTGV4KCk7CisgIH0gZWxzZSB7CisgICAgTG9jVHkgVHlwZUxvYyA9IExleC5nZXRMb2MoKTsKKyAgICBQQVR5cGVIb2xkZXIgQXJnVHkoVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpKTsKKyAgICB1bnNpZ25lZCBBdHRyczsKKyAgICBzdGQ6OnN0cmluZyBOYW1lOworCisgICAgLy8gSWYgd2UncmUgcGFyc2luZyBhIHR5cGUsIHVzZSBQYXJzZVR5cGVSZWMsIGJlY2F1c2Ugd2UgYWxsb3cgcmVjdXJzaXZlCisgICAgLy8gdHlwZXMgKHN1Y2ggYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGl0c2VsZikuICBJZiBwYXJzaW5nIGEKKyAgICAvLyBmdW5jdGlvbiBwcm90b3R5cGUsIHdlIHJlcXVpcmUgZnVsbHkgcmVzb2x2ZWQgdHlwZXMuCisgICAgaWYgKChpblR5cGUgPyBQYXJzZVR5cGVSZWMoQXJnVHkpIDogUGFyc2VUeXBlKEFyZ1R5KSkgfHwKKyAgICAgICAgUGFyc2VPcHRpb25hbEF0dHJzKEF0dHJzLCAwKSkgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoQXJnVHktPmlzVm9pZFR5KCkpCisgICAgICByZXR1cm4gRXJyb3IoVHlwZUxvYywgImFyZ3VtZW50IGNhbiBub3QgaGF2ZSB2b2lkIHR5cGUiKTsKKworICAgIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpMb2NhbFZhciB8fAorICAgICAgICBMZXguZ2V0S2luZCgpID09IGxsdG9rOjpTdHJpbmdDb25zdGFudCkgeyAvLyBGSVhNRTogUkVNT1ZFIElOIExMVk0gMy4wCisgICAgICBOYW1lID0gTGV4LmdldFN0clZhbCgpOworICAgICAgTGV4LkxleCgpOworICAgIH0KKworICAgIGlmICghRnVuY3Rpb25UeXBlOjppc1ZhbGlkQXJndW1lbnRUeXBlKEFyZ1R5KSkKKyAgICAgIHJldHVybiBFcnJvcihUeXBlTG9jLCAiaW52YWxpZCB0eXBlIGZvciBmdW5jdGlvbiBhcmd1bWVudCIpOworCisgICAgQXJnTGlzdC5wdXNoX2JhY2soQXJnSW5mbyhUeXBlTG9jLCBBcmdUeSwgQXR0cnMsIE5hbWUpKTsKKworICAgIHdoaWxlIChFYXRJZlByZXNlbnQobGx0b2s6OmNvbW1hKSkgeworICAgICAgLy8gSGFuZGxlIC4uLiBhdCBlbmQgb2YgYXJnIGxpc3QuCisgICAgICBpZiAoRWF0SWZQcmVzZW50KGxsdG9rOjpkb3Rkb3Rkb3QpKSB7CisgICAgICAgIGlzVmFyQXJnID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIE90aGVyd2lzZSBtdXN0IGJlIGFuIGFyZ3VtZW50IHR5cGUuCisgICAgICBUeXBlTG9jID0gTGV4LmdldExvYygpOworICAgICAgaWYgKChpblR5cGUgPyBQYXJzZVR5cGVSZWMoQXJnVHkpIDogUGFyc2VUeXBlKEFyZ1R5KSkgfHwKKyAgICAgICAgICBQYXJzZU9wdGlvbmFsQXR0cnMoQXR0cnMsIDApKSByZXR1cm4gdHJ1ZTsKKworICAgICAgaWYgKEFyZ1R5LT5pc1ZvaWRUeSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoVHlwZUxvYywgImFyZ3VtZW50IGNhbiBub3QgaGF2ZSB2b2lkIHR5cGUiKTsKKworICAgICAgaWYgKExleC5nZXRLaW5kKCkgPT0gbGx0b2s6OkxvY2FsVmFyIHx8CisgICAgICAgICAgTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6U3RyaW5nQ29uc3RhbnQpIHsgLy8gRklYTUU6IFJFTU9WRSBJTiBMTFZNIDMuMAorICAgICAgICBOYW1lID0gTGV4LmdldFN0clZhbCgpOworICAgICAgICBMZXguTGV4KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBOYW1lID0gIiI7CisgICAgICB9CisKKyAgICAgIGlmICghQXJnVHktPmlzRmlyc3RDbGFzc1R5cGUoKSAmJiAhQXJnVHktPmlzT3BhcXVlVHkoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKFR5cGVMb2MsICJpbnZhbGlkIHR5cGUgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50Iik7CisKKyAgICAgIEFyZ0xpc3QucHVzaF9iYWNrKEFyZ0luZm8oVHlwZUxvYywgQXJnVHksIEF0dHJzLCBOYW1lKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFBhcnNlVG9rZW4obGx0b2s6OnJwYXJlbiwgImV4cGVjdGVkICcpJyBhdCBlbmQgb2YgYXJndW1lbnQgbGlzdCIpOworfQorCisvLy8gUGFyc2VGdW5jdGlvblR5cGUKKy8vLyAgOjo9IFR5cGUgQXJndW1lbnRMaXN0IE9wdGlvbmFsQXR0cnMKK2Jvb2wgTExQYXJzZXI6OlBhcnNlRnVuY3Rpb25UeXBlKFBBVHlwZUhvbGRlciAmUmVzdWx0KSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpscGFyZW4pOworCisgIGlmICghRnVuY3Rpb25UeXBlOjppc1ZhbGlkUmV0dXJuVHlwZShSZXN1bHQpKQorICAgIHJldHVybiBUb2tFcnJvcigiaW52YWxpZCBmdW5jdGlvbiByZXR1cm4gdHlwZSIpOworCisgIHN0ZDo6dmVjdG9yPEFyZ0luZm8+IEFyZ0xpc3Q7CisgIGJvb2wgaXNWYXJBcmc7CisgIHVuc2lnbmVkIEF0dHJzOworICBpZiAoUGFyc2VBcmd1bWVudExpc3QoQXJnTGlzdCwgaXNWYXJBcmcsIHRydWUpIHx8CisgICAgICAvLyBGSVhNRTogQWxsb3csIGJ1dCBpZ25vcmUgYXR0cmlidXRlcyBvbiBmdW5jdGlvbiB0eXBlcyEKKyAgICAgIC8vIEZJWE1FOiBSZW1vdmUgaW4gTExWTSAzLjAKKyAgICAgIFBhcnNlT3B0aW9uYWxBdHRycyhBdHRycywgMikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gUmVqZWN0IG5hbWVzIG9uIHRoZSBhcmd1bWVudHMgbGlzdHMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoIUFyZ0xpc3RbaV0uTmFtZS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEVycm9yKEFyZ0xpc3RbaV0uTG9jLCAiYXJndW1lbnQgbmFtZSBpbnZhbGlkIGluIGZ1bmN0aW9uIHR5cGUiKTsKKyAgICBpZiAoIUFyZ0xpc3RbaV0uQXR0cnMgIT0gMCkgeworICAgICAgLy8gQWxsb3cgYnV0IGlnbm9yZSBhdHRyaWJ1dGVzIG9uIGZ1bmN0aW9uIHR5cGVzOyB0aGlzIHBlcm1pdHMKKyAgICAgIC8vIGF1dG8tdXBncmFkZS4KKyAgICAgIC8vIEZJWE1FOiBSRUpFQ1QgQVRUUklCVVRFUyBPTiBGVU5DVElPTiBUWVBFUyBpbiBMTFZNIDMuMAorICAgIH0KKyAgfQorCisgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBBcmdMaXN0VHk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgQXJnTGlzdFR5LnB1c2hfYmFjayhBcmdMaXN0W2ldLlR5cGUpOworCisgIFJlc3VsdCA9IEhhbmRsZVVwUmVmcyhGdW5jdGlvblR5cGU6OmdldChSZXN1bHQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdMaXN0VHksIGlzVmFyQXJnKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlU3RydWN0VHlwZTogSGFuZGxlcyBwYWNrZWQgYW5kIHVucGFja2VkIHR5cGVzLiAgPC8+IHBhcnNlZCBlbHNld2hlcmUuCisvLy8gICBUeXBlUmVjCisvLy8gICAgIDo6PSAneycgJ30nCisvLy8gICAgIDo6PSAneycgVHlwZVJlYyAoJywnIFR5cGVSZWMpKiAnfScKKy8vLyAgICAgOjo9ICc8JyAneycgJ30nICc+JworLy8vICAgICA6Oj0gJzwnICd7JyBUeXBlUmVjICgnLCcgVHlwZVJlYykqICd9JyAnPicKK2Jvb2wgTExQYXJzZXI6OlBhcnNlU3RydWN0VHlwZShQQVR5cGVIb2xkZXIgJlJlc3VsdCwgYm9vbCBQYWNrZWQpIHsKKyAgYXNzZXJ0KExleC5nZXRLaW5kKCkgPT0gbGx0b2s6OmxicmFjZSk7CisgIExleC5MZXgoKTsgLy8gQ29uc3VtZSB0aGUgJ3snCisKKyAgaWYgKEVhdElmUHJlc2VudChsbHRvazo6cmJyYWNlKSkgeworICAgIFJlc3VsdCA9IFN0cnVjdFR5cGU6OmdldChDb250ZXh0LCBQYWNrZWQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPFBBVHlwZUhvbGRlcj4gUGFyYW1zTGlzdDsKKyAgTG9jVHkgRWx0VHlMb2MgPSBMZXguZ2V0TG9jKCk7CisgIGlmIChQYXJzZVR5cGVSZWMoUmVzdWx0KSkgcmV0dXJuIHRydWU7CisgIFBhcmFtc0xpc3QucHVzaF9iYWNrKFJlc3VsdCk7CisKKyAgaWYgKFJlc3VsdC0+aXNWb2lkVHkoKSkKKyAgICByZXR1cm4gRXJyb3IoRWx0VHlMb2MsICJzdHJ1Y3QgZWxlbWVudCBjYW4gbm90IGhhdmUgdm9pZCB0eXBlIik7CisgIGlmICghU3RydWN0VHlwZTo6aXNWYWxpZEVsZW1lbnRUeXBlKFJlc3VsdCkpCisgICAgcmV0dXJuIEVycm9yKEVsdFR5TG9jLCAiaW52YWxpZCBlbGVtZW50IHR5cGUgZm9yIHN0cnVjdCIpOworCisgIHdoaWxlIChFYXRJZlByZXNlbnQobGx0b2s6OmNvbW1hKSkgeworICAgIEVsdFR5TG9jID0gTGV4LmdldExvYygpOworICAgIGlmIChQYXJzZVR5cGVSZWMoUmVzdWx0KSkgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoUmVzdWx0LT5pc1ZvaWRUeSgpKQorICAgICAgcmV0dXJuIEVycm9yKEVsdFR5TG9jLCAic3RydWN0IGVsZW1lbnQgY2FuIG5vdCBoYXZlIHZvaWQgdHlwZSIpOworICAgIGlmICghU3RydWN0VHlwZTo6aXNWYWxpZEVsZW1lbnRUeXBlKFJlc3VsdCkpCisgICAgICByZXR1cm4gRXJyb3IoRWx0VHlMb2MsICJpbnZhbGlkIGVsZW1lbnQgdHlwZSBmb3Igc3RydWN0Iik7CisKKyAgICBQYXJhbXNMaXN0LnB1c2hfYmFjayhSZXN1bHQpOworICB9CisKKyAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OnJicmFjZSwgImV4cGVjdGVkICd9JyBhdCBlbmQgb2Ygc3RydWN0IikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IFBhcmFtc0xpc3RUeTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBhcmFtc0xpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBQYXJhbXNMaXN0VHkucHVzaF9iYWNrKFBhcmFtc0xpc3RbaV0uZ2V0KCkpOworICBSZXN1bHQgPSBIYW5kbGVVcFJlZnMoU3RydWN0VHlwZTo6Z2V0KENvbnRleHQsIFBhcmFtc0xpc3RUeSwgUGFja2VkKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlVW5pb25UeXBlCisvLy8gICBUeXBlUmVjCisvLy8gICAgIDo6PSAndW5pb24nICd7JyBUeXBlUmVjICgnLCcgVHlwZVJlYykqICd9JworYm9vbCBMTFBhcnNlcjo6UGFyc2VVbmlvblR5cGUoUEFUeXBlSG9sZGVyICZSZXN1bHQpIHsKKyAgYXNzZXJ0KExleC5nZXRLaW5kKCkgPT0gbGx0b2s6Omt3X3VuaW9uKTsKKyAgTGV4LkxleCgpOyAvLyBDb25zdW1lIHRoZSAndW5pb24nCisKKyAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OmxicmFjZSwgIid7JyBleHBlY3RlZCBhZnRlciAndW5pb24nIikpIHJldHVybiB0cnVlOworCisgIFNtYWxsVmVjdG9yPFBBVHlwZUhvbGRlciwgOD4gUGFyYW1zTGlzdDsKKyAgZG8geworICAgIExvY1R5IEVsdFR5TG9jID0gTGV4LmdldExvYygpOworICAgIGlmIChQYXJzZVR5cGVSZWMoUmVzdWx0KSkgcmV0dXJuIHRydWU7CisgICAgUGFyYW1zTGlzdC5wdXNoX2JhY2soUmVzdWx0KTsKKworICAgIGlmIChSZXN1bHQtPmlzVm9pZFR5KCkpCisgICAgICByZXR1cm4gRXJyb3IoRWx0VHlMb2MsICJ1bmlvbiBlbGVtZW50IGNhbiBub3QgaGF2ZSB2b2lkIHR5cGUiKTsKKyAgICBpZiAoIVVuaW9uVHlwZTo6aXNWYWxpZEVsZW1lbnRUeXBlKFJlc3VsdCkpCisgICAgICByZXR1cm4gRXJyb3IoRWx0VHlMb2MsICJpbnZhbGlkIGVsZW1lbnQgdHlwZSBmb3IgdW5pb24iKTsKKworICB9IHdoaWxlIChFYXRJZlByZXNlbnQobGx0b2s6OmNvbW1hKSkgOworCisgIGlmIChQYXJzZVRva2VuKGxsdG9rOjpyYnJhY2UsICJleHBlY3RlZCAnfScgYXQgZW5kIG9mIHVuaW9uIikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgU21hbGxWZWN0b3I8Y29uc3QgVHlwZSosIDg+IFBhcmFtc0xpc3RUeTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBhcmFtc0xpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBQYXJhbXNMaXN0VHkucHVzaF9iYWNrKFBhcmFtc0xpc3RbaV0uZ2V0KCkpOworICBSZXN1bHQgPSBIYW5kbGVVcFJlZnMoVW5pb25UeXBlOjpnZXQoJlBhcmFtc0xpc3RUeVswXSwgUGFyYW1zTGlzdFR5LnNpemUoKSkpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZUFycmF5VmVjdG9yVHlwZSAtIFBhcnNlIGFuIGFycmF5IG9yIHZlY3RvciB0eXBlLCBhc3N1bWluZyB0aGUgZmlyc3QKKy8vLyB0b2tlbiBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLgorLy8vICAgVHlwZVJlYworLy8vICAgICA6Oj0gJ1snIEFQU0lOVFZBTCAneCcgVHlwZXMgJ10nCisvLy8gICAgIDo6PSAnPCcgQVBTSU5UVkFMICd4JyBUeXBlcyAnPicKK2Jvb2wgTExQYXJzZXI6OlBhcnNlQXJyYXlWZWN0b3JUeXBlKFBBVHlwZUhvbGRlciAmUmVzdWx0LCBib29sIGlzVmVjdG9yKSB7CisgIGlmIChMZXguZ2V0S2luZCgpICE9IGxsdG9rOjpBUFNJbnQgfHwgTGV4LmdldEFQU0ludFZhbCgpLmlzU2lnbmVkKCkgfHwKKyAgICAgIExleC5nZXRBUFNJbnRWYWwoKS5nZXRCaXRXaWR0aCgpID4gNjQpCisgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBudW1iZXIgaW4gYWRkcmVzcyBzcGFjZSIpOworCisgIExvY1R5IFNpemVMb2MgPSBMZXguZ2V0TG9jKCk7CisgIHVpbnQ2NF90IFNpemUgPSBMZXguZ2V0QVBTSW50VmFsKCkuZ2V0WkV4dFZhbHVlKCk7CisgIExleC5MZXgoKTsKKworICBpZiAoUGFyc2VUb2tlbihsbHRvazo6a3dfeCwgImV4cGVjdGVkICd4JyBhZnRlciBlbGVtZW50IGNvdW50IikpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICBMb2NUeSBUeXBlTG9jID0gTGV4LmdldExvYygpOworICBQQVR5cGVIb2xkZXIgRWx0VHkoVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpKTsKKyAgaWYgKFBhcnNlVHlwZVJlYyhFbHRUeSkpIHJldHVybiB0cnVlOworCisgIGlmIChFbHRUeS0+aXNWb2lkVHkoKSkKKyAgICByZXR1cm4gRXJyb3IoVHlwZUxvYywgImFycmF5IGFuZCB2ZWN0b3IgZWxlbWVudCB0eXBlIGNhbm5vdCBiZSB2b2lkIik7CisKKyAgaWYgKFBhcnNlVG9rZW4oaXNWZWN0b3IgPyBsbHRvazo6Z3JlYXRlciA6IGxsdG9rOjpyc3F1YXJlLAorICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZW5kIG9mIHNlcXVlbnRpYWwgdHlwZSIpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChpc1ZlY3RvcikgeworICAgIGlmIChTaXplID09IDApCisgICAgICByZXR1cm4gRXJyb3IoU2l6ZUxvYywgInplcm8gZWxlbWVudCB2ZWN0b3IgaXMgaWxsZWdhbCIpOworICAgIGlmICgodW5zaWduZWQpU2l6ZSAhPSBTaXplKQorICAgICAgcmV0dXJuIEVycm9yKFNpemVMb2MsICJzaXplIHRvbyBsYXJnZSBmb3IgdmVjdG9yIik7CisgICAgaWYgKCFWZWN0b3JUeXBlOjppc1ZhbGlkRWxlbWVudFR5cGUoRWx0VHkpKQorICAgICAgcmV0dXJuIEVycm9yKFR5cGVMb2MsICJ2ZWN0b3IgZWxlbWVudCB0eXBlIG11c3QgYmUgZnAgb3IgaW50ZWdlciIpOworICAgIFJlc3VsdCA9IFZlY3RvclR5cGU6OmdldChFbHRUeSwgdW5zaWduZWQoU2l6ZSkpOworICB9IGVsc2UgeworICAgIGlmICghQXJyYXlUeXBlOjppc1ZhbGlkRWxlbWVudFR5cGUoRWx0VHkpKQorICAgICAgcmV0dXJuIEVycm9yKFR5cGVMb2MsICJpbnZhbGlkIGFycmF5IGVsZW1lbnQgdHlwZSIpOworICAgIFJlc3VsdCA9IEhhbmRsZVVwUmVmcyhBcnJheVR5cGU6OmdldChFbHRUeSwgU2l6ZSkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZ1bmN0aW9uIFNlbWFudGljIEFuYWx5c2lzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworTExQYXJzZXI6OlBlckZ1bmN0aW9uU3RhdGU6OlBlckZ1bmN0aW9uU3RhdGUoTExQYXJzZXIgJnAsIEZ1bmN0aW9uICZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZ1bmN0aW9uTnVtYmVyKQorICA6IFAocCksIEYoZiksIEZ1bmN0aW9uTnVtYmVyKGZ1bmN0aW9uTnVtYmVyKSB7CisKKyAgLy8gSW5zZXJ0IHVubmFtZWQgYXJndW1lbnRzIGludG8gdGhlIE51bWJlcmVkVmFscyBsaXN0LgorICBmb3IgKEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgQUkgPSBGLmFyZ19iZWdpbigpLCBFID0gRi5hcmdfZW5kKCk7CisgICAgICAgQUkgIT0gRTsgKytBSSkKKyAgICBpZiAoIUFJLT5oYXNOYW1lKCkpCisgICAgICBOdW1iZXJlZFZhbHMucHVzaF9iYWNrKEFJKTsKK30KKworTExQYXJzZXI6OlBlckZ1bmN0aW9uU3RhdGU6On5QZXJGdW5jdGlvblN0YXRlKCkgeworICAvLyBJZiB0aGVyZSB3ZXJlIGFueSBmb3J3YXJkIHJlZmVyZW5jZWQgbm9uLWJhc2ljYmxvY2sgdmFsdWVzLCBkZWxldGUgdGhlbS4KKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpwYWlyPFZhbHVlKiwgTG9jVHk+ID46Oml0ZXJhdG9yCisgICAgICAgSSA9IEZvcndhcmRSZWZWYWxzLmJlZ2luKCksIEUgPSBGb3J3YXJkUmVmVmFscy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFpc2E8QmFzaWNCbG9jaz4oSS0+c2Vjb25kLmZpcnN0KSkgeworICAgICAgSS0+c2Vjb25kLmZpcnN0LT5yZXBsYWNlQWxsVXNlc1dpdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmRlZlZhbHVlOjpnZXQoSS0+c2Vjb25kLmZpcnN0LT5nZXRUeXBlKCkpKTsKKyAgICAgIGRlbGV0ZSBJLT5zZWNvbmQuZmlyc3Q7CisgICAgICBJLT5zZWNvbmQuZmlyc3QgPSAwOworICAgIH0KKworICBmb3IgKHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnBhaXI8VmFsdWUqLCBMb2NUeT4gPjo6aXRlcmF0b3IKKyAgICAgICBJID0gRm9yd2FyZFJlZlZhbElEcy5iZWdpbigpLCBFID0gRm9yd2FyZFJlZlZhbElEcy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFpc2E8QmFzaWNCbG9jaz4oSS0+c2Vjb25kLmZpcnN0KSkgeworICAgICAgSS0+c2Vjb25kLmZpcnN0LT5yZXBsYWNlQWxsVXNlc1dpdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmRlZlZhbHVlOjpnZXQoSS0+c2Vjb25kLmZpcnN0LT5nZXRUeXBlKCkpKTsKKyAgICAgIGRlbGV0ZSBJLT5zZWNvbmQuZmlyc3Q7CisgICAgICBJLT5zZWNvbmQuZmlyc3QgPSAwOworICAgIH0KK30KKworYm9vbCBMTFBhcnNlcjo6UGVyRnVuY3Rpb25TdGF0ZTo6RmluaXNoRnVuY3Rpb24oKSB7CisgIC8vIENoZWNrIHRvIHNlZSBpZiBzb21lb25lIHRvb2sgdGhlIGFkZHJlc3Mgb2YgbGFiZWxzIGluIHRoaXMgYmxvY2suCisgIGlmICghUC5Gb3J3YXJkUmVmQmxvY2tBZGRyZXNzZXMuZW1wdHkoKSkgeworICAgIFZhbElEIEZ1bmN0aW9uSUQ7CisgICAgaWYgKCFGLmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgICBGdW5jdGlvbklELktpbmQgPSBWYWxJRDo6dF9HbG9iYWxOYW1lOworICAgICAgRnVuY3Rpb25JRC5TdHJWYWwgPSBGLmdldE5hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgRnVuY3Rpb25JRC5LaW5kID0gVmFsSUQ6OnRfR2xvYmFsSUQ7CisgICAgICBGdW5jdGlvbklELlVJbnRWYWwgPSBGdW5jdGlvbk51bWJlcjsKKyAgICB9CisgIAorICAgIHN0ZDo6bWFwPFZhbElELCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8VmFsSUQsIEdsb2JhbFZhbHVlKj4gPiA+OjppdGVyYXRvcgorICAgICAgRlJCQUkgPSBQLkZvcndhcmRSZWZCbG9ja0FkZHJlc3Nlcy5maW5kKEZ1bmN0aW9uSUQpOworICAgIGlmIChGUkJBSSAhPSBQLkZvcndhcmRSZWZCbG9ja0FkZHJlc3Nlcy5lbmQoKSkgeworICAgICAgLy8gUmVzb2x2ZSBhbGwgdGhlc2UgcmVmZXJlbmNlcy4KKyAgICAgIGlmIChQLlJlc29sdmVGb3J3YXJkUmVmQmxvY2tBZGRyZXNzZXMoJkYsIEZSQkFJLT5zZWNvbmQsIHRoaXMpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIAorICAgICAgUC5Gb3J3YXJkUmVmQmxvY2tBZGRyZXNzZXMuZXJhc2UoRlJCQUkpOworICAgIH0KKyAgfQorICAKKyAgaWYgKCFGb3J3YXJkUmVmVmFscy5lbXB0eSgpKQorICAgIHJldHVybiBQLkVycm9yKEZvcndhcmRSZWZWYWxzLmJlZ2luKCktPnNlY29uZC5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgInVzZSBvZiB1bmRlZmluZWQgdmFsdWUgJyUiICsgRm9yd2FyZFJlZlZhbHMuYmVnaW4oKS0+Zmlyc3QgKworICAgICAgICAgICAgICAgICAgICInIik7CisgIGlmICghRm9yd2FyZFJlZlZhbElEcy5lbXB0eSgpKQorICAgIHJldHVybiBQLkVycm9yKEZvcndhcmRSZWZWYWxJRHMuYmVnaW4oKS0+c2Vjb25kLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAidXNlIG9mIHVuZGVmaW5lZCB2YWx1ZSAnJSIgKworICAgICAgICAgICAgICAgICAgIHV0b3N0cihGb3J3YXJkUmVmVmFsSURzLmJlZ2luKCktPmZpcnN0KSArICInIik7CisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gR2V0VmFsIC0gR2V0IGEgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgb3IgSUQsIGNyZWF0aW5nIGEKKy8vLyBmb3J3YXJkIHJlZmVyZW5jZSByZWNvcmQgaWYgbmVlZGVkLiAgVGhpcyBjYW4gcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlCisvLy8gZXhpc3RzIGJ1dCBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCB0eXBlLgorVmFsdWUgKkxMUGFyc2VyOjpQZXJGdW5jdGlvblN0YXRlOjpHZXRWYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSwgTG9jVHkgTG9jKSB7CisgIC8vIExvb2sgdGhpcyBuYW1lIHVwIGluIHRoZSBub3JtYWwgZnVuY3Rpb24gc3ltYm9sIHRhYmxlLgorICBWYWx1ZSAqVmFsID0gRi5nZXRWYWx1ZVN5bWJvbFRhYmxlKCkubG9va3VwKE5hbWUpOworCisgIC8vIElmIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSBmb3IgdGhlIHZhbHVlLCBzZWUgaWYgd2UgYWxyZWFkeSBjcmVhdGVkIGEKKyAgLy8gZm9yd2FyZCByZWYgcmVjb3JkLgorICBpZiAoVmFsID09IDApIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpwYWlyPFZhbHVlKiwgTG9jVHk+ID46Oml0ZXJhdG9yCisgICAgICBJID0gRm9yd2FyZFJlZlZhbHMuZmluZChOYW1lKTsKKyAgICBpZiAoSSAhPSBGb3J3YXJkUmVmVmFscy5lbmQoKSkKKyAgICAgIFZhbCA9IEktPnNlY29uZC5maXJzdDsKKyAgfQorCisgIC8vIElmIHdlIGhhdmUgdGhlIHZhbHVlIGluIHRoZSBzeW1ib2wgdGFibGUgb3IgZndkLXJlZiB0YWJsZSwgcmV0dXJuIGl0LgorICBpZiAoVmFsKSB7CisgICAgaWYgKFZhbC0+Z2V0VHlwZSgpID09IFR5KSByZXR1cm4gVmFsOworICAgIGlmIChUeS0+aXNMYWJlbFR5KCkpCisgICAgICBQLkVycm9yKExvYywgIiclIiArIE5hbWUgKyAiJyBpcyBub3QgYSBiYXNpYyBibG9jayIpOworICAgIGVsc2UKKyAgICAgIFAuRXJyb3IoTG9jLCAiJyUiICsgTmFtZSArICInIGRlZmluZWQgd2l0aCB0eXBlICciICsKKyAgICAgICAgICAgICAgVmFsLT5nZXRUeXBlKCktPmdldERlc2NyaXB0aW9uKCkgKyAiJyIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gRG9uJ3QgbWFrZSBwbGFjZWhvbGRlcnMgd2l0aCBpbnZhbGlkIHR5cGUuCisgIGlmICghVHktPmlzRmlyc3RDbGFzc1R5cGUoKSAmJiAhVHktPmlzT3BhcXVlVHkoKSAmJiAhVHktPmlzTGFiZWxUeSgpKSB7CisgICAgUC5FcnJvcihMb2MsICJpbnZhbGlkIHVzZSBvZiBhIG5vbi1maXJzdC1jbGFzcyB0eXBlIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhIG5ldyBmb3J3YXJkIHJlZmVyZW5jZSBmb3IgdGhpcyB2YWx1ZSBhbmQgcmVtZW1iZXIgaXQuCisgIFZhbHVlICpGd2RWYWw7CisgIGlmIChUeS0+aXNMYWJlbFR5KCkpCisgICAgRndkVmFsID0gQmFzaWNCbG9jazo6Q3JlYXRlKEYuZ2V0Q29udGV4dCgpLCBOYW1lLCAmRik7CisgIGVsc2UKKyAgICBGd2RWYWwgPSBuZXcgQXJndW1lbnQoVHksIE5hbWUpOworCisgIEZvcndhcmRSZWZWYWxzW05hbWVdID0gc3RkOjptYWtlX3BhaXIoRndkVmFsLCBMb2MpOworICByZXR1cm4gRndkVmFsOworfQorCitWYWx1ZSAqTExQYXJzZXI6OlBlckZ1bmN0aW9uU3RhdGU6OkdldFZhbCh1bnNpZ25lZCBJRCwgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NUeSBMb2MpIHsKKyAgLy8gTG9vayB0aGlzIG5hbWUgdXAgaW4gdGhlIG5vcm1hbCBmdW5jdGlvbiBzeW1ib2wgdGFibGUuCisgIFZhbHVlICpWYWwgPSBJRCA8IE51bWJlcmVkVmFscy5zaXplKCkgPyBOdW1iZXJlZFZhbHNbSURdIDogMDsKKworICAvLyBJZiB0aGlzIGlzIGEgZm9yd2FyZCByZWZlcmVuY2UgZm9yIHRoZSB2YWx1ZSwgc2VlIGlmIHdlIGFscmVhZHkgY3JlYXRlZCBhCisgIC8vIGZvcndhcmQgcmVmIHJlY29yZC4KKyAgaWYgKFZhbCA9PSAwKSB7CisgICAgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6cGFpcjxWYWx1ZSosIExvY1R5PiA+OjppdGVyYXRvcgorICAgICAgSSA9IEZvcndhcmRSZWZWYWxJRHMuZmluZChJRCk7CisgICAgaWYgKEkgIT0gRm9yd2FyZFJlZlZhbElEcy5lbmQoKSkKKyAgICAgIFZhbCA9IEktPnNlY29uZC5maXJzdDsKKyAgfQorCisgIC8vIElmIHdlIGhhdmUgdGhlIHZhbHVlIGluIHRoZSBzeW1ib2wgdGFibGUgb3IgZndkLXJlZiB0YWJsZSwgcmV0dXJuIGl0LgorICBpZiAoVmFsKSB7CisgICAgaWYgKFZhbC0+Z2V0VHlwZSgpID09IFR5KSByZXR1cm4gVmFsOworICAgIGlmIChUeS0+aXNMYWJlbFR5KCkpCisgICAgICBQLkVycm9yKExvYywgIiclIiArIHV0b3N0cihJRCkgKyAiJyBpcyBub3QgYSBiYXNpYyBibG9jayIpOworICAgIGVsc2UKKyAgICAgIFAuRXJyb3IoTG9jLCAiJyUiICsgdXRvc3RyKElEKSArICInIGRlZmluZWQgd2l0aCB0eXBlICciICsKKyAgICAgICAgICAgICAgVmFsLT5nZXRUeXBlKCktPmdldERlc2NyaXB0aW9uKCkgKyAiJyIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFUeS0+aXNGaXJzdENsYXNzVHlwZSgpICYmICFUeS0+aXNPcGFxdWVUeSgpICYmICFUeS0+aXNMYWJlbFR5KCkpIHsKKyAgICBQLkVycm9yKExvYywgImludmFsaWQgdXNlIG9mIGEgbm9uLWZpcnN0LWNsYXNzIHR5cGUiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IGZvcndhcmQgcmVmZXJlbmNlIGZvciB0aGlzIHZhbHVlIGFuZCByZW1lbWJlciBpdC4KKyAgVmFsdWUgKkZ3ZFZhbDsKKyAgaWYgKFR5LT5pc0xhYmVsVHkoKSkKKyAgICBGd2RWYWwgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoRi5nZXRDb250ZXh0KCksICIiLCAmRik7CisgIGVsc2UKKyAgICBGd2RWYWwgPSBuZXcgQXJndW1lbnQoVHkpOworCisgIEZvcndhcmRSZWZWYWxJRHNbSURdID0gc3RkOjptYWtlX3BhaXIoRndkVmFsLCBMb2MpOworICByZXR1cm4gRndkVmFsOworfQorCisvLy8gU2V0SW5zdE5hbWUgLSBBZnRlciBhbiBpbnN0cnVjdGlvbiBpcyBwYXJzZWQgYW5kIGluc2VydGVkIGludG8gaXRzCisvLy8gYmFzaWMgYmxvY2ssIHRoaXMgaW5zdGFsbHMgaXRzIG5hbWUuCitib29sIExMUGFyc2VyOjpQZXJGdW5jdGlvblN0YXRlOjpTZXRJbnN0TmFtZShpbnQgTmFtZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NUeSBOYW1lTG9jLCBJbnN0cnVjdGlvbiAqSW5zdCkgeworICAvLyBJZiB0aGlzIGluc3RydWN0aW9uIGhhcyB2b2lkIHR5cGUsIGl0IGNhbm5vdCBoYXZlIGEgbmFtZSBvciBJRCBzcGVjaWZpZWQuCisgIGlmIChJbnN0LT5nZXRUeXBlKCktPmlzVm9pZFR5KCkpIHsKKyAgICBpZiAoTmFtZUlEICE9IC0xIHx8ICFOYW1lU3RyLmVtcHR5KCkpCisgICAgICByZXR1cm4gUC5FcnJvcihOYW1lTG9jLCAiaW5zdHJ1Y3Rpb25zIHJldHVybmluZyB2b2lkIGNhbm5vdCBoYXZlIGEgbmFtZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElmIHRoaXMgd2FzIGEgbnVtYmVyZWQgaW5zdHJ1Y3Rpb24sIHZlcmlmeSB0aGF0IHRoZSBpbnN0cnVjdGlvbiBpcyB0aGUKKyAgLy8gZXhwZWN0ZWQgdmFsdWUgYW5kIHJlc29sdmUgYW55IGZvcndhcmQgcmVmZXJlbmNlcy4KKyAgaWYgKE5hbWVTdHIuZW1wdHkoKSkgeworICAgIC8vIElmIG5laXRoZXIgYSBuYW1lIG5vciBhbiBJRCB3YXMgc3BlY2lmaWVkLCBqdXN0IHVzZSB0aGUgbmV4dCBJRC4KKyAgICBpZiAoTmFtZUlEID09IC0xKQorICAgICAgTmFtZUlEID0gTnVtYmVyZWRWYWxzLnNpemUoKTsKKworICAgIGlmICh1bnNpZ25lZChOYW1lSUQpICE9IE51bWJlcmVkVmFscy5zaXplKCkpCisgICAgICByZXR1cm4gUC5FcnJvcihOYW1lTG9jLCAiaW5zdHJ1Y3Rpb24gZXhwZWN0ZWQgdG8gYmUgbnVtYmVyZWQgJyUiICsKKyAgICAgICAgICAgICAgICAgICAgIHV0b3N0cihOdW1iZXJlZFZhbHMuc2l6ZSgpKSArICInIik7CisKKyAgICBzdGQ6Om1hcDx1bnNpZ25lZCwgc3RkOjpwYWlyPFZhbHVlKiwgTG9jVHk+ID46Oml0ZXJhdG9yIEZJID0KKyAgICAgIEZvcndhcmRSZWZWYWxJRHMuZmluZChOYW1lSUQpOworICAgIGlmIChGSSAhPSBGb3J3YXJkUmVmVmFsSURzLmVuZCgpKSB7CisgICAgICBpZiAoRkktPnNlY29uZC5maXJzdC0+Z2V0VHlwZSgpICE9IEluc3QtPmdldFR5cGUoKSkKKyAgICAgICAgcmV0dXJuIFAuRXJyb3IoTmFtZUxvYywgImluc3RydWN0aW9uIGZvcndhcmQgcmVmZXJlbmNlZCB3aXRoIHR5cGUgJyIgKworICAgICAgICAgICAgICAgICAgICAgICBGSS0+c2Vjb25kLmZpcnN0LT5nZXRUeXBlKCktPmdldERlc2NyaXB0aW9uKCkgKyAiJyIpOworICAgICAgRkktPnNlY29uZC5maXJzdC0+cmVwbGFjZUFsbFVzZXNXaXRoKEluc3QpOworICAgICAgZGVsZXRlIEZJLT5zZWNvbmQuZmlyc3Q7CisgICAgICBGb3J3YXJkUmVmVmFsSURzLmVyYXNlKEZJKTsKKyAgICB9CisKKyAgICBOdW1iZXJlZFZhbHMucHVzaF9iYWNrKEluc3QpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgdGhlIGluc3RydWN0aW9uIGhhZCBhIG5hbWUuICBSZXNvbHZlIGZvcndhcmQgcmVmcyBhbmQgc2V0IGl0LgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpwYWlyPFZhbHVlKiwgTG9jVHk+ID46Oml0ZXJhdG9yCisgICAgRkkgPSBGb3J3YXJkUmVmVmFscy5maW5kKE5hbWVTdHIpOworICBpZiAoRkkgIT0gRm9yd2FyZFJlZlZhbHMuZW5kKCkpIHsKKyAgICBpZiAoRkktPnNlY29uZC5maXJzdC0+Z2V0VHlwZSgpICE9IEluc3QtPmdldFR5cGUoKSkKKyAgICAgIHJldHVybiBQLkVycm9yKE5hbWVMb2MsICJpbnN0cnVjdGlvbiBmb3J3YXJkIHJlZmVyZW5jZWQgd2l0aCB0eXBlICciICsKKyAgICAgICAgICAgICAgICAgICAgIEZJLT5zZWNvbmQuZmlyc3QtPmdldFR5cGUoKS0+Z2V0RGVzY3JpcHRpb24oKSArICInIik7CisgICAgRkktPnNlY29uZC5maXJzdC0+cmVwbGFjZUFsbFVzZXNXaXRoKEluc3QpOworICAgIGRlbGV0ZSBGSS0+c2Vjb25kLmZpcnN0OworICAgIEZvcndhcmRSZWZWYWxzLmVyYXNlKEZJKTsKKyAgfQorCisgIC8vIFNldCB0aGUgbmFtZSBvbiB0aGUgaW5zdHJ1Y3Rpb24uCisgIEluc3QtPnNldE5hbWUoTmFtZVN0cik7CisKKyAgaWYgKEluc3QtPmdldE5hbWVTdHIoKSAhPSBOYW1lU3RyKQorICAgIHJldHVybiBQLkVycm9yKE5hbWVMb2MsICJtdWx0aXBsZSBkZWZpbml0aW9uIG9mIGxvY2FsIHZhbHVlIG5hbWVkICciICsKKyAgICAgICAgICAgICAgICAgICBOYW1lU3RyICsgIiciKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gR2V0QkIgLSBHZXQgYSBiYXNpYyBibG9jayB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBvciBJRCwgY3JlYXRpbmcgYQorLy8vIGZvcndhcmQgcmVmZXJlbmNlIHJlY29yZCBpZiBuZWVkZWQuCitCYXNpY0Jsb2NrICpMTFBhcnNlcjo6UGVyRnVuY3Rpb25TdGF0ZTo6R2V0QkIoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jVHkgTG9jKSB7CisgIHJldHVybiBjYXN0X29yX251bGw8QmFzaWNCbG9jaz4oR2V0VmFsKE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0TGFiZWxUeShGLmdldENvbnRleHQoKSksIExvYykpOworfQorCitCYXNpY0Jsb2NrICpMTFBhcnNlcjo6UGVyRnVuY3Rpb25TdGF0ZTo6R2V0QkIodW5zaWduZWQgSUQsIExvY1R5IExvYykgeworICByZXR1cm4gY2FzdF9vcl9udWxsPEJhc2ljQmxvY2s+KEdldFZhbChJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRMYWJlbFR5KEYuZ2V0Q29udGV4dCgpKSwgTG9jKSk7Cit9CisKKy8vLyBEZWZpbmVCQiAtIERlZmluZSB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLCB3aGljaCBpcyBlaXRoZXIgbmFtZWQgb3IKKy8vLyB1bm5hbWVkLiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoaXMgcmV0dXJucyBudWxsIG90aGVyd2lzZSBpdCByZXR1cm5zCisvLy8gdGhlIGJsb2NrIGJlaW5nIGRlZmluZWQuCitCYXNpY0Jsb2NrICpMTFBhcnNlcjo6UGVyRnVuY3Rpb25TdGF0ZTo6RGVmaW5lQkIoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jVHkgTG9jKSB7CisgIEJhc2ljQmxvY2sgKkJCOworICBpZiAoTmFtZS5lbXB0eSgpKQorICAgIEJCID0gR2V0QkIoTnVtYmVyZWRWYWxzLnNpemUoKSwgTG9jKTsKKyAgZWxzZQorICAgIEJCID0gR2V0QkIoTmFtZSwgTG9jKTsKKyAgaWYgKEJCID09IDApIHJldHVybiAwOyAvLyBBbHJlYWR5IGRpYWdub3NlZCBlcnJvci4KKworICAvLyBNb3ZlIHRoZSBibG9jayB0byB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4gIEZvcndhcmQgcmVmJ2QgYmxvY2tzIGFyZQorICAvLyBpbnNlcnRlZCB3aGVyZXZlciB0aGV5IGhhcHBlbiB0byBiZSByZWZlcmVuY2VkLgorICBGLmdldEJhc2ljQmxvY2tMaXN0KCkuc3BsaWNlKEYuZW5kKCksIEYuZ2V0QmFzaWNCbG9ja0xpc3QoKSwgQkIpOworCisgIC8vIFJlbW92ZSB0aGUgYmxvY2sgZnJvbSBmb3J3YXJkIHJlZiBzZXRzLgorICBpZiAoTmFtZS5lbXB0eSgpKSB7CisgICAgRm9yd2FyZFJlZlZhbElEcy5lcmFzZShOdW1iZXJlZFZhbHMuc2l6ZSgpKTsKKyAgICBOdW1iZXJlZFZhbHMucHVzaF9iYWNrKEJCKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBCQiBmb3J3YXJkIHJlZmVyZW5jZXMgYXJlIGFscmVhZHkgaW4gdGhlIGZ1bmN0aW9uIHN5bWJvbCB0YWJsZS4KKyAgICBGb3J3YXJkUmVmVmFscy5lcmFzZShOYW1lKTsKKyAgfQorCisgIHJldHVybiBCQjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbnN0YW50cy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBQYXJzZVZhbElEIC0gUGFyc2UgYW4gYWJzdHJhY3QgdmFsdWUgdGhhdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgYQorLy8vIHR5cGUgaW1wbGllZC4gIEZvciBleGFtcGxlLCBpZiB3ZSBwYXJzZSAiNCIgd2UgZG9uJ3Qga25vdyB3aGF0IGludGVnZXIgdHlwZQorLy8vIGl0IGhhcy4gIFRoZSB2YWx1ZSB3aWxsIGxhdGVyIGJlIGNvbWJpbmVkIHdpdGggaXRzIHR5cGUgYW5kIGNoZWNrZWQgZm9yCisvLy8gc2FuaXR5LiAgUEZTIGlzIHVzZWQgdG8gY29udmVydCBmdW5jdGlvbi1sb2NhbCBvcGVyYW5kcyBvZiBtZXRhZGF0YSAoc2luY2UKKy8vLyBtZXRhZGF0YSBvcGVyYW5kcyBhcmUgbm90IGp1c3QgcGFyc2VkIGhlcmUgYnV0IGFsc28gY29udmVydGVkIHRvIHZhbHVlcykuCisvLy8gUEZTIGNhbiBiZSBudWxsIHdoZW4gd2UgYXJlIG5vdCBwYXJzaW5nIG1ldGFkYXRhIHZhbHVlcyBpbnNpZGUgYSBmdW5jdGlvbi4KK2Jvb2wgTExQYXJzZXI6OlBhcnNlVmFsSUQoVmFsSUQgJklELCBQZXJGdW5jdGlvblN0YXRlICpQRlMpIHsKKyAgSUQuTG9jID0gTGV4LmdldExvYygpOworICBzd2l0Y2ggKExleC5nZXRLaW5kKCkpIHsKKyAgZGVmYXVsdDogcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCB2YWx1ZSB0b2tlbiIpOworICBjYXNlIGxsdG9rOjpHbG9iYWxJRDogIC8vIEA0MgorICAgIElELlVJbnRWYWwgPSBMZXguZ2V0VUludFZhbCgpOworICAgIElELktpbmQgPSBWYWxJRDo6dF9HbG9iYWxJRDsKKyAgICBicmVhazsKKyAgY2FzZSBsbHRvazo6R2xvYmFsVmFyOiAgLy8gQGZvbworICAgIElELlN0clZhbCA9IExleC5nZXRTdHJWYWwoKTsKKyAgICBJRC5LaW5kID0gVmFsSUQ6OnRfR2xvYmFsTmFtZTsKKyAgICBicmVhazsKKyAgY2FzZSBsbHRvazo6TG9jYWxWYXJJRDogIC8vICU0MgorICAgIElELlVJbnRWYWwgPSBMZXguZ2V0VUludFZhbCgpOworICAgIElELktpbmQgPSBWYWxJRDo6dF9Mb2NhbElEOworICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjpMb2NhbFZhcjogIC8vICVmb28KKyAgY2FzZSBsbHRvazo6U3RyaW5nQ29uc3RhbnQ6ICAvLyAiZm9vIiAtIEZJWE1FOiBSRU1PVkUgSU4gTExWTSAzLjAKKyAgICBJRC5TdHJWYWwgPSBMZXguZ2V0U3RyVmFsKCk7CisgICAgSUQuS2luZCA9IFZhbElEOjp0X0xvY2FsTmFtZTsKKyAgICBicmVhazsKKyAgY2FzZSBsbHRvazo6ZXhjbGFpbTogICAvLyAhNDIsICF7Li4ufSwgb3IgISJmb28iCisgICAgcmV0dXJuIFBhcnNlTWV0YWRhdGFWYWx1ZShJRCwgUEZTKTsKKyAgY2FzZSBsbHRvazo6QVBTSW50OgorICAgIElELkFQU0ludFZhbCA9IExleC5nZXRBUFNJbnRWYWwoKTsKKyAgICBJRC5LaW5kID0gVmFsSUQ6OnRfQVBTSW50OworICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjpBUEZsb2F0OgorICAgIElELkFQRmxvYXRWYWwgPSBMZXguZ2V0QVBGbG9hdFZhbCgpOworICAgIElELktpbmQgPSBWYWxJRDo6dF9BUEZsb2F0OworICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjprd190cnVlOgorICAgIElELkNvbnN0YW50VmFsID0gQ29uc3RhbnRJbnQ6OmdldFRydWUoQ29udGV4dCk7CisgICAgSUQuS2luZCA9IFZhbElEOjp0X0NvbnN0YW50OworICAgIGJyZWFrOworICBjYXNlIGxsdG9rOjprd19mYWxzZToKKyAgICBJRC5Db25zdGFudFZhbCA9IENvbnN0YW50SW50OjpnZXRGYWxzZShDb250ZXh0KTsKKyAgICBJRC5LaW5kID0gVmFsSUQ6OnRfQ29uc3RhbnQ7CisgICAgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X251bGw6IElELktpbmQgPSBWYWxJRDo6dF9OdWxsOyBicmVhazsKKyAgY2FzZSBsbHRvazo6a3dfdW5kZWY6IElELktpbmQgPSBWYWxJRDo6dF9VbmRlZjsgYnJlYWs7CisgIGNhc2UgbGx0b2s6Omt3X3plcm9pbml0aWFsaXplcjogSUQuS2luZCA9IFZhbElEOjp0X1plcm87IGJyZWFrOworCisgIGNhc2UgbGx0b2s6OmxicmFjZTogeworICAgIC8vIFZhbElEIDo6PSAneycgQ29uc3RWZWN0b3IgJ30nCisgICAgTGV4LkxleCgpOworICAgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgMTY+IEVsdHM7CisgICAgaWYgKFBhcnNlR2xvYmFsVmFsdWVWZWN0b3IoRWx0cykgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6cmJyYWNlLCAiZXhwZWN0ZWQgZW5kIG9mIHN0cnVjdCBjb25zdGFudCIpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBJRC5Db25zdGFudFZhbCA9IENvbnN0YW50U3RydWN0OjpnZXQoQ29udGV4dCwgRWx0cy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsdHMuc2l6ZSgpLCBmYWxzZSk7CisgICAgSUQuS2luZCA9IFZhbElEOjp0X0NvbnN0YW50OworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjYXNlIGxsdG9rOjpsZXNzOiB7CisgICAgLy8gVmFsSUQgOjo9ICc8JyBDb25zdFZlY3RvciAnPicgICAgICAgICAtLT4gVmVjdG9yLgorICAgIC8vIFZhbElEIDo6PSAnPCcgJ3snIENvbnN0VmVjdG9yICd9JyAnPicgLS0+IFBhY2tlZCBTdHJ1Y3QuCisgICAgTGV4LkxleCgpOworICAgIGJvb2wgaXNQYWNrZWRTdHJ1Y3QgPSBFYXRJZlByZXNlbnQobGx0b2s6OmxicmFjZSk7CisKKyAgICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDE2PiBFbHRzOworICAgIExvY1R5IEZpcnN0RWx0TG9jID0gTGV4LmdldExvYygpOworICAgIGlmIChQYXJzZUdsb2JhbFZhbHVlVmVjdG9yKEVsdHMpIHx8CisgICAgICAgIChpc1BhY2tlZFN0cnVjdCAmJgorICAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6cmJyYWNlLCAiZXhwZWN0ZWQgZW5kIG9mIHBhY2tlZCBzdHJ1Y3QiKSkgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6Z3JlYXRlciwgImV4cGVjdGVkIGVuZCBvZiBjb25zdGFudCIpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoaXNQYWNrZWRTdHJ1Y3QpIHsKKyAgICAgIElELkNvbnN0YW50VmFsID0KKyAgICAgICAgQ29uc3RhbnRTdHJ1Y3Q6OmdldChDb250ZXh0LCBFbHRzLmRhdGEoKSwgRWx0cy5zaXplKCksIHRydWUpOworICAgICAgSUQuS2luZCA9IFZhbElEOjp0X0NvbnN0YW50OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChFbHRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiY29uc3RhbnQgdmVjdG9yIG11c3Qgbm90IGJlIGVtcHR5Iik7CisKKyAgICBpZiAoIUVsdHNbMF0tPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSAmJgorICAgICAgICAhRWx0c1swXS0+Z2V0VHlwZSgpLT5pc0Zsb2F0aW5nUG9pbnRUeSgpKQorICAgICAgcmV0dXJuIEVycm9yKEZpcnN0RWx0TG9jLAorICAgICAgICAgICAgICAgICAgICJ2ZWN0b3IgZWxlbWVudHMgbXVzdCBoYXZlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgLy8gVmVyaWZ5IHRoYXQgYWxsIHRoZSB2ZWN0b3IgZWxlbWVudHMgaGF2ZSB0aGUgc2FtZSB0eXBlLgorICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBFbHRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoRWx0c1tpXS0+Z2V0VHlwZSgpICE9IEVsdHNbMF0tPmdldFR5cGUoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKEZpcnN0RWx0TG9jLAorICAgICAgICAgICAgICAgICAgICAgInZlY3RvciBlbGVtZW50ICMiICsgdXRvc3RyKGkpICsKKyAgICAgICAgICAgICAgICAgICAgIiBpcyBub3Qgb2YgdHlwZSAnIiArIEVsdHNbMF0tPmdldFR5cGUoKS0+Z2V0RGVzY3JpcHRpb24oKSk7CisKKyAgICBJRC5Db25zdGFudFZhbCA9IENvbnN0YW50VmVjdG9yOjpnZXQoRWx0cy5kYXRhKCksIEVsdHMuc2l6ZSgpKTsKKyAgICBJRC5LaW5kID0gVmFsSUQ6OnRfQ29uc3RhbnQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNhc2UgbGx0b2s6OmxzcXVhcmU6IHsgICAvLyBBcnJheSBDb25zdGFudAorICAgIExleC5MZXgoKTsKKyAgICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDE2PiBFbHRzOworICAgIExvY1R5IEZpcnN0RWx0TG9jID0gTGV4LmdldExvYygpOworICAgIGlmIChQYXJzZUdsb2JhbFZhbHVlVmVjdG9yKEVsdHMpIHx8CisgICAgICAgIFBhcnNlVG9rZW4obGx0b2s6OnJzcXVhcmUsICJleHBlY3RlZCBlbmQgb2YgYXJyYXkgY29uc3RhbnQiKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gSGFuZGxlIGVtcHR5IGVsZW1lbnQuCisgICAgaWYgKEVsdHMuZW1wdHkoKSkgeworICAgICAgLy8gVXNlIHVuZGVmIGluc3RlYWQgb2YgYW4gYXJyYXkgYmVjYXVzZSBpdCdzIGluY29udmVuaWVudCB0byBkZXRlcm1pbmUKKyAgICAgIC8vIHRoZSBlbGVtZW50IHR5cGUgYXQgdGhpcyBwb2ludCwgdGhlcmUgYmVpbmcgbm8gZWxlbWVudHMgdG8gZXhhbWluZS4KKyAgICAgIElELktpbmQgPSBWYWxJRDo6dF9FbXB0eUFycmF5OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghRWx0c1swXS0+Z2V0VHlwZSgpLT5pc0ZpcnN0Q2xhc3NUeXBlKCkpCisgICAgICByZXR1cm4gRXJyb3IoRmlyc3RFbHRMb2MsICJpbnZhbGlkIGFycmF5IGVsZW1lbnQgdHlwZTogIiArCisgICAgICAgICAgICAgICAgICAgRWx0c1swXS0+Z2V0VHlwZSgpLT5nZXREZXNjcmlwdGlvbigpKTsKKworICAgIEFycmF5VHlwZSAqQVR5ID0gQXJyYXlUeXBlOjpnZXQoRWx0c1swXS0+Z2V0VHlwZSgpLCBFbHRzLnNpemUoKSk7CisKKyAgICAvLyBWZXJpZnkgYWxsIGVsZW1lbnRzIGFyZSBjb3JyZWN0IHR5cGUhCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEVsdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKEVsdHNbaV0tPmdldFR5cGUoKSAhPSBFbHRzWzBdLT5nZXRUeXBlKCkpCisgICAgICAgIHJldHVybiBFcnJvcihGaXJzdEVsdExvYywKKyAgICAgICAgICAgICAgICAgICAgICJhcnJheSBlbGVtZW50ICMiICsgdXRvc3RyKGkpICsKKyAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IG9mIHR5cGUgJyIgK0VsdHNbMF0tPmdldFR5cGUoKS0+Z2V0RGVzY3JpcHRpb24oKSk7CisgICAgfQorCisgICAgSUQuQ29uc3RhbnRWYWwgPSBDb25zdGFudEFycmF5OjpnZXQoQVR5LCBFbHRzLmRhdGEoKSwgRWx0cy5zaXplKCkpOworICAgIElELktpbmQgPSBWYWxJRDo6dF9Db25zdGFudDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY2FzZSBsbHRvazo6a3dfYzogIC8vIGMgImZvbyIKKyAgICBMZXguTGV4KCk7CisgICAgSUQuQ29uc3RhbnRWYWwgPSBDb25zdGFudEFycmF5OjpnZXQoQ29udGV4dCwgTGV4LmdldFN0clZhbCgpLCBmYWxzZSk7CisgICAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OlN0cmluZ0NvbnN0YW50LCAiZXhwZWN0ZWQgc3RyaW5nIikpIHJldHVybiB0cnVlOworICAgIElELktpbmQgPSBWYWxJRDo6dF9Db25zdGFudDsKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY2FzZSBsbHRvazo6a3dfYXNtOiB7CisgICAgLy8gVmFsSUQgOjo9ICdhc20nIFNpZGVFZmZlY3Q/IEFsaWduU3RhY2s/IFNUUklOR0NPTlNUQU5UICcsJyBTVFJJTkdDT05TVEFOVAorICAgIGJvb2wgSGFzU2lkZUVmZmVjdCwgQWxpZ25TdGFjazsKKyAgICBMZXguTGV4KCk7CisgICAgaWYgKFBhcnNlT3B0aW9uYWxUb2tlbihsbHRvazo6a3dfc2lkZWVmZmVjdCwgSGFzU2lkZUVmZmVjdCkgfHwKKyAgICAgICAgUGFyc2VPcHRpb25hbFRva2VuKGxsdG9rOjprd19hbGlnbnN0YWNrLCBBbGlnblN0YWNrKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0NvbnN0YW50KElELlN0clZhbCkgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCBjb21tYSBpbiBpbmxpbmUgYXNtIGV4cHJlc3Npb24iKSB8fAorICAgICAgICBQYXJzZVRva2VuKGxsdG9rOjpTdHJpbmdDb25zdGFudCwgImV4cGVjdGVkIGNvbnN0cmFpbnQgc3RyaW5nIikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBJRC5TdHJWYWwyID0gTGV4LmdldFN0clZhbCgpOworICAgIElELlVJbnRWYWwgPSB1bnNpZ25lZChIYXNTaWRlRWZmZWN0KSB8ICh1bnNpZ25lZChBbGlnblN0YWNrKTw8MSk7CisgICAgSUQuS2luZCA9IFZhbElEOjp0X0lubGluZUFzbTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjYXNlIGxsdG9rOjprd19ibG9ja2FkZHJlc3M6IHsKKyAgICAvLyBWYWxJRCA6Oj0gJ2Jsb2NrYWRkcmVzcycgJygnIEBmb28gJywnICViYXIgJyknCisgICAgTGV4LkxleCgpOworCisgICAgVmFsSUQgRm4sIExhYmVsOworICAgIExvY1R5IEZuTG9jLCBMYWJlbExvYzsKKyAgICAKKyAgICBpZiAoUGFyc2VUb2tlbihsbHRvazo6bHBhcmVuLCAiZXhwZWN0ZWQgJygnIGluIGJsb2NrIGFkZHJlc3MgZXhwcmVzc2lvbiIpIHx8CisgICAgICAgIFBhcnNlVmFsSUQoRm4pIHx8CisgICAgICAgIFBhcnNlVG9rZW4obGx0b2s6OmNvbW1hLCAiZXhwZWN0ZWQgY29tbWEgaW4gYmxvY2sgYWRkcmVzcyBleHByZXNzaW9uIil8fAorICAgICAgICBQYXJzZVZhbElEKExhYmVsKSB8fAorICAgICAgICBQYXJzZVRva2VuKGxsdG9rOjpycGFyZW4sICJleHBlY3RlZCAnKScgaW4gYmxvY2sgYWRkcmVzcyBleHByZXNzaW9uIikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICBpZiAoRm4uS2luZCAhPSBWYWxJRDo6dF9HbG9iYWxJRCAmJiBGbi5LaW5kICE9IFZhbElEOjp0X0dsb2JhbE5hbWUpCisgICAgICByZXR1cm4gRXJyb3IoRm4uTG9jLCAiZXhwZWN0ZWQgZnVuY3Rpb24gbmFtZSBpbiBibG9ja2FkZHJlc3MiKTsKKyAgICBpZiAoTGFiZWwuS2luZCAhPSBWYWxJRDo6dF9Mb2NhbElEICYmIExhYmVsLktpbmQgIT0gVmFsSUQ6OnRfTG9jYWxOYW1lKQorICAgICAgcmV0dXJuIEVycm9yKExhYmVsLkxvYywgImV4cGVjdGVkIGJhc2ljIGJsb2NrIG5hbWUgaW4gYmxvY2thZGRyZXNzIik7CisgICAgCisgICAgLy8gTWFrZSBhIGdsb2JhbCB2YXJpYWJsZSBhcyBhIHBsYWNlaG9sZGVyIGZvciB0aGlzIHJlZmVyZW5jZS4KKyAgICBHbG9iYWxWYXJpYWJsZSAqRndkUmVmID0gbmV3IEdsb2JhbFZhcmlhYmxlKCpNLCBUeXBlOjpnZXRJbnQ4VHkoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAiIik7CisgICAgRm9yd2FyZFJlZkJsb2NrQWRkcmVzc2VzW0ZuXS5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTGFiZWwsIEZ3ZFJlZikpOworICAgIElELkNvbnN0YW50VmFsID0gRndkUmVmOworICAgIElELktpbmQgPSBWYWxJRDo6dF9Db25zdGFudDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgICAgIAorICBjYXNlIGxsdG9rOjprd190cnVuYzoKKyAgY2FzZSBsbHRvazo6a3dfemV4dDoKKyAgY2FzZSBsbHRvazo6a3dfc2V4dDoKKyAgY2FzZSBsbHRvazo6a3dfZnB0cnVuYzoKKyAgY2FzZSBsbHRvazo6a3dfZnBleHQ6CisgIGNhc2UgbGx0b2s6Omt3X2JpdGNhc3Q6CisgIGNhc2UgbGx0b2s6Omt3X3VpdG9mcDoKKyAgY2FzZSBsbHRvazo6a3dfc2l0b2ZwOgorICBjYXNlIGxsdG9rOjprd19mcHRvdWk6CisgIGNhc2UgbGx0b2s6Omt3X2ZwdG9zaToKKyAgY2FzZSBsbHRvazo6a3dfaW50dG9wdHI6CisgIGNhc2UgbGx0b2s6Omt3X3B0cnRvaW50OiB7CisgICAgdW5zaWduZWQgT3BjID0gTGV4LmdldFVJbnRWYWwoKTsKKyAgICBQQVR5cGVIb2xkZXIgRGVzdFR5KFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgICAgQ29uc3RhbnQgKlNyY1ZhbDsKKyAgICBMZXguTGV4KCk7CisgICAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OmxwYXJlbiwgImV4cGVjdGVkICcoJyBhZnRlciBjb25zdGFudGV4cHIgY2FzdCIpIHx8CisgICAgICAgIFBhcnNlR2xvYmFsVHlwZUFuZFZhbHVlKFNyY1ZhbCkgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6a3dfdG8sICJleHBlY3RlZCAndG8nIGluIGNvbnN0YW50ZXhwciBjYXN0IikgfHwKKyAgICAgICAgUGFyc2VUeXBlKERlc3RUeSkgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6cnBhcmVuLCAiZXhwZWN0ZWQgJyknIGF0IGVuZCBvZiBjb25zdGFudGV4cHIgY2FzdCIpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKCFDYXN0SW5zdDo6Y2FzdElzVmFsaWQoKEluc3RydWN0aW9uOjpDYXN0T3BzKU9wYywgU3JjVmFsLCBEZXN0VHkpKQorICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgImludmFsaWQgY2FzdCBvcGNvZGUgZm9yIGNhc3QgZnJvbSAnIiArCisgICAgICAgICAgICAgICAgICAgU3JjVmFsLT5nZXRUeXBlKCktPmdldERlc2NyaXB0aW9uKCkgKyAiJyB0byAnIiArCisgICAgICAgICAgICAgICAgICAgRGVzdFR5LT5nZXREZXNjcmlwdGlvbigpICsgIiciKTsKKyAgICBJRC5Db25zdGFudFZhbCA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdCgoSW5zdHJ1Y3Rpb246OkNhc3RPcHMpT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY1ZhbCwgRGVzdFR5KTsKKyAgICBJRC5LaW5kID0gVmFsSUQ6OnRfQ29uc3RhbnQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNhc2UgbGx0b2s6Omt3X2V4dHJhY3R2YWx1ZTogeworICAgIExleC5MZXgoKTsKKyAgICBDb25zdGFudCAqVmFsOworICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJbmRpY2VzOworICAgIGlmIChQYXJzZVRva2VuKGxsdG9rOjpscGFyZW4sICJleHBlY3RlZCAnKCcgaW4gZXh0cmFjdHZhbHVlIGNvbnN0YW50ZXhwciIpfHwKKyAgICAgICAgUGFyc2VHbG9iYWxUeXBlQW5kVmFsdWUoVmFsKSB8fAorICAgICAgICBQYXJzZUluZGV4TGlzdChJbmRpY2VzKSB8fAorICAgICAgICBQYXJzZVRva2VuKGxsdG9rOjpycGFyZW4sICJleHBlY3RlZCAnKScgaW4gZXh0cmFjdHZhbHVlIGNvbnN0YW50ZXhwciIpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIVZhbC0+Z2V0VHlwZSgpLT5pc0FnZ3JlZ2F0ZVR5cGUoKSkKKyAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJleHRyYWN0dmFsdWUgb3BlcmFuZCBtdXN0IGJlIGFnZ3JlZ2F0ZSB0eXBlIik7CisgICAgaWYgKCFFeHRyYWN0VmFsdWVJbnN0OjpnZXRJbmRleGVkVHlwZShWYWwtPmdldFR5cGUoKSwgSW5kaWNlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcy5lbmQoKSkpCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiaW52YWxpZCBpbmRpY2VzIGZvciBleHRyYWN0dmFsdWUiKTsKKyAgICBJRC5Db25zdGFudFZhbCA9CisgICAgICBDb25zdGFudEV4cHI6OmdldEV4dHJhY3RWYWx1ZShWYWwsIEluZGljZXMuZGF0YSgpLCBJbmRpY2VzLnNpemUoKSk7CisgICAgSUQuS2luZCA9IFZhbElEOjp0X0NvbnN0YW50OworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjYXNlIGxsdG9rOjprd19pbnNlcnR2YWx1ZTogeworICAgIExleC5MZXgoKTsKKyAgICBDb25zdGFudCAqVmFsMCwgKlZhbDE7CisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IEluZGljZXM7CisgICAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OmxwYXJlbiwgImV4cGVjdGVkICcoJyBpbiBpbnNlcnR2YWx1ZSBjb25zdGFudGV4cHIiKXx8CisgICAgICAgIFBhcnNlR2xvYmFsVHlwZUFuZFZhbHVlKFZhbDApIHx8CisgICAgICAgIFBhcnNlVG9rZW4obGx0b2s6OmNvbW1hLCAiZXhwZWN0ZWQgY29tbWEgaW4gaW5zZXJ0dmFsdWUgY29uc3RhbnRleHByIil8fAorICAgICAgICBQYXJzZUdsb2JhbFR5cGVBbmRWYWx1ZShWYWwxKSB8fAorICAgICAgICBQYXJzZUluZGV4TGlzdChJbmRpY2VzKSB8fAorICAgICAgICBQYXJzZVRva2VuKGxsdG9rOjpycGFyZW4sICJleHBlY3RlZCAnKScgaW4gaW5zZXJ0dmFsdWUgY29uc3RhbnRleHByIikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIVZhbDAtPmdldFR5cGUoKS0+aXNBZ2dyZWdhdGVUeXBlKCkpCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiaW5zZXJ0dmFsdWUgb3BlcmFuZCBtdXN0IGJlIGFnZ3JlZ2F0ZSB0eXBlIik7CisgICAgaWYgKCFFeHRyYWN0VmFsdWVJbnN0OjpnZXRJbmRleGVkVHlwZShWYWwwLT5nZXRUeXBlKCksIEluZGljZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGljZXMuZW5kKCkpKQorICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgImludmFsaWQgaW5kaWNlcyBmb3IgaW5zZXJ0dmFsdWUiKTsKKyAgICBJRC5Db25zdGFudFZhbCA9IENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0VmFsdWUoVmFsMCwgVmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcy5kYXRhKCksIEluZGljZXMuc2l6ZSgpKTsKKyAgICBJRC5LaW5kID0gVmFsSUQ6OnRfQ29uc3RhbnQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNhc2UgbGx0b2s6Omt3X2ljbXA6CisgIGNhc2UgbGx0b2s6Omt3X2ZjbXA6IHsKKyAgICB1bnNpZ25lZCBQcmVkVmFsLCBPcGMgPSBMZXguZ2V0VUludFZhbCgpOworICAgIENvbnN0YW50ICpWYWwwLCAqVmFsMTsKKyAgICBMZXguTGV4KCk7CisgICAgaWYgKFBhcnNlQ21wUHJlZGljYXRlKFByZWRWYWwsIE9wYykgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6bHBhcmVuLCAiZXhwZWN0ZWQgJygnIGluIGNvbXBhcmUgY29uc3RhbnRleHByIikgfHwKKyAgICAgICAgUGFyc2VHbG9iYWxUeXBlQW5kVmFsdWUoVmFsMCkgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCBjb21tYSBpbiBjb21wYXJlIGNvbnN0YW50ZXhwciIpIHx8CisgICAgICAgIFBhcnNlR2xvYmFsVHlwZUFuZFZhbHVlKFZhbDEpIHx8CisgICAgICAgIFBhcnNlVG9rZW4obGx0b2s6OnJwYXJlbiwgImV4cGVjdGVkICcpJyBpbiBjb21wYXJlIGNvbnN0YW50ZXhwciIpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoVmFsMC0+Z2V0VHlwZSgpICE9IFZhbDEtPmdldFR5cGUoKSkKKyAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJjb21wYXJlIG9wZXJhbmRzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIik7CisKKyAgICBDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCA9IChDbXBJbnN0OjpQcmVkaWNhdGUpUHJlZFZhbDsKKworICAgIGlmIChPcGMgPT0gSW5zdHJ1Y3Rpb246OkZDbXApIHsKKyAgICAgIGlmICghVmFsMC0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkpCisgICAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJmY21wIHJlcXVpcmVzIGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzIik7CisgICAgICBJRC5Db25zdGFudFZhbCA9IENvbnN0YW50RXhwcjo6Z2V0RkNtcChQcmVkLCBWYWwwLCBWYWwxKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KE9wYyA9PSBJbnN0cnVjdGlvbjo6SUNtcCAmJiAiVW5leHBlY3RlZCBvcGNvZGUgZm9yIENtcEluc3QhIik7CisgICAgICBpZiAoIVZhbDAtPmdldFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAhVmFsMC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiaWNtcCByZXF1aXJlcyBwb2ludGVyIG9yIGludGVnZXIgb3BlcmFuZHMiKTsKKyAgICAgIElELkNvbnN0YW50VmFsID0gQ29uc3RhbnRFeHByOjpnZXRJQ21wKFByZWQsIFZhbDAsIFZhbDEpOworICAgIH0KKyAgICBJRC5LaW5kID0gVmFsSUQ6OnRfQ29uc3RhbnQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQmluYXJ5IE9wZXJhdG9ycy4KKyAgY2FzZSBsbHRvazo6a3dfYWRkOgorICBjYXNlIGxsdG9rOjprd19mYWRkOgorICBjYXNlIGxsdG9rOjprd19zdWI6CisgIGNhc2UgbGx0b2s6Omt3X2ZzdWI6CisgIGNhc2UgbGx0b2s6Omt3X211bDoKKyAgY2FzZSBsbHRvazo6a3dfZm11bDoKKyAgY2FzZSBsbHRvazo6a3dfdWRpdjoKKyAgY2FzZSBsbHRvazo6a3dfc2RpdjoKKyAgY2FzZSBsbHRvazo6a3dfZmRpdjoKKyAgY2FzZSBsbHRvazo6a3dfdXJlbToKKyAgY2FzZSBsbHRvazo6a3dfc3JlbToKKyAgY2FzZSBsbHRvazo6a3dfZnJlbTogeworICAgIGJvb2wgTlVXID0gZmFsc2U7CisgICAgYm9vbCBOU1cgPSBmYWxzZTsKKyAgICBib29sIEV4YWN0ID0gZmFsc2U7CisgICAgdW5zaWduZWQgT3BjID0gTGV4LmdldFVJbnRWYWwoKTsKKyAgICBDb25zdGFudCAqVmFsMCwgKlZhbDE7CisgICAgTGV4LkxleCgpOworICAgIExvY1R5IE1vZGlmaWVyTG9jID0gTGV4LmdldExvYygpOworICAgIGlmIChPcGMgPT0gSW5zdHJ1Y3Rpb246OkFkZCB8fAorICAgICAgICBPcGMgPT0gSW5zdHJ1Y3Rpb246OlN1YiB8fAorICAgICAgICBPcGMgPT0gSW5zdHJ1Y3Rpb246Ok11bCkgeworICAgICAgaWYgKEVhdElmUHJlc2VudChsbHRvazo6a3dfbnV3KSkKKyAgICAgICAgTlVXID0gdHJ1ZTsKKyAgICAgIGlmIChFYXRJZlByZXNlbnQobGx0b2s6Omt3X25zdykpIHsKKyAgICAgICAgTlNXID0gdHJ1ZTsKKyAgICAgICAgaWYgKEVhdElmUHJlc2VudChsbHRvazo6a3dfbnV3KSkKKyAgICAgICAgICBOVVcgPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoT3BjID09IEluc3RydWN0aW9uOjpTRGl2KSB7CisgICAgICBpZiAoRWF0SWZQcmVzZW50KGxsdG9rOjprd19leGFjdCkpCisgICAgICAgIEV4YWN0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OmxwYXJlbiwgImV4cGVjdGVkICcoJyBpbiBiaW5hcnkgY29uc3RhbnRleHByIikgfHwKKyAgICAgICAgUGFyc2VHbG9iYWxUeXBlQW5kVmFsdWUoVmFsMCkgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCBjb21tYSBpbiBiaW5hcnkgY29uc3RhbnRleHByIikgfHwKKyAgICAgICAgUGFyc2VHbG9iYWxUeXBlQW5kVmFsdWUoVmFsMSkgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6cnBhcmVuLCAiZXhwZWN0ZWQgJyknIGluIGJpbmFyeSBjb25zdGFudGV4cHIiKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChWYWwwLT5nZXRUeXBlKCkgIT0gVmFsMS0+Z2V0VHlwZSgpKQorICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgIm9wZXJhbmRzIG9mIGNvbnN0ZXhwciBtdXN0IGhhdmUgc2FtZSB0eXBlIik7CisgICAgaWYgKCFWYWwwLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpKSB7CisgICAgICBpZiAoTlVXKQorICAgICAgICByZXR1cm4gRXJyb3IoTW9kaWZpZXJMb2MsICJudXcgb25seSBhcHBsaWVzIHRvIGludGVnZXIgb3BlcmF0aW9ucyIpOworICAgICAgaWYgKE5TVykKKyAgICAgICAgcmV0dXJuIEVycm9yKE1vZGlmaWVyTG9jLCAibnN3IG9ubHkgYXBwbGllcyB0byBpbnRlZ2VyIG9wZXJhdGlvbnMiKTsKKyAgICB9CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdHlwZSBpcyB2YWxpZCBmb3IgdGhlIG9wZXJhdG9yLgorICAgIHN3aXRjaCAoT3BjKSB7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICAgIGlmICghVmFsMC0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgImNvbnN0ZXhwciByZXF1aXJlcyBpbnRlZ2VyIG9wZXJhbmRzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGQWRkOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZTdWI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6Rk11bDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZSZW06CisgICAgICBpZiAoIVZhbDAtPmdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiY29uc3RleHByIHJlcXVpcmVzIGZwIG9wZXJhbmRzIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGJpbmFyeSBvcGVyYXRvciEiKTsKKyAgICB9CisgICAgdW5zaWduZWQgRmxhZ3MgPSAwOworICAgIGlmIChOVVcpICAgRmxhZ3MgfD0gT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXA7CisgICAgaWYgKE5TVykgICBGbGFncyB8PSBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1NpZ25lZFdyYXA7CisgICAgaWYgKEV4YWN0KSBGbGFncyB8PSBTRGl2T3BlcmF0b3I6OklzRXhhY3Q7CisgICAgQ29uc3RhbnQgKkMgPSBDb25zdGFudEV4cHI6OmdldChPcGMsIFZhbDAsIFZhbDEsIEZsYWdzKTsKKyAgICBJRC5Db25zdGFudFZhbCA9IEM7CisgICAgSUQuS2luZCA9IFZhbElEOjp0X0NvbnN0YW50OworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIExvZ2ljYWwgT3BlcmF0aW9ucworICBjYXNlIGxsdG9rOjprd19zaGw6CisgIGNhc2UgbGx0b2s6Omt3X2xzaHI6CisgIGNhc2UgbGx0b2s6Omt3X2FzaHI6CisgIGNhc2UgbGx0b2s6Omt3X2FuZDoKKyAgY2FzZSBsbHRvazo6a3dfb3I6CisgIGNhc2UgbGx0b2s6Omt3X3hvcjogeworICAgIHVuc2lnbmVkIE9wYyA9IExleC5nZXRVSW50VmFsKCk7CisgICAgQ29uc3RhbnQgKlZhbDAsICpWYWwxOworICAgIExleC5MZXgoKTsKKyAgICBpZiAoUGFyc2VUb2tlbihsbHRvazo6bHBhcmVuLCAiZXhwZWN0ZWQgJygnIGluIGxvZ2ljYWwgY29uc3RhbnRleHByIikgfHwKKyAgICAgICAgUGFyc2VHbG9iYWxUeXBlQW5kVmFsdWUoVmFsMCkgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCBjb21tYSBpbiBsb2dpY2FsIGNvbnN0YW50ZXhwciIpIHx8CisgICAgICAgIFBhcnNlR2xvYmFsVHlwZUFuZFZhbHVlKFZhbDEpIHx8CisgICAgICAgIFBhcnNlVG9rZW4obGx0b2s6OnJwYXJlbiwgImV4cGVjdGVkICcpJyBpbiBsb2dpY2FsIGNvbnN0YW50ZXhwciIpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKFZhbDAtPmdldFR5cGUoKSAhPSBWYWwxLT5nZXRUeXBlKCkpCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAib3BlcmFuZHMgb2YgY29uc3RleHByIG11c3QgaGF2ZSBzYW1lIHR5cGUiKTsKKyAgICBpZiAoIVZhbDAtPmdldFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkpCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLAorICAgICAgICAgICAgICAgICAgICJjb25zdGV4cHIgcmVxdWlyZXMgaW50ZWdlciBvciBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kcyIpOworICAgIElELkNvbnN0YW50VmFsID0gQ29uc3RhbnRFeHByOjpnZXQoT3BjLCBWYWwwLCBWYWwxKTsKKyAgICBJRC5LaW5kID0gVmFsSUQ6OnRfQ29uc3RhbnQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY2FzZSBsbHRvazo6a3dfZ2V0ZWxlbWVudHB0cjoKKyAgY2FzZSBsbHRvazo6a3dfc2h1ZmZsZXZlY3RvcjoKKyAgY2FzZSBsbHRvazo6a3dfaW5zZXJ0ZWxlbWVudDoKKyAgY2FzZSBsbHRvazo6a3dfZXh0cmFjdGVsZW1lbnQ6CisgIGNhc2UgbGx0b2s6Omt3X3NlbGVjdDogeworICAgIHVuc2lnbmVkIE9wYyA9IExleC5nZXRVSW50VmFsKCk7CisgICAgU21hbGxWZWN0b3I8Q29uc3RhbnQqLCAxNj4gRWx0czsKKyAgICBib29sIEluQm91bmRzID0gZmFsc2U7CisgICAgTGV4LkxleCgpOworICAgIGlmIChPcGMgPT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpCisgICAgICBJbkJvdW5kcyA9IEVhdElmUHJlc2VudChsbHRvazo6a3dfaW5ib3VuZHMpOworICAgIGlmIChQYXJzZVRva2VuKGxsdG9rOjpscGFyZW4sICJleHBlY3RlZCAnKCcgaW4gY29uc3RhbnRleHByIikgfHwKKyAgICAgICAgUGFyc2VHbG9iYWxWYWx1ZVZlY3RvcihFbHRzKSB8fAorICAgICAgICBQYXJzZVRva2VuKGxsdG9rOjpycGFyZW4sICJleHBlY3RlZCAnKScgaW4gY29uc3RhbnRleHByIikpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChPcGMgPT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpIHsKKyAgICAgIGlmIChFbHRzLnNpemUoKSA9PSAwIHx8ICFFbHRzWzBdLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJnZXRlbGVtZW50cHRyIHJlcXVpcmVzIHBvaW50ZXIgb3BlcmFuZCIpOworCisgICAgICBpZiAoIUdldEVsZW1lbnRQdHJJbnN0OjpnZXRJbmRleGVkVHlwZShFbHRzWzBdLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVmFsdWUqKikoRWx0cy5kYXRhKCkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsdHMuc2l6ZSgpIC0gMSkpCisgICAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJpbnZhbGlkIGluZGljZXMgZm9yIGdldGVsZW1lbnRwdHIiKTsKKyAgICAgIElELkNvbnN0YW50VmFsID0gSW5Cb3VuZHMgPworICAgICAgICBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihFbHRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbHRzLmRhdGEoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsdHMuc2l6ZSgpIC0gMSkgOgorICAgICAgICBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoRWx0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsdHMuZGF0YSgpICsgMSwgRWx0cy5zaXplKCkgLSAxKTsKKyAgICB9IGVsc2UgaWYgKE9wYyA9PSBJbnN0cnVjdGlvbjo6U2VsZWN0KSB7CisgICAgICBpZiAoRWx0cy5zaXplKCkgIT0gMykKKyAgICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgImV4cGVjdGVkIHRocmVlIG9wZXJhbmRzIHRvIHNlbGVjdCIpOworICAgICAgaWYgKGNvbnN0IGNoYXIgKlJlYXNvbiA9IFNlbGVjdEluc3Q6OmFyZUludmFsaWRPcGVyYW5kcyhFbHRzWzBdLCBFbHRzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbHRzWzJdKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgUmVhc29uKTsKKyAgICAgIElELkNvbnN0YW50VmFsID0gQ29uc3RhbnRFeHByOjpnZXRTZWxlY3QoRWx0c1swXSwgRWx0c1sxXSwgRWx0c1syXSk7CisgICAgfSBlbHNlIGlmIChPcGMgPT0gSW5zdHJ1Y3Rpb246OlNodWZmbGVWZWN0b3IpIHsKKyAgICAgIGlmIChFbHRzLnNpemUoKSAhPSAzKQorICAgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiZXhwZWN0ZWQgdGhyZWUgb3BlcmFuZHMgdG8gc2h1ZmZsZXZlY3RvciIpOworICAgICAgaWYgKCFTaHVmZmxlVmVjdG9ySW5zdDo6aXNWYWxpZE9wZXJhbmRzKEVsdHNbMF0sIEVsdHNbMV0sIEVsdHNbMl0pKQorICAgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiaW52YWxpZCBvcGVyYW5kcyB0byBzaHVmZmxldmVjdG9yIik7CisgICAgICBJRC5Db25zdGFudFZhbCA9CisgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0U2h1ZmZsZVZlY3RvcihFbHRzWzBdLCBFbHRzWzFdLEVsdHNbMl0pOworICAgIH0gZWxzZSBpZiAoT3BjID09IEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudCkgeworICAgICAgaWYgKEVsdHMuc2l6ZSgpICE9IDIpCisgICAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJleHBlY3RlZCB0d28gb3BlcmFuZHMgdG8gZXh0cmFjdGVsZW1lbnQiKTsKKyAgICAgIGlmICghRXh0cmFjdEVsZW1lbnRJbnN0Ojppc1ZhbGlkT3BlcmFuZHMoRWx0c1swXSwgRWx0c1sxXSkpCisgICAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJpbnZhbGlkIGV4dHJhY3RlbGVtZW50IG9wZXJhbmRzIik7CisgICAgICBJRC5Db25zdGFudFZhbCA9IENvbnN0YW50RXhwcjo6Z2V0RXh0cmFjdEVsZW1lbnQoRWx0c1swXSwgRWx0c1sxXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChPcGMgPT0gSW5zdHJ1Y3Rpb246Okluc2VydEVsZW1lbnQgJiYgIlVua25vd24gb3Bjb2RlIik7CisgICAgICBpZiAoRWx0cy5zaXplKCkgIT0gMykKKyAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJleHBlY3RlZCB0aHJlZSBvcGVyYW5kcyB0byBpbnNlcnRlbGVtZW50Iik7CisgICAgICBpZiAoIUluc2VydEVsZW1lbnRJbnN0Ojppc1ZhbGlkT3BlcmFuZHMoRWx0c1swXSwgRWx0c1sxXSwgRWx0c1syXSkpCisgICAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJpbnZhbGlkIGluc2VydGVsZW1lbnQgb3BlcmFuZHMiKTsKKyAgICAgIElELkNvbnN0YW50VmFsID0KKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRJbnNlcnRFbGVtZW50KEVsdHNbMF0sIEVsdHNbMV0sRWx0c1syXSk7CisgICAgfQorCisgICAgSUQuS2luZCA9IFZhbElEOjp0X0NvbnN0YW50OworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB9CisKKyAgTGV4LkxleCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZUdsb2JhbFZhbHVlIC0gUGFyc2UgYSBnbG9iYWwgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUuCitib29sIExMUGFyc2VyOjpQYXJzZUdsb2JhbFZhbHVlKGNvbnN0IFR5cGUgKlR5LCBDb25zdGFudCAqJkMpIHsKKyAgQyA9IDA7CisgIFZhbElEIElEOworICBWYWx1ZSAqViA9IE5VTEw7CisgIGJvb2wgUGFyc2VkID0gUGFyc2VWYWxJRChJRCkgfHwKKyAgICAgICAgICAgICAgICBDb252ZXJ0VmFsSURUb1ZhbHVlKFR5LCBJRCwgViwgTlVMTCk7CisgIGlmIChWICYmICEoQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkpCisgICAgcmV0dXJuIEVycm9yKElELkxvYywgImdsb2JhbCB2YWx1ZXMgbXVzdCBiZSBjb25zdGFudHMiKTsKKyAgcmV0dXJuIFBhcnNlZDsKK30KKworYm9vbCBMTFBhcnNlcjo6UGFyc2VHbG9iYWxUeXBlQW5kVmFsdWUoQ29uc3RhbnQgKiZWKSB7CisgIFBBVHlwZUhvbGRlciBUeXBlKFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgIHJldHVybiBQYXJzZVR5cGUoVHlwZSkgfHwKKyAgICAgICAgIFBhcnNlR2xvYmFsVmFsdWUoVHlwZSwgVik7Cit9CisKKy8vLyBQYXJzZUdsb2JhbFZhbHVlVmVjdG9yCisvLy8gICA6Oj0gLyplbXB0eSovCisvLy8gICA6Oj0gVHlwZUFuZFZhbHVlICgnLCcgVHlwZUFuZFZhbHVlKSoKK2Jvb2wgTExQYXJzZXI6OlBhcnNlR2xvYmFsVmFsdWVWZWN0b3IoU21hbGxWZWN0b3JJbXBsPENvbnN0YW50Kj4gJkVsdHMpIHsKKyAgLy8gRW1wdHkgbGlzdC4KKyAgaWYgKExleC5nZXRLaW5kKCkgPT0gbGx0b2s6OnJicmFjZSB8fAorICAgICAgTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6cnNxdWFyZSB8fAorICAgICAgTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6Z3JlYXRlciB8fAorICAgICAgTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6cnBhcmVuKQorICAgIHJldHVybiBmYWxzZTsKKworICBDb25zdGFudCAqQzsKKyAgaWYgKFBhcnNlR2xvYmFsVHlwZUFuZFZhbHVlKEMpKSByZXR1cm4gdHJ1ZTsKKyAgRWx0cy5wdXNoX2JhY2soQyk7CisKKyAgd2hpbGUgKEVhdElmUHJlc2VudChsbHRvazo6Y29tbWEpKSB7CisgICAgaWYgKFBhcnNlR2xvYmFsVHlwZUFuZFZhbHVlKEMpKSByZXR1cm4gdHJ1ZTsKKyAgICBFbHRzLnB1c2hfYmFjayhDKTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlTWV0YWRhdGFWYWx1ZQorLy8vICA6Oj0gITQyCisvLy8gIDo6PSAhey4uLn0KKy8vLyAgOjo9ICEic3RyaW5nIgorYm9vbCBMTFBhcnNlcjo6UGFyc2VNZXRhZGF0YVZhbHVlKFZhbElEICZJRCwgUGVyRnVuY3Rpb25TdGF0ZSAqUEZTKSB7CisgIGFzc2VydChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpleGNsYWltKTsKKyAgTGV4LkxleCgpOworCisgIC8vIE1ETm9kZToKKyAgLy8gIXsgLi4uIH0KKyAgaWYgKEVhdElmUHJlc2VudChsbHRvazo6bGJyYWNlKSkgeworICAgIFNtYWxsVmVjdG9yPFZhbHVlKiwgMTY+IEVsdHM7CisgICAgaWYgKFBhcnNlTUROb2RlVmVjdG9yKEVsdHMsIFBGUykgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6cmJyYWNlLCAiZXhwZWN0ZWQgZW5kIG9mIG1ldGFkYXRhIG5vZGUiKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgSUQuTUROb2RlVmFsID0gTUROb2RlOjpnZXQoQ29udGV4dCwgRWx0cy5kYXRhKCksIEVsdHMuc2l6ZSgpKTsKKyAgICBJRC5LaW5kID0gVmFsSUQ6OnRfTUROb2RlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFN0YW5kYWxvbmUgbWV0YWRhdGEgcmVmZXJlbmNlCisgIC8vICE0MgorICBpZiAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6QVBTSW50KSB7CisgICAgaWYgKFBhcnNlTUROb2RlSUQoSUQuTUROb2RlVmFsKSkgcmV0dXJuIHRydWU7CisgICAgSUQuS2luZCA9IFZhbElEOjp0X01ETm9kZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBNRFN0cmluZzoKKyAgLy8gICA6Oj0gJyEnIFNUUklOR0NPTlNUQU5UCisgIGlmIChQYXJzZU1EU3RyaW5nKElELk1EU3RyaW5nVmFsKSkgcmV0dXJuIHRydWU7CisgIElELktpbmQgPSBWYWxJRDo6dF9NRFN0cmluZzsKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGdW5jdGlvbiBQYXJzaW5nLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworYm9vbCBMTFBhcnNlcjo6Q29udmVydFZhbElEVG9WYWx1ZShjb25zdCBUeXBlICpUeSwgVmFsSUQgJklELCBWYWx1ZSAqJlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlckZ1bmN0aW9uU3RhdGUgKlBGUykgeworICBpZiAoVHktPmlzRnVuY3Rpb25UeSgpKQorICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJmdW5jdGlvbnMgYXJlIG5vdCB2YWx1ZXMsIHJlZmVyIHRvIHRoZW0gYXMgcG9pbnRlcnMiKTsKKworICBzd2l0Y2ggKElELktpbmQpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBWYWxJRCEiKTsKKyAgY2FzZSBWYWxJRDo6dF9Mb2NhbElEOgorICAgIGlmICghUEZTKSByZXR1cm4gRXJyb3IoSUQuTG9jLCAiaW52YWxpZCB1c2Ugb2YgZnVuY3Rpb24tbG9jYWwgbmFtZSIpOworICAgIFYgPSBQRlMtPkdldFZhbChJRC5VSW50VmFsLCBUeSwgSUQuTG9jKTsKKyAgICByZXR1cm4gKFYgPT0gMCk7CisgIGNhc2UgVmFsSUQ6OnRfTG9jYWxOYW1lOgorICAgIGlmICghUEZTKSByZXR1cm4gRXJyb3IoSUQuTG9jLCAiaW52YWxpZCB1c2Ugb2YgZnVuY3Rpb24tbG9jYWwgbmFtZSIpOworICAgIFYgPSBQRlMtPkdldFZhbChJRC5TdHJWYWwsIFR5LCBJRC5Mb2MpOworICAgIHJldHVybiAoViA9PSAwKTsKKyAgY2FzZSBWYWxJRDo6dF9JbmxpbmVBc206IHsKKyAgICBjb25zdCBQb2ludGVyVHlwZSAqUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFR5KTsKKyAgICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IAorICAgICAgUFR5ID8gZHluX2Nhc3Q8RnVuY3Rpb25UeXBlPihQVHktPmdldEVsZW1lbnRUeXBlKCkpIDogMDsKKyAgICBpZiAoIUZUeSB8fCAhSW5saW5lQXNtOjpWZXJpZnkoRlR5LCBJRC5TdHJWYWwyKSkKKyAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJpbnZhbGlkIHR5cGUgZm9yIGlubGluZSBhc20gY29uc3RyYWludCBzdHJpbmciKTsKKyAgICBWID0gSW5saW5lQXNtOjpnZXQoRlR5LCBJRC5TdHJWYWwsIElELlN0clZhbDIsIElELlVJbnRWYWwmMSwgSUQuVUludFZhbD4+MSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNhc2UgVmFsSUQ6OnRfTUROb2RlOgorICAgIGlmICghVHktPmlzTWV0YWRhdGFUeSgpKQorICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgIm1ldGFkYXRhIHZhbHVlIG11c3QgaGF2ZSBtZXRhZGF0YSB0eXBlIik7CisgICAgViA9IElELk1ETm9kZVZhbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgVmFsSUQ6OnRfTURTdHJpbmc6CisgICAgaWYgKCFUeS0+aXNNZXRhZGF0YVR5KCkpCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAibWV0YWRhdGEgdmFsdWUgbXVzdCBoYXZlIG1ldGFkYXRhIHR5cGUiKTsKKyAgICBWID0gSUQuTURTdHJpbmdWYWw7CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIFZhbElEOjp0X0dsb2JhbE5hbWU6CisgICAgViA9IEdldEdsb2JhbFZhbChJRC5TdHJWYWwsIFR5LCBJRC5Mb2MpOworICAgIHJldHVybiBWID09IDA7CisgIGNhc2UgVmFsSUQ6OnRfR2xvYmFsSUQ6CisgICAgViA9IEdldEdsb2JhbFZhbChJRC5VSW50VmFsLCBUeSwgSUQuTG9jKTsKKyAgICByZXR1cm4gViA9PSAwOworICBjYXNlIFZhbElEOjp0X0FQU0ludDoKKyAgICBpZiAoIVR5LT5pc0ludGVnZXJUeSgpKQorICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgImludGVnZXIgY29uc3RhbnQgbXVzdCBoYXZlIGludGVnZXIgdHlwZSIpOworICAgIElELkFQU0ludFZhbC5leHRPclRydW5jKFR5LT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpOworICAgIFYgPSBDb25zdGFudEludDo6Z2V0KENvbnRleHQsIElELkFQU0ludFZhbCk7CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIFZhbElEOjp0X0FQRmxvYXQ6CisgICAgaWYgKCFUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSB8fAorICAgICAgICAhQ29uc3RhbnRGUDo6aXNWYWx1ZVZhbGlkRm9yVHlwZShUeSwgSUQuQVBGbG9hdFZhbCkpCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW52YWxpZCBmb3IgdHlwZSIpOworCisgICAgLy8gVGhlIGxleGVyIGhhcyBubyB0eXBlIGluZm8sIHNvIGJ1aWxkcyBhbGwgZmxvYXQgYW5kIGRvdWJsZSBGUCBjb25zdGFudHMKKyAgICAvLyBhcyBkb3VibGUuICBGaXggdGhpcyBoZXJlLiAgTG9uZyBkb3VibGUgZG9lcyBub3QgbmVlZCB0aGlzLgorICAgIGlmICgmSUQuQVBGbG9hdFZhbC5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6SUVFRWRvdWJsZSAmJgorICAgICAgICBUeS0+aXNGbG9hdFR5KCkpIHsKKyAgICAgIGJvb2wgSWdub3JlZDsKKyAgICAgIElELkFQRmxvYXRWYWwuY29udmVydChBUEZsb2F0OjpJRUVFc2luZ2xlLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJZ25vcmVkKTsKKyAgICB9CisgICAgViA9IENvbnN0YW50RlA6OmdldChDb250ZXh0LCBJRC5BUEZsb2F0VmFsKTsKKworICAgIGlmIChWLT5nZXRUeXBlKCkgIT0gVHkpCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgZG9lcyBub3QgaGF2ZSB0eXBlICciICsKKyAgICAgICAgICAgICAgICAgICBUeS0+Z2V0RGVzY3JpcHRpb24oKSArICInIik7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgVmFsSUQ6OnRfTnVsbDoKKyAgICBpZiAoIVR5LT5pc1BvaW50ZXJUeSgpKQorICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgIm51bGwgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSIpOworICAgIFYgPSBDb25zdGFudFBvaW50ZXJOdWxsOjpnZXQoY2FzdDxQb2ludGVyVHlwZT4oVHkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgVmFsSUQ6OnRfVW5kZWY6CisgICAgLy8gRklYTUU6IExhYmVsVHkgc2hvdWxkIG5vdCBiZSBhIGZpcnN0LWNsYXNzIHR5cGUuCisgICAgaWYgKCghVHktPmlzRmlyc3RDbGFzc1R5cGUoKSB8fCBUeS0+aXNMYWJlbFR5KCkpICYmCisgICAgICAgICFUeS0+aXNPcGFxdWVUeSgpKQorICAgICAgcmV0dXJuIEVycm9yKElELkxvYywgImludmFsaWQgdHlwZSBmb3IgdW5kZWYgY29uc3RhbnQiKTsKKyAgICBWID0gVW5kZWZWYWx1ZTo6Z2V0KFR5KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgVmFsSUQ6OnRfRW1wdHlBcnJheToKKyAgICBpZiAoIVR5LT5pc0FycmF5VHkoKSB8fCBjYXN0PEFycmF5VHlwZT4oVHkpLT5nZXROdW1FbGVtZW50cygpICE9IDApCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiaW52YWxpZCBlbXB0eSBhcnJheSBpbml0aWFsaXplciIpOworICAgIFYgPSBVbmRlZlZhbHVlOjpnZXQoVHkpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBWYWxJRDo6dF9aZXJvOgorICAgIC8vIEZJWE1FOiBMYWJlbFR5IHNob3VsZCBub3QgYmUgYSBmaXJzdC1jbGFzcyB0eXBlLgorICAgIGlmICghVHktPmlzRmlyc3RDbGFzc1R5cGUoKSB8fCBUeS0+aXNMYWJlbFR5KCkpCisgICAgICByZXR1cm4gRXJyb3IoSUQuTG9jLCAiaW52YWxpZCB0eXBlIGZvciBudWxsIGNvbnN0YW50Iik7CisgICAgViA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBWYWxJRDo6dF9Db25zdGFudDoKKyAgICBpZiAoSUQuQ29uc3RhbnRWYWwtPmdldFR5cGUoKSAhPSBUeSkgeworICAgICAgLy8gQWxsb3cgYSBjb25zdGFudCBzdHJ1Y3Qgd2l0aCBhIHNpbmdsZSBtZW1iZXIgdG8gYmUgY29udmVydGVkCisgICAgICAvLyB0byBhIHVuaW9uLCBpZiB0aGUgdW5pb24gaGFzIGEgbWVtYmVyIHdoaWNoIGlzIHRoZSBzYW1lIHR5cGUKKyAgICAgIC8vIGFzIHRoZSBzdHJ1Y3QgbWVtYmVyLgorICAgICAgaWYgKGNvbnN0IFVuaW9uVHlwZSogdXR5cGUgPSBkeW5fY2FzdDxVbmlvblR5cGU+KFR5KSkgeworICAgICAgICByZXR1cm4gUGFyc2VVbmlvblZhbHVlKHV0eXBlLCBJRCwgVik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJjb25zdGFudCBleHByZXNzaW9uIHR5cGUgbWlzbWF0Y2giKTsKKyAgICB9CisKKyAgICBWID0gSUQuQ29uc3RhbnRWYWw7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgTExQYXJzZXI6OlBhcnNlVmFsdWUoY29uc3QgVHlwZSAqVHksIFZhbHVlIComViwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIFYgPSAwOworICBWYWxJRCBJRDsKKyAgcmV0dXJuIFBhcnNlVmFsSUQoSUQsICZQRlMpIHx8CisgICAgICAgICBDb252ZXJ0VmFsSURUb1ZhbHVlKFR5LCBJRCwgViwgJlBGUyk7Cit9CisKK2Jvb2wgTExQYXJzZXI6OlBhcnNlVHlwZUFuZFZhbHVlKFZhbHVlIComViwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIFBBVHlwZUhvbGRlciBUKFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgIHJldHVybiBQYXJzZVR5cGUoVCkgfHwKKyAgICAgICAgIFBhcnNlVmFsdWUoVCwgViwgUEZTKTsKK30KKworYm9vbCBMTFBhcnNlcjo6UGFyc2VUeXBlQW5kQmFzaWNCbG9jayhCYXNpY0Jsb2NrIComQkIsIExvY1R5ICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlckZ1bmN0aW9uU3RhdGUgJlBGUykgeworICBWYWx1ZSAqVjsKKyAgTG9jID0gTGV4LmdldExvYygpOworICBpZiAoUGFyc2VUeXBlQW5kVmFsdWUoViwgUEZTKSkgcmV0dXJuIHRydWU7CisgIGlmICghaXNhPEJhc2ljQmxvY2s+KFYpKQorICAgIHJldHVybiBFcnJvcihMb2MsICJleHBlY3RlZCBhIGJhc2ljIGJsb2NrIik7CisgIEJCID0gY2FzdDxCYXNpY0Jsb2NrPihWKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIExMUGFyc2VyOjpQYXJzZVVuaW9uVmFsdWUoY29uc3QgVW5pb25UeXBlKiB1dHlwZSwgVmFsSUQgJklELCBWYWx1ZSAqJlYpIHsKKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUqIHN0eXBlID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oSUQuQ29uc3RhbnRWYWwtPmdldFR5cGUoKSkpIHsKKyAgICBpZiAoc3R5cGUtPmdldE51bUNvbnRhaW5lZFR5cGVzKCkgIT0gMSkKKyAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJjb25zdGFudCBleHByZXNzaW9uIHR5cGUgbWlzbWF0Y2giKTsKKyAgICBpbnQgaW5kZXggPSB1dHlwZS0+Z2V0RWxlbWVudFR5cGVJbmRleChzdHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgIHJldHVybiBFcnJvcihJRC5Mb2MsICJpbml0aWFsaXplciB0eXBlIGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgdW5pb24iKTsKKworICAgIFYgPSBDb25zdGFudFVuaW9uOjpnZXQoCisgICAgICAgIHV0eXBlLCBjYXN0PENvbnN0YW50PihJRC5Db25zdGFudFZhbC0+Z2V0T3BlcmFuZCgwKSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBFcnJvcihJRC5Mb2MsICJjb25zdGFudCBleHByZXNzaW9uIHR5cGUgbWlzbWF0Y2giKTsKK30KKworCisvLy8gRnVuY3Rpb25IZWFkZXIKKy8vLyAgIDo6PSBPcHRpb25hbExpbmthZ2UgT3B0aW9uYWxWaXNpYmlsaXR5IE9wdGlvbmFsQ2FsbGluZ0NvbnYgT3B0UmV0QXR0cnMKKy8vLyAgICAgICBUeXBlIEdsb2JhbE5hbWUgJygnIEFyZ0xpc3QgJyknIE9wdEZ1bmNBdHRycyBPcHRTZWN0aW9uCisvLy8gICAgICAgT3B0aW9uYWxBbGlnbiBPcHRHQworYm9vbCBMTFBhcnNlcjo6UGFyc2VGdW5jdGlvbkhlYWRlcihGdW5jdGlvbiAqJkZuLCBib29sIGlzRGVmaW5lKSB7CisgIC8vIFBhcnNlIHRoZSBsaW5rYWdlLgorICBMb2NUeSBMaW5rYWdlTG9jID0gTGV4LmdldExvYygpOworICB1bnNpZ25lZCBMaW5rYWdlOworCisgIHVuc2lnbmVkIFZpc2liaWxpdHksIFJldEF0dHJzOworICBDYWxsaW5nQ29udjo6SUQgQ0M7CisgIFBBVHlwZUhvbGRlciBSZXRUeXBlKFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgIExvY1R5IFJldFR5cGVMb2MgPSBMZXguZ2V0TG9jKCk7CisgIGlmIChQYXJzZU9wdGlvbmFsTGlua2FnZShMaW5rYWdlKSB8fAorICAgICAgUGFyc2VPcHRpb25hbFZpc2liaWxpdHkoVmlzaWJpbGl0eSkgfHwKKyAgICAgIFBhcnNlT3B0aW9uYWxDYWxsaW5nQ29udihDQykgfHwKKyAgICAgIFBhcnNlT3B0aW9uYWxBdHRycyhSZXRBdHRycywgMSkgfHwKKyAgICAgIFBhcnNlVHlwZShSZXRUeXBlLCBSZXRUeXBlTG9jLCB0cnVlIC8qdm9pZCBhbGxvd2VkKi8pKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFZlcmlmeSB0aGF0IHRoZSBsaW5rYWdlIGlzIG9rLgorICBzd2l0Y2ggKChHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzKUxpbmthZ2UpIHsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlOgorICAgIGJyZWFrOyAvLyBhbHdheXMgb2suCisgIGNhc2UgR2xvYmFsVmFsdWU6OkRMTEltcG9ydExpbmthZ2U6CisgIGNhc2UgR2xvYmFsVmFsdWU6OkV4dGVybmFsV2Vha0xpbmthZ2U6CisgICAgaWYgKGlzRGVmaW5lKQorICAgICAgcmV0dXJuIEVycm9yKExpbmthZ2VMb2MsICJpbnZhbGlkIGxpbmthZ2UgZm9yIGZ1bmN0aW9uIGRlZmluaXRpb24iKTsKKyAgICBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2U6CisgIGNhc2UgR2xvYmFsVmFsdWU6OkxpbmtlclByaXZhdGVMaW5rYWdlOgorICBjYXNlIEdsb2JhbFZhbHVlOjpMaW5rZXJQcml2YXRlV2Vha0xpbmthZ2U6CisgIGNhc2UgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZToKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6QXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2U6CisgIGNhc2UgR2xvYmFsVmFsdWU6OkxpbmtPbmNlQW55TGlua2FnZToKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua09uY2VPRFJMaW5rYWdlOgorICBjYXNlIEdsb2JhbFZhbHVlOjpXZWFrQW55TGlua2FnZToKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6V2Vha09EUkxpbmthZ2U6CisgIGNhc2UgR2xvYmFsVmFsdWU6OkRMTEV4cG9ydExpbmthZ2U6CisgICAgaWYgKCFpc0RlZmluZSkKKyAgICAgIHJldHVybiBFcnJvcihMaW5rYWdlTG9jLCAiaW52YWxpZCBsaW5rYWdlIGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvbiIpOworICAgIGJyZWFrOworICBjYXNlIEdsb2JhbFZhbHVlOjpBcHBlbmRpbmdMaW5rYWdlOgorICBjYXNlIEdsb2JhbFZhbHVlOjpDb21tb25MaW5rYWdlOgorICAgIHJldHVybiBFcnJvcihMaW5rYWdlTG9jLCAiaW52YWxpZCBmdW5jdGlvbiBsaW5rYWdlIHR5cGUiKTsKKyAgfQorCisgIGlmICghRnVuY3Rpb25UeXBlOjppc1ZhbGlkUmV0dXJuVHlwZShSZXRUeXBlKSB8fAorICAgICAgUmV0VHlwZS0+aXNPcGFxdWVUeSgpKQorICAgIHJldHVybiBFcnJvcihSZXRUeXBlTG9jLCAiaW52YWxpZCBmdW5jdGlvbiByZXR1cm4gdHlwZSIpOworCisgIExvY1R5IE5hbWVMb2MgPSBMZXguZ2V0TG9jKCk7CisKKyAgc3RkOjpzdHJpbmcgRnVuY3Rpb25OYW1lOworICBpZiAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6R2xvYmFsVmFyKSB7CisgICAgRnVuY3Rpb25OYW1lID0gTGV4LmdldFN0clZhbCgpOworICB9IGVsc2UgaWYgKExleC5nZXRLaW5kKCkgPT0gbGx0b2s6Okdsb2JhbElEKSB7ICAgICAvLyBANDIgaXMgb2suCisgICAgdW5zaWduZWQgTmFtZUlEID0gTGV4LmdldFVJbnRWYWwoKTsKKworICAgIGlmIChOYW1lSUQgIT0gTnVtYmVyZWRWYWxzLnNpemUoKSkKKyAgICAgIHJldHVybiBUb2tFcnJvcigiZnVuY3Rpb24gZXhwZWN0ZWQgdG8gYmUgbnVtYmVyZWQgJyUiICsKKyAgICAgICAgICAgICAgICAgICAgICB1dG9zdHIoTnVtYmVyZWRWYWxzLnNpemUoKSkgKyAiJyIpOworICB9IGVsc2UgeworICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgZnVuY3Rpb24gbmFtZSIpOworICB9CisKKyAgTGV4LkxleCgpOworCisgIGlmIChMZXguZ2V0S2luZCgpICE9IGxsdG9rOjpscGFyZW4pCisgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCAnKCcgaW4gZnVuY3Rpb24gYXJndW1lbnQgbGlzdCIpOworCisgIHN0ZDo6dmVjdG9yPEFyZ0luZm8+IEFyZ0xpc3Q7CisgIGJvb2wgaXNWYXJBcmc7CisgIHVuc2lnbmVkIEZ1bmNBdHRyczsKKyAgc3RkOjpzdHJpbmcgU2VjdGlvbjsKKyAgdW5zaWduZWQgQWxpZ25tZW50OworICBzdGQ6OnN0cmluZyBHQzsKKworICBpZiAoUGFyc2VBcmd1bWVudExpc3QoQXJnTGlzdCwgaXNWYXJBcmcsIGZhbHNlKSB8fAorICAgICAgUGFyc2VPcHRpb25hbEF0dHJzKEZ1bmNBdHRycywgMikgfHwKKyAgICAgIChFYXRJZlByZXNlbnQobGx0b2s6Omt3X3NlY3Rpb24pICYmCisgICAgICAgUGFyc2VTdHJpbmdDb25zdGFudChTZWN0aW9uKSkgfHwKKyAgICAgIFBhcnNlT3B0aW9uYWxBbGlnbm1lbnQoQWxpZ25tZW50KSB8fAorICAgICAgKEVhdElmUHJlc2VudChsbHRvazo6a3dfZ2MpICYmCisgICAgICAgUGFyc2VTdHJpbmdDb25zdGFudChHQykpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIElmIHRoZSBhbGlnbm1lbnQgd2FzIHBhcnNlZCBhcyBhbiBhdHRyaWJ1dGUsIG1vdmUgdG8gdGhlIGFsaWdubWVudCBmaWVsZC4KKyAgaWYgKEZ1bmNBdHRycyAmIEF0dHJpYnV0ZTo6QWxpZ25tZW50KSB7CisgICAgQWxpZ25tZW50ID0gQXR0cmlidXRlOjpnZXRBbGlnbm1lbnRGcm9tQXR0cnMoRnVuY0F0dHJzKTsKKyAgICBGdW5jQXR0cnMgJj0gfkF0dHJpYnV0ZTo6QWxpZ25tZW50OworICB9CisKKyAgLy8gT2theSwgaWYgd2UgZ290IGhlcmUsIHRoZSBmdW5jdGlvbiBpcyBzeW50YWN0aWNhbGx5IHZhbGlkLiAgQ29udmVydCB0eXBlcworICAvLyBhbmQgZG8gc2VtYW50aWMgY2hlY2tzLgorICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gUGFyYW1UeXBlTGlzdDsKKyAgU21hbGxWZWN0b3I8QXR0cmlidXRlV2l0aEluZGV4LCA4PiBBdHRyczsKKyAgLy8gRklYTUUgOiBJbiAzLjAsIHN0b3AgYWNjZXB0aW5nIHpleHQsIHNleHQgYW5kIGlucmVnIGFzIG9wdGlvbmFsIGZ1bmN0aW9uCisgIC8vIGF0dHJpYnV0ZXMuCisgIHVuc2lnbmVkIE9ic29sZXRlRnVuY0F0dHJzID0gQXR0cmlidXRlOjpaRXh0fEF0dHJpYnV0ZTo6U0V4dHxBdHRyaWJ1dGU6OkluUmVnOworICBpZiAoRnVuY0F0dHJzICYgT2Jzb2xldGVGdW5jQXR0cnMpIHsKKyAgICBSZXRBdHRycyB8PSBGdW5jQXR0cnMgJiBPYnNvbGV0ZUZ1bmNBdHRyczsKKyAgICBGdW5jQXR0cnMgJj0gfk9ic29sZXRlRnVuY0F0dHJzOworICB9CisKKyAgaWYgKFJldEF0dHJzICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICBBdHRycy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoMCwgUmV0QXR0cnMpKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgUGFyYW1UeXBlTGlzdC5wdXNoX2JhY2soQXJnTGlzdFtpXS5UeXBlKTsKKyAgICBpZiAoQXJnTGlzdFtpXS5BdHRycyAhPSBBdHRyaWJ1dGU6Ok5vbmUpCisgICAgICBBdHRycy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoaSsxLCBBcmdMaXN0W2ldLkF0dHJzKSk7CisgIH0KKworICBpZiAoRnVuY0F0dHJzICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICBBdHRycy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQofjAsIEZ1bmNBdHRycykpOworCisgIEF0dHJMaXN0UHRyIFBBTCA9IEF0dHJMaXN0UHRyOjpnZXQoQXR0cnMuYmVnaW4oKSwgQXR0cnMuZW5kKCkpOworCisgIGlmIChQQUwucGFyYW1IYXNBdHRyKDEsIEF0dHJpYnV0ZTo6U3RydWN0UmV0KSAmJiAhUmV0VHlwZS0+aXNWb2lkVHkoKSkKKyAgICByZXR1cm4gRXJyb3IoUmV0VHlwZUxvYywgImZ1bmN0aW9ucyB3aXRoICdzcmV0JyBhcmd1bWVudCBtdXN0IHJldHVybiB2b2lkIik7CisKKyAgY29uc3QgRnVuY3Rpb25UeXBlICpGVCA9CisgICAgRnVuY3Rpb25UeXBlOjpnZXQoUmV0VHlwZSwgUGFyYW1UeXBlTGlzdCwgaXNWYXJBcmcpOworICBjb25zdCBQb2ludGVyVHlwZSAqUEZUID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChGVCk7CisKKyAgRm4gPSAwOworICBpZiAoIUZ1bmN0aW9uTmFtZS5lbXB0eSgpKSB7CisgICAgLy8gSWYgdGhpcyB3YXMgYSBkZWZpbml0aW9uIG9mIGEgZm9yd2FyZCByZWZlcmVuY2UsIHJlbW92ZSB0aGUgZGVmaW5pdGlvbgorICAgIC8vIGZyb20gdGhlIGZvcndhcmQgcmVmZXJlbmNlIHRhYmxlIGFuZCBmaWxsIGluIHRoZSBmb3J3YXJkIHJlZi4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpwYWlyPEdsb2JhbFZhbHVlKiwgTG9jVHk+ID46Oml0ZXJhdG9yIEZSVkkgPQorICAgICAgRm9yd2FyZFJlZlZhbHMuZmluZChGdW5jdGlvbk5hbWUpOworICAgIGlmIChGUlZJICE9IEZvcndhcmRSZWZWYWxzLmVuZCgpKSB7CisgICAgICBGbiA9IE0tPmdldEZ1bmN0aW9uKEZ1bmN0aW9uTmFtZSk7CisgICAgICBpZiAoRm4tPmdldFR5cGUoKSAhPSBQRlQpCisgICAgICAgIHJldHVybiBFcnJvcihGUlZJLT5zZWNvbmQuc2Vjb25kLCAiaW52YWxpZCBmb3J3YXJkIHJlZmVyZW5jZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gJyIgKyBGdW5jdGlvbk5hbWUgKyAiJyB3aXRoIHdyb25nIHR5cGUhIik7CisgICAgICAKKyAgICAgIEZvcndhcmRSZWZWYWxzLmVyYXNlKEZSVkkpOworICAgIH0gZWxzZSBpZiAoKEZuID0gTS0+Z2V0RnVuY3Rpb24oRnVuY3Rpb25OYW1lKSkpIHsKKyAgICAgIC8vIElmIHRoaXMgZnVuY3Rpb24gYWxyZWFkeSBleGlzdHMgaW4gdGhlIHN5bWJvbCB0YWJsZSwgdGhlbiBpdCBpcworICAgICAgLy8gbXVsdGlwbHkgZGVmaW5lZC4gIFdlIGFjY2VwdCBhIGZldyBjYXNlcyBmb3Igb2xkIGJhY2t3YXJkcyBjb21wYXQuCisgICAgICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMgc3R1ZmYgZm9yIExMVk0gMy4wLgorICAgICAgaWYgKEZuLT5nZXRUeXBlKCkgIT0gUEZUIHx8IEZuLT5nZXRBdHRyaWJ1dGVzKCkgIT0gUEFMIHx8CisgICAgICAgICAgKCFGbi0+aXNEZWNsYXJhdGlvbigpICYmIGlzRGVmaW5lKSkgeworICAgICAgICAvLyBJZiB0aGUgcmVkZWZpbml0aW9uIGhhcyBkaWZmZXJlbnQgdHlwZSBvciBkaWZmZXJlbnQgYXR0cmlidXRlcywKKyAgICAgICAgLy8gcmVqZWN0IGl0LiAgSWYgYm90aCBoYXZlIGJvZGllcywgcmVqZWN0IGl0LgorICAgICAgICByZXR1cm4gRXJyb3IoTmFtZUxvYywgImludmFsaWQgcmVkZWZpbml0aW9uIG9mIGZ1bmN0aW9uICciICsKKyAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSArICInIik7CisgICAgICB9IGVsc2UgaWYgKEZuLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHN0cmlwIG9mZiBhbnkgYXJndW1lbnQgbmFtZXMgc28gd2UgY2FuJ3QgZ2V0IGNvbmZsaWN0cy4KKyAgICAgICAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEFJID0gRm4tPmFyZ19iZWdpbigpLCBBRSA9IEZuLT5hcmdfZW5kKCk7CisgICAgICAgICAgICAgQUkgIT0gQUU7ICsrQUkpCisgICAgICAgICAgQUktPnNldE5hbWUoIiIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoTS0+Z2V0TmFtZWRWYWx1ZShGdW5jdGlvbk5hbWUpKSB7CisgICAgICByZXR1cm4gRXJyb3IoTmFtZUxvYywgInJlZGVmaW5pdGlvbiBvZiBmdW5jdGlvbiAnQCIgKyBGdW5jdGlvbk5hbWUgKyAiJyIpOworICAgIH0KKworICB9IGVsc2UgeworICAgIC8vIElmIHRoaXMgaXMgYSBkZWZpbml0aW9uIG9mIGEgZm9yd2FyZCByZWZlcmVuY2VkIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlCisgICAgLy8gdHlwZXMgYWdyZWUuCisgICAgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6cGFpcjxHbG9iYWxWYWx1ZSosIExvY1R5PiA+OjppdGVyYXRvciBJCisgICAgICA9IEZvcndhcmRSZWZWYWxJRHMuZmluZChOdW1iZXJlZFZhbHMuc2l6ZSgpKTsKKyAgICBpZiAoSSAhPSBGb3J3YXJkUmVmVmFsSURzLmVuZCgpKSB7CisgICAgICBGbiA9IGNhc3Q8RnVuY3Rpb24+KEktPnNlY29uZC5maXJzdCk7CisgICAgICBpZiAoRm4tPmdldFR5cGUoKSAhPSBQRlQpCisgICAgICAgIHJldHVybiBFcnJvcihOYW1lTG9jLCAidHlwZSBvZiBkZWZpbml0aW9uIGFuZCBmb3J3YXJkIHJlZmVyZW5jZSBvZiAnQCIgKworICAgICAgICAgICAgICAgICAgICAgdXRvc3RyKE51bWJlcmVkVmFscy5zaXplKCkpICsiJyBkaXNhZ3JlZSIpOworICAgICAgRm9yd2FyZFJlZlZhbElEcy5lcmFzZShJKTsKKyAgICB9CisgIH0KKworICBpZiAoRm4gPT0gMCkKKyAgICBGbiA9IEZ1bmN0aW9uOjpDcmVhdGUoRlQsIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsIEZ1bmN0aW9uTmFtZSwgTSk7CisgIGVsc2UgLy8gTW92ZSB0aGUgZm9yd2FyZC1yZWZlcmVuY2UgdG8gdGhlIGNvcnJlY3Qgc3BvdCBpbiB0aGUgbW9kdWxlLgorICAgIE0tPmdldEZ1bmN0aW9uTGlzdCgpLnNwbGljZShNLT5lbmQoKSwgTS0+Z2V0RnVuY3Rpb25MaXN0KCksIEZuKTsKKworICBpZiAoRnVuY3Rpb25OYW1lLmVtcHR5KCkpCisgICAgTnVtYmVyZWRWYWxzLnB1c2hfYmFjayhGbik7CisKKyAgRm4tPnNldExpbmthZ2UoKEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMpTGlua2FnZSk7CisgIEZuLT5zZXRWaXNpYmlsaXR5KChHbG9iYWxWYWx1ZTo6VmlzaWJpbGl0eVR5cGVzKVZpc2liaWxpdHkpOworICBGbi0+c2V0Q2FsbGluZ0NvbnYoQ0MpOworICBGbi0+c2V0QXR0cmlidXRlcyhQQUwpOworICBGbi0+c2V0QWxpZ25tZW50KEFsaWdubWVudCk7CisgIEZuLT5zZXRTZWN0aW9uKFNlY3Rpb24pOworICBpZiAoIUdDLmVtcHR5KCkpIEZuLT5zZXRHQyhHQy5jX3N0cigpKTsKKworICAvLyBBZGQgYWxsIG9mIHRoZSBhcmd1bWVudHMgd2UgcGFyc2VkIHRvIHRoZSBmdW5jdGlvbi4KKyAgRnVuY3Rpb246OmFyZ19pdGVyYXRvciBBcmdJdCA9IEZuLT5hcmdfYmVnaW4oKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ0xpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSwgKytBcmdJdCkgeworICAgIC8vIElmIHdlIHJ1biBvdXQgb2YgYXJndW1lbnRzIGluIHRoZSBGdW5jdGlvbiBwcm90b3R5cGUsIGV4aXQgZWFybHkuCisgICAgLy8gRklYTUU6IFJFTU9WRSBUSElTIElOIExMVk0gMy4wLCB0aGlzIGlzIGp1c3QgZm9yIHRoZSBtaXNtYXRjaCBjYXNlIGFib3ZlLgorICAgIGlmIChBcmdJdCA9PSBGbi0+YXJnX2VuZCgpKSBicmVhazsKKyAgICAKKyAgICAvLyBJZiB0aGUgYXJndW1lbnQgaGFzIGEgbmFtZSwgaW5zZXJ0IGl0IGludG8gdGhlIGFyZ3VtZW50IHN5bWJvbCB0YWJsZS4KKyAgICBpZiAoQXJnTGlzdFtpXS5OYW1lLmVtcHR5KCkpIGNvbnRpbnVlOworCisgICAgLy8gU2V0IHRoZSBuYW1lLCBpZiBpdCBjb25mbGljdGVkLCBpdCB3aWxsIGJlIGF1dG8tcmVuYW1lZC4KKyAgICBBcmdJdC0+c2V0TmFtZShBcmdMaXN0W2ldLk5hbWUpOworCisgICAgaWYgKEFyZ0l0LT5nZXROYW1lU3RyKCkgIT0gQXJnTGlzdFtpXS5OYW1lKQorICAgICAgcmV0dXJuIEVycm9yKEFyZ0xpc3RbaV0uTG9jLCAicmVkZWZpbml0aW9uIG9mIGFyZ3VtZW50ICclIiArCisgICAgICAgICAgICAgICAgICAgQXJnTGlzdFtpXS5OYW1lICsgIiciKTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gUGFyc2VGdW5jdGlvbkJvZHkKKy8vLyAgIDo6PSAneycgQmFzaWNCbG9jaysgJ30nCisvLy8gICA6Oj0gJ2JlZ2luJyBCYXNpY0Jsb2NrKyAnZW5kJyAgLy8gRklYTUU6IHJlbW92ZSBpbiBMTFZNIDMuMAorLy8vCitib29sIExMUGFyc2VyOjpQYXJzZUZ1bmN0aW9uQm9keShGdW5jdGlvbiAmRm4pIHsKKyAgaWYgKExleC5nZXRLaW5kKCkgIT0gbGx0b2s6OmxicmFjZSAmJiBMZXguZ2V0S2luZCgpICE9IGxsdG9rOjprd19iZWdpbikKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkICd7JyBpbiBmdW5jdGlvbiBib2R5Iik7CisgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgey4KKworICBpbnQgRnVuY3Rpb25OdW1iZXIgPSAtMTsKKyAgaWYgKCFGbi5oYXNOYW1lKCkpIEZ1bmN0aW9uTnVtYmVyID0gTnVtYmVyZWRWYWxzLnNpemUoKS0xOworICAKKyAgUGVyRnVuY3Rpb25TdGF0ZSBQRlMoKnRoaXMsIEZuLCBGdW5jdGlvbk51bWJlcik7CisKKyAgLy8gV2UgbmVlZCBhdCBsZWFzdCBvbmUgYmFzaWMgYmxvY2suCisgIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpyYnJhY2UgfHwgTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6a3dfZW5kKQorICAgIHJldHVybiBUb2tFcnJvcigiZnVuY3Rpb24gYm9keSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYmFzaWMgYmxvY2siKTsKKyAgCisgIHdoaWxlIChMZXguZ2V0S2luZCgpICE9IGxsdG9rOjpyYnJhY2UgJiYgTGV4LmdldEtpbmQoKSAhPSBsbHRvazo6a3dfZW5kKQorICAgIGlmIChQYXJzZUJhc2ljQmxvY2soUEZTKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gRWF0IHRoZSB9LgorICBMZXguTGV4KCk7CisKKyAgLy8gVmVyaWZ5IGZ1bmN0aW9uIGlzIG9rLgorICByZXR1cm4gUEZTLkZpbmlzaEZ1bmN0aW9uKCk7Cit9CisKKy8vLyBQYXJzZUJhc2ljQmxvY2sKKy8vLyAgIDo6PSBMYWJlbFN0cj8gSW5zdHJ1Y3Rpb24qCitib29sIExMUGFyc2VyOjpQYXJzZUJhc2ljQmxvY2soUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIC8vIElmIHRoaXMgYmFzaWMgYmxvY2sgc3RhcnRzIG91dCB3aXRoIGEgbmFtZSwgcmVtZW1iZXIgaXQuCisgIHN0ZDo6c3RyaW5nIE5hbWU7CisgIExvY1R5IE5hbWVMb2MgPSBMZXguZ2V0TG9jKCk7CisgIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpMYWJlbFN0cikgeworICAgIE5hbWUgPSBMZXguZ2V0U3RyVmFsKCk7CisgICAgTGV4LkxleCgpOworICB9CisKKyAgQmFzaWNCbG9jayAqQkIgPSBQRlMuRGVmaW5lQkIoTmFtZSwgTmFtZUxvYyk7CisgIGlmIChCQiA9PSAwKSByZXR1cm4gdHJ1ZTsKKworICBzdGQ6OnN0cmluZyBOYW1lU3RyOworCisgIC8vIFBhcnNlIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhpcyBibG9jayB1bnRpbCB3ZSBnZXQgYSB0ZXJtaW5hdG9yLgorICBJbnN0cnVjdGlvbiAqSW5zdDsKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBNRE5vZGUgKj4sIDQ+IE1ldGFkYXRhT25JbnN0OworICBkbyB7CisgICAgLy8gVGhpcyBpbnN0cnVjdGlvbiBtYXkgaGF2ZSB0aHJlZSBwb3NzaWJpbGl0aWVzIGZvciBhIG5hbWU6IGEpIG5vbmUKKyAgICAvLyBzcGVjaWZpZWQsIGIpIG5hbWUgc3BlY2lmaWVkICIlZm9vID0iLCBjKSBudW1iZXIgc3BlY2lmaWVkOiAiJTQgPSIuCisgICAgTG9jVHkgTmFtZUxvYyA9IExleC5nZXRMb2MoKTsKKyAgICBpbnQgTmFtZUlEID0gLTE7CisgICAgTmFtZVN0ciA9ICIiOworCisgICAgaWYgKExleC5nZXRLaW5kKCkgPT0gbGx0b2s6OkxvY2FsVmFySUQpIHsKKyAgICAgIE5hbWVJRCA9IExleC5nZXRVSW50VmFsKCk7CisgICAgICBMZXguTGV4KCk7CisgICAgICBpZiAoUGFyc2VUb2tlbihsbHRvazo6ZXF1YWwsICJleHBlY3RlZCAnPScgYWZ0ZXIgaW5zdHJ1Y3Rpb24gaWQiKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpMb2NhbFZhciB8fAorICAgICAgICAgICAgICAgLy8gRklYTUU6IFJFTU9WRSBJTiBMTFZNIDMuMAorICAgICAgICAgICAgICAgTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6U3RyaW5nQ29uc3RhbnQpIHsKKyAgICAgIE5hbWVTdHIgPSBMZXguZ2V0U3RyVmFsKCk7CisgICAgICBMZXguTGV4KCk7CisgICAgICBpZiAoUGFyc2VUb2tlbihsbHRvazo6ZXF1YWwsICJleHBlY3RlZCAnPScgYWZ0ZXIgaW5zdHJ1Y3Rpb24gbmFtZSIpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKFBhcnNlSW5zdHJ1Y3Rpb24oSW5zdCwgQkIsIFBGUykpIHsKKyAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biBQYXJzZUluc3RydWN0aW9uIHJlc3VsdCEiKTsKKyAgICBjYXNlIEluc3RFcnJvcjogcmV0dXJuIHRydWU7CisgICAgY2FzZSBJbnN0Tm9ybWFsOgorICAgICAgQkItPmdldEluc3RMaXN0KCkucHVzaF9iYWNrKEluc3QpOworCisgICAgICAvLyBXaXRoIGEgbm9ybWFsIHJlc3VsdCwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBmb2xsb3dlZCBieQorICAgICAgLy8gYSBjb21tYSBhbmQgbWV0YWRhdGEuCisgICAgICBpZiAoRWF0SWZQcmVzZW50KGxsdG9rOjpjb21tYSkpCisgICAgICAgIGlmIChQYXJzZUluc3RydWN0aW9uTWV0YWRhdGEoSW5zdCkpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RFeHRyYUNvbW1hOgorICAgICAgQkItPmdldEluc3RMaXN0KCkucHVzaF9iYWNrKEluc3QpOworCisgICAgICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gcGFyc2VyIGF0ZSBhbiBleHRyYSBjb21tYSBhdCB0aGUgZW5kIG9mIGl0LCBpdAorICAgICAgLy8gKm11c3QqIGJlIGZvbGxvd2VkIGJ5IG1ldGFkYXRhLgorICAgICAgaWYgKFBhcnNlSW5zdHJ1Y3Rpb25NZXRhZGF0YShJbnN0KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsgICAgICAgIAorICAgIH0KKworICAgIC8vIFNldCB0aGUgbmFtZSBvbiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgaWYgKFBGUy5TZXRJbnN0TmFtZShOYW1lSUQsIE5hbWVTdHIsIE5hbWVMb2MsIEluc3QpKSByZXR1cm4gdHJ1ZTsKKyAgfSB3aGlsZSAoIWlzYTxUZXJtaW5hdG9ySW5zdD4oSW5zdCkpOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIFBhcnNpbmcuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gUGFyc2VJbnN0cnVjdGlvbiAtIFBhcnNlIG9uZSBvZiB0aGUgbWFueSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zLgorLy8vCitpbnQgTExQYXJzZXI6OlBhcnNlSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKiZJbnN0LCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJGdW5jdGlvblN0YXRlICZQRlMpIHsKKyAgbGx0b2s6OktpbmQgVG9rZW4gPSBMZXguZ2V0S2luZCgpOworICBpZiAoVG9rZW4gPT0gbGx0b2s6OkVvZikKKyAgICByZXR1cm4gVG9rRXJyb3IoImZvdW5kIGVuZCBvZiBmaWxlIHdoZW4gZXhwZWN0aW5nIG1vcmUgaW5zdHJ1Y3Rpb25zIik7CisgIExvY1R5IExvYyA9IExleC5nZXRMb2MoKTsKKyAgdW5zaWduZWQgS2V5d29yZFZhbCA9IExleC5nZXRVSW50VmFsKCk7CisgIExleC5MZXgoKTsgIC8vIEVhdCB0aGUga2V5d29yZC4KKworICBzd2l0Y2ggKFRva2VuKSB7CisgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3IoTG9jLCAiZXhwZWN0ZWQgaW5zdHJ1Y3Rpb24gb3Bjb2RlIik7CisgIC8vIFRlcm1pbmF0b3IgSW5zdHJ1Y3Rpb25zLgorICBjYXNlIGxsdG9rOjprd191bndpbmQ6ICAgICAgSW5zdCA9IG5ldyBVbndpbmRJbnN0KENvbnRleHQpOyByZXR1cm4gZmFsc2U7CisgIGNhc2UgbGx0b2s6Omt3X3VucmVhY2hhYmxlOiBJbnN0ID0gbmV3IFVucmVhY2hhYmxlSW5zdChDb250ZXh0KTsgcmV0dXJuIGZhbHNlOworICBjYXNlIGxsdG9rOjprd19yZXQ6ICAgICAgICAgcmV0dXJuIFBhcnNlUmV0KEluc3QsIEJCLCBQRlMpOworICBjYXNlIGxsdG9rOjprd19icjogICAgICAgICAgcmV0dXJuIFBhcnNlQnIoSW5zdCwgUEZTKTsKKyAgY2FzZSBsbHRvazo6a3dfc3dpdGNoOiAgICAgIHJldHVybiBQYXJzZVN3aXRjaChJbnN0LCBQRlMpOworICBjYXNlIGxsdG9rOjprd19pbmRpcmVjdGJyOiAgcmV0dXJuIFBhcnNlSW5kaXJlY3RCcihJbnN0LCBQRlMpOworICBjYXNlIGxsdG9rOjprd19pbnZva2U6ICAgICAgcmV0dXJuIFBhcnNlSW52b2tlKEluc3QsIFBGUyk7CisgIC8vIEJpbmFyeSBPcGVyYXRvcnMuCisgIGNhc2UgbGx0b2s6Omt3X2FkZDoKKyAgY2FzZSBsbHRvazo6a3dfc3ViOgorICBjYXNlIGxsdG9rOjprd19tdWw6IHsKKyAgICBib29sIE5VVyA9IGZhbHNlOworICAgIGJvb2wgTlNXID0gZmFsc2U7CisgICAgTG9jVHkgTW9kaWZpZXJMb2MgPSBMZXguZ2V0TG9jKCk7CisgICAgaWYgKEVhdElmUHJlc2VudChsbHRvazo6a3dfbnV3KSkKKyAgICAgIE5VVyA9IHRydWU7CisgICAgaWYgKEVhdElmUHJlc2VudChsbHRvazo6a3dfbnN3KSkgeworICAgICAgTlNXID0gdHJ1ZTsKKyAgICAgIGlmIChFYXRJZlByZXNlbnQobGx0b2s6Omt3X251dykpCisgICAgICAgIE5VVyA9IHRydWU7CisgICAgfQorICAgIGJvb2wgUmVzdWx0ID0gUGFyc2VBcml0aG1ldGljKEluc3QsIFBGUywgS2V5d29yZFZhbCwgMSk7CisgICAgaWYgKCFSZXN1bHQpIHsKKyAgICAgIGlmICghSW5zdC0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSkgeworICAgICAgICBpZiAoTlVXKQorICAgICAgICAgIHJldHVybiBFcnJvcihNb2RpZmllckxvYywgIm51dyBvbmx5IGFwcGxpZXMgdG8gaW50ZWdlciBvcGVyYXRpb25zIik7CisgICAgICAgIGlmIChOU1cpCisgICAgICAgICAgcmV0dXJuIEVycm9yKE1vZGlmaWVyTG9jLCAibnN3IG9ubHkgYXBwbGllcyB0byBpbnRlZ2VyIG9wZXJhdGlvbnMiKTsKKyAgICAgIH0KKyAgICAgIGlmIChOVVcpCisgICAgICAgIGNhc3Q8QmluYXJ5T3BlcmF0b3I+KEluc3QpLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCh0cnVlKTsKKyAgICAgIGlmIChOU1cpCisgICAgICAgIGNhc3Q8QmluYXJ5T3BlcmF0b3I+KEluc3QpLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKyAgY2FzZSBsbHRvazo6a3dfZmFkZDoKKyAgY2FzZSBsbHRvazo6a3dfZnN1YjoKKyAgY2FzZSBsbHRvazo6a3dfZm11bDogICAgcmV0dXJuIFBhcnNlQXJpdGhtZXRpYyhJbnN0LCBQRlMsIEtleXdvcmRWYWwsIDIpOworCisgIGNhc2UgbGx0b2s6Omt3X3NkaXY6IHsKKyAgICBib29sIEV4YWN0ID0gZmFsc2U7CisgICAgaWYgKEVhdElmUHJlc2VudChsbHRvazo6a3dfZXhhY3QpKQorICAgICAgRXhhY3QgPSB0cnVlOworICAgIGJvb2wgUmVzdWx0ID0gUGFyc2VBcml0aG1ldGljKEluc3QsIFBGUywgS2V5d29yZFZhbCwgMSk7CisgICAgaWYgKCFSZXN1bHQpCisgICAgICBpZiAoRXhhY3QpCisgICAgICAgIGNhc3Q8QmluYXJ5T3BlcmF0b3I+KEluc3QpLT5zZXRJc0V4YWN0KHRydWUpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBjYXNlIGxsdG9rOjprd191ZGl2OgorICBjYXNlIGxsdG9rOjprd191cmVtOgorICBjYXNlIGxsdG9rOjprd19zcmVtOiAgIHJldHVybiBQYXJzZUFyaXRobWV0aWMoSW5zdCwgUEZTLCBLZXl3b3JkVmFsLCAxKTsKKyAgY2FzZSBsbHRvazo6a3dfZmRpdjoKKyAgY2FzZSBsbHRvazo6a3dfZnJlbTogICByZXR1cm4gUGFyc2VBcml0aG1ldGljKEluc3QsIFBGUywgS2V5d29yZFZhbCwgMik7CisgIGNhc2UgbGx0b2s6Omt3X3NobDoKKyAgY2FzZSBsbHRvazo6a3dfbHNocjoKKyAgY2FzZSBsbHRvazo6a3dfYXNocjoKKyAgY2FzZSBsbHRvazo6a3dfYW5kOgorICBjYXNlIGxsdG9rOjprd19vcjoKKyAgY2FzZSBsbHRvazo6a3dfeG9yOiAgICByZXR1cm4gUGFyc2VMb2dpY2FsKEluc3QsIFBGUywgS2V5d29yZFZhbCk7CisgIGNhc2UgbGx0b2s6Omt3X2ljbXA6CisgIGNhc2UgbGx0b2s6Omt3X2ZjbXA6ICAgcmV0dXJuIFBhcnNlQ29tcGFyZShJbnN0LCBQRlMsIEtleXdvcmRWYWwpOworICAvLyBDYXN0cy4KKyAgY2FzZSBsbHRvazo6a3dfdHJ1bmM6CisgIGNhc2UgbGx0b2s6Omt3X3pleHQ6CisgIGNhc2UgbGx0b2s6Omt3X3NleHQ6CisgIGNhc2UgbGx0b2s6Omt3X2ZwdHJ1bmM6CisgIGNhc2UgbGx0b2s6Omt3X2ZwZXh0OgorICBjYXNlIGxsdG9rOjprd19iaXRjYXN0OgorICBjYXNlIGxsdG9rOjprd191aXRvZnA6CisgIGNhc2UgbGx0b2s6Omt3X3NpdG9mcDoKKyAgY2FzZSBsbHRvazo6a3dfZnB0b3VpOgorICBjYXNlIGxsdG9rOjprd19mcHRvc2k6CisgIGNhc2UgbGx0b2s6Omt3X2ludHRvcHRyOgorICBjYXNlIGxsdG9rOjprd19wdHJ0b2ludDogICAgICAgcmV0dXJuIFBhcnNlQ2FzdChJbnN0LCBQRlMsIEtleXdvcmRWYWwpOworICAvLyBPdGhlci4KKyAgY2FzZSBsbHRvazo6a3dfc2VsZWN0OiAgICAgICAgIHJldHVybiBQYXJzZVNlbGVjdChJbnN0LCBQRlMpOworICBjYXNlIGxsdG9rOjprd192YV9hcmc6ICAgICAgICAgcmV0dXJuIFBhcnNlVkFfQXJnKEluc3QsIFBGUyk7CisgIGNhc2UgbGx0b2s6Omt3X2V4dHJhY3RlbGVtZW50OiByZXR1cm4gUGFyc2VFeHRyYWN0RWxlbWVudChJbnN0LCBQRlMpOworICBjYXNlIGxsdG9rOjprd19pbnNlcnRlbGVtZW50OiAgcmV0dXJuIFBhcnNlSW5zZXJ0RWxlbWVudChJbnN0LCBQRlMpOworICBjYXNlIGxsdG9rOjprd19zaHVmZmxldmVjdG9yOiAgcmV0dXJuIFBhcnNlU2h1ZmZsZVZlY3RvcihJbnN0LCBQRlMpOworICBjYXNlIGxsdG9rOjprd19waGk6ICAgICAgICAgICAgcmV0dXJuIFBhcnNlUEhJKEluc3QsIFBGUyk7CisgIGNhc2UgbGx0b2s6Omt3X2NhbGw6ICAgICAgICAgICByZXR1cm4gUGFyc2VDYWxsKEluc3QsIFBGUywgZmFsc2UpOworICBjYXNlIGxsdG9rOjprd190YWlsOiAgICAgICAgICAgcmV0dXJuIFBhcnNlQ2FsbChJbnN0LCBQRlMsIHRydWUpOworICAvLyBNZW1vcnkuCisgIGNhc2UgbGx0b2s6Omt3X2FsbG9jYTogICAgICAgICByZXR1cm4gUGFyc2VBbGxvYyhJbnN0LCBQRlMpOworICBjYXNlIGxsdG9rOjprd19tYWxsb2M6ICAgICAgICAgcmV0dXJuIFBhcnNlQWxsb2MoSW5zdCwgUEZTLCBCQiwgZmFsc2UpOworICBjYXNlIGxsdG9rOjprd19mcmVlOiAgICAgICAgICAgcmV0dXJuIFBhcnNlRnJlZShJbnN0LCBQRlMsIEJCKTsKKyAgY2FzZSBsbHRvazo6a3dfbG9hZDogICAgICAgICAgIHJldHVybiBQYXJzZUxvYWQoSW5zdCwgUEZTLCBmYWxzZSk7CisgIGNhc2UgbGx0b2s6Omt3X3N0b3JlOiAgICAgICAgICByZXR1cm4gUGFyc2VTdG9yZShJbnN0LCBQRlMsIGZhbHNlKTsKKyAgY2FzZSBsbHRvazo6a3dfdm9sYXRpbGU6CisgICAgaWYgKEVhdElmUHJlc2VudChsbHRvazo6a3dfbG9hZCkpCisgICAgICByZXR1cm4gUGFyc2VMb2FkKEluc3QsIFBGUywgdHJ1ZSk7CisgICAgZWxzZSBpZiAoRWF0SWZQcmVzZW50KGxsdG9rOjprd19zdG9yZSkpCisgICAgICByZXR1cm4gUGFyc2VTdG9yZShJbnN0LCBQRlMsIHRydWUpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgJ2xvYWQnIG9yICdzdG9yZSciKTsKKyAgY2FzZSBsbHRvazo6a3dfZ2V0cmVzdWx0OiAgICAgcmV0dXJuIFBhcnNlR2V0UmVzdWx0KEluc3QsIFBGUyk7CisgIGNhc2UgbGx0b2s6Omt3X2dldGVsZW1lbnRwdHI6IHJldHVybiBQYXJzZUdldEVsZW1lbnRQdHIoSW5zdCwgUEZTKTsKKyAgY2FzZSBsbHRvazo6a3dfZXh0cmFjdHZhbHVlOiAgcmV0dXJuIFBhcnNlRXh0cmFjdFZhbHVlKEluc3QsIFBGUyk7CisgIGNhc2UgbGx0b2s6Omt3X2luc2VydHZhbHVlOiAgIHJldHVybiBQYXJzZUluc2VydFZhbHVlKEluc3QsIFBGUyk7CisgIH0KK30KKworLy8vIFBhcnNlQ21wUHJlZGljYXRlIC0gUGFyc2UgYW4gaW50ZWdlciBvciBmcCBwcmVkaWNhdGUsIGJhc2VkIG9uIEtpbmQuCitib29sIExMUGFyc2VyOjpQYXJzZUNtcFByZWRpY2F0ZSh1bnNpZ25lZCAmUCwgdW5zaWduZWQgT3BjKSB7CisgIGlmIChPcGMgPT0gSW5zdHJ1Y3Rpb246OkZDbXApIHsKKyAgICBzd2l0Y2ggKExleC5nZXRLaW5kKCkpIHsKKyAgICBkZWZhdWx0OiBUb2tFcnJvcigiZXhwZWN0ZWQgZmNtcCBwcmVkaWNhdGUgKGUuZy4gJ29lcScpIik7CisgICAgY2FzZSBsbHRvazo6a3dfb2VxOiBQID0gQ21wSW5zdDo6RkNNUF9PRVE7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X29uZTogUCA9IENtcEluc3Q6OkZDTVBfT05FOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19vbHQ6IFAgPSBDbXBJbnN0OjpGQ01QX09MVDsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfb2d0OiBQID0gQ21wSW5zdDo6RkNNUF9PR1Q7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X29sZTogUCA9IENtcEluc3Q6OkZDTVBfT0xFOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19vZ2U6IFAgPSBDbXBJbnN0OjpGQ01QX09HRTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfb3JkOiBQID0gQ21wSW5zdDo6RkNNUF9PUkQ7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3VubzogUCA9IENtcEluc3Q6OkZDTVBfVU5POyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd191ZXE6IFAgPSBDbXBJbnN0OjpGQ01QX1VFUTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfdW5lOiBQID0gQ21wSW5zdDo6RkNNUF9VTkU7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3VsdDogUCA9IENtcEluc3Q6OkZDTVBfVUxUOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd191Z3Q6IFAgPSBDbXBJbnN0OjpGQ01QX1VHVDsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfdWxlOiBQID0gQ21wSW5zdDo6RkNNUF9VTEU7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3VnZTogUCA9IENtcEluc3Q6OkZDTVBfVUdFOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd190cnVlOiBQID0gQ21wSW5zdDo6RkNNUF9UUlVFOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19mYWxzZTogUCA9IENtcEluc3Q6OkZDTVBfRkFMU0U7IGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKExleC5nZXRLaW5kKCkpIHsKKyAgICBkZWZhdWx0OiBUb2tFcnJvcigiZXhwZWN0ZWQgaWNtcCBwcmVkaWNhdGUgKGUuZy4gJ2VxJykiKTsKKyAgICBjYXNlIGxsdG9rOjprd19lcTogIFAgPSBDbXBJbnN0OjpJQ01QX0VROyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19uZTogIFAgPSBDbXBJbnN0OjpJQ01QX05FOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19zbHQ6IFAgPSBDbXBJbnN0OjpJQ01QX1NMVDsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfc2d0OiBQID0gQ21wSW5zdDo6SUNNUF9TR1Q7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3NsZTogUCA9IENtcEluc3Q6OklDTVBfU0xFOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd19zZ2U6IFAgPSBDbXBJbnN0OjpJQ01QX1NHRTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfdWx0OiBQID0gQ21wSW5zdDo6SUNNUF9VTFQ7IGJyZWFrOworICAgIGNhc2UgbGx0b2s6Omt3X3VndDogUCA9IENtcEluc3Q6OklDTVBfVUdUOyBicmVhazsKKyAgICBjYXNlIGxsdG9rOjprd191bGU6IFAgPSBDbXBJbnN0OjpJQ01QX1VMRTsgYnJlYWs7CisgICAgY2FzZSBsbHRvazo6a3dfdWdlOiBQID0gQ21wSW5zdDo6SUNNUF9VR0U7IGJyZWFrOworICAgIH0KKyAgfQorICBMZXguTGV4KCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRlcm1pbmF0b3IgSW5zdHJ1Y3Rpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFBhcnNlUmV0IC0gUGFyc2UgYSByZXR1cm4gaW5zdHJ1Y3Rpb24uCisvLy8gICA6Oj0gJ3JldCcgdm9pZCAoJywnICFkYmcsICExKSoKKy8vLyAgIDo6PSAncmV0JyBUeXBlQW5kVmFsdWUgKCcsJyAhZGJnLCAhMSkqCisvLy8gICA6Oj0gJ3JldCcgVHlwZUFuZFZhbHVlICgnLCcgVHlwZUFuZFZhbHVlKSsgICgnLCcgIWRiZywgITEpKgorLy8vICAgICAgICAgW1tvYnNvbGV0ZTogTExWTSAzLjBdXQoraW50IExMUGFyc2VyOjpQYXJzZVJldChJbnN0cnVjdGlvbiAqJkluc3QsIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICBQZXJGdW5jdGlvblN0YXRlICZQRlMpIHsKKyAgUEFUeXBlSG9sZGVyIFR5KFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgIGlmIChQYXJzZVR5cGUoVHksIHRydWUgLyp2b2lkIGFsbG93ZWQqLykpIHJldHVybiB0cnVlOworCisgIGlmIChUeS0+aXNWb2lkVHkoKSkgeworICAgIEluc3QgPSBSZXR1cm5JbnN0OjpDcmVhdGUoQ29udGV4dCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgVmFsdWUgKlJWOworICBpZiAoUGFyc2VWYWx1ZShUeSwgUlYsIFBGUykpIHJldHVybiB0cnVlOworCisgIGJvb2wgRXh0cmFDb21tYSA9IGZhbHNlOworICBpZiAoRWF0SWZQcmVzZW50KGxsdG9rOjpjb21tYSkpIHsKKyAgICAvLyBQYXJzZSBvcHRpb25hbCBjdXN0b20gbWV0YWRhdGEsIGUuZy4gIWRiZworICAgIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpNZXRhZGF0YVZhcikgeworICAgICAgRXh0cmFDb21tYSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSBub3JtYWwgY2FzZSBpcyBvbmUgcmV0dXJuIHZhbHVlLgorICAgICAgLy8gRklYTUU6IExMVk0gMy4wIHJlbW92ZSBNUlYgc3VwcG9ydCBmb3IgJ3JldCBpMzIgMSwgaTMyIDInLCByZXF1aXJpbmcKKyAgICAgIC8vIHVzZSBvZiAncmV0IHtpMzIsaTMyfSB7aTMyIDEsIGkzMiAyfScKKyAgICAgIFNtYWxsVmVjdG9yPFZhbHVlKiwgOD4gUlZzOworICAgICAgUlZzLnB1c2hfYmFjayhSVik7CisKKyAgICAgIGRvIHsKKyAgICAgICAgLy8gSWYgb3B0aW9uYWwgY3VzdG9tIG1ldGFkYXRhLCBlLmcuICFkYmcgaXMgc2VlbiB0aGVuIHRoaXMgaXMgdGhlIAorICAgICAgICAvLyBlbmQgb2YgTVJWLgorICAgICAgICBpZiAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6TWV0YWRhdGFWYXIpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChQYXJzZVR5cGVBbmRWYWx1ZShSViwgUEZTKSkgcmV0dXJuIHRydWU7CisgICAgICAgIFJWcy5wdXNoX2JhY2soUlYpOworICAgICAgfSB3aGlsZSAoRWF0SWZQcmVzZW50KGxsdG9rOjpjb21tYSkpOworCisgICAgICBSViA9IFVuZGVmVmFsdWU6OmdldChQRlMuZ2V0RnVuY3Rpb24oKS5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJWcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIEluc3RydWN0aW9uICpJID0gSW5zZXJ0VmFsdWVJbnN0OjpDcmVhdGUoUlYsIFJWc1tpXSwgaSwgIm1ydiIpOworICAgICAgICBCQi0+Z2V0SW5zdExpc3QoKS5wdXNoX2JhY2soSSk7CisgICAgICAgIFJWID0gSTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBJbnN0ID0gUmV0dXJuSW5zdDo6Q3JlYXRlKENvbnRleHQsIFJWKTsKKyAgcmV0dXJuIEV4dHJhQ29tbWEgPyBJbnN0RXh0cmFDb21tYSA6IEluc3ROb3JtYWw7Cit9CisKKworLy8vIFBhcnNlQnIKKy8vLyAgIDo6PSAnYnInIFR5cGVBbmRWYWx1ZQorLy8vICAgOjo9ICdicicgVHlwZUFuZFZhbHVlICcsJyBUeXBlQW5kVmFsdWUgJywnIFR5cGVBbmRWYWx1ZQorYm9vbCBMTFBhcnNlcjo6UGFyc2VCcihJbnN0cnVjdGlvbiAqJkluc3QsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUykgeworICBMb2NUeSBMb2MsIExvYzI7CisgIFZhbHVlICpPcDA7CisgIEJhc2ljQmxvY2sgKk9wMSwgKk9wMjsKKyAgaWYgKFBhcnNlVHlwZUFuZFZhbHVlKE9wMCwgTG9jLCBQRlMpKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoQmFzaWNCbG9jayAqQkIgPSBkeW5fY2FzdDxCYXNpY0Jsb2NrPihPcDApKSB7CisgICAgSW5zdCA9IEJyYW5jaEluc3Q6OkNyZWF0ZShCQik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKE9wMC0+Z2V0VHlwZSgpICE9IFR5cGU6OmdldEludDFUeShDb250ZXh0KSkKKyAgICByZXR1cm4gRXJyb3IoTG9jLCAiYnJhbmNoIGNvbmRpdGlvbiBtdXN0IGhhdmUgJ2kxJyB0eXBlIik7CisKKyAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OmNvbW1hLCAiZXhwZWN0ZWQgJywnIGFmdGVyIGJyYW5jaCBjb25kaXRpb24iKSB8fAorICAgICAgUGFyc2VUeXBlQW5kQmFzaWNCbG9jayhPcDEsIExvYywgUEZTKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCAnLCcgYWZ0ZXIgdHJ1ZSBkZXN0aW5hdGlvbiIpIHx8CisgICAgICBQYXJzZVR5cGVBbmRCYXNpY0Jsb2NrKE9wMiwgTG9jMiwgUEZTKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBJbnN0ID0gQnJhbmNoSW5zdDo6Q3JlYXRlKE9wMSwgT3AyLCBPcDApOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZVN3aXRjaAorLy8vICBJbnN0cnVjdGlvbgorLy8vICAgIDo6PSAnc3dpdGNoJyBUeXBlQW5kVmFsdWUgJywnIFR5cGVBbmRWYWx1ZSAnWycgSnVtcFRhYmxlICddJworLy8vICBKdW1wVGFibGUKKy8vLyAgICA6Oj0gKFR5cGVBbmRWYWx1ZSAnLCcgVHlwZUFuZFZhbHVlKSoKK2Jvb2wgTExQYXJzZXI6OlBhcnNlU3dpdGNoKEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIExvY1R5IENvbmRMb2MsIEJCTG9jOworICBWYWx1ZSAqQ29uZDsKKyAgQmFzaWNCbG9jayAqRGVmYXVsdEJCOworICBpZiAoUGFyc2VUeXBlQW5kVmFsdWUoQ29uZCwgQ29uZExvYywgUEZTKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCAnLCcgYWZ0ZXIgc3dpdGNoIGNvbmRpdGlvbiIpIHx8CisgICAgICBQYXJzZVR5cGVBbmRCYXNpY0Jsb2NrKERlZmF1bHRCQiwgQkJMb2MsIFBGUykgfHwKKyAgICAgIFBhcnNlVG9rZW4obGx0b2s6OmxzcXVhcmUsICJleHBlY3RlZCAnWycgd2l0aCBzd2l0Y2ggdGFibGUiKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoIUNvbmQtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkKKyAgICByZXR1cm4gRXJyb3IoQ29uZExvYywgInN3aXRjaCBjb25kaXRpb24gbXVzdCBoYXZlIGludGVnZXIgdHlwZSIpOworCisgIC8vIFBhcnNlIHRoZSBqdW1wIHRhYmxlIHBhaXJzLgorICBTbWFsbFB0clNldDxWYWx1ZSosIDMyPiBTZWVuQ2FzZXM7CisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxDb25zdGFudEludCosIEJhc2ljQmxvY2sqPiwgMzI+IFRhYmxlOworICB3aGlsZSAoTGV4LmdldEtpbmQoKSAhPSBsbHRvazo6cnNxdWFyZSkgeworICAgIFZhbHVlICpDb25zdGFudDsKKyAgICBCYXNpY0Jsb2NrICpEZXN0QkI7CisKKyAgICBpZiAoUGFyc2VUeXBlQW5kVmFsdWUoQ29uc3RhbnQsIENvbmRMb2MsIFBGUykgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCAnLCcgYWZ0ZXIgY2FzZSB2YWx1ZSIpIHx8CisgICAgICAgIFBhcnNlVHlwZUFuZEJhc2ljQmxvY2soRGVzdEJCLCBQRlMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgaWYgKCFTZWVuQ2FzZXMuaW5zZXJ0KENvbnN0YW50KSkKKyAgICAgIHJldHVybiBFcnJvcihDb25kTG9jLCAiZHVwbGljYXRlIGNhc2UgdmFsdWUgaW4gc3dpdGNoIik7CisgICAgaWYgKCFpc2E8Q29uc3RhbnRJbnQ+KENvbnN0YW50KSkKKyAgICAgIHJldHVybiBFcnJvcihDb25kTG9jLCAiY2FzZSB2YWx1ZSBpcyBub3QgYSBjb25zdGFudCBpbnRlZ2VyIik7CisKKyAgICBUYWJsZS5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2FzdDxDb25zdGFudEludD4oQ29uc3RhbnQpLCBEZXN0QkIpKTsKKyAgfQorCisgIExleC5MZXgoKTsgIC8vIEVhdCB0aGUgJ10nLgorCisgIFN3aXRjaEluc3QgKlNJID0gU3dpdGNoSW5zdDo6Q3JlYXRlKENvbmQsIERlZmF1bHRCQiwgVGFibGUuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRhYmxlLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgU0ktPmFkZENhc2UoVGFibGVbaV0uZmlyc3QsIFRhYmxlW2ldLnNlY29uZCk7CisgIEluc3QgPSBTSTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VJbmRpcmVjdEJyCisvLy8gIEluc3RydWN0aW9uCisvLy8gICAgOjo9ICdpbmRpcmVjdGJyJyBUeXBlQW5kVmFsdWUgJywnICdbJyBMYWJlbExpc3QgJ10nCitib29sIExMUGFyc2VyOjpQYXJzZUluZGlyZWN0QnIoSW5zdHJ1Y3Rpb24gKiZJbnN0LCBQZXJGdW5jdGlvblN0YXRlICZQRlMpIHsKKyAgTG9jVHkgQWRkckxvYzsKKyAgVmFsdWUgKkFkZHJlc3M7CisgIGlmIChQYXJzZVR5cGVBbmRWYWx1ZShBZGRyZXNzLCBBZGRyTG9jLCBQRlMpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpjb21tYSwgImV4cGVjdGVkICcsJyBhZnRlciBpbmRpcmVjdGJyIGFkZHJlc3MiKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6bHNxdWFyZSwgImV4cGVjdGVkICdbJyB3aXRoIGluZGlyZWN0YnIiKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIGlmICghQWRkcmVzcy0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgIHJldHVybiBFcnJvcihBZGRyTG9jLCAiaW5kaXJlY3RiciBhZGRyZXNzIG11c3QgaGF2ZSBwb2ludGVyIHR5cGUiKTsKKyAgCisgIC8vIFBhcnNlIHRoZSBkZXN0aW5hdGlvbiBsaXN0LgorICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgMTY+IERlc3RMaXN0OworICAKKyAgaWYgKExleC5nZXRLaW5kKCkgIT0gbGx0b2s6OnJzcXVhcmUpIHsKKyAgICBCYXNpY0Jsb2NrICpEZXN0QkI7CisgICAgaWYgKFBhcnNlVHlwZUFuZEJhc2ljQmxvY2soRGVzdEJCLCBQRlMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgRGVzdExpc3QucHVzaF9iYWNrKERlc3RCQik7CisgICAgCisgICAgd2hpbGUgKEVhdElmUHJlc2VudChsbHRvazo6Y29tbWEpKSB7CisgICAgICBpZiAoUGFyc2VUeXBlQW5kQmFzaWNCbG9jayhEZXN0QkIsIFBGUykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgRGVzdExpc3QucHVzaF9iYWNrKERlc3RCQik7CisgICAgfQorICB9CisgIAorICBpZiAoUGFyc2VUb2tlbihsbHRvazo6cnNxdWFyZSwgImV4cGVjdGVkICddJyBhdCBlbmQgb2YgYmxvY2sgbGlzdCIpKQorICAgIHJldHVybiB0cnVlOworCisgIEluZGlyZWN0QnJJbnN0ICpJQkkgPSBJbmRpcmVjdEJySW5zdDo6Q3JlYXRlKEFkZHJlc3MsIERlc3RMaXN0LnNpemUoKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEZXN0TGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIElCSS0+YWRkRGVzdGluYXRpb24oRGVzdExpc3RbaV0pOworICBJbnN0ID0gSUJJOworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIFBhcnNlSW52b2tlCisvLy8gICA6Oj0gJ2ludm9rZScgT3B0aW9uYWxDYWxsaW5nQ29udiBPcHRpb25hbEF0dHJzIFR5cGUgVmFsdWUgUGFyYW1MaXN0CisvLy8gICAgICAgT3B0aW9uYWxBdHRycyAndG8nIFR5cGVBbmRWYWx1ZSAndW53aW5kJyBUeXBlQW5kVmFsdWUKK2Jvb2wgTExQYXJzZXI6OlBhcnNlSW52b2tlKEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIExvY1R5IENhbGxMb2MgPSBMZXguZ2V0TG9jKCk7CisgIHVuc2lnbmVkIFJldEF0dHJzLCBGbkF0dHJzOworICBDYWxsaW5nQ29udjo6SUQgQ0M7CisgIFBBVHlwZUhvbGRlciBSZXRUeXBlKFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgIExvY1R5IFJldFR5cGVMb2M7CisgIFZhbElEIENhbGxlZUlEOworICBTbWFsbFZlY3RvcjxQYXJhbUluZm8sIDE2PiBBcmdMaXN0OworCisgIEJhc2ljQmxvY2sgKk5vcm1hbEJCLCAqVW53aW5kQkI7CisgIGlmIChQYXJzZU9wdGlvbmFsQ2FsbGluZ0NvbnYoQ0MpIHx8CisgICAgICBQYXJzZU9wdGlvbmFsQXR0cnMoUmV0QXR0cnMsIDEpIHx8CisgICAgICBQYXJzZVR5cGUoUmV0VHlwZSwgUmV0VHlwZUxvYywgdHJ1ZSAvKnZvaWQgYWxsb3dlZCovKSB8fAorICAgICAgUGFyc2VWYWxJRChDYWxsZWVJRCkgfHwKKyAgICAgIFBhcnNlUGFyYW1ldGVyTGlzdChBcmdMaXN0LCBQRlMpIHx8CisgICAgICBQYXJzZU9wdGlvbmFsQXR0cnMoRm5BdHRycywgMikgfHwKKyAgICAgIFBhcnNlVG9rZW4obGx0b2s6Omt3X3RvLCAiZXhwZWN0ZWQgJ3RvJyBpbiBpbnZva2UiKSB8fAorICAgICAgUGFyc2VUeXBlQW5kQmFzaWNCbG9jayhOb3JtYWxCQiwgUEZTKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6a3dfdW53aW5kLCAiZXhwZWN0ZWQgJ3Vud2luZCcgaW4gaW52b2tlIikgfHwKKyAgICAgIFBhcnNlVHlwZUFuZEJhc2ljQmxvY2soVW53aW5kQkIsIFBGUykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gSWYgUmV0VHlwZSBpcyBhIG5vbi1mdW5jdGlvbiBwb2ludGVyIHR5cGUsIHRoZW4gdGhpcyBpcyB0aGUgc2hvcnQgc3ludGF4CisgIC8vIGZvciB0aGUgY2FsbCwgd2hpY2ggbWVhbnMgdGhhdCBSZXRUeXBlIGlzIGp1c3QgdGhlIHJldHVybiB0eXBlLiAgSW5mZXIgdGhlCisgIC8vIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IHR5cGVzIGZyb20gdGhlIGFyZ3VtZW50cyB0aGF0IGFyZSBwcmVzZW50LgorICBjb25zdCBQb2ludGVyVHlwZSAqUEZUeSA9IDA7CisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqVHkgPSAwOworICBpZiAoIShQRlR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFJldFR5cGUpKSB8fAorICAgICAgIShUeSA9IGR5bl9jYXN0PEZ1bmN0aW9uVHlwZT4oUEZUeS0+Z2V0RWxlbWVudFR5cGUoKSkpKSB7CisgICAgLy8gUHVsbCBvdXQgdGhlIHR5cGVzIG9mIGFsbCBvZiB0aGUgYXJndW1lbnRzLi4uCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IFBhcmFtVHlwZXM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ0xpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIFBhcmFtVHlwZXMucHVzaF9iYWNrKEFyZ0xpc3RbaV0uVi0+Z2V0VHlwZSgpKTsKKworICAgIGlmICghRnVuY3Rpb25UeXBlOjppc1ZhbGlkUmV0dXJuVHlwZShSZXRUeXBlKSkKKyAgICAgIHJldHVybiBFcnJvcihSZXRUeXBlTG9jLCAiSW52YWxpZCByZXN1bHQgdHlwZSBmb3IgTExWTSBmdW5jdGlvbiIpOworCisgICAgVHkgPSBGdW5jdGlvblR5cGU6OmdldChSZXRUeXBlLCBQYXJhbVR5cGVzLCBmYWxzZSk7CisgICAgUEZUeSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHkpOworICB9CisKKyAgLy8gTG9vayB1cCB0aGUgY2FsbGVlLgorICBWYWx1ZSAqQ2FsbGVlOworICBpZiAoQ29udmVydFZhbElEVG9WYWx1ZShQRlR5LCBDYWxsZWVJRCwgQ2FsbGVlLCAmUEZTKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gRklYTUU6IEluIExMVk0gMy4wLCBzdG9wIGFjY2VwdGluZyB6ZXh0LCBzZXh0IGFuZCBpbnJlZyBhcyBvcHRpb25hbAorICAvLyBmdW5jdGlvbiBhdHRyaWJ1dGVzLgorICB1bnNpZ25lZCBPYnNvbGV0ZUZ1bmNBdHRycyA9IEF0dHJpYnV0ZTo6WkV4dHxBdHRyaWJ1dGU6OlNFeHR8QXR0cmlidXRlOjpJblJlZzsKKyAgaWYgKEZuQXR0cnMgJiBPYnNvbGV0ZUZ1bmNBdHRycykgeworICAgIFJldEF0dHJzIHw9IEZuQXR0cnMgJiBPYnNvbGV0ZUZ1bmNBdHRyczsKKyAgICBGbkF0dHJzICY9IH5PYnNvbGV0ZUZ1bmNBdHRyczsKKyAgfQorCisgIC8vIFNldCB1cCB0aGUgQXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9uLgorICBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVXaXRoSW5kZXgsIDg+IEF0dHJzOworICBpZiAoUmV0QXR0cnMgIT0gQXR0cmlidXRlOjpOb25lKQorICAgIEF0dHJzLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCgwLCBSZXRBdHRycykpOworCisgIFNtYWxsVmVjdG9yPFZhbHVlKiwgOD4gQXJnczsKKworICAvLyBMb29wIHRocm91Z2ggRnVuY3Rpb25UeXBlJ3MgYXJndW1lbnRzIGFuZCBlbnN1cmUgdGhleSBhcmUgc3BlY2lmaWVkCisgIC8vIGNvcnJlY3RseS4gIEFsc28sIGdhdGhlciBhbnkgcGFyYW1ldGVyIGF0dHJpYnV0ZXMuCisgIEZ1bmN0aW9uVHlwZTo6cGFyYW1faXRlcmF0b3IgSSA9IFR5LT5wYXJhbV9iZWdpbigpOworICBGdW5jdGlvblR5cGU6OnBhcmFtX2l0ZXJhdG9yIEUgPSBUeS0+cGFyYW1fZW5kKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBUeXBlICpFeHBlY3RlZFR5ID0gMDsKKyAgICBpZiAoSSAhPSBFKSB7CisgICAgICBFeHBlY3RlZFR5ID0gKkkrKzsKKyAgICB9IGVsc2UgaWYgKCFUeS0+aXNWYXJBcmcoKSkgeworICAgICAgcmV0dXJuIEVycm9yKEFyZ0xpc3RbaV0uTG9jLCAidG9vIG1hbnkgYXJndW1lbnRzIHNwZWNpZmllZCIpOworICAgIH0KKworICAgIGlmIChFeHBlY3RlZFR5ICYmIEV4cGVjdGVkVHkgIT0gQXJnTGlzdFtpXS5WLT5nZXRUeXBlKCkpCisgICAgICByZXR1cm4gRXJyb3IoQXJnTGlzdFtpXS5Mb2MsICJhcmd1bWVudCBpcyBub3Qgb2YgZXhwZWN0ZWQgdHlwZSAnIiArCisgICAgICAgICAgICAgICAgICAgRXhwZWN0ZWRUeS0+Z2V0RGVzY3JpcHRpb24oKSArICInIik7CisgICAgQXJncy5wdXNoX2JhY2soQXJnTGlzdFtpXS5WKTsKKyAgICBpZiAoQXJnTGlzdFtpXS5BdHRycyAhPSBBdHRyaWJ1dGU6Ok5vbmUpCisgICAgICBBdHRycy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoaSsxLCBBcmdMaXN0W2ldLkF0dHJzKSk7CisgIH0KKworICBpZiAoSSAhPSBFKQorICAgIHJldHVybiBFcnJvcihDYWxsTG9jLCAibm90IGVub3VnaCBwYXJhbWV0ZXJzIHNwZWNpZmllZCBmb3IgY2FsbCIpOworCisgIGlmIChGbkF0dHJzICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICBBdHRycy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQofjAsIEZuQXR0cnMpKTsKKworICAvLyBGaW5pc2ggb2ZmIHRoZSBBdHRyaWJ1dGVzIGFuZCBjaGVjayB0aGVtCisgIEF0dHJMaXN0UHRyIFBBTCA9IEF0dHJMaXN0UHRyOjpnZXQoQXR0cnMuYmVnaW4oKSwgQXR0cnMuZW5kKCkpOworCisgIEludm9rZUluc3QgKklJID0gSW52b2tlSW5zdDo6Q3JlYXRlKENhbGxlZSwgTm9ybWFsQkIsIFVud2luZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCkpOworICBJSS0+c2V0Q2FsbGluZ0NvbnYoQ0MpOworICBJSS0+c2V0QXR0cmlidXRlcyhQQUwpOworICBJbnN0ID0gSUk7CisgIHJldHVybiBmYWxzZTsKK30KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCaW5hcnkgT3BlcmF0b3JzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFBhcnNlQXJpdGhtZXRpYworLy8vICA6Oj0gQXJpdGhtZXRpY09wcyBUeXBlQW5kVmFsdWUgJywnIFZhbHVlCisvLy8KKy8vLyBJZiBPcGVyYW5kVHlwZSBpcyAwLCB0aGVuIGFueSBGUCBvciBpbnRlZ2VyIG9wZXJhbmQgaXMgYWxsb3dlZC4gIElmIGl0IGlzIDEsCisvLy8gdGhlbiBhbnkgaW50ZWdlciBvcGVyYW5kIGlzIGFsbG93ZWQsIGlmIGl0IGlzIDIsIGFueSBmcCBvcGVyYW5kIGlzIGFsbG93ZWQuCitib29sIExMUGFyc2VyOjpQYXJzZUFyaXRobWV0aWMoSW5zdHJ1Y3Rpb24gKiZJbnN0LCBQZXJGdW5jdGlvblN0YXRlICZQRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BjLCB1bnNpZ25lZCBPcGVyYW5kVHlwZSkgeworICBMb2NUeSBMb2M7IFZhbHVlICpMSFMsICpSSFM7CisgIGlmIChQYXJzZVR5cGVBbmRWYWx1ZShMSFMsIExvYywgUEZTKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCAnLCcgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb24iKSB8fAorICAgICAgUGFyc2VWYWx1ZShMSFMtPmdldFR5cGUoKSwgUkhTLCBQRlMpKQorICAgIHJldHVybiB0cnVlOworCisgIGJvb2wgVmFsaWQ7CisgIHN3aXRjaCAoT3BlcmFuZFR5cGUpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBvcGVyYW5kIHR5cGUhIik7CisgIGNhc2UgMDogLy8gaW50IG9yIEZQLgorICAgIFZhbGlkID0gTEhTLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpIHx8CisgICAgICAgICAgICBMSFMtPmdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpOworICAgIGJyZWFrOworICBjYXNlIDE6IFZhbGlkID0gTEhTLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpOyBicmVhazsKKyAgY2FzZSAyOiBWYWxpZCA9IExIUy0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCk7IGJyZWFrOworICB9CisKKyAgaWYgKCFWYWxpZCkKKyAgICByZXR1cm4gRXJyb3IoTG9jLCAiaW52YWxpZCBvcGVyYW5kIHR5cGUgZm9yIGluc3RydWN0aW9uIik7CisKKyAgSW5zdCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoKEluc3RydWN0aW9uOjpCaW5hcnlPcHMpT3BjLCBMSFMsIFJIUyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlTG9naWNhbAorLy8vICA6Oj0gQXJpdGhtZXRpY09wcyBUeXBlQW5kVmFsdWUgJywnIFZhbHVlIHsKK2Jvb2wgTExQYXJzZXI6OlBhcnNlTG9naWNhbChJbnN0cnVjdGlvbiAqJkluc3QsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGMpIHsKKyAgTG9jVHkgTG9jOyBWYWx1ZSAqTEhTLCAqUkhTOworICBpZiAoUGFyc2VUeXBlQW5kVmFsdWUoTEhTLCBMb2MsIFBGUykgfHwKKyAgICAgIFBhcnNlVG9rZW4obGx0b2s6OmNvbW1hLCAiZXhwZWN0ZWQgJywnIGluIGxvZ2ljYWwgb3BlcmF0aW9uIikgfHwKKyAgICAgIFBhcnNlVmFsdWUoTEhTLT5nZXRUeXBlKCksIFJIUywgUEZTKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoIUxIUy0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSkKKyAgICByZXR1cm4gRXJyb3IoTG9jLCJpbnN0cnVjdGlvbiByZXF1aXJlcyBpbnRlZ2VyIG9yIGludGVnZXIgdmVjdG9yIG9wZXJhbmRzIik7CisKKyAgSW5zdCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoKEluc3RydWN0aW9uOjpCaW5hcnlPcHMpT3BjLCBMSFMsIFJIUyk7CisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gUGFyc2VDb21wYXJlCisvLy8gIDo6PSAnaWNtcCcgSVByZWRpY2F0ZXMgVHlwZUFuZFZhbHVlICcsJyBWYWx1ZQorLy8vICA6Oj0gJ2ZjbXAnIEZQcmVkaWNhdGVzIFR5cGVBbmRWYWx1ZSAnLCcgVmFsdWUKK2Jvb2wgTExQYXJzZXI6OlBhcnNlQ29tcGFyZShJbnN0cnVjdGlvbiAqJkluc3QsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGMpIHsKKyAgLy8gUGFyc2UgdGhlIGludGVnZXIvZnAgY29tcGFyaXNvbiBwcmVkaWNhdGUuCisgIExvY1R5IExvYzsKKyAgdW5zaWduZWQgUHJlZDsKKyAgVmFsdWUgKkxIUywgKlJIUzsKKyAgaWYgKFBhcnNlQ21wUHJlZGljYXRlKFByZWQsIE9wYykgfHwKKyAgICAgIFBhcnNlVHlwZUFuZFZhbHVlKExIUywgTG9jLCBQRlMpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpjb21tYSwgImV4cGVjdGVkICcsJyBhZnRlciBjb21wYXJlIHZhbHVlIikgfHwKKyAgICAgIFBhcnNlVmFsdWUoTEhTLT5nZXRUeXBlKCksIFJIUywgUEZTKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoT3BjID09IEluc3RydWN0aW9uOjpGQ21wKSB7CisgICAgaWYgKCFMSFMtPmdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpKQorICAgICAgcmV0dXJuIEVycm9yKExvYywgImZjbXAgcmVxdWlyZXMgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZHMiKTsKKyAgICBJbnN0ID0gbmV3IEZDbXBJbnN0KENtcEluc3Q6OlByZWRpY2F0ZShQcmVkKSwgTEhTLCBSSFMpOworICB9IGVsc2UgeworICAgIGFzc2VydChPcGMgPT0gSW5zdHJ1Y3Rpb246OklDbXAgJiYgIlVua25vd24gb3Bjb2RlIGZvciBDbXBJbnN0ISIpOworICAgIGlmICghTEhTLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICFMSFMtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgIHJldHVybiBFcnJvcihMb2MsICJpY21wIHJlcXVpcmVzIGludGVnZXIgb3BlcmFuZHMiKTsKKyAgICBJbnN0ID0gbmV3IElDbXBJbnN0KENtcEluc3Q6OlByZWRpY2F0ZShQcmVkKSwgTEhTLCBSSFMpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE90aGVyIEluc3RydWN0aW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8vIFBhcnNlQ2FzdAorLy8vICAgOjo9IENhc3RPcGMgVHlwZUFuZFZhbHVlICd0bycgVHlwZQorYm9vbCBMTFBhcnNlcjo6UGFyc2VDYXN0KEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wYykgeworICBMb2NUeSBMb2M7ICBWYWx1ZSAqT3A7CisgIFBBVHlwZUhvbGRlciBEZXN0VHkoVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpKTsKKyAgaWYgKFBhcnNlVHlwZUFuZFZhbHVlKE9wLCBMb2MsIFBGUykgfHwKKyAgICAgIFBhcnNlVG9rZW4obGx0b2s6Omt3X3RvLCAiZXhwZWN0ZWQgJ3RvJyBhZnRlciBjYXN0IHZhbHVlIikgfHwKKyAgICAgIFBhcnNlVHlwZShEZXN0VHkpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghQ2FzdEluc3Q6OmNhc3RJc1ZhbGlkKChJbnN0cnVjdGlvbjo6Q2FzdE9wcylPcGMsIE9wLCBEZXN0VHkpKSB7CisgICAgQ2FzdEluc3Q6OmNhc3RJc1ZhbGlkKChJbnN0cnVjdGlvbjo6Q2FzdE9wcylPcGMsIE9wLCBEZXN0VHkpOworICAgIHJldHVybiBFcnJvcihMb2MsICJpbnZhbGlkIGNhc3Qgb3Bjb2RlIGZvciBjYXN0IGZyb20gJyIgKworICAgICAgICAgICAgICAgICBPcC0+Z2V0VHlwZSgpLT5nZXREZXNjcmlwdGlvbigpICsgIicgdG8gJyIgKworICAgICAgICAgICAgICAgICBEZXN0VHktPmdldERlc2NyaXB0aW9uKCkgKyAiJyIpOworICB9CisgIEluc3QgPSBDYXN0SW5zdDo6Q3JlYXRlKChJbnN0cnVjdGlvbjo6Q2FzdE9wcylPcGMsIE9wLCBEZXN0VHkpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZVNlbGVjdAorLy8vICAgOjo9ICdzZWxlY3QnIFR5cGVBbmRWYWx1ZSAnLCcgVHlwZUFuZFZhbHVlICcsJyBUeXBlQW5kVmFsdWUKK2Jvb2wgTExQYXJzZXI6OlBhcnNlU2VsZWN0KEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIExvY1R5IExvYzsKKyAgVmFsdWUgKk9wMCwgKk9wMSwgKk9wMjsKKyAgaWYgKFBhcnNlVHlwZUFuZFZhbHVlKE9wMCwgTG9jLCBQRlMpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpjb21tYSwgImV4cGVjdGVkICcsJyBhZnRlciBzZWxlY3QgY29uZGl0aW9uIikgfHwKKyAgICAgIFBhcnNlVHlwZUFuZFZhbHVlKE9wMSwgUEZTKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCAnLCcgYWZ0ZXIgc2VsZWN0IHZhbHVlIikgfHwKKyAgICAgIFBhcnNlVHlwZUFuZFZhbHVlKE9wMiwgUEZTKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoY29uc3QgY2hhciAqUmVhc29uID0gU2VsZWN0SW5zdDo6YXJlSW52YWxpZE9wZXJhbmRzKE9wMCwgT3AxLCBPcDIpKQorICAgIHJldHVybiBFcnJvcihMb2MsIFJlYXNvbik7CisKKyAgSW5zdCA9IFNlbGVjdEluc3Q6OkNyZWF0ZShPcDAsIE9wMSwgT3AyKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VWQV9BcmcKKy8vLyAgIDo6PSAndmFfYXJnJyBUeXBlQW5kVmFsdWUgJywnIFR5cGUKK2Jvb2wgTExQYXJzZXI6OlBhcnNlVkFfQXJnKEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIFZhbHVlICpPcDsKKyAgUEFUeXBlSG9sZGVyIEVsdFR5KFR5cGU6OmdldFZvaWRUeShDb250ZXh0KSk7CisgIExvY1R5IFR5cGVMb2M7CisgIGlmIChQYXJzZVR5cGVBbmRWYWx1ZShPcCwgUEZTKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCAnLCcgYWZ0ZXIgdmFhcmcgb3BlcmFuZCIpIHx8CisgICAgICBQYXJzZVR5cGUoRWx0VHksIFR5cGVMb2MpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghRWx0VHktPmlzRmlyc3RDbGFzc1R5cGUoKSkKKyAgICByZXR1cm4gRXJyb3IoVHlwZUxvYywgInZhX2FyZyByZXF1aXJlcyBvcGVyYW5kIHdpdGggZmlyc3QgY2xhc3MgdHlwZSIpOworCisgIEluc3QgPSBuZXcgVkFBcmdJbnN0KE9wLCBFbHRUeSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRXh0cmFjdEVsZW1lbnQKKy8vLyAgIDo6PSAnZXh0cmFjdGVsZW1lbnQnIFR5cGVBbmRWYWx1ZSAnLCcgVHlwZUFuZFZhbHVlCitib29sIExMUGFyc2VyOjpQYXJzZUV4dHJhY3RFbGVtZW50KEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIExvY1R5IExvYzsKKyAgVmFsdWUgKk9wMCwgKk9wMTsKKyAgaWYgKFBhcnNlVHlwZUFuZFZhbHVlKE9wMCwgTG9jLCBQRlMpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpjb21tYSwgImV4cGVjdGVkICcsJyBhZnRlciBleHRyYWN0IHZhbHVlIikgfHwKKyAgICAgIFBhcnNlVHlwZUFuZFZhbHVlKE9wMSwgUEZTKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoIUV4dHJhY3RFbGVtZW50SW5zdDo6aXNWYWxpZE9wZXJhbmRzKE9wMCwgT3AxKSkKKyAgICByZXR1cm4gRXJyb3IoTG9jLCAiaW52YWxpZCBleHRyYWN0ZWxlbWVudCBvcGVyYW5kcyIpOworCisgIEluc3QgPSBFeHRyYWN0RWxlbWVudEluc3Q6OkNyZWF0ZShPcDAsIE9wMSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlSW5zZXJ0RWxlbWVudAorLy8vICAgOjo9ICdpbnNlcnRlbGVtZW50JyBUeXBlQW5kVmFsdWUgJywnIFR5cGVBbmRWYWx1ZSAnLCcgVHlwZUFuZFZhbHVlCitib29sIExMUGFyc2VyOjpQYXJzZUluc2VydEVsZW1lbnQoSW5zdHJ1Y3Rpb24gKiZJbnN0LCBQZXJGdW5jdGlvblN0YXRlICZQRlMpIHsKKyAgTG9jVHkgTG9jOworICBWYWx1ZSAqT3AwLCAqT3AxLCAqT3AyOworICBpZiAoUGFyc2VUeXBlQW5kVmFsdWUoT3AwLCBMb2MsIFBGUykgfHwKKyAgICAgIFBhcnNlVG9rZW4obGx0b2s6OmNvbW1hLCAiZXhwZWN0ZWQgJywnIGFmdGVyIGluc2VydGVsZW1lbnQgdmFsdWUiKSB8fAorICAgICAgUGFyc2VUeXBlQW5kVmFsdWUoT3AxLCBQRlMpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpjb21tYSwgImV4cGVjdGVkICcsJyBhZnRlciBpbnNlcnRlbGVtZW50IHZhbHVlIikgfHwKKyAgICAgIFBhcnNlVHlwZUFuZFZhbHVlKE9wMiwgUEZTKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoIUluc2VydEVsZW1lbnRJbnN0Ojppc1ZhbGlkT3BlcmFuZHMoT3AwLCBPcDEsIE9wMikpCisgICAgcmV0dXJuIEVycm9yKExvYywgImludmFsaWQgaW5zZXJ0ZWxlbWVudCBvcGVyYW5kcyIpOworCisgIEluc3QgPSBJbnNlcnRFbGVtZW50SW5zdDo6Q3JlYXRlKE9wMCwgT3AxLCBPcDIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZVNodWZmbGVWZWN0b3IKKy8vLyAgIDo6PSAnc2h1ZmZsZXZlY3RvcicgVHlwZUFuZFZhbHVlICcsJyBUeXBlQW5kVmFsdWUgJywnIFR5cGVBbmRWYWx1ZQorYm9vbCBMTFBhcnNlcjo6UGFyc2VTaHVmZmxlVmVjdG9yKEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIExvY1R5IExvYzsKKyAgVmFsdWUgKk9wMCwgKk9wMSwgKk9wMjsKKyAgaWYgKFBhcnNlVHlwZUFuZFZhbHVlKE9wMCwgTG9jLCBQRlMpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpjb21tYSwgImV4cGVjdGVkICcsJyBhZnRlciBzaHVmZmxlIG1hc2siKSB8fAorICAgICAgUGFyc2VUeXBlQW5kVmFsdWUoT3AxLCBQRlMpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpjb21tYSwgImV4cGVjdGVkICcsJyBhZnRlciBzaHVmZmxlIHZhbHVlIikgfHwKKyAgICAgIFBhcnNlVHlwZUFuZFZhbHVlKE9wMiwgUEZTKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoIVNodWZmbGVWZWN0b3JJbnN0Ojppc1ZhbGlkT3BlcmFuZHMoT3AwLCBPcDEsIE9wMikpCisgICAgcmV0dXJuIEVycm9yKExvYywgImludmFsaWQgZXh0cmFjdGVsZW1lbnQgb3BlcmFuZHMiKTsKKworICBJbnN0ID0gbmV3IFNodWZmbGVWZWN0b3JJbnN0KE9wMCwgT3AxLCBPcDIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZVBISQorLy8vICAgOjo9ICdwaGknIFR5cGUgJ1snIFZhbHVlICcsJyBWYWx1ZSAnXScgKCcsJyAnWycgVmFsdWUgJywnIFZhbHVlICddJykqCitpbnQgTExQYXJzZXI6OlBhcnNlUEhJKEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIFBBVHlwZUhvbGRlciBUeShUeXBlOjpnZXRWb2lkVHkoQ29udGV4dCkpOworICBWYWx1ZSAqT3AwLCAqT3AxOworICBMb2NUeSBUeXBlTG9jID0gTGV4LmdldExvYygpOworCisgIGlmIChQYXJzZVR5cGUoVHkpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpsc3F1YXJlLCAiZXhwZWN0ZWQgJ1snIGluIHBoaSB2YWx1ZSBsaXN0IikgfHwKKyAgICAgIFBhcnNlVmFsdWUoVHksIE9wMCwgUEZTKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCAnLCcgYWZ0ZXIgaW5zZXJ0ZWxlbWVudCB2YWx1ZSIpIHx8CisgICAgICBQYXJzZVZhbHVlKFR5cGU6OmdldExhYmVsVHkoQ29udGV4dCksIE9wMSwgUEZTKSB8fAorICAgICAgUGFyc2VUb2tlbihsbHRvazo6cnNxdWFyZSwgImV4cGVjdGVkICddJyBpbiBwaGkgdmFsdWUgbGlzdCIpKQorICAgIHJldHVybiB0cnVlOworCisgIGJvb2wgQXRlRXh0cmFDb21tYSA9IGZhbHNlOworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8VmFsdWUqLCBCYXNpY0Jsb2NrKj4sIDE2PiBQSElWYWxzOworICB3aGlsZSAoMSkgeworICAgIFBISVZhbHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE9wMCwgY2FzdDxCYXNpY0Jsb2NrPihPcDEpKSk7CisKKyAgICBpZiAoIUVhdElmUHJlc2VudChsbHRvazo6Y29tbWEpKQorICAgICAgYnJlYWs7CisKKyAgICBpZiAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6TWV0YWRhdGFWYXIpIHsKKyAgICAgIEF0ZUV4dHJhQ29tbWEgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKFBhcnNlVG9rZW4obGx0b2s6OmxzcXVhcmUsICJleHBlY3RlZCAnWycgaW4gcGhpIHZhbHVlIGxpc3QiKSB8fAorICAgICAgICBQYXJzZVZhbHVlKFR5LCBPcDAsIFBGUykgfHwKKyAgICAgICAgUGFyc2VUb2tlbihsbHRvazo6Y29tbWEsICJleHBlY3RlZCAnLCcgYWZ0ZXIgaW5zZXJ0ZWxlbWVudCB2YWx1ZSIpIHx8CisgICAgICAgIFBhcnNlVmFsdWUoVHlwZTo6Z2V0TGFiZWxUeShDb250ZXh0KSwgT3AxLCBQRlMpIHx8CisgICAgICAgIFBhcnNlVG9rZW4obGx0b2s6OnJzcXVhcmUsICJleHBlY3RlZCAnXScgaW4gcGhpIHZhbHVlIGxpc3QiKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKCFUeS0+aXNGaXJzdENsYXNzVHlwZSgpKQorICAgIHJldHVybiBFcnJvcihUeXBlTG9jLCAicGhpIG5vZGUgbXVzdCBoYXZlIGZpcnN0IGNsYXNzIHR5cGUiKTsKKworICBQSElOb2RlICpQTiA9IFBISU5vZGU6OkNyZWF0ZShUeSk7CisgIFBOLT5yZXNlcnZlT3BlcmFuZFNwYWNlKFBISVZhbHMuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBISVZhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBQTi0+YWRkSW5jb21pbmcoUEhJVmFsc1tpXS5maXJzdCwgUEhJVmFsc1tpXS5zZWNvbmQpOworICBJbnN0ID0gUE47CisgIHJldHVybiBBdGVFeHRyYUNvbW1hID8gSW5zdEV4dHJhQ29tbWEgOiBJbnN0Tm9ybWFsOworfQorCisvLy8gUGFyc2VDYWxsCisvLy8gICA6Oj0gJ3RhaWwnPyAnY2FsbCcgT3B0aW9uYWxDYWxsaW5nQ29udiBPcHRpb25hbEF0dHJzIFR5cGUgVmFsdWUKKy8vLyAgICAgICBQYXJhbWV0ZXJMaXN0IE9wdGlvbmFsQXR0cnMKK2Jvb2wgTExQYXJzZXI6OlBhcnNlQ2FsbChJbnN0cnVjdGlvbiAqJkluc3QsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFpbCkgeworICB1bnNpZ25lZCBSZXRBdHRycywgRm5BdHRyczsKKyAgQ2FsbGluZ0NvbnY6OklEIENDOworICBQQVR5cGVIb2xkZXIgUmV0VHlwZShUeXBlOjpnZXRWb2lkVHkoQ29udGV4dCkpOworICBMb2NUeSBSZXRUeXBlTG9jOworICBWYWxJRCBDYWxsZWVJRDsKKyAgU21hbGxWZWN0b3I8UGFyYW1JbmZvLCAxNj4gQXJnTGlzdDsKKyAgTG9jVHkgQ2FsbExvYyA9IExleC5nZXRMb2MoKTsKKworICBpZiAoKGlzVGFpbCAmJiBQYXJzZVRva2VuKGxsdG9rOjprd19jYWxsLCAiZXhwZWN0ZWQgJ3RhaWwgY2FsbCciKSkgfHwKKyAgICAgIFBhcnNlT3B0aW9uYWxDYWxsaW5nQ29udihDQykgfHwKKyAgICAgIFBhcnNlT3B0aW9uYWxBdHRycyhSZXRBdHRycywgMSkgfHwKKyAgICAgIFBhcnNlVHlwZShSZXRUeXBlLCBSZXRUeXBlTG9jLCB0cnVlIC8qdm9pZCBhbGxvd2VkKi8pIHx8CisgICAgICBQYXJzZVZhbElEKENhbGxlZUlEKSB8fAorICAgICAgUGFyc2VQYXJhbWV0ZXJMaXN0KEFyZ0xpc3QsIFBGUykgfHwKKyAgICAgIFBhcnNlT3B0aW9uYWxBdHRycyhGbkF0dHJzLCAyKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiBSZXRUeXBlIGlzIGEgbm9uLWZ1bmN0aW9uIHBvaW50ZXIgdHlwZSwgdGhlbiB0aGlzIGlzIHRoZSBzaG9ydCBzeW50YXgKKyAgLy8gZm9yIHRoZSBjYWxsLCB3aGljaCBtZWFucyB0aGF0IFJldFR5cGUgaXMganVzdCB0aGUgcmV0dXJuIHR5cGUuICBJbmZlciB0aGUKKyAgLy8gcmVzdCBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgdHlwZXMgZnJvbSB0aGUgYXJndW1lbnRzIHRoYXQgYXJlIHByZXNlbnQuCisgIGNvbnN0IFBvaW50ZXJUeXBlICpQRlR5ID0gMDsKKyAgY29uc3QgRnVuY3Rpb25UeXBlICpUeSA9IDA7CisgIGlmICghKFBGVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oUmV0VHlwZSkpIHx8CisgICAgICAhKFR5ID0gZHluX2Nhc3Q8RnVuY3Rpb25UeXBlPihQRlR5LT5nZXRFbGVtZW50VHlwZSgpKSkpIHsKKyAgICAvLyBQdWxsIG91dCB0aGUgdHlwZXMgb2YgYWxsIG9mIHRoZSBhcmd1bWVudHMuLi4KKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gUGFyYW1UeXBlczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgUGFyYW1UeXBlcy5wdXNoX2JhY2soQXJnTGlzdFtpXS5WLT5nZXRUeXBlKCkpOworCisgICAgaWYgKCFGdW5jdGlvblR5cGU6OmlzVmFsaWRSZXR1cm5UeXBlKFJldFR5cGUpKQorICAgICAgcmV0dXJuIEVycm9yKFJldFR5cGVMb2MsICJJbnZhbGlkIHJlc3VsdCB0eXBlIGZvciBMTFZNIGZ1bmN0aW9uIik7CisKKyAgICBUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KFJldFR5cGUsIFBhcmFtVHlwZXMsIGZhbHNlKTsKKyAgICBQRlR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChUeSk7CisgIH0KKworICAvLyBMb29rIHVwIHRoZSBjYWxsZWUuCisgIFZhbHVlICpDYWxsZWU7CisgIGlmIChDb252ZXJ0VmFsSURUb1ZhbHVlKFBGVHksIENhbGxlZUlELCBDYWxsZWUsICZQRlMpKSByZXR1cm4gdHJ1ZTsKKworICAvLyBGSVhNRTogSW4gTExWTSAzLjAsIHN0b3AgYWNjZXB0aW5nIHpleHQsIHNleHQgYW5kIGlucmVnIGFzIG9wdGlvbmFsCisgIC8vIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuCisgIHVuc2lnbmVkIE9ic29sZXRlRnVuY0F0dHJzID0gQXR0cmlidXRlOjpaRXh0fEF0dHJpYnV0ZTo6U0V4dHxBdHRyaWJ1dGU6OkluUmVnOworICBpZiAoRm5BdHRycyAmIE9ic29sZXRlRnVuY0F0dHJzKSB7CisgICAgUmV0QXR0cnMgfD0gRm5BdHRycyAmIE9ic29sZXRlRnVuY0F0dHJzOworICAgIEZuQXR0cnMgJj0gfk9ic29sZXRlRnVuY0F0dHJzOworICB9CisKKyAgLy8gU2V0IHVwIHRoZSBBdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb24uCisgIFNtYWxsVmVjdG9yPEF0dHJpYnV0ZVdpdGhJbmRleCwgOD4gQXR0cnM7CisgIGlmIChSZXRBdHRycyAhPSBBdHRyaWJ1dGU6Ok5vbmUpCisgICAgQXR0cnMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KDAsIFJldEF0dHJzKSk7CisKKyAgU21hbGxWZWN0b3I8VmFsdWUqLCA4PiBBcmdzOworCisgIC8vIExvb3AgdGhyb3VnaCBGdW5jdGlvblR5cGUncyBhcmd1bWVudHMgYW5kIGVuc3VyZSB0aGV5IGFyZSBzcGVjaWZpZWQKKyAgLy8gY29ycmVjdGx5LiAgQWxzbywgZ2F0aGVyIGFueSBwYXJhbWV0ZXIgYXR0cmlidXRlcy4KKyAgRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBJID0gVHktPnBhcmFtX2JlZ2luKCk7CisgIEZ1bmN0aW9uVHlwZTo6cGFyYW1faXRlcmF0b3IgRSA9IFR5LT5wYXJhbV9lbmQoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ0xpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IFR5cGUgKkV4cGVjdGVkVHkgPSAwOworICAgIGlmIChJICE9IEUpIHsKKyAgICAgIEV4cGVjdGVkVHkgPSAqSSsrOworICAgIH0gZWxzZSBpZiAoIVR5LT5pc1ZhckFyZygpKSB7CisgICAgICByZXR1cm4gRXJyb3IoQXJnTGlzdFtpXS5Mb2MsICJ0b28gbWFueSBhcmd1bWVudHMgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgaWYgKEV4cGVjdGVkVHkgJiYgRXhwZWN0ZWRUeSAhPSBBcmdMaXN0W2ldLlYtPmdldFR5cGUoKSkKKyAgICAgIHJldHVybiBFcnJvcihBcmdMaXN0W2ldLkxvYywgImFyZ3VtZW50IGlzIG5vdCBvZiBleHBlY3RlZCB0eXBlICciICsKKyAgICAgICAgICAgICAgICAgICBFeHBlY3RlZFR5LT5nZXREZXNjcmlwdGlvbigpICsgIiciKTsKKyAgICBBcmdzLnB1c2hfYmFjayhBcmdMaXN0W2ldLlYpOworICAgIGlmIChBcmdMaXN0W2ldLkF0dHJzICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICAgIEF0dHJzLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldChpKzEsIEFyZ0xpc3RbaV0uQXR0cnMpKTsKKyAgfQorCisgIGlmIChJICE9IEUpCisgICAgcmV0dXJuIEVycm9yKENhbGxMb2MsICJub3QgZW5vdWdoIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGZvciBjYWxsIik7CisKKyAgaWYgKEZuQXR0cnMgIT0gQXR0cmlidXRlOjpOb25lKQorICAgIEF0dHJzLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCh+MCwgRm5BdHRycykpOworCisgIC8vIEZpbmlzaCBvZmYgdGhlIEF0dHJpYnV0ZXMgYW5kIGNoZWNrIHRoZW0KKyAgQXR0ckxpc3RQdHIgUEFMID0gQXR0ckxpc3RQdHI6OmdldChBdHRycy5iZWdpbigpLCBBdHRycy5lbmQoKSk7CisKKyAgQ2FsbEluc3QgKkNJID0gQ2FsbEluc3Q6OkNyZWF0ZShDYWxsZWUsIEFyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKSk7CisgIENJLT5zZXRUYWlsQ2FsbChpc1RhaWwpOworICBDSS0+c2V0Q2FsbGluZ0NvbnYoQ0MpOworICBDSS0+c2V0QXR0cmlidXRlcyhQQUwpOworICBJbnN0ID0gQ0k7CisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1lbW9yeSBJbnN0cnVjdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gUGFyc2VBbGxvYworLy8vICAgOjo9ICdtYWxsb2MnIFR5cGUgKCcsJyBUeXBlQW5kVmFsdWUpPyAoJywnIE9wdGlvbmFsSW5mbyk/CisvLy8gICA6Oj0gJ2FsbG9jYScgVHlwZSAoJywnIFR5cGVBbmRWYWx1ZSk/ICgnLCcgT3B0aW9uYWxJbmZvKT8KK2ludCBMTFBhcnNlcjo6UGFyc2VBbGxvYyhJbnN0cnVjdGlvbiAqJkluc3QsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBCQiwgYm9vbCBpc0FsbG9jYSkgeworICBQQVR5cGVIb2xkZXIgVHkoVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpKTsKKyAgVmFsdWUgKlNpemUgPSAwOworICBMb2NUeSBTaXplTG9jOworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAwOworICBpZiAoUGFyc2VUeXBlKFR5KSkgcmV0dXJuIHRydWU7CisKKyAgYm9vbCBBdGVFeHRyYUNvbW1hID0gZmFsc2U7CisgIGlmIChFYXRJZlByZXNlbnQobGx0b2s6OmNvbW1hKSkgeworICAgIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjprd19hbGlnbikgeworICAgICAgaWYgKFBhcnNlT3B0aW9uYWxBbGlnbm1lbnQoQWxpZ25tZW50KSkgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChMZXguZ2V0S2luZCgpID09IGxsdG9rOjpNZXRhZGF0YVZhcikgeworICAgICAgQXRlRXh0cmFDb21tYSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChQYXJzZVR5cGVBbmRWYWx1ZShTaXplLCBTaXplTG9jLCBQRlMpIHx8CisgICAgICAgICAgUGFyc2VPcHRpb25hbENvbW1hQWxpZ24oQWxpZ25tZW50LCBBdGVFeHRyYUNvbW1hKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKFNpemUgJiYgIVNpemUtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkKKyAgICByZXR1cm4gRXJyb3IoU2l6ZUxvYywgImVsZW1lbnQgY291bnQgbXVzdCBoYXZlIGludGVnZXIgdHlwZSIpOworCisgIGlmIChpc0FsbG9jYSkgeworICAgIEluc3QgPSBuZXcgQWxsb2NhSW5zdChUeSwgU2l6ZSwgQWxpZ25tZW50KTsKKyAgICByZXR1cm4gQXRlRXh0cmFDb21tYSA/IEluc3RFeHRyYUNvbW1hIDogSW5zdE5vcm1hbDsKKyAgfQorCisgIC8vIEF1dG91cGdyYWRlIG9sZCBtYWxsb2MgaW5zdHJ1Y3Rpb24gdG8gbWFsbG9jIGNhbGwuCisgIC8vIEZJWE1FOiBSZW1vdmUgaW4gTExWTSAzLjAuCisgIGlmIChTaXplICYmICFTaXplLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDMyKSkKKyAgICByZXR1cm4gRXJyb3IoU2l6ZUxvYywgImVsZW1lbnQgY291bnQgbXVzdCBiZSBpMzIiKTsKKyAgY29uc3QgVHlwZSAqSW50UHRyVHkgPSBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpOworICBDb25zdGFudCAqQWxsb2NTaXplID0gQ29uc3RhbnRFeHByOjpnZXRTaXplT2YoVHkpOworICBBbGxvY1NpemUgPSBDb25zdGFudEV4cHI6OmdldFRydW5jT3JCaXRDYXN0KEFsbG9jU2l6ZSwgSW50UHRyVHkpOworICBpZiAoIU1hbGxvY0YpCisgICAgLy8gUHJvdG90eXBlIG1hbGxvYyBhcyAidm9pZCAqKGludDMyKSIuCisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyByZW5hbWVkIGFzICJtYWxsb2MiIGluIFZhbGlkYXRlRW5kT2ZNb2R1bGUoKS4KKyAgICBNYWxsb2NGID0gY2FzdDxGdW5jdGlvbj4oCisgICAgICAgTS0+Z2V0T3JJbnNlcnRGdW5jdGlvbigiIiwgVHlwZTo6Z2V0SW50OFB0clR5KENvbnRleHQpLCBJbnRQdHJUeSwgTlVMTCkpOworICBJbnN0ID0gQ2FsbEluc3Q6OkNyZWF0ZU1hbGxvYyhCQiwgSW50UHRyVHksIFR5LCBBbGxvY1NpemUsIFNpemUsIE1hbGxvY0YpOworcmV0dXJuIEF0ZUV4dHJhQ29tbWEgPyBJbnN0RXh0cmFDb21tYSA6IEluc3ROb3JtYWw7Cit9CisKKy8vLyBQYXJzZUZyZWUKKy8vLyAgIDo6PSAnZnJlZScgVHlwZUFuZFZhbHVlCitib29sIExMUGFyc2VyOjpQYXJzZUZyZWUoSW5zdHJ1Y3Rpb24gKiZJbnN0LCBQZXJGdW5jdGlvblN0YXRlICZQRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayogQkIpIHsKKyAgVmFsdWUgKlZhbDsgTG9jVHkgTG9jOworICBpZiAoUGFyc2VUeXBlQW5kVmFsdWUoVmFsLCBMb2MsIFBGUykpIHJldHVybiB0cnVlOworICBpZiAoIVZhbC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgIHJldHVybiBFcnJvcihMb2MsICJvcGVyYW5kIHRvIGZyZWUgbXVzdCBiZSBhIHBvaW50ZXIiKTsKKyAgSW5zdCA9IENhbGxJbnN0OjpDcmVhdGVGcmVlKFZhbCwgQkIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZUxvYWQKKy8vLyAgIDo6PSAndm9sYXRpbGUnPyAnbG9hZCcgVHlwZUFuZFZhbHVlICgnLCcgT3B0aW9uYWxJbmZvKT8KK2ludCBMTFBhcnNlcjo6UGFyc2VMb2FkKEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlKSB7CisgIFZhbHVlICpWYWw7IExvY1R5IExvYzsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gMDsKKyAgYm9vbCBBdGVFeHRyYUNvbW1hID0gZmFsc2U7CisgIGlmIChQYXJzZVR5cGVBbmRWYWx1ZShWYWwsIExvYywgUEZTKSB8fAorICAgICAgUGFyc2VPcHRpb25hbENvbW1hQWxpZ24oQWxpZ25tZW50LCBBdGVFeHRyYUNvbW1hKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoIVZhbC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpIHx8CisgICAgICAhY2FzdDxQb2ludGVyVHlwZT4oVmFsLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpLT5pc0ZpcnN0Q2xhc3NUeXBlKCkpCisgICAgcmV0dXJuIEVycm9yKExvYywgImxvYWQgb3BlcmFuZCBtdXN0IGJlIGEgcG9pbnRlciB0byBhIGZpcnN0IGNsYXNzIHR5cGUiKTsKKworICBJbnN0ID0gbmV3IExvYWRJbnN0KFZhbCwgIiIsIGlzVm9sYXRpbGUsIEFsaWdubWVudCk7CisgIHJldHVybiBBdGVFeHRyYUNvbW1hID8gSW5zdEV4dHJhQ29tbWEgOiBJbnN0Tm9ybWFsOworfQorCisvLy8gUGFyc2VTdG9yZQorLy8vICAgOjo9ICd2b2xhdGlsZSc/ICdzdG9yZScgVHlwZUFuZFZhbHVlICcsJyBUeXBlQW5kVmFsdWUgKCcsJyAnYWxpZ24nIGkzMik/CitpbnQgTExQYXJzZXI6OlBhcnNlU3RvcmUoSW5zdHJ1Y3Rpb24gKiZJbnN0LCBQZXJGdW5jdGlvblN0YXRlICZQRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlKSB7CisgIFZhbHVlICpWYWwsICpQdHI7IExvY1R5IExvYywgUHRyTG9jOworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAwOworICBib29sIEF0ZUV4dHJhQ29tbWEgPSBmYWxzZTsKKyAgaWYgKFBhcnNlVHlwZUFuZFZhbHVlKFZhbCwgTG9jLCBQRlMpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpjb21tYSwgImV4cGVjdGVkICcsJyBhZnRlciBzdG9yZSBvcGVyYW5kIikgfHwKKyAgICAgIFBhcnNlVHlwZUFuZFZhbHVlKFB0ciwgUHRyTG9jLCBQRlMpIHx8CisgICAgICBQYXJzZU9wdGlvbmFsQ29tbWFBbGlnbihBbGlnbm1lbnQsIEF0ZUV4dHJhQ29tbWEpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghUHRyLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgcmV0dXJuIEVycm9yKFB0ckxvYywgInN0b3JlIG9wZXJhbmQgbXVzdCBiZSBhIHBvaW50ZXIiKTsKKyAgaWYgKCFWYWwtPmdldFR5cGUoKS0+aXNGaXJzdENsYXNzVHlwZSgpKQorICAgIHJldHVybiBFcnJvcihMb2MsICJzdG9yZSBvcGVyYW5kIG11c3QgYmUgYSBmaXJzdCBjbGFzcyB2YWx1ZSIpOworICBpZiAoY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpICE9IFZhbC0+Z2V0VHlwZSgpKQorICAgIHJldHVybiBFcnJvcihMb2MsICJzdG9yZWQgdmFsdWUgYW5kIHBvaW50ZXIgdHlwZSBkbyBub3QgbWF0Y2giKTsKKworICBJbnN0ID0gbmV3IFN0b3JlSW5zdChWYWwsIFB0ciwgaXNWb2xhdGlsZSwgQWxpZ25tZW50KTsKKyAgcmV0dXJuIEF0ZUV4dHJhQ29tbWEgPyBJbnN0RXh0cmFDb21tYSA6IEluc3ROb3JtYWw7Cit9CisKKy8vLyBQYXJzZUdldFJlc3VsdAorLy8vICAgOjo9ICdnZXRyZXN1bHQnIFR5cGVBbmRWYWx1ZSAnLCcgaTMyCisvLy8gRklYTUU6IFJlbW92ZSBzdXBwb3J0IGZvciBnZXRyZXN1bHQgaW4gTExWTSAzLjAKK2Jvb2wgTExQYXJzZXI6OlBhcnNlR2V0UmVzdWx0KEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIFZhbHVlICpWYWw7IExvY1R5IFZhbExvYywgRWx0TG9jOworICB1bnNpZ25lZCBFbGVtZW50OworICBpZiAoUGFyc2VUeXBlQW5kVmFsdWUoVmFsLCBWYWxMb2MsIFBGUykgfHwKKyAgICAgIFBhcnNlVG9rZW4obGx0b2s6OmNvbW1hLCAiZXhwZWN0ZWQgJywnIGFmdGVyIGdldHJlc3VsdCBvcGVyYW5kIikgfHwKKyAgICAgIFBhcnNlVUludDMyKEVsZW1lbnQsIEVsdExvYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKCFWYWwtPmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpICYmICFWYWwtPmdldFR5cGUoKS0+aXNBcnJheVR5KCkpCisgICAgcmV0dXJuIEVycm9yKFZhbExvYywgImdldHJlc3VsdCBpbnN0IHJlcXVpcmVzIGFuIGFnZ3JlZ2F0ZSBvcGVyYW5kIik7CisgIGlmICghRXh0cmFjdFZhbHVlSW5zdDo6Z2V0SW5kZXhlZFR5cGUoVmFsLT5nZXRUeXBlKCksIEVsZW1lbnQpKQorICAgIHJldHVybiBFcnJvcihFbHRMb2MsICJpbnZhbGlkIGdldHJlc3VsdCBpbmRleCBmb3IgdmFsdWUiKTsKKyAgSW5zdCA9IEV4dHJhY3RWYWx1ZUluc3Q6OkNyZWF0ZShWYWwsIEVsZW1lbnQpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZUdldEVsZW1lbnRQdHIKKy8vLyAgIDo6PSAnZ2V0ZWxlbWVudHB0cicgJ2luYm91bmRzJz8gVHlwZUFuZFZhbHVlICgnLCcgVHlwZUFuZFZhbHVlKSoKK2ludCBMTFBhcnNlcjo6UGFyc2VHZXRFbGVtZW50UHRyKEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKSB7CisgIFZhbHVlICpQdHIsICpWYWw7IExvY1R5IExvYywgRWx0TG9jOworCisgIGJvb2wgSW5Cb3VuZHMgPSBFYXRJZlByZXNlbnQobGx0b2s6Omt3X2luYm91bmRzKTsKKworICBpZiAoUGFyc2VUeXBlQW5kVmFsdWUoUHRyLCBMb2MsIFBGUykpIHJldHVybiB0cnVlOworCisgIGlmICghUHRyLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgcmV0dXJuIEVycm9yKExvYywgImJhc2Ugb2YgZ2V0ZWxlbWVudHB0ciBtdXN0IGJlIGEgcG9pbnRlciIpOworCisgIFNtYWxsVmVjdG9yPFZhbHVlKiwgMTY+IEluZGljZXM7CisgIGJvb2wgQXRlRXh0cmFDb21tYSA9IGZhbHNlOworICB3aGlsZSAoRWF0SWZQcmVzZW50KGxsdG9rOjpjb21tYSkpIHsKKyAgICBpZiAoTGV4LmdldEtpbmQoKSA9PSBsbHRvazo6TWV0YWRhdGFWYXIpIHsKKyAgICAgIEF0ZUV4dHJhQ29tbWEgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChQYXJzZVR5cGVBbmRWYWx1ZShWYWwsIEVsdExvYywgUEZTKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKCFWYWwtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkKKyAgICAgIHJldHVybiBFcnJvcihFbHRMb2MsICJnZXRlbGVtZW50cHRyIGluZGV4IG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgIEluZGljZXMucHVzaF9iYWNrKFZhbCk7CisgIH0KKworICBpZiAoIUdldEVsZW1lbnRQdHJJbnN0OjpnZXRJbmRleGVkVHlwZShQdHItPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcy5iZWdpbigpLCBJbmRpY2VzLmVuZCgpKSkKKyAgICByZXR1cm4gRXJyb3IoTG9jLCAiaW52YWxpZCBnZXRlbGVtZW50cHRyIGluZGljZXMiKTsKKyAgSW5zdCA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoUHRyLCBJbmRpY2VzLmJlZ2luKCksIEluZGljZXMuZW5kKCkpOworICBpZiAoSW5Cb3VuZHMpCisgICAgY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oSW5zdCktPnNldElzSW5Cb3VuZHModHJ1ZSk7CisgIHJldHVybiBBdGVFeHRyYUNvbW1hID8gSW5zdEV4dHJhQ29tbWEgOiBJbnN0Tm9ybWFsOworfQorCisvLy8gUGFyc2VFeHRyYWN0VmFsdWUKKy8vLyAgIDo6PSAnZXh0cmFjdHZhbHVlJyBUeXBlQW5kVmFsdWUgKCcsJyB1aW50MzIpKworaW50IExMUGFyc2VyOjpQYXJzZUV4dHJhY3RWYWx1ZShJbnN0cnVjdGlvbiAqJkluc3QsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUykgeworICBWYWx1ZSAqVmFsOyBMb2NUeSBMb2M7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJbmRpY2VzOworICBib29sIEF0ZUV4dHJhQ29tbWE7CisgIGlmIChQYXJzZVR5cGVBbmRWYWx1ZShWYWwsIExvYywgUEZTKSB8fAorICAgICAgUGFyc2VJbmRleExpc3QoSW5kaWNlcywgQXRlRXh0cmFDb21tYSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKCFWYWwtPmdldFR5cGUoKS0+aXNBZ2dyZWdhdGVUeXBlKCkpCisgICAgcmV0dXJuIEVycm9yKExvYywgImV4dHJhY3R2YWx1ZSBvcGVyYW5kIG11c3QgYmUgYWdncmVnYXRlIHR5cGUiKTsKKworICBpZiAoIUV4dHJhY3RWYWx1ZUluc3Q6OmdldEluZGV4ZWRUeXBlKFZhbC0+Z2V0VHlwZSgpLCBJbmRpY2VzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcy5lbmQoKSkpCisgICAgcmV0dXJuIEVycm9yKExvYywgImludmFsaWQgaW5kaWNlcyBmb3IgZXh0cmFjdHZhbHVlIik7CisgIEluc3QgPSBFeHRyYWN0VmFsdWVJbnN0OjpDcmVhdGUoVmFsLCBJbmRpY2VzLmJlZ2luKCksIEluZGljZXMuZW5kKCkpOworICByZXR1cm4gQXRlRXh0cmFDb21tYSA/IEluc3RFeHRyYUNvbW1hIDogSW5zdE5vcm1hbDsKK30KKworLy8vIFBhcnNlSW5zZXJ0VmFsdWUKKy8vLyAgIDo6PSAnaW5zZXJ0dmFsdWUnIFR5cGVBbmRWYWx1ZSAnLCcgVHlwZUFuZFZhbHVlICgnLCcgdWludDMyKSsKK2ludCBMTFBhcnNlcjo6UGFyc2VJbnNlcnRWYWx1ZShJbnN0cnVjdGlvbiAqJkluc3QsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUykgeworICBWYWx1ZSAqVmFsMCwgKlZhbDE7IExvY1R5IExvYzAsIExvYzE7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJbmRpY2VzOworICBib29sIEF0ZUV4dHJhQ29tbWE7CisgIGlmIChQYXJzZVR5cGVBbmRWYWx1ZShWYWwwLCBMb2MwLCBQRlMpIHx8CisgICAgICBQYXJzZVRva2VuKGxsdG9rOjpjb21tYSwgImV4cGVjdGVkIGNvbW1hIGFmdGVyIGluc2VydHZhbHVlIG9wZXJhbmQiKSB8fAorICAgICAgUGFyc2VUeXBlQW5kVmFsdWUoVmFsMSwgTG9jMSwgUEZTKSB8fAorICAgICAgUGFyc2VJbmRleExpc3QoSW5kaWNlcywgQXRlRXh0cmFDb21tYSkpCisgICAgcmV0dXJuIHRydWU7CisgIAorICBpZiAoIVZhbDAtPmdldFR5cGUoKS0+aXNBZ2dyZWdhdGVUeXBlKCkpCisgICAgcmV0dXJuIEVycm9yKExvYzAsICJpbnNlcnR2YWx1ZSBvcGVyYW5kIG11c3QgYmUgYWdncmVnYXRlIHR5cGUiKTsKKworICBpZiAoIUV4dHJhY3RWYWx1ZUluc3Q6OmdldEluZGV4ZWRUeXBlKFZhbDAtPmdldFR5cGUoKSwgSW5kaWNlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGljZXMuZW5kKCkpKQorICAgIHJldHVybiBFcnJvcihMb2MwLCAiaW52YWxpZCBpbmRpY2VzIGZvciBpbnNlcnR2YWx1ZSIpOworICBJbnN0ID0gSW5zZXJ0VmFsdWVJbnN0OjpDcmVhdGUoVmFsMCwgVmFsMSwgSW5kaWNlcy5iZWdpbigpLCBJbmRpY2VzLmVuZCgpKTsKKyAgcmV0dXJuIEF0ZUV4dHJhQ29tbWEgPyBJbnN0RXh0cmFDb21tYSA6IEluc3ROb3JtYWw7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBFbWJlZGRlZCBtZXRhZGF0YS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBQYXJzZU1ETm9kZVZlY3RvcgorLy8vICAgOjo9IEVsZW1lbnQgKCcsJyBFbGVtZW50KSoKKy8vLyBFbGVtZW50CisvLy8gICA6Oj0gJ251bGwnIHwgVHlwZUFuZFZhbHVlCitib29sIExMUGFyc2VyOjpQYXJzZU1ETm9kZVZlY3RvcihTbWFsbFZlY3RvckltcGw8VmFsdWUqPiAmRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlckZ1bmN0aW9uU3RhdGUgKlBGUykgeworICAvLyBDaGVjayBmb3IgYW4gZW1wdHkgbGlzdC4KKyAgaWYgKExleC5nZXRLaW5kKCkgPT0gbGx0b2s6OnJicmFjZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZG8geworICAgIC8vIE51bGwgaXMgYSBzcGVjaWFsIGNhc2Ugc2luY2UgaXQgaXMgdHlwZWxlc3MuCisgICAgaWYgKEVhdElmUHJlc2VudChsbHRvazo6a3dfbnVsbCkpIHsKKyAgICAgIEVsdHMucHVzaF9iYWNrKDApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIFZhbHVlICpWID0gMDsKKyAgICBQQVR5cGVIb2xkZXIgVHkoVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpKTsKKyAgICBWYWxJRCBJRDsKKyAgICBpZiAoUGFyc2VUeXBlKFR5KSB8fCBQYXJzZVZhbElEKElELCBQRlMpIHx8CisgICAgICAgIENvbnZlcnRWYWxJRFRvVmFsdWUoVHksIElELCBWLCBQRlMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgRWx0cy5wdXNoX2JhY2soVik7CisgIH0gd2hpbGUgKEVhdElmUHJlc2VudChsbHRvazo6Y29tbWEpKTsKKworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQXNtUGFyc2VyL0xMUGFyc2VyLmggYi9zcmMvTExWTS9saWIvQXNtUGFyc2VyL0xMUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2NWEyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvTExQYXJzZXIuaApAQCAtMCwwICsxLDM3MCBAQAorLy89PT0tLSBMTFBhcnNlci5oIC0gUGFyc2VyIENsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHBhcnNlciBjbGFzcyBmb3IgLmxsIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BU01QQVJTRVJfTExQQVJTRVJfSAorI2RlZmluZSBMTFZNX0FTTVBBUlNFUl9MTFBBUlNFUl9ICisKKyNpbmNsdWRlICJMTExleGVyLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNb2R1bGU7CisgIGNsYXNzIE9wYXF1ZVR5cGU7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBWYWx1ZTsKKyAgY2xhc3MgQmFzaWNCbG9jazsKKyAgY2xhc3MgSW5zdHJ1Y3Rpb247CisgIGNsYXNzIENvbnN0YW50OworICBjbGFzcyBHbG9iYWxWYWx1ZTsKKyAgY2xhc3MgTURTdHJpbmc7CisgIGNsYXNzIE1ETm9kZTsKKyAgY2xhc3MgVW5pb25UeXBlOworCisgIC8vLyBWYWxJRCAtIFJlcHJlc2VudHMgYSByZWZlcmVuY2Ugb2YgYSBkZWZpbml0aW9uIG9mIHNvbWUgc29ydCB3aXRoIG5vIHR5cGUuCisgIC8vLyBUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSB3ZSBoYXZlIHRvIHBhcnNlIHRoZSB2YWx1ZSBidXQgd2hlcmUgdGhlCisgIC8vLyB0eXBlIGNhbiBkZXBlbmQgb24gbGF0ZXIgY29udGV4dC4gIFRoaXMgbWF5IGVpdGhlciBiZSBhIG51bWVyaWMgcmVmZXJlbmNlCisgIC8vLyBvciBhIHN5bWJvbGljICgldmFyKSByZWZlcmVuY2UuICBUaGlzIGlzIGp1c3QgYSBkaXNjcmltaW5hdGVkIHVuaW9uLgorICBzdHJ1Y3QgVmFsSUQgeworICAgIGVudW0geworICAgICAgdF9Mb2NhbElELCB0X0dsb2JhbElELCAgICAgIC8vIElEIGluIFVJbnRWYWwuCisgICAgICB0X0xvY2FsTmFtZSwgdF9HbG9iYWxOYW1lLCAgLy8gTmFtZSBpbiBTdHJWYWwuCisgICAgICB0X0FQU0ludCwgdF9BUEZsb2F0LCAgICAgICAgLy8gVmFsdWUgaW4gQVBTSW50VmFsL0FQRmxvYXRWYWwuCisgICAgICB0X051bGwsIHRfVW5kZWYsIHRfWmVybywgICAgLy8gTm8gdmFsdWUuCisgICAgICB0X0VtcHR5QXJyYXksICAgICAgICAgICAgICAgLy8gTm8gdmFsdWU6ICBbXQorICAgICAgdF9Db25zdGFudCwgICAgICAgICAgICAgICAgIC8vIFZhbHVlIGluIENvbnN0YW50VmFsLgorICAgICAgdF9JbmxpbmVBc20sICAgICAgICAgICAgICAgIC8vIFZhbHVlIGluIFN0clZhbC9TdHJWYWwyL1VJbnRWYWwuCisgICAgICB0X01ETm9kZSwgICAgICAgICAgICAgICAgICAgLy8gVmFsdWUgaW4gTUROb2RlVmFsLgorICAgICAgdF9NRFN0cmluZyAgICAgICAgICAgICAgICAgIC8vIFZhbHVlIGluIE1EU3RyaW5nVmFsLgorICAgIH0gS2luZDsKKyAgICAKKyAgICBMTExleGVyOjpMb2NUeSBMb2M7CisgICAgdW5zaWduZWQgVUludFZhbDsKKyAgICBzdGQ6OnN0cmluZyBTdHJWYWwsIFN0clZhbDI7CisgICAgQVBTSW50IEFQU0ludFZhbDsKKyAgICBBUEZsb2F0IEFQRmxvYXRWYWw7CisgICAgQ29uc3RhbnQgKkNvbnN0YW50VmFsOworICAgIE1ETm9kZSAqTUROb2RlVmFsOworICAgIE1EU3RyaW5nICpNRFN0cmluZ1ZhbDsKKyAgICBWYWxJRCgpIDogQVBGbG9hdFZhbCgwLjApIHt9CisgICAgCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVmFsSUQgJlJIUykgY29uc3QgeworICAgICAgaWYgKEtpbmQgPT0gdF9Mb2NhbElEIHx8IEtpbmQgPT0gdF9HbG9iYWxJRCkKKyAgICAgICAgcmV0dXJuIFVJbnRWYWwgPCBSSFMuVUludFZhbDsKKyAgICAgIGFzc2VydCgoS2luZCA9PSB0X0xvY2FsTmFtZSB8fCBLaW5kID09IHRfR2xvYmFsTmFtZSkgJiYgCisgICAgICAgICAgICAgIk9yZGVyaW5nIG5vdCBkZWZpbmVkIGZvciB0aGlzIFZhbElEIGtpbmQgeWV0Iik7CisgICAgICByZXR1cm4gU3RyVmFsIDwgUkhTLlN0clZhbDsKKyAgICB9CisgIH07CisgIAorICBjbGFzcyBMTFBhcnNlciB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIExMTGV4ZXI6OkxvY1R5IExvY1R5OworICBwcml2YXRlOgorICAgIExMVk1Db250ZXh0ICZDb250ZXh0OworICAgIExMTGV4ZXIgTGV4OworICAgIE1vZHVsZSAqTTsKKyAgICAKKyAgICAvLyBJbnN0cnVjdGlvbiBtZXRhZGF0YSByZXNvbHV0aW9uLiAgRWFjaCBpbnN0cnVjdGlvbiBjYW4gaGF2ZSBhIGxpc3Qgb2YKKyAgICAvLyBNRFJlZiBpbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorICAgIHN0cnVjdCBNRFJlZiB7CisgICAgICBTTUxvYyBMb2M7CisgICAgICB1bnNpZ25lZCBNREtpbmQsIE1EU2xvdDsKKyAgICB9OworICAgIERlbnNlTWFwPEluc3RydWN0aW9uKiwgc3RkOjp2ZWN0b3I8TURSZWY+ID4gRm9yd2FyZFJlZkluc3RNZXRhZGF0YTsKKworICAgIC8vIFR5cGUgcmVzb2x1dGlvbiBoYW5kbGluZyBkYXRhIHN0cnVjdHVyZXMuCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxQQVR5cGVIb2xkZXIsIExvY1R5PiA+IEZvcndhcmRSZWZUeXBlczsKKyAgICBzdGQ6Om1hcDx1bnNpZ25lZCwgc3RkOjpwYWlyPFBBVHlwZUhvbGRlciwgTG9jVHk+ID4gRm9yd2FyZFJlZlR5cGVJRHM7CisgICAgc3RkOjp2ZWN0b3I8UEFUeXBlSG9sZGVyPiBOdW1iZXJlZFR5cGVzOworICAgIHN0ZDo6dmVjdG9yPFRyYWNraW5nVkg8TUROb2RlPiA+IE51bWJlcmVkTWV0YWRhdGE7CisgICAgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6cGFpcjxUcmFja2luZ1ZIPE1ETm9kZT4sIExvY1R5PiA+IEZvcndhcmRSZWZNRE5vZGVzOworICAgIHN0cnVjdCBVcFJlZlJlY29yZCB7CisgICAgICAvLy8gTG9jIC0gVGhpcyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIHVwcmVmLgorICAgICAgTG9jVHkgTG9jOworCisgICAgICAvLy8gTmVzdGluZ0xldmVsIC0gVGhlIG51bWJlciBvZiBuZXN0aW5nIGxldmVscyB0aGF0IG5lZWQgdG8gYmUgcG9wcGVkCisgICAgICAvLy8gYmVmb3JlIHRoaXMgdHlwZSBpcyByZXNvbHZlZC4KKyAgICAgIHVuc2lnbmVkIE5lc3RpbmdMZXZlbDsKKworICAgICAgLy8vIExhc3RDb250YWluZWRUeSAtIFRoaXMgaXMgdGhlIHR5cGUgYXQgdGhlIGN1cnJlbnQgYmluZGluZyBsZXZlbCBmb3IKKyAgICAgIC8vLyB0aGUgdHlwZS4gIEV2ZXJ5IHRpbWUgd2UgcmVkdWNlIHRoZSBuZXN0aW5nIGxldmVsLCB0aGlzIGdldHMgdXBkYXRlZC4KKyAgICAgIGNvbnN0IFR5cGUgKkxhc3RDb250YWluZWRUeTsKKworICAgICAgLy8vIFVwUmVmVHkgLSBUaGlzIGlzIHRoZSBhY3R1YWwgb3BhcXVlIHR5cGUgdGhhdCB0aGUgdXByZWZlcmVuY2UgaXMKKyAgICAgIC8vLyByZXByZXNlbnRlZCB3aXRoLgorICAgICAgT3BhcXVlVHlwZSAqVXBSZWZUeTsKKworICAgICAgVXBSZWZSZWNvcmQoTG9jVHkgTCwgdW5zaWduZWQgTkwsIE9wYXF1ZVR5cGUgKlVSVHkpCisgICAgICAgIDogTG9jKEwpLCBOZXN0aW5nTGV2ZWwoTkwpLCBMYXN0Q29udGFpbmVkVHkoKFR5cGUqKVVSVHkpLAorICAgICAgICAgIFVwUmVmVHkoVVJUeSkge30KKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPFVwUmVmUmVjb3JkPiBVcFJlZnM7CisKKyAgICAvLyBHbG9iYWwgVmFsdWUgcmVmZXJlbmNlIGluZm9ybWF0aW9uLgorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnBhaXI8R2xvYmFsVmFsdWUqLCBMb2NUeT4gPiBGb3J3YXJkUmVmVmFsczsKKyAgICBzdGQ6Om1hcDx1bnNpZ25lZCwgc3RkOjpwYWlyPEdsb2JhbFZhbHVlKiwgTG9jVHk+ID4gRm9yd2FyZFJlZlZhbElEczsKKyAgICBzdGQ6OnZlY3RvcjxHbG9iYWxWYWx1ZSo+IE51bWJlcmVkVmFsczsKKyAgICAKKyAgICAvLyBSZWZlcmVuY2VzIHRvIGJsb2NrYWRkcmVzcy4gIFRoZSBrZXkgaXMgdGhlIGZ1bmN0aW9uIFZhbElELCB0aGUgdmFsdWUgaXMKKyAgICAvLyBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byBibG9ja3MgaW4gdGhhdCBmdW5jdGlvbi4KKyAgICBzdGQ6Om1hcDxWYWxJRCwgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFZhbElELCBHbG9iYWxWYWx1ZSo+ID4gPgorICAgICAgRm9yd2FyZFJlZkJsb2NrQWRkcmVzc2VzOworICAgIAorICAgIEZ1bmN0aW9uICpNYWxsb2NGOworICBwdWJsaWM6CisgICAgTExQYXJzZXIoTWVtb3J5QnVmZmVyICpGLCBTb3VyY2VNZ3IgJlNNLCBTTURpYWdub3N0aWMgJkVyciwgTW9kdWxlICptKSA6IAorICAgICAgQ29udGV4dChtLT5nZXRDb250ZXh0KCkpLCBMZXgoRiwgU00sIEVyciwgbS0+Z2V0Q29udGV4dCgpKSwKKyAgICAgIE0obSksIE1hbGxvY0YoTlVMTCkge30KKyAgICBib29sIFJ1bigpOworCisgICAgTExWTUNvbnRleHQmIGdldENvbnRleHQoKSB7IHJldHVybiBDb250ZXh0OyB9CisKKyAgcHJpdmF0ZToKKworICAgIGJvb2wgRXJyb3IoTG9jVHkgTCwgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZykgY29uc3QgeworICAgICAgcmV0dXJuIExleC5FcnJvcihMLCBNc2cpOworICAgIH0KKyAgICBib29sIFRva0Vycm9yKGNvbnN0IHN0ZDo6c3RyaW5nICZNc2cpIGNvbnN0IHsKKyAgICAgIHJldHVybiBFcnJvcihMZXguZ2V0TG9jKCksIE1zZyk7CisgICAgfQorCisgICAgLy8vIEdldEdsb2JhbFZhbCAtIEdldCBhIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIG9yIElELCBjcmVhdGluZyBhCisgICAgLy8vIGZvcndhcmQgcmVmZXJlbmNlIHJlY29yZCBpZiBuZWVkZWQuICBUaGlzIGNhbiByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUKKyAgICAvLy8gZXhpc3RzIGJ1dCBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCB0eXBlLgorICAgIEdsb2JhbFZhbHVlICpHZXRHbG9iYWxWYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk4sIGNvbnN0IFR5cGUgKlR5LCBMb2NUeSBMb2MpOworICAgIEdsb2JhbFZhbHVlICpHZXRHbG9iYWxWYWwodW5zaWduZWQgSUQsIGNvbnN0IFR5cGUgKlR5LCBMb2NUeSBMb2MpOworCisgICAgLy8gSGVscGVyIFJvdXRpbmVzLgorICAgIGJvb2wgUGFyc2VUb2tlbihsbHRvazo6S2luZCBULCBjb25zdCBjaGFyICpFcnJNc2cpOworICAgIGJvb2wgRWF0SWZQcmVzZW50KGxsdG9rOjpLaW5kIFQpIHsKKyAgICAgIGlmIChMZXguZ2V0S2luZCgpICE9IFQpIHJldHVybiBmYWxzZTsKKyAgICAgIExleC5MZXgoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBib29sIFBhcnNlT3B0aW9uYWxUb2tlbihsbHRvazo6S2luZCBULCBib29sICZQcmVzZW50KSB7CisgICAgICBpZiAoTGV4LmdldEtpbmQoKSAhPSBUKSB7CisgICAgICAgIFByZXNlbnQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExleC5MZXgoKTsKKyAgICAgICAgUHJlc2VudCA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJvb2wgUGFyc2VTdHJpbmdDb25zdGFudChzdGQ6OnN0cmluZyAmUmVzdWx0KTsKKyAgICBib29sIFBhcnNlVUludDMyKHVuc2lnbmVkICZWYWwpOworICAgIGJvb2wgUGFyc2VVSW50MzIodW5zaWduZWQgJlZhbCwgTG9jVHkgJkxvYykgeworICAgICAgTG9jID0gTGV4LmdldExvYygpOworICAgICAgcmV0dXJuIFBhcnNlVUludDMyKFZhbCk7CisgICAgfQorICAgIGJvb2wgUGFyc2VPcHRpb25hbEFkZHJTcGFjZSh1bnNpZ25lZCAmQWRkclNwYWNlKTsKKyAgICBib29sIFBhcnNlT3B0aW9uYWxBdHRycyh1bnNpZ25lZCAmQXR0cnMsIHVuc2lnbmVkIEF0dHJLaW5kKTsKKyAgICBib29sIFBhcnNlT3B0aW9uYWxMaW5rYWdlKHVuc2lnbmVkICZMaW5rYWdlLCBib29sICZIYXNMaW5rYWdlKTsKKyAgICBib29sIFBhcnNlT3B0aW9uYWxMaW5rYWdlKHVuc2lnbmVkICZMaW5rYWdlKSB7CisgICAgICBib29sIEhhc0xpbmthZ2U7IHJldHVybiBQYXJzZU9wdGlvbmFsTGlua2FnZShMaW5rYWdlLCBIYXNMaW5rYWdlKTsKKyAgICB9CisgICAgYm9vbCBQYXJzZU9wdGlvbmFsVmlzaWJpbGl0eSh1bnNpZ25lZCAmVmlzaWJpbGl0eSk7CisgICAgYm9vbCBQYXJzZU9wdGlvbmFsQ2FsbGluZ0NvbnYoQ2FsbGluZ0NvbnY6OklEICZDQyk7CisgICAgYm9vbCBQYXJzZU9wdGlvbmFsQWxpZ25tZW50KHVuc2lnbmVkICZBbGlnbm1lbnQpOworICAgIGJvb2wgUGFyc2VPcHRpb25hbFN0YWNrQWxpZ25tZW50KHVuc2lnbmVkICZBbGlnbm1lbnQpOworICAgIGJvb2wgUGFyc2VJbnN0cnVjdGlvbk1ldGFkYXRhKEluc3RydWN0aW9uICpJbnN0KTsKKyAgICBib29sIFBhcnNlT3B0aW9uYWxDb21tYUFsaWduKHVuc2lnbmVkICZBbGlnbm1lbnQsIGJvb2wgJkF0ZUV4dHJhQ29tbWEpOworICAgIGJvb2wgUGFyc2VJbmRleExpc3QoU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmSW5kaWNlcyxib29sICZBdGVFeHRyYUNvbW1hKTsKKyAgICBib29sIFBhcnNlSW5kZXhMaXN0KFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJkluZGljZXMpIHsKKyAgICAgIGJvb2wgQXRlRXh0cmFDb21tYTsKKyAgICAgIGlmIChQYXJzZUluZGV4TGlzdChJbmRpY2VzLCBBdGVFeHRyYUNvbW1hKSkgcmV0dXJuIHRydWU7CisgICAgICBpZiAoQXRlRXh0cmFDb21tYSkKKyAgICAgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBpbmRleCIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRvcC1MZXZlbCBFbnRpdGllcworICAgIGJvb2wgUGFyc2VUb3BMZXZlbEVudGl0aWVzKCk7CisgICAgYm9vbCBWYWxpZGF0ZUVuZE9mTW9kdWxlKCk7CisgICAgYm9vbCBQYXJzZVRhcmdldERlZmluaXRpb24oKTsKKyAgICBib29sIFBhcnNlRGVwTGlicygpOworICAgIGJvb2wgUGFyc2VNb2R1bGVBc20oKTsKKyAgICBib29sIFBhcnNlVW5uYW1lZFR5cGUoKTsKKyAgICBib29sIFBhcnNlTmFtZWRUeXBlKCk7CisgICAgYm9vbCBQYXJzZURlY2xhcmUoKTsKKyAgICBib29sIFBhcnNlRGVmaW5lKCk7CisKKyAgICBib29sIFBhcnNlR2xvYmFsVHlwZShib29sICZJc0NvbnN0YW50KTsKKyAgICBib29sIFBhcnNlVW5uYW1lZEdsb2JhbCgpOworICAgIGJvb2wgUGFyc2VOYW1lZEdsb2JhbCgpOworICAgIGJvb2wgUGFyc2VHbG9iYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIExvY1R5IExvYywgdW5zaWduZWQgTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTGlua2FnZSwgdW5zaWduZWQgVmlzaWJpbGl0eSk7CisgICAgYm9vbCBQYXJzZUFsaWFzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBMb2NUeSBMb2MsIHVuc2lnbmVkIFZpc2liaWxpdHkpOworICAgIGJvb2wgUGFyc2VTdGFuZGFsb25lTWV0YWRhdGEoKTsKKyAgICBib29sIFBhcnNlTmFtZWRNZXRhZGF0YSgpOworICAgIGJvb2wgUGFyc2VNRFN0cmluZyhNRFN0cmluZyAqJlJlc3VsdCk7CisgICAgYm9vbCBQYXJzZU1ETm9kZUlEKE1ETm9kZSAqJlJlc3VsdCk7CisgICAgYm9vbCBQYXJzZU1ETm9kZUlEKE1ETm9kZSAqJlJlc3VsdCwgdW5zaWduZWQgJlNsb3RObyk7CisKKyAgICAvLyBUeXBlIFBhcnNpbmcuCisgICAgYm9vbCBQYXJzZVR5cGUoUEFUeXBlSG9sZGVyICZSZXN1bHQsIGJvb2wgQWxsb3dWb2lkID0gZmFsc2UpOworICAgIGJvb2wgUGFyc2VUeXBlKFBBVHlwZUhvbGRlciAmUmVzdWx0LCBMb2NUeSAmTG9jLCBib29sIEFsbG93Vm9pZCA9IGZhbHNlKSB7CisgICAgICBMb2MgPSBMZXguZ2V0TG9jKCk7CisgICAgICByZXR1cm4gUGFyc2VUeXBlKFJlc3VsdCwgQWxsb3dWb2lkKTsKKyAgICB9CisgICAgYm9vbCBQYXJzZVR5cGVSZWMoUEFUeXBlSG9sZGVyICZIKTsKKyAgICBib29sIFBhcnNlU3RydWN0VHlwZShQQVR5cGVIb2xkZXIgJkgsIGJvb2wgUGFja2VkKTsKKyAgICBib29sIFBhcnNlVW5pb25UeXBlKFBBVHlwZUhvbGRlciAmSCk7CisgICAgYm9vbCBQYXJzZUFycmF5VmVjdG9yVHlwZShQQVR5cGVIb2xkZXIgJkgsIGJvb2wgaXNWZWN0b3IpOworICAgIGJvb2wgUGFyc2VGdW5jdGlvblR5cGUoUEFUeXBlSG9sZGVyICZSZXN1bHQpOworICAgIFBBVHlwZUhvbGRlciBIYW5kbGVVcFJlZnMoY29uc3QgVHlwZSAqVHkpOworCisgICAgLy8gRnVuY3Rpb24gU2VtYW50aWMgQW5hbHlzaXMuCisgICAgY2xhc3MgUGVyRnVuY3Rpb25TdGF0ZSB7CisgICAgICBMTFBhcnNlciAmUDsKKyAgICAgIEZ1bmN0aW9uICZGOworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxWYWx1ZSosIExvY1R5PiA+IEZvcndhcmRSZWZWYWxzOworICAgICAgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6cGFpcjxWYWx1ZSosIExvY1R5PiA+IEZvcndhcmRSZWZWYWxJRHM7CisgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IE51bWJlcmVkVmFsczsKKyAgICAgIAorICAgICAgLy8vIEZ1bmN0aW9uTnVtYmVyIC0gSWYgdGhpcyBpcyBhbiB1bm5hbWVkIGZ1bmN0aW9uLCB0aGlzIGlzIHRoZSBzbG90CisgICAgICAvLy8gbnVtYmVyIG9mIGl0LCBvdGhlcndpc2UgaXQgaXMgLTEuCisgICAgICBpbnQgRnVuY3Rpb25OdW1iZXI7CisgICAgcHVibGljOgorICAgICAgUGVyRnVuY3Rpb25TdGF0ZShMTFBhcnNlciAmcCwgRnVuY3Rpb24gJmYsIGludCBGdW5jdGlvbk51bWJlcik7CisgICAgICB+UGVyRnVuY3Rpb25TdGF0ZSgpOworCisgICAgICBGdW5jdGlvbiAmZ2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBGOyB9CisKKyAgICAgIGJvb2wgRmluaXNoRnVuY3Rpb24oKTsKKworICAgICAgLy8vIEdldFZhbCAtIEdldCBhIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIG9yIElELCBjcmVhdGluZyBhCisgICAgICAvLy8gZm9yd2FyZCByZWZlcmVuY2UgcmVjb3JkIGlmIG5lZWRlZC4gIFRoaXMgY2FuIHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZQorICAgICAgLy8vIGV4aXN0cyBidXQgZG9lcyBub3QgaGF2ZSB0aGUgcmlnaHQgdHlwZS4KKyAgICAgIFZhbHVlICpHZXRWYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIGNvbnN0IFR5cGUgKlR5LCBMb2NUeSBMb2MpOworICAgICAgVmFsdWUgKkdldFZhbCh1bnNpZ25lZCBJRCwgY29uc3QgVHlwZSAqVHksIExvY1R5IExvYyk7CisKKyAgICAgIC8vLyBTZXRJbnN0TmFtZSAtIEFmdGVyIGFuIGluc3RydWN0aW9uIGlzIHBhcnNlZCBhbmQgaW5zZXJ0ZWQgaW50byBpdHMKKyAgICAgIC8vLyBiYXNpYyBibG9jaywgdGhpcyBpbnN0YWxscyBpdHMgbmFtZS4KKyAgICAgIGJvb2wgU2V0SW5zdE5hbWUoaW50IE5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWVTdHIsIExvY1R5IE5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnN0KTsKKworICAgICAgLy8vIEdldEJCIC0gR2V0IGEgYmFzaWMgYmxvY2sgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgb3IgSUQsIGNyZWF0aW5nIGEKKyAgICAgIC8vLyBmb3J3YXJkIHJlZmVyZW5jZSByZWNvcmQgaWYgbmVlZGVkLiAgVGhpcyBjYW4gcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlCisgICAgICAvLy8gaXMgbm90IGEgQmFzaWNCbG9jay4KKyAgICAgIEJhc2ljQmxvY2sgKkdldEJCKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBMb2NUeSBMb2MpOworICAgICAgQmFzaWNCbG9jayAqR2V0QkIodW5zaWduZWQgSUQsIExvY1R5IExvYyk7CisKKyAgICAgIC8vLyBEZWZpbmVCQiAtIERlZmluZSB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLCB3aGljaCBpcyBlaXRoZXIgbmFtZWQgb3IKKyAgICAgIC8vLyB1bm5hbWVkLiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoaXMgcmV0dXJucyBudWxsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgICAgICAvLy8gdGhlIGJsb2NrIGJlaW5nIGRlZmluZWQuCisgICAgICBCYXNpY0Jsb2NrICpEZWZpbmVCQihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgTG9jVHkgTG9jKTsKKyAgICB9OworCisgICAgYm9vbCBDb252ZXJ0VmFsSURUb1ZhbHVlKGNvbnN0IFR5cGUgKlR5LCBWYWxJRCAmSUQsIFZhbHVlIComViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyRnVuY3Rpb25TdGF0ZSAqUEZTKTsKKworICAgIGJvb2wgUGFyc2VWYWx1ZShjb25zdCBUeXBlICpUeSwgVmFsdWUgKiZWLCBQZXJGdW5jdGlvblN0YXRlICZQRlMpOworICAgIGJvb2wgUGFyc2VWYWx1ZShjb25zdCBUeXBlICpUeSwgVmFsdWUgKiZWLCBMb2NUeSAmTG9jLAorICAgICAgICAgICAgICAgICAgICBQZXJGdW5jdGlvblN0YXRlICZQRlMpIHsKKyAgICAgIExvYyA9IExleC5nZXRMb2MoKTsKKyAgICAgIHJldHVybiBQYXJzZVZhbHVlKFR5LCBWLCBQRlMpOworICAgIH0KKworICAgIGJvb2wgUGFyc2VUeXBlQW5kVmFsdWUoVmFsdWUgKiZWLCBQZXJGdW5jdGlvblN0YXRlICZQRlMpOworICAgIGJvb2wgUGFyc2VUeXBlQW5kVmFsdWUoVmFsdWUgKiZWLCBMb2NUeSAmTG9jLCBQZXJGdW5jdGlvblN0YXRlICZQRlMpIHsKKyAgICAgIExvYyA9IExleC5nZXRMb2MoKTsKKyAgICAgIHJldHVybiBQYXJzZVR5cGVBbmRWYWx1ZShWLCBQRlMpOworICAgIH0KKyAgICBib29sIFBhcnNlVHlwZUFuZEJhc2ljQmxvY2soQmFzaWNCbG9jayAqJkJCLCBMb2NUeSAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJGdW5jdGlvblN0YXRlICZQRlMpOworICAgIGJvb2wgUGFyc2VUeXBlQW5kQmFzaWNCbG9jayhCYXNpY0Jsb2NrIComQkIsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUykgeworICAgICAgTG9jVHkgTG9jOworICAgICAgcmV0dXJuIFBhcnNlVHlwZUFuZEJhc2ljQmxvY2soQkIsIExvYywgUEZTKTsKKyAgICB9CisKKyAgICBib29sIFBhcnNlVW5pb25WYWx1ZShjb25zdCBVbmlvblR5cGUqIHV0eXBlLCBWYWxJRCAmSUQsIFZhbHVlIComVik7CisKKyAgICBzdHJ1Y3QgUGFyYW1JbmZvIHsKKyAgICAgIExvY1R5IExvYzsKKyAgICAgIFZhbHVlICpWOworICAgICAgdW5zaWduZWQgQXR0cnM7CisgICAgICBQYXJhbUluZm8oTG9jVHkgbG9jLCBWYWx1ZSAqdiwgdW5zaWduZWQgYXR0cnMpCisgICAgICAgIDogTG9jKGxvYyksIFYodiksIEF0dHJzKGF0dHJzKSB7fQorICAgIH07CisgICAgYm9vbCBQYXJzZVBhcmFtZXRlckxpc3QoU21hbGxWZWN0b3JJbXBsPFBhcmFtSW5mbz4gJkFyZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKTsKKworICAgIC8vIENvbnN0YW50IFBhcnNpbmcuCisgICAgYm9vbCBQYXJzZVZhbElEKFZhbElEICZJRCwgUGVyRnVuY3Rpb25TdGF0ZSAqUEZTID0gTlVMTCk7CisgICAgYm9vbCBQYXJzZUdsb2JhbFZhbHVlKGNvbnN0IFR5cGUgKlR5LCBDb25zdGFudCAqJlYpOworICAgIGJvb2wgUGFyc2VHbG9iYWxUeXBlQW5kVmFsdWUoQ29uc3RhbnQgKiZWKTsKKyAgICBib29sIFBhcnNlR2xvYmFsVmFsdWVWZWN0b3IoU21hbGxWZWN0b3JJbXBsPENvbnN0YW50Kj4gJkVsdHMpOworICAgIGJvb2wgUGFyc2VNZXRhZGF0YVZhbHVlKFZhbElEICZJRCwgUGVyRnVuY3Rpb25TdGF0ZSAqUEZTKTsKKyAgICBib29sIFBhcnNlTUROb2RlVmVjdG9yKFNtYWxsVmVjdG9ySW1wbDxWYWx1ZSo+ICYsIFBlckZ1bmN0aW9uU3RhdGUgKlBGUyk7CisKKyAgICAvLyBGdW5jdGlvbiBQYXJzaW5nLgorICAgIHN0cnVjdCBBcmdJbmZvIHsKKyAgICAgIExvY1R5IExvYzsKKyAgICAgIFBBVHlwZUhvbGRlciBUeXBlOworICAgICAgdW5zaWduZWQgQXR0cnM7CisgICAgICBzdGQ6OnN0cmluZyBOYW1lOworICAgICAgQXJnSW5mbyhMb2NUeSBMLCBQQVR5cGVIb2xkZXIgVHksIHVuc2lnbmVkIEF0dHIsIGNvbnN0IHN0ZDo6c3RyaW5nICZOKQorICAgICAgICA6IExvYyhMKSwgVHlwZShUeSksIEF0dHJzKEF0dHIpLCBOYW1lKE4pIHt9CisgICAgfTsKKyAgICBib29sIFBhcnNlQXJndW1lbnRMaXN0KHN0ZDo6dmVjdG9yPEFyZ0luZm8+ICZBcmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNWYXJBcmcsIGJvb2wgaW5UeXBlKTsKKyAgICBib29sIFBhcnNlRnVuY3Rpb25IZWFkZXIoRnVuY3Rpb24gKiZGbiwgYm9vbCBpc0RlZmluZSk7CisgICAgYm9vbCBQYXJzZUZ1bmN0aW9uQm9keShGdW5jdGlvbiAmRm4pOworICAgIGJvb2wgUGFyc2VCYXNpY0Jsb2NrKFBlckZ1bmN0aW9uU3RhdGUgJlBGUyk7CisKKyAgICAvLyBJbnN0cnVjdGlvbiBQYXJzaW5nLiAgRWFjaCBpbnN0cnVjdGlvbiBwYXJzaW5nIHJvdXRpbmUgY2FuIHJldHVybiB3aXRoIGEKKyAgICAvLyBub3JtYWwgcmVzdWx0LCBhbiBlcnJvciByZXN1bHQsIG9yIHJldHVybiBoYXZpbmcgZWF0ZW4gYW4gZXh0cmEgY29tbWEuCisgICAgZW51bSBJbnN0UmVzdWx0IHsgSW5zdE5vcm1hbCA9IDAsIEluc3RFcnJvciA9IDEsIEluc3RFeHRyYUNvbW1hID0gMiB9OworICAgIGludCBQYXJzZUluc3RydWN0aW9uKEluc3RydWN0aW9uIComSW5zdCwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKTsKKyAgICBib29sIFBhcnNlQ21wUHJlZGljYXRlKHVuc2lnbmVkICZQcmVkLCB1bnNpZ25lZCBPcGMpOworCisgICAgaW50IFBhcnNlUmV0KEluc3RydWN0aW9uIComSW5zdCwgQmFzaWNCbG9jayAqQkIsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUyk7CisgICAgYm9vbCBQYXJzZUJyKEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKTsKKyAgICBib29sIFBhcnNlU3dpdGNoKEluc3RydWN0aW9uIComSW5zdCwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKTsKKyAgICBib29sIFBhcnNlSW5kaXJlY3RCcihJbnN0cnVjdGlvbiAqJkluc3QsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUyk7CisgICAgYm9vbCBQYXJzZUludm9rZShJbnN0cnVjdGlvbiAqJkluc3QsIFBlckZ1bmN0aW9uU3RhdGUgJlBGUyk7CisKKyAgICBib29sIFBhcnNlQXJpdGhtZXRpYyhJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywgdW5zaWduZWQgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wZXJhbmRUeXBlKTsKKyAgICBib29sIFBhcnNlTG9naWNhbChJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywgdW5zaWduZWQgT3BjKTsKKyAgICBib29sIFBhcnNlQ29tcGFyZShJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywgdW5zaWduZWQgT3BjKTsKKyAgICBib29sIFBhcnNlQ2FzdChJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywgdW5zaWduZWQgT3BjKTsKKyAgICBib29sIFBhcnNlU2VsZWN0KEluc3RydWN0aW9uIComSSwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKTsKKyAgICBib29sIFBhcnNlVkFfQXJnKEluc3RydWN0aW9uIComSSwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKTsKKyAgICBib29sIFBhcnNlRXh0cmFjdEVsZW1lbnQoSW5zdHJ1Y3Rpb24gKiZJLCBQZXJGdW5jdGlvblN0YXRlICZQRlMpOworICAgIGJvb2wgUGFyc2VJbnNlcnRFbGVtZW50KEluc3RydWN0aW9uIComSSwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKTsKKyAgICBib29sIFBhcnNlU2h1ZmZsZVZlY3RvcihJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUyk7CisgICAgaW50IFBhcnNlUEhJKEluc3RydWN0aW9uIComSSwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKTsKKyAgICBib29sIFBhcnNlQ2FsbChJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywgYm9vbCBpc1RhaWwpOworICAgIGludCBQYXJzZUFsbG9jKEluc3RydWN0aW9uIComSSwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTLAorICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQiA9IDAsIGJvb2wgaXNBbGxvY2EgPSB0cnVlKTsKKyAgICBib29sIFBhcnNlRnJlZShJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUywgQmFzaWNCbG9jayAqQkIpOworICAgIGludCBQYXJzZUxvYWQoSW5zdHJ1Y3Rpb24gKiZJLCBQZXJGdW5jdGlvblN0YXRlICZQRlMsIGJvb2wgaXNWb2xhdGlsZSk7CisgICAgaW50IFBhcnNlU3RvcmUoSW5zdHJ1Y3Rpb24gKiZJLCBQZXJGdW5jdGlvblN0YXRlICZQRlMsIGJvb2wgaXNWb2xhdGlsZSk7CisgICAgYm9vbCBQYXJzZUdldFJlc3VsdChJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUyk7CisgICAgaW50IFBhcnNlR2V0RWxlbWVudFB0cihJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUyk7CisgICAgaW50IFBhcnNlRXh0cmFjdFZhbHVlKEluc3RydWN0aW9uIComSSwgUGVyRnVuY3Rpb25TdGF0ZSAmUEZTKTsKKyAgICBpbnQgUGFyc2VJbnNlcnRWYWx1ZShJbnN0cnVjdGlvbiAqJkksIFBlckZ1bmN0aW9uU3RhdGUgJlBGUyk7CisgICAgCisgICAgYm9vbCBSZXNvbHZlRm9yd2FyZFJlZkJsb2NrQWRkcmVzc2VzKEZ1bmN0aW9uICpUaGVGbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxWYWxJRCwgR2xvYmFsVmFsdWUqPiA+ICZSZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJGdW5jdGlvblN0YXRlICpQRlMpOworICB9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQXNtUGFyc2VyL0xMVG9rZW4uaCBiL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvTExUb2tlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDMxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQXNtUGFyc2VyL0xMVG9rZW4uaApAQCAtMCwwICsxLDE0NSBAQAorLy89PT0tIExMVG9rZW4uaCAtIFRva2VuIENvZGVzIGZvciBMTFZNIEFzc2VtYmx5IEZpbGVzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZW51bXMgZm9yIHRoZSAubGwgbGV4ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMSUJTX0FTTVBBUlNFUl9MTFRPS0VOX0gKKyNkZWZpbmUgTElCU19BU01QQVJTRVJfTExUT0tFTl9ICisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBsbHRvayB7CisgIGVudW0gS2luZCB7CisgICAgLy8gTWFya2VycworICAgIEVvZiwgRXJyb3IsCisKKyAgICAvLyBUb2tlbnMgd2l0aCBubyBpbmZvLgorICAgIGRvdGRvdGRvdCwgICAgICAgICAvLyAuLi4KKyAgICBlcXVhbCwgY29tbWEsICAgICAgLy8gPSAgLAorICAgIHN0YXIsICAgICAgICAgICAgICAvLyAqCisgICAgbHNxdWFyZSwgcnNxdWFyZSwgIC8vIFsgIF0KKyAgICBsYnJhY2UsIHJicmFjZSwgICAgLy8geyAgfQorICAgIGxlc3MsIGdyZWF0ZXIsICAgICAvLyA8ICA+CisgICAgbHBhcmVuLCBycGFyZW4sICAgIC8vICggICkKKyAgICBiYWNrc2xhc2gsICAgICAgICAgLy8gXCAgICAobm90IC8pCisgICAgZXhjbGFpbSwgICAgICAgICAgIC8vICEKKworICAgIGt3X3gsCisgICAga3dfYmVnaW4sICAga3dfZW5kLAorICAgIGt3X3RydWUsICAgIGt3X2ZhbHNlLAorICAgIGt3X2RlY2xhcmUsIGt3X2RlZmluZSwKKyAgICBrd19nbG9iYWwsICBrd19jb25zdGFudCwKKworICAgIGt3X3ByaXZhdGUsIGt3X2xpbmtlcl9wcml2YXRlLCBrd19saW5rZXJfcHJpdmF0ZV93ZWFrLCBrd19pbnRlcm5hbCwKKyAgICBrd19saW5rb25jZSwga3dfbGlua29uY2Vfb2RyLCBrd193ZWFrLCBrd193ZWFrX29kciwga3dfYXBwZW5kaW5nLAorICAgIGt3X2RsbGltcG9ydCwga3dfZGxsZXhwb3J0LCBrd19jb21tb24sIGt3X2F2YWlsYWJsZV9leHRlcm5hbGx5LAorICAgIGt3X2RlZmF1bHQsIGt3X2hpZGRlbiwga3dfcHJvdGVjdGVkLAorICAgIGt3X2V4dGVybl93ZWFrLAorICAgIGt3X2V4dGVybmFsLCBrd190aHJlYWRfbG9jYWwsCisgICAga3dfemVyb2luaXRpYWxpemVyLAorICAgIGt3X3VuZGVmLCBrd19udWxsLAorICAgIGt3X3RvLAorICAgIGt3X3RhaWwsCisgICAga3dfdGFyZ2V0LAorICAgIGt3X3RyaXBsZSwKKyAgICBrd19kZXBsaWJzLAorICAgIGt3X2RhdGFsYXlvdXQsCisgICAga3dfdm9sYXRpbGUsCisgICAga3dfbnV3LAorICAgIGt3X25zdywKKyAgICBrd19leGFjdCwKKyAgICBrd19pbmJvdW5kcywKKyAgICBrd19hbGlnbiwKKyAgICBrd19hZGRyc3BhY2UsCisgICAga3dfc2VjdGlvbiwKKyAgICBrd19hbGlhcywKKyAgICBrd19tb2R1bGUsCisgICAga3dfYXNtLAorICAgIGt3X3NpZGVlZmZlY3QsCisgICAga3dfYWxpZ25zdGFjaywKKyAgICBrd19nYywKKyAgICBrd19jLAorCisgICAga3dfY2MsIGt3X2NjYywga3dfZmFzdGNjLCBrd19jb2xkY2MsCisgICAga3dfeDg2X3N0ZGNhbGxjYywga3dfeDg2X2Zhc3RjYWxsY2MsIGt3X3g4Nl90aGlzY2FsbGNjLAorICAgIGt3X2FybV9hcGNzY2MsIGt3X2FybV9hYXBjc2NjLCBrd19hcm1fYWFwY3NfdmZwY2MsCisgICAga3dfbXNwNDMwX2ludHJjYywKKworICAgIGt3X3NpZ25leHQsCisgICAga3dfemVyb2V4dCwKKyAgICBrd19pbnJlZywKKyAgICBrd19zcmV0LAorICAgIGt3X25vdW53aW5kLAorICAgIGt3X25vcmV0dXJuLAorICAgIGt3X25vYWxpYXMsCisgICAga3dfbm9jYXB0dXJlLAorICAgIGt3X2J5dmFsLAorICAgIGt3X25lc3QsCisgICAga3dfcmVhZG5vbmUsCisgICAga3dfcmVhZG9ubHksCisKKyAgICBrd19pbmxpbmVoaW50LAorICAgIGt3X25vaW5saW5lLAorICAgIGt3X2Fsd2F5c2lubGluZSwKKyAgICBrd19vcHRzaXplLAorICAgIGt3X3NzcCwKKyAgICBrd19zc3ByZXEsCisgICAga3dfbm9yZWR6b25lLAorICAgIGt3X25vaW1wbGljaXRmbG9hdCwKKyAgICBrd19uYWtlZCwKKworICAgIGt3X3R5cGUsCisgICAga3dfb3BhcXVlLAorICAgIGt3X3VuaW9uLAorCisgICAga3dfZXEsIGt3X25lLCBrd19zbHQsIGt3X3NndCwga3dfc2xlLCBrd19zZ2UsIGt3X3VsdCwga3dfdWd0LCBrd191bGUsCisgICAga3dfdWdlLCBrd19vZXEsIGt3X29uZSwga3dfb2x0LCBrd19vZ3QsIGt3X29sZSwga3dfb2dlLCBrd19vcmQsIGt3X3VubywKKyAgICBrd191ZXEsIGt3X3VuZSwKKworICAgIC8vIEluc3RydWN0aW9uIE9wY29kZXMgKE9wY29kZSBpbiBVSW50VmFsKS4KKyAgICBrd19hZGQsICBrd19mYWRkLCBrd19zdWIsICBrd19mc3ViLCBrd19tdWwsICBrd19mbXVsLAorICAgIGt3X3VkaXYsIGt3X3NkaXYsIGt3X2ZkaXYsCisgICAga3dfdXJlbSwga3dfc3JlbSwga3dfZnJlbSwga3dfc2hsLCAga3dfbHNociwga3dfYXNociwKKyAgICBrd19hbmQsICBrd19vciwgICBrd194b3IsICBrd19pY21wLCBrd19mY21wLAorCisgICAga3dfcGhpLCBrd19jYWxsLAorICAgIGt3X3RydW5jLCBrd196ZXh0LCBrd19zZXh0LCBrd19mcHRydW5jLCBrd19mcGV4dCwga3dfdWl0b2ZwLCBrd19zaXRvZnAsCisgICAga3dfZnB0b3VpLCBrd19mcHRvc2ksIGt3X2ludHRvcHRyLCBrd19wdHJ0b2ludCwga3dfYml0Y2FzdCwKKyAgICBrd19zZWxlY3QsIGt3X3ZhX2FyZywKKworICAgIGt3X3JldCwga3dfYnIsIGt3X3N3aXRjaCwga3dfaW5kaXJlY3Riciwga3dfaW52b2tlLCBrd191bndpbmQsCisgICAga3dfdW5yZWFjaGFibGUsCisKKyAgICBrd19tYWxsb2MsIGt3X2FsbG9jYSwga3dfZnJlZSwga3dfbG9hZCwga3dfc3RvcmUsIGt3X2dldGVsZW1lbnRwdHIsCisKKyAgICBrd19leHRyYWN0ZWxlbWVudCwga3dfaW5zZXJ0ZWxlbWVudCwga3dfc2h1ZmZsZXZlY3Rvciwga3dfZ2V0cmVzdWx0LAorICAgIGt3X2V4dHJhY3R2YWx1ZSwga3dfaW5zZXJ0dmFsdWUsIGt3X2Jsb2NrYWRkcmVzcywKKworICAgIC8vIFVuc2lnbmVkIFZhbHVlZCB0b2tlbnMgKFVJbnRWYWwpLgorICAgIEdsb2JhbElELCAgICAgICAgICAvLyBANDIKKyAgICBMb2NhbFZhcklELCAgICAgICAgLy8gJTQyCisKKyAgICAvLyBTdHJpbmcgdmFsdWVkIHRva2VucyAoU3RyVmFsKS4KKyAgICBMYWJlbFN0ciwgICAgICAgICAgLy8gZm9vOgorICAgIEdsb2JhbFZhciwgICAgICAgICAvLyBAZm9vIEAiZm9vIgorICAgIExvY2FsVmFyLCAgICAgICAgICAvLyAlZm9vICUiZm9vIgorICAgIE1ldGFkYXRhVmFyLCAgICAgICAvLyAhZm9vCisgICAgU3RyaW5nQ29uc3RhbnQsICAgIC8vICJmb28iCisKKyAgICAvLyBUeXBlIHZhbHVlZCB0b2tlbnMgKFR5VmFsKS4KKyAgICBUeXBlLAorCisgICAgQVBGbG9hdCwgIC8vIEFQRmxvYXRWYWwKKyAgICBBUFNJbnQgLy8gQVBTSW50CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx0b2sKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0FzbVBhcnNlci9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1YmIwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIyM9PT0tIGxpYi9Bc21QYXJzZXIvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorTElCUkFSWU5BTUUgOj0gTExWTUFzbVBhcnNlcgorQlVJTERfQVJDSElWRSA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvUGFyc2VyLmNwcCBiL3NyYy9MTFZNL2xpYi9Bc21QYXJzZXIvUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2NlZjliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0FzbVBhcnNlci9QYXJzZXIuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8vPT09LSBQYXJzZXIuY3BwIC0gTWFpbiBkaXNwYXRjaCBtb2R1bGUgZm9yIHRoZSBQYXJzZXIgbGlicmFyeSAtLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBsaWJyYXJ5IGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uYWxpdHkgZGVmaW5lZCBpbiBsbHZtL0Fzc2VtYmx5L1BhcnNlci5oCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvUGFyc2VyLmgiCisjaW5jbHVkZSAiTExQYXJzZXIuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Tb3VyY2VNZ3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNb2R1bGUgKmxsdm06OlBhcnNlQXNzZW1ibHkoTWVtb3J5QnVmZmVyICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTURpYWdub3N0aWMgJkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICBTb3VyY2VNZ3IgU007CisgIFNNLkFkZE5ld1NvdXJjZUJ1ZmZlcihGLCBTTUxvYygpKTsKKworICAvLyBJZiB3ZSBhcmUgcGFyc2luZyBpbnRvIGFuIGV4aXN0aW5nIG1vZHVsZSwgZG8gaXQuCisgIGlmIChNKQorICAgIHJldHVybiBMTFBhcnNlcihGLCBTTSwgRXJyLCBNKS5SdW4oKSA/IDAgOiBNOworCisgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgbW9kdWxlLgorICBPd25pbmdQdHI8TW9kdWxlPiBNMihuZXcgTW9kdWxlKEYtPmdldEJ1ZmZlcklkZW50aWZpZXIoKSwgQ29udGV4dCkpOworICBpZiAoTExQYXJzZXIoRiwgU00sIEVyciwgTTIuZ2V0KCkpLlJ1bigpKQorICAgIHJldHVybiAwOworICByZXR1cm4gTTIudGFrZSgpOworfQorCitNb2R1bGUgKmxsdm06OlBhcnNlQXNzZW1ibHlGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZGaWxlbmFtZSwgU01EaWFnbm9zdGljICZFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgIHN0ZDo6c3RyaW5nIEVycm9yU3RyOworICBNZW1vcnlCdWZmZXIgKkYgPSBNZW1vcnlCdWZmZXI6OmdldEZpbGVPclNURElOKEZpbGVuYW1lLmNfc3RyKCksICZFcnJvclN0cik7CisgIGlmIChGID09IDApIHsKKyAgICBFcnIgPSBTTURpYWdub3N0aWMoRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiAiICsgRXJyb3JTdHIpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIFBhcnNlQXNzZW1ibHkoRiwgMCwgRXJyLCBDb250ZXh0KTsKK30KKworTW9kdWxlICpsbHZtOjpQYXJzZUFzc2VtYmx5U3RyaW5nKGNvbnN0IGNoYXIgKkFzbVN0cmluZywgTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNRGlhZ25vc3RpYyAmRXJyLCBMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICBNZW1vcnlCdWZmZXIgKkYgPQorICAgIE1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyKFN0cmluZ1JlZihBc21TdHJpbmcsIHN0cmxlbihBc21TdHJpbmcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN0cmluZz4iKTsKKworICByZXR1cm4gUGFyc2VBc3NlbWJseShGLCBNLCBFcnIsIENvbnRleHQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0JpdGNvZGUvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvQml0Y29kZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDZiNWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0JpdGNvZGUvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIyM9PT0tIGxpYi9CaXRjb2RlL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorUEFSQUxMRUxfRElSUyA9IFJlYWRlciBXcml0ZXIKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0JpdGNvZGUvUmVhZGVyL0JpdFJlYWRlci5jcHAgYi9zcmMvTExWTS9saWIvQml0Y29kZS9SZWFkZXIvQml0UmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTg0NGMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0JpdGNvZGUvUmVhZGVyL0JpdFJlYWRlci5jcHAKQEAgLTAsMCArMSw4OCBAQAorLy89PT0tLSBCaXRSZWFkZXIuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0tYy9CaXRSZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvUmVhZGVyV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8qIEJ1aWxkcyBhIG1vZHVsZSBmcm9tIHRoZSBiaXRjb2RlIGluIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGJ1ZmZlciwgcmV0dXJuaW5nIGEKKyAgIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxlIHZpYSB0aGUgT3V0TW9kdWxlIHBhcmFtZXRlci4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgICBPcHRpb25hbGx5IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlIHZpYSBPdXRNZXNzYWdlLiAqLworTExWTUJvb2wgTExWTVBhcnNlQml0Y29kZShMTFZNTWVtb3J5QnVmZmVyUmVmIE1lbUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1vZHVsZVJlZiAqT3V0TW9kdWxlLCBjaGFyICoqT3V0TWVzc2FnZSkgeworICByZXR1cm4gTExWTVBhcnNlQml0Y29kZUluQ29udGV4dCh3cmFwKCZnZXRHbG9iYWxDb250ZXh0KCkpLCBNZW1CdWYsIE91dE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0TWVzc2FnZSk7Cit9CisKK0xMVk1Cb29sIExMVk1QYXJzZUJpdGNvZGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQ29udGV4dFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgKk91dE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dE1lc3NhZ2UpIHsKKyAgc3RkOjpzdHJpbmcgTWVzc2FnZTsKKyAgCisgICpPdXRNb2R1bGUgPSB3cmFwKFBhcnNlQml0Y29kZUZpbGUodW53cmFwKE1lbUJ1ZiksICp1bndyYXAoQ29udGV4dFJlZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lc3NhZ2UpKTsKKyAgaWYgKCEqT3V0TW9kdWxlKSB7CisgICAgaWYgKE91dE1lc3NhZ2UpCisgICAgICAqT3V0TWVzc2FnZSA9IHN0cmR1cChNZXNzYWdlLmNfc3RyKCkpOworICAgIHJldHVybiAxOworICB9CisgIAorICByZXR1cm4gMDsKK30KKworLyogUmVhZHMgYSBtb2R1bGUgZnJvbSB0aGUgc3BlY2lmaWVkIHBhdGgsIHJldHVybmluZyB2aWEgdGhlIE91dE1vZHVsZSBwYXJhbWV0ZXIKKyAgIGEgbW9kdWxlIHByb3ZpZGVyIHdoaWNoIHBlcmZvcm1zIGxhenkgZGVzZXJpYWxpemF0aW9uLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAgIE9wdGlvbmFsbHkgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UgdmlhIE91dE1lc3NhZ2UuICovIAorTExWTUJvb2wgTExWTUdldEJpdGNvZGVNb2R1bGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQ29udGV4dFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NZW1vcnlCdWZmZXJSZWYgTWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1vZHVsZVJlZiAqT3V0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipPdXRNZXNzYWdlKSB7CisgIHN0ZDo6c3RyaW5nIE1lc3NhZ2U7CisgIAorICAqT3V0TSA9IHdyYXAoZ2V0TGF6eUJpdGNvZGVNb2R1bGUodW53cmFwKE1lbUJ1ZiksICp1bndyYXAoQ29udGV4dFJlZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVzc2FnZSkpOworICBpZiAoISpPdXRNKSB7CisgICAgaWYgKE91dE1lc3NhZ2UpCisgICAgICAqT3V0TWVzc2FnZSA9IHN0cmR1cChNZXNzYWdlLmNfc3RyKCkpOworICAgIHJldHVybiAxOworICB9CisgIAorICByZXR1cm4gMDsKKworfQorCitMTFZNQm9vbCBMTFZNR2V0Qml0Y29kZU1vZHVsZShMTFZNTWVtb3J5QnVmZmVyUmVmIE1lbUJ1ZiwgTExWTU1vZHVsZVJlZiAqT3V0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipPdXRNZXNzYWdlKSB7CisgIHJldHVybiBMTFZNR2V0Qml0Y29kZU1vZHVsZUluQ29udGV4dChMTFZNR2V0R2xvYmFsQ29udGV4dCgpLCBNZW1CdWYsIE91dE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRNZXNzYWdlKTsKK30KKworLyogRGVwcmVjYXRlZDogVXNlIExMVk1HZXRCaXRjb2RlTW9kdWxlSW5Db250ZXh0IGluc3RlYWQuICovCitMTFZNQm9vbCBMTFZNR2V0Qml0Y29kZU1vZHVsZVByb3ZpZGVySW5Db250ZXh0KExMVk1Db250ZXh0UmVmIENvbnRleHRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NZW1vcnlCdWZmZXJSZWYgTWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUHJvdmlkZXJSZWYgKk91dE1QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0TWVzc2FnZSkgeworICByZXR1cm4gTExWTUdldEJpdGNvZGVNb2R1bGVJbkNvbnRleHQoQ29udGV4dFJlZiwgTWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxMTFZNTW9kdWxlUmVmKj4oT3V0TVApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0TWVzc2FnZSk7Cit9CisKKy8qIERlcHJlY2F0ZWQ6IFVzZSBMTFZNR2V0Qml0Y29kZU1vZHVsZSBpbnN0ZWFkLiAqLworTExWTUJvb2wgTExWTUdldEJpdGNvZGVNb2R1bGVQcm92aWRlcihMTFZNTWVtb3J5QnVmZmVyUmVmIE1lbUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1vZHVsZVByb3ZpZGVyUmVmICpPdXRNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dE1lc3NhZ2UpIHsKKyAgcmV0dXJuIExMVk1HZXRCaXRjb2RlTW9kdWxlUHJvdmlkZXJJbkNvbnRleHQoTExWTUdldEdsb2JhbENvbnRleHQoKSwgTWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRNUCwgT3V0TWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQml0Y29kZS9SZWFkZXIvQml0Y29kZVJlYWRlci5jcHAgYi9zcmMvTExWTS9saWIvQml0Y29kZS9SZWFkZXIvQml0Y29kZVJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5OTlhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1JlYWRlci9CaXRjb2RlUmVhZGVyLmNwcApAQCAtMCwwICsxLDI1MDEgQEAKKy8vPT09LSBCaXRjb2RlUmVhZGVyLmNwcCAtIEludGVybmFsIEJpdGNvZGVSZWFkZXIgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgQml0Y29kZVJlYWRlciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL1JlYWRlcldyaXRlci5oIgorI2luY2x1ZGUgIkJpdGNvZGVSZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0F1dG9VcGdyYWRlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vT3BlcmFuZFRyYWl0cy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3ZvaWQgQml0Y29kZVJlYWRlcjo6RnJlZVN0YXRlKCkgeworICBpZiAoQnVmZmVyT3duZWQpCisgICAgZGVsZXRlIEJ1ZmZlcjsKKyAgQnVmZmVyID0gMDsKKyAgc3RkOjp2ZWN0b3I8UEFUeXBlSG9sZGVyPigpLnN3YXAoVHlwZUxpc3QpOworICBWYWx1ZUxpc3QuY2xlYXIoKTsKKyAgTURWYWx1ZUxpc3QuY2xlYXIoKTsKKworICBzdGQ6OnZlY3RvcjxBdHRyTGlzdFB0cj4oKS5zd2FwKE1BdHRyaWJ1dGVzKTsKKyAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+KCkuc3dhcChGdW5jdGlvbkJCcyk7CisgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uKj4oKS5zd2FwKEZ1bmN0aW9uc1dpdGhCb2RpZXMpOworICBEZWZlcnJlZEZ1bmN0aW9uSW5mby5jbGVhcigpOworICBNREtpbmRNYXAuY2xlYXIoKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBIZWxwZXIgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBmb3J3YXJkIHJlZmVyZW5jZSByZXNvbHV0aW9uLCBldGMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQ29udmVydFRvU3RyaW5nIC0gQ29udmVydCBhIHN0cmluZyBmcm9tIGEgcmVjb3JkIGludG8gYW4gc3RkOjpzdHJpbmcsIHJldHVybgorLy8vIHRydWUgb24gZmFpbHVyZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFN0clR5Pgorc3RhdGljIGJvb2wgQ29udmVydFRvU3RyaW5nKFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA2ND4gJlJlY29yZCwgdW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0clR5ICZSZXN1bHQpIHsKKyAgaWYgKElkeCA+IFJlY29yZC5zaXplKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gSWR4LCBlID0gUmVjb3JkLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgUmVzdWx0ICs9IChjaGFyKVJlY29yZFtpXTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBHZXREZWNvZGVkTGlua2FnZSh1bnNpZ25lZCBWYWwpIHsKKyAgc3dpdGNoIChWYWwpIHsKKyAgZGVmYXVsdDogLy8gTWFwIHVua25vd24vbmV3IGxpbmthZ2VzIHRvIGV4dGVybmFsCisgIGNhc2UgMDogIHJldHVybiBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlOworICBjYXNlIDE6ICByZXR1cm4gR2xvYmFsVmFsdWU6OldlYWtBbnlMaW5rYWdlOworICBjYXNlIDI6ICByZXR1cm4gR2xvYmFsVmFsdWU6OkFwcGVuZGluZ0xpbmthZ2U7CisgIGNhc2UgMzogIHJldHVybiBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlOworICBjYXNlIDQ6ICByZXR1cm4gR2xvYmFsVmFsdWU6OkxpbmtPbmNlQW55TGlua2FnZTsKKyAgY2FzZSA1OiAgcmV0dXJuIEdsb2JhbFZhbHVlOjpETExJbXBvcnRMaW5rYWdlOworICBjYXNlIDY6ICByZXR1cm4gR2xvYmFsVmFsdWU6OkRMTEV4cG9ydExpbmthZ2U7CisgIGNhc2UgNzogIHJldHVybiBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxXZWFrTGlua2FnZTsKKyAgY2FzZSA4OiAgcmV0dXJuIEdsb2JhbFZhbHVlOjpDb21tb25MaW5rYWdlOworICBjYXNlIDk6ICByZXR1cm4gR2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlOworICBjYXNlIDEwOiByZXR1cm4gR2xvYmFsVmFsdWU6OldlYWtPRFJMaW5rYWdlOworICBjYXNlIDExOiByZXR1cm4gR2xvYmFsVmFsdWU6OkxpbmtPbmNlT0RSTGlua2FnZTsKKyAgY2FzZSAxMjogcmV0dXJuIEdsb2JhbFZhbHVlOjpBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZTsKKyAgY2FzZSAxMzogcmV0dXJuIEdsb2JhbFZhbHVlOjpMaW5rZXJQcml2YXRlTGlua2FnZTsKKyAgY2FzZSAxNDogcmV0dXJuIEdsb2JhbFZhbHVlOjpMaW5rZXJQcml2YXRlV2Vha0xpbmthZ2U7CisgIH0KK30KKworc3RhdGljIEdsb2JhbFZhbHVlOjpWaXNpYmlsaXR5VHlwZXMgR2V0RGVjb2RlZFZpc2liaWxpdHkodW5zaWduZWQgVmFsKSB7CisgIHN3aXRjaCAoVmFsKSB7CisgIGRlZmF1bHQ6IC8vIE1hcCB1bmtub3duIHZpc2liaWxpdGllcyB0byBkZWZhdWx0LgorICBjYXNlIDA6IHJldHVybiBHbG9iYWxWYWx1ZTo6RGVmYXVsdFZpc2liaWxpdHk7CisgIGNhc2UgMTogcmV0dXJuIEdsb2JhbFZhbHVlOjpIaWRkZW5WaXNpYmlsaXR5OworICBjYXNlIDI6IHJldHVybiBHbG9iYWxWYWx1ZTo6UHJvdGVjdGVkVmlzaWJpbGl0eTsKKyAgfQorfQorCitzdGF0aWMgaW50IEdldERlY29kZWRDYXN0T3Bjb2RlKHVuc2lnbmVkIFZhbCkgeworICBzd2l0Y2ggKFZhbCkgeworICBkZWZhdWx0OiByZXR1cm4gLTE7CisgIGNhc2UgYml0Yzo6Q0FTVF9UUlVOQyAgIDogcmV0dXJuIEluc3RydWN0aW9uOjpUcnVuYzsKKyAgY2FzZSBiaXRjOjpDQVNUX1pFWFQgICAgOiByZXR1cm4gSW5zdHJ1Y3Rpb246OlpFeHQ7CisgIGNhc2UgYml0Yzo6Q0FTVF9TRVhUICAgIDogcmV0dXJuIEluc3RydWN0aW9uOjpTRXh0OworICBjYXNlIGJpdGM6OkNBU1RfRlBUT1VJICA6IHJldHVybiBJbnN0cnVjdGlvbjo6RlBUb1VJOworICBjYXNlIGJpdGM6OkNBU1RfRlBUT1NJICA6IHJldHVybiBJbnN0cnVjdGlvbjo6RlBUb1NJOworICBjYXNlIGJpdGM6OkNBU1RfVUlUT0ZQICA6IHJldHVybiBJbnN0cnVjdGlvbjo6VUlUb0ZQOworICBjYXNlIGJpdGM6OkNBU1RfU0lUT0ZQICA6IHJldHVybiBJbnN0cnVjdGlvbjo6U0lUb0ZQOworICBjYXNlIGJpdGM6OkNBU1RfRlBUUlVOQyA6IHJldHVybiBJbnN0cnVjdGlvbjo6RlBUcnVuYzsKKyAgY2FzZSBiaXRjOjpDQVNUX0ZQRVhUICAgOiByZXR1cm4gSW5zdHJ1Y3Rpb246OkZQRXh0OworICBjYXNlIGJpdGM6OkNBU1RfUFRSVE9JTlQ6IHJldHVybiBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ7CisgIGNhc2UgYml0Yzo6Q0FTVF9JTlRUT1BUUjogcmV0dXJuIEluc3RydWN0aW9uOjpJbnRUb1B0cjsKKyAgY2FzZSBiaXRjOjpDQVNUX0JJVENBU1QgOiByZXR1cm4gSW5zdHJ1Y3Rpb246OkJpdENhc3Q7CisgIH0KK30KK3N0YXRpYyBpbnQgR2V0RGVjb2RlZEJpbmFyeU9wY29kZSh1bnNpZ25lZCBWYWwsIGNvbnN0IFR5cGUgKlR5KSB7CisgIHN3aXRjaCAoVmFsKSB7CisgIGRlZmF1bHQ6IHJldHVybiAtMTsKKyAgY2FzZSBiaXRjOjpCSU5PUF9BREQ6CisgICAgcmV0dXJuIFR5LT5pc0ZQT3JGUFZlY3RvclR5KCkgPyBJbnN0cnVjdGlvbjo6RkFkZCA6IEluc3RydWN0aW9uOjpBZGQ7CisgIGNhc2UgYml0Yzo6QklOT1BfU1VCOgorICAgIHJldHVybiBUeS0+aXNGUE9yRlBWZWN0b3JUeSgpID8gSW5zdHJ1Y3Rpb246OkZTdWIgOiBJbnN0cnVjdGlvbjo6U3ViOworICBjYXNlIGJpdGM6OkJJTk9QX01VTDoKKyAgICByZXR1cm4gVHktPmlzRlBPckZQVmVjdG9yVHkoKSA/IEluc3RydWN0aW9uOjpGTXVsIDogSW5zdHJ1Y3Rpb246Ok11bDsKKyAgY2FzZSBiaXRjOjpCSU5PUF9VRElWOiByZXR1cm4gSW5zdHJ1Y3Rpb246OlVEaXY7CisgIGNhc2UgYml0Yzo6QklOT1BfU0RJVjoKKyAgICByZXR1cm4gVHktPmlzRlBPckZQVmVjdG9yVHkoKSA/IEluc3RydWN0aW9uOjpGRGl2IDogSW5zdHJ1Y3Rpb246OlNEaXY7CisgIGNhc2UgYml0Yzo6QklOT1BfVVJFTTogcmV0dXJuIEluc3RydWN0aW9uOjpVUmVtOworICBjYXNlIGJpdGM6OkJJTk9QX1NSRU06CisgICAgcmV0dXJuIFR5LT5pc0ZQT3JGUFZlY3RvclR5KCkgPyBJbnN0cnVjdGlvbjo6RlJlbSA6IEluc3RydWN0aW9uOjpTUmVtOworICBjYXNlIGJpdGM6OkJJTk9QX1NITDogIHJldHVybiBJbnN0cnVjdGlvbjo6U2hsOworICBjYXNlIGJpdGM6OkJJTk9QX0xTSFI6IHJldHVybiBJbnN0cnVjdGlvbjo6TFNocjsKKyAgY2FzZSBiaXRjOjpCSU5PUF9BU0hSOiByZXR1cm4gSW5zdHJ1Y3Rpb246OkFTaHI7CisgIGNhc2UgYml0Yzo6QklOT1BfQU5EOiAgcmV0dXJuIEluc3RydWN0aW9uOjpBbmQ7CisgIGNhc2UgYml0Yzo6QklOT1BfT1I6ICAgcmV0dXJuIEluc3RydWN0aW9uOjpPcjsKKyAgY2FzZSBiaXRjOjpCSU5PUF9YT1I6ICByZXR1cm4gSW5zdHJ1Y3Rpb246OlhvcjsKKyAgfQorfQorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeworICAvLy8gQGJyaWVmIEEgY2xhc3MgZm9yIG1haW50YWluaW5nIHRoZSBzbG90IG51bWJlciBkZWZpbml0aW9uCisgIC8vLyBhcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgYWN0dWFsIGRlZmluaXRpb24gZm9yIGZvcndhcmQgY29uc3RhbnRzIGRlZnMuCisgIGNsYXNzIENvbnN0YW50UGxhY2VIb2xkZXIgOiBwdWJsaWMgQ29uc3RhbnRFeHByIHsKKyAgICBDb25zdGFudFBsYWNlSG9sZGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBETyBOT1QgSU1QTEVNRU5UCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ29uc3RhbnRQbGFjZUhvbGRlciAmKTsgLy8gRE8gTk9UIElNUExFTUVOVAorICBwdWJsaWM6CisgICAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgb25lIG9wZXJhbmQKKyAgICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMSk7CisgICAgfQorICAgIGV4cGxpY2l0IENvbnN0YW50UGxhY2VIb2xkZXIoY29uc3QgVHlwZSAqVHksIExMVk1Db250ZXh0JiBDb250ZXh0KQorICAgICAgOiBDb25zdGFudEV4cHIoVHksIEluc3RydWN0aW9uOjpVc2VyT3AxLCAmT3A8MD4oKSwgMSkgeworICAgICAgT3A8MD4oKSA9IFVuZGVmVmFsdWU6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIE1ldGhvZHMgdG8gc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudFBsYWNlSG9sZGVyICopIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPENvbnN0YW50RXhwcj4oVikgJiYKKyAgICAgICAgICAgICBjYXN0PENvbnN0YW50RXhwcj4oViktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpVc2VyT3AxOworICAgIH0KKworCisgICAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICAgIC8vREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisgIH07Cit9CisKKy8vIEZJWE1FOiBjYW4gd2UgaW5oZXJpdCB0aGlzIGZyb20gQ29uc3RhbnRFeHByPwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPENvbnN0YW50UGxhY2VIb2xkZXI+IDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czwxPiB7Cit9OworfQorCisKK3ZvaWQgQml0Y29kZVJlYWRlclZhbHVlTGlzdDo6QXNzaWduVmFsdWUoVmFsdWUgKlYsIHVuc2lnbmVkIElkeCkgeworICBpZiAoSWR4ID09IHNpemUoKSkgeworICAgIHB1c2hfYmFjayhWKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoSWR4ID49IHNpemUoKSkKKyAgICByZXNpemUoSWR4KzEpOworCisgIFdlYWtWSCAmT2xkViA9IFZhbHVlUHRyc1tJZHhdOworICBpZiAoT2xkViA9PSAwKSB7CisgICAgT2xkViA9IFY7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSGFuZGxlIGNvbnN0YW50cyBhbmQgbm9uLWNvbnN0YW50cyAoZS5nLiBpbnN0cnMpIGRpZmZlcmVudGx5IGZvcgorICAvLyBlZmZpY2llbmN5LgorICBpZiAoQ29uc3RhbnQgKlBIQyA9IGR5bl9jYXN0PENvbnN0YW50PigmKk9sZFYpKSB7CisgICAgUmVzb2x2ZUNvbnN0YW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUEhDLCBJZHgpKTsKKyAgICBPbGRWID0gVjsKKyAgfSBlbHNlIHsKKyAgICAvLyBJZiB0aGVyZSB3YXMgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byB0aGlzIHZhbHVlLCByZXBsYWNlIGl0LgorICAgIFZhbHVlICpQcmV2VmFsID0gT2xkVjsKKyAgICBPbGRWLT5yZXBsYWNlQWxsVXNlc1dpdGgoVik7CisgICAgZGVsZXRlIFByZXZWYWw7CisgIH0KK30KKworCitDb25zdGFudCAqQml0Y29kZVJlYWRlclZhbHVlTGlzdDo6Z2V0Q29uc3RhbnRGd2RSZWYodW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIGlmIChJZHggPj0gc2l6ZSgpKQorICAgIHJlc2l6ZShJZHggKyAxKTsKKworICBpZiAoVmFsdWUgKlYgPSBWYWx1ZVB0cnNbSWR4XSkgeworICAgIGFzc2VydChUeSA9PSBWLT5nZXRUeXBlKCkgJiYgIlR5cGUgbWlzbWF0Y2ggaW4gY29uc3RhbnQgdGFibGUhIik7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnQ+KFYpOworICB9CisKKyAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBwbGFjZWhvbGRlciwgd2hpY2ggd2lsbCBsYXRlciBiZSBSQVVXJ2QuCisgIENvbnN0YW50ICpDID0gbmV3IENvbnN0YW50UGxhY2VIb2xkZXIoVHksIENvbnRleHQpOworICBWYWx1ZVB0cnNbSWR4XSA9IEM7CisgIHJldHVybiBDOworfQorCitWYWx1ZSAqQml0Y29kZVJlYWRlclZhbHVlTGlzdDo6Z2V0VmFsdWVGd2RSZWYodW5zaWduZWQgSWR4LCBjb25zdCBUeXBlICpUeSkgeworICBpZiAoSWR4ID49IHNpemUoKSkKKyAgICByZXNpemUoSWR4ICsgMSk7CisKKyAgaWYgKFZhbHVlICpWID0gVmFsdWVQdHJzW0lkeF0pIHsKKyAgICBhc3NlcnQoKFR5ID09IDAgfHwgVHkgPT0gVi0+Z2V0VHlwZSgpKSAmJiAiVHlwZSBtaXNtYXRjaCBpbiB2YWx1ZSB0YWJsZSEiKTsKKyAgICByZXR1cm4gVjsKKyAgfQorCisgIC8vIE5vIHR5cGUgc3BlY2lmaWVkLCBtdXN0IGJlIGludmFsaWQgcmVmZXJlbmNlLgorICBpZiAoVHkgPT0gMCkgcmV0dXJuIDA7CisKKyAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBwbGFjZWhvbGRlciwgd2hpY2ggd2lsbCBsYXRlciBiZSBSQVVXJ2QuCisgIFZhbHVlICpWID0gbmV3IEFyZ3VtZW50KFR5KTsKKyAgVmFsdWVQdHJzW0lkeF0gPSBWOworICByZXR1cm4gVjsKK30KKworLy8vIFJlc29sdmVDb25zdGFudEZvcndhcmRSZWZzIC0gT25jZSBhbGwgY29uc3RhbnRzIGFyZSByZWFkLCB0aGlzIG1ldGhvZCBidWxrCisvLy8gcmVzb2x2ZXMgYW55IGZvcndhcmQgcmVmZXJlbmNlcy4gIFRoZSBpZGVhIGJlaGluZCB0aGlzIGlzIHRoYXQgd2Ugc29tZXRpbWVzCisvLy8gZ2V0IGNvbnN0YW50cyAoc3VjaCBhcyBsYXJnZSBhcnJheXMpIHdoaWNoIHJlZmVyZW5jZSAqbWFueSogZm9yd2FyZCByZWYKKy8vLyBjb25zdGFudHMuICBSZXBsYWNpbmcgZWFjaCBvZiB0aGVzZSBjYXVzZXMgYSBsb3Qgb2YgdGhyYXNoaW5nIHdoZW4KKy8vLyBidWlsZGluZy9yZXVuaXF1aW5nIHRoZSBjb25zdGFudC4gIEluc3RlYWQgb2YgZG9pbmcgdGhpcywgd2UgbG9vayBhdCBhbGwgdGhlCisvLy8gdXNlcyBhbmQgcmV3cml0ZSBhbGwgdGhlIHBsYWNlIGhvbGRlcnMgYXQgb25jZSBmb3IgYW55IGNvbnN0YW50IHRoYXQgdXNlcworLy8vIGEgcGxhY2Vob2xkZXIuCit2b2lkIEJpdGNvZGVSZWFkZXJWYWx1ZUxpc3Q6OlJlc29sdmVDb25zdGFudEZvcndhcmRSZWZzKCkgeworICAvLyBTb3J0IHRoZSB2YWx1ZXMgYnktcG9pbnRlciBzbyB0aGF0IHRoZXkgYXJlIGVmZmljaWVudCB0byBsb29rIHVwIHdpdGggYQorICAvLyBiaW5hcnkgc2VhcmNoLgorICBzdGQ6OnNvcnQoUmVzb2x2ZUNvbnN0YW50cy5iZWdpbigpLCBSZXNvbHZlQ29uc3RhbnRzLmVuZCgpKTsKKworICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDY0PiBOZXdPcHM7CisKKyAgd2hpbGUgKCFSZXNvbHZlQ29uc3RhbnRzLmVtcHR5KCkpIHsKKyAgICBWYWx1ZSAqUmVhbFZhbCA9IG9wZXJhdG9yW10oUmVzb2x2ZUNvbnN0YW50cy5iYWNrKCkuc2Vjb25kKTsKKyAgICBDb25zdGFudCAqUGxhY2Vob2xkZXIgPSBSZXNvbHZlQ29uc3RhbnRzLmJhY2soKS5maXJzdDsKKyAgICBSZXNvbHZlQ29uc3RhbnRzLnBvcF9iYWNrKCk7CisKKyAgICAvLyBMb29wIG92ZXIgYWxsIHVzZXJzIG9mIHRoZSBwbGFjZWhvbGRlciwgdXBkYXRpbmcgdGhlbSB0byByZWZlcmVuY2UgdGhlCisgICAgLy8gbmV3IHZhbHVlLiAgSWYgdGhleSByZWZlcmVuY2UgbW9yZSB0aGFuIG9uZSBwbGFjZWhvbGRlciwgdXBkYXRlIHRoZW0gYWxsCisgICAgLy8gYXQgb25jZS4KKyAgICB3aGlsZSAoIVBsYWNlaG9sZGVyLT51c2VfZW1wdHkoKSkgeworICAgICAgVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IFBsYWNlaG9sZGVyLT51c2VfYmVnaW4oKTsKKyAgICAgIFVzZXIgKlUgPSAqVUk7CisKKyAgICAgIC8vIElmIHRoZSB1c2luZyBvYmplY3QgaXNuJ3QgdW5pcXVlZCwganVzdCB1cGRhdGUgdGhlIG9wZXJhbmRzLiAgVGhpcworICAgICAgLy8gaGFuZGxlcyBpbnN0cnVjdGlvbnMgYW5kIGluaXRpYWxpemVycyBmb3IgZ2xvYmFsIHZhcmlhYmxlcy4KKyAgICAgIGlmICghaXNhPENvbnN0YW50PihVKSB8fCBpc2E8R2xvYmFsVmFsdWU+KFUpKSB7CisgICAgICAgIFVJLmdldFVzZSgpLnNldChSZWFsVmFsKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSBhIGNvbnN0YW50IHRoYXQgdXNlcyB0aGUgcGxhY2Vob2xkZXIuICBSZXBsYWNlIHRoYXQKKyAgICAgIC8vIGNvbnN0YW50IHdpdGggYSBuZXcgY29uc3RhbnQgdGhhdCBoYXMgKmFsbCogcGxhY2Vob2xkZXIgdXNlcyB1cGRhdGVkLgorICAgICAgQ29uc3RhbnQgKlVzZXJDID0gY2FzdDxDb25zdGFudD4oVSk7CisgICAgICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIEkgPSBVc2VyQy0+b3BfYmVnaW4oKSwgRSA9IFVzZXJDLT5vcF9lbmQoKTsKKyAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgVmFsdWUgKk5ld09wOworICAgICAgICBpZiAoIWlzYTxDb25zdGFudFBsYWNlSG9sZGVyPigqSSkpIHsKKyAgICAgICAgICAvLyBOb3QgYSBwbGFjZWhvbGRlciByZWZlcmVuY2UuCisgICAgICAgICAgTmV3T3AgPSAqSTsKKyAgICAgICAgfSBlbHNlIGlmICgqSSA9PSBQbGFjZWhvbGRlcikgeworICAgICAgICAgIC8vIENvbW1vbiBjYXNlIGlzIHRoYXQgaXQganVzdCByZWZlcmVuY2VzIHRoaXMgb25lIHBsYWNlaG9sZGVyLgorICAgICAgICAgIE5ld09wID0gUmVhbFZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBPdGhlcndpc2UsIGxvb2sgdXAgdGhlIHBsYWNlaG9sZGVyIGluIFJlc29sdmVDb25zdGFudHMuCisgICAgICAgICAgUmVzb2x2ZUNvbnN0YW50c1R5OjppdGVyYXRvciBJdCA9CisgICAgICAgICAgICBzdGQ6Omxvd2VyX2JvdW5kKFJlc29sdmVDb25zdGFudHMuYmVnaW4oKSwgUmVzb2x2ZUNvbnN0YW50cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPENvbnN0YW50KiwgdW5zaWduZWQ+KGNhc3Q8Q29uc3RhbnQ+KCpJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKTsKKyAgICAgICAgICBhc3NlcnQoSXQgIT0gUmVzb2x2ZUNvbnN0YW50cy5lbmQoKSAmJiBJdC0+Zmlyc3QgPT0gKkkpOworICAgICAgICAgIE5ld09wID0gb3BlcmF0b3JbXShJdC0+c2Vjb25kKTsKKyAgICAgICAgfQorCisgICAgICAgIE5ld09wcy5wdXNoX2JhY2soY2FzdDxDb25zdGFudD4oTmV3T3ApKTsKKyAgICAgIH0KKworICAgICAgLy8gTWFrZSB0aGUgbmV3IGNvbnN0YW50LgorICAgICAgQ29uc3RhbnQgKk5ld0M7CisgICAgICBpZiAoQ29uc3RhbnRBcnJheSAqVXNlckNBID0gZHluX2Nhc3Q8Q29uc3RhbnRBcnJheT4oVXNlckMpKSB7CisgICAgICAgIE5ld0MgPSBDb25zdGFudEFycmF5OjpnZXQoVXNlckNBLT5nZXRUeXBlKCksICZOZXdPcHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3T3BzLnNpemUoKSk7CisgICAgICB9IGVsc2UgaWYgKENvbnN0YW50U3RydWN0ICpVc2VyQ1MgPSBkeW5fY2FzdDxDb25zdGFudFN0cnVjdD4oVXNlckMpKSB7CisgICAgICAgIE5ld0MgPSBDb25zdGFudFN0cnVjdDo6Z2V0KENvbnRleHQsICZOZXdPcHNbMF0sIE5ld09wcy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJDUy0+Z2V0VHlwZSgpLT5pc1BhY2tlZCgpKTsKKyAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRVbmlvbiAqVXNlckNVID0gZHluX2Nhc3Q8Q29uc3RhbnRVbmlvbj4oVXNlckMpKSB7CisgICAgICAgIE5ld0MgPSBDb25zdGFudFVuaW9uOjpnZXQoVXNlckNVLT5nZXRUeXBlKCksIE5ld09wc1swXSk7CisgICAgICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudFZlY3Rvcj4oVXNlckMpKSB7CisgICAgICAgIE5ld0MgPSBDb25zdGFudFZlY3Rvcjo6Z2V0KCZOZXdPcHNbMF0sIE5ld09wcy5zaXplKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGlzYTxDb25zdGFudEV4cHI+KFVzZXJDKSAmJiAiTXVzdCBiZSBhIENvbnN0YW50RXhwci4iKTsKKyAgICAgICAgTmV3QyA9IGNhc3Q8Q29uc3RhbnRFeHByPihVc2VyQyktPmdldFdpdGhPcGVyYW5kcygmTmV3T3BzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld09wcy5zaXplKCkpOworICAgICAgfQorCisgICAgICBVc2VyQy0+cmVwbGFjZUFsbFVzZXNXaXRoKE5ld0MpOworICAgICAgVXNlckMtPmRlc3Ryb3lDb25zdGFudCgpOworICAgICAgTmV3T3BzLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIGFsbCBWYWx1ZUhhbmRsZXMsIHRoZXkgc2hvdWxkIGJlIHRoZSBvbmx5IHVzZXJzIGF0IHRoaXMgcG9pbnQuCisgICAgUGxhY2Vob2xkZXItPnJlcGxhY2VBbGxVc2VzV2l0aChSZWFsVmFsKTsKKyAgICBkZWxldGUgUGxhY2Vob2xkZXI7CisgIH0KK30KKwordm9pZCBCaXRjb2RlUmVhZGVyTURWYWx1ZUxpc3Q6OkFzc2lnblZhbHVlKFZhbHVlICpWLCB1bnNpZ25lZCBJZHgpIHsKKyAgaWYgKElkeCA9PSBzaXplKCkpIHsKKyAgICBwdXNoX2JhY2soVik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKElkeCA+PSBzaXplKCkpCisgICAgcmVzaXplKElkeCsxKTsKKworICBXZWFrVkggJk9sZFYgPSBNRFZhbHVlUHRyc1tJZHhdOworICBpZiAoT2xkViA9PSAwKSB7CisgICAgT2xkViA9IFY7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSWYgdGhlcmUgd2FzIGEgZm9yd2FyZCByZWZlcmVuY2UgdG8gdGhpcyB2YWx1ZSwgcmVwbGFjZSBpdC4KKyAgVmFsdWUgKlByZXZWYWwgPSBPbGRWOworICBPbGRWLT5yZXBsYWNlQWxsVXNlc1dpdGgoVik7CisgIGRlbGV0ZSBQcmV2VmFsOworICAvLyBEZWxldGluZyBQcmV2VmFsIHNldHMgSWR4IHZhbHVlIGluIE1EVmFsdWVQdHJzIHRvIG51bGwuIFNldCBuZXcKKyAgLy8gdmFsdWUgZm9yIElkeC4KKyAgTURWYWx1ZVB0cnNbSWR4XSA9IFY7Cit9CisKK1ZhbHVlICpCaXRjb2RlUmVhZGVyTURWYWx1ZUxpc3Q6OmdldFZhbHVlRndkUmVmKHVuc2lnbmVkIElkeCkgeworICBpZiAoSWR4ID49IHNpemUoKSkKKyAgICByZXNpemUoSWR4ICsgMSk7CisKKyAgaWYgKFZhbHVlICpWID0gTURWYWx1ZVB0cnNbSWR4XSkgeworICAgIGFzc2VydChWLT5nZXRUeXBlKCktPmlzTWV0YWRhdGFUeSgpICYmICJUeXBlIG1pc21hdGNoIGluIHZhbHVlIHRhYmxlISIpOworICAgIHJldHVybiBWOworICB9CisKKyAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBwbGFjZWhvbGRlciwgd2hpY2ggd2lsbCBsYXRlciBiZSBSQVVXJ2QuCisgIFZhbHVlICpWID0gbmV3IEFyZ3VtZW50KFR5cGU6OmdldE1ldGFkYXRhVHkoQ29udGV4dCkpOworICBNRFZhbHVlUHRyc1tJZHhdID0gVjsKKyAgcmV0dXJuIFY7Cit9CisKK2NvbnN0IFR5cGUgKkJpdGNvZGVSZWFkZXI6OmdldFR5cGVCeUlEKHVuc2lnbmVkIElELCBib29sIGlzVHlwZVRhYmxlKSB7CisgIC8vIElmIHRoZSBUeXBlSUQgaXMgaW4gcmFuZ2UsIHJldHVybiBpdC4KKyAgaWYgKElEIDwgVHlwZUxpc3Quc2l6ZSgpKQorICAgIHJldHVybiBUeXBlTGlzdFtJRF0uZ2V0KCk7CisgIGlmICghaXNUeXBlVGFibGUpIHJldHVybiAwOworCisgIC8vIFRoZSB0eXBlIHRhYmxlIGFsbG93cyBmb3J3YXJkIHJlZmVyZW5jZXMuICBQdXNoIGFzIG1hbnkgT3BhcXVlIHR5cGVzIGFzCisgIC8vIG5lZWRlZCB0byBnZXQgdXAgdG8gSUQuCisgIHdoaWxlIChUeXBlTGlzdC5zaXplKCkgPD0gSUQpCisgICAgVHlwZUxpc3QucHVzaF9iYWNrKE9wYXF1ZVR5cGU6OmdldChDb250ZXh0KSk7CisgIHJldHVybiBUeXBlTGlzdC5iYWNrKCkuZ2V0KCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRnVuY3Rpb25zIGZvciBwYXJzaW5nIGJsb2NrcyBmcm9tIHRoZSBiaXRjb2RlIGZpbGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2Jvb2wgQml0Y29kZVJlYWRlcjo6UGFyc2VBdHRyaWJ1dGVCbG9jaygpIHsKKyAgaWYgKFN0cmVhbS5FbnRlclN1YkJsb2NrKGJpdGM6OlBBUkFNQVRUUl9CTE9DS19JRCkpCisgICAgcmV0dXJuIEVycm9yKCJNYWxmb3JtZWQgYmxvY2sgcmVjb3JkIik7CisKKyAgaWYgKCFNQXR0cmlidXRlcy5lbXB0eSgpKQorICAgIHJldHVybiBFcnJvcigiTXVsdGlwbGUgUEFSQU1BVFRSIGJsb2NrcyBmb3VuZCEiKTsKKworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+IFJlY29yZDsKKworICBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVXaXRoSW5kZXgsIDg+IEF0dHJzOworCisgIC8vIFJlYWQgYWxsIHRoZSByZWNvcmRzLgorICB3aGlsZSAoMSkgeworICAgIHVuc2lnbmVkIENvZGUgPSBTdHJlYW0uUmVhZENvZGUoKTsKKyAgICBpZiAoQ29kZSA9PSBiaXRjOjpFTkRfQkxPQ0spIHsKKyAgICAgIGlmIChTdHJlYW0uUmVhZEJsb2NrRW5kKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiRXJyb3IgYXQgZW5kIG9mIFBBUkFNQVRUUiBibG9jayIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChDb2RlID09IGJpdGM6OkVOVEVSX1NVQkJMT0NLKSB7CisgICAgICAvLyBObyBrbm93biBzdWJibG9ja3MsIGFsd2F5cyBza2lwIHRoZW0uCisgICAgICBTdHJlYW0uUmVhZFN1YkJsb2NrSUQoKTsKKyAgICAgIGlmIChTdHJlYW0uU2tpcEJsb2NrKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiTWFsZm9ybWVkIGJsb2NrIHJlY29yZCIpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKENvZGUgPT0gYml0Yzo6REVGSU5FX0FCQlJFVikgeworICAgICAgU3RyZWFtLlJlYWRBYmJyZXZSZWNvcmQoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIFJlYWQgYSByZWNvcmQuCisgICAgUmVjb3JkLmNsZWFyKCk7CisgICAgc3dpdGNoIChTdHJlYW0uUmVhZFJlY29yZChDb2RlLCBSZWNvcmQpKSB7CisgICAgZGVmYXVsdDogIC8vIERlZmF1bHQgYmVoYXZpb3I6IGlnbm9yZS4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6UEFSQU1BVFRSX0NPREVfRU5UUlk6IHsgLy8gRU5UUlk6IFtwYXJhbWlkeDAsIGF0dHIwLCAuLi5dCisgICAgICBpZiAoUmVjb3JkLnNpemUoKSAmIDEpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBFTlRSWSByZWNvcmQiKTsKKworICAgICAgLy8gRklYTUUgOiBSZW1vdmUgdGhpcyBhdXRvdXBncmFkZSBjb2RlIGluIExMVk0gMy4wLgorICAgICAgLy8gSWYgRnVuY3Rpb24gYXR0cmlidXRlcyBhcmUgdXNpbmcgaW5kZXggMCB0aGVuIHRyYW5zZmVyIHRoZW0KKyAgICAgIC8vIHRvIGluZGV4IH4wLiBJbmRleCAwIGlzIHVzZWQgZm9yIHJldHVybiB2YWx1ZSBhdHRyaWJ1dGVzIGJ1dCB1c2VkIHRvIGJlCisgICAgICAvLyB1c2VkIGZvciBmdW5jdGlvbiBhdHRyaWJ1dGVzLgorICAgICAgQXR0cmlidXRlcyBSZXRBdHRyaWJ1dGUgPSBBdHRyaWJ1dGU6Ok5vbmU7CisgICAgICBBdHRyaWJ1dGVzIEZuQXR0cmlidXRlID0gQXR0cmlidXRlOjpOb25lOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlY29yZC5zaXplKCk7IGkgIT0gZTsgaSArPSAyKSB7CisgICAgICAgIC8vIEZJWE1FOiByZW1vdmUgaW4gTExWTSAzLjAKKyAgICAgICAgLy8gVGhlIGFsaWdubWVudCBpcyBzdG9yZWQgYXMgYSAxNi1iaXQgcmF3IHZhbHVlIGZyb20gYml0cyAzMS0tMTYuCisgICAgICAgIC8vIFdlIHNoaWZ0IHRoZSBiaXRzIGFib3ZlIDMxIGRvd24gYnkgMTEgYml0cy4KKworICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAoUmVjb3JkW2krMV0gJiAoMHhmZmZmdWxsIDw8IDE2KSkgPj4gMTY7CisgICAgICAgIGlmIChBbGlnbm1lbnQgJiYgIWlzUG93ZXJPZjJfMzIoQWxpZ25tZW50KSkKKyAgICAgICAgICByZXR1cm4gRXJyb3IoIkFsaWdubWVudCBpcyBub3QgYSBwb3dlciBvZiB0d28uIik7CisKKyAgICAgICAgQXR0cmlidXRlcyBSZWNvbnN0aXR1dGVkQXR0ciA9IFJlY29yZFtpKzFdICYgMHhmZmZmOworICAgICAgICBpZiAoQWxpZ25tZW50KQorICAgICAgICAgIFJlY29uc3RpdHV0ZWRBdHRyIHw9IEF0dHJpYnV0ZTo6Y29uc3RydWN0QWxpZ25tZW50RnJvbUludChBbGlnbm1lbnQpOworICAgICAgICBSZWNvbnN0aXR1dGVkQXR0ciB8PSAoUmVjb3JkW2krMV0gJiAoMHhmZmZmdWxsIDw8IDMyKSkgPj4gMTE7CisgICAgICAgIFJlY29yZFtpKzFdID0gUmVjb25zdGl0dXRlZEF0dHI7CisKKyAgICAgICAgaWYgKFJlY29yZFtpXSA9PSAwKQorICAgICAgICAgIFJldEF0dHJpYnV0ZSA9IFJlY29yZFtpKzFdOworICAgICAgICBlbHNlIGlmIChSZWNvcmRbaV0gPT0gfjBVKQorICAgICAgICAgIEZuQXR0cmlidXRlID0gUmVjb3JkW2krMV07CisgICAgICB9CisKKyAgICAgIHVuc2lnbmVkIE9sZFJldEF0dHJzID0gKEF0dHJpYnV0ZTo6Tm9VbndpbmR8QXR0cmlidXRlOjpOb1JldHVybnwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6UmVhZE9ubHl8QXR0cmlidXRlOjpSZWFkTm9uZSk7CisKKyAgICAgIGlmIChGbkF0dHJpYnV0ZSA9PSBBdHRyaWJ1dGU6Ok5vbmUgJiYgUmV0QXR0cmlidXRlICE9IEF0dHJpYnV0ZTo6Tm9uZSAmJgorICAgICAgICAgIChSZXRBdHRyaWJ1dGUgJiBPbGRSZXRBdHRycykgIT0gMCkgeworICAgICAgICBpZiAoRm5BdHRyaWJ1dGUgPT0gQXR0cmlidXRlOjpOb25lKSB7IC8vIGFkZCBhIHNsb3Qgc28gdGhleSBnZXQgYWRkZWQuCisgICAgICAgICAgUmVjb3JkLnB1c2hfYmFjayh+MFUpOworICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soMCk7CisgICAgICAgIH0KKworICAgICAgICBGbkF0dHJpYnV0ZSAgfD0gUmV0QXR0cmlidXRlICYgT2xkUmV0QXR0cnM7CisgICAgICAgIFJldEF0dHJpYnV0ZSAmPSB+T2xkUmV0QXR0cnM7CisgICAgICB9CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWNvcmQuc2l6ZSgpOyBpICE9IGU7IGkgKz0gMikgeworICAgICAgICBpZiAoUmVjb3JkW2ldID09IDApIHsKKyAgICAgICAgICBpZiAoUmV0QXR0cmlidXRlICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICAgICAgICAgIEF0dHJzLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCgwLCBSZXRBdHRyaWJ1dGUpKTsKKyAgICAgICAgfSBlbHNlIGlmIChSZWNvcmRbaV0gPT0gfjBVKSB7CisgICAgICAgICAgaWYgKEZuQXR0cmlidXRlICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICAgICAgICAgIEF0dHJzLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCh+MFUsIEZuQXR0cmlidXRlKSk7CisgICAgICAgIH0gZWxzZSBpZiAoUmVjb3JkW2krMV0gIT0gQXR0cmlidXRlOjpOb25lKQorICAgICAgICAgIEF0dHJzLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldChSZWNvcmRbaV0sIFJlY29yZFtpKzFdKSk7CisgICAgICB9CisKKyAgICAgIE1BdHRyaWJ1dGVzLnB1c2hfYmFjayhBdHRyTGlzdFB0cjo6Z2V0KEF0dHJzLmJlZ2luKCksIEF0dHJzLmVuZCgpKSk7CisgICAgICBBdHRycy5jbGVhcigpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgfQorfQorCisKK2Jvb2wgQml0Y29kZVJlYWRlcjo6UGFyc2VUeXBlVGFibGUoKSB7CisgIGlmIChTdHJlYW0uRW50ZXJTdWJCbG9jayhiaXRjOjpUWVBFX0JMT0NLX0lEKSkKKyAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBibG9jayByZWNvcmQiKTsKKworICBpZiAoIVR5cGVMaXN0LmVtcHR5KCkpCisgICAgcmV0dXJuIEVycm9yKCJNdWx0aXBsZSBUWVBFX0JMT0NLcyBmb3VuZCEiKTsKKworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+IFJlY29yZDsKKyAgdW5zaWduZWQgTnVtUmVjb3JkcyA9IDA7CisKKyAgLy8gUmVhZCBhbGwgdGhlIHJlY29yZHMgZm9yIHRoaXMgdHlwZSB0YWJsZS4KKyAgd2hpbGUgKDEpIHsKKyAgICB1bnNpZ25lZCBDb2RlID0gU3RyZWFtLlJlYWRDb2RlKCk7CisgICAgaWYgKENvZGUgPT0gYml0Yzo6RU5EX0JMT0NLKSB7CisgICAgICBpZiAoTnVtUmVjb3JkcyAhPSBUeXBlTGlzdC5zaXplKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCB0eXBlIGZvcndhcmQgcmVmZXJlbmNlIGluIFRZUEVfQkxPQ0siKTsKKyAgICAgIGlmIChTdHJlYW0uUmVhZEJsb2NrRW5kKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiRXJyb3IgYXQgZW5kIG9mIHR5cGUgdGFibGUgYmxvY2siKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoQ29kZSA9PSBiaXRjOjpFTlRFUl9TVUJCTE9DSykgeworICAgICAgLy8gTm8ga25vd24gc3ViYmxvY2tzLCBhbHdheXMgc2tpcCB0aGVtLgorICAgICAgU3RyZWFtLlJlYWRTdWJCbG9ja0lEKCk7CisgICAgICBpZiAoU3RyZWFtLlNraXBCbG9jaygpKQorICAgICAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBibG9jayByZWNvcmQiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChDb2RlID09IGJpdGM6OkRFRklORV9BQkJSRVYpIHsKKyAgICAgIFN0cmVhbS5SZWFkQWJicmV2UmVjb3JkKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGEgcmVjb3JkLgorICAgIFJlY29yZC5jbGVhcigpOworICAgIGNvbnN0IFR5cGUgKlJlc3VsdFR5ID0gMDsKKyAgICBzd2l0Y2ggKFN0cmVhbS5SZWFkUmVjb3JkKENvZGUsIFJlY29yZCkpIHsKKyAgICBkZWZhdWx0OiAgLy8gRGVmYXVsdCBiZWhhdmlvcjogdW5rbm93biB0eXBlLgorICAgICAgUmVzdWx0VHkgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiaXRjOjpUWVBFX0NPREVfTlVNRU5UUlk6IC8vIFRZUEVfQ09ERV9OVU1FTlRSWTogW251bWVudHJpZXNdCisgICAgICAvLyBUWVBFX0NPREVfTlVNRU5UUlkgY29udGFpbnMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHR5cGVzIGluIHRoZQorICAgICAgLy8gdHlwZSBsaXN0LiAgVGhpcyBhbGxvd3MgdXMgdG8gcmVzZXJ2ZSBzcGFjZS4KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIFRZUEVfQ09ERV9OVU1FTlRSWSByZWNvcmQiKTsKKyAgICAgIFR5cGVMaXN0LnJlc2VydmUoUmVjb3JkWzBdKTsKKyAgICAgIGNvbnRpbnVlOworICAgIGNhc2UgYml0Yzo6VFlQRV9DT0RFX1ZPSUQ6ICAgICAgLy8gVk9JRAorICAgICAgUmVzdWx0VHkgPSBUeXBlOjpnZXRWb2lkVHkoQ29udGV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJpdGM6OlRZUEVfQ09ERV9GTE9BVDogICAgIC8vIEZMT0FUCisgICAgICBSZXN1bHRUeSA9IFR5cGU6OmdldEZsb2F0VHkoQ29udGV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJpdGM6OlRZUEVfQ09ERV9ET1VCTEU6ICAgIC8vIERPVUJMRQorICAgICAgUmVzdWx0VHkgPSBUeXBlOjpnZXREb3VibGVUeShDb250ZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6VFlQRV9DT0RFX1g4Nl9GUDgwOiAgLy8gWDg2X0ZQODAKKyAgICAgIFJlc3VsdFR5ID0gVHlwZTo6Z2V0WDg2X0ZQODBUeShDb250ZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6VFlQRV9DT0RFX0ZQMTI4OiAgICAgLy8gRlAxMjgKKyAgICAgIFJlc3VsdFR5ID0gVHlwZTo6Z2V0RlAxMjhUeShDb250ZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6VFlQRV9DT0RFX1BQQ19GUDEyODogLy8gUFBDX0ZQMTI4CisgICAgICBSZXN1bHRUeSA9IFR5cGU6OmdldFBQQ19GUDEyOFR5KENvbnRleHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiaXRjOjpUWVBFX0NPREVfTEFCRUw6ICAgICAvLyBMQUJFTAorICAgICAgUmVzdWx0VHkgPSBUeXBlOjpnZXRMYWJlbFR5KENvbnRleHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiaXRjOjpUWVBFX0NPREVfT1BBUVVFOiAgICAvLyBPUEFRVUUKKyAgICAgIFJlc3VsdFR5ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6VFlQRV9DT0RFX01FVEFEQVRBOiAgLy8gTUVUQURBVEEKKyAgICAgIFJlc3VsdFR5ID0gVHlwZTo6Z2V0TWV0YWRhdGFUeShDb250ZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6VFlQRV9DT0RFX0lOVEVHRVI6ICAgLy8gSU5URUdFUjogW3dpZHRoXQorICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCAxKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgSW50ZWdlciB0eXBlIHJlY29yZCIpOworCisgICAgICBSZXN1bHRUeSA9IEludGVnZXJUeXBlOjpnZXQoQ29udGV4dCwgUmVjb3JkWzBdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6VFlQRV9DT0RFX1BPSU5URVI6IHsgLy8gUE9JTlRFUjogW3BvaW50ZWUgdHlwZV0gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIFtwb2ludGVlIHR5cGUsIGFkZHJlc3Mgc3BhY2VdCisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA8IDEpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBQT0lOVEVSIHR5cGUgcmVjb3JkIik7CisgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UgPSAwOworICAgICAgaWYgKFJlY29yZC5zaXplKCkgPT0gMikKKyAgICAgICAgQWRkcmVzc1NwYWNlID0gUmVjb3JkWzFdOworICAgICAgUmVzdWx0VHkgPSBQb2ludGVyVHlwZTo6Z2V0KGdldFR5cGVCeUlEKFJlY29yZFswXSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc1NwYWNlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OlRZUEVfQ09ERV9GVU5DVElPTjogeworICAgICAgLy8gRklYTUU6IGF0dHJpZCBpcyBkZWFkLCByZW1vdmUgaXQgaW4gTExWTSAzLjAKKyAgICAgIC8vIEZVTkNUSU9OOiBbdmFyYXJnLCBhdHRyaWQsIHJldHR5LCBwYXJhbXR5IHggTl0KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMykKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIEZVTkNUSU9OIHR5cGUgcmVjb3JkIik7CisgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gQXJnVHlzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMywgZSA9IFJlY29yZC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBBcmdUeXMucHVzaF9iYWNrKGdldFR5cGVCeUlEKFJlY29yZFtpXSwgdHJ1ZSkpOworCisgICAgICBSZXN1bHRUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KGdldFR5cGVCeUlEKFJlY29yZFsyXSwgdHJ1ZSksIEFyZ1R5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkWzBdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OlRZUEVfQ09ERV9TVFJVQ1Q6IHsgIC8vIFNUUlVDVDogW2lzcGFja2VkLCBlbHR0eSB4IE5dCisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA8IDEpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBTVFJVQ1QgdHlwZSByZWNvcmQiKTsKKyAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBFbHRUeXM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gUmVjb3JkLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIEVsdFR5cy5wdXNoX2JhY2soZ2V0VHlwZUJ5SUQoUmVjb3JkW2ldLCB0cnVlKSk7CisgICAgICBSZXN1bHRUeSA9IFN0cnVjdFR5cGU6OmdldChDb250ZXh0LCBFbHRUeXMsIFJlY29yZFswXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpUWVBFX0NPREVfVU5JT046IHsgIC8vIFVOSU9OOiBbZWx0dHkgeCBOXQorICAgICAgU21hbGxWZWN0b3I8Y29uc3QgVHlwZSosIDg+IEVsdFR5czsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWNvcmQuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgRWx0VHlzLnB1c2hfYmFjayhnZXRUeXBlQnlJRChSZWNvcmRbaV0sIHRydWUpKTsKKyAgICAgIFJlc3VsdFR5ID0gVW5pb25UeXBlOjpnZXQoJkVsdFR5c1swXSwgRWx0VHlzLnNpemUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpUWVBFX0NPREVfQVJSQVk6ICAgICAvLyBBUlJBWTogW251bWVsdHMsIGVsdHR5XQorICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCAyKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgQVJSQVkgdHlwZSByZWNvcmQiKTsKKyAgICAgIFJlc3VsdFR5ID0gQXJyYXlUeXBlOjpnZXQoZ2V0VHlwZUJ5SUQoUmVjb3JkWzFdLCB0cnVlKSwgUmVjb3JkWzBdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6VFlQRV9DT0RFX1ZFQ1RPUjogICAgLy8gVkVDVE9SOiBbbnVtZWx0cywgZWx0dHldCisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA8IDIpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBWRUNUT1IgdHlwZSByZWNvcmQiKTsKKyAgICAgIFJlc3VsdFR5ID0gVmVjdG9yVHlwZTo6Z2V0KGdldFR5cGVCeUlEKFJlY29yZFsxXSwgdHJ1ZSksIFJlY29yZFswXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoTnVtUmVjb3JkcyA9PSBUeXBlTGlzdC5zaXplKCkpIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBuZXcgdHlwZSBzbG90LCBqdXN0IGFwcGVuZCBpdC4KKyAgICAgIFR5cGVMaXN0LnB1c2hfYmFjayhSZXN1bHRUeSA/IFJlc3VsdFR5IDogT3BhcXVlVHlwZTo6Z2V0KENvbnRleHQpKTsKKyAgICAgICsrTnVtUmVjb3JkczsKKyAgICB9IGVsc2UgaWYgKFJlc3VsdFR5ID09IDApIHsKKyAgICAgIC8vIE90aGVyd2lzZSwgdGhpcyB3YXMgZm9yd2FyZCByZWZlcmVuY2VkLCBzbyBhbiBvcGFxdWUgdHlwZSB3YXMgY3JlYXRlZCwKKyAgICAgIC8vIGJ1dCB0aGUgcmVzdWx0IHR5cGUgaXMgYWN0dWFsbHkganVzdCBhbiBvcGFxdWUuICBMZWF2ZSB0aGUgb25lIHdlCisgICAgICAvLyBjcmVhdGVkIHByZXZpb3VzbHkuCisgICAgICArK051bVJlY29yZHM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE90aGVyd2lzZSwgdGhpcyB3YXMgZm9yd2FyZCByZWZlcmVuY2VkLCBzbyBhbiBvcGFxdWUgdHlwZSB3YXMgY3JlYXRlZC4KKyAgICAgIC8vIFJlc29sdmUgdGhlIG9wYXF1ZSB0eXBlIHRvIHRoZSByZWFsIHR5cGUgbm93LgorICAgICAgYXNzZXJ0KE51bVJlY29yZHMgPCBUeXBlTGlzdC5zaXplKCkgJiYgIlR5cGVsaXN0IGltYmFsYW5jZSIpOworICAgICAgY29uc3QgT3BhcXVlVHlwZSAqT2xkVHkgPSBjYXN0PE9wYXF1ZVR5cGU+KFR5cGVMaXN0W051bVJlY29yZHMrK10uZ2V0KCkpOworCisgICAgICAvLyBEb24ndCBkaXJlY3RseSBwdXNoIHRoZSBuZXcgdHlwZSBvbiB0aGUgVGFiLiBJbnN0ZWFkIHdlIHdhbnQgdG8gcmVwbGFjZQorICAgICAgLy8gdGhlIG9wYXF1ZSB0eXBlIHdlIHByZXZpb3VzbHkgaW5zZXJ0ZWQgd2l0aCB0aGUgbmV3IGNvbmNyZXRlIHZhbHVlLiBUaGUKKyAgICAgIC8vIHJlZmluZW1lbnQgZnJvbSB0aGUgYWJzdHJhY3QgKG9wYXF1ZSkgdHlwZSB0byB0aGUgbmV3IHR5cGUgY2F1c2VzIGFsbAorICAgICAgLy8gdXNlcyBvZiB0aGUgYWJzdHJhY3QgdHlwZSB0byB1c2UgdGhlIGNvbmNyZXRlIHR5cGUgKE5ld1R5KS4gVGhpcyB3aWxsCisgICAgICAvLyBhbHNvIGNhdXNlIHRoZSBvcGFxdWUgdHlwZSB0byBiZSBkZWxldGVkLgorICAgICAgY29uc3RfY2FzdDxPcGFxdWVUeXBlKj4oT2xkVHkpLT5yZWZpbmVBYnN0cmFjdFR5cGVUbyhSZXN1bHRUeSk7CisKKyAgICAgIC8vIFRoaXMgc2hvdWxkIGhhdmUgcmVwbGFjZWQgdGhlIG9sZCBvcGFxdWUgdHlwZSB3aXRoIHRoZSBuZXcgdHlwZSBpbiB0aGUKKyAgICAgIC8vIHZhbHVlIHRhYmxlLi4uIG9yIHdpdGggYSBwcmVleGlzdGluZyB0eXBlIHRoYXQgd2FzIGFscmVhZHkgaW4gdGhlCisgICAgICAvLyBzeXN0ZW0uICBMZXQncyBqdXN0IG1ha2Ugc3VyZSBpdCBkaWQuCisgICAgICBhc3NlcnQoVHlwZUxpc3RbTnVtUmVjb3Jkcy0xXS5nZXQoKSAhPSBPbGRUeSAmJgorICAgICAgICAgICAgICJyZWZpbmVBYnN0cmFjdFR5cGUgZGlkbid0IHdvcmshIik7CisgICAgfQorICB9Cit9CisKKworYm9vbCBCaXRjb2RlUmVhZGVyOjpQYXJzZVR5cGVTeW1ib2xUYWJsZSgpIHsKKyAgaWYgKFN0cmVhbS5FbnRlclN1YkJsb2NrKGJpdGM6OlRZUEVfU1lNVEFCX0JMT0NLX0lEKSkKKyAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBibG9jayByZWNvcmQiKTsKKworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+IFJlY29yZDsKKworICAvLyBSZWFkIGFsbCB0aGUgcmVjb3JkcyBmb3IgdGhpcyB0eXBlIHRhYmxlLgorICBzdGQ6OnN0cmluZyBUeXBlTmFtZTsKKyAgd2hpbGUgKDEpIHsKKyAgICB1bnNpZ25lZCBDb2RlID0gU3RyZWFtLlJlYWRDb2RlKCk7CisgICAgaWYgKENvZGUgPT0gYml0Yzo6RU5EX0JMT0NLKSB7CisgICAgICBpZiAoU3RyZWFtLlJlYWRCbG9ja0VuZCgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkVycm9yIGF0IGVuZCBvZiB0eXBlIHN5bWJvbCB0YWJsZSBibG9jayIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChDb2RlID09IGJpdGM6OkVOVEVSX1NVQkJMT0NLKSB7CisgICAgICAvLyBObyBrbm93biBzdWJibG9ja3MsIGFsd2F5cyBza2lwIHRoZW0uCisgICAgICBTdHJlYW0uUmVhZFN1YkJsb2NrSUQoKTsKKyAgICAgIGlmIChTdHJlYW0uU2tpcEJsb2NrKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiTWFsZm9ybWVkIGJsb2NrIHJlY29yZCIpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKENvZGUgPT0gYml0Yzo6REVGSU5FX0FCQlJFVikgeworICAgICAgU3RyZWFtLlJlYWRBYmJyZXZSZWNvcmQoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIFJlYWQgYSByZWNvcmQuCisgICAgUmVjb3JkLmNsZWFyKCk7CisgICAgc3dpdGNoIChTdHJlYW0uUmVhZFJlY29yZChDb2RlLCBSZWNvcmQpKSB7CisgICAgZGVmYXVsdDogIC8vIERlZmF1bHQgYmVoYXZpb3I6IHVua25vd24gdHlwZS4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6VFNUX0NPREVfRU5UUlk6ICAgIC8vIFRTVF9FTlRSWTogW3R5cGVpZCwgbmFtZWNoYXIgeCBOXQorICAgICAgaWYgKENvbnZlcnRUb1N0cmluZyhSZWNvcmQsIDEsIFR5cGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIFRTVF9FTlRSWSByZWNvcmQiKTsKKyAgICAgIHVuc2lnbmVkIFR5cGVJRCA9IFJlY29yZFswXTsKKyAgICAgIGlmIChUeXBlSUQgPj0gVHlwZUxpc3Quc2l6ZSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgVHlwZSBJRCBpbiBUU1RfRU5UUlkgcmVjb3JkIik7CisKKyAgICAgIFRoZU1vZHVsZS0+YWRkVHlwZU5hbWUoVHlwZU5hbWUsIFR5cGVMaXN0W1R5cGVJRF0uZ2V0KCkpOworICAgICAgVHlwZU5hbWUuY2xlYXIoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitib29sIEJpdGNvZGVSZWFkZXI6OlBhcnNlVmFsdWVTeW1ib2xUYWJsZSgpIHsKKyAgaWYgKFN0cmVhbS5FbnRlclN1YkJsb2NrKGJpdGM6OlZBTFVFX1NZTVRBQl9CTE9DS19JRCkpCisgICAgcmV0dXJuIEVycm9yKCJNYWxmb3JtZWQgYmxvY2sgcmVjb3JkIik7CisKKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDY0PiBSZWNvcmQ7CisKKyAgLy8gUmVhZCBhbGwgdGhlIHJlY29yZHMgZm9yIHRoaXMgdmFsdWUgdGFibGUuCisgIFNtYWxsU3RyaW5nPDEyOD4gVmFsdWVOYW1lOworICB3aGlsZSAoMSkgeworICAgIHVuc2lnbmVkIENvZGUgPSBTdHJlYW0uUmVhZENvZGUoKTsKKyAgICBpZiAoQ29kZSA9PSBiaXRjOjpFTkRfQkxPQ0spIHsKKyAgICAgIGlmIChTdHJlYW0uUmVhZEJsb2NrRW5kKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiRXJyb3IgYXQgZW5kIG9mIHZhbHVlIHN5bWJvbCB0YWJsZSBibG9jayIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoQ29kZSA9PSBiaXRjOjpFTlRFUl9TVUJCTE9DSykgeworICAgICAgLy8gTm8ga25vd24gc3ViYmxvY2tzLCBhbHdheXMgc2tpcCB0aGVtLgorICAgICAgU3RyZWFtLlJlYWRTdWJCbG9ja0lEKCk7CisgICAgICBpZiAoU3RyZWFtLlNraXBCbG9jaygpKQorICAgICAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBibG9jayByZWNvcmQiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChDb2RlID09IGJpdGM6OkRFRklORV9BQkJSRVYpIHsKKyAgICAgIFN0cmVhbS5SZWFkQWJicmV2UmVjb3JkKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGEgcmVjb3JkLgorICAgIFJlY29yZC5jbGVhcigpOworICAgIHN3aXRjaCAoU3RyZWFtLlJlYWRSZWNvcmQoQ29kZSwgUmVjb3JkKSkgeworICAgIGRlZmF1bHQ6ICAvLyBEZWZhdWx0IGJlaGF2aW9yOiB1bmtub3duIHR5cGUuCisgICAgICBicmVhazsKKyAgICBjYXNlIGJpdGM6OlZTVF9DT0RFX0VOVFJZOiB7ICAvLyBWU1RfRU5UUlk6IFt2YWx1ZWlkLCBuYW1lY2hhciB4IE5dCisgICAgICBpZiAoQ29udmVydFRvU3RyaW5nKFJlY29yZCwgMSwgVmFsdWVOYW1lKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIFZTVF9FTlRSWSByZWNvcmQiKTsKKyAgICAgIHVuc2lnbmVkIFZhbHVlSUQgPSBSZWNvcmRbMF07CisgICAgICBpZiAoVmFsdWVJRCA+PSBWYWx1ZUxpc3Quc2l6ZSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgVmFsdWUgSUQgaW4gVlNUX0VOVFJZIHJlY29yZCIpOworICAgICAgVmFsdWUgKlYgPSBWYWx1ZUxpc3RbVmFsdWVJRF07CisKKyAgICAgIFYtPnNldE5hbWUoU3RyaW5nUmVmKFZhbHVlTmFtZS5kYXRhKCksIFZhbHVlTmFtZS5zaXplKCkpKTsKKyAgICAgIFZhbHVlTmFtZS5jbGVhcigpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYml0Yzo6VlNUX0NPREVfQkJFTlRSWTogeworICAgICAgaWYgKENvbnZlcnRUb1N0cmluZyhSZWNvcmQsIDEsIFZhbHVlTmFtZSkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBWU1RfQkJFTlRSWSByZWNvcmQiKTsKKyAgICAgIEJhc2ljQmxvY2sgKkJCID0gZ2V0QmFzaWNCbG9jayhSZWNvcmRbMF0pOworICAgICAgaWYgKEJCID09IDApCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBCQiBJRCBpbiBWU1RfQkJFTlRSWSByZWNvcmQiKTsKKworICAgICAgQkItPnNldE5hbWUoU3RyaW5nUmVmKFZhbHVlTmFtZS5kYXRhKCksIFZhbHVlTmFtZS5zaXplKCkpKTsKKyAgICAgIFZhbHVlTmFtZS5jbGVhcigpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgfQorfQorCitib29sIEJpdGNvZGVSZWFkZXI6OlBhcnNlTWV0YWRhdGEoKSB7CisgIHVuc2lnbmVkIE5leHRNRFZhbHVlTm8gPSBNRFZhbHVlTGlzdC5zaXplKCk7CisKKyAgaWYgKFN0cmVhbS5FbnRlclN1YkJsb2NrKGJpdGM6Ok1FVEFEQVRBX0JMT0NLX0lEKSkKKyAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBibG9jayByZWNvcmQiKTsKKworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+IFJlY29yZDsKKworICAvLyBSZWFkIGFsbCB0aGUgcmVjb3Jkcy4KKyAgd2hpbGUgKDEpIHsKKyAgICB1bnNpZ25lZCBDb2RlID0gU3RyZWFtLlJlYWRDb2RlKCk7CisgICAgaWYgKENvZGUgPT0gYml0Yzo6RU5EX0JMT0NLKSB7CisgICAgICBpZiAoU3RyZWFtLlJlYWRCbG9ja0VuZCgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkVycm9yIGF0IGVuZCBvZiBQQVJBTUFUVFIgYmxvY2siKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoQ29kZSA9PSBiaXRjOjpFTlRFUl9TVUJCTE9DSykgeworICAgICAgLy8gTm8ga25vd24gc3ViYmxvY2tzLCBhbHdheXMgc2tpcCB0aGVtLgorICAgICAgU3RyZWFtLlJlYWRTdWJCbG9ja0lEKCk7CisgICAgICBpZiAoU3RyZWFtLlNraXBCbG9jaygpKQorICAgICAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBibG9jayByZWNvcmQiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChDb2RlID09IGJpdGM6OkRFRklORV9BQkJSRVYpIHsKKyAgICAgIFN0cmVhbS5SZWFkQWJicmV2UmVjb3JkKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBib29sIElzRnVuY3Rpb25Mb2NhbCA9IGZhbHNlOworICAgIC8vIFJlYWQgYSByZWNvcmQuCisgICAgUmVjb3JkLmNsZWFyKCk7CisgICAgc3dpdGNoIChTdHJlYW0uUmVhZFJlY29yZChDb2RlLCBSZWNvcmQpKSB7CisgICAgZGVmYXVsdDogIC8vIERlZmF1bHQgYmVoYXZpb3I6IGlnbm9yZS4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6TUVUQURBVEFfTkFNRTogeworICAgICAgLy8gUmVhZCBuYW1lZCBvZiB0aGUgbmFtZWQgbWV0YWRhdGEuCisgICAgICB1bnNpZ25lZCBOYW1lTGVuZ3RoID0gUmVjb3JkLnNpemUoKTsKKyAgICAgIFNtYWxsU3RyaW5nPDg+IE5hbWU7CisgICAgICBOYW1lLnJlc2l6ZShOYW1lTGVuZ3RoKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTmFtZUxlbmd0aDsgKytpKQorICAgICAgICBOYW1lW2ldID0gUmVjb3JkW2ldOworICAgICAgUmVjb3JkLmNsZWFyKCk7CisgICAgICBDb2RlID0gU3RyZWFtLlJlYWRDb2RlKCk7CisKKyAgICAgIC8vIE1FVEFEQVRBX05BTUUgaXMgYWx3YXlzIGZvbGxvd2VkIGJ5IE1FVEFEQVRBX05BTUVEX05PREUuCisgICAgICBpZiAoU3RyZWFtLlJlYWRSZWNvcmQoQ29kZSwgUmVjb3JkKSAhPSBiaXRjOjpNRVRBREFUQV9OQU1FRF9OT0RFKQorICAgICAgICBhc3NlcnQgKCAwICYmICJJbmF2bGlkIE5hbWVkIE1ldGFkYXRhIHJlY29yZCIpOworCisgICAgICAvLyBSZWFkIG5hbWVkIG1ldGFkYXRhIGVsZW1lbnRzLgorICAgICAgdW5zaWduZWQgU2l6ZSA9IFJlY29yZC5zaXplKCk7CisgICAgICBOYW1lZE1ETm9kZSAqTk1EID0gVGhlTW9kdWxlLT5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEoTmFtZSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFNpemU7ICsraSkgeworICAgICAgICBNRE5vZGUgKk1EID0gZHluX2Nhc3Q8TUROb2RlPihNRFZhbHVlTGlzdC5nZXRWYWx1ZUZ3ZFJlZihSZWNvcmRbaV0pKTsKKyAgICAgICAgaWYgKE1EID09IDApCisgICAgICAgICAgcmV0dXJuIEVycm9yKCJNYWxmb3JtZWQgbWV0YWRhdGEgcmVjb3JkIik7CisgICAgICAgIE5NRC0+YWRkT3BlcmFuZChNRCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpNRVRBREFUQV9GTl9OT0RFOgorICAgICAgSXNGdW5jdGlvbkxvY2FsID0gdHJ1ZTsKKyAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgIGNhc2UgYml0Yzo6TUVUQURBVEFfTk9ERTogeworICAgICAgaWYgKFJlY29yZC5zaXplKCkgJSAyID09IDEpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBNRVRBREFUQV9OT0RFIHJlY29yZCIpOworCisgICAgICB1bnNpZ25lZCBTaXplID0gUmVjb3JkLnNpemUoKTsKKyAgICAgIFNtYWxsVmVjdG9yPFZhbHVlKiwgOD4gRWx0czsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gU2l6ZTsgaSArPSAyKSB7CisgICAgICAgIGNvbnN0IFR5cGUgKlR5ID0gZ2V0VHlwZUJ5SUQoUmVjb3JkW2ldLCBmYWxzZSk7CisgICAgICAgIGlmIChUeS0+aXNNZXRhZGF0YVR5KCkpCisgICAgICAgICAgRWx0cy5wdXNoX2JhY2soTURWYWx1ZUxpc3QuZ2V0VmFsdWVGd2RSZWYoUmVjb3JkW2krMV0pKTsKKyAgICAgICAgZWxzZSBpZiAoIVR5LT5pc1ZvaWRUeSgpKQorICAgICAgICAgIEVsdHMucHVzaF9iYWNrKFZhbHVlTGlzdC5nZXRWYWx1ZUZ3ZFJlZihSZWNvcmRbaSsxXSwgVHkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEVsdHMucHVzaF9iYWNrKE5VTEwpOworICAgICAgfQorICAgICAgVmFsdWUgKlYgPSBNRE5vZGU6OmdldFdoZW5WYWxzVW5yZXNvbHZlZChDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbHRzLmRhdGEoKSwgRWx0cy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzRnVuY3Rpb25Mb2NhbCk7CisgICAgICBJc0Z1bmN0aW9uTG9jYWwgPSBmYWxzZTsKKyAgICAgIE1EVmFsdWVMaXN0LkFzc2lnblZhbHVlKFYsIE5leHRNRFZhbHVlTm8rKyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpNRVRBREFUQV9TVFJJTkc6IHsKKyAgICAgIHVuc2lnbmVkIE1EU3RyaW5nTGVuZ3RoID0gUmVjb3JkLnNpemUoKTsKKyAgICAgIFNtYWxsU3RyaW5nPDg+IFN0cmluZzsKKyAgICAgIFN0cmluZy5yZXNpemUoTURTdHJpbmdMZW5ndGgpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNRFN0cmluZ0xlbmd0aDsgKytpKQorICAgICAgICBTdHJpbmdbaV0gPSBSZWNvcmRbaV07CisgICAgICBWYWx1ZSAqViA9IE1EU3RyaW5nOjpnZXQoQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYoU3RyaW5nLmRhdGEoKSwgU3RyaW5nLnNpemUoKSkpOworICAgICAgTURWYWx1ZUxpc3QuQXNzaWduVmFsdWUoViwgTmV4dE1EVmFsdWVObysrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6Ok1FVEFEQVRBX0tJTkQ6IHsKKyAgICAgIHVuc2lnbmVkIFJlY29yZExlbmd0aCA9IFJlY29yZC5zaXplKCk7CisgICAgICBpZiAoUmVjb3JkLmVtcHR5KCkgfHwgUmVjb3JkTGVuZ3RoIDwgMikKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIE1FVEFEQVRBX0tJTkQgcmVjb3JkIik7CisgICAgICBTbWFsbFN0cmluZzw4PiBOYW1lOworICAgICAgTmFtZS5yZXNpemUoUmVjb3JkTGVuZ3RoLTEpOworICAgICAgdW5zaWduZWQgS2luZCA9IFJlY29yZFswXTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgIT0gUmVjb3JkTGVuZ3RoOyArK2kpCisgICAgICAgIE5hbWVbaS0xXSA9IFJlY29yZFtpXTsKKyAgICAgIAorICAgICAgdW5zaWduZWQgTmV3S2luZCA9IFRoZU1vZHVsZS0+Z2V0TURLaW5kSUQoTmFtZS5zdHIoKSk7CisgICAgICBpZiAoIU1ES2luZE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoS2luZCwgTmV3S2luZCkpLnNlY29uZCkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJDb25mbGljdGluZyBNRVRBREFUQV9LSU5EIHJlY29yZHMiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgIH0KK30KKworLy8vIERlY29kZVNpZ25Sb3RhdGVkVmFsdWUgLSBEZWNvZGUgYSBzaWduZWQgdmFsdWUgc3RvcmVkIHdpdGggdGhlIHNpZ24gYml0IGluCisvLy8gdGhlIExTQiBmb3IgZGVuc2UgVkJSIGVuY29kaW5nLgorc3RhdGljIHVpbnQ2NF90IERlY29kZVNpZ25Sb3RhdGVkVmFsdWUodWludDY0X3QgVikgeworICBpZiAoKFYgJiAxKSA9PSAwKQorICAgIHJldHVybiBWID4+IDE7CisgIGlmIChWICE9IDEpCisgICAgcmV0dXJuIC0oViA+PiAxKTsKKyAgLy8gVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyAtMCB3aXRoIGludGVnZXJzLiAgIi0wIiByZWFsbHkgbWVhbnMgTUlOSU5ULgorICByZXR1cm4gMVVMTCA8PCA2MzsKK30KKworLy8vIFJlc29sdmVHbG9iYWxBbmRBbGlhc0luaXRzIC0gUmVzb2x2ZSBhbGwgb2YgdGhlIGluaXRpYWxpemVycyBmb3IgZ2xvYmFsCisvLy8gdmFsdWVzIGFuZCBhbGlhc2VzIHRoYXQgd2UgY2FuLgorYm9vbCBCaXRjb2RlUmVhZGVyOjpSZXNvbHZlR2xvYmFsQW5kQWxpYXNJbml0cygpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEdsb2JhbFZhcmlhYmxlKiwgdW5zaWduZWQ+ID4gR2xvYmFsSW5pdFdvcmtsaXN0OworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8R2xvYmFsQWxpYXMqLCB1bnNpZ25lZD4gPiBBbGlhc0luaXRXb3JrbGlzdDsKKworICBHbG9iYWxJbml0V29ya2xpc3Quc3dhcChHbG9iYWxJbml0cyk7CisgIEFsaWFzSW5pdFdvcmtsaXN0LnN3YXAoQWxpYXNJbml0cyk7CisKKyAgd2hpbGUgKCFHbG9iYWxJbml0V29ya2xpc3QuZW1wdHkoKSkgeworICAgIHVuc2lnbmVkIFZhbElEID0gR2xvYmFsSW5pdFdvcmtsaXN0LmJhY2soKS5zZWNvbmQ7CisgICAgaWYgKFZhbElEID49IFZhbHVlTGlzdC5zaXplKCkpIHsKKyAgICAgIC8vIE5vdCByZWFkeSB0byByZXNvbHZlIHRoaXMgeWV0LCBpdCByZXF1aXJlcyBzb21ldGhpbmcgbGF0ZXIgaW4gdGhlIGZpbGUuCisgICAgICBHbG9iYWxJbml0cy5wdXNoX2JhY2soR2xvYmFsSW5pdFdvcmtsaXN0LmJhY2soKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihWYWx1ZUxpc3RbVmFsSURdKSkKKyAgICAgICAgR2xvYmFsSW5pdFdvcmtsaXN0LmJhY2soKS5maXJzdC0+c2V0SW5pdGlhbGl6ZXIoQyk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBFcnJvcigiR2xvYmFsIHZhcmlhYmxlIGluaXRpYWxpemVyIGlzIG5vdCBhIGNvbnN0YW50ISIpOworICAgIH0KKyAgICBHbG9iYWxJbml0V29ya2xpc3QucG9wX2JhY2soKTsKKyAgfQorCisgIHdoaWxlICghQWxpYXNJbml0V29ya2xpc3QuZW1wdHkoKSkgeworICAgIHVuc2lnbmVkIFZhbElEID0gQWxpYXNJbml0V29ya2xpc3QuYmFjaygpLnNlY29uZDsKKyAgICBpZiAoVmFsSUQgPj0gVmFsdWVMaXN0LnNpemUoKSkgeworICAgICAgQWxpYXNJbml0cy5wdXNoX2JhY2soQWxpYXNJbml0V29ya2xpc3QuYmFjaygpKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFZhbHVlTGlzdFtWYWxJRF0pKQorICAgICAgICBBbGlhc0luaXRXb3JrbGlzdC5iYWNrKCkuZmlyc3QtPnNldEFsaWFzZWUoQyk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBFcnJvcigiQWxpYXMgaW5pdGlhbGl6ZXIgaXMgbm90IGEgY29uc3RhbnQhIik7CisgICAgfQorICAgIEFsaWFzSW5pdFdvcmtsaXN0LnBvcF9iYWNrKCk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJpdGNvZGVSZWFkZXI6OlBhcnNlQ29uc3RhbnRzKCkgeworICBpZiAoU3RyZWFtLkVudGVyU3ViQmxvY2soYml0Yzo6Q09OU1RBTlRTX0JMT0NLX0lEKSkKKyAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBibG9jayByZWNvcmQiKTsKKworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+IFJlY29yZDsKKworICAvLyBSZWFkIGFsbCB0aGUgcmVjb3JkcyBmb3IgdGhpcyB2YWx1ZSB0YWJsZS4KKyAgY29uc3QgVHlwZSAqQ3VyVHkgPSBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpOworICB1bnNpZ25lZCBOZXh0Q3N0Tm8gPSBWYWx1ZUxpc3Quc2l6ZSgpOworICB3aGlsZSAoMSkgeworICAgIHVuc2lnbmVkIENvZGUgPSBTdHJlYW0uUmVhZENvZGUoKTsKKyAgICBpZiAoQ29kZSA9PSBiaXRjOjpFTkRfQkxPQ0spCisgICAgICBicmVhazsKKworICAgIGlmIChDb2RlID09IGJpdGM6OkVOVEVSX1NVQkJMT0NLKSB7CisgICAgICAvLyBObyBrbm93biBzdWJibG9ja3MsIGFsd2F5cyBza2lwIHRoZW0uCisgICAgICBTdHJlYW0uUmVhZFN1YkJsb2NrSUQoKTsKKyAgICAgIGlmIChTdHJlYW0uU2tpcEJsb2NrKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiTWFsZm9ybWVkIGJsb2NrIHJlY29yZCIpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKENvZGUgPT0gYml0Yzo6REVGSU5FX0FCQlJFVikgeworICAgICAgU3RyZWFtLlJlYWRBYmJyZXZSZWNvcmQoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIFJlYWQgYSByZWNvcmQuCisgICAgUmVjb3JkLmNsZWFyKCk7CisgICAgVmFsdWUgKlYgPSAwOworICAgIHVuc2lnbmVkIEJpdENvZGUgPSBTdHJlYW0uUmVhZFJlY29yZChDb2RlLCBSZWNvcmQpOworICAgIHN3aXRjaCAoQml0Q29kZSkgeworICAgIGRlZmF1bHQ6ICAvLyBEZWZhdWx0IGJlaGF2aW9yOiB1bmtub3duIGNvbnN0YW50CisgICAgY2FzZSBiaXRjOjpDU1RfQ09ERV9VTkRFRjogICAgIC8vIFVOREVGCisgICAgICBWID0gVW5kZWZWYWx1ZTo6Z2V0KEN1clR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6Q1NUX0NPREVfU0VUVFlQRTogICAvLyBTRVRUWVBFOiBbdHlwZWlkXQorICAgICAgaWYgKFJlY29yZC5lbXB0eSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBDU1RfU0VUVFlQRSByZWNvcmQiKTsKKyAgICAgIGlmIChSZWNvcmRbMF0gPj0gVHlwZUxpc3Quc2l6ZSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgVHlwZSBJRCBpbiBDU1RfU0VUVFlQRSByZWNvcmQiKTsKKyAgICAgIEN1clR5ID0gVHlwZUxpc3RbUmVjb3JkWzBdXTsKKyAgICAgIGNvbnRpbnVlOyAgLy8gU2tpcCB0aGUgVmFsdWVMaXN0IG1hbmlwdWxhdGlvbi4KKyAgICBjYXNlIGJpdGM6OkNTVF9DT0RFX05VTEw6ICAgICAgLy8gTlVMTAorICAgICAgViA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoQ3VyVHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiaXRjOjpDU1RfQ09ERV9JTlRFR0VSOiAgIC8vIElOVEVHRVI6IFtpbnR2YWxdCisgICAgICBpZiAoIUN1clR5LT5pc0ludGVnZXJUeSgpIHx8IFJlY29yZC5lbXB0eSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgQ1NUX0lOVEVHRVIgcmVjb3JkIik7CisgICAgICBWID0gQ29uc3RhbnRJbnQ6OmdldChDdXJUeSwgRGVjb2RlU2lnblJvdGF0ZWRWYWx1ZShSZWNvcmRbMF0pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6Q1NUX0NPREVfV0lERV9JTlRFR0VSOiB7Ly8gV0lERV9JTlRFR0VSOiBbbiB4IGludHZhbF0KKyAgICAgIGlmICghQ3VyVHktPmlzSW50ZWdlclR5KCkgfHwgUmVjb3JkLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBXSURFX0lOVEVHRVIgcmVjb3JkIik7CisKKyAgICAgIHVuc2lnbmVkIE51bVdvcmRzID0gUmVjb3JkLnNpemUoKTsKKyAgICAgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA4PiBXb3JkczsKKyAgICAgIFdvcmRzLnJlc2l6ZShOdW1Xb3Jkcyk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVdvcmRzOyArK2kpCisgICAgICAgIFdvcmRzW2ldID0gRGVjb2RlU2lnblJvdGF0ZWRWYWx1ZShSZWNvcmRbaV0pOworICAgICAgViA9IENvbnN0YW50SW50OjpnZXQoQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50KGNhc3Q8SW50ZWdlclR5cGU+KEN1clR5KS0+Z2V0Qml0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVdvcmRzLCAmV29yZHNbMF0pKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OkNTVF9DT0RFX0ZMT0FUOiB7ICAgIC8vIEZMT0FUOiBbZnB2YWxdCisgICAgICBpZiAoUmVjb3JkLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBGTE9BVCByZWNvcmQiKTsKKyAgICAgIGlmIChDdXJUeS0+aXNGbG9hdFR5KCkpCisgICAgICAgIFYgPSBDb25zdGFudEZQOjpnZXQoQ29udGV4dCwgQVBGbG9hdChBUEludCgzMiwgKHVpbnQzMl90KVJlY29yZFswXSkpKTsKKyAgICAgIGVsc2UgaWYgKEN1clR5LT5pc0RvdWJsZVR5KCkpCisgICAgICAgIFYgPSBDb25zdGFudEZQOjpnZXQoQ29udGV4dCwgQVBGbG9hdChBUEludCg2NCwgUmVjb3JkWzBdKSkpOworICAgICAgZWxzZSBpZiAoQ3VyVHktPmlzWDg2X0ZQODBUeSgpKSB7CisgICAgICAgIC8vIEJpdHMgYXJlIG5vdCBzdG9yZWQgdGhlIHNhbWUgd2F5IGFzIGEgbm9ybWFsIGk4MCBBUEludCwgY29tcGVuc2F0ZS4KKyAgICAgICAgdWludDY0X3QgUmVhcnJhbmdlWzJdOworICAgICAgICBSZWFycmFuZ2VbMF0gPSAoUmVjb3JkWzFdICYgMHhmZmZmTEwpIHwgKFJlY29yZFswXSA8PCAxNik7CisgICAgICAgIFJlYXJyYW5nZVsxXSA9IFJlY29yZFswXSA+PiA0ODsKKyAgICAgICAgViA9IENvbnN0YW50RlA6OmdldChDb250ZXh0LCBBUEZsb2F0KEFQSW50KDgwLCAyLCBSZWFycmFuZ2UpKSk7CisgICAgICB9IGVsc2UgaWYgKEN1clR5LT5pc0ZQMTI4VHkoKSkKKyAgICAgICAgViA9IENvbnN0YW50RlA6OmdldChDb250ZXh0LCBBUEZsb2F0KEFQSW50KDEyOCwgMiwgJlJlY29yZFswXSksIHRydWUpKTsKKyAgICAgIGVsc2UgaWYgKEN1clR5LT5pc1BQQ19GUDEyOFR5KCkpCisgICAgICAgIFYgPSBDb25zdGFudEZQOjpnZXQoQ29udGV4dCwgQVBGbG9hdChBUEludCgxMjgsIDIsICZSZWNvcmRbMF0pKSk7CisgICAgICBlbHNlCisgICAgICAgIFYgPSBVbmRlZlZhbHVlOjpnZXQoQ3VyVHkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBiaXRjOjpDU1RfQ09ERV9BR0dSRUdBVEU6IHsvLyBBR0dSRUdBVEU6IFtuIHggdmFsdWUgbnVtYmVyXQorICAgICAgaWYgKFJlY29yZC5lbXB0eSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgQ1NUX0FHR1JFR0FURSByZWNvcmQiKTsKKworICAgICAgdW5zaWduZWQgU2l6ZSA9IFJlY29yZC5zaXplKCk7CisgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEVsdHM7CisKKyAgICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihDdXJUeSkpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBTaXplOyArK2kpCisgICAgICAgICAgRWx0cy5wdXNoX2JhY2soVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1R5LT5nZXRFbGVtZW50VHlwZShpKSkpOworICAgICAgICBWID0gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVHksIEVsdHMpOworICAgICAgfSBlbHNlIGlmIChjb25zdCBVbmlvblR5cGUgKlVuVHkgPSBkeW5fY2FzdDxVbmlvblR5cGU+KEN1clR5KSkgeworICAgICAgICB1aW50NjRfdCBJbmRleCA9IFJlY29yZFswXTsKKyAgICAgICAgQ29uc3RhbnQgKlZhbCA9IFZhbHVlTGlzdC5nZXRDb25zdGFudEZ3ZFJlZihSZWNvcmRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5UeS0+Z2V0RWxlbWVudFR5cGUoSW5kZXgpKTsKKyAgICAgICAgViA9IENvbnN0YW50VW5pb246OmdldChVblR5LCBWYWwpOworICAgICAgfSBlbHNlIGlmIChjb25zdCBBcnJheVR5cGUgKkFUeSA9IGR5bl9jYXN0PEFycmF5VHlwZT4oQ3VyVHkpKSB7CisgICAgICAgIGNvbnN0IFR5cGUgKkVsdFR5ID0gQVR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFNpemU7ICsraSkKKyAgICAgICAgICBFbHRzLnB1c2hfYmFjayhWYWx1ZUxpc3QuZ2V0Q29uc3RhbnRGd2RSZWYoUmVjb3JkW2ldLCBFbHRUeSkpOworICAgICAgICBWID0gQ29uc3RhbnRBcnJheTo6Z2V0KEFUeSwgRWx0cyk7CisgICAgICB9IGVsc2UgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KEN1clR5KSkgeworICAgICAgICBjb25zdCBUeXBlICpFbHRUeSA9IFZUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBTaXplOyArK2kpCisgICAgICAgICAgRWx0cy5wdXNoX2JhY2soVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFtpXSwgRWx0VHkpKTsKKyAgICAgICAgViA9IENvbnN0YW50VmVjdG9yOjpnZXQoRWx0cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBWID0gVW5kZWZWYWx1ZTo6Z2V0KEN1clR5KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OkNTVF9DT0RFX1NUUklORzogeyAvLyBTVFJJTkc6IFt2YWx1ZXNdCisgICAgICBpZiAoUmVjb3JkLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBDU1RfQUdHUkVHQVRFIHJlY29yZCIpOworCisgICAgICBjb25zdCBBcnJheVR5cGUgKkFUeSA9IGNhc3Q8QXJyYXlUeXBlPihDdXJUeSk7CisgICAgICBjb25zdCBUeXBlICpFbHRUeSA9IEFUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKworICAgICAgdW5zaWduZWQgU2l6ZSA9IFJlY29yZC5zaXplKCk7CisgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEVsdHM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFNpemU7ICsraSkKKyAgICAgICAgRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChFbHRUeSwgUmVjb3JkW2ldKSk7CisgICAgICBWID0gQ29uc3RhbnRBcnJheTo6Z2V0KEFUeSwgRWx0cyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpDU1RfQ09ERV9DU1RSSU5HOiB7IC8vIENTVFJJTkc6IFt2YWx1ZXNdCisgICAgICBpZiAoUmVjb3JkLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBDU1RfQUdHUkVHQVRFIHJlY29yZCIpOworCisgICAgICBjb25zdCBBcnJheVR5cGUgKkFUeSA9IGNhc3Q8QXJyYXlUeXBlPihDdXJUeSk7CisgICAgICBjb25zdCBUeXBlICpFbHRUeSA9IEFUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKworICAgICAgdW5zaWduZWQgU2l6ZSA9IFJlY29yZC5zaXplKCk7CisgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEVsdHM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFNpemU7ICsraSkKKyAgICAgICAgRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChFbHRUeSwgUmVjb3JkW2ldKSk7CisgICAgICBFbHRzLnB1c2hfYmFjayhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KSk7CisgICAgICBWID0gQ29uc3RhbnRBcnJheTo6Z2V0KEFUeSwgRWx0cyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpDU1RfQ09ERV9DRV9CSU5PUDogeyAgLy8gQ0VfQklOT1A6IFtvcGNvZGUsIG9wdmFsLCBvcHZhbF0KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMykgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0JJTk9QIHJlY29yZCIpOworICAgICAgaW50IE9wYyA9IEdldERlY29kZWRCaW5hcnlPcGNvZGUoUmVjb3JkWzBdLCBDdXJUeSk7CisgICAgICBpZiAoT3BjIDwgMCkgeworICAgICAgICBWID0gVW5kZWZWYWx1ZTo6Z2V0KEN1clR5KTsgIC8vIFVua25vd24gYmlub3AuCisgICAgICB9IGVsc2UgeworICAgICAgICBDb25zdGFudCAqTEhTID0gVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFsxXSwgQ3VyVHkpOworICAgICAgICBDb25zdGFudCAqUkhTID0gVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFsyXSwgQ3VyVHkpOworICAgICAgICB1bnNpZ25lZCBGbGFncyA9IDA7CisgICAgICAgIGlmIChSZWNvcmQuc2l6ZSgpID49IDQpIHsKKyAgICAgICAgICBpZiAoT3BjID09IEluc3RydWN0aW9uOjpBZGQgfHwKKyAgICAgICAgICAgICAgT3BjID09IEluc3RydWN0aW9uOjpTdWIgfHwKKyAgICAgICAgICAgICAgT3BjID09IEluc3RydWN0aW9uOjpNdWwpIHsKKyAgICAgICAgICAgIGlmIChSZWNvcmRbM10gJiAoMSA8PCBiaXRjOjpPQk9fTk9fU0lHTkVEX1dSQVApKQorICAgICAgICAgICAgICBGbGFncyB8PSBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1NpZ25lZFdyYXA7CisgICAgICAgICAgICBpZiAoUmVjb3JkWzNdICYgKDEgPDwgYml0Yzo6T0JPX05PX1VOU0lHTkVEX1dSQVApKQorICAgICAgICAgICAgICBGbGFncyB8PSBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1Vuc2lnbmVkV3JhcDsKKyAgICAgICAgICB9IGVsc2UgaWYgKE9wYyA9PSBJbnN0cnVjdGlvbjo6U0RpdikgeworICAgICAgICAgICAgaWYgKFJlY29yZFszXSAmICgxIDw8IGJpdGM6OlNESVZfRVhBQ1QpKQorICAgICAgICAgICAgICBGbGFncyB8PSBTRGl2T3BlcmF0b3I6OklzRXhhY3Q7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFYgPSBDb25zdGFudEV4cHI6OmdldChPcGMsIExIUywgUkhTLCBGbGFncyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpDU1RfQ09ERV9DRV9DQVNUOiB7ICAvLyBDRV9DQVNUOiBbb3Bjb2RlLCBvcHR5LCBvcHZhbF0KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMykgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0NBU1QgcmVjb3JkIik7CisgICAgICBpbnQgT3BjID0gR2V0RGVjb2RlZENhc3RPcGNvZGUoUmVjb3JkWzBdKTsKKyAgICAgIGlmIChPcGMgPCAwKSB7CisgICAgICAgIFYgPSBVbmRlZlZhbHVlOjpnZXQoQ3VyVHkpOyAgLy8gVW5rbm93biBjYXN0LgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgVHlwZSAqT3BUeSA9IGdldFR5cGVCeUlEKFJlY29yZFsxXSk7CisgICAgICAgIGlmICghT3BUeSkgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0NBU1QgcmVjb3JkIik7CisgICAgICAgIENvbnN0YW50ICpPcCA9IFZhbHVlTGlzdC5nZXRDb25zdGFudEZ3ZFJlZihSZWNvcmRbMl0sIE9wVHkpOworICAgICAgICBWID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KE9wYywgT3AsIEN1clR5KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OkNTVF9DT0RFX0NFX0lOQk9VTkRTX0dFUDoKKyAgICBjYXNlIGJpdGM6OkNTVF9DT0RFX0NFX0dFUDogeyAgLy8gQ0VfR0VQOiAgICAgICAgW24geCBvcGVyYW5kc10KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpICYgMSkgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0dFUCByZWNvcmQiKTsKKyAgICAgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgMTY+IEVsdHM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVjb3JkLnNpemUoKTsgaSAhPSBlOyBpICs9IDIpIHsKKyAgICAgICAgY29uc3QgVHlwZSAqRWxUeSA9IGdldFR5cGVCeUlEKFJlY29yZFtpXSk7CisgICAgICAgIGlmICghRWxUeSkgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0dFUCByZWNvcmQiKTsKKyAgICAgICAgRWx0cy5wdXNoX2JhY2soVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFtpKzFdLCBFbFR5KSk7CisgICAgICB9CisgICAgICBpZiAoQml0Q29kZSA9PSBiaXRjOjpDU1RfQ09ERV9DRV9JTkJPVU5EU19HRVApCisgICAgICAgIFYgPSBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihFbHRzWzBdLCAmRWx0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsdHMuc2l6ZSgpLTEpOworICAgICAgZWxzZQorICAgICAgICBWID0gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKEVsdHNbMF0sICZFbHRzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsdHMuc2l6ZSgpLTEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYml0Yzo6Q1NUX0NPREVfQ0VfU0VMRUNUOiAgLy8gQ0VfU0VMRUNUOiBbb3B2YWwjLCBvcHZhbCMsIG9wdmFsI10KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMykgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX1NFTEVDVCByZWNvcmQiKTsKKyAgICAgIFYgPSBDb25zdGFudEV4cHI6OmdldFNlbGVjdChWYWx1ZUxpc3QuZ2V0Q29uc3RhbnRGd2RSZWYoUmVjb3JkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQxVHkoQ29udGV4dCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTGlzdC5nZXRDb25zdGFudEZ3ZFJlZihSZWNvcmRbMV0sQ3VyVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTGlzdC5nZXRDb25zdGFudEZ3ZFJlZihSZWNvcmRbMl0sQ3VyVHkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6Q1NUX0NPREVfQ0VfRVhUUkFDVEVMVDogeyAvLyBDRV9FWFRSQUNURUxUOiBbb3B0eSwgb3B2YWwsIG9wdmFsXQorICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCAzKSByZXR1cm4gRXJyb3IoIkludmFsaWQgQ0VfRVhUUkFDVEVMVCByZWNvcmQiKTsKKyAgICAgIGNvbnN0IFZlY3RvclR5cGUgKk9wVHkgPQorICAgICAgICBkeW5fY2FzdF9vcl9udWxsPFZlY3RvclR5cGU+KGdldFR5cGVCeUlEKFJlY29yZFswXSkpOworICAgICAgaWYgKE9wVHkgPT0gMCkgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0VYVFJBQ1RFTFQgcmVjb3JkIik7CisgICAgICBDb25zdGFudCAqT3AwID0gVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFsxXSwgT3BUeSk7CisgICAgICBDb25zdGFudCAqT3AxID0gVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFsyXSwgVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSk7CisgICAgICBWID0gQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0RWxlbWVudChPcDAsIE9wMSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpDU1RfQ09ERV9DRV9JTlNFUlRFTFQ6IHsgLy8gQ0VfSU5TRVJURUxUOiBbb3B2YWwsIG9wdmFsLCBvcHZhbF0KKyAgICAgIGNvbnN0IFZlY3RvclR5cGUgKk9wVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihDdXJUeSk7CisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA8IDMgfHwgT3BUeSA9PSAwKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgQ0VfSU5TRVJURUxUIHJlY29yZCIpOworICAgICAgQ29uc3RhbnQgKk9wMCA9IFZhbHVlTGlzdC5nZXRDb25zdGFudEZ3ZFJlZihSZWNvcmRbMF0sIE9wVHkpOworICAgICAgQ29uc3RhbnQgKk9wMSA9IFZhbHVlTGlzdC5nZXRDb25zdGFudEZ3ZFJlZihSZWNvcmRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgQ29uc3RhbnQgKk9wMiA9IFZhbHVlTGlzdC5nZXRDb25zdGFudEZ3ZFJlZihSZWNvcmRbMl0sIFR5cGU6OmdldEludDMyVHkoQ29udGV4dCkpOworICAgICAgViA9IENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0RWxlbWVudChPcDAsIE9wMSwgT3AyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OkNTVF9DT0RFX0NFX1NIVUZGTEVWRUM6IHsgLy8gQ0VfU0hVRkZMRVZFQzogW29wdmFsLCBvcHZhbCwgb3B2YWxdCisgICAgICBjb25zdCBWZWN0b3JUeXBlICpPcFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oQ3VyVHkpOworICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCAzIHx8IE9wVHkgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX1NIVUZGTEVWRUMgcmVjb3JkIik7CisgICAgICBDb25zdGFudCAqT3AwID0gVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFswXSwgT3BUeSk7CisgICAgICBDb25zdGFudCAqT3AxID0gVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFsxXSwgT3BUeSk7CisgICAgICBjb25zdCBUeXBlICpTaHVmVHkgPSBWZWN0b3JUeXBlOjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcFR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgICAgIENvbnN0YW50ICpPcDIgPSBWYWx1ZUxpc3QuZ2V0Q29uc3RhbnRGd2RSZWYoUmVjb3JkWzJdLCBTaHVmVHkpOworICAgICAgViA9IENvbnN0YW50RXhwcjo6Z2V0U2h1ZmZsZVZlY3RvcihPcDAsIE9wMSwgT3AyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OkNTVF9DT0RFX0NFX1NIVUZWRUNfRVg6IHsgLy8gW29wdHksIG9wdmFsLCBvcHZhbCwgb3B2YWxdCisgICAgICBjb25zdCBWZWN0b3JUeXBlICpSVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihDdXJUeSk7CisgICAgICBjb25zdCBWZWN0b3JUeXBlICpPcFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oZ2V0VHlwZUJ5SUQoUmVjb3JkWzBdKSk7CisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA8IDQgfHwgUlR5ID09IDAgfHwgT3BUeSA9PSAwKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgQ0VfU0hVRlZFQ19FWCByZWNvcmQiKTsKKyAgICAgIENvbnN0YW50ICpPcDAgPSBWYWx1ZUxpc3QuZ2V0Q29uc3RhbnRGd2RSZWYoUmVjb3JkWzFdLCBPcFR5KTsKKyAgICAgIENvbnN0YW50ICpPcDEgPSBWYWx1ZUxpc3QuZ2V0Q29uc3RhbnRGd2RSZWYoUmVjb3JkWzJdLCBPcFR5KTsKKyAgICAgIGNvbnN0IFR5cGUgKlNodWZUeSA9IFZlY3RvclR5cGU6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUeS0+Z2V0TnVtRWxlbWVudHMoKSk7CisgICAgICBDb25zdGFudCAqT3AyID0gVmFsdWVMaXN0LmdldENvbnN0YW50RndkUmVmKFJlY29yZFszXSwgU2h1ZlR5KTsKKyAgICAgIFYgPSBDb25zdGFudEV4cHI6OmdldFNodWZmbGVWZWN0b3IoT3AwLCBPcDEsIE9wMik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpDU1RfQ09ERV9DRV9DTVA6IHsgICAgIC8vIENFX0NNUDogW29wdHksIG9wdmFsLCBvcHZhbCwgcHJlZF0KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgNCkgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0NNUCByZWNvcmQiKTsKKyAgICAgIGNvbnN0IFR5cGUgKk9wVHkgPSBnZXRUeXBlQnlJRChSZWNvcmRbMF0pOworICAgICAgaWYgKE9wVHkgPT0gMCkgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0NNUCByZWNvcmQiKTsKKyAgICAgIENvbnN0YW50ICpPcDAgPSBWYWx1ZUxpc3QuZ2V0Q29uc3RhbnRGd2RSZWYoUmVjb3JkWzFdLCBPcFR5KTsKKyAgICAgIENvbnN0YW50ICpPcDEgPSBWYWx1ZUxpc3QuZ2V0Q29uc3RhbnRGd2RSZWYoUmVjb3JkWzJdLCBPcFR5KTsKKworICAgICAgaWYgKE9wVHktPmlzRlBPckZQVmVjdG9yVHkoKSkKKyAgICAgICAgViA9IENvbnN0YW50RXhwcjo6Z2V0RkNtcChSZWNvcmRbM10sIE9wMCwgT3AxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgViA9IENvbnN0YW50RXhwcjo6Z2V0SUNtcChSZWNvcmRbM10sIE9wMCwgT3AxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OkNTVF9DT0RFX0lOTElORUFTTTogeworICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCAyKSByZXR1cm4gRXJyb3IoIkludmFsaWQgSU5MSU5FQVNNIHJlY29yZCIpOworICAgICAgc3RkOjpzdHJpbmcgQXNtU3RyLCBDb25zdHJTdHI7CisgICAgICBib29sIEhhc1NpZGVFZmZlY3RzID0gUmVjb3JkWzBdICYgMTsKKyAgICAgIGJvb2wgSXNBbGlnblN0YWNrID0gUmVjb3JkWzBdID4+IDE7CisgICAgICB1bnNpZ25lZCBBc21TdHJTaXplID0gUmVjb3JkWzFdOworICAgICAgaWYgKDIrQXNtU3RyU2l6ZSA+PSBSZWNvcmQuc2l6ZSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgSU5MSU5FQVNNIHJlY29yZCIpOworICAgICAgdW5zaWduZWQgQ29uc3RTdHJTaXplID0gUmVjb3JkWzIrQXNtU3RyU2l6ZV07CisgICAgICBpZiAoMytBc21TdHJTaXplK0NvbnN0U3RyU2l6ZSA+IFJlY29yZC5zaXplKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBJTkxJTkVBU00gcmVjb3JkIik7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gQXNtU3RyU2l6ZTsgKytpKQorICAgICAgICBBc21TdHIgKz0gKGNoYXIpUmVjb3JkWzIraV07CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IENvbnN0U3RyU2l6ZTsgKytpKQorICAgICAgICBDb25zdHJTdHIgKz0gKGNoYXIpUmVjb3JkWzMrQXNtU3RyU2l6ZStpXTsKKyAgICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihDdXJUeSk7CisgICAgICBWID0gSW5saW5lQXNtOjpnZXQoY2FzdDxGdW5jdGlvblR5cGU+KFBUeS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgQXNtU3RyLCBDb25zdHJTdHIsIEhhc1NpZGVFZmZlY3RzLCBJc0FsaWduU3RhY2spOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYml0Yzo6Q1NUX0NPREVfQkxPQ0tBRERSRVNTOnsKKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMykgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0JMT0NLQUREUkVTUyByZWNvcmQiKTsKKyAgICAgIGNvbnN0IFR5cGUgKkZuVHkgPSBnZXRUeXBlQnlJRChSZWNvcmRbMF0pOworICAgICAgaWYgKEZuVHkgPT0gMCkgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENFX0JMT0NLQUREUkVTUyByZWNvcmQiKTsKKyAgICAgIEZ1bmN0aW9uICpGbiA9CisgICAgICAgIGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb24+KFZhbHVlTGlzdC5nZXRDb25zdGFudEZ3ZFJlZihSZWNvcmRbMV0sRm5UeSkpOworICAgICAgaWYgKEZuID09IDApIHJldHVybiBFcnJvcigiSW52YWxpZCBDRV9CTE9DS0FERFJFU1MgcmVjb3JkIik7CisgICAgICAKKyAgICAgIEdsb2JhbFZhcmlhYmxlICpGd2RSZWYgPSBuZXcgR2xvYmFsVmFyaWFibGUoKkZuLT5nZXRQYXJlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50OFR5KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIiIpOworICAgICAgQmxvY2tBZGRyRndkUmVmc1tGbl0ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFJlY29yZFsyXSwgRndkUmVmKSk7CisgICAgICBWID0gRndkUmVmOworICAgICAgYnJlYWs7CisgICAgfSAgCisgICAgfQorCisgICAgVmFsdWVMaXN0LkFzc2lnblZhbHVlKFYsIE5leHRDc3RObyk7CisgICAgKytOZXh0Q3N0Tm87CisgIH0KKworICBpZiAoTmV4dENzdE5vICE9IFZhbHVlTGlzdC5zaXplKCkpCisgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIGNvbnN0YW50IHJlZmVyZW5jZSEiKTsKKworICBpZiAoU3RyZWFtLlJlYWRCbG9ja0VuZCgpKQorICAgIHJldHVybiBFcnJvcigiRXJyb3IgYXQgZW5kIG9mIGNvbnN0YW50cyBibG9jayIpOworCisgIC8vIE9uY2UgYWxsIHRoZSBjb25zdGFudHMgaGF2ZSBiZWVuIHJlYWQsIGdvIHRocm91Z2ggYW5kIHJlc29sdmUgZm9yd2FyZAorICAvLyByZWZlcmVuY2VzLgorICBWYWx1ZUxpc3QuUmVzb2x2ZUNvbnN0YW50Rm9yd2FyZFJlZnMoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUmVtZW1iZXJBbmRTa2lwRnVuY3Rpb25Cb2R5IC0gV2hlbiB3ZSBzZWUgdGhlIGJsb2NrIGZvciBhIGZ1bmN0aW9uIGJvZHksCisvLy8gcmVtZW1iZXIgd2hlcmUgaXQgaXMgYW5kIHRoZW4gc2tpcCBpdC4gIFRoaXMgbGV0cyB1cyBsYXppbHkgZGVzZXJpYWxpemUgdGhlCisvLy8gZnVuY3Rpb25zLgorYm9vbCBCaXRjb2RlUmVhZGVyOjpSZW1lbWJlckFuZFNraXBGdW5jdGlvbkJvZHkoKSB7CisgIC8vIEdldCB0aGUgZnVuY3Rpb24gd2UgYXJlIHRhbGtpbmcgYWJvdXQuCisgIGlmIChGdW5jdGlvbnNXaXRoQm9kaWVzLmVtcHR5KCkpCisgICAgcmV0dXJuIEVycm9yKCJJbnN1ZmZpY2llbnQgZnVuY3Rpb24gcHJvdG9zIik7CisKKyAgRnVuY3Rpb24gKkZuID0gRnVuY3Rpb25zV2l0aEJvZGllcy5iYWNrKCk7CisgIEZ1bmN0aW9uc1dpdGhCb2RpZXMucG9wX2JhY2soKTsKKworICAvLyBTYXZlIHRoZSBjdXJyZW50IHN0cmVhbSBzdGF0ZS4KKyAgdWludDY0X3QgQ3VyQml0ID0gU3RyZWFtLkdldEN1cnJlbnRCaXRObygpOworICBEZWZlcnJlZEZ1bmN0aW9uSW5mb1tGbl0gPSBDdXJCaXQ7CisKKyAgLy8gU2tpcCBvdmVyIHRoZSBmdW5jdGlvbiBibG9jayBmb3Igbm93LgorICBpZiAoU3RyZWFtLlNraXBCbG9jaygpKQorICAgIHJldHVybiBFcnJvcigiTWFsZm9ybWVkIGJsb2NrIHJlY29yZCIpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQml0Y29kZVJlYWRlcjo6UGFyc2VNb2R1bGUoKSB7CisgIGlmIChTdHJlYW0uRW50ZXJTdWJCbG9jayhiaXRjOjpNT0RVTEVfQkxPQ0tfSUQpKQorICAgIHJldHVybiBFcnJvcigiTWFsZm9ybWVkIGJsb2NrIHJlY29yZCIpOworCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA2ND4gUmVjb3JkOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU2VjdGlvblRhYmxlOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR0NUYWJsZTsKKworICAvLyBSZWFkIGFsbCB0aGUgcmVjb3JkcyBmb3IgdGhpcyBtb2R1bGUuCisgIHdoaWxlICghU3RyZWFtLkF0RW5kT2ZTdHJlYW0oKSkgeworICAgIHVuc2lnbmVkIENvZGUgPSBTdHJlYW0uUmVhZENvZGUoKTsKKyAgICBpZiAoQ29kZSA9PSBiaXRjOjpFTkRfQkxPQ0spIHsKKyAgICAgIGlmIChTdHJlYW0uUmVhZEJsb2NrRW5kKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiRXJyb3IgYXQgZW5kIG9mIG1vZHVsZSBibG9jayIpOworCisgICAgICAvLyBQYXRjaCB0aGUgaW5pdGlhbGl6ZXJzIGZvciBnbG9iYWxzIGFuZCBhbGlhc2VzIHVwLgorICAgICAgUmVzb2x2ZUdsb2JhbEFuZEFsaWFzSW5pdHMoKTsKKyAgICAgIGlmICghR2xvYmFsSW5pdHMuZW1wdHkoKSB8fCAhQWxpYXNJbml0cy5lbXB0eSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBnbG9iYWwgaW5pdGlhbGl6ZXIgc2V0Iik7CisgICAgICBpZiAoIUZ1bmN0aW9uc1dpdGhCb2RpZXMuZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJUb28gZmV3IGZ1bmN0aW9uIGJvZGllcyBmb3VuZCIpOworCisgICAgICAvLyBMb29rIGZvciBpbnRyaW5zaWMgZnVuY3Rpb25zIHdoaWNoIG5lZWQgdG8gYmUgdXBncmFkZWQgYXQgc29tZSBwb2ludAorICAgICAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEZJID0gVGhlTW9kdWxlLT5iZWdpbigpLCBGRSA9IFRoZU1vZHVsZS0+ZW5kKCk7CisgICAgICAgICAgIEZJICE9IEZFOyArK0ZJKSB7CisgICAgICAgIEZ1bmN0aW9uKiBOZXdGbjsKKyAgICAgICAgaWYgKFVwZ3JhZGVJbnRyaW5zaWNGdW5jdGlvbihGSSwgTmV3Rm4pKQorICAgICAgICAgIFVwZ3JhZGVkSW50cmluc2ljcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoRkksIE5ld0ZuKSk7CisgICAgICB9CisKKyAgICAgIC8vIEZvcmNlIGRlYWxsb2NhdGlvbiBvZiBtZW1vcnkgZm9yIHRoZXNlIHZlY3RvcnMgdG8gZmF2b3IgdGhlIGNsaWVudCB0aGF0CisgICAgICAvLyB3YW50IGxhenkgZGVzZXJpYWxpemF0aW9uLgorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEdsb2JhbFZhcmlhYmxlKiwgdW5zaWduZWQ+ID4oKS5zd2FwKEdsb2JhbEluaXRzKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxHbG9iYWxBbGlhcyosIHVuc2lnbmVkPiA+KCkuc3dhcChBbGlhc0luaXRzKTsKKyAgICAgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uKj4oKS5zd2FwKEZ1bmN0aW9uc1dpdGhCb2RpZXMpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChDb2RlID09IGJpdGM6OkVOVEVSX1NVQkJMT0NLKSB7CisgICAgICBzd2l0Y2ggKFN0cmVhbS5SZWFkU3ViQmxvY2tJRCgpKSB7CisgICAgICBkZWZhdWx0OiAgLy8gU2tpcCB1bmtub3duIGNvbnRlbnQuCisgICAgICAgIGlmIChTdHJlYW0uU2tpcEJsb2NrKCkpCisgICAgICAgICAgcmV0dXJuIEVycm9yKCJNYWxmb3JtZWQgYmxvY2sgcmVjb3JkIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBiaXRjOjpCTE9DS0lORk9fQkxPQ0tfSUQ6CisgICAgICAgIGlmIChTdHJlYW0uUmVhZEJsb2NrSW5mb0Jsb2NrKCkpCisgICAgICAgICAgcmV0dXJuIEVycm9yKCJNYWxmb3JtZWQgQmxvY2tJbmZvQmxvY2siKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGJpdGM6OlBBUkFNQVRUUl9CTE9DS19JRDoKKyAgICAgICAgaWYgKFBhcnNlQXR0cmlidXRlQmxvY2soKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGJpdGM6OlRZUEVfQkxPQ0tfSUQ6CisgICAgICAgIGlmIChQYXJzZVR5cGVUYWJsZSgpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYml0Yzo6VFlQRV9TWU1UQUJfQkxPQ0tfSUQ6CisgICAgICAgIGlmIChQYXJzZVR5cGVTeW1ib2xUYWJsZSgpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYml0Yzo6VkFMVUVfU1lNVEFCX0JMT0NLX0lEOgorICAgICAgICBpZiAoUGFyc2VWYWx1ZVN5bWJvbFRhYmxlKCkpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBiaXRjOjpDT05TVEFOVFNfQkxPQ0tfSUQ6CisgICAgICAgIGlmIChQYXJzZUNvbnN0YW50cygpIHx8IFJlc29sdmVHbG9iYWxBbmRBbGlhc0luaXRzKCkpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBiaXRjOjpNRVRBREFUQV9CTE9DS19JRDoKKyAgICAgICAgaWYgKFBhcnNlTWV0YWRhdGEoKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGJpdGM6OkZVTkNUSU9OX0JMT0NLX0lEOgorICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBmdW5jdGlvbiBib2R5IHdlJ3ZlIHNlZW4sIHJldmVyc2UgdGhlCisgICAgICAgIC8vIEZ1bmN0aW9uc1dpdGhCb2RpZXMgbGlzdC4KKyAgICAgICAgaWYgKCFIYXNSZXZlcnNlZEZ1bmN0aW9uc1dpdGhCb2RpZXMpIHsKKyAgICAgICAgICBzdGQ6OnJldmVyc2UoRnVuY3Rpb25zV2l0aEJvZGllcy5iZWdpbigpLCBGdW5jdGlvbnNXaXRoQm9kaWVzLmVuZCgpKTsKKyAgICAgICAgICBIYXNSZXZlcnNlZEZ1bmN0aW9uc1dpdGhCb2RpZXMgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFJlbWVtYmVyQW5kU2tpcEZ1bmN0aW9uQm9keSgpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChDb2RlID09IGJpdGM6OkRFRklORV9BQkJSRVYpIHsKKyAgICAgIFN0cmVhbS5SZWFkQWJicmV2UmVjb3JkKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGEgcmVjb3JkLgorICAgIHN3aXRjaCAoU3RyZWFtLlJlYWRSZWNvcmQoQ29kZSwgUmVjb3JkKSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOyAgLy8gRGVmYXVsdCBiZWhhdmlvciwgaWdub3JlIHVua25vd24gY29udGVudC4KKyAgICBjYXNlIGJpdGM6Ok1PRFVMRV9DT0RFX1ZFUlNJT046ICAvLyBWRVJTSU9OOiBbdmVyc2lvbiNdCisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA8IDEpCisgICAgICAgIHJldHVybiBFcnJvcigiTWFsZm9ybWVkIE1PRFVMRV9DT0RFX1ZFUlNJT04iKTsKKyAgICAgIC8vIE9ubHkgdmVyc2lvbiAjMCBpcyBzdXBwb3J0ZWQgc28gZmFyLgorICAgICAgaWYgKFJlY29yZFswXSAhPSAwKQorICAgICAgICByZXR1cm4gRXJyb3IoIlVua25vd24gYml0c3RyZWFtIHZlcnNpb24hIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJpdGM6Ok1PRFVMRV9DT0RFX1RSSVBMRTogeyAgLy8gVFJJUExFOiBbc3RyY2hyIHggTl0KKyAgICAgIHN0ZDo6c3RyaW5nIFM7CisgICAgICBpZiAoQ29udmVydFRvU3RyaW5nKFJlY29yZCwgMCwgUykpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBNT0RVTEVfQ09ERV9UUklQTEUgcmVjb3JkIik7CisgICAgICBUaGVNb2R1bGUtPnNldFRhcmdldFRyaXBsZShTKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6Ok1PRFVMRV9DT0RFX0RBVEFMQVlPVVQ6IHsgIC8vIERBVEFMQVlPVVQ6IFtzdHJjaHIgeCBOXQorICAgICAgc3RkOjpzdHJpbmcgUzsKKyAgICAgIGlmIChDb252ZXJ0VG9TdHJpbmcoUmVjb3JkLCAwLCBTKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIE1PRFVMRV9DT0RFX0RBVEFMQVlPVVQgcmVjb3JkIik7CisgICAgICBUaGVNb2R1bGUtPnNldERhdGFMYXlvdXQoUyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpNT0RVTEVfQ09ERV9BU006IHsgIC8vIEFTTTogW3N0cmNociB4IE5dCisgICAgICBzdGQ6OnN0cmluZyBTOworICAgICAgaWYgKENvbnZlcnRUb1N0cmluZyhSZWNvcmQsIDAsIFMpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgTU9EVUxFX0NPREVfQVNNIHJlY29yZCIpOworICAgICAgVGhlTW9kdWxlLT5zZXRNb2R1bGVJbmxpbmVBc20oUyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpNT0RVTEVfQ09ERV9ERVBMSUI6IHsgIC8vIERFUExJQjogW3N0cmNociB4IE5dCisgICAgICBzdGQ6OnN0cmluZyBTOworICAgICAgaWYgKENvbnZlcnRUb1N0cmluZyhSZWNvcmQsIDAsIFMpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgTU9EVUxFX0NPREVfREVQTElCIHJlY29yZCIpOworICAgICAgVGhlTW9kdWxlLT5hZGRMaWJyYXJ5KFMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYml0Yzo6TU9EVUxFX0NPREVfU0VDVElPTk5BTUU6IHsgIC8vIFNFQ1RJT05OQU1FOiBbc3RyY2hyIHggTl0KKyAgICAgIHN0ZDo6c3RyaW5nIFM7CisgICAgICBpZiAoQ29udmVydFRvU3RyaW5nKFJlY29yZCwgMCwgUykpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBNT0RVTEVfQ09ERV9TRUNUSU9OTkFNRSByZWNvcmQiKTsKKyAgICAgIFNlY3Rpb25UYWJsZS5wdXNoX2JhY2soUyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpNT0RVTEVfQ09ERV9HQ05BTUU6IHsgIC8vIFNFQ1RJT05OQU1FOiBbc3RyY2hyIHggTl0KKyAgICAgIHN0ZDo6c3RyaW5nIFM7CisgICAgICBpZiAoQ29udmVydFRvU3RyaW5nKFJlY29yZCwgMCwgUykpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBNT0RVTEVfQ09ERV9HQ05BTUUgcmVjb3JkIik7CisgICAgICBHQ1RhYmxlLnB1c2hfYmFjayhTKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBHTE9CQUxWQVI6IFtwb2ludGVyIHR5cGUsIGlzY29uc3QsIGluaXRpZCwKKyAgICAvLyAgICAgICAgICAgICBsaW5rYWdlLCBhbGlnbm1lbnQsIHNlY3Rpb24sIHZpc2liaWxpdHksIHRocmVhZGxvY2FsXQorICAgIGNhc2UgYml0Yzo6TU9EVUxFX0NPREVfR0xPQkFMVkFSOiB7CisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA8IDYpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBNT0RVTEVfQ09ERV9HTE9CQUxWQVIgcmVjb3JkIik7CisgICAgICBjb25zdCBUeXBlICpUeSA9IGdldFR5cGVCeUlEKFJlY29yZFswXSk7CisgICAgICBpZiAoIVR5LT5pc1BvaW50ZXJUeSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkdsb2JhbCBub3QgYSBwb2ludGVyIHR5cGUhIik7CisgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UgPSBjYXN0PFBvaW50ZXJUeXBlPihUeSktPmdldEFkZHJlc3NTcGFjZSgpOworICAgICAgVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihUeSktPmdldEVsZW1lbnRUeXBlKCk7CisKKyAgICAgIGJvb2wgaXNDb25zdGFudCA9IFJlY29yZFsxXTsKKyAgICAgIEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTGlua2FnZSA9IEdldERlY29kZWRMaW5rYWdlKFJlY29yZFszXSk7CisgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAoMSA8PCBSZWNvcmRbNF0pID4+IDE7CisgICAgICBzdGQ6OnN0cmluZyBTZWN0aW9uOworICAgICAgaWYgKFJlY29yZFs1XSkgeworICAgICAgICBpZiAoUmVjb3JkWzVdLTEgPj0gU2VjdGlvblRhYmxlLnNpemUoKSkKKyAgICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgc2VjdGlvbiBJRCIpOworICAgICAgICBTZWN0aW9uID0gU2VjdGlvblRhYmxlW1JlY29yZFs1XS0xXTsKKyAgICAgIH0KKyAgICAgIEdsb2JhbFZhbHVlOjpWaXNpYmlsaXR5VHlwZXMgVmlzaWJpbGl0eSA9IEdsb2JhbFZhbHVlOjpEZWZhdWx0VmlzaWJpbGl0eTsKKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpID4gNikKKyAgICAgICAgVmlzaWJpbGl0eSA9IEdldERlY29kZWRWaXNpYmlsaXR5KFJlY29yZFs2XSk7CisgICAgICBib29sIGlzVGhyZWFkTG9jYWwgPSBmYWxzZTsKKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpID4gNykKKyAgICAgICAgaXNUaHJlYWRMb2NhbCA9IFJlY29yZFs3XTsKKworICAgICAgR2xvYmFsVmFyaWFibGUgKk5ld0dWID0KKyAgICAgICAgbmV3IEdsb2JhbFZhcmlhYmxlKCpUaGVNb2R1bGUsIFR5LCBpc0NvbnN0YW50LCBMaW5rYWdlLCAwLCAiIiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGhyZWFkTG9jYWwsIEFkZHJlc3NTcGFjZSk7CisgICAgICBOZXdHVi0+c2V0QWxpZ25tZW50KEFsaWdubWVudCk7CisgICAgICBpZiAoIVNlY3Rpb24uZW1wdHkoKSkKKyAgICAgICAgTmV3R1YtPnNldFNlY3Rpb24oU2VjdGlvbik7CisgICAgICBOZXdHVi0+c2V0VmlzaWJpbGl0eShWaXNpYmlsaXR5KTsKKyAgICAgIE5ld0dWLT5zZXRUaHJlYWRMb2NhbChpc1RocmVhZExvY2FsKTsKKworICAgICAgVmFsdWVMaXN0LnB1c2hfYmFjayhOZXdHVik7CisKKyAgICAgIC8vIFJlbWVtYmVyIHdoaWNoIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGdsb2JhbCBpbml0aWFsaXplci4KKyAgICAgIGlmICh1bnNpZ25lZCBJbml0SUQgPSBSZWNvcmRbMl0pCisgICAgICAgIEdsb2JhbEluaXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihOZXdHViwgSW5pdElELTEpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBGVU5DVElPTjogIFt0eXBlLCBjYWxsaW5nY29udiwgaXNwcm90bywgbGlua2FnZSwgcGFyYW1hdHRyLAorICAgIC8vICAgICAgICAgICAgIGFsaWdubWVudCwgc2VjdGlvbiwgdmlzaWJpbGl0eSwgZ2NdCisgICAgY2FzZSBiaXRjOjpNT0RVTEVfQ09ERV9GVU5DVElPTjogeworICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCA4KQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgTU9EVUxFX0NPREVfRlVOQ1RJT04gcmVjb3JkIik7CisgICAgICBjb25zdCBUeXBlICpUeSA9IGdldFR5cGVCeUlEKFJlY29yZFswXSk7CisgICAgICBpZiAoIVR5LT5pc1BvaW50ZXJUeSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkZ1bmN0aW9uIG5vdCBhIHBvaW50ZXIgdHlwZSEiKTsKKyAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlR5ID0KKyAgICAgICAgZHluX2Nhc3Q8RnVuY3Rpb25UeXBlPihjYXN0PFBvaW50ZXJUeXBlPihUeSktPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgaWYgKCFGVHkpCisgICAgICAgIHJldHVybiBFcnJvcigiRnVuY3Rpb24gbm90IGEgcG9pbnRlciB0byBmdW5jdGlvbiB0eXBlISIpOworCisgICAgICBGdW5jdGlvbiAqRnVuYyA9IEZ1bmN0aW9uOjpDcmVhdGUoRlR5LCBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBUaGVNb2R1bGUpOworCisgICAgICBGdW5jLT5zZXRDYWxsaW5nQ29udihzdGF0aWNfY2FzdDxDYWxsaW5nQ29udjo6SUQ+KFJlY29yZFsxXSkpOworICAgICAgYm9vbCBpc1Byb3RvID0gUmVjb3JkWzJdOworICAgICAgRnVuYy0+c2V0TGlua2FnZShHZXREZWNvZGVkTGlua2FnZShSZWNvcmRbM10pKTsKKyAgICAgIEZ1bmMtPnNldEF0dHJpYnV0ZXMoZ2V0QXR0cmlidXRlcyhSZWNvcmRbNF0pKTsKKworICAgICAgRnVuYy0+c2V0QWxpZ25tZW50KCgxIDw8IFJlY29yZFs1XSkgPj4gMSk7CisgICAgICBpZiAoUmVjb3JkWzZdKSB7CisgICAgICAgIGlmIChSZWNvcmRbNl0tMSA+PSBTZWN0aW9uVGFibGUuc2l6ZSgpKQorICAgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBzZWN0aW9uIElEIik7CisgICAgICAgIEZ1bmMtPnNldFNlY3Rpb24oU2VjdGlvblRhYmxlW1JlY29yZFs2XS0xXSk7CisgICAgICB9CisgICAgICBGdW5jLT5zZXRWaXNpYmlsaXR5KEdldERlY29kZWRWaXNpYmlsaXR5KFJlY29yZFs3XSkpOworICAgICAgaWYgKFJlY29yZC5zaXplKCkgPiA4ICYmIFJlY29yZFs4XSkgeworICAgICAgICBpZiAoUmVjb3JkWzhdLTEgPiBHQ1RhYmxlLnNpemUoKSkKKyAgICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgR0MgSUQiKTsKKyAgICAgICAgRnVuYy0+c2V0R0MoR0NUYWJsZVtSZWNvcmRbOF0tMV0uY19zdHIoKSk7CisgICAgICB9CisgICAgICBWYWx1ZUxpc3QucHVzaF9iYWNrKEZ1bmMpOworCisgICAgICAvLyBJZiB0aGlzIGlzIGEgZnVuY3Rpb24gd2l0aCBhIGJvZHksIHJlbWVtYmVyIHRoZSBwcm90b3R5cGUgd2UgYXJlCisgICAgICAvLyBjcmVhdGluZyBub3csIHNvIHRoYXQgd2UgY2FuIG1hdGNoIHVwIHRoZSBib2R5IHdpdGggdGhlbSBsYXRlci4KKyAgICAgIGlmICghaXNQcm90bykKKyAgICAgICAgRnVuY3Rpb25zV2l0aEJvZGllcy5wdXNoX2JhY2soRnVuYyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gQUxJQVM6IFthbGlhcyB0eXBlLCBhbGlhc2VlIHZhbCMsIGxpbmthZ2VdCisgICAgLy8gQUxJQVM6IFthbGlhcyB0eXBlLCBhbGlhc2VlIHZhbCMsIGxpbmthZ2UsIHZpc2liaWxpdHldCisgICAgY2FzZSBiaXRjOjpNT0RVTEVfQ09ERV9BTElBUzogeworICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCAzKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgTU9EVUxFX0FMSUFTIHJlY29yZCIpOworICAgICAgY29uc3QgVHlwZSAqVHkgPSBnZXRUeXBlQnlJRChSZWNvcmRbMF0pOworICAgICAgaWYgKCFUeS0+aXNQb2ludGVyVHkoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJGdW5jdGlvbiBub3QgYSBwb2ludGVyIHR5cGUhIik7CisKKyAgICAgIEdsb2JhbEFsaWFzICpOZXdHQSA9IG5ldyBHbG9iYWxBbGlhcyhUeSwgR2V0RGVjb2RlZExpbmthZ2UoUmVjb3JkWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgMCwgVGhlTW9kdWxlKTsKKyAgICAgIC8vIE9sZCBiaXRjb2RlIGZpbGVzIGRpZG4ndCBoYXZlIHZpc2liaWxpdHkgZmllbGQuCisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA+IDMpCisgICAgICAgIE5ld0dBLT5zZXRWaXNpYmlsaXR5KEdldERlY29kZWRWaXNpYmlsaXR5KFJlY29yZFszXSkpOworICAgICAgVmFsdWVMaXN0LnB1c2hfYmFjayhOZXdHQSk7CisgICAgICBBbGlhc0luaXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihOZXdHQSwgUmVjb3JkWzFdKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8vIE1PRFVMRV9DT0RFX1BVUkdFVkFMUzogW251bXZhbHNdCisgICAgY2FzZSBiaXRjOjpNT0RVTEVfQ09ERV9QVVJHRVZBTFM6CisgICAgICAvLyBUcmltIGRvd24gdGhlIHZhbHVlIGxpc3QgdG8gdGhlIHNwZWNpZmllZCBzaXplLgorICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCAxIHx8IFJlY29yZFswXSA+IFZhbHVlTGlzdC5zaXplKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBNT0RVTEVfUFVSR0VWQUxTIHJlY29yZCIpOworICAgICAgVmFsdWVMaXN0LnNocmlua1RvKFJlY29yZFswXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgUmVjb3JkLmNsZWFyKCk7CisgIH0KKworICByZXR1cm4gRXJyb3IoIlByZW1hdHVyZSBlbmQgb2YgYml0c3RyZWFtIik7Cit9CisKK2Jvb2wgQml0Y29kZVJlYWRlcjo6UGFyc2VCaXRjb2RlSW50byhNb2R1bGUgKk0pIHsKKyAgVGhlTW9kdWxlID0gMDsKKworICB1bnNpZ25lZCBjaGFyICpCdWZQdHIgPSAodW5zaWduZWQgY2hhciAqKUJ1ZmZlci0+Z2V0QnVmZmVyU3RhcnQoKTsKKyAgdW5zaWduZWQgY2hhciAqQnVmRW5kID0gQnVmUHRyK0J1ZmZlci0+Z2V0QnVmZmVyU2l6ZSgpOworCisgIGlmIChCdWZmZXItPmdldEJ1ZmZlclNpemUoKSAmIDMpIHsKKyAgICBpZiAoIWlzUmF3Qml0Y29kZShCdWZQdHIsIEJ1ZkVuZCkgJiYgIWlzQml0Y29kZVdyYXBwZXIoQnVmUHRyLCBCdWZFbmQpKQorICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIGJpdGNvZGUgc2lnbmF0dXJlIik7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEVycm9yKCJCaXRjb2RlIHN0cmVhbSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIGluIGxlbmd0aCIpOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSBhIHdyYXBwZXIgaGVhZGVyLCBwYXJzZSBpdCBhbmQgaWdub3JlIHRoZSBub24tYmMgZmlsZSBjb250ZW50cy4KKyAgLy8gVGhlIG1hZ2ljIG51bWJlciBpcyAweDBCMTdDMERFIHN0b3JlZCBpbiBsaXR0bGUgZW5kaWFuLgorICBpZiAoaXNCaXRjb2RlV3JhcHBlcihCdWZQdHIsIEJ1ZkVuZCkpCisgICAgaWYgKFNraXBCaXRjb2RlV3JhcHBlckhlYWRlcihCdWZQdHIsIEJ1ZkVuZCkpCisgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgYml0Y29kZSB3cmFwcGVyIGhlYWRlciIpOworCisgIFN0cmVhbUZpbGUuaW5pdChCdWZQdHIsIEJ1ZkVuZCk7CisgIFN0cmVhbS5pbml0KFN0cmVhbUZpbGUpOworCisgIC8vIFNuaWZmIGZvciB0aGUgc2lnbmF0dXJlLgorICBpZiAoU3RyZWFtLlJlYWQoOCkgIT0gJ0InIHx8CisgICAgICBTdHJlYW0uUmVhZCg4KSAhPSAnQycgfHwKKyAgICAgIFN0cmVhbS5SZWFkKDQpICE9IDB4MCB8fAorICAgICAgU3RyZWFtLlJlYWQoNCkgIT0gMHhDIHx8CisgICAgICBTdHJlYW0uUmVhZCg0KSAhPSAweEUgfHwKKyAgICAgIFN0cmVhbS5SZWFkKDQpICE9IDB4RCkKKyAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgYml0Y29kZSBzaWduYXR1cmUiKTsKKworICAvLyBXZSBleHBlY3QgYSBudW1iZXIgb2Ygd2VsbC1kZWZpbmVkIGJsb2NrcywgdGhvdWdoIHdlIGRvbid0IG5lY2Vzc2FyaWx5CisgIC8vIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGVtIGFsbC4KKyAgd2hpbGUgKCFTdHJlYW0uQXRFbmRPZlN0cmVhbSgpKSB7CisgICAgdW5zaWduZWQgQ29kZSA9IFN0cmVhbS5SZWFkQ29kZSgpOworCisgICAgaWYgKENvZGUgIT0gYml0Yzo6RU5URVJfU1VCQkxPQ0spCisgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgcmVjb3JkIGF0IHRvcC1sZXZlbCIpOworCisgICAgdW5zaWduZWQgQmxvY2tJRCA9IFN0cmVhbS5SZWFkU3ViQmxvY2tJRCgpOworCisgICAgLy8gV2Ugb25seSBrbm93IHRoZSBNT0RVTEUgc3ViYmxvY2sgSUQuCisgICAgc3dpdGNoIChCbG9ja0lEKSB7CisgICAgY2FzZSBiaXRjOjpCTE9DS0lORk9fQkxPQ0tfSUQ6CisgICAgICBpZiAoU3RyZWFtLlJlYWRCbG9ja0luZm9CbG9jaygpKQorICAgICAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBCbG9ja0luZm9CbG9jayIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiaXRjOjpNT0RVTEVfQkxPQ0tfSUQ6CisgICAgICAvLyBSZWplY3QgbXVsdGlwbGUgTU9EVUxFX0JMT0NLJ3MgaW4gYSBzaW5nbGUgYml0c3RyZWFtLgorICAgICAgaWYgKFRoZU1vZHVsZSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJNdWx0aXBsZSBNT0RVTEVfQkxPQ0tzIGluIHNhbWUgc3RyZWFtIik7CisgICAgICBUaGVNb2R1bGUgPSBNOworICAgICAgaWYgKFBhcnNlTW9kdWxlKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChTdHJlYW0uU2tpcEJsb2NrKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiTWFsZm9ybWVkIGJsb2NrIHJlY29yZCIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VNZXRhZGF0YUF0dGFjaG1lbnQgLSBQYXJzZSBtZXRhZGF0YSBhdHRhY2htZW50cy4KK2Jvb2wgQml0Y29kZVJlYWRlcjo6UGFyc2VNZXRhZGF0YUF0dGFjaG1lbnQoKSB7CisgIGlmIChTdHJlYW0uRW50ZXJTdWJCbG9jayhiaXRjOjpNRVRBREFUQV9BVFRBQ0hNRU5UX0lEKSkKKyAgICByZXR1cm4gRXJyb3IoIk1hbGZvcm1lZCBibG9jayByZWNvcmQiKTsKKworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+IFJlY29yZDsKKyAgd2hpbGUoMSkgeworICAgIHVuc2lnbmVkIENvZGUgPSBTdHJlYW0uUmVhZENvZGUoKTsKKyAgICBpZiAoQ29kZSA9PSBiaXRjOjpFTkRfQkxPQ0spIHsKKyAgICAgIGlmIChTdHJlYW0uUmVhZEJsb2NrRW5kKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiRXJyb3IgYXQgZW5kIG9mIFBBUkFNQVRUUiBibG9jayIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChDb2RlID09IGJpdGM6OkRFRklORV9BQkJSRVYpIHsKKyAgICAgIFN0cmVhbS5SZWFkQWJicmV2UmVjb3JkKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gUmVhZCBhIG1ldGFkYXRhIGF0dGFjaG1lbnQgcmVjb3JkLgorICAgIFJlY29yZC5jbGVhcigpOworICAgIHN3aXRjaCAoU3RyZWFtLlJlYWRSZWNvcmQoQ29kZSwgUmVjb3JkKSkgeworICAgIGRlZmF1bHQ6ICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBpZ25vcmUuCisgICAgICBicmVhazsKKyAgICBjYXNlIGJpdGM6Ok1FVEFEQVRBX0FUVEFDSE1FTlQ6IHsKKyAgICAgIHVuc2lnbmVkIFJlY29yZExlbmd0aCA9IFJlY29yZC5zaXplKCk7CisgICAgICBpZiAoUmVjb3JkLmVtcHR5KCkgfHwgKFJlY29yZExlbmd0aCAtIDEpICUgMiA9PSAxKQorICAgICAgICByZXR1cm4gRXJyb3IgKCJJbnZhbGlkIE1FVEFEQVRBX0FUVEFDSE1FTlQgcmVhZGVyISIpOworICAgICAgSW5zdHJ1Y3Rpb24gKkluc3QgPSBJbnN0cnVjdGlvbkxpc3RbUmVjb3JkWzBdXTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgIT0gUmVjb3JkTGVuZ3RoOyBpID0gaSsyKSB7CisgICAgICAgIHVuc2lnbmVkIEtpbmQgPSBSZWNvcmRbaV07CisgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD46Oml0ZXJhdG9yIEkgPQorICAgICAgICAgIE1ES2luZE1hcC5maW5kKEtpbmQpOworICAgICAgICBpZiAoSSA9PSBNREtpbmRNYXAuZW5kKCkpCisgICAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIG1ldGFkYXRhIGtpbmQgSUQiKTsKKyAgICAgICAgVmFsdWUgKk5vZGUgPSBNRFZhbHVlTGlzdC5nZXRWYWx1ZUZ3ZFJlZihSZWNvcmRbaSsxXSk7CisgICAgICAgIEluc3QtPnNldE1ldGFkYXRhKEktPnNlY29uZCwgY2FzdDxNRE5vZGU+KE5vZGUpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VGdW5jdGlvbkJvZHkgLSBMYXppbHkgcGFyc2UgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBib2R5IGJsb2NrLgorYm9vbCBCaXRjb2RlUmVhZGVyOjpQYXJzZUZ1bmN0aW9uQm9keShGdW5jdGlvbiAqRikgeworICBpZiAoU3RyZWFtLkVudGVyU3ViQmxvY2soYml0Yzo6RlVOQ1RJT05fQkxPQ0tfSUQpKQorICAgIHJldHVybiBFcnJvcigiTWFsZm9ybWVkIGJsb2NrIHJlY29yZCIpOworCisgIEluc3RydWN0aW9uTGlzdC5jbGVhcigpOworICB1bnNpZ25lZCBNb2R1bGVWYWx1ZUxpc3RTaXplID0gVmFsdWVMaXN0LnNpemUoKTsKKworICAvLyBBZGQgYWxsIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgdG8gdGhlIHZhbHVlIHRhYmxlLgorICBmb3IoRnVuY3Rpb246OmFyZ19pdGVyYXRvciBJID0gRi0+YXJnX2JlZ2luKCksIEUgPSBGLT5hcmdfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIFZhbHVlTGlzdC5wdXNoX2JhY2soSSk7CisKKyAgdW5zaWduZWQgTmV4dFZhbHVlTm8gPSBWYWx1ZUxpc3Quc2l6ZSgpOworICBCYXNpY0Jsb2NrICpDdXJCQiA9IDA7CisgIHVuc2lnbmVkIEN1ckJCTm8gPSAwOworCisgIERlYnVnTG9jIExhc3RMb2M7CisgIAorICAvLyBSZWFkIGFsbCB0aGUgcmVjb3Jkcy4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDY0PiBSZWNvcmQ7CisgIHdoaWxlICgxKSB7CisgICAgdW5zaWduZWQgQ29kZSA9IFN0cmVhbS5SZWFkQ29kZSgpOworICAgIGlmIChDb2RlID09IGJpdGM6OkVORF9CTE9DSykgeworICAgICAgaWYgKFN0cmVhbS5SZWFkQmxvY2tFbmQoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJFcnJvciBhdCBlbmQgb2YgZnVuY3Rpb24gYmxvY2siKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChDb2RlID09IGJpdGM6OkVOVEVSX1NVQkJMT0NLKSB7CisgICAgICBzd2l0Y2ggKFN0cmVhbS5SZWFkU3ViQmxvY2tJRCgpKSB7CisgICAgICBkZWZhdWx0OiAgLy8gU2tpcCB1bmtub3duIGNvbnRlbnQuCisgICAgICAgIGlmIChTdHJlYW0uU2tpcEJsb2NrKCkpCisgICAgICAgICAgcmV0dXJuIEVycm9yKCJNYWxmb3JtZWQgYmxvY2sgcmVjb3JkIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBiaXRjOjpDT05TVEFOVFNfQkxPQ0tfSUQ6CisgICAgICAgIGlmIChQYXJzZUNvbnN0YW50cygpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgTmV4dFZhbHVlTm8gPSBWYWx1ZUxpc3Quc2l6ZSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYml0Yzo6VkFMVUVfU1lNVEFCX0JMT0NLX0lEOgorICAgICAgICBpZiAoUGFyc2VWYWx1ZVN5bWJvbFRhYmxlKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYml0Yzo6TUVUQURBVEFfQVRUQUNITUVOVF9JRDoKKyAgICAgICAgaWYgKFBhcnNlTWV0YWRhdGFBdHRhY2htZW50KCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYml0Yzo6TUVUQURBVEFfQkxPQ0tfSUQ6CisgICAgICAgIGlmIChQYXJzZU1ldGFkYXRhKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChDb2RlID09IGJpdGM6OkRFRklORV9BQkJSRVYpIHsKKyAgICAgIFN0cmVhbS5SZWFkQWJicmV2UmVjb3JkKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGEgcmVjb3JkLgorICAgIFJlY29yZC5jbGVhcigpOworICAgIEluc3RydWN0aW9uICpJID0gMDsKKyAgICB1bnNpZ25lZCBCaXRDb2RlID0gU3RyZWFtLlJlYWRSZWNvcmQoQ29kZSwgUmVjb3JkKTsKKyAgICBzd2l0Y2ggKEJpdENvZGUpIHsKKyAgICBkZWZhdWx0OiAvLyBEZWZhdWx0IGJlaGF2aW9yOiByZWplY3QKKyAgICAgIHJldHVybiBFcnJvcigiVW5rbm93biBpbnN0cnVjdGlvbiIpOworICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0RFQ0xBUkVCTE9DS1M6ICAgICAvLyBERUNMQVJFQkxPQ0tTOiBbbmJsb2Nrc10KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMSB8fCBSZWNvcmRbMF0gPT0gMCkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIERFQ0xBUkVCTE9DS1MgcmVjb3JkIik7CisgICAgICAvLyBDcmVhdGUgYWxsIHRoZSBiYXNpYyBibG9ja3MgZm9yIHRoZSBmdW5jdGlvbi4KKyAgICAgIEZ1bmN0aW9uQkJzLnJlc2l6ZShSZWNvcmRbMF0pOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZ1bmN0aW9uQkJzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIEZ1bmN0aW9uQkJzW2ldID0gQmFzaWNCbG9jazo6Q3JlYXRlKENvbnRleHQsICIiLCBGKTsKKyAgICAgIEN1ckJCID0gRnVuY3Rpb25CQnNbMF07CisgICAgICBjb250aW51ZTsKKworICAgICAgICAKKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9ERUJVR19MT0NfQUdBSU46ICAvLyBERUJVR19MT0NfQUdBSU4KKyAgICAgIC8vIFRoaXMgcmVjb3JkIGluZGljYXRlcyB0aGF0IHRoZSBsYXN0IGluc3RydWN0aW9uIGlzIGF0IHRoZSBzYW1lCisgICAgICAvLyBsb2NhdGlvbiBhcyB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2l0aCBhIGxvY2F0aW9uLgorICAgICAgSSA9IDA7CisgICAgICAgIAorICAgICAgLy8gR2V0IHRoZSBsYXN0IGluc3RydWN0aW9uIGVtaXR0ZWQuCisgICAgICBpZiAoQ3VyQkIgJiYgIUN1ckJCLT5lbXB0eSgpKQorICAgICAgICBJID0gJkN1ckJCLT5iYWNrKCk7CisgICAgICBlbHNlIGlmIChDdXJCQk5vICYmIEZ1bmN0aW9uQkJzW0N1ckJCTm8tMV0gJiYKKyAgICAgICAgICAgICAgICFGdW5jdGlvbkJCc1tDdXJCQk5vLTFdLT5lbXB0eSgpKQorICAgICAgICBJID0gJkZ1bmN0aW9uQkJzW0N1ckJCTm8tMV0tPmJhY2soKTsKKyAgICAgICAgCisgICAgICBpZiAoSSA9PSAwKSByZXR1cm4gRXJyb3IoIkludmFsaWQgREVCVUdfTE9DX0FHQUlOIHJlY29yZCIpOworICAgICAgSS0+c2V0RGVidWdMb2MoTGFzdExvYyk7CisgICAgICBJID0gMDsKKyAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9ERUJVR19MT0M6IHsgICAgICAvLyBERUJVR19MT0M6IFtsaW5lLCBjb2wsIHNjb3BlLCBpYV0KKyAgICAgIEkgPSAwOyAgICAgLy8gR2V0IHRoZSBsYXN0IGluc3RydWN0aW9uIGVtaXR0ZWQuCisgICAgICBpZiAoQ3VyQkIgJiYgIUN1ckJCLT5lbXB0eSgpKQorICAgICAgICBJID0gJkN1ckJCLT5iYWNrKCk7CisgICAgICBlbHNlIGlmIChDdXJCQk5vICYmIEZ1bmN0aW9uQkJzW0N1ckJCTm8tMV0gJiYKKyAgICAgICAgICAgICAgICFGdW5jdGlvbkJCc1tDdXJCQk5vLTFdLT5lbXB0eSgpKQorICAgICAgICBJID0gJkZ1bmN0aW9uQkJzW0N1ckJCTm8tMV0tPmJhY2soKTsKKyAgICAgIGlmIChJID09IDAgfHwgUmVjb3JkLnNpemUoKSA8IDQpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBGVU5DX0NPREVfREVCVUdfTE9DIHJlY29yZCIpOworICAgICAgCisgICAgICB1bnNpZ25lZCBMaW5lID0gUmVjb3JkWzBdLCBDb2wgPSBSZWNvcmRbMV07CisgICAgICB1bnNpZ25lZCBTY29wZUlEID0gUmVjb3JkWzJdLCBJQUlEID0gUmVjb3JkWzNdOworICAgICAgCisgICAgICBNRE5vZGUgKlNjb3BlID0gMCwgKklBID0gMDsKKyAgICAgIGlmIChTY29wZUlEKSBTY29wZSA9IGNhc3Q8TUROb2RlPihNRFZhbHVlTGlzdC5nZXRWYWx1ZUZ3ZFJlZihTY29wZUlELTEpKTsKKyAgICAgIGlmIChJQUlEKSAgICBJQSA9IGNhc3Q8TUROb2RlPihNRFZhbHVlTGlzdC5nZXRWYWx1ZUZ3ZFJlZihJQUlELTEpKTsKKyAgICAgIExhc3RMb2MgPSBEZWJ1Z0xvYzo6Z2V0KExpbmUsIENvbCwgU2NvcGUsIElBKTsKKyAgICAgIEktPnNldERlYnVnTG9jKExhc3RMb2MpOworICAgICAgSSA9IDA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX0JJTk9QOiB7ICAgIC8vIEJJTk9QOiBbb3B2YWwsIHR5LCBvcHZhbCwgb3Bjb2RlXQorICAgICAgdW5zaWduZWQgT3BOdW0gPSAwOworICAgICAgVmFsdWUgKkxIUywgKlJIUzsKKyAgICAgIGlmIChnZXRWYWx1ZVR5cGVQYWlyKFJlY29yZCwgT3BOdW0sIE5leHRWYWx1ZU5vLCBMSFMpIHx8CisgICAgICAgICAgZ2V0VmFsdWUoUmVjb3JkLCBPcE51bSwgTEhTLT5nZXRUeXBlKCksIFJIUykgfHwKKyAgICAgICAgICBPcE51bSsxID4gUmVjb3JkLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIEJJTk9QIHJlY29yZCIpOworCisgICAgICBpbnQgT3BjID0gR2V0RGVjb2RlZEJpbmFyeU9wY29kZShSZWNvcmRbT3BOdW0rK10sIExIUy0+Z2V0VHlwZSgpKTsKKyAgICAgIGlmIChPcGMgPT0gLTEpIHJldHVybiBFcnJvcigiSW52YWxpZCBCSU5PUCByZWNvcmQiKTsKKyAgICAgIEkgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKChJbnN0cnVjdGlvbjo6QmluYXJ5T3BzKU9wYywgTEhTLCBSSFMpOworICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIGlmIChPcE51bSA8IFJlY29yZC5zaXplKCkpIHsKKyAgICAgICAgaWYgKE9wYyA9PSBJbnN0cnVjdGlvbjo6QWRkIHx8CisgICAgICAgICAgICBPcGMgPT0gSW5zdHJ1Y3Rpb246OlN1YiB8fAorICAgICAgICAgICAgT3BjID09IEluc3RydWN0aW9uOjpNdWwpIHsKKyAgICAgICAgICBpZiAoUmVjb3JkW09wTnVtXSAmICgxIDw8IGJpdGM6Ok9CT19OT19TSUdORURfV1JBUCkpCisgICAgICAgICAgICBjYXN0PEJpbmFyeU9wZXJhdG9yPihJKS0+c2V0SGFzTm9TaWduZWRXcmFwKHRydWUpOworICAgICAgICAgIGlmIChSZWNvcmRbT3BOdW1dICYgKDEgPDwgYml0Yzo6T0JPX05PX1VOU0lHTkVEX1dSQVApKQorICAgICAgICAgICAgY2FzdDxCaW5hcnlPcGVyYXRvcj4oSSktPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKE9wYyA9PSBJbnN0cnVjdGlvbjo6U0RpdikgeworICAgICAgICAgIGlmIChSZWNvcmRbT3BOdW1dICYgKDEgPDwgYml0Yzo6U0RJVl9FWEFDVCkpCisgICAgICAgICAgICBjYXN0PEJpbmFyeU9wZXJhdG9yPihJKS0+c2V0SXNFeGFjdCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfQ0FTVDogeyAgICAvLyBDQVNUOiBbb3B2YWwsIG9wdHksIGRlc3R0eSwgY2FzdG9wY10KKyAgICAgIHVuc2lnbmVkIE9wTnVtID0gMDsKKyAgICAgIFZhbHVlICpPcDsKKyAgICAgIGlmIChnZXRWYWx1ZVR5cGVQYWlyKFJlY29yZCwgT3BOdW0sIE5leHRWYWx1ZU5vLCBPcCkgfHwKKyAgICAgICAgICBPcE51bSsyICE9IFJlY29yZC5zaXplKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBDQVNUIHJlY29yZCIpOworCisgICAgICBjb25zdCBUeXBlICpSZXNUeSA9IGdldFR5cGVCeUlEKFJlY29yZFtPcE51bV0pOworICAgICAgaW50IE9wYyA9IEdldERlY29kZWRDYXN0T3Bjb2RlKFJlY29yZFtPcE51bSsxXSk7CisgICAgICBpZiAoT3BjID09IC0xIHx8IFJlc1R5ID09IDApCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBDQVNUIHJlY29yZCIpOworICAgICAgSSA9IENhc3RJbnN0OjpDcmVhdGUoKEluc3RydWN0aW9uOjpDYXN0T3BzKU9wYywgT3AsIFJlc1R5KTsKKyAgICAgIEluc3RydWN0aW9uTGlzdC5wdXNoX2JhY2soSSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpGVU5DX0NPREVfSU5TVF9JTkJPVU5EU19HRVA6CisgICAgY2FzZSBiaXRjOjpGVU5DX0NPREVfSU5TVF9HRVA6IHsgLy8gR0VQOiBbbiB4IG9wZXJhbmRzXQorICAgICAgdW5zaWduZWQgT3BOdW0gPSAwOworICAgICAgVmFsdWUgKkJhc2VQdHI7CisgICAgICBpZiAoZ2V0VmFsdWVUeXBlUGFpcihSZWNvcmQsIE9wTnVtLCBOZXh0VmFsdWVObywgQmFzZVB0cikpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBHRVAgcmVjb3JkIik7CisKKyAgICAgIFNtYWxsVmVjdG9yPFZhbHVlKiwgMTY+IEdFUElkeDsKKyAgICAgIHdoaWxlIChPcE51bSAhPSBSZWNvcmQuc2l6ZSgpKSB7CisgICAgICAgIFZhbHVlICpPcDsKKyAgICAgICAgaWYgKGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIE9wKSkKKyAgICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgR0VQIHJlY29yZCIpOworICAgICAgICBHRVBJZHgucHVzaF9iYWNrKE9wKTsKKyAgICAgIH0KKworICAgICAgSSA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoQmFzZVB0ciwgR0VQSWR4LmJlZ2luKCksIEdFUElkeC5lbmQoKSk7CisgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKEkpOworICAgICAgaWYgKEJpdENvZGUgPT0gYml0Yzo6RlVOQ19DT0RFX0lOU1RfSU5CT1VORFNfR0VQKQorICAgICAgICBjYXN0PEdldEVsZW1lbnRQdHJJbnN0PihJKS0+c2V0SXNJbkJvdW5kcyh0cnVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfRVhUUkFDVFZBTDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVhUUkFDVFZBTDogW29wdHksIG9wdmFsLCBuIHggaW5kaWNlc10KKyAgICAgIHVuc2lnbmVkIE9wTnVtID0gMDsKKyAgICAgIFZhbHVlICpBZ2c7CisgICAgICBpZiAoZ2V0VmFsdWVUeXBlUGFpcihSZWNvcmQsIE9wTnVtLCBOZXh0VmFsdWVObywgQWdnKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIEVYVFJBQ1RWQUwgcmVjb3JkIik7CisKKyAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBFWFRSQUNUVkFMSWR4OworICAgICAgZm9yICh1bnNpZ25lZCBSZWNTaXplID0gUmVjb3JkLnNpemUoKTsKKyAgICAgICAgICAgT3BOdW0gIT0gUmVjU2l6ZTsgKytPcE51bSkgeworICAgICAgICB1aW50NjRfdCBJbmRleCA9IFJlY29yZFtPcE51bV07CisgICAgICAgIGlmICgodW5zaWduZWQpSW5kZXggIT0gSW5kZXgpCisgICAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIEVYVFJBQ1RWQUwgaW5kZXgiKTsKKyAgICAgICAgRVhUUkFDVFZBTElkeC5wdXNoX2JhY2soKHVuc2lnbmVkKUluZGV4KTsKKyAgICAgIH0KKworICAgICAgSSA9IEV4dHJhY3RWYWx1ZUluc3Q6OkNyZWF0ZShBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RWQUxJZHguYmVnaW4oKSwgRVhUUkFDVFZBTElkeC5lbmQoKSk7CisgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKEkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBiaXRjOjpGVU5DX0NPREVfSU5TVF9JTlNFUlRWQUw6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElOU0VSVFZBTDogW29wdHksIG9wdmFsLCBvcHR5LCBvcHZhbCwgbiB4IGluZGljZXNdCisgICAgICB1bnNpZ25lZCBPcE51bSA9IDA7CisgICAgICBWYWx1ZSAqQWdnOworICAgICAgaWYgKGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIEFnZykpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBJTlNFUlRWQUwgcmVjb3JkIik7CisgICAgICBWYWx1ZSAqVmFsOworICAgICAgaWYgKGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIFZhbCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBJTlNFUlRWQUwgcmVjb3JkIik7CisKKyAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJTlNFUlRWQUxJZHg7CisgICAgICBmb3IgKHVuc2lnbmVkIFJlY1NpemUgPSBSZWNvcmQuc2l6ZSgpOworICAgICAgICAgICBPcE51bSAhPSBSZWNTaXplOyArK09wTnVtKSB7CisgICAgICAgIHVpbnQ2NF90IEluZGV4ID0gUmVjb3JkW09wTnVtXTsKKyAgICAgICAgaWYgKCh1bnNpZ25lZClJbmRleCAhPSBJbmRleCkKKyAgICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgSU5TRVJUVkFMIGluZGV4Iik7CisgICAgICAgIElOU0VSVFZBTElkeC5wdXNoX2JhY2soKHVuc2lnbmVkKUluZGV4KTsKKyAgICAgIH0KKworICAgICAgSSA9IEluc2VydFZhbHVlSW5zdDo6Q3JlYXRlKEFnZywgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOU0VSVFZBTElkeC5iZWdpbigpLCBJTlNFUlRWQUxJZHguZW5kKCkpOworICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfU0VMRUNUOiB7IC8vIFNFTEVDVDogW29wdmFsLCB0eSwgb3B2YWwsIG9wdmFsXQorICAgICAgLy8gb2Jzb2xldGUgZm9ybSBvZiBzZWxlY3QKKyAgICAgIC8vIGhhbmRsZXMgc2VsZWN0IGkxIC4uLiBpbiBvbGQgYml0Y29kZQorICAgICAgdW5zaWduZWQgT3BOdW0gPSAwOworICAgICAgVmFsdWUgKlRydWVWYWwsICpGYWxzZVZhbCwgKkNvbmQ7CisgICAgICBpZiAoZ2V0VmFsdWVUeXBlUGFpcihSZWNvcmQsIE9wTnVtLCBOZXh0VmFsdWVObywgVHJ1ZVZhbCkgfHwKKyAgICAgICAgICBnZXRWYWx1ZShSZWNvcmQsIE9wTnVtLCBUcnVlVmFsLT5nZXRUeXBlKCksIEZhbHNlVmFsKSB8fAorICAgICAgICAgIGdldFZhbHVlKFJlY29yZCwgT3BOdW0sIFR5cGU6OmdldEludDFUeShDb250ZXh0KSwgQ29uZCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBTRUxFQ1QgcmVjb3JkIik7CisKKyAgICAgIEkgPSBTZWxlY3RJbnN0OjpDcmVhdGUoQ29uZCwgVHJ1ZVZhbCwgRmFsc2VWYWwpOworICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfVlNFTEVDVDogey8vIFZTRUxFQ1Q6IFt0eSxvcHZhbCxvcHZhbCxwcmVkdHkscHJlZF0KKyAgICAgIC8vIG5ldyBmb3JtIG9mIHNlbGVjdAorICAgICAgLy8gaGFuZGxlcyBzZWxlY3QgaTEgb3Igc2VsZWN0IFtOIHggaTFdCisgICAgICB1bnNpZ25lZCBPcE51bSA9IDA7CisgICAgICBWYWx1ZSAqVHJ1ZVZhbCwgKkZhbHNlVmFsLCAqQ29uZDsKKyAgICAgIGlmIChnZXRWYWx1ZVR5cGVQYWlyKFJlY29yZCwgT3BOdW0sIE5leHRWYWx1ZU5vLCBUcnVlVmFsKSB8fAorICAgICAgICAgIGdldFZhbHVlKFJlY29yZCwgT3BOdW0sIFRydWVWYWwtPmdldFR5cGUoKSwgRmFsc2VWYWwpIHx8CisgICAgICAgICAgZ2V0VmFsdWVUeXBlUGFpcihSZWNvcmQsIE9wTnVtLCBOZXh0VmFsdWVObywgQ29uZCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBTRUxFQ1QgcmVjb3JkIik7CisKKyAgICAgIC8vIHNlbGVjdCBjb25kaXRpb24gY2FuIGJlIGVpdGhlciBpMSBvciBbTiB4IGkxXQorICAgICAgaWYgKGNvbnN0IFZlY3RvclR5cGUqIHZlY3Rvcl90eXBlID0KKyAgICAgICAgICBkeW5fY2FzdDxjb25zdCBWZWN0b3JUeXBlPihDb25kLT5nZXRUeXBlKCkpKSB7CisgICAgICAgIC8vIGV4cGVjdCA8biB4IGkxPgorICAgICAgICBpZiAodmVjdG9yX3R5cGUtPmdldEVsZW1lbnRUeXBlKCkgIT0gVHlwZTo6Z2V0SW50MVR5KENvbnRleHQpKQorICAgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBTRUxFQ1QgY29uZGl0aW9uIHR5cGUiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGV4cGVjdCBpMQorICAgICAgICBpZiAoQ29uZC0+Z2V0VHlwZSgpICE9IFR5cGU6OmdldEludDFUeShDb250ZXh0KSkKKyAgICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgU0VMRUNUIGNvbmRpdGlvbiB0eXBlIik7CisgICAgICB9CisKKyAgICAgIEkgPSBTZWxlY3RJbnN0OjpDcmVhdGUoQ29uZCwgVHJ1ZVZhbCwgRmFsc2VWYWwpOworICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfRVhUUkFDVEVMVDogeyAvLyBFWFRSQUNURUxUOiBbb3B0eSwgb3B2YWwsIG9wdmFsXQorICAgICAgdW5zaWduZWQgT3BOdW0gPSAwOworICAgICAgVmFsdWUgKlZlYywgKklkeDsKKyAgICAgIGlmIChnZXRWYWx1ZVR5cGVQYWlyKFJlY29yZCwgT3BOdW0sIE5leHRWYWx1ZU5vLCBWZWMpIHx8CisgICAgICAgICAgZ2V0VmFsdWUoUmVjb3JkLCBPcE51bSwgVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgSWR4KSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIEVYVFJBQ1RFTFQgcmVjb3JkIik7CisgICAgICBJID0gRXh0cmFjdEVsZW1lbnRJbnN0OjpDcmVhdGUoVmVjLCBJZHgpOworICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfSU5TRVJURUxUOiB7IC8vIElOU0VSVEVMVDogW3R5LCBvcHZhbCxvcHZhbCxvcHZhbF0KKyAgICAgIHVuc2lnbmVkIE9wTnVtID0gMDsKKyAgICAgIFZhbHVlICpWZWMsICpFbHQsICpJZHg7CisgICAgICBpZiAoZ2V0VmFsdWVUeXBlUGFpcihSZWNvcmQsIE9wTnVtLCBOZXh0VmFsdWVObywgVmVjKSB8fAorICAgICAgICAgIGdldFZhbHVlKFJlY29yZCwgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgY2FzdDxWZWN0b3JUeXBlPihWZWMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCksIEVsdCkgfHwKKyAgICAgICAgICBnZXRWYWx1ZShSZWNvcmQsIE9wTnVtLCBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBJZHgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgSU5TRVJURUxUIHJlY29yZCIpOworICAgICAgSSA9IEluc2VydEVsZW1lbnRJbnN0OjpDcmVhdGUoVmVjLCBFbHQsIElkeCk7CisgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKEkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBiaXRjOjpGVU5DX0NPREVfSU5TVF9TSFVGRkxFVkVDOiB7Ly8gU0hVRkZMRVZFQzogW29wdmFsLHR5LG9wdmFsLG9wdmFsXQorICAgICAgdW5zaWduZWQgT3BOdW0gPSAwOworICAgICAgVmFsdWUgKlZlYzEsICpWZWMyLCAqTWFzazsKKyAgICAgIGlmIChnZXRWYWx1ZVR5cGVQYWlyKFJlY29yZCwgT3BOdW0sIE5leHRWYWx1ZU5vLCBWZWMxKSB8fAorICAgICAgICAgIGdldFZhbHVlKFJlY29yZCwgT3BOdW0sIFZlYzEtPmdldFR5cGUoKSwgVmVjMikpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBTSFVGRkxFVkVDIHJlY29yZCIpOworCisgICAgICBpZiAoZ2V0VmFsdWVUeXBlUGFpcihSZWNvcmQsIE9wTnVtLCBOZXh0VmFsdWVObywgTWFzaykpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBTSFVGRkxFVkVDIHJlY29yZCIpOworICAgICAgSSA9IG5ldyBTaHVmZmxlVmVjdG9ySW5zdChWZWMxLCBWZWMyLCBNYXNrKTsKKyAgICAgIEluc3RydWN0aW9uTGlzdC5wdXNoX2JhY2soSSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX0NNUDogICAvLyBDTVA6IFtvcHR5LCBvcHZhbCwgb3B2YWwsIHByZWRdCisgICAgICAvLyBPbGQgZm9ybSBvZiBJQ21wL0ZDbXAgcmV0dXJuaW5nIGJvb2wKKyAgICAgIC8vIEV4aXN0ZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGljbXAvZmNtcCBhbmQgdmljbXAvdmZjbXAgd2hpY2ggd2VyZQorICAgICAgLy8gYm90aCBsZWdhbCBvbiB2ZWN0b3JzIGJ1dCBoYWQgZGlmZmVyZW50IGJlaGF2aW91ci4KKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX0NNUDI6IHsgLy8gQ01QMjogW29wdHksIG9wdmFsLCBvcHZhbCwgcHJlZF0KKyAgICAgIC8vIEZDbXAvSUNtcCByZXR1cm5pbmcgYm9vbCBvciB2ZWN0b3Igb2YgYm9vbAorCisgICAgICB1bnNpZ25lZCBPcE51bSA9IDA7CisgICAgICBWYWx1ZSAqTEhTLCAqUkhTOworICAgICAgaWYgKGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIExIUykgfHwKKyAgICAgICAgICBnZXRWYWx1ZShSZWNvcmQsIE9wTnVtLCBMSFMtPmdldFR5cGUoKSwgUkhTKSB8fAorICAgICAgICAgIE9wTnVtKzEgIT0gUmVjb3JkLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENNUCByZWNvcmQiKTsKKworICAgICAgaWYgKExIUy0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkpCisgICAgICAgIEkgPSBuZXcgRkNtcEluc3QoKEZDbXBJbnN0OjpQcmVkaWNhdGUpUmVjb3JkW09wTnVtXSwgTEhTLCBSSFMpOworICAgICAgZWxzZQorICAgICAgICBJID0gbmV3IElDbXBJbnN0KChJQ21wSW5zdDo6UHJlZGljYXRlKVJlY29yZFtPcE51bV0sIExIUywgUkhTKTsKKyAgICAgIEluc3RydWN0aW9uTGlzdC5wdXNoX2JhY2soSSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX0dFVFJFU1VMVDogeyAvLyBHRVRSRVNVTFQ6IFt0eSwgdmFsLCBuXQorICAgICAgaWYgKFJlY29yZC5zaXplKCkgIT0gMikKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIEdFVFJFU1VMVCByZWNvcmQiKTsKKyAgICAgIHVuc2lnbmVkIE9wTnVtID0gMDsKKyAgICAgIFZhbHVlICpPcDsKKyAgICAgIGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIE9wKTsKKyAgICAgIHVuc2lnbmVkIEluZGV4ID0gUmVjb3JkWzFdOworICAgICAgSSA9IEV4dHJhY3RWYWx1ZUluc3Q6OkNyZWF0ZShPcCwgSW5kZXgpOworICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfUkVUOiAvLyBSRVQ6IFtvcHR5LG9wdmFsPG9wdGlvbmFsPl0KKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgU2l6ZSA9IFJlY29yZC5zaXplKCk7CisgICAgICAgIGlmIChTaXplID09IDApIHsKKyAgICAgICAgICBJID0gUmV0dXJuSW5zdDo6Q3JlYXRlKENvbnRleHQpOworICAgICAgICAgIEluc3RydWN0aW9uTGlzdC5wdXNoX2JhY2soSSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBPcE51bSA9IDA7CisgICAgICAgIFNtYWxsVmVjdG9yPFZhbHVlICosND4gVnM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBWYWx1ZSAqT3AgPSBOVUxMOworICAgICAgICAgIGlmIChnZXRWYWx1ZVR5cGVQYWlyKFJlY29yZCwgT3BOdW0sIE5leHRWYWx1ZU5vLCBPcCkpCisgICAgICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgUkVUIHJlY29yZCIpOworICAgICAgICAgIFZzLnB1c2hfYmFjayhPcCk7CisgICAgICAgIH0gd2hpbGUoT3BOdW0gIT0gUmVjb3JkLnNpemUoKSk7CisKKyAgICAgICAgY29uc3QgVHlwZSAqUmV0dXJuVHlwZSA9IEYtPmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgaWYgKFZzLnNpemUoKSA+IDEgfHwKKyAgICAgICAgICAgIChSZXR1cm5UeXBlLT5pc1N0cnVjdFR5KCkgJiYKKyAgICAgICAgICAgICAoVnMuZW1wdHkoKSB8fCBWc1swXS0+Z2V0VHlwZSgpICE9IFJldHVyblR5cGUpKSkgeworICAgICAgICAgIFZhbHVlICpSViA9IFVuZGVmVmFsdWU6OmdldChSZXR1cm5UeXBlKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgICAgSSA9IEluc2VydFZhbHVlSW5zdDo6Q3JlYXRlKFJWLCBWc1tpXSwgaSwgIm1ydiIpOworICAgICAgICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgICAgICAgIEN1ckJCLT5nZXRJbnN0TGlzdCgpLnB1c2hfYmFjayhJKTsKKyAgICAgICAgICAgIFZhbHVlTGlzdC5Bc3NpZ25WYWx1ZShJLCBOZXh0VmFsdWVObysrKTsKKyAgICAgICAgICAgIFJWID0gSTsKKyAgICAgICAgICB9CisgICAgICAgICAgSSA9IFJldHVybkluc3Q6OkNyZWF0ZShDb250ZXh0LCBSVik7CisgICAgICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEkgPSBSZXR1cm5JbnN0OjpDcmVhdGUoQ29udGV4dCwgVnNbMF0pOworICAgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKEkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX0JSOiB7IC8vIEJSOiBbYmIjLCBiYiMsIG9wdmFsXSBvciBbYmIjXQorICAgICAgaWYgKFJlY29yZC5zaXplKCkgIT0gMSAmJiBSZWNvcmQuc2l6ZSgpICE9IDMpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBCUiByZWNvcmQiKTsKKyAgICAgIEJhc2ljQmxvY2sgKlRydWVEZXN0ID0gZ2V0QmFzaWNCbG9jayhSZWNvcmRbMF0pOworICAgICAgaWYgKFRydWVEZXN0ID09IDApCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBCUiByZWNvcmQiKTsKKworICAgICAgaWYgKFJlY29yZC5zaXplKCkgPT0gMSkgeworICAgICAgICBJID0gQnJhbmNoSW5zdDo6Q3JlYXRlKFRydWVEZXN0KTsKKyAgICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBCYXNpY0Jsb2NrICpGYWxzZURlc3QgPSBnZXRCYXNpY0Jsb2NrKFJlY29yZFsxXSk7CisgICAgICAgIFZhbHVlICpDb25kID0gZ2V0Rm5WYWx1ZUJ5SUQoUmVjb3JkWzJdLCBUeXBlOjpnZXRJbnQxVHkoQ29udGV4dCkpOworICAgICAgICBpZiAoRmFsc2VEZXN0ID09IDAgfHwgQ29uZCA9PSAwKQorICAgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBCUiByZWNvcmQiKTsKKyAgICAgICAgSSA9IEJyYW5jaEluc3Q6OkNyZWF0ZShUcnVlRGVzdCwgRmFsc2VEZXN0LCBDb25kKTsKKyAgICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX1NXSVRDSDogeyAvLyBTV0lUQ0g6IFtvcHR5LCBvcDAsIG9wMSwgLi4uXQorICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCAzIHx8IChSZWNvcmQuc2l6ZSgpICYgMSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIFNXSVRDSCByZWNvcmQiKTsKKyAgICAgIGNvbnN0IFR5cGUgKk9wVHkgPSBnZXRUeXBlQnlJRChSZWNvcmRbMF0pOworICAgICAgVmFsdWUgKkNvbmQgPSBnZXRGblZhbHVlQnlJRChSZWNvcmRbMV0sIE9wVHkpOworICAgICAgQmFzaWNCbG9jayAqRGVmYXVsdCA9IGdldEJhc2ljQmxvY2soUmVjb3JkWzJdKTsKKyAgICAgIGlmIChPcFR5ID09IDAgfHwgQ29uZCA9PSAwIHx8IERlZmF1bHQgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIFNXSVRDSCByZWNvcmQiKTsKKyAgICAgIHVuc2lnbmVkIE51bUNhc2VzID0gKFJlY29yZC5zaXplKCktMykvMjsKKyAgICAgIFN3aXRjaEluc3QgKlNJID0gU3dpdGNoSW5zdDo6Q3JlYXRlKENvbmQsIERlZmF1bHQsIE51bUNhc2VzKTsKKyAgICAgIEluc3RydWN0aW9uTGlzdC5wdXNoX2JhY2soU0kpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE51bUNhc2VzOyBpICE9IGU7ICsraSkgeworICAgICAgICBDb25zdGFudEludCAqQ2FzZVZhbCA9CisgICAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudEludD4oZ2V0Rm5WYWx1ZUJ5SUQoUmVjb3JkWzMraSoyXSwgT3BUeSkpOworICAgICAgICBCYXNpY0Jsb2NrICpEZXN0QkIgPSBnZXRCYXNpY0Jsb2NrKFJlY29yZFsxKzMraSoyXSk7CisgICAgICAgIGlmIChDYXNlVmFsID09IDAgfHwgRGVzdEJCID09IDApIHsKKyAgICAgICAgICBkZWxldGUgU0k7CisgICAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIFNXSVRDSCByZWNvcmQhIik7CisgICAgICAgIH0KKyAgICAgICAgU0ktPmFkZENhc2UoQ2FzZVZhbCwgRGVzdEJCKTsKKyAgICAgIH0KKyAgICAgIEkgPSBTSTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX0lORElSRUNUQlI6IHsgLy8gSU5ESVJFQ1RCUjogW29wdHksIG9wMCwgb3AxLCAuLi5dCisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA8IDIpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBJTkRJUkVDVEJSIHJlY29yZCIpOworICAgICAgY29uc3QgVHlwZSAqT3BUeSA9IGdldFR5cGVCeUlEKFJlY29yZFswXSk7CisgICAgICBWYWx1ZSAqQWRkcmVzcyA9IGdldEZuVmFsdWVCeUlEKFJlY29yZFsxXSwgT3BUeSk7CisgICAgICBpZiAoT3BUeSA9PSAwIHx8IEFkZHJlc3MgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIElORElSRUNUQlIgcmVjb3JkIik7CisgICAgICB1bnNpZ25lZCBOdW1EZXN0cyA9IFJlY29yZC5zaXplKCktMjsKKyAgICAgIEluZGlyZWN0QnJJbnN0ICpJQkkgPSBJbmRpcmVjdEJySW5zdDo6Q3JlYXRlKEFkZHJlc3MsIE51bURlc3RzKTsKKyAgICAgIEluc3RydWN0aW9uTGlzdC5wdXNoX2JhY2soSUJJKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1EZXN0czsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgaWYgKEJhc2ljQmxvY2sgKkRlc3RCQiA9IGdldEJhc2ljQmxvY2soUmVjb3JkWzIraV0pKSB7CisgICAgICAgICAgSUJJLT5hZGREZXN0aW5hdGlvbihEZXN0QkIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlbGV0ZSBJQkk7CisgICAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIElORElSRUNUQlIgcmVjb3JkISIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBJID0gSUJJOworICAgICAgYnJlYWs7CisgICAgfQorICAgICAgICAKKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX0lOVk9LRTogeworICAgICAgLy8gSU5WT0tFOiBbYXR0cnMsIGNjLCBub3JtQkIsIHVud2luZEJCLCBmbnR5LCBvcDAsb3AxLG9wMiwgLi4uXQorICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCA0KSByZXR1cm4gRXJyb3IoIkludmFsaWQgSU5WT0tFIHJlY29yZCIpOworICAgICAgQXR0ckxpc3RQdHIgUEFMID0gZ2V0QXR0cmlidXRlcyhSZWNvcmRbMF0pOworICAgICAgdW5zaWduZWQgQ0NJbmZvID0gUmVjb3JkWzFdOworICAgICAgQmFzaWNCbG9jayAqTm9ybWFsQkIgPSBnZXRCYXNpY0Jsb2NrKFJlY29yZFsyXSk7CisgICAgICBCYXNpY0Jsb2NrICpVbndpbmRCQiA9IGdldEJhc2ljQmxvY2soUmVjb3JkWzNdKTsKKworICAgICAgdW5zaWduZWQgT3BOdW0gPSA0OworICAgICAgVmFsdWUgKkNhbGxlZTsKKyAgICAgIGlmIChnZXRWYWx1ZVR5cGVQYWlyKFJlY29yZCwgT3BOdW0sIE5leHRWYWx1ZU5vLCBDYWxsZWUpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgSU5WT0tFIHJlY29yZCIpOworCisgICAgICBjb25zdCBQb2ludGVyVHlwZSAqQ2FsbGVlVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oQ2FsbGVlLT5nZXRUeXBlKCkpOworICAgICAgY29uc3QgRnVuY3Rpb25UeXBlICpGVHkgPSAhQ2FsbGVlVHkgPyAwIDoKKyAgICAgICAgZHluX2Nhc3Q8RnVuY3Rpb25UeXBlPihDYWxsZWVUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisKKyAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHJpZ2h0IG51bWJlciBvZiBmaXhlZCBwYXJhbWV0ZXJzIGFyZSBoZXJlLgorICAgICAgaWYgKEZUeSA9PSAwIHx8IE5vcm1hbEJCID09IDAgfHwgVW53aW5kQkIgPT0gMCB8fAorICAgICAgICAgIFJlY29yZC5zaXplKCkgPCBPcE51bStGVHktPmdldE51bVBhcmFtcygpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgSU5WT0tFIHJlY29yZCIpOworCisgICAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDE2PiBPcHM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlR5LT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2ksICsrT3BOdW0pIHsKKyAgICAgICAgT3BzLnB1c2hfYmFjayhnZXRGblZhbHVlQnlJRChSZWNvcmRbT3BOdW1dLCBGVHktPmdldFBhcmFtVHlwZShpKSkpOworICAgICAgICBpZiAoT3BzLmJhY2soKSA9PSAwKSByZXR1cm4gRXJyb3IoIkludmFsaWQgSU5WT0tFIHJlY29yZCIpOworICAgICAgfQorCisgICAgICBpZiAoIUZUeS0+aXNWYXJBcmcoKSkgeworICAgICAgICBpZiAoUmVjb3JkLnNpemUoKSAhPSBPcE51bSkKKyAgICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgSU5WT0tFIHJlY29yZCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVhZCB0eXBlL3ZhbHVlIHBhaXJzIGZvciB2YXJhcmdzIHBhcmFtcy4KKyAgICAgICAgd2hpbGUgKE9wTnVtICE9IFJlY29yZC5zaXplKCkpIHsKKyAgICAgICAgICBWYWx1ZSAqT3A7CisgICAgICAgICAgaWYgKGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIE9wKSkKKyAgICAgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBJTlZPS0UgcmVjb3JkIik7CisgICAgICAgICAgT3BzLnB1c2hfYmFjayhPcCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgSSA9IEludm9rZUluc3Q6OkNyZWF0ZShDYWxsZWUsIE5vcm1hbEJCLCBVbndpbmRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLmJlZ2luKCksIE9wcy5lbmQoKSk7CisgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKEkpOworICAgICAgY2FzdDxJbnZva2VJbnN0PihJKS0+c2V0Q2FsbGluZ0NvbnYoCisgICAgICAgIHN0YXRpY19jYXN0PENhbGxpbmdDb252OjpJRD4oQ0NJbmZvKSk7CisgICAgICBjYXN0PEludm9rZUluc3Q+KEkpLT5zZXRBdHRyaWJ1dGVzKFBBTCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpGVU5DX0NPREVfSU5TVF9VTldJTkQ6IC8vIFVOV0lORAorICAgICAgSSA9IG5ldyBVbndpbmRJbnN0KENvbnRleHQpOworICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfVU5SRUFDSEFCTEU6IC8vIFVOUkVBQ0hBQkxFCisgICAgICBJID0gbmV3IFVucmVhY2hhYmxlSW5zdChDb250ZXh0KTsKKyAgICAgIEluc3RydWN0aW9uTGlzdC5wdXNoX2JhY2soSSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX1BISTogeyAvLyBQSEk6IFt0eSwgdmFsMCxiYjAsIC4uLl0KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMSB8fCAoKFJlY29yZC5zaXplKCktMSkmMSkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBQSEkgcmVjb3JkIik7CisgICAgICBjb25zdCBUeXBlICpUeSA9IGdldFR5cGVCeUlEKFJlY29yZFswXSk7CisgICAgICBpZiAoIVR5KSByZXR1cm4gRXJyb3IoIkludmFsaWQgUEhJIHJlY29yZCIpOworCisgICAgICBQSElOb2RlICpQTiA9IFBISU5vZGU6OkNyZWF0ZShUeSk7CisgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKFBOKTsKKyAgICAgIFBOLT5yZXNlcnZlT3BlcmFuZFNwYWNlKChSZWNvcmQuc2l6ZSgpLTEpLzIpOworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVjb3JkLnNpemUoKS0xOyBpICE9IGU7IGkgKz0gMikgeworICAgICAgICBWYWx1ZSAqViA9IGdldEZuVmFsdWVCeUlEKFJlY29yZFsxK2ldLCBUeSk7CisgICAgICAgIEJhc2ljQmxvY2sgKkJCID0gZ2V0QmFzaWNCbG9jayhSZWNvcmRbMitpXSk7CisgICAgICAgIGlmICghViB8fCAhQkIpIHJldHVybiBFcnJvcigiSW52YWxpZCBQSEkgcmVjb3JkIik7CisgICAgICAgIFBOLT5hZGRJbmNvbWluZyhWLCBCQik7CisgICAgICB9CisgICAgICBJID0gUE47CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX01BTExPQzogeyAvLyBNQUxMT0M6IFtpbnN0dHksIG9wLCBhbGlnbl0KKyAgICAgIC8vIEF1dG91cGdyYWRlIG1hbGxvYyBpbnN0cnVjdGlvbiB0byBtYWxsb2MgY2FsbC4KKyAgICAgIC8vIEZJWE1FOiBSZW1vdmUgaW4gTExWTSAzLjAuCisgICAgICBpZiAoUmVjb3JkLnNpemUoKSA8IDMpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBNQUxMT0MgcmVjb3JkIik7CisgICAgICBjb25zdCBQb2ludGVyVHlwZSAqVHkgPQorICAgICAgICBkeW5fY2FzdF9vcl9udWxsPFBvaW50ZXJUeXBlPihnZXRUeXBlQnlJRChSZWNvcmRbMF0pKTsKKyAgICAgIFZhbHVlICpTaXplID0gZ2V0Rm5WYWx1ZUJ5SUQoUmVjb3JkWzFdLCBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpKTsKKyAgICAgIGlmICghVHkgfHwgIVNpemUpIHJldHVybiBFcnJvcigiSW52YWxpZCBNQUxMT0MgcmVjb3JkIik7CisgICAgICBpZiAoIUN1ckJCKSByZXR1cm4gRXJyb3IoIkludmFsaWQgbWFsbG9jIGluc3RydWN0aW9uIHdpdGggbm8gQkIiKTsKKyAgICAgIGNvbnN0IFR5cGUgKkludDMyVHkgPSBJbnRlZ2VyVHlwZTo6Z2V0SW50MzJUeShDdXJCQi0+Z2V0Q29udGV4dCgpKTsKKyAgICAgIENvbnN0YW50ICpBbGxvY1NpemUgPSBDb25zdGFudEV4cHI6OmdldFNpemVPZihUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICBBbGxvY1NpemUgPSBDb25zdGFudEV4cHI6OmdldFRydW5jT3JCaXRDYXN0KEFsbG9jU2l6ZSwgSW50MzJUeSk7CisgICAgICBJID0gQ2FsbEluc3Q6OkNyZWF0ZU1hbGxvYyhDdXJCQiwgSW50MzJUeSwgVHktPmdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY1NpemUsIFNpemUsIE5VTEwpOworICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJpdGM6OkZVTkNfQ09ERV9JTlNUX0ZSRUU6IHsgLy8gRlJFRTogW29wLCBvcHR5XQorICAgICAgdW5zaWduZWQgT3BOdW0gPSAwOworICAgICAgVmFsdWUgKk9wOworICAgICAgaWYgKGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIE9wKSB8fAorICAgICAgICAgIE9wTnVtICE9IFJlY29yZC5zaXplKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBGUkVFIHJlY29yZCIpOworICAgICAgaWYgKCFDdXJCQikgcmV0dXJuIEVycm9yKCJJbnZhbGlkIGZyZWUgaW5zdHJ1Y3Rpb24gd2l0aCBubyBCQiIpOworICAgICAgSSA9IENhbGxJbnN0OjpDcmVhdGVGcmVlKE9wLCBDdXJCQik7CisgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKEkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfQUxMT0NBOiB7IC8vIEFMTE9DQTogW2luc3R0eSwgb3B0eSwgb3AsIGFsaWduXQorICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRvbGVyYXRlIGEgbGFjayBvZiBhbiBvcHR5LCBhbmQgdXNlIGkzMi4KKyAgICAgIC8vIExMVk0gMy4wOiBSZW1vdmUgdGhpcy4KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMyB8fCBSZWNvcmQuc2l6ZSgpID4gNCkKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIEFMTE9DQSByZWNvcmQiKTsKKyAgICAgIHVuc2lnbmVkIE9wTnVtID0gMDsKKyAgICAgIGNvbnN0IFBvaW50ZXJUeXBlICpUeSA9CisgICAgICAgIGR5bl9jYXN0X29yX251bGw8UG9pbnRlclR5cGU+KGdldFR5cGVCeUlEKFJlY29yZFtPcE51bSsrXSkpOworICAgICAgY29uc3QgVHlwZSAqT3BUeSA9IFJlY29yZC5zaXplKCkgPT0gNCA/IGdldFR5cGVCeUlEKFJlY29yZFtPcE51bSsrXSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDMyVHkoQ29udGV4dCk7CisgICAgICBWYWx1ZSAqU2l6ZSA9IGdldEZuVmFsdWVCeUlEKFJlY29yZFtPcE51bSsrXSwgT3BUeSk7CisgICAgICB1bnNpZ25lZCBBbGlnbiA9IFJlY29yZFtPcE51bSsrXTsKKyAgICAgIGlmICghVHkgfHwgIVNpemUpIHJldHVybiBFcnJvcigiSW52YWxpZCBBTExPQ0EgcmVjb3JkIik7CisgICAgICBJID0gbmV3IEFsbG9jYUluc3QoVHktPmdldEVsZW1lbnRUeXBlKCksIFNpemUsICgxIDw8IEFsaWduKSA+PiAxKTsKKyAgICAgIEluc3RydWN0aW9uTGlzdC5wdXNoX2JhY2soSSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpGVU5DX0NPREVfSU5TVF9MT0FEOiB7IC8vIExPQUQ6IFtvcHR5LCBvcCwgYWxpZ24sIHZvbF0KKyAgICAgIHVuc2lnbmVkIE9wTnVtID0gMDsKKyAgICAgIFZhbHVlICpPcDsKKyAgICAgIGlmIChnZXRWYWx1ZVR5cGVQYWlyKFJlY29yZCwgT3BOdW0sIE5leHRWYWx1ZU5vLCBPcCkgfHwKKyAgICAgICAgICBPcE51bSsyICE9IFJlY29yZC5zaXplKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBMT0FEIHJlY29yZCIpOworCisgICAgICBJID0gbmV3IExvYWRJbnN0KE9wLCAiIiwgUmVjb3JkW09wTnVtKzFdLCAoMSA8PCBSZWNvcmRbT3BOdW1dKSA+PiAxKTsKKyAgICAgIEluc3RydWN0aW9uTGlzdC5wdXNoX2JhY2soSSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpGVU5DX0NPREVfSU5TVF9TVE9SRTI6IHsgLy8gU1RPUkUyOltwdHJ0eSwgcHRyLCB2YWwsIGFsaWduLCB2b2xdCisgICAgICB1bnNpZ25lZCBPcE51bSA9IDA7CisgICAgICBWYWx1ZSAqVmFsLCAqUHRyOworICAgICAgaWYgKGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIFB0cikgfHwKKyAgICAgICAgICBnZXRWYWx1ZShSZWNvcmQsIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihQdHItPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCksIFZhbCkgfHwKKyAgICAgICAgICBPcE51bSsyICE9IFJlY29yZC5zaXplKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBTVE9SRSByZWNvcmQiKTsKKworICAgICAgSSA9IG5ldyBTdG9yZUluc3QoVmFsLCBQdHIsIFJlY29yZFtPcE51bSsxXSwgKDEgPDwgUmVjb3JkW09wTnVtXSkgPj4gMSk7CisgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKEkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfU1RPUkU6IHsgLy8gU1RPUkU6W3ZhbCwgdmFsdHksIHB0ciwgYWxpZ24sIHZvbF0KKyAgICAgIC8vIEZJWE1FOiBMZWdhY3kgZm9ybSBvZiBzdG9yZSBpbnN0cnVjdGlvbi4gU2hvdWxkIGJlIHJlbW92ZWQgaW4gTExWTSAzLjAuCisgICAgICB1bnNpZ25lZCBPcE51bSA9IDA7CisgICAgICBWYWx1ZSAqVmFsLCAqUHRyOworICAgICAgaWYgKGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIFZhbCkgfHwKKyAgICAgICAgICBnZXRWYWx1ZShSZWNvcmQsIE9wTnVtLAorICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVmFsLT5nZXRUeXBlKCkpLCBQdHIpfHwKKyAgICAgICAgICBPcE51bSsyICE9IFJlY29yZC5zaXplKCkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBTVE9SRSByZWNvcmQiKTsKKworICAgICAgSSA9IG5ldyBTdG9yZUluc3QoVmFsLCBQdHIsIFJlY29yZFtPcE51bSsxXSwgKDEgPDwgUmVjb3JkW09wTnVtXSkgPj4gMSk7CisgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKEkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYml0Yzo6RlVOQ19DT0RFX0lOU1RfQ0FMTDogeworICAgICAgLy8gQ0FMTDogW3BhcmFtYXR0cnMsIGNjLCBmbnR5LCBmbmlkLCBhcmcwLCBhcmcxLi4uXQorICAgICAgaWYgKFJlY29yZC5zaXplKCkgPCAzKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgQ0FMTCByZWNvcmQiKTsKKworICAgICAgQXR0ckxpc3RQdHIgUEFMID0gZ2V0QXR0cmlidXRlcyhSZWNvcmRbMF0pOworICAgICAgdW5zaWduZWQgQ0NJbmZvID0gUmVjb3JkWzFdOworCisgICAgICB1bnNpZ25lZCBPcE51bSA9IDI7CisgICAgICBWYWx1ZSAqQ2FsbGVlOworICAgICAgaWYgKGdldFZhbHVlVHlwZVBhaXIoUmVjb3JkLCBPcE51bSwgTmV4dFZhbHVlTm8sIENhbGxlZSkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBDQUxMIHJlY29yZCIpOworCisgICAgICBjb25zdCBQb2ludGVyVHlwZSAqT3BUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihDYWxsZWUtPmdldFR5cGUoKSk7CisgICAgICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IDA7CisgICAgICBpZiAoT3BUeSkgRlR5ID0gZHluX2Nhc3Q8RnVuY3Rpb25UeXBlPihPcFR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICAgIGlmICghRlR5IHx8IFJlY29yZC5zaXplKCkgPCBGVHktPmdldE51bVBhcmFtcygpK09wTnVtKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgQ0FMTCByZWNvcmQiKTsKKworICAgICAgU21hbGxWZWN0b3I8VmFsdWUqLCAxNj4gQXJnczsKKyAgICAgIC8vIFJlYWQgdGhlIGZpeGVkIHBhcmFtcy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVHktPmdldE51bVBhcmFtcygpOyBpICE9IGU7ICsraSwgKytPcE51bSkgeworICAgICAgICBpZiAoRlR5LT5nZXRQYXJhbVR5cGUoaSktPmdldFR5cGVJRCgpPT1UeXBlOjpMYWJlbFR5SUQpCisgICAgICAgICAgQXJncy5wdXNoX2JhY2soZ2V0QmFzaWNCbG9jayhSZWNvcmRbT3BOdW1dKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBBcmdzLnB1c2hfYmFjayhnZXRGblZhbHVlQnlJRChSZWNvcmRbT3BOdW1dLCBGVHktPmdldFBhcmFtVHlwZShpKSkpOworICAgICAgICBpZiAoQXJncy5iYWNrKCkgPT0gMCkgcmV0dXJuIEVycm9yKCJJbnZhbGlkIENBTEwgcmVjb3JkIik7CisgICAgICB9CisKKyAgICAgIC8vIFJlYWQgdHlwZS92YWx1ZSBwYWlycyBmb3IgdmFyYXJncyBwYXJhbXMuCisgICAgICBpZiAoIUZUeS0+aXNWYXJBcmcoKSkgeworICAgICAgICBpZiAoT3BOdW0gIT0gUmVjb3JkLnNpemUoKSkKKyAgICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgQ0FMTCByZWNvcmQiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChPcE51bSAhPSBSZWNvcmQuc2l6ZSgpKSB7CisgICAgICAgICAgVmFsdWUgKk9wOworICAgICAgICAgIGlmIChnZXRWYWx1ZVR5cGVQYWlyKFJlY29yZCwgT3BOdW0sIE5leHRWYWx1ZU5vLCBPcCkpCisgICAgICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgQ0FMTCByZWNvcmQiKTsKKyAgICAgICAgICBBcmdzLnB1c2hfYmFjayhPcCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgSSA9IENhbGxJbnN0OjpDcmVhdGUoQ2FsbGVlLCBBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCkpOworICAgICAgSW5zdHJ1Y3Rpb25MaXN0LnB1c2hfYmFjayhJKTsKKyAgICAgIGNhc3Q8Q2FsbEluc3Q+KEkpLT5zZXRDYWxsaW5nQ29udigKKyAgICAgICAgc3RhdGljX2Nhc3Q8Q2FsbGluZ0NvbnY6OklEPihDQ0luZm8+PjEpKTsKKyAgICAgIGNhc3Q8Q2FsbEluc3Q+KEkpLT5zZXRUYWlsQ2FsbChDQ0luZm8gJiAxKTsKKyAgICAgIGNhc3Q8Q2FsbEluc3Q+KEkpLT5zZXRBdHRyaWJ1dGVzKFBBTCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBiaXRjOjpGVU5DX0NPREVfSU5TVF9WQUFSRzogeyAvLyBWQUFSRzogW3ZhbGlzdHR5LCB2YWxpc3QsIGluc3R0eV0KKyAgICAgIGlmIChSZWNvcmQuc2l6ZSgpIDwgMykKKyAgICAgICAgcmV0dXJuIEVycm9yKCJJbnZhbGlkIFZBQVJHIHJlY29yZCIpOworICAgICAgY29uc3QgVHlwZSAqT3BUeSA9IGdldFR5cGVCeUlEKFJlY29yZFswXSk7CisgICAgICBWYWx1ZSAqT3AgPSBnZXRGblZhbHVlQnlJRChSZWNvcmRbMV0sIE9wVHkpOworICAgICAgY29uc3QgVHlwZSAqUmVzVHkgPSBnZXRUeXBlQnlJRChSZWNvcmRbMl0pOworICAgICAgaWYgKCFPcFR5IHx8ICFPcCB8fCAhUmVzVHkpCisgICAgICAgIHJldHVybiBFcnJvcigiSW52YWxpZCBWQUFSRyByZWNvcmQiKTsKKyAgICAgIEkgPSBuZXcgVkFBcmdJbnN0KE9wLCBSZXNUeSk7CisgICAgICBJbnN0cnVjdGlvbkxpc3QucHVzaF9iYWNrKEkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgIC8vIEFkZCBpbnN0cnVjdGlvbiB0byBlbmQgb2YgY3VycmVudCBCQi4gIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgQkIsIHJlamVjdAorICAgIC8vIHRoaXMgZmlsZS4KKyAgICBpZiAoQ3VyQkIgPT0gMCkgeworICAgICAgZGVsZXRlIEk7CisgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgaW5zdHJ1Y3Rpb24gd2l0aCBubyBCQiIpOworICAgIH0KKyAgICBDdXJCQi0+Z2V0SW5zdExpc3QoKS5wdXNoX2JhY2soSSk7CisKKyAgICAvLyBJZiB0aGlzIHdhcyBhIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24sIG1vdmUgdG8gdGhlIG5leHQgYmxvY2suCisgICAgaWYgKGlzYTxUZXJtaW5hdG9ySW5zdD4oSSkpIHsKKyAgICAgICsrQ3VyQkJObzsKKyAgICAgIEN1ckJCID0gQ3VyQkJObyA8IEZ1bmN0aW9uQkJzLnNpemUoKSA/IEZ1bmN0aW9uQkJzW0N1ckJCTm9dIDogMDsKKyAgICB9CisKKyAgICAvLyBOb24tdm9pZCB2YWx1ZXMgZ2V0IHJlZ2lzdGVyZWQgaW4gdGhlIHZhbHVlIHRhYmxlIGZvciBmdXR1cmUgdXNlLgorICAgIGlmIChJICYmICFJLT5nZXRUeXBlKCktPmlzVm9pZFR5KCkpCisgICAgICBWYWx1ZUxpc3QuQXNzaWduVmFsdWUoSSwgTmV4dFZhbHVlTm8rKyk7CisgIH0KKworICAvLyBDaGVjayB0aGUgZnVuY3Rpb24gbGlzdCBmb3IgdW5yZXNvbHZlZCB2YWx1ZXMuCisgIGlmIChBcmd1bWVudCAqQSA9IGR5bl9jYXN0PEFyZ3VtZW50PihWYWx1ZUxpc3QuYmFjaygpKSkgeworICAgIGlmIChBLT5nZXRQYXJlbnQoKSA9PSAwKSB7CisgICAgICAvLyBXZSBmb3VuZCBhdCBsZWFzdCBvbmUgdW5yZXNvbHZlZCB2YWx1ZS4gIE51a2UgdGhlbSBhbGwgdG8gYXZvaWQgbGVha3MuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBNb2R1bGVWYWx1ZUxpc3RTaXplLCBlID0gVmFsdWVMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpeworICAgICAgICBpZiAoKEEgPSBkeW5fY2FzdDxBcmd1bWVudD4oVmFsdWVMaXN0LmJhY2soKSkpICYmIEEtPmdldFBhcmVudCgpID09IDApIHsKKyAgICAgICAgICBBLT5yZXBsYWNlQWxsVXNlc1dpdGgoVW5kZWZWYWx1ZTo6Z2V0KEEtPmdldFR5cGUoKSkpOworICAgICAgICAgIGRlbGV0ZSBBOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gRXJyb3IoIk5ldmVyIHJlc29sdmVkIHZhbHVlIGZvdW5kIGluIGZ1bmN0aW9uISIpOworICAgIH0KKyAgfQorCisgIC8vIFNlZSBpZiBhbnl0aGluZyB0b29rIHRoZSBhZGRyZXNzIG9mIGJsb2NrcyBpbiB0aGlzIGZ1bmN0aW9uLiAgSWYgc28sCisgIC8vIHJlc29sdmUgdGhlbSBub3cuCisgIERlbnNlTWFwPEZ1bmN0aW9uKiwgc3RkOjp2ZWN0b3I8QmxvY2tBZGRyUmVmVHk+ID46Oml0ZXJhdG9yIEJBRlJJID0KKyAgICBCbG9ja0FkZHJGd2RSZWZzLmZpbmQoRik7CisgIGlmIChCQUZSSSAhPSBCbG9ja0FkZHJGd2RSZWZzLmVuZCgpKSB7CisgICAgc3RkOjp2ZWN0b3I8QmxvY2tBZGRyUmVmVHk+ICZSZWZMaXN0ID0gQkFGUkktPnNlY29uZDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVmTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBCbG9ja0lkeCA9IFJlZkxpc3RbaV0uZmlyc3Q7CisgICAgICBpZiAoQmxvY2tJZHggPj0gRnVuY3Rpb25CQnMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoIkludmFsaWQgYmxvY2thZGRyZXNzIGJsb2NrICMiKTsKKyAgICAKKyAgICAgIEdsb2JhbFZhcmlhYmxlICpGd2RSZWYgPSBSZWZMaXN0W2ldLnNlY29uZDsKKyAgICAgIEZ3ZFJlZi0+cmVwbGFjZUFsbFVzZXNXaXRoKEJsb2NrQWRkcmVzczo6Z2V0KEYsIEZ1bmN0aW9uQkJzW0Jsb2NrSWR4XSkpOworICAgICAgRndkUmVmLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICB9CisgICAgCisgICAgQmxvY2tBZGRyRndkUmVmcy5lcmFzZShCQUZSSSk7CisgIH0KKyAgCisgIC8vIFRyaW0gdGhlIHZhbHVlIGxpc3QgZG93biB0byB0aGUgc2l6ZSBpdCB3YXMgYmVmb3JlIHdlIHBhcnNlZCB0aGlzIGZ1bmN0aW9uLgorICBWYWx1ZUxpc3Quc2hyaW5rVG8oTW9kdWxlVmFsdWVMaXN0U2l6ZSk7CisgIHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPigpLnN3YXAoRnVuY3Rpb25CQnMpOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdWTWF0ZXJpYWxpemVyIGltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKK2Jvb2wgQml0Y29kZVJlYWRlcjo6aXNNYXRlcmlhbGl6YWJsZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IEZ1bmN0aW9uICpGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KEdWKSkgeworICAgIHJldHVybiBGLT5pc0RlY2xhcmF0aW9uKCkgJiYKKyAgICAgIERlZmVycmVkRnVuY3Rpb25JbmZvLmNvdW50KGNvbnN0X2Nhc3Q8RnVuY3Rpb24qPihGKSk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJpdGNvZGVSZWFkZXI6Ok1hdGVyaWFsaXplKEdsb2JhbFZhbHVlICpHViwgc3RkOjpzdHJpbmcgKkVyckluZm8pIHsKKyAgRnVuY3Rpb24gKkYgPSBkeW5fY2FzdDxGdW5jdGlvbj4oR1YpOworICAvLyBJZiBpdCdzIG5vdCBhIGZ1bmN0aW9uIG9yIGlzIGFscmVhZHkgbWF0ZXJpYWwsIGlnbm9yZSB0aGUgcmVxdWVzdC4KKyAgaWYgKCFGIHx8ICFGLT5pc01hdGVyaWFsaXphYmxlKCkpIHJldHVybiBmYWxzZTsKKworICBEZW5zZU1hcDxGdW5jdGlvbiosIHVpbnQ2NF90Pjo6aXRlcmF0b3IgREZJSSA9IERlZmVycmVkRnVuY3Rpb25JbmZvLmZpbmQoRik7CisgIGFzc2VydChERklJICE9IERlZmVycmVkRnVuY3Rpb25JbmZvLmVuZCgpICYmICJEZWZlcnJlZCBmdW5jdGlvbiBub3QgZm91bmQhIik7CisKKyAgLy8gTW92ZSB0aGUgYml0IHN0cmVhbSB0byB0aGUgc2F2ZWQgcG9zaXRpb24gb2YgdGhlIGRlZmVycmVkIGZ1bmN0aW9uIGJvZHkuCisgIFN0cmVhbS5KdW1wVG9CaXQoREZJSS0+c2Vjb25kKTsKKworICBpZiAoUGFyc2VGdW5jdGlvbkJvZHkoRikpIHsKKyAgICBpZiAoRXJySW5mbykgKkVyckluZm8gPSBFcnJvclN0cmluZzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFVwZ3JhZGUgYW55IG9sZCBpbnRyaW5zaWMgY2FsbHMgaW4gdGhlIGZ1bmN0aW9uLgorICBmb3IgKFVwZ3JhZGVkSW50cmluc2ljTWFwOjppdGVyYXRvciBJID0gVXBncmFkZWRJbnRyaW5zaWNzLmJlZ2luKCksCisgICAgICAgRSA9IFVwZ3JhZGVkSW50cmluc2ljcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+Zmlyc3QgIT0gSS0+c2Vjb25kKSB7CisgICAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBJLT5maXJzdC0+dXNlX2JlZ2luKCksCisgICAgICAgICAgIFVFID0gSS0+Zmlyc3QtPnVzZV9lbmQoKTsgVUkgIT0gVUU7ICkgeworICAgICAgICBpZiAoQ2FsbEluc3QqIENJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KCpVSSsrKSkKKyAgICAgICAgICBVcGdyYWRlSW50cmluc2ljQ2FsbChDSSwgSS0+c2Vjb25kKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQml0Y29kZVJlYWRlcjo6aXNEZW1hdGVyaWFsaXphYmxlKGNvbnN0IEdsb2JhbFZhbHVlICpHVikgY29uc3QgeworICBjb25zdCBGdW5jdGlvbiAqRiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihHVik7CisgIGlmICghRiB8fCBGLT5pc0RlY2xhcmF0aW9uKCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gRGVmZXJyZWRGdW5jdGlvbkluZm8uY291bnQoY29uc3RfY2FzdDxGdW5jdGlvbio+KEYpKTsKK30KKwordm9pZCBCaXRjb2RlUmVhZGVyOjpEZW1hdGVyaWFsaXplKEdsb2JhbFZhbHVlICpHVikgeworICBGdW5jdGlvbiAqRiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihHVik7CisgIC8vIElmIHRoaXMgZnVuY3Rpb24gaXNuJ3QgZGVtYXRlcmlhbGl6YWJsZSwgdGhpcyBpcyBhIG5vb3AuCisgIGlmICghRiB8fCAhaXNEZW1hdGVyaWFsaXphYmxlKEYpKQorICAgIHJldHVybjsKKworICBhc3NlcnQoRGVmZXJyZWRGdW5jdGlvbkluZm8uY291bnQoRikgJiYgIk5vIGluZm8gdG8gcmVhZCBmdW5jdGlvbiBsYXRlcj8iKTsKKworICAvLyBKdXN0IGZvcmdldCB0aGUgZnVuY3Rpb24gYm9keSwgd2UgY2FuIHJlbWF0IGl0IGxhdGVyLgorICBGLT5kZWxldGVCb2R5KCk7Cit9CisKKworYm9vbCBCaXRjb2RlUmVhZGVyOjpNYXRlcmlhbGl6ZU1vZHVsZShNb2R1bGUgKk0sIHN0ZDo6c3RyaW5nICpFcnJJbmZvKSB7CisgIGFzc2VydChNID09IFRoZU1vZHVsZSAmJgorICAgICAgICAgIkNhbiBvbmx5IE1hdGVyaWFsaXplIHRoZSBNb2R1bGUgdGhpcyBCaXRjb2RlUmVhZGVyIGlzIGF0dGFjaGVkIHRvLiIpOworICAvLyBJdGVyYXRlIG92ZXIgdGhlIG1vZHVsZSwgZGVzZXJpYWxpemluZyBhbnkgZnVuY3Rpb25zIHRoYXQgYXJlIHN0aWxsIG9uCisgIC8vIGRpc2suCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBGID0gVGhlTW9kdWxlLT5iZWdpbigpLCBFID0gVGhlTW9kdWxlLT5lbmQoKTsKKyAgICAgICBGICE9IEU7ICsrRikKKyAgICBpZiAoRi0+aXNNYXRlcmlhbGl6YWJsZSgpICYmCisgICAgICAgIE1hdGVyaWFsaXplKEYsIEVyckluZm8pKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gVXBncmFkZSBhbnkgaW50cmluc2ljIGNhbGxzIHRoYXQgc2xpcHBlZCB0aHJvdWdoIChzaG91bGQgbm90IGhhcHBlbiEpIGFuZAorICAvLyBkZWxldGUgdGhlIG9sZCBmdW5jdGlvbnMgdG8gY2xlYW4gdXAuIFdlIGNhbid0IGRvIHRoaXMgdW5sZXNzIHRoZSBlbnRpcmUKKyAgLy8gbW9kdWxlIGlzIG1hdGVyaWFsaXplZCBiZWNhdXNlIHRoZXJlIGNvdWxkIGFsd2F5cyBiZSBhbm90aGVyIGZ1bmN0aW9uIGJvZHkKKyAgLy8gd2l0aCBjYWxscyB0byB0aGUgb2xkIGZ1bmN0aW9uLgorICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxGdW5jdGlvbiosIEZ1bmN0aW9uKj4gPjo6aXRlcmF0b3IgSSA9CisgICAgICAgVXBncmFkZWRJbnRyaW5zaWNzLmJlZ2luKCksIEUgPSBVcGdyYWRlZEludHJpbnNpY3MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPmZpcnN0ICE9IEktPnNlY29uZCkgeworICAgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gSS0+Zmlyc3QtPnVzZV9iZWdpbigpLAorICAgICAgICAgICBVRSA9IEktPmZpcnN0LT51c2VfZW5kKCk7IFVJICE9IFVFOyApIHsKKyAgICAgICAgaWYgKENhbGxJbnN0KiBDSSA9IGR5bl9jYXN0PENhbGxJbnN0PigqVUkrKykpCisgICAgICAgICAgVXBncmFkZUludHJpbnNpY0NhbGwoQ0ksIEktPnNlY29uZCk7CisgICAgICB9CisgICAgICBpZiAoIUktPmZpcnN0LT51c2VfZW1wdHkoKSkKKyAgICAgICAgSS0+Zmlyc3QtPnJlcGxhY2VBbGxVc2VzV2l0aChJLT5zZWNvbmQpOworICAgICAgSS0+Zmlyc3QtPmVyYXNlRnJvbVBhcmVudCgpOworICAgIH0KKyAgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8RnVuY3Rpb24qLCBGdW5jdGlvbio+ID4oKS5zd2FwKFVwZ3JhZGVkSW50cmluc2ljcyk7CisKKyAgLy8gQ2hlY2sgZGVidWcgaW5mbyBpbnRyaW5zaWNzLgorICBDaGVja0RlYnVnSW5mb0ludHJpbnNpY3MoVGhlTW9kdWxlKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEV4dGVybmFsIGludGVyZmFjZQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGdldExhenlCaXRjb2RlTW9kdWxlIC0gbGF6eSBmdW5jdGlvbi1hdC1hLXRpbWUgbG9hZGluZyBmcm9tIGEgZmlsZS4KKy8vLworTW9kdWxlICpsbHZtOjpnZXRMYXp5Qml0Y29kZU1vZHVsZShNZW1vcnlCdWZmZXIgKkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQmIENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJNc2cpIHsKKyAgTW9kdWxlICpNID0gbmV3IE1vZHVsZShCdWZmZXItPmdldEJ1ZmZlcklkZW50aWZpZXIoKSwgQ29udGV4dCk7CisgIEJpdGNvZGVSZWFkZXIgKlIgPSBuZXcgQml0Y29kZVJlYWRlcihCdWZmZXIsIENvbnRleHQpOworICBNLT5zZXRNYXRlcmlhbGl6ZXIoUik7CisgIGlmIChSLT5QYXJzZUJpdGNvZGVJbnRvKE0pKSB7CisgICAgaWYgKEVyck1zZykKKyAgICAgICpFcnJNc2cgPSBSLT5nZXRFcnJvclN0cmluZygpOworCisgICAgZGVsZXRlIE07ICAvLyBBbHNvIGRlbGV0ZXMgUi4KKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBIYXZlIHRoZSBCaXRjb2RlUmVhZGVyIGR0b3IgZGVsZXRlICdCdWZmZXInLgorICBSLT5zZXRCdWZmZXJPd25lZCh0cnVlKTsKKyAgcmV0dXJuIE07Cit9CisKKy8vLyBQYXJzZUJpdGNvZGVGaWxlIC0gUmVhZCB0aGUgc3BlY2lmaWVkIGJpdGNvZGUgZmlsZSwgcmV0dXJuaW5nIHRoZSBtb2R1bGUuCisvLy8gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gbnVsbCBhbmQgZmlsbCBpbiAqRXJyTXNnIGlmIG5vbi1udWxsLgorTW9kdWxlICpsbHZtOjpQYXJzZUJpdGNvZGVGaWxlKE1lbW9yeUJ1ZmZlciAqQnVmZmVyLCBMTFZNQ29udGV4dCYgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyTXNnKXsKKyAgTW9kdWxlICpNID0gZ2V0TGF6eUJpdGNvZGVNb2R1bGUoQnVmZmVyLCBDb250ZXh0LCBFcnJNc2cpOworICBpZiAoIU0pIHJldHVybiAwOworCisgIC8vIERvbid0IGxldCB0aGUgQml0Y29kZVJlYWRlciBkdG9yIGRlbGV0ZSAnQnVmZmVyJywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisgIC8vIHRoZXJlIHdhcyBhbiBlcnJvci4KKyAgc3RhdGljX2Nhc3Q8Qml0Y29kZVJlYWRlcio+KE0tPmdldE1hdGVyaWFsaXplcigpKS0+c2V0QnVmZmVyT3duZWQoZmFsc2UpOworCisgIC8vIFJlYWQgaW4gdGhlIGVudGlyZSBtb2R1bGUsIGFuZCBkZXN0cm95IHRoZSBCaXRjb2RlUmVhZGVyLgorICBpZiAoTS0+TWF0ZXJpYWxpemVBbGxQZXJtYW5lbnRseShFcnJNc2cpKSB7CisgICAgZGVsZXRlIE07CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIE07Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQml0Y29kZS9SZWFkZXIvQml0Y29kZVJlYWRlci5oIGIvc3JjL0xMVk0vbGliL0JpdGNvZGUvUmVhZGVyL0JpdGNvZGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWFiNWQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0JpdGNvZGUvUmVhZGVyL0JpdGNvZGVSZWFkZXIuaApAQCAtMCwwICsxLDI3MCBAQAorLy89PT0tIEJpdGNvZGVSZWFkZXIuaCAtIEludGVybmFsIEJpdGNvZGVSZWFkZXIgaW1wbCAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBCaXRjb2RlUmVhZGVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQklUQ09ERV9SRUFERVJfSAorI2RlZmluZSBCSVRDT0RFX1JFQURFUl9ICisKKyNpbmNsdWRlICJsbHZtL0dWTWF0ZXJpYWxpemVyLmgiCisjaW5jbHVkZSAibGx2bS9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9PcGVyYW5kVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0JpdHN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vQml0Y29kZS9MTFZNQml0Q29kZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNZW1vcnlCdWZmZXI7CisgIGNsYXNzIExMVk1Db250ZXh0OworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgQml0Y29kZVJlYWRlclZhbHVlTGlzdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgQml0Y29kZVJlYWRlclZhbHVlTGlzdCB7CisgIHN0ZDo6dmVjdG9yPFdlYWtWSD4gVmFsdWVQdHJzOworICAKKyAgLy8vIFJlc29sdmVDb25zdGFudHMgLSBBcyB3ZSByZXNvbHZlIGZvcndhcmQtcmVmZXJlbmNlZCBjb25zdGFudHMsIHdlIGFkZAorICAvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlbSB0byB0aGlzIHZlY3Rvci4gIFRoaXMgYWxsb3dzIHVzIHRvIHJlc29sdmUgdGhlbSBpbgorICAvLy8gYnVsayBpbnN0ZWFkIG9mIHJlc29sdmluZyBlYWNoIHJlZmVyZW5jZSBhdCBhIHRpbWUuICBTZWUgdGhlIGNvZGUgaW4KKyAgLy8vIFJlc29sdmVDb25zdGFudEZvcndhcmRSZWZzIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMuCisgIC8vLworICAvLy8gVGhlIGtleSBvZiB0aGlzIHZlY3RvciBpcyB0aGUgcGxhY2Vob2xkZXIgY29uc3RhbnQsIHRoZSB2YWx1ZSBpcyB0aGUgc2xvdAorICAvLy8gbnVtYmVyIHRoYXQgaG9sZHMgdGhlIHJlc29sdmVkIHZhbHVlLgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDb25zdGFudCosIHVuc2lnbmVkPiA+IFJlc29sdmVDb25zdGFudHNUeTsKKyAgUmVzb2x2ZUNvbnN0YW50c1R5IFJlc29sdmVDb25zdGFudHM7CisgIExMVk1Db250ZXh0JiBDb250ZXh0OworcHVibGljOgorICBCaXRjb2RlUmVhZGVyVmFsdWVMaXN0KExMVk1Db250ZXh0JiBDKSA6IENvbnRleHQoQykge30KKyAgfkJpdGNvZGVSZWFkZXJWYWx1ZUxpc3QoKSB7CisgICAgYXNzZXJ0KFJlc29sdmVDb25zdGFudHMuZW1wdHkoKSAmJiAiQ29uc3RhbnRzIG5vdCByZXNvbHZlZD8iKTsKKyAgfQorCisgIC8vIHZlY3RvciBjb21wYXRpYmlsaXR5IG1ldGhvZHMKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlUHRycy5zaXplKCk7IH0KKyAgdm9pZCByZXNpemUodW5zaWduZWQgTikgeyBWYWx1ZVB0cnMucmVzaXplKE4pOyB9CisgIHZvaWQgcHVzaF9iYWNrKFZhbHVlICpWKSB7CisgICAgVmFsdWVQdHJzLnB1c2hfYmFjayhWKTsKKyAgfQorICAKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBhc3NlcnQoUmVzb2x2ZUNvbnN0YW50cy5lbXB0eSgpICYmICJDb25zdGFudHMgbm90IHJlc29sdmVkPyIpOworICAgIFZhbHVlUHRycy5jbGVhcigpOworICB9CisgIAorICBWYWx1ZSAqb3BlcmF0b3JbXSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBWYWx1ZVB0cnMuc2l6ZSgpKTsKKyAgICByZXR1cm4gVmFsdWVQdHJzW2ldOworICB9CisgIAorICBWYWx1ZSAqYmFjaygpIGNvbnN0IHsgcmV0dXJuIFZhbHVlUHRycy5iYWNrKCk7IH0KKyAgICB2b2lkIHBvcF9iYWNrKCkgeyBWYWx1ZVB0cnMucG9wX2JhY2soKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gVmFsdWVQdHJzLmVtcHR5KCk7IH0KKyAgdm9pZCBzaHJpbmtUbyh1bnNpZ25lZCBOKSB7CisgICAgYXNzZXJ0KE4gPD0gc2l6ZSgpICYmICJJbnZhbGlkIHNocmlua1RvIHJlcXVlc3QhIik7CisgICAgVmFsdWVQdHJzLnJlc2l6ZShOKTsKKyAgfQorICAKKyAgQ29uc3RhbnQgKmdldENvbnN0YW50RndkUmVmKHVuc2lnbmVkIElkeCwgY29uc3QgVHlwZSAqVHkpOworICBWYWx1ZSAqZ2V0VmFsdWVGd2RSZWYodW5zaWduZWQgSWR4LCBjb25zdCBUeXBlICpUeSk7CisgIAorICB2b2lkIEFzc2lnblZhbHVlKFZhbHVlICpWLCB1bnNpZ25lZCBJZHgpOworICAKKyAgLy8vIFJlc29sdmVDb25zdGFudEZvcndhcmRSZWZzIC0gT25jZSBhbGwgY29uc3RhbnRzIGFyZSByZWFkLCB0aGlzIG1ldGhvZCBidWxrCisgIC8vLyByZXNvbHZlcyBhbnkgZm9yd2FyZCByZWZlcmVuY2VzLgorICB2b2lkIFJlc29sdmVDb25zdGFudEZvcndhcmRSZWZzKCk7Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgQml0Y29kZVJlYWRlck1EVmFsdWVMaXN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBCaXRjb2RlUmVhZGVyTURWYWx1ZUxpc3QgeworICBzdGQ6OnZlY3RvcjxXZWFrVkg+IE1EVmFsdWVQdHJzOworICAKKyAgTExWTUNvbnRleHQgJkNvbnRleHQ7CitwdWJsaWM6CisgIEJpdGNvZGVSZWFkZXJNRFZhbHVlTGlzdChMTFZNQ29udGV4dCYgQykgOiBDb250ZXh0KEMpIHt9CisKKyAgLy8gdmVjdG9yIGNvbXBhdGliaWxpdHkgbWV0aG9kcworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgICAgICAgeyByZXR1cm4gTURWYWx1ZVB0cnMuc2l6ZSgpOyB9CisgIHZvaWQgcmVzaXplKHVuc2lnbmVkIE4pICAgICB7IE1EVmFsdWVQdHJzLnJlc2l6ZShOKTsgfQorICB2b2lkIHB1c2hfYmFjayhWYWx1ZSAqVikgICAgeyBNRFZhbHVlUHRycy5wdXNoX2JhY2soVik7ICB9CisgIHZvaWQgY2xlYXIoKSAgICAgICAgICAgICAgICB7IE1EVmFsdWVQdHJzLmNsZWFyKCk7ICB9CisgIFZhbHVlICpiYWNrKCkgY29uc3QgICAgICAgICB7IHJldHVybiBNRFZhbHVlUHRycy5iYWNrKCk7IH0KKyAgdm9pZCBwb3BfYmFjaygpICAgICAgICAgICAgIHsgTURWYWx1ZVB0cnMucG9wX2JhY2soKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gTURWYWx1ZVB0cnMuZW1wdHkoKTsgfQorICAKKyAgVmFsdWUgKm9wZXJhdG9yW10odW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgTURWYWx1ZVB0cnMuc2l6ZSgpKTsKKyAgICByZXR1cm4gTURWYWx1ZVB0cnNbaV07CisgIH0KKyAgCisgIHZvaWQgc2hyaW5rVG8odW5zaWduZWQgTikgeworICAgIGFzc2VydChOIDw9IHNpemUoKSAmJiAiSW52YWxpZCBzaHJpbmtUbyByZXF1ZXN0ISIpOworICAgIE1EVmFsdWVQdHJzLnJlc2l6ZShOKTsKKyAgfQorCisgIFZhbHVlICpnZXRWYWx1ZUZ3ZFJlZih1bnNpZ25lZCBJZHgpOworICB2b2lkIEFzc2lnblZhbHVlKFZhbHVlICpWLCB1bnNpZ25lZCBJZHgpOworfTsKKworY2xhc3MgQml0Y29kZVJlYWRlciA6IHB1YmxpYyBHVk1hdGVyaWFsaXplciB7CisgIExMVk1Db250ZXh0ICZDb250ZXh0OworICBNb2R1bGUgKlRoZU1vZHVsZTsKKyAgTWVtb3J5QnVmZmVyICpCdWZmZXI7CisgIGJvb2wgQnVmZmVyT3duZWQ7CisgIEJpdHN0cmVhbVJlYWRlciBTdHJlYW1GaWxlOworICBCaXRzdHJlYW1DdXJzb3IgU3RyZWFtOworICAKKyAgY29uc3QgY2hhciAqRXJyb3JTdHJpbmc7CisgIAorICBzdGQ6OnZlY3RvcjxQQVR5cGVIb2xkZXI+IFR5cGVMaXN0OworICBCaXRjb2RlUmVhZGVyVmFsdWVMaXN0IFZhbHVlTGlzdDsKKyAgQml0Y29kZVJlYWRlck1EVmFsdWVMaXN0IE1EVmFsdWVMaXN0OworICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiAqLCA2ND4gSW5zdHJ1Y3Rpb25MaXN0OworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxHbG9iYWxWYXJpYWJsZSosIHVuc2lnbmVkPiA+IEdsb2JhbEluaXRzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8R2xvYmFsQWxpYXMqLCB1bnNpZ25lZD4gPiBBbGlhc0luaXRzOworICAKKyAgLy8vIE1BdHRyaWJ1dGVzIC0gVGhlIHNldCBvZiBhdHRyaWJ1dGVzIGJ5IGluZGV4LiAgSW5kZXggemVybyBpbiB0aGUKKyAgLy8vIGZpbGUgaXMgZm9yIG51bGwsIGFuZCBpcyB0aHVzIG5vdCByZXByZXNlbnRlZCBoZXJlLiAgQXMgc3VjaCBhbGwgaW5kaWNlcworICAvLy8gYXJlIG9mZiBieSBvbmUuCisgIHN0ZDo6dmVjdG9yPEF0dHJMaXN0UHRyPiBNQXR0cmlidXRlczsKKyAgCisgIC8vLyBGdW5jdGlvbkJCcyAtIFdoaWxlIHBhcnNpbmcgYSBmdW5jdGlvbiBib2R5LCB0aGlzIGlzIGEgbGlzdCBvZiB0aGUgYmFzaWMKKyAgLy8vIGJsb2NrcyBmb3IgdGhlIGZ1bmN0aW9uLgorICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gRnVuY3Rpb25CQnM7CisgIAorICAvLyBXaGVuIHJlYWRpbmcgdGhlIG1vZHVsZSBoZWFkZXIsIHRoaXMgbGlzdCBpcyBwb3B1bGF0ZWQgd2l0aCBmdW5jdGlvbnMgdGhhdAorICAvLyBoYXZlIGJvZGllcyBsYXRlciBpbiB0aGUgZmlsZS4KKyAgc3RkOjp2ZWN0b3I8RnVuY3Rpb24qPiBGdW5jdGlvbnNXaXRoQm9kaWVzOworCisgIC8vIFdoZW4gaW50cmluc2ljIGZ1bmN0aW9ucyBhcmUgZW5jb3VudGVyZWQgd2hpY2ggcmVxdWlyZSB1cGdyYWRpbmcgdGhleSBhcmUgCisgIC8vIHN0b3JlZCBoZXJlIHdpdGggdGhlaXIgcmVwbGFjZW1lbnQgZnVuY3Rpb24uCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEZ1bmN0aW9uKiwgRnVuY3Rpb24qPiA+IFVwZ3JhZGVkSW50cmluc2ljTWFwOworICBVcGdyYWRlZEludHJpbnNpY01hcCBVcGdyYWRlZEludHJpbnNpY3M7CisKKyAgLy8gTWFwIHRoZSBiaXRjb2RlJ3MgY3VzdG9tIE1ES2luZCBJRCB0byB0aGUgTW9kdWxlJ3MgTURLaW5kIElELgorICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+IE1ES2luZE1hcDsKKyAgCisgIC8vIEFmdGVyIHRoZSBtb2R1bGUgaGVhZGVyIGhhcyBiZWVuIHJlYWQsIHRoZSBGdW5jdGlvbnNXaXRoQm9kaWVzIGxpc3QgaXMgCisgIC8vIHJldmVyc2VkLiAgVGhpcyBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHdlJ3ZlIGRvbmUgdGhpcyB5ZXQuCisgIGJvb2wgSGFzUmV2ZXJzZWRGdW5jdGlvbnNXaXRoQm9kaWVzOworICAKKyAgLy8vIERlZmVycmVkRnVuY3Rpb25JbmZvIC0gV2hlbiBmdW5jdGlvbiBib2RpZXMgYXJlIGluaXRpYWxseSBzY2FubmVkLCB0aGlzCisgIC8vLyBtYXAgY29udGFpbnMgaW5mbyBhYm91dCB3aGVyZSB0byBmaW5kIGRlZmVycmVkIGZ1bmN0aW9uIGJvZHkgaW4gdGhlCisgIC8vLyBzdHJlYW0uCisgIERlbnNlTWFwPEZ1bmN0aW9uKiwgdWludDY0X3Q+IERlZmVycmVkRnVuY3Rpb25JbmZvOworICAKKyAgLy8vIEJsb2NrQWRkckZ3ZFJlZnMgLSBUaGVzZSBhcmUgYmxvY2thZGRyIHJlZmVyZW5jZXMgdG8gYmFzaWMgYmxvY2tzLiAgVGhlc2UKKyAgLy8vIGFyZSByZXNvbHZlZCBsYXppbHkgd2hlbiBmdW5jdGlvbnMgYXJlIGxvYWRlZC4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8dW5zaWduZWQsIEdsb2JhbFZhcmlhYmxlKj4gQmxvY2tBZGRyUmVmVHk7CisgIERlbnNlTWFwPEZ1bmN0aW9uKiwgc3RkOjp2ZWN0b3I8QmxvY2tBZGRyUmVmVHk+ID4gQmxvY2tBZGRyRndkUmVmczsKKyAgCitwdWJsaWM6CisgIGV4cGxpY2l0IEJpdGNvZGVSZWFkZXIoTWVtb3J5QnVmZmVyICpidWZmZXIsIExMVk1Db250ZXh0ICZDKQorICAgIDogQ29udGV4dChDKSwgVGhlTW9kdWxlKDApLCBCdWZmZXIoYnVmZmVyKSwgQnVmZmVyT3duZWQoZmFsc2UpLAorICAgICAgRXJyb3JTdHJpbmcoMCksIFZhbHVlTGlzdChDKSwgTURWYWx1ZUxpc3QoQykgeworICAgIEhhc1JldmVyc2VkRnVuY3Rpb25zV2l0aEJvZGllcyA9IGZhbHNlOworICB9CisgIH5CaXRjb2RlUmVhZGVyKCkgeworICAgIEZyZWVTdGF0ZSgpOworICB9CisgIAorICB2b2lkIEZyZWVTdGF0ZSgpOworICAKKyAgLy8vIHNldEJ1ZmZlck93bmVkIC0gSWYgdGhpcyBpcyB0cnVlLCB0aGUgcmVhZGVyIHdpbGwgZGVzdHJveSB0aGUgTWVtb3J5QnVmZmVyCisgIC8vLyB3aGVuIHRoZSByZWFkZXIgaXMgZGVzdHJveWVkLgorICB2b2lkIHNldEJ1ZmZlck93bmVkKGJvb2wgT3duZWQpIHsgQnVmZmVyT3duZWQgPSBPd25lZDsgfQorICAKKyAgdmlydHVhbCBib29sIGlzTWF0ZXJpYWxpemFibGUoY29uc3QgR2xvYmFsVmFsdWUgKkdWKSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRGVtYXRlcmlhbGl6YWJsZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgTWF0ZXJpYWxpemUoR2xvYmFsVmFsdWUgKkdWLCBzdGQ6OnN0cmluZyAqRXJySW5mbyA9IDApOworICB2aXJ0dWFsIGJvb2wgTWF0ZXJpYWxpemVNb2R1bGUoTW9kdWxlICpNLCBzdGQ6OnN0cmluZyAqRXJySW5mbyA9IDApOworICB2aXJ0dWFsIHZvaWQgRGVtYXRlcmlhbGl6ZShHbG9iYWxWYWx1ZSAqR1YpOworCisgIGJvb2wgRXJyb3IoY29uc3QgY2hhciAqU3RyKSB7CisgICAgRXJyb3JTdHJpbmcgPSBTdHI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY29uc3QgY2hhciAqZ2V0RXJyb3JTdHJpbmcoKSBjb25zdCB7IHJldHVybiBFcnJvclN0cmluZzsgfQorICAKKyAgLy8vIEBicmllZiBNYWluIGludGVyZmFjZSB0byBwYXJzaW5nIGEgYml0Y29kZSBidWZmZXIuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICBib29sIFBhcnNlQml0Y29kZUludG8oTW9kdWxlICpNKTsKK3ByaXZhdGU6CisgIGNvbnN0IFR5cGUgKmdldFR5cGVCeUlEKHVuc2lnbmVkIElELCBib29sIGlzVHlwZVRhYmxlID0gZmFsc2UpOworICBWYWx1ZSAqZ2V0Rm5WYWx1ZUJ5SUQodW5zaWduZWQgSUQsIGNvbnN0IFR5cGUgKlR5KSB7CisgICAgaWYgKFR5ID09IFR5cGU6OmdldE1ldGFkYXRhVHkoQ29udGV4dCkpCisgICAgICByZXR1cm4gTURWYWx1ZUxpc3QuZ2V0VmFsdWVGd2RSZWYoSUQpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBWYWx1ZUxpc3QuZ2V0VmFsdWVGd2RSZWYoSUQsIFR5KTsKKyAgfQorICBCYXNpY0Jsb2NrICpnZXRCYXNpY0Jsb2NrKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgaWYgKElEID49IEZ1bmN0aW9uQkJzLnNpemUoKSkgcmV0dXJuIDA7IC8vIEludmFsaWQgSUQKKyAgICByZXR1cm4gRnVuY3Rpb25CQnNbSURdOworICB9CisgIEF0dHJMaXN0UHRyIGdldEF0dHJpYnV0ZXModW5zaWduZWQgaSkgY29uc3QgeworICAgIGlmIChpLTEgPCBNQXR0cmlidXRlcy5zaXplKCkpCisgICAgICByZXR1cm4gTUF0dHJpYnV0ZXNbaS0xXTsKKyAgICByZXR1cm4gQXR0ckxpc3RQdHIoKTsKKyAgfQorICAKKyAgLy8vIGdldFZhbHVlVHlwZVBhaXIgLSBSZWFkIGEgdmFsdWUvdHlwZSBwYWlyIG91dCBvZiB0aGUgc3BlY2lmaWVkIHJlY29yZCBmcm9tCisgIC8vLyBzbG90ICdTbG90Jy4gIEluY3JlbWVudCBTbG90IHBhc3QgdGhlIG51bWJlciBvZiBzbG90cyB1c2VkIGluIHRoZSByZWNvcmQuCisgIC8vLyBSZXR1cm4gdHJ1ZSBvbiBmYWlsdXJlLgorICBib29sIGdldFZhbHVlVHlwZVBhaXIoU21hbGxWZWN0b3I8dWludDY0X3QsIDY0PiAmUmVjb3JkLCB1bnNpZ25lZCAmU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluc3ROdW0sIFZhbHVlIComUmVzVmFsKSB7CisgICAgaWYgKFNsb3QgPT0gUmVjb3JkLnNpemUoKSkgcmV0dXJuIHRydWU7CisgICAgdW5zaWduZWQgVmFsTm8gPSAodW5zaWduZWQpUmVjb3JkW1Nsb3QrK107CisgICAgaWYgKFZhbE5vIDwgSW5zdE51bSkgeworICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBmb3J3YXJkIHJlZmVyZW5jZSwganVzdCByZXR1cm4gdGhlIHZhbHVlIHdlIGFscmVhZHkKKyAgICAgIC8vIGhhdmUuCisgICAgICBSZXNWYWwgPSBnZXRGblZhbHVlQnlJRChWYWxObywgMCk7CisgICAgICByZXR1cm4gUmVzVmFsID09IDA7CisgICAgfSBlbHNlIGlmIChTbG90ID09IFJlY29yZC5zaXplKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBUeXBlTm8gPSAodW5zaWduZWQpUmVjb3JkW1Nsb3QrK107CisgICAgUmVzVmFsID0gZ2V0Rm5WYWx1ZUJ5SUQoVmFsTm8sIGdldFR5cGVCeUlEKFR5cGVObykpOworICAgIHJldHVybiBSZXNWYWwgPT0gMDsKKyAgfQorICBib29sIGdldFZhbHVlKFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA2ND4gJlJlY29yZCwgdW5zaWduZWQgJlNsb3QsCisgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHksIFZhbHVlIComUmVzVmFsKSB7CisgICAgaWYgKFNsb3QgPT0gUmVjb3JkLnNpemUoKSkgcmV0dXJuIHRydWU7CisgICAgdW5zaWduZWQgVmFsTm8gPSAodW5zaWduZWQpUmVjb3JkW1Nsb3QrK107CisgICAgUmVzVmFsID0gZ2V0Rm5WYWx1ZUJ5SUQoVmFsTm8sIFR5KTsKKyAgICByZXR1cm4gUmVzVmFsID09IDA7CisgIH0KKworICAKKyAgYm9vbCBQYXJzZU1vZHVsZSgpOworICBib29sIFBhcnNlQXR0cmlidXRlQmxvY2soKTsKKyAgYm9vbCBQYXJzZVR5cGVUYWJsZSgpOworICBib29sIFBhcnNlVHlwZVN5bWJvbFRhYmxlKCk7CisgIGJvb2wgUGFyc2VWYWx1ZVN5bWJvbFRhYmxlKCk7CisgIGJvb2wgUGFyc2VDb25zdGFudHMoKTsKKyAgYm9vbCBSZW1lbWJlckFuZFNraXBGdW5jdGlvbkJvZHkoKTsKKyAgYm9vbCBQYXJzZUZ1bmN0aW9uQm9keShGdW5jdGlvbiAqRik7CisgIGJvb2wgUmVzb2x2ZUdsb2JhbEFuZEFsaWFzSW5pdHMoKTsKKyAgYm9vbCBQYXJzZU1ldGFkYXRhKCk7CisgIGJvb2wgUGFyc2VNZXRhZGF0YUF0dGFjaG1lbnQoKTsKK307CisgIAorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQml0Y29kZS9SZWFkZXIvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvQml0Y29kZS9SZWFkZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzZDQzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1JlYWRlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDQgQEAKK2FkZF9sbHZtX2xpYnJhcnkoTExWTUJpdFJlYWRlcgorICBCaXRSZWFkZXIuY3BwCisgIEJpdGNvZGVSZWFkZXIuY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1JlYWRlci9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1JlYWRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWFmOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0JpdGNvZGUvUmVhZGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvQml0Y29kZS9SZWFkZXIvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUJpdFJlYWRlcgorQlVJTERfQVJDSElWRSA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0JpdGNvZGUvV3JpdGVyL0JpdFdyaXRlci5jcHAgYi9zcmMvTExWTS9saWIvQml0Y29kZS9Xcml0ZXIvQml0V3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjg4NDIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0JpdGNvZGUvV3JpdGVyL0JpdFdyaXRlci5jcHAKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tLSBCaXRXcml0ZXIuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0tYy9CaXRXcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvUmVhZGVyV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworCisvKj09PS0tIE9wZXJhdGlvbnMgb24gbW9kdWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCitpbnQgTExWTVdyaXRlQml0Y29kZVRvRmlsZShMTFZNTW9kdWxlUmVmIE0sIGNvbnN0IGNoYXIgKlBhdGgpIHsKKyAgc3RkOjpzdHJpbmcgRXJyb3JJbmZvOworICByYXdfZmRfb3N0cmVhbSBPUyhQYXRoLCBFcnJvckluZm8sCisgICAgICAgICAgICAgICAgICAgIHJhd19mZF9vc3RyZWFtOjpGX0JpbmFyeSk7CisgIAorICBpZiAoIUVycm9ySW5mby5lbXB0eSgpKQorICAgIHJldHVybiAtMTsKKyAgCisgIFdyaXRlQml0Y29kZVRvRmlsZSh1bndyYXAoTSksIE9TKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBMTFZNV3JpdGVCaXRjb2RlVG9GRChMTFZNTW9kdWxlUmVmIE0sIGludCBGRCwgaW50IFNob3VsZENsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBVbmJ1ZmZlcmVkKSB7CisgIHJhd19mZF9vc3RyZWFtIE9TKEZELCBTaG91bGRDbG9zZSwgVW5idWZmZXJlZCk7CisgIAorICBXcml0ZUJpdGNvZGVUb0ZpbGUodW53cmFwKE0pLCBPUyk7CisgIHJldHVybiAwOworfQorCitpbnQgTExWTVdyaXRlQml0Y29kZVRvRmlsZUhhbmRsZShMTFZNTW9kdWxlUmVmIE0sIGludCBGaWxlSGFuZGxlKSB7CisgIHJldHVybiBMTFZNV3JpdGVCaXRjb2RlVG9GRChNLCBGaWxlSGFuZGxlLCB0cnVlLCBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQml0Y29kZS9Xcml0ZXIvQml0Y29kZVdyaXRlci5jcHAgYi9zcmMvTExWTS9saWIvQml0Y29kZS9Xcml0ZXIvQml0Y29kZVdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2YzJkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1dyaXRlci9CaXRjb2RlV3JpdGVyLmNwcApAQCAtMCwwICsxLDE2OTQgQEAKKy8vPT09LS0tIEJpdGNvZGUvV3JpdGVyL0JpdGNvZGVXcml0ZXIuY3BwIC0gQml0Y29kZSBXcml0ZXIgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQml0Y29kZSB3cml0ZXIgaW1wbGVtZW50YXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQml0Y29kZS9SZWFkZXJXcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvQml0c3RyZWFtV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0xMVk1CaXRDb2Rlcy5oIgorI2luY2x1ZGUgIlZhbHVlRW51bWVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lubGluZUFzbS5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL09wZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlU3ltYm9sVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL1ZhbHVlU3ltYm9sVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUHJvZ3JhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBUaGVzZSBhcmUgbWFuaWZlc3QgY29uc3RhbnRzIHVzZWQgYnkgdGhlIGJpdGNvZGUgd3JpdGVyLiBUaGV5IGRvIG5vdCBuZWVkIHRvCisvLy8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHJlYWRlciwgYnV0IG5lZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoaW4gdGhpcyBmaWxlLgorZW51bSB7CisgIEN1clZlcnNpb24gPSAwLAorCisgIC8vIFZBTFVFX1NZTVRBQl9CTE9DSyBhYmJyZXYgaWQncy4KKyAgVlNUX0VOVFJZXzhfQUJCUkVWID0gYml0Yzo6RklSU1RfQVBQTElDQVRJT05fQUJCUkVWLAorICBWU1RfRU5UUllfN19BQkJSRVYsCisgIFZTVF9FTlRSWV82X0FCQlJFViwKKyAgVlNUX0JCRU5UUllfNl9BQkJSRVYsCisKKyAgLy8gQ09OU1RBTlRTX0JMT0NLIGFiYnJldiBpZCdzLgorICBDT05TVEFOVFNfU0VUVFlQRV9BQkJSRVYgPSBiaXRjOjpGSVJTVF9BUFBMSUNBVElPTl9BQkJSRVYsCisgIENPTlNUQU5UU19JTlRFR0VSX0FCQlJFViwKKyAgQ09OU1RBTlRTX0NFX0NBU1RfQWJicmV2LAorICBDT05TVEFOVFNfTlVMTF9BYmJyZXYsCisKKyAgLy8gRlVOQ1RJT05fQkxPQ0sgYWJicmV2IGlkJ3MuCisgIEZVTkNUSU9OX0lOU1RfTE9BRF9BQkJSRVYgPSBiaXRjOjpGSVJTVF9BUFBMSUNBVElPTl9BQkJSRVYsCisgIEZVTkNUSU9OX0lOU1RfQklOT1BfQUJCUkVWLAorICBGVU5DVElPTl9JTlNUX0JJTk9QX0ZMQUdTX0FCQlJFViwKKyAgRlVOQ1RJT05fSU5TVF9DQVNUX0FCQlJFViwKKyAgRlVOQ1RJT05fSU5TVF9SRVRfVk9JRF9BQkJSRVYsCisgIEZVTkNUSU9OX0lOU1RfUkVUX1ZBTF9BQkJSRVYsCisgIEZVTkNUSU9OX0lOU1RfVU5SRUFDSEFCTEVfQUJCUkVWCit9OworCisKK3N0YXRpYyB1bnNpZ25lZCBHZXRFbmNvZGVkQ2FzdE9wY29kZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBjYXN0IGluc3RydWN0aW9uISIpOworICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYyAgIDogcmV0dXJuIGJpdGM6OkNBU1RfVFJVTkM7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlpFeHQgICAgOiByZXR1cm4gYml0Yzo6Q0FTVF9aRVhUOworICBjYXNlIEluc3RydWN0aW9uOjpTRXh0ICAgIDogcmV0dXJuIGJpdGM6OkNBU1RfU0VYVDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJICA6IHJldHVybiBiaXRjOjpDQVNUX0ZQVE9VSTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1NJICA6IHJldHVybiBiaXRjOjpDQVNUX0ZQVE9TSTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VUlUb0ZQICA6IHJldHVybiBiaXRjOjpDQVNUX1VJVE9GUDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQICA6IHJldHVybiBiaXRjOjpDQVNUX1NJVE9GUDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYyA6IHJldHVybiBiaXRjOjpDQVNUX0ZQVFJVTkM7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQRXh0ICAgOiByZXR1cm4gYml0Yzo6Q0FTVF9GUEVYVDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ6IHJldHVybiBiaXRjOjpDQVNUX1BUUlRPSU5UOworICBjYXNlIEluc3RydWN0aW9uOjpJbnRUb1B0cjogcmV0dXJuIGJpdGM6OkNBU1RfSU5UVE9QVFI7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3QgOiByZXR1cm4gYml0Yzo6Q0FTVF9CSVRDQVNUOworICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBHZXRFbmNvZGVkQmluYXJ5T3Bjb2RlKHVuc2lnbmVkIE9wY29kZSkgeworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGJpbmFyeSBpbnN0cnVjdGlvbiEiKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICBjYXNlIEluc3RydWN0aW9uOjpGQWRkOiByZXR1cm4gYml0Yzo6QklOT1BfQUREOworICBjYXNlIEluc3RydWN0aW9uOjpTdWI6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZTdWI6IHJldHVybiBiaXRjOjpCSU5PUF9TVUI7CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Rk11bDogcmV0dXJuIGJpdGM6OkJJTk9QX01VTDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjogcmV0dXJuIGJpdGM6OkJJTk9QX1VESVY7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZEaXY6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNEaXY6IHJldHVybiBiaXRjOjpCSU5PUF9TRElWOworICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOiByZXR1cm4gYml0Yzo6QklOT1BfVVJFTTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlJlbToKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbTogcmV0dXJuIGJpdGM6OkJJTk9QX1NSRU07CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDogIHJldHVybiBiaXRjOjpCSU5PUF9TSEw7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6IHJldHVybiBiaXRjOjpCSU5PUF9MU0hSOworICBjYXNlIEluc3RydWN0aW9uOjpBU2hyOiByZXR1cm4gYml0Yzo6QklOT1BfQVNIUjsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QW5kOiAgcmV0dXJuIGJpdGM6OkJJTk9QX0FORDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6ICAgcmV0dXJuIGJpdGM6OkJJTk9QX09SOworICBjYXNlIEluc3RydWN0aW9uOjpYb3I6ICByZXR1cm4gYml0Yzo6QklOT1BfWE9SOworICB9Cit9CisKKworCitzdGF0aWMgdm9pZCBXcml0ZVN0cmluZ1JlY29yZCh1bnNpZ25lZCBDb2RlLCBjb25zdCBzdGQ6OnN0cmluZyAmU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWJicmV2VG9Vc2UsIEJpdHN0cmVhbVdyaXRlciAmU3RyZWFtKSB7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA2ND4gVmFsczsKKworICAvLyBDb2RlOiBbc3RyY2hhciB4IE5dCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdHIuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBWYWxzLnB1c2hfYmFjayhTdHJbaV0pOworCisgIC8vIEVtaXQgdGhlIGZpbmlzaGVkIHJlY29yZC4KKyAgU3RyZWFtLkVtaXRSZWNvcmQoQ29kZSwgVmFscywgQWJicmV2VG9Vc2UpOworfQorCisvLyBFbWl0IGluZm9ybWF0aW9uIGFib3V0IHBhcmFtZXRlciBhdHRyaWJ1dGVzLgorc3RhdGljIHZvaWQgV3JpdGVBdHRyaWJ1dGVUYWJsZShjb25zdCBWYWx1ZUVudW1lcmF0b3IgJlZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZXIgJlN0cmVhbSkgeworICBjb25zdCBzdGQ6OnZlY3RvcjxBdHRyTGlzdFB0cj4gJkF0dHJzID0gVkUuZ2V0QXR0cmlidXRlcygpOworICBpZiAoQXR0cnMuZW1wdHkoKSkgcmV0dXJuOworCisgIFN0cmVhbS5FbnRlclN1YmJsb2NrKGJpdGM6OlBBUkFNQVRUUl9CTE9DS19JRCwgMyk7CisKKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDY0PiBSZWNvcmQ7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBdHRycy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgQXR0ckxpc3RQdHIgJkEgPSBBdHRyc1tpXTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQS5nZXROdW1TbG90cygpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgQXR0cmlidXRlV2l0aEluZGV4ICZQQVdJID0gQS5nZXRTbG90KGkpOworICAgICAgUmVjb3JkLnB1c2hfYmFjayhQQVdJLkluZGV4KTsKKworICAgICAgLy8gRklYTUU6IHJlbW92ZSBpbiBMTFZNIDMuMAorICAgICAgLy8gU3RvcmUgdGhlIGFsaWdubWVudCBpbiB0aGUgYml0Y29kZSBhcyBhIDE2LWJpdCByYXcgdmFsdWUgaW5zdGVhZCBvZiBhCisgICAgICAvLyA1LWJpdCBsb2cyIGVuY29kZWQgdmFsdWUuIFNoaWZ0IHRoZSBiaXRzIGFib3ZlIHRoZSBhbGlnbm1lbnQgdXAgYnkKKyAgICAgIC8vIDExIGJpdHMuCisgICAgICB1aW50NjRfdCBGYXV4QXR0ciA9IFBBV0kuQXR0cnMgJiAweGZmZmY7CisgICAgICBpZiAoUEFXSS5BdHRycyAmIEF0dHJpYnV0ZTo6QWxpZ25tZW50KQorICAgICAgICBGYXV4QXR0ciB8PSAoMXVsbDw8MTYpPDwoKChQQVdJLkF0dHJzICYgQXR0cmlidXRlOjpBbGlnbm1lbnQpLTEpID4+IDE2KTsKKyAgICAgIEZhdXhBdHRyIHw9IChQQVdJLkF0dHJzICYgKDB4M0ZGdWxsIDw8IDIxKSkgPDwgMTE7CisKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soRmF1eEF0dHIpOworICAgIH0KKworICAgIFN0cmVhbS5FbWl0UmVjb3JkKGJpdGM6OlBBUkFNQVRUUl9DT0RFX0VOVFJZLCBSZWNvcmQpOworICAgIFJlY29yZC5jbGVhcigpOworICB9CisKKyAgU3RyZWFtLkV4aXRCbG9jaygpOworfQorCisvLy8gV3JpdGVUeXBlVGFibGUgLSBXcml0ZSBvdXQgdGhlIHR5cGUgdGFibGUgZm9yIGEgbW9kdWxlLgorc3RhdGljIHZvaWQgV3JpdGVUeXBlVGFibGUoY29uc3QgVmFsdWVFbnVtZXJhdG9yICZWRSwgQml0c3RyZWFtV3JpdGVyICZTdHJlYW0pIHsKKyAgY29uc3QgVmFsdWVFbnVtZXJhdG9yOjpUeXBlTGlzdCAmVHlwZUxpc3QgPSBWRS5nZXRUeXBlcygpOworCisgIFN0cmVhbS5FbnRlclN1YmJsb2NrKGJpdGM6OlRZUEVfQkxPQ0tfSUQsIDQgLypjb3VudCBmcm9tICMgYWJicmV2cyAqLyk7CisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA2ND4gVHlwZVZhbHM7CisKKyAgLy8gQWJicmV2IGZvciBUWVBFX0NPREVfUE9JTlRFUi4KKyAgQml0Q29kZUFiYnJldiAqQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6VFlQRV9DT0RFX1BPSU5URVIpKTsKKyAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZzJfMzJfQ2VpbChWRS5nZXRUeXBlcygpLnNpemUoKSsxKSkpOworICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKDApKTsgIC8vIEFkZHJzcGFjZSA9IDAKKyAgdW5zaWduZWQgUHRyQWJicmV2ID0gU3RyZWFtLkVtaXRBYmJyZXYoQWJidik7CisKKyAgLy8gQWJicmV2IGZvciBUWVBFX0NPREVfRlVOQ1RJT04uCisgIEFiYnYgPSBuZXcgQml0Q29kZUFiYnJldigpOworICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKGJpdGM6OlRZUEVfQ09ERV9GVU5DVElPTikpOworICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDEpKTsgIC8vIGlzdmFyYXJnCisgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoMCkpOyAgLy8gRklYTUU6IERFQUQgdmFsdWUsIHJlbW92ZSBpbiBMTFZNIDMuMAorICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6QXJyYXkpKTsKKyAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZzJfMzJfQ2VpbChWRS5nZXRUeXBlcygpLnNpemUoKSsxKSkpOworICB1bnNpZ25lZCBGdW5jdGlvbkFiYnJldiA9IFN0cmVhbS5FbWl0QWJicmV2KEFiYnYpOworCisgIC8vIEFiYnJldiBmb3IgVFlQRV9DT0RFX1NUUlVDVC4KKyAgQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6VFlQRV9DT0RFX1NUUlVDVCkpOworICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDEpKTsgIC8vIGlzcGFja2VkCisgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpBcnJheSkpOworICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nMl8zMl9DZWlsKFZFLmdldFR5cGVzKCkuc2l6ZSgpKzEpKSk7CisgIHVuc2lnbmVkIFN0cnVjdEFiYnJldiA9IFN0cmVhbS5FbWl0QWJicmV2KEFiYnYpOworCisgIC8vIEFiYnJldiBmb3IgVFlQRV9DT0RFX1VOSU9OLgorICBBYmJ2ID0gbmV3IEJpdENvZGVBYmJyZXYoKTsKKyAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChiaXRjOjpUWVBFX0NPREVfVU5JT04pKTsKKyAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkFycmF5KSk7CisgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpGaXhlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cyXzMyX0NlaWwoVkUuZ2V0VHlwZXMoKS5zaXplKCkrMSkpKTsKKyAgdW5zaWduZWQgVW5pb25BYmJyZXYgPSBTdHJlYW0uRW1pdEFiYnJldihBYmJ2KTsKKworICAvLyBBYmJyZXYgZm9yIFRZUEVfQ09ERV9BUlJBWS4KKyAgQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6VFlQRV9DT0RFX0FSUkFZKSk7CisgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpWQlIsIDgpKTsgICAvLyBzaXplCisgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpGaXhlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cyXzMyX0NlaWwoVkUuZ2V0VHlwZXMoKS5zaXplKCkrMSkpKTsKKyAgdW5zaWduZWQgQXJyYXlBYmJyZXYgPSBTdHJlYW0uRW1pdEFiYnJldihBYmJ2KTsKKworICAvLyBFbWl0IGFuIGVudHJ5IGNvdW50IHNvIHRoZSByZWFkZXIgY2FuIHJlc2VydmUgc3BhY2UuCisgIFR5cGVWYWxzLnB1c2hfYmFjayhUeXBlTGlzdC5zaXplKCkpOworICBTdHJlYW0uRW1pdFJlY29yZChiaXRjOjpUWVBFX0NPREVfTlVNRU5UUlksIFR5cGVWYWxzKTsKKyAgVHlwZVZhbHMuY2xlYXIoKTsKKworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSB0eXBlcywgZW1pdHRpbmcgZWFjaCBpbiB0dXJuLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVHlwZUxpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IFR5cGUgKlQgPSBUeXBlTGlzdFtpXS5maXJzdDsKKyAgICBpbnQgQWJicmV2VG9Vc2UgPSAwOworICAgIHVuc2lnbmVkIENvZGUgPSAwOworCisgICAgc3dpdGNoIChULT5nZXRUeXBlSUQoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdHlwZSEiKTsKKyAgICBjYXNlIFR5cGU6OlZvaWRUeUlEOiAgIENvZGUgPSBiaXRjOjpUWVBFX0NPREVfVk9JRDsgICBicmVhazsKKyAgICBjYXNlIFR5cGU6OkZsb2F0VHlJRDogIENvZGUgPSBiaXRjOjpUWVBFX0NPREVfRkxPQVQ7ICBicmVhazsKKyAgICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6IENvZGUgPSBiaXRjOjpUWVBFX0NPREVfRE9VQkxFOyBicmVhazsKKyAgICBjYXNlIFR5cGU6Olg4Nl9GUDgwVHlJRDogQ29kZSA9IGJpdGM6OlRZUEVfQ09ERV9YODZfRlA4MDsgYnJlYWs7CisgICAgY2FzZSBUeXBlOjpGUDEyOFR5SUQ6IENvZGUgPSBiaXRjOjpUWVBFX0NPREVfRlAxMjg7IGJyZWFrOworICAgIGNhc2UgVHlwZTo6UFBDX0ZQMTI4VHlJRDogQ29kZSA9IGJpdGM6OlRZUEVfQ09ERV9QUENfRlAxMjg7IGJyZWFrOworICAgIGNhc2UgVHlwZTo6TGFiZWxUeUlEOiAgQ29kZSA9IGJpdGM6OlRZUEVfQ09ERV9MQUJFTDsgIGJyZWFrOworICAgIGNhc2UgVHlwZTo6T3BhcXVlVHlJRDogQ29kZSA9IGJpdGM6OlRZUEVfQ09ERV9PUEFRVUU7IGJyZWFrOworICAgIGNhc2UgVHlwZTo6TWV0YWRhdGFUeUlEOiBDb2RlID0gYml0Yzo6VFlQRV9DT0RFX01FVEFEQVRBOyBicmVhazsKKyAgICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOgorICAgICAgLy8gSU5URUdFUjogW3dpZHRoXQorICAgICAgQ29kZSA9IGJpdGM6OlRZUEVfQ09ERV9JTlRFR0VSOworICAgICAgVHlwZVZhbHMucHVzaF9iYWNrKGNhc3Q8SW50ZWdlclR5cGU+KFQpLT5nZXRCaXRXaWR0aCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZTo6UG9pbnRlclR5SUQ6IHsKKyAgICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihUKTsKKyAgICAgIC8vIFBPSU5URVI6IFtwb2ludGVlIHR5cGUsIGFkZHJlc3Mgc3BhY2VdCisgICAgICBDb2RlID0gYml0Yzo6VFlQRV9DT0RFX1BPSU5URVI7CisgICAgICBUeXBlVmFscy5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKFBUeS0+Z2V0RWxlbWVudFR5cGUoKSkpOworICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlID0gUFR5LT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICAgIFR5cGVWYWxzLnB1c2hfYmFjayhBZGRyZXNzU3BhY2UpOworICAgICAgaWYgKEFkZHJlc3NTcGFjZSA9PSAwKSBBYmJyZXZUb1VzZSA9IFB0ckFiYnJldjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFR5cGU6OkZ1bmN0aW9uVHlJRDogeworICAgICAgY29uc3QgRnVuY3Rpb25UeXBlICpGVCA9IGNhc3Q8RnVuY3Rpb25UeXBlPihUKTsKKyAgICAgIC8vIEZVTkNUSU9OOiBbaXN2YXJhcmcsIGF0dHJpZCwgcmV0dHksIHBhcmFtdHkgeCBOXQorICAgICAgQ29kZSA9IGJpdGM6OlRZUEVfQ09ERV9GVU5DVElPTjsKKyAgICAgIFR5cGVWYWxzLnB1c2hfYmFjayhGVC0+aXNWYXJBcmcoKSk7CisgICAgICBUeXBlVmFscy5wdXNoX2JhY2soMCk7ICAvLyBGSVhNRTogREVBRDogcmVtb3ZlIGluIGxsdm0gMy4wCisgICAgICBUeXBlVmFscy5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKEZULT5nZXRSZXR1cm5UeXBlKCkpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVC0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBUeXBlVmFscy5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKEZULT5nZXRQYXJhbVR5cGUoaSkpKTsKKyAgICAgIEFiYnJldlRvVXNlID0gRnVuY3Rpb25BYmJyZXY7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUeXBlOjpTdHJ1Y3RUeUlEOiB7CisgICAgICBjb25zdCBTdHJ1Y3RUeXBlICpTVCA9IGNhc3Q8U3RydWN0VHlwZT4oVCk7CisgICAgICAvLyBTVFJVQ1Q6IFtpc3BhY2tlZCwgZWx0dHkgeCBOXQorICAgICAgQ29kZSA9IGJpdGM6OlRZUEVfQ09ERV9TVFJVQ1Q7CisgICAgICBUeXBlVmFscy5wdXNoX2JhY2soU1QtPmlzUGFja2VkKCkpOworICAgICAgLy8gT3V0cHV0IGFsbCBvZiB0aGUgZWxlbWVudCB0eXBlcy4KKyAgICAgIGZvciAoU3RydWN0VHlwZTo6ZWxlbWVudF9pdGVyYXRvciBJID0gU1QtPmVsZW1lbnRfYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IFNULT5lbGVtZW50X2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgVHlwZVZhbHMucHVzaF9iYWNrKFZFLmdldFR5cGVJRCgqSSkpOworICAgICAgQWJicmV2VG9Vc2UgPSBTdHJ1Y3RBYmJyZXY7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUeXBlOjpVbmlvblR5SUQ6IHsKKyAgICAgIGNvbnN0IFVuaW9uVHlwZSAqVVQgPSBjYXN0PFVuaW9uVHlwZT4oVCk7CisgICAgICAvLyBVTklPTjogW2VsdHR5IHggTl0KKyAgICAgIENvZGUgPSBiaXRjOjpUWVBFX0NPREVfVU5JT047CisgICAgICAvLyBPdXRwdXQgYWxsIG9mIHRoZSBlbGVtZW50IHR5cGVzLgorICAgICAgZm9yIChVbmlvblR5cGU6OmVsZW1lbnRfaXRlcmF0b3IgSSA9IFVULT5lbGVtZW50X2JlZ2luKCksCisgICAgICAgICAgIEUgPSBVVC0+ZWxlbWVudF9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgIFR5cGVWYWxzLnB1c2hfYmFjayhWRS5nZXRUeXBlSUQoKkkpKTsKKyAgICAgIEFiYnJldlRvVXNlID0gVW5pb25BYmJyZXY7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUeXBlOjpBcnJheVR5SUQ6IHsKKyAgICAgIGNvbnN0IEFycmF5VHlwZSAqQVQgPSBjYXN0PEFycmF5VHlwZT4oVCk7CisgICAgICAvLyBBUlJBWTogW251bWVsdHMsIGVsdHR5XQorICAgICAgQ29kZSA9IGJpdGM6OlRZUEVfQ09ERV9BUlJBWTsKKyAgICAgIFR5cGVWYWxzLnB1c2hfYmFjayhBVC0+Z2V0TnVtRWxlbWVudHMoKSk7CisgICAgICBUeXBlVmFscy5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKEFULT5nZXRFbGVtZW50VHlwZSgpKSk7CisgICAgICBBYmJyZXZUb1VzZSA9IEFycmF5QWJicmV2OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVHlwZTo6VmVjdG9yVHlJRDogeworICAgICAgY29uc3QgVmVjdG9yVHlwZSAqVlQgPSBjYXN0PFZlY3RvclR5cGU+KFQpOworICAgICAgLy8gVkVDVE9SIFtudW1lbHRzLCBlbHR0eV0KKyAgICAgIENvZGUgPSBiaXRjOjpUWVBFX0NPREVfVkVDVE9SOworICAgICAgVHlwZVZhbHMucHVzaF9iYWNrKFZULT5nZXROdW1FbGVtZW50cygpKTsKKyAgICAgIFR5cGVWYWxzLnB1c2hfYmFjayhWRS5nZXRUeXBlSUQoVlQtPmdldEVsZW1lbnRUeXBlKCkpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICAvLyBFbWl0IHRoZSBmaW5pc2hlZCByZWNvcmQuCisgICAgU3RyZWFtLkVtaXRSZWNvcmQoQ29kZSwgVHlwZVZhbHMsIEFiYnJldlRvVXNlKTsKKyAgICBUeXBlVmFscy5jbGVhcigpOworICB9CisKKyAgU3RyZWFtLkV4aXRCbG9jaygpOworfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0RW5jb2RlZExpbmthZ2UoY29uc3QgR2xvYmFsVmFsdWUgKkdWKSB7CisgIHN3aXRjaCAoR1YtPmdldExpbmthZ2UoKSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGxpbmthZ2UhIik7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZTogICAgICAgICAgICByZXR1cm4gMDsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6V2Vha0FueUxpbmthZ2U6ICAgICAgICAgICAgIHJldHVybiAxOworICBjYXNlIEdsb2JhbFZhbHVlOjpBcHBlbmRpbmdMaW5rYWdlOiAgICAgICAgICAgcmV0dXJuIDI7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZTogICAgICAgICAgICByZXR1cm4gMzsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua09uY2VBbnlMaW5rYWdlOiAgICAgICAgIHJldHVybiA0OworICBjYXNlIEdsb2JhbFZhbHVlOjpETExJbXBvcnRMaW5rYWdlOiAgICAgICAgICAgcmV0dXJuIDU7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkRMTEV4cG9ydExpbmthZ2U6ICAgICAgICAgICByZXR1cm4gNjsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxXZWFrTGlua2FnZTogICAgICAgIHJldHVybiA3OworICBjYXNlIEdsb2JhbFZhbHVlOjpDb21tb25MaW5rYWdlOiAgICAgICAgICAgICAgcmV0dXJuIDg7CisgIGNhc2UgR2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlOiAgICAgICAgICAgICByZXR1cm4gOTsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6V2Vha09EUkxpbmthZ2U6ICAgICAgICAgICAgIHJldHVybiAxMDsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua09uY2VPRFJMaW5rYWdlOiAgICAgICAgIHJldHVybiAxMTsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6QXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2U6IHJldHVybiAxMjsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua2VyUHJpdmF0ZUxpbmthZ2U6ICAgICAgIHJldHVybiAxMzsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua2VyUHJpdmF0ZVdlYWtMaW5rYWdlOiAgIHJldHVybiAxNDsKKyAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0RW5jb2RlZFZpc2liaWxpdHkoY29uc3QgR2xvYmFsVmFsdWUgKkdWKSB7CisgIHN3aXRjaCAoR1YtPmdldFZpc2liaWxpdHkoKSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHZpc2liaWxpdHkhIik7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkRlZmF1bHRWaXNpYmlsaXR5OiAgIHJldHVybiAwOworICBjYXNlIEdsb2JhbFZhbHVlOjpIaWRkZW5WaXNpYmlsaXR5OiAgICByZXR1cm4gMTsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6UHJvdGVjdGVkVmlzaWJpbGl0eTogcmV0dXJuIDI7CisgIH0KK30KKworLy8gRW1pdCB0b3AtbGV2ZWwgZGVzY3JpcHRpb24gb2YgbW9kdWxlLCBpbmNsdWRpbmcgdGFyZ2V0IHRyaXBsZSwgaW5saW5lIGFzbSwKKy8vIGRlc2NyaXB0b3JzIGZvciBnbG9iYWwgdmFyaWFibGVzLCBhbmQgZnVuY3Rpb24gcHJvdG90eXBlIGluZm8uCitzdGF0aWMgdm9pZCBXcml0ZU1vZHVsZUluZm8oY29uc3QgTW9kdWxlICpNLCBjb25zdCBWYWx1ZUVudW1lcmF0b3IgJlZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlciAmU3RyZWFtKSB7CisgIC8vIEVtaXQgdGhlIGxpc3Qgb2YgZGVwZW5kZW50IGxpYnJhcmllcyBmb3IgdGhlIE1vZHVsZS4KKyAgZm9yIChNb2R1bGU6OmxpYl9pdGVyYXRvciBJID0gTS0+bGliX2JlZ2luKCksIEUgPSBNLT5saWJfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIFdyaXRlU3RyaW5nUmVjb3JkKGJpdGM6Ok1PRFVMRV9DT0RFX0RFUExJQiwgKkksIDAvKlRPRE8qLywgU3RyZWFtKTsKKworICAvLyBFbWl0IHZhcmlvdXMgcGllY2VzIG9mIGRhdGEgYXR0YWNoZWQgdG8gYSBtb2R1bGUuCisgIGlmICghTS0+Z2V0VGFyZ2V0VHJpcGxlKCkuZW1wdHkoKSkKKyAgICBXcml0ZVN0cmluZ1JlY29yZChiaXRjOjpNT0RVTEVfQ09ERV9UUklQTEUsIE0tPmdldFRhcmdldFRyaXBsZSgpLAorICAgICAgICAgICAgICAgICAgICAgIDAvKlRPRE8qLywgU3RyZWFtKTsKKyAgaWYgKCFNLT5nZXREYXRhTGF5b3V0KCkuZW1wdHkoKSkKKyAgICBXcml0ZVN0cmluZ1JlY29yZChiaXRjOjpNT0RVTEVfQ09ERV9EQVRBTEFZT1VULCBNLT5nZXREYXRhTGF5b3V0KCksCisgICAgICAgICAgICAgICAgICAgICAgMC8qVE9ETyovLCBTdHJlYW0pOworICBpZiAoIU0tPmdldE1vZHVsZUlubGluZUFzbSgpLmVtcHR5KCkpCisgICAgV3JpdGVTdHJpbmdSZWNvcmQoYml0Yzo6TU9EVUxFX0NPREVfQVNNLCBNLT5nZXRNb2R1bGVJbmxpbmVBc20oKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLypUT0RPKi8sIFN0cmVhbSk7CisKKyAgLy8gRW1pdCBpbmZvcm1hdGlvbiBhYm91dCBzZWN0aW9ucyBhbmQgR0MsIGNvbXB1dGluZyBob3cgbWFueSB0aGVyZSBhcmUuIEFsc28KKyAgLy8gY29tcHV0ZSB0aGUgbWF4aW11bSBhbGlnbm1lbnQgdmFsdWUuCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB1bnNpZ25lZD4gU2VjdGlvbk1hcDsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHVuc2lnbmVkPiBHQ01hcDsKKyAgdW5zaWduZWQgTWF4QWxpZ25tZW50ID0gMDsKKyAgdW5zaWduZWQgTWF4R2xvYmFsVHlwZSA9IDA7CisgIGZvciAoTW9kdWxlOjpjb25zdF9nbG9iYWxfaXRlcmF0b3IgR1YgPSBNLT5nbG9iYWxfYmVnaW4oKSxFID0gTS0+Z2xvYmFsX2VuZCgpOworICAgICAgIEdWICE9IEU7ICsrR1YpIHsKKyAgICBNYXhBbGlnbm1lbnQgPSBzdGQ6Om1heChNYXhBbGlnbm1lbnQsIEdWLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgTWF4R2xvYmFsVHlwZSA9IHN0ZDo6bWF4KE1heEdsb2JhbFR5cGUsIFZFLmdldFR5cGVJRChHVi0+Z2V0VHlwZSgpKSk7CisKKyAgICBpZiAoIUdWLT5oYXNTZWN0aW9uKCkpIGNvbnRpbnVlOworICAgIC8vIEdpdmUgc2VjdGlvbiBuYW1lcyB1bmlxdWUgSUQncy4KKyAgICB1bnNpZ25lZCAmRW50cnkgPSBTZWN0aW9uTWFwW0dWLT5nZXRTZWN0aW9uKCldOworICAgIGlmIChFbnRyeSAhPSAwKSBjb250aW51ZTsKKyAgICBXcml0ZVN0cmluZ1JlY29yZChiaXRjOjpNT0RVTEVfQ09ERV9TRUNUSU9OTkFNRSwgR1YtPmdldFNlY3Rpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLypUT0RPKi8sIFN0cmVhbSk7CisgICAgRW50cnkgPSBTZWN0aW9uTWFwLnNpemUoKTsKKyAgfQorICBmb3IgKE1vZHVsZTo6Y29uc3RfaXRlcmF0b3IgRiA9IE0tPmJlZ2luKCksIEUgPSBNLT5lbmQoKTsgRiAhPSBFOyArK0YpIHsKKyAgICBNYXhBbGlnbm1lbnQgPSBzdGQ6Om1heChNYXhBbGlnbm1lbnQsIEYtPmdldEFsaWdubWVudCgpKTsKKyAgICBpZiAoRi0+aGFzU2VjdGlvbigpKSB7CisgICAgICAvLyBHaXZlIHNlY3Rpb24gbmFtZXMgdW5pcXVlIElEJ3MuCisgICAgICB1bnNpZ25lZCAmRW50cnkgPSBTZWN0aW9uTWFwW0YtPmdldFNlY3Rpb24oKV07CisgICAgICBpZiAoIUVudHJ5KSB7CisgICAgICAgIFdyaXRlU3RyaW5nUmVjb3JkKGJpdGM6Ok1PRFVMRV9DT0RFX1NFQ1RJT05OQU1FLCBGLT5nZXRTZWN0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAvKlRPRE8qLywgU3RyZWFtKTsKKyAgICAgICAgRW50cnkgPSBTZWN0aW9uTWFwLnNpemUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKEYtPmhhc0dDKCkpIHsKKyAgICAgIC8vIFNhbWUgZm9yIEdDIG5hbWVzLgorICAgICAgdW5zaWduZWQgJkVudHJ5ID0gR0NNYXBbRi0+Z2V0R0MoKV07CisgICAgICBpZiAoIUVudHJ5KSB7CisgICAgICAgIFdyaXRlU3RyaW5nUmVjb3JkKGJpdGM6Ok1PRFVMRV9DT0RFX0dDTkFNRSwgRi0+Z2V0R0MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC8qVE9ETyovLCBTdHJlYW0pOworICAgICAgICBFbnRyeSA9IEdDTWFwLnNpemUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBFbWl0IGFiYnJldiBmb3IgZ2xvYmFscywgbm93IHRoYXQgd2Uga25vdyAjIHNlY3Rpb25zIGFuZCBtYXggYWxpZ25tZW50LgorICB1bnNpZ25lZCBTaW1wbGVHVmFyQWJicmV2ID0gMDsKKyAgaWYgKCFNLT5nbG9iYWxfZW1wdHkoKSkgeworICAgIC8vIEFkZCBhbiBhYmJyZXYgZm9yIGNvbW1vbiBnbG9iYWxzIHdpdGggbm8gdmlzaWJpbGl0eSBvciB0aHJlYWQgbG9jYWxuZXNzLgorICAgIEJpdENvZGVBYmJyZXYgKkFiYnYgPSBuZXcgQml0Q29kZUFiYnJldigpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6TU9EVUxFX0NPREVfR0xPQkFMVkFSKSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nMl8zMl9DZWlsKE1heEdsb2JhbFR5cGUrMSkpKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDEpKTsgICAgICAvLyBDb25zdGFudC4KKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6VkJSLCA2KSk7ICAgICAgICAvLyBJbml0aWFsaXplci4KKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDQpKTsgICAgICAvLyBMaW5rYWdlLgorICAgIGlmIChNYXhBbGlnbm1lbnQgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsaWdubWVudC4KKyAgICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoMCkpOworICAgIGVsc2UgeworICAgICAgdW5zaWduZWQgTWF4RW5jQWxpZ25tZW50ID0gTG9nMl8zMihNYXhBbGlnbm1lbnQpKzE7CisgICAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nMl8zMl9DZWlsKE1heEVuY0FsaWdubWVudCsxKSkpOworICAgIH0KKyAgICBpZiAoU2VjdGlvbk1hcC5lbXB0eSgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlY3Rpb24uCisgICAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKDApKTsKKyAgICBlbHNlCisgICAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nMl8zMl9DZWlsKFNlY3Rpb25NYXAuc2l6ZSgpKzEpKSk7CisgICAgLy8gRG9uJ3QgYm90aGVyIGVtaXR0aW5nIHZpcyArIHRocmVhZCBsb2NhbC4KKyAgICBTaW1wbGVHVmFyQWJicmV2ID0gU3RyZWFtLkVtaXRBYmJyZXYoQWJidik7CisgIH0KKworICAvLyBFbWl0IHRoZSBnbG9iYWwgdmFyaWFibGUgaW5mb3JtYXRpb24uCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA2ND4gVmFsczsKKyAgZm9yIChNb2R1bGU6OmNvbnN0X2dsb2JhbF9pdGVyYXRvciBHViA9IE0tPmdsb2JhbF9iZWdpbigpLEUgPSBNLT5nbG9iYWxfZW5kKCk7CisgICAgICAgR1YgIT0gRTsgKytHVikgeworICAgIHVuc2lnbmVkIEFiYnJldlRvVXNlID0gMDsKKworICAgIC8vIEdMT0JBTFZBUjogW3R5cGUsIGlzY29uc3QsIGluaXRpZCwKKyAgICAvLyAgICAgICAgICAgICBsaW5rYWdlLCBhbGlnbm1lbnQsIHNlY3Rpb24sIHZpc2liaWxpdHksIHRocmVhZGxvY2FsXQorICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFR5cGVJRChHVi0+Z2V0VHlwZSgpKSk7CisgICAgVmFscy5wdXNoX2JhY2soR1YtPmlzQ29uc3RhbnQoKSk7CisgICAgVmFscy5wdXNoX2JhY2soR1YtPmlzRGVjbGFyYXRpb24oKSA/IDAgOgorICAgICAgICAgICAgICAgICAgIChWRS5nZXRWYWx1ZUlEKEdWLT5nZXRJbml0aWFsaXplcigpKSArIDEpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhnZXRFbmNvZGVkTGlua2FnZShHVikpOworICAgIFZhbHMucHVzaF9iYWNrKExvZzJfMzIoR1YtPmdldEFsaWdubWVudCgpKSsxKTsKKyAgICBWYWxzLnB1c2hfYmFjayhHVi0+aGFzU2VjdGlvbigpID8gU2VjdGlvbk1hcFtHVi0+Z2V0U2VjdGlvbigpXSA6IDApOworICAgIGlmIChHVi0+aXNUaHJlYWRMb2NhbCgpIHx8CisgICAgICAgIEdWLT5nZXRWaXNpYmlsaXR5KCkgIT0gR2xvYmFsVmFsdWU6OkRlZmF1bHRWaXNpYmlsaXR5KSB7CisgICAgICBWYWxzLnB1c2hfYmFjayhnZXRFbmNvZGVkVmlzaWJpbGl0eShHVikpOworICAgICAgVmFscy5wdXNoX2JhY2soR1YtPmlzVGhyZWFkTG9jYWwoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFiYnJldlRvVXNlID0gU2ltcGxlR1ZhckFiYnJldjsKKyAgICB9CisKKyAgICBTdHJlYW0uRW1pdFJlY29yZChiaXRjOjpNT0RVTEVfQ09ERV9HTE9CQUxWQVIsIFZhbHMsIEFiYnJldlRvVXNlKTsKKyAgICBWYWxzLmNsZWFyKCk7CisgIH0KKworICAvLyBFbWl0IHRoZSBmdW5jdGlvbiBwcm90byBpbmZvcm1hdGlvbi4KKyAgZm9yIChNb2R1bGU6OmNvbnN0X2l0ZXJhdG9yIEYgPSBNLT5iZWdpbigpLCBFID0gTS0+ZW5kKCk7IEYgIT0gRTsgKytGKSB7CisgICAgLy8gRlVOQ1RJT046ICBbdHlwZSwgY2FsbGluZ2NvbnYsIGlzcHJvdG8sIHBhcmFtYXR0ciwKKyAgICAvLyAgICAgICAgICAgICBsaW5rYWdlLCBhbGlnbm1lbnQsIHNlY3Rpb24sIHZpc2liaWxpdHksIGdjXQorICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFR5cGVJRChGLT5nZXRUeXBlKCkpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhGLT5nZXRDYWxsaW5nQ29udigpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhGLT5pc0RlY2xhcmF0aW9uKCkpOworICAgIFZhbHMucHVzaF9iYWNrKGdldEVuY29kZWRMaW5rYWdlKEYpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRBdHRyaWJ1dGVJRChGLT5nZXRBdHRyaWJ1dGVzKCkpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhMb2cyXzMyKEYtPmdldEFsaWdubWVudCgpKSsxKTsKKyAgICBWYWxzLnB1c2hfYmFjayhGLT5oYXNTZWN0aW9uKCkgPyBTZWN0aW9uTWFwW0YtPmdldFNlY3Rpb24oKV0gOiAwKTsKKyAgICBWYWxzLnB1c2hfYmFjayhnZXRFbmNvZGVkVmlzaWJpbGl0eShGKSk7CisgICAgVmFscy5wdXNoX2JhY2soRi0+aGFzR0MoKSA/IEdDTWFwW0YtPmdldEdDKCldIDogMCk7CisKKyAgICB1bnNpZ25lZCBBYmJyZXZUb1VzZSA9IDA7CisgICAgU3RyZWFtLkVtaXRSZWNvcmQoYml0Yzo6TU9EVUxFX0NPREVfRlVOQ1RJT04sIFZhbHMsIEFiYnJldlRvVXNlKTsKKyAgICBWYWxzLmNsZWFyKCk7CisgIH0KKworCisgIC8vIEVtaXQgdGhlIGFsaWFzIGluZm9ybWF0aW9uLgorICBmb3IgKE1vZHVsZTo6Y29uc3RfYWxpYXNfaXRlcmF0b3IgQUkgPSBNLT5hbGlhc19iZWdpbigpLCBFID0gTS0+YWxpYXNfZW5kKCk7CisgICAgICAgQUkgIT0gRTsgKytBSSkgeworICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFR5cGVJRChBSS0+Z2V0VHlwZSgpKSk7CisgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChBSS0+Z2V0QWxpYXNlZSgpKSk7CisgICAgVmFscy5wdXNoX2JhY2soZ2V0RW5jb2RlZExpbmthZ2UoQUkpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhnZXRFbmNvZGVkVmlzaWJpbGl0eShBSSkpOworICAgIHVuc2lnbmVkIEFiYnJldlRvVXNlID0gMDsKKyAgICBTdHJlYW0uRW1pdFJlY29yZChiaXRjOjpNT0RVTEVfQ09ERV9BTElBUywgVmFscywgQWJicmV2VG9Vc2UpOworICAgIFZhbHMuY2xlYXIoKTsKKyAgfQorfQorCitzdGF0aWMgdWludDY0X3QgR2V0T3B0aW1pemF0aW9uRmxhZ3MoY29uc3QgVmFsdWUgKlYpIHsKKyAgdWludDY0X3QgRmxhZ3MgPSAwOworCisgIGlmIChjb25zdCBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yICpPQk8gPQorICAgICAgICBkeW5fY2FzdDxPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yPihWKSkgeworICAgIGlmIChPQk8tPmhhc05vU2lnbmVkV3JhcCgpKQorICAgICAgRmxhZ3MgfD0gMSA8PCBiaXRjOjpPQk9fTk9fU0lHTkVEX1dSQVA7CisgICAgaWYgKE9CTy0+aGFzTm9VbnNpZ25lZFdyYXAoKSkKKyAgICAgIEZsYWdzIHw9IDEgPDwgYml0Yzo6T0JPX05PX1VOU0lHTkVEX1dSQVA7CisgIH0gZWxzZSBpZiAoY29uc3QgU0Rpdk9wZXJhdG9yICpEaXYgPSBkeW5fY2FzdDxTRGl2T3BlcmF0b3I+KFYpKSB7CisgICAgaWYgKERpdi0+aXNFeGFjdCgpKQorICAgICAgRmxhZ3MgfD0gMSA8PCBiaXRjOjpTRElWX0VYQUNUOworICB9CisKKyAgcmV0dXJuIEZsYWdzOworfQorCitzdGF0aWMgdm9pZCBXcml0ZU1ETm9kZShjb25zdCBNRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZUVudW1lcmF0b3IgJlZFLAorICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVyICZTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+ICZSZWNvcmQpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKE4tPmdldE9wZXJhbmQoaSkpIHsKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKE4tPmdldE9wZXJhbmQoaSktPmdldFR5cGUoKSkpOworICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKE4tPmdldE9wZXJhbmQoaSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRUeXBlSUQoVHlwZTo6Z2V0Vm9pZFR5KE4tPmdldENvbnRleHQoKSkpKTsKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soMCk7CisgICAgfQorICB9CisgIHVuc2lnbmVkIE1EQ29kZSA9IE4tPmlzRnVuY3Rpb25Mb2NhbCgpID8gYml0Yzo6TUVUQURBVEFfRk5fTk9ERSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0Yzo6TUVUQURBVEFfTk9ERTsKKyAgU3RyZWFtLkVtaXRSZWNvcmQoTURDb2RlLCBSZWNvcmQsIDApOworICBSZWNvcmQuY2xlYXIoKTsKK30KKworc3RhdGljIHZvaWQgV3JpdGVNb2R1bGVNZXRhZGF0YShjb25zdCBNb2R1bGUgKk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlRW51bWVyYXRvciAmVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlciAmU3RyZWFtKSB7CisgIGNvbnN0IFZhbHVlRW51bWVyYXRvcjo6VmFsdWVMaXN0ICZWYWxzID0gVkUuZ2V0TURWYWx1ZXMoKTsKKyAgYm9vbCBTdGFydGVkTWV0YWRhdGFCbG9jayA9IGZhbHNlOworICB1bnNpZ25lZCBNRFNBYmJyZXYgPSAwOworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+IFJlY29yZDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworCisgICAgaWYgKGNvbnN0IE1ETm9kZSAqTiA9IGR5bl9jYXN0PE1ETm9kZT4oVmFsc1tpXS5maXJzdCkpIHsKKyAgICAgIGlmICghTi0+aXNGdW5jdGlvbkxvY2FsKCkgfHwgIU4tPmdldEZ1bmN0aW9uKCkpIHsKKyAgICAgICAgaWYgKCFTdGFydGVkTWV0YWRhdGFCbG9jaykgeworICAgICAgICAgIFN0cmVhbS5FbnRlclN1YmJsb2NrKGJpdGM6Ok1FVEFEQVRBX0JMT0NLX0lELCAzKTsKKyAgICAgICAgICBTdGFydGVkTWV0YWRhdGFCbG9jayA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgV3JpdGVNRE5vZGUoTiwgVkUsIFN0cmVhbSwgUmVjb3JkKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvbnN0IE1EU3RyaW5nICpNRFMgPSBkeW5fY2FzdDxNRFN0cmluZz4oVmFsc1tpXS5maXJzdCkpIHsKKyAgICAgIGlmICghU3RhcnRlZE1ldGFkYXRhQmxvY2spICB7CisgICAgICAgIFN0cmVhbS5FbnRlclN1YmJsb2NrKGJpdGM6Ok1FVEFEQVRBX0JMT0NLX0lELCAzKTsKKworICAgICAgICAvLyBBYmJyZXYgZm9yIE1FVEFEQVRBX1NUUklORy4KKyAgICAgICAgQml0Q29kZUFiYnJldiAqQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgICAgICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6TUVUQURBVEFfU1RSSU5HKSk7CisgICAgICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpBcnJheSkpOworICAgICAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDgpKTsKKyAgICAgICAgTURTQWJicmV2ID0gU3RyZWFtLkVtaXRBYmJyZXYoQWJidik7CisgICAgICAgIFN0YXJ0ZWRNZXRhZGF0YUJsb2NrID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gQ29kZTogW3N0cmNoYXIgeCBOXQorICAgICAgUmVjb3JkLmFwcGVuZChNRFMtPmJlZ2luKCksIE1EUy0+ZW5kKCkpOworCisgICAgICAvLyBFbWl0IHRoZSBmaW5pc2hlZCByZWNvcmQuCisgICAgICBTdHJlYW0uRW1pdFJlY29yZChiaXRjOjpNRVRBREFUQV9TVFJJTkcsIFJlY29yZCwgTURTQWJicmV2KTsKKyAgICAgIFJlY29yZC5jbGVhcigpOworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlIG5hbWVkIG1ldGFkYXRhLgorICBmb3IgKE1vZHVsZTo6Y29uc3RfbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3IgSSA9IE0tPm5hbWVkX21ldGFkYXRhX2JlZ2luKCksCisgICAgICAgRSA9IE0tPm5hbWVkX21ldGFkYXRhX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IE5hbWVkTUROb2RlICpOTUQgPSBJOworICAgIGlmICghU3RhcnRlZE1ldGFkYXRhQmxvY2spICB7CisgICAgICBTdHJlYW0uRW50ZXJTdWJibG9jayhiaXRjOjpNRVRBREFUQV9CTE9DS19JRCwgMyk7CisgICAgICBTdGFydGVkTWV0YWRhdGFCbG9jayA9IHRydWU7CisgICAgfQorCisgICAgLy8gV3JpdGUgbmFtZS4KKyAgICBTdHJpbmdSZWYgU3RyID0gTk1ELT5nZXROYW1lKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN0ci5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgUmVjb3JkLnB1c2hfYmFjayhTdHJbaV0pOworICAgIFN0cmVhbS5FbWl0UmVjb3JkKGJpdGM6Ok1FVEFEQVRBX05BTUUsIFJlY29yZCwgMC8qVE9ETyovKTsKKyAgICBSZWNvcmQuY2xlYXIoKTsKKworICAgIC8vIFdyaXRlIG5hbWVkIG1ldGFkYXRhIG9wZXJhbmRzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOTUQtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKE5NRC0+Z2V0T3BlcmFuZChpKSkpOworICAgIFN0cmVhbS5FbWl0UmVjb3JkKGJpdGM6Ok1FVEFEQVRBX05BTUVEX05PREUsIFJlY29yZCwgMCk7CisgICAgUmVjb3JkLmNsZWFyKCk7CisgIH0KKworICBpZiAoU3RhcnRlZE1ldGFkYXRhQmxvY2spCisgICAgU3RyZWFtLkV4aXRCbG9jaygpOworfQorCitzdGF0aWMgdm9pZCBXcml0ZUZ1bmN0aW9uTG9jYWxNZXRhZGF0YShjb25zdCBGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlRW51bWVyYXRvciAmVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZXIgJlN0cmVhbSkgeworICBib29sIFN0YXJ0ZWRNZXRhZGF0YUJsb2NrID0gZmFsc2U7CisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA2ND4gUmVjb3JkOworICBjb25zdCBTbWFsbFZlY3Rvcjxjb25zdCBNRE5vZGUgKiwgOD4gJlZhbHMgPSBWRS5nZXRGdW5jdGlvbkxvY2FsTURWYWx1ZXMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoY29uc3QgTUROb2RlICpOID0gVmFsc1tpXSkKKyAgICAgIGlmIChOLT5pc0Z1bmN0aW9uTG9jYWwoKSAmJiBOLT5nZXRGdW5jdGlvbigpID09ICZGKSB7CisgICAgICAgIGlmICghU3RhcnRlZE1ldGFkYXRhQmxvY2spIHsKKyAgICAgICAgICBTdHJlYW0uRW50ZXJTdWJibG9jayhiaXRjOjpNRVRBREFUQV9CTE9DS19JRCwgMyk7CisgICAgICAgICAgU3RhcnRlZE1ldGFkYXRhQmxvY2sgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIFdyaXRlTUROb2RlKE4sIFZFLCBTdHJlYW0sIFJlY29yZCk7CisgICAgICB9CisgICAgICAKKyAgaWYgKFN0YXJ0ZWRNZXRhZGF0YUJsb2NrKQorICAgIFN0cmVhbS5FeGl0QmxvY2soKTsKK30KKworc3RhdGljIHZvaWQgV3JpdGVNZXRhZGF0YUF0dGFjaG1lbnQoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZUVudW1lcmF0b3IgJlZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVyICZTdHJlYW0pIHsKKyAgU3RyZWFtLkVudGVyU3ViYmxvY2soYml0Yzo6TUVUQURBVEFfQVRUQUNITUVOVF9JRCwgMyk7CisKKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDY0PiBSZWNvcmQ7CisKKyAgLy8gV3JpdGUgbWV0YWRhdGEgYXR0YWNobWVudHMKKyAgLy8gTUVUQURBVEFfQVRUQUNITUVOVCAtIFttIHggW3ZhbHVlLCBbbiB4IFtpZCwgbWRub2RlXV1dCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTUROb2RlKj4sIDQ+IE1EczsKKyAgCisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEJCID0gRi5iZWdpbigpLCBFID0gRi5lbmQoKTsgQkIgIT0gRTsgKytCQikKKyAgICBmb3IgKEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBNRHMuY2xlYXIoKTsKKyAgICAgIEktPmdldEFsbE1ldGFkYXRhT3RoZXJUaGFuRGVidWdMb2MoTURzKTsKKyAgICAgIAorICAgICAgLy8gSWYgbm8gbWV0YWRhdGEsIGlnbm9yZSBpbnN0cnVjdGlvbi4KKyAgICAgIGlmIChNRHMuZW1wdHkoKSkgY29udGludWU7CisKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0SW5zdHJ1Y3Rpb25JRChJKSk7CisgICAgICAKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNRHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKE1Ec1tpXS5maXJzdCk7CisgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChNRHNbaV0uc2Vjb25kKSk7CisgICAgICB9CisgICAgICBTdHJlYW0uRW1pdFJlY29yZChiaXRjOjpNRVRBREFUQV9BVFRBQ0hNRU5ULCBSZWNvcmQsIDApOworICAgICAgUmVjb3JkLmNsZWFyKCk7CisgICAgfQorCisgIFN0cmVhbS5FeGl0QmxvY2soKTsKK30KKworc3RhdGljIHZvaWQgV3JpdGVNb2R1bGVNZXRhZGF0YVN0b3JlKGNvbnN0IE1vZHVsZSAqTSwgQml0c3RyZWFtV3JpdGVyICZTdHJlYW0pIHsKKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDY0PiBSZWNvcmQ7CisKKyAgLy8gV3JpdGUgbWV0YWRhdGEga2luZHMKKyAgLy8gTUVUQURBVEFfS0lORCAtIFtuIHggW2lkLCBuYW1lXV0KKyAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCA0PiBOYW1lczsKKyAgTS0+Z2V0TURLaW5kTmFtZXMoTmFtZXMpOworICAKKyAgaWYgKE5hbWVzLmVtcHR5KCkpIHJldHVybjsKKworICBTdHJlYW0uRW50ZXJTdWJibG9jayhiaXRjOjpNRVRBREFUQV9CTE9DS19JRCwgMyk7CisgIAorICBmb3IgKHVuc2lnbmVkIE1ES2luZElEID0gMCwgZSA9IE5hbWVzLnNpemUoKTsgTURLaW5kSUQgIT0gZTsgKytNREtpbmRJRCkgeworICAgIFJlY29yZC5wdXNoX2JhY2soTURLaW5kSUQpOworICAgIFN0cmluZ1JlZiBLTmFtZSA9IE5hbWVzW01ES2luZElEXTsKKyAgICBSZWNvcmQuYXBwZW5kKEtOYW1lLmJlZ2luKCksIEtOYW1lLmVuZCgpKTsKKyAgICAKKyAgICBTdHJlYW0uRW1pdFJlY29yZChiaXRjOjpNRVRBREFUQV9LSU5ELCBSZWNvcmQsIDApOworICAgIFJlY29yZC5jbGVhcigpOworICB9CisKKyAgU3RyZWFtLkV4aXRCbG9jaygpOworfQorCitzdGF0aWMgdm9pZCBXcml0ZUNvbnN0YW50cyh1bnNpZ25lZCBGaXJzdFZhbCwgdW5zaWduZWQgTGFzdFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlRW51bWVyYXRvciAmVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZXIgJlN0cmVhbSwgYm9vbCBpc0dsb2JhbCkgeworICBpZiAoRmlyc3RWYWwgPT0gTGFzdFZhbCkgcmV0dXJuOworCisgIFN0cmVhbS5FbnRlclN1YmJsb2NrKGJpdGM6OkNPTlNUQU5UU19CTE9DS19JRCwgNCk7CisKKyAgdW5zaWduZWQgQWdncmVnYXRlQWJicmV2ID0gMDsKKyAgdW5zaWduZWQgU3RyaW5nOEFiYnJldiA9IDA7CisgIHVuc2lnbmVkIENTdHJpbmc3QWJicmV2ID0gMDsKKyAgdW5zaWduZWQgQ1N0cmluZzZBYmJyZXYgPSAwOworICAvLyBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcG9vbCBmb3IgdGhlIG1vZHVsZSwgZW1pdCBtb2R1bGUtc3BlY2lmaWMgYWJicmV2cy4KKyAgaWYgKGlzR2xvYmFsKSB7CisgICAgLy8gQWJicmV2IGZvciBDU1RfQ09ERV9BR0dSRUdBVEUuCisgICAgQml0Q29kZUFiYnJldiAqQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChiaXRjOjpDU1RfQ09ERV9BR0dSRUdBVEUpKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6QXJyYXkpKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIExvZzJfMzJfQ2VpbChMYXN0VmFsKzEpKSk7CisgICAgQWdncmVnYXRlQWJicmV2ID0gU3RyZWFtLkVtaXRBYmJyZXYoQWJidik7CisKKyAgICAvLyBBYmJyZXYgZm9yIENTVF9DT0RFX1NUUklORy4KKyAgICBBYmJ2ID0gbmV3IEJpdENvZGVBYmJyZXYoKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKGJpdGM6OkNTVF9DT0RFX1NUUklORykpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpBcnJheSkpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpGaXhlZCwgOCkpOworICAgIFN0cmluZzhBYmJyZXYgPSBTdHJlYW0uRW1pdEFiYnJldihBYmJ2KTsKKyAgICAvLyBBYmJyZXYgZm9yIENTVF9DT0RFX0NTVFJJTkcuCisgICAgQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChiaXRjOjpDU1RfQ09ERV9DU1RSSU5HKSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkFycmF5KSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLCA3KSk7CisgICAgQ1N0cmluZzdBYmJyZXYgPSBTdHJlYW0uRW1pdEFiYnJldihBYmJ2KTsKKyAgICAvLyBBYmJyZXYgZm9yIENTVF9DT0RFX0NTVFJJTkcuCisgICAgQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChiaXRjOjpDU1RfQ09ERV9DU1RSSU5HKSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkFycmF5KSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkNoYXI2KSk7CisgICAgQ1N0cmluZzZBYmJyZXYgPSBTdHJlYW0uRW1pdEFiYnJldihBYmJ2KTsKKyAgfQorCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA2ND4gUmVjb3JkOworCisgIGNvbnN0IFZhbHVlRW51bWVyYXRvcjo6VmFsdWVMaXN0ICZWYWxzID0gVkUuZ2V0VmFsdWVzKCk7CisgIGNvbnN0IFR5cGUgKkxhc3RUeSA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IEZpcnN0VmFsOyBpICE9IExhc3RWYWw7ICsraSkgeworICAgIGNvbnN0IFZhbHVlICpWID0gVmFsc1tpXS5maXJzdDsKKyAgICAvLyBJZiB3ZSBuZWVkIHRvIHN3aXRjaCB0eXBlcywgZG8gc28gbm93LgorICAgIGlmIChWLT5nZXRUeXBlKCkgIT0gTGFzdFR5KSB7CisgICAgICBMYXN0VHkgPSBWLT5nZXRUeXBlKCk7CisgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFR5cGVJRChMYXN0VHkpKTsKKyAgICAgIFN0cmVhbS5FbWl0UmVjb3JkKGJpdGM6OkNTVF9DT0RFX1NFVFRZUEUsIFJlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUQU5UU19TRVRUWVBFX0FCQlJFVik7CisgICAgICBSZWNvcmQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAoY29uc3QgSW5saW5lQXNtICpJQSA9IGR5bl9jYXN0PElubGluZUFzbT4oVikpIHsKKyAgICAgIFJlY29yZC5wdXNoX2JhY2sodW5zaWduZWQoSUEtPmhhc1NpZGVFZmZlY3RzKCkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQoSUEtPmlzQWxpZ25TdGFjaygpKSA8PCAxKTsKKworICAgICAgLy8gQWRkIHRoZSBhc20gc3RyaW5nLgorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkFzbVN0ciA9IElBLT5nZXRBc21TdHJpbmcoKTsKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soQXNtU3RyLnNpemUoKSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXNtU3RyLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIFJlY29yZC5wdXNoX2JhY2soQXNtU3RyW2ldKTsKKworICAgICAgLy8gQWRkIHRoZSBjb25zdHJhaW50IHN0cmluZy4KKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50U3RyID0gSUEtPmdldENvbnN0cmFpbnRTdHJpbmcoKTsKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soQ29uc3RyYWludFN0ci5zaXplKCkpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvbnN0cmFpbnRTdHIuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgUmVjb3JkLnB1c2hfYmFjayhDb25zdHJhaW50U3RyW2ldKTsKKyAgICAgIFN0cmVhbS5FbWl0UmVjb3JkKGJpdGM6OkNTVF9DT0RFX0lOTElORUFTTSwgUmVjb3JkKTsKKyAgICAgIFJlY29yZC5jbGVhcigpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGNvbnN0IENvbnN0YW50ICpDID0gY2FzdDxDb25zdGFudD4oVik7CisgICAgdW5zaWduZWQgQ29kZSA9IC0xVTsKKyAgICB1bnNpZ25lZCBBYmJyZXZUb1VzZSA9IDA7CisgICAgaWYgKEMtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgIENvZGUgPSBiaXRjOjpDU1RfQ09ERV9OVUxMOworICAgIH0gZWxzZSBpZiAoaXNhPFVuZGVmVmFsdWU+KEMpKSB7CisgICAgICBDb2RlID0gYml0Yzo6Q1NUX0NPREVfVU5ERUY7CisgICAgfSBlbHNlIGlmIChjb25zdCBDb25zdGFudEludCAqSVYgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQykpIHsKKyAgICAgIGlmIChJVi0+Z2V0Qml0V2lkdGgoKSA8PSA2NCkgeworICAgICAgICB1aW50NjRfdCBWID0gSVYtPmdldFNFeHRWYWx1ZSgpOworICAgICAgICBpZiAoKGludDY0X3QpViA+PSAwKQorICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soViA8PCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soKC1WIDw8IDEpIHwgMSk7CisgICAgICAgIENvZGUgPSBiaXRjOjpDU1RfQ09ERV9JTlRFR0VSOworICAgICAgICBBYmJyZXZUb1VzZSA9IENPTlNUQU5UU19JTlRFR0VSX0FCQlJFVjsKKyAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWRlIGludGVnZXJzLCA+IDY0IGJpdHMgaW4gc2l6ZS4KKyAgICAgICAgLy8gV2UgaGF2ZSBhbiBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXIgdmFsdWUgdG8gd3JpdGUgd2hvc2UKKyAgICAgICAgLy8gYml0IHdpZHRoIGlzID4gNjQuIEhvd2V2ZXIsIGluIGNhbm9uaWNhbCB1bnNpZ25lZCBpbnRlZ2VyCisgICAgICAgIC8vIGZvcm1hdCBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgaGlnaCBiaXRzIGFyZSBnb2luZyB0byBiZSB6ZXJvLgorICAgICAgICAvLyBTbywgd2Ugb25seSB3cml0ZSB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB3b3Jkcy4KKyAgICAgICAgdW5zaWduZWQgTldvcmRzID0gSVYtPmdldFZhbHVlKCkuZ2V0QWN0aXZlV29yZHMoKTsKKyAgICAgICAgY29uc3QgdWludDY0X3QgKlJhd1dvcmRzID0gSVYtPmdldFZhbHVlKCkuZ2V0UmF3RGF0YSgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE5Xb3JkczsgKytpKSB7CisgICAgICAgICAgaW50NjRfdCBWID0gUmF3V29yZHNbaV07CisgICAgICAgICAgaWYgKFYgPj0gMCkKKyAgICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soViA8PCAxKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBSZWNvcmQucHVzaF9iYWNrKCgtViA8PCAxKSB8IDEpOworICAgICAgICB9CisgICAgICAgIENvZGUgPSBiaXRjOjpDU1RfQ09ERV9XSURFX0lOVEVHRVI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25zdCBDb25zdGFudEZQICpDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQPihDKSkgeworICAgICAgQ29kZSA9IGJpdGM6OkNTVF9DT0RFX0ZMT0FUOworICAgICAgY29uc3QgVHlwZSAqVHkgPSBDRlAtPmdldFR5cGUoKTsKKyAgICAgIGlmIChUeS0+aXNGbG9hdFR5KCkgfHwgVHktPmlzRG91YmxlVHkoKSkgeworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKENGUC0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpLmdldFpFeHRWYWx1ZSgpKTsKKyAgICAgIH0gZWxzZSBpZiAoVHktPmlzWDg2X0ZQODBUeSgpKSB7CisgICAgICAgIC8vIGFwaSBuZWVkZWQgdG8gcHJldmVudCBwcmVtYXR1cmUgZGVzdHJ1Y3Rpb24KKyAgICAgICAgLy8gYml0cyBhcmUgbm90IGluIHRoZSBzYW1lIG9yZGVyIGFzIGEgbm9ybWFsIGk4MCBBUEludCwgY29tcGVuc2F0ZS4KKyAgICAgICAgQVBJbnQgYXBpID0gQ0ZQLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCk7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90ICpwID0gYXBpLmdldFJhd0RhdGEoKTsKKyAgICAgICAgUmVjb3JkLnB1c2hfYmFjaygocFsxXSA8PCA0OCkgfCAocFswXSA+PiAxNikpOworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKHBbMF0gJiAweGZmZmZMTCk7CisgICAgICB9IGVsc2UgaWYgKFR5LT5pc0ZQMTI4VHkoKSB8fCBUeS0+aXNQUENfRlAxMjhUeSgpKSB7CisgICAgICAgIEFQSW50IGFwaSA9IENGUC0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpOworICAgICAgICBjb25zdCB1aW50NjRfdCAqcCA9IGFwaS5nZXRSYXdEYXRhKCk7CisgICAgICAgIFJlY29yZC5wdXNoX2JhY2socFswXSk7CisgICAgICAgIFJlY29yZC5wdXNoX2JhY2socFsxXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQgKDAgJiYgIlVua25vd24gRlAgdHlwZSEiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudEFycmF5PihDKSAmJiBjYXN0PENvbnN0YW50QXJyYXk+KEMpLT5pc1N0cmluZygpKSB7CisgICAgICBjb25zdCBDb25zdGFudEFycmF5ICpDQSA9IGNhc3Q8Q29uc3RhbnRBcnJheT4oQyk7CisgICAgICAvLyBFbWl0IGNvbnN0YW50IHN0cmluZ3Mgc3BlY2lhbGx5LgorICAgICAgdW5zaWduZWQgTnVtT3BzID0gQ0EtPmdldE51bU9wZXJhbmRzKCk7CisgICAgICAvLyBJZiB0aGlzIGlzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZywgdXNlIHRoZSBkZW5zZXIgQ1NUUklORyBlbmNvZGluZy4KKyAgICAgIGlmIChDQS0+Z2V0T3BlcmFuZChOdW1PcHMtMSktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgQ29kZSA9IGJpdGM6OkNTVF9DT0RFX0NTVFJJTkc7CisgICAgICAgIC0tTnVtT3BzOyAgLy8gRG9uJ3QgZW5jb2RlIHRoZSBudWxsLCB3aGljaCBpc24ndCBhbGxvd2VkIGJ5IGNoYXI2LgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29kZSA9IGJpdGM6OkNTVF9DT0RFX1NUUklORzsKKyAgICAgICAgQWJicmV2VG9Vc2UgPSBTdHJpbmc4QWJicmV2OworICAgICAgfQorICAgICAgYm9vbCBpc0NTdHI3ID0gQ29kZSA9PSBiaXRjOjpDU1RfQ09ERV9DU1RSSU5HOworICAgICAgYm9vbCBpc0NTdHJDaGFyNiA9IENvZGUgPT0gYml0Yzo6Q1NUX0NPREVfQ1NUUklORzsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBWID0gY2FzdDxDb25zdGFudEludD4oQ0EtPmdldE9wZXJhbmQoaSkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgUmVjb3JkLnB1c2hfYmFjayhWKTsKKyAgICAgICAgaXNDU3RyNyAmPSAoViAmIDEyOCkgPT0gMDsKKyAgICAgICAgaWYgKGlzQ1N0ckNoYXI2KQorICAgICAgICAgIGlzQ1N0ckNoYXI2ID0gQml0Q29kZUFiYnJldk9wOjppc0NoYXI2KFYpOworICAgICAgfQorCisgICAgICBpZiAoaXNDU3RyQ2hhcjYpCisgICAgICAgIEFiYnJldlRvVXNlID0gQ1N0cmluZzZBYmJyZXY7CisgICAgICBlbHNlIGlmIChpc0NTdHI3KQorICAgICAgICBBYmJyZXZUb1VzZSA9IENTdHJpbmc3QWJicmV2OworICAgIH0gZWxzZSBpZiAoaXNhPENvbnN0YW50QXJyYXk+KEMpIHx8IGlzYTxDb25zdGFudFN0cnVjdD4oVikgfHwKKyAgICAgICAgICAgICAgIGlzYTxDb25zdGFudFZlY3Rvcj4oVikpIHsKKyAgICAgIENvZGUgPSBiaXRjOjpDU1RfQ09ERV9BR0dSRUdBVEU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQy0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChDLT5nZXRPcGVyYW5kKGkpKSk7CisgICAgICBBYmJyZXZUb1VzZSA9IEFnZ3JlZ2F0ZUFiYnJldjsKKyAgICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudFVuaW9uPihDKSkgeworICAgICAgQ29kZSA9IGJpdGM6OkNTVF9DT0RFX0FHR1JFR0FURTsKKworICAgICAgLy8gVW5pb25zIG9ubHkgaGF2ZSBvbmUgZW50cnkgYnV0IHdlIG11c3Qgc2VuZCB0eXBlIGFsb25nIHdpdGggaXQuCisgICAgICBjb25zdCBUeXBlICpFbnRyeUtpbmQgPSBDLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisKKyAgICAgIGNvbnN0IFVuaW9uVHlwZSAqVW5UeSA9IGNhc3Q8VW5pb25UeXBlPihDLT5nZXRUeXBlKCkpOworICAgICAgaW50IFVuaW9uSW5kZXggPSBVblR5LT5nZXRFbGVtZW50VHlwZUluZGV4KEVudHJ5S2luZCk7CisgICAgICBhc3NlcnQoVW5pb25JbmRleCAhPSAtMSAmJiAiQ29uc3RhbnQgdW5pb24gY29udGFpbnMgaW52YWxpZCBlbnRyeSIpOworCisgICAgICBSZWNvcmQucHVzaF9iYWNrKFVuaW9uSW5kZXgpOworICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEMtPmdldE9wZXJhbmQoMCkpKTsKKworICAgICAgQWJicmV2VG9Vc2UgPSBBZ2dyZWdhdGVBYmJyZXY7CisgICAgfSBlbHNlIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDKSkgeworICAgICAgc3dpdGNoIChDRS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChJbnN0cnVjdGlvbjo6aXNDYXN0KENFLT5nZXRPcGNvZGUoKSkpIHsKKyAgICAgICAgICBDb2RlID0gYml0Yzo6Q1NUX0NPREVfQ0VfQ0FTVDsKKyAgICAgICAgICBSZWNvcmQucHVzaF9iYWNrKEdldEVuY29kZWRDYXN0T3Bjb2RlKENFLT5nZXRPcGNvZGUoKSkpOworICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKEMtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkpOworICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChDLT5nZXRPcGVyYW5kKDApKSk7CisgICAgICAgICAgQWJicmV2VG9Vc2UgPSBDT05TVEFOVFNfQ0VfQ0FTVF9BYmJyZXY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0KENFLT5nZXROdW1PcGVyYW5kcygpID09IDIgJiYgIlVua25vd24gY29uc3RhbnQgZXhwciEiKTsKKyAgICAgICAgICBDb2RlID0gYml0Yzo6Q1NUX0NPREVfQ0VfQklOT1A7CisgICAgICAgICAgUmVjb3JkLnB1c2hfYmFjayhHZXRFbmNvZGVkQmluYXJ5T3Bjb2RlKENFLT5nZXRPcGNvZGUoKSkpOworICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChDLT5nZXRPcGVyYW5kKDApKSk7CisgICAgICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEMtPmdldE9wZXJhbmQoMSkpKTsKKyAgICAgICAgICB1aW50NjRfdCBGbGFncyA9IEdldE9wdGltaXphdGlvbkZsYWdzKENFKTsKKyAgICAgICAgICBpZiAoRmxhZ3MgIT0gMCkKKyAgICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soRmxhZ3MpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cjoKKyAgICAgICAgQ29kZSA9IGJpdGM6OkNTVF9DT0RFX0NFX0dFUDsKKyAgICAgICAgaWYgKGNhc3Q8R0VQT3BlcmF0b3I+KEMpLT5pc0luQm91bmRzKCkpCisgICAgICAgICAgQ29kZSA9IGJpdGM6OkNTVF9DT0RFX0NFX0lOQk9VTkRTX0dFUDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENFLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKEMtPmdldE9wZXJhbmQoaSktPmdldFR5cGUoKSkpOworICAgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChDLT5nZXRPcGVyYW5kKGkpKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6CisgICAgICAgIENvZGUgPSBiaXRjOjpDU1RfQ09ERV9DRV9TRUxFQ1Q7CisgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChDLT5nZXRPcGVyYW5kKDApKSk7CisgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChDLT5nZXRPcGVyYW5kKDEpKSk7CisgICAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChDLT5nZXRPcGVyYW5kKDIpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6RXh0cmFjdEVsZW1lbnQ6CisgICAgICAgIENvZGUgPSBiaXRjOjpDU1RfQ09ERV9DRV9FWFRSQUNURUxUOworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFR5cGVJRChDLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEMtPmdldE9wZXJhbmQoMCkpKTsKKyAgICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEMtPmdldE9wZXJhbmQoMSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50OgorICAgICAgICBDb2RlID0gYml0Yzo6Q1NUX0NPREVfQ0VfSU5TRVJURUxUOworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoQy0+Z2V0T3BlcmFuZCgwKSkpOworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoQy0+Z2V0T3BlcmFuZCgxKSkpOworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoQy0+Z2V0T3BlcmFuZCgyKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNodWZmbGVWZWN0b3I6CisgICAgICAgIC8vIElmIHRoZSByZXR1cm4gdHlwZSBhbmQgYXJndW1lbnQgdHlwZXMgYXJlIHRoZSBzYW1lLCB0aGlzIGlzIGEKKyAgICAgICAgLy8gc3RhbmRhcmQgc2h1ZmZsZXZlY3RvciBpbnN0cnVjdGlvbi4gIElmIHRoZSB0eXBlcyBhcmUgZGlmZmVyZW50LAorICAgICAgICAvLyB0aGVuIHRoZSBzaHVmZmxlIGlzIHdpZGVuaW5nIG9yIHRydW5jYXRpbmcgdGhlIGlucHV0IHZlY3RvcnMsIGFuZAorICAgICAgICAvLyB0aGUgYXJndW1lbnQgdHlwZSBtdXN0IGFsc28gYmUgZW5jb2RlZC4KKyAgICAgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBDLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpIHsKKyAgICAgICAgICBDb2RlID0gYml0Yzo6Q1NUX0NPREVfQ0VfU0hVRkZMRVZFQzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDb2RlID0gYml0Yzo6Q1NUX0NPREVfQ0VfU0hVRlZFQ19FWDsKKyAgICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFR5cGVJRChDLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgfQorICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoQy0+Z2V0T3BlcmFuZCgwKSkpOworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoQy0+Z2V0T3BlcmFuZCgxKSkpOworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoQy0+Z2V0T3BlcmFuZCgyKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OklDbXA6CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpGQ21wOgorICAgICAgICBDb2RlID0gYml0Yzo6Q1NUX0NPREVfQ0VfQ01QOworICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFZFLmdldFR5cGVJRChDLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEMtPmdldE9wZXJhbmQoMCkpKTsKKyAgICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEMtPmdldE9wZXJhbmQoMSkpKTsKKyAgICAgICAgUmVjb3JkLnB1c2hfYmFjayhDRS0+Z2V0UHJlZGljYXRlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEgPSBkeW5fY2FzdDxCbG9ja0FkZHJlc3M+KEMpKSB7CisgICAgICBhc3NlcnQoQkEtPmdldEZ1bmN0aW9uKCkgPT0gQkEtPmdldEJhc2ljQmxvY2soKS0+Z2V0UGFyZW50KCkgJiYKKyAgICAgICAgICAgICAiTWFsZm9ybWVkIGJsb2NrYWRkcmVzcyIpOworICAgICAgQ29kZSA9IGJpdGM6OkNTVF9DT0RFX0JMT0NLQUREUkVTUzsKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKEJBLT5nZXRGdW5jdGlvbigpLT5nZXRUeXBlKCkpKTsKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChCQS0+Z2V0RnVuY3Rpb24oKSkpOworICAgICAgUmVjb3JkLnB1c2hfYmFjayhWRS5nZXRHbG9iYWxCYXNpY0Jsb2NrSUQoQkEtPmdldEJhc2ljQmxvY2soKSkpOworICAgIH0gZWxzZSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgQy0+ZHVtcCgpOworI2VuZGlmCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGNvbnN0YW50ISIpOworICAgIH0KKyAgICBTdHJlYW0uRW1pdFJlY29yZChDb2RlLCBSZWNvcmQsIEFiYnJldlRvVXNlKTsKKyAgICBSZWNvcmQuY2xlYXIoKTsKKyAgfQorCisgIFN0cmVhbS5FeGl0QmxvY2soKTsKK30KKworc3RhdGljIHZvaWQgV3JpdGVNb2R1bGVDb25zdGFudHMoY29uc3QgVmFsdWVFbnVtZXJhdG9yICZWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlciAmU3RyZWFtKSB7CisgIGNvbnN0IFZhbHVlRW51bWVyYXRvcjo6VmFsdWVMaXN0ICZWYWxzID0gVkUuZ2V0VmFsdWVzKCk7CisKKyAgLy8gRmluZCB0aGUgZmlyc3QgY29uc3RhbnQgdG8gZW1pdCwgd2hpY2ggaXMgdGhlIGZpcnN0IG5vbi1nbG9iYWx2YWx1ZSB2YWx1ZS4KKyAgLy8gV2Uga25vdyBnbG9iYWx2YWx1ZXMgaGF2ZSBiZWVuIGVtaXR0ZWQgYnkgV3JpdGVNb2R1bGVJbmZvLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVmFscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKCFpc2E8R2xvYmFsVmFsdWU+KFZhbHNbaV0uZmlyc3QpKSB7CisgICAgICBXcml0ZUNvbnN0YW50cyhpLCBWYWxzLnNpemUoKSwgVkUsIFN0cmVhbSwgdHJ1ZSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKKy8vLyBQdXNoVmFsdWVBbmRUeXBlIC0gVGhlIGZpbGUgaGFzIHRvIGVuY29kZSBib3RoIHRoZSB2YWx1ZSBhbmQgdHlwZSBpZCBmb3IKKy8vLyBtYW55IHZhbHVlcywgYmVjYXVzZSB3ZSBuZWVkIHRvIGtub3cgd2hhdCB0eXBlIHRvIGNyZWF0ZSBmb3IgZm9yd2FyZAorLy8vIHJlZmVyZW5jZXMuICBIb3dldmVyLCBtb3N0IG9wZXJhbmRzIGFyZSBub3QgZm9yd2FyZCByZWZlcmVuY2VzLCBzbyB0aGlzIHR5cGUKKy8vLyBmaWVsZCBpcyBub3QgbmVlZGVkLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBhZGRzIFYncyB2YWx1ZSBJRCB0byBWYWxzLiAgSWYgdGhlIHZhbHVlIElEIGlzIGhpZ2hlciB0aGFuIHRoZQorLy8vIGluc3RydWN0aW9uIElELCB0aGVuIGl0IGlzIGEgZm9yd2FyZCByZWZlcmVuY2UsIGFuZCBpdCBhbHNvIGluY2x1ZGVzIHRoZQorLy8vIHR5cGUgSUQuCitzdGF0aWMgYm9vbCBQdXNoVmFsdWVBbmRUeXBlKGNvbnN0IFZhbHVlICpWLCB1bnNpZ25lZCBJbnN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA2ND4gJlZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRW51bWVyYXRvciAmVkUpIHsKKyAgdW5zaWduZWQgVmFsSUQgPSBWRS5nZXRWYWx1ZUlEKFYpOworICBWYWxzLnB1c2hfYmFjayhWYWxJRCk7CisgIGlmIChWYWxJRCA+PSBJbnN0SUQpIHsKKyAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRUeXBlSUQoVi0+Z2V0VHlwZSgpKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gV3JpdGVJbnN0cnVjdGlvbiAtIEVtaXQgYW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCitzdGF0aWMgdm9pZCBXcml0ZUluc3RydWN0aW9uKGNvbnN0IEluc3RydWN0aW9uICZJLCB1bnNpZ25lZCBJbnN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRW51bWVyYXRvciAmVkUsIEJpdHN0cmVhbVdyaXRlciAmU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgNjQ+ICZWYWxzKSB7CisgIHVuc2lnbmVkIENvZGUgPSAwOworICB1bnNpZ25lZCBBYmJyZXZUb1VzZSA9IDA7CisgIFZFLnNldEluc3RydWN0aW9uSUQoJkkpOworICBzd2l0Y2ggKEkuZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICBpZiAoSW5zdHJ1Y3Rpb246OmlzQ2FzdChJLmdldE9wY29kZSgpKSkgeworICAgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX0NBU1Q7CisgICAgICBpZiAoIVB1c2hWYWx1ZUFuZFR5cGUoSS5nZXRPcGVyYW5kKDApLCBJbnN0SUQsIFZhbHMsIFZFKSkKKyAgICAgICAgQWJicmV2VG9Vc2UgPSBGVU5DVElPTl9JTlNUX0NBU1RfQUJCUkVWOworICAgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKEkuZ2V0VHlwZSgpKSk7CisgICAgICBWYWxzLnB1c2hfYmFjayhHZXRFbmNvZGVkQ2FzdE9wY29kZShJLmdldE9wY29kZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChpc2E8QmluYXJ5T3BlcmF0b3I+KEkpICYmICJVbmtub3duIGluc3RydWN0aW9uISIpOworICAgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX0JJTk9QOworICAgICAgaWYgKCFQdXNoVmFsdWVBbmRUeXBlKEkuZ2V0T3BlcmFuZCgwKSwgSW5zdElELCBWYWxzLCBWRSkpCisgICAgICAgIEFiYnJldlRvVXNlID0gRlVOQ1RJT05fSU5TVF9CSU5PUF9BQkJSRVY7CisgICAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEkuZ2V0T3BlcmFuZCgxKSkpOworICAgICAgVmFscy5wdXNoX2JhY2soR2V0RW5jb2RlZEJpbmFyeU9wY29kZShJLmdldE9wY29kZSgpKSk7CisgICAgICB1aW50NjRfdCBGbGFncyA9IEdldE9wdGltaXphdGlvbkZsYWdzKCZJKTsKKyAgICAgIGlmIChGbGFncyAhPSAwKSB7CisgICAgICAgIGlmIChBYmJyZXZUb1VzZSA9PSBGVU5DVElPTl9JTlNUX0JJTk9QX0FCQlJFVikKKyAgICAgICAgICBBYmJyZXZUb1VzZSA9IEZVTkNUSU9OX0lOU1RfQklOT1BfRkxBR1NfQUJCUkVWOworICAgICAgICBWYWxzLnB1c2hfYmFjayhGbGFncyk7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHI6CisgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX0dFUDsKKyAgICBpZiAoY2FzdDxHRVBPcGVyYXRvcj4oJkkpLT5pc0luQm91bmRzKCkpCisgICAgICBDb2RlID0gYml0Yzo6RlVOQ19DT0RFX0lOU1RfSU5CT1VORFNfR0VQOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgUHVzaFZhbHVlQW5kVHlwZShJLmdldE9wZXJhbmQoaSksIEluc3RJRCwgVmFscywgVkUpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpFeHRyYWN0VmFsdWU6IHsKKyAgICBDb2RlID0gYml0Yzo6RlVOQ19DT0RFX0lOU1RfRVhUUkFDVFZBTDsKKyAgICBQdXNoVmFsdWVBbmRUeXBlKEkuZ2V0T3BlcmFuZCgwKSwgSW5zdElELCBWYWxzLCBWRSk7CisgICAgY29uc3QgRXh0cmFjdFZhbHVlSW5zdCAqRVZJID0gY2FzdDxFeHRyYWN0VmFsdWVJbnN0PigmSSk7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqaSA9IEVWSS0+aWR4X2JlZ2luKCksICplID0gRVZJLT5pZHhfZW5kKCk7IGkgIT0gZTsgKytpKQorICAgICAgVmFscy5wdXNoX2JhY2soKmkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246Okluc2VydFZhbHVlOiB7CisgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX0lOU0VSVFZBTDsKKyAgICBQdXNoVmFsdWVBbmRUeXBlKEkuZ2V0T3BlcmFuZCgwKSwgSW5zdElELCBWYWxzLCBWRSk7CisgICAgUHVzaFZhbHVlQW5kVHlwZShJLmdldE9wZXJhbmQoMSksIEluc3RJRCwgVmFscywgVkUpOworICAgIGNvbnN0IEluc2VydFZhbHVlSW5zdCAqSVZJID0gY2FzdDxJbnNlcnRWYWx1ZUluc3Q+KCZJKTsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICppID0gSVZJLT5pZHhfYmVnaW4oKSwgKmUgPSBJVkktPmlkeF9lbmQoKTsgaSAhPSBlOyArK2kpCisgICAgICBWYWxzLnB1c2hfYmFjaygqaSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2VsZWN0OgorICAgIENvZGUgPSBiaXRjOjpGVU5DX0NPREVfSU5TVF9WU0VMRUNUOworICAgIFB1c2hWYWx1ZUFuZFR5cGUoSS5nZXRPcGVyYW5kKDEpLCBJbnN0SUQsIFZhbHMsIFZFKTsKKyAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEkuZ2V0T3BlcmFuZCgyKSkpOworICAgIFB1c2hWYWx1ZUFuZFR5cGUoSS5nZXRPcGVyYW5kKDApLCBJbnN0SUQsIFZhbHMsIFZFKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RXh0cmFjdEVsZW1lbnQ6CisgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX0VYVFJBQ1RFTFQ7CisgICAgUHVzaFZhbHVlQW5kVHlwZShJLmdldE9wZXJhbmQoMCksIEluc3RJRCwgVmFscywgVkUpOworICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoSS5nZXRPcGVyYW5kKDEpKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246Okluc2VydEVsZW1lbnQ6CisgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX0lOU0VSVEVMVDsKKyAgICBQdXNoVmFsdWVBbmRUeXBlKEkuZ2V0T3BlcmFuZCgwKSwgSW5zdElELCBWYWxzLCBWRSk7CisgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChJLmdldE9wZXJhbmQoMSkpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEkuZ2V0T3BlcmFuZCgyKSkpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTaHVmZmxlVmVjdG9yOgorICAgIENvZGUgPSBiaXRjOjpGVU5DX0NPREVfSU5TVF9TSFVGRkxFVkVDOworICAgIFB1c2hWYWx1ZUFuZFR5cGUoSS5nZXRPcGVyYW5kKDApLCBJbnN0SUQsIFZhbHMsIFZFKTsKKyAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEkuZ2V0T3BlcmFuZCgxKSkpOworICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoSS5nZXRPcGVyYW5kKDIpKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OklDbXA6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZDbXA6CisgICAgLy8gY29tcGFyZSByZXR1cm5pbmcgSW50MVR5IG9yIHZlY3RvciBvZiBJbnQxVHkKKyAgICBDb2RlID0gYml0Yzo6RlVOQ19DT0RFX0lOU1RfQ01QMjsKKyAgICBQdXNoVmFsdWVBbmRUeXBlKEkuZ2V0T3BlcmFuZCgwKSwgSW5zdElELCBWYWxzLCBWRSk7CisgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChJLmdldE9wZXJhbmQoMSkpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhjYXN0PENtcEluc3Q+KEkpLmdldFByZWRpY2F0ZSgpKTsKKyAgICBicmVhazsKKworICBjYXNlIEluc3RydWN0aW9uOjpSZXQ6CisgICAgeworICAgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX1JFVDsKKyAgICAgIHVuc2lnbmVkIE51bU9wZXJhbmRzID0gSS5nZXROdW1PcGVyYW5kcygpOworICAgICAgaWYgKE51bU9wZXJhbmRzID09IDApCisgICAgICAgIEFiYnJldlRvVXNlID0gRlVOQ1RJT05fSU5TVF9SRVRfVk9JRF9BQkJSRVY7CisgICAgICBlbHNlIGlmIChOdW1PcGVyYW5kcyA9PSAxKSB7CisgICAgICAgIGlmICghUHVzaFZhbHVlQW5kVHlwZShJLmdldE9wZXJhbmQoMCksIEluc3RJRCwgVmFscywgVkUpKQorICAgICAgICAgIEFiYnJldlRvVXNlID0gRlVOQ1RJT05fSU5TVF9SRVRfVkFMX0FCQlJFVjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1PcGVyYW5kczsgaSAhPSBlOyArK2kpCisgICAgICAgICAgUHVzaFZhbHVlQW5kVHlwZShJLmdldE9wZXJhbmQoaSksIEluc3RJRCwgVmFscywgVkUpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QnI6CisgICAgeworICAgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX0JSOworICAgICAgQnJhbmNoSW5zdCAmSUkgPSBjYXN0PEJyYW5jaEluc3Q+KEkpOworICAgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChJSS5nZXRTdWNjZXNzb3IoMCkpKTsKKyAgICAgIGlmIChJSS5pc0NvbmRpdGlvbmFsKCkpIHsKKyAgICAgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChJSS5nZXRTdWNjZXNzb3IoMSkpKTsKKyAgICAgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChJSS5nZXRDb25kaXRpb24oKSkpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3dpdGNoOgorICAgIENvZGUgPSBiaXRjOjpGVU5DX0NPREVfSU5TVF9TV0lUQ0g7CisgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKEkuZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEkuZ2V0T3BlcmFuZChpKSkpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpJbmRpcmVjdEJyOgorICAgIENvZGUgPSBiaXRjOjpGVU5DX0NPREVfSU5TVF9JTkRJUkVDVEJSOworICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFR5cGVJRChJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChJLmdldE9wZXJhbmQoaSkpKTsKKyAgICBicmVhazsKKyAgICAgIAorICBjYXNlIEluc3RydWN0aW9uOjpJbnZva2U6IHsKKyAgICBjb25zdCBJbnZva2VJbnN0ICpJSSA9IGNhc3Q8SW52b2tlSW5zdD4oJkkpOworICAgIGNvbnN0IFZhbHVlICpDYWxsZWUoSUktPmdldENhbGxlZFZhbHVlKCkpOworICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihDYWxsZWUtPmdldFR5cGUoKSk7CisgICAgY29uc3QgRnVuY3Rpb25UeXBlICpGVHkgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oUFR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICBDb2RlID0gYml0Yzo6RlVOQ19DT0RFX0lOU1RfSU5WT0tFOworCisgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0QXR0cmlidXRlSUQoSUktPmdldEF0dHJpYnV0ZXMoKSkpOworICAgIFZhbHMucHVzaF9iYWNrKElJLT5nZXRDYWxsaW5nQ29udigpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKElJLT5nZXROb3JtYWxEZXN0KCkpKTsKKyAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKElJLT5nZXRVbndpbmREZXN0KCkpKTsKKyAgICBQdXNoVmFsdWVBbmRUeXBlKENhbGxlZSwgSW5zdElELCBWYWxzLCBWRSk7CisKKyAgICAvLyBFbWl0IHZhbHVlICMncyBmb3IgdGhlIGZpeGVkIHBhcmFtZXRlcnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZUeS0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKQorICAgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChJLmdldE9wZXJhbmQoaSkpKTsgIC8vIGZpeGVkIHBhcmFtLgorCisgICAgLy8gRW1pdCB0eXBlL3ZhbHVlIHBhaXJzIGZvciB2YXJhcmdzIHBhcmFtcy4KKyAgICBpZiAoRlR5LT5pc1ZhckFyZygpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBGVHktPmdldE51bVBhcmFtcygpLCBlID0gSS5nZXROdW1PcGVyYW5kcygpLTM7CisgICAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgICBQdXNoVmFsdWVBbmRUeXBlKEkuZ2V0T3BlcmFuZChpKSwgSW5zdElELCBWYWxzLCBWRSk7IC8vIHZhcmFyZworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpVbndpbmQ6CisgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX1VOV0lORDsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VW5yZWFjaGFibGU6CisgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX1VOUkVBQ0hBQkxFOworICAgIEFiYnJldlRvVXNlID0gRlVOQ1RJT05fSU5TVF9VTlJFQUNIQUJMRV9BQkJSRVY7CisgICAgYnJlYWs7CisKKyAgY2FzZSBJbnN0cnVjdGlvbjo6UEhJOgorICAgIENvZGUgPSBiaXRjOjpGVU5DX0NPREVfSU5TVF9QSEk7CisgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKEkuZ2V0VHlwZSgpKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBWYWxzLnB1c2hfYmFjayhWRS5nZXRWYWx1ZUlEKEkuZ2V0T3BlcmFuZChpKSkpOworICAgIGJyZWFrOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFsbG9jYToKKyAgICBDb2RlID0gYml0Yzo6RlVOQ19DT0RFX0lOU1RfQUxMT0NBOworICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFR5cGVJRChJLmdldFR5cGUoKSkpOworICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFR5cGVJRChJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkpOworICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoSS5nZXRPcGVyYW5kKDApKSk7IC8vIHNpemUuCisgICAgVmFscy5wdXNoX2JhY2soTG9nMl8zMihjYXN0PEFsbG9jYUluc3Q+KEkpLmdldEFsaWdubWVudCgpKSsxKTsKKyAgICBicmVhazsKKworICBjYXNlIEluc3RydWN0aW9uOjpMb2FkOgorICAgIENvZGUgPSBiaXRjOjpGVU5DX0NPREVfSU5TVF9MT0FEOworICAgIGlmICghUHVzaFZhbHVlQW5kVHlwZShJLmdldE9wZXJhbmQoMCksIEluc3RJRCwgVmFscywgVkUpKSAgLy8gcHRyCisgICAgICBBYmJyZXZUb1VzZSA9IEZVTkNUSU9OX0lOU1RfTE9BRF9BQkJSRVY7CisKKyAgICBWYWxzLnB1c2hfYmFjayhMb2cyXzMyKGNhc3Q8TG9hZEluc3Q+KEkpLmdldEFsaWdubWVudCgpKSsxKTsKKyAgICBWYWxzLnB1c2hfYmFjayhjYXN0PExvYWRJbnN0PihJKS5pc1ZvbGF0aWxlKCkpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTdG9yZToKKyAgICBDb2RlID0gYml0Yzo6RlVOQ19DT0RFX0lOU1RfU1RPUkUyOworICAgIFB1c2hWYWx1ZUFuZFR5cGUoSS5nZXRPcGVyYW5kKDEpLCBJbnN0SUQsIFZhbHMsIFZFKTsgIC8vIHB0cnR5ICsgcHRyCisgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChJLmdldE9wZXJhbmQoMCkpKTsgICAgICAgLy8gdmFsLgorICAgIFZhbHMucHVzaF9iYWNrKExvZzJfMzIoY2FzdDxTdG9yZUluc3Q+KEkpLmdldEFsaWdubWVudCgpKSsxKTsKKyAgICBWYWxzLnB1c2hfYmFjayhjYXN0PFN0b3JlSW5zdD4oSSkuaXNWb2xhdGlsZSgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Q2FsbDogeworICAgIGNvbnN0IENhbGxJbnN0ICZDSSA9IGNhc3Q8Q2FsbEluc3Q+KEkpOworICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihDSS5nZXRDYWxsZWRWYWx1ZSgpLT5nZXRUeXBlKCkpOworICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlR5ID0gY2FzdDxGdW5jdGlvblR5cGU+KFBUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisKKyAgICBDb2RlID0gYml0Yzo6RlVOQ19DT0RFX0lOU1RfQ0FMTDsKKworICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldEF0dHJpYnV0ZUlEKENJLmdldEF0dHJpYnV0ZXMoKSkpOworICAgIFZhbHMucHVzaF9iYWNrKChDSS5nZXRDYWxsaW5nQ29udigpIDw8IDEpIHwgdW5zaWduZWQoQ0kuaXNUYWlsQ2FsbCgpKSk7CisgICAgUHVzaFZhbHVlQW5kVHlwZShDSS5nZXRDYWxsZWRWYWx1ZSgpLCBJbnN0SUQsIFZhbHMsIFZFKTsgIC8vIENhbGxlZQorCisgICAgLy8gRW1pdCB2YWx1ZSAjJ3MgZm9yIHRoZSBmaXhlZCBwYXJhbWV0ZXJzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVHktPmdldE51bVBhcmFtcygpOyBpICE9IGU7ICsraSkKKyAgICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFZhbHVlSUQoQ0kuZ2V0QXJnT3BlcmFuZChpKSkpOyAgLy8gZml4ZWQgcGFyYW0uCisKKyAgICAvLyBFbWl0IHR5cGUvdmFsdWUgcGFpcnMgZm9yIHZhcmFyZ3MgcGFyYW1zLgorICAgIGlmIChGVHktPmlzVmFyQXJnKCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IEZUeS0+Z2V0TnVtUGFyYW1zKCksIGUgPSBDSS5nZXROdW1BcmdPcGVyYW5kcygpOworICAgICAgICAgICBpICE9IGU7ICsraSkKKyAgICAgICAgUHVzaFZhbHVlQW5kVHlwZShDSS5nZXRBcmdPcGVyYW5kKGkpLCBJbnN0SUQsIFZhbHMsIFZFKTsgIC8vIHZhcmFyZ3MKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6VkFBcmc6CisgICAgQ29kZSA9IGJpdGM6OkZVTkNfQ09ERV9JTlNUX1ZBQVJHOworICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFR5cGVJRChJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkpOyAgIC8vIHZhbGlzdHR5CisgICAgVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChJLmdldE9wZXJhbmQoMCkpKTsgLy8gdmFsaXN0LgorICAgIFZhbHMucHVzaF9iYWNrKFZFLmdldFR5cGVJRChJLmdldFR5cGUoKSkpOyAvLyByZXN0eXBlLgorICAgIGJyZWFrOworICB9CisKKyAgU3RyZWFtLkVtaXRSZWNvcmQoQ29kZSwgVmFscywgQWJicmV2VG9Vc2UpOworICBWYWxzLmNsZWFyKCk7Cit9CisKKy8vIEVtaXQgbmFtZXMgZm9yIGdsb2JhbHMvZnVuY3Rpb25zIGV0Yy4KK3N0YXRpYyB2b2lkIFdyaXRlVmFsdWVTeW1ib2xUYWJsZShjb25zdCBWYWx1ZVN5bWJvbFRhYmxlICZWU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVFbnVtZXJhdG9yICZWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZXIgJlN0cmVhbSkgeworICBpZiAoVlNULmVtcHR5KCkpIHJldHVybjsKKyAgU3RyZWFtLkVudGVyU3ViYmxvY2soYml0Yzo6VkFMVUVfU1lNVEFCX0JMT0NLX0lELCA0KTsKKworICAvLyBGSVhNRTogU2V0IHVwIHRoZSBhYmJyZXYsIHdlIGtub3cgaG93IG1hbnkgdmFsdWVzIHRoZXJlIGFyZSEKKyAgLy8gRklYTUU6IFdlIGtub3cgaWYgdGhlIHR5cGUgbmFtZXMgY2FuIHVzZSA3LWJpdCBhc2NpaS4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDY0PiBOYW1lVmFsczsKKworICBmb3IgKFZhbHVlU3ltYm9sVGFibGU6OmNvbnN0X2l0ZXJhdG9yIFNJID0gVlNULmJlZ2luKCksIFNFID0gVlNULmVuZCgpOworICAgICAgIFNJICE9IFNFOyArK1NJKSB7CisKKyAgICBjb25zdCBWYWx1ZU5hbWUgJk5hbWUgPSAqU0k7CisKKyAgICAvLyBGaWd1cmUgb3V0IHRoZSBlbmNvZGluZyB0byB1c2UgZm9yIHRoZSBuYW1lLgorICAgIGJvb2wgaXM3Qml0ID0gdHJ1ZTsKKyAgICBib29sIGlzQ2hhcjYgPSB0cnVlOworICAgIGZvciAoY29uc3QgY2hhciAqQyA9IE5hbWUuZ2V0S2V5RGF0YSgpLCAqRSA9IEMrTmFtZS5nZXRLZXlMZW5ndGgoKTsKKyAgICAgICAgIEMgIT0gRTsgKytDKSB7CisgICAgICBpZiAoaXNDaGFyNikKKyAgICAgICAgaXNDaGFyNiA9IEJpdENvZGVBYmJyZXZPcDo6aXNDaGFyNigqQyk7CisgICAgICBpZiAoKHVuc2lnbmVkIGNoYXIpKkMgJiAxMjgpIHsKKyAgICAgICAgaXM3Qml0ID0gZmFsc2U7CisgICAgICAgIGJyZWFrOyAgLy8gZG9uJ3QgYm90aGVyIHNjYW5uaW5nIHRoZSByZXN0LgorICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIEFiYnJldlRvVXNlID0gVlNUX0VOVFJZXzhfQUJCUkVWOworCisgICAgLy8gVlNUX0VOVFJZOiAgIFt2YWx1ZWlkLCBuYW1lY2hhciB4IE5dCisgICAgLy8gVlNUX0JCRU5UUlk6IFtiYmlkLCBuYW1lY2hhciB4IE5dCisgICAgdW5zaWduZWQgQ29kZTsKKyAgICBpZiAoaXNhPEJhc2ljQmxvY2s+KFNJLT5nZXRWYWx1ZSgpKSkgeworICAgICAgQ29kZSA9IGJpdGM6OlZTVF9DT0RFX0JCRU5UUlk7CisgICAgICBpZiAoaXNDaGFyNikKKyAgICAgICAgQWJicmV2VG9Vc2UgPSBWU1RfQkJFTlRSWV82X0FCQlJFVjsKKyAgICB9IGVsc2UgeworICAgICAgQ29kZSA9IGJpdGM6OlZTVF9DT0RFX0VOVFJZOworICAgICAgaWYgKGlzQ2hhcjYpCisgICAgICAgIEFiYnJldlRvVXNlID0gVlNUX0VOVFJZXzZfQUJCUkVWOworICAgICAgZWxzZSBpZiAoaXM3Qml0KQorICAgICAgICBBYmJyZXZUb1VzZSA9IFZTVF9FTlRSWV83X0FCQlJFVjsKKyAgICB9CisKKyAgICBOYW1lVmFscy5wdXNoX2JhY2soVkUuZ2V0VmFsdWVJRChTSS0+Z2V0VmFsdWUoKSkpOworICAgIGZvciAoY29uc3QgY2hhciAqUCA9IE5hbWUuZ2V0S2V5RGF0YSgpLAorICAgICAgICAgKkUgPSBOYW1lLmdldEtleURhdGEoKStOYW1lLmdldEtleUxlbmd0aCgpOyBQICE9IEU7ICsrUCkKKyAgICAgIE5hbWVWYWxzLnB1c2hfYmFjaygodW5zaWduZWQgY2hhcikqUCk7CisKKyAgICAvLyBFbWl0IHRoZSBmaW5pc2hlZCByZWNvcmQuCisgICAgU3RyZWFtLkVtaXRSZWNvcmQoQ29kZSwgTmFtZVZhbHMsIEFiYnJldlRvVXNlKTsKKyAgICBOYW1lVmFscy5jbGVhcigpOworICB9CisgIFN0cmVhbS5FeGl0QmxvY2soKTsKK30KKworLy8vIFdyaXRlRnVuY3Rpb24gLSBFbWl0IGEgZnVuY3Rpb24gYm9keSB0byB0aGUgbW9kdWxlIHN0cmVhbS4KK3N0YXRpYyB2b2lkIFdyaXRlRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gJkYsIFZhbHVlRW51bWVyYXRvciAmVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlciAmU3RyZWFtKSB7CisgIFN0cmVhbS5FbnRlclN1YmJsb2NrKGJpdGM6OkZVTkNUSU9OX0JMT0NLX0lELCA0KTsKKyAgVkUuaW5jb3Jwb3JhdGVGdW5jdGlvbihGKTsKKworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgNjQ+IFZhbHM7CisKKyAgLy8gRW1pdCB0aGUgbnVtYmVyIG9mIGJhc2ljIGJsb2Nrcywgc28gdGhlIHJlYWRlciBjYW4gY3JlYXRlIHRoZW0gYWhlYWQgb2YKKyAgLy8gdGltZS4KKyAgVmFscy5wdXNoX2JhY2soVkUuZ2V0QmFzaWNCbG9ja3MoKS5zaXplKCkpOworICBTdHJlYW0uRW1pdFJlY29yZChiaXRjOjpGVU5DX0NPREVfREVDTEFSRUJMT0NLUywgVmFscyk7CisgIFZhbHMuY2xlYXIoKTsKKworICAvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb24tbG9jYWwgY29uc3RhbnRzLCBlbWl0IHRoZW0gbm93LgorICB1bnNpZ25lZCBDc3RTdGFydCwgQ3N0RW5kOworICBWRS5nZXRGdW5jdGlvbkNvbnN0YW50UmFuZ2UoQ3N0U3RhcnQsIENzdEVuZCk7CisgIFdyaXRlQ29uc3RhbnRzKENzdFN0YXJ0LCBDc3RFbmQsIFZFLCBTdHJlYW0sIGZhbHNlKTsKKworICAvLyBJZiB0aGVyZSBpcyBmdW5jdGlvbi1sb2NhbCBtZXRhZGF0YSwgZW1pdCBpdCBub3cuCisgIFdyaXRlRnVuY3Rpb25Mb2NhbE1ldGFkYXRhKEYsIFZFLCBTdHJlYW0pOworCisgIC8vIEtlZXAgYSBydW5uaW5nIGlkZWEgb2Ygd2hhdCB0aGUgaW5zdHJ1Y3Rpb24gSUQgaXMuCisgIHVuc2lnbmVkIEluc3RJRCA9IENzdEVuZDsKKworICBib29sIE5lZWRzTWV0YWRhdGFBdHRhY2htZW50ID0gZmFsc2U7CisgIAorICBEZWJ1Z0xvYyBMYXN0REw7CisgIAorICAvLyBGaW5hbGx5LCBlbWl0IGFsbCB0aGUgaW5zdHJ1Y3Rpb25zLCBpbiBvcmRlci4KKyAgZm9yIChGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IgQkIgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBCQiAhPSBFOyArK0JCKQorICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIFdyaXRlSW5zdHJ1Y3Rpb24oKkksIEluc3RJRCwgVkUsIFN0cmVhbSwgVmFscyk7CisgICAgICAKKyAgICAgIGlmICghSS0+Z2V0VHlwZSgpLT5pc1ZvaWRUeSgpKQorICAgICAgICArK0luc3RJRDsKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGhhcyBtZXRhZGF0YSwgd3JpdGUgYSBtZXRhZGF0YSBhdHRhY2htZW50IGxhdGVyLgorICAgICAgTmVlZHNNZXRhZGF0YUF0dGFjaG1lbnQgfD0gSS0+aGFzTWV0YWRhdGFPdGhlclRoYW5EZWJ1Z0xvYygpOworICAgICAgCisgICAgICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGEgZGVidWcgbG9jYXRpb24sIGVtaXQgaXQuCisgICAgICBEZWJ1Z0xvYyBETCA9IEktPmdldERlYnVnTG9jKCk7CisgICAgICBpZiAoREwuaXNVbmtub3duKCkpIHsKKyAgICAgICAgLy8gbm90aGluZyB0b2RvLgorICAgICAgfSBlbHNlIGlmIChETCA9PSBMYXN0REwpIHsKKyAgICAgICAgLy8gSnVzdCByZXBlYXQgdGhlIHNhbWUgZGVidWcgbG9jIGFzIGxhc3QgdGltZS4KKyAgICAgICAgU3RyZWFtLkVtaXRSZWNvcmQoYml0Yzo6RlVOQ19DT0RFX0RFQlVHX0xPQ19BR0FJTiwgVmFscyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBNRE5vZGUgKlNjb3BlLCAqSUE7CisgICAgICAgIERMLmdldFNjb3BlQW5kSW5saW5lZEF0KFNjb3BlLCBJQSwgSS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgICAgCisgICAgICAgIFZhbHMucHVzaF9iYWNrKERMLmdldExpbmUoKSk7CisgICAgICAgIFZhbHMucHVzaF9iYWNrKERMLmdldENvbCgpKTsKKyAgICAgICAgVmFscy5wdXNoX2JhY2soU2NvcGUgPyBWRS5nZXRWYWx1ZUlEKFNjb3BlKSsxIDogMCk7CisgICAgICAgIFZhbHMucHVzaF9iYWNrKElBID8gVkUuZ2V0VmFsdWVJRChJQSkrMSA6IDApOworICAgICAgICBTdHJlYW0uRW1pdFJlY29yZChiaXRjOjpGVU5DX0NPREVfREVCVUdfTE9DLCBWYWxzKTsKKyAgICAgICAgVmFscy5jbGVhcigpOworICAgICAgICAKKyAgICAgICAgTGFzdERMID0gREw7CisgICAgICB9CisgICAgfQorCisgIC8vIEVtaXQgbmFtZXMgZm9yIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIGV0Yy4KKyAgV3JpdGVWYWx1ZVN5bWJvbFRhYmxlKEYuZ2V0VmFsdWVTeW1ib2xUYWJsZSgpLCBWRSwgU3RyZWFtKTsKKworICBpZiAoTmVlZHNNZXRhZGF0YUF0dGFjaG1lbnQpCisgICAgV3JpdGVNZXRhZGF0YUF0dGFjaG1lbnQoRiwgVkUsIFN0cmVhbSk7CisgIFZFLnB1cmdlRnVuY3Rpb24oKTsKKyAgU3RyZWFtLkV4aXRCbG9jaygpOworfQorCisvLy8gV3JpdGVUeXBlU3ltYm9sVGFibGUgLSBFbWl0IGEgYmxvY2sgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBzeW10YWIuCitzdGF0aWMgdm9pZCBXcml0ZVR5cGVTeW1ib2xUYWJsZShjb25zdCBUeXBlU3ltYm9sVGFibGUgJlRTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlRW51bWVyYXRvciAmVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZXIgJlN0cmVhbSkgeworICBpZiAoVFNULmVtcHR5KCkpIHJldHVybjsKKworICBTdHJlYW0uRW50ZXJTdWJibG9jayhiaXRjOjpUWVBFX1NZTVRBQl9CTE9DS19JRCwgMyk7CisKKyAgLy8gNy1iaXQgZml4ZWQgd2lkdGggVlNUX0NPREVfRU5UUlkgc3RyaW5ncy4KKyAgQml0Q29kZUFiYnJldiAqQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6VlNUX0NPREVfRU5UUlkpKTsKKyAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZzJfMzJfQ2VpbChWRS5nZXRUeXBlcygpLnNpemUoKSsxKSkpOworICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6QXJyYXkpKTsKKyAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLCA3KSk7CisgIHVuc2lnbmVkIFY3QWJicmV2ID0gU3RyZWFtLkVtaXRBYmJyZXYoQWJidik7CisKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDY0PiBOYW1lVmFsczsKKworICBmb3IgKFR5cGVTeW1ib2xUYWJsZTo6Y29uc3RfaXRlcmF0b3IgVEkgPSBUU1QuYmVnaW4oKSwgVEUgPSBUU1QuZW5kKCk7CisgICAgICAgVEkgIT0gVEU7ICsrVEkpIHsKKyAgICAvLyBUU1RfRU5UUlk6IFt0eXBlaWQsIG5hbWVjaGFyIHggTl0KKyAgICBOYW1lVmFscy5wdXNoX2JhY2soVkUuZ2V0VHlwZUlEKFRJLT5zZWNvbmQpKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIgPSBUSS0+Zmlyc3Q7CisgICAgYm9vbCBpczdCaXQgPSB0cnVlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdHIuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgTmFtZVZhbHMucHVzaF9iYWNrKCh1bnNpZ25lZCBjaGFyKVN0cltpXSk7CisgICAgICBpZiAoU3RyW2ldICYgMTI4KQorICAgICAgICBpczdCaXQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBFbWl0IHRoZSBmaW5pc2hlZCByZWNvcmQuCisgICAgU3RyZWFtLkVtaXRSZWNvcmQoYml0Yzo6VlNUX0NPREVfRU5UUlksIE5hbWVWYWxzLCBpczdCaXQgPyBWN0FiYnJldiA6IDApOworICAgIE5hbWVWYWxzLmNsZWFyKCk7CisgIH0KKworICBTdHJlYW0uRXhpdEJsb2NrKCk7Cit9CisKKy8vIEVtaXQgYmxvY2tpbmZvLCB3aGljaCBkZWZpbmVzIHRoZSBzdGFuZGFyZCBhYmJyZXZpYXRpb25zIGV0Yy4KK3N0YXRpYyB2b2lkIFdyaXRlQmxvY2tJbmZvKGNvbnN0IFZhbHVlRW51bWVyYXRvciAmVkUsIEJpdHN0cmVhbVdyaXRlciAmU3RyZWFtKSB7CisgIC8vIFdlIG9ubHkgd2FudCB0byBlbWl0IGJsb2NrIGluZm8gcmVjb3JkcyBmb3IgYmxvY2tzIHRoYXQgaGF2ZSBtdWx0aXBsZQorICAvLyBpbnN0YW5jZXM6IENPTlNUQU5UU19CTE9DSywgRlVOQ1RJT05fQkxPQ0sgYW5kIFZBTFVFX1NZTVRBQl9CTE9DSy4gIE90aGVyCisgIC8vIGJsb2NrcyBjYW4gZGVmaW5lZCB0aGVpciBhYmJyZXZzIGlubGluZS4KKyAgU3RyZWFtLkVudGVyQmxvY2tJbmZvQmxvY2soMik7CisKKyAgeyAvLyA4LWJpdCBmaXhlZC13aWR0aCBWU1RfRU5UUlkvVlNUX0JCRU5UUlkgc3RyaW5ncy4KKyAgICBCaXRDb2RlQWJicmV2ICpBYmJ2ID0gbmV3IEJpdENvZGVBYmJyZXYoKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDMpKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6VkJSLCA4KSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkFycmF5KSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLCA4KSk7CisgICAgaWYgKFN0cmVhbS5FbWl0QmxvY2tJbmZvQWJicmV2KGJpdGM6OlZBTFVFX1NZTVRBQl9CTE9DS19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJidikgIT0gVlNUX0VOVFJZXzhfQUJCUkVWKQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBhYmJyZXYgb3JkZXJpbmchIik7CisgIH0KKworICB7IC8vIDctYml0IGZpeGVkIHdpZHRoIFZTVF9FTlRSWSBzdHJpbmdzLgorICAgIEJpdENvZGVBYmJyZXYgKkFiYnYgPSBuZXcgQml0Q29kZUFiYnJldigpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6VlNUX0NPREVfRU5UUlkpKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6VkJSLCA4KSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkFycmF5KSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLCA3KSk7CisgICAgaWYgKFN0cmVhbS5FbWl0QmxvY2tJbmZvQWJicmV2KGJpdGM6OlZBTFVFX1NZTVRBQl9CTE9DS19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJidikgIT0gVlNUX0VOVFJZXzdfQUJCUkVWKQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBhYmJyZXYgb3JkZXJpbmchIik7CisgIH0KKyAgeyAvLyA2LWJpdCBjaGFyNiBWU1RfRU5UUlkgc3RyaW5ncy4KKyAgICBCaXRDb2RlQWJicmV2ICpBYmJ2ID0gbmV3IEJpdENvZGVBYmJyZXYoKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKGJpdGM6OlZTVF9DT0RFX0VOVFJZKSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OlZCUiwgOCkpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpBcnJheSkpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpDaGFyNikpOworICAgIGlmIChTdHJlYW0uRW1pdEJsb2NrSW5mb0FiYnJldihiaXRjOjpWQUxVRV9TWU1UQUJfQkxPQ0tfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFiYnYpICE9IFZTVF9FTlRSWV82X0FCQlJFVikKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgYWJicmV2IG9yZGVyaW5nISIpOworICB9CisgIHsgLy8gNi1iaXQgY2hhcjYgVlNUX0JCRU5UUlkgc3RyaW5ncy4KKyAgICBCaXRDb2RlQWJicmV2ICpBYmJ2ID0gbmV3IEJpdENvZGVBYmJyZXYoKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKGJpdGM6OlZTVF9DT0RFX0JCRU5UUlkpKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6VkJSLCA4KSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkFycmF5KSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkNoYXI2KSk7CisgICAgaWYgKFN0cmVhbS5FbWl0QmxvY2tJbmZvQWJicmV2KGJpdGM6OlZBTFVFX1NZTVRBQl9CTE9DS19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJidikgIT0gVlNUX0JCRU5UUllfNl9BQkJSRVYpCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGFiYnJldiBvcmRlcmluZyEiKTsKKyAgfQorCisKKworICB7IC8vIFNFVFRZUEUgYWJicmV2IGZvciBDT05TVEFOVFNfQkxPQ0suCisgICAgQml0Q29kZUFiYnJldiAqQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChiaXRjOjpDU1RfQ09ERV9TRVRUWVBFKSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nMl8zMl9DZWlsKFZFLmdldFR5cGVzKCkuc2l6ZSgpKzEpKSk7CisgICAgaWYgKFN0cmVhbS5FbWl0QmxvY2tJbmZvQWJicmV2KGJpdGM6OkNPTlNUQU5UU19CTE9DS19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJidikgIT0gQ09OU1RBTlRTX1NFVFRZUEVfQUJCUkVWKQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBhYmJyZXYgb3JkZXJpbmchIik7CisgIH0KKworICB7IC8vIElOVEVHRVIgYWJicmV2IGZvciBDT05TVEFOVFNfQkxPQ0suCisgICAgQml0Q29kZUFiYnJldiAqQWJidiA9IG5ldyBCaXRDb2RlQWJicmV2KCk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChiaXRjOjpDU1RfQ09ERV9JTlRFR0VSKSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OlZCUiwgOCkpOworICAgIGlmIChTdHJlYW0uRW1pdEJsb2NrSW5mb0FiYnJldihiaXRjOjpDT05TVEFOVFNfQkxPQ0tfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFiYnYpICE9IENPTlNUQU5UU19JTlRFR0VSX0FCQlJFVikKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgYWJicmV2IG9yZGVyaW5nISIpOworICB9CisKKyAgeyAvLyBDRV9DQVNUIGFiYnJldiBmb3IgQ09OU1RBTlRTX0JMT0NLLgorICAgIEJpdENvZGVBYmJyZXYgKkFiYnYgPSBuZXcgQml0Q29kZUFiYnJldigpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6Q1NUX0NPREVfQ0VfQ0FTVCkpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpGaXhlZCwgNCkpOyAgLy8gY2FzdCBvcGMKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsICAgICAgIC8vIHR5cGVpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nMl8zMl9DZWlsKFZFLmdldFR5cGVzKCkuc2l6ZSgpKzEpKSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OlZCUiwgOCkpOyAgICAvLyB2YWx1ZSBpZAorCisgICAgaWYgKFN0cmVhbS5FbWl0QmxvY2tJbmZvQWJicmV2KGJpdGM6OkNPTlNUQU5UU19CTE9DS19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJidikgIT0gQ09OU1RBTlRTX0NFX0NBU1RfQWJicmV2KQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBhYmJyZXYgb3JkZXJpbmchIik7CisgIH0KKyAgeyAvLyBOVUxMIGFiYnJldiBmb3IgQ09OU1RBTlRTX0JMT0NLLgorICAgIEJpdENvZGVBYmJyZXYgKkFiYnYgPSBuZXcgQml0Q29kZUFiYnJldigpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6Q1NUX0NPREVfTlVMTCkpOworICAgIGlmIChTdHJlYW0uRW1pdEJsb2NrSW5mb0FiYnJldihiaXRjOjpDT05TVEFOVFNfQkxPQ0tfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFiYnYpICE9IENPTlNUQU5UU19OVUxMX0FiYnJldikKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgYWJicmV2IG9yZGVyaW5nISIpOworICB9CisKKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG9ubHkgdXNlIHNwYWNlIGZvciBmaXJzdCBjbGFzcyB0eXBlcyEKKworICB7IC8vIElOU1RfTE9BRCBhYmJyZXYgZm9yIEZVTkNUSU9OX0JMT0NLLgorICAgIEJpdENvZGVBYmJyZXYgKkFiYnYgPSBuZXcgQml0Q29kZUFiYnJldigpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6RlVOQ19DT0RFX0lOU1RfTE9BRCkpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpWQlIsIDYpKTsgLy8gUHRyCisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OlZCUiwgNCkpOyAvLyBBbGlnbgorICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpGaXhlZCwgMSkpOyAvLyB2b2xhdGlsZQorICAgIGlmIChTdHJlYW0uRW1pdEJsb2NrSW5mb0FiYnJldihiaXRjOjpGVU5DVElPTl9CTE9DS19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJidikgIT0gRlVOQ1RJT05fSU5TVF9MT0FEX0FCQlJFVikKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgYWJicmV2IG9yZGVyaW5nISIpOworICB9CisgIHsgLy8gSU5TVF9CSU5PUCBhYmJyZXYgZm9yIEZVTkNUSU9OX0JMT0NLLgorICAgIEJpdENvZGVBYmJyZXYgKkFiYnYgPSBuZXcgQml0Q29kZUFiYnJldigpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6RlVOQ19DT0RFX0lOU1RfQklOT1ApKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6VkJSLCA2KSk7IC8vIExIUworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpWQlIsIDYpKTsgLy8gUkhTCisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLCA0KSk7IC8vIG9wYworICAgIGlmIChTdHJlYW0uRW1pdEJsb2NrSW5mb0FiYnJldihiaXRjOjpGVU5DVElPTl9CTE9DS19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJidikgIT0gRlVOQ1RJT05fSU5TVF9CSU5PUF9BQkJSRVYpCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGFiYnJldiBvcmRlcmluZyEiKTsKKyAgfQorICB7IC8vIElOU1RfQklOT1BfRkxBR1MgYWJicmV2IGZvciBGVU5DVElPTl9CTE9DSy4KKyAgICBCaXRDb2RlQWJicmV2ICpBYmJ2ID0gbmV3IEJpdENvZGVBYmJyZXYoKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKGJpdGM6OkZVTkNfQ09ERV9JTlNUX0JJTk9QKSk7CisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OlZCUiwgNikpOyAvLyBMSFMKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6VkJSLCA2KSk7IC8vIFJIUworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpGaXhlZCwgNCkpOyAvLyBvcGMKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDcpKTsgLy8gZmxhZ3MKKyAgICBpZiAoU3RyZWFtLkVtaXRCbG9ja0luZm9BYmJyZXYoYml0Yzo6RlVOQ1RJT05fQkxPQ0tfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFiYnYpICE9IEZVTkNUSU9OX0lOU1RfQklOT1BfRkxBR1NfQUJCUkVWKQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBhYmJyZXYgb3JkZXJpbmchIik7CisgIH0KKyAgeyAvLyBJTlNUX0NBU1QgYWJicmV2IGZvciBGVU5DVElPTl9CTE9DSy4KKyAgICBCaXRDb2RlQWJicmV2ICpBYmJ2ID0gbmV3IEJpdENvZGVBYmJyZXYoKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKGJpdGM6OkZVTkNfQ09ERV9JTlNUX0NBU1QpKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6VkJSLCA2KSk7ICAgIC8vIE9wVmFsCisgICAgQWJidi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLCAgICAgICAvLyBkZXN0IHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cyXzMyX0NlaWwoVkUuZ2V0VHlwZXMoKS5zaXplKCkrMSkpKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDQpKTsgIC8vIG9wYworICAgIGlmIChTdHJlYW0uRW1pdEJsb2NrSW5mb0FiYnJldihiaXRjOjpGVU5DVElPTl9CTE9DS19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJidikgIT0gRlVOQ1RJT05fSU5TVF9DQVNUX0FCQlJFVikKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgYWJicmV2IG9yZGVyaW5nISIpOworICB9CisKKyAgeyAvLyBJTlNUX1JFVCBhYmJyZXYgZm9yIEZVTkNUSU9OX0JMT0NLLgorICAgIEJpdENvZGVBYmJyZXYgKkFiYnYgPSBuZXcgQml0Q29kZUFiYnJldigpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoYml0Yzo6RlVOQ19DT0RFX0lOU1RfUkVUKSk7CisgICAgaWYgKFN0cmVhbS5FbWl0QmxvY2tJbmZvQWJicmV2KGJpdGM6OkZVTkNUSU9OX0JMT0NLX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYmJ2KSAhPSBGVU5DVElPTl9JTlNUX1JFVF9WT0lEX0FCQlJFVikKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgYWJicmV2IG9yZGVyaW5nISIpOworICB9CisgIHsgLy8gSU5TVF9SRVQgYWJicmV2IGZvciBGVU5DVElPTl9CTE9DSy4KKyAgICBCaXRDb2RlQWJicmV2ICpBYmJ2ID0gbmV3IEJpdENvZGVBYmJyZXYoKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKGJpdGM6OkZVTkNfQ09ERV9JTlNUX1JFVCkpOworICAgIEFiYnYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpWQlIsIDYpKTsgLy8gVmFsSUQKKyAgICBpZiAoU3RyZWFtLkVtaXRCbG9ja0luZm9BYmJyZXYoYml0Yzo6RlVOQ1RJT05fQkxPQ0tfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFiYnYpICE9IEZVTkNUSU9OX0lOU1RfUkVUX1ZBTF9BQkJSRVYpCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGFiYnJldiBvcmRlcmluZyEiKTsKKyAgfQorICB7IC8vIElOU1RfVU5SRUFDSEFCTEUgYWJicmV2IGZvciBGVU5DVElPTl9CTE9DSy4KKyAgICBCaXRDb2RlQWJicmV2ICpBYmJ2ID0gbmV3IEJpdENvZGVBYmJyZXYoKTsKKyAgICBBYmJ2LT5BZGQoQml0Q29kZUFiYnJldk9wKGJpdGM6OkZVTkNfQ09ERV9JTlNUX1VOUkVBQ0hBQkxFKSk7CisgICAgaWYgKFN0cmVhbS5FbWl0QmxvY2tJbmZvQWJicmV2KGJpdGM6OkZVTkNUSU9OX0JMT0NLX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYmJ2KSAhPSBGVU5DVElPTl9JTlNUX1VOUkVBQ0hBQkxFX0FCQlJFVikKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgYWJicmV2IG9yZGVyaW5nISIpOworICB9CisKKyAgU3RyZWFtLkV4aXRCbG9jaygpOworfQorCisKKy8vLyBXcml0ZU1vZHVsZSAtIEVtaXQgdGhlIHNwZWNpZmllZCBtb2R1bGUgdG8gdGhlIGJpdHN0cmVhbS4KK3N0YXRpYyB2b2lkIFdyaXRlTW9kdWxlKGNvbnN0IE1vZHVsZSAqTSwgQml0c3RyZWFtV3JpdGVyICZTdHJlYW0pIHsKKyAgU3RyZWFtLkVudGVyU3ViYmxvY2soYml0Yzo6TU9EVUxFX0JMT0NLX0lELCAzKTsKKworICAvLyBFbWl0IHRoZSB2ZXJzaW9uIG51bWJlciBpZiBpdCBpcyBub24temVyby4KKyAgaWYgKEN1clZlcnNpb24pIHsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMT4gVmFsczsKKyAgICBWYWxzLnB1c2hfYmFjayhDdXJWZXJzaW9uKTsKKyAgICBTdHJlYW0uRW1pdFJlY29yZChiaXRjOjpNT0RVTEVfQ09ERV9WRVJTSU9OLCBWYWxzKTsKKyAgfQorCisgIC8vIEFuYWx5emUgdGhlIG1vZHVsZSwgZW51bWVyYXRpbmcgZ2xvYmFscywgZnVuY3Rpb25zLCBldGMuCisgIFZhbHVlRW51bWVyYXRvciBWRShNKTsKKworICAvLyBFbWl0IGJsb2NraW5mbywgd2hpY2ggZGVmaW5lcyB0aGUgc3RhbmRhcmQgYWJicmV2aWF0aW9ucyBldGMuCisgIFdyaXRlQmxvY2tJbmZvKFZFLCBTdHJlYW0pOworCisgIC8vIEVtaXQgaW5mb3JtYXRpb24gYWJvdXQgcGFyYW1ldGVyIGF0dHJpYnV0ZXMuCisgIFdyaXRlQXR0cmlidXRlVGFibGUoVkUsIFN0cmVhbSk7CisKKyAgLy8gRW1pdCBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgdHlwZXMgaW4gdGhlIG1vZHVsZS4KKyAgV3JpdGVUeXBlVGFibGUoVkUsIFN0cmVhbSk7CisKKyAgLy8gRW1pdCB0b3AtbGV2ZWwgZGVzY3JpcHRpb24gb2YgbW9kdWxlLCBpbmNsdWRpbmcgdGFyZ2V0IHRyaXBsZSwgaW5saW5lIGFzbSwKKyAgLy8gZGVzY3JpcHRvcnMgZm9yIGdsb2JhbCB2YXJpYWJsZXMsIGFuZCBmdW5jdGlvbiBwcm90b3R5cGUgaW5mby4KKyAgV3JpdGVNb2R1bGVJbmZvKE0sIFZFLCBTdHJlYW0pOworCisgIC8vIEVtaXQgY29uc3RhbnRzLgorICBXcml0ZU1vZHVsZUNvbnN0YW50cyhWRSwgU3RyZWFtKTsKKworICAvLyBFbWl0IG1ldGFkYXRhLgorICBXcml0ZU1vZHVsZU1ldGFkYXRhKE0sIFZFLCBTdHJlYW0pOworCisgIC8vIEVtaXQgZnVuY3Rpb24gYm9kaWVzLgorICBmb3IgKE1vZHVsZTo6Y29uc3RfaXRlcmF0b3IgSSA9IE0tPmJlZ2luKCksIEUgPSBNLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFJLT5pc0RlY2xhcmF0aW9uKCkpCisgICAgICBXcml0ZUZ1bmN0aW9uKCpJLCBWRSwgU3RyZWFtKTsKKworICAvLyBFbWl0IG1ldGFkYXRhLgorICBXcml0ZU1vZHVsZU1ldGFkYXRhU3RvcmUoTSwgU3RyZWFtKTsKKworICAvLyBFbWl0IHRoZSB0eXBlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbi4KKyAgV3JpdGVUeXBlU3ltYm9sVGFibGUoTS0+Z2V0VHlwZVN5bWJvbFRhYmxlKCksIFZFLCBTdHJlYW0pOworCisgIC8vIEVtaXQgbmFtZXMgZm9yIGdsb2JhbHMvZnVuY3Rpb25zIGV0Yy4KKyAgV3JpdGVWYWx1ZVN5bWJvbFRhYmxlKE0tPmdldFZhbHVlU3ltYm9sVGFibGUoKSwgVkUsIFN0cmVhbSk7CisKKyAgU3RyZWFtLkV4aXRCbG9jaygpOworfQorCisvLy8gRW1pdERhcndpbkJDSGVhZGVyIC0gSWYgZ2VuZXJhdGluZyBhIGJjIGZpbGUgb24gZGFyd2luLCB3ZSBoYXZlIHRvIGVtaXQgYQorLy8vIGhlYWRlciBhbmQgdHJhaWxlciB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCB0aGUgc3lzdGVtIGFyY2hpdmVyLiAgVG8gZG8KKy8vLyB0aGlzIHdlIGVtaXQgdGhlIGZvbGxvd2luZyBoZWFkZXIsIGFuZCB0aGVuIGVtaXQgYSB0cmFpbGVyIHRoYXQgcGFkcyB0aGUKKy8vLyBmaWxlIG91dCB0byBiZSBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLgorLy8vCisvLy8gc3RydWN0IGJjX2hlYWRlciB7CisvLy8gICB1aW50MzJfdCBNYWdpYzsgICAgICAgICAvLyAweDBCMTdDMERFCisvLy8gICB1aW50MzJfdCBWZXJzaW9uOyAgICAgICAvLyBWZXJzaW9uLCBjdXJyZW50bHkgYWx3YXlzIDAuCisvLy8gICB1aW50MzJfdCBCaXRjb2RlT2Zmc2V0OyAvLyBPZmZzZXQgdG8gdHJhZGl0aW9uYWwgYml0Y29kZSBmaWxlLgorLy8vICAgdWludDMyX3QgQml0Y29kZVNpemU7ICAgLy8gU2l6ZSBvZiB0cmFkaXRpb25hbCBiaXRjb2RlIGZpbGUuCisvLy8gICB1aW50MzJfdCBDUFVUeXBlOyAgICAgICAvLyBDUFUgc3BlY2lmaWVyLgorLy8vICAgLi4uIHBvdGVudGlhbGx5IG1vcmUgbGF0ZXIgLi4uCisvLy8gfTsKK2VudW0geworICBEYXJ3aW5CQ1NpemVGaWVsZE9mZnNldCA9IDMqNCwgLy8gT2Zmc2V0IHRvIGJpdGNvZGVfc2l6ZS4KKyAgRGFyd2luQkNIZWFkZXJTaXplID0gNSo0Cit9OworCisvLy8gaXNBUk1UcmlwbGV0IC0gUmV0dXJuIHRydWUgaWYgdGhlIHRyaXBsZXQgbG9va3MgbGlrZToKKy8vLyBhcm0tKiwgdGh1bWItKiwgYXJtdlswLTldLSosIHRodW1idlswLTldLSosIGFybXY1dGUtKiwgb3IgYXJtdjZ0Mi0qLgorc3RhdGljIGJvb2wgaXNBUk1UcmlwbGV0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCkgeworICBzaXplX3QgUG9zID0gMDsKKyAgc2l6ZV90IFNpemUgPSBUVC5zaXplKCk7CisgIGlmIChTaXplID49IDYgJiYKKyAgICAgIFRUWzBdID09ICd0JyAmJiBUVFsxXSA9PSAnaCcgJiYgVFRbMl0gPT0gJ3UnICYmCisgICAgICBUVFszXSA9PSAnbScgJiYgVFRbNF0gPT0gJ2InKQorICAgIFBvcyA9IDU7CisgIGVsc2UgaWYgKFNpemUgPj0gNCAmJiBUVFswXSA9PSAnYScgJiYgVFRbMV0gPT0gJ3InICYmIFRUWzJdID09ICdtJykKKyAgICBQb3MgPSAzOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChUVFtQb3NdID09ICctJykKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZSBpZiAoVFRbUG9zXSA9PSAndicpIHsKKyAgICBpZiAoU2l6ZSA+PSBQb3MrNCAmJgorICAgICAgICBUVFtQb3MrMV0gPT0gJzYnICYmIFRUW1BvcysyXSA9PSAndCcgJiYgVFRbUG9zKzNdID09ICcyJykKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UgaWYgKFNpemUgPj0gUG9zKzQgJiYKKyAgICAgICAgICAgICBUVFtQb3MrMV0gPT0gJzUnICYmIFRUW1BvcysyXSA9PSAndCcgJiYgVFRbUG9zKzNdID09ICdlJykKKyAgICAgIHJldHVybiB0cnVlOworICB9IGVsc2UKKyAgICByZXR1cm4gZmFsc2U7CisgIHdoaWxlICgrK1BvcyA8IFNpemUgJiYgVFRbUG9zXSAhPSAnLScpIHsKKyAgICBpZiAoIWlzZGlnaXQoVFRbUG9zXSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIEVtaXREYXJ3aW5CQ0hlYWRlcihCaXRzdHJlYW1Xcml0ZXIgJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVFQpIHsKKyAgdW5zaWduZWQgQ1BVVHlwZSA9IH4wVTsKKworICAvLyBNYXRjaCB4ODZfNjQtKiwgaVszLTldODYtKiwgcG93ZXJwYy0qLCBwb3dlcnBjNjQtKiwgYXJtLSosIHRodW1iLSosCisgIC8vIGFybXZbMC05XS0qLCB0aHVtYnZbMC05XS0qLCBhcm12NXRlLSosIG9yIGFybXY2dDItKi4gVGhlIENQVVR5cGUgaXMgYSBtYWdpYworICAvLyBudW1iZXIgZnJvbSAvdXNyL2luY2x1ZGUvbWFjaC9tYWNoaW5lLmguICBJdCBpcyBvayB0byByZXByb2R1Y2UgdGhlCisgIC8vIHNwZWNpZmljIGNvbnN0YW50cyBoZXJlIGJlY2F1c2UgdGhleSBhcmUgaW1wbGljaXRseSBwYXJ0IG9mIHRoZSBEYXJ3aW4gQUJJLgorICBlbnVtIHsKKyAgICBEQVJXSU5fQ1BVX0FSQ0hfQUJJNjQgICAgICA9IDB4MDEwMDAwMDAsCisgICAgREFSV0lOX0NQVV9UWVBFX1g4NiAgICAgICAgPSA3LAorICAgIERBUldJTl9DUFVfVFlQRV9BUk0gICAgICAgID0gMTIsCisgICAgREFSV0lOX0NQVV9UWVBFX1BPV0VSUEMgICAgPSAxOAorICB9OworCisgIGlmIChUVC5maW5kKCJ4ODZfNjQtIikgPT0gMCkKKyAgICBDUFVUeXBlID0gREFSV0lOX0NQVV9UWVBFX1g4NiB8IERBUldJTl9DUFVfQVJDSF9BQkk2NDsKKyAgZWxzZSBpZiAoVFQuc2l6ZSgpID49IDUgJiYgVFRbMF0gPT0gJ2knICYmIFRUWzJdID09ICc4JyAmJiBUVFszXSA9PSAnNicgJiYKKyAgICAgICAgICAgVFRbNF0gPT0gJy0nICYmIFRUWzFdIC0gJzMnIDwgNikKKyAgICBDUFVUeXBlID0gREFSV0lOX0NQVV9UWVBFX1g4NjsKKyAgZWxzZSBpZiAoVFQuZmluZCgicG93ZXJwYy0iKSA9PSAwKQorICAgIENQVVR5cGUgPSBEQVJXSU5fQ1BVX1RZUEVfUE9XRVJQQzsKKyAgZWxzZSBpZiAoVFQuZmluZCgicG93ZXJwYzY0LSIpID09IDApCisgICAgQ1BVVHlwZSA9IERBUldJTl9DUFVfVFlQRV9QT1dFUlBDIHwgREFSV0lOX0NQVV9BUkNIX0FCSTY0OworICBlbHNlIGlmIChpc0FSTVRyaXBsZXQoVFQpKQorICAgIENQVVR5cGUgPSBEQVJXSU5fQ1BVX1RZUEVfQVJNOworCisgIC8vIFRyYWRpdGlvbmFsIEJpdGNvZGUgc3RhcnRzIGFmdGVyIGhlYWRlci4KKyAgdW5zaWduZWQgQkNPZmZzZXQgPSBEYXJ3aW5CQ0hlYWRlclNpemU7CisKKyAgU3RyZWFtLkVtaXQoMHgwQjE3QzBERSwgMzIpOworICBTdHJlYW0uRW1pdCgwICAgICAgICAgLCAzMik7ICAvLyBWZXJzaW9uLgorICBTdHJlYW0uRW1pdChCQ09mZnNldCAgLCAzMik7CisgIFN0cmVhbS5FbWl0KDAgICAgICAgICAsIDMyKTsgIC8vIEZpbGxlZCBpbiBsYXRlci4KKyAgU3RyZWFtLkVtaXQoQ1BVVHlwZSAgICwgMzIpOworfQorCisvLy8gRW1pdERhcndpbkJDVHJhaWxlciAtIEVtaXQgdGhlIGRhcndpbiBlcGlsb2cgYWZ0ZXIgdGhlIGJpdGNvZGUgZmlsZSBhbmQKKy8vLyBmaW5hbGl6ZSB0aGUgaGVhZGVyLgorc3RhdGljIHZvaWQgRW1pdERhcndpbkJDVHJhaWxlcihCaXRzdHJlYW1Xcml0ZXIgJlN0cmVhbSwgdW5zaWduZWQgQnVmZmVyU2l6ZSkgeworICAvLyBVcGRhdGUgdGhlIHNpemUgZmllbGQgaW4gdGhlIGhlYWRlci4KKyAgU3RyZWFtLkJhY2twYXRjaFdvcmQoRGFyd2luQkNTaXplRmllbGRPZmZzZXQsIEJ1ZmZlclNpemUtRGFyd2luQkNIZWFkZXJTaXplKTsKKworICAvLyBJZiB0aGUgZmlsZSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiBieXRlcywgaW5zZXJ0IGR1bW15IHBhZGRpbmcuCisgIHdoaWxlIChCdWZmZXJTaXplICYgMTUpIHsKKyAgICBTdHJlYW0uRW1pdCgwLCA4KTsKKyAgICArK0J1ZmZlclNpemU7CisgIH0KK30KKworCisvLy8gV3JpdGVCaXRjb2RlVG9GaWxlIC0gV3JpdGUgdGhlIHNwZWNpZmllZCBtb2R1bGUgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQKKy8vLyBzdHJlYW0uCit2b2lkIGxsdm06OldyaXRlQml0Y29kZVRvRmlsZShjb25zdCBNb2R1bGUgKk0sIHJhd19vc3RyZWFtICZPdXQpIHsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gQnVmZmVyOworICBCaXRzdHJlYW1Xcml0ZXIgU3RyZWFtKEJ1ZmZlcik7CisKKyAgQnVmZmVyLnJlc2VydmUoMjU2KjEwMjQpOworCisgIFdyaXRlQml0Y29kZVRvU3RyZWFtKCBNLCBTdHJlYW0gKTsKKworICAvLyBXcml0ZSB0aGUgZ2VuZXJhdGVkIGJpdHN0cmVhbSB0byAiT3V0Ii4KKyAgT3V0LndyaXRlKChjaGFyKikmQnVmZmVyLmZyb250KCksIEJ1ZmZlci5zaXplKCkpOworfQorCisvLy8gV3JpdGVCaXRjb2RlVG9TdHJlYW0gLSBXcml0ZSB0aGUgc3BlY2lmaWVkIG1vZHVsZSB0byB0aGUgc3BlY2lmaWVkIG91dHB1dAorLy8vIHN0cmVhbS4KK3ZvaWQgbGx2bTo6V3JpdGVCaXRjb2RlVG9TdHJlYW0oY29uc3QgTW9kdWxlICpNLCBCaXRzdHJlYW1Xcml0ZXIgJlN0cmVhbSkgeworICAvLyBJZiB0aGlzIGlzIGRhcndpbiwgZW1pdCBhIGZpbGUgaGVhZGVyIGFuZCB0cmFpbGVyIGlmIG5lZWRlZC4KKyAgYm9vbCBpc0RhcndpbiA9IE0tPmdldFRhcmdldFRyaXBsZSgpLmZpbmQoIi1kYXJ3aW4iKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgaWYgKGlzRGFyd2luKQorICAgIEVtaXREYXJ3aW5CQ0hlYWRlcihTdHJlYW0sIE0tPmdldFRhcmdldFRyaXBsZSgpKTsKKworICAvLyBFbWl0IHRoZSBmaWxlIGhlYWRlci4KKyAgU3RyZWFtLkVtaXQoKHVuc2lnbmVkKSdCJywgOCk7CisgIFN0cmVhbS5FbWl0KCh1bnNpZ25lZCknQycsIDgpOworICBTdHJlYW0uRW1pdCgweDAsIDQpOworICBTdHJlYW0uRW1pdCgweEMsIDQpOworICBTdHJlYW0uRW1pdCgweEUsIDQpOworICBTdHJlYW0uRW1pdCgweEQsIDQpOworCisgIC8vIEVtaXQgdGhlIG1vZHVsZS4KKyAgV3JpdGVNb2R1bGUoTSwgU3RyZWFtKTsKKworICBpZiAoaXNEYXJ3aW4pCisgICAgRW1pdERhcndpbkJDVHJhaWxlcihTdHJlYW0sIFN0cmVhbS5nZXRCdWZmZXIoKS5zaXplKCkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0JpdGNvZGUvV3JpdGVyL0JpdGNvZGVXcml0ZXJQYXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1dyaXRlci9CaXRjb2RlV3JpdGVyUGFzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMTE1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1dyaXRlci9CaXRjb2RlV3JpdGVyUGFzcy5jcHAKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tLS0gQml0Y29kZS9Xcml0ZXIvQml0Y29kZVdyaXRlclBhc3MuY3BwIC0gQml0Y29kZSBXcml0ZXIgLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBCaXRjb2RlV3JpdGVyUGFzcyBpbXBsZW1lbnRhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL1JlYWRlcldyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIFdyaXRlQml0Y29kZVBhc3MgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgICAgcmF3X29zdHJlYW0gJk9TOyAvLyByYXdfb3N0cmVhbSB0byBwcmludCBvbgorICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBleHBsaWNpdCBXcml0ZUJpdGNvZGVQYXNzKHJhd19vc3RyZWFtICZvKQorICAgICAgOiBNb2R1bGVQYXNzKElEKSwgT1Mobykge30KKyAgICAKKyAgICBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJCaXRjb2RlIFdyaXRlciI7IH0KKyAgICAKKyAgICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICAgICAgV3JpdGVCaXRjb2RlVG9GaWxlKCZNLCBPUyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9OworfQorCitjaGFyIFdyaXRlQml0Y29kZVBhc3M6OklEID0gMDsKKworLy8vIGNyZWF0ZUJpdGNvZGVXcml0ZXJQYXNzIC0gQ3JlYXRlIGFuZCByZXR1cm4gYSBwYXNzIHRoYXQgd3JpdGVzIHRoZSBtb2R1bGUKKy8vLyB0byB0aGUgc3BlY2lmaWVkIG9zdHJlYW0uCitNb2R1bGVQYXNzICpsbHZtOjpjcmVhdGVCaXRjb2RlV3JpdGVyUGFzcyhyYXdfb3N0cmVhbSAmU3RyKSB7CisgIHJldHVybiBuZXcgV3JpdGVCaXRjb2RlUGFzcyhTdHIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0JpdGNvZGUvV3JpdGVyL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL0JpdGNvZGUvV3JpdGVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTdiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQml0Y29kZS9Xcml0ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1CaXRXcml0ZXIKKyAgQml0V3JpdGVyLmNwcAorICBCaXRjb2RlV3JpdGVyLmNwcAorICBCaXRjb2RlV3JpdGVyUGFzcy5jcHAKKyAgVmFsdWVFbnVtZXJhdG9yLmNwcAorICApCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQml0Y29kZS9Xcml0ZXIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvQml0Y29kZS9Xcml0ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYmQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1dyaXRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL0JpdGNvZGUvUmVhZGVyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1CaXRXcml0ZXIKK0JVSUxEX0FSQ0hJVkUgPSAxCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1dyaXRlci9WYWx1ZUVudW1lcmF0b3IuY3BwIGIvc3JjL0xMVk0vbGliL0JpdGNvZGUvV3JpdGVyL1ZhbHVlRW51bWVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwYzUyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9CaXRjb2RlL1dyaXRlci9WYWx1ZUVudW1lcmF0b3IuY3BwCkBAIC0wLDAgKzEsNDU1IEBACisvLz09PS0tIFZhbHVlRW51bWVyYXRvci5jcHAgLSBOdW1iZXIgdmFsdWVzIGFuZCB0eXBlcyBmb3IgYml0Y29kZSB3cml0ZXIgLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBWYWx1ZUVudW1lcmF0b3IgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlZhbHVlRW51bWVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZVN5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9WYWx1ZVN5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIGJvb2wgaXNTaW5nbGVWYWx1ZVR5cGUoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IGxsdm06OlR5cGUqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50PiAmUCkgeworICByZXR1cm4gUC5maXJzdC0+aXNTaW5nbGVWYWx1ZVR5cGUoKTsKK30KKworc3RhdGljIGJvb2wgaXNJbnRlZ2VyVmFsdWUoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IFZhbHVlKiwgdW5zaWduZWQ+ICZWKSB7CisgIHJldHVybiBWLmZpcnN0LT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCk7Cit9CisKK3N0YXRpYyBib29sIENvbXBhcmVCeUZyZXF1ZW5jeShjb25zdCBzdGQ6OnBhaXI8Y29uc3QgbGx2bTo6VHlwZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50PiAmUDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPGNvbnN0IGxsdm06OlR5cGUqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludD4gJlAyKSB7CisgIHJldHVybiBQMS5zZWNvbmQgPiBQMi5zZWNvbmQ7Cit9CisKKy8vLyBWYWx1ZUVudW1lcmF0b3IgLSBFbnVtZXJhdGUgbW9kdWxlLWxldmVsIGluZm9ybWF0aW9uLgorVmFsdWVFbnVtZXJhdG9yOjpWYWx1ZUVudW1lcmF0b3IoY29uc3QgTW9kdWxlICpNKSB7CisgIC8vIEVudW1lcmF0ZSB0aGUgZ2xvYmFsIHZhcmlhYmxlcy4KKyAgZm9yIChNb2R1bGU6OmNvbnN0X2dsb2JhbF9pdGVyYXRvciBJID0gTS0+Z2xvYmFsX2JlZ2luKCksCisgICAgICAgICBFID0gTS0+Z2xvYmFsX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBFbnVtZXJhdGVWYWx1ZShJKTsKKworICAvLyBFbnVtZXJhdGUgdGhlIGZ1bmN0aW9ucy4KKyAgZm9yIChNb2R1bGU6OmNvbnN0X2l0ZXJhdG9yIEkgPSBNLT5iZWdpbigpLCBFID0gTS0+ZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgRW51bWVyYXRlVmFsdWUoSSk7CisgICAgRW51bWVyYXRlQXR0cmlidXRlcyhjYXN0PEZ1bmN0aW9uPihJKS0+Z2V0QXR0cmlidXRlcygpKTsKKyAgfQorCisgIC8vIEVudW1lcmF0ZSB0aGUgYWxpYXNlcy4KKyAgZm9yIChNb2R1bGU6OmNvbnN0X2FsaWFzX2l0ZXJhdG9yIEkgPSBNLT5hbGlhc19iZWdpbigpLCBFID0gTS0+YWxpYXNfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgRW51bWVyYXRlVmFsdWUoSSk7CisKKyAgLy8gUmVtZW1iZXIgd2hhdCBpcyB0aGUgY3V0b2ZmIGJldHdlZW4gZ2xvYmFsdmFsdWUncyBhbmQgb3RoZXIgY29uc3RhbnRzLgorICB1bnNpZ25lZCBGaXJzdENvbnN0YW50ID0gVmFsdWVzLnNpemUoKTsKKworICAvLyBFbnVtZXJhdGUgdGhlIGdsb2JhbCB2YXJpYWJsZSBpbml0aWFsaXplcnMuCisgIGZvciAoTW9kdWxlOjpjb25zdF9nbG9iYWxfaXRlcmF0b3IgSSA9IE0tPmdsb2JhbF9iZWdpbigpLAorICAgICAgICAgRSA9IE0tPmdsb2JhbF9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKEktPmhhc0luaXRpYWxpemVyKCkpCisgICAgICBFbnVtZXJhdGVWYWx1ZShJLT5nZXRJbml0aWFsaXplcigpKTsKKworICAvLyBFbnVtZXJhdGUgdGhlIGFsaWFzZWVzLgorICBmb3IgKE1vZHVsZTo6Y29uc3RfYWxpYXNfaXRlcmF0b3IgSSA9IE0tPmFsaWFzX2JlZ2luKCksIEUgPSBNLT5hbGlhc19lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBFbnVtZXJhdGVWYWx1ZShJLT5nZXRBbGlhc2VlKCkpOworCisgIC8vIEVudW1lcmF0ZSB0eXBlcyB1c2VkIGJ5IHRoZSB0eXBlIHN5bWJvbCB0YWJsZS4KKyAgRW51bWVyYXRlVHlwZVN5bWJvbFRhYmxlKE0tPmdldFR5cGVTeW1ib2xUYWJsZSgpKTsKKworICAvLyBJbnNlcnQgY29uc3RhbnRzIGFuZCBtZXRhZGF0YSB0aGF0IGFyZSBuYW1lZCBhdCBtb2R1bGUgbGV2ZWwgaW50byB0aGUgc2xvdCAKKyAgLy8gcG9vbCBzbyB0aGF0IHRoZSBtb2R1bGUgc3ltYm9sIHRhYmxlIGNhbiByZWZlciB0byB0aGVtLi4uCisgIEVudW1lcmF0ZVZhbHVlU3ltYm9sVGFibGUoTS0+Z2V0VmFsdWVTeW1ib2xUYWJsZSgpKTsKKyAgRW51bWVyYXRlTmFtZWRNZXRhZGF0YShNKTsKKworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIE1ETm9kZSo+LCA4PiBNRHM7CisKKyAgLy8gRW51bWVyYXRlIHR5cGVzIHVzZWQgYnkgZnVuY3Rpb24gYm9kaWVzIGFuZCBhcmd1bWVudCBsaXN0cy4KKyAgZm9yIChNb2R1bGU6OmNvbnN0X2l0ZXJhdG9yIEYgPSBNLT5iZWdpbigpLCBFID0gTS0+ZW5kKCk7IEYgIT0gRTsgKytGKSB7CisKKyAgICBmb3IgKEZ1bmN0aW9uOjpjb25zdF9hcmdfaXRlcmF0b3IgSSA9IEYtPmFyZ19iZWdpbigpLCBFID0gRi0+YXJnX2VuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBFbnVtZXJhdGVUeXBlKEktPmdldFR5cGUoKSk7CisKKyAgICBmb3IgKEZ1bmN0aW9uOjpjb25zdF9pdGVyYXRvciBCQiA9IEYtPmJlZ2luKCksIEUgPSBGLT5lbmQoKTsgQkIgIT0gRTsgKytCQikKKyAgICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBJIT1FOysrSSl7CisgICAgICAgIGZvciAoVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3IgT0kgPSBJLT5vcF9iZWdpbigpLCBFID0gSS0+b3BfZW5kKCk7CisgICAgICAgICAgICAgT0kgIT0gRTsgKytPSSkgeworICAgICAgICAgIGlmIChNRE5vZGUgKk1EID0gZHluX2Nhc3Q8TUROb2RlPigqT0kpKQorICAgICAgICAgICAgaWYgKE1ELT5pc0Z1bmN0aW9uTG9jYWwoKSAmJiBNRC0+Z2V0RnVuY3Rpb24oKSkKKyAgICAgICAgICAgICAgLy8gVGhlc2Ugd2lsbCBnZXQgZW51bWVyYXRlZCBkdXJpbmcgZnVuY3Rpb24taW5jb3Jwb3JhdGlvbi4KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgRW51bWVyYXRlT3BlcmFuZFR5cGUoKk9JKTsKKyAgICAgICAgfQorICAgICAgICBFbnVtZXJhdGVUeXBlKEktPmdldFR5cGUoKSk7CisgICAgICAgIGlmIChjb25zdCBDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oSSkpCisgICAgICAgICAgRW51bWVyYXRlQXR0cmlidXRlcyhDSS0+Z2V0QXR0cmlidXRlcygpKTsKKyAgICAgICAgZWxzZSBpZiAoY29uc3QgSW52b2tlSW5zdCAqSUkgPSBkeW5fY2FzdDxJbnZva2VJbnN0PihJKSkKKyAgICAgICAgICBFbnVtZXJhdGVBdHRyaWJ1dGVzKElJLT5nZXRBdHRyaWJ1dGVzKCkpOworCisgICAgICAgIC8vIEVudW1lcmF0ZSBtZXRhZGF0YSBhdHRhY2hlZCB3aXRoIHRoaXMgaW5zdHJ1Y3Rpb24uCisgICAgICAgIE1Ecy5jbGVhcigpOworICAgICAgICBJLT5nZXRBbGxNZXRhZGF0YU90aGVyVGhhbkRlYnVnTG9jKE1Ecyk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNRHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBFbnVtZXJhdGVNZXRhZGF0YShNRHNbaV0uc2Vjb25kKTsKKyAgICAgICAgCisgICAgICAgIGlmICghSS0+Z2V0RGVidWdMb2MoKS5pc1Vua25vd24oKSkgeworICAgICAgICAgIE1ETm9kZSAqU2NvcGUsICpJQTsKKyAgICAgICAgICBJLT5nZXREZWJ1Z0xvYygpLmdldFNjb3BlQW5kSW5saW5lZEF0KFNjb3BlLCBJQSwgSS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgICAgICBpZiAoU2NvcGUpIEVudW1lcmF0ZU1ldGFkYXRhKFNjb3BlKTsKKyAgICAgICAgICBpZiAoSUEpIEVudW1lcmF0ZU1ldGFkYXRhKElBKTsKKyAgICAgICAgfQorICAgICAgfQorICB9CisKKyAgLy8gT3B0aW1pemUgY29uc3RhbnQgb3JkZXJpbmcuCisgIE9wdGltaXplQ29uc3RhbnRzKEZpcnN0Q29uc3RhbnQsIFZhbHVlcy5zaXplKCkpOworCisgIC8vIFNvcnQgdGhlIHR5cGUgdGFibGUgYnkgZnJlcXVlbmN5IHNvIHRoYXQgbW9zdCBjb21tb25seSB1c2VkIHR5cGVzIGFyZSBlYXJseQorICAvLyBpbiB0aGUgdGFibGUgKGhhdmUgbG93IGJpdC13aWR0aCkuCisgIHN0ZDo6c3RhYmxlX3NvcnQoVHlwZXMuYmVnaW4oKSwgVHlwZXMuZW5kKCksIENvbXBhcmVCeUZyZXF1ZW5jeSk7CisKKyAgLy8gUGFydGl0aW9uIHRoZSBUeXBlIElEJ3Mgc28gdGhhdCB0aGUgc2luZ2xlLXZhbHVlIHR5cGVzIG9jY3VyIGJlZm9yZSB0aGUKKyAgLy8gYWdncmVnYXRlIHR5cGVzLiAgVGhpcyBhbGxvd3MgdGhlIGFnZ3JlZ2F0ZSB0eXBlcyB0byBiZSBkcm9wcGVkIGZyb20gdGhlCisgIC8vIHR5cGUgdGFibGUgYWZ0ZXIgcGFyc2luZyB0aGUgZ2xvYmFsIHZhcmlhYmxlIGluaXRpYWxpemVycy4KKyAgc3RkOjpwYXJ0aXRpb24oVHlwZXMuYmVnaW4oKSwgVHlwZXMuZW5kKCksIGlzU2luZ2xlVmFsdWVUeXBlKTsKKworICAvLyBOb3cgdGhhdCB3ZSByZWFycmFuZ2VkIHRoZSB0eXBlIHRhYmxlLCByZWJ1aWxkIFR5cGVNYXAuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUeXBlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFR5cGVNYXBbVHlwZXNbaV0uZmlyc3RdID0gaSsxOworfQorCit1bnNpZ25lZCBWYWx1ZUVudW1lcmF0b3I6OmdldEluc3RydWN0aW9uSUQoY29uc3QgSW5zdHJ1Y3Rpb24gKkluc3QpIGNvbnN0IHsKKyAgSW5zdHJ1Y3Rpb25NYXBUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gSW5zdHJ1Y3Rpb25NYXAuZmluZChJbnN0KTsKKyAgYXNzZXJ0IChJICE9IEluc3RydWN0aW9uTWFwLmVuZCgpICYmICJJbnN0cnVjdGlvbiBpcyBub3QgbWFwcGVkISIpOworICAgIHJldHVybiBJLT5zZWNvbmQ7Cit9CisKK3ZvaWQgVmFsdWVFbnVtZXJhdG9yOjpzZXRJbnN0cnVjdGlvbklEKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgIEluc3RydWN0aW9uTWFwW0ldID0gSW5zdHJ1Y3Rpb25Db3VudCsrOworfQorCit1bnNpZ25lZCBWYWx1ZUVudW1lcmF0b3I6OmdldFZhbHVlSUQoY29uc3QgVmFsdWUgKlYpIGNvbnN0IHsKKyAgaWYgKGlzYTxNRE5vZGU+KFYpIHx8IGlzYTxNRFN0cmluZz4oVikpIHsKKyAgICBWYWx1ZU1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIEkgPSBNRFZhbHVlTWFwLmZpbmQoVik7CisgICAgYXNzZXJ0KEkgIT0gTURWYWx1ZU1hcC5lbmQoKSAmJiAiVmFsdWUgbm90IGluIHNsb3RjYWxjdWxhdG9yISIpOworICAgIHJldHVybiBJLT5zZWNvbmQtMTsKKyAgfQorCisgIFZhbHVlTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IgSSA9IFZhbHVlTWFwLmZpbmQoVik7CisgIGFzc2VydChJICE9IFZhbHVlTWFwLmVuZCgpICYmICJWYWx1ZSBub3QgaW4gc2xvdGNhbGN1bGF0b3IhIik7CisgIHJldHVybiBJLT5zZWNvbmQtMTsKK30KKworLy8gT3B0aW1pemUgY29uc3RhbnQgb3JkZXJpbmcuCituYW1lc3BhY2UgeworICBzdHJ1Y3QgQ3N0U29ydFByZWRpY2F0ZSB7CisgICAgVmFsdWVFbnVtZXJhdG9yICZWRTsKKyAgICBleHBsaWNpdCBDc3RTb3J0UHJlZGljYXRlKFZhbHVlRW51bWVyYXRvciAmdmUpIDogVkUodmUpIHt9CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBWYWx1ZSosIHVuc2lnbmVkPiAmTEhTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnBhaXI8Y29uc3QgVmFsdWUqLCB1bnNpZ25lZD4gJlJIUykgeworICAgICAgLy8gU29ydCBieSBwbGFuZS4KKyAgICAgIGlmIChMSFMuZmlyc3QtPmdldFR5cGUoKSAhPSBSSFMuZmlyc3QtPmdldFR5cGUoKSkKKyAgICAgICAgcmV0dXJuIFZFLmdldFR5cGVJRChMSFMuZmlyc3QtPmdldFR5cGUoKSkgPAorICAgICAgICAgICAgICAgVkUuZ2V0VHlwZUlEKFJIUy5maXJzdC0+Z2V0VHlwZSgpKTsKKyAgICAgIC8vIFRoZW4gYnkgZnJlcXVlbmN5LgorICAgICAgcmV0dXJuIExIUy5zZWNvbmQgPiBSSFMuc2Vjb25kOworICAgIH0KKyAgfTsKK30KKworLy8vIE9wdGltaXplQ29uc3RhbnRzIC0gUmVvcmRlciBjb25zdGFudCBwb29sIGZvciBkZW5zZXIgZW5jb2RpbmcuCit2b2lkIFZhbHVlRW51bWVyYXRvcjo6T3B0aW1pemVDb25zdGFudHModW5zaWduZWQgQ3N0U3RhcnQsIHVuc2lnbmVkIENzdEVuZCkgeworICBpZiAoQ3N0U3RhcnQgPT0gQ3N0RW5kIHx8IENzdFN0YXJ0KzEgPT0gQ3N0RW5kKSByZXR1cm47CisKKyAgQ3N0U29ydFByZWRpY2F0ZSBQKCp0aGlzKTsKKyAgc3RkOjpzdGFibGVfc29ydChWYWx1ZXMuYmVnaW4oKStDc3RTdGFydCwgVmFsdWVzLmJlZ2luKCkrQ3N0RW5kLCBQKTsKKworICAvLyBFbnN1cmUgdGhhdCBpbnRlZ2VyIGNvbnN0YW50cyBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb25zdGFudCBwb29sLiAgVGhpcworICAvLyBpcyBpbXBvcnRhbnQgc28gdGhhdCBHRVAgc3RydWN0dXJlIGluZGljZXMgY29tZSBiZWZvcmUgZ2VwIGNvbnN0YW50IGV4cHJzLgorICBzdGQ6OnBhcnRpdGlvbihWYWx1ZXMuYmVnaW4oKStDc3RTdGFydCwgVmFsdWVzLmJlZ2luKCkrQ3N0RW5kLAorICAgICAgICAgICAgICAgICBpc0ludGVnZXJWYWx1ZSk7CisKKyAgLy8gUmVidWlsZCB0aGUgbW9kaWZpZWQgcG9ydGlvbiBvZiBWYWx1ZU1hcC4KKyAgZm9yICg7IENzdFN0YXJ0ICE9IENzdEVuZDsgKytDc3RTdGFydCkKKyAgICBWYWx1ZU1hcFtWYWx1ZXNbQ3N0U3RhcnRdLmZpcnN0XSA9IENzdFN0YXJ0KzE7Cit9CisKKworLy8vIEVudW1lcmF0ZVR5cGVTeW1ib2xUYWJsZSAtIEluc2VydCBhbGwgb2YgdGhlIHR5cGVzIGluIHRoZSBzcGVjaWZpZWQgc3ltYm9sCisvLy8gdGFibGUuCit2b2lkIFZhbHVlRW51bWVyYXRvcjo6RW51bWVyYXRlVHlwZVN5bWJvbFRhYmxlKGNvbnN0IFR5cGVTeW1ib2xUYWJsZSAmVFNUKSB7CisgIGZvciAoVHlwZVN5bWJvbFRhYmxlOjpjb25zdF9pdGVyYXRvciBUSSA9IFRTVC5iZWdpbigpLCBURSA9IFRTVC5lbmQoKTsKKyAgICAgICBUSSAhPSBURTsgKytUSSkKKyAgICBFbnVtZXJhdGVUeXBlKFRJLT5zZWNvbmQpOworfQorCisvLy8gRW51bWVyYXRlVmFsdWVTeW1ib2xUYWJsZSAtIEluc2VydCBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGUgc3BlY2lmaWVkIHN5bWJvbAorLy8vIHRhYmxlIGludG8gdGhlIHZhbHVlcyB0YWJsZS4KK3ZvaWQgVmFsdWVFbnVtZXJhdG9yOjpFbnVtZXJhdGVWYWx1ZVN5bWJvbFRhYmxlKGNvbnN0IFZhbHVlU3ltYm9sVGFibGUgJlZTVCkgeworICBmb3IgKFZhbHVlU3ltYm9sVGFibGU6OmNvbnN0X2l0ZXJhdG9yIFZJID0gVlNULmJlZ2luKCksIFZFID0gVlNULmVuZCgpOworICAgICAgIFZJICE9IFZFOyArK1ZJKQorICAgIEVudW1lcmF0ZVZhbHVlKFZJLT5nZXRWYWx1ZSgpKTsKK30KKworLy8vIEVudW1lcmF0ZU5hbWVkTWV0YWRhdGEgLSBJbnNlcnQgYWxsIG9mIHRoZSB2YWx1ZXMgcmVmZXJlbmNlZCBieQorLy8vIG5hbWVkIG1ldGFkYXRhIGluIHRoZSBzcGVjaWZpZWQgbW9kdWxlLgordm9pZCBWYWx1ZUVudW1lcmF0b3I6OkVudW1lcmF0ZU5hbWVkTWV0YWRhdGEoY29uc3QgTW9kdWxlICpNKSB7CisgIGZvciAoTW9kdWxlOjpjb25zdF9uYW1lZF9tZXRhZGF0YV9pdGVyYXRvciBJID0gTS0+bmFtZWRfbWV0YWRhdGFfYmVnaW4oKSwKKyAgICAgICBFID0gTS0+bmFtZWRfbWV0YWRhdGFfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIEVudW1lcmF0ZU5hbWVkTUROb2RlKEkpOworfQorCit2b2lkIFZhbHVlRW51bWVyYXRvcjo6RW51bWVyYXRlTmFtZWRNRE5vZGUoY29uc3QgTmFtZWRNRE5vZGUgKk1EKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNRC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKE1ETm9kZSAqRSA9IE1ELT5nZXRPcGVyYW5kKGkpKQorICAgICAgRW51bWVyYXRlVmFsdWUoRSk7Cit9CisKK3ZvaWQgVmFsdWVFbnVtZXJhdG9yOjpFbnVtZXJhdGVNZXRhZGF0YShjb25zdCBWYWx1ZSAqTUQpIHsKKyAgYXNzZXJ0KChpc2E8TUROb2RlPihNRCkgfHwgaXNhPE1EU3RyaW5nPihNRCkpICYmICJJbnZhbGlkIG1ldGFkYXRhIGtpbmQiKTsKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgYWxyZWFkeSBpbiEKKyAgdW5zaWduZWQgJk1EVmFsdWVJRCA9IE1EVmFsdWVNYXBbTURdOworICBpZiAoTURWYWx1ZUlEKSB7CisgICAgLy8gSW5jcmVtZW50IHVzZSBjb3VudC4KKyAgICBNRFZhbHVlc1tNRFZhbHVlSUQtMV0uc2Vjb25kKys7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRW51bWVyYXRlIHRoZSB0eXBlIG9mIHRoaXMgdmFsdWUuCisgIEVudW1lcmF0ZVR5cGUoTUQtPmdldFR5cGUoKSk7CisKKyAgaWYgKGNvbnN0IE1ETm9kZSAqTiA9IGR5bl9jYXN0PE1ETm9kZT4oTUQpKSB7CisgICAgTURWYWx1ZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE1ELCAxVSkpOworICAgIE1EVmFsdWVNYXBbTURdID0gTURWYWx1ZXMuc2l6ZSgpOworICAgIE1EVmFsdWVJRCA9IE1EVmFsdWVzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChWYWx1ZSAqViA9IE4tPmdldE9wZXJhbmQoaSkpCisgICAgICAgIEVudW1lcmF0ZVZhbHVlKFYpOworICAgICAgZWxzZQorICAgICAgICBFbnVtZXJhdGVUeXBlKFR5cGU6OmdldFZvaWRUeShNRC0+Z2V0Q29udGV4dCgpKSk7CisgICAgfQorICAgIGlmIChOLT5pc0Z1bmN0aW9uTG9jYWwoKSAmJiBOLT5nZXRGdW5jdGlvbigpKQorICAgICAgRnVuY3Rpb25Mb2NhbE1Ecy5wdXNoX2JhY2soTik7CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBBZGQgdGhlIHZhbHVlLgorICBhc3NlcnQoaXNhPE1EU3RyaW5nPihNRCkgJiYgIlVua25vd24gbWV0YWRhdGEga2luZCIpOworICBNRFZhbHVlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTUQsIDFVKSk7CisgIE1EVmFsdWVJRCA9IE1EVmFsdWVzLnNpemUoKTsKK30KKwordm9pZCBWYWx1ZUVudW1lcmF0b3I6OkVudW1lcmF0ZVZhbHVlKGNvbnN0IFZhbHVlICpWKSB7CisgIGFzc2VydCghVi0+Z2V0VHlwZSgpLT5pc1ZvaWRUeSgpICYmICJDYW4ndCBpbnNlcnQgdm9pZCB2YWx1ZXMhIik7CisgIGlmIChpc2E8TUROb2RlPihWKSB8fCBpc2E8TURTdHJpbmc+KFYpKQorICAgIHJldHVybiBFbnVtZXJhdGVNZXRhZGF0YShWKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBhbHJlYWR5IGluIQorICB1bnNpZ25lZCAmVmFsdWVJRCA9IFZhbHVlTWFwW1ZdOworICBpZiAoVmFsdWVJRCkgeworICAgIC8vIEluY3JlbWVudCB1c2UgY291bnQuCisgICAgVmFsdWVzW1ZhbHVlSUQtMV0uc2Vjb25kKys7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRW51bWVyYXRlIHRoZSB0eXBlIG9mIHRoaXMgdmFsdWUuCisgIEVudW1lcmF0ZVR5cGUoVi0+Z2V0VHlwZSgpKTsKKworICBpZiAoY29uc3QgQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpIHsKKyAgICBpZiAoaXNhPEdsb2JhbFZhbHVlPihDKSkgeworICAgICAgLy8gSW5pdGlhbGl6ZXJzIGZvciBnbG9iYWxzIGFyZSBoYW5kbGVkIGV4cGxpY2l0bHkgZWxzZXdoZXJlLgorICAgIH0gZWxzZSBpZiAoaXNhPENvbnN0YW50QXJyYXk+KEMpICYmIGNhc3Q8Q29uc3RhbnRBcnJheT4oQyktPmlzU3RyaW5nKCkpIHsKKyAgICAgIC8vIERvIG5vdCBlbnVtZXJhdGUgdGhlIGluaXRpYWxpemVycyBmb3IgYW4gYXJyYXkgb2Ygc2ltcGxlIGNoYXJhY3RlcnMuCisgICAgICAvLyBUaGUgaW5pdGlhbGl6ZXJzIGp1c3QgcG9sdXRlIHRoZSB2YWx1ZSB0YWJsZSwgYW5kIHdlIGVtaXQgdGhlIHN0cmluZ3MKKyAgICAgIC8vIHNwZWNpYWxseS4KKyAgICB9IGVsc2UgaWYgKEMtPmdldE51bU9wZXJhbmRzKCkpIHsKKyAgICAgIC8vIElmIGEgY29uc3RhbnQgaGFzIG9wZXJhbmRzLCBlbnVtZXJhdGUgdGhlbS4gIFRoaXMgbWFrZXMgc3VyZSB0aGF0IGlmIGEKKyAgICAgIC8vIGNvbnN0YW50IGhhcyB1c2VzIChmb3IgZXhhbXBsZSBhbiBhcnJheSBvZiBjb25zdCBpbnRzKSwgdGhhdCB0aGV5IGFyZQorICAgICAgLy8gaW5zZXJ0ZWQgYWxzby4KKworICAgICAgLy8gV2UgcHJlZmVyIHRvIGVudW1lcmF0ZSB0aGVtIHdpdGggdmFsdWVzIGJlZm9yZSB3ZSBlbnVtZXJhdGUgdGhlIHVzZXIKKyAgICAgIC8vIGl0c2VsZi4gIFRoaXMgbWFrZXMgaXQgbW9yZSBsaWtlbHkgdGhhdCB3ZSBjYW4gYXZvaWQgZm9yd2FyZCByZWZlcmVuY2VzCisgICAgICAvLyBpbiB0aGUgcmVhZGVyLiAgV2Uga25vdyB0aGF0IHRoZXJlIGNhbiBiZSBubyBjeWNsZXMgaW4gdGhlIGNvbnN0YW50cworICAgICAgLy8gZ3JhcGggdGhhdCBkb24ndCBnbyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlLgorICAgICAgZm9yIChVc2VyOjpjb25zdF9vcF9pdGVyYXRvciBJID0gQy0+b3BfYmVnaW4oKSwgRSA9IEMtPm9wX2VuZCgpOworICAgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgICAgaWYgKCFpc2E8QmFzaWNCbG9jaz4oKkkpKSAvLyBEb24ndCBlbnVtZXJhdGUgQkIgb3BlcmFuZCB0byBCbG9ja0FkZHJlc3MuCisgICAgICAgICAgRW51bWVyYXRlVmFsdWUoKkkpOworCisgICAgICAvLyBGaW5hbGx5LCBhZGQgdGhlIHZhbHVlLiAgRG9pbmcgdGhpcyBjb3VsZCBtYWtlIHRoZSBWYWx1ZUlEIHJlZmVyZW5jZSBiZQorICAgICAgLy8gZGFuZ2xpbmcsIGRvbid0IHJldXNlIGl0LgorICAgICAgVmFsdWVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWLCAxVSkpOworICAgICAgVmFsdWVNYXBbVl0gPSBWYWx1ZXMuc2l6ZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIEFkZCB0aGUgdmFsdWUuCisgIFZhbHVlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoViwgMVUpKTsKKyAgVmFsdWVJRCA9IFZhbHVlcy5zaXplKCk7Cit9CisKKwordm9pZCBWYWx1ZUVudW1lcmF0b3I6OkVudW1lcmF0ZVR5cGUoY29uc3QgVHlwZSAqVHkpIHsKKyAgdW5zaWduZWQgJlR5cGVJRCA9IFR5cGVNYXBbVHldOworCisgIGlmIChUeXBlSUQpIHsKKyAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyB0eXBlLCBqdXN0IGluY3JlYXNlIGl0cyBvY2N1cnJlbmNlIGNvdW50LgorICAgIFR5cGVzW1R5cGVJRC0xXS5zZWNvbmQrKzsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBGaXJzdCB0aW1lIHdlIHNhdyB0aGlzIHR5cGUsIGFkZCBpdC4KKyAgVHlwZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFR5LCAxVSkpOworICBUeXBlSUQgPSBUeXBlcy5zaXplKCk7CisKKyAgLy8gRW51bWVyYXRlIHN1YnR5cGVzLgorICBmb3IgKFR5cGU6OnN1YnR5cGVfaXRlcmF0b3IgSSA9IFR5LT5zdWJ0eXBlX2JlZ2luKCksIEUgPSBUeS0+c3VidHlwZV9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBFbnVtZXJhdGVUeXBlKCpJKTsKK30KKworLy8gRW51bWVyYXRlIHRoZSB0eXBlcyBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBhIGNvbnN0YW50LAorLy8gd2FsayB0aHJvdWdoIGl0LCBlbnVtZXJhdGluZyB0aGUgdHlwZXMgb2YgdGhlIGNvbnN0YW50Lgordm9pZCBWYWx1ZUVudW1lcmF0b3I6OkVudW1lcmF0ZU9wZXJhbmRUeXBlKGNvbnN0IFZhbHVlICpWKSB7CisgIEVudW1lcmF0ZVR5cGUoVi0+Z2V0VHlwZSgpKTsKKyAgCisgIGlmIChjb25zdCBDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkgeworICAgIC8vIElmIHRoaXMgY29uc3RhbnQgaXMgYWxyZWFkeSBlbnVtZXJhdGVkLCBpZ25vcmUgaXQsIHdlIGtub3cgaXRzIHR5cGUgbXVzdAorICAgIC8vIGJlIGVudW1lcmF0ZWQuCisgICAgaWYgKFZhbHVlTWFwLmNvdW50KFYpKSByZXR1cm47CisKKyAgICAvLyBUaGlzIGNvbnN0YW50IG1heSBoYXZlIG9wZXJhbmRzLCBtYWtlIHN1cmUgdG8gZW51bWVyYXRlIHRoZSB0eXBlcyBpbgorICAgIC8vIHRoZW0uCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEMtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBVc2VyICpPcCA9IEMtPmdldE9wZXJhbmQoaSk7CisgICAgICAKKyAgICAgIC8vIERvbid0IGVudW1lcmF0ZSBiYXNpYyBibG9ja3MgaGVyZSwgdGhpcyBoYXBwZW5zIGFzIG9wZXJhbmRzIHRvCisgICAgICAvLyBibG9ja2FkZHJlc3MuCisgICAgICBpZiAoaXNhPEJhc2ljQmxvY2s+KE9wKSkgY29udGludWU7CisgICAgICAKKyAgICAgIEVudW1lcmF0ZU9wZXJhbmRUeXBlKGNhc3Q8Q29uc3RhbnQ+KE9wKSk7CisgICAgfQorCisgICAgaWYgKGNvbnN0IE1ETm9kZSAqTiA9IGR5bl9jYXN0PE1ETm9kZT4oVikpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKFZhbHVlICpFbGVtID0gTi0+Z2V0T3BlcmFuZChpKSkKKyAgICAgICAgICBFbnVtZXJhdGVPcGVyYW5kVHlwZShFbGVtKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaXNhPE1EU3RyaW5nPihWKSB8fCBpc2E8TUROb2RlPihWKSkKKyAgICBFbnVtZXJhdGVWYWx1ZShWKTsKK30KKwordm9pZCBWYWx1ZUVudW1lcmF0b3I6OkVudW1lcmF0ZUF0dHJpYnV0ZXMoY29uc3QgQXR0ckxpc3RQdHIgJlBBTCkgeworICBpZiAoUEFMLmlzRW1wdHkoKSkgcmV0dXJuOyAgLy8gbnVsbCBpcyBhbHdheXMgMC4KKyAgLy8gRG8gYSBsb29rdXAuCisgIHVuc2lnbmVkICZFbnRyeSA9IEF0dHJpYnV0ZU1hcFtQQUwuZ2V0UmF3UG9pbnRlcigpXTsKKyAgaWYgKEVudHJ5ID09IDApIHsKKyAgICAvLyBOZXZlciBzYXcgdGhpcyBiZWZvcmUsIGFkZCBpdC4KKyAgICBBdHRyaWJ1dGVzLnB1c2hfYmFjayhQQUwpOworICAgIEVudHJ5ID0gQXR0cmlidXRlcy5zaXplKCk7CisgIH0KK30KKworCit2b2lkIFZhbHVlRW51bWVyYXRvcjo6aW5jb3Jwb3JhdGVGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAmRikgeworICBJbnN0cnVjdGlvbkNvdW50ID0gMDsKKyAgTnVtTW9kdWxlVmFsdWVzID0gVmFsdWVzLnNpemUoKTsKKworICAvLyBBZGRpbmcgZnVuY3Rpb24gYXJndW1lbnRzIHRvIHRoZSB2YWx1ZSB0YWJsZS4KKyAgZm9yIChGdW5jdGlvbjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEkgPSBGLmFyZ19iZWdpbigpLCBFID0gRi5hcmdfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgRW51bWVyYXRlVmFsdWUoSSk7CisKKyAgRmlyc3RGdW5jQ29uc3RhbnRJRCA9IFZhbHVlcy5zaXplKCk7CisKKyAgLy8gQWRkIGFsbCBmdW5jdGlvbi1sZXZlbCBjb25zdGFudHMgdG8gdGhlIHZhbHVlIHRhYmxlLgorICBmb3IgKEZ1bmN0aW9uOjpjb25zdF9pdGVyYXRvciBCQiA9IEYuYmVnaW4oKSwgRSA9IEYuZW5kKCk7IEJCICE9IEU7ICsrQkIpIHsKKyAgICBmb3IgKEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSSE9RTsgKytJKQorICAgICAgZm9yIChVc2VyOjpjb25zdF9vcF9pdGVyYXRvciBPSSA9IEktPm9wX2JlZ2luKCksIEUgPSBJLT5vcF9lbmQoKTsKKyAgICAgICAgICAgT0kgIT0gRTsgKytPSSkgeworICAgICAgICBpZiAoKGlzYTxDb25zdGFudD4oKk9JKSAmJiAhaXNhPEdsb2JhbFZhbHVlPigqT0kpKSB8fAorICAgICAgICAgICAgaXNhPElubGluZUFzbT4oKk9JKSkKKyAgICAgICAgICBFbnVtZXJhdGVWYWx1ZSgqT0kpOworICAgICAgfQorICAgIEJhc2ljQmxvY2tzLnB1c2hfYmFjayhCQik7CisgICAgVmFsdWVNYXBbQkJdID0gQmFzaWNCbG9ja3Muc2l6ZSgpOworICB9CisKKyAgLy8gT3B0aW1pemUgdGhlIGNvbnN0YW50IGxheW91dC4KKyAgT3B0aW1pemVDb25zdGFudHMoRmlyc3RGdW5jQ29uc3RhbnRJRCwgVmFsdWVzLnNpemUoKSk7CisKKyAgLy8gQWRkIHRoZSBmdW5jdGlvbidzIHBhcmFtZXRlciBhdHRyaWJ1dGVzIHNvIHRoZXkgYXJlIGF2YWlsYWJsZSBmb3IgdXNlIGluCisgIC8vIHRoZSBmdW5jdGlvbidzIGluc3RydWN0aW9uLgorICBFbnVtZXJhdGVBdHRyaWJ1dGVzKEYuZ2V0QXR0cmlidXRlcygpKTsKKworICBGaXJzdEluc3RJRCA9IFZhbHVlcy5zaXplKCk7CisKKyAgRnVuY3Rpb25Mb2NhbE1Ecy5jbGVhcigpOworICBTbWFsbFZlY3RvcjxNRE5vZGUgKiwgOD4gRm5Mb2NhbE1EVmVjdG9yOworICAvLyBBZGQgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMuCisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEJCID0gRi5iZWdpbigpLCBFID0gRi5lbmQoKTsgQkIgIT0gRTsgKytCQikgeworICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBJIT1FOyArK0kpIHsKKyAgICAgIGZvciAoVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3IgT0kgPSBJLT5vcF9iZWdpbigpLCBFID0gSS0+b3BfZW5kKCk7CisgICAgICAgICAgIE9JICE9IEU7ICsrT0kpIHsKKyAgICAgICAgaWYgKE1ETm9kZSAqTUQgPSBkeW5fY2FzdDxNRE5vZGU+KCpPSSkpCisgICAgICAgICAgaWYgKE1ELT5pc0Z1bmN0aW9uTG9jYWwoKSAmJiBNRC0+Z2V0RnVuY3Rpb24oKSkKKyAgICAgICAgICAgIC8vIEVudW1lcmF0ZSBtZXRhZGF0YSBhZnRlciB0aGUgaW5zdHJ1Y3Rpb25zIHRoZXkgbWlnaHQgcmVmZXIgdG8uCisgICAgICAgICAgICBGbkxvY2FsTURWZWN0b3IucHVzaF9iYWNrKE1EKTsKKyAgICAgIH0KKyAgICAgIGlmICghSS0+Z2V0VHlwZSgpLT5pc1ZvaWRUeSgpKQorICAgICAgICBFbnVtZXJhdGVWYWx1ZShJKTsKKyAgICB9CisgIH0KKworICAvLyBBZGQgYWxsIG9mIHRoZSBmdW5jdGlvbi1sb2NhbCBtZXRhZGF0YS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZuTG9jYWxNRFZlY3Rvci5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIEVudW1lcmF0ZU9wZXJhbmRUeXBlKEZuTG9jYWxNRFZlY3RvcltpXSk7Cit9CisKK3ZvaWQgVmFsdWVFbnVtZXJhdG9yOjpwdXJnZUZ1bmN0aW9uKCkgeworICAvLy8gUmVtb3ZlIHB1cmdlZCB2YWx1ZXMgZnJvbSB0aGUgVmFsdWVNYXAuCisgIGZvciAodW5zaWduZWQgaSA9IE51bU1vZHVsZVZhbHVlcywgZSA9IFZhbHVlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFZhbHVlTWFwLmVyYXNlKFZhbHVlc1tpXS5maXJzdCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCYXNpY0Jsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFZhbHVlTWFwLmVyYXNlKEJhc2ljQmxvY2tzW2ldKTsKKworICBWYWx1ZXMucmVzaXplKE51bU1vZHVsZVZhbHVlcyk7CisgIEJhc2ljQmxvY2tzLmNsZWFyKCk7Cit9CisKK3N0YXRpYyB2b2lkIEluY29ycG9yYXRlRnVuY3Rpb25JbmZvR2xvYmFsQkJJRHMoY29uc3QgRnVuY3Rpb24gKkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxjb25zdCBCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+ICZJRE1hcCkgeworICB1bnNpZ25lZCBDb3VudGVyID0gMDsKKyAgZm9yIChGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpCisgICAgSURNYXBbQkJdID0gKytDb3VudGVyOworfQorCisvLy8gZ2V0R2xvYmFsQmFzaWNCbG9ja0lEIC0gVGhpcyByZXR1cm5zIHRoZSBmdW5jdGlvbi1zcGVjaWZpYyBJRCBmb3IgdGhlCisvLy8gc3BlY2lmaWVkIGJhc2ljIGJsb2NrLiAgVGhpcyBpcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSBpbmZvcm1hdGlvbiwgc28gaXQKKy8vLyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHJhcmUgY29uc3RydWN0cyBzdWNoIGFzIGFkZHJlc3Mtb2YtbGFiZWwuCit1bnNpZ25lZCBWYWx1ZUVudW1lcmF0b3I6OmdldEdsb2JhbEJhc2ljQmxvY2tJRChjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICB1bnNpZ25lZCAmSWR4ID0gR2xvYmFsQmFzaWNCbG9ja0lEc1tCQl07CisgIGlmIChJZHggIT0gMCkKKyAgICByZXR1cm4gSWR4LTE7CisKKyAgSW5jb3Jwb3JhdGVGdW5jdGlvbkluZm9HbG9iYWxCQklEcyhCQi0+Z2V0UGFyZW50KCksIEdsb2JhbEJhc2ljQmxvY2tJRHMpOworICByZXR1cm4gZ2V0R2xvYmFsQmFzaWNCbG9ja0lEKEJCKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0JpdGNvZGUvV3JpdGVyL1ZhbHVlRW51bWVyYXRvci5oIGIvc3JjL0xMVk0vbGliL0JpdGNvZGUvV3JpdGVyL1ZhbHVlRW51bWVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTNiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQml0Y29kZS9Xcml0ZXIvVmFsdWVFbnVtZXJhdG9yLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8vPT09LS0gQml0Y29kZS9Xcml0ZXIvVmFsdWVFbnVtZXJhdG9yLmggLSBOdW1iZXIgdmFsdWVzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyBnaXZlcyB2YWx1ZXMgYW5kIHR5cGVzIFVuaXF1ZSBJRCdzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVkFMVUVfRU5VTUVSQVRPUl9ICisjZGVmaW5lIFZBTFVFX0VOVU1FUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUeXBlOworY2xhc3MgVmFsdWU7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE5hbWVkTUROb2RlOworY2xhc3MgQXR0ckxpc3RQdHI7CitjbGFzcyBUeXBlU3ltYm9sVGFibGU7CitjbGFzcyBWYWx1ZVN5bWJvbFRhYmxlOworY2xhc3MgTURTeW1ib2xUYWJsZTsKKworY2xhc3MgVmFsdWVFbnVtZXJhdG9yIHsKK3B1YmxpYzoKKyAgLy8gRm9yIGVhY2ggdHlwZSwgd2UgcmVtZW1iZXIgaXRzIFR5cGUqIGFuZCBvY2N1cnJlbmNlIGZyZXF1ZW5jeS4KKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgVHlwZSosIHVuc2lnbmVkPiA+IFR5cGVMaXN0OworCisgIC8vIEZvciBlYWNoIHZhbHVlLCB3ZSByZW1lbWJlciBpdHMgVmFsdWUqIGFuZCBvY2N1cnJlbmNlIGZyZXF1ZW5jeS4KKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgVmFsdWUqLCB1bnNpZ25lZD4gPiBWYWx1ZUxpc3Q7Citwcml2YXRlOgorICB0eXBlZGVmIERlbnNlTWFwPGNvbnN0IFR5cGUqLCB1bnNpZ25lZD4gVHlwZU1hcFR5cGU7CisgIFR5cGVNYXBUeXBlIFR5cGVNYXA7CisgIFR5cGVMaXN0IFR5cGVzOworCisgIHR5cGVkZWYgRGVuc2VNYXA8Y29uc3QgVmFsdWUqLCB1bnNpZ25lZD4gVmFsdWVNYXBUeXBlOworICBWYWx1ZU1hcFR5cGUgVmFsdWVNYXA7CisgIFZhbHVlTGlzdCBWYWx1ZXM7CisgIFZhbHVlTGlzdCBNRFZhbHVlczsKKyAgU21hbGxWZWN0b3I8Y29uc3QgTUROb2RlICosIDg+IEZ1bmN0aW9uTG9jYWxNRHM7CisgIFZhbHVlTWFwVHlwZSBNRFZhbHVlTWFwOworICAKKyAgdHlwZWRlZiBEZW5zZU1hcDx2b2lkKiwgdW5zaWduZWQ+IEF0dHJpYnV0ZU1hcFR5cGU7CisgIEF0dHJpYnV0ZU1hcFR5cGUgQXR0cmlidXRlTWFwOworICBzdGQ6OnZlY3RvcjxBdHRyTGlzdFB0cj4gQXR0cmlidXRlczsKKyAgCisgIC8vLyBHbG9iYWxCYXNpY0Jsb2NrSURzIC0gVGhpcyBtYXAgbWVtb2l6ZXMgdGhlIGJhc2ljIGJsb2NrIElEJ3MgcmVmZXJlbmNlZCBieQorICAvLy8gdGhlICJnZXRHbG9iYWxCYXNpY0Jsb2NrSUQiIG1ldGhvZC4KKyAgbXV0YWJsZSBEZW5zZU1hcDxjb25zdCBCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+IEdsb2JhbEJhc2ljQmxvY2tJRHM7CisgIAorICB0eXBlZGVmIERlbnNlTWFwPGNvbnN0IEluc3RydWN0aW9uKiwgdW5zaWduZWQ+IEluc3RydWN0aW9uTWFwVHlwZTsKKyAgSW5zdHJ1Y3Rpb25NYXBUeXBlIEluc3RydWN0aW9uTWFwOworICB1bnNpZ25lZCBJbnN0cnVjdGlvbkNvdW50OworCisgIC8vLyBCYXNpY0Jsb2NrcyAtIFRoaXMgY29udGFpbnMgYWxsIHRoZSBiYXNpYyBibG9ja3MgZm9yIHRoZSBjdXJyZW50bHkKKyAgLy8vIGluY29ycG9yYXRlZCBmdW5jdGlvbi4gIFRoZWlyIHJldmVyc2UgbWFwcGluZyBpcyBzdG9yZWQgaW4gVmFsdWVNYXAuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEJhc2ljQmxvY2sqPiBCYXNpY0Jsb2NrczsKKyAgCisgIC8vLyBXaGVuIGEgZnVuY3Rpb24gaXMgaW5jb3Jwb3JhdGVkLCB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZSBWYWx1ZXMgbGlzdAorICAvLy8gYmVmb3JlIGluY29ycG9yYXRpb24uCisgIHVuc2lnbmVkIE51bU1vZHVsZVZhbHVlczsKKyAgdW5zaWduZWQgRmlyc3RGdW5jQ29uc3RhbnRJRDsKKyAgdW5zaWduZWQgRmlyc3RJbnN0SUQ7CisgIAorICBWYWx1ZUVudW1lcmF0b3IoY29uc3QgVmFsdWVFbnVtZXJhdG9yICYpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUVudW1lcmF0b3IgJik7ICAgLy8gRE8gTk9UIElNUExFTUVOVAorcHVibGljOgorICBWYWx1ZUVudW1lcmF0b3IoY29uc3QgTW9kdWxlICpNKTsKKworICB1bnNpZ25lZCBnZXRWYWx1ZUlEKGNvbnN0IFZhbHVlICpWKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRUeXBlSUQoY29uc3QgVHlwZSAqVCkgY29uc3QgeworICAgIFR5cGVNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gVHlwZU1hcC5maW5kKFQpOworICAgIGFzc2VydChJICE9IFR5cGVNYXAuZW5kKCkgJiYgIlR5cGUgbm90IGluIFZhbHVlRW51bWVyYXRvciEiKTsKKyAgICByZXR1cm4gSS0+c2Vjb25kLTE7CisgIH0KKworICB1bnNpZ25lZCBnZXRJbnN0cnVjdGlvbklEKGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdDsKKyAgdm9pZCBzZXRJbnN0cnVjdGlvbklEKGNvbnN0IEluc3RydWN0aW9uICpJKTsKKworICB1bnNpZ25lZCBnZXRBdHRyaWJ1dGVJRChjb25zdCBBdHRyTGlzdFB0ciAmUEFMKSBjb25zdCB7CisgICAgaWYgKFBBTC5pc0VtcHR5KCkpIHJldHVybiAwOyAgLy8gTnVsbCBtYXBzIHRvIHplcm8uCisgICAgQXR0cmlidXRlTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IgSSA9IEF0dHJpYnV0ZU1hcC5maW5kKFBBTC5nZXRSYXdQb2ludGVyKCkpOworICAgIGFzc2VydChJICE9IEF0dHJpYnV0ZU1hcC5lbmQoKSAmJiAiQXR0cmlidXRlIG5vdCBpbiBWYWx1ZUVudW1lcmF0b3IhIik7CisgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCisgIC8vLyBnZXRGdW5jdGlvbkNvbnN0YW50UmFuZ2UgLSBSZXR1cm4gdGhlIHJhbmdlIG9mIHZhbHVlcyB0aGF0IGNvcnJlc3BvbmRzIHRvCisgIC8vLyBmdW5jdGlvbi1sb2NhbCBjb25zdGFudHMuCisgIHZvaWQgZ2V0RnVuY3Rpb25Db25zdGFudFJhbmdlKHVuc2lnbmVkICZTdGFydCwgdW5zaWduZWQgJkVuZCkgY29uc3QgeworICAgIFN0YXJ0ID0gRmlyc3RGdW5jQ29uc3RhbnRJRDsKKyAgICBFbmQgPSBGaXJzdEluc3RJRDsKKyAgfQorICAKKyAgY29uc3QgVmFsdWVMaXN0ICZnZXRWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBWYWx1ZXM7IH0KKyAgY29uc3QgVmFsdWVMaXN0ICZnZXRNRFZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIE1EVmFsdWVzOyB9CisgIGNvbnN0IFNtYWxsVmVjdG9yPGNvbnN0IE1ETm9kZSAqLCA4PiAmZ2V0RnVuY3Rpb25Mb2NhbE1EVmFsdWVzKCkgY29uc3QgeyAKKyAgICByZXR1cm4gRnVuY3Rpb25Mb2NhbE1EczsKKyAgfQorICBjb25zdCBUeXBlTGlzdCAmZ2V0VHlwZXMoKSBjb25zdCB7IHJldHVybiBUeXBlczsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBCYXNpY0Jsb2NrKj4gJmdldEJhc2ljQmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBCYXNpY0Jsb2NrczsgCisgIH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8QXR0ckxpc3RQdHI+ICZnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVzOworICB9CisgIAorICAvLy8gZ2V0R2xvYmFsQmFzaWNCbG9ja0lEIC0gVGhpcyByZXR1cm5zIHRoZSBmdW5jdGlvbi1zcGVjaWZpYyBJRCBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgYmFzaWMgYmxvY2suICBUaGlzIGlzIHJlbGF0aXZlbHkgZXhwZW5zaXZlIGluZm9ybWF0aW9uLCBzbyBpdAorICAvLy8gc2hvdWxkIG9ubHkgYmUgdXNlZCBieSByYXJlIGNvbnN0cnVjdHMgc3VjaCBhcyBhZGRyZXNzLW9mLWxhYmVsLgorICB1bnNpZ25lZCBnZXRHbG9iYWxCYXNpY0Jsb2NrSUQoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vLyBpbmNvcnBvcmF0ZUZ1bmN0aW9uL3B1cmdlRnVuY3Rpb24gLSBJZiB5b3UnZCBsaWtlIHRvIGRlYWwgd2l0aCBhIGZ1bmN0aW9uLAorICAvLy8gdXNlIHRoZXNlIHR3byBtZXRob2RzIHRvIGdldCBpdHMgZGF0YSBpbnRvIHRoZSBWYWx1ZUVudW1lcmF0b3IhCisgIC8vLworICB2b2lkIGluY29ycG9yYXRlRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gJkYpOworICB2b2lkIHB1cmdlRnVuY3Rpb24oKTsKKworcHJpdmF0ZToKKyAgdm9pZCBPcHRpbWl6ZUNvbnN0YW50cyh1bnNpZ25lZCBDc3RTdGFydCwgdW5zaWduZWQgQ3N0RW5kKTsKKyAgICAKKyAgdm9pZCBFbnVtZXJhdGVNZXRhZGF0YShjb25zdCBWYWx1ZSAqTUQpOworICB2b2lkIEVudW1lcmF0ZU5hbWVkTUROb2RlKGNvbnN0IE5hbWVkTUROb2RlICpOTUQpOworICB2b2lkIEVudW1lcmF0ZVZhbHVlKGNvbnN0IFZhbHVlICpWKTsKKyAgdm9pZCBFbnVtZXJhdGVUeXBlKGNvbnN0IFR5cGUgKlQpOworICB2b2lkIEVudW1lcmF0ZU9wZXJhbmRUeXBlKGNvbnN0IFZhbHVlICpWKTsKKyAgdm9pZCBFbnVtZXJhdGVBdHRyaWJ1dGVzKGNvbnN0IEF0dHJMaXN0UHRyICZQQUwpOworICAKKyAgdm9pZCBFbnVtZXJhdGVUeXBlU3ltYm9sVGFibGUoY29uc3QgVHlwZVN5bWJvbFRhYmxlICZTVCk7CisgIHZvaWQgRW51bWVyYXRlVmFsdWVTeW1ib2xUYWJsZShjb25zdCBWYWx1ZVN5bWJvbFRhYmxlICZTVCk7CisgIHZvaWQgRW51bWVyYXRlTmFtZWRNZXRhZGF0YShjb25zdCBNb2R1bGUgKk0pOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9BZ2dyZXNzaXZlQW50aURlcEJyZWFrZXIuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmU0MGU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyLmNwcApAQCAtMCwwICsxLDk3OCBAQAorLy89PT0tLS0tLSBBZ2dyZXNzaXZlQW50aURlcEJyZWFrZXIuY3BwIC0gQW50aS1kZXAgYnJlYWtlciAtLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyIGNsYXNzLCB3aGljaAorLy8gaW1wbGVtZW50cyByZWdpc3RlciBhbnRpLWRlcGVuZGVuY2UgYnJlYWtpbmcgZHVyaW5nIHBvc3QtUkEKKy8vIHNjaGVkdWxpbmcuIEl0IGF0dGVtcHRzIHRvIGJyZWFrIGFsbCBhbnRpLWRlcGVuZGVuY2llcyB3aXRoaW4gYQorLy8gYmxvY2suCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwb3N0LVJBLXNjaGVkIgorI2luY2x1ZGUgIkFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIElmIERlYnVnRGl2ID4gMCB0aGVuIG9ubHkgYnJlYWsgYW50aWRlcCB3aXRoIChJRCAlIERlYnVnRGl2KSA9PSBEZWJ1Z01vZAorc3RhdGljIGNsOjpvcHQ8aW50PgorRGVidWdEaXYoImFnZy1hbnRpZGVwLWRlYnVnZGl2IiwKKyAgICAgICAgIGNsOjpkZXNjKCJEZWJ1ZyBjb250cm9sIGZvciBhZ2dyZXNzaXZlIGFudGktZGVwIGJyZWFrZXIiKSwKKyAgICAgICAgIGNsOjppbml0KDApLCBjbDo6SGlkZGVuKTsKK3N0YXRpYyBjbDo6b3B0PGludD4KK0RlYnVnTW9kKCJhZ2ctYW50aWRlcC1kZWJ1Z21vZCIsCisgICAgICAgICBjbDo6ZGVzYygiRGVidWcgY29udHJvbCBmb3IgYWdncmVzc2l2ZSBhbnRpLWRlcCBicmVha2VyIiksCisgICAgICAgICBjbDo6aW5pdCgwKSwgY2w6OkhpZGRlbik7CisKK0FnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OkFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGUoY29uc3QgdW5zaWduZWQgVGFyZ2V0UmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSA6CisgIE51bVRhcmdldFJlZ3MoVGFyZ2V0UmVncyksIEdyb3VwTm9kZXMoVGFyZ2V0UmVncywgMCksCisgIEdyb3VwTm9kZUluZGljZXMoVGFyZ2V0UmVncywgMCksCisgIEtpbGxJbmRpY2VzKFRhcmdldFJlZ3MsIDApLAorICBEZWZJbmRpY2VzKFRhcmdldFJlZ3MsIDApCit7CisgIGNvbnN0IHVuc2lnbmVkIEJCU2l6ZSA9IEJCLT5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1UYXJnZXRSZWdzOyArK2kpIHsKKyAgICAvLyBJbml0aWFsaXplIGFsbCByZWdpc3RlcnMgdG8gYmUgaW4gdGhlaXIgb3duIGdyb3VwLiBJbml0aWFsbHkgd2UKKyAgICAvLyBhc3NpZ24gdGhlIHJlZ2lzdGVyIHRvIHRoZSBzYW1lLWluZGV4ZWQgR3JvdXBOb2RlLgorICAgIEdyb3VwTm9kZUluZGljZXNbaV0gPSBpOworICAgIC8vIEluaXRpYWxpemUgdGhlIGluZGljZXMgdG8gaW5kaWNhdGUgdGhhdCBubyByZWdpc3RlcnMgYXJlIGxpdmUuCisgICAgS2lsbEluZGljZXNbaV0gPSB+MHU7CisgICAgRGVmSW5kaWNlc1tpXSA9IEJCU2l6ZTsKKyAgfQorfQorCit1bnNpZ25lZCBBZ2dyZXNzaXZlQW50aURlcFN0YXRlOjpHZXRHcm91cCh1bnNpZ25lZCBSZWcpIHsKKyAgdW5zaWduZWQgTm9kZSA9IEdyb3VwTm9kZUluZGljZXNbUmVnXTsKKyAgd2hpbGUgKEdyb3VwTm9kZXNbTm9kZV0gIT0gTm9kZSkKKyAgICBOb2RlID0gR3JvdXBOb2Rlc1tOb2RlXTsKKworICByZXR1cm4gTm9kZTsKK30KKwordm9pZCBBZ2dyZXNzaXZlQW50aURlcFN0YXRlOjpHZXRHcm91cFJlZ3MoCisgIHVuc2lnbmVkIEdyb3VwLAorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJlJlZ3MsCisgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OlJlZ2lzdGVyUmVmZXJlbmNlPiAqUmVnUmVmcykKK3sKKyAgZm9yICh1bnNpZ25lZCBSZWcgPSAwOyBSZWcgIT0gTnVtVGFyZ2V0UmVnczsgKytSZWcpIHsKKyAgICBpZiAoKEdldEdyb3VwKFJlZykgPT0gR3JvdXApICYmIChSZWdSZWZzLT5jb3VudChSZWcpID4gMCkpCisgICAgICBSZWdzLnB1c2hfYmFjayhSZWcpOworICB9Cit9CisKK3Vuc2lnbmVkIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OlVuaW9uR3JvdXBzKHVuc2lnbmVkIFJlZzEsIHVuc2lnbmVkIFJlZzIpCit7CisgIGFzc2VydChHcm91cE5vZGVzWzBdID09IDAgJiYgIkdyb3VwTm9kZSAwIG5vdCBwYXJlbnQhIik7CisgIGFzc2VydChHcm91cE5vZGVJbmRpY2VzWzBdID09IDAgJiYgIlJlZyAwIG5vdCBpbiBHcm91cCAwISIpOworCisgIC8vIGZpbmQgZ3JvdXAgZm9yIGVhY2ggcmVnaXN0ZXIKKyAgdW5zaWduZWQgR3JvdXAxID0gR2V0R3JvdXAoUmVnMSk7CisgIHVuc2lnbmVkIEdyb3VwMiA9IEdldEdyb3VwKFJlZzIpOworCisgIC8vIGlmIGVpdGhlciBncm91cCBpcyAwLCB0aGVuIHRoYXQgbXVzdCBiZWNvbWUgdGhlIHBhcmVudAorICB1bnNpZ25lZCBQYXJlbnQgPSAoR3JvdXAxID09IDApID8gR3JvdXAxIDogR3JvdXAyOworICB1bnNpZ25lZCBPdGhlciA9IChQYXJlbnQgPT0gR3JvdXAxKSA/IEdyb3VwMiA6IEdyb3VwMTsKKyAgR3JvdXBOb2Rlcy5hdChPdGhlcikgPSBQYXJlbnQ7CisgIHJldHVybiBQYXJlbnQ7Cit9CisKK3Vuc2lnbmVkIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OkxlYXZlR3JvdXAodW5zaWduZWQgUmVnKQoreworICAvLyBDcmVhdGUgYSBuZXcgR3JvdXBOb2RlIGZvciBSZWcuIFJlZydzIGV4aXN0aW5nIEdyb3VwTm9kZSBtdXN0CisgIC8vIHN0YXkgYXMgaXMgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlciBHcm91cE5vZGVzIHJlZmVycmluZyB0bworICAvLyBpdC4KKyAgdW5zaWduZWQgaWR4ID0gR3JvdXBOb2Rlcy5zaXplKCk7CisgIEdyb3VwTm9kZXMucHVzaF9iYWNrKGlkeCk7CisgIEdyb3VwTm9kZUluZGljZXNbUmVnXSA9IGlkeDsKKyAgcmV0dXJuIGlkeDsKK30KKworYm9vbCBBZ2dyZXNzaXZlQW50aURlcFN0YXRlOjpJc0xpdmUodW5zaWduZWQgUmVnKQoreworICAvLyBLaWxsSW5kZXggbXVzdCBiZSBkZWZpbmVkIGFuZCBEZWZJbmRleCBub3QgZGVmaW5lZCBmb3IgYSByZWdpc3RlcgorICAvLyB0byBiZSBsaXZlLgorICByZXR1cm4oKEtpbGxJbmRpY2VzW1JlZ10gIT0gfjB1KSAmJiAoRGVmSW5kaWNlc1tSZWddID09IH4wdSkpOworfQorCisKKworQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyOjoKK0FnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlcihNYWNoaW5lRnVuY3Rpb24mIE1GaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRTdWJ0YXJnZXQ6OlJlZ0NsYXNzVmVjdG9yJiBDcml0aWNhbFBhdGhSQ3MpIDoKKyAgQW50aURlcEJyZWFrZXIoKSwgTUYoTUZpKSwKKyAgTVJJKE1GLmdldFJlZ0luZm8oKSksCisgIFRJSShNRi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKSksCisgIFRSSShNRi5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKSksCisgIEFsbG9jYXRhYmxlU2V0KFRSSS0+Z2V0QWxsb2NhdGFibGVTZXQoTUYpKSwKKyAgU3RhdGUoTlVMTCkgeworICAvKiBDb2xsZWN0IGEgYml0c2V0IG9mIGFsbCByZWdpc3RlcnMgdGhhdCBhcmUgb25seSBicm9rZW4gaWYgdGhleQorICAgICBhcmUgb24gdGhlIGNyaXRpY2FsIHBhdGguICovCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDcml0aWNhbFBhdGhSQ3Muc2l6ZSgpOyBpIDwgZTsgKytpKSB7CisgICAgQml0VmVjdG9yIENQU2V0ID0gVFJJLT5nZXRBbGxvY2F0YWJsZVNldChNRiwgQ3JpdGljYWxQYXRoUkNzW2ldKTsKKyAgICBpZiAoQ3JpdGljYWxQYXRoU2V0Lm5vbmUoKSkKKyAgICAgIENyaXRpY2FsUGF0aFNldCA9IENQU2V0OworICAgIGVsc2UKKyAgICAgIENyaXRpY2FsUGF0aFNldCB8PSBDUFNldDsKKyAgIH0KKworICBERUJVRyhkYmdzKCkgPDwgIkFudGlEZXAgQ3JpdGljYWwtUGF0aCBSZWdpc3RlcnM6Iik7CisgIERFQlVHKGZvciAoaW50IHIgPSBDcml0aWNhbFBhdGhTZXQuZmluZF9maXJzdCgpOyByICE9IC0xOworICAgICAgICAgICAgIHIgPSBDcml0aWNhbFBhdGhTZXQuZmluZF9uZXh0KHIpKQorICAgICAgICAgIGRiZ3MoKSA8PCAiICIgPDwgVFJJLT5nZXROYW1lKHIpKTsKKyAgREVCVUcoZGJncygpIDw8ICdcbicpOworfQorCitBZ2dyZXNzaXZlQW50aURlcEJyZWFrZXI6On5BZ2dyZXNzaXZlQW50aURlcEJyZWFrZXIoKSB7CisgIGRlbGV0ZSBTdGF0ZTsKK30KKwordm9pZCBBZ2dyZXNzaXZlQW50aURlcEJyZWFrZXI6OlN0YXJ0QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCKSB7CisgIGFzc2VydChTdGF0ZSA9PSBOVUxMKTsKKyAgU3RhdGUgPSBuZXcgQWdncmVzc2l2ZUFudGlEZXBTdGF0ZShUUkktPmdldE51bVJlZ3MoKSwgQkIpOworCisgIGJvb2wgSXNSZXR1cm5CbG9jayA9ICghQkItPmVtcHR5KCkgJiYgQkItPmJhY2soKS5nZXREZXNjKCkuaXNSZXR1cm4oKSk7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmS2lsbEluZGljZXMgPSBTdGF0ZS0+R2V0S2lsbEluZGljZXMoKTsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZEZWZJbmRpY2VzID0gU3RhdGUtPkdldERlZkluZGljZXMoKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIGxpdmUtb3V0IHBoeXNyZWdzIGZvciB0aGlzIGJsb2NrLgorICBpZiAoSXNSZXR1cm5CbG9jaykgeworICAgIC8vIEluIGEgcmV0dXJuIGJsb2NrLCBleGFtaW5lIHRoZSBmdW5jdGlvbiBsaXZlLW91dCByZWdzLgorICAgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6bGl2ZW91dF9pdGVyYXRvciBJID0gTVJJLmxpdmVvdXRfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBNUkkubGl2ZW91dF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9ICpJOworICAgICAgU3RhdGUtPlVuaW9uR3JvdXBzKFJlZywgMCk7CisgICAgICBLaWxsSW5kaWNlc1tSZWddID0gQkItPnNpemUoKTsKKyAgICAgIERlZkluZGljZXNbUmVnXSA9IH4wdTsKKyAgICAgIC8vIFJlcGVhdCwgZm9yIGFsbCBhbGlhc2VzLgorICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQWxpYXMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBbGlhczsgKytBbGlhcykgeworICAgICAgICB1bnNpZ25lZCBBbGlhc1JlZyA9ICpBbGlhczsKKyAgICAgICAgU3RhdGUtPlVuaW9uR3JvdXBzKEFsaWFzUmVnLCAwKTsKKyAgICAgICAgS2lsbEluZGljZXNbQWxpYXNSZWddID0gQkItPnNpemUoKTsKKyAgICAgICAgRGVmSW5kaWNlc1tBbGlhc1JlZ10gPSB+MHU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSW4gYSBub24tcmV0dXJuIGJsb2NrLCBleGFtaW5lIHRoZSBsaXZlLWluIHJlZ3Mgb2YgYWxsIHN1Y2Nlc3NvcnMuCisgIC8vIE5vdGUgYSByZXR1cm4gYmxvY2sgY2FuIGhhdmUgc3VjY2Vzc29ycyBpZiB0aGUgcmV0dXJuIGluc3RydWN0aW9uIGlzCisgIC8vIHByZWRpY2F0ZWQuCisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnN1Y2NfaXRlcmF0b3IgU0kgPSBCQi0+c3VjY19iZWdpbigpLAorICAgICAgICAgU0UgPSBCQi0+c3VjY19lbmQoKTsgU0kgIT0gU0U7ICsrU0kpCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6bGl2ZWluX2l0ZXJhdG9yIEkgPSAoKlNJKS0+bGl2ZWluX2JlZ2luKCksCisgICAgICAgICAgIEUgPSAoKlNJKS0+bGl2ZWluX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgdW5zaWduZWQgUmVnID0gKkk7CisgICAgICBTdGF0ZS0+VW5pb25Hcm91cHMoUmVnLCAwKTsKKyAgICAgIEtpbGxJbmRpY2VzW1JlZ10gPSBCQi0+c2l6ZSgpOworICAgICAgRGVmSW5kaWNlc1tSZWddID0gfjB1OworICAgICAgLy8gUmVwZWF0LCBmb3IgYWxsIGFsaWFzZXMuCisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBbGlhcyA9IFRSSS0+Z2V0QWxpYXNTZXQoUmVnKTsgKkFsaWFzOyArK0FsaWFzKSB7CisgICAgICAgIHVuc2lnbmVkIEFsaWFzUmVnID0gKkFsaWFzOworICAgICAgICBTdGF0ZS0+VW5pb25Hcm91cHMoQWxpYXNSZWcsIDApOworICAgICAgICBLaWxsSW5kaWNlc1tBbGlhc1JlZ10gPSBCQi0+c2l6ZSgpOworICAgICAgICBEZWZJbmRpY2VzW0FsaWFzUmVnXSA9IH4wdTsKKyAgICAgIH0KKyAgICB9CisKKyAgLy8gTWFyayBsaXZlLW91dCBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLiBJbiBhIHJldHVybiBibG9jayB0aGlzIGlzCisgIC8vIGFsbCBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLiBJbiBub24tcmV0dXJuIHRoaXMgaXMgYW55CisgIC8vIGNhbGxlZS1zYXZlZCByZWdpc3RlciB0aGF0IGlzIG5vdCBzYXZlZCBpbiB0aGUgcHJvbG9nLgorICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgQml0VmVjdG9yIFByaXN0aW5lID0gTUZJLT5nZXRQcmlzdGluZVJlZ3MoQkIpOworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpJID0gVFJJLT5nZXRDYWxsZWVTYXZlZFJlZ3MoKTsgKkk7ICsrSSkgeworICAgIHVuc2lnbmVkIFJlZyA9ICpJOworICAgIGlmICghSXNSZXR1cm5CbG9jayAmJiAhUHJpc3RpbmUudGVzdChSZWcpKSBjb250aW51ZTsKKyAgICBTdGF0ZS0+VW5pb25Hcm91cHMoUmVnLCAwKTsKKyAgICBLaWxsSW5kaWNlc1tSZWddID0gQkItPnNpemUoKTsKKyAgICBEZWZJbmRpY2VzW1JlZ10gPSB+MHU7CisgICAgLy8gUmVwZWF0LCBmb3IgYWxsIGFsaWFzZXMuCisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQWxpYXMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBbGlhczsgKytBbGlhcykgeworICAgICAgdW5zaWduZWQgQWxpYXNSZWcgPSAqQWxpYXM7CisgICAgICBTdGF0ZS0+VW5pb25Hcm91cHMoQWxpYXNSZWcsIDApOworICAgICAgS2lsbEluZGljZXNbQWxpYXNSZWddID0gQkItPnNpemUoKTsKKyAgICAgIERlZkluZGljZXNbQWxpYXNSZWddID0gfjB1OworICAgIH0KKyAgfQorfQorCit2b2lkIEFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlcjo6RmluaXNoQmxvY2soKSB7CisgIGRlbGV0ZSBTdGF0ZTsKKyAgU3RhdGUgPSBOVUxMOworfQorCit2b2lkIEFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlcjo6T2JzZXJ2ZShNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluc2VydFBvc0luZGV4KSB7CisgIGFzc2VydChDb3VudCA8IEluc2VydFBvc0luZGV4ICYmICJJbnN0cnVjdGlvbiBpbmRleCBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2UhIik7CisKKyAgc3RkOjpzZXQ8dW5zaWduZWQ+IFBhc3N0aHJ1UmVnczsKKyAgR2V0UGFzc3RocnVSZWdzKE1JLCBQYXNzdGhydVJlZ3MpOworICBQcmVzY2FuSW5zdHJ1Y3Rpb24oTUksIENvdW50LCBQYXNzdGhydVJlZ3MpOworICBTY2FuSW5zdHJ1Y3Rpb24oTUksIENvdW50KTsKKworICBERUJVRyhkYmdzKCkgPDwgIk9ic2VydmU6ICIpOworICBERUJVRyhNSS0+ZHVtcCgpKTsKKyAgREVCVUcoZGJncygpIDw8ICJcdFJlZ3M6Iik7CisKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZEZWZJbmRpY2VzID0gU3RhdGUtPkdldERlZkluZGljZXMoKTsKKyAgZm9yICh1bnNpZ25lZCBSZWcgPSAwOyBSZWcgIT0gVFJJLT5nZXROdW1SZWdzKCk7ICsrUmVnKSB7CisgICAgLy8gSWYgUmVnIGlzIGN1cnJlbnQgbGl2ZSwgdGhlbiBtYXJrIHRoYXQgaXQgY2FuJ3QgYmUgcmVuYW1lZCBhcworICAgIC8vIHdlIGRvbid0IGtub3cgdGhlIGV4dGVudCBvZiBpdHMgbGl2ZS1yYW5nZSBhbnltb3JlIChub3cgdGhhdCBpdAorICAgIC8vIGhhcyBiZWVuIHNjaGVkdWxlZCkuIElmIGl0IGlzIG5vdCBsaXZlIGJ1dCB3YXMgZGVmaW5lZCBpbiB0aGUKKyAgICAvLyBwcmV2aW91cyBzY2hlZHVsZSByZWdpb24sIHRoZW4gc2V0IGl0cyBkZWYgaW5kZXggdG8gdGhlIG1vc3QKKyAgICAvLyBjb25zZXJ2YXRpdmUgbG9jYXRpb24gKGkuZS4gdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJldmlvdXMKKyAgICAvLyBzY2hlZHVsZSByZWdpb24pLgorICAgIGlmIChTdGF0ZS0+SXNMaXZlKFJlZykpIHsKKyAgICAgIERFQlVHKGlmIChTdGF0ZS0+R2V0R3JvdXAoUmVnKSAhPSAwKQorICAgICAgICAgICAgICBkYmdzKCkgPDwgIiAiIDw8IFRSSS0+Z2V0TmFtZShSZWcpIDw8ICI9ZyIgPDwKKyAgICAgICAgICAgICAgICBTdGF0ZS0+R2V0R3JvdXAoUmVnKSA8PCAiLT5nMChyZWdpb24gbGl2ZS1vdXQpIik7CisgICAgICBTdGF0ZS0+VW5pb25Hcm91cHMoUmVnLCAwKTsKKyAgICB9IGVsc2UgaWYgKChEZWZJbmRpY2VzW1JlZ10gPCBJbnNlcnRQb3NJbmRleCkKKyAgICAgICAgICAgICAgICYmIChEZWZJbmRpY2VzW1JlZ10gPj0gQ291bnQpKSB7CisgICAgICBEZWZJbmRpY2VzW1JlZ10gPSBDb3VudDsKKyAgICB9CisgIH0KKyAgREVCVUcoZGJncygpIDw8ICdcbicpOworfQorCitib29sIEFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlcjo6SXNJbXBsaWNpdERlZlVzZShNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU9wZXJhbmQmIE1PKQoreworICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzSW1wbGljaXQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgIGlmIChSZWcgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgTWFjaGluZU9wZXJhbmQgKk9wID0gTlVMTDsKKyAgaWYgKE1PLmlzRGVmKCkpCisgICAgT3AgPSBNSS0+ZmluZFJlZ2lzdGVyVXNlT3BlcmFuZChSZWcsIHRydWUpOworICBlbHNlCisgICAgT3AgPSBNSS0+ZmluZFJlZ2lzdGVyRGVmT3BlcmFuZChSZWcpOworCisgIHJldHVybigoT3AgIT0gTlVMTCkgJiYgT3AtPmlzSW1wbGljaXQoKSk7Cit9CisKK3ZvaWQgQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyOjpHZXRQYXNzdGhydVJlZ3MoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDx1bnNpZ25lZD4mIFBhc3N0aHJ1UmVncykgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpKSBjb250aW51ZTsKKyAgICBpZiAoKE1PLmlzRGVmKCkgJiYgTUktPmlzUmVnVGllZFRvVXNlT3BlcmFuZChpKSkgfHwKKyAgICAgICAgSXNJbXBsaWNpdERlZlVzZShNSSwgTU8pKSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgIFBhc3N0aHJ1UmVncy5pbnNlcnQoUmVnKTsKKyAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YnJlZyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgICAgICpTdWJyZWc7ICsrU3VicmVnKSB7CisgICAgICAgIFBhc3N0aHJ1UmVncy5pbnNlcnQoKlN1YnJlZyk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLyBBbnRpRGVwRWRnZXMgLSBSZXR1cm4gaW4gRWRnZXMgdGhlIGFudGktIGFuZCBvdXRwdXQtIGRlcGVuZGVuY2llcworLy8vIGluIFNVIHRoYXQgd2Ugd2FudCB0byBjb25zaWRlciBmb3IgYnJlYWtpbmcuCitzdGF0aWMgdm9pZCBBbnRpRGVwRWRnZXMoY29uc3QgU1VuaXQgKlNVLCBzdGQ6OnZlY3Rvcjxjb25zdCBTRGVwKj4mIEVkZ2VzKSB7CisgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiBSZWdTZXQ7CisgIGZvciAoU1VuaXQ6OmNvbnN0X3ByZWRfaXRlcmF0b3IgUCA9IFNVLT5QcmVkcy5iZWdpbigpLCBQRSA9IFNVLT5QcmVkcy5lbmQoKTsKKyAgICAgICBQICE9IFBFOyArK1ApIHsKKyAgICBpZiAoKFAtPmdldEtpbmQoKSA9PSBTRGVwOjpBbnRpKSB8fCAoUC0+Z2V0S2luZCgpID09IFNEZXA6Ok91dHB1dCkpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IFAtPmdldFJlZygpOworICAgICAgaWYgKFJlZ1NldC5jb3VudChSZWcpID09IDApIHsKKyAgICAgICAgRWRnZXMucHVzaF9iYWNrKCYqUCk7CisgICAgICAgIFJlZ1NldC5pbnNlcnQoUmVnKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8vIENyaXRpY2FsUGF0aFN0ZXAgLSBSZXR1cm4gdGhlIG5leHQgU1VuaXQgYWZ0ZXIgU1Ugb24gdGhlIGJvdHRvbS11cAorLy8vIGNyaXRpY2FsIHBhdGguCitzdGF0aWMgY29uc3QgU1VuaXQgKkNyaXRpY2FsUGF0aFN0ZXAoY29uc3QgU1VuaXQgKlNVKSB7CisgIGNvbnN0IFNEZXAgKk5leHQgPSAwOworICB1bnNpZ25lZCBOZXh0RGVwdGggPSAwOworICAvLyBGaW5kIHRoZSBwcmVkZWNlc3NvciBlZGdlIHdpdGggdGhlIGdyZWF0ZXN0IGRlcHRoLgorICBpZiAoU1UgIT0gMCkgeworICAgIGZvciAoU1VuaXQ6OmNvbnN0X3ByZWRfaXRlcmF0b3IgUCA9IFNVLT5QcmVkcy5iZWdpbigpLCBQRSA9IFNVLT5QcmVkcy5lbmQoKTsKKyAgICAgICAgIFAgIT0gUEU7ICsrUCkgeworICAgICAgY29uc3QgU1VuaXQgKlByZWRTVSA9IFAtPmdldFNVbml0KCk7CisgICAgICB1bnNpZ25lZCBQcmVkTGF0ZW5jeSA9IFAtPmdldExhdGVuY3koKTsKKyAgICAgIHVuc2lnbmVkIFByZWRUb3RhbExhdGVuY3kgPSBQcmVkU1UtPmdldERlcHRoKCkgKyBQcmVkTGF0ZW5jeTsKKyAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGEgbGF0ZW5jeSB0aWUsIHByZWZlciBhbiBhbnRpLWRlcGVuZGVuY3kgZWRnZSBvdmVyCisgICAgICAvLyBvdGhlciB0eXBlcyBvZiBlZGdlcy4KKyAgICAgIGlmIChOZXh0RGVwdGggPCBQcmVkVG90YWxMYXRlbmN5IHx8CisgICAgICAgICAgKE5leHREZXB0aCA9PSBQcmVkVG90YWxMYXRlbmN5ICYmIFAtPmdldEtpbmQoKSA9PSBTRGVwOjpBbnRpKSkgeworICAgICAgICBOZXh0RGVwdGggPSBQcmVkVG90YWxMYXRlbmN5OworICAgICAgICBOZXh0ID0gJipQOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAoTmV4dCkgPyBOZXh0LT5nZXRTVW5pdCgpIDogMDsKK30KKwordm9pZCBBZ2dyZXNzaXZlQW50aURlcEJyZWFrZXI6OkhhbmRsZUxhc3RVc2UodW5zaWduZWQgUmVnLCB1bnNpZ25lZCBLaWxsSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9vdGVyKSB7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmS2lsbEluZGljZXMgPSBTdGF0ZS0+R2V0S2lsbEluZGljZXMoKTsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZEZWZJbmRpY2VzID0gU3RhdGUtPkdldERlZkluZGljZXMoKTsKKyAgc3RkOjptdWx0aW1hcDx1bnNpZ25lZCwgQWdncmVzc2l2ZUFudGlEZXBTdGF0ZTo6UmVnaXN0ZXJSZWZlcmVuY2U+JgorICAgIFJlZ1JlZnMgPSBTdGF0ZS0+R2V0UmVnUmVmcygpOworCisgIGlmICghU3RhdGUtPklzTGl2ZShSZWcpKSB7CisgICAgS2lsbEluZGljZXNbUmVnXSA9IEtpbGxJZHg7CisgICAgRGVmSW5kaWNlc1tSZWddID0gfjB1OworICAgIFJlZ1JlZnMuZXJhc2UoUmVnKTsKKyAgICBTdGF0ZS0+TGVhdmVHcm91cChSZWcpOworICAgIERFQlVHKGlmIChoZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBkYmdzKCkgPDwgaGVhZGVyIDw8IFRSSS0+Z2V0TmFtZShSZWcpOyBoZWFkZXIgPSBOVUxMOyB9KTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIi0+ZyIgPDwgU3RhdGUtPkdldEdyb3VwKFJlZykgPDwgdGFnKTsKKyAgfQorICAvLyBSZXBlYXQgZm9yIHN1YnJlZ2lzdGVycy4KKyAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3VicmVnID0gVFJJLT5nZXRTdWJSZWdpc3RlcnMoUmVnKTsKKyAgICAgICAqU3VicmVnOyArK1N1YnJlZykgeworICAgIHVuc2lnbmVkIFN1YnJlZ1JlZyA9ICpTdWJyZWc7CisgICAgaWYgKCFTdGF0ZS0+SXNMaXZlKFN1YnJlZ1JlZykpIHsKKyAgICAgIEtpbGxJbmRpY2VzW1N1YnJlZ1JlZ10gPSBLaWxsSWR4OworICAgICAgRGVmSW5kaWNlc1tTdWJyZWdSZWddID0gfjB1OworICAgICAgUmVnUmVmcy5lcmFzZShTdWJyZWdSZWcpOworICAgICAgU3RhdGUtPkxlYXZlR3JvdXAoU3VicmVnUmVnKTsKKyAgICAgIERFQlVHKGlmIChoZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgIGRiZ3MoKSA8PCBoZWFkZXIgPDwgVFJJLT5nZXROYW1lKFJlZyk7IGhlYWRlciA9IE5VTEw7IH0pOworICAgICAgREVCVUcoZGJncygpIDw8ICIgIiA8PCBUUkktPmdldE5hbWUoU3VicmVnUmVnKSA8PCAiLT5nIiA8PAorICAgICAgICAgICAgU3RhdGUtPkdldEdyb3VwKFN1YnJlZ1JlZykgPDwgdGFnKTsKKyAgICB9CisgIH0KKworICBERUJVRyhpZiAoKGhlYWRlciA9PSBOVUxMKSAmJiAoZm9vdGVyICE9IE5VTEwpKSBkYmdzKCkgPDwgZm9vdGVyKTsKK30KKwordm9pZCBBZ2dyZXNzaXZlQW50aURlcEJyZWFrZXI6OlByZXNjYW5JbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHVuc2lnbmVkPiYgUGFzc3RocnVSZWdzKSB7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmRGVmSW5kaWNlcyA9IFN0YXRlLT5HZXREZWZJbmRpY2VzKCk7CisgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OlJlZ2lzdGVyUmVmZXJlbmNlPiYKKyAgICBSZWdSZWZzID0gU3RhdGUtPkdldFJlZ1JlZnMoKTsKKworICAvLyBIYW5kbGUgZGVhZCBkZWZzIGJ5IHNpbXVsYXRpbmcgYSBsYXN0LXVzZSBvZiB0aGUgcmVnaXN0ZXIganVzdAorICAvLyBhZnRlciB0aGUgZGVmLiBBIGRlYWQgZGVmIGNhbiBvY2N1ciBiZWNhdXNlIHRoZSBkZWYgaXMgdHJ1ZWx5CisgIC8vIGRlYWQsIG9yIGJlY2F1c2Ugb25seSBhIHN1YnJlZ2lzdGVyIGlzIGxpdmUgYXQgdGhlIGRlZi4gSWYgd2UKKyAgLy8gZG9uJ3QgZG8gdGhpcyB0aGUgZGVhZCBkZWYgd2lsbCBiZSBpbmNvcnJlY3RseSBtZXJnZWQgaW50byB0aGUKKyAgLy8gcHJldmlvdXMgZGVmLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc0RlZigpKSBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBpZiAoUmVnID09IDApIGNvbnRpbnVlOworCisgICAgSGFuZGxlTGFzdFVzZShSZWcsIENvdW50ICsgMSwgIiIsICJcdERlYWQgRGVmOiAiLCAiXG4iKTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiXHREZWYgR3JvdXBzOiIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc0RlZigpKSBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBpZiAoUmVnID09IDApIGNvbnRpbnVlOworCisgICAgREVCVUcoZGJncygpIDw8ICIgIiA8PCBUUkktPmdldE5hbWUoUmVnKSA8PCAiPWciIDw8IFN0YXRlLT5HZXRHcm91cChSZWcpKTsKKworICAgIC8vIElmIE1JJ3MgZGVmcyBoYXZlIGEgc3BlY2lhbCBhbGxvY2F0aW9uIHJlcXVpcmVtZW50LCBkb24ndCBhbGxvdworICAgIC8vIGFueSBkZWYgcmVnaXN0ZXJzIHRvIGJlIGNoYW5nZWQuIEFsc28gYXNzdW1lIGFsbCByZWdpc3RlcnMKKyAgICAvLyBkZWZpbmVkIGluIGEgY2FsbCBtdXN0IG5vdCBiZSBjaGFuZ2VkIChBQkkpLgorICAgIGlmIChNSS0+Z2V0RGVzYygpLmlzQ2FsbCgpIHx8IE1JLT5nZXREZXNjKCkuaGFzRXh0cmFEZWZSZWdBbGxvY1JlcSgpIHx8CisgICAgICAgIFRJSS0+aXNQcmVkaWNhdGVkKE1JKSkgeworICAgICAgREVCVUcoaWYgKFN0YXRlLT5HZXRHcm91cChSZWcpICE9IDApIGRiZ3MoKSA8PCAiLT5nMChhbGxvYy1yZXEpIik7CisgICAgICBTdGF0ZS0+VW5pb25Hcm91cHMoUmVnLCAwKTsKKyAgICB9CisKKyAgICAvLyBBbnkgYWxpYXNlZCB0aGF0IGFyZSBsaXZlIGF0IHRoaXMgcG9pbnQgYXJlIGNvbXBsZXRlbHkgb3IKKyAgICAvLyBwYXJ0aWFsbHkgZGVmaW5lZCBoZXJlLCBzbyBncm91cCB0aG9zZSBhbGlhc2VzIHdpdGggUmVnLgorICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqQWxpYXM7ICsrQWxpYXMpIHsKKyAgICAgIHVuc2lnbmVkIEFsaWFzUmVnID0gKkFsaWFzOworICAgICAgaWYgKFN0YXRlLT5Jc0xpdmUoQWxpYXNSZWcpKSB7CisgICAgICAgIFN0YXRlLT5Vbmlvbkdyb3VwcyhSZWcsIEFsaWFzUmVnKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICItPmciIDw8IFN0YXRlLT5HZXRHcm91cChSZWcpIDw8ICIodmlhICIgPDwKKyAgICAgICAgICAgICAgVFJJLT5nZXROYW1lKEFsaWFzUmVnKSA8PCAiKSIpOworICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGUgcmVnaXN0ZXIgcmVmZXJlbmNlLi4uCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBOVUxMOworICAgIGlmIChpIDwgTUktPmdldERlc2MoKS5nZXROdW1PcGVyYW5kcygpKQorICAgICAgUkMgPSBNSS0+Z2V0RGVzYygpLk9wSW5mb1tpXS5nZXRSZWdDbGFzcyhUUkkpOworICAgIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OlJlZ2lzdGVyUmVmZXJlbmNlIFJSID0geyAmTU8sIFJDIH07CisgICAgUmVnUmVmcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUmVnLCBSUikpOworICB9CisKKyAgREVCVUcoZGJncygpIDw8ICdcbicpOworCisgIC8vIFNjYW4gdGhlIHJlZ2lzdGVyIGRlZnMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gYW5kIHVwZGF0ZQorICAvLyBsaXZlLXJhbmdlcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNEZWYoKSkgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKFJlZyA9PSAwKSBjb250aW51ZTsKKyAgICAvLyBJZ25vcmUgS0lMTHMgYW5kIHBhc3N0aHJ1IHJlZ2lzdGVycyBmb3IgbGl2ZW5lc3MuLi4KKyAgICBpZiAoTUktPmlzS2lsbCgpIHx8IChQYXNzdGhydVJlZ3MuY291bnQoUmVnKSAhPSAwKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gVXBkYXRlIGRlZiBmb3IgUmVnIGFuZCBhbGlhc2VzLgorICAgIERlZkluZGljZXNbUmVnXSA9IENvdW50OworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOworICAgICAgICAgKkFsaWFzOyArK0FsaWFzKSB7CisgICAgICB1bnNpZ25lZCBBbGlhc1JlZyA9ICpBbGlhczsKKyAgICAgIERlZkluZGljZXNbQWxpYXNSZWddID0gQ291bnQ7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyOjpTY2FuSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ291bnQpIHsKKyAgREVCVUcoZGJncygpIDw8ICJcdFVzZSBHcm91cHM6Iik7CisgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OlJlZ2lzdGVyUmVmZXJlbmNlPiYKKyAgICBSZWdSZWZzID0gU3RhdGUtPkdldFJlZ1JlZnMoKTsKKworICAvLyBJZiBNSSdzIHVzZXMgaGF2ZSBzcGVjaWFsIGFsbG9jYXRpb24gcmVxdWlyZW1lbnQsIGRvbid0IGFsbG93CisgIC8vIGFueSB1c2UgcmVnaXN0ZXJzIHRvIGJlIGNoYW5nZWQuIEFsc28gYXNzdW1lIGFsbCByZWdpc3RlcnMKKyAgLy8gdXNlZCBpbiBhIGNhbGwgbXVzdCBub3QgYmUgY2hhbmdlZCAoQUJJKS4KKyAgLy8gRklYTUU6IFRoZSBpc3N1ZSB3aXRoIHByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24gaXMgbW9yZSBjb21wbGV4LiBXZSBhcmUgYmVpbmcKKyAgLy8gY29uc2VydmF0aXZlbHkgaGVyZSBiZWNhdXNlIHRoZSBraWxsIG1hcmtlcnMgY2Fubm90IGJlIHRydXN0ZWQgYWZ0ZXIKKyAgLy8gaWYtY29udmVyc2lvbjoKKyAgLy8gJVI2PGRlZj4gPSBMRFIgJVNQLCAlcmVnMCwgOTIsIHByZWQ6MTQsIHByZWQ6JXJlZzA7IG1lbTpMRDRbRml4ZWRTdGFjazE0XQorICAvLyAuLi4KKyAgLy8gU1RSICVSMCwgJVI2PGtpbGw+LCAlcmVnMCwgMCwgcHJlZDowLCBwcmVkOiVDUFNSOyBtZW06U1Q0WyUzOTVdCisgIC8vICVSNjxkZWY+ID0gTERSICVTUCwgJXJlZzAsIDEwMCwgcHJlZDowLCBwcmVkOiVDUFNSOyBtZW06TEQ0W0ZpeGVkU3RhY2sxMl0KKyAgLy8gU1RSICVSMCwgJVI2PGtpbGw+LCAlcmVnMCwgMCwgcHJlZDoxNCwgcHJlZDolcmVnMDsgbWVtOlNUNFslMzk2XShhbGlnbj04KQorICAvLworICAvLyBUaGUgZmlyc3QgUjYga2lsbCBpcyBub3QgcmVhbGx5IGEga2lsbCBzaW5jZSBpdCdzIGtpbGxlZCBieSBhIHByZWRpY2F0ZWQKKyAgLy8gaW5zdHJ1Y3Rpb24gd2hpY2ggbWF5IG5vdCBiZSBleGVjdXRlZC4gVGhlIHNlY29uZCBSNiBkZWYgbWF5IG9yIG1heSBub3QKKyAgLy8gcmUtZGVmaW5lIFI2IHNvIGl0J3Mgbm90IHNhZmUgdG8gY2hhbmdlIGl0IHNpbmNlIHRoZSBsYXN0IFI2IHVzZSBjYW5ub3QgYmUKKyAgLy8gY2hhbmdlZC4KKyAgYm9vbCBTcGVjaWFsID0gTUktPmdldERlc2MoKS5pc0NhbGwoKSB8fAorICAgIE1JLT5nZXREZXNjKCkuaGFzRXh0cmFTcmNSZWdBbGxvY1JlcSgpIHx8CisgICAgVElJLT5pc1ByZWRpY2F0ZWQoTUkpOworCisgIC8vIFNjYW4gdGhlIHJlZ2lzdGVyIHVzZXMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gYW5kIHVwZGF0ZQorICAvLyBsaXZlLXJhbmdlcywgZ3JvdXBzIGFuZCBSZWdSZWZzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc1VzZSgpKSBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBpZiAoUmVnID09IDApIGNvbnRpbnVlOworCisgICAgREVCVUcoZGJncygpIDw8ICIgIiA8PCBUUkktPmdldE5hbWUoUmVnKSA8PCAiPWciIDw8CisgICAgICAgICAgU3RhdGUtPkdldEdyb3VwKFJlZykpOworCisgICAgLy8gSXQgd2Fzbid0IHByZXZpb3VzbHkgbGl2ZSBidXQgbm93IGl0IGlzLCB0aGlzIGlzIGEga2lsbC4gRm9yZ2V0CisgICAgLy8gdGhlIHByZXZpb3VzIGxpdmUtcmFuZ2UgaW5mb3JtYXRpb24gYW5kIHN0YXJ0IGEgbmV3IGxpdmUtcmFuZ2UKKyAgICAvLyBmb3IgdGhlIHJlZ2lzdGVyLgorICAgIEhhbmRsZUxhc3RVc2UoUmVnLCBDb3VudCwgIihsYXN0LXVzZSkiKTsKKworICAgIGlmIChTcGVjaWFsKSB7CisgICAgICBERUJVRyhpZiAoU3RhdGUtPkdldEdyb3VwKFJlZykgIT0gMCkgZGJncygpIDw8ICItPmcwKGFsbG9jLXJlcSkiKTsKKyAgICAgIFN0YXRlLT5Vbmlvbkdyb3VwcyhSZWcsIDApOworICAgIH0KKworICAgIC8vIE5vdGUgcmVnaXN0ZXIgcmVmZXJlbmNlLi4uCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBOVUxMOworICAgIGlmIChpIDwgTUktPmdldERlc2MoKS5nZXROdW1PcGVyYW5kcygpKQorICAgICAgUkMgPSBNSS0+Z2V0RGVzYygpLk9wSW5mb1tpXS5nZXRSZWdDbGFzcyhUUkkpOworICAgIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OlJlZ2lzdGVyUmVmZXJlbmNlIFJSID0geyAmTU8sIFJDIH07CisgICAgUmVnUmVmcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUmVnLCBSUikpOworICB9CisKKyAgREVCVUcoZGJncygpIDw8ICdcbicpOworCisgIC8vIEZvcm0gYSBncm91cCBvZiBhbGwgZGVmcyBhbmQgdXNlcyBvZiBhIEtJTEwgaW5zdHJ1Y3Rpb24gdG8gZW5zdXJlCisgIC8vIHRoYXQgYWxsIHJlZ2lzdGVycyBhcmUgcmVuYW1lZCBhcyBhIGdyb3VwLgorICBpZiAoTUktPmlzS2lsbCgpKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJcdEtpbGwgR3JvdXA6Iik7CisKKyAgICB1bnNpZ25lZCBGaXJzdFJlZyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkpIGNvbnRpbnVlOworICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBpZiAoUmVnID09IDApIGNvbnRpbnVlOworCisgICAgICBpZiAoRmlyc3RSZWcgIT0gMCkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIj0iIDw8IFRSSS0+Z2V0TmFtZShSZWcpKTsKKyAgICAgICAgU3RhdGUtPlVuaW9uR3JvdXBzKEZpcnN0UmVnLCBSZWcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIiA8PCBUUkktPmdldE5hbWUoUmVnKSk7CisgICAgICAgIEZpcnN0UmVnID0gUmVnOworICAgICAgfQorICAgIH0KKworICAgIERFQlVHKGRiZ3MoKSA8PCAiLT5nIiA8PCBTdGF0ZS0+R2V0R3JvdXAoRmlyc3RSZWcpIDw8ICdcbicpOworICB9Cit9CisKK0JpdFZlY3RvciBBZ2dyZXNzaXZlQW50aURlcEJyZWFrZXI6OkdldFJlbmFtZVJlZ2lzdGVycyh1bnNpZ25lZCBSZWcpIHsKKyAgQml0VmVjdG9yIEJWKFRSSS0+Z2V0TnVtUmVncygpLCBmYWxzZSk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIC8vIENoZWNrIGFsbCByZWZlcmVuY2VzIHRoYXQgbmVlZCByZXdyaXRpbmcgZm9yIFJlZy4gRm9yIGVhY2gsIHVzZQorICAvLyB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlciBjbGFzcyB0byBuYXJyb3cgdGhlIHNldCBvZiByZWdpc3RlcnMKKyAgLy8gdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHJlbmFtaW5nLgorICBzdGQ6OnBhaXI8c3RkOjptdWx0aW1hcDx1bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OlJlZ2lzdGVyUmVmZXJlbmNlPjo6aXRlcmF0b3IsCisgICAgICAgICAgICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgQWdncmVzc2l2ZUFudGlEZXBTdGF0ZTo6UmVnaXN0ZXJSZWZlcmVuY2U+OjppdGVyYXRvcj4KKyAgICBSYW5nZSA9IFN0YXRlLT5HZXRSZWdSZWZzKCkuZXF1YWxfcmFuZ2UoUmVnKTsKKyAgZm9yIChzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLAorICAgICAgIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGU6OlJlZ2lzdGVyUmVmZXJlbmNlPjo6aXRlcmF0b3IgUSA9IFJhbmdlLmZpcnN0LAorICAgICAgIFFFID0gUmFuZ2Uuc2Vjb25kOyBRICE9IFFFOyArK1EpIHsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IFEtPnNlY29uZC5SQzsKKyAgICBpZiAoUkMgPT0gTlVMTCkgY29udGludWU7CisKKyAgICBCaXRWZWN0b3IgUkNCViA9IFRSSS0+Z2V0QWxsb2NhdGFibGVTZXQoTUYsIFJDKTsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIEJWIHw9IFJDQlY7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBCViAmPSBSQ0JWOworICAgIH0KKworICAgIERFQlVHKGRiZ3MoKSA8PCAiICIgPDwgUkMtPmdldE5hbWUoKSk7CisgIH0KKworICByZXR1cm4gQlY7Cit9CisKK2Jvb2wgQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyOjpGaW5kU3VpdGFibGVGcmVlUmVnaXN0ZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbnRpRGVwR3JvdXBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuYW1lT3JkZXJUeXBlJiBSZW5hbWVPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dW5zaWduZWQsIHVuc2lnbmVkPiAmUmVuYW1lTWFwKSB7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmS2lsbEluZGljZXMgPSBTdGF0ZS0+R2V0S2lsbEluZGljZXMoKTsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZEZWZJbmRpY2VzID0gU3RhdGUtPkdldERlZkluZGljZXMoKTsKKyAgc3RkOjptdWx0aW1hcDx1bnNpZ25lZCwgQWdncmVzc2l2ZUFudGlEZXBTdGF0ZTo6UmVnaXN0ZXJSZWZlcmVuY2U+JgorICAgIFJlZ1JlZnMgPSBTdGF0ZS0+R2V0UmVnUmVmcygpOworCisgIC8vIENvbGxlY3QgYWxsIHJlZmVyZW5jZWQgcmVnaXN0ZXJzIGluIHRoZSBzYW1lIGdyb3VwIGFzCisgIC8vIEFudGlEZXBSZWcuIFRoZXNlIGFsbCBuZWVkIHRvIGJlIHJlbmFtZWQgdG9nZXRoZXIgaWYgd2UgYXJlIHRvCisgIC8vIGJyZWFrIHRoZSBhbnRpLWRlcGVuZGVuY2UuCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBSZWdzOworICBTdGF0ZS0+R2V0R3JvdXBSZWdzKEFudGlEZXBHcm91cEluZGV4LCBSZWdzLCAmUmVnUmVmcyk7CisgIGFzc2VydChSZWdzLnNpemUoKSA+IDAgJiYgIkVtcHR5IHJlZ2lzdGVyIGdyb3VwISIpOworICBpZiAoUmVncy5zaXplKCkgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRmluZCB0aGUgInN1cGVyZXN0IiByZWdpc3RlciBpbiB0aGUgZ3JvdXAuIEF0IHRoZSBzYW1lIHRpbWUsCisgIC8vIGNvbGxlY3QgdGhlIEJpdFZlY3RvciBvZiByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byByZW5hbWUKKyAgLy8gZWFjaCByZWdpc3Rlci4KKyAgREVCVUcoZGJncygpIDw8ICJcdFJlbmFtZSBDYW5kaWRhdGVzIGZvciBHcm91cCBnIiA8PCBBbnRpRGVwR3JvdXBJbmRleAorICAgICAgICA8PCAiOlxuIik7CisgIHN0ZDo6bWFwPHVuc2lnbmVkLCBCaXRWZWN0b3I+IFJlbmFtZVJlZ2lzdGVyTWFwOworICB1bnNpZ25lZCBTdXBlclJlZyA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBSZWdzW2ldOworICAgIGlmICgoU3VwZXJSZWcgPT0gMCkgfHwgVFJJLT5pc1N1cGVyUmVnaXN0ZXIoU3VwZXJSZWcsIFJlZykpCisgICAgICBTdXBlclJlZyA9IFJlZzsKKworICAgIC8vIElmIFJlZyBoYXMgYW55IHJlZmVyZW5jZXMsIHRoZW4gY29sbGVjdCBwb3NzaWJsZSByZW5hbWUgcmVncworICAgIGlmIChSZWdSZWZzLmNvdW50KFJlZykgPiAwKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHQiIDw8IFRSSS0+Z2V0TmFtZShSZWcpIDw8ICI6Iik7CisKKyAgICAgIEJpdFZlY3RvciBCViA9IEdldFJlbmFtZVJlZ2lzdGVycyhSZWcpOworICAgICAgUmVuYW1lUmVnaXN0ZXJNYXAuaW5zZXJ0KHN0ZDo6cGFpcjx1bnNpZ25lZCwgQml0VmVjdG9yPihSZWcsIEJWKSk7CisKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiIDo6Iik7CisgICAgICBERUJVRyhmb3IgKGludCByID0gQlYuZmluZF9maXJzdCgpOyByICE9IC0xOyByID0gQlYuZmluZF9uZXh0KHIpKQorICAgICAgICAgICAgICBkYmdzKCkgPDwgIiAiIDw8IFRSSS0+Z2V0TmFtZShyKSk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlxuIik7CisgICAgfQorICB9CisKKyAgLy8gQWxsIGdyb3VwIHJlZ2lzdGVycyBzaG91bGQgYmUgYSBzdWJyZWcgb2YgU3VwZXJSZWcuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBSZWdzW2ldOworICAgIGlmIChSZWcgPT0gU3VwZXJSZWcpIGNvbnRpbnVlOworICAgIGJvb2wgSXNTdWIgPSBUUkktPmlzU3ViUmVnaXN0ZXIoU3VwZXJSZWcsIFJlZyk7CisgICAgYXNzZXJ0KElzU3ViICYmICJFeHBlY3RpbmcgZ3JvdXAgc3VicmVnaXN0ZXIiKTsKKyAgICBpZiAoIUlzU3ViKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyNpZm5kZWYgTkRFQlVHCisgIC8vIElmIERlYnVnRGl2ID4gMCB0aGVuIG9ubHkgcmVuYW1lIChyZW5hbWVjbnQgJSBEZWJ1Z0RpdikgPT0gRGVidWdNb2QKKyAgaWYgKERlYnVnRGl2ID4gMCkgeworICAgIHN0YXRpYyBpbnQgcmVuYW1lY250ID0gMDsKKyAgICBpZiAocmVuYW1lY250KysgJSBEZWJ1Z0RpdiAhPSBEZWJ1Z01vZCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGRiZ3MoKSA8PCAiKioqIFBlcmZvcm1pbmcgcmVuYW1lICIgPDwgVFJJLT5nZXROYW1lKFN1cGVyUmVnKSA8PAorICAgICAgIiBmb3IgZGVidWcgKioqXG4iOworICB9CisjZW5kaWYKKworICAvLyBDaGVjayBlYWNoIHBvc3NpYmxlIHJlbmFtZSByZWdpc3RlciBmb3IgU3VwZXJSZWcgaW4gcm91bmQtcm9iaW4KKyAgLy8gb3JkZXIuIElmIHRoYXQgcmVnaXN0ZXIgaXMgYXZhaWxhYmxlLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgLy8gcmVnaXN0ZXJzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBvdGhlciBncm91cCBzdWJyZWdpc3RlcnMsIHRoZW4gd2UKKyAgLy8gY2FuIHVzZSB0aG9zZSByZWdpc3RlcnMgdG8gcmVuYW1lLgorCisgIC8vIEZJWE1FOiBVc2luZyBnZXRNaW5pbWFsUGh5c1JlZ0NsYXNzIGlzIHZlcnkgY29uc2VydmF0aXZlLiBXZSBzaG91bGQKKyAgLy8gY2hlY2sgZXZlcnkgdXNlIG9mIHRoZSByZWdpc3RlciBhbmQgZmluZCB0aGUgbGFyZ2VzdCByZWdpc3RlciBjbGFzcworICAvLyB0aGF0IGNhbiBiZSB1c2VkIGluIGFsbCBvZiB0aGVtLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpTdXBlclJDID0KKyAgICBUUkktPmdldE1pbmltYWxQaHlzUmVnQ2xhc3MoU3VwZXJSZWcsIE1WVDo6T3RoZXIpOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3M6Oml0ZXJhdG9yIFJCID0gU3VwZXJSQy0+YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihNRik7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3M6Oml0ZXJhdG9yIFJFID0gU3VwZXJSQy0+YWxsb2NhdGlvbl9vcmRlcl9lbmQoTUYpOworICBpZiAoUkIgPT0gUkUpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0RW1wdHkgU3VwZXIgUmVnY2xhc3MhIVxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgREVCVUcoZGJncygpIDw8ICJcdEZpbmQgUmVnaXN0ZXJzOiIpOworCisgIGlmIChSZW5hbWVPcmRlci5jb3VudChTdXBlclJDKSA9PSAwKQorICAgIFJlbmFtZU9yZGVyLmluc2VydChSZW5hbWVPcmRlclR5cGU6OnZhbHVlX3R5cGUoU3VwZXJSQywgUkUpKTsKKworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvciBPcmlnUiA9IFJlbmFtZU9yZGVyW1N1cGVyUkNdOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvciBFbmRSID0gKChPcmlnUiA9PSBSRSkgPyBSQiA6IE9yaWdSKTsKKyAgVGFyZ2V0UmVnaXN0ZXJDbGFzczo6aXRlcmF0b3IgUiA9IE9yaWdSOworICBkbyB7CisgICAgaWYgKFIgPT0gUkIpIFIgPSBSRTsKKyAgICAtLVI7CisgICAgY29uc3QgdW5zaWduZWQgTmV3U3VwZXJSZWcgPSAqUjsKKyAgICAvLyBEb24ndCByZXBsYWNlIGEgcmVnaXN0ZXIgd2l0aCBpdHNlbGYuCisgICAgaWYgKE5ld1N1cGVyUmVnID09IFN1cGVyUmVnKSBjb250aW51ZTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiIFsiIDw8IFRSSS0+Z2V0TmFtZShOZXdTdXBlclJlZykgPDwgJzonKTsKKyAgICBSZW5hbWVNYXAuY2xlYXIoKTsKKworICAgIC8vIEZvciBlYWNoIHJlZmVyZW5jZWQgZ3JvdXAgcmVnaXN0ZXIgKHdoaWNoIG11c3QgYmUgYSBTdXBlclJlZyBvcgorICAgIC8vIGEgc3VicmVnaXN0ZXIgb2YgU3VwZXJSZWcpLCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHN1YnJlZ2lzdGVyCisgICAgLy8gb2YgTmV3U3VwZXJSZWcgYW5kIG1ha2Ugc3VyZSBpdCBpcyBmcmVlIHRvIGJlIHJlbmFtZWQuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgdW5zaWduZWQgUmVnID0gUmVnc1tpXTsKKyAgICAgIHVuc2lnbmVkIE5ld1JlZyA9IDA7CisgICAgICBpZiAoUmVnID09IFN1cGVyUmVnKSB7CisgICAgICAgIE5ld1JlZyA9IE5ld1N1cGVyUmVnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgTmV3U3ViUmVnSWR4ID0gVFJJLT5nZXRTdWJSZWdJbmRleChTdXBlclJlZywgUmVnKTsKKyAgICAgICAgaWYgKE5ld1N1YlJlZ0lkeCAhPSAwKQorICAgICAgICAgIE5ld1JlZyA9IFRSSS0+Z2V0U3ViUmVnKE5ld1N1cGVyUmVnLCBOZXdTdWJSZWdJZHgpOworICAgICAgfQorCisgICAgICBERUJVRyhkYmdzKCkgPDwgIiAiIDw8IFRSSS0+Z2V0TmFtZShOZXdSZWcpKTsKKworICAgICAgLy8gQ2hlY2sgaWYgUmVnIGNhbiBiZSByZW5hbWVkIHRvIE5ld1JlZy4KKyAgICAgIEJpdFZlY3RvciBCViA9IFJlbmFtZVJlZ2lzdGVyTWFwW1JlZ107CisgICAgICBpZiAoIUJWLnRlc3QoTmV3UmVnKSkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIihubyByZW5hbWUpIik7CisgICAgICAgIGdvdG8gbmV4dF9zdXBlcl9yZWc7CisgICAgICB9CisKKyAgICAgIC8vIElmIE5ld1JlZyBpcyBkZWFkIGFuZCBOZXdSZWcncyBtb3N0IHJlY2VudCBkZWYgaXMgbm90IGJlZm9yZQorICAgICAgLy8gUmVncydzIGtpbGwsIGl0J3Mgc2FmZSB0byByZXBsYWNlIFJlZyB3aXRoIE5ld1JlZy4gV2UKKyAgICAgIC8vIG11c3QgYWxzbyBjaGVjayBhbGwgYWxpYXNlcyBvZiBOZXdSZWcsIGJlY2F1c2Ugd2UgY2FuJ3QgZGVmaW5lIGEKKyAgICAgIC8vIHJlZ2lzdGVyIHdoZW4gYW55IHN1YiBvciBzdXBlciBpcyBhbHJlYWR5IGxpdmUuCisgICAgICBpZiAoU3RhdGUtPklzTGl2ZShOZXdSZWcpIHx8IChLaWxsSW5kaWNlc1tSZWddID4gRGVmSW5kaWNlc1tOZXdSZWddKSkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIihsaXZlKSIpOworICAgICAgICBnb3RvIG5leHRfc3VwZXJfcmVnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBbGlhcyA9IFRSSS0+Z2V0QWxpYXNTZXQoTmV3UmVnKTsKKyAgICAgICAgICAgICAqQWxpYXM7ICsrQWxpYXMpIHsKKyAgICAgICAgICB1bnNpZ25lZCBBbGlhc1JlZyA9ICpBbGlhczsKKyAgICAgICAgICBpZiAoU3RhdGUtPklzTGl2ZShBbGlhc1JlZykgfHwKKyAgICAgICAgICAgICAgKEtpbGxJbmRpY2VzW1JlZ10gPiBEZWZJbmRpY2VzW0FsaWFzUmVnXSkpIHsKKyAgICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiKGFsaWFzICIgPDwgVFJJLT5nZXROYW1lKEFsaWFzUmVnKSA8PCAiIGxpdmUpIik7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgIGdvdG8gbmV4dF9zdXBlcl9yZWc7CisgICAgICB9CisKKyAgICAgIC8vIFJlY29yZCB0aGF0ICdSZWcnIGNhbiBiZSByZW5hbWVkIHRvICdOZXdSZWcnLgorICAgICAgUmVuYW1lTWFwLmluc2VydChzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPihSZWcsIE5ld1JlZykpOworICAgIH0KKworICAgIC8vIElmIHdlIGZhbGwtb3V0IGhlcmUsIHRoZW4gZXZlcnkgcmVnaXN0ZXIgaW4gdGhlIGdyb3VwIGNhbiBiZQorICAgIC8vIHJlbmFtZWQsIGFzIHJlY29yZGVkIGluIFJlbmFtZU1hcC4KKyAgICBSZW5hbWVPcmRlci5lcmFzZShTdXBlclJDKTsKKyAgICBSZW5hbWVPcmRlci5pbnNlcnQoUmVuYW1lT3JkZXJUeXBlOjp2YWx1ZV90eXBlKFN1cGVyUkMsIFIpKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIl1cbiIpOworICAgIHJldHVybiB0cnVlOworCisgIG5leHRfc3VwZXJfcmVnOgorICAgIERFQlVHKGRiZ3MoKSA8PCAnXScpOworICB9IHdoaWxlIChSICE9IEVuZFIpOworCisgIERFQlVHKGRiZ3MoKSA8PCAnXG4nKTsKKworICAvLyBObyByZWdpc3RlcnMgYXJlIGZyZWUgYW5kIGF2YWlsYWJsZSEKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gQnJlYWtBbnRpRGVwZW5kZW5jaWVzIC0gSWRlbnRpZml5IGFudGktZGVwZW5kZW5jaWVzIHdpdGhpbiB0aGUKKy8vLyBTY2hlZHVsZURBRyBhbmQgYnJlYWsgdGhlbSBieSByZW5hbWluZyByZWdpc3RlcnMuCisvLy8KK3Vuc2lnbmVkIEFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlcjo6QnJlYWtBbnRpRGVwZW5kZW5jaWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U1VuaXQ+JiBTVW5pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5zZXJ0UG9zSW5kZXgpIHsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZLaWxsSW5kaWNlcyA9IFN0YXRlLT5HZXRLaWxsSW5kaWNlcygpOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJkRlZkluZGljZXMgPSBTdGF0ZS0+R2V0RGVmSW5kaWNlcygpOworICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBBZ2dyZXNzaXZlQW50aURlcFN0YXRlOjpSZWdpc3RlclJlZmVyZW5jZT4mCisgICAgUmVnUmVmcyA9IFN0YXRlLT5HZXRSZWdSZWZzKCk7CisKKyAgLy8gVGhlIGNvZGUgYmVsb3cgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpbnN0cnVjdGlvbiwKKyAgLy8gc28ganVzdCBkdWNrIG91dCBpbW1lZGlhdGVseSBpZiB0aGUgYmxvY2sgaXMgZW1wdHkuCisgIGlmIChTVW5pdHMuZW1wdHkoKSkgcmV0dXJuIDA7CisKKyAgLy8gRm9yIGVhY2ggcmVnY2xhc3MgdGhlIG5leHQgcmVnaXN0ZXIgdG8gdXNlIGZvciByZW5hbWluZy4KKyAgUmVuYW1lT3JkZXJUeXBlIFJlbmFtZU9yZGVyOworCisgIC8vIC4uLm5lZWQgYSBtYXAgZnJvbSBNSSB0byBTVW5pdC4KKyAgc3RkOjptYXA8TWFjaGluZUluc3RyICosIGNvbnN0IFNVbml0ICo+IE1JU1VuaXRNYXA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVW5pdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IFNVbml0ICpTVSA9ICZTVW5pdHNbaV07CisgICAgTUlTVW5pdE1hcC5pbnNlcnQoc3RkOjpwYWlyPE1hY2hpbmVJbnN0ciAqLCBjb25zdCBTVW5pdCAqPihTVS0+Z2V0SW5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVKSk7CisgIH0KKworICAvLyBUcmFjayBwcm9ncmVzcyBhbG9uZyB0aGUgY3JpdGljYWwgcGF0aCB0aHJvdWdoIHRoZSBTVW5pdCBncmFwaCBhcworICAvLyB3ZSB3YWxrIHRoZSBpbnN0cnVjdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGZvciByZWdjbGFzc2VzIHRoYXQgb25seQorICAvLyBicmVhayBjcml0aWNhbC1wYXRoIGFudGktZGVwZW5kZW5jaWVzLgorICBjb25zdCBTVW5pdCAqQ3JpdGljYWxQYXRoU1UgPSAwOworICBNYWNoaW5lSW5zdHIgKkNyaXRpY2FsUGF0aE1JID0gMDsKKyAgaWYgKENyaXRpY2FsUGF0aFNldC5hbnkoKSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVW5pdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgU1VuaXQgKlNVID0gJlNVbml0c1tpXTsKKyAgICAgIGlmICghQ3JpdGljYWxQYXRoU1UgfHwKKyAgICAgICAgICAoKFNVLT5nZXREZXB0aCgpICsgU1UtPkxhdGVuY3kpID4KKyAgICAgICAgICAgKENyaXRpY2FsUGF0aFNVLT5nZXREZXB0aCgpICsgQ3JpdGljYWxQYXRoU1UtPkxhdGVuY3kpKSkgeworICAgICAgICBDcml0aWNhbFBhdGhTVSA9IFNVOworICAgICAgfQorICAgIH0KKworICAgIENyaXRpY2FsUGF0aE1JID0gQ3JpdGljYWxQYXRoU1UtPmdldEluc3RyKCk7CisgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgREVCVUcoZGJncygpIDw8ICJcbj09PT09IEFnZ3Jlc3NpdmUgYW50aS1kZXBlbmRlbmN5IGJyZWFraW5nXG4iKTsKKyAgREVCVUcoZGJncygpIDw8ICJBdmFpbGFibGUgcmVnczoiKTsKKyAgZm9yICh1bnNpZ25lZCBSZWcgPSAwOyBSZWcgPCBUUkktPmdldE51bVJlZ3MoKTsgKytSZWcpIHsKKyAgICBpZiAoIVN0YXRlLT5Jc0xpdmUoUmVnKSkKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICIgPDwgVFJJLT5nZXROYW1lKFJlZykpOworICB9CisgIERFQlVHKGRiZ3MoKSA8PCAnXG4nKTsKKyNlbmRpZgorCisgIC8vIEF0dGVtcHQgdG8gYnJlYWsgYW50aS1kZXBlbmRlbmNlIGVkZ2VzLiBXYWxrIHRoZSBpbnN0cnVjdGlvbnMKKyAgLy8gZnJvbSB0aGUgYm90dG9tIHVwLCB0cmFja2luZyBpbmZvcm1hdGlvbiBhYm91dCBsaXZlbmVzcyBhcyB3ZSBnbworICAvLyB0byBoZWxwIGRldGVybWluZSB3aGljaCByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZS4KKyAgdW5zaWduZWQgQnJva2VuID0gMDsKKyAgdW5zaWduZWQgQ291bnQgPSBJbnNlcnRQb3NJbmRleCAtIDE7CisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBFbmQsIEUgPSBCZWdpbjsKKyAgICAgICBJICE9IEU7IC0tQ291bnQpIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gLS1JOworCisgICAgREVCVUcoZGJncygpIDw8ICJBbnRpOiAiKTsKKyAgICBERUJVRyhNSS0+ZHVtcCgpKTsKKworICAgIHN0ZDo6c2V0PHVuc2lnbmVkPiBQYXNzdGhydVJlZ3M7CisgICAgR2V0UGFzc3RocnVSZWdzKE1JLCBQYXNzdGhydVJlZ3MpOworCisgICAgLy8gUHJvY2VzcyB0aGUgZGVmcyBpbiBNSS4uLgorICAgIFByZXNjYW5JbnN0cnVjdGlvbihNSSwgQ291bnQsIFBhc3N0aHJ1UmVncyk7CisKKyAgICAvLyBUaGUgZGVwZW5kZW5jZSBlZGdlcyB0aGF0IHJlcHJlc2VudCBhbnRpLSBhbmQgb3V0cHV0LQorICAgIC8vIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBjYW5kaWRhdGVzIGZvciBicmVha2luZy4KKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBTRGVwICo+IEVkZ2VzOworICAgIGNvbnN0IFNVbml0ICpQYXRoU1UgPSBNSVNVbml0TWFwW01JXTsKKyAgICBBbnRpRGVwRWRnZXMoUGF0aFNVLCBFZGdlcyk7CisKKyAgICAvLyBJZiBNSSBpcyBub3Qgb24gdGhlIGNyaXRpY2FsIHBhdGgsIHRoZW4gd2UgZG9uJ3QgcmVuYW1lCisgICAgLy8gcmVnaXN0ZXJzIGluIHRoZSBDcml0aWNhbFBhdGhTZXQuCisgICAgQml0VmVjdG9yICpFeGNsdWRlUmVncyA9IE5VTEw7CisgICAgaWYgKE1JID09IENyaXRpY2FsUGF0aE1JKSB7CisgICAgICBDcml0aWNhbFBhdGhTVSA9IENyaXRpY2FsUGF0aFN0ZXAoQ3JpdGljYWxQYXRoU1UpOworICAgICAgQ3JpdGljYWxQYXRoTUkgPSAoQ3JpdGljYWxQYXRoU1UpID8gQ3JpdGljYWxQYXRoU1UtPmdldEluc3RyKCkgOiAwOworICAgIH0gZWxzZSB7CisgICAgICBFeGNsdWRlUmVncyA9ICZDcml0aWNhbFBhdGhTZXQ7CisgICAgfQorCisgICAgLy8gSWdub3JlIEtJTEwgaW5zdHJ1Y3Rpb25zICh0aGV5IGZvcm0gYSBncm91cCBpbiBTY2FuSW5zdHJ1Y3Rpb24KKyAgICAvLyBidXQgZG9uJ3QgY2F1c2UgYW55IGFudGktZGVwZW5kZW5jZSBicmVha2luZyB0aGVtc2VsdmVzKQorICAgIGlmICghTUktPmlzS2lsbCgpKSB7CisgICAgICAvLyBBdHRlbXB0IHRvIGJyZWFrIGVhY2ggYW50aS1kZXBlbmRlbmN5Li4uCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRWRnZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBjb25zdCBTRGVwICpFZGdlID0gRWRnZXNbaV07CisgICAgICAgIFNVbml0ICpOZXh0U1UgPSBFZGdlLT5nZXRTVW5pdCgpOworCisgICAgICAgIGlmICgoRWRnZS0+Z2V0S2luZCgpICE9IFNEZXA6OkFudGkpICYmCisgICAgICAgICAgICAoRWRnZS0+Z2V0S2luZCgpICE9IFNEZXA6Ok91dHB1dCkpIGNvbnRpbnVlOworCisgICAgICAgIHVuc2lnbmVkIEFudGlEZXBSZWcgPSBFZGdlLT5nZXRSZWcoKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJcdEFudGlkZXAgcmVnOiAiIDw8IFRSSS0+Z2V0TmFtZShBbnRpRGVwUmVnKSk7CisgICAgICAgIGFzc2VydChBbnRpRGVwUmVnICE9IDAgJiYgIkFudGktZGVwZW5kZW5jZSBvbiByZWcwPyIpOworCisgICAgICAgIGlmICghQWxsb2NhdGFibGVTZXQudGVzdChBbnRpRGVwUmVnKSkgeworICAgICAgICAgIC8vIERvbid0IGJyZWFrIGFudGktZGVwZW5kZW5jaWVzIG9uIG5vbi1hbGxvY2F0YWJsZSByZWdpc3RlcnMuCisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgKG5vbi1hbGxvY2F0YWJsZSlcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKChFeGNsdWRlUmVncyAhPSBOVUxMKSAmJiBFeGNsdWRlUmVncy0+dGVzdChBbnRpRGVwUmVnKSkgeworICAgICAgICAgIC8vIERvbid0IGJyZWFrIGFudGktZGVwZW5kZW5jaWVzIGZvciBjcml0aWNhbCBwYXRoIHJlZ2lzdGVycworICAgICAgICAgIC8vIGlmIG5vdCBvbiB0aGUgY3JpdGljYWwgcGF0aAorICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiIChub3QgY3JpdGljYWwtcGF0aClcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKFBhc3N0aHJ1UmVncy5jb3VudChBbnRpRGVwUmVnKSAhPSAwKSB7CisgICAgICAgICAgLy8gSWYgdGhlIGFudGktZGVwIHJlZ2lzdGVyIGxpdmVuZXNzICJwYXNzZXMtdGhydSIsIHRoZW4KKyAgICAgICAgICAvLyBkb24ndCB0cnkgdG8gY2hhbmdlIGl0LiBJdCB3aWxsIGJlIGNoYW5nZWQgYWxvbmcgd2l0aAorICAgICAgICAgIC8vIHRoZSB1c2UgaWYgcmVxdWlyZWQgdG8gYnJlYWsgYW4gZWFybGllciBhbnRpZGVwLgorICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiIChwYXNzdGhydSlcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIE5vIGFudGktZGVwIGJyZWFraW5nIGZvciBpbXBsaWNpdCBkZXBzCisgICAgICAgICAgTWFjaGluZU9wZXJhbmQgKkFudGlEZXBPcCA9IE1JLT5maW5kUmVnaXN0ZXJEZWZPcGVyYW5kKEFudGlEZXBSZWcpOworICAgICAgICAgIGFzc2VydChBbnRpRGVwT3AgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAiQ2FuJ3QgZmluZCBpbmRleCBmb3IgZGVmaW5lZCByZWdpc3RlciBvcGVyYW5kIik7CisgICAgICAgICAgaWYgKChBbnRpRGVwT3AgPT0gTlVMTCkgfHwgQW50aURlcE9wLT5pc0ltcGxpY2l0KCkpIHsKKyAgICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiIChpbXBsaWNpdClcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gSWYgdGhlIFNVbml0IGhhcyBvdGhlciBkZXBlbmRlbmNpZXMgb24gdGhlIFNVbml0IHRoYXQKKyAgICAgICAgICAvLyBpdCBhbnRpLWRlcGVuZHMgb24sIGRvbid0IGJvdGhlciBicmVha2luZyB0aGUKKyAgICAgICAgICAvLyBhbnRpLWRlcGVuZGVuY3kgc2luY2UgdGhvc2UgZWRnZXMgd291bGQgcHJldmVudCBzdWNoCisgICAgICAgICAgLy8gdW5pdHMgZnJvbSBiZWluZyBzY2hlZHVsZWQgcGFzdCBlYWNoIG90aGVyCisgICAgICAgICAgLy8gcmVnYXJkbGVzcy4KKyAgICAgICAgICAvLworICAgICAgICAgIC8vIEFsc28sIGlmIHRoZXJlIGFyZSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgU1VuaXRzIHdpdGggdGhlCisgICAgICAgICAgLy8gc2FtZSByZWdpc3RlciBhcyB0aGUgYW50aS1kZXBlbmRlbmN5LCBkb24ndCBhdHRlbXB0IHRvCisgICAgICAgICAgLy8gYnJlYWsgaXQuCisgICAgICAgICAgZm9yIChTVW5pdDo6Y29uc3RfcHJlZF9pdGVyYXRvciBQID0gUGF0aFNVLT5QcmVkcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICBQRSA9IFBhdGhTVS0+UHJlZHMuZW5kKCk7IFAgIT0gUEU7ICsrUCkgeworICAgICAgICAgICAgaWYgKFAtPmdldFNVbml0KCkgPT0gTmV4dFNVID8KKyAgICAgICAgICAgICAgICAoUC0+Z2V0S2luZCgpICE9IFNEZXA6OkFudGkgfHwgUC0+Z2V0UmVnKCkgIT0gQW50aURlcFJlZykgOgorICAgICAgICAgICAgICAgIChQLT5nZXRLaW5kKCkgPT0gU0RlcDo6RGF0YSAmJiBQLT5nZXRSZWcoKSA9PSBBbnRpRGVwUmVnKSkgeworICAgICAgICAgICAgICBBbnRpRGVwUmVnID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoU1VuaXQ6OmNvbnN0X3ByZWRfaXRlcmF0b3IgUCA9IFBhdGhTVS0+UHJlZHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgUEUgPSBQYXRoU1UtPlByZWRzLmVuZCgpOyBQICE9IFBFOyArK1ApIHsKKyAgICAgICAgICAgIGlmICgoUC0+Z2V0U1VuaXQoKSA9PSBOZXh0U1UpICYmIChQLT5nZXRLaW5kKCkgIT0gU0RlcDo6QW50aSkgJiYKKyAgICAgICAgICAgICAgICAoUC0+Z2V0S2luZCgpICE9IFNEZXA6Ok91dHB1dCkpIHsKKyAgICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgKHJlYWwgZGVwZW5kZW5jeSlcbiIpOworICAgICAgICAgICAgICBBbnRpRGVwUmVnID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChQLT5nZXRTVW5pdCgpICE9IE5leHRTVSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKFAtPmdldEtpbmQoKSA9PSBTRGVwOjpEYXRhKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAoUC0+Z2V0UmVnKCkgPT0gQW50aURlcFJlZykpIHsKKyAgICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgKG90aGVyIGRlcGVuZGVuY3kpXG4iKTsKKyAgICAgICAgICAgICAgQW50aURlcFJlZyA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChBbnRpRGVwUmVnID09IDApIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KEFudGlEZXBSZWcgIT0gMCk7CisgICAgICAgIGlmIChBbnRpRGVwUmVnID09IDApIGNvbnRpbnVlOworCisgICAgICAgIC8vIERldGVybWluZSBBbnRpRGVwUmVnJ3MgcmVnaXN0ZXIgZ3JvdXAuCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIEdyb3VwSW5kZXggPSBTdGF0ZS0+R2V0R3JvdXAoQW50aURlcFJlZyk7CisgICAgICAgIGlmIChHcm91cEluZGV4ID09IDApIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAoemVybyBncm91cClcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICdcbicpOworCisgICAgICAgIC8vIExvb2sgZm9yIGEgc3VpdGFibGUgcmVnaXN0ZXIgdG8gdXNlIHRvIGJyZWFrIHRoZSBhbnRpLWRlcGVuZGVuY2UuCisgICAgICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gUmVuYW1lTWFwOworICAgICAgICBpZiAoRmluZFN1aXRhYmxlRnJlZVJlZ2lzdGVycyhHcm91cEluZGV4LCBSZW5hbWVPcmRlciwgUmVuYW1lTWFwKSkgeworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRCcmVha2luZyBhbnRpLWRlcGVuZGVuY2UgZWRnZSBvbiAiCisgICAgICAgICAgICAgICAgPDwgVFJJLT5nZXROYW1lKEFudGlEZXBSZWcpIDw8ICI6Iik7CisKKyAgICAgICAgICAvLyBIYW5kbGUgZWFjaCBncm91cCByZWdpc3Rlci4uLgorICAgICAgICAgIGZvciAoc3RkOjptYXA8dW5zaWduZWQsIHVuc2lnbmVkPjo6aXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgUyA9IFJlbmFtZU1hcC5iZWdpbigpLCBFID0gUmVuYW1lTWFwLmVuZCgpOyBTICE9IEU7ICsrUykgeworICAgICAgICAgICAgdW5zaWduZWQgQ3VyclJlZyA9IFMtPmZpcnN0OworICAgICAgICAgICAgdW5zaWduZWQgTmV3UmVnID0gUy0+c2Vjb25kOworCisgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAiIDw8IFRSSS0+Z2V0TmFtZShDdXJyUmVnKSA8PCAiLT4iIDw8CisgICAgICAgICAgICAgICAgICBUUkktPmdldE5hbWUoTmV3UmVnKSA8PCAiKCIgPDwKKyAgICAgICAgICAgICAgICAgIFJlZ1JlZnMuY291bnQoQ3VyclJlZykgPDwgIiByZWZzKSIpOworCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIG9sZCByZWdpc3RlciBDdXJyUmVnIHRvCisgICAgICAgICAgICAvLyByZWZlciB0byB0aGUgbmV3IHJlZ2lzdGVyIE5ld1JlZy4KKyAgICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdncmVzc2l2ZUFudGlEZXBTdGF0ZTo6UmVnaXN0ZXJSZWZlcmVuY2U+OjppdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdncmVzc2l2ZUFudGlEZXBTdGF0ZTo6UmVnaXN0ZXJSZWZlcmVuY2U+OjppdGVyYXRvcj4KKyAgICAgICAgICAgICAgUmFuZ2UgPSBSZWdSZWZzLmVxdWFsX3JhbmdlKEN1cnJSZWcpOworICAgICAgICAgICAgZm9yIChzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLAorICAgICAgICAgICAgICAgICBBZ2dyZXNzaXZlQW50aURlcFN0YXRlOjpSZWdpc3RlclJlZmVyZW5jZT46Oml0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgUSA9IFJhbmdlLmZpcnN0LCBRRSA9IFJhbmdlLnNlY29uZDsgUSAhPSBRRTsgKytRKSB7CisgICAgICAgICAgICAgIFEtPnNlY29uZC5PcGVyYW5kLT5zZXRSZWcoTmV3UmVnKTsKKyAgICAgICAgICAgICAgLy8gSWYgdGhlIFNVIGZvciB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgdXBkYXRlZCBoYXMgZGVidWcKKyAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgYW50aS1kZXBlbmRlbmN5IHJlZ2lzdGVyLCBtYWtlCisgICAgICAgICAgICAgIC8vIHN1cmUgdG8gdXBkYXRlIHRoYXQgYXMgd2VsbC4KKyAgICAgICAgICAgICAgY29uc3QgU1VuaXQgKlNVID0gTUlTVW5pdE1hcFtRLT5zZWNvbmQuT3BlcmFuZC0+Z2V0UGFyZW50KCldOworICAgICAgICAgICAgICBpZiAoIVNVKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNVLT5EYmdJbnN0ckxpc3Quc2l6ZSgpIDsgaSA8IGUgOyArK2kpIHsKKyAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKkRJID0gU1UtPkRiZ0luc3RyTGlzdFtpXTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgKERJLT5nZXROdW1PcGVyYW5kcygpPT0zICYmIERJLT5nZXRPcGVyYW5kKDApLmlzUmVnKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIERJLT5nZXRPcGVyYW5kKDApLmdldFJlZygpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAiTm9uIHJlZ2lzdGVyIGRiZ192YWx1ZSBhdHRhY2hlZCB0byBTVW5pdCEiKTsKKyAgICAgICAgICAgICAgICBpZiAoREktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgPT0gQW50aURlcFJlZykKKyAgICAgICAgICAgICAgICAgIERJLT5nZXRPcGVyYW5kKDApLnNldFJlZyhOZXdSZWcpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIGp1c3Qgd2VudCBiYWNrIGluIHRpbWUgYW5kIG1vZGlmaWVkIGhpc3Rvcnk7IHRoZQorICAgICAgICAgICAgLy8gbGl2ZW5lc3MgaW5mb3JtYXRpb24gZm9yIEN1cnJSZWcgaXMgbm93IGluY29uc2lzdGVudC4gU2V0CisgICAgICAgICAgICAvLyB0aGUgc3RhdGUgYXMgaWYgaXQgd2VyZSBkZWFkLgorICAgICAgICAgICAgU3RhdGUtPlVuaW9uR3JvdXBzKE5ld1JlZywgMCk7CisgICAgICAgICAgICBSZWdSZWZzLmVyYXNlKE5ld1JlZyk7CisgICAgICAgICAgICBEZWZJbmRpY2VzW05ld1JlZ10gPSBEZWZJbmRpY2VzW0N1cnJSZWddOworICAgICAgICAgICAgS2lsbEluZGljZXNbTmV3UmVnXSA9IEtpbGxJbmRpY2VzW0N1cnJSZWddOworCisgICAgICAgICAgICBTdGF0ZS0+VW5pb25Hcm91cHMoQ3VyclJlZywgMCk7CisgICAgICAgICAgICBSZWdSZWZzLmVyYXNlKEN1cnJSZWcpOworICAgICAgICAgICAgRGVmSW5kaWNlc1tDdXJyUmVnXSA9IEtpbGxJbmRpY2VzW0N1cnJSZWddOworICAgICAgICAgICAgS2lsbEluZGljZXNbQ3VyclJlZ10gPSB+MHU7CisgICAgICAgICAgICBhc3NlcnQoKChLaWxsSW5kaWNlc1tDdXJyUmVnXSA9PSB+MHUpICE9CisgICAgICAgICAgICAgICAgICAgIChEZWZJbmRpY2VzW0N1cnJSZWddID09IH4wdSkpICYmCisgICAgICAgICAgICAgICAgICAgIktpbGwgYW5kIERlZiBtYXBzIGFyZW4ndCBjb25zaXN0ZW50IGZvciBBbnRpRGVwUmVnISIpOworICAgICAgICAgIH0KKworICAgICAgICAgICsrQnJva2VuOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAnXG4nKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFNjYW5JbnN0cnVjdGlvbihNSSwgQ291bnQpOworICB9CisKKyAgcmV0dXJuIEJyb2tlbjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlci5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3MTVjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlci5oCkBAIC0wLDAgKzEsMTg0IEBACisvLz0tIGxsdm0vQ29kZUdlbi9BZ2dyZXNzaXZlQW50aURlcEJyZWFrZXIuaCAtIEFudGktRGVwIFN1cHBvcnQgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyIGNsYXNzLCB3aGljaAorLy8gaW1wbGVtZW50cyByZWdpc3RlciBhbnRpLWRlcGVuZGVuY2UgYnJlYWtpbmcgZHVyaW5nIHBvc3QtUkEKKy8vIHNjaGVkdWxpbmcuIEl0IGF0dGVtcHRzIHRvIGJyZWFrIGFsbCBhbnRpLWRlcGVuZGVuY2llcyB3aXRoaW4gYQorLy8gYmxvY2suCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fQUdHUkVTU0lWRUFOVElERVBCUkVBS0VSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0FHR1JFU1NJVkVBTlRJREVQQlJFQUtFUl9ICisKKyNpbmNsdWRlICJBbnRpRGVwQnJlYWtlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgLy8vIENsYXNzIEFnZ3Jlc3NpdmVBbnRpRGVwU3RhdGUKKyAgLy8vIENvbnRhaW5zIGFsbCB0aGUgc3RhdGUgbmVjZXNzYXJ5IGZvciBhbnRpLWRlcCBicmVha2luZy4KKyAgY2xhc3MgQWdncmVzc2l2ZUFudGlEZXBTdGF0ZSB7CisgIHB1YmxpYzoKKyAgICAvLy8gUmVnaXN0ZXJSZWZlcmVuY2UgLSBJbmZvcm1hdGlvbiBhYm91dCBhIHJlZ2lzdGVyIHJlZmVyZW5jZQorICAgIC8vLyB3aXRoaW4gYSBsaXZlcmFuZ2UKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAvLy8gT3BlcmFuZCAtIFRoZSByZWdpc3RlcnMgb3BlcmFuZAorICAgICAgTWFjaGluZU9wZXJhbmQgKk9wZXJhbmQ7CisgICAgICAvLy8gUkMgLSBUaGUgcmVnaXN0ZXIgY2xhc3MKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDOworICAgIH0gUmVnaXN0ZXJSZWZlcmVuY2U7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gTnVtVGFyZ2V0UmVncyAtIE51bWJlciBvZiBub24tdmlydHVhbCB0YXJnZXQgcmVnaXN0ZXJzCisgICAgLy8vIChpLmUuIFRSSS0+Z2V0TnVtUmVncygpKS4KKyAgICBjb25zdCB1bnNpZ25lZCBOdW1UYXJnZXRSZWdzOworCisgICAgLy8vIEdyb3VwTm9kZXMgLSBJbXBsZW1lbnRzIGEgZGlzam9pbnQtdW5pb24gZGF0YSBzdHJ1Y3R1cmUgdG8KKyAgICAvLy8gZm9ybSByZWdpc3RlciBncm91cHMuIEEgbm9kZSBpcyByZXByZXNlbnRlZCBieSBhbiBpbmRleCBpbnRvCisgICAgLy8vIHRoZSB2ZWN0b3IuIEEgbm9kZSBjYW4gInBvaW50IHRvIiBpdHNlbGYgdG8gaW5kaWNhdGUgdGhhdCBpdAorICAgIC8vLyBpcyB0aGUgcGFyZW50IG9mIGEgZ3JvdXAsIG9yIHBvaW50IHRvIGFub3RoZXIgbm9kZSB0byBpbmRpY2F0ZQorICAgIC8vLyB0aGF0IGl0IGlzIGEgbWVtYmVyIG9mIHRoZSBzYW1lIGdyb3VwIGFzIHRoYXQgbm9kZS4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gR3JvdXBOb2RlczsKKworICAgIC8vLyBHcm91cE5vZGVJbmRpY2VzIC0gRm9yIGVhY2ggcmVnaXN0ZXIsIHRoZSBpbmRleCBvZiB0aGUgR3JvdXBOb2RlCisgICAgLy8vIGN1cnJlbnRseSByZXByZXNlbnRpbmcgdGhlIGdyb3VwIHRoYXQgdGhlIHJlZ2lzdGVyIGJlbG9uZ3MgdG8uCisgICAgLy8vIFJlZ2lzdGVyIDAgaXMgYWx3YXlzIHJlcHJlc2VudGVkIGJ5IHRoZSAwIGdyb3VwLCBhIGdyb3VwCisgICAgLy8vIGNvbXBvc2VkIG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgZWxpZ2libGUgZm9yIGFudGktYWxpYXNpbmcuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IEdyb3VwTm9kZUluZGljZXM7CisKKyAgICAvLy8gUmVnUmVmcyAtIE1hcCByZWdpc3RlcnMgdG8gYWxsIHRoZWlyIHJlZmVyZW5jZXMgd2l0aGluIGEgbGl2ZSByYW5nZS4KKyAgICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBSZWdpc3RlclJlZmVyZW5jZT4gUmVnUmVmczsKKworICAgIC8vLyBLaWxsSW5kaWNlcyAtIFRoZSBpbmRleCBvZiB0aGUgbW9zdCByZWNlbnQga2lsbCAocHJvY2VkaW5nIGJvdHRvbS11cCksCisgICAgLy8vIG9yIH4wdSBpZiB0aGUgcmVnaXN0ZXIgaXMgbm90IGxpdmUuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IEtpbGxJbmRpY2VzOworCisgICAgLy8vIERlZkluZGljZXMgLSBUaGUgaW5kZXggb2YgdGhlIG1vc3QgcmVjZW50IGNvbXBsZXRlIGRlZiAocHJvY2VkaW5nIGJvdHRvbQorICAgIC8vLyB1cCksIG9yIH4wdSBpZiB0aGUgcmVnaXN0ZXIgaXMgbGl2ZS4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gRGVmSW5kaWNlczsKKworICBwdWJsaWM6CisgICAgQWdncmVzc2l2ZUFudGlEZXBTdGF0ZShjb25zdCB1bnNpZ25lZCBUYXJnZXRSZWdzLCBNYWNoaW5lQmFzaWNCbG9jayAqQkIpOworCisgICAgLy8vIEdldEtpbGxJbmRpY2VzIC0gUmV0dXJuIHRoZSBraWxsIGluZGljZXMuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZHZXRLaWxsSW5kaWNlcygpIHsgcmV0dXJuIEtpbGxJbmRpY2VzOyB9CisKKyAgICAvLy8gR2V0RGVmSW5kaWNlcyAtIFJldHVybiB0aGUgZGVmaW5lIGluZGljZXMuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZHZXREZWZJbmRpY2VzKCkgeyByZXR1cm4gRGVmSW5kaWNlczsgfQorCisgICAgLy8vIEdldFJlZ1JlZnMgLSBSZXR1cm4gdGhlIFJlZ1JlZnMgbWFwLgorICAgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIFJlZ2lzdGVyUmVmZXJlbmNlPiYgR2V0UmVnUmVmcygpIHsgcmV0dXJuIFJlZ1JlZnM7IH0KKworICAgIC8vIEdldEdyb3VwIC0gR2V0IHRoZSBncm91cCBmb3IgYSByZWdpc3Rlci4gVGhlIHJldHVybmVkIHZhbHVlIGlzCisgICAgLy8gdGhlIGluZGV4IG9mIHRoZSBHcm91cE5vZGUgcmVwcmVzZW50aW5nIHRoZSBncm91cC4KKyAgICB1bnNpZ25lZCBHZXRHcm91cCh1bnNpZ25lZCBSZWcpOworCisgICAgLy8gR2V0R3JvdXBSZWdzIC0gUmV0dXJuIGEgdmVjdG9yIG9mIHRoZSByZWdpc3RlcnMgYmVsb25naW5nIHRvIGEKKyAgICAvLyBncm91cC4gSWYgUmVnUmVmcyBpcyBub24tTlVMTCB0aGVuIG9ubHkgaW5jbHVkZWQgcmVmZXJlbmNlZCByZWdpc3RlcnMuCisgICAgdm9pZCBHZXRHcm91cFJlZ3MoCisgICAgICAgdW5zaWduZWQgR3JvdXAsCisgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZSZWdzLAorICAgICAgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsCisgICAgICAgICBBZ2dyZXNzaXZlQW50aURlcFN0YXRlOjpSZWdpc3RlclJlZmVyZW5jZT4gKlJlZ1JlZnMpOworCisgICAgLy8gVW5pb25Hcm91cHMgLSBVbmlvbiBSZWcxJ3MgYW5kIFJlZzIncyBncm91cHMgdG8gZm9ybSBhIG5ldworICAgIC8vIGdyb3VwLiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBHcm91cE5vZGUgcmVwcmVzZW50aW5nIHRoZQorICAgIC8vIGdyb3VwLgorICAgIHVuc2lnbmVkIFVuaW9uR3JvdXBzKHVuc2lnbmVkIFJlZzEsIHVuc2lnbmVkIFJlZzIpOworCisgICAgLy8gTGVhdmVHcm91cCAtIFJlbW92ZSBhIHJlZ2lzdGVyIGZyb20gaXRzIGN1cnJlbnQgZ3JvdXAgYW5kIHBsYWNlCisgICAgLy8gaXQgYWxvbmUgaW4gaXRzIG93biBncm91cC4gUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgR3JvdXBOb2RlCisgICAgLy8gcmVwcmVzZW50aW5nIHRoZSByZWdpc3RlcnMgbmV3IGdyb3VwLgorICAgIHVuc2lnbmVkIExlYXZlR3JvdXAodW5zaWduZWQgUmVnKTsKKworICAgIC8vLyBJc0xpdmUgLSBSZXR1cm4gdHJ1ZSBpZiBSZWcgaXMgbGl2ZQorICAgIGJvb2wgSXNMaXZlKHVuc2lnbmVkIFJlZyk7CisgIH07CisKKworICAvLy8gQ2xhc3MgQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyCisgIGNsYXNzIEFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlciA6IHB1YmxpYyBBbnRpRGVwQnJlYWtlciB7CisgICAgTWFjaGluZUZ1bmN0aW9uJiBNRjsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkk7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisKKyAgICAvLy8gQWxsb2NhdGFibGVTZXQgLSBUaGUgc2V0IG9mIGFsbG9jYXRhYmxlIHJlZ2lzdGVycy4KKyAgICAvLy8gV2UnbGwgYmUgaWdub3JpbmcgYW50aS1kZXBlbmRlbmNpZXMgb24gbm9uLWFsbG9jYXRhYmxlIHJlZ2lzdGVycywKKyAgICAvLy8gYmVjYXVzZSB0aGV5IG1heSBub3QgYmUgc2FmZSB0byBicmVhay4KKyAgICBjb25zdCBCaXRWZWN0b3IgQWxsb2NhdGFibGVTZXQ7CisKKyAgICAvLy8gQ3JpdGljYWxQYXRoU2V0IC0gVGhlIHNldCBvZiByZWdpc3RlcnMgdGhhdCBzaG91bGQgb25seSBiZQorICAgIC8vLyByZW5hbWVkIGlmIHRoZXkgYXJlIG9uIHRoZSBjcml0aWNhbCBwYXRoLgorICAgIEJpdFZlY3RvciBDcml0aWNhbFBhdGhTZXQ7CisKKyAgICAvLy8gU3RhdGUgLSBUaGUgc3RhdGUgdXNlZCB0byBpZGVudGlmeSBhbmQgcmVuYW1lIGFudGktZGVwZW5kZW5jZQorICAgIC8vLyByZWdpc3RlcnMuCisgICAgQWdncmVzc2l2ZUFudGlEZXBTdGF0ZSAqU3RhdGU7CisKKyAgcHVibGljOgorICAgIEFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlcihNYWNoaW5lRnVuY3Rpb24mIE1GaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0U3VidGFyZ2V0OjpSZWdDbGFzc1ZlY3RvciYgQ3JpdGljYWxQYXRoUkNzKTsKKyAgICB+QWdncmVzc2l2ZUFudGlEZXBCcmVha2VyKCk7CisKKyAgICAvLy8gU3RhcnQgLSBJbml0aWFsaXplIGFudGktZGVwIGJyZWFraW5nIGZvciBhIG5ldyBiYXNpYyBibG9jay4KKyAgICB2b2lkIFN0YXJ0QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCKTsKKworICAgIC8vLyBCcmVha0FudGlEZXBlbmRlbmNpZXMgLSBJZGVudGlmaXkgYW50aS1kZXBlbmRlbmNpZXMgYWxvbmcgdGhlIGNyaXRpY2FsCisgICAgLy8vIHBhdGgKKyAgICAvLy8gb2YgdGhlIFNjaGVkdWxlREFHIGFuZCBicmVhayB0aGVtIGJ5IHJlbmFtaW5nIHJlZ2lzdGVycy4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBCcmVha0FudGlEZXBlbmRlbmNpZXMoY29uc3Qgc3RkOjp2ZWN0b3I8U1VuaXQ+JiBTVW5pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5zZXJ0UG9zSW5kZXgpOworCisgICAgLy8vIE9ic2VydmUgLSBVcGRhdGUgbGl2ZW5lc3MgaW5mb3JtYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlIGN1cnJlbnQKKyAgICAvLy8gaW5zdHJ1Y3Rpb24sIHdoaWNoIHdpbGwgbm90IGJlIHNjaGVkdWxlZC4KKyAgICAvLy8KKyAgICB2b2lkIE9ic2VydmUoTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgQ291bnQsIHVuc2lnbmVkIEluc2VydFBvc0luZGV4KTsKKworICAgIC8vLyBGaW5pc2ggLSBGaW5pc2ggYW50aS1kZXAgYnJlYWtpbmcgZm9yIGEgYmFzaWMgYmxvY2suCisgICAgdm9pZCBGaW5pc2hCbG9jaygpOworCisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICosCisgICAgICAgICAgICAgICAgICAgICBUYXJnZXRSZWdpc3RlckNsYXNzOjpjb25zdF9pdGVyYXRvcj4gUmVuYW1lT3JkZXJUeXBlOworCisgICAgLy8vIElzSW1wbGljaXREZWZVc2UgLSBSZXR1cm4gdHJ1ZSBpZiBNTyByZXByZXNlbnRzIGEgcmVnaXN0ZXIKKyAgICAvLy8gdGhhdCBpcyBib3RoIGltcGxpY2l0bHkgdXNlZCBhbmQgZGVmaW5lZCBpbiBNSQorICAgIGJvb2wgSXNJbXBsaWNpdERlZlVzZShNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lT3BlcmFuZCYgTU8pOworCisgICAgLy8vIEdldFBhc3N0aHJ1UmVncyAtIElmIE1JIGltcGxpY2l0bHkgZGVmL3VzZXMgYSByZWdpc3RlciwgdGhlbgorICAgIC8vLyByZXR1cm4gdGhhdCByZWdpc3RlciBhbmQgYWxsIHN1YnJlZ2lzdGVycy4KKyAgICB2b2lkIEdldFBhc3N0aHJ1UmVncyhNYWNoaW5lSW5zdHIgKk1JLCBzdGQ6OnNldDx1bnNpZ25lZD4mIFBhc3N0aHJ1UmVncyk7CisKKyAgICB2b2lkIEhhbmRsZUxhc3RVc2UodW5zaWduZWQgUmVnLCB1bnNpZ25lZCBLaWxsSWR4LCBjb25zdCBjaGFyICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhlYWRlciA9TlVMTCwgY29uc3QgY2hhciAqZm9vdGVyID1OVUxMKTsKKworICAgIHZvaWQgUHJlc2Nhbkluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHVuc2lnbmVkPiYgUGFzc3RocnVSZWdzKTsKKyAgICB2b2lkIFNjYW5JbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBDb3VudCk7CisgICAgQml0VmVjdG9yIEdldFJlbmFtZVJlZ2lzdGVycyh1bnNpZ25lZCBSZWcpOworICAgIGJvb2wgRmluZFN1aXRhYmxlRnJlZVJlZ2lzdGVycyh1bnNpZ25lZCBBbnRpRGVwR3JvdXBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuYW1lT3JkZXJUeXBlJiBSZW5hbWVPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dW5zaWduZWQsIHVuc2lnbmVkPiAmUmVuYW1lTWFwKTsKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9BbmFseXNpcy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9BbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjZmE3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FuYWx5c2lzLmNwcApAQCAtMCwwICsxLDI4NSBAQAorLy89PT0tLSBBbmFseXNpcy5jcHAgLSBDb2RlR2VuIExMVk0gSVIgQW5hbHlzaXMgVXRpbGl0aWVzIC0tKi0gQysrIC0tLS0tLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzZXZlcmFsIENvZGVHZW4tc3BlY2lmaWMgTExWTSBJUiBhbmFseXNpcyB1dGlsdGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gQ29tcHV0ZUxpbmVhckluZGV4IC0gR2l2ZW4gYW4gTExWTSBJUiBhZ2dyZWdhdGUgdHlwZSBhbmQgYSBzZXF1ZW5jZQorLy8vIG9mIGluc2VydHZhbHVlIG9yIGV4dHJhY3R2YWx1ZSBpbmRpY2VzIHRoYXQgaWRlbnRpZnkgYSBtZW1iZXIsIHJldHVybgorLy8vIHRoZSBsaW5lYXJpemVkIGluZGV4IG9mIHRoZSBzdGFydCBvZiB0aGUgbWVtYmVyLgorLy8vCit1bnNpZ25lZCBsbHZtOjpDb21wdXRlTGluZWFySW5kZXgoY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSwgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKkluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKkluZGljZXNFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ3VySW5kZXgpIHsKKyAgLy8gQmFzZSBjYXNlOiBXZSdyZSBkb25lLgorICBpZiAoSW5kaWNlcyAmJiBJbmRpY2VzID09IEluZGljZXNFbmQpCisgICAgcmV0dXJuIEN1ckluZGV4OworCisgIC8vIEdpdmVuIGEgc3RydWN0IHR5cGUsIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBlbGVtZW50cy4KKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkgeworICAgIGZvciAoU3RydWN0VHlwZTo6ZWxlbWVudF9pdGVyYXRvciBFQiA9IFNUeS0+ZWxlbWVudF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSSA9IEVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRSA9IFNUeS0+ZWxlbWVudF9lbmQoKTsKKyAgICAgICAgRUkgIT0gRUU7ICsrRUkpIHsKKyAgICAgIGlmIChJbmRpY2VzICYmICpJbmRpY2VzID09IHVuc2lnbmVkKEVJIC0gRUIpKQorICAgICAgICByZXR1cm4gQ29tcHV0ZUxpbmVhckluZGV4KFRMSSwgKkVJLCBJbmRpY2VzKzEsIEluZGljZXNFbmQsIEN1ckluZGV4KTsKKyAgICAgIEN1ckluZGV4ID0gQ29tcHV0ZUxpbmVhckluZGV4KFRMSSwgKkVJLCAwLCAwLCBDdXJJbmRleCk7CisgICAgfQorICAgIHJldHVybiBDdXJJbmRleDsKKyAgfQorICAvLyBHaXZlbiBhbiBhcnJheSB0eXBlLCByZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUgZWxlbWVudHMuCisgIGVsc2UgaWYgKGNvbnN0IEFycmF5VHlwZSAqQVR5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihUeSkpIHsKKyAgICBjb25zdCBUeXBlICpFbHRUeSA9IEFUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQVR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKEluZGljZXMgJiYgKkluZGljZXMgPT0gaSkKKyAgICAgICAgcmV0dXJuIENvbXB1dGVMaW5lYXJJbmRleChUTEksIEVsdFR5LCBJbmRpY2VzKzEsIEluZGljZXNFbmQsIEN1ckluZGV4KTsKKyAgICAgIEN1ckluZGV4ID0gQ29tcHV0ZUxpbmVhckluZGV4KFRMSSwgRWx0VHksIDAsIDAsIEN1ckluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIEN1ckluZGV4OworICB9CisgIC8vIFdlIGhhdmVuJ3QgZm91bmQgdGhlIHR5cGUgd2UncmUgbG9va2luZyBmb3IsIHNvIGtlZXAgc2VhcmNoaW5nLgorICByZXR1cm4gQ3VySW5kZXggKyAxOworfQorCisvLy8gQ29tcHV0ZVZhbHVlVlRzIC0gR2l2ZW4gYW4gTExWTSBJUiB0eXBlLCBjb21wdXRlIGEgc2VxdWVuY2Ugb2YKKy8vLyBFVlRzIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgaW5kaXZpZHVhbCB1bmRlcmx5aW5nCisvLy8gbm9uLWFnZ3JlZ2F0ZSB0eXBlcyB0aGF0IGNvbXByaXNlIGl0LgorLy8vCisvLy8gSWYgT2Zmc2V0cyBpcyBub24tbnVsbCwgaXQgcG9pbnRzIHRvIGEgdmVjdG9yIHRvIGJlIGZpbGxlZCBpbgorLy8vIHdpdGggdGhlIGluLW1lbW9yeSBvZmZzZXRzIG9mIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgdmFsdWVzLgorLy8vCit2b2lkIGxsdm06OkNvbXB1dGVWYWx1ZVZUcyhjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJLCBjb25zdCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxFVlQ+ICZWYWx1ZVZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1aW50NjRfdD4gKk9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTdGFydGluZ09mZnNldCkgeworICAvLyBHaXZlbiBhIHN0cnVjdCB0eXBlLCByZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUgZWxlbWVudHMuCisgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihUeSkpIHsKKyAgICBjb25zdCBTdHJ1Y3RMYXlvdXQgKlNMID0gVExJLmdldFRhcmdldERhdGEoKS0+Z2V0U3RydWN0TGF5b3V0KFNUeSk7CisgICAgZm9yIChTdHJ1Y3RUeXBlOjplbGVtZW50X2l0ZXJhdG9yIEVCID0gU1R5LT5lbGVtZW50X2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJID0gRUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFID0gU1R5LT5lbGVtZW50X2VuZCgpOworICAgICAgICAgRUkgIT0gRUU7ICsrRUkpCisgICAgICBDb21wdXRlVmFsdWVWVHMoVExJLCAqRUksIFZhbHVlVlRzLCBPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0aW5nT2Zmc2V0ICsgU0wtPmdldEVsZW1lbnRPZmZzZXQoRUkgLSBFQikpOworICAgIHJldHVybjsKKyAgfQorICAvLyBHaXZlbiBhbiBhcnJheSB0eXBlLCByZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUgZWxlbWVudHMuCisgIGlmIChjb25zdCBBcnJheVR5cGUgKkFUeSA9IGR5bl9jYXN0PEFycmF5VHlwZT4oVHkpKSB7CisgICAgY29uc3QgVHlwZSAqRWx0VHkgPSBBVHktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgdWludDY0X3QgRWx0U2l6ZSA9IFRMSS5nZXRUYXJnZXREYXRhKCktPmdldFR5cGVBbGxvY1NpemUoRWx0VHkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgRWx0VHksIFZhbHVlVlRzLCBPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0aW5nT2Zmc2V0ICsgaSAqIEVsdFNpemUpOworICAgIHJldHVybjsKKyAgfQorICAvLyBJbnRlcnByZXQgdm9pZCBhcyB6ZXJvIHJldHVybiB2YWx1ZXMuCisgIGlmIChUeS0+aXNWb2lkVHkoKSkKKyAgICByZXR1cm47CisgIC8vIEJhc2UgY2FzZTogd2UgY2FuIGdldCBhbiBFVlQgZm9yIHRoaXMgTExWTSBJUiB0eXBlLgorICBWYWx1ZVZUcy5wdXNoX2JhY2soVExJLmdldFZhbHVlVHlwZShUeSkpOworICBpZiAoT2Zmc2V0cykKKyAgICBPZmZzZXRzLT5wdXNoX2JhY2soU3RhcnRpbmdPZmZzZXQpOworfQorCisvLy8gRXh0cmFjdFR5cGVJbmZvIC0gUmV0dXJucyB0aGUgdHlwZSBpbmZvLCBwb3NzaWJseSBiaXRjYXN0LCBlbmNvZGVkIGluIFYuCitHbG9iYWxWYXJpYWJsZSAqbGx2bTo6RXh0cmFjdFR5cGVJbmZvKFZhbHVlICpWKSB7CisgIFYgPSBWLT5zdHJpcFBvaW50ZXJDYXN0cygpOworICBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oVik7CisKKyAgaWYgKEdWICYmIEdWLT5nZXROYW1lKCkgPT0gImxsdm0uZWguY2F0Y2guYWxsLnZhbHVlIikgeworICAgIGFzc2VydChHVi0+aGFzSW5pdGlhbGl6ZXIoKSAmJgorICAgICAgICAgICAiVGhlIEVIIGNhdGNoLWFsbCB2YWx1ZSBtdXN0IGhhdmUgYW4gaW5pdGlhbGl6ZXIiKTsKKyAgICBWYWx1ZSAqSW5pdCA9IEdWLT5nZXRJbml0aWFsaXplcigpOworICAgIEdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KEluaXQpOworICAgIGlmICghR1YpIFYgPSBjYXN0PENvbnN0YW50UG9pbnRlck51bGw+KEluaXQpOworICB9CisKKyAgYXNzZXJ0KChHViB8fCBpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oVikpICYmCisgICAgICAgICAiVHlwZUluZm8gbXVzdCBiZSBhIGdsb2JhbCB2YXJpYWJsZSBvciBOVUxMIik7CisgIHJldHVybiBHVjsKK30KKworLy8vIGhhc0lubGluZUFzbU1lbUNvbnN0cmFpbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5saW5lIGFzbSBpbnN0cnVjdGlvbiBiZWluZworLy8vIHByb2Nlc3NlZCB1c2VzIGEgbWVtb3J5ICdtJyBjb25zdHJhaW50LgorYm9vbAorbGx2bTo6aGFzSW5saW5lQXNtTWVtQ29uc3RyYWludChzdGQ6OnZlY3RvcjxJbmxpbmVBc206OkNvbnN0cmFpbnRJbmZvPiAmQ0luZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDSW5mb3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIElubGluZUFzbTo6Q29uc3RyYWludEluZm8gJkNJID0gQ0luZm9zW2ldOworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVlID0gQ0kuQ29kZXMuc2l6ZSgpOyBqICE9IGVlOyArK2opIHsKKyAgICAgIFRhcmdldExvd2VyaW5nOjpDb25zdHJhaW50VHlwZSBDVHlwZSA9IFRMSS5nZXRDb25zdHJhaW50VHlwZShDSS5Db2Rlc1tqXSk7CisgICAgICBpZiAoQ1R5cGUgPT0gVGFyZ2V0TG93ZXJpbmc6OkNfTWVtb3J5KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBJbmRpcmVjdCBvcGVyYW5kIGFjY2Vzc2VzIGFjY2VzcyBtZW1vcnkuCisgICAgaWYgKENJLmlzSW5kaXJlY3QpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGdldEZDbXBDb25kQ29kZSAtIFJldHVybiB0aGUgSVNEIGNvbmRpdGlvbiBjb2RlIGNvcnJlc3BvbmRpbmcgdG8KKy8vLyB0aGUgZ2l2ZW4gTExWTSBJUiBmbG9hdGluZy1wb2ludCBjb25kaXRpb24gY29kZS4gIFRoaXMgaW5jbHVkZXMKKy8vLyBjb25zaWRlcmF0aW9uIG9mIGdsb2JhbCBmbG9hdGluZy1wb2ludCBtYXRoIGZsYWdzLgorLy8vCitJU0Q6OkNvbmRDb2RlIGxsdm06OmdldEZDbXBDb25kQ29kZShGQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpIHsKKyAgSVNEOjpDb25kQ29kZSBGUEMsIEZPQzsKKyAgc3dpdGNoIChQcmVkKSB7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfRkFMU0U6IEZPQyA9IEZQQyA9IElTRDo6U0VURkFMU0U7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09FUTogICBGT0MgPSBJU0Q6OlNFVEVROyBGUEMgPSBJU0Q6OlNFVE9FUTsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0dUOiAgIEZPQyA9IElTRDo6U0VUR1Q7IEZQQyA9IElTRDo6U0VUT0dUOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PR0U6ICAgRk9DID0gSVNEOjpTRVRHRTsgRlBDID0gSVNEOjpTRVRPR0U7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MVDogICBGT0MgPSBJU0Q6OlNFVExUOyBGUEMgPSBJU0Q6OlNFVE9MVDsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xFOiAgIEZPQyA9IElTRDo6U0VUTEU7IEZQQyA9IElTRDo6U0VUT0xFOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTkU6ICAgRk9DID0gSVNEOjpTRVRORTsgRlBDID0gSVNEOjpTRVRPTkU7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09SRDogICBGT0MgPSBGUEMgPSBJU0Q6OlNFVE87ICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5POiAgIEZPQyA9IEZQQyA9IElTRDo6U0VUVU87ICBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VRVE6ICAgRk9DID0gSVNEOjpTRVRFUTsgRlBDID0gSVNEOjpTRVRVRVE7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHVDogICBGT0MgPSBJU0Q6OlNFVEdUOyBGUEMgPSBJU0Q6OlNFVFVHVDsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdFOiAgIEZPQyA9IElTRDo6U0VUR0U7IEZQQyA9IElTRDo6U0VUVUdFOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTFQ6ICAgRk9DID0gSVNEOjpTRVRMVDsgRlBDID0gSVNEOjpTRVRVTFQ7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMRTogICBGT0MgPSBJU0Q6OlNFVExFOyBGUEMgPSBJU0Q6OlNFVFVMRTsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5FOiAgIEZPQyA9IElTRDo6U0VUTkU7IEZQQyA9IElTRDo6U0VUVU5FOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9UUlVFOiAgRk9DID0gRlBDID0gSVNEOjpTRVRUUlVFOyBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIEZDbXAgcHJlZGljYXRlIG9wY29kZSEiKTsKKyAgICBGT0MgPSBGUEMgPSBJU0Q6OlNFVEZBTFNFOworICAgIGJyZWFrOworICB9CisgIGlmIChOb05hTnNGUE1hdGgpCisgICAgcmV0dXJuIEZPQzsKKyAgZWxzZQorICAgIHJldHVybiBGUEM7Cit9CisKKy8vLyBnZXRJQ21wQ29uZENvZGUgLSBSZXR1cm4gdGhlIElTRCBjb25kaXRpb24gY29kZSBjb3JyZXNwb25kaW5nIHRvCisvLy8gdGhlIGdpdmVuIExMVk0gSVIgaW50ZWdlciBjb25kaXRpb24gY29kZS4KKy8vLworSVNEOjpDb25kQ29kZSBsbHZtOjpnZXRJQ21wQ29uZENvZGUoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKSB7CisgIHN3aXRjaCAoUHJlZCkgeworICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiAgcmV0dXJuIElTRDo6U0VURVE7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6ICByZXR1cm4gSVNEOjpTRVRORTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6IHJldHVybiBJU0Q6OlNFVExFOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRTogcmV0dXJuIElTRDo6U0VUVUxFOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRTogcmV0dXJuIElTRDo6U0VUR0U7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOiByZXR1cm4gSVNEOjpTRVRVR0U7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiByZXR1cm4gSVNEOjpTRVRMVDsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6IHJldHVybiBJU0Q6OlNFVFVMVDsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6IHJldHVybiBJU0Q6OlNFVEdUOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDogcmV0dXJuIElTRDo6U0VUVUdUOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgSUNtcCBwcmVkaWNhdGUgb3Bjb2RlISIpOworICAgIHJldHVybiBJU0Q6OlNFVE5FOworICB9Cit9CisKKy8vLyBUZXN0IGlmIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBpcyBpbiBhIHBvc2l0aW9uIHRvIGJlIG9wdGltaXplZAorLy8vIHdpdGggYSB0YWlsLWNhbGwuIFRoaXMgcm91Z2hseSBtZWFucyB0aGF0IGl0J3MgaW4gYSBibG9jayB3aXRoCisvLy8gYSByZXR1cm4gYW5kIHRoZXJlJ3Mgbm90aGluZyB0aGF0IG5lZWRzIHRvIGJlIHNjaGVkdWxlZAorLy8vIGJldHdlZW4gaXQgYW5kIHRoZSByZXR1cm4uCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIG9ubHkgdGVzdHMgdGFyZ2V0LWluZGVwZW5kZW50IHJlcXVpcmVtZW50cy4KK2Jvb2wgbGx2bTo6aXNJblRhaWxDYWxsUG9zaXRpb24oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIEF0dHJpYnV0ZXMgQ2FsbGVlUmV0QXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICBjb25zdCBJbnN0cnVjdGlvbiAqSSA9IENTLmdldEluc3RydWN0aW9uKCk7CisgIGNvbnN0IEJhc2ljQmxvY2sgKkV4aXRCQiA9IEktPmdldFBhcmVudCgpOworICBjb25zdCBUZXJtaW5hdG9ySW5zdCAqVGVybSA9IEV4aXRCQi0+Z2V0VGVybWluYXRvcigpOworICBjb25zdCBSZXR1cm5JbnN0ICpSZXQgPSBkeW5fY2FzdDxSZXR1cm5JbnN0PihUZXJtKTsKKyAgY29uc3QgRnVuY3Rpb24gKkYgPSBFeGl0QkItPmdldFBhcmVudCgpOworCisgIC8vIFRoZSBibG9jayBtdXN0IGVuZCBpbiBhIHJldHVybiBzdGF0ZW1lbnQgb3IgdW5yZWFjaGFibGUuCisgIC8vCisgIC8vIEZJWE1FOiBEZWNsaW5lIHRhaWxjYWxsIGlmIGl0J3Mgbm90IGd1YXJhbnRlZWQgYW5kIGlmIHRoZSBibG9jayBlbmRzIGluCisgIC8vIGFuIHVucmVhY2hhYmxlLCBmb3Igbm93LiBUaGUgd2F5IHRhaWxjYWxsIG9wdGltaXphdGlvbiBpcyBjdXJyZW50bHkKKyAgLy8gaW1wbGVtZW50ZWQgbWVhbnMgaXQgd2lsbCBhZGQgYW4gZXBpbG9ndWUgZm9sbG93ZWQgYnkgYSBqdW1wLiBUaGF0IGlzCisgIC8vIG5vdCBwcm9maXRhYmxlLiBBbHNvLCBpZiB0aGUgY2FsbGVlIGlzIGEgc3BlY2lhbCBmdW5jdGlvbiAoZS5nLgorICAvLyBsb25nam1wIG9uIHg4NiksIGl0IGNhbiBlbmQgdXAgY2F1c2luZyBtaXNjb21waWxhdGlvbiB0aGF0IGhhcyBub3QKKyAgLy8gYmVlbiBmdWxseSB1bmRlcnN0b29kLgorICBpZiAoIVJldCAmJgorICAgICAgKCFHdWFyYW50ZWVkVGFpbENhbGxPcHQgfHwgIWlzYTxVbnJlYWNoYWJsZUluc3Q+KFRlcm0pKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIEkgd2lsbCBoYXZlIGEgY2hhaW4sIG1ha2Ugc3VyZSBubyBvdGhlciBpbnN0cnVjdGlvbiB0aGF0IHdpbGwgaGF2ZSBhCisgIC8vIGNoYWluIGludGVycG9zZXMgYmV0d2VlbiBJIGFuZCB0aGUgcmV0dXJuLgorICBpZiAoSS0+bWF5SGF2ZVNpZGVFZmZlY3RzKCkgfHwgSS0+bWF5UmVhZEZyb21NZW1vcnkoKSB8fAorICAgICAgIUktPmlzU2FmZVRvU3BlY3VsYXRpdmVseUV4ZWN1dGUoKSkKKyAgICBmb3IgKEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEJCSSA9IHByaW9yKHByaW9yKEV4aXRCQi0+ZW5kKCkpKTsgOworICAgICAgICAgLS1CQkkpIHsKKyAgICAgIGlmICgmKkJCSSA9PSBJKQorICAgICAgICBicmVhazsKKyAgICAgIC8vIERlYnVnIGluZm8gaW50cmluc2ljcyBkbyBub3QgZ2V0IGluIHRoZSB3YXkgb2YgdGFpbCBjYWxsIG9wdGltaXphdGlvbi4KKyAgICAgIGlmIChJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoQkJJKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoQkJJLT5tYXlIYXZlU2lkZUVmZmVjdHMoKSB8fCBCQkktPm1heVJlYWRGcm9tTWVtb3J5KCkgfHwKKyAgICAgICAgICAhQkJJLT5pc1NhZmVUb1NwZWN1bGF0aXZlbHlFeGVjdXRlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLy8gSWYgdGhlIGJsb2NrIGVuZHMgd2l0aCBhIHZvaWQgcmV0dXJuIG9yIHVucmVhY2hhYmxlLCBpdCBkb2Vzbid0IG1hdHRlcgorICAvLyB3aGF0IHRoZSBjYWxsJ3MgcmV0dXJuIHR5cGUgaXMuCisgIGlmICghUmV0IHx8IFJldC0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAwKSByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmLCBpdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBjYWxsJ3MKKyAgLy8gcmV0dXJuIHR5cGUgaXMuCisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oUmV0LT5nZXRPcGVyYW5kKDApKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gQ29uc2VydmF0aXZlbHkgcmVxdWlyZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgY2FsbCB0byBtYXRjaCB0aG9zZSBvZgorICAvLyB0aGUgcmV0dXJuLiBJZ25vcmUgbm9hbGlhcyBiZWNhdXNlIGl0IGRvZXNuJ3QgYWZmZWN0IHRoZSBjYWxsIHNlcXVlbmNlLgorICB1bnNpZ25lZCBDYWxsZXJSZXRBdHRyID0gRi0+Z2V0QXR0cmlidXRlcygpLmdldFJldEF0dHJpYnV0ZXMoKTsKKyAgaWYgKChDYWxsZWVSZXRBdHRyIF4gQ2FsbGVyUmV0QXR0cikgJiB+QXR0cmlidXRlOjpOb0FsaWFzKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJdCdzIG5vdCBzYWZlIHRvIGVsaW1pbmF0ZSB0aGUgc2lnbiAvIHplcm8gZXh0ZW5zaW9uIG9mIHRoZSByZXR1cm4gdmFsdWUuCisgIGlmICgoQ2FsbGVyUmV0QXR0ciAmIEF0dHJpYnV0ZTo6WkV4dCkgfHwgKENhbGxlclJldEF0dHIgJiBBdHRyaWJ1dGU6OlNFeHQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBPdGhlcndpc2UsIG1ha2Ugc3VyZSB0aGUgdW5tb2RpZmllZCByZXR1cm4gdmFsdWUgb2YgSSBpcyB0aGUgcmV0dXJuIHZhbHVlLgorICBmb3IgKGNvbnN0IEluc3RydWN0aW9uICpVID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFJldC0+Z2V0T3BlcmFuZCgwKSk7IDsKKyAgICAgICBVID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFUtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgaWYgKCFVKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghVS0+aGFzT25lVXNlKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKFUgPT0gSSkKKyAgICAgIGJyZWFrOworICAgIC8vIENoZWNrIGZvciBhIHRydWx5IG5vLW9wIHRydW5jYXRlLgorICAgIGlmIChpc2E8VHJ1bmNJbnN0PihVKSAmJgorICAgICAgICBUTEkuaXNUcnVuY2F0ZUZyZWUoVS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLCBVLT5nZXRUeXBlKCkpKQorICAgICAgY29udGludWU7CisgICAgLy8gQ2hlY2sgZm9yIGEgdHJ1bHkgbm8tb3AgYml0Y2FzdC4KKyAgICBpZiAoaXNhPEJpdENhc3RJbnN0PihVKSAmJgorICAgICAgICAoVS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IFUtPmdldFR5cGUoKSB8fAorICAgICAgICAgKFUtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSAmJgorICAgICAgICAgIFUtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkpKQorICAgICAgY29udGludWU7CisgICAgLy8gT3RoZXJ3aXNlIGl0J3Mgbm90IGEgdHJ1ZSBuby1vcC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vQW50aURlcEJyZWFrZXIuaCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FudGlEZXBCcmVha2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2Yjc1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FudGlEZXBCcmVha2VyLmgKQEAgLTAsMCArMSw1OSBAQAorLy89LSBsbHZtL0NvZGVHZW4vQW50aURlcEJyZWFrZXIuaCAtIEFudGktRGVwZW5kZW5jZSBCcmVha2luZyAtKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBbnRpRGVwQnJlYWtlciBjbGFzcywgd2hpY2ggaW1wbGVtZW50cworLy8gYW50aS1kZXBlbmRlbmNlIGJyZWFraW5nIGhldXJpc3RpY3MgZm9yIHBvc3QtcmVnaXN0ZXItYWxsb2NhdGlvbiBzY2hlZHVsaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0FOVElERVBCUkVBS0VSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0FOVElERVBCUkVBS0VSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBbnRpRGVwQnJlYWtlciAtIFRoaXMgY2xhc3Mgd29ya3MgaW50byBjb25qdW5jdGlvbiB3aXRoIHRoZQorLy8vIHBvc3QtUkEgc2NoZWR1bGVyIHRvIHJlbmFtZSByZWdpc3RlcnMgdG8gYnJlYWsgcmVnaXN0ZXIKKy8vLyBhbnRpLWRlcGVuZGVuY2llcy4KK2NsYXNzIEFudGlEZXBCcmVha2VyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+QW50aURlcEJyZWFrZXIoKTsKKworICAvLy8gU3RhcnQgLSBJbml0aWFsaXplIGFudGktZGVwIGJyZWFraW5nIGZvciBhIG5ldyBiYXNpYyBibG9jay4KKyAgdmlydHVhbCB2b2lkIFN0YXJ0QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCKSA9MDsKKworICAvLy8gQnJlYWtBbnRpRGVwZW5kZW5jaWVzIC0gSWRlbnRpZml5IGFudGktZGVwZW5kZW5jaWVzIHdpdGhpbiBhCisgIC8vLyBiYXNpYy1ibG9jayByZWdpb24gYW5kIGJyZWFrIHRoZW0gYnkgcmVuYW1pbmcgcmVnaXN0ZXJzLiBSZXR1cm4KKyAgLy8vIHRoZSBudW1iZXIgb2YgYW50aS1kZXBlbmRlbmNpZXMgYnJva2VuLgorICAvLy8KKyAgdmlydHVhbCB1bnNpZ25lZCBCcmVha0FudGlEZXBlbmRlbmNpZXMoY29uc3Qgc3RkOjp2ZWN0b3I8U1VuaXQ+JiBTVW5pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5zZXJ0UG9zSW5kZXgpID0wOworICAKKyAgLy8vIE9ic2VydmUgLSBVcGRhdGUgbGl2ZW5lc3MgaW5mb3JtYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlIGN1cnJlbnQKKyAgLy8vIGluc3RydWN0aW9uLCB3aGljaCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgT2JzZXJ2ZShNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5zZXJ0UG9zSW5kZXgpID0wOworICAKKyAgLy8vIEZpbmlzaCAtIEZpbmlzaCBhbnRpLWRlcCBicmVha2luZyBmb3IgYSBiYXNpYyBibG9jay4KKyAgdmlydHVhbCB2b2lkIEZpbmlzaEJsb2NrKCkgPTA7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4Yjg0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMSBAQAorYWRkX2xsdm1fbGlicmFyeShMTFZNQXNtUHJpbnRlcgorICBBc21QcmludGVyLmNwcAorICBBc21QcmludGVyRHdhcmYuY3BwCisgIEFzbVByaW50ZXJJbmxpbmVBc20uY3BwCisgIERJRS5jcHAKKyAgRHdhcmZEZWJ1Zy5jcHAKKyAgRHdhcmZFeGNlcHRpb24uY3BwCisgIE9jYW1sR0NQcmludGVyLmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoTExWTUFzbVByaW50ZXIgTExWTU1DUGFyc2VyKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vQXNtUHJpbnRlci9ESUUuaCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FzbVByaW50ZXIvRElFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2YzA5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FzbVByaW50ZXIvRElFLmgKQEAgLTAsMCArMSw0MzQgQEAKKy8vPT09LS0tIGxpYi9Db2RlR2VuL0RJRS5oIC0gRFdBUkYgSW5mbyBFbnRyaWVzIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGF0YSBzdHJ1Y3R1cmVzIGZvciBEV0FSRiBpbmZvIGVudHJpZXMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQ09ERUdFTl9BU01QUklOVEVSX0RJRV9IX18KKyNkZWZpbmUgQ09ERUdFTl9BU01QUklOVEVSX0RJRV9IX18KKworI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ed2FyZi5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBc21QcmludGVyOworICBjbGFzcyBNQ1N5bWJvbDsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBESUVBYmJyZXZEYXRhIC0gRHdhcmYgYWJicmV2aWF0aW9uIGRhdGEsIGRlc2NyaWJlcyB0aGUgb25lIGF0dHJpYnV0ZSBvZiBhCisgIC8vLyBEd2FyZiBhYmJyZXZpYXRpb24uCisgIGNsYXNzIERJRUFiYnJldkRhdGEgeworICAgIC8vLyBBdHRyaWJ1dGUgLSBEd2FyZiBhdHRyaWJ1dGUgY29kZS4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBBdHRyaWJ1dGU7CisKKyAgICAvLy8gRm9ybSAtIER3YXJmIGZvcm0gY29kZS4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBGb3JtOworICBwdWJsaWM6CisgICAgRElFQWJicmV2RGF0YSh1bnNpZ25lZCBBLCB1bnNpZ25lZCBGKSA6IEF0dHJpYnV0ZShBKSwgRm9ybShGKSB7fQorCisgICAgLy8gQWNjZXNzb3JzLgorICAgIHVuc2lnbmVkIGdldEF0dHJpYnV0ZSgpIGNvbnN0IHsgcmV0dXJuIEF0dHJpYnV0ZTsgfQorICAgIHVuc2lnbmVkIGdldEZvcm0oKSAgICAgIGNvbnN0IHsgcmV0dXJuIEZvcm07IH0KKworICAgIC8vLyBQcm9maWxlIC0gVXNlZCB0byBnYXRoZXIgdW5pcXVlIGRhdGEgZm9yIHRoZSBhYmJyZXZpYXRpb24gZm9sZGluZyBzZXQuCisgICAgLy8vCisgICAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIERJRUFiYnJldiAtIER3YXJmIGFiYnJldmlhdGlvbiwgZGVzY3JpYmVzIHRoZSBvcmdhbml6YXRpb24gb2YgYSBkZWJ1ZworICAvLy8gaW5mb3JtYXRpb24gb2JqZWN0LgorICBjbGFzcyBESUVBYmJyZXYgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworICAgIC8vLyBUYWcgLSBEd2FyZiB0YWcgY29kZS4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBUYWc7CisKKyAgICAvLy8gVW5pcXVlIG51bWJlciBmb3Igbm9kZS4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBOdW1iZXI7CisKKyAgICAvLy8gQ2hpbGRyZW5GbGFnIC0gRHdhcmYgY2hpbGRyZW4gZmxhZy4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBDaGlsZHJlbkZsYWc7CisKKyAgICAvLy8gRGF0YSAtIFJhdyBkYXRhIGJ5dGVzIGZvciBhYmJyZXZpYXRpb24uCisgICAgLy8vCisgICAgU21hbGxWZWN0b3I8RElFQWJicmV2RGF0YSwgOD4gRGF0YTsKKworICBwdWJsaWM6CisgICAgRElFQWJicmV2KHVuc2lnbmVkIFQsIHVuc2lnbmVkIEMpIDogVGFnKFQpLCBDaGlsZHJlbkZsYWcoQyksIERhdGEoKSB7fQorICAgIHZpcnR1YWwgfkRJRUFiYnJldigpIHt9CisKKyAgICAvLyBBY2Nlc3NvcnMuCisgICAgdW5zaWduZWQgZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gVGFnOyB9CisgICAgdW5zaWduZWQgZ2V0TnVtYmVyKCkgY29uc3QgeyByZXR1cm4gTnVtYmVyOyB9CisgICAgdW5zaWduZWQgZ2V0Q2hpbGRyZW5GbGFnKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW5GbGFnOyB9CisgICAgY29uc3QgU21hbGxWZWN0b3I8RElFQWJicmV2RGF0YSwgOD4gJmdldERhdGEoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisgICAgdm9pZCBzZXRUYWcodW5zaWduZWQgVCkgeyBUYWcgPSBUOyB9CisgICAgdm9pZCBzZXRDaGlsZHJlbkZsYWcodW5zaWduZWQgQ0YpIHsgQ2hpbGRyZW5GbGFnID0gQ0Y7IH0KKyAgICB2b2lkIHNldE51bWJlcih1bnNpZ25lZCBOKSB7IE51bWJlciA9IE47IH0KKworICAgIC8vLyBBZGRBdHRyaWJ1dGUgLSBBZGRzIGFub3RoZXIgc2V0IG9mIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiB0byB0aGUKKyAgICAvLy8gYWJicmV2aWF0aW9uLgorICAgIHZvaWQgQWRkQXR0cmlidXRlKHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgRm9ybSkgeworICAgICAgRGF0YS5wdXNoX2JhY2soRElFQWJicmV2RGF0YShBdHRyaWJ1dGUsIEZvcm0pKTsKKyAgICB9CisKKyAgICAvLy8gQWRkRmlyc3RBdHRyaWJ1dGUgLSBBZGRzIGEgc2V0IG9mIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiB0byB0aGUgZnJvbnQKKyAgICAvLy8gb2YgdGhlIGFiYnJldmlhdGlvbi4KKyAgICB2b2lkIEFkZEZpcnN0QXR0cmlidXRlKHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgRm9ybSkgeworICAgICAgRGF0YS5pbnNlcnQoRGF0YS5iZWdpbigpLCBESUVBYmJyZXZEYXRhKEF0dHJpYnV0ZSwgRm9ybSkpOworICAgIH0KKworICAgIC8vLyBQcm9maWxlIC0gVXNlZCB0byBnYXRoZXIgdW5pcXVlIGRhdGEgZm9yIHRoZSBhYmJyZXZpYXRpb24gZm9sZGluZyBzZXQuCisgICAgLy8vCisgICAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKworICAgIC8vLyBFbWl0IC0gUHJpbnQgdGhlIGFiYnJldmlhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGFzbSBwcmludGVyLgorICAgIC8vLworICAgIHZvaWQgRW1pdChBc21QcmludGVyICpBUCkgY29uc3Q7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBkdW1wKCk7CisjZW5kaWYKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIERJRSAtIEEgc3RydWN0dXJlZCBkZWJ1ZyBpbmZvcm1hdGlvbiBlbnRyeS4gIEhhcyBhbiBhYmJyZXZpYXRpb24gd2hpY2gKKyAgLy8vIGRlc2NyaWJlcyBpdCdzIG9yZ2FuaXphdGlvbi4KKyAgY2xhc3MgRElFVmFsdWU7CisKKyAgY2xhc3MgRElFIHsKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBBYmJyZXYgLSBCdWZmZXIgZm9yIGNvbnN0cnVjdGluZyBhYmJyZXZpYXRpb24uCisgICAgLy8vCisgICAgRElFQWJicmV2IEFiYnJldjsKKworICAgIC8vLyBPZmZzZXQgLSBPZmZzZXQgaW4gZGVidWcgaW5mbyBzZWN0aW9uLgorICAgIC8vLworICAgIHVuc2lnbmVkIE9mZnNldDsKKworICAgIC8vLyBTaXplIC0gU2l6ZSBvZiBpbnN0YW5jZSArIGNoaWxkcmVuLgorICAgIC8vLworICAgIHVuc2lnbmVkIFNpemU7CisKKyAgICAvLy8gQ2hpbGRyZW4gRElFcy4KKyAgICAvLy8KKyAgICBzdGQ6OnZlY3RvcjxESUUgKj4gQ2hpbGRyZW47CisKKyAgICBESUUgKlBhcmVudDsKKworICAgIC8vLyBBdHRyaWJ1dGVzIHZhbHVlcy4KKyAgICAvLy8KKyAgICBTbWFsbFZlY3RvcjxESUVWYWx1ZSosIDMyPiBWYWx1ZXM7CisKKyAgICAvLyBQcml2YXRlIGRhdGEgZm9yIHByaW50KCkKKyAgICBtdXRhYmxlIHVuc2lnbmVkIEluZGVudENvdW50OworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRElFKHVuc2lnbmVkIFRhZykKKyAgICAgIDogQWJicmV2KFRhZywgZHdhcmY6OkRXX0NISUxEUkVOX25vKSwgT2Zmc2V0KDApLAorICAgICAgICBTaXplKDApLCBQYXJlbnQgKDApLCBJbmRlbnRDb3VudCgwKSB7fQorICAgIHZpcnR1YWwgfkRJRSgpOworCisgICAgLy8gQWNjZXNzb3JzLgorICAgIERJRUFiYnJldiAmZ2V0QWJicmV2KCkgeyByZXR1cm4gQWJicmV2OyB9CisgICAgdW5zaWduZWQgZ2V0QWJicmV2TnVtYmVyKCkgY29uc3QgeyByZXR1cm4gQWJicmV2LmdldE51bWJlcigpOyB9CisgICAgdW5zaWduZWQgZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gQWJicmV2LmdldFRhZygpOyB9CisgICAgdW5zaWduZWQgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgICAgdW5zaWduZWQgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxESUUgKj4gJmdldENoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW47IH0KKyAgICBjb25zdCBTbWFsbFZlY3RvcjxESUVWYWx1ZSosIDMyPiAmZ2V0VmFsdWVzKCkgY29uc3QgeyByZXR1cm4gVmFsdWVzOyB9CisgICAgRElFICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKyAgICB2b2lkIHNldFRhZyh1bnNpZ25lZCBUYWcpIHsgQWJicmV2LnNldFRhZyhUYWcpOyB9CisgICAgdm9pZCBzZXRPZmZzZXQodW5zaWduZWQgTykgeyBPZmZzZXQgPSBPOyB9CisgICAgdm9pZCBzZXRTaXplKHVuc2lnbmVkIFMpIHsgU2l6ZSA9IFM7IH0KKyAgICAKKyAgICAvLy8gYWRkVmFsdWUgLSBBZGQgYSB2YWx1ZSBhbmQgYXR0cmlidXRlcyB0byBhIERJRS4KKyAgICAvLy8KKyAgICB2b2lkIGFkZFZhbHVlKHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgRm9ybSwgRElFVmFsdWUgKlZhbHVlKSB7CisgICAgICBBYmJyZXYuQWRkQXR0cmlidXRlKEF0dHJpYnV0ZSwgRm9ybSk7CisgICAgICBWYWx1ZXMucHVzaF9iYWNrKFZhbHVlKTsKKyAgICB9CisKKyAgICAvLy8gU2libGluZ09mZnNldCAtIFJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBlbnRyeSdzCisgICAgLy8vIHNpYmxpbmcuCisgICAgdW5zaWduZWQgZ2V0U2libGluZ09mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldCArIFNpemU7IH0KKworICAgIC8vLyBhZGRTaWJsaW5nT2Zmc2V0IC0gQWRkIGEgc2libGluZyBvZmZzZXQgZmllbGQgdG8gdGhlIGZyb250IG9mIHRoZSBESUUuCisgICAgLy8vIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4gdmFsdWUgYXQgb3IgYWZ0ZXIgdGhlCisgICAgLy8vIHNhbWUgdGltZSBpdCBkZXN0cm95cyB0aGlzIERJRS4KKyAgICAvLy8KKyAgICBESUVWYWx1ZSAqYWRkU2libGluZ09mZnNldChCdW1wUHRyQWxsb2NhdG9yICZBKTsKKworICAgIC8vLyBhZGRDaGlsZCAtIEFkZCBhIGNoaWxkIHRvIHRoZSBESUUuCisgICAgLy8vCisgICAgdm9pZCBhZGRDaGlsZChESUUgKkNoaWxkKSB7CisgICAgICBpZiAoQ2hpbGQtPmdldFBhcmVudCgpKSB7CisgICAgICAgIGFzc2VydCAoQ2hpbGQtPmdldFBhcmVudCgpID09IHRoaXMgJiYgIlVuZXhwZWN0ZWQgRElFIFBhcmVudCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgQWJicmV2LnNldENoaWxkcmVuRmxhZyhkd2FyZjo6RFdfQ0hJTERSRU5feWVzKTsKKyAgICAgIENoaWxkcmVuLnB1c2hfYmFjayhDaGlsZCk7CisgICAgICBDaGlsZC0+UGFyZW50ID0gdGhpczsKKyAgICB9CisKKyNpZm5kZWYgTkRFQlVHCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTywgdW5zaWduZWQgSW5jSW5kZW50ID0gMCk7CisgICAgdm9pZCBkdW1wKCk7CisjZW5kaWYKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIERJRVZhbHVlIC0gQSBkZWJ1ZyBpbmZvcm1hdGlvbiBlbnRyeSB2YWx1ZS4KKyAgLy8vCisgIGNsYXNzIERJRVZhbHVlIHsKKyAgcHVibGljOgorICAgIGVudW0geworICAgICAgaXNJbnRlZ2VyLAorICAgICAgaXNTdHJpbmcsCisgICAgICBpc0xhYmVsLAorICAgICAgaXNTZWN0aW9uT2Zmc2V0LAorICAgICAgaXNEZWx0YSwKKyAgICAgIGlzRW50cnksCisgICAgICBpc0Jsb2NrCisgICAgfTsKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBUeXBlIC0gVHlwZSBvZiBkYXRhIHN0b3JlZCBpbiB0aGUgdmFsdWUuCisgICAgLy8vCisgICAgdW5zaWduZWQgVHlwZTsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJRVZhbHVlKHVuc2lnbmVkIFQpIDogVHlwZShUKSB7fQorICAgIHZpcnR1YWwgfkRJRVZhbHVlKCkge30KKworICAgIC8vIEFjY2Vzc29ycworICAgIHVuc2lnbmVkIGdldFR5cGUoKSAgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorCisgICAgLy8vIEVtaXRWYWx1ZSAtIEVtaXQgdmFsdWUgdmlhIHRoZSBEd2FyZiB3cml0ZXIuCisgICAgLy8vCisgICAgdmlydHVhbCB2b2lkIEVtaXRWYWx1ZShBc21QcmludGVyICpBUCwgdW5zaWduZWQgRm9ybSkgY29uc3QgPSAwOworCisgICAgLy8vIFNpemVPZiAtIFJldHVybiB0aGUgc2l6ZSBvZiBhIHZhbHVlIGluIGJ5dGVzLgorICAgIC8vLworICAgIHZpcnR1YWwgdW5zaWduZWQgU2l6ZU9mKEFzbVByaW50ZXIgKkFQLCB1bnNpZ25lZCBGb3JtKSBjb25zdCA9IDA7CisKKyAgICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC4KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERJRVZhbHVlICopIHsgcmV0dXJuIHRydWU7IH0KKworI2lmbmRlZiBOREVCVUcKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pID0gMDsKKyAgICB2b2lkIGR1bXAoKTsKKyNlbmRpZgorICB9OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gRElFSW50ZWdlciAtIEFuIGludGVnZXIgdmFsdWUgRElFLgorICAvLy8KKyAgY2xhc3MgRElFSW50ZWdlciA6IHB1YmxpYyBESUVWYWx1ZSB7CisgICAgdWludDY0X3QgSW50ZWdlcjsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJRUludGVnZXIodWludDY0X3QgSSkgOiBESUVWYWx1ZShpc0ludGVnZXIpLCBJbnRlZ2VyKEkpIHt9CisKKyAgICAvLy8gQmVzdEZvcm0gLSBDaG9vc2UgdGhlIGJlc3QgZm9ybSBmb3IgaW50ZWdlci4KKyAgICAvLy8KKyAgICBzdGF0aWMgdW5zaWduZWQgQmVzdEZvcm0oYm9vbCBJc1NpZ25lZCwgdWludDY0X3QgSW50KSB7CisgICAgICBpZiAoSXNTaWduZWQpIHsKKyAgICAgICAgaWYgKChjaGFyKUludCA9PSAoc2lnbmVkKUludCkgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fZGF0YTE7CisgICAgICAgIGlmICgoc2hvcnQpSW50ID09IChzaWduZWQpSW50KSAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2RhdGEyOworICAgICAgICBpZiAoKGludClJbnQgPT0gKHNpZ25lZClJbnQpICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9kYXRhNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgodW5zaWduZWQgY2hhcilJbnQgPT0gSW50KSAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2RhdGExOworICAgICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KUludCA9PSBJbnQpIHJldHVybiBkd2FyZjo6RFdfRk9STV9kYXRhMjsKKyAgICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpSW50ID09IEludCkgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fZGF0YTQ7CisgICAgICB9CisgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fZGF0YTg7CisgICAgfQorCisgICAgLy8vIEVtaXRWYWx1ZSAtIEVtaXQgaW50ZWdlciBvZiBhcHByb3ByaWF0ZSBzaXplLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWUoQXNtUHJpbnRlciAqQVAsIHVuc2lnbmVkIEZvcm0pIGNvbnN0OworCisgICAgdWludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBJbnRlZ2VyOyB9CisKKyAgICAvLy8gU2l6ZU9mIC0gRGV0ZXJtaW5lIHNpemUgb2YgaW50ZWdlciB2YWx1ZSBpbiBieXRlcy4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIFNpemVPZihBc21QcmludGVyICpBUCwgdW5zaWduZWQgRm9ybSkgY29uc3Q7CisKKyAgICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC4KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERJRUludGVnZXIgKikgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRElFVmFsdWUgKkkpIHsgcmV0dXJuIEktPmdldFR5cGUoKSA9PSBpc0ludGVnZXI7IH0KKworI2lmbmRlZiBOREVCVUcKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pOworI2VuZGlmCisgIH07CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBESUVTdHJpbmcgLSBBIHN0cmluZyB2YWx1ZSBESUUuIFRoaXMgRElFIGtlZXBzIHN0cmluZyByZWZlcmVuY2Ugb25seS4KKyAgLy8vCisgIGNsYXNzIERJRVN0cmluZyA6IHB1YmxpYyBESUVWYWx1ZSB7CisgICAgY29uc3QgU3RyaW5nUmVmIFN0cjsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJRVN0cmluZyhjb25zdCBTdHJpbmdSZWYgUykgOiBESUVWYWx1ZShpc1N0cmluZyksIFN0cihTKSB7fQorCisgICAgLy8vIEVtaXRWYWx1ZSAtIEVtaXQgc3RyaW5nIHZhbHVlLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWUoQXNtUHJpbnRlciAqQVAsIHVuc2lnbmVkIEZvcm0pIGNvbnN0OworCisgICAgLy8vIFNpemVPZiAtIERldGVybWluZSBzaXplIG9mIHN0cmluZyB2YWx1ZSBpbiBieXRlcy4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIFNpemVPZihBc21QcmludGVyICpBUCwgdW5zaWduZWQgLypGb3JtKi8pIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdHIuc2l6ZSgpICsgc2l6ZW9mKGNoYXIpOyAvLyBzaXplb2YoJ1wwJyk7CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QuCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBESUVTdHJpbmcgKikgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRElFVmFsdWUgKlMpIHsgcmV0dXJuIFMtPmdldFR5cGUoKSA9PSBpc1N0cmluZzsgfQorCisjaWZuZGVmIE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTyk7CisjZW5kaWYKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIERJRUxhYmVsIC0gQSBsYWJlbCBleHByZXNzaW9uIERJRS4KKyAgLy8KKyAgY2xhc3MgRElFTGFiZWwgOiBwdWJsaWMgRElFVmFsdWUgeworICAgIGNvbnN0IE1DU3ltYm9sICpMYWJlbDsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJRUxhYmVsKGNvbnN0IE1DU3ltYm9sICpMKSA6IERJRVZhbHVlKGlzTGFiZWwpLCBMYWJlbChMKSB7fQorCisgICAgLy8vIEVtaXRWYWx1ZSAtIEVtaXQgbGFiZWwgdmFsdWUuCisgICAgLy8vCisgICAgdmlydHVhbCB2b2lkIEVtaXRWYWx1ZShBc21QcmludGVyICpBUCwgdW5zaWduZWQgRm9ybSkgY29uc3Q7CisKKyAgICAvLy8gZ2V0VmFsdWUgLSBHZXQgTUNTeW1ib2wuCisgICAgLy8vCisgICAgY29uc3QgTUNTeW1ib2wgKmdldFZhbHVlKCkgICAgICAgY29uc3QgeyByZXR1cm4gTGFiZWw7IH0KKworICAgIC8vLyBTaXplT2YgLSBEZXRlcm1pbmUgc2l6ZSBvZiBsYWJlbCB2YWx1ZSBpbiBieXRlcy4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIFNpemVPZihBc21QcmludGVyICpBUCwgdW5zaWduZWQgRm9ybSkgY29uc3Q7CisKKyAgICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC4KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERJRUxhYmVsICopICB7IHJldHVybiB0cnVlOyB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBESUVWYWx1ZSAqTCkgeyByZXR1cm4gTC0+Z2V0VHlwZSgpID09IGlzTGFiZWw7IH0KKworI2lmbmRlZiBOREVCVUcKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pOworI2VuZGlmCisgIH07CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBESUVEZWx0YSAtIEEgc2ltcGxlIGxhYmVsIGRpZmZlcmVuY2UgRElFLgorICAvLy8KKyAgY2xhc3MgRElFRGVsdGEgOiBwdWJsaWMgRElFVmFsdWUgeworICAgIGNvbnN0IE1DU3ltYm9sICpMYWJlbEhpOworICAgIGNvbnN0IE1DU3ltYm9sICpMYWJlbExvOworICBwdWJsaWM6CisgICAgRElFRGVsdGEoY29uc3QgTUNTeW1ib2wgKkhpLCBjb25zdCBNQ1N5bWJvbCAqTG8pCisgICAgICA6IERJRVZhbHVlKGlzRGVsdGEpLCBMYWJlbEhpKEhpKSwgTGFiZWxMbyhMbykge30KKworICAgIC8vLyBFbWl0VmFsdWUgLSBFbWl0IGRlbHRhIHZhbHVlLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWUoQXNtUHJpbnRlciAqQVAsIHVuc2lnbmVkIEZvcm0pIGNvbnN0OworCisgICAgLy8vIFNpemVPZiAtIERldGVybWluZSBzaXplIG9mIGRlbHRhIHZhbHVlIGluIGJ5dGVzLgorICAgIC8vLworICAgIHZpcnR1YWwgdW5zaWduZWQgU2l6ZU9mKEFzbVByaW50ZXIgKkFQLCB1bnNpZ25lZCBGb3JtKSBjb25zdDsKKworICAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0LgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRElFRGVsdGEgKikgIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERJRVZhbHVlICpEKSB7IHJldHVybiBELT5nZXRUeXBlKCkgPT0gaXNEZWx0YTsgfQorCisjaWZuZGVmIE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTyk7CisjZW5kaWYKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIERJRW50cnkgLSBBIHBvaW50ZXIgdG8gYW5vdGhlciBkZWJ1ZyBpbmZvcm1hdGlvbiBlbnRyeS4gIEFuIGluc3RhbmNlIG9mCisgIC8vLyB0aGlzIGNsYXNzIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgYSBkZWJ1ZyBpbmZvcm1hdGlvbiBlbnRyeSBub3QKKyAgLy8vIHlldCBkZWZpbmVkIChpZS4gdHlwZXMuKQorICBjbGFzcyBESUVFbnRyeSA6IHB1YmxpYyBESUVWYWx1ZSB7CisgICAgRElFICpjb25zdCBFbnRyeTsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERJRUVudHJ5KERJRSAqRSkgOiBESUVWYWx1ZShpc0VudHJ5KSwgRW50cnkoRSkge30KKworICAgIERJRSAqZ2V0RW50cnkoKSBjb25zdCB7IHJldHVybiBFbnRyeTsgfQorCisgICAgLy8vIEVtaXRWYWx1ZSAtIEVtaXQgZGVidWcgaW5mb3JtYXRpb24gZW50cnkgb2Zmc2V0LgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWUoQXNtUHJpbnRlciAqQVAsIHVuc2lnbmVkIEZvcm0pIGNvbnN0OworCisgICAgLy8vIFNpemVPZiAtIERldGVybWluZSBzaXplIG9mIGRlYnVnIGluZm9ybWF0aW9uIGVudHJ5IGluIGJ5dGVzLgorICAgIC8vLworICAgIHZpcnR1YWwgdW5zaWduZWQgU2l6ZU9mKEFzbVByaW50ZXIgKkFQLCB1bnNpZ25lZCBGb3JtKSBjb25zdCB7CisgICAgICByZXR1cm4gc2l6ZW9mKGludDMyX3QpOworICAgIH0KKworICAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0LgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRElFRW50cnkgKikgIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERJRVZhbHVlICpFKSB7IHJldHVybiBFLT5nZXRUeXBlKCkgPT0gaXNFbnRyeTsgfQorCisjaWZuZGVmIE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTyk7CisjZW5kaWYKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIERJRUJsb2NrIC0gQSBibG9jayBvZiB2YWx1ZXMuICBQcmltYXJpbHkgdXNlZCBmb3IgbG9jYXRpb24gZXhwcmVzc2lvbnMuCisgIC8vCisgIGNsYXNzIERJRUJsb2NrIDogcHVibGljIERJRVZhbHVlLCBwdWJsaWMgRElFIHsKKyAgICB1bnNpZ25lZCBTaXplOyAgICAgICAgICAgICAgICAvLyBTaXplIGluIGJ5dGVzIGV4Y2x1ZGluZyBzaXplIGhlYWRlci4KKyAgcHVibGljOgorICAgIERJRUJsb2NrKCkKKyAgICAgIDogRElFVmFsdWUoaXNCbG9jayksIERJRSgwKSwgU2l6ZSgwKSB7fQorICAgIHZpcnR1YWwgfkRJRUJsb2NrKCkge30KKworICAgIC8vLyBDb21wdXRlU2l6ZSAtIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgYmxvY2suCisgICAgLy8vCisgICAgdW5zaWduZWQgQ29tcHV0ZVNpemUoQXNtUHJpbnRlciAqQVApOworCisgICAgLy8vIEJlc3RGb3JtIC0gQ2hvb3NlIHRoZSBiZXN0IGZvcm0gZm9yIGRhdGEuCisgICAgLy8vCisgICAgdW5zaWduZWQgQmVzdEZvcm0oKSBjb25zdCB7CisgICAgICBpZiAoKHVuc2lnbmVkIGNoYXIpU2l6ZSA9PSBTaXplKSAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2Jsb2NrMTsKKyAgICAgIGlmICgodW5zaWduZWQgc2hvcnQpU2l6ZSA9PSBTaXplKSByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fYmxvY2syOworICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpU2l6ZSA9PSBTaXplKSAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9ibG9jazQ7CisgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fYmxvY2s7CisgICAgfQorCisgICAgLy8vIEVtaXRWYWx1ZSAtIEVtaXQgYmxvY2sgZGF0YS4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlKEFzbVByaW50ZXIgKkFQLCB1bnNpZ25lZCBGb3JtKSBjb25zdDsKKworICAgIC8vLyBTaXplT2YgLSBEZXRlcm1pbmUgc2l6ZSBvZiBibG9jayBkYXRhIGluIGJ5dGVzLgorICAgIC8vLworICAgIHZpcnR1YWwgdW5zaWduZWQgU2l6ZU9mKEFzbVByaW50ZXIgKkFQLCB1bnNpZ25lZCBGb3JtKSBjb25zdDsKKworICAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0LgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRElFQmxvY2sgKikgIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERJRVZhbHVlICpFKSB7IHJldHVybiBFLT5nZXRUeXBlKCkgPT0gaXNCbG9jazsgfQorCisjaWZuZGVmIE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTyk7CisjZW5kaWYKKyAgfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9Bc21QcmludGVyL0R3YXJmRGVidWcuaCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FzbVByaW50ZXIvRHdhcmZEZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OTgyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Bc21QcmludGVyL0R3YXJmRGVidWcuaApAQCAtMCwwICsxLDY0MiBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vRHdhcmZEZWJ1Zy5oIC0gRHdhcmYgRGVidWcgRnJhbWV3b3JrIC0tLS0tLSotIEMrKyAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBmb3Igd3JpdGluZyBkd2FyZiBkZWJ1ZyBpbmZvIGludG8gYXNtIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQ09ERUdFTl9BU01QUklOVEVSX0RXQVJGREVCVUdfSF9fCisjZGVmaW5lIENPREVHRU5fQVNNUFJJTlRFUl9EV0FSRkRFQlVHX0hfXworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiRElFLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9VbmlxdWVWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29tcGlsZVVuaXQ7CitjbGFzcyBEYmdDb25jcmV0ZVNjb3BlOworY2xhc3MgRGJnU2NvcGU7CitjbGFzcyBEYmdWYXJpYWJsZTsKK2NsYXNzIE1hY2hpbmVGcmFtZUluZm87CitjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKK2NsYXNzIE1hY2hpbmVPcGVyYW5kOworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgRElFQWJicmV2OworY2xhc3MgRElFOworY2xhc3MgRElFQmxvY2s7CitjbGFzcyBESUVFbnRyeTsKKworY2xhc3MgRElFbnVtZXJhdG9yOworY2xhc3MgRElEZXNjcmlwdG9yOworY2xhc3MgRElWYXJpYWJsZTsKK2NsYXNzIERJR2xvYmFsOworY2xhc3MgRElHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIERJU3VicHJvZ3JhbTsKK2NsYXNzIERJQmFzaWNUeXBlOworY2xhc3MgRElEZXJpdmVkVHlwZTsKK2NsYXNzIERJVHlwZTsKK2NsYXNzIERJTmFtZVNwYWNlOworY2xhc3MgRElTdWJyYW5nZTsKK2NsYXNzIERJQ29tcG9zaXRlVHlwZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBTcmNMaW5lSW5mbyAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWNvcmQgc291cmNlIGxpbmUgY29ycmVzcG9uZGVuY2UuCisvLy8KK2NsYXNzIFNyY0xpbmVJbmZvIHsKKyAgdW5zaWduZWQgTGluZTsgICAgICAgICAgICAgICAgICAgICAvLyBTb3VyY2UgbGluZSBudW1iZXIuCisgIHVuc2lnbmVkIENvbHVtbjsgICAgICAgICAgICAgICAgICAgLy8gU291cmNlIGNvbHVtbi4KKyAgdW5zaWduZWQgU291cmNlSUQ7ICAgICAgICAgICAgICAgICAvLyBTb3VyY2UgSUQgbnVtYmVyLgorICBNQ1N5bWJvbCAqTGFiZWw7ICAgICAgICAgICAgICAgICAgIC8vIExhYmVsIGluIGNvZGUgSUQgbnVtYmVyLgorcHVibGljOgorICBTcmNMaW5lSW5mbyh1bnNpZ25lZCBMLCB1bnNpZ25lZCBDLCB1bnNpZ25lZCBTLCBNQ1N5bWJvbCAqbGFiZWwpCisgICAgOiBMaW5lKEwpLCBDb2x1bW4oQyksIFNvdXJjZUlEKFMpLCBMYWJlbChsYWJlbCkge30KKworICAvLyBBY2Nlc3NvcnMKKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmU7IH0KKyAgdW5zaWduZWQgZ2V0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gQ29sdW1uOyB9CisgIHVuc2lnbmVkIGdldFNvdXJjZUlEKCkgY29uc3QgeyByZXR1cm4gU291cmNlSUQ7IH0KKyAgTUNTeW1ib2wgKmdldExhYmVsKCkgY29uc3QgeyByZXR1cm4gTGFiZWw7IH0KK307CisKK2NsYXNzIER3YXJmRGVidWcgeworICAvLy8gQXNtIC0gVGFyZ2V0IG9mIER3YXJmIGVtaXNzaW9uLgorICBBc21QcmludGVyICpBc207CisKKyAgLy8vIE1NSSAtIENvbGxlY3RlZCBtYWNoaW5lIG1vZHVsZSBpbmZvcm1hdGlvbi4KKyAgTWFjaGluZU1vZHVsZUluZm8gKk1NSTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQXR0cmlidXRlcyB1c2VkIHRvIGNvbnN0cnVjdCBzcGVjaWZpYyBEd2FyZiBzZWN0aW9ucy4KKyAgLy8KKworICBDb21waWxlVW5pdCAqRmlyc3RDVTsKKyAgRGVuc2VNYXAgPGNvbnN0IE1ETm9kZSAqLCBDb21waWxlVW5pdCAqPiBDVU1hcDsKKworICAvLy8gQWJicmV2aWF0aW9uc1NldCAtIFVzZWQgdG8gdW5pcXVlbHkgZGVmaW5lIGFiYnJldmlhdGlvbnMuCisgIC8vLworICBGb2xkaW5nU2V0PERJRUFiYnJldj4gQWJicmV2aWF0aW9uc1NldDsKKworICAvLy8gQWJicmV2aWF0aW9ucyAtIEEgbGlzdCBvZiBhbGwgdGhlIHVuaXF1ZSBhYmJyZXZpYXRpb25zIGluIHVzZS4KKyAgLy8vCisgIHN0ZDo6dmVjdG9yPERJRUFiYnJldiAqPiBBYmJyZXZpYXRpb25zOworCisgIC8vLyBEaXJlY3RvcnlJZE1hcCAtIERpcmVjdG9yeSBuYW1lIHRvIGRpcmVjdG9yeSBpZCBtYXAuCisgIC8vLworICBTdHJpbmdNYXA8dW5zaWduZWQ+IERpcmVjdG9yeUlkTWFwOworCisgIC8vLyBEaXJlY3RvcnlOYW1lcyAtIEEgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMuCisgIFNtYWxsVmVjdG9yPHN0ZDo6c3RyaW5nLCA4PiBEaXJlY3RvcnlOYW1lczsKKworICAvLy8gU291cmNlRmlsZUlkTWFwIC0gU291cmNlIGZpbGUgbmFtZSB0byBzb3VyY2UgZmlsZSBpZCBtYXAuCisgIC8vLworICBTdHJpbmdNYXA8dW5zaWduZWQ+IFNvdXJjZUZpbGVJZE1hcDsKKworICAvLy8gU291cmNlRmlsZU5hbWVzIC0gQSBsaXN0IG9mIHNvdXJjZSBmaWxlIG5hbWVzLgorICBTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgOD4gU291cmNlRmlsZU5hbWVzOworCisgIC8vLyBTb3VyY2VJZE1hcCAtIFNvdXJjZSBpZCBtYXAsIGkuZS4gcGFpciBvZiBkaXJlY3RvcnkgaWQgYW5kIHNvdXJjZSBmaWxlCisgIC8vLyBpZCBtYXBwZWQgdG8gYSB1bmlxdWUgaWQuCisgIERlbnNlTWFwPHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+LCB1bnNpZ25lZD4gU291cmNlSWRNYXA7CisKKyAgLy8vIFNvdXJjZUlkcyAtIFJldmVyc2UgbWFwIGZyb20gc291cmNlIGlkIHRvIGRpcmVjdG9yeSBpZCArIGZpbGUgaWQgcGFpci4KKyAgLy8vCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+LCA4PiBTb3VyY2VJZHM7CisKKyAgLy8vIExpbmVzIC0gTGlzdCBvZiBzb3VyY2UgbGluZSBjb3JyZXNwb25kZW5jZS4KKyAgc3RkOjp2ZWN0b3I8U3JjTGluZUluZm8+IExpbmVzOworCisgIC8vLyBESUVCbG9ja3MgLSBBIGxpc3Qgb2YgYWxsIHRoZSBESUVCbG9ja3MgaW4gdXNlLgorICBzdGQ6OnZlY3RvcjxESUVCbG9jayAqPiBESUVCbG9ja3M7CisKKyAgLy8gRElFVmFsdWVBbGxvY2F0b3IgLSBBbGwgRElFVmFsdWVzIGFyZSBhbGxvY2F0ZWQgdGhyb3VnaCB0aGlzIGFsbG9jYXRvci4KKyAgQnVtcFB0ckFsbG9jYXRvciBESUVWYWx1ZUFsbG9jYXRvcjsKKworICAvLy8gU3RyaW5nUG9vbCAtIEEgU3RyaW5nLT5TeW1ib2wgbWFwcGluZyBvZiBzdHJpbmdzIHVzZWQgYnkgaW5kaXJlY3QKKyAgLy8vIHJlZmVyZW5jZXMuCisgIFN0cmluZ01hcDxzdGQ6OnBhaXI8TUNTeW1ib2wqLCB1bnNpZ25lZD4gPiBTdHJpbmdQb29sOworICB1bnNpZ25lZCBOZXh0U3RyaW5nUG9vbE51bWJlcjsKKyAgCisgIE1DU3ltYm9sICpnZXRTdHJpbmdQb29sRW50cnkoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIFNlY3Rpb25NYXAgLSBQcm92aWRlcyBhIHVuaXF1ZSBpZCBwZXIgdGV4dCBzZWN0aW9uLgorICAvLy8KKyAgVW5pcXVlVmVjdG9yPGNvbnN0IE1DU2VjdGlvbio+IFNlY3Rpb25NYXA7CisKKyAgLy8vIFNlY3Rpb25Tb3VyY2VMaW5lcyAtIFRyYWNrcyBsaW5lIG51bWJlcnMgcGVyIHRleHQgc2VjdGlvbi4KKyAgLy8vCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFNyY0xpbmVJbmZvPiA+IFNlY3Rpb25Tb3VyY2VMaW5lczsKKworICAvLyBDdXJyZW50Rm5EYmdTY29wZSAtIFRvcCBsZXZlbCBzY29wZSBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIC8vCisgIERiZ1Njb3BlICpDdXJyZW50Rm5EYmdTY29wZTsKKyAgCisgIC8vLyBEYmdTY29wZU1hcCAtIFRyYWNrcyB0aGUgc2NvcGVzIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgT3ducyB0aGUKKyAgLy8vIGNvbnRhaW5lZCBEYmdTY29wZSpzLgorICAvLy8KKyAgRGVuc2VNYXA8Y29uc3QgTUROb2RlICosIERiZ1Njb3BlICo+IERiZ1Njb3BlTWFwOworCisgIC8vLyBDb25jcmV0ZVNjb3BlcyAtIFRyYWNrcyB0aGUgY29uY3JldGUgc2NvcGVlcyBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgLy8vIFRoZXNlIHNjb3BlcyBhcmUgYWxzbyBpbmNsdWRlZCBpbiBEYmdTY29wZU1hcC4KKyAgRGVuc2VNYXA8Y29uc3QgTUROb2RlICosIERiZ1Njb3BlICo+IENvbmNyZXRlU2NvcGVzOworCisgIC8vLyBBYnN0cmFjdFNjb3BlcyAtIFRyYWNrcyB0aGUgYWJzdHJhY3Qgc2NvcGVzIGEgbW9kdWxlLiBUaGVzZSBzY29wZXMgYXJlCisgIC8vLyBub3QgaW5jbHVkZWQgRGJnU2NvcGVNYXAuICBBYnN0cmFjdFNjb3BlcyBvd25zIGl0cyBEYmdTY29wZSpzLgorICBEZW5zZU1hcDxjb25zdCBNRE5vZGUgKiwgRGJnU2NvcGUgKj4gQWJzdHJhY3RTY29wZXM7CisKKyAgLy8vIEFic3RyYWN0U1BEaWVzIC0gQ29sbGVjdGlvbiBvZiBhYnN0cmFjdCBzdWJwcm9ncmFtIERJRXMuCisgIERlbnNlTWFwPGNvbnN0IE1ETm9kZSAqLCBESUUgKj4gQWJzdHJhY3RTUERpZXM7CisKKyAgLy8vIEFic3RyYWN0U2NvcGVzTGlzdCAtIFRyYWNrcyBhYnN0cmFjdCBzY29wZXMgY29uc3RydWN0ZWQgd2hpbGUgcHJvY2Vzc2luZworICAvLy8gYSBmdW5jdGlvbi4gVGhpcyBsaXN0IGlzIGNsZWFyZWQgZHVyaW5nIGVuZEZ1bmN0aW9uKCkuCisgIFNtYWxsVmVjdG9yPERiZ1Njb3BlICosIDQ+QWJzdHJhY3RTY29wZXNMaXN0OworCisgIC8vLyBBYnN0cmFjdFZhcmlhYmxlcyAtIENvbGxlY3Rpb24gb24gYWJzdHJhY3QgdmFyaWFibGVzLiAgT3duZWQgYnkgdGhlCisgIC8vLyBEYmdTY29wZXMgaW4gQWJzdHJhY3RTY29wZXMuCisgIERlbnNlTWFwPGNvbnN0IE1ETm9kZSAqLCBEYmdWYXJpYWJsZSAqPiBBYnN0cmFjdFZhcmlhYmxlczsKKworICAvLy8gRGJnVmFyaWFibGVUb0ZyYW1lSW5kZXhNYXAgLSBUcmFja3MgZnJhbWUgaW5kZXggdXNlZCB0byBmaW5kIAorICAvLy8gdmFyaWFibGUncyB2YWx1ZS4KKyAgRGVuc2VNYXA8Y29uc3QgRGJnVmFyaWFibGUgKiwgaW50PiBEYmdWYXJpYWJsZVRvRnJhbWVJbmRleE1hcDsKKworICAvLy8gRGJnVmFyaWFibGVUb0RiZ0luc3RNYXAgLSBNYXBzIERiZ1ZhcmlhYmxlIHRvIGNvcnJlc3BvbmRpbmcgREJHX1ZBTFVFCisgIC8vLyBtYWNoaW5lIGluc3RydWN0aW9uLgorICBEZW5zZU1hcDxjb25zdCBEYmdWYXJpYWJsZSAqLCBjb25zdCBNYWNoaW5lSW5zdHIgKj4gRGJnVmFyaWFibGVUb0RiZ0luc3RNYXA7CisKKyAgLy8vIERiZ1ZhcmlhYmxlTGFiZWxzTWFwIC0gTWFwcyBEYmdWYXJpYWJsZSB0byBjb3JyZXNwb25kaW5nIE1DU3ltYm9sLgorICBEZW5zZU1hcDxjb25zdCBEYmdWYXJpYWJsZSAqLCBjb25zdCBNQ1N5bWJvbCAqPiBEYmdWYXJpYWJsZUxhYmVsc01hcDsKKworICAvLy8gRG90RGVidWdMb2NFbnRyeSAtIFRoaXMgc3RydWN0IGRlc2NyaWJlcyBsb2NhdGlvbiBlbnRyaWVzIGVtaXR0ZWQgaW4KKyAgLy8vIC5kZWJ1Z19sb2Mgc2VjdGlvbi4KKyAgdHlwZWRlZiBzdHJ1Y3QgRG90RGVidWdMb2NFbnRyeSB7CisgICAgY29uc3QgTUNTeW1ib2wgKkJlZ2luOworICAgIGNvbnN0IE1DU3ltYm9sICpFbmQ7CisgICAgTWFjaGluZUxvY2F0aW9uIExvYzsKKyAgICBEb3REZWJ1Z0xvY0VudHJ5KCkgOiBCZWdpbigwKSwgRW5kKDApIHt9CisgICAgRG90RGVidWdMb2NFbnRyeShjb25zdCBNQ1N5bWJvbCAqQiwgY29uc3QgTUNTeW1ib2wgKkUsIAorICAgICAgICAgICAgICAgICAgTWFjaGluZUxvY2F0aW9uICZMKSA6IEJlZ2luKEIpLCBFbmQoRSksIExvYyhMKSB7fQorICAgIC8vLyBFbXB0eSBlbnRyaWVzIGFyZSBhbHNvIHVzZWQgYXMgYSB0cmlnZ2VyIHRvIGVtaXQgdGVtcCBsYWJlbC4gU3VjaAorICAgIC8vLyBsYWJlbHMgYXJlIHJlZmVyZW5jZWQgaXMgdXNlZCB0byBmaW5kIGRlYnVnX2xvYyBvZmZzZXQgZm9yIGEgZ2l2ZW4gRElFLgorICAgIGJvb2wgaXNFbXB0eSgpIHsgcmV0dXJuIEJlZ2luID09IDAgJiYgRW5kID09IDA7IH0KKyAgfSBEb3REZWJ1Z0xvY0VudHJ5OworCisgIC8vLyBEb3REZWJ1Z0xvY0VudHJpZXMgLSBDb2xsZWN0aW9uIG9mIERvdERlYnVnTG9jRW50cnkuCisgIFNtYWxsVmVjdG9yPERvdERlYnVnTG9jRW50cnksIDQ+IERvdERlYnVnTG9jRW50cmllczsKKworICAvLy8gVXNlRG90RGVidWdMb2NFbnRyeSAtIERXX0FUX2xvY2F0aW9uIGF0dHJpYnV0ZXMgZm9yIHRoZSBESUVzIGluIHRoaXMgc2V0CisgIC8vLyBpZGV0aWZpZXMgY29ycmVzcG9uZGluZyAuZGVidWdfbG9jIGVudHJ5IG9mZnNldC4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgRElFICosIDQ+IFVzZURvdERlYnVnTG9jRW50cnk7CisKKyAgLy8vIFZhclRvQWJzdHJhY3RWYXJNYXAgLSBNYXBzIERiZ1ZhcmlhYmxlIHdpdGggY29ycmVzcG9uZGluZyBBYnN0cmFjdAorICAvLy8gRGJnVmFyaWFibGUsIGlmIGFueS4KKyAgRGVuc2VNYXA8Y29uc3QgRGJnVmFyaWFibGUgKiwgY29uc3QgRGJnVmFyaWFibGUgKj4gVmFyVG9BYnN0cmFjdFZhck1hcDsKKworICAvLy8gSW5saWVuZFN1YnByb2dyYW1ESUVzIC0gQ29sbGVjdGlvbiBvZiBzdWJwcmdyYW0gRElFcyB0aGF0IGFyZSBtYXJrZWQKKyAgLy8vIChhdCB0aGUgZW5kIG9mIHRoZSBtb2R1bGUpIGFzIERXX0FUX2lubGluZS4KKyAgU21hbGxQdHJTZXQ8RElFICosIDQ+IElubGluZWRTdWJwcm9ncmFtRElFczsKKworICAvLy8gQ29udGFpbmluZ1R5cGVNYXAgLSBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygc3VicHJvZ3JhbSBESUVzIHRoYXQKKyAgLy8vIG5lZWQgRFdfQVRfY29udGFpbmluZ190eXBlIGF0dHJpYnV0ZS4gVGhpcyBhdHRyaWJ1dGUgcG9pbnRzIHRvIGEgRElFIHRoYXQKKyAgLy8vIGNvcnJlc3BvbmRzIHRvIHRoZSBNRE5vZGUgbWFwcGVkIHdpdGggdGhlIHN1YnByb2dyYW0gRElFLgorICBEZW5zZU1hcDxESUUgKiwgY29uc3QgTUROb2RlICo+IENvbnRhaW5pbmdUeXBlTWFwOworCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8RGJnU2NvcGUgKiwgMj4gU2NvcGVWZWN0b3I7CisKKyAgU21hbGxQdHJTZXQ8Y29uc3QgTWFjaGluZUluc3RyICosIDg+IEluc25zRW5kU2NvcGVTZXQ7CisKKyAgLy8vIElubGluZUluZm8gLSBLZWVwIHRyYWNrIG9mIGlubGluZWQgZnVuY3Rpb25zIGFuZCB0aGVpciBsb2NhdGlvbi4gIFRoaXMKKyAgLy8vIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcG9wdWxhdGUgZGVidWdfaW5saW5lZCBzZWN0aW9uLgorICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBNQ1N5bWJvbCAqLCBESUUgKj4gSW5saW5lSW5mb0xhYmVsczsKKyAgRGVuc2VNYXA8Y29uc3QgTUROb2RlICosIFNtYWxsVmVjdG9yPElubGluZUluZm9MYWJlbHMsIDQ+ID4gSW5saW5lSW5mbzsKKyAgU21hbGxWZWN0b3I8Y29uc3QgTUROb2RlICosIDQ+IElubGluZWRTUE5vZGVzOworCisgIC8vIFByb2Nlc3NlZFNQTm9kZXMgLSBUaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBzdWJwcm9ncmFtIE1ETm9kZXMgdGhhdAorICAvLyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBESUVzLgorICBTbWFsbFB0clNldDxjb25zdCBNRE5vZGUgKiwgMTY+IFByb2Nlc3NlZFNQTm9kZXM7CisKKyAgLy8vIExhYmVsc0JlZm9yZUluc24gLSBNYXBzIGluc3RydWN0aW9uIHdpdGggbGFiZWwgZW1pdHRlZCBiZWZvcmUgCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgRGVuc2VNYXA8Y29uc3QgTWFjaGluZUluc3RyICosIE1DU3ltYm9sICo+IExhYmVsc0JlZm9yZUluc247CisKKyAgLy8vIExhYmVsc0FmdGVySW5zbiAtIE1hcHMgaW5zdHJ1Y3Rpb24gd2l0aCBsYWJlbCBlbWl0dGVkIGFmdGVyCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgRGVuc2VNYXA8Y29uc3QgTWFjaGluZUluc3RyICosIE1DU3ltYm9sICo+IExhYmVsc0FmdGVySW5zbjsKKworICAvLy8gaW5zbk5lZWRzTGFiZWwgLSBDb2xsZWN0aW9uIG9mIGluc3RydWN0aW9ucyB0aGF0IG5lZWQgYSBsYWJlbCB0byBtYXJrCisgIC8vLyBhIGRlYnVnZ2dpbmcgaW5mb3JtYXRpb24gZW50aXR5LgorICBTbWFsbFB0clNldDxjb25zdCBNYWNoaW5lSW5zdHIgKiwgOD4gSW5zbk5lZWRzTGFiZWw7CisKKyAgU21hbGxWZWN0b3I8Y29uc3QgTUNTeW1ib2wgKiwgOD4gRGVidWdSYW5nZVN5bWJvbHM7CisKKyAgLy8vIFByZXZpb3VzIGluc3RydWN0aW9uJ3MgbG9jYXRpb24gaW5mb3JtYXRpb24uIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUKKyAgLy8vIGxhYmVsIGxvY2F0aW9uIHRvIGluZGljYXRlIHNjb3BlIGJvdW5kcmllcyBpbiBkd2FyZiBkZWJ1ZyBpbmZvLgorICBEZWJ1Z0xvYyBQcmV2SW5zdExvYzsKKyAgTUNTeW1ib2wgKlByZXZMYWJlbDsKKworICBzdHJ1Y3QgRnVuY3Rpb25EZWJ1Z0ZyYW1lSW5mbyB7CisgICAgdW5zaWduZWQgTnVtYmVyOworICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVNb3ZlPiBNb3ZlczsKKworICAgIEZ1bmN0aW9uRGVidWdGcmFtZUluZm8odW5zaWduZWQgTnVtLCBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lTW92ZT4gJk0pCisgICAgICA6IE51bWJlcihOdW0pLCBNb3ZlcyhNKSB7fQorICB9OworCisgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uRGVidWdGcmFtZUluZm8+IERlYnVnRnJhbWVzOworCisgIC8vIFNlY3Rpb24gU3ltYm9sczogdGhlc2UgYXJlIGFzc2VtYmxlciB0ZW1wb3JhcnkgbGFiZWxzIHRoYXQgYXJlIGVtaXR0ZWQgYXQKKyAgLy8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHN1cHBvcnRlZCBkd2FyZiBzZWN0aW9uLiAgVGhlc2UgYXJlIHVzZWQgdG8gZm9ybQorICAvLyBzZWN0aW9uIG9mZnNldHMgYW5kIGFyZSBjcmVhdGVkIGJ5IEVtaXRTZWN0aW9uTGFiZWxzLgorICBNQ1N5bWJvbCAqRHdhcmZGcmFtZVNlY3Rpb25TeW0sICpEd2FyZkluZm9TZWN0aW9uU3ltLCAqRHdhcmZBYmJyZXZTZWN0aW9uU3ltOworICBNQ1N5bWJvbCAqRHdhcmZTdHJTZWN0aW9uU3ltLCAqVGV4dFNlY3Rpb25TeW0sICpEd2FyZkRlYnVnUmFuZ2VTZWN0aW9uU3ltOworICBNQ1N5bWJvbCAqRHdhcmZEZWJ1Z0xvY1NlY3Rpb25TeW07CisgIE1DU3ltYm9sICpEd2FyZkRlYnVnTGluZVNlY3Rpb25TeW0sICpDdXJyZW50TGluZVNlY3Rpb25TeW07CisgIE1DU3ltYm9sICpGdW5jdGlvbkJlZ2luU3ltLCAqRnVuY3Rpb25FbmRTeW07CisKKyAgRElFSW50ZWdlciAqRElFSW50ZWdlck9uZTsKK3ByaXZhdGU6CisgIAorICAvLy8gZ2V0U291cmNlRGlyZWN0b3J5QW5kRmlsZUlkcyAtIFJldHVybiB0aGUgZGlyZWN0b3J5IGFuZCBmaWxlIGlkcyB0aGF0CisgIC8vLyBtYXBzIHRvIHRoZSBzb3VyY2UgaWQuIFNvdXJjZSBpZCBzdGFydHMgYXQgMS4KKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4KKyAgZ2V0U291cmNlRGlyZWN0b3J5QW5kRmlsZUlkcyh1bnNpZ25lZCBTSWQpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlSWRzW1NJZC0xXTsKKyAgfQorCisgIC8vLyBnZXROdW1Tb3VyY2VEaXJlY3RvcmllcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIHNvdXJjZSBkaXJlY3RvcmllcyBpbiB0aGUKKyAgLy8vIGRlYnVnIGluZm8uCisgIHVuc2lnbmVkIGdldE51bVNvdXJjZURpcmVjdG9yaWVzKCkgY29uc3QgeworICAgIHJldHVybiBEaXJlY3RvcnlOYW1lcy5zaXplKCk7CisgIH0KKworICAvLy8gZ2V0U291cmNlRGlyZWN0b3J5TmFtZSAtIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvcnJlc3BvbmRpbmcKKyAgLy8vIHRvIHRoZSBpZC4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFNvdXJjZURpcmVjdG9yeU5hbWUodW5zaWduZWQgSWQpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlyZWN0b3J5TmFtZXNbSWQgLSAxXTsKKyAgfQorCisgIC8vLyBnZXRTb3VyY2VGaWxlTmFtZSAtIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgY29ycmVzcG9uZGluZworICAvLy8gdG8gdGhlIGlkLgorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0U291cmNlRmlsZU5hbWUodW5zaWduZWQgSWQpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlRmlsZU5hbWVzW0lkIC0gMV07CisgIH0KKworICAvLy8gZ2V0TnVtU291cmNlSWRzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgdW5pcXVlIHNvdXJjZSBpZHMuCisgIHVuc2lnbmVkIGdldE51bVNvdXJjZUlkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlSWRzLnNpemUoKTsKKyAgfQorCisgIC8vLyBhc3NpZ25BYmJyZXZOdW1iZXIgLSBEZWZpbmUgYSB1bmlxdWUgbnVtYmVyIGZvciB0aGUgYWJicmV2aWF0aW9uLgorICAvLy8KKyAgdm9pZCBhc3NpZ25BYmJyZXZOdW1iZXIoRElFQWJicmV2ICZBYmJyZXYpOworCisgIC8vLyBjcmVhdGVESUVFbnRyeSAtIENyZWF0ZXMgYSBuZXcgRElFRW50cnkgdG8gYmUgYSBwcm94eSBmb3IgYSBkZWJ1ZworICAvLy8gaW5mb3JtYXRpb24gZW50cnkuCisgIERJRUVudHJ5ICpjcmVhdGVESUVFbnRyeShESUUgKkVudHJ5KTsKKworICAvLy8gYWRkVUludCAtIEFkZCBhbiB1bnNpZ25lZCBpbnRlZ2VyIGF0dHJpYnV0ZSBkYXRhIGFuZCB2YWx1ZS4KKyAgLy8vCisgIHZvaWQgYWRkVUludChESUUgKkRpZSwgdW5zaWduZWQgQXR0cmlidXRlLCB1bnNpZ25lZCBGb3JtLCB1aW50NjRfdCBJbnRlZ2VyKTsKKworICAvLy8gYWRkU0ludCAtIEFkZCBhbiBzaWduZWQgaW50ZWdlciBhdHRyaWJ1dGUgZGF0YSBhbmQgdmFsdWUuCisgIC8vLworICB2b2lkIGFkZFNJbnQoRElFICpEaWUsIHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgRm9ybSwgaW50NjRfdCBJbnRlZ2VyKTsKKworICAvLy8gYWRkU3RyaW5nIC0gQWRkIGEgc3RyaW5nIGF0dHJpYnV0ZSBkYXRhIGFuZCB2YWx1ZS4KKyAgLy8vCisgIHZvaWQgYWRkU3RyaW5nKERJRSAqRGllLCB1bnNpZ25lZCBBdHRyaWJ1dGUsIHVuc2lnbmVkIEZvcm0sCisgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1JlZiBTdHIpOworCisgIC8vLyBhZGRMYWJlbCAtIEFkZCBhIER3YXJmIGxhYmVsIGF0dHJpYnV0ZSBkYXRhIGFuZCB2YWx1ZS4KKyAgLy8vCisgIHZvaWQgYWRkTGFiZWwoRElFICpEaWUsIHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgRm9ybSwKKyAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqTGFiZWwpOworCisgIC8vLyBhZGREZWx0YSAtIEFkZCBhIGxhYmVsIGRlbHRhIGF0dHJpYnV0ZSBkYXRhIGFuZCB2YWx1ZS4KKyAgLy8vCisgIHZvaWQgYWRkRGVsdGEoRElFICpEaWUsIHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgRm9ybSwKKyAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqSGksIGNvbnN0IE1DU3ltYm9sICpMbyk7CisKKyAgLy8vIGFkZERJRUVudHJ5IC0gQWRkIGEgRElFIGF0dHJpYnV0ZSBkYXRhIGFuZCB2YWx1ZS4KKyAgLy8vCisgIHZvaWQgYWRkRElFRW50cnkoRElFICpEaWUsIHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgRm9ybSwgRElFICpFbnRyeSk7CisgIAorICAvLy8gYWRkQmxvY2sgLSBBZGQgYmxvY2sgZGF0YS4KKyAgLy8vCisgIHZvaWQgYWRkQmxvY2soRElFICpEaWUsIHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgRm9ybSwgRElFQmxvY2sgKkJsb2NrKTsKKworICAvLy8gYWRkU291cmNlTGluZSAtIEFkZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBzcGVjaWZpZWQgZGVidWcgaW5mb3JtYXRpb24KKyAgLy8vIGVudHJ5LgorICB2b2lkIGFkZFNvdXJjZUxpbmUoRElFICpEaWUsIERJVmFyaWFibGUgVik7CisgIHZvaWQgYWRkU291cmNlTGluZShESUUgKkRpZSwgRElHbG9iYWxWYXJpYWJsZSBHKTsKKyAgdm9pZCBhZGRTb3VyY2VMaW5lKERJRSAqRGllLCBESVN1YnByb2dyYW0gU1ApOworICB2b2lkIGFkZFNvdXJjZUxpbmUoRElFICpEaWUsIERJVHlwZSBUeSk7CisgIHZvaWQgYWRkU291cmNlTGluZShESUUgKkRpZSwgRElOYW1lU3BhY2UgTlMpOworCisgIC8vLyBhZGRBZGRyZXNzIC0gQWRkIGFuIGFkZHJlc3MgYXR0cmlidXRlIHRvIGEgZGllIGJhc2VkIG9uIHRoZSBsb2NhdGlvbgorICAvLy8gcHJvdmlkZWQuCisgIHZvaWQgYWRkQWRkcmVzcyhESUUgKkRpZSwgdW5zaWduZWQgQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUxvY2F0aW9uICZMb2NhdGlvbik7CisKKyAgLy8vIGFkZFJlZ2lzdGVyQWRkcmVzcyAtIEFkZCByZWdpc3RlciBsb2NhdGlvbiBlbnRyeSBpbiB2YXJpYWJsZSBESUUuCisgIGJvb2wgYWRkUmVnaXN0ZXJBZGRyZXNzKERJRSAqRGllLCBjb25zdCBNQ1N5bWJvbCAqVlMsIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyk7CisKKyAgLy8vIGFkZENvbnN0YW50VmFsdWUgLSBBZGQgY29uc3RhbnQgdmFsdWUgZW50cnkgaW4gdmFyaWFibGUgRElFLgorICBib29sIGFkZENvbnN0YW50VmFsdWUoRElFICpEaWUsIGNvbnN0IE1DU3ltYm9sICpWUywgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKTsKKworICAvLy8gYWRkQ29uc3RhbnRGUFZhbHVlIC0gQWRkIGNvbnN0YW50IHZhbHVlIGVudHJ5IGluIHZhcmlhYmxlIERJRS4KKyAgYm9vbCBhZGRDb25zdGFudEZQVmFsdWUoRElFICpEaWUsIGNvbnN0IE1DU3ltYm9sICpWUywgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKTsKKworICAvLy8gYWRkQ29tcGxleEFkZHJlc3MgLSBTdGFydCB3aXRoIHRoZSBhZGRyZXNzIGJhc2VkIG9uIHRoZSBsb2NhdGlvbiBwcm92aWRlZCwKKyAgLy8vIGFuZCBnZW5lcmF0ZSB0aGUgRFdBUkYgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGZpbmQgdGhlIGFjdHVhbCB2YXJpYWJsZQorICAvLy8gKG5hdmlnYXRpbmcgdGhlIGV4dHJhIGxvY2F0aW9uIGluZm9ybWF0aW9uIGVuY29kZWQgaW4gdGhlIHR5cGUpIGJhc2VkIG9uCisgIC8vLyB0aGUgc3RhcnRpbmcgbG9jYXRpb24uICBBZGQgdGhlIERXQVJGIGluZm9ybWF0aW9uIHRvIHRoZSBkaWUuCisgIC8vLworICB2b2lkIGFkZENvbXBsZXhBZGRyZXNzKERiZ1ZhcmlhYmxlIComRFYsIERJRSAqRGllLCB1bnNpZ25lZCBBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUxvY2F0aW9uICZMb2NhdGlvbik7CisKKyAgLy8gRklYTUU6IFNob3VsZCBiZSByZWZvcm11bGF0ZWQgaW4gdGVybXMgb2YgYWRkQ29tcGxleEFkZHJlc3MuCisgIC8vLyBhZGRCbG9ja0J5cmVmQWRkcmVzcyAtIFN0YXJ0IHdpdGggdGhlIGFkZHJlc3MgYmFzZWQgb24gdGhlIGxvY2F0aW9uCisgIC8vLyBwcm92aWRlZCwgYW5kIGdlbmVyYXRlIHRoZSBEV0FSRiBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gZmluZCB0aGUKKyAgLy8vIGFjdHVhbCBCbG9jayB2YXJpYWJsZSAobmF2aWdhdGluZyB0aGUgQmxvY2sgc3RydWN0KSBiYXNlZCBvbiB0aGUKKyAgLy8vIHN0YXJ0aW5nIGxvY2F0aW9uLiAgQWRkIHRoZSBEV0FSRiBpbmZvcm1hdGlvbiB0byB0aGUgZGllLiAgT2Jzb2xldGUsCisgIC8vLyBwbGVhc2UgdXNlIGFkZENvbXBsZXhBZGRyZXNzIGluc3RlYWQuCisgIC8vLworICB2b2lkIGFkZEJsb2NrQnlyZWZBZGRyZXNzKERiZ1ZhcmlhYmxlIComRFYsIERJRSAqRGllLCB1bnNpZ25lZCBBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUxvY2F0aW9uICZMb2NhdGlvbik7CisKKyAgLy8vIGFkZFZhcmlhYmxlQWRkcmVzcyAtIEFkZCBEV19BVF9sb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIGEgRGJnVmFyaWFibGUuCisgIHZvaWQgYWRkVmFyaWFibGVBZGRyZXNzKERiZ1ZhcmlhYmxlIComRFYsIERJRSAqRGllLCB1bnNpZ25lZCBBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVMb2NhdGlvbiAmTG9jYXRpb24pOworCisgIC8vLyBhZGRUb0NvbnRleHRPd25lciAtIEFkZCBEaWUgaW50byB0aGUgbGlzdCBvZiBpdHMgY29udGV4dCBvd25lcidzIGNoaWxkcmVuLgorICB2b2lkIGFkZFRvQ29udGV4dE93bmVyKERJRSAqRGllLCBESURlc2NyaXB0b3IgQ29udGV4dCk7CisKKyAgLy8vIGFkZFR5cGUgLSBBZGQgYSBuZXcgdHlwZSBhdHRyaWJ1dGUgdG8gdGhlIHNwZWNpZmllZCBlbnRpdHkuCisgIHZvaWQgYWRkVHlwZShESUUgKkVudGl0eSwgRElUeXBlIFR5KTsKKworIAorICAvLy8gZ2V0T3JDcmVhdGVOYW1lU3BhY2UgLSBDcmVhdGUgYSBESUUgZm9yIERJTmFtZVNwYWNlLgorICBESUUgKmdldE9yQ3JlYXRlTmFtZVNwYWNlKERJTmFtZVNwYWNlIE5TKTsKKworICAvLy8gZ2V0T3JDcmVhdGVUeXBlRElFIC0gRmluZCBleGlzdGluZyBESUUgb3IgY3JlYXRlIG5ldyBESUUgZm9yIHRoZQorICAvLy8gZ2l2ZW4gRElUeXBlLgorICBESUUgKmdldE9yQ3JlYXRlVHlwZURJRShESVR5cGUgVHkpOworCisgIHZvaWQgYWRkUHViVHlwZXMoRElTdWJwcm9ncmFtIFNQKTsKKworICAvLy8gY29uc3RydWN0VHlwZURJRSAtIENvbnN0cnVjdCBiYXNpYyB0eXBlIGRpZSBmcm9tIERJQmFzaWNUeXBlLgorICB2b2lkIGNvbnN0cnVjdFR5cGVESUUoRElFICZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBESUJhc2ljVHlwZSBCVHkpOworCisgIC8vLyBjb25zdHJ1Y3RUeXBlRElFIC0gQ29uc3RydWN0IGRlcml2ZWQgdHlwZSBkaWUgZnJvbSBESURlcml2ZWRUeXBlLgorICB2b2lkIGNvbnN0cnVjdFR5cGVESUUoRElFICZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBESURlcml2ZWRUeXBlIERUeSk7CisKKyAgLy8vIGNvbnN0cnVjdFR5cGVESUUgLSBDb25zdHJ1Y3QgdHlwZSBESUUgZnJvbSBESUNvbXBvc2l0ZVR5cGUuCisgIHZvaWQgY29uc3RydWN0VHlwZURJRShESUUgJkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ29tcG9zaXRlVHlwZSBDVHkpOworCisgIC8vLyBjb25zdHJ1Y3RTdWJyYW5nZURJRSAtIENvbnN0cnVjdCBzdWJyYW5nZSBESUUgZnJvbSBESVN1YnJhbmdlLgorICB2b2lkIGNvbnN0cnVjdFN1YnJhbmdlRElFKERJRSAmQnVmZmVyLCBESVN1YnJhbmdlIFNSLCBESUUgKkluZGV4VHkpOworCisgIC8vLyBjb25zdHJ1Y3RBcnJheVR5cGVESUUgLSBDb25zdHJ1Y3QgYXJyYXkgdHlwZSBESUUgZnJvbSBESUNvbXBvc2l0ZVR5cGUuCisgIHZvaWQgY29uc3RydWN0QXJyYXlUeXBlRElFKERJRSAmQnVmZmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElDb21wb3NpdGVUeXBlICpDVHkpOworCisgIC8vLyBjb25zdHJ1Y3RFbnVtVHlwZURJRSAtIENvbnN0cnVjdCBlbnVtIHR5cGUgRElFIGZyb20gRElFbnVtZXJhdG9yLgorICBESUUgKmNvbnN0cnVjdEVudW1UeXBlRElFKERJRW51bWVyYXRvciBFVHkpOworCisgIC8vLyBjcmVhdGVNZW1iZXJESUUgLSBDcmVhdGUgbmV3IG1lbWJlciBESUUuCisgIERJRSAqY3JlYXRlTWVtYmVyRElFKERJRGVyaXZlZFR5cGUgRFQpOworCisgIC8vLyBjcmVhdGVTdWJwcm9ncmFtRElFIC0gQ3JlYXRlIG5ldyBESUUgdXNpbmcgU1AuCisgIERJRSAqY3JlYXRlU3VicHJvZ3JhbURJRShESVN1YnByb2dyYW0gU1AsIGJvb2wgTWFrZURlY2wgPSBmYWxzZSk7CisKKyAgLy8vIGdldE9yQ3JlYXRlRGJnU2NvcGUgLSBDcmVhdGUgRGJnU2NvcGUgZm9yIHRoZSBzY29wZS4KKyAgRGJnU2NvcGUgKmdldE9yQ3JlYXRlRGJnU2NvcGUoY29uc3QgTUROb2RlICpTY29wZSwgY29uc3QgTUROb2RlICpJbmxpbmVkQXQpOworCisgIERiZ1Njb3BlICpnZXRPckNyZWF0ZUFic3RyYWN0U2NvcGUoY29uc3QgTUROb2RlICpOKTsKKworICAvLy8gZmluZEFic3RyYWN0VmFyaWFibGUgLSBGaW5kIGFic3RyYWN0IHZhcmlhYmxlIGFzc29jaWF0ZWQgd2l0aCBWYXIuCisgIERiZ1ZhcmlhYmxlICpmaW5kQWJzdHJhY3RWYXJpYWJsZShESVZhcmlhYmxlICZWYXIsIERlYnVnTG9jIExvYyk7CisKKyAgLy8vIHVwZGF0ZVN1YnByb2dyYW1TY29wZURJRSAtIEZpbmQgRElFIGZvciB0aGUgZ2l2ZW4gc3VicHJvZ3JhbSBhbmQgCisgIC8vLyBhdHRhY2ggYXBwcm9wcmlhdGUgRFdfQVRfbG93X3BjIGFuZCBEV19BVF9oaWdoX3BjIGF0dHJpYnV0ZXMuCisgIC8vLyBJZiB0aGVyZSBhcmUgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGlzIHNjb3BlIHRoZW4gY3JlYXRlIGFuZCBpbnNlcnQKKyAgLy8vIERJRXMgZm9yIHRoZXNlIHZhcmlhYmxlcy4KKyAgRElFICp1cGRhdGVTdWJwcm9ncmFtU2NvcGVESUUoY29uc3QgTUROb2RlICpTUE5vZGUpOworCisgIC8vLyBjb25zdHJ1Y3RMZXhpY2FsU2NvcGUgLSBDb25zdHJ1Y3QgbmV3IERXX1RBR19sZXhpY2FsX2Jsb2NrIAorICAvLy8gZm9yIHRoaXMgc2NvcGUgYW5kIGF0dGFjaCBEV19BVF9sb3dfcGMvRFdfQVRfaGlnaF9wYyBsYWJlbHMuCisgIERJRSAqY29uc3RydWN0TGV4aWNhbFNjb3BlRElFKERiZ1Njb3BlICpTY29wZSk7CisKKyAgLy8vIGNvbnN0cnVjdElubGluZWRTY29wZURJRSAtIFRoaXMgc2NvcGUgcmVwcmVzZW50cyBpbmxpbmVkIGJvZHkgb2YKKyAgLy8vIGEgZnVuY3Rpb24uIENvbnN0cnVjdCBESUUgdG8gcmVwcmVzZW50IHRoaXMgY29uY3JldGUgaW5saW5lZCBjb3B5CisgIC8vLyBvZiB0aGUgZnVuY3Rpb24uCisgIERJRSAqY29uc3RydWN0SW5saW5lZFNjb3BlRElFKERiZ1Njb3BlICpTY29wZSk7CisKKyAgLy8vIGNvbnN0cnVjdFZhcmlhYmxlRElFIC0gQ29uc3RydWN0IGEgRElFIGZvciB0aGUgZ2l2ZW4gRGJnVmFyaWFibGUuCisgIERJRSAqY29uc3RydWN0VmFyaWFibGVESUUoRGJnVmFyaWFibGUgKkRWLCBEYmdTY29wZSAqUyk7CisKKyAgLy8vIGNvbnN0cnVjdFNjb3BlRElFIC0gQ29uc3RydWN0IGEgRElFIGZvciB0aGlzIHNjb3BlLgorICBESUUgKmNvbnN0cnVjdFNjb3BlRElFKERiZ1Njb3BlICpTY29wZSk7CisKKyAgLy8vIEVtaXRTZWN0aW9uTGFiZWxzIC0gRW1pdCBpbml0aWFsIER3YXJmIHNlY3Rpb25zIHdpdGggYSBsYWJlbCBhdAorICAvLy8gdGhlIHN0YXJ0IG9mIGVhY2ggb25lLgorICB2b2lkIEVtaXRTZWN0aW9uTGFiZWxzKCk7CisKKyAgLy8vIGVtaXRESUUgLSBSZWN1c2l2ZWx5IEVtaXRzIGEgZGVidWcgaW5mb3JtYXRpb24gZW50cnkuCisgIC8vLworICB2b2lkIGVtaXRESUUoRElFICpEaWUpOworCisgIC8vLyBjb21wdXRlU2l6ZUFuZE9mZnNldCAtIENvbXB1dGUgdGhlIHNpemUgYW5kIG9mZnNldCBvZiBhIERJRS4KKyAgLy8vCisgIHVuc2lnbmVkIGNvbXB1dGVTaXplQW5kT2Zmc2V0KERJRSAqRGllLCB1bnNpZ25lZCBPZmZzZXQsIGJvb2wgTGFzdCk7CisKKyAgLy8vIGNvbXB1dGVTaXplQW5kT2Zmc2V0cyAtIENvbXB1dGUgdGhlIHNpemUgYW5kIG9mZnNldCBvZiBhbGwgdGhlIERJRXMuCisgIC8vLworICB2b2lkIGNvbXB1dGVTaXplQW5kT2Zmc2V0cygpOworCisgIC8vLyBFbWl0RGVidWdJbmZvIC0gRW1pdCB0aGUgZGVidWcgaW5mbyBzZWN0aW9uLgorICAvLy8KKyAgdm9pZCBlbWl0RGVidWdJbmZvKCk7CisKKyAgLy8vIGVtaXRBYmJyZXZpYXRpb25zIC0gRW1pdCB0aGUgYWJicmV2aWF0aW9uIHNlY3Rpb24uCisgIC8vLworICB2b2lkIGVtaXRBYmJyZXZpYXRpb25zKCkgY29uc3Q7CisKKyAgLy8vIGVtaXRFbmRPZkxpbmVNYXRyaXggLSBFbWl0IHRoZSBsYXN0IGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gYW5kIHRoZSBlbmQgb2YKKyAgLy8vIHRoZSBsaW5lIG1hdHJpeC4KKyAgLy8vCisgIHZvaWQgZW1pdEVuZE9mTGluZU1hdHJpeCh1bnNpZ25lZCBTZWN0aW9uRW5kKTsKKworICAvLy8gZW1pdERlYnVnTGluZXMgLSBFbWl0IHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uLgorICAvLy8KKyAgdm9pZCBlbWl0RGVidWdMaW5lcygpOworCisgIC8vLyBlbWl0Q29tbW9uRGVidWdGcmFtZSAtIEVtaXQgY29tbW9uIGZyYW1lIGluZm8gaW50byBhIGRlYnVnIGZyYW1lIHNlY3Rpb24uCisgIC8vLworICB2b2lkIGVtaXRDb21tb25EZWJ1Z0ZyYW1lKCk7CisKKyAgLy8vIGVtaXRGdW5jdGlvbkRlYnVnRnJhbWUgLSBFbWl0IHBlciBmdW5jdGlvbiBmcmFtZSBpbmZvIGludG8gYSBkZWJ1ZyBmcmFtZQorICAvLy8gc2VjdGlvbi4KKyAgdm9pZCBlbWl0RnVuY3Rpb25EZWJ1Z0ZyYW1lKGNvbnN0IEZ1bmN0aW9uRGVidWdGcmFtZUluZm8gJkRlYnVnRnJhbWVJbmZvKTsKKworICAvLy8gZW1pdERlYnVnUHViTmFtZXMgLSBFbWl0IHZpc2libGUgbmFtZXMgaW50byBhIGRlYnVnIHB1Ym5hbWVzIHNlY3Rpb24uCisgIC8vLworICB2b2lkIGVtaXREZWJ1Z1B1Yk5hbWVzKCk7CisKKyAgLy8vIGVtaXREZWJ1Z1B1YlR5cGVzIC0gRW1pdCB2aXNpYmxlIHR5cGVzIGludG8gYSBkZWJ1ZyBwdWJ0eXBlcyBzZWN0aW9uLgorICAvLy8KKyAgdm9pZCBlbWl0RGVidWdQdWJUeXBlcygpOworCisgIC8vLyBlbWl0RGVidWdTdHIgLSBFbWl0IHZpc2libGUgbmFtZXMgaW50byBhIGRlYnVnIHN0ciBzZWN0aW9uLgorICAvLy8KKyAgdm9pZCBlbWl0RGVidWdTdHIoKTsKKworICAvLy8gZW1pdERlYnVnTG9jIC0gRW1pdCB2aXNpYmxlIG5hbWVzIGludG8gYSBkZWJ1ZyBsb2Mgc2VjdGlvbi4KKyAgLy8vCisgIHZvaWQgZW1pdERlYnVnTG9jKCk7CisKKyAgLy8vIEVtaXREZWJ1Z0FSYW5nZXMgLSBFbWl0IHZpc2libGUgbmFtZXMgaW50byBhIGRlYnVnIGFyYW5nZXMgc2VjdGlvbi4KKyAgLy8vCisgIHZvaWQgRW1pdERlYnVnQVJhbmdlcygpOworCisgIC8vLyBlbWl0RGVidWdSYW5nZXMgLSBFbWl0IHZpc2libGUgbmFtZXMgaW50byBhIGRlYnVnIHJhbmdlcyBzZWN0aW9uLgorICAvLy8KKyAgdm9pZCBlbWl0RGVidWdSYW5nZXMoKTsKKworICAvLy8gZW1pdERlYnVnTWFjSW5mbyAtIEVtaXQgdmlzaWJsZSBuYW1lcyBpbnRvIGEgZGVidWcgbWFjaW5mbyBzZWN0aW9uLgorICAvLy8KKyAgdm9pZCBlbWl0RGVidWdNYWNJbmZvKCk7CisKKyAgLy8vIGVtaXREZWJ1Z0lubGluZUluZm8gLSBFbWl0IGlubGluZSBpbmZvIHVzaW5nIGZvbGxvd2luZyBmb3JtYXQuCisgIC8vLyBTZWN0aW9uIEhlYWRlcjoKKyAgLy8vIDEuIGxlbmd0aCBvZiBzZWN0aW9uCisgIC8vLyAyLiBEd2FyZiB2ZXJzaW9uIG51bWJlcgorICAvLy8gMy4gYWRkcmVzcyBzaXplLgorICAvLy8KKyAgLy8vIEVudHJpZXMgKG9uZSAiZW50cnkiIGZvciBlYWNoIGZ1bmN0aW9uIHRoYXQgd2FzIGlubGluZWQpOgorICAvLy8KKyAgLy8vIDEuIG9mZnNldCBpbnRvIF9fZGVidWdfc3RyIHNlY3Rpb24gZm9yIE1JUFMgbGlua2FnZSBuYW1lLCBpZiBleGlzdHM7IAorICAvLy8gICBvdGhlcndpc2Ugb2Zmc2V0IGludG8gX19kZWJ1Z19zdHIgZm9yIHJlZ3VsYXIgZnVuY3Rpb24gbmFtZS4KKyAgLy8vIDIuIG9mZnNldCBpbnRvIF9fZGVidWdfc3RyIHNlY3Rpb24gZm9yIHJlZ3VsYXIgZnVuY3Rpb24gbmFtZS4KKyAgLy8vIDMuIGFuIHVuc2lnbmVkIExFQjEyOCBudW1iZXIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGlubGluaW5nIAorICAvLy8gaW5zdGFuY2VzIGZvciB0aGUgZnVuY3Rpb24uCisgIC8vLyAKKyAgLy8vIFRoZSByZXN0IG9mIHRoZSBlbnRyeSBjb25zaXN0cyBvZiBhIHtkaWVfb2Zmc2V0LCBsb3dfcGN9ICBwYWlyIGZvciBlYWNoIAorICAvLy8gaW5saW5lZCBpbnN0YW5jZTsgdGhlIGRpZV9vZmZzZXQgcG9pbnRzIHRvIHRoZSBpbmxpbmVkX3N1YnJvdXRpbmUgZGllIGluCisgIC8vLyB0aGUgX19kZWJ1Z19pbmZvIHNlY3Rpb24sIGFuZCB0aGUgbG93X3BjIGlzIHRoZSBzdGFydGluZyBhZGRyZXNzICBmb3IgdGhlCisgIC8vLyAgaW5saW5pbmcgaW5zdGFuY2UuCisgIHZvaWQgZW1pdERlYnVnSW5saW5lSW5mbygpOworCisgIC8vLyBHZXRPckNyZWF0ZVNvdXJjZUlEIC0gTG9vayB1cCB0aGUgc291cmNlIGlkIHdpdGggdGhlIGdpdmVuIGRpcmVjdG9yeSBhbmQKKyAgLy8vIHNvdXJjZSBmaWxlIG5hbWVzLiBJZiBub25lIGN1cnJlbnRseSBleGlzdHMsIGNyZWF0ZSBhIG5ldyBpZCBhbmQgaW5zZXJ0IGl0CisgIC8vLyBpbiB0aGUgU291cmNlSWRzIG1hcC4gVGhpcyBjYW4gdXBkYXRlIERpcmVjdG9yeU5hbWVzIGFuZCBTb3VyY2VGaWxlTmFtZXMKKyAgLy8vIG1hcHMgYXMgd2VsbC4KKyAgdW5zaWduZWQgR2V0T3JDcmVhdGVTb3VyY2VJRChTdHJpbmdSZWYgRGlyTmFtZSwgU3RyaW5nUmVmIEZpbGVOYW1lKTsKKworICAvLy8gY29uc3RydWN0Q29tcGlsZVVuaXQgLSBDcmVhdGUgbmV3IENvbXBpbGVVbml0IGZvciB0aGUgZ2l2ZW4gCisgIC8vLyBtZXRhZGF0YSBub2RlIHdpdGggdGFnIERXX1RBR19jb21waWxlX3VuaXQuCisgIHZvaWQgY29uc3RydWN0Q29tcGlsZVVuaXQoY29uc3QgTUROb2RlICpOKTsKKworICAvLy8gZ2V0Q29tcGllbFVuaXQgLSBHZXQgQ29tcGlsZVVuaXQgRElFLgorICBDb21waWxlVW5pdCAqZ2V0Q29tcGlsZVVuaXQoY29uc3QgTUROb2RlICpOKSBjb25zdDsKKworICAvLy8gY29uc3RydWN0R2xvYmFsVmFyaWFibGVESUUgLSBDb25zdHJ1Y3QgZ2xvYmFsIHZhcmlhYmxlIERJRS4KKyAgdm9pZCBjb25zdHJ1Y3RHbG9iYWxWYXJpYWJsZURJRShjb25zdCBNRE5vZGUgKk4pOworCisgIC8vLyBjb25zdHJ1Y3QgU3VicHJvZ3JhbURJRSAtIENvbnN0cnVjdCBzdWJwcm9ncmFtIERJRS4KKyAgdm9pZCBjb25zdHJ1Y3RTdWJwcm9ncmFtRElFKGNvbnN0IE1ETm9kZSAqTik7CisKKyAgLy8vIHJlY29yZFNvdXJjZUxpbmUgLSBSZWdpc3RlciBhIHNvdXJjZSBsaW5lIHdpdGggZGVidWcgaW5mby4gUmV0dXJucyB0aGUKKyAgLy8vIHVuaXF1ZSBsYWJlbCB0aGF0IHdhcyBlbWl0dGVkIGFuZCB3aGljaCBwcm92aWRlcyBjb3JyZXNwb25kZW5jZSB0bworICAvLy8gdGhlIHNvdXJjZSBsaW5lIGxpc3QuCisgIE1DU3ltYm9sICpyZWNvcmRTb3VyY2VMaW5lKHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbCwgY29uc3QgTUROb2RlICpTY29wZSk7CisgIAorICAvLy8gZ2V0U291cmNlTGluZUNvdW50IC0gUmV0dXJuIHRoZSBudW1iZXIgb2Ygc291cmNlIGxpbmVzIGluIHRoZSBkZWJ1ZworICAvLy8gaW5mby4KKyAgdW5zaWduZWQgZ2V0U291cmNlTGluZUNvdW50KCkgY29uc3QgeworICAgIHJldHVybiBMaW5lcy5zaXplKCk7CisgIH0KKyAgCisgIC8vLyByZWNvcmRWYXJpYWJsZUZyYW1lSW5kZXggLSBSZWNvcmQgYSB2YXJpYWJsZSdzIGluZGV4LgorICB2b2lkIHJlY29yZFZhcmlhYmxlRnJhbWVJbmRleChjb25zdCBEYmdWYXJpYWJsZSAqViwgaW50IEluZGV4KTsKKworICAvLy8gZmluZFZhcmlhYmxlRnJhbWVJbmRleCAtIFJldHVybiB0cnVlIGlmIGZyYW1lIGluZGV4IGZvciB0aGUgdmFyaWFibGUKKyAgLy8vIGlzIGZvdW5kLiBVcGRhdGUgRkkgdG8gaG9sZCB2YWx1ZSBvZiB0aGUgaW5kZXguCisgIGJvb2wgZmluZFZhcmlhYmxlRnJhbWVJbmRleChjb25zdCBEYmdWYXJpYWJsZSAqViwgaW50ICpGSSk7CisKKyAgLy8vIGZpbmRWYXJpYWJsZUxhYmVsIC0gRmluZCBNQ1N5bWJvbCBmb3IgdGhlIHZhcmlhYmxlLgorICBjb25zdCBNQ1N5bWJvbCAqZmluZFZhcmlhYmxlTGFiZWwoY29uc3QgRGJnVmFyaWFibGUgKlYpOworCisgIC8vLyBmaW5kRGJnU2NvcGUgLSBGaW5kIERiZ1Njb3BlIGZvciB0aGUgZGVidWcgbG9jIGF0dGFjaGVkIHdpdGggYW4gCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgRGJnU2NvcGUgKmZpbmREYmdTY29wZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JKTsKKworICAvLy8gaWRlbnRpZnlTY29wZU1hcmtlcnMoKSAtIEluZGVudGlmeSBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgbWFya2luZworICAvLy8gYmVnaW5uaW5nIG9mIG9yIGVuZCBvZiBhIHNjb3BlLgorICB2b2lkIGlkZW50aWZ5U2NvcGVNYXJrZXJzKCk7CisKKyAgLy8vIGV4dHJhY3RTY29wZUluZm9ybWF0aW9uIC0gU2NhbiBtYWNoaW5lIGluc3RydWN0aW9ucyBpbiB0aGlzIGZ1bmN0aW9uCisgIC8vLyBhbmQgY29sbGVjdCBEYmdTY29wZXMuIFJldHVybiB0cnVlLCBpZiBhdGxlYXN0IG9uZSBzY29wZSB3YXMgZm91bmQuCisgIGJvb2wgZXh0cmFjdFNjb3BlSW5mb3JtYXRpb24oKTsKKyAgCisgIC8vLyBjb2xsZWN0VmFyaWFibGVJbmZvIC0gUG9wdWxhdGUgRGJnU2NvcGUgZW50cmllcyB3aXRoIHZhcmlhYmxlcycgaW5mby4KKyAgdm9pZCBjb2xsZWN0VmFyaWFibGVJbmZvKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgTUROb2RlICosIDE2PiAmUHJvY2Vzc2VkVmFycyk7CisgIAorICAvLy8gY29sbGVjdFZhcmlhYmxlSW5mb0Zyb21NTUlUYWJsZSAtIENvbGxlY3QgdmFyaWFibGUgaW5mb3JtYXRpb24gZnJvbQorICAvLy8gc2lkZSB0YWJsZSBtYWludGFpbmVkIGJ5IE1NSS4KKyAgdm9pZCBjb2xsZWN0VmFyaWFibGVJbmZvRnJvbU1NSVRhYmxlKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqIE1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgTUROb2RlICosIDE2PiAmUCk7CitwdWJsaWM6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNYWluIGVudHJ5IHBvaW50cy4KKyAgLy8KKyAgRHdhcmZEZWJ1ZyhBc21QcmludGVyICpBLCBNb2R1bGUgKk0pOworICB+RHdhcmZEZWJ1ZygpOworCisgIC8vLyBiZWdpbk1vZHVsZSAtIEVtaXQgYWxsIER3YXJmIHNlY3Rpb25zIHRoYXQgc2hvdWxkIGNvbWUgcHJpb3IgdG8gdGhlCisgIC8vLyBjb250ZW50LgorICB2b2lkIGJlZ2luTW9kdWxlKE1vZHVsZSAqTSk7CisKKyAgLy8vIGVuZE1vZHVsZSAtIEVtaXQgYWxsIER3YXJmIHNlY3Rpb25zIHRoYXQgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhlIGNvbnRlbnQuCisgIC8vLworICB2b2lkIGVuZE1vZHVsZSgpOworCisgIC8vLyBiZWdpbkZ1bmN0aW9uIC0gR2F0aGVyIHByZS1mdW5jdGlvbiBkZWJ1ZyBpbmZvcm1hdGlvbi4gIEFzc3VtZXMgYmVpbmcKKyAgLy8vIGVtaXR0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGVudHJ5IHBvaW50LgorICB2b2lkIGJlZ2luRnVuY3Rpb24oY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRik7CisKKyAgLy8vIGVuZEZ1bmN0aW9uIC0gR2F0aGVyIGFuZCBlbWl0IHBvc3QtZnVuY3Rpb24gZGVidWcgaW5mb3JtYXRpb24uCisgIC8vLworICB2b2lkIGVuZEZ1bmN0aW9uKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYpOworCisgIC8vLyBnZXRMYWJlbEJlZm9yZUluc24gLSBSZXR1cm4gTGFiZWwgcHJlY2VkaW5nIHRoZSBpbnN0cnVjdGlvbi4KKyAgY29uc3QgTUNTeW1ib2wgKmdldExhYmVsQmVmb3JlSW5zbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKTsKKworICAvLy8gZ2V0TGFiZWxBZnRlckluc24gLSBSZXR1cm4gTGFiZWwgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbi4KKyAgY29uc3QgTUNTeW1ib2wgKmdldExhYmVsQWZ0ZXJJbnNuKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworCisgIC8vLyBiZWdpblNjb3BlIC0gUHJvY2VzcyBiZWdpbm5pbmcgb2YgYSBzY29wZS4KKyAgdm9pZCBiZWdpblNjb3BlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworCisgIC8vLyBlbmRTY29wZSAtIFByY2VzcyBlbmQgb2YgYSBzY29wZS4KKyAgdm9pZCBlbmRTY29wZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JKTsKK307Cit9IC8vIEVuZCBvZiBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FzbVByaW50ZXIvRHdhcmZFeGNlcHRpb24uaCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FzbVByaW50ZXIvRHdhcmZFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGEzMDVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vQXNtUHJpbnRlci9Ed2FyZkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMTcxIEBACisvLz09PS0tIER3YXJmRXhjZXB0aW9uLmggLSBEd2FyZiBFeGNlcHRpb24gRnJhbWV3b3JrIC0tLS0tLS0tLS0tKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0IGZvciB3cml0aW5nIGR3YXJmIGV4Y2VwdGlvbiBpbmZvIGludG8gYXNtIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0FTTVBSSU5URVJfRFdBUkZFWENFUFRJT05fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fQVNNUFJJTlRFUl9EV0FSRkVYQ0VQVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworc3RydWN0IExhbmRpbmdQYWRJbmZvOworY2xhc3MgTWFjaGluZU1vZHVsZUluZm87CitjbGFzcyBNYWNoaW5lTW92ZTsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBBc21QcmludGVyOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIER3YXJmRXhjZXB0aW9uIC0gRW1pdHMgRHdhcmYgZXhjZXB0aW9uIGhhbmRsaW5nIGRpcmVjdGl2ZXMuCisvLy8KK2NsYXNzIER3YXJmRXhjZXB0aW9uIHsKKyAgLy8vIEFzbSAtIFRhcmdldCBvZiBEd2FyZiBlbWlzc2lvbi4KKyAgQXNtUHJpbnRlciAqQXNtOworCisgIC8vLyBNTUkgLSBDb2xsZWN0ZWQgbWFjaGluZSBtb2R1bGUgaW5mb3JtYXRpb24uCisgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUk7CisKKyAgc3RydWN0IEZ1bmN0aW9uRUhGcmFtZUluZm8geworICAgIE1DU3ltYm9sICpGdW5jdGlvbkVIU3ltOyAgLy8gTF9mb28uZWgKKyAgICB1bnNpZ25lZCBOdW1iZXI7CisgICAgdW5zaWduZWQgUGVyc29uYWxpdHlJbmRleDsKKyAgICBib29sIGFkanVzdHNTdGFjazsKKyAgICBib29sIGhhc0xhbmRpbmdQYWRzOworICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVNb3ZlPiBNb3ZlczsKKyAgICBjb25zdCBGdW5jdGlvbiAqZnVuY3Rpb247CisKKyAgICBGdW5jdGlvbkVIRnJhbWVJbmZvKE1DU3ltYm9sICpFSFN5bSwgdW5zaWduZWQgTnVtLCB1bnNpZ25lZCBQLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoQywgYm9vbCBoTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVNb3ZlPiAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICpmKToKKyAgICAgIEZ1bmN0aW9uRUhTeW0oRUhTeW0pLCBOdW1iZXIoTnVtKSwgUGVyc29uYWxpdHlJbmRleChQKSwKKyAgICAgIGFkanVzdHNTdGFjayhoQyksIGhhc0xhbmRpbmdQYWRzKGhMKSwgTW92ZXMoTSksIGZ1bmN0aW9uIChmKSB7IH0KKyAgfTsKKworICBzdGQ6OnZlY3RvcjxGdW5jdGlvbkVIRnJhbWVJbmZvPiBFSEZyYW1lczsKKworICAvLy8gVXNlc0xTREEgLSBJbmRpY2F0ZXMgd2hldGhlciBhbiBGREUgdGhhdCB1c2VzIHRoZSBDSUUgYXQgdGhlIGdpdmVuIGluZGV4CisgIC8vLyB1c2VzIGFuIExTREEuIElmIHNvLCB0aGVuIHdlIG5lZWQgdG8gZW5jb2RlIHRoYXQgaW5mb3JtYXRpb24gaW4gdGhlIENJRSdzCisgIC8vLyBhdWdtZW50YXRpb24uCisgIERlbnNlTWFwPHVuc2lnbmVkLCBib29sPiBVc2VzTFNEQTsKKworICAvLy8gc2hvdWxkRW1pdFRhYmxlIC0gUGVyLWZ1bmN0aW9uIGZsYWcgdG8gaW5kaWNhdGUgaWYgRUggdGFibGVzIHNob3VsZAorICAvLy8gYmUgZW1pdHRlZC4KKyAgYm9vbCBzaG91bGRFbWl0VGFibGU7CisKKyAgLy8vIHNob3VsZEVtaXRNb3ZlcyAtIFBlci1mdW5jdGlvbiBmbGFnIHRvIGluZGljYXRlIGlmIGZyYW1lIG1vdmVzIGluZm8KKyAgLy8vIHNob3VsZCBiZSBlbWl0dGVkLgorICBib29sIHNob3VsZEVtaXRNb3ZlczsKKworICAvLy8gc2hvdWxkRW1pdFRhYmxlTW9kdWxlIC0gUGVyLW1vZHVsZSBmbGFnIHRvIGluZGljYXRlIGlmIEVIIHRhYmxlcworICAvLy8gc2hvdWxkIGJlIGVtaXR0ZWQuCisgIGJvb2wgc2hvdWxkRW1pdFRhYmxlTW9kdWxlOworCisgIC8vLyBzaG91bGRFbWl0RnJhbWVNb2R1bGUgLSBQZXItbW9kdWxlIGZsYWcgdG8gaW5kaWNhdGUgaWYgZnJhbWUgbW92ZXMKKyAgLy8vIHNob3VsZCBiZSBlbWl0dGVkLgorICBib29sIHNob3VsZEVtaXRNb3Zlc01vZHVsZTsKKworICAvLy8gRW1pdENJRSAtIEVtaXQgYSBDb21tb24gSW5mb3JtYXRpb24gRW50cnkgKENJRSkuIFRoaXMgaG9sZHMgaW5mb3JtYXRpb24KKyAgLy8vIHRoYXQgaXMgc2hhcmVkIGFtb25nIG1hbnkgRnJhbWUgRGVzY3JpcHRpb24gRW50cmllcy4gIFRoZXJlIGlzIGF0IGxlYXN0CisgIC8vLyBvbmUgQ0lFIGluIGV2ZXJ5IG5vbi1lbXB0eSAuZGVidWdfZnJhbWUgc2VjdGlvbi4KKyAgdm9pZCBFbWl0Q0lFKGNvbnN0IEZ1bmN0aW9uICpQZXJzb25hbGl0eSwgdW5zaWduZWQgSW5kZXgpOworCisgIC8vLyBFbWl0RkRFIC0gRW1pdCB0aGUgRnJhbWUgRGVzY3JpcHRpb24gRW50cnkgKEZERSkgZm9yIHRoZSBmdW5jdGlvbi4KKyAgdm9pZCBFbWl0RkRFKGNvbnN0IEZ1bmN0aW9uRUhGcmFtZUluZm8gJkVIRnJhbWVJbmZvKTsKKworICAvLy8gU2hhcmVkVHlwZUlkcyAtIEhvdyBtYW55IGxlYWRpbmcgdHlwZSBpZHMgdHdvIGxhbmRpbmcgcGFkcyBoYXZlIGluIGNvbW1vbi4KKyAgc3RhdGljIHVuc2lnbmVkIFNoYXJlZFR5cGVJZHMoY29uc3QgTGFuZGluZ1BhZEluZm8gKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmRpbmdQYWRJbmZvICpSKTsKKworICAvLy8gUGFkTFQgLSBPcmRlciBsYW5kaW5nIHBhZHMgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgdHlwZSBpZC4KKyAgc3RhdGljIGJvb2wgUGFkTFQoY29uc3QgTGFuZGluZ1BhZEluZm8gKkwsIGNvbnN0IExhbmRpbmdQYWRJbmZvICpSKTsKKworICAvLy8gUGFkUmFuZ2UgLSBTdHJ1Y3R1cmUgaG9sZGluZyBhIHRyeS1yYW5nZSBhbmQgdGhlIGFzc29jaWF0ZWQgbGFuZGluZyBwYWQuCisgIHN0cnVjdCBQYWRSYW5nZSB7CisgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBsYW5kaW5nIHBhZC4KKyAgICB1bnNpZ25lZCBQYWRJbmRleDsKKyAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGJlZ2luIGFuZCBlbmQgbGFiZWxzIGluIHRoZSBsYW5kaW5nIHBhZCdzIGxhYmVsIGxpc3RzLgorICAgIHVuc2lnbmVkIFJhbmdlSW5kZXg7CisgIH07CisKKyAgdHlwZWRlZiBEZW5zZU1hcDxNQ1N5bWJvbCAqLCBQYWRSYW5nZT4gUmFuZ2VNYXBUeXBlOworCisgIC8vLyBBY3Rpb25FbnRyeSAtIFN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIGVudHJ5IGluIHRoZSBhY3Rpb25zIHRhYmxlLgorICBzdHJ1Y3QgQWN0aW9uRW50cnkgeworICAgIGludCBWYWx1ZUZvclR5cGVJRDsgLy8gVGhlIHZhbHVlIHRvIHdyaXRlIC0gbWF5IG5vdCBiZSBlcXVhbCB0byB0aGUgdHlwZSBpZC4KKyAgICBpbnQgTmV4dEFjdGlvbjsKKyAgICB1bnNpZ25lZCBQcmV2aW91czsKKyAgfTsKKworICAvLy8gQ2FsbFNpdGVFbnRyeSAtIFN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIGVudHJ5IGluIHRoZSBjYWxsLXNpdGUgdGFibGUuCisgIHN0cnVjdCBDYWxsU2l0ZUVudHJ5IHsKKyAgICAvLyBUaGUgJ3RyeS1yYW5nZScgaXMgQmVnaW5MYWJlbCAuLiBFbmRMYWJlbC4KKyAgICBNQ1N5bWJvbCAqQmVnaW5MYWJlbDsgLy8gemVybyBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKyAgICBNQ1N5bWJvbCAqRW5kTGFiZWw7ICAgLy8gemVybyBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCisKKyAgICAvLyBUaGUgbGFuZGluZyBwYWQgc3RhcnRzIGF0IFBhZExhYmVsLgorICAgIE1DU3ltYm9sICpQYWRMYWJlbDsgICAvLyB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGxhbmRpbmcgcGFkLgorICAgIHVuc2lnbmVkIEFjdGlvbjsKKyAgfTsKKworICAvLy8gQ29tcHV0ZUFjdGlvbnNUYWJsZSAtIENvbXB1dGUgdGhlIGFjdGlvbnMgdGFibGUgYW5kIGdhdGhlciB0aGUgZmlyc3QKKyAgLy8vIGFjdGlvbiBpbmRleCBmb3IgZWFjaCBsYW5kaW5nIHBhZCBzaXRlLgorICB1bnNpZ25lZCBDb21wdXRlQWN0aW9uc1RhYmxlKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjb25zdCBMYW5kaW5nUGFkSW5mbyo+JkxQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8QWN0aW9uRW50cnk+ICZBY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJkZpcnN0QWN0aW9ucyk7CisKKyAgLy8vIENhbGxUb05vVW53aW5kRnVuY3Rpb24gLSBSZXR1cm4gYHRydWUnIGlmIHRoaXMgaXMgYSBjYWxsIHRvIGEgZnVuY3Rpb24KKyAgLy8vIG1hcmtlZCBgbm91bndpbmQnLiBSZXR1cm4gYGZhbHNlJyBvdGhlcndpc2UuCisgIGJvb2wgQ2FsbFRvTm9VbndpbmRGdW5jdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKTsKKworICAvLy8gQ29tcHV0ZUNhbGxTaXRlVGFibGUgLSBDb21wdXRlIHRoZSBjYWxsLXNpdGUgdGFibGUuICBUaGUgZW50cnkgZm9yIGFuCisgIC8vLyBpbnZva2UgaGFzIGEgdHJ5LXJhbmdlIGNvbnRhaW5pbmcgdGhlIGNhbGwsIGEgbm9uLXplcm8gbGFuZGluZyBwYWQgYW5kIGFuCisgIC8vLyBhcHByb3ByaWF0ZSBhY3Rpb24uICBUaGUgZW50cnkgZm9yIGFuIG9yZGluYXJ5IGNhbGwgaGFzIGEgdHJ5LXJhbmdlCisgIC8vLyBjb250YWluaW5nIHRoZSBjYWxsIGFuZCB6ZXJvIGZvciB0aGUgbGFuZGluZyBwYWQgYW5kIHRoZSBhY3Rpb24uICBDYWxscworICAvLy8gbWFya2VkICdub3Vud2luZCcgaGF2ZSBubyBlbnRyeSBhbmQgbXVzdCBub3QgYmUgY29udGFpbmVkIGluIHRoZSB0cnktcmFuZ2UKKyAgLy8vIG9mIGFueSBlbnRyeSAtIHRoZXkgZm9ybSBnYXBzIGluIHRoZSB0YWJsZS4gIEVudHJpZXMgbXVzdCBiZSBvcmRlcmVkIGJ5CisgIC8vLyB0cnktcmFuZ2UgYWRkcmVzcy4KKyAgdm9pZCBDb21wdXRlQ2FsbFNpdGVUYWJsZShTbWFsbFZlY3RvckltcGw8Q2FsbFNpdGVFbnRyeT4gJkNhbGxTaXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYW5nZU1hcFR5cGUgJlBhZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8Y29uc3QgTGFuZGluZ1BhZEluZm8gKj4gJkxQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZGaXJzdEFjdGlvbnMpOworICB2b2lkIEVtaXRFeGNlcHRpb25UYWJsZSgpOworCitwdWJsaWM6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNYWluIGVudHJ5IHBvaW50cy4KKyAgLy8KKyAgRHdhcmZFeGNlcHRpb24oQXNtUHJpbnRlciAqQSk7CisgIH5Ed2FyZkV4Y2VwdGlvbigpOworCisgIC8vLyBFbmRNb2R1bGUgLSBFbWl0IGFsbCBleGNlcHRpb24gaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgY29tZSBhZnRlciB0aGUKKyAgLy8vIGNvbnRlbnQuCisgIHZvaWQgRW5kTW9kdWxlKCk7CisKKyAgLy8vIEJlZ2luRnVuY3Rpb24gLSBHYXRoZXIgcHJlLWZ1bmN0aW9uIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbi4gIEFzc3VtZXMgYmVpbmcKKyAgLy8vIGVtaXR0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGVudHJ5IHBvaW50LgorICB2b2lkIEJlZ2luRnVuY3Rpb24oY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRik7CisKKyAgLy8vIEVuZEZ1bmN0aW9uIC0gR2F0aGVyIGFuZCBlbWl0IHBvc3QtZnVuY3Rpb24gZXhjZXB0aW9uIGluZm9ybWF0aW9uLgorICB2b2lkIEVuZEZ1bmN0aW9uKCk7Cit9OworCit9IC8vIEVuZCBvZiBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0FzbVByaW50ZXIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Bc21QcmludGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYWE2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Bc21QcmludGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMjPT09LSBsaWIvQ29kZUdlbi9Bc21QcmludGVyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUFzbVByaW50ZXIKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0JyYW5jaEZvbGRpbmcuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vQnJhbmNoRm9sZGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmODRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0JyYW5jaEZvbGRpbmcuY3BwCkBAIC0wLDAgKzEsMTMxMCBAQAorLy89PT0tLSBCcmFuY2hGb2xkaW5nLmNwcCAtIEZvbGQgbWFjaGluZSBjb2RlIGJyYW5jaCBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgZm9yd2FyZHMgYnJhbmNoZXMgdG8gdW5jb25kaXRpb25hbCBicmFuY2hlcyB0byBtYWtlIHRoZW0gYnJhbmNoCisvLyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGJsb2NrLiAgVGhpcyBwYXNzIG9mdGVuIHJlc3VsdHMgaW4gZGVhZCBNQkIncywgd2hpY2gKKy8vIGl0IHRoZW4gcmVtb3Zlcy4KKy8vCisvLyBOb3RlIHRoYXQgdGhpcyBwYXNzIG11c3QgYmUgcnVuIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24sIGl0IGNhbm5vdCBoYW5kbGUKKy8vIFNTQSBmb3JtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYnJhbmNoZm9sZGluZyIKKyNpbmNsdWRlICJCcmFuY2hGb2xkaW5nLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtRGVhZEJsb2NrcywgIk51bWJlciBvZiBkZWFkIGJsb2NrcyByZW1vdmVkIik7CitTVEFUSVNUSUMoTnVtQnJhbmNoT3B0cywgIk51bWJlciBvZiBicmFuY2hlcyBvcHRpbWl6ZWQiKTsKK1NUQVRJU1RJQyhOdW1UYWlsTWVyZ2UgLCAiTnVtYmVyIG9mIGJsb2NrIHRhaWxzIG1lcmdlZCIpOworCitzdGF0aWMgY2w6Om9wdDxjbDo6Ym9vbE9yRGVmYXVsdD4gRmxhZ0VuYWJsZVRhaWxNZXJnZSgiZW5hYmxlLXRhaWwtbWVyZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoY2w6OkJPVV9VTlNFVCksIGNsOjpIaWRkZW4pOworCisvLyBUaHJvdHRsZSBmb3IgaHVnZSBudW1iZXJzIG9mIHByZWRlY2Vzc29ycyAoY29tcGlsZSBzcGVlZCBwcm9ibGVtcykKK3N0YXRpYyBjbDo6b3B0PHVuc2lnbmVkPgorVGFpbE1lcmdlVGhyZXNob2xkKCJ0YWlsLW1lcmdlLXRocmVzaG9sZCIsCisgICAgICAgICAgY2w6OmRlc2MoIk1heCBudW1iZXIgb2YgcHJlZGVjZXNzb3JzIHRvIGNvbnNpZGVyIHRhaWwgbWVyZ2luZyIpLAorICAgICAgICAgIGNsOjppbml0KDE1MCksIGNsOjpIaWRkZW4pOworCisvLyBIZXVyaXN0aWMgZm9yIHRhaWwgbWVyZ2luZyAoYW5kLCBpbnZlcnNlbHksIHRhaWwgZHVwbGljYXRpb24pLgorLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhIHRhcmdldCBxdWVyeS4KK3N0YXRpYyBjbDo6b3B0PHVuc2lnbmVkPgorVGFpbE1lcmdlU2l6ZSgidGFpbC1tZXJnZS1zaXplIiwKKyAgICAgICAgICBjbDo6ZGVzYygiTWluIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gY29uc2lkZXIgdGFpbCBtZXJnaW5nIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6aW5pdCgzKSwgY2w6OkhpZGRlbik7CisKK25hbWVzcGFjZSB7CisgIC8vLyBCcmFuY2hGb2xkZXJQYXNzIC0gV3JhcCBicmFuY2ggZm9sZGVyIGluIGEgbWFjaGluZSBmdW5jdGlvbiBwYXNzLgorICBjbGFzcyBCcmFuY2hGb2xkZXJQYXNzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQnJhbmNoRm9sZGVyIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworICAgIGV4cGxpY2l0IEJyYW5jaEZvbGRlclBhc3MoYm9vbCBkZWZhdWx0RW5hYmxlVGFpbE1lcmdlKQorICAgICAgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwgQnJhbmNoRm9sZGVyKGRlZmF1bHRFbmFibGVUYWlsTWVyZ2UpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJDb250cm9sIEZsb3cgT3B0aW1pemVyIjsgfQorICB9OworfQorCitjaGFyIEJyYW5jaEZvbGRlclBhc3M6OklEID0gMDsKKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVCcmFuY2hGb2xkaW5nUGFzcyhib29sIERlZmF1bHRFbmFibGVUYWlsTWVyZ2UpIHsKKyAgcmV0dXJuIG5ldyBCcmFuY2hGb2xkZXJQYXNzKERlZmF1bHRFbmFibGVUYWlsTWVyZ2UpOworfQorCitib29sIEJyYW5jaEZvbGRlclBhc3M6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgcmV0dXJuIE9wdGltaXplRnVuY3Rpb24oTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1GLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNRi5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxNYWNoaW5lTW9kdWxlSW5mbz4oKSk7Cit9CisKKworQnJhbmNoRm9sZGVyOjpCcmFuY2hGb2xkZXIoYm9vbCBkZWZhdWx0RW5hYmxlVGFpbE1lcmdlKSB7CisgIHN3aXRjaCAoRmxhZ0VuYWJsZVRhaWxNZXJnZSkgeworICBjYXNlIGNsOjpCT1VfVU5TRVQ6IEVuYWJsZVRhaWxNZXJnZSA9IGRlZmF1bHRFbmFibGVUYWlsTWVyZ2U7IGJyZWFrOworICBjYXNlIGNsOjpCT1VfVFJVRTogRW5hYmxlVGFpbE1lcmdlID0gdHJ1ZTsgYnJlYWs7CisgIGNhc2UgY2w6OkJPVV9GQUxTRTogRW5hYmxlVGFpbE1lcmdlID0gZmFsc2U7IGJyZWFrOworICB9Cit9CisKKy8vLyBSZW1vdmVEZWFkQmxvY2sgLSBSZW1vdmUgdGhlIHNwZWNpZmllZCBkZWFkIG1hY2hpbmUgYmFzaWMgYmxvY2sgZnJvbSB0aGUKKy8vLyBmdW5jdGlvbiwgdXBkYXRpbmcgdGhlIENGRy4KK3ZvaWQgQnJhbmNoRm9sZGVyOjpSZW1vdmVEZWFkQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICBhc3NlcnQoTUJCLT5wcmVkX2VtcHR5KCkgJiYgIk1CQiBtdXN0IGJlIGRlYWQhIik7CisgIERFQlVHKGRiZ3MoKSA8PCAiXG5SZW1vdmluZyBNQkI6ICIgPDwgKk1CQik7CisKKyAgTWFjaGluZUZ1bmN0aW9uICpNRiA9IE1CQi0+Z2V0UGFyZW50KCk7CisgIC8vIGRyb3AgYWxsIHN1Y2Nlc3NvcnMuCisgIHdoaWxlICghTUJCLT5zdWNjX2VtcHR5KCkpCisgICAgTUJCLT5yZW1vdmVTdWNjZXNzb3IoTUJCLT5zdWNjX2VuZCgpLTEpOworCisgIC8vIFJlbW92ZSB0aGUgYmxvY2suCisgIE1GLT5lcmFzZShNQkIpOworfQorCisvLy8gT3B0aW1pemVJbXBEZWZzQmxvY2sgLSBJZiBhIGJhc2ljIGJsb2NrIGlzIGp1c3QgYSBidW5jaCBvZiBpbXBsaWNpdF9kZWYKKy8vLyBmb2xsb3dlZCBieSB0ZXJtaW5hdG9ycywgYW5kIGlmIHRoZSBpbXBsaWNpdGx5IGRlZmluZWQgcmVnaXN0ZXJzIGFyZSBub3QKKy8vLyB1c2VkIGJ5IHRoZSB0ZXJtaW5hdG9ycywgcmVtb3ZlIHRob3NlIGltcGxpY2l0X2RlZidzLiBlLmcuCisvLy8gQkIxOgorLy8vICAgcjAgPSBpbXBsaWNpdF9kZWYKKy8vLyAgIHIxID0gaW1wbGljaXRfZGVmCisvLy8gICBicgorLy8vIFRoaXMgYmxvY2sgY2FuIGJlIG9wdGltaXplZCBhd2F5IGxhdGVyIGlmIHRoZSBpbXBsaWNpdCBpbnN0cnVjdGlvbnMgYXJlCisvLy8gcmVtb3ZlZC4KK2Jvb2wgQnJhbmNoRm9sZGVyOjpPcHRpbWl6ZUltcERlZnNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiBJbXBEZWZSZWdzOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi0+YmVnaW4oKTsKKyAgd2hpbGUgKEkgIT0gTUJCLT5lbmQoKSkgeworICAgIGlmICghSS0+aXNJbXBsaWNpdERlZigpKQorICAgICAgYnJlYWs7CisgICAgdW5zaWduZWQgUmVnID0gSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICBJbXBEZWZSZWdzLmluc2VydChSZWcpOworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YlJlZ3MgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOworICAgICAgICAgdW5zaWduZWQgU3ViUmVnID0gKlN1YlJlZ3M7ICsrU3ViUmVncykKKyAgICAgIEltcERlZlJlZ3MuaW5zZXJ0KFN1YlJlZyk7CisgICAgKytJOworICB9CisgIGlmIChJbXBEZWZSZWdzLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBGaXJzdFRlcm0gPSBJOworICB3aGlsZSAoSSAhPSBNQkItPmVuZCgpKSB7CisgICAgaWYgKCFUSUktPmlzVW5wcmVkaWNhdGVkVGVybWluYXRvcihJKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBTZWUgaWYgaXQgdXNlcyBhbnkgb2YgdGhlIGltcGxpY2l0bHkgZGVmaW5lZCByZWdpc3RlcnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc1VzZSgpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgICAgaWYgKEltcERlZlJlZ3MuY291bnQoUmVnKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICArK0k7CisgIH0KKworICBJID0gTUJCLT5iZWdpbigpOworICB3aGlsZSAoSSAhPSBGaXJzdFRlcm0pIHsKKyAgICBNYWNoaW5lSW5zdHIgKkltcERlZk1JID0gJipJOworICAgICsrSTsKKyAgICBNQkItPmVyYXNlKEltcERlZk1JKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLy8gT3B0aW1pemVGdW5jdGlvbiAtIFBlcmhhcHMgYnJhbmNoIGZvbGRpbmcsIHRhaWwgbWVyZ2luZyBhbmQgb3RoZXIKKy8vLyBDRkcgb3B0aW1pemF0aW9ucyBvbiB0aGUgZ2l2ZW4gZnVuY3Rpb24uCitib29sIEJyYW5jaEZvbGRlcjo6T3B0aW1pemVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICp0aWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKnRyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICptbWkpIHsKKyAgaWYgKCF0aWkpIHJldHVybiBmYWxzZTsKKworICBUSUkgPSB0aWk7CisgIFRSSSA9IHRyaTsKKyAgTU1JID0gbW1pOworCisgIFJTID0gVFJJLT5yZXF1aXJlc1JlZ2lzdGVyU2NhdmVuZ2luZyhNRikgPyBuZXcgUmVnU2NhdmVuZ2VyKCkgOiBOVUxMOworCisgIC8vIEZpeCBDRkcuICBUaGUgbGF0ZXIgYWxnb3JpdGhtcyBleHBlY3QgaXQgdG8gYmUgcmlnaHQuCisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsgSSAhPSBFOyBJKyspIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gSSwgKlRCQiA9IDAsICpGQkIgPSAwOworICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kLCA0PiBDb25kOworICAgIGlmICghVElJLT5BbmFseXplQnJhbmNoKCpNQkIsIFRCQiwgRkJCLCBDb25kLCB0cnVlKSkKKyAgICAgIE1hZGVDaGFuZ2UgfD0gTUJCLT5Db3JyZWN0RXh0cmFDRkdFZGdlcyhUQkIsIEZCQiwgIUNvbmQuZW1wdHkoKSk7CisgICAgTWFkZUNoYW5nZSB8PSBPcHRpbWl6ZUltcERlZnNCbG9jayhNQkIpOworICB9CisKKyAgYm9vbCBNYWRlQ2hhbmdlVGhpc0l0ZXJhdGlvbiA9IHRydWU7CisgIHdoaWxlIChNYWRlQ2hhbmdlVGhpc0l0ZXJhdGlvbikgeworICAgIE1hZGVDaGFuZ2VUaGlzSXRlcmF0aW9uID0gZmFsc2U7CisgICAgTWFkZUNoYW5nZVRoaXNJdGVyYXRpb24gfD0gVGFpbE1lcmdlQmxvY2tzKE1GKTsKKyAgICBNYWRlQ2hhbmdlVGhpc0l0ZXJhdGlvbiB8PSBPcHRpbWl6ZUJyYW5jaGVzKE1GKTsKKyAgICBNYWRlQ2hhbmdlIHw9IE1hZGVDaGFuZ2VUaGlzSXRlcmF0aW9uOworICB9CisKKyAgLy8gU2VlIGlmIGFueSBqdW1wIHRhYmxlcyBoYXZlIGJlY29tZSBkZWFkIGFzIHRoZSBjb2RlIGdlbmVyYXRvcgorICAvLyBkaWQgaXRzIHRoaW5nLgorICBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqSlRJID0gTUYuZ2V0SnVtcFRhYmxlSW5mbygpOworICBpZiAoSlRJID09IDApIHsKKyAgICBkZWxldGUgUlM7CisgICAgcmV0dXJuIE1hZGVDaGFuZ2U7CisgIH0KKyAgCisgIC8vIFdhbGsgdGhlIGZ1bmN0aW9uIHRvIGZpbmQganVtcCB0YWJsZXMgdGhhdCBhcmUgbGl2ZS4KKyAgQml0VmVjdG9yIEpUSXNMaXZlKEpUSS0+Z2V0SnVtcFRhYmxlcygpLnNpemUoKSk7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBCQiA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsKKyAgICAgICBCQiAhPSBFOyArK0JCKSB7CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBmb3IgKHVuc2lnbmVkIG9wID0gMCwgZSA9IEktPmdldE51bU9wZXJhbmRzKCk7IG9wICE9IGU7ICsrb3ApIHsKKyAgICAgICAgTWFjaGluZU9wZXJhbmQgJk9wID0gSS0+Z2V0T3BlcmFuZChvcCk7CisgICAgICAgIGlmICghT3AuaXNKVEkoKSkgY29udGludWU7CisKKyAgICAgICAgLy8gUmVtZW1iZXIgdGhhdCB0aGlzIEpUIGlzIGxpdmUuCisgICAgICAgIEpUSXNMaXZlLnNldChPcC5nZXRJbmRleCgpKTsKKyAgICAgIH0KKyAgfQorCisgIC8vIEZpbmFsbHksIHJlbW92ZSBkZWFkIGp1bXAgdGFibGVzLiAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlCisgIC8vIGluZGlyZWN0IGp1bXAgd2FzIHVucmVhY2hhYmxlIChhbmQgdGh1cyBkZWxldGVkKS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEpUSXNMaXZlLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFKVElzTGl2ZS50ZXN0KGkpKSB7CisgICAgICBKVEktPlJlbW92ZUp1bXBUYWJsZShpKTsKKyAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgIH0KKworICBkZWxldGUgUlM7CisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFRhaWwgTWVyZ2luZyBvZiBCbG9ja3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBIYXNoTWFjaGluZUluc3RyIC0gQ29tcHV0ZSBhIGhhc2ggdmFsdWUgZm9yIE1JIGFuZCBpdHMgb3BlcmFuZHMuCitzdGF0aWMgdW5zaWduZWQgSGFzaE1hY2hpbmVJbnN0cihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSB7CisgIHVuc2lnbmVkIEhhc2ggPSBNSS0+Z2V0T3Bjb2RlKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmT3AgPSBNSS0+Z2V0T3BlcmFuZChpKTsKKworICAgIC8vIE1lcmdlIGluIGJpdHMgZnJvbSB0aGUgb3BlcmFuZCBpZiBlYXN5LgorICAgIHVuc2lnbmVkIE9wZXJhbmRIYXNoID0gMDsKKyAgICBzd2l0Y2ggKE9wLmdldFR5cGUoKSkgeworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyOiAgICAgICAgICBPcGVyYW5kSGFzaCA9IE9wLmdldFJlZygpOyBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6ICAgICAgICAgT3BlcmFuZEhhc2ggPSBPcC5nZXRJbW0oKTsgYnJlYWs7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fTWFjaGluZUJhc2ljQmxvY2s6CisgICAgICBPcGVyYW5kSGFzaCA9IE9wLmdldE1CQigpLT5nZXROdW1iZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ZyYW1lSW5kZXg6CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fQ29uc3RhbnRQb29sSW5kZXg6CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgICBPcGVyYW5kSGFzaCA9IE9wLmdldEluZGV4KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOgorICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOgorICAgICAgLy8gR2xvYmFsIGFkZHJlc3MgLyBleHRlcm5hbCBzeW1ib2wgYXJlIHRvbyBoYXJkLCBkb24ndCBib3RoZXIsIGJ1dCBkbworICAgICAgLy8gcHVsbCBpbiB0aGUgb2Zmc2V0LgorICAgICAgT3BlcmFuZEhhc2ggPSBPcC5nZXRPZmZzZXQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIEhhc2ggKz0gKChPcGVyYW5kSGFzaCA8PCAzKSB8IE9wLmdldFR5cGUoKSkgPDwgKGkmMzEpOworICB9CisgIHJldHVybiBIYXNoOworfQorCisvLy8gSGFzaEVuZE9mTUJCIC0gSGFzaCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGUgTUJCLgorc3RhdGljIHVuc2lnbmVkIEhhc2hFbmRPZk1CQihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBJID0gTUJCLT5lbmQoKTsKKyAgaWYgKEkgPT0gTUJCLT5iZWdpbigpKQorICAgIHJldHVybiAwOyAgIC8vIEVtcHR5IE1CQi4KKworICAtLUk7CisgIC8vIFNraXAgZGVidWcgaW5mbyBzbyBpdCB3aWxsIG5vdCBhZmZlY3QgY29kZWdlbi4KKyAgd2hpbGUgKEktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgaWYgKEk9PU1CQi0+YmVnaW4oKSkKKyAgICAgIHJldHVybiAwOyAgICAgIC8vIE1CQiBlbXB0eSBleGNlcHQgZm9yIGRlYnVnIGluZm8uCisgICAgLS1JOworICB9CisKKyAgcmV0dXJuIEhhc2hNYWNoaW5lSW5zdHIoSSk7Cit9CisKKy8vLyBDb21wdXRlQ29tbW9uVGFpbExlbmd0aCAtIEdpdmVuIHR3byBtYWNoaW5lIGJhc2ljIGJsb2NrcywgY29tcHV0ZSB0aGUgbnVtYmVyCisvLy8gb2YgaW5zdHJ1Y3Rpb25zIHRoZXkgYWN0dWFsbHkgaGF2ZSBpbiBjb21tb24gdG9nZXRoZXIgYXQgdGhlaXIgZW5kLiAgUmV0dXJuCisvLy8gaXRlcmF0b3JzIGZvciB0aGUgZmlyc3Qgc2hhcmVkIGluc3RydWN0aW9uIGluIGVhY2ggYmxvY2suCitzdGF0aWMgdW5zaWduZWQgQ29tcHV0ZUNvbW1vblRhaWxMZW5ndGgoTWFjaGluZUJhc2ljQmxvY2sgKk1CQjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJkkyKSB7CisgIEkxID0gTUJCMS0+ZW5kKCk7CisgIEkyID0gTUJCMi0+ZW5kKCk7CisKKyAgdW5zaWduZWQgVGFpbExlbiA9IDA7CisgIHdoaWxlIChJMSAhPSBNQkIxLT5iZWdpbigpICYmIEkyICE9IE1CQjItPmJlZ2luKCkpIHsKKyAgICAtLUkxOyAtLUkyOworICAgIC8vIFNraXAgZGVidWdnaW5nIHBzZXVkb3M7IG5lY2Vzc2FyeSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgY29kZS4KKyAgICB3aGlsZSAoSTEtPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgICBpZiAoSTE9PU1CQjEtPmJlZ2luKCkpIHsKKyAgICAgICAgd2hpbGUgKEkyLT5pc0RlYnVnVmFsdWUoKSkgeworICAgICAgICAgIGlmIChJMj09TUJCMi0+YmVnaW4oKSkKKyAgICAgICAgICAgIC8vIEkxPT1EQkcgYXQgYmVnaW47IEkyPT1EQkcgYXQgYmVnaW4KKyAgICAgICAgICAgIHJldHVybiBUYWlsTGVuOworICAgICAgICAgIC0tSTI7CisgICAgICAgIH0KKyAgICAgICAgKytJMjsKKyAgICAgICAgLy8gSTE9PURCRyBhdCBiZWdpbjsgSTI9PW5vbi1EQkcsIG9yIGZpcnN0IG9mIERCR3Mgbm90IGF0IGJlZ2luCisgICAgICAgIHJldHVybiBUYWlsTGVuOworICAgICAgfQorICAgICAgLS1JMTsKKyAgICB9CisgICAgLy8gSTE9PWZpcnN0ICh1bnRlc3RlZCkgbm9uLURCRyBwcmVjZWRpbmcga25vd24gbWF0Y2gKKyAgICB3aGlsZSAoSTItPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgICBpZiAoSTI9PU1CQjItPmJlZ2luKCkpIHsKKyAgICAgICAgKytJMTsKKyAgICAgICAgLy8gSTE9PW5vbi1EQkcsIG9yIGZpcnN0IG9mIERCR3Mgbm90IGF0IGJlZ2luOyBJMj09REJHIGF0IGJlZ2luCisgICAgICAgIHJldHVybiBUYWlsTGVuOworICAgICAgfQorICAgICAgLS1JMjsKKyAgICB9CisgICAgLy8gSTEsIEkyPT1maXJzdCAodW50ZXN0ZWQpIG5vbi1EQkdzIHByZWNlZGluZyBrbm93biBtYXRjaAorICAgIGlmICghSTEtPmlzSWRlbnRpY2FsVG8oSTIpKSB7CisgICAgICArK0kxOyArK0kyOworICAgICAgYnJlYWs7CisgICAgfQorICAgICsrVGFpbExlbjsKKyAgfQorICAvLyBCYWNrIHBhc3QgcG9zc2libGUgZGVidWdnaW5nIHBzZXVkb3MgYXQgYmVnaW5uaW5nIG9mIGJsb2NrLiAgVGhpcyBtYXR0ZXJzCisgIC8vIHdoZW4gb25lIGJsb2NrIGRpZmZlcnMgZnJvbSB0aGUgb3RoZXIgb25seSBieSB3aGV0aGVyIGRlYnVnZ2luZyBwc2V1ZG9zCisgIC8vIGFyZSBwcmVzZW50IGF0IHRoZSBiZWdpbm5pbmcuICAoVGhpcyB3YXksIHRoZSB2YXJpb3VzIGNoZWNrcyBsYXRlciBmb3IKKyAgLy8gSTE9PU1CQjEtPmJlZ2luKCkgd29yayBhcyBleHBlY3RlZC4pCisgIGlmIChJMSA9PSBNQkIxLT5iZWdpbigpICYmIEkyICE9IE1CQjItPmJlZ2luKCkpIHsKKyAgICAtLUkyOworICAgIHdoaWxlIChJMi0+aXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICAgIGlmIChJMiA9PSBNQkIyLT5iZWdpbigpKSB7CisgICAgICAgIHJldHVybiBUYWlsTGVuOworICAgICAgICB9CisgICAgICAtLUkyOworICAgIH0KKyAgICArK0kyOworICB9CisgIGlmIChJMiA9PSBNQkIyLT5iZWdpbigpICYmIEkxICE9IE1CQjEtPmJlZ2luKCkpIHsKKyAgICAtLUkxOworICAgIHdoaWxlIChJMS0+aXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICAgIGlmIChJMSA9PSBNQkIxLT5iZWdpbigpKQorICAgICAgICByZXR1cm4gVGFpbExlbjsKKyAgICAgIC0tSTE7CisgICAgfQorICAgICsrSTE7CisgIH0KKyAgcmV0dXJuIFRhaWxMZW47Cit9CisKKy8vLyBSZXBsYWNlVGFpbFdpdGhCcmFuY2hUbyAtIERlbGV0ZSB0aGUgaW5zdHJ1Y3Rpb24gT2xkSW5zdCBhbmQgZXZlcnl0aGluZworLy8vIGFmdGVyIGl0LCByZXBsYWNpbmcgaXQgd2l0aCBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byBOZXdEZXN0Lgordm9pZCBCcmFuY2hGb2xkZXI6OlJlcGxhY2VUYWlsV2l0aEJyYW5jaFRvKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBPbGRJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdEZXN0KSB7CisgIFRJSS0+UmVwbGFjZVRhaWxXaXRoQnJhbmNoVG8oT2xkSW5zdCwgTmV3RGVzdCk7CisgICsrTnVtVGFpbE1lcmdlOworfQorCisvLy8gU3BsaXRNQkJBdCAtIEdpdmVuIGEgbWFjaGluZSBiYXNpYyBibG9jayBhbmQgYW4gaXRlcmF0b3IgaW50byBpdCwgc3BsaXQgdGhlCisvLy8gTUJCIHNvIHRoYXQgdGhlIHBhcnQgYmVmb3JlIHRoZSBpdGVyYXRvciBmYWxscyBpbnRvIHRoZSBwYXJ0IHN0YXJ0aW5nIGF0IHRoZQorLy8vIGl0ZXJhdG9yLiAgVGhpcyByZXR1cm5zIHRoZSBuZXcgTUJCLgorTWFjaGluZUJhc2ljQmxvY2sgKkJyYW5jaEZvbGRlcjo6U3BsaXRNQkJBdChNYWNoaW5lQmFzaWNCbG9jayAmQ3VyTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJMSkgeworICBpZiAoIVRJSS0+aXNMZWdhbFRvU3BsaXRNQkJBdChDdXJNQkIsIEJCSTEpKQorICAgIHJldHVybiAwOworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqQ3VyTUJCLmdldFBhcmVudCgpOworCisgIC8vIENyZWF0ZSB0aGUgZmFsbC10aHJvdWdoIGJsb2NrLgorICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSAmQ3VyTUJCOworICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3TUJCID1NRi5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhDdXJNQkIuZ2V0QmFzaWNCbG9jaygpKTsKKyAgQ3VyTUJCLmdldFBhcmVudCgpLT5pbnNlcnQoKytNQkJJLCBOZXdNQkIpOworCisgIC8vIE1vdmUgYWxsIHRoZSBzdWNjZXNzb3JzIG9mIHRoaXMgYmxvY2sgdG8gdGhlIHNwZWNpZmllZCBibG9jay4KKyAgTmV3TUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnMoJkN1ck1CQik7CisKKyAgLy8gQWRkIGFuIGVkZ2UgZnJvbSBDdXJNQkIgdG8gTmV3TUJCIGZvciB0aGUgZmFsbC10aHJvdWdoLgorICBDdXJNQkIuYWRkU3VjY2Vzc29yKE5ld01CQik7CisKKyAgLy8gU3BsaWNlIHRoZSBjb2RlIG92ZXIuCisgIE5ld01CQi0+c3BsaWNlKE5ld01CQi0+ZW5kKCksICZDdXJNQkIsIEJCSTEsIEN1ck1CQi5lbmQoKSk7CisKKyAgLy8gRm9yIHRhcmdldHMgdGhhdCB1c2UgdGhlIHJlZ2lzdGVyIHNjYXZlbmdlciwgd2UgbXVzdCBtYWludGFpbiBMaXZlSW5zLgorICBpZiAoUlMpIHsKKyAgICBSUy0+ZW50ZXJCYXNpY0Jsb2NrKCZDdXJNQkIpOworICAgIGlmICghQ3VyTUJCLmVtcHR5KCkpCisgICAgICBSUy0+Zm9yd2FyZChwcmlvcihDdXJNQkIuZW5kKCkpKTsKKyAgICBCaXRWZWN0b3IgUmVnc0xpdmVBdEV4aXQoVFJJLT5nZXROdW1SZWdzKCkpOworICAgIFJTLT5nZXRSZWdzVXNlZChSZWdzTGl2ZUF0RXhpdCwgZmFsc2UpOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBlID0gVFJJLT5nZXROdW1SZWdzKCk7IGkgIT0gZTsgaSsrKQorICAgICAgaWYgKFJlZ3NMaXZlQXRFeGl0W2ldKQorICAgICAgICBOZXdNQkItPmFkZExpdmVJbihpKTsKKyAgfQorCisgIHJldHVybiBOZXdNQkI7Cit9CisKKy8vLyBFc3RpbWF0ZVJ1bnRpbWUgLSBNYWtlIGEgcm91Z2ggZXN0aW1hdGUgZm9yIGhvdyBsb25nIGl0IHdpbGwgdGFrZSB0byBydW4KKy8vLyB0aGUgc3BlY2lmaWVkIGNvZGUuCitzdGF0aWMgdW5zaWduZWQgRXN0aW1hdGVSdW50aW1lKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRSkgeworICB1bnNpZ25lZCBUaW1lID0gMDsKKyAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBJLT5nZXREZXNjKCk7CisgICAgaWYgKFRJRC5pc0NhbGwoKSkKKyAgICAgIFRpbWUgKz0gMTA7CisgICAgZWxzZSBpZiAoVElELm1heUxvYWQoKSB8fCBUSUQubWF5U3RvcmUoKSkKKyAgICAgIFRpbWUgKz0gMjsKKyAgICBlbHNlCisgICAgICArK1RpbWU7CisgIH0KKyAgcmV0dXJuIFRpbWU7Cit9CisKKy8vIEN1ck1CQiBuZWVkcyB0byBhZGQgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gU3VjY01CQiAod2UgcmVtb3ZlZCB0aGVzZQorLy8gYnJhbmNoZXMgdGVtcG9yYXJpbHkgZm9yIHRhaWwgbWVyZ2luZykuICBJbiB0aGUgY2FzZSB3aGVyZSBDdXJNQkIgZW5kcworLy8gd2l0aCBhIGNvbmRpdGlvbmFsIGJyYW5jaCB0byB0aGUgbmV4dCBibG9jaywgb3B0aW1pemUgYnkgcmV2ZXJzaW5nIHRoZQorLy8gdGVzdCBhbmQgY29uZGl0aW9uYWxseSBicmFuY2hpbmcgdG8gU3VjY01CQiBpbnN0ZWFkLgorc3RhdGljIHZvaWQgRml4VGFpbChNYWNoaW5lQmFzaWNCbG9jayAqQ3VyTUJCLCBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY0JCLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSkgeworICBNYWNoaW5lRnVuY3Rpb24gKk1GID0gQ3VyTUJCLT5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gbGx2bTo6bmV4dChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKEN1ck1CQikpOworICBNYWNoaW5lQmFzaWNCbG9jayAqVEJCID0gMCwgKkZCQiA9IDA7CisgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kLCA0PiBDb25kOworICBEZWJ1Z0xvYyBkbDsgIC8vIEZJWE1FOiB0aGlzIGlzIG5vd2hlcmUKKyAgaWYgKEkgIT0gTUYtPmVuZCgpICYmCisgICAgICAhVElJLT5BbmFseXplQnJhbmNoKCpDdXJNQkIsIFRCQiwgRkJCLCBDb25kLCB0cnVlKSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXh0QkIgPSBJOworICAgIGlmIChUQkIgPT0gTmV4dEJCICYmICFDb25kLmVtcHR5KCkgJiYgIUZCQikgeworICAgICAgaWYgKCFUSUktPlJldmVyc2VCcmFuY2hDb25kaXRpb24oQ29uZCkpIHsKKyAgICAgICAgVElJLT5SZW1vdmVCcmFuY2goKkN1ck1CQik7CisgICAgICAgIFRJSS0+SW5zZXJ0QnJhbmNoKCpDdXJNQkIsIFN1Y2NCQiwgTlVMTCwgQ29uZCwgZGwpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisgIFRJSS0+SW5zZXJ0QnJhbmNoKCpDdXJNQkIsIFN1Y2NCQiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDA+KCksIGRsKTsKK30KKworYm9vbAorQnJhbmNoRm9sZGVyOjpNZXJnZVBvdGVudGlhbHNFbHQ6Om9wZXJhdG9yPChjb25zdCBNZXJnZVBvdGVudGlhbHNFbHQgJm8pIGNvbnN0IHsKKyAgaWYgKGdldEhhc2goKSA8IG8uZ2V0SGFzaCgpKQorICAgIHJldHVybiB0cnVlOworICAgZWxzZSBpZiAoZ2V0SGFzaCgpID4gby5nZXRIYXNoKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBlbHNlIGlmIChnZXRCbG9jaygpLT5nZXROdW1iZXIoKSA8IG8uZ2V0QmxvY2soKS0+Z2V0TnVtYmVyKCkpCisgICAgcmV0dXJuIHRydWU7CisgIGVsc2UgaWYgKGdldEJsb2NrKCktPmdldE51bWJlcigpID4gby5nZXRCbG9jaygpLT5nZXROdW1iZXIoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGVsc2UgeworICAgIC8vIF9HTElCQ1hYX0RFQlVHIGNoZWNrcyBzdHJpY3Qgd2VhayBvcmRlcmluZywgd2hpY2ggaW52b2x2ZXMgY29tcGFyaW5nCisgICAgLy8gYW4gb2JqZWN0IHdpdGggaXRzZWxmLgorI2lmbmRlZiBfR0xJQkNYWF9ERUJVRworICAgIGxsdm1fdW5yZWFjaGFibGUoIlByZWRlY2Vzc29yIGFwcGVhcnMgdHdpY2UiKTsKKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLy8gQ291bnRUZXJtaW5hdG9ycyAtIENvdW50IHRoZSBudW1iZXIgb2YgdGVybWluYXRvcnMgaW4gdGhlIGdpdmVuCisvLy8gYmxvY2sgYW5kIHNldCBJIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgbm9uLXRlcm1pbmF0b3IsIGlmIHRoZXJlCisvLy8gaXMgb25lLCBvciBNQkItPmVuZCgpIG90aGVyd2lzZS4KK3N0YXRpYyB1bnNpZ25lZCBDb3VudFRlcm1pbmF0b3JzKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJkkpIHsKKyAgSSA9IE1CQi0+ZW5kKCk7CisgIHVuc2lnbmVkIE51bVRlcm1zID0gMDsKKyAgZm9yICg7OykgeworICAgIGlmIChJID09IE1CQi0+YmVnaW4oKSkgeworICAgICAgSSA9IE1CQi0+ZW5kKCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLS1JOworICAgIGlmICghSS0+Z2V0RGVzYygpLmlzVGVybWluYXRvcigpKSBicmVhazsKKyAgICArK051bVRlcm1zOworICB9CisgIHJldHVybiBOdW1UZXJtczsKK30KKworLy8vIFByb2ZpdGFibGVUb01lcmdlIC0gQ2hlY2sgaWYgdHdvIG1hY2hpbmUgYmFzaWMgYmxvY2tzIGhhdmUgYSBjb21tb24gdGFpbAorLy8vIGFuZCBkZWNpZGUgaWYgaXQgd291bGQgYmUgcHJvZml0YWJsZSB0byBtZXJnZSB0aG9zZSB0YWlscy4gIFJldHVybiB0aGUKKy8vLyBsZW5ndGggb2YgdGhlIGNvbW1vbiB0YWlsIGFuZCBpdGVyYXRvcnMgdG8gdGhlIGZpcnN0IGNvbW1vbiBpbnN0cnVjdGlvbgorLy8vIGluIGVhY2ggYmxvY2suCitzdGF0aWMgYm9vbCBQcm9maXRhYmxlVG9NZXJnZShNYWNoaW5lQmFzaWNCbG9jayAqTUJCMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWluQ29tbW9uVGFpbExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZDb21tb25UYWlsTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWRCQikgeworICBDb21tb25UYWlsTGVuID0gQ29tcHV0ZUNvbW1vblRhaWxMZW5ndGgoTUJCMSwgTUJCMiwgSTEsIEkyKTsKKyAgTWFjaGluZUZ1bmN0aW9uICpNRiA9IE1CQjEtPmdldFBhcmVudCgpOworCisgIGlmIChDb21tb25UYWlsTGVuID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEl0J3MgYWxtb3N0IGFsd2F5cyBwcm9maXRhYmxlIHRvIG1lcmdlIGFueSBudW1iZXIgb2Ygbm9uLXRlcm1pbmF0b3IKKyAgLy8gaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIGJsb2NrIHRoYXQgZmFsbHMgdGhyb3VnaCBpbnRvIHRoZSBjb21tb24gc3VjY2Vzc29yLgorICBpZiAoTUJCMSA9PSBQcmVkQkIgfHwgTUJCMiA9PSBQcmVkQkIpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSTsKKyAgICB1bnNpZ25lZCBOdW1UZXJtcyA9IENvdW50VGVybWluYXRvcnMoTUJCMSA9PSBQcmVkQkIgPyBNQkIyIDogTUJCMSwgSSk7CisgICAgaWYgKENvbW1vblRhaWxMZW4gPiBOdW1UZXJtcykKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gSWYgb25lIG9mIHRoZSBibG9ja3MgY2FuIGJlIGNvbXBsZXRlbHkgbWVyZ2VkIGFuZCBoYXBwZW5zIHRvIGJlIGluCisgIC8vIGEgcG9zaXRpb24gd2hlcmUgdGhlIG90aGVyIGNvdWxkIGZhbGwgdGhyb3VnaCBpbnRvIGl0LCBtZXJnZSBhbnkgbnVtYmVyCisgIC8vIG9mIGluc3RydWN0aW9ucywgYmVjYXVzZSBpdCBjYW4gYmUgZG9uZSB3aXRob3V0IGEgYnJhbmNoLgorICAvLyBUT0RPOiBJZiB0aGUgYmxvY2tzIGFyZSBub3QgYWRqYWNlbnQsIG1vdmUgb25lIG9mIHRoZW0gc28gdGhhdCB0aGV5IGFyZT8KKyAgaWYgKE1CQjEtPmlzTGF5b3V0U3VjY2Vzc29yKE1CQjIpICYmIEkyID09IE1CQjItPmJlZ2luKCkpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChNQkIyLT5pc0xheW91dFN1Y2Nlc3NvcihNQkIxKSAmJiBJMSA9PSBNQkIxLT5iZWdpbigpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIElmIGJvdGggYmxvY2tzIGhhdmUgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdGVtcG9yYXJpbHkgc3RyaXBwZWQgb3V0LAorICAvLyBjb3VudCB0aGF0IGFzIGFuIGFkZGl0aW9uYWwgY29tbW9uIGluc3RydWN0aW9uIGZvciB0aGUgZm9sbG93aW5nCisgIC8vIGhldXJpc3RpY3MuCisgIHVuc2lnbmVkIEVmZmVjdGl2ZVRhaWxMZW4gPSBDb21tb25UYWlsTGVuOworICBpZiAoU3VjY0JCICYmIE1CQjEgIT0gUHJlZEJCICYmIE1CQjIgIT0gUHJlZEJCICYmCisgICAgICAhTUJCMS0+YmFjaygpLmdldERlc2MoKS5pc0JhcnJpZXIoKSAmJgorICAgICAgIU1CQjItPmJhY2soKS5nZXREZXNjKCkuaXNCYXJyaWVyKCkpCisgICAgKytFZmZlY3RpdmVUYWlsTGVuOworCisgIC8vIENoZWNrIGlmIHRoZSBjb21tb24gdGFpbCBpcyBsb25nIGVub3VnaCB0byBiZSB3b3J0aHdoaWxlLgorICBpZiAoRWZmZWN0aXZlVGFpbExlbiA+PSBtaW5Db21tb25UYWlsTGVuZ3RoKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIElmIHdlIGFyZSBvcHRpbWl6aW5nIGZvciBjb2RlIHNpemUsIDIgaW5zdHJ1Y3Rpb25zIGluIGNvbW1vbiBpcyBlbm91Z2ggaWYKKyAgLy8gd2UgZG9uJ3QgaGF2ZSB0byBzcGxpdCBhIGJsb2NrLiAgQXQgd29yc3Qgd2Ugd2lsbCBiZSBpbnRyb2R1Y2luZyAxIG5ldworICAvLyBicmFuY2ggaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIGxpa2VseSB0byBiZSBzbWFsbGVyIHRoYW4gdGhlIDIKKyAgLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgd291bGQgYmUgZGVsZXRlZCBpbiB0aGUgbWVyZ2UuCisgIGlmIChFZmZlY3RpdmVUYWlsTGVuID49IDIgJiYKKyAgICAgIE1GLT5nZXRGdW5jdGlvbigpLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpPcHRpbWl6ZUZvclNpemUpICYmCisgICAgICAoSTEgPT0gTUJCMS0+YmVnaW4oKSB8fCBJMiA9PSBNQkIyLT5iZWdpbigpKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBDb21wdXRlU2FtZVRhaWxzIC0gTG9vayB0aHJvdWdoIGFsbCB0aGUgYmxvY2tzIGluIE1lcmdlUG90ZW50aWFscyB0aGF0IGhhdmUKKy8vLyBoYXNoIEN1ckhhc2ggKGd1YXJhbnRlZWQgdG8gbWF0Y2ggdGhlIGxhc3QgZWxlbWVudCkuICBCdWlsZCB0aGUgdmVjdG9yCisvLy8gU2FtZVRhaWxzIG9mIGFsbCB0aG9zZSB0aGF0IGhhdmUgdGhlIChzYW1lKSBsYXJnZXN0IG51bWJlciBvZiBpbnN0cnVjdGlvbnMKKy8vLyBpbiBjb21tb24gb2YgYW55IHBhaXIgb2YgdGhlc2UgYmxvY2tzLiAgU2FtZVRhaWxzIGVudHJpZXMgY29udGFpbiBhbgorLy8vIGl0ZXJhdG9yIGludG8gTWVyZ2VQb3RlbnRpYWxzIChmcm9tIHdoaWNoIHRoZSBNYWNoaW5lQmFzaWNCbG9jayBjYW4gYmUKKy8vLyBmb3VuZCkgYW5kIGEgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGludG8gdGhhdCBNQkIgaW5kaWNhdGluZyB0aGUKKy8vLyBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgbWF0Y2hpbmcgY29kZSBzZXF1ZW5jZSBiZWdpbnMuCisvLy8gT3JkZXIgb2YgZWxlbWVudHMgaW4gU2FtZVRhaWxzIGlzIHRoZSByZXZlcnNlIG9mIHRoZSBvcmRlciBpbiB3aGljaAorLy8vIHRob3NlIGJsb2NrcyBhcHBlYXIgaW4gTWVyZ2VQb3RlbnRpYWxzICh3aGVyZSB0aGV5IGFyZSBub3QgbmVjZXNzYXJpbHkKKy8vLyBjb25zZWN1dGl2ZSkuCit1bnNpZ25lZCBCcmFuY2hGb2xkZXI6OkNvbXB1dGVTYW1lVGFpbHModW5zaWduZWQgQ3VySGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtaW5Db21tb25UYWlsTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWRCQikgeworICB1bnNpZ25lZCBtYXhDb21tb25UYWlsTGVuZ3RoID0gMFU7CisgIFNhbWVUYWlscy5jbGVhcigpOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgVHJpYWxCQkkxLCBUcmlhbEJCSTI7CisgIE1QSXRlcmF0b3IgSGlnaGVzdE1QSXRlciA9IHByaW9yKE1lcmdlUG90ZW50aWFscy5lbmQoKSk7CisgIGZvciAoTVBJdGVyYXRvciBDdXJNUEl0ZXIgPSBwcmlvcihNZXJnZVBvdGVudGlhbHMuZW5kKCkpLAorICAgICAgICAgICAgICAgICAgQiA9IE1lcmdlUG90ZW50aWFscy5iZWdpbigpOworICAgICAgIEN1ck1QSXRlciAhPSBCICYmIEN1ck1QSXRlci0+Z2V0SGFzaCgpID09IEN1ckhhc2g7CisgICAgICAgLS1DdXJNUEl0ZXIpIHsKKyAgICBmb3IgKE1QSXRlcmF0b3IgSSA9IHByaW9yKEN1ck1QSXRlcik7IEktPmdldEhhc2goKSA9PSBDdXJIYXNoIDsgLS1JKSB7CisgICAgICB1bnNpZ25lZCBDb21tb25UYWlsTGVuOworICAgICAgaWYgKFByb2ZpdGFibGVUb01lcmdlKEN1ck1QSXRlci0+Z2V0QmxvY2soKSwgSS0+Z2V0QmxvY2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Db21tb25UYWlsTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblRhaWxMZW4sIFRyaWFsQkJJMSwgVHJpYWxCQkkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2NCQiwgUHJlZEJCKSkgeworICAgICAgICBpZiAoQ29tbW9uVGFpbExlbiA+IG1heENvbW1vblRhaWxMZW5ndGgpIHsKKyAgICAgICAgICBTYW1lVGFpbHMuY2xlYXIoKTsKKyAgICAgICAgICBtYXhDb21tb25UYWlsTGVuZ3RoID0gQ29tbW9uVGFpbExlbjsKKyAgICAgICAgICBIaWdoZXN0TVBJdGVyID0gQ3VyTVBJdGVyOworICAgICAgICAgIFNhbWVUYWlscy5wdXNoX2JhY2soU2FtZVRhaWxFbHQoQ3VyTVBJdGVyLCBUcmlhbEJCSTEpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoSGlnaGVzdE1QSXRlciA9PSBDdXJNUEl0ZXIgJiYKKyAgICAgICAgICAgIENvbW1vblRhaWxMZW4gPT0gbWF4Q29tbW9uVGFpbExlbmd0aCkKKyAgICAgICAgICBTYW1lVGFpbHMucHVzaF9iYWNrKFNhbWVUYWlsRWx0KEksIFRyaWFsQkJJMikpOworICAgICAgfQorICAgICAgaWYgKEkgPT0gQikKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBtYXhDb21tb25UYWlsTGVuZ3RoOworfQorCisvLy8gUmVtb3ZlQmxvY2tzV2l0aEhhc2ggLSBSZW1vdmUgYWxsIGJsb2NrcyB3aXRoIGhhc2ggQ3VySGFzaCBmcm9tCisvLy8gTWVyZ2VQb3RlbnRpYWxzLCByZXN0b3JpbmcgYnJhbmNoZXMgYXQgZW5kcyBvZiBibG9ja3MgYXMgYXBwcm9wcmlhdGUuCit2b2lkIEJyYW5jaEZvbGRlcjo6UmVtb3ZlQmxvY2tzV2l0aEhhc2godW5zaWduZWQgQ3VySGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkQkIpIHsKKyAgTVBJdGVyYXRvciBDdXJNUEl0ZXIsIEI7CisgIGZvciAoQ3VyTVBJdGVyID0gcHJpb3IoTWVyZ2VQb3RlbnRpYWxzLmVuZCgpKSwgQiA9IE1lcmdlUG90ZW50aWFscy5iZWdpbigpOworICAgICAgIEN1ck1QSXRlci0+Z2V0SGFzaCgpID09IEN1ckhhc2g7CisgICAgICAgLS1DdXJNUEl0ZXIpIHsKKyAgICAvLyBQdXQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoIGJhY2ssIGlmIHdlIG5lZWQgb25lLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpDdXJNQkIgPSBDdXJNUEl0ZXItPmdldEJsb2NrKCk7CisgICAgaWYgKFN1Y2NCQiAmJiBDdXJNQkIgIT0gUHJlZEJCKQorICAgICAgRml4VGFpbChDdXJNQkIsIFN1Y2NCQiwgVElJKTsKKyAgICBpZiAoQ3VyTVBJdGVyID09IEIpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoQ3VyTVBJdGVyLT5nZXRIYXNoKCkgIT0gQ3VySGFzaCkKKyAgICBDdXJNUEl0ZXIrKzsKKyAgTWVyZ2VQb3RlbnRpYWxzLmVyYXNlKEN1ck1QSXRlciwgTWVyZ2VQb3RlbnRpYWxzLmVuZCgpKTsKK30KKworLy8vIENyZWF0ZUNvbW1vblRhaWxPbmx5QmxvY2sgLSBOb25lIG9mIHRoZSBibG9ja3MgdG8gYmUgdGFpbC1tZXJnZWQgY29uc2lzdAorLy8vIG9ubHkgb2YgdGhlIGNvbW1vbiB0YWlsLiAgQ3JlYXRlIGEgYmxvY2sgdGhhdCBkb2VzIGJ5IHNwbGl0dGluZyBvbmUuCitib29sIEJyYW5jaEZvbGRlcjo6Q3JlYXRlQ29tbW9uVGFpbE9ubHlCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqJlByZWRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1heENvbW1vblRhaWxMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmY29tbW9uVGFpbEluZGV4KSB7CisgIGNvbW1vblRhaWxJbmRleCA9IDA7CisgIHVuc2lnbmVkIFRpbWVFc3RpbWF0ZSA9IH4wVTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNhbWVUYWlscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gVXNlIFByZWRCQiBpZiBwb3NzaWJsZTsgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYSBuZXcgYnJhbmNoLgorICAgIGlmIChTYW1lVGFpbHNbaV0uZ2V0QmxvY2soKSA9PSBQcmVkQkIpIHsKKyAgICAgIGNvbW1vblRhaWxJbmRleCA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIGEgKGZhaXJseSBib2d1cykgY2hvaWNlIGJhc2VkIG9uIGVzdGltYXRlIG9mCisgICAgLy8gaG93IGxvbmcgaXQgd2lsbCB0YWtlIHRoZSB2YXJpb3VzIGJsb2NrcyB0byBleGVjdXRlLgorICAgIHVuc2lnbmVkIHQgPSBFc3RpbWF0ZVJ1bnRpbWUoU2FtZVRhaWxzW2ldLmdldEJsb2NrKCktPmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1lVGFpbHNbaV0uZ2V0VGFpbFN0YXJ0UG9zKCkpOworICAgIGlmICh0IDw9IFRpbWVFc3RpbWF0ZSkgeworICAgICAgVGltZUVzdGltYXRlID0gdDsKKyAgICAgIGNvbW1vblRhaWxJbmRleCA9IGk7CisgICAgfQorICB9CisKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9CisgICAgU2FtZVRhaWxzW2NvbW1vblRhaWxJbmRleF0uZ2V0VGFpbFN0YXJ0UG9zKCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBTYW1lVGFpbHNbY29tbW9uVGFpbEluZGV4XS5nZXRCbG9jaygpOworCisgIC8vIElmIHRoZSBjb21tb24gdGFpbCBpbmNsdWRlcyBhbnkgZGVidWcgaW5mbyB3ZSB3aWxsIHRha2UgaXQgcHJldHR5CisgIC8vIHJhbmRvbWx5IGZyb20gb25lIG9mIHRoZSBpbnB1dHMuICBNaWdodCBiZSBiZXR0ZXIgdG8gcmVtb3ZlIGl0PworICBERUJVRyhkYmdzKCkgPDwgIlxuU3BsaXR0aW5nIEJCIyIgPDwgTUJCLT5nZXROdW1iZXIoKSA8PCAiLCBzaXplICIKKyAgICAgICAgICAgICAgIDw8IG1heENvbW1vblRhaWxMZW5ndGgpOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpuZXdNQkIgPSBTcGxpdE1CQkF0KCpNQkIsIEJCSSk7CisgIGlmICghbmV3TUJCKSB7CisgICAgREVCVUcoZGJncygpIDw8ICIuLi4gZmFpbGVkISIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFNhbWVUYWlsc1tjb21tb25UYWlsSW5kZXhdLnNldEJsb2NrKG5ld01CQik7CisgIFNhbWVUYWlsc1tjb21tb25UYWlsSW5kZXhdLnNldFRhaWxTdGFydFBvcyhuZXdNQkItPmJlZ2luKCkpOworCisgIC8vIElmIHdlIHNwbGl0IFByZWRCQiwgbmV3TUJCIGlzIHRoZSBuZXcgcHJlZGVjZXNzb3IuCisgIGlmIChQcmVkQkIgPT0gTUJCKQorICAgIFByZWRCQiA9IG5ld01CQjsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU2VlIGlmIGFueSBvZiB0aGUgYmxvY2tzIGluIE1lcmdlUG90ZW50aWFscyAod2hpY2ggYWxsIGhhdmUgYSBjb21tb24gc2luZ2xlCisvLyBzdWNjZXNzb3IsIG9yIGFsbCBoYXZlIG5vIHN1Y2Nlc3NvcikgY2FuIGJlIHRhaWwtbWVyZ2VkLiAgSWYgdGhlcmUgaXMgYQorLy8gc3VjY2Vzc29yLCBhbnkgYmxvY2tzIGluIE1lcmdlUG90ZW50aWFscyB0aGF0IGFyZSBub3QgdGFpbC1tZXJnZWQgYW5kCisvLyBhcmUgbm90IGltbWVkaWF0ZWx5IGJlZm9yZSBTdWNjIG11c3QgaGF2ZSBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0bworLy8gU3VjYyBhZGRlZCAoYnV0IHRoZSBwcmVkZWNlc3Nvci9zdWNjZXNzb3IgbGlzdHMgbmVlZCBubyBhZGp1c3RtZW50KS4KKy8vIFRoZSBsb25lIHByZWRlY2Vzc29yIG9mIFN1Y2MgdGhhdCBmYWxscyB0aHJvdWdoIGludG8gU3VjYywKKy8vIGlmIGFueSwgaXMgZ2l2ZW4gaW4gUHJlZEJCLgorCitib29sIEJyYW5jaEZvbGRlcjo6VHJ5VGFpbE1lcmdlQmxvY2tzKE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkQkIpIHsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgLy8gRXhjZXB0IGZvciB0aGUgc3BlY2lhbCBjYXNlcyBiZWxvdywgdGFpbC1tZXJnZSBpZiB0aGVyZSBhcmUgYXQgbGVhc3QKKyAgLy8gdGhpcyBtYW55IGluc3RydWN0aW9ucyBpbiBjb21tb24uCisgIHVuc2lnbmVkIG1pbkNvbW1vblRhaWxMZW5ndGggPSBUYWlsTWVyZ2VTaXplOworCisgIERFQlVHKGRiZ3MoKSA8PCAiXG5UcnlUYWlsTWVyZ2VCbG9ja3M6ICI7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNZXJnZVBvdGVudGlhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBkYmdzKCkgPDwgIkJCIyIgPDwgTWVyZ2VQb3RlbnRpYWxzW2ldLmdldEJsb2NrKCktPmdldE51bWJlcigpCisgICAgICAgICAgICAgICAgIDw8IChpID09IGUtMSA/ICIiIDogIiwgIik7CisgICAgICAgIGRiZ3MoKSA8PCAiXG4iOworICAgICAgICBpZiAoU3VjY0JCKSB7CisgICAgICAgICAgZGJncygpIDw8ICIgIHdpdGggc3VjY2Vzc29yIEJCIyIgPDwgU3VjY0JCLT5nZXROdW1iZXIoKSA8PCAnXG4nOworICAgICAgICAgIGlmIChQcmVkQkIpCisgICAgICAgICAgICBkYmdzKCkgPDwgIiAgd2hpY2ggaGFzIGZhbGwtdGhyb3VnaCBmcm9tIEJCIyIKKyAgICAgICAgICAgICAgICAgICA8PCBQcmVkQkItPmdldE51bWJlcigpIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgZGJncygpIDw8ICJMb29raW5nIGZvciBjb21tb24gdGFpbHMgb2YgYXQgbGVhc3QgIgorICAgICAgICAgICAgICAgPDwgbWluQ29tbW9uVGFpbExlbmd0aCA8PCAiIGluc3RydWN0aW9uIgorICAgICAgICAgICAgICAgPDwgKG1pbkNvbW1vblRhaWxMZW5ndGggPT0gMSA/ICIiIDogInMiKSA8PCAnXG4nOworICAgICAgICk7CisKKyAgLy8gU29ydCBieSBoYXNoIHZhbHVlIHNvIHRoYXQgYmxvY2tzIHdpdGggaWRlbnRpY2FsIGVuZCBzZXF1ZW5jZXMgc29ydAorICAvLyB0b2dldGhlci4KKyAgc3RkOjpzdGFibGVfc29ydChNZXJnZVBvdGVudGlhbHMuYmVnaW4oKSwgTWVyZ2VQb3RlbnRpYWxzLmVuZCgpKTsKKworICAvLyBXYWxrIHRocm91Z2ggZXF1aXZhbGVuY2Ugc2V0cyBsb29raW5nIGZvciBhY3R1YWwgZXhhY3QgbWF0Y2hlcy4KKyAgd2hpbGUgKE1lcmdlUG90ZW50aWFscy5zaXplKCkgPiAxKSB7CisgICAgdW5zaWduZWQgQ3VySGFzaCA9IE1lcmdlUG90ZW50aWFscy5iYWNrKCkuZ2V0SGFzaCgpOworCisgICAgLy8gQnVpbGQgU2FtZVRhaWxzLCBpZGVudGlmeWluZyB0aGUgc2V0IG9mIGJsb2NrcyB3aXRoIHRoaXMgaGFzaCBjb2RlCisgICAgLy8gYW5kIHdpdGggdGhlIG1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiBjb21tb24uCisgICAgdW5zaWduZWQgbWF4Q29tbW9uVGFpbExlbmd0aCA9IENvbXB1dGVTYW1lVGFpbHMoQ3VySGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Db21tb25UYWlsTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2NCQiwgUHJlZEJCKTsKKworICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBwYWlyIHRoYXQgaGFzIGF0IGxlYXN0IG1pbkNvbW1vblRhaWxMZW5ndGgKKyAgICAvLyBpbnN0cnVjdGlvbnMgaW4gY29tbW9uLCByZW1vdmUgYWxsIGJsb2NrcyB3aXRoIHRoaXMgaGFzaCBjb2RlIGFuZCByZXRyeS4KKyAgICBpZiAoU2FtZVRhaWxzLmVtcHR5KCkpIHsKKyAgICAgIFJlbW92ZUJsb2Nrc1dpdGhIYXNoKEN1ckhhc2gsIFN1Y2NCQiwgUHJlZEJCKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIElmIG9uZSBvZiB0aGUgYmxvY2tzIGlzIHRoZSBlbnRpcmUgY29tbW9uIHRhaWwgKGFuZCBub3QgdGhlIGVudHJ5CisgICAgLy8gYmxvY2ssIHdoaWNoIHdlIGNhbid0IGp1bXAgdG8pLCB3ZSBjYW4gdHJlYXQgYWxsIGJsb2NrcyB3aXRoIHRoaXMgc2FtZQorICAgIC8vIHRhaWwgYXQgb25jZS4gIFVzZSBQcmVkQkIgaWYgdGhhdCBpcyBvbmUgb2YgdGhlIHBvc3NpYmlsaXRpZXMsIGFzIHRoYXQKKyAgICAvLyB3aWxsIG5vdCBpbnRyb2R1Y2UgYW55IGV4dHJhIGJyYW5jaGVzLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpFbnRyeUJCID0gTWVyZ2VQb3RlbnRpYWxzLmJlZ2luKCktPmdldEJsb2NrKCktPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFyZW50KCktPmJlZ2luKCk7CisgICAgdW5zaWduZWQgY29tbW9uVGFpbEluZGV4ID0gU2FtZVRhaWxzLnNpemUoKTsKKyAgICAvLyBJZiB0aGVyZSBhcmUgdHdvIGJsb2NrcywgY2hlY2sgdG8gc2VlIGlmIG9uZSBjYW4gYmUgbWFkZSB0byBmYWxsIHRocm91Z2gKKyAgICAvLyBpbnRvIHRoZSBvdGhlci4KKyAgICBpZiAoU2FtZVRhaWxzLnNpemUoKSA9PSAyICYmCisgICAgICAgIFNhbWVUYWlsc1swXS5nZXRCbG9jaygpLT5pc0xheW91dFN1Y2Nlc3NvcihTYW1lVGFpbHNbMV0uZ2V0QmxvY2soKSkgJiYKKyAgICAgICAgU2FtZVRhaWxzWzFdLnRhaWxJc1dob2xlQmxvY2soKSkKKyAgICAgIGNvbW1vblRhaWxJbmRleCA9IDE7CisgICAgZWxzZSBpZiAoU2FtZVRhaWxzLnNpemUoKSA9PSAyICYmCisgICAgICAgICAgICAgU2FtZVRhaWxzWzFdLmdldEJsb2NrKCktPmlzTGF5b3V0U3VjY2Vzc29yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1lVGFpbHNbMF0uZ2V0QmxvY2soKSkgJiYKKyAgICAgICAgICAgICBTYW1lVGFpbHNbMF0udGFpbElzV2hvbGVCbG9jaygpKQorICAgICAgY29tbW9uVGFpbEluZGV4ID0gMDsKKyAgICBlbHNlIHsKKyAgICAgIC8vIE90aGVyd2lzZSBqdXN0IHBpY2sgb25lLCBmYXZvcmluZyB0aGUgZmFsbC10aHJvdWdoIHByZWRlY2Vzc29yIGlmCisgICAgICAvLyB0aGVyZSBpcyBvbmUuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU2FtZVRhaWxzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IFNhbWVUYWlsc1tpXS5nZXRCbG9jaygpOworICAgICAgICBpZiAoTUJCID09IEVudHJ5QkIgJiYgU2FtZVRhaWxzW2ldLnRhaWxJc1dob2xlQmxvY2soKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKE1CQiA9PSBQcmVkQkIpIHsKKyAgICAgICAgICBjb21tb25UYWlsSW5kZXggPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChTYW1lVGFpbHNbaV0udGFpbElzV2hvbGVCbG9jaygpKQorICAgICAgICAgIGNvbW1vblRhaWxJbmRleCA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbW1vblRhaWxJbmRleCA9PSBTYW1lVGFpbHMuc2l6ZSgpIHx8CisgICAgICAgIChTYW1lVGFpbHNbY29tbW9uVGFpbEluZGV4XS5nZXRCbG9jaygpID09IFByZWRCQiAmJgorICAgICAgICAgIVNhbWVUYWlsc1tjb21tb25UYWlsSW5kZXhdLnRhaWxJc1dob2xlQmxvY2soKSkpIHsKKyAgICAgIC8vIE5vbmUgb2YgdGhlIGJsb2NrcyBjb25zaXN0IGVudGlyZWx5IG9mIHRoZSBjb21tb24gdGFpbC4KKyAgICAgIC8vIFNwbGl0IGEgYmxvY2sgc28gdGhhdCBvbmUgZG9lcy4KKyAgICAgIGlmICghQ3JlYXRlQ29tbW9uVGFpbE9ubHlCbG9jayhQcmVkQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q29tbW9uVGFpbExlbmd0aCwgY29tbW9uVGFpbEluZGV4KSkgeworICAgICAgICBSZW1vdmVCbG9ja3NXaXRoSGFzaChDdXJIYXNoLCBTdWNjQkIsIFByZWRCQik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBTYW1lVGFpbHNbY29tbW9uVGFpbEluZGV4XS5nZXRCbG9jaygpOworICAgIC8vIE1CQiBpcyBjb21tb24gdGFpbC4gIEFkanVzdCBhbGwgb3RoZXIgQkIncyB0byBqdW1wIHRvIHRoaXMgb25lLgorICAgIC8vIFRyYXZlcnNhbCBtdXN0IGJlIGZvcndhcmRzIHNvIGVyYXNlcyB3b3JrLgorICAgIERFQlVHKGRiZ3MoKSA8PCAiXG5Vc2luZyBjb21tb24gdGFpbCBpbiBCQiMiIDw8IE1CQi0+Z2V0TnVtYmVyKCkKKyAgICAgICAgICAgICAgICAgPDwgIiBmb3IgIik7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wLCBlID0gU2FtZVRhaWxzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChjb21tb25UYWlsSW5kZXggPT0gaSkKKyAgICAgICAgY29udGludWU7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkJCIyIgPDwgU2FtZVRhaWxzW2ldLmdldEJsb2NrKCktPmdldE51bWJlcigpCisgICAgICAgICAgICAgICAgICAgPDwgKGkgPT0gZS0xID8gIiIgOiAiLCAiKSk7CisgICAgICAvLyBIYWNrIHRoZSBlbmQgb2ZmIEJCIGksIG1ha2luZyBpdCBqdW1wIHRvIEJCIGNvbW1vblRhaWxJbmRleCBpbnN0ZWFkLgorICAgICAgUmVwbGFjZVRhaWxXaXRoQnJhbmNoVG8oU2FtZVRhaWxzW2ldLmdldFRhaWxTdGFydFBvcygpLCBNQkIpOworICAgICAgLy8gQkIgaSBpcyBubyBsb25nZXIgYSBwcmVkZWNlc3NvciBvZiBTdWNjQkI7IHJlbW92ZSBpdCBmcm9tIHRoZSB3b3JrbGlzdC4KKyAgICAgIE1lcmdlUG90ZW50aWFscy5lcmFzZShTYW1lVGFpbHNbaV0uZ2V0TVBJdGVyKCkpOworICAgIH0KKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuIik7CisgICAgLy8gV2UgbGVhdmUgY29tbW9uVGFpbEluZGV4IGluIHRoZSB3b3JrbGlzdCBpbiBjYXNlIHRoZXJlIGFyZSBvdGhlciBibG9ja3MKKyAgICAvLyB0aGF0IG1hdGNoIGl0IHdpdGggYSBzbWFsbGVyIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuCisgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgIH0KKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKK2Jvb2wgQnJhbmNoRm9sZGVyOjpUYWlsTWVyZ2VCbG9ja3MoTWFjaGluZUZ1bmN0aW9uICZNRikgeworCisgIGlmICghRW5hYmxlVGFpbE1lcmdlKSByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgLy8gRmlyc3QgZmluZCBibG9ja3Mgd2l0aCBubyBzdWNjZXNzb3JzLgorICBNZXJnZVBvdGVudGlhbHMuY2xlYXIoKTsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPnN1Y2NfZW1wdHkoKSkKKyAgICAgIE1lcmdlUG90ZW50aWFscy5wdXNoX2JhY2soTWVyZ2VQb3RlbnRpYWxzRWx0KEhhc2hFbmRPZk1CQihJKSwgSSkpOworICB9CisKKyAgLy8gU2VlIGlmIHdlIGNhbiBkbyBhbnkgdGFpbCBtZXJnaW5nIG9uIHRob3NlLgorICBpZiAoTWVyZ2VQb3RlbnRpYWxzLnNpemUoKSA8IFRhaWxNZXJnZVRocmVzaG9sZCAmJgorICAgICAgTWVyZ2VQb3RlbnRpYWxzLnNpemUoKSA+PSAyKQorICAgIE1hZGVDaGFuZ2UgfD0gVHJ5VGFpbE1lcmdlQmxvY2tzKE5VTEwsIE5VTEwpOworCisgIC8vIExvb2sgYXQgYmxvY2tzIChJQkIpIHdpdGggbXVsdGlwbGUgcHJlZGVjZXNzb3JzIChQQkIpLgorICAvLyBXZSBjaGFuZ2UgZWFjaCBwcmVkZWNlc3NvciB0byBhIGNhbm9uaWNhbCBmb3JtLCBieQorICAvLyAoMSkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgYW55IHVuY29uZGl0aW9uYWwgYnJhbmNoIGZyb20gdGhlIHByZWRlY2Vzc29yCisgIC8vIHRvIElCQiwgYW5kCisgIC8vICgyKSBhbHRlciBjb25kaXRpb25hbCBicmFuY2hlcyBzbyB0aGV5IGJyYW5jaCB0byB0aGUgb3RoZXIgYmxvY2sKKyAgLy8gbm90IElCQjsgdGhpcyBtYXkgcmVxdWlyZSBhZGRpbmcgYmFjayBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byBJQkIKKyAgLy8gbGF0ZXIsIHdoZXJlIHRoZXJlIHdhc24ndCBvbmUgY29taW5nIGluLiAgRS5nLgorICAvLyAgIEJjYyBJQkIKKyAgLy8gICBmYWxsdGhyb3VnaCB0byBRQkIKKyAgLy8gaGVyZSBiZWNvbWVzCisgIC8vICAgQm5jYyBRQkIKKyAgLy8gd2l0aCBhIGNvbmNlcHR1YWwgQiB0byBJQkIgYWZ0ZXIgdGhhdCwgd2hpY2ggbmV2ZXIgYWN0dWFsbHkgZXhpc3RzLgorICAvLyBXaXRoIHRob3NlIGNoYW5nZXMsIHdlIHNlZSB3aGV0aGVyIHRoZSBwcmVkZWNlc3NvcnMnIHRhaWxzIG1hdGNoLAorICAvLyBhbmQgbWVyZ2UgdGhlbSBpZiBzby4gIFdlIGNoYW5nZSB0aGluZ3Mgb3V0IG9mIGNhbm9uaWNhbCBmb3JtIGFuZAorICAvLyBiYWNrIHRvIHRoZSB3YXkgdGhleSB3ZXJlIGxhdGVyIGluIHRoZSBwcm9jZXNzLiAgKE9wdGltaXplQnJhbmNoZXMKKyAgLy8gd291bGQgdW5kbyBzb21lIG9mIHRoaXMsIGJ1dCB3ZSBjYW4ndCB1c2UgaXQsIGJlY2F1c2Ugd2UnZCBnZXQgaW50bworICAvLyBhIGNvbXBpbGUtdGltZSBpbmZpbml0ZSBsb29wIHJlcGVhdGVkbHkgZG9pbmcgYW5kIHVuZG9pbmcgdGhlIHNhbWUKKyAgLy8gdHJhbnNmb3JtYXRpb25zLikKKworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IGxsdm06Om5leHQoTUYuYmVnaW4oKSksIEUgPSBNRi5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChJLT5wcmVkX3NpemUoKSA+PSAyICYmIEktPnByZWRfc2l6ZSgpIDwgVGFpbE1lcmdlVGhyZXNob2xkKSB7CisgICAgICBTbWFsbFB0clNldDxNYWNoaW5lQmFzaWNCbG9jayAqLCA4PiBVbmlxdWVQcmVkczsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpJQkIgPSBJOworICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWRCQiA9IHByaW9yKEkpOworICAgICAgTWVyZ2VQb3RlbnRpYWxzLmNsZWFyKCk7CisgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpwcmVkX2l0ZXJhdG9yIFAgPSBJLT5wcmVkX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyID0gSS0+cHJlZF9lbmQoKTsKKyAgICAgICAgICAgUCAhPSBFMjsgKytQKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQQkIgPSAqUDsKKyAgICAgICAgLy8gU2tpcCBibG9ja3MgdGhhdCBsb29wIHRvIHRoZW1zZWx2ZXMsIGNhbid0IHRhaWwgbWVyZ2UgdGhlc2UuCisgICAgICAgIGlmIChQQkIgPT0gSUJCKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBWaXNpdCBlYWNoIHByZWRlY2Vzc29yIG9ubHkgb25jZS4KKyAgICAgICAgaWYgKCFVbmlxdWVQcmVkcy5pbnNlcnQoUEJCKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiA9IDAsICpGQkIgPSAwOworICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwgND4gQ29uZDsKKyAgICAgICAgaWYgKCFUSUktPkFuYWx5emVCcmFuY2goKlBCQiwgVEJCLCBGQkIsIENvbmQsIHRydWUpKSB7CisgICAgICAgICAgLy8gRmFpbGluZyBjYXNlOiAgSUJCIGlzIHRoZSB0YXJnZXQgb2YgYSBjYnIsIGFuZAorICAgICAgICAgIC8vIHdlIGNhbm5vdCByZXZlcnNlIHRoZSBicmFuY2guCisgICAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDQ+IE5ld0NvbmQoQ29uZCk7CisgICAgICAgICAgaWYgKCFDb25kLmVtcHR5KCkgJiYgVEJCID09IElCQikgeworICAgICAgICAgICAgaWYgKFRJSS0+UmV2ZXJzZUJyYW5jaENvbmRpdGlvbihOZXdDb25kKSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBRQkIgY2FzZSBkZXNjcmliZWQgYWJvdmUKKyAgICAgICAgICAgIGlmICghRkJCKQorICAgICAgICAgICAgICBGQkIgPSBsbHZtOjpuZXh0KE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoUEJCKSk7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggYXQgdGhlIGVuZCwgaWYgYW55LgorICAgICAgICAgIGlmIChUQkIgJiYgKENvbmQuZW1wdHkoKSB8fCBGQkIpKSB7CisgICAgICAgICAgICBEZWJ1Z0xvYyBkbDsgIC8vIEZJWE1FOiB0aGlzIGlzIG5vd2hlcmUKKyAgICAgICAgICAgIFRJSS0+UmVtb3ZlQnJhbmNoKCpQQkIpOworICAgICAgICAgICAgaWYgKCFDb25kLmVtcHR5KCkpCisgICAgICAgICAgICAgIC8vIHJlaW5zZXJ0IGNvbmRpdGlvbmFsIGJyYW5jaCBvbmx5LCBmb3Igbm93CisgICAgICAgICAgICAgIFRJSS0+SW5zZXJ0QnJhbmNoKCpQQkIsIChUQkIgPT0gSUJCKSA/IEZCQiA6IFRCQiwgMCwgTmV3Q29uZCwgZGwpOworICAgICAgICAgIH0KKyAgICAgICAgICBNZXJnZVBvdGVudGlhbHMucHVzaF9iYWNrKE1lcmdlUG90ZW50aWFsc0VsdChIYXNoRW5kT2ZNQkIoUEJCKSwgKlApKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKE1lcmdlUG90ZW50aWFscy5zaXplKCkgPj0gMikKKyAgICAgICAgTWFkZUNoYW5nZSB8PSBUcnlUYWlsTWVyZ2VCbG9ja3MoSUJCLCBQcmVkQkIpOworICAgICAgLy8gUmVpbnNlcnQgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggaWYgbmVlZGVkLgorICAgICAgLy8gVGhlIDEgYmVsb3cgY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHJlbW92aW5nIGJsb2NrcyBpbiBUcnlUYWlsTWVyZ2VCbG9ja3MuCisgICAgICBQcmVkQkIgPSBwcmlvcihJKTsgICAgICAvLyB0aGlzIG1heSBoYXZlIGJlZW4gY2hhbmdlZCBpbiBUcnlUYWlsTWVyZ2VCbG9ja3MKKyAgICAgIGlmIChNZXJnZVBvdGVudGlhbHMuc2l6ZSgpID09IDEgJiYKKyAgICAgICAgICBNZXJnZVBvdGVudGlhbHMuYmVnaW4oKS0+Z2V0QmxvY2soKSAhPSBQcmVkQkIpCisgICAgICAgIEZpeFRhaWwoTWVyZ2VQb3RlbnRpYWxzLmJlZ2luKCktPmdldEJsb2NrKCksIElCQiwgVElJKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgQnJhbmNoIE9wdGltaXphdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworYm9vbCBCcmFuY2hGb2xkZXI6Ok9wdGltaXplQnJhbmNoZXMoTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKworICAvLyBNYWtlIHN1cmUgYmxvY2tzIGFyZSBudW1iZXJlZCBpbiBvcmRlcgorICBNRi5SZW51bWJlckJsb2NrcygpOworCisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gKytNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IEkrKzsKKyAgICBNYWRlQ2hhbmdlIHw9IE9wdGltaXplQmxvY2soTUJCKTsKKworICAgIC8vIElmIGl0IGlzIGRlYWQsIHJlbW92ZSBpdC4KKyAgICBpZiAoTUJCLT5wcmVkX2VtcHR5KCkpIHsKKyAgICAgIFJlbW92ZURlYWRCbG9jayhNQkIpOworICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICArK051bURlYWRCbG9ja3M7CisgICAgfQorICB9CisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisvLyBCbG9ja3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBjb250YWluIG9ubHkgZGVidWcgaW5mbzsKKy8vIGVsc2UgdGhlIGRlYnVnIGluZm8gd291bGQgYWZmZWN0IGNvZGVnZW4uCitzdGF0aWMgYm9vbCBJc0VtcHR5QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICBpZiAoTUJCLT5lbXB0eSgpKQorICAgIHJldHVybiB0cnVlOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gTUJCLT5iZWdpbigpLCBNQkJFID0gTUJCLT5lbmQoKTsKKyAgICAgICBNQkJJIT1NQkJFOyArK01CQkkpIHsKKyAgICBpZiAoIU1CQkktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBCbG9ja3Mgd2l0aCBvbmx5IGRlYnVnIGluZm8gYW5kIGJyYW5jaGVzIHNob3VsZCBiZSBjb25zaWRlcmVkIHRoZSBzYW1lCisvLyBhcyBibG9ja3Mgd2l0aCBvbmx5IGJyYW5jaGVzLgorc3RhdGljIGJvb2wgSXNCcmFuY2hPbmx5QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwgTUJCRTsKKyAgZm9yIChNQkJJID0gTUJCLT5iZWdpbigpLCBNQkJFID0gTUJCLT5lbmQoKTsgTUJCSSE9TUJCRTsgKytNQkJJKSB7CisgICAgaWYgKCFNQkJJLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAoTUJCSS0+Z2V0RGVzYygpLmlzQnJhbmNoKCkpOworfQorCisvLy8gSXNCZXR0ZXJGYWxsdGhyb3VnaCAtIFJldHVybiB0cnVlIGlmIGl0IHdvdWxkIGJlIGNsZWFybHkgYmV0dGVyIHRvCisvLy8gZmFsbC10aHJvdWdoIHRvIE1CQjEgdGhhbiB0byBmYWxsIHRocm91Z2ggaW50byBNQkIyLiAgVGhpcyBoYXMgdG8gcmV0dXJuCisvLy8gYSBzdHJpY3Qgb3JkZXJpbmcsIHJldHVybmluZyB0cnVlIGZvciBib3RoIChNQkIxLE1CQjIpIGFuZCAoTUJCMixNQkIxKSB3aWxsCisvLy8gcmVzdWx0IGluIGluZmluaXRlIGxvb3BzLgorc3RhdGljIGJvb2wgSXNCZXR0ZXJGYWxsdGhyb3VnaChNYWNoaW5lQmFzaWNCbG9jayAqTUJCMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQjIpIHsKKyAgLy8gUmlnaHQgbm93LCB3ZSB1c2UgYSBzaW1wbGUgaGV1cmlzdGljLiAgSWYgTUJCMiBlbmRzIHdpdGggYSBjYWxsLCBhbmQKKyAgLy8gTUJCMSBkb2Vzbid0LCB3ZSBwcmVmZXIgdG8gZmFsbCB0aHJvdWdoIGludG8gTUJCMS4gIFRoaXMgYWxsb3dzIHVzIHRvCisgIC8vIG9wdGltaXplIGJyYW5jaGVzIHRoYXQgYnJhbmNoIHRvIGVpdGhlciBhIHJldHVybiBibG9jayBvciBhbiBhc3NlcnQgYmxvY2sKKyAgLy8gaW50byBhIGZhbGx0aHJvdWdoIHRvIHRoZSByZXR1cm4uCisgIGlmIChJc0VtcHR5QmxvY2soTUJCMSkgfHwgSXNFbXB0eUJsb2NrKE1CQjIpKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhlcmUgaXMgYSBjbGVhciBzdWNjZXNzb3Igb3JkZXJpbmcgd2UgbWFrZSBzdXJlIHRoYXQgb25lIGJsb2NrCisgIC8vIHdpbGwgZmFsbCB0aHJvdWdoIHRvIHRoZSBuZXh0CisgIGlmIChNQkIxLT5pc1N1Y2Nlc3NvcihNQkIyKSkgcmV0dXJuIHRydWU7CisgIGlmIChNQkIyLT5pc1N1Y2Nlc3NvcihNQkIxKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIE5laXRoZXIgYmxvY2sgY29uc2lzdHMgZW50aXJlbHkgb2YgZGVidWcgaW5mbyAocGVyIElzRW1wdHlCbG9jayBjaGVjayksCisgIC8vIHNvIHdlIG5lZWRuJ3QgdGVzdCBmb3IgZmFsbGluZyBvZmYgdGhlIGJlZ2lubmluZyBoZXJlLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCMUkgPSAtLU1CQjEtPmVuZCgpOworICB3aGlsZSAoTUJCMUktPmlzRGVidWdWYWx1ZSgpKQorICAgIC0tTUJCMUk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkIySSA9IC0tTUJCMi0+ZW5kKCk7CisgIHdoaWxlIChNQkIySS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgLS1NQkIySTsKKyAgcmV0dXJuIE1CQjJJLT5nZXREZXNjKCkuaXNDYWxsKCkgJiYgIU1CQjFJLT5nZXREZXNjKCkuaXNDYWxsKCk7Cit9CisKKy8vLyBPcHRpbWl6ZUJsb2NrIC0gQW5hbHl6ZSBhbmQgb3B0aW1pemUgY29udHJvbCBmbG93IHJlbGF0ZWQgdG8gdGhlIHNwZWNpZmllZAorLy8vIGJsb2NrLiAgVGhpcyBpcyBuZXZlciBjYWxsZWQgb24gdGhlIGVudHJ5IGJsb2NrLgorYm9vbCBCcmFuY2hGb2xkZXI6Ok9wdGltaXplQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkItPmdldFBhcmVudCgpOworICBEZWJ1Z0xvYyBkbDsgIC8vIEZJWE1FOiB0aGlzIGlzIG5vd2hlcmUKK1Jlb3B0aW1pemVCbG9jazoKKworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEZhbGxUaHJvdWdoID0gTUJCOworICArK0ZhbGxUaHJvdWdoOworCisgIC8vIElmIHRoaXMgYmxvY2sgaXMgZW1wdHksIG1ha2UgZXZlcnlvbmUgdXNlIGl0cyBmYWxsLXRocm91Z2gsIG5vdCB0aGUgYmxvY2sKKyAgLy8gZXhwbGljaXRseS4gIExhbmRpbmcgcGFkcyBzaG91bGQgbm90IGRvIHRoaXMgc2luY2UgdGhlIGxhbmRpbmctcGFkIHRhYmxlCisgIC8vIHBvaW50cyB0byB0aGlzIGJsb2NrLiAgQmxvY2tzIHdpdGggdGhlaXIgYWRkcmVzc2VzIHRha2VuIHNob3VsZG4ndCBiZQorICAvLyBvcHRpbWl6ZWQgYXdheS4KKyAgaWYgKElzRW1wdHlCbG9jayhNQkIpICYmICFNQkItPmhhc0FkZHJlc3NUYWtlbigpKSB7CisgICAgLy8gRGVhZCBibG9jaz8gIExlYXZlIGZvciBjbGVhbnVwIGxhdGVyLgorICAgIGlmIChNQkItPnByZWRfZW1wdHkoKSkgcmV0dXJuIE1hZGVDaGFuZ2U7CisKKyAgICBpZiAoRmFsbFRocm91Z2ggPT0gTUYuZW5kKCkpIHsKKyAgICAgIC8vIFRPRE86IFNpbXBsaWZ5IHByZWRzIHRvIG5vdCBicmFuY2ggaGVyZSBpZiBwb3NzaWJsZSEKKyAgICB9IGVsc2UgeworICAgICAgLy8gUmV3cml0ZSBhbGwgcHJlZGVjZXNzb3JzIG9mIHRoZSBvbGQgYmxvY2sgdG8gZ28gdG8gdGhlIGZhbGx0aHJvdWdoCisgICAgICAvLyBpbnN0ZWFkLgorICAgICAgd2hpbGUgKCFNQkItPnByZWRfZW1wdHkoKSkgeworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZCA9ICooTUJCLT5wcmVkX2VuZCgpLTEpOworICAgICAgICBQcmVkLT5SZXBsYWNlVXNlc09mQmxvY2tXaXRoKE1CQiwgRmFsbFRocm91Z2gpOworICAgICAgfQorICAgICAgLy8gSWYgTUJCIHdhcyB0aGUgdGFyZ2V0IG9mIGEganVtcCB0YWJsZSwgdXBkYXRlIGp1bXAgdGFibGVzIHRvIGdvIHRvIHRoZQorICAgICAgLy8gZmFsbHRocm91Z2ggaW5zdGVhZC4KKyAgICAgIGlmIChNYWNoaW5lSnVtcFRhYmxlSW5mbyAqTUpUSSA9IE1GLmdldEp1bXBUYWJsZUluZm8oKSkKKyAgICAgICAgTUpUSS0+UmVwbGFjZU1CQkluSnVtcFRhYmxlcyhNQkIsIEZhbGxUaHJvdWdoKTsKKyAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gc2ltcGxpZnkgdGhlIHRlcm1pbmF0b3Igb2YgdGhlIGJsb2NrIGJlZm9yZSB0aGlzCisgIC8vIG9uZS4KKyAgTWFjaGluZUJhc2ljQmxvY2sgJlByZXZCQiA9ICpwcmlvcihNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKE1CQikpOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmlvclRCQiA9IDAsICpQcmlvckZCQiA9IDA7CisgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kLCA0PiBQcmlvckNvbmQ7CisgIGJvb2wgUHJpb3JVbkFuYWx5emFibGUgPQorICAgIFRJSS0+QW5hbHl6ZUJyYW5jaChQcmV2QkIsIFByaW9yVEJCLCBQcmlvckZCQiwgUHJpb3JDb25kLCB0cnVlKTsKKyAgaWYgKCFQcmlvclVuQW5hbHl6YWJsZSkgeworICAgIC8vIElmIHRoZSBDRkcgZm9yIHRoZSBwcmlvciBibG9jayBoYXMgZXh0cmEgZWRnZXMsIHJlbW92ZSB0aGVtLgorICAgIE1hZGVDaGFuZ2UgfD0gUHJldkJCLkNvcnJlY3RFeHRyYUNGR0VkZ2VzKFByaW9yVEJCLCBQcmlvckZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhUHJpb3JDb25kLmVtcHR5KCkpOworCisgICAgLy8gSWYgdGhlIHByZXZpb3VzIGJyYW5jaCBpcyBjb25kaXRpb25hbCBhbmQgYm90aCBjb25kaXRpb25zIGdvIHRvIHRoZSBzYW1lCisgICAgLy8gZGVzdGluYXRpb24sIHJlbW92ZSB0aGUgYnJhbmNoLCByZXBsYWNpbmcgaXQgd2l0aCBhbiB1bmNvbmRpdGlvbmFsIG9uZSBvcgorICAgIC8vIGEgZmFsbC10aHJvdWdoLgorICAgIGlmIChQcmlvclRCQiAmJiBQcmlvclRCQiA9PSBQcmlvckZCQikgeworICAgICAgVElJLT5SZW1vdmVCcmFuY2goUHJldkJCKTsKKyAgICAgIFByaW9yQ29uZC5jbGVhcigpOworICAgICAgaWYgKFByaW9yVEJCICE9IE1CQikKKyAgICAgICAgVElJLT5JbnNlcnRCcmFuY2goUHJldkJCLCBQcmlvclRCQiwgMCwgUHJpb3JDb25kLCBkbCk7CisgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICsrTnVtQnJhbmNoT3B0czsKKyAgICAgIGdvdG8gUmVvcHRpbWl6ZUJsb2NrOworICAgIH0KKworICAgIC8vIElmIHRoZSBwcmV2aW91cyBibG9jayB1bmNvbmRpdGlvbmFsbHkgZmFsbHMgdGhyb3VnaCB0byB0aGlzIGJsb2NrIGFuZAorICAgIC8vIHRoaXMgYmxvY2sgaGFzIG5vIG90aGVyIHByZWRlY2Vzc29ycywgbW92ZSB0aGUgY29udGVudHMgb2YgdGhpcyBibG9jaworICAgIC8vIGludG8gdGhlIHByaW9yIGJsb2NrLiBUaGlzIGRvZXNuJ3QgdXN1YWxseSBoYXBwZW4gd2hlbiBTaW1wbGlmeUNGRworICAgIC8vIGhhcyBiZWVuIHVzZWQsIGJ1dCBpdCBjYW4gaGFwcGVuIGlmIHRhaWwgbWVyZ2luZyBzcGxpdHMgYSBmYWxsLXRocm91Z2gKKyAgICAvLyBwcmVkZWNlc3NvciBvZiBhIGJsb2NrLgorICAgIC8vIFRoaXMgaGFzIHRvIGNoZWNrIFByZXZCQi0+c3VjY19zaXplKCkgYmVjYXVzZSBFSCBlZGdlcyBhcmUgaWdub3JlZCBieQorICAgIC8vIEFuYWx5emVCcmFuY2guCisgICAgaWYgKFByaW9yQ29uZC5lbXB0eSgpICYmICFQcmlvclRCQiAmJiBNQkItPnByZWRfc2l6ZSgpID09IDEgJiYKKyAgICAgICAgUHJldkJCLnN1Y2Nfc2l6ZSgpID09IDEgJiYKKyAgICAgICAgIU1CQi0+aGFzQWRkcmVzc1Rha2VuKCkpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXG5NZXJnaW5nIGludG8gYmxvY2s6ICIgPDwgUHJldkJCCisgICAgICAgICAgICAgICAgICAgPDwgIkZyb20gTUJCOiAiIDw8ICpNQkIpOworICAgICAgUHJldkJCLnNwbGljZShQcmV2QkIuZW5kKCksIE1CQiwgTUJCLT5iZWdpbigpLCBNQkItPmVuZCgpKTsKKyAgICAgIFByZXZCQi5yZW1vdmVTdWNjZXNzb3IoUHJldkJCLnN1Y2NfYmVnaW4oKSk7OworICAgICAgYXNzZXJ0KFByZXZCQi5zdWNjX2VtcHR5KCkpOworICAgICAgUHJldkJCLnRyYW5zZmVyU3VjY2Vzc29ycyhNQkIpOworICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgcHJldmlvdXMgYnJhbmNoICpvbmx5KiBicmFuY2hlcyB0byAqdGhpcyogYmxvY2sgKGNvbmRpdGlvbmFsIG9yCisgICAgLy8gbm90KSByZW1vdmUgdGhlIGJyYW5jaC4KKyAgICBpZiAoUHJpb3JUQkIgPT0gTUJCICYmIFByaW9yRkJCID09IDApIHsKKyAgICAgIFRJSS0+UmVtb3ZlQnJhbmNoKFByZXZCQik7CisgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICsrTnVtQnJhbmNoT3B0czsKKyAgICAgIGdvdG8gUmVvcHRpbWl6ZUJsb2NrOworICAgIH0KKworICAgIC8vIElmIHRoZSBwcmlvciBibG9jayBicmFuY2hlcyBzb21ld2hlcmUgZWxzZSBvbiB0aGUgY29uZGl0aW9uIGFuZCBoZXJlIGlmCisgICAgLy8gdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSwgcmVtb3ZlIHRoZSB1bmNvbmQgc2Vjb25kIGJyYW5jaC4KKyAgICBpZiAoUHJpb3JGQkIgPT0gTUJCKSB7CisgICAgICBUSUktPlJlbW92ZUJyYW5jaChQcmV2QkIpOworICAgICAgVElJLT5JbnNlcnRCcmFuY2goUHJldkJCLCBQcmlvclRCQiwgMCwgUHJpb3JDb25kLCBkbCk7CisgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICsrTnVtQnJhbmNoT3B0czsKKyAgICAgIGdvdG8gUmVvcHRpbWl6ZUJsb2NrOworICAgIH0KKworICAgIC8vIElmIHRoZSBwcmlvciBibG9jayBicmFuY2hlcyBoZXJlIG9uIHRydWUgYW5kIHNvbWV3aGVyZSBlbHNlIG9uIGZhbHNlLCBhbmQKKyAgICAvLyBpZiB0aGUgYnJhbmNoIGNvbmRpdGlvbiBpcyByZXZlcnNpYmxlLCByZXZlcnNlIHRoZSBicmFuY2ggdG8gY3JlYXRlIGEKKyAgICAvLyBmYWxsLXRocm91Z2guCisgICAgaWYgKFByaW9yVEJCID09IE1CQikgeworICAgICAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDQ+IE5ld1ByaW9yQ29uZChQcmlvckNvbmQpOworICAgICAgaWYgKCFUSUktPlJldmVyc2VCcmFuY2hDb25kaXRpb24oTmV3UHJpb3JDb25kKSkgeworICAgICAgICBUSUktPlJlbW92ZUJyYW5jaChQcmV2QkIpOworICAgICAgICBUSUktPkluc2VydEJyYW5jaChQcmV2QkIsIFByaW9yRkJCLCAwLCBOZXdQcmlvckNvbmQsIGRsKTsKKyAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgICsrTnVtQnJhbmNoT3B0czsKKyAgICAgICAgZ290byBSZW9wdGltaXplQmxvY2s7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBibG9jayBoYXMgbm8gc3VjY2Vzc29ycyAoZS5nLiBpdCBpcyBhIHJldHVybiBibG9jayBvciBlbmRzIHdpdGgKKyAgICAvLyBhIGNhbGwgdG8gYSBuby1yZXR1cm4gZnVuY3Rpb24gbGlrZSBhYm9ydCBvciBfX2N4YV90aHJvdykgYW5kIGlmIHRoZSBwcmVkCisgICAgLy8gZmFsbHMgdGhyb3VnaCBpbnRvIHRoaXMgYmxvY2ssIGFuZCBpZiBpdCB3b3VsZCBvdGhlcndpc2UgZmFsbCB0aHJvdWdoCisgICAgLy8gaW50byB0aGUgYmxvY2sgYWZ0ZXIgdGhpcywgbW92ZSB0aGlzIGJsb2NrIHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgorICAgIC8vCisgICAgLy8gV2UgY29uc2lkZXIgaXQgbW9yZSBsaWtlbHkgdGhhdCBleGVjdXRpb24gd2lsbCBzdGF5IGluIHRoZSBmdW5jdGlvbiAoZS5nLgorICAgIC8vIGR1ZSB0byBsb29wcykgdGhhbiBpdCBpcyB0byBleGl0IGl0LiAgVGhpcyBhc3NlcnRzIGluIGxvb3BzIGV0YywgbW92aW5nCisgICAgLy8gdGhlIGFzc2VydCBjb25kaXRpb24gb3V0IG9mIHRoZSBsb29wIGJvZHkuCisgICAgaWYgKE1CQi0+c3VjY19lbXB0eSgpICYmICFQcmlvckNvbmQuZW1wdHkoKSAmJiBQcmlvckZCQiA9PSAwICYmCisgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoUHJpb3JUQkIpID09IEZhbGxUaHJvdWdoICYmCisgICAgICAgICFNQkItPmNhbkZhbGxUaHJvdWdoKCkpIHsKKyAgICAgIGJvb2wgRG9UcmFuc2Zvcm0gPSB0cnVlOworCisgICAgICAvLyBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgdGhhdCB0aGUgc3VjY3Mgb2YgUHJlZEJCIGFyZW4ndCBib3RoIG5vLXN1Y2Nlc3NvcgorICAgICAgLy8gYmxvY2tzLiAgSWYgbmVpdGhlciBoYXZlIHN1Y2Nlc3NvcnMgYW5kIGlmIFByZWRCQiBpcyB0aGUgc2Vjb25kIGZyb20KKyAgICAgIC8vIGxhc3QgYmxvY2sgaW4gdGhlIGZ1bmN0aW9uLCB3ZSdkIGp1c3Qga2VlcCBzd2FwcGluZyB0aGUgdHdvIGJsb2NrcyBmb3IKKyAgICAgIC8vIGxhc3QuICBPbmx5IGRvIHRoZSBzd2FwIGlmIG9uZSBpcyBjbGVhcmx5IGJldHRlciB0byBmYWxsIHRocm91Z2ggdGhhbgorICAgICAgLy8gdGhlIG90aGVyLgorICAgICAgaWYgKEZhbGxUaHJvdWdoID09IC0tTUYuZW5kKCkgJiYKKyAgICAgICAgICAhSXNCZXR0ZXJGYWxsdGhyb3VnaChQcmlvclRCQiwgTUJCKSkKKyAgICAgICAgRG9UcmFuc2Zvcm0gPSBmYWxzZTsKKworICAgICAgaWYgKERvVHJhbnNmb3JtKSB7CisgICAgICAgIC8vIFJldmVyc2UgdGhlIGJyYW5jaCBzbyB3ZSB3aWxsIGZhbGwgdGhyb3VnaCBvbiB0aGUgcHJldmlvdXMgdHJ1ZSBjb25kLgorICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwgND4gTmV3UHJpb3JDb25kKFByaW9yQ29uZCk7CisgICAgICAgIGlmICghVElJLT5SZXZlcnNlQnJhbmNoQ29uZGl0aW9uKE5ld1ByaW9yQ29uZCkpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlxuTW92aW5nIE1CQjogIiA8PCAqTUJCCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUbyBtYWtlIGZhbGx0aHJvdWdoIHRvOiAiIDw8ICpQcmlvclRCQiA8PCAiXG4iKTsKKworICAgICAgICAgIFRJSS0+UmVtb3ZlQnJhbmNoKFByZXZCQik7CisgICAgICAgICAgVElJLT5JbnNlcnRCcmFuY2goUHJldkJCLCBNQkIsIDAsIE5ld1ByaW9yQ29uZCwgZGwpOworCisgICAgICAgICAgLy8gTW92ZSB0aGlzIGJsb2NrIHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgorICAgICAgICAgIE1CQi0+bW92ZUFmdGVyKC0tTUYuZW5kKCkpOworICAgICAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgICAgICAgICsrTnVtQnJhbmNoT3B0czsKKyAgICAgICAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEFuYWx5emUgdGhlIGJyYW5jaCBpbiB0aGUgY3VycmVudCBibG9jay4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKkN1clRCQiA9IDAsICpDdXJGQkIgPSAwOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwgND4gQ3VyQ29uZDsKKyAgYm9vbCBDdXJVbkFuYWx5emFibGU9IFRJSS0+QW5hbHl6ZUJyYW5jaCgqTUJCLCBDdXJUQkIsIEN1ckZCQiwgQ3VyQ29uZCwgdHJ1ZSk7CisgIGlmICghQ3VyVW5BbmFseXphYmxlKSB7CisgICAgLy8gSWYgdGhlIENGRyBmb3IgdGhlIHByaW9yIGJsb2NrIGhhcyBleHRyYSBlZGdlcywgcmVtb3ZlIHRoZW0uCisgICAgTWFkZUNoYW5nZSB8PSBNQkItPkNvcnJlY3RFeHRyYUNGR0VkZ2VzKEN1clRCQiwgQ3VyRkJCLCAhQ3VyQ29uZC5lbXB0eSgpKTsKKworICAgIC8vIElmIHRoaXMgaXMgYSB0d28td2F5IGJyYW5jaCwgYW5kIHRoZSBGQkIgYnJhbmNoZXMgdG8gdGhpcyBibG9jaywgcmV2ZXJzZQorICAgIC8vIHRoZSBjb25kaXRpb24gc28gdGhlIHNpbmdsZS1iYXNpYy1ibG9jayBsb29wIGlzIGZhc3Rlci4gIEluc3RlYWQgb2Y6CisgICAgLy8gICAgTG9vcDogeHh4OyBqY2MgT3V0OyBqbXAgTG9vcAorICAgIC8vIHdlIHdhbnQ6CisgICAgLy8gICAgTG9vcDogeHh4OyBqbmNjIExvb3A7IGptcCBPdXQKKyAgICBpZiAoQ3VyVEJCICYmIEN1ckZCQiAmJiBDdXJGQkIgPT0gTUJCICYmIEN1clRCQiAhPSBNQkIpIHsKKyAgICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kLCA0PiBOZXdDb25kKEN1ckNvbmQpOworICAgICAgaWYgKCFUSUktPlJldmVyc2VCcmFuY2hDb25kaXRpb24oTmV3Q29uZCkpIHsKKyAgICAgICAgVElJLT5SZW1vdmVCcmFuY2goKk1CQik7CisgICAgICAgIFRJSS0+SW5zZXJ0QnJhbmNoKCpNQkIsIEN1ckZCQiwgQ3VyVEJCLCBOZXdDb25kLCBkbCk7CisgICAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgICAgICArK051bUJyYW5jaE9wdHM7CisgICAgICAgIGdvdG8gUmVvcHRpbWl6ZUJsb2NrOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoaXMgYnJhbmNoIGlzIHRoZSBvbmx5IHRoaW5nIGluIGl0cyBibG9jaywgc2VlIGlmIHdlIGNhbiBmb3J3YXJkCisgICAgLy8gb3RoZXIgYmxvY2tzIGFjcm9zcyBpdC4KKyAgICBpZiAoQ3VyVEJCICYmIEN1ckNvbmQuZW1wdHkoKSAmJiBDdXJGQkIgPT0gMCAmJgorICAgICAgICBJc0JyYW5jaE9ubHlCbG9jayhNQkIpICYmIEN1clRCQiAhPSBNQkIgJiYKKyAgICAgICAgIU1CQi0+aGFzQWRkcmVzc1Rha2VuKCkpIHsKKyAgICAgIC8vIFRoaXMgYmxvY2sgbWF5IGNvbnRhaW4ganVzdCBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gIEJlY2F1c2UgdGhlcmUgY2FuCisgICAgICAvLyBiZSAnbm9uLWJyYW5jaCB0ZXJtaW5hdG9ycycgaW4gdGhlIGJsb2NrLCB0cnkgcmVtb3ZpbmcgdGhlIGJyYW5jaCBhbmQKKyAgICAgIC8vIHRoZW4gc2VlaW5nIGlmIHRoZSBibG9jayBpcyBlbXB0eS4KKyAgICAgIFRJSS0+UmVtb3ZlQnJhbmNoKCpNQkIpOworICAgICAgLy8gSWYgdGhlIG9ubHkgdGhpbmdzIHJlbWFpbmluZyBpbiB0aGUgYmxvY2sgYXJlIGRlYnVnIGluZm8sIHJlbW92ZSB0aGVzZQorICAgICAgLy8gYXMgd2VsbCwgc28gdGhpcyB3aWxsIGJlaGF2ZSB0aGUgc2FtZSBhcyBhbiBlbXB0eSBibG9jayBpbiBub24tZGVidWcKKyAgICAgIC8vIG1vZGUuCisgICAgICBpZiAoIU1CQi0+ZW1wdHkoKSkgeworICAgICAgICBib29sIE5vbkRlYnVnSW5mb0ZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkItPmJlZ2luKCksIEUgPSBNQkItPmVuZCgpOworICAgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAgICAgaWYgKCFJLT5pc0RlYnVnVmFsdWUoKSkgeworICAgICAgICAgICAgTm9uRGVidWdJbmZvRm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghTm9uRGVidWdJbmZvRm91bmQpCisgICAgICAgICAgLy8gTWFrZSB0aGUgYmxvY2sgZW1wdHksIGxvc2luZyB0aGUgZGVidWcgaW5mbyAod2UgY291bGQgcHJvYmFibHkKKyAgICAgICAgICAvLyBpbXByb3ZlIHRoaXMgaW4gc29tZSBjYXNlcy4pCisgICAgICAgICAgTUJCLT5lcmFzZShNQkItPmJlZ2luKCksIE1CQi0+ZW5kKCkpOworICAgICAgfQorICAgICAgLy8gSWYgdGhpcyBibG9jayBpcyBqdXN0IGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHRvIEN1clRCQiwgd2UgY2FuCisgICAgICAvLyB1c3VhbGx5IGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBibG9jay4gIFRoZSBvbmx5IGNhc2Ugd2UgY2Fubm90CisgICAgICAvLyBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgYmxvY2sgaXMgd2hlbiB0aGUgYmxvY2sgYmVmb3JlIHRoaXMgb25lCisgICAgICAvLyBmYWxscyB0aHJvdWdoIGludG8gTUJCIGFuZCB3ZSBjYW4ndCB1bmRlcnN0YW5kIHRoZSBwcmlvciBibG9jaydzIGJyYW5jaAorICAgICAgLy8gY29uZGl0aW9uLgorICAgICAgaWYgKE1CQi0+ZW1wdHkoKSkgeworICAgICAgICBib29sIFByZWRIYXNOb0ZhbGxUaHJvdWdoID0gIVByZXZCQi5jYW5GYWxsVGhyb3VnaCgpOworICAgICAgICBpZiAoUHJlZEhhc05vRmFsbFRocm91Z2ggfHwgIVByaW9yVW5BbmFseXphYmxlIHx8CisgICAgICAgICAgICAhUHJldkJCLmlzU3VjY2Vzc29yKE1CQikpIHsKKyAgICAgICAgICAvLyBJZiB0aGUgcHJpb3IgYmxvY2sgZmFsbHMgdGhyb3VnaCBpbnRvIHVzLCB0dXJuIGl0IGludG8gYW4KKyAgICAgICAgICAvLyBleHBsaWNpdCBicmFuY2ggdG8gdXMgdG8gbWFrZSB1cGRhdGVzIHNpbXBsZXIuCisgICAgICAgICAgaWYgKCFQcmVkSGFzTm9GYWxsVGhyb3VnaCAmJiBQcmV2QkIuaXNTdWNjZXNzb3IoTUJCKSAmJgorICAgICAgICAgICAgICBQcmlvclRCQiAhPSBNQkIgJiYgUHJpb3JGQkIgIT0gTUJCKSB7CisgICAgICAgICAgICBpZiAoUHJpb3JUQkIgPT0gMCkgeworICAgICAgICAgICAgICBhc3NlcnQoUHJpb3JDb25kLmVtcHR5KCkgJiYgUHJpb3JGQkIgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgIkJhZCBicmFuY2ggYW5hbHlzaXMiKTsKKyAgICAgICAgICAgICAgUHJpb3JUQkIgPSBNQkI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBhc3NlcnQoUHJpb3JGQkIgPT0gMCAmJiAiTWFjaGluZSBDRkcgb3V0IG9mIGRhdGUhIik7CisgICAgICAgICAgICAgIFByaW9yRkJCID0gTUJCOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVElJLT5SZW1vdmVCcmFuY2goUHJldkJCKTsKKyAgICAgICAgICAgIFRJSS0+SW5zZXJ0QnJhbmNoKFByZXZCQiwgUHJpb3JUQkIsIFByaW9yRkJCLCBQcmlvckNvbmQsIGRsKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBwcmVkZWNlc3NvcnMsIHJldmVjdG9yaW5nIGVhY2ggaW4tdHVybi4KKyAgICAgICAgICBzaXplX3QgUEkgPSAwOworICAgICAgICAgIGJvb2wgRGlkQ2hhbmdlID0gZmFsc2U7CisgICAgICAgICAgYm9vbCBIYXNCcmFuY2hUb1NlbGYgPSBmYWxzZTsKKyAgICAgICAgICB3aGlsZShQSSAhPSBNQkItPnByZWRfc2l6ZSgpKSB7CisgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUE1CQiA9ICooTUJCLT5wcmVkX2JlZ2luKCkgKyBQSSk7CisgICAgICAgICAgICBpZiAoUE1CQiA9PSBNQkIpIHsKKyAgICAgICAgICAgICAgLy8gSWYgdGhpcyBibG9jayBoYXMgYW4gdW5jb25kIGJyYW5jaCB0byBpdHNlbGYsIGxlYXZlIGl0LgorICAgICAgICAgICAgICArK1BJOworICAgICAgICAgICAgICBIYXNCcmFuY2hUb1NlbGYgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgRGlkQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgUE1CQi0+UmVwbGFjZVVzZXNPZkJsb2NrV2l0aChNQkIsIEN1clRCQik7CisgICAgICAgICAgICAgIC8vIElmIHRoaXMgY2hhbmdlIHJlc3VsdGVkIGluIFBNQkIgZW5kaW5nIGluIGEgY29uZGl0aW9uYWwKKyAgICAgICAgICAgICAgLy8gYnJhbmNoIHdoZXJlIGJvdGggY29uZGl0aW9ucyBnbyB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoaXMgdG8gYW4gdW5jb25kaXRpb25hbCBicmFuY2ggKGFuZCBmaXggdGhlIENGRykuCisgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdDdXJUQkIgPSAwLCAqTmV3Q3VyRkJCID0gMDsKKyAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDQ+IE5ld0N1ckNvbmQ7CisgICAgICAgICAgICAgIGJvb2wgTmV3Q3VyVW5BbmFseXphYmxlID0gVElJLT5BbmFseXplQnJhbmNoKCpQTUJCLCBOZXdDdXJUQkIsCisgICAgICAgICAgICAgICAgICAgICAgTmV3Q3VyRkJCLCBOZXdDdXJDb25kLCB0cnVlKTsKKyAgICAgICAgICAgICAgaWYgKCFOZXdDdXJVbkFuYWx5emFibGUgJiYgTmV3Q3VyVEJCICYmIE5ld0N1clRCQiA9PSBOZXdDdXJGQkIpIHsKKyAgICAgICAgICAgICAgICBUSUktPlJlbW92ZUJyYW5jaCgqUE1CQik7CisgICAgICAgICAgICAgICAgTmV3Q3VyQ29uZC5jbGVhcigpOworICAgICAgICAgICAgICAgIFRJSS0+SW5zZXJ0QnJhbmNoKCpQTUJCLCBOZXdDdXJUQkIsIDAsIE5ld0N1ckNvbmQsIGRsKTsKKyAgICAgICAgICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICArK051bUJyYW5jaE9wdHM7CisgICAgICAgICAgICAgICAgUE1CQi0+Q29ycmVjdEV4dHJhQ0ZHRWRnZXMoTmV3Q3VyVEJCLCAwLCBmYWxzZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBDaGFuZ2UgYW55IGp1bXB0YWJsZXMgdG8gZ28gdG8gdGhlIG5ldyBNQkIuCisgICAgICAgICAgaWYgKE1hY2hpbmVKdW1wVGFibGVJbmZvICpNSlRJID0gTUYuZ2V0SnVtcFRhYmxlSW5mbygpKQorICAgICAgICAgICAgTUpUSS0+UmVwbGFjZU1CQkluSnVtcFRhYmxlcyhNQkIsIEN1clRCQik7CisgICAgICAgICAgaWYgKERpZENoYW5nZSkgeworICAgICAgICAgICAgKytOdW1CcmFuY2hPcHRzOworICAgICAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgICAgICBpZiAoIUhhc0JyYW5jaFRvU2VsZikgcmV0dXJuIE1hZGVDaGFuZ2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEFkZCB0aGUgYnJhbmNoIGJhY2sgaWYgdGhlIGJsb2NrIGlzIG1vcmUgdGhhbiBqdXN0IGFuIHVuY29uZCBicmFuY2guCisgICAgICBUSUktPkluc2VydEJyYW5jaCgqTUJCLCBDdXJUQkIsIDAsIEN1ckNvbmQsIGRsKTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgcHJpb3IgYmxvY2sgZG9lc24ndCBmYWxsIHRocm91Z2ggaW50byB0aGlzIGJsb2NrLCBhbmQgaWYgdGhpcworICAvLyBibG9jayBkb2Vzbid0IGZhbGwgdGhyb3VnaCBpbnRvIHNvbWUgb3RoZXIgYmxvY2ssIHNlZSBpZiB3ZSBjYW4gZmluZCBhCisgIC8vIHBsYWNlIHRvIG1vdmUgdGhpcyBibG9jayB3aGVyZSBhIGZhbGwtdGhyb3VnaCB3aWxsIGhhcHBlbi4KKyAgaWYgKCFQcmV2QkIuY2FuRmFsbFRocm91Z2goKSkgeworCisgICAgLy8gTm93IHdlIGtub3cgdGhhdCB0aGVyZSB3YXMgbm8gZmFsbC10aHJvdWdoIGludG8gdGhpcyBibG9jaywgY2hlY2sgdG8KKyAgICAvLyBzZWUgaWYgaXQgaGFzIGEgZmFsbC10aHJvdWdoIGludG8gaXRzIHN1Y2Nlc3Nvci4KKyAgICBib29sIEN1ckZhbGxzVGhydSA9IE1CQi0+Y2FuRmFsbFRocm91Z2goKTsKKworICAgIHsKKyAgICAgIC8vIENoZWNrIGFsbCB0aGUgcHJlZGVjZXNzb3JzIG9mIHRoaXMgYmxvY2suICBJZiBvbmUgb2YgdGhlbSBoYXMgbm8gZmFsbAorICAgICAgLy8gdGhyb3VnaHMsIG1vdmUgdGhpcyBibG9jayByaWdodCBhZnRlciBpdC4KKyAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnByZWRfaXRlcmF0b3IgUEkgPSBNQkItPnByZWRfYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE1CQi0+cHJlZF9lbmQoKTsgUEkgIT0gRTsgKytQSSkgeworICAgICAgICAvLyBBbmFseXplIHRoZSBicmFuY2ggYXQgdGhlIGVuZCBvZiB0aGUgcHJlZC4KKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWRCQiA9ICpQSTsKKyAgICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBQcmVkRmFsbHRocm91Z2ggPSBQcmVkQkI7ICsrUHJlZEZhbGx0aHJvdWdoOworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZFRCQiA9IDAsICpQcmVkRkJCID0gMDsKKyAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDQ+IFByZWRDb25kOworICAgICAgICBpZiAoUHJlZEJCICE9IE1CQiAmJiAhUHJlZEJCLT5jYW5GYWxsVGhyb3VnaCgpICYmCisgICAgICAgICAgICAhVElJLT5BbmFseXplQnJhbmNoKCpQcmVkQkIsIFByZWRUQkIsIFByZWRGQkIsIFByZWRDb25kLCB0cnVlKQorICAgICAgICAgICAgJiYgKCFDdXJGYWxsc1RocnUgfHwgIUN1clRCQiB8fCAhQ3VyRkJCKQorICAgICAgICAgICAgJiYgKCFDdXJGYWxsc1RocnUgfHwgTUJCLT5nZXROdW1iZXIoKSA+PSBQcmVkQkItPmdldE51bWJlcigpKSkgeworICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGJsb2NrIGRvZXNuJ3QgZmFsbCB0aHJvdWdoLCBqdXN0IG1vdmUgaXQuCisgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgYmxvY2sgY2FuIGZhbGwgdGhyb3VnaCBhbmQgZG9lcyBub3QgZW5kIHdpdGggYQorICAgICAgICAgIC8vIGNvbmRpdGlvbmFsIGJyYW5jaCwgd2UgbmVlZCB0byBhcHBlbmQgYW4gdW5jb25kaXRpb25hbCBqdW1wIHRvCisgICAgICAgICAgLy8gdGhlIChjdXJyZW50KSBuZXh0IGJsb2NrLiAgVG8gYXZvaWQgYSBwb3NzaWJsZSBjb21waWxlLXRpbWUKKyAgICAgICAgICAvLyBpbmZpbml0ZSBsb29wLCBtb3ZlIGJsb2NrcyBvbmx5IGJhY2t3YXJkIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAvLyBBbHNvLCBpZiB0aGVyZSBhcmUgYWxyZWFkeSAyIGJyYW5jaGVzIGhlcmUsIHdlIGNhbm5vdCBhZGQgYSB0aGlyZDsKKyAgICAgICAgICAvLyB0aGlzIG1lYW5zIHdlIGhhdmUgdGhlIGNhc2UKKyAgICAgICAgICAvLyBCY2MgbmV4dAorICAgICAgICAgIC8vIEIgZWxzZXdoZXJlCisgICAgICAgICAgLy8gbmV4dDoKKyAgICAgICAgICBpZiAoQ3VyRmFsbHNUaHJ1KSB7CisgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV4dEJCID0gbGx2bTo6bmV4dChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKE1CQikpOworICAgICAgICAgICAgQ3VyQ29uZC5jbGVhcigpOworICAgICAgICAgICAgVElJLT5JbnNlcnRCcmFuY2goKk1CQiwgTmV4dEJCLCAwLCBDdXJDb25kLCBkbCk7CisgICAgICAgICAgfQorICAgICAgICAgIE1CQi0+bW92ZUFmdGVyKFByZWRCQik7CisgICAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgICAgZ290byBSZW9wdGltaXplQmxvY2s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIUN1ckZhbGxzVGhydSkgeworICAgICAgLy8gQ2hlY2sgYWxsIHN1Y2Nlc3NvcnMgdG8gc2VlIGlmIHdlIGNhbiBtb3ZlIHRoaXMgYmxvY2sgYmVmb3JlIGl0LgorICAgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6c3VjY19pdGVyYXRvciBTSSA9IE1CQi0+c3VjY19iZWdpbigpLAorICAgICAgICAgICBFID0gTUJCLT5zdWNjX2VuZCgpOyBTSSAhPSBFOyArK1NJKSB7CisgICAgICAgIC8vIEFuYWx5emUgdGhlIGJyYW5jaCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayBiZWZvcmUgdGhlIHN1Y2MuCisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjQkIgPSAqU0k7CisgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgU3VjY1ByZXYgPSBTdWNjQkI7IC0tU3VjY1ByZXY7CisKKyAgICAgICAgLy8gSWYgdGhpcyBibG9jayBkb2Vzbid0IGFscmVhZHkgZmFsbC10aHJvdWdoIHRvIHRoYXQgc3VjY2Vzc29yLCBhbmQgaWYKKyAgICAgICAgLy8gdGhlIHN1Y2MgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBibG9jayB0aGF0IGNhbiBmYWxsIHRocm91Z2ggaW50byBpdCwKKyAgICAgICAgLy8gYW5kIGlmIHRoZSBzdWNjZXNzb3IgaXNuJ3QgYW4gRUggZGVzdGluYXRpb24sIHdlIGNhbiBhcnJhbmdlIGZvciB0aGUKKyAgICAgICAgLy8gZmFsbHRocm91Z2ggdG8gaGFwcGVuLgorICAgICAgICBpZiAoU3VjY0JCICE9IE1CQiAmJiAmKlN1Y2NQcmV2ICE9IE1CQiAmJgorICAgICAgICAgICAgIVN1Y2NQcmV2LT5jYW5GYWxsVGhyb3VnaCgpICYmICFDdXJVbkFuYWx5emFibGUpIHsKKyAgICAgICAgICBNQkItPm1vdmVCZWZvcmUoU3VjY0JCKTsKKyAgICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICBnb3RvIFJlb3B0aW1pemVCbG9jazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBPa2F5LCB0aGVyZSBpcyBubyByZWFsbHkgZ3JlYXQgcGxhY2UgdG8gcHV0IHRoaXMgYmxvY2suICBJZiwgaG93ZXZlciwKKyAgICAgIC8vIHRoZSBibG9jayBiZWZvcmUgdGhpcyBvbmUgd291bGQgYmUgYSBmYWxsLXRocm91Z2ggaWYgdGhpcyBibG9jayB3ZXJlCisgICAgICAvLyByZW1vdmVkLCBtb3ZlIHRoaXMgYmxvY2sgdG8gdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUHJldlRCQiA9IDAsICpQcmV2RkJCID0gMDsKKyAgICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kLCA0PiBQcmV2Q29uZDsKKyAgICAgIGlmIChGYWxsVGhyb3VnaCAhPSBNRi5lbmQoKSAmJgorICAgICAgICAgICFUSUktPkFuYWx5emVCcmFuY2goUHJldkJCLCBQcmV2VEJCLCBQcmV2RkJCLCBQcmV2Q29uZCwgdHJ1ZSkgJiYKKyAgICAgICAgICBQcmV2QkIuaXNTdWNjZXNzb3IoRmFsbFRocm91Z2gpKSB7CisgICAgICAgIE1CQi0+bW92ZUFmdGVyKC0tTUYuZW5kKCkpOworICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE1hZGVDaGFuZ2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9CcmFuY2hGb2xkaW5nLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9CcmFuY2hGb2xkaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkZmE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0JyYW5jaEZvbGRpbmcuaApAQCAtMCwwICsxLDExNiBAQAorLy89PT0tLSBCcmFuY2hGb2xkaW5nLmggLSBGb2xkIG1hY2hpbmUgY29kZSBicmFuY2ggaW5zdHJ1Y3Rpb25zIC0tKi0gQysrIC0qPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fQlJBTkNIRk9MRElOR19IUFAKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0JSQU5DSEZPTERJTkdfSFBQCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworICBjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKKyAgY2xhc3MgUmVnU2NhdmVuZ2VyOworICBjbGFzcyBUYXJnZXRJbnN0ckluZm87CisgIGNsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworCisgIGNsYXNzIEJyYW5jaEZvbGRlciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcmFuY2hGb2xkZXIoYm9vbCBkZWZhdWx0RW5hYmxlVGFpbE1lcmdlKTsKKworICAgIGJvb2wgT3B0aW1pemVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKnRpaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICp0cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICptbWkpOworICBwcml2YXRlOgorICAgIGNsYXNzIE1lcmdlUG90ZW50aWFsc0VsdCB7CisgICAgICB1bnNpZ25lZCBIYXNoOworICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJsb2NrOworICAgIHB1YmxpYzoKKyAgICAgIE1lcmdlUG90ZW50aWFsc0VsdCh1bnNpZ25lZCBoLCBNYWNoaW5lQmFzaWNCbG9jayAqYikKKyAgICAgICAgOiBIYXNoKGgpLCBCbG9jayhiKSB7fQorCisgICAgICB1bnNpZ25lZCBnZXRIYXNoKCkgY29uc3QgeyByZXR1cm4gSGFzaDsgfQorICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKmdldEJsb2NrKCkgY29uc3QgeyByZXR1cm4gQmxvY2s7IH0KKworICAgICAgdm9pZCBzZXRCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgICAgICAgIEJsb2NrID0gTUJCOworICAgICAgfQorCisgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBNZXJnZVBvdGVudGlhbHNFbHQgJikgY29uc3Q7CisgICAgfTsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE1lcmdlUG90ZW50aWFsc0VsdD46Oml0ZXJhdG9yIE1QSXRlcmF0b3I7CisgICAgc3RkOjp2ZWN0b3I8TWVyZ2VQb3RlbnRpYWxzRWx0PiBNZXJnZVBvdGVudGlhbHM7CisKKyAgICBjbGFzcyBTYW1lVGFpbEVsdCB7CisgICAgICBNUEl0ZXJhdG9yIE1QSXRlcjsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBUYWlsU3RhcnRQb3M7CisgICAgcHVibGljOgorICAgICAgU2FtZVRhaWxFbHQoTVBJdGVyYXRvciBtcCwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIHRzcCkKKyAgICAgICAgOiBNUEl0ZXIobXApLCBUYWlsU3RhcnRQb3ModHNwKSB7fQorCisgICAgICBNUEl0ZXJhdG9yIGdldE1QSXRlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE1QSXRlcjsKKyAgICAgIH0KKyAgICAgIE1lcmdlUG90ZW50aWFsc0VsdCAmZ2V0TWVyZ2VQb3RlbnRpYWxzRWx0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gKmdldE1QSXRlcigpOworICAgICAgfQorICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGdldFRhaWxTdGFydFBvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFRhaWxTdGFydFBvczsKKyAgICAgIH0KKyAgICAgIHVuc2lnbmVkIGdldEhhc2goKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRNZXJnZVBvdGVudGlhbHNFbHQoKS5nZXRIYXNoKCk7CisgICAgICB9CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0QmxvY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRNZXJnZVBvdGVudGlhbHNFbHQoKS5nZXRCbG9jaygpOworICAgICAgfQorICAgICAgYm9vbCB0YWlsSXNXaG9sZUJsb2NrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gVGFpbFN0YXJ0UG9zID09IGdldEJsb2NrKCktPmJlZ2luKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQgc2V0QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICAgICAgICBnZXRNZXJnZVBvdGVudGlhbHNFbHQoKS5zZXRCbG9jayhNQkIpOworICAgICAgfQorICAgICAgdm9pZCBzZXRUYWlsU3RhcnRQb3MoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFBvcykgeworICAgICAgICBUYWlsU3RhcnRQb3MgPSBQb3M7CisgICAgICB9CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxTYW1lVGFpbEVsdD4gU2FtZVRhaWxzOworCisgICAgYm9vbCBFbmFibGVUYWlsTWVyZ2U7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgICAgTWFjaGluZU1vZHVsZUluZm8gKk1NSTsKKyAgICBSZWdTY2F2ZW5nZXIgKlJTOworCisgICAgYm9vbCBUYWlsTWVyZ2VCbG9ja3MoTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgYm9vbCBUcnlUYWlsTWVyZ2VCbG9ja3MoTWFjaGluZUJhc2ljQmxvY2sqIFN1Y2NCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIFByZWRCQik7CisgICAgdm9pZCBSZXBsYWNlVGFpbFdpdGhCcmFuY2hUbyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgT2xkSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdEZXN0KTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3BsaXRNQkJBdChNYWNoaW5lQmFzaWNCbG9jayAmQ3VyTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkxKTsKKyAgICB1bnNpZ25lZCBDb21wdXRlU2FtZVRhaWxzKHVuc2lnbmVkIEN1ckhhc2gsIHVuc2lnbmVkIG1pbkNvbW1vblRhaWxMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWRCQik7CisgICAgdm9pZCBSZW1vdmVCbG9ja3NXaXRoSGFzaCh1bnNpZ25lZCBDdXJIYXNoLCBNYWNoaW5lQmFzaWNCbG9jayogU3VjY0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIFByZWRCQik7CisgICAgYm9vbCBDcmVhdGVDb21tb25UYWlsT25seUJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrIComUHJlZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXhDb21tb25UYWlsTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmY29tbW9uVGFpbEluZGV4KTsKKworICAgIGJvb2wgT3B0aW1pemVCcmFuY2hlcyhNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKyAgICBib29sIE9wdGltaXplQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisgICAgdm9pZCBSZW1vdmVEZWFkQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisgICAgYm9vbCBPcHRpbWl6ZUltcERlZnNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKyAgfTsKK30KKworI2VuZGlmIC8qIExMVk1fQ09ERUdFTl9CUkFOQ0hGT0xESU5HX0hQUCAqLwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWUyNzBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4NSBAQAorYWRkX2xsdm1fbGlicmFyeShMTFZNQ29kZUdlbgorICBBZ2dyZXNzaXZlQW50aURlcEJyZWFrZXIuY3BwCisgIEFuYWx5c2lzLmNwcAorICBCcmFuY2hGb2xkaW5nLmNwcAorICBDYWxjU3BpbGxXZWlnaHRzLmNwcAorICBDYWxsaW5nQ29udkxvd2VyLmNwcAorICBDb2RlUGxhY2VtZW50T3B0LmNwcAorICBDcml0aWNhbEFudGlEZXBCcmVha2VyLmNwcAorICBEZWFkTWFjaGluZUluc3RydWN0aW9uRWxpbS5jcHAKKyAgRHdhcmZFSFByZXBhcmUuY3BwCisgIEVMRkNvZGVFbWl0dGVyLmNwcAorICBFTEZXcml0ZXIuY3BwCisgIEdDTWV0YWRhdGEuY3BwCisgIEdDTWV0YWRhdGFQcmludGVyLmNwcAorICBHQ1N0cmF0ZWd5LmNwcAorICBJZkNvbnZlcnNpb24uY3BwCisgIElubGluZVNwaWxsZXIuY3BwCisgIEludHJpbnNpY0xvd2VyaW5nLmNwcAorICBMTFZNVGFyZ2V0TWFjaGluZS5jcHAKKyAgTGF0ZW5jeVByaW9yaXR5UXVldWUuY3BwCisgIExpdmVJbnRlcnZhbC5jcHAKKyAgTGl2ZUludGVydmFsQW5hbHlzaXMuY3BwCisgIExpdmVTdGFja0FuYWx5c2lzLmNwcAorICBMaXZlVmFyaWFibGVzLmNwcAorICBMb3dlclN1YnJlZ3MuY3BwCisgIE1hY2hpbmVCYXNpY0Jsb2NrLmNwcAorICBNYWNoaW5lQ1NFLmNwcAorICBNYWNoaW5lRG9taW5hdG9ycy5jcHAKKyAgTWFjaGluZUZ1bmN0aW9uLmNwcAorICBNYWNoaW5lRnVuY3Rpb25BbmFseXNpcy5jcHAKKyAgTWFjaGluZUZ1bmN0aW9uUGFzcy5jcHAKKyAgTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3MuY3BwCisgIE1hY2hpbmVJbnN0ci5jcHAKKyAgTWFjaGluZUxJQ00uY3BwCisgIE1hY2hpbmVMb29wSW5mby5jcHAKKyAgTWFjaGluZU1vZHVsZUluZm8uY3BwCisgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbHMuY3BwCisgIE1hY2hpbmVQYXNzUmVnaXN0cnkuY3BwCisgIE1hY2hpbmVSZWdpc3RlckluZm8uY3BwCisgIE1hY2hpbmVTU0FVcGRhdGVyLmNwcAorICBNYWNoaW5lU2luay5jcHAKKyAgTWFjaGluZVZlcmlmaWVyLmNwcAorICBPYmplY3RDb2RlRW1pdHRlci5jcHAKKyAgT2NhbWxHQy5jcHAKKyAgT3B0aW1pemVQSElzLmNwcAorICBQSElFbGltaW5hdGlvbi5jcHAKKyAgUGFzc2VzLmNwcAorICBQZWVwaG9sZU9wdGltaXplci5jcHAKKyAgUG9zdFJBSGF6YXJkUmVjb2duaXplci5jcHAKKyAgUG9zdFJBU2NoZWR1bGVyTGlzdC5jcHAKKyAgUHJlQWxsb2NTcGxpdHRpbmcuY3BwCisgIFByb2Nlc3NJbXBsaWNpdERlZnMuY3BwCisgIFByb2xvZ0VwaWxvZ0luc2VydGVyLmNwcAorICBQc2V1ZG9Tb3VyY2VWYWx1ZS5jcHAKKyAgUmVnQWxsb2NGYXN0LmNwcAorICBSZWdBbGxvY0xpbmVhclNjYW4uY3BwCisgIFJlZ0FsbG9jUEJRUC5jcHAKKyAgUmVnaXN0ZXJDb2FsZXNjZXIuY3BwCisgIFJlZ2lzdGVyU2NhdmVuZ2luZy5jcHAKKyAgUmVuZGVyTWFjaGluZUZ1bmN0aW9uLmNwcAorICBTY2hlZHVsZURBRy5jcHAKKyAgU2NoZWR1bGVEQUdFbWl0LmNwcAorICBTY2hlZHVsZURBR0luc3Rycy5jcHAKKyAgU2NoZWR1bGVEQUdQcmludGVyLmNwcAorICBTaGFkb3dTdGFja0dDLmNwcAorICBTaHJpbmtXcmFwcGluZy5jcHAKKyAgU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcAorICBTakxqRUhQcmVwYXJlLmNwcAorICBTbG90SW5kZXhlcy5jcHAKKyAgU3BpbGxlci5jcHAKKyAgU3BsaXRLaXQuY3BwCisgIFNwbGl0dGVyLmNwcAorICBTdGFja1Byb3RlY3Rvci5jcHAKKyAgU3RhY2tTbG90Q29sb3JpbmcuY3BwCisgIFN0cm9uZ1BISUVsaW1pbmF0aW9uLmNwcAorICBUYWlsRHVwbGljYXRpb24uY3BwCisgIFRhcmdldEluc3RySW5mb0ltcGwuY3BwCisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUltcGwuY3BwCisgIFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3MuY3BwCisgIFVucmVhY2hhYmxlQmxvY2tFbGltLmNwcAorICBWaXJ0UmVnTWFwLmNwcAorICBWaXJ0UmVnUmV3cml0ZXIuY3BwCisgICkKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChMTFZNQ29kZUdlbiBMTFZNQ29yZSBMTFZNU2NhbGFyT3B0cykKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0NhbGNTcGlsbFdlaWdodHMuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vQ2FsY1NwaWxsV2VpZ2h0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjY2U0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0NhbGNTcGlsbFdlaWdodHMuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDYWxjU3BpbGxXZWlnaHRzLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImNhbGNzcGlsbHdlaWdodHMiCisKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsY1NwaWxsV2VpZ2h0cy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworY2hhciBDYWxjdWxhdGVTcGlsbFdlaWdodHM6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhDYWxjdWxhdGVTcGlsbFdlaWdodHMsICJjYWxjc3BpbGx3ZWlnaHRzIiwKKyAgICAgICAgICAgICAgICAiQ2FsY3VsYXRlIHNwaWxsIHdlaWdodHMiLCBmYWxzZSwgZmFsc2UpOworCit2b2lkIENhbGN1bGF0ZVNwaWxsV2VpZ2h0czo6Z2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZhdSkgY29uc3QgeworICBhdS5hZGRSZXF1aXJlZDxMaXZlSW50ZXJ2YWxzPigpOworICBhdS5hZGRSZXF1aXJlZDxNYWNoaW5lTG9vcEluZm8+KCk7CisgIGF1LnNldFByZXNlcnZlc0FsbCgpOworICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKGF1KTsKK30KKworYm9vbCBDYWxjdWxhdGVTcGlsbFdlaWdodHM6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmZm4pIHsKKworICBERUJVRyhkYmdzKCkgPDwgIioqKioqKioqKiogQ29tcHV0ZSBTcGlsbCBXZWlnaHRzICoqKioqKioqKipcbiIKKyAgICAgICAgICAgICAgIDw8ICIqKioqKioqKioqIEZ1bmN0aW9uOiAiCisgICAgICAgICAgICAgICA8PCBmbi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkgPDwgJ1xuJyk7CisKKyAgTGl2ZUludGVydmFscyAmbGlzID0gZ2V0QW5hbHlzaXM8TGl2ZUludGVydmFscz4oKTsKKyAgVmlydFJlZ0F1eEluZm8gdnJhaShmbiwgbGlzLCBnZXRBbmFseXNpczxNYWNoaW5lTG9vcEluZm8+KCkpOworICBmb3IgKExpdmVJbnRlcnZhbHM6Oml0ZXJhdG9yIEkgPSBsaXMuYmVnaW4oKSwgRSA9IGxpcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBMaXZlSW50ZXJ2YWwgJmxpID0gKkktPnNlY29uZDsKKyAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihsaS5yZWcpKQorICAgICAgdnJhaS5DYWxjdWxhdGVXZWlnaHRBbmRIaW50KGxpKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybiB0aGUgcHJlZmVycmVkIGFsbG9jYXRpb24gcmVnaXN0ZXIgZm9yIHJlZywgZ2l2ZW4gYSBDT1BZIGluc3RydWN0aW9uLgorc3RhdGljIHVuc2lnbmVkIGNvcHlIaW50KGNvbnN0IE1hY2hpbmVJbnN0ciAqbWksIHVuc2lnbmVkIHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJnRyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZtcmkpIHsKKyAgdW5zaWduZWQgc3ViLCBocmVnLCBoc3ViOworICBpZiAobWktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgPT0gcmVnKSB7CisgICAgc3ViID0gbWktPmdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCk7CisgICAgaHJlZyA9IG1pLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgIGhzdWIgPSBtaS0+Z2V0T3BlcmFuZCgxKS5nZXRTdWJSZWcoKTsKKyAgfSBlbHNlIHsKKyAgICBzdWIgPSBtaS0+Z2V0T3BlcmFuZCgxKS5nZXRTdWJSZWcoKTsKKyAgICBocmVnID0gbWktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgaHN1YiA9IG1pLT5nZXRPcGVyYW5kKDApLmdldFN1YlJlZygpOworICB9CisKKyAgaWYgKCFocmVnKQorICAgIHJldHVybiAwOworCisgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKGhyZWcpKQorICAgIHJldHVybiBzdWIgPT0gaHN1YiA/IGhyZWcgOiAwOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKnJjID0gbXJpLmdldFJlZ0NsYXNzKHJlZyk7CisKKyAgLy8gT25seSBhbGxvdyBwaHlzcmVnIGhpbnRzIGluIHJjLgorICBpZiAoc3ViID09IDApCisgICAgcmV0dXJuIHJjLT5jb250YWlucyhocmVnKSA/IGhyZWcgOiAwOworCisgIC8vIHJlZzpzdWIgc2hvdWxkIG1hdGNoIHRoZSBwaHlzcmVnIGhyZWcuCisgIHJldHVybiB0cmkuZ2V0TWF0Y2hpbmdTdXBlclJlZyhocmVnLCBzdWIsIHJjKTsKK30KKwordm9pZCBWaXJ0UmVnQXV4SW5mbzo6Q2FsY3VsYXRlV2VpZ2h0QW5kSGludChMaXZlSW50ZXJ2YWwgJmxpKSB7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJm1yaSA9IG1mXy5nZXRSZWdJbmZvKCk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmdHJpID0gKm1mXy5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKm1iYiA9IDA7CisgIE1hY2hpbmVMb29wICpsb29wID0gMDsKKyAgdW5zaWduZWQgbG9vcERlcHRoID0gMDsKKyAgYm9vbCBpc0V4aXRpbmcgPSBmYWxzZTsKKyAgZmxvYXQgdG90YWxXZWlnaHQgPSAwOworICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA4PiB2aXNpdGVkOworCisgIC8vIEZpbmQgdGhlIGJlc3QgcGh5c3JlZyBoaXN0IGFuZCB0aGUgYmVzdCB2aXJ0cmVnIGhpbnQuCisgIGZsb2F0IGJlc3RQaHlzID0gMCwgYmVzdFZpcnQgPSAwOworICB1bnNpZ25lZCBoaW50UGh5cyA9IDAsIGhpbnRWaXJ0ID0gMDsKKworICAvLyBEb24ndCByZWNvbXB1dGUgYSB0YXJnZXQgc3BlY2lmaWMgaGludC4KKyAgYm9vbCBub0hpbnQgPSBtcmkuZ2V0UmVnQWxsb2NhdGlvbkhpbnQobGkucmVnKS5maXJzdCAhPSAwOworCisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6cmVnX2l0ZXJhdG9yIEkgPSBtcmkucmVnX2JlZ2luKGxpLnJlZyk7CisgICAgICAgTWFjaGluZUluc3RyICptaSA9IEkuc2tpcEluc3RydWN0aW9uKCk7KSB7CisgICAgaWYgKG1pLT5pc0lkZW50aXR5Q29weSgpIHx8IG1pLT5pc0ltcGxpY2l0RGVmKCkgfHwgbWktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKCF2aXNpdGVkLmluc2VydChtaSkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEdldCBsb29wIGluZm8gZm9yIG1pLgorICAgIGlmIChtaS0+Z2V0UGFyZW50KCkgIT0gbWJiKSB7CisgICAgICBtYmIgPSBtaS0+Z2V0UGFyZW50KCk7CisgICAgICBsb29wID0gbG9vcHNfLmdldExvb3BGb3IobWJiKTsKKyAgICAgIGxvb3BEZXB0aCA9IGxvb3AgPyBsb29wLT5nZXRMb29wRGVwdGgoKSA6IDA7CisgICAgICBpc0V4aXRpbmcgPSBsb29wID8gbG9vcC0+aXNMb29wRXhpdGluZyhtYmIpIDogZmFsc2U7CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIGluc3RyIHdlaWdodC4KKyAgICBib29sIHJlYWRzLCB3cml0ZXM7CisgICAgdGllKHJlYWRzLCB3cml0ZXMpID0gbWktPnJlYWRzV3JpdGVzVmlydHVhbFJlZ2lzdGVyKGxpLnJlZyk7CisgICAgZmxvYXQgd2VpZ2h0ID0gTGl2ZUludGVydmFsczo6Z2V0U3BpbGxXZWlnaHQod3JpdGVzLCByZWFkcywgbG9vcERlcHRoKTsKKworICAgIC8vIEdpdmUgZXh0cmEgd2VpZ2h0IHRvIHdoYXQgbG9va3MgbGlrZSBhIGxvb3AgaW5kdWN0aW9uIHZhcmlhYmxlIHVwZGF0ZS4KKyAgICBpZiAod3JpdGVzICYmIGlzRXhpdGluZyAmJiBsaXNfLmlzTGl2ZU91dE9mTUJCKGxpLCBtYmIpKQorICAgICAgd2VpZ2h0ICo9IDM7CisKKyAgICB0b3RhbFdlaWdodCArPSB3ZWlnaHQ7CisKKyAgICAvLyBHZXQgYWxsb2NhdGlvbiBoaW50cyBmcm9tIGNvcGllcy4KKyAgICBpZiAobm9IaW50IHx8ICFtaS0+aXNDb3B5KCkpCisgICAgICBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBoaW50ID0gY29weUhpbnQobWksIGxpLnJlZywgdHJpLCBtcmkpOworICAgIGlmICghaGludCkKKyAgICAgIGNvbnRpbnVlOworICAgIGZsb2F0IGh3ZWlnaHQgPSBoaW50X1toaW50XSArPSB3ZWlnaHQ7CisgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKGhpbnQpKSB7CisgICAgICBpZiAoaHdlaWdodCA+IGJlc3RQaHlzICYmIGxpc18uaXNBbGxvY2F0YWJsZShoaW50KSkKKyAgICAgICAgYmVzdFBoeXMgPSBod2VpZ2h0LCBoaW50UGh5cyA9IGhpbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChod2VpZ2h0ID4gYmVzdFZpcnQpCisgICAgICAgIGJlc3RWaXJ0ID0gaHdlaWdodCwgaGludFZpcnQgPSBoaW50OworICAgIH0KKyAgfQorCisgIGhpbnRfLmNsZWFyKCk7CisKKyAgLy8gQWx3YXlzIHByZWZlciB0aGUgcGh5c3JlZyBoaW50LgorICBpZiAodW5zaWduZWQgaGludCA9IGhpbnRQaHlzID8gaGludFBoeXMgOiBoaW50VmlydCkgeworICAgIG1yaS5zZXRSZWdBbGxvY2F0aW9uSGludChsaS5yZWcsIDAsIGhpbnQpOworICAgIC8vIFdlYWtseSBib29zdCB0aGUgc3BpbGwgd2VpZmdodCBvZiBoaW50ZWQgcmVnaXN0ZXJzLgorICAgIHRvdGFsV2VpZ2h0ICo9IDEuMDFGOworICB9CisKKyAgLy8gTWFyayBsaSBhcyB1bnNwaWxsYWJsZSBpZiBhbGwgbGl2ZSByYW5nZXMgYXJlIHRpbnkuCisgIGlmIChsaS5pc1plcm9MZW5ndGgoKSkgeworICAgIGxpLm1hcmtOb3RTcGlsbGFibGUoKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJZiBhbGwgb2YgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBpbnRlcnZhbCBhcmUgcmUtbWF0ZXJpYWxpemFibGUsCisgIC8vIGl0IGlzIGEgcHJlZmVycmVkIGNhbmRpZGF0ZSBmb3Igc3BpbGxpbmcuIElmIG5vbmUgb2YgdGhlIGRlZnMgYXJlCisgIC8vIGxvYWRzLCB0aGVuIGl0J3MgcG90ZW50aWFsbHkgdmVyeSBjaGVhcCB0byByZS1tYXRlcmlhbGl6ZS4KKyAgLy8gRklYTUU6IHRoaXMgZ2V0cyBtdWNoIG1vcmUgY29tcGxpY2F0ZWQgb25jZSB3ZSBzdXBwb3J0IG5vbi10cml2aWFsCisgIC8vIHJlLW1hdGVyaWFsaXphdGlvbi4KKyAgYm9vbCBpc0xvYWQgPSBmYWxzZTsKKyAgU21hbGxWZWN0b3I8TGl2ZUludGVydmFsKiwgND4gc3BpbGxJczsKKyAgaWYgKGxpc18uaXNSZU1hdGVyaWFsaXphYmxlKGxpLCBzcGlsbElzLCBpc0xvYWQpKSB7CisgICAgaWYgKGlzTG9hZCkKKyAgICAgIHRvdGFsV2VpZ2h0ICo9IDAuOUY7CisgICAgZWxzZQorICAgICAgdG90YWxXZWlnaHQgKj0gMC41RjsKKyAgfQorCisgIGxpLndlaWdodCA9IHRvdGFsV2VpZ2h0OworICBsaXNfLm5vcm1hbGl6ZVNwaWxsV2VpZ2h0KGxpKTsKK30KKwordm9pZCBWaXJ0UmVnQXV4SW5mbzo6Q2FsY3VsYXRlUmVnQ2xhc3ModW5zaWduZWQgcmVnKSB7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJm1yaSA9IG1mXy5nZXRSZWdJbmZvKCk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqdHJpID0gbWZfLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpvcmMgPSBtcmkuZ2V0UmVnQ2xhc3MocmVnKTsKKyAgU21hbGxQdHJTZXQ8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyosOD4gcmNzOworCisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6cmVnX25vZGJnX2l0ZXJhdG9yIEkgPSBtcmkucmVnX25vZGJnX2JlZ2luKHJlZyksCisgICAgICAgRSA9IG1yaS5yZWdfbm9kYmdfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgLy8gVGhlIHRhcmdldHMgZG9uJ3QgaGF2ZSBhY2N1cmF0ZSBlbm91Z2ggcmVnY2xhc3MgZGVzY3JpcHRpb25zIHRoYXQgd2UgY2FuCisgICAgLy8gaGFuZGxlIHN1YnJlZ3MuIFdlIG5lZWQgc29tZXRoaW5nIHNpbWlsYXIgdG8KKyAgICAvLyBUUkk6OmdldE1hdGNoaW5nU3VwZXJSZWdDbGFzcywgYnV0IHJldHVybmluZyBhIHN1cGVyIGNsYXNzIGluc3RlYWQgb2YgYQorICAgIC8vIHN1YiBjbGFzcy4KKyAgICBpZiAoSS5nZXRPcGVyYW5kKCkuZ2V0U3ViUmVnKCkpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQ2Fubm90IGhhbmRsZSBzdWJyZWdzOiAiIDw8IEkuZ2V0T3BlcmFuZCgpIDw8ICdcbicpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLT5nZXREZXNjKCkuZ2V0UmVnQ2xhc3MoSS5nZXRPcGVyYW5kTm8oKSwgdHJpKSkKKyAgICAgIHJjcy5pbnNlcnQocmMpOworICB9CisKKyAgLy8gSWYgd2UgZm91bmQgbm8gcmVnY2xhc3MgY29uc3RyYWludHMsIGp1c3QgbGVhdmUgcmVnIGFzIGlzLgorICAvLyBJbiB0aGVvcnksIHdlIGNvdWxkIGluZmxhdGUgdG8gdGhlIGxhcmdlc3Qgc3VwZXJjbGFzcyBvZiByZWcncyBleGlzdGluZworICAvLyBjbGFzcywgYnV0IHRoYXQgbWlnaHQgbm90IGJlIGxlZ2FsIGZvciB0aGUgY3VycmVudCBjcHUgc2V0dGluZy4KKyAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgcmVnIGlzIG9ubHkgdXNlZCBieSBDT1BZIGluc3RydWN0aW9ucywgc28gd2UgbWF5IG5lZWQKKyAgLy8gdG8gaW1wcm92ZSBvbiB0aGlzLgorICBpZiAocmNzLmVtcHR5KCkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIk5vdCBpbmZsYXRpbmcgdW5jb25zdHJhaW5lZCIgPDwgb3JjLT5nZXROYW1lKCkgPDwgIjolcmVnIgorICAgICAgICAgICAgICAgICA8PCByZWcgPDwgIi5cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIENvbXB1dGUgdGhlIGludGVyc2VjdGlvbiBvZiBhbGwgY2xhc3NlcyBpbiByY3MuCisgIC8vIFRoaXMgb3VnaHQgdG8gYmUgaW5kZXBlbmRlbnQgb2YgaXRlcmF0aW9uIG9yZGVyLCBidXQgaWYgdGhlIHRhcmdldCByZWdpc3RlcgorICAvLyBjbGFzc2VzIGRvbid0IGZvcm0gYSBwcm9wZXIgYWxnZWJyYSwgaXQgaXMgcG9zc2libGUgdG8gZ2V0IGRpZmZlcmVudAorICAvLyByZXN1bHRzLiBUaGUgc29sdXRpb24gaXMgdG8gbWFrZSBzdXJlIHRoZSBpbnRlcnNlY3Rpb24gb2YgYW55IHR3byByZWdpc3RlcgorICAvLyBjbGFzc2VzIGlzIGFsc28gYSByZWdpc3RlciBjbGFzcyBvciB0aGUgbnVsbCBzZXQuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKnJjID0gMDsKKyAgZm9yIChTbWFsbFB0clNldDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiw4Pjo6aXRlcmF0b3IgSSA9IHJjcy5iZWdpbigpLAorICAgICAgICAgRSA9IHJjcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICByYyA9IHJjID8gZ2V0Q29tbW9uU3ViQ2xhc3MocmMsICpJKSA6ICpJOworICAgIGFzc2VydChyYyAmJiAiSW5jb21wYXRpYmxlIHJlZ2NsYXNzIGNvbnN0cmFpbnRzIGZvdW5kIik7CisgIH0KKworICBpZiAocmMgPT0gb3JjKQorICAgIHJldHVybjsKKyAgREVCVUcoZGJncygpIDw8ICJJbmZsYXRpbmcgIiA8PCBvcmMtPmdldE5hbWUoKSA8PCAiOiVyZWciIDw8IHJlZyA8PCAiIHRvICIKKyAgICAgICAgICAgICAgIDw8IHJjLT5nZXROYW1lKCkgPDwiLlxuIik7CisgIG1yaS5zZXRSZWdDbGFzcyhyZWcsIHJjKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhZDgxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuY3BwCkBAIC0wLDAgKzEsMTc3IEBACisvLz09PS0tIENhbGxpbmdDb252TG93ZXIuY3BwIC0gQ2FsbGluZyBDb252ZW50aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBDQ1N0YXRlIGNsYXNzLCB1c2VkIGZvciBsb3dlcmluZyBhbmQgaW1wbGVtZW50aW5nCisvLyBjYWxsaW5nIGNvbnZlbnRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitDQ1N0YXRlOjpDQ1N0YXRlKENhbGxpbmdDb252OjpJRCBDQywgYm9vbCBpc1ZhckFyZywgY29uc3QgVGFyZ2V0TWFjaGluZSAmdG0sCisgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gJmxvY3MsIExMVk1Db250ZXh0ICZDKQorICA6IENhbGxpbmdDb252KENDKSwgSXNWYXJBcmcoaXNWYXJBcmcpLCBUTSh0bSksCisgICAgVFJJKCpUTS5nZXRSZWdpc3RlckluZm8oKSksIExvY3MobG9jcyksIENvbnRleHQoQykgeworICAvLyBObyBzdGFjayBpcyB1c2VkLgorICBTdGFja09mZnNldCA9IDA7CisgIAorICBVc2VkUmVncy5yZXNpemUoKFRSSS5nZXROdW1SZWdzKCkrMzEpLzMyKTsKK30KKworLy8gSGFuZGxlQnlWYWwgLSBBbGxvY2F0ZSBhIHN0YWNrIHNsb3QgbGFyZ2UgZW5vdWdoIHRvIHBhc3MgYW4gYXJndW1lbnQgYnkKKy8vIHZhbHVlLiBUaGUgc2l6ZSBhbmQgYWxpZ25tZW50IGluZm9ybWF0aW9uIG9mIHRoZSBhcmd1bWVudCBpcyBlbmNvZGVkIGluIGl0cworLy8gcGFyYW1ldGVyIGF0dHJpYnV0ZS4KK3ZvaWQgQ0NTdGF0ZTo6SGFuZGxlQnlWYWwodW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTWluU2l6ZSwgaW50IE1pbkFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MpIHsKKyAgdW5zaWduZWQgQWxpZ24gPSBBcmdGbGFncy5nZXRCeVZhbEFsaWduKCk7CisgIHVuc2lnbmVkIFNpemUgID0gQXJnRmxhZ3MuZ2V0QnlWYWxTaXplKCk7CisgIGlmIChNaW5TaXplID4gKGludClTaXplKQorICAgIFNpemUgPSBNaW5TaXplOworICBpZiAoTWluQWxpZ24gPiAoaW50KUFsaWduKQorICAgIEFsaWduID0gTWluQWxpZ247CisgIHVuc2lnbmVkIE9mZnNldCA9IEFsbG9jYXRlU3RhY2soU2l6ZSwgQWxpZ24pOworCisgIGFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0TWVtKFZhbE5vLCBWYWxWVCwgT2Zmc2V0LCBMb2NWVCwgTG9jSW5mbykpOworfQorCisvLy8gTWFya0FsbG9jYXRlZCAtIE1hcmsgYSByZWdpc3RlciBhbmQgYWxsIG9mIGl0cyBhbGlhc2VzIGFzIGFsbG9jYXRlZC4KK3ZvaWQgQ0NTdGF0ZTo6TWFya0FsbG9jYXRlZCh1bnNpZ25lZCBSZWcpIHsKKyAgVXNlZFJlZ3NbUmVnLzMyXSB8PSAxIDw8IChSZWcmMzEpOworICAKKyAgaWYgKGNvbnN0IHVuc2lnbmVkICpSZWdBbGlhc2VzID0gVFJJLmdldEFsaWFzU2V0KFJlZykpCisgICAgZm9yICg7IChSZWcgPSAqUmVnQWxpYXNlcyk7ICsrUmVnQWxpYXNlcykKKyAgICAgIFVzZWRSZWdzW1JlZy8zMl0gfD0gMSA8PCAoUmVnJjMxKTsKK30KKworLy8vIEFuYWx5emVGb3JtYWxBcmd1bWVudHMgLSBBbmFseXplIGFuIGFycmF5IG9mIGFyZ3VtZW50IHZhbHVlcywKKy8vLyBpbmNvcnBvcmF0aW5nIGluZm8gYWJvdXQgdGhlIGZvcm1hbHMgaW50byB0aGlzIHN0YXRlLgordm9pZAorQ0NTdGF0ZTo6QW5hbHl6ZUZvcm1hbEFyZ3VtZW50cyhjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbikgeworICB1bnNpZ25lZCBOdW1BcmdzID0gSW5zLnNpemUoKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUFyZ3M7ICsraSkgeworICAgIEVWVCBBcmdWVCA9IEluc1tpXS5WVDsKKyAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MgPSBJbnNbaV0uRmxhZ3M7CisgICAgaWYgKEZuKGksIEFyZ1ZULCBBcmdWVCwgQ0NWYWxBc3NpZ246OkZ1bGwsIEFyZ0ZsYWdzLCAqdGhpcykpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICBkYmdzKCkgPDwgIkZvcm1hbCBhcmd1bWVudCAjIiA8PCBpIDw8ICIgaGFzIHVuaGFuZGxlZCB0eXBlICIKKyAgICAgICAgICAgICA8PCBBcmdWVC5nZXRFVlRTdHJpbmcoKTsKKyNlbmRpZgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICB9CisgIH0KK30KKworLy8vIENoZWNrUmV0dXJuIC0gQW5hbHl6ZSB0aGUgcmV0dXJuIHZhbHVlcyBvZiBhIGZ1bmN0aW9uLCByZXR1cm5pbmcgdHJ1ZSBpZgorLy8vIHRoZSByZXR1cm4gY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHNyZXQtZGVtb3Rpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuCitib29sIENDU3RhdGU6OkNoZWNrUmV0dXJuKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pIHsKKyAgLy8gRGV0ZXJtaW5lIHdoaWNoIHJlZ2lzdGVyIGVhY2ggdmFsdWUgc2hvdWxkIGJlIGNvcGllZCBpbnRvLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3V0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgRVZUIFZUID0gT3V0c1tpXS5WVDsKKyAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MgPSBPdXRzW2ldLkZsYWdzOworICAgIGlmIChGbihpLCBWVCwgVlQsIENDVmFsQXNzaWduOjpGdWxsLCBBcmdGbGFncywgKnRoaXMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gQW5hbHl6ZVJldHVybiAtIEFuYWx5emUgdGhlIHJldHVybmVkIHZhbHVlcyBvZiBhIHJldHVybiwKKy8vLyBpbmNvcnBvcmF0aW5nIGluZm8gYWJvdXQgdGhlIHJlc3VsdCB2YWx1ZXMgaW50byB0aGlzIHN0YXRlLgordm9pZCBDQ1N0YXRlOjpBbmFseXplUmV0dXJuKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbikgeworICAvLyBEZXRlcm1pbmUgd2hpY2ggcmVnaXN0ZXIgZWFjaCB2YWx1ZSBzaG91bGQgYmUgY29waWVkIGludG8uCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPdXRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBFVlQgVlQgPSBPdXRzW2ldLlZUOworICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncyA9IE91dHNbaV0uRmxhZ3M7CisgICAgaWYgKEZuKGksIFZULCBWVCwgQ0NWYWxBc3NpZ246OkZ1bGwsIEFyZ0ZsYWdzLCAqdGhpcykpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICBkYmdzKCkgPDwgIlJldHVybiBvcGVyYW5kICMiIDw8IGkgPDwgIiBoYXMgdW5oYW5kbGVkIHR5cGUgIgorICAgICAgICAgICAgIDw8IFZULmdldEVWVFN0cmluZygpOworI2VuZGlmCisgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgIH0KKyAgfQorfQorCisvLy8gQW5hbHl6ZUNhbGxPcGVyYW5kcyAtIEFuYWx5emUgdGhlIG91dGdvaW5nIGFyZ3VtZW50cyB0byBhIGNhbGwsCisvLy8gaW5jb3Jwb3JhdGluZyBpbmZvIGFib3V0IHRoZSBwYXNzZWQgdmFsdWVzIGludG8gdGhpcyBzdGF0ZS4KK3ZvaWQgQ0NTdGF0ZTo6QW5hbHl6ZUNhbGxPcGVyYW5kcyhjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pIHsKKyAgdW5zaWduZWQgTnVtT3BzID0gT3V0cy5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICBFVlQgQXJnVlQgPSBPdXRzW2ldLlZUOworICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncyA9IE91dHNbaV0uRmxhZ3M7CisgICAgaWYgKEZuKGksIEFyZ1ZULCBBcmdWVCwgQ0NWYWxBc3NpZ246OkZ1bGwsIEFyZ0ZsYWdzLCAqdGhpcykpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICBkYmdzKCkgPDwgIkNhbGwgb3BlcmFuZCAjIiA8PCBpIDw8ICIgaGFzIHVuaGFuZGxlZCB0eXBlICIKKyAgICAgICAgICAgICA8PCBBcmdWVC5nZXRFVlRTdHJpbmcoKTsKKyNlbmRpZgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICB9CisgIH0KK30KKworLy8vIEFuYWx5emVDYWxsT3BlcmFuZHMgLSBTYW1lIGFzIGFib3ZlIGV4Y2VwdCBpdCB0YWtlcyB2ZWN0b3JzIG9mIHR5cGVzCisvLy8gYW5kIGFyZ3VtZW50IGZsYWdzLgordm9pZCBDQ1N0YXRlOjpBbmFseXplQ2FsbE9wZXJhbmRzKFNtYWxsVmVjdG9ySW1wbDxFVlQ+ICZBcmdWVHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPElTRDo6QXJnRmxhZ3NUeT4gJkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pIHsKKyAgdW5zaWduZWQgTnVtT3BzID0gQXJnVlRzLnNpemUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHM7ICsraSkgeworICAgIEVWVCBBcmdWVCA9IEFyZ1ZUc1tpXTsKKyAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MgPSBGbGFnc1tpXTsKKyAgICBpZiAoRm4oaSwgQXJnVlQsIEFyZ1ZULCBDQ1ZhbEFzc2lnbjo6RnVsbCwgQXJnRmxhZ3MsICp0aGlzKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgIGRiZ3MoKSA8PCAiQ2FsbCBvcGVyYW5kICMiIDw8IGkgPDwgIiBoYXMgdW5oYW5kbGVkIHR5cGUgIgorICAgICAgICAgICAgIDw8IEFyZ1ZULmdldEVWVFN0cmluZygpOworI2VuZGlmCisgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgIH0KKyAgfQorfQorCisvLy8gQW5hbHl6ZUNhbGxSZXN1bHQgLSBBbmFseXplIHRoZSByZXR1cm4gdmFsdWVzIG9mIGEgY2FsbCwKKy8vLyBpbmNvcnBvcmF0aW5nIGluZm8gYWJvdXQgdGhlIHBhc3NlZCB2YWx1ZXMgaW50byB0aGlzIHN0YXRlLgordm9pZCBDQ1N0YXRlOjpBbmFseXplQ2FsbFJlc3VsdChjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbikgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBFVlQgVlQgPSBJbnNbaV0uVlQ7CisgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzID0gSW5zW2ldLkZsYWdzOworICAgIGlmIChGbihpLCBWVCwgVlQsIENDVmFsQXNzaWduOjpGdWxsLCBGbGFncywgKnRoaXMpKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgZGJncygpIDw8ICJDYWxsIHJlc3VsdCAjIiA8PCBpIDw8ICIgaGFzIHVuaGFuZGxlZCB0eXBlICIKKyAgICAgICAgICAgICA8PCBWVC5nZXRFVlRTdHJpbmcoKTsKKyNlbmRpZgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICB9CisgIH0KK30KKworLy8vIEFuYWx5emVDYWxsUmVzdWx0IC0gU2FtZSBhcyBhYm92ZSBleGNlcHQgaXQncyBzcGVjaWFsaXplZCBmb3IgY2FsbHMgd2hpY2gKKy8vLyBwcm9kdWNlIGEgc2luZ2xlIHZhbHVlLgordm9pZCBDQ1N0YXRlOjpBbmFseXplQ2FsbFJlc3VsdChFVlQgVlQsIENDQXNzaWduRm4gRm4pIHsKKyAgaWYgKEZuKDAsIFZULCBWVCwgQ0NWYWxBc3NpZ246OkZ1bGwsIElTRDo6QXJnRmxhZ3NUeSgpLCAqdGhpcykpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgZGJncygpIDw8ICJDYWxsIHJlc3VsdCBoYXMgdW5oYW5kbGVkIHR5cGUgIgorICAgICAgICAgICA8PCBWVC5nZXRFVlRTdHJpbmcoKTsKKyNlbmRpZgorICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0NvZGVQbGFjZW1lbnRPcHQuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vQ29kZVBsYWNlbWVudE9wdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1NDc0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0NvZGVQbGFjZW1lbnRPcHQuY3BwCkBAIC0wLDAgKzEsNDIyIEBACisvLz09PS0tIENvZGVQbGFjZW1lbnRPcHQuY3BwIC0gQ29kZSBQbGFjZW1lbnQgcGFzcy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBwYXNzIHRoYXQgb3B0aW1pemUgY29kZSBwbGFjZW1lbnQgYW5kIGFsaWduIGxvb3AKKy8vIGhlYWRlcnMgdG8gdGFyZ2V0IHNwZWNpZmljIGFsaWdubWVudCBib3VuZGFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImNvZGUtcGxhY2VtZW50IgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtTG9vcHNBbGlnbmVkLCAgIk51bWJlciBvZiBsb29wcyBhbGlnbmVkIik7CitTVEFUSVNUSUMoTnVtSW50cmFFbGltLCAgICAgIk51bWJlciBvZiBpbnRyYSBsb29wIGJyYW5jaGVzIGVsaW1pbmF0ZWQiKTsKK1NUQVRJU1RJQyhOdW1JbnRyYU1vdmVkLCAgICAiTnVtYmVyIG9mIGludHJhIGxvb3AgYnJhbmNoZXMgbW92ZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgQ29kZVBsYWNlbWVudE9wdCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8gKk1MSTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAgKlRMSTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgQ29kZVBsYWNlbWVudE9wdCgpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJDb2RlIFBsYWNlbWVudCBPcHRpbWl6YXRlciI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVMb29wSW5mbz4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZElEKE1hY2hpbmVEb21pbmF0b3JzSUQpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBIYXNGYWxsdGhyb3VnaChNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKyAgICBib29sIEhhc0FuYWx5emFibGVUZXJtaW5hdG9yKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworICAgIHZvaWQgU3BsaWNlKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJbnNlcnRQdCwKKyAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgRW5kKTsKKyAgICBib29sIEVsaW1pbmF0ZVVuY29uZGl0aW9uYWxKdW1wc1RvVG9wKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTG9vcCAqTCk7CisgICAgYm9vbCBNb3ZlRGlzY29udGlndW91c0xvb3BCbG9ja3MoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTG9vcCAqTCk7CisgICAgYm9vbCBPcHRpbWl6ZUludHJhTG9vcEVkZ2VzSW5Mb29wTmVzdChNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lTG9vcCAqTCk7CisgICAgYm9vbCBPcHRpbWl6ZUludHJhTG9vcEVkZ2VzKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworICAgIGJvb2wgQWxpZ25Mb29wcyhNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKyAgICBib29sIEFsaWduTG9vcChNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lTG9vcCAqTCwgdW5zaWduZWQgQWxpZ24pOworICB9OworCisgIGNoYXIgQ29kZVBsYWNlbWVudE9wdDo6SUQgPSAwOworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUNvZGVQbGFjZW1lbnRPcHRQYXNzKCkgeworICByZXR1cm4gbmV3IENvZGVQbGFjZW1lbnRPcHQoKTsKK30KKworLy8vIEhhc0ZhbGx0aHJvdWdoIC0gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBicmFuY2ggaGFzIGEgZmFsbHRocm91Z2gsIGVpdGhlciBhcworLy8vIGEgcGxhaW4gZmFsbHRocm91Z2ggb3IgYXMgYSBmYWxsdGhyb3VnaCBjYXNlIG9mIGEgY29uZGl0aW9uYWwgYnJhbmNoLgorLy8vCitib29sIENvZGVQbGFjZW1lbnRPcHQ6Okhhc0ZhbGx0aHJvdWdoKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiA9IDAsICpGQkIgPSAwOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwgND4gQ29uZDsKKyAgaWYgKFRJSS0+QW5hbHl6ZUJyYW5jaCgqTUJCLCBUQkIsIEZCQiwgQ29uZCkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBUaGlzIGNvbmRpdGlvbmFsIGJyYW5jaCBoYXMgbm8gZmFsbHRocm91Z2guCisgIGlmIChGQkIpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBBbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCBoYXMgbm8gZmFsbHRocm91Z2guCisgIGlmIChDb25kLmVtcHR5KCkgJiYgVEJCKQorICAgIHJldHVybiBmYWxzZTsKKyAgLy8gSXQgaGFzIGEgZmFsbHRocm91Z2guCisgIHJldHVybiB0cnVlOworfQorCisvLy8gSGFzQW5hbHl6YWJsZVRlcm1pbmF0b3IgLSBUZXN0IHdoZXRoZXIgQW5hbHl6ZUJyYW5jaCB3aWxsIHN1Y2NlZWQgb24gTUJCLgorLy8vIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBtYWpvciBjaGFuZ2VzIGFyZSBiZWd1biB0byB0ZXN0IHdoZXRoZXIgaXQgd2lsbCBiZQorLy8vIHBvc3NpYmxlIHRvIGNvbXBsZXRlIHRoZSBjaGFuZ2VzLgorLy8vCisvLy8gVGFyZ2V0LXNwZWNpZmljIGNvZGUgaXMgaGVyZWJ5IGVuY291cmFnZWQgdG8gbWFrZSBBbmFseXplQnJhbmNoIHN1Y2NlZWQKKy8vLyB3aGVuZXZlciBwb3NzaWJsZS4KKy8vLworYm9vbCBDb2RlUGxhY2VtZW50T3B0OjpIYXNBbmFseXphYmxlVGVybWluYXRvcihNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIC8vIEFnZ3Jlc3NpdmVseSBoYW5kbGUgcmV0dXJuIGJsb2NrcyBhbmQgc2ltaWxhciBjb25zdHJ1Y3RzLgorICBpZiAoTUJCLT5zdWNjX2VtcHR5KCkpIHJldHVybiB0cnVlOworCisgIC8vIEFzayB0aGUgdGFyZ2V0J3MgQW5hbHl6ZUJyYW5jaCBpZiBpdCBjYW4gaGFuZGxlIHRoaXMgYmxvY2suCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIgPSAwLCAqRkJCID0gMDsKKyAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDQ+IENvbmQ7CisgIC8vIE1ha2Ugc3VyZSB0aGUgdGVybWluYXRvciBpcyB1bmRlcnN0b29kLgorICBpZiAoVElJLT5BbmFseXplQnJhbmNoKCpNQkIsIFRCQiwgRkJCLCBDb25kKSkKKyAgICByZXR1cm4gZmFsc2U7CisgICAvLyBJZ25vcmUgYmxvY2tzIHdoaWNoIGxvb2sgbGlrZSB0aGV5IG1pZ2h0IGhhdmUgRUgtcmVsYXRlZCBjb250cm9sIGZsb3cuCisgICAvLyBBbmFseXplQnJhbmNoIHRoaW5rcyBpdCBrbm93cyBob3cgdG8gYW5hbHl6ZSBzdWNoIHRoaW5ncywgYnV0IGl0IGRvZXNuJ3QKKyAgIC8vIHJlY29nbml6ZSB0aGUgcG9zc2liaWxpdHkgb2YgYSBjb250cm9sIHRyYW5zZmVyIHRocm91Z2ggYW4gdW53aW5kLgorICAgLy8gU3VjaCBibG9ja3MgY29udGFpbiBFSF9MQUJFTCBpbnN0cnVjdGlvbnMsIGhvd2V2ZXIgdGhleSBtYXkgYmUgaW4gdGhlCisgICAvLyBtaWRkbGUgb2YgdGhlIGJsb2NrLiBJbnN0ZWFkIG9mIHNlYXJjaGluZyBmb3IgdGhlbSwganVzdCBjaGVjayB0byBzZWUKKyAgIC8vIGlmIHRoZSBDRkcgZGlzYWdyZWVzIHdpdGggQW5hbHl6ZUJyYW5jaC4KKyAgaWYgKDF1ICsgIUNvbmQuZW1wdHkoKSAhPSBNQkItPnN1Y2Nfc2l6ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgdGhlIG9wdGlvbiBvZiByZXZlcnNpbmcgdGhlIGNvbmRpdGlvbi4KKyAgaWYgKCFDb25kLmVtcHR5KCkgJiYgVElJLT5SZXZlcnNlQnJhbmNoQ29uZGl0aW9uKENvbmQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBTcGxpY2UgLSBNb3ZlIHRoZSBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMgW0JlZ2luLEVuZCkgdG8ganVzdCBiZWZvcmUKKy8vLyBJbnNlcnRQdC4gVXBkYXRlIGJyYW5jaCBpbnN0cnVjdGlvbnMgYXMgbmVlZGVkIHRvIGFjY291bnQgZm9yIGJyb2tlbgorLy8vIGZhbGx0aHJvdWdoIGVkZ2VzIGFuZCB0byB0YWtlIGFkdmFudGFnZSBvZiBuZXdseSBleHBvc2VkIGZhbGx0aHJvdWdoCisvLy8gb3Bwb3J0dW5pdGllcy4KKy8vLwordm9pZCBDb2RlUGxhY2VtZW50T3B0OjpTcGxpY2UoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSW5zZXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBFbmQpIHsKKyAgYXNzZXJ0KEJlZ2luICE9IE1GLmJlZ2luKCkgJiYgRW5kICE9IE1GLmJlZ2luKCkgJiYgSW5zZXJ0UHQgIT0gTUYuYmVnaW4oKSAmJgorICAgICAgICAgIlNwbGljZSBjYW4ndCBjaGFuZ2UgdGhlIGVudHJ5IGJsb2NrISIpOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE9sZEJlZ2luUHJpb3IgPSBwcmlvcihCZWdpbik7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgT2xkRW5kUHJpb3IgPSBwcmlvcihFbmQpOworCisgIE1GLnNwbGljZShJbnNlcnRQdCwgQmVnaW4sIEVuZCk7CisKKyAgcHJpb3IoQmVnaW4pLT51cGRhdGVUZXJtaW5hdG9yKCk7CisgIE9sZEJlZ2luUHJpb3ItPnVwZGF0ZVRlcm1pbmF0b3IoKTsKKyAgT2xkRW5kUHJpb3ItPnVwZGF0ZVRlcm1pbmF0b3IoKTsKK30KKworLy8vIEVsaW1pbmF0ZVVuY29uZGl0aW9uYWxKdW1wc1RvVG9wIC0gTW92ZSBibG9ja3Mgd2hpY2ggdW5jb25kaXRpb25hbGx5IGp1bXAKKy8vLyB0byB0aGUgbG9vcCB0b3AgdG8gdGhlIHRvcCBvZiB0aGUgbG9vcCBzbyB0aGF0IHRoZXkgaGF2ZSBhIGZhbGwgdGhyb3VnaC4KKy8vLyBUaGlzIGNhbiBpbnRyb2R1Y2UgYSBicmFuY2ggb24gZW50cnkgdG8gdGhlIGxvb3AsIGJ1dCBpdCBjYW4gZWxpbWluYXRlIGEKKy8vLyBicmFuY2ggd2l0aGluIHRoZSBsb29wLiBTZWUgdGhlIEBzaW1wbGUgY2FzZSBpbgorLy8vIHRlc3QvQ29kZUdlbi9YODYvbG9vcF9ibG9ja3MubGwgZm9yIGFuIGV4YW1wbGUgb2YgdGhpcy4KK2Jvb2wgQ29kZVBsYWNlbWVudE9wdDo6RWxpbWluYXRlVW5jb25kaXRpb25hbEp1bXBzVG9Ub3AoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUxvb3AgKkwpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpUb3BNQkIgPSBMLT5nZXRUb3BCbG9jaygpOworCisgIGJvb2wgQm90SGFzRmFsbHRocm91Z2ggPSBIYXNGYWxsdGhyb3VnaChMLT5nZXRCb3R0b21CbG9jaygpKTsKKworICBpZiAoVG9wTUJCID09IE1GLmJlZ2luKCkgfHwKKyAgICAgIEhhc0FuYWx5emFibGVUZXJtaW5hdG9yKHByaW9yKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoVG9wTUJCKSkpKSB7CisgIG5ld190b3A6CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6cHJlZF9pdGVyYXRvciBQSSA9IFRvcE1CQi0+cHJlZF9iZWdpbigpLAorICAgICAgICAgUEUgPSBUb3BNQkItPnByZWRfZW5kKCk7IFBJICE9IFBFOyArK1BJKSB7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZCA9ICpQSTsKKyAgICAgIGlmIChQcmVkID09IFRvcE1CQikgY29udGludWU7CisgICAgICBpZiAoSGFzRmFsbHRocm91Z2goUHJlZCkpIGNvbnRpbnVlOworICAgICAgaWYgKCFMLT5jb250YWlucyhQcmVkKSkgY29udGludWU7CisKKyAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBhbmFseXplIGFsbCB0aGUgbG9vcCBlbnRyeSBlZGdlcyBiZWZvcmUgYmVnaW5uaW5nCisgICAgICAvLyBhbnkgY2hhbmdlcyB3aGljaCB3aWxsIHJlcXVpcmUgdXMgdG8gYmUgYWJsZSB0byBhbmFseXplIHRoZW0uCisgICAgICBpZiAoUHJlZCA9PSBNRi5iZWdpbigpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmICghSGFzQW5hbHl6YWJsZVRlcm1pbmF0b3IoUHJlZCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKCFIYXNBbmFseXphYmxlVGVybWluYXRvcihwcmlvcihNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKFByZWQpKSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBNb3ZlIHRoZSBibG9jay4KKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQ0dQOiBNb3ZpbmcgYmxvY2tzIHN0YXJ0aW5nIGF0IEJCIyIgPDwgUHJlZC0+Z2V0TnVtYmVyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIHRvIHRvcCBvZiBsb29wLlxuIik7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKworICAgICAgLy8gTW92ZSBpdCBhbmQgYWxsIHRoZSBibG9ja3MgdGhhdCBjYW4gcmVhY2ggaXQgdmlhIGZhbGx0aHJvdWdoIGVkZ2VzCisgICAgICAvLyBleGNsdXNpdmVseSwgdG8ga2VlcCBleGlzdGluZyBmYWxsdGhyb3VnaCBlZGdlcyBpbnRhY3QuCisgICAgICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJlZ2luID0gUHJlZDsKKyAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgRW5kID0gbGx2bTo6bmV4dChCZWdpbik7CisgICAgICB3aGlsZSAoQmVnaW4gIT0gTUYuYmVnaW4oKSkgeworICAgICAgICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIFByaW9yID0gcHJpb3IoQmVnaW4pOworICAgICAgICBpZiAoUHJpb3IgPT0gTUYuYmVnaW4oKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gU3RvcCB3aGVuIGEgbm9uLWZhbGx0aHJvdWdoIGVkZ2UgaXMgZm91bmQuCisgICAgICAgIGlmICghSGFzRmFsbHRocm91Z2goUHJpb3IpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBTdG9wIGlmIGEgYmxvY2sgd2hpY2ggY291bGQgZmFsbC10aHJvdWdoIG91dCBvZiB0aGUgbG9vcCBpcyBmb3VuZC4KKyAgICAgICAgaWYgKFByaW9yLT5pc1N1Y2Nlc3NvcihFbmQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBJZiB3ZSd2ZSByZWFjaGVkIHRoZSB0b3AsIHN0b3Agc2Nhbm5pbmcuCisgICAgICAgIGlmIChQcmlvciA9PSBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKFRvcE1CQikpIHsKKyAgICAgICAgICAvLyBXZSBrbm93IHRvcCBjdXJyZW50bHkgaGFzIGEgZmFsbCB0aHJvdWdoIChiZWNhdXNlIHdlIGp1c3QgY2hlY2tlZAorICAgICAgICAgIC8vIGl0KSB3aGljaCB3b3VsZCBiZSBsb3N0IGlmIHdlIGRvIHRoZSB0cmFuc2Zvcm1hdGlvbiwgc28gaXQgaXNuJ3QKKyAgICAgICAgICAvLyB3b3J0aHdoaWxlIHRvIGRvIHRoZSB0cmFuc2Zvcm1hdGlvbiB1bmxlc3MgaXQgd291bGQgZXhwb3NlIGEgbmV3CisgICAgICAgICAgLy8gZmFsbHRocm91Z2ggZWRnZS4KKyAgICAgICAgICBpZiAoIVByaW9yLT5pc1N1Y2Nlc3NvcihFbmQpKQorICAgICAgICAgICAgZ290byBuZXh0X3ByZWQ7CisgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGNhbiBzdG9wIHNjYW5uaW5nIGFuZCBwcm9jZWRlIHRvIG1vdmUgdGhlIGJsb2Nrcy4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSBoaXQgYSBzd2l0Y2ggb3Igc29tZXRoaW5nIGNvbXBsaWNhdGVkLCBkb24ndCBtb3ZlIGFueXRoaW5nCisgICAgICAgIC8vIGZvciB0aGlzIHByZWRlY2Vzc29yLgorICAgICAgICBpZiAoIUhhc0FuYWx5emFibGVUZXJtaW5hdG9yKHByaW9yKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoUHJpb3IpKSkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIE9rLCB0aGUgYmxvY2sgcHJpb3IgdG8gQmVnaW4gd2lsbCBiZSBtb3ZlZCBhbG9uZyB3aXRoIHRoZSByZXN0LgorICAgICAgICAvLyBFeHRlbmQgdGhlIHJhbmdlIHRvIGluY2x1ZGUgaXQuCisgICAgICAgIEJlZ2luID0gUHJpb3I7CisgICAgICAgICsrTnVtSW50cmFNb3ZlZDsKKyAgICAgIH0KKworICAgICAgLy8gTW92ZSB0aGUgYmxvY2tzLgorICAgICAgU3BsaWNlKE1GLCBUb3BNQkIsIEJlZ2luLCBFbmQpOworCisgICAgICAvLyBVcGRhdGUgVG9wTUJCLgorICAgICAgVG9wTUJCID0gTC0+Z2V0VG9wQmxvY2soKTsKKworICAgICAgLy8gV2UgaGF2ZSBhIG5ldyBsb29wIHRvcC4gSXRlcmF0ZSBvbiBpdC4gV2Ugc2hvdWxkbid0IGhhdmUgdG8gZG8gdGhpcworICAgICAgLy8gdG9vIG1hbnkgdGltZXMgaWYgQnJhbmNoRm9sZGluZyBoYXMgZG9uZSBhIHJlYXNvbmFibGUgam9iLgorICAgICAgZ290byBuZXdfdG9wOworICAgIG5leHRfcHJlZDo7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGxvb3AgcHJldmlvdXNseSBkaWRuJ3QgZXhpdCB3aXRoIGEgZmFsbC10aHJvdWdoIGFuZCBpdCBub3cgZG9lcywKKyAgLy8gd2UgZWxpbWluYXRlZCBhIGJyYW5jaC4KKyAgaWYgKENoYW5nZWQgJiYKKyAgICAgICFCb3RIYXNGYWxsdGhyb3VnaCAmJgorICAgICAgSGFzRmFsbHRocm91Z2goTC0+Z2V0Qm90dG9tQmxvY2soKSkpIHsKKyAgICArK051bUludHJhRWxpbTsKKyAgfQorCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gTW92ZURpc2NvbnRpZ3VvdXNMb29wQmxvY2tzIC0gTW92ZSBhbnkgbG9vcCBibG9ja3MgdGhhdCBhcmUgbm90IGluIHRoZQorLy8vIHBvcnRpb24gb2YgdGhlIGxvb3AgY29udGlndW91cyB3aXRoIHRoZSBoZWFkZXIuIFRoaXMgdXN1YWxseSBtYWtlcyB0aGUgbG9vcAorLy8vIGNvbnRpZ3VvdXMsIHByb3ZpZGVkIHRoYXQgQW5hbHl6ZUJyYW5jaCBjYW4gaGFuZGxlIGFsbCB0aGUgcmVsZXZhbnQKKy8vLyBicmFuY2hpbmcuIFNlZSB0aGUgQGNmZ19pc2xhbmRzIGNhc2UgaW4gdGVzdC9Db2RlR2VuL1g4Ni9sb29wX2Jsb2Nrcy5sbAorLy8vIGZvciBhbiBleGFtcGxlIG9mIHRoaXMuCitib29sIENvZGVQbGFjZW1lbnRPcHQ6Ok1vdmVEaXNjb250aWd1b3VzTG9vcEJsb2NrcyhNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUxvb3AgKkwpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpUb3BNQkIgPSBMLT5nZXRUb3BCbG9jaygpOworICBNYWNoaW5lQmFzaWNCbG9jayAqQm90TUJCID0gTC0+Z2V0Qm90dG9tQmxvY2soKTsKKworICAvLyBEZXRlcm1pbmUgYSBwb3NpdGlvbiB0byBtb3ZlIG9ycGhhbmVkIGxvb3AgYmxvY2tzIHRvLiBJZiBUb3BNQkIgaXMgbm90CisgIC8vIGVudGVyZWQgdmlhIGZhbGx0aHJvdWdoIGFuZCBCb3RNQkIgaXMgZXhpdGVkIHZpYSBmYWxsdGhyb3VnaCwgcHJlcGVuZCB0aGVtCisgIC8vIHRvIHRoZSB0b3Agb2YgdGhlIGxvb3AgdG8gYXZvaWQgbG9vc2luZyB0aGF0IGZhbGx0aHJvdWdoLiBPdGhlcndpc2UgYXBwZW5kCisgIC8vIHRoZW0gdG8gdGhlIGJvdHRvbSwgZXZlbiBpZiBpdCBwcmV2aW91c2x5IGhhZCBhIGZhbGx0aHJvdWdoLCBvbiB0aGUgdGhlb3J5CisgIC8vIHRoYXQgaXQncyB3b3J0aCBhbiBleHRyYSBicmFuY2ggdG8ga2VlcCB0aGUgbG9vcCBjb250aWd1b3VzLgorICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEluc2VydFB0ID0KKyAgICBsbHZtOjpuZXh0KE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoQm90TUJCKSk7CisgIGJvb2wgSW5zZXJ0QXRUb3AgPSBmYWxzZTsKKyAgaWYgKFRvcE1CQiAhPSBNRi5iZWdpbigpICYmCisgICAgICAhSGFzRmFsbHRocm91Z2gocHJpb3IoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihUb3BNQkIpKSkgJiYKKyAgICAgIEhhc0ZhbGx0aHJvdWdoKEJvdE1CQikpIHsKKyAgICBJbnNlcnRQdCA9IFRvcE1CQjsKKyAgICBJbnNlcnRBdFRvcCA9IHRydWU7CisgIH0KKworICAvLyBLZWVwIGEgcmVjb3JkIG9mIHdoaWNoIGJsb2NrcyBhcmUgaW4gdGhlIHBvcnRpb24gb2YgdGhlIGxvb3AgY29udGlndW91cworICAvLyB3aXRoIHRoZSBsb29wIGhlYWRlci4KKyAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sgKiwgOD4gQ29udGlndW91c0Jsb2NrczsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBUb3BNQkIsCisgICAgICAgRSA9IGxsdm06Om5leHQoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihCb3RNQkIpKTsgSSAhPSBFOyArK0kpCisgICAgQ29udGlndW91c0Jsb2Nrcy5pbnNlcnQoSSk7CisKKyAgLy8gRmluZCBub24tY29udGlnb3VzIGJsb2NrcyBhbmQgZml4IHRoZW0uCisgIGlmIChJbnNlcnRQdCAhPSBNRi5iZWdpbigpICYmIEhhc0FuYWx5emFibGVUZXJtaW5hdG9yKHByaW9yKEluc2VydFB0KSkpCisgICAgZm9yIChNYWNoaW5lTG9vcDo6YmxvY2tfaXRlcmF0b3IgQkkgPSBMLT5ibG9ja19iZWdpbigpLCBCRSA9IEwtPmJsb2NrX2VuZCgpOworICAgICAgICAgQkkgIT0gQkU7ICsrQkkpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQiA9ICpCSTsKKworICAgICAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIGFuYWx5emUgYWxsIHRoZSBsb29wIGVudHJ5IGVkZ2VzIGJlZm9yZSBiZWdpbm5pbmcKKyAgICAgIC8vIGFueSBjaGFuZ2VzIHdoaWNoIHdpbGwgcmVxdWlyZSB1cyB0byBiZSBhYmxlIHRvIGFuYWx5emUgdGhlbS4KKyAgICAgIGlmICghSGFzQW5hbHl6YWJsZVRlcm1pbmF0b3IoQkIpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmICghSGFzQW5hbHl6YWJsZVRlcm1pbmF0b3IocHJpb3IoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihCQikpKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIElmIHRoZSBsYXlvdXQgcHJlZGVjZXNzb3IgaXMgcGFydCBvZiB0aGUgbG9vcCwgdGhpcyBibG9jayB3aWxsIGJlCisgICAgICAvLyBwcm9jZXNzZWQgYWxvbmcgd2l0aCBpdC4gVGhpcyBrZWVwcyB0aGVtIGluIHRoZWlyIHJlbGF0aXZlIG9yZGVyLgorICAgICAgaWYgKEJCICE9IE1GLmJlZ2luKCkgJiYKKyAgICAgICAgICBMLT5jb250YWlucyhwcmlvcihNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKEJCKSkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgYmxvY2sgaXMgYWxyZWFkeSBjb250aWd1b3VzIHdpdGggdGhlIG1haW4KKyAgICAgIC8vIHBvcnRpb24gb2YgdGhlIGxvb3AuCisgICAgICBpZiAoIUNvbnRpZ3VvdXNCbG9ja3MuaW5zZXJ0KEJCKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIE1vdmUgdGhlIGJsb2NrLgorICAgICAgREVCVUcoZGJncygpIDw8ICJDR1A6IE1vdmluZyBibG9ja3Mgc3RhcnRpbmcgYXQgQkIjIiA8PCBCQi0+Z2V0TnVtYmVyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIHRvIGJlIGNvbnRpZ3VvdXMgd2l0aCBsb29wLlxuIik7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKworICAgICAgLy8gUHJvY2VzcyB0aGlzIGJsb2NrIGFuZCBhbGwgbG9vcCBibG9ja3MgY29udGlndW91cyB3aXRoIGl0LCB0byBrZWVwCisgICAgICAvLyB0aGVtIGluIHRoZWlyIHJlbGF0aXZlIG9yZGVyLgorICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBCZWdpbiA9IEJCOworICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBFbmQgPSBsbHZtOjpuZXh0KE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoQkIpKTsKKyAgICAgIGZvciAoOyBFbmQgIT0gTUYuZW5kKCk7ICsrRW5kKSB7CisgICAgICAgIGlmICghTC0+Y29udGFpbnMoRW5kKSkgYnJlYWs7CisgICAgICAgIGlmICghSGFzQW5hbHl6YWJsZVRlcm1pbmF0b3IoRW5kKSkgYnJlYWs7CisgICAgICAgIENvbnRpZ3VvdXNCbG9ja3MuaW5zZXJ0KEVuZCk7CisgICAgICAgICsrTnVtSW50cmFNb3ZlZDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UncmUgaW5zZXJ0aW5nIGF0IHRoZSBib3R0b20gb2YgdGhlIGxvb3AsIGFuZCB0aGUgY29kZSB3ZSdyZQorICAgICAgLy8gbW92aW5nIG9yaWdpbmFsbHkgaGFkIGZhbGwtdGhyb3VnaCBzdWNjZXNzb3JzLCBicmluZyB0aGUgc3VjZXNzb3JzCisgICAgICAvLyB1cCB3aXRoIHRoZSBsb29wIGJsb2NrcyB0byBwcmVzZXJ2ZSB0aGUgZmFsbC10aHJvdWdoIGVkZ2VzLgorICAgICAgaWYgKCFJbnNlcnRBdFRvcCkKKyAgICAgICAgZm9yICg7IEVuZCAhPSBNRi5lbmQoKTsgKytFbmQpIHsKKyAgICAgICAgICBpZiAoTC0+Y29udGFpbnMoRW5kKSkgYnJlYWs7CisgICAgICAgICAgaWYgKCFIYXNBbmFseXphYmxlVGVybWluYXRvcihFbmQpKSBicmVhazsKKyAgICAgICAgICBpZiAoIUhhc0ZhbGx0aHJvdWdoKHByaW9yKEVuZCkpKSBicmVhazsKKyAgICAgICAgfQorCisgICAgICAvLyBNb3ZlIHRoZSBibG9ja3MuIFRoaXMgbWF5IGludmFsaWRhdGUgVG9wTUJCIGFuZC9vciBCb3RNQkIsIGJ1dAorICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmUgYXQgdGhpcyBwb2ludC4KKyAgICAgIFNwbGljZShNRiwgSW5zZXJ0UHQsIEJlZ2luLCBFbmQpOworICAgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIE9wdGltaXplSW50cmFMb29wRWRnZXNJbkxvb3BOZXN0IC0gUmVwb3NpdGlvbiBsb29wIGJsb2NrcyB0byBtaW5pbWl6ZQorLy8vIGludHJhLWxvb3AgYnJhbmNoaW5nIGFuZCB0byBmb3JtIGNvbnRpZ3VvdXMgbG9vcHMuCisvLy8KKy8vLyBUaGlzIGNvZGUgdGFrZXMgdGhlIGFwcHJvYWNoIG9mIG1ha2luZyBtaW5vciBjaGFuZ2VzIHRvIHRoZSBleGlzdGluZworLy8vIGxheW91dCB0byBmaXggc3BlY2lmaWMgbG9vcC1vcmllbnRlZCBwcm9ibGVtcy4gQWxzbywgaXQgZGVwZW5kcyBvbgorLy8vIEFuYWx5emVCcmFuY2gsIHdoaWNoIGNhbid0IHVuZGVyc3RhbmQgY29tcGxleCBjb250cm9sIGluc3RydWN0aW9ucy4KKy8vLworYm9vbCBDb2RlUGxhY2VtZW50T3B0OjpPcHRpbWl6ZUludHJhTG9vcEVkZ2VzSW5Mb29wTmVzdChNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTG9vcCAqTCkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICAvLyBEbyBvcHRpbWl6YXRpb24gZm9yIG5lc3RlZCBsb29wcy4KKyAgZm9yIChNYWNoaW5lTG9vcDo6aXRlcmF0b3IgSSA9IEwtPmJlZ2luKCksIEUgPSBMLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgQ2hhbmdlZCB8PSBPcHRpbWl6ZUludHJhTG9vcEVkZ2VzSW5Mb29wTmVzdChNRiwgKkkpOworCisgIC8vIERvIG9wdGltaXphdGlvbiBmb3IgdGhpcyBsb29wLgorICBDaGFuZ2VkIHw9IEVsaW1pbmF0ZVVuY29uZGl0aW9uYWxKdW1wc1RvVG9wKE1GLCBMKTsKKyAgQ2hhbmdlZCB8PSBNb3ZlRGlzY29udGlndW91c0xvb3BCbG9ja3MoTUYsIEwpOworCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gT3B0aW1pemVJbnRyYUxvb3BFZGdlcyAtIFJlcG9zaXRpb24gbG9vcCBibG9ja3MgdG8gbWluaW1pemUKKy8vLyBpbnRyYS1sb29wIGJyYW5jaGluZyBhbmQgdG8gZm9ybSBjb250aWd1b3VzIGxvb3BzLgorLy8vCitib29sIENvZGVQbGFjZW1lbnRPcHQ6Ok9wdGltaXplSW50cmFMb29wRWRnZXMoTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBpZiAoIVRMSS0+c2hvdWxkT3B0aW1pemVDb2RlUGxhY2VtZW50KCkpCisgICAgcmV0dXJuIENoYW5nZWQ7CisKKyAgLy8gRG8gb3B0aW1pemF0aW9uIGZvciBlYWNoIGxvb3AgaW4gdGhlIGZ1bmN0aW9uLgorICBmb3IgKE1hY2hpbmVMb29wSW5mbzo6aXRlcmF0b3IgSSA9IE1MSS0+YmVnaW4oKSwgRSA9IE1MSS0+ZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgaWYgKCEoKkkpLT5nZXRQYXJlbnRMb29wKCkpCisgICAgICBDaGFuZ2VkIHw9IE9wdGltaXplSW50cmFMb29wRWRnZXNJbkxvb3BOZXN0KE1GLCAqSSk7CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBBbGlnbkxvb3BzIC0gQWxpZ24gbG9vcCBoZWFkZXJzIHRvIHRhcmdldCBwcmVmZXJyZWQgYWxpZ25tZW50cy4KKy8vLworYm9vbCBDb2RlUGxhY2VtZW50T3B0OjpBbGlnbkxvb3BzKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgY29uc3QgRnVuY3Rpb24gKkYgPSBNRi5nZXRGdW5jdGlvbigpOworICBpZiAoRi0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6T3B0aW1pemVGb3JTaXplKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgQWxpZ24gPSBUTEktPmdldFByZWZMb29wQWxpZ25tZW50KCk7CisgIGlmICghQWxpZ24pCisgICAgcmV0dXJuIGZhbHNlOyAgLy8gRG9uJ3QgY2FyZSBhYm91dCBsb29wIGFsaWdubWVudC4KKworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBmb3IgKE1hY2hpbmVMb29wSW5mbzo6aXRlcmF0b3IgSSA9IE1MSS0+YmVnaW4oKSwgRSA9IE1MSS0+ZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgQ2hhbmdlZCB8PSBBbGlnbkxvb3AoTUYsICpJLCBBbGlnbik7CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBBbGlnbkxvb3AgLSBBbGlnbiBsb29wIGhlYWRlcnMgdG8gdGFyZ2V0IHByZWZlcnJlZCBhbGlnbm1lbnRzLgorLy8vCitib29sIENvZGVQbGFjZW1lbnRPcHQ6OkFsaWduTG9vcChNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIC8vIERvIGFsaWdubWVudCBmb3IgbmVzdGVkIGxvb3BzLgorICBmb3IgKE1hY2hpbmVMb29wOjppdGVyYXRvciBJID0gTC0+YmVnaW4oKSwgRSA9IEwtPmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBDaGFuZ2VkIHw9IEFsaWduTG9vcChNRiwgKkksIEFsaWduKTsKKworICBMLT5nZXRUb3BCbG9jaygpLT5zZXRBbGlnbm1lbnQoQWxpZ24pOworICBDaGFuZ2VkID0gdHJ1ZTsKKyAgKytOdW1Mb29wc0FsaWduZWQ7CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2Jvb2wgQ29kZVBsYWNlbWVudE9wdDo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBNTEkgPSAmZ2V0QW5hbHlzaXM8TWFjaGluZUxvb3BJbmZvPigpOworICBpZiAoTUxJLT5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsgIC8vIE5vIGxvb3BzLgorCisgIFRMSSA9IE1GLmdldFRhcmdldCgpLmdldFRhcmdldExvd2VyaW5nKCk7CisgIFRJSSA9IE1GLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworCisgIGJvb2wgQ2hhbmdlZCA9IE9wdGltaXplSW50cmFMb29wRWRnZXMoTUYpOworCisgIENoYW5nZWQgfD0gQWxpZ25Mb29wcyhNRik7CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9Dcml0aWNhbEFudGlEZXBCcmVha2VyLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0NyaXRpY2FsQW50aURlcEJyZWFrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDRkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Dcml0aWNhbEFudGlEZXBCcmVha2VyLmNwcApAQCAtMCwwICsxLDYwNyBAQAorLy89PT0tLS0tLSBDcml0aWNhbEFudGlEZXBCcmVha2VyLmNwcCAtIEFudGktZGVwIGJyZWFrZXIgLS0tLS0tLS0gLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQ3JpdGljYWxBbnRpRGVwQnJlYWtlciBjbGFzcywgd2hpY2gKKy8vIGltcGxlbWVudHMgcmVnaXN0ZXIgYW50aS1kZXBlbmRlbmNlIGJyZWFraW5nIGFsb25nIGEgYmxvY2tzCisvLyBjcml0aWNhbCBwYXRoIGR1cmluZyBwb3N0LVJBIHNjaGVkdWxlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInBvc3QtUkEtc2NoZWQiCisjaW5jbHVkZSAiQ3JpdGljYWxBbnRpRGVwQnJlYWtlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitDcml0aWNhbEFudGlEZXBCcmVha2VyOjoKK0NyaXRpY2FsQW50aURlcEJyZWFrZXIoTWFjaGluZUZ1bmN0aW9uJiBNRmkpIDoKKyAgQW50aURlcEJyZWFrZXIoKSwgTUYoTUZpKSwKKyAgTVJJKE1GLmdldFJlZ0luZm8oKSksCisgIFRJSShNRi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKSksCisgIFRSSShNRi5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKSksCisgIEFsbG9jYXRhYmxlU2V0KFRSSS0+Z2V0QWxsb2NhdGFibGVTZXQoTUYpKSwKKyAgQ2xhc3NlcyhUUkktPmdldE51bVJlZ3MoKSwgc3RhdGljX2Nhc3Q8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPigwKSksCisgIEtpbGxJbmRpY2VzKFRSSS0+Z2V0TnVtUmVncygpLCAwKSwKKyAgRGVmSW5kaWNlcyhUUkktPmdldE51bVJlZ3MoKSwgMCkge30KKworQ3JpdGljYWxBbnRpRGVwQnJlYWtlcjo6fkNyaXRpY2FsQW50aURlcEJyZWFrZXIoKSB7Cit9CisKK3ZvaWQgQ3JpdGljYWxBbnRpRGVwQnJlYWtlcjo6U3RhcnRCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIpIHsKKyAgY29uc3QgdW5zaWduZWQgQkJTaXplID0gQkItPnNpemUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRSSS0+Z2V0TnVtUmVncygpOyBpICE9IGU7ICsraSkgeworICAgIC8vIENsZWFyIG91dCB0aGUgcmVnaXN0ZXIgY2xhc3MgZGF0YS4KKyAgICBDbGFzc2VzW2ldID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPigwKTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIGluZGljZXMgdG8gaW5kaWNhdGUgdGhhdCBubyByZWdpc3RlcnMgYXJlIGxpdmUuCisgICAgS2lsbEluZGljZXNbaV0gPSB+MHU7CisgICAgRGVmSW5kaWNlc1tpXSA9IEJCU2l6ZTsKKyAgfQorCisgIC8vIENsZWFyICJkbyBub3QgY2hhbmdlIiBzZXQuCisgIEtlZXBSZWdzLmNsZWFyKCk7CisKKyAgYm9vbCBJc1JldHVybkJsb2NrID0gKCFCQi0+ZW1wdHkoKSAmJiBCQi0+YmFjaygpLmdldERlc2MoKS5pc1JldHVybigpKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIGxpdmUtb3V0IHBoeXNyZWdzIGZvciB0aGlzIGJsb2NrLgorICBpZiAoSXNSZXR1cm5CbG9jaykgeworICAgIC8vIEluIGEgcmV0dXJuIGJsb2NrLCBleGFtaW5lIHRoZSBmdW5jdGlvbiBsaXZlLW91dCByZWdzLgorICAgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6bGl2ZW91dF9pdGVyYXRvciBJID0gTVJJLmxpdmVvdXRfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBNUkkubGl2ZW91dF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9ICpJOworICAgICAgQ2xhc3Nlc1tSZWddID0gcmVpbnRlcnByZXRfY2FzdDxUYXJnZXRSZWdpc3RlckNsYXNzICo+KC0xKTsKKyAgICAgIEtpbGxJbmRpY2VzW1JlZ10gPSBCQi0+c2l6ZSgpOworICAgICAgRGVmSW5kaWNlc1tSZWddID0gfjB1OworCisgICAgICAvLyBSZXBlYXQsIGZvciBhbGwgYWxpYXNlcy4KKyAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqQWxpYXM7ICsrQWxpYXMpIHsKKyAgICAgICAgdW5zaWduZWQgQWxpYXNSZWcgPSAqQWxpYXM7CisgICAgICAgIENsYXNzZXNbQWxpYXNSZWddID0gcmVpbnRlcnByZXRfY2FzdDxUYXJnZXRSZWdpc3RlckNsYXNzICo+KC0xKTsKKyAgICAgICAgS2lsbEluZGljZXNbQWxpYXNSZWddID0gQkItPnNpemUoKTsKKyAgICAgICAgRGVmSW5kaWNlc1tBbGlhc1JlZ10gPSB+MHU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSW4gYSBub24tcmV0dXJuIGJsb2NrLCBleGFtaW5lIHRoZSBsaXZlLWluIHJlZ3Mgb2YgYWxsIHN1Y2Nlc3NvcnMuCisgIC8vIE5vdGUgYSByZXR1cm4gYmxvY2sgY2FuIGhhdmUgc3VjY2Vzc29ycyBpZiB0aGUgcmV0dXJuIGluc3RydWN0aW9uIGlzCisgIC8vIHByZWRpY2F0ZWQuCisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnN1Y2NfaXRlcmF0b3IgU0kgPSBCQi0+c3VjY19iZWdpbigpLAorICAgICAgICAgU0UgPSBCQi0+c3VjY19lbmQoKTsgU0kgIT0gU0U7ICsrU0kpCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6bGl2ZWluX2l0ZXJhdG9yIEkgPSAoKlNJKS0+bGl2ZWluX2JlZ2luKCksCisgICAgICAgICAgIEUgPSAoKlNJKS0+bGl2ZWluX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgdW5zaWduZWQgUmVnID0gKkk7CisgICAgICBDbGFzc2VzW1JlZ10gPSByZWludGVycHJldF9jYXN0PFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4oLTEpOworICAgICAgS2lsbEluZGljZXNbUmVnXSA9IEJCLT5zaXplKCk7CisgICAgICBEZWZJbmRpY2VzW1JlZ10gPSB+MHU7CisKKyAgICAgIC8vIFJlcGVhdCwgZm9yIGFsbCBhbGlhc2VzLgorICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQWxpYXMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBbGlhczsgKytBbGlhcykgeworICAgICAgICB1bnNpZ25lZCBBbGlhc1JlZyA9ICpBbGlhczsKKyAgICAgICAgQ2xhc3Nlc1tBbGlhc1JlZ10gPSByZWludGVycHJldF9jYXN0PFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4oLTEpOworICAgICAgICBLaWxsSW5kaWNlc1tBbGlhc1JlZ10gPSBCQi0+c2l6ZSgpOworICAgICAgICBEZWZJbmRpY2VzW0FsaWFzUmVnXSA9IH4wdTsKKyAgICAgIH0KKyAgICB9CisKKyAgLy8gTWFyayBsaXZlLW91dCBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLiBJbiBhIHJldHVybiBibG9jayB0aGlzIGlzCisgIC8vIGFsbCBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLiBJbiBub24tcmV0dXJuIHRoaXMgaXMgYW55CisgIC8vIGNhbGxlZS1zYXZlZCByZWdpc3RlciB0aGF0IGlzIG5vdCBzYXZlZCBpbiB0aGUgcHJvbG9nLgorICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgQml0VmVjdG9yIFByaXN0aW5lID0gTUZJLT5nZXRQcmlzdGluZVJlZ3MoQkIpOworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpJID0gVFJJLT5nZXRDYWxsZWVTYXZlZFJlZ3MoKTsgKkk7ICsrSSkgeworICAgIHVuc2lnbmVkIFJlZyA9ICpJOworICAgIGlmICghSXNSZXR1cm5CbG9jayAmJiAhUHJpc3RpbmUudGVzdChSZWcpKSBjb250aW51ZTsKKyAgICBDbGFzc2VzW1JlZ10gPSByZWludGVycHJldF9jYXN0PFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4oLTEpOworICAgIEtpbGxJbmRpY2VzW1JlZ10gPSBCQi0+c2l6ZSgpOworICAgIERlZkluZGljZXNbUmVnXSA9IH4wdTsKKworICAgIC8vIFJlcGVhdCwgZm9yIGFsbCBhbGlhc2VzLgorICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqQWxpYXM7ICsrQWxpYXMpIHsKKyAgICAgIHVuc2lnbmVkIEFsaWFzUmVnID0gKkFsaWFzOworICAgICAgQ2xhc3Nlc1tBbGlhc1JlZ10gPSByZWludGVycHJldF9jYXN0PFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4oLTEpOworICAgICAgS2lsbEluZGljZXNbQWxpYXNSZWddID0gQkItPnNpemUoKTsKKyAgICAgIERlZkluZGljZXNbQWxpYXNSZWddID0gfjB1OworICAgIH0KKyAgfQorfQorCit2b2lkIENyaXRpY2FsQW50aURlcEJyZWFrZXI6OkZpbmlzaEJsb2NrKCkgeworICBSZWdSZWZzLmNsZWFyKCk7CisgIEtlZXBSZWdzLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ3JpdGljYWxBbnRpRGVwQnJlYWtlcjo6T2JzZXJ2ZShNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbnNlcnRQb3NJbmRleCkgeworICBpZiAoTUktPmlzRGVidWdWYWx1ZSgpKQorICAgIHJldHVybjsKKyAgYXNzZXJ0KENvdW50IDwgSW5zZXJ0UG9zSW5kZXggJiYgIkluc3RydWN0aW9uIGluZGV4IG91dCBvZiBleHBlY3RlZCByYW5nZSEiKTsKKworICAvLyBBbnkgcmVnaXN0ZXIgd2hpY2ggd2FzIGRlZmluZWQgd2l0aGluIHRoZSBwcmV2aW91cyBzY2hlZHVsaW5nIHJlZ2lvbgorICAvLyBtYXkgaGF2ZSBiZWVuIHJlc2NoZWR1bGVkIGFuZCBpdHMgbGlmZXRpbWUgbWF5IG92ZXJsYXAgd2l0aCByZWdpc3RlcnMKKyAgLy8gaW4gd2F5cyBub3QgcmVmbGVjdGVkIGluIG91ciBjdXJyZW50IGxpdmVuZXNzIHN0YXRlLiBGb3IgZWFjaCBzdWNoCisgIC8vIHJlZ2lzdGVyLCBhZGp1c3QgdGhlIGxpdmVuZXNzIHN0YXRlIHRvIGJlIGNvbnNlcnZhdGl2ZWx5IGNvcnJlY3QuCisgIGZvciAodW5zaWduZWQgUmVnID0gMDsgUmVnICE9IFRSSS0+Z2V0TnVtUmVncygpOyArK1JlZykKKyAgICBpZiAoRGVmSW5kaWNlc1tSZWddIDwgSW5zZXJ0UG9zSW5kZXggJiYgRGVmSW5kaWNlc1tSZWddID49IENvdW50KSB7CisgICAgICBhc3NlcnQoS2lsbEluZGljZXNbUmVnXSA9PSB+MHUgJiYgIkNsb2JiZXJlZCByZWdpc3RlciBpcyBsaXZlISIpOworCisgICAgICAvLyBNYXJrIHRoaXMgcmVnaXN0ZXIgdG8gYmUgbm9uLXJlbmFtYWJsZS4KKyAgICAgIENsYXNzZXNbUmVnXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPigtMSk7CisKKyAgICAgIC8vIE1vdmUgdGhlIGRlZiBpbmRleCB0byB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyByZWdpb24sIHRvIHJlZmxlY3QKKyAgICAgIC8vIHRoYXQgdGhlIGRlZiBjb3VsZCB0aGVvcmV0aWNhbGx5IGhhdmUgYmVlbiBzY2hlZHVsZWQgYXQgdGhlIGVuZC4KKyAgICAgIERlZkluZGljZXNbUmVnXSA9IEluc2VydFBvc0luZGV4OworICAgIH0KKworICBQcmVzY2FuSW5zdHJ1Y3Rpb24oTUkpOworICBTY2FuSW5zdHJ1Y3Rpb24oTUksIENvdW50KTsKK30KKworLy8vIENyaXRpY2FsUGF0aFN0ZXAgLSBSZXR1cm4gdGhlIG5leHQgU1VuaXQgYWZ0ZXIgU1Ugb24gdGhlIGJvdHRvbS11cAorLy8vIGNyaXRpY2FsIHBhdGguCitzdGF0aWMgY29uc3QgU0RlcCAqQ3JpdGljYWxQYXRoU3RlcChjb25zdCBTVW5pdCAqU1UpIHsKKyAgY29uc3QgU0RlcCAqTmV4dCA9IDA7CisgIHVuc2lnbmVkIE5leHREZXB0aCA9IDA7CisgIC8vIEZpbmQgdGhlIHByZWRlY2Vzc29yIGVkZ2Ugd2l0aCB0aGUgZ3JlYXRlc3QgZGVwdGguCisgIGZvciAoU1VuaXQ6OmNvbnN0X3ByZWRfaXRlcmF0b3IgUCA9IFNVLT5QcmVkcy5iZWdpbigpLCBQRSA9IFNVLT5QcmVkcy5lbmQoKTsKKyAgICAgICBQICE9IFBFOyArK1ApIHsKKyAgICBjb25zdCBTVW5pdCAqUHJlZFNVID0gUC0+Z2V0U1VuaXQoKTsKKyAgICB1bnNpZ25lZCBQcmVkTGF0ZW5jeSA9IFAtPmdldExhdGVuY3koKTsKKyAgICB1bnNpZ25lZCBQcmVkVG90YWxMYXRlbmN5ID0gUHJlZFNVLT5nZXREZXB0aCgpICsgUHJlZExhdGVuY3k7CisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBsYXRlbmN5IHRpZSwgcHJlZmVyIGFuIGFudGktZGVwZW5kZW5jeSBlZGdlIG92ZXIKKyAgICAvLyBvdGhlciB0eXBlcyBvZiBlZGdlcy4KKyAgICBpZiAoTmV4dERlcHRoIDwgUHJlZFRvdGFsTGF0ZW5jeSB8fAorICAgICAgICAoTmV4dERlcHRoID09IFByZWRUb3RhbExhdGVuY3kgJiYgUC0+Z2V0S2luZCgpID09IFNEZXA6OkFudGkpKSB7CisgICAgICBOZXh0RGVwdGggPSBQcmVkVG90YWxMYXRlbmN5OworICAgICAgTmV4dCA9ICYqUDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5leHQ7Cit9CisKK3ZvaWQgQ3JpdGljYWxBbnRpRGVwQnJlYWtlcjo6UHJlc2Nhbkluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgLy8gSXQncyBub3Qgc2FmZSB0byBjaGFuZ2UgcmVnaXN0ZXIgYWxsb2NhdGlvbiBmb3Igc291cmNlIG9wZXJhbmRzIG9mCisgIC8vIHRoYXQgaGF2ZSBzcGVjaWFsIGFsbG9jYXRpb24gcmVxdWlyZW1lbnRzLiBBbHNvIGFzc3VtZSBhbGwgcmVnaXN0ZXJzCisgIC8vIHVzZWQgaW4gYSBjYWxsIG11c3Qgbm90IGJlIGNoYW5nZWQgKEFCSSkuCisgIC8vIEZJWE1FOiBUaGUgaXNzdWUgd2l0aCBwcmVkaWNhdGVkIGluc3RydWN0aW9uIGlzIG1vcmUgY29tcGxleC4gV2UgYXJlIGJlaW5nCisgIC8vIGNvbnNlcnZhdGl2ZWx5IGhlcmUgYmVjYXVzZSB0aGUga2lsbCBtYXJrZXJzIGNhbm5vdCBiZSB0cnVzdGVkIGFmdGVyCisgIC8vIGlmLWNvbnZlcnNpb246CisgIC8vICVSNjxkZWY+ID0gTERSICVTUCwgJXJlZzAsIDkyLCBwcmVkOjE0LCBwcmVkOiVyZWcwOyBtZW06TEQ0W0ZpeGVkU3RhY2sxNF0KKyAgLy8gLi4uCisgIC8vIFNUUiAlUjAsICVSNjxraWxsPiwgJXJlZzAsIDAsIHByZWQ6MCwgcHJlZDolQ1BTUjsgbWVtOlNUNFslMzk1XQorICAvLyAlUjY8ZGVmPiA9IExEUiAlU1AsICVyZWcwLCAxMDAsIHByZWQ6MCwgcHJlZDolQ1BTUjsgbWVtOkxENFtGaXhlZFN0YWNrMTJdCisgIC8vIFNUUiAlUjAsICVSNjxraWxsPiwgJXJlZzAsIDAsIHByZWQ6MTQsIHByZWQ6JXJlZzA7IG1lbTpTVDRbJTM5Nl0oYWxpZ249OCkKKyAgLy8KKyAgLy8gVGhlIGZpcnN0IFI2IGtpbGwgaXMgbm90IHJlYWxseSBhIGtpbGwgc2luY2UgaXQncyBraWxsZWQgYnkgYSBwcmVkaWNhdGVkCisgIC8vIGluc3RydWN0aW9uIHdoaWNoIG1heSBub3QgYmUgZXhlY3V0ZWQuIFRoZSBzZWNvbmQgUjYgZGVmIG1heSBvciBtYXkgbm90CisgIC8vIHJlLWRlZmluZSBSNiBzbyBpdCdzIG5vdCBzYWZlIHRvIGNoYW5nZSBpdCBzaW5jZSB0aGUgbGFzdCBSNiB1c2UgY2Fubm90IGJlCisgIC8vIGNoYW5nZWQuCisgIGJvb2wgU3BlY2lhbCA9IE1JLT5nZXREZXNjKCkuaXNDYWxsKCkgfHwKKyAgICBNSS0+Z2V0RGVzYygpLmhhc0V4dHJhU3JjUmVnQWxsb2NSZXEoKSB8fAorICAgIFRJSS0+aXNQcmVkaWNhdGVkKE1JKTsKKworICAvLyBTY2FuIHRoZSByZWdpc3RlciBvcGVyYW5kcyBmb3IgdGhpcyBpbnN0cnVjdGlvbiBhbmQgdXBkYXRlCisgIC8vIENsYXNzZXMgYW5kIFJlZ1JlZnMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkpIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChSZWcgPT0gMCkgY29udGludWU7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqTmV3UkMgPSAwOworCisgICAgaWYgKGkgPCBNSS0+Z2V0RGVzYygpLmdldE51bU9wZXJhbmRzKCkpCisgICAgICBOZXdSQyA9IE1JLT5nZXREZXNjKCkuT3BJbmZvW2ldLmdldFJlZ0NsYXNzKFRSSSk7CisKKyAgICAvLyBGb3Igbm93LCBvbmx5IGFsbG93IHRoZSByZWdpc3RlciB0byBiZSBjaGFuZ2VkIGlmIGl0cyByZWdpc3RlcgorICAgIC8vIGNsYXNzIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCB1c2VzLgorICAgIGlmICghQ2xhc3Nlc1tSZWddICYmIE5ld1JDKQorICAgICAgQ2xhc3Nlc1tSZWddID0gTmV3UkM7CisgICAgZWxzZSBpZiAoIU5ld1JDIHx8IENsYXNzZXNbUmVnXSAhPSBOZXdSQykKKyAgICAgIENsYXNzZXNbUmVnXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPigtMSk7CisKKyAgICAvLyBOb3cgY2hlY2sgZm9yIGFsaWFzZXMuCisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQWxpYXMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBbGlhczsgKytBbGlhcykgeworICAgICAgLy8gSWYgYW4gYWxpYXMgb2YgdGhlIHJlZyBpcyB1c2VkIGR1cmluZyB0aGUgbGl2ZSByYW5nZSwgZ2l2ZSB1cC4KKyAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGFsbG93cyB1cyB0byBza2lwIGNoZWNraW5nIGlmIEFudGlEZXBSZWcKKyAgICAgIC8vIG92ZXJsYXBzIHdpdGggYW55IG9mIHRoZSBhbGlhc2VzLCBhbW9uZyBvdGhlciB0aGluZ3MuCisgICAgICB1bnNpZ25lZCBBbGlhc1JlZyA9ICpBbGlhczsKKyAgICAgIGlmIChDbGFzc2VzW0FsaWFzUmVnXSkgeworICAgICAgICBDbGFzc2VzW0FsaWFzUmVnXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPigtMSk7CisgICAgICAgIENsYXNzZXNbUmVnXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPigtMSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgd2UncmUgc3RpbGwgd2lsbGluZyB0byBjb25zaWRlciB0aGlzIHJlZ2lzdGVyLCBub3RlIHRoZSByZWZlcmVuY2UuCisgICAgaWYgKENsYXNzZXNbUmVnXSAhPSByZWludGVycHJldF9jYXN0PFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4oLTEpKQorICAgICAgUmVnUmVmcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUmVnLCAmTU8pKTsKKworICAgIGlmIChNTy5pc1VzZSgpICYmIFNwZWNpYWwpIHsKKyAgICAgIGlmIChLZWVwUmVncy5pbnNlcnQoUmVnKSkgeworICAgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTdWJyZWcgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOworICAgICAgICAgICAgICpTdWJyZWc7ICsrU3VicmVnKQorICAgICAgICAgIEtlZXBSZWdzLmluc2VydCgqU3VicmVnKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDcml0aWNhbEFudGlEZXBCcmVha2VyOjpTY2FuSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvdW50KSB7CisgIC8vIFVwZGF0ZSBsaXZlbmVzcy4KKyAgLy8gUHJvY2VkaW5nIHVwd2FyZHMsIHJlZ2lzdGVycyB0aGF0IGFyZSBkZWZlZCBidXQgbm90IHVzZWQgaW4gdGhpcworICAvLyBpbnN0cnVjdGlvbiBhcmUgbm93IGRlYWQuCisKKyAgaWYgKCFUSUktPmlzUHJlZGljYXRlZChNSSkpIHsKKyAgICAvLyBQcmVkaWNhdGVkIGRlZnMgYXJlIG1vZGVsZWQgYXMgcmVhZCArIHdyaXRlLCBpLmUuIHNpbWlsYXIgdG8gdHdvCisgICAgLy8gYWRkcmVzcyB1cGRhdGVzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKCFNTy5pc1JlZygpKSBjb250aW51ZTsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgICAgaWYgKFJlZyA9PSAwKSBjb250aW51ZTsKKyAgICAgIGlmICghTU8uaXNEZWYoKSkgY29udGludWU7CisgICAgICAvLyBJZ25vcmUgdHdvLWFkZHIgZGVmcy4KKyAgICAgIGlmIChNSS0+aXNSZWdUaWVkVG9Vc2VPcGVyYW5kKGkpKSBjb250aW51ZTsKKworICAgICAgRGVmSW5kaWNlc1tSZWddID0gQ291bnQ7CisgICAgICBLaWxsSW5kaWNlc1tSZWddID0gfjB1OworICAgICAgYXNzZXJ0KCgoS2lsbEluZGljZXNbUmVnXSA9PSB+MHUpICE9CisgICAgICAgICAgICAgIChEZWZJbmRpY2VzW1JlZ10gPT0gfjB1KSkgJiYKKyAgICAgICAgICAgICAiS2lsbCBhbmQgRGVmIG1hcHMgYXJlbid0IGNvbnNpc3RlbnQgZm9yIFJlZyEiKTsKKyAgICAgIEtlZXBSZWdzLmVyYXNlKFJlZyk7CisgICAgICBDbGFzc2VzW1JlZ10gPSAwOworICAgICAgUmVnUmVmcy5lcmFzZShSZWcpOworICAgICAgLy8gUmVwZWF0LCBmb3IgYWxsIHN1YnJlZ3MuCisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTdWJyZWcgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOworICAgICAgICAgICAqU3VicmVnOyArK1N1YnJlZykgeworICAgICAgICB1bnNpZ25lZCBTdWJyZWdSZWcgPSAqU3VicmVnOworICAgICAgICBEZWZJbmRpY2VzW1N1YnJlZ1JlZ10gPSBDb3VudDsKKyAgICAgICAgS2lsbEluZGljZXNbU3VicmVnUmVnXSA9IH4wdTsKKyAgICAgICAgS2VlcFJlZ3MuZXJhc2UoU3VicmVnUmVnKTsKKyAgICAgICAgQ2xhc3Nlc1tTdWJyZWdSZWddID0gMDsKKyAgICAgICAgUmVnUmVmcy5lcmFzZShTdWJyZWdSZWcpOworICAgICAgfQorICAgICAgLy8gQ29uc2VydmF0aXZlbHkgbWFyayBzdXBlci1yZWdpc3RlcnMgYXMgdW51c2FibGUuCisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTdXBlciA9IFRSSS0+Z2V0U3VwZXJSZWdpc3RlcnMoUmVnKTsKKyAgICAgICAgICAgKlN1cGVyOyArK1N1cGVyKSB7CisgICAgICAgIHVuc2lnbmVkIFN1cGVyUmVnID0gKlN1cGVyOworICAgICAgICBDbGFzc2VzW1N1cGVyUmVnXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPigtMSk7CisgICAgICB9CisgICAgfQorICB9CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkpIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChSZWcgPT0gMCkgY29udGludWU7CisgICAgaWYgKCFNTy5pc1VzZSgpKSBjb250aW51ZTsKKworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKk5ld1JDID0gMDsKKyAgICBpZiAoaSA8IE1JLT5nZXREZXNjKCkuZ2V0TnVtT3BlcmFuZHMoKSkKKyAgICAgIE5ld1JDID0gTUktPmdldERlc2MoKS5PcEluZm9baV0uZ2V0UmVnQ2xhc3MoVFJJKTsKKworICAgIC8vIEZvciBub3csIG9ubHkgYWxsb3cgdGhlIHJlZ2lzdGVyIHRvIGJlIGNoYW5nZWQgaWYgaXRzIHJlZ2lzdGVyCisgICAgLy8gY2xhc3MgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHVzZXMuCisgICAgaWYgKCFDbGFzc2VzW1JlZ10gJiYgTmV3UkMpCisgICAgICBDbGFzc2VzW1JlZ10gPSBOZXdSQzsKKyAgICBlbHNlIGlmICghTmV3UkMgfHwgQ2xhc3Nlc1tSZWddICE9IE5ld1JDKQorICAgICAgQ2xhc3Nlc1tSZWddID0gcmVpbnRlcnByZXRfY2FzdDxUYXJnZXRSZWdpc3RlckNsYXNzICo+KC0xKTsKKworICAgIFJlZ1JlZnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFJlZywgJk1PKSk7CisKKyAgICAvLyBJdCB3YXNuJ3QgcHJldmlvdXNseSBsaXZlIGJ1dCBub3cgaXQgaXMsIHRoaXMgaXMgYSBraWxsLgorICAgIGlmIChLaWxsSW5kaWNlc1tSZWddID09IH4wdSkgeworICAgICAgS2lsbEluZGljZXNbUmVnXSA9IENvdW50OworICAgICAgRGVmSW5kaWNlc1tSZWddID0gfjB1OworICAgICAgICAgIGFzc2VydCgoKEtpbGxJbmRpY2VzW1JlZ10gPT0gfjB1KSAhPQorICAgICAgICAgICAgICAgICAgKERlZkluZGljZXNbUmVnXSA9PSB+MHUpKSAmJgorICAgICAgICAgICAgICAgIktpbGwgYW5kIERlZiBtYXBzIGFyZW4ndCBjb25zaXN0ZW50IGZvciBSZWchIik7CisgICAgfQorICAgIC8vIFJlcGVhdCwgZm9yIGFsbCBhbGlhc2VzLgorICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqQWxpYXM7ICsrQWxpYXMpIHsKKyAgICAgIHVuc2lnbmVkIEFsaWFzUmVnID0gKkFsaWFzOworICAgICAgaWYgKEtpbGxJbmRpY2VzW0FsaWFzUmVnXSA9PSB+MHUpIHsKKyAgICAgICAgS2lsbEluZGljZXNbQWxpYXNSZWddID0gQ291bnQ7CisgICAgICAgIERlZkluZGljZXNbQWxpYXNSZWddID0gfjB1OworICAgICAgfQorICAgIH0KKyAgfQorfQorCit1bnNpZ25lZAorQ3JpdGljYWxBbnRpRGVwQnJlYWtlcjo6ZmluZFN1aXRhYmxlRnJlZVJlZ2lzdGVyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQW50aURlcFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMYXN0TmV3UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKQoreworICBmb3IgKFRhcmdldFJlZ2lzdGVyQ2xhc3M6Oml0ZXJhdG9yIFIgPSBSQy0+YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihNRiksCisgICAgICAgUkUgPSBSQy0+YWxsb2NhdGlvbl9vcmRlcl9lbmQoTUYpOyBSICE9IFJFOyArK1IpIHsKKyAgICB1bnNpZ25lZCBOZXdSZWcgPSAqUjsKKyAgICAvLyBEb24ndCByZXBsYWNlIGEgcmVnaXN0ZXIgd2l0aCBpdHNlbGYuCisgICAgaWYgKE5ld1JlZyA9PSBBbnRpRGVwUmVnKSBjb250aW51ZTsKKyAgICAvLyBEb24ndCByZXBsYWNlIGEgcmVnaXN0ZXIgd2l0aCBvbmUgdGhhdCB3YXMgcmVjZW50bHkgdXNlZCB0byByZXBhaXIKKyAgICAvLyBhbiBhbnRpLWRlcGVuZGVuY2Ugd2l0aCB0aGlzIEFudGlEZXBSZWcsIGJlY2F1c2UgdGhhdCB3b3VsZAorICAgIC8vIHJlLWludHJvZHVjZSB0aGF0IGFudGktZGVwZW5kZW5jZS4KKyAgICBpZiAoTmV3UmVnID09IExhc3ROZXdSZWcpIGNvbnRpbnVlOworICAgIC8vIElmIHRoZSBpbnN0cnVjdGlvbiBhbHJlYWR5IGhhcyBhIGRlZiBvZiB0aGUgTmV3UmVnLCBpdCdzIG5vdCBzdWl0YWJsZS4KKyAgICAvLyBGb3IgZXhhbXBsZSwgSW5zdHJ1Y3Rpb24gd2l0aCBtdWx0aXBsZSBkZWZpbml0aW9ucyBjYW4gcmVzdWx0IGluIHRoaXMKKyAgICAvLyBjb25kaXRpb24uCisgICAgaWYgKE1JLT5tb2RpZmllc1JlZ2lzdGVyKE5ld1JlZywgVFJJKSkgY29udGludWU7CisgICAgLy8gSWYgTmV3UmVnIGlzIGRlYWQgYW5kIE5ld1JlZydzIG1vc3QgcmVjZW50IGRlZiBpcyBub3QgYmVmb3JlCisgICAgLy8gQW50aURlcFJlZydzIGtpbGwsIGl0J3Mgc2FmZSB0byByZXBsYWNlIEFudGlEZXBSZWcgd2l0aCBOZXdSZWcuCisgICAgYXNzZXJ0KCgoS2lsbEluZGljZXNbQW50aURlcFJlZ10gPT0gfjB1KSAhPSAoRGVmSW5kaWNlc1tBbnRpRGVwUmVnXSA9PSB+MHUpKQorICAgICAgICAgICAmJiAiS2lsbCBhbmQgRGVmIG1hcHMgYXJlbid0IGNvbnNpc3RlbnQgZm9yIEFudGlEZXBSZWchIik7CisgICAgYXNzZXJ0KCgoS2lsbEluZGljZXNbTmV3UmVnXSA9PSB+MHUpICE9IChEZWZJbmRpY2VzW05ld1JlZ10gPT0gfjB1KSkKKyAgICAgICAgICAgJiYgIktpbGwgYW5kIERlZiBtYXBzIGFyZW4ndCBjb25zaXN0ZW50IGZvciBOZXdSZWchIik7CisgICAgaWYgKEtpbGxJbmRpY2VzW05ld1JlZ10gIT0gfjB1IHx8CisgICAgICAgIENsYXNzZXNbTmV3UmVnXSA9PSByZWludGVycHJldF9jYXN0PFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4oLTEpIHx8CisgICAgICAgIEtpbGxJbmRpY2VzW0FudGlEZXBSZWddID4gRGVmSW5kaWNlc1tOZXdSZWddKQorICAgICAgY29udGludWU7CisgICAgcmV0dXJuIE5ld1JlZzsKKyAgfQorCisgIC8vIE5vIHJlZ2lzdGVycyBhcmUgZnJlZSBhbmQgYXZhaWxhYmxlIQorICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgQ3JpdGljYWxBbnRpRGVwQnJlYWtlcjo6CitCcmVha0FudGlEZXBlbmRlbmNpZXMoY29uc3Qgc3RkOjp2ZWN0b3I8U1VuaXQ+JiBTVW5pdHMsCisgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5zZXJ0UG9zSW5kZXgpIHsKKyAgLy8gVGhlIGNvZGUgYmVsb3cgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpbnN0cnVjdGlvbiwKKyAgLy8gc28ganVzdCBkdWNrIG91dCBpbW1lZGlhdGVseSBpZiB0aGUgYmxvY2sgaXMgZW1wdHkuCisgIGlmIChTVW5pdHMuZW1wdHkoKSkgcmV0dXJuIDA7CisKKyAgLy8gS2VlcCBhIG1hcCBvZiB0aGUgTWFjaGluZUluc3RyKidzIGJhY2sgdG8gdGhlIFNVbml0IHJlcHJlc2VudGluZyB0aGVtLgorICAvLyBUaGlzIGlzIHVzZWQgZm9yIHVwZGF0aW5nIGRlYnVnIGluZm9ybWF0aW9uLgorICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLGNvbnN0IFNVbml0Kj4gTUlTVW5pdE1hcDsKKworICAvLyBGaW5kIHRoZSBub2RlIGF0IHRoZSBib3R0b20gb2YgdGhlIGNyaXRpY2FsIHBhdGguCisgIGNvbnN0IFNVbml0ICpNYXggPSAwOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU1VuaXRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBTVW5pdCAqU1UgPSAmU1VuaXRzW2ldOworICAgIE1JU1VuaXRNYXBbU1UtPmdldEluc3RyKCldID0gU1U7CisgICAgaWYgKCFNYXggfHwgU1UtPmdldERlcHRoKCkgKyBTVS0+TGF0ZW5jeSA+IE1heC0+Z2V0RGVwdGgoKSArIE1heC0+TGF0ZW5jeSkKKyAgICAgIE1heCA9IFNVOworICB9CisKKyNpZm5kZWYgTkRFQlVHCisgIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkNyaXRpY2FsIHBhdGggaGFzIHRvdGFsIGxhdGVuY3kgIgorICAgICAgICAgIDw8IChNYXgtPmdldERlcHRoKCkgKyBNYXgtPkxhdGVuY3kpIDw8ICJcbiIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiQXZhaWxhYmxlIHJlZ3M6Iik7CisgICAgZm9yICh1bnNpZ25lZCBSZWcgPSAwOyBSZWcgPCBUUkktPmdldE51bVJlZ3MoKTsgKytSZWcpIHsKKyAgICAgIGlmIChLaWxsSW5kaWNlc1tSZWddID09IH4wdSkKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIiA8PCBUUkktPmdldE5hbWUoUmVnKSk7CisgICAgfQorICAgIERFQlVHKGRiZ3MoKSA8PCAnXG4nKTsKKyAgfQorI2VuZGlmCisKKyAgLy8gVHJhY2sgcHJvZ3Jlc3MgYWxvbmcgdGhlIGNyaXRpY2FsIHBhdGggdGhyb3VnaCB0aGUgU1VuaXQgZ3JhcGggYXMgd2Ugd2FsaworICAvLyB0aGUgaW5zdHJ1Y3Rpb25zLgorICBjb25zdCBTVW5pdCAqQ3JpdGljYWxQYXRoU1UgPSBNYXg7CisgIE1hY2hpbmVJbnN0ciAqQ3JpdGljYWxQYXRoTUkgPSBDcml0aWNhbFBhdGhTVS0+Z2V0SW5zdHIoKTsKKworICAvLyBDb25zaWRlciB0aGlzIHBhdHRlcm46CisgIC8vICAgQSA9IC4uLgorICAvLyAgIC4uLiA9IEEKKyAgLy8gICBBID0gLi4uCisgIC8vICAgLi4uID0gQQorICAvLyAgIEEgPSAuLi4KKyAgLy8gICAuLi4gPSBBCisgIC8vICAgQSA9IC4uLgorICAvLyAgIC4uLiA9IEEKKyAgLy8gVGhlcmUgYXJlIHRocmVlIGFudGktZGVwZW5kZW5jaWVzIGhlcmUsIGFuZCB3aXRob3V0IHNwZWNpYWwgY2FyZSwKKyAgLy8gd2UnZCBicmVhayBhbGwgb2YgdGhlbSB1c2luZyB0aGUgc2FtZSByZWdpc3RlcjoKKyAgLy8gICBBID0gLi4uCisgIC8vICAgLi4uID0gQQorICAvLyAgIEIgPSAuLi4KKyAgLy8gICAuLi4gPSBCCisgIC8vICAgQiA9IC4uLgorICAvLyAgIC4uLiA9IEIKKyAgLy8gICBCID0gLi4uCisgIC8vICAgLi4uID0gQgorICAvLyBiZWNhdXNlIGF0IGVhY2ggYW50aS1kZXBlbmRlbmNlLCBCIGlzIHRoZSBmaXJzdCByZWdpc3RlciB0aGF0CisgIC8vIGlzbid0IEEgd2hpY2ggaXMgZnJlZS4gIFRoaXMgcmUtaW50cm9kdWNlcyBhbnRpLWRlcGVuZGVuY2llcworICAvLyBhdCBhbGwgYnV0IG9uZSBvZiB0aGUgb3JpZ2luYWwgYW50aS1kZXBlbmRlbmNpZXMgdGhhdCB3ZSB3ZXJlCisgIC8vIHRyeWluZyB0byBicmVhay4gIFRvIGF2b2lkIHRoaXMsIGtlZXAgdHJhY2sgb2YgdGhlIG1vc3QgcmVjZW50CisgIC8vIHJlZ2lzdGVyIHRoYXQgZWFjaCByZWdpc3RlciB3YXMgcmVwbGFjZWQgd2l0aCwgYXZvaWQKKyAgLy8gdXNpbmcgaXQgdG8gcmVwYWlyIGFuIGFudGktZGVwZW5kZW5jZSBvbiB0aGUgc2FtZSByZWdpc3Rlci4KKyAgLy8gVGhpcyBsZXRzIHVzIHByb2R1Y2UgdGhpczoKKyAgLy8gICBBID0gLi4uCisgIC8vICAgLi4uID0gQQorICAvLyAgIEIgPSAuLi4KKyAgLy8gICAuLi4gPSBCCisgIC8vICAgQyA9IC4uLgorICAvLyAgIC4uLiA9IEMKKyAgLy8gICBCID0gLi4uCisgIC8vICAgLi4uID0gQgorICAvLyBUaGlzIHN0aWxsIGhhcyBhbiBhbnRpLWRlcGVuZGVuY2Ugb24gQiwgYnV0IGF0IGxlYXN0IGl0IGlzbid0IG9uIHRoZQorICAvLyBvcmlnaW5hbCBjcml0aWNhbCBwYXRoLgorICAvLworICAvLyBUT0RPOiBJZiB3ZSB0cmFja2VkIG1vcmUgdGhhbiBvbmUgcmVnaXN0ZXIgaGVyZSwgd2UgY291bGQgcG90ZW50aWFsbHkKKyAgLy8gZml4IHRoYXQgcmVtYWluaW5nIGNyaXRpY2FsIGVkZ2UgdG9vLiBUaGlzIGlzIGEgbGl0dGxlIG1vcmUgaW52b2x2ZWQsCisgIC8vIGJlY2F1c2UgdW5saWtlIHRoZSBtb3N0IHJlY2VudCByZWdpc3RlciwgbGVzcyByZWNlbnQgcmVnaXN0ZXJzIHNob3VsZAorICAvLyBzdGlsbCBiZSBjb25zaWRlcmVkLCB0aG91Z2ggb25seSBpZiBubyBvdGhlciByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZS4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IExhc3ROZXdSZWcoVFJJLT5nZXROdW1SZWdzKCksIDApOworCisgIC8vIEF0dGVtcHQgdG8gYnJlYWsgYW50aS1kZXBlbmRlbmNlIGVkZ2VzIG9uIHRoZSBjcml0aWNhbCBwYXRoLiBXYWxrIHRoZQorICAvLyBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgYm90dG9tIHVwLCB0cmFja2luZyBpbmZvcm1hdGlvbiBhYm91dCBsaXZlbmVzcworICAvLyBhcyB3ZSBnbyB0byBoZWxwIGRldGVybWluZSB3aGljaCByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZS4KKyAgdW5zaWduZWQgQnJva2VuID0gMDsKKyAgdW5zaWduZWQgQ291bnQgPSBJbnNlcnRQb3NJbmRleCAtIDE7CisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBFbmQsIEUgPSBCZWdpbjsKKyAgICAgICBJICE9IEU7IC0tQ291bnQpIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gLS1JOworICAgIGlmIChNSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIENoZWNrIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGEgZGVwZW5kZW5jZSBvbiB0aGUgY3JpdGljYWwgcGF0aCB0aGF0CisgICAgLy8gaXMgYW4gYW50aS1kZXBlbmRlbmNlIHRoYXQgd2UgbWF5IGJlIGFibGUgdG8gYnJlYWsuIElmIGl0IGlzLCBzZXQKKyAgICAvLyBBbnRpRGVwUmVnIHRvIHRoZSBub24temVybyByZWdpc3RlciBhc3NvY2lhdGVkIHdpdGggdGhlIGFudGktZGVwZW5kZW5jZS4KKyAgICAvLworICAgIC8vIFdlIGxpbWl0IG91ciBhdHRlbnRpb24gdG8gdGhlIGNyaXRpY2FsIHBhdGggYXMgYSBoZXVyaXN0aWMgdG8gYXZvaWQKKyAgICAvLyBicmVha2luZyBhbnRpLWRlcGVuZGVuY2UgZWRnZXMgdGhhdCBhcmVuJ3QgZ29pbmcgdG8gc2lnbmlmaWNhbnRseQorICAgIC8vIGltcGFjdCB0aGUgb3ZlcmFsbCBzY2hlZHVsZS4gVGhlcmUgYXJlIGEgbGltaXRlZCBudW1iZXIgb2YgcmVnaXN0ZXJzCisgICAgLy8gYW5kIHdlIHdhbnQgdG8gc2F2ZSB0aGVtIGZvciB0aGUgaW1wb3J0YW50IGVkZ2VzLgorICAgIC8vCisgICAgLy8gVE9ETzogSW5zdHJ1Y3Rpb25zIHdpdGggbXVsdGlwbGUgZGVmcyBjb3VsZCBoYXZlIG11bHRpcGxlCisgICAgLy8gYW50aS1kZXBlbmRlbmNpZXMuIFRoZSBjdXJyZW50IGNvZGUgaGVyZSBvbmx5IGtub3dzIGhvdyB0byBicmVhayBvbmUKKyAgICAvLyBlZGdlIHBlciBpbnN0cnVjdGlvbi4gTm90ZSB0aGF0IHdlJ2QgaGF2ZSB0byBiZSBhYmxlIHRvIGJyZWFrIGFsbCBvZgorICAgIC8vIHRoZSBhbnRpLWRlcGVuZGVuY2llcyBpbiBhbiBpbnN0cnVjdGlvbiBpbiBvcmRlciB0byBiZSBlZmZlY3RpdmUuCisgICAgdW5zaWduZWQgQW50aURlcFJlZyA9IDA7CisgICAgaWYgKE1JID09IENyaXRpY2FsUGF0aE1JKSB7CisgICAgICBpZiAoY29uc3QgU0RlcCAqRWRnZSA9IENyaXRpY2FsUGF0aFN0ZXAoQ3JpdGljYWxQYXRoU1UpKSB7CisgICAgICAgIGNvbnN0IFNVbml0ICpOZXh0U1UgPSBFZGdlLT5nZXRTVW5pdCgpOworCisgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgYW50aS1kZXBlbmRlbmNlIGVkZ2VzLgorICAgICAgICBpZiAoRWRnZS0+Z2V0S2luZCgpID09IFNEZXA6OkFudGkpIHsKKyAgICAgICAgICBBbnRpRGVwUmVnID0gRWRnZS0+Z2V0UmVnKCk7CisgICAgICAgICAgYXNzZXJ0KEFudGlEZXBSZWcgIT0gMCAmJiAiQW50aS1kZXBlbmRlbmNlIG9uIHJlZzA/Iik7CisgICAgICAgICAgaWYgKCFBbGxvY2F0YWJsZVNldC50ZXN0KEFudGlEZXBSZWcpKQorICAgICAgICAgICAgLy8gRG9uJ3QgYnJlYWsgYW50aS1kZXBlbmRlbmNpZXMgb24gbm9uLWFsbG9jYXRhYmxlIHJlZ2lzdGVycy4KKyAgICAgICAgICAgIEFudGlEZXBSZWcgPSAwOworICAgICAgICAgIGVsc2UgaWYgKEtlZXBSZWdzLmNvdW50KEFudGlEZXBSZWcpKQorICAgICAgICAgICAgLy8gRG9uJ3QgYnJlYWsgYW50aS1kZXBlbmRlbmNpZXMgaWYgYW4gdXNlIGRvd24gYmVsb3cgcmVxdWlyZXMKKyAgICAgICAgICAgIC8vIHRoaXMgZXhhY3QgcmVnaXN0ZXIuCisgICAgICAgICAgICBBbnRpRGVwUmVnID0gMDsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBTVW5pdCBoYXMgb3RoZXIgZGVwZW5kZW5jaWVzIG9uIHRoZSBTVW5pdCB0aGF0IGl0CisgICAgICAgICAgICAvLyBhbnRpLWRlcGVuZHMgb24sIGRvbid0IGJvdGhlciBicmVha2luZyB0aGUgYW50aS1kZXBlbmRlbmN5CisgICAgICAgICAgICAvLyBzaW5jZSB0aG9zZSBlZGdlcyB3b3VsZCBwcmV2ZW50IHN1Y2ggdW5pdHMgZnJvbSBiZWluZworICAgICAgICAgICAgLy8gc2NoZWR1bGVkIHBhc3QgZWFjaCBvdGhlciByZWdhcmRsZXNzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEFsc28sIGlmIHRoZXJlIGFyZSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgU1VuaXRzIHdpdGggdGhlCisgICAgICAgICAgICAvLyBzYW1lIHJlZ2lzdGVyIGFzIHRoZSBhbnRpLWRlcGVuZGVuY3ksIGRvbid0IGF0dGVtcHQgdG8KKyAgICAgICAgICAgIC8vIGJyZWFrIGl0LgorICAgICAgICAgICAgZm9yIChTVW5pdDo6Y29uc3RfcHJlZF9pdGVyYXRvciBQID0gQ3JpdGljYWxQYXRoU1UtPlByZWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgIFBFID0gQ3JpdGljYWxQYXRoU1UtPlByZWRzLmVuZCgpOyBQICE9IFBFOyArK1ApCisgICAgICAgICAgICAgIGlmIChQLT5nZXRTVW5pdCgpID09IE5leHRTVSA/CisgICAgICAgICAgICAgICAgICAgIChQLT5nZXRLaW5kKCkgIT0gU0RlcDo6QW50aSB8fCBQLT5nZXRSZWcoKSAhPSBBbnRpRGVwUmVnKSA6CisgICAgICAgICAgICAgICAgICAgIChQLT5nZXRLaW5kKCkgPT0gU0RlcDo6RGF0YSAmJiBQLT5nZXRSZWcoKSA9PSBBbnRpRGVwUmVnKSkgeworICAgICAgICAgICAgICAgIEFudGlEZXBSZWcgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENyaXRpY2FsUGF0aFNVID0gTmV4dFNVOworICAgICAgICBDcml0aWNhbFBhdGhNSSA9IENyaXRpY2FsUGF0aFNVLT5nZXRJbnN0cigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjcml0aWNhbCBwYXRoLgorICAgICAgICBDcml0aWNhbFBhdGhTVSA9IDA7CisgICAgICAgIENyaXRpY2FsUGF0aE1JID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBQcmVzY2FuSW5zdHJ1Y3Rpb24oTUkpOworCisgICAgLy8gSWYgTUkncyBkZWZzIGhhdmUgYSBzcGVjaWFsIGFsbG9jYXRpb24gcmVxdWlyZW1lbnQsIGRvbid0IGFsbG93CisgICAgLy8gYW55IGRlZiByZWdpc3RlcnMgdG8gYmUgY2hhbmdlZC4gQWxzbyBhc3N1bWUgYWxsIHJlZ2lzdGVycworICAgIC8vIGRlZmluZWQgaW4gYSBjYWxsIG11c3Qgbm90IGJlIGNoYW5nZWQgKEFCSSkuCisgICAgaWYgKE1JLT5nZXREZXNjKCkuaXNDYWxsKCkgfHwgTUktPmdldERlc2MoKS5oYXNFeHRyYURlZlJlZ0FsbG9jUmVxKCkgfHwKKyAgICAgICAgVElJLT5pc1ByZWRpY2F0ZWQoTUkpKQorICAgICAgLy8gSWYgdGhpcyBpbnN0cnVjdGlvbidzIGRlZnMgaGF2ZSBzcGVjaWFsIGFsbG9jYXRpb24gcmVxdWlyZW1lbnQsIGRvbid0CisgICAgICAvLyBicmVhayB0aGlzIGFudGktZGVwZW5kZW5jeS4KKyAgICAgIEFudGlEZXBSZWcgPSAwOworICAgIGVsc2UgaWYgKEFudGlEZXBSZWcpIHsKKyAgICAgIC8vIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGEgdXNlIG9mIEFudGlEZXBSZWcsIGJyZWFraW5nIGl0CisgICAgICAvLyBpcyBpbnZhbGlkLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKCFNTy5pc1JlZygpKSBjb250aW51ZTsKKyAgICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICAgIGlmIChSZWcgPT0gMCkgY29udGludWU7CisgICAgICAgIGlmIChNTy5pc1VzZSgpICYmIFRSSS0+cmVnc092ZXJsYXAoQW50aURlcFJlZywgUmVnKSkgeworICAgICAgICAgIEFudGlEZXBSZWcgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIEFudGlEZXBSZWcncyByZWdpc3RlciBjbGFzcywgaWYgaXQgaXMgbGl2ZSBhbmQgaXMKKyAgICAvLyBjb25zaXN0ZW50bHkgdXNlZCB3aXRoaW4gYSBzaW5nbGUgY2xhc3MuCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBBbnRpRGVwUmVnICE9IDAgPyBDbGFzc2VzW0FudGlEZXBSZWddIDogMDsKKyAgICBhc3NlcnQoKEFudGlEZXBSZWcgPT0gMCB8fCBSQyAhPSBOVUxMKSAmJgorICAgICAgICAgICAiUmVnaXN0ZXIgc2hvdWxkIGJlIGxpdmUgaWYgaXQncyBjYXVzaW5nIGFuIGFudGktZGVwZW5kZW5jZSEiKTsKKyAgICBpZiAoUkMgPT0gcmVpbnRlcnByZXRfY2FzdDxUYXJnZXRSZWdpc3RlckNsYXNzICo+KC0xKSkKKyAgICAgIEFudGlEZXBSZWcgPSAwOworCisgICAgLy8gTG9vayBmb3IgYSBzdWl0YWJsZSByZWdpc3RlciB0byB1c2UgdG8gYnJlYWsgdGhlIGFudGktZGVwZW5lbmNlLgorICAgIC8vCisgICAgLy8gVE9ETzogSW5zdGVhZCBvZiBwaWNraW5nIHRoZSBmaXJzdCBmcmVlIHJlZ2lzdGVyLCBjb25zaWRlciB3aGljaCBtaWdodAorICAgIC8vIGJlIHRoZSBiZXN0LgorICAgIGlmIChBbnRpRGVwUmVnICE9IDApIHsKKyAgICAgIGlmICh1bnNpZ25lZCBOZXdSZWcgPSBmaW5kU3VpdGFibGVGcmVlUmVnaXN0ZXIoTUksIEFudGlEZXBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3ROZXdSZWdbQW50aURlcFJlZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDKSkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkJyZWFraW5nIGFudGktZGVwZW5kZW5jZSBlZGdlIG9uICIKKyAgICAgICAgICAgICAgPDwgVFJJLT5nZXROYW1lKEFudGlEZXBSZWcpCisgICAgICAgICAgICAgIDw8ICIgd2l0aCAiIDw8IFJlZ1JlZnMuY291bnQoQW50aURlcFJlZykgPDwgIiByZWZlcmVuY2VzIgorICAgICAgICAgICAgICA8PCAiIHVzaW5nICIgPDwgVFJJLT5nZXROYW1lKE5ld1JlZykgPDwgIiFcbiIpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVmZXJlbmNlcyB0byB0aGUgb2xkIHJlZ2lzdGVyIHRvIHJlZmVyIHRvIHRoZSBuZXcKKyAgICAgICAgLy8gcmVnaXN0ZXIuCisgICAgICAgIHN0ZDo6cGFpcjxzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBNYWNoaW5lT3BlcmFuZCAqPjo6aXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBNYWNoaW5lT3BlcmFuZCAqPjo6aXRlcmF0b3I+CisgICAgICAgICAgIFJhbmdlID0gUmVnUmVmcy5lcXVhbF9yYW5nZShBbnRpRGVwUmVnKTsKKyAgICAgICAgZm9yIChzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBNYWNoaW5lT3BlcmFuZCAqPjo6aXRlcmF0b3IKKyAgICAgICAgICAgICBRID0gUmFuZ2UuZmlyc3QsIFFFID0gUmFuZ2Uuc2Vjb25kOyBRICE9IFFFOyArK1EpIHsKKyAgICAgICAgICBRLT5zZWNvbmQtPnNldFJlZyhOZXdSZWcpOworICAgICAgICAgIC8vIElmIHRoZSBTVSBmb3IgdGhlIGluc3RydWN0aW9uIGJlaW5nIHVwZGF0ZWQgaGFzIGRlYnVnIGluZm9ybWF0aW9uCisgICAgICAgICAgLy8gcmVsYXRlZCB0byB0aGUgYW50aS1kZXBlbmRlbmN5IHJlZ2lzdGVyLCBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoYXQKKyAgICAgICAgICAvLyBhcyB3ZWxsLgorICAgICAgICAgIGNvbnN0IFNVbml0ICpTVSA9IE1JU1VuaXRNYXBbUS0+c2Vjb25kLT5nZXRQYXJlbnQoKV07CisgICAgICAgICAgaWYgKCFTVSkgY29udGludWU7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNVLT5EYmdJbnN0ckxpc3Quc2l6ZSgpIDsgaSA8IGUgOyArK2kpIHsKKyAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqREkgPSBTVS0+RGJnSW5zdHJMaXN0W2ldOworICAgICAgICAgICAgYXNzZXJ0IChESS0+Z2V0TnVtT3BlcmFuZHMoKT09MyAmJiBESS0+Z2V0T3BlcmFuZCgwKS5pc1JlZygpICYmCisgICAgICAgICAgICAgICAgICAgIERJLT5nZXRPcGVyYW5kKDApLmdldFJlZygpCisgICAgICAgICAgICAgICAgICAgICYmICJOb24gcmVnaXN0ZXIgZGJnX3ZhbHVlIGF0dGFjaGVkIHRvIFNVbml0ISIpOworICAgICAgICAgICAgaWYgKERJLT5nZXRPcGVyYW5kKDApLmdldFJlZygpID09IEFudGlEZXBSZWcpCisgICAgICAgICAgICAgIERJLT5nZXRPcGVyYW5kKDApLnNldFJlZyhOZXdSZWcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGp1c3Qgd2VudCBiYWNrIGluIHRpbWUgYW5kIG1vZGlmaWVkIGhpc3Rvcnk7IHRoZQorICAgICAgICAvLyBsaXZlbmVzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGFudGktZGVwZW5lbmNlIHJlZyBpcyBub3cKKyAgICAgICAgLy8gaW5jb25zaXN0ZW50LiBTZXQgdGhlIHN0YXRlIGFzIGlmIGl0IHdlcmUgZGVhZC4KKyAgICAgICAgQ2xhc3Nlc1tOZXdSZWddID0gQ2xhc3Nlc1tBbnRpRGVwUmVnXTsKKyAgICAgICAgRGVmSW5kaWNlc1tOZXdSZWddID0gRGVmSW5kaWNlc1tBbnRpRGVwUmVnXTsKKyAgICAgICAgS2lsbEluZGljZXNbTmV3UmVnXSA9IEtpbGxJbmRpY2VzW0FudGlEZXBSZWddOworICAgICAgICBhc3NlcnQoKChLaWxsSW5kaWNlc1tOZXdSZWddID09IH4wdSkgIT0KKyAgICAgICAgICAgICAgICAoRGVmSW5kaWNlc1tOZXdSZWddID09IH4wdSkpICYmCisgICAgICAgICAgICAgIktpbGwgYW5kIERlZiBtYXBzIGFyZW4ndCBjb25zaXN0ZW50IGZvciBOZXdSZWchIik7CisKKyAgICAgICAgQ2xhc3Nlc1tBbnRpRGVwUmVnXSA9IDA7CisgICAgICAgIERlZkluZGljZXNbQW50aURlcFJlZ10gPSBLaWxsSW5kaWNlc1tBbnRpRGVwUmVnXTsKKyAgICAgICAgS2lsbEluZGljZXNbQW50aURlcFJlZ10gPSB+MHU7CisgICAgICAgIGFzc2VydCgoKEtpbGxJbmRpY2VzW0FudGlEZXBSZWddID09IH4wdSkgIT0KKyAgICAgICAgICAgICAgICAoRGVmSW5kaWNlc1tBbnRpRGVwUmVnXSA9PSB+MHUpKSAmJgorICAgICAgICAgICAgICJLaWxsIGFuZCBEZWYgbWFwcyBhcmVuJ3QgY29uc2lzdGVudCBmb3IgQW50aURlcFJlZyEiKTsKKworICAgICAgICBSZWdSZWZzLmVyYXNlKEFudGlEZXBSZWcpOworICAgICAgICBMYXN0TmV3UmVnW0FudGlEZXBSZWddID0gTmV3UmVnOworICAgICAgICArK0Jyb2tlbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTY2FuSW5zdHJ1Y3Rpb24oTUksIENvdW50KTsKKyAgfQorCisgIHJldHVybiBCcm9rZW47Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9Dcml0aWNhbEFudGlEZXBCcmVha2VyLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Dcml0aWNhbEFudGlEZXBCcmVha2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkN2MzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0NyaXRpY2FsQW50aURlcEJyZWFrZXIuaApAQCAtMCwwICsxLDEwMCBAQAorLy89LSBsbHZtL0NvZGVHZW4vQ3JpdGljYWxBbnRpRGVwQnJlYWtlci5oIC0gQW50aS1EZXAgU3VwcG9ydCAtKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBDcml0aWNhbEFudGlEZXBCcmVha2VyIGNsYXNzLCB3aGljaAorLy8gaW1wbGVtZW50cyByZWdpc3RlciBhbnRpLWRlcGVuZGVuY2UgYnJlYWtpbmcgYWxvbmcgYSBibG9ja3MKKy8vIGNyaXRpY2FsIHBhdGggZHVyaW5nIHBvc3QtUkEgc2NoZWR1bGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0NSSVRJQ0FMQU5USURFUEJSRUFLRVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fQ1JJVElDQUxBTlRJREVQQlJFQUtFUl9ICisKKyNpbmNsdWRlICJBbnRpRGVwQnJlYWtlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworICBjbGFzcyBDcml0aWNhbEFudGlEZXBCcmVha2VyIDogcHVibGljIEFudGlEZXBCcmVha2VyIHsKKyAgICBNYWNoaW5lRnVuY3Rpb24mIE1GOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKworICAgIC8vLyBBbGxvY2F0YWJsZVNldCAtIFRoZSBzZXQgb2YgYWxsb2NhdGFibGUgcmVnaXN0ZXJzLgorICAgIC8vLyBXZSdsbCBiZSBpZ25vcmluZyBhbnRpLWRlcGVuZGVuY2llcyBvbiBub24tYWxsb2NhdGFibGUgcmVnaXN0ZXJzLAorICAgIC8vLyBiZWNhdXNlIHRoZXkgbWF5IG5vdCBiZSBzYWZlIHRvIGJyZWFrLgorICAgIGNvbnN0IEJpdFZlY3RvciBBbGxvY2F0YWJsZVNldDsKKworICAgIC8vLyBDbGFzc2VzIC0gRm9yIGxpdmUgcmVncyB0aGF0IGFyZSBvbmx5IHVzZWQgaW4gb25lIHJlZ2lzdGVyIGNsYXNzIGluIGEKKyAgICAvLy8gbGl2ZSByYW5nZSwgdGhlIHJlZ2lzdGVyIGNsYXNzLiBJZiB0aGUgcmVnaXN0ZXIgaXMgbm90IGxpdmUsIHRoZQorICAgIC8vLyBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIG51bGwuIElmIHRoZSByZWdpc3RlciBpcyBsaXZlIGJ1dCB1c2VkIGluCisgICAgLy8vIG11bHRpcGxlIHJlZ2lzdGVyIGNsYXNzZXMsIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIC0xIGNhc3RlZCB0byBhCisgICAgLy8vIHBvaW50ZXIuCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+IENsYXNzZXM7CisKKyAgICAvLy8gUmVnUmVncyAtIE1hcCByZWdpc3RlcnMgdG8gYWxsIHRoZWlyIHJlZmVyZW5jZXMgd2l0aGluIGEgbGl2ZSByYW5nZS4KKyAgICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBNYWNoaW5lT3BlcmFuZCAqPiBSZWdSZWZzOworCisgICAgLy8vIEtpbGxJbmRpY2VzIC0gVGhlIGluZGV4IG9mIHRoZSBtb3N0IHJlY2VudCBraWxsIChwcm9jZWRpbmcgYm90dG9tLXVwKSwKKyAgICAvLy8gb3IgfjB1IGlmIHRoZSByZWdpc3RlciBpcyBub3QgbGl2ZS4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gS2lsbEluZGljZXM7CisKKyAgICAvLy8gRGVmSW5kaWNlcyAtIFRoZSBpbmRleCBvZiB0aGUgbW9zdCByZWNlbnQgY29tcGxldGUgZGVmIChwcm9jZWRpbmcgYm90dG9tCisgICAgLy8vIHVwKSwgb3IgfjB1IGlmIHRoZSByZWdpc3RlciBpcyBsaXZlLgorICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBEZWZJbmRpY2VzOworCisgICAgLy8vIEtlZXBSZWdzIC0gQSBzZXQgb2YgcmVnaXN0ZXJzIHdoaWNoIGFyZSBsaXZlIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB0bworICAgIC8vLyBicmVhayBhbnRpLWRlcGVuZGVuY2llcy4KKyAgICBTbWFsbFNldDx1bnNpZ25lZCwgND4gS2VlcFJlZ3M7CisKKyAgcHVibGljOgorICAgIENyaXRpY2FsQW50aURlcEJyZWFrZXIoTWFjaGluZUZ1bmN0aW9uJiBNRmkpOworICAgIH5Dcml0aWNhbEFudGlEZXBCcmVha2VyKCk7CisKKyAgICAvLy8gU3RhcnQgLSBJbml0aWFsaXplIGFudGktZGVwIGJyZWFraW5nIGZvciBhIG5ldyBiYXNpYyBibG9jay4KKyAgICB2b2lkIFN0YXJ0QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCKTsKKworICAgIC8vLyBCcmVha0FudGlEZXBlbmRlbmNpZXMgLSBJZGVudGlmaXkgYW50aS1kZXBlbmRlbmNpZXMgYWxvbmcgdGhlIGNyaXRpY2FsCisgICAgLy8vIHBhdGgKKyAgICAvLy8gb2YgdGhlIFNjaGVkdWxlREFHIGFuZCBicmVhayB0aGVtIGJ5IHJlbmFtaW5nIHJlZ2lzdGVycy4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBCcmVha0FudGlEZXBlbmRlbmNpZXMoY29uc3Qgc3RkOjp2ZWN0b3I8U1VuaXQ+JiBTVW5pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5zZXJ0UG9zSW5kZXgpOworCisgICAgLy8vIE9ic2VydmUgLSBVcGRhdGUgbGl2ZW5lc3MgaW5mb3JtYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlIGN1cnJlbnQKKyAgICAvLy8gaW5zdHJ1Y3Rpb24sIHdoaWNoIHdpbGwgbm90IGJlIHNjaGVkdWxlZC4KKyAgICAvLy8KKyAgICB2b2lkIE9ic2VydmUoTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgQ291bnQsIHVuc2lnbmVkIEluc2VydFBvc0luZGV4KTsKKworICAgIC8vLyBGaW5pc2ggLSBGaW5pc2ggYW50aS1kZXAgYnJlYWtpbmcgZm9yIGEgYmFzaWMgYmxvY2suCisgICAgdm9pZCBGaW5pc2hCbG9jaygpOworCisgIHByaXZhdGU6CisgICAgdm9pZCBQcmVzY2FuSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSk7CisgICAgdm9pZCBTY2FuSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgQ291bnQpOworICAgIHVuc2lnbmVkIGZpbmRTdWl0YWJsZUZyZWVSZWdpc3RlcihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbnRpRGVwUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMYXN0TmV3UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICopOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0RlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0RlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzhiODNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vRGVhZE1hY2hpbmVJbnN0cnVjdGlvbkVsaW0uY3BwCkBAIC0wLDAgKzEsMTg2IEBACisvLz09PS0gRGVhZE1hY2hpbmVJbnN0cnVjdGlvbkVsaW0uY3BwIC0gUmVtb3ZlIGRlYWQgbWFjaGluZSBpbnN0cnVjdGlvbnMgLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgYW4gZXh0cmVtZWx5IHNpbXBsZSBNYWNoaW5lSW5zdHItbGV2ZWwgZGVhZC1jb2RlLWVsaW1pbmF0aW9uIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJjb2RlZ2VuLWRjZSIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtRGVsZXRlcywgICAgICAgICAgIk51bWJlciBvZiBkZWFkIGluc3RydWN0aW9ucyBkZWxldGVkIik7CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIERlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKyAgICAKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgICAgQml0VmVjdG9yIExpdmVQaHlzUmVnczsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBEZWFkTWFjaGluZUluc3RydWN0aW9uRWxpbSgpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICBwcml2YXRlOgorICAgIGJvb2wgaXNEZWFkKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0OworICB9OworfQorY2hhciBEZWFkTWFjaGluZUluc3RydWN0aW9uRWxpbTo6SUQgPSAwOworCitJTklUSUFMSVpFX1BBU1MoRGVhZE1hY2hpbmVJbnN0cnVjdGlvbkVsaW0sICJkZWFkLW1pLWVsaW1pbmF0aW9uIiwKKyAgICAgICAgICAgICAgICAiUmVtb3ZlIGRlYWQgbWFjaGluZSBpbnN0cnVjdGlvbnMiLCBmYWxzZSwgZmFsc2UpOworCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZURlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBEZWFkTWFjaGluZUluc3RydWN0aW9uRWxpbSgpOworfQorCitib29sIERlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltOjppc0RlYWQoY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICAvLyBEb24ndCBkZWxldGUgaW5zdHJ1Y3Rpb25zIHdpdGggc2lkZSBlZmZlY3RzLgorICBib29sIFNhd1N0b3JlID0gZmFsc2U7CisgIGlmICghTUktPmlzU2FmZVRvTW92ZShUSUksIDAsIFNhd1N0b3JlKSAmJiAhTUktPmlzUEhJKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEV4YW1pbmUgZWFjaCBvcGVyYW5kLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNEZWYoKSkgeworICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSA/CisgICAgICAgICAgTGl2ZVBoeXNSZWdzW1JlZ10gOiAhTVJJLT51c2Vfbm9kYmdfZW1wdHkoUmVnKSkgeworICAgICAgICAvLyBUaGlzIGRlZiBoYXMgYSBub24tZGVidWcgdXNlLiBEb24ndCBkZWxldGUgdGhlIGluc3RydWN0aW9uIQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlcmUgYXJlIG5vIGRlZnMgd2l0aCB1c2VzLCB0aGUgaW5zdHJ1Y3Rpb24gaXMgZGVhZC4KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVhZE1hY2hpbmVJbnN0cnVjdGlvbkVsaW06OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgYm9vbCBBbnlDaGFuZ2VzID0gZmFsc2U7CisgIE1SSSA9ICZNRi5nZXRSZWdJbmZvKCk7CisgIFRSSSA9IE1GLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICBUSUkgPSBNRi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKTsKKworICAvLyBDb21wdXRlIGEgYml0dmVjdG9yIHRvIHJlcHJlc2VudCBhbGwgbm9uLWFsbG9jYXRhYmxlIHBoeXNyZWdzLgorICBCaXRWZWN0b3IgTm9uQWxsb2NhdGFibGVSZWdzID0gVFJJLT5nZXRBbGxvY2F0YWJsZVNldChNRik7CisgIE5vbkFsbG9jYXRhYmxlUmVncy5mbGlwKCk7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBpbnN0cnVjdGlvbnMgaW4gYWxsIGJsb2NrcywgZnJvbSBib3R0b20gdG8gdG9wLCBzbyB0aGF0IGl0J3MKKyAgLy8gbW9yZSBsaWtlbHkgdGhhdCBjaGFpbnMgb2YgZGVwZW5kZW50IGJ1dCB1bHRpbWF0ZWx5IGRlYWQgaW5zdHJ1Y3Rpb25zIHdpbGwKKyAgLy8gYmUgY2xlYW5lZCB1cC4KKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246OnJldmVyc2VfaXRlcmF0b3IgSSA9IE1GLnJiZWdpbigpLCBFID0gTUYucmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9ICYqSTsKKworICAgIC8vIFN0YXJ0IG91dCBhc3N1bWluZyB0aGF0IGFsbCBub24tYWxsb2NhdGFibGUgcmVnaXN0ZXJzIGFyZSBsaXZlCisgICAgLy8gb3V0IG9mIHRoaXMgYmxvY2suCisgICAgTGl2ZVBoeXNSZWdzID0gTm9uQWxsb2NhdGFibGVSZWdzOworCisgICAgLy8gQWxzbyBhZGQgYW55IGV4cGxpY2l0IGxpdmUtb3V0IHBoeXNyZWdzIGZvciB0aGlzIGJsb2NrLgorICAgIGlmICghTUJCLT5lbXB0eSgpICYmIE1CQi0+YmFjaygpLmdldERlc2MoKS5pc1JldHVybigpKQorICAgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpsaXZlb3V0X2l0ZXJhdG9yIExPSSA9IE1SSS0+bGl2ZW91dF9iZWdpbigpLAorICAgICAgICAgICBMT0UgPSBNUkktPmxpdmVvdXRfZW5kKCk7IExPSSAhPSBMT0U7ICsrTE9JKSB7CisgICAgICAgIHVuc2lnbmVkIFJlZyA9ICpMT0k7CisgICAgICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpKQorICAgICAgICAgIExpdmVQaHlzUmVncy5zZXQoUmVnKTsKKyAgICAgIH0KKworICAgIC8vIE5vdyBzY2FuIHRoZSBpbnN0cnVjdGlvbnMgYW5kIGRlbGV0ZSBkZWFkIG9uZXMsIHRyYWNraW5nIHBoeXNyZWcKKyAgICAvLyBsaXZlbmVzcyBhcyB3ZSBnby4KKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpyZXZlcnNlX2l0ZXJhdG9yIE1JSSA9IE1CQi0+cmJlZ2luKCksCisgICAgICAgICBNSUUgPSBNQkItPnJlbmQoKTsgTUlJICE9IE1JRTsgKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gJipNSUk7CisKKyAgICAgIC8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBkZWFkLCBkZWxldGUgaXQhCisgICAgICBpZiAoaXNEZWFkKE1JKSkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkRlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltOiBERUxFVElORzogIiA8PCAqTUkpOworICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgREJHX1ZBTFVFIGluc3RydWN0aW9ucyByZWZlciB0byB0aGlzCisgICAgICAgIC8vIGluc3RydWN0aW9uLiAgRXhhbWluZSBlYWNoIGRlZiBvcGVyYW5kIGZvciBzdWNoIHJlZmVyZW5jZXM7CisgICAgICAgIC8vIGlmIGZvdW5kLCBtYXJrIHRoZSBEQkdfVkFMVUUgYXMgdW5kZWYgKGJ1dCBkb24ndCBkZWxldGUgaXQpLgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICAgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc0RlZigpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICAgICAgaWYgKCFUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZykpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2VfaXRlcmF0b3IgbmV4dEk7CisgICAgICAgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2VfaXRlcmF0b3IgSSA9IE1SSS0+dXNlX2JlZ2luKFJlZyksCisgICAgICAgICAgICAgICBFID0gTVJJLT51c2VfZW5kKCk7IEkhPUU7IEk9bmV4dEkpIHsKKyAgICAgICAgICAgIG5leHRJID0gbGx2bTo6bmV4dChJKTsgIC8vIEkgaXMgaW52YWxpZGF0ZWQgYnkgdGhlIHNldFJlZworICAgICAgICAgICAgTWFjaGluZU9wZXJhbmQmIFVzZSA9IEkuZ2V0T3BlcmFuZCgpOworICAgICAgICAgICAgTWFjaGluZUluc3RyICpVc2VNSSA9IFVzZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChVc2VNST09TUkpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYXNzZXJ0KFVzZS5pc0RlYnVnKCkpOworICAgICAgICAgICAgVXNlTUktPmdldE9wZXJhbmQoMCkuc2V0UmVnKDBVKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQW55Q2hhbmdlcyA9IHRydWU7CisgICAgICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgKytOdW1EZWxldGVzOworICAgICAgICBNSUUgPSBNQkItPnJlbmQoKTsKKyAgICAgICAgLy8gTUlJIGlzIG5vdyBwb2ludGluZyB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiB0byBwcm9jZXNzLAorICAgICAgICAvLyBzbyBkb24ndCBpbmNyZW1lbnQgaXQuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBSZWNvcmQgdGhlIHBoeXNyZWcgZGVmcy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmlzRGVmKCkpIHsKKyAgICAgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgICAgICBpZiAoUmVnICE9IDAgJiYgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkgeworICAgICAgICAgICAgTGl2ZVBoeXNSZWdzLnJlc2V0KFJlZyk7CisgICAgICAgICAgICAvLyBDaGVjayB0aGUgc3VicmVnIHNldCwgbm90IHRoZSBhbGlhcyBzZXQsIGJlY2F1c2UgYSBkZWYKKyAgICAgICAgICAgIC8vIG9mIGEgc3VwZXItcmVnaXN0ZXIgbWF5IHN0aWxsIGJlIHBhcnRpYWxseSBsaXZlIGFmdGVyCisgICAgICAgICAgICAvLyB0aGlzIGRlZi4KKyAgICAgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YlJlZ3MgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOworICAgICAgICAgICAgICAgICAqU3ViUmVnczsgKytTdWJSZWdzKQorICAgICAgICAgICAgICBMaXZlUGh5c1JlZ3MucmVzZXQoKlN1YlJlZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gUmVjb3JkIHRoZSBwaHlzcmVnIHVzZXMsIGFmdGVyIHRoZSBkZWZzLCBpbiBjYXNlIGEgcGh5c3JlZyBpcworICAgICAgLy8gYm90aCBkZWZpbmVkIGFuZCB1c2VkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNVc2UoKSkgeworICAgICAgICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgICAgICAgIGlmIChSZWcgIT0gMCAmJiBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpKSB7CisgICAgICAgICAgICBMaXZlUGh5c1JlZ3Muc2V0KFJlZyk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBbGlhc1NldCA9IFRSSS0+Z2V0QWxpYXNTZXQoUmVnKTsKKyAgICAgICAgICAgICAgICAgKkFsaWFzU2V0OyArK0FsaWFzU2V0KQorICAgICAgICAgICAgICBMaXZlUGh5c1JlZ3Muc2V0KCpBbGlhc1NldCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFdlIGRpZG4ndCBkZWxldGUgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24sIHNvIGluY3JlbWVudCBNSUkgdG8KKyAgICAgIC8vIHRoZSBuZXh0IG9uZS4KKyAgICAgICsrTUlJOworICAgIH0KKyAgfQorCisgIExpdmVQaHlzUmVncy5jbGVhcigpOworICByZXR1cm4gQW55Q2hhbmdlczsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0VMRi5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vRUxGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4ODRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0VMRi5oCkBAIC0wLDAgKzEsMjI3IEBACisvLz09PS0tIGxpYi9Db2RlR2VuL0VMRi5oIC0gRUxGIGNvbnN0YW50cyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGNvbnRhaW5zIGNvbW1vbiwgbm9uLXByb2Nlc3Nvci1zcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgYW5kCisvLyBjb25zdGFudHMgZm9yIHRoZSBFTEYgZmlsZSBmb3JtYXQuCisvLworLy8gVGhlIGRldGFpbHMgb2YgdGhlIEVMRjMyIGJpdHMgaW4gdGhpcyBmaWxlIGFyZSBsYXJnZWx5IGJhc2VkIG9uIHRoZSBUb29sCisvLyBJbnRlcmZhY2UgU3RhbmRhcmQgKFRJUykgRXhlY3V0YWJsZSBhbmQgTGlua2luZyBGb3JtYXQgKEVMRikgU3BlY2lmaWNhdGlvbgorLy8gVmVyc2lvbiAxLjIsIE1heSAxOTk1LiBUaGUgRUxGNjQgaXMgYmFzZWQgb24gSFAvSW50ZWwgZGVmaW5pdGlvbiBvZiB0aGUKKy8vIEVMRi02NCBvYmplY3QgZmlsZSBmb3JtYXQgZG9jdW1lbnQsIFZlcnNpb24gMS41IERyYWZ0IDIgTWF5IDI3LCAxOTk4CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBDT0RFR0VOX0VMRl9ICisjZGVmaW5lIENPREVHRU5fRUxGX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9CaW5hcnlPYmplY3QuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlbG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRUxGLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgR2xvYmFsVmFsdWU7CisKKyAgLy8vIEVMRlN5bSAtIFRoaXMgc3RydWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggc3ltYm9sIHRoYXQgaXMKKyAgLy8vIGFkZGVkIHRvIGxvZ2ljYWwgc3ltYm9sIHRhYmxlIGZvciB0aGUgbW9kdWxlLiAgVGhpcyBpcyBldmVudHVhbGx5CisgIC8vLyB0dXJuZWQgaW50byBhIHJlYWwgc3ltYm9sIHRhYmxlIGluIHRoZSBmaWxlLgorICBzdHJ1Y3QgRUxGU3ltIHsKKworICAgIC8vIEVMRiBzeW1ib2xzIGFyZSByZWxhdGVkIHRvIGxsdm0gb25lcyBieSBiZWluZyBvbmUgb2YgdGhlIHR3byBsbHZtCisgICAgLy8gdHlwZXMsIGZvciB0aGUgb3RoZXIgb25lcyAoc2VjdGlvbiwgZmlsZSwgZnVuYykgYSBudWxsIHBvaW50ZXIgaXMKKyAgICAvLyBhc3N1bWVkIGJ5IGRlZmF1bHQuCisgICAgdW5pb24geworICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWOyAgLy8gSWYgdGhpcyBpcyBhIHBvaW50ZXIgdG8gYSBHVgorICAgICAgY29uc3QgY2hhciAqRXh0OyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHBvaW50ZXIgdG8gYSBuYW1lZCBzeW1ib2wKKyAgICB9IFNvdXJjZTsKKworICAgIC8vIERlc2NyaWJlcyBmcm9tIHdoaWNoIHNvdXJjZSB0eXBlIHRoaXMgRUxGIHN5bWJvbCBjb21lcyBmcm9tLAorICAgIC8vIHRoZXkgY2FuIGJlIEdsb2JhbFZhbHVlLCBFeHRlcm5hbFN5bWJvbCBvciBuZWl0aGVyLgorICAgIGVudW0geworICAgICAgaXNHViwgICAgICAvLyBUaGUgU291cmNlLkdWIGZpZWxkIGlzIHZhbGlkLgorICAgICAgaXNFeHRTeW0sICAvLyBUaGUgU291cmNlLkV4dFN5bSBmaWVsZCBpcyB2YWxpZC4KKyAgICAgIGlzT3RoZXIgICAgLy8gTm90IGEgR2xvYmFsVmFsdWUgb3IgRXh0ZXJuYWwgU3ltYm9sCisgICAgfTsKKyAgICB1bnNpZ25lZCBTb3VyY2VUeXBlOworCisgICAgYm9vbCBpc0dsb2JhbFZhbHVlKCkgY29uc3QgeyByZXR1cm4gU291cmNlVHlwZSA9PSBpc0dWOyB9CisgICAgYm9vbCBpc0V4dGVybmFsU3ltKCkgY29uc3QgeyByZXR1cm4gU291cmNlVHlwZSA9PSBpc0V4dFN5bTsgfQorCisgICAgLy8gZ2V0R2xvYmFsVmFsdWUgLSBJZiB0aGlzIGlzIGEgZ2xvYmFsIHZhbHVlIHdoaWNoIG9yaWdpbmF0ZWQgdGhlCisgICAgLy8gZWxmIHN5bWJvbCwgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGl0LgorICAgIGNvbnN0IEdsb2JhbFZhbHVlICpnZXRHbG9iYWxWYWx1ZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChTb3VyY2VUeXBlID09IGlzR1YgJiYgIlRoaXMgaXMgbm90IGEgZ2xvYmFsIHZhbHVlIik7CisgICAgICByZXR1cm4gU291cmNlLkdWOworICAgIH0KKworICAgIC8vIGdldEV4dGVybmFsU3ltIC0gSWYgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgd2hpY2ggb3JpZ2luYXRlZCB0aGUKKyAgICAvLyBlbGYgc3ltYm9sLCByZXR1cm4gYSByZWZlcmVuY2UgdG8gaXQuCisgICAgY29uc3QgY2hhciAqZ2V0RXh0ZXJuYWxTeW1ib2woKSBjb25zdCB7CisgICAgICBhc3NlcnQoU291cmNlVHlwZSA9PSBpc0V4dFN5bSAmJiAiVGhpcyBpcyBub3QgYW4gZXh0ZXJuYWwgc3ltYm9sIik7CisgICAgICByZXR1cm4gU291cmNlLkV4dDsKKyAgICB9CisKKyAgICAvLyBnZXRHViAtIEZyb20gYSBnbG9iYWwgdmFsdWUgcmV0dXJuIGEgZWxmIHN5bWJvbCB0byByZXByZXNlbnQgaXQKKyAgICBzdGF0aWMgRUxGU3ltICpnZXRHVihjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIHVuc2lnbmVkIEJpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVHlwZSwgdW5zaWduZWQgVmlzaWJpbGl0eSkgeworICAgICAgRUxGU3ltICpTeW0gPSBuZXcgRUxGU3ltKCk7CisgICAgICBTeW0tPlNvdXJjZS5HViA9IEdWOworICAgICAgU3ltLT5zZXRCaW5kKEJpbmQpOworICAgICAgU3ltLT5zZXRUeXBlKFR5cGUpOworICAgICAgU3ltLT5zZXRWaXNpYmlsaXR5KFZpc2liaWxpdHkpOworICAgICAgU3ltLT5Tb3VyY2VUeXBlID0gaXNHVjsKKyAgICAgIHJldHVybiBTeW07CisgICAgfQorCisgICAgLy8gZ2V0RXh0U3ltIC0gQ3JlYXRlIGFuZCByZXR1cm4gYW4gZWxmIHN5bWJvbCB0byByZXByZXNlbnQgYW4KKyAgICAvLyBleHRlcm5hbCBzeW1ib2wKKyAgICBzdGF0aWMgRUxGU3ltICpnZXRFeHRTeW0oY29uc3QgY2hhciAqRXh0KSB7CisgICAgICBFTEZTeW0gKlN5bSA9IG5ldyBFTEZTeW0oKTsKKyAgICAgIFN5bS0+U291cmNlLkV4dCA9IEV4dDsKKyAgICAgIFN5bS0+c2V0QmluZChFTEY6OlNUQl9HTE9CQUwpOworICAgICAgU3ltLT5zZXRUeXBlKEVMRjo6U1RUX05PVFlQRSk7CisgICAgICBTeW0tPnNldFZpc2liaWxpdHkoRUxGOjpTVFZfREVGQVVMVCk7CisgICAgICBTeW0tPlNvdXJjZVR5cGUgPSBpc0V4dFN5bTsKKyAgICAgIHJldHVybiBTeW07CisgICAgfQorCisgICAgLy8gZ2V0U2VjdGlvblN5bSAtIFJldHVybnMgYSBlbGYgc3ltYm9sIHRvIHJlcHJlc2VudCBhbiBlbGYgc2VjdGlvbgorICAgIHN0YXRpYyBFTEZTeW0gKmdldFNlY3Rpb25TeW0oKSB7CisgICAgICBFTEZTeW0gKlN5bSA9IG5ldyBFTEZTeW0oKTsKKyAgICAgIFN5bS0+c2V0QmluZChFTEY6OlNUQl9MT0NBTCk7CisgICAgICBTeW0tPnNldFR5cGUoRUxGOjpTVFRfU0VDVElPTik7CisgICAgICBTeW0tPnNldFZpc2liaWxpdHkoRUxGOjpTVFZfREVGQVVMVCk7CisgICAgICBTeW0tPlNvdXJjZVR5cGUgPSBpc090aGVyOworICAgICAgcmV0dXJuIFN5bTsKKyAgICB9CisKKyAgICAvLyBnZXRGaWxlU3ltIC0gUmV0dXJucyBhIGVsZiBzeW1ib2wgdG8gcmVwcmVzZW50IHRoZSBtb2R1bGUgaWRlbnRpZmllcgorICAgIHN0YXRpYyBFTEZTeW0gKmdldEZpbGVTeW0oKSB7CisgICAgICBFTEZTeW0gKlN5bSA9IG5ldyBFTEZTeW0oKTsKKyAgICAgIFN5bS0+c2V0QmluZChFTEY6OlNUQl9MT0NBTCk7CisgICAgICBTeW0tPnNldFR5cGUoRUxGOjpTVFRfRklMRSk7CisgICAgICBTeW0tPnNldFZpc2liaWxpdHkoRUxGOjpTVFZfREVGQVVMVCk7CisgICAgICBTeW0tPlNlY3Rpb25JZHggPSAweGZmZjE7ICAvLyBFTEZTZWN0aW9uOjpTSE5fQUJTOworICAgICAgU3ltLT5Tb3VyY2VUeXBlID0gaXNPdGhlcjsKKyAgICAgIHJldHVybiBTeW07CisgICAgfQorCisgICAgLy8gZ2V0VW5kZWZHViAtIFJldHVybnMgYSBTVFRfTk9UWVBFIHN5bWJvbAorICAgIHN0YXRpYyBFTEZTeW0gKmdldFVuZGVmR1YoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCB1bnNpZ25lZCBCaW5kKSB7CisgICAgICBFTEZTeW0gKlN5bSA9IG5ldyBFTEZTeW0oKTsKKyAgICAgIFN5bS0+U291cmNlLkdWID0gR1Y7CisgICAgICBTeW0tPnNldEJpbmQoQmluZCk7CisgICAgICBTeW0tPnNldFR5cGUoRUxGOjpTVFRfTk9UWVBFKTsKKyAgICAgIFN5bS0+c2V0VmlzaWJpbGl0eShFTEY6OlNUVl9ERUZBVUxUKTsKKyAgICAgIFN5bS0+U2VjdGlvbklkeCA9IDA7ICAvL0VMRlNlY3Rpb246OlNITl9VTkRFRjsKKyAgICAgIFN5bS0+U291cmNlVHlwZSA9IGlzR1Y7CisgICAgICByZXR1cm4gU3ltOworICAgIH0KKworICAgIC8vIEVMRiBzcGVjaWZpYyBmaWVsZHMKKyAgICB1bnNpZ25lZCBOYW1lSWR4OyAgICAgICAgIC8vIEluZGV4IGluIC5zdHJ0YWIgb2YgbmFtZSwgb25jZSBlbWl0dGVkLgorICAgIHVpbnQ2NF90IFZhbHVlOworICAgIHVuc2lnbmVkIFNpemU7CisgICAgdWludDhfdCBJbmZvOworICAgIHVpbnQ4X3QgT3RoZXI7CisgICAgdW5zaWduZWQgc2hvcnQgU2VjdGlvbklkeDsKKworICAgIC8vIFN5bWJvbCBpbmRleCBpbnRvIHRoZSBTeW1ib2wgdGFibGUKKyAgICB1bnNpZ25lZCBTeW1UYWJJZHg7CisKKyAgICBFTEZTeW0oKSA6IFNvdXJjZVR5cGUoaXNPdGhlciksIE5hbWVJZHgoMCksIFZhbHVlKDApLAorICAgICAgICAgICAgICAgU2l6ZSgwKSwgSW5mbygwKSwgT3RoZXIoRUxGOjpTVFZfREVGQVVMVCksIFNlY3Rpb25JZHgoMCksCisgICAgICAgICAgICAgICBTeW1UYWJJZHgoMCkge30KKworICAgIHVuc2lnbmVkIGdldEJpbmQoKSBjb25zdCB7IHJldHVybiAoSW5mbyA+PiA0KSAmIDB4ZjsgfQorICAgIHVuc2lnbmVkIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBJbmZvICYgMHhmOyB9CisgICAgYm9vbCBpc0xvY2FsQmluZCgpIGNvbnN0IHsgcmV0dXJuIGdldEJpbmQoKSA9PSBFTEY6OlNUQl9MT0NBTDsgfQorICAgIGJvb2wgaXNGaWxlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGUoKSA9PSBFTEY6OlNUVF9GSUxFOyB9CisKKyAgICB2b2lkIHNldEJpbmQodW5zaWduZWQgWCkgeworICAgICAgYXNzZXJ0KFggPT0gKFggJiAweEYpICYmICJCaW5kIHZhbHVlIG91dCBvZiByYW5nZSEiKTsKKyAgICAgIEluZm8gPSAoSW5mbyAmIDB4MEYpIHwgKFggPDwgNCk7CisgICAgfQorCisgICAgdm9pZCBzZXRUeXBlKHVuc2lnbmVkIFgpIHsKKyAgICAgIGFzc2VydChYID09IChYICYgMHhGKSAmJiAiVHlwZSB2YWx1ZSBvdXQgb2YgcmFuZ2UhIik7CisgICAgICBJbmZvID0gKEluZm8gJiAweEYwKSB8IFg7CisgICAgfQorCisgICAgdm9pZCBzZXRWaXNpYmlsaXR5KHVuc2lnbmVkIFYpIHsKKyAgICAgIGFzc2VydChWID09IChWICYgMHgzKSAmJiAiVmlzaWJpbGl0eSB2YWx1ZSBvdXQgb2YgcmFuZ2UhIik7CisgICAgICBPdGhlciA9IFY7CisgICAgfQorICB9OworCisgIC8vLyBFTEZTZWN0aW9uIC0gVGhpcyBzdHJ1Y3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBzZWN0aW9uIHRoYXQgaXMKKyAgLy8vIGVtaXR0ZWQgdG8gdGhlIGZpbGUuICBUaGlzIGlzIGV2ZW50dWFsbHkgdHVybmVkIGludG8gdGhlIHNlY3Rpb24gaGVhZGVyCisgIC8vLyB0YWJsZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICBjbGFzcyBFTEZTZWN0aW9uIDogcHVibGljIEJpbmFyeU9iamVjdCB7CisgICAgcHVibGljOgorICAgIC8vIEVMRiBzcGVjaWZpYyBmaWVsZHMKKyAgICB1bnNpZ25lZCBOYW1lSWR4OyAgIC8vIHNoX25hbWUgLSAuc2hzdHJ0YWIgaWR4IG9mIG5hbWUsIG9uY2UgZW1pdHRlZC4KKyAgICB1bnNpZ25lZCBUeXBlOyAgICAgIC8vIHNoX3R5cGUgLSBTZWN0aW9uIGNvbnRlbnRzICYgc2VtYW50aWNzIAorICAgIHVuc2lnbmVkIEZsYWdzOyAgICAgLy8gc2hfZmxhZ3MgLSBTZWN0aW9uIGZsYWdzLgorICAgIHVpbnQ2NF90IEFkZHI7ICAgICAgLy8gc2hfYWRkciAtIFRoZSBtZW0gYWRkciB0aGlzIHNlY3Rpb24gaXMgaW4uCisgICAgdW5zaWduZWQgT2Zmc2V0OyAgICAvLyBzaF9vZmZzZXQgLSBPZmZzZXQgZnJvbSB0aGUgZmlsZSBzdGFydAorICAgIHVuc2lnbmVkIFNpemU7ICAgICAgLy8gc2hfc2l6ZSAtIFRoZSBzZWN0aW9uIHNpemUuCisgICAgdW5zaWduZWQgTGluazsgICAgICAvLyBzaF9saW5rIC0gU2VjdGlvbiBoZWFkZXIgdGFibGUgaW5kZXggbGluay4KKyAgICB1bnNpZ25lZCBJbmZvOyAgICAgIC8vIHNoX2luZm8gLSBBdXhpbGxhcnkgaW5mb3JtYXRpb24uCisgICAgdW5zaWduZWQgQWxpZ247ICAgICAvLyBzaF9hZGRyYWxpZ24gLSBBbGlnbm1lbnQgb2Ygc2VjdGlvbi4KKyAgICB1bnNpZ25lZCBFbnRTaXplOyAgIC8vIHNoX2VudHNpemUgLSBTaXplIG9mIGVudHJpZXMgaW4gdGhlIHNlY3Rpb24gZQorCisgICAgLy8vIFNlY3Rpb25JZHggLSBUaGUgbnVtYmVyIG9mIHRoZSBzZWN0aW9uIGluIHRoZSBTZWN0aW9uIFRhYmxlLgorICAgIHVuc2lnbmVkIHNob3J0IFNlY3Rpb25JZHg7CisKKyAgICAvLy8gU3ltIC0gVGhlIHN5bWJvbCB0byByZXByZXNlbnQgdGhpcyBzZWN0aW9uIGlmIGl0IGhhcyBvbmUuCisgICAgRUxGU3ltICpTeW07CisKKyAgICAvLy8gZ2V0U3ltSW5kZXggLSBSZXR1cm5zIHRoZSBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIHN5bWJvbAorICAgIC8vLyByZXByZXNlbnRpbmcgdGhpcyBzZWN0aW9uLgorICAgIHVuc2lnbmVkIGdldFN5bWJvbFRhYmxlSW5kZXgoKSBjb25zdCB7CisgICAgICBhc3NlcnQoU3ltICYmICJzZWN0aW9uIG5vdCBwcmVzZW50IGluIHRoZSBzeW1ib2wgdGFibGUiKTsKKyAgICAgIHJldHVybiBTeW0tPlN5bVRhYklkeDsKKyAgICB9CisKKyAgICBFTEZTZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBib29sIGlzTGl0dGxlRW5kaWFuLCBib29sIGlzNjRCaXQpCisgICAgICA6IEJpbmFyeU9iamVjdChuYW1lLCBpc0xpdHRsZUVuZGlhbiwgaXM2NEJpdCksIFR5cGUoMCksIEZsYWdzKDApLCBBZGRyKDApLAorICAgICAgICBPZmZzZXQoMCksIFNpemUoMCksIExpbmsoMCksIEluZm8oMCksIEFsaWduKDApLCBFbnRTaXplKDApLCBTeW0oMCkge30KKyAgfTsKKworICAvLy8gRUxGUmVsb2NhdGlvbiAtIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8KKyAgLy8vIHRvIGdlbmVyYXRlIGFueSAzMi1iaXQgb3IgNjQtYml0IEVMRiByZWxvY2F0aW9uIGVudHJ5LgorICBjbGFzcyBFTEZSZWxvY2F0aW9uIHsKKyAgICB1aW50NjRfdCByX29mZnNldDsgICAgLy8gb2Zmc2V0IGluIHRoZSBzZWN0aW9uIG9mIHRoZSBvYmplY3QgdGhpcyBhcHBsaWVzIHRvCisgICAgdWludDMyX3Qgcl9zeW1pZHg7ICAgIC8vIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgc3ltYm9sIHRvIHVzZQorICAgIHVpbnQzMl90IHJfdHlwZTsgICAgICAvLyBtYWNoaW5lIHNwZWNpZmljIHJlbG9jYXRpb24gdHlwZQorICAgIGludDY0X3QgIHJfYWRkOyAgICAgICAvLyBleHBsaWNpdCByZWxvY2F0aW9uIGFkZGVuZAorICAgIGJvb2wgICAgIHJfcmVsYTsgICAgICAvLyBpZiB0cnVlIHRoZW4gdGhlIGFkZGVuZCBpcyBwYXJ0IG9mIHRoZSBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGFkZGVuZCBpcyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHJfb2Zmc2V0CisgIHB1YmxpYzoKKyAgICB1aW50NjRfdCBnZXRJbmZvKGJvb2wgaXM2NEJpdCkgY29uc3QgeworICAgICAgaWYgKGlzNjRCaXQpCisgICAgICAgIHJldHVybiAoKHVpbnQ2NF90KXJfc3ltaWR4IDw8IDMyKSArICgodWludDY0X3Qpcl90eXBlICYgMHhGRkZGRkZGRkwpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKHJfc3ltaWR4IDw8IDgpICArIChyX3R5cGUgJiAweEZGTCk7CisgICAgfQorCisgICAgdWludDY0X3QgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gcl9vZmZzZXQ7IH0KKyAgICBpbnQ2NF90IGdldEFkZGVuZCgpIGNvbnN0IHsgcmV0dXJuIHJfYWRkOyB9CisKKyAgICBFTEZSZWxvY2F0aW9uKHVpbnQ2NF90IG9mZiwgdWludDMyX3Qgc3ltLCB1aW50MzJfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgYm9vbCByZWxhID0gdHJ1ZSwgaW50NjRfdCBhZGRlbmQgPSAwKSA6CisgICAgICByX29mZnNldChvZmYpLCByX3N5bWlkeChzeW0pLCByX3R5cGUodHlwZSksCisgICAgICByX2FkZChhZGRlbmQpLCByX3JlbGEocmVsYSkge30KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9JbmxpbmVTcGlsbGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0lubGluZVNwaWxsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTg5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9JbmxpbmVTcGlsbGVyLmNwcApAQCAtMCwwICsxLDQ2OCBAQAorLy89PT0tLS0tLS0tLSBJbmxpbmVTcGlsbGVyLmNwcCAtIEluc2VydCBzcGlsbHMgYW5kIHJlc3RvcmVzIGlubGluZSAtLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgaW5saW5lIHNwaWxsZXIgbW9kaWZpZXMgdGhlIG1hY2hpbmUgZnVuY3Rpb24gZGlyZWN0bHkgaW5zdGVhZCBvZgorLy8gaW5zZXJ0aW5nIHNwaWxscyBhbmQgcmVzdG9yZXMgaW4gVmlydFJlZ01hcC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInNwaWxsZXIiCisjaW5jbHVkZSAiU3BpbGxlci5oIgorI2luY2x1ZGUgIlNwbGl0S2l0LmgiCisjaW5jbHVkZSAiVmlydFJlZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CitjbGFzcyBJbmxpbmVTcGlsbGVyIDogcHVibGljIFNwaWxsZXIgeworICBNYWNoaW5lRnVuY3Rpb25QYXNzICZwYXNzXzsKKyAgTWFjaGluZUZ1bmN0aW9uICZtZl87CisgIExpdmVJbnRlcnZhbHMgJmxpc187CisgIE1hY2hpbmVMb29wSW5mbyAmbG9vcHNfOworICBWaXJ0UmVnTWFwICZ2cm1fOworICBNYWNoaW5lRnJhbWVJbmZvICZtZmlfOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZtcmlfOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJnRpaV87CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmdHJpXzsKKyAgY29uc3QgQml0VmVjdG9yIHJlc2VydmVkXzsKKworICBTcGxpdEFuYWx5c2lzIHNwbGl0QW5hbHlzaXNfOworCisgIC8vIFZhcmlhYmxlcyB0aGF0IGFyZSB2YWxpZCBkdXJpbmcgc3BpbGwoKSwgYnV0IHVzZWQgYnkgbXVsdGlwbGUgbWV0aG9kcy4KKyAgTGl2ZUludGVydmFsICpsaV87CisgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+ICpuZXdJbnRlcnZhbHNfOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpyY187CisgIGludCBzdGFja1Nsb3RfOworICBjb25zdCBTbWFsbFZlY3RvckltcGw8TGl2ZUludGVydmFsKj4gKnNwaWxsSXNfOworCisgIC8vIFZhbHVlcyBvZiB0aGUgY3VycmVudCBpbnRlcnZhbCB0aGF0IGNhbiBwb3RlbnRpYWxseSByZW1hdC4KKyAgU21hbGxQdHJTZXQ8Vk5JbmZvKiwgOD4gcmVNYXR0YWJsZV87CisKKyAgLy8gVmFsdWVzIGluIHJlTWF0dGFibGVfIHRoYXQgZmFpbGVkIHRvIHJlbWF0IGF0IHNvbWUgcG9pbnQuCisgIFNtYWxsUHRyU2V0PFZOSW5mbyosIDg+IHVzZWRWYWx1ZXNfOworCisgIH5JbmxpbmVTcGlsbGVyKCkge30KKworcHVibGljOgorICBJbmxpbmVTcGlsbGVyKE1hY2hpbmVGdW5jdGlvblBhc3MgJnBhc3MsCisgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZtZiwKKyAgICAgICAgICAgICAgICBWaXJ0UmVnTWFwICZ2cm0pCisgICAgOiBwYXNzXyhwYXNzKSwKKyAgICAgIG1mXyhtZiksCisgICAgICBsaXNfKHBhc3MuZ2V0QW5hbHlzaXM8TGl2ZUludGVydmFscz4oKSksCisgICAgICBsb29wc18ocGFzcy5nZXRBbmFseXNpczxNYWNoaW5lTG9vcEluZm8+KCkpLAorICAgICAgdnJtXyh2cm0pLAorICAgICAgbWZpXygqbWYuZ2V0RnJhbWVJbmZvKCkpLAorICAgICAgbXJpXyhtZi5nZXRSZWdJbmZvKCkpLAorICAgICAgdGlpXygqbWYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCkpLAorICAgICAgdHJpXygqbWYuZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCkpLAorICAgICAgcmVzZXJ2ZWRfKHRyaV8uZ2V0UmVzZXJ2ZWRSZWdzKG1mXykpLAorICAgICAgc3BsaXRBbmFseXNpc18obWYsIGxpc18sIGxvb3BzXykge30KKworICB2b2lkIHNwaWxsKExpdmVJbnRlcnZhbCAqbGksCisgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TGl2ZUludGVydmFsKj4gJm5ld0ludGVydmFscywKKyAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TGl2ZUludGVydmFsKj4gJnNwaWxsSXMsCisgICAgICAgICAgICAgU2xvdEluZGV4ICplYXJsaWVzdEluZGV4KTsKKworcHJpdmF0ZToKKyAgYm9vbCBzcGxpdCgpOworCisgIGJvb2wgYWxsVXNlc0F2YWlsYWJsZUF0KGNvbnN0IE1hY2hpbmVJbnN0ciAqT3JpZ01JLCBTbG90SW5kZXggT3JpZ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IFVzZUlkeCk7CisgIGJvb2wgcmVNYXRlcmlhbGl6ZUZvcihNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpOworICB2b2lkIHJlTWF0ZXJpYWxpemVBbGwoKTsKKworICBib29sIGNvYWxlc2NlU3RhY2tBY2Nlc3MoTWFjaGluZUluc3RyICpNSSk7CisgIGJvb2wgZm9sZE1lbW9yeU9wZXJhbmQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJk9wcyk7CisgIHZvaWQgaW5zZXJ0UmVsb2FkKExpdmVJbnRlcnZhbCAmTmV3TEksIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSk7CisgIHZvaWQgaW5zZXJ0U3BpbGwoTGl2ZUludGVydmFsICZOZXdMSSwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JKTsKK307Cit9CisKK25hbWVzcGFjZSBsbHZtIHsKK1NwaWxsZXIgKmNyZWF0ZUlubGluZVNwaWxsZXIoTWFjaGluZUZ1bmN0aW9uUGFzcyAmcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlydFJlZ01hcCAmdnJtKSB7CisgIHJldHVybiBuZXcgSW5saW5lU3BpbGxlcihwYXNzLCBtZiwgdnJtKTsKK30KK30KKworLy8vIHNwbGl0IC0gdHJ5IHNwbGl0dGluZyB0aGUgY3VycmVudCBpbnRlcnZhbCBpbnRvIHBpZWNlcyB0aGF0IG1heSBhbGxvY2F0ZQorLy8vIHNlcGFyYXRlbHkuIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwuCitib29sIElubGluZVNwaWxsZXI6OnNwbGl0KCkgeworICAvLyBGSVhNRTogQWRkIGludHJhLU1CQiBzcGxpdHRpbmcuCisgIGlmIChsaXNfLmludGVydmFsSXNJbk9uZU1CQigqbGlfKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3BsaXRBbmFseXNpc18uYW5hbHl6ZShsaV8pOworCisgIGlmIChjb25zdCBNYWNoaW5lTG9vcCAqbG9vcCA9IHNwbGl0QW5hbHlzaXNfLmdldEJlc3RTcGxpdExvb3AoKSkgeworICAgIC8vIFdlIGNhbiBzcGxpdCwgYnV0IGxpXyBtYXkgYmUgbGVmdCBpbnRhY3Qgd2l0aCBmZXdlciB1c2VzLgorICAgIGlmIChTcGxpdEVkaXRvcihzcGxpdEFuYWx5c2lzXywgbGlzXywgdnJtXywgKm5ld0ludGVydmFsc18pCisgICAgICAgICAgLnNwbGl0QXJvdW5kTG9vcChsb29wKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGFsbFVzZXNBdmFpbGFibGVBdCAtIFJldHVybiB0cnVlIGlmIGFsbCByZWdpc3RlcnMgdXNlZCBieSBPcmlnTUkgYXQKKy8vLyBPcmlnSWR4IGFyZSBhbHNvIGF2YWlsYWJsZSB3aXRoIHRoZSBzYW1lIHZhbHVlIGF0IFVzZUlkeC4KK2Jvb2wgSW5saW5lU3BpbGxlcjo6YWxsVXNlc0F2YWlsYWJsZUF0KGNvbnN0IE1hY2hpbmVJbnN0ciAqT3JpZ01JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IE9yaWdJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggVXNlSWR4KSB7CisgIE9yaWdJZHggPSBPcmlnSWR4LmdldFVzZUluZGV4KCk7CisgIFVzZUlkeCA9IFVzZUlkeC5nZXRVc2VJbmRleCgpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3JpZ01JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE9yaWdNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmdldFJlZygpIHx8IE1PLmdldFJlZygpID09IGxpXy0+cmVnKQorICAgICAgY29udGludWU7CisgICAgLy8gUmVzZXJ2ZWQgcmVnaXN0ZXJzIGFyZSBPSy4KKyAgICBpZiAoTU8uaXNVbmRlZigpIHx8ICFsaXNfLmhhc0ludGVydmFsKE1PLmdldFJlZygpKSkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gbW92ZSBhbnkgZGVmcy4KKyAgICBpZiAoTU8uaXNEZWYoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBXZSBjYW5ub3QgZGVwZW5kIG9uIHZpcnR1YWwgcmVnaXN0ZXJzIGluIHNwaWxsSXNfLiBUaGV5IHdpbGwgYmUgc3BpbGxlZC4KKyAgICBmb3IgKHVuc2lnbmVkIHNpID0gMCwgc2UgPSBzcGlsbElzXy0+c2l6ZSgpOyBzaSAhPSBzZTsgKytzaSkKKyAgICAgIGlmICgoKnNwaWxsSXNfKVtzaV0tPnJlZyA9PSBNTy5nZXRSZWcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTGl2ZUludGVydmFsICZMSSA9IGxpc18uZ2V0SW50ZXJ2YWwoTU8uZ2V0UmVnKCkpOworICAgIGNvbnN0IFZOSW5mbyAqT1ZOSSA9IExJLmdldFZOSW5mb0F0KE9yaWdJZHgpOworICAgIGlmICghT1ZOSSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChPVk5JICE9IExJLmdldFZOSW5mb0F0KFVzZUlkeCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyByZU1hdGVyaWFsaXplRm9yIC0gQXR0ZW1wdCB0byByZW1hdGVyaWFsaXplIGxpXy0+cmVnIGJlZm9yZSBNSSBpbnN0ZWFkIG9mCisvLy8gcmVsb2FkaW5nIGl0LgorYm9vbCBJbmxpbmVTcGlsbGVyOjpyZU1hdGVyaWFsaXplRm9yKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSkgeworICBTbG90SW5kZXggVXNlSWR4ID0gbGlzXy5nZXRJbnN0cnVjdGlvbkluZGV4KE1JKS5nZXRVc2VJbmRleCgpOworICBWTkluZm8gKk9yaWdWTkkgPSBsaV8tPmdldFZOSW5mb0F0KFVzZUlkeCk7CisgIGlmICghT3JpZ1ZOSSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRhZGRpbmcgPHVuZGVmPiBmbGFnczogIik7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5pc1VzZSgpICYmIE1PLmdldFJlZygpID09IGxpXy0+cmVnKQorICAgICAgICBNTy5zZXRJc1VuZGVmKCk7CisgICAgfQorICAgIERFQlVHKGRiZ3MoKSA8PCBVc2VJZHggPDwgJ1x0JyA8PCAqTUkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICghcmVNYXR0YWJsZV8uY291bnQoT3JpZ1ZOSSkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0dXNpbmcgbm9uLXJlbWF0IHZhbG5vICIgPDwgT3JpZ1ZOSS0+aWQgPDwgIjogIgorICAgICAgICAgICAgICAgICA8PCBVc2VJZHggPDwgJ1x0JyA8PCAqTUkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNYWNoaW5lSW5zdHIgKk9yaWdNSSA9IGxpc18uZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoT3JpZ1ZOSS0+ZGVmKTsKKyAgaWYgKCFhbGxVc2VzQXZhaWxhYmxlQXQoT3JpZ01JLCBPcmlnVk5JLT5kZWYsIFVzZUlkeCkpIHsKKyAgICB1c2VkVmFsdWVzXy5pbnNlcnQoT3JpZ1ZOSSk7CisgICAgREVCVUcoZGJncygpIDw8ICJcdGNhbm5vdCByZW1hdCBmb3IgIiA8PCBVc2VJZHggPDwgJ1x0JyA8PCAqTUkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElmIHRoZSBpbnN0cnVjdGlvbiBhbHNvIHdyaXRlcyBsaV8tPnJlZywgaXQgaGFkIGJldHRlciBub3QgcmVxdWlyZSB0aGUgc2FtZQorICAvLyByZWdpc3RlciBmb3IgdXNlcyBhbmQgZGVmcy4KKyAgYm9vbCBSZWFkcywgV3JpdGVzOworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgOD4gT3BzOworICB0aWUoUmVhZHMsIFdyaXRlcykgPSBNSS0+cmVhZHNXcml0ZXNWaXJ0dWFsUmVnaXN0ZXIobGlfLT5yZWcsICZPcHMpOworICBpZiAoV3JpdGVzKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChPcHNbaV0pOworICAgICAgaWYgKE1PLmlzVXNlKCkgPyBNSS0+aXNSZWdUaWVkVG9EZWZPcGVyYW5kKE9wc1tpXSkgOiBNTy5nZXRTdWJSZWcoKSkgeworICAgICAgICB1c2VkVmFsdWVzXy5pbnNlcnQoT3JpZ1ZOSSk7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRjYW5ub3QgcmVtYXQgdGllZCByZWc6ICIgPDwgVXNlSWR4IDw8ICdcdCcgPDwgKk1JKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEFsb2NhdGUgYSBuZXcgcmVnaXN0ZXIgZm9yIHRoZSByZW1hdC4KKyAgdW5zaWduZWQgTmV3VlJlZyA9IG1yaV8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKHJjXyk7CisgIHZybV8uZ3JvdygpOworICBMaXZlSW50ZXJ2YWwgJk5ld0xJID0gbGlzXy5nZXRPckNyZWF0ZUludGVydmFsKE5ld1ZSZWcpOworICBOZXdMSS5tYXJrTm90U3BpbGxhYmxlKCk7CisgIG5ld0ludGVydmFsc18tPnB1c2hfYmFjaygmTmV3TEkpOworCisgIC8vIEZpbmFsbHkgd2UgY2FuIHJlbWF0ZXJpYWxpemUgT3JpZ01JIGJlZm9yZSBNSS4KKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9ICpNSS0+Z2V0UGFyZW50KCk7CisgIHRpaV8ucmVNYXRlcmlhbGl6ZShNQkIsIE1JLCBOZXdMSS5yZWcsIDAsIE9yaWdNSSwgdHJpXyk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBSZW1hdE1JID0gTUk7CisgIFNsb3RJbmRleCBEZWZJZHggPSBsaXNfLkluc2VydE1hY2hpbmVJbnN0ckluTWFwcygtLVJlbWF0TUkpLmdldERlZkluZGV4KCk7CisgIERFQlVHKGRiZ3MoKSA8PCAiXHRyZW1hdDogICIgPDwgRGVmSWR4IDw8ICdcdCcgPDwgKlJlbWF0TUkpOworCisgIC8vIFJlcGxhY2Ugb3BlcmFuZHMKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BzW2ldKTsKKyAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5pc1VzZSgpICYmIE1PLmdldFJlZygpID09IGxpXy0+cmVnKSB7CisgICAgICBNTy5zZXRSZWcoTmV3VlJlZyk7CisgICAgICBNTy5zZXRJc0tpbGwoKTsKKyAgICB9CisgIH0KKyAgREVCVUcoZGJncygpIDw8ICJcdCAgICAgICAgIiA8PCBVc2VJZHggPDwgJ1x0JyA8PCAqTUkpOworCisgIFZOSW5mbyAqRGVmVk5JID0gTmV3TEkuZ2V0TmV4dFZhbHVlKERlZklkeCwgMCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc18uZ2V0Vk5JbmZvQWxsb2NhdG9yKCkpOworICBOZXdMSS5hZGRSYW5nZShMaXZlUmFuZ2UoRGVmSWR4LCBVc2VJZHguZ2V0RGVmSW5kZXgoKSwgRGVmVk5JKSk7CisgIERFQlVHKGRiZ3MoKSA8PCAiXHRpbnRlcnZhbDogIiA8PCBOZXdMSSA8PCAnXG4nKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyByZU1hdGVyaWFsaXplQWxsIC0gVHJ5IHRvIHJlbWF0ZXJpYWxpemUgYXMgbWFueSB1c2VzIG9mIGxpXyBhcyBwb3NzaWJsZSwKKy8vLyBhbmQgdHJpbSB0aGUgbGl2ZSByYW5nZXMgYWZ0ZXIuCit2b2lkIElubGluZVNwaWxsZXI6OnJlTWF0ZXJpYWxpemVBbGwoKSB7CisgIC8vIERvIGEgcXVpY2sgc2NhbiBvZiB0aGUgaW50ZXJ2YWwgdmFsdWVzIHRvIGZpbmQgaWYgYW55IGFyZSByZW1hdHRhYmxlLgorICByZU1hdHRhYmxlXy5jbGVhcigpOworICB1c2VkVmFsdWVzXy5jbGVhcigpOworICBmb3IgKExpdmVJbnRlcnZhbDo6Y29uc3Rfdm5pX2l0ZXJhdG9yIEkgPSBsaV8tPnZuaV9iZWdpbigpLAorICAgICAgIEUgPSBsaV8tPnZuaV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBWTkluZm8gKlZOSSA9ICpJOworICAgIGlmIChWTkktPmlzVW51c2VkKCkgfHwgIVZOSS0+aXNEZWZBY2N1cmF0ZSgpKQorICAgICAgY29udGludWU7CisgICAgTWFjaGluZUluc3RyICpEZWZNSSA9IGxpc18uZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoVk5JLT5kZWYpOworICAgIGlmICghRGVmTUkgfHwgIXRpaV8uaXNUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKERlZk1JKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHJlTWF0dGFibGVfLmluc2VydChWTkkpOworICB9CisKKyAgLy8gT2Z0ZW4sIG5vIGRlZnMgYXJlIHJlbWF0dGFibGUuCisgIGlmIChyZU1hdHRhYmxlXy5lbXB0eSgpKQorICAgIHJldHVybjsKKworICAvLyBUcnkgdG8gcmVtYXQgYmVmb3JlIGFsbCB1c2VzIG9mIGxpXy0+cmVnLgorICBib29sIGFueVJlbWF0ID0gZmFsc2U7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6dXNlX25vZGJnX2l0ZXJhdG9yCisgICAgICAgUkkgPSBtcmlfLnVzZV9ub2RiZ19iZWdpbihsaV8tPnJlZyk7CisgICAgICAgTWFjaGluZUluc3RyICpNSSA9IFJJLnNraXBJbnN0cnVjdGlvbigpOykKKyAgICAgYW55UmVtYXQgfD0gcmVNYXRlcmlhbGl6ZUZvcihNSSk7CisKKyAgaWYgKCFhbnlSZW1hdCkKKyAgICByZXR1cm47CisKKyAgLy8gUmVtb3ZlIGFueSB2YWx1ZXMgdGhhdCB3ZXJlIGNvbXBsZXRlbHkgcmVtYXR0ZWQuCisgIGJvb2wgYW55UmVtb3ZlZCA9IGZhbHNlOworICBmb3IgKFNtYWxsUHRyU2V0PFZOSW5mbyosIDg+OjppdGVyYXRvciBJID0gcmVNYXR0YWJsZV8uYmVnaW4oKSwKKyAgICAgICBFID0gcmVNYXR0YWJsZV8uZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgVk5JbmZvICpWTkkgPSAqSTsKKyAgICBpZiAoVk5JLT5oYXNQSElLaWxsKCkgfHwgdXNlZFZhbHVlc18uY291bnQoVk5JKSkKKyAgICAgIGNvbnRpbnVlOworICAgIE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBsaXNfLmdldEluc3RydWN0aW9uRnJvbUluZGV4KFZOSS0+ZGVmKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0cmVtb3ZpbmcgZGVhZCBkZWY6ICIgPDwgVk5JLT5kZWYgPDwgJ1x0JyA8PCAqRGVmTUkpOworICAgIGxpc18uUmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoRGVmTUkpOworICAgIHZybV8uUmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoRGVmTUkpOworICAgIERlZk1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBWTkktPnNldElzRGVmQWNjdXJhdGUoZmFsc2UpOworICAgIGFueVJlbW92ZWQgPSB0cnVlOworICB9CisKKyAgaWYgKCFhbnlSZW1vdmVkKQorICAgIHJldHVybjsKKworICAvLyBSZW1vdmluZyB2YWx1ZXMgbWF5IGNhdXNlIGRlYnVnIHVzZXMgd2hlcmUgbGlfIGlzIG5vdCBsaXZlLgorICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9pdGVyYXRvciBSSSA9IG1yaV8udXNlX2JlZ2luKGxpXy0+cmVnKTsKKyAgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gUkkuc2tpcEluc3RydWN0aW9uKCk7KSB7CisgICAgaWYgKCFNSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUgdGhlIGRlYnVnIHZhbHVlIGlmIGxpXyBpcyBsaXZlIGltbWVkaWF0ZWx5IGFmdGVyIGl0LgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBOZXh0TUkgPSBNSTsKKyAgICArK05leHRNSTsKKyAgICBpZiAoTmV4dE1JICE9IE1JLT5nZXRQYXJlbnQoKS0+ZW5kKCkgJiYgIWxpc18uaXNOb3RJbk1JTWFwKE5leHRNSSkpIHsKKyAgICAgIFZOSW5mbyAqVk5JID0gbGlfLT5nZXRWTkluZm9BdChsaXNfLmdldEluc3RydWN0aW9uSW5kZXgoTmV4dE1JKSk7CisgICAgICBpZiAoVk5JICYmIChWTkktPmhhc1BISUtpbGwoKSB8fCB1c2VkVmFsdWVzXy5jb3VudChWTkkpKSkKKyAgICAgICAgY29udGludWU7CisgICAgfQorICAgIERFQlVHKGRiZ3MoKSA8PCAiUmVtb3ZpbmcgZGVidWcgaW5mbyBkdWUgdG8gcmVtYXQ6IiA8PCAiXHQiIDw8ICpNSSk7CisgICAgTUktPmVyYXNlRnJvbVBhcmVudCgpOworICB9Cit9CisKKy8vLyBJZiBNSSBpcyBhIGxvYWQgb3Igc3RvcmUgb2Ygc3RhY2tTbG90XywgaXQgY2FuIGJlIHJlbW92ZWQuCitib29sIElubGluZVNwaWxsZXI6OmNvYWxlc2NlU3RhY2tBY2Nlc3MoTWFjaGluZUluc3RyICpNSSkgeworICBpbnQgRkkgPSAwOworICB1bnNpZ25lZCByZWc7CisgIGlmICghKHJlZyA9IHRpaV8uaXNMb2FkRnJvbVN0YWNrU2xvdChNSSwgRkkpKSAmJgorICAgICAgIShyZWcgPSB0aWlfLmlzU3RvcmVUb1N0YWNrU2xvdChNSSwgRkkpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gV2UgaGF2ZSBhIHN0YWNrIGFjY2Vzcy4gSXMgaXQgdGhlIHJpZ2h0IHJlZ2lzdGVyIGFuZCBzbG90PworICBpZiAocmVnICE9IGxpXy0+cmVnIHx8IEZJICE9IHN0YWNrU2xvdF8pCisgICAgcmV0dXJuIGZhbHNlOworCisgIERFQlVHKGRiZ3MoKSA8PCAiQ29hbGVzY2luZyBzdGFjayBhY2Nlc3M6ICIgPDwgKk1JKTsKKyAgbGlzXy5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhNSSk7CisgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBmb2xkTWVtb3J5T3BlcmFuZCAtIFRyeSBmb2xkaW5nIHN0YWNrIHNsb3QgcmVmZXJlbmNlcyBpbiBPcHMgaW50byBNSS4KKy8vLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBhbmQgTUkgd2lsbCBiZSBlcmFzZWQuCitib29sIElubGluZVNwaWxsZXI6OmZvbGRNZW1vcnlPcGVyYW5kKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmT3BzKSB7CisgIC8vIFRhcmdldEluc3RySW5mbzo6Zm9sZE1lbW9yeU9wZXJhbmQgb25seSBleHBlY3RzIGV4cGxpY2l0LCBub24tdGllZAorICAvLyBvcGVyYW5kcy4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IEZvbGRPcHM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIElkeCA9IE9wc1tpXTsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChJZHgpOworICAgIGlmIChNTy5pc0ltcGxpY2l0KCkpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBGSVhNRTogVGVhY2ggdGFyZ2V0cyB0byBkZWFsIHdpdGggc3VicmVncy4KKyAgICBpZiAoTU8uZ2V0U3ViUmVnKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gVGllZCB1c2Ugb3BlcmFuZHMgc2hvdWxkIG5vdCBiZSBwYXNzZWQgdG8gZm9sZE1lbW9yeU9wZXJhbmQuCisgICAgaWYgKCFNSS0+aXNSZWdUaWVkVG9EZWZPcGVyYW5kKElkeCkpCisgICAgICBGb2xkT3BzLnB1c2hfYmFjayhJZHgpOworICB9CisKKyAgTWFjaGluZUluc3RyICpGb2xkTUkgPSB0aWlfLmZvbGRNZW1vcnlPcGVyYW5kKE1JLCBGb2xkT3BzLCBzdGFja1Nsb3RfKTsKKyAgaWYgKCFGb2xkTUkpCisgICAgcmV0dXJuIGZhbHNlOworICBsaXNfLlJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHMoTUksIEZvbGRNSSk7CisgIHZybV8uYWRkU3BpbGxTbG90VXNlKHN0YWNrU2xvdF8sIEZvbGRNSSk7CisgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgREVCVUcoZGJncygpIDw8ICJcdGZvbGRlZDogIiA8PCAqRm9sZE1JKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpbnNlcnRSZWxvYWQgLSBJbnNlcnQgYSByZWxvYWQgb2YgTmV3TEkucmVnIGJlZm9yZSBNSS4KK3ZvaWQgSW5saW5lU3BpbGxlcjo6aW5zZXJ0UmVsb2FkKExpdmVJbnRlcnZhbCAmTmV3TEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9ICpNSS0+Z2V0UGFyZW50KCk7CisgIFNsb3RJbmRleCBJZHggPSBsaXNfLmdldEluc3RydWN0aW9uSW5kZXgoTUkpLmdldERlZkluZGV4KCk7CisgIHRpaV8ubG9hZFJlZ0Zyb21TdGFja1Nsb3QoTUJCLCBNSSwgTmV3TEkucmVnLCBzdGFja1Nsb3RfLCByY18sICZ0cmlfKTsKKyAgLS1NSTsgLy8gUG9pbnQgdG8gbG9hZCBpbnN0cnVjdGlvbi4KKyAgU2xvdEluZGV4IExvYWRJZHggPSBsaXNfLkluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhNSSkuZ2V0RGVmSW5kZXgoKTsKKyAgdnJtXy5hZGRTcGlsbFNsb3RVc2Uoc3RhY2tTbG90XywgTUkpOworICBERUJVRyhkYmdzKCkgPDwgIlx0cmVsb2FkOiAgIiA8PCBMb2FkSWR4IDw8ICdcdCcgPDwgKk1JKTsKKyAgVk5JbmZvICpMb2FkVk5JID0gTmV3TEkuZ2V0TmV4dFZhbHVlKExvYWRJZHgsIDAsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXNfLmdldFZOSW5mb0FsbG9jYXRvcigpKTsKKyAgTmV3TEkuYWRkUmFuZ2UoTGl2ZVJhbmdlKExvYWRJZHgsIElkeCwgTG9hZFZOSSkpOworfQorCisvLy8gaW5zZXJ0U3BpbGwgLSBJbnNlcnQgYSBzcGlsbCBvZiBOZXdMSS5yZWcgYWZ0ZXIgTUkuCit2b2lkIElubGluZVNwaWxsZXI6Omluc2VydFNwaWxsKExpdmVJbnRlcnZhbCAmTmV3TEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSkgeworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1JLT5nZXRQYXJlbnQoKTsKKyAgU2xvdEluZGV4IElkeCA9IGxpc18uZ2V0SW5zdHJ1Y3Rpb25JbmRleChNSSkuZ2V0RGVmSW5kZXgoKTsKKyAgdGlpXy5zdG9yZVJlZ1RvU3RhY2tTbG90KE1CQiwgKytNSSwgTmV3TEkucmVnLCB0cnVlLCBzdGFja1Nsb3RfLCByY18sICZ0cmlfKTsKKyAgLS1NSTsgLy8gUG9pbnQgdG8gc3RvcmUgaW5zdHJ1Y3Rpb24uCisgIFNsb3RJbmRleCBTdG9yZUlkeCA9IGxpc18uSW5zZXJ0TWFjaGluZUluc3RySW5NYXBzKE1JKS5nZXREZWZJbmRleCgpOworICB2cm1fLmFkZFNwaWxsU2xvdFVzZShzdGFja1Nsb3RfLCBNSSk7CisgIERFQlVHKGRiZ3MoKSA8PCAiXHRzcGlsbGVkOiAiIDw8IFN0b3JlSWR4IDw8ICdcdCcgPDwgKk1JKTsKKyAgVk5JbmZvICpTdG9yZVZOSSA9IE5ld0xJLmdldE5leHRWYWx1ZShJZHgsIDAsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzXy5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisgIE5ld0xJLmFkZFJhbmdlKExpdmVSYW5nZShJZHgsIFN0b3JlSWR4LCBTdG9yZVZOSSkpOworfQorCit2b2lkIElubGluZVNwaWxsZXI6OnNwaWxsKExpdmVJbnRlcnZhbCAqbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+ICZuZXdJbnRlcnZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxMaXZlSW50ZXJ2YWwqPiAmc3BpbGxJcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4ICplYXJsaWVzdEluZGV4KSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiSW5saW5lIHNwaWxsaW5nICIgPDwgKmxpIDw8ICJcbiIpOworICBhc3NlcnQobGktPmlzU3BpbGxhYmxlKCkgJiYgIkF0dGVtcHRpbmcgdG8gc3BpbGwgYWxyZWFkeSBzcGlsbGVkIHZhbHVlLiIpOworICBhc3NlcnQoIWxpLT5pc1N0YWNrU2xvdCgpICYmICJUcnlpbmcgdG8gc3BpbGwgYSBzdGFjayBzbG90LiIpOworCisgIGxpXyA9IGxpOworICBuZXdJbnRlcnZhbHNfID0gJm5ld0ludGVydmFsczsKKyAgcmNfID0gbXJpXy5nZXRSZWdDbGFzcyhsaS0+cmVnKTsKKyAgc3BpbGxJc18gPSAmc3BpbGxJczsKKworICBpZiAoc3BsaXQoKSkKKyAgICByZXR1cm47CisKKyAgcmVNYXRlcmlhbGl6ZUFsbCgpOworCisgIC8vIFJlbWF0IG1heSBoYW5kbGUgZXZlcnl0aGluZy4KKyAgaWYgKGxpXy0+ZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgc3RhY2tTbG90XyA9IHZybV8uZ2V0U3RhY2tTbG90KGxpLT5yZWcpOworICBpZiAoc3RhY2tTbG90XyA9PSBWaXJ0UmVnTWFwOjpOT19TVEFDS19TTE9UKQorICAgIHN0YWNrU2xvdF8gPSB2cm1fLmFzc2lnblZpcnQyU3RhY2tTbG90KGxpLT5yZWcpOworCisgIC8vIEl0ZXJhdGUgb3ZlciBpbnN0cnVjdGlvbnMgdXNpbmcgcmVnaXN0ZXIuCisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6cmVnX2l0ZXJhdG9yIFJJID0gbXJpXy5yZWdfYmVnaW4obGktPnJlZyk7CisgICAgICAgTWFjaGluZUluc3RyICpNSSA9IFJJLnNraXBJbnN0cnVjdGlvbigpOykgeworCisgICAgLy8gRGVidWcgdmFsdWVzIGFyZSBub3QgYWxsb3dlZCB0byBhZmZlY3QgY29kZWdlbi4KKyAgICBpZiAoTUktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgICAvLyBNb2RpZnkgREJHX1ZBTFVFIG5vdyB0aGF0IHRoZSB2YWx1ZSBpcyBpbiBhIHNwaWxsIHNsb3QuCisgICAgICB1aW50NjRfdCBPZmZzZXQgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKTsKKyAgICAgIGNvbnN0IE1ETm9kZSAqTURQdHIgPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRNZXRhZGF0YSgpOworICAgICAgRGVidWdMb2MgREwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgICAgIGlmIChNYWNoaW5lSW5zdHIgKk5ld0RWID0gdGlpXy5lbWl0RnJhbWVJbmRleERlYnVnVmFsdWUobWZfLCBzdGFja1Nsb3RfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsIE1EUHRyLCBETCkpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJNb2RpZnlpbmcgZGVidWcgaW5mbyBkdWUgdG8gc3BpbGw6IiA8PCAiXHQiIDw8ICpNSSk7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNSS0+Z2V0UGFyZW50KCk7CisgICAgICAgIE1CQi0+aW5zZXJ0KE1CQi0+ZXJhc2UoTUkpLCBOZXdEVik7CisgICAgICB9IGVsc2UgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlbW92aW5nIGRlYnVnIGluZm8gZHVlIHRvIHNwaWxsOiIgPDwgIlx0IiA8PCAqTUkpOworICAgICAgICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBTdGFjayBzbG90IGFjY2Vzc2VzIG1heSBjb2FsZXNjZSBhd2F5LgorICAgIGlmIChjb2FsZXNjZVN0YWNrQWNjZXNzKE1JKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gQW5hbHl6ZSBpbnN0cnVjdGlvbi4KKyAgICBib29sIFJlYWRzLCBXcml0ZXM7CisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IE9wczsKKyAgICB0aWUoUmVhZHMsIFdyaXRlcykgPSBNSS0+cmVhZHNXcml0ZXNWaXJ0dWFsUmVnaXN0ZXIobGktPnJlZywgJk9wcyk7CisKKyAgICAvLyBBdHRlbXB0IHRvIGZvbGQgbWVtb3J5IG9wcy4KKyAgICBpZiAoZm9sZE1lbW9yeU9wZXJhbmQoTUksIE9wcykpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEFsbG9jYXRlIGludGVydmFsIGFyb3VuZCBpbnN0cnVjdGlvbi4KKyAgICAvLyBGSVhNRTogSW5mZXIgcmVnY2xhc3MgZnJvbSBpbnN0cnVjdGlvbiBhbG9uZS4KKyAgICB1bnNpZ25lZCBOZXdWUmVnID0gbXJpXy5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIocmNfKTsKKyAgICB2cm1fLmdyb3coKTsKKyAgICBMaXZlSW50ZXJ2YWwgJk5ld0xJID0gbGlzXy5nZXRPckNyZWF0ZUludGVydmFsKE5ld1ZSZWcpOworICAgIE5ld0xJLm1hcmtOb3RTcGlsbGFibGUoKTsKKworICAgIGlmIChSZWFkcykKKyAgICAgIGluc2VydFJlbG9hZChOZXdMSSwgTUkpOworCisgICAgLy8gUmV3cml0ZSBpbnN0cnVjdGlvbiBvcGVyYW5kcy4KKyAgICBib29sIGhhc0xpdmVEZWYgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKE9wc1tpXSk7CisgICAgICBNTy5zZXRSZWcoTmV3VlJlZyk7CisgICAgICBpZiAoTU8uaXNVc2UoKSkgeworICAgICAgICBpZiAoIU1JLT5pc1JlZ1RpZWRUb0RlZk9wZXJhbmQoT3BzW2ldKSkKKyAgICAgICAgICBNTy5zZXRJc0tpbGwoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghTU8uaXNEZWFkKCkpCisgICAgICAgICAgaGFzTGl2ZURlZiA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRklYTUU6IFVzZSBhIHNlY29uZCB2cmVnIGlmIGluc3RydWN0aW9uIGhhcyBubyB0aWVkIG9wcy4KKyAgICBpZiAoV3JpdGVzICYmIGhhc0xpdmVEZWYpCisgICAgICBpbnNlcnRTcGlsbChOZXdMSSwgTUkpOworCisgICAgREVCVUcoZGJncygpIDw8ICJcdGludGVydmFsOiAiIDw8IE5ld0xJIDw8ICdcbicpOworICAgIG5ld0ludGVydmFscy5wdXNoX2JhY2soJk5ld0xJKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vTExWTVRhcmdldE1hY2hpbmUuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTExWTVRhcmdldE1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOWVkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9MTFZNVGFyZ2V0TWFjaGluZS5jcHAKQEAgLTAsMCArMSwyNjEgQEAKKy8vPT09LS0gTExWTVRhcmdldE1hY2hpbmUuY3BwIC0gSW1wbGVtZW50IHRoZSBMTFZNVGFyZ2V0TWFjaGluZSBjbGFzcyAtLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExMVk1UYXJnZXRNYWNoaW5lIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVmVyaWZpZXIuaCIKKyNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1ByaW50TW9kdWxlUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Bc21QcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbkFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dDU3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIgorI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBEaXNhYmxlUG9zdFJBKCJkaXNhYmxlLXBvc3QtcmEiLCBjbDo6SGlkZGVuLAorICAgIGNsOjpkZXNjKCJEaXNhYmxlIFBvc3QgUmVnYWxsb2MiKSk7CitzdGF0aWMgY2w6Om9wdDxib29sPiBEaXNhYmxlQnJhbmNoRm9sZCgiZGlzYWJsZS1icmFuY2gtZm9sZCIsIGNsOjpIaWRkZW4sCisgICAgY2w6OmRlc2MoIkRpc2FibGUgYnJhbmNoIGZvbGRpbmciKSk7CitzdGF0aWMgY2w6Om9wdDxib29sPiBEaXNhYmxlVGFpbER1cGxpY2F0ZSgiZGlzYWJsZS10YWlsLWR1cGxpY2F0ZSIsIGNsOjpIaWRkZW4sCisgICAgY2w6OmRlc2MoIkRpc2FibGUgdGFpbCBkdXBsaWNhdGlvbiIpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IERpc2FibGVFYXJseVRhaWxEdXAoImRpc2FibGUtZWFybHktdGFpbGR1cCIsIGNsOjpIaWRkZW4sCisgICAgY2w6OmRlc2MoIkRpc2FibGUgcHJlLXJlZ2lzdGVyIGFsbG9jYXRpb24gdGFpbCBkdXBsaWNhdGlvbiIpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IERpc2FibGVDb2RlUGxhY2UoImRpc2FibGUtY29kZS1wbGFjZSIsIGNsOjpIaWRkZW4sCisgICAgY2w6OmRlc2MoIkRpc2FibGUgY29kZSBwbGFjZW1lbnQiKSk7CitzdGF0aWMgY2w6Om9wdDxib29sPiBEaXNhYmxlU1NDKCJkaXNhYmxlLXNzYyIsIGNsOjpIaWRkZW4sCisgICAgY2w6OmRlc2MoIkRpc2FibGUgU3RhY2sgU2xvdCBDb2xvcmluZyIpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IERpc2FibGVNYWNoaW5lTElDTSgiZGlzYWJsZS1tYWNoaW5lLWxpY20iLCBjbDo6SGlkZGVuLAorICAgIGNsOjpkZXNjKCJEaXNhYmxlIE1hY2hpbmUgTElDTSIpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IERpc2FibGVQb3N0UkFNYWNoaW5lTElDTSgiZGlzYWJsZS1wb3N0cmEtbWFjaGluZS1saWNtIiwKKyAgICBjbDo6SGlkZGVuLAorICAgIGNsOjpkZXNjKCJEaXNhYmxlIE1hY2hpbmUgTElDTSIpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IERpc2FibGVNYWNoaW5lU2luaygiZGlzYWJsZS1tYWNoaW5lLXNpbmsiLCBjbDo6SGlkZGVuLAorICAgIGNsOjpkZXNjKCJEaXNhYmxlIE1hY2hpbmUgU2lua2luZyIpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IERpc2FibGVMU1IoImRpc2FibGUtbHNyIiwgY2w6OkhpZGRlbiwKKyAgICBjbDo6ZGVzYygiRGlzYWJsZSBMb29wIFN0cmVuZ3RoIFJlZHVjdGlvbiBQYXNzIikpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRGlzYWJsZUNHUCgiZGlzYWJsZS1jZ3AiLCBjbDo6SGlkZGVuLAorICAgIGNsOjpkZXNjKCJEaXNhYmxlIENvZGVnZW4gUHJlcGFyZSIpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IFNob3dNQ0VuY29kaW5nKCJzaG93LW1jLWVuY29kaW5nIiwgY2w6OkhpZGRlbiwKKyAgICBjbDo6ZGVzYygiU2hvdyBlbmNvZGluZyBpbiAucyBvdXRwdXQiKSk7CitzdGF0aWMgY2w6Om9wdDxib29sPiBTaG93TUNJbnN0KCJzaG93LW1jLWluc3QiLCBjbDo6SGlkZGVuLAorICAgIGNsOjpkZXNjKCJTaG93IGluc3RydWN0aW9uIHN0cnVjdHVyZSBpbiAucyBvdXRwdXQiKSk7CitzdGF0aWMgY2w6Om9wdDxib29sPiBFbmFibGVNQ0xvZ2dpbmcoImVuYWJsZS1tYy1hcGktbG9nZ2luZyIsIGNsOjpIaWRkZW4sCisgICAgY2w6OmRlc2MoIkVuYWJsZSBNQyBBUEkgbG9nZ2luZyIpKTsKKworc3RhdGljIGNsOjpvcHQ8Y2w6OmJvb2xPckRlZmF1bHQ+CitBc21WZXJib3NlKCJhc20tdmVyYm9zZSIsIGNsOjpkZXNjKCJBZGQgY29tbWVudHMgdG8gZGlyZWN0aXZlcy4iKSwKKyAgICAgICAgICAgY2w6OmluaXQoY2w6OkJPVV9VTlNFVCkpOworCitzdGF0aWMgYm9vbCBnZXRWZXJib3NlQXNtKCkgeworICBzd2l0Y2ggKEFzbVZlcmJvc2UpIHsKKyAgZGVmYXVsdDoKKyAgY2FzZSBjbDo6Qk9VX1VOU0VUOiByZXR1cm4gVGFyZ2V0TWFjaGluZTo6Z2V0QXNtVmVyYm9zaXR5RGVmYXVsdCgpOworICBjYXNlIGNsOjpCT1VfVFJVRTogIHJldHVybiB0cnVlOworICBjYXNlIGNsOjpCT1VfRkFMU0U6IHJldHVybiBmYWxzZTsKKyAgfSAgICAgIAorfQorCisvLyBFbmFibGUgb3IgZGlzYWJsZSBhbiBleHBlcmltZW50YWwgb3B0aW1pemF0aW9uIHRvIHNwbGl0IEdFUHMKKy8vIGFuZCBydW4gYSBzcGVjaWFsIEdWTiBwYXNzIHdoaWNoIGRvZXMgbm90IGV4YW1pbmUgbG9hZHMsIGluCisvLyBhbiBlZmZvcnQgdG8gZmFjdG9yIG91dCByZWR1bmRhbmN5IGltcGxpY2l0IGluIGNvbXBsZXggR0VQcy4KK3N0YXRpYyBjbDo6b3B0PGJvb2w+IEVuYWJsZVNwbGl0R0VQR1ZOKCJzcGxpdC1nZXAtZ3ZuIiwgY2w6OkhpZGRlbiwKKyAgICBjbDo6ZGVzYygiU3BsaXQgR0VQcyBhbmQgcnVuIG5vLWxvYWQgR1ZOIikpOworCitMTFZNVGFyZ2V0TWFjaGluZTo6TExWTVRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZUcmlwbGUpCisgIDogVGFyZ2V0TWFjaGluZShUKSwgVGFyZ2V0VHJpcGxlKFRyaXBsZSkgeworICBBc21JbmZvID0gVC5jcmVhdGVBc21JbmZvKFRhcmdldFRyaXBsZSk7Cit9CisKKy8vIFNldCB0aGUgZGVmYXVsdCBjb2RlIG1vZGVsIGZvciB0aGUgSklUIGZvciBhIGdlbmVyaWMgdGFyZ2V0LgorLy8gRklYTUU6IElzIHNtYWxsIHJpZ2h0IGhlcmU/IG9yIC5pczY0Qml0KCkgPyBMYXJnZSA6IFNtYWxsPwordm9pZCBMTFZNVGFyZ2V0TWFjaGluZTo6c2V0Q29kZU1vZGVsRm9ySklUKCkgeworICBzZXRDb2RlTW9kZWwoQ29kZU1vZGVsOjpTbWFsbCk7Cit9CisKKy8vIFNldCB0aGUgZGVmYXVsdCBjb2RlIG1vZGVsIGZvciBzdGF0aWMgY29tcGlsYXRpb24gZm9yIGEgZ2VuZXJpYyB0YXJnZXQuCit2b2lkIExMVk1UYXJnZXRNYWNoaW5lOjpzZXRDb2RlTW9kZWxGb3JTdGF0aWMoKSB7CisgIHNldENvZGVNb2RlbChDb2RlTW9kZWw6OlNtYWxsKTsKK30KKworLy8vIGFkZFBhc3Nlc1RvRW1pdE1hY2hpbmVDb2RlIC0gQWRkIHBhc3NlcyB0byB0aGUgc3BlY2lmaWVkIHBhc3MgbWFuYWdlciB0bworLy8vIGdldCBtYWNoaW5lIGNvZGUgZW1pdHRlZC4gIFRoaXMgdXNlcyBhIEpJVENvZGVFbWl0dGVyIG9iamVjdCB0byBoYW5kbGUKKy8vLyBhY3R1YWxseSBvdXRwdXR0aW5nIHRoZSBtYWNoaW5lIGNvZGUgYW5kIHJlc29sdmluZyB0aGluZ3MgbGlrZSB0aGUgYWRkcmVzcworLy8vIG9mIGZ1bmN0aW9ucy4gIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm5zIHRydWUgaWYgbWFjaGluZSBjb2RlIGVtaXNzaW9uIGlzCisvLy8gbm90IHN1cHBvcnRlZC4KKy8vLworYm9vbCBMTFZNVGFyZ2V0TWFjaGluZTo6YWRkUGFzc2VzVG9FbWl0TWFjaGluZUNvZGUoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICAvLyBNYWtlIHN1cmUgdGhlIGNvZGUgbW9kZWwgaXMgc2V0LgorICBzZXRDb2RlTW9kZWxGb3JKSVQoKTsKKyAgCisgIC8vIEFkZCBjb21tb24gQ29kZUdlbiBwYXNzZXMuCisgIE1DQ29udGV4dCAqQ3R4ID0gMDsKKyAgaWYgKGFkZENvbW1vbkNvZGVHZW5QYXNzZXMoUE0sIE9wdExldmVsLCBDdHgpKQorICAgIHJldHVybiB0cnVlOworCisgIGFkZENvZGVFbWl0dGVyKFBNLCBPcHRMZXZlbCwgSkNFKTsKKworICByZXR1cm4gZmFsc2U7IC8vIHN1Y2Nlc3MhCit9CisKKy8vLyBhZGRQYXNzZXNUb0VtaXRNQyAtIEFkZCBwYXNzZXMgdG8gdGhlIHNwZWNpZmllZCBwYXNzIG1hbmFnZXIgdG8gZ2V0CisvLy8gbWFjaGluZSBjb2RlIGVtaXR0ZWQgd2l0aCB0aGUgTUNKSVQuIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBtYWNoaW5lCisvLy8gY29kZSBpcyBub3Qgc3VwcG9ydGVkLiBJdCBmaWxscyB0aGUgTUNDb250ZXh0IEN0eCBwb2ludGVyIHdoaWNoIGNhbiBiZQorLy8vIHVzZWQgdG8gYnVpbGQgY3VzdG9tIE1DU3RyZWFtZXIuCisvLy8KK2Jvb2wgTExWTVRhcmdldE1hY2hpbmU6OmFkZFBhc3Nlc1RvRW1pdE1DKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgKiZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICAvLyBBZGQgY29tbW9uIENvZGVHZW4gcGFzc2VzLgorICBpZiAoYWRkQ29tbW9uQ29kZUdlblBhc3NlcyhQTSwgT3B0TGV2ZWwsIEN0eCkpCisgICAgcmV0dXJuIHRydWU7CisgIC8vIE1ha2Ugc3VyZSB0aGUgY29kZSBtb2RlbCBpcyBzZXQuCisgIHNldENvZGVNb2RlbEZvckpJVCgpOworCisgIHJldHVybiBmYWxzZTsgLy8gc3VjY2VzcyEKK30KKworLy8vIGFkZENvbW1vbkNvZGVHZW5QYXNzZXMgLSBBZGQgc3RhbmRhcmQgTExWTSBjb2RlZ2VuIHBhc3NlcyB1c2VkIGZvciBib3RoCisvLy8gZW1pdHRpbmcgdG8gYXNzZW1ibHkgZmlsZXMgb3IgbWFjaGluZSBjb2RlIG91dHB1dC4KKy8vLworYm9vbCBMTFZNVGFyZ2V0TWFjaGluZTo6YWRkQ29tbW9uQ29kZUdlblBhc3NlcyhQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0IComT3V0Q29udGV4dCkgeworICAvLyBTdGFuZGFyZCBMTFZNLUxldmVsIFBhc3Nlcy4KKworICAvLyBPcHRpb25hbGx5LCB0dW4gc3BsaXQtR0VQcyBhbmQgbm8tbG9hZCBHVk4uCisgIGlmIChFbmFibGVTcGxpdEdFUEdWTikgeworICAgIFBNLmFkZChjcmVhdGVHRVBTcGxpdHRlclBhc3MoKSk7CisgICAgUE0uYWRkKGNyZWF0ZUdWTlBhc3MoLypOb0xvYWRzPSovdHJ1ZSkpOworICB9CisKKyAgLy8gUnVuIGxvb3Agc3RyZW5ndGggcmVkdWN0aW9uIGJlZm9yZSBhbnl0aGluZyBlbHNlLgorICBpZiAoT3B0TGV2ZWwgIT0gQ29kZUdlbk9wdDo6Tm9uZSAmJiAhRGlzYWJsZUxTUikgeworICAgIFBNLmFkZChjcmVhdGVMb29wU3RyZW5ndGhSZWR1Y2VQYXNzKGdldFRhcmdldExvd2VyaW5nKCkpKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB0aGF0IG5vIHVucmVhY2hhYmxlIGJsb2NrcyBhcmUgaW5zdHJ1Y3Rpb24gc2VsZWN0ZWQuCisgIFBNLmFkZChjcmVhdGVVbnJlYWNoYWJsZUJsb2NrRWxpbWluYXRpb25QYXNzKCkpOworCisgIGlmIChPcHRMZXZlbCAhPSBDb2RlR2VuT3B0OjpOb25lICYmICFEaXNhYmxlQ0dQKQorICAgIFBNLmFkZChjcmVhdGVDb2RlR2VuUHJlcGFyZVBhc3MoZ2V0VGFyZ2V0TG93ZXJpbmcoKSkpOworCisgIFBNLmFkZChjcmVhdGVTdGFja1Byb3RlY3RvclBhc3MoZ2V0VGFyZ2V0TG93ZXJpbmcoKSkpOworCisgIGFkZFByZUlTZWwoUE0sIE9wdExldmVsKTsKKworICAvLyBTdGFuZGFyZCBMb3dlci1MZXZlbCBQYXNzZXMuCisgIAorICAvLyBJbnN0YWxsIGEgTWFjaGluZU1vZHVsZUluZm8gY2xhc3MsIHdoaWNoIGlzIGFuIGltbXV0YWJsZSBwYXNzIHRoYXQgaG9sZHMKKyAgLy8gYWxsIHRoZSBwZXItbW9kdWxlIHN0dWZmIHdlJ3JlIGdlbmVyYXRpbmcsIGluY2x1ZGluZyBNQ0NvbnRleHQuCisgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUkgPSBuZXcgTWFjaGluZU1vZHVsZUluZm8oKmdldE1DQXNtSW5mbygpKTsKKyAgUE0uYWRkKE1NSSk7CisgIE91dENvbnRleHQgPSAmTU1JLT5nZXRDb250ZXh0KCk7IC8vIFJldHVybiB0aGUgTUNDb250ZXh0IHNwZWNpZmljYWxseSBieS1yZWYuCisgIAorCisgIC8vIFNldCB1cCBhIE1hY2hpbmVGdW5jdGlvbiBmb3IgdGhlIHJlc3Qgb2YgQ29kZUdlbiB0byB3b3JrIG9uLgorICBQTS5hZGQobmV3IE1hY2hpbmVGdW5jdGlvbkFuYWx5c2lzKCp0aGlzLCBPcHRMZXZlbCkpOworCisgIC8vIEFzayB0aGUgdGFyZ2V0IGZvciBhbiBpc2VsLgorICBpZiAoYWRkSW5zdFNlbGVjdG9yKFBNLCBPcHRMZXZlbCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gT3B0aW1pemUgUEhJcyBiZWZvcmUgRENFOiByZW1vdmluZyBkZWFkIFBISSBjeWNsZXMgbWF5IG1ha2UgbW9yZQorICAvLyBpbnN0cnVjdGlvbnMgZGVhZC4KKyAgaWYgKE9wdExldmVsICE9IENvZGVHZW5PcHQ6Ok5vbmUpCisgICAgUE0uYWRkKGNyZWF0ZU9wdGltaXplUEhJc1Bhc3MoKSk7CisKKyAgaWYgKE9wdExldmVsICE9IENvZGVHZW5PcHQ6Ok5vbmUpIHsKKyAgICAvLyBXaXRoIG9wdGltaXphdGlvbiwgZGVhZCBjb2RlIHNob3VsZCBhbHJlYWR5IGJlIGVsaW1pbmF0ZWQuIEhvd2V2ZXIKKyAgICAvLyB0aGVyZSBpcyBvbmUga25vd24gZXhjZXB0aW9uOiBsb3dlcmVkIGNvZGUgZm9yIGFyZ3VtZW50cyB0aGF0IGFyZSBvbmx5CisgICAgLy8gdXNlZCBieSB0YWlsIGNhbGxzLCB3aGVyZSB0aGUgdGFpbCBjYWxscyByZXVzZSB0aGUgaW5jb21pbmcgc3RhY2sKKyAgICAvLyBhcmd1bWVudHMgZGlyZWN0bHkgKHNlZSB0MTEgaW4gdGVzdC9Db2RlR2VuL1g4Ni9zaWJjYWxsLmxsKS4KKyAgICBQTS5hZGQoY3JlYXRlRGVhZE1hY2hpbmVJbnN0cnVjdGlvbkVsaW1QYXNzKCkpOworCisgICAgUE0uYWRkKGNyZWF0ZVBlZXBob2xlT3B0aW1pemVyUGFzcygpKTsKKyAgICBpZiAoIURpc2FibGVNYWNoaW5lTElDTSkKKyAgICAgIFBNLmFkZChjcmVhdGVNYWNoaW5lTElDTVBhc3MoKSk7CisgICAgUE0uYWRkKGNyZWF0ZU1hY2hpbmVDU0VQYXNzKCkpOworICAgIGlmICghRGlzYWJsZU1hY2hpbmVTaW5rKQorICAgICAgUE0uYWRkKGNyZWF0ZU1hY2hpbmVTaW5raW5nUGFzcygpKTsKKyAgfQorCisgIC8vIFByZS1yYSB0YWlsIGR1cGxpY2F0aW9uLgorICBpZiAoT3B0TGV2ZWwgIT0gQ29kZUdlbk9wdDo6Tm9uZSAmJiAhRGlzYWJsZUVhcmx5VGFpbER1cCkgeworICAgIFBNLmFkZChjcmVhdGVUYWlsRHVwbGljYXRlUGFzcyh0cnVlKSk7CisgIH0KKworICAvLyBSdW4gcHJlLXJhIHBhc3Nlcy4KKyAgYWRkUHJlUmVnQWxsb2MoUE0sIE9wdExldmVsKTsKKworICAvLyBQZXJmb3JtIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIFBNLmFkZChjcmVhdGVSZWdpc3RlckFsbG9jYXRvcihPcHRMZXZlbCkpOworCisgIC8vIFBlcmZvcm0gc3RhY2sgc2xvdCBjb2xvcmluZyBhbmQgcG9zdC1yYSBtYWNoaW5lIExJQ00uCisgIGlmIChPcHRMZXZlbCAhPSBDb2RlR2VuT3B0OjpOb25lKSB7CisgICAgLy8gRklYTUU6IFJlLWVuYWJsZSBjb2xvcmluZyB3aXRoIHJlZ2lzdGVyIHdoZW4gaXQncyBjYXBhYmxlIG9mIGFkZGluZworICAgIC8vIGtpbGwgbWFya2Vycy4KKyAgICBpZiAoIURpc2FibGVTU0MpCisgICAgICBQTS5hZGQoY3JlYXRlU3RhY2tTbG90Q29sb3JpbmdQYXNzKGZhbHNlKSk7CisKKyAgICAvLyBSdW4gcG9zdC1yYSBtYWNoaW5lIExJQ00gdG8gaG9pc3QgcmVsb2FkcyAvIHJlbWF0cy4KKyAgICBpZiAoIURpc2FibGVQb3N0UkFNYWNoaW5lTElDTSkKKyAgICAgIFBNLmFkZChjcmVhdGVNYWNoaW5lTElDTVBhc3MoZmFsc2UpKTsKKyAgfQorCisgIC8vIFJ1biBwb3N0LXJhIHBhc3Nlcy4KKyAgYWRkUG9zdFJlZ0FsbG9jKFBNLCBPcHRMZXZlbCk7CisKKyAgUE0uYWRkKGNyZWF0ZUxvd2VyU3VicmVnc1Bhc3MoKSk7CisKKyAgLy8gSW5zZXJ0IHByb2xvZy9lcGlsb2cgY29kZS4gIEVsaW1pbmF0ZSBhYnN0cmFjdCBmcmFtZSBpbmRleCByZWZlcmVuY2VzLi4uCisgIFBNLmFkZChjcmVhdGVQcm9sb2dFcGlsb2dDb2RlSW5zZXJ0ZXIoKSk7CisKKyAgLy8gUnVuIHByZS1zY2hlZDIgcGFzc2VzLgorICBhZGRQcmVTY2hlZDIoUE0sIE9wdExldmVsKTsKKyAgCisgIC8vIFNlY29uZCBwYXNzIHNjaGVkdWxlci4KKyAgaWYgKE9wdExldmVsICE9IENvZGVHZW5PcHQ6Ok5vbmUgJiYgIURpc2FibGVQb3N0UkEpIHsKKyAgICBQTS5hZGQoY3JlYXRlUG9zdFJBU2NoZWR1bGVyKE9wdExldmVsKSk7CisgIH0KKworICAvLyBCcmFuY2ggZm9sZGluZyBtdXN0IGJlIHJ1biBhZnRlciByZWdhbGxvYyBhbmQgcHJvbG9nL2VwaWxvZyBpbnNlcnRpb24uCisgIGlmIChPcHRMZXZlbCAhPSBDb2RlR2VuT3B0OjpOb25lICYmICFEaXNhYmxlQnJhbmNoRm9sZCkgeworICAgIFBNLmFkZChjcmVhdGVCcmFuY2hGb2xkaW5nUGFzcyhnZXRFbmFibGVUYWlsTWVyZ2VEZWZhdWx0KCkpKTsKKyAgfQorCisgIC8vIFRhaWwgZHVwbGljYXRpb24uCisgIGlmIChPcHRMZXZlbCAhPSBDb2RlR2VuT3B0OjpOb25lICYmICFEaXNhYmxlVGFpbER1cGxpY2F0ZSkgeworICAgIFBNLmFkZChjcmVhdGVUYWlsRHVwbGljYXRlUGFzcyhmYWxzZSkpOworICB9CisKKyAgaWYgKE9wdExldmVsICE9IENvZGVHZW5PcHQ6Ok5vbmUgJiYgIURpc2FibGVDb2RlUGxhY2UpIHsKKyAgICBQTS5hZGQoY3JlYXRlQ29kZVBsYWNlbWVudE9wdFBhc3MoKSk7CisgIH0KKworICBhZGRQcmVFbWl0UGFzcyhQTSwgT3B0TGV2ZWwpOworCisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xhdGVuY3lQcmlvcml0eVF1ZXVlLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xhdGVuY3lQcmlvcml0eVF1ZXVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTUyN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTGF0ZW5jeVByaW9yaXR5UXVldWUuY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvLz09PS0tLS0gTGF0ZW5jeVByaW9yaXR5UXVldWUuY3BwIC0gQSBsYXRlbmN5LW9yaWVudGVkIHByaW9yaXR5IHF1ZXVlIC0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBMYXRlbmN5UHJpb3JpdHlRdWV1ZSBjbGFzcywgd2hpY2ggaXMgYQorLy8gU2NoZWR1bGluZ1ByaW9yaXR5UXVldWUgdGhhdCBzY2hlZHVsZXMgdXNpbmcgbGF0ZW5jeSBpbmZvcm1hdGlvbiB0bworLy8gcmVkdWNlIHRoZSBsZW5ndGggb2YgdGhlIGNyaXRpY2FsIHBhdGggdGhyb3VnaCB0aGUgYmFzaWMgYmxvY2suCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzY2hlZHVsZXIiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xhdGVuY3lQcmlvcml0eVF1ZXVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworYm9vbCBsYXRlbmN5X3NvcnQ6Om9wZXJhdG9yKCkoY29uc3QgU1VuaXQgKkxIUywgY29uc3QgU1VuaXQgKlJIUykgY29uc3QgeworICAvLyBUaGUgaXNTY2hlZHVsZUhpZ2ggZmxhZyBhbGxvd3Mgbm9kZXMgd2l0aCB3cmFwYXJvdW5kIGRlcGVuZGVuY2llcyB0aGF0CisgIC8vIGNhbm5vdCBlYXNpbHkgYmUgbW9kZWxlZCBhcyBlZGdlcyB3aXRoIGxhdGVuY2llcyB0byBiZSBzY2hlZHVsZWQgYXMKKyAgLy8gc29vbiBhcyBwb3NzaWJsZSBpbiBhIHRvcC1kb3duIHNjaGVkdWxlLgorICBpZiAoTEhTLT5pc1NjaGVkdWxlSGlnaCAmJiAhUkhTLT5pc1NjaGVkdWxlSGlnaCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghTEhTLT5pc1NjaGVkdWxlSGlnaCAmJiBSSFMtPmlzU2NoZWR1bGVIaWdoKQorICAgIHJldHVybiB0cnVlOworCisgIHVuc2lnbmVkIExIU051bSA9IExIUy0+Tm9kZU51bTsKKyAgdW5zaWduZWQgUkhTTnVtID0gUkhTLT5Ob2RlTnVtOworCisgIC8vIFRoZSBtb3N0IGltcG9ydGFudCBoZXVyaXN0aWMgaXMgc2NoZWR1bGluZyB0aGUgY3JpdGljYWwgcGF0aC4KKyAgdW5zaWduZWQgTEhTTGF0ZW5jeSA9IFBRLT5nZXRMYXRlbmN5KExIU051bSk7CisgIHVuc2lnbmVkIFJIU0xhdGVuY3kgPSBQUS0+Z2V0TGF0ZW5jeShSSFNOdW0pOworICBpZiAoTEhTTGF0ZW5jeSA8IFJIU0xhdGVuY3kpIHJldHVybiB0cnVlOworICBpZiAoTEhTTGF0ZW5jeSA+IFJIU0xhdGVuY3kpIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIEFmdGVyIHRoYXQsIGlmIHR3byBub2RlcyBoYXZlIGlkZW50aWNhbCBsYXRlbmNpZXMsIGxvb2sgdG8gc2VlIGlmIG9uZSB3aWxsCisgIC8vIHVuYmxvY2sgbW9yZSBvdGhlciBub2RlcyB0aGFuIHRoZSBvdGhlci4KKyAgdW5zaWduZWQgTEhTQmxvY2tlZCA9IFBRLT5nZXROdW1Tb2xlbHlCbG9ja05vZGVzKExIU051bSk7CisgIHVuc2lnbmVkIFJIU0Jsb2NrZWQgPSBQUS0+Z2V0TnVtU29sZWx5QmxvY2tOb2RlcyhSSFNOdW0pOworICBpZiAoTEhTQmxvY2tlZCA8IFJIU0Jsb2NrZWQpIHJldHVybiB0cnVlOworICBpZiAoTEhTQmxvY2tlZCA+IFJIU0Jsb2NrZWQpIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIEZpbmFsbHksIGp1c3QgdG8gcHJvdmlkZSBhIHN0YWJsZSBvcmRlcmluZywgdXNlIHRoZSBub2RlIG51bWJlciBhcyBhCisgIC8vIGRlY2lkaW5nIGZhY3Rvci4KKyAgcmV0dXJuIExIU051bSA8IFJIU051bTsKK30KKworCisvLy8gZ2V0U2luZ2xlVW5zY2hlZHVsZWRQcmVkIC0gSWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgdW5zY2hlZHVsZWQgcHJlZGVjZXNzb3IKKy8vLyBvZiBTVSwgcmV0dXJuIGl0LCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCitTVW5pdCAqTGF0ZW5jeVByaW9yaXR5UXVldWU6OmdldFNpbmdsZVVuc2NoZWR1bGVkUHJlZChTVW5pdCAqU1UpIHsKKyAgU1VuaXQgKk9ubHlBdmFpbGFibGVQcmVkID0gMDsKKyAgZm9yIChTVW5pdDo6Y29uc3RfcHJlZF9pdGVyYXRvciBJID0gU1UtPlByZWRzLmJlZ2luKCksIEUgPSBTVS0+UHJlZHMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBTVW5pdCAmUHJlZCA9ICpJLT5nZXRTVW5pdCgpOworICAgIGlmICghUHJlZC5pc1NjaGVkdWxlZCkgeworICAgICAgLy8gV2UgZm91bmQgYW4gYXZhaWxhYmxlLCBidXQgbm90IHNjaGVkdWxlZCwgcHJlZGVjZXNzb3IuICBJZiBpdCdzIHRoZQorICAgICAgLy8gb25seSBvbmUgd2UgaGF2ZSBmb3VuZCwga2VlcCB0cmFjayBvZiBpdC4uLiBvdGhlcndpc2UgZ2l2ZSB1cC4KKyAgICAgIGlmIChPbmx5QXZhaWxhYmxlUHJlZCAmJiBPbmx5QXZhaWxhYmxlUHJlZCAhPSAmUHJlZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBPbmx5QXZhaWxhYmxlUHJlZCA9ICZQcmVkOworICAgIH0KKyAgfQorICAgICAgCisgIHJldHVybiBPbmx5QXZhaWxhYmxlUHJlZDsKK30KKwordm9pZCBMYXRlbmN5UHJpb3JpdHlRdWV1ZTo6cHVzaChTVW5pdCAqU1UpIHsKKyAgLy8gTG9vayBhdCBhbGwgb2YgdGhlIHN1Y2Nlc3NvcnMgb2YgdGhpcyBub2RlLiAgQ291bnQgdGhlIG51bWJlciBvZiBub2RlcyB0aGF0CisgIC8vIHRoaXMgbm9kZSBpcyB0aGUgc29sZSB1bnNjaGVkdWxlZCBub2RlIGZvci4KKyAgdW5zaWduZWQgTnVtTm9kZXNCbG9ja2luZyA9IDA7CisgIGZvciAoU1VuaXQ6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgSSA9IFNVLT5TdWNjcy5iZWdpbigpLCBFID0gU1UtPlN1Y2NzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKGdldFNpbmdsZVVuc2NoZWR1bGVkUHJlZChJLT5nZXRTVW5pdCgpKSA9PSBTVSkKKyAgICAgICsrTnVtTm9kZXNCbG9ja2luZzsKKyAgfQorICBOdW1Ob2Rlc1NvbGVseUJsb2NraW5nW1NVLT5Ob2RlTnVtXSA9IE51bU5vZGVzQmxvY2tpbmc7CisgIAorICBRdWV1ZS5wdXNoX2JhY2soU1UpOworfQorCisKKy8vIFNjaGVkdWxlZE5vZGUgLSBBcyBub2RlcyBhcmUgc2NoZWR1bGVkLCB3ZSBsb29rIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55CisvLyBzdWNjZXNzb3Igbm9kZXMgdGhhdCBoYXZlIGEgc2luZ2xlIHVuc2NoZWR1bGVkIHByZWRlY2Vzc29yLiAgSWYgc28sIHRoYXQKKy8vIHNpbmdsZSBwcmVkZWNlc3NvciBoYXMgYSBoaWdoZXIgcHJpb3JpdHksIHNpbmNlIHNjaGVkdWxpbmcgaXQgd2lsbCBtYWtlCisvLyB0aGUgbm9kZSBhdmFpbGFibGUuCit2b2lkIExhdGVuY3lQcmlvcml0eVF1ZXVlOjpTY2hlZHVsZWROb2RlKFNVbml0ICpTVSkgeworICBmb3IgKFNVbml0Ojpjb25zdF9zdWNjX2l0ZXJhdG9yIEkgPSBTVS0+U3VjY3MuYmVnaW4oKSwgRSA9IFNVLT5TdWNjcy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIEFkanVzdFByaW9yaXR5T2ZVbnNjaGVkdWxlZFByZWRzKEktPmdldFNVbml0KCkpOworICB9Cit9CisKKy8vLyBBZGp1c3RQcmlvcml0eU9mVW5zY2hlZHVsZWRQcmVkcyAtIE9uZSBvZiB0aGUgcHJlZGVjZXNzb3JzIG9mIFNVIHdhcyBqdXN0CisvLy8gc2NoZWR1bGVkLiAgSWYgU1UgaXMgbm90IGl0c2VsZiBhdmFpbGFibGUsIHRoZW4gdGhlcmUgaXMgYXQgbGVhc3Qgb25lCisvLy8gcHJlZGVjZXNzb3Igbm9kZSB0aGF0IGhhcyBub3QgYmVlbiBzY2hlZHVsZWQgeWV0LiAgSWYgU1UgaGFzIGV4YWN0bHkgT05FCisvLy8gdW5zY2hlZHVsZWQgcHJlZGVjZXNzb3IsIHdlIHdhbnQgdG8gaW5jcmVhc2UgaXRzIHByaW9yaXR5OiBpdCBnZXR0aW5nCisvLy8gc2NoZWR1bGVkIHdpbGwgbWFrZSB0aGlzIG5vZGUgYXZhaWxhYmxlLCBzbyBpdCBpcyBiZXR0ZXIgdGhhbiBzb21lIG90aGVyCisvLy8gbm9kZSBvZiB0aGUgc2FtZSBwcmlvcml0eSB0aGF0IHdpbGwgbm90IG1ha2UgYSBub2RlIGF2YWlsYWJsZS4KK3ZvaWQgTGF0ZW5jeVByaW9yaXR5UXVldWU6OkFkanVzdFByaW9yaXR5T2ZVbnNjaGVkdWxlZFByZWRzKFNVbml0ICpTVSkgeworICBpZiAoU1UtPmlzQXZhaWxhYmxlKSByZXR1cm47ICAvLyBBbGwgcHJlZHMgc2NoZWR1bGVkLgorICAKKyAgU1VuaXQgKk9ubHlBdmFpbGFibGVQcmVkID0gZ2V0U2luZ2xlVW5zY2hlZHVsZWRQcmVkKFNVKTsKKyAgaWYgKE9ubHlBdmFpbGFibGVQcmVkID09IDAgfHwgIU9ubHlBdmFpbGFibGVQcmVkLT5pc0F2YWlsYWJsZSkgcmV0dXJuOworICAKKyAgLy8gT2theSwgd2UgZm91bmQgYSBzaW5nbGUgcHJlZGVjZXNzb3IgdGhhdCBpcyBhdmFpbGFibGUsIGJ1dCBub3Qgc2NoZWR1bGVkLgorICAvLyBTaW5jZSBpdCBpcyBhdmFpbGFibGUsIGl0IG11c3QgYmUgaW4gdGhlIHByaW9yaXR5IHF1ZXVlLiAgRmlyc3QgcmVtb3ZlIGl0LgorICByZW1vdmUoT25seUF2YWlsYWJsZVByZWQpOworCisgIC8vIFJlaW5zZXJ0IHRoZSBub2RlIGludG8gdGhlIHByaW9yaXR5IHF1ZXVlLCB3aGljaCByZWNvbXB1dGVzIGl0cworICAvLyBOdW1Ob2Rlc1NvbGVseUJsb2NraW5nIHZhbHVlLgorICBwdXNoKE9ubHlBdmFpbGFibGVQcmVkKTsKK30KKworU1VuaXQgKkxhdGVuY3lQcmlvcml0eVF1ZXVlOjpwb3AoKSB7CisgIGlmIChlbXB0eSgpKSByZXR1cm4gTlVMTDsKKyAgc3RkOjp2ZWN0b3I8U1VuaXQgKj46Oml0ZXJhdG9yIEJlc3QgPSBRdWV1ZS5iZWdpbigpOworICBmb3IgKHN0ZDo6dmVjdG9yPFNVbml0ICo+OjppdGVyYXRvciBJID0gbGx2bTo6bmV4dChRdWV1ZS5iZWdpbigpKSwKKyAgICAgICBFID0gUXVldWUuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChQaWNrZXIoKkJlc3QsICpJKSkKKyAgICAgIEJlc3QgPSBJOworICBTVW5pdCAqViA9ICpCZXN0OworICBpZiAoQmVzdCAhPSBwcmlvcihRdWV1ZS5lbmQoKSkpCisgICAgc3RkOjpzd2FwKCpCZXN0LCBRdWV1ZS5iYWNrKCkpOworICBRdWV1ZS5wb3BfYmFjaygpOworICByZXR1cm4gVjsKK30KKwordm9pZCBMYXRlbmN5UHJpb3JpdHlRdWV1ZTo6cmVtb3ZlKFNVbml0ICpTVSkgeworICBhc3NlcnQoIVF1ZXVlLmVtcHR5KCkgJiYgIlF1ZXVlIGlzIGVtcHR5ISIpOworICBzdGQ6OnZlY3RvcjxTVW5pdCAqPjo6aXRlcmF0b3IgSSA9IHN0ZDo6ZmluZChRdWV1ZS5iZWdpbigpLCBRdWV1ZS5lbmQoKSwgU1UpOworICBpZiAoSSAhPSBwcmlvcihRdWV1ZS5lbmQoKSkpCisgICAgc3RkOjpzd2FwKCpJLCBRdWV1ZS5iYWNrKCkpOworICBRdWV1ZS5wb3BfYmFjaygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vTGl2ZUludGVydmFsLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xpdmVJbnRlcnZhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyMGE2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xpdmVJbnRlcnZhbC5jcHAKQEAgLTAsMCArMSw4NjUgQEAKKy8vPT09LS0gTGl2ZUludGVydmFsLmNwcCAtIExpdmUgSW50ZXJ2YWwgUmVwcmVzZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExpdmVSYW5nZSBhbmQgTGl2ZUludGVydmFsIGNsYXNzZXMuICBHaXZlbiBzb21lCisvLyBudW1iZXJpbmcgb2YgZWFjaCB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbnMgYW4gaW50ZXJ2YWwgW2ksIGopIGlzIHNhaWQgdG8gYmUgYQorLy8gbGl2ZSBpbnRlcnZhbCBmb3IgcmVnaXN0ZXIgdiBpZiB0aGVyZSBpcyBubyBpbnN0cnVjdGlvbiB3aXRoIG51bWJlciBqJyA+IGoKKy8vIHN1Y2ggdGhhdCB2IGlzIGxpdmUgYXQgaicgYW5kIHRoZXJlIGlzIG5vIGluc3RydWN0aW9uIHdpdGggbnVtYmVyIGknIDwgaSBzdWNoCisvLyB0aGF0IHYgaXMgbGl2ZSBhdCBpJy4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBpbnRlcnZhbHMgY2FuIGhhdmUgaG9sZXMsCisvLyBpLmUuIGFuIGludGVydmFsIG1pZ2h0IGxvb2sgbGlrZSBbMSwyMCksIFs1MCw2NSksIFsxMDAwLDEwMDEpLiAgRWFjaAorLy8gaW5kaXZpZHVhbCByYW5nZSBpcyByZXByZXNlbnRlZCBhcyBhbiBpbnN0YW5jZSBvZiBMaXZlUmFuZ2UsIGFuZCB0aGUgd2hvbGUKKy8vIGludGVydmFsIGlzIHJlcHJlc2VudGVkIGFzIGFuIGluc3RhbmNlIG9mIExpdmVJbnRlcnZhbC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBBbiBleGFtcGxlIGZvciBsaXZlQXQoKToKKy8vCisvLyB0aGlzID0gWzEsNCksIGxpdmVBdCgwKSB3aWxsIHJldHVybiBmYWxzZS4gVGhlIGluc3RydWN0aW9uIGRlZmluaW5nIHRoaXMKKy8vIHNwYW5zIHNsb3RzIFswLDNdLiBUaGUgaW50ZXJ2YWwgYmVsb25ncyB0byBhbiBzcGlsbGVkIGRlZmluaXRpb24gb2YgdGhlCisvLyB2YXJpYWJsZSBpdCByZXByZXNlbnRzLiBUaGlzIGlzIGJlY2F1c2Ugc2xvdCAxIGlzIHVzZWQgKGRlZiBzbG90KSBhbmQgc3BhbnMKKy8vIHVwIHRvIHNsb3QgMyAoc3RvcmUgc2xvdCkuCisvLworYm9vbCBMaXZlSW50ZXJ2YWw6OmxpdmVBdChTbG90SW5kZXggSSkgY29uc3QgeworICBSYW5nZXM6OmNvbnN0X2l0ZXJhdG9yIHIgPSBzdGQ6OnVwcGVyX2JvdW5kKHJhbmdlcy5iZWdpbigpLCByYW5nZXMuZW5kKCksIEkpOworCisgIGlmIChyID09IHJhbmdlcy5iZWdpbigpKQorICAgIHJldHVybiBmYWxzZTsKKworICAtLXI7CisgIHJldHVybiByLT5jb250YWlucyhJKTsKK30KKworLy8gbGl2ZUJlZm9yZUFuZEF0IC0gQ2hlY2sgaWYgdGhlIGludGVydmFsIGlzIGxpdmUgYXQgdGhlIGluZGV4IGFuZCB0aGUgaW5kZXgKKy8vIGp1c3QgYmVmb3JlIGl0LiBJZiBpbmRleCBpcyBsaXZlQXQsIGNoZWNrIGlmIGl0IHN0YXJ0cyBhIG5ldyBsaXZlIHJhbmdlLgorLy8gSWYgaXQgZG9lcywgdGhlbiBjaGVjayBpZiB0aGUgcHJldmlvdXMgbGl2ZSByYW5nZSBlbmRzIGF0IGluZGV4LTEuCitib29sIExpdmVJbnRlcnZhbDo6bGl2ZUJlZm9yZUFuZEF0KFNsb3RJbmRleCBJKSBjb25zdCB7CisgIFJhbmdlczo6Y29uc3RfaXRlcmF0b3IgciA9IHN0ZDo6dXBwZXJfYm91bmQocmFuZ2VzLmJlZ2luKCksIHJhbmdlcy5lbmQoKSwgSSk7CisKKyAgaWYgKHIgPT0gcmFuZ2VzLmJlZ2luKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC0tcjsKKyAgaWYgKCFyLT5jb250YWlucyhJKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChJICE9IHItPnN0YXJ0KQorICAgIHJldHVybiB0cnVlOworICAvLyBJIGlzIHRoZSBzdGFydCBvZiBhIGxpdmUgcmFuZ2UuIENoZWNrIGlmIHRoZSBwcmV2aW91cyBsaXZlIHJhbmdlIGVuZHMKKyAgLy8gYXQgSS0xLgorICBpZiAociA9PSByYW5nZXMuYmVnaW4oKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiByLT5lbmQgPT0gSTsKK30KKworLy8vIGtpbGxlZEF0IC0gUmV0dXJuIHRydWUgaWYgYSBsaXZlIHJhbmdlIGVuZHMgYXQgaW5kZXguIE5vdGUgdGhhdCB0aGUga2lsbAorLy8vIHBvaW50IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGhhbGYtb3BlbiBsaXZlIHJhbmdlLiBJdCBpcyB1c3VhbGx5IHRoZQorLy8vIGdldERlZkluZGV4KCkgc2xvdCBmb2xsb3dpbmcgaXRzIGxhc3QgdXNlLgorYm9vbCBMaXZlSW50ZXJ2YWw6OmtpbGxlZEF0KFNsb3RJbmRleCBJKSBjb25zdCB7CisgIFJhbmdlczo6Y29uc3RfaXRlcmF0b3IgciA9IHN0ZDo6bG93ZXJfYm91bmQocmFuZ2VzLmJlZ2luKCksIHJhbmdlcy5lbmQoKSwgSSk7CisKKyAgLy8gTm93IHIgcG9pbnRzIHRvIHRoZSBmaXJzdCBpbnRlcnZhbCB3aXRoIHN0YXJ0ID49IEksIG9yIHJhbmdlcy5lbmQoKS4KKyAgaWYgKHIgPT0gcmFuZ2VzLmJlZ2luKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC0tcjsKKyAgLy8gTm93IHIgcG9pbnRzIHRvIHRoZSBsYXN0IGludGVydmFsIHdpdGggZW5kIDw9IEkuCisgIC8vIHItPmVuZCBpcyB0aGUga2lsbCBwb2ludC4KKyAgcmV0dXJuIHItPmVuZCA9PSBJOworfQorCisvLy8ga2lsbGVkSW5SYW5nZSAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnRlcnZhbCBoYXMga2lsbHMgaW4gW1N0YXJ0LEVuZCkuCitib29sIExpdmVJbnRlcnZhbDo6a2lsbGVkSW5SYW5nZShTbG90SW5kZXggU3RhcnQsIFNsb3RJbmRleCBFbmQpIGNvbnN0IHsKKyAgUmFuZ2VzOjpjb25zdF9pdGVyYXRvciByID0KKyAgICBzdGQ6Omxvd2VyX2JvdW5kKHJhbmdlcy5iZWdpbigpLCByYW5nZXMuZW5kKCksIEVuZCk7CisKKyAgLy8gTm93IHIgcG9pbnRzIHRvIHRoZSBmaXJzdCBpbnRlcnZhbCB3aXRoIHN0YXJ0ID49IEVuZCwgb3IgcmFuZ2VzLmVuZCgpLgorICBpZiAociA9PSByYW5nZXMuYmVnaW4oKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLS1yOworICAvLyBOb3cgciBwb2ludHMgdG8gdGhlIGxhc3QgaW50ZXJ2YWwgd2l0aCBlbmQgPD0gRW5kLgorICAvLyByLT5lbmQgaXMgdGhlIGtpbGwgcG9pbnQuCisgIHJldHVybiByLT5lbmQgPj0gU3RhcnQgJiYgci0+ZW5kIDwgRW5kOworfQorCisvLyBvdmVybGFwcyAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaXZlIGludGVydmFscyBpcworLy8gbm90IGVtcHR5LgorLy8KKy8vIEFuIGV4YW1wbGUgZm9yIG92ZXJsYXBzKCk6CisvLworLy8gMDogQSA9IC4uLgorLy8gNDogQiA9IC4uLgorLy8gODogQyA9IEEgKyBCIDs7IGxhc3QgdXNlIG9mIEEKKy8vCisvLyBUaGUgbGl2ZSBpbnRlcnZhbHMgc2hvdWxkIGxvb2sgbGlrZToKKy8vCisvLyBBID0gWzMsIDExKQorLy8gQiA9IFs3LCB4KQorLy8gQyA9IFsxMSwgeSkKKy8vCisvLyBBLT5vdmVybGFwcyhDKSBzaG91bGQgcmV0dXJuIGZhbHNlIHNpbmNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBqb2luCisvLyBBIGFuZCBDLgorLy8KK2Jvb2wgTGl2ZUludGVydmFsOjpvdmVybGFwc0Zyb20oY29uc3QgTGl2ZUludGVydmFsJiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgU3RhcnRQb3MpIGNvbnN0IHsKKyAgYXNzZXJ0KCFlbXB0eSgpICYmICJlbXB0eSBpbnRlcnZhbCIpOworICBjb25zdF9pdGVyYXRvciBpID0gYmVnaW4oKTsKKyAgY29uc3RfaXRlcmF0b3IgaWUgPSBlbmQoKTsKKyAgY29uc3RfaXRlcmF0b3IgaiA9IFN0YXJ0UG9zOworICBjb25zdF9pdGVyYXRvciBqZSA9IG90aGVyLmVuZCgpOworCisgIGFzc2VydCgoU3RhcnRQb3MtPnN0YXJ0IDw9IGktPnN0YXJ0IHx8IFN0YXJ0UG9zID09IG90aGVyLmJlZ2luKCkpICYmCisgICAgICAgICBTdGFydFBvcyAhPSBvdGhlci5lbmQoKSAmJiAiQm9ndXMgc3RhcnQgcG9zaXRpb24gaGludCEiKTsKKworICBpZiAoaS0+c3RhcnQgPCBqLT5zdGFydCkgeworICAgIGkgPSBzdGQ6OnVwcGVyX2JvdW5kKGksIGllLCBqLT5zdGFydCk7CisgICAgaWYgKGkgIT0gcmFuZ2VzLmJlZ2luKCkpIC0taTsKKyAgfSBlbHNlIGlmIChqLT5zdGFydCA8IGktPnN0YXJ0KSB7CisgICAgKytTdGFydFBvczsKKyAgICBpZiAoU3RhcnRQb3MgIT0gb3RoZXIuZW5kKCkgJiYgU3RhcnRQb3MtPnN0YXJ0IDw9IGktPnN0YXJ0KSB7CisgICAgICBhc3NlcnQoU3RhcnRQb3MgPCBvdGhlci5lbmQoKSAmJiBpIDwgZW5kKCkpOworICAgICAgaiA9IHN0ZDo6dXBwZXJfYm91bmQoaiwgamUsIGktPnN0YXJ0KTsKKyAgICAgIGlmIChqICE9IG90aGVyLnJhbmdlcy5iZWdpbigpKSAtLWo7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKGogPT0gamUpIHJldHVybiBmYWxzZTsKKworICB3aGlsZSAoaSAhPSBpZSkgeworICAgIGlmIChpLT5zdGFydCA+IGotPnN0YXJ0KSB7CisgICAgICBzdGQ6OnN3YXAoaSwgaik7CisgICAgICBzdGQ6OnN3YXAoaWUsIGplKTsKKyAgICB9CisKKyAgICBpZiAoaS0+ZW5kID4gai0+c3RhcnQpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICArK2k7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBvdmVybGFwcyAtIFJldHVybiB0cnVlIGlmIHRoZSBsaXZlIGludGVydmFsIG92ZXJsYXBzIGEgcmFuZ2Ugc3BlY2lmaWVkCisvLy8gYnkgW1N0YXJ0LCBFbmQpLgorYm9vbCBMaXZlSW50ZXJ2YWw6Om92ZXJsYXBzKFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCkgY29uc3QgeworICBhc3NlcnQoU3RhcnQgPCBFbmQgJiYgIkludmFsaWQgcmFuZ2UiKTsKKyAgY29uc3RfaXRlcmF0b3IgSSA9IHN0ZDo6bG93ZXJfYm91bmQoYmVnaW4oKSwgZW5kKCksIEVuZCk7CisgIHJldHVybiBJICE9IGJlZ2luKCkgJiYgKC0tSSktPmVuZCA+IFN0YXJ0OworfQorCisKKy8vLyBWYWxObyBpcyBkZWFkLCByZW1vdmUgaXQuICBJZiBpdCBpcyB0aGUgbGFyZ2VzdCB2YWx1ZSBudW1iZXIsIGp1c3QgbnVrZSBpdAorLy8vIChhbmQgYW55IG90aGVyIGRlbGV0ZWQgdmFsdWVzIG5laWdoYm9yaW5nIGl0KSwgb3RoZXJ3aXNlIG1hcmsgaXQgYXMgfjFVIHNvCisvLy8gaXQgY2FuIGJlIG51a2VkIGxhdGVyLgordm9pZCBMaXZlSW50ZXJ2YWw6Om1hcmtWYWxOb0ZvckRlbGV0aW9uKFZOSW5mbyAqVmFsTm8pIHsKKyAgaWYgKFZhbE5vLT5pZCA9PSBnZXROdW1WYWxOdW1zKCktMSkgeworICAgIGRvIHsKKyAgICAgIHZhbG5vcy5wb3BfYmFjaygpOworICAgIH0gd2hpbGUgKCF2YWxub3MuZW1wdHkoKSAmJiB2YWxub3MuYmFjaygpLT5pc1VudXNlZCgpKTsKKyAgfSBlbHNlIHsKKyAgICBWYWxOby0+c2V0SXNVbnVzZWQodHJ1ZSk7CisgIH0KK30KKworLy8vIFJlbnVtYmVyVmFsdWVzIC0gUmVudW1iZXIgYWxsIHZhbHVlcyBpbiBvcmRlciBvZiBhcHBlYXJhbmNlIGFuZCBkZWxldGUgdGhlCisvLy8gcmVtYWluaW5nIHVudXNlZCB2YWx1ZXMuCit2b2lkIExpdmVJbnRlcnZhbDo6UmVudW1iZXJWYWx1ZXMoKSB7CisgIFNtYWxsUHRyU2V0PFZOSW5mbyosIDg+IFNlZW47CisgIHZhbG5vcy5jbGVhcigpOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgVk5JbmZvICpWTkkgPSBJLT52YWxubzsKKyAgICBpZiAoIVNlZW4uaW5zZXJ0KFZOSSkpCisgICAgICBjb250aW51ZTsKKyAgICBhc3NlcnQoIVZOSS0+aXNVbnVzZWQoKSAmJiAiVW51c2VkIHZhbG5vIHVzZWQgYnkgbGl2ZSByYW5nZSIpOworICAgIFZOSS0+aWQgPSAodW5zaWduZWQpdmFsbm9zLnNpemUoKTsKKyAgICB2YWxub3MucHVzaF9iYWNrKFZOSSk7CisgIH0KK30KKworLy8vIGV4dGVuZEludGVydmFsRW5kVG8gLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gd2Ugd2FudCB0byBleHRlbmQgdGhlIHJhbmdlCisvLy8gc3BlY2lmaWVkIGJ5IEkgdG8gZW5kIGF0IHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuICBUbyBkbyB0aGlzLCB3ZSBzaG91bGQKKy8vLyBtZXJnZSBhbmQgZWxpbWluYXRlIGFsbCByYW5nZXMgdGhhdCB0aGlzIHdpbGwgb3ZlcmxhcCB3aXRoLiAgVGhlIGl0ZXJhdG9yIGlzCisvLy8gbm90IGludmFsaWRhdGVkLgordm9pZCBMaXZlSW50ZXJ2YWw6OmV4dGVuZEludGVydmFsRW5kVG8oUmFuZ2VzOjppdGVyYXRvciBJLCBTbG90SW5kZXggTmV3RW5kKSB7CisgIGFzc2VydChJICE9IHJhbmdlcy5lbmQoKSAmJiAiTm90IGEgdmFsaWQgaW50ZXJ2YWwhIik7CisgIFZOSW5mbyAqVmFsTm8gPSBJLT52YWxubzsKKworICAvLyBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbnRlcnZhbCB0aGF0IHdlIGNhbid0IG1lcmdlIHdpdGguCisgIFJhbmdlczo6aXRlcmF0b3IgTWVyZ2VUbyA9IGxsdm06Om5leHQoSSk7CisgIGZvciAoOyBNZXJnZVRvICE9IHJhbmdlcy5lbmQoKSAmJiBOZXdFbmQgPj0gTWVyZ2VUby0+ZW5kOyArK01lcmdlVG8pIHsKKyAgICBhc3NlcnQoTWVyZ2VUby0+dmFsbm8gPT0gVmFsTm8gJiYgIkNhbm5vdCBtZXJnZSB3aXRoIGRpZmZlcmluZyB2YWx1ZXMhIik7CisgIH0KKworICAvLyBJZiBOZXdFbmQgd2FzIGluIHRoZSBtaWRkbGUgb2YgYW4gaW50ZXJ2YWwsIG1ha2Ugc3VyZSB0byBnZXQgaXRzIGVuZHBvaW50LgorICBJLT5lbmQgPSBzdGQ6Om1heChOZXdFbmQsIHByaW9yKE1lcmdlVG8pLT5lbmQpOworCisgIC8vIEVyYXNlIGFueSBkZWFkIHJhbmdlcy4KKyAgcmFuZ2VzLmVyYXNlKGxsdm06Om5leHQoSSksIE1lcmdlVG8pOworCisgIC8vIElmIHRoZSBuZXdseSBmb3JtZWQgcmFuZ2Ugbm93IHRvdWNoZXMgdGhlIHJhbmdlIGFmdGVyIGl0IGFuZCBpZiB0aGV5IGhhdmUKKyAgLy8gdGhlIHNhbWUgdmFsdWUgbnVtYmVyLCBtZXJnZSB0aGUgdHdvIHJhbmdlcyBpbnRvIG9uZSByYW5nZS4KKyAgUmFuZ2VzOjppdGVyYXRvciBOZXh0ID0gbGx2bTo6bmV4dChJKTsKKyAgaWYgKE5leHQgIT0gcmFuZ2VzLmVuZCgpICYmIE5leHQtPnN0YXJ0IDw9IEktPmVuZCAmJiBOZXh0LT52YWxubyA9PSBWYWxObykgeworICAgIEktPmVuZCA9IE5leHQtPmVuZDsKKyAgICByYW5nZXMuZXJhc2UoTmV4dCk7CisgIH0KK30KKworCisvLy8gZXh0ZW5kSW50ZXJ2YWxTdGFydFRvIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIHdlIHdhbnQgdG8gZXh0ZW5kIHRoZSByYW5nZQorLy8vIHNwZWNpZmllZCBieSBJIHRvIHN0YXJ0IGF0IHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuICBUbyBkbyB0aGlzLCB3ZSBzaG91bGQKKy8vLyBtZXJnZSBhbmQgZWxpbWluYXRlIGFsbCByYW5nZXMgdGhhdCB0aGlzIHdpbGwgb3ZlcmxhcCB3aXRoLgorTGl2ZUludGVydmFsOjpSYW5nZXM6Oml0ZXJhdG9yCitMaXZlSW50ZXJ2YWw6OmV4dGVuZEludGVydmFsU3RhcnRUbyhSYW5nZXM6Oml0ZXJhdG9yIEksIFNsb3RJbmRleCBOZXdTdGFydCkgeworICBhc3NlcnQoSSAhPSByYW5nZXMuZW5kKCkgJiYgIk5vdCBhIHZhbGlkIGludGVydmFsISIpOworICBWTkluZm8gKlZhbE5vID0gSS0+dmFsbm87CisKKyAgLy8gU2VhcmNoIGZvciB0aGUgZmlyc3QgaW50ZXJ2YWwgdGhhdCB3ZSBjYW4ndCBtZXJnZSB3aXRoLgorICBSYW5nZXM6Oml0ZXJhdG9yIE1lcmdlVG8gPSBJOworICBkbyB7CisgICAgaWYgKE1lcmdlVG8gPT0gcmFuZ2VzLmJlZ2luKCkpIHsKKyAgICAgIEktPnN0YXJ0ID0gTmV3U3RhcnQ7CisgICAgICByYW5nZXMuZXJhc2UoTWVyZ2VUbywgSSk7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisgICAgYXNzZXJ0KE1lcmdlVG8tPnZhbG5vID09IFZhbE5vICYmICJDYW5ub3QgbWVyZ2Ugd2l0aCBkaWZmZXJpbmcgdmFsdWVzISIpOworICAgIC0tTWVyZ2VUbzsKKyAgfSB3aGlsZSAoTmV3U3RhcnQgPD0gTWVyZ2VUby0+c3RhcnQpOworCisgIC8vIElmIHdlIHN0YXJ0IGluIHRoZSBtaWRkbGUgb2YgYW5vdGhlciBpbnRlcnZhbCwganVzdCBkZWxldGUgYSByYW5nZSBhbmQKKyAgLy8gZXh0ZW5kIHRoYXQgaW50ZXJ2YWwuCisgIGlmIChNZXJnZVRvLT5lbmQgPj0gTmV3U3RhcnQgJiYgTWVyZ2VUby0+dmFsbm8gPT0gVmFsTm8pIHsKKyAgICBNZXJnZVRvLT5lbmQgPSBJLT5lbmQ7CisgIH0gZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlLCBleHRlbmQgdGhlIGludGVydmFsIHJpZ2h0IGFmdGVyLgorICAgICsrTWVyZ2VUbzsKKyAgICBNZXJnZVRvLT5zdGFydCA9IE5ld1N0YXJ0OworICAgIE1lcmdlVG8tPmVuZCA9IEktPmVuZDsKKyAgfQorCisgIHJhbmdlcy5lcmFzZShsbHZtOjpuZXh0KE1lcmdlVG8pLCBsbHZtOjpuZXh0KEkpKTsKKyAgcmV0dXJuIE1lcmdlVG87Cit9CisKK0xpdmVJbnRlcnZhbDo6aXRlcmF0b3IKK0xpdmVJbnRlcnZhbDo6YWRkUmFuZ2VGcm9tKExpdmVSYW5nZSBMUiwgaXRlcmF0b3IgRnJvbSkgeworICBTbG90SW5kZXggU3RhcnQgPSBMUi5zdGFydCwgRW5kID0gTFIuZW5kOworICBpdGVyYXRvciBpdCA9IHN0ZDo6dXBwZXJfYm91bmQoRnJvbSwgcmFuZ2VzLmVuZCgpLCBTdGFydCk7CisKKyAgLy8gSWYgdGhlIGluc2VydGVkIGludGVydmFsIHN0YXJ0cyBpbiB0aGUgbWlkZGxlIG9yIHJpZ2h0IGF0IHRoZSBlbmQgb2YKKyAgLy8gYW5vdGhlciBpbnRlcnZhbCwganVzdCBleHRlbmQgdGhhdCBpbnRlcnZhbCB0byBjb250YWluIHRoZSByYW5nZSBvZiBMUi4KKyAgaWYgKGl0ICE9IHJhbmdlcy5iZWdpbigpKSB7CisgICAgaXRlcmF0b3IgQiA9IHByaW9yKGl0KTsKKyAgICBpZiAoTFIudmFsbm8gPT0gQi0+dmFsbm8pIHsKKyAgICAgIGlmIChCLT5zdGFydCA8PSBTdGFydCAmJiBCLT5lbmQgPj0gU3RhcnQpIHsKKyAgICAgICAgZXh0ZW5kSW50ZXJ2YWxFbmRUbyhCLCBFbmQpOworICAgICAgICByZXR1cm4gQjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBvdmVybGFwcGluZyB0d28gbGl2ZSByYW5nZXMgd2l0aAorICAgICAgLy8gZGlmZmVyZW50IHZhbG5vJ3MuCisgICAgICBhc3NlcnQoQi0+ZW5kIDw9IFN0YXJ0ICYmCisgICAgICAgICAgICAgIkNhbm5vdCBvdmVybGFwIHR3byBMaXZlUmFuZ2VzIHdpdGggZGlmZmVyaW5nIFZhbElEJ3MiCisgICAgICAgICAgICAgIiAoZGlkIHlvdSBkZWYgdGhlIHNhbWUgcmVnIHR3aWNlIGluIGEgTWFjaGluZUluc3RyPykiKTsKKyAgICB9CisgIH0KKworICAvLyBPdGhlcndpc2UsIGlmIHRoaXMgcmFuZ2UgZW5kcyBpbiB0aGUgbWlkZGxlIG9mLCBvciByaWdodCBuZXh0IHRvLCBhbm90aGVyCisgIC8vIGludGVydmFsLCBtZXJnZSBpdCBpbnRvIHRoYXQgaW50ZXJ2YWwuCisgIGlmIChpdCAhPSByYW5nZXMuZW5kKCkpIHsKKyAgICBpZiAoTFIudmFsbm8gPT0gaXQtPnZhbG5vKSB7CisgICAgICBpZiAoaXQtPnN0YXJ0IDw9IEVuZCkgeworICAgICAgICBpdCA9IGV4dGVuZEludGVydmFsU3RhcnRUbyhpdCwgU3RhcnQpOworCisgICAgICAgIC8vIElmIExSIGlzIGEgY29tcGxldGUgc3VwZXJzZXQgb2YgYW4gaW50ZXJ2YWwsIHdlIG1heSBuZWVkIHRvIGdyb3cgaXRzCisgICAgICAgIC8vIGVuZHBvaW50IGFzIHdlbGwuCisgICAgICAgIGlmIChFbmQgPiBpdC0+ZW5kKQorICAgICAgICAgIGV4dGVuZEludGVydmFsRW5kVG8oaXQsIEVuZCk7CisgICAgICAgIHJldHVybiBpdDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBvdmVybGFwcGluZyB0d28gbGl2ZSByYW5nZXMgd2l0aAorICAgICAgLy8gZGlmZmVyZW50IHZhbG5vJ3MuCisgICAgICBhc3NlcnQoaXQtPnN0YXJ0ID49IEVuZCAmJgorICAgICAgICAgICAgICJDYW5ub3Qgb3ZlcmxhcCB0d28gTGl2ZVJhbmdlcyB3aXRoIGRpZmZlcmluZyBWYWxJRCdzIik7CisgICAgfQorICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGp1c3QgYSBuZXcgcmFuZ2UgdGhhdCBkb2Vzbid0IGludGVyYWN0IHdpdGggYW55dGhpbmcuCisgIC8vIEluc2VydCBpdC4KKyAgcmV0dXJuIHJhbmdlcy5pbnNlcnQoaXQsIExSKTsKK30KKworLy8vIGlzSW5PbmVMaXZlUmFuZ2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGlzIGVudGlyZWx5IGluIAorLy8vIGEgc2luZ2xlIExpdmVSYW5nZSBvZiB0aGUgbGl2ZSBpbnRlcnZhbC4KK2Jvb2wgTGl2ZUludGVydmFsOjppc0luT25lTGl2ZVJhbmdlKFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCkgeworICBSYW5nZXM6Oml0ZXJhdG9yIEkgPSBzdGQ6OnVwcGVyX2JvdW5kKHJhbmdlcy5iZWdpbigpLCByYW5nZXMuZW5kKCksIFN0YXJ0KTsKKyAgaWYgKEkgPT0gcmFuZ2VzLmJlZ2luKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAtLUk7CisgIHJldHVybiBJLT5jb250YWluc1JhbmdlKFN0YXJ0LCBFbmQpOworfQorCisKKy8vLyByZW1vdmVSYW5nZSAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHJhbmdlIGZyb20gdGhpcyBpbnRlcnZhbC4gIE5vdGUgdGhhdAorLy8vIHRoZSByYW5nZSBtdXN0IGJlIGluIGEgc2luZ2xlIExpdmVSYW5nZSBpbiBpdHMgZW50aXJldHkuCit2b2lkIExpdmVJbnRlcnZhbDo6cmVtb3ZlUmFuZ2UoU2xvdEluZGV4IFN0YXJ0LCBTbG90SW5kZXggRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVtb3ZlRGVhZFZhbE5vKSB7CisgIC8vIEZpbmQgdGhlIExpdmVSYW5nZSBjb250YWluaW5nIHRoaXMgc3Bhbi4KKyAgUmFuZ2VzOjppdGVyYXRvciBJID0gc3RkOjp1cHBlcl9ib3VuZChyYW5nZXMuYmVnaW4oKSwgcmFuZ2VzLmVuZCgpLCBTdGFydCk7CisgIGFzc2VydChJICE9IHJhbmdlcy5iZWdpbigpICYmICJSYW5nZSBpcyBub3QgaW4gaW50ZXJ2YWwhIik7CisgIC0tSTsKKyAgYXNzZXJ0KEktPmNvbnRhaW5zUmFuZ2UoU3RhcnQsIEVuZCkgJiYgIlJhbmdlIGlzIG5vdCBlbnRpcmVseSBpbiBpbnRlcnZhbCEiKTsKKworICAvLyBJZiB0aGUgc3BhbiB3ZSBhcmUgcmVtb3ZpbmcgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBMaXZlUmFuZ2UsIGFkanVzdCBpdC4KKyAgVk5JbmZvICpWYWxObyA9IEktPnZhbG5vOworICBpZiAoSS0+c3RhcnQgPT0gU3RhcnQpIHsKKyAgICBpZiAoSS0+ZW5kID09IEVuZCkgeworICAgICAgaWYgKFJlbW92ZURlYWRWYWxObykgeworICAgICAgICAvLyBDaGVjayBpZiB2YWwjIGlzIGRlYWQuCisgICAgICAgIGJvb2wgaXNEZWFkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChjb25zdF9pdGVyYXRvciBJSSA9IGJlZ2luKCksIEVFID0gZW5kKCk7IElJICE9IEVFOyArK0lJKQorICAgICAgICAgIGlmIChJSSAhPSBJICYmIElJLT52YWxubyA9PSBWYWxObykgeworICAgICAgICAgICAgaXNEZWFkID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGlmIChpc0RlYWQpIHsKKyAgICAgICAgICAvLyBOb3cgdGhhdCBWYWxObyBpcyBkZWFkLCByZW1vdmUgaXQuCisgICAgICAgICAgbWFya1ZhbE5vRm9yRGVsZXRpb24oVmFsTm8pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJhbmdlcy5lcmFzZShJKTsgIC8vIFJlbW92ZWQgdGhlIHdob2xlIExpdmVSYW5nZS4KKyAgICB9IGVsc2UKKyAgICAgIEktPnN0YXJ0ID0gRW5kOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE90aGVyd2lzZSBpZiB0aGUgc3BhbiB3ZSBhcmUgcmVtb3ZpbmcgaXMgYXQgdGhlIGVuZCBvZiB0aGUgTGl2ZVJhbmdlLAorICAvLyBhZGp1c3QgdGhlIG90aGVyIHdheS4KKyAgaWYgKEktPmVuZCA9PSBFbmQpIHsKKyAgICBJLT5lbmQgPSBTdGFydDsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBPdGhlcndpc2UsIHdlIGFyZSBzcGxpdHRpbmcgdGhlIExpdmVSYW5nZSBpbnRvIHR3byBwaWVjZXMuCisgIFNsb3RJbmRleCBPbGRFbmQgPSBJLT5lbmQ7CisgIEktPmVuZCA9IFN0YXJ0OyAgIC8vIFRyaW0gdGhlIG9sZCBpbnRlcnZhbC4KKworICAvLyBJbnNlcnQgdGhlIG5ldyBvbmUuCisgIHJhbmdlcy5pbnNlcnQobGx2bTo6bmV4dChJKSwgTGl2ZVJhbmdlKEVuZCwgT2xkRW5kLCBWYWxObykpOworfQorCisvLy8gcmVtb3ZlVmFsTm8gLSBSZW1vdmUgYWxsIHRoZSByYW5nZXMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlIy4KKy8vLyBBbHNvIHJlbW92ZSB0aGUgdmFsdWUjIGZyb20gdmFsdWUjIGxpc3QuCit2b2lkIExpdmVJbnRlcnZhbDo6cmVtb3ZlVmFsTm8oVk5JbmZvICpWYWxObykgeworICBpZiAoZW1wdHkoKSkgcmV0dXJuOworICBSYW5nZXM6Oml0ZXJhdG9yIEkgPSByYW5nZXMuZW5kKCk7CisgIFJhbmdlczo6aXRlcmF0b3IgRSA9IHJhbmdlcy5iZWdpbigpOworICBkbyB7CisgICAgLS1JOworICAgIGlmIChJLT52YWxubyA9PSBWYWxObykKKyAgICAgIHJhbmdlcy5lcmFzZShJKTsKKyAgfSB3aGlsZSAoSSAhPSBFKTsKKyAgLy8gTm93IHRoYXQgVmFsTm8gaXMgZGVhZCwgcmVtb3ZlIGl0LgorICBtYXJrVmFsTm9Gb3JEZWxldGlvbihWYWxObyk7Cit9CisKKy8vLyBnZXRMaXZlUmFuZ2VDb250YWluaW5nIC0gUmV0dXJuIHRoZSBsaXZlIHJhbmdlIHRoYXQgY29udGFpbnMgdGhlCisvLy8gc3BlY2lmaWVkIGluZGV4LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCitMaXZlSW50ZXJ2YWw6OmNvbnN0X2l0ZXJhdG9yIAorTGl2ZUludGVydmFsOjpGaW5kTGl2ZVJhbmdlQ29udGFpbmluZyhTbG90SW5kZXggSWR4KSBjb25zdCB7CisgIGNvbnN0X2l0ZXJhdG9yIEl0ID0gc3RkOjp1cHBlcl9ib3VuZChiZWdpbigpLCBlbmQoKSwgSWR4KTsKKyAgaWYgKEl0ICE9IHJhbmdlcy5iZWdpbigpKSB7CisgICAgLS1JdDsKKyAgICBpZiAoSXQtPmNvbnRhaW5zKElkeCkpCisgICAgICByZXR1cm4gSXQ7CisgIH0KKworICByZXR1cm4gZW5kKCk7Cit9CisKK0xpdmVJbnRlcnZhbDo6aXRlcmF0b3IgCitMaXZlSW50ZXJ2YWw6OkZpbmRMaXZlUmFuZ2VDb250YWluaW5nKFNsb3RJbmRleCBJZHgpIHsKKyAgaXRlcmF0b3IgSXQgPSBzdGQ6OnVwcGVyX2JvdW5kKGJlZ2luKCksIGVuZCgpLCBJZHgpOworICBpZiAoSXQgIT0gYmVnaW4oKSkgeworICAgIC0tSXQ7CisgICAgaWYgKEl0LT5jb250YWlucyhJZHgpKQorICAgICAgcmV0dXJuIEl0OworICB9CisgIAorICByZXR1cm4gZW5kKCk7Cit9CisKKy8vLyBmaW5kRGVmaW5lZFZOSW5mbyAtIEZpbmQgdGhlIFZOSW5mbyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQKKy8vLyBpbmRleCAocmVnaXN0ZXIgaW50ZXJ2YWwpLgorVk5JbmZvICpMaXZlSW50ZXJ2YWw6OmZpbmREZWZpbmVkVk5JbmZvRm9yUmVnSW50KFNsb3RJbmRleCBJZHgpIGNvbnN0IHsKKyAgZm9yIChMaXZlSW50ZXJ2YWw6OmNvbnN0X3ZuaV9pdGVyYXRvciBpID0gdm5pX2JlZ2luKCksIGUgPSB2bmlfZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoKCppKS0+ZGVmID09IElkeCkKKyAgICAgIHJldHVybiAqaTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvLy8gZmluZERlZmluZWRWTkluZm8gLSBGaW5kIHRoZSBWTkluZm8gZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkCisvLy8gcmVnaXN0ZXIgKHN0YWNrIGludGV2YWwpLgorVk5JbmZvICpMaXZlSW50ZXJ2YWw6OmZpbmREZWZpbmVkVk5JbmZvRm9yU3RhY2tJbnQodW5zaWduZWQgcmVnKSBjb25zdCB7CisgIGZvciAoTGl2ZUludGVydmFsOjpjb25zdF92bmlfaXRlcmF0b3IgaSA9IHZuaV9iZWdpbigpLCBlID0gdm5pX2VuZCgpOworICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgaWYgKCgqaSktPmdldFJlZygpID09IHJlZykKKyAgICAgIHJldHVybiAqaTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGpvaW4gLSBKb2luIHR3byBsaXZlIGludGVydmFscyAodGhpcywgYW5kIG90aGVyKSB0b2dldGhlci4gIFRoaXMgYXBwbGllcworLy8vIG1hcHBpbmdzIHRvIHRoZSB2YWx1ZSBudW1iZXJzIGluIHRoZSBMSFMvUkhTIGludGVydmFscyBhcyBzcGVjaWZpZWQuICBJZgorLy8vIHRoZSBpbnRlcnZhbHMgYXJlIG5vdCBqb2luYWJsZSwgdGhpcyBhYm9ydHMuCit2b2lkIExpdmVJbnRlcnZhbDo6am9pbihMaXZlSW50ZXJ2YWwgJk90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpMSFNWYWxOb0Fzc2lnbm1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpSSFNWYWxOb0Fzc2lnbm1lbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPFZOSW5mbyosIDE2PiAmTmV3Vk5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJKSB7CisgIC8vIERldGVybWluZSBpZiBhbnkgb2Ygb3VyIGxpdmUgcmFuZ2UgdmFsdWVzIGFyZSBtYXBwZWQuICBUaGlzIGlzIHVuY29tbW9uLCBzbworICAvLyB3ZSB3YW50IHRvIGF2b2lkIHRoZSBpbnRlcnZhbCBzY2FuIGlmIG5vdC4gCisgIGJvb2wgTXVzdE1hcEN1clZhbE5vcyA9IGZhbHNlOworICB1bnNpZ25lZCBOdW1WYWxzID0gZ2V0TnVtVmFsTnVtcygpOworICB1bnNpZ25lZCBOdW1OZXdWYWxzID0gTmV3Vk5JbmZvLnNpemUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1WYWxzOyArK2kpIHsKKyAgICB1bnNpZ25lZCBMSFNWYWxJRCA9IExIU1ZhbE5vQXNzaWdubWVudHNbaV07CisgICAgaWYgKGkgIT0gTEhTVmFsSUQgfHwKKyAgICAgICAgKE5ld1ZOSW5mb1tMSFNWYWxJRF0gJiYgTmV3Vk5JbmZvW0xIU1ZhbElEXSAhPSBnZXRWYWxOdW1JbmZvKGkpKSkKKyAgICAgIE11c3RNYXBDdXJWYWxOb3MgPSB0cnVlOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSB0byBhcHBseSBhIG1hcHBpbmcgdG8gb3VyIGJhc2UgaW50ZXJ2YWwgYXNzaWdubWVudCwgcmV3cml0ZSBpdAorICAvLyBub3cuCisgIGlmIChNdXN0TWFwQ3VyVmFsTm9zKSB7CisgICAgLy8gTWFwIHRoZSBmaXJzdCBsaXZlIHJhbmdlLgorICAgIGl0ZXJhdG9yIE91dEl0ID0gYmVnaW4oKTsKKyAgICBPdXRJdC0+dmFsbm8gPSBOZXdWTkluZm9bTEhTVmFsTm9Bc3NpZ25tZW50c1tPdXRJdC0+dmFsbm8tPmlkXV07CisgICAgKytPdXRJdDsKKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBPdXRJdCwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgT3V0SXQtPnZhbG5vID0gTmV3Vk5JbmZvW0xIU1ZhbE5vQXNzaWdubWVudHNbSS0+dmFsbm8tPmlkXV07CisgICAgICAKKyAgICAgIC8vIElmIHRoaXMgbGl2ZSByYW5nZSBoYXMgdGhlIHNhbWUgdmFsdWUgIyBhcyBpdHMgaW1tZWRpYXRlIHByZWRlY2Vzc29yLAorICAgICAgLy8gYW5kIGlmIHRoZXkgYXJlIG5laWdoYm9ycywgcmVtb3ZlIG9uZSBMaXZlUmFuZ2UuICBUaGlzIGhhcHBlbnMgd2hlbiB3ZQorICAgICAgLy8gaGF2ZSBbMCwzOjApWzQsNzoxKSBhbmQgbWFwIDAvMSBvbnRvIHRoZSBzYW1lIHZhbHVlICMuCisgICAgICBpZiAoT3V0SXQtPnZhbG5vID09IChPdXRJdC0xKS0+dmFsbm8gJiYgKE91dEl0LTEpLT5lbmQgPT0gT3V0SXQtPnN0YXJ0KSB7CisgICAgICAgIChPdXRJdC0xKS0+ZW5kID0gT3V0SXQtPmVuZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChJICE9IE91dEl0KSB7CisgICAgICAgICAgT3V0SXQtPnN0YXJ0ID0gSS0+c3RhcnQ7CisgICAgICAgICAgT3V0SXQtPmVuZCA9IEktPmVuZDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRGlkbid0IG1lcmdlLCBvbiB0byB0aGUgbmV4dCBvbmUuCisgICAgICAgICsrT3V0SXQ7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIElmIHdlIG1lcmdlIHNvbWUgbGl2ZSByYW5nZXMsIGNob3Agb2ZmIHRoZSBlbmQuCisgICAgcmFuZ2VzLmVyYXNlKE91dEl0LCBlbmQoKSk7CisgIH0KKworICAvLyBSZW1lbWJlciBhc3NpZ25lbWVudHMgYmVjYXVzZSB2YWwjIGlkcyBhcmUgY2hhbmdpbmcuCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAxNj4gT3RoZXJBc3NpZ25tZW50czsKKyAgZm9yIChpdGVyYXRvciBJID0gT3RoZXIuYmVnaW4oKSwgRSA9IE90aGVyLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBPdGhlckFzc2lnbm1lbnRzLnB1c2hfYmFjayhSSFNWYWxOb0Fzc2lnbm1lbnRzW0ktPnZhbG5vLT5pZF0pOworCisgIC8vIFVwZGF0ZSB2YWwjIGluZm8uIFJlbnVtYmVyIHRoZW0gYW5kIG1ha2Ugc3VyZSB0aGV5IGFsbCBiZWxvbmcgdG8gdGhpcworICAvLyBMaXZlSW50ZXJ2YWwgbm93LiBBbHNvIHJlbW92ZSBkZWFkIHZhbCMncy4KKyAgdW5zaWduZWQgTnVtVmFsTm9zID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bU5ld1ZhbHM7ICsraSkgeworICAgIFZOSW5mbyAqVk5JID0gTmV3Vk5JbmZvW2ldOworICAgIGlmIChWTkkpIHsKKyAgICAgIGlmIChOdW1WYWxOb3MgPj0gTnVtVmFscykKKyAgICAgICAgdmFsbm9zLnB1c2hfYmFjayhWTkkpOworICAgICAgZWxzZSAKKyAgICAgICAgdmFsbm9zW051bVZhbE5vc10gPSBWTkk7CisgICAgICBWTkktPmlkID0gTnVtVmFsTm9zKys7ICAvLyBSZW51bWJlciB2YWwjLgorICAgIH0KKyAgfQorICBpZiAoTnVtTmV3VmFscyA8IE51bVZhbHMpCisgICAgdmFsbm9zLnJlc2l6ZShOdW1OZXdWYWxzKTsgIC8vIHNocmlua2lmeQorCisgIC8vIE9rYXksIG5vdyBpbnNlcnQgdGhlIFJIUyBsaXZlIHJhbmdlcyBpbnRvIHRoZSBMSFMuCisgIGl0ZXJhdG9yIEluc2VydFBvcyA9IGJlZ2luKCk7CisgIHVuc2lnbmVkIFJhbmdlTm8gPSAwOworICBmb3IgKGl0ZXJhdG9yIEkgPSBPdGhlci5iZWdpbigpLCBFID0gT3RoZXIuZW5kKCk7IEkgIT0gRTsgKytJLCArK1JhbmdlTm8pIHsKKyAgICAvLyBNYXAgdGhlIHZhbG5vIGluIHRoZSBvdGhlciBsaXZlIHJhbmdlIHRvIHRoZSBjdXJyZW50IGxpdmUgcmFuZ2UuCisgICAgSS0+dmFsbm8gPSBOZXdWTkluZm9bT3RoZXJBc3NpZ25tZW50c1tSYW5nZU5vXV07CisgICAgYXNzZXJ0KEktPnZhbG5vICYmICJBZGRpbmcgYSBkZWFkIHJhbmdlPyIpOworICAgIEluc2VydFBvcyA9IGFkZFJhbmdlRnJvbSgqSSwgSW5zZXJ0UG9zKTsKKyAgfQorCisgIENvbXB1dGVKb2luZWRXZWlnaHQoT3RoZXIpOworfQorCisvLy8gTWVyZ2VSYW5nZXNJbkFzVmFsdWUgLSBNZXJnZSBhbGwgb2YgdGhlIGludGVydmFscyBpbiBSSFMgaW50byB0aGlzIGxpdmUKKy8vLyBpbnRlcnZhbCBhcyB0aGUgc3BlY2lmaWVkIHZhbHVlIG51bWJlci4gIFRoZSBMaXZlUmFuZ2VzIGluIFJIUyBhcmUKKy8vLyBhbGxvd2VkIHRvIG92ZXJsYXAgd2l0aCBMaXZlUmFuZ2VzIGluIHRoZSBjdXJyZW50IGludGVydmFsLCBidXQgb25seSBpZgorLy8vIHRoZSBvdmVybGFwcGluZyBMaXZlUmFuZ2VzIGhhdmUgdGhlIHNwZWNpZmllZCB2YWx1ZSBudW1iZXIuCit2b2lkIExpdmVJbnRlcnZhbDo6TWVyZ2VSYW5nZXNJbkFzVmFsdWUoY29uc3QgTGl2ZUludGVydmFsICZSSFMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOSW5mbyAqTEhTVmFsTm8pIHsKKyAgLy8gVE9ETzogTWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50LgorICBpdGVyYXRvciBJbnNlcnRQb3MgPSBiZWdpbigpOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBSSFMuYmVnaW4oKSwgRSA9IFJIUy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAvLyBNYXAgdGhlIHZhbG5vIGluIHRoZSBvdGhlciBsaXZlIHJhbmdlIHRvIHRoZSBjdXJyZW50IGxpdmUgcmFuZ2UuCisgICAgTGl2ZVJhbmdlIFRtcCA9ICpJOworICAgIFRtcC52YWxubyA9IExIU1ZhbE5vOworICAgIEluc2VydFBvcyA9IGFkZFJhbmdlRnJvbShUbXAsIEluc2VydFBvcyk7CisgIH0KK30KKworCisvLy8gTWVyZ2VWYWx1ZUluQXNWYWx1ZSAtIE1lcmdlIGFsbCBvZiB0aGUgbGl2ZSByYW5nZXMgb2YgYSBzcGVjaWZpYyB2YWwjCisvLy8gaW4gUkhTIGludG8gdGhpcyBsaXZlIGludGVydmFsIGFzIHRoZSBzcGVjaWZpZWQgdmFsdWUgbnVtYmVyLgorLy8vIFRoZSBMaXZlUmFuZ2VzIGluIFJIUyBhcmUgYWxsb3dlZCB0byBvdmVybGFwIHdpdGggTGl2ZVJhbmdlcyBpbiB0aGUKKy8vLyBjdXJyZW50IGludGVydmFsLCBpdCB3aWxsIHJlcGxhY2UgdGhlIHZhbHVlIG51bWJlcnMgb2YgdGhlIG92ZXJsYXBlZAorLy8vIGxpdmUgcmFuZ2VzIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBudW1iZXIuCit2b2lkIExpdmVJbnRlcnZhbDo6TWVyZ2VWYWx1ZUluQXNWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpdmVJbnRlcnZhbCAmUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVk5JbmZvICpSSFNWYWxObywgVk5JbmZvICpMSFNWYWxObykgeworICBTbWFsbFZlY3RvcjxWTkluZm8qLCA0PiBSZXBsYWNlZFZhbE5vczsKKyAgaXRlcmF0b3IgSVAgPSBiZWdpbigpOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBSSFMuYmVnaW4oKSwgRSA9IFJIUy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+dmFsbm8gPT0gUkhTLmdldFZhbE51bUluZm8oSS0+dmFsbm8tPmlkKSAmJiAiQmFkIFZOSW5mbyIpOworICAgIGlmIChJLT52YWxubyAhPSBSSFNWYWxObykKKyAgICAgIGNvbnRpbnVlOworICAgIFNsb3RJbmRleCBTdGFydCA9IEktPnN0YXJ0LCBFbmQgPSBJLT5lbmQ7CisgICAgSVAgPSBzdGQ6OnVwcGVyX2JvdW5kKElQLCBlbmQoKSwgU3RhcnQpOworICAgIC8vIElmIHRoZSBzdGFydCBvZiB0aGlzIHJhbmdlIG92ZXJsYXBzIHdpdGggYW4gZXhpc3RpbmcgbGl2ZXJhbmdlLCB0cmltIGl0LgorICAgIGlmIChJUCAhPSBiZWdpbigpICYmIElQWy0xXS5lbmQgPiBTdGFydCkgeworICAgICAgaWYgKElQWy0xXS52YWxubyAhPSBMSFNWYWxObykgeworICAgICAgICBSZXBsYWNlZFZhbE5vcy5wdXNoX2JhY2soSVBbLTFdLnZhbG5vKTsKKyAgICAgICAgSVBbLTFdLnZhbG5vID0gTEhTVmFsTm87IC8vIFVwZGF0ZSB2YWwjLgorICAgICAgfQorICAgICAgU3RhcnQgPSBJUFstMV0uZW5kOworICAgICAgLy8gVHJpbW1lZCBhd2F5IHRoZSB3aG9sZSByYW5nZT8KKyAgICAgIGlmIChTdGFydCA+PSBFbmQpIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBJZiB0aGUgZW5kIG9mIHRoaXMgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBhbiBleGlzdGluZyBsaXZlcmFuZ2UsIHRyaW0gaXQuCisgICAgaWYgKElQICE9IGVuZCgpICYmIEVuZCA+IElQLT5zdGFydCkgeworICAgICAgaWYgKElQLT52YWxubyAhPSBMSFNWYWxObykgeworICAgICAgICBSZXBsYWNlZFZhbE5vcy5wdXNoX2JhY2soSVAtPnZhbG5vKTsKKyAgICAgICAgSVAtPnZhbG5vID0gTEhTVmFsTm87ICAvLyBVcGRhdGUgdmFsIy4KKyAgICAgIH0KKyAgICAgIEVuZCA9IElQLT5zdGFydDsKKyAgICAgIC8vIElmIHRoaXMgdHJpbW1lZCBhd2F5IHRoZSB3aG9sZSByYW5nZSwgaWdub3JlIGl0LgorICAgICAgaWYgKFN0YXJ0ID09IEVuZCkgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8vIE1hcCB0aGUgdmFsbm8gaW4gdGhlIG90aGVyIGxpdmUgcmFuZ2UgdG8gdGhlIGN1cnJlbnQgbGl2ZSByYW5nZS4KKyAgICBJUCA9IGFkZFJhbmdlRnJvbShMaXZlUmFuZ2UoU3RhcnQsIEVuZCwgTEhTVmFsTm8pLCBJUCk7CisgIH0KKworCisgIFNtYWxsU2V0PFZOSW5mbyosIDQ+IFNlZW47CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZXBsYWNlZFZhbE5vcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgVk5JbmZvICpWMSA9IFJlcGxhY2VkVmFsTm9zW2ldOworICAgIGlmIChTZWVuLmluc2VydChWMSkpIHsKKyAgICAgIGJvb2wgaXNEZWFkID0gdHJ1ZTsKKyAgICAgIGZvciAoY29uc3RfaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgIGlmIChJLT52YWxubyA9PSBWMSkgeworICAgICAgICAgIGlzRGVhZCA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9ICAgICAgICAgIAorICAgICAgaWYgKGlzRGVhZCkgeworICAgICAgICAvLyBOb3cgdGhhdCBWMSBpcyBkZWFkLCByZW1vdmUgaXQuCisgICAgICAgIG1hcmtWYWxOb0ZvckRlbGV0aW9uKFYxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvLy8gTWVyZ2VJbkNsb2JiZXJSYW5nZXMgLSBGb3IgYW55IGxpdmUgcmFuZ2VzIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIHRoZQorLy8vIGN1cnJlbnQgaW50ZXJ2YWwsIGJ1dCBhcmUgZGVmaW5lZCBpbiB0aGUgQ2xvYmJlcnMgaW50ZXJ2YWwsIG1hcmsgdGhlbQorLy8vIHVzZWQgd2l0aCBhbiB1bmtub3duIGRlZmluaXRpb24gdmFsdWUuCit2b2lkIExpdmVJbnRlcnZhbDo6TWVyZ2VJbkNsb2JiZXJSYW5nZXMoTGl2ZUludGVydmFscyAmbGlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpdmVJbnRlcnZhbCAmQ2xvYmJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk5JbmZvOjpBbGxvY2F0b3IgJlZOSW5mb0FsbG9jYXRvcikgeworICBpZiAoQ2xvYmJlcnMuZW1wdHkoKSkgcmV0dXJuOworICAKKyAgRGVuc2VNYXA8Vk5JbmZvKiwgVk5JbmZvKj4gVmFsTm9NYXBzOworICBWTkluZm8gKlVudXNlZFZhbE5vID0gMDsKKyAgaXRlcmF0b3IgSVAgPSBiZWdpbigpOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBDbG9iYmVycy5iZWdpbigpLCBFID0gQ2xvYmJlcnMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgLy8gRm9yIGV2ZXJ5IHZhbCMgaW4gdGhlIENsb2JiZXJzIGludGVydmFsLCBjcmVhdGUgYSBuZXcgInVua25vd24iIHZhbCMuCisgICAgVk5JbmZvICpDbG9iYmVyVmFsTm8gPSAwOworICAgIERlbnNlTWFwPFZOSW5mbyosIFZOSW5mbyo+OjppdGVyYXRvciBWSSA9IFZhbE5vTWFwcy5maW5kKEktPnZhbG5vKTsKKyAgICBpZiAoVkkgIT0gVmFsTm9NYXBzLmVuZCgpKQorICAgICAgQ2xvYmJlclZhbE5vID0gVkktPnNlY29uZDsKKyAgICBlbHNlIGlmIChVbnVzZWRWYWxObykKKyAgICAgIENsb2JiZXJWYWxObyA9IFVudXNlZFZhbE5vOworICAgIGVsc2UgeworICAgICAgVW51c2VkVmFsTm8gPSBDbG9iYmVyVmFsTm8gPQorICAgICAgICBnZXROZXh0VmFsdWUobGlfLmdldEludmFsaWRJbmRleCgpLCAwLCBmYWxzZSwgVk5JbmZvQWxsb2NhdG9yKTsKKyAgICAgIFZhbE5vTWFwcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSS0+dmFsbm8sIENsb2JiZXJWYWxObykpOworICAgIH0KKworICAgIGJvb2wgRG9uZSA9IGZhbHNlOworICAgIFNsb3RJbmRleCBTdGFydCA9IEktPnN0YXJ0LCBFbmQgPSBJLT5lbmQ7CisgICAgLy8gSWYgYSBjbG9iYmVyIHJhbmdlIHN0YXJ0cyBiZWZvcmUgYW4gZXhpc3RpbmcgcmFuZ2UgYW5kIGVuZHMgYWZ0ZXIKKyAgICAvLyBpdCwgdGhlIGNsb2JiZXIgcmFuZ2Ugd2lsbCBuZWVkIHRvIGJlIHNwbGl0IGludG8gbXVsdGlwbGUgcmFuZ2VzLgorICAgIC8vIExvb3AgdW50aWwgdGhlIGVudGlyZSBjbG9iYmVyIHJhbmdlIGlzIGhhbmRsZWQuCisgICAgd2hpbGUgKCFEb25lKSB7CisgICAgICBEb25lID0gdHJ1ZTsKKyAgICAgIElQID0gc3RkOjp1cHBlcl9ib3VuZChJUCwgZW5kKCksIFN0YXJ0KTsKKyAgICAgIFNsb3RJbmRleCBTdWJSYW5nZVN0YXJ0ID0gU3RhcnQ7CisgICAgICBTbG90SW5kZXggU3ViUmFuZ2VFbmQgPSBFbmQ7CisKKyAgICAgIC8vIElmIHRoZSBzdGFydCBvZiB0aGlzIHJhbmdlIG92ZXJsYXBzIHdpdGggYW4gZXhpc3RpbmcgbGl2ZXJhbmdlLCB0cmltIGl0LgorICAgICAgaWYgKElQICE9IGJlZ2luKCkgJiYgSVBbLTFdLmVuZCA+IFN1YlJhbmdlU3RhcnQpIHsKKyAgICAgICAgU3ViUmFuZ2VTdGFydCA9IElQWy0xXS5lbmQ7CisgICAgICAgIC8vIFRyaW1tZWQgYXdheSB0aGUgd2hvbGUgcmFuZ2U/CisgICAgICAgIGlmIChTdWJSYW5nZVN0YXJ0ID49IFN1YlJhbmdlRW5kKSBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIElmIHRoZSBlbmQgb2YgdGhpcyByYW5nZSBvdmVybGFwcyB3aXRoIGFuIGV4aXN0aW5nIGxpdmVyYW5nZSwgdHJpbSBpdC4KKyAgICAgIGlmIChJUCAhPSBlbmQoKSAmJiBTdWJSYW5nZUVuZCA+IElQLT5zdGFydCkgeworICAgICAgICAvLyBJZiB0aGUgY2xvYmJlciBsaXZlIHJhbmdlIGV4dGVuZHMgYmV5b25kIHRoZSBleGlzdGluZyBsaXZlIHJhbmdlLAorICAgICAgICAvLyBpdCdsbCBuZWVkIGF0IGxlYXN0IGFub3RoZXIgbGl2ZSByYW5nZSwgc28gc2V0IHRoZSBmbGFnIHRvIGtlZXAKKyAgICAgICAgLy8gaXRlcmF0aW5nLgorICAgICAgICBpZiAoU3ViUmFuZ2VFbmQgPiBJUC0+ZW5kKSB7CisgICAgICAgICAgU3RhcnQgPSBJUC0+ZW5kOworICAgICAgICAgIERvbmUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTdWJSYW5nZUVuZCA9IElQLT5zdGFydDsKKyAgICAgICAgLy8gSWYgdGhpcyB0cmltbWVkIGF3YXkgdGhlIHdob2xlIHJhbmdlLCBpZ25vcmUgaXQuCisgICAgICAgIGlmIChTdWJSYW5nZVN0YXJ0ID09IFN1YlJhbmdlRW5kKSBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gSW5zZXJ0IHRoZSBjbG9iYmVyIGludGVydmFsLgorICAgICAgSVAgPSBhZGRSYW5nZUZyb20oTGl2ZVJhbmdlKFN1YlJhbmdlU3RhcnQsIFN1YlJhbmdlRW5kLCBDbG9iYmVyVmFsTm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgSVApOworICAgICAgVW51c2VkVmFsTm8gPSAwOworICAgIH0KKyAgfQorCisgIGlmIChVbnVzZWRWYWxObykgeworICAgIC8vIERlbGV0ZSB0aGUgbGFzdCB1bnVzZWQgdmFsIy4KKyAgICB2YWxub3MucG9wX2JhY2soKTsKKyAgfQorfQorCit2b2lkIExpdmVJbnRlcnZhbDo6TWVyZ2VJbkNsb2JiZXJSYW5nZShMaXZlSW50ZXJ2YWxzICZsaV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk5JbmZvOjpBbGxvY2F0b3IgJlZOSW5mb0FsbG9jYXRvcikgeworICAvLyBGaW5kIGEgdmFsdWUgIyB0byB1c2UgZm9yIHRoZSBjbG9iYmVyIHJhbmdlcy4gIElmIHRoZXJlIGlzIGFscmVhZHkgYSB2YWx1ZSMKKyAgLy8gZm9yIHVua25vd24gdmFsdWVzLCB1c2UgaXQuCisgIFZOSW5mbyAqQ2xvYmJlclZhbE5vID0KKyAgICBnZXROZXh0VmFsdWUobGlfLmdldEludmFsaWRJbmRleCgpLCAwLCBmYWxzZSwgVk5JbmZvQWxsb2NhdG9yKTsKKyAgCisgIGl0ZXJhdG9yIElQID0gYmVnaW4oKTsKKyAgSVAgPSBzdGQ6OnVwcGVyX2JvdW5kKElQLCBlbmQoKSwgU3RhcnQpOworICAgIAorICAvLyBJZiB0aGUgc3RhcnQgb2YgdGhpcyByYW5nZSBvdmVybGFwcyB3aXRoIGFuIGV4aXN0aW5nIGxpdmVyYW5nZSwgdHJpbSBpdC4KKyAgaWYgKElQICE9IGJlZ2luKCkgJiYgSVBbLTFdLmVuZCA+IFN0YXJ0KSB7CisgICAgU3RhcnQgPSBJUFstMV0uZW5kOworICAgIC8vIFRyaW1tZWQgYXdheSB0aGUgd2hvbGUgcmFuZ2U/CisgICAgaWYgKFN0YXJ0ID49IEVuZCkgcmV0dXJuOworICB9CisgIC8vIElmIHRoZSBlbmQgb2YgdGhpcyByYW5nZSBvdmVybGFwcyB3aXRoIGFuIGV4aXN0aW5nIGxpdmVyYW5nZSwgdHJpbSBpdC4KKyAgaWYgKElQICE9IGVuZCgpICYmIEVuZCA+IElQLT5zdGFydCkgeworICAgIEVuZCA9IElQLT5zdGFydDsKKyAgICAvLyBJZiB0aGlzIHRyaW1tZWQgYXdheSB0aGUgd2hvbGUgcmFuZ2UsIGlnbm9yZSBpdC4KKyAgICBpZiAoU3RhcnQgPT0gRW5kKSByZXR1cm47CisgIH0KKyAgICAKKyAgLy8gSW5zZXJ0IHRoZSBjbG9iYmVyIGludGVydmFsLgorICBhZGRSYW5nZUZyb20oTGl2ZVJhbmdlKFN0YXJ0LCBFbmQsIENsb2JiZXJWYWxObyksIElQKTsKK30KKworLy8vIE1lcmdlVmFsdWVOdW1iZXJJbnRvIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdHdvIHZhbHVlIG51Ym1lcnMKKy8vLyBhcmUgZm91bmQgdG8gYmUgZXF1aXZhbGVudC4gIFRoaXMgZWxpbWluYXRlcyBWMSwgcmVwbGFjaW5nIGFsbAorLy8vIExpdmVSYW5nZXMgd2l0aCB0aGUgVjEgdmFsdWUgbnVtYmVyIHdpdGggdGhlIFYyIHZhbHVlIG51bWJlci4gIFRoaXMgY2FuCisvLy8gY2F1c2UgbWVyZ2luZyBvZiBWMS9WMiB2YWx1ZXMgbnVtYmVycyBhbmQgY29tcGFjdGlvbiBvZiB0aGUgdmFsdWUgc3BhY2UuCitWTkluZm8qIExpdmVJbnRlcnZhbDo6TWVyZ2VWYWx1ZU51bWJlckludG8oVk5JbmZvICpWMSwgVk5JbmZvICpWMikgeworICBhc3NlcnQoVjEgIT0gVjIgJiYgIklkZW50aWNhbCB2YWx1ZSMncyBhcmUgYWx3YXlzIGVxdWl2YWxlbnQhIik7CisKKyAgLy8gVGhpcyBjb2RlIGFjdHVhbGx5IG1lcmdlcyB0aGUgKG51bWVyaWNhbGx5KSBsYXJnZXIgdmFsdWUgbnVtYmVyIGludG8gdGhlCisgIC8vIHNtYWxsZXIgdmFsdWUgbnVtYmVyLCB3aGljaCBpcyBsaWtlbHkgdG8gYWxsb3cgdXMgdG8gY29tcGFjdGlmeSB0aGUgdmFsdWUKKyAgLy8gc3BhY2UuICBUaGUgb25seSB0aGluZyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgb2YgaXMgdG8gcHJlc2VydmUgdGhlCisgIC8vIGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgcmVzdWx0IHZhbHVlLgorCisgIC8vIE1ha2Ugc3VyZSBWMiBpcyBzbWFsbGVyIHRoYW4gVjEuCisgIGlmIChWMS0+aWQgPCBWMi0+aWQpIHsKKyAgICBWMS0+Y29weUZyb20oKlYyKTsKKyAgICBzdGQ6OnN3YXAoVjEsIFYyKTsKKyAgfQorCisgIC8vIE1lcmdlIFYxIGxpdmUgcmFuZ2VzIGludG8gVjIuCisgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCk7IEkgIT0gZW5kKCk7ICkgeworICAgIGl0ZXJhdG9yIExSID0gSSsrOworICAgIGlmIChMUi0+dmFsbm8gIT0gVjEpIGNvbnRpbnVlOyAgLy8gTm90IGEgVjEgTGl2ZVJhbmdlLgorICAgIAorICAgIC8vIE9rYXksIHdlIGZvdW5kIGEgVjEgbGl2ZSByYW5nZS4gIElmIGl0IGhhZCBhIHByZXZpb3VzLCB0b3VjaGluZywgVjIgbGl2ZQorICAgIC8vIHJhbmdlLCBleHRlbmQgaXQuCisgICAgaWYgKExSICE9IGJlZ2luKCkpIHsKKyAgICAgIGl0ZXJhdG9yIFByZXYgPSBMUi0xOworICAgICAgaWYgKFByZXYtPnZhbG5vID09IFYyICYmIFByZXYtPmVuZCA9PSBMUi0+c3RhcnQpIHsKKyAgICAgICAgUHJldi0+ZW5kID0gTFItPmVuZDsKKworICAgICAgICAvLyBFcmFzZSB0aGlzIGxpdmUtcmFuZ2UuCisgICAgICAgIHJhbmdlcy5lcmFzZShMUik7CisgICAgICAgIEkgPSBQcmV2KzE7CisgICAgICAgIExSID0gUHJldjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gT2theSwgbm93IHdlIGhhdmUgYSBWMSBvciBWMiBsaXZlIHJhbmdlIHRoYXQgaXMgbWF4aW1hbGx5IG1lcmdlZCBmb3J3YXJkLgorICAgIC8vIEVuc3VyZSB0aGF0IGl0IGlzIGEgVjIgbGl2ZS1yYW5nZS4KKyAgICBMUi0+dmFsbm8gPSBWMjsKKyAgICAKKyAgICAvLyBJZiB3ZSBjYW4gbWVyZ2UgaXQgaW50byBsYXRlciBWMiBsaXZlIHJhbmdlcywgZG8gc28gbm93LiAgV2UgaWdub3JlIGFueQorICAgIC8vIGZvbGxvd2luZyBWMSBsaXZlIHJhbmdlcywgYXMgdGhleSB3aWxsIGJlIG1lcmdlZCBpbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMKKyAgICAvLyBvZiB0aGUgbG9vcC4KKyAgICBpZiAoSSAhPSBlbmQoKSkgeworICAgICAgaWYgKEktPnN0YXJ0ID09IExSLT5lbmQgJiYgSS0+dmFsbm8gPT0gVjIpIHsKKyAgICAgICAgTFItPmVuZCA9IEktPmVuZDsKKyAgICAgICAgcmFuZ2VzLmVyYXNlKEkpOworICAgICAgICBJID0gTFIrMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIE5vdyB0aGF0IFYxIGlzIGRlYWQsIHJlbW92ZSBpdC4KKyAgbWFya1ZhbE5vRm9yRGVsZXRpb24oVjEpOworICAKKyAgcmV0dXJuIFYyOworfQorCit2b2lkIExpdmVJbnRlcnZhbDo6Q29weShjb25zdCBMaXZlSW50ZXJ2YWwgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZOSW5mbzo6QWxsb2NhdG9yICZWTkluZm9BbGxvY2F0b3IpIHsKKyAgcmFuZ2VzLmNsZWFyKCk7CisgIHZhbG5vcy5jbGVhcigpOworICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBIaW50ID0gTVJJLT5nZXRSZWdBbGxvY2F0aW9uSGludChSSFMucmVnKTsKKyAgTVJJLT5zZXRSZWdBbGxvY2F0aW9uSGludChyZWcsIEhpbnQuZmlyc3QsIEhpbnQuc2Vjb25kKTsKKworICB3ZWlnaHQgPSBSSFMud2VpZ2h0OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUkhTLmdldE51bVZhbE51bXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBWTkluZm8gKlZOSSA9IFJIUy5nZXRWYWxOdW1JbmZvKGkpOworICAgIGNyZWF0ZVZhbHVlQ29weShWTkksIFZOSW5mb0FsbG9jYXRvcik7CisgIH0KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJIUy5yYW5nZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IExpdmVSYW5nZSAmTFIgPSBSSFMucmFuZ2VzW2ldOworICAgIGFkZFJhbmdlKExpdmVSYW5nZShMUi5zdGFydCwgTFIuZW5kLCBnZXRWYWxOdW1JbmZvKExSLnZhbG5vLT5pZCkpKTsKKyAgfQorfQorCit1bnNpZ25lZCBMaXZlSW50ZXJ2YWw6OmdldFNpemUoKSBjb25zdCB7CisgIHVuc2lnbmVkIFN1bSA9IDA7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgU3VtICs9IEktPnN0YXJ0LmRpc3RhbmNlKEktPmVuZCk7CisgIHJldHVybiBTdW07Cit9CisKKy8vLyBDb21wdXRlSm9pbmVkV2VpZ2h0IC0gU2V0IHRoZSB3ZWlnaHQgb2YgYSBsaXZlIGludGVydmFsIEpvaW5lZAorLy8vIGFmdGVyIE90aGVyIGhhcyBiZWVuIG1lcmdlZCBpbnRvIGl0Lgordm9pZCBMaXZlSW50ZXJ2YWw6OkNvbXB1dGVKb2luZWRXZWlnaHQoY29uc3QgTGl2ZUludGVydmFsICZPdGhlcikgeworICAvLyBJZiBlaXRoZXIgb2YgdGhlc2UgaW50ZXJ2YWxzIHdhcyBzcGlsbGVkLCB0aGUgd2VpZ2h0IGlzIHRoZQorICAvLyB3ZWlnaHQgb2YgdGhlIG5vbi1zcGlsbGVkIGludGVydmFsLiAgVGhpcyBjYW4gb25seSBoYXBwZW4gd2l0aAorICAvLyBpdGVyYXRpdmUgY29hbGVzY2Vycy4KKworICBpZiAoT3RoZXIud2VpZ2h0ICE9IEhVR0VfVkFMRikgeworICAgIHdlaWdodCArPSBPdGhlci53ZWlnaHQ7CisgIH0KKyAgZWxzZSBpZiAod2VpZ2h0ID09IEhVR0VfVkFMRiAmJgorICAgICAgIVRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKHJlZykpIHsKKyAgICAvLyBSZW1vdmUgdGhpcyBhc3NlcnQgaWYgeW91IGhhdmUgYW4gaXRlcmF0aXZlIGNvYWxlc2NlcgorICAgIGFzc2VydCgwICYmICJKb2luaW5nIHRvIHNwaWxsZWQgaW50ZXJ2YWwiKTsKKyAgICB3ZWlnaHQgPSBPdGhlci53ZWlnaHQ7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlIHRoZSB3ZWlnaHQgc3RheXMgdGhlIHNhbWUKKyAgICAvLyBSZW1vdmUgdGhpcyBhc3NlcnQgaWYgeW91IGhhdmUgYW4gaXRlcmF0aXZlIGNvYWxlc2NlcgorICAgIGFzc2VydCgwICYmICJKb2luaW5nIGZyb20gc3BpbGxlZCBpbnRlcnZhbCIpOworICB9Cit9CisKK3Jhd19vc3RyZWFtJiBsbHZtOjpvcGVyYXRvcjw8KHJhd19vc3RyZWFtJiBvcywgY29uc3QgTGl2ZVJhbmdlICZMUikgeworICByZXR1cm4gb3MgPDwgJ1snIDw8IExSLnN0YXJ0IDw8ICcsJyA8PCBMUi5lbmQgPDwgJzonIDw8IExSLnZhbG5vLT5pZCA8PCAiKSI7Cit9CisKK3ZvaWQgTGl2ZVJhbmdlOjpkdW1wKCkgY29uc3QgeworICBkYmdzKCkgPDwgKnRoaXMgPDwgIlxuIjsKK30KKwordm9pZCBMaXZlSW50ZXJ2YWw6OnByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgaWYgKGlzU3RhY2tTbG90KCkpCisgICAgT1MgPDwgIlNTIyIgPDwgZ2V0U3RhY2tTbG90SW5kZXgoKTsKKyAgZWxzZSBpZiAoVFJJICYmIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKHJlZykpCisgICAgT1MgPDwgVFJJLT5nZXROYW1lKHJlZyk7CisgIGVsc2UKKyAgICBPUyA8PCAiJXJlZyIgPDwgcmVnOworCisgIE9TIDw8ICcsJyA8PCB3ZWlnaHQ7CisKKyAgaWYgKGVtcHR5KCkpCisgICAgT1MgPDwgIiBFTVBUWSI7CisgIGVsc2UgeworICAgIE9TIDw8ICIgPSAiOworICAgIGZvciAoTGl2ZUludGVydmFsOjpSYW5nZXM6OmNvbnN0X2l0ZXJhdG9yIEkgPSByYW5nZXMuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IHJhbmdlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIE9TIDw8ICpJOworICAgICAgYXNzZXJ0KEktPnZhbG5vID09IGdldFZhbE51bUluZm8oSS0+dmFsbm8tPmlkKSAmJiAiQmFkIFZOSW5mbyIpOworICAgIH0KKyAgfQorCisgIC8vIFByaW50IHZhbHVlIG51bWJlciBpbmZvLgorICBpZiAoZ2V0TnVtVmFsTnVtcygpKSB7CisgICAgT1MgPDwgIiAgIjsKKyAgICB1bnNpZ25lZCB2bnVtID0gMDsKKyAgICBmb3IgKGNvbnN0X3ZuaV9pdGVyYXRvciBpID0gdm5pX2JlZ2luKCksIGUgPSB2bmlfZW5kKCk7IGkgIT0gZTsKKyAgICAgICAgICsraSwgKyt2bnVtKSB7CisgICAgICBjb25zdCBWTkluZm8gKnZuaSA9ICppOworICAgICAgaWYgKHZudW0pIE9TIDw8ICIgIjsKKyAgICAgIE9TIDw8IHZudW0gPDwgIkAiOworICAgICAgaWYgKHZuaS0+aXNVbnVzZWQoKSkgeworICAgICAgICBPUyA8PCAieCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXZuaS0+aXNEZWZBY2N1cmF0ZSgpICYmICF2bmktPmlzUEhJRGVmKCkpCisgICAgICAgICAgT1MgPDwgIj8iOworICAgICAgICBlbHNlCisgICAgICAgICAgT1MgPDwgdm5pLT5kZWY7CisgICAgICAgIGlmICh2bmktPmhhc1BISUtpbGwoKSkKKyAgICAgICAgICBPUyA8PCAiLXBoaWtpbGwiOworICAgICAgICBpZiAodm5pLT5oYXNSZWRlZkJ5RUMoKSkKKyAgICAgICAgICBPUyA8PCAiLWVjIjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBMaXZlSW50ZXJ2YWw6OmR1bXAoKSBjb25zdCB7CisgIGRiZ3MoKSA8PCAqdGhpcyA8PCAiXG4iOworfQorCisKK3ZvaWQgTGl2ZVJhbmdlOjpwcmludChyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IHsKKyAgb3MgPDwgKnRoaXM7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3YzU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xpdmVJbnRlcnZhbEFuYWx5c2lzLmNwcApAQCAtMCwwICsxLDIwMDIgQEAKKy8vPT09LS0gTGl2ZUludGVydmFsQW5hbHlzaXMuY3BwIC0gTGl2ZSBJbnRlcnZhbCBBbmFseXNpcyAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExpdmVJbnRlcnZhbCBhbmFseXNpcyBwYXNzIHdoaWNoIGlzIHVzZWQKKy8vIGJ5IHRoZSBMaW5lYXIgU2NhbiBSZWdpc3RlciBhbGxvY2F0b3IuIFRoaXMgcGFzcyBsaW5lYXJpemVzIHRoZQorLy8gYmFzaWMgYmxvY2tzIG9mIHRoZSBmdW5jdGlvbiBpbiBERlMgb3JkZXIgYW5kIHVzZXMgdGhlCisvLyBMaXZlVmFyaWFibGVzIHBhc3MgdG8gY29uc2VydmF0aXZlbHkgY29tcHV0ZSBsaXZlIGludGVydmFscyBmb3IKKy8vIGVhY2ggdmlydHVhbCBhbmQgcGh5c2ljYWwgcmVnaXN0ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJsaXZlaW50ZXJ2YWxzIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5oIgorI2luY2x1ZGUgIlZpcnRSZWdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVWYXJpYWJsZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1lbU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHJvY2Vzc0ltcGxpY2l0RGVmcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8Y21hdGg+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gSGlkZGVuIG9wdGlvbnMgZm9yIGhlbHAgZGVidWdnaW5nLgorc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRGlzYWJsZVJlTWF0KCJkaXNhYmxlLXJlbWF0ZXJpYWxpemF0aW9uIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpLCBjbDo6SGlkZGVuKTsKKworU1RBVElTVElDKG51bUludGVydmFscyAsICJOdW1iZXIgb2Ygb3JpZ2luYWwgaW50ZXJ2YWxzIik7CitTVEFUSVNUSUMobnVtRm9sZHMgICAgICwgIk51bWJlciBvZiBsb2Fkcy9zdG9yZXMgZm9sZGVkIGludG8gaW5zdHJ1Y3Rpb25zIik7CitTVEFUSVNUSUMobnVtU3BsaXRzICAgICwgIk51bWJlciBvZiBpbnRlcnZhbHMgc3BsaXQiKTsKKworY2hhciBMaXZlSW50ZXJ2YWxzOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoTGl2ZUludGVydmFscywgImxpdmVpbnRlcnZhbHMiLAorICAgICAgICAgICAgICAgICJMaXZlIEludGVydmFsIEFuYWx5c2lzIiwgZmFsc2UsIGZhbHNlKTsKKwordm9pZCBMaXZlSW50ZXJ2YWxzOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgIEFVLnNldFByZXNlcnZlc0NGRygpOworICBBVS5hZGRSZXF1aXJlZDxBbGlhc0FuYWx5c2lzPigpOworICBBVS5hZGRQcmVzZXJ2ZWQ8QWxpYXNBbmFseXNpcz4oKTsKKyAgQVUuYWRkUHJlc2VydmVkPExpdmVWYXJpYWJsZXM+KCk7CisgIEFVLmFkZFJlcXVpcmVkPExpdmVWYXJpYWJsZXM+KCk7CisgIEFVLmFkZFByZXNlcnZlZElEKE1hY2hpbmVMb29wSW5mb0lEKTsKKyAgQVUuYWRkUHJlc2VydmVkSUQoTWFjaGluZURvbWluYXRvcnNJRCk7CisgIAorICBpZiAoIVN0cm9uZ1BISUVsaW0pIHsKKyAgICBBVS5hZGRQcmVzZXJ2ZWRJRChQSElFbGltaW5hdGlvbklEKTsKKyAgICBBVS5hZGRSZXF1aXJlZElEKFBISUVsaW1pbmF0aW9uSUQpOworICB9CisgIAorICBBVS5hZGRSZXF1aXJlZElEKFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3NJRCk7CisgIEFVLmFkZFByZXNlcnZlZDxQcm9jZXNzSW1wbGljaXREZWZzPigpOworICBBVS5hZGRSZXF1aXJlZDxQcm9jZXNzSW1wbGljaXREZWZzPigpOworICBBVS5hZGRQcmVzZXJ2ZWQ8U2xvdEluZGV4ZXM+KCk7CisgIEFVLmFkZFJlcXVpcmVkVHJhbnNpdGl2ZTxTbG90SW5kZXhlcz4oKTsKKyAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7Cit9CisKK3ZvaWQgTGl2ZUludGVydmFsczo6cmVsZWFzZU1lbW9yeSgpIHsKKyAgLy8gRnJlZSB0aGUgbGl2ZSBpbnRlcnZhbHMgdGhlbXNlbHZlcy4KKyAgZm9yIChEZW5zZU1hcDx1bnNpZ25lZCwgTGl2ZUludGVydmFsKj46Oml0ZXJhdG9yIEkgPSByMmlNYXBfLmJlZ2luKCksCisgICAgICAgRSA9IHIyaU1hcF8uZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGRlbGV0ZSBJLT5zZWNvbmQ7CisgIAorICByMmlNYXBfLmNsZWFyKCk7CisKKyAgLy8gUmVsZWFzZSBWTkluZm8gbWVtb3J5IHJlZ2lvbnMsIFZOSW5mbyBvYmplY3RzIGRvbid0IG5lZWQgdG8gYmUgZHRvcidkLgorICBWTkluZm9BbGxvY2F0b3IuUmVzZXQoKTsKKyAgd2hpbGUgKCFDbG9uZU1Jcy5lbXB0eSgpKSB7CisgICAgTWFjaGluZUluc3RyICpNSSA9IENsb25lTUlzLmJhY2soKTsKKyAgICBDbG9uZU1Jcy5wb3BfYmFjaygpOworICAgIG1mXy0+RGVsZXRlTWFjaGluZUluc3RyKE1JKTsKKyAgfQorfQorCisvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24gLSBSZWdpc3RlciBhbGxvY2F0ZSB0aGUgd2hvbGUgZnVuY3Rpb24KKy8vLworYm9vbCBMaXZlSW50ZXJ2YWxzOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJmZuKSB7CisgIG1mXyA9ICZmbjsKKyAgbXJpXyA9ICZtZl8tPmdldFJlZ0luZm8oKTsKKyAgdG1fID0gJmZuLmdldFRhcmdldCgpOworICB0cmlfID0gdG1fLT5nZXRSZWdpc3RlckluZm8oKTsKKyAgdGlpXyA9IHRtXy0+Z2V0SW5zdHJJbmZvKCk7CisgIGFhXyA9ICZnZXRBbmFseXNpczxBbGlhc0FuYWx5c2lzPigpOworICBsdl8gPSAmZ2V0QW5hbHlzaXM8TGl2ZVZhcmlhYmxlcz4oKTsKKyAgaW5kZXhlc18gPSAmZ2V0QW5hbHlzaXM8U2xvdEluZGV4ZXM+KCk7CisgIGFsbG9jYXRhYmxlUmVnc18gPSB0cmlfLT5nZXRBbGxvY2F0YWJsZVNldChmbik7CisKKyAgY29tcHV0ZUludGVydmFscygpOworCisgIG51bUludGVydmFscyArPSBnZXROdW1JbnRlcnZhbHMoKTsKKworICBERUJVRyhkdW1wKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIHByaW50IC0gSW1wbGVtZW50IHRoZSBkdW1wIG1ldGhvZC4KK3ZvaWQgTGl2ZUludGVydmFsczo6cHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUqICkgY29uc3QgeworICBPUyA8PCAiKioqKioqKioqKiBJTlRFUlZBTFMgKioqKioqKioqKlxuIjsKKyAgZm9yIChjb25zdF9pdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEktPnNlY29uZC0+cHJpbnQoT1MsIHRyaV8pOworICAgIE9TIDw8ICJcbiI7CisgIH0KKworICBwcmludEluc3RycyhPUyk7Cit9CisKK3ZvaWQgTGl2ZUludGVydmFsczo6cHJpbnRJbnN0cnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICIqKioqKioqKioqIE1BQ0hJTkVJTlNUUlMgKioqKioqKioqKlxuIjsKKworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgbWJiaSA9IG1mXy0+YmVnaW4oKSwgbWJiZSA9IG1mXy0+ZW5kKCk7CisgICAgICAgbWJiaSAhPSBtYmJlOyArK21iYmkpIHsKKyAgICBPUyA8PCAiQkIjIiA8PCBtYmJpLT5nZXROdW1iZXIoKQorICAgICAgIDw8ICI6XHRcdCMgZGVyaXZlZCBmcm9tICIgPDwgbWJiaS0+Z2V0TmFtZSgpIDw8ICJcbiI7CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgbWlpID0gbWJiaS0+YmVnaW4oKSwKKyAgICAgICAgICAgbWllID0gbWJiaS0+ZW5kKCk7IG1paSAhPSBtaWU7ICsrbWlpKSB7CisgICAgICBpZiAobWlpLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICAgT1MgPDwgIiAgICBcdCIgPDwgKm1paTsKKyAgICAgIGVsc2UKKyAgICAgICAgT1MgPDwgZ2V0SW5zdHJ1Y3Rpb25JbmRleChtaWkpIDw8ICdcdCcgPDwgKm1paTsKKyAgICB9CisgIH0KK30KKwordm9pZCBMaXZlSW50ZXJ2YWxzOjpkdW1wSW5zdHJzKCkgY29uc3QgeworICBwcmludEluc3RycyhkYmdzKCkpOworfQorCitib29sIExpdmVJbnRlcnZhbHM6OmNvbmZsaWN0c1dpdGhQaHlzUmVnKGNvbnN0IExpdmVJbnRlcnZhbCAmbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnRSZWdNYXAgJnZybSwgdW5zaWduZWQgcmVnKSB7CisgIC8vIFdlIGRvbid0IGhhbmRsZSBmYW5jeSBzdHVmZiBjcm9zc2luZyBiYXNpYyBibG9jayBib3VuZGFyaWVzCisgIGlmIChsaS5yYW5nZXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIHRydWU7CisgIGNvbnN0IExpdmVSYW5nZSAmcmFuZ2UgPSBsaS5yYW5nZXMuZnJvbnQoKTsKKyAgU2xvdEluZGV4IGlkeCA9IHJhbmdlLnN0YXJ0LmdldEJhc2VJbmRleCgpOworICBTbG90SW5kZXggZW5kID0gcmFuZ2UuZW5kLmdldFByZXZTbG90KCkuZ2V0QmFzZUluZGV4KCkuZ2V0TmV4dEluZGV4KCk7CisKKyAgLy8gU2tpcCBkZWxldGVkIGluc3RydWN0aW9ucworICBNYWNoaW5lSW5zdHIgKmZpcnN0TUkgPSBnZXRJbnN0cnVjdGlvbkZyb21JbmRleChpZHgpOworICB3aGlsZSAoIWZpcnN0TUkgJiYgaWR4ICE9IGVuZCkgeworICAgIGlkeCA9IGlkeC5nZXROZXh0SW5kZXgoKTsKKyAgICBmaXJzdE1JID0gZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoaWR4KTsKKyAgfQorICBpZiAoIWZpcnN0TUkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEZpbmQgbGFzdCBpbnN0cnVjdGlvbiBpbiByYW5nZQorICBTbG90SW5kZXggbGFzdElkeCA9IGVuZC5nZXRQcmV2SW5kZXgoKTsKKyAgTWFjaGluZUluc3RyICpsYXN0TUkgPSBnZXRJbnN0cnVjdGlvbkZyb21JbmRleChsYXN0SWR4KTsKKyAgd2hpbGUgKCFsYXN0TUkgJiYgbGFzdElkeCAhPSBpZHgpIHsKKyAgICBsYXN0SWR4ID0gbGFzdElkeC5nZXRQcmV2SW5kZXgoKTsKKyAgICBsYXN0TUkgPSBnZXRJbnN0cnVjdGlvbkZyb21JbmRleChsYXN0SWR4KTsKKyAgfQorICBpZiAoIWxhc3RNSSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gUmFuZ2UgY2Fubm90IGNyb3NzIGJhc2ljIGJsb2NrIGJvdW5kYXJpZXMgb3IgdGVybWluYXRvcnMKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IGZpcnN0TUktPmdldFBhcmVudCgpOworICBpZiAoTUJCICE9IGxhc3RNSS0+Z2V0UGFyZW50KCkgfHwgbGFzdE1JLT5nZXREZXNjKCkuaXNUZXJtaW5hdG9yKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEUgPSBsYXN0TUk7CisgICsrRTsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IGZpcnN0TUk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgTWFjaGluZUluc3RyICZNSSA9ICpJOworCisgICAgLy8gQWxsb3cgY29waWVzIHRvIGFuZCBmcm9tIGxpLnJlZworICAgIGlmIChNSS5pc0NvcHkoKSkKKyAgICAgIGlmIChNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpID09IGxpLnJlZyB8fAorICAgICAgICAgIE1JLmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkgPT0gbGkucmVnKQorICAgICAgICBjb250aW51ZTsKKworICAgIC8vIENoZWNrIGZvciBvcGVyYW5kcyB1c2luZyByZWcKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyAgKytpKSB7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCYgbW9wID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghbW9wLmlzUmVnKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgdW5zaWduZWQgUGh5c1JlZyA9IG1vcC5nZXRSZWcoKTsKKyAgICAgIGlmIChQaHlzUmVnID09IDAgfHwgUGh5c1JlZyA9PSBsaS5yZWcpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUGh5c1JlZykpIHsKKyAgICAgICAgaWYgKCF2cm0uaGFzUGh5cyhQaHlzUmVnKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgUGh5c1JlZyA9IHZybS5nZXRQaHlzKFBoeXNSZWcpOworICAgICAgfQorICAgICAgaWYgKFBoeXNSZWcgJiYgdHJpXy0+cmVnc092ZXJsYXAoUGh5c1JlZywgcmVnKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgLy8gTm8gY29uZmxpY3RzIGZvdW5kLgorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTGl2ZUludGVydmFsczo6Y29uZmxpY3RzV2l0aEFsaWFzUmVmKExpdmVJbnRlcnZhbCAmbGksIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLDMyPiAmSm9pbmVkQ29waWVzKSB7CisgIGZvciAoTGl2ZUludGVydmFsOjpSYW5nZXM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICBJID0gbGkucmFuZ2VzLmJlZ2luKCksIEUgPSBsaS5yYW5nZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgZm9yIChTbG90SW5kZXggaW5kZXggPSBJLT5zdGFydC5nZXRCYXNlSW5kZXgoKSwKKyAgICAgICAgICAgZW5kID0gSS0+ZW5kLmdldFByZXZTbG90KCkuZ2V0QmFzZUluZGV4KCkuZ2V0TmV4dEluZGV4KCk7CisgICAgICAgICAgIGluZGV4ICE9IGVuZDsKKyAgICAgICAgICAgaW5kZXggPSBpbmRleC5nZXROZXh0SW5kZXgoKSkgeworICAgICAgTWFjaGluZUluc3RyICpNSSA9IGdldEluc3RydWN0aW9uRnJvbUluZGV4KGluZGV4KTsKKyAgICAgIGlmICghTUkpCisgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgIC8vIHNraXAgZGVsZXRlZCBpbnN0cnVjdGlvbnMKKworICAgICAgaWYgKEpvaW5lZENvcGllcy5jb3VudChNSSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBNYWNoaW5lT3BlcmFuZCYgTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKCFNTy5pc1JlZygpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB1bnNpZ25lZCBQaHlzUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICAgIGlmIChQaHlzUmVnID09IDAgfHwgUGh5c1JlZyA9PSBSZWcgfHwKKyAgICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUGh5c1JlZykpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh0cmlfLT5yZWdzT3ZlcmxhcChSZWcsIFBoeXNSZWcpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworI2lmbmRlZiBOREVCVUcKK3N0YXRpYyB2b2lkIHByaW50UmVnTmFtZSh1bnNpZ25lZCByZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyogdHJpXykgeworICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIocmVnKSkKKyAgICBkYmdzKCkgPDwgdHJpXy0+Z2V0TmFtZShyZWcpOworICBlbHNlCisgICAgZGJncygpIDw8ICIlcmVnIiA8PCByZWc7Cit9CisjZW5kaWYKKworc3RhdGljCitib29sIE11bHRpcGxlRGVmc0J5U2FtZU1JKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIE1PSWR4KSB7CisgIHVuc2lnbmVkIFJlZyA9IE1JLmdldE9wZXJhbmQoTU9JZHgpLmdldFJlZygpOworICBmb3IgKHVuc2lnbmVkIGkgPSBNT0lkeCsxLCBlID0gTUkuZ2V0TnVtT3BlcmFuZHMoKTsgaSA8IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpKQorICAgICAgY29udGludWU7CisgICAgaWYgKE1PLmdldFJlZygpID09IFJlZyAmJiBNTy5pc0RlZigpKSB7CisgICAgICBhc3NlcnQoTUkuZ2V0T3BlcmFuZChNT0lkeCkuZ2V0U3ViUmVnKCkgIT0gTU8uZ2V0U3ViUmVnKCkgJiYKKyAgICAgICAgICAgICBNSS5nZXRPcGVyYW5kKE1PSWR4KS5nZXRTdWJSZWcoKSAmJgorICAgICAgICAgICAgIChNTy5nZXRTdWJSZWcoKSB8fCBNTy5pc0ltcGxpY2l0KCkpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBpc1BhcnRpYWxSZWRlZiAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZGVmIGF0IHRoZSBzcGVjaWZpYyBpbmRleCBpcworLy8vIHBhcnRpYWxseSByZS1kZWZpbmluZyB0aGUgc3BlY2lmaWVkIGxpdmUgaW50ZXJ2YWwuIEEgY29tbW9uIGNhc2Ugb2YgdGhpcyBpcworLy8vIGEgZGVmaW5pdGlvbiBvZiB0aGUgc3ViLXJlZ2lzdGVyLiAKK2Jvb2wgTGl2ZUludGVydmFsczo6aXNQYXJ0aWFsUmVkZWYoU2xvdEluZGV4IE1JSWR4LCBNYWNoaW5lT3BlcmFuZCAmTU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlcnZhbCAmaW50ZXJ2YWwpIHsKKyAgaWYgKCFNTy5nZXRTdWJSZWcoKSB8fCBNTy5pc0Vhcmx5Q2xvYmJlcigpKQorICAgIHJldHVybiBmYWxzZTsKKworICBTbG90SW5kZXggUmVkZWZJbmRleCA9IE1JSWR4LmdldERlZkluZGV4KCk7CisgIGNvbnN0IExpdmVSYW5nZSAqT2xkTFIgPQorICAgIGludGVydmFsLmdldExpdmVSYW5nZUNvbnRhaW5pbmcoUmVkZWZJbmRleC5nZXRVc2VJbmRleCgpKTsKKyAgaWYgKE9sZExSLT52YWxuby0+aXNEZWZBY2N1cmF0ZSgpKSB7CisgICAgTWFjaGluZUluc3RyICpEZWZNSSA9IGdldEluc3RydWN0aW9uRnJvbUluZGV4KE9sZExSLT52YWxuby0+ZGVmKTsKKyAgICByZXR1cm4gRGVmTUktPmZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgoaW50ZXJ2YWwucmVnKSAhPSAtMTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTGl2ZUludGVydmFsczo6aGFuZGxlVmlydHVhbFJlZ2lzdGVyRGVmKE1hY2hpbmVCYXNpY0Jsb2NrICptYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggTUlJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lT3BlcmFuZCYgTU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNT0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlcnZhbCAmaW50ZXJ2YWwpIHsKKyAgREVCVUcoeworICAgICAgZGJncygpIDw8ICJcdFx0cmVnaXN0ZXI6ICI7CisgICAgICBwcmludFJlZ05hbWUoaW50ZXJ2YWwucmVnLCB0cmlfKTsKKyAgICB9KTsKKworICAvLyBWaXJ0dWFsIHJlZ2lzdGVycyBtYXkgYmUgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcyAoZHVlIHRvIHBoaQorICAvLyBlbGltaW5hdGlvbiBhbmQgMi1hZGRyIGVsaW1pbmF0aW9uKS4gIE11Y2ggb2Ygd2hhdCB3ZSBkbyBvbmx5IGhhcyB0byBiZQorICAvLyBkb25lIG9uY2UgZm9yIHRoZSB2cmVnLiAgV2UgdXNlIGFuIGVtcHR5IGludGVydmFsIHRvIGRldGVjdCB0aGUgZmlyc3QKKyAgLy8gdGltZSB3ZSBzZWUgYSB2cmVnLgorICBMaXZlVmFyaWFibGVzOjpWYXJJbmZvJiB2aSA9IGx2Xy0+Z2V0VmFySW5mbyhpbnRlcnZhbC5yZWcpOworICBpZiAoaW50ZXJ2YWwuZW1wdHkoKSkgeworICAgIC8vIEdldCB0aGUgSWR4IG9mIHRoZSBkZWZpbmluZyBpbnN0cnVjdGlvbnMuCisgICAgU2xvdEluZGV4IGRlZkluZGV4ID0gTUlJZHguZ2V0RGVmSW5kZXgoKTsKKyAgICAvLyBFYXJseWNsb2JiZXJzIG1vdmUgYmFjayBvbmUsIHNvIHRoYXQgdGhleSBvdmVybGFwIHRoZSBsaXZlIHJhbmdlCisgICAgLy8gb2YgaW5wdXRzLgorICAgIGlmIChNTy5pc0Vhcmx5Q2xvYmJlcigpKQorICAgICAgZGVmSW5kZXggPSBNSUlkeC5nZXRVc2VJbmRleCgpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBmaXJzdCBkZWZpbml0aW9uIGlzIG5vdCBhIHBhcnRpYWwgcmVkZWZpbml0aW9uLiBBZGQgYW4KKyAgICAvLyA8aW1wLWRlZj4gb2YgdGhlIGZ1bGwgcmVnaXN0ZXIuCisgICAgaWYgKE1PLmdldFN1YlJlZygpKQorICAgICAgbWktPmFkZFJlZ2lzdGVyRGVmaW5lZChpbnRlcnZhbC5yZWcpOworCisgICAgTWFjaGluZUluc3RyICpDb3B5TUkgPSBOVUxMOworICAgIGlmIChtaS0+aXNDb3B5TGlrZSgpKSB7CisgICAgICBDb3B5TUkgPSBtaTsKKyAgICB9CisKKyAgICBWTkluZm8gKlZhbE5vID0gaW50ZXJ2YWwuZ2V0TmV4dFZhbHVlKGRlZkluZGV4LCBDb3B5TUksIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTkluZm9BbGxvY2F0b3IpOworICAgIGFzc2VydChWYWxOby0+aWQgPT0gMCAmJiAiRmlyc3QgdmFsdWUgaW4gaW50ZXJ2YWwgaXMgbm90IDA/Iik7CisKKyAgICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBibG9ja3MgdGhhdCB0aGUgdnJlZyBpcyBkZWZpbmVkIGluLiAgVGhlcmUgYXJlCisgICAgLy8gdHdvIGNhc2VzIHdlIGhhdmUgdG8gaGFuZGxlIGhlcmUuICBUaGUgbW9zdCBjb21tb24gY2FzZSBpcyBhIHZyZWcKKyAgICAvLyB3aG9zZSBsaWZldGltZSBpcyBjb250YWluZWQgd2l0aGluIGEgYmFzaWMgYmxvY2suICBJbiB0aGlzIGNhc2UgdGhlcmUKKyAgICAvLyB3aWxsIGJlIGEgc2luZ2xlIGtpbGwsIGluIE1CQiwgd2hpY2ggY29tZXMgYWZ0ZXIgdGhlIGRlZmluaXRpb24uCisgICAgaWYgKHZpLktpbGxzLnNpemUoKSA9PSAxICYmIHZpLktpbGxzWzBdLT5nZXRQYXJlbnQoKSA9PSBtYmIpIHsKKyAgICAgIC8vIEZJWE1FOiB3aGF0IGFib3V0IGRlYWQgdmFycz8KKyAgICAgIFNsb3RJbmRleCBraWxsSWR4OworICAgICAgaWYgKHZpLktpbGxzWzBdICE9IG1pKQorICAgICAgICBraWxsSWR4ID0gZ2V0SW5zdHJ1Y3Rpb25JbmRleCh2aS5LaWxsc1swXSkuZ2V0RGVmSW5kZXgoKTsKKyAgICAgIGVsc2UKKyAgICAgICAga2lsbElkeCA9IGRlZkluZGV4LmdldFN0b3JlSW5kZXgoKTsKKworICAgICAgLy8gSWYgdGhlIGtpbGwgaGFwcGVucyBhZnRlciB0aGUgZGVmaW5pdGlvbiwgd2UgaGF2ZSBhbiBpbnRyYS1ibG9jaworICAgICAgLy8gbGl2ZSByYW5nZS4KKyAgICAgIGlmIChraWxsSWR4ID4gZGVmSW5kZXgpIHsKKyAgICAgICAgYXNzZXJ0KHZpLkFsaXZlQmxvY2tzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICJTaG91bGRuJ3QgYmUgYWxpdmUgYWNyb3NzIGFueSBibG9ja3MhIik7CisgICAgICAgIExpdmVSYW5nZSBMUihkZWZJbmRleCwga2lsbElkeCwgVmFsTm8pOworICAgICAgICBpbnRlcnZhbC5hZGRSYW5nZShMUik7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICsiIDw8IExSIDw8ICJcbiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlIG90aGVyIGNhc2Ugd2UgaGFuZGxlIGlzIHdoZW4gYSB2aXJ0dWFsIHJlZ2lzdGVyIGxpdmVzIHRvIHRoZSBlbmQKKyAgICAvLyBvZiB0aGUgZGVmaW5pbmcgYmxvY2ssIHBvdGVudGlhbGx5IGxpdmUgYWNyb3NzIHNvbWUgYmxvY2tzLCB0aGVuIGlzCisgICAgLy8gbGl2ZSBpbnRvIHNvbWUgbnVtYmVyIG9mIGJsb2NrcywgYnV0IGdldHMga2lsbGVkLiAgU3RhcnQgYnkgYWRkaW5nIGEKKyAgICAvLyByYW5nZSB0aGF0IGdvZXMgZnJvbSB0aGlzIGRlZmluaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pbmcgYmxvY2suCisgICAgTGl2ZVJhbmdlIE5ld0xSKGRlZkluZGV4LCBnZXRNQkJFbmRJZHgobWJiKSwgVmFsTm8pOworICAgIERFQlVHKGRiZ3MoKSA8PCAiICsiIDw8IE5ld0xSKTsKKyAgICBpbnRlcnZhbC5hZGRSYW5nZShOZXdMUik7CisKKyAgICBib29sIFBISUpvaW4gPSBsdl8tPmlzUEhJSm9pbihpbnRlcnZhbC5yZWcpOworCisgICAgaWYgKFBISUpvaW4pIHsKKyAgICAgIC8vIEEgcGhpIGpvaW4gcmVnaXN0ZXIgaXMga2lsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIE1CQiBhbmQgcmV2aXZlZCBhcyBhIG5ldworICAgICAgLy8gdmFsbm8gaW4gdGhlIGtpbGxpbmcgYmxvY2tzLgorICAgICAgYXNzZXJ0KHZpLkFsaXZlQmxvY2tzLmVtcHR5KCkgJiYgIlBoaSBqb2luIGNhbid0IHBhc3MgdGhyb3VnaCBibG9ja3MiKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiIHBoaS1qb2luIik7CisgICAgICBWYWxOby0+c2V0SGFzUEhJS2lsbCh0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgYmxvY2tzIHRoYXQgdGhlIHZhcmlhYmxlIGlzIGNvbXBsZXRlbHkKKyAgICAgIC8vIGxpdmUgaW4sIGFkZGluZyBbaW5zcnRJbmRleChiZWdpbiksIGluc3RySW5kZXgoZW5kKSs0KSB0byB0aGUKKyAgICAgIC8vIGxpdmUgaW50ZXJ2YWwuCisgICAgICBmb3IgKFNwYXJzZUJpdFZlY3Rvcjw+OjppdGVyYXRvciBJID0gdmkuQWxpdmVCbG9ja3MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgIEUgPSB2aS5BbGl2ZUJsb2Nrcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKmFsaXZlQmxvY2sgPSBtZl8tPmdldEJsb2NrTnVtYmVyZWQoKkkpOworICAgICAgICBMaXZlUmFuZ2UgTFIoZ2V0TUJCU3RhcnRJZHgoYWxpdmVCbG9jayksIGdldE1CQkVuZElkeChhbGl2ZUJsb2NrKSwgVmFsTm8pOworICAgICAgICBpbnRlcnZhbC5hZGRSYW5nZShMUik7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICsiIDw8IExSKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGaW5hbGx5LCB0aGlzIHZpcnR1YWwgcmVnaXN0ZXIgaXMgbGl2ZSBmcm9tIHRoZSBzdGFydCBvZiBhbnkga2lsbGluZworICAgIC8vIGJsb2NrIHRvIHRoZSAndXNlJyBzbG90IG9mIHRoZSBraWxsaW5nIGluc3RydWN0aW9uLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSB2aS5LaWxscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKktpbGwgPSB2aS5LaWxsc1tpXTsKKyAgICAgIFNsb3RJbmRleCBTdGFydCA9IGdldE1CQlN0YXJ0SWR4KEtpbGwtPmdldFBhcmVudCgpKTsKKyAgICAgIFNsb3RJbmRleCBraWxsSWR4ID0gZ2V0SW5zdHJ1Y3Rpb25JbmRleChLaWxsKS5nZXREZWZJbmRleCgpOworCisgICAgICAvLyBDcmVhdGUgaW50ZXJ2YWwgd2l0aCBvbmUgb2YgYSBORVcgdmFsdWUgbnVtYmVyLiAgTm90ZSB0aGF0IHRoaXMgdmFsdWUKKyAgICAgIC8vIG51bWJlciBpc24ndCBhY3R1YWxseSBkZWZpbmVkIGJ5IGFuIGluc3RydWN0aW9uLCB3ZWlyZCBodWg/IDopCisgICAgICBpZiAoUEhJSm9pbikgeworICAgICAgICBWYWxObyA9IGludGVydmFsLmdldE5leHRWYWx1ZShTbG90SW5kZXgoU3RhcnQsIHRydWUpLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk5JbmZvQWxsb2NhdG9yKTsKKyAgICAgICAgVmFsTm8tPnNldElzUEhJRGVmKHRydWUpOworICAgICAgfQorICAgICAgTGl2ZVJhbmdlIExSKFN0YXJ0LCBraWxsSWR4LCBWYWxObyk7CisgICAgICBpbnRlcnZhbC5hZGRSYW5nZShMUik7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIiArIiA8PCBMUik7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgaWYgKE11bHRpcGxlRGVmc0J5U2FtZU1JKCptaSwgTU9JZHgpKQorICAgICAgLy8gTXVsdGlwbGUgZGVmcyBvZiB0aGUgc2FtZSB2aXJ0dWFsIHJlZ2lzdGVyIGJ5IHRoZSBzYW1lIGluc3RydWN0aW9uLgorICAgICAgLy8gZS5nLiAlcmVnMTAzMTo1PGRlZj4sICVyZWcxMDMxOjY8ZGVmPiA9IFZMRDFxMTYgJXJlZzEwMjQ8a2lsbD4sIC4uLgorICAgICAgLy8gVGhpcyBpcyBsaWtlbHkgZHVlIHRvIGVsaW1pbmF0aW9uIG9mIFJFR19TRVFVRU5DRSBpbnN0cnVjdGlvbnMuIFJldHVybgorICAgICAgLy8gaGVyZSBzaW5jZSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgorICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgc2Vjb25kIHRpbWUgd2Ugc2VlIGEgdmlydHVhbCByZWdpc3RlciBkZWZpbml0aW9uLCBpdAorICAgIC8vIG11c3QgYmUgZHVlIHRvIHBoaSBlbGltaW5hdGlvbiBvciB0d28gYWRkciBlbGltaW5hdGlvbi4gIElmIHRoaXMgaXMKKyAgICAvLyB0aGUgcmVzdWx0IG9mIHR3byBhZGRyZXNzIGVsaW1pbmF0aW9uLCB0aGVuIHRoZSB2cmVnIGlzIG9uZSBvZiB0aGUKKyAgICAvLyBkZWYtYW5kLXVzZSByZWdpc3RlciBvcGVyYW5kLgorCisgICAgLy8gSXQgbWF5IGFsc28gYmUgcGFydGlhbCByZWRlZiBsaWtlIHRoaXM6CisgICAgLy8gODAJJXJlZzEwNDE6NjxkZWY+ID0gVlNIUk52NGkxNiAlcmVnMTAzNDxraWxsPiwgMTIsIHByZWQ6MTQsIHByZWQ6JXJlZzAKKyAgICAvLyAxMjAJJXJlZzEwNDE6NTxkZWY+ID0gVlNIUk52NGkxNiAlcmVnMTAzOTxraWxsPiwgMTIsIHByZWQ6MTQsIHByZWQ6JXJlZzAKKyAgICBib29sIFBhcnRSZURlZiA9IGlzUGFydGlhbFJlZGVmKE1JSWR4LCBNTywgaW50ZXJ2YWwpOworICAgIGlmIChQYXJ0UmVEZWYgfHwgbWktPmlzUmVnVGllZFRvVXNlT3BlcmFuZChNT0lkeCkpIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSB0d28tYWRkcmVzcyBkZWZpbml0aW9uLCB0aGVuIHdlIGhhdmUgYWxyZWFkeSBwcm9jZXNzZWQKKyAgICAgIC8vIHRoZSBsaXZlIHJhbmdlLiAgVGhlIG9ubHkgcHJvYmxlbSBpcyB0aGF0IHdlIGRpZG4ndCByZWFsaXplIHRoZXJlCisgICAgICAvLyBhcmUgYWN0dWFsbHkgdHdvIHZhbHVlcyBpbiB0aGUgbGl2ZSBpbnRlcnZhbC4gIEJlY2F1c2Ugb2YgdGhpcyB3ZQorICAgICAgLy8gbmVlZCB0byB0YWtlIHRoZSBMaXZlUmVnaW9uIHRoYXQgZGVmaW5lcyB0aGlzIHJlZ2lzdGVyIGFuZCBzcGxpdCBpdAorICAgICAgLy8gaW50byB0d28gdmFsdWVzLgorICAgICAgU2xvdEluZGV4IFJlZGVmSW5kZXggPSBNSUlkeC5nZXREZWZJbmRleCgpOworICAgICAgaWYgKE1PLmlzRWFybHlDbG9iYmVyKCkpCisgICAgICAgIFJlZGVmSW5kZXggPSBNSUlkeC5nZXRVc2VJbmRleCgpOworCisgICAgICBjb25zdCBMaXZlUmFuZ2UgKk9sZExSID0KKyAgICAgICAgaW50ZXJ2YWwuZ2V0TGl2ZVJhbmdlQ29udGFpbmluZyhSZWRlZkluZGV4LmdldFVzZUluZGV4KCkpOworICAgICAgVk5JbmZvICpPbGRWYWxObyA9IE9sZExSLT52YWxubzsKKyAgICAgIFNsb3RJbmRleCBEZWZJbmRleCA9IE9sZFZhbE5vLT5kZWYuZ2V0RGVmSW5kZXgoKTsKKworICAgICAgLy8gRGVsZXRlIHRoZSBwcmV2aW91cyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlIHNob3J0IGFuZCBjb250aW51b3VzLAorICAgICAgLy8gYmVjYXVzZSB0aGUgMi1hZGRyIGNvcHkgbXVzdCBiZSBpbiB0aGUgc2FtZSBNQkIgYXMgdGhlIHJlZGVmLgorICAgICAgaW50ZXJ2YWwucmVtb3ZlUmFuZ2UoRGVmSW5kZXgsIFJlZGVmSW5kZXgpOworCisgICAgICAvLyBUaGUgbmV3IHZhbHVlIG51bWJlciAoIzEpIGlzIGRlZmluZWQgYnkgdGhlIGluc3RydWN0aW9uIHdlIGNsYWltZWQKKyAgICAgIC8vIGRlZmluZWQgdmFsdWUgIzAuCisgICAgICBWTkluZm8gKlZhbE5vID0gaW50ZXJ2YWwuZ2V0TmV4dFZhbHVlKE9sZFZhbE5vLT5kZWYsIE9sZFZhbE5vLT5nZXRDb3B5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyB1cGRhdGUgYXQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTkluZm9BbGxvY2F0b3IpOworICAgICAgVmFsTm8tPnNldEZsYWdzKE9sZFZhbE5vLT5nZXRGbGFncygpKTsgLy8gKiA8LSB1cGRhdGluZyBoZXJlCisKKyAgICAgIC8vIFZhbHVlIzAgaXMgbm93IGRlZmluZWQgYnkgdGhlIDItYWRkciBpbnN0cnVjdGlvbi4KKyAgICAgIE9sZFZhbE5vLT5kZWYgID0gUmVkZWZJbmRleDsKKyAgICAgIE9sZFZhbE5vLT5zZXRDb3B5KDApOworCisgICAgICAvLyBBIHJlLWRlZiBtYXkgYmUgYSBjb3B5LiBlLmcuICVyZWcxMDMwOjY8ZGVmPiA9IFZNT1ZEICVyZWcxMDI2LCAuLi4KKyAgICAgIGlmIChQYXJ0UmVEZWYgJiYgbWktPmlzQ29weUxpa2UoKSkKKyAgICAgICAgT2xkVmFsTm8tPnNldENvcHkoJiptaSk7CisgICAgICAKKyAgICAgIC8vIEFkZCB0aGUgbmV3IGxpdmUgaW50ZXJ2YWwgd2hpY2ggcmVwbGFjZXMgdGhlIHJhbmdlIGZvciB0aGUgaW5wdXQgY29weS4KKyAgICAgIExpdmVSYW5nZSBMUihEZWZJbmRleCwgUmVkZWZJbmRleCwgVmFsTm8pOworICAgICAgREVCVUcoZGJncygpIDw8ICIgcmVwbGFjZSByYW5nZSB3aXRoICIgPDwgTFIpOworICAgICAgaW50ZXJ2YWwuYWRkUmFuZ2UoTFIpOworCisgICAgICAvLyBJZiB0aGlzIHJlZGVmaW5pdGlvbiBpcyBkZWFkLCB3ZSBuZWVkIHRvIGFkZCBhIGR1bW15IHVuaXQgbGl2ZQorICAgICAgLy8gcmFuZ2UgY292ZXJpbmcgdGhlIGRlZiBzbG90LgorICAgICAgaWYgKE1PLmlzRGVhZCgpKQorICAgICAgICBpbnRlcnZhbC5hZGRSYW5nZShMaXZlUmFuZ2UoUmVkZWZJbmRleCwgUmVkZWZJbmRleC5nZXRTdG9yZUluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGRWYWxObykpOworCisgICAgICBERUJVRyh7CisgICAgICAgICAgZGJncygpIDw8ICIgUkVTVUxUOiAiOworICAgICAgICAgIGludGVydmFsLnByaW50KGRiZ3MoKSwgdHJpXyk7CisgICAgICAgIH0pOworICAgIH0gZWxzZSBpZiAobHZfLT5pc1BISUpvaW4oaW50ZXJ2YWwucmVnKSkgeworICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgUEhJIGVsaW1pbmF0aW9uLCBlYWNoIHZhcmlhYmxlIGRlZmluaXRpb24gaXMgb25seQorICAgICAgLy8gbGl2ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBibG9jay4gIFdlJ3ZlIGFscmVhZHkgdGFrZW4gY2FyZSBvZiB0aGUKKyAgICAgIC8vIHJlc3Qgb2YgdGhlIGxpdmUgcmFuZ2UuCisKKyAgICAgIFNsb3RJbmRleCBkZWZJbmRleCA9IE1JSWR4LmdldERlZkluZGV4KCk7CisgICAgICBpZiAoTU8uaXNFYXJseUNsb2JiZXIoKSkKKyAgICAgICAgZGVmSW5kZXggPSBNSUlkeC5nZXRVc2VJbmRleCgpOworCisgICAgICBWTkluZm8gKlZhbE5vOworICAgICAgTWFjaGluZUluc3RyICpDb3B5TUkgPSBOVUxMOworICAgICAgaWYgKG1pLT5pc0NvcHlMaWtlKCkpCisgICAgICAgIENvcHlNSSA9IG1pOworICAgICAgVmFsTm8gPSBpbnRlcnZhbC5nZXROZXh0VmFsdWUoZGVmSW5kZXgsIENvcHlNSSwgdHJ1ZSwgVk5JbmZvQWxsb2NhdG9yKTsKKyAgICAgIAorICAgICAgU2xvdEluZGV4IGtpbGxJbmRleCA9IGdldE1CQkVuZElkeChtYmIpOworICAgICAgTGl2ZVJhbmdlIExSKGRlZkluZGV4LCBraWxsSW5kZXgsIFZhbE5vKTsKKyAgICAgIGludGVydmFsLmFkZFJhbmdlKExSKTsKKyAgICAgIFZhbE5vLT5zZXRIYXNQSElLaWxsKHRydWUpOworICAgICAgREVCVUcoZGJncygpIDw8ICIgcGhpLWpvaW4gKyIgPDwgTFIpOworICAgIH0gZWxzZSB7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJNdWx0aXBseSBkZWZpbmVkIHJlZ2lzdGVyIik7CisgICAgfQorICB9CisKKyAgREVCVUcoZGJncygpIDw8ICdcbicpOworfQorCit2b2lkIExpdmVJbnRlcnZhbHM6OmhhbmRsZVBoeXNpY2FsUmVnaXN0ZXJEZWYoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IE1JSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVPcGVyYW5kJiBNTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWwgJmludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqQ29weU1JKSB7CisgIC8vIEEgcGh5c2ljYWwgcmVnaXN0ZXIgY2Fubm90IGJlIGxpdmUgYWNyb3NzIGJhc2ljIGJsb2NrLCBzbyBpdHMKKyAgLy8gbGlmZXRpbWUgbXVzdCBlbmQgc29tZXdoZXJlIGluIGl0cyBkZWZpbmluZyBiYXNpYyBibG9jay4KKyAgREVCVUcoeworICAgICAgZGJncygpIDw8ICJcdFx0cmVnaXN0ZXI6ICI7CisgICAgICBwcmludFJlZ05hbWUoaW50ZXJ2YWwucmVnLCB0cmlfKTsKKyAgICB9KTsKKworICBTbG90SW5kZXggYmFzZUluZGV4ID0gTUlJZHg7CisgIFNsb3RJbmRleCBzdGFydCA9IGJhc2VJbmRleC5nZXREZWZJbmRleCgpOworICAvLyBFYXJseWNsb2JiZXJzIG1vdmUgYmFjayBvbmUuCisgIGlmIChNTy5pc0Vhcmx5Q2xvYmJlcigpKQorICAgIHN0YXJ0ID0gTUlJZHguZ2V0VXNlSW5kZXgoKTsKKyAgU2xvdEluZGV4IGVuZCA9IHN0YXJ0OworCisgIC8vIElmIGl0IGlzIG5vdCB1c2VkIGFmdGVyIGRlZmluaXRpb24sIGl0IGlzIGNvbnNpZGVyZWQgZGVhZCBhdAorICAvLyB0aGUgaW5zdHJ1Y3Rpb24gZGVmaW5pbmcgaXQuIEhlbmNlIGl0cyBpbnRlcnZhbCBpczoKKyAgLy8gW2RlZlNsb3QoZGVmKSwgZGVmU2xvdChkZWYpKzEpCisgIC8vIEZvciBlYXJseWNsb2JiZXJzLCB0aGUgZGVmU2xvdCB3YXMgcHVzaGVkIGJhY2sgb25lOyB0aGUgZXh0cmEKKyAgLy8gYWR2YW5jZSBiZWxvdyBjb21wZW5zYXRlcy4KKyAgaWYgKE1PLmlzRGVhZCgpKSB7CisgICAgREVCVUcoZGJncygpIDw8ICIgZGVhZCIpOworICAgIGVuZCA9IHN0YXJ0LmdldFN0b3JlSW5kZXgoKTsKKyAgICBnb3RvIGV4aXQ7CisgIH0KKworICAvLyBJZiBpdCBpcyBub3QgZGVhZCBvbiBkZWZpbml0aW9uLCBpdCBtdXN0IGJlIGtpbGxlZCBieSBhCisgIC8vIHN1YnNlcXVlbnQgaW5zdHJ1Y3Rpb24uIEhlbmNlIGl0cyBpbnRlcnZhbCBpczoKKyAgLy8gW2RlZlNsb3QoZGVmKSwgdXNlU2xvdChraWxsKSsxKQorICBiYXNlSW5kZXggPSBiYXNlSW5kZXguZ2V0TmV4dEluZGV4KCk7CisgIHdoaWxlICgrK21pICE9IE1CQi0+ZW5kKCkpIHsKKworICAgIGlmIChtaS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoYmFzZUluZGV4KSA9PSAwKQorICAgICAgYmFzZUluZGV4ID0gaW5kZXhlc18tPmdldE5leHROb25OdWxsSW5kZXgoYmFzZUluZGV4KTsKKworICAgIGlmIChtaS0+a2lsbHNSZWdpc3RlcihpbnRlcnZhbC5yZWcsIHRyaV8pKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIiBraWxsZWQiKTsKKyAgICAgIGVuZCA9IGJhc2VJbmRleC5nZXREZWZJbmRleCgpOworICAgICAgZ290byBleGl0OworICAgIH0gZWxzZSB7CisgICAgICBpbnQgRGVmSWR4ID0gbWktPmZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgoaW50ZXJ2YWwucmVnLGZhbHNlLGZhbHNlLHRyaV8pOworICAgICAgaWYgKERlZklkeCAhPSAtMSkgeworICAgICAgICBpZiAobWktPmlzUmVnVGllZFRvVXNlT3BlcmFuZChEZWZJZHgpKSB7CisgICAgICAgICAgLy8gVHdvLWFkZHJlc3MgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgZW5kID0gYmFzZUluZGV4LmdldERlZkluZGV4KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQW5vdGhlciBpbnN0cnVjdGlvbiByZWRlZmluZXMgdGhlIHJlZ2lzdGVyIGJlZm9yZSBpdCBpcyBldmVyIHJlYWQuCisgICAgICAgICAgLy8gVGhlbiB0aGUgcmVnaXN0ZXIgaXMgZXNzZW50aWFsbHkgZGVhZCBhdCB0aGUgaW5zdHJ1Y3Rpb24gdGhhdAorICAgICAgICAgIC8vIGRlZmluZXMgaXQuIEhlbmNlIGl0cyBpbnRlcnZhbCBpczoKKyAgICAgICAgICAvLyBbZGVmU2xvdChkZWYpLCBkZWZTbG90KGRlZikrMSkKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiBkZWFkIik7CisgICAgICAgICAgZW5kID0gc3RhcnQuZ2V0U3RvcmVJbmRleCgpOworICAgICAgICB9CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgYmFzZUluZGV4ID0gYmFzZUluZGV4LmdldE5leHRJbmRleCgpOworICB9CisgIAorICAvLyBUaGUgb25seSBjYXNlIHdlIHNob3VsZCBoYXZlIGEgZGVhZCBwaHlzcmVnIGhlcmUgd2l0aG91dCBhIGtpbGxpbmcgb3IKKyAgLy8gaW5zdHJ1Y3Rpb24gd2hlcmUgd2Uga25vdyBpdCdzIGRlYWQgaXMgaWYgaXQgaXMgbGl2ZS1pbiB0byB0aGUgZnVuY3Rpb24KKyAgLy8gYW5kIG5ldmVyIHVzZWQuIEFub3RoZXIgcG9zc2libGUgY2FzZSBpcyB0aGUgaW1wbGljaXQgdXNlIG9mIHRoZQorICAvLyBwaHlzaWNhbCByZWdpc3RlciBoYXMgYmVlbiBkZWxldGVkIGJ5IHR3by1hZGRyZXNzIHBhc3MuCisgIGVuZCA9IHN0YXJ0LmdldFN0b3JlSW5kZXgoKTsKKworZXhpdDoKKyAgYXNzZXJ0KHN0YXJ0IDwgZW5kICYmICJkaWQgbm90IGZpbmQgZW5kIG9mIGludGVydmFsPyIpOworCisgIC8vIEFscmVhZHkgZXhpc3RzPyBFeHRlbmQgb2xkIGxpdmUgaW50ZXJ2YWwuCisgIExpdmVJbnRlcnZhbDo6aXRlcmF0b3IgT2xkTFIgPSBpbnRlcnZhbC5GaW5kTGl2ZVJhbmdlQ29udGFpbmluZyhzdGFydCk7CisgIGJvb2wgRXh0ZW5kID0gT2xkTFIgIT0gaW50ZXJ2YWwuZW5kKCk7CisgIFZOSW5mbyAqVmFsTm8gPSBFeHRlbmQKKyAgICA/IE9sZExSLT52YWxubyA6IGludGVydmFsLmdldE5leHRWYWx1ZShzdGFydCwgQ29weU1JLCB0cnVlLCBWTkluZm9BbGxvY2F0b3IpOworICBpZiAoTU8uaXNFYXJseUNsb2JiZXIoKSAmJiBFeHRlbmQpCisgICAgVmFsTm8tPnNldEhhc1JlZGVmQnlFQyh0cnVlKTsKKyAgTGl2ZVJhbmdlIExSKHN0YXJ0LCBlbmQsIFZhbE5vKTsKKyAgaW50ZXJ2YWwuYWRkUmFuZ2UoTFIpOworICBERUJVRyhkYmdzKCkgPDwgIiArIiA8PCBMUiA8PCAnXG4nKTsKK30KKwordm9pZCBMaXZlSW50ZXJ2YWxzOjpoYW5kbGVSZWdpc3RlckRlZihNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RJbmRleCBNSUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU9wZXJhbmQmIE1PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNT0lkeCkgeworICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihNTy5nZXRSZWcoKSkpCisgICAgaGFuZGxlVmlydHVhbFJlZ2lzdGVyRGVmKE1CQiwgTUksIE1JSWR4LCBNTywgTU9JZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlSW50ZXJ2YWwoTU8uZ2V0UmVnKCkpKTsKKyAgZWxzZSBpZiAoYWxsb2NhdGFibGVSZWdzX1tNTy5nZXRSZWcoKV0pIHsKKyAgICBNYWNoaW5lSW5zdHIgKkNvcHlNSSA9IE5VTEw7CisgICAgaWYgKE1JLT5pc0NvcHlMaWtlKCkpCisgICAgICBDb3B5TUkgPSBNSTsKKyAgICBoYW5kbGVQaHlzaWNhbFJlZ2lzdGVyRGVmKE1CQiwgTUksIE1JSWR4LCBNTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlSW50ZXJ2YWwoTU8uZ2V0UmVnKCkpLCBDb3B5TUkpOworICAgIC8vIERlZiBvZiBhIHJlZ2lzdGVyIGFsc28gZGVmaW5lcyBpdHMgc3ViLXJlZ2lzdGVycy4KKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkKiBBUyA9IHRyaV8tPmdldFN1YlJlZ2lzdGVycyhNTy5nZXRSZWcoKSk7ICpBUzsgKytBUykKKyAgICAgIC8vIElmIE1JIGFsc28gbW9kaWZpZXMgdGhlIHN1Yi1yZWdpc3RlciBleHBsaWNpdGx5LCBhdm9pZCBwcm9jZXNzaW5nIGl0CisgICAgICAvLyBtb3JlIHRoYW4gb25jZS4gRG8gbm90IHBhc3MgaW4gVFJJIGhlcmUgc28gaXQgY2hlY2tzIGZvciBleGFjdCBtYXRjaC4KKyAgICAgIGlmICghTUktPmRlZmluZXNSZWdpc3RlcigqQVMpKQorICAgICAgICBoYW5kbGVQaHlzaWNhbFJlZ2lzdGVyRGVmKE1CQiwgTUksIE1JSWR4LCBNTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPckNyZWF0ZUludGVydmFsKCpBUyksIDApOworICB9Cit9CisKK3ZvaWQgTGl2ZUludGVydmFsczo6aGFuZGxlTGl2ZUluUmVnaXN0ZXIoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IE1JSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWwgJmludGVydmFsLCBib29sIGlzQWxpYXMpIHsKKyAgREVCVUcoeworICAgICAgZGJncygpIDw8ICJcdFx0bGl2ZWluIHJlZ2lzdGVyOiAiOworICAgICAgcHJpbnRSZWdOYW1lKGludGVydmFsLnJlZywgdHJpXyk7CisgICAgfSk7CisKKyAgLy8gTG9vayBmb3Iga2lsbHMsIGlmIGl0IHJlYWNoZXMgYSBkZWYgYmVmb3JlIGl0J3Mga2lsbGVkLCB0aGVuIGl0IHNob3VsZG4ndAorICAvLyBiZSBjb25zaWRlcmVkIGEgbGl2ZWluLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgbWkgPSBNQkItPmJlZ2luKCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFID0gTUJCLT5lbmQoKTsKKyAgLy8gU2tpcCBvdmVyIERCR19WQUxVRSBhdCB0aGUgc3RhcnQgb2YgdGhlIE1CQi4KKyAgaWYgKG1pICE9IEUgJiYgbWktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgd2hpbGUgKCsrbWkgIT0gRSAmJiBtaS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICA7CisgICAgaWYgKG1pID09IEUpCisgICAgICAvLyBNQkIgaXMgZW1wdHkgZXhjZXB0IGZvciBEQkdfVkFMVUUncy4KKyAgICAgIHJldHVybjsKKyAgfQorCisgIFNsb3RJbmRleCBiYXNlSW5kZXggPSBNSUlkeDsKKyAgU2xvdEluZGV4IHN0YXJ0ID0gYmFzZUluZGV4OworICBpZiAoZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoYmFzZUluZGV4KSA9PSAwKQorICAgIGJhc2VJbmRleCA9IGluZGV4ZXNfLT5nZXROZXh0Tm9uTnVsbEluZGV4KGJhc2VJbmRleCk7CisKKyAgU2xvdEluZGV4IGVuZCA9IGJhc2VJbmRleDsKKyAgYm9vbCBTZWVuRGVmVXNlID0gZmFsc2U7CisKKyAgd2hpbGUgKG1pICE9IEUpIHsKKyAgICBpZiAobWktPmtpbGxzUmVnaXN0ZXIoaW50ZXJ2YWwucmVnLCB0cmlfKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICIga2lsbGVkIik7CisgICAgICBlbmQgPSBiYXNlSW5kZXguZ2V0RGVmSW5kZXgoKTsKKyAgICAgIFNlZW5EZWZVc2UgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChtaS0+ZGVmaW5lc1JlZ2lzdGVyKGludGVydmFsLnJlZywgdHJpXykpIHsKKyAgICAgIC8vIEFub3RoZXIgaW5zdHJ1Y3Rpb24gcmVkZWZpbmVzIHRoZSByZWdpc3RlciBiZWZvcmUgaXQgaXMgZXZlciByZWFkLgorICAgICAgLy8gVGhlbiB0aGUgcmVnaXN0ZXIgaXMgZXNzZW50aWFsbHkgZGVhZCBhdCB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzCisgICAgICAvLyBpdC4gSGVuY2UgaXRzIGludGVydmFsIGlzOgorICAgICAgLy8gW2RlZlNsb3QoZGVmKSwgZGVmU2xvdChkZWYpKzEpCisgICAgICBERUJVRyhkYmdzKCkgPDwgIiBkZWFkIik7CisgICAgICBlbmQgPSBzdGFydC5nZXRTdG9yZUluZGV4KCk7CisgICAgICBTZWVuRGVmVXNlID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHdoaWxlICgrK21pICE9IEUgJiYgbWktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgLy8gU2tpcCBvdmVyIERCR19WQUxVRS4KKyAgICAgIDsKKyAgICBpZiAobWkgIT0gRSkKKyAgICAgIGJhc2VJbmRleCA9IGluZGV4ZXNfLT5nZXROZXh0Tm9uTnVsbEluZGV4KGJhc2VJbmRleCk7CisgIH0KKworICAvLyBMaXZlLWluIHJlZ2lzdGVyIG1pZ2h0IG5vdCBiZSB1c2VkIGF0IGFsbC4KKyAgaWYgKCFTZWVuRGVmVXNlKSB7CisgICAgaWYgKGlzQWxpYXMpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiIGRlYWQiKTsKKyAgICAgIGVuZCA9IE1JSWR4LmdldFN0b3JlSW5kZXgoKTsKKyAgICB9IGVsc2UgeworICAgICAgREVCVUcoZGJncygpIDw8ICIgbGl2ZSB0aHJvdWdoIik7CisgICAgICBlbmQgPSBiYXNlSW5kZXg7CisgICAgfQorICB9CisKKyAgVk5JbmZvICp2bmkgPQorICAgIGludGVydmFsLmdldE5leHRWYWx1ZShTbG90SW5kZXgoZ2V0TUJCU3RhcnRJZHgoTUJCKSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBWTkluZm9BbGxvY2F0b3IpOworICB2bmktPnNldElzUEhJRGVmKHRydWUpOworICBMaXZlUmFuZ2UgTFIoc3RhcnQsIGVuZCwgdm5pKTsKKworICBpbnRlcnZhbC5hZGRSYW5nZShMUik7CisgIERFQlVHKGRiZ3MoKSA8PCAiICsiIDw8IExSIDw8ICdcbicpOworfQorCisvLy8gY29tcHV0ZUludGVydmFscyAtIGNvbXB1dGVzIHRoZSBsaXZlIGludGVydmFscyBmb3IgdmlydHVhbAorLy8vIHJlZ2lzdGVycy4gZm9yIHNvbWUgb3JkZXJpbmcgb2YgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIFsxLE5dIGEKKy8vLyBsaXZlIGludGVydmFsIGlzIGFuIGludGVydmFsIFtpLCBqKSB3aGVyZSAxIDw9IGkgPD0gaiA8IE4gZm9yCisvLy8gd2hpY2ggYSB2YXJpYWJsZSBpcyBsaXZlCit2b2lkIExpdmVJbnRlcnZhbHM6OmNvbXB1dGVJbnRlcnZhbHMoKSB7IAorICBERUJVRyhkYmdzKCkgPDwgIioqKioqKioqKiogQ09NUFVUSU5HIExJVkUgSU5URVJWQUxTICoqKioqKioqKipcbiIKKyAgICAgICAgICAgICAgIDw8ICIqKioqKioqKioqIEZ1bmN0aW9uOiAiCisgICAgICAgICAgICAgICA8PCAoKFZhbHVlKiltZl8tPmdldEZ1bmN0aW9uKCkpLT5nZXROYW1lKCkgPDwgJ1xuJyk7CisKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IFVuZGVmVXNlczsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBtZl8tPmJlZ2luKCksIEUgPSBtZl8tPmVuZCgpOworICAgICAgIE1CQkkgIT0gRTsgKytNQkJJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1CQkk7CisgICAgaWYgKE1CQi0+ZW1wdHkoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gVHJhY2sgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IG1hY2hpbmUgaW5zdHIuCisgICAgU2xvdEluZGV4IE1JSW5kZXggPSBnZXRNQkJTdGFydElkeChNQkIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiQkIjIiA8PCBNQkItPmdldE51bWJlcigpCisgICAgICAgICAgPDwgIjpcdFx0IyBkZXJpdmVkIGZyb20gIiA8PCBNQkItPmdldE5hbWUoKSA8PCAiXG4iKTsKKworICAgIC8vIENyZWF0ZSBpbnRlcnZhbHMgZm9yIGxpdmUtaW5zIHRvIHRoaXMgQkIgZmlyc3QuCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6bGl2ZWluX2l0ZXJhdG9yIExJID0gTUJCLT5saXZlaW5fYmVnaW4oKSwKKyAgICAgICAgICAgTEUgPSBNQkItPmxpdmVpbl9lbmQoKTsgTEkgIT0gTEU7ICsrTEkpIHsKKyAgICAgIGhhbmRsZUxpdmVJblJlZ2lzdGVyKE1CQiwgTUlJbmRleCwgZ2V0T3JDcmVhdGVJbnRlcnZhbCgqTEkpKTsKKyAgICAgIC8vIE11bHRpcGxlIGxpdmUtaW5zIGNhbiBhbGlhcyB0aGUgc2FtZSByZWdpc3Rlci4KKyAgICAgIGZvciAoY29uc3QgdW5zaWduZWQqIEFTID0gdHJpXy0+Z2V0U3ViUmVnaXN0ZXJzKCpMSSk7ICpBUzsgKytBUykKKyAgICAgICAgaWYgKCFoYXNJbnRlcnZhbCgqQVMpKQorICAgICAgICAgIGhhbmRsZUxpdmVJblJlZ2lzdGVyKE1CQiwgTUlJbmRleCwgZ2V0T3JDcmVhdGVJbnRlcnZhbCgqQVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKyAgICAKKyAgICAvLyBTa2lwIG92ZXIgZW1wdHkgaW5pdGlhbCBpbmRpY2VzLgorICAgIGlmIChnZXRJbnN0cnVjdGlvbkZyb21JbmRleChNSUluZGV4KSA9PSAwKQorICAgICAgTUlJbmRleCA9IGluZGV4ZXNfLT5nZXROZXh0Tm9uTnVsbEluZGV4KE1JSW5kZXgpOworICAgIAorICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JID0gTUJCLT5iZWdpbigpLCBtaUVuZCA9IE1CQi0+ZW5kKCk7CisgICAgICAgICBNSSAhPSBtaUVuZDsgKytNSSkgeworICAgICAgREVCVUcoZGJncygpIDw8IE1JSW5kZXggPDwgIlx0IiA8PCAqTUkpOworICAgICAgaWYgKE1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIEhhbmRsZSBkZWZzLgorICAgICAgZm9yIChpbnQgaSA9IE1JLT5nZXROdW1PcGVyYW5kcygpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uZ2V0UmVnKCkpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gaGFuZGxlIHJlZ2lzdGVyIGRlZnMgLSBidWlsZCBpbnRlcnZhbHMKKyAgICAgICAgaWYgKE1PLmlzRGVmKCkpCisgICAgICAgICAgaGFuZGxlUmVnaXN0ZXJEZWYoTUJCLCBNSSwgTUlJbmRleCwgTU8sIGkpOworICAgICAgICBlbHNlIGlmIChNTy5pc1VuZGVmKCkpCisgICAgICAgICAgVW5kZWZVc2VzLnB1c2hfYmFjayhNTy5nZXRSZWcoKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIE1vdmUgdG8gdGhlIG5leHQgaW5zdHIgc2xvdC4KKyAgICAgIE1JSW5kZXggPSBpbmRleGVzXy0+Z2V0TmV4dE5vbk51bGxJbmRleChNSUluZGV4KTsKKyAgICB9CisgIH0KKworICAvLyBDcmVhdGUgZW1wdHkgaW50ZXJ2YWxzIGZvciByZWdpc3RlcnMgZGVmaW5lZCBieSBpbXBsaWNpdF9kZWYncyAoZXhjZXB0CisgIC8vIGZvciB0aG9zZSBpbXBsaWNpdF9kZWYgdGhhdCBkZWZpbmUgdmFsdWVzIHdoaWNoIGFyZSBsaXZlb3V0IG9mIHRoZWlyCisgIC8vIGJsb2Nrcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFVuZGVmVXNlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgVW5kZWZSZWcgPSBVbmRlZlVzZXNbaV07CisgICAgKHZvaWQpZ2V0T3JDcmVhdGVJbnRlcnZhbChVbmRlZlJlZyk7CisgIH0KK30KKworTGl2ZUludGVydmFsKiBMaXZlSW50ZXJ2YWxzOjpjcmVhdGVJbnRlcnZhbCh1bnNpZ25lZCByZWcpIHsKKyAgZmxvYXQgV2VpZ2h0ID0gVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIocmVnKSA/IEhVR0VfVkFMRiA6IDAuMEY7CisgIHJldHVybiBuZXcgTGl2ZUludGVydmFsKHJlZywgV2VpZ2h0KTsKK30KKworLy8vIGR1cEludGVydmFsIC0gRHVwbGljYXRlIGEgbGl2ZSBpbnRlcnZhbC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKy8vLyBtYW5hZ2luZyB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KK0xpdmVJbnRlcnZhbCogTGl2ZUludGVydmFsczo6ZHVwSW50ZXJ2YWwoTGl2ZUludGVydmFsICpsaSkgeworICBMaXZlSW50ZXJ2YWwgKk5ld0xJID0gY3JlYXRlSW50ZXJ2YWwobGktPnJlZyk7CisgIE5ld0xJLT5Db3B5KCpsaSwgbXJpXywgZ2V0Vk5JbmZvQWxsb2NhdG9yKCkpOworICByZXR1cm4gTmV3TEk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSZWdpc3RlciBhbGxvY2F0b3IgaG9va3MuCisvLworCisvLy8gZ2V0UmVNYXRJbXBsaWNpdFVzZSAtIElmIHRoZSByZW1hdCBkZWZpbml0aW9uIE1JIGhhcyBvbmUgKGZvciBub3csIHdlIG9ubHkKKy8vLyBhbGxvdyBvbmUpIHZpcnR1YWwgcmVnaXN0ZXIgb3BlcmFuZCwgdGhlbiBpdHMgdXNlcyBhcmUgaW1wbGljaXRseSB1c2luZworLy8vIHRoZSByZWdpc3Rlci4gUmV0dXJucyB0aGUgdmlydHVhbCByZWdpc3Rlci4KK3Vuc2lnbmVkIExpdmVJbnRlcnZhbHM6OmdldFJlTWF0SW1wbGljaXRVc2UoY29uc3QgTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICB1bnNpZ25lZCBSZWdPcCA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzVXNlKCkpCisgICAgICBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBpZiAoUmVnID09IDAgfHwgUmVnID09IGxpLnJlZykKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpICYmCisgICAgICAgICFhbGxvY2F0YWJsZVJlZ3NfW1JlZ10pCisgICAgICBjb250aW51ZTsKKyAgICAvLyBGSVhNRTogRm9yIG5vdywgb25seSByZW1hdCBNSSB3aXRoIGF0IG1vc3Qgb25lIHJlZ2lzdGVyIG9wZXJhbmQuCisgICAgYXNzZXJ0KCFSZWdPcCAmJgorICAgICAgICAgICAiQ2FuJ3QgcmVtYXRlcmlhbGl6ZSBpbnN0cnVjdGlvbiB3aXRoIG11bHRpcGxlIHJlZ2lzdGVyIG9wZXJhbmQhIik7CisgICAgUmVnT3AgPSBNTy5nZXRSZWcoKTsKKyNpZm5kZWYgTkRFQlVHCisgICAgYnJlYWs7CisjZW5kaWYKKyAgfQorICByZXR1cm4gUmVnT3A7Cit9CisKKy8vLyBpc1ZhbE5vQXZhaWxhYmxlQXQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsIyBvZiB0aGUgc3BlY2lmaWVkIGludGVydmFsCisvLy8gd2hpY2ggcmVhY2hlcyB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gYWxzbyByZWFjaGVzIHRoZSBzcGVjaWZpZWQgdXNlIGluZGV4LgorYm9vbCBMaXZlSW50ZXJ2YWxzOjppc1ZhbE5vQXZhaWxhYmxlQXQoY29uc3QgTGl2ZUludGVydmFsICZsaSwgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RJbmRleCBVc2VJZHgpIGNvbnN0IHsKKyAgU2xvdEluZGV4IEluZGV4ID0gZ2V0SW5zdHJ1Y3Rpb25JbmRleChNSSk7ICAKKyAgVk5JbmZvICpWYWxObyA9IGxpLkZpbmRMaXZlUmFuZ2VDb250YWluaW5nKEluZGV4KS0+dmFsbm87CisgIExpdmVJbnRlcnZhbDo6Y29uc3RfaXRlcmF0b3IgVUkgPSBsaS5GaW5kTGl2ZVJhbmdlQ29udGFpbmluZyhVc2VJZHgpOworICByZXR1cm4gVUkgIT0gbGkuZW5kKCkgJiYgVUktPnZhbG5vID09IFZhbE5vOworfQorCisvLy8gaXNSZU1hdGVyaWFsaXphYmxlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBkZWZpbml0aW9uIE1JIG9mIHRoZSBzcGVjaWZpZWQKKy8vLyB2YWwjIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwgaXMgcmUtbWF0ZXJpYWxpemFibGUuCitib29sIExpdmVJbnRlcnZhbHM6OmlzUmVNYXRlcmlhbGl6YWJsZShjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVk5JbmZvICpWYWxObywgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxMaXZlSW50ZXJ2YWwqPiAmU3BpbGxJcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzTG9hZCkgeworICBpZiAoRGlzYWJsZVJlTWF0KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIXRpaV8tPmlzVHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZShNSSwgYWFfKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVGFyZ2V0LXNwZWNpZmljIGNvZGUgY2FuIG1hcmsgYW4gaW5zdHJ1Y3Rpb24gYXMgYmVpbmcgcmVtYXRlcmlhbGl6YWJsZQorICAvLyBpZiBpdCBoYXMgb25lIHZpcnR1YWwgcmVnIHVzZSwgdGhvdWdoIGl0IGhhZCBiZXR0ZXIgYmUgc29tZXRoaW5nIGxpa2UKKyAgLy8gYSBQSUMgYmFzZSByZWdpc3RlciB3aGljaCBpcyBsaWtlbHkgdG8gYmUgbGl2ZSBldmVyeXdoZXJlLgorICB1bnNpZ25lZCBJbXBVc2UgPSBnZXRSZU1hdEltcGxpY2l0VXNlKGxpLCBNSSk7CisgIGlmIChJbXBVc2UpIHsKKyAgICBjb25zdCBMaXZlSW50ZXJ2YWwgJkltcExpID0gZ2V0SW50ZXJ2YWwoSW1wVXNlKTsKKyAgICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9ub2RiZ19pdGVyYXRvcgorICAgICAgICAgICByaSA9IG1yaV8tPnVzZV9ub2RiZ19iZWdpbihsaS5yZWcpLCByZSA9IG1yaV8tPnVzZV9ub2RiZ19lbmQoKTsKKyAgICAgICAgIHJpICE9IHJlOyArK3JpKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gJipyaTsKKyAgICAgIFNsb3RJbmRleCBVc2VJZHggPSBnZXRJbnN0cnVjdGlvbkluZGV4KFVzZU1JKTsKKyAgICAgIGlmIChsaS5GaW5kTGl2ZVJhbmdlQ29udGFpbmluZyhVc2VJZHgpLT52YWxubyAhPSBWYWxObykKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoIWlzVmFsTm9BdmFpbGFibGVBdChJbXBMaSwgTUksIFVzZUlkeCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiBhIHJlZ2lzdGVyIG9wZXJhbmQgb2YgdGhlIHJlLW1hdGVyaWFsaXplZCBpbnN0cnVjdGlvbiBpcyBnb2luZyB0bworICAgIC8vIGJlIHNwaWxsZWQgbmV4dCwgdGhlbiBpdCdzIG5vdCBsZWdhbCB0byByZS1tYXRlcmlhbGl6ZSB0aGlzIGluc3RydWN0aW9uLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTcGlsbElzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoSW1wVXNlID09IFNwaWxsSXNbaV0tPnJlZykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gaXNSZU1hdGVyaWFsaXphYmxlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBkZWZpbml0aW9uIE1JIG9mIHRoZSBzcGVjaWZpZWQKKy8vLyB2YWwjIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwgaXMgcmUtbWF0ZXJpYWxpemFibGUuCitib29sIExpdmVJbnRlcnZhbHM6OmlzUmVNYXRlcmlhbGl6YWJsZShjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVk5JbmZvICpWYWxObywgTWFjaGluZUluc3RyICpNSSkgeworICBTbWFsbFZlY3RvcjxMaXZlSW50ZXJ2YWwqLCA0PiBEdW1teTE7CisgIGJvb2wgRHVtbXkyOworICByZXR1cm4gaXNSZU1hdGVyaWFsaXphYmxlKGxpLCBWYWxObywgTUksIER1bW15MSwgRHVtbXkyKTsKK30KKworLy8vIGlzUmVNYXRlcmlhbGl6YWJsZSAtIFJldHVybnMgdHJ1ZSBpZiBldmVyeSBkZWZpbml0aW9uIG9mIE1JIG9mIGV2ZXJ5CisvLy8gdmFsIyBvZiB0aGUgc3BlY2lmaWVkIGludGVydmFsIGlzIHJlLW1hdGVyaWFsaXphYmxlLgorYm9vbCBMaXZlSW50ZXJ2YWxzOjppc1JlTWF0ZXJpYWxpemFibGUoY29uc3QgTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxMaXZlSW50ZXJ2YWwqPiAmU3BpbGxJcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzTG9hZCkgeworICBpc0xvYWQgPSBmYWxzZTsKKyAgZm9yIChMaXZlSW50ZXJ2YWw6OmNvbnN0X3ZuaV9pdGVyYXRvciBpID0gbGkudm5pX2JlZ2luKCksIGUgPSBsaS52bmlfZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBWTkluZm8gKlZOSSA9ICppOworICAgIGlmIChWTkktPmlzVW51c2VkKCkpCisgICAgICBjb250aW51ZTsgLy8gRGVhZCB2YWwjLgorICAgIC8vIElzIHRoZSBkZWYgZm9yIHRoZSB2YWwjIHJlbWF0ZXJpYWxpemFibGU/CisgICAgaWYgKCFWTkktPmlzRGVmQWNjdXJhdGUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBNYWNoaW5lSW5zdHIgKlJlTWF0RGVmTUkgPSBnZXRJbnN0cnVjdGlvbkZyb21JbmRleChWTkktPmRlZik7CisgICAgYm9vbCBEZWZJc0xvYWQgPSBmYWxzZTsKKyAgICBpZiAoIVJlTWF0RGVmTUkgfHwKKyAgICAgICAgIWlzUmVNYXRlcmlhbGl6YWJsZShsaSwgVk5JLCBSZU1hdERlZk1JLCBTcGlsbElzLCBEZWZJc0xvYWQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlzTG9hZCB8PSBEZWZJc0xvYWQ7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBGaWx0ZXJGb2xkZWRPcHMgLSBGaWx0ZXIgb3V0IHR3by1hZGRyZXNzIHVzZSBvcGVyYW5kcy4gUmV0dXJuCisvLy8gdHJ1ZSBpZiBpdCBmaW5kcyBhbnkgaXNzdWUgd2l0aCB0aGUgb3BlcmFuZHMgdGhhdCBvdWdodCB0byBwcmV2ZW50CisvLy8gZm9sZGluZy4KK3N0YXRpYyBib29sIEZpbHRlckZvbGRlZE9wcyhNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZNUkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+ICZGb2xkT3BzKSB7CisgIE1SSW5mbyA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIE9wSWR4ID0gT3BzW2ldOworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKE9wSWR4KTsKKyAgICAvLyBGSVhNRTogZm9sZCBzdWJyZWcgdXNlLgorICAgIGlmIChNTy5nZXRTdWJSZWcoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChNTy5pc0RlZigpKQorICAgICAgTVJJbmZvIHw9ICh1bnNpZ25lZClWaXJ0UmVnTWFwOjppc01vZDsKKyAgICBlbHNlIHsKKyAgICAgIC8vIEZpbHRlciBvdXQgdHdvLWFkZHJlc3MgdXNlIG9wZXJhbmQocykuCisgICAgICBpZiAoTUktPmlzUmVnVGllZFRvRGVmT3BlcmFuZChPcElkeCkpIHsKKyAgICAgICAgTVJJbmZvID0gVmlydFJlZ01hcDo6aXNNb2RSZWY7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgTVJJbmZvIHw9ICh1bnNpZ25lZClWaXJ0UmVnTWFwOjppc1JlZjsKKyAgICB9CisgICAgRm9sZE9wcy5wdXNoX2JhY2soT3BJZHgpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvLy8gdHJ5Rm9sZE1lbW9yeU9wZXJhbmQgLSBBdHRlbXB0cyB0byBmb2xkIGVpdGhlciBhIHNwaWxsIC8gcmVzdG9yZSBmcm9tCisvLy8gc2xvdCAvIHRvIHJlZyBvciBhbnkgcmVtYXRlcmlhbGl6ZWQgbG9hZCBpbnRvIGl0aCBvcGVyYW5kIG9mIHNwZWNpZmllZAorLy8vIE1JLiBJZiBpdCBpcyBzdWNjZXNzdWwsIE1JIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBNSSBhbmQKKy8vLyByZXR1cm5zIHRydWUuCitib29sIExpdmVJbnRlcnZhbHM6OnRyeUZvbGRNZW1vcnlPcGVyYW5kKE1hY2hpbmVJbnN0ciogJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0UmVnTWFwICZ2cm0sIE1hY2hpbmVJbnN0ciAqRGVmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RJbmRleCBJbnN0cklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTUywgaW50IFNsb3QsIHVuc2lnbmVkIFJlZykgeworICAvLyBJZiBpdCBpcyBhbiBpbXBsaWNpdCBkZWYgaW5zdHJ1Y3Rpb24sIGp1c3QgZGVsZXRlIGl0LgorICBpZiAoTUktPmlzSW1wbGljaXREZWYoKSkgeworICAgIFJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKE1JKTsKKyAgICB2cm0uUmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoTUkpOworICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICArK251bUZvbGRzOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gRmlsdGVyIHRoZSBsaXN0IG9mIG9wZXJhbmQgaW5kZXhlcyB0aGF0IGFyZSB0byBiZSBmb2xkZWQuIEFib3J0IGlmCisgIC8vIGFueSBvcGVyYW5kIHdpbGwgcHJldmVudCBmb2xkaW5nLgorICB1bnNpZ25lZCBNUkluZm8gPSAwOworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMj4gRm9sZE9wczsKKyAgaWYgKEZpbHRlckZvbGRlZE9wcyhNSSwgT3BzLCBNUkluZm8sIEZvbGRPcHMpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBUaGUgb25seSB0aW1lIGl0J3Mgc2FmZSB0byBmb2xkIGludG8gYSB0d28gYWRkcmVzcyBpbnN0cnVjdGlvbiBpcyB3aGVuCisgIC8vIGl0J3MgZm9sZGluZyByZWxvYWQgYW5kIHNwaWxsIGZyb20gLyBpbnRvIGEgc3BpbGwgc3RhY2sgc2xvdC4KKyAgaWYgKERlZk1JICYmIChNUkluZm8gJiBWaXJ0UmVnTWFwOjppc01vZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIE1hY2hpbmVJbnN0ciAqZm1pID0gaXNTUyA/IHRpaV8tPmZvbGRNZW1vcnlPcGVyYW5kKE1JLCBGb2xkT3BzLCBTbG90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aWlfLT5mb2xkTWVtb3J5T3BlcmFuZChNSSwgRm9sZE9wcywgRGVmTUkpOworICBpZiAoZm1pKSB7CisgICAgLy8gUmVtZW1iZXIgdGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBzcGlsbCBzbG90LgorICAgIGlmIChpc1NTKSB2cm0uYWRkU3BpbGxTbG90VXNlKFNsb3QsIGZtaSk7CisKKyAgICAvLyBBdHRlbXB0IHRvIGZvbGQgdGhlIG1lbW9yeSByZWZlcmVuY2UgaW50byB0aGUgaW5zdHJ1Y3Rpb24uIElmCisgICAgLy8gd2UgY2FuIGRvIHRoaXMsIHdlIGRvbid0IG5lZWQgdG8gaW5zZXJ0IHNwaWxsIGNvZGUuCisgICAgaWYgKGlzU1MgJiYgIW1mXy0+Z2V0RnJhbWVJbmZvKCktPmlzSW1tdXRhYmxlT2JqZWN0SW5kZXgoU2xvdCkpCisgICAgICB2cm0udmlydEZvbGRlZChSZWcsIE1JLCBmbWksIChWaXJ0UmVnTWFwOjpNb2RSZWYpTVJJbmZvKTsKKyAgICB2cm0udHJhbnNmZXJTcGlsbFB0cyhNSSwgZm1pKTsKKyAgICB2cm0udHJhbnNmZXJSZXN0b3JlUHRzKE1JLCBmbWkpOworICAgIHZybS50cmFuc2ZlckVtZXJnZW5jeVNwaWxscyhNSSwgZm1pKTsKKyAgICBSZXBsYWNlTWFjaGluZUluc3RySW5NYXBzKE1JLCBmbWkpOworICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBNSSA9IGZtaTsKKyAgICArK251bUZvbGRzOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGNhbkZvbGRNZW1vcnlPcGVyYW5kIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbG9hZCAvIHN0b3JlCisvLy8gZm9sZGluZyBpcyBwb3NzaWJsZS4KK2Jvb2wgTGl2ZUludGVydmFsczo6Y2FuRm9sZE1lbW9yeU9wZXJhbmQoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVNYXQpIGNvbnN0IHsKKyAgLy8gRmlsdGVyIHRoZSBsaXN0IG9mIG9wZXJhbmQgaW5kZXhlcyB0aGF0IGFyZSB0byBiZSBmb2xkZWQuIEFib3J0IGlmCisgIC8vIGFueSBvcGVyYW5kIHdpbGwgcHJldmVudCBmb2xkaW5nLgorICB1bnNpZ25lZCBNUkluZm8gPSAwOworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMj4gRm9sZE9wczsKKyAgaWYgKEZpbHRlckZvbGRlZE9wcyhNSSwgT3BzLCBNUkluZm8sIEZvbGRPcHMpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJdCdzIG9ubHkgbGVnYWwgdG8gcmVtYXQgZm9yIGEgdXNlLCBub3QgYSBkZWYuCisgIGlmIChSZU1hdCAmJiAoTVJJbmZvICYgVmlydFJlZ01hcDo6aXNNb2QpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdGlpXy0+Y2FuRm9sZE1lbW9yeU9wZXJhbmQoTUksIEZvbGRPcHMpOworfQorCitib29sIExpdmVJbnRlcnZhbHM6OmludGVydmFsSXNJbk9uZU1CQihjb25zdCBMaXZlSW50ZXJ2YWwgJmxpKSBjb25zdCB7CisgIExpdmVJbnRlcnZhbDo6UmFuZ2VzOjpjb25zdF9pdGVyYXRvciBpdHIgPSBsaS5yYW5nZXMuYmVnaW4oKTsKKworICBNYWNoaW5lQmFzaWNCbG9jayAqbWJiID0gIGluZGV4ZXNfLT5nZXRNQkJDb3ZlcmluZ1JhbmdlKGl0ci0+c3RhcnQsIGl0ci0+ZW5kKTsKKworICBpZiAobWJiID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoKytpdHI7IGl0ciAhPSBsaS5yYW5nZXMuZW5kKCk7ICsraXRyKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKm1iYjIgPQorICAgICAgaW5kZXhlc18tPmdldE1CQkNvdmVyaW5nUmFuZ2UoaXRyLT5zdGFydCwgaXRyLT5lbmQpOworCisgICAgaWYgKG1iYjIgIT0gbWJiKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyByZXdyaXRlSW1wbGljaXRPcHMgLSBSZXdyaXRlIGltcGxpY2l0IHVzZSBvcGVyYW5kcyBvZiBNSSAoaS5lLiB1c2VzIG9mCisvLy8gaW50ZXJ2YWwgb24gdG8tYmUgcmUtbWF0ZXJpYWxpemVkIG9wZXJhbmRzIG9mIE1JKSB3aXRoIG5ldyByZWdpc3Rlci4KK3ZvaWQgTGl2ZUludGVydmFsczo6cmV3cml0ZUltcGxpY2l0T3BzKGNvbnN0IExpdmVJbnRlcnZhbCAmbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBOZXdWUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlydFJlZ01hcCAmdnJtKSB7CisgIC8vIFRoZXJlIGlzIGFuIGltcGxpY2l0IHVzZS4gVGhhdCBtZWFucyBvbmUgb2YgdGhlIG90aGVyIG9wZXJhbmQgaXMKKyAgLy8gYmVpbmcgcmVtYXQnZWQgYW5kIHRoZSByZW1hdCdlZCBpbnN0cnVjdGlvbiBoYXMgbGkucmVnIGFzIGFuCisgIC8vIHVzZSBvcGVyYW5kLiBNYWtlIHN1cmUgd2UgcmV3cml0ZSB0aGF0IGFzIHdlbGwuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkpCisgICAgICBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBpZiAoUmVnID09IDAgfHwgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghdnJtLmlzUmVNYXRlcmlhbGl6ZWQoUmVnKSkKKyAgICAgIGNvbnRpbnVlOworICAgIE1hY2hpbmVJbnN0ciAqUmVNYXRNSSA9IHZybS5nZXRSZU1hdGVyaWFsaXplZE1JKFJlZyk7CisgICAgTWFjaGluZU9wZXJhbmQgKlVzZU1PID0gUmVNYXRNSS0+ZmluZFJlZ2lzdGVyVXNlT3BlcmFuZChsaS5yZWcpOworICAgIGlmIChVc2VNTykKKyAgICAgIFVzZU1PLT5zZXRSZWcoTmV3VlJlZyk7CisgIH0KK30KKworLy8vIHJld3JpdGVJbnN0cnVjdGlvbkZvclNwaWxscywgcmV3cml0ZUluc3RydWN0aW9uc0ZvclNwaWxscyAtIEhlbHBlciBmdW5jdGlvbnMKKy8vLyBmb3IgYWRkSW50ZXJ2YWxzRm9yU3BpbGxzIHRvIHJld3JpdGUgdXNlcyAvIGRlZnMgZm9yIHRoZSBnaXZlbiBsaXZlIHJhbmdlLgorYm9vbCBMaXZlSW50ZXJ2YWxzOjoKK3Jld3JpdGVJbnN0cnVjdGlvbkZvclNwaWxscyhjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLCBjb25zdCBWTkluZm8gKlZOSSwKKyAgICAgICAgICAgICAgICAgYm9vbCBUcnlTcGxpdCwgU2xvdEluZGV4IGluZGV4LCBTbG90SW5kZXggZW5kLCAKKyAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpSZU1hdE9yaWdEZWZNSSwgTWFjaGluZUluc3RyICpSZU1hdERlZk1JLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTbG90LCBpbnQgTGRTbG90LAorICAgICAgICAgICAgICAgICBib29sIGlzTG9hZCwgYm9vbCBpc0xvYWRTUywgYm9vbCBEZWZJc1JlTWF0LCBib29sIENhbkRlbGV0ZSwKKyAgICAgICAgICAgICAgICAgVmlydFJlZ01hcCAmdnJtLAorICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiByYywKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8aW50LCA0PiAmUmVNYXRJZHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAqbG9vcEluZm8sCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOZXdWUmVnLCB1bnNpZ25lZCBJbXBVc2UsIGJvb2wgJkhhc0RlZiwgYm9vbCAmSGFzVXNlLAorICAgICAgICAgICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCx1bnNpZ25lZD4gJk1CQlZSZWdzTWFwLAorICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiAmTmV3TElzKSB7CisgIGJvb2wgQ2FuRm9sZCA9IGZhbHNlOworIFJlc3RhcnRJbnN0cnVjdGlvbjoKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQmIG1vcCA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghbW9wLmlzUmVnKCkpCisgICAgICBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBtb3AuZ2V0UmVnKCk7CisgICAgaWYgKFJlZyA9PSAwIHx8IFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoUmVnICE9IGxpLnJlZykKKyAgICAgIGNvbnRpbnVlOworCisgICAgYm9vbCBUcnlGb2xkID0gIURlZklzUmVNYXQ7CisgICAgYm9vbCBGb2xkU1MgPSB0cnVlOyAvLyBEZWZhdWx0IGJlaGF2aW9yIHVubGVzcyBpdCdzIGEgcmVtYXQuCisgICAgaW50IEZvbGRTbG90ID0gU2xvdDsKKyAgICBpZiAoRGVmSXNSZU1hdCkgeworICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgcmVtYXRlcmlhbGl6YWJsZSBkZWZpbml0aW9uIE1JIGl0c2VsZiBhbmQKKyAgICAgIC8vIGFsbCBvZiBpdHMgdXNlcyBhcmUgcmVtYXRlcmlhbGl6ZWQsIHNpbXBseSBkZWxldGUgaXQuCisgICAgICBpZiAoTUkgPT0gUmVNYXRPcmlnRGVmTUkgJiYgQ2FuRGVsZXRlKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdFx0XHRFcmFzaW5nIHJlLW1hdGVyaWFsaXphYmxlIGRlZjogIgorICAgICAgICAgICAgICAgICAgICAgPDwgKk1JIDw8ICdcbicpOworICAgICAgICBSZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhNSSk7CisgICAgICAgIHZybS5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhNSSk7CisgICAgICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIElmIGRlZiBmb3IgdGhpcyB1c2UgY2FuJ3QgYmUgcmVtYXRlcmlhbGl6ZWQsIHRoZW4gdHJ5IGZvbGRpbmcuCisgICAgICAvLyBJZiBkZWYgaXMgcmVtYXRlcmlhbGl6YWJsZSBhbmQgaXQncyBhIGxvYWQsIGFsc28gdHJ5IGZvbGRpbmcuCisgICAgICBUcnlGb2xkID0gIVJlTWF0RGVmTUkgfHwgKFJlTWF0RGVmTUkgJiYgKE1JID09IFJlTWF0T3JpZ0RlZk1JIHx8IGlzTG9hZCkpOworICAgICAgaWYgKGlzTG9hZCkgeworICAgICAgICAvLyBUcnkgZm9sZCBsb2FkcyAoZnJvbSBzdGFjayBzbG90LCBjb25zdGFudCBwb29sLCBldGMuKSBpbnRvIHVzZXMuCisgICAgICAgIEZvbGRTUyA9IGlzTG9hZFNTOworICAgICAgICBGb2xkU2xvdCA9IExkU2xvdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTY2FuIGFsbCBvZiB0aGUgb3BlcmFuZHMgb2YgdGhpcyBpbnN0cnVjdGlvbiByZXdyaXRpbmcgb3BlcmFuZHMKKyAgICAvLyB0byB1c2UgTmV3VlJlZyBpbnN0ZWFkIG9mIGxpLnJlZyBhcyBhcHByb3ByaWF0ZS4gIFdlIGRvIHRoaXMgZm9yCisgICAgLy8gdHdvIHJlYXNvbnM6CisgICAgLy8KKyAgICAvLyAgIDEuIElmIHRoZSBpbnN0ciByZWFkcyB0aGUgc2FtZSBzcGlsbGVkIHZyZWcgbXVsdGlwbGUgdGltZXMsIHdlCisgICAgLy8gICAgICB3YW50IHRvIHJldXNlIHRoZSBOZXdWUmVnLgorICAgIC8vICAgMi4gSWYgdGhlIGluc3RyIGlzIGEgdHdvLWFkZHIgaW5zdHJ1Y3Rpb24sIHdlIGFyZSByZXF1aXJlZCB0bworICAgIC8vICAgICAga2VlcCB0aGUgc3JjL2RzdCByZWdzIHBpbm5lZC4KKyAgICAvLworICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSByZXBsYWNlIGEgdXNlIGFuZC9vciBkZWYgc28gdGhhdCB3ZSBjYW4KKyAgICAvLyBjcmVhdGUgdGhlIHNwaWxsIGludGVydmFsIHdpdGggdGhlIGFwcHJvcHJpYXRlIHJhbmdlLiAKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMj4gT3BzOworICAgIHRpZShIYXNVc2UsIEhhc0RlZikgPSBNSS0+cmVhZHNXcml0ZXNWaXJ0dWFsUmVnaXN0ZXIoUmVnLCAmT3BzKTsKKworICAgIC8vIENyZWF0ZSBhIG5ldyB2aXJ0dWFsIHJlZ2lzdGVyIGZvciB0aGUgc3BpbGwgaW50ZXJ2YWwuCisgICAgLy8gQ3JlYXRlIHRoZSBuZXcgcmVnaXN0ZXIgbm93IHNvIHdlIGNhbiBtYXAgdGhlIGZvbGQgaW5zdHJ1Y3Rpb24KKyAgICAvLyB0byB0aGUgbmV3IHJlZ2lzdGVyIHNvIHdoZW4gaXQgaXMgdW5mb2xkZWQgd2UgZ2V0IHRoZSBjb3JyZWN0CisgICAgLy8gYW5zd2VyLgorICAgIGJvb2wgQ3JlYXRlZE5ld1ZSZWcgPSBmYWxzZTsKKyAgICBpZiAoTmV3VlJlZyA9PSAwKSB7CisgICAgICBOZXdWUmVnID0gbXJpXy0+Y3JlYXRlVmlydHVhbFJlZ2lzdGVyKHJjKTsKKyAgICAgIHZybS5ncm93KCk7CisgICAgICBDcmVhdGVkTmV3VlJlZyA9IHRydWU7CisKKyAgICAgIC8vIFRoZSBuZXcgdmlydHVhbCByZWdpc3RlciBzaG91bGQgZ2V0IHRoZSBzYW1lIGFsbG9jYXRpb24gaGludHMgYXMgdGhlCisgICAgICAvLyBvbGQgb25lLgorICAgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gSGludCA9IG1yaV8tPmdldFJlZ0FsbG9jYXRpb25IaW50KFJlZyk7CisgICAgICBpZiAoSGludC5maXJzdCB8fCBIaW50LnNlY29uZCkKKyAgICAgICAgbXJpXy0+c2V0UmVnQWxsb2NhdGlvbkhpbnQoTmV3VlJlZywgSGludC5maXJzdCwgSGludC5zZWNvbmQpOworICAgIH0KKworICAgIGlmICghVHJ5Rm9sZCkKKyAgICAgIENhbkZvbGQgPSBmYWxzZTsKKyAgICBlbHNlIHsKKyAgICAgIC8vIERvIG5vdCBmb2xkIGxvYWQgLyBzdG9yZSBoZXJlIGlmIHdlIGFyZSBzcGxpdHRpbmcuIFdlJ2xsIGZpbmQgYW4KKyAgICAgIC8vIG9wdGltYWwgcG9pbnQgdG8gaW5zZXJ0IGEgbG9hZCAvIHN0b3JlIGxhdGVyLgorICAgICAgaWYgKCFUcnlTcGxpdCkgeworICAgICAgICBpZiAodHJ5Rm9sZE1lbW9yeU9wZXJhbmQoTUksIHZybSwgUmVNYXREZWZNSSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsIEZvbGRTUywgRm9sZFNsb3QsIE5ld1ZSZWcpKSB7CisgICAgICAgICAgLy8gRm9sZGluZyB0aGUgbG9hZC9zdG9yZSBjYW4gY29tcGxldGVseSBjaGFuZ2UgdGhlIGluc3RydWN0aW9uIGluCisgICAgICAgICAgLy8gdW5wcmVkaWN0YWJsZSB3YXlzLCByZXNjYW4gaXQgZnJvbSB0aGUgYmVnaW5uaW5nLgorCisgICAgICAgICAgaWYgKEZvbGRTUykgeworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBnaXZlIHRoZSBuZXcgdnJlZyB0aGUgc2FtZSBzdGFjayBzbG90IGFzIHRoZQorICAgICAgICAgICAgLy8gc3BpbGxlZCBpbnRlcnZhbC4KKyAgICAgICAgICAgIHZybS5hc3NpZ25WaXJ0MlN0YWNrU2xvdChOZXdWUmVnLCBGb2xkU2xvdCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgSGFzVXNlID0gZmFsc2U7CisgICAgICAgICAgSGFzRGVmID0gZmFsc2U7CisgICAgICAgICAgQ2FuRm9sZCA9IGZhbHNlOworICAgICAgICAgIGlmIChpc05vdEluTUlNYXAoTUkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZ290byBSZXN0YXJ0SW5zdHJ1Y3Rpb247CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdlJ2xsIHRyeSB0byBmb2xkIGl0IGxhdGVyIGlmIGl0J3MgcHJvZml0YWJsZS4KKyAgICAgICAgQ2FuRm9sZCA9IGNhbkZvbGRNZW1vcnlPcGVyYW5kKE1JLCBPcHMsIERlZklzUmVNYXQpOworICAgICAgfQorICAgIH0KKworICAgIG1vcC5zZXRSZWcoTmV3VlJlZyk7CisgICAgaWYgKG1vcC5pc0ltcGxpY2l0KCkpCisgICAgICByZXdyaXRlSW1wbGljaXRPcHMobGksIE1JLCBOZXdWUmVnLCB2cm0pOworCisgICAgLy8gUmV1c2UgTmV3VlJlZyBmb3Igb3RoZXIgcmVhZHMuCisgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZSA9IE9wcy5zaXplKCk7IGogIT0gZTsgKytqKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmbW9waiA9IE1JLT5nZXRPcGVyYW5kKE9wc1tqXSk7CisgICAgICBtb3BqLnNldFJlZyhOZXdWUmVnKTsKKyAgICAgIGlmIChtb3BqLmlzSW1wbGljaXQoKSkKKyAgICAgICAgcmV3cml0ZUltcGxpY2l0T3BzKGxpLCBNSSwgTmV3VlJlZywgdnJtKTsKKyAgICB9CisgICAgICAgICAgICAKKyAgICBpZiAoQ3JlYXRlZE5ld1ZSZWcpIHsKKyAgICAgIGlmIChEZWZJc1JlTWF0KSB7CisgICAgICAgIHZybS5zZXRWaXJ0SXNSZU1hdGVyaWFsaXplZChOZXdWUmVnLCBSZU1hdERlZk1JKTsKKyAgICAgICAgaWYgKFJlTWF0SWRzW1ZOSS0+aWRdID09IFZpcnRSZWdNYXA6Ok1BWF9TVEFDS19TTE9UKSB7CisgICAgICAgICAgLy8gRWFjaCB2YWxudW0gbWF5IGhhdmUgaXRzIG93biByZW1hdCBpZC4KKyAgICAgICAgICBSZU1hdElkc1tWTkktPmlkXSA9IHZybS5hc3NpZ25WaXJ0UmVNYXRJZChOZXdWUmVnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2cm0uYXNzaWduVmlydFJlTWF0SWQoTmV3VlJlZywgUmVNYXRJZHNbVk5JLT5pZF0pOworICAgICAgICB9CisgICAgICAgIGlmICghQ2FuRGVsZXRlIHx8IChIYXNVc2UgJiYgSGFzRGVmKSkgeworICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSB0d28tYWRkciBpbnN0cnVjdGlvbiB0aGVuIGl0cyB1c2Ugb3BlcmFuZHMgYXJlCisgICAgICAgICAgLy8gcmVtYXRlcmlhbGl6YWJsZSBidXQgaXRzIGRlZiBpcyBub3QuIEl0IHNob3VsZCBiZSBhc3NpZ25lZCBhCisgICAgICAgICAgLy8gc3RhY2sgc2xvdC4KKyAgICAgICAgICB2cm0uYXNzaWduVmlydDJTdGFja1Nsb3QoTmV3VlJlZywgU2xvdCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZybS5hc3NpZ25WaXJ0MlN0YWNrU2xvdChOZXdWUmVnLCBTbG90KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEhhc1VzZSAmJiBIYXNEZWYgJiYKKyAgICAgICAgICAgICAgIHZybS5nZXRTdGFja1Nsb3QoTmV3VlJlZykgPT0gVmlydFJlZ01hcDo6Tk9fU1RBQ0tfU0xPVCkgeworICAgICAgLy8gSWYgdGhpcyBpbnRlcnZhbCBoYXNuJ3QgYmVlbiBhc3NpZ25lZCBhIHN0YWNrIHNsb3QgKGJlY2F1c2UgZWFybGllcgorICAgICAgLy8gZGVmIGlzIGEgZGVsZXRlZCByZW1hdCBkZWYpLCBkbyBpdCBub3cuCisgICAgICBhc3NlcnQoU2xvdCAhPSBWaXJ0UmVnTWFwOjpOT19TVEFDS19TTE9UKTsKKyAgICAgIHZybS5hc3NpZ25WaXJ0MlN0YWNrU2xvdChOZXdWUmVnLCBTbG90KTsKKyAgICB9CisKKyAgICAvLyBSZS1tYXR0aW5nIGFuIGluc3RydWN0aW9uIHdpdGggdmlydHVhbCByZWdpc3RlciB1c2UuIEFkZCB0aGUKKyAgICAvLyByZWdpc3RlciBhcyBhbiBpbXBsaWNpdCB1c2Ugb24gdGhlIHVzZSBNSS4KKyAgICBpZiAoRGVmSXNSZU1hdCAmJiBJbXBVc2UpCisgICAgICBNSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKEltcFVzZSwgZmFsc2UsIHRydWUpKTsKKworICAgIC8vIENyZWF0ZSBhIG5ldyByZWdpc3RlciBpbnRlcnZhbCBmb3IgdGhpcyBzcGlsbCAvIHJlbWF0LgorICAgIExpdmVJbnRlcnZhbCAmbkkgPSBnZXRPckNyZWF0ZUludGVydmFsKE5ld1ZSZWcpOworICAgIGlmIChDcmVhdGVkTmV3VlJlZykgeworICAgICAgTmV3TElzLnB1c2hfYmFjaygmbkkpOworICAgICAgTUJCVlJlZ3NNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE1JLT5nZXRQYXJlbnQoKS0+Z2V0TnVtYmVyKCksIE5ld1ZSZWcpKTsKKyAgICAgIGlmIChUcnlTcGxpdCkKKyAgICAgICAgdnJtLnNldElzU3BsaXRGcm9tUmVnKE5ld1ZSZWcsIGxpLnJlZyk7CisgICAgfQorCisgICAgaWYgKEhhc1VzZSkgeworICAgICAgaWYgKENyZWF0ZWROZXdWUmVnKSB7CisgICAgICAgIExpdmVSYW5nZSBMUihpbmRleC5nZXRMb2FkSW5kZXgoKSwgaW5kZXguZ2V0RGVmSW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgIG5JLmdldE5leHRWYWx1ZShTbG90SW5kZXgoKSwgMCwgZmFsc2UsIFZOSW5mb0FsbG9jYXRvcikpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiArIiA8PCBMUik7CisgICAgICAgIG5JLmFkZFJhbmdlKExSKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEV4dGVuZCB0aGUgc3BsaXQgbGl2ZSBpbnRlcnZhbCB0byB0aGlzIGRlZiAvIHVzZS4KKyAgICAgICAgU2xvdEluZGV4IEVuZCA9IGluZGV4LmdldERlZkluZGV4KCk7CisgICAgICAgIExpdmVSYW5nZSBMUihuSS5yYW5nZXNbbkkucmFuZ2VzLnNpemUoKS0xXS5lbmQsIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgIG5JLmdldFZhbE51bUluZm8obkkuZ2V0TnVtVmFsTnVtcygpLTEpKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgKyIgPDwgTFIpOworICAgICAgICBuSS5hZGRSYW5nZShMUik7CisgICAgICB9CisgICAgfQorICAgIGlmIChIYXNEZWYpIHsKKyAgICAgIExpdmVSYW5nZSBMUihpbmRleC5nZXREZWZJbmRleCgpLCBpbmRleC5nZXRTdG9yZUluZGV4KCksCisgICAgICAgICAgICAgICAgICAgbkkuZ2V0TmV4dFZhbHVlKFNsb3RJbmRleCgpLCAwLCBmYWxzZSwgVk5JbmZvQWxsb2NhdG9yKSk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIiArIiA8PCBMUik7CisgICAgICBuSS5hZGRSYW5nZShMUik7CisgICAgfQorCisgICAgREVCVUcoeworICAgICAgICBkYmdzKCkgPDwgIlx0XHRcdFx0QWRkZWQgbmV3IGludGVydmFsOiAiOworICAgICAgICBuSS5wcmludChkYmdzKCksIHRyaV8pOworICAgICAgICBkYmdzKCkgPDwgJ1xuJzsKKyAgICAgIH0pOworICB9CisgIHJldHVybiBDYW5Gb2xkOworfQorYm9vbCBMaXZlSW50ZXJ2YWxzOjphbnlLaWxsSW5NQkJBZnRlcklkeChjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWTkluZm8gKlZOSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IElkeCkgY29uc3QgeworICByZXR1cm4gbGkua2lsbGVkSW5SYW5nZShJZHguZ2V0TmV4dFNsb3QoKSwgZ2V0TUJCRW5kSWR4KE1CQikpOworfQorCisvLy8gUmV3cml0ZUluZm8gLSBLZWVwIHRyYWNrIG9mIG1hY2hpbmUgaW5zdHJzIHRoYXQgd2lsbCBiZSByZXdyaXR0ZW4KKy8vLyBkdXJpbmcgc3BpbGxpbmcuCituYW1lc3BhY2UgeworICBzdHJ1Y3QgUmV3cml0ZUluZm8geworICAgIFNsb3RJbmRleCBJbmRleDsKKyAgICBNYWNoaW5lSW5zdHIgKk1JOworICAgIFJld3JpdGVJbmZvKFNsb3RJbmRleCBpLCBNYWNoaW5lSW5zdHIgKm1pKSA6IEluZGV4KGkpLCBNSShtaSkge30KKyAgfTsKKworICBzdHJ1Y3QgUmV3cml0ZUluZm9Db21wYXJlIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmV3cml0ZUluZm8gJkxIUywgY29uc3QgUmV3cml0ZUluZm8gJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIExIUy5JbmRleCA8IFJIUy5JbmRleDsKKyAgICB9CisgIH07Cit9CisKK3ZvaWQgTGl2ZUludGVydmFsczo6CityZXdyaXRlSW5zdHJ1Y3Rpb25zRm9yU3BpbGxzKGNvbnN0IExpdmVJbnRlcnZhbCAmbGksIGJvb2wgVHJ5U3BsaXQsCisgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlcnZhbDo6UmFuZ2VzOjpjb25zdF9pdGVyYXRvciAmSSwKKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpSZU1hdE9yaWdEZWZNSSwgTWFjaGluZUluc3RyICpSZU1hdERlZk1JLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTbG90LCBpbnQgTGRTbG90LAorICAgICAgICAgICAgICAgICAgICBib29sIGlzTG9hZCwgYm9vbCBpc0xvYWRTUywgYm9vbCBEZWZJc1JlTWF0LCBib29sIENhbkRlbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgVmlydFJlZ01hcCAmdnJtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiByYywKKyAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8aW50LCA0PiAmUmVNYXRJZHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAqbG9vcEluZm8sCisgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmU3BpbGxNQkJzLAorICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp2ZWN0b3I8U1JJbmZvPiA+ICZTcGlsbElkeGVzLAorICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlc3RvcmVNQkJzLAorICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp2ZWN0b3I8U1JJbmZvPiA+ICZSZXN0b3JlSWR4ZXMsCisgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLHVuc2lnbmVkPiAmTUJCVlJlZ3NNYXAsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+ICZOZXdMSXMpIHsKKyAgYm9vbCBBbGxDYW5Gb2xkID0gdHJ1ZTsKKyAgdW5zaWduZWQgTmV3VlJlZyA9IDA7CisgIFNsb3RJbmRleCBzdGFydCA9IEktPnN0YXJ0LmdldEJhc2VJbmRleCgpOworICBTbG90SW5kZXggZW5kID0gSS0+ZW5kLmdldFByZXZTbG90KCkuZ2V0QmFzZUluZGV4KCkuZ2V0TmV4dEluZGV4KCk7CisKKyAgLy8gRmlyc3QgY29sbGVjdCBhbGwgdGhlIGRlZiAvIHVzZSBpbiB0aGlzIGxpdmUgcmFuZ2UgdGhhdCB3aWxsIGJlIHJld3JpdHRlbi4KKyAgLy8gTWFrZSBzdXJlIHRoZXkgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gaW5zdHJ1Y3Rpb24gaW5kZXguCisgIHN0ZDo6dmVjdG9yPFJld3JpdGVJbmZvPiBSZXdyaXRlTUlzOworICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnJlZ19pdGVyYXRvciByaSA9IG1yaV8tPnJlZ19iZWdpbihsaS5yZWcpLAorICAgICAgICAgcmUgPSBtcmlfLT5yZWdfZW5kKCk7IHJpICE9IHJlOyApIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gJipyaTsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTyA9IHJpLmdldE9wZXJhbmQoKTsKKyAgICArK3JpOworICAgIGlmIChNSS0+aXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICAgIC8vIE1vZGlmeSBEQkdfVkFMVUUgbm93IHRoYXQgdGhlIHZhbHVlIGlzIGluIGEgc3BpbGwgc2xvdC4KKyAgICAgIGlmIChTbG90ICE9IFZpcnRSZWdNYXA6Ok1BWF9TVEFDS19TTE9UIHx8IGlzTG9hZFNTKSB7CisgICAgICAgIHVpbnQ2NF90IE9mZnNldCA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpOworICAgICAgICBjb25zdCBNRE5vZGUgKk1EUHRyID0gTUktPmdldE9wZXJhbmQoMikuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgRGVidWdMb2MgREwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgICAgICAgaW50IEZJID0gaXNMb2FkU1MgPyBMZFNsb3QgOiAoaW50KVNsb3Q7CisgICAgICAgIGlmIChNYWNoaW5lSW5zdHIgKk5ld0RWID0gdGlpXy0+ZW1pdEZyYW1lSW5kZXhEZWJ1Z1ZhbHVlKCptZl8sIEZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsIE1EUHRyLCBETCkpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIk1vZGlmeWluZyBkZWJ1ZyBpbmZvIGR1ZSB0byBzcGlsbDoiIDw8ICJcdCIgPDwgKk1JKTsKKyAgICAgICAgICBSZXBsYWNlTWFjaGluZUluc3RySW5NYXBzKE1JLCBOZXdEVik7CisgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1JLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgICBNQkItPmluc2VydChNQkItPmVyYXNlKE1JKSwgTmV3RFYpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUmVtb3ZpbmcgZGVidWcgaW5mbyBkdWUgdG8gc3BpbGw6IiA8PCAiXHQiIDw8ICpNSSk7CisgICAgICBSZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhNSSk7CisgICAgICB2cm0uUmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoTUkpOworICAgICAgTUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGFzc2VydCghKE8uaXNJbXBsaWNpdCgpICYmIE8uaXNVc2UoKSkgJiYKKyAgICAgICAgICAgIlNwaWxsaW5nIHJlZ2lzdGVyIHRoYXQncyB1c2VkIGFzIGltcGxpY2l0IHVzZT8iKTsKKyAgICBTbG90SW5kZXggaW5kZXggPSBnZXRJbnN0cnVjdGlvbkluZGV4KE1JKTsKKyAgICBpZiAoaW5kZXggPCBzdGFydCB8fCBpbmRleCA+PSBlbmQpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChPLmlzVW5kZWYoKSkKKyAgICAgIC8vIE11c3QgYmUgZGVmaW5lZCBieSBhbiBpbXBsaWNpdCBkZWYuIEl0IHNob3VsZCBub3QgYmUgc3BpbGxlZC4gTm90ZSwKKyAgICAgIC8vIHRoaXMgaXMgZm9yIGNvcnJlY3RuZXNzIHJlYXNvbi4gZS5nLgorICAgICAgLy8gOCAgICVyZWcxMDI0PGRlZj4gPSBJTVBMSUNJVF9ERUYKKyAgICAgIC8vIDEyICAlcmVnMTAyNDxkZWY+ID0gSU5TRVJUX1NVQlJFRyAlcmVnMTAyNDxraWxsPiwgJXJlZzEwMjUsIDIKKyAgICAgIC8vIFRoZSBsaXZlIHJhbmdlIFsxMiwgMTQpIGFyZSBub3QgcGFydCBvZiB0aGUgcjEwMjQgbGl2ZSBpbnRlcnZhbCBzaW5jZQorICAgICAgLy8gaXQncyBkZWZpbmVkIGJ5IGFuIGltcGxpY2l0IGRlZi4gSXQgd2lsbCBub3QgY29uZmxpY3RzIHdpdGggbGl2ZQorICAgICAgLy8gaW50ZXJ2YWwgb2YgcjEwMjUuIE5vdyBzdXBwb3NlIGJvdGggcmVnaXN0ZXJzIGFyZSBzcGlsbGVkLCB5b3UgY2FuCisgICAgICAvLyBlYXNpbHkgc2VlIGEgc2l0dWF0aW9uIHdoZXJlIGJvdGggcmVnaXN0ZXJzIGFyZSByZWxvYWRlZCBiZWZvcmUKKyAgICAgIC8vIHRoZSBJTlNFUlRfU1VCUkVHIGFuZCBib3RoIHRhcmdldCByZWdpc3RlcnMgdGhhdCB3b3VsZCBvdmVybGFwLgorICAgICAgY29udGludWU7CisgICAgUmV3cml0ZU1Jcy5wdXNoX2JhY2soUmV3cml0ZUluZm8oaW5kZXgsIE1JKSk7CisgIH0KKyAgc3RkOjpzb3J0KFJld3JpdGVNSXMuYmVnaW4oKSwgUmV3cml0ZU1Jcy5lbmQoKSwgUmV3cml0ZUluZm9Db21wYXJlKCkpOworCisgIHVuc2lnbmVkIEltcFVzZSA9IERlZklzUmVNYXQgPyBnZXRSZU1hdEltcGxpY2l0VXNlKGxpLCBSZU1hdERlZk1JKSA6IDA7CisgIC8vIE5vdyByZXdyaXRlIHRoZSBkZWZzIGFuZCB1c2VzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmV3cml0ZU1Jcy5zaXplKCk7IGkgIT0gZTsgKSB7CisgICAgUmV3cml0ZUluZm8gJnJ3aSA9IFJld3JpdGVNSXNbaV07CisgICAgKytpOworICAgIFNsb3RJbmRleCBpbmRleCA9IHJ3aS5JbmRleDsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gcndpLk1JOworICAgIC8vIElmIE1JIGRlZiBhbmQvb3IgdXNlIHRoZSBzYW1lIHJlZ2lzdGVyIG11bHRpcGxlIHRpbWVzLCB0aGVuIHRoZXJlCisgICAgLy8gYXJlIG11bHRpcGxlIGVudHJpZXMuCisgICAgd2hpbGUgKGkgIT0gZSAmJiBSZXdyaXRlTUlzW2ldLk1JID09IE1JKSB7CisgICAgICBhc3NlcnQoUmV3cml0ZU1Jc1tpXS5JbmRleCA9PSBpbmRleCk7CisgICAgICArK2k7CisgICAgfQorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNSS0+Z2V0UGFyZW50KCk7CisKKyAgICBpZiAoSW1wVXNlICYmIE1JICE9IFJlTWF0RGVmTUkpIHsKKyAgICAgIC8vIFJlLW1hdHRpbmcgYW4gaW5zdHJ1Y3Rpb24gd2l0aCB2aXJ0dWFsIHJlZ2lzdGVyIHVzZS4gUHJldmVudCBpbnRlcnZhbAorICAgICAgLy8gZnJvbSBiZWluZyBzcGlsbGVkLgorICAgICAgZ2V0SW50ZXJ2YWwoSW1wVXNlKS5tYXJrTm90U3BpbGxhYmxlKCk7CisgICAgfQorCisgICAgdW5zaWduZWQgTUJCSWQgPSBNQkItPmdldE51bWJlcigpOworICAgIHVuc2lnbmVkIFRoaXNWUmVnID0gMDsKKyAgICBpZiAoVHJ5U3BsaXQpIHsKKyAgICAgIERlbnNlTWFwPHVuc2lnbmVkLHVuc2lnbmVkPjo6aXRlcmF0b3IgTlZJID0gTUJCVlJlZ3NNYXAuZmluZChNQkJJZCk7CisgICAgICBpZiAoTlZJICE9IE1CQlZSZWdzTWFwLmVuZCgpKSB7CisgICAgICAgIFRoaXNWUmVnID0gTlZJLT5zZWNvbmQ7CisgICAgICAgIC8vIE9uZSBjb21tb24gY2FzZToKKyAgICAgICAgLy8geCA9IHVzZQorICAgICAgICAvLyAuLi4KKyAgICAgICAgLy8gLi4uCisgICAgICAgIC8vIGRlZiA9IC4uLgorICAgICAgICAvLyAgICAgPSB1c2UKKyAgICAgICAgLy8gSXQncyBiZXR0ZXIgdG8gc3RhcnQgYSBuZXcgaW50ZXJ2YWwgdG8gYXZvaWQgYXJ0aWZpY2FsbHkKKyAgICAgICAgLy8gZXh0ZW5kIHRoZSBuZXcgaW50ZXJ2YWwuCisgICAgICAgIGlmIChNSS0+cmVhZHNXcml0ZXNWaXJ0dWFsUmVnaXN0ZXIobGkucmVnKSA9PQorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoZmFsc2UsdHJ1ZSkpIHsKKyAgICAgICAgICBNQkJWUmVnc01hcC5lcmFzZShNQkItPmdldE51bWJlcigpKTsKKyAgICAgICAgICBUaGlzVlJlZyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBib29sIElzTmV3ID0gVGhpc1ZSZWcgPT0gMDsKKyAgICBpZiAoSXNOZXcpIHsKKyAgICAgIC8vIFRoaXMgZW5kcyB0aGUgcHJldmlvdXMgbGl2ZSBpbnRlcnZhbC4gSWYgYWxsIG9mIGl0cyBkZWYgLyB1c2UKKyAgICAgIC8vIGNhbiBiZSBmb2xkZWQsIGdpdmUgaXQgYSBsb3cgc3BpbGwgd2VpZ2h0LgorICAgICAgaWYgKE5ld1ZSZWcgJiYgVHJ5U3BsaXQgJiYgQWxsQ2FuRm9sZCkgeworICAgICAgICBMaXZlSW50ZXJ2YWwgJm5JID0gZ2V0T3JDcmVhdGVJbnRlcnZhbChOZXdWUmVnKTsKKyAgICAgICAgbkkud2VpZ2h0IC89IDEwLjBGOworICAgICAgfQorICAgICAgQWxsQ2FuRm9sZCA9IHRydWU7CisgICAgfQorICAgIE5ld1ZSZWcgPSBUaGlzVlJlZzsKKworICAgIGJvb2wgSGFzRGVmID0gZmFsc2U7CisgICAgYm9vbCBIYXNVc2UgPSBmYWxzZTsKKyAgICBib29sIENhbkZvbGQgPSByZXdyaXRlSW5zdHJ1Y3Rpb25Gb3JTcGlsbHMobGksIEktPnZhbG5vLCBUcnlTcGxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgZW5kLCBNSSwgUmVNYXRPcmlnRGVmTUksIFJlTWF0RGVmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdCwgTGRTbG90LCBpc0xvYWQsIGlzTG9hZFNTLCBEZWZJc1JlTWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENhbkRlbGV0ZSwgdnJtLCByYywgUmVNYXRJZHMsIGxvb3BJbmZvLCBOZXdWUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgIEltcFVzZSwgSGFzRGVmLCBIYXNVc2UsIE1CQlZSZWdzTWFwLCBOZXdMSXMpOworICAgIGlmICghSGFzRGVmICYmICFIYXNVc2UpCisgICAgICBjb250aW51ZTsKKworICAgIEFsbENhbkZvbGQgJj0gQ2FuRm9sZDsKKworICAgIC8vIFVwZGF0ZSB3ZWlnaHQgb2Ygc3BpbGwgaW50ZXJ2YWwuCisgICAgTGl2ZUludGVydmFsICZuSSA9IGdldE9yQ3JlYXRlSW50ZXJ2YWwoTmV3VlJlZyk7CisgICAgaWYgKCFUcnlTcGxpdCkgeworICAgICAgLy8gVGhlIHNwaWxsIHdlaWdodCBpcyBub3cgaW5maW5pdHkgYXMgaXQgY2Fubm90IGJlIHNwaWxsZWQgYWdhaW4uCisgICAgICBuSS5tYXJrTm90U3BpbGxhYmxlKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGRlZiBhbmQgZmlyc3QgdXNlIGluIGVhY2ggTUJCLgorICAgIGlmIChIYXNEZWYpIHsKKyAgICAgIGlmIChNSSAhPSBSZU1hdE9yaWdEZWZNSSB8fCAhQ2FuRGVsZXRlKSB7CisgICAgICAgIGJvb2wgSGFzS2lsbCA9IGZhbHNlOworICAgICAgICBpZiAoIUhhc1VzZSkKKyAgICAgICAgICBIYXNLaWxsID0gYW55S2lsbEluTUJCQWZ0ZXJJZHgobGksIEktPnZhbG5vLCBNQkIsIGluZGV4LmdldERlZkluZGV4KCkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgdHdvLWFkZHJlc3MgY29kZSwgdGhlbiB0aGlzIGluZGV4IHN0YXJ0cyBhIG5ldyBWTkluZm8uCisgICAgICAgICAgY29uc3QgVk5JbmZvICpWTkkgPSBsaS5maW5kRGVmaW5lZFZOSW5mb0ZvclJlZ0ludChpbmRleC5nZXREZWZJbmRleCgpKTsKKyAgICAgICAgICBpZiAoVk5JKQorICAgICAgICAgICAgSGFzS2lsbCA9IGFueUtpbGxJbk1CQkFmdGVySWR4KGxpLCBWTkksIE1CQiwgaW5kZXguZ2V0RGVmSW5kZXgoKSk7CisgICAgICAgIH0KKyAgICAgICAgRGVuc2VNYXA8dW5zaWduZWQsIHN0ZDo6dmVjdG9yPFNSSW5mbz4gPjo6aXRlcmF0b3IgU0lJID0KKyAgICAgICAgICBTcGlsbElkeGVzLmZpbmQoTUJCSWQpOworICAgICAgICBpZiAoIUhhc0tpbGwpIHsKKyAgICAgICAgICBpZiAoU0lJID09IFNwaWxsSWR4ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNSSW5mbz4gUzsKKyAgICAgICAgICAgIFMucHVzaF9iYWNrKFNSSW5mbyhpbmRleCwgTmV3VlJlZywgdHJ1ZSkpOworICAgICAgICAgICAgU3BpbGxJZHhlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTUJCSWQsIFMpKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKFNJSS0+c2Vjb25kLmJhY2soKS52cmVnICE9IE5ld1ZSZWcpIHsKKyAgICAgICAgICAgIFNJSS0+c2Vjb25kLnB1c2hfYmFjayhTUkluZm8oaW5kZXgsIE5ld1ZSZWcsIHRydWUpKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID4gU0lJLT5zZWNvbmQuYmFjaygpLmluZGV4KSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBlYXJsaWVyIGRlZiBhbmQgdGhpcyBpcyBhIHR3by1hZGRyZXNzCisgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbiwgdGhlbiBpdCdzIG5vdCBwb3NzaWJsZSB0byBmb2xkIHRoZSBzdG9yZSAod2hpY2gKKyAgICAgICAgICAgIC8vIHdvdWxkIGFsc28gZm9sZCB0aGUgbG9hZCkuCisgICAgICAgICAgICBTUkluZm8gJkluZm8gPSBTSUktPnNlY29uZC5iYWNrKCk7CisgICAgICAgICAgICBJbmZvLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICBJbmZvLmNhbkZvbGQgPSAhSGFzVXNlOworICAgICAgICAgIH0KKyAgICAgICAgICBTcGlsbE1CQnMuc2V0KE1CQklkKTsKKyAgICAgICAgfSBlbHNlIGlmIChTSUkgIT0gU3BpbGxJZHhlcy5lbmQoKSAmJgorICAgICAgICAgICAgICAgICAgIFNJSS0+c2Vjb25kLmJhY2soKS52cmVnID09IE5ld1ZSZWcgJiYKKyAgICAgICAgICAgICAgICAgICBpbmRleCA+IFNJSS0+c2Vjb25kLmJhY2soKS5pbmRleCkgeworICAgICAgICAgIC8vIFRoZXJlIGlzIGFuIGVhcmxpZXIgZGVmIHRoYXQncyBub3Qga2lsbGVkIChtdXN0IGJlIHR3by1hZGRyZXNzKS4KKyAgICAgICAgICAvLyBUaGUgc3BpbGwgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgICAgICBTSUktPnNlY29uZC5wb3BfYmFjaygpOworICAgICAgICAgIGlmIChTSUktPnNlY29uZC5lbXB0eSgpKSB7CisgICAgICAgICAgICBTcGlsbElkeGVzLmVyYXNlKE1CQklkKTsKKyAgICAgICAgICAgIFNwaWxsTUJCcy5yZXNldChNQkJJZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEhhc1VzZSkgeworICAgICAgRGVuc2VNYXA8dW5zaWduZWQsIHN0ZDo6dmVjdG9yPFNSSW5mbz4gPjo6aXRlcmF0b3IgU0lJID0KKyAgICAgICAgU3BpbGxJZHhlcy5maW5kKE1CQklkKTsKKyAgICAgIGlmIChTSUkgIT0gU3BpbGxJZHhlcy5lbmQoKSAmJgorICAgICAgICAgIFNJSS0+c2Vjb25kLmJhY2soKS52cmVnID09IE5ld1ZSZWcgJiYKKyAgICAgICAgICBpbmRleCA+IFNJSS0+c2Vjb25kLmJhY2soKS5pbmRleCkKKyAgICAgICAgLy8gVXNlKHMpIGZvbGxvd2luZyB0aGUgbGFzdCBkZWYsIGl0J3Mgbm90IHNhZmUgdG8gZm9sZCB0aGUgc3BpbGwuCisgICAgICAgIFNJSS0+c2Vjb25kLmJhY2soKS5jYW5Gb2xkID0gZmFsc2U7CisgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp2ZWN0b3I8U1JJbmZvPiA+OjppdGVyYXRvciBSSUkgPQorICAgICAgICBSZXN0b3JlSWR4ZXMuZmluZChNQkJJZCk7CisgICAgICBpZiAoUklJICE9IFJlc3RvcmVJZHhlcy5lbmQoKSAmJiBSSUktPnNlY29uZC5iYWNrKCkudnJlZyA9PSBOZXdWUmVnKQorICAgICAgICAvLyBJZiB3ZSBhcmUgc3BsaXR0aW5nIGxpdmUgaW50ZXJ2YWxzLCBvbmx5IGZvbGQgaWYgaXQncyB0aGUgZmlyc3QKKyAgICAgICAgLy8gdXNlIGFuZCB0aGVyZSBpc24ndCBhbm90aGVyIHVzZSBsYXRlciBpbiB0aGUgTUJCLgorICAgICAgICBSSUktPnNlY29uZC5iYWNrKCkuY2FuRm9sZCA9IGZhbHNlOworICAgICAgZWxzZSBpZiAoSXNOZXcpIHsKKyAgICAgICAgLy8gT25seSBuZWVkIGEgcmVsb2FkIGlmIHRoZXJlIGlzbid0IGFuIGVhcmxpZXIgZGVmIC8gdXNlLgorICAgICAgICBpZiAoUklJID09IFJlc3RvcmVJZHhlcy5lbmQoKSkgeworICAgICAgICAgIHN0ZDo6dmVjdG9yPFNSSW5mbz4gSW5mb3M7CisgICAgICAgICAgSW5mb3MucHVzaF9iYWNrKFNSSW5mbyhpbmRleCwgTmV3VlJlZywgdHJ1ZSkpOworICAgICAgICAgIFJlc3RvcmVJZHhlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTUJCSWQsIEluZm9zKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgUklJLT5zZWNvbmQucHVzaF9iYWNrKFNSSW5mbyhpbmRleCwgTmV3VlJlZywgdHJ1ZSkpOworICAgICAgICB9CisgICAgICAgIFJlc3RvcmVNQkJzLnNldChNQkJJZCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVXBkYXRlIHNwaWxsIHdlaWdodC4KKyAgICB1bnNpZ25lZCBsb29wRGVwdGggPSBsb29wSW5mby0+Z2V0TG9vcERlcHRoKE1CQik7CisgICAgbkkud2VpZ2h0ICs9IGdldFNwaWxsV2VpZ2h0KEhhc0RlZiwgSGFzVXNlLCBsb29wRGVwdGgpOworICB9CisKKyAgaWYgKE5ld1ZSZWcgJiYgVHJ5U3BsaXQgJiYgQWxsQ2FuRm9sZCkgeworICAgIC8vIElmIGFsbCBvZiBpdHMgZGVmIC8gdXNlIGNhbiBiZSBmb2xkZWQsIGdpdmUgaXQgYSBsb3cgc3BpbGwgd2VpZ2h0LgorICAgIExpdmVJbnRlcnZhbCAmbkkgPSBnZXRPckNyZWF0ZUludGVydmFsKE5ld1ZSZWcpOworICAgIG5JLndlaWdodCAvPSAxMC4wRjsKKyAgfQorfQorCitib29sIExpdmVJbnRlcnZhbHM6OmFsc29Gb2xkQVJlc3RvcmUoaW50IElkLCBTbG90SW5kZXggaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB2ciwgQml0VmVjdG9yICZSZXN0b3JlTUJCcywKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLHN0ZDo6dmVjdG9yPFNSSW5mbz4gPiAmUmVzdG9yZUlkeGVzKSB7CisgIGlmICghUmVzdG9yZU1CQnNbSWRdKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3RkOjp2ZWN0b3I8U1JJbmZvPiAmUmVzdG9yZXMgPSBSZXN0b3JlSWR4ZXNbSWRdOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVzdG9yZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoUmVzdG9yZXNbaV0uaW5kZXggPT0gaW5kZXggJiYKKyAgICAgICAgUmVzdG9yZXNbaV0udnJlZyA9PSB2ciAmJgorICAgICAgICBSZXN0b3Jlc1tpXS5jYW5Gb2xkKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBMaXZlSW50ZXJ2YWxzOjplcmFzZVJlc3RvcmVJbmZvKGludCBJZCwgU2xvdEluZGV4IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdnIsIEJpdFZlY3RvciAmUmVzdG9yZU1CQnMsCisgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCxzdGQ6OnZlY3RvcjxTUkluZm8+ID4gJlJlc3RvcmVJZHhlcykgeworICBpZiAoIVJlc3RvcmVNQkJzW0lkXSkKKyAgICByZXR1cm47CisgIHN0ZDo6dmVjdG9yPFNSSW5mbz4gJlJlc3RvcmVzID0gUmVzdG9yZUlkeGVzW0lkXTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlc3RvcmVzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFJlc3RvcmVzW2ldLmluZGV4ID09IGluZGV4ICYmIFJlc3RvcmVzW2ldLnZyZWcpCisgICAgICBSZXN0b3Jlc1tpXS5pbmRleCA9IFNsb3RJbmRleCgpOworfQorCisvLy8gaGFuZGxlU3BpbGxlZEltcERlZnMgLSBSZW1vdmUgSU1QTElDSVRfREVGIGluc3RydWN0aW9ucyB3aGljaCBhcmUgYmVpbmcKKy8vLyBzcGlsbGVkIGFuZCBjcmVhdGUgZW1wdHkgaW50ZXJ2YWxzIGZvciB0aGVpciB1c2VzLgordm9pZAorTGl2ZUludGVydmFsczo6aGFuZGxlU3BpbGxlZEltcERlZnMoY29uc3QgTGl2ZUludGVydmFsICZsaSwgVmlydFJlZ01hcCAmdnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiAmTmV3TElzKSB7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6cmVnX2l0ZXJhdG9yIHJpID0gbXJpXy0+cmVnX2JlZ2luKGxpLnJlZyksCisgICAgICAgICByZSA9IG1yaV8tPnJlZ19lbmQoKTsgcmkgIT0gcmU7ICkgeworICAgIE1hY2hpbmVPcGVyYW5kICZPID0gcmkuZ2V0T3BlcmFuZCgpOworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSAmKnJpOworICAgICsrcmk7CisgICAgaWYgKE1JLT5pc0RlYnVnVmFsdWUoKSkgeworICAgICAgLy8gUmVtb3ZlIGRlYnVnIGluZm8gZm9yIG5vdy4KKyAgICAgIE8uc2V0UmVnKDBVKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUmVtb3ZpbmcgZGVidWcgaW5mbyBkdWUgdG8gc3BpbGw6IiA8PCAiXHQiIDw8ICpNSSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKE8uaXNEZWYoKSkgeworICAgICAgYXNzZXJ0KE1JLT5pc0ltcGxpY2l0RGVmKCkgJiYKKyAgICAgICAgICAgICAiUmVnaXN0ZXIgZGVmIHdhcyBub3QgcmV3cml0dGVuPyIpOworICAgICAgUmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoTUkpOworICAgICAgdnJtLlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKE1JKTsKKyAgICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhpcyBtdXN0IGJlIGFuIHVzZSBvZiBhbiBpbXBsaWNpdF9kZWYgc28gaXQncyBub3QgcGFydCBvZiB0aGUgbGl2ZQorICAgICAgLy8gaW50ZXJ2YWwuIENyZWF0ZSBhIG5ldyBlbXB0eSBsaXZlIGludGVydmFsIGZvciBpdC4KKyAgICAgIC8vIEZJWE1FOiBDYW4gd2Ugc2ltcGx5IGVyYXNlIHNvbWUgb2YgdGhlIGluc3RydWN0aW9ucz8gZS5nLiBTdG9yZXM/CisgICAgICB1bnNpZ25lZCBOZXdWUmVnID0gbXJpXy0+Y3JlYXRlVmlydHVhbFJlZ2lzdGVyKHJjKTsKKyAgICAgIHZybS5ncm93KCk7CisgICAgICB2cm0uc2V0SXNJbXBsaWNpdGx5RGVmaW5lZChOZXdWUmVnKTsKKyAgICAgIE5ld0xJcy5wdXNoX2JhY2soJmdldE9yQ3JlYXRlSW50ZXJ2YWwoTmV3VlJlZykpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uZ2V0UmVnKCkgPT0gbGkucmVnKSB7CisgICAgICAgICAgTU8uc2V0UmVnKE5ld1ZSZWcpOworICAgICAgICAgIE1PLnNldElzVW5kZWYoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitmbG9hdAorTGl2ZUludGVydmFsczo6Z2V0U3BpbGxXZWlnaHQoYm9vbCBpc0RlZiwgYm9vbCBpc1VzZSwgdW5zaWduZWQgbG9vcERlcHRoKSB7CisgIC8vIExpbWl0IHRoZSBsb29wIGRlcHRoIHJpZGljdWxvdXNuZXNzLgorICBpZiAobG9vcERlcHRoID4gMjAwKQorICAgIGxvb3BEZXB0aCA9IDIwMDsKKworICAvLyBUaGUgbG9vcCBkZXB0aCBpcyB1c2VkIHRvIHJvdWdobHkgZXN0aW1hdGUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUKKyAgLy8gaW5zdHJ1Y3Rpb24gaXMgZXhlY3V0ZWQuIFNvbWV0aGluZyBsaWtlIDEwXmQgaXMgc2ltcGxlLCBidXQgd2lsbCBxdWlja2x5CisgIC8vIG92ZXJmbG93IGEgZmxvYXQuIFRoaXMgZXhwcmVzc2lvbiBiZWhhdmVzIGxpa2UgMTBeZCBmb3Igc21hbGwgZCwgYnV0IGlzCisgIC8vIG1vcmUgdGVtcGVyZWQgZm9yIGxhcmdlIGQuIEF0IGQ9MjAwIHdlIGdldCA2LjdlMzMgd2hpY2ggbGVhdmVzIGEgYml0IG9mCisgIC8vIGhlYWRyb29tIGJlZm9yZSBvdmVyZmxvdy4KKyAgZmxvYXQgbGMgPSBzdGQ6OnBvdygxICsgKDEwMC4wZiAvIChsb29wRGVwdGgrMTApKSwgKGZsb2F0KWxvb3BEZXB0aCk7CisKKyAgcmV0dXJuIChpc0RlZiArIGlzVXNlKSAqIGxjOworfQorCit2b2lkCitMaXZlSW50ZXJ2YWxzOjpub3JtYWxpemVTcGlsbFdlaWdodHMoc3RkOjp2ZWN0b3I8TGl2ZUludGVydmFsKj4gJk5ld0xJcykgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3TElzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgbm9ybWFsaXplU3BpbGxXZWlnaHQoKk5ld0xJc1tpXSk7Cit9CisKK3N0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+IExpdmVJbnRlcnZhbHM6OgorYWRkSW50ZXJ2YWxzRm9yU3BpbGxzKGNvbnN0IExpdmVJbnRlcnZhbCAmbGksCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPExpdmVJbnRlcnZhbCo+ICZTcGlsbElzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAqbG9vcEluZm8sIFZpcnRSZWdNYXAgJnZybSkgeworICBhc3NlcnQobGkuaXNTcGlsbGFibGUoKSAmJiAiYXR0ZW1wdCB0byBzcGlsbCBhbHJlYWR5IHNwaWxsZWQgaW50ZXJ2YWwhIik7CisKKyAgREVCVUcoeworICAgICAgZGJncygpIDw8ICJcdFx0XHRcdGFkZGluZyBpbnRlcnZhbHMgZm9yIHNwaWxscyBmb3IgaW50ZXJ2YWw6ICI7CisgICAgICBsaS5wcmludChkYmdzKCksIHRyaV8pOworICAgICAgZGJncygpIDw8ICdcbic7CisgICAgfSk7CisKKyAgLy8gRWFjaCBiaXQgc3BlY2lmeSB3aGV0aGVyIGEgc3BpbGwgaXMgcmVxdWlyZWQgaW4gdGhlIE1CQi4KKyAgQml0VmVjdG9yIFNwaWxsTUJCcyhtZl8tPmdldE51bUJsb2NrSURzKCkpOworICBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp2ZWN0b3I8U1JJbmZvPiA+IFNwaWxsSWR4ZXM7CisgIEJpdFZlY3RvciBSZXN0b3JlTUJCcyhtZl8tPmdldE51bUJsb2NrSURzKCkpOworICBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp2ZWN0b3I8U1JJbmZvPiA+IFJlc3RvcmVJZHhlczsKKyAgRGVuc2VNYXA8dW5zaWduZWQsdW5zaWduZWQ+IE1CQlZSZWdzTWFwOworICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiBOZXdMSXM7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIHJjID0gbXJpXy0+Z2V0UmVnQ2xhc3MobGkucmVnKTsKKworICB1bnNpZ25lZCBOdW1WYWxOdW1zID0gbGkuZ2V0TnVtVmFsTnVtcygpOworICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBSZU1hdERlZnM7CisgIFJlTWF0RGVmcy5yZXNpemUoTnVtVmFsTnVtcywgTlVMTCk7CisgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDQ+IFJlTWF0T3JpZ0RlZnM7CisgIFJlTWF0T3JpZ0RlZnMucmVzaXplKE51bVZhbE51bXMsIE5VTEwpOworICBTbWFsbFZlY3RvcjxpbnQsIDQ+IFJlTWF0SWRzOworICBSZU1hdElkcy5yZXNpemUoTnVtVmFsTnVtcywgVmlydFJlZ01hcDo6TUFYX1NUQUNLX1NMT1QpOworICBCaXRWZWN0b3IgUmVNYXREZWxldGUoTnVtVmFsTnVtcyk7CisgIHVuc2lnbmVkIFNsb3QgPSBWaXJ0UmVnTWFwOjpNQVhfU1RBQ0tfU0xPVDsKKworICAvLyBTcGlsbGluZyBhIHNwbGl0IGxpdmUgaW50ZXJ2YWwuIEl0IGNhbm5vdCBiZSBzcGxpdCBhbnkgZnVydGhlci4gQWxzbywKKyAgLy8gaXQncyBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgYSBzaW5nbGUgdmFsIyAvIHJhbmdlIGludGVydmFsLgorICBpZiAodnJtLmdldFByZVNwbGl0UmVnKGxpLnJlZykpIHsKKyAgICB2cm0uc2V0SXNTcGxpdEZyb21SZWcobGkucmVnLCAwKTsKKyAgICAvLyBVbnNldCB0aGUgc3BsaXQga2lsbCBtYXJrZXIgb24gdGhlIGxhc3QgdXNlLgorICAgIFNsb3RJbmRleCBLaWxsSWR4ID0gdnJtLmdldEtpbGxQb2ludChsaS5yZWcpOworICAgIGlmIChLaWxsSWR4ICE9IFNsb3RJbmRleCgpKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKktpbGxNSSA9IGdldEluc3RydWN0aW9uRnJvbUluZGV4KEtpbGxJZHgpOworICAgICAgYXNzZXJ0KEtpbGxNSSAmJiAiTGFzdCB1c2UgZGlzYXBwZWFyZWQ/Iik7CisgICAgICBpbnQgS2lsbE9wID0gS2lsbE1JLT5maW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KGxpLnJlZywgdHJ1ZSk7CisgICAgICBhc3NlcnQoS2lsbE9wICE9IC0xICYmICJMYXN0IHVzZSBkaXNhcHBlYXJlZD8iKTsKKyAgICAgIEtpbGxNSS0+Z2V0T3BlcmFuZChLaWxsT3ApLnNldElzS2lsbChmYWxzZSk7CisgICAgfQorICAgIHZybS5yZW1vdmVLaWxsUG9pbnQobGkucmVnKTsKKyAgICBib29sIERlZklzUmVNYXQgPSB2cm0uaXNSZU1hdGVyaWFsaXplZChsaS5yZWcpOworICAgIFNsb3QgPSB2cm0uZ2V0U3RhY2tTbG90KGxpLnJlZyk7CisgICAgYXNzZXJ0KFNsb3QgIT0gVmlydFJlZ01hcDo6TUFYX1NUQUNLX1NMT1QpOworICAgIE1hY2hpbmVJbnN0ciAqUmVNYXREZWZNSSA9IERlZklzUmVNYXQgPworICAgICAgdnJtLmdldFJlTWF0ZXJpYWxpemVkTUkobGkucmVnKSA6IE5VTEw7CisgICAgaW50IExkU2xvdCA9IDA7CisgICAgYm9vbCBpc0xvYWRTUyA9IERlZklzUmVNYXQgJiYgdGlpXy0+aXNMb2FkRnJvbVN0YWNrU2xvdChSZU1hdERlZk1JLCBMZFNsb3QpOworICAgIGJvb2wgaXNMb2FkID0gaXNMb2FkU1MgfHwKKyAgICAgIChEZWZJc1JlTWF0ICYmIChSZU1hdERlZk1JLT5nZXREZXNjKCkuY2FuRm9sZEFzTG9hZCgpKSk7CisgICAgYm9vbCBJc0ZpcnN0UmFuZ2UgPSB0cnVlOworICAgIGZvciAoTGl2ZUludGVydmFsOjpSYW5nZXM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgIEkgPSBsaS5yYW5nZXMuYmVnaW4oKSwgRSA9IGxpLnJhbmdlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBzcGxpdCBsaXZlIGludGVydmFsIHdpdGggbXVsdGlwbGUgcmFuZ2VzLCBpdCBtZWFucyB0aGVyZQorICAgICAgLy8gYXJlIHR3by1hZGRyZXNzIGluc3RydWN0aW9ucyB0aGF0IHJlLWRlZmluZWQgdGhlIHZhbHVlLiBPbmx5IHRoZQorICAgICAgLy8gZmlyc3QgZGVmIGNhbiBiZSByZW1hdGVyaWFsaXplZCEKKyAgICAgIGlmIChJc0ZpcnN0UmFuZ2UpIHsKKyAgICAgICAgLy8gTm90ZSBSZU1hdE9yaWdEZWZNSSBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuCisgICAgICAgIHJld3JpdGVJbnN0cnVjdGlvbnNGb3JTcGlsbHMobGksIGZhbHNlLCBJLCBOVUxMLCBSZU1hdERlZk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90LCBMZFNsb3QsIGlzTG9hZCwgaXNMb2FkU1MsIERlZklzUmVNYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB2cm0sIHJjLCBSZU1hdElkcywgbG9vcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwaWxsTUJCcywgU3BpbGxJZHhlcywgUmVzdG9yZU1CQnMsIFJlc3RvcmVJZHhlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJCVlJlZ3NNYXAsIE5ld0xJcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXdyaXRlSW5zdHJ1Y3Rpb25zRm9yU3BpbGxzKGxpLCBmYWxzZSwgSSwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHZybSwgcmMsIFJlTWF0SWRzLCBsb29wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BpbGxNQkJzLCBTcGlsbElkeGVzLCBSZXN0b3JlTUJCcywgUmVzdG9yZUlkeGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkJWUmVnc01hcCwgTmV3TElzKTsKKyAgICAgIH0KKyAgICAgIElzRmlyc3RSYW5nZSA9IGZhbHNlOworICAgIH0KKworICAgIGhhbmRsZVNwaWxsZWRJbXBEZWZzKGxpLCB2cm0sIHJjLCBOZXdMSXMpOworICAgIG5vcm1hbGl6ZVNwaWxsV2VpZ2h0cyhOZXdMSXMpOworICAgIHJldHVybiBOZXdMSXM7CisgIH0KKworICBib29sIFRyeVNwbGl0ID0gIWludGVydmFsSXNJbk9uZU1CQihsaSk7CisgIGlmIChUcnlTcGxpdCkKKyAgICArK251bVNwbGl0czsKKyAgYm9vbCBOZWVkU3RhY2tTbG90ID0gZmFsc2U7CisgIGZvciAoTGl2ZUludGVydmFsOjpjb25zdF92bmlfaXRlcmF0b3IgaSA9IGxpLnZuaV9iZWdpbigpLCBlID0gbGkudm5pX2VuZCgpOworICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgVk5JbmZvICpWTkkgPSAqaTsKKyAgICB1bnNpZ25lZCBWTiA9IFZOSS0+aWQ7CisgICAgaWYgKFZOSS0+aXNVbnVzZWQoKSkKKyAgICAgIGNvbnRpbnVlOyAvLyBEZWFkIHZhbCMuCisgICAgLy8gSXMgdGhlIGRlZiBmb3IgdGhlIHZhbCMgcmVtYXRlcmlhbGl6YWJsZT8KKyAgICBNYWNoaW5lSW5zdHIgKlJlTWF0RGVmTUkgPSBWTkktPmlzRGVmQWNjdXJhdGUoKQorICAgICAgPyBnZXRJbnN0cnVjdGlvbkZyb21JbmRleChWTkktPmRlZikgOiAwOworICAgIGJvb2wgZHVtbXk7CisgICAgaWYgKFJlTWF0RGVmTUkgJiYgaXNSZU1hdGVyaWFsaXphYmxlKGxpLCBWTkksIFJlTWF0RGVmTUksIFNwaWxsSXMsIGR1bW15KSkgeworICAgICAgLy8gUmVtZW1iZXIgaG93IHRvIHJlbWF0IHRoZSBkZWYgb2YgdGhpcyB2YWwjLgorICAgICAgUmVNYXRPcmlnRGVmc1tWTl0gPSBSZU1hdERlZk1JOworICAgICAgLy8gT3JpZ2luYWwgZGVmIG1heSBiZSBtb2RpZmllZCBzbyB3ZSBoYXZlIHRvIG1ha2UgYSBjb3B5IGhlcmUuCisgICAgICBNYWNoaW5lSW5zdHIgKkNsb25lID0gbWZfLT5DbG9uZU1hY2hpbmVJbnN0cihSZU1hdERlZk1JKTsKKyAgICAgIENsb25lTUlzLnB1c2hfYmFjayhDbG9uZSk7CisgICAgICBSZU1hdERlZnNbVk5dID0gQ2xvbmU7CisKKyAgICAgIGJvb2wgQ2FuRGVsZXRlID0gdHJ1ZTsKKyAgICAgIGlmIChWTkktPmhhc1BISUtpbGwoKSkgeworICAgICAgICAvLyBBIGtpbGwgaXMgYSBwaGkgbm9kZSwgbm90IGFsbCBvZiBpdHMgdXNlcyBjYW4gYmUgcmVtYXRlcmlhbGl6ZWQuCisgICAgICAgIC8vIEl0IG11c3Qgbm90IGJlIGRlbGV0ZWQuCisgICAgICAgIENhbkRlbGV0ZSA9IGZhbHNlOworICAgICAgICAvLyBOZWVkIGEgc3RhY2sgc2xvdCBpZiB0aGVyZSBpcyBhbnkgbGl2ZSByYW5nZSB3aGVyZSB1c2VzIGNhbm5vdCBiZQorICAgICAgICAvLyByZW1hdGVyaWFsaXplZC4KKyAgICAgICAgTmVlZFN0YWNrU2xvdCA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoQ2FuRGVsZXRlKQorICAgICAgICBSZU1hdERlbGV0ZS5zZXQoVk4pOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOZWVkIGEgc3RhY2sgc2xvdCBpZiB0aGVyZSBpcyBhbnkgbGl2ZSByYW5nZSB3aGVyZSB1c2VzIGNhbm5vdCBiZQorICAgICAgLy8gcmVtYXRlcmlhbGl6ZWQuCisgICAgICBOZWVkU3RhY2tTbG90ID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBPbmUgc3RhY2sgc2xvdCBwZXIgbGl2ZSBpbnRlcnZhbC4KKyAgaWYgKE5lZWRTdGFja1Nsb3QgJiYgdnJtLmdldFByZVNwbGl0UmVnKGxpLnJlZykgPT0gMCkgeworICAgIGlmICh2cm0uZ2V0U3RhY2tTbG90KGxpLnJlZykgPT0gVmlydFJlZ01hcDo6Tk9fU1RBQ0tfU0xPVCkKKyAgICAgIFNsb3QgPSB2cm0uYXNzaWduVmlydDJTdGFja1Nsb3QobGkucmVnKTsKKyAgICAKKyAgICAvLyBUaGlzIGNhc2Ugb25seSBvY2N1cnMgd2hlbiB0aGUgcHJlYWxsb2Mgc3BsaXR0ZXIgaGFzIGFscmVhZHkgYXNzaWduZWQKKyAgICAvLyBhIHN0YWNrIHNsb3QgdG8gdGhpcyB2cmVnLgorICAgIGVsc2UKKyAgICAgIFNsb3QgPSB2cm0uZ2V0U3RhY2tTbG90KGxpLnJlZyk7CisgIH0KKworICAvLyBDcmVhdGUgbmV3IGludGVydmFscyBhbmQgcmV3cml0ZSBkZWZzIGFuZCB1c2VzLgorICBmb3IgKExpdmVJbnRlcnZhbDo6UmFuZ2VzOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgSSA9IGxpLnJhbmdlcy5iZWdpbigpLCBFID0gbGkucmFuZ2VzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE1hY2hpbmVJbnN0ciAqUmVNYXREZWZNSSA9IFJlTWF0RGVmc1tJLT52YWxuby0+aWRdOworICAgIE1hY2hpbmVJbnN0ciAqUmVNYXRPcmlnRGVmTUkgPSBSZU1hdE9yaWdEZWZzW0ktPnZhbG5vLT5pZF07CisgICAgYm9vbCBEZWZJc1JlTWF0ID0gUmVNYXREZWZNSSAhPSBOVUxMOworICAgIGJvb2wgQ2FuRGVsZXRlID0gUmVNYXREZWxldGVbSS0+dmFsbm8tPmlkXTsKKyAgICBpbnQgTGRTbG90ID0gMDsKKyAgICBib29sIGlzTG9hZFNTID0gRGVmSXNSZU1hdCAmJiB0aWlfLT5pc0xvYWRGcm9tU3RhY2tTbG90KFJlTWF0RGVmTUksIExkU2xvdCk7CisgICAgYm9vbCBpc0xvYWQgPSBpc0xvYWRTUyB8fAorICAgICAgKERlZklzUmVNYXQgJiYgUmVNYXREZWZNSS0+Z2V0RGVzYygpLmNhbkZvbGRBc0xvYWQoKSk7CisgICAgcmV3cml0ZUluc3RydWN0aW9uc0ZvclNwaWxscyhsaSwgVHJ5U3BsaXQsIEksIFJlTWF0T3JpZ0RlZk1JLCBSZU1hdERlZk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3QsIExkU2xvdCwgaXNMb2FkLCBpc0xvYWRTUywgRGVmSXNSZU1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5EZWxldGUsIHZybSwgcmMsIFJlTWF0SWRzLCBsb29wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGlsbE1CQnMsIFNwaWxsSWR4ZXMsIFJlc3RvcmVNQkJzLCBSZXN0b3JlSWR4ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJCVlJlZ3NNYXAsIE5ld0xJcyk7CisgIH0KKworICAvLyBJbnNlcnQgc3BpbGxzIC8gcmVzdG9yZXMgaWYgd2UgYXJlIHNwbGl0dGluZy4KKyAgaWYgKCFUcnlTcGxpdCkgeworICAgIGhhbmRsZVNwaWxsZWRJbXBEZWZzKGxpLCB2cm0sIHJjLCBOZXdMSXMpOworICAgIG5vcm1hbGl6ZVNwaWxsV2VpZ2h0cyhOZXdMSXMpOworICAgIHJldHVybiBOZXdMSXM7CisgIH0KKworICBTbWFsbFB0clNldDxMaXZlSW50ZXJ2YWwqLCA0PiBBZGRlZEtpbGw7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiBPcHM7CisgIGlmIChOZWVkU3RhY2tTbG90KSB7CisgICAgaW50IElkID0gU3BpbGxNQkJzLmZpbmRfZmlyc3QoKTsKKyAgICB3aGlsZSAoSWQgIT0gLTEpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPFNSSW5mbz4gJnNwaWxscyA9IFNwaWxsSWR4ZXNbSWRdOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHNwaWxscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFNsb3RJbmRleCBpbmRleCA9IHNwaWxsc1tpXS5pbmRleDsKKyAgICAgICAgdW5zaWduZWQgVlJlZyA9IHNwaWxsc1tpXS52cmVnOworICAgICAgICBMaXZlSW50ZXJ2YWwgJm5JID0gZ2V0T3JDcmVhdGVJbnRlcnZhbChWUmVnKTsKKyAgICAgICAgYm9vbCBpc1JlTWF0ID0gdnJtLmlzUmVNYXRlcmlhbGl6ZWQoVlJlZyk7CisgICAgICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBnZXRJbnN0cnVjdGlvbkZyb21JbmRleChpbmRleCk7CisgICAgICAgIGJvb2wgQ2FuRm9sZCA9IGZhbHNlOworICAgICAgICBib29sIEZvdW5kVXNlID0gZmFsc2U7CisgICAgICAgIE9wcy5jbGVhcigpOworICAgICAgICBpZiAoc3BpbGxzW2ldLmNhbkZvbGQpIHsKKyAgICAgICAgICBDYW5Gb2xkID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBqICE9IGVlOyArK2opIHsKKyAgICAgICAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGopOworICAgICAgICAgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmdldFJlZygpICE9IFZSZWcpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBPcHMucHVzaF9iYWNrKGopOworICAgICAgICAgICAgaWYgKE1PLmlzRGVmKCkpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGlzUmVNYXQgfHwgCisgICAgICAgICAgICAgICAgKCFGb3VuZFVzZSAmJiAhYWxzb0ZvbGRBUmVzdG9yZShJZCwgaW5kZXgsIFZSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0b3JlTUJCcywgUmVzdG9yZUlkeGVzKSkpIHsKKyAgICAgICAgICAgICAgLy8gTUkgaGFzIHR3by1hZGRyZXNzIHVzZXMgb2YgdGhlIHNhbWUgcmVnaXN0ZXIuIElmIHRoZSB1c2UKKyAgICAgICAgICAgICAgLy8gaXNuJ3QgdGhlIGZpcnN0IGFuZCBvbmx5IHVzZSBpbiB0aGUgQkIsIHRoZW4gd2UgY2FuJ3QgZm9sZAorICAgICAgICAgICAgICAvLyBpdC4gRklYTUU6IE1vdmUgdGhpcyB0byByZXdyaXRlSW5zdHJ1Y3Rpb25zRm9yU3BpbGxzLgorICAgICAgICAgICAgICBDYW5Gb2xkID0gZmFsc2U7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRm91bmRVc2UgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBGb2xkIHRoZSBzdG9yZSBpbnRvIHRoZSBkZWYgaWYgcG9zc2libGUuCisgICAgICAgIGJvb2wgRm9sZGVkID0gZmFsc2U7CisgICAgICAgIGlmIChDYW5Gb2xkICYmICFPcHMuZW1wdHkoKSkgeworICAgICAgICAgIGlmICh0cnlGb2xkTWVtb3J5T3BlcmFuZChNSSwgdnJtLCBOVUxMLCBpbmRleCwgT3BzLCB0cnVlLCBTbG90LFZSZWcpKXsKKyAgICAgICAgICAgIEZvbGRlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoRm91bmRVc2UpIHsKKyAgICAgICAgICAgICAgLy8gQWxzbyBmb2xkZWQgdXNlcywgZG8gbm90IGlzc3VlIGEgbG9hZC4KKyAgICAgICAgICAgICAgZXJhc2VSZXN0b3JlSW5mbyhJZCwgaW5kZXgsIFZSZWcsIFJlc3RvcmVNQkJzLCBSZXN0b3JlSWR4ZXMpOworICAgICAgICAgICAgICBuSS5yZW1vdmVSYW5nZShpbmRleC5nZXRMb2FkSW5kZXgoKSwgaW5kZXguZ2V0RGVmSW5kZXgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuSS5yZW1vdmVSYW5nZShpbmRleC5nZXREZWZJbmRleCgpLCBpbmRleC5nZXRTdG9yZUluZGV4KCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE90aGVyd2lzZSB0ZWxsIHRoZSBzcGlsbGVyIHRvIGlzc3VlIGEgc3BpbGwuCisgICAgICAgIGlmICghRm9sZGVkKSB7CisgICAgICAgICAgTGl2ZVJhbmdlICpMUiA9ICZuSS5yYW5nZXNbbkkucmFuZ2VzLnNpemUoKS0xXTsKKyAgICAgICAgICBib29sIGlzS2lsbCA9IExSLT5lbmQgPT0gaW5kZXguZ2V0U3RvcmVJbmRleCgpOworICAgICAgICAgIGlmICghTUktPnJlZ2lzdGVyRGVmSXNEZWFkKG5JLnJlZykpCisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNwaWxsIGEgZGVhZCBkZWYuCisgICAgICAgICAgICB2cm0uYWRkU3BpbGxQb2ludChWUmVnLCBpc0tpbGwsIE1JKTsKKyAgICAgICAgICBpZiAoaXNLaWxsKQorICAgICAgICAgICAgQWRkZWRLaWxsLmluc2VydCgmbkkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBJZCA9IFNwaWxsTUJCcy5maW5kX25leHQoSWQpOworICAgIH0KKyAgfQorCisgIGludCBJZCA9IFJlc3RvcmVNQkJzLmZpbmRfZmlyc3QoKTsKKyAgd2hpbGUgKElkICE9IC0xKSB7CisgICAgc3RkOjp2ZWN0b3I8U1JJbmZvPiAmcmVzdG9yZXMgPSBSZXN0b3JlSWR4ZXNbSWRdOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSByZXN0b3Jlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBTbG90SW5kZXggaW5kZXggPSByZXN0b3Jlc1tpXS5pbmRleDsKKyAgICAgIGlmIChpbmRleCA9PSBTbG90SW5kZXgoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICB1bnNpZ25lZCBWUmVnID0gcmVzdG9yZXNbaV0udnJlZzsKKyAgICAgIExpdmVJbnRlcnZhbCAmbkkgPSBnZXRPckNyZWF0ZUludGVydmFsKFZSZWcpOworICAgICAgYm9vbCBpc1JlTWF0ID0gdnJtLmlzUmVNYXRlcmlhbGl6ZWQoVlJlZyk7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoaW5kZXgpOworICAgICAgYm9vbCBDYW5Gb2xkID0gZmFsc2U7CisgICAgICBPcHMuY2xlYXIoKTsKKyAgICAgIGlmIChyZXN0b3Jlc1tpXS5jYW5Gb2xkKSB7CisgICAgICAgIENhbkZvbGQgPSB0cnVlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBqICE9IGVlOyArK2opIHsKKyAgICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChqKTsKKyAgICAgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgTU8uZ2V0UmVnKCkgIT0gVlJlZykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgaWYgKE1PLmlzRGVmKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgcmVzdG9yZSB3ZXJlIHRvIGJlIGZvbGRlZCwgaXQgd291bGQgaGF2ZSBiZWVuIGZvbGRlZAorICAgICAgICAgICAgLy8gYWxyZWFkeS4KKyAgICAgICAgICAgIENhbkZvbGQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBPcHMucHVzaF9iYWNrKGopOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEZvbGQgdGhlIGxvYWQgaW50byB0aGUgdXNlIGlmIHBvc3NpYmxlLgorICAgICAgYm9vbCBGb2xkZWQgPSBmYWxzZTsKKyAgICAgIGlmIChDYW5Gb2xkICYmICFPcHMuZW1wdHkoKSkgeworICAgICAgICBpZiAoIWlzUmVNYXQpCisgICAgICAgICAgRm9sZGVkID0gdHJ5Rm9sZE1lbW9yeU9wZXJhbmQoTUksIHZybSwgTlVMTCxpbmRleCxPcHMsdHJ1ZSxTbG90LFZSZWcpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBNYWNoaW5lSW5zdHIgKlJlTWF0RGVmTUkgPSB2cm0uZ2V0UmVNYXRlcmlhbGl6ZWRNSShWUmVnKTsKKyAgICAgICAgICBpbnQgTGRTbG90ID0gMDsKKyAgICAgICAgICBib29sIGlzTG9hZFNTID0gdGlpXy0+aXNMb2FkRnJvbVN0YWNrU2xvdChSZU1hdERlZk1JLCBMZFNsb3QpOworICAgICAgICAgIC8vIElmIHRoZSByZW1hdGVyaWFsaXphYmxlIGRlZiBpcyBhIGxvYWQsIGFsc28gdHJ5IHRvIGZvbGQgaXQuCisgICAgICAgICAgaWYgKGlzTG9hZFNTIHx8IFJlTWF0RGVmTUktPmdldERlc2MoKS5jYW5Gb2xkQXNMb2FkKCkpCisgICAgICAgICAgICBGb2xkZWQgPSB0cnlGb2xkTWVtb3J5T3BlcmFuZChNSSwgdnJtLCBSZU1hdERlZk1JLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgaXNMb2FkU1MsIExkU2xvdCwgVlJlZyk7CisgICAgICAgICAgaWYgKCFGb2xkZWQpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIEltcFVzZSA9IGdldFJlTWF0SW1wbGljaXRVc2UobGksIFJlTWF0RGVmTUkpOworICAgICAgICAgICAgaWYgKEltcFVzZSkgeworICAgICAgICAgICAgICAvLyBSZS1tYXR0aW5nIGFuIGluc3RydWN0aW9uIHdpdGggdmlydHVhbCByZWdpc3RlciB1c2UuIEFkZCB0aGUKKyAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgYXMgYW4gaW1wbGljaXQgdXNlIG9uIHRoZSB1c2UgTUkgYW5kIG1hcmsgdGhlIHJlZ2lzdGVyCisgICAgICAgICAgICAgIC8vIGludGVydmFsIGFzIHVuc3BpbGxhYmxlLgorICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWwgJkltcExpID0gZ2V0SW50ZXJ2YWwoSW1wVXNlKTsKKyAgICAgICAgICAgICAgSW1wTGkubWFya05vdFNwaWxsYWJsZSgpOworICAgICAgICAgICAgICBNSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKEltcFVzZSwgZmFsc2UsIHRydWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIElmIGZvbGRpbmcgaXMgbm90IHBvc3NpYmxlIC8gZmFpbGVkLCB0aGVuIHRlbGwgdGhlIHNwaWxsZXIgdG8gaXNzdWUgYQorICAgICAgLy8gbG9hZCAvIHJlbWF0ZXJpYWxpemF0aW9uIGZvciB1cy4KKyAgICAgIGlmIChGb2xkZWQpCisgICAgICAgIG5JLnJlbW92ZVJhbmdlKGluZGV4LmdldExvYWRJbmRleCgpLCBpbmRleC5nZXREZWZJbmRleCgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdnJtLmFkZFJlc3RvcmVQb2ludChWUmVnLCBNSSk7CisgICAgfQorICAgIElkID0gUmVzdG9yZU1CQnMuZmluZF9uZXh0KElkKTsKKyAgfQorCisgIC8vIEZpbmFsaXplIGludGVydmFsczogYWRkIGtpbGxzLCBmaW5hbGl6ZSBzcGlsbCB3ZWlnaHRzLCBhbmQgZmlsdGVyIG91dAorICAvLyBkZWFkIGludGVydmFscy4KKyAgc3RkOjp2ZWN0b3I8TGl2ZUludGVydmFsKj4gUmV0TmV3TElzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3TElzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBMaXZlSW50ZXJ2YWwgKkxJID0gTmV3TElzW2ldOworICAgIGlmICghTEktPmVtcHR5KCkpIHsKKyAgICAgIGlmICghQWRkZWRLaWxsLmNvdW50KExJKSkgeworICAgICAgICBMaXZlUmFuZ2UgKkxSID0gJkxJLT5yYW5nZXNbTEktPnJhbmdlcy5zaXplKCktMV07CisgICAgICAgIFNsb3RJbmRleCBMYXN0VXNlSWR4ID0gTFItPmVuZC5nZXRCYXNlSW5kZXgoKTsKKyAgICAgICAgTWFjaGluZUluc3RyICpMYXN0VXNlID0gZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoTGFzdFVzZUlkeCk7CisgICAgICAgIGludCBVc2VJZHggPSBMYXN0VXNlLT5maW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KExJLT5yZWcsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0KFVzZUlkeCAhPSAtMSk7CisgICAgICAgIGlmICghTGFzdFVzZS0+aXNSZWdUaWVkVG9EZWZPcGVyYW5kKFVzZUlkeCkpIHsKKyAgICAgICAgICBMYXN0VXNlLT5nZXRPcGVyYW5kKFVzZUlkeCkuc2V0SXNLaWxsKCk7CisgICAgICAgICAgdnJtLmFkZEtpbGxQb2ludChMSS0+cmVnLCBMYXN0VXNlSWR4KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgUmV0TmV3TElzLnB1c2hfYmFjayhMSSk7CisgICAgfQorICB9CisKKyAgaGFuZGxlU3BpbGxlZEltcERlZnMobGksIHZybSwgcmMsIFJldE5ld0xJcyk7CisgIG5vcm1hbGl6ZVNwaWxsV2VpZ2h0cyhSZXROZXdMSXMpOworICByZXR1cm4gUmV0TmV3TElzOworfQorCisvLy8gaGFzQWxsb2NhdGFibGVTdXBlclJlZyAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcmVnaXN0ZXIgaGFzCisvLy8gYW55IHN1cGVyIHJlZ2lzdGVyIHRoYXQncyBhbGxvY2F0YWJsZS4KK2Jvb2wgTGl2ZUludGVydmFsczo6aGFzQWxsb2NhdGFibGVTdXBlclJlZyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgZm9yIChjb25zdCB1bnNpZ25lZCogQVMgPSB0cmlfLT5nZXRTdXBlclJlZ2lzdGVycyhSZWcpOyAqQVM7ICsrQVMpCisgICAgaWYgKGFsbG9jYXRhYmxlUmVnc19bKkFTXSAmJiBoYXNJbnRlcnZhbCgqQVMpKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGdldFJlcHJlc2VudGF0aXZlUmVnIC0gRmluZCB0aGUgbGFyZ2VzdCBzdXBlciByZWdpc3RlciBvZiB0aGUgc3BlY2lmaWVkCisvLy8gcGh5c2ljYWwgcmVnaXN0ZXIuCit1bnNpZ25lZCBMaXZlSW50ZXJ2YWxzOjpnZXRSZXByZXNlbnRhdGl2ZVJlZyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgLy8gRmluZCB0aGUgbGFyZ2VzdCBzdXBlci1yZWdpc3RlciB0aGF0IGlzIGFsbG9jYXRhYmxlLiAKKyAgdW5zaWduZWQgQmVzdFJlZyA9IFJlZzsKKyAgZm9yIChjb25zdCB1bnNpZ25lZCogQVMgPSB0cmlfLT5nZXRTdXBlclJlZ2lzdGVycyhSZWcpOyAqQVM7ICsrQVMpIHsKKyAgICB1bnNpZ25lZCBTdXBlclJlZyA9ICpBUzsKKyAgICBpZiAoIWhhc0FsbG9jYXRhYmxlU3VwZXJSZWcoU3VwZXJSZWcpICYmIGhhc0ludGVydmFsKFN1cGVyUmVnKSkgeworICAgICAgQmVzdFJlZyA9IFN1cGVyUmVnOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBCZXN0UmVnOworfQorCisvLy8gZ2V0TnVtQ29uZmxpY3RzV2l0aFBoeXNSZWcgLSBSZXR1cm4gdGhlIG51bWJlciBvZiB1c2VzIGFuZCBkZWZzIG9mIHRoZQorLy8vIHNwZWNpZmllZCBpbnRlcnZhbCB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcmVnaXN0ZXIuCit1bnNpZ25lZCBMaXZlSW50ZXJ2YWxzOjpnZXROdW1Db25mbGljdHNXaXRoUGh5c1JlZyhjb25zdCBMaXZlSW50ZXJ2YWwgJmxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUGh5c1JlZykgY29uc3QgeworICB1bnNpZ25lZCBOdW1Db25mbGljdHMgPSAwOworICBjb25zdCBMaXZlSW50ZXJ2YWwgJnBsaSA9IGdldEludGVydmFsKGdldFJlcHJlc2VudGF0aXZlUmVnKFBoeXNSZWcpKTsKKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpyZWdfaXRlcmF0b3IgSSA9IG1yaV8tPnJlZ19iZWdpbihsaS5yZWcpLAorICAgICAgICAgRSA9IG1yaV8tPnJlZ19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTyA9IEkuZ2V0T3BlcmFuZCgpOworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBPLmdldFBhcmVudCgpOworICAgIGlmIChNSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICBjb250aW51ZTsKKyAgICBTbG90SW5kZXggSW5kZXggPSBnZXRJbnN0cnVjdGlvbkluZGV4KE1JKTsKKyAgICBpZiAocGxpLmxpdmVBdChJbmRleCkpCisgICAgICArK051bUNvbmZsaWN0czsKKyAgfQorICByZXR1cm4gTnVtQ29uZmxpY3RzOworfQorCisvLy8gc3BpbGxQaHlzUmVnQXJvdW5kUmVnRGVmc1VzZXMgLSBTcGlsbCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyCisvLy8gYXJvdW5kIGFsbCBkZWZzIGFuZCB1c2VzIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwuIFJldHVybiB0cnVlIGlmIGl0CisvLy8gd2FzIGFibGUgdG8gY3V0IGl0cyBpbnRlcnZhbC4KK2Jvb2wgTGl2ZUludGVydmFsczo6c3BpbGxQaHlzUmVnQXJvdW5kUmVnRGVmc1VzZXMoY29uc3QgTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUGh5c1JlZywgVmlydFJlZ01hcCAmdnJtKSB7CisgIHVuc2lnbmVkIFNwaWxsUmVnID0gZ2V0UmVwcmVzZW50YXRpdmVSZWcoUGh5c1JlZyk7CisKKyAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSB0cmlfLT5nZXRBbGlhc1NldChQaHlzUmVnKTsgKkFTOyArK0FTKQorICAgIC8vIElmIHRoZXJlIGFyZSByZWdpc3RlcnMgd2hpY2ggYWxpYXMgUGh5c1JlZywgYnV0IHdoaWNoIGFyZSBub3QgYQorICAgIC8vIHN1Yi1yZWdpc3RlciBvZiB0aGUgY2hvc2VuIHJlcHJlc2VudGF0aXZlIHN1cGVyIHJlZ2lzdGVyLiBBc3NlcnQKKyAgICAvLyBzaW5jZSB3ZSBjYW4ndCBoYW5kbGUgaXQgeWV0LgorICAgIGFzc2VydCgqQVMgPT0gU3BpbGxSZWcgfHwgIWFsbG9jYXRhYmxlUmVnc19bKkFTXSB8fCAhaGFzSW50ZXJ2YWwoKkFTKSB8fAorICAgICAgICAgICB0cmlfLT5pc1N1cGVyUmVnaXN0ZXIoKkFTLCBTcGlsbFJlZykpOworCisgIGJvb2wgQ3V0ID0gZmFsc2U7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBQUmVnczsKKyAgaWYgKGhhc0ludGVydmFsKFNwaWxsUmVnKSkKKyAgICBQUmVncy5wdXNoX2JhY2soU3BpbGxSZWcpOworICBlbHNlIHsKKyAgICBTbWFsbFNldDx1bnNpZ25lZCwgND4gQWRkZWQ7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCogQVMgPSB0cmlfLT5nZXRTdWJSZWdpc3RlcnMoU3BpbGxSZWcpOyAqQVM7ICsrQVMpCisgICAgICBpZiAoQWRkZWQuaW5zZXJ0KCpBUykgJiYgaGFzSW50ZXJ2YWwoKkFTKSkgeworICAgICAgICBQUmVncy5wdXNoX2JhY2soKkFTKTsKKyAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCogQVNTID0gdHJpXy0+Z2V0U3ViUmVnaXN0ZXJzKCpBUyk7ICpBU1M7ICsrQVNTKQorICAgICAgICAgIEFkZGVkLmluc2VydCgqQVNTKTsKKyAgICAgIH0KKyAgfQorCisgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDg+IFNlZW5NSXM7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6cmVnX2l0ZXJhdG9yIEkgPSBtcmlfLT5yZWdfYmVnaW4obGkucmVnKSwKKyAgICAgICAgIEUgPSBtcmlfLT5yZWdfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk8gPSBJLmdldE9wZXJhbmQoKTsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gTy5nZXRQYXJlbnQoKTsKKyAgICBpZiAoTUktPmlzRGVidWdWYWx1ZSgpIHx8IFNlZW5NSXMuY291bnQoTUkpKQorICAgICAgY29udGludWU7CisgICAgU2Vlbk1Jcy5pbnNlcnQoTUkpOworICAgIFNsb3RJbmRleCBJbmRleCA9IGdldEluc3RydWN0aW9uSW5kZXgoTUkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBQUmVnID0gUFJlZ3NbaV07CisgICAgICBMaXZlSW50ZXJ2YWwgJnBsaSA9IGdldEludGVydmFsKFBSZWcpOworICAgICAgaWYgKCFwbGkubGl2ZUF0KEluZGV4KSkKKyAgICAgICAgY29udGludWU7CisgICAgICB2cm0uYWRkRW1lcmdlbmN5U3BpbGwoUFJlZywgTUkpOworICAgICAgU2xvdEluZGV4IFN0YXJ0SWR4ID0gSW5kZXguZ2V0TG9hZEluZGV4KCk7CisgICAgICBTbG90SW5kZXggRW5kSWR4ID0gSW5kZXguZ2V0TmV4dEluZGV4KCkuZ2V0QmFzZUluZGV4KCk7CisgICAgICBpZiAocGxpLmlzSW5PbmVMaXZlUmFuZ2UoU3RhcnRJZHgsIEVuZElkeCkpIHsKKyAgICAgICAgcGxpLnJlbW92ZVJhbmdlKFN0YXJ0SWR4LCBFbmRJZHgpOworICAgICAgICBDdXQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbXNnOworICAgICAgICByYXdfc3RyaW5nX29zdHJlYW0gTXNnKG1zZyk7CisgICAgICAgIE1zZyA8PCAiUmFuIG91dCBvZiByZWdpc3RlcnMgZHVyaW5nIHJlZ2lzdGVyIGFsbG9jYXRpb24hIjsKKyAgICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKE1zZy5zdHIoKSk7CisgICAgICB9CisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkKiBBUyA9IHRyaV8tPmdldFN1YlJlZ2lzdGVycyhQUmVnKTsgKkFTOyArK0FTKSB7CisgICAgICAgIGlmICghaGFzSW50ZXJ2YWwoKkFTKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgTGl2ZUludGVydmFsICZzcGxpID0gZ2V0SW50ZXJ2YWwoKkFTKTsKKyAgICAgICAgaWYgKHNwbGkubGl2ZUF0KEluZGV4KSkKKyAgICAgICAgICBzcGxpLnJlbW92ZVJhbmdlKEluZGV4LmdldExvYWRJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXguZ2V0TmV4dEluZGV4KCkuZ2V0QmFzZUluZGV4KCkpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gQ3V0OworfQorCitMaXZlUmFuZ2UgTGl2ZUludGVydmFsczo6YWRkTGl2ZVJhbmdlVG9FbmRPZkJsb2NrKHVuc2lnbmVkIHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyKiBzdGFydEluc3QpIHsKKyAgTGl2ZUludGVydmFsJiBJbnRlcnZhbCA9IGdldE9yQ3JlYXRlSW50ZXJ2YWwocmVnKTsKKyAgVk5JbmZvKiBWTiA9IEludGVydmFsLmdldE5leHRWYWx1ZSgKKyAgICBTbG90SW5kZXgoZ2V0SW5zdHJ1Y3Rpb25JbmRleChzdGFydEluc3QpLmdldERlZkluZGV4KCkpLAorICAgIHN0YXJ0SW5zdCwgdHJ1ZSwgZ2V0Vk5JbmZvQWxsb2NhdG9yKCkpOworICBWTi0+c2V0SGFzUEhJS2lsbCh0cnVlKTsKKyAgTGl2ZVJhbmdlIExSKAorICAgICBTbG90SW5kZXgoZ2V0SW5zdHJ1Y3Rpb25JbmRleChzdGFydEluc3QpLmdldERlZkluZGV4KCkpLAorICAgICBnZXRNQkJFbmRJZHgoc3RhcnRJbnN0LT5nZXRQYXJlbnQoKSksIFZOKTsKKyAgSW50ZXJ2YWwuYWRkUmFuZ2UoTFIpOworICAKKyAgcmV0dXJuIExSOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9MaXZlU3RhY2tBbmFseXNpcy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9MaXZlU3RhY2tBbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjMzg1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xpdmVTdGFja0FuYWx5c2lzLmNwcApAQCAtMCwwICsxLDY0IEBACisvLz09PS0tIExpdmVTdGFja0FuYWx5c2lzLmNwcCAtIExpdmUgU3RhY2sgU2xvdCBBbmFseXNpcyAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBsaXZlIHN0YWNrIHNsb3QgYW5hbHlzaXMgcGFzcy4gSXQgaXMgYW5hbG9nb3VzIHRvCisvLyBsaXZlIGludGVydmFsIGFuYWx5c2lzIGV4Y2VwdCBpdCdzIGFuYWx5emluZyBsaXZlbmVzcyBvZiBzdGFjayBzbG90cyByYXRoZXIKKy8vIHRoYW4gcmVnaXN0ZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibGl2ZXN0YWNrcyIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZVN0YWNrQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSA8bGltaXRzPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK2NoYXIgTGl2ZVN0YWNrczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKExpdmVTdGFja3MsICJsaXZlc3RhY2tzIiwKKyAgICAgICAgICAgICAgICAiTGl2ZSBTdGFjayBTbG90IEFuYWx5c2lzIiwgZmFsc2UsIGZhbHNlKTsKKwordm9pZCBMaXZlU3RhY2tzOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICBBVS5hZGRQcmVzZXJ2ZWQ8U2xvdEluZGV4ZXM+KCk7CisgIEFVLmFkZFJlcXVpcmVkVHJhbnNpdGl2ZTxTbG90SW5kZXhlcz4oKTsKKyAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7Cit9CisKK3ZvaWQgTGl2ZVN0YWNrczo6cmVsZWFzZU1lbW9yeSgpIHsKKyAgLy8gUmVsZWFzZSBWTkluZm8gbWVtb3J5IHJlZ2lvbnMsIFZOSW5mbyBvYmplY3RzIGRvbid0IG5lZWQgdG8gYmUgZHRvcidkLgorICBWTkluZm9BbGxvY2F0b3IuUmVzZXQoKTsKKyAgUzJJTWFwLmNsZWFyKCk7CisgIFMyUkNNYXAuY2xlYXIoKTsKK30KKworYm9vbCBMaXZlU3RhY2tzOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJikgeworICAvLyBGSVhNRTogTm8gYW5hbHlzaXMgaXMgYmVpbmcgZG9uZSByaWdodCBub3cuIFdlIGFyZSByZWx5aW5nIG9uIHRoZQorICAvLyByZWdpc3RlciBhbGxvY2F0b3JzIHRvIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uLgorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBwcmludCAtIEltcGxlbWVudCB0aGUgZHVtcCBtZXRob2QuCit2b2lkIExpdmVTdGFja3M6OnByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlKikgY29uc3QgeworCisgIE9TIDw8ICIqKioqKioqKioqIElOVEVSVkFMUyAqKioqKioqKioqXG4iOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgSS0+c2Vjb25kLnByaW50KE9TKTsKKyAgICBpbnQgU2xvdCA9IEktPmZpcnN0OworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gZ2V0SW50ZXJ2YWxSZWdDbGFzcyhTbG90KTsKKyAgICBpZiAoUkMpCisgICAgICBPUyA8PCAiIFsiIDw8IFJDLT5nZXROYW1lKCkgPDwgIl1cbiI7CisgICAgZWxzZQorICAgICAgT1MgPDwgIiBbVW5rbm93bl1cbiI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xpdmVWYXJpYWJsZXMuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5MzViMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xpdmVWYXJpYWJsZXMuY3BwCkBAIC0wLDAgKzEsNzk5IEBACisvLz09PS0tIExpdmVWYXJpYWJsZXMuY3BwIC0gTGl2ZSBWYXJpYWJsZSBBbmFseXNpcyBmb3IgTWFjaGluZSBDb2RlIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBMaXZlVmFyaWFibGUgYW5hbHlzaXMgcGFzcy4gIEZvciBlYWNoIG1hY2hpbmUKKy8vIGluc3RydWN0aW9uIGluIHRoZSBmdW5jdGlvbiwgdGhpcyBwYXNzIGNhbGN1bGF0ZXMgdGhlIHNldCBvZiByZWdpc3RlcnMgdGhhdAorLy8gYXJlIGltbWVkaWF0ZWx5IGRlYWQgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gY2FsY3VsYXRlcworLy8gdGhlIHZhbHVlLCBidXQgaXQgaXMgbmV2ZXIgdXNlZCkgYW5kIHRoZSBzZXQgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHVzZWQgYnkKKy8vIHRoZSBpbnN0cnVjdGlvbiwgYnV0IGFyZSBuZXZlciB1c2VkIGFmdGVyIHRoZSBpbnN0cnVjdGlvbiAoaS5lLiwgdGhleSBhcmUKKy8vIGtpbGxlZCkuCisvLworLy8gVGhpcyBjbGFzcyBjb21wdXRlcyBsaXZlIHZhcmlhYmxlcyB1c2luZyBhcmUgc3BhcnNlIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uCisvLyB0aGUgbWFjaGluZSBjb2RlIFNTQSBmb3JtLiAgVGhpcyBjbGFzcyBjb21wdXRlcyBsaXZlIHZhcmlhYmxlIGluZm9ybWF0aW9uIGZvcgorLy8gZWFjaCB2aXJ0dWFsIGFuZCBfcmVnaXN0ZXIgYWxsb2NhdGFibGVfIHBoeXNpY2FsIHJlZ2lzdGVyIGluIGEgZnVuY3Rpb24uICBJdAorLy8gdXNlcyB0aGUgZG9taW5hbmNlIHByb3BlcnRpZXMgb2YgU1NBIGZvcm0gdG8gZWZmaWNpZW50bHkgY29tcHV0ZSBsaXZlCisvLyB2YXJpYWJsZXMgZm9yIHZpcnR1YWwgcmVnaXN0ZXJzLCBhbmQgYXNzdW1lcyB0aGF0IHBoeXNpY2FsIHJlZ2lzdGVycyBhcmUgb25seQorLy8gbGl2ZSB3aXRoaW4gYSBzaW5nbGUgYmFzaWMgYmxvY2sgKGFsbG93aW5nIGl0IHRvIGRvIGEgc2luZ2xlIGxvY2FsIGFuYWx5c2lzCisvLyB0byByZXNvbHZlIHBoeXNpY2FsIHJlZ2lzdGVyIGxpZmV0aW1lcyBpbiBlYWNoIGJhc2ljIGJsb2NrKS4gIElmIGEgcGh5c2ljYWwKKy8vIHJlZ2lzdGVyIGlzIG5vdCByZWdpc3RlciBhbGxvY2F0YWJsZSwgaXQgaXMgbm90IHRyYWNrZWQuICBUaGlzIGlzIHVzZWZ1bCBmb3IKKy8vIHRoaW5ncyBsaWtlIHRoZSBzdGFjayBwb2ludGVyIGFuZCBjb25kaXRpb24gY29kZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlVmFyaWFibGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK2NoYXIgTGl2ZVZhcmlhYmxlczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKExpdmVWYXJpYWJsZXMsICJsaXZldmFycyIsCisgICAgICAgICAgICAgICAgIkxpdmUgVmFyaWFibGUgQW5hbHlzaXMiLCBmYWxzZSwgZmFsc2UpOworCisKK3ZvaWQgTGl2ZVZhcmlhYmxlczo6Z2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICBBVS5hZGRSZXF1aXJlZElEKFVucmVhY2hhYmxlTWFjaGluZUJsb2NrRWxpbUlEKTsKKyAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworfQorCitNYWNoaW5lSW5zdHIgKgorTGl2ZVZhcmlhYmxlczo6VmFySW5mbzo6ZmluZEtpbGwoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gS2lsbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoS2lsbHNbaV0tPmdldFBhcmVudCgpID09IE1CQikKKyAgICAgIHJldHVybiBLaWxsc1tpXTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTGl2ZVZhcmlhYmxlczo6VmFySW5mbzo6ZHVtcCgpIGNvbnN0IHsKKyAgZGJncygpIDw8ICIgIEFsaXZlIGluIGJsb2NrczogIjsKKyAgZm9yIChTcGFyc2VCaXRWZWN0b3I8Pjo6aXRlcmF0b3IgSSA9IEFsaXZlQmxvY2tzLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBBbGl2ZUJsb2Nrcy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgZGJncygpIDw8ICpJIDw8ICIsICI7CisgIGRiZ3MoKSA8PCAiXG4gIEtpbGxlZCBieToiOworICBpZiAoS2lsbHMuZW1wdHkoKSkKKyAgICBkYmdzKCkgPDwgIiBObyBpbnN0cnVjdGlvbnMuXG4iOworICBlbHNlIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gS2lsbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGRiZ3MoKSA8PCAiXG4gICAgIyIgPDwgaSA8PCAiOiAiIDw8ICpLaWxsc1tpXTsKKyAgICBkYmdzKCkgPDwgIlxuIjsKKyAgfQorfQorCisvLy8gZ2V0VmFySW5mbyAtIEdldCAocG9zc2libHkgY3JlYXRpbmcpIGEgVmFySW5mbyBvYmplY3QgZm9yIHRoZSBnaXZlbiB2cmVnLgorTGl2ZVZhcmlhYmxlczo6VmFySW5mbyAmTGl2ZVZhcmlhYmxlczo6Z2V0VmFySW5mbyh1bnNpZ25lZCBSZWdJZHgpIHsKKyAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUmVnSWR4KSAmJgorICAgICAgICAgImdldFZhckluZm86IG5vdCBhIHZpcnR1YWwgcmVnaXN0ZXIhIik7CisgIFJlZ0lkeCAtPSBUYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyOworICBpZiAoUmVnSWR4ID49IFZpcnRSZWdJbmZvLnNpemUoKSkgeworICAgIGlmIChSZWdJZHggPj0gMipWaXJ0UmVnSW5mby5zaXplKCkpCisgICAgICBWaXJ0UmVnSW5mby5yZXNpemUoUmVnSWR4KjIpOworICAgIGVsc2UKKyAgICAgIFZpcnRSZWdJbmZvLnJlc2l6ZSgyKlZpcnRSZWdJbmZvLnNpemUoKSk7CisgIH0KKyAgcmV0dXJuIFZpcnRSZWdJbmZvW1JlZ0lkeF07Cit9CisKK3ZvaWQgTGl2ZVZhcmlhYmxlczo6TWFya1ZpcnRSZWdBbGl2ZUluQmxvY2soVmFySW5mbyYgVlJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRGVmQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+ICZXb3JrTGlzdCkgeworICB1bnNpZ25lZCBCQk51bSA9IE1CQi0+Z2V0TnVtYmVyKCk7CisgIAorICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBiYXNpYyBibG9jayBpcyBvbmUgb2YgdGhlIGtpbGxpbmcgYmxvY2tzLiAgSWYgc28sCisgIC8vIHJlbW92ZSBpdC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZSSW5mby5LaWxscy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChWUkluZm8uS2lsbHNbaV0tPmdldFBhcmVudCgpID09IE1CQikgeworICAgICAgVlJJbmZvLktpbGxzLmVyYXNlKFZSSW5mby5LaWxscy5iZWdpbigpK2kpOyAgLy8gRXJhc2UgZW50cnkKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIGlmIChNQkIgPT0gRGVmQmxvY2spIHJldHVybjsgIC8vIFRlcm1pbmF0ZSByZWN1cnNpb24KKworICBpZiAoVlJJbmZvLkFsaXZlQmxvY2tzLnRlc3QoQkJOdW0pKQorICAgIHJldHVybjsgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgYmxvY2sgaXMgbGl2ZQorCisgIC8vIE1hcmsgdGhlIHZhcmlhYmxlIGtub3duIGFsaXZlIGluIHRoaXMgYmIKKyAgVlJJbmZvLkFsaXZlQmxvY2tzLnNldChCQk51bSk7CisKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfcHJlZF9yZXZlcnNlX2l0ZXJhdG9yIFBJID0gTUJCLT5wcmVkX3JiZWdpbigpLAorICAgICAgICAgRSA9IE1CQi0+cHJlZF9yZW5kKCk7IFBJICE9IEU7ICsrUEkpCisgICAgV29ya0xpc3QucHVzaF9iYWNrKCpQSSk7Cit9CisKK3ZvaWQgTGl2ZVZhcmlhYmxlczo6TWFya1ZpcnRSZWdBbGl2ZUluQmxvY2soVmFySW5mbyAmVlJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRGVmQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiBXb3JrTGlzdDsKKyAgTWFya1ZpcnRSZWdBbGl2ZUluQmxvY2soVlJJbmZvLCBEZWZCbG9jaywgTUJCLCBXb3JrTGlzdCk7CisKKyAgd2hpbGUgKCFXb3JrTGlzdC5lbXB0eSgpKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWQgPSBXb3JrTGlzdC5iYWNrKCk7CisgICAgV29ya0xpc3QucG9wX2JhY2soKTsKKyAgICBNYXJrVmlydFJlZ0FsaXZlSW5CbG9jayhWUkluZm8sIERlZkJsb2NrLCBQcmVkLCBXb3JrTGlzdCk7CisgIH0KK30KKwordm9pZCBMaXZlVmFyaWFibGVzOjpIYW5kbGVWaXJ0UmVnVXNlKHVuc2lnbmVkIHJlZywgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk1JKSB7CisgIGFzc2VydChNUkktPmdldFZSZWdEZWYocmVnKSAmJiAiUmVnaXN0ZXIgdXNlIGJlZm9yZSBkZWYhIik7CisKKyAgdW5zaWduZWQgQkJOdW0gPSBNQkItPmdldE51bWJlcigpOworCisgIFZhckluZm8mIFZSSW5mbyA9IGdldFZhckluZm8ocmVnKTsKKyAgVlJJbmZvLk51bVVzZXMrKzsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBiYXNpYyBibG9jayBpcyBhbHJlYWR5IGEga2lsbCBibG9jay4KKyAgaWYgKCFWUkluZm8uS2lsbHMuZW1wdHkoKSAmJiBWUkluZm8uS2lsbHMuYmFjaygpLT5nZXRQYXJlbnQoKSA9PSBNQkIpIHsKKyAgICAvLyBZZXMsIHRoaXMgcmVnaXN0ZXIgaXMga2lsbGVkIGluIHRoaXMgYmFzaWMgYmxvY2sgYWxyZWFkeS4gSW5jcmVhc2UgdGhlCisgICAgLy8gbGl2ZSByYW5nZSBieSB1cGRhdGluZyB0aGUga2lsbCBpbnN0cnVjdGlvbi4KKyAgICBWUkluZm8uS2lsbHMuYmFjaygpID0gTUk7CisgICAgcmV0dXJuOworICB9CisKKyNpZm5kZWYgTkRFQlVHCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWUkluZm8uS2lsbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBhc3NlcnQoVlJJbmZvLktpbGxzW2ldLT5nZXRQYXJlbnQoKSAhPSBNQkIgJiYgImVudHJ5IHNob3VsZCBiZSBhdCBlbmQhIik7CisjZW5kaWYKKworICAvLyBUaGlzIHNpdHVhdGlvbiBjYW4gb2NjdXI6CisgIC8vCisgIC8vICAgICAsLS0tLS0tLgorICAvLyAgICAgfCAgICAgIHwKKyAgLy8gICAgIHwgICAgICB2CisgIC8vICAgICB8ICAgdDIgPSBwaGkgLi4uIHQxIC4uLgorICAvLyAgICAgfCAgICAgIHwKKyAgLy8gICAgIHwgICAgICB2CisgIC8vICAgICB8ICAgdDEgPSAuLi4KKyAgLy8gICAgIHwgIC4uLiA9IC4uLiB0MSAuLi4KKyAgLy8gICAgIHwgICAgICB8CisgIC8vICAgICBgLS0tLS0tJworICAvLworICAvLyB3aGVyZSB0aGVyZSBpcyBhIHVzZSBpbiBhIFBISSBub2RlIHRoYXQncyBhIHByZWRlY2Vzc29yIHRvIHRoZSBkZWZpbmluZworICAvLyBibG9jay4gV2UgZG9uJ3Qgd2FudCB0byBtYXJrIGFsbCBwcmVkZWNlc3NvcnMgYXMgaGF2aW5nIHRoZSB2YWx1ZSAiYWxpdmUiCisgIC8vIGluIHRoaXMgY2FzZS4KKyAgaWYgKE1CQiA9PSBNUkktPmdldFZSZWdEZWYocmVnKS0+Z2V0UGFyZW50KCkpIHJldHVybjsKKworICAvLyBBZGQgYSBuZXcga2lsbCBlbnRyeSBmb3IgdGhpcyBiYXNpYyBibG9jay4gSWYgdGhpcyB2aXJ0dWFsIHJlZ2lzdGVyIGlzCisgIC8vIGFscmVhZHkgbWFya2VkIGFzIGFsaXZlIGluIHRoaXMgYmFzaWMgYmxvY2ssIHRoYXQgbWVhbnMgaXQgaXMgYWxpdmUgaW4gYXQKKyAgLy8gbGVhc3Qgb25lIG9mIHRoZSBzdWNjZXNzb3IgYmxvY2tzLCBpdCdzIG5vdCBhIGtpbGwuCisgIGlmICghVlJJbmZvLkFsaXZlQmxvY2tzLnRlc3QoQkJOdW0pKQorICAgIFZSSW5mby5LaWxscy5wdXNoX2JhY2soTUkpOworCisgIC8vIFVwZGF0ZSBhbGwgZG9taW5hdGluZyBibG9ja3MgdG8gbWFyayB0aGVtIGFzICJrbm93biBsaXZlIi4KKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfcHJlZF9pdGVyYXRvciBQSSA9IE1CQi0+cHJlZF9iZWdpbigpLAorICAgICAgICAgRSA9IE1CQi0+cHJlZF9lbmQoKTsgUEkgIT0gRTsgKytQSSkKKyAgICBNYXJrVmlydFJlZ0FsaXZlSW5CbG9jayhWUkluZm8sIE1SSS0+Z2V0VlJlZ0RlZihyZWcpLT5nZXRQYXJlbnQoKSwgKlBJKTsKK30KKwordm9pZCBMaXZlVmFyaWFibGVzOjpIYW5kbGVWaXJ0UmVnRGVmKHVuc2lnbmVkIFJlZywgTWFjaGluZUluc3RyICpNSSkgeworICBWYXJJbmZvICZWUkluZm8gPSBnZXRWYXJJbmZvKFJlZyk7CisKKyAgaWYgKFZSSW5mby5BbGl2ZUJsb2Nrcy5lbXB0eSgpKQorICAgIC8vIElmIHZyIGlzIG5vdCBhbGl2ZSBpbiBhbnkgYmxvY2ssIHRoZW4gZGVmYXVsdHMgdG8gZGVhZC4KKyAgICBWUkluZm8uS2lsbHMucHVzaF9iYWNrKE1JKTsKK30KKworLy8vIEZpbmRMYXN0UGFydGlhbERlZiAtIFJldHVybiB0aGUgbGFzdCBwYXJ0aWFsIGRlZiBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorLy8vIEFsc28gcmV0dXJucyB0aGUgc3ViLXJlZ2lzdGVycyB0aGF0J3JlIGRlZmluZWQgYnkgdGhlIGluc3RydWN0aW9uLgorTWFjaGluZUluc3RyICpMaXZlVmFyaWFibGVzOjpGaW5kTGFzdFBhcnRpYWxEZWYodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDx1bnNpZ25lZCw0PiAmUGFydERlZlJlZ3MpIHsKKyAgdW5zaWduZWQgTGFzdERlZlJlZyA9IDA7CisgIHVuc2lnbmVkIExhc3REZWZEaXN0ID0gMDsKKyAgTWFjaGluZUluc3RyICpMYXN0RGVmID0gTlVMTDsKKyAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3ViUmVncyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgdW5zaWduZWQgU3ViUmVnID0gKlN1YlJlZ3M7ICsrU3ViUmVncykgeworICAgIE1hY2hpbmVJbnN0ciAqRGVmID0gUGh5c1JlZ0RlZltTdWJSZWddOworICAgIGlmICghRGVmKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgRGlzdCA9IERpc3RhbmNlTWFwW0RlZl07CisgICAgaWYgKERpc3QgPiBMYXN0RGVmRGlzdCkgeworICAgICAgTGFzdERlZlJlZyAgPSBTdWJSZWc7CisgICAgICBMYXN0RGVmICAgICA9IERlZjsKKyAgICAgIExhc3REZWZEaXN0ID0gRGlzdDsKKyAgICB9CisgIH0KKworICBpZiAoIUxhc3REZWYpCisgICAgcmV0dXJuIDA7CisKKyAgUGFydERlZlJlZ3MuaW5zZXJ0KExhc3REZWZSZWcpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTGFzdERlZi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBMYXN0RGVmLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNEZWYoKSB8fCBNTy5nZXRSZWcoKSA9PSAwKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgRGVmUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKFRSSS0+aXNTdWJSZWdpc3RlcihSZWcsIERlZlJlZykpIHsKKyAgICAgIFBhcnREZWZSZWdzLmluc2VydChEZWZSZWcpOworICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3ViUmVncyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKERlZlJlZyk7CisgICAgICAgICAgIHVuc2lnbmVkIFN1YlJlZyA9ICpTdWJSZWdzOyArK1N1YlJlZ3MpCisgICAgICAgIFBhcnREZWZSZWdzLmluc2VydChTdWJSZWcpOworICAgIH0KKyAgfQorICByZXR1cm4gTGFzdERlZjsKK30KKworLy8vIEhhbmRsZVBoeXNSZWdVc2UgLSBUdXJuIHByZXZpb3VzIHBhcnRpYWwgZGVmJ3MgaW50byByZWFkL21vZC93cml0ZXMuIEFkZAorLy8vIGltcGxpY2l0IGRlZnMgdG8gYSBtYWNoaW5lIGluc3RydWN0aW9uIGlmIHRoZXJlIHdhcyBhbiBlYXJsaWVyIGRlZiBvZiBpdHMKKy8vLyBzdXBlci1yZWdpc3Rlci4KK3ZvaWQgTGl2ZVZhcmlhYmxlczo6SGFuZGxlUGh5c1JlZ1VzZSh1bnNpZ25lZCBSZWcsIE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgTWFjaGluZUluc3RyICpMYXN0RGVmID0gUGh5c1JlZ0RlZltSZWddOworICAvLyBJZiB0aGVyZSB3YXMgYSBwcmV2aW91cyB1c2Ugb3IgYSAiZnVsbCIgZGVmIGFsbCBpcyB3ZWxsLgorICBpZiAoIUxhc3REZWYgJiYgIVBoeXNSZWdVc2VbUmVnXSkgeworICAgIC8vIE90aGVyd2lzZSwgdGhlIGxhc3Qgc3ViLXJlZ2lzdGVyIGRlZiBpbXBsaWNpdGx5IGRlZmluZXMgdGhpcyByZWdpc3Rlci4KKyAgICAvLyBlLmcuCisgICAgLy8gQUggPQorICAgIC8vIEFMID0gLi4uIDxpbXAtZGVmIEVBWD4sIDxpbXAta2lsbCBBSD4KKyAgICAvLyAgICA9IEFICisgICAgLy8gLi4uCisgICAgLy8gICAgPSBFQVgKKyAgICAvLyBBbGwgb2YgdGhlIHN1Yi1yZWdpc3RlcnMgbXVzdCBoYXZlIGJlZW4gZGVmaW5lZCBiZWZvcmUgdGhlIHVzZSBvZiBSZWchCisgICAgU21hbGxTZXQ8dW5zaWduZWQsIDQ+IFBhcnREZWZSZWdzOworICAgIE1hY2hpbmVJbnN0ciAqTGFzdFBhcnRpYWxEZWYgPSBGaW5kTGFzdFBhcnRpYWxEZWYoUmVnLCBQYXJ0RGVmUmVncyk7CisgICAgLy8gSWYgTGFzdFBhcnRpYWxEZWYgaXMgTlVMTCwgaXQgbXVzdCBiZSB1c2luZyBhIGxpdmVpbiByZWdpc3Rlci4KKyAgICBpZiAoTGFzdFBhcnRpYWxEZWYpIHsKKyAgICAgIExhc3RQYXJ0aWFsRGVmLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWcoUmVnLCB0cnVlLypJc0RlZiovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLypJc0ltcCovKSk7CisgICAgICBQaHlzUmVnRGVmW1JlZ10gPSBMYXN0UGFydGlhbERlZjsKKyAgICAgIFNtYWxsU2V0PHVuc2lnbmVkLCA4PiBQcm9jZXNzZWQ7CisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTdWJSZWdzID0gVFJJLT5nZXRTdWJSZWdpc3RlcnMoUmVnKTsKKyAgICAgICAgICAgdW5zaWduZWQgU3ViUmVnID0gKlN1YlJlZ3M7ICsrU3ViUmVncykgeworICAgICAgICBpZiAoUHJvY2Vzc2VkLmNvdW50KFN1YlJlZykpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChQYXJ0RGVmUmVncy5jb3VudChTdWJSZWcpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBUaGlzIHBhcnQgb2YgUmVnIHdhcyBkZWZpbmVkIGJlZm9yZSB0aGUgbGFzdCBwYXJ0aWFsIGRlZi4gSXQncyBraWxsZWQKKyAgICAgICAgLy8gaGVyZS4KKyAgICAgICAgTGFzdFBhcnRpYWxEZWYtPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhTdWJSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UvKklzRGVmKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZS8qSXNJbXAqLykpOworICAgICAgICBQaHlzUmVnRGVmW1N1YlJlZ10gPSBMYXN0UGFydGlhbERlZjsKKyAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU1MgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhTdWJSZWcpOyAqU1M7ICsrU1MpCisgICAgICAgICAgUHJvY2Vzc2VkLmluc2VydCgqU1MpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmIChMYXN0RGVmICYmICFQaHlzUmVnVXNlW1JlZ10gJiYKKyAgICAgICAgICAgIUxhc3REZWYtPmZpbmRSZWdpc3RlckRlZk9wZXJhbmQoUmVnKSkKKyAgICAvLyBMYXN0IGRlZiBkZWZpbmVzIHRoZSBzdXBlciByZWdpc3RlciwgYWRkIGFuIGltcGxpY2l0IGRlZiBvZiByZWcuCisgICAgTGFzdERlZi0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLypJc0RlZiovLCB0cnVlLypJc0ltcCovKSk7CisKKyAgLy8gUmVtZW1iZXIgdGhpcyB1c2UuCisgIFBoeXNSZWdVc2VbUmVnXSAgPSBNSTsKKyAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3ViUmVncyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgdW5zaWduZWQgU3ViUmVnID0gKlN1YlJlZ3M7ICsrU3ViUmVncykKKyAgICBQaHlzUmVnVXNlW1N1YlJlZ10gPSAgTUk7Cit9CisKKy8vLyBGaW5kTGFzdFJlZk9yUGFydFJlZiAtIFJldHVybiB0aGUgbGFzdCByZWZlcmVuY2Ugb3IgcGFydGlhbCByZWZlcmVuY2Ugb2YKKy8vLyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorTWFjaGluZUluc3RyICpMaXZlVmFyaWFibGVzOjpGaW5kTGFzdFJlZk9yUGFydFJlZih1bnNpZ25lZCBSZWcpIHsKKyAgTWFjaGluZUluc3RyICpMYXN0RGVmID0gUGh5c1JlZ0RlZltSZWddOworICBNYWNoaW5lSW5zdHIgKkxhc3RVc2UgPSBQaHlzUmVnVXNlW1JlZ107CisgIGlmICghTGFzdERlZiAmJiAhTGFzdFVzZSkKKyAgICByZXR1cm4gMDsKKworICBNYWNoaW5lSW5zdHIgKkxhc3RSZWZPclBhcnRSZWYgPSBMYXN0VXNlID8gTGFzdFVzZSA6IExhc3REZWY7CisgIHVuc2lnbmVkIExhc3RSZWZPclBhcnRSZWZEaXN0ID0gRGlzdGFuY2VNYXBbTGFzdFJlZk9yUGFydFJlZl07CisgIHVuc2lnbmVkIExhc3RQYXJ0RGVmRGlzdCA9IDA7CisgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YlJlZ3MgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOworICAgICAgIHVuc2lnbmVkIFN1YlJlZyA9ICpTdWJSZWdzOyArK1N1YlJlZ3MpIHsKKyAgICBNYWNoaW5lSW5zdHIgKkRlZiA9IFBoeXNSZWdEZWZbU3ViUmVnXTsKKyAgICBpZiAoRGVmICYmIERlZiAhPSBMYXN0RGVmKSB7CisgICAgICAvLyBUaGVyZSB3YXMgYSBkZWYgb2YgdGhpcyBzdWItcmVnaXN0ZXIgaW4gYmV0d2Vlbi4gVGhpcyBpcyBhIHBhcnRpYWwKKyAgICAgIC8vIGRlZiwga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBvbmUuCisgICAgICB1bnNpZ25lZCBEaXN0ID0gRGlzdGFuY2VNYXBbRGVmXTsKKyAgICAgIGlmIChEaXN0ID4gTGFzdFBhcnREZWZEaXN0KQorICAgICAgICBMYXN0UGFydERlZkRpc3QgPSBEaXN0OworICAgIH0gZWxzZSBpZiAoTWFjaGluZUluc3RyICpVc2UgPSBQaHlzUmVnVXNlW1N1YlJlZ10pIHsKKyAgICAgIHVuc2lnbmVkIERpc3QgPSBEaXN0YW5jZU1hcFtVc2VdOworICAgICAgaWYgKERpc3QgPiBMYXN0UmVmT3JQYXJ0UmVmRGlzdCkgeworICAgICAgICBMYXN0UmVmT3JQYXJ0UmVmRGlzdCA9IERpc3Q7CisgICAgICAgIExhc3RSZWZPclBhcnRSZWYgPSBVc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIExhc3RSZWZPclBhcnRSZWY7Cit9CisKK2Jvb2wgTGl2ZVZhcmlhYmxlczo6SGFuZGxlUGh5c1JlZ0tpbGwodW5zaWduZWQgUmVnLCBNYWNoaW5lSW5zdHIgKk1JKSB7CisgIE1hY2hpbmVJbnN0ciAqTGFzdERlZiA9IFBoeXNSZWdEZWZbUmVnXTsKKyAgTWFjaGluZUluc3RyICpMYXN0VXNlID0gUGh5c1JlZ1VzZVtSZWddOworICBpZiAoIUxhc3REZWYgJiYgIUxhc3RVc2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIE1hY2hpbmVJbnN0ciAqTGFzdFJlZk9yUGFydFJlZiA9IExhc3RVc2UgPyBMYXN0VXNlIDogTGFzdERlZjsKKyAgdW5zaWduZWQgTGFzdFJlZk9yUGFydFJlZkRpc3QgPSBEaXN0YW5jZU1hcFtMYXN0UmVmT3JQYXJ0UmVmXTsKKyAgLy8gVGhlIHdob2xlIHJlZ2lzdGVyIGlzIHVzZWQuCisgIC8vIEFMID0KKyAgLy8gQUggPQorICAvLworICAvLyAgICA9IEFYCisgIC8vICAgID0gQUwsIEFYPGltcC11c2UsIGtpbGw+CisgIC8vIEFYID0KKyAgLy8KKyAgLy8gT3Igd2hvbGUgcmVnaXN0ZXIgaXMgZGVmaW5lZCwgYnV0IG5vdCB1c2VkIGF0IGFsbC4KKyAgLy8gQVg8ZGVhZD4gPQorICAvLyAuLi4KKyAgLy8gQVggPQorICAvLworICAvLyBPciB3aG9sZSByZWdpc3RlciBpcyBkZWZpbmVkLCBidXQgb25seSBwYXJ0bHkgdXNlZC4KKyAgLy8gQVg8ZGVhZD4gPSBBTDxpbXAtZGVmPgorICAvLyAgICA9IEFMPGtpbGw+CisgIC8vIEFYID0gCisgIE1hY2hpbmVJbnN0ciAqTGFzdFBhcnREZWYgPSAwOworICB1bnNpZ25lZCBMYXN0UGFydERlZkRpc3QgPSAwOworICBTbWFsbFNldDx1bnNpZ25lZCwgOD4gUGFydFVzZXM7CisgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YlJlZ3MgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOworICAgICAgIHVuc2lnbmVkIFN1YlJlZyA9ICpTdWJSZWdzOyArK1N1YlJlZ3MpIHsKKyAgICBNYWNoaW5lSW5zdHIgKkRlZiA9IFBoeXNSZWdEZWZbU3ViUmVnXTsKKyAgICBpZiAoRGVmICYmIERlZiAhPSBMYXN0RGVmKSB7CisgICAgICAvLyBUaGVyZSB3YXMgYSBkZWYgb2YgdGhpcyBzdWItcmVnaXN0ZXIgaW4gYmV0d2Vlbi4gVGhpcyBpcyBhIHBhcnRpYWwKKyAgICAgIC8vIGRlZiwga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBvbmUuCisgICAgICB1bnNpZ25lZCBEaXN0ID0gRGlzdGFuY2VNYXBbRGVmXTsKKyAgICAgIGlmIChEaXN0ID4gTGFzdFBhcnREZWZEaXN0KSB7CisgICAgICAgIExhc3RQYXJ0RGVmRGlzdCA9IERpc3Q7CisgICAgICAgIExhc3RQYXJ0RGVmID0gRGVmOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChNYWNoaW5lSW5zdHIgKlVzZSA9IFBoeXNSZWdVc2VbU3ViUmVnXSkgeworICAgICAgUGFydFVzZXMuaW5zZXJ0KFN1YlJlZyk7CisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTUyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFN1YlJlZyk7ICpTUzsgKytTUykKKyAgICAgICAgUGFydFVzZXMuaW5zZXJ0KCpTUyk7CisgICAgICB1bnNpZ25lZCBEaXN0ID0gRGlzdGFuY2VNYXBbVXNlXTsKKyAgICAgIGlmIChEaXN0ID4gTGFzdFJlZk9yUGFydFJlZkRpc3QpIHsKKyAgICAgICAgTGFzdFJlZk9yUGFydFJlZkRpc3QgPSBEaXN0OworICAgICAgICBMYXN0UmVmT3JQYXJ0UmVmID0gVXNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghUGh5c1JlZ1VzZVtSZWddKSB7CisgICAgLy8gUGFydGlhbCB1c2VzLiBNYXJrIHJlZ2lzdGVyIGRlZiBkZWFkIGFuZCBhZGQgaW1wbGljaXQgZGVmIG9mCisgICAgLy8gc3ViLXJlZ2lzdGVycyB3aGljaCBhcmUgdXNlZC4KKyAgICAvLyBFQVg8ZGVhZD4gID0gb3AgIEFMPGltcC1kZWY+CisgICAgLy8gVGhhdCBpcywgRUFYIGRlZiBpcyBkZWFkIGJ1dCBBTCBkZWYgZXh0ZW5kcyBwYXNzIGl0LgorICAgIFBoeXNSZWdEZWZbUmVnXS0+YWRkUmVnaXN0ZXJEZWFkKFJlZywgVFJJLCB0cnVlKTsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTdWJSZWdzID0gVFJJLT5nZXRTdWJSZWdpc3RlcnMoUmVnKTsKKyAgICAgICAgIHVuc2lnbmVkIFN1YlJlZyA9ICpTdWJSZWdzOyArK1N1YlJlZ3MpIHsKKyAgICAgIGlmICghUGFydFVzZXMuY291bnQoU3ViUmVnKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBib29sIE5lZWREZWYgPSB0cnVlOworICAgICAgaWYgKFBoeXNSZWdEZWZbUmVnXSA9PSBQaHlzUmVnRGVmW1N1YlJlZ10pIHsKKyAgICAgICAgTWFjaGluZU9wZXJhbmQgKk1PID0gUGh5c1JlZ0RlZltSZWddLT5maW5kUmVnaXN0ZXJEZWZPcGVyYW5kKFN1YlJlZyk7CisgICAgICAgIGlmIChNTykgeworICAgICAgICAgIE5lZWREZWYgPSBmYWxzZTsKKyAgICAgICAgICBhc3NlcnQoIU1PLT5pc0RlYWQoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChOZWVkRGVmKQorICAgICAgICBQaHlzUmVnRGVmW1JlZ10tPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhTdWJSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZS8qSXNEZWYqLywgdHJ1ZS8qSXNJbXAqLykpOworICAgICAgTWFjaGluZUluc3RyICpMYXN0U3ViUmVmID0gRmluZExhc3RSZWZPclBhcnRSZWYoU3ViUmVnKTsKKyAgICAgIGlmIChMYXN0U3ViUmVmKQorICAgICAgICBMYXN0U3ViUmVmLT5hZGRSZWdpc3RlcktpbGxlZChTdWJSZWcsIFRSSSwgdHJ1ZSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgTGFzdFJlZk9yUGFydFJlZi0+YWRkUmVnaXN0ZXJLaWxsZWQoU3ViUmVnLCBUUkksIHRydWUpOworICAgICAgICBQaHlzUmVnVXNlW1N1YlJlZ10gPSBMYXN0UmVmT3JQYXJ0UmVmOworICAgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTU1JlZ3MgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhTdWJSZWcpOworICAgICAgICAgICAgIHVuc2lnbmVkIFNTUmVnID0gKlNTUmVnczsgKytTU1JlZ3MpCisgICAgICAgICAgUGh5c1JlZ1VzZVtTU1JlZ10gPSBMYXN0UmVmT3JQYXJ0UmVmOworICAgICAgfQorICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU1MgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhTdWJSZWcpOyAqU1M7ICsrU1MpCisgICAgICAgIFBhcnRVc2VzLmVyYXNlKCpTUyk7CisgICAgfQorICB9IGVsc2UgaWYgKExhc3RSZWZPclBhcnRSZWYgPT0gUGh5c1JlZ0RlZltSZWddICYmIExhc3RSZWZPclBhcnRSZWYgIT0gTUkpIHsKKyAgICBpZiAoTGFzdFBhcnREZWYpCisgICAgICAvLyBUaGUgbGFzdCBwYXJ0aWFsIGRlZiBraWxscyB0aGUgcmVnaXN0ZXIuCisgICAgICBMYXN0UGFydERlZi0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKFJlZywgZmFsc2UvKklzRGVmKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLypJc0ltcCovLCB0cnVlLypJc0tpbGwqLykpOworICAgIGVsc2UgeworICAgICAgTWFjaGluZU9wZXJhbmQgKk1PID0KKyAgICAgICAgTGFzdFJlZk9yUGFydFJlZi0+ZmluZFJlZ2lzdGVyRGVmT3BlcmFuZChSZWcsIGZhbHNlLCBUUkkpOworICAgICAgYm9vbCBOZWVkRUMgPSBNTy0+aXNFYXJseUNsb2JiZXIoKSAmJiBNTy0+Z2V0UmVnKCkgIT0gUmVnOworICAgICAgLy8gSWYgdGhlIGxhc3QgcmVmZXJlbmNlIGlzIHRoZSBsYXN0IGRlZiwgdGhlbiBpdCdzIG5vdCB1c2VkIGF0IGFsbC4KKyAgICAgIC8vIFRoYXQgaXMsIHVubGVzcyB3ZSBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIGl0c2VsZi4KKyAgICAgIExhc3RSZWZPclBhcnRSZWYtPmFkZFJlZ2lzdGVyRGVhZChSZWcsIFRSSSwgdHJ1ZSk7CisgICAgICBpZiAoTmVlZEVDKSB7CisgICAgICAgIC8vIElmIHdlIGFyZSBhZGRpbmcgYSBzdWJyZWcgZGVmIGFuZCB0aGUgc3VwZXJyZWcgZGVmIGlzIG1hcmtlZCBlYXJseQorICAgICAgICAvLyBjbG9iYmVyLCBhZGQgYW4gZWFybHkgY2xvYmJlciBtYXJrZXIgdG8gdGhlIHN1YnJlZyBkZWYuCisgICAgICAgIE1PID0gTGFzdFJlZk9yUGFydFJlZi0+ZmluZFJlZ2lzdGVyRGVmT3BlcmFuZChSZWcpOworICAgICAgICBpZiAoTU8pCisgICAgICAgICAgTU8tPnNldElzRWFybHlDbG9iYmVyKCk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UKKyAgICBMYXN0UmVmT3JQYXJ0UmVmLT5hZGRSZWdpc3RlcktpbGxlZChSZWcsIFRSSSwgdHJ1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIExpdmVWYXJpYWJsZXM6OkhhbmRsZVBoeXNSZWdEZWYodW5zaWduZWQgUmVnLCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmRGVmcykgeworICAvLyBXaGF0IHBhcnRzIG9mIHRoZSByZWdpc3RlciBhcmUgcHJldmlvdXNseSBkZWZpbmVkPworICBTbWFsbFNldDx1bnNpZ25lZCwgMzI+IExpdmU7CisgIGlmIChQaHlzUmVnRGVmW1JlZ10gfHwgUGh5c1JlZ1VzZVtSZWddKSB7CisgICAgTGl2ZS5pbnNlcnQoUmVnKTsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTUyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7ICpTUzsgKytTUykKKyAgICAgIExpdmUuaW5zZXJ0KCpTUyk7CisgIH0gZWxzZSB7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3ViUmVncyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgICB1bnNpZ25lZCBTdWJSZWcgPSAqU3ViUmVnczsgKytTdWJSZWdzKSB7CisgICAgICAvLyBJZiBhIHJlZ2lzdGVyIGlzbid0IGl0c2VsZiBkZWZpbmVkLCBidXQgYWxsIHBhcnRzIHRoYXQgbWFrZSB1cCBvZiBpdAorICAgICAgLy8gYXJlIGRlZmluZWQsIHRoZW4gY29uc2lkZXIgaXQgYWxzbyBkZWZpbmVkLgorICAgICAgLy8gZS5nLgorICAgICAgLy8gQUwgPQorICAgICAgLy8gQUggPQorICAgICAgLy8gICAgPSBBWAorICAgICAgaWYgKExpdmUuY291bnQoU3ViUmVnKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoUGh5c1JlZ0RlZltTdWJSZWddIHx8IFBoeXNSZWdVc2VbU3ViUmVnXSkgeworICAgICAgICBMaXZlLmluc2VydChTdWJSZWcpOworICAgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTUyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFN1YlJlZyk7ICpTUzsgKytTUykKKyAgICAgICAgICBMaXZlLmluc2VydCgqU1MpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFN0YXJ0IGZyb20gdGhlIGxhcmdlc3QgcGllY2UsIGZpbmQgdGhlIGxhc3QgdGltZSBhbnkgcGFydCBvZiB0aGUgcmVnaXN0ZXIKKyAgLy8gaXMgcmVmZXJlbmNlZC4KKyAgSGFuZGxlUGh5c1JlZ0tpbGwoUmVnLCBNSSk7CisgIC8vIE9ubHkgc29tZSBvZiB0aGUgc3ViLXJlZ2lzdGVycyBhcmUgdXNlZC4KKyAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3ViUmVncyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgdW5zaWduZWQgU3ViUmVnID0gKlN1YlJlZ3M7ICsrU3ViUmVncykgeworICAgIGlmICghTGl2ZS5jb3VudChTdWJSZWcpKQorICAgICAgLy8gU2tpcCBpZiB0aGlzIHN1Yi1yZWdpc3RlciBpc24ndCBkZWZpbmVkLgorICAgICAgY29udGludWU7CisgICAgSGFuZGxlUGh5c1JlZ0tpbGwoU3ViUmVnLCBNSSk7CisgIH0KKworICBpZiAoTUkpCisgICAgRGVmcy5wdXNoX2JhY2soUmVnKTsgIC8vIFJlbWVtYmVyIHRoaXMgZGVmLgorfQorCit2b2lkIExpdmVWYXJpYWJsZXM6OlVwZGF0ZVBoeXNSZWdEZWZzKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmRGVmcykgeworICB3aGlsZSAoIURlZnMuZW1wdHkoKSkgeworICAgIHVuc2lnbmVkIFJlZyA9IERlZnMuYmFjaygpOworICAgIERlZnMucG9wX2JhY2soKTsKKyAgICBQaHlzUmVnRGVmW1JlZ10gID0gTUk7CisgICAgUGh5c1JlZ1VzZVtSZWddICA9IE5VTEw7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3ViUmVncyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgICB1bnNpZ25lZCBTdWJSZWcgPSAqU3ViUmVnczsgKytTdWJSZWdzKSB7CisgICAgICBQaHlzUmVnRGVmW1N1YlJlZ10gID0gTUk7CisgICAgICBQaHlzUmVnVXNlW1N1YlJlZ10gID0gTlVMTDsKKyAgICB9CisgIH0KK30KKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IFJlZ1NvcnRlciB7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisKKyAgICBSZWdTb3J0ZXIoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICp0cmkpIDogVFJJKHRyaSkgeyB9CisgICAgYm9vbCBvcGVyYXRvcigpKHVuc2lnbmVkIEEsIHVuc2lnbmVkIEIpIHsKKyAgICAgIGlmIChUUkktPmlzU3ViUmVnaXN0ZXIoQSwgQikpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZWxzZSBpZiAoVFJJLT5pc1N1YlJlZ2lzdGVyKEIsIEEpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gQSA8IEI7CisgICAgfQorICB9OworfQorCitib29sIExpdmVWYXJpYWJsZXM6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmbWYpIHsKKyAgTUYgPSAmbWY7CisgIE1SSSA9ICZtZi5nZXRSZWdJbmZvKCk7CisgIFRSSSA9IE1GLT5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKworICBSZXNlcnZlZFJlZ2lzdGVycyA9IFRSSS0+Z2V0UmVzZXJ2ZWRSZWdzKG1mKTsKKworICB1bnNpZ25lZCBOdW1SZWdzID0gVFJJLT5nZXROdW1SZWdzKCk7CisgIFBoeXNSZWdEZWYgID0gbmV3IE1hY2hpbmVJbnN0cipbTnVtUmVnc107CisgIFBoeXNSZWdVc2UgID0gbmV3IE1hY2hpbmVJbnN0cipbTnVtUmVnc107CisgIFBISVZhckluZm8gPSBuZXcgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+W01GLT5nZXROdW1CbG9ja0lEcygpXTsKKyAgc3RkOjpmaWxsKFBoeXNSZWdEZWYsICBQaHlzUmVnRGVmICArIE51bVJlZ3MsIChNYWNoaW5lSW5zdHIqKTApOworICBzdGQ6OmZpbGwoUGh5c1JlZ1VzZSwgIFBoeXNSZWdVc2UgICsgTnVtUmVncywgKE1hY2hpbmVJbnN0ciopMCk7CisgIFBISUpvaW5zLmNsZWFyKCk7CisKKyAgLy8vIEdldCBzb21lIHNwYWNlIGZvciBhIHJlc3BlY3RhYmxlIG51bWJlciBvZiByZWdpc3RlcnMuCisgIFZpcnRSZWdJbmZvLnJlc2l6ZSg2NCk7CisKKyAgYW5hbHl6ZVBISU5vZGVzKG1mKTsKKworICAvLyBDYWxjdWxhdGUgbGl2ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiBpbiBkZXB0aCBmaXJzdCBvcmRlciBvbiB0aGUgQ0ZHIG9mIHRoZQorICAvLyBmdW5jdGlvbi4gIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHdlIHdpbGwgc2VlIHRoZSBkZWZpbml0aW9uIG9mIGEgdmlydHVhbAorICAvLyByZWdpc3RlciBiZWZvcmUgaXRzIHVzZXMgZHVlIHRvIGRvbWluYW5jZSBwcm9wZXJ0aWVzIG9mIFNTQSAoZXhjZXB0IGZvciBQSEkKKyAgLy8gbm9kZXMsIHdoaWNoIGFyZSB0cmVhdGVkIGFzIGEgc3BlY2lhbCBjYXNlKS4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKkVudHJ5ID0gTUYtPmJlZ2luKCk7CisgIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwxNj4gVmlzaXRlZDsKKworICBmb3IgKGRmX2V4dF9pdGVyYXRvcjxNYWNoaW5lQmFzaWNCbG9jayosIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwxNj4gPgorICAgICAgICAgREZJID0gZGZfZXh0X2JlZ2luKEVudHJ5LCBWaXNpdGVkKSwgRSA9IGRmX2V4dF9lbmQoRW50cnksIFZpc2l0ZWQpOworICAgICAgIERGSSAhPSBFOyArK0RGSSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSAqREZJOworCisgICAgLy8gTWFyayBsaXZlLWluIHJlZ2lzdGVycyBhcyBsaXZlLWluLgorICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBEZWZzOworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmxpdmVpbl9pdGVyYXRvciBJSSA9IE1CQi0+bGl2ZWluX2JlZ2luKCksCisgICAgICAgICAgIEVFID0gTUJCLT5saXZlaW5fZW5kKCk7IElJICE9IEVFOyArK0lJKSB7CisgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoKklJKSAmJgorICAgICAgICAgICAgICJDYW5ub3QgaGF2ZSBhIGxpdmUtaW4gdmlydHVhbCByZWdpc3RlciEiKTsKKyAgICAgIEhhbmRsZVBoeXNSZWdEZWYoKklJLCAwLCBEZWZzKTsKKyAgICB9CisKKyAgICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMsIHByb2Nlc3NpbmcgdGhlbS4KKyAgICBEaXN0YW5jZU1hcC5jbGVhcigpOworICAgIHVuc2lnbmVkIERpc3QgPSAwOworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkItPmJlZ2luKCksIEUgPSBNQkItPmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBJOworICAgICAgaWYgKE1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBEaXN0YW5jZU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTUksIERpc3QrKykpOworCisgICAgICAvLyBQcm9jZXNzIGFsbCBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uLi4uCisgICAgICB1bnNpZ25lZCBOdW1PcGVyYW5kc1RvUHJvY2VzcyA9IE1JLT5nZXROdW1PcGVyYW5kcygpOworCisgICAgICAvLyBVbmxlc3MgaXQgaXMgYSBQSEkgbm9kZS4gIEluIHRoaXMgY2FzZSwgT05MWSBwcm9jZXNzIHRoZSBERUYsIG5vdCBhbnkKKyAgICAgIC8vIG9mIHRoZSB1c2VzLiAgVGhleSB3aWxsIGJlIGhhbmRsZWQgaW4gb3RoZXIgYmFzaWMgYmxvY2tzLgorICAgICAgaWYgKE1JLT5pc1BISSgpKQorICAgICAgICBOdW1PcGVyYW5kc1RvUHJvY2VzcyA9IDE7CisKKyAgICAgIC8vIENsZWFyIGtpbGwgYW5kIGRlYWQgbWFya2Vycy4gTFYgd2lsbCByZWNvbXB1dGUgdGhlbS4KKyAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBVc2VSZWdzOworICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IERlZlJlZ3M7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bU9wZXJhbmRzVG9Qcm9jZXNzOyArK2kpIHsKKyAgICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICAgIGlmICghTU8uaXNSZWcoKSB8fCBNTy5nZXRSZWcoKSA9PSAwKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB1bnNpZ25lZCBNT1JlZyA9IE1PLmdldFJlZygpOworICAgICAgICBpZiAoTU8uaXNVc2UoKSkgeworICAgICAgICAgIE1PLnNldElzS2lsbChmYWxzZSk7CisgICAgICAgICAgVXNlUmVncy5wdXNoX2JhY2soTU9SZWcpOworICAgICAgICB9IGVsc2UgLypNTy5pc0RlZigpKi8geworICAgICAgICAgIE1PLnNldElzRGVhZChmYWxzZSk7CisgICAgICAgICAgRGVmUmVncy5wdXNoX2JhY2soTU9SZWcpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFByb2Nlc3MgYWxsIHVzZXMuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVXNlUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIE1PUmVnID0gVXNlUmVnc1tpXTsKKyAgICAgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoTU9SZWcpKQorICAgICAgICAgIEhhbmRsZVZpcnRSZWdVc2UoTU9SZWcsIE1CQiwgTUkpOworICAgICAgICBlbHNlIGlmICghUmVzZXJ2ZWRSZWdpc3RlcnNbTU9SZWddKQorICAgICAgICAgIEhhbmRsZVBoeXNSZWdVc2UoTU9SZWcsIE1JKTsKKyAgICAgIH0KKworICAgICAgLy8gUHJvY2VzcyBhbGwgZGVmcy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEZWZSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgdW5zaWduZWQgTU9SZWcgPSBEZWZSZWdzW2ldOworICAgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihNT1JlZykpCisgICAgICAgICAgSGFuZGxlVmlydFJlZ0RlZihNT1JlZywgTUkpOworICAgICAgICBlbHNlIGlmICghUmVzZXJ2ZWRSZWdpc3RlcnNbTU9SZWddKQorICAgICAgICAgIEhhbmRsZVBoeXNSZWdEZWYoTU9SZWcsIE1JLCBEZWZzKTsKKyAgICAgIH0KKyAgICAgIFVwZGF0ZVBoeXNSZWdEZWZzKE1JLCBEZWZzKTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgYW55IHZpcnR1YWwgYXNzaWdubWVudHMgZnJvbSBQSEkgbm9kZXMgd2hpY2ggbWlnaHQgYmUgYXQgdGhlCisgICAgLy8gYm90dG9tIG9mIHRoaXMgYmFzaWMgYmxvY2suICBXZSBjaGVjayBhbGwgb2Ygb3VyIHN1Y2Nlc3NvciBibG9ja3MgdG8gc2VlCisgICAgLy8gaWYgdGhleSBoYXZlIFBISSBub2RlcywgYW5kIGlmIHNvLCB3ZSBzaW11bGF0ZSBhbiBhc3NpZ25tZW50IGF0IHRoZSBlbmQKKyAgICAvLyBvZiB0aGUgY3VycmVudCBibG9jay4KKyAgICBpZiAoIVBISVZhckluZm9bTUJCLT5nZXROdW1iZXIoKV0uZW1wdHkoKSkgeworICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+JiBWYXJJbmZvVmVjID0gUEhJVmFySW5mb1tNQkItPmdldE51bWJlcigpXTsKKworICAgICAgZm9yIChTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND46Oml0ZXJhdG9yIEkgPSBWYXJJbmZvVmVjLmJlZ2luKCksCisgICAgICAgICAgICAgRSA9IFZhckluZm9WZWMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICAvLyBNYXJrIGl0IGFsaXZlIG9ubHkgaW4gdGhlIGJsb2NrIHdlIGFyZSByZXByZXNlbnRpbmcuCisgICAgICAgIE1hcmtWaXJ0UmVnQWxpdmVJbkJsb2NrKGdldFZhckluZm8oKkkpLE1SSS0+Z2V0VlJlZ0RlZigqSSktPmdldFBhcmVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkIpOworICAgIH0KKworICAgIC8vIEZpbmFsbHksIGlmIHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBibG9jayBpcyBhIHJldHVybiwgbWFrZSBzdXJlIHRvCisgICAgLy8gbWFyayBpdCBhcyB1c2luZyBhbGwgb2YgdGhlIGxpdmUtb3V0IHZhbHVlcyBpbiB0aGUgZnVuY3Rpb24uCisgICAgLy8gVGhpbmdzIG1hcmtlZCBib3RoIGNhbGwgYW5kIHJldHVybiBhcmUgdGFpbCBjYWxsczsgZG8gbm90IGRvIHRoaXMgZm9yCisgICAgLy8gdGhlbS4gIFRoZSB0YWlsIGNhbGxlZSBuZWVkIG5vdCB0YWtlIHRoZSBzYW1lIHJlZ2lzdGVycyBhcyBpbnB1dAorICAgIC8vIHRoYXQgaXQgcHJvZHVjZXMgYXMgb3V0cHV0LCBhbmQgdGhlcmUgYXJlIGRlcGVuZGVuY2llcyBmb3IgaXRzIGlucHV0CisgICAgLy8gcmVnaXN0ZXJzIGVsc2V3aGVyZS4KKyAgICBpZiAoIU1CQi0+ZW1wdHkoKSAmJiBNQkItPmJhY2soKS5nZXREZXNjKCkuaXNSZXR1cm4oKQorICAgICAgICAmJiAhTUJCLT5iYWNrKCkuZ2V0RGVzYygpLmlzQ2FsbCgpKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKlJldCA9ICZNQkItPmJhY2soKTsKKworICAgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpsaXZlb3V0X2l0ZXJhdG9yCisgICAgICAgICAgIEkgPSBNRi0+Z2V0UmVnSW5mbygpLmxpdmVvdXRfYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE1GLT5nZXRSZWdJbmZvKCkubGl2ZW91dF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKCpJKSAmJgorICAgICAgICAgICAgICAgIkNhbm5vdCBoYXZlIGEgbGl2ZS1vdXQgdmlydHVhbCByZWdpc3RlciEiKTsKKyAgICAgICAgSGFuZGxlUGh5c1JlZ1VzZSgqSSwgUmV0KTsKKworICAgICAgICAvLyBBZGQgbGl2ZS1vdXQgcmVnaXN0ZXJzIGFzIGltcGxpY2l0IHVzZXMuCisgICAgICAgIGlmICghUmV0LT5yZWFkc1JlZ2lzdGVyKCpJKSkKKyAgICAgICAgICBSZXQtPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZygqSSwgZmFsc2UsIHRydWUpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBMb29wIG92ZXIgUGh5c1JlZ0RlZiAvIFBoeXNSZWdVc2UsIGtpbGxpbmcgYW55IHJlZ2lzdGVycyB0aGF0IGFyZQorICAgIC8vIGF2YWlsYWJsZSBhdCB0aGUgZW5kIG9mIHRoZSBiYXNpYyBibG9jay4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVJlZ3M7ICsraSkKKyAgICAgIGlmIChQaHlzUmVnRGVmW2ldIHx8IFBoeXNSZWdVc2VbaV0pCisgICAgICAgIEhhbmRsZVBoeXNSZWdEZWYoaSwgMCwgRGVmcyk7CisKKyAgICBzdGQ6OmZpbGwoUGh5c1JlZ0RlZiwgIFBoeXNSZWdEZWYgICsgTnVtUmVncywgKE1hY2hpbmVJbnN0ciopMCk7CisgICAgc3RkOjpmaWxsKFBoeXNSZWdVc2UsICBQaHlzUmVnVXNlICArIE51bVJlZ3MsIChNYWNoaW5lSW5zdHIqKTApOworICB9CisKKyAgLy8gQ29udmVydCBhbmQgdHJhbnNmZXIgdGhlIGRlYWQgLyBraWxsZWQgaW5mb3JtYXRpb24gd2UgaGF2ZSBnYXRoZXJlZCBpbnRvCisgIC8vIFZpcnRSZWdJbmZvIG9udG8gTUkncy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZTEgPSBWaXJ0UmVnSW5mby5zaXplKCk7IGkgIT0gZTE7ICsraSkKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlMiA9IFZpcnRSZWdJbmZvW2ldLktpbGxzLnNpemUoKTsgaiAhPSBlMjsgKytqKQorICAgICAgaWYgKFZpcnRSZWdJbmZvW2ldLktpbGxzW2pdID09CisgICAgICAgICAgTVJJLT5nZXRWUmVnRGVmKGkgKyBUYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyKSkKKyAgICAgICAgVmlydFJlZ0luZm9baV0KKyAgICAgICAgICAuS2lsbHNbal0tPmFkZFJlZ2lzdGVyRGVhZChpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSSSk7CisgICAgICBlbHNlCisgICAgICAgIFZpcnRSZWdJbmZvW2ldCisgICAgICAgICAgLktpbGxzW2pdLT5hZGRSZWdpc3RlcktpbGxlZChpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkkpOworCisgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gdW5yZWFjaGFibGUgYmxvY2tzIGluIHRoZSBNQyBDRkcgZm9yIHRoZQorICAvLyBmdW5jdGlvbi4gIElmIHNvLCBpdCBpcyBkdWUgdG8gYSBidWcgaW4gdGhlIGluc3RydWN0aW9uIHNlbGVjdG9yIG9yIHNvbWUKKyAgLy8gb3RoZXIgcGFydCBvZiB0aGUgY29kZSBnZW5lcmF0b3IgaWYgdGhpcyBoYXBwZW5zLgorI2lmbmRlZiBOREVCVUcKKyAgZm9yKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgaSA9IE1GLT5iZWdpbigpLCBlID0gTUYtPmVuZCgpOyBpICE9IGU7ICsraSkKKyAgICBhc3NlcnQoVmlzaXRlZC5jb3VudCgmKmkpICE9IDAgJiYgInVucmVhY2hhYmxlIGJhc2ljIGJsb2NrIGZvdW5kIik7CisjZW5kaWYKKworICBkZWxldGVbXSBQaHlzUmVnRGVmOworICBkZWxldGVbXSBQaHlzUmVnVXNlOworICBkZWxldGVbXSBQSElWYXJJbmZvOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIHJlcGxhY2VLaWxsSW5zdHJ1Y3Rpb24gLSBVcGRhdGUgcmVnaXN0ZXIga2lsbCBpbmZvIGJ5IHJlcGxhY2luZyBhIGtpbGwKKy8vLyBpbnN0cnVjdGlvbiB3aXRoIGEgbmV3IG9uZS4KK3ZvaWQgTGl2ZVZhcmlhYmxlczo6cmVwbGFjZUtpbGxJbnN0cnVjdGlvbih1bnNpZ25lZCBSZWcsIE1hY2hpbmVJbnN0ciAqT2xkTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpOZXdNSSkgeworICBWYXJJbmZvICZWSSA9IGdldFZhckluZm8oUmVnKTsKKyAgc3RkOjpyZXBsYWNlKFZJLktpbGxzLmJlZ2luKCksIFZJLktpbGxzLmVuZCgpLCBPbGRNSSwgTmV3TUkpOworfQorCisvLy8gcmVtb3ZlVmlydHVhbFJlZ2lzdGVyc0tpbGxlZCAtIFJlbW92ZSBhbGwga2lsbGVkIGluZm8gZm9yIHRoZSBzcGVjaWZpZWQKKy8vLyBpbnN0cnVjdGlvbi4KK3ZvaWQgTGl2ZVZhcmlhYmxlczo6cmVtb3ZlVmlydHVhbFJlZ2lzdGVyc0tpbGxlZChNYWNoaW5lSW5zdHIgKk1JKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5pc0tpbGwoKSkgeworICAgICAgTU8uc2V0SXNLaWxsKGZhbHNlKTsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUmVnKSkgeworICAgICAgICBib29sIHJlbW92ZWQgPSBnZXRWYXJJbmZvKFJlZykucmVtb3ZlS2lsbChNSSk7CisgICAgICAgIGFzc2VydChyZW1vdmVkICYmICJraWxsIG5vdCBpbiByZWdpc3RlcidzIFZhckluZm8/Iik7CisgICAgICAgIHJlbW92ZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gYW5hbHl6ZVBISU5vZGVzIC0gR2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBQSEkgbm9kZXMgaW4gaGVyZS4gSW4KKy8vLyBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRvIG1hcCB0aGUgdmFyaWFibGUgaW5mb3JtYXRpb24gb2YgYSB2aXJ0dWFsIHJlZ2lzdGVyCisvLy8gd2hpY2ggaXMgdXNlZCBpbiBhIFBISSBub2RlLiBXZSBtYXAgdGhhdCB0byB0aGUgQkIgdGhlIHZyZWcgaXMgY29taW5nIGZyb20uCisvLy8KK3ZvaWQgTGl2ZVZhcmlhYmxlczo6YW5hbHl6ZVBISU5vZGVzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiYgRm4pIHsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEkgPSBGbi5iZWdpbigpLCBFID0gRm4uZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgQkJJID0gSS0+YmVnaW4oKSwgQkJFID0gSS0+ZW5kKCk7CisgICAgICAgICBCQkkgIT0gQkJFICYmIEJCSS0+aXNQSEkoKTsgKytCQkkpCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gQkJJLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7IGkgKz0gMikKKyAgICAgICAgUEhJVmFySW5mb1tCQkktPmdldE9wZXJhbmQoaSArIDEpLmdldE1CQigpLT5nZXROdW1iZXIoKV0KKyAgICAgICAgICAucHVzaF9iYWNrKEJCSS0+Z2V0T3BlcmFuZChpKS5nZXRSZWcoKSk7Cit9CisKK2Jvb2wgTGl2ZVZhcmlhYmxlczo6VmFySW5mbzo6aXNMaXZlSW4oY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpIHsKKyAgdW5zaWduZWQgTnVtID0gTUJCLmdldE51bWJlcigpOworCisgIC8vIFJlZyBpcyBsaXZlLXRocm91Z2guCisgIGlmIChBbGl2ZUJsb2Nrcy50ZXN0KE51bSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gUmVnaXN0ZXJzIGRlZmluZWQgaW4gTUJCIGNhbm5vdCBiZSBsaXZlIGluLgorICBjb25zdCBNYWNoaW5lSW5zdHIgKkRlZiA9IE1SSS5nZXRWUmVnRGVmKFJlZyk7CisgIGlmIChEZWYgJiYgRGVmLT5nZXRQYXJlbnQoKSA9PSAmTUJCKQorICAgIHJldHVybiBmYWxzZTsKKworIC8vIFJlZyB3YXMgbm90IGRlZmluZWQgaW4gTUJCLCB3YXMgaXQga2lsbGVkIGhlcmU/CisgIHJldHVybiBmaW5kS2lsbCgmTUJCKTsKK30KKworYm9vbCBMaXZlVmFyaWFibGVzOjppc0xpdmVPdXQodW5zaWduZWQgUmVnLCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSB7CisgIExpdmVWYXJpYWJsZXM6OlZhckluZm8gJlZJID0gZ2V0VmFySW5mbyhSZWcpOworCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIHN1Y2Nlc3NvcnMgb2YgdGhlIGJhc2ljIGJsb2NrLCBjaGVja2luZyB0byBzZWUgaWYKKyAgLy8gdGhlIHZhbHVlIGlzIGVpdGhlciBsaXZlIGluIHRoZSBibG9jaywgb3IgaWYgaXQgaXMga2lsbGVkIGluIHRoZSBibG9jay4KKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiBPcFN1Y2NCbG9ja3M7CisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgU0kgPSBNQkIuc3VjY19iZWdpbigpLAorICAgICAgICAgRSA9IE1CQi5zdWNjX2VuZCgpOyBTSSAhPSBFOyArK1NJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2NNQkIgPSAqU0k7CisKKyAgICAvLyBJcyBpdCBhbGl2ZSBpbiB0aGlzIHN1Y2Nlc3Nvcj8KKyAgICB1bnNpZ25lZCBTdWNjSWR4ID0gU3VjY01CQi0+Z2V0TnVtYmVyKCk7CisgICAgaWYgKFZJLkFsaXZlQmxvY2tzLnRlc3QoU3VjY0lkeCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBPcFN1Y2NCbG9ja3MucHVzaF9iYWNrKFN1Y2NNQkIpOworICB9CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgdmFsdWUgaXMgbGl2ZSBiZWNhdXNlIHRoZXJlIGlzIGEgdXNlIGluIGEgc3VjY2Vzc29yCisgIC8vIHRoYXQga2lsbHMgaXQuCisgIHN3aXRjaCAoT3BTdWNjQmxvY2tzLnNpemUoKSkgeworICBjYXNlIDE6IHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY01CQiA9IE9wU3VjY0Jsb2Nrc1swXTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVkkuS2lsbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChWSS5LaWxsc1tpXS0+Z2V0UGFyZW50KCkgPT0gU3VjY01CQikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyOiB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2NNQkIxID0gT3BTdWNjQmxvY2tzWzBdLCAqU3VjY01CQjIgPSBPcFN1Y2NCbG9ja3NbMV07CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZJLktpbGxzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVkkuS2lsbHNbaV0tPmdldFBhcmVudCgpID09IFN1Y2NNQkIxIHx8CisgICAgICAgICAgVkkuS2lsbHNbaV0tPmdldFBhcmVudCgpID09IFN1Y2NNQkIyKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorICBkZWZhdWx0OgorICAgIHN0ZDo6c29ydChPcFN1Y2NCbG9ja3MuYmVnaW4oKSwgT3BTdWNjQmxvY2tzLmVuZCgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVkkuS2lsbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChzdGQ6OmJpbmFyeV9zZWFyY2goT3BTdWNjQmxvY2tzLmJlZ2luKCksIE9wU3VjY0Jsb2Nrcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkkuS2lsbHNbaV0tPmdldFBhcmVudCgpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gYWRkTmV3QmxvY2sgLSBBZGQgYSBuZXcgYmFzaWMgYmxvY2sgQkIgYXMgYW4gZW1wdHkgc3VjY2Nlc3NvciB0byBEb21CQi4gQWxsCisvLy8gdmFyaWFibGVzIHRoYXQgYXJlIGxpdmUgb3V0IG9mIERvbUJCIHdpbGwgYmUgbWFya2VkIGFzIHBhc3NpbmcgbGl2ZSB0aHJvdWdoCisvLy8gQkIuCit2b2lkIExpdmVWYXJpYWJsZXM6OmFkZE5ld0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkRvbUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY0JCKSB7CisgIGNvbnN0IHVuc2lnbmVkIE51bU5ldyA9IEJCLT5nZXROdW1iZXIoKTsKKworICAvLyBBbGwgcmVnaXN0ZXJzIHVzZWQgYnkgUEhJIG5vZGVzIGluIFN1Y2NCQiBtdXN0IGJlIGxpdmUgdGhyb3VnaCBCQi4KKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgQkJJID0gU3VjY0JCLT5iZWdpbigpLAorICAgICAgICAgQkJFID0gU3VjY0JCLT5lbmQoKTsgQkJJICE9IEJCRSAmJiBCQkktPmlzUEhJKCk7ICsrQkJJKQorICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBCQkktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgaSArPSAyKQorICAgICAgaWYgKEJCSS0+Z2V0T3BlcmFuZChpKzEpLmdldE1CQigpID09IEJCKQorICAgICAgICBnZXRWYXJJbmZvKEJCSS0+Z2V0T3BlcmFuZChpKS5nZXRSZWcoKSkuQWxpdmVCbG9ja3Muc2V0KE51bU5ldyk7CisKKyAgLy8gVXBkYXRlIGluZm8gZm9yIGFsbCBsaXZlIHZhcmlhYmxlcworICBmb3IgKHVuc2lnbmVkIFJlZyA9IFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXIsCisgICAgICAgICBFID0gTVJJLT5nZXRMYXN0VmlydFJlZygpKzE7IFJlZyAhPSBFOyArK1JlZykgeworICAgIFZhckluZm8gJlZJID0gZ2V0VmFySW5mbyhSZWcpOworICAgIGlmICghVkkuQWxpdmVCbG9ja3MudGVzdChOdW1OZXcpICYmIFZJLmlzTGl2ZUluKCpTdWNjQkIsIFJlZywgKk1SSSkpCisgICAgICBWSS5BbGl2ZUJsb2Nrcy5zZXQoTnVtTmV3KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vTG93ZXJTdWJyZWdzLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xvd2VyU3VicmVncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmMWEwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL0xvd2VyU3VicmVncy5jcHAKQEAgLTAsMCArMSwyNDMgQEAKKy8vPT09LS0gTG93ZXJTdWJyZWdzLmNwcCAtIFN1YnJlZ2lzdGVyIExvd2VyaW5nIGluc3RydWN0aW9uIHBhc3MgLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBNYWNoaW5lRnVuY3Rpb24gcGFzcyB3aGljaCBydW5zIGFmdGVyIHJlZ2lzdGVyCisvLyBhbGxvY2F0aW9uIHRoYXQgdHVybnMgc3VicmVnIGluc2VydC9leHRyYWN0IGluc3RydWN0aW9ucyBpbnRvIHJlZ2lzdGVyCisvLyBjb3BpZXMsIGFzIG5lZWRlZC4gVGhpcyBlbnN1cmVzIGNvcnJlY3QgY29kZWdlbiBldmVuIGlmIHRoZSBjb2FsZXNjZXIKKy8vIGlzbid0IGFibGUgdG8gcmVtb3ZlIGFsbCBzdWJyZWcgaW5zdHJ1Y3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibG93ZXJzdWJyZWdzIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgTG93ZXJTdWJyZWdzSW5zdHJ1Y3Rpb25QYXNzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBwcml2YXRlOgorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIExvd2VyU3VicmVnc0luc3RydWN0aW9uUGFzcygpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKyAgICAKKyAgICBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiU3VicmVnaXN0ZXIgbG93ZXJpbmcgaW5zdHJ1Y3Rpb24gcGFzcyI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLnNldFByZXNlcnZlc0NGRygpOworICAgICAgQVUuYWRkUHJlc2VydmVkSUQoTWFjaGluZUxvb3BJbmZvSUQpOworICAgICAgQVUuYWRkUHJlc2VydmVkSUQoTWFjaGluZURvbWluYXRvcnNJRCk7CisgICAgICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgICB9CisKKyAgICAvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24gLSBwYXNzIGVudHJ5IHBvaW50CisgICAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24mKTsKKworICBwcml2YXRlOgorICAgIGJvb2wgTG93ZXJTdWJyZWdUb1JlZyhNYWNoaW5lSW5zdHIgKk1JKTsKKyAgICBib29sIExvd2VyQ29weShNYWNoaW5lSW5zdHIgKk1JKTsKKworICAgIHZvaWQgVHJhbnNmZXJEZWFkRmxhZyhNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBEc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKKyAgICB2b2lkIFRyYW5zZmVyS2lsbEZsYWcoTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRJZk5vdEZvdW5kID0gZmFsc2UpOworICAgIHZvaWQgVHJhbnNmZXJJbXBsaWNpdERlZnMoTWFjaGluZUluc3RyICpNSSk7CisgIH07CisKKyAgY2hhciBMb3dlclN1YnJlZ3NJbnN0cnVjdGlvblBhc3M6OklEID0gMDsKK30KKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVMb3dlclN1YnJlZ3NQYXNzKCkgeyAKKyAgcmV0dXJuIG5ldyBMb3dlclN1YnJlZ3NJbnN0cnVjdGlvblBhc3MoKTsgCit9CisKKy8vLyBUcmFuc2ZlckRlYWRGbGFnIC0gTUkgaXMgYSBwc2V1ZG8taW5zdHJ1Y3Rpb24gd2l0aCBEc3RSZWcgZGVhZCwKKy8vLyBhbmQgdGhlIGxvd2VyZWQgcmVwbGFjZW1lbnQgaW5zdHJ1Y3Rpb25zIGltbWVkaWF0ZWx5IHByZWNlZGUgaXQuCisvLy8gTWFyayB0aGUgcmVwbGFjZW1lbnQgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIGRlYWQgZmxhZy4KK3ZvaWQKK0xvd2VyU3VicmVnc0luc3RydWN0aW9uUGFzczo6VHJhbnNmZXJEZWFkRmxhZyhNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgeworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSUkgPQorICAgICAgICBwcmlvcihNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoTUkpKTsgOyAtLU1JSSkgeworICAgIGlmIChNSUktPmFkZFJlZ2lzdGVyRGVhZChEc3RSZWcsIFRSSSkpCisgICAgICBicmVhazsKKyAgICBhc3NlcnQoTUlJICE9IE1JLT5nZXRQYXJlbnQoKS0+YmVnaW4oKSAmJgorICAgICAgICAgICAiY29weVBoeXNSZWcgb3V0cHV0IGRvZXNuJ3QgcmVmZXJlbmNlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyISIpOworICB9Cit9CisKKy8vLyBUcmFuc2ZlcktpbGxGbGFnIC0gTUkgaXMgYSBwc2V1ZG8taW5zdHJ1Y3Rpb24gd2l0aCBTcmNSZWcga2lsbGVkLAorLy8vIGFuZCB0aGUgbG93ZXJlZCByZXBsYWNlbWVudCBpbnN0cnVjdGlvbnMgaW1tZWRpYXRlbHkgcHJlY2VkZSBpdC4KKy8vLyBNYXJrIHRoZSByZXBsYWNlbWVudCBpbnN0cnVjdGlvbnMgd2l0aCB0aGUga2lsbCBmbGFnLgordm9pZAorTG93ZXJTdWJyZWdzSW5zdHJ1Y3Rpb25QYXNzOjpUcmFuc2ZlcktpbGxGbGFnKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkSWZOb3RGb3VuZCkgeworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSUkgPQorICAgICAgICBwcmlvcihNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoTUkpKTsgOyAtLU1JSSkgeworICAgIGlmIChNSUktPmFkZFJlZ2lzdGVyS2lsbGVkKFNyY1JlZywgVFJJLCBBZGRJZk5vdEZvdW5kKSkKKyAgICAgIGJyZWFrOworICAgIGFzc2VydChNSUkgIT0gTUktPmdldFBhcmVudCgpLT5iZWdpbigpICYmCisgICAgICAgICAgICJjb3B5UGh5c1JlZyBvdXRwdXQgZG9lc24ndCByZWZlcmVuY2Ugc291cmNlIHJlZ2lzdGVyISIpOworICB9Cit9CisKKy8vLyBUcmFuc2ZlckltcGxpY2l0RGVmcyAtIE1JIGlzIGEgcHNldWRvLWluc3RydWN0aW9uLCBhbmQgdGhlIGxvd2VyZWQKKy8vLyByZXBsYWNlbWVudCBpbnN0cnVjdGlvbnMgaW1tZWRpYXRlbHkgcHJlY2VkZSBpdC4gIENvcHkgYW55IGltcGxpY2l0LWRlZgorLy8vIG9wZXJhbmRzIGZyb20gTUkgdG8gdGhlIHJlcGxhY2VtZW50IGluc3RydWN0aW9uLgordm9pZAorTG93ZXJTdWJyZWdzSW5zdHJ1Y3Rpb25QYXNzOjpUcmFuc2ZlckltcGxpY2l0RGVmcyhNYWNoaW5lSW5zdHIgKk1JKSB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBDb3B5TUkgPSBNSTsKKyAgLS1Db3B5TUk7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNJbXBsaWNpdCgpIHx8IE1PLmlzVXNlKCkpCisgICAgICBjb250aW51ZTsKKyAgICBDb3B5TUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhNTy5nZXRSZWcoKSwgdHJ1ZSwgdHJ1ZSkpOworICB9Cit9CisKK2Jvb2wgTG93ZXJTdWJyZWdzSW5zdHJ1Y3Rpb25QYXNzOjpMb3dlclN1YnJlZ1RvUmVnKE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1JLT5nZXRQYXJlbnQoKTsKKyAgYXNzZXJ0KChNSS0+Z2V0T3BlcmFuZCgwKS5pc1JlZygpICYmIE1JLT5nZXRPcGVyYW5kKDApLmlzRGVmKCkpICYmCisgICAgICAgICBNSS0+Z2V0T3BlcmFuZCgxKS5pc0ltbSgpICYmCisgICAgICAgICAoTUktPmdldE9wZXJhbmQoMikuaXNSZWcoKSAmJiBNSS0+Z2V0T3BlcmFuZCgyKS5pc1VzZSgpKSAmJgorICAgICAgICAgIE1JLT5nZXRPcGVyYW5kKDMpLmlzSW1tKCkgJiYgIkludmFsaWQgc3VicmVnX3RvX3JlZyIpOworCisgIHVuc2lnbmVkIERzdFJlZyAgPSBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgSW5zUmVnICA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpOworICBhc3NlcnQoIU1JLT5nZXRPcGVyYW5kKDIpLmdldFN1YlJlZygpICYmICJTdWJJZHggb24gcGh5c3JlZz8iKTsKKyAgdW5zaWduZWQgU3ViSWR4ICA9IE1JLT5nZXRPcGVyYW5kKDMpLmdldEltbSgpOworCisgIGFzc2VydChTdWJJZHggIT0gMCAmJiAiSW52YWxpZCBpbmRleCBmb3IgaW5zZXJ0X3N1YnJlZyIpOworICB1bnNpZ25lZCBEc3RTdWJSZWcgPSBUUkktPmdldFN1YlJlZyhEc3RSZWcsIFN1YklkeCk7CisKKyAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKERzdFJlZykgJiYKKyAgICAgICAgICJJbnNlcnQgZGVzdGluYXRpb24gbXVzdCBiZSBpbiBhIHBoeXNpY2FsIHJlZ2lzdGVyIik7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihJbnNSZWcpICYmCisgICAgICAgICAiSW5zZXJ0ZWQgdmFsdWUgbXVzdCBiZSBpbiBhIHBoeXNpY2FsIHJlZ2lzdGVyIik7CisKKyAgREVCVUcoZGJncygpIDw8ICJzdWJyZWc6IENPTlZFUlRJTkc6ICIgPDwgKk1JKTsKKworICBpZiAoRHN0U3ViUmVnID09IEluc1JlZykgeworICAgIC8vIE5vIG5lZWQgdG8gaW5zZXJ0IGFuIGlkZW50aWZ5IGNvcHkgaW5zdHJ1Y3Rpb24uCisgICAgLy8gV2F0Y2ggb3V0IGZvciBjYXNlIGxpa2UgdGhpczoKKyAgICAvLyAlUkFYPGRlZj4gPSBTVUJSRUdfVE9fUkVHIDAsICVFQVg8a2lsbD4sIDMKKyAgICAvLyBXZSBtdXN0IGxlYXZlICVSQVggbGl2ZS4KKyAgICBpZiAoRHN0UmVnICE9IEluc1JlZykgeworICAgICAgTUktPnNldERlc2MoVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpLSUxMKSk7CisgICAgICBNSS0+UmVtb3ZlT3BlcmFuZCgzKTsgICAgIC8vIFN1YklkeAorICAgICAgTUktPlJlbW92ZU9wZXJhbmQoMSk7ICAgICAvLyBJbW0KKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAic3VicmVnOiByZXBsYWNlIGJ5OiAiIDw8ICpNSSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgREVCVUcoZGJncygpIDw8ICJzdWJyZWc6IGVsaW1pbmF0ZWQhIik7CisgIH0gZWxzZSB7CisgICAgVElJLT5jb3B5UGh5c1JlZygqTUJCLCBNSSwgTUktPmdldERlYnVnTG9jKCksIERzdFN1YlJlZywgSW5zUmVnLAorICAgICAgICAgICAgICAgICAgICAgTUktPmdldE9wZXJhbmQoMikuaXNLaWxsKCkpOworICAgIC8vIFRyYW5zZmVyIHRoZSBraWxsL2RlYWQgZmxhZ3MsIGlmIG5lZWRlZC4KKyAgICBpZiAoTUktPmdldE9wZXJhbmQoMCkuaXNEZWFkKCkpCisgICAgICBUcmFuc2ZlckRlYWRGbGFnKE1JLCBEc3RTdWJSZWcsIFRSSSk7CisgICAgREVCVUcoeworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZE1JID0gTUk7CisgICAgICAgIGRiZ3MoKSA8PCAic3VicmVnOiAiIDw8ICooLS1kTUkpOworICAgICAgfSk7CisgIH0KKworICBERUJVRyhkYmdzKCkgPDwgJ1xuJyk7CisgIE1CQi0+ZXJhc2UoTUkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBMb3dlclN1YnJlZ3NJbnN0cnVjdGlvblBhc3M6Okxvd2VyQ29weShNYWNoaW5lSW5zdHIgKk1JKSB7CisgIE1hY2hpbmVPcGVyYW5kICZEc3RNTyA9IE1JLT5nZXRPcGVyYW5kKDApOworICBNYWNoaW5lT3BlcmFuZCAmU3JjTU8gPSBNSS0+Z2V0T3BlcmFuZCgxKTsKKworICBpZiAoU3JjTU8uZ2V0UmVnKCkgPT0gRHN0TU8uZ2V0UmVnKCkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgImlkZW50aXR5IGNvcHk6ICIgPDwgKk1JKTsKKyAgICAvLyBObyBuZWVkIHRvIGluc2VydCBhbiBpZGVudGl0eSBjb3B5IGluc3RydWN0aW9uLCBidXQgcmVwbGFjZSB3aXRoIGEgS0lMTAorICAgIC8vIGlmIGxpdmVuZXNzIGlzIGNoYW5nZWQuCisgICAgaWYgKERzdE1PLmlzRGVhZCgpIHx8IFNyY01PLmlzVW5kZWYoKSB8fCBNSS0+Z2V0TnVtT3BlcmFuZHMoKSA+IDIpIHsKKyAgICAgIC8vIFdlIG11c3QgbWFrZSBzdXJlIHRoZSBzdXBlci1yZWdpc3RlciBnZXRzIGtpbGxlZC4gUmVwbGFjZSB0aGUKKyAgICAgIC8vIGluc3RydWN0aW9uIHdpdGggS0lMTC4KKyAgICAgIE1JLT5zZXREZXNjKFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6S0lMTCkpOworICAgICAgREVCVUcoZGJncygpIDw8ICJyZXBsYWNlZCBieTogICAiIDw8ICpNSSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gVmFuaWxsYSBpZGVudGl0eSBjb3B5LgorICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAicmVhbCBjb3B5OiAgICIgPDwgKk1JKTsKKyAgVElJLT5jb3B5UGh5c1JlZygqTUktPmdldFBhcmVudCgpLCBNSSwgTUktPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgRHN0TU8uZ2V0UmVnKCksIFNyY01PLmdldFJlZygpLCBTcmNNTy5pc0tpbGwoKSk7CisKKyAgaWYgKERzdE1PLmlzRGVhZCgpKQorICAgIFRyYW5zZmVyRGVhZEZsYWcoTUksIERzdE1PLmdldFJlZygpLCBUUkkpOworICBpZiAoTUktPmdldE51bU9wZXJhbmRzKCkgPiAyKQorICAgIFRyYW5zZmVySW1wbGljaXREZWZzKE1JKTsKKyAgREVCVUcoeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBkTUkgPSBNSTsKKyAgICBkYmdzKCkgPDwgInJlcGxhY2VkIGJ5OiAiIDw8ICooLS1kTUkpOworICB9KTsKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIHJ1bk9uTWFjaGluZUZ1bmN0aW9uIC0gUmVkdWNlIHN1YnJlZ2lzdGVyIGluc2VydHMgYW5kIGV4dHJhY3RzIHRvIHJlZ2lzdGVyCisvLy8gY29waWVzLgorLy8vCitib29sIExvd2VyU3VicmVnc0luc3RydWN0aW9uUGFzczo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBERUJVRyhkYmdzKCkgPDwgIk1hY2hpbmUgRnVuY3Rpb25cbiIgIAorICAgICAgICAgICAgICAgPDwgIioqKioqKioqKiogTE9XRVJJTkcgU1VCUkVHIElOU1RSUyAqKioqKioqKioqXG4iCisgICAgICAgICAgICAgICA8PCAiKioqKioqKioqKiBGdW5jdGlvbjogIiAKKyAgICAgICAgICAgICAgIDw8IE1GLmdldEZ1bmN0aW9uKCktPmdldE5hbWUoKSA8PCAnXG4nKTsKKyAgVFJJID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIFRJSSA9IE1GLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworCisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworCisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBtYmJpID0gTUYuYmVnaW4oKSwgbWJiZSA9IE1GLmVuZCgpOworICAgICAgIG1iYmkgIT0gbWJiZTsgKyttYmJpKSB7CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgbWkgPSBtYmJpLT5iZWdpbigpLCBtZSA9IG1iYmktPmVuZCgpOworICAgICAgICAgbWkgIT0gbWU7KSB7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3Igbm1pID0gbGx2bTo6bmV4dChtaSk7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gbWk7CisgICAgICBhc3NlcnQoIU1JLT5pc0luc2VydFN1YnJlZygpICYmICJJTlNFUlRfU1VCUkVHIHNob3VsZCBubyBsb25nZXIgYXBwZWFyIik7CisgICAgICBhc3NlcnQoTUktPmdldE9wY29kZSgpICE9IFRhcmdldE9wY29kZTo6RVhUUkFDVF9TVUJSRUcgJiYKKyAgICAgICAgICAgICAiRVhUUkFDVF9TVUJSRUcgc2hvdWxkIG5vIGxvbmdlciBhcHBlYXIiKTsKKyAgICAgIGlmIChNSS0+aXNTdWJyZWdUb1JlZygpKSB7CisgICAgICAgIE1hZGVDaGFuZ2UgfD0gTG93ZXJTdWJyZWdUb1JlZyhNSSk7CisgICAgICB9IGVsc2UgaWYgKE1JLT5pc0NvcHkoKSkgeworICAgICAgICBNYWRlQ2hhbmdlIHw9IExvd2VyQ29weShNSSk7CisgICAgICB9CisgICAgICBtaSA9IG5taTsKKyAgICB9CisgIH0KKworICByZXR1cm4gTWFkZUNoYW5nZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmRiMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suY3BwCkBAIC0wLDAgKzEsNjI4IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbGxlY3QgdGhlIHNlcXVlbmNlIG9mIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGZvciBhIGJhc2ljIGJsb2NrLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckRlc2MuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0xlYWtEZXRlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNYWNoaW5lQmFzaWNCbG9jazo6TWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUZ1bmN0aW9uICZtZiwgY29uc3QgQmFzaWNCbG9jayAqYmIpCisgIDogQkIoYmIpLCBOdW1iZXIoLTEpLCB4UGFyZW50KCZtZiksIEFsaWdubWVudCgwKSwKKyAgICBBZGRyZXNzVGFrZW4oZmFsc2UpIHsKKyAgSW5zdHMuUGFyZW50ID0gdGhpczsKK30KKworTWFjaGluZUJhc2ljQmxvY2s6On5NYWNoaW5lQmFzaWNCbG9jaygpIHsKKyAgTGVha0RldGVjdG9yOjpyZW1vdmVHYXJiYWdlT2JqZWN0KHRoaXMpOworfQorCisvLy8gZ2V0U3ltYm9sIC0gUmV0dXJuIHRoZSBNQ1N5bWJvbCBmb3IgdGhpcyBiYXNpYyBibG9jay4KKy8vLworTUNTeW1ib2wgKk1hY2hpbmVCYXNpY0Jsb2NrOjpnZXRTeW1ib2woKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBnZXRQYXJlbnQoKTsKKyAgTUNDb250ZXh0ICZDdHggPSBNRi0+Z2V0Q29udGV4dCgpOworICBjb25zdCBjaGFyICpQcmVmaXggPSBDdHguZ2V0QXNtSW5mbygpLmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKTsKKyAgcmV0dXJuIEN0eC5HZXRPckNyZWF0ZVN5bWJvbChUd2luZShQcmVmaXgpICsgIkJCIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoTUYtPmdldEZ1bmN0aW9uTnVtYmVyKCkpICsgIl8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShnZXROdW1iZXIoKSkpOworfQorCisKK3Jhd19vc3RyZWFtICZsbHZtOjpvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgeworICBNQkIucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vLyBhZGROb2RlVG9MaXN0IChNQkIpIC0gV2hlbiBhbiBNQkIgaXMgYWRkZWQgdG8gYW4gTUYsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSAKKy8vLyBwYXJlbnQgcG9pbnRlciBvZiB0aGUgTUJCLCB0aGUgTUJCIG51bWJlcmluZywgYW5kIGFueSBpbnN0cnVjdGlvbnMgaW4gdGhlCisvLy8gTUJCIHRvIGJlIG9uIHRoZSByaWdodCBvcGVyYW5kIGxpc3QgZm9yIHJlZ2lzdGVycy4KKy8vLworLy8vIE1CQnMgc3RhcnQgb3V0IGFzICMtMS4gV2hlbiBhIE1CQiBpcyBhZGRlZCB0byBhIE1hY2hpbmVGdW5jdGlvbiwgaXQKKy8vLyBnZXRzIHRoZSBuZXh0IGF2YWlsYWJsZSB1bmlxdWUgTUJCIG51bWJlci4gSWYgaXQgaXMgcmVtb3ZlZCBmcm9tIGEKKy8vLyBNYWNoaW5lRnVuY3Rpb24sIGl0IGdvZXMgYmFjayB0byBiZWluZyAjLTEuCit2b2lkIGlsaXN0X3RyYWl0czxNYWNoaW5lQmFzaWNCbG9jaz46OmFkZE5vZGVUb0xpc3QoTWFjaGluZUJhc2ljQmxvY2sgKk4pIHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpOLT5nZXRQYXJlbnQoKTsKKyAgTi0+TnVtYmVyID0gTUYuYWRkVG9NQkJOdW1iZXJpbmcoTik7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBpbnN0cnVjdGlvbnMgaGF2ZSB0aGVpciBvcGVyYW5kcyBpbiB0aGUgcmVnaW5mbyBsaXN0cy4KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmUmVnSW5mbyA9IE1GLmdldFJlZ0luZm8oKTsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE4tPmJlZ2luKCksIEUgPSBOLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgSS0+QWRkUmVnT3BlcmFuZHNUb1VzZUxpc3RzKFJlZ0luZm8pOworCisgIExlYWtEZXRlY3Rvcjo6cmVtb3ZlR2FyYmFnZU9iamVjdChOKTsKK30KKwordm9pZCBpbGlzdF90cmFpdHM8TWFjaGluZUJhc2ljQmxvY2s+OjpyZW1vdmVOb2RlRnJvbUxpc3QoTWFjaGluZUJhc2ljQmxvY2sgKk4pIHsKKyAgTi0+Z2V0UGFyZW50KCktPnJlbW92ZUZyb21NQkJOdW1iZXJpbmcoTi0+TnVtYmVyKTsKKyAgTi0+TnVtYmVyID0gLTE7CisgIExlYWtEZXRlY3Rvcjo6YWRkR2FyYmFnZU9iamVjdChOKTsKK30KKworCisvLy8gYWRkTm9kZVRvTGlzdCAoTUkpIC0gV2hlbiB3ZSBhZGQgYW4gaW5zdHJ1Y3Rpb24gdG8gYSBiYXNpYyBibG9jaworLy8vIGxpc3QsIHdlIHVwZGF0ZSBpdHMgcGFyZW50IHBvaW50ZXIgYW5kIGFkZCBpdHMgb3BlcmFuZHMgZnJvbSByZWcgdXNlL2RlZgorLy8vIGxpc3RzIGlmIGFwcHJvcHJpYXRlLgordm9pZCBpbGlzdF90cmFpdHM8TWFjaGluZUluc3RyPjo6YWRkTm9kZVRvTGlzdChNYWNoaW5lSW5zdHIgKk4pIHsKKyAgYXNzZXJ0KE4tPmdldFBhcmVudCgpID09IDAgJiYgIm1hY2hpbmUgaW5zdHJ1Y3Rpb24gYWxyZWFkeSBpbiBhIGJhc2ljIGJsb2NrIik7CisgIE4tPnNldFBhcmVudChQYXJlbnQpOworICAKKyAgLy8gQWRkIHRoZSBpbnN0cnVjdGlvbidzIHJlZ2lzdGVyIG9wZXJhbmRzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcKKyAgLy8gdXNlL2RlZiBsaXN0cy4KKyAgTWFjaGluZUZ1bmN0aW9uICpNRiA9IFBhcmVudC0+Z2V0UGFyZW50KCk7CisgIE4tPkFkZFJlZ09wZXJhbmRzVG9Vc2VMaXN0cyhNRi0+Z2V0UmVnSW5mbygpKTsKKworICBMZWFrRGV0ZWN0b3I6OnJlbW92ZUdhcmJhZ2VPYmplY3QoTik7Cit9CisKKy8vLyByZW1vdmVOb2RlRnJvbUxpc3QgKE1JKSAtIFdoZW4gd2UgcmVtb3ZlIGFuIGluc3RydWN0aW9uIGZyb20gYSBiYXNpYyBibG9jaworLy8vIGxpc3QsIHdlIHVwZGF0ZSBpdHMgcGFyZW50IHBvaW50ZXIgYW5kIHJlbW92ZSBpdHMgb3BlcmFuZHMgZnJvbSByZWcgdXNlL2RlZgorLy8vIGxpc3RzIGlmIGFwcHJvcHJpYXRlLgordm9pZCBpbGlzdF90cmFpdHM8TWFjaGluZUluc3RyPjo6cmVtb3ZlTm9kZUZyb21MaXN0KE1hY2hpbmVJbnN0ciAqTikgeworICBhc3NlcnQoTi0+Z2V0UGFyZW50KCkgIT0gMCAmJiAibWFjaGluZSBpbnN0cnVjdGlvbiBub3QgaW4gYSBiYXNpYyBibG9jayIpOworCisgIC8vIFJlbW92ZSBmcm9tIHRoZSB1c2UvZGVmIGxpc3RzLgorICBOLT5SZW1vdmVSZWdPcGVyYW5kc0Zyb21Vc2VMaXN0cygpOworICAKKyAgTi0+c2V0UGFyZW50KDApOworCisgIExlYWtEZXRlY3Rvcjo6YWRkR2FyYmFnZU9iamVjdChOKTsKK30KKworLy8vIHRyYW5zZmVyTm9kZXNGcm9tTGlzdCAoTUkpIC0gV2hlbiBtb3ZpbmcgYSByYW5nZSBvZiBpbnN0cnVjdGlvbnMgZnJvbSBvbmUKKy8vLyBNQkIgbGlzdCB0byBhbm90aGVyLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGFyZW50IHBvaW50ZXJzIGFuZCB0aGUgdXNlL2RlZgorLy8vIGxpc3RzLgordm9pZCBpbGlzdF90cmFpdHM8TWFjaGluZUluc3RyPjo6Cit0cmFuc2Zlck5vZGVzRnJvbUxpc3QoaWxpc3RfdHJhaXRzPE1hY2hpbmVJbnN0cj4gJmZyb21MaXN0LAorICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgbGFzdCkgeworICBhc3NlcnQoUGFyZW50LT5nZXRQYXJlbnQoKSA9PSBmcm9tTGlzdC5QYXJlbnQtPmdldFBhcmVudCgpICYmCisgICAgICAgICJNYWNoaW5lSW5zdHIgcGFyZW50IG1pc21hdGNoISIpOworCisgIC8vIFNwbGljZSB3aXRoaW4gdGhlIHNhbWUgTUJCIC0+IG5vIGNoYW5nZS4KKyAgaWYgKFBhcmVudCA9PSBmcm9tTGlzdC5QYXJlbnQpIHJldHVybjsKKworICAvLyBJZiBzcGxpY2luZyBiZXR3ZWVuIHR3byBibG9ja3Mgd2l0aGluIHRoZSBzYW1lIGZ1bmN0aW9uLCBqdXN0IHVwZGF0ZSB0aGUKKyAgLy8gcGFyZW50IHBvaW50ZXJzLgorICBmb3IgKDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkKKyAgICBmaXJzdC0+c2V0UGFyZW50KFBhcmVudCk7Cit9CisKK3ZvaWQgaWxpc3RfdHJhaXRzPE1hY2hpbmVJbnN0cj46OmRlbGV0ZU5vZGUoTWFjaGluZUluc3RyKiBNSSkgeworICBhc3NlcnQoIU1JLT5nZXRQYXJlbnQoKSAmJiAiTUkgaXMgc3RpbGwgaW4gYSBibG9jayEiKTsKKyAgUGFyZW50LT5nZXRQYXJlbnQoKS0+RGVsZXRlTWFjaGluZUluc3RyKE1JKTsKK30KKworTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1hY2hpbmVCYXNpY0Jsb2NrOjpnZXRGaXJzdE5vblBISSgpIHsKKyAgaXRlcmF0b3IgSSA9IGJlZ2luKCk7CisgIHdoaWxlIChJICE9IGVuZCgpICYmIEktPmlzUEhJKCkpCisgICAgKytJOworICByZXR1cm4gSTsKK30KKworTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1hY2hpbmVCYXNpY0Jsb2NrOjpnZXRGaXJzdFRlcm1pbmF0b3IoKSB7CisgIGl0ZXJhdG9yIEkgPSBlbmQoKTsKKyAgd2hpbGUgKEkgIT0gYmVnaW4oKSAmJiAoLS1JKS0+Z2V0RGVzYygpLmlzVGVybWluYXRvcigpKQorICAgIDsgLypub29wICovCisgIGlmIChJICE9IGVuZCgpICYmICFJLT5nZXREZXNjKCkuaXNUZXJtaW5hdG9yKCkpICsrSTsKKyAgcmV0dXJuIEk7Cit9CisKK3ZvaWQgTWFjaGluZUJhc2ljQmxvY2s6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBPdXRwdXRSZWcocmF3X29zdHJlYW0gJm9zLCB1bnNpZ25lZCBSZWdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSAwKSB7CisgIGlmIChSZWdObyAhPSAwICYmIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZ05vKSkgeworICAgIGlmIChUUkkpCisgICAgICBvcyA8PCAiICUiIDw8IFRSSS0+Z2V0KFJlZ05vKS5OYW1lOworICAgIGVsc2UKKyAgICAgIG9zIDw8ICIgJXBoeXNyZWciIDw8IFJlZ05vOworICB9IGVsc2UKKyAgICBvcyA8PCAiICVyZWciIDw8IFJlZ05vOworfQorCitTdHJpbmdSZWYgTWFjaGluZUJhc2ljQmxvY2s6OmdldE5hbWUoKSBjb25zdCB7CisgIGlmIChjb25zdCBCYXNpY0Jsb2NrICpMQkIgPSBnZXRCYXNpY0Jsb2NrKCkpCisgICAgcmV0dXJuIExCQi0+Z2V0TmFtZSgpOworICBlbHNlCisgICAgcmV0dXJuICIobnVsbCkiOworfQorCit2b2lkIE1hY2hpbmVCYXNpY0Jsb2NrOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IGdldFBhcmVudCgpOworICBpZiAoIU1GKSB7CisgICAgT1MgPDwgIkNhbid0IHByaW50IG91dCBNYWNoaW5lQmFzaWNCbG9jayBiZWNhdXNlIHBhcmVudCBNYWNoaW5lRnVuY3Rpb24iCisgICAgICAgPDwgIiBpcyBudWxsXG4iOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChBbGlnbm1lbnQpIHsgT1MgPDwgIkFsaWdubWVudCAiIDw8IEFsaWdubWVudCA8PCAiXG4iOyB9CisKKyAgT1MgPDwgIkJCIyIgPDwgZ2V0TnVtYmVyKCkgPDwgIjogIjsKKworICBjb25zdCBjaGFyICpDb21tYSA9ICIiOworICBpZiAoY29uc3QgQmFzaWNCbG9jayAqTEJCID0gZ2V0QmFzaWNCbG9jaygpKSB7CisgICAgT1MgPDwgQ29tbWEgPDwgImRlcml2ZWQgZnJvbSBMTFZNIEJCICI7CisgICAgV3JpdGVBc09wZXJhbmQoT1MsIExCQiwgLypQcmludFR5cGU9Ki9mYWxzZSk7CisgICAgQ29tbWEgPSAiLCAiOworICB9CisgIGlmIChoYXNBZGRyZXNzVGFrZW4oKSkgeyBPUyA8PCBDb21tYSA8PCAiQUREUkVTUyBUQUtFTiI7IENvbW1hID0gIiwgIjsgfQorICBPUyA8PCAnXG4nOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gTUYtPmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOyAgCisgIGlmICghbGl2ZWluX2VtcHR5KCkpIHsKKyAgICBPUyA8PCAiICAgIExpdmUgSW5zOiI7CisgICAgZm9yIChsaXZlaW5faXRlcmF0b3IgSSA9IGxpdmVpbl9iZWdpbigpLEUgPSBsaXZlaW5fZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgT3V0cHV0UmVnKE9TLCAqSSwgVFJJKTsKKyAgICBPUyA8PCAnXG4nOworICB9CisgIC8vIFByaW50IHRoZSBwcmVkcyBvZiB0aGlzIGJsb2NrIGFjY29yZGluZyB0byB0aGUgQ0ZHLgorICBpZiAoIXByZWRfZW1wdHkoKSkgeworICAgIE9TIDw8ICIgICAgUHJlZGVjZXNzb3JzIGFjY29yZGluZyB0byBDRkc6IjsKKyAgICBmb3IgKGNvbnN0X3ByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKCksIEUgPSBwcmVkX2VuZCgpOyBQSSAhPSBFOyArK1BJKQorICAgICAgT1MgPDwgIiBCQiMiIDw8ICgqUEkpLT5nZXROdW1iZXIoKTsKKyAgICBPUyA8PCAnXG4nOworICB9CisgIAorICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBiZWdpbigpOyBJICE9IGVuZCgpOyArK0kpIHsKKyAgICBPUyA8PCAnXHQnOworICAgIEktPnByaW50KE9TLCAmZ2V0UGFyZW50KCktPmdldFRhcmdldCgpKTsKKyAgfQorCisgIC8vIFByaW50IHRoZSBzdWNjZXNzb3JzIG9mIHRoaXMgYmxvY2sgYWNjb3JkaW5nIHRvIHRoZSBDRkcuCisgIGlmICghc3VjY19lbXB0eSgpKSB7CisgICAgT1MgPDwgIiAgICBTdWNjZXNzb3JzIGFjY29yZGluZyB0byBDRkc6IjsKKyAgICBmb3IgKGNvbnN0X3N1Y2NfaXRlcmF0b3IgU0kgPSBzdWNjX2JlZ2luKCksIEUgPSBzdWNjX2VuZCgpOyBTSSAhPSBFOyArK1NJKQorICAgICAgT1MgPDwgIiBCQiMiIDw8ICgqU0kpLT5nZXROdW1iZXIoKTsKKyAgICBPUyA8PCAnXG4nOworICB9Cit9CisKK3ZvaWQgTWFjaGluZUJhc2ljQmxvY2s6OnJlbW92ZUxpdmVJbih1bnNpZ25lZCBSZWcpIHsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+OjppdGVyYXRvciBJID0KKyAgICBzdGQ6OmZpbmQoTGl2ZUlucy5iZWdpbigpLCBMaXZlSW5zLmVuZCgpLCBSZWcpOworICBhc3NlcnQoSSAhPSBMaXZlSW5zLmVuZCgpICYmICJOb3QgYSBsaXZlIGluISIpOworICBMaXZlSW5zLmVyYXNlKEkpOworfQorCitib29sIE1hY2hpbmVCYXNpY0Jsb2NrOjppc0xpdmVJbih1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgbGl2ZWluX2l0ZXJhdG9yIEkgPSBzdGQ6OmZpbmQobGl2ZWluX2JlZ2luKCksIGxpdmVpbl9lbmQoKSwgUmVnKTsKKyAgcmV0dXJuIEkgIT0gbGl2ZWluX2VuZCgpOworfQorCit2b2lkIE1hY2hpbmVCYXNpY0Jsb2NrOjptb3ZlQmVmb3JlKE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdBZnRlcikgeworICBnZXRQYXJlbnQoKS0+c3BsaWNlKE5ld0FmdGVyLCB0aGlzKTsKK30KKwordm9pZCBNYWNoaW5lQmFzaWNCbG9jazo6bW92ZUFmdGVyKE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdCZWZvcmUpIHsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBCQkkgPSBOZXdCZWZvcmU7CisgIGdldFBhcmVudCgpLT5zcGxpY2UoKytCQkksIHRoaXMpOworfQorCit2b2lkIE1hY2hpbmVCYXNpY0Jsb2NrOjp1cGRhdGVUZXJtaW5hdG9yKCkgeworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IGdldFBhcmVudCgpLT5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKTsKKyAgLy8gQSBibG9jayB3aXRoIG5vIHN1Y2Nlc3NvcnMgaGFzIG5vIGNvbmNlcm5zIHdpdGggZmFsbC10aHJvdWdoIGVkZ2VzLgorICBpZiAodGhpcy0+c3VjY19lbXB0eSgpKSByZXR1cm47CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiA9IDAsICpGQkIgPSAwOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwgND4gQ29uZDsKKyAgRGVidWdMb2MgZGw7ICAvLyBGSVhNRTogdGhpcyBpcyBub3doZXJlCisgIGJvb2wgQiA9IFRJSS0+QW5hbHl6ZUJyYW5jaCgqdGhpcywgVEJCLCBGQkIsIENvbmQpOworICAodm9pZCkgQjsKKyAgYXNzZXJ0KCFCICYmICJVcGRhdGVUZXJtaW5hdG9ycyByZXF1aXJlcyBhbmFseXphYmxlIHByZWRlY2Vzc29ycyEiKTsKKyAgaWYgKENvbmQuZW1wdHkoKSkgeworICAgIGlmIChUQkIpIHsKKyAgICAgIC8vIFRoZSBibG9jayBoYXMgYW4gdW5jb25kaXRpb25hbCBicmFuY2guIElmIGl0cyBzdWNjZXNzb3IgaXMgbm93CisgICAgICAvLyBpdHMgbGF5b3V0IHN1Y2Nlc3NvciwgZGVsZXRlIHRoZSBicmFuY2guCisgICAgICBpZiAoaXNMYXlvdXRTdWNjZXNzb3IoVEJCKSkKKyAgICAgICAgVElJLT5SZW1vdmVCcmFuY2goKnRoaXMpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgYmxvY2sgaGFzIGFuIHVuY29uZGl0aW9uYWwgZmFsbHRocm91Z2guIElmIGl0cyBzdWNjZXNzb3IgaXMgbm90CisgICAgICAvLyBpdHMgbGF5b3V0IHN1Y2Nlc3NvciwgaW5zZXJ0IGEgYnJhbmNoLgorICAgICAgVEJCID0gKnN1Y2NfYmVnaW4oKTsKKyAgICAgIGlmICghaXNMYXlvdXRTdWNjZXNzb3IoVEJCKSkKKyAgICAgICAgVElJLT5JbnNlcnRCcmFuY2goKnRoaXMsIFRCQiwgMCwgQ29uZCwgZGwpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoRkJCKSB7CisgICAgICAvLyBUaGUgYmxvY2sgaGFzIGEgbm9uLWZhbGx0aHJvdWdoIGNvbmRpdGlvbmFsIGJyYW5jaC4gSWYgb25lIG9mIGl0cworICAgICAgLy8gc3VjY2Vzc29ycyBpcyBpdHMgbGF5b3V0IHN1Y2Nlc3NvciwgcmV3cml0ZSBpdCB0byBhIGZhbGx0aHJvdWdoCisgICAgICAvLyBjb25kaXRpb25hbCBicmFuY2guCisgICAgICBpZiAoaXNMYXlvdXRTdWNjZXNzb3IoVEJCKSkgeworICAgICAgICBpZiAoVElJLT5SZXZlcnNlQnJhbmNoQ29uZGl0aW9uKENvbmQpKQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgVElJLT5SZW1vdmVCcmFuY2goKnRoaXMpOworICAgICAgICBUSUktPkluc2VydEJyYW5jaCgqdGhpcywgRkJCLCAwLCBDb25kLCBkbCk7CisgICAgICB9IGVsc2UgaWYgKGlzTGF5b3V0U3VjY2Vzc29yKEZCQikpIHsKKyAgICAgICAgVElJLT5SZW1vdmVCcmFuY2goKnRoaXMpOworICAgICAgICBUSUktPkluc2VydEJyYW5jaCgqdGhpcywgVEJCLCAwLCBDb25kLCBkbCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSBibG9jayBoYXMgYSBmYWxsdGhyb3VnaCBjb25kaXRpb25hbCBicmFuY2guCisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCQSA9ICpzdWNjX2JlZ2luKCk7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCQiA9ICpsbHZtOjpuZXh0KHN1Y2NfYmVnaW4oKSk7CisgICAgICBpZiAoTUJCQSA9PSBUQkIpIHN0ZDo6c3dhcChNQkJCLCBNQkJBKTsKKyAgICAgIGlmIChpc0xheW91dFN1Y2Nlc3NvcihUQkIpKSB7CisgICAgICAgIGlmIChUSUktPlJldmVyc2VCcmFuY2hDb25kaXRpb24oQ29uZCkpIHsKKyAgICAgICAgICAvLyBXZSBjYW4ndCByZXZlcnNlIHRoZSBjb25kaXRpb24sIGFkZCBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KKyAgICAgICAgICBDb25kLmNsZWFyKCk7CisgICAgICAgICAgVElJLT5JbnNlcnRCcmFuY2goKnRoaXMsIE1CQkEsIDAsIENvbmQsIGRsKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVElJLT5SZW1vdmVCcmFuY2goKnRoaXMpOworICAgICAgICBUSUktPkluc2VydEJyYW5jaCgqdGhpcywgTUJCQSwgMCwgQ29uZCwgZGwpOworICAgICAgfSBlbHNlIGlmICghaXNMYXlvdXRTdWNjZXNzb3IoTUJCQSkpIHsKKyAgICAgICAgVElJLT5SZW1vdmVCcmFuY2goKnRoaXMpOworICAgICAgICBUSUktPkluc2VydEJyYW5jaCgqdGhpcywgVEJCLCBNQkJBLCBDb25kLCBkbCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgTWFjaGluZUJhc2ljQmxvY2s6OmFkZFN1Y2Nlc3NvcihNYWNoaW5lQmFzaWNCbG9jayAqc3VjYykgeworICBTdWNjZXNzb3JzLnB1c2hfYmFjayhzdWNjKTsKKyAgc3VjYy0+YWRkUHJlZGVjZXNzb3IodGhpcyk7Cit9CisKK3ZvaWQgTWFjaGluZUJhc2ljQmxvY2s6OnJlbW92ZVN1Y2Nlc3NvcihNYWNoaW5lQmFzaWNCbG9jayAqc3VjYykgeworICBzdWNjLT5yZW1vdmVQcmVkZWNlc3Nvcih0aGlzKTsKKyAgc3VjY19pdGVyYXRvciBJID0gc3RkOjpmaW5kKFN1Y2Nlc3NvcnMuYmVnaW4oKSwgU3VjY2Vzc29ycy5lbmQoKSwgc3VjYyk7CisgIGFzc2VydChJICE9IFN1Y2Nlc3NvcnMuZW5kKCkgJiYgIk5vdCBhIGN1cnJlbnQgc3VjY2Vzc29yISIpOworICBTdWNjZXNzb3JzLmVyYXNlKEkpOworfQorCitNYWNoaW5lQmFzaWNCbG9jazo6c3VjY19pdGVyYXRvciAKK01hY2hpbmVCYXNpY0Jsb2NrOjpyZW1vdmVTdWNjZXNzb3Ioc3VjY19pdGVyYXRvciBJKSB7CisgIGFzc2VydChJICE9IFN1Y2Nlc3NvcnMuZW5kKCkgJiYgIk5vdCBhIGN1cnJlbnQgc3VjY2Vzc29yISIpOworICAoKkkpLT5yZW1vdmVQcmVkZWNlc3Nvcih0aGlzKTsKKyAgcmV0dXJuIFN1Y2Nlc3NvcnMuZXJhc2UoSSk7Cit9CisKK3ZvaWQgTWFjaGluZUJhc2ljQmxvY2s6OmFkZFByZWRlY2Vzc29yKE1hY2hpbmVCYXNpY0Jsb2NrICpwcmVkKSB7CisgIFByZWRlY2Vzc29ycy5wdXNoX2JhY2socHJlZCk7Cit9CisKK3ZvaWQgTWFjaGluZUJhc2ljQmxvY2s6OnJlbW92ZVByZWRlY2Vzc29yKE1hY2hpbmVCYXNpY0Jsb2NrICpwcmVkKSB7CisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+OjppdGVyYXRvciBJID0KKyAgICBzdGQ6OmZpbmQoUHJlZGVjZXNzb3JzLmJlZ2luKCksIFByZWRlY2Vzc29ycy5lbmQoKSwgcHJlZCk7CisgIGFzc2VydChJICE9IFByZWRlY2Vzc29ycy5lbmQoKSAmJiAiUHJlZCBpcyBub3QgYSBwcmVkZWNlc3NvciBvZiB0aGlzIGJsb2NrISIpOworICBQcmVkZWNlc3NvcnMuZXJhc2UoSSk7Cit9CisKK3ZvaWQgTWFjaGluZUJhc2ljQmxvY2s6OnRyYW5zZmVyU3VjY2Vzc29ycyhNYWNoaW5lQmFzaWNCbG9jayAqZnJvbU1CQikgeworICBpZiAodGhpcyA9PSBmcm9tTUJCKQorICAgIHJldHVybjsKKyAgCisgIHdoaWxlICghZnJvbU1CQi0+c3VjY19lbXB0eSgpKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MgPSAqZnJvbU1CQi0+c3VjY19iZWdpbigpOworICAgIGFkZFN1Y2Nlc3NvcihTdWNjKTsKKyAgICBmcm9tTUJCLT5yZW1vdmVTdWNjZXNzb3IoU3VjYyk7CisgIH0KK30KKwordm9pZAorTWFjaGluZUJhc2ljQmxvY2s6OnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXMoTWFjaGluZUJhc2ljQmxvY2sgKmZyb21NQkIpIHsKKyAgaWYgKHRoaXMgPT0gZnJvbU1CQikKKyAgICByZXR1cm47CisgIAorICB3aGlsZSAoIWZyb21NQkItPnN1Y2NfZW1wdHkoKSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjID0gKmZyb21NQkItPnN1Y2NfYmVnaW4oKTsKKyAgICBhZGRTdWNjZXNzb3IoU3VjYyk7CisgICAgZnJvbU1CQi0+cmVtb3ZlU3VjY2Vzc29yKFN1Y2MpOworCisgICAgLy8gRml4IHVwIGFueSBQSEkgbm9kZXMgaW4gdGhlIHN1Y2Nlc3Nvci4KKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSA9IFN1Y2MtPmJlZ2luKCksIE1FID0gU3VjYy0+ZW5kKCk7CisgICAgICAgICBNSSAhPSBNRSAmJiBNSS0+aXNQSEkoKTsgKytNSSkKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDIsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKSsxOyBpICE9IGU7IGkgKz0gMikgeworICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKE1PLmdldE1CQigpID09IGZyb21NQkIpCisgICAgICAgICAgTU8uc2V0TUJCKHRoaXMpOworICAgICAgfQorICB9Cit9CisKK2Jvb2wgTWFjaGluZUJhc2ljQmxvY2s6OmlzU3VjY2Vzc29yKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPQorICAgIHN0ZDo6ZmluZChTdWNjZXNzb3JzLmJlZ2luKCksIFN1Y2Nlc3NvcnMuZW5kKCksIE1CQik7CisgIHJldHVybiBJICE9IFN1Y2Nlc3NvcnMuZW5kKCk7Cit9CisKK2Jvb2wgTWFjaGluZUJhc2ljQmxvY2s6OmlzTGF5b3V0U3VjY2Vzc29yKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uOjpjb25zdF9pdGVyYXRvciBJKHRoaXMpOworICByZXR1cm4gbGx2bTo6bmV4dChJKSA9PSBNYWNoaW5lRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yKE1CQik7Cit9CisKK2Jvb2wgTWFjaGluZUJhc2ljQmxvY2s6OmNhbkZhbGxUaHJvdWdoKCkgeworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEZhbGx0aHJvdWdoID0gdGhpczsKKyAgKytGYWxsdGhyb3VnaDsKKyAgLy8gSWYgRmFsbHRocm91Z2hCbG9jayBpcyBvZmYgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIGl0IGNhbid0IGZhbGwgdGhyb3VnaC4KKyAgaWYgKEZhbGx0aHJvdWdoID09IGdldFBhcmVudCgpLT5lbmQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgRmFsbHRocm91Z2hCbG9jayBpc24ndCBhIHN1Y2Nlc3Nvciwgbm8gZmFsbHRocm91Z2ggaXMgcG9zc2libGUuCisgIGlmICghaXNTdWNjZXNzb3IoRmFsbHRocm91Z2gpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBBbmFseXplIHRoZSBicmFuY2hlcywgaWYgYW55LCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jay4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiA9IDAsICpGQkIgPSAwOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwgND4gQ29uZDsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBnZXRQYXJlbnQoKS0+Z2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgIGlmIChUSUktPkFuYWx5emVCcmFuY2goKnRoaXMsIFRCQiwgRkJCLCBDb25kKSkgeworICAgIC8vIElmIHdlIGNvdWxkbid0IGFuYWx5emUgdGhlIGJyYW5jaCwgZXhhbWluZSB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KKyAgICAvLyBJZiB0aGUgYmxvY2sgZG9lc24ndCBlbmQgaW4gYSBrbm93biBjb250cm9sIGJhcnJpZXIsIGFzc3VtZSBmYWxsdGhyb3VnaAorICAgIC8vIGlzIHBvc3NpYmxlLiBUaGUgaXNQcmVkaWNhYmxlIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgY29kZSBjYW4gYmUKKyAgICAvLyBjYWxsZWQgZHVyaW5nIElmQ29udmVyc2lvbiwgd2hlcmUgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbm9ybWFsbHkgYQorICAgIC8vIEJhcnJpZXIgaXMgcHJlZGljYXRlZCBhbmQgdGh1cyBubyBsb25nZXIgYW4gYWN0dWFsIGNvbnRyb2wgYmFycmllci4gVGhpcworICAgIC8vIGlzIG92ZXItY29uc2VydmF0aXZlIHRob3VnaCwgYmVjYXVzZSBpZiBhbiBpbnN0cnVjdGlvbiBpc24ndCBhY3R1YWxseQorICAgIC8vIHByZWRpY2F0ZWQgd2UgY291bGQgc3RpbGwgdHJlYXQgaXQgbGlrZSBhIGJhcnJpZXIuCisgICAgcmV0dXJuIGVtcHR5KCkgfHwgIWJhY2soKS5nZXREZXNjKCkuaXNCYXJyaWVyKCkgfHwKKyAgICAgICAgICAgYmFjaygpLmdldERlc2MoKS5pc1ByZWRpY2FibGUoKTsKKyAgfQorCisgIC8vIElmIHRoZXJlIGlzIG5vIGJyYW5jaCwgY29udHJvbCBhbHdheXMgZmFsbHMgdGhyb3VnaC4KKyAgaWYgKFRCQiA9PSAwKSByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiB0aGVyZSBpcyBzb21lIGV4cGxpY2l0IGJyYW5jaCB0byB0aGUgZmFsbHRocm91Z2ggYmxvY2ssIGl0IGNhbiBvYnZpb3VzbHkKKyAgLy8gcmVhY2gsIGV2ZW4gdGhvdWdoIHRoZSBicmFuY2ggc2hvdWxkIGdldCBmb2xkZWQgdG8gZmFsbCB0aHJvdWdoIGltcGxpY2l0bHkuCisgIGlmIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKFRCQikgPT0gRmFsbHRocm91Z2ggfHwKKyAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoRkJCKSA9PSBGYWxsdGhyb3VnaCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiBpdCdzIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHRvIHNvbWUgYmxvY2sgbm90IHRoZSBmYWxsIHRocm91Z2gsIGl0CisgIC8vIGRvZXNuJ3QgZmFsbCB0aHJvdWdoLgorICBpZiAoQ29uZC5lbXB0eSgpKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gT3RoZXJ3aXNlLCBpZiBpdCBpcyBjb25kaXRpb25hbCBhbmQgaGFzIG5vIGV4cGxpY2l0IGZhbHNlIGJsb2NrLCBpdCBmYWxscworICAvLyB0aHJvdWdoLgorICByZXR1cm4gRkJCID09IDA7Cit9CisKK01hY2hpbmVCYXNpY0Jsb2NrICoKK01hY2hpbmVCYXNpY0Jsb2NrOjpTcGxpdENyaXRpY2FsRWRnZShNYWNoaW5lQmFzaWNCbG9jayAqU3VjYywgUGFzcyAqUCkgeworICBNYWNoaW5lRnVuY3Rpb24gKk1GID0gZ2V0UGFyZW50KCk7CisgIERlYnVnTG9jIGRsOyAgLy8gRklYTUU6IHRoaXMgaXMgbm93aGVyZQorCisgIC8vIFdlIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGlzJ3MgdGVybWluYXRvciwgYnV0IHdlIGNhbid0IGRvIHRoYXQgaWYgQW5hbHl6ZUJyYW5jaAorICAvLyBmYWlscy4gSWYgdGhpcyB1c2VzIGEganVtcCB0YWJsZSwgd2Ugd29uJ3QgdG91Y2ggaXQuCisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gTUYtPmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworICBNYWNoaW5lQmFzaWNCbG9jayAqVEJCID0gMCwgKkZCQiA9IDA7CisgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kLCA0PiBDb25kOworICBpZiAoVElJLT5BbmFseXplQnJhbmNoKCp0aGlzLCBUQkIsIEZCQiwgQ29uZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk5NQkIgPSBNRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soKTsKKyAgTUYtPmluc2VydChsbHZtOjpuZXh0KE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IodGhpcykpLCBOTUJCKTsKKyAgREVCVUcoZGJncygpIDw8ICJQSElFbGltaW5hdGlvbiBzcGxpdHRpbmcgY3JpdGljYWwgZWRnZToiCisgICAgICAgICIgQkIjIiA8PCBnZXROdW1iZXIoKQorICAgICAgICA8PCAiIC0tIEJCIyIgPDwgTk1CQi0+Z2V0TnVtYmVyKCkKKyAgICAgICAgPDwgIiAtLSBCQiMiIDw8IFN1Y2MtPmdldE51bWJlcigpIDw8ICdcbicpOworCisgIFJlcGxhY2VVc2VzT2ZCbG9ja1dpdGgoU3VjYywgTk1CQik7CisgIHVwZGF0ZVRlcm1pbmF0b3IoKTsKKworICAvLyBJbnNlcnQgdW5jb25kaXRpb25hbCAianVtcCBTdWNjIiBpbnN0cnVjdGlvbiBpbiBOTUJCIGlmIG5lY2Vzc2FyeS4KKyAgTk1CQi0+YWRkU3VjY2Vzc29yKFN1Y2MpOworICBpZiAoIU5NQkItPmlzTGF5b3V0U3VjY2Vzc29yKFN1Y2MpKSB7CisgICAgQ29uZC5jbGVhcigpOworICAgIE1GLT5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKS0+SW5zZXJ0QnJhbmNoKCpOTUJCLCBTdWNjLCBOVUxMLCBDb25kLCBkbCk7CisgIH0KKworICAvLyBGaXggUEhJIG5vZGVzIGluIFN1Y2Mgc28gdGhleSByZWZlciB0byBOTUJCIGluc3RlYWQgb2YgdGhpcworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBpID0gU3VjYy0+YmVnaW4oKSwgZSA9IFN1Y2MtPmVuZCgpOworICAgICAgIGkgIT0gZSAmJiBpLT5pc1BISSgpOyArK2kpCisgICAgZm9yICh1bnNpZ25lZCBuaSA9IDEsIG5lID0gaS0+Z2V0TnVtT3BlcmFuZHMoKTsgbmkgIT0gbmU7IG5pICs9IDIpCisgICAgICBpZiAoaS0+Z2V0T3BlcmFuZChuaSsxKS5nZXRNQkIoKSA9PSB0aGlzKQorICAgICAgICBpLT5nZXRPcGVyYW5kKG5pKzEpLnNldE1CQihOTUJCKTsKKworICBpZiAoTGl2ZVZhcmlhYmxlcyAqTFYgPQorICAgICAgICBQLT5nZXRBbmFseXNpc0lmQXZhaWxhYmxlPExpdmVWYXJpYWJsZXM+KCkpCisgICAgTFYtPmFkZE5ld0Jsb2NrKE5NQkIsIHRoaXMsIFN1Y2MpOworCisgIGlmIChNYWNoaW5lRG9taW5hdG9yVHJlZSAqTURUID0KKyAgICAgICAgUC0+Z2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKSkKKyAgICBNRFQtPmFkZE5ld0Jsb2NrKE5NQkIsIHRoaXMpOworCisgIGlmIChNYWNoaW5lTG9vcEluZm8gKk1MSSA9CisgICAgICAgIFAtPmdldEFuYWx5c2lzSWZBdmFpbGFibGU8TWFjaGluZUxvb3BJbmZvPigpKQorICAgIGlmIChNYWNoaW5lTG9vcCAqVElMID0gTUxJLT5nZXRMb29wRm9yKHRoaXMpKSB7CisgICAgICAvLyBJZiBvbmUgb3IgdGhlIG90aGVyIGJsb2NrcyB3ZXJlIG5vdCBpbiBhIGxvb3AsIHRoZSBuZXcgYmxvY2sgaXMgbm90CisgICAgICAvLyBlaXRoZXIsIGFuZCB0aHVzIExJIGRvZXNuJ3QgbmVlZCB0byBiZSB1cGRhdGVkLgorICAgICAgaWYgKE1hY2hpbmVMb29wICpEZXN0TG9vcCA9IE1MSS0+Z2V0TG9vcEZvcihTdWNjKSkgeworICAgICAgICBpZiAoVElMID09IERlc3RMb29wKSB7CisgICAgICAgICAgLy8gQm90aCBpbiB0aGUgc2FtZSBsb29wLCB0aGUgTk1CQiBqb2lucyBsb29wLgorICAgICAgICAgIERlc3RMb29wLT5hZGRCYXNpY0Jsb2NrVG9Mb29wKE5NQkIsIE1MSS0+Z2V0QmFzZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChUSUwtPmNvbnRhaW5zKERlc3RMb29wKSkgeworICAgICAgICAgIC8vIEVkZ2UgZnJvbSBhbiBvdXRlciBsb29wIHRvIGFuIGlubmVyIGxvb3AuICBBZGQgdG8gdGhlIG91dGVyIGxvb3AuCisgICAgICAgICAgVElMLT5hZGRCYXNpY0Jsb2NrVG9Mb29wKE5NQkIsIE1MSS0+Z2V0QmFzZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChEZXN0TG9vcC0+Y29udGFpbnMoVElMKSkgeworICAgICAgICAgIC8vIEVkZ2UgZnJvbSBhbiBpbm5lciBsb29wIHRvIGFuIG91dGVyIGxvb3AuICBBZGQgdG8gdGhlIG91dGVyIGxvb3AuCisgICAgICAgICAgRGVzdExvb3AtPmFkZEJhc2ljQmxvY2tUb0xvb3AoTk1CQiwgTUxJLT5nZXRCYXNlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEVkZ2UgZnJvbSB0d28gbG9vcHMgd2l0aCBubyBjb250YWlubWVudCByZWxhdGlvbi4gIEJlY2F1c2UgdGhlc2UKKyAgICAgICAgICAvLyBhcmUgbmF0dXJhbCBsb29wcywgd2Uga25vdyB0aGF0IHRoZSBkZXN0aW5hdGlvbiBibG9jayBtdXN0IGJlIHRoZQorICAgICAgICAgIC8vIGhlYWRlciBvZiBpdHMgbG9vcCAoYWRkaW5nIGEgYnJhbmNoIGludG8gYSBsb29wIGVsc2V3aGVyZSB3b3VsZAorICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpcnJlZHVjaWJsZSBsb29wKS4KKyAgICAgICAgICBhc3NlcnQoRGVzdExvb3AtPmdldEhlYWRlcigpID09IFN1Y2MgJiYKKyAgICAgICAgICAgICAgICAgIlNob3VsZCBub3QgY3JlYXRlIGlycmVkdWNpYmxlIGxvb3BzISIpOworICAgICAgICAgIGlmIChNYWNoaW5lTG9vcCAqUCA9IERlc3RMb29wLT5nZXRQYXJlbnRMb29wKCkpCisgICAgICAgICAgICBQLT5hZGRCYXNpY0Jsb2NrVG9Mb29wKE5NQkIsIE1MSS0+Z2V0QmFzZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICByZXR1cm4gTk1CQjsKK30KKworLy8vIHJlbW92ZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uLAorLy8vIGFuZCByZXR1cm5zIGl0LCBidXQgZG9lcyBub3QgZGVsZXRlIGl0LgorTWFjaGluZUJhc2ljQmxvY2sgKk1hY2hpbmVCYXNpY0Jsb2NrOjpyZW1vdmVGcm9tUGFyZW50KCkgeworICBhc3NlcnQoZ2V0UGFyZW50KCkgJiYgIk5vdCBlbWJlZGRlZCBpbiBhIGZ1bmN0aW9uISIpOworICBnZXRQYXJlbnQoKS0+cmVtb3ZlKHRoaXMpOworICByZXR1cm4gdGhpczsKK30KKworCisvLy8gZXJhc2VGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBmdW5jdGlvbiwKKy8vLyBhbmQgZGVsZXRlcyBpdC4KK3ZvaWQgTWFjaGluZUJhc2ljQmxvY2s6OmVyYXNlRnJvbVBhcmVudCgpIHsKKyAgYXNzZXJ0KGdldFBhcmVudCgpICYmICJOb3QgZW1iZWRkZWQgaW4gYSBmdW5jdGlvbiEiKTsKKyAgZ2V0UGFyZW50KCktPmVyYXNlKHRoaXMpOworfQorCisKKy8vLyBSZXBsYWNlVXNlc09mQmxvY2tXaXRoIC0gR2l2ZW4gYSBtYWNoaW5lIGJhc2ljIGJsb2NrIHRoYXQgYnJhbmNoZWQgdG8KKy8vLyAnT2xkJywgY2hhbmdlIHRoZSBjb2RlIGFuZCBDRkcgc28gdGhhdCBpdCBicmFuY2hlcyB0byAnTmV3JyBpbnN0ZWFkLgordm9pZCBNYWNoaW5lQmFzaWNCbG9jazo6UmVwbGFjZVVzZXNPZkJsb2NrV2l0aChNYWNoaW5lQmFzaWNCbG9jayAqT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3KSB7CisgIGFzc2VydChPbGQgIT0gTmV3ICYmICJDYW5ub3QgcmVwbGFjZSBzZWxmIHdpdGggc2VsZiEiKTsKKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IGVuZCgpOworICB3aGlsZSAoSSAhPSBiZWdpbigpKSB7CisgICAgLS1JOworICAgIGlmICghSS0+Z2V0RGVzYygpLmlzVGVybWluYXRvcigpKSBicmVhazsKKworICAgIC8vIFNjYW4gdGhlIG9wZXJhbmRzIG9mIHRoaXMgbWFjaGluZSBpbnN0cnVjdGlvbiwgcmVwbGFjaW5nIGFueSB1c2VzIG9mIE9sZAorICAgIC8vIHdpdGggTmV3LgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChJLT5nZXRPcGVyYW5kKGkpLmlzTUJCKCkgJiYKKyAgICAgICAgICBJLT5nZXRPcGVyYW5kKGkpLmdldE1CQigpID09IE9sZCkKKyAgICAgICAgSS0+Z2V0T3BlcmFuZChpKS5zZXRNQkIoTmV3KTsKKyAgfQorCisgIC8vIFVwZGF0ZSB0aGUgc3VjY2Vzc29yIGluZm9ybWF0aW9uLgorICByZW1vdmVTdWNjZXNzb3IoT2xkKTsKKyAgYWRkU3VjY2Vzc29yKE5ldyk7Cit9CisKKy8vLyBDb3JyZWN0RXh0cmFDRkdFZGdlcyAtIFZhcmlvdXMgcGllY2VzIG9mIGNvZGUgY2FuIGNhdXNlIGV4Y2VzcyBlZGdlcyBpbiB0aGUKKy8vLyBDRkcgdG8gYmUgaW5zZXJ0ZWQuICBJZiB3ZSBoYXZlIHByb3ZlbiB0aGF0IE1CQiBjYW4gb25seSBicmFuY2ggdG8gRGVzdEEgYW5kCisvLy8gRGVzdEIsIHJlbW92ZSBhbnkgb3RoZXIgTUJCIHN1Y2Nlc3NvcnMgZnJvbSB0aGUgQ0ZHLiAgRGVzdEEgYW5kIERlc3RCIGNhbiBiZQorLy8vIG51bGwuCisvLy8gCisvLy8gQmVzaWRlcyBEZXN0QSBhbmQgRGVzdEIsIHJldGFpbiBvdGhlciBlZGdlcyBsZWFkaW5nIHRvIExhbmRpbmdQYWRzCisvLy8gKGN1cnJlbnRseSB0aGVyZSBjYW4gYmUgb25seSBvbmU7IHdlIGRvbid0IGNoZWNrIG9yIHJlcXVpcmUgdGhhdCBoZXJlKS4KKy8vLyBOb3RlIGl0IGlzIHBvc3NpYmxlIHRoYXQgRGVzdEEgYW5kL29yIERlc3RCIGFyZSBMYW5kaW5nUGFkcy4KK2Jvb2wgTWFjaGluZUJhc2ljQmxvY2s6OkNvcnJlY3RFeHRyYUNGR0VkZ2VzKE1hY2hpbmVCYXNpY0Jsb2NrICpEZXN0QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpEZXN0QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNDb25kKSB7CisgIC8vIFRoZSB2YWx1ZXMgb2YgRGVzdEEgYW5kIERlc3RCIGZyZXF1ZW50bHkgY29tZSBmcm9tIGEgY2FsbCB0byB0aGUKKyAgLy8gJ1RhcmdldEluc3RySW5mbzo6QW5hbHl6ZUJyYW5jaCcgbWV0aG9kLiBXZSB0YWtlIG91ciBtZWFuaW5nIG9mIHRoZSBpbml0aWFsCisgIC8vIHZhbHVlcyBmcm9tIHRoZXJlLgorICAvLworICAvLyAxLiBJZiBib3RoIERlc3RBIGFuZCBEZXN0QiBhcmUgbnVsbCwgdGhlbiB0aGUgYmxvY2sgZW5kcyB3aXRoIG5vIGJyYW5jaGVzCisgIC8vICAgIChpdCBmYWxscyB0aHJvdWdoIHRvIGl0cyBzdWNjZXNzb3IpLgorICAvLyAyLiBJZiBEZXN0QSBpcyBzZXQsIERlc3RCIGlzIG51bGwsIGFuZCBpc0NvbmQgaXMgZmFsc2UsIHRoZW4gdGhlIGJsb2NrIGVuZHMKKyAgLy8gICAgd2l0aCBvbmx5IGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLgorICAvLyAzLiBJZiBEZXN0QSBpcyBzZXQsIERlc3RCIGlzIG51bGwsIGFuZCBpc0NvbmQgaXMgdHJ1ZSwgdGhlbiB0aGUgYmxvY2sgZW5kcworICAvLyAgICB3aXRoIGEgY29uZGl0aW9uYWwgYnJhbmNoIHRoYXQgZmFsbHMgdGhyb3VnaCB0byBhIHN1Y2Nlc3NvciAoRGVzdEIpLgorICAvLyA0LiBJZiBEZXN0QSBhbmQgRGVzdEIgaXMgc2V0IGFuZCBpc0NvbmQgaXMgdHJ1ZSwgdGhlbiB0aGUgYmxvY2sgZW5kcyB3aXRoIGEKKyAgLy8gICAgY29uZGl0aW9uYWwgYnJhbmNoIGZvbGxvd2VkIGJ5IGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLiBEZXN0QSBpcyB0aGUKKyAgLy8gICAgJ3RydWUnIGRlc3RpbmF0aW9uIGFuZCBEZXN0QiBpcyB0aGUgJ2ZhbHNlJyBkZXN0aW5hdGlvbi4KKworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEZhbGxUaHJ1ID0KKyAgICBsbHZtOjpuZXh0KE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IodGhpcykpOworCisgIGlmIChEZXN0QSA9PSAwICYmIERlc3RCID09IDApIHsKKyAgICAvLyBCbG9jayBmYWxscyB0aHJvdWdoIHRvIHN1Y2Nlc3Nvci4KKyAgICBEZXN0QSA9IEZhbGxUaHJ1OworICAgIERlc3RCID0gRmFsbFRocnU7CisgIH0gZWxzZSBpZiAoRGVzdEEgIT0gMCAmJiBEZXN0QiA9PSAwKSB7CisgICAgaWYgKGlzQ29uZCkKKyAgICAgIC8vIEJsb2NrIGVuZHMgaW4gY29uZGl0aW9uYWwganVtcCB0aGF0IGZhbGxzIHRocm91Z2ggdG8gc3VjY2Vzc29yLgorICAgICAgRGVzdEIgPSBGYWxsVGhydTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoRGVzdEEgJiYgRGVzdEIgJiYgaXNDb25kICYmCisgICAgICAgICAgICJDRkcgaW4gYSBiYWQgc3RhdGUuIENhbm5vdCBjb3JyZWN0IENGRyBlZGdlcyIpOworICB9CisKKyAgLy8gUmVtb3ZlIHN1cGVyZmx1b3VzIGVkZ2VzLiBJLmUuLCB0aG9zZSB3aGljaCBhcmVuJ3QgZGVzdGluYXRpb25zIG9mIHRoaXMKKyAgLy8gYmFzaWMgYmxvY2ssIGR1cGxpY2F0ZSBlZGdlcywgb3IgbGFuZGluZyBwYWRzLgorICBTbWFsbFB0clNldDxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayosIDg+IFNlZW5NQkJzOworICBNYWNoaW5lQmFzaWNCbG9jazo6c3VjY19pdGVyYXRvciBTSSA9IHN1Y2NfYmVnaW4oKTsKKyAgd2hpbGUgKFNJICE9IHN1Y2NfZW5kKCkpIHsKKyAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gKlNJOworICAgIGlmICghU2Vlbk1CQnMuaW5zZXJ0KE1CQikgfHwKKyAgICAgICAgTUJCICE9IERlc3RBICYmIE1CQiAhPSBEZXN0QikgeworICAgICAgLy8gVGhpcyBpcyBhIHN1cGVyZmx1b3VzIGVkZ2UsIHJlbW92ZSBpdC4KKyAgICAgIFNJID0gcmVtb3ZlU3VjY2Vzc29yKFNJKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICArK1NJOworICAgIH0KKyAgfQorCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gZmluZERlYnVnTG9jIC0gZmluZCB0aGUgbmV4dCB2YWxpZCBEZWJ1Z0xvYyBzdGFydGluZyBhdCBNQkJJLCBza2lwcGluZworLy8vIGFueSBEQkdfVkFMVUUgaW5zdHJ1Y3Rpb25zLiAgUmV0dXJuIFVua25vd25Mb2MgaWYgdGhlcmUgaXMgbm9uZS4KK0RlYnVnTG9jCitNYWNoaW5lQmFzaWNCbG9jazo6ZmluZERlYnVnTG9jKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUJCSSkgeworICBEZWJ1Z0xvYyBETDsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEUgPSBlbmQoKTsKKyAgaWYgKE1CQkkgIT0gRSkgeworICAgIC8vIFNraXAgZGVidWcgZGVjbGFyYXRpb25zLCB3ZSBkb24ndCB3YW50IGEgRGVidWdMb2MgZnJvbSB0aGVtLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJMiA9IE1CQkk7CisgICAgd2hpbGUgKE1CQkkyICE9IEUgJiYgTUJCSTItPmlzRGVidWdWYWx1ZSgpKQorICAgICAgTUJCSTIrKzsKKyAgICBpZiAoTUJCSTIgIT0gRSkKKyAgICAgIERMID0gTUJCSTItPmdldERlYnVnTG9jKCk7CisgIH0KKyAgcmV0dXJuIERMOworfQorCit2b2lkIGxsdm06OldyaXRlQXNPcGVyYW5kKHJhd19vc3RyZWFtICZPUywgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0KSB7CisgIE9TIDw8ICJCQiMiIDw8IE1CQi0+Z2V0TnVtYmVyKCk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVDU0UuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUNTRS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmNDFlZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVDU0UuY3BwCkBAIC0wLDAgKzEsNTA3IEBACisvLz09PS0tIE1hY2hpbmVDU0UuY3BwIC0gTWFjaGluZSBDb21tb24gU3ViZXhwcmVzc2lvbiBFbGltaW5hdGlvbiBQYXNzIC0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBwZXJmb3JtcyBnbG9iYWwgY29tbW9uIHN1YmV4cHJlc3Npb24gZWxpbWluYXRpb24gb24gbWFjaGluZQorLy8gaW5zdHJ1Y3Rpb25zIHVzaW5nIGEgc2NvcGVkIGhhc2ggdGFibGUgYmFzZWQgdmFsdWUgbnVtYmVyaW5nIHNjaGVtZS4gSXQKKy8vIG11c3QgYmUgcnVuIHdoaWxlIHRoZSBtYWNoaW5lIGZ1bmN0aW9uIGlzIHN0aWxsIGluIFNTQSBmb3JtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibWFjaGluZS1jc2UiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2NvcGVkSGFzaFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtQ29hbGVzY2VzLCAiTnVtYmVyIG9mIGNvcGllcyBjb2FsZXNjZWQiKTsKK1NUQVRJU1RJQyhOdW1DU0VzLCAgICAgICJOdW1iZXIgb2YgY29tbW9uIHN1YmV4cHJlc3Npb24gZWxpbWluYXRlZCIpOworU1RBVElTVElDKE51bVBoeXNDU0VzLCAgIk51bWJlciBvZiBwaHlyZWcgZGVmaW5pbmcgY29tbW9uIHN1YmV4cHIgZWxpbWluYXRlZCIpOworCituYW1lc3BhY2UgeworICBjbGFzcyBNYWNoaW5lQ1NFIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICAgIEFsaWFzQW5hbHlzaXMgKkFBOworICAgIE1hY2hpbmVEb21pbmF0b3JUcmVlICpEVDsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbgorICAgIE1hY2hpbmVDU0UoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpLCBMb29rQWhlYWRMaW1pdCg1KSwgQ3VyclZOKDApIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLnNldFByZXNlcnZlc0NGRygpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxBbGlhc0FuYWx5c2lzPigpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8TWFjaGluZURvbWluYXRvclRyZWU+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZURvbWluYXRvclRyZWU+KCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgdW5zaWduZWQgTG9va0FoZWFkTGltaXQ7CisgICAgdHlwZWRlZiBTY29wZWRIYXNoVGFibGVTY29wZTxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ckV4cHJlc3Npb25UcmFpdD4gU2NvcGVUeXBlOworICAgIERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgU2NvcGVUeXBlKj4gU2NvcGVNYXA7CisgICAgU2NvcGVkSGFzaFRhYmxlPE1hY2hpbmVJbnN0ciosIHVuc2lnbmVkLCBNYWNoaW5lSW5zdHJFeHByZXNzaW9uVHJhaXQ+IFZOVDsKKyAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA2ND4gRXhwczsKKyAgICB1bnNpZ25lZCBDdXJyVk47CisKKyAgICBib29sIFBlcmZvcm1Ucml2aWFsQ29hbGVzY2luZyhNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKyAgICBib29sIGlzUGh5c0RlZlRyaXZpYWxseURlYWQodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEUpIGNvbnN0IDsKKyAgICBib29sIGhhc0xpdmVQaHlzUmVnRGVmVXNlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlBoeXNEZWYpIGNvbnN0OworICAgIGJvb2wgUGh5c1JlZ0RlZlJlYWNoZXMoTWFjaGluZUluc3RyICpDU01JLCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUGh5c0RlZikgY29uc3Q7CisgICAgYm9vbCBpc0NTRUNhbmRpZGF0ZShNYWNoaW5lSW5zdHIgKk1JKTsKKyAgICBib29sIGlzUHJvZml0YWJsZVRvQ1NFKHVuc2lnbmVkIENTUmVnLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKkNTTUksIE1hY2hpbmVJbnN0ciAqTUkpOworICAgIHZvaWQgRW50ZXJTY29wZShNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKyAgICB2b2lkIEV4aXRTY29wZShNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKyAgICBib29sIFByb2Nlc3NCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKyAgICB2b2lkIEV4aXRTY29wZUlmRG9uZShNYWNoaW5lRG9tVHJlZU5vZGUgKk5vZGUsCisgICAgICAgICAgICAgICAgIERlbnNlTWFwPE1hY2hpbmVEb21UcmVlTm9kZSosIHVuc2lnbmVkPiAmT3BlbkNoaWxkcmVuLAorICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lRG9tVHJlZU5vZGUqLCBNYWNoaW5lRG9tVHJlZU5vZGUqPiAmUGFyZW50TWFwKTsKKyAgICBib29sIFBlcmZvcm1DU0UoTWFjaGluZURvbVRyZWVOb2RlICpOb2RlKTsKKyAgfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworY2hhciBNYWNoaW5lQ1NFOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoTWFjaGluZUNTRSwgIm1hY2hpbmUtY3NlIiwKKyAgICAgICAgICAgICAgICAiTWFjaGluZSBDb21tb24gU3ViZXhwcmVzc2lvbiBFbGltaW5hdGlvbiIsIGZhbHNlLCBmYWxzZSk7CisKK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlTWFjaGluZUNTRVBhc3MoKSB7IHJldHVybiBuZXcgTWFjaGluZUNTRSgpOyB9CisKK2Jvb2wgTWFjaGluZUNTRTo6UGVyZm9ybVRyaXZpYWxDb2FsZXNjaW5nKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc1VzZSgpKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKCFSZWcgfHwgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghTVJJLT5oYXNPbmVVc2UoUmVnKSkKKyAgICAgIC8vIE9ubHkgY29hbGVzY2Ugc2luZ2xlIHVzZSBjb3BpZXMuIFRoaXMgZW5zdXJlIHRoZSBjb3B5IHdpbGwgYmUKKyAgICAgIC8vIGRlbGV0ZWQuCisgICAgICBjb250aW51ZTsKKyAgICBNYWNoaW5lSW5zdHIgKkRlZk1JID0gTVJJLT5nZXRWUmVnRGVmKFJlZyk7CisgICAgaWYgKERlZk1JLT5nZXRQYXJlbnQoKSAhPSBNQkIpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIURlZk1JLT5pc0NvcHkoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFNyY1JlZyA9IERlZk1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgIGlmICghVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihTcmNSZWcpKQorICAgICAgY29udGludWU7CisgICAgaWYgKERlZk1JLT5nZXRPcGVyYW5kKDApLmdldFN1YlJlZygpIHx8IERlZk1JLT5nZXRPcGVyYW5kKDEpLmdldFN1YlJlZygpKQorICAgICAgY29udGludWU7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqU1JDICAgPSBNUkktPmdldFJlZ0NsYXNzKFNyY1JlZyk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgICAgPSBNUkktPmdldFJlZ0NsYXNzKFJlZyk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqTmV3UkMgPSBnZXRDb21tb25TdWJDbGFzcyhSQywgU1JDKTsKKyAgICBpZiAoIU5ld1JDKQorICAgICAgY29udGludWU7CisgICAgREVCVUcoZGJncygpIDw8ICJDb2FsZXNjaW5nOiAiIDw8ICpEZWZNSSk7CisgICAgREVCVUcoZGJncygpIDw8ICIqKiogdG86ICIgPDwgKk1JKTsKKyAgICBNTy5zZXRSZWcoU3JjUmVnKTsKKyAgICBNUkktPmNsZWFyS2lsbEZsYWdzKFNyY1JlZyk7CisgICAgaWYgKE5ld1JDICE9IFNSQykKKyAgICAgIE1SSS0+c2V0UmVnQ2xhc3MoU3JjUmVnLCBOZXdSQyk7CisgICAgRGVmTUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICsrTnVtQ29hbGVzY2VzOworICAgIENoYW5nZWQgPSB0cnVlOworICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2Jvb2wKK01hY2hpbmVDU0U6OmlzUGh5c0RlZlRyaXZpYWxseURlYWQodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEUpIGNvbnN0IHsKKyAgdW5zaWduZWQgTG9va0FoZWFkTGVmdCA9IExvb2tBaGVhZExpbWl0OworICB3aGlsZSAoTG9va0FoZWFkTGVmdCkgeworICAgIC8vIFNraXAgb3ZlciBkYmdfdmFsdWUncy4KKyAgICB3aGlsZSAoSSAhPSBFICYmIEktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgKytJOworCisgICAgaWYgKEkgPT0gRSkKKyAgICAgIC8vIFJlYWNoZWQgZW5kIG9mIGJsb2NrLCByZWdpc3RlciBpcyBvYnZpb3VzbHkgZGVhZC4KKyAgICAgIHJldHVybiB0cnVlOworCisgICAgYm9vbCBTZWVuRGVmID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5nZXRSZWcoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoIVRSSS0+cmVnc092ZXJsYXAoTU8uZ2V0UmVnKCksIFJlZykpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKE1PLmlzVXNlKCkpCisgICAgICAgIC8vIEZvdW5kIGEgdXNlIQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBTZWVuRGVmID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKFNlZW5EZWYpCisgICAgICAvLyBTZWUgYSBkZWYgb2YgUmVnIChvciBhbiBhbGlhcykgYmVmb3JlIGVuY291bnRlcmluZyBhbnkgdXNlLCBpdCdzIAorICAgICAgLy8gdHJpdmlhbGx5IGRlYWQuCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC0tTG9va0FoZWFkTGVmdDsKKyAgICArK0k7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaGFzTGl2ZVBoeXNSZWdEZWZVc2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHJlYWQgLyB3cml0ZQorLy8vIHBoeXNpY2FsIHJlZ2lzdGVycyAoZXhjZXB0IGZvciBkZWFkIGRlZnMgb2YgcGh5c2ljYWwgcmVnaXN0ZXJzKS4gSXQgYWxzbworLy8vIHJldHVybnMgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIGRlZiBieSByZWZlcmVuY2UgaWYgaXQncyB0aGUgb25seSBvbmUgYW5kIHRoZQorLy8vIGluc3RydWN0aW9uIGRvZXMgbm90IHVzZXMgYSBwaHlzaWNhbCByZWdpc3Rlci4KK2Jvb2wgTWFjaGluZUNTRTo6aGFzTGl2ZVBoeXNSZWdEZWZVc2UoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlBoeXNEZWYpIGNvbnN0IHsKKyAgUGh5c0RlZiA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkpCisgICAgICBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBpZiAoIVJlZykKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZykpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoTU8uaXNVc2UoKSkgeworICAgICAgLy8gQ2FuJ3QgdG91Y2ggYW55dGhpbmcgdG8gcmVhZCBhIHBoeXNpY2FsIHJlZ2lzdGVyLgorICAgICAgUGh5c0RlZiA9IDA7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKE1PLmlzRGVhZCgpKQorICAgICAgLy8gSWYgdGhlIGRlZiBpcyBkZWFkLCBpdCdzIG9rLgorICAgICAgY29udGludWU7CisgICAgLy8gT2ssIHRoaXMgaXMgYSBwaHlzaWNhbCByZWdpc3RlciBkZWYgdGhhdCdzIG5vdCBtYXJrZWQgImRlYWQiLiBUaGF0J3MKKyAgICAvLyBjb21tb24gc2luY2UgdGhpcyBwYXNzIGlzIHJ1biBiZWZvcmUgbGl2ZXZhcmlhYmxlcy4gV2UgY2FuIHNjYW4KKyAgICAvLyBmb3J3YXJkIGEgZmV3IGluc3RydWN0aW9ucyBhbmQgY2hlY2sgaWYgaXQgaXMgb2J2aW91c2x5IGRlYWQuCisgICAgaWYgKFBoeXNEZWYpIHsKKyAgICAgIC8vIE11bHRpcGxlIHBoeXNpY2FsIHJlZ2lzdGVyIGRlZnMuIFRoZXNlIGFyZSByYXJlLCBmb3JnZXQgYWJvdXQgaXQuCisgICAgICBQaHlzRGVmID0gMDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBQaHlzRGVmID0gUmVnOworICB9CisKKyAgaWYgKFBoeXNEZWYpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IE1JOyBJID0gbGx2bTo6bmV4dChJKTsKKyAgICBpZiAoIWlzUGh5c0RlZlRyaXZpYWxseURlYWQoUGh5c0RlZiwgSSwgTUJCLT5lbmQoKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTWFjaGluZUNTRTo6UGh5c1JlZ0RlZlJlYWNoZXMoTWFjaGluZUluc3RyICpDU01JLCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBoeXNEZWYpIGNvbnN0IHsKKyAgLy8gRm9yIG5vdyBjb25zZXJ2YXRpdmVseSByZXR1cm5zIGZhbHNlIGlmIHRoZSBjb21tb24gc3ViZXhwcmVzc2lvbiBpcworICAvLyBub3QgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2sgYXMgdGhlIGdpdmVuIGluc3RydWN0aW9uLgorICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTUktPmdldFBhcmVudCgpOworICBpZiAoQ1NNSS0+Z2V0UGFyZW50KCkgIT0gTUJCKQorICAgIHJldHVybiBmYWxzZTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBDU01JOyBJID0gbGx2bTo6bmV4dChJKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEUgPSBNSTsKKyAgdW5zaWduZWQgTG9va0FoZWFkTGVmdCA9IExvb2tBaGVhZExpbWl0OworICB3aGlsZSAoTG9va0FoZWFkTGVmdCkgeworICAgIC8vIFNraXAgb3ZlciBkYmdfdmFsdWUncy4KKyAgICB3aGlsZSAoSSAhPSBFICYmIEktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgKytJOworCisgICAgaWYgKEkgPT0gRSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChJLT5tb2RpZmllc1JlZ2lzdGVyKFBoeXNEZWYsIFRSSSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAtLUxvb2tBaGVhZExlZnQ7CisgICAgKytJOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1hY2hpbmVDU0U6OmlzQ1NFQ2FuZGlkYXRlKE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgaWYgKE1JLT5pc0xhYmVsKCkgfHwgTUktPmlzUEhJKCkgfHwgTUktPmlzSW1wbGljaXREZWYoKSB8fAorICAgICAgTUktPmlzS2lsbCgpIHx8IE1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWdub3JlIGNvcGllcy4KKyAgaWYgKE1JLT5pc0NvcHlMaWtlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElnbm9yZSBzdHVmZiB0aGF0IHdlIG9idmlvdXNseSBjYW4ndCBtb3ZlLgorICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7ICAKKyAgaWYgKFRJRC5tYXlTdG9yZSgpIHx8IFRJRC5pc0NhbGwoKSB8fCBUSUQuaXNUZXJtaW5hdG9yKCkgfHwKKyAgICAgIFRJRC5oYXNVbm1vZGVsZWRTaWRlRWZmZWN0cygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoVElELm1heUxvYWQoKSkgeworICAgIC8vIE9rYXksIHRoaXMgaW5zdHJ1Y3Rpb24gZG9lcyBhIGxvYWQuIEFzIGEgcmVmaW5lbWVudCwgd2UgYWxsb3cgdGhlIHRhcmdldAorICAgIC8vIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBsb2FkZWQgdmFsdWUgaXMgYWN0dWFsbHkgYSBjb25zdGFudC4gSWYgc28sIHdlIGNhbgorICAgIC8vIGFjdHVhbGx5IHVzZSBpdCBhcyBhIGxvYWQuCisgICAgaWYgKCFNSS0+aXNJbnZhcmlhbnRMb2FkKEFBKSkKKyAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBob2lzdCBsb2FkcyB3aXRoIG5vIG90aGVyIHNpZGUgZWZmZWN0cyBpZgorICAgICAgLy8gdGhlcmUgYXJlIG5vIG90aGVyIGluc3RydWN0aW9ucyB3aGljaCBjYW4gY2hhbmdlIG1lbW9yeSBpbiB0aGlzIGxvb3AuCisgICAgICAvLyBUaGlzIGlzIGEgdHJpdmlhbCBmb3JtIG9mIGFsaWFzIGFuYWx5c2lzLgorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gaXNQcm9maXRhYmxlVG9DU0UgLSBSZXR1cm4gdHJ1ZSBpZiBpdCdzIHByb2ZpdGFibGUgdG8gZWxpbWluYXRlIE1JIHdpdGggYQorLy8vIGNvbW1vbiBleHByZXNzaW9uIHRoYXQgZGVmaW5lcyBSZWcuCitib29sIE1hY2hpbmVDU0U6OmlzUHJvZml0YWJsZVRvQ1NFKHVuc2lnbmVkIENTUmVnLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqQ1NNSSwgTWFjaGluZUluc3RyICpNSSkgeworICAvLyBGSVhNRTogSGV1cmlzdGljcyB0aGF0IHdvcmtzIGFyb3VuZCB0aGUgbGFjayB0aGUgbGl2ZSByYW5nZSBzcGxpdHRpbmcuCisKKyAgLy8gSGV1cmlzdGljcyAjMTogRG9uJ3QgY3NlICJjaGVhcCIgY29tcHV0YXRpbmcgaWYgdGhlIGRlZiBpcyBub3QgbG9jYWwgb3IgaW4gYW4KKyAgLy8gaW1tZWRpYXRlIHByZWRlY2Vzc29yLiBXZSBkb24ndCB3YW50IHRvIGluY3JlYXNlIHJlZ2lzdGVyIHByZXNzdXJlIGFuZCBlbmQgdXAKKyAgLy8gY2F1c2luZyBvdGhlciBjb21wdXRhdGlvbiB0byBiZSBzcGlsbGVkLgorICBpZiAoTUktPmdldERlc2MoKS5pc0FzQ2hlYXBBc0FNb3ZlKCkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqQ1NCQiA9IENTTUktPmdldFBhcmVudCgpOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQiA9IE1JLT5nZXRQYXJlbnQoKTsKKyAgICBpZiAoQ1NCQiAhPSBCQiAmJiAKKyAgICAgICAgZmluZChDU0JCLT5zdWNjX2JlZ2luKCksIENTQkItPnN1Y2NfZW5kKCksIEJCKSA9PSBDU0JCLT5zdWNjX2VuZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSGV1cmlzdGljcyAjMjogSWYgdGhlIGV4cHJlc3Npb24gZG9lc24ndCBub3QgdXNlIGEgdnIgYW5kIHRoZSBvbmx5IHVzZQorICAvLyBvZiB0aGUgcmVkdW5kYW50IGNvbXB1dGF0aW9uIGFyZSBjb3BpZXMsIGRvIG5vdCBjc2UuCisgIGJvb2wgSGFzVlJlZ1VzZSA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNVc2UoKSAmJiBNTy5nZXRSZWcoKSAmJgorICAgICAgICBUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKE1PLmdldFJlZygpKSkgeworICAgICAgSGFzVlJlZ1VzZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFIYXNWUmVnVXNlKSB7CisgICAgYm9vbCBIYXNOb25Db3B5VXNlID0gZmFsc2U7CisgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2Vfbm9kYmdfaXRlcmF0b3IgSSA9ICBNUkktPnVzZV9ub2RiZ19iZWdpbihSZWcpLAorICAgICAgICAgICBFID0gTVJJLT51c2Vfbm9kYmdfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKlVzZSA9ICYqSTsKKyAgICAgIC8vIElnbm9yZSBjb3BpZXMuCisgICAgICBpZiAoIVVzZS0+aXNDb3B5TGlrZSgpKSB7CisgICAgICAgIEhhc05vbkNvcHlVc2UgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFIYXNOb25Db3B5VXNlKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSGV1cmlzdGljcyAjMzogSWYgdGhlIGNvbW1vbiBzdWJleHByZXNzaW9uIGlzIHVzZWQgYnkgUEhJcywgZG8gbm90IHJldXNlCisgIC8vIGl0IHVubGVzcyB0aGUgZGVmaW5lZCB2YWx1ZSBpcyBhbHJlYWR5IHVzZWQgaW4gdGhlIEJCIG9mIHRoZSBuZXcgdXNlLgorICBib29sIEhhc1BISSA9IGZhbHNlOworICBTbWFsbFB0clNldDxNYWNoaW5lQmFzaWNCbG9jayosIDQ+IENTQkJzOworICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9ub2RiZ19pdGVyYXRvciBJID0gIE1SSS0+dXNlX25vZGJnX2JlZ2luKENTUmVnKSwKKyAgICAgICBFID0gTVJJLT51c2Vfbm9kYmdfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgTWFjaGluZUluc3RyICpVc2UgPSAmKkk7CisgICAgSGFzUEhJIHw9IFVzZS0+aXNQSEkoKTsKKyAgICBDU0JCcy5pbnNlcnQoVXNlLT5nZXRQYXJlbnQoKSk7CisgIH0KKworICBpZiAoIUhhc1BISSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIENTQkJzLmNvdW50KE1JLT5nZXRQYXJlbnQoKSk7Cit9CisKK3ZvaWQgTWFjaGluZUNTRTo6RW50ZXJTY29wZShNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiRW50ZXJpbmc6ICIgPDwgTUJCLT5nZXROYW1lKCkgPDwgJ1xuJyk7CisgIFNjb3BlVHlwZSAqU2NvcGUgPSBuZXcgU2NvcGVUeXBlKFZOVCk7CisgIFNjb3BlTWFwW01CQl0gPSBTY29wZTsKK30KKwordm9pZCBNYWNoaW5lQ1NFOjpFeGl0U2NvcGUoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICBERUJVRyhkYmdzKCkgPDwgIkV4aXRpbmc6ICIgPDwgTUJCLT5nZXROYW1lKCkgPDwgJ1xuJyk7CisgIERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgU2NvcGVUeXBlKj46Oml0ZXJhdG9yIFNJID0gU2NvcGVNYXAuZmluZChNQkIpOworICBhc3NlcnQoU0kgIT0gU2NvcGVNYXAuZW5kKCkpOworICBTY29wZU1hcC5lcmFzZShTSSk7CisgIGRlbGV0ZSBTSS0+c2Vjb25kOworfQorCitib29sIE1hY2hpbmVDU0U6OlByb2Nlc3NCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+LCA4PiBDU0VQYWlyczsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi0+YmVnaW4oKSwgRSA9IE1CQi0+ZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgTWFjaGluZUluc3RyICpNSSA9ICYqSTsKKyAgICArK0k7CisKKyAgICBpZiAoIWlzQ1NFQ2FuZGlkYXRlKE1JKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgYm9vbCBEZWZQaHlzID0gZmFsc2U7CisgICAgYm9vbCBGb3VuZENTRSA9IFZOVC5jb3VudChNSSk7CisgICAgaWYgKCFGb3VuZENTRSkgeworICAgICAgLy8gTG9vayBmb3IgdHJpdmlhbCBjb3B5IGNvYWxlc2Npbmcgb3Bwb3J0dW5pdGllcy4KKyAgICAgIGlmIChQZXJmb3JtVHJpdmlhbENvYWxlc2NpbmcoTUksIE1CQikpIHsKKyAgICAgICAgLy8gQWZ0ZXIgY29hbGVzY2luZyBNSSBpdHNlbGYgbWF5IGJlY29tZSBhIGNvcHkuCisgICAgICAgIGlmIChNSS0+aXNDb3B5TGlrZSgpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBGb3VuZENTRSA9IFZOVC5jb3VudChNSSk7CisgICAgICB9CisgICAgfQorICAgIC8vIEZJWE1FOiBjb21tdXRlIGNvbW11dGFibGUgaW5zdHJ1Y3Rpb25zPworCisgICAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGRlZmluZXMgYSBwaHlzaWNhbCByZWdpc3RlciBhbmQgdGhlIHZhbHVlICptYXkqIGJlCisgICAgLy8gdXNlZCwgdGhlbiBpdCdzIG5vdCBzYWZlIHRvIHJlcGxhY2UgaXQgd2l0aCBhIGNvbW1vbiBzdWJleHByZXNzaW9uLgorICAgIHVuc2lnbmVkIFBoeXNEZWYgPSAwOworICAgIGlmIChGb3VuZENTRSAmJiBoYXNMaXZlUGh5c1JlZ0RlZlVzZShNSSwgTUJCLCBQaHlzRGVmKSkgeworICAgICAgRm91bmRDU0UgPSBmYWxzZTsKKworICAgICAgLy8gLi4uIFVubGVzcyB0aGUgQ1MgaXMgbG9jYWwgYW5kIGl0IGFsc28gZGVmaW5lcyB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIKKyAgICAgIC8vIHdoaWNoIGlzIG5vdCBjbG9iYmVyZWQgaW4gYmV0d2Vlbi4KKyAgICAgIGlmIChQaHlzRGVmKSB7CisgICAgICAgIHVuc2lnbmVkIENTVk4gPSBWTlQubG9va3VwKE1JKTsKKyAgICAgICAgTWFjaGluZUluc3RyICpDU01JID0gRXhwc1tDU1ZOXTsKKyAgICAgICAgaWYgKFBoeXNSZWdEZWZSZWFjaGVzKENTTUksIE1JLCBQaHlzRGVmKSkgeworICAgICAgICAgIEZvdW5kQ1NFID0gdHJ1ZTsKKyAgICAgICAgICBEZWZQaHlzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICghRm91bmRDU0UpIHsKKyAgICAgIFZOVC5pbnNlcnQoTUksIEN1cnJWTisrKTsKKyAgICAgIEV4cHMucHVzaF9iYWNrKE1JKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIEZvdW5kIGEgY29tbW9uIHN1YmV4cHJlc3Npb24sIGVsaW1pbmF0ZSBpdC4KKyAgICB1bnNpZ25lZCBDU1ZOID0gVk5ULmxvb2t1cChNSSk7CisgICAgTWFjaGluZUluc3RyICpDU01JID0gRXhwc1tDU1ZOXTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkV4YW1pbmluZzogIiA8PCAqTUkpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiKioqIEZvdW5kIGEgY29tbW9uIHN1YmV4cHJlc3Npb246ICIgPDwgKkNTTUkpOworCisgICAgLy8gQ2hlY2sgaWYgaXQncyBwcm9maXRhYmxlIHRvIHBlcmZvcm0gdGhpcyBDU0UuCisgICAgYm9vbCBEb0NTRSA9IHRydWU7CisgICAgdW5zaWduZWQgTnVtRGVmcyA9IE1JLT5nZXREZXNjKCkuZ2V0TnVtRGVmcygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgTnVtRGVmcyAmJiBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzRGVmKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgdW5zaWduZWQgT2xkUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICB1bnNpZ25lZCBOZXdSZWcgPSBDU01JLT5nZXRPcGVyYW5kKGkpLmdldFJlZygpOworICAgICAgaWYgKE9sZFJlZyA9PSBOZXdSZWcpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoT2xkUmVnKSAmJgorICAgICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoTmV3UmVnKSAmJgorICAgICAgICAgICAgICJEbyBub3QgQ1NFIHBoeXNpY2FsIHJlZ2lzdGVyIGRlZnMhIik7CisgICAgICBpZiAoIWlzUHJvZml0YWJsZVRvQ1NFKE5ld1JlZywgT2xkUmVnLCBDU01JLCBNSSkpIHsKKyAgICAgICAgRG9DU0UgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBDU0VQYWlycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoT2xkUmVnLCBOZXdSZWcpKTsKKyAgICAgIC0tTnVtRGVmczsKKyAgICB9CisKKyAgICAvLyBBY3R1YWxseSBwZXJmb3JtIHRoZSBlbGltaW5hdGlvbi4KKyAgICBpZiAoRG9DU0UpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDU0VQYWlycy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIE1SSS0+cmVwbGFjZVJlZ1dpdGgoQ1NFUGFpcnNbaV0uZmlyc3QsIENTRVBhaXJzW2ldLnNlY29uZCk7CisgICAgICAgIE1SSS0+Y2xlYXJLaWxsRmxhZ3MoQ1NFUGFpcnNbaV0uc2Vjb25kKTsKKyAgICAgIH0KKyAgICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICsrTnVtQ1NFczsKKyAgICAgIGlmIChEZWZQaHlzKQorICAgICAgICArK051bVBoeXNDU0VzOworICAgIH0gZWxzZSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIioqKiBOb3QgcHJvZml0YWJsZSwgYXZvaWQgQ1NFIVxuIik7CisgICAgICBWTlQuaW5zZXJ0KE1JLCBDdXJyVk4rKyk7CisgICAgICBFeHBzLnB1c2hfYmFjayhNSSk7CisgICAgfQorICAgIENTRVBhaXJzLmNsZWFyKCk7CisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIEV4aXRTY29wZUlmRG9uZSAtIERlc3Ryb3kgc2NvcGUgZm9yIHRoZSBNQkIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4KKy8vLyBkb21pbmF0b3IgdHJlZSBub2RlIGlmIGl0cyBhIGxlYWYgb3IgYWxsIG9mIGl0cyBjaGlsZHJlbiBhcmUgZG9uZS4gV2FsaworLy8vIHVwIHRoZSBkb21pbmF0b3IgdHJlZSB0byBkZXN0cm95IGFuY2VzdG9ycyB3aGljaCBhcmUgbm93IGRvbmUuCit2b2lkCitNYWNoaW5lQ1NFOjpFeGl0U2NvcGVJZkRvbmUoTWFjaGluZURvbVRyZWVOb2RlICpOb2RlLAorICAgICAgICAgICAgICAgIERlbnNlTWFwPE1hY2hpbmVEb21UcmVlTm9kZSosIHVuc2lnbmVkPiAmT3BlbkNoaWxkcmVuLAorICAgICAgICAgICAgICAgIERlbnNlTWFwPE1hY2hpbmVEb21UcmVlTm9kZSosIE1hY2hpbmVEb21UcmVlTm9kZSo+ICZQYXJlbnRNYXApIHsKKyAgaWYgKE9wZW5DaGlsZHJlbltOb2RlXSkKKyAgICByZXR1cm47CisKKyAgLy8gUG9wIHNjb3BlLgorICBFeGl0U2NvcGUoTm9kZS0+Z2V0QmxvY2soKSk7CisKKyAgLy8gTm93IHRyYXZlcnNlIHVwd2FyZHMgdG8gcG9wIGFuY2VzdG9ycyB3aG9zZSBvZmZzcHJpbmdzIGFyZSBhbGwgZG9uZS4KKyAgd2hpbGUgKE1hY2hpbmVEb21UcmVlTm9kZSAqUGFyZW50ID0gUGFyZW50TWFwW05vZGVdKSB7CisgICAgdW5zaWduZWQgTGVmdCA9IC0tT3BlbkNoaWxkcmVuW1BhcmVudF07CisgICAgaWYgKExlZnQgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIEV4aXRTY29wZShQYXJlbnQtPmdldEJsb2NrKCkpOworICAgIE5vZGUgPSBQYXJlbnQ7CisgIH0KK30KKworYm9vbCBNYWNoaW5lQ1NFOjpQZXJmb3JtQ1NFKE1hY2hpbmVEb21UcmVlTm9kZSAqTm9kZSkgeworICBTbWFsbFZlY3RvcjxNYWNoaW5lRG9tVHJlZU5vZGUqLCAzMj4gU2NvcGVzOworICBTbWFsbFZlY3RvcjxNYWNoaW5lRG9tVHJlZU5vZGUqLCA4PiBXb3JrTGlzdDsKKyAgRGVuc2VNYXA8TWFjaGluZURvbVRyZWVOb2RlKiwgTWFjaGluZURvbVRyZWVOb2RlKj4gUGFyZW50TWFwOworICBEZW5zZU1hcDxNYWNoaW5lRG9tVHJlZU5vZGUqLCB1bnNpZ25lZD4gT3BlbkNoaWxkcmVuOworCisgIC8vIFBlcmZvcm0gYSBERlMgd2FsayB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIHZpc2l0LgorICBXb3JrTGlzdC5wdXNoX2JhY2soTm9kZSk7CisgIGRvIHsKKyAgICBOb2RlID0gV29ya0xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgU2NvcGVzLnB1c2hfYmFjayhOb2RlKTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lRG9tVHJlZU5vZGUqPiAmQ2hpbGRyZW4gPSBOb2RlLT5nZXRDaGlsZHJlbigpOworICAgIHVuc2lnbmVkIE51bUNoaWxkcmVuID0gQ2hpbGRyZW4uc2l6ZSgpOworICAgIE9wZW5DaGlsZHJlbltOb2RlXSA9IE51bUNoaWxkcmVuOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtQ2hpbGRyZW47ICsraSkgeworICAgICAgTWFjaGluZURvbVRyZWVOb2RlICpDaGlsZCA9IENoaWxkcmVuW2ldOworICAgICAgUGFyZW50TWFwW0NoaWxkXSA9IE5vZGU7CisgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soQ2hpbGQpOworICAgIH0KKyAgfSB3aGlsZSAoIVdvcmtMaXN0LmVtcHR5KCkpOworCisgIC8vIE5vdyBwZXJmb3JtIENTRS4KKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTY29wZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVEb21UcmVlTm9kZSAqTm9kZSA9IFNjb3Blc1tpXTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTm9kZS0+Z2V0QmxvY2soKTsKKyAgICBFbnRlclNjb3BlKE1CQik7CisgICAgQ2hhbmdlZCB8PSBQcm9jZXNzQmxvY2soTUJCKTsKKyAgICAvLyBJZiBpdCdzIGEgbGVhZiBub2RlLCBpdCdzIGRvbmUuIFRyYXZlcnNlIHVwd2FyZHMgdG8gcG9wIGFuY2VzdG9ycy4KKyAgICBFeGl0U2NvcGVJZkRvbmUoTm9kZSwgT3BlbkNoaWxkcmVuLCBQYXJlbnRNYXApOworICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2Jvb2wgTWFjaGluZUNTRTo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBUSUkgPSBNRi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKTsKKyAgVFJJID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIE1SSSA9ICZNRi5nZXRSZWdJbmZvKCk7CisgIEFBID0gJmdldEFuYWx5c2lzPEFsaWFzQW5hbHlzaXM+KCk7CisgIERUID0gJmdldEFuYWx5c2lzPE1hY2hpbmVEb21pbmF0b3JUcmVlPigpOworICByZXR1cm4gUGVyZm9ybUNTRShEVC0+Z2V0Um9vdE5vZGUoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOWQ2NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmNwcApAQCAtMCwwICsxLDU4IEBACisvLz09PS0gTWFjaGluZURvbWluYXRvcnMuY3BwIC0gTWFjaGluZSBEb21pbmF0b3IgQ2FsY3VsYXRpb24gLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNpbXBsZSBkb21pbmF0b3IgY29uc3RydWN0aW9uIGFsZ29yaXRobXMgZm9yIGZpbmRpbmcKKy8vIGZvcndhcmQgZG9taW5hdG9ycyBvbiBtYWNoaW5lIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIGxsdm0geworVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBEb21UcmVlTm9kZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+KTsKK1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgRG9taW5hdG9yVHJlZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+KTsKK30KKworY2hhciBNYWNoaW5lRG9taW5hdG9yVHJlZTo6SUQgPSAwOworCitzdGF0aWMgUmVnaXN0ZXJQYXNzPE1hY2hpbmVEb21pbmF0b3JUcmVlPgorRSgibWFjaGluZWRvbXRyZWUiLCAiTWFjaGluZURvbWluYXRvciBUcmVlIENvbnN0cnVjdGlvbiIsIHRydWUpOworCitjaGFyICZsbHZtOjpNYWNoaW5lRG9taW5hdG9yc0lEID0gTWFjaGluZURvbWluYXRvclRyZWU6OklEOworCit2b2lkIE1hY2hpbmVEb21pbmF0b3JUcmVlOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKK30KKworYm9vbCBNYWNoaW5lRG9taW5hdG9yVHJlZTo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSB7CisgIERULT5yZWNhbGN1bGF0ZShGKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK01hY2hpbmVEb21pbmF0b3JUcmVlOjpNYWNoaW5lRG9taW5hdG9yVHJlZSgpCisgICAgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7CisgIERUID0gbmV3IERvbWluYXRvclRyZWVCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrPihmYWxzZSk7Cit9CisKK01hY2hpbmVEb21pbmF0b3JUcmVlOjp+TWFjaGluZURvbWluYXRvclRyZWUoKSB7CisgIGRlbGV0ZSBEVDsKK30KKwordm9pZCBNYWNoaW5lRG9taW5hdG9yVHJlZTo6cmVsZWFzZU1lbW9yeSgpIHsKKyAgRFQtPnJlbGVhc2VNZW1vcnkoKTsKK30KKwordm9pZCBNYWNoaW5lRG9taW5hdG9yVHJlZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUqKSBjb25zdCB7CisgIERULT5wcmludChPUyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTcxNzAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmNwcApAQCAtMCwwICsxLDczOSBAQAorLy89PT0tLSBNYWNoaW5lRnVuY3Rpb24uY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb2xsZWN0IG5hdGl2ZSBtYWNoaW5lIGNvZGUgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24uICBUaGlzIGFsbG93cworLy8gdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnZW5lcmF0ZWQgY29kZSB0byBiZSBzdG9yZWQgd2l0aCBlYWNoCisvLyBmdW5jdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RlYnVnSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HcmFwaFdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYWNoaW5lRnVuY3Rpb24gaW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE91dCBvZiBsaW5lIHZpcnR1YWwgbWV0aG9kLgorTWFjaGluZUZ1bmN0aW9uSW5mbzo6fk1hY2hpbmVGdW5jdGlvbkluZm8oKSB7fQorCit2b2lkIGlsaXN0X3RyYWl0czxNYWNoaW5lQmFzaWNCbG9jaz46OmRlbGV0ZU5vZGUoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICBNQkItPmdldFBhcmVudCgpLT5EZWxldGVNYWNoaW5lQmFzaWNCbG9jayhNQkIpOworfQorCitNYWNoaW5lRnVuY3Rpb246Ok1hY2hpbmVGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAqRiwgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGdW5jdGlvbk51bSwgTWFjaGluZU1vZHVsZUluZm8gJm1taSkKKyAgOiBGbihGKSwgVGFyZ2V0KFRNKSwgQ3R4KG1taS5nZXRDb250ZXh0KCkpLCBNTUkobW1pKSB7CisgIGlmIChUTS5nZXRSZWdpc3RlckluZm8oKSkKKyAgICBSZWdJbmZvID0gbmV3IChBbGxvY2F0b3IpIE1hY2hpbmVSZWdpc3RlckluZm8oKlRNLmdldFJlZ2lzdGVySW5mbygpKTsKKyAgZWxzZQorICAgIFJlZ0luZm8gPSAwOworICBNRkluZm8gPSAwOworICBGcmFtZUluZm8gPSBuZXcgKEFsbG9jYXRvcikgTWFjaGluZUZyYW1lSW5mbygqVE0uZ2V0RnJhbWVJbmZvKCkpOworICBpZiAoRm4tPmhhc0ZuQXR0cihBdHRyaWJ1dGU6OlN0YWNrQWxpZ25tZW50KSkKKyAgICBGcmFtZUluZm8tPnNldE1heEFsaWdubWVudChBdHRyaWJ1dGU6OmdldFN0YWNrQWxpZ25tZW50RnJvbUF0dHJzKAorICAgICAgICBGbi0+Z2V0QXR0cmlidXRlcygpLmdldEZuQXR0cmlidXRlcygpKSk7CisgIENvbnN0YW50UG9vbCA9IG5ldyAoQWxsb2NhdG9yKSBNYWNoaW5lQ29uc3RhbnRQb29sKFRNLmdldFRhcmdldERhdGEoKSk7CisgIEFsaWdubWVudCA9IFRNLmdldFRhcmdldExvd2VyaW5nKCktPmdldEZ1bmN0aW9uQWxpZ25tZW50KEYpOworICBGdW5jdGlvbk51bWJlciA9IEZ1bmN0aW9uTnVtOworICBKdW1wVGFibGVJbmZvID0gMDsKK30KKworTWFjaGluZUZ1bmN0aW9uOjp+TWFjaGluZUZ1bmN0aW9uKCkgeworICBCYXNpY0Jsb2Nrcy5jbGVhcigpOworICBJbnN0cnVjdGlvblJlY3ljbGVyLmNsZWFyKEFsbG9jYXRvcik7CisgIEJhc2ljQmxvY2tSZWN5Y2xlci5jbGVhcihBbGxvY2F0b3IpOworICBpZiAoUmVnSW5mbykgeworICAgIFJlZ0luZm8tPn5NYWNoaW5lUmVnaXN0ZXJJbmZvKCk7CisgICAgQWxsb2NhdG9yLkRlYWxsb2NhdGUoUmVnSW5mbyk7CisgIH0KKyAgaWYgKE1GSW5mbykgeworICAgIE1GSW5mby0+fk1hY2hpbmVGdW5jdGlvbkluZm8oKTsKKyAgICBBbGxvY2F0b3IuRGVhbGxvY2F0ZShNRkluZm8pOworICB9CisgIEZyYW1lSW5mby0+fk1hY2hpbmVGcmFtZUluZm8oKTsgICAgICAgICBBbGxvY2F0b3IuRGVhbGxvY2F0ZShGcmFtZUluZm8pOworICBDb25zdGFudFBvb2wtPn5NYWNoaW5lQ29uc3RhbnRQb29sKCk7ICAgQWxsb2NhdG9yLkRlYWxsb2NhdGUoQ29uc3RhbnRQb29sKTsKKyAgCisgIGlmIChKdW1wVGFibGVJbmZvKSB7CisgICAgSnVtcFRhYmxlSW5mby0+fk1hY2hpbmVKdW1wVGFibGVJbmZvKCk7CisgICAgQWxsb2NhdG9yLkRlYWxsb2NhdGUoSnVtcFRhYmxlSW5mbyk7CisgIH0KK30KKworLy8vIGdldE9yQ3JlYXRlSnVtcFRhYmxlSW5mbyAtIEdldCB0aGUgSnVtcFRhYmxlSW5mbyBmb3IgdGhpcyBmdW5jdGlvbiwgaWYgaXQKKy8vLyBkb2VzIGFscmVhZHkgZXhpc3QsIGFsbG9jYXRlIG9uZS4KK01hY2hpbmVKdW1wVGFibGVJbmZvICpNYWNoaW5lRnVuY3Rpb246OgorZ2V0T3JDcmVhdGVKdW1wVGFibGVJbmZvKHVuc2lnbmVkIEVudHJ5S2luZCkgeworICBpZiAoSnVtcFRhYmxlSW5mbykgcmV0dXJuIEp1bXBUYWJsZUluZm87CisgIAorICBKdW1wVGFibGVJbmZvID0gbmV3IChBbGxvY2F0b3IpCisgICAgTWFjaGluZUp1bXBUYWJsZUluZm8oKE1hY2hpbmVKdW1wVGFibGVJbmZvOjpKVEVudHJ5S2luZClFbnRyeUtpbmQpOworICByZXR1cm4gSnVtcFRhYmxlSW5mbzsKK30KKworLy8vIFJlbnVtYmVyQmxvY2tzIC0gVGhpcyBkaXNjYXJkcyBhbGwgb2YgdGhlIE1hY2hpbmVCYXNpY0Jsb2NrIG51bWJlcnMgYW5kCisvLy8gcmVjb21wdXRlcyB0aGVtLiAgVGhpcyBndWFyYW50ZWVzIHRoYXQgdGhlIE1CQiBudW1iZXJzIGFyZSBzZXF1ZW50aWFsLAorLy8vIGRlbnNlLCBhbmQgbWF0Y2ggdGhlIG9yZGVyaW5nIG9mIHRoZSBibG9ja3Mgd2l0aGluIHRoZSBmdW5jdGlvbi4gIElmIGEKKy8vLyBzcGVjaWZpYyBNYWNoaW5lQmFzaWNCbG9jayBpcyBzcGVjaWZpZWQsIG9ubHkgdGhhdCBibG9jayBhbmQgdGhvc2UgYWZ0ZXIKKy8vLyBpdCBhcmUgcmVudW1iZXJlZC4KK3ZvaWQgTWFjaGluZUZ1bmN0aW9uOjpSZW51bWJlckJsb2NrcyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIGlmIChlbXB0eSgpKSB7IE1CQk51bWJlcmluZy5jbGVhcigpOyByZXR1cm47IH0KKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkJJLCBFID0gZW5kKCk7CisgIGlmIChNQkIgPT0gMCkKKyAgICBNQkJJID0gYmVnaW4oKTsKKyAgZWxzZQorICAgIE1CQkkgPSBNQkI7CisgIAorICAvLyBGaWd1cmUgb3V0IHRoZSBibG9jayBudW1iZXIgdGhpcyBzaG91bGQgaGF2ZS4KKyAgdW5zaWduZWQgQmxvY2tObyA9IDA7CisgIGlmIChNQkJJICE9IGJlZ2luKCkpCisgICAgQmxvY2tObyA9IHByaW9yKE1CQkkpLT5nZXROdW1iZXIoKSsxOworICAKKyAgZm9yICg7IE1CQkkgIT0gRTsgKytNQkJJLCArK0Jsb2NrTm8pIHsKKyAgICBpZiAoTUJCSS0+Z2V0TnVtYmVyKCkgIT0gKGludClCbG9ja05vKSB7CisgICAgICAvLyBSZW1vdmUgdXNlIG9mIHRoZSBvbGQgbnVtYmVyLgorICAgICAgaWYgKE1CQkktPmdldE51bWJlcigpICE9IC0xKSB7CisgICAgICAgIGFzc2VydChNQkJOdW1iZXJpbmdbTUJCSS0+Z2V0TnVtYmVyKCldID09ICYqTUJCSSAmJgorICAgICAgICAgICAgICAgIk1CQiBudW1iZXIgbWlzbWF0Y2ghIik7CisgICAgICAgIE1CQk51bWJlcmluZ1tNQkJJLT5nZXROdW1iZXIoKV0gPSAwOworICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiBCbG9ja05vIGlzIGFscmVhZHkgdGFrZW4sIHNldCB0aGF0IGJsb2NrJ3MgbnVtYmVyIHRvIC0xLgorICAgICAgaWYgKE1CQk51bWJlcmluZ1tCbG9ja05vXSkKKyAgICAgICAgTUJCTnVtYmVyaW5nW0Jsb2NrTm9dLT5zZXROdW1iZXIoLTEpOworCisgICAgICBNQkJOdW1iZXJpbmdbQmxvY2tOb10gPSBNQkJJOworICAgICAgTUJCSS0+c2V0TnVtYmVyKEJsb2NrTm8pOworICAgIH0KKyAgfSAgICAKKworICAvLyBPa2F5LCBhbGwgdGhlIGJsb2NrcyBhcmUgcmVudW1iZXJlZC4gIElmIHdlIGhhdmUgY29tcGFjdGlmaWVkIHRoZSBibG9jaworICAvLyBudW1iZXJpbmcsIHNocmluayBNQkJOdW1iZXJpbmcgbm93LgorICBhc3NlcnQoQmxvY2tObyA8PSBNQkJOdW1iZXJpbmcuc2l6ZSgpICYmICJNaXNtYXRjaCEiKTsKKyAgTUJCTnVtYmVyaW5nLnJlc2l6ZShCbG9ja05vKTsKK30KKworLy8vIENyZWF0ZU1hY2hpbmVJbnN0ciAtIEFsbG9jYXRlIGEgbmV3IE1hY2hpbmVJbnN0ci4gVXNlIHRoaXMgaW5zdGVhZAorLy8vIG9mIGBuZXcgTWFjaGluZUluc3RyJy4KKy8vLworTWFjaGluZUluc3RyICoKK01hY2hpbmVGdW5jdGlvbjo6Q3JlYXRlTWFjaGluZUluc3RyKGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsIGJvb2wgTm9JbXApIHsKKyAgcmV0dXJuIG5ldyAoSW5zdHJ1Y3Rpb25SZWN5Y2xlci5BbGxvY2F0ZTxNYWNoaW5lSW5zdHI+KEFsbG9jYXRvcikpCisgICAgTWFjaGluZUluc3RyKFRJRCwgREwsIE5vSW1wKTsKK30KKworLy8vIENsb25lTWFjaGluZUluc3RyIC0gQ3JlYXRlIGEgbmV3IE1hY2hpbmVJbnN0ciB3aGljaCBpcyBhIGNvcHkgb2YgdGhlCisvLy8gJ09yaWcnIGluc3RydWN0aW9uLCBpZGVudGljYWwgaW4gYWxsIHdheXMgZXhjZXB0IHRoZSBpbnN0cnVjdGlvbgorLy8vIGhhcyBubyBwYXJlbnQsIHByZXYsIG9yIG5leHQuCisvLy8KK01hY2hpbmVJbnN0ciAqCitNYWNoaW5lRnVuY3Rpb246OkNsb25lTWFjaGluZUluc3RyKGNvbnN0IE1hY2hpbmVJbnN0ciAqT3JpZykgeworICByZXR1cm4gbmV3IChJbnN0cnVjdGlvblJlY3ljbGVyLkFsbG9jYXRlPE1hY2hpbmVJbnN0cj4oQWxsb2NhdG9yKSkKKyAgICAgICAgICAgICBNYWNoaW5lSW5zdHIoKnRoaXMsICpPcmlnKTsKK30KKworLy8vIERlbGV0ZU1hY2hpbmVJbnN0ciAtIERlbGV0ZSB0aGUgZ2l2ZW4gTWFjaGluZUluc3RyLgorLy8vCit2b2lkCitNYWNoaW5lRnVuY3Rpb246OkRlbGV0ZU1hY2hpbmVJbnN0cihNYWNoaW5lSW5zdHIgKk1JKSB7CisgIE1JLT5+TWFjaGluZUluc3RyKCk7CisgIEluc3RydWN0aW9uUmVjeWNsZXIuRGVhbGxvY2F0ZShBbGxvY2F0b3IsIE1JKTsKK30KKworLy8vIENyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrIC0gQWxsb2NhdGUgYSBuZXcgTWFjaGluZUJhc2ljQmxvY2suIFVzZSB0aGlzCisvLy8gaW5zdGVhZCBvZiBgbmV3IE1hY2hpbmVCYXNpY0Jsb2NrJy4KKy8vLworTWFjaGluZUJhc2ljQmxvY2sgKgorTWFjaGluZUZ1bmN0aW9uOjpDcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpiYikgeworICByZXR1cm4gbmV3IChCYXNpY0Jsb2NrUmVjeWNsZXIuQWxsb2NhdGU8TWFjaGluZUJhc2ljQmxvY2s+KEFsbG9jYXRvcikpCisgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2soKnRoaXMsIGJiKTsKK30KKworLy8vIERlbGV0ZU1hY2hpbmVCYXNpY0Jsb2NrIC0gRGVsZXRlIHRoZSBnaXZlbiBNYWNoaW5lQmFzaWNCbG9jay4KKy8vLwordm9pZAorTWFjaGluZUZ1bmN0aW9uOjpEZWxldGVNYWNoaW5lQmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIGFzc2VydChNQkItPmdldFBhcmVudCgpID09IHRoaXMgJiYgIk1CQiBwYXJlbnQgbWlzbWF0Y2ghIik7CisgIE1CQi0+fk1hY2hpbmVCYXNpY0Jsb2NrKCk7CisgIEJhc2ljQmxvY2tSZWN5Y2xlci5EZWFsbG9jYXRlKEFsbG9jYXRvciwgTUJCKTsKK30KKworTWFjaGluZU1lbU9wZXJhbmQgKgorTWFjaGluZUZ1bmN0aW9uOjpnZXRNYWNoaW5lTWVtT3BlcmFuZChjb25zdCBWYWx1ZSAqdiwgdW5zaWduZWQgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvLCB1aW50NjRfdCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBiYXNlX2FsaWdubWVudCkgeworICByZXR1cm4gbmV3IChBbGxvY2F0b3IpIE1hY2hpbmVNZW1PcGVyYW5kKHYsIGYsIG8sIHMsIGJhc2VfYWxpZ25tZW50KTsKK30KKworTWFjaGluZU1lbU9wZXJhbmQgKgorTWFjaGluZUZ1bmN0aW9uOjpnZXRNYWNoaW5lTWVtT3BlcmFuZChjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCwgdWludDY0X3QgU2l6ZSkgeworICByZXR1cm4gbmV3IChBbGxvY2F0b3IpCisgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQoTU1PLT5nZXRWYWx1ZSgpLCBNTU8tPmdldEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCh1aW50NjRfdChNTU8tPmdldE9mZnNldCgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdChPZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplLCBNTU8tPmdldEJhc2VBbGlnbm1lbnQoKSk7Cit9CisKK01hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yCitNYWNoaW5lRnVuY3Rpb246OmFsbG9jYXRlTWVtUmVmc0FycmF5KHVuc2lnbmVkIGxvbmcgTnVtKSB7CisgIHJldHVybiBBbGxvY2F0b3IuQWxsb2NhdGU8TWFjaGluZU1lbU9wZXJhbmQgKj4oTnVtKTsKK30KKworc3RkOjpwYWlyPE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yLCBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvcj4KK01hY2hpbmVGdW5jdGlvbjo6ZXh0cmFjdExvYWRNZW1SZWZzKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgRW5kKSB7CisgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbG9hZCBtZW0gcmVmcy4KKyAgdW5zaWduZWQgTnVtID0gMDsKKyAgZm9yIChNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBJID0gQmVnaW47IEkgIT0gRW5kOyArK0kpCisgICAgaWYgKCgqSSktPmlzTG9hZCgpKQorICAgICAgKytOdW07CisKKyAgLy8gQWxsb2NhdGUgYSBuZXcgYXJyYXkgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIGxvYWQgaW5mb3JtYXRpb24uCisgIE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIFJlc3VsdCA9IGFsbG9jYXRlTWVtUmVmc0FycmF5KE51bSk7CisgIHVuc2lnbmVkIEluZGV4ID0gMDsKKyAgZm9yIChNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBJID0gQmVnaW47IEkgIT0gRW5kOyArK0kpIHsKKyAgICBpZiAoKCpJKS0+aXNMb2FkKCkpIHsKKyAgICAgIGlmICghKCpJKS0+aXNTdG9yZSgpKQorICAgICAgICAvLyBSZXVzZSB0aGUgTU1PLgorICAgICAgICBSZXN1bHRbSW5kZXhdID0gKkk7CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gQ2xvbmUgdGhlIE1NTyBhbmQgdW5zZXQgdGhlIHN0b3JlIGZsYWcuCisgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpKdXN0TG9hZCA9CisgICAgICAgICAgZ2V0TWFjaGluZU1lbU9wZXJhbmQoKCpJKS0+Z2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKkkpLT5nZXRGbGFncygpICYgfk1hY2hpbmVNZW1PcGVyYW5kOjpNT1N0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqSSktPmdldE9mZnNldCgpLCAoKkkpLT5nZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpJKS0+Z2V0QmFzZUFsaWdubWVudCgpKTsKKyAgICAgICAgUmVzdWx0W0luZGV4XSA9IEp1c3RMb2FkOworICAgICAgfQorICAgICAgKytJbmRleDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFJlc3VsdCwgUmVzdWx0ICsgTnVtKTsKK30KKworc3RkOjpwYWlyPE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yLCBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvcj4KK01hY2hpbmVGdW5jdGlvbjo6ZXh0cmFjdFN0b3JlTWVtUmVmcyhNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBFbmQpIHsKKyAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsb2FkIG1lbSByZWZzLgorICB1bnNpZ25lZCBOdW0gPSAwOworICBmb3IgKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIEkgPSBCZWdpbjsgSSAhPSBFbmQ7ICsrSSkKKyAgICBpZiAoKCpJKS0+aXNTdG9yZSgpKQorICAgICAgKytOdW07CisKKyAgLy8gQWxsb2NhdGUgYSBuZXcgYXJyYXkgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIHN0b3JlIGluZm9ybWF0aW9uLgorICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBSZXN1bHQgPSBhbGxvY2F0ZU1lbVJlZnNBcnJheShOdW0pOworICB1bnNpZ25lZCBJbmRleCA9IDA7CisgIGZvciAoTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgSSA9IEJlZ2luOyBJICE9IEVuZDsgKytJKSB7CisgICAgaWYgKCgqSSktPmlzU3RvcmUoKSkgeworICAgICAgaWYgKCEoKkkpLT5pc0xvYWQoKSkKKyAgICAgICAgLy8gUmV1c2UgdGhlIE1NTy4KKyAgICAgICAgUmVzdWx0W0luZGV4XSA9ICpJOworICAgICAgZWxzZSB7CisgICAgICAgIC8vIENsb25lIHRoZSBNTU8gYW5kIHVuc2V0IHRoZSBsb2FkIGZsYWcuCisgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpKdXN0U3RvcmUgPQorICAgICAgICAgIGdldE1hY2hpbmVNZW1PcGVyYW5kKCgqSSktPmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpJKS0+Z2V0RmxhZ3MoKSAmIH5NYWNoaW5lTWVtT3BlcmFuZDo6TU9Mb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqSSktPmdldE9mZnNldCgpLCAoKkkpLT5nZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpJKS0+Z2V0QmFzZUFsaWdubWVudCgpKTsKKyAgICAgICAgUmVzdWx0W0luZGV4XSA9IEp1c3RTdG9yZTsKKyAgICAgIH0KKyAgICAgICsrSW5kZXg7CisgICAgfQorICB9CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihSZXN1bHQsIFJlc3VsdCArIE51bSk7Cit9CisKK3ZvaWQgTWFjaGluZUZ1bmN0aW9uOjpkdW1wKCkgY29uc3QgeworICBwcmludChkYmdzKCkpOworfQorCit2b2lkIE1hY2hpbmVGdW5jdGlvbjo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICIjIE1hY2hpbmUgY29kZSBmb3IgZnVuY3Rpb24gIiA8PCBGbi0+Z2V0TmFtZSgpIDw8ICI6XG4iOworCisgIC8vIFByaW50IEZyYW1lIEluZm9ybWF0aW9uCisgIEZyYW1lSW5mby0+cHJpbnQoKnRoaXMsIE9TKTsKKyAgCisgIC8vIFByaW50IEp1bXBUYWJsZSBJbmZvcm1hdGlvbgorICBpZiAoSnVtcFRhYmxlSW5mbykKKyAgICBKdW1wVGFibGVJbmZvLT5wcmludChPUyk7CisKKyAgLy8gUHJpbnQgQ29uc3RhbnQgUG9vbAorICBDb25zdGFudFBvb2wtPnByaW50KE9TKTsKKyAgCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIAorICBpZiAoUmVnSW5mbyAmJiAhUmVnSW5mby0+bGl2ZWluX2VtcHR5KCkpIHsKKyAgICBPUyA8PCAiRnVuY3Rpb24gTGl2ZSBJbnM6ICI7CisgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpsaXZlaW5faXRlcmF0b3IKKyAgICAgICAgIEkgPSBSZWdJbmZvLT5saXZlaW5fYmVnaW4oKSwgRSA9IFJlZ0luZm8tPmxpdmVpbl9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChUUkkpCisgICAgICAgIE9TIDw8ICIlIiA8PCBUUkktPmdldE5hbWUoSS0+Zmlyc3QpOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiICVwaHlzcmVnIiA8PCBJLT5maXJzdDsKKyAgICAgIAorICAgICAgaWYgKEktPnNlY29uZCkKKyAgICAgICAgT1MgPDwgIiBpbiByZWclIiA8PCBJLT5zZWNvbmQ7CisKKyAgICAgIGlmIChsbHZtOjpuZXh0KEkpICE9IEUpCisgICAgICAgIE9TIDw8ICIsICI7CisgICAgfQorICAgIE9TIDw8ICdcbic7CisgIH0KKyAgaWYgKFJlZ0luZm8gJiYgIVJlZ0luZm8tPmxpdmVvdXRfZW1wdHkoKSkgeworICAgIE9TIDw8ICJGdW5jdGlvbiBMaXZlIE91dHM6ICI7CisgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpsaXZlb3V0X2l0ZXJhdG9yCisgICAgICAgICBJID0gUmVnSW5mby0+bGl2ZW91dF9iZWdpbigpLCBFID0gUmVnSW5mby0+bGl2ZW91dF9lbmQoKTsgSSAhPSBFOyArK0kpeworICAgICAgaWYgKFRSSSkKKyAgICAgICAgT1MgPDwgJyUnIDw8IFRSSS0+Z2V0TmFtZSgqSSk7CisgICAgICBlbHNlCisgICAgICAgIE9TIDw8ICIlcGh5c3JlZyIgPDwgKkk7CisKKyAgICAgIGlmIChsbHZtOjpuZXh0KEkpICE9IEUpCisgICAgICAgIE9TIDw8ICIgIjsKKyAgICB9CisgICAgT1MgPDwgJ1xuJzsKKyAgfQorICAKKyAgZm9yIChjb25zdF9pdGVyYXRvciBCQiA9IGJlZ2luKCksIEUgPSBlbmQoKTsgQkIgIT0gRTsgKytCQikgeworICAgIE9TIDw8ICdcbic7CisgICAgQkItPnByaW50KE9TKTsKKyAgfQorCisgIE9TIDw8ICJcbiMgRW5kIG1hY2hpbmUgY29kZSBmb3IgZnVuY3Rpb24gIiA8PCBGbi0+Z2V0TmFtZSgpIDw8ICIuXG5cbiI7Cit9CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgRE9UR3JhcGhUcmFpdHM8Y29uc3QgTWFjaGluZUZ1bmN0aW9uKj4gOiBwdWJsaWMgRGVmYXVsdERPVEdyYXBoVHJhaXRzIHsKKworICBET1RHcmFwaFRyYWl0cyAoYm9vbCBpc1NpbXBsZT1mYWxzZSkgOiBEZWZhdWx0RE9UR3JhcGhUcmFpdHMoaXNTaW1wbGUpIHt9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0R3JhcGhOYW1lKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqRikgeworICAgICAgcmV0dXJuICJDRkcgZm9yICciICsgRi0+Z2V0RnVuY3Rpb24oKS0+Z2V0TmFtZVN0cigpICsgIicgZnVuY3Rpb24iOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGdldE5vZGVMYWJlbChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpHcmFwaCkgeworICAgICAgaWYgKGlzU2ltcGxlICgpICYmIE5vZGUtPmdldEJhc2ljQmxvY2soKSAmJgorICAgICAgICAgICFOb2RlLT5nZXRCYXNpY0Jsb2NrKCktPmdldE5hbWUoKS5lbXB0eSgpKQorICAgICAgICByZXR1cm4gTm9kZS0+Z2V0QmFzaWNCbG9jaygpLT5nZXROYW1lU3RyKCkgKyAiOiI7CisKKyAgICAgIHN0ZDo6c3RyaW5nIE91dFN0cjsKKyAgICAgIHsKKyAgICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TUyhPdXRTdHIpOworICAgICAgICAKKyAgICAgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICAgICAgT1NTIDw8IE5vZGUtPmdldE51bWJlcigpIDw8ICc6JzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIE5vZGUtPnByaW50KE9TUyk7CisgICAgICB9CisKKyAgICAgIGlmIChPdXRTdHJbMF0gPT0gJ1xuJykgT3V0U3RyLmVyYXNlKE91dFN0ci5iZWdpbigpKTsKKworICAgICAgLy8gUHJvY2VzcyBzdHJpbmcgb3V0cHV0IHRvIG1ha2UgaXQgbmljZXIuLi4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gT3V0U3RyLmxlbmd0aCgpOyArK2kpCisgICAgICAgIGlmIChPdXRTdHJbaV0gPT0gJ1xuJykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWZ0IGp1c3RpZnkKKyAgICAgICAgICBPdXRTdHJbaV0gPSAnXFwnOworICAgICAgICAgIE91dFN0ci5pbnNlcnQoT3V0U3RyLmJlZ2luKCkraSsxLCAnbCcpOworICAgICAgICB9CisgICAgICByZXR1cm4gT3V0U3RyOworICAgIH0KKyAgfTsKK30KKwordm9pZCBNYWNoaW5lRnVuY3Rpb246OnZpZXdDRkcoKSBjb25zdAoreworI2lmbmRlZiBOREVCVUcKKyAgVmlld0dyYXBoKHRoaXMsICJtZiIgKyBnZXRGdW5jdGlvbigpLT5nZXROYW1lU3RyKCkpOworI2Vsc2UKKyAgZXJycygpIDw8ICJNYWNoaW5lRnVuY3Rpb246OnZpZXdDRkcgaXMgb25seSBhdmFpbGFibGUgaW4gZGVidWcgYnVpbGRzIG9uICIKKyAgICAgICAgIDw8ICJzeXN0ZW1zIHdpdGggR3JhcGh2aXogb3IgZ3YhXG4iOworI2VuZGlmIC8vIE5ERUJVRworfQorCit2b2lkIE1hY2hpbmVGdW5jdGlvbjo6dmlld0NGR09ubHkoKSBjb25zdAoreworI2lmbmRlZiBOREVCVUcKKyAgVmlld0dyYXBoKHRoaXMsICJtZiIgKyBnZXRGdW5jdGlvbigpLT5nZXROYW1lU3RyKCksIHRydWUpOworI2Vsc2UKKyAgZXJycygpIDw8ICJNYWNoaW5lRnVuY3Rpb246OnZpZXdDRkdPbmx5IGlzIG9ubHkgYXZhaWxhYmxlIGluIGRlYnVnIGJ1aWxkcyBvbiAiCisgICAgICAgICA8PCAic3lzdGVtcyB3aXRoIEdyYXBodml6IG9yIGd2IVxuIjsKKyNlbmRpZiAvLyBOREVCVUcKK30KKworLy8vIGFkZExpdmVJbiAtIEFkZCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyIGFzIGEgbGl2ZS1pbiB2YWx1ZSBhbmQKKy8vLyBjcmVhdGUgYSBjb3JyZXNwb25kaW5nIHZpcnR1YWwgcmVnaXN0ZXIgZm9yIGl0LgordW5zaWduZWQgTWFjaGluZUZ1bmN0aW9uOjphZGRMaXZlSW4odW5zaWduZWQgUFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSB7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSA9IGdldFJlZ0luZm8oKTsKKyAgdW5zaWduZWQgVlJlZyA9IE1SSS5nZXRMaXZlSW5WaXJ0UmVnKFBSZWcpOworICBpZiAoVlJlZykgeworICAgIGFzc2VydChNUkkuZ2V0UmVnQ2xhc3MoVlJlZykgPT0gUkMgJiYgIlJlZ2lzdGVyIGNsYXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBWUmVnOworICB9CisgIFZSZWcgPSBNUkkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgTVJJLmFkZExpdmVJbihQUmVnLCBWUmVnKTsKKyAgcmV0dXJuIFZSZWc7Cit9CisKKy8vLyBnZXRKVElTeW1ib2wgLSBSZXR1cm4gdGhlIE1DU3ltYm9sIGZvciB0aGUgc3BlY2lmaWVkIG5vbi1lbXB0eSBqdW1wIHRhYmxlLgorLy8vIElmIGlzTGlua2VyUHJpdmF0ZSBpcyBzcGVjaWZpZWQsIGFuICdsJyBsYWJlbCBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIGEKKy8vLyBub3JtYWwgJ0wnIGxhYmVsIGlzIHJldHVybmVkLgorTUNTeW1ib2wgKk1hY2hpbmVGdW5jdGlvbjo6Z2V0SlRJU3ltYm9sKHVuc2lnbmVkIEpUSSwgTUNDb250ZXh0ICZDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNMaW5rZXJQcml2YXRlKSBjb25zdCB7CisgIGFzc2VydChKdW1wVGFibGVJbmZvICYmICJObyBqdW1wIHRhYmxlcyIpOworICAKKyAgYXNzZXJ0KEpUSSA8IEp1bXBUYWJsZUluZm8tPmdldEp1bXBUYWJsZXMoKS5zaXplKCkgJiYgIkludmFsaWQgSlRJISIpOworICBjb25zdCBNQ0FzbUluZm8gJk1BSSA9ICpnZXRUYXJnZXQoKS5nZXRNQ0FzbUluZm8oKTsKKyAgCisgIGNvbnN0IGNoYXIgKlByZWZpeCA9IGlzTGlua2VyUHJpdmF0ZSA/IE1BSS5nZXRMaW5rZXJQcml2YXRlR2xvYmFsUHJlZml4KCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUkuZ2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpOworICBTbWFsbFN0cmluZzw2MD4gTmFtZTsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbShOYW1lKQorICAgIDw8IFByZWZpeCA8PCAiSlRJIiA8PCBnZXRGdW5jdGlvbk51bWJlcigpIDw8ICdfJyA8PCBKVEk7CisgIHJldHVybiBDdHguR2V0T3JDcmVhdGVTeW1ib2woTmFtZS5zdHIoKSk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBNYWNoaW5lRnJhbWVJbmZvIGltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQ3JlYXRlRml4ZWRPYmplY3QgLSBDcmVhdGUgYSBuZXcgb2JqZWN0IGF0IGEgZml4ZWQgbG9jYXRpb24gb24gdGhlIHN0YWNrLgorLy8vIEFsbCBmaXhlZCBvYmplY3RzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBvdGhlciBvYmplY3RzIGFyZSBjcmVhdGVkIGZvcgorLy8vIGVmZmljaWVuY3kuIEJ5IGRlZmF1bHQsIGZpeGVkIG9iamVjdHMgYXJlIGltbXV0YWJsZS4gVGhpcyByZXR1cm5zIGFuCisvLy8gaW5kZXggd2l0aCBhIG5lZ2F0aXZlIHZhbHVlLgorLy8vCitpbnQgTWFjaGluZUZyYW1lSW5mbzo6Q3JlYXRlRml4ZWRPYmplY3QodWludDY0X3QgU2l6ZSwgaW50NjRfdCBTUE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEltbXV0YWJsZSkgeworICBhc3NlcnQoU2l6ZSAhPSAwICYmICJDYW5ub3QgYWxsb2NhdGUgemVybyBzaXplIGZpeGVkIHN0YWNrIG9iamVjdHMhIik7CisgIC8vIFRoZSBhbGlnbm1lbnQgb2YgdGhlIGZyYW1lIGluZGV4IGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gaXRzIG9mZnNldCBmcm9tCisgIC8vIHRoZSBpbmNvbWluZyBmcmFtZSBwb3NpdGlvbi4gIElmIHRoZSBmcmFtZSBvYmplY3QgaXMgYXQgb2Zmc2V0IDMyIGFuZAorICAvLyB0aGUgc3RhY2sgaXMgZ3VhcmFudGVlZCB0byBiZSAxNi1ieXRlIGFsaWduZWQsIHRoZW4gd2Uga25vdyB0aGF0IHRoZQorICAvLyBvYmplY3QgaXMgMTYtYnl0ZSBhbGlnbmVkLgorICB1bnNpZ25lZCBTdGFja0FsaWduID0gVEZJLmdldFN0YWNrQWxpZ25tZW50KCk7CisgIHVuc2lnbmVkIEFsaWduID0gTWluQWxpZ24oU1BPZmZzZXQsIFN0YWNrQWxpZ24pOworICBPYmplY3RzLmluc2VydChPYmplY3RzLmJlZ2luKCksIFN0YWNrT2JqZWN0KFNpemUsIEFsaWduLCBTUE9mZnNldCwgSW1tdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNTUyovZmFsc2UsIGZhbHNlKSk7CisgIHJldHVybiAtKytOdW1GaXhlZE9iamVjdHM7Cit9CisKKworQml0VmVjdG9yCitNYWNoaW5lRnJhbWVJbmZvOjpnZXRQcmlzdGluZVJlZ3MoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3QgeworICBhc3NlcnQoTUJCICYmICJNQkIgbXVzdCBiZSB2YWxpZCIpOworICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gTUJCLT5nZXRQYXJlbnQoKTsKKyAgYXNzZXJ0KE1GICYmICJNQkIgbXVzdCBiZSBwYXJ0IG9mIGEgTWFjaGluZUZ1bmN0aW9uIik7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYtPmdldFRhcmdldCgpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICBCaXRWZWN0b3IgQlYoVFJJLT5nZXROdW1SZWdzKCkpOworCisgIC8vIEJlZm9yZSBDU0kgaXMgY2FsY3VsYXRlZCwgbm8gcmVnaXN0ZXJzIGFyZSBjb25zaWRlcmVkIHByaXN0aW5lLiBUaGV5IGNhbiBiZQorICAvLyBmcmVlbHkgdXNlZCBhbmQgUEVJIHdpbGwgbWFrZSBzdXJlIHRoZXkgYXJlIHNhdmVkLgorICBpZiAoIWlzQ2FsbGVlU2F2ZWRJbmZvVmFsaWQoKSkKKyAgICByZXR1cm4gQlY7CisKKyAgZm9yIChjb25zdCB1bnNpZ25lZCAqQ1NSID0gVFJJLT5nZXRDYWxsZWVTYXZlZFJlZ3MoTUYpOyBDU1IgJiYgKkNTUjsgKytDU1IpCisgICAgQlYuc2V0KCpDU1IpOworCisgIC8vIFRoZSBlbnRyeSBNQkIgYWx3YXlzIGhhcyBhbGwgQ1NScyBwcmlzdGluZS4KKyAgaWYgKE1CQiA9PSAmTUYtPmZyb250KCkpCisgICAgcmV0dXJuIEJWOworCisgIC8vIE9uIG90aGVyIE1CQnMgdGhlIHNhdmVkIENTUnMgYXJlIG5vdCBwcmlzdGluZS4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJID0gZ2V0Q2FsbGVlU2F2ZWRJbmZvKCk7CisgIGZvciAoc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPjo6Y29uc3RfaXRlcmF0b3IgSSA9IENTSS5iZWdpbigpLAorICAgICAgICAgRSA9IENTSS5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgQlYucmVzZXQoSS0+Z2V0UmVnKCkpOworCisgIHJldHVybiBCVjsKK30KKworCit2b2lkIE1hY2hpbmVGcmFtZUluZm86OnByaW50KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIHJhd19vc3RyZWFtICZPUykgY29uc3R7CisgIGlmIChPYmplY3RzLmVtcHR5KCkpIHJldHVybjsKKworICBjb25zdCBUYXJnZXRGcmFtZUluZm8gKkZJID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCk7CisgIGludCBWYWxPZmZzZXQgPSAoRkkgPyBGSS0+Z2V0T2Zmc2V0T2ZMb2NhbEFyZWEoKSA6IDApOworCisgIE9TIDw8ICJGcmFtZSBPYmplY3RzOlxuIjsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT2JqZWN0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgU3RhY2tPYmplY3QgJlNPID0gT2JqZWN0c1tpXTsKKyAgICBPUyA8PCAiICBmaSMiIDw8IChpbnQpKGktTnVtRml4ZWRPYmplY3RzKSA8PCAiOiAiOworICAgIGlmIChTTy5TaXplID09IH4wVUxMKSB7CisgICAgICBPUyA8PCAiZGVhZFxuIjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoU08uU2l6ZSA9PSAwKQorICAgICAgT1MgPDwgInZhcmlhYmxlIHNpemVkIjsKKyAgICBlbHNlCisgICAgICBPUyA8PCAic2l6ZT0iIDw8IFNPLlNpemU7CisgICAgT1MgPDwgIiwgYWxpZ249IiA8PCBTTy5BbGlnbm1lbnQ7CisKKyAgICBpZiAoaSA8IE51bUZpeGVkT2JqZWN0cykKKyAgICAgIE9TIDw8ICIsIGZpeGVkIjsKKyAgICBpZiAoaSA8IE51bUZpeGVkT2JqZWN0cyB8fCBTTy5TUE9mZnNldCAhPSAtMSkgeworICAgICAgaW50NjRfdCBPZmYgPSBTTy5TUE9mZnNldCAtIFZhbE9mZnNldDsKKyAgICAgIE9TIDw8ICIsIGF0IGxvY2F0aW9uIFtTUCI7CisgICAgICBpZiAoT2ZmID4gMCkKKyAgICAgICAgT1MgPDwgIisiIDw8IE9mZjsKKyAgICAgIGVsc2UgaWYgKE9mZiA8IDApCisgICAgICAgIE9TIDw8IE9mZjsKKyAgICAgIE9TIDw8ICJdIjsKKyAgICB9CisgICAgT1MgPDwgIlxuIjsKKyAgfQorfQorCit2b2lkIE1hY2hpbmVGcmFtZUluZm86OmR1bXAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBwcmludChNRiwgZGJncygpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBNYWNoaW5lSnVtcFRhYmxlSW5mbyBpbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGdldEVudHJ5U2l6ZSAtIFJldHVybiB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5IGluIHRoZSBqdW1wIHRhYmxlLgordW5zaWduZWQgTWFjaGluZUp1bXBUYWJsZUluZm86OmdldEVudHJ5U2l6ZShjb25zdCBUYXJnZXREYXRhICZURCkgY29uc3QgeworICAvLyBUaGUgc2l6ZSBvZiBhIGp1bXAgdGFibGUgZW50cnkgaXMgNCBieXRlcyB1bmxlc3MgdGhlIGVudHJ5IGlzIGp1c3QgdGhlCisgIC8vIGFkZHJlc3Mgb2YgYSBibG9jaywgaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgcG9pbnRlciBzaXplLgorICBzd2l0Y2ggKGdldEVudHJ5S2luZCgpKSB7CisgIGNhc2UgTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0Jsb2NrQWRkcmVzczoKKyAgICByZXR1cm4gVEQuZ2V0UG9pbnRlclNpemUoKTsKKyAgY2FzZSBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfR1BSZWwzMkJsb2NrQWRkcmVzczoKKyAgY2FzZSBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfTGFiZWxEaWZmZXJlbmNlMzI6CisgIGNhc2UgTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0N1c3RvbTMyOgorICAgIHJldHVybiA0OworICBjYXNlIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19JbmxpbmU6CisgICAgcmV0dXJuIDA7CisgIH0KKyAgYXNzZXJ0KDAgJiYgIlVua25vd24ganVtcCB0YWJsZSBlbmNvZGluZyEiKTsKKyAgcmV0dXJuIH4wOworfQorCisvLy8gZ2V0RW50cnlBbGlnbm1lbnQgLSBSZXR1cm4gdGhlIGFsaWdubWVudCBvZiBlYWNoIGVudHJ5IGluIHRoZSBqdW1wIHRhYmxlLgordW5zaWduZWQgTWFjaGluZUp1bXBUYWJsZUluZm86OmdldEVudHJ5QWxpZ25tZW50KGNvbnN0IFRhcmdldERhdGEgJlREKSBjb25zdCB7CisgIC8vIFRoZSBhbGlnbm1lbnQgb2YgYSBqdW1wIHRhYmxlIGVudHJ5IGlzIHRoZSBhbGlnbm1lbnQgb2YgaW50MzIgdW5sZXNzIHRoZQorICAvLyBlbnRyeSBpcyBqdXN0IHRoZSBhZGRyZXNzIG9mIGEgYmxvY2ssIGluIHdoaWNoIGNhc2UgaXQgaXMgdGhlIHBvaW50ZXIKKyAgLy8gYWxpZ25tZW50LgorICBzd2l0Y2ggKGdldEVudHJ5S2luZCgpKSB7CisgIGNhc2UgTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0Jsb2NrQWRkcmVzczoKKyAgICByZXR1cm4gVEQuZ2V0UG9pbnRlckFCSUFsaWdubWVudCgpOworICBjYXNlIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19HUFJlbDMyQmxvY2tBZGRyZXNzOgorICBjYXNlIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19MYWJlbERpZmZlcmVuY2UzMjoKKyAgY2FzZSBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfQ3VzdG9tMzI6CisgICAgcmV0dXJuIFRELmdldEFCSUludGVnZXJUeXBlQWxpZ25tZW50KDMyKTsKKyAgY2FzZSBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfSW5saW5lOgorICAgIHJldHVybiAxOworICB9CisgIGFzc2VydCgwICYmICJVbmtub3duIGp1bXAgdGFibGUgZW5jb2RpbmchIik7CisgIHJldHVybiB+MDsKK30KKworLy8vIGNyZWF0ZUp1bXBUYWJsZUluZGV4IC0gQ3JlYXRlIGEgbmV3IGp1bXAgdGFibGUgZW50cnkgaW4gdGhlIGp1bXAgdGFibGUgaW5mby4KKy8vLwordW5zaWduZWQgTWFjaGluZUp1bXBUYWJsZUluZm86OmNyZWF0ZUp1bXBUYWJsZUluZGV4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gJkRlc3RCQnMpIHsKKyAgYXNzZXJ0KCFEZXN0QkJzLmVtcHR5KCkgJiYgIkNhbm5vdCBjcmVhdGUgYW4gZW1wdHkganVtcCB0YWJsZSEiKTsKKyAgSnVtcFRhYmxlcy5wdXNoX2JhY2soTWFjaGluZUp1bXBUYWJsZUVudHJ5KERlc3RCQnMpKTsKKyAgcmV0dXJuIEp1bXBUYWJsZXMuc2l6ZSgpLTE7Cit9CisKKy8vLyBSZXBsYWNlTUJCSW5KdW1wVGFibGVzIC0gSWYgT2xkIGlzIHRoZSB0YXJnZXQgb2YgYW55IGp1bXAgdGFibGVzLCB1cGRhdGUKKy8vLyB0aGUganVtcCB0YWJsZXMgdG8gYnJhbmNoIHRvIE5ldyBpbnN0ZWFkLgorYm9vbCBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6UmVwbGFjZU1CQkluSnVtcFRhYmxlcyhNYWNoaW5lQmFzaWNCbG9jayAqT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3KSB7CisgIGFzc2VydChPbGQgIT0gTmV3ICYmICJOb3QgbWFraW5nIGEgY2hhbmdlPyIpOworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBKdW1wVGFibGVzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgUmVwbGFjZU1CQkluSnVtcFRhYmxlKGksIE9sZCwgTmV3KTsKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vLyBSZXBsYWNlTUJCSW5KdW1wVGFibGUgLSBJZiBPbGQgaXMgYSB0YXJnZXQgb2YgdGhlIGp1bXAgdGFibGVzLCB1cGRhdGUKKy8vLyB0aGUganVtcCB0YWJsZSB0byBicmFuY2ggdG8gTmV3IGluc3RlYWQuCitib29sIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpSZXBsYWNlTUJCSW5KdW1wVGFibGUodW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk5ldykgeworICBhc3NlcnQoT2xkICE9IE5ldyAmJiAiTm90IG1ha2luZyBhIGNoYW5nZT8iKTsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIE1hY2hpbmVKdW1wVGFibGVFbnRyeSAmSlRFID0gSnVtcFRhYmxlc1tJZHhdOworICBmb3IgKHNpemVfdCBqID0gMCwgZSA9IEpURS5NQkJzLnNpemUoKTsgaiAhPSBlOyArK2opCisgICAgaWYgKEpURS5NQkJzW2pdID09IE9sZCkgeworICAgICAgSlRFLk1CQnNbal0gPSBOZXc7CisgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICB9CisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCit2b2lkIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgaWYgKEp1bXBUYWJsZXMuZW1wdHkoKSkgcmV0dXJuOworCisgIE9TIDw8ICJKdW1wIFRhYmxlczpcbiI7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEp1bXBUYWJsZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE9TIDw8ICIgIGp0IyIgPDwgaSA8PCAiOiAiOworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGYgPSBKdW1wVGFibGVzW2ldLk1CQnMuc2l6ZSgpOyBqICE9IGY7ICsraikKKyAgICAgIE9TIDw8ICIgQkIjIiA8PCBKdW1wVGFibGVzW2ldLk1CQnNbal0tPmdldE51bWJlcigpOworICB9CisKKyAgT1MgPDwgJ1xuJzsKK30KKwordm9pZCBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6ZHVtcCgpIGNvbnN0IHsgcHJpbnQoZGJncygpKTsgfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTWFjaGluZUNvbnN0YW50UG9vbCBpbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY29uc3QgVHlwZSAqTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5OjpnZXRUeXBlKCkgY29uc3QgeworICBpZiAoaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSkKKyAgICByZXR1cm4gVmFsLk1hY2hpbmVDUFZhbC0+Z2V0VHlwZSgpOworICByZXR1cm4gVmFsLkNvbnN0VmFsLT5nZXRUeXBlKCk7Cit9CisKKwordW5zaWduZWQgTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5OjpnZXRSZWxvY2F0aW9uSW5mbygpIGNvbnN0IHsKKyAgaWYgKGlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkpCisgICAgcmV0dXJuIFZhbC5NYWNoaW5lQ1BWYWwtPmdldFJlbG9jYXRpb25JbmZvKCk7CisgIHJldHVybiBWYWwuQ29uc3RWYWwtPmdldFJlbG9jYXRpb25JbmZvKCk7Cit9CisKK01hY2hpbmVDb25zdGFudFBvb2w6On5NYWNoaW5lQ29uc3RhbnRQb29sKCkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ29uc3RhbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKENvbnN0YW50c1tpXS5pc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSgpKQorICAgICAgZGVsZXRlIENvbnN0YW50c1tpXS5WYWwuTWFjaGluZUNQVmFsOworfQorCisvLy8gQ2FuU2hhcmVDb25zdGFudFBvb2xFbnRyeSAtIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gdHdvIGNvbnN0YW50cworLy8vIGNhbiBiZSBhbGxvY2F0ZWQgdGhlIHNhbWUgY29uc3RhbnQgcG9vbCBlbnRyeS4KK3N0YXRpYyBib29sIENhblNoYXJlQ29uc3RhbnRQb29sRW50cnkoY29uc3QgQ29uc3RhbnQgKkEsIGNvbnN0IENvbnN0YW50ICpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICAvLyBIYW5kbGUgdGhlIHRyaXZpYWwgY2FzZSBxdWlja2x5LgorICBpZiAoQSA9PSBCKSByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiB0aGV5IGhhdmUgdGhlIHNhbWUgdHlwZSBidXQgd2VyZW4ndCB0aGUgc2FtZSBjb25zdGFudCwgcXVpY2tseQorICAvLyByZWplY3QgdGhlbS4KKyAgaWYgKEEtPmdldFR5cGUoKSA9PSBCLT5nZXRUeXBlKCkpIHJldHVybiBmYWxzZTsKKworICAvLyBGb3Igbm93LCBvbmx5IHN1cHBvcnQgY29uc3RhbnRzIHdpdGggdGhlIHNhbWUgc2l6ZS4KKyAgaWYgKFRELT5nZXRUeXBlU3RvcmVTaXplKEEtPmdldFR5cGUoKSkgIT0gVEQtPmdldFR5cGVTdG9yZVNpemUoQi0+Z2V0VHlwZSgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBhbmQgYW4gaW50ZWdlciB2YWx1ZSBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLAorICAvLyB0aGV5IGNhbiBzaGFyZSBhIGNvbnN0YW50LXBvb2wgZW50cnkuCisgIGlmIChjb25zdCBDb25zdGFudEZQICpBRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQPihBKSkKKyAgICBpZiAoY29uc3QgQ29uc3RhbnRJbnQgKkJJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEIpKQorICAgICAgcmV0dXJuIEFGUC0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpID09IEJJLT5nZXRWYWx1ZSgpOworICBpZiAoY29uc3QgQ29uc3RhbnRGUCAqQkZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oQikpCisgICAgaWYgKGNvbnN0IENvbnN0YW50SW50ICpBSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihBKSkKKyAgICAgIHJldHVybiBCRlAtPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKSA9PSBBSS0+Z2V0VmFsdWUoKTsKKworICAvLyBUd28gdmVjdG9ycyBjYW4gc2hhcmUgYW4gZW50cnkgaWYgZWFjaCBwYWlyIG9mIGNvcnJlc3BvbmRpbmcKKyAgLy8gZWxlbWVudHMgY291bGQuCisgIGlmIChjb25zdCBDb25zdGFudFZlY3RvciAqQVYgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oQSkpCisgICAgaWYgKGNvbnN0IENvbnN0YW50VmVjdG9yICpCViA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihCKSkgeworICAgICAgaWYgKEFWLT5nZXRUeXBlKCktPmdldE51bUVsZW1lbnRzKCkgIT0gQlYtPmdldFR5cGUoKS0+Z2V0TnVtRWxlbWVudHMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFWLT5nZXRUeXBlKCktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoIUNhblNoYXJlQ29uc3RhbnRQb29sRW50cnkoQVYtPmdldE9wZXJhbmQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVi0+Z2V0T3BlcmFuZChpKSwgVEQpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvLyBUT0RPOiBIYW5kbGUgb3RoZXIgY2FzZXMuCisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gZ2V0Q29uc3RhbnRQb29sSW5kZXggLSBDcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wgb3IgcmV0dXJuCisvLy8gYW4gZXhpc3Rpbmcgb25lLiAgVXNlciBtdXN0IHNwZWNpZnkgdGhlIGxvZzIgb2YgdGhlIG1pbmltdW0gcmVxdWlyZWQKKy8vLyBhbGlnbm1lbnQgZm9yIHRoZSBvYmplY3QuCisvLy8KK3Vuc2lnbmVkIE1hY2hpbmVDb25zdGFudFBvb2w6OmdldENvbnN0YW50UG9vbEluZGV4KGNvbnN0IENvbnN0YW50ICpDLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCkgeworICBhc3NlcnQoQWxpZ25tZW50ICYmICJBbGlnbm1lbnQgbXVzdCBiZSBzcGVjaWZpZWQhIik7CisgIGlmIChBbGlnbm1lbnQgPiBQb29sQWxpZ25tZW50KSBQb29sQWxpZ25tZW50ID0gQWxpZ25tZW50OworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBjb25zdGFudC4KKyAgLy8KKyAgLy8gRklYTUUsIHRoaXMgY291bGQgYmUgbWFkZSBtdWNoIG1vcmUgZWZmaWNpZW50IGZvciBsYXJnZSBjb25zdGFudCBwb29scy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvbnN0YW50cy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmICghQ29uc3RhbnRzW2ldLmlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkgJiYKKyAgICAgICAgQ2FuU2hhcmVDb25zdGFudFBvb2xFbnRyeShDb25zdGFudHNbaV0uVmFsLkNvbnN0VmFsLCBDLCBURCkpIHsKKyAgICAgIGlmICgodW5zaWduZWQpQ29uc3RhbnRzW2ldLmdldEFsaWdubWVudCgpIDwgQWxpZ25tZW50KQorICAgICAgICBDb25zdGFudHNbaV0uQWxpZ25tZW50ID0gQWxpZ25tZW50OworICAgICAgcmV0dXJuIGk7CisgICAgfQorICAKKyAgQ29uc3RhbnRzLnB1c2hfYmFjayhNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoQywgQWxpZ25tZW50KSk7CisgIHJldHVybiBDb25zdGFudHMuc2l6ZSgpLTE7Cit9CisKK3Vuc2lnbmVkIE1hY2hpbmVDb25zdGFudFBvb2w6OmdldENvbnN0YW50UG9vbEluZGV4KE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCkgeworICBhc3NlcnQoQWxpZ25tZW50ICYmICJBbGlnbm1lbnQgbXVzdCBiZSBzcGVjaWZpZWQhIik7CisgIGlmIChBbGlnbm1lbnQgPiBQb29sQWxpZ25tZW50KSBQb29sQWxpZ25tZW50ID0gQWxpZ25tZW50OworICAKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGNvbnN0YW50LgorICAvLworICAvLyBGSVhNRSwgdGhpcyBjb3VsZCBiZSBtYWRlIG11Y2ggbW9yZSBlZmZpY2llbnQgZm9yIGxhcmdlIGNvbnN0YW50IHBvb2xzLgorICBpbnQgSWR4ID0gVi0+Z2V0RXhpc3RpbmdNYWNoaW5lQ1BWYWx1ZSh0aGlzLCBBbGlnbm1lbnQpOworICBpZiAoSWR4ICE9IC0xKQorICAgIHJldHVybiAodW5zaWduZWQpSWR4OworCisgIENvbnN0YW50cy5wdXNoX2JhY2soTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KFYsIEFsaWdubWVudCkpOworICByZXR1cm4gQ29uc3RhbnRzLnNpemUoKS0xOworfQorCit2b2lkIE1hY2hpbmVDb25zdGFudFBvb2w6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBpZiAoQ29uc3RhbnRzLmVtcHR5KCkpIHJldHVybjsKKworICBPUyA8PCAiQ29uc3RhbnQgUG9vbDpcbiI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDb25zdGFudHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE9TIDw8ICIgIGNwIyIgPDwgaSA8PCAiOiAiOworICAgIGlmIChDb25zdGFudHNbaV0uaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSkKKyAgICAgIENvbnN0YW50c1tpXS5WYWwuTWFjaGluZUNQVmFsLT5wcmludChPUyk7CisgICAgZWxzZQorICAgICAgT1MgPDwgKihWYWx1ZSopQ29uc3RhbnRzW2ldLlZhbC5Db25zdFZhbDsKKyAgICBPUyA8PCAiLCBhbGlnbj0iIDw8IENvbnN0YW50c1tpXS5nZXRBbGlnbm1lbnQoKTsKKyAgICBPUyA8PCAiXG4iOworICB9Cit9CisKK3ZvaWQgTWFjaGluZUNvbnN0YW50UG9vbDo6ZHVtcCgpIGNvbnN0IHsgcHJpbnQoZGJncygpKTsgfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uQW5hbHlzaXMuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uQW5hbHlzaXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODRiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25BbmFseXNpcy5jcHAKQEAgLTAsMCArMSw2MiBAQAorLy89PT0tLSBNYWNoaW5lRnVuY3Rpb25BbmFseXNpcy5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBNYWNoaW5lRnVuY3Rpb25BbmFseXNpcyBtZW1iZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gUmVnaXN0ZXIgdGhpcyBwYXNzIHdpdGggUGFzc0luZm8gZGlyZWN0bHkgdG8gYXZvaWQgaGF2aW5nIHRvIGRlZmluZQorLy8gYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorc3RhdGljIFBhc3NJbmZvCitYKCJNYWNoaW5lIEZ1bmN0aW9uIEFuYWx5c2lzIiwgIm1hY2hpbmUtZnVuY3Rpb24tYW5hbHlzaXMiLAorICAgJk1hY2hpbmVGdW5jdGlvbkFuYWx5c2lzOjpJRCwgMCwKKyAgLypDRkdPbmx5PSovZmFsc2UsIC8qaXNfYW5hbHlzaXM9Ki90cnVlKTsKKworY2hhciBNYWNoaW5lRnVuY3Rpb25BbmFseXNpczo6SUQgPSAwOworCitNYWNoaW5lRnVuY3Rpb25BbmFseXNpczo6TWFjaGluZUZ1bmN0aW9uQW5hbHlzaXMoY29uc3QgVGFyZ2V0TWFjaGluZSAmdG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT0wpIDoKKyAgRnVuY3Rpb25QYXNzKElEKSwgVE0odG0pLCBPcHRMZXZlbChPTCksIE1GKDApIHsKK30KKworTWFjaGluZUZ1bmN0aW9uQW5hbHlzaXM6On5NYWNoaW5lRnVuY3Rpb25BbmFseXNpcygpIHsKKyAgcmVsZWFzZU1lbW9yeSgpOworICBhc3NlcnQoIU1GICYmICJNYWNoaW5lRnVuY3Rpb25BbmFseXNpcyBsZWZ0IGluaXRpYWxpemVkISIpOworfQorCit2b2lkIE1hY2hpbmVGdW5jdGlvbkFuYWx5c2lzOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lTW9kdWxlSW5mbz4oKTsKK30KKworYm9vbCBNYWNoaW5lRnVuY3Rpb25BbmFseXNpczo6ZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJk0pIHsKKyAgTWFjaGluZU1vZHVsZUluZm8gKk1NSSA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8TWFjaGluZU1vZHVsZUluZm8+KCk7CisgIGFzc2VydChNTUkgJiYgIk1NSSBub3QgYXJvdW5kIHlldD8/Iik7CisgIE1NSS0+c2V0TW9kdWxlKCZNKTsKKyAgTmV4dEZuTnVtID0gMDsKKyAgcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgTWFjaGluZUZ1bmN0aW9uQW5hbHlzaXM6OnJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgYXNzZXJ0KCFNRiAmJiAiTWFjaGluZUZ1bmN0aW9uQW5hbHlzaXMgYWxyZWFkeSBpbml0aWFsaXplZCEiKTsKKyAgTUYgPSBuZXcgTWFjaGluZUZ1bmN0aW9uKCZGLCBUTSwgTmV4dEZuTnVtKyssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmFseXNpczxNYWNoaW5lTW9kdWxlSW5mbz4oKSk7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNYWNoaW5lRnVuY3Rpb25BbmFseXNpczo6cmVsZWFzZU1lbW9yeSgpIHsKKyAgZGVsZXRlIE1GOworICBNRiA9IDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTQ5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmNwcApAQCAtMCwwICsxLDU2IEBACisvLz09PS0tIE1hY2hpbmVGdW5jdGlvblBhc3MuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIE1hY2hpbmVGdW5jdGlvblBhc3MgbWVtYmVycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25BbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1Bhc3MgKk1hY2hpbmVGdW5jdGlvblBhc3M6OmNyZWF0ZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3QgeworICByZXR1cm4gY3JlYXRlTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3MoTywgQmFubmVyKTsKK30KKworYm9vbCBNYWNoaW5lRnVuY3Rpb25QYXNzOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgIC8vIERvIG5vdCBjb2RlZ2VuIGFueSAnYXZhaWxhYmxlX2V4dGVybmFsbHknIGZ1bmN0aW9ucyBhdCBhbGwsIHRoZXkgaGF2ZQorICAvLyBkZWZpbml0aW9ucyBvdXRzaWRlIHRoZSB0cmFuc2xhdGlvbiB1bml0LgorICBpZiAoRi5oYXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gZ2V0QW5hbHlzaXM8TWFjaGluZUZ1bmN0aW9uQW5hbHlzaXM+KCkuZ2V0TUYoKTsKKyAgcmV0dXJuIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1GKTsKK30KKwordm9pZCBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVGdW5jdGlvbkFuYWx5c2lzPigpOworICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZUZ1bmN0aW9uQW5hbHlzaXM+KCk7CisKKyAgLy8gTWFjaGluZUZ1bmN0aW9uUGFzcyBwcmVzZXJ2ZXMgYWxsIExMVk0gSVIgcGFzc2VzLCBidXQgdGhlcmUncyBubworICAvLyBoaWdoLWxldmVsIHdheSB0byBleHByZXNzIHRoaXMuIEluc3RlYWQsIGp1c3QgbGlzdCBhIGJ1bmNoIG9mCisgIC8vIHBhc3NlcyBleHBsaWNpdGx5LiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgc2V0UHJlc2VydmVzQ0ZHLAorICAvLyBiZWNhdXNlIENvZGVHZW4gb3ZlcmxvYWRzIHRoYXQgdG8gbWVhbiBwcmVzZXJ2aW5nIHRoZSBNYWNoaW5lQmFzaWNCbG9jaworICAvLyBDRkcgaW4gYWRkaXRpb24gdG8gdGhlIExMVk0gSVIgQ0ZHLgorICBBVS5hZGRQcmVzZXJ2ZWQ8QWxpYXNBbmFseXNpcz4oKTsKKyAgQVUuYWRkUHJlc2VydmVkKCJzY2FsYXItZXZvbHV0aW9uIik7CisgIEFVLmFkZFByZXNlcnZlZCgiaXYtdXNlcnMiKTsKKyAgQVUuYWRkUHJlc2VydmVkKCJtZW1kZXAiKTsKKyAgQVUuYWRkUHJlc2VydmVkKCJsaXZlLXZhbHVlcyIpOworICBBVS5hZGRQcmVzZXJ2ZWQoImRvbXRyZWUiKTsKKyAgQVUuYWRkUHJlc2VydmVkKCJkb21mcm9udGllciIpOworICBBVS5hZGRQcmVzZXJ2ZWQoImxvb3BzIik7CisgIEFVLmFkZFByZXNlcnZlZCgibGRhIik7CisKKyAgRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblByaW50ZXJQYXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblByaW50ZXJQYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWFhNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3MuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8vPT09LS0gTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3MuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3MgaW1wbGVtZW50YXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisvLy8gTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3MgLSBUaGlzIGlzIGEgcGFzcyB0byBkdW1wIHRoZSBJUiBvZiBhCisvLy8gTWFjaGluZUZ1bmN0aW9uLgorLy8vCitzdHJ1Y3QgTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3MgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIHN0YXRpYyBjaGFyIElEOworCisgIHJhd19vc3RyZWFtICZPUzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQmFubmVyOworCisgIE1hY2hpbmVGdW5jdGlvblByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZvcywgY29uc3Qgc3RkOjpzdHJpbmcgJmJhbm5lcikgCisgICAgICA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpLCBPUyhvcyksIEJhbm5lcihiYW5uZXIpIHt9CisKKyAgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7IHJldHVybiAiTWFjaGluZUZ1bmN0aW9uIFByaW50ZXIiOyB9CisKKyAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgfQorCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICAgIE9TIDw8ICIjICIgPDwgQmFubmVyIDw8ICI6XG4iOworICAgIE1GLnByaW50KE9TKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NoYXIgTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3M6OklEID0gMDsKK30KKworbmFtZXNwYWNlIGxsdm0geworLy8vIFJldHVybnMgYSBuZXdseS1jcmVhdGVkIE1hY2hpbmVGdW5jdGlvbiBQcmludGVyIHBhc3MuIFRoZQorLy8vIGRlZmF1bHQgYmFubmVyIGlzIGVtcHR5LgorLy8vCitNYWNoaW5lRnVuY3Rpb25QYXNzICpjcmVhdGVNYWNoaW5lRnVuY3Rpb25QcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKXsKKyAgcmV0dXJuIG5ldyBNYWNoaW5lRnVuY3Rpb25QcmludGVyUGFzcyhPUywgQmFubmVyKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUluc3RyLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVJbnN0ci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwMmE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVJbnN0ci5jcHAKQEAgLTAsMCArMSwxNDkyIEBACisvLz09PS0tIGxpYi9Db2RlR2VuL01hY2hpbmVJbnN0ci5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1ldGhvZHMgY29tbW9uIHRvIGFsbCBtYWNoaW5lIGluc3RydWN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW5saW5lQXNtLmgiCisjaW5jbHVkZSAibGx2bS9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1dyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckRlc2MuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RlYnVnSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0xlYWtEZXRlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYWNoaW5lT3BlcmFuZCBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEFkZFJlZ09wZXJhbmRUb1JlZ0luZm8gLSBBZGQgdGhpcyByZWdpc3RlciBvcGVyYW5kIHRvIHRoZSBzcGVjaWZpZWQKKy8vLyBNYWNoaW5lUmVnaXN0ZXJJbmZvLiAgSWYgaXQgaXMgbnVsbCwgdGhlbiB0aGUgbmV4dC9wcmV2IGZpZWxkcyBzaG91bGQgYmUKKy8vLyBleHBsaWNpdGx5IG51bGxlZCBvdXQuCit2b2lkIE1hY2hpbmVPcGVyYW5kOjpBZGRSZWdPcGVyYW5kVG9SZWdJbmZvKE1hY2hpbmVSZWdpc3RlckluZm8gKlJlZ0luZm8pIHsKKyAgYXNzZXJ0KGlzUmVnKCkgJiYgIkNhbiBvbmx5IGFkZCByZWcgb3BlcmFuZCB0byB1c2UgbGlzdHMiKTsKKyAgCisgIC8vIElmIHRoZSByZWdpbmZvIHBvaW50ZXIgaXMgbnVsbCwganVzdCBleHBsaWNpdGx5IG51bGwgb3V0IG9yIG5leHQvcHJldgorICAvLyBwb2ludGVycywgdG8gZW5zdXJlIHRoZXkgYXJlIG5vdCBnYXJiYWdlLgorICBpZiAoUmVnSW5mbyA9PSAwKSB7CisgICAgQ29udGVudHMuUmVnLlByZXYgPSAwOworICAgIENvbnRlbnRzLlJlZy5OZXh0ID0gMDsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIE90aGVyd2lzZSwgYWRkIHRoaXMgb3BlcmFuZCB0byB0aGUgaGVhZCBvZiB0aGUgcmVnaXN0ZXJzIHVzZS9kZWYgbGlzdC4KKyAgTWFjaGluZU9wZXJhbmQgKipIZWFkID0gJlJlZ0luZm8tPmdldFJlZ1VzZURlZkxpc3RIZWFkKGdldFJlZygpKTsKKyAgCisgIC8vIEZvciBTU0EgdmFsdWVzLCB3ZSBwcmVmZXIgdG8ga2VlcCB0aGUgZGVmaW5pdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpc3QuCisgIC8vIHdlIGRvIHRoaXMgYnkgc2tpcHBpbmcgb3ZlciB0aGUgZGVmaW5pdGlvbiBpZiBpdCBpcyBhdCB0aGUgaGVhZCBvZiB0aGUKKyAgLy8gbGlzdC4KKyAgaWYgKCpIZWFkICYmICgqSGVhZCktPmlzRGVmKCkpCisgICAgSGVhZCA9ICYoKkhlYWQpLT5Db250ZW50cy5SZWcuTmV4dDsKKyAgCisgIENvbnRlbnRzLlJlZy5OZXh0ID0gKkhlYWQ7CisgIGlmIChDb250ZW50cy5SZWcuTmV4dCkgeworICAgIGFzc2VydChnZXRSZWcoKSA9PSBDb250ZW50cy5SZWcuTmV4dC0+Z2V0UmVnKCkgJiYKKyAgICAgICAgICAgIkRpZmZlcmVudCByZWdzIG9uIHRoZSBzYW1lIGxpc3QhIik7CisgICAgQ29udGVudHMuUmVnLk5leHQtPkNvbnRlbnRzLlJlZy5QcmV2ID0gJkNvbnRlbnRzLlJlZy5OZXh0OworICB9CisgIAorICBDb250ZW50cy5SZWcuUHJldiA9IEhlYWQ7CisgICpIZWFkID0gdGhpczsKK30KKworLy8vIFJlbW92ZVJlZ09wZXJhbmRGcm9tUmVnSW5mbyAtIFJlbW92ZSB0aGlzIHJlZ2lzdGVyIG9wZXJhbmQgZnJvbSB0aGUKKy8vLyBNYWNoaW5lUmVnaXN0ZXJJbmZvIGl0IGlzIGxpbmtlZCB3aXRoLgordm9pZCBNYWNoaW5lT3BlcmFuZDo6UmVtb3ZlUmVnT3BlcmFuZEZyb21SZWdJbmZvKCkgeworICBhc3NlcnQoaXNPblJlZ1VzZUxpc3QoKSAmJiAiUmVnIG9wZXJhbmQgaXMgbm90IG9uIGEgdXNlIGxpc3QiKTsKKyAgLy8gVW5saW5rIHRoaXMgZnJvbSB0aGUgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIG9wZXJhbmRzLgorICBNYWNoaW5lT3BlcmFuZCAqTmV4dE9wID0gQ29udGVudHMuUmVnLk5leHQ7CisgICpDb250ZW50cy5SZWcuUHJldiA9IE5leHRPcDsgCisgIGlmIChOZXh0T3ApIHsKKyAgICBhc3NlcnQoTmV4dE9wLT5nZXRSZWcoKSA9PSBnZXRSZWcoKSAmJiAiQ29ycnVwdCByZWcgdXNlL2RlZiBjaGFpbiEiKTsKKyAgICBOZXh0T3AtPkNvbnRlbnRzLlJlZy5QcmV2ID0gQ29udGVudHMuUmVnLlByZXY7CisgIH0KKyAgQ29udGVudHMuUmVnLlByZXYgPSAwOworICBDb250ZW50cy5SZWcuTmV4dCA9IDA7Cit9CisKK3ZvaWQgTWFjaGluZU9wZXJhbmQ6OnNldFJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgaWYgKGdldFJlZygpID09IFJlZykgcmV0dXJuOyAvLyBObyBjaGFuZ2UuCisgIAorICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gY2hhbmdlIHRoZSByZWdpc3Rlci4gIElmIHRoaXMgb3BlcmFuZCBpcyBlbWJlZGRlZAorICAvLyBpbnRvIGEgbWFjaGluZSBmdW5jdGlvbiwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG9sZCBhbmQgbmV3IHJlZ2lzdGVyJ3MKKyAgLy8gdXNlL2RlZiBsaXN0cy4KKyAgaWYgKE1hY2hpbmVJbnN0ciAqTUkgPSBnZXRQYXJlbnQoKSkKKyAgICBpZiAoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1JLT5nZXRQYXJlbnQoKSkKKyAgICAgIGlmIChNYWNoaW5lRnVuY3Rpb24gKk1GID0gTUJCLT5nZXRQYXJlbnQoKSkgeworICAgICAgICBSZW1vdmVSZWdPcGVyYW5kRnJvbVJlZ0luZm8oKTsKKyAgICAgICAgQ29udGVudHMuUmVnLlJlZ05vID0gUmVnOworICAgICAgICBBZGRSZWdPcGVyYW5kVG9SZWdJbmZvKCZNRi0+Z2V0UmVnSW5mbygpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgICAKKyAgLy8gT3RoZXJ3aXNlLCBqdXN0IGNoYW5nZSB0aGUgcmVnaXN0ZXIsIG5vIHByb2JsZW0uICA6KQorICBDb250ZW50cy5SZWcuUmVnTm8gPSBSZWc7Cit9CisKK3ZvaWQgTWFjaGluZU9wZXJhbmQ6OnN1YnN0VmlydFJlZyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgeworICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWcpKTsKKyAgaWYgKFN1YklkeCAmJiBnZXRTdWJSZWcoKSkKKyAgICBTdWJJZHggPSBUUkkuY29tcG9zZVN1YlJlZ0luZGljZXMoU3ViSWR4LCBnZXRTdWJSZWcoKSk7CisgIHNldFJlZyhSZWcpOworICBpZiAoU3ViSWR4KQorICAgIHNldFN1YlJlZyhTdWJJZHgpOworfQorCit2b2lkIE1hY2hpbmVPcGVyYW5kOjpzdWJzdFBoeXNSZWcodW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgeworICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSk7CisgIGlmIChnZXRTdWJSZWcoKSkgeworICAgIFJlZyA9IFRSSS5nZXRTdWJSZWcoUmVnLCBnZXRTdWJSZWcoKSk7CisgICAgYXNzZXJ0KFJlZyAmJiAiSW52YWxpZCBTdWJSZWcgZm9yIHBoeXNpY2FsIHJlZ2lzdGVyIik7CisgICAgc2V0U3ViUmVnKDApOworICB9CisgIHNldFJlZyhSZWcpOworfQorCisvLy8gQ2hhbmdlVG9JbW1lZGlhdGUgLSBSZXBsYWNlIHRoaXMgb3BlcmFuZCB3aXRoIGEgbmV3IGltbWVkaWF0ZSBvcGVyYW5kIG9mCisvLy8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmIGFuIG9wZXJhbmQgaXMga25vd24gdG8gYmUgYW4gaW1tZWRpYXRlIGFscmVhZHksCisvLy8gdGhlIHNldEltbSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQuCit2b2lkIE1hY2hpbmVPcGVyYW5kOjpDaGFuZ2VUb0ltbWVkaWF0ZShpbnQ2NF90IEltbVZhbCkgeworICAvLyBJZiB0aGlzIG9wZXJhbmQgaXMgY3VycmVudGx5IGEgcmVnaXN0ZXIgb3BlcmFuZCwgYW5kIGlmIHRoaXMgaXMgaW4gYQorICAvLyBmdW5jdGlvbiwgZGVyZWdpc3RlciB0aGUgb3BlcmFuZCBmcm9tIHRoZSByZWdpc3RlcidzIHVzZS9kZWYgbGlzdC4KKyAgaWYgKGlzUmVnKCkgJiYgZ2V0UGFyZW50KCkgJiYgZ2V0UGFyZW50KCktPmdldFBhcmVudCgpICYmCisgICAgICBnZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpKQorICAgIFJlbW92ZVJlZ09wZXJhbmRGcm9tUmVnSW5mbygpOworICAKKyAgT3BLaW5kID0gTU9fSW1tZWRpYXRlOworICBDb250ZW50cy5JbW1WYWwgPSBJbW1WYWw7Cit9CisKKy8vLyBDaGFuZ2VUb1JlZ2lzdGVyIC0gUmVwbGFjZSB0aGlzIG9wZXJhbmQgd2l0aCBhIG5ldyByZWdpc3RlciBvcGVyYW5kIG9mCisvLy8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmIGFuIG9wZXJhbmQgaXMga25vd24gdG8gYmUgYW4gcmVnaXN0ZXIgYWxyZWFkeSwKKy8vLyB0aGUgc2V0UmVnIG1ldGhvZCBzaG91bGQgYmUgdXNlZC4KK3ZvaWQgTWFjaGluZU9wZXJhbmQ6OkNoYW5nZVRvUmVnaXN0ZXIodW5zaWduZWQgUmVnLCBib29sIGlzRGVmLCBib29sIGlzSW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzS2lsbCwgYm9vbCBpc0RlYWQsIGJvb2wgaXNVbmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RlYnVnKSB7CisgIC8vIElmIHRoaXMgb3BlcmFuZCBpcyBhbHJlYWR5IGEgcmVnaXN0ZXIgb3BlcmFuZCwgdXNlIHNldFJlZyB0byB1cGRhdGUgdGhlIAorICAvLyByZWdpc3RlcidzIHVzZS9kZWYgbGlzdHMuCisgIGlmIChpc1JlZygpKSB7CisgICAgYXNzZXJ0KCFpc0Vhcmx5Q2xvYmJlcigpKTsKKyAgICBzZXRSZWcoUmVnKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPdGhlcndpc2UsIGNoYW5nZSB0aGlzIHRvIGEgcmVnaXN0ZXIgYW5kIHNldCB0aGUgcmVnIy4KKyAgICBPcEtpbmQgPSBNT19SZWdpc3RlcjsKKyAgICBDb250ZW50cy5SZWcuUmVnTm8gPSBSZWc7CisKKyAgICAvLyBJZiB0aGlzIG9wZXJhbmQgaXMgZW1iZWRkZWQgaW4gYSBmdW5jdGlvbiwgYWRkIHRoZSBvcGVyYW5kIHRvIHRoZQorICAgIC8vIHJlZ2lzdGVyJ3MgdXNlL2RlZiBsaXN0LgorICAgIGlmIChNYWNoaW5lSW5zdHIgKk1JID0gZ2V0UGFyZW50KCkpCisgICAgICBpZiAoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1JLT5nZXRQYXJlbnQoKSkKKyAgICAgICAgaWYgKE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBNQkItPmdldFBhcmVudCgpKQorICAgICAgICAgIEFkZFJlZ09wZXJhbmRUb1JlZ0luZm8oJk1GLT5nZXRSZWdJbmZvKCkpOworICB9CisKKyAgSXNEZWYgPSBpc0RlZjsKKyAgSXNJbXAgPSBpc0ltcDsKKyAgSXNLaWxsID0gaXNLaWxsOworICBJc0RlYWQgPSBpc0RlYWQ7CisgIElzVW5kZWYgPSBpc1VuZGVmOworICBJc0Vhcmx5Q2xvYmJlciA9IGZhbHNlOworICBJc0RlYnVnID0gaXNEZWJ1ZzsKKyAgU3ViUmVnID0gMDsKK30KKworLy8vIGlzSWRlbnRpY2FsVG8gLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wZXJhbmQgaXMgaWRlbnRpY2FsIHRvIHRoZSBzcGVjaWZpZWQKKy8vLyBvcGVyYW5kLgorYm9vbCBNYWNoaW5lT3BlcmFuZDo6aXNJZGVudGljYWxUbyhjb25zdCBNYWNoaW5lT3BlcmFuZCAmT3RoZXIpIGNvbnN0IHsKKyAgaWYgKGdldFR5cGUoKSAhPSBPdGhlci5nZXRUeXBlKCkgfHwKKyAgICAgIGdldFRhcmdldEZsYWdzKCkgIT0gT3RoZXIuZ2V0VGFyZ2V0RmxhZ3MoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBzd2l0Y2ggKGdldFR5cGUoKSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbnJlY29nbml6ZWQgb3BlcmFuZCB0eXBlIik7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyOgorICAgIHJldHVybiBnZXRSZWcoKSA9PSBPdGhlci5nZXRSZWcoKSAmJiBpc0RlZigpID09IE90aGVyLmlzRGVmKCkgJiYKKyAgICAgICAgICAgZ2V0U3ViUmVnKCkgPT0gT3RoZXIuZ2V0U3ViUmVnKCk7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ltbWVkaWF0ZToKKyAgICByZXR1cm4gZ2V0SW1tKCkgPT0gT3RoZXIuZ2V0SW1tKCk7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ZQSW1tZWRpYXRlOgorICAgIHJldHVybiBnZXRGUEltbSgpID09IE90aGVyLmdldEZQSW1tKCk7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrOgorICAgIHJldHVybiBnZXRNQkIoKSA9PSBPdGhlci5nZXRNQkIoKTsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fRnJhbWVJbmRleDoKKyAgICByZXR1cm4gZ2V0SW5kZXgoKSA9PSBPdGhlci5nZXRJbmRleCgpOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19Db25zdGFudFBvb2xJbmRleDoKKyAgICByZXR1cm4gZ2V0SW5kZXgoKSA9PSBPdGhlci5nZXRJbmRleCgpICYmIGdldE9mZnNldCgpID09IE90aGVyLmdldE9mZnNldCgpOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19KdW1wVGFibGVJbmRleDoKKyAgICByZXR1cm4gZ2V0SW5kZXgoKSA9PSBPdGhlci5nZXRJbmRleCgpOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOgorICAgIHJldHVybiBnZXRHbG9iYWwoKSA9PSBPdGhlci5nZXRHbG9iYWwoKSAmJiBnZXRPZmZzZXQoKSA9PSBPdGhlci5nZXRPZmZzZXQoKTsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fRXh0ZXJuYWxTeW1ib2w6CisgICAgcmV0dXJuICFzdHJjbXAoZ2V0U3ltYm9sTmFtZSgpLCBPdGhlci5nZXRTeW1ib2xOYW1lKCkpICYmCisgICAgICAgICAgIGdldE9mZnNldCgpID09IE90aGVyLmdldE9mZnNldCgpOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19CbG9ja0FkZHJlc3M6CisgICAgcmV0dXJuIGdldEJsb2NrQWRkcmVzcygpID09IE90aGVyLmdldEJsb2NrQWRkcmVzcygpOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19NQ1N5bWJvbDoKKyAgICByZXR1cm4gZ2V0TUNTeW1ib2woKSA9PSBPdGhlci5nZXRNQ1N5bWJvbCgpOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19NZXRhZGF0YToKKyAgICByZXR1cm4gZ2V0TWV0YWRhdGEoKSA9PSBPdGhlci5nZXRNZXRhZGF0YSgpOworICB9Cit9CisKKy8vLyBwcmludCAtIFByaW50IHRoZSBzcGVjaWZpZWQgbWFjaGluZSBvcGVyYW5kLgorLy8vCit2b2lkIE1hY2hpbmVPcGVyYW5kOjpwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFRhcmdldE1hY2hpbmUgKlRNKSBjb25zdCB7CisgIC8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBlbWJlZGRlZCBpbnRvIGEgYmFzaWMgYmxvY2ssIHdlIGNhbiBmaW5kIHRoZQorICAvLyB0YXJnZXQgaW5mbyBmb3IgdGhlIGluc3RydWN0aW9uLgorICBpZiAoIVRNKQorICAgIGlmIChjb25zdCBNYWNoaW5lSW5zdHIgKk1JID0gZ2V0UGFyZW50KCkpCisgICAgICBpZiAoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1JLT5nZXRQYXJlbnQoKSkKKyAgICAgICAgaWYgKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBNQkItPmdldFBhcmVudCgpKQorICAgICAgICAgIFRNID0gJk1GLT5nZXRUYXJnZXQoKTsKKworICBzd2l0Y2ggKGdldFR5cGUoKSkgeworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19SZWdpc3RlcjoKKyAgICBpZiAoZ2V0UmVnKCkgPT0gMCB8fCBUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKGdldFJlZygpKSkgeworICAgICAgT1MgPDwgIiVyZWciIDw8IGdldFJlZygpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoVE0pCisgICAgICAgIE9TIDw8ICIlIiA8PCBUTS0+Z2V0UmVnaXN0ZXJJbmZvKCktPmdldChnZXRSZWcoKSkuTmFtZTsKKyAgICAgIGVsc2UKKyAgICAgICAgT1MgPDwgIiVwaHlzcmVnIiA8PCBnZXRSZWcoKTsKKyAgICB9CisKKyAgICBpZiAoZ2V0U3ViUmVnKCkgIT0gMCkgeworICAgICAgaWYgKFRNKQorICAgICAgICBPUyA8PCAnOicgPDwgVE0tPmdldFJlZ2lzdGVySW5mbygpLT5nZXRTdWJSZWdJbmRleE5hbWUoZ2V0U3ViUmVnKCkpOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAnOicgPDwgZ2V0U3ViUmVnKCk7CisgICAgfQorCisgICAgaWYgKGlzRGVmKCkgfHwgaXNLaWxsKCkgfHwgaXNEZWFkKCkgfHwgaXNJbXBsaWNpdCgpIHx8IGlzVW5kZWYoKSB8fAorICAgICAgICBpc0Vhcmx5Q2xvYmJlcigpKSB7CisgICAgICBPUyA8PCAnPCc7CisgICAgICBib29sIE5lZWRDb21tYSA9IGZhbHNlOworICAgICAgaWYgKGlzRGVmKCkpIHsKKyAgICAgICAgaWYgKE5lZWRDb21tYSkgT1MgPDwgJywnOworICAgICAgICBpZiAoaXNFYXJseUNsb2JiZXIoKSkKKyAgICAgICAgICBPUyA8PCAiZWFybHljbG9iYmVyLCI7CisgICAgICAgIGlmIChpc0ltcGxpY2l0KCkpCisgICAgICAgICAgT1MgPDwgImltcC0iOworICAgICAgICBPUyA8PCAiZGVmIjsKKyAgICAgICAgTmVlZENvbW1hID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXNJbXBsaWNpdCgpKSB7CisgICAgICAgICAgT1MgPDwgImltcC11c2UiOworICAgICAgICAgIE5lZWRDb21tYSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChpc0tpbGwoKSB8fCBpc0RlYWQoKSB8fCBpc1VuZGVmKCkpIHsKKyAgICAgICAgaWYgKE5lZWRDb21tYSkgT1MgPDwgJywnOworICAgICAgICBpZiAoaXNLaWxsKCkpICBPUyA8PCAia2lsbCI7CisgICAgICAgIGlmIChpc0RlYWQoKSkgIE9TIDw8ICJkZWFkIjsKKyAgICAgICAgaWYgKGlzVW5kZWYoKSkgeworICAgICAgICAgIGlmIChpc0tpbGwoKSB8fCBpc0RlYWQoKSkKKyAgICAgICAgICAgIE9TIDw8ICcsJzsKKyAgICAgICAgICBPUyA8PCAidW5kZWYiOworICAgICAgICB9CisgICAgICB9CisgICAgICBPUyA8PCAnPic7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgT1MgPDwgZ2V0SW1tKCk7CisgICAgYnJlYWs7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ZQSW1tZWRpYXRlOgorICAgIGlmIChnZXRGUEltbSgpLT5nZXRUeXBlKCktPmlzRmxvYXRUeSgpKQorICAgICAgT1MgPDwgZ2V0RlBJbW0oKS0+Z2V0VmFsdWVBUEYoKS5jb252ZXJ0VG9GbG9hdCgpOworICAgIGVsc2UKKyAgICAgIE9TIDw8IGdldEZQSW1tKCktPmdldFZhbHVlQVBGKCkuY29udmVydFRvRG91YmxlKCk7CisgICAgYnJlYWs7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrOgorICAgIE9TIDw8ICI8QkIjIiA8PCBnZXRNQkIoKS0+Z2V0TnVtYmVyKCkgPDwgIj4iOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19GcmFtZUluZGV4OgorICAgIE9TIDw8ICI8ZmkjIiA8PCBnZXRJbmRleCgpIDw8ICc+JzsKKyAgICBicmVhazsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fQ29uc3RhbnRQb29sSW5kZXg6CisgICAgT1MgPDwgIjxjcCMiIDw8IGdldEluZGV4KCk7CisgICAgaWYgKGdldE9mZnNldCgpKSBPUyA8PCAiKyIgPDwgZ2V0T2Zmc2V0KCk7CisgICAgT1MgPDwgJz4nOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19KdW1wVGFibGVJbmRleDoKKyAgICBPUyA8PCAiPGp0IyIgPDwgZ2V0SW5kZXgoKSA8PCAnPic7CisgICAgYnJlYWs7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0dsb2JhbEFkZHJlc3M6CisgICAgT1MgPDwgIjxnYToiOworICAgIFdyaXRlQXNPcGVyYW5kKE9TLCBnZXRHbG9iYWwoKSwgLypQcmludFR5cGU9Ki9mYWxzZSk7CisgICAgaWYgKGdldE9mZnNldCgpKSBPUyA8PCAiKyIgPDwgZ2V0T2Zmc2V0KCk7CisgICAgT1MgPDwgJz4nOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19FeHRlcm5hbFN5bWJvbDoKKyAgICBPUyA8PCAiPGVzOiIgPDwgZ2V0U3ltYm9sTmFtZSgpOworICAgIGlmIChnZXRPZmZzZXQoKSkgT1MgPDwgIisiIDw8IGdldE9mZnNldCgpOworICAgIE9TIDw8ICc+JzsKKyAgICBicmVhazsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fQmxvY2tBZGRyZXNzOgorICAgIE9TIDw8ICc8JzsKKyAgICBXcml0ZUFzT3BlcmFuZChPUywgZ2V0QmxvY2tBZGRyZXNzKCksIC8qUHJpbnRUeXBlPSovZmFsc2UpOworICAgIE9TIDw8ICc+JzsKKyAgICBicmVhazsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fTWV0YWRhdGE6CisgICAgT1MgPDwgJzwnOworICAgIFdyaXRlQXNPcGVyYW5kKE9TLCBnZXRNZXRhZGF0YSgpLCAvKlByaW50VHlwZT0qL2ZhbHNlKTsKKyAgICBPUyA8PCAnPic7CisgICAgYnJlYWs7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01DU3ltYm9sOgorICAgIE9TIDw8ICI8TUNTeW09IiA8PCAqZ2V0TUNTeW1ib2woKSA8PCAnPic7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5yZWNvZ25pemVkIG9wZXJhbmQgdHlwZSIpOworICB9CisgIAorICBpZiAodW5zaWduZWQgVEYgPSBnZXRUYXJnZXRGbGFncygpKQorICAgIE9TIDw8ICJbVEY9IiA8PCBURiA8PCAnXSc7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYWNoaW5lTWVtT3BlcmFuZCBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworTWFjaGluZU1lbU9wZXJhbmQ6Ok1hY2hpbmVNZW1PcGVyYW5kKGNvbnN0IFZhbHVlICp2LCB1bnNpZ25lZCBpbnQgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG8sIHVpbnQ2NF90IHMsIHVuc2lnbmVkIGludCBhKQorICA6IE9mZnNldChvKSwgU2l6ZShzKSwgVih2KSwKKyAgICBGbGFncygoZiAmICgoMSA8PCBNT01heEJpdHMpIC0gMSkpIHwgKChMb2cyXzMyKGEpICsgMSkgPDwgTU9NYXhCaXRzKSkgeworICBhc3NlcnQoZ2V0QmFzZUFsaWdubWVudCgpID09IGEgJiYgIkFsaWdubWVudCBpcyBub3QgYSBwb3dlciBvZiAyISIpOworICBhc3NlcnQoKGlzTG9hZCgpIHx8IGlzU3RvcmUoKSkgJiYgIk5vdCBhIGxvYWQvc3RvcmUhIik7Cit9CisKKy8vLyBQcm9maWxlIC0gR2F0aGVyIHVuaXF1ZSBkYXRhIGZvciB0aGUgb2JqZWN0LgorLy8vCit2b2lkIE1hY2hpbmVNZW1PcGVyYW5kOjpQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgIElELkFkZEludGVnZXIoT2Zmc2V0KTsKKyAgSUQuQWRkSW50ZWdlcihTaXplKTsKKyAgSUQuQWRkUG9pbnRlcihWKTsKKyAgSUQuQWRkSW50ZWdlcihGbGFncyk7Cit9CisKK3ZvaWQgTWFjaGluZU1lbU9wZXJhbmQ6OnJlZmluZUFsaWdubWVudChjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKSB7CisgIC8vIFRoZSBWYWx1ZSBhbmQgT2Zmc2V0IG1heSBkaWZmZXIgZHVlIHRvIENTRS4gQnV0IHRoZSBmbGFncyBhbmQgc2l6ZQorICAvLyBzaG91bGQgYmUgdGhlIHNhbWUuCisgIGFzc2VydChNTU8tPmdldEZsYWdzKCkgPT0gZ2V0RmxhZ3MoKSAmJiAiRmxhZ3MgbWlzbWF0Y2ghIik7CisgIGFzc2VydChNTU8tPmdldFNpemUoKSA9PSBnZXRTaXplKCkgJiYgIlNpemUgbWlzbWF0Y2ghIik7CisKKyAgaWYgKE1NTy0+Z2V0QmFzZUFsaWdubWVudCgpID49IGdldEJhc2VBbGlnbm1lbnQoKSkgeworICAgIC8vIFVwZGF0ZSB0aGUgYWxpZ25tZW50IHZhbHVlLgorICAgIEZsYWdzID0gKEZsYWdzICYgKCgxIDw8IE1PTWF4Qml0cykgLSAxKSkgfAorICAgICAgKChMb2cyXzMyKE1NTy0+Z2V0QmFzZUFsaWdubWVudCgpKSArIDEpIDw8IE1PTWF4Qml0cyk7CisgICAgLy8gQWxzbyB1cGRhdGUgdGhlIGJhc2UgYW5kIG9mZnNldCwgYmVjYXVzZSB0aGUgbmV3IGFsaWdubWVudCBtYXkKKyAgICAvLyBub3QgYmUgYXBwbGljYWJsZSB3aXRoIHRoZSBvbGQgb25lcy4KKyAgICBWID0gTU1PLT5nZXRWYWx1ZSgpOworICAgIE9mZnNldCA9IE1NTy0+Z2V0T2Zmc2V0KCk7CisgIH0KK30KKworLy8vIGdldEFsaWdubWVudCAtIFJldHVybiB0aGUgbWluaW11bSBrbm93biBhbGlnbm1lbnQgaW4gYnl0ZXMgb2YgdGhlCisvLy8gYWN0dWFsIG1lbW9yeSByZWZlcmVuY2UuCit1aW50NjRfdCBNYWNoaW5lTWVtT3BlcmFuZDo6Z2V0QWxpZ25tZW50KCkgY29uc3QgeworICByZXR1cm4gTWluQWxpZ24oZ2V0QmFzZUFsaWdubWVudCgpLCBnZXRPZmZzZXQoKSk7Cit9CisKK3Jhd19vc3RyZWFtICZsbHZtOjpvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgJk1NTykgeworICBhc3NlcnQoKE1NTy5pc0xvYWQoKSB8fCBNTU8uaXNTdG9yZSgpKSAmJgorICAgICAgICAgIlNWIGhhcyB0byBiZSBhIGxvYWQsIHN0b3JlIG9yIGJvdGguIik7CisgIAorICBpZiAoTU1PLmlzVm9sYXRpbGUoKSkKKyAgICBPUyA8PCAiVm9sYXRpbGUgIjsKKworICBpZiAoTU1PLmlzTG9hZCgpKQorICAgIE9TIDw8ICJMRCI7CisgIGlmIChNTU8uaXNTdG9yZSgpKQorICAgIE9TIDw8ICJTVCI7CisgIE9TIDw8IE1NTy5nZXRTaXplKCk7CisgIAorICAvLyBQcmludCB0aGUgYWRkcmVzcyBpbmZvcm1hdGlvbi4KKyAgT1MgPDwgIlsiOworICBpZiAoIU1NTy5nZXRWYWx1ZSgpKQorICAgIE9TIDw8ICI8dW5rbm93bj4iOworICBlbHNlCisgICAgV3JpdGVBc09wZXJhbmQoT1MsIE1NTy5nZXRWYWx1ZSgpLCAvKlByaW50VHlwZT0qL2ZhbHNlKTsKKworICAvLyBJZiB0aGUgYWxpZ25tZW50IG9mIHRoZSBtZW1vcnkgcmVmZXJlbmNlIGl0c2VsZiBkaWZmZXJzIGZyb20gdGhlIGFsaWdubWVudAorICAvLyBvZiB0aGUgYmFzZSBwb2ludGVyLCBwcmludCB0aGUgYmFzZSBhbGlnbm1lbnQgZXhwbGljaXRseSwgbmV4dCB0byB0aGUgYmFzZQorICAvLyBwb2ludGVyLgorICBpZiAoTU1PLmdldEJhc2VBbGlnbm1lbnQoKSAhPSBNTU8uZ2V0QWxpZ25tZW50KCkpCisgICAgT1MgPDwgIihhbGlnbj0iIDw8IE1NTy5nZXRCYXNlQWxpZ25tZW50KCkgPDwgIikiOworCisgIGlmIChNTU8uZ2V0T2Zmc2V0KCkgIT0gMCkKKyAgICBPUyA8PCAiKyIgPDwgTU1PLmdldE9mZnNldCgpOworICBPUyA8PCAiXSI7CisKKyAgLy8gUHJpbnQgdGhlIGFsaWdubWVudCBvZiB0aGUgcmVmZXJlbmNlLgorICBpZiAoTU1PLmdldEJhc2VBbGlnbm1lbnQoKSAhPSBNTU8uZ2V0QWxpZ25tZW50KCkgfHwKKyAgICAgIE1NTy5nZXRCYXNlQWxpZ25tZW50KCkgIT0gTU1PLmdldFNpemUoKSkKKyAgICBPUyA8PCAiKGFsaWduPSIgPDwgTU1PLmdldEFsaWdubWVudCgpIDw8ICIpIjsKKworICByZXR1cm4gT1M7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYWNoaW5lSW5zdHIgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBNYWNoaW5lSW5zdHIgY3RvciAtIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIGR1bW15IE1hY2hpbmVJbnN0ciB3aXRoCisvLy8gVElEIE5VTEwgYW5kIG5vIG9wZXJhbmRzLgorTWFjaGluZUluc3RyOjpNYWNoaW5lSW5zdHIoKQorICA6IFRJRCgwKSwgTnVtSW1wbGljaXRPcHMoMCksIEFzbVByaW50ZXJGbGFncygwKSwgTWVtUmVmcygwKSwgTWVtUmVmc0VuZCgwKSwKKyAgICBQYXJlbnQoMCkgeworICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBnZXQgYWRkZWQgdG8gYSBtYWNoaW5lIGJhc2ljYmxvY2sKKyAgTGVha0RldGVjdG9yOjphZGRHYXJiYWdlT2JqZWN0KHRoaXMpOworfQorCit2b2lkIE1hY2hpbmVJbnN0cjo6YWRkSW1wbGljaXREZWZVc2VPcGVyYW5kcygpIHsKKyAgaWYgKFRJRC0+SW1wbGljaXREZWZzKQorICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkltcERlZnMgPSBUSUQtPkltcGxpY2l0RGVmczsgKkltcERlZnM7ICsrSW1wRGVmcykKKyAgICAgIGFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZygqSW1wRGVmcywgdHJ1ZSwgdHJ1ZSkpOworICBpZiAoVElELT5JbXBsaWNpdFVzZXMpCisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqSW1wVXNlcyA9IFRJRC0+SW1wbGljaXRVc2VzOyAqSW1wVXNlczsgKytJbXBVc2VzKQorICAgICAgYWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKCpJbXBVc2VzLCBmYWxzZSwgdHJ1ZSkpOworfQorCisvLy8gTWFjaGluZUluc3RyIGN0b3IgLSBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBNYWNoaW5lSW5zdHIgYW5kIGFkZHMgdGhlCisvLy8gaW1wbGljaXQgb3BlcmFuZHMuIEl0IHJlc2VydmVzIHNwYWNlIGZvciB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHNwZWNpZmllZCBieQorLy8vIHRoZSBUYXJnZXRJbnN0ckRlc2MuCitNYWNoaW5lSW5zdHI6Ok1hY2hpbmVJbnN0cihjb25zdCBUYXJnZXRJbnN0ckRlc2MgJnRpZCwgYm9vbCBOb0ltcCkKKyAgOiBUSUQoJnRpZCksIE51bUltcGxpY2l0T3BzKDApLCBBc21QcmludGVyRmxhZ3MoMCksCisgICAgTWVtUmVmcygwKSwgTWVtUmVmc0VuZCgwKSwgUGFyZW50KDApIHsKKyAgaWYgKCFOb0ltcCkKKyAgICBOdW1JbXBsaWNpdE9wcyA9IFRJRC0+Z2V0TnVtSW1wbGljaXREZWZzKCkgKyBUSUQtPmdldE51bUltcGxpY2l0VXNlcygpOworICBPcGVyYW5kcy5yZXNlcnZlKE51bUltcGxpY2l0T3BzICsgVElELT5nZXROdW1PcGVyYW5kcygpKTsKKyAgaWYgKCFOb0ltcCkKKyAgICBhZGRJbXBsaWNpdERlZlVzZU9wZXJhbmRzKCk7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGdldCBhZGRlZCB0byBhIG1hY2hpbmUgYmFzaWNibG9jaworICBMZWFrRGV0ZWN0b3I6OmFkZEdhcmJhZ2VPYmplY3QodGhpcyk7Cit9CisKKy8vLyBNYWNoaW5lSW5zdHIgY3RvciAtIEFzIGFib3ZlLCBidXQgd2l0aCBhIERlYnVnTG9jLgorTWFjaGluZUluc3RyOjpNYWNoaW5lSW5zdHIoY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZ0aWQsIGNvbnN0IERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb0ltcCkKKyAgOiBUSUQoJnRpZCksIE51bUltcGxpY2l0T3BzKDApLCBBc21QcmludGVyRmxhZ3MoMCksIE1lbVJlZnMoMCksIE1lbVJlZnNFbmQoMCksCisgICAgUGFyZW50KDApLCBkZWJ1Z0xvYyhkbCkgeworICBpZiAoIU5vSW1wKQorICAgIE51bUltcGxpY2l0T3BzID0gVElELT5nZXROdW1JbXBsaWNpdERlZnMoKSArIFRJRC0+Z2V0TnVtSW1wbGljaXRVc2VzKCk7CisgIE9wZXJhbmRzLnJlc2VydmUoTnVtSW1wbGljaXRPcHMgKyBUSUQtPmdldE51bU9wZXJhbmRzKCkpOworICBpZiAoIU5vSW1wKQorICAgIGFkZEltcGxpY2l0RGVmVXNlT3BlcmFuZHMoKTsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgZ2V0IGFkZGVkIHRvIGEgbWFjaGluZSBiYXNpY2Jsb2NrCisgIExlYWtEZXRlY3Rvcjo6YWRkR2FyYmFnZU9iamVjdCh0aGlzKTsKK30KKworLy8vIE1hY2hpbmVJbnN0ciBjdG9yIC0gV29yayBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBjdG9yIHR3byBhYm92ZSwgZXhjZXB0CisvLy8gdGhhdCB0aGUgTWFjaGluZUluc3RyIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCAKKy8vLyBiYXNpYyBibG9jay4KK01hY2hpbmVJbnN0cjo6TWFjaGluZUluc3RyKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmdGlkKQorICA6IFRJRCgmdGlkKSwgTnVtSW1wbGljaXRPcHMoMCksIEFzbVByaW50ZXJGbGFncygwKSwKKyAgICBNZW1SZWZzKDApLCBNZW1SZWZzRW5kKDApLCBQYXJlbnQoMCkgeworICBhc3NlcnQoTUJCICYmICJDYW5ub3QgdXNlIGluc2VydGluZyBjdG9yIHdpdGggbnVsbCBiYXNpYyBibG9jayEiKTsKKyAgTnVtSW1wbGljaXRPcHMgPSBUSUQtPmdldE51bUltcGxpY2l0RGVmcygpICsgVElELT5nZXROdW1JbXBsaWNpdFVzZXMoKTsKKyAgT3BlcmFuZHMucmVzZXJ2ZShOdW1JbXBsaWNpdE9wcyArIFRJRC0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgIGFkZEltcGxpY2l0RGVmVXNlT3BlcmFuZHMoKTsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgZ2V0IGFkZGVkIHRvIGEgbWFjaGluZSBiYXNpY2Jsb2NrCisgIExlYWtEZXRlY3Rvcjo6YWRkR2FyYmFnZU9iamVjdCh0aGlzKTsKKyAgTUJCLT5wdXNoX2JhY2sodGhpcyk7ICAvLyBBZGQgaW5zdHJ1Y3Rpb24gdG8gZW5kIG9mIGJhc2ljIGJsb2NrIQorfQorCisvLy8gTWFjaGluZUluc3RyIGN0b3IgLSBBcyBhYm92ZSwgYnV0IHdpdGggYSBEZWJ1Z0xvYy4KKy8vLworTWFjaGluZUluc3RyOjpNYWNoaW5lSW5zdHIoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwgY29uc3QgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJnRpZCkKKyAgOiBUSUQoJnRpZCksIE51bUltcGxpY2l0T3BzKDApLCBBc21QcmludGVyRmxhZ3MoMCksIE1lbVJlZnMoMCksIE1lbVJlZnNFbmQoMCksCisgICAgUGFyZW50KDApLCBkZWJ1Z0xvYyhkbCkgeworICBhc3NlcnQoTUJCICYmICJDYW5ub3QgdXNlIGluc2VydGluZyBjdG9yIHdpdGggbnVsbCBiYXNpYyBibG9jayEiKTsKKyAgTnVtSW1wbGljaXRPcHMgPSBUSUQtPmdldE51bUltcGxpY2l0RGVmcygpICsgVElELT5nZXROdW1JbXBsaWNpdFVzZXMoKTsKKyAgT3BlcmFuZHMucmVzZXJ2ZShOdW1JbXBsaWNpdE9wcyArIFRJRC0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgIGFkZEltcGxpY2l0RGVmVXNlT3BlcmFuZHMoKTsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgZ2V0IGFkZGVkIHRvIGEgbWFjaGluZSBiYXNpY2Jsb2NrCisgIExlYWtEZXRlY3Rvcjo6YWRkR2FyYmFnZU9iamVjdCh0aGlzKTsKKyAgTUJCLT5wdXNoX2JhY2sodGhpcyk7ICAvLyBBZGQgaW5zdHJ1Y3Rpb24gdG8gZW5kIG9mIGJhc2ljIGJsb2NrIQorfQorCisvLy8gTWFjaGluZUluc3RyIGN0b3IgLSBDb3BpZXMgTWFjaGluZUluc3RyIGFyZyBleGFjdGx5CisvLy8KK01hY2hpbmVJbnN0cjo6TWFjaGluZUluc3RyKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpCisgIDogVElEKCZNSS5nZXREZXNjKCkpLCBOdW1JbXBsaWNpdE9wcygwKSwgQXNtUHJpbnRlckZsYWdzKDApLAorICAgIE1lbVJlZnMoTUkuTWVtUmVmcyksIE1lbVJlZnNFbmQoTUkuTWVtUmVmc0VuZCksCisgICAgUGFyZW50KDApLCBkZWJ1Z0xvYyhNSS5nZXREZWJ1Z0xvYygpKSB7CisgIE9wZXJhbmRzLnJlc2VydmUoTUkuZ2V0TnVtT3BlcmFuZHMoKSk7CisKKyAgLy8gQWRkIG9wZXJhbmRzCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTUkuZ2V0TnVtT3BlcmFuZHMoKTsgKytpKQorICAgIGFkZE9wZXJhbmQoTUkuZ2V0T3BlcmFuZChpKSk7CisgIE51bUltcGxpY2l0T3BzID0gTUkuTnVtSW1wbGljaXRPcHM7CisKKyAgLy8gU2V0IHBhcmVudCB0byBudWxsLgorICBQYXJlbnQgPSAwOworCisgIExlYWtEZXRlY3Rvcjo6YWRkR2FyYmFnZU9iamVjdCh0aGlzKTsKK30KKworTWFjaGluZUluc3RyOjp+TWFjaGluZUluc3RyKCkgeworICBMZWFrRGV0ZWN0b3I6OnJlbW92ZUdhcmJhZ2VPYmplY3QodGhpcyk7CisjaWZuZGVmIE5ERUJVRworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGFzc2VydChPcGVyYW5kc1tpXS5QYXJlbnRNSSA9PSB0aGlzICYmICJQYXJlbnRNSSBtaXNtYXRjaCEiKTsKKyAgICBhc3NlcnQoKCFPcGVyYW5kc1tpXS5pc1JlZygpIHx8ICFPcGVyYW5kc1tpXS5pc09uUmVnVXNlTGlzdCgpKSAmJgorICAgICAgICAgICAiUmVnIG9wZXJhbmQgZGVmL3VzZSBsaXN0IGNvcnJ1cHRlZCIpOworICB9CisjZW5kaWYKK30KKworLy8vIGdldFJlZ0luZm8gLSBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGVtYmVkZGVkIGludG8gYSBNYWNoaW5lRnVuY3Rpb24sCisvLy8gcmV0dXJuIHRoZSBNYWNoaW5lUmVnaXN0ZXJJbmZvIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24sIG90aGVyd2lzZQorLy8vIHJldHVybiBudWxsLgorTWFjaGluZVJlZ2lzdGVySW5mbyAqTWFjaGluZUluc3RyOjpnZXRSZWdJbmZvKCkgeworICBpZiAoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IGdldFBhcmVudCgpKQorICAgIHJldHVybiAmTUJCLT5nZXRQYXJlbnQoKS0+Z2V0UmVnSW5mbygpOworICByZXR1cm4gMDsKK30KKworLy8vIFJlbW92ZVJlZ09wZXJhbmRzRnJvbVVzZUxpc3RzIC0gVW5saW5rIGFsbCBvZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMgaW4KKy8vLyB0aGlzIGluc3RydWN0aW9uIGZyb20gdGhlaXIgcmVzcGVjdGl2ZSB1c2UgbGlzdHMuICBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlCisvLy8gb3BlcmFuZHMgYWxyZWFkeSBiZSBvbiB0aGVpciB1c2UgbGlzdHMuCit2b2lkIE1hY2hpbmVJbnN0cjo6UmVtb3ZlUmVnT3BlcmFuZHNGcm9tVXNlTGlzdHMoKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKE9wZXJhbmRzW2ldLmlzUmVnKCkpCisgICAgICBPcGVyYW5kc1tpXS5SZW1vdmVSZWdPcGVyYW5kRnJvbVJlZ0luZm8oKTsKKyAgfQorfQorCisvLy8gQWRkUmVnT3BlcmFuZHNUb1VzZUxpc3RzIC0gQWRkIGFsbCBvZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMgaW4KKy8vLyB0aGlzIGluc3RydWN0aW9uIGZyb20gdGhlaXIgcmVzcGVjdGl2ZSB1c2UgbGlzdHMuICBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlCisvLy8gb3BlcmFuZHMgbm90IGJlIG9uIHRoZWlyIHVzZSBsaXN0cyB5ZXQuCit2b2lkIE1hY2hpbmVJbnN0cjo6QWRkUmVnT3BlcmFuZHNUb1VzZUxpc3RzKE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8pIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoT3BlcmFuZHNbaV0uaXNSZWcoKSkKKyAgICAgIE9wZXJhbmRzW2ldLkFkZFJlZ09wZXJhbmRUb1JlZ0luZm8oJlJlZ0luZm8pOworICB9Cit9CisKKworLy8vIGFkZE9wZXJhbmQgLSBBZGQgdGhlIHNwZWNpZmllZCBvcGVyYW5kIHRvIHRoZSBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGFuCisvLy8gaW1wbGljaXQgb3BlcmFuZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgb3BlcmFuZCBsaXN0LiAgSWYgaXQgaXMKKy8vLyBhbiBleHBsaWNpdCBvcGVyYW5kIGl0IGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGV4cGxpY2l0IG9wZXJhbmQgbGlzdAorLy8vIChiZWZvcmUgdGhlIGZpcnN0IGltcGxpY2l0IG9wZXJhbmQpLiAKK3ZvaWQgTWFjaGluZUluc3RyOjphZGRPcGVyYW5kKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZPcCkgeworICBib29sIGlzSW1wUmVnID0gT3AuaXNSZWcoKSAmJiBPcC5pc0ltcGxpY2l0KCk7CisgIGFzc2VydCgoaXNJbXBSZWcgfHwgIU9wZXJhbmRzQ29tcGxldGUoKSkgJiYKKyAgICAgICAgICJUcnlpbmcgdG8gYWRkIGFuIG9wZXJhbmQgdG8gYSBtYWNoaW5lIGluc3RyIHRoYXQgaXMgYWxyZWFkeSBkb25lISIpOworCisgIE1hY2hpbmVSZWdpc3RlckluZm8gKlJlZ0luZm8gPSBnZXRSZWdJbmZvKCk7CisKKyAgLy8gSWYgd2UgYXJlIGFkZGluZyB0aGUgb3BlcmFuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBvdXIgam9iIGlzIHNpbXBsZXIuCisgIC8vIFRoaXMgaXMgdHJ1ZSBtb3N0IG9mIHRoZSB0aW1lLCBzbyB0aGlzIGlzIGEgcmVhc29uYWJsZSBvcHRpbWl6YXRpb24uCisgIGlmIChpc0ltcFJlZyB8fCBOdW1JbXBsaWNpdE9wcyA9PSAwKSB7CisgICAgLy8gV2UgY2FuIG9ubHkgZG8gdGhpcyBvcHRpbWl6YXRpb24gaWYgd2Uga25vdyB0aGF0IHRoZSBvcGVyYW5kIGxpc3Qgd29uJ3QKKyAgICAvLyByZWFsbG9jYXRlLgorICAgIGlmIChPcGVyYW5kcy5lbXB0eSgpIHx8IE9wZXJhbmRzLnNpemUoKSsxIDw9IE9wZXJhbmRzLmNhcGFjaXR5KCkpIHsKKyAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhPcCk7CisgICAgCisgICAgICAvLyBTZXQgdGhlIHBhcmVudCBvZiB0aGUgb3BlcmFuZC4KKyAgICAgIE9wZXJhbmRzLmJhY2soKS5QYXJlbnRNSSA9IHRoaXM7CisgIAorICAgICAgLy8gSWYgdGhlIG9wZXJhbmQgaXMgYSByZWdpc3RlciwgdXBkYXRlIHRoZSBvcGVyYW5kJ3MgdXNlIGxpc3QuCisgICAgICBpZiAoT3AuaXNSZWcoKSkgeworICAgICAgICBPcGVyYW5kcy5iYWNrKCkuQWRkUmVnT3BlcmFuZFRvUmVnSW5mbyhSZWdJbmZvKTsKKyAgICAgICAgLy8gSWYgdGhlIHJlZ2lzdGVyIG9wZXJhbmQgaXMgZmxhZ2dlZCBhcyBlYXJseSwgbWFyayB0aGUgb3BlcmFuZCBhcyBzdWNoCisgICAgICAgIHVuc2lnbmVkIE9wTm8gPSBPcGVyYW5kcy5zaXplKCkgLSAxOworICAgICAgICBpZiAoVElELT5nZXRPcGVyYW5kQ29uc3RyYWludChPcE5vLCBUT0k6OkVBUkxZX0NMT0JCRVIpICE9IC0xKQorICAgICAgICAgIE9wZXJhbmRzW09wTm9dLnNldElzRWFybHlDbG9iYmVyKHRydWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGluc2VydCBhIHJlYWwgb3BlcmFuZCBiZWZvcmUgYW55IGltcGxpY2l0IG9uZXMuCisgIHVuc2lnbmVkIE9wTm8gPSBPcGVyYW5kcy5zaXplKCktTnVtSW1wbGljaXRPcHM7CisKKyAgLy8gSWYgdGhpcyBpbnN0cnVjdGlvbiBpc24ndCBlbWJlZGRlZCBpbnRvIGEgZnVuY3Rpb24sIHRoZW4gd2UgZG9uJ3QgbmVlZCB0bworICAvLyB1cGRhdGUgYW55IG9wZXJhbmQgbGlzdHMuCisgIGlmIChSZWdJbmZvID09IDApIHsKKyAgICAvLyBTaW1wbGUgaW5zZXJ0aW9uLCBubyByZWdpbmZvIHVwZGF0ZSBuZWVkZWQgZm9yIG90aGVyIHJlZ2lzdGVyIG9wZXJhbmRzLgorICAgIE9wZXJhbmRzLmluc2VydChPcGVyYW5kcy5iZWdpbigpK09wTm8sIE9wKTsKKyAgICBPcGVyYW5kc1tPcE5vXS5QYXJlbnRNSSA9IHRoaXM7CisKKyAgICAvLyBEbyBleHBsaWNpdGx5IHNldCB0aGUgcmVnaW5mbyBmb3IgdGhpcyBvcGVyYW5kIHRob3VnaCwgdG8gZW5zdXJlIHRoZQorICAgIC8vIG5leHQvcHJldiBmaWVsZHMgYXJlIHByb3Blcmx5IG51bGxlZCBvdXQuCisgICAgaWYgKE9wZXJhbmRzW09wTm9dLmlzUmVnKCkpIHsKKyAgICAgIE9wZXJhbmRzW09wTm9dLkFkZFJlZ09wZXJhbmRUb1JlZ0luZm8oMCk7CisgICAgICAvLyBJZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZCBpcyBmbGFnZ2VkIGFzIGVhcmx5LCBtYXJrIHRoZSBvcGVyYW5kIGFzIHN1Y2gKKyAgICAgIGlmIChUSUQtPmdldE9wZXJhbmRDb25zdHJhaW50KE9wTm8sIFRPSTo6RUFSTFlfQ0xPQkJFUikgIT0gLTEpCisgICAgICAgIE9wZXJhbmRzW09wTm9dLnNldElzRWFybHlDbG9iYmVyKHRydWUpOworICAgIH0KKworICB9IGVsc2UgaWYgKE9wZXJhbmRzLnNpemUoKSsxIDw9IE9wZXJhbmRzLmNhcGFjaXR5KCkpIHsKKyAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gcmVtb3ZlIHJlZ2lzdGVyIG9wZXJhbmRzIGZyb20gdGhlaXIgcmVnaXN0ZXIgdXNlCisgICAgLy8gbGlzdCwgYWRkIHRoZSBvcGVyYW5kLCB0aGVuIGFkZCB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMgYmFjayB0byB0aGVpciB1c2UKKyAgICAvLyBsaXN0LiAgVGhpcyBhbHNvIG11c3QgaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIG9wZXJhbmQgbGlzdCByZWFsbG9jYXRlcworICAgIC8vIHRvIHNvbWV3aGVyZSBlbHNlLgorICAKKyAgICAvLyBJZiBpbnNlcnRpb24gb2YgdGhpcyBvcGVyYW5kIHdvbid0IGNhdXNlIHJlYWxsb2NhdGlvbiBvZiB0aGUgb3BlcmFuZAorICAgIC8vIGxpc3QsIGp1c3QgcmVtb3ZlIHRoZSBpbXBsaWNpdCBvcGVyYW5kcywgYWRkIHRoZSBvcGVyYW5kLCB0aGVuIHJlLWFkZCBhbGwKKyAgICAvLyB0aGUgcmVzdCBvZiB0aGUgb3BlcmFuZHMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gT3BObywgZSA9IE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGFzc2VydChPcGVyYW5kc1tpXS5pc1JlZygpICYmICJTaG91bGQgb25seSBiZSBhbiBpbXBsaWNpdCByZWchIik7CisgICAgICBPcGVyYW5kc1tpXS5SZW1vdmVSZWdPcGVyYW5kRnJvbVJlZ0luZm8oKTsKKyAgICB9CisgICAgCisgICAgLy8gQWRkIHRoZSBvcGVyYW5kLiAgSWYgaXQgaXMgYSByZWdpc3RlciwgYWRkIGl0IHRvIHRoZSByZWcgbGlzdC4KKyAgICBPcGVyYW5kcy5pbnNlcnQoT3BlcmFuZHMuYmVnaW4oKStPcE5vLCBPcCk7CisgICAgT3BlcmFuZHNbT3BOb10uUGFyZW50TUkgPSB0aGlzOworCisgICAgaWYgKE9wZXJhbmRzW09wTm9dLmlzUmVnKCkpIHsKKyAgICAgIE9wZXJhbmRzW09wTm9dLkFkZFJlZ09wZXJhbmRUb1JlZ0luZm8oUmVnSW5mbyk7CisgICAgICAvLyBJZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZCBpcyBmbGFnZ2VkIGFzIGVhcmx5LCBtYXJrIHRoZSBvcGVyYW5kIGFzIHN1Y2gKKyAgICAgIGlmIChUSUQtPmdldE9wZXJhbmRDb25zdHJhaW50KE9wTm8sIFRPSTo6RUFSTFlfQ0xPQkJFUikgIT0gLTEpCisgICAgICAgIE9wZXJhbmRzW09wTm9dLnNldElzRWFybHlDbG9iYmVyKHRydWUpOworICAgIH0KKyAgICAKKyAgICAvLyBSZS1hZGQgYWxsIHRoZSBpbXBsaWNpdCBvcHMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gT3BObysxLCBlID0gT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgYXNzZXJ0KE9wZXJhbmRzW2ldLmlzUmVnKCkgJiYgIlNob3VsZCBvbmx5IGJlIGFuIGltcGxpY2l0IHJlZyEiKTsKKyAgICAgIE9wZXJhbmRzW2ldLkFkZFJlZ09wZXJhbmRUb1JlZ0luZm8oUmVnSW5mbyk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIE90aGVyd2lzZSwgd2Ugd2lsbCBiZSByZWFsbG9jYXRpbmcgdGhlIG9wZXJhbmQgbGlzdC4gIFJlbW92ZSBhbGwgcmVnCisgICAgLy8gb3BlcmFuZHMgZnJvbSB0aGVpciBsaXN0LCB0aGVuIHJlYWRkIHRoZW0gYWZ0ZXIgdGhlIG9wZXJhbmQgbGlzdCBpcworICAgIC8vIHJlYWxsb2NhdGVkLgorICAgIFJlbW92ZVJlZ09wZXJhbmRzRnJvbVVzZUxpc3RzKCk7CisgICAgCisgICAgT3BlcmFuZHMuaW5zZXJ0KE9wZXJhbmRzLmJlZ2luKCkrT3BObywgT3ApOworICAgIE9wZXJhbmRzW09wTm9dLlBhcmVudE1JID0gdGhpczsKKyAgCisgICAgLy8gUmUtYWRkIGFsbCB0aGUgb3BlcmFuZHMuCisgICAgQWRkUmVnT3BlcmFuZHNUb1VzZUxpc3RzKCpSZWdJbmZvKTsKKworICAgICAgLy8gSWYgdGhlIHJlZ2lzdGVyIG9wZXJhbmQgaXMgZmxhZ2dlZCBhcyBlYXJseSwgbWFyayB0aGUgb3BlcmFuZCBhcyBzdWNoCisgICAgaWYgKE9wZXJhbmRzW09wTm9dLmlzUmVnKCkKKyAgICAgICAgJiYgVElELT5nZXRPcGVyYW5kQ29uc3RyYWludChPcE5vLCBUT0k6OkVBUkxZX0NMT0JCRVIpICE9IC0xKQorICAgICAgT3BlcmFuZHNbT3BOb10uc2V0SXNFYXJseUNsb2JiZXIodHJ1ZSk7CisgIH0KK30KKworLy8vIFJlbW92ZU9wZXJhbmQgLSBFcmFzZSBhbiBvcGVyYW5kICBmcm9tIGFuIGluc3RydWN0aW9uLCBsZWF2aW5nIGl0IHdpdGggb25lCisvLy8gZmV3ZXIgb3BlcmFuZCB0aGFuIGl0IHN0YXJ0ZWQgd2l0aC4KKy8vLwordm9pZCBNYWNoaW5lSW5zdHI6OlJlbW92ZU9wZXJhbmQodW5zaWduZWQgT3BObykgeworICBhc3NlcnQoT3BObyA8IE9wZXJhbmRzLnNpemUoKSAmJiAiSW52YWxpZCBvcGVyYW5kIG51bWJlciIpOworICAKKyAgLy8gU3BlY2lhbCBjYXNlIHJlbW92aW5nIHRoZSBsYXN0IG9uZS4KKyAgaWYgKE9wTm8gPT0gT3BlcmFuZHMuc2l6ZSgpLTEpIHsKKyAgICAvLyBJZiBuZWVkZWQsIHJlbW92ZSBmcm9tIHRoZSByZWcgZGVmL3VzZSBsaXN0LgorICAgIGlmIChPcGVyYW5kcy5iYWNrKCkuaXNSZWcoKSAmJiBPcGVyYW5kcy5iYWNrKCkuaXNPblJlZ1VzZUxpc3QoKSkKKyAgICAgIE9wZXJhbmRzLmJhY2soKS5SZW1vdmVSZWdPcGVyYW5kRnJvbVJlZ0luZm8oKTsKKyAgICAKKyAgICBPcGVyYW5kcy5wb3BfYmFjaygpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHJlbW92aW5nIGFuIGludGVyaW9yIG9wZXJhbmQuICBJZiB3ZSBoYXZlIHJlZ2luZm8gdG8KKyAgLy8gdXBkYXRlLCByZW1vdmUgYWxsIG9wZXJhbmRzIHRoYXQgd2lsbCBiZSBzaGlmdGVkIGRvd24gZnJvbSB0aGVpciByZWcgbGlzdHMsCisgIC8vIG1vdmUgZXZlcnl0aGluZyBkb3duLCB0aGVuIHJlLWFkZCB0aGVtLgorICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpSZWdJbmZvID0gZ2V0UmVnSW5mbygpOworICBpZiAoUmVnSW5mbykgeworICAgIGZvciAodW5zaWduZWQgaSA9IE9wTm8sIGUgPSBPcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoT3BlcmFuZHNbaV0uaXNSZWcoKSkKKyAgICAgICAgT3BlcmFuZHNbaV0uUmVtb3ZlUmVnT3BlcmFuZEZyb21SZWdJbmZvKCk7CisgICAgfQorICB9CisgIAorICBPcGVyYW5kcy5lcmFzZShPcGVyYW5kcy5iZWdpbigpK09wTm8pOworCisgIGlmIChSZWdJbmZvKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gT3BObywgZSA9IE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChPcGVyYW5kc1tpXS5pc1JlZygpKQorICAgICAgICBPcGVyYW5kc1tpXS5BZGRSZWdPcGVyYW5kVG9SZWdJbmZvKFJlZ0luZm8pOworICAgIH0KKyAgfQorfQorCisvLy8gYWRkTWVtT3BlcmFuZCAtIEFkZCBhIE1hY2hpbmVNZW1PcGVyYW5kIHRvIHRoZSBtYWNoaW5lIGluc3RydWN0aW9uLgorLy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSBvY2Nhc2lvbmFsbHkuIFRoZSBzZXRNZW1SZWZzIGZ1bmN0aW9uCisvLy8gaXMgdGhlIHByaW1hcnkgbWV0aG9kIGZvciBzZXR0aW5nIHVwIGEgTWFjaGluZUluc3RyJ3MgTWVtUmVmcyBsaXN0Lgordm9pZCBNYWNoaW5lSW5zdHI6OmFkZE1lbU9wZXJhbmQoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTykgeworICBtbW9faXRlcmF0b3IgT2xkTWVtUmVmcyA9IE1lbVJlZnM7CisgIG1tb19pdGVyYXRvciBPbGRNZW1SZWZzRW5kID0gTWVtUmVmc0VuZDsKKworICBzaXplX3QgTmV3TnVtID0gKE1lbVJlZnNFbmQgLSBNZW1SZWZzKSArIDE7CisgIG1tb19pdGVyYXRvciBOZXdNZW1SZWZzID0gTUYuYWxsb2NhdGVNZW1SZWZzQXJyYXkoTmV3TnVtKTsKKyAgbW1vX2l0ZXJhdG9yIE5ld01lbVJlZnNFbmQgPSBOZXdNZW1SZWZzICsgTmV3TnVtOworCisgIHN0ZDo6Y29weShPbGRNZW1SZWZzLCBPbGRNZW1SZWZzRW5kLCBOZXdNZW1SZWZzKTsKKyAgTmV3TWVtUmVmc1tOZXdOdW0gLSAxXSA9IE1POworCisgIE1lbVJlZnMgPSBOZXdNZW1SZWZzOworICBNZW1SZWZzRW5kID0gTmV3TWVtUmVmc0VuZDsKK30KKworYm9vbCBNYWNoaW5lSW5zdHI6OmlzSWRlbnRpY2FsVG8oY29uc3QgTWFjaGluZUluc3RyICpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JQ2hlY2tUeXBlIENoZWNrKSBjb25zdCB7CisgIC8vIElmIG9wY29kZXMgb3IgbnVtYmVyIG9mIG9wZXJhbmRzIGFyZSBub3QgdGhlIHNhbWUgdGhlbiB0aGUgdHdvCisgIC8vIGluc3RydWN0aW9ucyBhcmUgb2J2aW91c2x5IG5vdCBpZGVudGljYWwuCisgIGlmIChPdGhlci0+Z2V0T3Bjb2RlKCkgIT0gZ2V0T3Bjb2RlKCkgfHwKKyAgICAgIE90aGVyLT5nZXROdW1PcGVyYW5kcygpICE9IGdldE51bU9wZXJhbmRzKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIENoZWNrIG9wZXJhbmRzIHRvIG1ha2Ugc3VyZSB0aGV5IG1hdGNoLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBnZXRPcGVyYW5kKGkpOworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZPTU8gPSBPdGhlci0+Z2V0T3BlcmFuZChpKTsKKyAgICAvLyBDbGllbnRzIG1heSBvciBtYXkgbm90IHdhbnQgdG8gaWdub3JlIGRlZnMgd2hlbiB0ZXN0aW5nIGZvciBlcXVhbGl0eS4KKyAgICAvLyBGb3IgZXhhbXBsZSwgbWFjaGluZSBDU0UgcGFzcyBvbmx5IGNhcmVzIGFib3V0IGZpbmRpbmcgY29tbW9uCisgICAgLy8gc3ViZXhwcmVzc2lvbnMsIHNvIGl0J3Mgc2FmZSB0byBpZ25vcmUgdmlydHVhbCByZWdpc3RlciBkZWZzLgorICAgIGlmIChDaGVjayAhPSBDaGVja0RlZnMgJiYgTU8uaXNSZWcoKSAmJiBNTy5pc0RlZigpKSB7CisgICAgICBpZiAoQ2hlY2sgPT0gSWdub3JlRGVmcykKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBDaGVjayA9PSBJZ25vcmVWUmVnRGVmcworICAgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKE1PLmdldFJlZygpKSB8fAorICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKE9NTy5nZXRSZWcoKSkpCisgICAgICAgIGlmIChNTy5nZXRSZWcoKSAhPSBPTU8uZ2V0UmVnKCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoIU1PLmlzSWRlbnRpY2FsVG8oT01PKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIHJlbW92ZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGJhc2ljCisvLy8gYmxvY2ssIGFuZCByZXR1cm5zIGl0LCBidXQgZG9lcyBub3QgZGVsZXRlIGl0LgorTWFjaGluZUluc3RyICpNYWNoaW5lSW5zdHI6OnJlbW92ZUZyb21QYXJlbnQoKSB7CisgIGFzc2VydChnZXRQYXJlbnQoKSAmJiAiTm90IGVtYmVkZGVkIGluIGEgYmFzaWMgYmxvY2shIik7CisgIGdldFBhcmVudCgpLT5yZW1vdmUodGhpcyk7CisgIHJldHVybiB0aGlzOworfQorCisKKy8vLyBlcmFzZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGJhc2ljCisvLy8gYmxvY2ssIGFuZCBkZWxldGVzIGl0Lgordm9pZCBNYWNoaW5lSW5zdHI6OmVyYXNlRnJvbVBhcmVudCgpIHsKKyAgYXNzZXJ0KGdldFBhcmVudCgpICYmICJOb3QgZW1iZWRkZWQgaW4gYSBiYXNpYyBibG9jayEiKTsKKyAgZ2V0UGFyZW50KCktPmVyYXNlKHRoaXMpOworfQorCisKKy8vLyBPcGVyYW5kQ29tcGxldGUgLSBSZXR1cm4gdHJ1ZSBpZiBpdCdzIGlsbGVnYWwgdG8gYWRkIGEgbmV3IG9wZXJhbmQKKy8vLworYm9vbCBNYWNoaW5lSW5zdHI6Ok9wZXJhbmRzQ29tcGxldGUoKSBjb25zdCB7CisgIHVuc2lnbmVkIHNob3J0IE51bU9wZXJhbmRzID0gVElELT5nZXROdW1PcGVyYW5kcygpOworICBpZiAoIVRJRC0+aXNWYXJpYWRpYygpICYmIGdldE51bU9wZXJhbmRzKCktTnVtSW1wbGljaXRPcHMgPj0gTnVtT3BlcmFuZHMpCisgICAgcmV0dXJuIHRydWU7ICAvLyBCcm9rZW46IHdlIGhhdmUgYWxsIHRoZSBvcGVyYW5kcyBvZiB0aGlzIGluc3RydWN0aW9uIQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBnZXROdW1FeHBsaWNpdE9wZXJhbmRzIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbi1pbXBsaWNpdCBvcGVyYW5kcy4KKy8vLwordW5zaWduZWQgTWFjaGluZUluc3RyOjpnZXROdW1FeHBsaWNpdE9wZXJhbmRzKCkgY29uc3QgeworICB1bnNpZ25lZCBOdW1PcGVyYW5kcyA9IFRJRC0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgaWYgKCFUSUQtPmlzVmFyaWFkaWMoKSkKKyAgICByZXR1cm4gTnVtT3BlcmFuZHM7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gTnVtT3BlcmFuZHMsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc0ltcGxpY2l0KCkpCisgICAgICBOdW1PcGVyYW5kcysrOworICB9CisgIHJldHVybiBOdW1PcGVyYW5kczsKK30KKworCisvLy8gZmluZFJlZ2lzdGVyVXNlT3BlcmFuZElkeCgpIC0gUmV0dXJucyB0aGUgTWFjaGluZU9wZXJhbmQgdGhhdCBpcyBhIHVzZSBvZgorLy8vIHRoZSBzcGVjaWZpYyByZWdpc3RlciBvciAtMSBpZiBpdCBpcyBub3QgZm91bmQuIEl0IGZ1cnRoZXIgdGlnaHRlbnMKKy8vLyB0aGUgc2VhcmNoIGNyaXRlcmlhIHRvIGEgdXNlIHRoYXQga2lsbHMgdGhlIHJlZ2lzdGVyIGlmIGlzS2lsbCBpcyB0cnVlLgoraW50IE1hY2hpbmVJbnN0cjo6ZmluZFJlZ2lzdGVyVXNlT3BlcmFuZElkeCh1bnNpZ25lZCBSZWcsIGJvb2wgaXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzVXNlKCkpCisgICAgICBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBNT1JlZyA9IE1PLmdldFJlZygpOworICAgIGlmICghTU9SZWcpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoTU9SZWcgPT0gUmVnIHx8CisgICAgICAgIChUUkkgJiYKKyAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKE1PUmVnKSAmJgorICAgICAgICAgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSAmJgorICAgICAgICAgVFJJLT5pc1N1YlJlZ2lzdGVyKE1PUmVnLCBSZWcpKSkKKyAgICAgIGlmICghaXNLaWxsIHx8IE1PLmlzS2lsbCgpKQorICAgICAgICByZXR1cm4gaTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKKy8vLyByZWFkc1dyaXRlc1ZpcnR1YWxSZWdpc3RlciAtIFJldHVybiBhIHBhaXIgb2YgYm9vbHMgKHJlYWRzLCB3cml0ZXMpCisvLy8gaW5kaWNhdGluZyBpZiB0aGlzIGluc3RydWN0aW9uIHJlYWRzIG9yIHdyaXRlcyBSZWcuIFRoaXMgYWxzbyBjb25zaWRlcnMKKy8vLyBwYXJ0aWFsIGRlZmluZXMuCitzdGQ6OnBhaXI8Ym9vbCxib29sPgorTWFjaGluZUluc3RyOjpyZWFkc1dyaXRlc1ZpcnR1YWxSZWdpc3Rlcih1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gKk9wcykgY29uc3QgeworICBib29sIFBhcnREZWYgPSBmYWxzZTsgLy8gUGFydGlhbCByZWRlZmluZS4KKyAgYm9vbCBGdWxsRGVmID0gZmFsc2U7IC8vIEZ1bGwgZGVmaW5lLgorICBib29sIFVzZSA9IGZhbHNlOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmdldFJlZygpICE9IFJlZykKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChPcHMpCisgICAgICBPcHMtPnB1c2hfYmFjayhpKTsKKyAgICBpZiAoTU8uaXNVc2UoKSkKKyAgICAgIFVzZSB8PSAhTU8uaXNVbmRlZigpOworICAgIGVsc2UgaWYgKE1PLmdldFN1YlJlZygpKQorICAgICAgUGFydERlZiA9IHRydWU7CisgICAgZWxzZQorICAgICAgRnVsbERlZiA9IHRydWU7CisgIH0KKyAgLy8gQSBwYXJ0aWFsIHJlZGVmaW5lIHVzZXMgUmVnIHVubGVzcyB0aGVyZSBpcyBhbHNvIGEgZnVsbCBkZWZpbmUuCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihVc2UgfHwgKFBhcnREZWYgJiYgIUZ1bGxEZWYpLCBQYXJ0RGVmIHx8IEZ1bGxEZWYpOworfQorCisvLy8gZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeCgpIC0gUmV0dXJucyB0aGUgb3BlcmFuZCBpbmRleCB0aGF0IGlzIGEgZGVmIG9mCisvLy8gdGhlIHNwZWNpZmllZCByZWdpc3RlciBvciAtMSBpZiBpdCBpcyBub3QgZm91bmQuIElmIGlzRGVhZCBpcyB0cnVlLCBkZWZzCisvLy8gdGhhdCBhcmUgbm90IGRlYWQgYXJlIHNraXBwZWQuIElmIFRhcmdldFJlZ2lzdGVySW5mbyBpcyBub24tbnVsbCwgdGhlbiBpdAorLy8vIGFsc28gY2hlY2tzIGlmIHRoZXJlIGlzIGEgZGVmIG9mIGEgc3VwZXItcmVnaXN0ZXIuCitpbnQKK01hY2hpbmVJbnN0cjo6ZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeCh1bnNpZ25lZCBSZWcsIGJvb2wgaXNEZWFkLCBib29sIE92ZXJsYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgYm9vbCBpc1BoeXMgPSBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBnZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNEZWYoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIE1PUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgYm9vbCBGb3VuZCA9IChNT1JlZyA9PSBSZWcpOworICAgIGlmICghRm91bmQgJiYgVFJJICYmIGlzUGh5cyAmJgorICAgICAgICBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihNT1JlZykpIHsKKyAgICAgIGlmIChPdmVybGFwKQorICAgICAgICBGb3VuZCA9IFRSSS0+cmVnc092ZXJsYXAoTU9SZWcsIFJlZyk7CisgICAgICBlbHNlCisgICAgICAgIEZvdW5kID0gVFJJLT5pc1N1YlJlZ2lzdGVyKE1PUmVnLCBSZWcpOworICAgIH0KKyAgICBpZiAoRm91bmQgJiYgKCFpc0RlYWQgfHwgTU8uaXNEZWFkKCkpKQorICAgICAgcmV0dXJuIGk7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisvLy8gZmluZEZpcnN0UHJlZE9wZXJhbmRJZHgoKSAtIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvcGVyYW5kIGluIHRoZQorLy8vIG9wZXJhbmQgbGlzdCB0aGF0IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcmVkaWNhdGUuIEl0IHJldHVybnMgLTEgaWYKKy8vLyBub25lIGlzIGZvdW5kLgoraW50IE1hY2hpbmVJbnN0cjo6ZmluZEZpcnN0UHJlZE9wZXJhbmRJZHgoKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gZ2V0RGVzYygpOworICBpZiAoVElELmlzUHJlZGljYWJsZSgpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFRJRC5PcEluZm9baV0uaXNQcmVkaWNhdGUoKSkKKyAgICAgICAgcmV0dXJuIGk7CisgIH0KKworICByZXR1cm4gLTE7Cit9CisgIAorLy8vIGlzUmVnVGllZFRvVXNlT3BlcmFuZCAtIEdpdmVuIHRoZSBpbmRleCBvZiBhIHJlZ2lzdGVyIGRlZiBvcGVyYW5kLAorLy8vIGNoZWNrIGlmIHRoZSByZWdpc3RlciBkZWYgaXMgdGllZCB0byBhIHNvdXJjZSBvcGVyYW5kLCBkdWUgdG8gZWl0aGVyCisvLy8gdHdvLWFkZHJlc3MgZWxpbWluYXRpb24gb3IgaW5saW5lIGFzc2VtYmx5IGNvbnN0cmFpbnRzLiBSZXR1cm5zIHRoZQorLy8vIGZpcnN0IHRpZWQgdXNlIG9wZXJhbmQgaW5kZXggYnkgcmVmZXJlbmNlIGlzIFVzZU9wSWR4IGlzIG5vdCBudWxsLgorYm9vbCBNYWNoaW5lSW5zdHI6OgoraXNSZWdUaWVkVG9Vc2VPcGVyYW5kKHVuc2lnbmVkIERlZk9wSWR4LCB1bnNpZ25lZCAqVXNlT3BJZHgpIGNvbnN0IHsKKyAgYXNzZXJ0KGdldE9wZXJhbmQoRGVmT3BJZHgpLmlzRGVmKCkgJiYgIkRlZk9wSWR4IGlzIG5vdCBhIGRlZiEiKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBnZXREZXNjKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBnZXRPcGVyYW5kKGkpOworICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmlzVXNlKCkgJiYKKyAgICAgICAgVElELmdldE9wZXJhbmRDb25zdHJhaW50KGksIFRPSTo6VElFRF9UTykgPT0gKGludClEZWZPcElkeCkgeworICAgICAgaWYgKFVzZU9wSWR4KQorICAgICAgICAqVXNlT3BJZHggPSAodW5zaWduZWQpaTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBpc1JlZ1RpZWRUb0RlZk9wZXJhbmQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmFuZCBvZiB0aGUgc3BlY2lmaWVkIGluZGV4CisvLy8gaXMgYSByZWdpc3RlciB1c2UgYW5kIGl0IGlzIHRpZWQgdG8gYW4gZGVmIG9wZXJhbmQuIEl0IGFsc28gcmV0dXJucyB0aGUgZGVmCisvLy8gb3BlcmFuZCBpbmRleCBieSByZWZlcmVuY2UuCitib29sIE1hY2hpbmVJbnN0cjo6Citpc1JlZ1RpZWRUb0RlZk9wZXJhbmQodW5zaWduZWQgVXNlT3BJZHgsIHVuc2lnbmVkICpEZWZPcElkeCkgY29uc3QgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IGdldERlc2MoKTsKKyAgaWYgKFVzZU9wSWR4ID49IFRJRC5nZXROdW1PcGVyYW5kcygpKQorICAgIHJldHVybiBmYWxzZTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gZ2V0T3BlcmFuZChVc2VPcElkeCk7CisgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNVc2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGludCBEZWZJZHggPSBUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoVXNlT3BJZHgsIFRPSTo6VElFRF9UTyk7CisgIGlmIChEZWZJZHggPT0gLTEpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoRGVmT3BJZHgpCisgICAgKkRlZk9wSWR4ID0gKHVuc2lnbmVkKURlZklkeDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBjbGVhcktpbGxJbmZvIC0gQ2xlYXJzIGtpbGwgZmxhZ3Mgb24gYWxsIG9wZXJhbmRzLgorLy8vCit2b2lkIE1hY2hpbmVJbnN0cjo6Y2xlYXJLaWxsSW5mbygpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5pc1VzZSgpKQorICAgICAgTU8uc2V0SXNLaWxsKGZhbHNlKTsKKyAgfQorfQorCisvLy8gY29weUtpbGxEZWFkSW5mbyAtIENvcGllcyBraWxsIC8gZGVhZCBvcGVyYW5kIHByb3BlcnRpZXMgZnJvbSBNSS4KKy8vLwordm9pZCBNYWNoaW5lSW5zdHI6OmNvcHlLaWxsRGVhZEluZm8oY29uc3QgTWFjaGluZUluc3RyICpNSSkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICghTU8uaXNLaWxsKCkgJiYgIU1PLmlzRGVhZCgpKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaiAhPSBlZTsgKytqKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU9wID0gZ2V0T3BlcmFuZChqKTsKKyAgICAgIGlmICghTU9wLmlzSWRlbnRpY2FsVG8oTU8pKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChNTy5pc0tpbGwoKSkKKyAgICAgICAgTU9wLnNldElzS2lsbCgpOworICAgICAgZWxzZQorICAgICAgICBNT3Auc2V0SXNEZWFkKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLy8vIGNvcHlQcmVkaWNhdGVzIC0gQ29waWVzIHByZWRpY2F0ZSBvcGVyYW5kKHMpIGZyb20gTUkuCit2b2lkIE1hY2hpbmVJbnN0cjo6Y29weVByZWRpY2F0ZXMoY29uc3QgTWFjaGluZUluc3RyICpNSSkgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgIGlmICghVElELmlzUHJlZGljYWJsZSgpKQorICAgIHJldHVybjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChUSUQuT3BJbmZvW2ldLmlzUHJlZGljYXRlKCkpIHsKKyAgICAgIC8vIFByZWRpY2F0ZWQgb3BlcmFuZHMgbXVzdCBiZSBsYXN0IG9wZXJhbmRzLgorICAgICAgYWRkT3BlcmFuZChNSS0+Z2V0T3BlcmFuZChpKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgTWFjaGluZUluc3RyOjpzdWJzdGl0dXRlUmVnaXN0ZXIodW5zaWduZWQgRnJvbVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVG9SZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZSZWdJbmZvKSB7CisgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihUb1JlZykpIHsKKyAgICBpZiAoU3ViSWR4KQorICAgICAgVG9SZWcgPSBSZWdJbmZvLmdldFN1YlJlZyhUb1JlZywgU3ViSWR4KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgTU8uZ2V0UmVnKCkgIT0gRnJvbVJlZykKKyAgICAgICAgY29udGludWU7CisgICAgICBNTy5zdWJzdFBoeXNSZWcoVG9SZWcsIFJlZ0luZm8pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgTU8uZ2V0UmVnKCkgIT0gRnJvbVJlZykKKyAgICAgICAgY29udGludWU7CisgICAgICBNTy5zdWJzdFZpcnRSZWcoVG9SZWcsIFN1YklkeCwgUmVnSW5mbyk7CisgICAgfQorICB9Cit9CisKKy8vLyBpc1NhZmVUb01vdmUgLSBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBzYWZlIHRvIG1vdmUgdGhpcyBpbnN0cnVjdGlvbi4gSWYKKy8vLyBTYXdTdG9yZSBpcyBzZXQgdG8gdHJ1ZSwgaXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHN0b3JlIChvciBjYWxsKSBiZXR3ZWVuCisvLy8gdGhlIGluc3RydWN0aW9uJ3MgbG9jYXRpb24gYW5kIGl0cyBpbnRlbmRlZCBkZXN0aW5hdGlvbi4KK2Jvb2wgTWFjaGluZUluc3RyOjppc1NhZmVUb01vdmUoY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZTYXdTdG9yZSkgY29uc3QgeworICAvLyBJZ25vcmUgc3R1ZmYgdGhhdCB3ZSBvYnZpb3VzbHkgY2FuJ3QgbW92ZS4KKyAgaWYgKFRJRC0+bWF5U3RvcmUoKSB8fCBUSUQtPmlzQ2FsbCgpKSB7CisgICAgU2F3U3RvcmUgPSB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoVElELT5pc1Rlcm1pbmF0b3IoKSB8fCBUSUQtPmhhc1VubW9kZWxlZFNpZGVFZmZlY3RzKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFNlZSBpZiB0aGlzIGluc3RydWN0aW9uIGRvZXMgYSBsb2FkLiAgSWYgc28sIHdlIGhhdmUgdG8gZ3VhcmFudGVlIHRoYXQgdGhlCisgIC8vIGxvYWRlZCB2YWx1ZSBkb2Vzbid0IGNoYW5nZSBiZXR3ZWVuIHRoZSBsb2FkIGFuZCB0aGUgaXRzIGludGVuZGVkCisgIC8vIGRlc3RpbmF0aW9uLiBUaGUgY2hlY2sgZm9yIGlzSW52YXJpYW50TG9hZCBnaXZlcyB0aGUgdGFyZ2UgdGhlIGNoYW5jZSB0bworICAvLyBjbGFzc2lmeSB0aGUgbG9hZCBhcyBhbHdheXMgcmV0dXJuaW5nIGEgY29uc3RhbnQsIGUuZy4gYSBjb25zdGFudCBwb29sCisgIC8vIGxvYWQuCisgIGlmIChUSUQtPm1heUxvYWQoKSAmJiAhaXNJbnZhcmlhbnRMb2FkKEFBKSkKKyAgICAvLyBPdGhlcndpc2UsIHRoaXMgaXMgYSByZWFsIGxvYWQuICBJZiB0aGVyZSBpcyBhIHN0b3JlIGJldHdlZW4gdGhlIGxvYWQgYW5kCisgICAgLy8gZW5kIG9mIGJsb2NrLCBvciBpZiB0aGUgbG9hZCBpcyB2b2xhdGlsZSwgd2UgY2FuJ3QgbW92ZSBpdC4KKyAgICByZXR1cm4gIVNhd1N0b3JlICYmICFoYXNWb2xhdGlsZU1lbW9yeVJlZigpOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gaXNTYWZlVG9SZU1hdCAtIFJldHVybiB0cnVlIGlmIGl0J3Mgc2FmZSB0byByZW1hdGVyaWFsaXplIHRoZSBzcGVjaWZpZWQKKy8vLyBpbnN0cnVjdGlvbiB3aGljaCBkZWZpbmVkIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgaW5zdGVhZCBvZiBjb3B5aW5nIGl0LgorYm9vbCBNYWNoaW5lSW5zdHI6OmlzU2FmZVRvUmVNYXQoY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICpBQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdFJlZykgY29uc3QgeworICBib29sIFNhd1N0b3JlID0gZmFsc2U7CisgIGlmICghVElJLT5pc1RyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUodGhpcywgQUEpIHx8CisgICAgICAhaXNTYWZlVG9Nb3ZlKFRJSSwgQUEsIFNhd1N0b3JlKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpKQorICAgICAgY29udGludWU7CisgICAgLy8gRklYTUU6IEZvciBub3csIGRvIG5vdCByZW1hdCBhbnkgaW5zdHJ1Y3Rpb24gd2l0aCByZWdpc3RlciBvcGVyYW5kcy4KKyAgICAvLyBMYXRlciBvbiwgd2UgY2FuIGxvb3NlbiB0aGUgcmVzdHJpY3Rpb24gaXMgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzIGhhdmUKKyAgICAvLyBub3QgYmVlbiBtb2RpZmllZCBiZXR3ZWVuIHRoZSBkZWYgYW5kIHVzZS4gTm90ZSwgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbQorICAgIC8vIE1hY2hpbmVTaW5rIGJlY2F1c2UgdGhlIGNvZGUgaXMgbm8gbG9uZ2VyIGluIHR3by1hZGRyZXNzIGZvcm0gKGF0IGxlYXN0CisgICAgLy8gcGFydGlhbGx5KS4KKyAgICBpZiAoTU8uaXNVc2UoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlIGlmICghTU8uaXNEZWFkKCkgJiYgTU8uZ2V0UmVnKCkgIT0gRHN0UmVnKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gaGFzVm9sYXRpbGVNZW1vcnlSZWYgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIG1heSBoYXZlIGEKKy8vLyB2b2xhdGlsZSBtZW1vcnkgcmVmZXJlbmNlLCBvciBpZiB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUKKy8vLyBtZW1vcnkgcmVmZXJlbmNlIGlzIG5vdCBhdmFpbGFibGUuIFJldHVybiBmYWxzZSBpZiBpdCBpcyBrbm93biB0bworLy8vIGhhdmUgbm8gdm9sYXRpbGUgbWVtb3J5IHJlZmVyZW5jZXMuCitib29sIE1hY2hpbmVJbnN0cjo6aGFzVm9sYXRpbGVNZW1vcnlSZWYoKSBjb25zdCB7CisgIC8vIEFuIGluc3RydWN0aW9uIGtub3duIG5ldmVyIHRvIGFjY2VzcyBtZW1vcnkgd29uJ3QgaGF2ZSBhIHZvbGF0aWxlIGFjY2Vzcy4KKyAgaWYgKCFUSUQtPm1heVN0b3JlKCkgJiYKKyAgICAgICFUSUQtPm1heUxvYWQoKSAmJgorICAgICAgIVRJRC0+aXNDYWxsKCkgJiYKKyAgICAgICFUSUQtPmhhc1VubW9kZWxlZFNpZGVFZmZlY3RzKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE90aGVyd2lzZSwgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBubyBtZW1vcnkgcmVmZXJlbmNlIGluZm9ybWF0aW9uLAorICAvLyBjb25zZXJ2YXRpdmVseSBhc3N1bWUgaXQgd2Fzbid0IHByZXNlcnZlZC4KKyAgaWYgKG1lbW9wZXJhbmRzX2VtcHR5KCkpCisgICAgcmV0dXJuIHRydWU7CisgIAorICAvLyBDaGVjayB0aGUgbWVtb3J5IHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3Igdm9sYXRpbGUgcmVmZXJlbmNlcy4KKyAgZm9yIChtbW9faXRlcmF0b3IgSSA9IG1lbW9wZXJhbmRzX2JlZ2luKCksIEUgPSBtZW1vcGVyYW5kc19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCgqSSktPmlzVm9sYXRpbGUoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzSW52YXJpYW50TG9hZCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgbG9hZGluZyBmcm9tIGEKKy8vLyBsb2NhdGlvbiB3aG9zZSB2YWx1ZSBpcyBpbnZhcmlhbnQgYWNyb3NzIHRoZSBmdW5jdGlvbi4gIEZvciBleGFtcGxlLAorLy8vIGxvYWRpbmcgYSB2YWx1ZSBmcm9tIHRoZSBjb25zdGFudCBwb29sIG9yIGZyb20gdGhlIGFyZ3VtZW50IGFyZWEKKy8vLyBvZiBhIGZ1bmN0aW9uIGlmIGl0IGRvZXMgbm90IGNoYW5nZS4gIFRoaXMgc2hvdWxkIG9ubHkgcmV0dXJuIHRydWUgb2YKKy8vLyAqYWxsKiBsb2FkcyB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBhcmUgaW52YXJpYW50IChpZiBpdCBkb2VzIG11bHRpcGxlIGxvYWRzKS4KK2Jvb2wgTWFjaGluZUluc3RyOjppc0ludmFyaWFudExvYWQoQWxpYXNBbmFseXNpcyAqQUEpIGNvbnN0IHsKKyAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGRvZXNuJ3QgbG9hZCBhdCBhbGwsIGl0IGlzbid0IGFuIGludmFyaWFudCBsb2FkLgorICBpZiAoIVRJRC0+bWF5TG9hZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGxvc3QgaXRzIG1lbW9wZXJhbmRzLCBjb25zZXJ2YXRpdmVseSBhc3N1bWUgdGhhdAorICAvLyBpdCBtYXkgbm90IGJlIGFuIGludmFyaWFudCBsb2FkLgorICBpZiAobWVtb3BlcmFuZHNfZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gZ2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXRGcmFtZUluZm8oKTsKKworICBmb3IgKG1tb19pdGVyYXRvciBJID0gbWVtb3BlcmFuZHNfYmVnaW4oKSwKKyAgICAgICBFID0gbWVtb3BlcmFuZHNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKCgqSSktPmlzVm9sYXRpbGUoKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICgoKkkpLT5pc1N0b3JlKCkpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChjb25zdCBWYWx1ZSAqViA9ICgqSSktPmdldFZhbHVlKCkpIHsKKyAgICAgIC8vIEEgbG9hZCBmcm9tIGEgY29uc3RhbnQgUHNldWRvU291cmNlVmFsdWUgaXMgaW52YXJpYW50LgorICAgICAgaWYgKGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpQU1YgPSBkeW5fY2FzdDxQc2V1ZG9Tb3VyY2VWYWx1ZT4oVikpCisgICAgICAgIGlmIChQU1YtPmlzQ29uc3RhbnQoTUZJKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIElmIHdlIGhhdmUgYW4gQWxpYXNBbmFseXNpcywgYXNrIGl0IHdoZXRoZXIgdGhlIG1lbW9yeSBpcyBjb25zdGFudC4KKyAgICAgIGlmIChBQSAmJiBBQS0+cG9pbnRzVG9Db25zdGFudE1lbW9yeShWKSkKKyAgICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlIGFzc3VtZSBjb25zZXJ2YXRpdmVseS4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBFdmVyeXRoaW5nIGNoZWNrcyBvdXQuCisgIHJldHVybiB0cnVlOworfQorCisvLy8gaXNDb25zdGFudFZhbHVlUEhJIC0gSWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBpcyBhIFBISSB0aGF0IGFsd2F5cworLy8vIG1lcmdlcyB0b2dldGhlciB0aGUgc2FtZSB2aXJ0dWFsIHJlZ2lzdGVyLCByZXR1cm4gdGhlIHJlZ2lzdGVyLCBvdGhlcndpc2UKKy8vLyByZXR1cm4gMC4KK3Vuc2lnbmVkIE1hY2hpbmVJbnN0cjo6aXNDb25zdGFudFZhbHVlUEhJKCkgY29uc3QgeworICBpZiAoIWlzUEhJKCkpCisgICAgcmV0dXJuIDA7CisgIGFzc2VydChnZXROdW1PcGVyYW5kcygpID49IDMgJiYKKyAgICAgICAgICJJdCdzIGlsbGVnYWwgdG8gaGF2ZSBhIFBISSB3aXRob3V0IHNvdXJjZSBvcGVyYW5kcyIpOworCisgIHVuc2lnbmVkIFJlZyA9IGdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDMsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpIDwgZTsgaSArPSAyKQorICAgIGlmIChnZXRPcGVyYW5kKGkpLmdldFJlZygpICE9IFJlZykKKyAgICAgIHJldHVybiAwOworICByZXR1cm4gUmVnOworfQorCisvLy8gYWxsRGVmc0FyZURlYWQgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgdGhlIGRlZnMgb2YgdGhpcyBpbnN0cnVjdGlvbiBhcmUgZGVhZC4KKy8vLworYm9vbCBNYWNoaW5lSW5zdHI6OmFsbERlZnNBcmVEZWFkKCkgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSA8IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmlzVXNlKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIU1PLmlzRGVhZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIE1hY2hpbmVJbnN0cjo6ZHVtcCgpIGNvbnN0IHsKKyAgZGJncygpIDw8ICIgICIgPDwgKnRoaXM7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50RGVidWdMb2MoRGVidWdMb2MgREwsIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZDb21tZW50T1MpIHsKKyAgY29uc3QgTExWTUNvbnRleHQgJkN0eCA9IE1GLT5nZXRGdW5jdGlvbigpLT5nZXRDb250ZXh0KCk7CisgIGlmICghREwuaXNVbmtub3duKCkpIHsgICAgICAgICAgLy8gUHJpbnQgc291cmNlIGxpbmUgaW5mby4KKyAgICBESVNjb3BlIFNjb3BlKERMLmdldFNjb3BlKEN0eCkpOworICAgIC8vIE9taXQgdGhlIGRpcmVjdG9yeSwgYmVjYXVzZSBpdCdzIGxpa2VseSB0byBiZSBsb25nIGFuZCB1bmludGVyZXN0aW5nLgorICAgIGlmIChTY29wZS5WZXJpZnkoKSkKKyAgICAgIENvbW1lbnRPUyA8PCBTY29wZS5nZXRGaWxlbmFtZSgpOworICAgIGVsc2UKKyAgICAgIENvbW1lbnRPUyA8PCAiPHVua25vd24+IjsKKyAgICBDb21tZW50T1MgPDwgJzonIDw8IERMLmdldExpbmUoKTsKKyAgICBpZiAoREwuZ2V0Q29sKCkgIT0gMCkKKyAgICAgIENvbW1lbnRPUyA8PCAnOicgPDwgREwuZ2V0Q29sKCk7CisgICAgRGVidWdMb2MgSW5saW5lZEF0REwgPSBEZWJ1Z0xvYzo6Z2V0RnJvbURJTG9jYXRpb24oREwuZ2V0SW5saW5lZEF0KEN0eCkpOworICAgIGlmICghSW5saW5lZEF0REwuaXNVbmtub3duKCkpIHsKKyAgICAgIENvbW1lbnRPUyA8PCAiIEBbICI7CisgICAgICBwcmludERlYnVnTG9jKElubGluZWRBdERMLCBNRiwgQ29tbWVudE9TKTsKKyAgICAgIENvbW1lbnRPUyA8PCAiIF0iOworICAgIH0KKyAgfQorfQorCit2b2lkIE1hY2hpbmVJbnN0cjo6cHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBUYXJnZXRNYWNoaW5lICpUTSkgY29uc3QgeworICAvLyBXZSBjYW4gYmUgYSBiaXQgdGlkaWVyIGlmIHdlIGtub3cgdGhlIFRhcmdldE1hY2hpbmUgYW5kL29yIE1hY2hpbmVGdW5jdGlvbi4KKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IDA7CisgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSA9IDA7CisgIGlmIChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gZ2V0UGFyZW50KCkpIHsKKyAgICBNRiA9IE1CQi0+Z2V0UGFyZW50KCk7CisgICAgaWYgKCFUTSAmJiBNRikKKyAgICAgIFRNID0gJk1GLT5nZXRUYXJnZXQoKTsKKyAgICBpZiAoTUYpCisgICAgICBNUkkgPSAmTUYtPmdldFJlZ0luZm8oKTsKKyAgfQorCisgIC8vIFNhdmUgYSBsaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzLgorICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgOD4gVmlydFJlZ3M7CisKKyAgLy8gUHJpbnQgZXhwbGljaXRseSBkZWZpbmVkIG9wZXJhbmRzIG9uIHRoZSBsZWZ0IG9mIGFuIGFzc2lnbm1lbnQgc3ludGF4LgorICB1bnNpZ25lZCBTdGFydE9wID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7CisgIGZvciAoOyBTdGFydE9wIDwgZSAmJiBnZXRPcGVyYW5kKFN0YXJ0T3ApLmlzUmVnKCkgJiYKKyAgICAgICAgIGdldE9wZXJhbmQoU3RhcnRPcCkuaXNEZWYoKSAmJgorICAgICAgICAgIWdldE9wZXJhbmQoU3RhcnRPcCkuaXNJbXBsaWNpdCgpOworICAgICAgICsrU3RhcnRPcCkgeworICAgIGlmIChTdGFydE9wICE9IDApIE9TIDw8ICIsICI7CisgICAgZ2V0T3BlcmFuZChTdGFydE9wKS5wcmludChPUywgVE0pOworICAgIHVuc2lnbmVkIFJlZyA9IGdldE9wZXJhbmQoU3RhcnRPcCkuZ2V0UmVnKCk7CisgICAgaWYgKFJlZyAmJiBUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZykpCisgICAgICBWaXJ0UmVncy5wdXNoX2JhY2soUmVnKTsKKyAgfQorCisgIGlmIChTdGFydE9wICE9IDApCisgICAgT1MgPDwgIiA9ICI7CisKKyAgLy8gUHJpbnQgdGhlIG9wY29kZSBuYW1lLgorICBPUyA8PCBnZXREZXNjKCkuZ2V0TmFtZSgpOworCisgIC8vIFByaW50IHRoZSByZXN0IG9mIHRoZSBvcGVyYW5kcy4KKyAgYm9vbCBPbWl0dGVkQW55Q2FsbENsb2JiZXJzID0gZmFsc2U7CisgIGJvb2wgRmlyc3RPcCA9IHRydWU7CisgIGZvciAodW5zaWduZWQgaSA9IFN0YXJ0T3AsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisKKyAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5nZXRSZWcoKSAmJgorICAgICAgICBUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKE1PLmdldFJlZygpKSkKKyAgICAgIFZpcnRSZWdzLnB1c2hfYmFjayhNTy5nZXRSZWcoKSk7CisKKyAgICAvLyBPbWl0IGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVycyB3aGljaCBhcmVuJ3QgdXNlZCBhbnl3aGVyZS4gVGhpcyBtYWtlcworICAgIC8vIGNhbGwgaW5zdHJ1Y3Rpb25zIG11Y2ggbGVzcyBub2lzeSBvbiB0YXJnZXRzIHdoZXJlIGNhbGxzIGNsb2JiZXIgbG90cworICAgIC8vIG9mIHJlZ2lzdGVycy4gRG9uJ3QgcmVseSBvbiBNTy5pc0RlYWQoKSBiZWNhdXNlIHdlIG1heSBiZSBjYWxsZWQgYmVmb3JlCisgICAgLy8gTGl2ZVZhcmlhYmxlcyBpcyBydW4sIG9yIHdlIG1heSBiZSBsb29raW5nIGF0IGEgbm9uLWFsbG9jYXRhYmxlIHJlZy4KKyAgICBpZiAoTUYgJiYgZ2V0RGVzYygpLmlzQ2FsbCgpICYmCisgICAgICAgIE1PLmlzUmVnKCkgJiYgTU8uaXNJbXBsaWNpdCgpICYmIE1PLmlzRGVmKCkpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgICAgaWYgKFJlZyAhPSAwICYmIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpIHsKKyAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJID0gTUYtPmdldFJlZ0luZm8oKTsKKyAgICAgICAgaWYgKE1SSS51c2VfZW1wdHkoUmVnKSAmJiAhTVJJLmlzTGl2ZU91dChSZWcpKSB7CisgICAgICAgICAgYm9vbCBIYXNBbGlhc0xpdmUgPSBmYWxzZTsKKyAgICAgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBbGlhcyA9IFRNLT5nZXRSZWdpc3RlckluZm8oKS0+Z2V0QWxpYXNTZXQoUmVnKTsKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWFzUmVnID0gKkFsaWFzOyArK0FsaWFzKQorICAgICAgICAgICAgaWYgKCFNUkkudXNlX2VtcHR5KEFsaWFzUmVnKSB8fCBNUkkuaXNMaXZlT3V0KEFsaWFzUmVnKSkgeworICAgICAgICAgICAgICBIYXNBbGlhc0xpdmUgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIUhhc0FsaWFzTGl2ZSkgeworICAgICAgICAgICAgT21pdHRlZEFueUNhbGxDbG9iYmVycyA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRmlyc3RPcCkgRmlyc3RPcCA9IGZhbHNlOyBlbHNlIE9TIDw8ICIsIjsKKyAgICBPUyA8PCAiICI7CisgICAgaWYgKGkgPCBnZXREZXNjKCkuTnVtT3BlcmFuZHMpIHsKKyAgICAgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICZUT0kgPSBnZXREZXNjKCkuT3BJbmZvW2ldOworICAgICAgaWYgKFRPSS5pc1ByZWRpY2F0ZSgpKQorICAgICAgICBPUyA8PCAicHJlZDoiOworICAgICAgaWYgKFRPSS5pc09wdGlvbmFsRGVmKCkpCisgICAgICAgIE9TIDw8ICJvcHQ6IjsKKyAgICB9CisgICAgaWYgKGlzRGVidWdWYWx1ZSgpICYmIE1PLmlzTWV0YWRhdGEoKSkgeworICAgICAgLy8gUHJldHR5IHByaW50IERCR19WQUxVRSBpbnN0cnVjdGlvbnMuCisgICAgICBjb25zdCBNRE5vZGUgKk1EID0gTU8uZ2V0TWV0YWRhdGEoKTsKKyAgICAgIGlmIChjb25zdCBNRFN0cmluZyAqTURTID0gZHluX2Nhc3Q8TURTdHJpbmc+KE1ELT5nZXRPcGVyYW5kKDIpKSkKKyAgICAgICAgT1MgPDwgIiFcIiIgPDwgTURTLT5nZXRTdHJpbmcoKSA8PCAnXCInOworICAgICAgZWxzZQorICAgICAgICBNTy5wcmludChPUywgVE0pOworICAgIH0gZWxzZSBpZiAoVE0gJiYgKGlzSW5zZXJ0U3VicmVnKCkgfHwgaXNSZWdTZXF1ZW5jZSgpKSAmJiBNTy5pc0ltbSgpKSB7CisgICAgICBPUyA8PCBUTS0+Z2V0UmVnaXN0ZXJJbmZvKCktPmdldFN1YlJlZ0luZGV4TmFtZShNTy5nZXRJbW0oKSk7CisgICAgfSBlbHNlCisgICAgICBNTy5wcmludChPUywgVE0pOworICB9CisKKyAgLy8gQnJpZWZseSBpbmRpY2F0ZSB3aGV0aGVyIGFueSBjYWxsIGNsb2JiZXJzIHdlcmUgb21pdHRlZC4KKyAgaWYgKE9taXR0ZWRBbnlDYWxsQ2xvYmJlcnMpIHsKKyAgICBpZiAoIUZpcnN0T3ApIE9TIDw8ICIsIjsKKyAgICBPUyA8PCAiIC4uLiI7CisgIH0KKworICBib29sIEhhdmVTZW1pID0gZmFsc2U7CisgIGlmICghbWVtb3BlcmFuZHNfZW1wdHkoKSkgeworICAgIGlmICghSGF2ZVNlbWkpIE9TIDw8ICI7IjsgSGF2ZVNlbWkgPSB0cnVlOworCisgICAgT1MgPDwgIiBtZW06IjsKKyAgICBmb3IgKG1tb19pdGVyYXRvciBpID0gbWVtb3BlcmFuZHNfYmVnaW4oKSwgZSA9IG1lbW9wZXJhbmRzX2VuZCgpOworICAgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICAgIE9TIDw8ICoqaTsKKyAgICAgIGlmIChsbHZtOjpuZXh0KGkpICE9IGUpCisgICAgICAgIE9TIDw8ICIgIjsKKyAgICB9CisgIH0KKworICAvLyBQcmludCB0aGUgcmVnY2xhc3Mgb2YgYW55IHZpcnR1YWwgcmVnaXN0ZXJzIGVuY291bnRlcmVkLgorICBpZiAoTVJJICYmICFWaXJ0UmVncy5lbXB0eSgpKSB7CisgICAgaWYgKCFIYXZlU2VtaSkgT1MgPDwgIjsiOyBIYXZlU2VtaSA9IHRydWU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBWaXJ0UmVncy5zaXplKCk7ICsraSkgeworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBNUkktPmdldFJlZ0NsYXNzKFZpcnRSZWdzW2ldKTsKKyAgICAgIE9TIDw8ICIgIiA8PCBSQy0+Z2V0TmFtZSgpIDw8ICI6JXJlZyIgPDwgVmlydFJlZ3NbaV07CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSBpKzE7IGogIT0gVmlydFJlZ3Muc2l6ZSgpOykgeworICAgICAgICBpZiAoTVJJLT5nZXRSZWdDbGFzcyhWaXJ0UmVnc1tqXSkgIT0gUkMpIHsKKyAgICAgICAgICArK2o7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFZpcnRSZWdzW2ldICE9IFZpcnRSZWdzW2pdKQorICAgICAgICAgIE9TIDw8ICIsIiA8PCBWaXJ0UmVnc1tqXTsKKyAgICAgICAgVmlydFJlZ3MuZXJhc2UoVmlydFJlZ3MuYmVnaW4oKStqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIWRlYnVnTG9jLmlzVW5rbm93bigpICYmIE1GKSB7CisgICAgaWYgKCFIYXZlU2VtaSkgT1MgPDwgIjsiOworICAgIE9TIDw8ICIgZGJnOiI7CisgICAgcHJpbnREZWJ1Z0xvYyhkZWJ1Z0xvYywgTUYsIE9TKTsKKyAgfQorCisgIE9TIDw8ICJcbiI7Cit9CisKK2Jvb2wgTWFjaGluZUluc3RyOjphZGRSZWdpc3RlcktpbGxlZCh1bnNpZ25lZCBJbmNvbWluZ1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJlZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRJZk5vdEZvdW5kKSB7CisgIGJvb2wgaXNQaHlzUmVnID0gVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoSW5jb21pbmdSZWcpOworICBib29sIGhhc0FsaWFzZXMgPSBpc1BoeXNSZWcgJiYgUmVnSW5mby0+Z2V0QWxpYXNTZXQoSW5jb21pbmdSZWcpOworICBib29sIEZvdW5kID0gZmFsc2U7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLDQ+IERlYWRPcHM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc1VzZSgpIHx8IE1PLmlzVW5kZWYoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmICghUmVnKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoUmVnID09IEluY29taW5nUmVnKSB7CisgICAgICBpZiAoIUZvdW5kKSB7CisgICAgICAgIGlmIChNTy5pc0tpbGwoKSkKKyAgICAgICAgICAvLyBUaGUgcmVnaXN0ZXIgaXMgYWxyZWFkeSBtYXJrZWQga2lsbC4KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlzUGh5c1JlZyAmJiBpc1JlZ1RpZWRUb0RlZk9wZXJhbmQoaSkpCisgICAgICAgICAgLy8gVHdvLWFkZHJlc3MgdXNlcyBvZiBwaHlzcmVncyBtdXN0IG5vdCBiZSBtYXJrZWQga2lsbC4KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgTU8uc2V0SXNLaWxsKCk7CisgICAgICAgIEZvdW5kID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGhhc0FsaWFzZXMgJiYgTU8uaXNLaWxsKCkgJiYKKyAgICAgICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpIHsKKyAgICAgIC8vIEEgc3VwZXItcmVnaXN0ZXIga2lsbCBhbHJlYWR5IGV4aXN0cy4KKyAgICAgIGlmIChSZWdJbmZvLT5pc1N1cGVyUmVnaXN0ZXIoSW5jb21pbmdSZWcsIFJlZykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKFJlZ0luZm8tPmlzU3ViUmVnaXN0ZXIoSW5jb21pbmdSZWcsIFJlZykpCisgICAgICAgIERlYWRPcHMucHVzaF9iYWNrKGkpOworICAgIH0KKyAgfQorCisgIC8vIFRyaW0gdW5uZWVkZWQga2lsbCBvcGVyYW5kcy4KKyAgd2hpbGUgKCFEZWFkT3BzLmVtcHR5KCkpIHsKKyAgICB1bnNpZ25lZCBPcElkeCA9IERlYWRPcHMuYmFjaygpOworICAgIGlmIChnZXRPcGVyYW5kKE9wSWR4KS5pc0ltcGxpY2l0KCkpCisgICAgICBSZW1vdmVPcGVyYW5kKE9wSWR4KTsKKyAgICBlbHNlCisgICAgICBnZXRPcGVyYW5kKE9wSWR4KS5zZXRJc0tpbGwoZmFsc2UpOworICAgIERlYWRPcHMucG9wX2JhY2soKTsKKyAgfQorCisgIC8vIElmIG5vdCBmb3VuZCwgdGhpcyBtZWFucyBhbiBhbGlhcyBvZiBvbmUgb2YgdGhlIG9wZXJhbmRzIGlzIGtpbGxlZC4gQWRkIGEKKyAgLy8gbmV3IGltcGxpY2l0IG9wZXJhbmQgaWYgcmVxdWlyZWQuCisgIGlmICghRm91bmQgJiYgQWRkSWZOb3RGb3VuZCkgeworICAgIGFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhJbmNvbWluZ1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypJc0RlZiovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAvKklzSW1wKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC8qSXNLaWxsKi8pKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gRm91bmQ7Cit9CisKK2Jvb2wgTWFjaGluZUluc3RyOjphZGRSZWdpc3RlckRlYWQodW5zaWduZWQgSW5jb21pbmdSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUmVnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRJZk5vdEZvdW5kKSB7CisgIGJvb2wgaXNQaHlzUmVnID0gVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoSW5jb21pbmdSZWcpOworICBib29sIGhhc0FsaWFzZXMgPSBpc1BoeXNSZWcgJiYgUmVnSW5mby0+Z2V0QWxpYXNTZXQoSW5jb21pbmdSZWcpOworICBib29sIEZvdW5kID0gZmFsc2U7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLDQ+IERlYWRPcHM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc0RlZigpKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKCFSZWcpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChSZWcgPT0gSW5jb21pbmdSZWcpIHsKKyAgICAgIGlmICghRm91bmQpIHsKKyAgICAgICAgaWYgKE1PLmlzRGVhZCgpKQorICAgICAgICAgIC8vIFRoZSByZWdpc3RlciBpcyBhbHJlYWR5IG1hcmtlZCBkZWFkLgorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBNTy5zZXRJc0RlYWQoKTsKKyAgICAgICAgRm91bmQgPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaGFzQWxpYXNlcyAmJiBNTy5pc0RlYWQoKSAmJgorICAgICAgICAgICAgICAgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkgeworICAgICAgLy8gVGhlcmUgZXhpc3RzIGEgc3VwZXItcmVnaXN0ZXIgdGhhdCdzIG1hcmtlZCBkZWFkLgorICAgICAgaWYgKFJlZ0luZm8tPmlzU3VwZXJSZWdpc3RlcihJbmNvbWluZ1JlZywgUmVnKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBpZiAoUmVnSW5mby0+Z2V0U3ViUmVnaXN0ZXJzKEluY29taW5nUmVnKSAmJgorICAgICAgICAgIFJlZ0luZm8tPmdldFN1cGVyUmVnaXN0ZXJzKFJlZykgJiYKKyAgICAgICAgICBSZWdJbmZvLT5pc1N1YlJlZ2lzdGVyKEluY29taW5nUmVnLCBSZWcpKQorICAgICAgICBEZWFkT3BzLnB1c2hfYmFjayhpKTsKKyAgICB9CisgIH0KKworICAvLyBUcmltIHVubmVlZGVkIGRlYWQgb3BlcmFuZHMuCisgIHdoaWxlICghRGVhZE9wcy5lbXB0eSgpKSB7CisgICAgdW5zaWduZWQgT3BJZHggPSBEZWFkT3BzLmJhY2soKTsKKyAgICBpZiAoZ2V0T3BlcmFuZChPcElkeCkuaXNJbXBsaWNpdCgpKQorICAgICAgUmVtb3ZlT3BlcmFuZChPcElkeCk7CisgICAgZWxzZQorICAgICAgZ2V0T3BlcmFuZChPcElkeCkuc2V0SXNEZWFkKGZhbHNlKTsKKyAgICBEZWFkT3BzLnBvcF9iYWNrKCk7CisgIH0KKworICAvLyBJZiBub3QgZm91bmQsIHRoaXMgbWVhbnMgYW4gYWxpYXMgb2Ygb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBkZWFkLiBBZGQgYQorICAvLyBuZXcgaW1wbGljaXQgb3BlcmFuZCBpZiByZXF1aXJlZC4KKyAgaWYgKEZvdW5kIHx8ICFBZGRJZk5vdEZvdW5kKQorICAgIHJldHVybiBGb3VuZDsKKyAgICAKKyAgYWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKEluY29taW5nUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLypJc0RlZiovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLypJc0ltcCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypJc0tpbGwqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC8qSXNEZWFkKi8pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWFjaGluZUluc3RyOjphZGRSZWdpc3RlckRlZmluZWQodW5zaWduZWQgSW5jb21pbmdSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUmVnSW5mbykgeworICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoSW5jb21pbmdSZWcpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgKk1PID0gZmluZFJlZ2lzdGVyRGVmT3BlcmFuZChJbmNvbWluZ1JlZywgZmFsc2UsIFJlZ0luZm8pOworICAgIGlmIChNTykKKyAgICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5nZXRSZWcoKSA9PSBJbmNvbWluZ1JlZyAmJiBNTy5pc0RlZigpICYmCisgICAgICAgICAgTU8uZ2V0U3ViUmVnKCkgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBhZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWcoSW5jb21pbmdSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAvKklzRGVmKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAvKklzSW1wKi8pKTsKK30KKwordm9pZCBNYWNoaW5lSW5zdHI6OnNldFBoeXNSZWdzRGVhZEV4Y2VwdChjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZVc2VkUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzRGVmKCkpIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChSZWcgPT0gMCkgY29udGludWU7CisgICAgYm9vbCBEZWFkID0gdHJ1ZTsKKyAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIEkgPSBVc2VkUmVncy5iZWdpbigpLAorICAgICAgICAgRSA9IFVzZWRSZWdzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmIChUUkkucmVnc092ZXJsYXAoKkksIFJlZykpIHsKKyAgICAgICAgRGVhZCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAvLyBJZiB0aGVyZSBhcmUgbm8gdXNlcywgaW5jbHVkaW5nIHBhcnRpYWwgdXNlcywgdGhlIGRlZiBpcyBkZWFkLgorICAgIGlmIChEZWFkKSBNTy5zZXRJc0RlYWQoKTsKKyAgfQorfQorCit1bnNpZ25lZAorTWFjaGluZUluc3RyRXhwcmVzc2lvblRyYWl0OjpnZXRIYXNoVmFsdWUoY29uc3QgTWFjaGluZUluc3RyKiBjb25zdCAmTUkpIHsKKyAgdW5zaWduZWQgSGFzaCA9IE1JLT5nZXRPcGNvZGUoKSAqIDM3OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgdWludDY0X3QgS2V5ID0gKHVpbnQ2NF90KU1PLmdldFR5cGUoKSA8PCAzMjsKKyAgICBzd2l0Y2ggKE1PLmdldFR5cGUoKSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyOgorICAgICAgaWYgKE1PLmlzRGVmKCkgJiYgTU8uZ2V0UmVnKCkgJiYKKyAgICAgICAgICBUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKE1PLmdldFJlZygpKSkKKyAgICAgICAgY29udGludWU7ICAvLyBTa2lwIHZpcnR1YWwgcmVnaXN0ZXIgZGVmcy4KKyAgICAgIEtleSB8PSBNTy5nZXRSZWcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ltbWVkaWF0ZToKKyAgICAgIEtleSB8PSBNTy5nZXRJbW0oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ZyYW1lSW5kZXg6CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fQ29uc3RhbnRQb29sSW5kZXg6CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgICBLZXkgfD0gTU8uZ2V0SW5kZXgoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrOgorICAgICAgS2V5IHw9IERlbnNlTWFwSW5mbzx2b2lkKj46OmdldEhhc2hWYWx1ZShNTy5nZXRNQkIoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOgorICAgICAgS2V5IHw9IERlbnNlTWFwSW5mbzx2b2lkKj46OmdldEhhc2hWYWx1ZShNTy5nZXRHbG9iYWwoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19CbG9ja0FkZHJlc3M6CisgICAgICBLZXkgfD0gRGVuc2VNYXBJbmZvPHZvaWQqPjo6Z2V0SGFzaFZhbHVlKE1PLmdldEJsb2NrQWRkcmVzcygpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01DU3ltYm9sOgorICAgICAgS2V5IHw9IERlbnNlTWFwSW5mbzx2b2lkKj46OmdldEhhc2hWYWx1ZShNTy5nZXRNQ1N5bWJvbCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBLZXkgKz0gfihLZXkgPDwgMzIpOworICAgIEtleSBePSAoS2V5ID4+IDIyKTsKKyAgICBLZXkgKz0gfihLZXkgPDwgMTMpOworICAgIEtleSBePSAoS2V5ID4+IDgpOworICAgIEtleSArPSAoS2V5IDw8IDMpOworICAgIEtleSBePSAoS2V5ID4+IDE1KTsKKyAgICBLZXkgKz0gfihLZXkgPDwgMjcpOworICAgIEtleSBePSAoS2V5ID4+IDMxKTsKKyAgICBIYXNoID0gKHVuc2lnbmVkKUtleSArIEhhc2ggKiAzNzsKKyAgfQorICByZXR1cm4gSGFzaDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVMSUNNLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVMSUNNLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTc0Yjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUxJQ00uY3BwCkBAIC0wLDAgKzEsODQyIEBACisvLz09PS0tIE1hY2hpbmVMSUNNLmNwcCAtIE1hY2hpbmUgTG9vcCBJbnZhcmlhbnQgQ29kZSBNb3Rpb24gUGFzcyAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBwZXJmb3JtcyBsb29wIGludmFyaWFudCBjb2RlIG1vdGlvbiBvbiBtYWNoaW5lIGluc3RydWN0aW9ucy4gV2UKKy8vIGF0dGVtcHQgdG8gcmVtb3ZlIGFzIG11Y2ggY29kZSBmcm9tIHRoZSBib2R5IG9mIGEgbG9vcCBhcyBwb3NzaWJsZS4KKy8vCisvLyBUaGlzIHBhc3MgZG9lcyBub3QgYXR0ZW1wdCB0byB0aHJvdHRsZSBpdHNlbGYgdG8gbGltaXQgcmVnaXN0ZXIgcHJlc3N1cmUuCisvLyBUaGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiBwaGFzZXMgYXJlIGV4cGVjdGVkIHRvIHBlcmZvcm0gcmVtYXRlcmlhbGl6YXRpb24KKy8vIHRvIHJlY292ZXIgd2hlbiByZWdpc3RlciBwcmVzc3VyZSBpcyBoaWdoLgorLy8KKy8vIFRoaXMgcGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBvciBhIGNvbXBsZXRlIGFsdGVybmF0aXZlCisvLyBmb3IgdGhlIExMVk0tSVItbGV2ZWwgTElDTSBwYXNzLiBJdCBpcyBvbmx5IGRlc2lnbmVkIHRvIGhvaXN0IHNpbXBsZQorLy8gY29uc3RydWN0cyB0aGF0IGFyZSBub3QgZXhwb3NlZCBiZWZvcmUgbG93ZXJpbmcgYW5kIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgIm1hY2hpbmUtbGljbSIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUhvaXN0ZWQsICJOdW1iZXIgb2YgbWFjaGluZSBpbnN0cnVjdGlvbnMgaG9pc3RlZCBvdXQgb2YgbG9vcHMiKTsKK1NUQVRJU1RJQyhOdW1DU0VlZCwgICAiTnVtYmVyIG9mIGhvaXN0ZWQgbWFjaGluZSBpbnN0cnVjdGlvbnMgQ1NFZWQiKTsKK1NUQVRJU1RJQyhOdW1Qb3N0UkFIb2lzdGVkLAorICAgICAgICAgICJOdW1iZXIgb2YgbWFjaGluZSBpbnN0cnVjdGlvbnMgaG9pc3RlZCBvdXQgb2YgbG9vcHMgcG9zdCByZWdhbGxvYyIpOworCituYW1lc3BhY2UgeworICBjbGFzcyBNYWNoaW5lTElDTSA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBib29sIFByZVJlZ0FsbG9jOworCisgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAgICpUTTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkk7CisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAqUmVnSW5mbzsKKworICAgIC8vIFZhcmlvdXMgYW5hbHlzZXMgdGhhdCB3ZSB1c2UuLi4KKyAgICBBbGlhc0FuYWx5c2lzICAgICAgICAqQUE7ICAgICAgLy8gQWxpYXMgYW5hbHlzaXMgaW5mby4KKyAgICBNYWNoaW5lTG9vcEluZm8gICAgICAqTUxJOyAgICAgLy8gQ3VycmVudCBNYWNoaW5lTG9vcEluZm8KKyAgICBNYWNoaW5lRG9taW5hdG9yVHJlZSAqRFQ7ICAgICAgLy8gTWFjaGluZSBkb21pbmF0b3IgdHJlZSBmb3IgdGhlIGN1ciBsb29wCisKKyAgICAvLyBTdGF0ZSB0aGF0IGlzIHVwZGF0ZWQgYXMgd2UgcHJvY2VzcyBsb29wcworICAgIGJvb2wgICAgICAgICBDaGFuZ2VkOyAgICAgICAgICAvLyBUcnVlIGlmIGEgbG9vcCBpcyBjaGFuZ2VkLgorICAgIGJvb2wgICAgICAgICBGaXJzdEluTG9vcDsgICAgICAvLyBUcnVlIGlmIGl0J3MgdGhlIGZpcnN0IExJQ00gaW4gdGhlIGxvb3AuCisgICAgTWFjaGluZUxvb3AgKkN1ckxvb3A7ICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGxvb3Agd2UgYXJlIHdvcmtpbmcgb24uCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkN1clByZWhlYWRlcjsgLy8gVGhlIHByZWhlYWRlciBmb3IgQ3VyTG9vcC4KKworICAgIEJpdFZlY3RvciBBbGxvY2F0YWJsZVNldDsKKworICAgIC8vIEZvciBlYWNoIG9wY29kZSwga2VlcCBhIGxpc3Qgb2YgcG90ZW50aWFsIENTRSBpbnN0cnVjdGlvbnMuCisgICAgRGVuc2VNYXA8dW5zaWduZWQsIHN0ZDo6dmVjdG9yPGNvbnN0IE1hY2hpbmVJbnN0cio+ID4gQ1NFTWFwOworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIE1hY2hpbmVMSUNNKCkgOgorICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCksIFByZVJlZ0FsbG9jKHRydWUpIHt9CisKKyAgICBleHBsaWNpdCBNYWNoaW5lTElDTShib29sIFByZVJBKSA6CisgICAgICBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwgUHJlUmVnQWxsb2MoUHJlUkEpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgICBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJNYWNoaW5lIEluc3RydWN0aW9uIExJQ00iOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQ0ZHKCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lTG9vcEluZm8+KCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPEFsaWFzQW5hbHlzaXM+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZUxvb3BJbmZvPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPE1hY2hpbmVEb21pbmF0b3JUcmVlPigpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7CisgICAgICBDU0VNYXAuY2xlYXIoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gQ2FuZGlkYXRlSW5mbyAtIEtlZXAgdHJhY2sgb2YgaW5mb3JtYXRpb24gYWJvdXQgaG9pc3RpbmcgY2FuZGlkYXRlcy4KKyAgICBzdHJ1Y3QgQ2FuZGlkYXRlSW5mbyB7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JOworICAgICAgdW5zaWduZWQgICAgICBEZWY7CisgICAgICBpbnQgICAgICAgICAgIEZJOworICAgICAgQ2FuZGlkYXRlSW5mbyhNYWNoaW5lSW5zdHIgKm1pLCB1bnNpZ25lZCBkZWYsIGludCBmaSkKKyAgICAgICAgOiBNSShtaSksIERlZihkZWYpLCBGSShmaSkge30KKyAgICB9OworCisgICAgLy8vIEhvaXN0UmVnaW9uUG9zdFJBIC0gV2FsayB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgQ0ZHIGFuZCBob2lzdCBsb29wCisgICAgLy8vIGludmFyaWFudHMgb3V0IHRvIHRoZSBwcmVoZWFkZXIuCisgICAgdm9pZCBIb2lzdFJlZ2lvblBvc3RSQSgpOworCisgICAgLy8vIEhvaXN0UG9zdFJBIC0gV2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBmb3VuZCB0byBvbmx5IHVzZSBsb29wIGludmFyaWFudAorICAgIC8vLyBvcGVyYW5kcyB0aGF0IGlzIHNhZmUgdG8gaG9pc3QsIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkIHRvIGRvIHRoZQorICAgIC8vLyBkaXJ0eSB3b3JrLgorICAgIHZvaWQgSG9pc3RQb3N0UkEoTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgRGVmKTsKKworICAgIC8vLyBQcm9jZXNzTUkgLSBFeGFtaW5lIHRoZSBpbnN0cnVjdGlvbiBmb3IgcG90ZW50YWkgTElDTSBjYW5kaWRhdGUuIEFsc28KKyAgICAvLy8gZ2F0aGVyIHJlZ2lzdGVyIGRlZiBhbmQgZnJhbWUgb2JqZWN0IHVwZGF0ZSBpbmZvcm1hdGlvbi4KKyAgICB2b2lkIFByb2Nlc3NNSShNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCAqUGh5c1JlZ0RlZnMsCisgICAgICAgICAgICAgICAgICAgU21hbGxTZXQ8aW50LCAzMj4gJlN0b3JlZEZJcywKKyAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxDYW5kaWRhdGVJbmZvLCAzMj4gJkNhbmRpZGF0ZXMpOworCisgICAgLy8vIEFkZFRvTGl2ZUlucyAtIEFkZCByZWdpc3RlciAnUmVnJyB0byB0aGUgbGl2ZWluIHNldHMgb2YgQkJzIGluIHRoZQorICAgIC8vLyBjdXJyZW50IGxvb3AuCisgICAgdm9pZCBBZGRUb0xpdmVJbnModW5zaWduZWQgUmVnKTsKKworICAgIC8vLyBJc0xJQ01DYW5kaWRhdGUgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIG1heSBiZSBhIHN1aXRhYmxlCisgICAgLy8vIGNhbmRpZGF0ZSBmb3IgTElDTS4gZS5nLiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBjYWxsLCB0aGVuIGl0J3MKKyAgICAvLy8gb2J2aW91c2x5IG5vdCBzYWZlIHRvIGhvaXN0IGl0LgorICAgIGJvb2wgSXNMSUNNQ2FuZGlkYXRlKE1hY2hpbmVJbnN0ciAmSSk7CisKKyAgICAvLy8gSXNMb29wSW52YXJpYW50SW5zdCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbG9vcAorICAgIC8vLyBpbnZhcmlhbnQuIEkuZS4sIGFsbCB2aXJ0dWFsIHJlZ2lzdGVyIG9wZXJhbmRzIGFyZSBkZWZpbmVkIG91dHNpZGUgb2YKKyAgICAvLy8gdGhlIGxvb3AsIHBoeXNpY2FsIHJlZ2lzdGVycyBhcmVuJ3QgYWNjZXNzZWQgKGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSksCisgICAgLy8vIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gaXMgaG9pc3RhYmxlLgorICAgIC8vLyAKKyAgICBib29sIElzTG9vcEludmFyaWFudEluc3QoTWFjaGluZUluc3RyICZJKTsKKworICAgIC8vLyBJc1Byb2ZpdGFibGVUb0hvaXN0IC0gUmV0dXJuIHRydWUgaWYgaXQgaXMgcG90ZW50aWFsbHkgcHJvZml0YWJsZSB0bworICAgIC8vLyBob2lzdCB0aGUgZ2l2ZW4gbG9vcCBpbnZhcmlhbnQuCisgICAgYm9vbCBJc1Byb2ZpdGFibGVUb0hvaXN0KE1hY2hpbmVJbnN0ciAmTUkpOworCisgICAgLy8vIEhvaXN0UmVnaW9uIC0gV2FsayB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgQ0ZHIChkZWZpbmVkIGJ5IGFsbAorICAgIC8vLyBibG9ja3MgZG9taW5hdGVkIGJ5IHRoZSBzcGVjaWZpZWQgYmxvY2ssIGFuZCB0aGF0IGFyZSBpbiB0aGUgY3VycmVudAorICAgIC8vLyBsb29wKSBpbiBkZXB0aCBmaXJzdCBvcmRlciB3LnIudCB0aGUgRG9taW5hdG9yVHJlZS4gVGhpcyBhbGxvd3MgdXMgdG8KKyAgICAvLy8gdmlzaXQgZGVmaW5pdGlvbnMgYmVmb3JlIHVzZXMsIGFsbG93aW5nIHVzIHRvIGhvaXN0IGEgbG9vcCBib2R5IGluIG9uZQorICAgIC8vLyBwYXNzIHdpdGhvdXQgaXRlcmF0aW9uLgorICAgIC8vLworICAgIHZvaWQgSG9pc3RSZWdpb24oTWFjaGluZURvbVRyZWVOb2RlICpOKTsKKworICAgIC8vLyBpc0xvYWRGcm9tQ29uc3RhbnRNZW1vcnkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gaXMgYQorICAgIC8vLyBsb2FkIGZyb20gY29uc3RhbnQgbWVtb3J5LgorICAgIGJvb2wgaXNMb2FkRnJvbUNvbnN0YW50TWVtb3J5KE1hY2hpbmVJbnN0ciAqTUkpOworCisgICAgLy8vIEV4dHJhY3RIb2lzdGFibGVMb2FkIC0gVW5mb2xkIGEgbG9hZCBmcm9tIHRoZSBnaXZlbiBtYWNoaW5laW5zdHIgaWYKKyAgICAvLy8gdGhlIGxvYWQgaXRzZWxmIGNvdWxkIGJlIGhvaXN0ZWQuIFJldHVybiB0aGUgdW5mb2xkZWQgYW5kIGhvaXN0YWJsZQorICAgIC8vLyBsb2FkLCBvciBudWxsIGlmIHRoZSBsb2FkIGNvdWxkbid0IGJlIHVuZm9sZGVkIG9yIGlmIGl0IHdvdWxkbid0CisgICAgLy8vIGJlIGhvaXN0YWJsZS4KKyAgICBNYWNoaW5lSW5zdHIgKkV4dHJhY3RIb2lzdGFibGVMb2FkKE1hY2hpbmVJbnN0ciAqTUkpOworCisgICAgLy8vIExvb2tGb3JEdXBsaWNhdGUgLSBGaW5kIGFuIGluc3RydWN0aW9uIGFtb3VudCBQcmV2TUlzIHRoYXQgaXMgYQorICAgIC8vLyBkdXBsaWNhdGUgb2YgTUkuIFJldHVybiB0aGlzIGluc3RydWN0aW9uIGlmIGl0J3MgZm91bmQuCisgICAgY29uc3QgTWFjaGluZUluc3RyICpMb29rRm9yRHVwbGljYXRlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgTWFjaGluZUluc3RyKj4gJlByZXZNSXMpOworCisgICAgLy8vIEVsaW1pbmF0ZUNTRSAtIEdpdmVuIGEgTElDTSdlZCBpbnN0cnVjdGlvbiwgbG9vayBmb3IgYW4gaW5zdHJ1Y3Rpb24gb24KKyAgICAvLy8gdGhlIHByZWhlYWRlciB0aGF0IGNvbXB1dGUgdGhlIHNhbWUgdmFsdWUuIElmIGl0J3MgZm91bmQsIGRvIGEgUkFVIG9uCisgICAgLy8vIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlIGV4aXN0aW5nIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIGhvaXN0aW5nCisgICAgLy8vIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgcHJlaGVhZGVyLgorICAgIGJvb2wgRWxpbWluYXRlQ1NFKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCBzdGQ6OnZlY3Rvcjxjb25zdCBNYWNoaW5lSW5zdHIqPiA+OjppdGVyYXRvciAmQ0kpOworCisgICAgLy8vIEhvaXN0IC0gV2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBmb3VuZCB0byBvbmx5IHVzZSBsb29wIGludmFyaWFudCBvcGVyYW5kcworICAgIC8vLyB0aGF0IGlzIHNhZmUgdG8gaG9pc3QsIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkIHRvIGRvIHRoZSBkaXJ0eSB3b3JrLgorICAgIC8vLworICAgIHZvaWQgSG9pc3QoTWFjaGluZUluc3RyICpNSSk7CisKKyAgICAvLy8gSW5pdENTRU1hcCAtIEluaXRpYWxpemUgdGhlIENTRSBtYXAgd2l0aCBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaW4gdGhlCisgICAgLy8vIGN1cnJlbnQgbG9vcCBwcmVoZWFkZXIgdGhhdCBtYXkgYmVjb21lIGR1cGxpY2F0ZXMgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQKKyAgICAvLy8gYXJlIGhvaXN0ZWQgb3V0IG9mIHRoZSBsb29wLgorICAgIHZvaWQgSW5pdENTRU1hcChNYWNoaW5lQmFzaWNCbG9jayAqQkIpOworCisgICAgLy8vIGdldEN1clByZWhlYWRlciAtIEdldCB0aGUgcHJlaGVhZGVyIGZvciB0aGUgY3VycmVudCBsb29wLCBzcGxpdHRpbmcKKyAgICAvLy8gYSBjcml0aWNhbCBlZGdlIGlmIG5lZWRlZC4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0Q3VyUHJlaGVhZGVyKCk7CisgIH07Cit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2NoYXIgTWFjaGluZUxJQ006OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhNYWNoaW5lTElDTSwgIm1hY2hpbmVsaWNtIiwKKyAgICAgICAgICAgICAgICAiTWFjaGluZSBMb29wIEludmFyaWFudCBDb2RlIE1vdGlvbiIsIGZhbHNlLCBmYWxzZSk7CisKK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlTWFjaGluZUxJQ01QYXNzKGJvb2wgUHJlUmVnQWxsb2MpIHsKKyAgcmV0dXJuIG5ldyBNYWNoaW5lTElDTShQcmVSZWdBbGxvYyk7Cit9CisKKy8vLyBMb29wSXNPdXRlck1vc3RXaXRoUHJlZGVjZXNzb3IgLSBUZXN0IGlmIHRoZSBnaXZlbiBsb29wIGlzIHRoZSBvdXRlci1tb3N0CisvLy8gbG9vcCB0aGF0IGhhcyBhIHVuaXF1ZSBwcmVkZWNlc3Nvci4KK3N0YXRpYyBib29sIExvb3BJc091dGVyTW9zdFdpdGhQcmVkZWNlc3NvcihNYWNoaW5lTG9vcCAqQ3VyTG9vcCkgeworICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgbG9vcCBldmVuIGhhcyBhIHVuaXF1ZSBwcmVkZWNlc3Nvci4KKyAgaWYgKCFDdXJMb29wLT5nZXRMb29wUHJlZGVjZXNzb3IoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIC8vIE9rLCBub3cgY2hlY2sgdG8gc2VlIGlmIGFueSBvZiBpdHMgb3V0ZXIgbG9vcHMgZG8uCisgIGZvciAoTWFjaGluZUxvb3AgKkwgPSBDdXJMb29wLT5nZXRQYXJlbnRMb29wKCk7IEw7IEwgPSBMLT5nZXRQYXJlbnRMb29wKCkpCisgICAgaWYgKEwtPmdldExvb3BQcmVkZWNlc3NvcigpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAvLyBOb25lIG9mIHRoZW0gZGlkLCBzbyB0aGlzIGlzIHRoZSBvdXRlcm1vc3Qgd2l0aCBhIHVuaXF1ZSBwcmVkZWNlc3Nvci4KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFjaGluZUxJQ006OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgaWYgKFByZVJlZ0FsbG9jKQorICAgIERFQlVHKGRiZ3MoKSA8PCAiKioqKioqKiogUHJlLXJlZ2FsbG9jIE1hY2hpbmUgTElDTSAqKioqKioqKlxuIik7CisgIGVsc2UKKyAgICBERUJVRyhkYmdzKCkgPDwgIioqKioqKioqIFBvc3QtcmVnYWxsb2MgTWFjaGluZSBMSUNNICoqKioqKioqXG4iKTsKKworICBDaGFuZ2VkID0gRmlyc3RJbkxvb3AgPSBmYWxzZTsKKyAgVE0gPSAmTUYuZ2V0VGFyZ2V0KCk7CisgIFRJSSA9IFRNLT5nZXRJbnN0ckluZm8oKTsKKyAgVFJJID0gVE0tPmdldFJlZ2lzdGVySW5mbygpOworICBNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgUmVnSW5mbyA9ICZNRi5nZXRSZWdJbmZvKCk7CisgIEFsbG9jYXRhYmxlU2V0ID0gVFJJLT5nZXRBbGxvY2F0YWJsZVNldChNRik7CisKKyAgLy8gR2V0IG91ciBMb29wIGluZm9ybWF0aW9uLi4uCisgIE1MSSA9ICZnZXRBbmFseXNpczxNYWNoaW5lTG9vcEluZm8+KCk7CisgIERUICA9ICZnZXRBbmFseXNpczxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgQUEgID0gJmdldEFuYWx5c2lzPEFsaWFzQW5hbHlzaXM+KCk7CisKKyAgU21hbGxWZWN0b3I8TWFjaGluZUxvb3AgKiwgOD4gV29ya2xpc3QoTUxJLT5iZWdpbigpLCBNTEktPmVuZCgpKTsKKyAgd2hpbGUgKCFXb3JrbGlzdC5lbXB0eSgpKSB7CisgICAgQ3VyTG9vcCA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgIEN1clByZWhlYWRlciA9IDA7CisKKyAgICAvLyBJZiB0aGlzIGlzIGRvbmUgYmVmb3JlIHJlZ2FsbG9jLCBvbmx5IHZpc2l0IG91dGVyLW1vc3QgcHJlaGVhZGVyLXNwb3J0aW5nCisgICAgLy8gbG9vcHMuCisgICAgaWYgKFByZVJlZ0FsbG9jICYmICFMb29wSXNPdXRlck1vc3RXaXRoUHJlZGVjZXNzb3IoQ3VyTG9vcCkpIHsKKyAgICAgIFdvcmtsaXN0LmFwcGVuZChDdXJMb29wLT5iZWdpbigpLCBDdXJMb29wLT5lbmQoKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoIVByZVJlZ0FsbG9jKQorICAgICAgSG9pc3RSZWdpb25Qb3N0UkEoKTsKKyAgICBlbHNlIHsKKyAgICAgIC8vIENTRU1hcCBpcyBpbml0aWFsaXplZCBmb3IgbG9vcCBoZWFkZXIgd2hlbiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMKKyAgICAgIC8vIGJlaW5nIGhvaXN0ZWQuCisgICAgICBNYWNoaW5lRG9tVHJlZU5vZGUgKk4gPSBEVC0+Z2V0Tm9kZShDdXJMb29wLT5nZXRIZWFkZXIoKSk7CisgICAgICBGaXJzdEluTG9vcCA9IHRydWU7CisgICAgICBIb2lzdFJlZ2lvbihOKTsKKyAgICAgIENTRU1hcC5jbGVhcigpOworICAgIH0KKyAgfQorCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gSW5zdHJ1Y3Rpb25TdG9yZXNUb0ZJIC0gUmV0dXJuIHRydWUgaWYgaW5zdHJ1Y3Rpb24gc3RvcmVzIHRvIHRoZQorLy8vIHNwZWNpZmllZCBmcmFtZS4KK3N0YXRpYyBib29sIEluc3RydWN0aW9uU3RvcmVzVG9GSShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgRkkpIHsKKyAgZm9yIChNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBvID0gTUktPm1lbW9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICBvZSA9IE1JLT5tZW1vcGVyYW5kc19lbmQoKTsgbyAhPSBvZTsgKytvKSB7CisgICAgaWYgKCEoKm8pLT5pc1N0b3JlKCkgfHwgISgqbyktPmdldFZhbHVlKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoY29uc3QgRml4ZWRTdGFja1BzZXVkb1NvdXJjZVZhbHVlICpWYWx1ZSA9CisgICAgICAgIGR5bl9jYXN0PGNvbnN0IEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZT4oKCpvKS0+Z2V0VmFsdWUoKSkpIHsKKyAgICAgIGlmIChWYWx1ZS0+Z2V0RnJhbWVJbmRleCgpID09IEZJKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUHJvY2Vzc01JIC0gRXhhbWluZSB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHBvdGVudGFpIExJQ00gY2FuZGlkYXRlLiBBbHNvCisvLy8gZ2F0aGVyIHJlZ2lzdGVyIGRlZiBhbmQgZnJhbWUgb2JqZWN0IHVwZGF0ZSBpbmZvcm1hdGlvbi4KK3ZvaWQgTWFjaGluZUxJQ006OlByb2Nlc3NNSShNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpQaHlzUmVnRGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDxpbnQsIDMyPiAmU3RvcmVkRklzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPENhbmRpZGF0ZUluZm8sIDMyPiAmQ2FuZGlkYXRlcykgeworICBib29sIFJ1bGVkT3V0ID0gZmFsc2U7CisgIGJvb2wgSGFzTm9uSW52YXJpYW50VXNlID0gZmFsc2U7CisgIHVuc2lnbmVkIERlZiA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoTU8uaXNGSSgpKSB7CisgICAgICAvLyBSZW1lbWJlciBpZiB0aGUgaW5zdHJ1Y3Rpb24gc3RvcmVzIHRvIHRoZSBmcmFtZSBpbmRleC4KKyAgICAgIGludCBGSSA9IE1PLmdldEluZGV4KCk7CisgICAgICBpZiAoIVN0b3JlZEZJcy5jb3VudChGSSkgJiYKKyAgICAgICAgICBNRkktPmlzU3BpbGxTbG90T2JqZWN0SW5kZXgoRkkpICYmCisgICAgICAgICAgSW5zdHJ1Y3Rpb25TdG9yZXNUb0ZJKE1JLCBGSSkpCisgICAgICAgIFN0b3JlZEZJcy5pbnNlcnQoRkkpOworICAgICAgSGFzTm9uSW52YXJpYW50VXNlID0gdHJ1ZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICghTU8uaXNSZWcoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmICghUmVnKQorICAgICAgY29udGludWU7CisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykgJiYKKyAgICAgICAgICAgIk5vdCBleHBlY3RpbmcgdmlydHVhbCByZWdpc3RlciEiKTsKKworICAgIGlmICghTU8uaXNEZWYoKSkgeworICAgICAgaWYgKFJlZyAmJiBQaHlzUmVnRGVmc1tSZWddKQorICAgICAgICAvLyBJZiBpdCdzIHVzaW5nIGEgbm9uLWxvb3AtaW52YXJpYW50IHJlZ2lzdGVyLCB0aGVuIGl0J3Mgb2J2aW91c2x5IG5vdAorICAgICAgICAvLyBzYWZlIHRvIGhvaXN0LgorICAgICAgICBIYXNOb25JbnZhcmlhbnRVc2UgPSB0cnVlOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKE1PLmlzSW1wbGljaXQoKSkgeworICAgICAgKytQaHlzUmVnRGVmc1tSZWddOworICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBUzsgKytBUykKKyAgICAgICAgKytQaHlzUmVnRGVmc1sqQVNdOworICAgICAgaWYgKCFNTy5pc0RlYWQoKSkKKyAgICAgICAgLy8gTm9uLWRlYWQgaW1wbGljaXQgZGVmPyBUaGlzIGNhbm5vdCBiZSBob2lzdGVkLgorICAgICAgICBSdWxlZE91dCA9IHRydWU7CisgICAgICAvLyBObyBuZWVkIHRvIGNoZWNrIGlmIGEgZGVhZCBpbXBsaWNpdCBkZWYgaXMgYWxzbyBkZWZpbmVkIGJ5CisgICAgICAvLyBhbm90aGVyIGluc3RydWN0aW9uLgorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gRklYTUU6IEZvciBub3csIGF2b2lkIGluc3RydWN0aW9ucyB3aXRoIG11bHRpcGxlIGRlZnMsIHVubGVzcworICAgIC8vIGl0J3MgYSBkZWFkIGltcGxpY2l0IGRlZi4KKyAgICBpZiAoRGVmKQorICAgICAgUnVsZWRPdXQgPSB0cnVlOworICAgIGVsc2UKKyAgICAgIERlZiA9IFJlZzsKKworICAgIC8vIElmIHdlIGhhdmUgYWxyZWFkeSBzZWVuIGFub3RoZXIgaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBzYW1lCisgICAgLy8gcmVnaXN0ZXIsIHRoZW4gdGhpcyBpcyBub3Qgc2FmZS4KKyAgICBpZiAoKytQaHlzUmVnRGVmc1tSZWddID4gMSkKKyAgICAgIC8vIE1JIGRlZmluZWQgcmVnaXN0ZXIgaXMgc2VlbiBkZWZpbmVkIGJ5IGFub3RoZXIgaW5zdHJ1Y3Rpb24gaW4KKyAgICAgIC8vIHRoZSBsb29wLCBpdCBjYW5ub3QgYmUgYSBMSUNNIGNhbmRpZGF0ZS4KKyAgICAgIFJ1bGVkT3V0ID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBUyA9IFRSSS0+Z2V0QWxpYXNTZXQoUmVnKTsgKkFTOyArK0FTKQorICAgICAgaWYgKCsrUGh5c1JlZ0RlZnNbKkFTXSA+IDEpCisgICAgICAgIFJ1bGVkT3V0ID0gdHJ1ZTsKKyAgfQorCisgIC8vIE9ubHkgY29uc2lkZXIgcmVsb2FkcyBmb3Igbm93IGFuZCByZW1hdHMgd2hpY2ggZG8gbm90IGhhdmUgcmVnaXN0ZXIKKyAgLy8gb3BlcmFuZHMuIEZJWE1FOiBDb25zaWRlciB1bmZvbGQgbG9hZCBmb2xkaW5nIGluc3RydWN0aW9ucy4KKyAgaWYgKERlZiAmJiAhUnVsZWRPdXQpIHsKKyAgICBpbnQgRkkgPSBJTlRfTUlOOworICAgIGlmICgoIUhhc05vbkludmFyaWFudFVzZSAmJiBJc0xJQ01DYW5kaWRhdGUoKk1JKSkgfHwKKyAgICAgICAgKFRJSS0+aXNMb2FkRnJvbVN0YWNrU2xvdChNSSwgRkkpICYmIE1GSS0+aXNTcGlsbFNsb3RPYmplY3RJbmRleChGSSkpKQorICAgICAgQ2FuZGlkYXRlcy5wdXNoX2JhY2soQ2FuZGlkYXRlSW5mbyhNSSwgRGVmLCBGSSkpOworICB9Cit9CisKKy8vLyBIb2lzdFJlZ2lvblBvc3RSQSAtIFdhbGsgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgdGhlIENGRyBhbmQgaG9pc3QgbG9vcAorLy8vIGludmFyaWFudHMgb3V0IHRvIHRoZSBwcmVoZWFkZXIuCit2b2lkIE1hY2hpbmVMSUNNOjpIb2lzdFJlZ2lvblBvc3RSQSgpIHsKKyAgdW5zaWduZWQgTnVtUmVncyA9IFRSSS0+Z2V0TnVtUmVncygpOworICB1bnNpZ25lZCAqUGh5c1JlZ0RlZnMgPSBuZXcgdW5zaWduZWRbTnVtUmVnc107CisgIHN0ZDo6ZmlsbChQaHlzUmVnRGVmcywgUGh5c1JlZ0RlZnMgKyBOdW1SZWdzLCAwKTsKKworICBTbWFsbFZlY3RvcjxDYW5kaWRhdGVJbmZvLCAzMj4gQ2FuZGlkYXRlczsKKyAgU21hbGxTZXQ8aW50LCAzMj4gU3RvcmVkRklzOworCisgIC8vIFdhbGsgdGhlIGVudGlyZSByZWdpb24sIGNvdW50IG51bWJlciBvZiBkZWZzIGZvciBlYWNoIHJlZ2lzdGVyLCBhbmQKKyAgLy8gY29sbGVjdCBwb3RlbnRpYWwgTElDTSBjYW5kaWRhdGVzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+IEJsb2NrcyA9IEN1ckxvb3AtPmdldEJsb2NrcygpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQmxvY2tzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIgPSBCbG9ja3NbaV07CisgICAgLy8gQ29uc2VydmF0aXZlbHkgdHJlYXQgbGl2ZS1pbidzIGFzIGFuIGV4dGVybmFsIGRlZi4KKyAgICAvLyBGSVhNRTogVGhhdCBtZWFucyBhIHJlbG9hZCB0aGF0J3JlIHJldXNlZCBpbiBzdWNjZXNzb3IgYmxvY2socykgd2lsbCBub3QKKyAgICAvLyBiZSBMSUNNJ2VkLgorICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmxpdmVpbl9pdGVyYXRvciBJID0gQkItPmxpdmVpbl9iZWdpbigpLAorICAgICAgICAgICBFID0gQkItPmxpdmVpbl9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9ICpJOworICAgICAgKytQaHlzUmVnRGVmc1tSZWddOworICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBUzsgKytBUykKKyAgICAgICAgKytQaHlzUmVnRGVmc1sqQVNdOworICAgIH0KKworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yCisgICAgICAgICAgIE1JSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBNSUkgIT0gRTsgKytNSUkpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqTUkgPSAmKk1JSTsKKyAgICAgIFByb2Nlc3NNSShNSSwgUGh5c1JlZ0RlZnMsIFN0b3JlZEZJcywgQ2FuZGlkYXRlcyk7CisgICAgfQorICB9CisKKyAgLy8gTm93IGV2YWx1YXRlIHdoZXRoZXIgdGhlIHBvdGVudGlhbCBjYW5kaWRhdGVzIHF1YWxpZnkuCisgIC8vIDEuIENoZWNrIGlmIHRoZSBjYW5kaWRhdGUgZGVmaW5lZCByZWdpc3RlciBpcyBkZWZpbmVkIGJ5IGFub3RoZXIKKyAgLy8gICAgaW5zdHJ1Y3Rpb24gaW4gdGhlIGxvb3AuCisgIC8vIDIuIElmIHRoZSBjYW5kaWRhdGUgaXMgYSBsb2FkIGZyb20gc3RhY2sgc2xvdCAoYWx3YXlzIHRydWUgZm9yIG5vdyksCisgIC8vICAgIGNoZWNrIGlmIHRoZSBzbG90IGlzIHN0b3JlZCBhbnl3aGVyZSBpbiB0aGUgbG9vcC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENhbmRpZGF0ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChDYW5kaWRhdGVzW2ldLkZJICE9IElOVF9NSU4gJiYKKyAgICAgICAgU3RvcmVkRklzLmNvdW50KENhbmRpZGF0ZXNbaV0uRkkpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoUGh5c1JlZ0RlZnNbQ2FuZGlkYXRlc1tpXS5EZWZdID09IDEpIHsKKyAgICAgIGJvb2wgU2FmZSA9IHRydWU7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gQ2FuZGlkYXRlc1tpXS5NSTsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGogIT0gZWU7ICsraikgeworICAgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChqKTsKKyAgICAgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmlzRGVmKCkgfHwgIU1PLmdldFJlZygpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoUGh5c1JlZ0RlZnNbTU8uZ2V0UmVnKCldKSB7CisgICAgICAgICAgLy8gSWYgaXQncyB1c2luZyBhIG5vbi1sb29wLWludmFyaWFudCByZWdpc3RlciwgdGhlbiBpdCdzIG9idmlvdXNseQorICAgICAgICAgIC8vIG5vdCBzYWZlIHRvIGhvaXN0LgorICAgICAgICAgIFNhZmUgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKFNhZmUpCisgICAgICAgIEhvaXN0UG9zdFJBKE1JLCBDYW5kaWRhdGVzW2ldLkRlZik7CisgICAgfQorICB9CisKKyAgZGVsZXRlW10gUGh5c1JlZ0RlZnM7Cit9CisKKy8vLyBBZGRUb0xpdmVJbnMgLSBBZGQgcmVnaXN0ZXIgJ1JlZycgdG8gdGhlIGxpdmVpbiBzZXRzIG9mIEJCcyBpbiB0aGUgY3VycmVudAorLy8vIGxvb3AsIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGtpbGxlZCBieSBhbnkgaW5zdHJ1Y3Rpb25zIGluIHRoZSBsb29wLgordm9pZCBNYWNoaW5lTElDTTo6QWRkVG9MaXZlSW5zKHVuc2lnbmVkIFJlZykgeworICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+IEJsb2NrcyA9IEN1ckxvb3AtPmdldEJsb2NrcygpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQmxvY2tzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIgPSBCbG9ja3NbaV07CisgICAgaWYgKCFCQi0+aXNMaXZlSW4oUmVnKSkKKyAgICAgIEJCLT5hZGRMaXZlSW4oUmVnKTsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcgorICAgICAgICAgICBNSUkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgTUlJICE9IEU7ICsrTUlJKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gJipNSUk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmdldFJlZygpIHx8IE1PLmlzRGVmKCkpIGNvbnRpbnVlOworICAgICAgICBpZiAoTU8uZ2V0UmVnKCkgPT0gUmVnIHx8IFRSSS0+aXNTdXBlclJlZ2lzdGVyKFJlZywgTU8uZ2V0UmVnKCkpKQorICAgICAgICAgIE1PLnNldElzS2lsbChmYWxzZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLyBIb2lzdFBvc3RSQSAtIFdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMgZm91bmQgdG8gb25seSB1c2UgbG9vcCBpbnZhcmlhbnQKKy8vLyBvcGVyYW5kcyB0aGF0IGlzIHNhZmUgdG8gaG9pc3QsIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkIHRvIGRvIHRoZQorLy8vIGRpcnR5IHdvcmsuCit2b2lkIE1hY2hpbmVMSUNNOjpIb2lzdFBvc3RSQShNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBEZWYpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWhlYWRlciA9IGdldEN1clByZWhlYWRlcigpOworICBpZiAoIVByZWhlYWRlcikgcmV0dXJuOworCisgIC8vIE5vdyBtb3ZlIHRoZSBpbnN0cnVjdGlvbnMgdG8gdGhlIHByZWRlY2Vzc29yLCBpbnNlcnRpbmcgaXQgYmVmb3JlIGFueQorICAvLyB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucy4KKyAgREVCVUcoeworICAgICAgZGJncygpIDw8ICJIb2lzdGluZyAiIDw8ICpNSTsKKyAgICAgIGlmIChQcmVoZWFkZXItPmdldEJhc2ljQmxvY2soKSkKKyAgICAgICAgZGJncygpIDw8ICIgdG8gTWFjaGluZUJhc2ljQmxvY2sgIgorICAgICAgICAgICAgICAgPDwgUHJlaGVhZGVyLT5nZXROYW1lKCk7CisgICAgICBpZiAoTUktPmdldFBhcmVudCgpLT5nZXRCYXNpY0Jsb2NrKCkpCisgICAgICAgIGRiZ3MoKSA8PCAiIGZyb20gTWFjaGluZUJhc2ljQmxvY2sgIgorICAgICAgICAgICAgICAgPDwgTUktPmdldFBhcmVudCgpLT5nZXROYW1lKCk7CisgICAgICBkYmdzKCkgPDwgIlxuIjsKKyAgICB9KTsKKworICAvLyBTcGxpY2UgdGhlIGluc3RydWN0aW9uIHRvIHRoZSBwcmVoZWFkZXIuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNSS0+Z2V0UGFyZW50KCk7CisgIFByZWhlYWRlci0+c3BsaWNlKFByZWhlYWRlci0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCksIE1CQiwgTUkpOworCisgIC8vIEFkZCByZWdpc3RlciB0byBsaXZlaW4gbGlzdCB0byBhbGwgdGhlIEJCcyBpbiB0aGUgY3VycmVudCBsb29wIHNpbmNlIGEgCisgIC8vIGxvb3AgaW52YXJpYW50IG11c3QgYmUga2VwdCBsaXZlIHRocm91Z2hvdXQgdGhlIHdob2xlIGxvb3AuIFRoaXMgaXMKKyAgLy8gaW1wb3J0YW50IHRvIGVuc3VyZSBsYXRlciBwYXNzZXMgZG8gbm90IHNjYXZlbmdlIHRoZSBkZWYgcmVnaXN0ZXIuCisgIEFkZFRvTGl2ZUlucyhEZWYpOworCisgICsrTnVtUG9zdFJBSG9pc3RlZDsKKyAgQ2hhbmdlZCA9IHRydWU7Cit9CisKKy8vLyBIb2lzdFJlZ2lvbiAtIFdhbGsgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgdGhlIENGRyAoZGVmaW5lZCBieSBhbGwgYmxvY2tzCisvLy8gZG9taW5hdGVkIGJ5IHRoZSBzcGVjaWZpZWQgYmxvY2ssIGFuZCB0aGF0IGFyZSBpbiB0aGUgY3VycmVudCBsb29wKSBpbiBkZXB0aAorLy8vIGZpcnN0IG9yZGVyIHcuci50IHRoZSBEb21pbmF0b3JUcmVlLiBUaGlzIGFsbG93cyB1cyB0byB2aXNpdCBkZWZpbml0aW9ucworLy8vIGJlZm9yZSB1c2VzLCBhbGxvd2luZyB1cyB0byBob2lzdCBhIGxvb3AgYm9keSBpbiBvbmUgcGFzcyB3aXRob3V0IGl0ZXJhdGlvbi4KKy8vLwordm9pZCBNYWNoaW5lTElDTTo6SG9pc3RSZWdpb24oTWFjaGluZURvbVRyZWVOb2RlICpOKSB7CisgIGFzc2VydChOICE9IDAgJiYgIk51bGwgZG9taW5hdG9yIHRyZWUgbm9kZT8iKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKkJCID0gTi0+Z2V0QmxvY2soKTsKKworICAvLyBJZiB0aGlzIHN1YnJlZ2lvbiBpcyBub3QgaW4gdGhlIHRvcCBsZXZlbCBsb29wIGF0IGFsbCwgZXhpdC4KKyAgaWYgKCFDdXJMb29wLT5jb250YWlucyhCQikpIHJldHVybjsKKworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcgorICAgICAgICAgTUlJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7IE1JSSAhPSBFOyApIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTmV4dE1JSSA9IE1JSTsgKytOZXh0TUlJOworICAgIEhvaXN0KCYqTUlJKTsKKyAgICBNSUkgPSBOZXh0TUlJOworICB9CisKKyAgLy8gRG9uJ3QgaG9pc3QgdGhpbmdzIG91dCBvZiBhIGxhcmdlIHN3aXRjaCBzdGF0ZW1lbnQuICBUaGlzIG9mdGVuIGNhdXNlcworICAvLyBjb2RlIHRvIGJlIGhvaXN0ZWQgdGhhdCB3YXNuJ3QgZ29pbmcgdG8gYmUgZXhlY3V0ZWQsIGFuZCBpbmNyZWFzZXMKKyAgLy8gcmVnaXN0ZXIgcHJlc3N1cmUgaW4gYSBzaXR1YXRpb24gd2hlcmUgaXQncyBsaWtlbHkgdG8gbWF0dGVyLgorICBpZiAoQkItPnN1Y2Nfc2l6ZSgpIDwgMjUpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lRG9tVHJlZU5vZGUqPiAmQ2hpbGRyZW4gPSBOLT5nZXRDaGlsZHJlbigpOworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBDaGlsZHJlbi5zaXplKCk7IEkgIT0gRTsgKytJKQorICAgICAgSG9pc3RSZWdpb24oQ2hpbGRyZW5bSV0pOworICB9Cit9CisKKy8vLyBJc0xJQ01DYW5kaWRhdGUgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIG1heSBiZSBhIHN1aXRhYmxlCisvLy8gY2FuZGlkYXRlIGZvciBMSUNNLiBlLmcuIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIGNhbGwsIHRoZW4gaXQncyBvYnZpb3VzbHkKKy8vLyBub3Qgc2FmZSB0byBob2lzdCBpdC4KK2Jvb2wgTWFjaGluZUxJQ006OklzTElDTUNhbmRpZGF0ZShNYWNoaW5lSW5zdHIgJkkpIHsKKyAgLy8gQ2hlY2sgaWYgaXQncyBzYWZlIHRvIG1vdmUgdGhlIGluc3RydWN0aW9uLgorICBib29sIERvbnRNb3ZlQWNyb3NzU3RvcmUgPSB0cnVlOworICBpZiAoIUkuaXNTYWZlVG9Nb3ZlKFRJSSwgQUEsIERvbnRNb3ZlQWNyb3NzU3RvcmUpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIHJldHVybiB0cnVlOworfQorCisvLy8gSXNMb29wSW52YXJpYW50SW5zdCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbG9vcAorLy8vIGludmFyaWFudC4gSS5lLiwgYWxsIHZpcnR1YWwgcmVnaXN0ZXIgb3BlcmFuZHMgYXJlIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUKKy8vLyBsb29wLCBwaHlzaWNhbCByZWdpc3RlcnMgYXJlbid0IGFjY2Vzc2VkIGV4cGxpY2l0bHksIGFuZCB0aGVyZSBhcmUgbm8gc2lkZQorLy8vIGVmZmVjdHMgdGhhdCBhcmVuJ3QgY2FwdHVyZWQgYnkgdGhlIG9wZXJhbmRzIG9yIG90aGVyIGZsYWdzLgorLy8vIAorYm9vbCBNYWNoaW5lTElDTTo6SXNMb29wSW52YXJpYW50SW5zdChNYWNoaW5lSW5zdHIgJkkpIHsKKyAgaWYgKCFJc0xJQ01DYW5kaWRhdGUoSSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFRoZSBpbnN0cnVjdGlvbiBpcyBsb29wIGludmFyaWFudCBpZiBhbGwgb2YgaXRzIG9wZXJhbmRzIGFyZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJLmdldE9wZXJhbmQoaSk7CisKKyAgICBpZiAoIU1PLmlzUmVnKCkpCisgICAgICBjb250aW51ZTsKKworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChSZWcgPT0gMCkgY29udGludWU7CisKKyAgICAvLyBEb24ndCBob2lzdCBhbiBpbnN0cnVjdGlvbiB0aGF0IHVzZXMgb3IgZGVmaW5lcyBhIHBoeXNpY2FsIHJlZ2lzdGVyLgorICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpKSB7CisgICAgICBpZiAoTU8uaXNVc2UoKSkgeworICAgICAgICAvLyBJZiB0aGUgcGh5c3JlZyBoYXMgbm8gZGVmcyBhbnl3aGVyZSwgaXQncyBqdXN0IGFuIGFtYmllbnQgcmVnaXN0ZXIKKyAgICAgICAgLy8gYW5kIHdlIGNhbiBmcmVlbHkgbW92ZSBpdHMgdXNlcy4gQWx0ZXJuYXRpdmVseSwgaWYgaXQncyBhbGxvY2F0YWJsZSwKKyAgICAgICAgLy8gaXQgY291bGQgZ2V0IGFsbG9jYXRlZCB0byBzb21ldGhpbmcgd2l0aCBhIGRlZiBkdXJpbmcgYWxsb2NhdGlvbi4KKyAgICAgICAgaWYgKCFSZWdJbmZvLT5kZWZfZW1wdHkoUmVnKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChBbGxvY2F0YWJsZVNldC50ZXN0KFJlZykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBDaGVjayBmb3IgYSBkZWYgYW1vbmcgdGhlIHJlZ2lzdGVyJ3MgYWxpYXNlcyB0b28uCisgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqQWxpYXM7ICsrQWxpYXMpIHsKKyAgICAgICAgICB1bnNpZ25lZCBBbGlhc1JlZyA9ICpBbGlhczsKKyAgICAgICAgICBpZiAoIVJlZ0luZm8tPmRlZl9lbXB0eShBbGlhc1JlZykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgaWYgKEFsbG9jYXRhYmxlU2V0LnRlc3QoQWxpYXNSZWcpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIE90aGVyd2lzZSBpdCdzIHNhZmUgdG8gbW92ZS4KKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKCFNTy5pc0RlYWQoKSkgeworICAgICAgICAvLyBBIGRlZiB0aGF0IGlzbid0IGRlYWQuIFdlIGNhbid0IG1vdmUgaXQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoQ3VyTG9vcC0+Z2V0SGVhZGVyKCktPmlzTGl2ZUluKFJlZykpIHsKKyAgICAgICAgLy8gSWYgdGhlIHJlZyBpcyBsaXZlIGludG8gdGhlIGxvb3AsIHdlIGNhbid0IGhvaXN0IGFuIGluc3RydWN0aW9uCisgICAgICAgIC8vIHdoaWNoIHdvdWxkIGNsb2JiZXIgaXQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIU1PLmlzVXNlKCkpCisgICAgICBjb250aW51ZTsKKworICAgIGFzc2VydChSZWdJbmZvLT5nZXRWUmVnRGVmKFJlZykgJiYKKyAgICAgICAgICAgIk1hY2hpbmUgaW5zdHIgbm90IG1hcHBlZCBmb3IgdGhpcyB2cmVnPyEiKTsKKworICAgIC8vIElmIHRoZSBsb29wIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGFuIG9wZXJhbmQsIHRoZW4gdGhlIGluc3RydWN0aW9uCisgICAgLy8gaXNuJ3QgbG9vcCBpbnZhcmlhbnQuCisgICAgaWYgKEN1ckxvb3AtPmNvbnRhaW5zKFJlZ0luZm8tPmdldFZSZWdEZWYoUmVnKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJZiB3ZSBnb3QgdGhpcyBmYXIsIHRoZSBpbnN0cnVjdGlvbiBpcyBsb29wIGludmFyaWFudCEKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vIEhhc1BISVVzZXMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGhhcyBhbnkgUEhJIHVzZS4KK3N0YXRpYyBib29sIEhhc1BISVVzZXModW5zaWduZWQgUmVnLCBNYWNoaW5lUmVnaXN0ZXJJbmZvICpSZWdJbmZvKSB7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6dXNlX2l0ZXJhdG9yIFVJID0gUmVnSW5mby0+dXNlX2JlZ2luKFJlZyksCisgICAgICAgICBVRSA9IFJlZ0luZm8tPnVzZV9lbmQoKTsgVUkgIT0gVUU7ICsrVUkpIHsKKyAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gJipVSTsKKyAgICBpZiAoVXNlTUktPmlzUEhJKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBpc0xvYWRGcm9tQ29uc3RhbnRNZW1vcnkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gaXMgYQorLy8vIGxvYWQgZnJvbSBjb25zdGFudCBtZW1vcnkuIE1hY2hpbmUgTElDTSB3aWxsIGhvaXN0IHRoZXNlIGV2ZW4gaWYgdGhleSBhcmUKKy8vLyBub3QgcmUtbWF0ZXJpYWxpemFibGUuCitib29sIE1hY2hpbmVMSUNNOjppc0xvYWRGcm9tQ29uc3RhbnRNZW1vcnkoTWFjaGluZUluc3RyICpNSSkgeworICBpZiAoIU1JLT5nZXREZXNjKCkubWF5TG9hZCgpKSByZXR1cm4gZmFsc2U7CisgIGlmICghTUktPmhhc09uZU1lbU9wZXJhbmQoKSkgcmV0dXJuIGZhbHNlOworICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PID0gKk1JLT5tZW1vcGVyYW5kc19iZWdpbigpOworICBpZiAoTU1PLT5pc1ZvbGF0aWxlKCkpIHJldHVybiBmYWxzZTsKKyAgaWYgKCFNTU8tPmdldFZhbHVlKCkpIHJldHVybiBmYWxzZTsKKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKlBTViA9IGR5bl9jYXN0PFBzZXVkb1NvdXJjZVZhbHVlPihNTU8tPmdldFZhbHVlKCkpOworICBpZiAoUFNWKSB7CisgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICAgIHJldHVybiBQU1YtPmlzQ29uc3RhbnQoTUYuZ2V0RnJhbWVJbmZvKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBBQS0+cG9pbnRzVG9Db25zdGFudE1lbW9yeShNTU8tPmdldFZhbHVlKCkpOworICB9Cit9CisKKy8vLyBJc1Byb2ZpdGFibGVUb0hvaXN0IC0gUmV0dXJuIHRydWUgaWYgaXQgaXMgcG90ZW50aWFsbHkgcHJvZml0YWJsZSB0byBob2lzdAorLy8vIHRoZSBnaXZlbiBsb29wIGludmFyaWFudC4KK2Jvb2wgTWFjaGluZUxJQ006OklzUHJvZml0YWJsZVRvSG9pc3QoTWFjaGluZUluc3RyICZNSSkgeworICAvLyBGSVhNRTogRm9yIG5vdywgb25seSBob2lzdCByZS1tYXRlcmlsaXphYmxlIGluc3RydWN0aW9ucy4gTElDTSB3aWxsCisgIC8vIGluY3JlYXNlIHJlZ2lzdGVyIHByZXNzdXJlLiBXZSB3YW50IHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGluY3JlYXNlCisgIC8vIHNwaWxsaW5nLgorICAvLyBBbHNvIGhvaXN0IGxvYWRzIGZyb20gY29uc3RhbnQgbWVtb3J5LCBlLmcuIGxvYWQgZnJvbSBzdHVicywgR09ULiBIb2lzdGluZworICAvLyB0aGVzZSB0ZW5kIHRvIGhlbHAgcGVyZm9ybWFuY2UgaW4gbG93IHJlZ2lzdGVyIHByZXNzdXJlIHNpdHVhdGlvbi4gVGhlCisgIC8vIHRyYWRlIG9mZiBpcyBpdCBtYXkgY2F1c2Ugc3BpbGwgaW4gaGlnaCBwcmVzc3VyZSBzaXR1YXRpb24uIEl0IHdpbGwgZW5kIHVwCisgIC8vIGFkZGluZyBhIHN0b3JlIGluIHRoZSBsb29wIHByZWhlYWRlci4gQnV0IHRoZSByZWxvYWQgaXMgbm8gbW9yZSBleHBlbnNpdmUuCisgIC8vIFRoZSBzaWRlIGJlbmVmaXQgaXMgdGhlc2UgbG9hZHMgYXJlIGZyZXF1ZW50bHkgQ1NFJ2VkLgorICBpZiAoIVRJSS0+aXNUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKCZNSSwgQUEpKSB7CisgICAgaWYgKCFpc0xvYWRGcm9tQ29uc3RhbnRNZW1vcnkoJk1JKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElmIHJlc3VsdChzKSBvZiB0aGlzIGluc3RydWN0aW9uIGlzIHVzZWQgYnkgUEhJcywgdGhlbiBkb24ndCBob2lzdCBpdC4KKyAgLy8gVGhlIHByZXNlbmNlIG9mIGpvaW5zIG1ha2VzIGl0IGRpZmZpY3VsdCBmb3IgY3VycmVudCByZWdpc3RlciBhbGxvY2F0b3IKKyAgLy8gaW1wbGVtZW50YXRpb24gdG8gcGVyZm9ybSByZW1hdC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzRGVmKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoSGFzUEhJVXNlcyhNTy5nZXRSZWcoKSwgUmVnSW5mbykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworTWFjaGluZUluc3RyICpNYWNoaW5lTElDTTo6RXh0cmFjdEhvaXN0YWJsZUxvYWQoTWFjaGluZUluc3RyICpNSSkgeworICAvLyBJZiBub3QsIHdlIG1heSBiZSBhYmxlIHRvIHVuZm9sZCBhIGxvYWQgYW5kIGhvaXN0IHRoYXQuCisgIC8vIEZpcnN0IHRlc3Qgd2hldGhlciB0aGUgaW5zdHJ1Y3Rpb24gaXMgbG9hZGluZyBmcm9tIGFuIGFtZW5hYmxlCisgIC8vIG1lbW9yeSBsb2NhdGlvbi4KKyAgaWYgKCFpc0xvYWRGcm9tQ29uc3RhbnRNZW1vcnkoTUkpKQorICAgIHJldHVybiAwOworCisgIC8vIE5leHQgZGV0ZXJtaW5lIHRoZSByZWdpc3RlciBjbGFzcyBmb3IgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIExvYWRSZWdJbmRleDsKKyAgdW5zaWduZWQgTmV3T3BjID0KKyAgICBUSUktPmdldE9wY29kZUFmdGVyTWVtb3J5VW5mb2xkKE1JLT5nZXRPcGNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVW5mb2xkTG9hZD0qL3RydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlVuZm9sZFN0b3JlPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTG9hZFJlZ0luZGV4KTsKKyAgaWYgKE5ld09wYyA9PSAwKSByZXR1cm4gMDsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBUSUktPmdldChOZXdPcGMpOworICBpZiAoVElELmdldE51bURlZnMoKSAhPSAxKSByZXR1cm4gMDsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBUSUQuT3BJbmZvW0xvYWRSZWdJbmRleF0uZ2V0UmVnQ2xhc3MoVFJJKTsKKyAgLy8gT2ssIHdlJ3JlIHVuZm9sZGluZy4gQ3JlYXRlIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyIGFuZCBkbyB0aGUgdW5mb2xkLgorICB1bnNpZ25lZCBSZWcgPSBSZWdJbmZvLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyICosIDI+IE5ld01JczsKKyAgYm9vbCBTdWNjZXNzID0KKyAgICBUSUktPnVuZm9sZE1lbW9yeU9wZXJhbmQoTUYsIE1JLCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVW5mb2xkTG9hZD0qL3RydWUsIC8qVW5mb2xkU3RvcmU9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3TUlzKTsKKyAgKHZvaWQpU3VjY2VzczsKKyAgYXNzZXJ0KFN1Y2Nlc3MgJiYKKyAgICAgICAgICJ1bmZvbGRNZW1vcnlPcGVyYW5kIGZhaWxlZCB3aGVuIGdldE9wY29kZUFmdGVyTWVtb3J5VW5mb2xkICIKKyAgICAgICAgICJzdWNjZWVkZWQhIik7CisgIGFzc2VydChOZXdNSXMuc2l6ZSgpID09IDIgJiYKKyAgICAgICAgICJVbmZvbGRlZCBhIGxvYWQgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMhIik7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNSS0+Z2V0UGFyZW50KCk7CisgIE1CQi0+aW5zZXJ0KE1JLCBOZXdNSXNbMF0pOworICBNQkItPmluc2VydChNSSwgTmV3TUlzWzFdKTsKKyAgLy8gSWYgdW5mb2xkaW5nIHByb2R1Y2VkIGEgbG9hZCB0aGF0IHdhc24ndCBsb29wLWludmFyaWFudCBvciBwcm9maXRhYmxlIHRvCisgIC8vIGhvaXN0LCBkaXNjYXJkIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIGFuZCBiYWlsLgorICBpZiAoIUlzTG9vcEludmFyaWFudEluc3QoKk5ld01Jc1swXSkgfHwgIUlzUHJvZml0YWJsZVRvSG9pc3QoKk5ld01Jc1swXSkpIHsKKyAgICBOZXdNSXNbMF0tPmVyYXNlRnJvbVBhcmVudCgpOworICAgIE5ld01Jc1sxXS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLy8gT3RoZXJ3aXNlIHdlIHN1Y2Nlc3NmdWxseSB1bmZvbGRlZCBhIGxvYWQgdGhhdCB3ZSBjYW4gaG9pc3QuCisgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgcmV0dXJuIE5ld01Jc1swXTsKK30KKwordm9pZCBNYWNoaW5lTElDTTo6SW5pdENTRU1hcChNYWNoaW5lQmFzaWNCbG9jayAqQkIpIHsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLEUgPSBCQi0+ZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgTWFjaGluZUluc3RyICpNSSA9ICYqSTsKKyAgICAvLyBGSVhNRTogRm9yIG5vdywgb25seSBob2lzdCByZS1tYXRlcmlsaXphYmxlIGluc3RydWN0aW9ucy4gTElDTSB3aWxsCisgICAgLy8gaW5jcmVhc2UgcmVnaXN0ZXIgcHJlc3N1cmUuIFdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgaW5jcmVhc2UKKyAgICAvLyBzcGlsbGluZy4KKyAgICBpZiAoVElJLT5pc1RyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoTUksIEFBKSkgeworICAgICAgdW5zaWduZWQgT3Bjb2RlID0gTUktPmdldE9wY29kZSgpOworICAgICAgRGVuc2VNYXA8dW5zaWduZWQsIHN0ZDo6dmVjdG9yPGNvbnN0IE1hY2hpbmVJbnN0cio+ID46Oml0ZXJhdG9yCisgICAgICAgIENJID0gQ1NFTWFwLmZpbmQoT3Bjb2RlKTsKKyAgICAgIGlmIChDSSAhPSBDU0VNYXAuZW5kKCkpCisgICAgICAgIENJLT5zZWNvbmQucHVzaF9iYWNrKE1JKTsKKyAgICAgIGVsc2UgeworICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBNYWNoaW5lSW5zdHIqPiBDU0VNSXM7CisgICAgICAgIENTRU1Jcy5wdXNoX2JhY2soTUkpOworICAgICAgICBDU0VNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE9wY29kZSwgQ1NFTUlzKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2NvbnN0IE1hY2hpbmVJbnN0cioKK01hY2hpbmVMSUNNOjpMb29rRm9yRHVwbGljYXRlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBNYWNoaW5lSW5zdHIqPiAmUHJldk1JcykgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUHJldk1Jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZUluc3RyICpQcmV2TUkgPSBQcmV2TUlzW2ldOworICAgIGlmIChUSUktPnByb2R1Y2VTYW1lVmFsdWUoTUksIFByZXZNSSkpCisgICAgICByZXR1cm4gUHJldk1JOworICB9CisgIHJldHVybiAwOworfQorCitib29sIE1hY2hpbmVMSUNNOjpFbGltaW5hdGVDU0UoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp2ZWN0b3I8Y29uc3QgTWFjaGluZUluc3RyKj4gPjo6aXRlcmF0b3IgJkNJKSB7CisgIC8vIERvIG5vdCBDU0UgaW1wbGljaXRfZGVmIHNvIFByb2Nlc3NJbXBsaWNpdERlZnMgY2FuIHByb3Blcmx5IHByb3BhZ2F0ZQorICAvLyB0aGUgdW5kZWYgcHJvcGVydHkgb250byB1c2VzLgorICBpZiAoQ0kgPT0gQ1NFTWFwLmVuZCgpIHx8IE1JLT5pc0ltcGxpY2l0RGVmKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChjb25zdCBNYWNoaW5lSW5zdHIgKkR1cCA9IExvb2tGb3JEdXBsaWNhdGUoTUksIENJLT5zZWNvbmQpKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJDU0VpbmcgIiA8PCAqTUkgPDwgIiB3aXRoICIgPDwgKkR1cCk7CisKKyAgICAvLyBSZXBsYWNlIHZpcnR1YWwgcmVnaXN0ZXJzIGRlZmluZWQgYnkgTUkgYnkgdGhlaXIgY291bnRlcnBhcnRzIGRlZmluZWQKKyAgICAvLyBieSBEdXAuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisKKyAgICAgIC8vIFBoeXNpY2FsIHJlZ2lzdGVycyBtYXkgbm90IGRpZmZlciBoZXJlLgorICAgICAgYXNzZXJ0KCghTU8uaXNSZWcoKSB8fCBNTy5nZXRSZWcoKSA9PSAwIHx8CisgICAgICAgICAgICAgICFUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihNTy5nZXRSZWcoKSkgfHwKKyAgICAgICAgICAgICAgTU8uZ2V0UmVnKCkgPT0gRHVwLT5nZXRPcGVyYW5kKGkpLmdldFJlZygpKSAmJgorICAgICAgICAgICAgICJJbnN0cnVjdGlvbnMgd2l0aCBkaWZmZXJlbnQgcGh5cyByZWdzIGFyZSBub3QgaWRlbnRpY2FsISIpOworCisgICAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5pc0RlZigpICYmCisgICAgICAgICAgIVRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKE1PLmdldFJlZygpKSkgeworICAgICAgICBSZWdJbmZvLT5yZXBsYWNlUmVnV2l0aChNTy5nZXRSZWcoKSwgRHVwLT5nZXRPcGVyYW5kKGkpLmdldFJlZygpKTsKKyAgICAgICAgUmVnSW5mby0+Y2xlYXJLaWxsRmxhZ3MoRHVwLT5nZXRPcGVyYW5kKGkpLmdldFJlZygpKTsKKyAgICAgIH0KKyAgICB9CisgICAgTUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICsrTnVtQ1NFZWQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gSG9pc3QgLSBXaGVuIGFuIGluc3RydWN0aW9uIGlzIGZvdW5kIHRvIHVzZSBvbmx5IGxvb3AgaW52YXJpYW50IG9wZXJhbmRzCisvLy8gdGhhdCBhcmUgc2FmZSB0byBob2lzdCwgdGhpcyBpbnN0cnVjdGlvbiBpcyBjYWxsZWQgdG8gZG8gdGhlIGRpcnR5IHdvcmsuCisvLy8KK3ZvaWQgTWFjaGluZUxJQ006OkhvaXN0KE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWhlYWRlciA9IGdldEN1clByZWhlYWRlcigpOworICBpZiAoIVByZWhlYWRlcikgcmV0dXJuOworCisgIC8vIEZpcnN0IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGhvaXN0IHRoaXMgaW5zdHJ1Y3Rpb24uCisgIGlmICghSXNMb29wSW52YXJpYW50SW5zdCgqTUkpIHx8ICFJc1Byb2ZpdGFibGVUb0hvaXN0KCpNSSkpIHsKKyAgICAvLyBJZiBub3QsIHRyeSB1bmZvbGRpbmcgYSBob2lzdGFibGUgbG9hZC4KKyAgICBNSSA9IEV4dHJhY3RIb2lzdGFibGVMb2FkKE1JKTsKKyAgICBpZiAoIU1JKSByZXR1cm47CisgIH0KKworICAvLyBOb3cgbW92ZSB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBwcmVkZWNlc3NvciwgaW5zZXJ0aW5nIGl0IGJlZm9yZSBhbnkKKyAgLy8gdGVybWluYXRvciBpbnN0cnVjdGlvbnMuCisgIERFQlVHKHsKKyAgICAgIGRiZ3MoKSA8PCAiSG9pc3RpbmcgIiA8PCAqTUk7CisgICAgICBpZiAoUHJlaGVhZGVyLT5nZXRCYXNpY0Jsb2NrKCkpCisgICAgICAgIGRiZ3MoKSA8PCAiIHRvIE1hY2hpbmVCYXNpY0Jsb2NrICIKKyAgICAgICAgICAgICAgIDw8IFByZWhlYWRlci0+Z2V0TmFtZSgpOworICAgICAgaWYgKE1JLT5nZXRQYXJlbnQoKS0+Z2V0QmFzaWNCbG9jaygpKQorICAgICAgICBkYmdzKCkgPDwgIiBmcm9tIE1hY2hpbmVCYXNpY0Jsb2NrICIKKyAgICAgICAgICAgICAgIDw8IE1JLT5nZXRQYXJlbnQoKS0+Z2V0TmFtZSgpOworICAgICAgZGJncygpIDw8ICJcbiI7CisgICAgfSk7CisKKyAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gYmVpbmcgaG9pc3RlZCB0byB0aGUgcHJlaGVhZGVyLAorICAvLyBpbml0aWFsaXplIHRoZSBDU0UgbWFwIHdpdGggcG90ZW50aWFsIGNvbW1vbiBleHByZXNzaW9ucy4KKyAgaWYgKEZpcnN0SW5Mb29wKSB7CisgICAgSW5pdENTRU1hcChQcmVoZWFkZXIpOworICAgIEZpcnN0SW5Mb29wID0gZmFsc2U7CisgIH0KKworICAvLyBMb29rIGZvciBvcHBvcnR1bml0eSB0byBDU0UgdGhlIGhvaXN0ZWQgaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIE9wY29kZSA9IE1JLT5nZXRPcGNvZGUoKTsKKyAgRGVuc2VNYXA8dW5zaWduZWQsIHN0ZDo6dmVjdG9yPGNvbnN0IE1hY2hpbmVJbnN0cio+ID46Oml0ZXJhdG9yCisgICAgQ0kgPSBDU0VNYXAuZmluZChPcGNvZGUpOworICBpZiAoIUVsaW1pbmF0ZUNTRShNSSwgQ0kpKSB7CisgICAgLy8gT3RoZXJ3aXNlLCBzcGxpY2UgdGhlIGluc3RydWN0aW9uIHRvIHRoZSBwcmVoZWFkZXIuCisgICAgUHJlaGVhZGVyLT5zcGxpY2UoUHJlaGVhZGVyLT5nZXRGaXJzdFRlcm1pbmF0b3IoKSxNSS0+Z2V0UGFyZW50KCksTUkpOworCisgICAgLy8gQ2xlYXIgdGhlIGtpbGwgZmxhZ3Mgb2YgYW55IHJlZ2lzdGVyIHRoaXMgaW5zdHJ1Y3Rpb24gZGVmaW5lcywKKyAgICAvLyBzaW5jZSB0aGV5IG1heSBuZWVkIHRvIGJlIGxpdmUgdGhyb3VnaG91dCB0aGUgZW50aXJlIGxvb3AKKyAgICAvLyByYXRoZXIgdGhhbiBqdXN0IGxpdmUgZm9yIHBhcnQgb2YgaXQuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5pc0RlZigpICYmICFNTy5pc0RlYWQoKSkKKyAgICAgICAgUmVnSW5mby0+Y2xlYXJLaWxsRmxhZ3MoTU8uZ2V0UmVnKCkpOworICAgIH0KKworICAgIC8vIEFkZCB0byB0aGUgQ1NFIG1hcC4KKyAgICBpZiAoQ0kgIT0gQ1NFTWFwLmVuZCgpKQorICAgICAgQ0ktPnNlY29uZC5wdXNoX2JhY2soTUkpOworICAgIGVsc2UgeworICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgTWFjaGluZUluc3RyKj4gQ1NFTUlzOworICAgICAgQ1NFTUlzLnB1c2hfYmFjayhNSSk7CisgICAgICBDU0VNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE9wY29kZSwgQ1NFTUlzKSk7CisgICAgfQorICB9CisKKyAgKytOdW1Ib2lzdGVkOworICBDaGFuZ2VkID0gdHJ1ZTsKK30KKworTWFjaGluZUJhc2ljQmxvY2sgKk1hY2hpbmVMSUNNOjpnZXRDdXJQcmVoZWFkZXIoKSB7CisgIC8vIERldGVybWluZSB0aGUgYmxvY2sgdG8gd2hpY2ggdG8gaG9pc3QgaW5zdHJ1Y3Rpb25zLiBJZiB3ZSBjYW4ndCBmaW5kIGEKKyAgLy8gc3VpdGFibGUgbG9vcCBwcmVkZWNlc3Nvciwgd2UgY2FuJ3QgZG8gYW55IGhvaXN0aW5nLgorCisgIC8vIElmIHdlJ3ZlIHRyaWVkIHRvIGdldCBhIHByZWhlYWRlciBhbmQgZmFpbGVkLCBkb24ndCB0cnkgYWdhaW4uCisgIGlmIChDdXJQcmVoZWFkZXIgPT0gcmVpbnRlcnByZXRfY2FzdDxNYWNoaW5lQmFzaWNCbG9jayAqPigtMSkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFDdXJQcmVoZWFkZXIpIHsKKyAgICBDdXJQcmVoZWFkZXIgPSBDdXJMb29wLT5nZXRMb29wUHJlaGVhZGVyKCk7CisgICAgaWYgKCFDdXJQcmVoZWFkZXIpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkID0gQ3VyTG9vcC0+Z2V0TG9vcFByZWRlY2Vzc29yKCk7CisgICAgICBpZiAoIVByZWQpIHsKKyAgICAgICAgQ3VyUHJlaGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxNYWNoaW5lQmFzaWNCbG9jayAqPigtMSk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBDdXJQcmVoZWFkZXIgPSBQcmVkLT5TcGxpdENyaXRpY2FsRWRnZShDdXJMb29wLT5nZXRIZWFkZXIoKSwgdGhpcyk7CisgICAgICBpZiAoIUN1clByZWhlYWRlcikgeworICAgICAgICBDdXJQcmVoZWFkZXIgPSByZWludGVycHJldF9jYXN0PE1hY2hpbmVCYXNpY0Jsb2NrICo+KC0xKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBDdXJQcmVoZWFkZXI7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzllZGYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmNwcApAQCAtMCwwICsxLDgwIEBACisvLz09PS0gTWFjaGluZUxvb3BJbmZvLmNwcCAtIE5hdHVyYWwgTG9vcCBDYWxjdWxhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWNoaW5lTG9vcEluZm8gY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IG5hdHVyYWwKKy8vIGxvb3BzIGFuZCBkZXRlcm1pbmUgdGhlIGxvb3AgZGVwdGggb2YgdmFyaW91cyBub2RlcyBvZiB0aGUgQ0ZHLiAgTm90ZSB0aGF0CisvLyB0aGUgbG9vcHMgaWRlbnRpZmllZCBtYXkgYWN0dWFsbHkgYmUgc2V2ZXJhbCBuYXR1cmFsIGxvb3BzIHRoYXQgc2hhcmUgdGhlIAorLy8gc2FtZSBoZWFkZXIgbm9kZS4uLiBub3QganVzdCBhIHNpbmdsZSBuYXR1cmFsIGxvb3AuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIGxsdm0geworI2RlZmluZSBNTEIgY2xhc3MgTG9vcEJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPgorVEVNUExBVEVfSU5TVEFOVElBVElPTihNTEIpOworI3VuZGVmIE1MQgorI2RlZmluZSBNTElCIGNsYXNzIExvb3BJbmZvQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgTWFjaGluZUxvb3A+CitURU1QTEFURV9JTlNUQU5USUFUSU9OKE1MSUIpOworI3VuZGVmIE1MSUIKK30KKworY2hhciBNYWNoaW5lTG9vcEluZm86OklEID0gMDsKK3N0YXRpYyBSZWdpc3RlclBhc3M8TWFjaGluZUxvb3BJbmZvPgorWCgibWFjaGluZS1sb29wcyIsICJNYWNoaW5lIE5hdHVyYWwgTG9vcCBDb25zdHJ1Y3Rpb24iLCB0cnVlKTsKKworY2hhciAmbGx2bTo6TWFjaGluZUxvb3BJbmZvSUQgPSBNYWNoaW5lTG9vcEluZm86OklEOworCitib29sIE1hY2hpbmVMb29wSW5mbzo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICYpIHsKKyAgcmVsZWFzZU1lbW9yeSgpOworICBMSS5DYWxjdWxhdGUoZ2V0QW5hbHlzaXM8TWFjaGluZURvbWluYXRvclRyZWU+KCkuZ2V0QmFzZSgpKTsgICAgLy8gVXBkYXRlCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNYWNoaW5lTG9vcEluZm86OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVEb21pbmF0b3JUcmVlPigpOworICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKK30KKworTWFjaGluZUJhc2ljQmxvY2sgKk1hY2hpbmVMb29wOjpnZXRUb3BCbG9jaygpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlRvcE1CQiA9IGdldEhlYWRlcigpOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJlZ2luID0gVG9wTUJCLT5nZXRQYXJlbnQoKS0+YmVnaW4oKTsKKyAgaWYgKFRvcE1CQiAhPSBCZWdpbikgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmlvck1CQiA9IHByaW9yKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoVG9wTUJCKSk7CisgICAgd2hpbGUgKGNvbnRhaW5zKFByaW9yTUJCKSkgeworICAgICAgVG9wTUJCID0gUHJpb3JNQkI7CisgICAgICBpZiAoVG9wTUJCID09IEJlZ2luKSBicmVhazsKKyAgICAgIFByaW9yTUJCID0gcHJpb3IoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihUb3BNQkIpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRvcE1CQjsKK30KKworTWFjaGluZUJhc2ljQmxvY2sgKk1hY2hpbmVMb29wOjpnZXRCb3R0b21CbG9jaygpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKkJvdE1CQiA9IGdldEhlYWRlcigpOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEVuZCA9IEJvdE1CQi0+Z2V0UGFyZW50KCktPmVuZCgpOworICBpZiAoQm90TUJCICE9IHByaW9yKEVuZCkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV4dE1CQiA9IGxsdm06Om5leHQoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihCb3RNQkIpKTsKKyAgICB3aGlsZSAoY29udGFpbnMoTmV4dE1CQikpIHsKKyAgICAgIEJvdE1CQiA9IE5leHRNQkI7CisgICAgICBpZiAoQm90TUJCID09IGxsdm06Om5leHQoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihCb3RNQkIpKSkgYnJlYWs7CisgICAgICBOZXh0TUJCID0gbGx2bTo6bmV4dChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKEJvdE1CQikpOworICAgIH0KKyAgfQorICByZXR1cm4gQm90TUJCOworfQorCit2b2lkIE1hY2hpbmVMb29wOjpkdW1wKCkgY29uc3QgeworICBwcmludChkYmdzKCkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTEwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5jcHAKQEAgLTAsMCArMSw0MjEgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKworI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIGxsdm06OmR3YXJmOworCisvLyBIYW5kbGUgdGhlIFBhc3MgcmVnaXN0cmF0aW9uIHN0dWZmIG5lY2Vzc2FyeSB0byB1c2UgVGFyZ2V0RGF0YSdzLgorSU5JVElBTElaRV9QQVNTKE1hY2hpbmVNb2R1bGVJbmZvLCAibWFjaGluZW1vZHVsZWluZm8iLAorICAgICAgICAgICAgICAgICJNYWNoaW5lIE1vZHVsZSBJbmZvcm1hdGlvbiIsIGZhbHNlLCBmYWxzZSk7CitjaGFyIE1hY2hpbmVNb2R1bGVJbmZvOjpJRCA9IDA7CisKKy8vIE91dCBvZiBsaW5lIHZpcnR1YWwgbWV0aG9kLgorTWFjaGluZU1vZHVsZUluZm9JbXBsOjp+TWFjaGluZU1vZHVsZUluZm9JbXBsKCkge30KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTU1JQWRkckxhYmVsTWFwQ2FsbGJhY2tQdHIgOiBDYWxsYmFja1ZIIHsKKyAgTU1JQWRkckxhYmVsTWFwICpNYXA7CitwdWJsaWM6CisgIE1NSUFkZHJMYWJlbE1hcENhbGxiYWNrUHRyKCkgOiBNYXAoMCkge30KKyAgTU1JQWRkckxhYmVsTWFwQ2FsbGJhY2tQdHIoVmFsdWUgKlYpIDogQ2FsbGJhY2tWSChWKSwgTWFwKDApIHt9CisgIAorICB2b2lkIHNldFB0cihCYXNpY0Jsb2NrICpCQikgeworICAgIFZhbHVlSGFuZGxlQmFzZTo6b3BlcmF0b3I9KEJCKTsKKyAgfQorICAgIAorICB2b2lkIHNldE1hcChNTUlBZGRyTGFiZWxNYXAgKm1hcCkgeyBNYXAgPSBtYXA7IH0KKyAgCisgIHZpcnR1YWwgdm9pZCBkZWxldGVkKCk7CisgIHZpcnR1YWwgdm9pZCBhbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICpWMik7Cit9OworICAKK2NsYXNzIE1NSUFkZHJMYWJlbE1hcCB7CisgIE1DQ29udGV4dCAmQ29udGV4dDsKKyAgc3RydWN0IEFkZHJMYWJlbFN5bUVudHJ5IHsKKyAgICAvLy8gU3ltYm9scyAtIFRoZSBzeW1ib2xzIGZvciB0aGUgbGFiZWwuICBUaGlzIGlzIGEgcG9pbnRlciB1bmlvbiB0aGF0IGlzCisgICAgLy8vIGVpdGhlciBvbmUgc3ltYm9sICh0aGUgY29tbW9uIGNhc2UpIG9yIGEgbGlzdCBvZiBzeW1ib2xzLgorICAgIFBvaW50ZXJVbmlvbjxNQ1N5bWJvbCAqLCBzdGQ6OnZlY3RvcjxNQ1N5bWJvbCo+Kj4gU3ltYm9sczsKKyAgICAKKyAgICBGdW5jdGlvbiAqRm47ICAgLy8gVGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24gb2YgdGhlIEJhc2ljQmxvY2suCisgICAgdW5zaWduZWQgSW5kZXg7IC8vIFRoZSBpbmRleCBpbiBCQkNhbGxiYWNrcyBmb3IgdGhlIEJhc2ljQmxvY2suCisgIH07CisgIAorICBEZW5zZU1hcDxBc3NlcnRpbmdWSDxCYXNpY0Jsb2NrPiwgQWRkckxhYmVsU3ltRW50cnk+IEFkZHJMYWJlbFN5bWJvbHM7CisgIAorICAvLy8gQkJDYWxsYmFja3MgLSBDYWxsYmFja3MgZm9yIHRoZSBCYXNpY0Jsb2NrJ3MgdGhhdCB3ZSBoYXZlIGVudHJpZXMgZm9yLiAgV2UKKyAgLy8vIHVzZSB0aGlzIHNvIHdlIGdldCBub3RpZmllZCBpZiBhIGJsb2NrIGlzIGRlbGV0ZWQgb3IgUkFVV2QuCisgIHN0ZDo6dmVjdG9yPE1NSUFkZHJMYWJlbE1hcENhbGxiYWNrUHRyPiBCQkNhbGxiYWNrczsKKworICAvLy8gRGVsZXRlZEFkZHJMYWJlbHNOZWVkaW5nRW1pc3Npb24gLSBUaGlzIGlzIGEgcGVyLWZ1bmN0aW9uIGxpc3Qgb2Ygc3ltYm9scworICAvLy8gd2hvc2UgY29ycmVzcG9uZGluZyBCYXNpY0Jsb2NrIGdvdCBkZWxldGVkLiAgVGhlc2Ugc3ltYm9scyBuZWVkIHRvIGJlCisgIC8vLyBlbWl0dGVkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZpbGUsIHNvIEFzbVByaW50ZXIgZW1pdHMgdGhlbSBhZnRlciB0aGUKKyAgLy8vIGZ1bmN0aW9uIGJvZHkuCisgIERlbnNlTWFwPEFzc2VydGluZ1ZIPEZ1bmN0aW9uPiwgc3RkOjp2ZWN0b3I8TUNTeW1ib2wqPiA+CisgICAgRGVsZXRlZEFkZHJMYWJlbHNOZWVkaW5nRW1pc3Npb247CitwdWJsaWM6CisgIAorICBNTUlBZGRyTGFiZWxNYXAoTUNDb250ZXh0ICZjb250ZXh0KSA6IENvbnRleHQoY29udGV4dCkge30KKyAgfk1NSUFkZHJMYWJlbE1hcCgpIHsKKyAgICBhc3NlcnQoRGVsZXRlZEFkZHJMYWJlbHNOZWVkaW5nRW1pc3Npb24uZW1wdHkoKSAmJgorICAgICAgICAgICAiU29tZSBsYWJlbHMgZm9yIGRlbGV0ZWQgYmxvY2tzIG5ldmVyIGdvdCBlbWl0dGVkIik7CisgICAgCisgICAgLy8gRGVhbGxvY2F0ZSBhbnkgb2YgdGhlICdsaXN0IG9mIHN5bWJvbHMnIGNhc2UuCisgICAgZm9yIChEZW5zZU1hcDxBc3NlcnRpbmdWSDxCYXNpY0Jsb2NrPiwgQWRkckxhYmVsU3ltRW50cnk+OjppdGVyYXRvcgorICAgICAgICAgSSA9IEFkZHJMYWJlbFN5bWJvbHMuYmVnaW4oKSwgRSA9IEFkZHJMYWJlbFN5bWJvbHMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKEktPnNlY29uZC5TeW1ib2xzLmlzPHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4qPigpKQorICAgICAgICBkZWxldGUgSS0+c2Vjb25kLlN5bWJvbHMuZ2V0PHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4qPigpOworICB9CisgIAorICBNQ1N5bWJvbCAqZ2V0QWRkckxhYmVsU3ltYm9sKEJhc2ljQmxvY2sgKkJCKTsKKyAgc3RkOjp2ZWN0b3I8TUNTeW1ib2wqPiBnZXRBZGRyTGFiZWxTeW1ib2xUb0VtaXQoQmFzaWNCbG9jayAqQkIpOworCisgIHZvaWQgdGFrZURlbGV0ZWRTeW1ib2xzRm9yRnVuY3Rpb24oRnVuY3Rpb24gKkYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4gJlJlc3VsdCk7CisKKyAgdm9pZCBVcGRhdGVGb3JEZWxldGVkQmxvY2soQmFzaWNCbG9jayAqQkIpOworICB2b2lkIFVwZGF0ZUZvclJBVVdCbG9jayhCYXNpY0Jsb2NrICpPbGQsIEJhc2ljQmxvY2sgKk5ldyk7Cit9OworfQorCitNQ1N5bWJvbCAqTU1JQWRkckxhYmVsTWFwOjpnZXRBZGRyTGFiZWxTeW1ib2woQmFzaWNCbG9jayAqQkIpIHsKKyAgYXNzZXJ0KEJCLT5oYXNBZGRyZXNzVGFrZW4oKSAmJgorICAgICAgICAgIlNob3VsZG4ndCBnZXQgbGFiZWwgZm9yIGJsb2NrIHdpdGhvdXQgYWRkcmVzcyB0YWtlbiIpOworICBBZGRyTGFiZWxTeW1FbnRyeSAmRW50cnkgPSBBZGRyTGFiZWxTeW1ib2xzW0JCXTsKKyAgCisgIC8vIElmIHdlIGFscmVhZHkgaGFkIGFuIGVudHJ5IGZvciB0aGlzIGJsb2NrLCBqdXN0IHJldHVybiBpdC4KKyAgaWYgKCFFbnRyeS5TeW1ib2xzLmlzTnVsbCgpKSB7CisgICAgYXNzZXJ0KEJCLT5nZXRQYXJlbnQoKSA9PSBFbnRyeS5GbiAmJiAiUGFyZW50IGNoYW5nZWQiKTsKKyAgICBpZiAoRW50cnkuU3ltYm9scy5pczxNQ1N5bWJvbCo+KCkpCisgICAgICByZXR1cm4gRW50cnkuU3ltYm9scy5nZXQ8TUNTeW1ib2wqPigpOworICAgIHJldHVybiAoKkVudHJ5LlN5bWJvbHMuZ2V0PHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4qPigpKVswXTsKKyAgfQorICAKKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgbmV3IGVudHJ5LCBjcmVhdGUgYSBuZXcgc3ltYm9sIGZvciBpdCBhbmQgYWRkIGFuCisgIC8vIGVudHJ5IHRvIEJCQ2FsbGJhY2tzIHNvIHdlIGNhbiBiZSBub3RpZmllZCBpZiB0aGUgQkIgaXMgZGVsZXRlZCBvciBSQVVXZC4KKyAgQkJDYWxsYmFja3MucHVzaF9iYWNrKEJCKTsKKyAgQkJDYWxsYmFja3MuYmFjaygpLnNldE1hcCh0aGlzKTsKKyAgRW50cnkuSW5kZXggPSBCQkNhbGxiYWNrcy5zaXplKCktMTsKKyAgRW50cnkuRm4gPSBCQi0+Z2V0UGFyZW50KCk7CisgIE1DU3ltYm9sICpSZXN1bHQgPSBDb250ZXh0LkNyZWF0ZVRlbXBTeW1ib2woKTsKKyAgRW50cnkuU3ltYm9scyA9IFJlc3VsdDsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworc3RkOjp2ZWN0b3I8TUNTeW1ib2wqPgorTU1JQWRkckxhYmVsTWFwOjpnZXRBZGRyTGFiZWxTeW1ib2xUb0VtaXQoQmFzaWNCbG9jayAqQkIpIHsKKyAgYXNzZXJ0KEJCLT5oYXNBZGRyZXNzVGFrZW4oKSAmJgorICAgICAgICAgIlNob3VsZG4ndCBnZXQgbGFiZWwgZm9yIGJsb2NrIHdpdGhvdXQgYWRkcmVzcyB0YWtlbiIpOworICBBZGRyTGFiZWxTeW1FbnRyeSAmRW50cnkgPSBBZGRyTGFiZWxTeW1ib2xzW0JCXTsKKyAgCisgIHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4gUmVzdWx0OworICAKKyAgLy8gSWYgd2UgYWxyZWFkeSBoYWQgYW4gZW50cnkgZm9yIHRoaXMgYmxvY2ssIGp1c3QgcmV0dXJuIGl0LgorICBpZiAoRW50cnkuU3ltYm9scy5pc051bGwoKSkKKyAgICBSZXN1bHQucHVzaF9iYWNrKGdldEFkZHJMYWJlbFN5bWJvbChCQikpOworICBlbHNlIGlmIChNQ1N5bWJvbCAqU3ltID0gRW50cnkuU3ltYm9scy5keW5fY2FzdDxNQ1N5bWJvbCo+KCkpCisgICAgUmVzdWx0LnB1c2hfYmFjayhTeW0pOworICBlbHNlCisgICAgUmVzdWx0ID0gKkVudHJ5LlN5bWJvbHMuZ2V0PHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4qPigpOworICByZXR1cm4gUmVzdWx0OworfQorCisKKy8vLyB0YWtlRGVsZXRlZFN5bWJvbHNGb3JGdW5jdGlvbiAtIElmIHdlIGhhdmUgYW55IGRlbGV0ZWQgc3ltYm9scyBmb3IgRiwgcmV0dXJuCisvLy8gdGhlbS4KK3ZvaWQgTU1JQWRkckxhYmVsTWFwOjoKK3Rha2VEZWxldGVkU3ltYm9sc0ZvckZ1bmN0aW9uKEZ1bmN0aW9uICpGLCBzdGQ6OnZlY3RvcjxNQ1N5bWJvbCo+ICZSZXN1bHQpIHsKKyAgRGVuc2VNYXA8QXNzZXJ0aW5nVkg8RnVuY3Rpb24+LCBzdGQ6OnZlY3RvcjxNQ1N5bWJvbCo+ID46Oml0ZXJhdG9yIEkgPQorICAgIERlbGV0ZWRBZGRyTGFiZWxzTmVlZGluZ0VtaXNzaW9uLmZpbmQoRik7CisKKyAgLy8gSWYgdGhlcmUgYXJlIG5vIGVudHJpZXMgZm9yIHRoZSBmdW5jdGlvbiwganVzdCByZXR1cm4uCisgIGlmIChJID09IERlbGV0ZWRBZGRyTGFiZWxzTmVlZGluZ0VtaXNzaW9uLmVuZCgpKSByZXR1cm47CisgIAorICAvLyBPdGhlcndpc2UsIHRha2UgdGhlIGxpc3QuCisgIHN0ZDo6c3dhcChSZXN1bHQsIEktPnNlY29uZCk7CisgIERlbGV0ZWRBZGRyTGFiZWxzTmVlZGluZ0VtaXNzaW9uLmVyYXNlKEkpOworfQorCisKK3ZvaWQgTU1JQWRkckxhYmVsTWFwOjpVcGRhdGVGb3JEZWxldGVkQmxvY2soQmFzaWNCbG9jayAqQkIpIHsKKyAgLy8gSWYgdGhlIGJsb2NrIGdvdCBkZWxldGVkLCB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGUgc3ltYm9sLiAgSWYgdGhlIHN5bWJvbAorICAvLyB3YXMgYWxyZWFkeSBlbWl0dGVkLCB3ZSBjYW4ganVzdCBmb3JnZXQgYWJvdXQgaXQsIG90aGVyd2lzZSB3ZSBuZWVkIHRvCisgIC8vIHF1ZXVlIGl0IHVwIGZvciBsYXRlciBlbWlzc2lvbiB3aGVuIHRoZSBmdW5jdGlvbiBpcyBvdXRwdXQuCisgIEFkZHJMYWJlbFN5bUVudHJ5IEVudHJ5ID0gQWRkckxhYmVsU3ltYm9sc1tCQl07CisgIEFkZHJMYWJlbFN5bWJvbHMuZXJhc2UoQkIpOworICBhc3NlcnQoIUVudHJ5LlN5bWJvbHMuaXNOdWxsKCkgJiYgIkRpZG4ndCBoYXZlIGEgc3ltYm9sLCB3aHkgYSBjYWxsYmFjaz8iKTsKKyAgQkJDYWxsYmFja3NbRW50cnkuSW5kZXhdID0gMDsgIC8vIENsZWFyIHRoZSBjYWxsYmFjay4KKworICBhc3NlcnQoKEJCLT5nZXRQYXJlbnQoKSA9PSAwIHx8IEJCLT5nZXRQYXJlbnQoKSA9PSBFbnRyeS5GbikgJiYKKyAgICAgICAgICJCbG9jay9wYXJlbnQgbWlzbWF0Y2giKTsKKworICAvLyBIYW5kbGUgYm90aCB0aGUgc2luZ2xlIGFuZCB0aGUgbXVsdGlwbGUgc3ltYm9scyBjYXNlcy4KKyAgaWYgKE1DU3ltYm9sICpTeW0gPSBFbnRyeS5TeW1ib2xzLmR5bl9jYXN0PE1DU3ltYm9sKj4oKSkgeworICAgIGlmIChTeW0tPmlzRGVmaW5lZCgpKQorICAgICAgcmV0dXJuOworICAKKyAgICAvLyBJZiB0aGUgYmxvY2sgaXMgbm90IHlldCBkZWZpbmVkLCB3ZSBuZWVkIHRvIGVtaXQgaXQgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAvLyBmdW5jdGlvbi4gIEFkZCB0aGUgc3ltYm9sIHRvIHRoZSBEZWxldGVkQWRkckxhYmVsc05lZWRpbmdFbWlzc2lvbiBsaXN0CisgICAgLy8gZm9yIHRoZSBjb250YWluaW5nIEZ1bmN0aW9uLiAgU2luY2UgdGhlIGJsb2NrIGlzIGJlaW5nIGRlbGV0ZWQsIGl0cworICAgIC8vIHBhcmVudCBtYXkgYWxyZWFkeSBiZSByZW1vdmVkLCB3ZSBoYXZlIHRvIGdldCB0aGUgZnVuY3Rpb24gZnJvbSAnRW50cnknLgorICAgIERlbGV0ZWRBZGRyTGFiZWxzTmVlZGluZ0VtaXNzaW9uW0VudHJ5LkZuXS5wdXNoX2JhY2soU3ltKTsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxNQ1N5bWJvbCo+ICpTeW1zID0gRW50cnkuU3ltYm9scy5nZXQ8c3RkOjp2ZWN0b3I8TUNTeW1ib2wqPio+KCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3ltcy0+c2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgTUNTeW1ib2wgKlN5bSA9ICgqU3ltcylbaV07CisgICAgICBpZiAoU3ltLT5pc0RlZmluZWQoKSkgY29udGludWU7ICAvLyBJZ25vcmUgYWxyZWFkeSBlbWl0dGVkIGxhYmVscy4KKyAgICAgIAorICAgICAgLy8gSWYgdGhlIGJsb2NrIGlzIG5vdCB5ZXQgZGVmaW5lZCwgd2UgbmVlZCB0byBlbWl0IGl0IGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAvLyBmdW5jdGlvbi4gIEFkZCB0aGUgc3ltYm9sIHRvIHRoZSBEZWxldGVkQWRkckxhYmVsc05lZWRpbmdFbWlzc2lvbiBsaXN0CisgICAgICAvLyBmb3IgdGhlIGNvbnRhaW5pbmcgRnVuY3Rpb24uICBTaW5jZSB0aGUgYmxvY2sgaXMgYmVpbmcgZGVsZXRlZCwgaXRzCisgICAgICAvLyBwYXJlbnQgbWF5IGFscmVhZHkgYmUgcmVtb3ZlZCwgd2UgaGF2ZSB0byBnZXQgdGhlIGZ1bmN0aW9uIGZyb20KKyAgICAgIC8vICdFbnRyeScuCisgICAgICBEZWxldGVkQWRkckxhYmVsc05lZWRpbmdFbWlzc2lvbltFbnRyeS5Gbl0ucHVzaF9iYWNrKFN5bSk7CisgICAgfQorICAgIAorICAgIC8vIFRoZSBlbnRyeSBpcyBkZWxldGVkLCBmcmVlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wgbGlzdC4KKyAgICBkZWxldGUgU3ltczsKKyAgfQorfQorCit2b2lkIE1NSUFkZHJMYWJlbE1hcDo6VXBkYXRlRm9yUkFVV0Jsb2NrKEJhc2ljQmxvY2sgKk9sZCwgQmFzaWNCbG9jayAqTmV3KSB7CisgIC8vIEdldCB0aGUgZW50cnkgZm9yIHRoZSBSQVVXJ2QgYmxvY2sgYW5kIHJlbW92ZSBpdCBmcm9tIG91ciBtYXAuCisgIEFkZHJMYWJlbFN5bUVudHJ5IE9sZEVudHJ5ID0gQWRkckxhYmVsU3ltYm9sc1tPbGRdOworICBBZGRyTGFiZWxTeW1ib2xzLmVyYXNlKE9sZCk7CisgIGFzc2VydCghT2xkRW50cnkuU3ltYm9scy5pc051bGwoKSAmJiAiRGlkbid0IGhhdmUgYSBzeW1ib2wsIHdoeSBhIGNhbGxiYWNrPyIpOworCisgIEFkZHJMYWJlbFN5bUVudHJ5ICZOZXdFbnRyeSA9IEFkZHJMYWJlbFN5bWJvbHNbTmV3XTsKKworICAvLyBJZiBOZXcgaXMgbm90IGFkZHJlc3MgdGFrZW4sIGp1c3QgbW92ZSBvdXIgc3ltYm9sIG92ZXIgdG8gaXQuCisgIGlmIChOZXdFbnRyeS5TeW1ib2xzLmlzTnVsbCgpKSB7CisgICAgQkJDYWxsYmFja3NbT2xkRW50cnkuSW5kZXhdLnNldFB0cihOZXcpOyAgICAvLyBVcGRhdGUgdGhlIGNhbGxiYWNrLgorICAgIE5ld0VudHJ5ID0gT2xkRW50cnk7ICAgICAvLyBTZXQgTmV3J3MgZW50cnkuCisgICAgcmV0dXJuOworICB9CisKKyAgQkJDYWxsYmFja3NbT2xkRW50cnkuSW5kZXhdID0gMDsgICAgLy8gVXBkYXRlIHRoZSBjYWxsYmFjay4KKworICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gYWRkIHRoZSBvbGQgc3ltYm9sIHRvIHRoZSBuZXcgYmxvY2sncyBzZXQuICBJZiBpdCBpcworICAvLyBqdXN0IGEgc2luZ2xlIGVudHJ5LCB1cGdyYWRlIGl0IHRvIGEgc3ltYm9sIGxpc3QuCisgIGlmIChNQ1N5bWJvbCAqUHJldlN5bSA9IE5ld0VudHJ5LlN5bWJvbHMuZHluX2Nhc3Q8TUNTeW1ib2wqPigpKSB7CisgICAgc3RkOjp2ZWN0b3I8TUNTeW1ib2wqPiAqU3ltTGlzdCA9IG5ldyBzdGQ6OnZlY3RvcjxNQ1N5bWJvbCo+KCk7CisgICAgU3ltTGlzdC0+cHVzaF9iYWNrKFByZXZTeW0pOworICAgIE5ld0VudHJ5LlN5bWJvbHMgPSBTeW1MaXN0OworICB9CisgICAgICAKKyAgc3RkOjp2ZWN0b3I8TUNTeW1ib2wqPiAqU3ltTGlzdCA9CisgICAgTmV3RW50cnkuU3ltYm9scy5nZXQ8c3RkOjp2ZWN0b3I8TUNTeW1ib2wqPio+KCk7CisKKyAgLy8gSWYgdGhlIG9sZCBlbnRyeSB3YXMgYSBzaW5nbGUgc3ltYm9sLCBhZGQgaXQuCisgIGlmIChNQ1N5bWJvbCAqU3ltID0gT2xkRW50cnkuU3ltYm9scy5keW5fY2FzdDxNQ1N5bWJvbCo+KCkpIHsKKyAgICBTeW1MaXN0LT5wdXNoX2JhY2soU3ltKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIE90aGVyd2lzZSwgY29uY2F0ZW5hdGUgdGhlIGxpc3QuCisgIHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4gKlN5bXMgPU9sZEVudHJ5LlN5bWJvbHMuZ2V0PHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4qPigpOworICBTeW1MaXN0LT5pbnNlcnQoU3ltTGlzdC0+ZW5kKCksIFN5bXMtPmJlZ2luKCksIFN5bXMtPmVuZCgpKTsKKyAgZGVsZXRlIFN5bXM7Cit9CisKKwordm9pZCBNTUlBZGRyTGFiZWxNYXBDYWxsYmFja1B0cjo6ZGVsZXRlZCgpIHsKKyAgTWFwLT5VcGRhdGVGb3JEZWxldGVkQmxvY2soY2FzdDxCYXNpY0Jsb2NrPihnZXRWYWxQdHIoKSkpOworfQorCit2b2lkIE1NSUFkZHJMYWJlbE1hcENhbGxiYWNrUHRyOjphbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICpWMikgeworICBNYXAtPlVwZGF0ZUZvclJBVVdCbG9jayhjYXN0PEJhc2ljQmxvY2s+KGdldFZhbFB0cigpKSwgY2FzdDxCYXNpY0Jsb2NrPihWMikpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK01hY2hpbmVNb2R1bGVJbmZvOjpNYWNoaW5lTW9kdWxlSW5mbyhjb25zdCBNQ0FzbUluZm8gJk1BSSkKKzogSW1tdXRhYmxlUGFzcyhJRCksIENvbnRleHQoTUFJKSwKKyAgT2JqRmlsZU1NSSgwKSwKKyAgQ3VyQ2FsbFNpdGUoMCksIERiZ0luZm9BdmFpbGFibGUoZmFsc2UpeworICBBZGRyTGFiZWxTeW1ib2xzID0gMDsKKyAgVGhlTW9kdWxlID0gMDsKK30KKworTWFjaGluZU1vZHVsZUluZm86Ok1hY2hpbmVNb2R1bGVJbmZvKCkKKzogSW1tdXRhYmxlUGFzcyhJRCksIENvbnRleHQoKihNQ0FzbUluZm8qKTApIHsKKyAgYXNzZXJ0KDAgJiYgIlRoaXMgTWFjaGluZU1vZHVsZUluZm8gY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCwgTU1JICIKKyAgICAgICAgICJzaG91bGQgYWx3YXlzIGJlIGV4cGxpY2l0bHkgY29uc3RydWN0ZWQgYnkgTExWTVRhcmdldE1hY2hpbmUiKTsKKyAgYWJvcnQoKTsKK30KKworTWFjaGluZU1vZHVsZUluZm86On5NYWNoaW5lTW9kdWxlSW5mbygpIHsKKyAgZGVsZXRlIE9iakZpbGVNTUk7CisgIAorICAvLyBGSVhNRTogV2h5IGlzbid0IGRvRmluYWxpemF0aW9uIGJlaW5nIGNhbGxlZD8/CisgIC8vYXNzZXJ0KEFkZHJMYWJlbFN5bWJvbHMgPT0gMCAmJiAiZG9GaW5hbGl6YXRpb24gbm90IGNhbGxlZCIpOworICBkZWxldGUgQWRkckxhYmVsU3ltYm9sczsKKyAgQWRkckxhYmVsU3ltYm9scyA9IDA7Cit9CisKKy8vLyBkb0luaXRpYWxpemF0aW9uIC0gSW5pdGlhbGl6ZSB0aGUgc3RhdGUgZm9yIGEgbmV3IG1vZHVsZS4KKy8vLworYm9vbCBNYWNoaW5lTW9kdWxlSW5mbzo6ZG9Jbml0aWFsaXphdGlvbigpIHsKKyAgYXNzZXJ0KEFkZHJMYWJlbFN5bWJvbHMgPT0gMCAmJiAiSW1wcm9wZXJseSBpbml0aWFsaXplZCIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBkb0ZpbmFsaXphdGlvbiAtIFRlYXIgZG93biB0aGUgc3RhdGUgYWZ0ZXIgY29tcGxldGlvbiBvZiBhIG1vZHVsZS4KKy8vLworYm9vbCBNYWNoaW5lTW9kdWxlSW5mbzo6ZG9GaW5hbGl6YXRpb24oKSB7CisgIGRlbGV0ZSBBZGRyTGFiZWxTeW1ib2xzOworICBBZGRyTGFiZWxTeW1ib2xzID0gMDsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gRW5kRnVuY3Rpb24gLSBEaXNjYXJkIGZ1bmN0aW9uIG1ldGEgaW5mb3JtYXRpb24uCisvLy8KK3ZvaWQgTWFjaGluZU1vZHVsZUluZm86OkVuZEZ1bmN0aW9uKCkgeworICAvLyBDbGVhbiB1cCBmcmFtZSBpbmZvLgorICBGcmFtZU1vdmVzLmNsZWFyKCk7CisKKyAgLy8gQ2xlYW4gdXAgZXhjZXB0aW9uIGluZm8uCisgIENhbGxTaXRlTWFwLmNsZWFyKCk7CisgIFR5cGVJbmZvcy5jbGVhcigpOworICBGaWx0ZXJJZHMuY2xlYXIoKTsKKyAgRmlsdGVyRW5kcy5jbGVhcigpOworICBWYXJpYWJsZURiZ0luZm8uY2xlYXIoKTsKK30KKworLy8vIEFuYWx5emVNb2R1bGUgLSBTY2FuIHRoZSBtb2R1bGUgZm9yIGdsb2JhbCBkZWJ1ZyBpbmZvcm1hdGlvbi4KKy8vLwordm9pZCBNYWNoaW5lTW9kdWxlSW5mbzo6QW5hbHl6ZU1vZHVsZShjb25zdCBNb2R1bGUgJk0pIHsKKyAgLy8gSW5zZXJ0IGZ1bmN0aW9ucyBpbiB0aGUgbGx2bS51c2VkIGFycmF5IChidXQgbm90IGxsdm0uY29tcGlsZXIudXNlZCkgaW50bworICAvLyBVc2VkRnVuY3Rpb25zLgorICBjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YgPSBNLmdldEdsb2JhbFZhcmlhYmxlKCJsbHZtLnVzZWQiKTsKKyAgaWYgKCFHViB8fCAhR1YtPmhhc0luaXRpYWxpemVyKCkpIHJldHVybjsKKworICAvLyBTaG91bGQgYmUgYW4gYXJyYXkgb2YgJ2k4KicuCisgIGNvbnN0IENvbnN0YW50QXJyYXkgKkluaXRMaXN0ID0gZHluX2Nhc3Q8Q29uc3RhbnRBcnJheT4oR1YtPmdldEluaXRpYWxpemVyKCkpOworICBpZiAoSW5pdExpc3QgPT0gMCkgcmV0dXJuOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbml0TGlzdC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uICpGID0KKyAgICAgICAgICBkeW5fY2FzdDxGdW5jdGlvbj4oSW5pdExpc3QtPmdldE9wZXJhbmQoaSktPnN0cmlwUG9pbnRlckNhc3RzKCkpKQorICAgICAgVXNlZEZ1bmN0aW9ucy5pbnNlcnQoRik7Cit9CisKKy8vPT09LSBBZGRyZXNzIG9mIEJsb2NrIE1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8vIGdldEFkZHJMYWJlbFN5bWJvbCAtIFJldHVybiB0aGUgc3ltYm9sIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQgYmFzaWMKKy8vLyBibG9jayB3aGVuIGl0cyBhZGRyZXNzIGlzIHRha2VuLiAgVGhpcyBjYW5ub3QgYmUgaXRzIG5vcm1hbCBMQkIgbGFiZWwKKy8vLyBiZWNhdXNlIHRoZSBibG9jayBtYXkgYmUgYWNjZXNzZWQgb3V0c2lkZSBpdHMgY29udGFpbmluZyBmdW5jdGlvbi4KK01DU3ltYm9sICpNYWNoaW5lTW9kdWxlSW5mbzo6Z2V0QWRkckxhYmVsU3ltYm9sKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIC8vIExhemlseSBjcmVhdGUgQWRkckxhYmVsU3ltYm9scy4KKyAgaWYgKEFkZHJMYWJlbFN5bWJvbHMgPT0gMCkKKyAgICBBZGRyTGFiZWxTeW1ib2xzID0gbmV3IE1NSUFkZHJMYWJlbE1hcChDb250ZXh0KTsKKyAgcmV0dXJuIEFkZHJMYWJlbFN5bWJvbHMtPmdldEFkZHJMYWJlbFN5bWJvbChjb25zdF9jYXN0PEJhc2ljQmxvY2sqPihCQikpOworfQorCisvLy8gZ2V0QWRkckxhYmVsU3ltYm9sVG9FbWl0IC0gUmV0dXJuIHRoZSBzeW1ib2wgdG8gYmUgdXNlZCBmb3IgdGhlIHNwZWNpZmllZAorLy8vIGJhc2ljIGJsb2NrIHdoZW4gaXRzIGFkZHJlc3MgaXMgdGFrZW4uICBJZiBvdGhlciBibG9ja3Mgd2VyZSBSQVVXJ2QgdG8KKy8vLyB0aGlzIG9uZSwgd2UgbWF5IGhhdmUgdG8gZW1pdCB0aGVtIGFzIHdlbGwsIHJldHVybiB0aGUgd2hvbGUgc2V0Lgorc3RkOjp2ZWN0b3I8TUNTeW1ib2wqPiBNYWNoaW5lTW9kdWxlSW5mbzo6CitnZXRBZGRyTGFiZWxTeW1ib2xUb0VtaXQoY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgLy8gTGF6aWx5IGNyZWF0ZSBBZGRyTGFiZWxTeW1ib2xzLgorICBpZiAoQWRkckxhYmVsU3ltYm9scyA9PSAwKQorICAgIEFkZHJMYWJlbFN5bWJvbHMgPSBuZXcgTU1JQWRkckxhYmVsTWFwKENvbnRleHQpOworIHJldHVybiBBZGRyTGFiZWxTeW1ib2xzLT5nZXRBZGRyTGFiZWxTeW1ib2xUb0VtaXQoY29uc3RfY2FzdDxCYXNpY0Jsb2NrKj4oQkIpKTsKK30KKworCisvLy8gdGFrZURlbGV0ZWRTeW1ib2xzRm9yRnVuY3Rpb24gLSBJZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGhhcyBoYWQgYW55CisvLy8gcmVmZXJlbmNlcyB0byBhZGRyZXNzLXRha2VuIGJsb2NrcyBnZW5lcmF0ZWQsIGJ1dCB0aGUgYmxvY2sgZ290IGRlbGV0ZWQsCisvLy8gcmV0dXJuIHRoZSBzeW1ib2wgbm93IHNvIHdlIGNhbiBlbWl0IGl0LiAgVGhpcyBwcmV2ZW50cyBlbWl0dGluZyBhCisvLy8gcmVmZXJlbmNlIHRvIGEgc3ltYm9sIHRoYXQgaGFzIG5vIGRlZmluaXRpb24uCit2b2lkIE1hY2hpbmVNb2R1bGVJbmZvOjoKK3Rha2VEZWxldGVkU3ltYm9sc0ZvckZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TUNTeW1ib2wqPiAmUmVzdWx0KSB7CisgIC8vIElmIG5vIGJsb2NrcyBoYXZlIGhhZCB0aGVpciBhZGRyZXNzZXMgdGFrZW4sIHdlJ3JlIGRvbmUuCisgIGlmIChBZGRyTGFiZWxTeW1ib2xzID09IDApIHJldHVybjsKKyAgcmV0dXJuIEFkZHJMYWJlbFN5bWJvbHMtPgorICAgICB0YWtlRGVsZXRlZFN5bWJvbHNGb3JGdW5jdGlvbihjb25zdF9jYXN0PEZ1bmN0aW9uKj4oRiksIFJlc3VsdCk7Cit9CisKKy8vLyBnZXRUeXBlSURGb3IgLSBSZXR1cm4gdGhlIHR5cGUgaWQgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZWluZm8uICBUaGlzIGlzCisvLy8gZnVuY3Rpb24gd2lkZS4KK3Vuc2lnbmVkIE1hY2hpbmVNb2R1bGVJbmZvOjpnZXRUeXBlSURGb3IoY29uc3QgR2xvYmFsVmFyaWFibGUgKlRJKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIE4gPSBUeXBlSW5mb3Muc2l6ZSgpOyBpICE9IE47ICsraSkKKyAgICBpZiAoVHlwZUluZm9zW2ldID09IFRJKSByZXR1cm4gaSArIDE7CisKKyAgVHlwZUluZm9zLnB1c2hfYmFjayhUSSk7CisgIHJldHVybiBUeXBlSW5mb3Muc2l6ZSgpOworfQorCisvLy8gZ2V0RmlsdGVySURGb3IgLSBSZXR1cm4gdGhlIGZpbHRlciBpZCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlaW5mb3MuICBUaGlzIGlzCisvLy8gZnVuY3Rpb24gd2lkZS4KK2ludCBNYWNoaW5lTW9kdWxlSW5mbzo6Z2V0RmlsdGVySURGb3Ioc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZUeUlkcykgeworICAvLyBJZiB0aGUgbmV3IGZpbHRlciBjb2luY2lkZXMgd2l0aCB0aGUgdGFpbCBvZiBhbiBleGlzdGluZyBmaWx0ZXIsIHRoZW4KKyAgLy8gcmUtdXNlIHRoZSBleGlzdGluZyBmaWx0ZXIuICBGb2xkaW5nIGZpbHRlcnMgbW9yZSB0aGFuIHRoaXMgcmVxdWlyZXMKKyAgLy8gcmUtb3JkZXJpbmcgZmlsdGVycyBhbmQvb3IgdGhlaXIgZWxlbWVudHMgLSBwcm9iYWJseSBub3Qgd29ydGggaXQuCisgIGZvciAoc3RkOjp2ZWN0b3I8dW5zaWduZWQ+OjppdGVyYXRvciBJID0gRmlsdGVyRW5kcy5iZWdpbigpLAorICAgICAgIEUgPSBGaWx0ZXJFbmRzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIHVuc2lnbmVkIGkgPSAqSSwgaiA9IFR5SWRzLnNpemUoKTsKKworICAgIHdoaWxlIChpICYmIGopCisgICAgICBpZiAoRmlsdGVySWRzWy0taV0gIT0gVHlJZHNbLS1qXSkKKyAgICAgICAgZ290byB0cnlfbmV4dDsKKworICAgIGlmICghaikKKyAgICAgIC8vIFRoZSBuZXcgZmlsdGVyIGNvaW5jaWRlcyB3aXRoIHJhbmdlIFtpLCBlbmQpIG9mIHRoZSBleGlzdGluZyBmaWx0ZXIuCisgICAgICByZXR1cm4gLSgxICsgaSk7CisKK3RyeV9uZXh0OjsKKyAgfQorCisgIC8vIEFkZCB0aGUgbmV3IGZpbHRlci4KKyAgaW50IEZpbHRlcklEID0gLSgxICsgRmlsdGVySWRzLnNpemUoKSk7CisgIEZpbHRlcklkcy5yZXNlcnZlKEZpbHRlcklkcy5zaXplKCkgKyBUeUlkcy5zaXplKCkgKyAxKTsKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFR5SWRzLnNpemUoKTsgSSAhPSBOOyArK0kpCisgICAgRmlsdGVySWRzLnB1c2hfYmFjayhUeUlkc1tJXSk7CisgIEZpbHRlckVuZHMucHVzaF9iYWNrKEZpbHRlcklkcy5zaXplKCkpOworICBGaWx0ZXJJZHMucHVzaF9iYWNrKDApOyAvLyB0ZXJtaW5hdG9yCisgIHJldHVybiBGaWx0ZXJJRDsKK30KKworbmFtZXNwYWNlIHsKKyAgLy8vIFZhcmlhYmxlRGVidWdTb3J0ZXIgLSBDb21wYXJpc29uIHRvIHNvcnQgdGhlIFZhcmlhYmxlRGJnSW5mbyBtYXAKKyAgLy8vIGJ5IHNvdXJjZSBsb2NhdGlvbiwgdG8gYXZvaWQgZGVwZW5kaW5nIG9uIHRoZSBhcmJpdHJhcnkgb3JkZXIgdGhhdAorICAvLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHZpc2l0cyB2YXJpYWJsZXMgaW4uCisgIHN0cnVjdCBWYXJpYWJsZURlYnVnU29ydGVyIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgTWFjaGluZU1vZHVsZUluZm86OlZhcmlhYmxlRGJnSW5mb01hcFR5Ojp2YWx1ZV90eXBlICZBLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTW9kdWxlSW5mbzo6VmFyaWFibGVEYmdJbmZvTWFwVHk6OnZhbHVlX3R5cGUgJkIpCisgICAgICAgICAgICAgICAgICBjb25zdCB7CisgICAgICAgaWYgKEEuc2Vjb25kLnNlY29uZC5nZXRMaW5lKCkgIT0gQi5zZWNvbmQuc2Vjb25kLmdldExpbmUoKSkKKyAgICAgICAgIHJldHVybiBBLnNlY29uZC5zZWNvbmQuZ2V0TGluZSgpIDwgQi5zZWNvbmQuc2Vjb25kLmdldExpbmUoKTsKKyAgICAgICBpZiAoQS5zZWNvbmQuc2Vjb25kLmdldENvbCgpICE9IEIuc2Vjb25kLnNlY29uZC5nZXRDb2woKSkKKyAgICAgICAgIHJldHVybiBBLnNlY29uZC5zZWNvbmQuZ2V0Q29sKCkgPCBCLnNlY29uZC5zZWNvbmQuZ2V0Q29sKCk7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvSW1wbHMuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiNTZjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvSW1wbHMuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvSW1wbHMuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgb2JqZWN0LWZpbGUgZm9ybWF0IHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBvZgorLy8gTWFjaGluZU1vZHVsZUluZm9JbXBsLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWFjaGluZU1vZHVsZUluZm9NYWNoTworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QuCit2b2lkIE1hY2hpbmVNb2R1bGVJbmZvTWFjaE86OkFuY2hvcigpIHt9Cit2b2lkIE1hY2hpbmVNb2R1bGVJbmZvRUxGOjpBbmNob3IoKSB7fQorCitzdGF0aWMgaW50IFNvcnRTeW1ib2xQYWlyKGNvbnN0IHZvaWQgKkxIUywgY29uc3Qgdm9pZCAqUkhTKSB7CisgIHR5cGVkZWYgc3RkOjpwYWlyPE1DU3ltYm9sKiwgTWFjaGluZU1vZHVsZUluZm9JbXBsOjpTdHViVmFsdWVUeT4gUGFpclR5OworICBjb25zdCBNQ1N5bWJvbCAqTEhTUyA9ICgoY29uc3QgUGFpclR5ICopTEhTKS0+Zmlyc3Q7CisgIGNvbnN0IE1DU3ltYm9sICpSSFNTID0gKChjb25zdCBQYWlyVHkgKilSSFMpLT5maXJzdDsKKyAgcmV0dXJuIExIU1MtPmdldE5hbWUoKS5jb21wYXJlKFJIU1MtPmdldE5hbWUoKSk7Cit9CisKKy8vLyBHZXRTb3J0ZWRTdHVicyAtIFJldHVybiB0aGUgZW50cmllcyBmcm9tIGEgRGVuc2VNYXAgaW4gYSBkZXRlcm1pbmlzdGljCisvLy8gc29ydGVkIG9yZXIuCitNYWNoaW5lTW9kdWxlSW5mb0ltcGw6OlN5bWJvbExpc3RUeQorTWFjaGluZU1vZHVsZUluZm9JbXBsOjpHZXRTb3J0ZWRTdHVicyhjb25zdCBEZW5zZU1hcDxNQ1N5bWJvbCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6U3R1YlZhbHVlVHk+Jk1hcCkgeworICBNYWNoaW5lTW9kdWxlSW5mb0ltcGw6OlN5bWJvbExpc3RUeSBMaXN0KE1hcC5iZWdpbigpLCBNYXAuZW5kKCkpOworCisgIGlmICghTGlzdC5lbXB0eSgpKQorICAgIHFzb3J0KCZMaXN0WzBdLCBMaXN0LnNpemUoKSwgc2l6ZW9mKExpc3RbMF0pLCBTb3J0U3ltYm9sUGFpcik7CisgIHJldHVybiBMaXN0OworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVQYXNzUmVnaXN0cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNGVmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmNwcApAQCAtMCwwICsxLDQxIEBACisvLz09PS0tIENvZGVHZW4vTWFjaGluZUluc3RyLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFjaGluZSBmdW5jdGlvbiBwYXNzIHJlZ2lzdHJ5IGZvciByZWdpc3RlciBhbGxvY2F0b3JzCisvLyBhbmQgaW5zdHJ1Y3Rpb24gc2NoZWR1bGVycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVQYXNzUmVnaXN0cnkuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKworLy8vIEFkZCAtIEFkZHMgYSBmdW5jdGlvbiBwYXNzIHRvIHRoZSByZWdpc3RyYXRpb24gbGlzdC4KKy8vLwordm9pZCBNYWNoaW5lUGFzc1JlZ2lzdHJ5OjpBZGQoTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKk5vZGUpIHsKKyAgTm9kZS0+c2V0TmV4dChMaXN0KTsKKyAgTGlzdCA9IE5vZGU7CisgIGlmIChMaXN0ZW5lcikgTGlzdGVuZXItPk5vdGlmeUFkZChOb2RlLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRDdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXREZXNjcmlwdGlvbigpKTsKK30KKworCisvLy8gUmVtb3ZlIC0gUmVtb3ZlcyBhIGZ1bmN0aW9uIHBhc3MgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGxpc3QuCisvLy8KK3ZvaWQgTWFjaGluZVBhc3NSZWdpc3RyeTo6UmVtb3ZlKE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlICpOb2RlKSB7CisgIGZvciAoTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKipJID0gJkxpc3Q7ICpJOyBJID0gKCpJKS0+Z2V0TmV4dEFkZHJlc3MoKSkgeworICAgIGlmICgqSSA9PSBOb2RlKSB7CisgICAgICBpZiAoTGlzdGVuZXIpIExpc3RlbmVyLT5Ob3RpZnlSZW1vdmUoTm9kZS0+Z2V0TmFtZSgpKTsKKyAgICAgICpJID0gKCpJKS0+Z2V0TmV4dCgpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODUyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmNwcApAQCAtMCwwICsxLDIyNCBAQAorLy89PT0tLSBsaWIvQ29kZWdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWFjaGluZVJlZ2lzdGVySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01hY2hpbmVSZWdpc3RlckluZm86Ok1hY2hpbmVSZWdpc3RlckluZm8oY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIHsKKyAgVlJlZ0luZm8ucmVzZXJ2ZSgyNTYpOworICBSZWdBbGxvY0hpbnRzLnJlc2VydmUoMjU2KTsKKyAgUmVnQ2xhc3MyVlJlZ01hcCA9IG5ldyBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD5bVFJJLmdldE51bVJlZ0NsYXNzZXMoKV07CisgIFVzZWRQaHlzUmVncy5yZXNpemUoVFJJLmdldE51bVJlZ3MoKSk7CisgIAorICAvLyBDcmVhdGUgdGhlIHBoeXNyZWcgdXNlL2RlZiBsaXN0cy4KKyAgUGh5c1JlZ1VzZURlZkxpc3RzID0gbmV3IE1hY2hpbmVPcGVyYW5kKltUUkkuZ2V0TnVtUmVncygpXTsKKyAgbWVtc2V0KFBoeXNSZWdVc2VEZWZMaXN0cywgMCwgc2l6ZW9mKE1hY2hpbmVPcGVyYW5kKikqVFJJLmdldE51bVJlZ3MoKSk7Cit9CisKK01hY2hpbmVSZWdpc3RlckluZm86On5NYWNoaW5lUmVnaXN0ZXJJbmZvKCkgeworI2lmbmRlZiBOREVCVUcKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZSZWdJbmZvLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgYXNzZXJ0KFZSZWdJbmZvW2ldLnNlY29uZCA9PSAwICYmICJWcmVnIHVzZSBsaXN0IG5vbi1lbXB0eSBzdGlsbD8iKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFVzZWRQaHlzUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGFzc2VydCghUGh5c1JlZ1VzZURlZkxpc3RzW2ldICYmCisgICAgICAgICAgICJQaHlzUmVnVXNlRGVmTGlzdHMgaGFzIGVudHJpZXMgYWZ0ZXIgYWxsIGluc3RydWN0aW9ucyBhcmUgZGVsZXRlZCIpOworI2VuZGlmCisgIGRlbGV0ZSBbXSBQaHlzUmVnVXNlRGVmTGlzdHM7CisgIGRlbGV0ZSBbXSBSZWdDbGFzczJWUmVnTWFwOworfQorCisvLy8gc2V0UmVnQ2xhc3MgLSBTZXQgdGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3Rlci4KKy8vLwordm9pZAorTWFjaGluZVJlZ2lzdGVySW5mbzo6c2V0UmVnQ2xhc3ModW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgeworICB1bnNpZ25lZCBWUiA9IFJlZzsKKyAgUmVnIC09IFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXI7CisgIGFzc2VydChSZWcgPCBWUmVnSW5mby5zaXplKCkgJiYgIkludmFsaWQgdnJlZyEiKTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqT2xkUkMgPSBWUmVnSW5mb1tSZWddLmZpcnN0OworICBWUmVnSW5mb1tSZWddLmZpcnN0ID0gUkM7CisKKyAgLy8gUmVtb3ZlIGZyb20gb2xkIHJlZ2lzdGVyIGNsYXNzJ3MgdnJlZ3MgbGlzdC4gVGhpcyBtYXkgYmUgc2xvdyBidXQKKyAgLy8gZm9ydHVuYXRlbHkgdGhpcyBvcGVyYXRpb24gaXMgcmFyZWx5IG5lZWRlZC4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZWUmVncyA9IFJlZ0NsYXNzMlZSZWdNYXBbT2xkUkMtPmdldElEKCldOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD46Oml0ZXJhdG9yIEkgPSBzdGQ6OmZpbmQoVlJlZ3MuYmVnaW4oKSwgVlJlZ3MuZW5kKCksIFZSKTsKKyAgVlJlZ3MuZXJhc2UoSSk7CisKKyAgLy8gQWRkIHRvIG5ldyByZWdpc3RlciBjbGFzcydzIHZyZWdzIGxpc3QuCisgIFJlZ0NsYXNzMlZSZWdNYXBbUkMtPmdldElEKCldLnB1c2hfYmFjayhWUik7Cit9CisKKy8vLyBjcmVhdGVWaXJ0dWFsUmVnaXN0ZXIgLSBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB2aXJ0dWFsIHJlZ2lzdGVyIGluIHRoZQorLy8vIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcy4KKy8vLwordW5zaWduZWQKK01hY2hpbmVSZWdpc3RlckluZm86OmNyZWF0ZVZpcnR1YWxSZWdpc3Rlcihjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSZWdDbGFzcyl7CisgIGFzc2VydChSZWdDbGFzcyAmJiAiQ2Fubm90IGNyZWF0ZSByZWdpc3RlciB3aXRob3V0IFJlZ0NsYXNzISIpOworICAvLyBBZGQgYSByZWcsIGJ1dCBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHZlY3RvciByZWFsbG9jYXRlZCBvciBub3QuCisgIHZvaWQgKkFycmF5QmFzZSA9IFZSZWdJbmZvLmVtcHR5KCkgPyAwIDogJlZSZWdJbmZvWzBdOworICBWUmVnSW5mby5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUmVnQ2xhc3MsIChNYWNoaW5lT3BlcmFuZCopMCkpOworICBSZWdBbGxvY0hpbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigwLCAwKSk7CisKKyAgaWYgKCEoKCZWUmVnSW5mb1swXSA9PSBBcnJheUJhc2UgfHwgVlJlZ0luZm8uc2l6ZSgpID09IDEpKSkKKyAgICAvLyBUaGUgdmVjdG9yIHJlYWxsb2NhdGVkLCBoYW5kbGUgdGhpcyBub3cuCisgICAgSGFuZGxlVlJlZ0xpc3RSZWFsbG9jYXRpb24oKTsKKyAgdW5zaWduZWQgVlIgPSBnZXRMYXN0VmlydFJlZygpOworICBSZWdDbGFzczJWUmVnTWFwW1JlZ0NsYXNzLT5nZXRJRCgpXS5wdXNoX2JhY2soVlIpOworICByZXR1cm4gVlI7Cit9CisKKy8vLyBIYW5kbGVWUmVnTGlzdFJlYWxsb2NhdGlvbiAtIFdlIGp1c3QgYWRkZWQgYSB2aXJ0dWFsIHJlZ2lzdGVyIHRvIHRoZQorLy8vIFZSZWdJbmZvIGluZm8gbGlzdCBhbmQgaXQgcmVhbGxvY2F0ZWQuICBVcGRhdGUgdGhlIHVzZS9kZWYgbGlzdHMgaW5mbworLy8vIHBvaW50ZXJzLgordm9pZCBNYWNoaW5lUmVnaXN0ZXJJbmZvOjpIYW5kbGVWUmVnTGlzdFJlYWxsb2NhdGlvbigpIHsKKyAgLy8gVGhlIGJhY2sgcG9pbnRlcnMgZm9yIHRoZSB2cmVnIGxpc3RzIHBvaW50IGludG8gdGhlIHByZXZpb3VzIHZlY3Rvci4KKyAgLy8gVXBkYXRlIHRoZW0gdG8gcG9pbnQgdG8gdGhlaXIgY29ycmVjdCBzbG90cy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZSZWdJbmZvLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAqTGlzdCA9IFZSZWdJbmZvW2ldLnNlY29uZDsKKyAgICBpZiAoIUxpc3QpIGNvbnRpbnVlOworICAgIC8vIFVwZGF0ZSB0aGUgYmFjay1wb2ludGVyIHRvIGJlIGFjY3VyYXRlIG9uY2UgbW9yZS4KKyAgICBMaXN0LT5Db250ZW50cy5SZWcuUHJldiA9ICZWUmVnSW5mb1tpXS5zZWNvbmQ7CisgIH0KK30KKworLy8vIHJlcGxhY2VSZWdXaXRoIC0gUmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mIEZyb21SZWcgd2l0aCBUb1JlZyBpbiB0aGUKKy8vLyBtYWNoaW5lIGZ1bmN0aW9uLiAgVGhpcyBpcyBsaWtlIGxsdm0tbGV2ZWwgWC0+cmVwbGFjZUFsbFVzZXNXaXRoKFkpLAorLy8vIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hhbmdlcyBhbnkgZGVmaW5pdGlvbnMgb2YgdGhlIHJlZ2lzdGVyIGFzIHdlbGwuCit2b2lkIE1hY2hpbmVSZWdpc3RlckluZm86OnJlcGxhY2VSZWdXaXRoKHVuc2lnbmVkIEZyb21SZWcsIHVuc2lnbmVkIFRvUmVnKSB7CisgIGFzc2VydChGcm9tUmVnICE9IFRvUmVnICYmICJDYW5ub3QgcmVwbGFjZSBhIHJlZyB3aXRoIGl0c2VsZiIpOworCisgIC8vIFRPRE86IFRoaXMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQgYnkgYnVsayBjaGFuZ2luZyB0aGUgb3BlcmFuZHMuCisgIGZvciAocmVnX2l0ZXJhdG9yIEkgPSByZWdfYmVnaW4oRnJvbVJlZyksIEUgPSByZWdfZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk8gPSBJLmdldE9wZXJhbmQoKTsKKyAgICArK0k7CisgICAgTy5zZXRSZWcoVG9SZWcpOworICB9Cit9CisKKworLy8vIGdldFZSZWdEZWYgLSBSZXR1cm4gdGhlIG1hY2hpbmUgaW5zdHIgdGhhdCBkZWZpbmVzIHRoZSBzcGVjaWZpZWQgdmlydHVhbAorLy8vIHJlZ2lzdGVyIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBjb2RlIGlzIGluIFNTQQorLy8vIGZvcm0sIHNvIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBkZWZpbml0aW9uLgorTWFjaGluZUluc3RyICpNYWNoaW5lUmVnaXN0ZXJJbmZvOjpnZXRWUmVnRGVmKHVuc2lnbmVkIFJlZykgY29uc3QgeworICBhc3NlcnQoUmVnLVRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXIgPCBWUmVnSW5mby5zaXplKCkgJiYKKyAgICAgICAgICJJbnZhbGlkIHZyZWchIik7CisgIC8vIFNpbmNlIHdlIGFyZSBpbiBTU0EgZm9ybSwgd2UgY2FuIHVzZSB0aGUgZmlyc3QgZGVmaW5pdGlvbi4KKyAgaWYgKCFkZWZfZW1wdHkoUmVnKSkKKyAgICByZXR1cm4gJipkZWZfYmVnaW4oUmVnKTsKKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgTWFjaGluZVJlZ2lzdGVySW5mbzo6aGFzT25lVXNlKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgIHVzZV9pdGVyYXRvciBVSSA9IHVzZV9iZWdpbihSZWdObyk7CisgIGlmIChVSSA9PSB1c2VfZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gKytVSSA9PSB1c2VfZW5kKCk7Cit9CisKK2Jvb2wgTWFjaGluZVJlZ2lzdGVySW5mbzo6aGFzT25lTm9uREJHVXNlKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgIHVzZV9ub2RiZ19pdGVyYXRvciBVSSA9IHVzZV9ub2RiZ19iZWdpbihSZWdObyk7CisgIGlmIChVSSA9PSB1c2Vfbm9kYmdfZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gKytVSSA9PSB1c2Vfbm9kYmdfZW5kKCk7Cit9CisKKy8vLyBjbGVhcktpbGxGbGFncyAtIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHVzZXMgb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIGFuZAorLy8vIGNsZWFyIHRoZSBraWxsIGZsYWcgZnJvbSB0aGUgTWFjaGluZU9wZXJhbmQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieQorLy8vIG9wdGltaXphdGlvbiBwYXNzZXMgd2hpY2ggZXh0ZW5kIHJlZ2lzdGVyIGxpZmV0aW1lcyBhbmQgbmVlZCBvbmx5CisvLy8gcHJlc2VydmUgY29uc2VydmF0aXZlIGtpbGwgZmxhZyBpbmZvcm1hdGlvbi4KK3ZvaWQgTWFjaGluZVJlZ2lzdGVySW5mbzo6Y2xlYXJLaWxsRmxhZ3ModW5zaWduZWQgUmVnKSBjb25zdCB7CisgIGZvciAodXNlX2l0ZXJhdG9yIFVJID0gdXNlX2JlZ2luKFJlZyksIFVFID0gdXNlX2VuZCgpOyBVSSAhPSBVRTsgKytVSSkKKyAgICBVSS5nZXRPcGVyYW5kKCkuc2V0SXNLaWxsKGZhbHNlKTsKK30KKworYm9vbCBNYWNoaW5lUmVnaXN0ZXJJbmZvOjppc0xpdmVJbih1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgZm9yIChsaXZlaW5faXRlcmF0b3IgSSA9IGxpdmVpbl9iZWdpbigpLCBFID0gbGl2ZWluX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoSS0+Zmlyc3QgPT0gUmVnIHx8IEktPnNlY29uZCA9PSBSZWcpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1hY2hpbmVSZWdpc3RlckluZm86OmlzTGl2ZU91dCh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgZm9yIChsaXZlb3V0X2l0ZXJhdG9yIEkgPSBsaXZlb3V0X2JlZ2luKCksIEUgPSBsaXZlb3V0X2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoKkkgPT0gUmVnKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGdldExpdmVJblBoeXNSZWcgLSBJZiBWUmVnIGlzIGEgbGl2ZS1pbiB2aXJ0dWFsIHJlZ2lzdGVyLCByZXR1cm4gdGhlCisvLy8gY29ycmVzcG9uZGluZyBsaXZlLWluIHBoeXNpY2FsIHJlZ2lzdGVyLgordW5zaWduZWQgTWFjaGluZVJlZ2lzdGVySW5mbzo6Z2V0TGl2ZUluUGh5c1JlZyh1bnNpZ25lZCBWUmVnKSBjb25zdCB7CisgIGZvciAobGl2ZWluX2l0ZXJhdG9yIEkgPSBsaXZlaW5fYmVnaW4oKSwgRSA9IGxpdmVpbl9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKEktPnNlY29uZCA9PSBWUmVnKQorICAgICAgcmV0dXJuIEktPmZpcnN0OworICByZXR1cm4gMDsKK30KKworLy8vIGdldExpdmVJblZpcnRSZWcgLSBJZiBQUmVnIGlzIGEgbGl2ZS1pbiBwaHlzaWNhbCByZWdpc3RlciwgcmV0dXJuIHRoZQorLy8vIGNvcnJlc3BvbmRpbmcgbGl2ZS1pbiBwaHlzaWNhbCByZWdpc3Rlci4KK3Vuc2lnbmVkIE1hY2hpbmVSZWdpc3RlckluZm86OmdldExpdmVJblZpcnRSZWcodW5zaWduZWQgUFJlZykgY29uc3QgeworICBmb3IgKGxpdmVpbl9pdGVyYXRvciBJID0gbGl2ZWluX2JlZ2luKCksIEUgPSBsaXZlaW5fZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChJLT5maXJzdCA9PSBQUmVnKQorICAgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBFbWl0TGl2ZUluQ29waWVzIC0gRW1pdCBjb3BpZXMgdG8gaW5pdGlhbGl6ZSBsaXZlaW4gdmlydHVhbCByZWdpc3RlcnMKKy8vLyBpbnRvIHRoZSBnaXZlbiBlbnRyeSBibG9jay4KK3ZvaWQKK01hY2hpbmVSZWdpc3RlckluZm86OkVtaXRMaXZlSW5Db3BpZXMoTWFjaGluZUJhc2ljQmxvY2sgKkVudHJ5TUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkpIHsKKyAgLy8gRW1pdCB0aGUgY29waWVzIGludG8gdGhlIHRvcCBvZiB0aGUgYmxvY2suCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMaXZlSW5zLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKExpdmVJbnNbaV0uc2Vjb25kKSB7CisgICAgICBpZiAodXNlX2VtcHR5KExpdmVJbnNbaV0uc2Vjb25kKSkgeworICAgICAgICAvLyBUaGUgbGl2ZWluIGhhcyBubyB1c2VzLiBEcm9wIGl0LgorICAgICAgICAvLworICAgICAgICAvLyBJdCB3b3VsZCBiZSBwcmVmZXJhYmxlIHRvIGhhdmUgaXNlbCBhdm9pZCBjcmVhdGluZyBsaXZlLWluCisgICAgICAgIC8vIHJlY29yZHMgZm9yIHVudXNlZCBhcmd1bWVudHMgaW4gdGhlIGZpcnN0IHBsYWNlLCBidXQgaXQncworICAgICAgICAvLyBjb21wbGljYXRlZCBieSB0aGUgZGVidWcgaW5mbyBjb2RlIGZvciBhcmd1bWVudHMuCisgICAgICAgIExpdmVJbnMuZXJhc2UoTGl2ZUlucy5iZWdpbigpICsgaSk7CisgICAgICAgIC0taTsgLS1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW1pdCBhIGNvcHkuCisgICAgICAgIEJ1aWxkTUkoKkVudHJ5TUJCLCBFbnRyeU1CQi0+YmVnaW4oKSwgRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICBUSUkuZ2V0KFRhcmdldE9wY29kZTo6Q09QWSksIExpdmVJbnNbaV0uc2Vjb25kKQorICAgICAgICAgIC5hZGRSZWcoTGl2ZUluc1tpXS5maXJzdCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSByZWdpc3RlciB0byB0aGUgZW50cnkgYmxvY2sgbGl2ZS1pbiBzZXQuCisgICAgICAgIEVudHJ5TUJCLT5hZGRMaXZlSW4oTGl2ZUluc1tpXS5maXJzdCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEFkZCB0aGUgcmVnaXN0ZXIgdG8gdGhlIGVudHJ5IGJsb2NrIGxpdmUtaW4gc2V0LgorICAgICAgRW50cnlNQkItPmFkZExpdmVJbihMaXZlSW5zW2ldLmZpcnN0KTsKKyAgICB9Cit9CisKK3ZvaWQgTWFjaGluZVJlZ2lzdGVySW5mbzo6Y2xvc2VQaHlzUmVnc1VzZWQoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIHsKKyAgZm9yIChpbnQgaSA9IFVzZWRQaHlzUmVncy5maW5kX2ZpcnN0KCk7IGkgPj0gMDsKKyAgICAgICBpID0gVXNlZFBoeXNSZWdzLmZpbmRfbmV4dChpKSkKKyAgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlNTID0gVFJJLmdldFN1YlJlZ2lzdGVycyhpKTsKKyAgICAgICAgICAgICAgdW5zaWduZWQgU3ViUmVnID0gKlNTOyArK1NTKQorICAgICAgICAgICBpZiAoU3ViUmVnID4gdW5zaWduZWQoaSkpCisgICAgICAgICAgICAgVXNlZFBoeXNSZWdzLnNldChTdWJSZWcpOworfQorCisjaWZuZGVmIE5ERUJVRwordm9pZCBNYWNoaW5lUmVnaXN0ZXJJbmZvOjpkdW1wVXNlcyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgZm9yICh1c2VfaXRlcmF0b3IgSSA9IHVzZV9iZWdpbihSZWcpLCBFID0gdXNlX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBJLmdldE9wZXJhbmQoKS5nZXRQYXJlbnQoKS0+ZHVtcCgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lU1NBVXBkYXRlci5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lU1NBVXBkYXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkNmRmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL01hY2hpbmVTU0FVcGRhdGVyLmNwcApAQCAtMCwwICsxLDM3MiBAQAorLy89PT0tIE1hY2hpbmVTU0FVcGRhdGVyLmNwcCAtIFVuc3RydWN0dXJlZCBTU0EgVXBkYXRlIFRvb2wgLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTWFjaGluZVNTQVVwZGF0ZXIgY2xhc3MuIEl0J3MgYmFzZWQgb24gU1NBVXBkYXRlcgorLy8gY2xhc3MgaW4gbGliL1RyYW5zZm9ybXMvVXRpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lU1NBVXBkYXRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9TU0FVcGRhdGVySW1wbC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3R5cGVkZWYgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCB1bnNpZ25lZD4gQXZhaWxhYmxlVmFsc1R5Oworc3RhdGljIEF2YWlsYWJsZVZhbHNUeSAmZ2V0QXZhaWxhYmxlVmFscyh2b2lkICpBVikgeworICByZXR1cm4gKnN0YXRpY19jYXN0PEF2YWlsYWJsZVZhbHNUeSo+KEFWKTsKK30KKworTWFjaGluZVNTQVVwZGF0ZXI6Ok1hY2hpbmVTU0FVcGRhdGVyKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICpOZXdQSEkpCisgIDogQVYoMCksIEluc2VydGVkUEhJcyhOZXdQSEkpIHsKKyAgVElJID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgIE1SSSA9ICZNRi5nZXRSZWdJbmZvKCk7Cit9CisKK01hY2hpbmVTU0FVcGRhdGVyOjp+TWFjaGluZVNTQVVwZGF0ZXIoKSB7CisgIGRlbGV0ZSAmZ2V0QXZhaWxhYmxlVmFscyhBVik7Cit9CisKKy8vLyBJbml0aWFsaXplIC0gUmVzZXQgdGhpcyBvYmplY3QgdG8gZ2V0IHJlYWR5IGZvciBhIG5ldyBzZXQgb2YgU1NBCisvLy8gdXBkYXRlcy4gIFByb3RvVmFsdWUgaXMgdGhlIHZhbHVlIHVzZWQgdG8gbmFtZSBQSEkgbm9kZXMuCit2b2lkIE1hY2hpbmVTU0FVcGRhdGVyOjpJbml0aWFsaXplKHVuc2lnbmVkIFYpIHsKKyAgaWYgKEFWID09IDApCisgICAgQVYgPSBuZXcgQXZhaWxhYmxlVmFsc1R5KCk7CisgIGVsc2UKKyAgICBnZXRBdmFpbGFibGVWYWxzKEFWKS5jbGVhcigpOworCisgIFZSID0gVjsKKyAgVlJDID0gTVJJLT5nZXRSZWdDbGFzcyhWUik7Cit9CisKKy8vLyBIYXNWYWx1ZUZvckJsb2NrIC0gUmV0dXJuIHRydWUgaWYgdGhlIE1hY2hpbmVTU0FVcGRhdGVyIGFscmVhZHkgaGFzIGEgdmFsdWUgZm9yCisvLy8gdGhlIHNwZWNpZmllZCBibG9jay4KK2Jvb2wgTWFjaGluZVNTQVVwZGF0ZXI6Okhhc1ZhbHVlRm9yQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIHJldHVybiBnZXRBdmFpbGFibGVWYWxzKEFWKS5jb3VudChCQik7Cit9CisKKy8vLyBBZGRBdmFpbGFibGVWYWx1ZSAtIEluZGljYXRlIHRoYXQgYSByZXdyaXR0ZW4gdmFsdWUgaXMgYXZhaWxhYmxlIGluIHRoZQorLy8vIHNwZWNpZmllZCBibG9jayB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCit2b2lkIE1hY2hpbmVTU0FVcGRhdGVyOjpBZGRBdmFpbGFibGVWYWx1ZShNYWNoaW5lQmFzaWNCbG9jayAqQkIsIHVuc2lnbmVkIFYpIHsKKyAgZ2V0QXZhaWxhYmxlVmFscyhBVilbQkJdID0gVjsKK30KKworLy8vIEdldFZhbHVlQXRFbmRPZkJsb2NrIC0gQ29uc3RydWN0IFNTQSBmb3JtLCBtYXRlcmlhbGl6aW5nIGEgdmFsdWUgdGhhdCBpcworLy8vIGxpdmUgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLgordW5zaWduZWQgTWFjaGluZVNTQVVwZGF0ZXI6OkdldFZhbHVlQXRFbmRPZkJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gR2V0VmFsdWVBdEVuZE9mQmxvY2tJbnRlcm5hbChCQik7Cit9CisKK3N0YXRpYwordW5zaWduZWQgTG9va0ZvcklkZW50aWNhbFBISShNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPE1hY2hpbmVCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+LCA4PiAmUHJlZFZhbHVlcykgeworICBpZiAoQkItPmVtcHR5KCkpCisgICAgcmV0dXJuIDA7CisKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi0+ZnJvbnQoKTsKKyAgaWYgKCFJLT5pc1BISSgpKQorICAgIHJldHVybiAwOworCisgIEF2YWlsYWJsZVZhbHNUeSBBVmFsczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFByZWRWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBBVmFsc1tQcmVkVmFsdWVzW2ldLmZpcnN0XSA9IFByZWRWYWx1ZXNbaV0uc2Vjb25kOworICB3aGlsZSAoSSAhPSBCQi0+ZW5kKCkgJiYgSS0+aXNQSEkoKSkgeworICAgIGJvb2wgU2FtZSA9IHRydWU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IEktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgaSArPSAyKSB7CisgICAgICB1bnNpZ25lZCBTcmNSZWcgPSBJLT5nZXRPcGVyYW5kKGkpLmdldFJlZygpOworICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlNyY0JCID0gSS0+Z2V0T3BlcmFuZChpKzEpLmdldE1CQigpOworICAgICAgaWYgKEFWYWxzW1NyY0JCXSAhPSBTcmNSZWcpIHsKKyAgICAgICAgU2FtZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKFNhbWUpCisgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICArK0k7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBJbnNlcnROZXdEZWYgLSBJbnNlcnQgYW4gZW1wdHkgUEhJIG9yIElNUExJQ0lUX0RFRiBpbnN0cnVjdGlvbiB3aGljaCBkZWZpbmUKKy8vLyBhIHZhbHVlIG9mIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNwZWNpZmllZCBiYXNpYworLy8vIGJsb2NrLiBJdCByZXR1cm5zIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGRlZmluZWQgYnkgdGhlIGluc3RydWN0aW9uLgorc3RhdGljCitNYWNoaW5lSW5zdHIgKkluc2VydE5ld0RlZih1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSkgeworICB1bnNpZ25lZCBOZXdWUiA9IE1SSS0+Y3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgcmV0dXJuIEJ1aWxkTUkoKkJCLCBJLCBEZWJ1Z0xvYygpLCBUSUktPmdldChPcGNvZGUpLCBOZXdWUik7Cit9CisKKy8vLyBHZXRWYWx1ZUluTWlkZGxlT2ZCbG9jayAtIENvbnN0cnVjdCBTU0EgZm9ybSwgbWF0ZXJpYWxpemluZyBhIHZhbHVlIHRoYXQKKy8vLyBpcyBsaXZlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHNwZWNpZmllZCBibG9jay4KKy8vLworLy8vIEdldFZhbHVlSW5NaWRkbGVPZkJsb2NrIGlzIHRoZSBzYW1lIGFzIEdldFZhbHVlQXRFbmRPZkJsb2NrIGV4Y2VwdCBpbiBvbmUKKy8vLyBpbXBvcnRhbnQgY2FzZTogaWYgdGhlcmUgaXMgYSBkZWZpbml0aW9uIG9mIHRoZSByZXdyaXR0ZW4gdmFsdWUgYWZ0ZXIgdGhlCisvLy8gJ3VzZScgaW4gQkIuICBDb25zaWRlciBjb2RlIGxpa2UgdGhpczoKKy8vLworLy8vICAgICAgWDEgPSAuLi4KKy8vLyAgIFNvbWVCQjoKKy8vLyAgICAgIHVzZShYKQorLy8vICAgICAgWDIgPSAuLi4KKy8vLyAgICAgIGJyIENvbmQsIFNvbWVCQiwgT3V0QkIKKy8vLworLy8vIEluIHRoaXMgY2FzZSwgdGhlcmUgYXJlIHR3byB2YWx1ZXMgKFgxIGFuZCBYMikgYWRkZWQgdG8gdGhlIEF2YWlsYWJsZVZhbHMKKy8vLyBzZXQgYnkgdGhlIGNsaWVudCBvZiB0aGUgcmV3cml0ZXIsIGFuZCB0aG9zZSB2YWx1ZXMgYXJlIGJvdGggbGl2ZSBvdXQgb2YKKy8vLyB0aGVpciByZXNwZWN0aXZlIGJsb2Nrcy4gIEhvd2V2ZXIsIHRoZSB1c2Ugb2YgWCBoYXBwZW5zIGluIHRoZSAqbWlkZGxlKiBvZgorLy8vIGEgYmxvY2suICBCZWNhdXNlIG9mIHRoaXMsIHdlIG5lZWQgdG8gaW5zZXJ0IGEgbmV3IFBISSBub2RlIGluIFNvbWVCQiB0bworLy8vIG1lcmdlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMsIGFuZCB0aGlzIHZhbHVlIGlzbid0IGxpdmUgb3V0IG9mIHRoZSBibG9jay4KKy8vLwordW5zaWduZWQgTWFjaGluZVNTQVVwZGF0ZXI6OkdldFZhbHVlSW5NaWRkbGVPZkJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgeworICAvLyBJZiB0aGVyZSBpcyBubyBkZWZpbml0aW9uIG9mIHRoZSByZW5hbWVkIHZhcmlhYmxlIGluIHRoaXMgYmxvY2ssIGp1c3QgdXNlCisgIC8vIEdldFZhbHVlQXRFbmRPZkJsb2NrIHRvIGRvIG91ciB3b3JrLgorICBpZiAoIUhhc1ZhbHVlRm9yQmxvY2soQkIpKQorICAgIHJldHVybiBHZXRWYWx1ZUF0RW5kT2ZCbG9ja0ludGVybmFsKEJCKTsKKworICAvLyBJZiB0aGVyZSBhcmUgbm8gcHJlZGVjZXNzb3JzLCBqdXN0IHJldHVybiB1bmRlZi4KKyAgaWYgKEJCLT5wcmVkX2VtcHR5KCkpIHsKKyAgICAvLyBJbnNlcnQgYW4gaW1wbGljaXRfZGVmIHRvIHJlcHJlc2VudCBhbiB1bmRlZiB2YWx1ZS4KKyAgICBNYWNoaW5lSW5zdHIgKk5ld0RlZiA9IEluc2VydE5ld0RlZihUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgQkItPmdldEZpcnN0VGVybWluYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSQywgTVJJLCBUSUkpOworICAgIHJldHVybiBOZXdEZWYtPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIH0KKworICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdGhlIGhhcmQgY2FzZS4gIEdldCB0aGUgbGl2ZS1pbiB2YWx1ZXMgZm9yIGVhY2gKKyAgLy8gcHJlZGVjZXNzb3IuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxNYWNoaW5lQmFzaWNCbG9jayosIHVuc2lnbmVkPiwgOD4gUHJlZFZhbHVlczsKKyAgdW5zaWduZWQgU2luZ3VsYXJWYWx1ZSA9IDA7CisKKyAgYm9vbCBpc0ZpcnN0UHJlZCA9IHRydWU7CisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnByZWRfaXRlcmF0b3IgUEkgPSBCQi0+cHJlZF9iZWdpbigpLAorICAgICAgICAgRSA9IEJCLT5wcmVkX2VuZCgpOyBQSSAhPSBFOyArK1BJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWRCQiA9ICpQSTsKKyAgICB1bnNpZ25lZCBQcmVkVmFsID0gR2V0VmFsdWVBdEVuZE9mQmxvY2tJbnRlcm5hbChQcmVkQkIpOworICAgIFByZWRWYWx1ZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFByZWRCQiwgUHJlZFZhbCkpOworCisgICAgLy8gQ29tcHV0ZSBTaW5ndWxhclZhbHVlLgorICAgIGlmIChpc0ZpcnN0UHJlZCkgeworICAgICAgU2luZ3VsYXJWYWx1ZSA9IFByZWRWYWw7CisgICAgICBpc0ZpcnN0UHJlZCA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoUHJlZFZhbCAhPSBTaW5ndWxhclZhbHVlKQorICAgICAgU2luZ3VsYXJWYWx1ZSA9IDA7CisgIH0KKworICAvLyBPdGhlcndpc2UsIGlmIGFsbCB0aGUgbWVyZ2VkIHZhbHVlcyBhcmUgdGhlIHNhbWUsIGp1c3QgdXNlIGl0LgorICBpZiAoU2luZ3VsYXJWYWx1ZSAhPSAwKQorICAgIHJldHVybiBTaW5ndWxhclZhbHVlOworCisgIC8vIElmIGFuIGlkZW50aWNhbCBQSEkgaXMgYWxyZWFkeSBpbiBCQiwganVzdCByZXVzZSBpdC4KKyAgdW5zaWduZWQgRHVwUEhJID0gTG9va0ZvcklkZW50aWNhbFBISShCQiwgUHJlZFZhbHVlcyk7CisgIGlmIChEdXBQSEkpCisgICAgcmV0dXJuIER1cFBISTsKKworICAvLyBPdGhlcndpc2UsIHdlIGRvIG5lZWQgYSBQSEk6IGluc2VydCBvbmUgbm93LgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTG9jID0gQkItPmVtcHR5KCkgPyBCQi0+ZW5kKCkgOiBCQi0+ZnJvbnQoKTsKKyAgTWFjaGluZUluc3RyICpJbnNlcnRlZFBISSA9IEluc2VydE5ld0RlZihUYXJnZXRPcGNvZGU6OlBISSwgQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jLCBWUkMsIE1SSSwgVElJKTsKKworICAvLyBGaWxsIGluIGFsbCB0aGUgcHJlZGVjZXNzb3JzIG9mIHRoZSBQSEkuCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCKEluc2VydGVkUEhJKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFByZWRWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBNSUIuYWRkUmVnKFByZWRWYWx1ZXNbaV0uc2Vjb25kKS5hZGRNQkIoUHJlZFZhbHVlc1tpXS5maXJzdCk7CisKKyAgLy8gU2VlIGlmIHRoZSBQSEkgbm9kZSBjYW4gYmUgbWVyZ2VkIHRvIGEgc2luZ2xlIHZhbHVlLiAgVGhpcyBjYW4gaGFwcGVuIGluCisgIC8vIGxvb3AgY2FzZXMgd2hlbiB3ZSBnZXQgYSBQSEkgb2YgaXRzZWxmIGFuZCBvbmUgb3RoZXIgdmFsdWUuCisgIGlmICh1bnNpZ25lZCBDb25zdFZhbCA9IEluc2VydGVkUEhJLT5pc0NvbnN0YW50VmFsdWVQSEkoKSkgeworICAgIEluc2VydGVkUEhJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICByZXR1cm4gQ29uc3RWYWw7CisgIH0KKworICAvLyBJZiB0aGUgY2xpZW50IHdhbnRzIHRvIGtub3cgYWJvdXQgYWxsIG5ldyBpbnN0cnVjdGlvbnMsIHRlbGwgaXQuCisgIGlmIChJbnNlcnRlZFBISXMpIEluc2VydGVkUEhJcy0+cHVzaF9iYWNrKEluc2VydGVkUEhJKTsKKworICBERUJVRyhkYmdzKCkgPDwgIiAgSW5zZXJ0ZWQgUEhJOiAiIDw8ICpJbnNlcnRlZFBISSA8PCAiXG4iKTsKKyAgcmV0dXJuIEluc2VydGVkUEhJLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworfQorCitzdGF0aWMKK01hY2hpbmVCYXNpY0Jsb2NrICpmaW5kQ29ycmVzcG9uZGluZ1ByZWQoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU9wZXJhbmQgKlUpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7IGkgKz0gMikgeworICAgIGlmICgmTUktPmdldE9wZXJhbmQoaSkgPT0gVSkKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZChpKzEpLmdldE1CQigpOworICB9CisKKyAgbGx2bV91bnJlYWNoYWJsZSgiTWFjaGluZU9wZXJhbmQ6OmdldFBhcmVudCgpIGZhaWx1cmU/Iik7CisgIHJldHVybiAwOworfQorCisvLy8gUmV3cml0ZVVzZSAtIFJld3JpdGUgYSB1c2Ugb2YgdGhlIHN5bWJvbGljIHZhbHVlLiAgVGhpcyBoYW5kbGVzIFBISSBub2RlcywKKy8vLyB3aGljaCB1c2UgdGhlaXIgdmFsdWUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGVjZXNzb3IuCit2b2lkIE1hY2hpbmVTU0FVcGRhdGVyOjpSZXdyaXRlVXNlKE1hY2hpbmVPcGVyYW5kICZVKSB7CisgIE1hY2hpbmVJbnN0ciAqVXNlTUkgPSBVLmdldFBhcmVudCgpOworICB1bnNpZ25lZCBOZXdWUiA9IDA7CisgIGlmIChVc2VNSS0+aXNQSEkoKSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTb3VyY2VCQiA9IGZpbmRDb3JyZXNwb25kaW5nUHJlZChVc2VNSSwgJlUpOworICAgIE5ld1ZSID0gR2V0VmFsdWVBdEVuZE9mQmxvY2tJbnRlcm5hbChTb3VyY2VCQik7CisgIH0gZWxzZSB7CisgICAgTmV3VlIgPSBHZXRWYWx1ZUluTWlkZGxlT2ZCbG9jayhVc2VNSS0+Z2V0UGFyZW50KCkpOworICB9CisKKyAgVS5zZXRSZWcoTmV3VlIpOworfQorCit2b2lkIE1hY2hpbmVTU0FVcGRhdGVyOjpSZXBsYWNlUmVnV2l0aCh1bnNpZ25lZCBPbGRSZWcsIHVuc2lnbmVkIE5ld1JlZykgeworICBNUkktPnJlcGxhY2VSZWdXaXRoKE9sZFJlZywgTmV3UmVnKTsKKworICBBdmFpbGFibGVWYWxzVHkgJkF2YWlsYWJsZVZhbHMgPSBnZXRBdmFpbGFibGVWYWxzKEFWKTsKKyAgZm9yIChEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIHVuc2lnbmVkPjo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSBBdmFpbGFibGVWYWxzLmJlZ2luKCksIEUgPSBBdmFpbGFibGVWYWxzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoSS0+c2Vjb25kID09IE9sZFJlZykKKyAgICAgIEktPnNlY29uZCA9IE5ld1JlZzsKK30KKworLy8vIE1hY2hpbmVQSElpdGVyIC0gSXRlcmF0b3IgZm9yIFBISSBvcGVyYW5kcy4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlCisvLy8gUEhJX2l0ZXJhdG9yIGluIHRoZSBTU0FVcGRhdGVySW1wbCB0ZW1wbGF0ZS4KK25hbWVzcGFjZSB7CisgIGNsYXNzIE1hY2hpbmVQSElpdGVyIHsKKyAgcHJpdmF0ZToKKyAgICBNYWNoaW5lSW5zdHIgKlBISTsKKyAgICB1bnNpZ25lZCBpZHg7CisgCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBNYWNoaW5lUEhJaXRlcihNYWNoaW5lSW5zdHIgKlApIC8vIGJlZ2luIGl0ZXJhdG9yCisgICAgICA6IFBISShQKSwgaWR4KDEpIHt9CisgICAgTWFjaGluZVBISWl0ZXIoTWFjaGluZUluc3RyICpQLCBib29sKSAvLyBlbmQgaXRlcmF0b3IKKyAgICAgIDogUEhJKFApLCBpZHgoUEhJLT5nZXROdW1PcGVyYW5kcygpKSB7fQorCisgICAgTWFjaGluZVBISWl0ZXIgJm9wZXJhdG9yKysoKSB7IGlkeCArPSAyOyByZXR1cm4gKnRoaXM7IH0gCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVQSElpdGVyJiB4KSBjb25zdCB7IHJldHVybiBpZHggPT0geC5pZHg7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgTWFjaGluZVBISWl0ZXImIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisgICAgdW5zaWduZWQgZ2V0SW5jb21pbmdWYWx1ZSgpIHsgcmV0dXJuIFBISS0+Z2V0T3BlcmFuZChpZHgpLmdldFJlZygpOyB9CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKmdldEluY29taW5nQmxvY2soKSB7CisgICAgICByZXR1cm4gUEhJLT5nZXRPcGVyYW5kKGlkeCsxKS5nZXRNQkIoKTsKKyAgICB9CisgIH07Cit9CisKKy8vLyBTU0FVcGRhdGVyVHJhaXRzPE1hY2hpbmVTU0FVcGRhdGVyPiAtIFRyYWl0cyBmb3IgdGhlIFNTQVVwZGF0ZXJJbXBsCisvLy8gdGVtcGxhdGUsIHNwZWNpYWxpemVkIGZvciBNYWNoaW5lU1NBVXBkYXRlci4KK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlPD4KK2NsYXNzIFNTQVVwZGF0ZXJUcmFpdHM8TWFjaGluZVNTQVVwZGF0ZXI+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBNYWNoaW5lQmFzaWNCbG9jayBCbGtUOworICB0eXBlZGVmIHVuc2lnbmVkIFZhbFQ7CisgIHR5cGVkZWYgTWFjaGluZUluc3RyIFBoaVQ7CisKKyAgdHlwZWRlZiBNYWNoaW5lQmFzaWNCbG9jazo6c3VjY19pdGVyYXRvciBCbGtTdWNjX2l0ZXJhdG9yOworICBzdGF0aWMgQmxrU3VjY19pdGVyYXRvciBCbGtTdWNjX2JlZ2luKEJsa1QgKkJCKSB7IHJldHVybiBCQi0+c3VjY19iZWdpbigpOyB9CisgIHN0YXRpYyBCbGtTdWNjX2l0ZXJhdG9yIEJsa1N1Y2NfZW5kKEJsa1QgKkJCKSB7IHJldHVybiBCQi0+c3VjY19lbmQoKTsgfQorCisgIHR5cGVkZWYgTWFjaGluZVBISWl0ZXIgUEhJX2l0ZXJhdG9yOworICBzdGF0aWMgaW5saW5lIFBISV9pdGVyYXRvciBQSElfYmVnaW4oUGhpVCAqUEhJKSB7IHJldHVybiBQSElfaXRlcmF0b3IoUEhJKTsgfQorICBzdGF0aWMgaW5saW5lIFBISV9pdGVyYXRvciBQSElfZW5kKFBoaVQgKlBISSkgeworICAgIHJldHVybiBQSElfaXRlcmF0b3IoUEhJLCB0cnVlKTsKKyAgfQorCisgIC8vLyBGaW5kUHJlZGVjZXNzb3JCbG9ja3MgLSBQdXQgdGhlIHByZWRlY2Vzc29ycyBvZiBCQiBpbnRvIHRoZSBQcmVkcworICAvLy8gdmVjdG9yLgorICBzdGF0aWMgdm9pZCBGaW5kUHJlZGVjZXNzb3JCbG9ja3MoTWFjaGluZUJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVCYXNpY0Jsb2NrKj4gKlByZWRzKXsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpwcmVkX2l0ZXJhdG9yIFBJID0gQkItPnByZWRfYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IEJCLT5wcmVkX2VuZCgpOyBQSSAhPSBFOyArK1BJKQorICAgICAgUHJlZHMtPnB1c2hfYmFjaygqUEkpOworICB9CisKKyAgLy8vIEdldFVuZGVmVmFsIC0gQ3JlYXRlIGFuIElNUExJQ0lUX0RFRiBpbnN0cnVjdGlvbiB3aXRoIGEgbmV3IHJlZ2lzdGVyLgorICAvLy8gQWRkIGl0IGludG8gdGhlIHNwZWNpZmllZCBibG9jayBhbmQgcmV0dXJuIHRoZSByZWdpc3Rlci4KKyAgc3RhdGljIHVuc2lnbmVkIEdldFVuZGVmVmFsKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVTU0FVcGRhdGVyICpVcGRhdGVyKSB7CisgICAgLy8gSW5zZXJ0IGFuIGltcGxpY2l0X2RlZiB0byByZXByZXNlbnQgYW4gdW5kZWYgdmFsdWUuCisgICAgTWFjaGluZUluc3RyICpOZXdEZWYgPSBJbnNlcnROZXdEZWYoVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIEJCLT5nZXRGaXJzdFRlcm1pbmF0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVyLT5WUkMsIFVwZGF0ZXItPk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVyLT5USUkpOworICAgIHJldHVybiBOZXdEZWYtPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIH0KKworICAvLy8gQ3JlYXRlRW1wdHlQSEkgLSBDcmVhdGUgYSBQSEkgaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIGEgbmV3IHJlZ2lzdGVyLgorICAvLy8gQWRkIGl0IGludG8gdGhlIHNwZWNpZmllZCBibG9jayBhbmQgcmV0dXJuIHRoZSByZWdpc3Rlci4KKyAgc3RhdGljIHVuc2lnbmVkIENyZWF0ZUVtcHR5UEhJKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwgdW5zaWduZWQgTnVtUHJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lU1NBVXBkYXRlciAqVXBkYXRlcikgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBMb2MgPSBCQi0+ZW1wdHkoKSA/IEJCLT5lbmQoKSA6IEJCLT5mcm9udCgpOworICAgIE1hY2hpbmVJbnN0ciAqUEhJID0gSW5zZXJ0TmV3RGVmKFRhcmdldE9wY29kZTo6UEhJLCBCQiwgTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZXItPlZSQywgVXBkYXRlci0+TVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZXItPlRJSSk7CisgICAgcmV0dXJuIFBISS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgfQorCisgIC8vLyBBZGRQSElPcGVyYW5kIC0gQWRkIHRoZSBzcGVjaWZpZWQgdmFsdWUgYXMgYW4gb3BlcmFuZCBvZiB0aGUgUEhJIGZvcgorICAvLy8gdGhlIHNwZWNpZmllZCBwcmVkZWNlc3NvciBibG9jay4KKyAgc3RhdGljIHZvaWQgQWRkUEhJT3BlcmFuZChNYWNoaW5lSW5zdHIgKlBISSwgdW5zaWduZWQgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkKSB7CisgICAgUEhJLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWcoVmFsLCBmYWxzZSkpOworICAgIFBISS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTUJCKFByZWQpKTsKKyAgfQorCisgIC8vLyBJbnN0cklzUEhJIC0gQ2hlY2sgaWYgYW4gaW5zdHJ1Y3Rpb24gaXMgYSBQSEkuCisgIC8vLworICBzdGF0aWMgTWFjaGluZUluc3RyICpJbnN0cklzUEhJKE1hY2hpbmVJbnN0ciAqSSkgeworICAgIGlmIChJICYmIEktPmlzUEhJKCkpCisgICAgICByZXR1cm4gSTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBWYWx1ZUlzUEhJIC0gQ2hlY2sgaWYgdGhlIGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyCisgIC8vLyBpcyBhIFBISSBpbnN0cnVjdGlvbi4KKyAgc3RhdGljIE1hY2hpbmVJbnN0ciAqVmFsdWVJc1BISSh1bnNpZ25lZCBWYWwsIE1hY2hpbmVTU0FVcGRhdGVyICpVcGRhdGVyKSB7CisgICAgcmV0dXJuIEluc3RySXNQSEkoVXBkYXRlci0+TVJJLT5nZXRWUmVnRGVmKFZhbCkpOworICB9CisKKyAgLy8vIFZhbHVlSXNOZXdQSEkgLSBMaWtlIFZhbHVlSXNQSEkgYnV0IGFsc28gY2hlY2sgaWYgdGhlIFBISSBoYXMgbm8gc291cmNlCisgIC8vLyBvcGVyYW5kcywgaS5lLiwgaXQgd2FzIGp1c3QgYWRkZWQuCisgIHN0YXRpYyBNYWNoaW5lSW5zdHIgKlZhbHVlSXNOZXdQSEkodW5zaWduZWQgVmFsLCBNYWNoaW5lU1NBVXBkYXRlciAqVXBkYXRlcikgeworICAgIE1hY2hpbmVJbnN0ciAqUEhJID0gVmFsdWVJc1BISShWYWwsIFVwZGF0ZXIpOworICAgIGlmIChQSEkgJiYgUEhJLT5nZXROdW1PcGVyYW5kcygpIDw9IDEpCisgICAgICByZXR1cm4gUEhJOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIEdldFBISVZhbHVlIC0gRm9yIHRoZSBzcGVjaWZpZWQgUEhJIGluc3RydWN0aW9uLCByZXR1cm4gdGhlIHJlZ2lzdGVyCisgIC8vLyB0aGF0IGl0IGRlZmluZXMuCisgIHN0YXRpYyB1bnNpZ25lZCBHZXRQSElWYWx1ZShNYWNoaW5lSW5zdHIgKlBISSkgeworICAgIHJldHVybiBQSEktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKy8vLyBHZXRWYWx1ZUF0RW5kT2ZCbG9ja0ludGVybmFsIC0gQ2hlY2sgdG8gc2VlIGlmIEF2YWlsYWJsZVZhbHMgaGFzIGFuIGVudHJ5CisvLy8gZm9yIHRoZSBzcGVjaWZpZWQgQkIgYW5kIGlmIHNvLCByZXR1cm4gaXQuICBJZiBub3QsIGNvbnN0cnVjdCBTU0EgZm9ybSBieQorLy8vIGZpcnN0IGNhbGN1bGF0aW5nIHRoZSByZXF1aXJlZCBwbGFjZW1lbnQgb2YgUEhJcyBhbmQgdGhlbiBpbnNlcnRpbmcgbmV3CisvLy8gUEhJcyB3aGVyZSBuZWVkZWQuCit1bnNpZ25lZCBNYWNoaW5lU1NBVXBkYXRlcjo6R2V0VmFsdWVBdEVuZE9mQmxvY2tJbnRlcm5hbChNYWNoaW5lQmFzaWNCbG9jayAqQkIpeworICBBdmFpbGFibGVWYWxzVHkgJkF2YWlsYWJsZVZhbHMgPSBnZXRBdmFpbGFibGVWYWxzKEFWKTsKKyAgaWYgKHVuc2lnbmVkIFYgPSBBdmFpbGFibGVWYWxzW0JCXSkKKyAgICByZXR1cm4gVjsKKworICBTU0FVcGRhdGVySW1wbDxNYWNoaW5lU1NBVXBkYXRlcj4gSW1wbCh0aGlzLCAmQXZhaWxhYmxlVmFscywgSW5zZXJ0ZWRQSElzKTsKKyAgcmV0dXJuIEltcGwuR2V0VmFsdWUoQkIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZVNpbmsuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFjaGluZVNpbmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTliYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWNoaW5lU2luay5jcHAKQEAgLTAsMCArMSwzMzggQEAKKy8vPT09LS0gTWFjaGluZVNpbmsuY3BwIC0gU2lua2luZyBmb3IgbWFjaGluZSBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIG1vdmVzIGluc3RydWN0aW9ucyBpbnRvIHN1Y2Nlc3NvciBibG9ja3Mgd2hlbiBwb3NzaWJsZSwgc28gdGhhdAorLy8gdGhleSBhcmVuJ3QgZXhlY3V0ZWQgb24gcGF0aHMgd2hlcmUgdGhlaXIgcmVzdWx0cyBhcmVuJ3QgbmVlZGVkLgorLy8KKy8vIFRoaXMgcGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBvciBhIGNvbXBsZXRlIGFsdGVybmF0aXZlCisvLyBmb3IgYW4gTExWTS1JUi1sZXZlbCBzaW5raW5nIHBhc3MuIEl0IGlzIG9ubHkgZGVzaWduZWQgdG8gc2luayBzaW1wbGUKKy8vIGNvbnN0cnVjdHMgdGhhdCBhcmUgbm90IGV4cG9zZWQgYmVmb3JlIGxvd2VyaW5nIGFuZCBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJtYWNoaW5lLXNpbmsiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtU3VuaywgIk51bWJlciBvZiBtYWNoaW5lIGluc3RydWN0aW9ucyBzdW5rIik7CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIE1hY2hpbmVTaW5raW5nIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gICpSZWdJbmZvOyAvLyBNYWNoaW5lIHJlZ2lzdGVyIGluZm9ybWF0aW9uCisgICAgTWFjaGluZURvbWluYXRvclRyZWUgKkRUOyAgIC8vIE1hY2hpbmUgZG9taW5hdG9yIHRyZWUKKyAgICBNYWNoaW5lTG9vcEluZm8gKkxJOworICAgIEFsaWFzQW5hbHlzaXMgKkFBOworICAgIEJpdFZlY3RvciBBbGxvY2F0YWJsZVNldDsgICAvLyBXaGljaCBwaHlzcmVncyBhcmUgYWxsb2NhdGFibGU/CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uCisgICAgTWFjaGluZVNpbmtpbmcoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQ0ZHKCk7CisgICAgICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPEFsaWFzQW5hbHlzaXM+KCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVMb29wSW5mbz4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxNYWNoaW5lTG9vcEluZm8+KCk7CisgICAgfQorICBwcml2YXRlOgorICAgIGJvb2wgUHJvY2Vzc0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworICAgIGJvb2wgU2lua0luc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAqTUksIGJvb2wgJlNhd1N0b3JlKTsKKyAgICBib29sIEFsbFVzZXNEb21pbmF0ZWRCeUJsb2NrKHVuc2lnbmVkIFJlZywgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisgIH07Cit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2NoYXIgTWFjaGluZVNpbmtpbmc6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhNYWNoaW5lU2lua2luZywgIm1hY2hpbmUtc2luayIsCisgICAgICAgICAgICAgICAgIk1hY2hpbmUgY29kZSBzaW5raW5nIiwgZmFsc2UsIGZhbHNlKTsKKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVNYWNoaW5lU2lua2luZ1Bhc3MoKSB7IHJldHVybiBuZXcgTWFjaGluZVNpbmtpbmcoKTsgfQorCisvLy8gQWxsVXNlc0RvbWluYXRlZEJ5QmxvY2sgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgdXNlcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyCisvLy8gb2NjdXIgaW4gYmxvY2tzIGRvbWluYXRlZCBieSB0aGUgc3BlY2lmaWVkIGJsb2NrLgorYm9vbCBNYWNoaW5lU2lua2luZzo6QWxsVXNlc0RvbWluYXRlZEJ5QmxvY2sodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3QgeworICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWcpICYmCisgICAgICAgICAiT25seSBtYWtlcyBzZW5zZSBmb3IgdnJlZ3MiKTsKKyAgLy8gSWdub3JpbmcgZGVidWcgdXNlcyBpcyBuZWNlc3Nhcnkgc28gZGVidWcgaW5mbyBkb2Vzbid0IGFmZmVjdCB0aGUgY29kZS4KKyAgLy8gVGhpcyBtYXkgbGVhdmUgYSByZWZlcmVuY2luZyBkYmdfdmFsdWUgaW4gdGhlIG9yaWdpbmFsIGJsb2NrLCBiZWZvcmUKKyAgLy8gdGhlIGRlZmluaXRpb24gb2YgdGhlIHZyZWcuICBEd2FyZiBnZW5lcmF0b3IgaGFuZGxlcyB0aGlzIGFsdGhvdWdoIHRoZQorICAvLyB1c2VyIG1pZ2h0IG5vdCBnZXQgdGhlIHJpZ2h0IGluZm8gYXQgcnVudGltZS4KKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2Vfbm9kYmdfaXRlcmF0b3IKKyAgICAgICAgIEkgPSBSZWdJbmZvLT51c2Vfbm9kYmdfYmVnaW4oUmVnKSwgRSA9IFJlZ0luZm8tPnVzZV9ub2RiZ19lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIC8vIERldGVybWluZSB0aGUgYmxvY2sgb2YgdGhlIHVzZS4KKyAgICBNYWNoaW5lSW5zdHIgKlVzZUluc3QgPSAmKkk7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKlVzZUJsb2NrID0gVXNlSW5zdC0+Z2V0UGFyZW50KCk7CisKKyAgICBpZiAoVXNlSW5zdC0+aXNQSEkoKSkgeworICAgICAgLy8gUEhJIG5vZGVzIHVzZSB0aGUgb3BlcmFuZCBpbiB0aGUgcHJlZGVjZXNzb3IgYmxvY2ssIG5vdCB0aGUgYmxvY2sgd2l0aAorICAgICAgLy8gdGhlIFBISS4KKyAgICAgIFVzZUJsb2NrID0gVXNlSW5zdC0+Z2V0T3BlcmFuZChJLmdldE9wZXJhbmRObygpKzEpLmdldE1CQigpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgaXQgZG9taW5hdGVzLgorICAgIGlmICghRFQtPmRvbWluYXRlcyhNQkIsIFVzZUJsb2NrKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIE1hY2hpbmVTaW5raW5nOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiKioqKioqKiogTWFjaGluZSBTaW5raW5nICoqKioqKioqXG4iKTsKKworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICBUSUkgPSBUTS5nZXRJbnN0ckluZm8oKTsKKyAgVFJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIFJlZ0luZm8gPSAmTUYuZ2V0UmVnSW5mbygpOworICBEVCA9ICZnZXRBbmFseXNpczxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgTEkgPSAmZ2V0QW5hbHlzaXM8TWFjaGluZUxvb3BJbmZvPigpOworICBBQSA9ICZnZXRBbmFseXNpczxBbGlhc0FuYWx5c2lzPigpOworICBBbGxvY2F0YWJsZVNldCA9IFRSSS0+Z2V0QWxsb2NhdGFibGVTZXQoTUYpOworCisgIGJvb2wgRXZlck1hZGVDaGFuZ2UgPSBmYWxzZTsKKworICB3aGlsZSAoMSkgeworICAgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworCisgICAgLy8gUHJvY2VzcyBhbGwgYmFzaWMgYmxvY2tzLgorICAgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gTUYuYmVnaW4oKSwgRSA9IE1GLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBNYWRlQ2hhbmdlIHw9IFByb2Nlc3NCbG9jaygqSSk7CisKKyAgICAvLyBJZiB0aGlzIGl0ZXJhdGlvbiBvdmVyIHRoZSBjb2RlIGNoYW5nZWQgYW55dGhpbmcsIGtlZXAgaXRlcmF0aW5nLgorICAgIGlmICghTWFkZUNoYW5nZSkgYnJlYWs7CisgICAgRXZlck1hZGVDaGFuZ2UgPSB0cnVlOworICB9CisgIHJldHVybiBFdmVyTWFkZUNoYW5nZTsKK30KKworYm9vbCBNYWNoaW5lU2lua2luZzo6UHJvY2Vzc0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIHsKKyAgLy8gQ2FuJ3Qgc2luayBhbnl0aGluZyBvdXQgb2YgYSBibG9jayB0aGF0IGhhcyBsZXNzIHRoYW4gdHdvIHN1Y2Nlc3NvcnMuCisgIGlmIChNQkIuc3VjY19zaXplKCkgPD0gMSB8fCBNQkIuZW1wdHkoKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIERvbid0IGJvdGhlciBzaW5raW5nIGNvZGUgb3V0IG9mIHVucmVhY2hhYmxlIGJsb2Nrcy4gSW4gYWRkaXRpb24gdG8gYmVpbmcKKyAgLy8gdW5wcm9maXRhYmxlLCBpdCBjYW4gYWxzbyBsZWFkIHRvIGluZmluaXRlIGxvb3BpbmcsIGJlY2F1c2UgaW4gYW4KKyAgLy8gdW5yZWFjaGFibGUgbG9vcCB0aGVyZSBtYXkgYmUgbm93aGVyZSB0byBzdG9wLgorICBpZiAoIURULT5pc1JlYWNoYWJsZUZyb21FbnRyeSgmTUJCKSkgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworCisgIC8vIFdhbGsgdGhlIGJhc2ljIGJsb2NrIGJvdHRvbS11cC4gIFJlbWVtYmVyIGlmIHdlIHNhdyBhIHN0b3JlLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5lbmQoKTsKKyAgLS1JOworICBib29sIFByb2Nlc3NlZEJlZ2luLCBTYXdTdG9yZSA9IGZhbHNlOworICBkbyB7CisgICAgTWFjaGluZUluc3RyICpNSSA9IEk7ICAvLyBUaGUgaW5zdHJ1Y3Rpb24gdG8gc2luay4KKworICAgIC8vIFByZWRlY3JlbWVudCBJIChpZiBpdCdzIG5vdCBiZWdpbikgc28gdGhhdCBpdCBpc24ndCBpbnZhbGlkYXRlZCBieQorICAgIC8vIHNpbmtpbmcuCisgICAgUHJvY2Vzc2VkQmVnaW4gPSBJID09IE1CQi5iZWdpbigpOworICAgIGlmICghUHJvY2Vzc2VkQmVnaW4pCisgICAgICAtLUk7CisKKyAgICBpZiAoTUktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoU2lua0luc3RydWN0aW9uKE1JLCBTYXdTdG9yZSkpCisgICAgICArK051bVN1bmssIE1hZGVDaGFuZ2UgPSB0cnVlOworCisgICAgLy8gSWYgd2UganVzdCBwcm9jZXNzZWQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZSBibG9jaywgd2UncmUgZG9uZS4KKyAgfSB3aGlsZSAoIVByb2Nlc3NlZEJlZ2luKTsKKworICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworLy8vIFNpbmtJbnN0cnVjdGlvbiAtIERldGVybWluZSB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gc2luayB0aGUgc3BlY2lmaWVkIG1hY2hpbmUKKy8vLyBpbnN0cnVjdGlvbiBvdXQgb2YgaXRzIGN1cnJlbnQgYmxvY2sgaW50byBhIHN1Y2Nlc3Nvci4KK2Jvb2wgTWFjaGluZVNpbmtpbmc6OlNpbmtJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JLCBib29sICZTYXdTdG9yZSkgeworICAvLyBDaGVjayBpZiBpdCdzIHNhZmUgdG8gbW92ZSB0aGUgaW5zdHJ1Y3Rpb24uCisgIGlmICghTUktPmlzU2FmZVRvTW92ZShUSUksIEFBLCBTYXdTdG9yZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1cHBvcnQgZm9yIHNpbmtpbmcgaW5zdHJ1Y3Rpb25zIHdpdGhpbiB0aGUKKyAgLy8gYmxvY2sgdGhleSBhcmUgY3VycmVudGx5IGluIHRvIHNob3J0ZW4gdGhlIGxpdmUgcmFuZ2VzLiAgV2Ugb2Z0ZW4gZ2V0CisgIC8vIGluc3RydWN0aW9ucyBzdW5rIGludG8gdGhlIHRvcCBvZiBhIGxhcmdlIGJsb2NrLCBidXQgaXQgd291bGQgYmUgYmV0dGVyIHRvCisgIC8vIGFsc28gc2luayB0aGVtIGRvd24gYmVmb3JlIHRoZWlyIGZpcnN0IHVzZSBpbiB0aGUgYmxvY2suICBUaGlzIHhmb3JtIGhhcyB0bworICAvLyBiZSBjYXJlZnVsIG5vdCB0byAqaW5jcmVhc2UqIHJlZ2lzdGVyIHByZXNzdXJlIHRob3VnaCwgZS5nLiBzaW5raW5nCisgIC8vICJ4ID0geSArIHoiIGRvd24gaWYgaXQga2lsbHMgeSBhbmQgeiB3b3VsZCBpbmNyZWFzZSB0aGUgbGl2ZSByYW5nZXMgb2YgeQorICAvLyBhbmQgeiBhbmQgb25seSBzaHJpbmsgdGhlIGxpdmUgcmFuZ2Ugb2YgeC4KKworICAvLyBMb29wIG92ZXIgYWxsIHRoZSBvcGVyYW5kcyBvZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgaXMKKyAgLy8gYW55dGhpbmcgd2UgY2FuJ3QgaGFuZGxlLCBiYWlsIG91dC4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKlBhcmVudEJsb2NrID0gTUktPmdldFBhcmVudCgpOworCisgIC8vIFN1Y2NUb1NpbmtUbyAtIFRoaXMgaXMgdGhlIHN1Y2Nlc3NvciB0byBzaW5rIHRoaXMgaW5zdHJ1Y3Rpb24gdG8sIG9uY2Ugd2UKKyAgLy8gZGVjaWRlLgorICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY1RvU2lua1RvID0gMDsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpKSBjb250aW51ZTsgIC8vIElnbm9yZSBub24tcmVnaXN0ZXIgb3BlcmFuZHMuCisKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBpZiAoUmVnID09IDApIGNvbnRpbnVlOworCisgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpIHsKKyAgICAgIGlmIChNTy5pc1VzZSgpKSB7CisgICAgICAgIC8vIElmIHRoZSBwaHlzcmVnIGhhcyBubyBkZWZzIGFueXdoZXJlLCBpdCdzIGp1c3QgYW4gYW1iaWVudCByZWdpc3RlcgorICAgICAgICAvLyBhbmQgd2UgY2FuIGZyZWVseSBtb3ZlIGl0cyB1c2VzLiBBbHRlcm5hdGl2ZWx5LCBpZiBpdCdzIGFsbG9jYXRhYmxlLAorICAgICAgICAvLyBpdCBjb3VsZCBnZXQgYWxsb2NhdGVkIHRvIHNvbWV0aGluZyB3aXRoIGEgZGVmIGR1cmluZyBhbGxvY2F0aW9uLgorICAgICAgICBpZiAoIVJlZ0luZm8tPmRlZl9lbXB0eShSZWcpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoQWxsb2NhdGFibGVTZXQudGVzdChSZWcpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBDaGVjayBmb3IgYSBkZWYgYW1vbmcgdGhlIHJlZ2lzdGVyJ3MgYWxpYXNlcyB0b28uCisgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqQWxpYXM7ICsrQWxpYXMpIHsKKyAgICAgICAgICB1bnNpZ25lZCBBbGlhc1JlZyA9ICpBbGlhczsKKyAgICAgICAgICBpZiAoIVJlZ0luZm8tPmRlZl9lbXB0eShBbGlhc1JlZykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICBpZiAoQWxsb2NhdGFibGVTZXQudGVzdChBbGlhc1JlZykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoIU1PLmlzRGVhZCgpKSB7CisgICAgICAgIC8vIEEgZGVmIHRoYXQgaXNuJ3QgZGVhZC4gV2UgY2FuJ3QgbW92ZSBpdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBWaXJ0dWFsIHJlZ2lzdGVyIHVzZXMgYXJlIGFsd2F5cyBzYWZlIHRvIHNpbmsuCisgICAgICBpZiAoTU8uaXNVc2UoKSkgY29udGludWU7CisKKyAgICAgIC8vIElmIGl0J3Mgbm90IHNhZmUgdG8gbW92ZSBkZWZzIG9mIHRoZSByZWdpc3RlciBjbGFzcywgdGhlbiBhYm9ydC4KKyAgICAgIGlmICghVElJLT5pc1NhZmVUb01vdmVSZWdDbGFzc0RlZnMoUmVnSW5mby0+Z2V0UmVnQ2xhc3MoUmVnKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gRklYTUU6IFRoaXMgcGlja3MgYSBzdWNjZXNzb3IgdG8gc2luayBpbnRvIGJhc2VkIG9uIGhhdmluZyBvbmUKKyAgICAgIC8vIHN1Y2Nlc3NvciB0aGF0IGRvbWluYXRlcyBhbGwgdGhlIHVzZXMuICBIb3dldmVyLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUKKyAgICAgIC8vIHNpbmtpbmcgY2FuIGhhcHBlbiBidXQgd2hlcmUgdGhlIHNpbmsgcG9pbnQgaXNuJ3QgYSBzdWNjZXNzb3IuICBGb3IKKyAgICAgIC8vIGV4YW1wbGU6CisgICAgICAvLworICAgICAgLy8gICB4ID0gY29tcHV0YXRpb24KKyAgICAgIC8vICAgaWYgKCkge30gZWxzZSB7fQorICAgICAgLy8gICB1c2UgeAorICAgICAgLy8KKyAgICAgIC8vIHRoZSBpbnN0cnVjdGlvbiBjb3VsZCBiZSBzdW5rIG92ZXIgdGhlIHdob2xlIGRpYW1vbmQgZm9yIHRoZQorICAgICAgLy8gaWYvdGhlbi9lbHNlIChvciBsb29wLCBldGMpLCBhbGxvd2luZyBpdCB0byBiZSBzdW5rIGludG8gb3RoZXIgYmxvY2tzCisgICAgICAvLyBhZnRlciB0aGF0LgorCisgICAgICAvLyBWaXJ0dWFsIHJlZ2lzdGVyIGRlZnMgY2FuIG9ubHkgYmUgc3VuayBpZiBhbGwgdGhlaXIgdXNlcyBhcmUgaW4gYmxvY2tzCisgICAgICAvLyBkb21pbmF0ZWQgYnkgb25lIG9mIHRoZSBzdWNjZXNzb3JzLgorICAgICAgaWYgKFN1Y2NUb1NpbmtUbykgeworICAgICAgICAvLyBJZiBhIHByZXZpb3VzIG9wZXJhbmQgcGlja2VkIGEgYmxvY2sgdG8gc2luayB0bywgdGhlbiB0aGlzIG9wZXJhbmQKKyAgICAgICAgLy8gbXVzdCBiZSBzaW5rYWJsZSB0byB0aGUgc2FtZSBibG9jay4KKyAgICAgICAgaWYgKCFBbGxVc2VzRG9taW5hdGVkQnlCbG9jayhSZWcsIFN1Y2NUb1NpbmtUbykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBPdGhlcndpc2UsIHdlIHNob3VsZCBsb29rIGF0IGFsbCB0aGUgc3VjY2Vzc29ycyBhbmQgZGVjaWRlIHdoaWNoIG9uZQorICAgICAgLy8gd2Ugc2hvdWxkIHNpbmsgdG8uCisgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpzdWNjX2l0ZXJhdG9yIFNJID0gUGFyZW50QmxvY2stPnN1Y2NfYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IFBhcmVudEJsb2NrLT5zdWNjX2VuZCgpOyBTSSAhPSBFOyArK1NJKSB7CisgICAgICAgIGlmIChBbGxVc2VzRG9taW5hdGVkQnlCbG9jayhSZWcsICpTSSkpIHsKKyAgICAgICAgICBTdWNjVG9TaW5rVG8gPSAqU0k7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCBhIGJsb2NrIHRvIHNpbmsgdG8sIGlnbm9yZSB0aGlzIGluc3RydWN0aW9uLgorICAgICAgaWYgKFN1Y2NUb1NpbmtUbyA9PSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlcmUgYXJlIG5vIG91dHB1dHMsIGl0IG11c3QgaGF2ZSBzaWRlLWVmZmVjdHMuCisgIGlmIChTdWNjVG9TaW5rVG8gPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHNpbmsgYW4gaW5zdHJ1Y3Rpb24gaW50byBpdHMgb3duIGJsb2NrLiAgVGhpcyBjYW4KKyAgLy8gaGFwcGVuIHdpdGggbG9vcHMuCisgIGlmIChNSS0+Z2V0UGFyZW50KCkgPT0gU3VjY1RvU2lua1RvKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gbW92ZSBkZWZpbmVzIGEgZGVhZCBwaHlzaWNhbCByZWdpc3RlciB3aGljaCBpcyBsaXZlCisgIC8vIHdoZW4gbGVhdmluZyB0aGUgYmFzaWMgYmxvY2ssIGRvbid0IG1vdmUgaXQgYmVjYXVzZSBpdCBjb3VsZCB0dXJuIGludG8gYQorICAvLyAiem9tYmllIiBkZWZpbmUgb2YgdGhhdCBwcmVnLiBFLmcuLCBFRkxBR1MuICg8cmRhcjovL3Byb2JsZW0vODAzMDYzNj4pCisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChJKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkpIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChSZWcgPT0gMCB8fCAhVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkgY29udGludWU7CisgICAgaWYgKFN1Y2NUb1NpbmtUby0+aXNMaXZlSW4oUmVnKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiU2luayBpbnN0ciAiIDw8ICpNSSA8PCAiXHRpbnRvIGJsb2NrICIgPDwgKlN1Y2NUb1NpbmtUbyk7CisKKyAgLy8gSWYgdGhlIGJsb2NrIGhhcyBtdWx0aXBsZSBwcmVkZWNlc3NvcnMsIHRoaXMgd291bGQgaW50cm9kdWNlIGNvbXB1dGF0aW9uIG9uCisgIC8vIGEgcGF0aCB0aGF0IGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gIFdlIGNvdWxkIHNwbGl0IHRoZSBjcml0aWNhbCBlZGdlLAorICAvLyBidXQgZm9yIG5vdyB3ZSBqdXN0IHB1bnQuCisgIC8vIEZJWE1FOiBTcGxpdCBjcml0aWNhbCBlZGdlcyBpZiBub3QgYmFja2VkZ2VzLgorICBpZiAoU3VjY1RvU2lua1RvLT5wcmVkX3NpemUoKSA+IDEpIHsKKyAgICAvLyBXZSBjYW5ub3Qgc2luayBhIGxvYWQgYWNyb3NzIGEgY3JpdGljYWwgZWRnZSAtIHRoZXJlIG1heSBiZSBzdG9yZXMgaW4KKyAgICAvLyBvdGhlciBjb2RlIHBhdGhzLgorICAgIGJvb2wgc3RvcmUgPSB0cnVlOworICAgIGlmICghTUktPmlzU2FmZVRvTW92ZShUSUksIEFBLCBzdG9yZSkpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICoqKiBQVU5USU5HOiBXb250IHNpbmsgbG9hZCBhbG9uZyBjcml0aWNhbCBlZGdlLlxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBzaW5rIGFjcm9zcyBhIGNyaXRpY2FsIGVkZ2UgaWYgd2UgZG9uJ3QgZG9taW5hdGUgdGhlCisgICAgLy8gc3VjY2Vzc29yLiBXZSBjb3VsZCBiZSBpbnRyb2R1Y2luZyBjYWxjdWxhdGlvbnMgdG8gbmV3IGNvZGUgcGF0aHMuCisgICAgaWYgKCFEVC0+ZG9taW5hdGVzKFBhcmVudEJsb2NrLCBTdWNjVG9TaW5rVG8pKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIiAqKiogUFVOVElORzogQ3JpdGljYWwgZWRnZSBmb3VuZFxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRG9uJ3Qgc2luayBpbnN0cnVjdGlvbnMgaW50byBhIGxvb3AuCisgICAgaWYgKExJLT5pc0xvb3BIZWFkZXIoU3VjY1RvU2lua1RvKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICIgKioqIFBVTlRJTkc6IExvb3AgaGVhZGVyIGZvdW5kXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2Ugd2UgYXJlIE9LIHdpdGggc2lua2luZyBhbG9uZyBhIGNyaXRpY2FsIGVkZ2UuCisgICAgREVCVUcoZGJncygpIDw8ICJTaW5raW5nIGFsb25nIGNyaXRpY2FsIGVkZ2UuXG4iKTsKKyAgfQorCisgIC8vIERldGVybWluZSB3aGVyZSB0byBpbnNlcnQgaW50by4gU2tpcCBwaGkgbm9kZXMuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQb3MgPSBTdWNjVG9TaW5rVG8tPmJlZ2luKCk7CisgIHdoaWxlIChJbnNlcnRQb3MgIT0gU3VjY1RvU2lua1RvLT5lbmQoKSAmJiBJbnNlcnRQb3MtPmlzUEhJKCkpCisgICAgKytJbnNlcnRQb3M7CisKKyAgLy8gTW92ZSB0aGUgaW5zdHJ1Y3Rpb24uCisgIFN1Y2NUb1NpbmtUby0+c3BsaWNlKEluc2VydFBvcywgUGFyZW50QmxvY2ssIE1JLAorICAgICAgICAgICAgICAgICAgICAgICArK01hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihNSSkpOworCisgIC8vIENvbnNlcnZhdGl2ZWx5LCBjbGVhciBhbnkga2lsbCBmbGFncywgc2luY2UgaXQncyBwb3NzaWJsZSB0aGF0IHRoZXkgYXJlIG5vCisgIC8vIGxvbmdlciBjb3JyZWN0LgorICBNSS0+Y2xlYXJLaWxsSW5mbygpOworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWIzZTNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vTWFrZWZpbGUKQEAgLTAsMCArMSwyMiBAQAorIyM9PT0tIGxpYi9Db2RlR2VuL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNQ29kZUdlbgorUEFSQUxMRUxfRElSUyA9IFNlbGVjdGlvbkRBRyBBc21QcmludGVyCitCVUlMRF9BUkNISVZFID0gMQorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCisjIFhjb2RlIHByaW9yIHRvIDIuNCBnZW5lcmF0ZXMgYW4gZXJyb3IgaW4gLXBlZGFudGljIG1vZGUgd2l0aCB1c2Ugb2YgSFVHRV9WQUwKKyMgaW4gdGhpcyBkaXJlY3RvcnkuICBEaXNhYmxlIC1wZWRhbnRpYyBmb3IgdGhpcyBicm9rZW4gY29tcGlsZXIuCitpZm5lcSAoJChIVUdFX1ZBTF9TQU5JVFkpLHllcykKK0NvbXBpbGVDb21tb25PcHRzIDo9ICQoZmlsdGVyLW91dCAtcGVkYW50aWMsICQoQ29tcGlsZUNvbW1vbk9wdHMpKQorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vT2JqZWN0Q29kZUVtaXR0ZXIuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vT2JqZWN0Q29kZUVtaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDUyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9PYmplY3RDb2RlRW1pdHRlci5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL09iamVjdENvZGVFbWl0dGVyLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQmluYXJ5T2JqZWN0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL09iamVjdENvZGVFbWl0dGVyLmgiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0Q29kZUVtaXR0ZXIgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSBsbHZtIHsKKworT2JqZWN0Q29kZUVtaXR0ZXI6Ok9iamVjdENvZGVFbWl0dGVyKCkgOiBCTygwKSB7fQorT2JqZWN0Q29kZUVtaXR0ZXI6Ok9iamVjdENvZGVFbWl0dGVyKEJpbmFyeU9iamVjdCAqYm8pIDogQk8oYm8pIHt9CitPYmplY3RDb2RlRW1pdHRlcjo6fk9iamVjdENvZGVFbWl0dGVyKCkge30KKworLy8vIHNldEJpbmFyeU9iamVjdCAtIHNldCB0aGUgQmluYXJ5T2JqZWN0IHdlIGFyZSB3cml0dGluZyB0bwordm9pZCBPYmplY3RDb2RlRW1pdHRlcjo6c2V0QmluYXJ5T2JqZWN0KEJpbmFyeU9iamVjdCAqYm8pIHsgQk8gPSBibzsgfQorCisvLy8gZW1pdEJ5dGUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIGJ5dGUgbmVlZHMgdG8gYmUKKy8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSwgd2l0aG91dCBidWZmZXIgb3ZlcmZsb3cgdGVzdGluZy4KK3ZvaWQgT2JqZWN0Q29kZUVtaXR0ZXI6OmVtaXRCeXRlKHVpbnQ4X3QgQikgeworICBCTy0+ZW1pdEJ5dGUoQik7Cit9CisKKy8vLyBlbWl0V29yZExFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSAzMi1iaXQgd29yZCBuZWVkcyB0byBiZQorLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0Lgordm9pZCBPYmplY3RDb2RlRW1pdHRlcjo6ZW1pdFdvcmRMRSh1aW50MzJfdCBXKSB7CisgIEJPLT5lbWl0V29yZExFKFcpOworfQorCisvLy8gZW1pdFdvcmRCRSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgMzItYml0IHdvcmQgbmVlZHMgdG8gYmUKKy8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSBpbiBiaWctZW5kaWFuIGZvcm1hdC4KK3ZvaWQgT2JqZWN0Q29kZUVtaXR0ZXI6OmVtaXRXb3JkQkUodWludDMyX3QgVykgeworICBCTy0+ZW1pdFdvcmRCRShXKTsKK30KKworLy8vIGVtaXREV29yZExFIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSA2NC1iaXQgd29yZCBuZWVkcyB0byBiZQorLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0Lgordm9pZCBPYmplY3RDb2RlRW1pdHRlcjo6ZW1pdERXb3JkTEUodWludDY0X3QgVykgeworICBCTy0+ZW1pdERXb3JkTEUoVyk7Cit9CisKKy8vLyBlbWl0RFdvcmRCRSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgNjQtYml0IHdvcmQgbmVlZHMgdG8gYmUKKy8vLyB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSBpbiBiaWctZW5kaWFuIGZvcm1hdC4KK3ZvaWQgT2JqZWN0Q29kZUVtaXR0ZXI6OmVtaXREV29yZEJFKHVpbnQ2NF90IFcpIHsKKyAgQk8tPmVtaXREV29yZEJFKFcpOworfQorCisvLy8gZW1pdEFsaWdubWVudCAtIEFsaWduICdCTycgdG8gdGhlIG5lY2Vzc2FyeSBhbGlnbm1lbnQgYm91bmRhcnkuCit2b2lkIE9iamVjdENvZGVFbWl0dGVyOjplbWl0QWxpZ25tZW50KHVuc2lnbmVkIEFsaWdubWVudCAvKiAwICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZpbGwgLyogMCAqLykgeworICBCTy0+ZW1pdEFsaWdubWVudChBbGlnbm1lbnQsIGZpbGwpOworfQorCisvLy8gZW1pdFVMRUIxMjhCeXRlcyAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgVUxFQjEyOCBuZWVkcyB0byBiZQorLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtLgordm9pZCBPYmplY3RDb2RlRW1pdHRlcjo6ZW1pdFVMRUIxMjhCeXRlcyh1aW50NjRfdCBWYWx1ZSkgeworICBCTy0+ZW1pdFVMRUIxMjhCeXRlcyhWYWx1ZSk7Cit9CisKKy8vLyBlbWl0U0xFQjEyOEJ5dGVzIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSBTTEVCMTI4IG5lZWRzIHRvIGJlCisvLy8gd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0uCit2b2lkIE9iamVjdENvZGVFbWl0dGVyOjplbWl0U0xFQjEyOEJ5dGVzKHVpbnQ2NF90IFZhbHVlKSB7CisgIEJPLT5lbWl0U0xFQjEyOEJ5dGVzKFZhbHVlKTsKK30KKworLy8vIGVtaXRTdHJpbmcgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIFN0cmluZyBuZWVkcyB0byBiZQorLy8vIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtLgordm9pZCBPYmplY3RDb2RlRW1pdHRlcjo6ZW1pdFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmU3RyaW5nKSB7CisgIEJPLT5lbWl0U3RyaW5nKFN0cmluZyk7Cit9CisKKy8vLyBnZXRDdXJyZW50UENWYWx1ZSAtIFRoaXMgcmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IHRoZSBuZXh0IGVtaXR0ZWQgYnl0ZQorLy8vIHdpbGwgYmUgb3V0cHV0IHRvLgordWludHB0cl90IE9iamVjdENvZGVFbWl0dGVyOjpnZXRDdXJyZW50UENWYWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEJPLT5nZXRDdXJyZW50UENPZmZzZXQoKTsKK30KKworLy8vIGdldEN1cnJlbnRQQ09mZnNldCAtIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBlbWl0dGVkCisvLy8gYnVmZmVyIHRoYXQgd2UgYXJlIGN1cnJlbnRseSB3cml0aW5nIHRvLgordWludHB0cl90IE9iamVjdENvZGVFbWl0dGVyOjpnZXRDdXJyZW50UENPZmZzZXQoKSBjb25zdCB7CisgIHJldHVybiBCTy0+Z2V0Q3VycmVudFBDT2Zmc2V0KCk7Cit9CisKKy8vLyBhZGRSZWxvY2F0aW9uIC0gV2hlbmV2ZXIgYSByZWxvY2F0YWJsZSBhZGRyZXNzIGlzIG5lZWRlZCwgaXQgc2hvdWxkIGJlCisvLy8gbm90ZWQgd2l0aCB0aGlzIGludGVyZmFjZS4KK3ZvaWQgT2JqZWN0Q29kZUVtaXR0ZXI6OmFkZFJlbG9jYXRpb24oY29uc3QgTWFjaGluZVJlbG9jYXRpb24mIHJlbG9jYXRpb24pIHsKKyAgQk8tPmFkZFJlbG9jYXRpb24ocmVsb2NhdGlvbik7Cit9CisKKy8vLyBTdGFydE1hY2hpbmVCYXNpY0Jsb2NrIC0gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSB0YXJnZXQgd2hlbiBhIG5ldworLy8vIGJhc2ljIGJsb2NrIGlzIGFib3V0IHRvIGJlIGVtaXR0ZWQuICBUaGlzIHdheSB0aGUgTUNFIGtub3dzIHdoZXJlIHRoZQorLy8vIHN0YXJ0IG9mIHRoZSBibG9jayBpcywgYW5kIGNhbiBpbXBsZW1lbnQgZ2V0TWFjaGluZUJhc2ljQmxvY2tBZGRyZXNzLgordm9pZCBPYmplY3RDb2RlRW1pdHRlcjo6U3RhcnRNYWNoaW5lQmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIGlmIChNQkJMb2NhdGlvbnMuc2l6ZSgpIDw9ICh1bnNpZ25lZClNQkItPmdldE51bWJlcigpKQorICAgIE1CQkxvY2F0aW9ucy5yZXNpemUoKE1CQi0+Z2V0TnVtYmVyKCkrMSkqMik7CisgIE1CQkxvY2F0aW9uc1tNQkItPmdldE51bWJlcigpXSA9IGdldEN1cnJlbnRQQ09mZnNldCgpOworfQorCisvLy8gZ2V0TWFjaGluZUJhc2ljQmxvY2tBZGRyZXNzIC0gUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQKKy8vLyBNYWNoaW5lQmFzaWNCbG9jaywgb25seSB1c2FibGUgYWZ0ZXIgdGhlIGxhYmVsIGZvciB0aGUgTUJCIGhhcyBiZWVuCisvLy8gZW1pdHRlZC4KK3VpbnRwdHJfdAorT2JqZWN0Q29kZUVtaXR0ZXI6OmdldE1hY2hpbmVCYXNpY0Jsb2NrQWRkcmVzcyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdCB7CisgIGFzc2VydChNQkJMb2NhdGlvbnMuc2l6ZSgpID4gKHVuc2lnbmVkKU1CQi0+Z2V0TnVtYmVyKCkgJiYKKyAgICAgICAgIE1CQkxvY2F0aW9uc1tNQkItPmdldE51bWJlcigpXSAmJiAiTUJCIG5vdCBlbWl0dGVkISIpOworICByZXR1cm4gTUJCTG9jYXRpb25zW01CQi0+Z2V0TnVtYmVyKCldOworfQorCisvLy8gZ2V0SnVtcFRhYmxlRW50cnlBZGRyZXNzIC0gUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBqdW1wIHRhYmxlIHdpdGggaW5kZXgKKy8vLyAnSW5kZXgnIGluIHRoZSBmdW5jdGlvbiB0aGF0IGxhc3QgY2FsbGVkIGluaXRKdW1wVGFibGVJbmZvLgordWludHB0cl90IE9iamVjdENvZGVFbWl0dGVyOjpnZXRKdW1wVGFibGVFbnRyeUFkZHJlc3ModW5zaWduZWQgSW5kZXgpIGNvbnN0IHsKKyAgYXNzZXJ0KEpUTG9jYXRpb25zLnNpemUoKSA+IEluZGV4ICYmICJKVCBub3QgZW1pdHRlZCEiKTsKKyAgcmV0dXJuIEpUTG9jYXRpb25zW0luZGV4XTsKK30KKworLy8vIGdldENvbnN0YW50UG9vbEVudHJ5QWRkcmVzcyAtIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgJ0luZGV4JyBlbnRyeSBpbgorLy8vIHRoZSBjb25zdGFudCBwb29sIHRoYXQgd2FzIGxhc3QgZW1pdHRlZCB3aXRoIHRoZSBlbWl0Q29uc3RhbnRQb29sIG1ldGhvZC4KK3VpbnRwdHJfdCBPYmplY3RDb2RlRW1pdHRlcjo6Z2V0Q29uc3RhbnRQb29sRW50cnlBZGRyZXNzKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgIGFzc2VydChDUExvY2F0aW9ucy5zaXplKCkgPiBJbmRleCAmJiAiQ1Agbm90IGVtaXR0ZWQhIik7CisgIHJldHVybiBDUExvY2F0aW9uc1tJbmRleF07Cit9CisKKy8vLyBnZXRDb25zdGFudFBvb2xFbnRyeVNlY3Rpb24gLSBSZXR1cm4gdGhlIHNlY3Rpb24gb2YgdGhlICdJbmRleCcgZW50cnkgaW4KKy8vLyB0aGUgY29uc3RhbnQgcG9vbCB0aGF0IHdhcyBsYXN0IGVtaXR0ZWQgd2l0aCB0aGUgZW1pdENvbnN0YW50UG9vbCBtZXRob2QuCit1aW50cHRyX3QgT2JqZWN0Q29kZUVtaXR0ZXI6OmdldENvbnN0YW50UG9vbEVudHJ5U2VjdGlvbih1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICBhc3NlcnQoQ1BTZWN0aW9ucy5zaXplKCkgPiBJbmRleCAmJiAiQ1Agbm90IGVtaXR0ZWQhIik7CisgIHJldHVybiBDUFNlY3Rpb25zW0luZGV4XTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vT3B0aW1pemVQSElzLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL09wdGltaXplUEhJcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiNGVlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL09wdGltaXplUEhJcy5jcHAKQEAgLTAsMCArMSwxODggQEAKKy8vPT09LS0gT3B0aW1pemVQSElzLmNwcCAtIE9wdGltaXplIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gUEhJcyAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIG9wdGltaXplcyBtYWNoaW5lIGluc3RydWN0aW9uIFBISXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKKy8vIG9wcG9ydHVuaXRpZXMgY3JlYXRlZCBkdXJpbmcgREFHIGxlZ2FsaXphdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInBoaS1vcHQiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bVBISUN5Y2xlcywgIk51bWJlciBvZiBQSEkgY3ljbGVzIHJlcGxhY2VkIik7CitTVEFUSVNUSUMoTnVtRGVhZFBISUN5Y2xlcywgIk51bWJlciBvZiBkZWFkIFBISSBjeWNsZXMiKTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgT3B0aW1pemVQSElzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24KKyAgICBPcHRpbWl6ZVBISXMoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQ0ZHKCk7CisgICAgICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDE2PiBJbnN0clNldDsKKyAgICB0eXBlZGVmIFNtYWxsUHRyU2V0SXRlcmF0b3I8TWFjaGluZUluc3RyKj4gSW5zdHJTZXRJdGVyYXRvcjsKKworICAgIGJvb2wgSXNTaW5nbGVWYWx1ZVBISUN5Y2xlKE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkICZTaW5nbGVWYWxSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTZXQgJlBISXNJbkN5Y2xlKTsKKyAgICBib29sIElzRGVhZFBISUN5Y2xlKE1hY2hpbmVJbnN0ciAqTUksIEluc3RyU2V0ICZQSElzSW5DeWNsZSk7CisgICAgYm9vbCBPcHRpbWl6ZUJCKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworICB9OworfQorCitjaGFyIE9wdGltaXplUEhJczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKE9wdGltaXplUEhJcywgIm9wdC1waGlzIiwKKyAgICAgICAgICAgICAgICAiT3B0aW1pemUgbWFjaGluZSBpbnN0cnVjdGlvbiBQSElzIiwgZmFsc2UsIGZhbHNlKTsKKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVPcHRpbWl6ZVBISXNQYXNzKCkgeyByZXR1cm4gbmV3IE9wdGltaXplUEhJcygpOyB9CisKK2Jvb2wgT3B0aW1pemVQSElzOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKSB7CisgIE1SSSA9ICZGbi5nZXRSZWdJbmZvKCk7CisgIFRJSSA9IEZuLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworCisgIC8vIEZpbmQgZGVhZCBQSEkgY3ljbGVzIGFuZCBQSEkgY3ljbGVzIHRoYXQgY2FuIGJlIHJlcGxhY2VkIGJ5IGEgc2luZ2xlCisgIC8vIHZhbHVlLiAgSW5zdENvbWJpbmUgZG9lcyB0aGVzZSBvcHRpbWl6YXRpb25zLCBidXQgREFHIGxlZ2FsaXphdGlvbiBtYXkKKyAgLy8gaW50cm9kdWNlIG5ldyBvcHBvcnR1bml0aWVzLCBlLmcuLCB3aGVuIGk2NCB2YWx1ZXMgYXJlIHNwbGl0IHVwIGZvcgorICAvLyAzMi1iaXQgdGFyZ2V0cy4KKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gRm4uYmVnaW4oKSwgRSA9IEZuLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBDaGFuZ2VkIHw9IE9wdGltaXplQkIoKkkpOworCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gSXNTaW5nbGVWYWx1ZVBISUN5Y2xlIC0gQ2hlY2sgaWYgTUkgaXMgYSBQSEkgd2hlcmUgYWxsIHRoZSBzb3VyY2Ugb3BlcmFuZHMKKy8vLyBhcmUgY29waWVzIG9mIFNpbmdsZVZhbFJlZywgcG9zc2libHkgdmlhIGNvcGllcyB0aHJvdWdoIG90aGVyIFBISXMuICBJZgorLy8vIFNpbmdsZVZhbFJlZyBpcyB6ZXJvIG9uIGVudHJ5LCBpdCBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIHdpdGggdGhlIHNpbmdsZQorLy8vIG5vbi1jb3B5IHZhbHVlLiAgUEhJc0luQ3ljbGUgaXMgYSBzZXQgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBQSElzIHRoYXQKKy8vLyBoYXZlIGJlZW4gc2Nhbm5lZC4KK2Jvb2wgT3B0aW1pemVQSElzOjpJc1NpbmdsZVZhbHVlUEhJQ3ljbGUoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlNpbmdsZVZhbFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTZXQgJlBISXNJbkN5Y2xlKSB7CisgIGFzc2VydChNSS0+aXNQSEkoKSAmJiAiSXNTaW5nbGVWYWx1ZVBISUN5Y2xlIGV4cGVjdHMgYSBQSEkgaW5zdHJ1Y3Rpb24iKTsKKyAgdW5zaWduZWQgRHN0UmVnID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisKKyAgLy8gU2VlIGlmIHdlIGFscmVhZHkgc2F3IHRoaXMgcmVnaXN0ZXIuCisgIGlmICghUEhJc0luQ3ljbGUuaW5zZXJ0KE1JKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBEb24ndCBzY2FuIGNyYXppbHkgY29tcGxleCB0aGluZ3MuCisgIGlmIChQSElzSW5DeWNsZS5zaXplKCkgPT0gMTYpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFNjYW4gdGhlIFBISSBvcGVyYW5kcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSArPSAyKSB7CisgICAgdW5zaWduZWQgU3JjUmVnID0gTUktPmdldE9wZXJhbmQoaSkuZ2V0UmVnKCk7CisgICAgaWYgKFNyY1JlZyA9PSBEc3RSZWcpCisgICAgICBjb250aW51ZTsKKyAgICBNYWNoaW5lSW5zdHIgKlNyY01JID0gTVJJLT5nZXRWUmVnRGVmKFNyY1JlZyk7CisKKyAgICAvLyBTa2lwIG92ZXIgcmVnaXN0ZXItdG8tcmVnaXN0ZXIgbW92ZXMuCisgICAgaWYgKFNyY01JICYmIFNyY01JLT5pc0NvcHkoKSAmJgorICAgICAgICAhU3JjTUktPmdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCkgJiYKKyAgICAgICAgIVNyY01JLT5nZXRPcGVyYW5kKDEpLmdldFN1YlJlZygpICYmCisgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoU3JjTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpKQorICAgICAgU3JjTUkgPSBNUkktPmdldFZSZWdEZWYoU3JjTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpOworICAgIGlmICghU3JjTUkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoU3JjTUktPmlzUEhJKCkpIHsKKyAgICAgIGlmICghSXNTaW5nbGVWYWx1ZVBISUN5Y2xlKFNyY01JLCBTaW5nbGVWYWxSZWcsIFBISXNJbkN5Y2xlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAvLyBGYWlsIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbm9uLXBoaS9ub24tbW92ZSByZWdpc3Rlci4KKyAgICAgIGlmIChTaW5nbGVWYWxSZWcgIT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgU2luZ2xlVmFsUmVnID0gU3JjUmVnOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIElzRGVhZFBISUN5Y2xlIC0gQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGRlZmluZWQgYnkgYSBQSEkgaXMgb25seSB1c2VkIGJ5CisvLy8gb3RoZXIgUEhJcyBpbiBhIGN5Y2xlLgorYm9vbCBPcHRpbWl6ZVBISXM6OklzRGVhZFBISUN5Y2xlKE1hY2hpbmVJbnN0ciAqTUksIEluc3RyU2V0ICZQSElzSW5DeWNsZSkgeworICBhc3NlcnQoTUktPmlzUEhJKCkgJiYgIklzRGVhZFBISUN5Y2xlIGV4cGVjdHMgYSBQSEkgaW5zdHJ1Y3Rpb24iKTsKKyAgdW5zaWduZWQgRHN0UmVnID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKERzdFJlZykgJiYKKyAgICAgICAgICJQSEkgZGVzdGluYXRpb24gaXMgbm90IGEgdmlydHVhbCByZWdpc3RlciIpOworCisgIC8vIFNlZSBpZiB3ZSBhbHJlYWR5IHNhdyB0aGlzIHJlZ2lzdGVyLgorICBpZiAoIVBISXNJbkN5Y2xlLmluc2VydChNSSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gRG9uJ3Qgc2NhbiBjcmF6aWx5IGNvbXBsZXggdGhpbmdzLgorICBpZiAoUEhJc0luQ3ljbGUuc2l6ZSgpID09IDE2KQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9pdGVyYXRvciBJID0gTVJJLT51c2VfYmVnaW4oRHN0UmVnKSwKKyAgICAgICAgIEUgPSBNUkktPnVzZV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gJipJOworICAgIGlmICghVXNlTUktPmlzUEhJKCkgfHwgIUlzRGVhZFBISUN5Y2xlKFVzZU1JLCBQSElzSW5DeWNsZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIE9wdGltaXplQkIgLSBSZW1vdmUgZGVhZCBQSEkgY3ljbGVzIGFuZCBQSEkgY3ljbGVzIHRoYXQgY2FuIGJlIHJlcGxhY2VkIGJ5CisvLy8gYSBzaW5nbGUgdmFsdWUuCitib29sIE9wdGltaXplUEhJczo6T3B0aW1pemVCQihNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcgorICAgICAgICAgTUlJID0gTUJCLmJlZ2luKCksIEUgPSBNQkIuZW5kKCk7IE1JSSAhPSBFOyApIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gJipNSUkrKzsKKyAgICBpZiAoIU1JLT5pc1BISSgpKQorICAgICAgYnJlYWs7CisKKyAgICAvLyBDaGVjayBmb3Igc2luZ2xlLXZhbHVlIFBISSBjeWNsZXMuCisgICAgdW5zaWduZWQgU2luZ2xlVmFsUmVnID0gMDsKKyAgICBJbnN0clNldCBQSElzSW5DeWNsZTsKKyAgICBpZiAoSXNTaW5nbGVWYWx1ZVBISUN5Y2xlKE1JLCBTaW5nbGVWYWxSZWcsIFBISXNJbkN5Y2xlKSAmJgorICAgICAgICBTaW5nbGVWYWxSZWcgIT0gMCkgeworICAgICAgTVJJLT5yZXBsYWNlUmVnV2l0aChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSwgU2luZ2xlVmFsUmVnKTsKKyAgICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICsrTnVtUEhJQ3ljbGVzOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgZGVhZCBQSEkgY3ljbGVzLgorICAgIFBISXNJbkN5Y2xlLmNsZWFyKCk7CisgICAgaWYgKElzRGVhZFBISUN5Y2xlKE1JLCBQSElzSW5DeWNsZSkpIHsKKyAgICAgIGZvciAoSW5zdHJTZXRJdGVyYXRvciBQSSA9IFBISXNJbkN5Y2xlLmJlZ2luKCksIFBFID0gUEhJc0luQ3ljbGUuZW5kKCk7CisgICAgICAgICAgIFBJICE9IFBFOyArK1BJKSB7CisgICAgICAgIE1hY2hpbmVJbnN0ciAqUGhpTUkgPSAqUEk7CisgICAgICAgIGlmICgmKk1JSSA9PSBQaGlNSSkKKyAgICAgICAgICArK01JSTsKKyAgICAgICAgUGhpTUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgfQorICAgICAgKytOdW1EZWFkUEhJQ3ljbGVzOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBDaGFuZ2VkOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEJRUC9HcmFwaC5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEJRUC9HcmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjI0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9QQlFQL0dyYXBoLmgKQEAgLTAsMCArMSw0MjUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0gR3JhcGguaCAtIFBCUVAgR3JhcGggLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUEJRUCBHcmFwaCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfR1JBUEhfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEJRUF9HUkFQSF9ICisKKyNpbmNsdWRlICJNYXRoLmgiCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBQQlFQIHsKKworICAvLy8gUEJRUCBHcmFwaCBjbGFzcy4KKyAgLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGRlc2NyaWJlIFBCUVAgcHJvYmxlbXMuCisgIGNsYXNzIEdyYXBoIHsKKyAgcHJpdmF0ZToKKworICAgIC8vIC0tLS0tIFRZUEVERUZTIC0tLS0tCisgICAgY2xhc3MgTm9kZUVudHJ5OworICAgIGNsYXNzIEVkZ2VFbnRyeTsKKworICAgIHR5cGVkZWYgc3RkOjpsaXN0PE5vZGVFbnRyeT4gTm9kZUxpc3Q7CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8RWRnZUVudHJ5PiBFZGdlTGlzdDsKKworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIE5vZGVMaXN0OjppdGVyYXRvciBOb2RlSXRyOworICAgIHR5cGVkZWYgTm9kZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIENvbnN0Tm9kZUl0cjsKKworICAgIHR5cGVkZWYgRWRnZUxpc3Q6Oml0ZXJhdG9yIEVkZ2VJdHI7CisgICAgdHlwZWRlZiBFZGdlTGlzdDo6Y29uc3RfaXRlcmF0b3IgQ29uc3RFZGdlSXRyOworCisgIHByaXZhdGU6CisKKyAgICB0eXBlZGVmIHN0ZDo6bGlzdDxFZGdlSXRyPiBBZGpFZGdlTGlzdDsKKyAgCisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgQWRqRWRnZUxpc3Q6Oml0ZXJhdG9yIEFkakVkZ2VJdHI7CisKKyAgcHJpdmF0ZToKKworICAgIGNsYXNzIE5vZGVFbnRyeSB7CisgICAgcHJpdmF0ZToKKyAgICAgIFZlY3RvciBjb3N0czsgICAgICAKKyAgICAgIEFkakVkZ2VMaXN0IGFkakVkZ2VzOworICAgICAgdW5zaWduZWQgZGVncmVlOworICAgICAgdm9pZCAqZGF0YTsKKyAgICBwdWJsaWM6CisgICAgICBOb2RlRW50cnkoY29uc3QgVmVjdG9yICZjb3N0cykgOiBjb3N0cyhjb3N0cyksIGRlZ3JlZSgwKSB7fQorICAgICAgVmVjdG9yJiBnZXRDb3N0cygpIHsgcmV0dXJuIGNvc3RzOyB9CisgICAgICBjb25zdCBWZWN0b3ImIGdldENvc3RzKCkgY29uc3QgeyByZXR1cm4gY29zdHM7IH0KKyAgICAgIHVuc2lnbmVkIGdldERlZ3JlZSgpIGNvbnN0IHsgcmV0dXJuIGRlZ3JlZTsgfQorICAgICAgQWRqRWRnZUl0ciBlZGdlc0JlZ2luKCkgeyByZXR1cm4gYWRqRWRnZXMuYmVnaW4oKTsgfQorICAgICAgQWRqRWRnZUl0ciBlZGdlc0VuZCgpIHsgcmV0dXJuIGFkakVkZ2VzLmVuZCgpOyB9CisgICAgICBBZGpFZGdlSXRyIGFkZEVkZ2UoRWRnZUl0ciBlKSB7CisgICAgICAgICsrZGVncmVlOworICAgICAgICByZXR1cm4gYWRqRWRnZXMuaW5zZXJ0KGFkakVkZ2VzLmVuZCgpLCBlKTsKKyAgICAgIH0KKyAgICAgIHZvaWQgcmVtb3ZlRWRnZShBZGpFZGdlSXRyIGFlKSB7CisgICAgICAgIC0tZGVncmVlOworICAgICAgICBhZGpFZGdlcy5lcmFzZShhZSk7CisgICAgICB9CisgICAgICB2b2lkIHNldERhdGEodm9pZCAqZGF0YSkgeyB0aGlzLT5kYXRhID0gZGF0YTsgfQorICAgICAgdm9pZCogZ2V0RGF0YSgpIHsgcmV0dXJuIGRhdGE7IH0KKyAgICB9OworCisgICAgY2xhc3MgRWRnZUVudHJ5IHsKKyAgICBwcml2YXRlOgorICAgICAgTm9kZUl0ciBub2RlMSwgbm9kZTI7CisgICAgICBNYXRyaXggY29zdHM7CisgICAgICBBZGpFZGdlSXRyIG5vZGUxQUVJdHIsIG5vZGUyQUVJdHI7CisgICAgICB2b2lkICpkYXRhOworICAgIHB1YmxpYzoKKyAgICAgIEVkZ2VFbnRyeShOb2RlSXRyIG5vZGUxLCBOb2RlSXRyIG5vZGUyLCBjb25zdCBNYXRyaXggJmNvc3RzKQorICAgICAgICA6IG5vZGUxKG5vZGUxKSwgbm9kZTIobm9kZTIpLCBjb3N0cyhjb3N0cykge30KKyAgICAgIE5vZGVJdHIgZ2V0Tm9kZTEoKSBjb25zdCB7IHJldHVybiBub2RlMTsgfQorICAgICAgTm9kZUl0ciBnZXROb2RlMigpIGNvbnN0IHsgcmV0dXJuIG5vZGUyOyB9CisgICAgICBNYXRyaXgmIGdldENvc3RzKCkgeyByZXR1cm4gY29zdHM7IH0KKyAgICAgIGNvbnN0IE1hdHJpeCYgZ2V0Q29zdHMoKSBjb25zdCB7IHJldHVybiBjb3N0czsgfQorICAgICAgdm9pZCBzZXROb2RlMUFFSXRyKEFkakVkZ2VJdHIgYWUpIHsgbm9kZTFBRUl0ciA9IGFlOyB9CisgICAgICBBZGpFZGdlSXRyIGdldE5vZGUxQUVJdHIoKSB7IHJldHVybiBub2RlMUFFSXRyOyB9CisgICAgICB2b2lkIHNldE5vZGUyQUVJdHIoQWRqRWRnZUl0ciBhZSkgeyBub2RlMkFFSXRyID0gYWU7IH0KKyAgICAgIEFkakVkZ2VJdHIgZ2V0Tm9kZTJBRUl0cigpIHsgcmV0dXJuIG5vZGUyQUVJdHI7IH0KKyAgICAgIHZvaWQgc2V0RGF0YSh2b2lkICpkYXRhKSB7IHRoaXMtPmRhdGEgPSBkYXRhOyB9CisgICAgICB2b2lkICpnZXREYXRhKCkgeyByZXR1cm4gZGF0YTsgfQorICAgIH07CisKKyAgICAvLyAtLS0tLSBNRU1CRVJTIC0tLS0tCisKKyAgICBOb2RlTGlzdCBub2RlczsKKyAgICB1bnNpZ25lZCBudW1Ob2RlczsKKworICAgIEVkZ2VMaXN0IGVkZ2VzOworICAgIHVuc2lnbmVkIG51bUVkZ2VzOworCisgICAgLy8gLS0tLS0gSU5URVJOQUwgTUVUSE9EUyAtLS0tLQorCisgICAgTm9kZUVudHJ5JiBnZXROb2RlKE5vZGVJdHIgbkl0cikgeyByZXR1cm4gKm5JdHI7IH0KKyAgICBjb25zdCBOb2RlRW50cnkmIGdldE5vZGUoQ29uc3ROb2RlSXRyIG5JdHIpIGNvbnN0IHsgcmV0dXJuICpuSXRyOyB9CisKKyAgICBFZGdlRW50cnkmIGdldEVkZ2UoRWRnZUl0ciBlSXRyKSB7IHJldHVybiAqZUl0cjsgfQorICAgIGNvbnN0IEVkZ2VFbnRyeSYgZ2V0RWRnZShDb25zdEVkZ2VJdHIgZUl0cikgY29uc3QgeyByZXR1cm4gKmVJdHI7IH0KKworICAgIE5vZGVJdHIgYWRkQ29uc3RydWN0ZWROb2RlKGNvbnN0IE5vZGVFbnRyeSAmbikgeworICAgICAgKytudW1Ob2RlczsKKyAgICAgIHJldHVybiBub2Rlcy5pbnNlcnQobm9kZXMuZW5kKCksIG4pOworICAgIH0KKworICAgIEVkZ2VJdHIgYWRkQ29uc3RydWN0ZWRFZGdlKGNvbnN0IEVkZ2VFbnRyeSAmZSkgeworICAgICAgYXNzZXJ0KGZpbmRFZGdlKGUuZ2V0Tm9kZTEoKSwgZS5nZXROb2RlMigpKSA9PSBlZGdlcy5lbmQoKSAmJgorICAgICAgICAgICAgICJBdHRlbXB0IHRvIGFkZCBkdXBsaWNhdGUgZWRnZS4iKTsKKyAgICAgICsrbnVtRWRnZXM7CisgICAgICBFZGdlSXRyIGVkZ2VJdHIgPSBlZGdlcy5pbnNlcnQoZWRnZXMuZW5kKCksIGUpOworICAgICAgRWRnZUVudHJ5ICZuZSA9IGdldEVkZ2UoZWRnZUl0cik7CisgICAgICBOb2RlRW50cnkgJm4xID0gZ2V0Tm9kZShuZS5nZXROb2RlMSgpKTsKKyAgICAgIE5vZGVFbnRyeSAmbjIgPSBnZXROb2RlKG5lLmdldE5vZGUyKCkpOworICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIG1hdHJpeCBkaW1lbnNpb25zOgorICAgICAgYXNzZXJ0KChuMS5nZXRDb3N0cygpLmdldExlbmd0aCgpID09IG5lLmdldENvc3RzKCkuZ2V0Um93cygpKSAmJgorICAgICAgICAgICAgIChuMi5nZXRDb3N0cygpLmdldExlbmd0aCgpID09IG5lLmdldENvc3RzKCkuZ2V0Q29scygpKSAmJgorICAgICAgICAgICAgICJFZGdlIGNvc3QgZGltZW5zaW9ucyBkbyBub3QgbWF0Y2ggbm9kZSBjb3N0cyBkaW1lbnNpb25zLiIpOworICAgICAgbmUuc2V0Tm9kZTFBRUl0cihuMS5hZGRFZGdlKGVkZ2VJdHIpKTsKKyAgICAgIG5lLnNldE5vZGUyQUVJdHIobjIuYWRkRWRnZShlZGdlSXRyKSk7CisgICAgICByZXR1cm4gZWRnZUl0cjsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBjb3B5RnJvbShjb25zdCBHcmFwaCAmb3RoZXIpOworICBwdWJsaWM6CisKKyAgICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBQQlFQIGdyYXBoLgorICAgIEdyYXBoKCkgOiBudW1Ob2RlcygwKSwgbnVtRWRnZXMoMCkge30KKworICAgIC8vLyBcYnJpZWYgQ29weSBjb25zdHJ1Y3QgdGhpcyBncmFwaCBmcm9tICJvdGhlciIuIE5vdGU6IERvZXMgbm90IGNvcHkgbm9kZQorICAgIC8vLyAgICAgICAgYW5kIGVkZ2UgZGF0YSwgb25seSBncmFwaCBzdHJ1Y3R1cmUgYW5kIGNvc3RzLgorICAgIC8vLyBAcGFyYW0gb3RoZXIgU291cmNlIGdyYXBoIHRvIGNvcHkgZnJvbS4KKyAgICBHcmFwaChjb25zdCBHcmFwaCAmb3RoZXIpIDogbnVtTm9kZXMoMCksIG51bUVkZ2VzKDApIHsKKyAgICAgIGNvcHlGcm9tKG90aGVyKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIE1ha2UgdGhpcyBncmFwaCBhIGNvcHkgb2YgIm90aGVyIi4gTm90ZTogRG9lcyBub3QgY29weSBub2RlIGFuZAorICAgIC8vLyAgICAgICAgZWRnZSBkYXRhLCBvbmx5IGdyYXBoIHN0cnVjdHVyZSBhbmQgY29zdHMuCisgICAgLy8vIEBwYXJhbSBvdGhlciBUaGUgZ3JhcGggdG8gY29weSBmcm9tLgorICAgIC8vLyBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoaXMgZ3JhcGguCisgICAgLy8vCisgICAgLy8vIFRoaXMgd2lsbCBjbGVhciB0aGUgY3VycmVudCBncmFwaCwgZXJhc2luZyBhbnkgbm9kZXMgYW5kIGVkZ2VzIGFkZGVkLAorICAgIC8vLyBiZWZvcmUgY29weWluZyBmcm9tIG90aGVyLgorICAgIEdyYXBoJiBvcGVyYXRvcj0oY29uc3QgR3JhcGggJm90aGVyKSB7CisgICAgICBjbGVhcigpOyAgICAgIAorICAgICAgY29weUZyb20ob3RoZXIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgQWRkIGEgbm9kZSB3aXRoIHRoZSBnaXZlbiBjb3N0cy4KKyAgICAvLy8gQHBhcmFtIGNvc3RzIENvc3QgdmVjdG9yIGZvciB0aGUgbmV3IG5vZGUuCisgICAgLy8vIEByZXR1cm4gTm9kZSBpdGVyYXRvciBmb3IgdGhlIGFkZGVkIG5vZGUuCisgICAgTm9kZUl0ciBhZGROb2RlKGNvbnN0IFZlY3RvciAmY29zdHMpIHsKKyAgICAgIHJldHVybiBhZGRDb25zdHJ1Y3RlZE5vZGUoTm9kZUVudHJ5KGNvc3RzKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBBZGQgYW4gZWRnZSBiZXR3ZWVuIHRoZSBnaXZlbiBub2RlcyB3aXRoIHRoZSBnaXZlbiBjb3N0cy4KKyAgICAvLy8gQHBhcmFtIG4xSXRyIEZpcnN0IG5vZGUuCisgICAgLy8vIEBwYXJhbSBuMkl0ciBTZWNvbmQgbm9kZS4KKyAgICAvLy8gQHJldHVybiBFZGdlIGl0ZXJhdG9yIGZvciB0aGUgYWRkZWQgZWRnZS4KKyAgICBFZGdlSXRyIGFkZEVkZ2UoR3JhcGg6Ok5vZGVJdHIgbjFJdHIsIEdyYXBoOjpOb2RlSXRyIG4ySXRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXRyaXggJmNvc3RzKSB7CisgICAgICBhc3NlcnQoZ2V0Tm9kZUNvc3RzKG4xSXRyKS5nZXRMZW5ndGgoKSA9PSBjb3N0cy5nZXRSb3dzKCkgJiYKKyAgICAgICAgICAgICBnZXROb2RlQ29zdHMobjJJdHIpLmdldExlbmd0aCgpID09IGNvc3RzLmdldENvbHMoKSAmJgorICAgICAgICAgICAgICJNYXRyaXggZGltZW5zaW9ucyBtaXNtYXRjaC4iKTsKKyAgICAgIHJldHVybiBhZGRDb25zdHJ1Y3RlZEVkZ2UoRWRnZUVudHJ5KG4xSXRyLCBuMkl0ciwgY29zdHMpKTsgCisgICAgfQorCisgICAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguCisgICAgLy8vIEByZXR1cm4gTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC4KKyAgICB1bnNpZ25lZCBnZXROdW1Ob2RlcygpIGNvbnN0IHsgcmV0dXJuIG51bU5vZGVzOyB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGVkZ2VzIGluIHRoZSBncmFwaC4KKyAgICAvLy8gQHJldHVybiBOdW1iZXIgb2YgZWRnZXMgaW4gdGhlIGdyYXBoLgorICAgIHVuc2lnbmVkIGdldE51bUVkZ2VzKCkgY29uc3QgeyByZXR1cm4gbnVtRWRnZXM7IH0KKworICAgIC8vLyBcYnJpZWYgR2V0IGEgbm9kZSdzIGNvc3QgdmVjdG9yLgorICAgIC8vLyBAcGFyYW0gbkl0ciBOb2RlIGl0ZXJhdG9yLgorICAgIC8vLyBAcmV0dXJuIE5vZGUgY29zdCB2ZWN0b3IuCisgICAgVmVjdG9yJiBnZXROb2RlQ29zdHMoTm9kZUl0ciBuSXRyKSB7IHJldHVybiBnZXROb2RlKG5JdHIpLmdldENvc3RzKCk7IH0KKworICAgIC8vLyBcYnJpZWYgR2V0IGEgbm9kZSdzIGNvc3QgdmVjdG9yIChjb25zdCB2ZXJzaW9uKS4KKyAgICAvLy8gQHBhcmFtIG5JdHIgTm9kZSBpdGVyYXRvci4KKyAgICAvLy8gQHJldHVybiBOb2RlIGNvc3QgdmVjdG9yLgorICAgIGNvbnN0IFZlY3RvciYgZ2V0Tm9kZUNvc3RzKENvbnN0Tm9kZUl0ciBuSXRyKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Tm9kZShuSXRyKS5nZXRDb3N0cygpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgU2V0IGEgbm9kZSdzIGRhdGEgcG9pbnRlci4KKyAgICAvLy8gQHBhcmFtIG5JdHIgTm9kZSBpdGVyYXRvci4KKyAgICAvLy8gQHBhcmFtIGRhdGEgUG9pbnRlciB0byBub2RlIGRhdGEuCisgICAgLy8vCisgICAgLy8vIFR5cGljYWxseSB1c2VkIGJ5IGEgUEJRUCBzb2x2ZXIgdG8gYXR0YWNoIGRhdGEgdG8gYWlkIGluIHNvbHV0aW9uLgorICAgIHZvaWQgc2V0Tm9kZURhdGEoTm9kZUl0ciBuSXRyLCB2b2lkICpkYXRhKSB7IGdldE5vZGUobkl0cikuc2V0RGF0YShkYXRhKTsgfQorCisgICAgLy8vIFxicmllZiBHZXQgdGhlIG5vZGUncyBkYXRhIHBvaW50ZXIuCisgICAgLy8vIEBwYXJhbSBuSXRyIE5vZGUgaXRlcmF0b3IuCisgICAgLy8vIEByZXR1cm4gUG9pbnRlciB0byBub2RlIGRhdGEuCisgICAgdm9pZCogZ2V0Tm9kZURhdGEoTm9kZUl0ciBuSXRyKSB7IHJldHVybiBnZXROb2RlKG5JdHIpLmdldERhdGEoKTsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgR2V0IGFuIGVkZ2UncyBjb3N0IG1hdHJpeC4KKyAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4KKyAgICAvLy8gQHJldHVybiBFZGdlIGNvc3QgbWF0cml4LgorICAgIE1hdHJpeCYgZ2V0RWRnZUNvc3RzKEVkZ2VJdHIgZUl0cikgeyByZXR1cm4gZ2V0RWRnZShlSXRyKS5nZXRDb3N0cygpOyB9CisKKyAgICAvLy8gXGJyaWVmIEdldCBhbiBlZGdlJ3MgY29zdCBtYXRyaXggKGNvbnN0IHZlcnNpb24pLgorICAgIC8vLyBAcGFyYW0gZUl0ciBFZGdlIGl0ZXJhdG9yLgorICAgIC8vLyBAcmV0dXJuIEVkZ2UgY29zdCBtYXRyaXguCisgICAgY29uc3QgTWF0cml4JiBnZXRFZGdlQ29zdHMoQ29uc3RFZGdlSXRyIGVJdHIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRFZGdlKGVJdHIpLmdldENvc3RzKCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBTZXQgYW4gZWRnZSdzIGRhdGEgcG9pbnRlci4KKyAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4KKyAgICAvLy8gQHBhcmFtIGRhdGEgUG9pbnRlciB0byBlZGdlIGRhdGEuCisgICAgLy8vCisgICAgLy8vIFR5cGljYWxseSB1c2VkIGJ5IGEgUEJRUCBzb2x2ZXIgdG8gYXR0YWNoIGRhdGEgdG8gYWlkIGluIHNvbHV0aW9uLgorICAgIHZvaWQgc2V0RWRnZURhdGEoRWRnZUl0ciBlSXRyLCB2b2lkICpkYXRhKSB7IGdldEVkZ2UoZUl0cikuc2V0RGF0YShkYXRhKTsgfQorCisgICAgLy8vIFxicmllZiBHZXQgYW4gZWRnZSdzIGRhdGEgcG9pbnRlci4KKyAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4KKyAgICAvLy8gQHJldHVybiBQb2ludGVyIHRvIGVkZ2UgZGF0YS4gCisgICAgdm9pZCogZ2V0RWRnZURhdGEoRWRnZUl0ciBlSXRyKSB7IHJldHVybiBnZXRFZGdlKGVJdHIpLmdldERhdGEoKTsgfQorCisgICAgLy8vIFxicmllZiBHZXQgYSBub2RlJ3MgZGVncmVlLgorICAgIC8vLyBAcGFyYW0gbkl0ciBOb2RlIGl0ZXJhdG9yLgorICAgIC8vLyBAcmV0dXJuIFRoZSBkZWdyZWUgb2YgdGhlIG5vZGUuCisgICAgdW5zaWduZWQgZ2V0Tm9kZURlZ3JlZShOb2RlSXRyIG5JdHIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXROb2RlKG5JdHIpLmdldERlZ3JlZSgpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgQmVnaW4gaXRlcmF0b3IgZm9yIG5vZGUgc2V0LgorICAgIE5vZGVJdHIgbm9kZXNCZWdpbigpIHsgcmV0dXJuIG5vZGVzLmJlZ2luKCk7IH0KKworICAgIC8vLyBcYnJpZWYgQmVnaW4gY29uc3QgaXRlcmF0b3IgZm9yIG5vZGUgc2V0LgorICAgIENvbnN0Tm9kZUl0ciBub2Rlc0JlZ2luKCkgY29uc3QgeyByZXR1cm4gbm9kZXMuYmVnaW4oKTsgfQorCisgICAgLy8vIFxicmllZiBFbmQgaXRlcmF0b3IgZm9yIG5vZGUgc2V0LgorICAgIE5vZGVJdHIgbm9kZXNFbmQoKSB7IHJldHVybiBub2Rlcy5lbmQoKTsgfQorCisgICAgLy8vIFxicmllZiBFbmQgY29uc3QgaXRlcmF0b3IgZm9yIG5vZGUgc2V0LgorICAgIENvbnN0Tm9kZUl0ciBub2Rlc0VuZCgpIGNvbnN0IHsgcmV0dXJuIG5vZGVzLmVuZCgpOyB9CisKKyAgICAvLy8gXGJyaWVmIEJlZ2luIGl0ZXJhdG9yIGZvciBlZGdlIHNldC4KKyAgICBFZGdlSXRyIGVkZ2VzQmVnaW4oKSB7IHJldHVybiBlZGdlcy5iZWdpbigpOyB9CisKKyAgICAvLy8gXGJyaWVmIEVuZCBpdGVyYXRvciBmb3IgZWRnZSBzZXQuCisgICAgRWRnZUl0ciBlZGdlc0VuZCgpIHsgcmV0dXJuIGVkZ2VzLmVuZCgpOyB9CisKKyAgICAvLy8gXGJyaWVmIEdldCBiZWdpbiBpdGVyYXRvciBmb3IgYWRqYWNlbnQgZWRnZSBzZXQuCisgICAgLy8vIEBwYXJhbSBuSXRyIE5vZGUgaXRlcmF0b3IuCisgICAgLy8vIEByZXR1cm4gQmVnaW4gaXRlcmF0b3IgZm9yIHRoZSBzZXQgb2YgZWRnZXMgY29ubmVjdGVkIHRvIHRoZSBnaXZlbiBub2RlLgorICAgIEFkakVkZ2VJdHIgYWRqRWRnZXNCZWdpbihOb2RlSXRyIG5JdHIpIHsKKyAgICAgIHJldHVybiBnZXROb2RlKG5JdHIpLmVkZ2VzQmVnaW4oKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEdldCBlbmQgaXRlcmF0b3IgZm9yIGFkamFjZW50IGVkZ2Ugc2V0LgorICAgIC8vLyBAcGFyYW0gbkl0ciBOb2RlIGl0ZXJhdG9yLgorICAgIC8vLyBAcmV0dXJuIEVuZCBpdGVyYXRvciBmb3IgdGhlIHNldCBvZiBlZGdlcyBjb25uZWN0ZWQgdG8gdGhlIGdpdmVuIG5vZGUuCisgICAgQWRqRWRnZUl0ciBhZGpFZGdlc0VuZChOb2RlSXRyIG5JdHIpIHsKKyAgICAgIHJldHVybiBnZXROb2RlKG5JdHIpLmVkZ2VzRW5kKCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBHZXQgdGhlIGZpcnN0IG5vZGUgY29ubmVjdGVkIHRvIHRoaXMgZWRnZS4KKyAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4KKyAgICAvLy8gQHJldHVybiBUaGUgZmlyc3Qgbm9kZSBjb25uZWN0ZWQgdG8gdGhlIGdpdmVuIGVkZ2UuIAorICAgIE5vZGVJdHIgZ2V0RWRnZU5vZGUxKEVkZ2VJdHIgZUl0cikgeworICAgICAgcmV0dXJuIGdldEVkZ2UoZUl0cikuZ2V0Tm9kZTEoKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgc2Vjb25kIG5vZGUgY29ubmVjdGVkIHRvIHRoaXMgZWRnZS4KKyAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4KKyAgICAvLy8gQHJldHVybiBUaGUgc2Vjb25kIG5vZGUgY29ubmVjdGVkIHRvIHRoZSBnaXZlbiBlZGdlLiAKKyAgICBOb2RlSXRyIGdldEVkZ2VOb2RlMihFZGdlSXRyIGVJdHIpIHsKKyAgICAgIHJldHVybiBnZXRFZGdlKGVJdHIpLmdldE5vZGUyKCk7CisgICAgfSAKKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSAib3RoZXIiIG5vZGUgY29ubmVjdGVkIHRvIHRoaXMgZWRnZS4KKyAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4KKyAgICAvLy8gQHBhcmFtIG5JdHIgTm9kZSBpdGVyYXRvciBmb3IgdGhlICJnaXZlbiIgbm9kZS4KKyAgICAvLy8gQHJldHVybiBUaGUgaXRlcmF0b3IgZm9yIHRoZSAib3RoZXIiIG5vZGUgY29ubmVjdGVkIHRvIHRoaXMgZWRnZS4gCisgICAgTm9kZUl0ciBnZXRFZGdlT3RoZXJOb2RlKEVkZ2VJdHIgZUl0ciwgTm9kZUl0ciBuSXRyKSB7CisgICAgICBFZGdlRW50cnkgJmUgPSBnZXRFZGdlKGVJdHIpOworICAgICAgaWYgKGUuZ2V0Tm9kZTEoKSA9PSBuSXRyKSB7CisgICAgICAgIHJldHVybiBlLmdldE5vZGUyKCk7CisgICAgICB9IC8vIGVsc2UKKyAgICAgIHJldHVybiBlLmdldE5vZGUxKCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBHZXQgdGhlIGVkZ2UgY29ubmVjdGluZyB0d28gbm9kZXMuCisgICAgLy8vIEBwYXJhbSBuMUl0ciBGaXJzdCBub2RlIGl0ZXJhdG9yLgorICAgIC8vLyBAcGFyYW0gbjJJdHIgU2Vjb25kIG5vZGUgaXRlcmF0b3IuCisgICAgLy8vIEByZXR1cm4gQW4gaXRlcmF0b3IgZm9yIGVkZ2UgKG4xSXRyLCBuMkl0cikgaWYgc3VjaCBhbiBlZGdlIGV4aXN0cywKKyAgICAvLy8gICAgICAgICBvdGhlcndpc2UgcmV0dXJucyBlZGdlc0VuZCgpLiAKKyAgICBFZGdlSXRyIGZpbmRFZGdlKE5vZGVJdHIgbjFJdHIsIE5vZGVJdHIgbjJJdHIpIHsKKyAgICAgIGZvciAoQWRqRWRnZUl0ciBhZUl0ciA9IGFkakVkZ2VzQmVnaW4objFJdHIpLCBhZUVuZCA9IGFkakVkZ2VzRW5kKG4xSXRyKTsKKyAgICAgICAgIGFlSXRyICE9IGFlRW5kOyArK2FlSXRyKSB7CisgICAgICAgIGlmICgoZ2V0RWRnZU5vZGUxKCphZUl0cikgPT0gbjJJdHIpIHx8CisgICAgICAgICAgICAoZ2V0RWRnZU5vZGUyKCphZUl0cikgPT0gbjJJdHIpKSB7CisgICAgICAgICAgcmV0dXJuICphZUl0cjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGVkZ2VzLmVuZCgpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBncmFwaC4KKyAgICAvLy8gQHBhcmFtIG5JdHIgTm9kZSBpdGVyYXRvci4KKyAgICB2b2lkIHJlbW92ZU5vZGUoTm9kZUl0ciBuSXRyKSB7CisgICAgICBOb2RlRW50cnkgJm4gPSBnZXROb2RlKG5JdHIpOworICAgICAgZm9yIChBZGpFZGdlSXRyIGl0ciA9IG4uZWRnZXNCZWdpbigpLCBlbmQgPSBuLmVkZ2VzRW5kKCk7IGl0ciAhPSBlbmQ7KSB7CisgICAgICAgIEVkZ2VJdHIgZUl0ciA9ICppdHI7CisgICAgICAgICsraXRyOworICAgICAgICByZW1vdmVFZGdlKGVJdHIpOyAKKyAgICAgIH0KKyAgICAgIG5vZGVzLmVyYXNlKG5JdHIpOworICAgICAgLS1udW1Ob2RlczsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJlbW92ZSBhbiBlZGdlIGZyb20gdGhlIGdyYXBoLgorICAgIC8vLyBAcGFyYW0gZUl0ciBFZGdlIGl0ZXJhdG9yLgorICAgIHZvaWQgcmVtb3ZlRWRnZShFZGdlSXRyIGVJdHIpIHsKKyAgICAgIEVkZ2VFbnRyeSAmZSA9IGdldEVkZ2UoZUl0cik7CisgICAgICBOb2RlRW50cnkgJm4xID0gZ2V0Tm9kZShlLmdldE5vZGUxKCkpOworICAgICAgTm9kZUVudHJ5ICZuMiA9IGdldE5vZGUoZS5nZXROb2RlMigpKTsKKyAgICAgIG4xLnJlbW92ZUVkZ2UoZS5nZXROb2RlMUFFSXRyKCkpOworICAgICAgbjIucmVtb3ZlRWRnZShlLmdldE5vZGUyQUVJdHIoKSk7CisgICAgICBlZGdlcy5lcmFzZShlSXRyKTsKKyAgICAgIC0tbnVtRWRnZXM7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZW1vdmUgYWxsIG5vZGVzIGFuZCBlZGdlcyBmcm9tIHRoZSBncmFwaC4KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgbm9kZXMuY2xlYXIoKTsKKyAgICAgIGVkZ2VzLmNsZWFyKCk7CisgICAgICBudW1Ob2RlcyA9IG51bUVkZ2VzID0gMDsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFByaW50IGEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBncmFwaCBpbiBET1QgZm9ybWF0LgorICAgIC8vLyBAcGFyYW0gb3MgT3V0cHV0IHN0cmVhbSB0byBwcmludCBvbi4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT1N0cmVhbT4KKyAgICB2b2lkIHByaW50RG90KE9TdHJlYW0gJm9zKSB7CisgICAgCisgICAgICBvcyA8PCAiZ3JhcGgge1xuIjsKKworICAgICAgZm9yIChOb2RlSXRyIG5vZGVJdHIgPSBub2Rlc0JlZ2luKCksIG5vZGVFbmQgPSBub2Rlc0VuZCgpOworICAgICAgICAgICBub2RlSXRyICE9IG5vZGVFbmQ7ICsrbm9kZUl0cikgeworCisgICAgICAgIG9zIDw8ICIgIG5vZGUiIDw8IG5vZGVJdHIgPDwgIiBbIGxhYmVsPVwiIgorICAgICAgICAgICA8PCBub2RlSXRyIDw8ICI6ICIgPDwgZ2V0Tm9kZUNvc3RzKG5vZGVJdHIpIDw8ICJcIiBdXG4iOworICAgICAgfQorCisgICAgICBvcyA8PCAiICBlZGdlIFsgbGVuPSIgPDwgZ2V0TnVtTm9kZXMoKSA8PCAiIF1cbiI7CisKKyAgICAgIGZvciAoRWRnZUl0ciBlZGdlSXRyID0gZWRnZXNCZWdpbigpLCBlZGdlRW5kID0gZWRnZXNFbmQoKTsKKyAgICAgICAgICAgZWRnZUl0ciAhPSBlZGdlRW5kOyArK2VkZ2VJdHIpIHsKKworICAgICAgICBvcyA8PCAiICBub2RlIiA8PCBnZXRFZGdlTm9kZTEoZWRnZUl0cikKKyAgICAgICAgICAgPDwgIiAtLSBub2RlIiA8PCBnZXRFZGdlTm9kZTIoZWRnZUl0cikKKyAgICAgICAgICAgPDwgIiBbIGxhYmVsPVwiIjsKKworICAgICAgICBjb25zdCBNYXRyaXggJmVkZ2VDb3N0cyA9IGdldEVkZ2VDb3N0cyhlZGdlSXRyKTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZWRnZUNvc3RzLmdldFJvd3MoKTsgKytpKSB7CisgICAgICAgICAgb3MgPDwgZWRnZUNvc3RzLmdldFJvd0FzVmVjdG9yKGkpIDw8ICJcXG4iOworICAgICAgICB9CisgICAgICAgIG9zIDw8ICJcIiBdXG4iOworICAgICAgfQorICAgICAgb3MgPDwgIn1cbiI7CisgICAgfQorCisgIH07CisKKyAgY2xhc3MgTm9kZUl0ckNvbXBhcmF0b3IgeworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcigpKEdyYXBoOjpOb2RlSXRyIG4xLCBHcmFwaDo6Tm9kZUl0ciBuMikgY29uc3QgeworICAgICAgcmV0dXJuICYqbjEgPCAmKm4yOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IoKShHcmFwaDo6Q29uc3ROb2RlSXRyIG4xLCBHcmFwaDo6Q29uc3ROb2RlSXRyIG4yKSBjb25zdCB7CisgICAgICByZXR1cm4gJipuMSA8ICYqbjI7CisgICAgfQorICB9OworCisgIGNsYXNzIEVkZ2VJdHJDb21wYXJ0b3IgeworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcigpKEdyYXBoOjpFZGdlSXRyIGUxLCBHcmFwaDo6RWRnZUl0ciBlMikgY29uc3QgeworICAgICAgcmV0dXJuICYqZTEgPCAmKmUyOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IoKShHcmFwaDo6Q29uc3RFZGdlSXRyIGUxLCBHcmFwaDo6Q29uc3RFZGdlSXRyIGUyKSBjb25zdCB7CisgICAgICByZXR1cm4gJiplMSA8ICYqZTI7CisgICAgfQorICB9OworCisgIHZvaWQgR3JhcGg6OmNvcHlGcm9tKGNvbnN0IEdyYXBoICZvdGhlcikgeworICAgIHN0ZDo6bWFwPEdyYXBoOjpDb25zdE5vZGVJdHIsIEdyYXBoOjpOb2RlSXRyLAorICAgICAgICAgICAgIE5vZGVJdHJDb21wYXJhdG9yPiBub2RlTWFwOworCisgICAgIGZvciAoR3JhcGg6OkNvbnN0Tm9kZUl0ciBuSXRyID0gb3RoZXIubm9kZXNCZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRW5kID0gb3RoZXIubm9kZXNFbmQoKTsKKyAgICAgICAgIG5JdHIgIT0gbkVuZDsgKytuSXRyKSB7CisgICAgICBub2RlTWFwW25JdHJdID0gYWRkTm9kZShvdGhlci5nZXROb2RlQ29zdHMobkl0cikpOworICAgIH0KKyAgICAgIAorICB9CisKK30KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9QQlFQX0dSQVBIX0hQUApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEJRUC9IZXVyaXN0aWNCYXNlLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9QQlFQL0hldXJpc3RpY0Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmIyNGUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEJRUC9IZXVyaXN0aWNCYXNlLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8vPT09LS0gSGV1cmlzdGNCYXNlLmggLS0tIEhldXJpc3RpYyBiYXNlIGNsYXNzIGZvciBQQlFQIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfSEVVUklTVElDQkFTRV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9QQlFQX0hFVVJJU1RJQ0JBU0VfSAorCisjaW5jbHVkZSAiSGV1cmlzdGljU29sdmVyLmgiCisKK25hbWVzcGFjZSBQQlFQIHsKKworICAvLy8gXGJyaWVmIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGhldXJpc3RpYyBpbXBsZW1lbnRhdGlvbnMuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIGhhbmR5IGJhc2UgZm9yIGhldXJpc3RpYyBpbXBsZW1lbnRhdGlvbnMgd2l0aCBjb21tb24KKyAgLy8vIHNvbHZlciBiZWhhdmlvdXIgaW1wbGVtZW50ZWQgZm9yIGEgbnVtYmVyIG9mIG1ldGhvZHMuCisgIC8vLworICAvLy8gVG8gaW1wbGVtZW50IHlvdXIgb3duIGhldXJpc3RpYyB1c2luZyB0aGlzIGNsYXNzIGFzIGEgYmFzZSB5b3UnbGwgaGF2ZSB0bworICAvLy8gaW1wbGVtZW50LCBhcyBhIG1pbmltdW0sIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgLy8vIDx1bD4KKyAgLy8vICAgPGxpPiB2b2lkIGFkZFRvSGV1cmlzdGljTGlzdChHcmFwaDo6Tm9kZUl0cikgOiBBZGQgYSBub2RlIHRvIHRoZQorICAvLy8gICAgICAgIGhldXJpc3RpYyByZWR1Y3Rpb24gbGlzdC4KKyAgLy8vICAgPGxpPiB2b2lkIGhldXJpc3RpY1JlZHVjZSgpIDogUGVyZm9ybSBhIHNpbmdsZSBoZXVyaXN0aWMgcmVkdWN0aW9uLgorICAvLy8gICA8bGk+IHZvaWQgcHJlVXBkYXRlRWRnZUNvc3RzKEdyYXBoOjpFZGdlSXRyKSA6IEhhbmRsZSB0aGUgKGltbWluZW50KQorICAvLy8gICAgICAgIGNoYW5nZSB0byB0aGUgY29zdCBtYXRyaXggb24gdGhlIGdpdmVuIGVkZ2UgKGJ5IFIyKS4KKyAgLy8vICAgPGxpPiB2b2lkIHBvc3RVcGRhdGVFZGdlQ29zdHRzKEdyYXBoOjpFZGdlSXRyKSA6IEhhbmRsZSB0aGUgbmV3IAorICAvLy8gICAgICAgIGNvc3RzIG9uIHRoZSBnaXZlbiBlZGdlLgorICAvLy8gICA8bGk+IHZvaWQgaGFuZGxlQWRkRWRnZShHcmFwaDo6RWRnZUl0cikgOiBIYW5kbGUgdGhlIGFkZGl0aW9uIG9mIGEgbmV3CisgIC8vLyAgICAgICAgZWRnZSBpbnRvIHRoZSBQQlFQIGdyYXBoIChieSBSMikuCisgIC8vLyAgIDxsaT4gdm9pZCBoYW5kbGVSZW1vdmVFZGdlKEdyYXBoOjpFZGdlSXRyLCBHcmFwaDo6Tm9kZUl0cikgOiBIYW5kbGUgdGhlCisgIC8vLyAgICAgICAgZGlzY29ubmVjdGlvbiBvZiB0aGUgZ2l2ZW4gZWRnZSBmcm9tIHRoZSBnaXZlbiBub2RlLgorICAvLy8gICA8bGk+IEEgY29uc3RydWN0b3IgZm9yIHlvdXIgZGVyaXZlZCBjbGFzcyA6IHRvIHBhc3MgYmFjayBhIHJlZmVyZW5jZSB0bworICAvLy8gICAgICAgIHRoZSBzb2x2ZXIgd2hpY2ggaXMgdXNpbmcgdGhpcyBoZXVyaXN0aWMuCisgIC8vLyA8L3VsPgorICAvLy8KKyAgLy8vIFRoZXNlIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRoaXMgY2xhc3MgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMsCisgIC8vLyBidXQgd2lsbCBhc3NlcnQgaWYgY2FsbGVkLgorICAvLy8gCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBjbGFzcyB1c2VzIHRoZSBjdXJpb3VzbHkgcmVjdXJzaXZlIHRlbXBsYXRlIGlkaW9tIHRvCisgIC8vLyBmb3J3YXJkIGNhbGxzIHRvIHRoZSBkZXJpdmVkIGNsYXNzLiBUaGVzZSBtZXRob2RzIG5lZWQgbm90IGJlIG1hZGUKKyAgLy8vIHZpcnR1YWwsIGFuZCBpbmRlZWQgcHJvYmFibHkgc2hvdWxkbid0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorICAvLy8KKyAgLy8vIFlvdSdsbCBhbHNvIG5lZWQgdG8gcHJvdmlkZSBOb2RlRGF0YSBhbmQgRWRnZURhdGEgc3RydWN0cyBpbiB5b3VyIGNsYXNzLgorICAvLy8gVGhlc2UgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGRhdGEgcmVsZXZhbnQgdG8geW91ciBoZXVyaXN0aWMgdG8gZWFjaAorICAvLy8gbm9kZS9lZGdlIGluIHRoZSBQQlFQIGdyYXBoLgorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBISW1wbD4KKyAgY2xhc3MgSGV1cmlzdGljQmFzZSB7CisgIHByaXZhdGU6CisKKyAgICB0eXBlZGVmIHN0ZDo6bGlzdDxHcmFwaDo6Tm9kZUl0cj4gT3B0aW1hbExpc3Q7CisKKyAgICBIZXVyaXN0aWNTb2x2ZXJJbXBsPEhJbXBsPiAmczsKKyAgICBHcmFwaCAmZzsKKyAgICBPcHRpbWFsTGlzdCBvcHRpbWFsTGlzdDsKKworICAgIC8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgZGVyaXZlZCBoZXVyaXN0aWMuCisgICAgSEltcGwmIGltcGwoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxISW1wbCY+KCp0aGlzKTsgfQorCisgICAgLy8gQWRkIHRoZSBnaXZlbiBub2RlIHRvIHRoZSBvcHRpbWFsIHJlZHVjdGlvbnMgbGlzdC4gS2VlcCBhbiBpdGVyYXRvciB0bworICAgIC8vIGl0cyBsb2NhdGlvbiBmb3IgZmFzdCByZW1vdmFsLiAKKyAgICB2b2lkIGFkZFRvT3B0aW1hbFJlZHVjdGlvbkxpc3QoR3JhcGg6Ok5vZGVJdHIgbkl0cikgeworICAgICAgb3B0aW1hbExpc3QuaW5zZXJ0KG9wdGltYWxMaXN0LmVuZCgpLCBuSXRyKTsKKyAgICB9CisKKyAgcHVibGljOgorCisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCBhIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gc29sdmVyLgorICAgIC8vLyBAcGFyYW0gc29sdmVyIFRoZSBzb2x2ZXIgd2hpY2ggaXMgdXNpbmcgdGhpcyBoZXVyaXN0aWMgaW5zdGFuY2UuCisgICAgSGV1cmlzdGljQmFzZShIZXVyaXN0aWNTb2x2ZXJJbXBsPEhJbXBsPiAmc29sdmVyKQorICAgICAgOiBzKHNvbHZlciksIGcocy5nZXRHcmFwaCgpKSB7IH0KKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBzb2x2ZXIgd2hpY2ggaXMgdXNpbmcgdGhpcyBoZXVyaXN0aWMgaW5zdGFuY2UuCisgICAgLy8vIEByZXR1cm4gVGhlIHNvbHZlciB3aGljaCBpcyB1c2luZyB0aGlzIGhldXJpc3RpYyBpbnN0YW5jZS4KKyAgICAvLy8KKyAgICAvLy8gWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gZ2V0IGFjY2VzcyB0byB0aGUgc29sdmVyIGluIHlvdXIgZGVyaXZlZAorICAgIC8vLyBoZXVyaXN0aWMgaW1wbGVtZW50YXRpb24uCisgICAgSGV1cmlzdGljU29sdmVySW1wbDxISW1wbD4mIGdldFNvbHZlcigpIHsgcmV0dXJuIHM7IH0KKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBncmFwaCByZXByZXNlbnRpbmcgdGhlIHByb2JsZW0gdG8gYmUgc29sdmVkLgorICAgIC8vLyBAcmV0dXJuIFRoZSBncmFwaCByZXByZXNlbnRpbmcgdGhlIHByb2JsZW0gdG8gYmUgc29sdmVkLgorICAgIEdyYXBoJiBnZXRHcmFwaCgpIHsgcmV0dXJuIGc7IH0KKworICAgIC8vLyBcYnJpZWYgVGVsbCB0aGUgc29sdmVyIHRvIHNpbXBsaWZ5IHRoZSBncmFwaCBiZWZvcmUgdGhlIHJlZHVjdGlvbiBwaGFzZS4KKyAgICAvLy8gQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgc29sdmVyIHNob3VsZCBydW4gYSBzaW1wbGlmaWNhdGlvbiBwaGFzZQorICAgIC8vLyAgICAgICAgIHByaW9yIHRvIHRoZSBtYWluIHNldHVwIGFuZCByZWR1Y3Rpb24uCisgICAgLy8vCisgICAgLy8vIEhldXJpc3RpY0Jhc2UgcmV0dXJucyB0cnVlIGZyb20gdGhpcyBtZXRob2QgYXMgaXQncyBhIHNlbnNpYmxlIGRlZmF1bHQsCisgICAgLy8vIGhvd2V2ZXIgeW91IGNhbiBvdmVyLXJpZGUgaXQgaW4geW91ciBkZXJpdmVkIGNsYXNzIGlmIHlvdSB3YW50IGRpZmZlcmVudAorICAgIC8vLyBiZWhhdmlvdXIuCisgICAgYm9vbCBzb2x2ZXJSdW5TaW1wbGlmeSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgIC8vLyBcYnJpZWYgRGVjaWRlIHdoZXRoZXIgYSBub2RlIHNob3VsZCBiZSBvcHRpbWFsbHkgb3IgaGV1cmlzdGljYWxseSAKKyAgICAvLy8gICAgICAgIHJlZHVjZWQuCisgICAgLy8vIEByZXR1cm4gV2hldGhlciBvciBub3QgdGhlIGdpdmVuIG5vZGUgc2hvdWxkIGJlIGxpc3RlZCBmb3Igb3B0aW1hbAorICAgIC8vLyAgICAgICAgIHJlZHVjdGlvbiAodmlhIFIwLCBSMSBvciBSMikuCisgICAgLy8vCisgICAgLy8vIEhldXJpc3RpY0Jhc2UgcmV0dXJucyB0cnVlIGZvciBhbnkgbm9kZSB3aXRoIGRlZ3JlZSBsZXNzIHRoYW4gMy4gVGhpcyBpcworICAgIC8vLyBzYW5lIGFuZCBzZW5zaWJsZSBmb3IgbWFueSBzaXR1YXRpb25zLCBidXQgbm90IGFsbC4gWW91IGNhbiBvdmVyLXJpZGUKKyAgICAvLy8gdGhpcyBtZXRob2QgaW4geW91ciBkZXJpdmVkIGNsYXNzIGlmIHlvdSB3YW50IGEgZGlmZmVyZW50IHNlbGVjdGlvbgorICAgIC8vLyBjcml0ZXJpYS4gTm90ZSBob3dldmVyIHRoYXQgeW91ciBjcml0ZXJpYSBmb3Igc2VsZWN0aW5nIG9wdGltYWwgbm9kZXMKKyAgICAvLy8gc2hvdWxkIGJlIDxpPmF0IGxlYXN0PC9pPiBhcyBzdHJvbmcgYXMgdGhpcy4gSS5lLiBOb2RlcyBvZiBkZWdyZWUgMyBvcgorICAgIC8vLyBoaWdoZXIgc2hvdWxkIG5vdCBiZSBzZWxlY3RlZCB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy4KKyAgICBib29sIHNob3VsZE9wdGltYWxseVJlZHVjZShHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICBpZiAoZy5nZXROb2RlRGVncmVlKG5JdHIpIDwgMykKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAvLyBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIFxicmllZiBBZGQgdGhlIGdpdmVuIG5vZGUgdG8gdGhlIGxpc3Qgb2Ygbm9kZXMgdG8gYmUgb3B0aW1hbGx5IHJlZHVjZWQuCisgICAgLy8vIEByZXR1cm4gbkl0ciBOb2RlIGl0ZXJhdG9yIHRvIGJlIGFkZGVkLgorICAgIC8vLworICAgIC8vLyBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBvdmVyLXJpZGUgdGhpcywgZXhjZXB0IHBlcmhhcHMgdG8gcmVjb3JkCisgICAgLy8vIHN0YXRpc3RpY3MgYmVmb3JlIGNhbGxpbmcgdGhpcyBpbXBsZW1lbnRhdGlvbi4gSGV1cmlzdGljQmFzZSByZWxpZXMgb24KKyAgICAvLy8gaXRzIGJlaGF2aW91ci4KKyAgICB2b2lkIGFkZFRvT3B0aW1hbFJlZHVjZUxpc3QoR3JhcGg6Ok5vZGVJdHIgbkl0cikgeworICAgICAgb3B0aW1hbExpc3QucHVzaF9iYWNrKG5JdHIpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgSW5pdGlhbGlzZSB0aGUgaGV1cmlzdGljLgorICAgIC8vLworICAgIC8vLyBIZXVyaXN0aWNCYXNlIGl0ZXJhdGVzIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBwcm9ibGVtIGFuZCBhZGRzIHRoZW0gdG8KKyAgICAvLy8gdGhlIGFwcHJvcHJpYXRlIGxpc3QgdXNpbmcgYWRkVG9PcHRpbWFsUmVkdWNlTGlzdCBvcgorICAgIC8vLyBhZGRUb0hldXJpc3RpY1JlZHVjZUxpc3QgYmFzZWQgb24gdGhlIHJlc3VsdCBvZiBzaG91bGRPcHRpbWFsbHlSZWR1Y2UuCisgICAgLy8vCisgICAgLy8vIFRoaXMgYmVoYXZpb3VyIHNob3VsZCBiZSBmaW5lIGZvciBtb3N0IHNpdHVhdGlvbnMuCisgICAgdm9pZCBzZXR1cCgpIHsKKyAgICAgIGZvciAoR3JhcGg6Ok5vZGVJdHIgbkl0ciA9IGcubm9kZXNCZWdpbigpLCBuRW5kID0gZy5ub2Rlc0VuZCgpOworICAgICAgICAgICBuSXRyICE9IG5FbmQ7ICsrbkl0cikgeworICAgICAgICBpZiAoaW1wbCgpLnNob3VsZE9wdGltYWxseVJlZHVjZShuSXRyKSkgeworICAgICAgICAgIGFkZFRvT3B0aW1hbFJlZHVjZUxpc3Qobkl0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW1wbCgpLmFkZFRvSGV1cmlzdGljUmVkdWNlTGlzdChuSXRyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vLyBcYnJpZWYgT3B0aW1hbGx5IHJlZHVjZSBvbmUgb2YgdGhlIG5vZGVzIGluIHRoZSBvcHRpbWFsIHJlZHVjZSBsaXN0LgorICAgIC8vLyBAcmV0dXJuIFRydWUgaWYgYSByZWR1Y3Rpb24gdGFrZXMgcGxhY2UsIGZhbHNlIGlmIHRoZSBvcHRpbWFsIHJlZHVjZQorICAgIC8vLyAgICAgICAgIGxpc3QgaXMgZW1wdHkuCisgICAgLy8vCisgICAgLy8vIFNlbGVjdHMgYSBub2RlIGZyb20gdGhlIG9wdGltYWwgcmVkdWNlIGxpc3QgYW5kIHJlbW92ZXMgaXQsIGFwcGx5aW5nCisgICAgLy8vIFIwLCBSMSBvciBSMiBhcyBhcHByb3ByaWF0ZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgbm9kZSdzIGRlZ3JlZS4KKyAgICBib29sIG9wdGltYWxSZWR1Y2UoKSB7CisgICAgICBpZiAob3B0aW1hbExpc3QuZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBHcmFwaDo6Tm9kZUl0ciBuSXRyID0gb3B0aW1hbExpc3QuZnJvbnQoKTsKKyAgICAgIG9wdGltYWxMaXN0LnBvcF9mcm9udCgpOworCisgICAgICBzd2l0Y2ggKHMuZ2V0U29sdmVyRGVncmVlKG5JdHIpKSB7CisgICAgICAgIGNhc2UgMDogcy5hcHBseVIwKG5JdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAxOiBzLmFwcGx5UjEobkl0cik7IGJyZWFrOworICAgICAgICBjYXNlIDI6IHMuYXBwbHlSMihuSXRyKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIk9wdGltYWwgcmVkdWN0aW9ucyBvZiBkZWdyZWUgPiAyIG5vZGVzIGlzIGludmFsaWQuIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUGVyZm9ybSB0aGUgUEJRUCByZWR1Y3Rpb24gcHJvY2Vzcy4KKyAgICAvLy8KKyAgICAvLy8gUmVkdWNlcyB0aGUgcHJvYmxlbSB0byB0aGUgZW1wdHkgZ3JhcGggYnkgcmVwZWF0ZWQgYXBwbGljYXRpb24gb2YgdGhlCisgICAgLy8vIHJlZHVjdGlvbiBydWxlcyBSMCwgUjEsIFIyIGFuZCBSTi4KKyAgICAvLy8gUjAsIFIxIG9yIFIyIGFyZSBhbHdheXMgYXBwbGllZCBpZiBwb3NzaWJsZSBiZWZvcmUgUk4gaXMgdXNlZC4KKyAgICB2b2lkIHJlZHVjZSgpIHsKKyAgICAgIGJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKworICAgICAgd2hpbGUgKCFmaW5pc2hlZCkgeworICAgICAgICBpZiAoIW9wdGltYWxSZWR1Y2UoKSkKKyAgICAgICAgICBpZiAoIWltcGwoKS5oZXVyaXN0aWNSZWR1Y2UoKSkKKyAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEFkZCBhIG5vZGUgdG8gdGhlIGhldXJpc3RpYyByZWR1Y2UgbGlzdC4KKyAgICAvLy8gQHBhcmFtIG5JdHIgTm9kZSBpdGVyYXRvciB0byBhZGQgdG8gdGhlIGhldXJpc3RpYyByZWR1Y2UgbGlzdC4KKyAgICB2b2lkIGFkZFRvSGV1cmlzdGljTGlzdChHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICBhc3NlcnQoZmFsc2UgJiYgIk11c3QgYmUgaW1wbGVtZW50ZWQgaW4gZGVyaXZlZCBjbGFzcy4iKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEhldXJpc3RpY2FsbHkgcmVkdWNlIG9uZSBvZiB0aGUgbm9kZXMgaW4gdGhlIGhldXJpc3RpYworICAgIC8vLyAgICAgICAgcmVkdWNlIGxpc3QuCisgICAgLy8vIEByZXR1cm4gVHJ1ZSBpZiBhIHJlZHVjdGlvbiB0YWtlcyBwbGFjZSwgZmFsc2UgaWYgdGhlIGhldXJpc3RpYyByZWR1Y2UKKyAgICAvLy8gICAgICAgICBsaXN0IGlzIGVtcHR5LgorICAgIHZvaWQgaGV1cmlzdGljUmVkdWNlKCkgeworICAgICAgYXNzZXJ0KGZhbHNlICYmICJNdXN0IGJlIGltcGxlbWVudGVkIGluIGRlcml2ZWQgY2xhc3MuIik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBQcmVwYXJlIGEgY2hhbmdlIGluIHRoZSBjb3N0cyBvbiB0aGUgZ2l2ZW4gZWRnZS4KKyAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4gICAgCisgICAgdm9pZCBwcmVVcGRhdGVFZGdlQ29zdHMoR3JhcGg6OkVkZ2VJdHIgZUl0cikgeworICAgICAgYXNzZXJ0KGZhbHNlICYmICJNdXN0IGJlIGltcGxlbWVudGVkIGluIGRlcml2ZWQgY2xhc3MuIik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBIYW5kbGUgdGhlIGNoYW5nZSBpbiB0aGUgY29zdHMgb24gdGhlIGdpdmVuIGVkZ2UuCisgICAgLy8vIEBwYXJhbSBlSXRyIEVkZ2UgaXRlcmF0b3IuCisgICAgdm9pZCBwb3N0VXBkYXRlRWRnZUNvc3R0cyhHcmFwaDo6RWRnZUl0ciBlSXRyKSB7CisgICAgICBhc3NlcnQoZmFsc2UgJiYgIk11c3QgYmUgaW1wbGVtZW50ZWQgaW4gZGVyaXZlZCBjbGFzcy4iKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgYWRkaXRpb24gb2YgYSBuZXcgZWRnZSBpbnRvIHRoZSBQQlFQIGdyYXBoLgorICAgIC8vLyBAcGFyYW0gZUl0ciBFZGdlIGl0ZXJhdG9yIGZvciB0aGUgYWRkZWQgZWRnZS4KKyAgICB2b2lkIGhhbmRsZUFkZEVkZ2UoR3JhcGg6OkVkZ2VJdHIgZUl0cikgeworICAgICAgYXNzZXJ0KGZhbHNlICYmICJNdXN0IGJlIGltcGxlbWVudGVkIGluIGRlcml2ZWQgY2xhc3MuIik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBIYW5kbGUgZGlzY29ubmVjdGlvbiBvZiBhbiBlZGdlIGZyb20gYSBub2RlLgorICAgIC8vLyBAcGFyYW0gZUl0ciBFZGdlIGl0ZXJhdG9yIGZvciBlZGdlIGJlaW5nIGRpc2Nvbm5lY3RlZC4KKyAgICAvLy8gQHBhcmFtIG5JdHIgTm9kZSBpdGVyYXRvciBmb3IgdGhlIG5vZGUgYmVpbmcgZGlzY29ubmVjdGVkIGZyb20uCisgICAgLy8vCisgICAgLy8vIEVkZ2VzIGFyZSBmcmVxdWVudGx5IHJlbW92ZWQgZHVlIHRvIHRoZSByZW1vdmFsIG9mIGEgbm9kZS4gVGhpcworICAgIC8vLyBtZXRob2QgYWxsb3dzIGZvciB0aGUgZWZmZWN0IHRvIGJlIGNvbXB1dGVkIG9ubHkgZm9yIHRoZSByZW1haW5pbmcKKyAgICAvLy8gbm9kZSBpbiB0aGUgZ3JhcGguCisgICAgdm9pZCBoYW5kbGVSZW1vdmVFZGdlKEdyYXBoOjpFZGdlSXRyIGVJdHIsIEdyYXBoOjpOb2RlSXRyIG5JdHIpIHsKKyAgICAgIGFzc2VydChmYWxzZSAmJiAiTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBkZXJpdmVkIGNsYXNzLiIpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgQ2xlYW4gdXAgYW55IHN0cnVjdHVyZXMgdXNlZCBieSBIZXVyaXN0aWNCYXNlLgorICAgIC8vLworICAgIC8vLyBBdCBwcmVzZW50IHRoaXMganVzdCBwZXJmb3JtcyBhIHNhbml0eSBjaGVjazogdGhhdCB0aGUgb3B0aW1hbCByZWR1Y2UKKyAgICAvLy8gbGlzdCBpcyBlbXB0eSBub3cgdGhhdCByZWR1Y3Rpb24gaGFzIGNvbXBsZXRlZC4KKyAgICAvLy8KKyAgICAvLy8gSWYgeW91ciBkZXJpdmVkIGNsYXNzIGhhcyBtb3JlIGNvbXBsZXggc3RydWN0dXJlcyB3aGljaCBuZWVkIHRlYXJpbmcKKyAgICAvLy8gZG93biB5b3Ugc2hvdWxkIG92ZXItcmlkZSB0aGlzIG1ldGhvZCBidXQgaW5jbHVkZSBhIGNhbGwgYmFjayB0byB0aGlzCisgICAgLy8vIGltcGxlbWVudGF0aW9uLgorICAgIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgIGFzc2VydChvcHRpbWFsTGlzdC5lbXB0eSgpICYmICJOb2RlcyBsZWZ0IG92ZXIgaW4gb3B0aW1hbCByZWR1Y2UgbGlzdD8iKTsKKyAgICB9CisKKyAgfTsKKworfQorCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUEJRUF9IRVVSSVNUSUNCQVNFX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1BCUVAvSGV1cmlzdGljU29sdmVyLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9QQlFQL0hldXJpc3RpY1NvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTM4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9QQlFQL0hldXJpc3RpY1NvbHZlci5oCkBAIC0wLDAgKzEsNjA3IEBACisvLz09PS0tIEhldXJpc3RpY1NvbHZlci5oIC0gSGV1cmlzdGljIFBCUVAgU29sdmVyIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSGV1cmlzdGljIFBCUVAgc29sdmVyLiBUaGlzIHNvbHZlciBpcyBhYmxlIHRvIHBlcmZvcm0gb3B0aW1hbCByZWR1Y3Rpb25zIGZvcgorLy8gbm9kZXMgb2YgZGVncmVlIDAsIDEgb3IgMi4gRm9yIG5vZGVzIG9mIGRlZ3JlZSA+MiBhIHBsdWdhYmxlIGhldXJpc3RpYyBpcworLy8gdXNlZCB0byBzZWxlY3QgYSBub2RlIGZvciByZWR1Y3Rpb24uIAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfSEVVUklTVElDU09MVkVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BCUVBfSEVVUklTVElDU09MVkVSX0gKKworI2luY2x1ZGUgIkdyYXBoLmgiCisjaW5jbHVkZSAiU29sdXRpb24uaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgUEJRUCB7CisKKyAgLy8vIFxicmllZiBIZXVyaXN0aWMgUEJRUCBzb2x2ZXIgaW1wbGVtZW50YXRpb24uCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyBzaG91bGQgdXN1YWxseSBiZSBjcmVhdGVkIChhbmQgZGVzdHJveWVkKSBpbmRpcmVjdGx5IHZpYSBhIGNhbGwKKyAgLy8vIHRvIEhldXJpc3RpY1NvbHZlcjxISW1wbD46OnNvbHZlKEdyYXBoJikuCisgIC8vLyBTZWUgdGhlIGNvbW1lbnRzIGZvciBIZXVyaXN0aWNTb2x2ZXIuCisgIC8vLworICAvLy8gSGV1cmlzdGljU29sdmVySW1wbCBwcm92aWRlcyB0aGUgUjAsIFIxIGFuZCBSMiByZWR1Y3Rpb24gcnVsZXMsCisgIC8vLyBiYWNrcHJvcGFnYXRpb24gcGhhc2UsIGFuZCBtYWludGFpbnMgdGhlIGludGVybmFsIGNvcHkgb2YgdGhlIGdyYXBoIG9uCisgIC8vLyB3aGljaCB0aGUgcmVkdWN0aW9uIGlzIGNhcnJpZWQgb3V0ICh0aGUgb3JpZ2luYWwgYmVpbmcga2VwdCB0byBmYWNpbGl0YXRlCisgIC8vLyBiYWNrcHJvcGFnYXRpb24pLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSEltcGw+CisgIGNsYXNzIEhldXJpc3RpY1NvbHZlckltcGwgeworICBwcml2YXRlOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBISW1wbDo6Tm9kZURhdGEgSGV1cmlzdGljTm9kZURhdGE7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBISW1wbDo6RWRnZURhdGEgSGV1cmlzdGljRWRnZURhdGE7CisKKyAgICB0eXBlZGVmIHN0ZDo6bGlzdDxHcmFwaDo6RWRnZUl0cj4gU29sdmVyRWRnZXM7CisKKyAgcHVibGljOgorICAKKyAgICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHR5cGUgZm9yIGVkZ2VzIGluIHRoZSBzb2x2ZXIgZ3JhcGguCisgICAgdHlwZWRlZiBTb2x2ZXJFZGdlczo6aXRlcmF0b3IgU29sdmVyRWRnZUl0cjsKKworICBwcml2YXRlOgorCisgICAgY2xhc3MgTm9kZURhdGEgeworICAgIHB1YmxpYzoKKyAgICAgIE5vZGVEYXRhKCkgOiBzb2x2ZXJEZWdyZWUoMCkge30KKworICAgICAgSGV1cmlzdGljTm9kZURhdGEmIGdldEhldXJpc3RpY0RhdGEoKSB7IHJldHVybiBoRGF0YTsgfQorCisgICAgICBTb2x2ZXJFZGdlSXRyIGFkZFNvbHZlckVkZ2UoR3JhcGg6OkVkZ2VJdHIgZUl0cikgeworICAgICAgICArK3NvbHZlckRlZ3JlZTsKKyAgICAgICAgcmV0dXJuIHNvbHZlckVkZ2VzLmluc2VydChzb2x2ZXJFZGdlcy5lbmQoKSwgZUl0cik7CisgICAgICB9CisKKyAgICAgIHZvaWQgcmVtb3ZlU29sdmVyRWRnZShTb2x2ZXJFZGdlSXRyIHNlSXRyKSB7CisgICAgICAgIC0tc29sdmVyRGVncmVlOworICAgICAgICBzb2x2ZXJFZGdlcy5lcmFzZShzZUl0cik7CisgICAgICB9CisKKyAgICAgIFNvbHZlckVkZ2VJdHIgc29sdmVyRWRnZXNCZWdpbigpIHsgcmV0dXJuIHNvbHZlckVkZ2VzLmJlZ2luKCk7IH0KKyAgICAgIFNvbHZlckVkZ2VJdHIgc29sdmVyRWRnZXNFbmQoKSB7IHJldHVybiBzb2x2ZXJFZGdlcy5lbmQoKTsgfQorICAgICAgdW5zaWduZWQgZ2V0U29sdmVyRGVncmVlKCkgY29uc3QgeyByZXR1cm4gc29sdmVyRGVncmVlOyB9CisgICAgICB2b2lkIGNsZWFyU29sdmVyRWRnZXMoKSB7CisgICAgICAgIHNvbHZlckRlZ3JlZSA9IDA7CisgICAgICAgIHNvbHZlckVkZ2VzLmNsZWFyKCk7IAorICAgICAgfQorICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIEhldXJpc3RpY05vZGVEYXRhIGhEYXRhOworICAgICAgdW5zaWduZWQgc29sdmVyRGVncmVlOworICAgICAgU29sdmVyRWRnZXMgc29sdmVyRWRnZXM7CisgICAgfTsKKyAKKyAgICBjbGFzcyBFZGdlRGF0YSB7CisgICAgcHVibGljOgorICAgICAgSGV1cmlzdGljRWRnZURhdGEmIGdldEhldXJpc3RpY0RhdGEoKSB7IHJldHVybiBoRGF0YTsgfQorCisgICAgICB2b2lkIHNldE4xU29sdmVyRWRnZUl0cihTb2x2ZXJFZGdlSXRyIG4xU29sdmVyRWRnZUl0cikgeworICAgICAgICB0aGlzLT5uMVNvbHZlckVkZ2VJdHIgPSBuMVNvbHZlckVkZ2VJdHI7CisgICAgICB9CisKKyAgICAgIFNvbHZlckVkZ2VJdHIgZ2V0TjFTb2x2ZXJFZGdlSXRyKCkgeyByZXR1cm4gbjFTb2x2ZXJFZGdlSXRyOyB9CisKKyAgICAgIHZvaWQgc2V0TjJTb2x2ZXJFZGdlSXRyKFNvbHZlckVkZ2VJdHIgbjJTb2x2ZXJFZGdlSXRyKXsKKyAgICAgICAgdGhpcy0+bjJTb2x2ZXJFZGdlSXRyID0gbjJTb2x2ZXJFZGdlSXRyOworICAgICAgfQorCisgICAgICBTb2x2ZXJFZGdlSXRyIGdldE4yU29sdmVyRWRnZUl0cigpIHsgcmV0dXJuIG4yU29sdmVyRWRnZUl0cjsgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgSGV1cmlzdGljRWRnZURhdGEgaERhdGE7CisgICAgICBTb2x2ZXJFZGdlSXRyIG4xU29sdmVyRWRnZUl0ciwgbjJTb2x2ZXJFZGdlSXRyOworICAgIH07CisKKyAgICBHcmFwaCAmZzsKKyAgICBISW1wbCBoOworICAgIFNvbHV0aW9uIHM7CisgICAgc3RkOjp2ZWN0b3I8R3JhcGg6Ok5vZGVJdHI+IHN0YWNrOworCisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8Tm9kZURhdGE+IE5vZGVEYXRhTGlzdDsKKyAgICBOb2RlRGF0YUxpc3Qgbm9kZURhdGFMaXN0OworCisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8RWRnZURhdGE+IEVkZ2VEYXRhTGlzdDsKKyAgICBFZGdlRGF0YUxpc3QgZWRnZURhdGFMaXN0OworCisgIHB1YmxpYzoKKworICAgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgaGV1cmlzdGljIHNvbHZlciBpbXBsZW1lbnRhdGlvbiB0byBzb2x2ZSB0aGUgZ2l2ZW4KKyAgICAvLy8gICAgICAgIGdyYXBoLgorICAgIC8vLyBAcGFyYW0gZyBUaGUgZ3JhcGggcmVwcmVzZW50aW5nIHRoZSBwcm9ibGVtIGluc3RhbmNlIHRvIGJlIHNvbHZlZC4KKyAgICBIZXVyaXN0aWNTb2x2ZXJJbXBsKEdyYXBoICZnKSA6IGcoZyksIGgoKnRoaXMpIHt9ICAKKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBncmFwaCBiZWluZyBzb2x2ZWQgYnkgdGhpcyBzb2x2ZXIuCisgICAgLy8vIEByZXR1cm4gVGhlIGdyYXBoIHJlcHJlc2VudGluZyB0aGUgcHJvYmxlbSBpbnN0YW5jZSBiZWluZyBzb2x2ZWQgYnkgdGhpcworICAgIC8vLyAgICAgICAgIHNvbHZlci4KKyAgICBHcmFwaCYgZ2V0R3JhcGgoKSB7IHJldHVybiBnOyB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgaGV1cmlzdGljIGRhdGEgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIG5vZGUuCisgICAgLy8vIEBwYXJhbSBuSXRyIE5vZGUgaXRlcmF0b3IuCisgICAgLy8vIEByZXR1cm4gVGhlIGhldXJpc3RpYyBkYXRhIGF0dGFjaGVkIHRvIHRoZSBnaXZlbiBub2RlLgorICAgIEhldXJpc3RpY05vZGVEYXRhJiBnZXRIZXVyaXN0aWNOb2RlRGF0YShHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICByZXR1cm4gZ2V0U29sdmVyTm9kZURhdGEobkl0cikuZ2V0SGV1cmlzdGljRGF0YSgpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBoZXVyaXN0aWMgZGF0YSBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gZWRnZS4KKyAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4KKyAgICAvLy8gQHJldHVybiBUaGUgaGV1cmlzdGljIGRhdGEgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIG5vZGUuCisgICAgSGV1cmlzdGljRWRnZURhdGEmIGdldEhldXJpc3RpY0VkZ2VEYXRhKEdyYXBoOjpFZGdlSXRyIGVJdHIpIHsKKyAgICAgIHJldHVybiBnZXRTb2x2ZXJFZGdlRGF0YShlSXRyKS5nZXRIZXVyaXN0aWNEYXRhKCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBCZWdpbiBpdGVyYXRvciBmb3IgdGhlIHNldCBvZiBlZGdlcyBhZGphY2VudCB0byB0aGUgZ2l2ZW4gbm9kZSBpbgorICAgIC8vLyAgICAgICAgdGhlIHNvbHZlciBncmFwaC4KKyAgICAvLy8gQHBhcmFtIG5JdHIgTm9kZSBpdGVyYXRvci4KKyAgICAvLy8gQHJldHVybiBCZWdpbiBpdGVyYXRvciBmb3IgdGhlIHNldCBvZiBlZGdlcyBhZGphY2VudCB0byB0aGUgZ2l2ZW4gbm9kZQorICAgIC8vLyAgICAgICAgIGluIHRoZSBzb2x2ZXIgZ3JhcGguIAorICAgIFNvbHZlckVkZ2VJdHIgc29sdmVyRWRnZXNCZWdpbihHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICByZXR1cm4gZ2V0U29sdmVyTm9kZURhdGEobkl0cikuc29sdmVyRWRnZXNCZWdpbigpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRW5kIGl0ZXJhdG9yIGZvciB0aGUgc2V0IG9mIGVkZ2VzIGFkamFjZW50IHRvIHRoZSBnaXZlbiBub2RlIGluCisgICAgLy8vICAgICAgICB0aGUgc29sdmVyIGdyYXBoLgorICAgIC8vLyBAcGFyYW0gbkl0ciBOb2RlIGl0ZXJhdG9yLgorICAgIC8vLyBAcmV0dXJuIEVuZCBpdGVyYXRvciBmb3IgdGhlIHNldCBvZiBlZGdlcyBhZGphY2VudCB0byB0aGUgZ2l2ZW4gbm9kZSBpbgorICAgIC8vLyAgICAgICAgIHRoZSBzb2x2ZXIgZ3JhcGguIAorICAgIFNvbHZlckVkZ2VJdHIgc29sdmVyRWRnZXNFbmQoR3JhcGg6Ok5vZGVJdHIgbkl0cikgeworICAgICAgcmV0dXJuIGdldFNvbHZlck5vZGVEYXRhKG5JdHIpLnNvbHZlckVkZ2VzRW5kKCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZW1vdmUgYSBub2RlIGZyb20gdGhlIHNvbHZlciBncmFwaC4KKyAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvciBmb3IgZWRnZSB0byBiZSByZW1vdmVkLgorICAgIC8vLworICAgIC8vLyBEb2VzIDxpPm5vdDwvaT4gbm90aWZ5IHRoZSBoZXVyaXN0aWMgb2YgdGhlIHJlbW92YWwuIFRoYXQgc2hvdWxkIGJlCisgICAgLy8vIGRvbmUgbWFudWFsbHkgaWYgbmVjZXNzYXJ5LgorICAgIHZvaWQgcmVtb3ZlU29sdmVyRWRnZShHcmFwaDo6RWRnZUl0ciBlSXRyKSB7CisgICAgICBFZGdlRGF0YSAmZURhdGEgPSBnZXRTb2x2ZXJFZGdlRGF0YShlSXRyKTsKKyAgICAgIE5vZGVEYXRhICZuMURhdGEgPSBnZXRTb2x2ZXJOb2RlRGF0YShnLmdldEVkZ2VOb2RlMShlSXRyKSksCisgICAgICAgICAgICAgICAmbjJEYXRhID0gZ2V0U29sdmVyTm9kZURhdGEoZy5nZXRFZGdlTm9kZTIoZUl0cikpOworCisgICAgICBuMURhdGEucmVtb3ZlU29sdmVyRWRnZShlRGF0YS5nZXROMVNvbHZlckVkZ2VJdHIoKSk7CisgICAgICBuMkRhdGEucmVtb3ZlU29sdmVyRWRnZShlRGF0YS5nZXROMlNvbHZlckVkZ2VJdHIoKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBDb21wdXRlIGEgc29sdXRpb24gdG8gdGhlIFBCUVAgcHJvYmxlbSBpbnN0YW5jZSB3aXRoIHdoaWNoIHRoaXMKKyAgICAvLy8gICAgICAgIGhldXJpc3RpYyBzb2x2ZXIgd2FzIGNvbnN0cnVjdGVkLgorICAgIC8vLyBAcmV0dXJuIEEgc29sdXRpb24gdG8gdGhlIFBCUVAgcHJvYmxlbS4KKyAgICAvLy8KKyAgICAvLy8gUGVyZm9ybXMgdGhlIGZ1bGwgUEJRUCBoZXVyaXN0aWMgc29sdmVyIGFsZ29yaXRobSwgaW5jbHVkaW5nIHNldHVwLAorICAgIC8vLyBjYWxscyB0byB0aGUgaGV1cmlzdGljICh3aGljaCB3aWxsIGNhbGwgYmFjayB0byB0aGUgcmVkdWN0aW9uIHJ1bGVzIGluCisgICAgLy8vIHRoaXMgY2xhc3MpLCBhbmQgY2xlYW51cC4KKyAgICBTb2x1dGlvbiBjb21wdXRlU29sdXRpb24oKSB7CisgICAgICBzZXR1cCgpOworICAgICAgaC5zZXR1cCgpOworICAgICAgaC5yZWR1Y2UoKTsKKyAgICAgIGJhY2twcm9wYWdhdGUoKTsKKyAgICAgIGguY2xlYW51cCgpOworICAgICAgY2xlYW51cCgpOworICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgLy8vIFxicmllZiBBZGQgdG8gdGhlIGVuZCBvZiB0aGUgc3RhY2suCisgICAgLy8vIEBwYXJhbSBuSXRyIE5vZGUgaXRlcmF0b3IgdG8gYWRkIHRvIHRoZSByZWR1Y3Rpb24gc3RhY2suCisgICAgdm9pZCBwdXNoVG9TdGFjayhHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICBnZXRTb2x2ZXJOb2RlRGF0YShuSXRyKS5jbGVhclNvbHZlckVkZ2VzKCk7CisgICAgICBzdGFjay5wdXNoX2JhY2sobkl0cik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzb2x2ZXIgZGVncmVlIG9mIHRoZSBnaXZlbiBub2RlLgorICAgIC8vLyBAcGFyYW0gbkl0ciBOb2RlIGl0ZXJhdG9yIGZvciB3aGljaCBkZWdyZWUgaXMgcmVxdWVzdGVkLgorICAgIC8vLyBAcmV0dXJuIE5vZGUgZGVncmVlIGluIHRoZSA8aT5zb2x2ZXI8L2k+IGdyYXBoIChub3QgdGhlIG9yaWdpbmFsIGdyYXBoKS4KKyAgICB1bnNpZ25lZCBnZXRTb2x2ZXJEZWdyZWUoR3JhcGg6Ok5vZGVJdHIgbkl0cikgeworICAgICAgcmV0dXJuICBnZXRTb2x2ZXJOb2RlRGF0YShuSXRyKS5nZXRTb2x2ZXJEZWdyZWUoKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFNldCB0aGUgc29sdXRpb24gb2YgdGhlIGdpdmVuIG5vZGUuCisgICAgLy8vIEBwYXJhbSBuSXRyIE5vZGUgaXRlcmF0b3IgdG8gc2V0IHNvbHV0aW9uIGZvci4KKyAgICAvLy8gQHBhcmFtIHNlbGVjdGlvbiBTZWxlY3Rpb24gZm9yIG5vZGUuCisgICAgdm9pZCBzZXRTb2x1dGlvbihjb25zdCBHcmFwaDo6Tm9kZUl0ciAmbkl0ciwgdW5zaWduZWQgc2VsZWN0aW9uKSB7CisgICAgICBzLnNldFNlbGVjdGlvbihuSXRyLCBzZWxlY3Rpb24pOworCisgICAgICBmb3IgKEdyYXBoOjpBZGpFZGdlSXRyIGFlSXRyID0gZy5hZGpFZGdlc0JlZ2luKG5JdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZUVuZCA9IGcuYWRqRWRnZXNFbmQobkl0cik7CisgICAgICAgICAgIGFlSXRyICE9IGFlRW5kOyArK2FlSXRyKSB7CisgICAgICAgIEdyYXBoOjpFZGdlSXRyIGVJdHIoKmFlSXRyKTsKKyAgICAgICAgR3JhcGg6Ok5vZGVJdHIgYW5JdHIoZy5nZXRFZGdlT3RoZXJOb2RlKGVJdHIsIG5JdHIpKTsKKyAgICAgICAgZ2V0U29sdmVyTm9kZURhdGEoYW5JdHIpLmFkZFNvbHZlckVkZ2UoZUl0cik7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIFxicmllZiBBcHBseSBydWxlIFIwLgorICAgIC8vLyBAcGFyYW0gbkl0ciBOb2RlIGl0ZXJhdG9yIGZvciBub2RlIHRvIGFwcGx5IFIwIHRvLgorICAgIC8vLworICAgIC8vLyBOb2RlIHdpbGwgYmUgYXV0b21hdGljYWxseSBwdXNoZWQgdG8gdGhlIHNvbHZlciBzdGFjay4KKyAgICB2b2lkIGFwcGx5UjAoR3JhcGg6Ok5vZGVJdHIgbkl0cikgeworICAgICAgYXNzZXJ0KGdldFNvbHZlck5vZGVEYXRhKG5JdHIpLmdldFNvbHZlckRlZ3JlZSgpID09IDAgJiYKKyAgICAgICAgICAgICAiUjAgYXBwbGllZCB0byBub2RlIHdpdGggZGVncmVlICE9IDAuIik7CisKKyAgICAgIC8vIE5vdGhpbmcgdG8gZG8uIEp1c3QgcHVzaCB0aGUgbm9kZSBvbnRvIHRoZSByZWR1Y3Rpb24gc3RhY2suCisgICAgICBwdXNoVG9TdGFjayhuSXRyKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEFwcGx5IHJ1bGUgUjEuCisgICAgLy8vIEBwYXJhbSB4bkl0ciBOb2RlIGl0ZXJhdG9yIGZvciBub2RlIHRvIGFwcGx5IFIxIHRvLgorICAgIC8vLworICAgIC8vLyBOb2RlIHdpbGwgYmUgYXV0b21hdGljYWxseSBwdXNoZWQgdG8gdGhlIHNvbHZlciBzdGFjay4KKyAgICB2b2lkIGFwcGx5UjEoR3JhcGg6Ok5vZGVJdHIgeG5JdHIpIHsKKyAgICAgIE5vZGVEYXRhICZuZCA9IGdldFNvbHZlck5vZGVEYXRhKHhuSXRyKTsKKyAgICAgIGFzc2VydChuZC5nZXRTb2x2ZXJEZWdyZWUoKSA9PSAxICYmCisgICAgICAgICAgICAgIlIxIGFwcGxpZWQgdG8gbm9kZSB3aXRoIGRlZ3JlZSAhPSAxLiIpOworCisgICAgICBHcmFwaDo6RWRnZUl0ciBlSXRyID0gKm5kLnNvbHZlckVkZ2VzQmVnaW4oKTsKKworICAgICAgY29uc3QgTWF0cml4ICZlQ29zdHMgPSBnLmdldEVkZ2VDb3N0cyhlSXRyKTsKKyAgICAgIGNvbnN0IFZlY3RvciAmeENvc3RzID0gZy5nZXROb2RlQ29zdHMoeG5JdHIpOworICAgICAgCisgICAgICAvLyBEdXBsaWNhdGUgYSBsaXR0bGUgdG8gYXZvaWQgdHJhbnNwb3NpbmcgbWF0cmljZXMuCisgICAgICBpZiAoeG5JdHIgPT0gZy5nZXRFZGdlTm9kZTEoZUl0cikpIHsKKyAgICAgICAgR3JhcGg6Ok5vZGVJdHIgeW5JdHIgPSBnLmdldEVkZ2VOb2RlMihlSXRyKTsKKyAgICAgICAgVmVjdG9yICZ5Q29zdHMgPSBnLmdldE5vZGVDb3N0cyh5bkl0cik7CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB5Q29zdHMuZ2V0TGVuZ3RoKCk7ICsraikgeworICAgICAgICAgIFBCUVBOdW0gbWluID0gZUNvc3RzWzBdW2pdICsgeENvc3RzWzBdOworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCB4Q29zdHMuZ2V0TGVuZ3RoKCk7ICsraSkgeworICAgICAgICAgICAgUEJRUE51bSBjID0gZUNvc3RzW2ldW2pdICsgeENvc3RzW2ldOworICAgICAgICAgICAgaWYgKGMgPCBtaW4pCisgICAgICAgICAgICAgIG1pbiA9IGM7CisgICAgICAgICAgfQorICAgICAgICAgIHlDb3N0c1tqXSArPSBtaW47CisgICAgICAgIH0KKyAgICAgICAgaC5oYW5kbGVSZW1vdmVFZGdlKGVJdHIsIHluSXRyKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgR3JhcGg6Ok5vZGVJdHIgeW5JdHIgPSBnLmdldEVkZ2VOb2RlMShlSXRyKTsKKyAgICAgICAgVmVjdG9yICZ5Q29zdHMgPSBnLmdldE5vZGVDb3N0cyh5bkl0cik7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB5Q29zdHMuZ2V0TGVuZ3RoKCk7ICsraSkgeworICAgICAgICAgIFBCUVBOdW0gbWluID0gZUNvc3RzW2ldWzBdICsgeENvc3RzWzBdOworICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDE7IGogPCB4Q29zdHMuZ2V0TGVuZ3RoKCk7ICsraikgeworICAgICAgICAgICAgUEJRUE51bSBjID0gZUNvc3RzW2ldW2pdICsgeENvc3RzW2pdOworICAgICAgICAgICAgaWYgKGMgPCBtaW4pCisgICAgICAgICAgICAgIG1pbiA9IGM7CisgICAgICAgICAgfQorICAgICAgICAgIHlDb3N0c1tpXSArPSBtaW47CisgICAgICAgIH0KKyAgICAgICAgaC5oYW5kbGVSZW1vdmVFZGdlKGVJdHIsIHluSXRyKTsKKyAgICAgIH0KKyAgICAgIHJlbW92ZVNvbHZlckVkZ2UoZUl0cik7CisgICAgICBhc3NlcnQobmQuZ2V0U29sdmVyRGVncmVlKCkgPT0gMCAmJgorICAgICAgICAgICAgICJEZWdyZWUgMSB3aXRoIGVkZ2UgcmVtb3ZlZCBzaG91bGQgYmUgMC4iKTsKKyAgICAgIHB1c2hUb1N0YWNrKHhuSXRyKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEFwcGx5IHJ1bGUgUjIuCisgICAgLy8vIEBwYXJhbSB4bkl0ciBOb2RlIGl0ZXJhdG9yIGZvciBub2RlIHRvIGFwcGx5IFIyIHRvLgorICAgIC8vLworICAgIC8vLyBOb2RlIHdpbGwgYmUgYXV0b21hdGljYWxseSBwdXNoZWQgdG8gdGhlIHNvbHZlciBzdGFjay4KKyAgICB2b2lkIGFwcGx5UjIoR3JhcGg6Ok5vZGVJdHIgeG5JdHIpIHsKKyAgICAgIGFzc2VydChnZXRTb2x2ZXJOb2RlRGF0YSh4bkl0cikuZ2V0U29sdmVyRGVncmVlKCkgPT0gMiAmJgorICAgICAgICAgICAgICJSMiBhcHBsaWVkIHRvIG5vZGUgd2l0aCBkZWdyZWUgIT0gMi4iKTsKKworICAgICAgTm9kZURhdGEgJm5kID0gZ2V0U29sdmVyTm9kZURhdGEoeG5JdHIpOworICAgICAgY29uc3QgVmVjdG9yICZ4Q29zdHMgPSBnLmdldE5vZGVDb3N0cyh4bkl0cik7CisKKyAgICAgIFNvbHZlckVkZ2VJdHIgYWVJdHIgPSBuZC5zb2x2ZXJFZGdlc0JlZ2luKCk7CisgICAgICBHcmFwaDo6RWRnZUl0ciB5eGVJdHIgPSAqYWVJdHIsCisgICAgICAgICAgICAgICAgICAgICB6eGVJdHIgPSAqKCsrYWVJdHIpOworCisgICAgICBHcmFwaDo6Tm9kZUl0ciB5bkl0ciA9IGcuZ2V0RWRnZU90aGVyTm9kZSh5eGVJdHIsIHhuSXRyKSwKKyAgICAgICAgICAgICAgICAgICAgIHpuSXRyID0gZy5nZXRFZGdlT3RoZXJOb2RlKHp4ZUl0ciwgeG5JdHIpOworCisgICAgICBib29sIGZsaXBFZGdlMSA9IChnLmdldEVkZ2VOb2RlMSh5eGVJdHIpID09IHhuSXRyKSwKKyAgICAgICAgICAgZmxpcEVkZ2UyID0gKGcuZ2V0RWRnZU5vZGUxKHp4ZUl0cikgPT0geG5JdHIpOworCisgICAgICBjb25zdCBNYXRyaXggKnl4ZUNvc3RzID0gZmxpcEVkZ2UxID8KKyAgICAgICAgbmV3IE1hdHJpeChnLmdldEVkZ2VDb3N0cyh5eGVJdHIpLnRyYW5zcG9zZSgpKSA6CisgICAgICAgICZnLmdldEVkZ2VDb3N0cyh5eGVJdHIpOworCisgICAgICBjb25zdCBNYXRyaXggKnp4ZUNvc3RzID0gZmxpcEVkZ2UyID8KKyAgICAgICAgbmV3IE1hdHJpeChnLmdldEVkZ2VDb3N0cyh6eGVJdHIpLnRyYW5zcG9zZSgpKSA6CisgICAgICAgICZnLmdldEVkZ2VDb3N0cyh6eGVJdHIpOworCisgICAgICB1bnNpZ25lZCB4TGVuID0geENvc3RzLmdldExlbmd0aCgpLAorICAgICAgICAgICAgICAgeUxlbiA9IHl4ZUNvc3RzLT5nZXRSb3dzKCksCisgICAgICAgICAgICAgICB6TGVuID0genhlQ29zdHMtPmdldFJvd3MoKTsKKyAgICAgICAgICAgICAgIAorICAgICAgTWF0cml4IGRlbHRhKHlMZW4sIHpMZW4pOworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgeUxlbjsgKytpKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB6TGVuOyArK2opIHsKKyAgICAgICAgICBQQlFQTnVtIG1pbiA9ICgqeXhlQ29zdHMpW2ldWzBdICsgKCp6eGVDb3N0cylbal1bMF0gKyB4Q29zdHNbMF07CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBrID0gMTsgayA8IHhMZW47ICsraykgeworICAgICAgICAgICAgUEJRUE51bSBjID0gKCp5eGVDb3N0cylbaV1ba10gKyAoKnp4ZUNvc3RzKVtqXVtrXSArIHhDb3N0c1trXTsKKyAgICAgICAgICAgIGlmIChjIDwgbWluKSB7CisgICAgICAgICAgICAgIG1pbiA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGRlbHRhW2ldW2pdID0gbWluOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmbGlwRWRnZTEpCisgICAgICAgIGRlbGV0ZSB5eGVDb3N0czsKKworICAgICAgaWYgKGZsaXBFZGdlMikKKyAgICAgICAgZGVsZXRlIHp4ZUNvc3RzOworCisgICAgICBHcmFwaDo6RWRnZUl0ciB5emVJdHIgPSBnLmZpbmRFZGdlKHluSXRyLCB6bkl0cik7CisgICAgICBib29sIGFkZGVkRWRnZSA9IGZhbHNlOworCisgICAgICBpZiAoeXplSXRyID09IGcuZWRnZXNFbmQoKSkgeworICAgICAgICB5emVJdHIgPSBnLmFkZEVkZ2UoeW5JdHIsIHpuSXRyLCBkZWx0YSk7CisgICAgICAgIGFkZGVkRWRnZSA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBNYXRyaXggJnl6ZUNvc3RzID0gZy5nZXRFZGdlQ29zdHMoeXplSXRyKTsKKyAgICAgICAgaC5wcmVVcGRhdGVFZGdlQ29zdHMoeXplSXRyKTsKKyAgICAgICAgaWYgKHluSXRyID09IGcuZ2V0RWRnZU5vZGUxKHl6ZUl0cikpIHsKKyAgICAgICAgICB5emVDb3N0cyArPSBkZWx0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB5emVDb3N0cyArPSBkZWx0YS50cmFuc3Bvc2UoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBib29sIG51bGxDb3N0RWRnZSA9IHRyeU5vcm1hbGlzZUVkZ2VNYXRyaXgoeXplSXRyKTsKKworICAgICAgaWYgKCFhZGRlZEVkZ2UpIHsKKyAgICAgICAgLy8gSWYgd2UgbW9kaWZpZWQgdGhlIGVkZ2UgY29zdHMgbGV0IHRoZSBoZXVyaXN0aWMga25vdy4KKyAgICAgICAgaC5wb3N0VXBkYXRlRWRnZUNvc3RzKHl6ZUl0cik7CisgICAgICB9CisgCisgICAgICBpZiAobnVsbENvc3RFZGdlKSB7CisgICAgICAgIC8vIElmIHRoaXMgZWRnZSBlbmRlZCB1cCBudWxsIHJlbW92ZSBpdC4KKyAgICAgICAgaWYgKCFhZGRlZEVkZ2UpIHsKKyAgICAgICAgICAvLyBXZSBkaWRuJ3QganVzdCBhZGQgaXQsIHNvIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSBoZXVyaXN0aWMKKyAgICAgICAgICAvLyBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHNvbHZlci4KKyAgICAgICAgICBoLmhhbmRsZVJlbW92ZUVkZ2UoeXplSXRyLCB5bkl0cik7CisgICAgICAgICAgaC5oYW5kbGVSZW1vdmVFZGdlKHl6ZUl0ciwgem5JdHIpOworICAgICAgICAgIHJlbW92ZVNvbHZlckVkZ2UoeXplSXRyKTsKKyAgICAgICAgfQorICAgICAgICBnLnJlbW92ZUVkZ2UoeXplSXRyKTsKKyAgICAgIH0gZWxzZSBpZiAoYWRkZWRFZGdlKSB7CisgICAgICAgIC8vIElmIHRoZSBlZGdlIHdhcyBhZGRlZCwgYW5kIG5vbi1udWxsLCBmaW5pc2ggc2V0dGluZyBpdCB1cCwgYWRkIGl0IHRvCisgICAgICAgIC8vIHRoZSBzb2x2ZXIgJiBub3RpZnkgaGV1cmlzdGljLgorICAgICAgICBlZGdlRGF0YUxpc3QucHVzaF9iYWNrKEVkZ2VEYXRhKCkpOworICAgICAgICBnLnNldEVkZ2VEYXRhKHl6ZUl0ciwgJmVkZ2VEYXRhTGlzdC5iYWNrKCkpOworICAgICAgICBhZGRTb2x2ZXJFZGdlKHl6ZUl0cik7CisgICAgICAgIGguaGFuZGxlQWRkRWRnZSh5emVJdHIpOworICAgICAgfQorCisgICAgICBoLmhhbmRsZVJlbW92ZUVkZ2UoeXhlSXRyLCB5bkl0cik7CisgICAgICByZW1vdmVTb2x2ZXJFZGdlKHl4ZUl0cik7CisgICAgICBoLmhhbmRsZVJlbW92ZUVkZ2UoenhlSXRyLCB6bkl0cik7CisgICAgICByZW1vdmVTb2x2ZXJFZGdlKHp4ZUl0cik7CisKKyAgICAgIHB1c2hUb1N0YWNrKHhuSXRyKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKworICAgIE5vZGVEYXRhJiBnZXRTb2x2ZXJOb2RlRGF0YShHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PE5vZGVEYXRhKj4oZy5nZXROb2RlRGF0YShuSXRyKSk7CisgICAgfQorCisgICAgRWRnZURhdGEmIGdldFNvbHZlckVkZ2VEYXRhKEdyYXBoOjpFZGdlSXRyIGVJdHIpIHsKKyAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8RWRnZURhdGEqPihnLmdldEVkZ2VEYXRhKGVJdHIpKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFNvbHZlckVkZ2UoR3JhcGg6OkVkZ2VJdHIgZUl0cikgeworICAgICAgRWRnZURhdGEgJmVEYXRhID0gZ2V0U29sdmVyRWRnZURhdGEoZUl0cik7CisgICAgICBOb2RlRGF0YSAmbjFEYXRhID0gZ2V0U29sdmVyTm9kZURhdGEoZy5nZXRFZGdlTm9kZTEoZUl0cikpLAorICAgICAgICAgICAgICAgJm4yRGF0YSA9IGdldFNvbHZlck5vZGVEYXRhKGcuZ2V0RWRnZU5vZGUyKGVJdHIpKTsKKworICAgICAgZURhdGEuc2V0TjFTb2x2ZXJFZGdlSXRyKG4xRGF0YS5hZGRTb2x2ZXJFZGdlKGVJdHIpKTsKKyAgICAgIGVEYXRhLnNldE4yU29sdmVyRWRnZUl0cihuMkRhdGEuYWRkU29sdmVyRWRnZShlSXRyKSk7CisgICAgfQorCisgICAgdm9pZCBzZXR1cCgpIHsKKyAgICAgIGlmIChoLnNvbHZlclJ1blNpbXBsaWZ5KCkpIHsKKyAgICAgICAgc2ltcGxpZnkoKTsKKyAgICAgIH0KKworICAgICAgLy8gQ3JlYXRlIG5vZGUgZGF0YSBvYmplY3RzLgorICAgICAgZm9yIChHcmFwaDo6Tm9kZUl0ciBuSXRyID0gZy5ub2Rlc0JlZ2luKCksIG5FbmQgPSBnLm5vZGVzRW5kKCk7CisgICAgICAgICAgIG5JdHIgIT0gbkVuZDsgKytuSXRyKSB7CisgICAgICAgIG5vZGVEYXRhTGlzdC5wdXNoX2JhY2soTm9kZURhdGEoKSk7CisgICAgICAgIGcuc2V0Tm9kZURhdGEobkl0ciwgJm5vZGVEYXRhTGlzdC5iYWNrKCkpOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgZWRnZSBkYXRhIG9iamVjdHMuCisgICAgICBmb3IgKEdyYXBoOjpFZGdlSXRyIGVJdHIgPSBnLmVkZ2VzQmVnaW4oKSwgZUVuZCA9IGcuZWRnZXNFbmQoKTsKKyAgICAgICAgICAgZUl0ciAhPSBlRW5kOyArK2VJdHIpIHsKKyAgICAgICAgZWRnZURhdGFMaXN0LnB1c2hfYmFjayhFZGdlRGF0YSgpKTsKKyAgICAgICAgZy5zZXRFZGdlRGF0YShlSXRyLCAmZWRnZURhdGFMaXN0LmJhY2soKSk7CisgICAgICAgIGFkZFNvbHZlckVkZ2UoZUl0cik7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzaW1wbGlmeSgpIHsKKyAgICAgIGRpc2Nvbm5lY3RUcml2aWFsTm9kZXMoKTsKKyAgICAgIGVsaW1pbmF0ZUluZGVwZW5kZW50RWRnZXMoKTsKKyAgICB9CisKKyAgICAvLyBFbGltaW5hdGUgdHJpdmlhbCBub2Rlcy4KKyAgICB2b2lkIGRpc2Nvbm5lY3RUcml2aWFsTm9kZXMoKSB7CisgICAgICB1bnNpZ25lZCBudW1EaXNjb25uZWN0ZWQgPSAwOworCisgICAgICBmb3IgKEdyYXBoOjpOb2RlSXRyIG5JdHIgPSBnLm5vZGVzQmVnaW4oKSwgbkVuZCA9IGcubm9kZXNFbmQoKTsKKyAgICAgICAgICAgbkl0ciAhPSBuRW5kOyArK25JdHIpIHsKKworICAgICAgICBpZiAoZy5nZXROb2RlQ29zdHMobkl0cikuZ2V0TGVuZ3RoKCkgPT0gMSkgeworCisgICAgICAgICAgc3RkOjp2ZWN0b3I8R3JhcGg6OkVkZ2VJdHI+IGVkZ2VzVG9SZW1vdmU7CisKKyAgICAgICAgICBmb3IgKEdyYXBoOjpBZGpFZGdlSXRyIGFlSXRyID0gZy5hZGpFZGdlc0JlZ2luKG5JdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVFbmQgPSBnLmFkakVkZ2VzRW5kKG5JdHIpOworICAgICAgICAgICAgICAgYWVJdHIgIT0gYWVFbmQ7ICsrYWVJdHIpIHsKKworICAgICAgICAgICAgR3JhcGg6OkVkZ2VJdHIgZUl0ciA9ICphZUl0cjsKKworICAgICAgICAgICAgaWYgKGcuZ2V0RWRnZU5vZGUxKGVJdHIpID09IG5JdHIpIHsKKyAgICAgICAgICAgICAgR3JhcGg6Ok5vZGVJdHIgb3RoZXJOb2RlSXRyID0gZy5nZXRFZGdlTm9kZTIoZUl0cik7CisgICAgICAgICAgICAgIGcuZ2V0Tm9kZUNvc3RzKG90aGVyTm9kZUl0cikgKz0KKyAgICAgICAgICAgICAgICBnLmdldEVkZ2VDb3N0cyhlSXRyKS5nZXRSb3dBc1ZlY3RvcigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBHcmFwaDo6Tm9kZUl0ciBvdGhlck5vZGVJdHIgPSBnLmdldEVkZ2VOb2RlMShlSXRyKTsKKyAgICAgICAgICAgICAgZy5nZXROb2RlQ29zdHMob3RoZXJOb2RlSXRyKSArPQorICAgICAgICAgICAgICAgIGcuZ2V0RWRnZUNvc3RzKGVJdHIpLmdldENvbEFzVmVjdG9yKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlZGdlc1RvUmVtb3ZlLnB1c2hfYmFjayhlSXRyKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWVkZ2VzVG9SZW1vdmUuZW1wdHkoKSkKKyAgICAgICAgICAgICsrbnVtRGlzY29ubmVjdGVkOworCisgICAgICAgICAgd2hpbGUgKCFlZGdlc1RvUmVtb3ZlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGcucmVtb3ZlRWRnZShlZGdlc1RvUmVtb3ZlLmJhY2soKSk7CisgICAgICAgICAgICBlZGdlc1RvUmVtb3ZlLnBvcF9iYWNrKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBlbGltaW5hdGVJbmRlcGVuZGVudEVkZ2VzKCkgeworICAgICAgc3RkOjp2ZWN0b3I8R3JhcGg6OkVkZ2VJdHI+IGVkZ2VzVG9Qcm9jZXNzOworICAgICAgdW5zaWduZWQgbnVtRWxpbWluYXRlZCA9IDA7CisKKyAgICAgIGZvciAoR3JhcGg6OkVkZ2VJdHIgZUl0ciA9IGcuZWRnZXNCZWdpbigpLCBlRW5kID0gZy5lZGdlc0VuZCgpOworICAgICAgICAgICBlSXRyICE9IGVFbmQ7ICsrZUl0cikgeworICAgICAgICBlZGdlc1RvUHJvY2Vzcy5wdXNoX2JhY2soZUl0cik7CisgICAgICB9CisKKyAgICAgIHdoaWxlICghZWRnZXNUb1Byb2Nlc3MuZW1wdHkoKSkgeworICAgICAgICBpZiAodHJ5VG9FbGltaW5hdGVFZGdlKGVkZ2VzVG9Qcm9jZXNzLmJhY2soKSkpCisgICAgICAgICAgKytudW1FbGltaW5hdGVkOworICAgICAgICBlZGdlc1RvUHJvY2Vzcy5wb3BfYmFjaygpOworICAgICAgfQorICAgIH0KKworICAgIGJvb2wgdHJ5VG9FbGltaW5hdGVFZGdlKEdyYXBoOjpFZGdlSXRyIGVJdHIpIHsKKyAgICAgIGlmICh0cnlOb3JtYWxpc2VFZGdlTWF0cml4KGVJdHIpKSB7CisgICAgICAgIGcucmVtb3ZlRWRnZShlSXRyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7IAorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgdHJ5Tm9ybWFsaXNlRWRnZU1hdHJpeChHcmFwaDo6RWRnZUl0ciAmZUl0cikgeworCisgICAgICBjb25zdCBQQlFQTnVtIGluZmluaXR5ID0gc3RkOjpudW1lcmljX2xpbWl0czxQQlFQTnVtPjo6aW5maW5pdHkoKTsKKworICAgICAgTWF0cml4ICZlZGdlQ29zdHMgPSBnLmdldEVkZ2VDb3N0cyhlSXRyKTsKKyAgICAgIFZlY3RvciAmdUNvc3RzID0gZy5nZXROb2RlQ29zdHMoZy5nZXRFZGdlTm9kZTEoZUl0cikpLAorICAgICAgICAgICAgICZ2Q29zdHMgPSBnLmdldE5vZGVDb3N0cyhnLmdldEVkZ2VOb2RlMihlSXRyKSk7CisKKyAgICAgIGZvciAodW5zaWduZWQgciA9IDA7IHIgPCBlZGdlQ29zdHMuZ2V0Um93cygpOyArK3IpIHsKKyAgICAgICAgUEJRUE51bSByb3dNaW4gPSBpbmZpbml0eTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgZWRnZUNvc3RzLmdldENvbHMoKTsgKytjKSB7CisgICAgICAgICAgaWYgKHZDb3N0c1tjXSAhPSBpbmZpbml0eSAmJiBlZGdlQ29zdHNbcl1bY10gPCByb3dNaW4pCisgICAgICAgICAgICByb3dNaW4gPSBlZGdlQ29zdHNbcl1bY107CisgICAgICAgIH0KKworICAgICAgICB1Q29zdHNbcl0gKz0gcm93TWluOworCisgICAgICAgIGlmIChyb3dNaW4gIT0gaW5maW5pdHkpIHsKKyAgICAgICAgICBlZGdlQ29zdHMuc3ViRnJvbVJvdyhyLCByb3dNaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGVkZ2VDb3N0cy5zZXRSb3cociwgMCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IGVkZ2VDb3N0cy5nZXRDb2xzKCk7ICsrYykgeworICAgICAgICBQQlFQTnVtIGNvbE1pbiA9IGluZmluaXR5OworCisgICAgICAgIGZvciAodW5zaWduZWQgciA9IDA7IHIgPCBlZGdlQ29zdHMuZ2V0Um93cygpOyArK3IpIHsKKyAgICAgICAgICBpZiAodUNvc3RzW3JdICE9IGluZmluaXR5ICYmIGVkZ2VDb3N0c1tyXVtjXSA8IGNvbE1pbikKKyAgICAgICAgICAgIGNvbE1pbiA9IGVkZ2VDb3N0c1tyXVtjXTsKKyAgICAgICAgfQorCisgICAgICAgIHZDb3N0c1tjXSArPSBjb2xNaW47CisKKyAgICAgICAgaWYgKGNvbE1pbiAhPSBpbmZpbml0eSkgeworICAgICAgICAgIGVkZ2VDb3N0cy5zdWJGcm9tQ29sKGMsIGNvbE1pbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZWRnZUNvc3RzLnNldENvbChjLCAwKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZWRnZUNvc3RzLmlzWmVybygpOworICAgIH0KKworICAgIHZvaWQgYmFja3Byb3BhZ2F0ZSgpIHsKKyAgICAgIHdoaWxlICghc3RhY2suZW1wdHkoKSkgeworICAgICAgICBjb21wdXRlU29sdXRpb24oc3RhY2suYmFjaygpKTsKKyAgICAgICAgc3RhY2sucG9wX2JhY2soKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNvbXB1dGVTb2x1dGlvbihHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisKKyAgICAgIE5vZGVEYXRhICZub2RlRGF0YSA9IGdldFNvbHZlck5vZGVEYXRhKG5JdHIpOworCisgICAgICBWZWN0b3IgdihnLmdldE5vZGVDb3N0cyhuSXRyKSk7CisKKyAgICAgIC8vIFNvbHZlIGJhc2VkIG9uIGV4aXN0aW5nIHNvbHZlZCBlZGdlcy4KKyAgICAgIGZvciAoU29sdmVyRWRnZUl0ciBzb2x2ZWRFZGdlSXRyID0gbm9kZURhdGEuc29sdmVyRWRnZXNCZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNvbHZlZEVkZ2VFbmQgPSBub2RlRGF0YS5zb2x2ZXJFZGdlc0VuZCgpOworICAgICAgICAgICBzb2x2ZWRFZGdlSXRyICE9IHNvbHZlZEVkZ2VFbmQ7ICsrc29sdmVkRWRnZUl0cikgeworCisgICAgICAgIEdyYXBoOjpFZGdlSXRyIGVJdHIoKnNvbHZlZEVkZ2VJdHIpOworICAgICAgICBNYXRyaXggJmVkZ2VDb3N0cyA9IGcuZ2V0RWRnZUNvc3RzKGVJdHIpOworCisgICAgICAgIGlmIChuSXRyID09IGcuZ2V0RWRnZU5vZGUxKGVJdHIpKSB7CisgICAgICAgICAgR3JhcGg6Ok5vZGVJdHIgYWRqTm9kZShnLmdldEVkZ2VOb2RlMihlSXRyKSk7CisgICAgICAgICAgdW5zaWduZWQgYWRqU29sdXRpb24gPSBzLmdldFNlbGVjdGlvbihhZGpOb2RlKTsKKyAgICAgICAgICB2ICs9IGVkZ2VDb3N0cy5nZXRDb2xBc1ZlY3RvcihhZGpTb2x1dGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgR3JhcGg6Ok5vZGVJdHIgYWRqTm9kZShnLmdldEVkZ2VOb2RlMShlSXRyKSk7CisgICAgICAgICAgdW5zaWduZWQgYWRqU29sdXRpb24gPSBzLmdldFNlbGVjdGlvbihhZGpOb2RlKTsKKyAgICAgICAgICB2ICs9IGVkZ2VDb3N0cy5nZXRSb3dBc1ZlY3RvcihhZGpTb2x1dGlvbik7CisgICAgICAgIH0KKworICAgICAgfQorCisgICAgICBzZXRTb2x1dGlvbihuSXRyLCB2Lm1pbkluZGV4KCkpOworICAgIH0KKworICAgIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgIGguY2xlYW51cCgpOworICAgICAgbm9kZURhdGFMaXN0LmNsZWFyKCk7CisgICAgICBlZGdlRGF0YUxpc3QuY2xlYXIoKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBQQlFQIGhldXJpc3RpYyBzb2x2ZXIgY2xhc3MuCisgIC8vLworICAvLy8gR2l2ZW4gYSBQQlFQIEdyYXBoIGcgcmVwcmVzZW50aW5nIGEgUEJRUCBwcm9ibGVtLCB5b3UgY2FuIGZpbmQgYSBzb2x1dGlvbgorICAvLy8gYnkgY2FsbGluZworICAvLy8gPHR0PlNvbHV0aW9uIHMgPSBIZXVyaXN0aWNTb2x2ZXI8SD46OnNvbHZlKGcpOzwvdHQ+CisgIC8vLworICAvLy8gVGhlIGNob2ljZSBvZiBoZXVyaXN0aWMgZm9yIHRoZSBIIHBhcmFtZXRlciB3aWxsIGFmZmVjdCBib3RoIHRoZSBzb2x2ZXIKKyAgLy8vIHNwZWVkIGFuZCBzb2x1dGlvbiBxdWFsaXR5LiBUaGUgaGV1cmlzdGljIHNob3VsZCBiZSBjaG9zZW4gYmFzZWQgb24gdGhlCisgIC8vLyBuYXR1cmUgb2YgdGhlIHByb2JsZW0gYmVpbmcgc29sdmVkLgorICAvLy8gQ3VycmVudGx5IHRoZSBvbmx5IHNvbHZlciBpbmNsdWRlZCB3aXRoIExMVk0gaXMgdGhlIEJyaWdncyBoZXVyaXN0aWMgZm9yCisgIC8vLyByZWdpc3RlciBhbGxvY2F0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSEltcGw+CisgIGNsYXNzIEhldXJpc3RpY1NvbHZlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgU29sdXRpb24gc29sdmUoR3JhcGggJmcpIHsKKyAgICAgIEhldXJpc3RpY1NvbHZlckltcGw8SEltcGw+IGhzKGcpOworICAgICAgcmV0dXJuIGhzLmNvbXB1dGVTb2x1dGlvbigpOworICAgIH0KKyAgfTsKKworfQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1BCUVBfSEVVUklTVElDU09MVkVSX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1BCUVAvSGV1cmlzdGljcy9CcmlnZ3MuaCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1BCUVAvSGV1cmlzdGljcy9CcmlnZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGVhZjdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEJRUC9IZXVyaXN0aWNzL0JyaWdncy5oCkBAIC0wLDAgKzEsNDYwIEBACisvLz09PS0tIEJyaWdncy5oIC0tLSBCcmlnZ3MgSGV1cmlzdGljIGZvciBQQlFQIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgQnJpZ2dzIHRlc3QgZm9yICJhbGxvY2FiaWxpdHkiIG9mIG5vZGVzIGluIGEKKy8vIFBCUVAgZ3JhcGggcmVwcmVzZW50aW5nIGEgcmVnaXN0ZXIgYWxsb2NhdGlvbiBwcm9ibGVtLiBOb2RlcyB3aGljaCBjYW4gYmUKKy8vIHByb3ZlbiBhbGxvY2FibGUgKGJ5IGEgc2FmZSBhbmQgcmVsYXRpdmVseSBhY2N1cmF0ZSB0ZXN0KSBhcmUgcmVtb3ZlZCBmcm9tCisvLyB0aGUgUEJRUCBncmFwaCBmaXJzdC4gSWYgbm8gcHJvdmFibHkgYWxsb2NhYmxlIG5vZGUgaXMgcHJlc2VudCBpbiB0aGUgZ3JhcGgKKy8vIHRoZW4gdGhlIG5vZGUgd2l0aCB0aGUgbWluaW1hbCBzcGlsbC1jb3N0IHRvIGRlZ3JlZSByYXRpbyBpcyByZW1vdmVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfSEVVUklTVElDU19CUklHR1NfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEJRUF9IRVVSSVNUSUNTX0JSSUdHU19ICisKKyNpbmNsdWRlICIuLi9IZXVyaXN0aWNTb2x2ZXIuaCIKKyNpbmNsdWRlICIuLi9IZXVyaXN0aWNCYXNlLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgUEJRUCB7CisgIG5hbWVzcGFjZSBIZXVyaXN0aWNzIHsKKworICAgIC8vLyBcYnJpZWYgUEJRUCBIZXVyaXN0aWMgd2hpY2ggYXBwbGllcyBhbiBhbGxvY2FiaWxpdHkgdGVzdCBiYXNlZCBvbgorICAgIC8vLyAgICAgICAgQnJpZ2dzLgorICAgIC8vLyAKKyAgICAvLy8gVGhpcyBoZXVyaXN0aWMgYXNzdW1lcyB0aGF0IHRoZSBlbGVtZW50cyBvZiBjb3N0IHZlY3RvcnMgaW4gdGhlIFBCUVAKKyAgICAvLy8gcHJvYmxlbSByZXByZXNlbnQgc3RvcmFnZSBvcHRpb25zLCB3aXRoIHRoZSBmaXJzdCBiZWluZyB0aGUgc3BpbGwKKyAgICAvLy8gb3B0aW9uIGFuZCBzdWJzZXF1ZW50IGVsZW1lbnRzIHJlcHJlc2VudGluZyBsZWdhbCByZWdpc3RlcnMgZm9yIHRoZQorICAgIC8vLyBjb3JyZXNwb25kaW5nIG5vZGUuIEVkZ2UgY29zdCBtYXRyaWNlcyBhcmUgbGlrZXdpc2UgYXNzdW1lZCB0byByZXByZXNlbnQKKyAgICAvLy8gcmVnaXN0ZXIgY29uc3RyYWludHMuCisgICAgLy8vIElmIG9uZSBvciBtb3JlIG5vZGVzIGNhbiBiZSBwcm92ZW4gYWxsb2NhYmxlIGJ5IHRoaXMgaGV1cmlzdGljIChieQorICAgIC8vLyBpbnNwZWN0aW9uIG9mIHRoZWlyIGNvbnN0cmFpbnQgbWF0cmljZXMpIHRoZW4gdGhlIGFsbG9jYWJsZSBub2RlIG9mCisgICAgLy8vIGhpZ2hlc3QgZGVncmVlIGlzIHNlbGVjdGVkIGZvciB0aGUgbmV4dCByZWR1Y3Rpb24gYW5kIHB1c2hlZCB0byB0aGUKKyAgICAvLy8gc29sdmVyIHN0YWNrLiBJZiBubyBub2RlcyBjYW4gYmUgcHJvdmVuIGFsbG9jYWJsZSB0aGVuIHRoZSBub2RlIHdpdGgKKyAgICAvLy8gdGhlIGxvd2VzdCBlc3RpbWF0ZWQgc3BpbGwgY29zdCBpcyBzZWxlY3RlZCBhbmQgcHVzaCB0byB0aGUgc29sdmVyIHN0YWNrCisgICAgLy8vIGluc3RlYWQuCisgICAgLy8vIAorICAgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJ1aWx0IG9uIHRvcCBvZiBIZXVyaXN0aWNCYXNlLiAgICAgICAKKyAgICBjbGFzcyBCcmlnZ3MgOiBwdWJsaWMgSGV1cmlzdGljQmFzZTxCcmlnZ3M+IHsKKyAgICBwcml2YXRlOgorCisgICAgICBjbGFzcyBMaW5rRGVncmVlQ29tcGFyYXRvciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIExpbmtEZWdyZWVDb21wYXJhdG9yKEhldXJpc3RpY1NvbHZlckltcGw8QnJpZ2dzPiAmcykgOiBzKCZzKSB7fQorICAgICAgICBib29sIG9wZXJhdG9yKCkoR3JhcGg6Ok5vZGVJdHIgbjFJdHIsIEdyYXBoOjpOb2RlSXRyIG4ySXRyKSBjb25zdCB7CisgICAgICAgICAgaWYgKHMtPmdldFNvbHZlckRlZ3JlZShuMUl0cikgPiBzLT5nZXRTb2x2ZXJEZWdyZWUobjJJdHIpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICBwcml2YXRlOgorICAgICAgICBIZXVyaXN0aWNTb2x2ZXJJbXBsPEJyaWdncz4gKnM7CisgICAgICB9OworCisgICAgICBjbGFzcyBTcGlsbENvc3RDb21wYXJhdG9yIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgU3BpbGxDb3N0Q29tcGFyYXRvcihIZXVyaXN0aWNTb2x2ZXJJbXBsPEJyaWdncz4gJnMpCisgICAgICAgICAgOiBzKCZzKSwgZygmcy5nZXRHcmFwaCgpKSB7fQorICAgICAgICBib29sIG9wZXJhdG9yKCkoR3JhcGg6Ok5vZGVJdHIgbjFJdHIsIEdyYXBoOjpOb2RlSXRyIG4ySXRyKSBjb25zdCB7CisgICAgICAgICAgUEJRUE51bSBjb3N0MSA9IGctPmdldE5vZGVDb3N0cyhuMUl0cilbMF0gLyBzLT5nZXRTb2x2ZXJEZWdyZWUobjFJdHIpLAorICAgICAgICAgICAgICAgICAgY29zdDIgPSBnLT5nZXROb2RlQ29zdHMobjJJdHIpWzBdIC8gcy0+Z2V0U29sdmVyRGVncmVlKG4ySXRyKTsKKyAgICAgICAgICBpZiAoY29zdDEgPCBjb3N0MikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICBwcml2YXRlOgorICAgICAgICBIZXVyaXN0aWNTb2x2ZXJJbXBsPEJyaWdncz4gKnM7CisgICAgICAgIEdyYXBoICpnOworICAgICAgfTsKKworICAgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8R3JhcGg6Ok5vZGVJdHI+IFJOQWxsb2NhYmxlTGlzdDsKKyAgICAgIHR5cGVkZWYgUk5BbGxvY2FibGVMaXN0OjppdGVyYXRvciBSTkFsbG9jYWJsZUxpc3RJdHI7CisKKyAgICAgIHR5cGVkZWYgc3RkOjpsaXN0PEdyYXBoOjpOb2RlSXRyPiBSTlVuYWxsb2NhYmxlTGlzdDsgIAorICAgICAgdHlwZWRlZiBSTlVuYWxsb2NhYmxlTGlzdDo6aXRlcmF0b3IgUk5VbmFsbG9jYWJsZUxpc3RJdHI7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIHN0cnVjdCBOb2RlRGF0YSB7CisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFVuc2FmZURlZ3JlZXNBcnJheTsKKyAgICAgICAgYm9vbCBpc0hldXJpc3RpYywgaXNBbGxvY2FibGUsIGlzSW5pdGlhbGl6ZWQ7CisgICAgICAgIHVuc2lnbmVkIG51bURlbmllZCwgbnVtU2FmZTsKKyAgICAgICAgVW5zYWZlRGVncmVlc0FycmF5IHVuc2FmZURlZ3JlZXM7CisgICAgICAgIFJOQWxsb2NhYmxlTGlzdEl0ciBybmFJdHI7CisgICAgICAgIFJOVW5hbGxvY2FibGVMaXN0SXRyIHJudUl0cjsKKworICAgICAgICBOb2RlRGF0YSgpCisgICAgICAgICAgOiBpc0hldXJpc3RpYyhmYWxzZSksIGlzQWxsb2NhYmxlKGZhbHNlKSwgaXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgICAgICBudW1EZW5pZWQoMCksIG51bVNhZmUoMCkgeyB9CisgICAgICB9OworCisgICAgICBzdHJ1Y3QgRWRnZURhdGEgeworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBVbnNhZmVBcnJheTsKKyAgICAgICAgdW5zaWduZWQgd29yc3QsIHJldmVyc2VXb3JzdDsKKyAgICAgICAgVW5zYWZlQXJyYXkgdW5zYWZlLCByZXZlcnNlVW5zYWZlOworICAgICAgICBib29sIGlzVXBUb0RhdGU7CisKKyAgICAgICAgRWRnZURhdGEoKSA6IHdvcnN0KDApLCByZXZlcnNlV29yc3QoMCksIGlzVXBUb0RhdGUoZmFsc2UpIHt9CisgICAgICB9OworCisgICAgICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgQnJpZ2dzIGhldXJpc3RpYy4KKyAgICAgIC8vLyBAcGFyYW0gc29sdmVyIEEgcmVmZXJlbmNlIHRvIHRoZSBzb2x2ZXIgd2hpY2ggaXMgdXNpbmcgdGhpcyBoZXVyaXN0aWMuCisgICAgICBCcmlnZ3MoSGV1cmlzdGljU29sdmVySW1wbDxCcmlnZ3M+ICZzb2x2ZXIpIDoKKyAgICAgICAgSGV1cmlzdGljQmFzZTxCcmlnZ3M+KHNvbHZlcikge30KKworICAgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBhIG5vZGUgc2hvdWxkIGJlIHJlZHVjZWQgdXNpbmcgb3B0aW1hbAorICAgICAgLy8vICAgICAgICByZWR1Y3Rpb24uCisgICAgICAvLy8gQHBhcmFtIG5JdHIgTm9kZSBpdGVyYXRvciB0byBiZSBjb25zaWRlcmVkLgorICAgICAgLy8vIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gbm9kZSBzaG91bGQgYmUgb3B0aW1hbGx5IHJlZHVjZWQsIGZhbHNlCisgICAgICAvLy8gICAgICAgICBvdGhlcndpc2UuCisgICAgICAvLy8KKyAgICAgIC8vLyBTZWxlY3RzIG5vZGVzIG9mIGRlZ3JlZSAwLCAxIG9yIDIgZm9yIG9wdGltYWwgcmVkdWN0aW9uLCB3aXRoIG9uZQorICAgICAgLy8vIGV4Y2VwdGlvbi4gTm9kZXMgd2hvc2Ugc3BpbGwgY29zdCAoZWxlbWVudCAwIG9mIHRoZWlyIGNvc3QgdmVjdG9yKSBpcworICAgICAgLy8vIGluZmluaXRlIGFyZSBjaGVja2VkIGZvciBhbGxvY2FiaWxpdHkgZmlyc3QuIEFsbG9jYWJsZSBub2RlcyBtYXkgYmUKKyAgICAgIC8vLyBvcHRpbWFsbHkgcmVkdWNlZCwgYnV0IG5vZGVzIHdob3NlIGFsbG9jYWJpbGl0eSBjYW5ub3QgYmUgcHJvdmVuIGFyZQorICAgICAgLy8vIHNlbGVjdGVkIGZvciBoZXVyaXN0aWMgcmVkdWN0aW9uIGluc3RlYWQuCisgICAgICBib29sIHNob3VsZE9wdGltYWxseVJlZHVjZShHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICAgIGlmIChnZXRTb2x2ZXIoKS5nZXRTb2x2ZXJEZWdyZWUobkl0cikgPCAzKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8vLyBcYnJpZWYgQWRkIGEgbm9kZSB0byB0aGUgaGV1cmlzdGljIHJlZHVjZSBsaXN0LgorICAgICAgLy8vIEBwYXJhbSBuSXRyIE5vZGUgaXRlcmF0b3IgdG8gYWRkIHRvIHRoZSBoZXVyaXN0aWMgcmVkdWNlIGxpc3QuCisgICAgICB2b2lkIGFkZFRvSGV1cmlzdGljUmVkdWNlTGlzdChHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICAgIE5vZGVEYXRhICZuZCA9IGdldEhldXJpc3RpY05vZGVEYXRhKG5JdHIpOworICAgICAgICBpbml0aWFsaXplTm9kZShuSXRyKTsKKyAgICAgICAgbmQuaXNIZXVyaXN0aWMgPSB0cnVlOworICAgICAgICBpZiAobmQuaXNBbGxvY2FibGUpIHsKKyAgICAgICAgICBuZC5ybmFJdHIgPSBybkFsbG9jYWJsZUxpc3QuaW5zZXJ0KHJuQWxsb2NhYmxlTGlzdC5lbmQoKSwgbkl0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmQucm51SXRyID0gcm5VbmFsbG9jYWJsZUxpc3QuaW5zZXJ0KHJuVW5hbGxvY2FibGVMaXN0LmVuZCgpLCBuSXRyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLy8gXGJyaWVmIEhldXJpc3RpY2FsbHkgcmVkdWNlIG9uZSBvZiB0aGUgbm9kZXMgaW4gdGhlIGhldXJpc3RpYworICAgICAgLy8vICAgICAgICByZWR1Y2UgbGlzdC4KKyAgICAgIC8vLyBAcmV0dXJuIFRydWUgaWYgYSByZWR1Y3Rpb24gdGFrZXMgcGxhY2UsIGZhbHNlIGlmIHRoZSBoZXVyaXN0aWMgcmVkdWNlCisgICAgICAvLy8gICAgICAgICBsaXN0IGlzIGVtcHR5LgorICAgICAgLy8vCisgICAgICAvLy8gSWYgdGhlIGxpc3Qgb2YgYWxsb2NhYmxlIG5vZGVzIGlzIG5vbi1lbXB0eSBhIG5vZGUgaXMgc2VsZWN0ZWQKKyAgICAgIC8vLyBmcm9tIGl0IGFuZCBwdXNoZWQgdG8gdGhlIHN0YWNrLiBPdGhlcndpc2UgaWYgdGhlIG5vbi1hbGxvY2FibGUgbGlzdAorICAgICAgLy8vIGlzIG5vbi1lbXB0eSBhIG5vZGUgaXMgc2VsZWN0ZWQgZnJvbSBpdCBhbmQgcHVzaGVkIHRvIHRoZSBzdGFjay4KKyAgICAgIC8vLyBJZiBib3RoIGxpc3RzIGFyZSBlbXB0eSB0aGUgbWV0aG9kIHNpbXBseSByZXR1cm5zIGZhbHNlIHdpdGggbm8gYWN0aW9uCisgICAgICAvLy8gdGFrZW4uCisgICAgICBib29sIGhldXJpc3RpY1JlZHVjZSgpIHsKKyAgICAgICAgaWYgKCFybkFsbG9jYWJsZUxpc3QuZW1wdHkoKSkgeworICAgICAgICAgIFJOQWxsb2NhYmxlTGlzdEl0ciBybmFJdHIgPQorICAgICAgICAgICAgbWluX2VsZW1lbnQocm5BbGxvY2FibGVMaXN0LmJlZ2luKCksIHJuQWxsb2NhYmxlTGlzdC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmtEZWdyZWVDb21wYXJhdG9yKGdldFNvbHZlcigpKSk7CisgICAgICAgICAgR3JhcGg6Ok5vZGVJdHIgbkl0ciA9ICpybmFJdHI7CisgICAgICAgICAgcm5BbGxvY2FibGVMaXN0LmVyYXNlKHJuYUl0cik7CisgICAgICAgICAgaGFuZGxlUmVtb3ZlTm9kZShuSXRyKTsKKyAgICAgICAgICBnZXRTb2x2ZXIoKS5wdXNoVG9TdGFjayhuSXRyKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghcm5VbmFsbG9jYWJsZUxpc3QuZW1wdHkoKSkgeworICAgICAgICAgIFJOVW5hbGxvY2FibGVMaXN0SXRyIHJudUl0ciA9CisgICAgICAgICAgICBtaW5fZWxlbWVudChyblVuYWxsb2NhYmxlTGlzdC5iZWdpbigpLCByblVuYWxsb2NhYmxlTGlzdC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNwaWxsQ29zdENvbXBhcmF0b3IoZ2V0U29sdmVyKCkpKTsKKyAgICAgICAgICBHcmFwaDo6Tm9kZUl0ciBuSXRyID0gKnJudUl0cjsKKyAgICAgICAgICByblVuYWxsb2NhYmxlTGlzdC5lcmFzZShybnVJdHIpOworICAgICAgICAgIGhhbmRsZVJlbW92ZU5vZGUobkl0cik7CisgICAgICAgICAgZ2V0U29sdmVyKCkucHVzaFRvU3RhY2sobkl0cik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8vLyBcYnJpZWYgUHJlcGFyZSBhIGNoYW5nZSBpbiB0aGUgY29zdHMgb24gdGhlIGdpdmVuIGVkZ2UuCisgICAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4gICAgCisgICAgICB2b2lkIHByZVVwZGF0ZUVkZ2VDb3N0cyhHcmFwaDo6RWRnZUl0ciBlSXRyKSB7CisgICAgICAgIEdyYXBoICZnID0gZ2V0R3JhcGgoKTsKKyAgICAgICAgR3JhcGg6Ok5vZGVJdHIgbjFJdHIgPSBnLmdldEVkZ2VOb2RlMShlSXRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbjJJdHIgPSBnLmdldEVkZ2VOb2RlMihlSXRyKTsKKyAgICAgICAgTm9kZURhdGEgJm4xID0gZ2V0SGV1cmlzdGljTm9kZURhdGEobjFJdHIpLAorICAgICAgICAgICAgICAgICAmbjIgPSBnZXRIZXVyaXN0aWNOb2RlRGF0YShuMkl0cik7CisKKyAgICAgICAgaWYgKG4xLmlzSGV1cmlzdGljKQorICAgICAgICAgIHN1YnRyYWN0RWRnZUNvbnRyaWJ1dGlvbnMoZUl0ciwgZ2V0R3JhcGgoKS5nZXRFZGdlTm9kZTEoZUl0cikpOworICAgICAgICBpZiAobjIuaXNIZXVyaXN0aWMpCisgICAgICAgICAgc3VidHJhY3RFZGdlQ29udHJpYnV0aW9ucyhlSXRyLCBnZXRHcmFwaCgpLmdldEVkZ2VOb2RlMihlSXRyKSk7CisKKyAgICAgICAgRWRnZURhdGEgJmVkID0gZ2V0SGV1cmlzdGljRWRnZURhdGEoZUl0cik7CisgICAgICAgIGVkLmlzVXBUb0RhdGUgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8vIFxicmllZiBIYW5kbGUgdGhlIGNoYW5nZSBpbiB0aGUgY29zdHMgb24gdGhlIGdpdmVuIGVkZ2UuCisgICAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvci4KKyAgICAgIHZvaWQgcG9zdFVwZGF0ZUVkZ2VDb3N0cyhHcmFwaDo6RWRnZUl0ciBlSXRyKSB7CisgICAgICAgIC8vIFRoaXMgaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgYWRkaW5nIGEgbmV3IGVkZ2Ugbm93LCBzaW5jZQorICAgICAgICAvLyB3ZSd2ZSBmYWN0b3JlZCBvdXQgdGhlIGNvc3RzIG9mIHRoZSBvbGQgb25lLgorICAgICAgICBoYW5kbGVBZGRFZGdlKGVJdHIpOworICAgICAgfQorCisgICAgICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgYWRkaXRpb24gb2YgYSBuZXcgZWRnZSBpbnRvIHRoZSBQQlFQIGdyYXBoLgorICAgICAgLy8vIEBwYXJhbSBlSXRyIEVkZ2UgaXRlcmF0b3IgZm9yIHRoZSBhZGRlZCBlZGdlLgorICAgICAgLy8vCisgICAgICAvLy8gVXBkYXRlcyBhbGxvY2FiaWxpdHkgb2YgYW55IG5vZGVzIGNvbm5lY3RlZCBieSB0aGlzIGVkZ2Ugd2hpY2ggYXJlCisgICAgICAvLy8gYmVpbmcgbWFuYWdlZCBieSB0aGUgaGV1cmlzdGljLiBJZiBhbGxvY2FiaWxpdHkgY2hhbmdlcyB0aGV5IGFyZQorICAgICAgLy8vIG1vdmVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0LgorICAgICAgdm9pZCBoYW5kbGVBZGRFZGdlKEdyYXBoOjpFZGdlSXRyIGVJdHIpIHsKKyAgICAgICAgR3JhcGggJmcgPSBnZXRHcmFwaCgpOworICAgICAgICBHcmFwaDo6Tm9kZUl0ciBuMUl0ciA9IGcuZ2V0RWRnZU5vZGUxKGVJdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBuMkl0ciA9IGcuZ2V0RWRnZU5vZGUyKGVJdHIpOworICAgICAgICBOb2RlRGF0YSAmbjEgPSBnZXRIZXVyaXN0aWNOb2RlRGF0YShuMUl0ciksCisgICAgICAgICAgICAgICAgICZuMiA9IGdldEhldXJpc3RpY05vZGVEYXRhKG4ySXRyKTsKKworICAgICAgICAvLyBJZiBuZWl0aGVyIG5vZGUgaXMgbWFuYWdlZCBieSB0aGUgaGV1cmlzdGljIHRoZXJlJ3Mgbm90aGluZyB0byBiZQorICAgICAgICAvLyBkb25lLgorICAgICAgICBpZiAoIW4xLmlzSGV1cmlzdGljICYmICFuMi5pc0hldXJpc3RpYykKKyAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gT2sgLSB3ZSBuZWVkIHRvIHVwZGF0ZSBhdCBsZWFzdCBvbmUgbm9kZS4KKyAgICAgICAgY29tcHV0ZUVkZ2VDb250cmlidXRpb25zKGVJdHIpOworCisgICAgICAgIC8vIFVwZGF0ZSBub2RlIDEgaWYgaXQncyBtYW5hZ2VkIGJ5IHRoZSBoZXVyaXN0aWMuCisgICAgICAgIGlmIChuMS5pc0hldXJpc3RpYykgeworICAgICAgICAgIGJvb2wgbjFXYXNBbGxvY2FibGUgPSBuMS5pc0FsbG9jYWJsZTsKKyAgICAgICAgICBhZGRFZGdlQ29udHJpYnV0aW9ucyhlSXRyLCBuMUl0cik7CisgICAgICAgICAgdXBkYXRlQWxsb2NhYmlsaXR5KG4xSXRyKTsKKyAgICAgICAgICBpZiAobjFXYXNBbGxvY2FibGUgJiYgIW4xLmlzQWxsb2NhYmxlKSB7CisgICAgICAgICAgICBybkFsbG9jYWJsZUxpc3QuZXJhc2UobjEucm5hSXRyKTsKKyAgICAgICAgICAgIG4xLnJudUl0ciA9CisgICAgICAgICAgICAgIHJuVW5hbGxvY2FibGVMaXN0Lmluc2VydChyblVuYWxsb2NhYmxlTGlzdC5lbmQoKSwgbjFJdHIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExpa2V3aXNlIGZvciBub2RlIDIuCisgICAgICAgIGlmIChuMi5pc0hldXJpc3RpYykgeworICAgICAgICAgIGJvb2wgbjJXYXNBbGxvY2FibGUgPSBuMi5pc0FsbG9jYWJsZTsKKyAgICAgICAgICBhZGRFZGdlQ29udHJpYnV0aW9ucyhlSXRyLCBuMkl0cik7CisgICAgICAgICAgdXBkYXRlQWxsb2NhYmlsaXR5KG4ySXRyKTsKKyAgICAgICAgICBpZiAobjJXYXNBbGxvY2FibGUgJiYgIW4yLmlzQWxsb2NhYmxlKSB7CisgICAgICAgICAgICBybkFsbG9jYWJsZUxpc3QuZXJhc2UobjIucm5hSXRyKTsKKyAgICAgICAgICAgIG4yLnJudUl0ciA9CisgICAgICAgICAgICAgIHJuVW5hbGxvY2FibGVMaXN0Lmluc2VydChyblVuYWxsb2NhYmxlTGlzdC5lbmQoKSwgbjJJdHIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLy8gXGJyaWVmIEhhbmRsZSBkaXNjb25uZWN0aW9uIG9mIGFuIGVkZ2UgZnJvbSBhIG5vZGUuCisgICAgICAvLy8gQHBhcmFtIGVJdHIgRWRnZSBpdGVyYXRvciBmb3IgZWRnZSBiZWluZyBkaXNjb25uZWN0ZWQuCisgICAgICAvLy8gQHBhcmFtIG5JdHIgTm9kZSBpdGVyYXRvciBmb3IgdGhlIG5vZGUgYmVpbmcgZGlzY29ubmVjdGVkIGZyb20uCisgICAgICAvLy8KKyAgICAgIC8vLyBVcGRhdGVzIGFsbG9jYWJpbGl0eSBvZiB0aGUgZ2l2ZW4gbm9kZSBhbmQsIGlmIGFwcHJvcHJpYXRlLCBtb3ZlcyB0aGUKKyAgICAgIC8vLyBub2RlIHRvIGEgbmV3IGxpc3QuCisgICAgICB2b2lkIGhhbmRsZVJlbW92ZUVkZ2UoR3JhcGg6OkVkZ2VJdHIgZUl0ciwgR3JhcGg6Ok5vZGVJdHIgbkl0cikgeworICAgICAgICBOb2RlRGF0YSAmbmQgPSBnZXRIZXVyaXN0aWNOb2RlRGF0YShuSXRyKTsKKworICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBub3QgbWFuYWdlZCBieSB0aGUgaGV1cmlzdGljIHRoZXJlJ3Mgbm90aGluZyB0byBiZQorICAgICAgICAvLyBkb25lLgorICAgICAgICBpZiAoIW5kLmlzSGV1cmlzdGljKQorICAgICAgICAgIHJldHVybjsKKworICAgICAgICBFZGdlRGF0YSAmZWQgPSBnZXRIZXVyaXN0aWNFZGdlRGF0YShlSXRyKTsKKyAgICAgICAgKHZvaWQpZWQ7CisgICAgICAgIGFzc2VydChlZC5pc1VwVG9EYXRlICYmICJFZGdlIGRhdGEgaXMgbm90IHVwIHRvIGRhdGUuIik7CisKKyAgICAgICAgLy8gVXBkYXRlIG5vZGUuCisgICAgICAgIGJvb2wgbmRXYXNBbGxvY2FibGUgPSBuZC5pc0FsbG9jYWJsZTsKKyAgICAgICAgc3VidHJhY3RFZGdlQ29udHJpYnV0aW9ucyhlSXRyLCBuSXRyKTsKKyAgICAgICAgdXBkYXRlQWxsb2NhYmlsaXR5KG5JdHIpOworCisgICAgICAgIC8vIElmIHRoZSBub2RlIGhhcyBnb25lIG9wdGltYWwuLi4KKyAgICAgICAgaWYgKHNob3VsZE9wdGltYWxseVJlZHVjZShuSXRyKSkgeworICAgICAgICAgIG5kLmlzSGV1cmlzdGljID0gZmFsc2U7CisgICAgICAgICAgYWRkVG9PcHRpbWFsUmVkdWNlTGlzdChuSXRyKTsKKyAgICAgICAgICBpZiAobmRXYXNBbGxvY2FibGUpIHsKKyAgICAgICAgICAgIHJuQWxsb2NhYmxlTGlzdC5lcmFzZShuZC5ybmFJdHIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByblVuYWxsb2NhYmxlTGlzdC5lcmFzZShuZC5ybnVJdHIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBOb2RlIGRpZG4ndCBnbyBvcHRpbWFsLCBidXQgd2UgbWlnaHQgaGF2ZSB0byBtb3ZlIGl0CisgICAgICAgICAgLy8gZnJvbSAidW5hbGxvY2FibGUiIHRvICJhbGxvY2FibGUiLgorICAgICAgICAgIGlmICghbmRXYXNBbGxvY2FibGUgJiYgbmQuaXNBbGxvY2FibGUpIHsKKyAgICAgICAgICAgIHJuVW5hbGxvY2FibGVMaXN0LmVyYXNlKG5kLnJudUl0cik7CisgICAgICAgICAgICBuZC5ybmFJdHIgPSBybkFsbG9jYWJsZUxpc3QuaW5zZXJ0KHJuQWxsb2NhYmxlTGlzdC5lbmQoKSwgbkl0cik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICBOb2RlRGF0YSYgZ2V0SGV1cmlzdGljTm9kZURhdGEoR3JhcGg6Ok5vZGVJdHIgbkl0cikgeworICAgICAgICByZXR1cm4gZ2V0U29sdmVyKCkuZ2V0SGV1cmlzdGljTm9kZURhdGEobkl0cik7CisgICAgICB9CisKKyAgICAgIEVkZ2VEYXRhJiBnZXRIZXVyaXN0aWNFZGdlRGF0YShHcmFwaDo6RWRnZUl0ciBlSXRyKSB7CisgICAgICAgIHJldHVybiBnZXRTb2x2ZXIoKS5nZXRIZXVyaXN0aWNFZGdlRGF0YShlSXRyKTsKKyAgICAgIH0KKworICAgICAgLy8gV29yayBvdXQgd2hhdCB0aGlzIGVkZ2Ugd2lsbCBjb250cmlidXRlIHRvIHRoZSBhbGxvY2FiaWxpdHkgb2YgdGhlCisgICAgICAvLyBub2RlcyBjb25uZWN0ZWQgdG8gaXQuCisgICAgICB2b2lkIGNvbXB1dGVFZGdlQ29udHJpYnV0aW9ucyhHcmFwaDo6RWRnZUl0ciBlSXRyKSB7CisgICAgICAgIEVkZ2VEYXRhICZlZCA9IGdldEhldXJpc3RpY0VkZ2VEYXRhKGVJdHIpOworCisgICAgICAgIGlmIChlZC5pc1VwVG9EYXRlKQorICAgICAgICAgIHJldHVybjsgLy8gRWRnZSBkYXRhIGlzIGFscmVhZHkgdXAgdG8gZGF0ZS4KKworICAgICAgICBNYXRyaXggJmVDb3N0cyA9IGdldEdyYXBoKCkuZ2V0RWRnZUNvc3RzKGVJdHIpOworCisgICAgICAgIHVuc2lnbmVkIG51bVJlZ3MgPSBlQ29zdHMuZ2V0Um93cygpIC0gMSwKKyAgICAgICAgICAgICAgICAgbnVtUmV2ZXJzZVJlZ3MgPSBlQ29zdHMuZ2V0Q29scygpIC0gMTsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gcm93SW5mQ291bnRzKG51bVJlZ3MsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sSW5mQ291bnRzKG51bVJldmVyc2VSZWdzLCAwKTsgICAgICAgIAorCisgICAgICAgIGVkLndvcnN0ID0gMDsKKyAgICAgICAgZWQucmV2ZXJzZVdvcnN0ID0gMDsKKyAgICAgICAgZWQudW5zYWZlLmNsZWFyKCk7CisgICAgICAgIGVkLnVuc2FmZS5yZXNpemUobnVtUmVncywgMCk7CisgICAgICAgIGVkLnJldmVyc2VVbnNhZmUuY2xlYXIoKTsKKyAgICAgICAgZWQucmV2ZXJzZVVuc2FmZS5yZXNpemUobnVtUmV2ZXJzZVJlZ3MsIDApOworCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1SZWdzOyArK2kpIHsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgbnVtUmV2ZXJzZVJlZ3M7ICsraikgeworICAgICAgICAgICAgaWYgKGVDb3N0c1tpICsgMV1baiArIDFdID09CisgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFBCUVBOdW0+OjppbmZpbml0eSgpKSB7CisgICAgICAgICAgICAgIGVkLnVuc2FmZVtpXSA9IDE7CisgICAgICAgICAgICAgIGVkLnJldmVyc2VVbnNhZmVbal0gPSAxOworICAgICAgICAgICAgICArK3Jvd0luZkNvdW50c1tpXTsKKyAgICAgICAgICAgICAgKytjb2xJbmZDb3VudHNbal07CisKKyAgICAgICAgICAgICAgaWYgKGNvbEluZkNvdW50c1tqXSA+IGVkLndvcnN0KSB7CisgICAgICAgICAgICAgICAgZWQud29yc3QgPSBjb2xJbmZDb3VudHNbal07CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAocm93SW5mQ291bnRzW2ldID4gZWQucmV2ZXJzZVdvcnN0KSB7CisgICAgICAgICAgICAgICAgZWQucmV2ZXJzZVdvcnN0ID0gcm93SW5mQ291bnRzW2ldOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWQuaXNVcFRvRGF0ZSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIC8vIEFkZCB0aGUgY29udHJpYnV0aW9ucyBvZiB0aGUgZ2l2ZW4gZWRnZSB0byB0aGUgZ2l2ZW4gbm9kZSdzIAorICAgICAgLy8gbnVtRGVuaWVkIGFuZCBzYWZlIG1lbWJlcnMuIE5vIGFjdGlvbiBpcyB0YWtlbiBvdGhlciB0aGFuIHRvIHVwZGF0ZQorICAgICAgLy8gdGhlc2UgbWVtYmVyIHZhbHVlcy4gT25jZSB1cGRhdGVkIHRoZXNlIG51bWJlcnMgY2FuIGJlIHVzZWQgYnkgY2xpZW50cworICAgICAgLy8gdG8gdXBkYXRlIHRoZSBub2RlJ3MgYWxsb2NhYmlsaXR5LgorICAgICAgdm9pZCBhZGRFZGdlQ29udHJpYnV0aW9ucyhHcmFwaDo6RWRnZUl0ciBlSXRyLCBHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICAgIEVkZ2VEYXRhICZlZCA9IGdldEhldXJpc3RpY0VkZ2VEYXRhKGVJdHIpOworCisgICAgICAgIGFzc2VydChlZC5pc1VwVG9EYXRlICYmICJVc2luZyBvdXQtb2YtZGF0ZSBlZGdlIG51bWJlcnMuIik7CisKKyAgICAgICAgTm9kZURhdGEgJm5kID0gZ2V0SGV1cmlzdGljTm9kZURhdGEobkl0cik7CisgICAgICAgIHVuc2lnbmVkIG51bVJlZ3MgPSBnZXRHcmFwaCgpLmdldE5vZGVDb3N0cyhuSXRyKS5nZXRMZW5ndGgoKSAtIDE7CisgICAgICAgIAorICAgICAgICBib29sIG5Jc05vZGUxID0gbkl0ciA9PSBnZXRHcmFwaCgpLmdldEVkZ2VOb2RlMShlSXRyKTsKKyAgICAgICAgRWRnZURhdGE6OlVuc2FmZUFycmF5ICZ1bnNhZmUgPQorICAgICAgICAgIG5Jc05vZGUxID8gZWQudW5zYWZlIDogZWQucmV2ZXJzZVVuc2FmZTsKKyAgICAgICAgbmQubnVtRGVuaWVkICs9IG5Jc05vZGUxID8gZWQud29yc3QgOiBlZC5yZXZlcnNlV29yc3Q7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCByID0gMDsgciA8IG51bVJlZ3M7ICsrcikgeworICAgICAgICAgIGlmICh1bnNhZmVbcl0pIHsKKyAgICAgICAgICAgIGlmIChuZC51bnNhZmVEZWdyZWVzW3JdPT0wKSB7CisgICAgICAgICAgICAgIC0tbmQubnVtU2FmZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbmQudW5zYWZlRGVncmVlc1tyXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gU3VidHJhY3QgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgdGhlIGdpdmVuIGVkZ2UgdG8gdGhlIGdpdmVuIG5vZGUncyAKKyAgICAgIC8vIG51bURlbmllZCBhbmQgc2FmZSBtZW1iZXJzLiBObyBhY3Rpb24gaXMgdGFrZW4gb3RoZXIgdGhhbiB0byB1cGRhdGUKKyAgICAgIC8vIHRoZXNlIG1lbWJlciB2YWx1ZXMuIE9uY2UgdXBkYXRlZCB0aGVzZSBudW1iZXJzIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMKKyAgICAgIC8vIHRvIHVwZGF0ZSB0aGUgbm9kZSdzIGFsbG9jYWJpbGl0eS4KKyAgICAgIHZvaWQgc3VidHJhY3RFZGdlQ29udHJpYnV0aW9ucyhHcmFwaDo6RWRnZUl0ciBlSXRyLCBHcmFwaDo6Tm9kZUl0ciBuSXRyKSB7CisgICAgICAgIEVkZ2VEYXRhICZlZCA9IGdldEhldXJpc3RpY0VkZ2VEYXRhKGVJdHIpOworCisgICAgICAgIGFzc2VydChlZC5pc1VwVG9EYXRlICYmICJVc2luZyBvdXQtb2YtZGF0ZSBlZGdlIG51bWJlcnMuIik7CisKKyAgICAgICAgTm9kZURhdGEgJm5kID0gZ2V0SGV1cmlzdGljTm9kZURhdGEobkl0cik7CisgICAgICAgIHVuc2lnbmVkIG51bVJlZ3MgPSBnZXRHcmFwaCgpLmdldE5vZGVDb3N0cyhuSXRyKS5nZXRMZW5ndGgoKSAtIDE7CisgICAgICAgIAorICAgICAgICBib29sIG5Jc05vZGUxID0gbkl0ciA9PSBnZXRHcmFwaCgpLmdldEVkZ2VOb2RlMShlSXRyKTsKKyAgICAgICAgRWRnZURhdGE6OlVuc2FmZUFycmF5ICZ1bnNhZmUgPQorICAgICAgICAgIG5Jc05vZGUxID8gZWQudW5zYWZlIDogZWQucmV2ZXJzZVVuc2FmZTsKKyAgICAgICAgbmQubnVtRGVuaWVkIC09IG5Jc05vZGUxID8gZWQud29yc3QgOiBlZC5yZXZlcnNlV29yc3Q7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCByID0gMDsgciA8IG51bVJlZ3M7ICsrcikgeworICAgICAgICAgIGlmICh1bnNhZmVbcl0pIHsgCisgICAgICAgICAgICBpZiAobmQudW5zYWZlRGVncmVlc1tyXSA9PSAxKSB7CisgICAgICAgICAgICAgICsrbmQubnVtU2FmZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC0tbmQudW5zYWZlRGVncmVlc1tyXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdm9pZCB1cGRhdGVBbGxvY2FiaWxpdHkoR3JhcGg6Ok5vZGVJdHIgbkl0cikgeworICAgICAgICBOb2RlRGF0YSAmbmQgPSBnZXRIZXVyaXN0aWNOb2RlRGF0YShuSXRyKTsKKyAgICAgICAgdW5zaWduZWQgbnVtUmVncyA9IGdldEdyYXBoKCkuZ2V0Tm9kZUNvc3RzKG5JdHIpLmdldExlbmd0aCgpIC0gMTsKKyAgICAgICAgbmQuaXNBbGxvY2FibGUgPSBuZC5udW1EZW5pZWQgPCBudW1SZWdzIHx8IG5kLm51bVNhZmUgPiAwOworICAgICAgfQorCisgICAgICB2b2lkIGluaXRpYWxpemVOb2RlKEdyYXBoOjpOb2RlSXRyIG5JdHIpIHsKKyAgICAgICAgTm9kZURhdGEgJm5kID0gZ2V0SGV1cmlzdGljTm9kZURhdGEobkl0cik7CisKKyAgICAgICAgaWYgKG5kLmlzSW5pdGlhbGl6ZWQpCisgICAgICAgICAgcmV0dXJuOyAvLyBOb2RlIGRhdGEgaXMgYWxyZWFkeSB1cCB0byBkYXRlLgorCisgICAgICAgIHVuc2lnbmVkIG51bVJlZ3MgPSBnZXRHcmFwaCgpLmdldE5vZGVDb3N0cyhuSXRyKS5nZXRMZW5ndGgoKSAtIDE7CisKKyAgICAgICAgbmQubnVtRGVuaWVkID0gMDsKKyAgICAgICAgbmQubnVtU2FmZSA9IG51bVJlZ3M7CisgICAgICAgIG5kLnVuc2FmZURlZ3JlZXMucmVzaXplKG51bVJlZ3MsIDApOworCisgICAgICAgIHR5cGVkZWYgSGV1cmlzdGljU29sdmVySW1wbDxCcmlnZ3M+OjpTb2x2ZXJFZGdlSXRyIFNvbHZlckVkZ2VJdHI7CisKKyAgICAgICAgZm9yIChTb2x2ZXJFZGdlSXRyIGFlSXRyID0gZ2V0U29sdmVyKCkuc29sdmVyRWRnZXNCZWdpbihuSXRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlRW5kID0gZ2V0U29sdmVyKCkuc29sdmVyRWRnZXNFbmQobkl0cik7CisgICAgICAgICAgICAgYWVJdHIgIT0gYWVFbmQ7ICsrYWVJdHIpIHsKKyAgICAgICAgICAKKyAgICAgICAgICBHcmFwaDo6RWRnZUl0ciBlSXRyID0gKmFlSXRyOworICAgICAgICAgIGNvbXB1dGVFZGdlQ29udHJpYnV0aW9ucyhlSXRyKTsKKyAgICAgICAgICBhZGRFZGdlQ29udHJpYnV0aW9ucyhlSXRyLCBuSXRyKTsKKyAgICAgICAgfQorCisgICAgICAgIHVwZGF0ZUFsbG9jYWJpbGl0eShuSXRyKTsKKyAgICAgICAgbmQuaXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHZvaWQgaGFuZGxlUmVtb3ZlTm9kZShHcmFwaDo6Tm9kZUl0ciB4bkl0cikgeworICAgICAgICB0eXBlZGVmIEhldXJpc3RpY1NvbHZlckltcGw8QnJpZ2dzPjo6U29sdmVyRWRnZUl0ciBTb2x2ZXJFZGdlSXRyOworICAgICAgICBzdGQ6OnZlY3RvcjxHcmFwaDo6RWRnZUl0cj4gZWRnZXNUb1JlbW92ZTsKKyAgICAgICAgZm9yIChTb2x2ZXJFZGdlSXRyIGFlSXRyID0gZ2V0U29sdmVyKCkuc29sdmVyRWRnZXNCZWdpbih4bkl0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZUVuZCA9IGdldFNvbHZlcigpLnNvbHZlckVkZ2VzRW5kKHhuSXRyKTsKKyAgICAgICAgICAgICBhZUl0ciAhPSBhZUVuZDsgKythZUl0cikgeworICAgICAgICAgIEdyYXBoOjpOb2RlSXRyIHluSXRyID0gZ2V0R3JhcGgoKS5nZXRFZGdlT3RoZXJOb2RlKCphZUl0ciwgeG5JdHIpOworICAgICAgICAgIGhhbmRsZVJlbW92ZUVkZ2UoKmFlSXRyLCB5bkl0cik7CisgICAgICAgICAgZWRnZXNUb1JlbW92ZS5wdXNoX2JhY2soKmFlSXRyKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoIWVkZ2VzVG9SZW1vdmUuZW1wdHkoKSkgeworICAgICAgICAgIGdldFNvbHZlcigpLnJlbW92ZVNvbHZlckVkZ2UoZWRnZXNUb1JlbW92ZS5iYWNrKCkpOworICAgICAgICAgIGVkZ2VzVG9SZW1vdmUucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBSTkFsbG9jYWJsZUxpc3Qgcm5BbGxvY2FibGVMaXN0OworICAgICAgUk5VbmFsbG9jYWJsZUxpc3Qgcm5VbmFsbG9jYWJsZUxpc3Q7CisgICAgfTsKKworICB9Cit9CisKKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9QQlFQX0hFVVJJU1RJQ1NfQlJJR0dTX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1BCUVAvTWF0aC5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEJRUC9NYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1OThiZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1BCUVAvTWF0aC5oCkBAIC0wLDAgKzEsMjg4IEBACisvLz09PS0tLS0tLSBNYXRoLmggLSBQQlFQIFZlY3RvciBhbmQgTWF0cml4IGNsYXNzZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QQlFQX01BVEhfSCAKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BCUVBfTUFUSF9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgUEJRUCB7CisKK3R5cGVkZWYgZmxvYXQgUEJRUE51bTsKKworLy8vIFxicmllZiBQQlFQIFZlY3RvciBjbGFzcy4KK2NsYXNzIFZlY3RvciB7CisgIHB1YmxpYzoKKworICAgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgUEJRUCB2ZWN0b3Igb2YgdGhlIGdpdmVuIHNpemUuCisgICAgZXhwbGljaXQgVmVjdG9yKHVuc2lnbmVkIGxlbmd0aCkgOgorICAgICAgbGVuZ3RoKGxlbmd0aCksIGRhdGEobmV3IFBCUVBOdW1bbGVuZ3RoXSkgeworICAgICAgfQorCisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBQQlFQIHZlY3RvciB3aXRoIGluaXRpYWxpemVyLgorICAgIFZlY3Rvcih1bnNpZ25lZCBsZW5ndGgsIFBCUVBOdW0gaW5pdFZhbCkgOgorICAgICAgbGVuZ3RoKGxlbmd0aCksIGRhdGEobmV3IFBCUVBOdW1bbGVuZ3RoXSkgeworICAgICAgICBzdGQ6OmZpbGwoZGF0YSwgZGF0YSArIGxlbmd0aCwgaW5pdFZhbCk7CisgICAgICB9CisKKyAgICAvLy8gXGJyaWVmIENvcHkgY29uc3RydWN0IGEgUEJRUCB2ZWN0b3IuCisgICAgVmVjdG9yKGNvbnN0IFZlY3RvciAmdikgOgorICAgICAgbGVuZ3RoKHYubGVuZ3RoKSwgZGF0YShuZXcgUEJRUE51bVtsZW5ndGhdKSB7CisgICAgICAgIHN0ZDo6Y29weSh2LmRhdGEsIHYuZGF0YSArIGxlbmd0aCwgZGF0YSk7CisgICAgICB9CisKKyAgICAvLy8gXGJyaWVmIERlc3Ryb3kgdGhpcyB2ZWN0b3IsIHJldHVybiBpdHMgbWVtb3J5LgorICAgIH5WZWN0b3IoKSB7IGRlbGV0ZVtdIGRhdGE7IH0KKworICAgIC8vLyBcYnJpZWYgQXNzaWdubWVudCBvcGVyYXRvci4KKyAgICBWZWN0b3ImIG9wZXJhdG9yPShjb25zdCBWZWN0b3IgJnYpIHsKKyAgICAgIGRlbGV0ZVtdIGRhdGE7CisgICAgICBsZW5ndGggPSB2Lmxlbmd0aDsKKyAgICAgIGRhdGEgPSBuZXcgUEJRUE51bVtsZW5ndGhdOworICAgICAgc3RkOjpjb3B5KHYuZGF0YSwgdi5kYXRhICsgbGVuZ3RoLCBkYXRhKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IKKyAgICB1bnNpZ25lZCBnZXRMZW5ndGgoKSBjb25zdCB7CisgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRWxlbWVudCBhY2Nlc3MuCisgICAgUEJRUE51bSYgb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgeworICAgICAgYXNzZXJ0KGluZGV4IDwgbGVuZ3RoICYmICJWZWN0b3IgZWxlbWVudCBhY2Nlc3Mgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICAgIHJldHVybiBkYXRhW2luZGV4XTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIENvbnN0IGVsZW1lbnQgYWNjZXNzLgorICAgIGNvbnN0IFBCUVBOdW0mIG9wZXJhdG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpbmRleCA8IGxlbmd0aCAmJiAiVmVjdG9yIGVsZW1lbnQgYWNjZXNzIG91dCBvZiBib3VuZHMuIik7CisgICAgICByZXR1cm4gZGF0YVtpbmRleF07CisgICAgfQorCisgICAgLy8vIFxicmllZiBBZGQgYW5vdGhlciB2ZWN0b3IgdG8gdGhpcyBvbmUuCisgICAgVmVjdG9yJiBvcGVyYXRvcis9KGNvbnN0IFZlY3RvciAmdikgeworICAgICAgYXNzZXJ0KGxlbmd0aCA9PSB2Lmxlbmd0aCAmJiAiVmVjdG9yIGxlbmd0aCBtaXNtYXRjaC4iKTsKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGRhdGEsIGRhdGEgKyBsZW5ndGgsIHYuZGF0YSwgZGF0YSwgc3RkOjpwbHVzPFBCUVBOdW0+KCkpOyAKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFN1YnRyYWN0IGFub3RoZXIgdmVjdG9yIGZyb20gdGhpcyBvbmUuCisgICAgVmVjdG9yJiBvcGVyYXRvci09KGNvbnN0IFZlY3RvciAmdikgeworICAgICAgYXNzZXJ0KGxlbmd0aCA9PSB2Lmxlbmd0aCAmJiAiVmVjdG9yIGxlbmd0aCBtaXNtYXRjaC4iKTsKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGRhdGEsIGRhdGEgKyBsZW5ndGgsIHYuZGF0YSwgZGF0YSwgc3RkOjptaW51czxQQlFQTnVtPigpKTsgCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGlzIHZlY3RvcgorICAgIHVuc2lnbmVkIG1pbkluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6bWluX2VsZW1lbnQoZGF0YSwgZGF0YSArIGxlbmd0aCkgLSBkYXRhOworICAgIH0KKworICBwcml2YXRlOgorICAgIHVuc2lnbmVkIGxlbmd0aDsKKyAgICBQQlFQTnVtICpkYXRhOworfTsKKworLy8vIFxicmllZiBPdXRwdXQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB2ZWN0b3Igb24gdGhlIGdpdmVuCisvLy8gICAgICAgIG91dHB1dCBzdHJlYW0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT1N0cmVhbT4KK09TdHJlYW0mIG9wZXJhdG9yPDwoT1N0cmVhbSAmb3MsIGNvbnN0IFZlY3RvciAmdikgeworICBhc3NlcnQoKHYuZ2V0TGVuZ3RoKCkgIT0gMCkgJiYgIlplcm8tbGVuZ3RoIHZlY3RvciBiYWRuZXNzLiIpOworCisgIG9zIDw8ICJbICIgPDwgdlswXTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IHYuZ2V0TGVuZ3RoKCk7ICsraSkgeworICAgIG9zIDw8ICIsICIgPDwgdltpXTsKKyAgfQorICBvcyA8PCAiIF0iOworCisgIHJldHVybiBvczsKK30gCisKKworLy8vIFxicmllZiBQQlFQIE1hdHJpeCBjbGFzcworY2xhc3MgTWF0cml4IHsKKyAgcHVibGljOgorCisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBQQlFQIE1hdHJpeCB3aXRoIHRoZSBnaXZlbiBkaW1lbnNpb25zLgorICAgIE1hdHJpeCh1bnNpZ25lZCByb3dzLCB1bnNpZ25lZCBjb2xzKSA6CisgICAgICByb3dzKHJvd3MpLCBjb2xzKGNvbHMpLCBkYXRhKG5ldyBQQlFQTnVtW3Jvd3MgKiBjb2xzXSkgeworICAgIH0KKworICAgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgUEJRUCBNYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZGltZW5zaW9ucyBhbmQgaW5pdGlhbAorICAgIC8vLyB2YWx1ZS4KKyAgICBNYXRyaXgodW5zaWduZWQgcm93cywgdW5zaWduZWQgY29scywgUEJRUE51bSBpbml0VmFsKSA6CisgICAgICByb3dzKHJvd3MpLCBjb2xzKGNvbHMpLCBkYXRhKG5ldyBQQlFQTnVtW3Jvd3MgKiBjb2xzXSkgeworICAgICAgICBzdGQ6OmZpbGwoZGF0YSwgZGF0YSArIChyb3dzICogY29scyksIGluaXRWYWwpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgQ29weSBjb25zdHJ1Y3QgYSBQQlFQIG1hdHJpeC4KKyAgICBNYXRyaXgoY29uc3QgTWF0cml4ICZtKSA6CisgICAgICByb3dzKG0ucm93cyksIGNvbHMobS5jb2xzKSwgZGF0YShuZXcgUEJRUE51bVtyb3dzICogY29sc10pIHsKKyAgICAgICAgc3RkOjpjb3B5KG0uZGF0YSwgbS5kYXRhICsgKHJvd3MgKiBjb2xzKSwgZGF0YSk7ICAKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIERlc3Ryb3kgdGhpcyBtYXRyaXgsIHJldHVybiBpdHMgbWVtb3J5LgorICAgIH5NYXRyaXgoKSB7IGRlbGV0ZVtdIGRhdGE7IH0KKworICAgIC8vLyBcYnJpZWYgQXNzaWdubWVudCBvcGVyYXRvci4KKyAgICBNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBNYXRyaXggJm0pIHsKKyAgICAgIGRlbGV0ZVtdIGRhdGE7CisgICAgICByb3dzID0gbS5yb3dzOyBjb2xzID0gbS5jb2xzOworICAgICAgZGF0YSA9IG5ldyBQQlFQTnVtW3Jvd3MgKiBjb2xzXTsKKyAgICAgIHN0ZDo6Y29weShtLmRhdGEsIG0uZGF0YSArIChyb3dzICogY29scyksIGRhdGEpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGlzIG1hdHJpeC4KKyAgICB1bnNpZ25lZCBnZXRSb3dzKCkgY29uc3QgeyByZXR1cm4gcm93czsgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb2xzIGluIHRoaXMgbWF0cml4LgorICAgIHVuc2lnbmVkIGdldENvbHMoKSBjb25zdCB7IHJldHVybiBjb2xzOyB9CisKKyAgICAvLy8gXGJyaWVmIE1hdHJpeCBlbGVtZW50IGFjY2Vzcy4KKyAgICBQQlFQTnVtKiBvcGVyYXRvcltdKHVuc2lnbmVkIHIpIHsKKyAgICAgIGFzc2VydChyIDwgcm93cyAmJiAiUm93IG91dCBvZiBib3VuZHMuIik7CisgICAgICByZXR1cm4gZGF0YSArIChyICogY29scyk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBNYXRyaXggZWxlbWVudCBhY2Nlc3MuCisgICAgY29uc3QgUEJRUE51bSogb3BlcmF0b3JbXSh1bnNpZ25lZCByKSBjb25zdCB7CisgICAgICBhc3NlcnQociA8IHJvd3MgJiYgIlJvdyBvdXQgb2YgYm91bmRzLiIpOworICAgICAgcmV0dXJuIGRhdGEgKyAociAqIGNvbHMpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZ2l2ZW4gcm93IGFzIGEgdmVjdG9yLgorICAgIFZlY3RvciBnZXRSb3dBc1ZlY3Rvcih1bnNpZ25lZCByKSBjb25zdCB7CisgICAgICBWZWN0b3Igdihjb2xzKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBjb2xzOyArK2MpCisgICAgICAgIHZbY10gPSAoKnRoaXMpW3JdW2NdOworICAgICAgcmV0dXJuIHY7IAorICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZ2l2ZW4gY29sdW1uIGFzIGEgdmVjdG9yLgorICAgIFZlY3RvciBnZXRDb2xBc1ZlY3Rvcih1bnNpZ25lZCBjKSBjb25zdCB7CisgICAgICBWZWN0b3Igdihyb3dzKTsKKyAgICAgIGZvciAodW5zaWduZWQgciA9IDA7IHIgPCByb3dzOyArK3IpCisgICAgICAgIHZbcl0gPSAoKnRoaXMpW3JdW2NdOworICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXNldCB0aGUgbWF0cml4IHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICBNYXRyaXgmIHJlc2V0KFBCUVBOdW0gdmFsID0gMCkgeworICAgICAgc3RkOjpmaWxsKGRhdGEsIGRhdGEgKyAocm93cyAqIGNvbHMpLCB2YWwpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgU2V0IGEgc2luZ2xlIHJvdyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgTWF0cml4JiBzZXRSb3codW5zaWduZWQgciwgUEJRUE51bSB2YWwpIHsKKyAgICAgIGFzc2VydChyIDwgcm93cyAmJiAiUm93IG91dCBvZiBib3VuZHMuIik7CisgICAgICBzdGQ6OmZpbGwoZGF0YSArIChyICogY29scyksIGRhdGEgKyAoKHIgKyAxKSAqIGNvbHMpLCB2YWwpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgU2V0IGEgc2luZ2xlIGNvbHVtbiBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgTWF0cml4JiBzZXRDb2wodW5zaWduZWQgYywgUEJRUE51bSB2YWwpIHsKKyAgICAgIGFzc2VydChjIDwgY29scyAmJiAiQ29sdW1uIG91dCBvZiBib3VuZHMuIik7CisgICAgICBmb3IgKHVuc2lnbmVkIHIgPSAwOyByIDwgcm93czsgKytyKQorICAgICAgICAoKnRoaXMpW3JdW2NdID0gdmFsOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgTWF0cml4IHRyYW5zcG9zZS4KKyAgICBNYXRyaXggdHJhbnNwb3NlKCkgY29uc3QgeworICAgICAgTWF0cml4IG0oY29scywgcm93cyk7CisgICAgICBmb3IgKHVuc2lnbmVkIHIgPSAwOyByIDwgcm93czsgKytyKQorICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgY29sczsgKytjKQorICAgICAgICAgIG1bY11bcl0gPSAoKnRoaXMpW3JdW2NdOworICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGFzIGEgdmVjdG9yLgorICAgIC8vLworICAgIC8vLyBNYXRyaXggbXVzdCBiZSBzcXVhcmUuCisgICAgVmVjdG9yIGRpYWdvbmFsaXplKCkgY29uc3QgeworICAgICAgYXNzZXJ0KHJvd3MgPT0gY29scyAmJiAiQXR0ZW1wdCB0byBkaWFnb25hbGl6ZSBub24tc3F1YXJlIG1hdHJpeC4iKTsKKworICAgICAgVmVjdG9yIHYocm93cyk7CisgICAgICBmb3IgKHVuc2lnbmVkIHIgPSAwOyByIDwgcm93czsgKytyKQorICAgICAgICB2W3JdID0gKCp0aGlzKVtyXVtyXTsKKyAgICAgIHJldHVybiB2OworICAgIH0gCisKKyAgICAvLy8gXGJyaWVmIEFkZCB0aGUgZ2l2ZW4gbWF0cml4IHRvIHRoaXMgb25lLgorICAgIE1hdHJpeCYgb3BlcmF0b3IrPShjb25zdCBNYXRyaXggJm0pIHsKKyAgICAgIGFzc2VydChyb3dzID09IG0ucm93cyAmJiBjb2xzID09IG0uY29scyAmJgorICAgICAgICAgICJNYXRyaXggZGltZW5zaW9ucyBtaXNtYXRjaC4iKTsKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGRhdGEsIGRhdGEgKyAocm93cyAqIGNvbHMpLCBtLmRhdGEsIGRhdGEsCisgICAgICAgICAgc3RkOjpwbHVzPFBCUVBOdW0+KCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbWluaW11bSBvZiB0aGUgZ2l2ZW4gcm93CisgICAgUEJRUE51bSBnZXRSb3dNaW4odW5zaWduZWQgcikgY29uc3QgeworICAgICAgYXNzZXJ0KHIgPCByb3dzICYmICJSb3cgb3V0IG9mIGJvdW5kcyIpOworICAgICAgcmV0dXJuICpzdGQ6Om1pbl9lbGVtZW50KGRhdGEgKyAociAqIGNvbHMpLCBkYXRhICsgKChyICsgMSkgKiBjb2xzKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHRoZSBnaXZlbiBjb2x1bW4KKyAgICBQQlFQTnVtIGdldENvbE1pbih1bnNpZ25lZCBjKSBjb25zdCB7CisgICAgICBQQlFQTnVtIG1pbkVsZW0gPSAoKnRoaXMpWzBdW2NdOworICAgICAgZm9yICh1bnNpZ25lZCByID0gMTsgciA8IHJvd3M7ICsrcikKKyAgICAgICAgaWYgKCgqdGhpcylbcl1bY10gPCBtaW5FbGVtKSBtaW5FbGVtID0gKCp0aGlzKVtyXVtjXTsKKyAgICAgIHJldHVybiBtaW5FbGVtOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgU3VidHJhY3RzIHRoZSBnaXZlbiBzY2FsYXIgZnJvbSB0aGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIHJvdy4KKyAgICBNYXRyaXgmIHN1YkZyb21Sb3codW5zaWduZWQgciwgUEJRUE51bSB2YWwpIHsKKyAgICAgIGFzc2VydChyIDwgcm93cyAmJiAiUm93IG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGRhdGEgKyAociAqIGNvbHMpLCBkYXRhICsgKChyICsgMSkgKiBjb2xzKSwKKyAgICAgICAgICBkYXRhICsgKHIgKiBjb2xzKSwKKyAgICAgICAgICBzdGQ6OmJpbmQybmQoc3RkOjptaW51czxQQlFQTnVtPigpLCB2YWwpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gc2NhbGFyIGZyb20gdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBjb2x1bW4uCisgICAgTWF0cml4JiBzdWJGcm9tQ29sKHVuc2lnbmVkIGMsIFBCUVBOdW0gdmFsKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIHIgPSAwOyByIDwgcm93czsgKytyKQorICAgICAgICAoKnRoaXMpW3JdW2NdIC09IHZhbDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgemVybyBtYXRyaXguCisgICAgYm9vbCBpc1plcm8oKSBjb25zdCB7CisgICAgICByZXR1cm4gZmluZF9pZihkYXRhLCBkYXRhICsgKHJvd3MgKiBjb2xzKSwKKyAgICAgICAgICBzdGQ6OmJpbmQybmQoc3RkOjpub3RfZXF1YWxfdG88UEJRUE51bT4oKSwgMCkpID09CisgICAgICAgIGRhdGEgKyAocm93cyAqIGNvbHMpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHVuc2lnbmVkIHJvd3MsIGNvbHM7CisgICAgUEJRUE51bSAqZGF0YTsKK307CisKKy8vLyBcYnJpZWYgT3V0cHV0IGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbWF0cml4IG9uIHRoZSBnaXZlbgorLy8vICAgICAgICBvdXRwdXQgc3RyZWFtLgordGVtcGxhdGUgPHR5cGVuYW1lIE9TdHJlYW0+CitPU3RyZWFtJiBvcGVyYXRvcjw8KE9TdHJlYW0gJm9zLCBjb25zdCBNYXRyaXggJm0pIHsKKworICBhc3NlcnQoKG0uZ2V0Um93cygpICE9IDApICYmICJaZXJvLXJvdyBtYXRyaXggYmFkbmVzcy4iKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbS5nZXRSb3dzKCk7ICsraSkgeworICAgIG9zIDw8IG0uZ2V0Um93QXNWZWN0b3IoaSk7CisgIH0KKworICByZXR1cm4gb3M7Cit9CisKK30KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9QQlFQX01BVEhfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEJRUC9Tb2x1dGlvbi5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEJRUC9Tb2x1dGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NGI1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9QQlFQL1NvbHV0aW9uLmgKQEAgLTAsMCArMSw1OCBAQAorLy89PT0tLSBTb2x1dGlvbi5oIC0tLS0tLS0gUEJRUCBTb2x1dGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQQlFQIFNvbHV0aW9uIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfU09MVVRJT05fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEJRUF9TT0xVVElPTl9ICisKKyNpbmNsdWRlICJNYXRoLmgiCisjaW5jbHVkZSAiR3JhcGguaCIKKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIFBCUVAgeworCisgIC8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHNvbHV0aW9uIHRvIGEgUEJRUCBwcm9ibGVtLgorICAvLy8KKyAgLy8vIFRvIGdldCB0aGUgc2VsZWN0aW9uIGZvciBlYWNoIG5vZGUgaW4gdGhlIHByb2JsZW0gdXNlIHRoZSBnZXRTZWxlY3Rpb24gbWV0aG9kLgorICBjbGFzcyBTb2x1dGlvbiB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxHcmFwaDo6Tm9kZUl0ciwgdW5zaWduZWQsIE5vZGVJdHJDb21wYXJhdG9yPiBTZWxlY3Rpb25zTWFwOworICAgIFNlbGVjdGlvbnNNYXAgc2VsZWN0aW9uczsKKworICBwdWJsaWM6CisKKyAgICAvLy8gXGJyaWVmIE51bWJlciBvZiBub2RlcyBmb3Igd2hpY2ggc2VsZWN0aW9ucyBoYXZlIGJlZW4gbWFkZS4KKyAgICAvLy8gQHJldHVybiBOdW1iZXIgb2Ygbm9kZXMgZm9yIHdoaWNoIHNlbGVjdGlvbnMgaGF2ZSBiZWVuIG1hZGUuCisgICAgdW5zaWduZWQgbnVtTm9kZXMoKSBjb25zdCB7IHJldHVybiBzZWxlY3Rpb25zLnNpemUoKTsgfQorCisgICAgLy8vIFxicmllZiBTZXQgdGhlIHNlbGVjdGlvbiBmb3IgYSBnaXZlbiBub2RlLgorICAgIC8vLyBAcGFyYW0gbkl0ciBOb2RlIGl0ZXJhdG9yLgorICAgIC8vLyBAcGFyYW0gc2VsZWN0aW9uIFNlbGVjdGlvbiBmb3Igbkl0ci4KKyAgICB2b2lkIHNldFNlbGVjdGlvbihHcmFwaDo6Tm9kZUl0ciBuSXRyLCB1bnNpZ25lZCBzZWxlY3Rpb24pIHsKKyAgICAgIHNlbGVjdGlvbnNbbkl0cl0gPSBzZWxlY3Rpb247CisgICAgfQorCisgICAgLy8vIFxicmllZiBHZXQgYSBub2RlJ3Mgc2VsZWN0aW9uLgorICAgIC8vLyBAcGFyYW0gbkl0ciBOb2RlIGl0ZXJhdG9yLgorICAgIC8vLyBAcmV0dXJuIFRoZSBzZWxlY3Rpb24gZm9yIG5JdHI7CisgICAgdW5zaWduZWQgZ2V0U2VsZWN0aW9uKEdyYXBoOjpOb2RlSXRyIG5JdHIpIGNvbnN0IHsKKyAgICAgIFNlbGVjdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIHNJdHIgPSBzZWxlY3Rpb25zLmZpbmQobkl0cik7CisgICAgICBhc3NlcnQoc0l0ciAhPSBzZWxlY3Rpb25zLmVuZCgpICYmICJObyBzZWxlY3Rpb24gZm9yIG5vZGUuIik7CisgICAgICByZXR1cm4gc0l0ci0+c2Vjb25kOworICAgIH0KKworICB9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUEJRUF9TT0xVVElPTl9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9QSElFbGltaW5hdGlvbi5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9QSElFbGltaW5hdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3MTM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1BISUVsaW1pbmF0aW9uLmNwcApAQCAtMCwwICsxLDM2NyBAQAorLy89PT0tLSBQaGlFbGltaW5hdGlvbi5jcHAgLSBFbGltaW5hdGUgUEhJIG5vZGVzIGJ5IGluc2VydGluZyBjb3BpZXMgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgZWxpbWluYXRlcyBtYWNoaW5lIGluc3RydWN0aW9uIFBISSBub2RlcyBieSBpbnNlcnRpbmcgY29weQorLy8gaW5zdHJ1Y3Rpb25zLiAgVGhpcyBkZXN0cm95cyBTU0EgaW5mb3JtYXRpb24sIGJ1dCBpcyB0aGUgZGVzaXJlZCBpbnB1dCBmb3IKKy8vIHNvbWUgcmVnaXN0ZXIgYWxsb2NhdG9ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInBoaWVsaW0iCisjaW5jbHVkZSAiUEhJRWxpbWluYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1BdG9taWMsICJOdW1iZXIgb2YgYXRvbWljIHBoaXMgbG93ZXJlZCIpOworU1RBVElTVElDKE51bVJldXNlZCwgIk51bWJlciBvZiByZXVzZWQgbG93ZXJlZCBwaGlzIik7CisKK2NoYXIgUEhJRWxpbWluYXRpb246OklEID0gMDsKK3N0YXRpYyBSZWdpc3RlclBhc3M8UEhJRWxpbWluYXRpb24+CitYKCJwaGktbm9kZS1lbGltaW5hdGlvbiIsICJFbGltaW5hdGUgUEhJIG5vZGVzIGZvciByZWdpc3RlciBhbGxvY2F0aW9uIik7CisKK2NoYXIgJmxsdm06OlBISUVsaW1pbmF0aW9uSUQgPSBQSElFbGltaW5hdGlvbjo6SUQ7CisKK3ZvaWQgbGx2bTo6UEhJRWxpbWluYXRpb246OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuYWRkUHJlc2VydmVkPExpdmVWYXJpYWJsZXM+KCk7CisgIEFVLmFkZFByZXNlcnZlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgLy8gcmRhcjovLzc0MDE3ODQgVGhpcyB3b3VsZCBiZSBuaWNlOgorICAvLyBBVS5hZGRQcmVzZXJ2ZWRJRChNYWNoaW5lTG9vcEluZm9JRCk7CisgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworfQorCitib29sIGxsdm06OlBISUVsaW1pbmF0aW9uOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIE1SSSA9ICZNRi5nZXRSZWdJbmZvKCk7CisKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gU3BsaXQgY3JpdGljYWwgZWRnZXMgdG8gaGVscCB0aGUgY29hbGVzY2VyCisgIGlmIChMaXZlVmFyaWFibGVzICpMViA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8TGl2ZVZhcmlhYmxlcz4oKSkKKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBDaGFuZ2VkIHw9IFNwbGl0UEhJRWRnZXMoTUYsICpJLCAqTFYpOworCisgIC8vIFBvcHVsYXRlIFZSZWdQSElVc2VDb3VudAorICBhbmFseXplUEhJTm9kZXMoTUYpOworCisgIC8vIEVsaW1pbmF0ZSBQSEkgaW5zdHJ1Y3Rpb25zIGJ5IGluc2VydGluZyBjb3BpZXMgaW50byBwcmVkZWNlc3NvciBibG9ja3MuCisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gTUYuYmVnaW4oKSwgRSA9IE1GLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBDaGFuZ2VkIHw9IEVsaW1pbmF0ZVBISU5vZGVzKE1GLCAqSSk7CisKKyAgLy8gUmVtb3ZlIGRlYWQgSU1QTElDSVRfREVGIGluc3RydWN0aW9ucy4KKyAgZm9yIChTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0Pjo6aXRlcmF0b3IgSSA9IEltcERlZnMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBJbXBEZWZzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE1hY2hpbmVJbnN0ciAqRGVmTUkgPSAqSTsKKyAgICB1bnNpZ25lZCBEZWZSZWcgPSBEZWZNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICBpZiAoTVJJLT51c2Vfbm9kYmdfZW1wdHkoRGVmUmVnKSkKKyAgICAgIERlZk1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorCisgIC8vIENsZWFuIHVwIHRoZSBsb3dlcmVkIFBISSBpbnN0cnVjdGlvbnMuCisgIGZvciAoTG93ZXJlZFBISU1hcDo6aXRlcmF0b3IgSSA9IExvd2VyZWRQSElzLmJlZ2luKCksIEUgPSBMb3dlcmVkUEhJcy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBNRi5EZWxldGVNYWNoaW5lSW5zdHIoSS0+Zmlyc3QpOworCisgIExvd2VyZWRQSElzLmNsZWFyKCk7CisgIEltcERlZnMuY2xlYXIoKTsKKyAgVlJlZ1BISVVzZUNvdW50LmNsZWFyKCk7CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBFbGltaW5hdGVQSElOb2RlcyAtIEVsaW1pbmF0ZSBwaGkgbm9kZXMgYnkgaW5zZXJ0aW5nIGNvcHkgaW5zdHJ1Y3Rpb25zIGluCisvLy8gcHJlZGVjZXNzb3IgYmFzaWMgYmxvY2tzLgorLy8vCitib29sIGxsdm06OlBISUVsaW1pbmF0aW9uOjpFbGltaW5hdGVQSElOb2RlcyhNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgeworICBpZiAoTUJCLmVtcHR5KCkgfHwgIU1CQi5mcm9udCgpLmlzUEhJKCkpCisgICAgcmV0dXJuIGZhbHNlOyAgIC8vIFF1aWNrIGV4aXQgZm9yIGJhc2ljIGJsb2NrcyB3aXRob3V0IFBISXMuCisKKyAgLy8gR2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBhZnRlciB0aGUgbGFzdCBQSEkgbm9kZSAodGhpcyBtYXkKKyAgLy8gYWxzbyBiZSB0aGUgZW5kIG9mIHRoZSBiYXNpYyBibG9jaykuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBBZnRlclBISXNJdCA9IFNraXBQSElzQW5kTGFiZWxzKE1CQiwgTUJCLmJlZ2luKCkpOworCisgIHdoaWxlIChNQkIuZnJvbnQoKS5pc1BISSgpKQorICAgIExvd2VyQXRvbWljUEhJTm9kZShNQkIsIEFmdGVyUEhJc0l0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzU291cmNlRGVmaW5lZEJ5SW1wbGljaXREZWYgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgc291cmNlcyBvZiB0aGUgcGhpIG5vZGUKKy8vLyBhcmUgaW1wbGljaXRfZGVmJ3MuCitzdGF0aWMgYm9vbCBpc1NvdXJjZURlZmluZWRCeUltcGxpY2l0RGVmKGNvbnN0IE1hY2hpbmVJbnN0ciAqTVBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgIT0gTVBoaS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSArPSAyKSB7CisgICAgdW5zaWduZWQgU3JjUmVnID0gTVBoaS0+Z2V0T3BlcmFuZChpKS5nZXRSZWcoKTsKKyAgICBjb25zdCBNYWNoaW5lSW5zdHIgKkRlZk1JID0gTVJJLT5nZXRWUmVnRGVmKFNyY1JlZyk7CisgICAgaWYgKCFEZWZNSSB8fCAhRGVmTUktPmlzSW1wbGljaXREZWYoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmluZENvcHlJbnNlcnRQb2ludCAtIEZpbmQgYSBzYWZlIHBsYWNlIGluIE1CQiB0byBpbnNlcnQgYSBjb3B5IGZyb20gU3JjUmVnCisvLyB3aGVuIGZvbGxvd2luZyB0aGUgQ0ZHIGVkZ2UgdG8gU3VjY01CQi4gVGhpcyBuZWVkcyB0byBiZSBhZnRlciBhbnkgZGVmIG9mCisvLyBTcmNSZWcsIGJ1dCBiZWZvcmUgYW55IHN1YnNlcXVlbnQgcG9pbnQgd2hlcmUgY29udHJvbCBmbG93IG1pZ2h0IGp1bXAgb3V0IG9mCisvLyB0aGUgYmFzaWMgYmxvY2suCitNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IKK2xsdm06OlBISUVsaW1pbmF0aW9uOjpGaW5kQ29weUluc2VydFBvaW50KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmU3VjY01CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZykgeworICAvLyBIYW5kbGUgdGhlIHRyaXZpYWwgY2FzZSB0cml2aWFsbHkuCisgIGlmIChNQkIuZW1wdHkoKSkKKyAgICByZXR1cm4gTUJCLmJlZ2luKCk7CisKKyAgcmV0dXJuIE1CQi5nZXRGaXJzdFRlcm1pbmF0b3IoKTsKK30KKworLy8vIExvd2VyQXRvbWljUEhJTm9kZSAtIExvd2VyIHRoZSBQSEkgbm9kZSBhdCB0aGUgdG9wIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2ssCisvLy8gdW5kZXIgdGhlIGFzc3VwdGlvbiB0aGF0IGl0IG5lZWRzIHRvIGJlIGxvd2VyZWQgaW4gYSB3YXkgdGhhdCBzdXBwb3J0cworLy8vIGF0b21pYyBleGVjdXRpb24gb2YgUEhJcy4gIFRoaXMgbG93ZXJpbmcgbWV0aG9kIGlzIGFsd2F5cyBjb3JyZWN0IGFsbCBvZiB0aGUKKy8vLyB0aW1lLgorLy8vCit2b2lkIGxsdm06OlBISUVsaW1pbmF0aW9uOjpMb3dlckF0b21pY1BISU5vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBBZnRlclBISXNJdCkgeworICArK051bUF0b21pYzsKKyAgLy8gVW5saW5rIHRoZSBQSEkgbm9kZSBmcm9tIHRoZSBiYXNpYyBibG9jaywgYnV0IGRvbid0IGRlbGV0ZSB0aGUgUEhJIHlldC4KKyAgTWFjaGluZUluc3RyICpNUGhpID0gTUJCLnJlbW92ZShNQkIuYmVnaW4oKSk7CisKKyAgdW5zaWduZWQgTnVtU3JjcyA9IChNUGhpLT5nZXROdW1PcGVyYW5kcygpIC0gMSkgLyAyOworICB1bnNpZ25lZCBEZXN0UmVnID0gTVBoaS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgYm9vbCBpc0RlYWQgPSBNUGhpLT5nZXRPcGVyYW5kKDApLmlzRGVhZCgpOworCisgIC8vIENyZWF0ZSBhIG5ldyByZWdpc3RlciBmb3IgdGhlIGluY29taW5nIFBISSBhcmd1bWVudHMuCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICB1bnNpZ25lZCBJbmNvbWluZ1JlZyA9IDA7CisgIGJvb2wgcmV1c2VkSW5jb21pbmcgPSBmYWxzZTsgIC8vIElzIEluY29taW5nUmVnIHJldXNlZCBmcm9tIGFuIGVhcmxpZXIgUEhJPworCisgIC8vIEluc2VydCBhIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyIGNvcHkgYXQgdGhlIHRvcCBvZiB0aGUgY3VycmVudCBibG9jayAoYnV0CisgIC8vIGFmdGVyIGFueSByZW1haW5pbmcgcGhpIG5vZGVzKSB3aGljaCBjb3BpZXMgdGhlIG5ldyBpbmNvbWluZyByZWdpc3RlcgorICAvLyBpbnRvIHRoZSBwaGkgbm9kZSBkZXN0aW5hdGlvbi4KKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBNRi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKTsKKyAgaWYgKGlzU291cmNlRGVmaW5lZEJ5SW1wbGljaXREZWYoTVBoaSwgTVJJKSkKKyAgICAvLyBJZiBhbGwgc291cmNlcyBvZiBhIFBISSBub2RlIGFyZSBpbXBsaWNpdF9kZWYsIGp1c3QgZW1pdCBhbgorICAgIC8vIGltcGxpY2l0X2RlZiBpbnN0ZWFkIG9mIGEgY29weS4KKyAgICBCdWlsZE1JKE1CQiwgQWZ0ZXJQSElzSXQsIE1QaGktPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICBUSUktPmdldChUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRiksIERlc3RSZWcpOworICBlbHNlIHsKKyAgICAvLyBDYW4gd2UgcmV1c2UgYW4gZWFybGllciBQSEkgbm9kZT8gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIGNyaXRpY2FsIGVkZ2VzLAorICAgIC8vIHR5cGljYWxseSB0aG9zZSBjcmVhdGVkIGJ5IHRhaWwgZHVwbGljYXRpb24uCisgICAgdW5zaWduZWQgJmVudHJ5ID0gTG93ZXJlZFBISXNbTVBoaV07CisgICAgaWYgKGVudHJ5KSB7CisgICAgICAvLyBBbiBpZGVudGljYWwgUEhJIG5vZGUgd2FzIGFscmVhZHkgbG93ZXJlZC4gUmV1c2UgdGhlIGluY29taW5nIHJlZ2lzdGVyLgorICAgICAgSW5jb21pbmdSZWcgPSBlbnRyeTsKKyAgICAgIHJldXNlZEluY29taW5nID0gdHJ1ZTsKKyAgICAgICsrTnVtUmV1c2VkOworICAgICAgREVCVUcoZGJncygpIDw8ICJSZXVzaW5nICVyZWciIDw8IEluY29taW5nUmVnIDw8ICIgZm9yICIgPDwgKk1QaGkpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IE1GLmdldFJlZ0luZm8oKS5nZXRSZWdDbGFzcyhEZXN0UmVnKTsKKyAgICAgIGVudHJ5ID0gSW5jb21pbmdSZWcgPSBNRi5nZXRSZWdJbmZvKCkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgICB9CisgICAgQnVpbGRNSShNQkIsIEFmdGVyUEhJc0l0LCBNUGhpLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgRGVzdFJlZykKKyAgICAgIC5hZGRSZWcoSW5jb21pbmdSZWcpOworICB9CisKKyAgLy8gVXBkYXRlIGxpdmUgdmFyaWFibGUgaW5mb3JtYXRpb24gaWYgdGhlcmUgaXMgYW55LgorICBMaXZlVmFyaWFibGVzICpMViA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8TGl2ZVZhcmlhYmxlcz4oKTsKKyAgaWYgKExWKSB7CisgICAgTWFjaGluZUluc3RyICpQSElDb3B5ID0gcHJpb3IoQWZ0ZXJQSElzSXQpOworCisgICAgaWYgKEluY29taW5nUmVnKSB7CisgICAgICBMaXZlVmFyaWFibGVzOjpWYXJJbmZvICZWSSA9IExWLT5nZXRWYXJJbmZvKEluY29taW5nUmVnKTsKKworICAgICAgLy8gSW5jcmVtZW50IHVzZSBjb3VudCBvZiB0aGUgbmV3bHkgY3JlYXRlZCB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgICAgVkkuTnVtVXNlcysrOworICAgICAgTFYtPnNldFBISUpvaW4oSW5jb21pbmdSZWcpOworCisgICAgICAvLyBXaGVuIHdlIGFyZSByZXVzaW5nIHRoZSBpbmNvbWluZyByZWdpc3RlciwgaXQgbWF5IGFscmVhZHkgaGF2ZSBiZWVuCisgICAgICAvLyBraWxsZWQgaW4gdGhpcyBibG9jay4gVGhlIG9sZCBraWxsIHdpbGwgYWxzbyBoYXZlIGJlZW4gaW5zZXJ0ZWQgYXQKKyAgICAgIC8vIEFmdGVyUEhJc0l0LCBzbyBpdCBhcHBlYXJzIGJlZm9yZSB0aGUgY3VycmVudCBQSElDb3B5LgorICAgICAgaWYgKHJldXNlZEluY29taW5nKQorICAgICAgICBpZiAoTWFjaGluZUluc3RyICpPbGRLaWxsID0gVkkuZmluZEtpbGwoJk1CQikpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlbW92ZSBvbGQga2lsbCBmcm9tICIgPDwgKk9sZEtpbGwpOworICAgICAgICAgIExWLT5yZW1vdmVWaXJ0dWFsUmVnaXN0ZXJLaWxsZWQoSW5jb21pbmdSZWcsIE9sZEtpbGwpOworICAgICAgICAgIERFQlVHKE1CQi5kdW1wKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIEFkZCBpbmZvcm1hdGlvbiB0byBMaXZlVmFyaWFibGVzIHRvIGtub3cgdGhhdCB0aGUgaW5jb21pbmcgdmFsdWUgaXMKKyAgICAgIC8vIGtpbGxlZC4gIE5vdGUgdGhhdCBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBkZWZpbmVkIGluIHNldmVyYWwgcGxhY2VzIChvbmNlCisgICAgICAvLyBlYWNoIGZvciBlYWNoIGluY29taW5nIGJsb2NrKSwgdGhlICJkZWYiIGJsb2NrIGFuZCBpbnN0cnVjdGlvbiBmaWVsZHMKKyAgICAgIC8vIGZvciB0aGUgVmFySW5mbyBpcyBub3QgZmlsbGVkIGluLgorICAgICAgTFYtPmFkZFZpcnR1YWxSZWdpc3RlcktpbGxlZChJbmNvbWluZ1JlZywgUEhJQ29weSk7CisgICAgfQorCisgICAgLy8gU2luY2Ugd2UgYXJlIGdvaW5nIHRvIGJlIGRlbGV0aW5nIHRoZSBQSEkgbm9kZSwgaWYgaXQgaXMgdGhlIGxhc3QgdXNlIG9mCisgICAgLy8gYW55IHJlZ2lzdGVycywgb3IgaWYgdGhlIHZhbHVlIGl0c2VsZiBpcyBkZWFkLCB3ZSBuZWVkIHRvIG1vdmUgdGhpcworICAgIC8vIGluZm9ybWF0aW9uIG92ZXIgdG8gdGhlIG5ldyBjb3B5IHdlIGp1c3QgaW5zZXJ0ZWQuCisgICAgTFYtPnJlbW92ZVZpcnR1YWxSZWdpc3RlcnNLaWxsZWQoTVBoaSk7CisKKyAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGRlYWQsIHVwZGF0ZSBMVi4KKyAgICBpZiAoaXNEZWFkKSB7CisgICAgICBMVi0+YWRkVmlydHVhbFJlZ2lzdGVyRGVhZChEZXN0UmVnLCBQSElDb3B5KTsKKyAgICAgIExWLT5yZW1vdmVWaXJ0dWFsUmVnaXN0ZXJEZWFkKERlc3RSZWcsIE1QaGkpOworICAgIH0KKyAgfQorCisgIC8vIEFkanVzdCB0aGUgVlJlZ1BISVVzZUNvdW50IG1hcCB0byBhY2NvdW50IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIFBISSBub2RlLgorICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IE1QaGktPmdldE51bU9wZXJhbmRzKCk7IGkgKz0gMikKKyAgICAtLVZSZWdQSElVc2VDb3VudFtCQlZSZWdQYWlyKE1QaGktPmdldE9wZXJhbmQoaSsxKS5nZXRNQkIoKS0+Z2V0TnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUGhpLT5nZXRPcGVyYW5kKGkpLmdldFJlZygpKV07CisKKyAgLy8gTm93IGxvb3Agb3ZlciBhbGwgb2YgdGhlIGluY29taW5nIGFyZ3VtZW50cywgY2hhbmdpbmcgdGhlbSB0byBjb3B5IGludG8gdGhlCisgIC8vIEluY29taW5nUmVnIHJlZ2lzdGVyIGluIHRoZSBjb3JyZXNwb25kaW5nIHByZWRlY2Vzc29yIGJhc2ljIGJsb2NrLgorICBTbWFsbFB0clNldDxNYWNoaW5lQmFzaWNCbG9jayosIDg+IE1CQnNJbnNlcnRlZEludG87CisgIGZvciAoaW50IGkgPSBOdW1TcmNzIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICB1bnNpZ25lZCBTcmNSZWcgPSBNUGhpLT5nZXRPcGVyYW5kKGkqMisxKS5nZXRSZWcoKTsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihTcmNSZWcpICYmCisgICAgICAgICAgICJNYWNoaW5lIFBISSBPcGVyYW5kcyBtdXN0IGFsbCBiZSB2aXJ0dWFsIHJlZ2lzdGVycyEiKTsKKworICAgIC8vIEdldCB0aGUgTWFjaGluZUJhc2ljQmxvY2sgZXF1aXZhbGVudCBvZiB0aGUgQmFzaWNCbG9jayB0aGF0IGlzIHRoZSBzb3VyY2UKKyAgICAvLyBwYXRoIHRoZSBQSEkuCisgICAgTWFjaGluZUJhc2ljQmxvY2sgJm9wQmxvY2sgPSAqTVBoaS0+Z2V0T3BlcmFuZChpKjIrMikuZ2V0TUJCKCk7CisKKyAgICAvLyBJZiBzb3VyY2UgaXMgZGVmaW5lZCBieSBhbiBpbXBsaWNpdCBkZWYsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5zZXJ0IGEKKyAgICAvLyBjb3B5LgorICAgIE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBNUkktPmdldFZSZWdEZWYoU3JjUmVnKTsKKyAgICBpZiAoRGVmTUktPmlzSW1wbGljaXREZWYoKSkgeworICAgICAgSW1wRGVmcy5pbnNlcnQoRGVmTUkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgYWxyZWFkeSBlbWl0dGVkIHRoZSBjb3B5IGZvciB0aGlzIGJsb2NrLgorICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBiZWNhdXNlIFBISSBub2RlcyBtYXkgaGF2ZSBtdWx0aXBsZSBlbnRyaWVzIGZvciB0aGUgc2FtZQorICAgIC8vIGJhc2ljIGJsb2NrLgorICAgIGlmICghTUJCc0luc2VydGVkSW50by5pbnNlcnQoJm9wQmxvY2spKQorICAgICAgY29udGludWU7ICAvLyBJZiB0aGUgY29weSBoYXMgYWxyZWFkeSBiZWVuIGVtaXR0ZWQsIHdlJ3JlIGRvbmUuCisKKyAgICAvLyBGaW5kIGEgc2FmZSBsb2NhdGlvbiB0byBpbnNlcnQgdGhlIGNvcHksIHRoaXMgbWF5IGJlIHRoZSBmaXJzdCB0ZXJtaW5hdG9yCisgICAgLy8gaW4gdGhlIGJsb2NrIChvciBlbmQoKSkuCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFBvcyA9CisgICAgICBGaW5kQ29weUluc2VydFBvaW50KG9wQmxvY2ssIE1CQiwgU3JjUmVnKTsKKworICAgIC8vIEluc2VydCB0aGUgY29weS4KKyAgICBpZiAoIXJldXNlZEluY29taW5nICYmIEluY29taW5nUmVnKQorICAgICAgQnVpbGRNSShvcEJsb2NrLCBJbnNlcnRQb3MsIE1QaGktPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksIEluY29taW5nUmVnKS5hZGRSZWcoU3JjUmVnKTsKKworICAgIC8vIE5vdyB1cGRhdGUgbGl2ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiBpZiB3ZSBoYXZlIGl0LiAgT3RoZXJ3aXNlIHdlJ3JlIGRvbmUKKyAgICBpZiAoIUxWKSBjb250aW51ZTsKKworICAgIC8vIFdlIHdhbnQgdG8gYmUgYWJsZSB0byBpbnNlcnQgYSBraWxsIG9mIHRoZSByZWdpc3RlciBpZiB0aGlzIFBISSAoYWthLCB0aGUKKyAgICAvLyBjb3B5IHdlIGp1c3QgaW5zZXJ0ZWQpIGlzIHRoZSBsYXN0IHVzZSBvZiB0aGUgc291cmNlIHZhbHVlLiAgTGl2ZQorICAgIC8vIHZhcmlhYmxlIGFuYWx5c2lzIGNvbnNlcnZhdGl2ZWx5IGhhbmRsZXMgdGhpcyBieSBzYXlpbmcgdGhhdCB0aGUgdmFsdWUgaXMKKyAgICAvLyBsaXZlIHVudGlsIHRoZSBlbmQgb2YgdGhlIGJsb2NrIHRoZSBQSEkgZW50cnkgbGl2ZXMgaW4uICBJZiB0aGUgdmFsdWUKKyAgICAvLyByZWFsbHkgaXMgZGVhZCBhdCB0aGUgUEhJIGNvcHksIHRoZXJlIHdpbGwgYmUgbm8gc3VjY2Vzc29yIGJsb2NrcyB3aGljaAorICAgIC8vIGhhdmUgdGhlIHZhbHVlIGxpdmUtaW4uCisKKyAgICAvLyBBbHNvIGNoZWNrIHRvIHNlZSBpZiB0aGlzIHJlZ2lzdGVyIGlzIGluIHVzZSBieSBhbm90aGVyIFBISSBub2RlIHdoaWNoCisgICAgLy8gaGFzIG5vdCB5ZXQgYmVlbiBlbGltaW5hdGVkLiAgSWYgc28sIGl0IHdpbGwgYmUga2lsbGVkIGF0IGFuIGFwcHJvcHJpYXRlCisgICAgLy8gcG9pbnQgbGF0ZXIuCisKKyAgICAvLyBJcyBpdCB1c2VkIGJ5IGFueSBQSEkgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgYmxvY2s/CisgICAgYm9vbCBWYWx1ZUlzVXNlZCA9IFZSZWdQSElVc2VDb3VudFtCQlZSZWdQYWlyKG9wQmxvY2suZ2V0TnVtYmVyKCksIFNyY1JlZyldOworCisgICAgLy8gT2theSwgaWYgd2Ugbm93IGtub3cgdGhhdCB0aGUgdmFsdWUgaXMgbm90IGxpdmUgb3V0IG9mIHRoZSBibG9jaywgd2UgY2FuCisgICAgLy8gYWRkIGEga2lsbCBtYXJrZXIgaW4gdGhpcyBibG9jayBzYXlpbmcgdGhhdCBpdCBraWxscyB0aGUgaW5jb21pbmcgdmFsdWUhCisgICAgaWYgKCFWYWx1ZUlzVXNlZCAmJiAhTFYtPmlzTGl2ZU91dChTcmNSZWcsIG9wQmxvY2spKSB7CisgICAgICAvLyBJbiBvdXIgZmluYWwgdHdpc3QsIHdlIGhhdmUgdG8gZGVjaWRlIHdoaWNoIGluc3RydWN0aW9uIGtpbGxzIHRoZQorICAgICAgLy8gcmVnaXN0ZXIuICBJbiBtb3N0IGNhc2VzIHRoaXMgaXMgdGhlIGNvcHksIGhvd2V2ZXIsIHRoZSBmaXJzdAorICAgICAgLy8gdGVybWluYXRvciBpbnN0cnVjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayBtYXkgYWxzbyB1c2UgdGhlIHZhbHVlLgorICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgbWFyayAqaXQqIGFzIGJlaW5nIHRoZSBraWxsaW5nIGJsb2NrLCBub3QgdGhlCisgICAgICAvLyBjb3B5LgorICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEtpbGxJbnN0OworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFRlcm0gPSBvcEJsb2NrLmdldEZpcnN0VGVybWluYXRvcigpOworICAgICAgaWYgKFRlcm0gIT0gb3BCbG9jay5lbmQoKSAmJiBUZXJtLT5yZWFkc1JlZ2lzdGVyKFNyY1JlZykpIHsKKyAgICAgICAgS2lsbEluc3QgPSBUZXJtOworCisgICAgICAgIC8vIENoZWNrIHRoYXQgbm8gb3RoZXIgdGVybWluYXRvcnMgdXNlIHZhbHVlcy4KKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFRJID0gbGx2bTo6bmV4dChUZXJtKTsKKyAgICAgICAgICAgICBUSSAhPSBvcEJsb2NrLmVuZCgpOyArK1RJKSB7CisgICAgICAgICAgYXNzZXJ0KCFUSS0+cmVhZHNSZWdpc3RlcihTcmNSZWcpICYmCisgICAgICAgICAgICAgICAgICJUZXJtaW5hdG9yIGluc3RydWN0aW9ucyBjYW5ub3QgdXNlIHZpcnR1YWwgcmVnaXN0ZXJzIHVubGVzcyIKKyAgICAgICAgICAgICAgICAgInRoZXkgYXJlIHRoZSBmaXJzdCB0ZXJtaW5hdG9yIGluIGEgYmxvY2shIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgfSBlbHNlIGlmIChyZXVzZWRJbmNvbWluZyB8fCAhSW5jb21pbmdSZWcpIHsKKyAgICAgICAgLy8gV2UgbWF5IGhhdmUgdG8gcmV3aW5kIGEgYml0IGlmIHdlIGRpZG4ndCBpbnNlcnQgYSBjb3B5IHRoaXMgdGltZS4KKyAgICAgICAgS2lsbEluc3QgPSBUZXJtOworICAgICAgICB3aGlsZSAoS2lsbEluc3QgIT0gb3BCbG9jay5iZWdpbigpKQorICAgICAgICAgIGlmICgoLS1LaWxsSW5zdCktPnJlYWRzUmVnaXN0ZXIoU3JjUmVnKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UganVzdCBpbnNlcnRlZCB0aGlzIGNvcHkuCisgICAgICAgIEtpbGxJbnN0ID0gcHJpb3IoSW5zZXJ0UG9zKTsKKyAgICAgIH0KKyAgICAgIGFzc2VydChLaWxsSW5zdC0+cmVhZHNSZWdpc3RlcihTcmNSZWcpICYmICJDYW5ub3QgZmluZCBraWxsIGluc3RydWN0aW9uIik7CisKKyAgICAgIC8vIEZpbmFsbHksIG1hcmsgaXQga2lsbGVkLgorICAgICAgTFYtPmFkZFZpcnR1YWxSZWdpc3RlcktpbGxlZChTcmNSZWcsIEtpbGxJbnN0KTsKKworICAgICAgLy8gVGhpcyB2cmVnIG5vIGxvbmdlciBsaXZlcyBhbGwgb2YgdGhlIHdheSB0aHJvdWdoIG9wQmxvY2suCisgICAgICB1bnNpZ25lZCBvcEJsb2NrTnVtID0gb3BCbG9jay5nZXROdW1iZXIoKTsKKyAgICAgIExWLT5nZXRWYXJJbmZvKFNyY1JlZykuQWxpdmVCbG9ja3MucmVzZXQob3BCbG9ja051bSk7CisgICAgfQorICB9CisKKyAgLy8gUmVhbGx5IGRlbGV0ZSB0aGUgUEhJIGluc3RydWN0aW9uIG5vdywgaWYgaXQgaXMgbm90IGluIHRoZSBMb3dlcmVkUEhJcyBtYXAuCisgIGlmIChyZXVzZWRJbmNvbWluZyB8fCAhSW5jb21pbmdSZWcpCisgICAgTUYuRGVsZXRlTWFjaGluZUluc3RyKE1QaGkpOworfQorCisvLy8gYW5hbHl6ZVBISU5vZGVzIC0gR2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBQSEkgbm9kZXMgaW4gaGVyZS4gSW4KKy8vLyBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRvIG1hcCB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgYSB2aXJ0dWFsIHJlZ2lzdGVyIHdoaWNoIGlzCisvLy8gdXNlZCBpbiBhIFBISSBub2RlLiBXZSBtYXAgdGhhdCB0byB0aGUgQkIgdGhlIHZyZWcgaXMgY29taW5nIGZyb20uIFRoaXMgaXMKKy8vLyB1c2VkIGxhdGVyIHRvIGRldGVybWluZSB3aGVuIHRoZSB2cmVnIGlzIGtpbGxlZCBpbiB0aGUgQkIuCisvLy8KK3ZvaWQgbGx2bTo6UEhJRWxpbWluYXRpb246OmFuYWx5emVQSElOb2Rlcyhjb25zdCBNYWNoaW5lRnVuY3Rpb24mIE1GKSB7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjpjb25zdF9pdGVyYXRvciBJID0gTUYuYmVnaW4oKSwgRSA9IE1GLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEJCSSA9IEktPmJlZ2luKCksIEJCRSA9IEktPmVuZCgpOworICAgICAgICAgQkJJICE9IEJCRSAmJiBCQkktPmlzUEhJKCk7ICsrQkJJKQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IEJCSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyBpICs9IDIpCisgICAgICAgICsrVlJlZ1BISVVzZUNvdW50W0JCVlJlZ1BhaXIoQkJJLT5nZXRPcGVyYW5kKGkrMSkuZ2V0TUJCKCktPmdldE51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCSS0+Z2V0T3BlcmFuZChpKS5nZXRSZWcoKSldOworfQorCitib29sIGxsdm06OlBISUVsaW1pbmF0aW9uOjpTcGxpdFBISUVkZ2VzKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVWYXJpYWJsZXMgJkxWKSB7CisgIGlmIChNQkIuZW1wdHkoKSB8fCAhTUJCLmZyb250KCkuaXNQSEkoKSkKKyAgICByZXR1cm4gZmFsc2U7ICAgLy8gUXVpY2sgZXhpdCBmb3IgYmFzaWMgYmxvY2tzIHdpdGhvdXQgUEhJcy4KKworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBCQkkgPSBNQkIuYmVnaW4oKSwgQkJFID0gTUJCLmVuZCgpOworICAgICAgIEJCSSAhPSBCQkUgJiYgQkJJLT5pc1BISSgpOyArK0JCSSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBCQkktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgaSArPSAyKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSBCQkktPmdldE9wZXJhbmQoaSkuZ2V0UmVnKCk7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUHJlTUJCID0gQkJJLT5nZXRPcGVyYW5kKGkrMSkuZ2V0TUJCKCk7CisgICAgICAvLyBXZSBicmVhayBlZGdlcyB3aGVuIHJlZ2lzdGVycyBhcmUgbGl2ZSBvdXQgZnJvbSB0aGUgcHJlZGVjZXNzb3IgYmxvY2sKKyAgICAgIC8vIChub3QgY29uc2lkZXJpbmcgUEhJIG5vZGVzKS4gSWYgdGhlIHJlZ2lzdGVyIGlzIGxpdmUgaW4gdG8gdGhpcyBibG9jaworICAgICAgLy8gYW55d2F5LCB3ZSB3b3VsZCBnYWluIG5vdGhpbmcgZnJvbSBzcGxpdHRpbmcuCisgICAgICBpZiAoIUxWLmlzTGl2ZUluKFJlZywgTUJCKSAmJiBMVi5pc0xpdmVPdXQoUmVnLCAqUHJlTUJCKSkKKyAgICAgICAgUHJlTUJCLT5TcGxpdENyaXRpY2FsRWRnZSgmTUJCLCB0aGlzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9QSElFbGltaW5hdGlvbi5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEhJRWxpbWluYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgzZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUEhJRWxpbWluYXRpb24uaApAQCAtMCwwICsxLDExMyBAQAorLy89PT0tLSBsaWIvQ29kZUdlbi9QSElFbGltaW5hdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUEhJRUxJTUlOQVRJT05fSFBQCisjZGVmaW5lIExMVk1fQ09ERUdFTl9QSElFTElNSU5BVElPTl9IUFAKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBMaXZlVmFyaWFibGVzOworICAKKyAgLy8vIExvd2VyIFBISSBpbnN0cnVjdGlvbnMgdG8gY29waWVzLiAgCisgIGNsYXNzIFBISUVsaW1pbmF0aW9uIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gICpNUkk7IC8vIE1hY2hpbmUgcmVnaXN0ZXIgaW5mb3JtYXRpb24KKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBQSElFbGltaW5hdGlvbigpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gRWxpbWluYXRlUEhJTm9kZXMgLSBFbGltaW5hdGUgcGhpIG5vZGVzIGJ5IGluc2VydGluZyBjb3B5IGluc3RydWN0aW9ucworICAgIC8vLyBpbiBwcmVkZWNlc3NvciBiYXNpYyBibG9ja3MuCisgICAgLy8vCisgICAgYm9vbCBFbGltaW5hdGVQSElOb2RlcyhNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKyAgICB2b2lkIExvd2VyQXRvbWljUEhJTm9kZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBBZnRlclBISXNJdCk7CisKKyAgICAvLy8gYW5hbHl6ZVBISU5vZGVzIC0gR2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBQSEkgbm9kZXMgaW4KKyAgICAvLy8gaGVyZS4gSW4gcGFydGljdWxhciwgd2Ugd2FudCB0byBtYXAgdGhlIG51bWJlciBvZiB1c2VzIG9mIGEgdmlydHVhbAorICAgIC8vLyByZWdpc3RlciB3aGljaCBpcyB1c2VkIGluIGEgUEhJIG5vZGUuIFdlIG1hcCB0aGF0IHRvIHRoZSBCQiB0aGUKKyAgICAvLy8gdnJlZyBpcyBjb21pbmcgZnJvbS4gVGhpcyBpcyB1c2VkIGxhdGVyIHRvIGRldGVybWluZSB3aGVuIHRoZSB2cmVnCisgICAgLy8vIGlzIGtpbGxlZCBpbiB0aGUgQkIuCisgICAgLy8vCisgICAgdm9pZCBhbmFseXplUEhJTm9kZXMoY29uc3QgTWFjaGluZUZ1bmN0aW9uJiBGbik7CisKKyAgICAvLy8gU3BsaXQgY3JpdGljYWwgZWRnZXMgd2hlcmUgbmVjZXNzYXJ5IGZvciBnb29kIGNvYWxlc2NlciBwZXJmb3JtYW5jZS4KKyAgICBib29sIFNwbGl0UEhJRWRnZXMoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVZhcmlhYmxlcyAmTFYpOworCisgICAgLy8vIFNwbGl0Q3JpdGljYWxFZGdlIC0gU3BsaXQgYSBjcml0aWNhbCBlZGdlIGZyb20gQSB0byBCIGJ5CisgICAgLy8vIGluc2VydGluZyBhIG5ldyBNQkIuIFVwZGF0ZSBicmFuY2hlcyBpbiBBIGFuZCBQSEkgaW5zdHJ1Y3Rpb25zCisgICAgLy8vIGluIEIuIFJldHVybiB0aGUgbmV3IGJsb2NrLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTcGxpdENyaXRpY2FsRWRnZShNYWNoaW5lQmFzaWNCbG9jayAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkIpOworCisgICAgLy8vIEZpbmRDb3B5SW5zZXJ0UG9pbnQgLSBGaW5kIGEgc2FmZSBwbGFjZSBpbiBNQkIgdG8gaW5zZXJ0IGEgY29weSBmcm9tCisgICAgLy8vIFNyY1JlZyB3aGVuIGZvbGxvd2luZyB0aGUgQ0ZHIGVkZ2UgdG8gU3VjY01CQi4gVGhpcyBuZWVkcyB0byBiZSBhZnRlcgorICAgIC8vLyBhbnkgZGVmIG9mIFNyY1JlZywgYnV0IGJlZm9yZSBhbnkgc3Vic2VxdWVudCBwb2ludCB3aGVyZSBjb250cm9sIGZsb3cKKyAgICAvLy8gbWlnaHQganVtcCBvdXQgb2YgdGhlIGJhc2ljIGJsb2NrLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBGaW5kQ29weUluc2VydFBvaW50KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJlN1Y2NNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnKTsKKworICAgIC8vIFNraXBQSElzQW5kTGFiZWxzIC0gQ29waWVzIG5lZWQgdG8gYmUgaW5zZXJ0ZWQgYWZ0ZXIgcGhpIG5vZGVzIGFuZAorICAgIC8vIGFsc28gYWZ0ZXIgYW55IGV4Y2VwdGlvbiBoYW5kbGluZyBsYWJlbHM6IGluIGxhbmRpbmcgcGFkcyBleGVjdXRpb24KKyAgICAvLyBzdGFydHMgYXQgdGhlIGxhYmVsLCBzbyBhbnkgY29waWVzIHBsYWNlZCBiZWZvcmUgaXQgd29uJ3QgYmUgZXhlY3V0ZWQhCisgICAgLy8gV2UgYWxzbyBkZWFsIHdpdGggREJHX1ZBTFVFcywgd2hpY2ggYXJlIGEgYml0IHRyaWNreToKKyAgICAvLyAgUEhJCisgICAgLy8gIERCR19WQUxVRQorICAgIC8vICBMQUJFTAorICAgIC8vIEhlcmUgdGhlIERCR19WQUxVRSBuZWVkcyB0byBiZSBza2lwcGVkLCBhbmQgaWYgaXQgcmVmZXJzIHRvIGEgUEhJIGl0CisgICAgLy8gbmVlZHMgdG8gYmUgYW5udWxsZWQgb3IsIGJldHRlciwgbW92ZWQgdG8gZm9sbG93IHRoZSBsYWJlbCwgYXMgd2VsbC4KKyAgICAvLyAgUEhJCisgICAgLy8gIERCR19WQUxVRQorICAgIC8vICBubyBsYWJlbAorICAgIC8vIEhlcmUgaXQgaXMgbm90IGEgZ29vZCBpZGVhIHRvIHNraXAgdGhlIERCR19WQUxVRS4KKyAgICAvLyBGSVhNRTogRm9yIG5vdyB3ZSBza2lwIGFuZCBhbm51bCBhbGwgREJHX1ZBTFVFcywgbWF4aW1hbGx5IHNpbXBsZSBhbmQKKyAgICAvLyBtYXhpbWFsbHkgc3R1cGlkLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBTa2lwUEhJc0FuZExhYmVscyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsKKyAgICAgIC8vIFJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgRUggbGFiZWxzIGNvbWUgYmVmb3JlIG90aGVyIGtpbmRzIG9mIGxhYmVscywKKyAgICAgIC8vIGp1c3Qgc2tpcCBhbGwgbGFiZWxzLgorICAgICAgd2hpbGUgKEkgIT0gTUJCLmVuZCgpICYmIAorICAgICAgICAgICAgIChJLT5pc1BISSgpIHx8IEktPmlzTGFiZWwoKSB8fCBJLT5pc0RlYnVnVmFsdWUoKSkpIHsKKyAgICAgICAgaWYgKEktPmlzRGVidWdWYWx1ZSgpICYmIEktPmdldE51bU9wZXJhbmRzKCk9PTMgJiYgCisgICAgICAgICAgICBJLT5nZXRPcGVyYW5kKDApLmlzUmVnKCkpCisgICAgICAgICAgSS0+Z2V0T3BlcmFuZCgwKS5zZXRSZWcoMFUpOworICAgICAgICArK0k7CisgICAgICB9CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IEJCVlJlZ1BhaXI7CisgICAgdHlwZWRlZiBEZW5zZU1hcDxCQlZSZWdQYWlyLCB1bnNpZ25lZD4gVlJlZ1BISVVzZTsKKworICAgIFZSZWdQSElVc2UgVlJlZ1BISVVzZUNvdW50OworCisgICAgLy8gRGVmcyBvZiBQSEkgc291cmNlcyB3aGljaCBhcmUgaW1wbGljaXRfZGVmLgorICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+IEltcERlZnM7CisKKyAgICAvLyBNYXAgcmV1c2FibGUgbG93ZXJlZCBQSEkgbm9kZSAtPiBpbmNvbWluZyBqb2luIHJlZ2lzdGVyLgorICAgIHR5cGVkZWYgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgdW5zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHJFeHByZXNzaW9uVHJhaXQ+IExvd2VyZWRQSElNYXA7CisgICAgTG93ZXJlZFBISU1hcCBMb3dlcmVkUEhJczsKKyAgfTsKKworfQorCisjZW5kaWYgLyogTExWTV9DT0RFR0VOX1BISUVMSU1JTkFUSU9OX0hQUCAqLwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vUGFzc2VzLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Bhc3Nlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4OWRiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Bhc3Nlcy5jcHAKQEAgLTAsMCArMSw2OCBAQAorLy89PT0tLSBQYXNzZXMuY3BwIC0gVGFyZ2V0IGluZGVwZW5kZW50IGNvZGUgZ2VuZXJhdGlvbiBwYXNzZXMgLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBpbnRlcmZhY2VzIHRvIGFjY2VzcyB0aGUgdGFyZ2V0IGluZGVwZW5kZW50IGNvZGUKKy8vIGdlbmVyYXRpb24gcGFzc2VzIHByb3ZpZGVkIGJ5IHRoZSBMTFZNIGJhY2tlbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1JlZ0FsbG9jUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBSZWdpc3RlclJlZ0FsbG9jIGNsYXNzIC0gVHJhY2sgdGhlIHJlZ2lzdHJhdGlvbiBvZiByZWdpc3RlciBhbGxvY2F0b3JzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitNYWNoaW5lUGFzc1JlZ2lzdHJ5IFJlZ2lzdGVyUmVnQWxsb2M6OlJlZ2lzdHJ5OworCitzdGF0aWMgRnVuY3Rpb25QYXNzICpjcmVhdGVEZWZhdWx0UmVnaXN0ZXJBbGxvY2F0b3IoKSB7IHJldHVybiAwOyB9CitzdGF0aWMgUmVnaXN0ZXJSZWdBbGxvYworZGVmYXVsdFJlZ0FsbG9jKCJkZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAicGljayByZWdpc3RlciBhbGxvY2F0b3IgYmFzZWQgb24gLU8gb3B0aW9uIiwKKyAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0UmVnaXN0ZXJBbGxvY2F0b3IpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBSZWdBbGxvYyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworc3RhdGljIGNsOjpvcHQ8UmVnaXN0ZXJSZWdBbGxvYzo6RnVuY3Rpb25QYXNzQ3RvciwgZmFsc2UsCisgICAgICAgICAgICAgICBSZWdpc3RlclBhc3NQYXJzZXI8UmVnaXN0ZXJSZWdBbGxvYz4gPgorUmVnQWxsb2MoInJlZ2FsbG9jIiwKKyAgICAgICAgIGNsOjppbml0KCZjcmVhdGVEZWZhdWx0UmVnaXN0ZXJBbGxvY2F0b3IpLAorICAgICAgICAgY2w6OmRlc2MoIlJlZ2lzdGVyIGFsbG9jYXRvciB0byB1c2UiKSk7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gY3JlYXRlUmVnaXN0ZXJBbGxvY2F0b3IgLSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyIGFsbG9jYXRvci4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVSZWdpc3RlckFsbG9jYXRvcihDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICBSZWdpc3RlclJlZ0FsbG9jOjpGdW5jdGlvblBhc3NDdG9yIEN0b3IgPSBSZWdpc3RlclJlZ0FsbG9jOjpnZXREZWZhdWx0KCk7CisKKyAgaWYgKCFDdG9yKSB7CisgICAgQ3RvciA9IFJlZ0FsbG9jOworICAgIFJlZ2lzdGVyUmVnQWxsb2M6OnNldERlZmF1bHQoUmVnQWxsb2MpOworICB9CisKKyAgaWYgKEN0b3IgIT0gY3JlYXRlRGVmYXVsdFJlZ2lzdGVyQWxsb2NhdG9yKQorICAgIHJldHVybiBDdG9yKCk7CisKKyAgLy8gV2hlbiB0aGUgJ2RlZmF1bHQnIGFsbG9jYXRvciBpcyByZXF1ZXN0ZWQsIHBpY2sgb25lIGJhc2VkIG9uIE9wdExldmVsLgorICBzd2l0Y2ggKE9wdExldmVsKSB7CisgIGNhc2UgQ29kZUdlbk9wdDo6Tm9uZToKKyAgICByZXR1cm4gY3JlYXRlRmFzdFJlZ2lzdGVyQWxsb2NhdG9yKCk7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGNyZWF0ZUxpbmVhclNjYW5SZWdpc3RlckFsbG9jYXRvcigpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9QZWVwaG9sZU9wdGltaXplci5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9QZWVwaG9sZU9wdGltaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhMmI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1BlZXBob2xlT3B0aW1pemVyLmNwcApAQCAtMCwwICsxLDI5MyBAQAorLy89PT0tLSBQZWVwaG9sZU9wdGltaXplci5jcHAgLSBQZWVwaG9sZSBPcHRpbWl6YXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQZXJmb3JtIHBlZXBob2xlIG9wdGltaXphdGlvbnMgb24gdGhlIG1hY2hpbmUgY29kZToKKy8vCisvLyAtIE9wdGltaXplIEV4dGVuc2lvbnMKKy8vCisvLyAgICAgT3B0aW1pemF0aW9uIG9mIHNpZ24gLyB6ZXJvIGV4dGVuc2lvbiBpbnN0cnVjdGlvbnMuIEl0IG1heSBiZSBleHRlbmRlZCB0bworLy8gICAgIGhhbmRsZSBvdGhlciBpbnN0cnVjdGlvbnMgd2l0aCBzaW1pbGFyIHByb3BlcnRpZXMuCisvLworLy8gICAgIE9uIHNvbWUgdGFyZ2V0cywgc29tZSBpbnN0cnVjdGlvbnMsIGUuZy4gWDg2IHNpZ24gLyB6ZXJvIGV4dGVuc2lvbiwgbWF5CisvLyAgICAgbGVhdmUgdGhlIHNvdXJjZSB2YWx1ZSBpbiB0aGUgbG93ZXIgcGFydCBvZiB0aGUgcmVzdWx0LiBUaGlzIG9wdGltaXphdGlvbgorLy8gICAgIHdpbGwgcmVwbGFjZSBzb21lIHVzZXMgb2YgdGhlIHByZS1leHRlbnNpb24gdmFsdWUgd2l0aCB1c2VzIG9mIHRoZQorLy8gICAgIHN1Yi1yZWdpc3RlciBvZiB0aGUgcmVzdWx0cy4KKy8vCisvLyAtIE9wdGltaXplIENvbXBhcmlzb25zCisvLworLy8gICAgIE9wdGltaXphdGlvbiBvZiBjb21wYXJpc29uIGluc3RydWN0aW9ucy4gRm9yIGluc3RhbmNlLCBpbiB0aGlzIGNvZGU6CisvLworLy8gICAgICAgc3ViIHIxLCAxCisvLyAgICAgICBjbXAgcjEsIDAKKy8vICAgICAgIGJ6ICBMMQorLy8KKy8vICAgICBJZiB0aGUgInN1YiIgaW5zdHJ1Y3Rpb24gYWxsIHJlYWR5IHNldHMgKG9yIGNvdWxkIGJlIG1vZGlmaWVkIHRvIHNldCkgdGhlCisvLyAgICAgc2FtZSBmbGFnIHRoYXQgdGhlICJjbXAiIGluc3RydWN0aW9uIHNldHMgYW5kIHRoYXQgImJ6IiB1c2VzLCB0aGVuIHdlIGNhbgorLy8gICAgIGVsaW1pbmF0ZSB0aGUgImNtcCIgaW5zdHJ1Y3Rpb24uCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicGVlcGhvbGUtb3B0IgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBPcHRpbWl6ZSBFeHRlbnNpb25zCitzdGF0aWMgY2w6Om9wdDxib29sPgorQWdncmVzc2l2ZSgiYWdncmVzc2l2ZS1leHQtb3B0IiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICAgY2w6OmRlc2MoIkFnZ3Jlc3NpdmUgZXh0ZW5zaW9uIG9wdGltaXphdGlvbiIpKTsKKworU1RBVElTVElDKE51bVJldXNlLCAiTnVtYmVyIG9mIGV4dGVuc2lvbiByZXN1bHRzIHJldXNlZCIpOworCisvLyBPcHRpbWl6ZSBDb21wYXJpc29ucworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0VuYWJsZU9wdENtcHMoImVuYWJsZS1vcHRpbWl6ZS1jbXBzIiwgY2w6OmluaXQodHJ1ZSksIGNsOjpIaWRkZW4pOworCitTVEFUSVNUSUMoTnVtRWxpbWluYXRlZCwgIk51bWJlciBvZiBjb21wYXJlcyBlbGltaW5hdGVkIik7CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIFBlZXBob2xlT3B0aW1pemVyIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgICAqVE07CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAgICpNUkk7CisgICAgTWFjaGluZURvbWluYXRvclRyZWUgICpEVDsgIC8vIE1hY2hpbmUgZG9taW5hdG9yIHRyZWUKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24KKyAgICBQZWVwaG9sZU9wdGltaXplcigpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICAgICAgaWYgKEFnZ3Jlc3NpdmUpIHsKKyAgICAgICAgQVUuYWRkUmVxdWlyZWQ8TWFjaGluZURvbWluYXRvclRyZWU+KCk7CisgICAgICAgIEFVLmFkZFByZXNlcnZlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIE9wdGltaXplQ21wSW5zdHIoTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisgICAgYm9vbCBPcHRpbWl6ZUV4dEluc3RyKE1hY2hpbmVJbnN0ciAqTUksIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDg+ICZMb2NhbE1Jcyk7CisgIH07Cit9CisKK2NoYXIgUGVlcGhvbGVPcHRpbWl6ZXI6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhQZWVwaG9sZU9wdGltaXplciwgInBlZXBob2xlLW9wdHMiLAorICAgICAgICAgICAgICAgICJQZWVwaG9sZSBPcHRpbWl6YXRpb25zIiwgZmFsc2UsIGZhbHNlKTsKKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVQZWVwaG9sZU9wdGltaXplclBhc3MoKSB7CisgIHJldHVybiBuZXcgUGVlcGhvbGVPcHRpbWl6ZXIoKTsKK30KKworLy8vIE9wdGltaXplRXh0SW5zdHIgLSBJZiBpbnN0cnVjdGlvbiBpcyBhIGNvcHktbGlrZSBpbnN0cnVjdGlvbiwgaS5lLiBpdCByZWFkcworLy8vIGEgc2luZ2xlIHJlZ2lzdGVyIGFuZCB3cml0ZXMgYSBzaW5nbGUgcmVnaXN0ZXIgYW5kIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUKKy8vLyBzb3VyY2UsIGFuZCBpZiB0aGUgc291cmNlIHZhbHVlIGlzIHByZXNlcnZlZCBhcyBhIHN1Yi1yZWdpc3RlciBvZiB0aGUKKy8vLyByZXN1bHQsIHRoZW4gcmVwbGFjZSBhbGwgcmVhY2hhYmxlIHVzZXMgb2YgdGhlIHNvdXJjZSB3aXRoIHRoZSBzdWJyZWcgb2YgdGhlCisvLy8gcmVzdWx0LgorLy8vIAorLy8vIERvIG5vdCBnZW5lcmF0ZSBhbiBFWFRSQUNUIHRoYXQgaXMgdXNlZCBvbmx5IGluIGEgZGVidWcgdXNlLCBhcyB0aGlzIGNoYW5nZXMKKy8vLyB0aGUgY29kZS4gU2luY2UgdGhpcyBjb2RlIGRvZXMgbm90IGN1cnJlbnRseSBzaGFyZSBFWFRSQUNUcywganVzdCBpZ25vcmUgYWxsCisvLy8gZGVidWcgdXNlcy4KK2Jvb2wgUGVlcGhvbGVPcHRpbWl6ZXI6OgorT3B0aW1pemVFeHRJbnN0cihNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA4PiAmTG9jYWxNSXMpIHsKKyAgTG9jYWxNSXMuaW5zZXJ0KE1JKTsKKworICB1bnNpZ25lZCBTcmNSZWcsIERzdFJlZywgU3ViSWR4OworICBpZiAoIVRJSS0+aXNDb2FsZXNjYWJsZUV4dEluc3RyKCpNSSwgU3JjUmVnLCBEc3RSZWcsIFN1YklkeCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihEc3RSZWcpIHx8CisgICAgICBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihTcmNSZWcpKQorICAgIHJldHVybiBmYWxzZTsKKworICBNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2Vfbm9kYmdfaXRlcmF0b3IgVUkgPSBNUkktPnVzZV9ub2RiZ19iZWdpbihTcmNSZWcpOworICBpZiAoKytVSSA9PSBNUkktPnVzZV9ub2RiZ19lbmQoKSkKKyAgICAvLyBObyBvdGhlciB1c2VzLgorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBUaGUgc291cmNlIGhhcyBvdGhlciB1c2VzLiBTZWUgaWYgd2UgY2FuIHJlcGxhY2UgdGhlIG90aGVyIHVzZXMgd2l0aCB1c2Ugb2YKKyAgLy8gdGhlIHJlc3VsdCBvZiB0aGUgZXh0ZW5zaW9uLgorICBTbWFsbFB0clNldDxNYWNoaW5lQmFzaWNCbG9jayosIDQ+IFJlYWNoZWRCQnM7CisgIFVJID0gTVJJLT51c2Vfbm9kYmdfYmVnaW4oRHN0UmVnKTsKKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2Vfbm9kYmdfaXRlcmF0b3IgVUUgPSBNUkktPnVzZV9ub2RiZ19lbmQoKTsKKyAgICAgICBVSSAhPSBVRTsgKytVSSkKKyAgICBSZWFjaGVkQkJzLmluc2VydChVSS0+Z2V0UGFyZW50KCkpOworCisgIC8vIFVzZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgQkIgb2YgdXNlcyBvZiB0aGUgcmVzdWx0IG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQqLCA4PiBVc2VzOworCisgIC8vIFVzZXMgdGhhdCB0aGUgcmVzdWx0IG9mIHRoZSBpbnN0cnVjdGlvbiBjYW4gcmVhY2guCisgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kKiwgOD4gRXh0ZW5kZWRVc2VzOworCisgIGJvb2wgRXh0ZW5kTGlmZSA9IHRydWU7CisgIFVJID0gTVJJLT51c2Vfbm9kYmdfYmVnaW4oU3JjUmVnKTsKKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2Vfbm9kYmdfaXRlcmF0b3IgVUUgPSBNUkktPnVzZV9ub2RiZ19lbmQoKTsKKyAgICAgICBVSSAhPSBVRTsgKytVSSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZVc2VNTyA9IFVJLmdldE9wZXJhbmQoKTsKKyAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gJipVSTsKKyAgICBpZiAoVXNlTUkgPT0gTUkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChVc2VNSS0+aXNQSEkoKSkgeworICAgICAgRXh0ZW5kTGlmZSA9IGZhbHNlOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSXQncyBhbiBlcnJvciB0byB0cmFuc2xhdGUgdGhpczoKKyAgICAvLworICAgIC8vICAgICVyZWcxMDI1ID0gPHNleHQ+ICVyZWcxMDI0CisgICAgLy8gICAgIC4uLgorICAgIC8vICAgICVyZWcxMDI2ID0gU1VCUkVHX1RPX1JFRyAwLCAlcmVnMTAyNCwgNAorICAgIC8vCisgICAgLy8gaW50byB0aGlzOgorICAgIC8vCisgICAgLy8gICAgJXJlZzEwMjUgPSA8c2V4dD4gJXJlZzEwMjQKKyAgICAvLyAgICAgLi4uCisgICAgLy8gICAgJXJlZzEwMjcgPSBDT1BZICVyZWcxMDI1OjQKKyAgICAvLyAgICAlcmVnMTAyNiA9IFNVQlJFR19UT19SRUcgMCwgJXJlZzEwMjcsIDQKKyAgICAvLworICAgIC8vIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCBTVUJSRUdfVE9fUkVHIGlzIHRoZXJlIHRvIGFzc2VydCB0aGF0IGFuCisgICAgLy8gaW1wbGljaXQgemV4dCBvY2N1cnMuIEl0IGRvZXNuJ3QgaW5zZXJ0IGEgemV4dCBpbnN0cnVjdGlvbi4gSWYgd2UgYWxsb3cKKyAgICAvLyB0aGUgQ09QWSBoZXJlLCBpdCB3aWxsIGdpdmUgdXMgdGhlIHZhbHVlIGFmdGVyIHRoZSA8c2V4dD4sIG5vdCB0aGUKKyAgICAvLyBvcmlnaW5hbCB2YWx1ZSBvZiAlcmVnMTAyNCBiZWZvcmUgPHNleHQ+LgorICAgIGlmIChVc2VNSS0+Z2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpTVUJSRUdfVE9fUkVHKQorICAgICAgY29udGludWU7CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqVXNlTUJCID0gVXNlTUktPmdldFBhcmVudCgpOworICAgIGlmIChVc2VNQkIgPT0gTUJCKSB7CisgICAgICAvLyBMb2NhbCB1c2VzIHRoYXQgY29tZSBhZnRlciB0aGUgZXh0ZW5zaW9uLgorICAgICAgaWYgKCFMb2NhbE1Jcy5jb3VudChVc2VNSSkpCisgICAgICAgIFVzZXMucHVzaF9iYWNrKCZVc2VNTyk7CisgICAgfSBlbHNlIGlmIChSZWFjaGVkQkJzLmNvdW50KFVzZU1CQikpIHsKKyAgICAgIC8vIE5vbi1sb2NhbCB1c2VzIHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlIGV4dGVuc2lvbiBpcyB1c2VkLiBBbHdheXMKKyAgICAgIC8vIHJlcGxhY2UgdGhlc2UgdW5sZXNzIGl0J3MgYSBQSEkuCisgICAgICBVc2VzLnB1c2hfYmFjaygmVXNlTU8pOworICAgIH0gZWxzZSBpZiAoQWdncmVzc2l2ZSAmJiBEVC0+ZG9taW5hdGVzKE1CQiwgVXNlTUJCKSkgeworICAgICAgLy8gV2UgbWF5IHdhbnQgdG8gZXh0ZW5kIHRoZSBsaXZlIHJhbmdlIG9mIHRoZSBleHRlbnNpb24gcmVzdWx0IGluIG9yZGVyCisgICAgICAvLyB0byByZXBsYWNlIHRoZXNlIHVzZXMuCisgICAgICBFeHRlbmRlZFVzZXMucHVzaF9iYWNrKCZVc2VNTyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEJvdGggd2lsbCBiZSBsaXZlIG91dCBvZiB0aGUgZGVmIE1CQiBhbnl3YXkuIERvbid0IGV4dGVuZCBsaXZlIHJhbmdlIG9mCisgICAgICAvLyB0aGUgZXh0ZW5zaW9uIHJlc3VsdC4KKyAgICAgIEV4dGVuZExpZmUgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChFeHRlbmRMaWZlICYmICFFeHRlbmRlZFVzZXMuZW1wdHkoKSkKKyAgICAvLyBFeHRlbmQgdGhlIGxpdmVuZXNzIG9mIHRoZSBleHRlbnNpb24gcmVzdWx0LgorICAgIHN0ZDo6Y29weShFeHRlbmRlZFVzZXMuYmVnaW4oKSwgRXh0ZW5kZWRVc2VzLmVuZCgpLAorICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoVXNlcykpOworCisgIC8vIE5vdyByZXBsYWNlIGFsbCB1c2VzLgorICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgaWYgKCFVc2VzLmVtcHR5KCkpIHsKKyAgICBTbWFsbFB0clNldDxNYWNoaW5lQmFzaWNCbG9jayosIDQ+IFBISUJCczsKKworICAgIC8vIExvb2sgZm9yIFBISSB1c2VzIG9mIHRoZSBleHRlbmRlZCByZXN1bHQsIHdlIGRvbid0IHdhbnQgdG8gZXh0ZW5kIHRoZQorICAgIC8vIGxpdmVuZXNzIG9mIGEgUEhJIGlucHV0LiBJdCBicmVha3MgYWxsIGtpbmRzIG9mIGFzc3VtcHRpb25zIGRvd24KKyAgICAvLyBzdHJlYW0uIEEgUEhJIHVzZSBpcyBleHBlY3RlZCB0byBiZSB0aGUga2lsbCBvZiBpdHMgc291cmNlIHZhbHVlcy4KKyAgICBVSSA9IE1SSS0+dXNlX25vZGJnX2JlZ2luKERzdFJlZyk7CisgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2Vfbm9kYmdfaXRlcmF0b3IKKyAgICAgICAgICAgVUUgPSBNUkktPnVzZV9ub2RiZ19lbmQoKTsgVUkgIT0gVUU7ICsrVUkpCisgICAgICBpZiAoVUktPmlzUEhJKCkpCisgICAgICAgIFBISUJCcy5pbnNlcnQoVUktPmdldFBhcmVudCgpKTsKKworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gTVJJLT5nZXRSZWdDbGFzcyhTcmNSZWcpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICpVc2VNTyA9IFVzZXNbaV07CisgICAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gVXNlTU8tPmdldFBhcmVudCgpOworICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlVzZU1CQiA9IFVzZU1JLT5nZXRQYXJlbnQoKTsKKyAgICAgIGlmIChQSElCQnMuY291bnQoVXNlTUJCKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHVuc2lnbmVkIE5ld1ZSID0gTVJJLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgICAgQnVpbGRNSSgqVXNlTUJCLCBVc2VNSSwgVXNlTUktPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksIE5ld1ZSKQorICAgICAgICAuYWRkUmVnKERzdFJlZywgMCwgU3ViSWR4KTsKKworICAgICAgVXNlTU8tPnNldFJlZyhOZXdWUik7CisgICAgICArK051bVJldXNlOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBPcHRpbWl6ZUNtcEluc3RyIC0gSWYgdGhlIGluc3RydWN0aW9uIGlzIGEgY29tcGFyZSBhbmQgdGhlIHByZXZpb3VzCisvLy8gaW5zdHJ1Y3Rpb24gaXQncyBjb21wYXJpbmcgYWdhaW5zdCBhbGwgcmVhZHkgc2V0cyAob3IgY291bGQgYmUgbW9kaWZpZWQgdG8KKy8vLyBzZXQpIHRoZSBzYW1lIGZsYWcgYXMgdGhlIGNvbXBhcmUsIHRoZW4gd2UgY2FuIHJlbW92ZSB0aGUgY29tcGFyaXNvbiBhbmQgdXNlCisvLy8gdGhlIGZsYWcgZnJvbSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCitib29sIFBlZXBob2xlT3B0aW1pemVyOjpPcHRpbWl6ZUNtcEluc3RyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgaWYgKCFFbmFibGVPcHRDbXBzKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBhIGNvbXBhcmlzb24gYWdhaW5zdCB6ZXJvIGFuZCBpc24ndCBjb21wYXJpbmcgYQorICAvLyBwaHlzaWNhbCByZWdpc3Rlciwgd2UgY2FuIHRyeSB0byBvcHRpbWl6ZSBpdC4KKyAgdW5zaWduZWQgU3JjUmVnOworICBpbnQgQ21wVmFsdWU7CisgIGlmICghVElJLT5BbmFseXplQ29tcGFyZShNSSwgU3JjUmVnLCBDbXBWYWx1ZSkgfHwKKyAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFNyY1JlZykgfHwgQ21wVmFsdWUgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgTWFjaGluZVJlZ2lzdGVySW5mbzo6ZGVmX2l0ZXJhdG9yIERJID0gTVJJLT5kZWZfYmVnaW4oU3JjUmVnKTsKKyAgaWYgKGxsdm06Om5leHQoREkpICE9IE1SSS0+ZGVmX2VuZCgpKQorICAgIC8vIE9ubHkgc3VwcG9ydCBvbmUgZGVmaW5pdGlvbi4KKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IHRoZSBkZWZpbmluZyBpbnN0cnVjdGlvbiB0byBzZXQgdGhlICJ6ZXJvIiBmbGFnLgorICBpZiAoVElJLT5Db252ZXJ0VG9TZXRaZXJvRmxhZygmKkRJLCBNSSkpIHsKKyAgICArK051bUVsaW1pbmF0ZWQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUGVlcGhvbGVPcHRpbWl6ZXI6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgVE0gID0gJk1GLmdldFRhcmdldCgpOworICBUSUkgPSBUTS0+Z2V0SW5zdHJJbmZvKCk7CisgIE1SSSA9ICZNRi5nZXRSZWdJbmZvKCk7CisgIERUICA9IEFnZ3Jlc3NpdmUgPyAmZ2V0QW5hbHlzaXM8TWFjaGluZURvbWluYXRvclRyZWU+KCkgOiAwOworCisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDg+IExvY2FsTUlzOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gJipJOworICAgIExvY2FsTUlzLmNsZWFyKCk7CisKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcgorICAgICAgICAgICBNSUkgPSBJLT5iZWdpbigpLCBNRSA9IEktPmVuZCgpOyBNSUkgIT0gTUU7ICkgeworICAgICAgTWFjaGluZUluc3RyICpNSSA9ICYqTUlJOworCisgICAgICBpZiAoTUktPmdldERlc2MoKS5pc0NvbXBhcmUoKSkgeworICAgICAgICArK01JSTsgLy8gVGhlIGl0ZXJhdG9yIG1heSBiZWNvbWUgaW52YWxpZCBpZiB0aGUgY29tcGFyZSBpcyBkZWxldGVkLgorICAgICAgICBDaGFuZ2VkIHw9IE9wdGltaXplQ21wSW5zdHIoTUksIE1CQik7CisgICAgICB9IGVsc2UgeworICAgICAgICBDaGFuZ2VkIHw9IE9wdGltaXplRXh0SW5zdHIoTUksIE1CQiwgTG9jYWxNSXMpOworICAgICAgICArK01JSTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Bvc3RSQUhhemFyZFJlY29nbml6ZXIuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUG9zdFJBSGF6YXJkUmVjb2duaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkZTJiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Bvc3RSQUhhemFyZFJlY29nbml6ZXIuY3BwCkBAIC0wLDAgKzEsMTgwIEBACisvLz09PS0tLS0tIFBvc3RSQUhhemFyZFJlY29nbml6ZXIuY3BwIC0gaGF6YXJkIHJlY29nbml6ZXIgLS0tLS0tLS0gLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGltcGxlbWVudHMgYSBoYXphcmQgcmVjb2duaXplciB1c2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGl0aW5lcmFyaWVzCisvLyBkZWZpbmVkIGZvciB0aGUgY3VycmVudCB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwb3N0LVJBLXNjaGVkIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qb3N0UkFIYXphcmRSZWNvZ25pemVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckl0aW5lcmFyaWVzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitQb3N0UkFIYXphcmRSZWNvZ25pemVyOjoKK1Bvc3RSQUhhemFyZFJlY29nbml6ZXIoY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICZMSXRpbkRhdGEpIDoKKyAgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyKCksIEl0aW5EYXRhKExJdGluRGF0YSkgeworICAvLyBEZXRlcm1pbmUgdGhlIG1heGltdW0gZGVwdGggb2YgYW55IGl0aW5lcmFyeS4gVGhpcyBkZXRlcm1pbmVzIHRoZQorICAvLyBkZXB0aCBvZiB0aGUgc2NvcmVib2FyZC4gV2UgYWx3YXlzIG1ha2UgdGhlIHNjb3JlYm9hcmQgYXQgbGVhc3QgMQorICAvLyBjeWNsZSBkZWVwIHRvIGF2b2lkIGRlYWxpbmcgd2l0aCB0aGUgYm91bmRhcnkgY29uZGl0aW9uLgorICB1bnNpZ25lZCBTY29yZWJvYXJkRGVwdGggPSAxOworICBpZiAoIUl0aW5EYXRhLmlzRW1wdHkoKSkgeworICAgIGZvciAodW5zaWduZWQgaWR4ID0gMDsgOyArK2lkeCkgeworICAgICAgaWYgKEl0aW5EYXRhLmlzRW5kTWFya2VyKGlkeCkpCisgICAgICAgIGJyZWFrOworCisgICAgICBjb25zdCBJbnN0clN0YWdlICpJUyA9IEl0aW5EYXRhLmJlZ2luU3RhZ2UoaWR4KTsKKyAgICAgIGNvbnN0IEluc3RyU3RhZ2UgKkUgPSBJdGluRGF0YS5lbmRTdGFnZShpZHgpOworICAgICAgdW5zaWduZWQgSXRpbkRlcHRoID0gMDsKKyAgICAgIGZvciAoOyBJUyAhPSBFOyArK0lTKQorICAgICAgICBJdGluRGVwdGggKz0gSVMtPmdldEN5Y2xlcygpOworCisgICAgICBTY29yZWJvYXJkRGVwdGggPSBzdGQ6Om1heChTY29yZWJvYXJkRGVwdGgsIEl0aW5EZXB0aCk7CisgICAgfQorICB9CisKKyAgUmVzZXJ2ZWRTY29yZWJvYXJkLnJlc2V0KFNjb3JlYm9hcmREZXB0aCk7CisgIFJlcXVpcmVkU2NvcmVib2FyZC5yZXNldChTY29yZWJvYXJkRGVwdGgpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiVXNpbmcgcG9zdC1yYSBoYXphcmQgcmVjb2duaXplcjogU2NvcmVib2FyZERlcHRoID0gIiAKKyAgICAgICAgICAgICAgIDw8IFNjb3JlYm9hcmREZXB0aCA8PCAnXG4nKTsKK30KKwordm9pZCBQb3N0UkFIYXphcmRSZWNvZ25pemVyOjpSZXNldCgpIHsKKyAgUmVxdWlyZWRTY29yZWJvYXJkLnJlc2V0KCk7CisgIFJlc2VydmVkU2NvcmVib2FyZC5yZXNldCgpOworfQorCit2b2lkIFBvc3RSQUhhemFyZFJlY29nbml6ZXI6OlNjb3JlQm9hcmQ6OmR1bXAoKSBjb25zdCB7CisgIGRiZ3MoKSA8PCAiU2NvcmVib2FyZDpcbiI7CisKKyAgdW5zaWduZWQgbGFzdCA9IERlcHRoIC0gMTsKKyAgd2hpbGUgKChsYXN0ID4gMCkgJiYgKCgqdGhpcylbbGFzdF0gPT0gMCkpCisgICAgbGFzdC0tOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPD0gbGFzdDsgaSsrKSB7CisgICAgdW5zaWduZWQgRlVzID0gKCp0aGlzKVtpXTsKKyAgICBkYmdzKCkgPDwgIlx0IjsKKyAgICBmb3IgKGludCBqID0gMzE7IGogPj0gMDsgai0tKQorICAgICAgZGJncygpIDw8ICgoRlVzICYgKDEgPDwgaikpID8gJzEnIDogJzAnKTsKKyAgICBkYmdzKCkgPDwgJ1xuJzsKKyAgfQorfQorCitTY2hlZHVsZUhhemFyZFJlY29nbml6ZXI6OkhhemFyZFR5cGUKK1Bvc3RSQUhhemFyZFJlY29nbml6ZXI6OmdldEhhemFyZFR5cGUoU1VuaXQgKlNVKSB7CisgIGlmIChJdGluRGF0YS5pc0VtcHR5KCkpCisgICAgcmV0dXJuIE5vSGF6YXJkOworCisgIHVuc2lnbmVkIGN5Y2xlID0gMDsKKworICAvLyBVc2UgdGhlIGl0aW5lcmFyeSBmb3IgdGhlIHVuZGVybHlpbmcgaW5zdHJ1Y3Rpb24gdG8gY2hlY2sgZm9yCisgIC8vIGZyZWUgRlUncyBpbiB0aGUgc2NvcmVib2FyZCBhdCB0aGUgYXBwcm9wcmlhdGUgZnV0dXJlIGN5Y2xlcy4KKyAgdW5zaWduZWQgaWR4ID0gU1UtPmdldEluc3RyKCktPmdldERlc2MoKS5nZXRTY2hlZENsYXNzKCk7CisgIGZvciAoY29uc3QgSW5zdHJTdGFnZSAqSVMgPSBJdGluRGF0YS5iZWdpblN0YWdlKGlkeCksCisgICAgICAgICAqRSA9IEl0aW5EYXRhLmVuZFN0YWdlKGlkeCk7IElTICE9IEU7ICsrSVMpIHsKKyAgICAvLyBXZSBtdXN0IGZpbmQgb25lIG9mIHRoZSBzdGFnZSdzIHVuaXRzIGZyZWUgZm9yIGV2ZXJ5IGN5Y2xlIHRoZQorICAgIC8vIHN0YWdlIGlzIG9jY3VwaWVkLiBGSVhNRSBpdCB3b3VsZCBiZSBtb3JlIGFjY3VyYXRlIHRvIGZpbmQgdGhlCisgICAgLy8gc2FtZSB1bml0IGZyZWUgaW4gYWxsIHRoZSBjeWNsZXMuCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBJUy0+Z2V0Q3ljbGVzKCk7ICsraSkgeworICAgICAgYXNzZXJ0KCgoY3ljbGUgKyBpKSA8IFJlcXVpcmVkU2NvcmVib2FyZC5nZXREZXB0aCgpKSAmJgorICAgICAgICAgICAgICJTY29yZWJvYXJkIGRlcHRoIGV4Y2VlZGVkISIpOworCisgICAgICB1bnNpZ25lZCBmcmVlVW5pdHMgPSBJUy0+Z2V0VW5pdHMoKTsKKyAgICAgIHN3aXRjaCAoSVMtPmdldFJlc2VydmF0aW9uS2luZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgIGFzc2VydCgwICYmICJJbnZhbGlkIEZVIHJlc2VydmF0aW9uIik7CisgICAgICBjYXNlIEluc3RyU3RhZ2U6OlJlcXVpcmVkOgorICAgICAgICAvLyBSZXF1aXJlZCBGVXMgY29uZmxpY3Qgd2l0aCBib3RoIHJlc2VydmVkIGFuZCByZXF1aXJlZCBvbmVzCisgICAgICAgIGZyZWVVbml0cyAmPSB+UmVzZXJ2ZWRTY29yZWJvYXJkW2N5Y2xlICsgaV07CisgICAgICAgIC8vIEZBTExUSFJPVUdICisgICAgICBjYXNlIEluc3RyU3RhZ2U6OlJlc2VydmVkOgorICAgICAgICAvLyBSZXNlcnZlZCBGVXMgY2FuIGNvbmZsaWN0IG9ubHkgd2l0aCByZXF1aXJlZCBvbmVzLgorICAgICAgICBmcmVlVW5pdHMgJj0gflJlcXVpcmVkU2NvcmVib2FyZFtjeWNsZSArIGldOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKCFmcmVlVW5pdHMpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIqKiogSGF6YXJkIGluIGN5Y2xlICIgPDwgKGN5Y2xlICsgaSkgPDwgIiwgIik7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiU1UoIiA8PCBTVS0+Tm9kZU51bSA8PCAiKTogIik7CisgICAgICAgIERFQlVHKFNVLT5nZXRJbnN0cigpLT5kdW1wKCkpOworICAgICAgICByZXR1cm4gSGF6YXJkOworICAgICAgfQorICAgIH0KKworICAgIC8vIEFkdmFuY2UgdGhlIGN5Y2xlIHRvIHRoZSBuZXh0IHN0YWdlLgorICAgIGN5Y2xlICs9IElTLT5nZXROZXh0Q3ljbGVzKCk7CisgIH0KKworICByZXR1cm4gTm9IYXphcmQ7Cit9CisKK3ZvaWQgUG9zdFJBSGF6YXJkUmVjb2duaXplcjo6RW1pdEluc3RydWN0aW9uKFNVbml0ICpTVSkgeworICBpZiAoSXRpbkRhdGEuaXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICB1bnNpZ25lZCBjeWNsZSA9IDA7CisKKyAgLy8gVXNlIHRoZSBpdGluZXJhcnkgZm9yIHRoZSB1bmRlcmx5aW5nIGluc3RydWN0aW9uIHRvIHJlc2VydmUgRlUncworICAvLyBpbiB0aGUgc2NvcmVib2FyZCBhdCB0aGUgYXBwcm9wcmlhdGUgZnV0dXJlIGN5Y2xlcy4KKyAgdW5zaWduZWQgaWR4ID0gU1UtPmdldEluc3RyKCktPmdldERlc2MoKS5nZXRTY2hlZENsYXNzKCk7CisgIGZvciAoY29uc3QgSW5zdHJTdGFnZSAqSVMgPSBJdGluRGF0YS5iZWdpblN0YWdlKGlkeCksCisgICAgICAgICAqRSA9IEl0aW5EYXRhLmVuZFN0YWdlKGlkeCk7IElTICE9IEU7ICsrSVMpIHsKKyAgICAvLyBXZSBtdXN0IHJlc2VydmUgb25lIG9mIHRoZSBzdGFnZSdzIHVuaXRzIGZvciBldmVyeSBjeWNsZSB0aGUKKyAgICAvLyBzdGFnZSBpcyBvY2N1cGllZC4gRklYTUUgaXQgd291bGQgYmUgbW9yZSBhY2N1cmF0ZSB0byByZXNlcnZlCisgICAgLy8gdGhlIHNhbWUgdW5pdCBmcmVlIGluIGFsbCB0aGUgY3ljbGVzLgorICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgSVMtPmdldEN5Y2xlcygpOyArK2kpIHsKKyAgICAgIGFzc2VydCgoKGN5Y2xlICsgaSkgPCBSZXF1aXJlZFNjb3JlYm9hcmQuZ2V0RGVwdGgoKSkgJiYKKyAgICAgICAgICAgICAiU2NvcmVib2FyZCBkZXB0aCBleGNlZWRlZCEiKTsKKworICAgICAgdW5zaWduZWQgZnJlZVVuaXRzID0gSVMtPmdldFVuaXRzKCk7CisgICAgICBzd2l0Y2ggKElTLT5nZXRSZXNlcnZhdGlvbktpbmQoKSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBGVSByZXNlcnZhdGlvbiIpOworICAgICAgY2FzZSBJbnN0clN0YWdlOjpSZXF1aXJlZDoKKyAgICAgICAgLy8gUmVxdWlyZWQgRlVzIGNvbmZsaWN0IHdpdGggYm90aCByZXNlcnZlZCBhbmQgcmVxdWlyZWQgb25lcworICAgICAgICBmcmVlVW5pdHMgJj0gflJlc2VydmVkU2NvcmVib2FyZFtjeWNsZSArIGldOworICAgICAgICAvLyBGQUxMVEhST1VHSAorICAgICAgY2FzZSBJbnN0clN0YWdlOjpSZXNlcnZlZDoKKyAgICAgICAgLy8gUmVzZXJ2ZWQgRlVzIGNhbiBjb25mbGljdCBvbmx5IHdpdGggcmVxdWlyZWQgb25lcy4KKyAgICAgICAgZnJlZVVuaXRzICY9IH5SZXF1aXJlZFNjb3JlYm9hcmRbY3ljbGUgKyBpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlZHVjZSB0byBhIHNpbmdsZSB1bml0CisgICAgICB1bnNpZ25lZCBmcmVlVW5pdCA9IDA7CisgICAgICBkbyB7CisgICAgICAgIGZyZWVVbml0ID0gZnJlZVVuaXRzOworICAgICAgICBmcmVlVW5pdHMgPSBmcmVlVW5pdCAmIChmcmVlVW5pdCAtIDEpOworICAgICAgfSB3aGlsZSAoZnJlZVVuaXRzKTsKKworICAgICAgYXNzZXJ0KGZyZWVVbml0ICYmICJObyBmdW5jdGlvbiB1bml0IGF2YWlsYWJsZSEiKTsKKyAgICAgIGlmIChJUy0+Z2V0UmVzZXJ2YXRpb25LaW5kKCkgPT0gSW5zdHJTdGFnZTo6UmVxdWlyZWQpCisgICAgICAgIFJlcXVpcmVkU2NvcmVib2FyZFtjeWNsZSArIGldIHw9IGZyZWVVbml0OworICAgICAgZWxzZQorICAgICAgICBSZXNlcnZlZFNjb3JlYm9hcmRbY3ljbGUgKyBpXSB8PSBmcmVlVW5pdDsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHRoZSBjeWNsZSB0byB0aGUgbmV4dCBzdGFnZS4KKyAgICBjeWNsZSArPSBJUy0+Z2V0TmV4dEN5Y2xlcygpOworICB9CisKKyAgREVCVUcoUmVzZXJ2ZWRTY29yZWJvYXJkLmR1bXAoKSk7CisgIERFQlVHKFJlcXVpcmVkU2NvcmVib2FyZC5kdW1wKCkpOworfQorCit2b2lkIFBvc3RSQUhhemFyZFJlY29nbml6ZXI6OkFkdmFuY2VDeWNsZSgpIHsKKyAgUmVzZXJ2ZWRTY29yZWJvYXJkWzBdID0gMDsgUmVzZXJ2ZWRTY29yZWJvYXJkLmFkdmFuY2UoKTsKKyAgUmVxdWlyZWRTY29yZWJvYXJkWzBdID0gMDsgUmVxdWlyZWRTY29yZWJvYXJkLmFkdmFuY2UoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Bvc3RSQVNjaGVkdWxlckxpc3QuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUG9zdFJBU2NoZWR1bGVyTGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiZDZkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Bvc3RSQVNjaGVkdWxlckxpc3QuY3BwCkBAIC0wLDAgKzEsNjk0IEBACisvLz09PS0tLS0tIFNjaGVkdWxlUG9zdFJBTGlzdC5jcHAgLSBsaXN0IHNjaGVkdWxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaW1wbGVtZW50cyBhIHRvcC1kb3duIGxpc3Qgc2NoZWR1bGVyLCB1c2luZyBzdGFuZGFyZCBhbGdvcml0aG1zLgorLy8gVGhlIGJhc2ljIGFwcHJvYWNoIHVzZXMgYSBwcmlvcml0eSBxdWV1ZSBvZiBhdmFpbGFibGUgbm9kZXMgdG8gc2NoZWR1bGUuCisvLyBPbmUgYXQgYSB0aW1lLCBub2RlcyBhcmUgdGFrZW4gZnJvbSB0aGUgcHJpb3JpdHkgcXVldWUgKHRodXMgaW4gcHJpb3JpdHkKKy8vIG9yZGVyKSwgY2hlY2tlZCBmb3IgbGVnYWxpdHkgdG8gc2NoZWR1bGUsIGFuZCBlbWl0dGVkIGlmIGxlZ2FsLgorLy8KKy8vIE5vZGVzIG1heSBub3QgYmUgbGVnYWwgdG8gc2NoZWR1bGUgZWl0aGVyIGR1ZSB0byBzdHJ1Y3R1cmFsIGhhemFyZHMgKGUuZy4KKy8vIHBpcGVsaW5lIG9yIHJlc291cmNlIGNvbnN0cmFpbnRzKSBvciBiZWNhdXNlIGFuIGlucHV0IHRvIHRoZSBpbnN0cnVjdGlvbiBoYXMKKy8vIG5vdCBjb21wbGV0ZWQgZXhlY3V0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicG9zdC1SQS1zY2hlZCIKKyNpbmNsdWRlICJBbnRpRGVwQnJlYWtlci5oIgorI2luY2x1ZGUgIkFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlci5oIgorI2luY2x1ZGUgIkNyaXRpY2FsQW50aURlcEJyZWFrZXIuaCIKKyNpbmNsdWRlICJTY2hlZHVsZURBR0luc3Rycy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGF0ZW5jeVByaW9yaXR5UXVldWUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVyUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlSGF6YXJkUmVjb2duaXplci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFN1YnRhcmdldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSA8c2V0PgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1Ob29wcywgIk51bWJlciBvZiBub29wcyBpbnNlcnRlZCIpOworU1RBVElTVElDKE51bVN0YWxscywgIk51bWJlciBvZiBwaXBlbGluZSBzdGFsbHMiKTsKK1NUQVRJU1RJQyhOdW1GaXhlZEFudGksICJOdW1iZXIgb2YgZml4ZWQgYW50aS1kZXBlbmRlbmNpZXMiKTsKKworLy8gUG9zdC1SQSBzY2hlZHVsaW5nIGlzIGVuYWJsZWQgd2l0aAorLy8gVGFyZ2V0U3VidGFyZ2V0LmVuYWJsZVBvc3RSQVNjaGVkdWxlcigpLiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgdG8KKy8vIG92ZXJyaWRlIHRoZSB0YXJnZXQuCitzdGF0aWMgY2w6Om9wdDxib29sPgorRW5hYmxlUG9zdFJBU2NoZWR1bGVyKCJwb3N0LVJBLXNjaGVkdWxlciIsCisgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJFbmFibGUgc2NoZWR1bGluZyBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSwgY2w6OkhpZGRlbik7CitzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KK0VuYWJsZUFudGlEZXBCcmVha2luZygiYnJlYWstYW50aS1kZXBlbmRlbmNpZXMiLAorICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJCcmVhayBwb3N0LVJBIHNjaGVkdWxpbmcgYW50aS1kZXBlbmRlbmNpZXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJjcml0aWNhbFwiLCBcImFsbFwiLCBvciBcIm5vbmVcIiIpLAorICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KCJub25lIiksIGNsOjpIaWRkZW4pOworCisvLyBJZiBEZWJ1Z0RpdiA+IDAgdGhlbiBvbmx5IHNjaGVkdWxlIE1CQiB3aXRoIChJRCAlIERlYnVnRGl2KSA9PSBEZWJ1Z01vZAorc3RhdGljIGNsOjpvcHQ8aW50PgorRGVidWdEaXYoInBvc3RyYS1zY2hlZC1kZWJ1Z2RpdiIsCisgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkRlYnVnIGNvbnRyb2wgTUJCcyB0aGF0IGFyZSBzY2hlZHVsZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICBjbDo6aW5pdCgwKSwgY2w6OkhpZGRlbik7CitzdGF0aWMgY2w6Om9wdDxpbnQ+CitEZWJ1Z01vZCgicG9zdHJhLXNjaGVkLWRlYnVnbW9kIiwKKyAgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiRGVidWcgY29udHJvbCBNQkJzIHRoYXQgYXJlIHNjaGVkdWxlZCIpLAorICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KDApLCBjbDo6SGlkZGVuKTsKKworQW50aURlcEJyZWFrZXI6On5BbnRpRGVwQnJlYWtlcigpIHsgfQorCituYW1lc3BhY2UgeworICBjbGFzcyBQb3N0UkFTY2hlZHVsZXIgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgQWxpYXNBbmFseXNpcyAqQUE7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWw7CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworICAgIFBvc3RSQVNjaGVkdWxlcihDb2RlR2VuT3B0OjpMZXZlbCBvbCkgOgorICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCksIE9wdExldmVsKG9sKSB7fQorCisgICAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPEFsaWFzQW5hbHlzaXM+KCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVMb29wSW5mbz4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxNYWNoaW5lTG9vcEluZm8+KCk7CisgICAgICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiUG9zdCBSQSB0b3AtZG93biBsaXN0IGxhdGVuY3kgc2NoZWR1bGVyIjsKKyAgICB9CisKKyAgICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRm4pOworICB9OworICBjaGFyIFBvc3RSQVNjaGVkdWxlcjo6SUQgPSAwOworCisgIGNsYXNzIFNjaGVkdWxlUG9zdFJBVERMaXN0IDogcHVibGljIFNjaGVkdWxlREFHSW5zdHJzIHsKKyAgICAvLy8gQXZhaWxhYmxlUXVldWUgLSBUaGUgcHJpb3JpdHkgcXVldWUgdG8gdXNlIGZvciB0aGUgYXZhaWxhYmxlIFNVbml0cy4KKyAgICAvLy8KKyAgICBMYXRlbmN5UHJpb3JpdHlRdWV1ZSBBdmFpbGFibGVRdWV1ZTsKKworICAgIC8vLyBQZW5kaW5nUXVldWUgLSBUaGlzIGNvbnRhaW5zIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHdob3NlIG9wZXJhbmRzIGhhdmUKKyAgICAvLy8gYmVlbiBpc3N1ZWQsIGJ1dCB0aGVpciByZXN1bHRzIGFyZSBub3QgcmVhZHkgeWV0IChkdWUgdG8gdGhlIGxhdGVuY3kgb2YKKyAgICAvLy8gdGhlIG9wZXJhdGlvbikuICBPbmNlIHRoZSBvcGVyYW5kcyBiZWNvbWVzIGF2YWlsYWJsZSwgdGhlIGluc3RydWN0aW9uIGlzCisgICAgLy8vIGFkZGVkIHRvIHRoZSBBdmFpbGFibGVRdWV1ZS4KKyAgICBzdGQ6OnZlY3RvcjxTVW5pdCo+IFBlbmRpbmdRdWV1ZTsKKworICAgIC8vLyBUb3BvIC0gQSB0b3BvbG9naWNhbCBvcmRlcmluZyBmb3IgU1VuaXRzLgorICAgIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0IFRvcG87CisKKyAgICAvLy8gSGF6YXJkUmVjIC0gVGhlIGhhemFyZCByZWNvZ25pemVyIHRvIHVzZS4KKyAgICBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgKkhhemFyZFJlYzsKKworICAgIC8vLyBBbnRpRGVwQnJlYWsgLSBBbnRpLWRlcGVuZGVuY2UgYnJlYWtpbmcgb2JqZWN0LCBvciBOVUxMIGlmIG5vbmUKKyAgICBBbnRpRGVwQnJlYWtlciAqQW50aURlcEJyZWFrOworCisgICAgLy8vIEFBIC0gQWxpYXNBbmFseXNpcyBmb3IgbWFraW5nIG1lbW9yeSByZWZlcmVuY2UgcXVlcmllcy4KKyAgICBBbGlhc0FuYWx5c2lzICpBQTsKKworICAgIC8vLyBLaWxsSW5kaWNlcyAtIFRoZSBpbmRleCBvZiB0aGUgbW9zdCByZWNlbnQga2lsbCAocHJvY2VkaW5nIGJvdHRvbS11cCksCisgICAgLy8vIG9yIH4wdSBpZiB0aGUgcmVnaXN0ZXIgaXMgbm90IGxpdmUuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IEtpbGxJbmRpY2VzOworCisgIHB1YmxpYzoKKyAgICBTY2hlZHVsZVBvc3RSQVRETGlzdChNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAmTUxJLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVEb21pbmF0b3JUcmVlICZNRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICpIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBbnRpRGVwQnJlYWtlciAqQURCLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKmFhKQorICAgICAgOiBTY2hlZHVsZURBR0luc3RycyhNRiwgTUxJLCBNRFQpLCBUb3BvKFNVbml0cyksCisgICAgICAgIEhhemFyZFJlYyhIUiksIEFudGlEZXBCcmVhayhBREIpLCBBQShhYSksCisgICAgICAgIEtpbGxJbmRpY2VzKFRSSS0+Z2V0TnVtUmVncygpKSB7fQorCisgICAgflNjaGVkdWxlUG9zdFJBVERMaXN0KCkgeworICAgIH0KKworICAgIC8vLyBTdGFydEJsb2NrIC0gSW5pdGlhbGl6ZSByZWdpc3RlciBsaXZlLXJhbmdlIHN0YXRlIGZvciBzY2hlZHVsaW5nIGluCisgICAgLy8vIHRoaXMgYmxvY2suCisgICAgLy8vCisgICAgdm9pZCBTdGFydEJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisKKyAgICAvLy8gU2NoZWR1bGUgLSBTY2hlZHVsZSB0aGUgaW5zdHJ1Y3Rpb24gcmFuZ2UgdXNpbmcgbGlzdCBzY2hlZHVsaW5nLgorICAgIC8vLworICAgIHZvaWQgU2NoZWR1bGUoKTsKKworICAgIC8vLyBPYnNlcnZlIC0gVXBkYXRlIGxpdmVuZXNzIGluZm9ybWF0aW9uIHRvIGFjY291bnQgZm9yIHRoZSBjdXJyZW50CisgICAgLy8vIGluc3RydWN0aW9uLCB3aGljaCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQuCisgICAgLy8vCisgICAgdm9pZCBPYnNlcnZlKE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIENvdW50KTsKKworICAgIC8vLyBGaW5pc2hCbG9jayAtIENsZWFuIHVwIHJlZ2lzdGVyIGxpdmUtcmFuZ2Ugc3RhdGUuCisgICAgLy8vCisgICAgdm9pZCBGaW5pc2hCbG9jaygpOworCisgICAgLy8vIEZpeHVwS2lsbHMgLSBGaXggcmVnaXN0ZXIga2lsbCBmbGFncyB0aGF0IGhhdmUgYmVlbiBtYWRlCisgICAgLy8vIGludmFsaWQgZHVlIHRvIHNjaGVkdWxpbmcKKyAgICAvLy8KKyAgICB2b2lkIEZpeHVwS2lsbHMoTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIFJlbGVhc2VTdWNjKFNVbml0ICpTVSwgU0RlcCAqU3VjY0VkZ2UpOworICAgIHZvaWQgUmVsZWFzZVN1Y2Nlc3NvcnMoU1VuaXQgKlNVKTsKKyAgICB2b2lkIFNjaGVkdWxlTm9kZVRvcERvd24oU1VuaXQgKlNVLCB1bnNpZ25lZCBDdXJDeWNsZSk7CisgICAgdm9pZCBMaXN0U2NoZWR1bGVUb3BEb3duKCk7CisgICAgdm9pZCBTdGFydEJsb2NrRm9yS2lsbHMoTWFjaGluZUJhc2ljQmxvY2sgKkJCKTsKKworICAgIC8vIFRvZ2dsZUtpbGxGbGFnIC0gVG9nZ2xlIGEgcmVnaXN0ZXIgb3BlcmFuZCBraWxsIGZsYWcuIE90aGVyCisgICAgLy8gYWRqdXN0bWVudHMgbWF5IGJlIG1hZGUgdG8gdGhlIGluc3RydWN0aW9uIGlmIG5lY2Vzc2FyeS4gUmV0dXJuCisgICAgLy8gdHJ1ZSBpZiB0aGUgb3BlcmFuZCBoYXMgYmVlbiBkZWxldGVkLCBmYWxzZSBpZiBub3QuCisgICAgYm9vbCBUb2dnbGVLaWxsRmxhZyhNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lT3BlcmFuZCAmTU8pOworICB9OworfQorCitib29sIFBvc3RSQVNjaGVkdWxlcjo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGbikgeworICBBQSA9ICZnZXRBbmFseXNpczxBbGlhc0FuYWx5c2lzPigpOworICBUSUkgPSBGbi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKTsKKworICAvLyBDaGVjayBmb3IgZXhwbGljaXQgZW5hYmxlL2Rpc2FibGUgb2YgcG9zdC1yYSBzY2hlZHVsaW5nLgorICBUYXJnZXRTdWJ0YXJnZXQ6OkFudGlEZXBCcmVha01vZGUgQW50aURlcE1vZGUgPSBUYXJnZXRTdWJ0YXJnZXQ6OkFOVElERVBfTk9ORTsKKyAgU21hbGxWZWN0b3I8VGFyZ2V0UmVnaXN0ZXJDbGFzcyosIDQ+IENyaXRpY2FsUGF0aFJDczsKKyAgaWYgKEVuYWJsZVBvc3RSQVNjaGVkdWxlci5nZXRQb3NpdGlvbigpID4gMCkgeworICAgIGlmICghRW5hYmxlUG9zdFJBU2NoZWR1bGVyKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIC8vIENoZWNrIHRoYXQgcG9zdC1SQSBzY2hlZHVsaW5nIGlzIGVuYWJsZWQgZm9yIHRoaXMgdGFyZ2V0LgorICAgIGNvbnN0IFRhcmdldFN1YnRhcmdldCAmU1QgPSBGbi5nZXRUYXJnZXQoKS5nZXRTdWJ0YXJnZXQ8VGFyZ2V0U3VidGFyZ2V0PigpOworICAgIGlmICghU1QuZW5hYmxlUG9zdFJBU2NoZWR1bGVyKE9wdExldmVsLCBBbnRpRGVwTW9kZSwgQ3JpdGljYWxQYXRoUkNzKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIENoZWNrIGZvciBhbnRpZGVwIGJyZWFraW5nIG92ZXJyaWRlLi4uCisgIGlmIChFbmFibGVBbnRpRGVwQnJlYWtpbmcuZ2V0UG9zaXRpb24oKSA+IDApIHsKKyAgICBBbnRpRGVwTW9kZSA9IChFbmFibGVBbnRpRGVwQnJlYWtpbmcgPT0gImFsbCIpID8KKyAgICAgIFRhcmdldFN1YnRhcmdldDo6QU5USURFUF9BTEwgOgorICAgICAgICAoRW5hYmxlQW50aURlcEJyZWFraW5nID09ICJjcml0aWNhbCIpCisgICAgICAgICAgID8gVGFyZ2V0U3VidGFyZ2V0OjpBTlRJREVQX0NSSVRJQ0FMIDogVGFyZ2V0U3VidGFyZ2V0OjpBTlRJREVQX05PTkU7CisgIH0KKworICBERUJVRyhkYmdzKCkgPDwgIlBvc3RSQVNjaGVkdWxlclxuIik7CisKKyAgY29uc3QgTWFjaGluZUxvb3BJbmZvICZNTEkgPSBnZXRBbmFseXNpczxNYWNoaW5lTG9vcEluZm8+KCk7CisgIGNvbnN0IE1hY2hpbmVEb21pbmF0b3JUcmVlICZNRFQgPSBnZXRBbmFseXNpczxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBGbi5nZXRUYXJnZXQoKTsKKyAgY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICZJbnN0ckl0aW5zID0gVE0uZ2V0SW5zdHJJdGluZXJhcnlEYXRhKCk7CisgIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplciAqSFIgPQorICAgIFRNLmdldEluc3RySW5mbygpLT5DcmVhdGVUYXJnZXRQb3N0UkFIYXphcmRSZWNvZ25pemVyKEluc3RySXRpbnMpOworICBBbnRpRGVwQnJlYWtlciAqQURCID0KKyAgICAoKEFudGlEZXBNb2RlID09IFRhcmdldFN1YnRhcmdldDo6QU5USURFUF9BTEwpID8KKyAgICAgKEFudGlEZXBCcmVha2VyICopbmV3IEFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlcihGbiwgQ3JpdGljYWxQYXRoUkNzKSA6CisgICAgICgoQW50aURlcE1vZGUgPT0gVGFyZ2V0U3VidGFyZ2V0OjpBTlRJREVQX0NSSVRJQ0FMKSA/CisgICAgICAoQW50aURlcEJyZWFrZXIgKiluZXcgQ3JpdGljYWxBbnRpRGVwQnJlYWtlcihGbikgOiBOVUxMKSk7CisKKyAgU2NoZWR1bGVQb3N0UkFURExpc3QgU2NoZWR1bGVyKEZuLCBNTEksIE1EVCwgSFIsIEFEQiwgQUEpOworCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIGJhc2ljIGJsb2NrcworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUJCID0gRm4uYmVnaW4oKSwgTUJCZSA9IEZuLmVuZCgpOworICAgICAgIE1CQiAhPSBNQkJlOyArK01CQikgeworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBJZiBEZWJ1Z0RpdiA+IDAgdGhlbiBvbmx5IHNjaGVkdWxlIE1CQiB3aXRoIChJRCAlIERlYnVnRGl2KSA9PSBEZWJ1Z01vZAorICAgIGlmIChEZWJ1Z0RpdiA+IDApIHsKKyAgICAgIHN0YXRpYyBpbnQgYmJjbnQgPSAwOworICAgICAgaWYgKGJiY250KysgJSBEZWJ1Z0RpdiAhPSBEZWJ1Z01vZCkKKyAgICAgICAgY29udGludWU7CisgICAgICBkYmdzKCkgPDwgIioqKiBERUJVRyBzY2hlZHVsaW5nICIgPDwgRm4uZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZVN0cigpIDw8CisgICAgICAgICI6QkIjIiA8PCBNQkItPmdldE51bWJlcigpIDw8ICIgKioqXG4iOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gSW5pdGlhbGl6ZSByZWdpc3RlciBsaXZlLXJhbmdlIHN0YXRlIGZvciBzY2hlZHVsaW5nIGluIHRoaXMgYmxvY2suCisgICAgU2NoZWR1bGVyLlN0YXJ0QmxvY2soTUJCKTsKKworICAgIC8vIFNjaGVkdWxlIGVhY2ggc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIG5vdCBpbnRlcnJ1cHRlZCBieSBhIGxhYmVsCisgICAgLy8gb3IgYW55dGhpbmcgZWxzZSB0aGF0IGVmZmVjdGl2ZWx5IG5lZWRzIHRvIHNodXQgZG93biBzY2hlZHVsaW5nLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBDdXJyZW50ID0gTUJCLT5lbmQoKTsKKyAgICB1bnNpZ25lZCBDb3VudCA9IE1CQi0+c2l6ZSgpLCBDdXJyZW50Q291bnQgPSBDb3VudDsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQ3VycmVudDsgSSAhPSBNQkItPmJlZ2luKCk7ICkgeworICAgICAgTWFjaGluZUluc3RyICpNSSA9IGxsdm06OnByaW9yKEkpOworICAgICAgaWYgKFRJSS0+aXNTY2hlZHVsaW5nQm91bmRhcnkoTUksIE1CQiwgRm4pKSB7CisgICAgICAgIFNjaGVkdWxlci5SdW4oTUJCLCBJLCBDdXJyZW50LCBDdXJyZW50Q291bnQpOworICAgICAgICBTY2hlZHVsZXIuRW1pdFNjaGVkdWxlKCk7CisgICAgICAgIEN1cnJlbnQgPSBNSTsKKyAgICAgICAgQ3VycmVudENvdW50ID0gQ291bnQgLSAxOworICAgICAgICBTY2hlZHVsZXIuT2JzZXJ2ZShNSSwgQ3VycmVudENvdW50KTsKKyAgICAgIH0KKyAgICAgIEkgPSBNSTsKKyAgICAgIC0tQ291bnQ7CisgICAgfQorICAgIGFzc2VydChDb3VudCA9PSAwICYmICJJbnN0cnVjdGlvbiBjb3VudCBtaXNtYXRjaCEiKTsKKyAgICBhc3NlcnQoKE1CQi0+YmVnaW4oKSA9PSBDdXJyZW50IHx8IEN1cnJlbnRDb3VudCAhPSAwKSAmJgorICAgICAgICAgICAiSW5zdHJ1Y3Rpb24gY291bnQgbWlzbWF0Y2ghIik7CisgICAgU2NoZWR1bGVyLlJ1bihNQkIsIE1CQi0+YmVnaW4oKSwgQ3VycmVudCwgQ3VycmVudENvdW50KTsKKyAgICBTY2hlZHVsZXIuRW1pdFNjaGVkdWxlKCk7CisKKyAgICAvLyBDbGVhbiB1cCByZWdpc3RlciBsaXZlLXJhbmdlIHN0YXRlLgorICAgIFNjaGVkdWxlci5GaW5pc2hCbG9jaygpOworCisgICAgLy8gVXBkYXRlIHJlZ2lzdGVyIGtpbGxzCisgICAgU2NoZWR1bGVyLkZpeHVwS2lsbHMoTUJCKTsKKyAgfQorCisgIGRlbGV0ZSBIUjsKKyAgZGVsZXRlIEFEQjsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFN0YXJ0QmxvY2sgLSBJbml0aWFsaXplIHJlZ2lzdGVyIGxpdmUtcmFuZ2Ugc3RhdGUgZm9yIHNjaGVkdWxpbmcgaW4KKy8vLyB0aGlzIGJsb2NrLgorLy8vCit2b2lkIFNjaGVkdWxlUG9zdFJBVERMaXN0OjpTdGFydEJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgeworICAvLyBDYWxsIHRoZSBzdXBlcmNsYXNzLgorICBTY2hlZHVsZURBR0luc3Ryczo6U3RhcnRCbG9jayhCQik7CisKKyAgLy8gUmVzZXQgdGhlIGhhemFyZCByZWNvZ25pemVyIGFuZCBhbnRpLWRlcCBicmVha2VyLgorICBIYXphcmRSZWMtPlJlc2V0KCk7CisgIGlmIChBbnRpRGVwQnJlYWsgIT0gTlVMTCkKKyAgICBBbnRpRGVwQnJlYWstPlN0YXJ0QmxvY2soQkIpOworfQorCisvLy8gU2NoZWR1bGUgLSBTY2hlZHVsZSB0aGUgaW5zdHJ1Y3Rpb24gcmFuZ2UgdXNpbmcgbGlzdCBzY2hlZHVsaW5nLgorLy8vCit2b2lkIFNjaGVkdWxlUG9zdFJBVERMaXN0OjpTY2hlZHVsZSgpIHsKKyAgLy8gQnVpbGQgdGhlIHNjaGVkdWxpbmcgZ3JhcGguCisgIEJ1aWxkU2NoZWRHcmFwaChBQSk7CisKKyAgaWYgKEFudGlEZXBCcmVhayAhPSBOVUxMKSB7CisgICAgdW5zaWduZWQgQnJva2VuID0KKyAgICAgIEFudGlEZXBCcmVhay0+QnJlYWtBbnRpRGVwZW5kZW5jaWVzKFNVbml0cywgQmVnaW4sIEluc2VydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydFBvc0luZGV4KTsKKworICAgIGlmIChCcm9rZW4gIT0gMCkgeworICAgICAgLy8gV2UgbWFkZSBjaGFuZ2VzLiBVcGRhdGUgdGhlIGRlcGVuZGVuY3kgZ3JhcGguCisgICAgICAvLyBUaGVvcmV0aWNhbGx5IHdlIGNvdWxkIHVwZGF0ZSB0aGUgZ3JhcGggaW4gcGxhY2U6CisgICAgICAvLyBXaGVuIGEgbGl2ZSByYW5nZSBpcyBjaGFuZ2VkIHRvIHVzZSBhIGRpZmZlcmVudCByZWdpc3RlciwgcmVtb3ZlCisgICAgICAvLyB0aGUgZGVmJ3MgYW50aS1kZXBlbmRlbmNlICphbmQqIG91dHB1dC1kZXBlbmRlbmNlIGVkZ2VzIGR1ZSB0bworICAgICAgLy8gdGhhdCByZWdpc3RlciwgYW5kIGFkZCBuZXcgYW50aS1kZXBlbmRlbmNlIGFuZCBvdXRwdXQtZGVwZW5kZW5jZQorICAgICAgLy8gZWRnZXMgYmFzZWQgb24gdGhlIG5leHQgbGl2ZSByYW5nZSBvZiB0aGUgcmVnaXN0ZXIuCisgICAgICBTVW5pdHMuY2xlYXIoKTsKKyAgICAgIFNlcXVlbmNlLmNsZWFyKCk7CisgICAgICBFbnRyeVNVID0gU1VuaXQoKTsKKyAgICAgIEV4aXRTVSA9IFNVbml0KCk7CisgICAgICBCdWlsZFNjaGVkR3JhcGgoQUEpOworCisgICAgICBOdW1GaXhlZEFudGkgKz0gQnJva2VuOworICAgIH0KKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiKioqKioqKioqKiBMaXN0IFNjaGVkdWxpbmcgKioqKioqKioqKlxuIik7CisgIERFQlVHKGZvciAodW5zaWduZWQgc3UgPSAwLCBlID0gU1VuaXRzLnNpemUoKTsgc3UgIT0gZTsgKytzdSkKKyAgICAgICAgICBTVW5pdHNbc3VdLmR1bXBBbGwodGhpcykpOworCisgIEF2YWlsYWJsZVF1ZXVlLmluaXROb2RlcyhTVW5pdHMpOworICBMaXN0U2NoZWR1bGVUb3BEb3duKCk7CisgIEF2YWlsYWJsZVF1ZXVlLnJlbGVhc2VTdGF0ZSgpOworfQorCisvLy8gT2JzZXJ2ZSAtIFVwZGF0ZSBsaXZlbmVzcyBpbmZvcm1hdGlvbiB0byBhY2NvdW50IGZvciB0aGUgY3VycmVudAorLy8vIGluc3RydWN0aW9uLCB3aGljaCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQuCisvLy8KK3ZvaWQgU2NoZWR1bGVQb3N0UkFURExpc3Q6Ok9ic2VydmUoTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgQ291bnQpIHsKKyAgaWYgKEFudGlEZXBCcmVhayAhPSBOVUxMKQorICAgIEFudGlEZXBCcmVhay0+T2JzZXJ2ZShNSSwgQ291bnQsIEluc2VydFBvc0luZGV4KTsKK30KKworLy8vIEZpbmlzaEJsb2NrIC0gQ2xlYW4gdXAgcmVnaXN0ZXIgbGl2ZS1yYW5nZSBzdGF0ZS4KKy8vLwordm9pZCBTY2hlZHVsZVBvc3RSQVRETGlzdDo6RmluaXNoQmxvY2soKSB7CisgIGlmIChBbnRpRGVwQnJlYWsgIT0gTlVMTCkKKyAgICBBbnRpRGVwQnJlYWstPkZpbmlzaEJsb2NrKCk7CisKKyAgLy8gQ2FsbCB0aGUgc3VwZXJjbGFzcy4KKyAgU2NoZWR1bGVEQUdJbnN0cnM6OkZpbmlzaEJsb2NrKCk7Cit9CisKKy8vLyBTdGFydEJsb2NrRm9yS2lsbHMgLSBJbml0aWFsaXplIHJlZ2lzdGVyIGxpdmUtcmFuZ2Ugc3RhdGUgZm9yIHVwZGF0aW5nIGtpbGxzCisvLy8KK3ZvaWQgU2NoZWR1bGVQb3N0UkFURExpc3Q6OlN0YXJ0QmxvY2tGb3JLaWxscyhNYWNoaW5lQmFzaWNCbG9jayAqQkIpIHsKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgaW5kaWNlcyB0byBpbmRpY2F0ZSB0aGF0IG5vIHJlZ2lzdGVycyBhcmUgbGl2ZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFRSSS0+Z2V0TnVtUmVncygpOyArK2kpCisgICAgS2lsbEluZGljZXNbaV0gPSB+MHU7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBsaXZlLW91dCBwaHlzcmVncyBmb3IgdGhpcyBibG9jay4KKyAgaWYgKCFCQi0+ZW1wdHkoKSAmJiBCQi0+YmFjaygpLmdldERlc2MoKS5pc1JldHVybigpKSB7CisgICAgLy8gSW4gYSByZXR1cm4gYmxvY2ssIGV4YW1pbmUgdGhlIGZ1bmN0aW9uIGxpdmUtb3V0IHJlZ3MuCisgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpsaXZlb3V0X2l0ZXJhdG9yIEkgPSBNUkkubGl2ZW91dF9iZWdpbigpLAorICAgICAgICAgICBFID0gTVJJLmxpdmVvdXRfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSAqSTsKKyAgICAgIEtpbGxJbmRpY2VzW1JlZ10gPSBCQi0+c2l6ZSgpOworICAgICAgLy8gUmVwZWF0LCBmb3IgYWxsIHN1YnJlZ3MuCisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTdWJyZWcgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOworICAgICAgICAgICAqU3VicmVnOyArK1N1YnJlZykgeworICAgICAgICBLaWxsSW5kaWNlc1sqU3VicmVnXSA9IEJCLT5zaXplKCk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgeworICAgIC8vIEluIGEgbm9uLXJldHVybiBibG9jaywgZXhhbWluZSB0aGUgbGl2ZS1pbiByZWdzIG9mIGFsbCBzdWNjZXNzb3JzLgorICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnN1Y2NfaXRlcmF0b3IgU0kgPSBCQi0+c3VjY19iZWdpbigpLAorICAgICAgICAgICBTRSA9IEJCLT5zdWNjX2VuZCgpOyBTSSAhPSBTRTsgKytTSSkgeworICAgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6bGl2ZWluX2l0ZXJhdG9yIEkgPSAoKlNJKS0+bGl2ZWluX2JlZ2luKCksCisgICAgICAgICAgICAgRSA9ICgqU0kpLT5saXZlaW5fZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIHVuc2lnbmVkIFJlZyA9ICpJOworICAgICAgICBLaWxsSW5kaWNlc1tSZWddID0gQkItPnNpemUoKTsKKyAgICAgICAgLy8gUmVwZWF0LCBmb3IgYWxsIHN1YnJlZ3MuCisgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YnJlZyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgICAgICAgKlN1YnJlZzsgKytTdWJyZWcpIHsKKyAgICAgICAgICBLaWxsSW5kaWNlc1sqU3VicmVnXSA9IEJCLT5zaXplKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworYm9vbCBTY2hlZHVsZVBvc3RSQVRETGlzdDo6VG9nZ2xlS2lsbEZsYWcoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVPcGVyYW5kICZNTykgeworICAvLyBTZXR0aW5nIGtpbGwgZmxhZy4uLgorICBpZiAoIU1PLmlzS2lsbCgpKSB7CisgICAgTU8uc2V0SXNLaWxsKHRydWUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElmIE1PIGl0c2VsZiBpcyBsaXZlLCBjbGVhciB0aGUga2lsbCBmbGFnLi4uCisgIGlmIChLaWxsSW5kaWNlc1tNTy5nZXRSZWcoKV0gIT0gfjB1KSB7CisgICAgTU8uc2V0SXNLaWxsKGZhbHNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJZiBhbnkgc3VicmVnIG9mIE1PIGlzIGxpdmUsIHRoZW4gY3JlYXRlIGFuIGltcC1kZWYgZm9yIHRoYXQKKyAgLy8gc3VicmVnIGFuZCBrZWVwIE1PIG1hcmtlZCBhcyBraWxsZWQuCisgIE1PLnNldElzS2lsbChmYWxzZSk7CisgIGJvb2wgQWxsRGVhZCA9IHRydWU7CisgIGNvbnN0IHVuc2lnbmVkIFN1cGVyUmVnID0gTU8uZ2V0UmVnKCk7CisgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YnJlZyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFN1cGVyUmVnKTsKKyAgICAgICAqU3VicmVnOyArK1N1YnJlZykgeworICAgIGlmIChLaWxsSW5kaWNlc1sqU3VicmVnXSAhPSB+MHUpIHsKKyAgICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWcoKlN1YnJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLypJc0RlZiovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAvKklzSW1wKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qSXNLaWxsKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qSXNEZWFkKi8pKTsKKyAgICAgIEFsbERlYWQgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBpZihBbGxEZWFkKQorICAgIE1PLnNldElzS2lsbCh0cnVlKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gRml4dXBLaWxscyAtIEZpeCB0aGUgcmVnaXN0ZXIga2lsbCBmbGFncywgdGhleSBtYXkgaGF2ZSBiZWVuIG1hZGUKKy8vLyBpbmNvcnJlY3QgYnkgaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZy4KKy8vLwordm9pZCBTY2hlZHVsZVBvc3RSQVRETGlzdDo6Rml4dXBLaWxscyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiRml4dXAga2lsbHMgZm9yIEJCIyIgPDwgTUJCLT5nZXROdW1iZXIoKSA8PCAnXG4nKTsKKworICBzdGQ6OnNldDx1bnNpZ25lZD4ga2lsbGVkUmVnczsKKyAgQml0VmVjdG9yIFJlc2VydmVkUmVncyA9IFRSSS0+Z2V0UmVzZXJ2ZWRSZWdzKE1GKTsKKworICBTdGFydEJsb2NrRm9yS2lsbHMoTUJCKTsKKworICAvLyBFeGFtaW5lIGJsb2NrIGZyb20gZW5kIHRvIHN0YXJ0Li4uCisgIHVuc2lnbmVkIENvdW50ID0gTUJCLT5zaXplKCk7CisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkItPmVuZCgpLCBFID0gTUJCLT5iZWdpbigpOworICAgICAgIEkgIT0gRTsgLS1Db3VudCkgeworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSAtLUk7CisgICAgaWYgKE1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gVXBkYXRlIGxpdmVuZXNzLiAgUmVnaXN0ZXJzIHRoYXQgYXJlIGRlZmVkIGJ1dCBub3QgdXNlZCBpbiB0aGlzCisgICAgLy8gaW5zdHJ1Y3Rpb24gYXJlIG5vdyBkZWFkLiBNYXJrIHJlZ2lzdGVyIGFuZCBhbGwgc3VicmVncyBhcyB0aGV5CisgICAgLy8gYXJlIGNvbXBsZXRlbHkgZGVmaW5lZC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSkgY29udGludWU7CisgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgIGlmIChSZWcgPT0gMCkgY29udGludWU7CisgICAgICBpZiAoIU1PLmlzRGVmKCkpIGNvbnRpbnVlOworICAgICAgLy8gSWdub3JlIHR3by1hZGRyIGRlZnMuCisgICAgICBpZiAoTUktPmlzUmVnVGllZFRvVXNlT3BlcmFuZChpKSkgY29udGludWU7CisKKyAgICAgIEtpbGxJbmRpY2VzW1JlZ10gPSB+MHU7CisKKyAgICAgIC8vIFJlcGVhdCBmb3IgYWxsIHN1YnJlZ3MuCisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTdWJyZWcgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOworICAgICAgICAgICAqU3VicmVnOyArK1N1YnJlZykgeworICAgICAgICBLaWxsSW5kaWNlc1sqU3VicmVnXSA9IH4wdTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFeGFtaW5lIGFsbCB1c2VkIHJlZ2lzdGVycyBhbmQgc2V0L2NsZWFyIGtpbGwgZmxhZy4gV2hlbiBhCisgICAgLy8gcmVnaXN0ZXIgaXMgdXNlZCBtdWx0aXBsZSB0aW1lcyB3ZSBvbmx5IHNldCB0aGUga2lsbCBmbGFnIG9uCisgICAgLy8gdGhlIGZpcnN0IHVzZS4KKyAgICBraWxsZWRSZWdzLmNsZWFyKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzVXNlKCkpIGNvbnRpbnVlOworICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBpZiAoKFJlZyA9PSAwKSB8fCBSZXNlcnZlZFJlZ3MudGVzdChSZWcpKSBjb250aW51ZTsKKworICAgICAgYm9vbCBraWxsID0gZmFsc2U7CisgICAgICBpZiAoa2lsbGVkUmVncy5maW5kKFJlZykgPT0ga2lsbGVkUmVncy5lbmQoKSkgeworICAgICAgICBraWxsID0gdHJ1ZTsKKyAgICAgICAgLy8gQSByZWdpc3RlciBpcyBub3Qga2lsbGVkIGlmIGFueSBzdWJyZWdzIGFyZSBsaXZlLi4uCisgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YnJlZyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgICAgICAgKlN1YnJlZzsgKytTdWJyZWcpIHsKKyAgICAgICAgICBpZiAoS2lsbEluZGljZXNbKlN1YnJlZ10gIT0gfjB1KSB7CisgICAgICAgICAgICBraWxsID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBzdWJyZWcgaXMgbm90IGxpdmUsIHRoZW4gcmVnaXN0ZXIgaXMga2lsbGVkIGlmIGl0IGJlY2FtZQorICAgICAgICAvLyBsaXZlIGluIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgaWYgKGtpbGwpCisgICAgICAgICAga2lsbCA9IChLaWxsSW5kaWNlc1tSZWddID09IH4wdSk7CisgICAgICB9CisKKyAgICAgIGlmIChNTy5pc0tpbGwoKSAhPSBraWxsKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRml4aW5nICIgPDwgTU8gPDwgIiBpbiAiKTsKKyAgICAgICAgLy8gV2FybmluZzogVG9nZ2xlS2lsbEZsYWcgbWF5IGludmFsaWRhdGUgTU8uCisgICAgICAgIFRvZ2dsZUtpbGxGbGFnKE1JLCBNTyk7CisgICAgICAgIERFQlVHKE1JLT5kdW1wKCkpOworICAgICAgfQorCisgICAgICBraWxsZWRSZWdzLmluc2VydChSZWcpOworICAgIH0KKworICAgIC8vIE1hcmsgYW55IHVzZWQgcmVnaXN0ZXIgKHRoYXQgaXMgbm90IHVzaW5nIHVuZGVmKSBhbmQgc3VicmVncyBhcworICAgIC8vIG5vdyBsaXZlLi4uCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzVXNlKCkgfHwgTU8uaXNVbmRlZigpKSBjb250aW51ZTsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgICAgaWYgKChSZWcgPT0gMCkgfHwgUmVzZXJ2ZWRSZWdzLnRlc3QoUmVnKSkgY29udGludWU7CisKKyAgICAgIEtpbGxJbmRpY2VzW1JlZ10gPSBDb3VudDsKKworICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3VicmVnID0gVFJJLT5nZXRTdWJSZWdpc3RlcnMoUmVnKTsKKyAgICAgICAgICAgKlN1YnJlZzsgKytTdWJyZWcpIHsKKyAgICAgICAgS2lsbEluZGljZXNbKlN1YnJlZ10gPSBDb3VudDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBUb3AtRG93biBTY2hlZHVsaW5nCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gUmVsZWFzZVN1Y2MgLSBEZWNyZW1lbnQgdGhlIE51bVByZWRzTGVmdCBjb3VudCBvZiBhIHN1Y2Nlc3Nvci4gQWRkIGl0IHRvCisvLy8gdGhlIFBlbmRpbmdRdWV1ZSBpZiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLiBBbHNvIHVwZGF0ZSBpdHMgY3ljbGUgYm91bmQuCit2b2lkIFNjaGVkdWxlUG9zdFJBVERMaXN0OjpSZWxlYXNlU3VjYyhTVW5pdCAqU1UsIFNEZXAgKlN1Y2NFZGdlKSB7CisgIFNVbml0ICpTdWNjU1UgPSBTdWNjRWRnZS0+Z2V0U1VuaXQoKTsKKworI2lmbmRlZiBOREVCVUcKKyAgaWYgKFN1Y2NTVS0+TnVtUHJlZHNMZWZ0ID09IDApIHsKKyAgICBkYmdzKCkgPDwgIioqKiBTY2hlZHVsaW5nIGZhaWxlZCEgKioqXG4iOworICAgIFN1Y2NTVS0+ZHVtcCh0aGlzKTsKKyAgICBkYmdzKCkgPDwgIiBoYXMgYmVlbiByZWxlYXNlZCB0b28gbWFueSB0aW1lcyFcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorI2VuZGlmCisgIC0tU3VjY1NVLT5OdW1QcmVkc0xlZnQ7CisKKyAgLy8gQ29tcHV0ZSBob3cgbWFueSBjeWNsZXMgaXQgd2lsbCBiZSBiZWZvcmUgdGhpcyBhY3R1YWxseSBiZWNvbWVzCisgIC8vIGF2YWlsYWJsZS4gIFRoaXMgaXMgdGhlIG1heCBvZiB0aGUgc3RhcnQgdGltZSBvZiBhbGwgcHJlZGVjZXNzb3JzIHBsdXMKKyAgLy8gdGhlaXIgbGF0ZW5jaWVzLgorICBTdWNjU1UtPnNldERlcHRoVG9BdExlYXN0KFNVLT5nZXREZXB0aCgpICsgU3VjY0VkZ2UtPmdldExhdGVuY3koKSk7CisKKyAgLy8gSWYgYWxsIHRoZSBub2RlJ3MgcHJlZGVjZXNzb3JzIGFyZSBzY2hlZHVsZWQsIHRoaXMgbm9kZSBpcyByZWFkeQorICAvLyB0byBiZSBzY2hlZHVsZWQuIElnbm9yZSB0aGUgc3BlY2lhbCBFeGl0U1Ugbm9kZS4KKyAgaWYgKFN1Y2NTVS0+TnVtUHJlZHNMZWZ0ID09IDAgJiYgU3VjY1NVICE9ICZFeGl0U1UpCisgICAgUGVuZGluZ1F1ZXVlLnB1c2hfYmFjayhTdWNjU1UpOworfQorCisvLy8gUmVsZWFzZVN1Y2Nlc3NvcnMgLSBDYWxsIFJlbGVhc2VTdWNjIG9uIGVhY2ggb2YgU1UncyBzdWNjZXNzb3JzLgordm9pZCBTY2hlZHVsZVBvc3RSQVRETGlzdDo6UmVsZWFzZVN1Y2Nlc3NvcnMoU1VuaXQgKlNVKSB7CisgIGZvciAoU1VuaXQ6OnN1Y2NfaXRlcmF0b3IgSSA9IFNVLT5TdWNjcy5iZWdpbigpLCBFID0gU1UtPlN1Y2NzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgUmVsZWFzZVN1Y2MoU1UsICYqSSk7CisgIH0KK30KKworLy8vIFNjaGVkdWxlTm9kZVRvcERvd24gLSBBZGQgdGhlIG5vZGUgdG8gdGhlIHNjaGVkdWxlLiBEZWNyZW1lbnQgdGhlIHBlbmRpbmcKKy8vLyBjb3VudCBvZiBpdHMgc3VjY2Vzc29ycy4gSWYgYSBzdWNjZXNzb3IgcGVuZGluZyBjb3VudCBpcyB6ZXJvLCBhZGQgaXQgdG8KKy8vLyB0aGUgQXZhaWxhYmxlIHF1ZXVlLgordm9pZCBTY2hlZHVsZVBvc3RSQVRETGlzdDo6U2NoZWR1bGVOb2RlVG9wRG93bihTVW5pdCAqU1UsIHVuc2lnbmVkIEN1ckN5Y2xlKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiKioqIFNjaGVkdWxpbmcgWyIgPDwgQ3VyQ3ljbGUgPDwgIl06ICIpOworICBERUJVRyhTVS0+ZHVtcCh0aGlzKSk7CisKKyAgU2VxdWVuY2UucHVzaF9iYWNrKFNVKTsKKyAgYXNzZXJ0KEN1ckN5Y2xlID49IFNVLT5nZXREZXB0aCgpICYmCisgICAgICAgICAiTm9kZSBzY2hlZHVsZWQgYWJvdmUgaXRzIGRlcHRoISIpOworICBTVS0+c2V0RGVwdGhUb0F0TGVhc3QoQ3VyQ3ljbGUpOworCisgIFJlbGVhc2VTdWNjZXNzb3JzKFNVKTsKKyAgU1UtPmlzU2NoZWR1bGVkID0gdHJ1ZTsKKyAgQXZhaWxhYmxlUXVldWUuU2NoZWR1bGVkTm9kZShTVSk7Cit9CisKKy8vLyBMaXN0U2NoZWR1bGVUb3BEb3duIC0gVGhlIG1haW4gbG9vcCBvZiBsaXN0IHNjaGVkdWxpbmcgZm9yIHRvcC1kb3duCisvLy8gc2NoZWR1bGVycy4KK3ZvaWQgU2NoZWR1bGVQb3N0UkFURExpc3Q6Okxpc3RTY2hlZHVsZVRvcERvd24oKSB7CisgIHVuc2lnbmVkIEN1ckN5Y2xlID0gMDsKKworICAvLyBXZSdyZSBzY2hlZHVsaW5nIHRvcC1kb3duIGJ1dCB3ZSdyZSB2aXNpdGluZyB0aGUgcmVnaW9ucyBpbgorICAvLyBib3R0b20tdXAgb3JkZXIsIHNvIHdlIGRvbid0IGtub3cgdGhlIGhhemFyZHMgYXQgdGhlIHN0YXJ0IG9mIGEKKyAgLy8gcmVnaW9uLiBTbyBhc3N1bWUgbm8gaGF6YXJkcyAodGhpcyBzaG91bGQgdXN1YWxseSBiZSBvayBhcyBtb3N0CisgIC8vIGJsb2NrcyBhcmUgYSBzaW5nbGUgcmVnaW9uKS4KKyAgSGF6YXJkUmVjLT5SZXNldCgpOworCisgIC8vIFJlbGVhc2UgYW55IHN1Y2Nlc3NvcnMgb2YgdGhlIHNwZWNpYWwgRW50cnkgbm9kZS4KKyAgUmVsZWFzZVN1Y2Nlc3NvcnMoJkVudHJ5U1UpOworCisgIC8vIEFkZCBhbGwgbGVhdmVzIHRvIEF2YWlsYWJsZSBxdWV1ZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNVbml0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gSXQgaXMgYXZhaWxhYmxlIGlmIGl0IGhhcyBubyBwcmVkZWNlc3NvcnMuCisgICAgYm9vbCBhdmFpbGFibGUgPSBTVW5pdHNbaV0uUHJlZHMuZW1wdHkoKTsKKyAgICBpZiAoYXZhaWxhYmxlKSB7CisgICAgICBBdmFpbGFibGVRdWV1ZS5wdXNoKCZTVW5pdHNbaV0pOworICAgICAgU1VuaXRzW2ldLmlzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBJbiBhbnkgY3ljbGUgd2hlcmUgd2UgY2FuJ3Qgc2NoZWR1bGUgYW55IGluc3RydWN0aW9ucywgd2UgbXVzdAorICAvLyBzdGFsbCBvciBlbWl0IGEgbm9vcCwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCisgIGJvb2wgQ3ljbGVIYXNJbnN0cyA9IGZhbHNlOworCisgIC8vIFdoaWxlIEF2YWlsYWJsZSBxdWV1ZSBpcyBub3QgZW1wdHksIGdyYWIgdGhlIG5vZGUgd2l0aCB0aGUgaGlnaGVzdAorICAvLyBwcmlvcml0eS4gSWYgaXQgaXMgbm90IHJlYWR5IHB1dCBpdCBiYWNrLiAgU2NoZWR1bGUgdGhlIG5vZGUuCisgIHN0ZDo6dmVjdG9yPFNVbml0Kj4gTm90UmVhZHk7CisgIFNlcXVlbmNlLnJlc2VydmUoU1VuaXRzLnNpemUoKSk7CisgIHdoaWxlICghQXZhaWxhYmxlUXVldWUuZW1wdHkoKSB8fCAhUGVuZGluZ1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZSBwZW5kaW5nIGluc3RydWN0aW9ucyBhcmUgcmVhZHkgdG8gaXNzdWUuICBJZgorICAgIC8vIHNvLCBhZGQgdGhlbSB0byB0aGUgYXZhaWxhYmxlIHF1ZXVlLgorICAgIHVuc2lnbmVkIE1pbkRlcHRoID0gfjB1OworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQZW5kaW5nUXVldWUuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKFBlbmRpbmdRdWV1ZVtpXS0+Z2V0RGVwdGgoKSA8PSBDdXJDeWNsZSkgeworICAgICAgICBBdmFpbGFibGVRdWV1ZS5wdXNoKFBlbmRpbmdRdWV1ZVtpXSk7CisgICAgICAgIFBlbmRpbmdRdWV1ZVtpXS0+aXNBdmFpbGFibGUgPSB0cnVlOworICAgICAgICBQZW5kaW5nUXVldWVbaV0gPSBQZW5kaW5nUXVldWUuYmFjaygpOworICAgICAgICBQZW5kaW5nUXVldWUucG9wX2JhY2soKTsKKyAgICAgICAgLS1pOyAtLWU7CisgICAgICB9IGVsc2UgaWYgKFBlbmRpbmdRdWV1ZVtpXS0+Z2V0RGVwdGgoKSA8IE1pbkRlcHRoKQorICAgICAgICBNaW5EZXB0aCA9IFBlbmRpbmdRdWV1ZVtpXS0+Z2V0RGVwdGgoKTsKKyAgICB9CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuKioqIEV4YW1pbmluZyBBdmFpbGFibGVcbiI7CisgICAgICAgICAgTGF0ZW5jeVByaW9yaXR5UXVldWUgcSA9IEF2YWlsYWJsZVF1ZXVlOworICAgICAgICAgIHdoaWxlICghcS5lbXB0eSgpKSB7CisgICAgICAgICAgICBTVW5pdCAqc3UgPSBxLnBvcCgpOworICAgICAgICAgICAgZGJncygpIDw8ICJIZWlnaHQgIiA8PCBzdS0+Z2V0SGVpZ2h0KCkgPDwgIjogIjsKKyAgICAgICAgICAgIHN1LT5kdW1wKHRoaXMpOworICAgICAgICAgIH0pOworCisgICAgU1VuaXQgKkZvdW5kU1VuaXQgPSAwOworICAgIGJvb2wgSGFzTm9vcEhhemFyZHMgPSBmYWxzZTsKKyAgICB3aGlsZSAoIUF2YWlsYWJsZVF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgIFNVbml0ICpDdXJTVW5pdCA9IEF2YWlsYWJsZVF1ZXVlLnBvcCgpOworCisgICAgICBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXI6OkhhemFyZFR5cGUgSFQgPQorICAgICAgICBIYXphcmRSZWMtPmdldEhhemFyZFR5cGUoQ3VyU1VuaXQpOworICAgICAgaWYgKEhUID09IFNjaGVkdWxlSGF6YXJkUmVjb2duaXplcjo6Tm9IYXphcmQpIHsKKyAgICAgICAgRm91bmRTVW5pdCA9IEN1clNVbml0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gUmVtZW1iZXIgaWYgdGhpcyBpcyBhIG5vb3AgaGF6YXJkLgorICAgICAgSGFzTm9vcEhhemFyZHMgfD0gSFQgPT0gU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyOjpOb29wSGF6YXJkOworCisgICAgICBOb3RSZWFkeS5wdXNoX2JhY2soQ3VyU1VuaXQpOworICAgIH0KKworICAgIC8vIEFkZCB0aGUgbm9kZXMgdGhhdCBhcmVuJ3QgcmVhZHkgYmFjayBvbnRvIHRoZSBhdmFpbGFibGUgbGlzdC4KKyAgICBpZiAoIU5vdFJlYWR5LmVtcHR5KCkpIHsKKyAgICAgIEF2YWlsYWJsZVF1ZXVlLnB1c2hfYWxsKE5vdFJlYWR5KTsKKyAgICAgIE5vdFJlYWR5LmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gSWYgd2UgZm91bmQgYSBub2RlIHRvIHNjaGVkdWxlLi4uCisgICAgaWYgKEZvdW5kU1VuaXQpIHsKKyAgICAgIC8vIC4uLiBzY2hlZHVsZSB0aGUgbm9kZS4uLgorICAgICAgU2NoZWR1bGVOb2RlVG9wRG93bihGb3VuZFNVbml0LCBDdXJDeWNsZSk7CisgICAgICBIYXphcmRSZWMtPkVtaXRJbnN0cnVjdGlvbihGb3VuZFNVbml0KTsKKyAgICAgIEN5Y2xlSGFzSW5zdHMgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoQ3ljbGVIYXNJbnN0cykgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIioqKiBGaW5pc2hlZCBjeWNsZSAiIDw8IEN1ckN5Y2xlIDw8ICdcbicpOworICAgICAgICBIYXphcmRSZWMtPkFkdmFuY2VDeWNsZSgpOworICAgICAgfSBlbHNlIGlmICghSGFzTm9vcEhhemFyZHMpIHsKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgcGlwZWxpbmUgc3RhbGwsIGJ1dCBubyBvdGhlciBwcm9ibGVtLAorICAgICAgICAvLyBqdXN0IGFkdmFuY2UgdGhlIGN1cnJlbnQgY3ljbGUgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIqKiogU3RhbGwgaW4gY3ljbGUgIiA8PCBDdXJDeWNsZSA8PCAnXG4nKTsKKyAgICAgICAgSGF6YXJkUmVjLT5BZHZhbmNlQ3ljbGUoKTsKKyAgICAgICAgKytOdW1TdGFsbHM7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgbm8gaW5zdHJ1Y3Rpb25zIHRvIGlzc3VlIGFuZCB3ZSBoYXZlIGluc3RydWN0aW9ucworICAgICAgICAvLyB0aGF0IHdpbGwgZmF1bHQgaWYgd2UgZG9uJ3QgZG8gdGhpcyByaWdodC4gIFRoaXMgaXMgdGhlIGNhc2UgZm9yCisgICAgICAgIC8vIHByb2Nlc3NvcnMgd2l0aG91dCBwaXBlbGluZSBpbnRlcmxvY2tzIGFuZCBvdGhlciBjYXNlcy4KKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIqKiogRW1pdHRpbmcgbm9vcCBpbiBjeWNsZSAiIDw8IEN1ckN5Y2xlIDw8ICdcbicpOworICAgICAgICBIYXphcmRSZWMtPkVtaXROb29wKCk7CisgICAgICAgIFNlcXVlbmNlLnB1c2hfYmFjaygwKTsgICAvLyBOVUxMIGhlcmUgbWVhbnMgbm9vcAorICAgICAgICArK051bU5vb3BzOworICAgICAgfQorCisgICAgICArK0N1ckN5Y2xlOworICAgICAgQ3ljbGVIYXNJbnN0cyA9IGZhbHNlOworICAgIH0KKyAgfQorCisjaWZuZGVmIE5ERUJVRworICBWZXJpZnlTY2hlZHVsZSgvKmlzQm90dG9tVXA9Ki9mYWxzZSk7CisjZW5kaWYKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpYyBDb25zdHJ1Y3RvciBGdW5jdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlUG9zdFJBU2NoZWR1bGVyKENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIHJldHVybiBuZXcgUG9zdFJBU2NoZWR1bGVyKE9wdExldmVsKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1ByZUFsbG9jU3BsaXR0aW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1ByZUFsbG9jU3BsaXR0aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmRmNmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUHJlQWxsb2NTcGxpdHRpbmcuY3BwCkBAIC0wLDAgKzEsMTQyMiBAQAorLy89PT0tLSBQcmVBbGxvY1NwbGl0dGluZy5jcHAgLSBQcmUtYWxsb2NhdGlvbiBJbnRlcnZhbCBTcGx0dGluZyBQYXNzLiAtLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbiBsZXZlbCBwcmUtcmVnaXN0ZXIgYWxsb2NhdGlvbgorLy8gbGl2ZSBpbnRlcnZhbCBzcGxpdHRpbmcgcGFzcy4gSXQgZmluZHMgbGl2ZSBpbnRlcnZhbCBiYXJyaWVycywgaS5lLgorLy8gaW5zdHJ1Y3Rpb25zIHdoaWNoIHdpbGwga2lsbCBhbGwgcGh5c2ljYWwgcmVnaXN0ZXJzIGluIGNlcnRhaW4gcmVnaXN0ZXIKKy8vIGNsYXNzZXMsIGFuZCBzcGxpdCBhbGwgbGl2ZSBpbnRlcnZhbHMgd2hpY2ggY3Jvc3MgdGhlIGJhcnJpZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwcmUtYWxsb2Mtc3BsaXQiCisjaW5jbHVkZSAiVmlydFJlZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9DYWxjU3BpbGxXZWlnaHRzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbEFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVTdGFja0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUmVnaXN0ZXJDb2FsZXNjZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PGludD4gUHJlU3BsaXRMaW1pdCgicHJlLXNwbGl0LWxpbWl0IiwgY2w6OmluaXQoLTEpLCBjbDo6SGlkZGVuKTsKK3N0YXRpYyBjbDo6b3B0PGludD4gRGVhZFNwbGl0TGltaXQoImRlYWQtc3BsaXQtbGltaXQiLCBjbDo6aW5pdCgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpIaWRkZW4pOworc3RhdGljIGNsOjpvcHQ8aW50PiBSZXN0b3JlRm9sZExpbWl0KCJyZXN0b3JlLWZvbGQtbGltaXQiLCBjbDo6aW5pdCgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OkhpZGRlbik7CisKK1NUQVRJU1RJQyhOdW1TcGxpdHMsICJOdW1iZXIgb2YgaW50ZXJ2YWxzIHNwbGl0Iik7CitTVEFUSVNUSUMoTnVtUmVtYXRzLCAiTnVtYmVyIG9mIGludGVydmFscyBzcGxpdCBieSByZW1hdGVyaWFsaXphdGlvbiIpOworU1RBVElTVElDKE51bUZvbGRzLCAiTnVtYmVyIG9mIGludGVydmFscyBzcGxpdCB3aXRoIHNwaWxsIGZvbGRpbmciKTsKK1NUQVRJU1RJQyhOdW1SZXN0b3JlRm9sZHMsICJOdW1iZXIgb2YgaW50ZXJ2YWxzIHNwbGl0IHdpdGggcmVzdG9yZSBmb2xkaW5nIik7CitTVEFUSVNUSUMoTnVtUmVudW1iZXJzLCAiTnVtYmVyIG9mIGludGVydmFscyByZW51bWJlcmVkIGludG8gbmV3IHJlZ2lzdGVycyIpOworU1RBVElTVElDKE51bURlYWRTcGlsbHMsICJOdW1iZXIgb2YgZGVhZCBzcGlsbHMgcmVtb3ZlZCIpOworCituYW1lc3BhY2UgeworICBjbGFzcyBQcmVBbGxvY1NwbGl0dGluZyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBNYWNoaW5lRnVuY3Rpb24gICAgICAgKkN1cnJNRjsKKyAgICBjb25zdCBUYXJnZXRNYWNoaW5lICAgKlRNOworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyogVFJJOworICAgIE1hY2hpbmVGcmFtZUluZm8gICAgICAqTUZJOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gICAqTVJJOworICAgIFNsb3RJbmRleGVzICAgICAgICAgICAqU0lzOworICAgIExpdmVJbnRlcnZhbHMgICAgICAgICAqTElzOworICAgIExpdmVTdGFja3MgICAgICAgICAgICAqTFNzOworICAgIFZpcnRSZWdNYXAgICAgICAgICAgICAqVlJNOworCisgICAgLy8gQmFycmllciAtIEN1cnJlbnQgYmFycmllciBiZWluZyBwcm9jZXNzZWQuCisgICAgTWFjaGluZUluc3RyICAgICAgICAgICpCYXJyaWVyOworCisgICAgLy8gQmFycmllck1CQiAtIEJhc2ljIGJsb2NrIHdoZXJlIHRoZSBiYXJyaWVyIHJlc2lkZXMgaW4uCisgICAgTWFjaGluZUJhc2ljQmxvY2sgICAgICpCYXJyaWVyTUJCOworCisgICAgLy8gQmFycmllciAtIEN1cnJlbnQgYmFycmllciBpbmRleC4KKyAgICBTbG90SW5kZXggICAgIEJhcnJpZXJJZHg7CisKKyAgICAvLyBDdXJyTEkgLSBDdXJyZW50IGxpdmUgaW50ZXJ2YWwgYmVpbmcgc3BsaXQuCisgICAgTGl2ZUludGVydmFsICAgICAgICAgICpDdXJyTEk7CisKKyAgICAvLyBDdXJyU0xJIC0gQ3VycmVudCBzdGFjayBzbG90IGxpdmUgaW50ZXJ2YWwuCisgICAgTGl2ZUludGVydmFsICAgICAgICAgICpDdXJyU0xJOworCisgICAgLy8gQ3VyclNWYWxObyAtIEN1cnJlbnQgdmFsIyBmb3IgdGhlIHN0YWNrIHNsb3QgbGl2ZSBpbnRlcnZhbC4KKyAgICBWTkluZm8gICAgICAgICAgICAgICAgKkN1cnJTVmFsTm87CisKKyAgICAvLyBJbnRlcnZhbFNTTWFwIC0gQSBtYXAgZnJvbSBsaXZlIGludGVydmFsIHRvIHNwaWxsIHNsb3RzLgorICAgIERlbnNlTWFwPHVuc2lnbmVkLCBpbnQ+IEludGVydmFsU1NNYXA7CisKKyAgICAvLyBEZWYyU3BpbGxNYXAgLSBBIG1hcCBmcm9tIGEgZGVmIGluc3RydWN0aW9uIGluZGV4IHRvIHNwaWxsIGluZGV4LgorICAgIERlbnNlTWFwPFNsb3RJbmRleCwgU2xvdEluZGV4PiBEZWYyU3BpbGxNYXA7CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworICAgIFByZUFsbG9jU3BsaXR0aW5nKCkKKyAgICAgIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPFNsb3RJbmRleGVzPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPFNsb3RJbmRleGVzPigpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8TGl2ZUludGVydmFscz4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxMaXZlSW50ZXJ2YWxzPigpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8TGl2ZVN0YWNrcz4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxMaXZlU3RhY2tzPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPFJlZ2lzdGVyQ29hbGVzY2VyPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPENhbGN1bGF0ZVNwaWxsV2VpZ2h0cz4oKTsKKyAgICAgIGlmIChTdHJvbmdQSElFbGltKQorICAgICAgICBBVS5hZGRQcmVzZXJ2ZWRJRChTdHJvbmdQSElFbGltaW5hdGlvbklEKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQVUuYWRkUHJlc2VydmVkSUQoUEhJRWxpbWluYXRpb25JRCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVMb29wSW5mbz4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPFZpcnRSZWdNYXA+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZURvbWluYXRvclRyZWU+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZUxvb3BJbmZvPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPFZpcnRSZWdNYXA+KCk7CisgICAgICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgICB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7CisgICAgICBJbnRlcnZhbFNTTWFwLmNsZWFyKCk7CisgICAgICBEZWYyU3BpbGxNYXAuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJQcmUtUmVnaXN0ZXIgQWxsb2NhdG9uIExpdmUgSW50ZXJ2YWwgU3BsaXR0aW5nIjsKKyAgICB9CisKKyAgICAvLy8gcHJpbnQgLSBJbXBsZW1lbnQgdGhlIGR1bXAgbWV0aG9kLgorICAgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTywgY29uc3QgTW9kdWxlKiBNID0gMCkgY29uc3QgeworICAgICAgTElzLT5wcmludChPLCBNKTsKKyAgICB9CisKKworICBwcml2YXRlOgorCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yCisgICAgICBmaW5kU3BpbGxQb2ludChNYWNoaW5lQmFzaWNCbG9jayosIE1hY2hpbmVJbnN0ciosIE1hY2hpbmVJbnN0ciosCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0PiYpOworCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yCisgICAgICBmaW5kUmVzdG9yZVBvaW50KE1hY2hpbmVCYXNpY0Jsb2NrKiwgTWFjaGluZUluc3RyKiwgU2xvdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgND4mKTsKKworICAgIGludCBDcmVhdGVTcGlsbFN0YWNrU2xvdCh1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqKTsKKworICAgIGJvb2wgSXNBdmFpbGFibGVJblN0YWNrKE1hY2hpbmVCYXNpY0Jsb2NrKiwgdW5zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4LCBTbG90SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4JiwgaW50JikgY29uc3Q7CisKKyAgICB2b2lkIFVwZGF0ZVNwaWxsU2xvdEludGVydmFsKFZOSW5mbyosIFNsb3RJbmRleCwgU2xvdEluZGV4KTsKKworICAgIGJvb2wgU3BsaXRSZWdMaXZlSW50ZXJ2YWwoTGl2ZUludGVydmFsKik7CisKKyAgICBib29sIFNwbGl0UmVnTGl2ZUludGVydmFscyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PExpdmVJbnRlcnZhbCosIDg+Jik7CisgICAgCisgICAgYm9vbCBjcmVhdGVzTmV3Sm9pbihMaXZlUmFuZ2UqIExSLCBNYWNoaW5lQmFzaWNCbG9jayogRGVmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIEJhcnJpZXJNQkIpOworICAgIGJvb2wgUmVtYXRlcmlhbGl6ZSh1bnNpZ25lZCB2cmVnLCBWTkluZm8qIFZhbE5vLAorICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIqIERlZk1JLAorICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUmVzdG9yZVB0LAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0PiYgUmVmc0luTUJCKTsKKyAgICBNYWNoaW5lSW5zdHIqIEZvbGRTcGlsbCh1bnNpZ25lZCB2cmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIqIERlZk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciogQmFycmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgND4mIFJlZnNJbk1CQik7CisgICAgTWFjaGluZUluc3RyKiBGb2xkUmVzdG9yZSh1bnNpZ25lZCB2cmVnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIFJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyKiBCYXJyaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+JiBSZWZzSW5NQkIpOworICAgIHZvaWQgUmVudW1iZXJWYWxubyhWTkluZm8qIFZOKTsKKyAgICB2b2lkIFJlY29uc3RydWN0TGl2ZUludGVydmFsKExpdmVJbnRlcnZhbCogTEkpOworICAgIGJvb2wgcmVtb3ZlRGVhZFNwaWxscyhTbWFsbFB0clNldDxMaXZlSW50ZXJ2YWwqLCA4PiYgc3BsaXQpOworICAgIHVuc2lnbmVkIGdldE51bWJlck9mTm9uU3BpbGxzKFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+JiBNSXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBpbnQgRnJhbWVJbmRleCwgYm9vbCYgVHdvQWRkcik7CisgICAgVk5JbmZvKiBQZXJmb3JtUEhJQ29uc3RydWN0aW9uKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIsIExpdmVJbnRlcnZhbCogTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+JiBWaXNpdGVkLAorICAgICAgICAgICAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCAyPiA+JiBEZWZzLAorICAgICAgICAgICAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCAyPiA+JiBVc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCBWTkluZm8qPiYgTmV3Vk5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIFZOSW5mbyo+JiBMaXZlT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIFZOSW5mbyo+JiBQaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNUb3BMZXZlbCwgYm9vbCBJc0ludHJhQmxvY2spOworICAgIFZOSW5mbyogUGVyZm9ybVBISUNvbnN0cnVjdGlvbkZhbGxCYWNrKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIsIExpdmVJbnRlcnZhbCogTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+JiBWaXNpdGVkLAorICAgICAgICAgICAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCAyPiA+JiBEZWZzLAorICAgICAgICAgICAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCAyPiA+JiBVc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCBWTkluZm8qPiYgTmV3Vk5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIFZOSW5mbyo+JiBMaXZlT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIFZOSW5mbyo+JiBQaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNUb3BMZXZlbCwgYm9vbCBJc0ludHJhQmxvY2spOworfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworY2hhciBQcmVBbGxvY1NwbGl0dGluZzo6SUQgPSAwOworCitzdGF0aWMgUmVnaXN0ZXJQYXNzPFByZUFsbG9jU3BsaXR0aW5nPgorWCgicHJlLWFsbG9jLXNwbGl0dGluZyIsICJQcmUtUmVnaXN0ZXIgQWxsb2NhdGlvbiBMaXZlIEludGVydmFsIFNwbGl0dGluZyIpOworCitjaGFyICZsbHZtOjpQcmVBbGxvY1NwbGl0dGluZ0lEID0gUHJlQWxsb2NTcGxpdHRpbmc6OklEOworCisvLy8gZmluZFNwaWxsUG9pbnQgLSBGaW5kIGEgZ2FwIGFzIGZhciBhd2F5IGZyb20gdGhlIGdpdmVuIE1JIHRoYXQncyBzdWl0YWJsZQorLy8vIGZvciBzcGlsbGluZyB0aGUgY3VycmVudCBsaXZlIGludGVydmFsLiBUaGUgaW5kZXggbXVzdCBiZSBiZWZvcmUgYW55CisvLy8gZGVmcyBhbmQgdXNlcyBvZiB0aGUgbGl2ZSBpbnRlcnZhbCByZWdpc3RlciBpbiB0aGUgbWJiLiBSZXR1cm4gYmVnaW4oKSBpZgorLy8vIG5vbmUgaXMgZm91bmQuCitNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IKK1ByZUFsbG9jU3BsaXR0aW5nOjpmaW5kU3BpbGxQb2ludChNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqRGVmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgND4gJlJlZnNJbk1CQikgeworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUHQgPSBNQkItPmJlZ2luKCk7CisKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JSSA9IE1JOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRW5kUHQgPSBEZWZNSQorICAgID8gTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKERlZk1JKSA6IE1CQi0+YmVnaW4oKTsKKyAgICAKKyAgd2hpbGUgKE1JSSAhPSBFbmRQdCAmJiAhUmVmc0luTUJCLmNvdW50KE1JSSkgJiYKKyAgICAgICAgIE1JSS0+Z2V0T3Bjb2RlKCkgIT0gVFJJLT5nZXRDYWxsRnJhbWVTZXR1cE9wY29kZSgpKQorICAgIC0tTUlJOworICBpZiAoTUlJID09IEVuZFB0IHx8IFJlZnNJbk1CQi5jb3VudChNSUkpKSByZXR1cm4gUHQ7CisgICAgCisgIHdoaWxlIChNSUkgIT0gRW5kUHQgJiYgIVJlZnNJbk1CQi5jb3VudChNSUkpKSB7CisgICAgLy8gV2UgY2FuJ3QgaW5zZXJ0IHRoZSBzcGlsbCBiZXR3ZWVuIHRoZSBiYXJyaWVyIChhIGNhbGwpLCBhbmQgaXRzCisgICAgLy8gY29ycmVzcG9uZGluZyBjYWxsIGZyYW1lIHNldHVwLgorICAgIGlmIChNSUktPmdldE9wY29kZSgpID09IFRSSS0+Z2V0Q2FsbEZyYW1lRGVzdHJveU9wY29kZSgpKSB7CisgICAgICB3aGlsZSAoTUlJLT5nZXRPcGNvZGUoKSAhPSBUUkktPmdldENhbGxGcmFtZVNldHVwT3Bjb2RlKCkpIHsKKyAgICAgICAgLS1NSUk7CisgICAgICAgIGlmIChNSUkgPT0gRW5kUHQpIHsKKyAgICAgICAgICByZXR1cm4gUHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICBQdCA9IE1JSTsKKyAgICB9CisgICAgCisgICAgaWYgKFJlZnNJbk1CQi5jb3VudChNSUkpKQorICAgICAgcmV0dXJuIFB0OworICAgIAorICAgIAorICAgIC0tTUlJOworICB9CisKKyAgcmV0dXJuIFB0OworfQorCisvLy8gZmluZFJlc3RvcmVQb2ludCAtIEZpbmQgYSBnYXAgaW4gdGhlIGluc3RydWN0aW9uIGluZGV4IG1hcCB0aGF0J3Mgc3VpdGFibGUKKy8vLyBmb3IgcmVzdG9yaW5nIHRoZSBjdXJyZW50IGxpdmUgaW50ZXJ2YWwgdmFsdWUuIFRoZSBpbmRleCBtdXN0IGJlIGJlZm9yZSBhbnkKKy8vLyB1c2VzIG9mIHRoZSBsaXZlIGludGVydmFsIHJlZ2lzdGVyIGluIHRoZSBtYmIuIFJldHVybiBlbmQoKSBpZiBub25lIGlzCisvLy8gZm91bmQuCitNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IKK1ByZUFsbG9jU3BsaXR0aW5nOjpmaW5kUmVzdG9yZVBvaW50KE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggTGFzdElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+ICZSZWZzSW5NQkIpIHsKKyAgLy8gRklYTUU6IEFsbG93IHNwaWxsIHRvIGJlIGluc2VydGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1iYi4gVXBkYXRlIG1iYgorICAvLyBiZWdpbiBpbmRleCBhY2NvcmRpbmdseS4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFB0ID0gTUJCLT5lbmQoKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVuZFB0ID0gTUJCLT5nZXRGaXJzdFRlcm1pbmF0b3IoKTsKKworICAvLyBXZSBzdGFydCBhdCB0aGUgY2FsbCwgc28gd2FsayBmb3J3YXJkIHVudGlsIHdlIGZpbmQgdGhlIGNhbGwgZnJhbWUgdGVhcmRvd24KKyAgLy8gc2luY2Ugd2UgY2FuJ3QgaW5zZXJ0IHJlc3RvcmVzIGJlZm9yZSB0aGF0LiAgQmFpbCBpZiB3ZSBlbmNvdW50ZXIgYSB1c2UKKyAgLy8gZHVyaW5nIHRoaXMgdGltZS4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JSSA9IE1JOworICBpZiAoTUlJID09IEVuZFB0KSByZXR1cm4gUHQ7CisgIAorICB3aGlsZSAoTUlJICE9IEVuZFB0ICYmICFSZWZzSW5NQkIuY291bnQoTUlJKSAmJgorICAgICAgICAgTUlJLT5nZXRPcGNvZGUoKSAhPSBUUkktPmdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKSkKKyAgICArK01JSTsKKyAgaWYgKE1JSSA9PSBFbmRQdCB8fCBSZWZzSW5NQkIuY291bnQoTUlJKSkgcmV0dXJuIFB0OworICArK01JSTsKKyAgCisgIC8vIEZJWE1FOiBMaW1pdCB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0byBleGFtaW5lIHRvIHJlZHVjZQorICAvLyBjb21waWxlIHRpbWU/CisgIHdoaWxlIChNSUkgIT0gRW5kUHQpIHsKKyAgICBTbG90SW5kZXggSW5kZXggPSBMSXMtPmdldEluc3RydWN0aW9uSW5kZXgoTUlJKTsKKyAgICBpZiAoSW5kZXggPiBMYXN0SWR4KQorICAgICAgYnJlYWs7CisgICAgICAKKyAgICAvLyBXZSBjYW4ndCBpbnNlcnQgYSByZXN0b3JlIGJldHdlZW4gdGhlIGJhcnJpZXIgKGEgY2FsbCkgYW5kIGl0cyAKKyAgICAvLyBjb3JyZXNwb25kaW5nIGNhbGwgZnJhbWUgdGVhcmRvd24uCisgICAgaWYgKE1JSS0+Z2V0T3Bjb2RlKCkgPT0gVFJJLT5nZXRDYWxsRnJhbWVTZXR1cE9wY29kZSgpKSB7CisgICAgICBkbyB7CisgICAgICAgIGlmIChNSUkgPT0gRW5kUHQgfHwgUmVmc0luTUJCLmNvdW50KE1JSSkpIHJldHVybiBQdDsKKyAgICAgICAgKytNSUk7CisgICAgICB9IHdoaWxlIChNSUktPmdldE9wY29kZSgpICE9IFRSSS0+Z2V0Q2FsbEZyYW1lRGVzdHJveU9wY29kZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgUHQgPSBNSUk7CisgICAgfQorICAgIAorICAgIGlmIChSZWZzSW5NQkIuY291bnQoTUlJKSkKKyAgICAgIHJldHVybiBQdDsKKyAgICAKKyAgICArK01JSTsKKyAgfQorCisgIHJldHVybiBQdDsKK30KKworLy8vIENyZWF0ZVNwaWxsU3RhY2tTbG90IC0gQ3JlYXRlIGEgc3RhY2sgc2xvdCBmb3IgdGhlIGxpdmUgaW50ZXJ2YWwgYmVpbmcKKy8vLyBzcGxpdC4gSWYgdGhlIGxpdmUgaW50ZXJ2YWwgd2FzIHByZXZpb3VzbHkgc3BsaXQsIGp1c3QgcmV1c2UgdGhlIHNhbWUKKy8vLyBzbG90LgoraW50IFByZUFsbG9jU3BsaXR0aW5nOjpDcmVhdGVTcGlsbFN0YWNrU2xvdCh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSB7CisgIGludCBTUzsKKyAgRGVuc2VNYXA8dW5zaWduZWQsIGludD46Oml0ZXJhdG9yIEkgPSBJbnRlcnZhbFNTTWFwLmZpbmQoUmVnKTsKKyAgaWYgKEkgIT0gSW50ZXJ2YWxTU01hcC5lbmQoKSkgeworICAgIFNTID0gSS0+c2Vjb25kOworICB9IGVsc2UgeworICAgIFNTID0gTUZJLT5DcmVhdGVTcGlsbFN0YWNrT2JqZWN0KFJDLT5nZXRTaXplKCksIFJDLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgSW50ZXJ2YWxTU01hcFtSZWddID0gU1M7CisgIH0KKworICAvLyBDcmVhdGUgbGl2ZSBpbnRlcnZhbCBmb3Igc3RhY2sgc2xvdC4KKyAgQ3VyclNMSSA9ICZMU3MtPmdldE9yQ3JlYXRlSW50ZXJ2YWwoU1MsIFJDKTsKKyAgaWYgKEN1cnJTTEktPmhhc0F0TGVhc3RPbmVWYWx1ZSgpKQorICAgIEN1cnJTVmFsTm8gPSBDdXJyU0xJLT5nZXRWYWxOdW1JbmZvKDApOworICBlbHNlCisgICAgQ3VyclNWYWxObyA9IEN1cnJTTEktPmdldE5leHRWYWx1ZShTbG90SW5kZXgoKSwgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMU3MtPmdldFZOSW5mb0FsbG9jYXRvcigpKTsKKyAgcmV0dXJuIFNTOworfQorCisvLy8gSXNBdmFpbGFibGVJblN0YWNrIC0gUmV0dXJuIHRydWUgaWYgcmVnaXN0ZXIgaXMgYXZhaWxhYmxlIGluIGEgc3BsaXQgc3RhY2sKKy8vLyBzbG90IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCitib29sCitQcmVBbGxvY1NwbGl0dGluZzo6SXNBdmFpbGFibGVJblN0YWNrKE1hY2hpbmVCYXNpY0Jsb2NrICpEZWZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsIFNsb3RJbmRleCBEZWZJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RJbmRleCBSZXN0b3JlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggJlNwaWxsSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIFNTKSBjb25zdCB7CisgIGlmICghRGVmTUJCKQorICAgIHJldHVybiBmYWxzZTsKKworICBEZW5zZU1hcDx1bnNpZ25lZCwgaW50Pjo6Y29uc3RfaXRlcmF0b3IgSSA9IEludGVydmFsU1NNYXAuZmluZChSZWcpOworICBpZiAoSSA9PSBJbnRlcnZhbFNTTWFwLmVuZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgRGVuc2VNYXA8U2xvdEluZGV4LCBTbG90SW5kZXg+Ojpjb25zdF9pdGVyYXRvcgorICAgIElJID0gRGVmMlNwaWxsTWFwLmZpbmQoRGVmSW5kZXgpOworICBpZiAoSUkgPT0gRGVmMlNwaWxsTWFwLmVuZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiBsYXN0IHNwaWxsIG9mIGRlZiBpcyBpbiB0aGUgc2FtZSBtYmIgYXMgYmFycmllciBtYmIgKHdoZXJlIHJlc3RvcmUgd2lsbAorICAvLyBiZSksIG1ha2Ugc3VyZSBpdCdzIG5vdCBiZWxvdyB0aGUgaW50ZW5kZWQgcmVzdG9yZSBpbmRleC4KKyAgLy8gRklYTUU6IFVuZG8gdGhlIHByZXZpb3VzIHNwaWxsPworICBhc3NlcnQoTElzLT5nZXRNQkJGcm9tSW5kZXgoSUktPnNlY29uZCkgPT0gRGVmTUJCKTsKKyAgaWYgKERlZk1CQiA9PSBCYXJyaWVyTUJCICYmIElJLT5zZWNvbmQgPj0gUmVzdG9yZUluZGV4KQorICAgIHJldHVybiBmYWxzZTsKKworICBTUyA9IEktPnNlY29uZDsKKyAgU3BpbGxJbmRleCA9IElJLT5zZWNvbmQ7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gVXBkYXRlU3BpbGxTbG90SW50ZXJ2YWwgLSBHaXZlbiB0aGUgc3BlY2lmaWVkIHZhbCMgb2YgdGhlIHJlZ2lzdGVyIGxpdmUKKy8vLyBpbnRlcnZhbCBiZWluZyBzcGxpdCwgYW5kIHRoZSBzcGlsbCBhbmQgcmVzdG9yZSBpbmRpY2llcywgdXBkYXRlIHRoZSBsaXZlCisvLy8gaW50ZXJ2YWwgb2YgdGhlIHNwaWxsIHN0YWNrIHNsb3QuCit2b2lkCitQcmVBbGxvY1NwbGl0dGluZzo6VXBkYXRlU3BpbGxTbG90SW50ZXJ2YWwoVk5JbmZvICpWYWxObywgU2xvdEluZGV4IFNwaWxsSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IFJlc3RvcmVJbmRleCkgeworICBhc3NlcnQoTElzLT5nZXRNQkJGcm9tSW5kZXgoUmVzdG9yZUluZGV4KSA9PSBCYXJyaWVyTUJCICYmCisgICAgICAgICAiRXhwZWN0IHJlc3RvcmUgaW4gdGhlIGJhcnJpZXIgbWJiIik7CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IExJcy0+Z2V0TUJCRnJvbUluZGV4KFNwaWxsSW5kZXgpOworICBpZiAoTUJCID09IEJhcnJpZXJNQkIpIHsKKyAgICAvLyBJbnRyYS1ibG9jayBzcGlsbCArIHJlc3RvcmUuIFdlIGFyZSBkb25lLgorICAgIExpdmVSYW5nZSBTTFIoU3BpbGxJbmRleCwgUmVzdG9yZUluZGV4LCBDdXJyU1ZhbE5vKTsKKyAgICBDdXJyU0xJLT5hZGRSYW5nZShTTFIpOworICAgIHJldHVybjsKKyAgfQorCisgIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwgND4gUHJvY2Vzc2VkOworICBTbG90SW5kZXggRW5kSWR4ID0gTElzLT5nZXRNQkJFbmRJZHgoTUJCKTsKKyAgTGl2ZVJhbmdlIFNMUihTcGlsbEluZGV4LCBFbmRJZHgsIEN1cnJTVmFsTm8pOworICBDdXJyU0xJLT5hZGRSYW5nZShTTFIpOworICBQcm9jZXNzZWQuaW5zZXJ0KE1CQik7CisKKyAgLy8gU3RhcnQgZnJvbSB0aGUgc3BpbGwgbWJiLCBmaWd1cmUgb3V0IHRoZSBleHRlbmQgb2YgdGhlIHNwaWxsIHNsb3QncworICAvLyBsaXZlIGludGVydmFsLgorICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDQ+IFdvcmtMaXN0OworICBjb25zdCBMaXZlUmFuZ2UgKkxSID0gQ3VyckxJLT5nZXRMaXZlUmFuZ2VDb250YWluaW5nKFNwaWxsSW5kZXgpOworICBpZiAoTFItPmVuZCA+IEVuZElkeCkKKyAgICAvLyBJZiBsaXZlIHJhbmdlIGV4dGVuZCBiZXlvbmQgZW5kIG9mIG1iYiwgYWRkIHN1Y2Nlc3NvcnMgdG8gd29yayBsaXN0LgorICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnN1Y2NfaXRlcmF0b3IgU0kgPSBNQkItPnN1Y2NfYmVnaW4oKSwKKyAgICAgICAgICAgU0UgPSBNQkItPnN1Y2NfZW5kKCk7IFNJICE9IFNFOyArK1NJKQorICAgICAgV29ya0xpc3QucHVzaF9iYWNrKCpTSSk7CisKKyAgd2hpbGUgKCFXb3JrTGlzdC5lbXB0eSgpKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IFdvcmtMaXN0LmJhY2soKTsKKyAgICBXb3JrTGlzdC5wb3BfYmFjaygpOworICAgIGlmIChQcm9jZXNzZWQuY291bnQoTUJCKSkKKyAgICAgIGNvbnRpbnVlOworICAgIFNsb3RJbmRleCBJZHggPSBMSXMtPmdldE1CQlN0YXJ0SWR4KE1CQik7CisgICAgTFIgPSBDdXJyTEktPmdldExpdmVSYW5nZUNvbnRhaW5pbmcoSWR4KTsKKyAgICBpZiAoTFIgJiYgTFItPnZhbG5vID09IFZhbE5vKSB7CisgICAgICBFbmRJZHggPSBMSXMtPmdldE1CQkVuZElkeChNQkIpOworICAgICAgaWYgKElkeCA8PSBSZXN0b3JlSW5kZXggJiYgUmVzdG9yZUluZGV4IDwgRW5kSWR4KSB7CisgICAgICAgIC8vIFNwaWxsIHNsb3QgbGl2ZSBpbnRlcnZhbCBzdG9wcyBhdCB0aGUgcmVzdG9yZS4KKyAgICAgICAgTGl2ZVJhbmdlIFNMUihJZHgsIFJlc3RvcmVJbmRleCwgQ3VyclNWYWxObyk7CisgICAgICAgIEN1cnJTTEktPmFkZFJhbmdlKFNMUik7CisgICAgICB9IGVsc2UgaWYgKExSLT5lbmQgPiBFbmRJZHgpIHsKKyAgICAgICAgLy8gTGl2ZSByYW5nZSBleHRlbmRzIGJleW9uZCBlbmQgb2YgbWJiLCBwcm9jZXNzIHN1Y2Nlc3NvcnMuCisgICAgICAgIExpdmVSYW5nZSBTTFIoSWR4LCBFbmRJZHguZ2V0TmV4dEluZGV4KCksIEN1cnJTVmFsTm8pOworICAgICAgICBDdXJyU0xJLT5hZGRSYW5nZShTTFIpOworICAgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpzdWNjX2l0ZXJhdG9yIFNJID0gTUJCLT5zdWNjX2JlZ2luKCksCisgICAgICAgICAgICAgICBTRSA9IE1CQi0+c3VjY19lbmQoKTsgU0kgIT0gU0U7ICsrU0kpCisgICAgICAgICAgV29ya0xpc3QucHVzaF9iYWNrKCpTSSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMaXZlUmFuZ2UgU0xSKElkeCwgTFItPmVuZCwgQ3VyclNWYWxObyk7CisgICAgICAgIEN1cnJTTEktPmFkZFJhbmdlKFNMUik7CisgICAgICB9CisgICAgICBQcm9jZXNzZWQuaW5zZXJ0KE1CQik7CisgICAgfQorICB9Cit9CisKKy8vLyBQZXJmb3JtUEhJQ29uc3RydWN0aW9uIC0gRnJvbSBwcm9wZXJseSBzZXQgdXAgdXNlIGFuZCBkZWYgbGlzdHMsIHVzZSBhIFBISQorLy8vIGNvbnN0cnVjdGlvbiBhbGdvcml0aG0gdG8gY29tcHV0ZSB0aGUgcmFuZ2VzIGFuZCB2YWxub3MgZm9yIGFuIGludGVydmFsLgorVk5JbmZvKgorUHJlQWxsb2NTcGxpdHRpbmc6OlBlcmZvcm1QSElDb25zdHJ1Y3Rpb24oTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFVzZUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogTUJCLCBMaXZlSW50ZXJ2YWwqIExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgND4mIFZpc2l0ZWQsCisgICAgICAgICAgICAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCAyPiA+JiBEZWZzLAorICAgICAgICAgICAgIERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgMj4gPiYgVXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPE1hY2hpbmVJbnN0ciosIFZOSW5mbyo+JiBOZXdWTnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIFZOSW5mbyo+JiBMaXZlT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBWTkluZm8qPiYgUGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVG9wTGV2ZWwsIGJvb2wgSXNJbnRyYUJsb2NrKSB7CisgIC8vIFJldHVybiBtZW1vaXplZCByZXN1bHQgaWYgaXQncyBhdmFpbGFibGUuCisgIGlmIChJc1RvcExldmVsICYmIFZpc2l0ZWQuY291bnQoVXNlSSkgJiYgTmV3Vk5zLmNvdW50KFVzZUkpKQorICAgIHJldHVybiBOZXdWTnNbVXNlSV07CisgIGVsc2UgaWYgKCFJc1RvcExldmVsICYmIElzSW50cmFCbG9jayAmJiBOZXdWTnMuY291bnQoVXNlSSkpCisgICAgcmV0dXJuIE5ld1ZOc1tVc2VJXTsKKyAgZWxzZSBpZiAoIUlzSW50cmFCbG9jayAmJiBMaXZlT3V0LmNvdW50KE1CQikpCisgICAgcmV0dXJuIExpdmVPdXRbTUJCXTsKKyAgCisgIC8vIENoZWNrIGlmIG91ciBibG9jayBjb250YWlucyBhbnkgdXNlcyBvciBkZWZzLgorICBib29sIENvbnRhaW5zRGVmcyA9IERlZnMuY291bnQoTUJCKTsKKyAgYm9vbCBDb250YWluc1VzZXMgPSBVc2VzLmNvdW50KE1CQik7CisgIAorICBWTkluZm8qIFJldFZOSSA9IDA7CisgIAorICAvLyBFbnVtZXJhdGUgdGhlIGNhc2VzIG9mIHVzZS9kZWYgY29udGFuaW5nIGJsb2Nrcy4KKyAgaWYgKCFDb250YWluc0RlZnMgJiYgIUNvbnRhaW5zVXNlcykgeworICAgIHJldHVybiBQZXJmb3JtUEhJQ29uc3RydWN0aW9uRmFsbEJhY2soVXNlSSwgTUJCLCBMSSwgVmlzaXRlZCwgRGVmcywgVXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1ZOcywgTGl2ZU91dCwgUGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzVG9wTGV2ZWwsIElzSW50cmFCbG9jayk7CisgIH0gZWxzZSBpZiAoQ29udGFpbnNEZWZzICYmICFDb250YWluc1VzZXMpIHsKKyAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCAyPiYgQmxvY2tEZWZzID0gRGVmc1tNQkJdOworCisgICAgLy8gU2VhcmNoIGZvciB0aGUgZGVmIGluIHRoaXMgYmxvY2suICBJZiB3ZSBkb24ndCBmaW5kIGl0IGJlZm9yZSB0aGUKKyAgICAvLyBpbnN0cnVjdGlvbiB3ZSBjYXJlIGFib3V0LCBnbyB0byB0aGUgZmFsbGJhY2sgY2FzZS4gIE5vdGUgdGhhdCB0aGF0CisgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbjogdGhpcyBjYW5ub3QgYmUgaW50cmFibG9jaywgc28gdXNlIHNob3VsZAorICAgIC8vIGFsd2F5cyBiZSBhbiBlbmQoKSBpdGVyYXRvci4KKyAgICBhc3NlcnQoVXNlSSA9PSBNQkItPmVuZCgpICYmICJObyB1c2UgbWFya2VkIGluIGludHJhYmxvY2siKTsKKyAgICAKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgV2Fsa2VyID0gVXNlSTsKKyAgICAtLVdhbGtlcjsKKyAgICB3aGlsZSAoV2Fsa2VyICE9IE1CQi0+YmVnaW4oKSkgeworICAgICAgaWYgKEJsb2NrRGVmcy5jb3VudChXYWxrZXIpKQorICAgICAgICBicmVhazsKKyAgICAgIC0tV2Fsa2VyOworICAgIH0KKyAgICAKKyAgICAvLyBPbmNlIHdlJ3ZlIGZvdW5kIGl0LCBleHRlbmQgaXRzIFZOSW5mbyB0byBvdXIgaW5zdHJ1Y3Rpb24uCisgICAgU2xvdEluZGV4IERlZkluZGV4ID0gTElzLT5nZXRJbnN0cnVjdGlvbkluZGV4KFdhbGtlcik7CisgICAgRGVmSW5kZXggPSBEZWZJbmRleC5nZXREZWZJbmRleCgpOworICAgIFNsb3RJbmRleCBFbmRJbmRleCA9IExJcy0+Z2V0TUJCRW5kSWR4KE1CQik7CisgICAgCisgICAgUmV0Vk5JID0gTmV3Vk5zW1dhbGtlcl07CisgICAgTEktPmFkZFJhbmdlKExpdmVSYW5nZShEZWZJbmRleCwgRW5kSW5kZXgsIFJldFZOSSkpOworICB9IGVsc2UgaWYgKCFDb250YWluc0RlZnMgJiYgQ29udGFpbnNVc2VzKSB7CisgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgMj4mIEJsb2NrVXNlcyA9IFVzZXNbTUJCXTsKKyAgICAKKyAgICAvLyBTZWFyY2ggZm9yIHRoZSB1c2UgaW4gdGhpcyBibG9jayB0aGF0IHByZWNlZGVzIHRoZSBpbnN0cnVjdGlvbiB3ZSBjYXJlIAorICAgIC8vIGFib3V0LCBnb2luZyB0byB0aGUgZmFsbGJhY2sgY2FzZSBpZiB3ZSBkb24ndCBmaW5kIGl0LiAgICAKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgV2Fsa2VyID0gVXNlSTsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgd2hpbGUgKFdhbGtlciAhPSBNQkItPmJlZ2luKCkpIHsKKyAgICAgIC0tV2Fsa2VyOworICAgICAgaWYgKEJsb2NrVXNlcy5jb3VudChXYWxrZXIpKSB7CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3VuZCkKKyAgICAgIHJldHVybiBQZXJmb3JtUEhJQ29uc3RydWN0aW9uRmFsbEJhY2soVXNlSSwgTUJCLCBMSSwgVmlzaXRlZCwgRGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcywgTmV3Vk5zLCBMaXZlT3V0LCBQaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1RvcExldmVsLCBJc0ludHJhQmxvY2spOworCisgICAgU2xvdEluZGV4IFVzZUluZGV4ID0gTElzLT5nZXRJbnN0cnVjdGlvbkluZGV4KFdhbGtlcik7CisgICAgVXNlSW5kZXggPSBVc2VJbmRleC5nZXRVc2VJbmRleCgpOworICAgIFNsb3RJbmRleCBFbmRJbmRleDsKKyAgICBpZiAoSXNJbnRyYUJsb2NrKSB7CisgICAgICBFbmRJbmRleCA9IExJcy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleChVc2VJKS5nZXREZWZJbmRleCgpOworICAgIH0gZWxzZQorICAgICAgRW5kSW5kZXggPSBMSXMtPmdldE1CQkVuZElkeChNQkIpOworCisgICAgLy8gTm93LCByZWN1cnNpdmVseSBwaGkgY29uc3RydWN0IHRoZSBWTkluZm8gZm9yIHRoZSB1c2Ugd2UgZm91bmQsCisgICAgLy8gYW5kIHRoZW4gZXh0ZW5kIGl0IHRvIGluY2x1ZGUgdGhlIGluc3RydWN0aW9uIHdlIGNhcmUgYWJvdXQKKyAgICBSZXRWTkkgPSBQZXJmb3JtUEhJQ29uc3RydWN0aW9uKFdhbGtlciwgTUJCLCBMSSwgVmlzaXRlZCwgRGVmcywgVXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1ZOcywgTGl2ZU91dCwgUGhpcywgZmFsc2UsIHRydWUpOworICAgIAorICAgIExJLT5hZGRSYW5nZShMaXZlUmFuZ2UoVXNlSW5kZXgsIEVuZEluZGV4LCBSZXRWTkkpKTsKKyAgICAKKyAgICAvLyBGSVhNRTogTmVlZCB0byBzZXQga2lsbHMgcHJvcGVybHkgZm9yIGludGVyLWJsb2NrIHN0dWZmLgorICB9IGVsc2UgaWYgKENvbnRhaW5zRGVmcyAmJiBDb250YWluc1VzZXMpIHsKKyAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCAyPiYgQmxvY2tEZWZzID0gRGVmc1tNQkJdOworICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDI+JiBCbG9ja1VzZXMgPSBVc2VzW01CQl07CisgICAgCisgICAgLy8gVGhpcyBjYXNlIGlzIGJhc2ljYWxseSBhIG1lcmdpbmcgb2YgdGhlIHR3byBwcmVjZWRpbmcgY2FzZSwgd2l0aCB0aGUKKyAgICAvLyBzcGVjaWFsIG5vdGUgdGhhdCBjaGVja2luZyBmb3IgZGVmcyBtdXN0IHRha2UgcHJlY2VkZW5jZSBvdmVyIGNoZWNraW5nCisgICAgLy8gZm9yIHVzZXMsIGJlY2F1c2Ugb2YgdHdvLWFkZHJlc3MgaW5zdHJ1Y3Rpb25zLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBXYWxrZXIgPSBVc2VJOworICAgIGJvb2wgZm91bmREZWYgPSBmYWxzZTsKKyAgICBib29sIGZvdW5kVXNlID0gZmFsc2U7CisgICAgd2hpbGUgKFdhbGtlciAhPSBNQkItPmJlZ2luKCkpIHsKKyAgICAgIC0tV2Fsa2VyOworICAgICAgaWYgKEJsb2NrRGVmcy5jb3VudChXYWxrZXIpKSB7CisgICAgICAgIGZvdW5kRGVmID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgaWYgKEJsb2NrVXNlcy5jb3VudChXYWxrZXIpKSB7CisgICAgICAgIGZvdW5kVXNlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3VuZERlZiAmJiAhZm91bmRVc2UpCisgICAgICByZXR1cm4gUGVyZm9ybVBISUNvbnN0cnVjdGlvbkZhbGxCYWNrKFVzZUksIE1CQiwgTEksIFZpc2l0ZWQsIERlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXMsIE5ld1ZOcywgTGl2ZU91dCwgUGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNUb3BMZXZlbCwgSXNJbnRyYUJsb2NrKTsKKworICAgIFNsb3RJbmRleCBTdGFydEluZGV4ID0gTElzLT5nZXRJbnN0cnVjdGlvbkluZGV4KFdhbGtlcik7CisgICAgU3RhcnRJbmRleCA9IGZvdW5kRGVmID8gU3RhcnRJbmRleC5nZXREZWZJbmRleCgpIDogU3RhcnRJbmRleC5nZXRVc2VJbmRleCgpOworICAgIFNsb3RJbmRleCBFbmRJbmRleDsKKyAgICBpZiAoSXNJbnRyYUJsb2NrKSB7CisgICAgICBFbmRJbmRleCA9IExJcy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleChVc2VJKS5nZXREZWZJbmRleCgpOworICAgIH0gZWxzZQorICAgICAgRW5kSW5kZXggPSBMSXMtPmdldE1CQkVuZElkeChNQkIpOworCisgICAgaWYgKGZvdW5kRGVmKQorICAgICAgUmV0Vk5JID0gTmV3Vk5zW1dhbGtlcl07CisgICAgZWxzZQorICAgICAgUmV0Vk5JID0gUGVyZm9ybVBISUNvbnN0cnVjdGlvbihXYWxrZXIsIE1CQiwgTEksIFZpc2l0ZWQsIERlZnMsIFVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1ZOcywgTGl2ZU91dCwgUGhpcywgZmFsc2UsIHRydWUpOworCisgICAgTEktPmFkZFJhbmdlKExpdmVSYW5nZShTdGFydEluZGV4LCBFbmRJbmRleCwgUmV0Vk5JKSk7CisgIH0KKyAgCisgIC8vIE1lbW9pemUgcmVzdWx0cyBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlY29tcHV0ZSB0aGVtLgorICBpZiAoIUlzSW50cmFCbG9jaykgTGl2ZU91dFtNQkJdID0gUmV0Vk5JOworICBlbHNlIHsKKyAgICBpZiAoIU5ld1ZOcy5jb3VudChVc2VJKSkKKyAgICAgIE5ld1ZOc1tVc2VJXSA9IFJldFZOSTsKKyAgICBWaXNpdGVkLmluc2VydChVc2VJKTsKKyAgfQorCisgIHJldHVybiBSZXRWTkk7Cit9CisKKy8vLyBQZXJmb3JtUEhJQ29uc3RydWN0aW9uRmFsbEJhY2sgLSBQZXJmb3JtUEhJQ29uc3RydWN0aW9uIGZhbGwgYmFjayBwYXRoLgorLy8vCitWTkluZm8qCitQcmVBbGxvY1NwbGl0dGluZzo6UGVyZm9ybVBISUNvbnN0cnVjdGlvbkZhbGxCYWNrKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBVc2VJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiwgTGl2ZUludGVydmFsKiBMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+JiBWaXNpdGVkLAorICAgICAgICAgICAgIERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgMj4gPiYgRGVmcywKKyAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDI+ID4mIFVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCBWTkluZm8qPiYgTmV3Vk5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBWTkluZm8qPiYgTGl2ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgVk5JbmZvKj4mIFBoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1RvcExldmVsLCBib29sIElzSW50cmFCbG9jaykgeworICAvLyBOT1RFOiBCZWNhdXNlIHRoaXMgaXMgdGhlIGZhbGxiYWNrIGNhc2UgZnJvbSBvdGhlciBjYXNlcywgd2UgZG8gTk9UCisgIC8vIGFzc3VtZSB0aGF0IHdlIGFyZSBub3QgaW50cmFibG9jayBoZXJlLgorICBpZiAoUGhpcy5jb3VudChNQkIpKSByZXR1cm4gUGhpc1tNQkJdOyAKKworICBTbG90SW5kZXggU3RhcnRJbmRleCA9IExJcy0+Z2V0TUJCU3RhcnRJZHgoTUJCKTsKKyAgVk5JbmZvICpSZXRWTkkgPSBQaGlzW01CQl0gPQorICAgIExJLT5nZXROZXh0VmFsdWUoU2xvdEluZGV4KCksIC8qRklYTUUqLyAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIExJcy0+Z2V0Vk5JbmZvQWxsb2NhdG9yKCkpOworCisgIGlmICghSXNJbnRyYUJsb2NrKSBMaXZlT3V0W01CQl0gPSBSZXRWTkk7CisgICAgCisgIC8vIElmIHRoZXJlIGFyZSBubyB1c2VzIG9yIGRlZnMgYmV0d2VlbiBvdXIgc3RhcnRpbmcgcG9pbnQgYW5kIHRoZQorICAvLyBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrLCB0aGVuIHJlY3Vyc2l2ZSBwZXJmb3JtIHBoaSBjb25zdHJ1Y3Rpb24KKyAgLy8gb24gb3VyIHByZWRlY2Vzc29ycy4KKyAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBWTkluZm8qPiBJbmNvbWluZ1ZOczsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6cHJlZF9pdGVyYXRvciBQSSA9IE1CQi0+cHJlZF9iZWdpbigpLAorICAgICAgICAgUEUgPSBNQkItPnByZWRfZW5kKCk7IFBJICE9IFBFOyArK1BJKSB7CisgICAgVk5JbmZvKiBJbmNvbWluZyA9IFBlcmZvcm1QSElDb25zdHJ1Y3Rpb24oKCpQSSktPmVuZCgpLCAqUEksIExJLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpdGVkLCBEZWZzLCBVc2VzLCBOZXdWTnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZU91dCwgUGhpcywgZmFsc2UsIGZhbHNlKTsKKyAgICBpZiAoSW5jb21pbmcgIT0gMCkKKyAgICAgIEluY29taW5nVk5zWypQSV0gPSBJbmNvbWluZzsKKyAgfQorICAgIAorICBpZiAoTUJCLT5wcmVkX3NpemUoKSA9PSAxICYmICFSZXRWTkktPmhhc1BISUtpbGwoKSkgeworICAgIFZOSW5mbyogT2xkVk4gPSBSZXRWTkk7CisgICAgVk5JbmZvKiBOZXdWTiA9IEluY29taW5nVk5zLmJlZ2luKCktPnNlY29uZDsKKyAgICBWTkluZm8qIE1lcmdlZFZOID0gTEktPk1lcmdlVmFsdWVOdW1iZXJJbnRvKE9sZFZOLCBOZXdWTik7CisgICAgaWYgKE1lcmdlZFZOID09IE9sZFZOKSBzdGQ6OnN3YXAoT2xkVk4sIE5ld1ZOKTsKKyAgICAKKyAgICBmb3IgKERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgVk5JbmZvKj46Oml0ZXJhdG9yIExPSSA9IExpdmVPdXQuYmVnaW4oKSwKKyAgICAgICAgIExPRSA9IExpdmVPdXQuZW5kKCk7IExPSSAhPSBMT0U7ICsrTE9JKQorICAgICAgaWYgKExPSS0+c2Vjb25kID09IE9sZFZOKQorICAgICAgICBMT0ktPnNlY29uZCA9IE1lcmdlZFZOOworICAgIGZvciAoRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgVk5JbmZvKj46Oml0ZXJhdG9yIE5WSSA9IE5ld1ZOcy5iZWdpbigpLAorICAgICAgICAgTlZFID0gTmV3Vk5zLmVuZCgpOyBOVkkgIT0gTlZFOyArK05WSSkKKyAgICAgIGlmIChOVkktPnNlY29uZCA9PSBPbGRWTikKKyAgICAgICAgTlZJLT5zZWNvbmQgPSBNZXJnZWRWTjsKKyAgICBmb3IgKERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgVk5JbmZvKj46Oml0ZXJhdG9yIFBJID0gUGhpcy5iZWdpbigpLAorICAgICAgICAgUEUgPSBQaGlzLmVuZCgpOyBQSSAhPSBQRTsgKytQSSkKKyAgICAgIGlmIChQSS0+c2Vjb25kID09IE9sZFZOKQorICAgICAgICBQSS0+c2Vjb25kID0gTWVyZ2VkVk47CisgICAgUmV0Vk5JID0gTWVyZ2VkVk47CisgIH0gZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlLCBtZXJnZSB0aGUgaW5jb21pbmcgVk5JbmZvcyB3aXRoIGEgcGhpIGpvaW4uICBDcmVhdGUgYSBuZXcKKyAgICAvLyBWTkluZm8gdG8gcmVwcmVzZW50IHRoZSBqb2luZWQgdmFsdWUuCisgICAgZm9yIChEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIFZOSW5mbyo+OjppdGVyYXRvciBJID0KKyAgICAgICAgICAgSW5jb21pbmdWTnMuYmVnaW4oKSwgRSA9IEluY29taW5nVk5zLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgSS0+c2Vjb25kLT5zZXRIYXNQSElLaWxsKHRydWUpOworICAgIH0KKyAgfQorICAgICAgCisgIFNsb3RJbmRleCBFbmRJbmRleDsKKyAgaWYgKElzSW50cmFCbG9jaykgeworICAgIEVuZEluZGV4ID0gTElzLT5nZXRJbnN0cnVjdGlvbkluZGV4KFVzZUkpLmdldERlZkluZGV4KCk7CisgIH0gZWxzZQorICAgIEVuZEluZGV4ID0gTElzLT5nZXRNQkJFbmRJZHgoTUJCKTsKKyAgTEktPmFkZFJhbmdlKExpdmVSYW5nZShTdGFydEluZGV4LCBFbmRJbmRleCwgUmV0Vk5JKSk7CisKKyAgLy8gTWVtb2l6ZSByZXN1bHRzIHNvIHdlIGRvbid0IGhhdmUgdG8gcmVjb21wdXRlIHRoZW0uCisgIGlmICghSXNJbnRyYUJsb2NrKQorICAgIExpdmVPdXRbTUJCXSA9IFJldFZOSTsKKyAgZWxzZSB7CisgICAgaWYgKCFOZXdWTnMuY291bnQoVXNlSSkpCisgICAgICBOZXdWTnNbVXNlSV0gPSBSZXRWTkk7CisgICAgVmlzaXRlZC5pbnNlcnQoVXNlSSk7CisgIH0KKworICByZXR1cm4gUmV0Vk5JOworfQorCisvLy8gUmVjb25zdHJ1Y3RMaXZlSW50ZXJ2YWwgLSBSZWNvbXB1dGUgYSBsaXZlIGludGVydmFsIGZyb20gc2NyYXRjaC4KK3ZvaWQgUHJlQWxsb2NTcGxpdHRpbmc6OlJlY29uc3RydWN0TGl2ZUludGVydmFsKExpdmVJbnRlcnZhbCogTEkpIHsKKyAgVk5JbmZvOjpBbGxvY2F0b3ImIEFsbG9jID0gTElzLT5nZXRWTkluZm9BbGxvY2F0b3IoKTsKKyAgCisgIC8vIENsZWFyIHRoZSBvbGQgcmFuZ2VzIGFuZCB2YWxub3M7CisgIExJLT5jbGVhcigpOworICAKKyAgLy8gQ2FjaGUgdGhlIHVzZXMgYW5kIGRlZnMgb2YgdGhlIHJlZ2lzdGVyCisgIHR5cGVkZWYgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCAyPiA+IFJlZ01hcDsKKyAgUmVnTWFwIERlZnMsIFVzZXM7CisgIAorICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBuZXcgVk5zIHdlJ3JlIGNyZWF0aW5nLgorICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCBWTkluZm8qPiBOZXdWTnM7CisgIFNtYWxsUHRyU2V0PFZOSW5mbyosIDI+IFBoaVZOczsKKyAgCisgIC8vIENhY2hlIGRlZnMsIGFuZCBjcmVhdGUgYSBuZXcgVk5JbmZvIGZvciBlYWNoIGRlZi4KKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpkZWZfaXRlcmF0b3IgREkgPSBNUkktPmRlZl9iZWdpbihMSS0+cmVnKSwKKyAgICAgICBERSA9IE1SSS0+ZGVmX2VuZCgpOyBESSAhPSBERTsgKytESSkgeworICAgIERlZnNbKCpESSkuZ2V0UGFyZW50KCldLmluc2VydCgmKkRJKTsKKyAgICAKKyAgICBTbG90SW5kZXggRGVmSWR4ID0gTElzLT5nZXRJbnN0cnVjdGlvbkluZGV4KCYqREkpOworICAgIERlZklkeCA9IERlZklkeC5nZXREZWZJbmRleCgpOworICAgIAorICAgIGFzc2VydCghREktPmlzUEhJKCkgJiYgIlBISSBpbnN0ciBpbiBjb2RlIGR1cmluZyBwcmUtYWxsb2Mgc3BsaXR0aW5nLiIpOworICAgIFZOSW5mbyogTmV3Vk4gPSBMSS0+Z2V0TmV4dFZhbHVlKERlZklkeCwgMCwgdHJ1ZSwgQWxsb2MpOworICAgIAorICAgIC8vIElmIHRoZSBkZWYgaXMgYSBtb3ZlLCBzZXQgdGhlIGNvcHkgZmllbGQuCisgICAgaWYgKERJLT5pc0NvcHlMaWtlKCkgJiYgREktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgPT0gTEktPnJlZykKKyAgICAgIE5ld1ZOLT5zZXRDb3B5KCYqREkpOworCisgICAgTmV3Vk5zWyYqREldID0gTmV3Vk47CisgIH0KKyAgCisgIC8vIENhY2hlIHVzZXMgYXMgYSBzZXBhcmF0ZSBwYXNzIGZyb20gYWN0dWFsbHkgcHJvY2Vzc2luZyB0aGVtLgorICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9pdGVyYXRvciBVSSA9IE1SSS0+dXNlX2JlZ2luKExJLT5yZWcpLAorICAgICAgIFVFID0gTVJJLT51c2VfZW5kKCk7IFVJICE9IFVFOyArK1VJKQorICAgIFVzZXNbKCpVSSkuZ2V0UGFyZW50KCldLmluc2VydCgmKlVJKTsKKyAgICAKKyAgLy8gTm93LCBhY3R1YWxseSBwcm9jZXNzIGV2ZXJ5IHVzZSBhbmQgdXNlIGEgcGhpIGNvbnN0cnVjdGlvbiBhbGdvcml0aG0KKyAgLy8gdG8gd2FsayBmcm9tIGl0IHRvIGl0cyByZWFjaGluZyBkZWZpbml0aW9ucywgYnVpbGRpbmcgVk5JbmZvcyBhbG9uZworICAvLyB0aGUgd2F5LgorICBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIFZOSW5mbyo+IExpdmVPdXQ7CisgIERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgVk5JbmZvKj4gUGhpczsKKyAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgND4gVmlzaXRlZDsKKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2VfaXRlcmF0b3IgVUkgPSBNUkktPnVzZV9iZWdpbihMSS0+cmVnKSwKKyAgICAgICBVRSA9IE1SSS0+dXNlX2VuZCgpOyBVSSAhPSBVRTsgKytVSSkgeworICAgIFBlcmZvcm1QSElDb25zdHJ1Y3Rpb24oJipVSSwgVUktPmdldFBhcmVudCgpLCBMSSwgVmlzaXRlZCwgRGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXMsIE5ld1ZOcywgTGl2ZU91dCwgUGhpcywgdHJ1ZSwgdHJ1ZSk7IAorICB9CisgIAorICAvLyBBZGQgcmFuZ2VzIGZvciBkZWFkIGRlZnMKKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpkZWZfaXRlcmF0b3IgREkgPSBNUkktPmRlZl9iZWdpbihMSS0+cmVnKSwKKyAgICAgICBERSA9IE1SSS0+ZGVmX2VuZCgpOyBESSAhPSBERTsgKytESSkgeworICAgIFNsb3RJbmRleCBEZWZJZHggPSBMSXMtPmdldEluc3RydWN0aW9uSW5kZXgoJipESSk7CisgICAgRGVmSWR4ID0gRGVmSWR4LmdldERlZkluZGV4KCk7CisgICAgCisgICAgaWYgKExJLT5saXZlQXQoRGVmSWR4KSkgY29udGludWU7CisgICAgCisgICAgVk5JbmZvKiBEZWFkVk4gPSBOZXdWTnNbJipESV07CisgICAgTEktPmFkZFJhbmdlKExpdmVSYW5nZShEZWZJZHgsIERlZklkeC5nZXROZXh0U2xvdCgpLCBEZWFkVk4pKTsKKyAgfQorfQorCisvLy8gUmVudW1iZXJWYWxubyAtIFNwbGl0IHRoZSBnaXZlbiB2YWxubyBvdXQgaW50byBhIG5ldyB2cmVnLCBhbGxvd2luZyBpdCB0bworLy8vIGJlIGFsbG9jYXRlZCB0byBhIGRpZmZlcmVudCByZWdpc3Rlci4gIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyB2cmVnLAorLy8vIGNvcGllcyB0aGUgdmFsbm8gYW5kIGl0cyBsaXZlIHJhbmdlcyBvdmVyIHRvIHRoZSBuZXcgdnJlZydzIGludGVydmFsLAorLy8vIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBvbGQgaW50ZXJ2YWwsIGFuZCByZXdyaXRlcyBhbGwgdXNlcyBhbmQgZGVmcyBvZgorLy8vIHRoZSBvcmlnaW5hbCByZWcgdG8gdGhlIG5ldyB2cmVnIHdpdGhpbiB0aG9zZSByYW5nZXMuCit2b2lkIFByZUFsbG9jU3BsaXR0aW5nOjpSZW51bWJlclZhbG5vKFZOSW5mbyogVk4pIHsKKyAgU21hbGxWZWN0b3I8Vk5JbmZvKiwgND4gU3RhY2s7CisgIFNtYWxsVmVjdG9yPFZOSW5mbyosIDQ+IFZOc1RvQ29weTsKKyAgU3RhY2sucHVzaF9iYWNrKFZOKTsKKworICAvLyBXYWxrIHRocm91Z2ggYW5kIGNvcHkgdGhlIHZhbG5vIHdlIGNhcmUgYWJvdXQsIGFuZCBhbnkgb3RoZXIgdmFsbm9zCisgIC8vIHRoYXQgYXJlIHR3by1hZGRyZXNzIHJlZGVmaW5pdGlvbnMgb2YgdGhlIG9uZSB3ZSBjYXJlIGFib3V0LiAgVGhlc2UKKyAgLy8gd2lsbCBuZWVkIHRvIGJlIHJld3JpdHRlbiBhcyB3ZWxsLiAgV2UgYWxzbyBjaGVjayBmb3Igc2FmZXR5IG9mIHRoZSAKKyAgLy8gcmVudW1iZXJpbmcgaGVyZSwgYnkgbWFraW5nIHN1cmUgdGhhdCBub25lIG9mIHRoZSB2YWxubyBpbnZvbHZlZCBoYXMKKyAgLy8gcGhpIGtpbGxzLgorICB3aGlsZSAoIVN0YWNrLmVtcHR5KCkpIHsKKyAgICBWTkluZm8qIE9sZFZOID0gU3RhY2suYmFjaygpOworICAgIFN0YWNrLnBvcF9iYWNrKCk7CisgICAgCisgICAgLy8gQmFpbCBvdXQgaWYgd2UgZXZlciBlbmNvdW50ZXIgYSB2YWxubyB0aGF0IGhhcyBhIFBISSBraWxsLiAgV2UgY2FuJ3QKKyAgICAvLyByZW51bWJlciB0aGVzZS4KKyAgICBpZiAoT2xkVk4tPmhhc1BISUtpbGwoKSkgcmV0dXJuOworICAgIAorICAgIFZOc1RvQ29weS5wdXNoX2JhY2soT2xkVk4pOworICAgIAorICAgIC8vIExvY2F0ZSB0d28tYWRkcmVzcyByZWRlZmluaXRpb25zCisgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpkZWZfaXRlcmF0b3IgREkgPSBNUkktPmRlZl9iZWdpbihDdXJyTEktPnJlZyksCisgICAgICAgICBERSA9IE1SSS0+ZGVmX2VuZCgpOyBESSAhPSBERTsgKytESSkgeworICAgICAgaWYgKCFESS0+aXNSZWdUaWVkVG9Vc2VPcGVyYW5kKERJLmdldE9wZXJhbmRObygpKSkgY29udGludWU7CisgICAgICBTbG90SW5kZXggRGVmSWR4ID0gTElzLT5nZXRJbnN0cnVjdGlvbkluZGV4KCYqREkpLmdldERlZkluZGV4KCk7CisgICAgICBWTkluZm8qIE5leHRWTiA9IEN1cnJMSS0+ZmluZERlZmluZWRWTkluZm9Gb3JSZWdJbnQoRGVmSWR4KTsKKyAgICAgIGlmIChzdGQ6OmZpbmQoVk5zVG9Db3B5LmJlZ2luKCksIFZOc1RvQ29weS5lbmQoKSwgTmV4dFZOKSAhPQorICAgICAgICAgIFZOc1RvQ29weS5lbmQoKSkKKyAgICAgICAgU3RhY2sucHVzaF9iYWNrKE5leHRWTik7CisgICAgfQorICB9CisgIAorICAvLyBDcmVhdGUgdGhlIG5ldyB2cmVnCisgIHVuc2lnbmVkIE5ld1ZSZWcgPSBNUkktPmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihNUkktPmdldFJlZ0NsYXNzKEN1cnJMSS0+cmVnKSk7CisgIAorICAvLyBDcmVhdGUgdGhlIG5ldyBsaXZlIGludGVydmFsCisgIExpdmVJbnRlcnZhbCYgTmV3TEkgPSBMSXMtPmdldE9yQ3JlYXRlSW50ZXJ2YWwoTmV3VlJlZyk7CisgIAorICBmb3IgKFNtYWxsVmVjdG9yPFZOSW5mbyosIDQ+OjppdGVyYXRvciBPSSA9IFZOc1RvQ29weS5iZWdpbigpLCBPRSA9IAorICAgICAgIFZOc1RvQ29weS5lbmQoKTsgT0kgIT0gT0U7ICsrT0kpIHsKKyAgICBWTkluZm8qIE9sZFZOID0gKk9JOworICAgIAorICAgIC8vIENvcHkgdGhlIHZhbG5vIG92ZXIKKyAgICBWTkluZm8qIE5ld1ZOID0gTmV3TEkuY3JlYXRlVmFsdWVDb3B5KE9sZFZOLCBMSXMtPmdldFZOSW5mb0FsbG9jYXRvcigpKTsKKyAgICBOZXdMSS5NZXJnZVZhbHVlSW5Bc1ZhbHVlKCpDdXJyTEksIE9sZFZOLCBOZXdWTik7CisKKyAgICAvLyBSZW1vdmUgdGhlIHZhbG5vIGZyb20gdGhlIG9sZCBpbnRlcnZhbAorICAgIEN1cnJMSS0+cmVtb3ZlVmFsTm8oT2xkVk4pOworICB9CisgIAorICAvLyBSZXdyaXRlIGRlZnMgYW5kIHVzZXMuICBUaGlzIGlzIGRvbmUgaW4gdHdvIHN0YWdlcyB0byBhdm9pZCBpbnZhbGlkYXRpbmcKKyAgLy8gdGhlIHJlZ19pdGVyYXRvci4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPE1hY2hpbmVJbnN0ciosIHVuc2lnbmVkPiwgOD4gT3BzVG9DaGFuZ2U7CisgIAorICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnJlZ19pdGVyYXRvciBJID0gTVJJLT5yZWdfYmVnaW4oQ3VyckxJLT5yZWcpLAorICAgICAgICAgRSA9IE1SSS0+cmVnX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE1hY2hpbmVPcGVyYW5kJiBNTyA9IEkuZ2V0T3BlcmFuZCgpOworICAgIFNsb3RJbmRleCBJbnN0cklkeCA9IExJcy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleCgmKkkpOworICAgIAorICAgIGlmICgoTU8uaXNVc2UoKSAmJiBOZXdMSS5saXZlQXQoSW5zdHJJZHguZ2V0VXNlSW5kZXgoKSkpIHx8CisgICAgICAgIChNTy5pc0RlZigpICYmIE5ld0xJLmxpdmVBdChJbnN0cklkeC5nZXREZWZJbmRleCgpKSkpCisgICAgICBPcHNUb0NoYW5nZS5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoJipJLCBJLmdldE9wZXJhbmRObygpKSk7CisgIH0KKyAgCisgIGZvciAoU21hbGxWZWN0b3I8c3RkOjpwYWlyPE1hY2hpbmVJbnN0ciosIHVuc2lnbmVkPiwgOD46Oml0ZXJhdG9yIEkgPQorICAgICAgIE9wc1RvQ2hhbmdlLmJlZ2luKCksIEUgPSBPcHNUb0NoYW5nZS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lSW5zdHIqIEluc3QgPSBJLT5maXJzdDsKKyAgICB1bnNpZ25lZCBPcElkeCA9IEktPnNlY29uZDsKKyAgICBNYWNoaW5lT3BlcmFuZCYgTU8gPSBJbnN0LT5nZXRPcGVyYW5kKE9wSWR4KTsKKyAgICBNTy5zZXRSZWcoTmV3VlJlZyk7CisgIH0KKyAgCisgIC8vIEdyb3cgdGhlIFZpcnRSZWdNYXAsIHNpbmNlIHdlJ3ZlIGNyZWF0ZWQgYSBuZXcgdnJlZy4KKyAgVlJNLT5ncm93KCk7CisgIAorICAvLyBUaGUgcmVudW1iZXJlZCB2cmVnIHNoYXJlcyBhIHN0YWNrIHNsb3Qgd2l0aCB0aGUgb2xkIHJlZ2lzdGVyLgorICBpZiAoSW50ZXJ2YWxTU01hcC5jb3VudChDdXJyTEktPnJlZykpCisgICAgSW50ZXJ2YWxTU01hcFtOZXdWUmVnXSA9IEludGVydmFsU1NNYXBbQ3VyckxJLT5yZWddOworICAKKyAgKytOdW1SZW51bWJlcnM7Cit9CisKK2Jvb2wgUHJlQWxsb2NTcGxpdHRpbmc6OlJlbWF0ZXJpYWxpemUodW5zaWduZWQgVlJlZywgVk5JbmZvKiBWYWxObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyKiBEZWZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFJlc3RvcmVQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+JiBSZWZzSW5NQkIpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2smIE1CQiA9ICpSZXN0b3JlUHQtPmdldFBhcmVudCgpOworICAKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEtpbGxQdCA9IEJhcnJpZXJNQkItPmVuZCgpOworICBpZiAoIVZhbE5vLT5pc0RlZkFjY3VyYXRlKCkgfHwgRGVmTUktPmdldFBhcmVudCgpID09IEJhcnJpZXJNQkIpCisgICAgS2lsbFB0ID0gZmluZFNwaWxsUG9pbnQoQmFycmllck1CQiwgQmFycmllciwgTlVMTCwgUmVmc0luTUJCKTsKKyAgZWxzZQorICAgIEtpbGxQdCA9IGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKERlZk1JKSk7CisgIAorICBpZiAoS2lsbFB0ID09IERlZk1JLT5nZXRQYXJlbnQoKS0+ZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgVElJLT5yZU1hdGVyaWFsaXplKE1CQiwgUmVzdG9yZVB0LCBWUmVnLCAwLCBEZWZNSSwgKlRSSSk7CisgIFNsb3RJbmRleCBSZW1hdElkeCA9IExJcy0+SW5zZXJ0TWFjaGluZUluc3RySW5NYXBzKHByaW9yKFJlc3RvcmVQdCkpOworICAKKyAgUmVjb25zdHJ1Y3RMaXZlSW50ZXJ2YWwoQ3VyckxJKTsKKyAgUmVtYXRJZHggPSBSZW1hdElkeC5nZXREZWZJbmRleCgpOworICBSZW51bWJlclZhbG5vKEN1cnJMSS0+ZmluZERlZmluZWRWTkluZm9Gb3JSZWdJbnQoUmVtYXRJZHgpKTsKKyAgCisgICsrTnVtU3BsaXRzOworICArK051bVJlbWF0czsKKyAgcmV0dXJuIHRydWU7ICAKK30KKworTWFjaGluZUluc3RyKiBQcmVBbGxvY1NwbGl0dGluZzo6Rm9sZFNwaWxsKHVuc2lnbmVkIHZyZWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIFJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciogRGVmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyKiBCYXJyaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+JiBSZWZzSW5NQkIpIHsKKyAgLy8gR28gdG9wIGRvd24gaWYgUmVmc0luTUJCIGlzIGVtcHR5LgorICBpZiAoUmVmc0luTUJCLmVtcHR5KCkpCisgICAgcmV0dXJuIDA7CisgIAorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRm9sZFB0ID0gQmFycmllcjsKKyAgd2hpbGUgKCYqRm9sZFB0ICE9IERlZk1JICYmIEZvbGRQdCAhPSBNQkItPmJlZ2luKCkgJiYKKyAgICAgICAgICFSZWZzSW5NQkIuY291bnQoRm9sZFB0KSkKKyAgICAtLUZvbGRQdDsKKyAgCisgIGludCBPcElkeCA9IEZvbGRQdC0+ZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeCh2cmVnKTsKKyAgaWYgKE9wSWR4ID09IC0xKQorICAgIHJldHVybiAwOworICAKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE+IE9wczsKKyAgT3BzLnB1c2hfYmFjayhPcElkeCk7CisgIAorICBpZiAoIVRJSS0+Y2FuRm9sZE1lbW9yeU9wZXJhbmQoRm9sZFB0LCBPcHMpKQorICAgIHJldHVybiAwOworICAKKyAgRGVuc2VNYXA8dW5zaWduZWQsIGludD46Oml0ZXJhdG9yIEkgPSBJbnRlcnZhbFNTTWFwLmZpbmQodnJlZyk7CisgIGlmIChJICE9IEludGVydmFsU1NNYXAuZW5kKCkpIHsKKyAgICBTUyA9IEktPnNlY29uZDsKKyAgfSBlbHNlIHsKKyAgICBTUyA9IE1GSS0+Q3JlYXRlU3BpbGxTdGFja09iamVjdChSQy0+Z2V0U2l6ZSgpLCBSQy0+Z2V0QWxpZ25tZW50KCkpOworICB9CisgIAorICBNYWNoaW5lSW5zdHIqIEZNSSA9IFRJSS0+Zm9sZE1lbW9yeU9wZXJhbmQoRm9sZFB0LCBPcHMsIFNTKTsKKyAgCisgIGlmIChGTUkpIHsKKyAgICBMSXMtPlJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHMoRm9sZFB0LCBGTUkpOworICAgIEZvbGRQdC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgKytOdW1Gb2xkczsKKyAgICAKKyAgICBJbnRlcnZhbFNTTWFwW3ZyZWddID0gU1M7CisgICAgQ3VyclNMSSA9ICZMU3MtPmdldE9yQ3JlYXRlSW50ZXJ2YWwoU1MsIFJDKTsKKyAgICBpZiAoQ3VyclNMSS0+aGFzQXRMZWFzdE9uZVZhbHVlKCkpCisgICAgICBDdXJyU1ZhbE5vID0gQ3VyclNMSS0+Z2V0VmFsTnVtSW5mbygwKTsKKyAgICBlbHNlCisgICAgICBDdXJyU1ZhbE5vID0gQ3VyclNMSS0+Z2V0TmV4dFZhbHVlKFNsb3RJbmRleCgpLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFNzLT5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisgIH0KKyAgCisgIHJldHVybiBGTUk7Cit9CisKK01hY2hpbmVJbnN0ciogUHJlQWxsb2NTcGxpdHRpbmc6OkZvbGRSZXN0b3JlKHVuc2lnbmVkIHZyZWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIqIEJhcnJpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+JiBSZWZzSW5NQkIpIHsKKyAgaWYgKChpbnQpUmVzdG9yZUZvbGRMaW1pdCAhPSAtMSAmJiBSZXN0b3JlRm9sZExpbWl0ID09IChpbnQpTnVtUmVzdG9yZUZvbGRzKQorICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8vIEdvIHRvcCBkb3duIGlmIFJlZnNJbk1CQiBpcyBlbXB0eS4KKyAgaWYgKFJlZnNJbk1CQi5lbXB0eSgpKQorICAgIHJldHVybiAwOworICAKKyAgLy8gQ2FuJ3QgZm9sZCBhIHJlc3RvcmUgYmV0d2VlbiBhIGNhbGwgc3RhY2sgc2V0dXAgYW5kIHRlYXJkb3duLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRm9sZFB0ID0gQmFycmllcjsKKyAgCisgIC8vIEFkdmFuY2UgZnJvbSBiYXJyaWVyIHRvIGNhbGwgZnJhbWUgdGVhcmRvd24uCisgIHdoaWxlIChGb2xkUHQgIT0gTUJCLT5nZXRGaXJzdFRlcm1pbmF0b3IoKSAmJgorICAgICAgICAgRm9sZFB0LT5nZXRPcGNvZGUoKSAhPSBUUkktPmdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKSkgeworICAgIGlmIChSZWZzSW5NQkIuY291bnQoRm9sZFB0KSkKKyAgICAgIHJldHVybiAwOworICAgIAorICAgICsrRm9sZFB0OworICB9CisgIAorICBpZiAoRm9sZFB0ID09IE1CQi0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCkpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICArK0ZvbGRQdDsKKyAgCisgIC8vIE5vdyBmaW5kIHRoZSByZXN0b3JlIHBvaW50LgorICB3aGlsZSAoRm9sZFB0ICE9IE1CQi0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCkgJiYgIVJlZnNJbk1CQi5jb3VudChGb2xkUHQpKSB7CisgICAgaWYgKEZvbGRQdC0+Z2V0T3Bjb2RlKCkgPT0gVFJJLT5nZXRDYWxsRnJhbWVTZXR1cE9wY29kZSgpKSB7CisgICAgICB3aGlsZSAoRm9sZFB0ICE9IE1CQi0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCkgJiYKKyAgICAgICAgICAgICBGb2xkUHQtPmdldE9wY29kZSgpICE9IFRSSS0+Z2V0Q2FsbEZyYW1lRGVzdHJveU9wY29kZSgpKSB7CisgICAgICAgIGlmIChSZWZzSW5NQkIuY291bnQoRm9sZFB0KSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisgICAgICAgICsrRm9sZFB0OworICAgICAgfQorICAgICAgCisgICAgICBpZiAoRm9sZFB0ID09IE1CQi0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCkpCisgICAgICAgIHJldHVybiAwOworICAgIH0gCisgICAgCisgICAgKytGb2xkUHQ7CisgIH0KKyAgCisgIGlmIChGb2xkUHQgPT0gTUJCLT5nZXRGaXJzdFRlcm1pbmF0b3IoKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIGludCBPcElkeCA9IEZvbGRQdC0+ZmluZFJlZ2lzdGVyVXNlT3BlcmFuZElkeCh2cmVnLCB0cnVlKTsKKyAgaWYgKE9wSWR4ID09IC0xKQorICAgIHJldHVybiAwOworICAKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE+IE9wczsKKyAgT3BzLnB1c2hfYmFjayhPcElkeCk7CisgIAorICBpZiAoIVRJSS0+Y2FuRm9sZE1lbW9yeU9wZXJhbmQoRm9sZFB0LCBPcHMpKQorICAgIHJldHVybiAwOworICAKKyAgTWFjaGluZUluc3RyKiBGTUkgPSBUSUktPmZvbGRNZW1vcnlPcGVyYW5kKEZvbGRQdCwgT3BzLCBTUyk7CisgIAorICBpZiAoRk1JKSB7CisgICAgTElzLT5SZXBsYWNlTWFjaGluZUluc3RySW5NYXBzKEZvbGRQdCwgRk1JKTsKKyAgICBGb2xkUHQtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICsrTnVtUmVzdG9yZUZvbGRzOworICB9CisgIAorICByZXR1cm4gRk1JOworfQorCisvLy8gU3BsaXRSZWdMaXZlSW50ZXJ2YWwgLSBTcGxpdCAoc3BpbGwgYW5kIHJlc3RvcmUpIHRoZSBnaXZlbiBsaXZlIGludGVydmFsCisvLy8gc28gaXQgd291bGQgbm90IGNyb3NzIHRoZSBiYXJyaWVyIHRoYXQncyBiZWluZyBwcm9jZXNzZWQuIFNocmluayB3cmFwCisvLy8gKG1pbmltaXplKSB0aGUgbGl2ZSBpbnRlcnZhbCB0byB0aGUgbGFzdCB1c2VzLgorYm9vbCBQcmVBbGxvY1NwbGl0dGluZzo6U3BsaXRSZWdMaXZlSW50ZXJ2YWwoTGl2ZUludGVydmFsICpMSSkgeworICBERUJVRyhkYmdzKCkgPDwgIlByZS1hbGxvYyBzcGxpdHRpbmcgIiA8PCBMSS0+cmVnIDw8ICIgZm9yICIgPDwgKkJhcnJpZXIKKyAgICAgICAgICAgICAgIDw8ICIgIHJlc3VsdDogIik7CisKKyAgQ3VyckxJID0gTEk7CisKKyAgLy8gRmluZCBsaXZlIHJhbmdlIHdoZXJlIGN1cnJlbnQgaW50ZXJ2YWwgY3Jvc3MgdGhlIGJhcnJpZXIuCisgIExpdmVJbnRlcnZhbDo6aXRlcmF0b3IgTFIgPQorICAgIEN1cnJMSS0+RmluZExpdmVSYW5nZUNvbnRhaW5pbmcoQmFycmllcklkeC5nZXRVc2VJbmRleCgpKTsKKyAgVk5JbmZvICpWYWxObyA9IExSLT52YWxubzsKKworICBhc3NlcnQoIVZhbE5vLT5pc1VudXNlZCgpICYmICJWYWwjIGlzIGRlZmluZWQgYnkgYSBkZWFkIGRlZj8iKTsKKworICBNYWNoaW5lSW5zdHIgKkRlZk1JID0gVmFsTm8tPmlzRGVmQWNjdXJhdGUoKQorICAgID8gTElzLT5nZXRJbnN0cnVjdGlvbkZyb21JbmRleChWYWxOby0+ZGVmKSA6IE5VTEw7CisKKyAgLy8gSWYgdGhpcyB3b3VsZCBjcmVhdGUgYSBuZXcgam9pbiBwb2ludCwgZG8gbm90IHNwbGl0LgorICBpZiAoRGVmTUkgJiYgY3JlYXRlc05ld0pvaW4oTFIsIERlZk1JLT5nZXRQYXJlbnQoKSwgQmFycmllci0+Z2V0UGFyZW50KCkpKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJGQUlMRUQgKHdvdWxkIGNyZWF0ZSBhIG5ldyBqb2luIHBvaW50KS5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEZpbmQgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIGJhcnJpZXIgbWJiLgorICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0PiBSZWZzSW5NQkI7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6cmVnX2l0ZXJhdG9yIEkgPSBNUkktPnJlZ19iZWdpbihDdXJyTEktPnJlZyksCisgICAgICAgICBFID0gTVJJLT5yZWdfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgTWFjaGluZUluc3RyICpSZWZNSSA9ICYqSTsKKyAgICBpZiAoUmVmTUktPmdldFBhcmVudCgpID09IEJhcnJpZXJNQkIpCisgICAgICBSZWZzSW5NQkIuaW5zZXJ0KFJlZk1JKTsKKyAgfQorCisgIC8vIEZpbmQgYSBwb2ludCB0byByZXN0b3JlIHRoZSB2YWx1ZSBhZnRlciB0aGUgYmFycmllci4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFJlc3RvcmVQdCA9CisgICAgZmluZFJlc3RvcmVQb2ludChCYXJyaWVyTUJCLCBCYXJyaWVyLCBMUi0+ZW5kLCBSZWZzSW5NQkIpOworICBpZiAoUmVzdG9yZVB0ID09IEJhcnJpZXJNQkItPmVuZCgpKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJGQUlMRUQgKGNvdWxkIG5vdCBmaW5kIGEgc3VpdGFibGUgcmVzdG9yZSBwb2ludCkuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoRGVmTUkgJiYgTElzLT5pc1JlTWF0ZXJpYWxpemFibGUoKkxJLCBWYWxObywgRGVmTUkpKQorICAgIGlmIChSZW1hdGVyaWFsaXplKExJLT5yZWcsIFZhbE5vLCBEZWZNSSwgUmVzdG9yZVB0LCBSZWZzSW5NQkIpKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgInN1Y2Nlc3MgKHJlbWF0KS5cbiIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8vIEFkZCBhIHNwaWxsIGVpdGhlciBiZWZvcmUgdGhlIGJhcnJpZXIgb3IgYWZ0ZXIgdGhlIGRlZmluaXRpb24uCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpEZWZNQkIgPSBEZWZNSSA/IERlZk1JLT5nZXRQYXJlbnQoKSA6IE5VTEw7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gTVJJLT5nZXRSZWdDbGFzcyhDdXJyTEktPnJlZyk7CisgIFNsb3RJbmRleCBTcGlsbEluZGV4OworICBNYWNoaW5lSW5zdHIgKlNwaWxsTUkgPSBOVUxMOworICBpbnQgU1MgPSAtMTsKKyAgaWYgKCFWYWxOby0+aXNEZWZBY2N1cmF0ZSgpKSB7CisgICAgLy8gSWYgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgZGVmIGlzIHdlIG11c3Qgc3BsaXQganVzdCBiZWZvcmUgdGhlIGJhcnJpZXIuCisgICAgaWYgKChTcGlsbE1JID0gRm9sZFNwaWxsKExJLT5yZWcsIFJDLCAwLCBCYXJyaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhcnJpZXJNQkIsIFNTLCBSZWZzSW5NQkIpKSkgeworICAgICAgU3BpbGxJbmRleCA9IExJcy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleChTcGlsbE1JKTsKKyAgICB9IGVsc2UgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFNwaWxsUHQgPSAKKyAgICAgICAgZmluZFNwaWxsUG9pbnQoQmFycmllck1CQiwgQmFycmllciwgTlVMTCwgUmVmc0luTUJCKTsKKyAgICAgIGlmIChTcGlsbFB0ID09IEJhcnJpZXJNQkItPmJlZ2luKCkpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJGQUlMRUQgKGNvdWxkIG5vdCBmaW5kIGEgc3VpdGFibGUgc3BpbGwgcG9pbnQpLlxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gZ2FwIHRvIGluc2VydCBzcGlsbC4KKyAgICAgIH0KKyAgICAgIC8vIEFkZCBzcGlsbC4KKyAgICAKKyAgICAgIFNTID0gQ3JlYXRlU3BpbGxTdGFja1Nsb3QoQ3VyckxJLT5yZWcsIFJDKTsKKyAgICAgIFRJSS0+c3RvcmVSZWdUb1N0YWNrU2xvdCgqQmFycmllck1CQiwgU3BpbGxQdCwgQ3VyckxJLT5yZWcsIHRydWUsIFNTLCBSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkkpOworICAgICAgU3BpbGxNSSA9IHByaW9yKFNwaWxsUHQpOworICAgICAgU3BpbGxJbmRleCA9IExJcy0+SW5zZXJ0TWFjaGluZUluc3RySW5NYXBzKFNwaWxsTUkpOworICAgIH0KKyAgfSBlbHNlIGlmICghSXNBdmFpbGFibGVJblN0YWNrKERlZk1CQiwgQ3VyckxJLT5yZWcsIFZhbE5vLT5kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSXMtPmdldFplcm9JbmRleCgpLCBTcGlsbEluZGV4LCBTUykpIHsKKyAgICAvLyBJZiBpdCdzIGFscmVhZHkgc3BsaXQsIGp1c3QgcmVzdG9yZSB0aGUgdmFsdWUuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc3BpbGwKKyAgICAvLyB0aGUgZGVmIGFnYWluLgorICAgIGlmICghRGVmTUkpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRkFJTEVEIChkZWYgaXMgZGVhZCkuXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsgLy8gRGVmIGlzIGRlYWQuIERvIG5vdGhpbmcuCisgICAgfQorICAgIAorICAgIGlmICgoU3BpbGxNSSA9IEZvbGRTcGlsbChMSS0+cmVnLCBSQywgRGVmTUksIEJhcnJpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhcnJpZXJNQkIsIFNTLCBSZWZzSW5NQkIpKSkgeworICAgICAgU3BpbGxJbmRleCA9IExJcy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleChTcGlsbE1JKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSB0byBpbnNlcnQgYSBzcGlsbCBhZnRlciB0aGUgZGVmIE1JLgorICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFNwaWxsUHQ7CisgICAgICBpZiAoRGVmTUJCID09IEJhcnJpZXJNQkIpIHsKKyAgICAgICAgLy8gQWRkIHNwaWxsIGFmdGVyIHRoZSBkZWYgYW5kIHRoZSBsYXN0IHVzZSBiZWZvcmUgdGhlIGJhcnJpZXIuCisgICAgICAgIFNwaWxsUHQgPSBmaW5kU3BpbGxQb2ludChCYXJyaWVyTUJCLCBCYXJyaWVyLCBEZWZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZnNJbk1CQik7CisgICAgICAgIGlmIChTcGlsbFB0ID09IERlZk1CQi0+YmVnaW4oKSkgeworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRkFJTEVEIChjb3VsZCBub3QgZmluZCBhIHN1aXRhYmxlIHNwaWxsIHBvaW50KS5cbiIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gZ2FwIHRvIGluc2VydCBzcGlsbC4KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgU3BpbGxQdCA9IGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKERlZk1JKSk7CisgICAgICAgIGlmIChTcGlsbFB0ID09IERlZk1CQi0+ZW5kKCkpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkZBSUxFRCAoY291bGQgbm90IGZpbmQgYSBzdWl0YWJsZSBzcGlsbCBwb2ludCkuXG4iKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIGdhcCB0byBpbnNlcnQgc3BpbGwuCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEFkZCBzcGlsbC4gCisgICAgICBTUyA9IENyZWF0ZVNwaWxsU3RhY2tTbG90KEN1cnJMSS0+cmVnLCBSQyk7CisgICAgICBUSUktPnN0b3JlUmVnVG9TdGFja1Nsb3QoKkRlZk1CQiwgU3BpbGxQdCwgQ3VyckxJLT5yZWcsIGZhbHNlLCBTUywgUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJJKTsKKyAgICAgIFNwaWxsTUkgPSBwcmlvcihTcGlsbFB0KTsKKyAgICAgIFNwaWxsSW5kZXggPSBMSXMtPkluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhTcGlsbE1JKTsKKyAgICB9CisgIH0KKworICAvLyBSZW1lbWJlciBkZWYgaW5zdHJ1Y3Rpb24gaW5kZXggdG8gc3BpbGwgaW5kZXggbWFwcGluZy4KKyAgaWYgKERlZk1JICYmIFNwaWxsTUkpCisgICAgRGVmMlNwaWxsTWFwW1ZhbE5vLT5kZWZdID0gU3BpbGxJbmRleDsKKworICAvLyBBZGQgcmVzdG9yZS4KKyAgYm9vbCBGb2xkZWRSZXN0b3JlID0gZmFsc2U7CisgIFNsb3RJbmRleCBSZXN0b3JlSW5kZXg7CisgIGlmIChNYWNoaW5lSW5zdHIqIExNSSA9IEZvbGRSZXN0b3JlKEN1cnJMSS0+cmVnLCBSQywgQmFycmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFycmllck1CQiwgU1MsIFJlZnNJbk1CQikpIHsKKyAgICBSZXN0b3JlUHQgPSBMTUk7CisgICAgUmVzdG9yZUluZGV4ID0gTElzLT5nZXRJbnN0cnVjdGlvbkluZGV4KFJlc3RvcmVQdCk7CisgICAgRm9sZGVkUmVzdG9yZSA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgVElJLT5sb2FkUmVnRnJvbVN0YWNrU2xvdCgqQmFycmllck1CQiwgUmVzdG9yZVB0LCBDdXJyTEktPnJlZywgU1MsIFJDLCBUUkkpOworICAgIE1hY2hpbmVJbnN0ciAqTG9hZE1JID0gcHJpb3IoUmVzdG9yZVB0KTsKKyAgICBSZXN0b3JlSW5kZXggPSBMSXMtPkluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhMb2FkTUkpOworICB9CisKKyAgLy8gVXBkYXRlIHNwaWxsIHN0YWNrIHNsb3QgbGl2ZSBpbnRlcnZhbC4KKyAgVXBkYXRlU3BpbGxTbG90SW50ZXJ2YWwoVmFsTm8sIFNwaWxsSW5kZXguZ2V0VXNlSW5kZXgoKS5nZXROZXh0U2xvdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0b3JlSW5kZXguZ2V0RGVmSW5kZXgoKSk7CisKKyAgUmVjb25zdHJ1Y3RMaXZlSW50ZXJ2YWwoQ3VyckxJKTsKKworICBpZiAoIUZvbGRlZFJlc3RvcmUpIHsKKyAgICBTbG90SW5kZXggUmVzdG9yZUlkeCA9IExJcy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleChwcmlvcihSZXN0b3JlUHQpKTsKKyAgICBSZXN0b3JlSWR4ID0gUmVzdG9yZUlkeC5nZXREZWZJbmRleCgpOworICAgIFJlbnVtYmVyVmFsbm8oQ3VyckxJLT5maW5kRGVmaW5lZFZOSW5mb0ZvclJlZ0ludChSZXN0b3JlSWR4KSk7CisgIH0KKyAgCisgICsrTnVtU3BsaXRzOworICBERUJVRyhkYmdzKCkgPDwgInN1Y2Nlc3MuXG4iKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBTcGxpdFJlZ0xpdmVJbnRlcnZhbHMgLSBTcGxpdCBhbGwgcmVnaXN0ZXIgbGl2ZSBpbnRlcnZhbHMgdGhhdCBjcm9zcyB0aGUKKy8vLyBiYXJyaWVyIHRoYXQncyBiZWluZyBwcm9jZXNzZWQuCitib29sCitQcmVBbGxvY1NwbGl0dGluZzo6U3BsaXRSZWdMaXZlSW50ZXJ2YWxzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKipSQ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PExpdmVJbnRlcnZhbCosIDg+JiBTcGxpdCkgeworICAvLyBGaXJzdCBmaW5kIGFsbCB0aGUgdmlydHVhbCByZWdpc3RlcnMgd2hvc2UgbGl2ZSBpbnRlcnZhbHMgYXJlIGludGVyY2VwdGVkCisgIC8vIGJ5IHRoZSBjdXJyZW50IGJhcnJpZXIuCisgIFNtYWxsVmVjdG9yPExpdmVJbnRlcnZhbCosIDg+IEludGVydmFsczsKKyAgZm9yIChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoqUkMgPSBSQ3M7ICpSQzsgKytSQykgeworICAgIC8vIEZJWE1FOiBJZiBpdCdzIG5vdCBzYWZlIHRvIG1vdmUgYW55IGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgYmFycmllcgorICAgIC8vIHJlZ2lzdGVyIGNsYXNzLCB0aGVuIGl0IG1lYW5zIHRoZXJlIGFyZSBzb21lIHNwZWNpYWwgZGVwZW5kZW5jaWVzIHdoaWNoCisgICAgLy8gY29kZWdlbiBpcyBub3QgbW9kZWxsaW5nLiBJZ25vcmUgdGhlc2UgYmFycmllcnMgZm9yIG5vdy4KKyAgICBpZiAoIVRJSS0+aXNTYWZlVG9Nb3ZlUmVnQ2xhc3NEZWZzKCpSQykpCisgICAgICBjb250aW51ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJlZScyA9IE1SSS0+Z2V0UmVnQ2xhc3NWaXJ0UmVncygqUkMpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWUnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgdW5zaWduZWQgUmVnID0gVlJzW2ldOworICAgICAgaWYgKCFMSXMtPmhhc0ludGVydmFsKFJlZykpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgTGl2ZUludGVydmFsICpMSSA9ICZMSXMtPmdldEludGVydmFsKFJlZyk7CisgICAgICBpZiAoTEktPmxpdmVBdChCYXJyaWVySWR4KSAmJiAhQmFycmllci0+cmVhZHNSZWdpc3RlcihSZWcpKQorICAgICAgICAvLyBWaXJ0dWFsIHJlZ2lzdGVyIGxpdmUgaW50ZXJ2YWwgaXMgaW50ZXJjZXB0ZWQgYnkgdGhlIGJhcnJpZXIuIFdlCisgICAgICAgIC8vIHNob3VsZCBzcGxpdCBhbmQgc2hyaW5rIHdyYXAgaXRzIGludGVydmFsIGlmIHBvc3NpYmxlLgorICAgICAgICBJbnRlcnZhbHMucHVzaF9iYWNrKExJKTsKKyAgICB9CisgIH0KKworICAvLyBQcm9jZXNzIHRoZSBhZmZlY3RlZCBsaXZlIGludGVydmFscy4KKyAgYm9vbCBDaGFuZ2UgPSBmYWxzZTsKKyAgd2hpbGUgKCFJbnRlcnZhbHMuZW1wdHkoKSkgeworICAgIGlmIChQcmVTcGxpdExpbWl0ICE9IC0xICYmIChpbnQpTnVtU3BsaXRzID09IFByZVNwbGl0TGltaXQpCisgICAgICBicmVhazsKKyAgICBMaXZlSW50ZXJ2YWwgKkxJID0gSW50ZXJ2YWxzLmJhY2soKTsKKyAgICBJbnRlcnZhbHMucG9wX2JhY2soKTsKKyAgICBib29sIHJlc3VsdCA9IFNwbGl0UmVnTGl2ZUludGVydmFsKExJKTsKKyAgICBpZiAocmVzdWx0KSBTcGxpdC5pbnNlcnQoTEkpOworICAgIENoYW5nZSB8PSByZXN1bHQ7CisgIH0KKworICByZXR1cm4gQ2hhbmdlOworfQorCit1bnNpZ25lZCBQcmVBbGxvY1NwbGl0dGluZzo6Z2V0TnVtYmVyT2ZOb25TcGlsbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgND4mIE1JcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIEZlZWRzVHdvQWRkcikgeworICB1bnNpZ25lZCBOb25TcGlsbHMgPSAwOworICBmb3IgKFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+OjppdGVyYXRvciBVSSA9IE1Jcy5iZWdpbigpLCBVRSA9IE1Jcy5lbmQoKTsKKyAgICAgICBVSSAhPSBVRTsgKytVSSkgeworICAgIGludCBTdG9yZUZyYW1lSW5kZXg7CisgICAgdW5zaWduZWQgU3RvcmVWUmVnID0gVElJLT5pc1N0b3JlVG9TdGFja1Nsb3QoKlVJLCBTdG9yZUZyYW1lSW5kZXgpOworICAgIGlmIChTdG9yZVZSZWcgIT0gUmVnIHx8IFN0b3JlRnJhbWVJbmRleCAhPSBGcmFtZUluZGV4KQorICAgICAgKytOb25TcGlsbHM7CisgICAgCisgICAgaW50IERlZklkeCA9ICgqVUkpLT5maW5kUmVnaXN0ZXJEZWZPcGVyYW5kSWR4KFJlZyk7CisgICAgaWYgKERlZklkeCAhPSAtMSAmJiAoKlVJKS0+aXNSZWdUaWVkVG9Vc2VPcGVyYW5kKERlZklkeCkpCisgICAgICBGZWVkc1R3b0FkZHIgPSB0cnVlOworICB9CisgIAorICByZXR1cm4gTm9uU3BpbGxzOworfQorCisvLy8gcmVtb3ZlRGVhZFNwaWxscyAtIEFmdGVyIGRvaW5nIHNwbGl0dGluZywgZmlsdGVyIHRocm91Z2ggYWxsIGludGVydmFscyB3ZSd2ZQorLy8vIHNwbGl0LCBhbmQgc2VlIGlmIGFueSBvZiB0aGUgc3BpbGxzIGFyZSB1bm5lY2Vzc2FyeS4gIElmIHNvLCByZW1vdmUgdGhlbS4KK2Jvb2wgUHJlQWxsb2NTcGxpdHRpbmc6OnJlbW92ZURlYWRTcGlsbHMoU21hbGxQdHJTZXQ8TGl2ZUludGVydmFsKiwgOD4mIHNwbGl0KSB7CisgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAKKyAgLy8gV2FsayBvdmVyIGFsbCBvZiB0aGUgbGl2ZSBpbnRlcnZhbHMgdGhhdCB3ZXJlIHRvdWNoZWQgYnkgdGhlIHNwbGl0dGVyLAorICAvLyBhbmQgc2VlIGlmIHdlIGNhbiBkbyBhbnkgRENFIGFuZC9vciBmb2xkaW5nLgorICBmb3IgKFNtYWxsUHRyU2V0PExpdmVJbnRlcnZhbCosIDg+OjppdGVyYXRvciBMSSA9IHNwbGl0LmJlZ2luKCksCisgICAgICAgTEUgPSBzcGxpdC5lbmQoKTsgTEkgIT0gTEU7ICsrTEkpIHsKKyAgICBEZW5zZU1hcDxWTkluZm8qLCBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0PiA+IFZOVXNlQ291bnQ7CisgICAgCisgICAgLy8gRmlyc3QsIGNvbGxlY3QgYWxsIHRoZSB1c2VzIG9mIHRoZSB2cmVnLCBhbmQgc29ydCB0aGVtIGJ5IHRoZWlyCisgICAgLy8gcmVhY2hpbmcgZGVmaW5pdGlvbiAoVk5JbmZvKS4KKyAgICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9pdGVyYXRvciBVSSA9IE1SSS0+dXNlX2JlZ2luKCgqTEkpLT5yZWcpLAorICAgICAgICAgVUUgPSBNUkktPnVzZV9lbmQoKTsgVUkgIT0gVUU7ICsrVUkpIHsKKyAgICAgIFNsb3RJbmRleCBpbmRleCA9IExJcy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleCgmKlVJKTsKKyAgICAgIGluZGV4ID0gaW5kZXguZ2V0VXNlSW5kZXgoKTsKKyAgICAgIAorICAgICAgY29uc3QgTGl2ZVJhbmdlKiBMUiA9ICgqTEkpLT5nZXRMaXZlUmFuZ2VDb250YWluaW5nKGluZGV4KTsKKyAgICAgIFZOVXNlQ291bnRbTFItPnZhbG5vXS5pbnNlcnQoJipVSSk7CisgICAgfQorICAgIAorICAgIC8vIE5vdywgdGFrZSB0aGUgZGVmaW5pdGlvbnMgKFZOSW5mbydzKSBvbmUgYXQgYSB0aW1lIGFuZCB0cnkgdG8gRENFIAorICAgIC8vIGFuZC9vciBmb2xkIHRoZW0gYXdheS4KKyAgICBmb3IgKExpdmVJbnRlcnZhbDo6dm5pX2l0ZXJhdG9yIFZJID0gKCpMSSktPnZuaV9iZWdpbigpLAorICAgICAgICAgVkUgPSAoKkxJKS0+dm5pX2VuZCgpOyBWSSAhPSBWRTsgKytWSSkgeworICAgICAgCisgICAgICBpZiAoRGVhZFNwbGl0TGltaXQgIT0gLTEgJiYgKGludClOdW1EZWFkU3BpbGxzID09IERlYWRTcGxpdExpbWl0KSAKKyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgICAKKyAgICAgIFZOSW5mbyogQ3VyclZOID0gKlZJOworICAgICAgCisgICAgICAvLyBXZSBkb24ndCBjdXJyZW50bHkgdHJ5IHRvIGhhbmRsZSBkZWZpbml0aW9ucyB3aXRoIFBISSBraWxscywgYmVjYXVzZQorICAgICAgLy8gaXQgd291bGQgaW52b2x2ZSBwcm9jZXNzaW5nIG1vcmUgdGhhbiBvbmUgVk5JbmZvIGF0IG9uY2UuCisgICAgICBpZiAoQ3VyclZOLT5oYXNQSElLaWxsKCkpIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBXZSBhbHNvIGRvbid0IHRyeSB0byBoYW5kbGUgdGhlIHJlc3VsdHMgb2YgUEhJIGpvaW5zLCBzaW5jZSB0aGVyZSdzCisgICAgICAvLyBubyBkZWZpbmluZyBpbnN0cnVjdGlvbiB0byBhbmFseXplLgorICAgICAgaWYgKCFDdXJyVk4tPmlzRGVmQWNjdXJhdGUoKSB8fCBDdXJyVk4tPmlzVW51c2VkKCkpIGNvbnRpbnVlOworICAgIAorICAgICAgLy8gV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGVsaW1pbmF0aW5nIGNydWZ0IGludHJvZHVjZWQgYnkgdGhlIHNwbGl0dGVyLAorICAgICAgLy8gaXMgb2YgdGhlIGZvcm0gbG9hZC11c2Ugb3IgbG9hZC11c2Utc3RvcmUuICBGaXJzdCwgY2hlY2sgdGhhdCB0aGUKKyAgICAgIC8vIGRlZmluaXRpb24gaXMgYSBsb2FkLCBhbmQgcmVtZW1iZXIgd2hhdCBzdGFjayBzbG90IHdlIGxvYWRlZCBpdCBmcm9tLgorICAgICAgTWFjaGluZUluc3RyKiBEZWZNSSA9IExJcy0+Z2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoQ3VyclZOLT5kZWYpOworICAgICAgaW50IEZyYW1lSW5kZXg7CisgICAgICBpZiAoIVRJSS0+aXNMb2FkRnJvbVN0YWNrU2xvdChEZWZNSSwgRnJhbWVJbmRleCkpIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBJZiB0aGUgZGVmaW5pdGlvbiBoYXMgbm8gdXNlcyBhdCBhbGwsIGp1c3QgRENFIGl0LgorICAgICAgaWYgKFZOVXNlQ291bnRbQ3VyclZOXS5zaXplKCkgPT0gMCkgeworICAgICAgICBMSXMtPlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKERlZk1JKTsKKyAgICAgICAgKCpMSSktPnJlbW92ZVZhbE5vKEN1cnJWTik7CisgICAgICAgIERlZk1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgVk5Vc2VDb3VudC5lcmFzZShDdXJyVk4pOworICAgICAgICArK051bURlYWRTcGlsbHM7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gU2Vjb25kLCBnZXQgdGhlIG51bWJlciBvZiBub24tc3RvcmUgdXNlcyBvZiB0aGUgZGVmaW5pdGlvbiwgYXMgd2VsbCBhcworICAgICAgLy8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBpdCBmZWVkcyBpbnRvIGEgbGF0ZXIgdHdvLWFkZHJlc3MgZGVmaW5pdGlvbi4KKyAgICAgIGJvb2wgRmVlZHNUd29BZGRyID0gZmFsc2U7CisgICAgICB1bnNpZ25lZCBOb25TcGlsbENvdW50ID0gZ2V0TnVtYmVyT2ZOb25TcGlsbHMoVk5Vc2VDb3VudFtDdXJyVk5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqTEkpLT5yZWcsIEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVlZHNUd29BZGRyKTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhlcmUncyBvbmUgbm9uLXN0b3JlIHVzZSBhbmQgaXQgZG9lc24ndCBmZWVkIGEgdHdvLWFkZHIsIHRoZW4KKyAgICAgIC8vIHRoaXMgaXMgYSBsb2FkLXVzZS1zdG9yZSBjYXNlIHRoYXQgd2UgY2FuIHRyeSB0byBmb2xkLgorICAgICAgaWYgKE5vblNwaWxsQ291bnQgPT0gMSAmJiAhRmVlZHNUd29BZGRyKSB7CisgICAgICAgIC8vIFN0YXJ0IGJ5IGZpbmRpbmcgdGhlIG5vbi1zdG9yZSB1c2UgTWFjaGluZUluc3RyLgorICAgICAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0Pjo6aXRlcmF0b3IgVUkgPSBWTlVzZUNvdW50W0N1cnJWTl0uYmVnaW4oKTsKKyAgICAgICAgaW50IFN0b3JlRnJhbWVJbmRleDsKKyAgICAgICAgdW5zaWduZWQgU3RvcmVWUmVnID0gVElJLT5pc1N0b3JlVG9TdGFja1Nsb3QoKlVJLCBTdG9yZUZyYW1lSW5kZXgpOworICAgICAgICB3aGlsZSAoVUkgIT0gVk5Vc2VDb3VudFtDdXJyVk5dLmVuZCgpICYmCisgICAgICAgICAgICAgICAoU3RvcmVWUmVnID09ICgqTEkpLT5yZWcgJiYgU3RvcmVGcmFtZUluZGV4ID09IEZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgKytVSTsKKyAgICAgICAgICBpZiAoVUkgIT0gVk5Vc2VDb3VudFtDdXJyVk5dLmVuZCgpKQorICAgICAgICAgICAgU3RvcmVWUmVnID0gVElJLT5pc1N0b3JlVG9TdGFja1Nsb3QoKlVJLCBTdG9yZUZyYW1lSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmIChVSSA9PSBWTlVzZUNvdW50W0N1cnJWTl0uZW5kKCkpIGNvbnRpbnVlOworICAgICAgICAKKyAgICAgICAgTWFjaGluZUluc3RyKiB1c2UgPSAqVUk7CisgICAgICAgIAorICAgICAgICAvLyBBdHRlbXB0IHRvIGZvbGQgaXQgYXdheSEKKyAgICAgICAgaW50IE9wSWR4ID0gdXNlLT5maW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KCgqTEkpLT5yZWcsIGZhbHNlKTsKKyAgICAgICAgaWYgKE9wSWR4ID09IC0xKSBjb250aW51ZTsKKyAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE+IE9wczsKKyAgICAgICAgT3BzLnB1c2hfYmFjayhPcElkeCk7CisgICAgICAgIGlmICghVElJLT5jYW5Gb2xkTWVtb3J5T3BlcmFuZCh1c2UsIE9wcykpIGNvbnRpbnVlOworCisgICAgICAgIE1hY2hpbmVJbnN0ciogTmV3TUkgPSBUSUktPmZvbGRNZW1vcnlPcGVyYW5kKHVzZSwgT3BzLCBGcmFtZUluZGV4KTsKKworICAgICAgICBpZiAoIU5ld01JKSBjb250aW51ZTsKKworICAgICAgICAvLyBVcGRhdGUgcmVsZXZhbnQgYW5hbHlzZXMuCisgICAgICAgIExJcy0+UmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoRGVmTUkpOworICAgICAgICBMSXMtPlJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHModXNlLCBOZXdNSSk7CisgICAgICAgICgqTEkpLT5yZW1vdmVWYWxObyhDdXJyVk4pOworCisgICAgICAgIERlZk1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgdXNlLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgVk5Vc2VDb3VudFtDdXJyVk5dLmVyYXNlKHVzZSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIGRlbGV0ZWQgaW5zdHJ1Y3Rpb25zLiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gcmVtb3ZlIHRoZW0gZnJvbSAKKyAgICAgICAgLy8gdGhlIFZOSW5mby0+dXNlIG1hcCBhcyB3ZWxsLCBqdXN0IHRvIGJlIHNhZmUuCisgICAgICAgIGZvciAoU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgND46Oml0ZXJhdG9yIElJID0gCisgICAgICAgICAgICAgVk5Vc2VDb3VudFtDdXJyVk5dLmJlZ2luKCksIElFID0gVk5Vc2VDb3VudFtDdXJyVk5dLmVuZCgpOworICAgICAgICAgICAgIElJICE9IElFOyArK0lJKSB7CisgICAgICAgICAgZm9yIChEZW5zZU1hcDxWTkluZm8qLCBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0PiA+OjppdGVyYXRvcgorICAgICAgICAgICAgICAgVk5JID0gVk5Vc2VDb3VudC5iZWdpbigpLCBWTkUgPSBWTlVzZUNvdW50LmVuZCgpOyBWTkkgIT0gVk5FOyAKKyAgICAgICAgICAgICAgICsrVk5JKQorICAgICAgICAgICAgaWYgKFZOSS0+Zmlyc3QgIT0gQ3VyclZOKQorICAgICAgICAgICAgICBWTkktPnNlY29uZC5lcmFzZSgqSUkpOworICAgICAgICAgIExJcy0+UmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoKklJKTsKKyAgICAgICAgICAoKklJKS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFZOVXNlQ291bnQuZXJhc2UoQ3VyclZOKTsKKworICAgICAgICBmb3IgKERlbnNlTWFwPFZOSW5mbyosIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDQ+ID46Oml0ZXJhdG9yCisgICAgICAgICAgICAgVkkgPSBWTlVzZUNvdW50LmJlZ2luKCksIFZFID0gVk5Vc2VDb3VudC5lbmQoKTsgVkkgIT0gVkU7ICsrVkkpCisgICAgICAgICAgaWYgKFZJLT5zZWNvbmQuZXJhc2UodXNlKSkKKyAgICAgICAgICAgIFZJLT5zZWNvbmQuaW5zZXJ0KE5ld01JKTsKKworICAgICAgICArK051bURlYWRTcGlsbHM7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIG5vbi1zdG9yZSBpbnN0cnVjdGlvbiwgd2UgY2FuJ3QgcHJvZml0YWJseQorICAgICAgLy8gZm9sZCBpdCwgc28gYmFpbC4KKyAgICAgIGlmIChOb25TcGlsbENvdW50KSBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAvLyBPdGhlcndpc2UsIHRoaXMgaXMgYSBsb2FkLXN0b3JlIGNhc2UsIHNvIERDRSB0aGVtLgorICAgICAgZm9yIChTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0Pjo6aXRlcmF0b3IgVUkgPSAKKyAgICAgICAgICAgVk5Vc2VDb3VudFtDdXJyVk5dLmJlZ2luKCksIFVFID0gVk5Vc2VDb3VudFtDdXJyVk5dLmVuZCgpOworICAgICAgICAgICBVSSAhPSBVRTsgKytVSSkgeworICAgICAgICBMSXMtPlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKCpVSSk7CisgICAgICAgICgqVUkpLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIH0KKyAgICAgICAgCisgICAgICBWTlVzZUNvdW50LmVyYXNlKEN1cnJWTik7CisgICAgICAgIAorICAgICAgTElzLT5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhEZWZNSSk7CisgICAgICAoKkxJKS0+cmVtb3ZlVmFsTm8oQ3VyclZOKTsKKyAgICAgIERlZk1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICsrTnVtRGVhZFNwaWxsczsKKyAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKK2Jvb2wgUHJlQWxsb2NTcGxpdHRpbmc6OmNyZWF0ZXNOZXdKb2luKExpdmVSYW5nZSogTFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogRGVmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIEJhcnJpZXJNQkIpIHsKKyAgaWYgKERlZk1CQiA9PSBCYXJyaWVyTUJCKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGlmIChMUi0+dmFsbm8tPmhhc1BISUtpbGwoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBTbG90SW5kZXggTUJCRW5kID0gTElzLT5nZXRNQkJFbmRJZHgoQmFycmllck1CQik7CisgIGlmIChMUi0+ZW5kIDwgTUJCRW5kKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIE1hY2hpbmVMb29wSW5mbyYgTUxJID0gZ2V0QW5hbHlzaXM8TWFjaGluZUxvb3BJbmZvPigpOworICBpZiAoTUxJLmdldExvb3BGb3IoRGVmTUJCKSAhPSBNTEkuZ2V0TG9vcEZvcihCYXJyaWVyTUJCKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIE1hY2hpbmVEb21pbmF0b3JUcmVlJiBNRFQgPSBnZXRBbmFseXNpczxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLCA0PiBWaXNpdGVkOworICB0eXBlZGVmIHN0ZDo6cGFpcjxNYWNoaW5lQmFzaWNCbG9jayosCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjpzdWNjX2l0ZXJhdG9yPiBJdFBhaXI7CisgIFNtYWxsVmVjdG9yPEl0UGFpciwgND4gU3RhY2s7CisgIFN0YWNrLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihCYXJyaWVyTUJCLCBCYXJyaWVyTUJCLT5zdWNjX2JlZ2luKCkpKTsKKyAgCisgIHdoaWxlICghU3RhY2suZW1wdHkoKSkgeworICAgIEl0UGFpciBQID0gU3RhY2suYmFjaygpOworICAgIFN0YWNrLnBvcF9iYWNrKCk7CisgICAgCisgICAgTWFjaGluZUJhc2ljQmxvY2sqIFByZWRNQkIgPSBQLmZpcnN0OworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjpzdWNjX2l0ZXJhdG9yIFMgPSBQLnNlY29uZDsKKyAgICAKKyAgICBpZiAoUyA9PSBQcmVkTUJCLT5zdWNjX2VuZCgpKQorICAgICAgY29udGludWU7CisgICAgZWxzZSBpZiAoVmlzaXRlZC5jb3VudCgqUykpIHsKKyAgICAgIFN0YWNrLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihQcmVkTUJCLCArK1MpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZQorICAgICAgU3RhY2sucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFByZWRNQkIsIFMrMSkpOworICAgIAorICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIgPSAqUzsKKyAgICBWaXNpdGVkLmluc2VydChNQkIpOworICAgIAorICAgIGlmIChNQkIgPT0gQmFycmllck1CQikKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIE1hY2hpbmVEb21UcmVlTm9kZSogRGVmTURUTiA9IE1EVC5nZXROb2RlKERlZk1CQik7CisgICAgTWFjaGluZURvbVRyZWVOb2RlKiBCYXJyaWVyTURUTiA9IE1EVC5nZXROb2RlKEJhcnJpZXJNQkIpOworICAgIE1hY2hpbmVEb21UcmVlTm9kZSogTURUTiA9IE1EVC5nZXROb2RlKE1CQiktPmdldElEb20oKTsKKyAgICB3aGlsZSAoTURUTikgeworICAgICAgaWYgKE1EVE4gPT0gRGVmTURUTikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBlbHNlIGlmIChNRFROID09IEJhcnJpZXJNRFROKQorICAgICAgICBicmVhazsKKyAgICAgIE1EVE4gPSBNRFROLT5nZXRJRG9tKCk7CisgICAgfQorICAgIAorICAgIE1CQkVuZCA9IExJcy0+Z2V0TUJCRW5kSWR4KE1CQik7CisgICAgaWYgKExSLT5lbmQgPiBNQkJFbmQpCisgICAgICBTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTUJCLCBNQkItPnN1Y2NfYmVnaW4oKSkpOworICB9CisgIAorICByZXR1cm4gZmFsc2U7Cit9IAorICAKKworYm9vbCBQcmVBbGxvY1NwbGl0dGluZzo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBDdXJyTUYgPSAmTUY7CisgIFRNICAgICA9ICZNRi5nZXRUYXJnZXQoKTsKKyAgVFJJICAgID0gVE0tPmdldFJlZ2lzdGVySW5mbygpOworICBUSUkgICAgPSBUTS0+Z2V0SW5zdHJJbmZvKCk7CisgIE1GSSAgICA9IE1GLmdldEZyYW1lSW5mbygpOworICBNUkkgICAgPSAmTUYuZ2V0UmVnSW5mbygpOworICBTSXMgICAgPSAmZ2V0QW5hbHlzaXM8U2xvdEluZGV4ZXM+KCk7CisgIExJcyAgICA9ICZnZXRBbmFseXNpczxMaXZlSW50ZXJ2YWxzPigpOworICBMU3MgICAgPSAmZ2V0QW5hbHlzaXM8TGl2ZVN0YWNrcz4oKTsKKyAgVlJNICAgID0gJmdldEFuYWx5c2lzPFZpcnRSZWdNYXA+KCk7CisKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgLy8gTWFrZSBzdXJlIGJsb2NrcyBhcmUgbnVtYmVyZWQgaW4gb3JkZXIuCisgIE1GLlJlbnVtYmVyQmxvY2tzKCk7CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKkVudHJ5ID0gTUYuYmVnaW4oKTsKKyAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLDE2PiBWaXNpdGVkOworCisgIFNtYWxsUHRyU2V0PExpdmVJbnRlcnZhbCosIDg+IFNwbGl0OworCisgIGZvciAoZGZfZXh0X2l0ZXJhdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLDE2PiA+CisgICAgICAgICBERkkgPSBkZl9leHRfYmVnaW4oRW50cnksIFZpc2l0ZWQpLCBFID0gZGZfZXh0X2VuZChFbnRyeSwgVmlzaXRlZCk7CisgICAgICAgREZJICE9IEU7ICsrREZJKSB7CisgICAgQmFycmllck1CQiA9ICpERkk7CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJhcnJpZXJNQkItPmJlZ2luKCksCisgICAgICAgICAgIEUgPSBCYXJyaWVyTUJCLT5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIEJhcnJpZXIgPSAmKkk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoqQmFycmllclJDcyA9CisgICAgICAgIEJhcnJpZXItPmdldERlc2MoKS5nZXRSZWdDbGFzc0JhcnJpZXJzKCk7CisgICAgICBpZiAoIUJhcnJpZXJSQ3MpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgQmFycmllcklkeCA9IExJcy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleChCYXJyaWVyKTsKKyAgICAgIE1hZGVDaGFuZ2UgfD0gU3BsaXRSZWdMaXZlSW50ZXJ2YWxzKEJhcnJpZXJSQ3MsIFNwbGl0KTsKKyAgICB9CisgIH0KKworICBNYWRlQ2hhbmdlIHw9IHJlbW92ZURlYWRTcGlsbHMoU3BsaXQpOworCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vUHJvY2Vzc0ltcGxpY2l0RGVmcy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Qcm9jZXNzSW1wbGljaXREZWZzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODgzMWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUHJvY2Vzc0ltcGxpY2l0RGVmcy5jcHAKQEAgLTAsMCArMSwyOTUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9jZXNzSW1wbGljaXREZWZzLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicHJvY2Vzc2ltcGxpY2l0ZGVmcyIKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qcm9jZXNzSW1wbGljaXREZWZzLmgiCisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlVmFyaWFibGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitjaGFyIFByb2Nlc3NJbXBsaWNpdERlZnM6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhQcm9jZXNzSW1wbGljaXREZWZzLCAicHJvY2Vzc2ltcGRlZnMiLAorICAgICAgICAgICAgICAgICJQcm9jZXNzIEltcGxpY2l0IERlZmluaXRpb25zLiIsIGZhbHNlLCBmYWxzZSk7CisKK3ZvaWQgUHJvY2Vzc0ltcGxpY2l0RGVmczo6Z2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgQVUuYWRkUHJlc2VydmVkPEFsaWFzQW5hbHlzaXM+KCk7CisgIEFVLmFkZFByZXNlcnZlZDxMaXZlVmFyaWFibGVzPigpOworICBBVS5hZGRSZXF1aXJlZDxMaXZlVmFyaWFibGVzPigpOworICBBVS5hZGRQcmVzZXJ2ZWRJRChNYWNoaW5lTG9vcEluZm9JRCk7CisgIEFVLmFkZFByZXNlcnZlZElEKE1hY2hpbmVEb21pbmF0b3JzSUQpOworICBBVS5hZGRQcmVzZXJ2ZWRJRChUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzSUQpOworICBBVS5hZGRQcmVzZXJ2ZWRJRChQSElFbGltaW5hdGlvbklEKTsKKyAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7Cit9CisKK2Jvb2wKK1Byb2Nlc3NJbXBsaWNpdERlZnM6OkNhblR1cm5JbnRvSW1wbGljaXREZWYoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCB1bnNpZ25lZCBPcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICp0aWlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDx1bnNpZ25lZCwgOD4gJkltcERlZlJlZ3MpIHsKKyAgc3dpdGNoKE9wSWR4KSB7CisgIGNhc2UgMToKKyAgICByZXR1cm4gTUktPmlzQ29weSgpICYmIChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRTdWJSZWcoKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wRGVmUmVncy5jb3VudChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkpOworICBjYXNlIDI6CisgICAgcmV0dXJuIE1JLT5pc1N1YnJlZ1RvUmVnKCkgJiYgKE1JLT5nZXRPcGVyYW5kKDApLmdldFN1YlJlZygpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBEZWZSZWdzLmNvdW50KE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKSk7CisgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBpc1VuZGVmQ29weShNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKnRpaV8sCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDx1bnNpZ25lZCwgOD4gJkltcERlZlJlZ3MpIHsKKyAgaWYgKE1JLT5pc0NvcHkoKSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTzAgPSBNSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoMSk7CisgICAgaWYgKE1PMS5nZXRSZWcoKSAhPSBSZWcpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFNTzAuZ2V0U3ViUmVnKCkgfHwgSW1wRGVmUmVncy5jb3VudChNTzAuZ2V0UmVnKCkpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIHByb2Nlc3NJbXBsaWNpdERlZnMgLSBQcm9jZXNzIElNUExJQ0lUX0RFRiBpbnN0cnVjdGlvbnMgYW5kIG1ha2Ugc3VyZQorLy8vIHRoZXJlIGlzIG9uZSBpbXBsaWNpdF9kZWYgZm9yIGVhY2ggdXNlLiBBZGQgaXNVbmRlZiBtYXJrZXIgdG8KKy8vLyBpbXBsaWNpdF9kZWYgZGVmcyBhbmQgdGhlaXIgdXNlcy4KK2Jvb2wgUHJvY2Vzc0ltcGxpY2l0RGVmczo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZmbikgeworCisgIERFQlVHKGRiZ3MoKSA8PCAiKioqKioqKioqKiBQUk9DRVNTIElNUExJQ0lUIERFRlMgKioqKioqKioqKlxuIgorICAgICAgICAgICAgICAgPDwgIioqKioqKioqKiogRnVuY3Rpb246ICIKKyAgICAgICAgICAgICAgIDw8ICgoVmFsdWUqKWZuLmdldEZ1bmN0aW9uKCkpLT5nZXROYW1lKCkgPDwgJ1xuJyk7CisKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICp0aWlfID0gZm4uZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqdHJpXyA9IGZuLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICptcmlfID0gJmZuLmdldFJlZ0luZm8oKTsKKworICBMaXZlVmFyaWFibGVzICpsdl8gPSAmZ2V0QW5hbHlzaXM8TGl2ZVZhcmlhYmxlcz4oKTsKKworICBTbWFsbFNldDx1bnNpZ25lZCwgOD4gSW1wRGVmUmVnczsKKyAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyKiwgOD4gSW1wRGVmTUlzOworICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBSVXNlczsKKyAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLDE2PiBWaXNpdGVkOworICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA4PiBNb2RJbnN0czsKKworICBNYWNoaW5lQmFzaWNCbG9jayAqRW50cnkgPSBmbi5iZWdpbigpOworICBmb3IgKGRmX2V4dF9pdGVyYXRvcjxNYWNoaW5lQmFzaWNCbG9jayosIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwxNj4gPgorICAgICAgICAgREZJID0gZGZfZXh0X2JlZ2luKEVudHJ5LCBWaXNpdGVkKSwgRSA9IGRmX2V4dF9lbmQoRW50cnksIFZpc2l0ZWQpOworICAgICAgIERGSSAhPSBFOyArK0RGSSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSAqREZJOworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkItPmJlZ2luKCksIEUgPSBNQkItPmVuZCgpOworICAgICAgICAgSSAhPSBFOyApIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqTUkgPSAmKkk7CisgICAgICArK0k7CisgICAgICBpZiAoTUktPmlzSW1wbGljaXREZWYoKSkgeworICAgICAgICBpZiAoTUktPmdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIHVuc2lnbmVkIFJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgICAgICBJbXBEZWZSZWdzLmluc2VydChSZWcpOworICAgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkgeworICAgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlNTID0gdHJpXy0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7ICpTUzsgKytTUykKKyAgICAgICAgICAgIEltcERlZlJlZ3MuaW5zZXJ0KCpTUyk7CisgICAgICAgIH0KKyAgICAgICAgSW1wRGVmTUlzLnB1c2hfYmFjayhNSSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBFbGltaW5hdGUgJXJlZzEwMzI6c3ViPGRlZj4gPSBDT1BZIHVuZGVmLgorICAgICAgaWYgKE1JLT5pc0NvcHkoKSAmJiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRTdWJSZWcoKSkgeworICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgICAgaWYgKE1PLmlzVW5kZWYoKSB8fCBJbXBEZWZSZWdzLmNvdW50KE1PLmdldFJlZygpKSkgeworICAgICAgICAgIGlmIChNTy5pc0tpbGwoKSkgeworICAgICAgICAgICAgTGl2ZVZhcmlhYmxlczo6VmFySW5mbyYgdmkgPSBsdl8tPmdldFZhckluZm8oTU8uZ2V0UmVnKCkpOworICAgICAgICAgICAgdmkucmVtb3ZlS2lsbChNSSk7CisgICAgICAgICAgfQorICAgICAgICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBib29sIENoYW5nZWRUb0ltcERlZiA9IGZhbHNlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBNYWNoaW5lT3BlcmFuZCYgTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKCFNTy5pc1JlZygpIHx8IChNTy5pc0RlZigpICYmICFNTy5nZXRTdWJSZWcoKSkgfHwgTU8uaXNVbmRlZigpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgICAgaWYgKCFSZWcpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghSW1wRGVmUmVncy5jb3VudChSZWcpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBVc2UgaXMgYSBjb3B5LCBqdXN0IHR1cm4gaXQgaW50byBhbiBpbXBsaWNpdF9kZWYuCisgICAgICAgIGlmIChDYW5UdXJuSW50b0ltcGxpY2l0RGVmKE1JLCBSZWcsIGksIHRpaV8sIEltcERlZlJlZ3MpKSB7CisgICAgICAgICAgYm9vbCBpc0tpbGwgPSBNTy5pc0tpbGwoKTsKKyAgICAgICAgICBNSS0+c2V0RGVzYyh0aWlfLT5nZXQoVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYpKTsKKyAgICAgICAgICBmb3IgKGludCBqID0gTUktPmdldE51bU9wZXJhbmRzKCkgLSAxLCBlZSA9IDA7IGogPiBlZTsgLS1qKQorICAgICAgICAgICAgTUktPlJlbW92ZU9wZXJhbmQoaik7CisgICAgICAgICAgaWYgKGlzS2lsbCkgeworICAgICAgICAgICAgSW1wRGVmUmVncy5lcmFzZShSZWcpOworICAgICAgICAgICAgTGl2ZVZhcmlhYmxlczo6VmFySW5mbyYgdmkgPSBsdl8tPmdldFZhckluZm8oUmVnKTsKKyAgICAgICAgICAgIHZpLnJlbW92ZUtpbGwoTUkpOworICAgICAgICAgIH0KKyAgICAgICAgICBDaGFuZ2VkVG9JbXBEZWYgPSB0cnVlOworICAgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIE1PLnNldElzVW5kZWYoKTsKKyAgICAgICAgLy8gVGhpcyBpcyBhIHBhcnRpYWwgcmVnaXN0ZXIgcmVkZWYgb2YgYW4gaW1wbGljaXQgZGVmLgorICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHdob2xlIHJlZ2lzdGVyIGlzIGRlZmluZWQgYnkgdGhlIGluc3RydWN0aW9uLgorICAgICAgICBpZiAoTU8uaXNEZWYoKSkgeworICAgICAgICAgIE1JLT5hZGRSZWdpc3RlckRlZmluZWQoUmVnKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoTU8uaXNLaWxsKCkgfHwgTUktPmlzUmVnVGllZFRvRGVmT3BlcmFuZChpKSkgeworICAgICAgICAgIC8vIE1ha2Ugc3VyZSBvdGhlciB1c2VzIG9mIAorICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IGkrMTsgaiAhPSBlOyArK2opIHsKKyAgICAgICAgICAgIE1hY2hpbmVPcGVyYW5kICZNT0ogPSBNSS0+Z2V0T3BlcmFuZChqKTsKKyAgICAgICAgICAgIGlmIChNT0ouaXNSZWcoKSAmJiBNT0ouaXNVc2UoKSAmJiBNT0ouZ2V0UmVnKCkgPT0gUmVnKQorICAgICAgICAgICAgICBNT0ouc2V0SXNVbmRlZigpOworICAgICAgICAgIH0KKyAgICAgICAgICBJbXBEZWZSZWdzLmVyYXNlKFJlZyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKENoYW5nZWRUb0ltcERlZikgeworICAgICAgICAvLyBCYWNrdHJhY2sgdG8gcHJvY2VzcyB0aGlzIG5ldyBpbXBsaWNpdF9kZWYuCisgICAgICAgIC0tSTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTUktPmdldE51bU9wZXJhbmRzKCk7ICsraSkgeworICAgICAgICAgIE1hY2hpbmVPcGVyYW5kJiBNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNEZWYoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIEltcERlZlJlZ3MuZXJhc2UoTU8uZ2V0UmVnKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQW55IG91dHN0YW5kaW5nIGxpdmVvdXQgaW1wbGljaXRfZGVmJ3M/CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEltcERlZk1Jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gSW1wRGVmTUlzW2ldOworICAgICAgdW5zaWduZWQgUmVnID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSB8fAorICAgICAgICAgICFJbXBEZWZSZWdzLmNvdW50KFJlZykpIHsKKyAgICAgICAgLy8gRGVsZXRlIGFsbCAibG9jYWwiIGltcGxpY2l0X2RlZidzLiBUaGF0IGluY2x1ZGUgdGhvc2Ugd2hpY2ggZGVmaW5lCisgICAgICAgIC8vIHBoeXNpY2FsIHJlZ2lzdGVycyBzaW5jZSB0aGV5IGNhbm5vdCBiZSBsaXZlb3V0LgorICAgICAgICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlZnMgb2YgdGhlIHNhbWUgcmVnaXN0ZXIgYW5kIGF0IGxlYXN0IG9uZQorICAgICAgLy8gaXMgbm90IGFuIGltcGxpY2l0X2RlZiwgZG8gbm90IGluc2VydCBpbXBsaWNpdF9kZWYncyBiZWZvcmUgdGhlCisgICAgICAvLyB1c2VzLgorICAgICAgYm9vbCBTa2lwID0gZmFsc2U7CisgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBEZWFkSW1wRGVmczsKKyAgICAgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6ZGVmX2l0ZXJhdG9yIERJID0gbXJpXy0+ZGVmX2JlZ2luKFJlZyksCisgICAgICAgICAgICAgREUgPSBtcmlfLT5kZWZfZW5kKCk7IERJICE9IERFOyArK0RJKSB7CisgICAgICAgIE1hY2hpbmVJbnN0ciAqRGVhZEltcERlZiA9ICYqREk7CisgICAgICAgIGlmICghRGVhZEltcERlZi0+aXNJbXBsaWNpdERlZigpKSB7CisgICAgICAgICAgU2tpcCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRGVhZEltcERlZnMucHVzaF9iYWNrKERlYWRJbXBEZWYpOworICAgICAgfQorICAgICAgaWYgKFNraXApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBUaGUgb25seSBpbXBsaWNpdF9kZWYgd2hpY2ggd2Ugd2FudCB0byBrZWVwIGFyZSB0aG9zZSB0aGF0IGFyZSBsaXZlCisgICAgICAvLyBvdXQgb2YgaXRzIGJsb2NrLgorICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZWUgPSBEZWFkSW1wRGVmcy5zaXplKCk7IGogIT0gZWU7ICsraikKKyAgICAgICAgRGVhZEltcERlZnNbal0tPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisKKyAgICAgIC8vIFByb2Nlc3MgZWFjaCB1c2UgaW5zdHJ1Y3Rpb24gb25jZS4KKyAgICAgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6dXNlX2l0ZXJhdG9yIFVJID0gbXJpXy0+dXNlX2JlZ2luKFJlZyksCisgICAgICAgICAgICAgVUUgPSBtcmlfLT51c2VfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgICAgIGlmIChVSS5nZXRPcGVyYW5kKCkuaXNVbmRlZigpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBNYWNoaW5lSW5zdHIgKlJNSSA9ICYqVUk7CisgICAgICAgIGlmIChNb2RJbnN0cy5pbnNlcnQoUk1JKSkKKyAgICAgICAgICBSVXNlcy5wdXNoX2JhY2soUk1JKTsKKyAgICAgIH0KKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJVc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgTWFjaGluZUluc3RyICpSTUkgPSBSVXNlc1tpXTsKKworICAgICAgICAvLyBUdXJuIGEgY29weSB1c2UgaW50byBhbiBpbXBsaWNpdF9kZWYuCisgICAgICAgIGlmIChpc1VuZGVmQ29weShSTUksIFJlZywgdGlpXywgSW1wRGVmUmVncykpIHsKKyAgICAgICAgICBSTUktPnNldERlc2ModGlpXy0+Z2V0KFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGKSk7CisKKyAgICAgICAgICBib29sIGlzS2lsbCA9IGZhbHNlOworICAgICAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBPcHM7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZWUgPSBSTUktPmdldE51bU9wZXJhbmRzKCk7IGogIT0gZWU7ICsraikgeworICAgICAgICAgICAgTWFjaGluZU9wZXJhbmQgJlJSTU8gPSBSTUktPmdldE9wZXJhbmQoaik7CisgICAgICAgICAgICBpZiAoUlJNTy5pc1JlZygpICYmIFJSTU8uZ2V0UmVnKCkgPT0gUmVnKSB7CisgICAgICAgICAgICAgIE9wcy5wdXNoX2JhY2soaik7CisgICAgICAgICAgICAgIGlmIChSUk1PLmlzS2lsbCgpKQorICAgICAgICAgICAgICAgIGlzS2lsbCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8vIExlYXZlIHRoZSBvdGhlciBvcGVyYW5kcyBhbG9uZy4KKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlZSA9IE9wcy5zaXplKCk7IGogIT0gZWU7ICsraikgeworICAgICAgICAgICAgdW5zaWduZWQgT3BJZHggPSBPcHNbal07CisgICAgICAgICAgICBSTUktPlJlbW92ZU9wZXJhbmQoT3BJZHgtaik7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gVXBkYXRlIExpdmVWYXJpYWJsZXMgdmFyaW5mbyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBraWxsLgorICAgICAgICAgIGlmIChpc0tpbGwpIHsKKyAgICAgICAgICAgIExpdmVWYXJpYWJsZXM6OlZhckluZm8mIHZpID0gbHZfLT5nZXRWYXJJbmZvKFJlZyk7CisgICAgICAgICAgICB2aS5yZW1vdmVLaWxsKFJNSSk7CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwbGFjZSBSZWcgd2l0aCBhIG5ldyB2cmVnIHRoYXQncyBtYXJrZWQgaW1wbGljaXQuCisgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIFJDID0gbXJpXy0+Z2V0UmVnQ2xhc3MoUmVnKTsKKyAgICAgICAgdW5zaWduZWQgTmV3VlJlZyA9IG1yaV8tPmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgICAgICAgIGJvb2wgaXNLaWxsID0gdHJ1ZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZWUgPSBSTUktPmdldE51bU9wZXJhbmRzKCk7IGogIT0gZWU7ICsraikgeworICAgICAgICAgIE1hY2hpbmVPcGVyYW5kICZSUk1PID0gUk1JLT5nZXRPcGVyYW5kKGopOworICAgICAgICAgIGlmIChSUk1PLmlzUmVnKCkgJiYgUlJNTy5nZXRSZWcoKSA9PSBSZWcpIHsKKyAgICAgICAgICAgIFJSTU8uc2V0UmVnKE5ld1ZSZWcpOworICAgICAgICAgICAgUlJNTy5zZXRJc1VuZGVmKCk7CisgICAgICAgICAgICBpZiAoaXNLaWxsKSB7CisgICAgICAgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IG9wZXJhbmQgb2YgTmV3VlJlZyBpcyBtYXJrZWQga2lsbC4KKyAgICAgICAgICAgICAgUlJNTy5zZXRJc0tpbGwoKTsKKyAgICAgICAgICAgICAgaXNLaWxsID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBSVXNlcy5jbGVhcigpOworICAgICAgTW9kSW5zdHMuY2xlYXIoKTsKKyAgICB9CisgICAgSW1wRGVmUmVncy5jbGVhcigpOworICAgIEltcERlZk1Jcy5jbGVhcigpOworICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Byb2xvZ0VwaWxvZ0luc2VydGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Byb2xvZ0VwaWxvZ0luc2VydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjZjZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUHJvbG9nRXBpbG9nSW5zZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsOTQyIEBACisvLz09PS0tIFByb2xvZ0VwaWxvZ0luc2VydGVyLmNwcCAtIEluc2VydCBQcm9sb2cvRXBpbG9nIGNvZGUgaW4gZnVuY3Rpb24gLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpcyByZXNwb25zaWJsZSBmb3IgZmluYWxpemluZyB0aGUgZnVuY3Rpb25zIGZyYW1lIGxheW91dCwgc2F2aW5nCisvLyBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLCBhbmQgZm9yIGVtaXR0aW5nIHByb2xvZyAmIGVwaWxvZyBjb2RlIGZvciB0aGUKKy8vIGZ1bmN0aW9uLgorLy8KKy8vIFRoaXMgcGFzcyBtdXN0IGJlIHJ1biBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uLiAgQWZ0ZXIgdGhpcyBwYXNzIGlzCisvLyBleGVjdXRlZCwgaXQgaXMgaWxsZWdhbCB0byBjb25zdHJ1Y3QgTU9fRnJhbWVJbmRleCBvcGVyYW5kcy4KKy8vCisvLyBUaGlzIHBhc3MgcHJvdmlkZXMgYW4gb3B0aW9uYWwgc2hyaW5rIHdyYXBwaW5nIHZhcmlhbnQgb2YgcHJvbG9nL2VwaWxvZworLy8gaW5zZXJ0aW9uLCBlbmFibGVkIHZpYSAtLXNocmluay13cmFwLiBTZWUgU2hyaW5rV3JhcHBpbmcuY3BwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJQcm9sb2dFcGlsb2dJbnNlcnRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW5kZXhlZE1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8Y2xpbWl0cz4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK2NoYXIgUEVJOjpJRCA9IDA7CisKK0lOSVRJQUxJWkVfUEFTUyhQRUksICJwcm9sb2dlcGlsb2ciLAorICAgICAgICAgICAgICAgICJQcm9sb2d1ZS9FcGlsb2d1ZSBJbnNlcnRpb24iLCBmYWxzZSwgZmFsc2UpOworCisvLy8gY3JlYXRlUHJvbG9nRXBpbG9nQ29kZUluc2VydGVyIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcGFzcyB0aGF0IGluc2VydHMKKy8vLyBwcm9sb2cgYW5kIGVwaWxvZyBjb2RlLCBhbmQgZWxpbWluYXRlcyBhYnN0cmFjdCBmcmFtZSByZWZlcmVuY2VzLgorLy8vCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZVByb2xvZ0VwaWxvZ0NvZGVJbnNlcnRlcigpIHsgcmV0dXJuIG5ldyBQRUkoKTsgfQorCisvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24gLSBJbnNlcnQgcHJvbG9nL2VwaWxvZyBjb2RlIGFuZCByZXBsYWNlIGFic3RyYWN0CisvLy8gZnJhbWUgaW5kZXhlcyB3aXRoIGFwcHJvcHJpYXRlIHJlZmVyZW5jZXMuCisvLy8KK2Jvb2wgUEVJOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKSB7CisgIGNvbnN0IEZ1bmN0aW9uKiBGID0gRm4uZ2V0RnVuY3Rpb24oKTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBGbi5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKyAgUlMgPSBUUkktPnJlcXVpcmVzUmVnaXN0ZXJTY2F2ZW5naW5nKEZuKSA/IG5ldyBSZWdTY2F2ZW5nZXIoKSA6IE5VTEw7CisgIEZyYW1lSW5kZXhWaXJ0dWFsU2NhdmVuZ2luZyA9IFRSSS0+cmVxdWlyZXNGcmFtZUluZGV4U2NhdmVuZ2luZyhGbik7CisgIEZyYW1lQ29uc3RhbnRSZWdNYXAuY2xlYXIoKTsKKworICAvLyBDYWxjdWxhdGUgdGhlIE1heENhbGxGcmFtZVNpemUgYW5kIEFkanVzdHNTdGFjayB2YXJpYWJsZXMgZm9yIHRoZQorICAvLyBmdW5jdGlvbidzIGZyYW1lIGluZm9ybWF0aW9uLiBBbHNvIGVsaW1pbmF0ZXMgY2FsbCBmcmFtZSBwc2V1ZG8KKyAgLy8gaW5zdHJ1Y3Rpb25zLgorICBjYWxjdWxhdGVDYWxsc0luZm9ybWF0aW9uKEZuKTsKKworICAvLyBBbGxvdyB0aGUgdGFyZ2V0IG1hY2hpbmUgdG8gbWFrZSBzb21lIGFkanVzdG1lbnRzIHRvIHRoZSBmdW5jdGlvbgorICAvLyBlLmcuIFVzZWRQaHlzUmVncyBiZWZvcmUgY2FsY3VsYXRlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMuCisgIFRSSS0+cHJvY2Vzc0Z1bmN0aW9uQmVmb3JlQ2FsbGVlU2F2ZWRTY2FuKEZuLCBSUyk7CisKKyAgLy8gU2NhbiB0aGUgZnVuY3Rpb24gZm9yIG1vZGlmaWVkIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgYW5kIGluc2VydCBzcGlsbCBjb2RlCisgIC8vIGZvciBhbnkgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyB0aGF0IGFyZSBtb2RpZmllZC4KKyAgY2FsY3VsYXRlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoRm4pOworCisgIC8vIERldGVybWluZSBwbGFjZW1lbnQgb2YgQ1NSIHNwaWxsL3Jlc3RvcmUgY29kZToKKyAgLy8gIC0gV2l0aCBzaHJpbmsgd3JhcHBpbmcsIHBsYWNlIHNwaWxscyBhbmQgcmVzdG9yZXMgdG8gdGlnaHRseQorICAvLyAgICBlbmNsb3NlIHJlZ2lvbnMgaW4gdGhlIE1hY2hpbmUgQ0ZHIG9mIHRoZSBmdW5jdGlvbiB3aGVyZQorICAvLyAgICB0aGV5IGFyZSB1c2VkLgorICAvLyAgLSBXaXRob3V0IHNoaW5rIHdyYXBwaW5nIChkZWZhdWx0KSwgcGxhY2UgYWxsIHNwaWxscyBpbiB0aGUKKyAgLy8gICAgZW50cnkgYmxvY2ssIGFsbCByZXN0b3JlcyBpbiByZXR1cm4gYmxvY2tzLgorICBwbGFjZUNTUlNwaWxsc0FuZFJlc3RvcmVzKEZuKTsKKworICAvLyBBZGQgdGhlIGNvZGUgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycworICBpZiAoIUYtPmhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5ha2VkKSkKKyAgICBpbnNlcnRDU1JTcGlsbHNBbmRSZXN0b3JlcyhGbik7CisKKyAgLy8gQWxsb3cgdGhlIHRhcmdldCBtYWNoaW5lIHRvIG1ha2UgZmluYWwgbW9kaWZpY2F0aW9ucyB0byB0aGUgZnVuY3Rpb24KKyAgLy8gYmVmb3JlIHRoZSBmcmFtZSBsYXlvdXQgaXMgZmluYWxpemVkLgorICBUUkktPnByb2Nlc3NGdW5jdGlvbkJlZm9yZUZyYW1lRmluYWxpemVkKEZuKTsKKworICAvLyBDYWxjdWxhdGUgYWN0dWFsIGZyYW1lIG9mZnNldHMgZm9yIGFsbCBhYnN0cmFjdCBzdGFjayBvYmplY3RzLi4uCisgIGNhbGN1bGF0ZUZyYW1lT2JqZWN0T2Zmc2V0cyhGbik7CisKKyAgLy8gQWRkIHByb2xvZyBhbmQgZXBpbG9nIGNvZGUgdG8gdGhlIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZAorICAvLyB0byBhbGlnbiB0aGUgc3RhY2sgZnJhbWUgYXMgbmVjZXNzYXJ5IGZvciBhbnkgc3RhY2sgdmFyaWFibGVzIG9yCisgIC8vIGNhbGxlZCBmdW5jdGlvbnMuICBCZWNhdXNlIG9mIHRoaXMsIGNhbGN1bGF0ZUNhbGxlZVNhdmVkUmVnaXN0ZXJzKCkKKyAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaW4gb3JkZXIgdG8gc2V0IHRoZSBBZGp1c3RzU3RhY2sKKyAgLy8gYW5kIE1heENhbGxGcmFtZVNpemUgdmFyaWFibGVzLgorICBpZiAoIUYtPmhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5ha2VkKSkKKyAgICBpbnNlcnRQcm9sb2dFcGlsb2dDb2RlKEZuKTsKKworICAvLyBSZXBsYWNlIGFsbCBNT19GcmFtZUluZGV4IG9wZXJhbmRzIHdpdGggcGh5c2ljYWwgcmVnaXN0ZXIgcmVmZXJlbmNlcworICAvLyBhbmQgYWN0dWFsIG9mZnNldHMuCisgIC8vCisgIHJlcGxhY2VGcmFtZUluZGljZXMoRm4pOworCisgIC8vIElmIHJlZ2lzdGVyIHNjYXZlbmdpbmcgaXMgbmVlZGVkLCBhcyB3ZSd2ZSBlbmFibGVkIGRvaW5nIGl0IGFzIGEKKyAgLy8gcG9zdC1wYXNzLCBzY2F2ZW5nZSB0aGUgdmlydHVhbCByZWdpc3RlcnMgdGhhdCBmcmFtZSBpbmRleCBlbGltaWF0aW9uCisgIC8vIGluc2VydGVkLgorICBpZiAoVFJJLT5yZXF1aXJlc1JlZ2lzdGVyU2NhdmVuZ2luZyhGbikgJiYgRnJhbWVJbmRleFZpcnR1YWxTY2F2ZW5naW5nKQorICAgIHNjYXZlbmdlRnJhbWVWaXJ0dWFsUmVncyhGbik7CisKKyAgZGVsZXRlIFJTOworICBjbGVhckFsbFNldHMoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNpZiAwCit2b2lkIFBFSTo6Z2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgaWYgKFNocmlua1dyYXBwaW5nIHx8IFNocmlua1dyYXBGdW5jICE9ICIiKSB7CisgICAgQVUuYWRkUmVxdWlyZWQ8TWFjaGluZUxvb3BJbmZvPigpOworICAgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVEb21pbmF0b3JUcmVlPigpOworICB9CisgIEFVLmFkZFByZXNlcnZlZDxNYWNoaW5lTG9vcEluZm8+KCk7CisgIEFVLmFkZFByZXNlcnZlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7Cit9CisjZW5kaWYKKworLy8vIGNhbGN1bGF0ZUNhbGxzSW5mb3JtYXRpb24gLSBDYWxjdWxhdGUgdGhlIE1heENhbGxGcmFtZVNpemUgYW5kIEFkanVzdHNTdGFjaworLy8vIHZhcmlhYmxlcyBmb3IgdGhlIGZ1bmN0aW9uJ3MgZnJhbWUgaW5mb3JtYXRpb24gYW5kIGVsaW1pbmF0ZSBjYWxsIGZyYW1lCisvLy8gcHNldWRvIGluc3RydWN0aW9ucy4KK3ZvaWQgUEVJOjpjYWxjdWxhdGVDYWxsc0luZm9ybWF0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRm4pIHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSZWdJbmZvID0gRm4uZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IEZuLmdldEZyYW1lSW5mbygpOworCisgIHVuc2lnbmVkIE1heENhbGxGcmFtZVNpemUgPSAwOworICBib29sIEFkanVzdHNTdGFjayA9IE1GSS0+YWRqdXN0c1N0YWNrKCk7CisKKyAgLy8gR2V0IHRoZSBmdW5jdGlvbiBjYWxsIGZyYW1lIHNldC11cCBhbmQgdGVhci1kb3duIGluc3RydWN0aW9uIG9wY29kZQorICBpbnQgRnJhbWVTZXR1cE9wY29kZSAgID0gUmVnSW5mby0+Z2V0Q2FsbEZyYW1lU2V0dXBPcGNvZGUoKTsKKyAgaW50IEZyYW1lRGVzdHJveU9wY29kZSA9IFJlZ0luZm8tPmdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKTsKKworICAvLyBFYXJseSBleGl0IGZvciB0YXJnZXRzIHdoaWNoIGhhdmUgbm8gY2FsbCBmcmFtZSBzZXR1cC9kZXN0cm95IHBzZXVkbworICAvLyBpbnN0cnVjdGlvbnMuCisgIGlmIChGcmFtZVNldHVwT3Bjb2RlID09IC0xICYmIEZyYW1lRGVzdHJveU9wY29kZSA9PSAtMSkKKyAgICByZXR1cm47CisKKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yPiBGcmFtZVNET3BzOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGbi5iZWdpbigpLCBFID0gRm4uZW5kKCk7IEJCICE9IEU7ICsrQkIpCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpOyBJICE9IEJCLT5lbmQoKTsgKytJKQorICAgICAgaWYgKEktPmdldE9wY29kZSgpID09IEZyYW1lU2V0dXBPcGNvZGUgfHwKKyAgICAgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBGcmFtZURlc3Ryb3lPcGNvZGUpIHsKKyAgICAgICAgYXNzZXJ0KEktPmdldE51bU9wZXJhbmRzKCkgPj0gMSAmJiAiQ2FsbCBGcmFtZSBTZXR1cC9EZXN0cm95IFBzZXVkbyIKKyAgICAgICAgICAgICAgICIgaW5zdHJ1Y3Rpb25zIHNob3VsZCBoYXZlIGEgc2luZ2xlIGltbWVkaWF0ZSBhcmd1bWVudCEiKTsKKyAgICAgICAgdW5zaWduZWQgU2l6ZSA9IEktPmdldE9wZXJhbmQoMCkuZ2V0SW1tKCk7CisgICAgICAgIGlmIChTaXplID4gTWF4Q2FsbEZyYW1lU2l6ZSkgTWF4Q2FsbEZyYW1lU2l6ZSA9IFNpemU7CisgICAgICAgIEFkanVzdHNTdGFjayA9IHRydWU7CisgICAgICAgIEZyYW1lU0RPcHMucHVzaF9iYWNrKEkpOworICAgICAgfQorCisgIE1GSS0+c2V0QWRqdXN0c1N0YWNrKEFkanVzdHNTdGFjayk7CisgIE1GSS0+c2V0TWF4Q2FsbEZyYW1lU2l6ZShNYXhDYWxsRnJhbWVTaXplKTsKKworICBmb3IgKHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcj46Oml0ZXJhdG9yCisgICAgICAgICBpID0gRnJhbWVTRE9wcy5iZWdpbigpLCBlID0gRnJhbWVTRE9wcy5lbmQoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9ICppOworCisgICAgLy8gSWYgY2FsbCBmcmFtZXMgYXJlIG5vdCBiZWluZyBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBzdGFjayBmcmFtZSwgYW5kCisgICAgLy8gdGhlIHRhcmdldCBkb2Vzbid0IGluZGljYXRlIG90aGVyd2lzZSwgcmVtb3ZlIHRoZSBjYWxsIGZyYW1lIHBzZXVkb3MKKyAgICAvLyBoZXJlLiBUaGUgc3ViL2FkZCBzcCBpbnN0cnVjdGlvbiBwYWlycyBhcmUgc3RpbGwgaW5zZXJ0ZWQsIGJ1dCB3ZSBkb24ndAorICAgIC8vIG5lZWQgdG8gdHJhY2sgdGhlIFNQIGFkanVzdG1lbnQgZm9yIGZyYW1lIGluZGV4IGVsaW1pbmF0aW9uLgorICAgIGlmIChSZWdJbmZvLT5jYW5TaW1wbGlmeUNhbGxGcmFtZVBzZXVkb3MoRm4pKQorICAgICAgUmVnSW5mby0+ZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoRm4sICpJLT5nZXRQYXJlbnQoKSwgSSk7CisgIH0KK30KKworCisvLy8gY2FsY3VsYXRlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMgLSBTY2FuIHRoZSBmdW5jdGlvbiBmb3IgbW9kaWZpZWQgY2FsbGVlIHNhdmVkCisvLy8gcmVnaXN0ZXJzLgordm9pZCBQRUk6OmNhbGN1bGF0ZUNhbGxlZVNhdmVkUmVnaXN0ZXJzKE1hY2hpbmVGdW5jdGlvbiAmRm4pIHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSZWdJbmZvID0gRm4uZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIGNvbnN0IFRhcmdldEZyYW1lSW5mbyAqVEZJID0gRm4uZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IEZuLmdldEZyYW1lSW5mbygpOworCisgIC8vIEdldCB0aGUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVyIGxpc3QuLi4KKyAgY29uc3QgdW5zaWduZWQgKkNTUmVncyA9IFJlZ0luZm8tPmdldENhbGxlZVNhdmVkUmVncygmRm4pOworCisgIC8vIFRoZXNlIGFyZSB1c2VkIHRvIGtlZXAgdHJhY2sgdGhlIGNhbGxlZS1zYXZlIGFyZWEuIEluaXRpYWxpemUgdGhlbS4KKyAgTWluQ1NGcmFtZUluZGV4ID0gSU5UX01BWDsKKyAgTWF4Q1NGcmFtZUluZGV4ID0gMDsKKworICAvLyBFYXJseSBleGl0IGZvciB0YXJnZXRzIHdoaWNoIGhhdmUgbm8gY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4KKyAgaWYgKENTUmVncyA9PSAwIHx8IENTUmVnc1swXSA9PSAwKQorICAgIHJldHVybjsKKworICAvLyBJbiBOYWtlZCBmdW5jdGlvbnMgd2UgYXJlbid0IGdvaW5nIHRvIHNhdmUgYW55IHJlZ2lzdGVycy4KKyAgaWYgKEZuLmdldEZ1bmN0aW9uKCktPmhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5ha2VkKSkKKyAgICByZXR1cm47CisKKyAgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiBDU0k7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IENTUmVnc1tpXTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gQ1NSZWdzW2ldOworICAgIGlmIChGbi5nZXRSZWdJbmZvKCkuaXNQaHlzUmVnVXNlZChSZWcpKSB7CisgICAgICAvLyBJZiB0aGUgcmVnIGlzIG1vZGlmaWVkLCBzYXZlIGl0IQorICAgICAgQ1NJLnB1c2hfYmFjayhDYWxsZWVTYXZlZEluZm8oUmVnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzU2V0ID0gUmVnSW5mby0+Z2V0QWxpYXNTZXQoUmVnKTsKKyAgICAgICAgICAgKkFsaWFzU2V0OyArK0FsaWFzU2V0KSB7ICAvLyBDaGVjayBhbGlhcyByZWdpc3RlcnMgdG9vLgorICAgICAgICBpZiAoRm4uZ2V0UmVnSW5mbygpLmlzUGh5c1JlZ1VzZWQoKkFsaWFzU2V0KSkgeworICAgICAgICAgIENTSS5wdXNoX2JhY2soQ2FsbGVlU2F2ZWRJbmZvKFJlZykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKENTSS5lbXB0eSgpKQorICAgIHJldHVybjsgICAvLyBFYXJseSBleGl0IGlmIG5vIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgYXJlIG1vZGlmaWVkIQorCisgIHVuc2lnbmVkIE51bUZpeGVkU3BpbGxTbG90czsKKyAgY29uc3QgVGFyZ2V0RnJhbWVJbmZvOjpTcGlsbFNsb3QgKkZpeGVkU3BpbGxTbG90cyA9CisgICAgVEZJLT5nZXRDYWxsZWVTYXZlZFNwaWxsU2xvdHMoTnVtRml4ZWRTcGlsbFNsb3RzKTsKKworICAvLyBOb3cgdGhhdCB3ZSBrbm93IHdoaWNoIHJlZ2lzdGVycyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCwgYWxsb2NhdGUKKyAgLy8gc3RhY2sgc2xvdHMgZm9yIHRoZW0uCisgIGZvciAoc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPjo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSBDU0kuYmVnaW4oKSwgRSA9IENTSS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBJLT5nZXRSZWcoKTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IFJlZ0luZm8tPmdldE1pbmltYWxQaHlzUmVnQ2xhc3MoUmVnKTsKKworICAgIGludCBGcmFtZUlkeDsKKyAgICBpZiAoUmVnSW5mby0+aGFzUmVzZXJ2ZWRTcGlsbFNsb3QoRm4sIFJlZywgRnJhbWVJZHgpKSB7CisgICAgICBJLT5zZXRGcmFtZUlkeChGcmFtZUlkeCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBwaHlzcmVnIG11c3QgYmUgc3BpbGxlZCB0byBhIHBhcnRpY3VsYXIgc3RhY2sgc2xvdAorICAgIC8vIG9uIHRoaXMgdGFyZ2V0LgorICAgIGNvbnN0IFRhcmdldEZyYW1lSW5mbzo6U3BpbGxTbG90ICpGaXhlZFNsb3QgPSBGaXhlZFNwaWxsU2xvdHM7CisgICAgd2hpbGUgKEZpeGVkU2xvdCAhPSBGaXhlZFNwaWxsU2xvdHMrTnVtRml4ZWRTcGlsbFNsb3RzICYmCisgICAgICAgICAgIEZpeGVkU2xvdC0+UmVnICE9IFJlZykKKyAgICAgICsrRml4ZWRTbG90OworCisgICAgaWYgKEZpeGVkU2xvdCA9PSBGaXhlZFNwaWxsU2xvdHMgKyBOdW1GaXhlZFNwaWxsU2xvdHMpIHsKKyAgICAgIC8vIE5vcGUsIGp1c3Qgc3BpbGwgaXQgYW55d2hlcmUgY29udmVuaWVudC4KKyAgICAgIHVuc2lnbmVkIEFsaWduID0gUkMtPmdldEFsaWdubWVudCgpOworICAgICAgdW5zaWduZWQgU3RhY2tBbGlnbiA9IFRGSS0+Z2V0U3RhY2tBbGlnbm1lbnQoKTsKKworICAgICAgLy8gV2UgbWF5IG5vdCBiZSBhYmxlIHRvIHNhdGlzZnkgdGhlIGRlc2lyZWQgYWxpZ25tZW50IHNwZWNpZmljYXRpb24gb2YKKyAgICAgIC8vIHRoZSBUYXJnZXRSZWdpc3RlckNsYXNzIGlmIHRoZSBzdGFjayBhbGlnbm1lbnQgaXMgc21hbGxlci4gVXNlIHRoZQorICAgICAgLy8gbWluLgorICAgICAgQWxpZ24gPSBzdGQ6Om1pbihBbGlnbiwgU3RhY2tBbGlnbik7CisgICAgICBGcmFtZUlkeCA9IE1GSS0+Q3JlYXRlU3RhY2tPYmplY3QoUkMtPmdldFNpemUoKSwgQWxpZ24sIHRydWUpOworICAgICAgaWYgKCh1bnNpZ25lZClGcmFtZUlkeCA8IE1pbkNTRnJhbWVJbmRleCkgTWluQ1NGcmFtZUluZGV4ID0gRnJhbWVJZHg7CisgICAgICBpZiAoKHVuc2lnbmVkKUZyYW1lSWR4ID4gTWF4Q1NGcmFtZUluZGV4KSBNYXhDU0ZyYW1lSW5kZXggPSBGcmFtZUlkeDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU3BpbGwgaXQgdG8gdGhlIHN0YWNrIHdoZXJlIHdlIG11c3QuCisgICAgICBGcmFtZUlkeCA9IE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoUkMtPmdldFNpemUoKSwgRml4ZWRTbG90LT5PZmZzZXQsIHRydWUpOworICAgIH0KKworICAgIEktPnNldEZyYW1lSWR4KEZyYW1lSWR4KTsKKyAgfQorCisgIE1GSS0+c2V0Q2FsbGVlU2F2ZWRJbmZvKENTSSk7Cit9CisKKy8vLyBpbnNlcnRDU1JTcGlsbHNBbmRSZXN0b3JlcyAtIEluc2VydCBzcGlsbCBhbmQgcmVzdG9yZSBjb2RlIGZvcgorLy8vIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgdXNlZCBpbiB0aGUgZnVuY3Rpb24sIGhhbmRsaW5nIHNocmluayB3cmFwcGluZy4KKy8vLwordm9pZCBQRUk6Omluc2VydENTUlNwaWxsc0FuZFJlc3RvcmVzKE1hY2hpbmVGdW5jdGlvbiAmRm4pIHsKKyAgLy8gR2V0IGNhbGxlZSBzYXZlZCByZWdpc3RlciBpbmZvcm1hdGlvbi4KKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gRm4uZ2V0RnJhbWVJbmZvKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSA9IE1GSS0+Z2V0Q2FsbGVlU2F2ZWRJbmZvKCk7CisKKyAgTUZJLT5zZXRDYWxsZWVTYXZlZEluZm9WYWxpZCh0cnVlKTsKKworICAvLyBFYXJseSBleGl0IGlmIG5vIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgYXJlIG1vZGlmaWVkIQorICBpZiAoQ1NJLmVtcHR5KCkpCisgICAgcmV0dXJuOworCisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJID0gKkZuLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IEZuLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSTsKKworICBpZiAoISBTaHJpbmtXcmFwVGhpc0Z1bmN0aW9uKSB7CisgICAgLy8gU3BpbGwgdXNpbmcgdGFyZ2V0IGludGVyZmFjZS4KKyAgICBJID0gRW50cnlCbG9jay0+YmVnaW4oKTsKKyAgICBpZiAoIVRJSS5zcGlsbENhbGxlZVNhdmVkUmVnaXN0ZXJzKCpFbnRyeUJsb2NrLCBJLCBDU0ksIFRSSSkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDU0kuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAvLyBBZGQgdGhlIGNhbGxlZS1zYXZlZCByZWdpc3RlciBhcyBsaXZlLWluLgorICAgICAgICAvLyBJdCdzIGtpbGxlZCBhdCB0aGUgc3BpbGwuCisgICAgICAgIEVudHJ5QmxvY2stPmFkZExpdmVJbihDU0lbaV0uZ2V0UmVnKCkpOworCisgICAgICAgIC8vIEluc2VydCB0aGUgc3BpbGwgdG8gdGhlIHN0YWNrIGZyYW1lLgorICAgICAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaV0uZ2V0UmVnKCk7CisgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gVFJJLT5nZXRNaW5pbWFsUGh5c1JlZ0NsYXNzKFJlZyk7CisgICAgICAgIFRJSS5zdG9yZVJlZ1RvU3RhY2tTbG90KCpFbnRyeUJsb2NrLCBJLCBSZWcsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTSVtpXS5nZXRGcmFtZUlkeCgpLCBSQywgVFJJKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXN0b3JlIHVzaW5nIHRhcmdldCBpbnRlcmZhY2UuCisgICAgZm9yICh1bnNpZ25lZCByaSA9IDAsIHJlID0gUmV0dXJuQmxvY2tzLnNpemUoKTsgcmkgIT0gcmU7ICsrcmkpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIgPSBSZXR1cm5CbG9ja3NbcmldOworICAgICAgSSA9IE1CQi0+ZW5kKCk7IC0tSTsKKworICAgICAgLy8gU2tpcCBvdmVyIGFsbCB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucywgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHJldHVybgorICAgICAgLy8gc2VxdWVuY2UuCisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSTIgPSBJOworICAgICAgd2hpbGUgKEkyICE9IE1CQi0+YmVnaW4oKSAmJiAoLS1JMiktPmdldERlc2MoKS5pc1Rlcm1pbmF0b3IoKSkKKyAgICAgICAgSSA9IEkyOworCisgICAgICBib29sIEF0U3RhcnQgPSBJID09IE1CQi0+YmVnaW4oKTsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWZvcmVJID0gSTsKKyAgICAgIGlmICghQXRTdGFydCkKKyAgICAgICAgLS1CZWZvcmVJOworCisgICAgICAvLyBSZXN0b3JlIGFsbCByZWdpc3RlcnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSByZXR1cm4gYW5kIGFueQorICAgICAgLy8gdGVybWluYXRvcnMgdGhhdCBwcmVjZWVkIGl0LgorICAgICAgaWYgKCFUSUkucmVzdG9yZUNhbGxlZVNhdmVkUmVnaXN0ZXJzKCpNQkIsIEksIENTSSwgVFJJKSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ1NJLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaV0uZ2V0UmVnKCk7CisgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBUUkktPmdldE1pbmltYWxQaHlzUmVnQ2xhc3MoUmVnKTsKKyAgICAgICAgICBUSUkubG9hZFJlZ0Zyb21TdGFja1Nsb3QoKk1CQiwgSSwgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU0lbaV0uZ2V0RnJhbWVJZHgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkMsIFRSSSk7CisgICAgICAgICAgYXNzZXJ0KEkgIT0gTUJCLT5iZWdpbigpICYmCisgICAgICAgICAgICAgICAgICJsb2FkUmVnRnJvbVN0YWNrU2xvdCBkaWRuJ3QgaW5zZXJ0IGFueSBjb2RlISIpOworICAgICAgICAgIC8vIEluc2VydCBpbiByZXZlcnNlIG9yZGVyLiAgbG9hZFJlZ0Zyb21TdGFja1Nsb3QgY2FuIGluc2VydAorICAgICAgICAgIC8vIG11bHRpcGxlIGluc3RydWN0aW9ucy4KKyAgICAgICAgICBpZiAoQXRTdGFydCkKKyAgICAgICAgICAgIEkgPSBNQkItPmJlZ2luKCk7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBJID0gQmVmb3JlSTsKKyAgICAgICAgICAgICsrSTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSW5zZXJ0IHNwaWxscy4KKyAgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiBibG9ja0NTSTsKKyAgZm9yIChDU1JlZ0Jsb2NrTWFwOjppdGVyYXRvciBCSSA9IENTUlNhdmUuYmVnaW4oKSwKKyAgICAgICAgIEJFID0gQ1NSU2F2ZS5lbmQoKTsgQkkgIT0gQkU7ICsrQkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogTUJCID0gQkktPmZpcnN0OworICAgIENTUmVnU2V0IHNhdmUgPSBCSS0+c2Vjb25kOworCisgICAgaWYgKHNhdmUuZW1wdHkoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgYmxvY2tDU0kuY2xlYXIoKTsKKyAgICBmb3IgKENTUmVnU2V0OjppdGVyYXRvciBSSSA9IHNhdmUuYmVnaW4oKSwKKyAgICAgICAgICAgUkUgPSBzYXZlLmVuZCgpOyBSSSAhPSBSRTsgKytSSSkgeworICAgICAgYmxvY2tDU0kucHVzaF9iYWNrKENTSVsqUkldKTsKKyAgICB9CisgICAgYXNzZXJ0KGJsb2NrQ1NJLnNpemUoKSA+IDAgJiYKKyAgICAgICAgICAgIkNvdWxkIG5vdCBjb2xsZWN0IGNhbGxlZSBzYXZlZCByZWdpc3RlciBpbmZvIik7CisKKyAgICBJID0gTUJCLT5iZWdpbigpOworCisgICAgLy8gV2hlbiBzaHJpbmsgd3JhcHBpbmcsIHVzZSBzdGFjayBzbG90IHN0b3Jlcy9sb2Fkcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gYmxvY2tDU0kuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgLy8gQWRkIHRoZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIgYXMgbGl2ZS1pbi4KKyAgICAgIC8vIEl0J3Mga2lsbGVkIGF0IHRoZSBzcGlsbC4KKyAgICAgIE1CQi0+YWRkTGl2ZUluKGJsb2NrQ1NJW2ldLmdldFJlZygpKTsKKworICAgICAgLy8gSW5zZXJ0IHRoZSBzcGlsbCB0byB0aGUgc3RhY2sgZnJhbWUuCisgICAgICB1bnNpZ25lZCBSZWcgPSBibG9ja0NTSVtpXS5nZXRSZWcoKTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gVFJJLT5nZXRNaW5pbWFsUGh5c1JlZ0NsYXNzKFJlZyk7CisgICAgICBUSUkuc3RvcmVSZWdUb1N0YWNrU2xvdCgqTUJCLCBJLCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tDU0lbaV0uZ2V0RnJhbWVJZHgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDLCBUUkkpOworICAgIH0KKyAgfQorCisgIGZvciAoQ1NSZWdCbG9ja01hcDo6aXRlcmF0b3IgQkkgPSBDU1JSZXN0b3JlLmJlZ2luKCksCisgICAgICAgICBCRSA9IENTUlJlc3RvcmUuZW5kKCk7IEJJICE9IEJFOyArK0JJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiA9IEJJLT5maXJzdDsKKyAgICBDU1JlZ1NldCByZXN0b3JlID0gQkktPnNlY29uZDsKKworICAgIGlmIChyZXN0b3JlLmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKworICAgIGJsb2NrQ1NJLmNsZWFyKCk7CisgICAgZm9yIChDU1JlZ1NldDo6aXRlcmF0b3IgUkkgPSByZXN0b3JlLmJlZ2luKCksCisgICAgICAgICAgIFJFID0gcmVzdG9yZS5lbmQoKTsgUkkgIT0gUkU7ICsrUkkpIHsKKyAgICAgIGJsb2NrQ1NJLnB1c2hfYmFjayhDU0lbKlJJXSk7CisgICAgfQorICAgIGFzc2VydChibG9ja0NTSS5zaXplKCkgPiAwICYmCisgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgaW5mbyIpOworCisgICAgLy8gSWYgTUJCIGlzIGVtcHR5IGFuZCBuZWVkcyByZXN0b3JlcywgaW5zZXJ0IGF0IHRoZSBfYmVnaW5uaW5nXy4KKyAgICBpZiAoTUJCLT5lbXB0eSgpKSB7CisgICAgICBJID0gTUJCLT5iZWdpbigpOworICAgIH0gZWxzZSB7CisgICAgICBJID0gTUJCLT5lbmQoKTsKKyAgICAgIC0tSTsKKworICAgICAgLy8gU2tpcCBvdmVyIGFsbCB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucywgd2hpY2ggYXJlIHBhcnQgb2YgdGhlCisgICAgICAvLyByZXR1cm4gc2VxdWVuY2UuCisgICAgICBpZiAoISBJLT5nZXREZXNjKCkuaXNUZXJtaW5hdG9yKCkpIHsKKyAgICAgICAgKytJOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkyID0gSTsKKyAgICAgICAgd2hpbGUgKEkyICE9IE1CQi0+YmVnaW4oKSAmJiAoLS1JMiktPmdldERlc2MoKS5pc1Rlcm1pbmF0b3IoKSkKKyAgICAgICAgICBJID0gSTI7CisgICAgICB9CisgICAgfQorCisgICAgYm9vbCBBdFN0YXJ0ID0gSSA9PSBNQkItPmJlZ2luKCk7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJlZm9yZUkgPSBJOworICAgIGlmICghQXRTdGFydCkKKyAgICAgIC0tQmVmb3JlSTsKKworICAgIC8vIFJlc3RvcmUgYWxsIHJlZ2lzdGVycyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHJldHVybiBhbmQgYW55CisgICAgLy8gdGVybWluYXRvcnMgdGhhdCBwcmVjZWVkIGl0LgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBibG9ja0NTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSBibG9ja0NTSVtpXS5nZXRSZWcoKTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gVFJJLT5nZXRNaW5pbWFsUGh5c1JlZ0NsYXNzKFJlZyk7CisgICAgICBUSUkubG9hZFJlZ0Zyb21TdGFja1Nsb3QoKk1CQiwgSSwgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrQ1NJW2ldLmdldEZyYW1lSWR4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkMsIFRSSSk7CisgICAgICBhc3NlcnQoSSAhPSBNQkItPmJlZ2luKCkgJiYKKyAgICAgICAgICAgICAibG9hZFJlZ0Zyb21TdGFja1Nsb3QgZGlkbid0IGluc2VydCBhbnkgY29kZSEiKTsKKyAgICAgIC8vIEluc2VydCBpbiByZXZlcnNlIG9yZGVyLiAgbG9hZFJlZ0Zyb21TdGFja1Nsb3QgY2FuIGluc2VydAorICAgICAgLy8gbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zLgorICAgICAgaWYgKEF0U3RhcnQpCisgICAgICAgIEkgPSBNQkItPmJlZ2luKCk7CisgICAgICBlbHNlIHsKKyAgICAgICAgSSA9IEJlZm9yZUk7CisgICAgICAgICsrSTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8vIEFkanVzdFN0YWNrT2Zmc2V0IC0gSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gYWRqdXN0IHRoZSBzdGFjayBmcmFtZSBvZmZzZXQuCitzdGF0aWMgaW5saW5lIHZvaWQKK0FkanVzdFN0YWNrT2Zmc2V0KE1hY2hpbmVGcmFtZUluZm8gKk1GSSwgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgYm9vbCBTdGFja0dyb3dzRG93biwgaW50NjRfdCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk1heEFsaWduKSB7CisgIC8vIElmIHRoZSBzdGFjayBncm93cyBkb3duLCBhZGQgdGhlIG9iamVjdCBzaXplIHRvIGZpbmQgdGhlIGxvd2VzdCBhZGRyZXNzLgorICBpZiAoU3RhY2tHcm93c0Rvd24pCisgICAgT2Zmc2V0ICs9IE1GSS0+Z2V0T2JqZWN0U2l6ZShGcmFtZUlkeCk7CisKKyAgdW5zaWduZWQgQWxpZ24gPSBNRkktPmdldE9iamVjdEFsaWdubWVudChGcmFtZUlkeCk7CisKKyAgLy8gSWYgdGhlIGFsaWdubWVudCBvZiB0aGlzIG9iamVjdCBpcyBncmVhdGVyIHRoYW4gdGhhdCBvZiB0aGUgc3RhY2ssIHRoZW4KKyAgLy8gaW5jcmVhc2UgdGhlIHN0YWNrIGFsaWdubWVudCB0byBtYXRjaC4KKyAgTWF4QWxpZ24gPSBzdGQ6Om1heChNYXhBbGlnbiwgQWxpZ24pOworCisgIC8vIEFkanVzdCB0byBhbGlnbm1lbnQgYm91bmRhcnkuCisgIE9mZnNldCA9IChPZmZzZXQgKyBBbGlnbiAtIDEpIC8gQWxpZ24gKiBBbGlnbjsKKworICBpZiAoU3RhY2tHcm93c0Rvd24pIHsKKyAgICBNRkktPnNldE9iamVjdE9mZnNldChGcmFtZUlkeCwgLU9mZnNldCk7IC8vIFNldCB0aGUgY29tcHV0ZWQgb2Zmc2V0CisgIH0gZWxzZSB7CisgICAgTUZJLT5zZXRPYmplY3RPZmZzZXQoRnJhbWVJZHgsIE9mZnNldCk7CisgICAgT2Zmc2V0ICs9IE1GSS0+Z2V0T2JqZWN0U2l6ZShGcmFtZUlkeCk7CisgIH0KK30KKworLy8vIGNhbGN1bGF0ZUZyYW1lT2JqZWN0T2Zmc2V0cyAtIENhbGN1bGF0ZSBhY3R1YWwgZnJhbWUgb2Zmc2V0cyBmb3IgYWxsIG9mIHRoZQorLy8vIGFic3RyYWN0IHN0YWNrIG9iamVjdHMuCisvLy8KK3ZvaWQgUEVJOjpjYWxjdWxhdGVGcmFtZU9iamVjdE9mZnNldHMoTWFjaGluZUZ1bmN0aW9uICZGbikgeworICBjb25zdCBUYXJnZXRGcmFtZUluZm8gJlRGSSA9ICpGbi5nZXRUYXJnZXQoKS5nZXRGcmFtZUluZm8oKTsKKworICBib29sIFN0YWNrR3Jvd3NEb3duID0KKyAgICBURkkuZ2V0U3RhY2tHcm93dGhEaXJlY3Rpb24oKSA9PSBUYXJnZXRGcmFtZUluZm86OlN0YWNrR3Jvd3NEb3duOworCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIHN0YWNrIG9iamVjdHMsIGFzc2lnbmluZyBzZXF1ZW50aWFsIGFkZHJlc3Nlcy4uLgorICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBGbi5nZXRGcmFtZUluZm8oKTsKKworICAvLyBTdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb2NhbCBhcmVhLgorICAvLyBUaGUgT2Zmc2V0IGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBzdGFjayB0b3AgaW4gdGhlIGRpcmVjdGlvbgorICAvLyBvZiBzdGFjayBncm93dGggLS0gc28gaXQncyBhbHdheXMgbm9ubmVnYXRpdmUuCisgIGludCBMb2NhbEFyZWFPZmZzZXQgPSBURkkuZ2V0T2Zmc2V0T2ZMb2NhbEFyZWEoKTsKKyAgaWYgKFN0YWNrR3Jvd3NEb3duKQorICAgIExvY2FsQXJlYU9mZnNldCA9IC1Mb2NhbEFyZWFPZmZzZXQ7CisgIGFzc2VydChMb2NhbEFyZWFPZmZzZXQgPj0gMAorICAgICAgICAgJiYgIkxvY2FsIGFyZWEgb2Zmc2V0IHNob3VsZCBiZSBpbiBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIik7CisgIGludDY0X3QgT2Zmc2V0ID0gTG9jYWxBcmVhT2Zmc2V0OworCisgIC8vIElmIHRoZXJlIGFyZSBmaXhlZCBzaXplZCBvYmplY3RzIHRoYXQgYXJlIHByZWFsbG9jYXRlZCBpbiB0aGUgbG9jYWwgYXJlYSwKKyAgLy8gbm9uLWZpeGVkIG9iamVjdHMgY2FuJ3QgYmUgYWxsb2NhdGVkIHJpZ2h0IGF0IHRoZSBzdGFydCBvZiBsb2NhbCBhcmVhLgorICAvLyBXZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBmaWxsaW5nIGluIGhvbGVzIGluIGJldHdlZW4gZml4ZWQgc2l6ZWQKKyAgLy8gb2JqZWN0cywgc28gd2UgYWRqdXN0ICdPZmZzZXQnIHRvIHBvaW50IHRvIHRoZSBlbmQgb2YgbGFzdCBmaXhlZCBzaXplZAorICAvLyBwcmVhbGxvY2F0ZWQgb2JqZWN0LgorICBmb3IgKGludCBpID0gTUZJLT5nZXRPYmplY3RJbmRleEJlZ2luKCk7IGkgIT0gMDsgKytpKSB7CisgICAgaW50NjRfdCBGaXhlZE9mZjsKKyAgICBpZiAoU3RhY2tHcm93c0Rvd24pIHsKKyAgICAgIC8vIFRoZSBtYXhpbXVtIGRpc3RhbmNlIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIgaXMgYXQgbG93ZXIgYWRkcmVzcyBvZgorICAgICAgLy8gdGhlIG9iamVjdCAtLSB3aGljaCBpcyBnaXZlbiBieSBvZmZzZXQuIEZvciBkb3duIGdyb3dpbmcgc3RhY2sKKyAgICAgIC8vIHRoZSBvZmZzZXQgaXMgbmVnYXRpdmUsIHNvIHdlIG5lZ2F0ZSB0aGUgb2Zmc2V0IHRvIGdldCB0aGUgZGlzdGFuY2UuCisgICAgICBGaXhlZE9mZiA9IC1NRkktPmdldE9iamVjdE9mZnNldChpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhlIG1heGltdW0gZGlzdGFuY2UgZnJvbSB0aGUgc3RhcnQgcG9pbnRlciBpcyBhdCB0aGUgdXBwZXIKKyAgICAgIC8vIGFkZHJlc3Mgb2YgdGhlIG9iamVjdC4KKyAgICAgIEZpeGVkT2ZmID0gTUZJLT5nZXRPYmplY3RPZmZzZXQoaSkgKyBNRkktPmdldE9iamVjdFNpemUoaSk7CisgICAgfQorICAgIGlmIChGaXhlZE9mZiA+IE9mZnNldCkgT2Zmc2V0ID0gRml4ZWRPZmY7CisgIH0KKworICAvLyBGaXJzdCBhc3NpZ24gZnJhbWUgb2Zmc2V0cyB0byBzdGFjayBvYmplY3RzIHRoYXQgYXJlIHVzZWQgdG8gc3BpbGwKKyAgLy8gY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4KKyAgaWYgKFN0YWNrR3Jvd3NEb3duKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gTWluQ1NGcmFtZUluZGV4OyBpIDw9IE1heENTRnJhbWVJbmRleDsgKytpKSB7CisgICAgICAvLyBJZiB0aGUgc3RhY2sgZ3Jvd3MgZG93biwgd2UgbmVlZCB0byBhZGQgdGhlIHNpemUgdG8gZmluZCB0aGUgbG93ZXN0CisgICAgICAvLyBhZGRyZXNzIG9mIHRoZSBvYmplY3QuCisgICAgICBPZmZzZXQgKz0gTUZJLT5nZXRPYmplY3RTaXplKGkpOworCisgICAgICB1bnNpZ25lZCBBbGlnbiA9IE1GSS0+Z2V0T2JqZWN0QWxpZ25tZW50KGkpOworICAgICAgLy8gQWRqdXN0IHRvIGFsaWdubWVudCBib3VuZGFyeQorICAgICAgT2Zmc2V0ID0gKE9mZnNldCtBbGlnbi0xKS9BbGlnbipBbGlnbjsKKworICAgICAgTUZJLT5zZXRPYmplY3RPZmZzZXQoaSwgLU9mZnNldCk7ICAgICAgICAvLyBTZXQgdGhlIGNvbXB1dGVkIG9mZnNldAorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgTWF4Q1NGSSA9IE1heENTRnJhbWVJbmRleCwgTWluQ1NGSSA9IE1pbkNTRnJhbWVJbmRleDsKKyAgICBmb3IgKGludCBpID0gTWF4Q1NGSTsgaSA+PSBNaW5DU0ZJIDsgLS1pKSB7CisgICAgICB1bnNpZ25lZCBBbGlnbiA9IE1GSS0+Z2V0T2JqZWN0QWxpZ25tZW50KGkpOworICAgICAgLy8gQWRqdXN0IHRvIGFsaWdubWVudCBib3VuZGFyeQorICAgICAgT2Zmc2V0ID0gKE9mZnNldCtBbGlnbi0xKS9BbGlnbipBbGlnbjsKKworICAgICAgTUZJLT5zZXRPYmplY3RPZmZzZXQoaSwgT2Zmc2V0KTsKKyAgICAgIE9mZnNldCArPSBNRkktPmdldE9iamVjdFNpemUoaSk7CisgICAgfQorICB9CisKKyAgdW5zaWduZWQgTWF4QWxpZ24gPSBNRkktPmdldE1heEFsaWdubWVudCgpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgc3BlY2lhbCByZWdpc3RlciBzY2F2ZW5naW5nIHNwaWxsIHNsb3QgaXMgY2xvc2VzdCB0byB0aGUKKyAgLy8gZnJhbWUgcG9pbnRlciBpZiBhIGZyYW1lIHBvaW50ZXIgaXMgcmVxdWlyZWQuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUmVnSW5mbyA9IEZuLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICBpZiAoUlMgJiYgUmVnSW5mby0+aGFzRlAoRm4pICYmICFSZWdJbmZvLT5uZWVkc1N0YWNrUmVhbGlnbm1lbnQoRm4pKSB7CisgICAgaW50IFNGSSA9IFJTLT5nZXRTY2F2ZW5naW5nRnJhbWVJbmRleCgpOworICAgIGlmIChTRkkgPj0gMCkKKyAgICAgIEFkanVzdFN0YWNrT2Zmc2V0KE1GSSwgU0ZJLCBTdGFja0dyb3dzRG93biwgT2Zmc2V0LCBNYXhBbGlnbik7CisgIH0KKworICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgc3RhY2sgcHJvdGVjdG9yIGNvbWVzIGJlZm9yZSB0aGUgbG9jYWwgdmFyaWFibGVzIG9uIHRoZQorICAvLyBzdGFjay4KKyAgU21hbGxTZXQ8aW50LCAxNj4gTGFyZ2VTdGFja09ianM7CisgIGlmIChNRkktPmdldFN0YWNrUHJvdGVjdG9ySW5kZXgoKSA+PSAwKSB7CisgICAgQWRqdXN0U3RhY2tPZmZzZXQoTUZJLCBNRkktPmdldFN0YWNrUHJvdGVjdG9ySW5kZXgoKSwgU3RhY2tHcm93c0Rvd24sCisgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LCBNYXhBbGlnbik7CisKKyAgICAvLyBBc3NpZ24gbGFyZ2Ugc3RhY2sgb2JqZWN0cyBmaXJzdC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUZJLT5nZXRPYmplY3RJbmRleEVuZCgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKGkgPj0gTWluQ1NGcmFtZUluZGV4ICYmIGkgPD0gTWF4Q1NGcmFtZUluZGV4KQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChSUyAmJiAoaW50KWkgPT0gUlMtPmdldFNjYXZlbmdpbmdGcmFtZUluZGV4KCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKE1GSS0+aXNEZWFkT2JqZWN0SW5kZXgoaSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKE1GSS0+Z2V0U3RhY2tQcm90ZWN0b3JJbmRleCgpID09IChpbnQpaSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoIU1GSS0+TWF5TmVlZFN0YWNrUHJvdGVjdG9yKGkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgQWRqdXN0U3RhY2tPZmZzZXQoTUZJLCBpLCBTdGFja0dyb3dzRG93biwgT2Zmc2V0LCBNYXhBbGlnbik7CisgICAgICBMYXJnZVN0YWNrT2Jqcy5pbnNlcnQoaSk7CisgICAgfQorICB9CisKKyAgLy8gVGhlbiBhc3NpZ24gZnJhbWUgb2Zmc2V0cyB0byBzdGFjayBvYmplY3RzIHRoYXQgYXJlIG5vdCB1c2VkIHRvIHNwaWxsCisgIC8vIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNRkktPmdldE9iamVjdEluZGV4RW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKGkgPj0gTWluQ1NGcmFtZUluZGV4ICYmIGkgPD0gTWF4Q1NGcmFtZUluZGV4KQorICAgICAgY29udGludWU7CisgICAgaWYgKFJTICYmIChpbnQpaSA9PSBSUy0+Z2V0U2NhdmVuZ2luZ0ZyYW1lSW5kZXgoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChNRkktPmlzRGVhZE9iamVjdEluZGV4KGkpKQorICAgICAgY29udGludWU7CisgICAgaWYgKE1GSS0+Z2V0U3RhY2tQcm90ZWN0b3JJbmRleCgpID09IChpbnQpaSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChMYXJnZVN0YWNrT2Jqcy5jb3VudChpKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgQWRqdXN0U3RhY2tPZmZzZXQoTUZJLCBpLCBTdGFja0dyb3dzRG93biwgT2Zmc2V0LCBNYXhBbGlnbik7CisgIH0KKworICAvLyBNYWtlIHN1cmUgdGhlIHNwZWNpYWwgcmVnaXN0ZXIgc2NhdmVuZ2luZyBzcGlsbCBzbG90IGlzIGNsb3Nlc3QgdG8gdGhlCisgIC8vIHN0YWNrIHBvaW50ZXIuCisgIGlmIChSUyAmJiAoIVJlZ0luZm8tPmhhc0ZQKEZuKSB8fCBSZWdJbmZvLT5uZWVkc1N0YWNrUmVhbGlnbm1lbnQoRm4pKSkgeworICAgIGludCBTRkkgPSBSUy0+Z2V0U2NhdmVuZ2luZ0ZyYW1lSW5kZXgoKTsKKyAgICBpZiAoU0ZJID49IDApCisgICAgICBBZGp1c3RTdGFja09mZnNldChNRkksIFNGSSwgU3RhY2tHcm93c0Rvd24sIE9mZnNldCwgTWF4QWxpZ24pOworICB9CisKKyAgaWYgKCFSZWdJbmZvLT50YXJnZXRIYW5kbGVzU3RhY2tGcmFtZVJvdW5kaW5nKCkpIHsKKyAgICAvLyBJZiB3ZSBoYXZlIHJlc2VydmVkIGFyZ3VtZW50IHNwYWNlIGZvciBjYWxsIHNpdGVzIGluIHRoZSBmdW5jdGlvbgorICAgIC8vIGltbWVkaWF0ZWx5IG9uIGVudHJ5IHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCBjb3VudCBpdCBhcyBwYXJ0IG9mIHRoZQorICAgIC8vIG92ZXJhbGwgc3RhY2sgc2l6ZS4KKyAgICBpZiAoTUZJLT5hZGp1c3RzU3RhY2soKSAmJiBSZWdJbmZvLT5oYXNSZXNlcnZlZENhbGxGcmFtZShGbikpCisgICAgICBPZmZzZXQgKz0gTUZJLT5nZXRNYXhDYWxsRnJhbWVTaXplKCk7CisKKyAgICAvLyBSb3VuZCB1cCB0aGUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQuICBJZiB0aGUgZnVuY3Rpb24gaGFzCisgICAgLy8gYW55IGNhbGxzIG9yIGFsbG9jYSdzLCBhbGlnbiB0byB0aGUgdGFyZ2V0J3MgU3RhY2tBbGlnbm1lbnQgdmFsdWUgdG8KKyAgICAvLyBlbnN1cmUgdGhhdCB0aGUgY2FsbGVlJ3MgZnJhbWUgb3IgdGhlIGFsbG9jYSBkYXRhIGlzIHN1aXRhYmx5IGFsaWduZWQ7CisgICAgLy8gb3RoZXJ3aXNlLCBmb3IgbGVhZiBmdW5jdGlvbnMsIGFsaWduIHRvIHRoZSBUcmFuc2llbnRTdGFja0FsaWdubWVudAorICAgIC8vIHZhbHVlLgorICAgIHVuc2lnbmVkIFN0YWNrQWxpZ247CisgICAgaWYgKE1GSS0+YWRqdXN0c1N0YWNrKCkgfHwgTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKSB8fAorICAgICAgICAoUmVnSW5mby0+bmVlZHNTdGFja1JlYWxpZ25tZW50KEZuKSAmJiBNRkktPmdldE9iamVjdEluZGV4RW5kKCkgIT0gMCkpCisgICAgICBTdGFja0FsaWduID0gVEZJLmdldFN0YWNrQWxpZ25tZW50KCk7CisgICAgZWxzZQorICAgICAgU3RhY2tBbGlnbiA9IFRGSS5nZXRUcmFuc2llbnRTdGFja0FsaWdubWVudCgpOworCisgICAgLy8gSWYgdGhlIGZyYW1lIHBvaW50ZXIgaXMgZWxpbWluYXRlZCwgYWxsIGZyYW1lIG9mZnNldHMgd2lsbCBiZSByZWxhdGl2ZSB0bworICAgIC8vIFNQIG5vdCBGUC4gQWxpZ24gdG8gTWF4QWxpZ24gc28gdGhpcyB3b3Jrcy4KKyAgICBTdGFja0FsaWduID0gc3RkOjptYXgoU3RhY2tBbGlnbiwgTWF4QWxpZ24pOworICAgIHVuc2lnbmVkIEFsaWduTWFzayA9IFN0YWNrQWxpZ24gLSAxOworICAgIE9mZnNldCA9IChPZmZzZXQgKyBBbGlnbk1hc2spICYgfnVpbnQ2NF90KEFsaWduTWFzayk7CisgIH0KKworICAvLyBVcGRhdGUgZnJhbWUgaW5mbyB0byBwcmV0ZW5kIHRoYXQgdGhpcyBpcyBwYXJ0IG9mIHRoZSBzdGFjay4uLgorICBNRkktPnNldFN0YWNrU2l6ZShPZmZzZXQgLSBMb2NhbEFyZWFPZmZzZXQpOworfQorCisvLy8gaW5zZXJ0UHJvbG9nRXBpbG9nQ29kZSAtIFNjYW4gdGhlIGZ1bmN0aW9uIGZvciBtb2RpZmllZCBjYWxsZWUgc2F2ZWQKKy8vLyByZWdpc3RlcnMsIGluc2VydCBzcGlsbCBjb2RlIGZvciB0aGVzZSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLCB0aGVuIGFkZAorLy8vIHByb2xvZyBhbmQgZXBpbG9nIGNvZGUgdG8gdGhlIGZ1bmN0aW9uLgorLy8vCit2b2lkIFBFSTo6aW5zZXJ0UHJvbG9nRXBpbG9nQ29kZShNYWNoaW5lRnVuY3Rpb24gJkZuKSB7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gRm4uZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisKKyAgLy8gQWRkIHByb2xvZ3VlIHRvIHRoZSBmdW5jdGlvbi4uLgorICBUUkktPmVtaXRQcm9sb2d1ZShGbik7CisKKyAgLy8gQWRkIGVwaWxvZ3VlIHRvIHJlc3RvcmUgdGhlIGNhbGxlZS1zYXZlIHJlZ2lzdGVycyBpbiBlYWNoIGV4aXRpbmcgYmxvY2sKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBGbi5iZWdpbigpLCBFID0gRm4uZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgLy8gSWYgbGFzdCBpbnN0cnVjdGlvbiBpcyBhIHJldHVybiBpbnN0cnVjdGlvbiwgYWRkIGFuIGVwaWxvZ3VlCisgICAgaWYgKCFJLT5lbXB0eSgpICYmIEktPmJhY2soKS5nZXREZXNjKCkuaXNSZXR1cm4oKSkKKyAgICAgIFRSSS0+ZW1pdEVwaWxvZ3VlKEZuLCAqSSk7CisgIH0KK30KKworLy8vIHJlcGxhY2VGcmFtZUluZGljZXMgLSBSZXBsYWNlIGFsbCBNT19GcmFtZUluZGV4IG9wZXJhbmRzIHdpdGggcGh5c2ljYWwKKy8vLyByZWdpc3RlciByZWZlcmVuY2VzIGFuZCBhY3R1YWwgb2Zmc2V0cy4KKy8vLwordm9pZCBQRUk6OnJlcGxhY2VGcmFtZUluZGljZXMoTWFjaGluZUZ1bmN0aW9uICZGbikgeworICBpZiAoIUZuLmdldEZyYW1lSW5mbygpLT5oYXNTdGFja09iamVjdHMoKSkgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGRvPworCisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gRm4uZ2V0VGFyZ2V0KCk7CisgIGFzc2VydChUTS5nZXRSZWdpc3RlckluZm8oKSAmJiAiVE06OmdldFJlZ2lzdGVySW5mbygpIG11c3QgYmUgaW1wbGVtZW50ZWQhIik7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJID0gKlRNLmdldFJlZ2lzdGVySW5mbygpOworICBjb25zdCBUYXJnZXRGcmFtZUluZm8gKlRGSSA9IFRNLmdldEZyYW1lSW5mbygpOworICBib29sIFN0YWNrR3Jvd3NEb3duID0KKyAgICBURkktPmdldFN0YWNrR3Jvd3RoRGlyZWN0aW9uKCkgPT0gVGFyZ2V0RnJhbWVJbmZvOjpTdGFja0dyb3dzRG93bjsKKyAgaW50IEZyYW1lU2V0dXBPcGNvZGUgICA9IFRSSS5nZXRDYWxsRnJhbWVTZXR1cE9wY29kZSgpOworICBpbnQgRnJhbWVEZXN0cm95T3Bjb2RlID0gVFJJLmdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKTsKKworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGbi5iZWdpbigpLAorICAgICAgICAgRSA9IEZuLmVuZCgpOyBCQiAhPSBFOyArK0JCKSB7CisjaWZuZGVmIE5ERUJVRworICAgIGludCBTUEFkakNvdW50ID0gMDsgLy8gZnJhbWUgc2V0dXAgLyBkZXN0cm95IGNvdW50LgorI2VuZGlmCisgICAgaW50IFNQQWRqID0gMDsgIC8vIFNQIG9mZnNldCBkdWUgdG8gY2FsbCBmcmFtZSBzZXR1cCAvIGRlc3Ryb3kuCisgICAgaWYgKFJTICYmICFGcmFtZUluZGV4VmlydHVhbFNjYXZlbmdpbmcpIFJTLT5lbnRlckJhc2ljQmxvY2soQkIpOworCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpOyBJICE9IEJCLT5lbmQoKTsgKSB7CisKKyAgICAgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBGcmFtZVNldHVwT3Bjb2RlIHx8CisgICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gRnJhbWVEZXN0cm95T3Bjb2RlKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAvLyBUcmFjayB3aGV0aGVyIHdlIHNlZSBldmVuIHBhaXJzIG9mIHRoZW0KKyAgICAgICAgU1BBZGpDb3VudCArPSBJLT5nZXRPcGNvZGUoKSA9PSBGcmFtZVNldHVwT3Bjb2RlID8gMSA6IC0xOworI2VuZGlmCisgICAgICAgIC8vIFJlbWVtYmVyIGhvdyBtdWNoIFNQIGhhcyBiZWVuIGFkanVzdGVkIHRvIGNyZWF0ZSB0aGUgY2FsbAorICAgICAgICAvLyBmcmFtZS4KKyAgICAgICAgaW50IFNpemUgPSBJLT5nZXRPcGVyYW5kKDApLmdldEltbSgpOworCisgICAgICAgIGlmICgoIVN0YWNrR3Jvd3NEb3duICYmIEktPmdldE9wY29kZSgpID09IEZyYW1lU2V0dXBPcGNvZGUpIHx8CisgICAgICAgICAgICAoU3RhY2tHcm93c0Rvd24gJiYgSS0+Z2V0T3Bjb2RlKCkgPT0gRnJhbWVEZXN0cm95T3Bjb2RlKSkKKyAgICAgICAgICBTaXplID0gLVNpemU7CisKKyAgICAgICAgU1BBZGogKz0gU2l6ZTsKKworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUHJldkkgPSBCQi0+ZW5kKCk7CisgICAgICAgIGlmIChJICE9IEJCLT5iZWdpbigpKSBQcmV2SSA9IHByaW9yKEkpOworICAgICAgICBUUkkuZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoRm4sICpCQiwgSSk7CisKKyAgICAgICAgLy8gVmlzaXQgdGhlIGluc3RydWN0aW9ucyBjcmVhdGVkIGJ5IGVsaW1pbmF0ZUNhbGxGcmFtZVBzZXVkb0luc3RyKCkuCisgICAgICAgIGlmIChQcmV2SSA9PSBCQi0+ZW5kKCkpCisgICAgICAgICAgSSA9IEJCLT5iZWdpbigpOyAgICAgLy8gVGhlIHJlcGxhY2VkIGluc3RyIHdhcyB0aGUgZmlyc3QgaW4gdGhlIGJsb2NrLgorICAgICAgICBlbHNlCisgICAgICAgICAgSSA9IGxsdm06Om5leHQoUHJldkkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgTWFjaGluZUluc3RyICpNSSA9IEk7CisgICAgICBib29sIERvSW5jciA9IHRydWU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoTUktPmdldE9wZXJhbmQoaSkuaXNGSSgpKSB7CisgICAgICAgICAgLy8gU29tZSBpbnN0cnVjdGlvbnMgKGUuZy4gaW5saW5lIGFzbSBpbnN0cnVjdGlvbnMpIGNhbiBoYXZlCisgICAgICAgICAgLy8gbXVsdGlwbGUgZnJhbWUgaW5kaWNlcyBhbmQvb3IgY2F1c2UgZWxpbWluYXRlRnJhbWVJbmRleAorICAgICAgICAgIC8vIHRvIGluc2VydCBtb3JlIHRoYW4gb25lIGluc3RydWN0aW9uLiBXZSBuZWVkIHRoZSByZWdpc3RlcgorICAgICAgICAgIC8vIHNjYXZlbmdlciB0byBnbyB0aHJvdWdoIGFsbCBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgc28gdGhhdAorICAgICAgICAgIC8vIGl0IGNhbiB1cGRhdGUgaXRzIHJlZ2lzdGVyIGluZm9ybWF0aW9uLiBXZSBrZWVwIHRoZQorICAgICAgICAgIC8vIGl0ZXJhdG9yIGF0IHRoZSBwb2ludCBiZWZvcmUgaW5zZXJ0aW9uIHNvIHRoYXQgd2UgY2FuCisgICAgICAgICAgLy8gcmV2aXNpdCB0aGVtIGluIGZ1bGwuCisgICAgICAgICAgYm9vbCBBdEJlZ2lubmluZyA9IChJID09IEJCLT5iZWdpbigpKTsKKyAgICAgICAgICBpZiAoIUF0QmVnaW5uaW5nKSAtLUk7CisKKyAgICAgICAgICAvLyBJZiB0aGlzIGluc3RydWN0aW9uIGhhcyBhIEZyYW1lSW5kZXggb3BlcmFuZCwgd2UgbmVlZCB0bworICAgICAgICAgIC8vIHVzZSB0aGF0IHRhcmdldCBtYWNoaW5lIHJlZ2lzdGVyIGluZm8gb2JqZWN0IHRvIGVsaW1pbmF0ZQorICAgICAgICAgIC8vIGl0LgorICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6RnJhbWVJbmRleFZhbHVlIFZhbHVlOworICAgICAgICAgIHVuc2lnbmVkIFZSZWcgPQorICAgICAgICAgICAgVFJJLmVsaW1pbmF0ZUZyYW1lSW5kZXgoTUksIFNQQWRqLCAmVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUluZGV4VmlydHVhbFNjYXZlbmdpbmcgPyAgTlVMTCA6IFJTKTsKKyAgICAgICAgICBpZiAoVlJlZykgeworICAgICAgICAgICAgYXNzZXJ0IChGcmFtZUluZGV4VmlydHVhbFNjYXZlbmdpbmcgJiYKKyAgICAgICAgICAgICAgICAgICAgIk5vdCBzY2F2ZW5naW5nLCBidXQgdmlydHVhbCByZXR1cm5lZCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgImVsaW1pbmF0ZUZyYW1lSW5kZXgoKSEiKTsKKyAgICAgICAgICAgIEZyYW1lQ29uc3RhbnRSZWdNYXBbVlJlZ10gPSBGcmFtZUNvbnN0YW50RW50cnkoVmFsdWUsIFNQQWRqKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBSZXNldCB0aGUgaXRlcmF0b3IgaWYgd2Ugd2VyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBCQi4KKyAgICAgICAgICBpZiAoQXRCZWdpbm5pbmcpIHsKKyAgICAgICAgICAgIEkgPSBCQi0+YmVnaW4oKTsKKyAgICAgICAgICAgIERvSW5jciA9IGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIE1JID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBpZiAoRG9JbmNyICYmIEkgIT0gQkItPmVuZCgpKSArK0k7CisKKyAgICAgIC8vIFVwZGF0ZSByZWdpc3RlciBzdGF0ZXMuCisgICAgICBpZiAoUlMgJiYgIUZyYW1lSW5kZXhWaXJ0dWFsU2NhdmVuZ2luZyAmJiBNSSkgUlMtPmZvcndhcmQoTUkpOworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgZXZlbmx5IG1hdGNoZWQgcGFpcnMgb2YgZnJhbWUgc2V0dXAgLyBkZXN0cm95IGluc3RydWN0aW9ucywKKyAgICAvLyBtYWtlIHN1cmUgdGhlIGFkanVzdG1lbnRzIGNvbWUgb3V0IHRvIHplcm8uIElmIHdlIGRvbid0IGhhdmUgbWF0Y2hlZAorICAgIC8vIHBhaXJzLCB3ZSBjYW4ndCBiZSBzdXJlIHRoZSBtaXNzaW5nIGJpdCBpc24ndCBpbiBhbm90aGVyIGJhc2ljIGJsb2NrCisgICAgLy8gZHVlIHRvIGEgY3VzdG9tIGluc2VydGVyIHBsYXlpbmcgdHJpY2tzLCBzbyBqdXN0IGFzc2VydGluZyBTUEFkaj09MAorICAgIC8vIGlzbid0IHN1ZmZpY2llbnQuIFNlZSB0TU9WQ0Mgb24gVGh1bWIxLCBmb3IgZXhhbXBsZS4KKyAgICBhc3NlcnQoKFNQQWRqQ291bnQgfHwgU1BBZGogPT0gMCkgJiYKKyAgICAgICAgICAgIlVuYmFsYW5jZWQgY2FsbCBmcmFtZSBzZXR1cCAvIGRlc3Ryb3kgcGFpcnM/Iik7CisgIH0KK30KKworLy8vIGZpbmRMYXN0VXNlUmVnIC0gZmluZCB0aGUga2lsbGluZyB1c2Ugb2YgdGhlIHNwZWNpZmllZCByZWdpc3RlciB3aXRoaW4KKy8vLyB0aGUgaW5zdHJ1Y2l0b24gcmFuZ2UuIFJldHVybiB0aGUgb3BlcmFuZCBudW1iZXIgb2YgdGhlIGtpbGwgaW4gT3BlcmFuZC4KK3N0YXRpYyBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IKK2ZpbmRMYXN0VXNlUmVnKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUUsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcpIHsKKyAgLy8gU2NhbiBmb3J3YXJkIHRvIGZpbmQgdGhlIGxhc3QgdXNlIG9mIHRoaXMgdmlydHVhbCByZWdpc3RlcgorICBmb3IgKCsrSTsgSSAhPSBNRTsgKytJKSB7CisgICAgTWFjaGluZUluc3RyICpNSSA9IEk7CisgICAgYm9vbCBpc0RlZkluc24gPSBmYWxzZTsKKyAgICBib29sIGlzS2lsbEluc24gPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKGkpLmlzUmVnKCkpIHsKKyAgICAgICAgdW5zaWduZWQgT3BSZWcgPSBNSS0+Z2V0T3BlcmFuZChpKS5nZXRSZWcoKTsKKyAgICAgICAgaWYgKE9wUmVnID09IDAgfHwgIVRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoT3BSZWcpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBhc3NlcnQgKE9wUmVnID09IFJlZworICAgICAgICAgICAgICAgICYmICJvdmVybGFwcGluZyB1c2Ugb2Ygc2NhdmVuZ2VkIGluZGV4IHJlZ2lzdGVyISIpOworICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBraWxsaW5nIHVzZSwgd2UgaGF2ZSBhIGNhbmRpZGF0ZS4KKyAgICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKGkpLmlzS2lsbCgpKQorICAgICAgICAgIGlzS2lsbEluc24gPSB0cnVlOworICAgICAgICBlbHNlIGlmIChNSS0+Z2V0T3BlcmFuZChpKS5pc0RlZigpKQorICAgICAgICAgIGlzRGVmSW5zbiA9IHRydWU7CisgICAgICB9CisgICAgaWYgKGlzS2lsbEluc24gJiYgIWlzRGVmSW5zbikKKyAgICAgIHJldHVybiBJOworICB9CisgIC8vIElmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBiYXNpYyBibG9jaywgdGhlcmUgd2FzIG5vIGtpbGwgb2YKKyAgLy8gdGhlIHZpcnR1YWwgcmVnaXN0ZXIsIHdoaWNoIGlzIHdyb25nLgorICBhc3NlcnQgKDAgJiYgInNjYXZlbmdlZCBpbmRleCByZWdpc3RlciBuZXZlciBraWxsZWQhIik7CisgIHJldHVybiBNRTsKK30KKworLy8vIHNjYXZlbmdlRnJhbWVWaXJ0dWFsUmVncyAtIFJlcGxhY2UgYWxsIGZyYW1lIGluZGV4IHZpcnR1YWwgcmVnaXN0ZXJzCisvLy8gd2l0aCBwaHlzaWNhbCByZWdpc3RlcnMuIFVzZSB0aGUgcmVnaXN0ZXIgc2NhdmVuZ2VyIHRvIGZpbmQgYW4KKy8vLyBhcHByb3ByaWF0ZSByZWdpc3RlciB0byB1c2UuCit2b2lkIFBFSTo6c2NhdmVuZ2VGcmFtZVZpcnR1YWxSZWdzKE1hY2hpbmVGdW5jdGlvbiAmRm4pIHsKKyAgLy8gUnVuIHRocm91Z2ggdGhlIGluc3RydWN0aW9ucyBhbmQgZmluZCBhbnkgdmlydHVhbCByZWdpc3RlcnMuCisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBCQiA9IEZuLmJlZ2luKCksCisgICAgICAgRSA9IEZuLmVuZCgpOyBCQiAhPSBFOyArK0JCKSB7CisgICAgUlMtPmVudGVyQmFzaWNCbG9jayhCQik7CisKKyAgICAvLyBGSVhNRTogVGhlIGxvZ2ljIGZsb3cgaW4gdGhpcyBmdW5jdGlvbiBpcyBzdGlsbCB0b28gY29udm9sdXRlZC4KKyAgICAvLyBJdCBuZWVkcyBhIGNsZWFudXAgcmVmYWN0b3JpbmcuIERvIHRoYXQgaW4gcHJlcGFyYXRpb24gZm9yIHRyYWNraW5nCisgICAgLy8gbW9yZSB0aGFuIG9uZSBzY3JhdGNoIHJlZ2lzdGVyIHZhbHVlIGFuZCB1c2luZyByYW5nZXMgdG8gZmluZAorICAgIC8vIGF2YWlsYWJsZSBzY3JhdGNoIHJlZ2lzdGVycy4KKyAgICB1bnNpZ25lZCBDdXJyZW50VmlydFJlZyA9IDA7CisgICAgdW5zaWduZWQgQ3VycmVudFNjcmF0Y2hSZWcgPSAwOworICAgIGJvb2wgaGF2ZVByZXZWYWx1ZSA9IGZhbHNlOworICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6RnJhbWVJbmRleFZhbHVlIFByZXZWYWx1ZSgwLDApOworICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6RnJhbWVJbmRleFZhbHVlIFZhbHVlKDAsMCk7CisgICAgTWFjaGluZUluc3RyICpQcmV2TGFzdFVzZU1JID0gTlVMTDsKKyAgICB1bnNpZ25lZCBQcmV2TGFzdFVzZU9wID0gMDsKKyAgICBib29sIHRyYWNraW5nQ3VycmVudFZhbHVlID0gZmFsc2U7CisgICAgaW50IFNQQWRqID0gMDsKKworICAgIC8vIFRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gbWF5IGNoYW5nZSBpbiB0aGUgbG9vcCwgc28gY2hlY2sgQkItPmVuZCgpCisgICAgLy8gZGlyZWN0bHkuCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpOyBJICE9IEJCLT5lbmQoKTsgKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gSTsKKyAgICAgIGJvb2wgaXNEZWZJbnNuID0gZmFsc2U7CisgICAgICBib29sIGlzS2lsbEluc24gPSBmYWxzZTsKKyAgICAgIGJvb2wgY2xvYmJlcnNTY3JhdGNoUmVnID0gZmFsc2U7CisgICAgICBib29sIERvSW5jciA9IHRydWU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIGlmIChNSS0+Z2V0T3BlcmFuZChpKS5pc1JlZygpKSB7CisgICAgICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICAgICAgaWYgKFJlZyA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgaWYgKCFUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZykpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBwcmV2aW91cyBzY3JhdGNoIHJlZywgY2hlY2sgYW5kIHNlZSBpZiBhbnl0aGluZworICAgICAgICAgICAgLy8gaGVyZSBraWxscyB3aGF0ZXZlciB2YWx1ZSBpcyBpbiB0aGVyZS4KKyAgICAgICAgICAgIGlmIChSZWcgPT0gQ3VycmVudFNjcmF0Y2hSZWcpIHsKKyAgICAgICAgICAgICAgaWYgKE1PLmlzVXNlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUd28tYWRkcmVzcyBvcGVyYW5kcyBpbXBsaWNpdGx5IGtpbGwKKyAgICAgICAgICAgICAgICBpZiAoTU8uaXNLaWxsKCkgfHwgTUktPmlzUmVnVGllZFRvRGVmT3BlcmFuZChpKSkKKyAgICAgICAgICAgICAgICAgIGNsb2JiZXJzU2NyYXRjaFJlZyA9IHRydWU7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IChNTy5pc0RlZigpKTsKKyAgICAgICAgICAgICAgICBjbG9iYmVyc1NjcmF0Y2hSZWcgPSB0cnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGRlZiwgcmVtZW1iZXIgdGhhdCB0aGlzIGluc24gZGVmaW5lcyB0aGUgdmFsdWUuCisgICAgICAgICAgLy8gVGhpcyBsZXRzIHVzIHByb3Blcmx5IGNvbnNpZGVyIGluc25zIHdoaWNoIHJlLXVzZSB0aGUgc2NyYXRjaAorICAgICAgICAgIC8vIHJlZ2lzdGVyLCBzdWNoIGFzIHIyID0gc3ViIHIyLCAjaW1tLCBpbiB0aGUgbWlkZGxlIG9mIHRoZQorICAgICAgICAgIC8vIHNjcmF0Y2ggcmFuZ2UuCisgICAgICAgICAgaWYgKE1PLmlzRGVmKCkpCisgICAgICAgICAgICBpc0RlZkluc24gPSB0cnVlOworCisgICAgICAgICAgLy8gSGF2ZSB3ZSBhbHJlYWR5IGFsbG9jYXRlZCBhIHNjcmF0Y2ggcmVnaXN0ZXIgZm9yIHRoaXMgdmlydHVhbD8KKyAgICAgICAgICBpZiAoUmVnICE9IEN1cnJlbnRWaXJ0UmVnKSB7CisgICAgICAgICAgICAvLyBXaGVuIHdlIGZpcnN0IGVuY291bnRlciBhIG5ldyB2aXJ0dWFsIHJlZ2lzdGVyLCBpdAorICAgICAgICAgICAgLy8gbXVzdCBiZSBhIGRlZmluaXRpb24uCisgICAgICAgICAgICBhc3NlcnQoTUktPmdldE9wZXJhbmQoaSkuaXNEZWYoKSAmJgorICAgICAgICAgICAgICAgICAgICJmcmFtZSBpbmRleCB2aXJ0dWFsIG1pc3NpbmcgZGVmISIpOworICAgICAgICAgICAgLy8gV2UgY2FuJ3QgaGF2ZSBuZXN0ZWQgdmlydHVhbCByZWdpc3RlciBsaXZlIHJhbmdlcyBiZWNhdXNlCisgICAgICAgICAgICAvLyB0aGVyZSdzIG9ubHkgYSBndWFyYW50ZWUgb2Ygb25lIHNjYXZlbmdlZCByZWdpc3RlciBhdCBhIHRpbWUuCisgICAgICAgICAgICBhc3NlcnQgKEN1cnJlbnRWaXJ0UmVnID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIm92ZXJsYXBwaW5nIGZyYW1lIGluZGV4IHZpcnR1YWwgcmVnaXN0ZXJzISIpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGdhdmUgdXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCdzIGluIHRoZSByZWdpc3RlciwKKyAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhhdCB0byByZS11c2Ugc2NyYXRjaCByZWdzLgorICAgICAgICAgICAgRGVuc2VNYXA8dW5zaWduZWQsIEZyYW1lQ29uc3RhbnRFbnRyeT46Oml0ZXJhdG9yIEVudHJ5ID0KKyAgICAgICAgICAgICAgRnJhbWVDb25zdGFudFJlZ01hcC5maW5kKFJlZyk7CisgICAgICAgICAgICB0cmFja2luZ0N1cnJlbnRWYWx1ZSA9IEVudHJ5ICE9IEZyYW1lQ29uc3RhbnRSZWdNYXAuZW5kKCk7CisgICAgICAgICAgICBpZiAodHJhY2tpbmdDdXJyZW50VmFsdWUpIHsKKyAgICAgICAgICAgICAgU1BBZGogPSAoKkVudHJ5KS5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgICBWYWx1ZSA9ICgqRW50cnkpLnNlY29uZC5maXJzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFNQQWRqID0gMDsKKyAgICAgICAgICAgICAgVmFsdWUuZmlyc3QgPSAwOworICAgICAgICAgICAgICBWYWx1ZS5zZWNvbmQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgc2NyYXRjaCByZWdpc3RlciBmcm9tIHRoZSBsYXN0IGFsbG9jYXRpb24gaXMgc3RpbGwKKyAgICAgICAgICAgIC8vIGF2YWlsYWJsZSwgc2VlIGlmIHRoZSB2YWx1ZSBtYXRjaGVzLiBJZiBpdCBkb2VzLCBqdXN0IHJlLXVzZSBpdC4KKyAgICAgICAgICAgIGlmICh0cmFja2luZ0N1cnJlbnRWYWx1ZSAmJiBoYXZlUHJldlZhbHVlICYmIFByZXZWYWx1ZSA9PSBWYWx1ZSkgeworICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgbGl2ZSByYW5nZQorICAgICAgICAgICAgICAvLyBmb3IgdGhlIHZpcnR1YWwgcmVnaXN0ZXIgYXJlIGV4Y2x1c2l2ZWx5IGZvciB0aGUgcHVycG9zZQorICAgICAgICAgICAgICAvLyBvZiBwb3B1bGF0aW5nIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIuIFRoYXQncyByZWFzb25hYmxlCisgICAgICAgICAgICAgIC8vIGZvciB0aGVzZSBmcmFtZSBpbmRleCByZWdpc3RlcnMsIGJ1dCBpdCdzIHN0aWxsIGEgdmVyeSwgdmVyeQorICAgICAgICAgICAgICAvLyBzdHJvbmcgYXNzdW1wdGlvbi4gcmRhcjovLzczMjI3MzIuIEJldHRlciB3b3VsZCBiZSB0bworICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5IGNoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gaW4gdGhlIHJhbmdlIGZvciByZWZlcmVuY2VzCisgICAgICAgICAgICAgIC8vIHRvIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyLiBPbmx5IGRlbGV0ZSB0aG9zZSBpbnNucyB0aGF0CisgICAgICAgICAgICAgIC8vIHRvdWNoIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyLgorCisgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGxhc3QgdXNlIG9mIHRoZSBuZXcgdmlydHVhbCByZWdpc3Rlci4gUmVtb3ZlIGFsbAorICAgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbiBiZXR3ZWVuIGhlcmUgYW5kIHRoZXJlLCBhbmQgdXBkYXRlIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgIC8vIGluc3RydWN0aW9uIHRvIHJlZmVyZW5jZSB0aGUgbGFzdCB1c2UgaW5zbiBpbnN0ZWFkLgorICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTGFzdFVzZU1JID0KKyAgICAgICAgICAgICAgICBmaW5kTGFzdFVzZVJlZyhJLCBCQi0+ZW5kKCksIFJlZyk7CisKKyAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBpbnN0cnVjdGlvbnMgdXAgJ3RpbCB0aGUgbGFzdCB1c2UsIHNpbmNlIHRoZXkncmUKKyAgICAgICAgICAgICAgLy8ganVzdCBjYWxjdWxhdGluZyB0aGUgdmFsdWUgd2UgYWxyZWFkeSBoYXZlLgorICAgICAgICAgICAgICBCQi0+ZXJhc2UoSSwgTGFzdFVzZU1JKTsKKyAgICAgICAgICAgICAgSSA9IExhc3RVc2VNSTsKKworICAgICAgICAgICAgICAvLyBFeHRlbmQgdGhlIGxpdmUgcmFuZ2Ugb2YgdGhlIHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgICAgICAgUHJldkxhc3RVc2VNSS0+Z2V0T3BlcmFuZChQcmV2TGFzdFVzZU9wKS5zZXRJc0tpbGwoZmFsc2UpOworICAgICAgICAgICAgICBSUy0+c2V0VXNlZChDdXJyZW50U2NyYXRjaFJlZyk7CisgICAgICAgICAgICAgIEN1cnJlbnRWaXJ0UmVnID0gUmVnOworCisgICAgICAgICAgICAgIC8vIFdlIGRlbGV0ZWQgdGhlIGluc3RydWN0aW9uIHdlIHdlcmUgc2Nhbm5pbmcgdGhlIG9wZXJhbmRzIG9mLgorICAgICAgICAgICAgICAvLyBKdW1wIGJhY2sgdG8gdGhlIGluc3RydWN0aW9uIGl0ZXJhdG9yIGxvb3AuIERvbid0IGluY3JlbWVudAorICAgICAgICAgICAgICAvLyBwYXN0IHRoaXMgaW5zdHJ1Y3Rpb24gc2luY2Ugd2UgdXBkYXRlZCB0aGUgaXRlcmF0b3IgYWxyZWFkeS4KKyAgICAgICAgICAgICAgRG9JbmNyID0gZmFsc2U7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTY2F2ZW5nZSBhIG5ldyBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgICAgICBDdXJyZW50VmlydFJlZyA9IFJlZzsKKyAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gRm4uZ2V0UmVnSW5mbygpLmdldFJlZ0NsYXNzKFJlZyk7CisgICAgICAgICAgICBDdXJyZW50U2NyYXRjaFJlZyA9IFJTLT5zY2F2ZW5nZVJlZ2lzdGVyKFJDLCBJLCBTUEFkaik7CisgICAgICAgICAgICBQcmV2VmFsdWUgPSBWYWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gcmVwbGFjZSB0aGlzIHJlZmVyZW5jZSB0byB0aGUgdmlydHVhbCByZWdpc3RlciB3aXRoIHRoZQorICAgICAgICAgIC8vIHNjcmF0Y2ggcmVnaXN0ZXIuCisgICAgICAgICAgYXNzZXJ0IChDdXJyZW50U2NyYXRjaFJlZyAmJiAiTWlzc2luZyBzY3JhdGNoIHJlZ2lzdGVyISIpOworICAgICAgICAgIE1JLT5nZXRPcGVyYW5kKGkpLnNldFJlZyhDdXJyZW50U2NyYXRjaFJlZyk7CisKKyAgICAgICAgICBpZiAoTUktPmdldE9wZXJhbmQoaSkuaXNLaWxsKCkpIHsKKyAgICAgICAgICAgIGlzS2lsbEluc24gPSB0cnVlOworICAgICAgICAgICAgUHJldkxhc3RVc2VPcCA9IGk7CisgICAgICAgICAgICBQcmV2TGFzdFVzZU1JID0gTUk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IHVzZSBvZiB0aGUgc2NyYXRjaCwgc3RvcCB0cmFja2luZyBpdC4gVGhlCisgICAgICAvLyBsYXN0IHVzZSB3aWxsIGJlIGEga2lsbCBvcGVyYW5kIGluIGFuIGluc3RydWN0aW9uIHRoYXQgZG9lcworICAgICAgLy8gbm90IGFsc28gZGVmaW5lIHRoZSBzY3JhdGNoIHJlZ2lzdGVyLgorICAgICAgaWYgKGlzS2lsbEluc24gJiYgIWlzRGVmSW5zbikgeworICAgICAgICBDdXJyZW50VmlydFJlZyA9IDA7CisgICAgICAgIGhhdmVQcmV2VmFsdWUgPSB0cmFja2luZ0N1cnJlbnRWYWx1ZTsKKyAgICAgIH0KKyAgICAgIC8vIFNpbWlsYXJseSwgbm90aWNlIGlmIGluc3RydWN0aW9uIGNsb2JiZXJlZCB0aGUgdmFsdWUgaW4gdGhlCisgICAgICAvLyByZWdpc3RlciB3ZSdyZSB0cmFja2luZyBmb3IgcG9zc2libGUgbGF0ZXIgcmV1c2UuIFRoaXMgaXMgbm90ZWQKKyAgICAgIC8vIGFib3ZlLCBidXQgZW5mb3JjZWQgaGVyZSBzaW5jZSB0aGUgdmFsdWUgaXMgc3RpbGwgbGl2ZSB3aGlsZSB3ZQorICAgICAgLy8gcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uLgorICAgICAgaWYgKGNsb2JiZXJzU2NyYXRjaFJlZykgeworICAgICAgICBoYXZlUHJldlZhbHVlID0gZmFsc2U7CisgICAgICAgIEN1cnJlbnRTY3JhdGNoUmVnID0gMDsKKyAgICAgIH0KKyAgICAgIGlmIChEb0luY3IpIHsKKyAgICAgICAgUlMtPmZvcndhcmQoSSk7CisgICAgICAgICsrSTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Byb2xvZ0VwaWxvZ0luc2VydGVyLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Qcm9sb2dFcGlsb2dJbnNlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NmMzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Qcm9sb2dFcGlsb2dJbnNlcnRlci5oCkBAIC0wLDAgKzEsMTgyIEBACisvLz09PS0tIFByb2xvZ0VwaWxvZ0luc2VydGVyLmggLSBQcm9sb2cvRXBpbG9nIGNvZGUgaW5zZXJ0aW9uIC0qLSBDKysgLSogLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpcyByZXNwb25zaWJsZSBmb3IgZmluYWxpemluZyB0aGUgZnVuY3Rpb25zIGZyYW1lIGxheW91dCwgc2F2aW5nCisvLyBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLCBhbmQgZm9yIGVtaXR0aW5nIHByb2xvZyAmIGVwaWxvZyBjb2RlIGZvciB0aGUKKy8vIGZ1bmN0aW9uLgorLy8KKy8vIFRoaXMgcGFzcyBtdXN0IGJlIHJ1biBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uLiAgQWZ0ZXIgdGhpcyBwYXNzIGlzCisvLyBleGVjdXRlZCwgaXQgaXMgaWxsZWdhbCB0byBjb25zdHJ1Y3QgTU9fRnJhbWVJbmRleCBvcGVyYW5kcy4KKy8vCisvLyBUaGlzIHBhc3MgYWxzbyBpbXBsZW1lbnRzIGEgc2hyaW5rIHdyYXBwaW5nIHZhcmlhbnQgb2YgcHJvbG9nL2VwaWxvZworLy8gaW5zZXJ0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BFSV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9QRUlfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NwYXJzZUJpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgUmVnU2NhdmVuZ2VyOworICBjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKKworICBjbGFzcyBQRUkgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBQRUkoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiUHJvbG9nL0VwaWxvZyBJbnNlcnRpb24gJiBGcmFtZSBGaW5hbGl6YXRpb24iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKworICAgIC8vLyBydW5Pbk1hY2hpbmVGdW5jdGlvbiAtIEluc2VydCBwcm9sb2cvZXBpbG9nIGNvZGUgYW5kIHJlcGxhY2UgYWJzdHJhY3QKKyAgICAvLy8gZnJhbWUgaW5kZXhlcyB3aXRoIGFwcHJvcHJpYXRlIHJlZmVyZW5jZXMuCisgICAgLy8vCisgICAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKworICBwcml2YXRlOgorICAgIFJlZ1NjYXZlbmdlciAqUlM7CisKKyAgICAvLyBNaW5DU0ZyYW1lSW5kZXgsIE1heENTRnJhbWVJbmRleCAtIEtlZXBzIHRoZSByYW5nZSBvZiBjYWxsZWUgc2F2ZWQKKyAgICAvLyBzdGFjayBmcmFtZSBpbmRleGVzLgorICAgIHVuc2lnbmVkIE1pbkNTRnJhbWVJbmRleCwgTWF4Q1NGcmFtZUluZGV4OworCisgICAgLy8gQW5hbHlzaXMgaW5mbyBmb3Igc3BpbGwvcmVzdG9yZSBwbGFjZW1lbnQuCisgICAgLy8gIkNTUiI6ICJjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIiLgorCisgICAgLy8gQ1NSZWdTZXQgY29udGFpbnMgaW5kaWNlcyBpbnRvIHRoZSBDYWxsZWUgU2F2ZWQgUmVnaXN0ZXIgSW5mbworICAgIC8vIHZlY3RvciBidWlsdCBieSBjYWxjdWxhdGVDYWxsZWVTYXZlZFJlZ2lzdGVycygpIGFuZCBhY2Nlc3NlZAorICAgIC8vIHZpYSBNRi5nZXRGcmFtZUluZm8oKS0+Z2V0Q2FsbGVlU2F2ZWRJbmZvKCkuCisgICAgdHlwZWRlZiBTcGFyc2VCaXRWZWN0b3I8PiBDU1JlZ1NldDsKKworICAgIC8vIENTUmVnQmxvY2tNYXAgbWFwcyBNYWNoaW5lQmFzaWNCbG9ja3MgdG8gc2V0cyBvZiBjYWxsZWUKKyAgICAvLyBzYXZlZCByZWdpc3RlciBpbmRpY2VzLgorICAgIHR5cGVkZWYgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBDU1JlZ1NldD4gQ1NSZWdCbG9ja01hcDsKKworICAgIC8vIFNldCBhbmQgbWFwcyBmb3IgY29tcHV0aW5nIENTUiBzcGlsbC9yZXN0b3JlIHBsYWNlbWVudDoKKyAgICAvLyAgdXNlZCBpbiBmdW5jdGlvbiAoVXNlZENTUmVncykKKyAgICAvLyAgdXNlZCBpbiBhIGJhc2ljIGJsb2NrIChDU1JVc2VkKQorICAgIC8vICBhbnRpY2lwYXRhYmxlIGluIGEgYmFzaWMgYmxvY2sgKEFudGlje0luLE91dH0pCisgICAgLy8gIGF2YWlsYWJsZSBpbiBhIGJhc2ljIGJsb2NrIChBdmFpbHtJbixPdXR9KQorICAgIC8vICB0byBiZSBzcGlsbGVkIGF0IHRoZSBlbnRyeSB0byBhIGJhc2ljIGJsb2NrIChDU1JTYXZlKQorICAgIC8vICB0byBiZSByZXN0b3JlZCBhdCB0aGUgZW5kIG9mIGEgYmFzaWMgYmxvY2sgKENTUlJlc3RvcmUpCisgICAgQ1NSZWdTZXQgVXNlZENTUmVnczsKKyAgICBDU1JlZ0Jsb2NrTWFwIENTUlVzZWQ7CisgICAgQ1NSZWdCbG9ja01hcCBBbnRpY0luLCBBbnRpY091dDsKKyAgICBDU1JlZ0Jsb2NrTWFwIEF2YWlsSW4sIEF2YWlsT3V0OworICAgIENTUmVnQmxvY2tNYXAgQ1NSU2F2ZTsKKyAgICBDU1JlZ0Jsb2NrTWFwIENTUlJlc3RvcmU7CisKKyAgICAvLyBFbnRyeSBhbmQgcmV0dXJuIGJsb2NrcyBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayogRW50cnlCbG9jazsKKyAgICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDQ+IFJldHVybkJsb2NrczsKKworICAgIC8vIE1hcCBvZiBNQkJzIHRvIHRvcCBsZXZlbCBNYWNoaW5lTG9vcHMuCisgICAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCBNYWNoaW5lTG9vcCo+IFRMTG9vcHM7CisKKyAgICAvLyBGbGFnIHRvIGNvbnRyb2wgc2hyaW5rIHdyYXBwaW5nIHBlci1mdW5jdGlvbjoKKyAgICAvLyBtYXkgY2hvb3NlIHRvIHNraXAgc2hyaW5rIHdyYXBwaW5nIGZvciBjZXJ0YWluCisgICAgLy8gZnVuY3Rpb25zLgorICAgIGJvb2wgU2hyaW5rV3JhcFRoaXNGdW5jdGlvbjsKKworICAgIC8vIEZsYWcgdG8gY29udHJvbCB3aGV0aGVyIHRvIHVzZSB0aGUgcmVnaXN0ZXIgc2NhdmVuZ2VyIHRvIHJlc29sdmUKKyAgICAvLyBmcmFtZSBpbmRleCBtYXRlcmlhbGl6YXRpb24gcmVnaXN0ZXJzLiBTZXQgYWNjb3JkaW5nIHRvCisgICAgLy8gVFJJLT5yZXF1aXJlc0ZyYW1lSW5kZXhTY2F2ZW5naW5nKCkgZm9yIHRoZSBjdXJyZW4gZnVuY3Rpb24uCisgICAgYm9vbCBGcmFtZUluZGV4VmlydHVhbFNjYXZlbmdpbmc7CisKKyAgICAvLyBXaGVuIHVzaW5nIHRoZSBzY2F2ZW5nZXIgcG9zdC1wYXNzIHRvIHJlc29sdmUgZnJhbWUgcmVmZXJlbmNlCisgICAgLy8gbWF0ZXJpYWxpemF0aW9uIHJlZ2lzdGVycywgbWFpbnRhaW4gYSBtYXAgb2YgdGhlIHJlZ2lzdGVycyB0bworICAgIC8vIHRoZSBjb25zdGFudCB2YWx1ZSBhbmQgU1AgYWRqdXN0bWVudCBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8VGFyZ2V0UmVnaXN0ZXJJbmZvOjpGcmFtZUluZGV4VmFsdWUsIGludD4KKyAgICAgIEZyYW1lQ29uc3RhbnRFbnRyeTsKKyAgICBEZW5zZU1hcDx1bnNpZ25lZCwgRnJhbWVDb25zdGFudEVudHJ5PiBGcmFtZUNvbnN0YW50UmVnTWFwOworCisjaWZuZGVmIE5ERUJVRworICAgIC8vIE1hY2hpbmUgZnVuY3Rpb24gaGFuZGxlLgorICAgIE1hY2hpbmVGdW5jdGlvbiogTUY7CisKKyAgICAvLyBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgY3VycmVudCBmdW5jdGlvbgorICAgIC8vIGhhcyBhdCBsZWFzdCBvbmUgInNob3J0IiBwYXRoIGluIHRoZSBtYWNoaW5lCisgICAgLy8gQ0ZHIGZyb20gdGhlIGVudHJ5IGJsb2NrIHRvIGFuIGV4aXQgYmxvY2suCisgICAgYm9vbCBIYXNGYXN0RXhpdFBhdGg7CisjZW5kaWYKKworICAgIGJvb2wgY2FsY3VsYXRlU2V0cyhNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKyAgICBib29sIGNhbGNBbnRpY0luT3V0KE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIpOworICAgIGJvb2wgY2FsY0F2YWlsSW5PdXQoTWFjaGluZUJhc2ljQmxvY2sqIE1CQik7CisgICAgdm9pZCBjYWxjdWxhdGVBbnRpY0F2YWlsKE1hY2hpbmVGdW5jdGlvbiAmRm4pOworICAgIGJvb2wgYWRkVXNlc0Zvck1FTUVSZWdpb24oTWFjaGluZUJhc2ljQmxvY2sqIE1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgND4mIGJsa3MpOworICAgIGJvb2wgYWRkVXNlc0ZvclRvcExldmVsTG9vcHMoU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA0PiYgYmxrcyk7CisgICAgYm9vbCBjYWxjU3BpbGxQbGFjZW1lbnRzKE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgND4gJmJsa3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTUmVnQmxvY2tNYXAgJnByZXZTcGlsbHMpOworICAgIGJvb2wgY2FsY1Jlc3RvcmVQbGFjZW1lbnRzKE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA0PiAmYmxrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1JlZ0Jsb2NrTWFwICZwcmV2UmVzdG9yZXMpOworICAgIHZvaWQgcGxhY2VTcGlsbHNBbmRSZXN0b3JlcyhNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKyAgICB2b2lkIHBsYWNlQ1NSU3BpbGxzQW5kUmVzdG9yZXMoTWFjaGluZUZ1bmN0aW9uICZGbik7CisgICAgdm9pZCBjYWxjdWxhdGVDYWxsc0luZm9ybWF0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRm4pOworICAgIHZvaWQgY2FsY3VsYXRlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUZ1bmN0aW9uICZGbik7CisgICAgdm9pZCBpbnNlcnRDU1JTcGlsbHNBbmRSZXN0b3JlcyhNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKyAgICB2b2lkIGNhbGN1bGF0ZUZyYW1lT2JqZWN0T2Zmc2V0cyhNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKyAgICB2b2lkIHJlcGxhY2VGcmFtZUluZGljZXMoTWFjaGluZUZ1bmN0aW9uICZGbik7CisgICAgdm9pZCBzY2F2ZW5nZUZyYW1lVmlydHVhbFJlZ3MoTWFjaGluZUZ1bmN0aW9uICZGbik7CisgICAgdm9pZCBpbnNlcnRQcm9sb2dFcGlsb2dDb2RlKE1hY2hpbmVGdW5jdGlvbiAmRm4pOworCisgICAgLy8gSW5pdGlhbGl6ZSBERkEgc2V0cywgY2FsbGVkIGJlZm9yZSBpdGVyYXRpb25zLgorICAgIHZvaWQgY2xlYXJBbnRpY0F2YWlsU2V0cygpOworICAgIC8vIENsZWFyIGFsbCBzZXRzIGNvbnN0cnVjdGVkIGJ5IHNocmluayB3cmFwcGluZy4KKyAgICB2b2lkIGNsZWFyQWxsU2V0cygpOworCisgICAgLy8gSW5pdGlhbGl6ZSBhbGwgc2hyaW5rIHdyYXBwaW5nIGRhdGEuCisgICAgdm9pZCBpbml0U2hyaW5rV3JhcHBpbmdJbmZvKCk7CisKKyAgICAvLyBDb252aWVuZW5jZXMgZm9yIGRlYWxpbmcgd2l0aCBtYWNoaW5lIGxvb3BzLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBnZXRUb3BMZXZlbExvb3BQcmVoZWFkZXIoTWFjaGluZUxvb3AqIExQKTsKKyAgICBNYWNoaW5lTG9vcCogZ2V0VG9wTGV2ZWxMb29wUGFyZW50KE1hY2hpbmVMb29wICpMUCk7CisKKyAgICAvLyBQcm9wZ2F0ZSBDU1JzIHVzZWQgaW4gTUJCIHRvIGFsbCBNQkJzIG9mIGxvb3AgTFAuCisgICAgdm9pZCBwcm9wYWdhdGVVc2VzQXJvdW5kTG9vcChNYWNoaW5lQmFzaWNCbG9jayogTUJCLCBNYWNoaW5lTG9vcCogTFApOworCisgICAgLy8gQ29udmVuaWVuY2UgZm9yIHJlY29nbml6aW5nIHJldHVybiBibG9ja3MuCisgICAgYm9vbCBpc1JldHVybkJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIpOworCisjaWZuZGVmIE5ERUJVRworICAgIC8vIERlYnVnZ2luZyBtZXRob2RzLgorCisgICAgLy8gTWFyayB0aGlzIGZ1bmN0aW9uIGFzIGhhdmluZyBmYXN0IGV4aXQgcGF0aHMuCisgICAgdm9pZCBmaW5kRmFzdEV4aXRQYXRoKCk7CisKKyAgICAvLyBWZXJpZnkgcGxhY2VtZW50IG9mIHNwaWxscy9yZXN0b3Jlcy4KKyAgICB2b2lkIHZlcmlmeVNwaWxsUmVzdG9yZVBsYWNlbWVudCgpOworCisgICAgc3RkOjpzdHJpbmcgZ2V0QmFzaWNCbG9ja05hbWUoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqIE1CQik7CisgICAgc3RkOjpzdHJpbmcgc3RyaW5naWZ5Q1NSZWdTZXQoY29uc3QgQ1NSZWdTZXQmIHMpOworICAgIHZvaWQgZHVtcFNldChjb25zdCBDU1JlZ1NldCYgcyk7CisgICAgdm9pZCBkdW1wVXNlZChNYWNoaW5lQmFzaWNCbG9jayogTUJCKTsKKyAgICB2b2lkIGR1bXBBbGxVc2VkKCk7CisgICAgdm9pZCBkdW1wU2V0cyhNYWNoaW5lQmFzaWNCbG9jayogTUJCKTsKKyAgICB2b2lkIGR1bXBTZXRzMShNYWNoaW5lQmFzaWNCbG9jayogTUJCKTsKKyAgICB2b2lkIGR1bXBBbGxTZXRzKCk7CisgICAgdm9pZCBkdW1wU1JTZXRzKCk7CisjZW5kaWYKKworICB9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlODZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5jcHAKQEAgLTAsMCArMSwxMzQgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFBzZXVkb1NvdXJjZVZhbHVlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NdXRleC5oIgorI2luY2x1ZGUgPG1hcD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2Ugeworc3RydWN0IFBTVkdsb2JhbHNUeSB7CisgIC8vIFBzZXVkb1NvdXJjZVZhbHVlcyBhcmUgaW1tdXRhYmxlIHNvIGRvbid0IG5lZWQgbG9ja2luZy4KKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgUFNWc1s0XTsKKyAgc3lzOjpNdXRleCBMb2NrOyAgLy8gR3VhcmRzIEZTVmFsdWVzLCBidXQgbm90IHRoZSB2YWx1ZXMgaW5zaWRlIGl0LgorICBzdGQ6Om1hcDxpbnQsIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICo+IEZTVmFsdWVzOworCisgIFBTVkdsb2JhbHNUeSgpIDogUFNWcygpIHt9CisgIH5QU1ZHbG9iYWxzVHkoKSB7CisgICAgZm9yIChzdGQ6Om1hcDxpbnQsIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICo+OjppdGVyYXRvcgorICAgICAgICAgICBJID0gRlNWYWx1ZXMuYmVnaW4oKSwgRSA9IEZTVmFsdWVzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgZGVsZXRlIEktPnNlY29uZDsKKyAgICB9CisgIH0KK307CisKK3N0YXRpYyBNYW5hZ2VkU3RhdGljPFBTVkdsb2JhbHNUeT4gUFNWR2xvYmFsczsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqUHNldWRvU291cmNlVmFsdWU6OmdldFN0YWNrKCkKK3sgcmV0dXJuICZQU1ZHbG9iYWxzLT5QU1ZzWzBdOyB9Citjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqUHNldWRvU291cmNlVmFsdWU6OmdldEdPVCgpCit7IHJldHVybiAmUFNWR2xvYmFscy0+UFNWc1sxXTsgfQorY29uc3QgUHNldWRvU291cmNlVmFsdWUgKlBzZXVkb1NvdXJjZVZhbHVlOjpnZXRKdW1wVGFibGUoKQoreyByZXR1cm4gJlBTVkdsb2JhbHMtPlBTVnNbMl07IH0KK2NvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Q29uc3RhbnRQb29sKCkKK3sgcmV0dXJuICZQU1ZHbG9iYWxzLT5QU1ZzWzNdOyB9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBQU1ZOYW1lc1tdID0geworICAiU3RhY2siLAorICAiR09UIiwKKyAgIkp1bXBUYWJsZSIsCisgICJDb25zdGFudFBvb2wiCit9OworCisvLyBGSVhNRTogVEhJUyBJUyBBIEhBQ0shISEhCisvLyBFdmVudHVhbGx5IHRoZXNlIHNob3VsZCBiZSB1bmlxdWVkIG9uIExMVk1Db250ZXh0IHJhdGhlciB0aGFuIGluIGEgbWFuYWdlZAorLy8gc3RhdGljLiAgRm9yIG5vdywgd2UgY2FuIHNhZmVseSB1c2UgdGhlIGdsb2JhbCBjb250ZXh0IGZvciB0aGUgdGltZSBiZWluZyB0bworLy8gc3F1ZWFrIGJ5LgorUHNldWRvU291cmNlVmFsdWU6OlBzZXVkb1NvdXJjZVZhbHVlKGVudW0gVmFsdWVUeSBTdWJjbGFzcykgOgorICBWYWx1ZShUeXBlOjpnZXRJbnQ4UHRyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwKKyAgICAgICAgU3ViY2xhc3MpIHt9CisKK3ZvaWQgUHNldWRvU291cmNlVmFsdWU6OnByaW50Q3VzdG9tKHJhd19vc3RyZWFtICZPKSBjb25zdCB7CisgIE8gPDwgUFNWTmFtZXNbdGhpcyAtIFBTVkdsb2JhbHMtPlBTVnNdOworfQorCitjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soaW50IEZJKSB7CisgIFBTVkdsb2JhbHNUeSAmUEcgPSAqUFNWR2xvYmFsczsKKyAgc3lzOjpTY29wZWRMb2NrIGxvY2tlZChQRy5Mb2NrKTsKKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKiZWID0gUEcuRlNWYWx1ZXNbRkldOworICBpZiAoIVYpCisgICAgViA9IG5ldyBGaXhlZFN0YWNrUHNldWRvU291cmNlVmFsdWUoRkkpOworICByZXR1cm4gVjsKK30KKworYm9vbCBQc2V1ZG9Tb3VyY2VWYWx1ZTo6aXNDb25zdGFudChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICopIGNvbnN0IHsKKyAgaWYgKHRoaXMgPT0gZ2V0U3RhY2soKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICh0aGlzID09IGdldEdPVCgpIHx8CisgICAgICB0aGlzID09IGdldENvbnN0YW50UG9vbCgpIHx8CisgICAgICB0aGlzID09IGdldEp1bXBUYWJsZSgpKQorICAgIHJldHVybiB0cnVlOworICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIFBzZXVkb1NvdXJjZVZhbHVlISIpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUHNldWRvU291cmNlVmFsdWU6OmlzQWxpYXNlZChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkpIGNvbnN0IHsKKyAgaWYgKHRoaXMgPT0gZ2V0U3RhY2soKSB8fAorICAgICAgdGhpcyA9PSBnZXRHT1QoKSB8fAorICAgICAgdGhpcyA9PSBnZXRDb25zdGFudFBvb2woKSB8fAorICAgICAgdGhpcyA9PSBnZXRKdW1wVGFibGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gUHNldWRvU291cmNlVmFsdWUhIik7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBzZXVkb1NvdXJjZVZhbHVlOjptYXlBbGlhcyhjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkpIGNvbnN0IHsKKyAgaWYgKHRoaXMgPT0gZ2V0R09UKCkgfHwKKyAgICAgIHRoaXMgPT0gZ2V0Q29uc3RhbnRQb29sKCkgfHwKKyAgICAgIHRoaXMgPT0gZ2V0SnVtcFRhYmxlKCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGaXhlZFN0YWNrUHNldWRvU291cmNlVmFsdWU6OmlzQ29uc3RhbnQoY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJKSBjb25zdHsKKyAgcmV0dXJuIE1GSSAmJiBNRkktPmlzSW1tdXRhYmxlT2JqZWN0SW5kZXgoRkkpOworfQorCitib29sIEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZTo6aXNBbGlhc2VkKGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSkgY29uc3QgeworICAvLyBOZWdhdGl2ZSBmcmFtZSBpbmRpY2VzIGFyZSB1c2VkIGZvciBzcGVjaWFsIHRoaW5ncyB0aGF0IGRvbid0CisgIC8vIGFwcGVhciBpbiBMTFZNIElSLiBOb24tbmVnYXRpdmUgaW5kaWNlcyBtYXkgYmUgdXNlZCBmb3IgdGhpbmdzCisgIC8vIGxpa2Ugc3RhdGljIGFsbG9jYXMuCisgIGlmICghTUZJKQorICAgIHJldHVybiBGSSA+PSAwOworICAvLyBTcGlsbCBzbG90cyBzaG91bGQgbm90IGFsaWFzIG90aGVycy4KKyAgcmV0dXJuICFNRkktPmlzRml4ZWRPYmplY3RJbmRleChGSSkgJiYgIU1GSS0+aXNTcGlsbFNsb3RPYmplY3RJbmRleChGSSk7Cit9CisKK2Jvb2wgRml4ZWRTdGFja1BzZXVkb1NvdXJjZVZhbHVlOjptYXlBbGlhcyhjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkpIGNvbnN0IHsKKyAgaWYgKCFNRkkpCisgICAgcmV0dXJuIHRydWU7CisgIC8vIFNwaWxsIHNsb3RzIHdpbGwgbm90IGFsaWFzIGFueSBMTFZNIElSIHZhbHVlLgorICByZXR1cm4gIU1GSS0+aXNTcGlsbFNsb3RPYmplY3RJbmRleChGSSk7Cit9CisKK3ZvaWQgRml4ZWRTdGFja1BzZXVkb1NvdXJjZVZhbHVlOjpwcmludEN1c3RvbShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIkZpeGVkU3RhY2siIDw8IEZJOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vUkVBRE1FLnR4dCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NWRkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1JFQURNRS50eHQKQEAgLTAsMCArMSwxOTkgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQ29tbW9uIHJlZ2lzdGVyIGFsbG9jYXRpb24gLyBzcGlsbGluZyBwcm9ibGVtOgorCisgICAgICAgIG11bCBsciwgcjQsIGxyCisgICAgICAgIHN0ciBsciwgW3NwLCAjKzUyXQorICAgICAgICBsZHIgbHIsIFtyMSwgIyszMl0KKyAgICAgICAgc3h0aCByMywgcjMKKyAgICAgICAgbGRyIHI0LCBbc3AsICMrNTJdCisgICAgICAgIG1sYSByNCwgcjMsIGxyLCByNAorCitjYW4gYmU6CisKKyAgICAgICAgbXVsIGxyLCByNCwgbHIKKyAgICAgICAgbW92IHI0LCBscgorICAgICAgICBzdHIgbHIsIFtzcCwgIys1Ml0KKyAgICAgICAgbGRyIGxyLCBbcjEsICMrMzJdCisgICAgICAgIHN4dGggcjMsIHIzCisgICAgICAgIG1sYSByNCwgcjMsIGxyLCByNAorCithbmQgdGhlbiAibWVyZ2UiIG11bCBhbmQgbW92OgorCisgICAgICAgIG11bCByNCwgcjQsIGxyCisgICAgICAgIHN0ciBsciwgW3NwLCAjKzUyXQorICAgICAgICBsZHIgbHIsIFtyMSwgIyszMl0KKyAgICAgICAgc3h0aCByMywgcjMKKyAgICAgICAgbWxhIHI0LCByMywgbHIsIHI0CisKK0l0IGFsc28gaW5jcmVhc2UgdGhlIGxpa2VseWhvb2QgdGhlIHN0b3JlIG1heSBiZWNvbWUgZGVhZC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitiYjI3IC4uLgorICAgICAgICAuLi4KKyAgICAgICAgJXJlZzEwMzcgPSBBRERyaSAlcmVnMTAzOSwgMQorICAgICAgICAlcmVnMTAzOCA9IEFERHJzICVyZWcxMDMyLCAlcmVnMTAzOSwgJU5PUkVHLCAxMAorICAgIFN1Y2Nlc3NvcnMgYWNjb3JkaW5nIHRvIENGRzogMHg4YjAzYmYwICgjNSkKKworYmI3NiAoMHg4YjAzYmYwLCBMTFZNIEJCIEAweDhiMDMyZDAsIElEIzUpOgorICAgIFByZWRlY2Vzc29ycyBhY2NvcmRpbmcgdG8gQ0ZHOiAweDhiMGM1ZjAgKCMzKSAweDhiMGE3YzAgKCM0KQorICAgICAgICAlcmVnMTAzOSA9IFBISSAlcmVnMTA3MCwgbWJiPGJiNzYub3V0ZXIsMHg4YjBjNWYwPiwgJXJlZzEwMzcsIG1iYjxiYjI3LDB4OGIwYTdjMD4KKworTm90ZSBBRERyaSBpcyBub3QgYSB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbi4gSG93ZXZlciwgaXRzIHJlc3VsdCAlcmVnMTAzNyBpcyBhbgorb3BlcmFuZCBvZiB0aGUgUEhJIG5vZGUgaW4gYmI3NiBhbmQgaXRzIG9wZXJhbmQgJXJlZzEwMzkgaXMgdGhlIHJlc3VsdCBvZiB0aGUKK1BISSBub2RlLiBXZSBzaG91bGQgdHJlYXQgaXQgYXMgYSB0d28tYWRkcmVzcyBjb2RlIGFuZCBtYWtlIHN1cmUgdGhlIEFERHJpIGlzCitzY2hlZHVsZWQgYWZ0ZXIgYW55IG5vZGUgdGhhdCByZWFkcyAlcmVnMTAzOS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitVc2UgbG9jYWwgaW5mbyAoaS5lLiByZWdpc3RlciBzY2F2ZW5nZXIpIHRvIGFzc2lnbiBpdCBhIGZyZWUgcmVnaXN0ZXIgdG8gYWxsb3cKK3JldXNlOgorICAgICAgICBsZHIgcjMsIFtzcCwgIys0XQorICAgICAgICBhZGQgcjMsIHIzLCAjMworICAgICAgICBsZHIgcjIsIFtzcCwgIys4XQorICAgICAgICBhZGQgcjIsIHIyLCAjMgorICAgICAgICBsZHIgcjEsIFtzcCwgIys0XSAgPD09CisgICAgICAgIGFkZCByMSwgcjEsICMxCisgICAgICAgIGxkciByMCwgW3NwLCAjKzRdCisgICAgICAgIGFkZCByMCwgcjAsICMyCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworTExWTSBhZ2dyZXNzaXZlbHkgbGlmdCBDU0Ugb3V0IG9mIGxvb3AuIFNvbWV0aW1lcyB0aGlzIGNhbiBiZSBuZWdhdGl2ZSBzaWRlLQorZWZmZWN0czoKKworUjEgPSBYICsgNAorUjIgPSBYICsgNworUjMgPSBYICsgMTUKKworbG9vcDoKK2xvYWQgW2kgKyBSMV0KKy4uLgorbG9hZCBbaSArIFIyXQorLi4uCitsb2FkIFtpICsgUjNdCisKK1N1cHBvc2UgdGhlcmUgaXMgaGlnaCByZWdpc3RlciBwcmVzc3VyZSwgUjEsIFIyLCBSMywgY2FuIGJlIHNwaWxsZWQuIFdlIG5lZWQKK3RvIGltcGxlbWVudCBwcm9wZXIgcmUtbWF0ZXJpYWxpemF0aW9uIHRvIGhhbmRsZSB0aGlzOgorCitSMSA9IFggKyA0CitSMiA9IFggKyA3CitSMyA9IFggKyAxNQorCitsb29wOgorUjEgPSBYICsgNCAgQCByZS1tYXRlcmlhbGl6ZWQKK2xvYWQgW2kgKyBSMV0KKy4uLgorUjIgPSBYICsgNyBAIHJlLW1hdGVyaWFsaXplZAorbG9hZCBbaSArIFIyXQorLi4uCitSMyA9IFggKyAxNSBAIHJlLW1hdGVyaWFsaXplZAorbG9hZCBbaSArIFIzXQorCitGdXJ0aGVybW9yZSwgd2l0aCByZS1hc3NvY2lhdGlvbiwgd2UgY2FuIGVuYWJsZSBzaGFyaW5nOgorCitSMSA9IFggKyA0CitSMiA9IFggKyA3CitSMyA9IFggKyAxNQorCitsb29wOgorVCA9IGkgKyBYCitsb2FkIFtUICsgNF0KKy4uLgorbG9hZCBbVCArIDddCisuLi4KK2xvYWQgW1QgKyAxNV0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSXQncyBub3QgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIGNob29zZSByZW1hdGVyaWFsaXphdGlvbiBvdmVyIHNwaWxsaW5nLiBJZiBhbGwKK3RoZSBsb2FkIC8gc3RvcmUgaW5zdHJ1Y3Rpb25zIHdvdWxkIGJlIGZvbGRlZCB0aGVuIHNwaWxsaW5nIGlzIGNoZWFwZXIgYmVjYXVzZQoraXQgd29uJ3QgcmVxdWlyZSBuZXcgbGl2ZSBpbnRlcnZhbHMgLyByZWdpc3RlcnMuIFNlZSAyMDAzLTA1LTMxLUxvbmdTaGlmdHMgZm9yCithbiBleGFtcGxlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dpdGggYSBjb3B5aW5nIGdhcmJhZ2UgY29sbGVjdG9yLCBkZXJpdmVkIHBvaW50ZXJzIG11c3Qgbm90IGJlIHJldGFpbmVkIGFjcm9zcworY29sbGVjdG9yIHNhZmUgcG9pbnRzOyB0aGUgY29sbGVjdG9yIGNvdWxkIG1vdmUgdGhlIG9iamVjdHMgYW5kIGludmFsaWRhdGUgdGhlCitkZXJpdmVkIHBvaW50ZXIuIFRoaXMgaXMgYmFkIGVub3VnaCBpbiB0aGUgZmlyc3QgcGxhY2UsIGJ1dCBzYWZlIHBvaW50cyBjYW4KK2Nyb3AgdXAgdW5wcmVkaWN0YWJseS4gQ29uc2lkZXI6CisKKyAgICAgICAgJWFycmF5ID0gbG9hZCB7IGkzMiwgWzAgeCAlb2JqXSB9KiogJWFycmF5X2FkZHIKKyAgICAgICAgJW50aF9lbCA9IGdldGVsZW1lbnRwdHIgeyBpMzIsIFswIHggJW9ial0gfSogJWFycmF5LCBpMzIgMCwgaTMyICVuCisgICAgICAgICVvbGQgPSBsb2FkICVvYmoqKiAlbnRoX2VsCisgICAgICAgICV6ID0gZGl2IGk2NCAleCwgJXkKKyAgICAgICAgc3RvcmUgJW9iaiogJW5ldywgJW9iaioqICVudGhfZWwKKworSWYgdGhlIGk2NCBkaXZpc2lvbiBpcyBsb3dlcmVkIHRvIGEgbGliY2FsbCwgdGhlbiBhIHNhZmUgcG9pbnQgd2lsbCAobXVzdCkKK2FwcGVhciBmb3IgdGhlIGNhbGwgc2l0ZS4gSWYgYSBjb2xsZWN0aW9uIG9jY3VycywgJWFycmF5IGFuZCAlbnRoX2VsIG5vIGxvbmdlcgorcG9pbnQgaW50byB0aGUgY29ycmVjdCBvYmplY3QuCisKK1RoZSBmaXggZm9yIHRoaXMgaXMgdG8gY29weSBhZGRyZXNzIGNhbGN1bGF0aW9ucyBzbyB0aGF0IGRlcGVuZGVudCBwb2ludGVycworYXJlIG5ldmVyIGxpdmUgYWNyb3NzIHNhZmUgcG9pbnQgYm91bmRhcmllcy4gQnV0IHRoZSBsb2FkcyBjYW5ub3QgYmUgY29waWVkCitsaWtlIHRoaXMgaWYgdGhlcmUgd2FzIGFuIGludGVydmVuaW5nIHN0b3JlLCBzbyBtYXkgYmUgaGFyZCB0byBnZXQgcmlnaHQuCisKK09ubHkgYSBjb25jdXJyZW50IG11dGF0b3IgY2FuIHRyaWdnZXIgYSBjb2xsZWN0aW9uIGF0IHRoZSBsaWJjYWxsIHNhZmUgcG9pbnQuCitTbyBzaW5nbGUtdGhyZWFkZWQgcHJvZ3JhbXMgZG8gbm90IGhhdmUgdGhpcyByZXF1aXJlbWVudCwgZXZlbiB3aXRoIGEgY29weWluZworY29sbGVjdG9yLiBTdGlsbCwgTExWTSBvcHRpbWl6YXRpb25zIHdvdWxkIHByb2JhYmx5IHVuZG8gYSBmcm9udC1lbmQncyBjYXJlZnVsCit3b3JrLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZSBvY2FtbCBmcmFtZXRhYmxlIHN0cnVjdHVyZSBzdXBwb3J0cyBsaXZlbmVzcyBpbmZvcm1hdGlvbi4gSXQgd291bGQgYmUgZ29vZAordG8gc3VwcG9ydCBpdC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGUgRklYTUUgaW4gQ29tcHV0ZUNvbW1vblRhaWxMZW5ndGggaW4gQnJhbmNoRm9sZGluZy5jcHAgbmVlZHMgdG8gYmUKK3JldmlzaXRlZC4gVGhlIGNoZWNrIGlzIHRoZXJlIHRvIHdvcmsgYXJvdW5kIGEgbWlzdXNlIG9mIGRpcmVjdGl2ZXMgaW4gaW5saW5lCithc3NlbWJseS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJdCB3b3VsZCBiZSBnb29kIHRvIGRldGVjdCBjb2xsZWN0b3IvdGFyZ2V0IGNvbXBhdGliaWxpdHkgaW5zdGVhZCBvZiBzaWxlbnRseQorZG9pbmcgdGhlIHdyb25nIHRoaW5nLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0l0IHdvdWxkIGJlIHJlYWxseSBuaWNlIHRvIGJlIGFibGUgdG8gd3JpdGUgcGF0dGVybnMgaW4gLnRkIGZpbGVzIGZvciBjb3BpZXMsCit3aGljaCB3b3VsZCBlbGltaW5hdGUgYSBidW5jaCBvZiBleHBsaWNpdCBwcmVkaWNhdGVzIG9uIHRoZW0gKGUuZy4gbm8gc2lkZSAKK2VmZmVjdHMpLiAgT25jZSB0aGlzIGlzIGluIHBsYWNlLCBpdCB3b3VsZCBiZSBldmVuIGJldHRlciB0byBoYXZlIHRibGdlbiAKK3N5bnRoZXNpemUgdGhlIHZhcmlvdXMgY29weSBpbnNlcnRpb24vaW5zcGVjdGlvbiBtZXRob2RzIGluIFRhcmdldEluc3RySW5mby4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTdGFjayBjb2xvcmluZyBpbXByb3ZtZW50czoKKworMS4gRG8gcHJvcGVyIExpdmVTdGFja0FuYWx5c2lzIG9uIGFsbCBzdGFjayBvYmplY3RzIGluY2x1ZGluZyB0aG9zZSB3aGljaCBhcmUKKyAgIG5vdCBzcGlsbCBzbG90cy4KKzIuIFJlb3JkZXIgb2JqZWN0cyB0byBmaWxsIGluIGdhcHMgYmV0d2VlbiBvYmplY3RzLgorICAgZS5nLiA0LCAxLCA8Z2FwPiwgNCwgMSwgMSwgMSwgPGdhcD4sIDQgPT4gNCwgMSwgMSwgMSwgMSwgNCwgNAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZSBzY2hlZHVsZXIgc2hvdWxkIGJlIGFibGUgdG8gc29ydCBuZWFyYnkgaW5zdHJ1Y3Rpb25zIGJ5IHRoZWlyIGFkZHJlc3MuIEZvcgorZXhhbXBsZSwgaW4gYW4gZXhwYW5kZWQgbWVtc2V0IHNlcXVlbmNlIGl0J3Mgbm90IHVuY29tbW9uIHRvIHNlZSBjb2RlIGxpa2UgdGhpczoKKworICBtb3ZsICQwLCA0KCVyZGkpCisgIG1vdmwgJDAsIDgoJXJkaSkKKyAgbW92bCAkMCwgMTIoJXJkaSkKKyAgbW92bCAkMCwgMCglcmRpKQorCitFYWNoIG9mIHRoZSBzdG9yZXMgaXMgaW5kZXBlbmRlbnQsIGFuZCB0aGUgc2NoZWR1bGVyIGlzIGN1cnJlbnRseSBtYWtpbmcgYW4KK2FyYml0cmFyeSBkZWNpc2lvbiBhYm91dCB0aGUgb3JkZXIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQW5vdGhlciBvcHBvcnR1bml0aXkgaW4gdGhpcyBjb2RlIGlzIHRoYXQgdGhlICQwIGNvdWxkIGJlIG1vdmVkIHRvIGEgcmVnaXN0ZXI6CisKKyAgbW92bCAkMCwgNCglcmRpKQorICBtb3ZsICQwLCA4KCVyZGkpCisgIG1vdmwgJDAsIDEyKCVyZGkpCisgIG1vdmwgJDAsIDAoJXJkaSkKKworVGhpcyB3b3VsZCBzYXZlIHN1YnN0YW50aWFsIGNvZGUgc2l6ZSwgZXNwZWNpYWxseSBmb3IgbG9uZ2VyIHNlcXVlbmNlcyBsaWtlCit0aGlzLiBJdCB3b3VsZCBiZSBlYXN5IHRvIGhhdmUgYSBydWxlIHRlbGxpbmcgaXNlbCB0byBhdm9pZCBtYXRjaGluZyBNT1YzMm1pCitpZiB0aGUgaW1tZWRpYXRlIGhhcyBtb3JlIHRoYW4gc29tZSBmaXhlZCBudW1iZXIgb2YgdXNlcy4gSXQncyBtb3JlIGludm9sdmVkCit0byB0ZWFjaCB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIGhvdyB0byBkbyBsYXRlIGZvbGRpbmcgdG8gcmVjb3ZlciBmcm9tCitleGNlc3NpdmUgcmVnaXN0ZXIgcHJlc3N1cmUuCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1JlZ0FsbG9jRmFzdC5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9SZWdBbGxvY0Zhc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjE4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9SZWdBbGxvY0Zhc3QuY3BwCkBAIC0wLDAgKzEsMTAzNyBAQAorLy89PT0tLSBSZWdBbGxvY0Zhc3QuY3BwIC0gQSBmYXN0IHJlZ2lzdGVyIGFsbG9jYXRvciBmb3IgZGVidWcgY29kZSAtLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHJlZ2lzdGVyIGFsbG9jYXRvciBhbGxvY2F0ZXMgcmVnaXN0ZXJzIHRvIGEgYmFzaWMgYmxvY2sgYXQgYSB0aW1lLAorLy8gYXR0ZW1wdGluZyB0byBrZWVwIHZhbHVlcyBpbiByZWdpc3RlcnMgYW5kIHJldXNpbmcgcmVnaXN0ZXJzIGFzIGFwcHJvcHJpYXRlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicmVnYWxsb2MiCisjaW5jbHVkZSAibGx2bS9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdBbGxvY1JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbmRleGVkTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtU3RvcmVzLCAiTnVtYmVyIG9mIHN0b3JlcyBhZGRlZCIpOworU1RBVElTVElDKE51bUxvYWRzICwgIk51bWJlciBvZiBsb2FkcyBhZGRlZCIpOworU1RBVElTVElDKE51bUNvcGllcywgIk51bWJlciBvZiBjb3BpZXMgY29hbGVzY2VkIik7CisKK3N0YXRpYyBSZWdpc3RlclJlZ0FsbG9jCisgIGZhc3RSZWdBbGxvYygiZmFzdCIsICJmYXN0IHJlZ2lzdGVyIGFsbG9jYXRvciIsIGNyZWF0ZUZhc3RSZWdpc3RlckFsbG9jYXRvcik7CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIFJBRmFzdCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworICAgIFJBRmFzdCgpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCksIFN0YWNrU2xvdEZvclZpcnRSZWcoLTEpLAorICAgICAgICAgICAgICAgaXNCdWxrU3BpbGxpbmcoZmFsc2UpIHt9CisgIHByaXZhdGU6CisgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAqVE07CisgICAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisKKyAgICAvLyBCYXNpYyBibG9jayBjdXJyZW50bHkgYmVpbmcgYWxsb2NhdGVkLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkI7CisKKyAgICAvLyBTdGFja1Nsb3RGb3JWaXJ0UmVnIC0gTWFwcyB2aXJ0dWFsIHJlZ3MgdG8gdGhlIGZyYW1lIGluZGV4IHdoZXJlIHRoZXNlCisgICAgLy8gdmFsdWVzIGFyZSBzcGlsbGVkLgorICAgIEluZGV4ZWRNYXA8aW50LCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gU3RhY2tTbG90Rm9yVmlydFJlZzsKKworICAgIC8vIEV2ZXJ5dGhpbmcgd2Uga25vdyBhYm91dCBhIGxpdmUgdmlydHVhbCByZWdpc3Rlci4KKyAgICBzdHJ1Y3QgTGl2ZVJlZyB7CisgICAgICBNYWNoaW5lSW5zdHIgKkxhc3RVc2U7ICAgIC8vIExhc3QgaW5zdHIgdG8gdXNlIHJlZy4KKyAgICAgIHVuc2lnbmVkIFBoeXNSZWc7ICAgICAgICAgLy8gQ3VycmVudGx5IGhlbGQgaGVyZS4KKyAgICAgIHVuc2lnbmVkIHNob3J0IExhc3RPcE51bTsgLy8gT3BOdW0gb24gTGFzdFVzZS4KKyAgICAgIGJvb2wgRGlydHk7ICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgbmVlZHMgc3BpbGwuCisKKyAgICAgIExpdmVSZWcodW5zaWduZWQgcD0wKSA6IExhc3RVc2UoMCksIFBoeXNSZWcocCksIExhc3RPcE51bSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcnR5KGZhbHNlKSB7fQorICAgIH07CisKKyAgICB0eXBlZGVmIERlbnNlTWFwPHVuc2lnbmVkLCBMaXZlUmVnPiBMaXZlUmVnTWFwOworICAgIHR5cGVkZWYgTGl2ZVJlZ01hcDo6dmFsdWVfdHlwZSBMaXZlUmVnRW50cnk7CisKKyAgICAvLyBMaXZlVmlydFJlZ3MgLSBUaGlzIG1hcCBjb250YWlucyBlbnRyaWVzIGZvciBlYWNoIHZpcnR1YWwgcmVnaXN0ZXIKKyAgICAvLyB0aGF0IGlzIGN1cnJlbnRseSBhdmFpbGFibGUgaW4gYSBwaHlzaWNhbCByZWdpc3Rlci4KKyAgICBMaXZlUmVnTWFwIExpdmVWaXJ0UmVnczsKKworICAgIERlbnNlTWFwPHVuc2lnbmVkLCBNYWNoaW5lSW5zdHIgKj4gTGl2ZURiZ1ZhbHVlTWFwOworCisgICAgLy8gUmVnU3RhdGUgLSBUcmFjayB0aGUgc3RhdGUgb2YgYSBwaHlzaWNhbCByZWdpc3Rlci4KKyAgICBlbnVtIFJlZ1N0YXRlIHsKKyAgICAgIC8vIEEgZGlzYWJsZWQgcmVnaXN0ZXIgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiwgYnV0IGFuIGFsaWFzIG1heQorICAgICAgLy8gYmUgaW4gdXNlLiBBIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIG1vdmVkIG91dCBvZiB0aGUgZGlzYWJsZWQgc3RhdGUgaWYKKyAgICAgIC8vIGFsbCBhbGlhc2VzIGFyZSBkaXNhYmxlZC4KKyAgICAgIHJlZ0Rpc2FibGVkLAorCisgICAgICAvLyBBIGZyZWUgcmVnaXN0ZXIgaXMgbm90IGN1cnJlbnRseSBpbiB1c2UgYW5kIGNhbiBiZSBhbGxvY2F0ZWQKKyAgICAgIC8vIGltbWVkaWF0ZWx5IHdpdGhvdXQgY2hlY2tpbmcgYWxpYXNlcy4KKyAgICAgIHJlZ0ZyZWUsCisKKyAgICAgIC8vIEEgcmVzZXJ2ZWQgcmVnaXN0ZXIgaGFzIGJlZW4gYXNzaWduZWQgZXhwb2xpY2l0bHkgKGUuZy4sIHNldHRpbmcgdXAgYQorICAgICAgLy8gY2FsbCBwYXJhbWV0ZXIpLCBhbmQgaXQgcmVtYWlucyByZXNlcnZlZCB1bnRpbCBpdCBpcyB1c2VkLgorICAgICAgcmVnUmVzZXJ2ZWQKKworICAgICAgLy8gQSByZWdpc3RlciBzdGF0ZSBtYXkgYWxzbyBiZSBhIHZpcnR1YWwgcmVnaXN0ZXIgbnVtYmVyLCBpbmRpY2F0aW9uIHRoYXQKKyAgICAgIC8vIHRoZSBwaHlzaWNhbCByZWdpc3RlciBpcyBjdXJyZW50bHkgYWxsb2NhdGVkIHRvIGEgdmlydHVhbCByZWdpc3Rlci4gSW4KKyAgICAgIC8vIHRoYXQgY2FzZSwgTGl2ZVZpcnRSZWdzIGNvbnRhaW5zIHRoZSBpbnZlcnNlIG1hcHBpbmcuCisgICAgfTsKKworICAgIC8vIFBoeXNSZWdTdGF0ZSAtIE9uZSBvZiB0aGUgUmVnU3RhdGUgZW51bXMsIG9yIGEgdmlydHJlZy4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUGh5c1JlZ1N0YXRlOworCisgICAgLy8gVXNlZEluSW5zdHIgLSBCaXRWZWN0b3Igb2YgcGh5c3JlZ3MgdGhhdCBhcmUgdXNlZCBpbiB0aGUgY3VycmVudAorICAgIC8vIGluc3RydWN0aW9uLCBhbmQgc28gY2Fubm90IGJlIGFsbG9jYXRlZC4KKyAgICBCaXRWZWN0b3IgVXNlZEluSW5zdHI7CisKKyAgICAvLyBBbGxvY2F0YWJsZSAtIHZlY3RvciBvZiBhbGxvY2F0YWJsZSBwaHlzaWNhbCByZWdpc3RlcnMuCisgICAgQml0VmVjdG9yIEFsbG9jYXRhYmxlOworCisgICAgLy8gU2tpcHBlZEluc3RycyAtIERlc2NyaXB0b3JzIG9mIGluc3RydWN0aW9ucyB3aG9zZSBjbG9iYmVyIGxpc3Qgd2FzIGlnbm9yZWQKKyAgICAvLyBiZWNhdXNlIGFsbCByZWdpc3RlcnMgd2VyZSBzcGlsbGVkLiBJdCBpcyBzdGlsbCBuZWNlc3NhcnkgdG8gbWFyayBhbGwgdGhlCisgICAgLy8gY2xvYmJlcmVkIHJlZ2lzdGVycyBhcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbi4KKyAgICBTbWFsbFB0clNldDxjb25zdCBUYXJnZXRJbnN0ckRlc2MqLCA0PiBTa2lwcGVkSW5zdHJzOworCisgICAgLy8gaXNCdWxrU3BpbGxpbmcgLSBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gTGl2ZVJlZ01hcCB3aWxsIGJlIGNsZWFyZWQKKyAgICAvLyBjb21wbGV0ZWx5IGFmdGVyIHNwaWxsaW5nIGFsbCBsaXZlIHJlZ2lzdGVycy4gTGl2ZVJlZ01hcCBlbnRyaWVzIHNob3VsZAorICAgIC8vIG5vdCBiZSBlcmFzZWQuCisgICAgYm9vbCBpc0J1bGtTcGlsbGluZzsKKworICAgIGVudW0geworICAgICAgc3BpbGxDbGVhbiA9IDEsCisgICAgICBzcGlsbERpcnR5ID0gMTAwLAorICAgICAgc3BpbGxJbXBvc3NpYmxlID0gfjB1CisgICAgfTsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIkZhc3QgUmVnaXN0ZXIgQWxsb2NhdG9yIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQ0ZHKCk7CisgICAgICBBVS5hZGRSZXF1aXJlZElEKFBISUVsaW1pbmF0aW9uSUQpOworICAgICAgQVUuYWRkUmVxdWlyZWRJRChUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzSUQpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKyAgICB2b2lkIEFsbG9jYXRlQmFzaWNCbG9jaygpOworICAgIHZvaWQgaGFuZGxlVGhyb3VnaE9wZXJhbmRzKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmVmlydERlYWQpOworICAgIGludCBnZXRTdGFja1NwYWNlRm9yKHVuc2lnbmVkIFZpcnRSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKTsKKyAgICBib29sIGlzTGFzdFVzZU9mTG9jYWxSZWcoTWFjaGluZU9wZXJhbmQmKTsKKworICAgIHZvaWQgYWRkS2lsbEZsYWcoY29uc3QgTGl2ZVJlZyYpOworICAgIHZvaWQga2lsbFZpcnRSZWcoTGl2ZVJlZ01hcDo6aXRlcmF0b3IpOworICAgIHZvaWQga2lsbFZpcnRSZWcodW5zaWduZWQgVmlydFJlZyk7CisgICAgdm9pZCBzcGlsbFZpcnRSZWcoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLCBMaXZlUmVnTWFwOjppdGVyYXRvcik7CisgICAgdm9pZCBzcGlsbFZpcnRSZWcoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLCB1bnNpZ25lZCBWaXJ0UmVnKTsKKworICAgIHZvaWQgdXNlUGh5c1JlZyhNYWNoaW5lT3BlcmFuZCYpOworICAgIHZvaWQgZGVmaW5lUGh5c1JlZyhNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBQaHlzUmVnLCBSZWdTdGF0ZSBOZXdTdGF0ZSk7CisgICAgdW5zaWduZWQgY2FsY1NwaWxsQ29zdCh1bnNpZ25lZCBQaHlzUmVnKSBjb25zdDsKKyAgICB2b2lkIGFzc2lnblZpcnRUb1BoeXNSZWcoTGl2ZVJlZ0VudHJ5ICZMUkUsIHVuc2lnbmVkIFBoeXNSZWcpOworICAgIHZvaWQgYWxsb2NWaXJ0UmVnKE1hY2hpbmVJbnN0ciAqTUksIExpdmVSZWdFbnRyeSAmTFJFLCB1bnNpZ25lZCBIaW50KTsKKyAgICBMaXZlUmVnTWFwOjppdGVyYXRvciBkZWZpbmVWaXJ0UmVnKE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmlydFJlZywgdW5zaWduZWQgSGludCk7CisgICAgTGl2ZVJlZ01hcDo6aXRlcmF0b3IgcmVsb2FkVmlydFJlZyhNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZpcnRSZWcsIHVuc2lnbmVkIEhpbnQpOworICAgIHZvaWQgc3BpbGxBbGwoTWFjaGluZUluc3RyICpNSSk7CisgICAgYm9vbCBzZXRQaHlzUmVnKE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTnVtLCB1bnNpZ25lZCBQaHlzUmVnKTsKKyAgfTsKKyAgY2hhciBSQUZhc3Q6OklEID0gMDsKK30KKworLy8vIGdldFN0YWNrU3BhY2VGb3IgLSBUaGlzIGFsbG9jYXRlcyBzcGFjZSBmb3IgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyCisvLy8gdG8gYmUgaGVsZCBvbiB0aGUgc3RhY2suCitpbnQgUkFGYXN0OjpnZXRTdGFja1NwYWNlRm9yKHVuc2lnbmVkIFZpcnRSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSB7CisgIC8vIEZpbmQgdGhlIGxvY2F0aW9uIFJlZyB3b3VsZCBiZWxvbmcuLi4KKyAgaW50IFNTID0gU3RhY2tTbG90Rm9yVmlydFJlZ1tWaXJ0UmVnXTsKKyAgaWYgKFNTICE9IC0xKQorICAgIHJldHVybiBTUzsgICAgICAgICAgLy8gQWxyZWFkeSBoYXMgc3BhY2UgYWxsb2NhdGVkPworCisgIC8vIEFsbG9jYXRlIGEgbmV3IHN0YWNrIG9iamVjdCBmb3IgdGhpcyBzcGlsbCBsb2NhdGlvbi4uLgorICBpbnQgRnJhbWVJZHggPSBNRi0+Z2V0RnJhbWVJbmZvKCktPkNyZWF0ZVNwaWxsU3RhY2tPYmplY3QoUkMtPmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDLT5nZXRBbGlnbm1lbnQoKSk7CisKKyAgLy8gQXNzaWduIHRoZSBzbG90LgorICBTdGFja1Nsb3RGb3JWaXJ0UmVnW1ZpcnRSZWddID0gRnJhbWVJZHg7CisgIHJldHVybiBGcmFtZUlkeDsKK30KKworLy8vIGlzTGFzdFVzZU9mTG9jYWxSZWcgLSBSZXR1cm4gdHJ1ZSBpZiBNTyBpcyB0aGUgb25seSByZW1haW5pbmcgcmVmZXJlbmNlIHRvCisvLy8gaXRzIHZpcnR1YWwgcmVnaXN0ZXIsIGFuZCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEgYmxvY2stbG9jYWwgcmVnaXN0ZXIuCisvLy8KK2Jvb2wgUkFGYXN0Ojppc0xhc3RVc2VPZkxvY2FsUmVnKE1hY2hpbmVPcGVyYW5kICZNTykgeworICAvLyBDaGVjayBmb3Igbm9uLWRlYnVnIHVzZXMgb3IgZGVmcyBmb2xsb3dpbmcgTU8uCisgIC8vIFRoaXMgaXMgdGhlIG1vc3QgbGlrZWx5IHdheSB0byBmYWlsIC0gZmFzdCBwYXRoIGl0LgorICBNYWNoaW5lT3BlcmFuZCAqTmV4dCA9ICZNTzsKKyAgd2hpbGUgKChOZXh0ID0gTmV4dC0+Z2V0TmV4dE9wZXJhbmRGb3JSZWcoKSkpCisgICAgaWYgKCFOZXh0LT5pc0RlYnVnKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhlIHJlZ2lzdGVyIGhhcyBldmVyIGJlZW4gc3BpbGxlZCBvciByZWxvYWRlZCwgd2UgY29uc2VydmF0aXZlbHkgYXNzdW1lCisgIC8vIGl0IGlzIGEgZ2xvYmFsIHJlZ2lzdGVyIHVzZWQgaW4gbXVsdGlwbGUgYmxvY2tzLgorICBpZiAoU3RhY2tTbG90Rm9yVmlydFJlZ1tNTy5nZXRSZWcoKV0gIT0gLTEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHVzZS9kZWYgY2hhaW4gaGFzIGV4YWN0bHkgb25lIG9wZXJhbmQgLSBNTy4KKyAgcmV0dXJuICZNUkktPnJlZ19ub2RiZ19iZWdpbihNTy5nZXRSZWcoKSkuZ2V0T3BlcmFuZCgpID09ICZNTzsKK30KKworLy8vIGFkZEtpbGxGbGFnIC0gU2V0IGtpbGwgZmxhZ3Mgb24gbGFzdCB1c2Ugb2YgYSB2aXJ0dWFsIHJlZ2lzdGVyLgordm9pZCBSQUZhc3Q6OmFkZEtpbGxGbGFnKGNvbnN0IExpdmVSZWcgJkxSKSB7CisgIGlmICghTFIuTGFzdFVzZSkgcmV0dXJuOworICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBMUi5MYXN0VXNlLT5nZXRPcGVyYW5kKExSLkxhc3RPcE51bSk7CisgIGlmIChNTy5pc1VzZSgpICYmICFMUi5MYXN0VXNlLT5pc1JlZ1RpZWRUb0RlZk9wZXJhbmQoTFIuTGFzdE9wTnVtKSkgeworICAgIGlmIChNTy5nZXRSZWcoKSA9PSBMUi5QaHlzUmVnKQorICAgICAgTU8uc2V0SXNLaWxsKCk7CisgICAgZWxzZQorICAgICAgTFIuTGFzdFVzZS0+YWRkUmVnaXN0ZXJLaWxsZWQoTFIuUGh5c1JlZywgVFJJLCB0cnVlKTsKKyAgfQorfQorCisvLy8ga2lsbFZpcnRSZWcgLSBNYXJrIHZpcnRyZWcgYXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KK3ZvaWQgUkFGYXN0OjpraWxsVmlydFJlZyhMaXZlUmVnTWFwOjppdGVyYXRvciBMUkkpIHsKKyAgYWRkS2lsbEZsYWcoTFJJLT5zZWNvbmQpOworICBjb25zdCBMaXZlUmVnICZMUiA9IExSSS0+c2Vjb25kOworICBhc3NlcnQoUGh5c1JlZ1N0YXRlW0xSLlBoeXNSZWddID09IExSSS0+Zmlyc3QgJiYgIkJyb2tlbiBSZWdTdGF0ZSBtYXBwaW5nIik7CisgIFBoeXNSZWdTdGF0ZVtMUi5QaHlzUmVnXSA9IHJlZ0ZyZWU7CisgIC8vIEVyYXNlIGZyb20gTGl2ZVZpcnRSZWdzIHVubGVzcyB3ZSdyZSBzcGlsbGluZyBpbiBidWxrLgorICBpZiAoIWlzQnVsa1NwaWxsaW5nKQorICAgIExpdmVWaXJ0UmVncy5lcmFzZShMUkkpOworfQorCisvLy8ga2lsbFZpcnRSZWcgLSBNYXJrIHZpcnRyZWcgYXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KK3ZvaWQgUkFGYXN0OjpraWxsVmlydFJlZyh1bnNpZ25lZCBWaXJ0UmVnKSB7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFZpcnRSZWcpICYmCisgICAgICAgICAia2lsbFZpcnRSZWcgbmVlZHMgYSB2aXJ0dWFsIHJlZ2lzdGVyIik7CisgIExpdmVSZWdNYXA6Oml0ZXJhdG9yIExSSSA9IExpdmVWaXJ0UmVncy5maW5kKFZpcnRSZWcpOworICBpZiAoTFJJICE9IExpdmVWaXJ0UmVncy5lbmQoKSkKKyAgICBraWxsVmlydFJlZyhMUkkpOworfQorCisvLy8gc3BpbGxWaXJ0UmVnIC0gVGhpcyBtZXRob2Qgc3BpbGxzIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgVmlydFJlZyBpbnRvIHRoZQorLy8vIGNvcnJlc3BvbmRpbmcgc3RhY2sgc2xvdCBpZiBuZWVkZWQuIElmIGlzS2lsbCBpcyBzZXQsIHRoZSByZWdpc3RlciBpcyBhbHNvCisvLy8ga2lsbGVkLgordm9pZCBSQUZhc3Q6OnNwaWxsVmlydFJlZyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksIHVuc2lnbmVkIFZpcnRSZWcpIHsKKyAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoVmlydFJlZykgJiYKKyAgICAgICAgICJTcGlsbGluZyBhIHBoeXNpY2FsIHJlZ2lzdGVyIGlzIGlsbGVnYWwhIik7CisgIExpdmVSZWdNYXA6Oml0ZXJhdG9yIExSSSA9IExpdmVWaXJ0UmVncy5maW5kKFZpcnRSZWcpOworICBhc3NlcnQoTFJJICE9IExpdmVWaXJ0UmVncy5lbmQoKSAmJiAiU3BpbGxpbmcgdW5tYXBwZWQgdmlydHVhbCByZWdpc3RlciIpOworICBzcGlsbFZpcnRSZWcoTUksIExSSSk7Cit9CisKKy8vLyBzcGlsbFZpcnRSZWcgLSBEbyB0aGUgYWN0dWFsIHdvcmsgb2Ygc3BpbGxpbmcuCit2b2lkIFJBRmFzdDo6c3BpbGxWaXJ0UmVnKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVJlZ01hcDo6aXRlcmF0b3IgTFJJKSB7CisgIExpdmVSZWcgJkxSID0gTFJJLT5zZWNvbmQ7CisgIGFzc2VydChQaHlzUmVnU3RhdGVbTFIuUGh5c1JlZ10gPT0gTFJJLT5maXJzdCAmJiAiQnJva2VuIFJlZ1N0YXRlIG1hcHBpbmciKTsKKworICBpZiAoTFIuRGlydHkpIHsKKyAgICAvLyBJZiB0aGlzIHBoeXNyZWcgaXMgdXNlZCBieSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHdhbnQgdG8ga2lsbCBpdCBvbiB0aGUKKyAgICAvLyBpbnN0cnVjdGlvbiwgbm90IG9uIHRoZSBzcGlsbC4KKyAgICBib29sIFNwaWxsS2lsbCA9IExSLkxhc3RVc2UgIT0gTUk7CisgICAgTFIuRGlydHkgPSBmYWxzZTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlNwaWxsaW5nICVyZWciIDw8IExSSS0+Zmlyc3QKKyAgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IFRSSS0+Z2V0TmFtZShMUi5QaHlzUmVnKSk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBNUkktPmdldFJlZ0NsYXNzKExSSS0+Zmlyc3QpOworICAgIGludCBGSSA9IGdldFN0YWNrU3BhY2VGb3IoTFJJLT5maXJzdCwgUkMpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiIHRvIHN0YWNrIHNsb3QgIyIgPDwgRkkgPDwgIlxuIik7CisgICAgVElJLT5zdG9yZVJlZ1RvU3RhY2tTbG90KCpNQkIsIE1JLCBMUi5QaHlzUmVnLCBTcGlsbEtpbGwsIEZJLCBSQywgVFJJKTsKKyAgICArK051bVN0b3JlczsgICAvLyBVcGRhdGUgc3RhdGlzdGljcworCisgICAgLy8gSWYgdGhpcyByZWdpc3RlciBpcyB1c2VkIGJ5IERCR19WQUxVRSB0aGVuIGluc2VydCBuZXcgREJHX1ZBTFVFIHRvIAorICAgIC8vIGlkZW50aWZ5IHNwaWxsZWQgbG9jYXRpb24gYXMgdGhlIHBsYWNlIHRvIGZpbmQgY29ycmVzcG9uZGluZyB2YXJpYWJsZSdzCisgICAgLy8gdmFsdWUuCisgICAgaWYgKE1hY2hpbmVJbnN0ciAqREJHID0gTGl2ZURiZ1ZhbHVlTWFwLmxvb2t1cChMUkktPmZpcnN0KSkgeworICAgICAgY29uc3QgTUROb2RlICpNRFB0ciA9IAorICAgICAgICBEQkctPmdldE9wZXJhbmQoREJHLT5nZXROdW1PcGVyYW5kcygpLTEpLmdldE1ldGFkYXRhKCk7CisgICAgICBpbnQ2NF90IE9mZnNldCA9IDA7CisgICAgICBpZiAoREJHLT5nZXRPcGVyYW5kKDEpLmlzSW1tKCkpCisgICAgICAgIE9mZnNldCA9IERCRy0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKTsKKyAgICAgIERlYnVnTG9jIERMOworICAgICAgaWYgKE1JID09IE1CQi0+ZW5kKCkpIHsKKyAgICAgICAgLy8gSWYgTUkgaXMgYXQgYmFzaWMgYmxvY2sgZW5kIHRoZW4gdXNlIGxhc3QgaW5zdHJ1Y3Rpb24ncyBsb2NhdGlvbi4KKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVJID0gTUk7CisgICAgICAgIERMID0gKC0tRUkpLT5nZXREZWJ1Z0xvYygpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBETCA9IE1JLT5nZXREZWJ1Z0xvYygpOworICAgICAgaWYgKE1hY2hpbmVJbnN0ciAqTmV3RFYgPSAKKyAgICAgICAgICBUSUktPmVtaXRGcmFtZUluZGV4RGVidWdWYWx1ZSgqTUYsIEZJLCBPZmZzZXQsIE1EUHRyLCBETCkpIHsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IERCRy0+Z2V0UGFyZW50KCk7CisgICAgICAgIE1CQi0+aW5zZXJ0KE1JLCBOZXdEVik7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiSW5zZXJ0aW5nIGRlYnVnIGluZm8gZHVlIHRvIHNwaWxsOiIgPDwgIlxuIiA8PCAqTmV3RFYpOworICAgICAgICBMaXZlRGJnVmFsdWVNYXBbTFJJLT5maXJzdF0gPSBOZXdEVjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKFNwaWxsS2lsbCkKKyAgICAgIExSLkxhc3RVc2UgPSAwOyAvLyBEb24ndCBraWxsIHJlZ2lzdGVyIGFnYWluCisgIH0KKyAga2lsbFZpcnRSZWcoTFJJKTsKK30KKworLy8vIHNwaWxsQWxsIC0gU3BpbGwgYWxsIGRpcnR5IHZpcnRyZWdzIHdpdGhvdXQga2lsbGluZyB0aGVtLgordm9pZCBSQUZhc3Q6OnNwaWxsQWxsKE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgaWYgKExpdmVWaXJ0UmVncy5lbXB0eSgpKSByZXR1cm47CisgIGlzQnVsa1NwaWxsaW5nID0gdHJ1ZTsKKyAgLy8gVGhlIExpdmVSZWdNYXAgaXMga2V5ZWQgYnkgYW4gdW5zaWduZWQgKHRoZSB2aXJ0cmVnIG51bWJlciksIHNvIHRoZSBvcmRlcgorICAvLyBvZiBzcGlsbGluZyBoZXJlIGlzIGRldGVybWluaXN0aWMsIGlmIGFyYml0cmFyeS4KKyAgZm9yIChMaXZlUmVnTWFwOjppdGVyYXRvciBpID0gTGl2ZVZpcnRSZWdzLmJlZ2luKCksIGUgPSBMaXZlVmlydFJlZ3MuZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpCisgICAgc3BpbGxWaXJ0UmVnKE1JLCBpKTsKKyAgTGl2ZVZpcnRSZWdzLmNsZWFyKCk7CisgIGlzQnVsa1NwaWxsaW5nID0gZmFsc2U7Cit9CisKKy8vLyB1c2VQaHlzUmVnIC0gSGFuZGxlIHRoZSBkaXJlY3QgdXNlIG9mIGEgcGh5c2ljYWwgcmVnaXN0ZXIuCisvLy8gQ2hlY2sgdGhhdCB0aGUgcmVnaXN0ZXIgaXMgbm90IHVzZWQgYnkgYSB2aXJ0cmVnLgorLy8vIEtpbGwgdGhlIHBoeXNyZWcsIG1hcmtpbmcgaXQgZnJlZS4KKy8vLyBUaGlzIG1heSBhZGQgaW1wbGljaXQga2lsbHMgdG8gTU8tPmdldFBhcmVudCgpIGFuZCBpbnZhbGlkYXRlIE1PLgordm9pZCBSQUZhc3Q6OnVzZVBoeXNSZWcoTWFjaGluZU9wZXJhbmQgJk1PKSB7CisgIHVuc2lnbmVkIFBoeXNSZWcgPSBNTy5nZXRSZWcoKTsKKyAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFBoeXNSZWcpICYmCisgICAgICAgICAiQmFkIHVzZVBoeXNSZWcgb3BlcmFuZCIpOworCisgIHN3aXRjaCAoUGh5c1JlZ1N0YXRlW1BoeXNSZWddKSB7CisgIGNhc2UgcmVnRGlzYWJsZWQ6CisgICAgYnJlYWs7CisgIGNhc2UgcmVnUmVzZXJ2ZWQ6CisgICAgUGh5c1JlZ1N0YXRlW1BoeXNSZWddID0gcmVnRnJlZTsKKyAgICAvLyBGYWxsIHRocm91Z2gKKyAgY2FzZSByZWdGcmVlOgorICAgIFVzZWRJbkluc3RyLnNldChQaHlzUmVnKTsKKyAgICBNTy5zZXRJc0tpbGwoKTsKKyAgICByZXR1cm47CisgIGRlZmF1bHQ6CisgICAgLy8gVGhlIHBoeXNyZWcgd2FzIGFsbG9jYXRlZCB0byBhIHZpcnR1YWwgcmVnaXN0ZXIuIFRoYXQgbWVhbnMgdG8gdmFsdWUgd2UKKyAgICAvLyB3YW50ZWQgaGFzIGJlZW4gY2xvYmJlcmVkLgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkluc3RydWN0aW9uIHVzZXMgYW4gYWxsb2NhdGVkIHJlZ2lzdGVyIik7CisgIH0KKworICAvLyBNYXliZSBhIHN1cGVycmVnaXN0ZXIgaXMgcmVzZXJ2ZWQ/CisgIGZvciAoY29uc3QgdW5zaWduZWQgKkFTID0gVFJJLT5nZXRBbGlhc1NldChQaHlzUmVnKTsKKyAgICAgICB1bnNpZ25lZCBBbGlhcyA9ICpBUzsgKytBUykgeworICAgIHN3aXRjaCAoUGh5c1JlZ1N0YXRlW0FsaWFzXSkgeworICAgIGNhc2UgcmVnRGlzYWJsZWQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIHJlZ1Jlc2VydmVkOgorICAgICAgYXNzZXJ0KFRSSS0+aXNTdXBlclJlZ2lzdGVyKFBoeXNSZWcsIEFsaWFzKSAmJgorICAgICAgICAgICAgICJJbnN0cnVjdGlvbiBpcyBub3QgdXNpbmcgYSBzdWJyZWdpc3RlciBvZiBhIHJlc2VydmVkIHJlZ2lzdGVyIik7CisgICAgICAvLyBMZWF2ZSB0aGUgc3VwZXJyZWdpc3RlciBpbiB0aGUgd29ya2luZyBzZXQuCisgICAgICBQaHlzUmVnU3RhdGVbQWxpYXNdID0gcmVnRnJlZTsKKyAgICAgIFVzZWRJbkluc3RyLnNldChBbGlhcyk7CisgICAgICBNTy5nZXRQYXJlbnQoKS0+YWRkUmVnaXN0ZXJLaWxsZWQoQWxpYXMsIFRSSSwgdHJ1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSByZWdGcmVlOgorICAgICAgaWYgKFRSSS0+aXNTdXBlclJlZ2lzdGVyKFBoeXNSZWcsIEFsaWFzKSkgeworICAgICAgICAvLyBMZWF2ZSB0aGUgc3VwZXJyZWdpc3RlciBpbiB0aGUgd29ya2luZyBzZXQuCisgICAgICAgIFVzZWRJbkluc3RyLnNldChBbGlhcyk7CisgICAgICAgIE1PLmdldFBhcmVudCgpLT5hZGRSZWdpc3RlcktpbGxlZChBbGlhcywgVFJJLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy8gU29tZSBvdGhlciBhbGlhcyB3YXMgaW4gdGhlIHdvcmtpbmcgc2V0IC0gY2xlYXIgaXQuCisgICAgICBQaHlzUmVnU3RhdGVbQWxpYXNdID0gcmVnRGlzYWJsZWQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW5zdHJ1Y3Rpb24gdXNlcyBhbiBhbGlhcyBvZiBhbiBhbGxvY2F0ZWQgcmVnaXN0ZXIiKTsKKyAgICB9CisgIH0KKworICAvLyBBbGwgYWxpYXNlcyBhcmUgZGlzYWJsZWQsIGJyaW5nIHJlZ2lzdGVyIGludG8gd29ya2luZyBzZXQuCisgIFBoeXNSZWdTdGF0ZVtQaHlzUmVnXSA9IHJlZ0ZyZWU7CisgIFVzZWRJbkluc3RyLnNldChQaHlzUmVnKTsKKyAgTU8uc2V0SXNLaWxsKCk7Cit9CisKKy8vLyBkZWZpbmVQaHlzUmVnIC0gTWFyayBQaHlzUmVnIGFzIHJlc2VydmVkIG9yIGZyZWUgYWZ0ZXIgc3BpbGxpbmcgYW55CisvLy8gdmlydHJlZ3MuIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGRlZmluZVZpcnRSZWcgZXhjZXB0IHRoZSBwaHlzcmVnIGlzCisvLy8gcmVzZXJ2ZWQgaW5zdGVhZCBvZiBhbGxvY2F0ZWQuCit2b2lkIFJBRmFzdDo6ZGVmaW5lUGh5c1JlZyhNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBQaHlzUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU3RhdGUgTmV3U3RhdGUpIHsKKyAgVXNlZEluSW5zdHIuc2V0KFBoeXNSZWcpOworICBzd2l0Y2ggKHVuc2lnbmVkIFZpcnRSZWcgPSBQaHlzUmVnU3RhdGVbUGh5c1JlZ10pIHsKKyAgY2FzZSByZWdEaXNhYmxlZDoKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBzcGlsbFZpcnRSZWcoTUksIFZpcnRSZWcpOworICAgIC8vIEZhbGwgdGhyb3VnaC4KKyAgY2FzZSByZWdGcmVlOgorICBjYXNlIHJlZ1Jlc2VydmVkOgorICAgIFBoeXNSZWdTdGF0ZVtQaHlzUmVnXSA9IE5ld1N0YXRlOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRoaXMgaXMgYSBkaXNhYmxlZCByZWdpc3RlciwgZGlzYWJsZSBhbGwgYWxpYXNlcy4KKyAgUGh5c1JlZ1N0YXRlW1BoeXNSZWddID0gTmV3U3RhdGU7CisgIGZvciAoY29uc3QgdW5zaWduZWQgKkFTID0gVFJJLT5nZXRBbGlhc1NldChQaHlzUmVnKTsKKyAgICAgICB1bnNpZ25lZCBBbGlhcyA9ICpBUzsgKytBUykgeworICAgIFVzZWRJbkluc3RyLnNldChBbGlhcyk7CisgICAgc3dpdGNoICh1bnNpZ25lZCBWaXJ0UmVnID0gUGh5c1JlZ1N0YXRlW0FsaWFzXSkgeworICAgIGNhc2UgcmVnRGlzYWJsZWQ6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc3BpbGxWaXJ0UmVnKE1JLCBWaXJ0UmVnKTsKKyAgICAgIC8vIEZhbGwgdGhyb3VnaC4KKyAgICBjYXNlIHJlZ0ZyZWU6CisgICAgY2FzZSByZWdSZXNlcnZlZDoKKyAgICAgIFBoeXNSZWdTdGF0ZVtBbGlhc10gPSByZWdEaXNhYmxlZDsKKyAgICAgIGlmIChUUkktPmlzU3VwZXJSZWdpc3RlcihQaHlzUmVnLCBBbGlhcykpCisgICAgICAgIHJldHVybjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKKy8vIGNhbGNTcGlsbENvc3QgLSBSZXR1cm4gdGhlIGNvc3Qgb2Ygc3BpbGxpbmcgY2xlYXJpbmcgb3V0IFBoeXNSZWcgYW5kCisvLyBhbGlhc2VzIHNvIGl0IGlzIGZyZWUgZm9yIGFsbG9jYXRpb24uCisvLyBSZXR1cm5zIDAgd2hlbiBQaHlzUmVnIGlzIGZyZWUgb3IgZGlzYWJsZWQgd2l0aCBhbGwgYWxpYXNlcyBkaXNhYmxlZCAtIGl0CisvLyBjYW4gYmUgYWxsb2NhdGVkIGRpcmVjdGx5LgorLy8gUmV0dXJucyBzcGlsbEltcG9zc2libGUgd2hlbiBQaHlzUmVnIG9yIGFuIGFsaWFzIGNhbid0IGJlIHNwaWxsZWQuCit1bnNpZ25lZCBSQUZhc3Q6OmNhbGNTcGlsbENvc3QodW5zaWduZWQgUGh5c1JlZykgY29uc3QgeworICBpZiAoVXNlZEluSW5zdHIudGVzdChQaHlzUmVnKSkKKyAgICByZXR1cm4gc3BpbGxJbXBvc3NpYmxlOworICBzd2l0Y2ggKHVuc2lnbmVkIFZpcnRSZWcgPSBQaHlzUmVnU3RhdGVbUGh5c1JlZ10pIHsKKyAgY2FzZSByZWdEaXNhYmxlZDoKKyAgICBicmVhazsKKyAgY2FzZSByZWdGcmVlOgorICAgIHJldHVybiAwOworICBjYXNlIHJlZ1Jlc2VydmVkOgorICAgIHJldHVybiBzcGlsbEltcG9zc2libGU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIExpdmVWaXJ0UmVncy5sb29rdXAoVmlydFJlZykuRGlydHkgPyBzcGlsbERpcnR5IDogc3BpbGxDbGVhbjsKKyAgfQorCisgIC8vIFRoaXMgaXMgYSBkaXNhYmxlZCByZWdpc3RlciwgYWRkIHVwIGNvbnN0IG9mIGFsaWFzZXMuCisgIHVuc2lnbmVkIENvc3QgPSAwOworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBUyA9IFRSSS0+Z2V0QWxpYXNTZXQoUGh5c1JlZyk7CisgICAgICAgdW5zaWduZWQgQWxpYXMgPSAqQVM7ICsrQVMpIHsKKyAgICBpZiAoVXNlZEluSW5zdHIudGVzdChBbGlhcykpCisgICAgICByZXR1cm4gc3BpbGxJbXBvc3NpYmxlOworICAgIHN3aXRjaCAodW5zaWduZWQgVmlydFJlZyA9IFBoeXNSZWdTdGF0ZVtBbGlhc10pIHsKKyAgICBjYXNlIHJlZ0Rpc2FibGVkOgorICAgICAgYnJlYWs7CisgICAgY2FzZSByZWdGcmVlOgorICAgICAgKytDb3N0OworICAgICAgYnJlYWs7CisgICAgY2FzZSByZWdSZXNlcnZlZDoKKyAgICAgIHJldHVybiBzcGlsbEltcG9zc2libGU7CisgICAgZGVmYXVsdDoKKyAgICAgIENvc3QgKz0gTGl2ZVZpcnRSZWdzLmxvb2t1cChWaXJ0UmVnKS5EaXJ0eSA/IHNwaWxsRGlydHkgOiBzcGlsbENsZWFuOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBDb3N0OworfQorCisKKy8vLyBhc3NpZ25WaXJ0VG9QaHlzUmVnIC0gVGhpcyBtZXRob2QgdXBkYXRlcyBsb2NhbCBzdGF0ZSBzbyB0aGF0IHdlIGtub3cKKy8vLyB0aGF0IFBoeXNSZWcgaXMgdGhlIHByb3BlciBjb250YWluZXIgZm9yIFZpcnRSZWcgbm93LiAgVGhlIHBoeXNpY2FsCisvLy8gcmVnaXN0ZXIgbXVzdCBub3QgYmUgdXNlZCBmb3IgYW55dGhpbmcgZWxzZSB3aGVuIHRoaXMgaXMgY2FsbGVkLgorLy8vCit2b2lkIFJBRmFzdDo6YXNzaWduVmlydFRvUGh5c1JlZyhMaXZlUmVnRW50cnkgJkxSRSwgdW5zaWduZWQgUGh5c1JlZykgeworICBERUJVRyhkYmdzKCkgPDwgIkFzc2lnbmluZyAlcmVnIiA8PCBMUkUuZmlyc3QgPDwgIiB0byAiCisgICAgICAgICAgICAgICA8PCBUUkktPmdldE5hbWUoUGh5c1JlZykgPDwgIlxuIik7CisgIFBoeXNSZWdTdGF0ZVtQaHlzUmVnXSA9IExSRS5maXJzdDsKKyAgYXNzZXJ0KCFMUkUuc2Vjb25kLlBoeXNSZWcgJiYgIkFscmVhZHkgYXNzaWduZWQgYSBwaHlzcmVnIik7CisgIExSRS5zZWNvbmQuUGh5c1JlZyA9IFBoeXNSZWc7Cit9CisKKy8vLyBhbGxvY1ZpcnRSZWcgLSBBbGxvY2F0ZSBhIHBoeXNpY2FsIHJlZ2lzdGVyIGZvciBWaXJ0UmVnLgordm9pZCBSQUZhc3Q6OmFsbG9jVmlydFJlZyhNYWNoaW5lSW5zdHIgKk1JLCBMaXZlUmVnRW50cnkgJkxSRSwgdW5zaWduZWQgSGludCkgeworICBjb25zdCB1bnNpZ25lZCBWaXJ0UmVnID0gTFJFLmZpcnN0OworCisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFZpcnRSZWcpICYmCisgICAgICAgICAiQ2FuIG9ubHkgYWxsb2NhdGUgdmlydHVhbCByZWdpc3RlcnMiKTsKKworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IE1SSS0+Z2V0UmVnQ2xhc3MoVmlydFJlZyk7CisKKyAgLy8gSWdub3JlIGludmFsaWQgaGludHMuCisgIGlmIChIaW50ICYmICghVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoSGludCkgfHwKKyAgICAgICAgICAgICAgICFSQy0+Y29udGFpbnMoSGludCkgfHwgIUFsbG9jYXRhYmxlLnRlc3QoSGludCkpKQorICAgIEhpbnQgPSAwOworCisgIC8vIFRha2UgaGludCB3aGVuIHBvc3NpYmxlLgorICBpZiAoSGludCkgeworICAgIHN3aXRjaChjYWxjU3BpbGxDb3N0KEhpbnQpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGRlZmluZVBoeXNSZWcoTUksIEhpbnQsIHJlZ0ZyZWUpOworICAgICAgLy8gRmFsbCB0aHJvdWdoLgorICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiBhc3NpZ25WaXJ0VG9QaHlzUmVnKExSRSwgSGludCk7CisgICAgY2FzZSBzcGlsbEltcG9zc2libGU6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvciBBT0IgPSBSQy0+YWxsb2NhdGlvbl9vcmRlcl9iZWdpbigqTUYpOworICBUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvciBBT0UgPSBSQy0+YWxsb2NhdGlvbl9vcmRlcl9lbmQoKk1GKTsKKworICAvLyBGaXJzdCB0cnkgdG8gZmluZCBhIGNvbXBsZXRlbHkgZnJlZSByZWdpc3Rlci4KKyAgZm9yIChUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvciBJID0gQU9COyBJICE9IEFPRTsgKytJKSB7CisgICAgdW5zaWduZWQgUGh5c1JlZyA9ICpJOworICAgIGlmIChQaHlzUmVnU3RhdGVbUGh5c1JlZ10gPT0gcmVnRnJlZSAmJiAhVXNlZEluSW5zdHIudGVzdChQaHlzUmVnKSkKKyAgICAgIHJldHVybiBhc3NpZ25WaXJ0VG9QaHlzUmVnKExSRSwgUGh5c1JlZyk7CisgIH0KKworICBERUJVRyhkYmdzKCkgPDwgIkFsbG9jYXRpbmcgJXJlZyIgPDwgVmlydFJlZyA8PCAiIGZyb20gIiA8PCBSQy0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXG4iKTsKKworICB1bnNpZ25lZCBCZXN0UmVnID0gMCwgQmVzdENvc3QgPSBzcGlsbEltcG9zc2libGU7CisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJDbGFzczo6aXRlcmF0b3IgSSA9IEFPQjsgSSAhPSBBT0U7ICsrSSkgeworICAgIHVuc2lnbmVkIENvc3QgPSBjYWxjU3BpbGxDb3N0KCpJKTsKKyAgICAvLyBDb3N0IGlzIDAgd2hlbiBhbGwgYWxpYXNlcyBhcmUgYWxyZWFkeSBkaXNhYmxlZC4KKyAgICBpZiAoQ29zdCA9PSAwKQorICAgICAgcmV0dXJuIGFzc2lnblZpcnRUb1BoeXNSZWcoTFJFLCAqSSk7CisgICAgaWYgKENvc3QgPCBCZXN0Q29zdCkKKyAgICAgIEJlc3RSZWcgPSAqSSwgQmVzdENvc3QgPSBDb3N0OworICB9CisKKyAgaWYgKEJlc3RSZWcpIHsKKyAgICBkZWZpbmVQaHlzUmVnKE1JLCBCZXN0UmVnLCByZWdGcmVlKTsKKyAgICByZXR1cm4gYXNzaWduVmlydFRvUGh5c1JlZyhMUkUsIEJlc3RSZWcpOworICB9CisKKyAgLy8gTm90aGluZyB3ZSBjYW4gZG8uCisgIHN0ZDo6c3RyaW5nIG1zZzsKKyAgcmF3X3N0cmluZ19vc3RyZWFtIE1zZyhtc2cpOworICBNc2cgPDwgIlJhbiBvdXQgb2YgcmVnaXN0ZXJzIGR1cmluZyByZWdpc3RlciBhbGxvY2F0aW9uISI7CisgIHJlcG9ydF9mYXRhbF9lcnJvcihNc2cuc3RyKCkpOworfQorCisvLy8gZGVmaW5lVmlydFJlZyAtIEFsbG9jYXRlIGEgcmVnaXN0ZXIgZm9yIFZpcnRSZWcgYW5kIG1hcmsgaXQgYXMgZGlydHkuCitSQUZhc3Q6OkxpdmVSZWdNYXA6Oml0ZXJhdG9yCitSQUZhc3Q6OmRlZmluZVZpcnRSZWcoTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmlydFJlZywgdW5zaWduZWQgSGludCkgeworICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihWaXJ0UmVnKSAmJgorICAgICAgICAgIk5vdCBhIHZpcnR1YWwgcmVnaXN0ZXIiKTsKKyAgTGl2ZVJlZ01hcDo6aXRlcmF0b3IgTFJJOworICBib29sIE5ldzsKKyAgdGllKExSSSwgTmV3KSA9IExpdmVWaXJ0UmVncy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoVmlydFJlZywgTGl2ZVJlZygpKSk7CisgIExpdmVSZWcgJkxSID0gTFJJLT5zZWNvbmQ7CisgIGlmIChOZXcpIHsKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBoaW50LCBwZWVrIGF0IHRoZSBvbmx5IHVzZSBvZiB0aGlzIHJlZ2lzdGVyLgorICAgIGlmICgoIUhpbnQgfHwgIVRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKEhpbnQpKSAmJgorICAgICAgICBNUkktPmhhc09uZU5vbkRCR1VzZShWaXJ0UmVnKSkgeworICAgICAgY29uc3QgTWFjaGluZUluc3RyICZVc2VNSSA9ICpNUkktPnVzZV9ub2RiZ19iZWdpbihWaXJ0UmVnKTsKKyAgICAgIC8vIEl0J3MgYSBjb3B5LCB1c2UgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGFzIGEgaGludC4KKyAgICAgIGlmIChVc2VNSS5pc0NvcHlMaWtlKCkpCisgICAgICAgIEhpbnQgPSBVc2VNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIH0KKyAgICBhbGxvY1ZpcnRSZWcoTUksICpMUkksIEhpbnQpOworICB9IGVsc2UgaWYgKExSLkxhc3RVc2UpIHsKKyAgICAvLyBSZWRlZmluaW5nIGEgbGl2ZSByZWdpc3RlciAtIGtpbGwgYXQgdGhlIGxhc3QgdXNlLCB1bmxlc3MgaXQgaXMgdGhpcworICAgIC8vIGluc3RydWN0aW9uIGRlZmluaW5nIFZpcnRSZWcgbXVsdGlwbGUgdGltZXMuCisgICAgaWYgKExSLkxhc3RVc2UgIT0gTUkgfHwgTFIuTGFzdFVzZS0+Z2V0T3BlcmFuZChMUi5MYXN0T3BOdW0pLmlzVXNlKCkpCisgICAgICBhZGRLaWxsRmxhZyhMUik7CisgIH0KKyAgYXNzZXJ0KExSLlBoeXNSZWcgJiYgIlJlZ2lzdGVyIG5vdCBhc3NpZ25lZCIpOworICBMUi5MYXN0VXNlID0gTUk7CisgIExSLkxhc3RPcE51bSA9IE9wTnVtOworICBMUi5EaXJ0eSA9IHRydWU7CisgIFVzZWRJbkluc3RyLnNldChMUi5QaHlzUmVnKTsKKyAgcmV0dXJuIExSSTsKK30KKworLy8vIHJlbG9hZFZpcnRSZWcgLSBNYWtlIHN1cmUgVmlydFJlZyBpcyBhdmFpbGFibGUgaW4gYSBwaHlzcmVnIGFuZCByZXR1cm4gaXQuCitSQUZhc3Q6OkxpdmVSZWdNYXA6Oml0ZXJhdG9yCitSQUZhc3Q6OnJlbG9hZFZpcnRSZWcoTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmlydFJlZywgdW5zaWduZWQgSGludCkgeworICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihWaXJ0UmVnKSAmJgorICAgICAgICAgIk5vdCBhIHZpcnR1YWwgcmVnaXN0ZXIiKTsKKyAgTGl2ZVJlZ01hcDo6aXRlcmF0b3IgTFJJOworICBib29sIE5ldzsKKyAgdGllKExSSSwgTmV3KSA9IExpdmVWaXJ0UmVncy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoVmlydFJlZywgTGl2ZVJlZygpKSk7CisgIExpdmVSZWcgJkxSID0gTFJJLT5zZWNvbmQ7CisgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgaWYgKE5ldykgeworICAgIGFsbG9jVmlydFJlZyhNSSwgKkxSSSwgSGludCk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBNUkktPmdldFJlZ0NsYXNzKFZpcnRSZWcpOworICAgIGludCBGcmFtZUluZGV4ID0gZ2V0U3RhY2tTcGFjZUZvcihWaXJ0UmVnLCBSQyk7CisgICAgREVCVUcoZGJncygpIDw8ICJSZWxvYWRpbmcgJXJlZyIgPDwgVmlydFJlZyA8PCAiIGludG8gIgorICAgICAgICAgICAgICAgICA8PCBUUkktPmdldE5hbWUoTFIuUGh5c1JlZykgPDwgIlxuIik7CisgICAgVElJLT5sb2FkUmVnRnJvbVN0YWNrU2xvdCgqTUJCLCBNSSwgTFIuUGh5c1JlZywgRnJhbWVJbmRleCwgUkMsIFRSSSk7CisgICAgKytOdW1Mb2FkczsKKyAgfSBlbHNlIGlmIChMUi5EaXJ0eSkgeworICAgIGlmIChpc0xhc3RVc2VPZkxvY2FsUmVnKE1PKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJLaWxsaW5nIGxhc3QgdXNlOiAiIDw8IE1PIDw8ICJcbiIpOworICAgICAgaWYgKE1PLmlzVXNlKCkpCisgICAgICAgIE1PLnNldElzS2lsbCgpOworICAgICAgZWxzZQorICAgICAgICBNTy5zZXRJc0RlYWQoKTsKKyAgICB9IGVsc2UgaWYgKE1PLmlzS2lsbCgpKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkNsZWFyaW5nIGR1YmlvdXMga2lsbDogIiA8PCBNTyA8PCAiXG4iKTsKKyAgICAgIE1PLnNldElzS2lsbChmYWxzZSk7CisgICAgfSBlbHNlIGlmIChNTy5pc0RlYWQoKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJDbGVhcmluZyBkdWJpb3VzIGRlYWQ6ICIgPDwgTU8gPDwgIlxuIik7CisgICAgICBNTy5zZXRJc0RlYWQoZmFsc2UpOworICAgIH0KKyAgfSBlbHNlIGlmIChNTy5pc0tpbGwoKSkgeworICAgIC8vIFdlIG11c3QgcmVtb3ZlIGtpbGwgZmxhZ3MgZnJvbSB1c2VzIG9mIHJlbG9hZGVkIHJlZ2lzdGVycyBiZWNhdXNlIHRoZQorICAgIC8vIHJlZ2lzdGVyIHdvdWxkIGJlIGtpbGxlZCBpbW1lZGlhdGVseSwgYW5kIHRoZXJlIG1pZ2h0IGJlIGEgc2Vjb25kIHVzZToKKyAgICAvLyAgICVmb28gPSBPUiAleDxraWxsPiwgJXgKKyAgICAvLyBUaGlzIHdvdWxkIGNhdXNlIGEgc2Vjb25kIHJlbG9hZCBvZiAleCBpbnRvIGEgZGlmZmVyZW50IHJlZ2lzdGVyLgorICAgIERFQlVHKGRiZ3MoKSA8PCAiQ2xlYXJpbmcgY2xlYW4ga2lsbDogIiA8PCBNTyA8PCAiXG4iKTsKKyAgICBNTy5zZXRJc0tpbGwoZmFsc2UpOworICB9IGVsc2UgaWYgKE1PLmlzRGVhZCgpKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJDbGVhcmluZyBjbGVhbiBkZWFkOiAiIDw8IE1PIDw8ICJcbiIpOworICAgIE1PLnNldElzRGVhZChmYWxzZSk7CisgIH0KKyAgYXNzZXJ0KExSLlBoeXNSZWcgJiYgIlJlZ2lzdGVyIG5vdCBhc3NpZ25lZCIpOworICBMUi5MYXN0VXNlID0gTUk7CisgIExSLkxhc3RPcE51bSA9IE9wTnVtOworICBVc2VkSW5JbnN0ci5zZXQoTFIuUGh5c1JlZyk7CisgIHJldHVybiBMUkk7Cit9CisKKy8vIHNldFBoeXNSZWcgLSBDaGFuZ2Ugb3BlcmFuZCBPcE51bSBpbiBNSSB0aGUgcmVmZXIgdGhlIFBoeXNSZWcsIGNvbnNpZGVyaW5nCisvLyBzdWJyZWdzLiBUaGlzIG1heSBpbnZhbGlkYXRlIGFueSBvcGVyYW5kIHBvaW50ZXJzLgorLy8gUmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhbmQga2lsbHMgaXRzIHJlZ2lzdGVyLgorYm9vbCBSQUZhc3Q6OnNldFBoeXNSZWcoTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BOdW0sIHVuc2lnbmVkIFBoeXNSZWcpIHsKKyAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBpZiAoIU1PLmdldFN1YlJlZygpKSB7CisgICAgTU8uc2V0UmVnKFBoeXNSZWcpOworICAgIHJldHVybiBNTy5pc0tpbGwoKSB8fCBNTy5pc0RlYWQoKTsKKyAgfQorCisgIC8vIEhhbmRsZSBzdWJyZWdpc3RlciBpbmRleC4KKyAgTU8uc2V0UmVnKFBoeXNSZWcgPyBUUkktPmdldFN1YlJlZyhQaHlzUmVnLCBNTy5nZXRTdWJSZWcoKSkgOiAwKTsKKyAgTU8uc2V0U3ViUmVnKDApOworCisgIC8vIEEga2lsbCBmbGFnIGltcGxpZXMga2lsbGluZyB0aGUgZnVsbCByZWdpc3Rlci4gQWRkIGNvcnJlc3BvbmRpbmcgc3VwZXIKKyAgLy8gcmVnaXN0ZXIga2lsbC4KKyAgaWYgKE1PLmlzS2lsbCgpKSB7CisgICAgTUktPmFkZFJlZ2lzdGVyS2lsbGVkKFBoeXNSZWcsIFRSSSwgdHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIE1PLmlzRGVhZCgpOworfQorCisvLyBIYW5kbGUgc3BlY2lhbCBpbnN0cnVjdGlvbiBvcGVyYW5kIGxpa2UgZWFybHkgY2xvYmJlcnMgYW5kIHRpZWQgb3BzIHdoZW4KKy8vIHRoZXJlIGFyZSBhZGRpdGlvbmFsIHBoeXNyZWcgZGVmaW5lcy4KK3ZvaWQgUkFGYXN0OjpoYW5kbGVUaHJvdWdoT3BlcmFuZHMoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmVmlydERlYWQpIHsKKyAgREVCVUcoZGJncygpIDw8ICJTY2FubmluZyBmb3IgdGhyb3VnaCByZWdpc3RlcnM6Iik7CisgIFNtYWxsU2V0PHVuc2lnbmVkLCA4PiBUaHJvdWdoUmVnczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSkgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKCFSZWcgfHwgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkgY29udGludWU7CisgICAgaWYgKE1PLmlzRWFybHlDbG9iYmVyKCkgfHwgTUktPmlzUmVnVGllZFRvRGVmT3BlcmFuZChpKSB8fAorICAgICAgICAoTU8uZ2V0U3ViUmVnKCkgJiYgTUktPnJlYWRzVmlydHVhbFJlZ2lzdGVyKFJlZykpKSB7CisgICAgICBpZiAoVGhyb3VnaFJlZ3MuaW5zZXJ0KFJlZykpCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICVyZWciIDw8IFJlZyk7CisgICAgfQorICB9CisKKyAgLy8gSWYgYW55IHBoeXNyZWcgZGVmaW5lcyBjb2xsaWRlIHdpdGggcHJlYWxsb2NhdGVkIHRocm91Z2ggcmVnaXN0ZXJzLAorICAvLyB3ZSBtdXN0IHNwaWxsIGFuZCByZWFsbG9jYXRlLgorICBERUJVRyhkYmdzKCkgPDwgIlxuQ2hlY2tpbmcgZm9yIHBoeXNkZWYgY29sbGlzaW9ucy5cbiIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc0RlZigpKSBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBpZiAoIVJlZyB8fCAhVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkgY29udGludWU7CisgICAgVXNlZEluSW5zdHIuc2V0KFJlZyk7CisgICAgaWYgKFRocm91Z2hSZWdzLmNvdW50KFBoeXNSZWdTdGF0ZVtSZWddKSkKKyAgICAgIGRlZmluZVBoeXNSZWcoTUksIFJlZywgcmVnRnJlZSk7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBUzsgKytBUykgeworICAgICAgVXNlZEluSW5zdHIuc2V0KCpBUyk7CisgICAgICBpZiAoVGhyb3VnaFJlZ3MuY291bnQoUGh5c1JlZ1N0YXRlWypBU10pKQorICAgICAgICBkZWZpbmVQaHlzUmVnKE1JLCAqQVMsIHJlZ0ZyZWUpOworICAgIH0KKyAgfQorCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA4PiBQYXJ0aWFsRGVmczsKKyAgREVCVUcoZGJncygpIDw8ICJBbGxvY2F0aW5nIHRpZWQgdXNlcyBhbmQgZWFybHkgY2xvYmJlcnMuXG4iKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSkgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKCFSZWcgfHwgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkgY29udGludWU7CisgICAgaWYgKE1PLmlzVXNlKCkpIHsKKyAgICAgIHVuc2lnbmVkIERlZklkeCA9IDA7CisgICAgICBpZiAoIU1JLT5pc1JlZ1RpZWRUb0RlZk9wZXJhbmQoaSwgJkRlZklkeCkpIGNvbnRpbnVlOworICAgICAgREVCVUcoZGJncygpIDw8ICJPcGVyYW5kICIgPDwgaSA8PCAiKCI8PCBNTyA8PCAiKSBpcyB0aWVkIHRvIG9wZXJhbmQgIgorICAgICAgICA8PCBEZWZJZHggPDwgIi5cbiIpOworICAgICAgTGl2ZVJlZ01hcDo6aXRlcmF0b3IgTFJJID0gcmVsb2FkVmlydFJlZyhNSSwgaSwgUmVnLCAwKTsKKyAgICAgIHVuc2lnbmVkIFBoeXNSZWcgPSBMUkktPnNlY29uZC5QaHlzUmVnOworICAgICAgc2V0UGh5c1JlZyhNSSwgaSwgUGh5c1JlZyk7CisgICAgICAvLyBOb3RlOiB3ZSBkb24ndCB1cGRhdGUgdGhlIGRlZiBvcGVyYW5kIHlldC4gVGhhdCB3b3VsZCBjYXVzZSB0aGUgbm9ybWFsCisgICAgICAvLyBkZWYtc2NhbiB0byBhdHRlbXB0IHNwaWxsaW5nLgorICAgIH0gZWxzZSBpZiAoTU8uZ2V0U3ViUmVnKCkgJiYgTUktPnJlYWRzVmlydHVhbFJlZ2lzdGVyKFJlZykpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUGFydGlhbCByZWRlZmluZTogIiA8PCBNTyA8PCAiXG4iKTsKKyAgICAgIC8vIFJlbG9hZCB0aGUgcmVnaXN0ZXIsIGJ1dCBkb24ndCBhc3NpZ24gdG8gdGhlIG9wZXJhbmQganVzdCB5ZXQuCisgICAgICAvLyBUaGF0IHdvdWxkIGNvbmZ1c2UgdGhlIGxhdGVyIHBoeXMtZGVmIHByb2Nlc3NpbmcgcGFzcy4KKyAgICAgIExpdmVSZWdNYXA6Oml0ZXJhdG9yIExSSSA9IHJlbG9hZFZpcnRSZWcoTUksIGksIFJlZywgMCk7CisgICAgICBQYXJ0aWFsRGVmcy5wdXNoX2JhY2soTFJJLT5zZWNvbmQuUGh5c1JlZyk7CisgICAgfSBlbHNlIGlmIChNTy5pc0Vhcmx5Q2xvYmJlcigpKSB7CisgICAgICAvLyBOb3RlOiBkZWZpbmVWaXJ0UmVnIG1heSBpbnZhbGlkYXRlIE1PLgorICAgICAgTGl2ZVJlZ01hcDo6aXRlcmF0b3IgTFJJID0gZGVmaW5lVmlydFJlZyhNSSwgaSwgUmVnLCAwKTsKKyAgICAgIHVuc2lnbmVkIFBoeXNSZWcgPSBMUkktPnNlY29uZC5QaHlzUmVnOworICAgICAgaWYgKHNldFBoeXNSZWcoTUksIGksIFBoeXNSZWcpKQorICAgICAgICBWaXJ0RGVhZC5wdXNoX2JhY2soUmVnKTsKKyAgICB9CisgIH0KKworICAvLyBSZXN0b3JlIFVzZWRJbkluc3RyIHRvIGEgc3RhdGUgdXNhYmxlIGZvciBhbGxvY2F0aW5nIG5vcm1hbCB2aXJ0dWFsIHVzZXMuCisgIFVzZWRJbkluc3RyLnJlc2V0KCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgKE1PLmlzRGVmKCkgJiYgIU1PLmlzRWFybHlDbG9iYmVyKCkpKSBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBpZiAoIVJlZyB8fCAhVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkgY29udGludWU7CisgICAgVXNlZEluSW5zdHIuc2V0KFJlZyk7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBUzsgKytBUykKKyAgICAgIFVzZWRJbkluc3RyLnNldCgqQVMpOworICB9CisKKyAgLy8gQWxzbyBtYXJrIFBhcnRpYWxEZWZzIGFzIHVzZWQgdG8gYXZvaWQgcmVhbGxvY2F0aW9uLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUGFydGlhbERlZnMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBVc2VkSW5JbnN0ci5zZXQoUGFydGlhbERlZnNbaV0pOworfQorCit2b2lkIFJBRmFzdDo6QWxsb2NhdGVCYXNpY0Jsb2NrKCkgeworICBERUJVRyhkYmdzKCkgPDwgIlxuQWxsb2NhdGluZyAiIDw8ICpNQkIpOworCisgIFBoeXNSZWdTdGF0ZS5hc3NpZ24oVFJJLT5nZXROdW1SZWdzKCksIHJlZ0Rpc2FibGVkKTsKKyAgYXNzZXJ0KExpdmVWaXJ0UmVncy5lbXB0eSgpICYmICJNYXBwaW5nIG5vdCBjbGVhcmVkIGZvcm0gbGFzdCBibG9jaz8iKTsKKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUlJID0gTUJCLT5iZWdpbigpOworCisgIC8vIEFkZCBsaXZlLWluIHJlZ2lzdGVycyBhcyBsaXZlLgorICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpsaXZlaW5faXRlcmF0b3IgSSA9IE1CQi0+bGl2ZWluX2JlZ2luKCksCisgICAgICAgICBFID0gTUJCLT5saXZlaW5fZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGRlZmluZVBoeXNSZWcoTUlJLCAqSSwgcmVnUmVzZXJ2ZWQpOworCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA4PiBWaXJ0RGVhZDsKKyAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyKiwgMzI+IENvYWxlc2NlZDsKKworICAvLyBPdGhlcndpc2UsIHNlcXVlbnRpYWxseSBhbGxvY2F0ZSBlYWNoIGluc3RydWN0aW9uIGluIHRoZSBNQkIuCisgIHdoaWxlIChNSUkgIT0gTUJCLT5lbmQoKSkgeworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBNSUkrKzsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgICAgREVCVUcoeworICAgICAgICBkYmdzKCkgPDwgIlxuPj4gIiA8PCAqTUkgPDwgIlJlZ3M6IjsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBSZWcgPSAxLCBFID0gVFJJLT5nZXROdW1SZWdzKCk7IFJlZyAhPSBFOyArK1JlZykgeworICAgICAgICAgIGlmIChQaHlzUmVnU3RhdGVbUmVnXSA9PSByZWdEaXNhYmxlZCkgY29udGludWU7CisgICAgICAgICAgZGJncygpIDw8ICIgIiA8PCBUUkktPmdldE5hbWUoUmVnKTsKKyAgICAgICAgICBzd2l0Y2goUGh5c1JlZ1N0YXRlW1JlZ10pIHsKKyAgICAgICAgICBjYXNlIHJlZ0ZyZWU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHJlZ1Jlc2VydmVkOgorICAgICAgICAgICAgZGJncygpIDw8ICIqIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkYmdzKCkgPDwgIj0lcmVnIiA8PCBQaHlzUmVnU3RhdGVbUmVnXTsKKyAgICAgICAgICAgIGlmIChMaXZlVmlydFJlZ3NbUGh5c1JlZ1N0YXRlW1JlZ11dLkRpcnR5KQorICAgICAgICAgICAgICBkYmdzKCkgPDwgIioiOworICAgICAgICAgICAgYXNzZXJ0KExpdmVWaXJ0UmVnc1tQaHlzUmVnU3RhdGVbUmVnXV0uUGh5c1JlZyA9PSBSZWcgJiYKKyAgICAgICAgICAgICAgICAgICAiQmFkIGludmVyc2UgbWFwIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGJncygpIDw8ICdcbic7CisgICAgICAgIC8vIENoZWNrIHRoYXQgTGl2ZVZpcnRSZWdzIGlzIHRoZSBpbnZlcnNlLgorICAgICAgICBmb3IgKExpdmVSZWdNYXA6Oml0ZXJhdG9yIGkgPSBMaXZlVmlydFJlZ3MuYmVnaW4oKSwKKyAgICAgICAgICAgICBlID0gTGl2ZVZpcnRSZWdzLmVuZCgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihpLT5maXJzdCkgJiYKKyAgICAgICAgICAgICAgICAgICJCYWQgbWFwIGtleSIpOworICAgICAgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoaS0+c2Vjb25kLlBoeXNSZWcpICYmCisgICAgICAgICAgICAgICAgICAiQmFkIG1hcCB2YWx1ZSIpOworICAgICAgICAgICBhc3NlcnQoUGh5c1JlZ1N0YXRlW2ktPnNlY29uZC5QaHlzUmVnXSA9PSBpLT5maXJzdCAmJgorICAgICAgICAgICAgICAgICAgIkJhZCBpbnZlcnNlIG1hcCIpOworICAgICAgICB9CisgICAgICB9KTsKKworICAgIC8vIERlYnVnIHZhbHVlcyBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGNvZGVnZW4gaW4gYW55IHdheS4KKyAgICBpZiAoTUktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgICBib29sIFNjYW5EYmdWYWx1ZSA9IHRydWU7CisgICAgICB3aGlsZSAoU2NhbkRiZ1ZhbHVlKSB7CisgICAgICAgIFNjYW5EYmdWYWx1ZSA9IGZhbHNlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICAgICAgaWYgKCFNTy5pc1JlZygpKSBjb250aW51ZTsKKyAgICAgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgICAgICBpZiAoIVJlZyB8fCBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpKSBjb250aW51ZTsKKyAgICAgICAgICBMaXZlRGJnVmFsdWVNYXBbUmVnXSA9IE1JOworICAgICAgICAgIExpdmVSZWdNYXA6Oml0ZXJhdG9yIExSSSA9IExpdmVWaXJ0UmVncy5maW5kKFJlZyk7CisgICAgICAgICAgaWYgKExSSSAhPSBMaXZlVmlydFJlZ3MuZW5kKCkpCisgICAgICAgICAgICBzZXRQaHlzUmVnKE1JLCBpLCBMUkktPnNlY29uZC5QaHlzUmVnKTsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBTUyA9IFN0YWNrU2xvdEZvclZpcnRSZWdbUmVnXTsKKyAgICAgICAgICAgIGlmIChTUyA9PSAtMSkKKyAgICAgICAgICAgICAgTU8uc2V0UmVnKDApOyAvLyBXZSBjYW4ndCBhbGxvY2F0ZSBhIHBoeXNyZWcgZm9yIGEgRGVidWdWYWx1ZSwgc29ycnkhCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgLy8gTW9kaWZ5IERCR19WQUxVRSBub3cgdGhhdCB0aGUgdmFsdWUgaXMgaW4gYSBzcGlsbCBzbG90LgorICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpOworICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKk1EUHRyID0gCisgICAgICAgICAgICAgICAgTUktPmdldE9wZXJhbmQoTUktPmdldE51bU9wZXJhbmRzKCktMSkuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgRGVidWdMb2MgREwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgICAgICAgICAgICAgaWYgKE1hY2hpbmVJbnN0ciAqTmV3RFYgPSAKKyAgICAgICAgICAgICAgICAgIFRJSS0+ZW1pdEZyYW1lSW5kZXhEZWJ1Z1ZhbHVlKCpNRiwgU1MsIE9mZnNldCwgTURQdHIsIERMKSkgeworICAgICAgICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiTW9kaWZ5aW5nIGRlYnVnIGluZm8gZHVlIHRvIHNwaWxsOiIgPDwgIlx0IiA8PCAqTUkpOworICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNSS0+Z2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgTUJCLT5pbnNlcnQoTUJCLT5lcmFzZShNSSksIE5ld0RWKTsKKyAgICAgICAgICAgICAgICAvLyBTY2FuIE5ld0RWIG9wZXJhbmRzIGZyb20gdGhlIGJlZ2lubmluZy4KKyAgICAgICAgICAgICAgICBNSSA9IE5ld0RWOworICAgICAgICAgICAgICAgIFNjYW5EYmdWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIE1PLnNldFJlZygwKTsgLy8gV2UgY2FuJ3QgYWxsb2NhdGUgYSBwaHlzcmVnIGZvciBhIERlYnVnVmFsdWUsIHNvcnJ5IQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gTmV4dCBpbnN0cnVjdGlvbi4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIElmIHRoaXMgaXMgYSBjb3B5LCB3ZSBtYXkgYmUgYWJsZSB0byBjb2FsZXNjZS4KKyAgICB1bnNpZ25lZCBDb3B5U3JjID0gMCwgQ29weURzdCA9IDAsIENvcHlTcmNTdWIgPSAwLCBDb3B5RHN0U3ViID0gMDsKKyAgICBpZiAoTUktPmlzQ29weSgpKSB7CisgICAgICBDb3B5RHN0ID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgICBDb3B5U3JjID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICBDb3B5RHN0U3ViID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCk7CisgICAgICBDb3B5U3JjU3ViID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0U3ViUmVnKCk7CisgICAgfQorCisgICAgLy8gVHJhY2sgcmVnaXN0ZXJzIHVzZWQgYnkgaW5zdHJ1Y3Rpb24uCisgICAgVXNlZEluSW5zdHIucmVzZXQoKTsKKworICAgIC8vIEZpcnN0IHNjYW4uCisgICAgLy8gTWFyayBwaHlzcmVnIHVzZXMgYW5kIGVhcmx5IGNsb2JiZXJzIGFzIHVzZWQuCisgICAgLy8gRmluZCB0aGUgZW5kIG9mIHRoZSB2aXJ0cmVnIG9wZXJhbmRzCisgICAgdW5zaWduZWQgVmlydE9wRW5kID0gMDsKKyAgICBib29sIGhhc1RpZWRPcHMgPSBmYWxzZTsKKyAgICBib29sIGhhc0Vhcmx5Q2xvYmJlcnMgPSBmYWxzZTsKKyAgICBib29sIGhhc1BhcnRpYWxSZWRlZnMgPSBmYWxzZTsKKyAgICBib29sIGhhc1BoeXNEZWZzID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkpIGNvbnRpbnVlOworICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBpZiAoIVJlZykgY29udGludWU7CisgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWcpKSB7CisgICAgICAgIFZpcnRPcEVuZCA9IGkrMTsKKyAgICAgICAgaWYgKE1PLmlzVXNlKCkpIHsKKyAgICAgICAgICBoYXNUaWVkT3BzID0gaGFzVGllZE9wcyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoaSwgVE9JOjpUSUVEX1RPKSAhPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoTU8uaXNFYXJseUNsb2JiZXIoKSkKKyAgICAgICAgICAgIGhhc0Vhcmx5Q2xvYmJlcnMgPSB0cnVlOworICAgICAgICAgIGlmIChNTy5nZXRTdWJSZWcoKSAmJiBNSS0+cmVhZHNWaXJ0dWFsUmVnaXN0ZXIoUmVnKSkKKyAgICAgICAgICAgIGhhc1BhcnRpYWxSZWRlZnMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKCFBbGxvY2F0YWJsZS50ZXN0KFJlZykpIGNvbnRpbnVlOworICAgICAgaWYgKE1PLmlzVXNlKCkpIHsKKyAgICAgICAgdXNlUGh5c1JlZyhNTyk7CisgICAgICB9IGVsc2UgaWYgKE1PLmlzRWFybHlDbG9iYmVyKCkpIHsKKyAgICAgICAgZGVmaW5lUGh5c1JlZyhNSSwgUmVnLCAoTU8uaXNJbXBsaWNpdCgpIHx8IE1PLmlzRGVhZCgpKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnRnJlZSA6IHJlZ1Jlc2VydmVkKTsKKyAgICAgICAgaGFzRWFybHlDbG9iYmVycyA9IHRydWU7CisgICAgICB9IGVsc2UKKyAgICAgICAgaGFzUGh5c0RlZnMgPSB0cnVlOworICAgIH0KKworICAgIC8vIFRoZSBpbnN0cnVjdGlvbiBtYXkgaGF2ZSB2aXJ0dWFsIHJlZ2lzdGVyIG9wZXJhbmRzIHRoYXQgbXVzdCBiZSBhbGxvY2F0ZWQKKyAgICAvLyB0aGUgc2FtZSByZWdpc3RlciBhdCB1c2UtdGltZSBhbmQgZGVmLXRpbWU6IGVhcmx5IGNsb2JiZXJzIGFuZCB0aWVkCisgICAgLy8gb3BlcmFuZHMuIElmIHRoZXJlIGFyZSBhbHNvIHBoeXNpY2FsIGRlZnMsIHRoZXNlIHJlZ2lzdGVycyBtdXN0IGF2b2lkCisgICAgLy8gYm90aCBwaHlzaWNhbCBkZWZzIGFuZCB1c2VzLCBtYWtpbmcgdGhlbSBtb3JlIGNvbnN0cmFpbmVkIHRoYW4gbm9ybWFsCisgICAgLy8gb3BlcmFuZHMuCisgICAgLy8gU2ltaWxhcmx5LCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVmcyBhbmQgdGllZCBvcGVyYW5kcywgd2UgbXVzdCBtYWtlIHN1cmUKKyAgICAvLyB0aGUgc2FtZSByZWdpc3RlciBpcyBhbGxvY2F0ZWQgdG8gdXNlcyBhbmQgZGVmcy4KKyAgICAvLyBXZSBkaWRuJ3QgZGV0ZWN0IGlubGluZSBhc20gdGllZCBvcGVyYW5kcyBhYm92ZSwgc28ganVzdCBtYWtlIHRoaXMgZXh0cmEKKyAgICAvLyBwYXNzIGZvciBhbGwgaW5saW5lIGFzbS4KKyAgICBpZiAoaGFzRWFybHlDbG9iYmVycyB8fCBoYXNQYXJ0aWFsUmVkZWZzIHx8CisgICAgICAgIChoYXNUaWVkT3BzICYmIChoYXNQaHlzRGVmcyB8fCBUSUQuZ2V0TnVtRGVmcygpID4gMSkpKSB7CisgICAgICBoYW5kbGVUaHJvdWdoT3BlcmFuZHMoTUksIFZpcnREZWFkKTsKKyAgICAgIC8vIERvbid0IGF0dGVtcHQgY29hbGVzY2luZyB3aGVuIHdlIGhhdmUgZnVubnkgc3R1ZmYgZ29pbmcgb24uCisgICAgICBDb3B5RHN0ID0gMDsKKyAgICAgIC8vIFByZXRlbmQgd2UgaGF2ZSBlYXJseSBjbG9iYmVycyBzbyB0aGUgdXNlIG9wZXJhbmRzIGdldCBtYXJrZWQgYmVsb3cuCisgICAgICAvLyBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBhIHNpbmdsZSB0aWVkIHVzZS4KKyAgICAgIGhhc0Vhcmx5Q2xvYmJlcnMgPSB0cnVlOworICAgIH0KKworICAgIC8vIFNlY29uZCBzY2FuLgorICAgIC8vIEFsbG9jYXRlIHZpcnRyZWcgdXNlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFZpcnRPcEVuZDsgKytpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSkgY29udGludWU7CisgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgIGlmICghUmVnIHx8IFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpIGNvbnRpbnVlOworICAgICAgaWYgKE1PLmlzVXNlKCkpIHsKKyAgICAgICAgTGl2ZVJlZ01hcDo6aXRlcmF0b3IgTFJJID0gcmVsb2FkVmlydFJlZyhNSSwgaSwgUmVnLCBDb3B5RHN0KTsKKyAgICAgICAgdW5zaWduZWQgUGh5c1JlZyA9IExSSS0+c2Vjb25kLlBoeXNSZWc7CisgICAgICAgIENvcHlTcmMgPSAoQ29weVNyYyA9PSBSZWcgfHwgQ29weVNyYyA9PSBQaHlzUmVnKSA/IFBoeXNSZWcgOiAwOworICAgICAgICBpZiAoc2V0UGh5c1JlZyhNSSwgaSwgUGh5c1JlZykpCisgICAgICAgICAga2lsbFZpcnRSZWcoTFJJKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBNUkktPmFkZFBoeXNSZWdzVXNlZChVc2VkSW5JbnN0cik7CisKKyAgICAvLyBUcmFjayByZWdpc3RlcnMgZGVmaW5lZCBieSBpbnN0cnVjdGlvbiAtIGVhcmx5IGNsb2JiZXJzIGFuZCB0aWVkIHVzZXMgYXQKKyAgICAvLyB0aGlzIHBvaW50LgorICAgIFVzZWRJbkluc3RyLnJlc2V0KCk7CisgICAgaWYgKGhhc0Vhcmx5Q2xvYmJlcnMpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICAgIGlmICghTU8uaXNSZWcoKSkgY29udGludWU7CisgICAgICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgICAgICBpZiAoIVJlZyB8fCAhVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkgY29udGludWU7CisgICAgICAgIC8vIExvb2sgZm9yIHBoeXNyZWcgZGVmcyBhbmQgdGllZCB1c2VzLgorICAgICAgICBpZiAoIU1PLmlzRGVmKCkgJiYgIU1JLT5pc1JlZ1RpZWRUb0RlZk9wZXJhbmQoaSkpIGNvbnRpbnVlOworICAgICAgICBVc2VkSW5JbnN0ci5zZXQoUmVnKTsKKyAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBUzsgKytBUykKKyAgICAgICAgICBVc2VkSW5JbnN0ci5zZXQoKkFTKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB1bnNpZ25lZCBEZWZPcEVuZCA9IE1JLT5nZXROdW1PcGVyYW5kcygpOworICAgIGlmIChUSUQuaXNDYWxsKCkpIHsKKyAgICAgIC8vIFNwaWxsIGFsbCB2aXJ0cmVncyBiZWZvcmUgYSBjYWxsLiBUaGlzIHNlcnZlcyB0d28gcHVycG9zZXM6IDEuIElmIGFuCisgICAgICAvLyBleGNlcHRpb24gaXMgdGhyb3duLCB0aGUgbGFuZGluZyBwYWQgaXMgZ29pbmcgdG8gZXhwZWN0IHRvIGZpbmQgcmVnaXN0ZXJzCisgICAgICAvLyBpbiB0aGVpciBzcGlsbCBzbG90cywgYW5kIDIuIHdlIGRvbid0IGhhdmUgdG8gd2FkZSB0aHJvdWdoIGFsbCB0aGUKKyAgICAgIC8vIDxpbXAtZGVmPiBvcGVyYW5kcyBvbiB0aGUgY2FsbCBpbnN0cnVjdGlvbi4KKyAgICAgIERlZk9wRW5kID0gVmlydE9wRW5kOworICAgICAgREVCVUcoZGJncygpIDw8ICIgIFNwaWxsaW5nIHJlbWFpbmluZyByZWdpc3RlcnMgYmVmb3JlIGNhbGwuXG4iKTsKKyAgICAgIHNwaWxsQWxsKE1JKTsKKworICAgICAgLy8gVGhlIGltcC1kZWZzIGFyZSBza2lwcGVkIGJlbG93LCBidXQgd2Ugc3RpbGwgbmVlZCB0byBtYXJrIHRob3NlCisgICAgICAvLyByZWdpc3RlcnMgYXMgdXNlZCBieSB0aGUgZnVuY3Rpb24uCisgICAgICBTa2lwcGVkSW5zdHJzLmluc2VydCgmVElEKTsKKyAgICB9CisKKyAgICAvLyBUaGlyZCBzY2FuLgorICAgIC8vIEFsbG9jYXRlIGRlZnMgYW5kIGNvbGxlY3QgZGVhZCBkZWZzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gRGVmT3BFbmQ7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzRGVmKCkgfHwgIU1PLmdldFJlZygpIHx8IE1PLmlzRWFybHlDbG9iYmVyKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisKKyAgICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpKSB7CisgICAgICAgIGlmICghQWxsb2NhdGFibGUudGVzdChSZWcpKSBjb250aW51ZTsKKyAgICAgICAgZGVmaW5lUGh5c1JlZyhNSSwgUmVnLCAoTU8uaXNJbXBsaWNpdCgpIHx8IE1PLmlzRGVhZCgpKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnRnJlZSA6IHJlZ1Jlc2VydmVkKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBMaXZlUmVnTWFwOjppdGVyYXRvciBMUkkgPSBkZWZpbmVWaXJ0UmVnKE1JLCBpLCBSZWcsIENvcHlTcmMpOworICAgICAgdW5zaWduZWQgUGh5c1JlZyA9IExSSS0+c2Vjb25kLlBoeXNSZWc7CisgICAgICBpZiAoc2V0UGh5c1JlZyhNSSwgaSwgUGh5c1JlZykpIHsKKyAgICAgICAgVmlydERlYWQucHVzaF9iYWNrKFJlZyk7CisgICAgICAgIENvcHlEc3QgPSAwOyAvLyBjYW5jZWwgY29hbGVzY2luZzsKKyAgICAgIH0gZWxzZQorICAgICAgICBDb3B5RHN0ID0gKENvcHlEc3QgPT0gUmVnIHx8IENvcHlEc3QgPT0gUGh5c1JlZykgPyBQaHlzUmVnIDogMDsKKyAgICB9CisKKyAgICAvLyBLaWxsIGRlYWQgZGVmcyBhZnRlciB0aGUgc2NhbiB0byBlbnN1cmUgdGhhdCBtdWx0aXBsZSBkZWZzIG9mIHRoZSBzYW1lCisgICAgLy8gcmVnaXN0ZXIgYXJlIGFsbG9jYXRlZCBpZGVudGljYWxseS4gV2UgZGlkbid0IG5lZWQgdG8gZG8gdGhpcyBmb3IgdXNlcworICAgIC8vIGJlY2F1c2Ugd2UgYXJlIGNyZXJhdGluZyBvdXIgb3duIGtpbGwgZmxhZ3MsIGFuZCB0aGV5IGFyZSBhbHdheXMgYXQgdGhlCisgICAgLy8gbGFzdCB1c2UuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZpcnREZWFkLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBraWxsVmlydFJlZyhWaXJ0RGVhZFtpXSk7CisgICAgVmlydERlYWQuY2xlYXIoKTsKKworICAgIE1SSS0+YWRkUGh5c1JlZ3NVc2VkKFVzZWRJbkluc3RyKTsKKworICAgIGlmIChDb3B5RHN0ICYmIENvcHlEc3QgPT0gQ29weVNyYyAmJiBDb3B5RHN0U3ViID09IENvcHlTcmNTdWIpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiLS0gY29hbGVzY2luZzogIiA8PCAqTUkpOworICAgICAgQ29hbGVzY2VkLnB1c2hfYmFjayhNSSk7CisgICAgfSBlbHNlIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiPDwgIiA8PCAqTUkpOworICAgIH0KKyAgfQorCisgIC8vIFNwaWxsIGFsbCBwaHlzaWNhbCByZWdpc3RlcnMgaG9sZGluZyB2aXJ0dWFsIHJlZ2lzdGVycyBub3cuCisgIERFQlVHKGRiZ3MoKSA8PCAiU3BpbGxpbmcgbGl2ZSByZWdpc3RlcnMgYXQgZW5kIG9mIGJsb2NrLlxuIik7CisgIHNwaWxsQWxsKE1CQi0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCkpOworCisgIC8vIEVyYXNlIGFsbCB0aGUgY29hbGVzY2VkIGNvcGllcy4gV2UgYXJlIGRlbGF5aW5nIGl0IHVudGlsIG5vdyBiZWNhdXNlCisgIC8vIExpdmVWaXJ0UmVncyBtaWdodCByZWZlciB0byB0aGUgaW5zdHJzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ29hbGVzY2VkLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgTUJCLT5lcmFzZShDb2FsZXNjZWRbaV0pOworICBOdW1Db3BpZXMgKz0gQ29hbGVzY2VkLnNpemUoKTsKKworICBERUJVRyhNQkItPmR1bXAoKSk7Cit9CisKKy8vLyBydW5Pbk1hY2hpbmVGdW5jdGlvbiAtIFJlZ2lzdGVyIGFsbG9jYXRlIHRoZSB3aG9sZSBmdW5jdGlvbgorLy8vCitib29sIFJBRmFzdDo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGbikgeworICBERUJVRyhkYmdzKCkgPDwgIioqKioqKioqKiogRkFTVCBSRUdJU1RFUiBBTExPQ0FUSU9OICoqKioqKioqKipcbiIKKyAgICAgICAgICAgICAgIDw8ICIqKioqKioqKioqIEZ1bmN0aW9uOiAiCisgICAgICAgICAgICAgICA8PCAoKFZhbHVlKilGbi5nZXRGdW5jdGlvbigpKS0+Z2V0TmFtZSgpIDw8ICdcbicpOworICBNRiA9ICZGbjsKKyAgTVJJID0gJk1GLT5nZXRSZWdJbmZvKCk7CisgIFRNID0gJkZuLmdldFRhcmdldCgpOworICBUUkkgPSBUTS0+Z2V0UmVnaXN0ZXJJbmZvKCk7CisgIFRJSSA9IFRNLT5nZXRJbnN0ckluZm8oKTsKKworICBVc2VkSW5JbnN0ci5yZXNpemUoVFJJLT5nZXROdW1SZWdzKCkpOworICBBbGxvY2F0YWJsZSA9IFRSSS0+Z2V0QWxsb2NhdGFibGVTZXQoKk1GKTsKKworICAvLyBpbml0aWFsaXplIHRoZSB2aXJ0dWFsLT5waHlzaWNhbCByZWdpc3RlciBtYXAgdG8gaGF2ZSBhICdudWxsJworICAvLyBtYXBwaW5nIGZvciBhbGwgdmlydHVhbCByZWdpc3RlcnMKKyAgdW5zaWduZWQgTGFzdFZpcnRSZWcgPSBNUkktPmdldExhc3RWaXJ0UmVnKCk7CisgIFN0YWNrU2xvdEZvclZpcnRSZWcuZ3JvdyhMYXN0VmlydFJlZyk7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgYmFzaWMgYmxvY2tzLCBlbGltaW5hdGluZyB2aXJ0dWFsIHJlZ2lzdGVyIHJlZmVyZW5jZXMKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQmkgPSBGbi5iZWdpbigpLCBNQkJlID0gRm4uZW5kKCk7CisgICAgICAgTUJCaSAhPSBNQkJlOyArK01CQmkpIHsKKyAgICBNQkIgPSAmKk1CQmk7CisgICAgQWxsb2NhdGVCYXNpY0Jsb2NrKCk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgdGhlIHNldCBvZiB1c2VkIHBoeXNyZWdzIGlzIGNsb3NlZCB1bmRlciBzdWJyZWcgb3BlcmF0aW9ucy4KKyAgTVJJLT5jbG9zZVBoeXNSZWdzVXNlZCgqVFJJKTsKKworICAvLyBBZGQgdGhlIGNsb2JiZXIgbGlzdHMgZm9yIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIHdlIHNraXBwZWQgZWFybGllci4KKyAgZm9yIChTbWFsbFB0clNldDxjb25zdCBUYXJnZXRJbnN0ckRlc2MqLCA0Pjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICBJID0gU2tpcHBlZEluc3Rycy5iZWdpbigpLCBFID0gU2tpcHBlZEluc3Rycy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKGNvbnN0IHVuc2lnbmVkICpEZWZzID0gKCpJKS0+Z2V0SW1wbGljaXREZWZzKCkpCisgICAgICB3aGlsZSAoKkRlZnMpCisgICAgICAgIE1SSS0+c2V0UGh5c1JlZ1VzZWQoKkRlZnMrKyk7CisKKyAgU2tpcHBlZEluc3Rycy5jbGVhcigpOworICBTdGFja1Nsb3RGb3JWaXJ0UmVnLmNsZWFyKCk7CisgIExpdmVEYmdWYWx1ZU1hcC5jbGVhcigpOworICByZXR1cm4gdHJ1ZTsKK30KKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVGYXN0UmVnaXN0ZXJBbGxvY2F0b3IoKSB7CisgIHJldHVybiBuZXcgUkFGYXN0KCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9SZWdBbGxvY0xpbmVhclNjYW4uY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUmVnQWxsb2NMaW5lYXJTY2FuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWM1MWIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUmVnQWxsb2NMaW5lYXJTY2FuLmNwcApAQCAtMCwwICsxLDE1MDMgQEAKKy8vPT09LS0gUmVnQWxsb2NMaW5lYXJTY2FuLmNwcCAtIExpbmVhciBTY2FuIHJlZ2lzdGVyIGFsbG9jYXRvciAtLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBsaW5lYXIgc2NhbiByZWdpc3RlciBhbGxvY2F0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJyZWdhbGxvYyIKKyNpbmNsdWRlICJWaXJ0UmVnTWFwLmgiCisjaW5jbHVkZSAiVmlydFJlZ1Jld3JpdGVyLmgiCisjaW5jbHVkZSAiU3BpbGxlci5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsY1NwaWxsV2VpZ2h0cy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlU3RhY2tBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUmVnQWxsb2NSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlckNvYWxlc2Nlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRXF1aXZhbGVuY2VDbGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGNtYXRoPgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUl0ZXJzICAgICAsICJOdW1iZXIgb2YgaXRlcmF0aW9ucyBwZXJmb3JtZWQiKTsKK1NUQVRJU1RJQyhOdW1CYWNrdHJhY2tzLCAiTnVtYmVyIG9mIHRpbWVzIHdlIGhhZCB0byBiYWNrdHJhY2siKTsKK1NUQVRJU1RJQyhOdW1Db2FsZXNjZSwgICAiTnVtYmVyIG9mIGNvcGllcyBjb2FsZXNjZWQiKTsKK1NUQVRJU1RJQyhOdW1Eb3duZ3JhZGUsICAiTnVtYmVyIG9mIHJlZ2lzdGVycyBkb3duZ3JhZGVkIik7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitOZXdIZXVyaXN0aWMoIm5ldy1zcGlsbGluZy1oZXVyaXN0aWMiLAorICAgICAgICAgICAgIGNsOjpkZXNjKCJVc2UgbmV3IHNwaWxsaW5nIGhldXJpc3RpYyIpLAorICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSwgY2w6OkhpZGRlbik7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitQcmVTcGxpdEludGVydmFscygicHJlLWFsbG9jLXNwbGl0IiwKKyAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJQcmUtcmVnaXN0ZXIgYWxsb2NhdGlvbiBsaXZlIGludGVydmFsIHNwbGl0dGluZyIpLAorICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpLCBjbDo6SGlkZGVuKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK1RyaXZDb2FsZXNjZUVuZHMoInRyaXZpYWwtY29hbGVzY2UtZW5kcyIsCisgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiQXR0ZW1wdCB0cml2aWFsIGNvYWxlc2Npbmcgb2YgaW50ZXJ2YWwgZW5kcyIpLAorICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpLCBjbDo6SGlkZGVuKTsKKworc3RhdGljIFJlZ2lzdGVyUmVnQWxsb2MKK2xpbmVhcnNjYW5SZWdBbGxvYygibGluZWFyc2NhbiIsICJsaW5lYXIgc2NhbiByZWdpc3RlciBhbGxvY2F0b3IiLAorICAgICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVhclNjYW5SZWdpc3RlckFsbG9jYXRvcik7CisKK25hbWVzcGFjZSB7CisgIC8vIFdoZW4gd2UgYWxsb2NhdGUgYSByZWdpc3RlciwgYWRkIGl0IHRvIGEgZml4ZWQtc2l6ZSBxdWV1ZSBvZgorICAvLyByZWdpc3RlcnMgdG8gc2tpcCBpbiBzdWJzZXF1ZW50IGFsbG9jYXRpb25zLiBUaGlzIHRyYWRlcyBhIHNtYWxsCisgIC8vIGFtb3VudCBvZiByZWdpc3RlciBwcmVzc3VyZSBhbmQgaW5jcmVhc2VkIHNwaWxscyBmb3IgZmxleGliaWxpdHkgaW4KKyAgLy8gdGhlIHBvc3QtcGFzcyBzY2hlZHVsZXIuCisgIC8vCisgIC8vIE5vdGUgdGhhdCBpbiBhIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHVzZWQgZm9yIHJlbG9hZGluZyBzcGlsbHMKKyAgLy8gd2lsbCBiZSBvbmUgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbi4KKyAgLy8KKyAgLy8gT25lIGJpZyBsaW1pdGF0aW9uIG9mIHRoaXMgaXMgdGhhdCBpdCBkb2Vzbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbgorICAvLyBkaWZmZXJlbnQgcmVnaXN0ZXIgY2xhc3Nlcy4gU28gb24geDg2LTY0LCBpZiB0aGVyZSBpcyB4bW0gcmVnaXN0ZXIKKyAgLy8gcHJlc3N1cmUsIGl0IGNhbiBjYXVzZWQgZmV3ZXIgR1BScyB0byBiZSBoZWxkIGluIHRoZSBxdWV1ZS4KKyAgc3RhdGljIGNsOjpvcHQ8dW5zaWduZWQ+CisgIE51bVJlY2VudGx5VXNlZFJlZ3MoImxpbmVhcnNjYW4tc2tpcC1jb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIk51bWJlciBvZiByZWdpc3RlcnMgZm9yIGxpbmVhcnNjYW4gdG8gcmVtZW1iZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIHNraXAuIiksCisgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoMCksCisgICAgICAgICAgICAgICAgICAgICAgY2w6OkhpZGRlbik7CisgCisgIHN0cnVjdCBSQUxpblNjYW4gOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgUkFMaW5TY2FuKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7CisgICAgICAvLyBJbml0aWFsaXplIHRoZSBxdWV1ZSB0byByZWNvcmQgcmVjZW50bHktdXNlZCByZWdpc3RlcnMuCisgICAgICBpZiAoTnVtUmVjZW50bHlVc2VkUmVncyA+IDApCisgICAgICAgIFJlY2VudFJlZ3MucmVzaXplKE51bVJlY2VudGx5VXNlZFJlZ3MsIDApOworICAgICAgUmVjZW50TmV4dCA9IFJlY2VudFJlZ3MuYmVnaW4oKTsKKyAgICB9CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxMaXZlSW50ZXJ2YWwqLCBMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yPiBJbnRlcnZhbFB0cjsKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9yPEludGVydmFsUHRyLCAzMj4gSW50ZXJ2YWxQdHJzOworICBwcml2YXRlOgorICAgIC8vLyBSZWxhdGVkUmVnQ2xhc3NlcyAtIFRoaXMgc3RydWN0dXJlIGlzIGJ1aWx0IHRoZSBmaXJzdCB0aW1lIGEgZnVuY3Rpb24gaXMKKyAgICAvLy8gY29tcGlsZWQsIGFuZCBrZWVwcyB0cmFjayBvZiB3aGljaCByZWdpc3RlciBjbGFzc2VzIGhhdmUgcmVnaXN0ZXJzIHRoYXQKKyAgICAvLy8gYmVsb25nIHRvIG11bHRpcGxlIGNsYXNzZXMgb3IgaGF2ZSBhbGlhc2VzIHRoYXQgYXJlIGluIG90aGVyIGNsYXNzZXMuCisgICAgRXF1aXZhbGVuY2VDbGFzc2VzPGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqPiBSZWxhdGVkUmVnQ2xhc3NlczsKKyAgICBEZW5zZU1hcDx1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+IE9uZUNsYXNzRm9yRWFjaFBoeXNSZWc7CisKKyAgICAvLyBOZXh0UmVsb2FkTWFwIC0gRm9yIGVhY2ggcmVnaXN0ZXIgaW4gdGhlIG1hcCwgaXQgbWFwcyB0byB0aGUgYW5vdGhlcgorICAgIC8vIHJlZ2lzdGVyIHdoaWNoIGlzIGRlZmluZWQgYnkgYSByZWxvYWQgZnJvbSB0aGUgc2FtZSBzdGFjayBzbG90IGFuZAorICAgIC8vIGJvdGggcmVsb2FkcyBhcmUgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2suCisgICAgRGVuc2VNYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBOZXh0UmVsb2FkTWFwOworCisgICAgLy8gRG93bmdyYWRlZFJlZ3MgLSBBIHNldCBvZiByZWdpc3RlcnMgd2hpY2ggYXJlIGJlaW5nICJkb3duZ3JhZGVkIiwgaS5lLgorICAgIC8vIHVuLWZhdm9yZWQgZm9yIGFsbG9jYXRpb24uCisgICAgU21hbGxTZXQ8dW5zaWduZWQsIDg+IERvd25ncmFkZWRSZWdzOworCisgICAgLy8gRG93bmdyYWRlTWFwIC0gQSBtYXAgZnJvbSB2aXJ0dWFsIHJlZ2lzdGVycyB0byBwaHlzaWNhbCByZWdpc3RlcnMgYmVpbmcKKyAgICAvLyBkb3duZ3JhZGVkIGZvciB0aGUgdmlydHVhbCByZWdpc3RlcnMuCisgICAgRGVuc2VNYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBEb3duZ3JhZGVNYXA7CisKKyAgICBNYWNoaW5lRnVuY3Rpb24qIG1mXzsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvKiBtcmlfOworICAgIGNvbnN0IFRhcmdldE1hY2hpbmUqIHRtXzsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8qIHRyaV87CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvKiB0aWlfOworICAgIEJpdFZlY3RvciBhbGxvY2F0YWJsZVJlZ3NfOworICAgIExpdmVJbnRlcnZhbHMqIGxpXzsKKyAgICBMaXZlU3RhY2tzKiBsc187CisgICAgTWFjaGluZUxvb3BJbmZvICpsb29wSW5mbzsKKworICAgIC8vLyBoYW5kbGVkXyAtIEludGVydmFscyBhcmUgYWRkZWQgdG8gdGhlIGhhbmRsZWRfIHNldCBpbiB0aGUgb3JkZXIgb2YgdGhlaXIKKyAgICAvLy8gc3RhcnQgdmFsdWUuICBUaGlzIGlzIHVzZXMgZm9yIGJhY2t0cmFja2luZy4KKyAgICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiBoYW5kbGVkXzsKKworICAgIC8vLyBmaXhlZF8gLSBJbnRlcnZhbHMgdGhhdCBjb3JyZXNwb25kIHRvIG1hY2hpbmUgcmVnaXN0ZXJzLgorICAgIC8vLworICAgIEludGVydmFsUHRycyBmaXhlZF87CisKKyAgICAvLy8gYWN0aXZlXyAtIEludGVydmFscyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLCBhbmQgd2hpY2ggaGF2ZSBhCisgICAgLy8vIGxpdmUgcmFuZ2UgYWN0aXZlIGZvciB0aGUgY3VycmVudCBwb2ludC4KKyAgICBJbnRlcnZhbFB0cnMgYWN0aXZlXzsKKworICAgIC8vLyBpbmFjdGl2ZV8gLSBJbnRlcnZhbHMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCwgYnV0IHdoaWNoIGhhdmUKKyAgICAvLy8gYSBob2xkIGF0IHRoZSBjdXJyZW50IHBvaW50LgorICAgIEludGVydmFsUHRycyBpbmFjdGl2ZV87CisKKyAgICB0eXBlZGVmIHN0ZDo6cHJpb3JpdHlfcXVldWU8TGl2ZUludGVydmFsKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TGl2ZUludGVydmFsKiwgNjQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyX3B0cjxMaXZlSW50ZXJ2YWw+ID4gSW50ZXJ2YWxIZWFwOworICAgIEludGVydmFsSGVhcCB1bmhhbmRsZWRfOworCisgICAgLy8vIHJlZ1VzZV8gLSBUcmFja3MgcmVnaXN0ZXIgdXNhZ2UuCisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDMyPiByZWdVc2VfOworICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAzMj4gcmVnVXNlQmFja1VwXzsKKworICAgIC8vLyB2cm1fIC0gVHJhY2tzIHJlZ2lzdGVyIGFzc2lnbm1lbnRzLgorICAgIFZpcnRSZWdNYXAqIHZybV87CisKKyAgICBzdGQ6OmF1dG9fcHRyPFZpcnRSZWdSZXdyaXRlcj4gcmV3cml0ZXJfOworCisgICAgc3RkOjphdXRvX3B0cjxTcGlsbGVyPiBzcGlsbGVyXzsKKworICAgIC8vIFRoZSBxdWV1ZSBvZiByZWNlbnRseS11c2VkIHJlZ2lzdGVycy4KKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gUmVjZW50UmVnczsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND46Oml0ZXJhdG9yIFJlY2VudE5leHQ7CisKKyAgICAvLyBSZWNvcmQgdGhhdCB3ZSBqdXN0IHBpY2tlZCB0aGlzIHJlZ2lzdGVyLgorICAgIHZvaWQgcmVjb3JkUmVjZW50bHlVc2VkKHVuc2lnbmVkIHJlZykgeworICAgICAgYXNzZXJ0KHJlZyAhPSAwICYmICJSZWNlbnRseSB1c2VkIHJlZ2lzdGVyIGlzIE5PUkVHISIpOworICAgICAgaWYgKCFSZWNlbnRSZWdzLmVtcHR5KCkpIHsKKyAgICAgICAgKlJlY2VudE5leHQrKyA9IHJlZzsKKyAgICAgICAgaWYgKFJlY2VudE5leHQgPT0gUmVjZW50UmVncy5lbmQoKSkKKyAgICAgICAgICBSZWNlbnROZXh0ID0gUmVjZW50UmVncy5iZWdpbigpOworICAgICAgfQorICAgIH0KKworICBwdWJsaWM6CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiTGluZWFyIFNjYW4gUmVnaXN0ZXIgQWxsb2NhdG9yIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQ0ZHKCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxMaXZlSW50ZXJ2YWxzPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPFNsb3RJbmRleGVzPigpOworICAgICAgaWYgKFN0cm9uZ1BISUVsaW0pCisgICAgICAgIEFVLmFkZFJlcXVpcmVkSUQoU3Ryb25nUEhJRWxpbWluYXRpb25JRCk7CisgICAgICAvLyBNYWtlIHN1cmUgUGFzc01hbmFnZXIga25vd3Mgd2hpY2ggYW5hbHlzZXMgdG8gbWFrZSBhdmFpbGFibGUKKyAgICAgIC8vIHRvIGNvYWxlc2NpbmcgYW5kIHdoaWNoIGFuYWx5c2VzIGNvYWxlc2NpbmcgaW52YWxpZGF0ZXMuCisgICAgICBBVS5hZGRSZXF1aXJlZFRyYW5zaXRpdmU8UmVnaXN0ZXJDb2FsZXNjZXI+KCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxDYWxjdWxhdGVTcGlsbFdlaWdodHM+KCk7CisgICAgICBpZiAoUHJlU3BsaXRJbnRlcnZhbHMpCisgICAgICAgIEFVLmFkZFJlcXVpcmVkSUQoUHJlQWxsb2NTcGxpdHRpbmdJRCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxMaXZlU3RhY2tzPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPExpdmVTdGFja3M+KCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lTG9vcEluZm8+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZUxvb3BJbmZvPigpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8VmlydFJlZ01hcD4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxWaXJ0UmVnTWFwPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkSUQoTWFjaGluZURvbWluYXRvcnNJRCk7CisgICAgICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgICB9CisKKyAgICAvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24gLSByZWdpc3RlciBhbGxvY2F0ZSB0aGUgd2hvbGUgZnVuY3Rpb24KKyAgICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiYpOworCisgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIHNraXAgdGhpcyByZWdpc3RlciBkdWUgdG8gaXRzIGJlaW5nIHJlY2VudGx5IHVzZWQuCisgICAgYm9vbCBpc1JlY2VudGx5VXNlZCh1bnNpZ25lZCByZWcpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OmZpbmQoUmVjZW50UmVncy5iZWdpbigpLCBSZWNlbnRSZWdzLmVuZCgpLCByZWcpICE9CisgICAgICAgICAgICAgUmVjZW50UmVncy5lbmQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gbGluZWFyU2NhbiAtIHRoZSBsaW5lYXIgc2NhbiBhbGdvcml0aG0KKyAgICB2b2lkIGxpbmVhclNjYW4oKTsKKworICAgIC8vLyBpbml0SW50ZXJ2YWxTZXRzIC0gaW5pdGlhbGl6ZSB0aGUgaW50ZXJ2YWwgc2V0cy4KKyAgICAvLy8KKyAgICB2b2lkIGluaXRJbnRlcnZhbFNldHMoKTsKKworICAgIC8vLyBwcm9jZXNzQWN0aXZlSW50ZXJ2YWxzIC0gZXhwaXJlIG9sZCBpbnRlcnZhbHMgYW5kIG1vdmUgbm9uLW92ZXJsYXBwaW5nCisgICAgLy8vIG9uZXMgdG8gdGhlIGluYWN0aXZlIGxpc3QuCisgICAgdm9pZCBwcm9jZXNzQWN0aXZlSW50ZXJ2YWxzKFNsb3RJbmRleCBDdXJQb2ludCk7CisKKyAgICAvLy8gcHJvY2Vzc0luYWN0aXZlSW50ZXJ2YWxzIC0gZXhwaXJlIG9sZCBpbnRlcnZhbHMgYW5kIG1vdmUgb3ZlcmxhcHBpbmcKKyAgICAvLy8gb25lcyB0byB0aGUgYWN0aXZlIGxpc3QuCisgICAgdm9pZCBwcm9jZXNzSW5hY3RpdmVJbnRlcnZhbHMoU2xvdEluZGV4IEN1clBvaW50KTsKKworICAgIC8vLyBoYXNOZXh0UmVsb2FkSW50ZXJ2YWwgLSBSZXR1cm4gdGhlIG5leHQgbGl2ZWludGVydmFsIHRoYXQncyBiZWluZworICAgIC8vLyBkZWZpbmVkIGJ5IGEgcmVsb2FkIGZyb20gdGhlIHNhbWUgU1MgYXMgdGhlIHNwZWNpZmllZCBvbmUuCisgICAgTGl2ZUludGVydmFsICpoYXNOZXh0UmVsb2FkSW50ZXJ2YWwoTGl2ZUludGVydmFsICpjdXIpOworCisgICAgLy8vIERvd25ncmFkZVJlZ2lzdGVyIC0gRG93bmdyYWRlIGEgcmVnaXN0ZXIgZm9yIGFsbG9jYXRpb24uCisgICAgdm9pZCBEb3duZ3JhZGVSZWdpc3RlcihMaXZlSW50ZXJ2YWwgKmxpLCB1bnNpZ25lZCBSZWcpOworCisgICAgLy8vIFVwZ3JhZGVSZWdpc3RlciAtIFVwZ3JhZGUgYSByZWdpc3RlciBmb3IgYWxsb2NhdGlvbi4KKyAgICB2b2lkIFVwZ3JhZGVSZWdpc3Rlcih1bnNpZ25lZCBSZWcpOworCisgICAgLy8vIGFzc2lnblJlZ09yU3RhY2tTbG90QXRJbnRlcnZhbCAtIGFzc2lnbiBhIHJlZ2lzdGVyIGlmIG9uZQorICAgIC8vLyBpcyBhdmFpbGFibGUsIG9yIHNwaWxsLgorICAgIHZvaWQgYXNzaWduUmVnT3JTdGFja1Nsb3RBdEludGVydmFsKExpdmVJbnRlcnZhbCogY3VyKTsKKworICAgIHZvaWQgdXBkYXRlU3BpbGxXZWlnaHRzKHN0ZDo6dmVjdG9yPGZsb2F0PiAmV2VpZ2h0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZWcsIGZsb2F0IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgICAvLy8gZmluZEludGVydmFsc1RvU3BpbGwgLSBEZXRlcm1pbmUgdGhlIGludGVydmFscyB0byBzcGlsbCBmb3IgdGhlCisgICAgLy8vIHNwZWNpZmllZCBpbnRlcnZhbC4gSXQncyBwYXNzZWQgdGhlIHBoeXNpY2FsIHJlZ2lzdGVycyB3aG9zZSBzcGlsbAorICAgIC8vLyB3ZWlnaHQgaXMgdGhlIGxvd2VzdCBhbW9uZyBhbGwgdGhlIHJlZ2lzdGVycyB3aG9zZSBsaXZlIGludGVydmFscworICAgIC8vLyBjb25mbGljdCB3aXRoIHRoZSBpbnRlcnZhbC4KKyAgICB2b2lkIGZpbmRJbnRlcnZhbHNUb1NwaWxsKExpdmVJbnRlcnZhbCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCxmbG9hdD4gPiAmQ2FuZGlkYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxMaXZlSW50ZXJ2YWwqLCA4PiAmU3BpbGxJbnRlcnZhbHMpOworCisgICAgLy8vIGF0dGVtcHRUcml2aWFsQ29hbGVzY2luZyAtIElmIGEgc2ltcGxlIGludGVydmFsIGlzIGRlZmluZWQgYnkgYSBjb3B5LAorICAgIC8vLyB0cnkgdG8gYWxsb2NhdGUgdGhlIGRlZmluaXRpb24gdG8gdGhlIHNhbWUgcmVnaXN0ZXIgYXMgdGhlIHNvdXJjZSwKKyAgICAvLy8gaWYgdGhlIHJlZ2lzdGVyIGlzIG5vdCBkZWZpbmVkIGR1cmluZyB0aGUgbGlmZSB0aW1lIG9mIHRoZSBpbnRlcnZhbC4KKyAgICAvLy8gVGhpcyBlbGltaW5hdGVzIGEgY29weSwgYW5kIGlzIHVzZWQgdG8gY29hbGVzY2UgY29waWVzIHdoaWNoIHdlcmUgbm90CisgICAgLy8vIGNvYWxlc2NlZCBhd2F5IGJlZm9yZSBhbGxvY2F0aW9uIGVpdGhlciBkdWUgdG8gZGVzdCBhbmQgc3JjIGJlaW5nIGluCisgICAgLy8vIGRpZmZlcmVudCByZWdpc3RlciBjbGFzc2VzIG9yIGJlY2F1c2UgdGhlIGNvYWxlc2NlciB3YXMgb3Zlcmx5CisgICAgLy8vIGNvbnNlcnZhdGl2ZS4KKyAgICB1bnNpZ25lZCBhdHRlbXB0VHJpdmlhbENvYWxlc2NpbmcoTGl2ZUludGVydmFsICZjdXIsIHVuc2lnbmVkIFJlZyk7CisKKyAgICAvLy8KKyAgICAvLy8gUmVnaXN0ZXIgdXNhZ2UgLyBhdmFpbGFiaWxpdHkgdHJhY2tpbmcgaGVscGVycy4KKyAgICAvLy8KKworICAgIHZvaWQgaW5pdFJlZ1VzZXMoKSB7CisgICAgICByZWdVc2VfLnJlc2l6ZSh0cmlfLT5nZXROdW1SZWdzKCksIDApOworICAgICAgcmVnVXNlQmFja1VwXy5yZXNpemUodHJpXy0+Z2V0TnVtUmVncygpLCAwKTsKKyAgICB9CisKKyAgICB2b2lkIGZpbmFsaXplUmVnVXNlcygpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAvLyBWZXJpZnkgYWxsIHRoZSByZWdpc3RlcnMgYXJlICJmcmVlZCIuCisgICAgICBib29sIEVycm9yID0gZmFsc2U7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gdHJpXy0+Z2V0TnVtUmVncygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBpZiAocmVnVXNlX1tpXSAhPSAwKSB7CisgICAgICAgICAgZGJncygpIDw8IHRyaV8tPmdldE5hbWUoaSkgPDwgIiBpcyBzdGlsbCBpbiB1c2UhXG4iOworICAgICAgICAgIEVycm9yID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKEVycm9yKQorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworI2VuZGlmCisgICAgICByZWdVc2VfLmNsZWFyKCk7CisgICAgICByZWdVc2VCYWNrVXBfLmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBhZGRSZWdVc2UodW5zaWduZWQgcGh5c1JlZykgeworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKHBoeXNSZWcpICYmCisgICAgICAgICAgICAgInNob3VsZCBiZSBwaHlzaWNhbCByZWdpc3RlciEiKTsKKyAgICAgICsrcmVnVXNlX1twaHlzUmVnXTsKKyAgICAgIGZvciAoY29uc3QgdW5zaWduZWQqIGFzID0gdHJpXy0+Z2V0QWxpYXNTZXQocGh5c1JlZyk7ICphczsgKythcykKKyAgICAgICAgKytyZWdVc2VfWyphc107CisgICAgfQorCisgICAgdm9pZCBkZWxSZWdVc2UodW5zaWduZWQgcGh5c1JlZykgeworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKHBoeXNSZWcpICYmCisgICAgICAgICAgICAgInNob3VsZCBiZSBwaHlzaWNhbCByZWdpc3RlciEiKTsKKyAgICAgIGFzc2VydChyZWdVc2VfW3BoeXNSZWddICE9IDApOworICAgICAgLS1yZWdVc2VfW3BoeXNSZWddOworICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCogYXMgPSB0cmlfLT5nZXRBbGlhc1NldChwaHlzUmVnKTsgKmFzOyArK2FzKSB7CisgICAgICAgIGFzc2VydChyZWdVc2VfWyphc10gIT0gMCk7CisgICAgICAgIC0tcmVnVXNlX1sqYXNdOworICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNSZWdBdmFpbCh1bnNpZ25lZCBwaHlzUmVnKSBjb25zdCB7CisgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIocGh5c1JlZykgJiYKKyAgICAgICAgICAgICAic2hvdWxkIGJlIHBoeXNpY2FsIHJlZ2lzdGVyISIpOworICAgICAgcmV0dXJuIHJlZ1VzZV9bcGh5c1JlZ10gPT0gMDsKKyAgICB9CisKKyAgICB2b2lkIGJhY2tVcFJlZ1VzZXMoKSB7CisgICAgICByZWdVc2VCYWNrVXBfID0gcmVnVXNlXzsKKyAgICB9CisKKyAgICB2b2lkIHJlc3RvcmVSZWdVc2VzKCkgeworICAgICAgcmVnVXNlXyA9IHJlZ1VzZUJhY2tVcF87CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFJlZ2lzdGVyIGhhbmRsaW5nIGhlbHBlcnMuCisgICAgLy8vCisKKyAgICAvLy8gZ2V0RnJlZVBoeXNSZWcgLSByZXR1cm4gYSBmcmVlIHBoeXNpY2FsIHJlZ2lzdGVyIGZvciB0aGlzIHZpcnR1YWwKKyAgICAvLy8gcmVnaXN0ZXIgaW50ZXJ2YWwgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSByZXR1cm4gMC4KKyAgICB1bnNpZ25lZCBnZXRGcmVlUGh5c1JlZyhMaXZlSW50ZXJ2YWwqIGN1cik7CisgICAgdW5zaWduZWQgZ2V0RnJlZVBoeXNSZWcoTGl2ZUludGVydmFsKiBjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4SW5hY3RpdmVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMjU2PiAmaW5hY3RpdmVDb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTa2lwREdSZWdzKTsKKworICAgIHZvaWQgQ29tcHV0ZVJlbGF0ZWRSZWdDbGFzc2VzKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRUeT4KKyAgICB2b2lkIHByaW50SW50ZXJ2YWxzKGNvbnN0IGNoYXIqIGNvbnN0IHN0ciwgSXRUeSBpLCBJdFR5IGUpIGNvbnN0IHsKKyAgICAgIERFQlVHKHsKKyAgICAgICAgICBpZiAoc3RyKQorICAgICAgICAgICAgZGJncygpIDw8IHN0ciA8PCAiIGludGVydmFsczpcbiI7CisKKyAgICAgICAgICBmb3IgKDsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICAgIGRiZ3MoKSA8PCAiXHQiIDw8ICppLT5maXJzdCA8PCAiIC0+ICI7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIHJlZyA9IGktPmZpcnN0LT5yZWc7CisgICAgICAgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihyZWcpKQorICAgICAgICAgICAgICByZWcgPSB2cm1fLT5nZXRQaHlzKHJlZyk7CisKKyAgICAgICAgICAgIGRiZ3MoKSA8PCB0cmlfLT5nZXROYW1lKHJlZykgPDwgJ1xuJzsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKyAgfTsKKyAgY2hhciBSQUxpblNjYW46OklEID0gMDsKK30KKworSU5JVElBTElaRV9QQVNTKFJBTGluU2NhbiwgImxpbmVhcnNjYW4tcmVnYWxsb2MiLAorICAgICAgICAgICAgICAgICJMaW5lYXIgU2NhbiBSZWdpc3RlciBBbGxvY2F0b3IiLCBmYWxzZSwgZmFsc2UpOworCit2b2lkIFJBTGluU2Nhbjo6Q29tcHV0ZVJlbGF0ZWRSZWdDbGFzc2VzKCkgeworICAvLyBGaXJzdCBwYXNzLCBhZGQgYWxsIHJlZyBjbGFzc2VzIHRvIHRoZSB1bmlvbiwgYW5kIGRldGVybWluZSBhdCBsZWFzdCBvbmUKKyAgLy8gcmVnIGNsYXNzIHRoYXQgZWFjaCByZWdpc3RlciBpcyBpbi4KKyAgYm9vbCBIYXNBbGlhc2VzID0gZmFsc2U7CisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjpyZWdjbGFzc19pdGVyYXRvciBSQ0kgPSB0cmlfLT5yZWdjbGFzc19iZWdpbigpLAorICAgICAgIEUgPSB0cmlfLT5yZWdjbGFzc19lbmQoKTsgUkNJICE9IEU7ICsrUkNJKSB7CisgICAgUmVsYXRlZFJlZ0NsYXNzZXMuaW5zZXJ0KCpSQ0kpOworICAgIGZvciAoVGFyZ2V0UmVnaXN0ZXJDbGFzczo6aXRlcmF0b3IgSSA9ICgqUkNJKS0+YmVnaW4oKSwgRSA9ICgqUkNJKS0+ZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgSGFzQWxpYXNlcyA9IEhhc0FsaWFzZXMgfHwgKnRyaV8tPmdldEFsaWFzU2V0KCpJKSAhPSAwOworICAgICAgCisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzIComUFJDID0gT25lQ2xhc3NGb3JFYWNoUGh5c1JlZ1sqSV07CisgICAgICBpZiAoUFJDKSB7CisgICAgICAgIC8vIEFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgcmVnaXN0ZXIuICBKdXN0IG1ha2Ugc3VyZSB3ZSBrbm93IHRoYXQKKyAgICAgICAgLy8gbXVsdGlwbGUgcmVnaXN0ZXIgY2xhc3NlcyBzaGFyZSBhIHJlZ2lzdGVyLgorICAgICAgICBSZWxhdGVkUmVnQ2xhc3Nlcy51bmlvblNldHMoUFJDLCAqUkNJKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFBSQyA9ICpSQ0k7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvLyBTZWNvbmQgcGFzcywgbm93IHRoYXQgd2Uga25vdyBjb25zZXJ2YXRpdmVseSB3aGF0IHJlZ2lzdGVyIGNsYXNzZXMgZWFjaCByZWcKKyAgLy8gYmVsb25ncyB0bywgYWRkIGluZm8gYWJvdXQgYWxpYXNlcy4gIFdlIGRvbid0IG5lZWQgdG8gZG8gdGhpcyBmb3IgdGFyZ2V0cworICAvLyB3aXRob3V0IHJlZ2lzdGVyIGFsaWFzZXMuCisgIGlmIChIYXNBbGlhc2VzKQorICAgIGZvciAoRGVuc2VNYXA8dW5zaWduZWQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqPjo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSBPbmVDbGFzc0ZvckVhY2hQaHlzUmVnLmJlZ2luKCksIEUgPSBPbmVDbGFzc0ZvckVhY2hQaHlzUmVnLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBUyA9IHRyaV8tPmdldEFsaWFzU2V0KEktPmZpcnN0KTsgKkFTOyArK0FTKQorICAgICAgICBSZWxhdGVkUmVnQ2xhc3Nlcy51bmlvblNldHMoSS0+c2Vjb25kLCBPbmVDbGFzc0ZvckVhY2hQaHlzUmVnWypBU10pOworfQorCisvLy8gYXR0ZW1wdFRyaXZpYWxDb2FsZXNjaW5nIC0gSWYgYSBzaW1wbGUgaW50ZXJ2YWwgaXMgZGVmaW5lZCBieSBhIGNvcHksIHRyeQorLy8vIGFsbG9jYXRlIHRoZSBkZWZpbml0aW9uIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaWYgdGhlCisvLy8gcmVnaXN0ZXIgaXMgbm90IGRlZmluZWQgZHVyaW5nIGxpdmUgdGltZSBvZiB0aGUgaW50ZXJ2YWwuIElmIHRoZSBpbnRlcnZhbCBpcworLy8vIGtpbGxlZCBieSBhIGNvcHksIHRyeSB0byB1c2UgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLiBUaGlzIGVsaW1pbmF0ZXMgYQorLy8vIGNvcHkuIFRoaXMgaXMgdXNlZCB0byBjb2FsZXNjZSBjb3BpZXMgd2hpY2ggd2VyZSBub3QgY29hbGVzY2VkIGF3YXkgYmVmb3JlCisvLy8gYWxsb2NhdGlvbiBlaXRoZXIgZHVlIHRvIGRlc3QgYW5kIHNyYyBiZWluZyBpbiBkaWZmZXJlbnQgcmVnaXN0ZXIgY2xhc3NlcyBvcgorLy8vIGJlY2F1c2UgdGhlIGNvYWxlc2NlciB3YXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZS4KK3Vuc2lnbmVkIFJBTGluU2Nhbjo6YXR0ZW1wdFRyaXZpYWxDb2FsZXNjaW5nKExpdmVJbnRlcnZhbCAmY3VyLCB1bnNpZ25lZCBSZWcpIHsKKyAgdW5zaWduZWQgUHJlZmVyZW5jZSA9IHZybV8tPmdldFJlZ0FsbG9jUHJlZihjdXIucmVnKTsKKyAgaWYgKChQcmVmZXJlbmNlICYmIFByZWZlcmVuY2UgPT0gUmVnKSB8fCAhY3VyLmNvbnRhaW5zT25lVmFsdWUoKSkKKyAgICByZXR1cm4gUmVnOworCisgIC8vIFdlIGNhbm5vdCBoYW5kbGUgY29tcGxpY2F0ZWQgbGl2ZSByYW5nZXMuIFNpbXBsZSBsaW5lYXIgc3R1ZmYgb25seS4KKyAgaWYgKGN1ci5yYW5nZXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIFJlZzsKKworICBjb25zdCBMaXZlUmFuZ2UgJnJhbmdlID0gY3VyLnJhbmdlcy5mcm9udCgpOworCisgIFZOSW5mbyAqdm5pID0gcmFuZ2UudmFsbm87CisgIGlmICh2bmktPmlzVW51c2VkKCkpCisgICAgcmV0dXJuIFJlZzsKKworICB1bnNpZ25lZCBDYW5kUmVnOworICB7CisgICAgTWFjaGluZUluc3RyICpDb3B5TUk7CisgICAgaWYgKHZuaS0+ZGVmICE9IFNsb3RJbmRleCgpICYmIHZuaS0+aXNEZWZBY2N1cmF0ZSgpICYmCisgICAgICAgIChDb3B5TUkgPSBsaV8tPmdldEluc3RydWN0aW9uRnJvbUluZGV4KHZuaS0+ZGVmKSkgJiYgQ29weU1JLT5pc0NvcHkoKSkKKyAgICAgIC8vIERlZmluZWQgYnkgYSBjb3B5LCB0cnkgdG8gZXh0ZW5kIFNyY1JlZyBmb3J3YXJkCisgICAgICBDYW5kUmVnID0gQ29weU1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgIGVsc2UgaWYgKFRyaXZDb2FsZXNjZUVuZHMgJiYKKyAgICAgICAgICAgIChDb3B5TUkgPSBsaV8tPmdldEluc3RydWN0aW9uRnJvbUluZGV4KHJhbmdlLmVuZC5nZXRCYXNlSW5kZXgoKSkpICYmCisgICAgICAgICAgICAgQ29weU1JLT5pc0NvcHkoKSAmJiBjdXIucmVnID09IENvcHlNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkKKyAgICAgIC8vIE9ubHkgdXNlZCBieSBhIGNvcHksIHRyeSB0byBleHRlbmQgRHN0UmVnIGJhY2t3YXJkcworICAgICAgQ2FuZFJlZyA9IENvcHlNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gUmVnOworICB9CisKKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoQ2FuZFJlZykpIHsKKyAgICBpZiAoIXZybV8tPmlzQXNzaWduZWRSZWcoQ2FuZFJlZykpCisgICAgICByZXR1cm4gUmVnOworICAgIENhbmRSZWcgPSB2cm1fLT5nZXRQaHlzKENhbmRSZWcpOworICB9CisgIGlmIChSZWcgPT0gQ2FuZFJlZykKKyAgICByZXR1cm4gUmVnOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gbXJpXy0+Z2V0UmVnQ2xhc3MoY3VyLnJlZyk7CisgIGlmICghUkMtPmNvbnRhaW5zKENhbmRSZWcpKQorICAgIHJldHVybiBSZWc7CisKKyAgaWYgKGxpXy0+Y29uZmxpY3RzV2l0aFBoeXNSZWcoY3VyLCAqdnJtXywgQ2FuZFJlZykpCisgICAgcmV0dXJuIFJlZzsKKworICAvLyBUcnkgdG8gY29hbGVzY2UuCisgIERFQlVHKGRiZ3MoKSA8PCAiQ29hbGVzY2luZzogIiA8PCBjdXIgPDwgIiAtPiAiIDw8IHRyaV8tPmdldE5hbWUoQ2FuZFJlZykKKyAgICAgICAgPDwgJ1xuJyk7CisgIHZybV8tPmNsZWFyVmlydChjdXIucmVnKTsKKyAgdnJtXy0+YXNzaWduVmlydDJQaHlzKGN1ci5yZWcsIENhbmRSZWcpOworCisgICsrTnVtQ29hbGVzY2U7CisgIHJldHVybiBDYW5kUmVnOworfQorCitib29sIFJBTGluU2Nhbjo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZmbikgeworICBtZl8gPSAmZm47CisgIG1yaV8gPSAmZm4uZ2V0UmVnSW5mbygpOworICB0bV8gPSAmZm4uZ2V0VGFyZ2V0KCk7CisgIHRyaV8gPSB0bV8tPmdldFJlZ2lzdGVySW5mbygpOworICB0aWlfID0gdG1fLT5nZXRJbnN0ckluZm8oKTsKKyAgYWxsb2NhdGFibGVSZWdzXyA9IHRyaV8tPmdldEFsbG9jYXRhYmxlU2V0KGZuKTsKKyAgbGlfID0gJmdldEFuYWx5c2lzPExpdmVJbnRlcnZhbHM+KCk7CisgIGxzXyA9ICZnZXRBbmFseXNpczxMaXZlU3RhY2tzPigpOworICBsb29wSW5mbyA9ICZnZXRBbmFseXNpczxNYWNoaW5lTG9vcEluZm8+KCk7CisKKyAgLy8gV2UgZG9uJ3QgcnVuIHRoZSBjb2FsZXNjZXIgaGVyZSBiZWNhdXNlIHdlIGhhdmUgbm8gcmVhc29uIHRvCisgIC8vIGludGVyYWN0IHdpdGggaXQuICBJZiB0aGUgY29hbGVzY2VyIHJlcXVpcmVzIGludGVyYWN0aW9uLCBpdAorICAvLyB3b24ndCBkbyBhbnl0aGluZy4gIElmIGl0IGRvZXNuJ3QgcmVxdWlyZSBpbnRlcmFjdGlvbiwgd2UgYXNzdW1lCisgIC8vIGl0IHdhcyBydW4gYXMgYSBzZXBhcmF0ZSBwYXNzLgorCisgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGZ1bmN0aW9uIGNvbXBpbGVkLCBjb21wdXRlIHRoZSByZWxhdGVkIHJlZyBjbGFzc2VzLgorICBpZiAoUmVsYXRlZFJlZ0NsYXNzZXMuZW1wdHkoKSkKKyAgICBDb21wdXRlUmVsYXRlZFJlZ0NsYXNzZXMoKTsKKworICAvLyBBbHNvIHJlc2l6ZSByZWdpc3RlciB1c2FnZSB0cmFja2Vycy4KKyAgaW5pdFJlZ1VzZXMoKTsKKworICB2cm1fID0gJmdldEFuYWx5c2lzPFZpcnRSZWdNYXA+KCk7CisgIGlmICghcmV3cml0ZXJfLmdldCgpKSByZXdyaXRlcl8ucmVzZXQoY3JlYXRlVmlydFJlZ1Jld3JpdGVyKCkpOworICAKKyAgc3BpbGxlcl8ucmVzZXQoY3JlYXRlU3BpbGxlcigqdGhpcywgKm1mXywgKnZybV8pKTsKKyAgCisgIGluaXRJbnRlcnZhbFNldHMoKTsKKworICBsaW5lYXJTY2FuKCk7CisKKyAgLy8gUmV3cml0ZSBzcGlsbCBjb2RlIGFuZCB1cGRhdGUgdGhlIFBoeXNSZWdzVXNlZCBzZXQuCisgIHJld3JpdGVyXy0+cnVuT25NYWNoaW5lRnVuY3Rpb24oKm1mXywgKnZybV8sIGxpXyk7CisKKyAgYXNzZXJ0KHVuaGFuZGxlZF8uZW1wdHkoKSAmJiAiVW5oYW5kbGVkIGxpdmUgaW50ZXJ2YWxzIHJlbWFpbiEiKTsKKworICBmaW5hbGl6ZVJlZ1VzZXMoKTsKKworICBmaXhlZF8uY2xlYXIoKTsKKyAgYWN0aXZlXy5jbGVhcigpOworICBpbmFjdGl2ZV8uY2xlYXIoKTsKKyAgaGFuZGxlZF8uY2xlYXIoKTsKKyAgTmV4dFJlbG9hZE1hcC5jbGVhcigpOworICBEb3duZ3JhZGVkUmVncy5jbGVhcigpOworICBEb3duZ3JhZGVNYXAuY2xlYXIoKTsKKyAgc3BpbGxlcl8ucmVzZXQoMCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpbml0SW50ZXJ2YWxTZXRzIC0gaW5pdGlhbGl6ZSB0aGUgaW50ZXJ2YWwgc2V0cy4KKy8vLwordm9pZCBSQUxpblNjYW46OmluaXRJbnRlcnZhbFNldHMoKQoreworICBhc3NlcnQodW5oYW5kbGVkXy5lbXB0eSgpICYmIGZpeGVkXy5lbXB0eSgpICYmCisgICAgICAgICBhY3RpdmVfLmVtcHR5KCkgJiYgaW5hY3RpdmVfLmVtcHR5KCkgJiYKKyAgICAgICAgICJpbnRlcnZhbCBzZXRzIHNob3VsZCBiZSBlbXB0eSBvbiBpbml0aWFsaXphdGlvbiIpOworCisgIGhhbmRsZWRfLnJlc2VydmUobGlfLT5nZXROdW1JbnRlcnZhbHMoKSk7CisKKyAgZm9yIChMaXZlSW50ZXJ2YWxzOjppdGVyYXRvciBpID0gbGlfLT5iZWdpbigpLCBlID0gbGlfLT5lbmQoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoaS0+c2Vjb25kLT5yZWcpKSB7CisgICAgICBpZiAoIWktPnNlY29uZC0+ZW1wdHkoKSkgeworICAgICAgICBtcmlfLT5zZXRQaHlzUmVnVXNlZChpLT5zZWNvbmQtPnJlZyk7CisgICAgICAgIGZpeGVkXy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoaS0+c2Vjb25kLCBpLT5zZWNvbmQtPmJlZ2luKCkpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGktPnNlY29uZC0+ZW1wdHkoKSkgeworICAgICAgICBhc3NpZ25SZWdPclN0YWNrU2xvdEF0SW50ZXJ2YWwoaS0+c2Vjb25kKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdW5oYW5kbGVkXy5wdXNoKGktPnNlY29uZCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUkFMaW5TY2FuOjpsaW5lYXJTY2FuKCkgeworICAvLyBsaW5lYXIgc2NhbiBhbGdvcml0aG0KKyAgREVCVUcoeworICAgICAgZGJncygpIDw8ICIqKioqKioqKioqIExJTkVBUiBTQ0FOICoqKioqKioqKipcbiIKKyAgICAgICAgICAgICA8PCAiKioqKioqKioqKiBGdW5jdGlvbjogIiAKKyAgICAgICAgICAgICA8PCBtZl8tPmdldEZ1bmN0aW9uKCktPmdldE5hbWUoKSA8PCAnXG4nOworICAgICAgcHJpbnRJbnRlcnZhbHMoImZpeGVkIiwgZml4ZWRfLmJlZ2luKCksIGZpeGVkXy5lbmQoKSk7CisgICAgfSk7CisKKyAgd2hpbGUgKCF1bmhhbmRsZWRfLmVtcHR5KCkpIHsKKyAgICAvLyBwaWNrIHRoZSBpbnRlcnZhbCB3aXRoIHRoZSBlYXJsaWVzdCBzdGFydCBwb2ludAorICAgIExpdmVJbnRlcnZhbCogY3VyID0gdW5oYW5kbGVkXy50b3AoKTsKKyAgICB1bmhhbmRsZWRfLnBvcCgpOworICAgICsrTnVtSXRlcnM7CisgICAgREVCVUcoZGJncygpIDw8ICJcbioqKiBDVVJSRU5UICoqKjogIiA8PCAqY3VyIDw8ICdcbicpOworCisgICAgYXNzZXJ0KCFjdXItPmVtcHR5KCkgJiYgIkVtcHR5IGludGVydmFsIGluIHVuaGFuZGxlZCBzZXQuIik7CisKKyAgICBwcm9jZXNzQWN0aXZlSW50ZXJ2YWxzKGN1ci0+YmVnaW5JbmRleCgpKTsKKyAgICBwcm9jZXNzSW5hY3RpdmVJbnRlcnZhbHMoY3VyLT5iZWdpbkluZGV4KCkpOworCisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoY3VyLT5yZWcpICYmCisgICAgICAgICAgICJDYW4gb25seSBhbGxvY2F0ZSB2aXJ0dWFsIHJlZ2lzdGVycyEiKTsKKworICAgIC8vIEFsbG9jYXRpbmcgYSB2aXJ0dWFsIHJlZ2lzdGVyLiB0cnkgdG8gZmluZCBhIGZyZWUKKyAgICAvLyBwaHlzaWNhbCByZWdpc3RlciBvciBzcGlsbCBhbiBpbnRlcnZhbCAocG9zc2libHkgdGhpcyBvbmUpIGluIG9yZGVyIHRvCisgICAgLy8gYXNzaWduIGl0IG9uZS4KKyAgICBhc3NpZ25SZWdPclN0YWNrU2xvdEF0SW50ZXJ2YWwoY3VyKTsKKworICAgIERFQlVHKHsKKyAgICAgICAgcHJpbnRJbnRlcnZhbHMoImFjdGl2ZSIsIGFjdGl2ZV8uYmVnaW4oKSwgYWN0aXZlXy5lbmQoKSk7CisgICAgICAgIHByaW50SW50ZXJ2YWxzKCJpbmFjdGl2ZSIsIGluYWN0aXZlXy5iZWdpbigpLCBpbmFjdGl2ZV8uZW5kKCkpOworICAgICAgfSk7CisgIH0KKworICAvLyBFeHBpcmUgYW55IHJlbWFpbmluZyBhY3RpdmUgaW50ZXJ2YWxzCisgIHdoaWxlICghYWN0aXZlXy5lbXB0eSgpKSB7CisgICAgSW50ZXJ2YWxQdHIgJklQID0gYWN0aXZlXy5iYWNrKCk7CisgICAgdW5zaWduZWQgcmVnID0gSVAuZmlyc3QtPnJlZzsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0aW50ZXJ2YWwgIiA8PCAqSVAuZmlyc3QgPDwgIiBleHBpcmVkXG4iKTsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihyZWcpICYmCisgICAgICAgICAgICJDYW4gb25seSBhbGxvY2F0ZSB2aXJ0dWFsIHJlZ2lzdGVycyEiKTsKKyAgICByZWcgPSB2cm1fLT5nZXRQaHlzKHJlZyk7CisgICAgZGVsUmVnVXNlKHJlZyk7CisgICAgYWN0aXZlXy5wb3BfYmFjaygpOworICB9CisKKyAgLy8gRXhwaXJlIGFueSByZW1haW5pbmcgaW5hY3RpdmUgaW50ZXJ2YWxzCisgIERFQlVHKHsKKyAgICAgIGZvciAoSW50ZXJ2YWxQdHJzOjpyZXZlcnNlX2l0ZXJhdG9yCisgICAgICAgICAgICAgaSA9IGluYWN0aXZlXy5yYmVnaW4oKTsgaSAhPSBpbmFjdGl2ZV8ucmVuZCgpOyArK2kpCisgICAgICAgIGRiZ3MoKSA8PCAiXHRpbnRlcnZhbCAiIDw8ICppLT5maXJzdCA8PCAiIGV4cGlyZWRcbiI7CisgICAgfSk7CisgIGluYWN0aXZlXy5jbGVhcigpOworCisgIC8vIEFkZCBsaXZlLWlucyB0byBldmVyeSBCQiBleGNlcHQgZm9yIGVudHJ5LiBBbHNvIHBlcmZvcm0gdHJpdmlhbCBjb2FsZXNjaW5nLgorICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEVudHJ5TUJCID0gbWZfLT5iZWdpbigpOworICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDg+IExpdmVJbk1CQnM7CisgIGZvciAoTGl2ZUludGVydmFsczo6aXRlcmF0b3IgaSA9IGxpXy0+YmVnaW4oKSwgZSA9IGxpXy0+ZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTGl2ZUludGVydmFsICZjdXIgPSAqaS0+c2Vjb25kOworICAgIHVuc2lnbmVkIFJlZyA9IDA7CisgICAgYm9vbCBpc1BoeXMgPSBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihjdXIucmVnKTsKKyAgICBpZiAoaXNQaHlzKQorICAgICAgUmVnID0gY3VyLnJlZzsKKyAgICBlbHNlIGlmICh2cm1fLT5pc0Fzc2lnbmVkUmVnKGN1ci5yZWcpKQorICAgICAgUmVnID0gYXR0ZW1wdFRyaXZpYWxDb2FsZXNjaW5nKGN1ciwgdnJtXy0+Z2V0UGh5cyhjdXIucmVnKSk7CisgICAgaWYgKCFSZWcpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBJZ25vcmUgc3BsaXRlZCBsaXZlIGludGVydmFscy4KKyAgICBpZiAoIWlzUGh5cyAmJiB2cm1fLT5nZXRQcmVTcGxpdFJlZyhjdXIucmVnKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgZm9yIChMaXZlSW50ZXJ2YWw6OlJhbmdlczo6Y29uc3RfaXRlcmF0b3IgSSA9IGN1ci5iZWdpbigpLCBFID0gY3VyLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGNvbnN0IExpdmVSYW5nZSAmTFIgPSAqSTsKKyAgICAgIGlmIChsaV8tPmZpbmRMaXZlSW5NQkJzKExSLnN0YXJ0LCBMUi5lbmQsIExpdmVJbk1CQnMpKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMaXZlSW5NQkJzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgaWYgKExpdmVJbk1CQnNbaV0gIT0gRW50cnlNQkIpIHsKKyAgICAgICAgICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpICYmCisgICAgICAgICAgICAgICAgICAgIkFkZGluZyBhIHZpcnR1YWwgcmVnaXN0ZXIgdG8gbGl2ZWluIHNldD8iKTsKKyAgICAgICAgICAgIExpdmVJbk1CQnNbaV0tPmFkZExpdmVJbihSZWcpOworICAgICAgICAgIH0KKyAgICAgICAgTGl2ZUluTUJCcy5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAqdnJtXyk7CisKKyAgLy8gTG9vayBmb3IgcGh5c2ljYWwgcmVnaXN0ZXJzIHRoYXQgZW5kIHVwIG5vdCBiZWluZyBhbGxvY2F0ZWQgZXZlbiB0aG91Z2gKKyAgLy8gcmVnaXN0ZXIgYWxsb2NhdG9yIGhhZCB0byBzcGlsbCBvdGhlciByZWdpc3RlcnMgaW4gaXRzIHJlZ2lzdGVyIGNsYXNzLgorICBpZiAobHNfLT5nZXROdW1JbnRlcnZhbHMoKSA9PSAwKQorICAgIHJldHVybjsKKyAgaWYgKCF2cm1fLT5GaW5kVW51c2VkUmVnaXN0ZXJzKGxpXykpCisgICAgcmV0dXJuOworfQorCisvLy8gcHJvY2Vzc0FjdGl2ZUludGVydmFscyAtIGV4cGlyZSBvbGQgaW50ZXJ2YWxzIGFuZCBtb3ZlIG5vbi1vdmVybGFwcGluZyBvbmVzCisvLy8gdG8gdGhlIGluYWN0aXZlIGxpc3QuCit2b2lkIFJBTGluU2Nhbjo6cHJvY2Vzc0FjdGl2ZUludGVydmFscyhTbG90SW5kZXggQ3VyUG9pbnQpCit7CisgIERFQlVHKGRiZ3MoKSA8PCAiXHRwcm9jZXNzaW5nIGFjdGl2ZSBpbnRlcnZhbHM6XG4iKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gYWN0aXZlXy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTGl2ZUludGVydmFsICpJbnRlcnZhbCA9IGFjdGl2ZV9baV0uZmlyc3Q7CisgICAgTGl2ZUludGVydmFsOjppdGVyYXRvciBJbnRlcnZhbFBvcyA9IGFjdGl2ZV9baV0uc2Vjb25kOworICAgIHVuc2lnbmVkIHJlZyA9IEludGVydmFsLT5yZWc7CisKKyAgICBJbnRlcnZhbFBvcyA9IEludGVydmFsLT5hZHZhbmNlVG8oSW50ZXJ2YWxQb3MsIEN1clBvaW50KTsKKworICAgIGlmIChJbnRlcnZhbFBvcyA9PSBJbnRlcnZhbC0+ZW5kKCkpIHsgICAgIC8vIFJlbW92ZSBleHBpcmVkIGludGVydmFscy4KKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdGludGVydmFsICIgPDwgKkludGVydmFsIDw8ICIgZXhwaXJlZFxuIik7CisgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihyZWcpICYmCisgICAgICAgICAgICAgIkNhbiBvbmx5IGFsbG9jYXRlIHZpcnR1YWwgcmVnaXN0ZXJzISIpOworICAgICAgcmVnID0gdnJtXy0+Z2V0UGh5cyhyZWcpOworICAgICAgZGVsUmVnVXNlKHJlZyk7CisKKyAgICAgIC8vIFBvcCBvZmYgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICAgIGFjdGl2ZV9baV0gPSBhY3RpdmVfLmJhY2soKTsKKyAgICAgIGFjdGl2ZV8ucG9wX2JhY2soKTsKKyAgICAgIC0taTsgLS1lOworCisgICAgfSBlbHNlIGlmIChJbnRlcnZhbFBvcy0+c3RhcnQgPiBDdXJQb2ludCkgeworICAgICAgLy8gTW92ZSBpbmFjdGl2ZSBpbnRlcnZhbHMgdG8gaW5hY3RpdmUgbGlzdC4KKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdGludGVydmFsICIgPDwgKkludGVydmFsIDw8ICIgaW5hY3RpdmVcbiIpOworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIocmVnKSAmJgorICAgICAgICAgICAgICJDYW4gb25seSBhbGxvY2F0ZSB2aXJ0dWFsIHJlZ2lzdGVycyEiKTsKKyAgICAgIHJlZyA9IHZybV8tPmdldFBoeXMocmVnKTsKKyAgICAgIGRlbFJlZ1VzZShyZWcpOworICAgICAgLy8gYWRkIHRvIGluYWN0aXZlLgorICAgICAgaW5hY3RpdmVfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihJbnRlcnZhbCwgSW50ZXJ2YWxQb3MpKTsKKworICAgICAgLy8gUG9wIG9mZiB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICAgYWN0aXZlX1tpXSA9IGFjdGl2ZV8uYmFjaygpOworICAgICAgYWN0aXZlXy5wb3BfYmFjaygpOworICAgICAgLS1pOyAtLWU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE90aGVyd2lzZSwganVzdCB1cGRhdGUgdGhlIGl0ZXJhdG9yIHBvc2l0aW9uLgorICAgICAgYWN0aXZlX1tpXS5zZWNvbmQgPSBJbnRlcnZhbFBvczsKKyAgICB9CisgIH0KK30KKworLy8vIHByb2Nlc3NJbmFjdGl2ZUludGVydmFscyAtIGV4cGlyZSBvbGQgaW50ZXJ2YWxzIGFuZCBtb3ZlIG92ZXJsYXBwaW5nCisvLy8gb25lcyB0byB0aGUgYWN0aXZlIGxpc3QuCit2b2lkIFJBTGluU2Nhbjo6cHJvY2Vzc0luYWN0aXZlSW50ZXJ2YWxzKFNsb3RJbmRleCBDdXJQb2ludCkKK3sKKyAgREVCVUcoZGJncygpIDw8ICJcdHByb2Nlc3NpbmcgaW5hY3RpdmUgaW50ZXJ2YWxzOlxuIik7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGluYWN0aXZlXy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTGl2ZUludGVydmFsICpJbnRlcnZhbCA9IGluYWN0aXZlX1tpXS5maXJzdDsKKyAgICBMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yIEludGVydmFsUG9zID0gaW5hY3RpdmVfW2ldLnNlY29uZDsKKyAgICB1bnNpZ25lZCByZWcgPSBJbnRlcnZhbC0+cmVnOworCisgICAgSW50ZXJ2YWxQb3MgPSBJbnRlcnZhbC0+YWR2YW5jZVRvKEludGVydmFsUG9zLCBDdXJQb2ludCk7CisKKyAgICBpZiAoSW50ZXJ2YWxQb3MgPT0gSW50ZXJ2YWwtPmVuZCgpKSB7ICAgICAgIC8vIHJlbW92ZSBleHBpcmVkIGludGVydmFscy4KKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdGludGVydmFsICIgPDwgKkludGVydmFsIDw8ICIgZXhwaXJlZFxuIik7CisKKyAgICAgIC8vIFBvcCBvZmYgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICAgIGluYWN0aXZlX1tpXSA9IGluYWN0aXZlXy5iYWNrKCk7CisgICAgICBpbmFjdGl2ZV8ucG9wX2JhY2soKTsKKyAgICAgIC0taTsgLS1lOworICAgIH0gZWxzZSBpZiAoSW50ZXJ2YWxQb3MtPnN0YXJ0IDw9IEN1clBvaW50KSB7CisgICAgICAvLyBtb3ZlIHJlLWFjdGl2YXRlZCBpbnRlcnZhbHMgaW4gYWN0aXZlIGxpc3QKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdGludGVydmFsICIgPDwgKkludGVydmFsIDw8ICIgYWN0aXZlXG4iKTsKKyAgICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKHJlZykgJiYKKyAgICAgICAgICAgICAiQ2FuIG9ubHkgYWxsb2NhdGUgdmlydHVhbCByZWdpc3RlcnMhIik7CisgICAgICByZWcgPSB2cm1fLT5nZXRQaHlzKHJlZyk7CisgICAgICBhZGRSZWdVc2UocmVnKTsKKyAgICAgIC8vIGFkZCB0byBhY3RpdmUKKyAgICAgIGFjdGl2ZV8ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEludGVydmFsLCBJbnRlcnZhbFBvcykpOworCisgICAgICAvLyBQb3Agb2ZmIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAgICBpbmFjdGl2ZV9baV0gPSBpbmFjdGl2ZV8uYmFjaygpOworICAgICAgaW5hY3RpdmVfLnBvcF9iYWNrKCk7CisgICAgICAtLWk7IC0tZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gT3RoZXJ3aXNlLCBqdXN0IHVwZGF0ZSB0aGUgaXRlcmF0b3IgcG9zaXRpb24uCisgICAgICBpbmFjdGl2ZV9baV0uc2Vjb25kID0gSW50ZXJ2YWxQb3M7CisgICAgfQorICB9Cit9CisKKy8vLyB1cGRhdGVTcGlsbFdlaWdodHMgLSB1cGRhdGVzIHRoZSBzcGlsbCB3ZWlnaHRzIG9mIHRoZSBzcGVjaWZlZCBwaHlzaWNhbAorLy8vIHJlZ2lzdGVyIGFuZCBpdHMgd2VpZ2h0Lgordm9pZCBSQUxpblNjYW46OnVwZGF0ZVNwaWxsV2VpZ2h0cyhzdGQ6OnZlY3RvcjxmbG9hdD4gJldlaWdodHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlZywgZmxvYXQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgeworICBTbWFsbFNldDx1bnNpZ25lZCwgND4gUHJvY2Vzc2VkOworICBTbWFsbFNldDx1bnNpZ25lZCwgND4gU3VwZXJBZGRlZDsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IFN1cGVyczsKKyAgV2VpZ2h0c1tyZWddICs9IHdlaWdodDsKKyAgUHJvY2Vzc2VkLmluc2VydChyZWcpOworICBmb3IgKGNvbnN0IHVuc2lnbmVkKiBhcyA9IHRyaV8tPmdldEFsaWFzU2V0KHJlZyk7ICphczsgKythcykgeworICAgIFdlaWdodHNbKmFzXSArPSB3ZWlnaHQ7CisgICAgUHJvY2Vzc2VkLmluc2VydCgqYXMpOworICAgIGlmICh0cmlfLT5pc1N1YlJlZ2lzdGVyKCphcywgcmVnKSAmJgorICAgICAgICBTdXBlckFkZGVkLmluc2VydCgqYXMpICYmCisgICAgICAgIFJDLT5jb250YWlucygqYXMpKSB7CisgICAgICBTdXBlcnMucHVzaF9iYWNrKCphcyk7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGFsaWFzIGlzIGEgc3VwZXItcmVnaXN0ZXIsIGFuZCB0aGUgc3VwZXItcmVnaXN0ZXIgaXMgaW4gdGhlCisgIC8vIHJlZ2lzdGVyIGNsYXNzIHdlIGFyZSB0cnlpbmcgdG8gYWxsb2NhdGUuIFRoZW4gYWRkIHRoZSB3ZWlnaHQgdG8gYWxsCisgIC8vIHN1Yi1yZWdpc3RlcnMgb2YgdGhlIHN1cGVyLXJlZ2lzdGVyIGV2ZW4gaWYgdGhleSBhcmUgbm90IGFsaWFzZXMuCisgIC8vIGUuZy4gYWxsb2NhdGluZyBmb3IgR1IzMiwgYmggaXMgbm90IHVzZWQsIHVwZGF0aW5nIGJsIHNwaWxsIHdlaWdodC4KKyAgLy8gICAgICBibCBzaG91bGQgZ2V0IHRoZSBzYW1lIHNwaWxsIHdlaWdodCBvdGhlcndpc2UgaXQgd2lsbCBiZSBjaG9vc2VuCisgIC8vICAgICAgYXMgYSBzcGlsbCBjYW5kaWRhdGUgc2luY2Ugc3BpbGxpbmcgYmggZG9lc24ndCBtYWtlIGVieCBhdmFpbGFibGUuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdXBlcnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKnNyID0gdHJpXy0+Z2V0U3ViUmVnaXN0ZXJzKFN1cGVyc1tpXSk7ICpzcjsgKytzcikKKyAgICAgIGlmICghUHJvY2Vzc2VkLmNvdW50KCpzcikpCisgICAgICAgIFdlaWdodHNbKnNyXSArPSB3ZWlnaHQ7CisgIH0KK30KKworc3RhdGljCitSQUxpblNjYW46OkludGVydmFsUHRyczo6aXRlcmF0b3IKK0ZpbmRJbnRlcnZhbEluVmVjdG9yKFJBTGluU2Nhbjo6SW50ZXJ2YWxQdHJzICZJUCwgTGl2ZUludGVydmFsICpMSSkgeworICBmb3IgKFJBTGluU2Nhbjo6SW50ZXJ2YWxQdHJzOjppdGVyYXRvciBJID0gSVAuYmVnaW4oKSwgRSA9IElQLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmIChJLT5maXJzdCA9PSBMSSkgcmV0dXJuIEk7CisgIHJldHVybiBJUC5lbmQoKTsKK30KKworc3RhdGljIHZvaWQgUmV2ZXJ0VmVjdG9ySXRlcmF0b3JzVG8oUkFMaW5TY2FuOjpJbnRlcnZhbFB0cnMgJlYsIFNsb3RJbmRleCBQb2ludCl7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSQUxpblNjYW46OkludGVydmFsUHRyICZJUCA9IFZbaV07CisgICAgTGl2ZUludGVydmFsOjppdGVyYXRvciBJID0gc3RkOjp1cHBlcl9ib3VuZChJUC5maXJzdC0+YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQLnNlY29uZCwgUG9pbnQpOworICAgIGlmIChJICE9IElQLmZpcnN0LT5iZWdpbigpKSAtLUk7CisgICAgSVAuc2Vjb25kID0gSTsKKyAgfQorfQorCisvLy8gYWRkU3RhY2tJbnRlcnZhbCAtIENyZWF0ZSBhIExpdmVJbnRlcnZhbCBmb3Igc3RhY2sgaWYgdGhlIHNwZWNpZmllZCBsaXZlCisvLy8gaW50ZXJ2YWwgaGFzIGJlZW4gc3BpbGxlZC4KK3N0YXRpYyB2b2lkIGFkZFN0YWNrSW50ZXJ2YWwoTGl2ZUludGVydmFsICpjdXIsIExpdmVTdGFja3MgKmxzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyAqbGlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvKiBtcmlfLCBWaXJ0UmVnTWFwICZ2cm1fKSB7CisgIGludCBTUyA9IHZybV8uZ2V0U3RhY2tTbG90KGN1ci0+cmVnKTsKKyAgaWYgKFNTID09IFZpcnRSZWdNYXA6Ok5PX1NUQUNLX1NMT1QpCisgICAgcmV0dXJuOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gbXJpXy0+Z2V0UmVnQ2xhc3MoY3VyLT5yZWcpOworICBMaXZlSW50ZXJ2YWwgJlNJID0gbHNfLT5nZXRPckNyZWF0ZUludGVydmFsKFNTLCBSQyk7CisKKyAgVk5JbmZvICpWTkk7CisgIGlmIChTSS5oYXNBdExlYXN0T25lVmFsdWUoKSkKKyAgICBWTkkgPSBTSS5nZXRWYWxOdW1JbmZvKDApOworICBlbHNlCisgICAgVk5JID0gU0kuZ2V0TmV4dFZhbHVlKFNsb3RJbmRleCgpLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbHNfLT5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisKKyAgTGl2ZUludGVydmFsICZSSSA9IGxpXy0+Z2V0SW50ZXJ2YWwoY3VyLT5yZWcpOworICAvLyBGSVhNRTogVGhpcyBtYXkgYmUgb3Zlcmx5IGNvbnNlcnZhdGl2ZS4KKyAgU0kuTWVyZ2VSYW5nZXNJbkFzVmFsdWUoUkksIFZOSSk7Cit9CisKKy8vLyBnZXRDb25mbGljdFdlaWdodCAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbmZsaWN0cyBiZXR3ZWVuIGN1cgorLy8vIGxpdmUgaW50ZXJ2YWwgYW5kIGRlZnMgYW5kIHVzZXMgb2YgUmVnIHdlaWdodGVkIGJ5IGxvb3AgZGVwdGhlcy4KK3N0YXRpYworZmxvYXQgZ2V0Q29uZmxpY3RXZWlnaHQoTGl2ZUludGVydmFsICpjdXIsIHVuc2lnbmVkIFJlZywgTGl2ZUludGVydmFscyAqbGlfLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAqbXJpXywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVMb29wSW5mbyAqbG9vcEluZm8pIHsKKyAgZmxvYXQgQ29uZmxpY3RzID0gMDsKKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpyZWdfaXRlcmF0b3IgSSA9IG1yaV8tPnJlZ19iZWdpbihSZWcpLAorICAgICAgICAgRSA9IG1yaV8tPnJlZ19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gJipJOworICAgIGlmIChjdXItPmxpdmVBdChsaV8tPmdldEluc3RydWN0aW9uSW5kZXgoTUkpKSkgeworICAgICAgdW5zaWduZWQgbG9vcERlcHRoID0gbG9vcEluZm8tPmdldExvb3BEZXB0aChNSS0+Z2V0UGFyZW50KCkpOworICAgICAgQ29uZmxpY3RzICs9IHN0ZDo6cG93KDEwLjBmLCAoZmxvYXQpbG9vcERlcHRoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENvbmZsaWN0czsKK30KKworLy8vIGZpbmRJbnRlcnZhbHNUb1NwaWxsIC0gRGV0ZXJtaW5lIHRoZSBpbnRlcnZhbHMgdG8gc3BpbGwgZm9yIHRoZQorLy8vIHNwZWNpZmllZCBpbnRlcnZhbC4gSXQncyBwYXNzZWQgdGhlIHBoeXNpY2FsIHJlZ2lzdGVycyB3aG9zZSBzcGlsbAorLy8vIHdlaWdodCBpcyB0aGUgbG93ZXN0IGFtb25nIGFsbCB0aGUgcmVnaXN0ZXJzIHdob3NlIGxpdmUgaW50ZXJ2YWxzCisvLy8gY29uZmxpY3Qgd2l0aCB0aGUgaW50ZXJ2YWwuCit2b2lkIFJBTGluU2Nhbjo6ZmluZEludGVydmFsc1RvU3BpbGwoTGl2ZUludGVydmFsICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLGZsb2F0PiA+ICZDYW5kaWRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPExpdmVJbnRlcnZhbCosIDg+ICZTcGlsbEludGVydmFscykgeworICAvLyBXZSBoYXZlIGZpZ3VyZWQgb3V0IHRoZSAqYmVzdCogcmVnaXN0ZXIgdG8gc3BpbGwuIEJ1dCB0aGVyZSBhcmUgb3RoZXIKKyAgLy8gcmVnaXN0ZXJzIHRoYXQgYXJlIHByZXR0eSBnb29kIGFzIHdlbGwgKHNwaWxsIHdlaWdodCB3aXRoaW4gMyUpLiBTcGlsbAorICAvLyB0aGUgb25lIHRoYXQgaGFzIGZld2VzdCBkZWZzIGFuZCB1c2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjdXIuCisgIGZsb2F0IENvbmZsaWN0c1szXSA9IHsgMC4wZiwgMC4wZiwgMC4wZiB9OworICBTbWFsbFZlY3RvcjxMaXZlSW50ZXJ2YWwqLCA4PiBTTElzWzNdOworCisgIERFQlVHKHsKKyAgICAgIGRiZ3MoKSA8PCAiXHRDb25zaWRlcmluZyAiIDw8IE51bUNhbmRzIDw8ICIgY2FuZGlkYXRlczogIjsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtQ2FuZHM7ICsraSkKKyAgICAgICAgZGJncygpIDw8IHRyaV8tPmdldE5hbWUoQ2FuZGlkYXRlc1tpXS5maXJzdCkgPDwgIiAiOworICAgICAgZGJncygpIDw8ICJcbiI7CisgICAgfSk7CisgIAorICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjb25mbGljdHMgb2YgZWFjaCBjYW5kaWRhdGUuCisgIGZvciAoSW50ZXJ2YWxQdHJzOjppdGVyYXRvciBpID0gYWN0aXZlXy5iZWdpbigpOyBpICE9IGFjdGl2ZV8uZW5kKCk7ICsraSkgeworICAgIHVuc2lnbmVkIFJlZyA9IGktPmZpcnN0LT5yZWc7CisgICAgdW5zaWduZWQgUGh5c1JlZyA9IHZybV8tPmdldFBoeXMoUmVnKTsKKyAgICBpZiAoIWN1ci0+b3ZlcmxhcHNGcm9tKCppLT5maXJzdCwgaS0+c2Vjb25kKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBOdW1DYW5kczsgKytqKSB7CisgICAgICB1bnNpZ25lZCBDYW5kaWRhdGUgPSBDYW5kaWRhdGVzW2pdLmZpcnN0OworICAgICAgaWYgKHRyaV8tPnJlZ3NPdmVybGFwKFBoeXNSZWcsIENhbmRpZGF0ZSkpIHsKKyAgICAgICAgaWYgKE51bUNhbmRzID4gMSkKKyAgICAgICAgICBDb25mbGljdHNbal0gKz0gZ2V0Q29uZmxpY3RXZWlnaHQoY3VyLCBSZWcsIGxpXywgbXJpXywgbG9vcEluZm8pOworICAgICAgICBTTElzW2pdLnB1c2hfYmFjayhpLT5maXJzdCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChJbnRlcnZhbFB0cnM6Oml0ZXJhdG9yIGkgPSBpbmFjdGl2ZV8uYmVnaW4oKTsgaSAhPSBpbmFjdGl2ZV8uZW5kKCk7ICsraSl7CisgICAgdW5zaWduZWQgUmVnID0gaS0+Zmlyc3QtPnJlZzsKKyAgICB1bnNpZ25lZCBQaHlzUmVnID0gdnJtXy0+Z2V0UGh5cyhSZWcpOworICAgIGlmICghY3VyLT5vdmVybGFwc0Zyb20oKmktPmZpcnN0LCBpLT5zZWNvbmQtMSkpCisgICAgICBjb250aW51ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgTnVtQ2FuZHM7ICsraikgeworICAgICAgdW5zaWduZWQgQ2FuZGlkYXRlID0gQ2FuZGlkYXRlc1tqXS5maXJzdDsKKyAgICAgIGlmICh0cmlfLT5yZWdzT3ZlcmxhcChQaHlzUmVnLCBDYW5kaWRhdGUpKSB7CisgICAgICAgIGlmIChOdW1DYW5kcyA+IDEpCisgICAgICAgICAgQ29uZmxpY3RzW2pdICs9IGdldENvbmZsaWN0V2VpZ2h0KGN1ciwgUmVnLCBsaV8sIG1yaV8sIGxvb3BJbmZvKTsKKyAgICAgICAgU0xJc1tqXS5wdXNoX2JhY2soaS0+Zmlyc3QpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFdoaWNoIGlzIHRoZSBiZXN0IGNhbmRpZGF0ZT8KKyAgdW5zaWduZWQgQmVzdENhbmRpZGF0ZSA9IDA7CisgIGZsb2F0IE1pbkNvbmZsaWN0cyA9IENvbmZsaWN0c1swXTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBOdW1DYW5kczsgKytpKSB7CisgICAgaWYgKENvbmZsaWN0c1tpXSA8IE1pbkNvbmZsaWN0cykgeworICAgICAgQmVzdENhbmRpZGF0ZSA9IGk7CisgICAgICBNaW5Db25mbGljdHMgPSBDb25mbGljdHNbaV07CisgICAgfQorICB9CisKKyAgc3RkOjpjb3B5KFNMSXNbQmVzdENhbmRpZGF0ZV0uYmVnaW4oKSwgU0xJc1tCZXN0Q2FuZGlkYXRlXS5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihTcGlsbEludGVydmFscykpOworfQorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgV2VpZ2h0Q29tcGFyZSB7CisgIHByaXZhdGU6CisgICAgY29uc3QgUkFMaW5TY2FuICZBbGxvY2F0b3I7CisKKyAgcHVibGljOgorICAgIFdlaWdodENvbXBhcmUoY29uc3QgUkFMaW5TY2FuICZBbGxvYykgOiBBbGxvY2F0b3IoQWxsb2MpIHt9CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1bnNpZ25lZCwgZmxvYXQ+IFJlZ1dlaWdodFBhaXI7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJlZ1dlaWdodFBhaXIgJkxIUywgY29uc3QgUmVnV2VpZ2h0UGFpciAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gTEhTLnNlY29uZCA8IFJIUy5zZWNvbmQgJiYgIUFsbG9jYXRvci5pc1JlY2VudGx5VXNlZChMSFMuZmlyc3QpOworICAgIH0KKyAgfTsKK30KKworc3RhdGljIGJvb2wgd2VpZ2h0c0FyZUNsb3NlKGZsb2F0IHcxLCBmbG9hdCB3MikgeworICBpZiAoIU5ld0hldXJpc3RpYykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZmxvYXQgZGlmZiA9IHcxIC0gdzI7CisgIGlmIChkaWZmIDw9IDAuMDJmKSAgLy8gV2l0aGluIDAuMDJmCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiAoZGlmZiAvIHcyKSA8PSAwLjA1ZjsgIC8vIFdpdGhpbiA1JS4KK30KKworTGl2ZUludGVydmFsICpSQUxpblNjYW46Omhhc05leHRSZWxvYWRJbnRlcnZhbChMaXZlSW50ZXJ2YWwgKmN1cikgeworICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+OjppdGVyYXRvciBJID0gTmV4dFJlbG9hZE1hcC5maW5kKGN1ci0+cmVnKTsKKyAgaWYgKEkgPT0gTmV4dFJlbG9hZE1hcC5lbmQoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuICZsaV8tPmdldEludGVydmFsKEktPnNlY29uZCk7Cit9CisKK3ZvaWQgUkFMaW5TY2FuOjpEb3duZ3JhZGVSZWdpc3RlcihMaXZlSW50ZXJ2YWwgKmxpLCB1bnNpZ25lZCBSZWcpIHsKKyAgYm9vbCBpc05ldyA9IERvd25ncmFkZWRSZWdzLmluc2VydChSZWcpOworICBpc05ldyA9IGlzTmV3OyAvLyBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcuCisgIGFzc2VydChpc05ldyAmJiAiTXVsdGlwbGUgcmVsb2FkcyBob2xkaW5nIHRoZSBzYW1lIHJlZ2lzdGVyPyIpOworICBEb3duZ3JhZGVNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGxpLT5yZWcsIFJlZykpOworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBUyA9IHRyaV8tPmdldEFsaWFzU2V0KFJlZyk7ICpBUzsgKytBUykgeworICAgIGlzTmV3ID0gRG93bmdyYWRlZFJlZ3MuaW5zZXJ0KCpBUyk7CisgICAgaXNOZXcgPSBpc05ldzsgLy8gU2lsZW5jZSBjb21waWxlciB3YXJuaW5nLgorICAgIGFzc2VydChpc05ldyAmJiAiTXVsdGlwbGUgcmVsb2FkcyBob2xkaW5nIHRoZSBzYW1lIHJlZ2lzdGVyPyIpOworICAgIERvd25ncmFkZU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIobGktPnJlZywgKkFTKSk7CisgIH0KKyAgKytOdW1Eb3duZ3JhZGU7Cit9CisKK3ZvaWQgUkFMaW5TY2FuOjpVcGdyYWRlUmVnaXN0ZXIodW5zaWduZWQgUmVnKSB7CisgIGlmIChSZWcpIHsKKyAgICBEb3duZ3JhZGVkUmVncy5lcmFzZShSZWcpOworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFTID0gdHJpXy0+Z2V0QWxpYXNTZXQoUmVnKTsgKkFTOyArK0FTKQorICAgICAgRG93bmdyYWRlZFJlZ3MuZXJhc2UoKkFTKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgTElTb3J0ZXIgeworICAgIGJvb2wgb3BlcmF0b3IoKShMaXZlSW50ZXJ2YWwqIEEsIExpdmVJbnRlcnZhbCogQikgeworICAgICAgcmV0dXJuIEEtPmJlZ2luSW5kZXgoKSA8IEItPmJlZ2luSW5kZXgoKTsKKyAgICB9CisgIH07Cit9CisKKy8vLyBhc3NpZ25SZWdPclN0YWNrU2xvdEF0SW50ZXJ2YWwgLSBhc3NpZ24gYSByZWdpc3RlciBpZiBvbmUgaXMgYXZhaWxhYmxlLCBvcgorLy8vIHNwaWxsLgordm9pZCBSQUxpblNjYW46OmFzc2lnblJlZ09yU3RhY2tTbG90QXRJbnRlcnZhbChMaXZlSW50ZXJ2YWwqIGN1cikgeworICBERUJVRyhkYmdzKCkgPDwgIlx0YWxsb2NhdGluZyBjdXJyZW50IGludGVydmFsOiAiKTsKKworICAvLyBUaGlzIGlzIGFuIGltcGxpY2l0bHkgZGVmaW5lZCBsaXZlIGludGVydmFsLCBqdXN0IGFzc2lnbiBhbnkgcmVnaXN0ZXIuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gbXJpXy0+Z2V0UmVnQ2xhc3MoY3VyLT5yZWcpOworICBpZiAoY3VyLT5lbXB0eSgpKSB7CisgICAgdW5zaWduZWQgcGh5c1JlZyA9IHZybV8tPmdldFJlZ0FsbG9jUHJlZihjdXItPnJlZyk7CisgICAgaWYgKCFwaHlzUmVnKQorICAgICAgcGh5c1JlZyA9ICpSQy0+YWxsb2NhdGlvbl9vcmRlcl9iZWdpbigqbWZfKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIHRyaV8tPmdldE5hbWUocGh5c1JlZykgPDwgJ1xuJyk7CisgICAgLy8gTm90ZSB0aGUgcmVnaXN0ZXIgaXMgbm90IHJlYWxseSBpbiB1c2UuCisgICAgdnJtXy0+YXNzaWduVmlydDJQaHlzKGN1ci0+cmVnLCBwaHlzUmVnKTsKKyAgICByZXR1cm47CisgIH0KKworICBiYWNrVXBSZWdVc2VzKCk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBmbG9hdD4gPiBTcGlsbFdlaWdodHNUb0FkZDsKKyAgU2xvdEluZGV4IFN0YXJ0UG9zaXRpb24gPSBjdXItPmJlZ2luSW5kZXgoKTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkNMZWFkZXIgPSBSZWxhdGVkUmVnQ2xhc3Nlcy5nZXRMZWFkZXJWYWx1ZShSQyk7CisKKyAgLy8gSWYgc3RhcnQgb2YgdGhpcyBsaXZlIGludGVydmFsIGlzIGRlZmluZWQgYnkgYSBtb3ZlIGluc3RydWN0aW9uIGFuZCBpdHMKKyAgLy8gc291cmNlIGlzIGFzc2lnbmVkIGEgcGh5c2ljYWwgcmVnaXN0ZXIgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldAorICAvLyByZWdpc3RlciBjbGFzcywgdGhlbiB3ZSBzaG91bGQgdHJ5IHRvIGFzc2lnbiBpdCB0aGUgc2FtZSByZWdpc3Rlci4KKyAgLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIG1vdmUgaXMgZnJvbSBhIGxhcmdlciByZWdpc3RlciBjbGFzcyB0byBhIHNtYWxsZXIKKyAgLy8gb25lLCBlLmcuIFg4Njo6bW92MzJ0bzMyXy4gVGhlc2UgbW92ZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBjb2FsZXNjYWJsZS4KKyAgaWYgKCF2cm1fLT5nZXRSZWdBbGxvY1ByZWYoY3VyLT5yZWcpICYmIGN1ci0+aGFzQXRMZWFzdE9uZVZhbHVlKCkpIHsKKyAgICBWTkluZm8gKnZuaSA9IGN1ci0+YmVnaW4oKS0+dmFsbm87CisgICAgaWYgKCh2bmktPmRlZiAhPSBTbG90SW5kZXgoKSkgJiYgIXZuaS0+aXNVbnVzZWQoKSAmJgorICAgICAgICAgdm5pLT5pc0RlZkFjY3VyYXRlKCkpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqQ29weU1JID0gbGlfLT5nZXRJbnN0cnVjdGlvbkZyb21JbmRleCh2bmktPmRlZik7CisgICAgICBpZiAoQ29weU1JICYmIENvcHlNSS0+aXNDb3B5KCkpIHsKKyAgICAgICAgdW5zaWduZWQgRHN0U3ViUmVnID0gQ29weU1JLT5nZXRPcGVyYW5kKDApLmdldFN1YlJlZygpOworICAgICAgICB1bnNpZ25lZCBTcmNSZWcgPSBDb3B5TUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICAgIHVuc2lnbmVkIFNyY1N1YlJlZyA9IENvcHlNSS0+Z2V0T3BlcmFuZCgxKS5nZXRTdWJSZWcoKTsKKyAgICAgICAgdW5zaWduZWQgUmVnID0gMDsKKyAgICAgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFNyY1JlZykpCisgICAgICAgICAgUmVnID0gU3JjUmVnOworICAgICAgICBlbHNlIGlmICh2cm1fLT5pc0Fzc2lnbmVkUmVnKFNyY1JlZykpCisgICAgICAgICAgUmVnID0gdnJtXy0+Z2V0UGh5cyhTcmNSZWcpOworICAgICAgICBpZiAoUmVnKSB7CisgICAgICAgICAgaWYgKFNyY1N1YlJlZykKKyAgICAgICAgICAgIFJlZyA9IHRyaV8tPmdldFN1YlJlZyhSZWcsIFNyY1N1YlJlZyk7CisgICAgICAgICAgaWYgKERzdFN1YlJlZykKKyAgICAgICAgICAgIFJlZyA9IHRyaV8tPmdldE1hdGNoaW5nU3VwZXJSZWcoUmVnLCBEc3RTdWJSZWcsIFJDKTsKKyAgICAgICAgICBpZiAoUmVnICYmIGFsbG9jYXRhYmxlUmVnc19bUmVnXSAmJiBSQy0+Y29udGFpbnMoUmVnKSkKKyAgICAgICAgICAgIG1yaV8tPnNldFJlZ0FsbG9jYXRpb25IaW50KGN1ci0+cmVnLCAwLCBSZWcpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gRm9yIGV2ZXJ5IGludGVydmFsIGluIGluYWN0aXZlIHdlIG92ZXJsYXAgd2l0aCwgbWFyayB0aGUKKyAgLy8gcmVnaXN0ZXIgYXMgbm90IGZyZWUgYW5kIHVwZGF0ZSBzcGlsbCB3ZWlnaHRzLgorICBmb3IgKEludGVydmFsUHRyczo6Y29uc3RfaXRlcmF0b3IgaSA9IGluYWN0aXZlXy5iZWdpbigpLAorICAgICAgICAgZSA9IGluYWN0aXZlXy5lbmQoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBpLT5maXJzdC0+cmVnOworICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZykgJiYKKyAgICAgICAgICAgIkNhbiBvbmx5IGFsbG9jYXRlIHZpcnR1YWwgcmVnaXN0ZXJzISIpOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlZ1JDID0gbXJpXy0+Z2V0UmVnQ2xhc3MoUmVnKTsKKyAgICAvLyBJZiB0aGlzIGlzIG5vdCBpbiBhIHJlbGF0ZWQgcmVnIGNsYXNzIHRvIHRoZSByZWdpc3RlciB3ZSdyZSBhbGxvY2F0aW5nLCAKKyAgICAvLyBkb24ndCBjaGVjayBpdC4KKyAgICBpZiAoUmVsYXRlZFJlZ0NsYXNzZXMuZ2V0TGVhZGVyVmFsdWUoUmVnUkMpID09IFJDTGVhZGVyICYmCisgICAgICAgIGN1ci0+b3ZlcmxhcHNGcm9tKCppLT5maXJzdCwgaS0+c2Vjb25kLTEpKSB7CisgICAgICBSZWcgPSB2cm1fLT5nZXRQaHlzKFJlZyk7CisgICAgICBhZGRSZWdVc2UoUmVnKTsKKyAgICAgIFNwaWxsV2VpZ2h0c1RvQWRkLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihSZWcsIGktPmZpcnN0LT53ZWlnaHQpKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIFNwZWN1bGF0aXZlbHkgY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBnZXQgYSByZWdpc3RlciByaWdodCBub3cuICBJZiBub3QsCisgIC8vIHdlIGtub3cgd2Ugd29uJ3QgYmUgYWJsZSB0byBieSBhZGRpbmcgbW9yZSBjb25zdHJhaW50cy4gIElmIHNvLCB3ZSBjYW4KKyAgLy8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIHZhbGlkLiAgRG9pbmcgYW4gZXhoYXVzdGl2ZSBzZWFyY2ggb2YgdGhlIGZpeGVkXyBsaXN0CisgIC8vIGlzIHZlcnkgYmFkIChpdCBjb250YWlucyBhbGwgY2FsbGVlIGNsb2JiZXJlZCByZWdpc3RlcnMgZm9yIGFueSBmdW5jdGlvbnMKKyAgLy8gd2l0aCBhIGNhbGwpLCBzbyB3ZSB3YW50IHRvIGF2b2lkIGRvaW5nIHRoYXQgaWYgcG9zc2libGUuCisgIHVuc2lnbmVkIHBoeXNSZWcgPSBnZXRGcmVlUGh5c1JlZyhjdXIpOworICB1bnNpZ25lZCBCZXN0UGh5c1JlZyA9IHBoeXNSZWc7CisgIGlmIChwaHlzUmVnKSB7CisgICAgLy8gV2UgZ290IGEgcmVnaXN0ZXIuICBIb3dldmVyLCBpZiBpdCdzIGluIHRoZSBmaXhlZF8gbGlzdCwgd2UgbWlnaHQKKyAgICAvLyBjb25mbGljdCB3aXRoIGl0LiAgQ2hlY2sgdG8gc2VlIGlmIHdlIGNvbmZsaWN0IHdpdGggaXQgb3IgYW55IG9mIGl0cworICAgIC8vIGFsaWFzZXMuCisgICAgU21hbGxTZXQ8dW5zaWduZWQsIDg+IFJlZ0FsaWFzZXM7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSB0cmlfLT5nZXRBbGlhc1NldChwaHlzUmVnKTsgKkFTOyArK0FTKQorICAgICAgUmVnQWxpYXNlcy5pbnNlcnQoKkFTKTsKKyAgICAKKyAgICBib29sIENvbmZsaWN0c1dpdGhGaXhlZCA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBmaXhlZF8uc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgSW50ZXJ2YWxQdHIgJklQID0gZml4ZWRfW2ldOworICAgICAgaWYgKHBoeXNSZWcgPT0gSVAuZmlyc3QtPnJlZyB8fCBSZWdBbGlhc2VzLmNvdW50KElQLmZpcnN0LT5yZWcpKSB7CisgICAgICAgIC8vIE9rYXksIHRoaXMgcmVnIGlzIG9uIHRoZSBmaXhlZCBsaXN0LiAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFjdHVhbGx5CisgICAgICAgIC8vIGNvbmZsaWN0LgorICAgICAgICBMaXZlSW50ZXJ2YWwgKkkgPSBJUC5maXJzdDsKKyAgICAgICAgaWYgKEktPmVuZEluZGV4KCkgPiBTdGFydFBvc2l0aW9uKSB7CisgICAgICAgICAgTGl2ZUludGVydmFsOjppdGVyYXRvciBJSSA9IEktPmFkdmFuY2VUbyhJUC5zZWNvbmQsIFN0YXJ0UG9zaXRpb24pOworICAgICAgICAgIElQLnNlY29uZCA9IElJOworICAgICAgICAgIGlmIChJSSAhPSBJLT5iZWdpbigpICYmIElJLT5zdGFydCA+IFN0YXJ0UG9zaXRpb24pCisgICAgICAgICAgICAtLUlJOworICAgICAgICAgIGlmIChjdXItPm92ZXJsYXBzRnJvbSgqSSwgSUkpKSB7CisgICAgICAgICAgICBDb25mbGljdHNXaXRoRml4ZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIE9rYXksIHRoZSByZWdpc3RlciBwaWNrZWQgYnkgb3VyIHNwZWN1bGF0aXZlIGdldEZyZWVQaHlzUmVnIGNhbGwgdHVybmVkCisgICAgLy8gb3V0IHRvIGJlIGluIHVzZS4gIEFjdHVhbGx5IGFkZCBhbGwgb2YgdGhlIGNvbmZsaWN0aW5nIGZpeGVkIHJlZ2lzdGVycyB0bworICAgIC8vIHJlZ1VzZV8gc28gd2UgY2FuIGRvIGFuIGFjY3VyYXRlIHF1ZXJ5LgorICAgIGlmIChDb25mbGljdHNXaXRoRml4ZWQpIHsKKyAgICAgIC8vIEZvciBldmVyeSBpbnRlcnZhbCBpbiBmaXhlZCB3ZSBvdmVybGFwIHdpdGgsIG1hcmsgdGhlIHJlZ2lzdGVyIGFzIG5vdAorICAgICAgLy8gZnJlZSBhbmQgdXBkYXRlIHNwaWxsIHdlaWdodHMuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZml4ZWRfLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgSW50ZXJ2YWxQdHIgJklQID0gZml4ZWRfW2ldOworICAgICAgICBMaXZlSW50ZXJ2YWwgKkkgPSBJUC5maXJzdDsKKworICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSZWdSQyA9IE9uZUNsYXNzRm9yRWFjaFBoeXNSZWdbSS0+cmVnXTsKKyAgICAgICAgaWYgKFJlbGF0ZWRSZWdDbGFzc2VzLmdldExlYWRlclZhbHVlKFJlZ1JDKSA9PSBSQ0xlYWRlciAmJiAgICAgICAKKyAgICAgICAgICAgIEktPmVuZEluZGV4KCkgPiBTdGFydFBvc2l0aW9uKSB7CisgICAgICAgICAgTGl2ZUludGVydmFsOjppdGVyYXRvciBJSSA9IEktPmFkdmFuY2VUbyhJUC5zZWNvbmQsIFN0YXJ0UG9zaXRpb24pOworICAgICAgICAgIElQLnNlY29uZCA9IElJOworICAgICAgICAgIGlmIChJSSAhPSBJLT5iZWdpbigpICYmIElJLT5zdGFydCA+IFN0YXJ0UG9zaXRpb24pCisgICAgICAgICAgICAtLUlJOworICAgICAgICAgIGlmIChjdXItPm92ZXJsYXBzRnJvbSgqSSwgSUkpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCByZWcgPSBJLT5yZWc7CisgICAgICAgICAgICBhZGRSZWdVc2UocmVnKTsKKyAgICAgICAgICAgIFNwaWxsV2VpZ2h0c1RvQWRkLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihyZWcsIEktPndlaWdodCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBVc2luZyB0aGUgbmV3bHkgdXBkYXRlZCByZWdVc2VfIG9iamVjdCwgd2hpY2ggaW5jbHVkZXMgY29uZmxpY3RzIGluIHRoZQorICAgICAgLy8gZnV0dXJlLCBzZWUgaWYgdGhlcmUgYXJlIGFueSByZWdpc3RlcnMgYXZhaWxhYmxlLgorICAgICAgcGh5c1JlZyA9IGdldEZyZWVQaHlzUmVnKGN1cik7CisgICAgfQorICB9CisgICAgCisgIC8vIFJlc3RvcmUgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIHRyYWNrZXIsIHJlbW92aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAvLyBmdXR1cmUuCisgIHJlc3RvcmVSZWdVc2VzKCk7CisgIAorICAvLyBJZiB3ZSBmaW5kIGEgZnJlZSByZWdpc3Rlciwgd2UgYXJlIGRvbmU6IGFzc2lnbiB0aGlzIHZpcnR1YWwgdG8KKyAgLy8gdGhlIGZyZWUgcGh5c2ljYWwgcmVnaXN0ZXIgYW5kIGFkZCB0aGlzIGludGVydmFsIHRvIHRoZSBhY3RpdmUKKyAgLy8gbGlzdC4KKyAgaWYgKHBoeXNSZWcpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIHRyaV8tPmdldE5hbWUocGh5c1JlZykgPDwgJ1xuJyk7CisgICAgdnJtXy0+YXNzaWduVmlydDJQaHlzKGN1ci0+cmVnLCBwaHlzUmVnKTsKKyAgICBhZGRSZWdVc2UocGh5c1JlZyk7CisgICAgYWN0aXZlXy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY3VyLCBjdXItPmJlZ2luKCkpKTsKKyAgICBoYW5kbGVkXy5wdXNoX2JhY2soY3VyKTsKKworICAgIC8vICJVcGdyYWRlIiB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIgc2luY2UgaXQgaGFzIGJlZW4gYWxsb2NhdGVkLgorICAgIFVwZ3JhZGVSZWdpc3RlcihwaHlzUmVnKTsKKyAgICBpZiAoTGl2ZUludGVydmFsICpOZXh0UmVsb2FkTEkgPSBoYXNOZXh0UmVsb2FkSW50ZXJ2YWwoY3VyKSkgeworICAgICAgLy8gIkRvd25ncmFkZSIgcGh5c1JlZyB0byB0cnkgdG8ga2VlcCBwaHlzUmVnIGZyb20gYmVpbmcgYWxsb2NhdGVkIHVudGlsCisgICAgICAvLyB0aGUgbmV4dCByZWxvYWQgZnJvbSB0aGUgc2FtZSBTUyBpcyBhbGxvY2F0ZWQuIAorICAgICAgbXJpXy0+c2V0UmVnQWxsb2NhdGlvbkhpbnQoTmV4dFJlbG9hZExJLT5yZWcsIDAsIHBoeXNSZWcpOworICAgICAgRG93bmdyYWRlUmVnaXN0ZXIoY3VyLCBwaHlzUmVnKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIERFQlVHKGRiZ3MoKSA8PCAibm8gZnJlZSByZWdpc3RlcnNcbiIpOworCisgIC8vIENvbXBpbGUgdGhlIHNwaWxsIHdlaWdodHMgaW50byBhbiBhcnJheSB0aGF0IGlzIGJldHRlciBmb3Igc2Nhbm5pbmcuCisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBTcGlsbFdlaWdodHModHJpXy0+Z2V0TnVtUmVncygpLCAwLjBmKTsKKyAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIGZsb2F0PiA+OjppdGVyYXRvcgorICAgICAgIEkgPSBTcGlsbFdlaWdodHNUb0FkZC5iZWdpbigpLCBFID0gU3BpbGxXZWlnaHRzVG9BZGQuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIHVwZGF0ZVNwaWxsV2VpZ2h0cyhTcGlsbFdlaWdodHMsIEktPmZpcnN0LCBJLT5zZWNvbmQsIFJDKTsKKyAgCisgIC8vIGZvciBlYWNoIGludGVydmFsIGluIGFjdGl2ZSwgdXBkYXRlIHNwaWxsIHdlaWdodHMuCisgIGZvciAoSW50ZXJ2YWxQdHJzOjpjb25zdF9pdGVyYXRvciBpID0gYWN0aXZlXy5iZWdpbigpLCBlID0gYWN0aXZlXy5lbmQoKTsKKyAgICAgICBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIHJlZyA9IGktPmZpcnN0LT5yZWc7CisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIocmVnKSAmJgorICAgICAgICAgICAiQ2FuIG9ubHkgYWxsb2NhdGUgdmlydHVhbCByZWdpc3RlcnMhIik7CisgICAgcmVnID0gdnJtXy0+Z2V0UGh5cyhyZWcpOworICAgIHVwZGF0ZVNwaWxsV2VpZ2h0cyhTcGlsbFdlaWdodHMsIHJlZywgaS0+Zmlyc3QtPndlaWdodCwgUkMpOworICB9CisgCisgIERFQlVHKGRiZ3MoKSA8PCAiXHRhc3NpZ25pbmcgc3RhY2sgc2xvdCBhdCBpbnRlcnZhbCAiPDwgKmN1ciA8PCAiOlxuIik7CisKKyAgLy8gRmluZCBhIHJlZ2lzdGVyIHRvIHNwaWxsLgorICBmbG9hdCBtaW5XZWlnaHQgPSBIVUdFX1ZBTEY7CisgIHVuc2lnbmVkIG1pblJlZyA9IDA7CisKKyAgYm9vbCBGb3VuZCA9IGZhbHNlOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsZmxvYXQ+ID4gUmVnc1dlaWdodHM7CisgIGlmICghbWluUmVnIHx8IFNwaWxsV2VpZ2h0c1ttaW5SZWddID09IEhVR0VfVkFMRikKKyAgICBmb3IgKFRhcmdldFJlZ2lzdGVyQ2xhc3M6Oml0ZXJhdG9yIGkgPSBSQy0+YWxsb2NhdGlvbl9vcmRlcl9iZWdpbigqbWZfKSwKKyAgICAgICAgICAgZSA9IFJDLT5hbGxvY2F0aW9uX29yZGVyX2VuZCgqbWZfKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIHVuc2lnbmVkIHJlZyA9ICppOworICAgICAgZmxvYXQgcmVnV2VpZ2h0ID0gU3BpbGxXZWlnaHRzW3JlZ107CisgICAgICAvLyBTa2lwIHJlY2VudGx5IGFsbG9jYXRlZCByZWdpc3RlcnMuCisgICAgICBpZiAobWluV2VpZ2h0ID4gcmVnV2VpZ2h0ICYmICFpc1JlY2VudGx5VXNlZChyZWcpKQorICAgICAgICBGb3VuZCA9IHRydWU7CisgICAgICBSZWdzV2VpZ2h0cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIocmVnLCByZWdXZWlnaHQpKTsKKyAgICB9CisgIAorICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhIHJlZ2lzdGVyIHRoYXQgaXMgc3BpbGxhYmxlLCB0cnkgYWxpYXNlcz8KKyAgaWYgKCFGb3VuZCkgeworICAgIGZvciAoVGFyZ2V0UmVnaXN0ZXJDbGFzczo6aXRlcmF0b3IgaSA9IFJDLT5hbGxvY2F0aW9uX29yZGVyX2JlZ2luKCptZl8pLAorICAgICAgICAgICBlID0gUkMtPmFsbG9jYXRpb25fb3JkZXJfZW5kKCptZl8pOyBpICE9IGU7ICsraSkgeworICAgICAgdW5zaWduZWQgcmVnID0gKmk7CisgICAgICAvLyBObyBuZWVkIHRvIHdvcnJ5IGFib3V0IGlmIHRoZSBhbGlhcyByZWdpc3RlciBzaXplIDwgcmVnc2l6ZSBvZiBSQy4KKyAgICAgIC8vIFdlIGFyZSBnb2luZyB0byBzcGlsbCBhbGwgcmVnaXN0ZXJzIHRoYXQgYWxpYXMgaXQgYW55d2F5LgorICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCogYXMgPSB0cmlfLT5nZXRBbGlhc1NldChyZWcpOyAqYXM7ICsrYXMpCisgICAgICAgIFJlZ3NXZWlnaHRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigqYXMsIFNwaWxsV2VpZ2h0c1sqYXNdKSk7CisgICAgfQorICB9CisKKyAgLy8gU29ydCBhbGwgcG90ZW50aWFsIHNwaWxsIGNhbmRpZGF0ZXMgYnkgd2VpZ2h0LgorICBzdGQ6OnNvcnQoUmVnc1dlaWdodHMuYmVnaW4oKSwgUmVnc1dlaWdodHMuZW5kKCksIFdlaWdodENvbXBhcmUoKnRoaXMpKTsKKyAgbWluUmVnID0gUmVnc1dlaWdodHNbMF0uZmlyc3Q7CisgIG1pbldlaWdodCA9IFJlZ3NXZWlnaHRzWzBdLnNlY29uZDsKKyAgaWYgKG1pbldlaWdodCA9PSBIVUdFX1ZBTEYpIHsKKyAgICAvLyBBbGwgcmVnaXN0ZXJzIG11c3QgaGF2ZSBpbmYgd2VpZ2h0LiBKdXN0IGdyYWIgb25lIQorICAgIG1pblJlZyA9IEJlc3RQaHlzUmVnID8gQmVzdFBoeXNSZWcgOiAqUkMtPmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oKm1mXyk7CisgICAgaWYgKGN1ci0+d2VpZ2h0ID09IEhVR0VfVkFMRiB8fAorICAgICAgICBsaV8tPmdldEFwcHJveGltYXRlSW5zdHJ1Y3Rpb25Db3VudCgqY3VyKSA9PSAwKSB7CisgICAgICAvLyBTcGlsbCBhIHBoeXNpY2FsIHJlZ2lzdGVyIGFyb3VuZCBkZWZzIGFuZCB1c2VzLgorICAgICAgaWYgKGxpXy0+c3BpbGxQaHlzUmVnQXJvdW5kUmVnRGVmc1VzZXMoKmN1ciwgbWluUmVnLCAqdnJtXykpIHsKKyAgICAgICAgLy8gc3BpbGxQaHlzUmVnQXJvdW5kUmVnRGVmc1VzZXMgbWF5IGhhdmUgaW52YWxpZGF0ZWQgaXRlcmF0b3Igc3RvcmVkCisgICAgICAgIC8vIGluIGZpeGVkXy4gUmVzZXQgdGhlbS4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGZpeGVkXy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgSW50ZXJ2YWxQdHIgJklQID0gZml4ZWRfW2ldOworICAgICAgICAgIExpdmVJbnRlcnZhbCAqSSA9IElQLmZpcnN0OworICAgICAgICAgIGlmIChJLT5yZWcgPT0gbWluUmVnIHx8IHRyaV8tPmlzU3ViUmVnaXN0ZXIobWluUmVnLCBJLT5yZWcpKQorICAgICAgICAgICAgSVAuc2Vjb25kID0gSS0+YWR2YW5jZVRvKEktPmJlZ2luKCksIFN0YXJ0UG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgRG93bmdyYWRlZFJlZ3MuY2xlYXIoKTsKKyAgICAgICAgYXNzaWduUmVnT3JTdGFja1Nsb3RBdEludGVydmFsKGN1cik7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgIlJhbiBvdXQgb2YgcmVnaXN0ZXJzIGR1cmluZyByZWdpc3RlciBhbGxvY2F0aW9uISIpOworICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlJhbiBvdXQgb2YgcmVnaXN0ZXJzIGR1cmluZyByZWdpc3RlciBhbGxvY2F0aW9uISIpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIEZpbmQgdXAgdG8gMyByZWdpc3RlcnMgdG8gY29uc2lkZXIgYXMgc3BpbGwgY2FuZGlkYXRlcy4KKyAgdW5zaWduZWQgTGFzdENhbmRpZGF0ZSA9IFJlZ3NXZWlnaHRzLnNpemUoKSA+PSAzID8gMyA6IDE7CisgIHdoaWxlIChMYXN0Q2FuZGlkYXRlID4gMSkgeworICAgIGlmICh3ZWlnaHRzQXJlQ2xvc2UoUmVnc1dlaWdodHNbTGFzdENhbmRpZGF0ZS0xXS5zZWNvbmQsIG1pbldlaWdodCkpCisgICAgICBicmVhazsKKyAgICAtLUxhc3RDYW5kaWRhdGU7CisgIH0KKworICBERUJVRyh7CisgICAgICBkYmdzKCkgPDwgIlx0XHRyZWdpc3RlcihzKSB3aXRoIG1pbiB3ZWlnaHQocyk6ICI7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTGFzdENhbmRpZGF0ZTsgKytpKQorICAgICAgICBkYmdzKCkgPDwgdHJpXy0+Z2V0TmFtZShSZWdzV2VpZ2h0c1tpXS5maXJzdCkKKyAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgUmVnc1dlaWdodHNbaV0uc2Vjb25kIDw8ICIpXG4iOworICAgIH0pOworCisgIC8vIElmIHRoZSBjdXJyZW50IGhhcyB0aGUgbWluaW11bSB3ZWlnaHQsIHdlIG5lZWQgdG8gc3BpbGwgaXQgYW5kCisgIC8vIGFkZCBhbnkgYWRkZWQgaW50ZXJ2YWxzIGJhY2sgdG8gdW5oYW5kbGVkLCBhbmQgcmVzdGFydAorICAvLyBsaW5lYXJzY2FuLgorICBpZiAoY3VyLT53ZWlnaHQgIT0gSFVHRV9WQUxGICYmIGN1ci0+d2VpZ2h0IDw9IG1pbldlaWdodCkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdFx0c3BpbGxpbmcoYyk6ICIgPDwgKmN1ciA8PCAnXG4nKTsKKyAgICBTbWFsbFZlY3RvcjxMaXZlSW50ZXJ2YWwqLCA4PiBzcGlsbElzOworICAgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+IGFkZGVkOworICAgIHNwaWxsZXJfLT5zcGlsbChjdXIsIGFkZGVkLCBzcGlsbElzKTsKKworICAgIHN0ZDo6c29ydChhZGRlZC5iZWdpbigpLCBhZGRlZC5lbmQoKSwgTElTb3J0ZXIoKSk7CisgICAgYWRkU3RhY2tJbnRlcnZhbChjdXIsIGxzXywgbGlfLCBtcmlfLCAqdnJtXyk7CisgICAgaWYgKGFkZGVkLmVtcHR5KCkpCisgICAgICByZXR1cm47ICAvLyBFYXJseSBleGl0IGlmIGFsbCBzcGlsbHMgd2VyZSBmb2xkZWQuCisKKyAgICAvLyBNZXJnZSBhZGRlZCB3aXRoIHVuaGFuZGxlZC4gIE5vdGUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgc29ydGVkCisgICAgLy8gaW50ZXJ2YWxzIHJldHVybmVkIGJ5IGFkZEludGVydmFsc0ZvclNwaWxscyBieSB0aGVpciBzdGFydGluZworICAgIC8vIHBvaW50LgorICAgIC8vIFRoaXMgYWxzbyB1cGRhdGUgdGhlIE5leHRSZWxvYWRNYXAuIFRoYXQgaXMsIGl0IGFkZHMgbWFwcGluZyBmcm9tIGEKKyAgICAvLyByZWdpc3RlciBkZWZpbmVkIGJ5IGEgcmVsb2FkIGZyb20gU1MgdG8gdGhlIG5leHQgcmVsb2FkIGZyb20gU1MgaW4gdGhlCisgICAgLy8gc2FtZSBiYXNpYyBibG9jay4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTGFzdFJlbG9hZE1CQiA9IDA7CisgICAgTGl2ZUludGVydmFsICpMYXN0UmVsb2FkID0gMDsKKyAgICBpbnQgTGFzdFJlbG9hZFNTID0gVmlydFJlZ01hcDo6Tk9fU1RBQ0tfU0xPVDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gYWRkZWQuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgTGl2ZUludGVydmFsICpSZWxvYWRMaSA9IGFkZGVkW2ldOworICAgICAgaWYgKFJlbG9hZExpLT53ZWlnaHQgPT0gSFVHRV9WQUxGICYmCisgICAgICAgICAgbGlfLT5nZXRBcHByb3hpbWF0ZUluc3RydWN0aW9uQ291bnQoKlJlbG9hZExpKSA9PSAwKSB7CisgICAgICAgIFNsb3RJbmRleCBSZWxvYWRJZHggPSBSZWxvYWRMaS0+YmVnaW5JbmRleCgpOworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUmVsb2FkTUJCID0gbGlfLT5nZXRNQkJGcm9tSW5kZXgoUmVsb2FkSWR4KTsKKyAgICAgICAgaW50IFJlbG9hZFNTID0gdnJtXy0+Z2V0U3RhY2tTbG90KFJlbG9hZExpLT5yZWcpOworICAgICAgICBpZiAoTGFzdFJlbG9hZE1CQiA9PSBSZWxvYWRNQkIgJiYgTGFzdFJlbG9hZFNTID09IFJlbG9hZFNTKSB7CisgICAgICAgICAgLy8gTGFzdCByZWxvYWQgb2Ygc2FtZSBTUyBpcyBpbiB0aGUgc2FtZSBNQkIuIFdlIHdhbnQgdG8gdHJ5IHRvCisgICAgICAgICAgLy8gYWxsb2NhdGUgYm90aCByZWxvYWRzIHRoZSBzYW1lIHJlZ2lzdGVyIGFuZCBtYWtlIHN1cmUgdGhlIHJlZworICAgICAgICAgIC8vIGlzbid0IGNsb2JiZXJlZCBpbiBiZXR3ZWVuIGlmIGF0IGFsbCBwb3NzaWJsZS4KKyAgICAgICAgICBhc3NlcnQoTGFzdFJlbG9hZC0+YmVnaW5JbmRleCgpIDwgUmVsb2FkSWR4KTsKKyAgICAgICAgICBOZXh0UmVsb2FkTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihMYXN0UmVsb2FkLT5yZWcsIFJlbG9hZExpLT5yZWcpKTsKKyAgICAgICAgfQorICAgICAgICBMYXN0UmVsb2FkTUJCID0gUmVsb2FkTUJCOworICAgICAgICBMYXN0UmVsb2FkID0gUmVsb2FkTGk7CisgICAgICAgIExhc3RSZWxvYWRTUyA9IFJlbG9hZFNTOworICAgICAgfQorICAgICAgdW5oYW5kbGVkXy5wdXNoKFJlbG9hZExpKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgKytOdW1CYWNrdHJhY2tzOworCisgIC8vIFB1c2ggdGhlIGN1cnJlbnQgaW50ZXJ2YWwgYmFjayB0byB1bmhhbmRsZWQgc2luY2Ugd2UgYXJlIGdvaW5nCisgIC8vIHRvIHJlLXJ1biBhdCBsZWFzdCB0aGlzIGl0ZXJhdGlvbi4gU2luY2Ugd2UgZGlkbid0IG1vZGlmeSBpdCBpdAorICAvLyBzaG91bGQgZ28gYmFjayByaWdodCBpbiB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKKyAgdW5oYW5kbGVkXy5wdXNoKGN1cik7CisKKyAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKG1pblJlZykgJiYKKyAgICAgICAgICJkaWQgbm90IGNob29zZSBhIHJlZ2lzdGVyIHRvIHNwaWxsPyIpOworCisgIC8vIFdlIHNwaWxsIGFsbCBpbnRlcnZhbHMgYWxpYXNpbmcgdGhlIHJlZ2lzdGVyIHdpdGgKKyAgLy8gbWluaW11bSB3ZWlnaHQsIHJvbGxiYWNrIHRvIHRoZSBpbnRlcnZhbCB3aXRoIHRoZSBlYXJsaWVzdAorICAvLyBzdGFydCBwb2ludCBhbmQgbGV0IHRoZSBsaW5lYXIgc2NhbiBhbGdvcml0aG0gcnVuIGFnYWluCisgIFNtYWxsVmVjdG9yPExpdmVJbnRlcnZhbCosIDg+IHNwaWxsSXM7CisKKyAgLy8gRGV0ZXJtaW5lIHdoaWNoIGludGVydmFscyBoYXZlIHRvIGJlIHNwaWxsZWQuCisgIGZpbmRJbnRlcnZhbHNUb1NwaWxsKGN1ciwgUmVnc1dlaWdodHMsIExhc3RDYW5kaWRhdGUsIHNwaWxsSXMpOworCisgIC8vIFNldCBvZiBzcGlsbGVkIHZyZWdzICh1c2VkIGxhdGVyIHRvIHJvbGxiYWNrIHByb3Blcmx5KQorICBTbWFsbFNldDx1bnNpZ25lZCwgOD4gc3BpbGxlZDsKKworICAvLyBUaGUgZWFybGllc3Qgc3RhcnQgb2YgYSBTcGlsbGVkIGludGVydmFsIGluZGljYXRlcyB1cCB0byB3aGVyZQorICAvLyBpbiBoYW5kbGVkIHdlIG5lZWQgdG8gcm9sbCBiYWNrCisgIGFzc2VydCghc3BpbGxJcy5lbXB0eSgpICYmICJObyBzcGlsbCBpbnRlcnZhbHM/Iik7IAorICBTbG90SW5kZXggZWFybGllc3RTdGFydCA9IHNwaWxsSXNbMF0tPmJlZ2luSW5kZXgoKTsKKyAgCisgIC8vIFNwaWxsIGxpdmUgaW50ZXJ2YWxzIG9mIHZpcnR1YWwgcmVncyBtYXBwZWQgdG8gdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIHdlCisgIC8vIHdhbnQgdG8gY2xlYXIgKGFuZCBpdHMgYWxpYXNlcykuICBXZSBvbmx5IHNwaWxsIHRob3NlIHRoYXQgb3ZlcmxhcCB3aXRoIHRoZQorICAvLyBjdXJyZW50IGludGVydmFsIGFzIHRoZSByZXN0IGRvIG5vdCBhZmZlY3QgaXRzIGFsbG9jYXRpb24uIHdlIGFsc28ga2VlcAorICAvLyB0cmFjayBvZiB0aGUgZWFybGllc3Qgc3RhcnQgb2YgYWxsIHNwaWxsZWQgbGl2ZSBpbnRlcnZhbHMgc2luY2UgdGhpcyB3aWxsCisgIC8vIG1hcmsgb3VyIHJvbGxiYWNrIHBvaW50LgorICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiBhZGRlZDsKKyAgd2hpbGUgKCFzcGlsbElzLmVtcHR5KCkpIHsKKyAgICBMaXZlSW50ZXJ2YWwgKnNsaSA9IHNwaWxsSXMuYmFjaygpOworICAgIHNwaWxsSXMucG9wX2JhY2soKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRcdHNwaWxsaW5nKGEpOiAiIDw8ICpzbGkgPDwgJ1xuJyk7CisgICAgaWYgKHNsaS0+YmVnaW5JbmRleCgpIDwgZWFybGllc3RTdGFydCkKKyAgICAgIGVhcmxpZXN0U3RhcnQgPSBzbGktPmJlZ2luSW5kZXgoKTsKKyAgICAgICAKKyAgICBzcGlsbGVyXy0+c3BpbGwoc2xpLCBhZGRlZCwgc3BpbGxJcywgJmVhcmxpZXN0U3RhcnQpOworICAgIGFkZFN0YWNrSW50ZXJ2YWwoc2xpLCBsc18sIGxpXywgbXJpXywgKnZybV8pOworICAgIHNwaWxsZWQuaW5zZXJ0KHNsaS0+cmVnKTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdHJvbGxpbmcgYmFjayB0bzogIiA8PCBlYXJsaWVzdFN0YXJ0IDw8ICdcbicpOworCisgIC8vIFNjYW4gaGFuZGxlZCBpbiByZXZlcnNlIG9yZGVyIHVwIHRvIHRoZSBlYXJsaWVzdCBzdGFydCBvZiBhCisgIC8vIHNwaWxsZWQgbGl2ZSBpbnRlcnZhbCBhbmQgdW5kbyBlYWNoIG9uZSwgcmVzdG9yaW5nIHRoZSBzdGF0ZSBvZgorICAvLyB1bmhhbmRsZWQuCisgIHdoaWxlICghaGFuZGxlZF8uZW1wdHkoKSkgeworICAgIExpdmVJbnRlcnZhbCogaSA9IGhhbmRsZWRfLmJhY2soKTsKKyAgICAvLyBJZiB0aGlzIGludGVydmFsIHN0YXJ0cyBiZWZvcmUgdCB3ZSBhcmUgZG9uZS4KKyAgICBpZiAoIWktPmVtcHR5KCkgJiYgaS0+YmVnaW5JbmRleCgpIDwgZWFybGllc3RTdGFydCkKKyAgICAgIGJyZWFrOworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdFx0dW5kbyBjaGFuZ2VzIGZvcjogIiA8PCAqaSA8PCAnXG4nKTsKKyAgICBoYW5kbGVkXy5wb3BfYmFjaygpOworCisgICAgLy8gV2hlbiB1bmRvaW5nIGEgbGl2ZSBpbnRlcnZhbCBhbGxvY2F0aW9uIHdlIG11c3Qga25vdyBpZiBpdCBpcyBhY3RpdmUgb3IKKyAgICAvLyBpbmFjdGl2ZSB0byBwcm9wZXJseSB1cGRhdGUgcmVnVXNlXyBhbmQgdGhlIFZpcnRSZWdNYXAuCisgICAgSW50ZXJ2YWxQdHJzOjppdGVyYXRvciBpdDsKKyAgICBpZiAoKGl0ID0gRmluZEludGVydmFsSW5WZWN0b3IoYWN0aXZlXywgaSkpICE9IGFjdGl2ZV8uZW5kKCkpIHsKKyAgICAgIGFjdGl2ZV8uZXJhc2UoaXQpOworICAgICAgYXNzZXJ0KCFUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihpLT5yZWcpKTsKKyAgICAgIGlmICghc3BpbGxlZC5jb3VudChpLT5yZWcpKQorICAgICAgICB1bmhhbmRsZWRfLnB1c2goaSk7CisgICAgICBkZWxSZWdVc2UodnJtXy0+Z2V0UGh5cyhpLT5yZWcpKTsKKyAgICAgIHZybV8tPmNsZWFyVmlydChpLT5yZWcpOworICAgIH0gZWxzZSBpZiAoKGl0ID0gRmluZEludGVydmFsSW5WZWN0b3IoaW5hY3RpdmVfLCBpKSkgIT0gaW5hY3RpdmVfLmVuZCgpKSB7CisgICAgICBpbmFjdGl2ZV8uZXJhc2UoaXQpOworICAgICAgYXNzZXJ0KCFUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihpLT5yZWcpKTsKKyAgICAgIGlmICghc3BpbGxlZC5jb3VudChpLT5yZWcpKQorICAgICAgICB1bmhhbmRsZWRfLnB1c2goaSk7CisgICAgICB2cm1fLT5jbGVhclZpcnQoaS0+cmVnKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoaS0+cmVnKSAmJgorICAgICAgICAgICAgICJDYW4gb25seSBhbGxvY2F0ZSB2aXJ0dWFsIHJlZ2lzdGVycyEiKTsKKyAgICAgIHZybV8tPmNsZWFyVmlydChpLT5yZWcpOworICAgICAgdW5oYW5kbGVkXy5wdXNoKGkpOworICAgIH0KKworICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD46Oml0ZXJhdG9yIGlpID0gRG93bmdyYWRlTWFwLmZpbmQoaS0+cmVnKTsKKyAgICBpZiAoaWkgPT0gRG93bmdyYWRlTWFwLmVuZCgpKQorICAgICAgLy8gSXQgaW50ZXJ2YWwgaGFzIGEgcHJlZmVyZW5jZSwgaXQgbXVzdCBiZSBkZWZpbmVkIGJ5IGEgY29weS4gQ2xlYXIgdGhlCisgICAgICAvLyBwcmVmZXJlbmNlIG5vdyBzaW5jZSB0aGUgc291cmNlIGludGVydmFsIGFsbG9jYXRpb24gbWF5IGhhdmUgYmVlbgorICAgICAgLy8gdW5kb25lIGFzIHdlbGwuCisgICAgICBtcmlfLT5zZXRSZWdBbGxvY2F0aW9uSGludChpLT5yZWcsIDAsIDApOworICAgIGVsc2UgeworICAgICAgVXBncmFkZVJlZ2lzdGVyKGlpLT5zZWNvbmQpOworICAgIH0KKyAgfQorCisgIC8vIFJld2luZCB0aGUgaXRlcmF0b3JzIGluIHRoZSBhY3RpdmUsIGluYWN0aXZlLCBhbmQgZml4ZWQgbGlzdHMgYmFjayB0byB0aGUKKyAgLy8gcG9pbnQgd2UgcmV2ZXJ0ZWQgdG8uCisgIFJldmVydFZlY3Rvckl0ZXJhdG9yc1RvKGFjdGl2ZV8sIGVhcmxpZXN0U3RhcnQpOworICBSZXZlcnRWZWN0b3JJdGVyYXRvcnNUbyhpbmFjdGl2ZV8sIGVhcmxpZXN0U3RhcnQpOworICBSZXZlcnRWZWN0b3JJdGVyYXRvcnNUbyhmaXhlZF8sIGVhcmxpZXN0U3RhcnQpOworCisgIC8vIFNjYW4gdGhlIHJlc3QgYW5kIHVuZG8gZWFjaCBpbnRlcnZhbCB0aGF0IGV4cGlyZWQgYWZ0ZXIgdCBhbmQKKyAgLy8gaW5zZXJ0IGl0IGluIGFjdGl2ZSAodGhlIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBhbGdvcml0aG0gd2lsbAorICAvLyBwdXQgaXQgaW4gaW5hY3RpdmUgaWYgcmVxdWlyZWQpCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBoYW5kbGVkXy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTGl2ZUludGVydmFsICpISSA9IGhhbmRsZWRfW2ldOworICAgIGlmICghSEktPmV4cGlyZWRBdChlYXJsaWVzdFN0YXJ0KSAmJgorICAgICAgICBISS0+ZXhwaXJlZEF0KGN1ci0+YmVnaW5JbmRleCgpKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJcdFx0XHR1bmRvIGNoYW5nZXMgZm9yOiAiIDw8ICpISSA8PCAnXG4nKTsKKyAgICAgIGFjdGl2ZV8ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEhJLCBISS0+YmVnaW4oKSkpOworICAgICAgYXNzZXJ0KCFUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihISS0+cmVnKSk7CisgICAgICBhZGRSZWdVc2UodnJtXy0+Z2V0UGh5cyhISS0+cmVnKSk7CisgICAgfQorICB9CisKKyAgLy8gTWVyZ2UgYWRkZWQgd2l0aCB1bmhhbmRsZWQuCisgIC8vIFRoaXMgYWxzbyB1cGRhdGUgdGhlIE5leHRSZWxvYWRNYXAuIFRoYXQgaXMsIGl0IGFkZHMgbWFwcGluZyBmcm9tIGEKKyAgLy8gcmVnaXN0ZXIgZGVmaW5lZCBieSBhIHJlbG9hZCBmcm9tIFNTIHRvIHRoZSBuZXh0IHJlbG9hZCBmcm9tIFNTIGluIHRoZQorICAvLyBzYW1lIGJhc2ljIGJsb2NrLgorICBNYWNoaW5lQmFzaWNCbG9jayAqTGFzdFJlbG9hZE1CQiA9IDA7CisgIExpdmVJbnRlcnZhbCAqTGFzdFJlbG9hZCA9IDA7CisgIGludCBMYXN0UmVsb2FkU1MgPSBWaXJ0UmVnTWFwOjpOT19TVEFDS19TTE9UOworICBzdGQ6OnNvcnQoYWRkZWQuYmVnaW4oKSwgYWRkZWQuZW5kKCksIExJU29ydGVyKCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gYWRkZWQuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIExpdmVJbnRlcnZhbCAqUmVsb2FkTGkgPSBhZGRlZFtpXTsKKyAgICBpZiAoUmVsb2FkTGktPndlaWdodCA9PSBIVUdFX1ZBTEYgJiYKKyAgICAgICAgbGlfLT5nZXRBcHByb3hpbWF0ZUluc3RydWN0aW9uQ291bnQoKlJlbG9hZExpKSA9PSAwKSB7CisgICAgICBTbG90SW5kZXggUmVsb2FkSWR4ID0gUmVsb2FkTGktPmJlZ2luSW5kZXgoKTsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpSZWxvYWRNQkIgPSBsaV8tPmdldE1CQkZyb21JbmRleChSZWxvYWRJZHgpOworICAgICAgaW50IFJlbG9hZFNTID0gdnJtXy0+Z2V0U3RhY2tTbG90KFJlbG9hZExpLT5yZWcpOworICAgICAgaWYgKExhc3RSZWxvYWRNQkIgPT0gUmVsb2FkTUJCICYmIExhc3RSZWxvYWRTUyA9PSBSZWxvYWRTUykgeworICAgICAgICAvLyBMYXN0IHJlbG9hZCBvZiBzYW1lIFNTIGlzIGluIHRoZSBzYW1lIE1CQi4gV2Ugd2FudCB0byB0cnkgdG8KKyAgICAgICAgLy8gYWxsb2NhdGUgYm90aCByZWxvYWRzIHRoZSBzYW1lIHJlZ2lzdGVyIGFuZCBtYWtlIHN1cmUgdGhlIHJlZworICAgICAgICAvLyBpc24ndCBjbG9iYmVyZWQgaW4gYmV0d2VlbiBpZiBhdCBhbGwgcG9zc2libGUuCisgICAgICAgIGFzc2VydChMYXN0UmVsb2FkLT5iZWdpbkluZGV4KCkgPCBSZWxvYWRJZHgpOworICAgICAgICBOZXh0UmVsb2FkTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihMYXN0UmVsb2FkLT5yZWcsIFJlbG9hZExpLT5yZWcpKTsKKyAgICAgIH0KKyAgICAgIExhc3RSZWxvYWRNQkIgPSBSZWxvYWRNQkI7CisgICAgICBMYXN0UmVsb2FkID0gUmVsb2FkTGk7CisgICAgICBMYXN0UmVsb2FkU1MgPSBSZWxvYWRTUzsKKyAgICB9CisgICAgdW5oYW5kbGVkXy5wdXNoKFJlbG9hZExpKTsKKyAgfQorfQorCit1bnNpZ25lZCBSQUxpblNjYW46OmdldEZyZWVQaHlzUmVnKExpdmVJbnRlcnZhbCogY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4SW5hY3RpdmVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI1Nj4gJmluYWN0aXZlQ291bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNraXBER1JlZ3MpIHsKKyAgdW5zaWduZWQgRnJlZVJlZyA9IDA7CisgIHVuc2lnbmVkIEZyZWVSZWdJbmFjdGl2ZUNvdW50ID0gMDsKKworICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBIaW50ID0gbXJpXy0+Z2V0UmVnQWxsb2NhdGlvbkhpbnQoY3VyLT5yZWcpOworICAvLyBSZXNvbHZlIHNlY29uZCBwYXJ0IG9mIHRoZSBoaW50IChpZiBwb3NzaWJsZSkgZ2l2ZW4gdGhlIGN1cnJlbnQgYWxsb2NhdGlvbi4KKyAgdW5zaWduZWQgcGh5c1JlZyA9IEhpbnQuc2Vjb25kOworICBpZiAocGh5c1JlZyAmJgorICAgICAgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihwaHlzUmVnKSAmJiB2cm1fLT5oYXNQaHlzKHBoeXNSZWcpKQorICAgIHBoeXNSZWcgPSB2cm1fLT5nZXRQaHlzKHBoeXNSZWcpOworCisgIFRhcmdldFJlZ2lzdGVyQ2xhc3M6Oml0ZXJhdG9yIEksIEU7CisgIHRpZShJLCBFKSA9IHRyaV8tPmdldEFsbG9jYXRpb25PcmRlcihSQywgSGludC5maXJzdCwgcGh5c1JlZywgKm1mXyk7CisgIGFzc2VydChJICE9IEUgJiYgIk5vIGFsbG9jYXRhYmxlIHJlZ2lzdGVyIGluIHRoaXMgcmVnaXN0ZXIgY2xhc3MhIik7CisKKyAgLy8gU2NhbiBmb3IgdGhlIGZpcnN0IGF2YWlsYWJsZSByZWdpc3Rlci4KKyAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgdW5zaWduZWQgUmVnID0gKkk7CisgICAgLy8gSWdub3JlICJkb3duZ3JhZGVkIiByZWdpc3RlcnMuCisgICAgaWYgKFNraXBER1JlZ3MgJiYgRG93bmdyYWRlZFJlZ3MuY291bnQoUmVnKSkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIFNraXAgcmVjZW50bHkgYWxsb2NhdGVkIHJlZ2lzdGVycy4KKyAgICBpZiAoaXNSZWdBdmFpbChSZWcpICYmICFpc1JlY2VudGx5VXNlZChSZWcpKSB7CisgICAgICBGcmVlUmVnID0gUmVnOworICAgICAgaWYgKEZyZWVSZWcgPCBpbmFjdGl2ZUNvdW50cy5zaXplKCkpCisgICAgICAgIEZyZWVSZWdJbmFjdGl2ZUNvdW50ID0gaW5hY3RpdmVDb3VudHNbRnJlZVJlZ107CisgICAgICBlbHNlCisgICAgICAgIEZyZWVSZWdJbmFjdGl2ZUNvdW50ID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZXJlIGFyZSBubyBmcmVlIHJlZ3MsIG9yIGlmIHRoaXMgcmVnIGhhcyB0aGUgbWF4IGluYWN0aXZlIGNvdW50LAorICAvLyByZXR1cm4gdGhpcyByZWdpc3Rlci4KKyAgaWYgKEZyZWVSZWcgPT0gMCB8fCBGcmVlUmVnSW5hY3RpdmVDb3VudCA9PSBNYXhJbmFjdGl2ZUNvdW50KSB7CisgICAgLy8gUmVtZW1iZXIgd2hhdCByZWdpc3RlciB3ZSBwaWNrZWQgc28gd2UgY2FuIHNraXAgaXQgbmV4dCB0aW1lLgorICAgIGlmIChGcmVlUmVnICE9IDApIHJlY29yZFJlY2VudGx5VXNlZChGcmVlUmVnKTsKKyAgICByZXR1cm4gRnJlZVJlZzsKKyAgfQorCisgIC8vIENvbnRpbnVlIHNjYW5uaW5nIHRoZSByZWdpc3RlcnMsIGxvb2tpbmcgZm9yIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdAorICAvLyBpbmFjdGl2ZSBjb3VudC4gIEFsa2lzIGZvdW5kIHRoYXQgdGhpcyByZWR1Y2VkIHJlZ2lzdGVyIHByZXNzdXJlIHZlcnkKKyAgLy8gc2xpZ2h0bHkgb24gWDg2IChpbiByZXYgMS45NCBvZiB0aGlzIGZpbGUpLCB0aG91Z2ggdGhpcyBzaG91bGQgcHJvYmFibHkgYmUKKyAgLy8gcmVldmFsdWF0ZWQgbm93LgorICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSAqSTsKKyAgICAvLyBJZ25vcmUgImRvd25ncmFkZWQiIHJlZ2lzdGVycy4KKyAgICBpZiAoU2tpcERHUmVncyAmJiBEb3duZ3JhZGVkUmVncy5jb3VudChSZWcpKQorICAgICAgY29udGludWU7CisgICAgaWYgKGlzUmVnQXZhaWwoUmVnKSAmJiBSZWcgPCBpbmFjdGl2ZUNvdW50cy5zaXplKCkgJiYKKyAgICAgICAgRnJlZVJlZ0luYWN0aXZlQ291bnQgPCBpbmFjdGl2ZUNvdW50c1tSZWddICYmICFpc1JlY2VudGx5VXNlZChSZWcpKSB7CisgICAgICBGcmVlUmVnID0gUmVnOworICAgICAgRnJlZVJlZ0luYWN0aXZlQ291bnQgPSBpbmFjdGl2ZUNvdW50c1tSZWddOworICAgICAgaWYgKEZyZWVSZWdJbmFjdGl2ZUNvdW50ID09IE1heEluYWN0aXZlQ291bnQpCisgICAgICAgIGJyZWFrOyAgICAvLyBXZSBmb3VuZCB0aGUgb25lIHdpdGggdGhlIG1heCBpbmFjdGl2ZSBjb3VudC4KKyAgICB9CisgIH0KKworICAvLyBSZW1lbWJlciB3aGF0IHJlZ2lzdGVyIHdlIHBpY2tlZCBzbyB3ZSBjYW4gc2tpcCBpdCBuZXh0IHRpbWUuCisgIHJlY29yZFJlY2VudGx5VXNlZChGcmVlUmVnKTsKKworICByZXR1cm4gRnJlZVJlZzsKK30KKworLy8vIGdldEZyZWVQaHlzUmVnIC0gcmV0dXJuIGEgZnJlZSBwaHlzaWNhbCByZWdpc3RlciBmb3IgdGhpcyB2aXJ0dWFsIHJlZ2lzdGVyCisvLy8gaW50ZXJ2YWwgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSByZXR1cm4gMC4KK3Vuc2lnbmVkIFJBTGluU2Nhbjo6Z2V0RnJlZVBoeXNSZWcoTGl2ZUludGVydmFsICpjdXIpIHsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI1Nj4gaW5hY3RpdmVDb3VudHM7CisgIHVuc2lnbmVkIE1heEluYWN0aXZlQ291bnQgPSAwOworICAKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBtcmlfLT5nZXRSZWdDbGFzcyhjdXItPnJlZyk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDTGVhZGVyID0gUmVsYXRlZFJlZ0NsYXNzZXMuZ2V0TGVhZGVyVmFsdWUoUkMpOworIAorICBmb3IgKEludGVydmFsUHRyczo6aXRlcmF0b3IgaSA9IGluYWN0aXZlXy5iZWdpbigpLCBlID0gaW5hY3RpdmVfLmVuZCgpOworICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgcmVnID0gaS0+Zmlyc3QtPnJlZzsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihyZWcpICYmCisgICAgICAgICAgICJDYW4gb25seSBhbGxvY2F0ZSB2aXJ0dWFsIHJlZ2lzdGVycyEiKTsKKworICAgIC8vIElmIHRoaXMgaXMgbm90IGluIGEgcmVsYXRlZCByZWcgY2xhc3MgdG8gdGhlIHJlZ2lzdGVyIHdlJ3JlIGFsbG9jYXRpbmcsIAorICAgIC8vIGRvbid0IGNoZWNrIGl0LgorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlZ1JDID0gbXJpXy0+Z2V0UmVnQ2xhc3MocmVnKTsKKyAgICBpZiAoUmVsYXRlZFJlZ0NsYXNzZXMuZ2V0TGVhZGVyVmFsdWUoUmVnUkMpID09IFJDTGVhZGVyKSB7CisgICAgICByZWcgPSB2cm1fLT5nZXRQaHlzKHJlZyk7CisgICAgICBpZiAoaW5hY3RpdmVDb3VudHMuc2l6ZSgpIDw9IHJlZykKKyAgICAgICAgaW5hY3RpdmVDb3VudHMucmVzaXplKHJlZysxKTsKKyAgICAgICsraW5hY3RpdmVDb3VudHNbcmVnXTsKKyAgICAgIE1heEluYWN0aXZlQ291bnQgPSBzdGQ6Om1heChNYXhJbmFjdGl2ZUNvdW50LCBpbmFjdGl2ZUNvdW50c1tyZWddKTsKKyAgICB9CisgIH0KKworICAvLyBJZiBjb3B5IGNvYWxlc2NlciBoYXMgYXNzaWduZWQgYSAicHJlZmVycmVkIiByZWdpc3RlciwgY2hlY2sgaWYgaXQncworICAvLyBhdmFpbGFibGUgZmlyc3QuCisgIHVuc2lnbmVkIFByZWZlcmVuY2UgPSB2cm1fLT5nZXRSZWdBbGxvY1ByZWYoY3VyLT5yZWcpOworICBpZiAoUHJlZmVyZW5jZSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiKHByZWZlcnJlZDogIiA8PCB0cmlfLT5nZXROYW1lKFByZWZlcmVuY2UpIDw8ICIpICIpOworICAgIGlmIChpc1JlZ0F2YWlsKFByZWZlcmVuY2UpICYmIAorICAgICAgICBSQy0+Y29udGFpbnMoUHJlZmVyZW5jZSkpCisgICAgICByZXR1cm4gUHJlZmVyZW5jZTsKKyAgfQorCisgIGlmICghRG93bmdyYWRlZFJlZ3MuZW1wdHkoKSkgeworICAgIHVuc2lnbmVkIEZyZWVSZWcgPSBnZXRGcmVlUGh5c1JlZyhjdXIsIFJDLCBNYXhJbmFjdGl2ZUNvdW50LCBpbmFjdGl2ZUNvdW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgaWYgKEZyZWVSZWcpCisgICAgICByZXR1cm4gRnJlZVJlZzsKKyAgfQorICByZXR1cm4gZ2V0RnJlZVBoeXNSZWcoY3VyLCBSQywgTWF4SW5hY3RpdmVDb3VudCwgaW5hY3RpdmVDb3VudHMsIGZhbHNlKTsKK30KKworRnVuY3Rpb25QYXNzKiBsbHZtOjpjcmVhdGVMaW5lYXJTY2FuUmVnaXN0ZXJBbGxvY2F0b3IoKSB7CisgIHJldHVybiBuZXcgUkFMaW5TY2FuKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9SZWdpc3RlckNvYWxlc2Nlci5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9SZWdpc3RlckNvYWxlc2Nlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiNTUzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1JlZ2lzdGVyQ29hbGVzY2VyLmNwcApAQCAtMCwwICsxLDE5NiBAQAorLy89PT0tIFJlZ2lzdGVyQ29hbGVzY2VyLmNwcCAtIEdlbmVyaWMgUmVnaXN0ZXIgQ29hbGVzY2luZyBJbnRlcmZhY2UgLS0tLS0tLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZ2VuZXJpYyBSZWdpc3RlckNvYWxlc2NlciBpbnRlcmZhY2Ugd2hpY2gKKy8vIGlzIHVzZWQgYXMgdGhlIGNvbW1vbiBpbnRlcmZhY2UgdXNlZCBieSBhbGwgY2xpZW50cyBhbmQKKy8vIGltcGxlbWVudGF0aW9ucyBvZiByZWdpc3RlciBjb2FsZXNjaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUmVnaXN0ZXJDb2FsZXNjZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIFJlZ2lzdGVyIHRoZSBSZWdpc3RlckNvYWxlc2NlciBpbnRlcmZhY2UsIHByb3ZpZGluZyBhIG5pY2UgbmFtZSB0byByZWZlciB0by4KK3N0YXRpYyBSZWdpc3RlckFuYWx5c2lzR3JvdXA8UmVnaXN0ZXJDb2FsZXNjZXI+IFooIlJlZ2lzdGVyIENvYWxlc2NlciIpOworY2hhciBSZWdpc3RlckNvYWxlc2Nlcjo6SUQgPSAwOworCisvLyBSZWdpc3RlckNvYWxlc2NlciBkZXN0cnVjdG9yOiBETyBOT1QgbW92ZSB0aGlzIHRvIHRoZSBoZWFkZXIgZmlsZQorLy8gZm9yIFJlZ2lzdGVyQ29hbGVzY2VyIG9yIGVsc2UgY2xpZW50cyBvZiB0aGUgUmVnaXN0ZXJDb2FsZXNjZXIKKy8vIGNsYXNzIG1heSBub3QgZGVwZW5kIG9uIHRoZSBSZWdpc3RlckNvYWxlc2Nlci5vIGZpbGUgaW4gdGhlIGN1cnJlbnQKKy8vIC5hIGZpbGUsIGNhdXNpbmcgYWxpYXMgYW5hbHlzaXMgc3VwcG9ydCB0byBub3QgYmUgaW5jbHVkZWQgaW4gdGhlCisvLyB0b29sIGNvcnJlY3RseSEKKy8vCitSZWdpc3RlckNvYWxlc2Nlcjo6flJlZ2lzdGVyQ29hbGVzY2VyKCkge30KKwordW5zaWduZWQgQ29hbGVzY2VyUGFpcjo6Y29tcG9zZSh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKSBjb25zdCB7CisgIGlmICghYSkgcmV0dXJuIGI7CisgIGlmICghYikgcmV0dXJuIGE7CisgIHJldHVybiB0cmlfLmNvbXBvc2VTdWJSZWdJbmRpY2VzKGEsIGIpOworfQorCitib29sIENvYWxlc2NlclBhaXI6OmlzTW92ZUluc3RyKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcmMsIHVuc2lnbmVkICZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcmNTdWIsIHVuc2lnbmVkICZEc3RTdWIpIGNvbnN0IHsKKyAgaWYgKE1JLT5pc0NvcHkoKSkgeworICAgIERzdCA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIERzdFN1YiA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFN1YlJlZygpOworICAgIFNyYyA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgIFNyY1N1YiA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFN1YlJlZygpOworICB9IGVsc2UgaWYgKE1JLT5pc1N1YnJlZ1RvUmVnKCkpIHsKKyAgICBEc3QgPSBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICBEc3RTdWIgPSBjb21wb3NlKE1JLT5nZXRPcGVyYW5kKDApLmdldFN1YlJlZygpLCBNSS0+Z2V0T3BlcmFuZCgzKS5nZXRJbW0oKSk7CisgICAgU3JjID0gTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCk7CisgICAgU3JjU3ViID0gTUktPmdldE9wZXJhbmQoMikuZ2V0U3ViUmVnKCk7CisgIH0gZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29hbGVzY2VyUGFpcjo6c2V0UmVnaXN0ZXJzKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgc3JjUmVnXyA9IGRzdFJlZ18gPSBzdWJJZHhfID0gMDsKKyAgbmV3UkNfID0gMDsKKyAgZmxpcHBlZF8gPSBjcm9zc0NsYXNzXyA9IGZhbHNlOworCisgIHVuc2lnbmVkIFNyYywgRHN0LCBTcmNTdWIsIERzdFN1YjsKKyAgaWYgKCFpc01vdmVJbnN0cihNSSwgU3JjLCBEc3QsIFNyY1N1YiwgRHN0U3ViKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHBhcnRpYWxfID0gU3JjU3ViIHx8IERzdFN1YjsKKworICAvLyBJZiBvbmUgcmVnaXN0ZXIgaXMgYSBwaHlzcmVnLCBpdCBtdXN0IGJlIERzdC4KKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFNyYykpIHsKKyAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoRHN0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzdGQ6OnN3YXAoU3JjLCBEc3QpOworICAgIHN0ZDo6c3dhcChTcmNTdWIsIERzdFN1Yik7CisgICAgZmxpcHBlZF8gPSB0cnVlOworICB9CisKKyAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJID0gTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0UmVnSW5mbygpOworCisgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihEc3QpKSB7CisgICAgLy8gRWxpbWluYXRlIERzdFN1YiBvbiBhIHBoeXNyZWcuCisgICAgaWYgKERzdFN1YikgeworICAgICAgRHN0ID0gdHJpXy5nZXRTdWJSZWcoRHN0LCBEc3RTdWIpOworICAgICAgaWYgKCFEc3QpIHJldHVybiBmYWxzZTsKKyAgICAgIERzdFN1YiA9IDA7CisgICAgfQorCisgICAgLy8gRWxpbWluYXRlIFNyY1N1YiBieSBwaWNraW5nIGEgY29ycmVzcG9uZGluZyBEc3Qgc3VwZXJyZWdpc3Rlci4KKyAgICBpZiAoU3JjU3ViKSB7CisgICAgICBEc3QgPSB0cmlfLmdldE1hdGNoaW5nU3VwZXJSZWcoRHN0LCBTcmNTdWIsIE1SSS5nZXRSZWdDbGFzcyhTcmMpKTsKKyAgICAgIGlmICghRHN0KSByZXR1cm4gZmFsc2U7CisgICAgICBTcmNTdWIgPSAwOworICAgIH0gZWxzZSBpZiAoIU1SSS5nZXRSZWdDbGFzcyhTcmMpLT5jb250YWlucyhEc3QpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIEJvdGggcmVnaXN0ZXJzIGFyZSB2aXJ0dWFsLgorCisgICAgLy8gQm90aCByZWdpc3RlcnMgaGF2ZSBzdWJyZWcgaW5kaWNlcy4KKyAgICBpZiAoU3JjU3ViICYmIERzdFN1YikgeworICAgICAgLy8gRm9yIG5vdyB3ZSBvbmx5IGhhbmRsZSB0aGUgY2FzZSBvZiBpZGVudGljYWwgaW5kaWNlcyBpbiBjb21tZW5zdXJhdGUKKyAgICAgIC8vIHJlZ2lzdGVyczogRHJlZzpzc3ViXzEgKyBEcmVnOnNzdWJfMSAtPiBEcmVnCisgICAgICAvLyBGSVhNRTogSGFuZGxlIFFyZWc6c3N1Yl8zICsgRHJlZzpzc3ViXzEgYXMgUVJlZzpkc3ViXzEgKyBEcmVnLgorICAgICAgaWYgKFNyY1N1YiAhPSBEc3RTdWIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlNyY1JDID0gTVJJLmdldFJlZ0NsYXNzKFNyYyk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpEc3RSQyA9IE1SSS5nZXRSZWdDbGFzcyhEc3QpOworICAgICAgaWYgKCFnZXRDb21tb25TdWJDbGFzcyhEc3RSQywgU3JjUkMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBTcmNTdWIgPSBEc3RTdWIgPSAwOworICAgIH0KKworICAgIC8vIFRoZXJlIGNhbiBiZSBubyBTcmNTdWIuCisgICAgaWYgKFNyY1N1YikgeworICAgICAgc3RkOjpzd2FwKFNyYywgRHN0KTsKKyAgICAgIERzdFN1YiA9IFNyY1N1YjsKKyAgICAgIFNyY1N1YiA9IDA7CisgICAgICBhc3NlcnQoIWZsaXBwZWRfICYmICJVbmV4cGVjdGVkIGZsaXAiKTsKKyAgICAgIGZsaXBwZWRfID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBGaW5kIHRoZSBuZXcgcmVnaXN0ZXIgY2xhc3MuCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqU3JjUkMgPSBNUkkuZ2V0UmVnQ2xhc3MoU3JjKTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpEc3RSQyA9IE1SSS5nZXRSZWdDbGFzcyhEc3QpOworICAgIGlmIChEc3RTdWIpCisgICAgICBuZXdSQ18gPSB0cmlfLmdldE1hdGNoaW5nU3VwZXJSZWdDbGFzcyhEc3RSQywgU3JjUkMsIERzdFN1Yik7CisgICAgZWxzZQorICAgICAgbmV3UkNfID0gZ2V0Q29tbW9uU3ViQ2xhc3MoRHN0UkMsIFNyY1JDKTsKKyAgICBpZiAoIW5ld1JDXykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjcm9zc0NsYXNzXyA9IG5ld1JDXyAhPSBEc3RSQyB8fCBuZXdSQ18gIT0gU3JjUkM7CisgIH0KKyAgLy8gQ2hlY2sgb3VyIGludmFyaWFudHMKKyAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoU3JjKSAmJiAiU3JjIG11c3QgYmUgdmlydHVhbCIpOworICBhc3NlcnQoIShUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihEc3QpICYmIERzdFN1YikgJiYKKyAgICAgICAgICJDYW5ub3QgaGF2ZSBhIHBoeXNpY2FsIFN1YklkeCIpOworICBzcmNSZWdfID0gU3JjOworICBkc3RSZWdfID0gRHN0OworICBzdWJJZHhfID0gRHN0U3ViOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2FsZXNjZXJQYWlyOjpmbGlwKCkgeworICBpZiAoc3ViSWR4XyB8fCBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3Rlcihkc3RSZWdfKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHN0ZDo6c3dhcChzcmNSZWdfLCBkc3RSZWdfKTsKKyAgZmxpcHBlZF8gPSAhZmxpcHBlZF87CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvYWxlc2NlclBhaXI6OmlzQ29hbGVzY2FibGUoY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICBpZiAoIU1JKQorICAgIHJldHVybiBmYWxzZTsKKyAgdW5zaWduZWQgU3JjLCBEc3QsIFNyY1N1YiwgRHN0U3ViOworICBpZiAoIWlzTW92ZUluc3RyKE1JLCBTcmMsIERzdCwgU3JjU3ViLCBEc3RTdWIpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBGaW5kIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIHRoYXQgaXMgc3JjUmVnXy4KKyAgaWYgKERzdCA9PSBzcmNSZWdfKSB7CisgICAgc3RkOjpzd2FwKFNyYywgRHN0KTsKKyAgICBzdGQ6OnN3YXAoU3JjU3ViLCBEc3RTdWIpOworICB9IGVsc2UgaWYgKFNyYyAhPSBzcmNSZWdfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gTm93IGNoZWNrIHRoYXQgRHN0IG1hdGNoZXMgZHN0UmVnXy4KKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKGRzdFJlZ18pKSB7CisgICAgaWYgKCFUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihEc3QpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGFzc2VydCghc3ViSWR4XyAmJiAiSW5jb25zaXN0ZW50IENvYWxlc2NlclBhaXIgc3RhdGUuIik7CisgICAgLy8gRHN0U3ViIGNvdWxkIGJlIHNldCBmb3IgYSBwaHlzcmVnIGZyb20gSU5TRVJUX1NVQlJFRy4KKyAgICBpZiAoRHN0U3ViKQorICAgICAgRHN0ID0gdHJpXy5nZXRTdWJSZWcoRHN0LCBEc3RTdWIpOworICAgIC8vIEZ1bGwgY29weSBvZiBTcmMuCisgICAgaWYgKCFTcmNTdWIpCisgICAgICByZXR1cm4gZHN0UmVnXyA9PSBEc3Q7CisgICAgLy8gVGhpcyBpcyBhIHBhcnRpYWwgcmVnaXN0ZXIgY29weS4gQ2hlY2sgdGhhdCB0aGUgcGFydHMgbWF0Y2guCisgICAgcmV0dXJuIHRyaV8uZ2V0U3ViUmVnKGRzdFJlZ18sIFNyY1N1YikgPT0gRHN0OworICB9IGVsc2UgeworICAgIC8vIGRzdFJlZ18gaXMgdmlydHVhbC4KKyAgICBpZiAoZHN0UmVnXyAhPSBEc3QpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gUmVnaXN0ZXJzIG1hdGNoLCBkbyB0aGUgc3VicmVnaXN0ZXJzIGxpbmUgdXA/CisgICAgcmV0dXJuIGNvbXBvc2Uoc3ViSWR4XywgU3JjU3ViKSA9PSBEc3RTdWI7CisgIH0KK30KKworLy8gQmVjYXVzZSBvZiB0aGUgd2F5IC5hIGZpbGVzIHdvcmssIHdlIG11c3QgZm9yY2UgdGhlIFNpbXBsZVJDCisvLyBpbXBsZW1lbnRhdGlvbiB0byBiZSBwdWxsZWQgaW4gaWYgdGhlIFJlZ2lzdGVyQ29hbGVzY2VyIGNsYXNzZXMgYXJlCisvLyBwdWxsZWQgaW4uICBPdGhlcndpc2Ugd2UgcnVuIHRoZSByaXNrIG9mIFJlZ2lzdGVyQ29hbGVzY2VyIGJlaW5nCisvLyB1c2VkLCBidXQgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbm90IGJlaW5nIGxpbmtlZCBpbnRvIHRoZSB0b29sCisvLyB0aGF0IHVzZXMgaXQuCitERUZJTklOR19GSUxFX0ZPUihSZWdpc3RlckNvYWxlc2NlcikKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1JlZ2lzdGVyU2NhdmVuZ2luZy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYjNmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuY3BwCkBAIC0wLDAgKzEsMzg0IEBACisvLz09PS0tIFJlZ2lzdGVyU2NhdmVuZ2luZy5jcHAgLSBNYWNoaW5lIHJlZ2lzdGVyIHNjYXZlbmdpbmcgLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBtYWNoaW5lIHJlZ2lzdGVyIHNjYXZlbmdlci4gSXQgY2FuIHByb3ZpZGUKKy8vIGluZm9ybWF0aW9uLCBzdWNoIGFzIHVudXNlZCByZWdpc3RlcnMsIGF0IGFueSBwb2ludCBpbiBhIG1hY2hpbmUgYmFzaWMgYmxvY2suCisvLyBJdCBhbHNvIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIG1ha2UgcmVnaXN0ZXJzIGF2YWlsYWJsZSBieSBldmljdGluZyB0aGVtIHRvCisvLyBzcGlsbCBzbG90cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInJlZy1zY2F2ZW5naW5nIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gc2V0VXNlZCAtIFNldCB0aGUgcmVnaXN0ZXIgYW5kIGl0cyBzdWItcmVnaXN0ZXJzIGFzIGJlaW5nIHVzZWQuCit2b2lkIFJlZ1NjYXZlbmdlcjo6c2V0VXNlZCh1bnNpZ25lZCBSZWcpIHsKKyAgUmVnc0F2YWlsYWJsZS5yZXNldChSZWcpOworCisgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YlJlZ3MgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOworICAgICAgIHVuc2lnbmVkIFN1YlJlZyA9ICpTdWJSZWdzOyArK1N1YlJlZ3MpCisgICAgUmVnc0F2YWlsYWJsZS5yZXNldChTdWJSZWcpOworfQorCitib29sIFJlZ1NjYXZlbmdlcjo6aXNBbGlhc1VzZWQodW5zaWduZWQgUmVnKSBjb25zdCB7CisgIGlmIChpc1VzZWQoUmVnKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZm9yIChjb25zdCB1bnNpZ25lZCAqUiA9IFRSSS0+Z2V0QWxpYXNTZXQoUmVnKTsgKlI7ICsrUikKKyAgICBpZiAoaXNVc2VkKCpSKSkKKyAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVnU2NhdmVuZ2VyOjppbml0UmVnU3RhdGUoKSB7CisgIFNjYXZlbmdlZFJlZyA9IDA7CisgIFNjYXZlbmdlZFJDID0gTlVMTDsKKyAgU2NhdmVuZ2VSZXN0b3JlID0gTlVMTDsKKworICAvLyBBbGwgcmVnaXN0ZXJzIHN0YXJ0ZWQgb3V0IHVudXNlZC4KKyAgUmVnc0F2YWlsYWJsZS5zZXQoKTsKKworICAvLyBSZXNlcnZlZCByZWdpc3RlcnMgYXJlIGFsd2F5cyB1c2VkLgorICBSZWdzQXZhaWxhYmxlIF49IFJlc2VydmVkUmVnczsKKworICBpZiAoIU1CQikKKyAgICByZXR1cm47CisKKyAgLy8gTGl2ZS1pbiByZWdpc3RlcnMgYXJlIGluIHVzZS4KKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6bGl2ZWluX2l0ZXJhdG9yIEkgPSBNQkItPmxpdmVpbl9iZWdpbigpLAorICAgICAgICAgRSA9IE1CQi0+bGl2ZWluX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBzZXRVc2VkKCpJKTsKKworICAvLyBQcmlzdGluZSBDU1JzIGFyZSBhbHNvIHVuYXZhaWxhYmxlLgorICBCaXRWZWN0b3IgUFIgPSBNQkItPmdldFBhcmVudCgpLT5nZXRGcmFtZUluZm8oKS0+Z2V0UHJpc3RpbmVSZWdzKE1CQik7CisgIGZvciAoaW50IEkgPSBQUi5maW5kX2ZpcnN0KCk7IEk+MDsgSSA9IFBSLmZpbmRfbmV4dChJKSkKKyAgICBzZXRVc2VkKEkpOworfQorCit2b2lkIFJlZ1NjYXZlbmdlcjo6ZW50ZXJCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICptYmIpIHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICptYmItPmdldFBhcmVudCgpOworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICBUSUkgPSBUTS5nZXRJbnN0ckluZm8oKTsKKyAgVFJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIE1SSSA9ICZNRi5nZXRSZWdJbmZvKCk7CisKKyAgYXNzZXJ0KChOdW1QaHlzUmVncyA9PSAwIHx8IE51bVBoeXNSZWdzID09IFRSSS0+Z2V0TnVtUmVncygpKSAmJgorICAgICAgICAgIlRhcmdldCBjaGFuZ2VkPyIpOworCisgIC8vIFNlbGYtaW5pdGlhbGl6ZS4KKyAgaWYgKCFNQkIpIHsKKyAgICBOdW1QaHlzUmVncyA9IFRSSS0+Z2V0TnVtUmVncygpOworICAgIFJlZ3NBdmFpbGFibGUucmVzaXplKE51bVBoeXNSZWdzKTsKKworICAgIC8vIENyZWF0ZSByZXNlcnZlZCByZWdpc3RlcnMgYml0dmVjdG9yLgorICAgIFJlc2VydmVkUmVncyA9IFRSSS0+Z2V0UmVzZXJ2ZWRSZWdzKE1GKTsKKworICAgIC8vIENyZWF0ZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIGJpdHZlY3Rvci4KKyAgICBDYWxsZWVTYXZlZFJlZ3MucmVzaXplKE51bVBoeXNSZWdzKTsKKyAgICBjb25zdCB1bnNpZ25lZCAqQ1NSZWdzID0gVFJJLT5nZXRDYWxsZWVTYXZlZFJlZ3MoKTsKKyAgICBpZiAoQ1NSZWdzICE9IE5VTEwpCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBDU1JlZ3NbaV07ICsraSkKKyAgICAgICAgQ2FsbGVlU2F2ZWRSZWdzLnNldChDU1JlZ3NbaV0pOworICB9CisKKyAgTUJCID0gbWJiOworICBpbml0UmVnU3RhdGUoKTsKKworICBUcmFja2luZyA9IGZhbHNlOworfQorCit2b2lkIFJlZ1NjYXZlbmdlcjo6YWRkUmVnV2l0aFN1YlJlZ3MoQml0VmVjdG9yICZCViwgdW5zaWduZWQgUmVnKSB7CisgIEJWLnNldChSZWcpOworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpSID0gVFJJLT5nZXRTdWJSZWdpc3RlcnMoUmVnKTsgKlI7IFIrKykKKyAgICBCVi5zZXQoKlIpOworfQorCit2b2lkIFJlZ1NjYXZlbmdlcjo6YWRkUmVnV2l0aEFsaWFzZXMoQml0VmVjdG9yICZCViwgdW5zaWduZWQgUmVnKSB7CisgIEJWLnNldChSZWcpOworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpSID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqUjsgUisrKQorICAgIEJWLnNldCgqUik7Cit9CisKK3ZvaWQgUmVnU2NhdmVuZ2VyOjpmb3J3YXJkKCkgeworICAvLyBNb3ZlIHB0ciBmb3J3YXJkLgorICBpZiAoIVRyYWNraW5nKSB7CisgICAgTUJCSSA9IE1CQi0+YmVnaW4oKTsKKyAgICBUcmFja2luZyA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KE1CQkkgIT0gTUJCLT5lbmQoKSAmJiAiQWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBiYXNpYyBibG9jayEiKTsKKyAgICBNQkJJID0gbGx2bTo6bmV4dChNQkJJKTsKKyAgfQorCisgIE1hY2hpbmVJbnN0ciAqTUkgPSBNQkJJOworCisgIGlmIChNSSA9PSBTY2F2ZW5nZVJlc3RvcmUpIHsKKyAgICBTY2F2ZW5nZWRSZWcgPSAwOworICAgIFNjYXZlbmdlZFJDID0gTlVMTDsKKyAgICBTY2F2ZW5nZVJlc3RvcmUgPSBOVUxMOworICB9CisKKyAgaWYgKE1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICByZXR1cm47CisKKyAgLy8gRmluZCBvdXQgd2hpY2ggcmVnaXN0ZXJzIGFyZSBlYXJseSBjbG9iYmVyZWQsIGtpbGxlZCwgZGVmaW5lZCwgYW5kIG1hcmtlZAorICAvLyBkZWYtZGVhZCBpbiB0aGlzIGluc3RydWN0aW9uLgorICAvLyBGSVhNRTogVGhlIHNjYXZlbmdlciBpcyBub3QgcHJlZGljYXRpb24gYXdhcmUuIElmIHRoZSBpbnN0cnVjdGlvbiBpcworICAvLyBwcmVkaWNhdGVkLCBjb25zZXJ2YXRpdmVseSBhc3N1bWUgImtpbGwiIG1hcmtlcnMgZG8gbm90IGFjdHVhbGx5IGtpbGwgdGhlCisgIC8vIHJlZ2lzdGVyLiBTaW1pbGFybHkgaWdub3JlcyAiZGVhZCIgbWFya2Vycy4KKyAgYm9vbCBpc1ByZWQgPSBUSUktPmlzUHJlZGljYXRlZChNSSk7CisgIEJpdFZlY3RvciBFYXJseUNsb2JiZXJSZWdzKE51bVBoeXNSZWdzKTsKKyAgQml0VmVjdG9yIEtpbGxSZWdzKE51bVBoeXNSZWdzKTsKKyAgQml0VmVjdG9yIERlZlJlZ3MoTnVtUGh5c1JlZ3MpOworICBCaXRWZWN0b3IgRGVhZFJlZ3MoTnVtUGh5c1JlZ3MpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmlzVW5kZWYoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmICghUmVnIHx8IGlzUmVzZXJ2ZWQoUmVnKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKE1PLmlzVXNlKCkpIHsKKyAgICAgIC8vIFR3by1hZGRyZXNzIG9wZXJhbmRzIGltcGxpY2l0bHkga2lsbC4KKyAgICAgIGlmICghaXNQcmVkICYmIChNTy5pc0tpbGwoKSB8fCBNSS0+aXNSZWdUaWVkVG9EZWZPcGVyYW5kKGkpKSkKKyAgICAgICAgYWRkUmVnV2l0aFN1YlJlZ3MoS2lsbFJlZ3MsIFJlZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChNTy5pc0RlZigpKTsKKyAgICAgIGlmICghaXNQcmVkICYmIE1PLmlzRGVhZCgpKQorICAgICAgICBhZGRSZWdXaXRoU3ViUmVncyhEZWFkUmVncywgUmVnKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYWRkUmVnV2l0aFN1YlJlZ3MoRGVmUmVncywgUmVnKTsKKyAgICAgIGlmIChNTy5pc0Vhcmx5Q2xvYmJlcigpKQorICAgICAgICBhZGRSZWdXaXRoQWxpYXNlcyhFYXJseUNsb2JiZXJSZWdzLCBSZWcpOworICAgIH0KKyAgfQorCisgIC8vIFZlcmlmeSB1c2VzIGFuZCBkZWZzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmlzVW5kZWYoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmICghUmVnIHx8IGlzUmVzZXJ2ZWQoUmVnKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChNTy5pc1VzZSgpKSB7CisgICAgICBpZiAoIWlzVXNlZChSZWcpKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgcGFydGlhbCBsaXZlOiBlLmcuCisgICAgICAgIC8vIEQwID0gaW5zZXJ0X3N1YnJlZyBEMDx1bmRlZj4sIFMwCisgICAgICAgIC8vIC4uLiBEMAorICAgICAgICAvLyBUaGUgcHJvYmxlbSBpcyB0aGUgaW5zZXJ0X3N1YnJlZyBjb3VsZCBiZSBlbGltaW5hdGVkLiBUaGUgdXNlIG9mCisgICAgICAgIC8vIEQwIGlzIHVzaW5nIGEgcGFydGlhbGx5IHVuZGVmIHZhbHVlLiBUaGlzIGlzIG5vdCAqaW5jb3JyZWN0KiBzaW5jZQorICAgICAgICAvLyBTMSBpcyBjYW4gYmUgZnJlZWx5IGNsb2JiZXJlZC4KKyAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBsaWtlIGEgd2F5IHRvIG1vZGVsIHRoaXMsIGJ1dCBsZWF2aW5nIHRoZQorICAgICAgICAvLyBpbnNlcnRfc3VicmVnIGFyb3VuZCBjYXVzZXMgYm90aCBjb3JyZWN0bmVzcyBhbmQgcGVyZm9ybWFuY2UgaXNzdWVzLgorICAgICAgICBib29sIFN1YlVzZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3ViUmVncyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgICAgICAgdW5zaWduZWQgU3ViUmVnID0gKlN1YlJlZ3M7ICsrU3ViUmVncykKKyAgICAgICAgICBpZiAoaXNVc2VkKFN1YlJlZykpIHsKKyAgICAgICAgICAgIFN1YlVzZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBhc3NlcnQoU3ViVXNlZCAmJiAiVXNpbmcgYW4gdW5kZWZpbmVkIHJlZ2lzdGVyISIpOworICAgICAgfQorICAgICAgYXNzZXJ0KCghRWFybHlDbG9iYmVyUmVncy50ZXN0KFJlZykgfHwgTUktPmlzUmVnVGllZFRvRGVmT3BlcmFuZChpKSkgJiYKKyAgICAgICAgICAgICAiVXNpbmcgYW4gZWFybHkgY2xvYmJlcmVkIHJlZ2lzdGVyISIpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoTU8uaXNEZWYoKSk7CisjaWYgMAorICAgICAgLy8gRklYTUU6IEVuYWJsZSB0aGlzIG9uY2Ugd2UndmUgZmlndXJlZCBvdXQgaG93IHRvIGNvcnJlY3RseSB0cmFuc2ZlcgorICAgICAgLy8gaW1wbGljaXQga2lsbHMgZHVyaW5nIGNvZGVnZW4gcGFzc2VzIGxpa2UgdGhlIGNvYWxlc2Nlci4KKyAgICAgIGFzc2VydCgoS2lsbFJlZ3MudGVzdChSZWcpIHx8IGlzVW51c2VkKFJlZykgfHwKKyAgICAgICAgICAgICAgaXNMaXZlSW5CdXRVbnVzZWRCZWZvcmUoUmVnLCBNSSwgTUJCLCBUUkksIE1SSSkpICYmCisgICAgICAgICAgICAgIlJlLWRlZmluaW5nIGEgbGl2ZSByZWdpc3RlciEiKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIC8vIENvbW1pdCB0aGUgY2hhbmdlcy4KKyAgc2V0VW51c2VkKEtpbGxSZWdzKTsKKyAgc2V0VW51c2VkKERlYWRSZWdzKTsKKyAgc2V0VXNlZChEZWZSZWdzKTsKK30KKwordm9pZCBSZWdTY2F2ZW5nZXI6OmdldFJlZ3NVc2VkKEJpdFZlY3RvciAmdXNlZCwgYm9vbCBpbmNsdWRlUmVzZXJ2ZWQpIHsKKyAgaWYgKGluY2x1ZGVSZXNlcnZlZCkKKyAgICB1c2VkID0gflJlZ3NBdmFpbGFibGU7CisgIGVsc2UKKyAgICB1c2VkID0gflJlZ3NBdmFpbGFibGUgJiB+UmVzZXJ2ZWRSZWdzOworfQorCisvLy8gQ3JlYXRlUmVnQ2xhc3NNYXNrIC0gU2V0IHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSByZWdpc3RlcnMgaW4gdGhlCisvLy8gVGFyZ2V0UmVnaXN0ZXJDbGFzcy4KK3N0YXRpYyB2b2lkIENyZWF0ZVJlZ0NsYXNzTWFzayhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgQml0VmVjdG9yICZNYXNrKSB7CisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJDbGFzczo6aXRlcmF0b3IgSSA9IFJDLT5iZWdpbigpLCBFID0gUkMtPmVuZCgpOyBJICE9IEU7CisgICAgICAgKytJKQorICAgIE1hc2suc2V0KCpJKTsKK30KKwordW5zaWduZWQgUmVnU2NhdmVuZ2VyOjpGaW5kVW51c2VkUmVnKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJDbGFzczo6aXRlcmF0b3IgSSA9IFJDLT5iZWdpbigpLCBFID0gUkMtPmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmICghaXNBbGlhc1VzZWQoKkkpKQorICAgICAgcmV0dXJuICpJOworICByZXR1cm4gMDsKK30KKworLy8vIGdldFJlZ3NBdmFpbGFibGUgLSBSZXR1cm4gYWxsIGF2YWlsYWJsZSByZWdpc3RlcnMgaW4gdGhlIHJlZ2lzdGVyIGNsYXNzCisvLy8gaW4gTWFzay4KK3ZvaWQgUmVnU2NhdmVuZ2VyOjpnZXRSZWdzQXZhaWxhYmxlKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0VmVjdG9yICZNYXNrKSB7CisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJDbGFzczo6aXRlcmF0b3IgSSA9IFJDLT5iZWdpbigpLCBFID0gUkMtPmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmICghaXNBbGlhc1VzZWQoKkkpKQorICAgICAgTWFzay5zZXQoKkkpOworfQorCisvLy8gZmluZFN1cnZpdm9yUmVnIC0gUmV0dXJuIHRoZSBjYW5kaWRhdGUgcmVnaXN0ZXIgdGhhdCBpcyB1bnVzZWQgZm9yIHRoZQorLy8vIGxvbmdlc3QgYWZ0ZXIgU3RhcmdNSUkuIFVzZU1JIGlzIHNldCB0byB0aGUgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIHNlYXJjaAorLy8vIHN0b3BwZWQuCisvLy8KKy8vLyBObyBtb3JlIHRoYW4gSW5zdHJMaW1pdCBpbnN0cnVjdGlvbnMgYXJlIGluc3BlY3RlZC4KKy8vLwordW5zaWduZWQgUmVnU2NhdmVuZ2VyOjpmaW5kU3Vydml2b3JSZWcoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFN0YXJ0TUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJkNhbmRpZGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbnN0ckxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZVc2VNSSkgeworICBpbnQgU3Vydml2b3IgPSBDYW5kaWRhdGVzLmZpbmRfZmlyc3QoKTsKKyAgYXNzZXJ0KFN1cnZpdm9yID4gMCAmJiAiTm8gY2FuZGlkYXRlcyBmb3Igc2NhdmVuZ2luZyIpOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNRSA9IE1CQi0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCk7CisgIGFzc2VydChTdGFydE1JICE9IE1FICYmICJNSSBhbHJlYWR5IGF0IHRlcm1pbmF0b3IiKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFJlc3RvcmVQb2ludE1JID0gU3RhcnRNSTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JID0gU3RhcnRNSTsKKworICBib29sIGluVmlydExpdmVSYW5nZSA9IGZhbHNlOworICBmb3IgKCsrTUk7IEluc3RyTGltaXQgPiAwICYmIE1JICE9IE1FOyArK01JLCAtLUluc3RyTGltaXQpIHsKKyAgICBpZiAoTUktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgICArK0luc3RyTGltaXQ7IC8vIERvbid0IGNvdW50IGRlYnVnIGluc3RydWN0aW9ucworICAgICAgY29udGludWU7CisgICAgfQorICAgIGJvb2wgaXNWaXJ0S2lsbEluc24gPSBmYWxzZTsKKyAgICBib29sIGlzVmlydERlZkluc24gPSBmYWxzZTsKKyAgICAvLyBSZW1vdmUgYW55IGNhbmRpZGF0ZXMgdG91Y2hlZCBieSBpbnN0cnVjdGlvbi4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSB8fCBNTy5pc1VuZGVmKCkgfHwgIU1PLmdldFJlZygpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKE1PLmdldFJlZygpKSkgeworICAgICAgICBpZiAoTU8uaXNEZWYoKSkKKyAgICAgICAgICBpc1ZpcnREZWZJbnNuID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoTU8uaXNLaWxsKCkpCisgICAgICAgICAgaXNWaXJ0S2lsbEluc24gPSB0cnVlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENhbmRpZGF0ZXMucmVzZXQoTU8uZ2V0UmVnKCkpOworICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqUiA9IFRSSS0+Z2V0QWxpYXNTZXQoTU8uZ2V0UmVnKCkpOyAqUjsgUisrKQorICAgICAgICBDYW5kaWRhdGVzLnJlc2V0KCpSKTsKKyAgICB9CisgICAgLy8gSWYgd2UncmUgbm90IGluIGEgdmlydHVhbCByZWcncyBsaXZlIHJhbmdlLCB0aGlzIGlzIGEgdmFsaWQKKyAgICAvLyByZXN0b3JlIHBvaW50LgorICAgIGlmICghaW5WaXJ0TGl2ZVJhbmdlKSBSZXN0b3JlUG9pbnRNSSA9IE1JOworCisgICAgLy8gVXBkYXRlIHdoZXRoZXIgd2UncmUgaW4gdGhlIGxpdmUgcmFuZ2Ugb2YgYSB2aXJ0dWFsIHJlZ2lzdGVyCisgICAgaWYgKGlzVmlydEtpbGxJbnNuKSBpblZpcnRMaXZlUmFuZ2UgPSBmYWxzZTsKKyAgICBpZiAoaXNWaXJ0RGVmSW5zbikgaW5WaXJ0TGl2ZVJhbmdlID0gdHJ1ZTsKKworICAgIC8vIFdhcyBvdXIgc3Vydml2b3IgdW50b3VjaGVkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24/CisgICAgaWYgKENhbmRpZGF0ZXMudGVzdChTdXJ2aXZvcikpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEFsbCBjYW5kaWRhdGVzIGdvbmU/CisgICAgaWYgKENhbmRpZGF0ZXMubm9uZSgpKQorICAgICAgYnJlYWs7CisKKyAgICBTdXJ2aXZvciA9IENhbmRpZGF0ZXMuZmluZF9maXJzdCgpOworICB9CisgIC8vIElmIHdlIHJhbiBvZmYgdGhlIGVuZCwgdGhhdCdzIHdoZXJlIHdlIHdhbnQgdG8gcmVzdG9yZS4KKyAgaWYgKE1JID09IE1FKSBSZXN0b3JlUG9pbnRNSSA9IE1FOworICBhc3NlcnQgKFJlc3RvcmVQb2ludE1JICE9IFN0YXJ0TUkgJiYKKyAgICAgICAgICAiTm8gYXZhaWxhYmxlIHNjYXZlbmdlciByZXN0b3JlIGxvY2F0aW9uISIpOworCisgIC8vIFdlIHJhbiBvdXQgb2YgY2FuZGlkYXRlcywgc28gc3RvcCB0aGUgc2VhcmNoLgorICBVc2VNSSA9IFJlc3RvcmVQb2ludE1JOworICByZXR1cm4gU3Vydml2b3I7Cit9CisKK3Vuc2lnbmVkIFJlZ1NjYXZlbmdlcjo6c2NhdmVuZ2VSZWdpc3Rlcihjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGopIHsKKyAgLy8gTWFzayBvZmYgdGhlIHJlZ2lzdGVycyB3aGljaCBhcmUgbm90IGluIHRoZSBUYXJnZXRSZWdpc3RlckNsYXNzLgorICBCaXRWZWN0b3IgQ2FuZGlkYXRlcyhOdW1QaHlzUmVncywgZmFsc2UpOworICBDcmVhdGVSZWdDbGFzc01hc2soUkMsIENhbmRpZGF0ZXMpOworICAvLyBEbyBub3QgaW5jbHVkZSByZXNlcnZlZCByZWdpc3RlcnMuCisgIENhbmRpZGF0ZXMgXj0gUmVzZXJ2ZWRSZWdzICYgQ2FuZGlkYXRlczsKKworICAvLyBFeGNsdWRlIGFsbCB0aGUgcmVnaXN0ZXJzIGJlaW5nIHVzZWQgYnkgdGhlIGluc3RydWN0aW9uLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJLT5nZXRPcGVyYW5kKGkpOworICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmdldFJlZygpICE9IDAgJiYKKyAgICAgICAgIVRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoTU8uZ2V0UmVnKCkpKQorICAgICAgQ2FuZGlkYXRlcy5yZXNldChNTy5nZXRSZWcoKSk7CisgIH0KKworICAvLyBUcnkgdG8gZmluZCBhIHJlZ2lzdGVyIHRoYXQncyB1bnVzZWQgaWYgdGhlcmUgaXMgb25lLCBhcyB0aGVuIHdlIHdvbid0CisgIC8vIGhhdmUgdG8gc3BpbGwuCisgIGlmICgoQ2FuZGlkYXRlcyAmIFJlZ3NBdmFpbGFibGUpLmFueSgpKQorICAgICBDYW5kaWRhdGVzICY9IFJlZ3NBdmFpbGFibGU7CisKKyAgLy8gRmluZCB0aGUgcmVnaXN0ZXIgd2hvc2UgdXNlIGlzIGZ1cnRoZXN0IGF3YXkuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBVc2VNSTsKKyAgdW5zaWduZWQgU1JlZyA9IGZpbmRTdXJ2aXZvclJlZyhJLCBDYW5kaWRhdGVzLCAyNSwgVXNlTUkpOworCisgIC8vIElmIHdlIGZvdW5kIGFuIHVudXNlZCByZWdpc3RlciB0aGVyZSBpcyBubyByZWFzb24gdG8gc3BpbGwgaXQuCisgIGlmICghaXNBbGlhc1VzZWQoU1JlZykpCisgICAgcmV0dXJuIFNSZWc7CisKKyAgYXNzZXJ0KFNjYXZlbmdlZFJlZyA9PSAwICYmCisgICAgICAgICAiU2NhdmVuZ2VyIHNsb3QgaXMgbGl2ZSwgdW5hYmxlIHRvIHNjYXZlbmdlIGFub3RoZXIgcmVnaXN0ZXIhIik7CisKKyAgLy8gQXZvaWQgaW5maW5pdGUgcmVncmVzcworICBTY2F2ZW5nZWRSZWcgPSBTUmVnOworCisgIC8vIElmIHRoZSB0YXJnZXQga25vd3MgaG93IHRvIHNhdmUvcmVzdG9yZSB0aGUgcmVnaXN0ZXIsIGxldCBpdCBkbyBzbzsKKyAgLy8gb3RoZXJ3aXNlLCB1c2UgdGhlIGVtZXJnZW5jeSBzdGFjayBzcGlsbCBzbG90LgorICBpZiAoIVRSSS0+c2F2ZVNjYXZlbmdlclJlZ2lzdGVyKCpNQkIsIEksIFVzZU1JLCBSQywgU1JlZykpIHsKKyAgICAvLyBTcGlsbCB0aGUgc2NhdmVuZ2VkIHJlZ2lzdGVyIGJlZm9yZSBJLgorICAgIGFzc2VydChTY2F2ZW5naW5nRnJhbWVJbmRleCA+PSAwICYmCisgICAgICAgICAgICJDYW5ub3Qgc2NhdmVuZ2UgcmVnaXN0ZXIgd2l0aG91dCBhbiBlbWVyZ2VuY3kgc3BpbGwgc2xvdCEiKTsKKyAgICBUSUktPnN0b3JlUmVnVG9TdGFja1Nsb3QoKk1CQiwgSSwgU1JlZywgdHJ1ZSwgU2NhdmVuZ2luZ0ZyYW1lSW5kZXgsIFJDLFRSSSk7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gcHJpb3IoSSk7CisgICAgVFJJLT5lbGltaW5hdGVGcmFtZUluZGV4KElJLCBTUEFkaiwgTlVMTCwgdGhpcyk7CisKKyAgICAvLyBSZXN0b3JlIHRoZSBzY2F2ZW5nZWQgcmVnaXN0ZXIgYmVmb3JlIGl0cyB1c2UgKG9yIGZpcnN0IHRlcm1pbmF0b3IpLgorICAgIFRJSS0+bG9hZFJlZ0Zyb21TdGFja1Nsb3QoKk1CQiwgVXNlTUksIFNSZWcsIFNjYXZlbmdpbmdGcmFtZUluZGV4LCBSQywgVFJJKTsKKyAgICBJSSA9IHByaW9yKFVzZU1JKTsKKyAgICBUUkktPmVsaW1pbmF0ZUZyYW1lSW5kZXgoSUksIFNQQWRqLCBOVUxMLCB0aGlzKTsKKyAgfQorCisgIFNjYXZlbmdlUmVzdG9yZSA9IHByaW9yKFVzZU1JKTsKKworICAvLyBEb2luZyB0aGlzIGhlcmUgbGVhZHMgdG8gaW5maW5pdGUgcmVncmVzcy4KKyAgLy8gU2NhdmVuZ2VkUmVnID0gU1JlZzsKKyAgU2NhdmVuZ2VkUkMgPSBSQzsKKworICByZXR1cm4gU1JlZzsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1JlbmRlck1hY2hpbmVGdW5jdGlvbi5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vUmVuZGVyTWFjaGluZUZ1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhNjEzYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1JlbmRlck1hY2hpbmVGdW5jdGlvbi5oCkBAIC0wLDAgKzEsMzE0IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9SZW5kZXJNYWNoaW5lRnVuY3Rpb24uaCAtIE1GLT5IVE1MIC0qLSBDKysgLSotLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1JFTkRFUk1BQ0hJTkVGVU5DVElPTl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9SRU5ERVJNQUNISU5FRlVOQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Nsb3RJbmRleGVzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBMaXZlSW50ZXJ2YWw7CisgIGNsYXNzIExpdmVJbnRlcnZhbHM7CisgIGNsYXNzIE1hY2hpbmVJbnN0cjsKKyAgY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKKyAgY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKKyAgY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworICBjbGFzcyBWaXJ0UmVnTWFwOworICBjbGFzcyByYXdfb3N0cmVhbTsKKworICAvLy8gXGJyaWVmIFByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBoeXNpY2FsIGFuZCB2aXJ0dWFsIHJlZ2lzdGVycworICAvLy8gICAgICAgIGluIHRoZSBmdW5jdGlvbiBiZWluZyBjb21waWxlZC4KKyAgY2xhc3MgVGFyZ2V0UmVnaXN0ZXJFeHRyYUluZm8geworICBwdWJsaWM6CisgICAgVGFyZ2V0UmVnaXN0ZXJFeHRyYUluZm8oKTsKKworICAgIC8vLyBcYnJpZWYgU2V0IHVwIFRhcmdldFJlZ2lzdGVyRXh0cmFJbmZvIHdpdGggcG9pbnRlcnMgdG8gbmVjZXNzYXJ5CisgICAgLy8vICAgICAgICBzb3VyY2VzIG9mIGluZm9ybWF0aW9uLgorICAgIHZvaWQgc2V0dXAoTWFjaGluZUZ1bmN0aW9uICptZiwgTWFjaGluZVJlZ2lzdGVySW5mbyAqbXJpLAorICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICp0cmksIExpdmVJbnRlcnZhbHMgKmxpcyk7CisKKyAgICAvLy8gXGJyaWVmIFJlY29tcHV0ZSB0YWJsZXMgZm9yIGNoYW5nZWQgZnVuY3Rpb24uCisgICAgdm9pZCByZXNldCgpOyAKKworICAgIC8vLyBcYnJpZWYgRnJlZSBhbGwgdGFibGVzIGluIFRhcmdldFJlZ2lzdGVyRXh0cmFJbmZvLgorICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8vLyBcYnJpZWYgTWF4aW11bSBudW1iZXIgb2YgcmVnaXN0ZXJzIGZyb20gdHJjIHdoaWNoIGFsaWFzIHJlZy4KKyAgICB1bnNpZ25lZCBnZXRXb3JzdCh1bnNpZ25lZCByZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKnRyYykgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBhbGxvY2FibGUgcmVnaXN0ZXJzIGluIHRyYy4KKyAgICB1bnNpZ25lZCBnZXRDYXBhY2l0eShjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICp0cmMpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcnMgb2YgY2xhc3MgdHJjIHRoYXQgbWF5IGJlCisgICAgLy8vICAgICAgICBuZWVkZWQgYXQgc2xvdCBpLgorICAgIHVuc2lnbmVkIGdldFByZXNzdXJlQXRTbG90KGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKnRyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggaSkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIG9mIHR5cGUgdHJjIHRoYXQgbWF5IGJlCisgICAgLy8vICAgICAgICBuZWVkZWQgYXQgc2xvdCBpIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY2FwYWNpdHkgb2YgdHJjLgorICAgIGJvb2wgY2xhc3NPdmVyQ2FwYWNpdHlBdFNsb3QoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqdHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IGkpIGNvbnN0OworCisgIHByaXZhdGU6CisKKyAgICBNYWNoaW5lRnVuY3Rpb24gKm1mOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gKm1yaTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKnRyaTsKKyAgICBMaXZlSW50ZXJ2YWxzICpsaXM7CisKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqLCB1bnNpZ25lZD4gV29yc3RNYXBMaW5lOworICAgIHR5cGVkZWYgc3RkOjptYXA8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyosIFdvcnN0TWFwTGluZT4gVlJXb3JzdE1hcDsKKyAgICBWUldvcnN0TWFwIHZyV29yc3Q7CisKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHVuc2lnbmVkLCBXb3JzdE1hcExpbmU+IFBSV29yc3RNYXA7CisgICAgUFJXb3JzdE1hcCBwcldvcnN0OworCisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiwgdW5zaWduZWQ+IENhcGFjaXR5TWFwOworICAgIENhcGFjaXR5TWFwIGNhcGFjaXR5TWFwOworCisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiwgdW5zaWduZWQ+IFByZXNzdXJlTWFwTGluZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPFNsb3RJbmRleCwgUHJlc3N1cmVNYXBMaW5lPiBQcmVzc3VyZU1hcDsKKyAgICBQcmVzc3VyZU1hcCBwcmVzc3VyZU1hcDsKKworICAgIGJvb2wgbWFwc1BvcHVsYXRlZDsKKworICAgIC8vLyBcYnJpZWYgSW5pdGlhbGlzZSB0aGUgJ3dvcnN0JyB0YWJsZS4KKyAgICB2b2lkIGluaXRXb3JzdCgpOworIAorICAgIC8vLyBcYnJpZWYgSW5pdGlhbGlzZSB0aGUgJ2NhcGFjaXR5JyB0YWJsZS4KKyAgICB2b2lkIGluaXRDYXBhY2l0eSgpOworCisgICAgLy8vIFxicmllZiBJbml0aWFsaXNlL1Jlc2V0IHRoZSAncHJlc3N1cmUnIGFuZCBsaXZlIHN0YXRlcyB0YWJsZXMuCisgICAgdm9pZCByZXNldFByZXNzdXJlQW5kTGl2ZVN0YXRlcygpOworICB9OworCisgIC8vLyBcYnJpZWYgSGVscGVyIGNsYXNzIHRvIHByb2Nlc3MgcmVuZGVyaW5nIG9wdGlvbnMuIFRyaWVzIHRvIGJlIGFzIGxhenkgYXMKKyAgLy8vICAgICAgICBwb3NzaWJsZS4KKyAgY2xhc3MgTUZSZW5kZXJpbmdPcHRpb25zIHsKKyAgcHVibGljOgorCisgICAgc3RydWN0IFJlZ0NsYXNzQ29tcCB7CisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqdHJjMSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICp0cmMyKSBjb25zdCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRyYzFOYW1lKHRyYzEtPmdldE5hbWUoKSksIHRyYzJOYW1lKHRyYzItPmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKHRyYzFOYW1lLmJlZ2luKCksIHRyYzFOYW1lLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmMyTmFtZS5iZWdpbigpLCB0cmMyTmFtZS5lbmQoKSk7CisgICAgICB9CisgICAgfTsKKworICAgIHR5cGVkZWYgc3RkOjpzZXQ8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyosIFJlZ0NsYXNzQ29tcD4gUmVnQ2xhc3NTZXQ7CisKKyAgICBzdHJ1Y3QgSW50ZXJ2YWxDb21wIHsKKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBMaXZlSW50ZXJ2YWwgKmxpMSwgY29uc3QgTGl2ZUludGVydmFsICpsaTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxpMS0+cmVnIDwgbGkyLT5yZWc7CisgICAgICB9CisgICAgfTsKKworICAgIHR5cGVkZWYgc3RkOjpzZXQ8Y29uc3QgTGl2ZUludGVydmFsKiwgSW50ZXJ2YWxDb21wPiBJbnRlcnZhbFNldDsKKworICAgIC8vLyBJbml0aWFsaXNlIHRoZSByZW5kZXJpbmcgb3B0aW9ucy4KKyAgICB2b2lkIHNldHVwKE1hY2hpbmVGdW5jdGlvbiAqbWYsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqdHJpLAorICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyAqbGlzKTsKKworICAgIC8vLyBDbGVhciB0cmFuc2xhdGlvbnMgb2Ygb3B0aW9ucyB0byB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvLy8gUmVzZXQgYW55IG9wdGlvbnMgY29tcHV0ZWQgZm9yIHRoaXMgc3BlY2lmaWMgcmVuZGVyaW5nLgorICAgIHZvaWQgcmVzZXRSZW5kZXJTcGVjaWZpY09wdGlvbnMoKTsKKworICAgIC8vLyBTaG91bGQgd2UgcmVuZGVyIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAgIGJvb2wgc2hvdWxkUmVuZGVyQ3VycmVudE1hY2hpbmVGdW5jdGlvbigpIGNvbnN0OworCisgICAgLy8vIFJldHVybiB0aGUgc2V0IG9mIHJlZ2lzdGVyIGNsYXNzZXMgdG8gcmVuZGVyIHByZXNzdXJlIGZvci4KKyAgICBjb25zdCBSZWdDbGFzc1NldCYgcmVnQ2xhc3NlcygpIGNvbnN0OworCisgICAgLy8vIFJldHVybiB0aGUgc2V0IG9mIGxpdmUgaW50ZXJ2YWxzIHRvIHJlbmRlciBsaXZlbmVzcyBmb3IuCisgICAgY29uc3QgSW50ZXJ2YWxTZXQmIGludGVydmFscygpIGNvbnN0OworCisgICAgLy8vIFJlbmRlciBpbmRleGVzIHdoaWNoIGFyZSBub3QgYXNzb2NpYXRlZCB3aXRoIGluc3RydWN0aW9ucyAvIE1CQiBzdGFydHMuCisgICAgYm9vbCByZW5kZXJFbXB0eUluZGV4ZXMoKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gd2hldGhlciBvciBub3QgdG8gcmVuZGVyIHVzaW5nIFNWRyBmb3IgZmFuY3kgdmVydGljYWwgdGV4dC4KKyAgICBib29sIGZhbmN5VmVydGljYWxzKCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKworICAgIHN0YXRpYyBib29sIHJlbmRlcmluZ09wdGlvbnNQcm9jZXNzZWQ7CisgICAgc3RhdGljIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtZk5hbWVzVG9SZW5kZXI7CisgICAgc3RhdGljIGJvb2wgcmVuZGVyQWxsTUZzOworCisgICAgc3RhdGljIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjbGFzc05hbWVzVG9SZW5kZXI7CisgICAgc3RhdGljIGJvb2wgcmVuZGVyQWxsQ2xhc3NlczsKKworCisgICAgc3RhdGljIHN0ZDo6c2V0PHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+ID4gaW50ZXJ2YWxOdW1zVG9SZW5kZXI7CisgICAgdHlwZWRlZiBlbnVtIHsgRXhwbGljaXRPbmx5ICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgVmlydFBsdXNFeHBsaWNpdCA9IDEsCisgICAgICAgICAgICAgICAgICAgUGh5c1BsdXNFeHBsaWNpdCA9IDIsCisgICAgICAgICAgICAgICAgICAgQWxsICAgICAgICAgICAgICA9IDMgfQorICAgICAgSW50ZXJ2YWxUeXBlc1RvUmVuZGVyOworICAgIHN0YXRpYyB1bnNpZ25lZCBpbnRlcnZhbFR5cGVzVG9SZW5kZXI7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0cHV0SXRyPgorICAgIHN0YXRpYyB2b2lkIHNwbGl0Q29tYVNlcGVyYXRlZExpc3QoY29uc3Qgc3RkOjpzdHJpbmcgJnMsIE91dHB1dEl0ciBvdXRJdHIpOworCisgICAgc3RhdGljIHZvaWQgcHJvY2Vzc09wdGlvbnMoKTsKKworICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NGdW5jTmFtZXMoKTsKKyAgICBzdGF0aWMgdm9pZCBwcm9jZXNzUmVnQ2xhc3NOYW1lcygpOworICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NJbnRlcnZhbE51bWJlcnMoKTsKKworICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NJbnRlcnZhbFJhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nICZpbnRlcnZhbFJhbmdlU3RyKTsKKworICAgIE1hY2hpbmVGdW5jdGlvbiAqbWY7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICp0cmk7CisgICAgTGl2ZUludGVydmFscyAqbGlzOworCisgICAgbXV0YWJsZSBib29sIHJlZ0NsYXNzZXNUcmFuc2xhdGVkVG9DdXJyZW50RnVuY3Rpb247CisgICAgbXV0YWJsZSBSZWdDbGFzc1NldCByZWdDbGFzc1NldDsKKworICAgIG11dGFibGUgYm9vbCBpbnRlcnZhbHNUcmFuc2xhdGVkVG9DdXJyZW50RnVuY3Rpb247CisgICAgbXV0YWJsZSBJbnRlcnZhbFNldCBpbnRlcnZhbFNldDsKKworICAgIHZvaWQgdHJhbnNsYXRlUmVnQ2xhc3NOYW1lc1RvQ3VycmVudEZ1bmN0aW9uKCkgY29uc3Q7CisKKyAgICB2b2lkIHRyYW5zbGF0ZUludGVydmFsTnVtYmVyc1RvQ3VycmVudEZ1bmN0aW9uKCkgY29uc3Q7CisgIH07CisKKyAgLy8vIFxicmllZiBSZW5kZXIgTWFjaGluZUZ1bmN0aW9uIG9iamVjdHMgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gYSBIVE1MCisgIC8vLyAgICAgICAgcGFnZS4KKyAgY2xhc3MgUmVuZGVyTWFjaGluZUZ1bmN0aW9uIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisKKyAgICBSZW5kZXJNYWNoaW5lRnVuY3Rpb24oKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZhdSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZmbik7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworCisgICAgLy8vIFxicmllZiBSZW5kZXIgdGhpcyBtYWNoaW5lIGZ1bmN0aW9uIHRvIEhUTUwuCisgICAgLy8vIAorICAgIC8vLyBAcGFyYW0gcmVuZGVyQ29udGV4dFN0ciBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB0b3Agb2YKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGh0bWwgZmlsZSB0byBleHBsYWluIHdoZXJlIChpbiB0aGUKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29kZWdlbiBwaXBlbGluZSkgdGhpcyBmdW5jdGlvbiB3YXMgcmVuZGVyZWQKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgZnJvbS4gU2V0IGl0IHRvIHNvbWV0aGluZyBsaWtlCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICJQcmUtcmVnaXN0ZXItYWxsb2NhdGlvbiIuCisgICAgLy8vIEBwYXJhbSB2cm0gICAgICAgICAgICAgIElmIG5vbi1udWxsIHRoZSBWUk0gd2lsbCBiZSBxdWVyaWVkIHRvIGRldGVybWluZQorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIGEgdmlydHVhbCByZWdpc3RlciB3YXMgYWxsb2NhdGVkIHRvIGEKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWwgcmVnaXN0ZXIgb3Igc3BpbGxlZC4KKyAgICAvLy8gQHBhcmFtIHJlbmRlckZpbGVQcmVmaXggVGhpcyBzdHJpbmcgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZnVuY3Rpb24KKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAoYmVmb3JlIHRoZSBvdXRwdXQgZmlsZSBzdWZmaXgpIHRvIGVuYWJsZQorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSByZW5kZXJpbmdzIGZyb20gdGhlIHNhbWUgZnVuY3Rpb24uCisgICAgdm9pZCByZW5kZXJNYWNoaW5lRnVuY3Rpb24oY29uc3QgY2hhciAqcmVuZGVyQ29udGV4dFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWaXJ0UmVnTWFwICp2cm0gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbmRlclN1ZmZpeCA9IDApOworCisgIHByaXZhdGU6CisgICAgY2xhc3MgU3BhY2VyOworCisgICAgZnJpZW5kIHJhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZvcywgY29uc3QgU3BhY2VyICZzKTsKKworCisgICAgc3RkOjpzdHJpbmcgZnFuOworCisgICAgTWFjaGluZUZ1bmN0aW9uICptZjsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICptcmk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICp0cmk7CisgICAgTGl2ZUludGVydmFscyAqbGlzOworICAgIFNsb3RJbmRleGVzICpzaXM7CisgICAgY29uc3QgVmlydFJlZ01hcCAqdnJtOworCisgICAgVGFyZ2V0UmVnaXN0ZXJFeHRyYUluZm8gdHJlaTsKKyAgICBNRlJlbmRlcmluZ09wdGlvbnMgcm87CisKKyAgICAvLyBVdGlsaXRpZXMuCisgICAgdHlwZWRlZiBlbnVtIHsgRGVhZCwgRGVmaW5lZCwgVXNlZCwgQWxpdmVSZWcsIEFsaXZlU3RhY2sgfSBMaXZlU3RhdGU7CisgICAgTGl2ZVN0YXRlIGdldExpdmVTdGF0ZUF0KGNvbnN0IExpdmVJbnRlcnZhbCAqbGksIFNsb3RJbmRleCBpKSBjb25zdDsKKworICAgIHR5cGVkZWYgZW51bSB7IFplcm8sIExvdywgSGlnaCB9IFByZXNzdXJlU3RhdGU7CisgICAgUHJlc3N1cmVTdGF0ZSBnZXRQcmVzc3VyZVN0YXRlQXQoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqdHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RJbmRleCBpKSBjb25zdDsKKworICAgIC8vIC0tLS0tLS0tLS0gUmVuZGVyaW5nIG1ldGhvZHMgLS0tLS0tLS0tLQorCisgICAgLy8vIEZvciBpbnNlcnRpbmcgc3BhY2VzIHdoZW4gcHJldHR5IHByaW50aW5nLgorICAgIGNsYXNzIFNwYWNlciB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgU3BhY2VyKHVuc2lnbmVkIG51bVNwYWNlcykgOiBucyhudW1TcGFjZXMpIHt9CisgICAgICBTcGFjZXIgb3BlcmF0b3IrKGNvbnN0IFNwYWNlciAmbykgY29uc3QgeyByZXR1cm4gU3BhY2VyKG5zICsgby5ucyk7IH0KKyAgICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgICBwcml2YXRlOgorICAgICAgdW5zaWduZWQgbnM7CisgICAgfTsKKworICAgIFNwYWNlciBzKHVuc2lnbmVkIG5zKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KKyAgICBzdGQ6OnN0cmluZyBlc2NhcGVDaGFycyhJdGVyYXRvciBzQmVnaW4sIEl0ZXJhdG9yIHNFbmQpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBSZW5kZXIgYSBtYWNoaW5lIGluc3RydWN0aW9uLgorICAgIHZvaWQgcmVuZGVyTWFjaGluZUluc3RyKHJhd19vc3RyZWFtICZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgKm1pKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgUmVuZGVyIHZlcnRpY2FsIHRleHQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCByZW5kZXJWZXJ0aWNhbChjb25zdCBTcGFjZXIgJmluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQgJnQpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBJbnNlcnQgQ1NTIGxheW91dCBpbmZvLgorICAgIHZvaWQgaW5zZXJ0Q1NTKGNvbnN0IFNwYWNlciAmaW5kZW50LAorICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIFJlbmRlciBhIGJyaWVmIHN1bW1hcnkgb2YgdGhlIGZ1bmN0aW9uIChpbmNsdWRpbmcgcmVuZGVyaW5nCisgICAgLy8vICAgICAgICBjb250ZXh0KS4KKyAgICB2b2lkIHJlbmRlckZ1bmN0aW9uU3VtbWFyeShjb25zdCBTcGFjZXIgJmluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHJlbmRlckNvbnRleHRTdHIpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBSZW5kZXIgYSBsZWdlbmQgZm9yIHRoZSBwcmVzc3VyZSB0YWJsZS4KKyAgICB2b2lkIHJlbmRlclByZXNzdXJlVGFibGVMZWdlbmQoY29uc3QgU3BhY2VyICZpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIFJlbmRlciBhIGNvbnNlY3V0aXZlIHNldCBvZiBIVE1MIGNlbGxzIG9mIHRoZSBzYW1lIGNsYXNzIHVzaW5nCisgICAgLy8vIHRoZSBjb2xzcGFuIGF0dHJpYnV0ZSBmb3IgcnVuLWxlbmd0aCBlbmNvZGluZy4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2VsbFR5cGU+CisgICAgdm9pZCByZW5kZXJDZWxsc1dpdGhSTEUoCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcGFjZXIgJmluZGVudCwgcmF3X29zdHJlYW0gJm9zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPENlbGxUeXBlLCB1bnNpZ25lZD4gJnJsZUFjY3VtdWxhdG9yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8Q2VsbFR5cGUsIHN0ZDo6c3RyaW5nPiAmY2VsbFR5cGVTdHJzKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgUmVuZGVyIGNvZGUgbGlzdGluZywgcG90ZW50aWFsbHkgd2l0aCByZWdpc3RlciBwcmVzc3VyZQorICAgIC8vLyAgICAgICAgYW5kIGxpdmUgaW50ZXJ2YWxzIHNob3duIGFsb25nc2lkZS4KKyAgICB2b2lkIHJlbmRlckNvZGVUYWJsZVBsdXNQSShjb25zdCBTcGFjZXIgJmluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBSZW5kZXIgdGhlIEhUTUwgcGFnZSByZXByZXNlbnRpbmcgdGhlIE1hY2hpbmVGdW5jdGlvbi4KKyAgICB2b2lkIHJlbmRlckZ1bmN0aW9uUGFnZShyYXdfb3N0cmVhbSAmb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHJlbmRlckNvbnRleHRTdHIpIGNvbnN0OworCisgICAgc3RkOjpzdHJpbmcgZXNjYXBlQ2hhcnMoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIGNvbnN0OworICB9OworfQorCisjZW5kaWYgLyogTExWTV9DT0RFR0VOX1JFTkRFUk1BQ0hJTkVGVU5DVElPTl9IICovCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TY2hlZHVsZURBRy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TY2hlZHVsZURBRy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QzOWRjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NjaGVkdWxlREFHLmNwcApAQCAtMCwwICsxLDU4NiBAQAorLy89PT0tLS0tIFNjaGVkdWxlREFHLmNwcCAtIEltcGxlbWVudCB0aGUgU2NoZWR1bGVEQUcgY2xhc3MgLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGltcGxlbWVudHMgdGhlIFNjaGVkdWxlREFHIGNsYXNzLCB3aGljaCBpcyBhIGJhc2UgY2xhc3MgdXNlZCBieQorLy8gc2NoZWR1bGluZyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicHJlLVJBLXNjaGVkIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZURBRy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2xpbWl0cz4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTY2hlZHVsZURBRzo6U2NoZWR1bGVEQUcoTWFjaGluZUZ1bmN0aW9uICZtZikKKyAgOiBUTShtZi5nZXRUYXJnZXQoKSksCisgICAgVElJKFRNLmdldEluc3RySW5mbygpKSwKKyAgICBUUkkoVE0uZ2V0UmVnaXN0ZXJJbmZvKCkpLAorICAgIE1GKG1mKSwgTVJJKG1mLmdldFJlZ0luZm8oKSksCisgICAgRW50cnlTVSgpLCBFeGl0U1UoKSB7Cit9CisKK1NjaGVkdWxlREFHOjp+U2NoZWR1bGVEQUcoKSB7fQorCisvLy8gZHVtcCAtIGR1bXAgdGhlIHNjaGVkdWxlLgordm9pZCBTY2hlZHVsZURBRzo6ZHVtcFNjaGVkdWxlKCkgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU2VxdWVuY2Uuc2l6ZSgpOyBpICE9IGU7IGkrKykgeworICAgIGlmIChTVW5pdCAqU1UgPSBTZXF1ZW5jZVtpXSkKKyAgICAgIFNVLT5kdW1wKHRoaXMpOworICAgIGVsc2UKKyAgICAgIGRiZ3MoKSA8PCAiKioqKiBOT09QICoqKipcbiI7CisgIH0KK30KKworCisvLy8gUnVuIC0gcGVyZm9ybSBzY2hlZHVsaW5nLgorLy8vCit2b2lkIFNjaGVkdWxlREFHOjpSdW4oTWFjaGluZUJhc2ljQmxvY2sgKmJiLAorICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBpbnNlcnRQb3MpIHsKKyAgQkIgPSBiYjsKKyAgSW5zZXJ0UG9zID0gaW5zZXJ0UG9zOworCisgIFNVbml0cy5jbGVhcigpOworICBTZXF1ZW5jZS5jbGVhcigpOworICBFbnRyeVNVID0gU1VuaXQoKTsKKyAgRXhpdFNVID0gU1VuaXQoKTsKKworICBTY2hlZHVsZSgpOworCisgIERFQlVHKHsKKyAgICAgIGRiZ3MoKSA8PCAiKioqIEZpbmFsIHNjaGVkdWxlICoqKlxuIjsKKyAgICAgIGR1bXBTY2hlZHVsZSgpOworICAgICAgZGJncygpIDw8ICdcbic7CisgICAgfSk7Cit9CisKKy8vLyBhZGRQcmVkIC0gVGhpcyBhZGRzIHRoZSBzcGVjaWZpZWQgZWRnZSBhcyBhIHByZWQgb2YgdGhlIGN1cnJlbnQgbm9kZSBpZgorLy8vIG5vdCBhbHJlYWR5LiAgSXQgYWxzbyBhZGRzIHRoZSBjdXJyZW50IG5vZGUgYXMgYSBzdWNjZXNzb3Igb2YgdGhlCisvLy8gc3BlY2lmaWVkIG5vZGUuCit2b2lkIFNVbml0OjphZGRQcmVkKGNvbnN0IFNEZXAgJkQpIHsKKyAgLy8gSWYgdGhpcyBub2RlIGFscmVhZHkgaGFzIHRoaXMgZGVwZW5lbmNlLCBkb24ndCBhZGQgYSByZWR1bmRhbnQgb25lLgorICBmb3IgKFNtYWxsVmVjdG9yPFNEZXAsIDQ+Ojpjb25zdF9pdGVyYXRvciBJID0gUHJlZHMuYmVnaW4oKSwgRSA9IFByZWRzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmICgqSSA9PSBEKQorICAgICAgcmV0dXJuOworICAvLyBOb3cgYWRkIGEgY29ycmVzcG9uZGluZyBzdWNjIHRvIE4uCisgIFNEZXAgUCA9IEQ7CisgIFAuc2V0U1VuaXQodGhpcyk7CisgIFNVbml0ICpOID0gRC5nZXRTVW5pdCgpOworICAvLyBVcGRhdGUgdGhlIGJvb2trZWVwaW5nLgorICBpZiAoRC5nZXRLaW5kKCkgPT0gU0RlcDo6RGF0YSkgeworICAgIGFzc2VydChOdW1QcmVkcyA8IFVJTlRfTUFYICYmICJOdW1QcmVkcyB3aWxsIG92ZXJmbG93ISIpOworICAgIGFzc2VydChOLT5OdW1TdWNjcyA8IFVJTlRfTUFYICYmICJOdW1TdWNjcyB3aWxsIG92ZXJmbG93ISIpOworICAgICsrTnVtUHJlZHM7CisgICAgKytOLT5OdW1TdWNjczsKKyAgfQorICBpZiAoIU4tPmlzU2NoZWR1bGVkKSB7CisgICAgYXNzZXJ0KE51bVByZWRzTGVmdCA8IFVJTlRfTUFYICYmICJOdW1QcmVkc0xlZnQgd2lsbCBvdmVyZmxvdyEiKTsKKyAgICArK051bVByZWRzTGVmdDsKKyAgfQorICBpZiAoIWlzU2NoZWR1bGVkKSB7CisgICAgYXNzZXJ0KE4tPk51bVN1Y2NzTGVmdCA8IFVJTlRfTUFYICYmICJOdW1TdWNjc0xlZnQgd2lsbCBvdmVyZmxvdyEiKTsKKyAgICArK04tPk51bVN1Y2NzTGVmdDsKKyAgfQorICBQcmVkcy5wdXNoX2JhY2soRCk7CisgIE4tPlN1Y2NzLnB1c2hfYmFjayhQKTsKKyAgaWYgKFAuZ2V0TGF0ZW5jeSgpICE9IDApIHsKKyAgICB0aGlzLT5zZXREZXB0aERpcnR5KCk7CisgICAgTi0+c2V0SGVpZ2h0RGlydHkoKTsKKyAgfQorfQorCisvLy8gcmVtb3ZlUHJlZCAtIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGVkZ2UgYXMgYSBwcmVkIG9mIHRoZSBjdXJyZW50CisvLy8gbm9kZSBpZiBpdCBleGlzdHMuICBJdCBhbHNvIHJlbW92ZXMgdGhlIGN1cnJlbnQgbm9kZSBhcyBhIHN1Y2Nlc3NvciBvZgorLy8vIHRoZSBzcGVjaWZpZWQgbm9kZS4KK3ZvaWQgU1VuaXQ6OnJlbW92ZVByZWQoY29uc3QgU0RlcCAmRCkgeworICAvLyBGaW5kIHRoZSBtYXRjaGluZyBwcmVkZWNlc3Nvci4KKyAgZm9yIChTbWFsbFZlY3RvcjxTRGVwLCA0Pjo6aXRlcmF0b3IgSSA9IFByZWRzLmJlZ2luKCksIEUgPSBQcmVkcy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBpZiAoKkkgPT0gRCkgeworICAgICAgYm9vbCBGb3VuZFN1Y2MgPSBmYWxzZTsKKyAgICAgIC8vIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgc3VjY2Vzc29yIGluIE4uCisgICAgICBTRGVwIFAgPSBEOworICAgICAgUC5zZXRTVW5pdCh0aGlzKTsKKyAgICAgIFNVbml0ICpOID0gRC5nZXRTVW5pdCgpOworICAgICAgZm9yIChTbWFsbFZlY3RvcjxTRGVwLCA0Pjo6aXRlcmF0b3IgSUkgPSBOLT5TdWNjcy5iZWdpbigpLAorICAgICAgICAgICAgIEVFID0gTi0+U3VjY3MuZW5kKCk7IElJICE9IEVFOyArK0lJKQorICAgICAgICBpZiAoKklJID09IFApIHsKKyAgICAgICAgICBGb3VuZFN1Y2MgPSB0cnVlOworICAgICAgICAgIE4tPlN1Y2NzLmVyYXNlKElJKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgYXNzZXJ0KEZvdW5kU3VjYyAmJiAiTWlzbWF0Y2hpbmcgcHJlZHMgLyBzdWNjcyBsaXN0cyEiKTsKKyAgICAgIFByZWRzLmVyYXNlKEkpOworICAgICAgLy8gVXBkYXRlIHRoZSBib29ra2VlcGluZy4KKyAgICAgIGlmIChQLmdldEtpbmQoKSA9PSBTRGVwOjpEYXRhKSB7CisgICAgICAgIGFzc2VydChOdW1QcmVkcyA+IDAgJiYgIk51bVByZWRzIHdpbGwgdW5kZXJmbG93ISIpOworICAgICAgICBhc3NlcnQoTi0+TnVtU3VjY3MgPiAwICYmICJOdW1TdWNjcyB3aWxsIHVuZGVyZmxvdyEiKTsKKyAgICAgICAgLS1OdW1QcmVkczsKKyAgICAgICAgLS1OLT5OdW1TdWNjczsKKyAgICAgIH0KKyAgICAgIGlmICghTi0+aXNTY2hlZHVsZWQpIHsKKyAgICAgICAgYXNzZXJ0KE51bVByZWRzTGVmdCA+IDAgJiYgIk51bVByZWRzTGVmdCB3aWxsIHVuZGVyZmxvdyEiKTsKKyAgICAgICAgLS1OdW1QcmVkc0xlZnQ7CisgICAgICB9CisgICAgICBpZiAoIWlzU2NoZWR1bGVkKSB7CisgICAgICAgIGFzc2VydChOLT5OdW1TdWNjc0xlZnQgPiAwICYmICJOdW1TdWNjc0xlZnQgd2lsbCB1bmRlcmZsb3chIik7CisgICAgICAgIC0tTi0+TnVtU3VjY3NMZWZ0OworICAgICAgfQorICAgICAgaWYgKFAuZ2V0TGF0ZW5jeSgpICE9IDApIHsKKyAgICAgICAgdGhpcy0+c2V0RGVwdGhEaXJ0eSgpOworICAgICAgICBOLT5zZXRIZWlnaHREaXJ0eSgpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KK30KKwordm9pZCBTVW5pdDo6c2V0RGVwdGhEaXJ0eSgpIHsKKyAgaWYgKCFpc0RlcHRoQ3VycmVudCkgcmV0dXJuOworICBTbWFsbFZlY3RvcjxTVW5pdCosIDg+IFdvcmtMaXN0OworICBXb3JrTGlzdC5wdXNoX2JhY2sodGhpcyk7CisgIGRvIHsKKyAgICBTVW5pdCAqU1UgPSBXb3JrTGlzdC5wb3BfYmFja192YWwoKTsKKyAgICBTVS0+aXNEZXB0aEN1cnJlbnQgPSBmYWxzZTsKKyAgICBmb3IgKFNVbml0Ojpjb25zdF9zdWNjX2l0ZXJhdG9yIEkgPSBTVS0+U3VjY3MuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBTVS0+U3VjY3MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBTVW5pdCAqU3VjY1NVID0gSS0+Z2V0U1VuaXQoKTsKKyAgICAgIGlmIChTdWNjU1UtPmlzRGVwdGhDdXJyZW50KQorICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soU3VjY1NVKTsKKyAgICB9CisgIH0gd2hpbGUgKCFXb3JrTGlzdC5lbXB0eSgpKTsKK30KKwordm9pZCBTVW5pdDo6c2V0SGVpZ2h0RGlydHkoKSB7CisgIGlmICghaXNIZWlnaHRDdXJyZW50KSByZXR1cm47CisgIFNtYWxsVmVjdG9yPFNVbml0KiwgOD4gV29ya0xpc3Q7CisgIFdvcmtMaXN0LnB1c2hfYmFjayh0aGlzKTsKKyAgZG8geworICAgIFNVbml0ICpTVSA9IFdvcmtMaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgIFNVLT5pc0hlaWdodEN1cnJlbnQgPSBmYWxzZTsKKyAgICBmb3IgKFNVbml0Ojpjb25zdF9wcmVkX2l0ZXJhdG9yIEkgPSBTVS0+UHJlZHMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBTVS0+UHJlZHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBTVW5pdCAqUHJlZFNVID0gSS0+Z2V0U1VuaXQoKTsKKyAgICAgIGlmIChQcmVkU1UtPmlzSGVpZ2h0Q3VycmVudCkKKyAgICAgICAgV29ya0xpc3QucHVzaF9iYWNrKFByZWRTVSk7CisgICAgfQorICB9IHdoaWxlICghV29ya0xpc3QuZW1wdHkoKSk7Cit9CisKKy8vLyBzZXREZXB0aFRvQXRMZWFzdCAtIFVwZGF0ZSB0aGlzIG5vZGUncyBzdWNjZXNzb3JzIHRvIHJlZmxlY3QgdGhlCisvLy8gZmFjdCB0aGF0IHRoaXMgbm9kZSdzIGRlcHRoIGp1c3QgaW5jcmVhc2VkLgorLy8vCit2b2lkIFNVbml0OjpzZXREZXB0aFRvQXRMZWFzdCh1bnNpZ25lZCBOZXdEZXB0aCkgeworICBpZiAoTmV3RGVwdGggPD0gZ2V0RGVwdGgoKSkKKyAgICByZXR1cm47CisgIHNldERlcHRoRGlydHkoKTsKKyAgRGVwdGggPSBOZXdEZXB0aDsKKyAgaXNEZXB0aEN1cnJlbnQgPSB0cnVlOworfQorCisvLy8gc2V0SGVpZ2h0VG9BdExlYXN0IC0gVXBkYXRlIHRoaXMgbm9kZSdzIHByZWRlY2Vzc29ycyB0byByZWZsZWN0IHRoZQorLy8vIGZhY3QgdGhhdCB0aGlzIG5vZGUncyBoZWlnaHQganVzdCBpbmNyZWFzZWQuCisvLy8KK3ZvaWQgU1VuaXQ6OnNldEhlaWdodFRvQXRMZWFzdCh1bnNpZ25lZCBOZXdIZWlnaHQpIHsKKyAgaWYgKE5ld0hlaWdodCA8PSBnZXRIZWlnaHQoKSkKKyAgICByZXR1cm47CisgIHNldEhlaWdodERpcnR5KCk7CisgIEhlaWdodCA9IE5ld0hlaWdodDsKKyAgaXNIZWlnaHRDdXJyZW50ID0gdHJ1ZTsKK30KKworLy8vIENvbXB1dGVEZXB0aCAtIENhbGN1bGF0ZSB0aGUgbWF4aW1hbCBwYXRoIGZyb20gdGhlIG5vZGUgdG8gdGhlIGV4aXQuCisvLy8KK3ZvaWQgU1VuaXQ6OkNvbXB1dGVEZXB0aCgpIHsKKyAgU21hbGxWZWN0b3I8U1VuaXQqLCA4PiBXb3JrTGlzdDsKKyAgV29ya0xpc3QucHVzaF9iYWNrKHRoaXMpOworICBkbyB7CisgICAgU1VuaXQgKkN1ciA9IFdvcmtMaXN0LmJhY2soKTsKKworICAgIGJvb2wgRG9uZSA9IHRydWU7CisgICAgdW5zaWduZWQgTWF4UHJlZERlcHRoID0gMDsKKyAgICBmb3IgKFNVbml0Ojpjb25zdF9wcmVkX2l0ZXJhdG9yIEkgPSBDdXItPlByZWRzLmJlZ2luKCksCisgICAgICAgICBFID0gQ3VyLT5QcmVkcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIFNVbml0ICpQcmVkU1UgPSBJLT5nZXRTVW5pdCgpOworICAgICAgaWYgKFByZWRTVS0+aXNEZXB0aEN1cnJlbnQpCisgICAgICAgIE1heFByZWREZXB0aCA9IHN0ZDo6bWF4KE1heFByZWREZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZFNVLT5EZXB0aCArIEktPmdldExhdGVuY3koKSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgRG9uZSA9IGZhbHNlOworICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soUHJlZFNVKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRG9uZSkgeworICAgICAgV29ya0xpc3QucG9wX2JhY2soKTsKKyAgICAgIGlmIChNYXhQcmVkRGVwdGggIT0gQ3VyLT5EZXB0aCkgeworICAgICAgICBDdXItPnNldERlcHRoRGlydHkoKTsKKyAgICAgICAgQ3VyLT5EZXB0aCA9IE1heFByZWREZXB0aDsKKyAgICAgIH0KKyAgICAgIEN1ci0+aXNEZXB0aEN1cnJlbnQgPSB0cnVlOworICAgIH0KKyAgfSB3aGlsZSAoIVdvcmtMaXN0LmVtcHR5KCkpOworfQorCisvLy8gQ29tcHV0ZUhlaWdodCAtIENhbGN1bGF0ZSB0aGUgbWF4aW1hbCBwYXRoIGZyb20gdGhlIG5vZGUgdG8gdGhlIGVudHJ5LgorLy8vCit2b2lkIFNVbml0OjpDb21wdXRlSGVpZ2h0KCkgeworICBTbWFsbFZlY3RvcjxTVW5pdCosIDg+IFdvcmtMaXN0OworICBXb3JrTGlzdC5wdXNoX2JhY2sodGhpcyk7CisgIGRvIHsKKyAgICBTVW5pdCAqQ3VyID0gV29ya0xpc3QuYmFjaygpOworCisgICAgYm9vbCBEb25lID0gdHJ1ZTsKKyAgICB1bnNpZ25lZCBNYXhTdWNjSGVpZ2h0ID0gMDsKKyAgICBmb3IgKFNVbml0Ojpjb25zdF9zdWNjX2l0ZXJhdG9yIEkgPSBDdXItPlN1Y2NzLmJlZ2luKCksCisgICAgICAgICBFID0gQ3VyLT5TdWNjcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIFNVbml0ICpTdWNjU1UgPSBJLT5nZXRTVW5pdCgpOworICAgICAgaWYgKFN1Y2NTVS0+aXNIZWlnaHRDdXJyZW50KQorICAgICAgICBNYXhTdWNjSGVpZ2h0ID0gc3RkOjptYXgoTWF4U3VjY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2NTVS0+SGVpZ2h0ICsgSS0+Z2V0TGF0ZW5jeSgpKTsKKyAgICAgIGVsc2UgeworICAgICAgICBEb25lID0gZmFsc2U7CisgICAgICAgIFdvcmtMaXN0LnB1c2hfYmFjayhTdWNjU1UpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChEb25lKSB7CisgICAgICBXb3JrTGlzdC5wb3BfYmFjaygpOworICAgICAgaWYgKE1heFN1Y2NIZWlnaHQgIT0gQ3VyLT5IZWlnaHQpIHsKKyAgICAgICAgQ3VyLT5zZXRIZWlnaHREaXJ0eSgpOworICAgICAgICBDdXItPkhlaWdodCA9IE1heFN1Y2NIZWlnaHQ7CisgICAgICB9CisgICAgICBDdXItPmlzSGVpZ2h0Q3VycmVudCA9IHRydWU7CisgICAgfQorICB9IHdoaWxlICghV29ya0xpc3QuZW1wdHkoKSk7Cit9CisKKy8vLyBTVW5pdCAtIFNjaGVkdWxpbmcgdW5pdC4gSXQncyBhbiB3cmFwcGVyIGFyb3VuZCBlaXRoZXIgYSBzaW5nbGUgU0ROb2RlIG9yCisvLy8gYSBncm91cCBvZiBub2RlcyBmbGFnZ2VkIHRvZ2V0aGVyLgordm9pZCBTVW5pdDo6ZHVtcChjb25zdCBTY2hlZHVsZURBRyAqRykgY29uc3QgeworICBkYmdzKCkgPDwgIlNVKCIgPDwgTm9kZU51bSA8PCAiKTogIjsKKyAgRy0+ZHVtcE5vZGUodGhpcyk7Cit9CisKK3ZvaWQgU1VuaXQ6OmR1bXBBbGwoY29uc3QgU2NoZWR1bGVEQUcgKkcpIGNvbnN0IHsKKyAgZHVtcChHKTsKKworICBkYmdzKCkgPDwgIiAgIyBwcmVkcyBsZWZ0ICAgICAgIDogIiA8PCBOdW1QcmVkc0xlZnQgPDwgIlxuIjsKKyAgZGJncygpIDw8ICIgICMgc3VjY3MgbGVmdCAgICAgICA6ICIgPDwgTnVtU3VjY3NMZWZ0IDw8ICJcbiI7CisgIGRiZ3MoKSA8PCAiICBMYXRlbmN5ICAgICAgICAgICAgOiAiIDw8IExhdGVuY3kgPDwgIlxuIjsKKyAgZGJncygpIDw8ICIgIERlcHRoICAgICAgICAgICAgICA6ICIgPDwgRGVwdGggPDwgIlxuIjsKKyAgZGJncygpIDw8ICIgIEhlaWdodCAgICAgICAgICAgICA6ICIgPDwgSGVpZ2h0IDw8ICJcbiI7CisKKyAgaWYgKFByZWRzLnNpemUoKSAhPSAwKSB7CisgICAgZGJncygpIDw8ICIgIFByZWRlY2Vzc29yczpcbiI7CisgICAgZm9yIChTVW5pdDo6Y29uc3Rfc3VjY19pdGVyYXRvciBJID0gUHJlZHMuYmVnaW4oKSwgRSA9IFByZWRzLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGRiZ3MoKSA8PCAiICAgIjsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0S2luZCgpKSB7CisgICAgICBjYXNlIFNEZXA6OkRhdGE6ICAgICAgICBkYmdzKCkgPDwgInZhbCAiOyBicmVhazsKKyAgICAgIGNhc2UgU0RlcDo6QW50aTogICAgICAgIGRiZ3MoKSA8PCAiYW50aSI7IGJyZWFrOworICAgICAgY2FzZSBTRGVwOjpPdXRwdXQ6ICAgICAgZGJncygpIDw8ICJvdXQgIjsgYnJlYWs7CisgICAgICBjYXNlIFNEZXA6Ok9yZGVyOiAgICAgICBkYmdzKCkgPDwgImNoICAiOyBicmVhazsKKyAgICAgIH0KKyAgICAgIGRiZ3MoKSA8PCAiIyI7CisgICAgICBkYmdzKCkgPDwgSS0+Z2V0U1VuaXQoKSA8PCAiIC0gU1UoIiA8PCBJLT5nZXRTVW5pdCgpLT5Ob2RlTnVtIDw8ICIpIjsKKyAgICAgIGlmIChJLT5pc0FydGlmaWNpYWwoKSkKKyAgICAgICAgZGJncygpIDw8ICIgKiI7CisgICAgICBkYmdzKCkgPDwgIjogTGF0ZW5jeT0iIDw8IEktPmdldExhdGVuY3koKTsKKyAgICAgIGRiZ3MoKSA8PCAiXG4iOworICAgIH0KKyAgfQorICBpZiAoU3VjY3Muc2l6ZSgpICE9IDApIHsKKyAgICBkYmdzKCkgPDwgIiAgU3VjY2Vzc29yczpcbiI7CisgICAgZm9yIChTVW5pdDo6Y29uc3Rfc3VjY19pdGVyYXRvciBJID0gU3VjY3MuYmVnaW4oKSwgRSA9IFN1Y2NzLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGRiZ3MoKSA8PCAiICAgIjsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0S2luZCgpKSB7CisgICAgICBjYXNlIFNEZXA6OkRhdGE6ICAgICAgICBkYmdzKCkgPDwgInZhbCAiOyBicmVhazsKKyAgICAgIGNhc2UgU0RlcDo6QW50aTogICAgICAgIGRiZ3MoKSA8PCAiYW50aSI7IGJyZWFrOworICAgICAgY2FzZSBTRGVwOjpPdXRwdXQ6ICAgICAgZGJncygpIDw8ICJvdXQgIjsgYnJlYWs7CisgICAgICBjYXNlIFNEZXA6Ok9yZGVyOiAgICAgICBkYmdzKCkgPDwgImNoICAiOyBicmVhazsKKyAgICAgIH0KKyAgICAgIGRiZ3MoKSA8PCAiIyI7CisgICAgICBkYmdzKCkgPDwgSS0+Z2V0U1VuaXQoKSA8PCAiIC0gU1UoIiA8PCBJLT5nZXRTVW5pdCgpLT5Ob2RlTnVtIDw8ICIpIjsKKyAgICAgIGlmIChJLT5pc0FydGlmaWNpYWwoKSkKKyAgICAgICAgZGJncygpIDw8ICIgKiI7CisgICAgICBkYmdzKCkgPDwgIjogTGF0ZW5jeT0iIDw8IEktPmdldExhdGVuY3koKTsKKyAgICAgIGRiZ3MoKSA8PCAiXG4iOworICAgIH0KKyAgfQorICBkYmdzKCkgPDwgIlxuIjsKK30KKworI2lmbmRlZiBOREVCVUcKKy8vLyBWZXJpZnlTY2hlZHVsZSAtIFZlcmlmeSB0aGF0IGFsbCBTVW5pdHMgd2VyZSBzY2hlZHVsZWQgYW5kIHRoYXQKKy8vLyB0aGVpciBzdGF0ZSBpcyBjb25zaXN0ZW50LgorLy8vCit2b2lkIFNjaGVkdWxlREFHOjpWZXJpZnlTY2hlZHVsZShib29sIGlzQm90dG9tVXApIHsKKyAgYm9vbCBBbnlOb3RTY2hlZCA9IGZhbHNlOworICB1bnNpZ25lZCBEZWFkTm9kZXMgPSAwOworICB1bnNpZ25lZCBOb29wcyA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVW5pdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmICghU1VuaXRzW2ldLmlzU2NoZWR1bGVkKSB7CisgICAgICBpZiAoU1VuaXRzW2ldLk51bVByZWRzID09IDAgJiYgU1VuaXRzW2ldLk51bVN1Y2NzID09IDApIHsKKyAgICAgICAgKytEZWFkTm9kZXM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKCFBbnlOb3RTY2hlZCkKKyAgICAgICAgZGJncygpIDw8ICIqKiogU2NoZWR1bGluZyBmYWlsZWQhICoqKlxuIjsKKyAgICAgIFNVbml0c1tpXS5kdW1wKHRoaXMpOworICAgICAgZGJncygpIDw8ICJoYXMgbm90IGJlZW4gc2NoZWR1bGVkIVxuIjsKKyAgICAgIEFueU5vdFNjaGVkID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKFNVbml0c1tpXS5pc1NjaGVkdWxlZCAmJgorICAgICAgICAoaXNCb3R0b21VcCA/IFNVbml0c1tpXS5nZXRIZWlnaHQoKSA6IFNVbml0c1tpXS5nZXREZXB0aCgpKSA+CisgICAgICAgICAgdW5zaWduZWQoSU5UX01BWCkpIHsKKyAgICAgIGlmICghQW55Tm90U2NoZWQpCisgICAgICAgIGRiZ3MoKSA8PCAiKioqIFNjaGVkdWxpbmcgZmFpbGVkISAqKipcbiI7CisgICAgICBTVW5pdHNbaV0uZHVtcCh0aGlzKTsKKyAgICAgIGRiZ3MoKSA8PCAiaGFzIGFuIHVuZXhwZWN0ZWQgIgorICAgICAgICAgICA8PCAoaXNCb3R0b21VcCA/ICJIZWlnaHQiIDogIkRlcHRoIikgPDwgIiB2YWx1ZSFcbiI7CisgICAgICBBbnlOb3RTY2hlZCA9IHRydWU7CisgICAgfQorICAgIGlmIChpc0JvdHRvbVVwKSB7CisgICAgICBpZiAoU1VuaXRzW2ldLk51bVN1Y2NzTGVmdCAhPSAwKSB7CisgICAgICAgIGlmICghQW55Tm90U2NoZWQpCisgICAgICAgICAgZGJncygpIDw8ICIqKiogU2NoZWR1bGluZyBmYWlsZWQhICoqKlxuIjsKKyAgICAgICAgU1VuaXRzW2ldLmR1bXAodGhpcyk7CisgICAgICAgIGRiZ3MoKSA8PCAiaGFzIHN1Y2Nlc3NvcnMgbGVmdCFcbiI7CisgICAgICAgIEFueU5vdFNjaGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKFNVbml0c1tpXS5OdW1QcmVkc0xlZnQgIT0gMCkgeworICAgICAgICBpZiAoIUFueU5vdFNjaGVkKQorICAgICAgICAgIGRiZ3MoKSA8PCAiKioqIFNjaGVkdWxpbmcgZmFpbGVkISAqKipcbiI7CisgICAgICAgIFNVbml0c1tpXS5kdW1wKHRoaXMpOworICAgICAgICBkYmdzKCkgPDwgImhhcyBwcmVkZWNlc3NvcnMgbGVmdCFcbiI7CisgICAgICAgIEFueU5vdFNjaGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNlcXVlbmNlLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFTZXF1ZW5jZVtpXSkKKyAgICAgICsrTm9vcHM7CisgIGFzc2VydCghQW55Tm90U2NoZWQpOworICBhc3NlcnQoU2VxdWVuY2Uuc2l6ZSgpICsgRGVhZE5vZGVzIC0gTm9vcHMgPT0gU1VuaXRzLnNpemUoKSAmJgorICAgICAgICAgIlRoZSBudW1iZXIgb2Ygbm9kZXMgc2NoZWR1bGVkIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG51bWJlciEiKTsKK30KKyNlbmRpZgorCisvLy8gSW5pdERBR1RvcG9sb2dpY2FsU29ydGluZyAtIGNyZWF0ZSB0aGUgaW5pdGlhbCB0b3BvbG9naWNhbAorLy8vIG9yZGVyaW5nIGZyb20gdGhlIERBRyB0byBiZSBzY2hlZHVsZWQuCisvLy8KKy8vLyBUaGUgaWRlYSBvZiB0aGUgYWxnb3JpdGhtIGlzIHRha2VuIGZyb20KKy8vLyAiT25saW5lIGFsZ29yaXRobXMgZm9yIG1hbmFnaW5nIHRoZSB0b3BvbG9naWNhbCBvcmRlciBvZgorLy8vIGEgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCIgYnkgRGF2aWQgSi4gUGVhcmNlIGFuZCBQYXVsIEguSi4gS2VsbHkKKy8vLyBUaGlzIGlzIHRoZSBNTlIgYWxnb3JpdGhtLCB3aGljaCB3YXMgZmlyc3QgaW50cm9kdWNlZCBieQorLy8vIEEuIE1hcmNoZXR0aS1TcGFjY2FtZWxhLCBVLiBOYW5uaSBhbmQgSC4gUm9obmVydCBpbgorLy8vICJNYWludGFpbmluZyBhIHRvcG9sb2dpY2FsIG9yZGVyIHVuZGVyIGVkZ2UgaW5zZXJ0aW9ucyIuCisvLy8KKy8vLyBTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtOgorLy8vCisvLy8gVG9wb2xvZ2ljYWwgb3JkZXJpbmcsIG9yZCwgb2YgYSBEQUcgbWFwcyBlYWNoIG5vZGUgdG8gYSB0b3BvbG9naWNhbAorLy8vIGluZGV4IHNvIHRoYXQgZm9yIGFsbCBlZGdlcyBYLT5ZIGl0IGlzIHRoZSBjYXNlIHRoYXQgb3JkKFgpIDwgb3JkKFkpLgorLy8vCisvLy8gVGhpcyBtZWFucyB0aGF0IGlmIHRoZXJlIGlzIGEgcGF0aCBmcm9tIHRoZSBub2RlIFggdG8gdGhlIG5vZGUgWiwKKy8vLyB0aGVuIG9yZChYKSA8IG9yZChaKS4KKy8vLworLy8vIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZm9yIHJlYWNoYWJpbGl0eSBvZiBub2RlczoKKy8vLyBpZiBaIGlzIHJlYWNoYWJsZSBmcm9tIFgsIHRoZW4gYW4gaW5zZXJ0aW9uIG9mIHRoZSBlZGdlIFotPlggd291bGQKKy8vLyBjcmVhdGUgYSBjeWNsZS4KKy8vLworLy8vIFRoZSBhbGdvcml0aG0gZmlyc3QgY29tcHV0ZXMgYSB0b3BvbG9naWNhbCBvcmRlcmluZyBmb3IgdGhlIERBRyBieQorLy8vIGluaXRpYWxpemluZyB0aGUgSW5kZXgyTm9kZSBhbmQgTm9kZTJJbmRleCBhcnJheXMgYW5kIHRoZW4gdHJpZXMgdG8ga2VlcAorLy8vIHRoZSBvcmRlcmluZyB1cC10by1kYXRlIGFmdGVyIGVkZ2UgaW5zZXJ0aW9ucyBieSByZW9yZGVyaW5nIHRoZSBEQUcuCisvLy8KKy8vLyBPbiBpbnNlcnRpb24gb2YgdGhlIGVkZ2UgWC0+WSwgdGhlIGFsZ29yaXRobSBmaXJzdCBtYXJrcyBieSBjYWxsaW5nIERGUworLy8vIHRoZSBub2RlcyByZWFjaGFibGUgZnJvbSBZLCBhbmQgdGhlbiBzaGlmdHMgdGhlbSB1c2luZyBTaGlmdCB0byBsaWUKKy8vLyBpbW1lZGlhdGVseSBhZnRlciBYIGluIEluZGV4Mk5vZGUuCit2b2lkIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0OjpJbml0REFHVG9wb2xvZ2ljYWxTb3J0aW5nKCkgeworICB1bnNpZ25lZCBEQUdTaXplID0gU1VuaXRzLnNpemUoKTsKKyAgc3RkOjp2ZWN0b3I8U1VuaXQqPiBXb3JrTGlzdDsKKyAgV29ya0xpc3QucmVzZXJ2ZShEQUdTaXplKTsKKworICBJbmRleDJOb2RlLnJlc2l6ZShEQUdTaXplKTsKKyAgTm9kZTJJbmRleC5yZXNpemUoREFHU2l6ZSk7CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gREFHU2l6ZTsgaSAhPSBlOyArK2kpIHsKKyAgICBTVW5pdCAqU1UgPSAmU1VuaXRzW2ldOworICAgIGludCBOb2RlTnVtID0gU1UtPk5vZGVOdW07CisgICAgdW5zaWduZWQgRGVncmVlID0gU1UtPlN1Y2NzLnNpemUoKTsKKyAgICAvLyBUZW1wb3JhcmlseSB1c2UgdGhlIE5vZGUySW5kZXggYXJyYXkgYXMgc2NyYXRjaCBzcGFjZSBmb3IgZGVncmVlIGNvdW50cy4KKyAgICBOb2RlMkluZGV4W05vZGVOdW1dID0gRGVncmVlOworCisgICAgLy8gSXMgaXQgYSBub2RlIHdpdGhvdXQgZGVwZW5kZW5jaWVzPworICAgIGlmIChEZWdyZWUgPT0gMCkgeworICAgICAgYXNzZXJ0KFNVLT5TdWNjcy5lbXB0eSgpICYmICJTVW5pdCBzaG91bGQgaGF2ZSBubyBzdWNjZXNzb3JzIik7CisgICAgICAvLyBDb2xsZWN0IGxlYWYgbm9kZXMuCisgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soU1UpOworICAgIH0KKyAgfQorCisgIGludCBJZCA9IERBR1NpemU7CisgIHdoaWxlICghV29ya0xpc3QuZW1wdHkoKSkgeworICAgIFNVbml0ICpTVSA9IFdvcmtMaXN0LmJhY2soKTsKKyAgICBXb3JrTGlzdC5wb3BfYmFjaygpOworICAgIEFsbG9jYXRlKFNVLT5Ob2RlTnVtLCAtLUlkKTsKKyAgICBmb3IgKFNVbml0Ojpjb25zdF9wcmVkX2l0ZXJhdG9yIEkgPSBTVS0+UHJlZHMuYmVnaW4oKSwgRSA9IFNVLT5QcmVkcy5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBTVW5pdCAqU1UgPSBJLT5nZXRTVW5pdCgpOworICAgICAgaWYgKCEtLU5vZGUySW5kZXhbU1UtPk5vZGVOdW1dKQorICAgICAgICAvLyBJZiBhbGwgZGVwZW5kZW5jaWVzIG9mIHRoZSBub2RlIGFyZSBwcm9jZXNzZWQgYWxyZWFkeSwKKyAgICAgICAgLy8gdGhlbiB0aGUgbm9kZSBjYW4gYmUgY29tcHV0ZWQgbm93LgorICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soU1UpOworICAgIH0KKyAgfQorCisgIFZpc2l0ZWQucmVzaXplKERBR1NpemUpOworCisjaWZuZGVmIE5ERUJVRworICAvLyBDaGVjayBjb3JyZWN0bmVzcyBvZiB0aGUgb3JkZXJpbmcKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IERBR1NpemU7IGkgIT0gZTsgKytpKSB7CisgICAgU1VuaXQgKlNVID0gJlNVbml0c1tpXTsKKyAgICBmb3IgKFNVbml0Ojpjb25zdF9wcmVkX2l0ZXJhdG9yIEkgPSBTVS0+UHJlZHMuYmVnaW4oKSwgRSA9IFNVLT5QcmVkcy5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBhc3NlcnQoTm9kZTJJbmRleFtTVS0+Tm9kZU51bV0gPiBOb2RlMkluZGV4W0ktPmdldFNVbml0KCktPk5vZGVOdW1dICYmCisgICAgICAiV3JvbmcgdG9wb2xvZ2ljYWwgc29ydGluZyIpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisKKy8vLyBBZGRQcmVkIC0gVXBkYXRlcyB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcgdG8gYWNjb21vZGF0ZSBhbiBlZGdlCisvLy8gdG8gYmUgYWRkZWQgZnJvbSBTVW5pdCBYIHRvIFNVbml0IFkuCit2b2lkIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0OjpBZGRQcmVkKFNVbml0ICpZLCBTVW5pdCAqWCkgeworICBpbnQgVXBwZXJCb3VuZCwgTG93ZXJCb3VuZDsKKyAgTG93ZXJCb3VuZCA9IE5vZGUySW5kZXhbWS0+Tm9kZU51bV07CisgIFVwcGVyQm91bmQgPSBOb2RlMkluZGV4W1gtPk5vZGVOdW1dOworICBib29sIEhhc0xvb3AgPSBmYWxzZTsKKyAgLy8gSXMgT3JkKFgpIDwgT3JkKFkpID8KKyAgaWYgKExvd2VyQm91bmQgPCBVcHBlckJvdW5kKSB7CisgICAgLy8gVXBkYXRlIHRoZSB0b3BvbG9naWNhbCBvcmRlci4KKyAgICBWaXNpdGVkLnJlc2V0KCk7CisgICAgREZTKFksIFVwcGVyQm91bmQsIEhhc0xvb3ApOworICAgIGFzc2VydCghSGFzTG9vcCAmJiAiSW5zZXJ0ZWQgZWRnZSBjcmVhdGVzIGEgbG9vcCEiKTsKKyAgICAvLyBSZWNvbXB1dGUgdG9wb2xvZ2ljYWwgaW5kZXhlcy4KKyAgICBTaGlmdChWaXNpdGVkLCBMb3dlckJvdW5kLCBVcHBlckJvdW5kKTsKKyAgfQorfQorCisvLy8gUmVtb3ZlUHJlZCAtIFVwZGF0ZXMgdGhlIHRvcG9sb2dpY2FsIG9yZGVyaW5nIHRvIGFjY29tb2RhdGUgYW4KKy8vLyBhbiBlZGdlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIG5vZGUgTiBmcm9tIHRoZSBwcmVkZWNlc3NvcnMKKy8vLyBvZiB0aGUgY3VycmVudCBub2RlIE0uCit2b2lkIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0OjpSZW1vdmVQcmVkKFNVbml0ICpNLCBTVW5pdCAqTikgeworICAvLyBJbml0REFHVG9wb2xvZ2ljYWxTb3J0aW5nKCk7Cit9CisKKy8vLyBERlMgLSBNYWtlIGEgREZTIHRyYXZlcnNhbCB0byBtYXJrIGFsbCBub2RlcyByZWFjaGFibGUgZnJvbSBTVSBhbmQgbWFyaworLy8vIGFsbCBub2RlcyBhZmZlY3RlZCBieSB0aGUgZWRnZSBpbnNlcnRpb24uIFRoZXNlIG5vZGVzIHdpbGwgbGF0ZXIgZ2V0IG5ldworLy8vIHRvcG9sb2dpY2FsIGluZGV4ZXMgYnkgbWVhbnMgb2YgdGhlIFNoaWZ0IG1ldGhvZC4KK3ZvaWQgU2NoZWR1bGVEQUdUb3BvbG9naWNhbFNvcnQ6OkRGUyhjb25zdCBTVW5pdCAqU1UsIGludCBVcHBlckJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIEhhc0xvb3ApIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgU1VuaXQqPiBXb3JrTGlzdDsKKyAgV29ya0xpc3QucmVzZXJ2ZShTVW5pdHMuc2l6ZSgpKTsKKworICBXb3JrTGlzdC5wdXNoX2JhY2soU1UpOworICBkbyB7CisgICAgU1UgPSBXb3JrTGlzdC5iYWNrKCk7CisgICAgV29ya0xpc3QucG9wX2JhY2soKTsKKyAgICBWaXNpdGVkLnNldChTVS0+Tm9kZU51bSk7CisgICAgZm9yIChpbnQgSSA9IFNVLT5TdWNjcy5zaXplKCktMTsgSSA+PSAwOyAtLUkpIHsKKyAgICAgIGludCBzID0gU1UtPlN1Y2NzW0ldLmdldFNVbml0KCktPk5vZGVOdW07CisgICAgICBpZiAoTm9kZTJJbmRleFtzXSA9PSBVcHBlckJvdW5kKSB7CisgICAgICAgIEhhc0xvb3AgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvLyBWaXNpdCBzdWNjZXNzb3JzIGlmIG5vdCBhbHJlYWR5IGFuZCBpbiBhZmZlY3RlZCByZWdpb24uCisgICAgICBpZiAoIVZpc2l0ZWQudGVzdChzKSAmJiBOb2RlMkluZGV4W3NdIDwgVXBwZXJCb3VuZCkgeworICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soU1UtPlN1Y2NzW0ldLmdldFNVbml0KCkpOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoIVdvcmtMaXN0LmVtcHR5KCkpOworfQorCisvLy8gU2hpZnQgLSBSZW51bWJlciB0aGUgbm9kZXMgc28gdGhhdCB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcgaXMKKy8vLyBwcmVzZXJ2ZWQuCit2b2lkIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0OjpTaGlmdChCaXRWZWN0b3ImIFZpc2l0ZWQsIGludCBMb3dlckJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFVwcGVyQm91bmQpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBMOworICBpbnQgc2hpZnQgPSAwOworICBpbnQgaTsKKworICBmb3IgKGkgPSBMb3dlckJvdW5kOyBpIDw9IFVwcGVyQm91bmQ7ICsraSkgeworICAgIC8vIHcgaXMgbm9kZSBhdCB0b3BvbG9naWNhbCBpbmRleCBpLgorICAgIGludCB3ID0gSW5kZXgyTm9kZVtpXTsKKyAgICBpZiAoVmlzaXRlZC50ZXN0KHcpKSB7CisgICAgICAvLyBVbm1hcmsuCisgICAgICBWaXNpdGVkLnJlc2V0KHcpOworICAgICAgTC5wdXNoX2JhY2sodyk7CisgICAgICBzaGlmdCA9IHNoaWZ0ICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgQWxsb2NhdGUodywgaSAtIHNoaWZ0KTsKKyAgICB9CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgTC5zaXplKCk7ICsraikgeworICAgIEFsbG9jYXRlKExbal0sIGkgLSBzaGlmdCk7CisgICAgaSA9IGkgKyAxOworICB9Cit9CisKKworLy8vIFdpbGxDcmVhdGVDeWNsZSAtIFJldHVybnMgdHJ1ZSBpZiBhZGRpbmcgYW4gZWRnZSBmcm9tIFNVIHRvIFRhcmdldFNVIHdpbGwKKy8vLyBjcmVhdGUgYSBjeWNsZS4KK2Jvb2wgU2NoZWR1bGVEQUdUb3BvbG9naWNhbFNvcnQ6OldpbGxDcmVhdGVDeWNsZShTVW5pdCAqU1UsIFNVbml0ICpUYXJnZXRTVSkgeworICBpZiAoSXNSZWFjaGFibGUoVGFyZ2V0U1UsIFNVKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZm9yIChTVW5pdDo6cHJlZF9pdGVyYXRvciBJID0gU1UtPlByZWRzLmJlZ2luKCksIEUgPSBTVS0+UHJlZHMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgaWYgKEktPmlzQXNzaWduZWRSZWdEZXAoKSAmJgorICAgICAgICBJc1JlYWNoYWJsZShUYXJnZXRTVSwgSS0+Z2V0U1VuaXQoKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gSXNSZWFjaGFibGUgLSBDaGVja3MgaWYgU1UgaXMgcmVhY2hhYmxlIGZyb20gVGFyZ2V0U1UuCitib29sIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0OjpJc1JlYWNoYWJsZShjb25zdCBTVW5pdCAqU1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTVW5pdCAqVGFyZ2V0U1UpIHsKKyAgLy8gSWYgaW5zZXJ0aW9uIG9mIHRoZSBlZGdlIFNVLT5UYXJnZXRTVSB3b3VsZCBjcmVhdGUgYSBjeWNsZQorICAvLyB0aGVuIHRoZXJlIGlzIGEgcGF0aCBmcm9tIFRhcmdldFNVIHRvIFNVLgorICBpbnQgVXBwZXJCb3VuZCwgTG93ZXJCb3VuZDsKKyAgTG93ZXJCb3VuZCA9IE5vZGUySW5kZXhbVGFyZ2V0U1UtPk5vZGVOdW1dOworICBVcHBlckJvdW5kID0gTm9kZTJJbmRleFtTVS0+Tm9kZU51bV07CisgIGJvb2wgSGFzTG9vcCA9IGZhbHNlOworICAvLyBJcyBPcmQoVGFyZ2V0U1UpIDwgT3JkKFNVKSA/CisgIGlmIChMb3dlckJvdW5kIDwgVXBwZXJCb3VuZCkgeworICAgIFZpc2l0ZWQucmVzZXQoKTsKKyAgICAvLyBUaGVyZSBtYXkgYmUgYSBwYXRoIGZyb20gVGFyZ2V0U1UgdG8gU1UuIENoZWNrIGZvciBpdC4KKyAgICBERlMoVGFyZ2V0U1UsIFVwcGVyQm91bmQsIEhhc0xvb3ApOworICB9CisgIHJldHVybiBIYXNMb29wOworfQorCisvLy8gQWxsb2NhdGUgLSBhc3NpZ24gdGhlIHRvcG9sb2dpY2FsIGluZGV4IHRvIHRoZSBub2RlIG4uCit2b2lkIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0OjpBbGxvY2F0ZShpbnQgbiwgaW50IGluZGV4KSB7CisgIE5vZGUySW5kZXhbbl0gPSBpbmRleDsKKyAgSW5kZXgyTm9kZVtpbmRleF0gPSBuOworfQorCitTY2hlZHVsZURBR1RvcG9sb2dpY2FsU29ydDo6CitTY2hlZHVsZURBR1RvcG9sb2dpY2FsU29ydChzdGQ6OnZlY3RvcjxTVW5pdD4gJnN1bml0cykgOiBTVW5pdHMoc3VuaXRzKSB7fQorCitTY2hlZHVsZUhhemFyZFJlY29nbml6ZXI6On5TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIoKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2NoZWR1bGVEQUdFbWl0LmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NjaGVkdWxlREFHRW1pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyZmIzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NjaGVkdWxlREFHRW1pdC5jcHAKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tLS0tIFNjaGVkdWxlREFHRW1pdC5jcHAgLSBFbWl0IHJvdXRpbmVzIGZvciB0aGUgU2NoZWR1bGVEQUcgY2xhc3MgLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGltcGxlbWVudHMgdGhlIEVtaXQgcm91dGluZXMgZm9yIHRoZSBTY2hlZHVsZURBRyBjbGFzcywgd2hpY2ggY3JlYXRlcworLy8gTWFjaGluZUluc3RycyBhY2NvcmRpbmcgdG8gdGhlIGNvbXB1dGVkIHNjaGVkdWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicHJlLVJBLXNjaGVkIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZURBRy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCit2b2lkIFNjaGVkdWxlREFHOjpFbWl0Tm9vcCgpIHsKKyAgVElJLT5pbnNlcnROb29wKCpCQiwgSW5zZXJ0UG9zKTsKK30KKwordm9pZCBTY2hlZHVsZURBRzo6RW1pdFBoeXNSZWdDb3B5KFNVbml0ICpTVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxTVW5pdCosIHVuc2lnbmVkPiAmVlJCYXNlTWFwKSB7CisgIGZvciAoU1VuaXQ6OmNvbnN0X3ByZWRfaXRlcmF0b3IgSSA9IFNVLT5QcmVkcy5iZWdpbigpLCBFID0gU1UtPlByZWRzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPmlzQ3RybCgpKSBjb250aW51ZTsgIC8vIGlnbm9yZSBjaGFpbiBwcmVkcworICAgIGlmIChJLT5nZXRTVW5pdCgpLT5Db3B5RHN0UkMpIHsKKyAgICAgIC8vIENvcHkgdG8gcGh5c2ljYWwgcmVnaXN0ZXIuCisgICAgICBEZW5zZU1hcDxTVW5pdCosIHVuc2lnbmVkPjo6aXRlcmF0b3IgVlJJID0gVlJCYXNlTWFwLmZpbmQoSS0+Z2V0U1VuaXQoKSk7CisgICAgICBhc3NlcnQoVlJJICE9IFZSQmFzZU1hcC5lbmQoKSAmJiAiTm9kZSBlbWl0dGVkIG91dCBvZiBvcmRlciAtIGxhdGUiKTsKKyAgICAgIC8vIEZpbmQgdGhlIGRlc3RpbmF0aW9uIHBoeXNpY2FsIHJlZ2lzdGVyLgorICAgICAgdW5zaWduZWQgUmVnID0gMDsKKyAgICAgIGZvciAoU1VuaXQ6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgSUkgPSBTVS0+U3VjY3MuYmVnaW4oKSwKKyAgICAgICAgICAgICBFRSA9IFNVLT5TdWNjcy5lbmQoKTsgSUkgIT0gRUU7ICsrSUkpIHsKKyAgICAgICAgaWYgKElJLT5nZXRSZWcoKSkgeworICAgICAgICAgIFJlZyA9IElJLT5nZXRSZWcoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQnVpbGRNSSgqQkIsIEluc2VydFBvcywgRGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgUmVnKQorICAgICAgICAuYWRkUmVnKFZSSS0+c2Vjb25kKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ29weSBmcm9tIHBoeXNpY2FsIHJlZ2lzdGVyLgorICAgICAgYXNzZXJ0KEktPmdldFJlZygpICYmICJVbmtub3duIHBoeXNpY2FsIHJlZ2lzdGVyISIpOworICAgICAgdW5zaWduZWQgVlJCYXNlID0gTVJJLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihTVS0+Q29weURzdFJDKTsKKyAgICAgIGJvb2wgaXNOZXcgPSBWUkJhc2VNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFNVLCBWUkJhc2UpKS5zZWNvbmQ7CisgICAgICBpc05ldyA9IGlzTmV3OyAvLyBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcuCisgICAgICBhc3NlcnQoaXNOZXcgJiYgIk5vZGUgZW1pdHRlZCBvdXQgb2Ygb3JkZXIgLSBlYXJseSIpOworICAgICAgQnVpbGRNSSgqQkIsIEluc2VydFBvcywgRGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgVlJCYXNlKQorICAgICAgICAuYWRkUmVnKEktPmdldFJlZygpKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NjaGVkdWxlREFHSW5zdHJzLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NjaGVkdWxlREFHSW5zdHJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTkzZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2NoZWR1bGVEQUdJbnN0cnMuY3BwCkBAIC0wLDAgKzEsNjIwIEBACisvLz09PS0tLS0gU2NoZWR1bGVEQUdJbnN0cnMuY3BwIC0gTWFjaGluZUluc3RyIFJlc2NoZWR1bGluZyAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaW1wbGVtZW50cyB0aGUgU2NoZWR1bGVEQUdJbnN0cnMgY2xhc3MsIHdoaWNoIGltcGxlbWVudHMgcmUtc2NoZWR1bGluZworLy8gb2YgTWFjaGluZUluc3Rycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInNjaGVkLWluc3RycyIKKyNpbmNsdWRlICJTY2hlZHVsZURBR0luc3Rycy5oIgorI2luY2x1ZGUgImxsdm0vT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFN1YnRhcmdldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU2NoZWR1bGVEQUdJbnN0cnM6OlNjaGVkdWxlREFHSW5zdHJzKE1hY2hpbmVGdW5jdGlvbiAmbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUxvb3BJbmZvICZtbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZURvbWluYXRvclRyZWUgJm1kdCkKKyAgOiBTY2hlZHVsZURBRyhtZiksIE1MSShtbGkpLCBNRFQobWR0KSwgRGVmcyhUUkktPmdldE51bVJlZ3MoKSksCisgICAgVXNlcyhUUkktPmdldE51bVJlZ3MoKSksIExvb3BSZWdzKE1MSSwgTURUKSB7CisgIE1GSSA9IG1mLmdldEZyYW1lSW5mbygpOworICBEYmdWYWx1ZVZlYy5jbGVhcigpOworfQorCisvLy8gUnVuIC0gcGVyZm9ybSBzY2hlZHVsaW5nLgorLy8vCit2b2lkIFNjaGVkdWxlREFHSW5zdHJzOjpSdW4oTWFjaGluZUJhc2ljQmxvY2sgKmJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGVuZGNvdW50KSB7CisgIEJCID0gYmI7CisgIEJlZ2luID0gYmVnaW47CisgIEluc2VydFBvc0luZGV4ID0gZW5kY291bnQ7CisKKyAgU2NoZWR1bGVEQUc6OlJ1bihiYiwgZW5kKTsKK30KKworLy8vIGdldFVuZGVybHlpbmdPYmplY3RGcm9tSW50IC0gVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSB3b3JrIG9mCisvLy8gbG9va2luZyB0aHJvdWdoIGJhc2ljIHB0cnRvaW50K2FyaXRobWV0aWMraW50dG9wdHIgc2VxdWVuY2VzLgorc3RhdGljIGNvbnN0IFZhbHVlICpnZXRVbmRlcmx5aW5nT2JqZWN0RnJvbUludChjb25zdCBWYWx1ZSAqVikgeworICBkbyB7CisgICAgaWYgKGNvbnN0IE9wZXJhdG9yICpVID0gZHluX2Nhc3Q8T3BlcmF0b3I+KFYpKSB7CisgICAgICAvLyBJZiB3ZSBmaW5kIGEgcHRydG9pbnQsIHdlIGNhbiB0cmFuc2ZlciBjb250cm9sIGJhY2sgdG8gdGhlCisgICAgICAvLyByZWd1bGFyIGdldFVuZGVybHlpbmdPYmplY3RGcm9tSW50LgorICAgICAgaWYgKFUtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpQdHJUb0ludCkKKyAgICAgICAgcmV0dXJuIFUtPmdldE9wZXJhbmQoMCk7CisgICAgICAvLyBJZiB3ZSBmaW5kIGFuIGFkZCBvZiBhIGNvbnN0YW50IG9yIGEgbXVsdGlwbGllZCB2YWx1ZSwgaXQncworICAgICAgLy8gbGlrZWx5IHRoYXQgdGhlIG90aGVyIG9wZXJhbmQgd2lsbCBsZWFkIHVzIHRvIHRoZSBiYXNlCisgICAgICAvLyBvYmplY3QuIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgdGhlCisgICAgICAvLyBvYmplY3QgYWRkcmVzcyBpcyBzb21laG93IGJlaW5nIGNvbXB1dGVkIGJ5IHRoZSBtdWx0aXBseSwKKyAgICAgIC8vIGJlY2F1c2Ugb3VyIGNhbGxlcnMgb25seSBjYXJlIHdoZW4gdGhlIHJlc3VsdCBpcyBhbgorICAgICAgLy8gaWRlbnRpZmliYWxlIG9iamVjdC4KKyAgICAgIGlmIChVLT5nZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6QWRkIHx8CisgICAgICAgICAgKCFpc2E8Q29uc3RhbnRJbnQ+KFUtPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgIE9wZXJhdG9yOjpnZXRPcGNvZGUoVS0+Z2V0T3BlcmFuZCgxKSkgIT0gSW5zdHJ1Y3Rpb246Ok11bCkpCisgICAgICAgIHJldHVybiBWOworICAgICAgViA9IFUtPmdldE9wZXJhbmQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBWOworICAgIH0KKyAgICBhc3NlcnQoVi0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpICYmICJVbmV4cGVjdGVkIG9wZXJhbmQgdHlwZSEiKTsKKyAgfSB3aGlsZSAoMSk7Cit9CisKKy8vLyBnZXRVbmRlcmx5aW5nT2JqZWN0IC0gVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIFZhbHVlOjpnZXRVbmRlcmx5aW5nT2JqZWN0CisvLy8gYW5kIGFkZHMgc3VwcG9ydCBmb3IgYmFzaWMgcHRydG9pbnQrYXJpdGhtZXRpYytpbnR0b3B0ciBzZXF1ZW5jZXMuCitzdGF0aWMgY29uc3QgVmFsdWUgKmdldFVuZGVybHlpbmdPYmplY3QoY29uc3QgVmFsdWUgKlYpIHsKKyAgLy8gRmlyc3QganVzdCBjYWxsIFZhbHVlOjpnZXRVbmRlcmx5aW5nT2JqZWN0IHRvIGxldCBpdCBkbyB3aGF0IGl0IGRvZXMuCisgIGRvIHsKKyAgICBWID0gVi0+Z2V0VW5kZXJseWluZ09iamVjdCgpOworICAgIC8vIElmIGl0IGZvdW5kIGFuIGludHRvcHRyLCB1c2Ugc3BlY2lhbCBjb2RlIHRvIGNvbnRpbnVlIGNsaW1pbmcuCisgICAgaWYgKE9wZXJhdG9yOjpnZXRPcGNvZGUoVikgIT0gSW5zdHJ1Y3Rpb246OkludFRvUHRyKQorICAgICAgYnJlYWs7CisgICAgY29uc3QgVmFsdWUgKk8gPSBnZXRVbmRlcmx5aW5nT2JqZWN0RnJvbUludChjYXN0PFVzZXI+KFYpLT5nZXRPcGVyYW5kKDApKTsKKyAgICAvLyBJZiB0aGF0IHN1Y2NlZWRlZCBpbiBmaW5kaW5nIGEgcG9pbnRlciwgY29udGludWUgdGhlIHNlYXJjaC4KKyAgICBpZiAoIU8tPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgIGJyZWFrOworICAgIFYgPSBPOworICB9IHdoaWxlICgxKTsKKyAgcmV0dXJuIFY7Cit9CisKKy8vLyBnZXRVbmRlcmx5aW5nT2JqZWN0Rm9ySW5zdHIgLSBJZiB0aGlzIG1hY2hpbmUgaW5zdHIgaGFzIG1lbW9yeSByZWZlcmVuY2UKKy8vLyBpbmZvcm1hdGlvbiBhbmQgaXQgY2FuIGJlIHRyYWNrZWQgdG8gYSBub3JtYWwgcmVmZXJlbmNlIHRvIGEga25vd24KKy8vLyBvYmplY3QsIHJldHVybiB0aGUgVmFsdWUgZm9yIHRoYXQgb2JqZWN0LiBPdGhlcndpc2UgcmV0dXJuIG51bGwuCitzdGF0aWMgY29uc3QgVmFsdWUgKmdldFVuZGVybHlpbmdPYmplY3RGb3JJbnN0cihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmTWF5QWxpYXMpIHsKKyAgTWF5QWxpYXMgPSB0cnVlOworICBpZiAoIU1JLT5oYXNPbmVNZW1PcGVyYW5kKCkgfHwKKyAgICAgICEoKk1JLT5tZW1vcGVyYW5kc19iZWdpbigpKS0+Z2V0VmFsdWUoKSB8fAorICAgICAgKCpNSS0+bWVtb3BlcmFuZHNfYmVnaW4oKSktPmlzVm9sYXRpbGUoKSkKKyAgICByZXR1cm4gMDsKKworICBjb25zdCBWYWx1ZSAqViA9ICgqTUktPm1lbW9wZXJhbmRzX2JlZ2luKCkpLT5nZXRWYWx1ZSgpOworICBpZiAoIVYpCisgICAgcmV0dXJuIDA7CisKKyAgViA9IGdldFVuZGVybHlpbmdPYmplY3QoVik7CisgIGlmIChjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqUFNWID0gZHluX2Nhc3Q8UHNldWRvU291cmNlVmFsdWU+KFYpKSB7CisgICAgLy8gRm9yIG5vdywgaWdub3JlIFBzZXVkb1NvdXJjZVZhbHVlcyB3aGljaCBtYXkgYWxpYXMgTExWTSBJUiB2YWx1ZXMKKyAgICAvLyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgdXNlcyB0aGlzIGZ1bmN0aW9uIGhhcyBubyB3YXkgdG8gY29wZSB3aXRoCisgICAgLy8gc3VjaCBhbGlhc2VzLgorICAgIGlmIChQU1YtPmlzQWxpYXNlZChNRkkpKQorICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgTWF5QWxpYXMgPSBQU1YtPm1heUFsaWFzKE1GSSk7CisgICAgcmV0dXJuIFY7CisgIH0KKworICBpZiAoaXNJZGVudGlmaWVkT2JqZWN0KFYpKQorICAgIHJldHVybiBWOworCisgIHJldHVybiAwOworfQorCit2b2lkIFNjaGVkdWxlREFHSW5zdHJzOjpTdGFydEJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgeworICBpZiAoTWFjaGluZUxvb3AgKk1MID0gTUxJLmdldExvb3BGb3IoQkIpKQorICAgIGlmIChCQiA9PSBNTC0+Z2V0TG9vcExhdGNoKCkpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpIZWFkZXIgPSBNTC0+Z2V0SGVhZGVyKCk7CisgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpsaXZlaW5faXRlcmF0b3IgSSA9IEhlYWRlci0+bGl2ZWluX2JlZ2luKCksCisgICAgICAgICAgIEUgPSBIZWFkZXItPmxpdmVpbl9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgIExvb3BMaXZlSW5SZWdzLmluc2VydCgqSSk7CisgICAgICBMb29wUmVncy5WaXNpdExvb3AoTUwpOworICAgIH0KK30KKwordm9pZCBTY2hlZHVsZURBR0luc3Ryczo6QnVpbGRTY2hlZEdyYXBoKEFsaWFzQW5hbHlzaXMgKkFBKSB7CisgIC8vIFdlJ2xsIGJlIGFsbG9jYXRpbmcgb25lIFNVbml0IGZvciBlYWNoIGluc3RydWN0aW9uLCBwbHVzIG9uZSBmb3IKKyAgLy8gdGhlIHJlZ2lvbiBleGl0IG5vZGUuCisgIFNVbml0cy5yZXNlcnZlKEJCLT5zaXplKCkpOworCisgIC8vIFdlIGJ1aWxkIHNjaGVkdWxpbmcgdW5pdHMgYnkgd2Fsa2luZyBhIGJsb2NrJ3MgaW5zdHJ1Y3Rpb24gbGlzdCBmcm9tIGJvdHRvbQorICAvLyB0byB0b3AuCisKKyAgLy8gUmVtZW1iZXIgd2hlcmUgYSBnZW5lcmljIHNpZGUtZWZmZWN0aW5nIGluc3RydWN0aW9uIGlzIGFzIHdlIHByb2NlZGUuCisgIFNVbml0ICpCYXJyaWVyQ2hhaW4gPSAwLCAqQWxpYXNDaGFpbiA9IDA7CisKKyAgLy8gTWVtb3J5IHJlZmVyZW5jZXMgdG8gc3BlY2lmaWMga25vd24gbWVtb3J5IGxvY2F0aW9ucyBhcmUgdHJhY2tlZAorICAvLyBzbyB0aGF0IHRoZXkgY2FuIGJlIGdpdmVuIG1vcmUgcHJlY2lzZSBkZXBlbmRlbmNpZXMuIFdlIHRyYWNrCisgIC8vIHNlcGFyYXRlbHkgdGhlIGtub3duIG1lbW9yeSBsb2NhdGlvbnMgdGhhdCBtYXkgYWxpYXMgYW5kIHRob3NlCisgIC8vIHRoYXQgYXJlIGtub3duIG5vdCB0byBhbGlhcworICBzdGQ6Om1hcDxjb25zdCBWYWx1ZSAqLCBTVW5pdCAqPiBBbGlhc01lbURlZnMsIE5vbkFsaWFzTWVtRGVmczsKKyAgc3RkOjptYXA8Y29uc3QgVmFsdWUgKiwgc3RkOjp2ZWN0b3I8U1VuaXQgKj4gPiBBbGlhc01lbVVzZXMsIE5vbkFsaWFzTWVtVXNlczsKKworICAvLyBLZWVwIHRyYWNrIG9mIGRhbmdsaW5nIGRlYnVnIHJlZmVyZW5jZXMgdG8gcmVnaXN0ZXJzLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+ID4KKyAgICBEYW5nbGluZ0RlYnVnVmFsdWUoVFJJLT5nZXROdW1SZWdzKCksCisgICAgc3RkOjptYWtlX3BhaXIoc3RhdGljX2Nhc3Q8TWFjaGluZUluc3RyKj4oMCksIDApKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHNjaGVkdWxlciBjYXJlcyBhYm91dCBsYXRlbmNpZXMuCisgIGJvb2wgVW5pdExhdGVuY2llcyA9IEZvcmNlVW5pdExhdGVuY2llcygpOworCisgIC8vIEFzayB0aGUgdGFyZ2V0IGlmIGFkZHJlc3MtYmFja3NjaGVkdWxpbmcgaXMgZGVzaXJhYmxlLCBhbmQgaWYgc28gaG93IG11Y2guCisgIGNvbnN0IFRhcmdldFN1YnRhcmdldCAmU1QgPSBUTS5nZXRTdWJ0YXJnZXQ8VGFyZ2V0U3VidGFyZ2V0PigpOworICB1bnNpZ25lZCBTcGVjaWFsQWRkcmVzc0xhdGVuY3kgPSBTVC5nZXRTcGVjaWFsQWRkcmVzc0xhdGVuY3koKTsKKworICAvLyBSZW1vdmUgYW55IHN0YWxlIGRlYnVnIGluZm87IHNvbWV0aW1lcyBCdWlsZFNjaGVkR3JhcGggaXMgY2FsbGVkIGFnYWluCisgIC8vIHdpdGhvdXQgZW1pdHRpbmcgdGhlIGluZm8gZnJvbSB0aGUgcHJldmlvdXMgY2FsbC4KKyAgRGJnVmFsdWVWZWMuY2xlYXIoKTsKKworICAvLyBXYWxrIHRoZSBsaXN0IG9mIGluc3RydWN0aW9ucywgZnJvbSBib3R0b20gbW92aW5nIHVwLgorICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSUkgPSBJbnNlcnRQb3MsIE1JRSA9IEJlZ2luOworICAgICAgIE1JSSAhPSBNSUU7IC0tTUlJKSB7CisgICAgTWFjaGluZUluc3RyICpNSSA9IHByaW9yKE1JSSk7CisgICAgLy8gREJHX1ZBTFVFIGRvZXMgbm90IGhhdmUgU1VuaXQncyBidWlsdCwgc28ganVzdCByZW1lbWJlciB0aGVzZSBmb3IgbGF0ZXIKKyAgICAvLyByZWluc2VydGlvbi4KKyAgICBpZiAoTUktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgICBpZiAoTUktPmdldE51bU9wZXJhbmRzKCk9PTMgJiYgTUktPmdldE9wZXJhbmQoMCkuaXNSZWcoKSAmJgorICAgICAgICAgIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKQorICAgICAgICBEYW5nbGluZ0RlYnVnVmFsdWVbTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCldID0KKyAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihNSSwgRGJnVmFsdWVWZWMuc2l6ZSgpKTsKKyAgICAgIERiZ1ZhbHVlVmVjLnB1c2hfYmFjayhNSSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS0+Z2V0RGVzYygpOworICAgIGFzc2VydCghVElELmlzVGVybWluYXRvcigpICYmICFNSS0+aXNMYWJlbCgpICYmCisgICAgICAgICAgICJDYW5ub3Qgc2NoZWR1bGUgdGVybWluYXRvcnMgb3IgbGFiZWxzISIpOworICAgIC8vIENyZWF0ZSB0aGUgU1VuaXQgZm9yIHRoaXMgTUkuCisgICAgU1VuaXQgKlNVID0gTmV3U1VuaXQoTUkpOworCisgICAgLy8gQXNzaWduIHRoZSBMYXRlbmN5IGZpZWxkIG9mIFNVIHVzaW5nIHRhcmdldC1wcm92aWRlZCBpbmZvcm1hdGlvbi4KKyAgICBpZiAoVW5pdExhdGVuY2llcykKKyAgICAgIFNVLT5MYXRlbmN5ID0gMTsKKyAgICBlbHNlCisgICAgICBDb21wdXRlTGF0ZW5jeShTVSk7CisKKyAgICAvLyBBZGQgcmVnaXN0ZXItYmFzZWQgZGVwZW5kZW5jaWVzIChkYXRhLCBhbnRpLCBhbmQgb3V0cHV0KS4KKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBuID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGogIT0gbjsgKytqKSB7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChqKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSkgY29udGludWU7CisgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgIGlmIChSZWcgPT0gMCkgY29udGludWU7CisKKyAgICAgIGFzc2VydChUUkktPmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpICYmICJWaXJ0dWFsIHJlZ2lzdGVyIGVuY291bnRlcmVkISIpOworCisgICAgICBpZiAoTU8uaXNEZWYoKSAmJiBEYW5nbGluZ0RlYnVnVmFsdWVbUmVnXS5maXJzdCE9MCkgeworICAgICAgICBTVS0+RGJnSW5zdHJMaXN0LnB1c2hfYmFjayhEYW5nbGluZ0RlYnVnVmFsdWVbUmVnXS5maXJzdCk7CisgICAgICAgIERiZ1ZhbHVlVmVjW0RhbmdsaW5nRGVidWdWYWx1ZVtSZWddLnNlY29uZF0gPSAwOworICAgICAgICBEYW5nbGluZ0RlYnVnVmFsdWVbUmVnXSA9IHN0ZDo6bWFrZV9wYWlyKChNYWNoaW5lSW5zdHIqKTAsIDApOworICAgICAgfQorCisgICAgICBzdGQ6OnZlY3RvcjxTVW5pdCAqPiAmVXNlTGlzdCA9IFVzZXNbUmVnXTsKKyAgICAgIHN0ZDo6dmVjdG9yPFNVbml0ICo+ICZEZWZMaXN0ID0gRGVmc1tSZWddOworICAgICAgLy8gT3B0aW9uYWxseSBhZGQgb3V0cHV0IGFuZCBhbnRpIGRlcGVuZGVuY2llcy4gRm9yIGFudGkKKyAgICAgIC8vIGRlcGVuZGVuY2llcyB3ZSB1c2UgYSBsYXRlbmN5IG9mIDAgYmVjYXVzZSBmb3IgYSBtdWx0aS1pc3N1ZQorICAgICAgLy8gdGFyZ2V0IHdlIHdhbnQgdG8gYWxsb3cgdGhlIGRlZmluaW5nIGluc3RydWN0aW9uIHRvIGlzc3VlCisgICAgICAvLyBpbiB0aGUgc2FtZSBjeWNsZSBhcyB0aGUgdXNpbmcgaW5zdHJ1Y3Rpb24uCisgICAgICAvLyBUT0RPOiBVc2luZyBhIGxhdGVuY3kgb2YgMSBoZXJlIGZvciBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzc3VtZXMKKyAgICAgIC8vICAgICAgIHRoZXJlJ3Mgbm8gY29zdCBmb3IgcmV1c2luZyByZWdpc3RlcnMuCisgICAgICBTRGVwOjpLaW5kIEtpbmQgPSBNTy5pc1VzZSgpID8gU0RlcDo6QW50aSA6IFNEZXA6Ok91dHB1dDsKKyAgICAgIHVuc2lnbmVkIEFPTGF0ZW5jeSA9IChLaW5kID09IFNEZXA6OkFudGkpID8gMCA6IDE7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVmTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFNVbml0ICpEZWZTVSA9IERlZkxpc3RbaV07CisgICAgICAgIGlmIChEZWZTVSAhPSBTVSAmJgorICAgICAgICAgICAgKEtpbmQgIT0gU0RlcDo6T3V0cHV0IHx8ICFNTy5pc0RlYWQoKSB8fAorICAgICAgICAgICAgICFEZWZTVS0+Z2V0SW5zdHIoKS0+cmVnaXN0ZXJEZWZJc0RlYWQoUmVnKSkpCisgICAgICAgICAgRGVmU1UtPmFkZFByZWQoU0RlcChTVSwgS2luZCwgQU9MYXRlbmN5LCAvKlJlZz0qL1JlZykpOworICAgICAgfQorICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQWxpYXMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBbGlhczsgKytBbGlhcykgeworICAgICAgICBzdGQ6OnZlY3RvcjxTVW5pdCAqPiAmRGVmTGlzdCA9IERlZnNbKkFsaWFzXTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IERlZkxpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIFNVbml0ICpEZWZTVSA9IERlZkxpc3RbaV07CisgICAgICAgICAgaWYgKERlZlNVICE9IFNVICYmCisgICAgICAgICAgICAgIChLaW5kICE9IFNEZXA6Ok91dHB1dCB8fCAhTU8uaXNEZWFkKCkgfHwKKyAgICAgICAgICAgICAgICFEZWZTVS0+Z2V0SW5zdHIoKS0+cmVnaXN0ZXJEZWZJc0RlYWQoKkFsaWFzKSkpCisgICAgICAgICAgICBEZWZTVS0+YWRkUHJlZChTRGVwKFNVLCBLaW5kLCBBT0xhdGVuY3ksIC8qUmVnPSovICpBbGlhcykpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChNTy5pc0RlZigpKSB7CisgICAgICAgIC8vIEFkZCBhbnkgZGF0YSBkZXBlbmRlbmNpZXMuCisgICAgICAgIHVuc2lnbmVkIERhdGFMYXRlbmN5ID0gU1UtPkxhdGVuY3k7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVc2VMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBTVW5pdCAqVXNlU1UgPSBVc2VMaXN0W2ldOworICAgICAgICAgIGlmIChVc2VTVSA9PSBTVSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIHVuc2lnbmVkIExEYXRhTGF0ZW5jeSA9IERhdGFMYXRlbmN5OworICAgICAgICAgIC8vIE9wdGlvbmFsbHkgYWRkIGluIGEgc3BlY2lhbCBleHRyYSBsYXRlbmN5IGZvciBub2RlcyB0aGF0CisgICAgICAgICAgLy8gZmVlZCBhZGRyZXNzZXMuCisgICAgICAgICAgLy8gVE9ETzogRG8gdGhpcyBmb3IgcmVnaXN0ZXIgYWxpYXNlcyB0b28uCisgICAgICAgICAgLy8gVE9ETzogUGVyaGFwcyB3ZSBzaG91bGQgZ2V0IHJpZCBvZgorICAgICAgICAgIC8vIFNwZWNpYWxBZGRyZXNzTGF0ZW5jeSBhbmQganVzdCBtb3ZlIHRoaXMgaW50bworICAgICAgICAgIC8vIGFkanVzdFNjaGVkRGVwZW5kZW5jeSBmb3IgdGhlIHRhcmdldHMgdGhhdCBjYXJlIGFib3V0IGl0LgorICAgICAgICAgIGlmIChTcGVjaWFsQWRkcmVzc0xhdGVuY3kgIT0gMCAmJiAhVW5pdExhdGVuY2llcykgeworICAgICAgICAgICAgTWFjaGluZUluc3RyICpVc2VNSSA9IFVzZVNVLT5nZXRJbnN0cigpOworICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZVc2VUSUQgPSBVc2VNSS0+Z2V0RGVzYygpOworICAgICAgICAgICAgaW50IFJlZ1VzZUluZGV4ID0gVXNlTUktPmZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgoUmVnKTsKKyAgICAgICAgICAgIGFzc2VydChSZWdVc2VJbmRleCA+PSAwICYmICJVc2VNSSBkb2VzbidzIHVzZSByZWdpc3RlciEiKTsKKyAgICAgICAgICAgIGlmICgoVXNlVElELm1heUxvYWQoKSB8fCBVc2VUSUQubWF5U3RvcmUoKSkgJiYKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpUmVnVXNlSW5kZXggPCBVc2VUSUQuZ2V0TnVtT3BlcmFuZHMoKSAmJgorICAgICAgICAgICAgICAgIFVzZVRJRC5PcEluZm9bUmVnVXNlSW5kZXhdLmlzTG9va3VwUHRyUmVnQ2xhc3MoKSkKKyAgICAgICAgICAgICAgTERhdGFMYXRlbmN5ICs9IFNwZWNpYWxBZGRyZXNzTGF0ZW5jeTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gQWRqdXN0IHRoZSBkZXBlbmRlbmNlIGxhdGVuY3kgdXNpbmcgb3BlcmFuZCBkZWYvdXNlCisgICAgICAgICAgLy8gaW5mb3JtYXRpb24gKGlmIGFueSksIGFuZCB0aGVuIGFsbG93IHRoZSB0YXJnZXQgdG8KKyAgICAgICAgICAvLyBwZXJmb3JtIGl0cyBvd24gYWRqdXN0bWVudHMuCisgICAgICAgICAgY29uc3QgU0RlcCYgZGVwID0gU0RlcChTVSwgU0RlcDo6RGF0YSwgTERhdGFMYXRlbmN5LCBSZWcpOworICAgICAgICAgIGlmICghVW5pdExhdGVuY2llcykgeworICAgICAgICAgICAgQ29tcHV0ZU9wZXJhbmRMYXRlbmN5KFNVLCBVc2VTVSwgY29uc3RfY2FzdDxTRGVwICY+KGRlcCkpOworICAgICAgICAgICAgU1QuYWRqdXN0U2NoZWREZXBlbmRlbmN5KFNVLCBVc2VTVSwgY29uc3RfY2FzdDxTRGVwICY+KGRlcCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBVc2VTVS0+YWRkUHJlZChkZXApOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqQWxpYXM7ICsrQWxpYXMpIHsKKyAgICAgICAgICBzdGQ6OnZlY3RvcjxTVW5pdCAqPiAmVXNlTGlzdCA9IFVzZXNbKkFsaWFzXTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVXNlTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgICBTVW5pdCAqVXNlU1UgPSBVc2VMaXN0W2ldOworICAgICAgICAgICAgaWYgKFVzZVNVID09IFNVKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNvbnN0IFNEZXAmIGRlcCA9IFNEZXAoU1UsIFNEZXA6OkRhdGEsIERhdGFMYXRlbmN5LCAqQWxpYXMpOworICAgICAgICAgICAgaWYgKCFVbml0TGF0ZW5jaWVzKSB7CisgICAgICAgICAgICAgIENvbXB1dGVPcGVyYW5kTGF0ZW5jeShTVSwgVXNlU1UsIGNvbnN0X2Nhc3Q8U0RlcCAmPihkZXApKTsKKyAgICAgICAgICAgICAgU1QuYWRqdXN0U2NoZWREZXBlbmRlbmN5KFNVLCBVc2VTVSwgY29uc3RfY2FzdDxTRGVwICY+KGRlcCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXNlU1UtPmFkZFByZWQoZGVwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBhIGRlZiBpcyBnb2luZyB0byB3cmFwIGJhY2sgYXJvdW5kIHRvIHRoZSB0b3Agb2YgdGhlIGxvb3AsCisgICAgICAgIC8vIGJhY2tzY2hlZHVsZSBpdC4KKyAgICAgICAgaWYgKCFVbml0TGF0ZW5jaWVzICYmIERlZkxpc3QuZW1wdHkoKSkgeworICAgICAgICAgIExvb3BEZXBlbmRlbmNpZXM6Okxvb3BEZXBzOjppdGVyYXRvciBJID0gTG9vcFJlZ3MuRGVwcy5maW5kKFJlZyk7CisgICAgICAgICAgaWYgKEkgIT0gTG9vcFJlZ3MuRGVwcy5lbmQoKSkgeworICAgICAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgKlVzZU1PID0gSS0+c2Vjb25kLmZpcnN0OworICAgICAgICAgICAgdW5zaWduZWQgQ291bnQgPSBJLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpVc2VNSSA9IFVzZU1PLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIFVzZU1PSWR4ID0gVXNlTU8gLSAmVXNlTUktPmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlVzZVRJRCA9IFVzZU1JLT5nZXREZXNjKCk7CisgICAgICAgICAgICAvLyBUT0RPOiBJZiB3ZSBrbmV3IHRoZSB0b3RhbCBkZXB0aCBvZiB0aGUgcmVnaW9uIGhlcmUsIHdlIGNvdWxkCisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHdob2xlIGxvb3AgaXMgaW5zaWRlIHRoZSByZWdpb24gYnV0CisgICAgICAgICAgICAvLyBpcyBsYXJnZSBlbm91Z2ggdGhhdCB0aGUgaXNTY2hlZHVsZUhpZ2ggdHJpY2sgaXNuJ3QgbmVlZGVkLgorICAgICAgICAgICAgaWYgKFVzZU1PSWR4IDwgVXNlVElELmdldE51bU9wZXJhbmRzKCkpIHsKKyAgICAgICAgICAgICAgLy8gQ3VycmVudGx5LCB3ZSBvbmx5IHN1cHBvcnQgc2NoZWR1bGluZyByZWdpb25zIGNvbnNpc3Rpbmcgb2YKKyAgICAgICAgICAgICAgLy8gc2luZ2xlIGJhc2ljIGJsb2Nrcy4gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBpbgorICAgICAgICAgICAgICAvLyB0aGUgc2FtZSByZWdpb24gYnkgY2hlY2tpbmcgdG8gc2VlIGlmIGl0IGhhcyB0aGUgc2FtZSBwYXJlbnQuCisgICAgICAgICAgICAgIGlmIChVc2VNSS0+Z2V0UGFyZW50KCkgIT0gTUktPmdldFBhcmVudCgpKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgTGF0ZW5jeSA9IFNVLT5MYXRlbmN5OworICAgICAgICAgICAgICAgIGlmIChVc2VUSUQuT3BJbmZvW1VzZU1PSWR4XS5pc0xvb2t1cFB0clJlZ0NsYXNzKCkpCisgICAgICAgICAgICAgICAgICBMYXRlbmN5ICs9IFNwZWNpYWxBZGRyZXNzTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgd2lsZCBndWVzcyBhcyB0byB0aGUgcG9ydGlvbiBvZiB0aGUgbGF0ZW5jeSB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgb3ZlcmxhcHBlZCBieSB3b3JrIGRvbmUgb3V0c2lkZSB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxpbmcgcmVnaW9uLgorICAgICAgICAgICAgICAgIExhdGVuY3kgLT0gc3RkOjptaW4oTGF0ZW5jeSwgQ291bnQpOworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXJ0aWZpY2FsIGVkZ2UuCisgICAgICAgICAgICAgICAgRXhpdFNVLmFkZFByZWQoU0RlcChTVSwgU0RlcDo6T3JkZXIsIExhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlJlZz0qLzAsIC8qaXNOb3JtYWxNZW1vcnk9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNNdXN0QWxpYXM9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNBcnRpZmljaWFsPSovdHJ1ZSkpOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNwZWNpYWxBZGRyZXNzTGF0ZW5jeSA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VUSUQuT3BJbmZvW1VzZU1PSWR4XS5pc0xvb2t1cFB0clJlZ0NsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZW50aXJlIGxvb3AgYm9keSBpcyB3aXRoaW4gdGhlIGN1cnJlbnQgc2NoZWR1bGluZyByZWdpb24KKyAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGxhdGVuY3kgb2YgdGhpcyBvcGVyYXRpb24gaXMgYXNzdW1lZCB0byBiZSBncmVhdGVyCisgICAgICAgICAgICAgICAgLy8gdGhhbiB0aGUgbGF0ZW5jeSBvZiB0aGUgbG9vcC4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZWN1cnNpdmVseSBtYXJrIGRhdGEtZWRnZSBwcmVkZWNlc3NvcnMgYXMKKyAgICAgICAgICAgICAgICAvLyAgICAgICBpc1NjaGVkdWxlSGlnaCB0b28uCisgICAgICAgICAgICAgICAgU1UtPmlzU2NoZWR1bGVIaWdoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9vcFJlZ3MuRGVwcy5lcmFzZShJKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBVc2VMaXN0LmNsZWFyKCk7CisgICAgICAgIGlmICghTU8uaXNEZWFkKCkpCisgICAgICAgICAgRGVmTGlzdC5jbGVhcigpOworICAgICAgICBEZWZMaXN0LnB1c2hfYmFjayhTVSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBVc2VMaXN0LnB1c2hfYmFjayhTVSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQWRkIGNoYWluIGRlcGVuZGVuY2llcy4KKyAgICAvLyBDaGFpbiBkZXBlbmRlbmNpZXMgdXNlZCB0byBlbmZvcmNlIG1lbW9yeSBvcmRlciBzaG91bGQgaGF2ZQorICAgIC8vIGxhdGVuY3kgb2YgMCAoZXhjZXB0IGZvciB0cnVlIGRlcGVuZGVuY3kgb2YgU3RvcmUgZm9sbG93ZWQgYnkKKyAgICAvLyBhbGlhc2VkIExvYWQuLi4gd2UgZXN0aW1hdGUgdGhhdCB3aXRoIGEgc2luZ2xlIGN5Y2xlIG9mIGxhdGVuY3kKKyAgICAvLyBhc3N1bWluZyB0aGUgaGFyZHdhcmUgd2lsbCBieXBhc3MpCisgICAgLy8gTm90ZSB0aGF0IGlzU3RvcmVUb1N0YWNrU2xvdCBhbmQgaXNMb2FkRnJvbVN0YWNrU0xvdCBhcmUgbm90IHVzYWJsZQorICAgIC8vIGFmdGVyIHN0YWNrIHNsb3RzIGFyZSBsb3dlcmVkIHRvIGFjdHVhbCBhZGRyZXNzZXMuCisgICAgLy8gVE9ETzogVXNlIGFuIEFsaWFzQW5hbHlzaXMgYW5kIGRvIHJlYWwgYWxpYXMtYW5hbHlzaXMgcXVlcmllcywgYW5kCisgICAgLy8gcHJvZHVjZSBtb3JlIHByZWNpc2UgZGVwZW5kZW5jZSBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgU1RPUkVfTE9BRF9MQVRFTkNZIDEKKyAgICB1bnNpZ25lZCBUcnVlTWVtT3JkZXJMYXRlbmN5ID0gMDsKKyAgICBpZiAoVElELmlzQ2FsbCgpIHx8IFRJRC5oYXNVbm1vZGVsZWRTaWRlRWZmZWN0cygpIHx8CisgICAgICAgIChNSS0+aGFzVm9sYXRpbGVNZW1vcnlSZWYoKSAmJiAKKyAgICAgICAgICghVElELm1heUxvYWQoKSB8fCAhTUktPmlzSW52YXJpYW50TG9hZChBQSkpKSkgeworICAgICAgLy8gQmUgY29uc2VydmF0aXZlIHdpdGggdGhlc2UgYW5kIGFkZCBkZXBlbmRlbmNpZXMgb24gYWxsIG1lbW9yeQorICAgICAgLy8gcmVmZXJlbmNlcywgZXZlbiB0aG9zZSB0aGF0IGFyZSBrbm93biB0byBub3QgYWxpYXMuCisgICAgICBmb3IgKHN0ZDo6bWFwPGNvbnN0IFZhbHVlICosIFNVbml0ICo+OjppdGVyYXRvciBJID0gCisgICAgICAgICAgICAgTm9uQWxpYXNNZW1EZWZzLmJlZ2luKCksIEUgPSBOb25BbGlhc01lbURlZnMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIEktPnNlY29uZC0+YWRkUHJlZChTRGVwKFNVLCBTRGVwOjpPcmRlciwgLypMYXRlbmN5PSovMCkpOworICAgICAgfQorICAgICAgZm9yIChzdGQ6Om1hcDxjb25zdCBWYWx1ZSAqLCBzdGQ6OnZlY3RvcjxTVW5pdCAqPiA+OjppdGVyYXRvciBJID0KKyAgICAgICAgICAgICBOb25BbGlhc01lbVVzZXMuYmVnaW4oKSwgRSA9IE5vbkFsaWFzTWVtVXNlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEktPnNlY29uZC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIEktPnNlY29uZFtpXS0+YWRkUHJlZChTRGVwKFNVLCBTRGVwOjpPcmRlciwgVHJ1ZU1lbU9yZGVyTGF0ZW5jeSkpOworICAgICAgfQorICAgICAgTm9uQWxpYXNNZW1EZWZzLmNsZWFyKCk7CisgICAgICBOb25BbGlhc01lbVVzZXMuY2xlYXIoKTsKKyAgICAgIC8vIEFkZCBTVSB0byB0aGUgYmFycmllciBjaGFpbi4KKyAgICAgIGlmIChCYXJyaWVyQ2hhaW4pCisgICAgICAgIEJhcnJpZXJDaGFpbi0+YWRkUHJlZChTRGVwKFNVLCBTRGVwOjpPcmRlciwgLypMYXRlbmN5PSovMCkpOworICAgICAgQmFycmllckNoYWluID0gU1U7CisKKyAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgIG5ld19hbGlhc19jaGFpbjoKKyAgICAgIC8vIENoYWluIGFsbCBwb3NzaWJseSBhbGlhc2luZyBtZW1vcnkgcmVmZXJlbmNlcyB0aG91Z2ggU1UuCisgICAgICBpZiAoQWxpYXNDaGFpbikKKyAgICAgICAgQWxpYXNDaGFpbi0+YWRkUHJlZChTRGVwKFNVLCBTRGVwOjpPcmRlciwgLypMYXRlbmN5PSovMCkpOworICAgICAgQWxpYXNDaGFpbiA9IFNVOworICAgICAgZm9yICh1bnNpZ25lZCBrID0gMCwgbSA9IFBlbmRpbmdMb2Fkcy5zaXplKCk7IGsgIT0gbTsgKytrKQorICAgICAgICBQZW5kaW5nTG9hZHNba10tPmFkZFByZWQoU0RlcChTVSwgU0RlcDo6T3JkZXIsIFRydWVNZW1PcmRlckxhdGVuY3kpKTsKKyAgICAgIGZvciAoc3RkOjptYXA8Y29uc3QgVmFsdWUgKiwgU1VuaXQgKj46Oml0ZXJhdG9yIEkgPSBBbGlhc01lbURlZnMuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IEFsaWFzTWVtRGVmcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgSS0+c2Vjb25kLT5hZGRQcmVkKFNEZXAoU1UsIFNEZXA6Ok9yZGVyLCAvKkxhdGVuY3k9Ki8wKSk7CisgICAgICB9CisgICAgICBmb3IgKHN0ZDo6bWFwPGNvbnN0IFZhbHVlICosIHN0ZDo6dmVjdG9yPFNVbml0ICo+ID46Oml0ZXJhdG9yIEkgPQorICAgICAgICAgICBBbGlhc01lbVVzZXMuYmVnaW4oKSwgRSA9IEFsaWFzTWVtVXNlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEktPnNlY29uZC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIEktPnNlY29uZFtpXS0+YWRkUHJlZChTRGVwKFNVLCBTRGVwOjpPcmRlciwgVHJ1ZU1lbU9yZGVyTGF0ZW5jeSkpOworICAgICAgfQorICAgICAgUGVuZGluZ0xvYWRzLmNsZWFyKCk7CisgICAgICBBbGlhc01lbURlZnMuY2xlYXIoKTsKKyAgICAgIEFsaWFzTWVtVXNlcy5jbGVhcigpOworICAgIH0gZWxzZSBpZiAoVElELm1heVN0b3JlKCkpIHsKKyAgICAgIGJvb2wgTWF5QWxpYXMgPSB0cnVlOworICAgICAgVHJ1ZU1lbU9yZGVyTGF0ZW5jeSA9IFNUT1JFX0xPQURfTEFURU5DWTsKKyAgICAgIGlmIChjb25zdCBWYWx1ZSAqViA9IGdldFVuZGVybHlpbmdPYmplY3RGb3JJbnN0cihNSSwgTUZJLCBNYXlBbGlhcykpIHsKKyAgICAgICAgLy8gQSBzdG9yZSB0byBhIHNwZWNpZmljIFBzZXVkb1NvdXJjZVZhbHVlLiBBZGQgcHJlY2lzZSBkZXBlbmRlbmNpZXMuCisgICAgICAgIC8vIFJlY29yZCB0aGUgZGVmIGluIE1lbURlZnMsIGZpcnN0IGFkZGluZyBhIGRlcCBpZiB0aGVyZSBpcworICAgICAgICAvLyBhbiBleGlzdGluZyBkZWYuCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IFZhbHVlICosIFNVbml0ICo+OjppdGVyYXRvciBJID0gCisgICAgICAgICAgKChNYXlBbGlhcykgPyBBbGlhc01lbURlZnMuZmluZChWKSA6IE5vbkFsaWFzTWVtRGVmcy5maW5kKFYpKTsKKyAgICAgICAgc3RkOjptYXA8Y29uc3QgVmFsdWUgKiwgU1VuaXQgKj46Oml0ZXJhdG9yIElFID0gCisgICAgICAgICAgKChNYXlBbGlhcykgPyBBbGlhc01lbURlZnMuZW5kKCkgOiBOb25BbGlhc01lbURlZnMuZW5kKCkpOworICAgICAgICBpZiAoSSAhPSBJRSkgeworICAgICAgICAgIEktPnNlY29uZC0+YWRkUHJlZChTRGVwKFNVLCBTRGVwOjpPcmRlciwgLypMYXRlbmN5PSovMCwgLypSZWc9Ki8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNOb3JtYWxNZW1vcnk9Ki90cnVlKSk7CisgICAgICAgICAgSS0+c2Vjb25kID0gU1U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKE1heUFsaWFzKQorICAgICAgICAgICAgQWxpYXNNZW1EZWZzW1ZdID0gU1U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgTm9uQWxpYXNNZW1EZWZzW1ZdID0gU1U7CisgICAgICAgIH0KKyAgICAgICAgLy8gSGFuZGxlIHRoZSB1c2VzIGluIE1lbVVzZXMsIGlmIHRoZXJlIGFyZSBhbnkuCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IFZhbHVlICosIHN0ZDo6dmVjdG9yPFNVbml0ICo+ID46Oml0ZXJhdG9yIEogPQorICAgICAgICAgICgoTWF5QWxpYXMpID8gQWxpYXNNZW1Vc2VzLmZpbmQoVikgOiBOb25BbGlhc01lbVVzZXMuZmluZChWKSk7CisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IFZhbHVlICosIHN0ZDo6dmVjdG9yPFNVbml0ICo+ID46Oml0ZXJhdG9yIEpFID0KKyAgICAgICAgICAoKE1heUFsaWFzKSA/IEFsaWFzTWVtVXNlcy5lbmQoKSA6IE5vbkFsaWFzTWVtVXNlcy5lbmQoKSk7CisgICAgICAgIGlmIChKICE9IEpFKSB7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEotPnNlY29uZC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgSi0+c2Vjb25kW2ldLT5hZGRQcmVkKFNEZXAoU1UsIFNEZXA6Ok9yZGVyLCBUcnVlTWVtT3JkZXJMYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypSZWc9Ki8wLCAvKmlzTm9ybWFsTWVtb3J5PSovdHJ1ZSkpOworICAgICAgICAgIEotPnNlY29uZC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGlmIChNYXlBbGlhcykgeworICAgICAgICAgIC8vIEFkZCBkZXBlbmRlbmNpZXMgZnJvbSBhbGwgdGhlIFBlbmRpbmdMb2FkcywgaS5lLiBsb2FkcworICAgICAgICAgIC8vIHdpdGggbm8gdW5kZXJseWluZyBvYmplY3QuCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBrID0gMCwgbSA9IFBlbmRpbmdMb2Fkcy5zaXplKCk7IGsgIT0gbTsgKytrKQorICAgICAgICAgICAgUGVuZGluZ0xvYWRzW2tdLT5hZGRQcmVkKFNEZXAoU1UsIFNEZXA6Ok9yZGVyLCBUcnVlTWVtT3JkZXJMYXRlbmN5KSk7CisgICAgICAgICAgLy8gQWRkIGRlcGVuZGVuY2Ugb24gYWxpYXMgY2hhaW4sIGlmIG5lZWRlZC4KKyAgICAgICAgICBpZiAoQWxpYXNDaGFpbikKKyAgICAgICAgICAgIEFsaWFzQ2hhaW4tPmFkZFByZWQoU0RlcChTVSwgU0RlcDo6T3JkZXIsIC8qTGF0ZW5jeT0qLzApKTsKKyAgICAgICAgfQorICAgICAgICAvLyBBZGQgZGVwZW5kZW5jZSBvbiBiYXJyaWVyIGNoYWluLCBpZiBuZWVkZWQuCisgICAgICAgIGlmIChCYXJyaWVyQ2hhaW4pCisgICAgICAgICAgQmFycmllckNoYWluLT5hZGRQcmVkKFNEZXAoU1UsIFNEZXA6Ok9yZGVyLCAvKkxhdGVuY3k9Ki8wKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBUcmVhdCBhbGwgb3RoZXIgc3RvcmVzIGNvbnNlcnZhdGl2ZWx5LgorICAgICAgICBnb3RvIG5ld19hbGlhc19jaGFpbjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFRJRC5tYXlMb2FkKCkpIHsKKyAgICAgIGJvb2wgTWF5QWxpYXMgPSB0cnVlOworICAgICAgVHJ1ZU1lbU9yZGVyTGF0ZW5jeSA9IDA7CisgICAgICBpZiAoTUktPmlzSW52YXJpYW50TG9hZChBQSkpIHsKKyAgICAgICAgLy8gSW52YXJpYW50IGxvYWQsIG5vIGNoYWluIGRlcGVuZGVuY2llcyBuZWVkZWQhCisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY29uc3QgVmFsdWUgKlYgPSAKKyAgICAgICAgICAgIGdldFVuZGVybHlpbmdPYmplY3RGb3JJbnN0cihNSSwgTUZJLCBNYXlBbGlhcykpIHsKKyAgICAgICAgICAvLyBBIGxvYWQgZnJvbSBhIHNwZWNpZmljIFBzZXVkb1NvdXJjZVZhbHVlLiBBZGQgcHJlY2lzZSBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgc3RkOjptYXA8Y29uc3QgVmFsdWUgKiwgU1VuaXQgKj46Oml0ZXJhdG9yIEkgPSAKKyAgICAgICAgICAgICgoTWF5QWxpYXMpID8gQWxpYXNNZW1EZWZzLmZpbmQoVikgOiBOb25BbGlhc01lbURlZnMuZmluZChWKSk7CisgICAgICAgICAgc3RkOjptYXA8Y29uc3QgVmFsdWUgKiwgU1VuaXQgKj46Oml0ZXJhdG9yIElFID0gCisgICAgICAgICAgICAoKE1heUFsaWFzKSA/IEFsaWFzTWVtRGVmcy5lbmQoKSA6IE5vbkFsaWFzTWVtRGVmcy5lbmQoKSk7CisgICAgICAgICAgaWYgKEkgIT0gSUUpCisgICAgICAgICAgICBJLT5zZWNvbmQtPmFkZFByZWQoU0RlcChTVSwgU0RlcDo6T3JkZXIsIC8qTGF0ZW5jeT0qLzAsIC8qUmVnPSovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNOb3JtYWxNZW1vcnk9Ki90cnVlKSk7CisgICAgICAgICAgaWYgKE1heUFsaWFzKQorICAgICAgICAgICAgQWxpYXNNZW1Vc2VzW1ZdLnB1c2hfYmFjayhTVSk7CisgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIE5vbkFsaWFzTWVtVXNlc1tWXS5wdXNoX2JhY2soU1UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEEgbG9hZCB3aXRoIG5vIHVuZGVybHlpbmcgb2JqZWN0LiBEZXBlbmQgb24gYWxsCisgICAgICAgICAgLy8gcG90ZW50aWFsbHkgYWxpYXNpbmcgc3RvcmVzLgorICAgICAgICAgIGZvciAoc3RkOjptYXA8Y29uc3QgVmFsdWUgKiwgU1VuaXQgKj46Oml0ZXJhdG9yIEkgPSAKKyAgICAgICAgICAgICAgICAgQWxpYXNNZW1EZWZzLmJlZ2luKCksIEUgPSBBbGlhc01lbURlZnMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICAgICAgSS0+c2Vjb25kLT5hZGRQcmVkKFNEZXAoU1UsIFNEZXA6Ok9yZGVyLCAvKkxhdGVuY3k9Ki8wKSk7CisgICAgICAgICAgCisgICAgICAgICAgUGVuZGluZ0xvYWRzLnB1c2hfYmFjayhTVSk7CisgICAgICAgICAgTWF5QWxpYXMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBBZGQgZGVwZW5kZW5jaWVzIG9uIGFsaWFzIGFuZCBiYXJyaWVyIGNoYWlucywgaWYgbmVlZGVkLgorICAgICAgICBpZiAoTWF5QWxpYXMgJiYgQWxpYXNDaGFpbikKKyAgICAgICAgICBBbGlhc0NoYWluLT5hZGRQcmVkKFNEZXAoU1UsIFNEZXA6Ok9yZGVyLCAvKkxhdGVuY3k9Ki8wKSk7CisgICAgICAgIGlmIChCYXJyaWVyQ2hhaW4pCisgICAgICAgICAgQmFycmllckNoYWluLT5hZGRQcmVkKFNEZXAoU1UsIFNEZXA6Ok9yZGVyLCAvKkxhdGVuY3k9Ki8wKSk7CisgICAgICB9IAorICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwLCBlID0gVFJJLT5nZXROdW1SZWdzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgRGVmc1tpXS5jbGVhcigpOworICAgIFVzZXNbaV0uY2xlYXIoKTsKKyAgfQorICBQZW5kaW5nTG9hZHMuY2xlYXIoKTsKK30KKwordm9pZCBTY2hlZHVsZURBR0luc3Ryczo6RmluaXNoQmxvY2soKSB7CisgIC8vIE5vdGhpbmcgdG8gZG8uCit9CisKK3ZvaWQgU2NoZWR1bGVEQUdJbnN0cnM6OkNvbXB1dGVMYXRlbmN5KFNVbml0ICpTVSkgeworICBjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgJkluc3RySXRpbnMgPSBUTS5nZXRJbnN0ckl0aW5lcmFyeURhdGEoKTsKKworICAvLyBDb21wdXRlIHRoZSBsYXRlbmN5IGZvciB0aGUgbm9kZS4KKyAgU1UtPkxhdGVuY3kgPQorICAgIEluc3RySXRpbnMuZ2V0U3RhZ2VMYXRlbmN5KFNVLT5nZXRJbnN0cigpLT5nZXREZXNjKCkuZ2V0U2NoZWRDbGFzcygpKTsKKworICAvLyBTaW1wbGlzdGljIHRhcmdldC1pbmRlcGVuZGVudCBoZXVyaXN0aWM6IGFzc3VtZSB0aGF0IGxvYWRzIHRha2UKKyAgLy8gZXh0cmEgdGltZS4KKyAgaWYgKEluc3RySXRpbnMuaXNFbXB0eSgpKQorICAgIGlmIChTVS0+Z2V0SW5zdHIoKS0+Z2V0RGVzYygpLm1heUxvYWQoKSkKKyAgICAgIFNVLT5MYXRlbmN5ICs9IDI7Cit9CisKK3ZvaWQgU2NoZWR1bGVEQUdJbnN0cnM6OkNvbXB1dGVPcGVyYW5kTGF0ZW5jeShTVW5pdCAqRGVmLCBTVW5pdCAqVXNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRGVwJiBkZXApIGNvbnN0IHsKKyAgY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICZJbnN0ckl0aW5zID0gVE0uZ2V0SW5zdHJJdGluZXJhcnlEYXRhKCk7CisgIGlmIChJbnN0ckl0aW5zLmlzRW1wdHkoKSkKKyAgICByZXR1cm47CisgIAorICAvLyBGb3IgYSBkYXRhIGRlcGVuZGVuY3kgd2l0aCBhIGtub3duIHJlZ2lzdGVyLi4uCisgIGlmICgoZGVwLmdldEtpbmQoKSAhPSBTRGVwOjpEYXRhKSB8fCAoZGVwLmdldFJlZygpID09IDApKQorICAgIHJldHVybjsKKworICBjb25zdCB1bnNpZ25lZCBSZWcgPSBkZXAuZ2V0UmVnKCk7CisKKyAgLy8gLi4uIGZpbmQgdGhlIGRlZmluaXRpb24gb2YgdGhlIHJlZ2lzdGVyIGluIHRoZSBkZWZpbmluZworICAvLyBpbnN0cnVjdGlvbgorICBNYWNoaW5lSW5zdHIgKkRlZk1JID0gRGVmLT5nZXRJbnN0cigpOworICBpbnQgRGVmSWR4ID0gRGVmTUktPmZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgoUmVnKTsKKyAgaWYgKERlZklkeCAhPSAtMSkgeworICAgIGludCBEZWZDeWNsZSA9IEluc3RySXRpbnMuZ2V0T3BlcmFuZEN5Y2xlKERlZk1JLT5nZXREZXNjKCkuZ2V0U2NoZWRDbGFzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZklkeCk7CisgICAgaWYgKERlZkN5Y2xlID49IDApIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqVXNlTUkgPSBVc2UtPmdldEluc3RyKCk7CisgICAgICBjb25zdCB1bnNpZ25lZCBVc2VDbGFzcyA9IFVzZU1JLT5nZXREZXNjKCkuZ2V0U2NoZWRDbGFzcygpOworCisgICAgICAvLyBGb3IgYWxsIHVzZXMgb2YgdGhlIHJlZ2lzdGVyLCBjYWxjdWxhdGUgdGhlIG1heG1pbXVtIGxhdGVuY3kKKyAgICAgIGludCBMYXRlbmN5ID0gLTE7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVXNlTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IFVzZU1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzVXNlKCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIHVuc2lnbmVkIE1PUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICAgIGlmIChNT1JlZyAhPSBSZWcpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaW50IFVzZUN5Y2xlID0gSW5zdHJJdGlucy5nZXRPcGVyYW5kQ3ljbGUoVXNlQ2xhc3MsIGkpOworICAgICAgICBpZiAoVXNlQ3ljbGUgPj0gMCkKKyAgICAgICAgICBMYXRlbmN5ID0gc3RkOjptYXgoTGF0ZW5jeSwgRGVmQ3ljbGUgLSBVc2VDeWNsZSArIDEpOworICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBmb3VuZCBhIGxhdGVuY3ksIHRoZW4gcmVwbGFjZSB0aGUgZXhpc3RpbmcgZGVwZW5kZW5jZSBsYXRlbmN5LgorICAgICAgaWYgKExhdGVuY3kgPj0gMCkKKyAgICAgICAgZGVwLnNldExhdGVuY3koTGF0ZW5jeSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU2NoZWR1bGVEQUdJbnN0cnM6OmR1bXBOb2RlKGNvbnN0IFNVbml0ICpTVSkgY29uc3QgeworICBTVS0+Z2V0SW5zdHIoKS0+ZHVtcCgpOworfQorCitzdGQ6OnN0cmluZyBTY2hlZHVsZURBR0luc3Ryczo6Z2V0R3JhcGhOb2RlTGFiZWwoY29uc3QgU1VuaXQgKlNVKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHM7CisgIHJhd19zdHJpbmdfb3N0cmVhbSBvc3Mocyk7CisgIGlmIChTVSA9PSAmRW50cnlTVSkKKyAgICBvc3MgPDwgIjxlbnRyeT4iOworICBlbHNlIGlmIChTVSA9PSAmRXhpdFNVKQorICAgIG9zcyA8PCAiPGV4aXQ+IjsKKyAgZWxzZQorICAgIFNVLT5nZXRJbnN0cigpLT5wcmludChvc3MpOworICByZXR1cm4gb3NzLnN0cigpOworfQorCisvLyBFbWl0U2NoZWR1bGUgLSBFbWl0IHRoZSBtYWNoaW5lIGNvZGUgaW4gc2NoZWR1bGVkIG9yZGVyLgorTWFjaGluZUJhc2ljQmxvY2sgKlNjaGVkdWxlREFHSW5zdHJzOjpFbWl0U2NoZWR1bGUoKSB7CisgIC8vIEZvciBNYWNoaW5lSW5zdHItYmFzZWQgc2NoZWR1bGluZywgd2UncmUgcmVzY2hlZHVsaW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4KKyAgLy8gdGhlIGJsb2NrLCBzbyBzdGFydCBieSByZW1vdmluZyB0aGVtIGZyb20gdGhlIGJsb2NrLgorICB3aGlsZSAoQmVnaW4gIT0gSW5zZXJ0UG9zKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCZWdpbjsKKyAgICArK0JlZ2luOworICAgIEJCLT5yZW1vdmUoSSk7CisgIH0KKworICAvLyBGaXJzdCByZWluc2VydCBhbnkgcmVtYWluaW5nIGRlYnVnX3ZhbHVlczsgdGhlc2UgYXJlIGVpdGhlciBjb25zdGFudHMsCisgIC8vIG9yIHJlZmVyIHRvIGxpdmUtaW4gcmVnaXN0ZXJzLiAgVGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2sgaXMgdGhlIHJpZ2h0CisgIC8vIHBsYWNlIGZvciB0aGUgbGF0dGVyLiAgVGhlIGZvcm1lciBtaWdodCByZWFzb25hYmx5IGJlIHBsYWNlZCBlbHNld2hlcmUKKyAgLy8gdXNpbmcgc29tZSBraW5kIG9mIG9yZGVyaW5nIGFsZ29yaXRobSwgYnV0IHJpZ2h0IG5vdyBpdCBkb2Vzbid0IG1hdHRlci4KKyAgZm9yIChpbnQgaSA9IERiZ1ZhbHVlVmVjLnNpemUoKS0xOyBpPj0wOyAtLWkpCisgICAgaWYgKERiZ1ZhbHVlVmVjW2ldKQorICAgICAgQkItPmluc2VydChJbnNlcnRQb3MsIERiZ1ZhbHVlVmVjW2ldKTsKKworICAvLyBUaGVuIHJlLWluc2VydCB0aGVtIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc2NoZWR1bGUuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTZXF1ZW5jZS5zaXplKCk7IGkgIT0gZTsgaSsrKSB7CisgICAgU1VuaXQgKlNVID0gU2VxdWVuY2VbaV07CisgICAgaWYgKCFTVSkgeworICAgICAgLy8gTnVsbCBTVW5pdCogaXMgYSBub29wLgorICAgICAgRW1pdE5vb3AoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEJCLT5pbnNlcnQoSW5zZXJ0UG9zLCBTVS0+Z2V0SW5zdHIoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNVLT5EYmdJbnN0ckxpc3Quc2l6ZSgpIDsgaSA8IGUgOyArK2kpCisgICAgICBCQi0+aW5zZXJ0KEluc2VydFBvcywgU1UtPkRiZ0luc3RyTGlzdFtpXSk7CisgIH0KKworICAvLyBVcGRhdGUgdGhlIEJlZ2luIGl0ZXJhdG9yLCBhcyB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIGJsb2NrCisgIC8vIG1heSBoYXZlIGJlZW4gc2NoZWR1bGVkIGxhdGVyLgorICBpZiAoIURiZ1ZhbHVlVmVjLmVtcHR5KCkpIHsKKyAgICBmb3IgKGludCBpID0gRGJnVmFsdWVWZWMuc2l6ZSgpLTE7IGk+PTA7IC0taSkKKyAgICAgIGlmIChEYmdWYWx1ZVZlY1tpXSE9MCkgeworICAgICAgICBCZWdpbiA9IERiZ1ZhbHVlVmVjW0RiZ1ZhbHVlVmVjLnNpemUoKS0xXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0gZWxzZSBpZiAoIVNlcXVlbmNlLmVtcHR5KCkpCisgICAgQmVnaW4gPSBTZXF1ZW5jZVswXS0+Z2V0SW5zdHIoKTsKKworICBEYmdWYWx1ZVZlYy5jbGVhcigpOworICByZXR1cm4gQkI7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TY2hlZHVsZURBR0luc3Rycy5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2NoZWR1bGVEQUdJbnN0cnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGY1NDNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2NoZWR1bGVEQUdJbnN0cnMuaApAQCAtMCwwICsxLDE5NyBAQAorLy89PS0gU2NoZWR1bGVEQUdJbnN0cnMuaCAtIE1hY2hpbmVJbnN0ciBTY2hlZHVsaW5nIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU2NoZWR1bGVEQUdJbnN0cnMgY2xhc3MsIHdoaWNoIGltcGxlbWVudHMKKy8vIHNjaGVkdWxpbmcgZm9yIGEgTWFjaGluZUluc3RyLWJhc2VkIGRlcGVuZGVuY3kgZ3JhcGguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTQ0hFRFVMRURBR0lOU1RSU19ICisjZGVmaW5lIFNDSEVEVUxFREFHSU5TVFJTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNYWNoaW5lTG9vcEluZm87CisgIGNsYXNzIE1hY2hpbmVEb21pbmF0b3JUcmVlOworCisgIC8vLyBMb29wRGVwZW5kZW5jaWVzIC0gVGhpcyBjbGFzcyBhbmFseXplcyBsb29wLW9yaWVudGVkIHJlZ2lzdGVyCisgIC8vLyBkZXBlbmRlbmNpZXMsIHdoaWNoIGFyZSB1c2VkIHRvIGd1aWRlIHNjaGVkdWxpbmcgZGVjaXNpb25zLgorICAvLy8gRm9yIGV4YW1wbGUsIGxvb3AgaW5kdWN0aW9uIHZhcmlhYmxlIGluY3JlbWVudHMgc2hvdWxkIGJlCisgIC8vLyBzY2hlZHVsZWQgYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciB0aGUgdmFyaWFibGUncyBsYXN0IHVzZS4KKyAgLy8vCisgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIExvb3BEZXBlbmRlbmNpZXMgeworICAgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAmTUxJOworICAgIGNvbnN0IE1hY2hpbmVEb21pbmF0b3JUcmVlICZNRFQ7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6cGFpcjxjb25zdCBNYWNoaW5lT3BlcmFuZCAqLCB1bnNpZ25lZD4gPgorICAgICAgTG9vcERlcHM7CisgICAgTG9vcERlcHMgRGVwczsKKworICAgIExvb3BEZXBlbmRlbmNpZXMoY29uc3QgTWFjaGluZUxvb3BJbmZvICZtbGksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRG9taW5hdG9yVHJlZSAmbWR0KSA6CisgICAgICBNTEkobWxpKSwgTURUKG1kdCkge30KKworICAgIC8vLyBWaXNpdExvb3AgLSBDbGVhciBvdXQgYW55IHByZXZpb3VzIHN0YXRlIGFuZCBhbmFseXplIHRoZSBnaXZlbiBsb29wLgorICAgIC8vLworICAgIHZvaWQgVmlzaXRMb29wKGNvbnN0IE1hY2hpbmVMb29wICpMb29wKSB7CisgICAgICBEZXBzLmNsZWFyKCk7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqSGVhZGVyID0gTG9vcC0+Z2V0SGVhZGVyKCk7CisgICAgICBTbWFsbFNldDx1bnNpZ25lZCwgOD4gTG9vcExpdmVJbnM7CisgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpsaXZlaW5faXRlcmF0b3IgTEkgPSBIZWFkZXItPmxpdmVpbl9iZWdpbigpLAorICAgICAgICAgICBMRSA9IEhlYWRlci0+bGl2ZWluX2VuZCgpOyBMSSAhPSBMRTsgKytMSSkKKyAgICAgICAgTG9vcExpdmVJbnMuaW5zZXJ0KCpMSSk7CisKKyAgICAgIGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSAqTm9kZSA9IE1EVC5nZXROb2RlKEhlYWRlcik7CisgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTm9kZS0+Z2V0QmxvY2soKTsKKyAgICAgIGFzc2VydChMb29wLT5jb250YWlucyhNQkIpICYmCisgICAgICAgICAgICAgIkxvb3AgZG9lcyBub3QgY29udGFpbiBoZWFkZXIhIik7CisgICAgICBWaXNpdFJlZ2lvbihOb2RlLCBNQkIsIExvb3AsIExvb3BMaXZlSW5zKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIFZpc2l0UmVnaW9uKGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTG9vcCAqTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsU2V0PHVuc2lnbmVkLCA4PiAmTG9vcExpdmVJbnMpIHsKKyAgICAgIHVuc2lnbmVkIENvdW50ID0gMDsKKyAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBNQkItPmJlZ2luKCksIEUgPSBNQkItPmVuZCgpOworICAgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgKk1JID0gSTsKKyAgICAgICAgaWYgKE1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNVc2UoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIHVuc2lnbmVkIE1PUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICAgICAgaWYgKExvb3BMaXZlSW5zLmNvdW50KE1PUmVnKSkKKyAgICAgICAgICAgIERlcHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE1PUmVnLCBzdGQ6Om1ha2VfcGFpcigmTU8sIENvdW50KSkpOworICAgICAgICB9CisgICAgICAgICsrQ291bnQ7IC8vIE5vdCBldmVyeSBpdGVyYXRpb24gZHVlIHRvIGRiZ192YWx1ZSBhYm92ZS4KKyAgICAgIH0KKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZURvbVRyZWVOb2RlKj4gJkNoaWxkcmVuID0gTm9kZS0+Z2V0Q2hpbGRyZW4oKTsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8TWFjaGluZURvbVRyZWVOb2RlKj46OmNvbnN0X2l0ZXJhdG9yIEkgPQorICAgICAgICAgICBDaGlsZHJlbi5iZWdpbigpLCBFID0gQ2hpbGRyZW4uZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSAqQ2hpbGROb2RlID0gKkk7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpDaGlsZEJsb2NrID0gQ2hpbGROb2RlLT5nZXRCbG9jaygpOworICAgICAgICBpZiAoTG9vcC0+Y29udGFpbnMoQ2hpbGRCbG9jaykpCisgICAgICAgICAgVmlzaXRSZWdpb24oQ2hpbGROb2RlLCBDaGlsZEJsb2NrLCBMb29wLCBMb29wTGl2ZUlucyk7CisgICAgICB9CisgICAgfQorICB9OworCisgIC8vLyBTY2hlZHVsZURBR0luc3RycyAtIEEgU2NoZWR1bGVEQUcgc3ViY2xhc3MgZm9yIHNjaGVkdWxpbmcgbGlzdHMgb2YKKyAgLy8vIE1hY2hpbmVJbnN0cnMuCisgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIFNjaGVkdWxlREFHSW5zdHJzIDogcHVibGljIFNjaGVkdWxlREFHIHsKKyAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8gJk1MSTsKKyAgICBjb25zdCBNYWNoaW5lRG9taW5hdG9yVHJlZSAmTURUOworICAgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSTsKKworICAgIC8vLyBEZWZzLCBVc2VzIC0gUmVtZW1iZXIgd2hlcmUgZGVmcyBhbmQgdXNlcyBvZiBlYWNoIHBoeXNpY2FsIHJlZ2lzdGVyCisgICAgLy8vIGFyZSBhcyB3ZSBpdGVyYXRlIHVwd2FyZCB0aHJvdWdoIHRoZSBpbnN0cnVjdGlvbnMuIFRoaXMgaXMgYWxsb2NhdGVkCisgICAgLy8vIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGUgQnVpbGRTY2hlZEdyYXBoIHRvIGF2b2lkIHRoZSBuZWVkIGZvciBpdCB0byBiZQorICAgIC8vLyBpbml0aWFsaXplZCBhbmQgZGVzdHJ1Y3RlZCBmb3IgZWFjaCBibG9jay4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxTVW5pdCAqPiA+IERlZnM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8U1VuaXQgKj4gPiBVc2VzOworIAorICAgIC8vLyBEYmdWYWx1ZVZlYyAtIFJlbWVtYmVyIERCR19WQUxVRXMgdGhhdCByZWZlciB0byBhIHBhcnRpY3VsYXIKKyAgICAvLy8gcmVnaXN0ZXIuCisgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyICo+RGJnVmFsdWVWZWM7CisKKyAgICAvLy8gUGVuZGluZ0xvYWRzIC0gUmVtZW1iZXIgd2hlcmUgdW5rbm93biBsb2FkcyBhcmUgYWZ0ZXIgdGhlIG1vc3QgcmVjZW50CisgICAgLy8vIHVua25vd24gc3RvcmUsIGFzIHdlIGl0ZXJhdGUuIEFzIHdpdGggRGVmcyBhbmQgVXNlcywgdGhpcyBpcyBoZXJlCisgICAgLy8vIHRvIG1pbmltaXplIGNvbnN0cnVjdGlvbi9kZXN0cnVjdGlvbi4KKyAgICBzdGQ6OnZlY3RvcjxTVW5pdCAqPiBQZW5kaW5nTG9hZHM7CisKKyAgICAvLy8gTG9vcFJlZ3MgLSBUcmFjayB3aGljaCByZWdpc3RlcnMgYXJlIHVzZWQgZm9yIGxvb3AtY2FycmllZCBkZXBlbmRlbmNpZXMuCisgICAgLy8vCisgICAgTG9vcERlcGVuZGVuY2llcyBMb29wUmVnczsKKworICAgIC8vLyBMb29wTGl2ZUluUmVncyAtIFRyYWNrIHdoaWNoIHJlZ3MgYXJlIGxpdmUgaW50byBhIGxvb3AsIHRvIGhlbHAgZ3VpZGUKKyAgICAvLy8gYmFjay1lZGdlLWF3YXJlIHNjaGVkdWxpbmcuCisgICAgLy8vCisgICAgU21hbGxTZXQ8dW5zaWduZWQsIDg+IExvb3BMaXZlSW5SZWdzOworCisgIHB1YmxpYzoKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQmVnaW47ICAgIC8vIFRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBzY2hlZHVsZWQuIFRoZSByYW5nZSBleHRlbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBJbnNlcnRQb3MuCisgICAgdW5zaWduZWQgSW5zZXJ0UG9zSW5kZXg7ICAgICAgICAgICAgICAvLyBUaGUgaW5kZXggaW4gQkIgb2YgSW5zZXJ0UG9zLgorCisgICAgZXhwbGljaXQgU2NoZWR1bGVEQUdJbnN0cnMoTWFjaGluZUZ1bmN0aW9uICZtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8gJm1saSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRG9taW5hdG9yVHJlZSAmbWR0KTsKKworICAgIHZpcnR1YWwgflNjaGVkdWxlREFHSW5zdHJzKCkge30KKworICAgIC8vLyBOZXdTVW5pdCAtIENyZWF0ZXMgYSBuZXcgU1VuaXQgYW5kIHJldHVybiBhIHB0ciB0byBpdC4KKyAgICAvLy8KKyAgICBTVW5pdCAqTmV3U1VuaXQoTWFjaGluZUluc3RyICpNSSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgIGNvbnN0IFNVbml0ICpBZGRyID0gU1VuaXRzLmVtcHR5KCkgPyAwIDogJlNVbml0c1swXTsKKyNlbmRpZgorICAgICAgU1VuaXRzLnB1c2hfYmFjayhTVW5pdChNSSwgKHVuc2lnbmVkKVNVbml0cy5zaXplKCkpKTsKKyAgICAgIGFzc2VydCgoQWRkciA9PSAwIHx8IEFkZHIgPT0gJlNVbml0c1swXSkgJiYKKyAgICAgICAgICAgICAiU1VuaXRzIHN0ZDo6dmVjdG9yIHJlYWxsb2NhdGVkIG9uIHRoZSBmbHkhIik7CisgICAgICBTVW5pdHMuYmFjaygpLk9yaWdOb2RlID0gJlNVbml0cy5iYWNrKCk7CisgICAgICByZXR1cm4gJlNVbml0cy5iYWNrKCk7CisgICAgfQorCisgICAgLy8vIFJ1biAtIHBlcmZvcm0gc2NoZWR1bGluZy4KKyAgICAvLy8KKyAgICB2b2lkIFJ1bihNYWNoaW5lQmFzaWNCbG9jayAqYmIsCisgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGJlZ2luLAorICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBlbmQsCisgICAgICAgICAgICAgdW5zaWduZWQgZW5kaW5kZXgpOworCisgICAgLy8vIEJ1aWxkU2NoZWRHcmFwaCAtIEJ1aWxkIFNVbml0cyBmcm9tIHRoZSBNYWNoaW5lQmFzaWNCbG9jayB0aGF0IHdlIGFyZQorICAgIC8vLyBpbnB1dC4KKyAgICB2aXJ0dWFsIHZvaWQgQnVpbGRTY2hlZEdyYXBoKEFsaWFzQW5hbHlzaXMgKkFBKTsKKworICAgIC8vLyBDb21wdXRlTGF0ZW5jeSAtIENvbXB1dGUgbm9kZSBsYXRlbmN5LgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBDb21wdXRlTGF0ZW5jeShTVW5pdCAqU1UpOworCisgICAgLy8vIENvbXB1dGVPcGVyYW5kTGF0ZW5jeSAtIE92ZXJyaWRlIGRlcGVuZGVuY2UgZWRnZSBsYXRlbmN5IHVzaW5nCisgICAgLy8vIG9wZXJhbmQgdXNlL2RlZiBpbmZvcm1hdGlvbgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBDb21wdXRlT3BlcmFuZExhdGVuY3koU1VuaXQgKkRlZiwgU1VuaXQgKlVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEZXAmIGRlcCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIE1hY2hpbmVCYXNpY0Jsb2NrICpFbWl0U2NoZWR1bGUoKTsKKworICAgIC8vLyBTdGFydEJsb2NrIC0gUHJlcGFyZSB0byBwZXJmb3JtIHNjaGVkdWxpbmcgaW4gdGhlIGdpdmVuIGJsb2NrLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBTdGFydEJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisKKyAgICAvLy8gU2NoZWR1bGUgLSBPcmRlciBub2RlcyBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgc3R5bGUsIGZpbGxpbmcKKyAgICAvLy8gaW4gdGhlIFNlcXVlbmNlIG1lbWJlci4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgU2NoZWR1bGUoKSA9IDA7CisKKyAgICAvLy8gRmluaXNoQmxvY2sgLSBDbGVhbiB1cCBhZnRlciBzY2hlZHVsaW5nIGluIHRoZSBnaXZlbiBibG9jay4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgRmluaXNoQmxvY2soKTsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wTm9kZShjb25zdCBTVW5pdCAqU1UpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRHcmFwaE5vZGVMYWJlbChjb25zdCBTVW5pdCAqU1UpIGNvbnN0OworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NjaGVkdWxlREFHUHJpbnRlci5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TY2hlZHVsZURBR1ByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2Y2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TY2hlZHVsZURBR1ByaW50ZXIuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vPT09LS0gU2NoZWR1bGVEQUdQcmludGVyLmNwcCAtIEltcGxlbWVudCBTY2hlZHVsZURBRzo6dmlld0dyYXBoKCkgLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBTY2hlZHVsZURBRzo6dmlld0dyYXBoIG1ldGhvZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dyYXBoV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKyNpbmNsdWRlIDxmc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgRE9UR3JhcGhUcmFpdHM8U2NoZWR1bGVEQUcqPiA6IHB1YmxpYyBEZWZhdWx0RE9UR3JhcGhUcmFpdHMgeworCisgIERPVEdyYXBoVHJhaXRzIChib29sIGlzU2ltcGxlPWZhbHNlKSA6IERlZmF1bHRET1RHcmFwaFRyYWl0cyhpc1NpbXBsZSkge30KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRHcmFwaE5hbWUoY29uc3QgU2NoZWR1bGVEQUcgKkcpIHsKKyAgICAgIHJldHVybiBHLT5NRi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgcmVuZGVyR3JhcGhGcm9tQm90dG9tVXAoKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIGJvb2wgaGFzTm9kZUFkZHJlc3NMYWJlbChjb25zdCBTVW5pdCAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjaGVkdWxlREFHICpHcmFwaCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIC8vLyBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgZG90IGF0dHJpYnV0ZXMgcHJpbnRlZCBmb3IgYSBwYXJ0aWN1bGFyCisgICAgLy8vIGVkZ2UsIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRFZGdlQXR0cmlidXRlcyhjb25zdCBTVW5pdCAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VuaXRJdGVyYXRvciBFSSkgeworICAgICAgaWYgKEVJLmlzQXJ0aWZpY2lhbERlcCgpKQorICAgICAgICByZXR1cm4gImNvbG9yPWN5YW4sc3R5bGU9ZGFzaGVkIjsKKyAgICAgIGlmIChFSS5pc0N0cmxEZXAoKSkKKyAgICAgICAgcmV0dXJuICJjb2xvcj1ibHVlLHN0eWxlPWRhc2hlZCI7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIAorCisgICAgc3RkOjpzdHJpbmcgZ2V0Tm9kZUxhYmVsKGNvbnN0IFNVbml0ICpOb2RlLCBjb25zdCBTY2hlZHVsZURBRyAqR3JhcGgpOworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXROb2RlQXR0cmlidXRlcyhjb25zdCBTVW5pdCAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NoZWR1bGVEQUcgKkdyYXBoKSB7CisgICAgICByZXR1cm4gInNoYXBlPU1yZWNvcmQiOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFkZEN1c3RvbUdyYXBoRmVhdHVyZXMoU2NoZWR1bGVEQUcgKkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaFdyaXRlcjxTY2hlZHVsZURBRyo+ICZHVykgeworICAgICAgcmV0dXJuIEctPmFkZEN1c3RvbUdyYXBoRmVhdHVyZXMoR1cpOworICAgIH0KKyAgfTsKK30KKworc3RkOjpzdHJpbmcgRE9UR3JhcGhUcmFpdHM8U2NoZWR1bGVEQUcqPjo6Z2V0Tm9kZUxhYmVsKGNvbnN0IFNVbml0ICpTVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2hlZHVsZURBRyAqRykgeworICByZXR1cm4gRy0+Z2V0R3JhcGhOb2RlTGFiZWwoU1UpOworfQorCisvLy8gdmlld0dyYXBoIC0gUG9wIHVwIGEgZ2hvc3R2aWV3IHdpbmRvdyB3aXRoIHRoZSByZWFjaGFibGUgcGFydHMgb2YgdGhlIERBRworLy8vIHJlbmRlcmVkIHVzaW5nICdkb3QnLgorLy8vCit2b2lkIFNjaGVkdWxlREFHOjp2aWV3R3JhcGgoKSB7CisvLyBUaGlzIGNvZGUgaXMgb25seSBmb3IgZGVidWdnaW5nIQorI2lmbmRlZiBOREVCVUcKKyAgaWYgKEJCLT5nZXRCYXNpY0Jsb2NrKCkpCisgICAgVmlld0dyYXBoKHRoaXMsICJkYWcuIiArIE1GLmdldEZ1bmN0aW9uKCktPmdldE5hbWVTdHIoKSwgZmFsc2UsCisgICAgICAgICAgICAgICJTY2hlZHVsaW5nLVVuaXRzIEdyYXBoIGZvciAiICsgTUYuZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZVN0cigpICsgCisgICAgICAgICAgICAgICI6IiArIEJCLT5nZXRCYXNpY0Jsb2NrKCktPmdldE5hbWVTdHIoKSk7CisgIGVsc2UKKyAgICBWaWV3R3JhcGgodGhpcywgImRhZy4iICsgTUYuZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZVN0cigpLCBmYWxzZSwKKyAgICAgICAgICAgICAgIlNjaGVkdWxpbmctVW5pdHMgR3JhcGggZm9yICIgKyBNRi5nZXRGdW5jdGlvbigpLT5nZXROYW1lU3RyKCkpOworI2Vsc2UKKyAgZXJycygpIDw8ICJTY2hlZHVsZURBRzo6dmlld0dyYXBoIGlzIG9ubHkgYXZhaWxhYmxlIGluIGRlYnVnIGJ1aWxkcyBvbiAiCisgICAgICAgICA8PCAic3lzdGVtcyB3aXRoIEdyYXBodml6IG9yIGd2IVxuIjsKKyNlbmRpZiAgLy8gTkRFQlVHCit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5OTg4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI1IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1TZWxlY3Rpb25EQUcKKyAgREFHQ29tYmluZXIuY3BwCisgIEZhc3RJU2VsLmNwcAorICBGdW5jdGlvbkxvd2VyaW5nSW5mby5jcHAKKyAgSW5zdHJFbWl0dGVyLmNwcAorICBMZWdhbGl6ZURBRy5jcHAKKyAgTGVnYWxpemVGbG9hdFR5cGVzLmNwcAorICBMZWdhbGl6ZUludGVnZXJUeXBlcy5jcHAKKyAgTGVnYWxpemVUeXBlcy5jcHAKKyAgTGVnYWxpemVUeXBlc0dlbmVyaWMuY3BwCisgIExlZ2FsaXplVmVjdG9yT3BzLmNwcAorICBMZWdhbGl6ZVZlY3RvclR5cGVzLmNwcAorICBTY2hlZHVsZURBR0Zhc3QuY3BwCisgIFNjaGVkdWxlREFHTGlzdC5jcHAKKyAgU2NoZWR1bGVEQUdSUkxpc3QuY3BwCisgIFNjaGVkdWxlREFHU0ROb2Rlcy5jcHAKKyAgU2VsZWN0aW9uREFHLmNwcAorICBTZWxlY3Rpb25EQUdCdWlsZGVyLmNwcAorICBTZWxlY3Rpb25EQUdJU2VsLmNwcAorICBTZWxlY3Rpb25EQUdQcmludGVyLmNwcAorICBUYXJnZXRMb3dlcmluZy5jcHAKKyAgVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5jcHAKKyAgKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMgKExMVk1TZWxlY3Rpb25EQUcgTExWTUFuYWx5c2lzIExMVk1Bc21QcmludGVyIExMVk1Db2RlR2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0RBR0NvbWJpbmVyLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9EQUdDb21iaW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmYmY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9EQUdDb21iaW5lci5jcHAKQEAgLTAsMCArMSw3MjIxIEBACisvLz09PS0tIERBR0NvbWJpbmVyLmNwcCAtIEltcGxlbWVudCBhIERBRyBub2RlIGNvbWJpbmVyIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBjb21iaW5lcyBkYWcgbm9kZXMgdG8gZm9ybSBmZXdlciwgc2ltcGxlciBEQUcgbm9kZXMuICBJdCBjYW4gYmUgcnVuCisvLyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIERBRyBpcyBsZWdhbGl6ZWQuCisvLworLy8gVGhpcyBwYXNzIGlzIG5vdCBhIHN1YnN0aXR1dGUgZm9yIHRoZSBMTFZNIElSIGluc3Rjb21iaW5lIHBhc3MuIFRoaXMgcGFzcyBpcworLy8gcHJpbWFyaWx5IGludGVuZGVkIHRvIGhhbmRsZSBzaW1wbGlmaWNhdGlvbiBvcHBvcnR1bml0aWVzIHRoYXQgYXJlIGltcGxpY2l0CisvLyBpbiB0aGUgTExWTSBJUiBhbmQgZXhwb3NlZCBieSB0aGUgdmFyaW91cyBjb2RlZ2VuIGxvd2VyaW5nIHBoYXNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImRhZ2NvbWJpbmUiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOb2Rlc0NvbWJpbmVkICAgLCAiTnVtYmVyIG9mIGRhZyBub2RlcyBjb21iaW5lZCIpOworU1RBVElTVElDKFByZUluZGV4ZWROb2RlcyAsICJOdW1iZXIgb2YgcHJlLWluZGV4ZWQgbm9kZXMgY3JlYXRlZCIpOworU1RBVElTVElDKFBvc3RJbmRleGVkTm9kZXMsICJOdW1iZXIgb2YgcG9zdC1pbmRleGVkIG5vZGVzIGNyZWF0ZWQiKTsKK1NUQVRJU1RJQyhPcHNOYXJyb3dlZCAgICAgLCAiTnVtYmVyIG9mIGxvYWQvb3Avc3RvcmUgbmFycm93ZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgc3RhdGljIGNsOjpvcHQ8Ym9vbD4KKyAgICBDb21iaW5lckFBKCJjb21iaW5lci1hbGlhcy1hbmFseXNpcyIsIGNsOjpIaWRkZW4sCisgICAgICAgICAgICAgICBjbDo6ZGVzYygiVHVybiBvbiBhbGlhcyBhbmFseXNpcyBkdXJpbmcgdGVzdGluZyIpKTsKKworICBzdGF0aWMgY2w6Om9wdDxib29sPgorICAgIENvbWJpbmVyR2xvYmFsQUEoImNvbWJpbmVyLWdsb2JhbC1hbGlhcy1hbmFseXNpcyIsIGNsOjpIaWRkZW4sCisgICAgICAgICAgICAgICBjbDo6ZGVzYygiSW5jbHVkZSBnbG9iYWwgaW5mb3JtYXRpb24gaW4gYWxpYXMgYW5hbHlzaXMiKSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERBR0NvbWJpbmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKyAgY2xhc3MgREFHQ29tYmluZXIgeworICAgIFNlbGVjdGlvbkRBRyAmREFHOworICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEk7CisgICAgQ29tYmluZUxldmVsIExldmVsOworICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsOworICAgIGJvb2wgTGVnYWxPcGVyYXRpb25zOworICAgIGJvb2wgTGVnYWxUeXBlczsKKworICAgIC8vIFdvcmtsaXN0IG9mIGFsbCBvZiB0aGUgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHNpbXBsaWZpZWQuCisgICAgc3RkOjp2ZWN0b3I8U0ROb2RlKj4gV29ya0xpc3Q7CisKKyAgICAvLyBBQSAtIFVzZWQgZm9yIERBRyBsb2FkL3N0b3JlIGFsaWFzIGFuYWx5c2lzLgorICAgIEFsaWFzQW5hbHlzaXMgJkFBOworCisgICAgLy8vIEFkZFVzZXJzVG9Xb3JrTGlzdCAtIFdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMgc2ltcGxpZmllZCwgYWRkIGFsbCB1c2VycyBvZgorICAgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHdvcmsgbGlzdHMgYmVjYXVzZSB0aGV5IG1pZ2h0IGdldCBtb3JlIHNpbXBsaWZpZWQKKyAgICAvLy8gbm93LgorICAgIC8vLworICAgIHZvaWQgQWRkVXNlcnNUb1dvcmtMaXN0KFNETm9kZSAqTikgeworICAgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IE4tPnVzZV9iZWdpbigpLCBVRSA9IE4tPnVzZV9lbmQoKTsKKyAgICAgICAgICAgVUkgIT0gVUU7ICsrVUkpCisgICAgICAgIEFkZFRvV29ya0xpc3QoKlVJKTsKKyAgICB9CisKKyAgICAvLy8gdmlzaXQgLSBjYWxsIHRoZSBub2RlLXNwZWNpZmljIHJvdXRpbmUgdGhhdCBrbm93cyBob3cgdG8gZm9sZCBlYWNoCisgICAgLy8vIHBhcnRpY3VsYXIgdHlwZSBvZiBub2RlLgorICAgIFNEVmFsdWUgdmlzaXQoU0ROb2RlICpOKTsKKworICBwdWJsaWM6CisgICAgLy8vIEFkZFRvV29ya0xpc3QgLSBBZGQgdG8gdGhlIHdvcmsgbGlzdCBtYWtpbmcgc3VyZSBpdCdzIGluc3RhbmNlIGlzIGF0IHRoZQorICAgIC8vLyB0aGUgYmFjayAobmV4dCB0byBiZSBwcm9jZXNzZWQuKQorICAgIHZvaWQgQWRkVG9Xb3JrTGlzdChTRE5vZGUgKk4pIHsKKyAgICAgIHJlbW92ZUZyb21Xb3JrTGlzdChOKTsKKyAgICAgIFdvcmtMaXN0LnB1c2hfYmFjayhOKTsKKyAgICB9CisKKyAgICAvLy8gcmVtb3ZlRnJvbVdvcmtMaXN0IC0gcmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgTiBmcm9tIHRoZSB3b3JrbGlzdC4KKyAgICAvLy8KKyAgICB2b2lkIHJlbW92ZUZyb21Xb3JrTGlzdChTRE5vZGUgKk4pIHsKKyAgICAgIFdvcmtMaXN0LmVyYXNlKHN0ZDo6cmVtb3ZlKFdvcmtMaXN0LmJlZ2luKCksIFdvcmtMaXN0LmVuZCgpLCBOKSwKKyAgICAgICAgICAgICAgICAgICAgIFdvcmtMaXN0LmVuZCgpKTsKKyAgICB9CisKKyAgICBTRFZhbHVlIENvbWJpbmVUbyhTRE5vZGUgKk4sIGNvbnN0IFNEVmFsdWUgKlRvLCB1bnNpZ25lZCBOdW1UbywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEFkZFRvID0gdHJ1ZSk7CisKKyAgICBTRFZhbHVlIENvbWJpbmVUbyhTRE5vZGUgKk4sIFNEVmFsdWUgUmVzLCBib29sIEFkZFRvID0gdHJ1ZSkgeworICAgICAgcmV0dXJuIENvbWJpbmVUbyhOLCAmUmVzLCAxLCBBZGRUbyk7CisgICAgfQorCisgICAgU0RWYWx1ZSBDb21iaW5lVG8oU0ROb2RlICpOLCBTRFZhbHVlIFJlczAsIFNEVmFsdWUgUmVzMSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEFkZFRvID0gdHJ1ZSkgeworICAgICAgU0RWYWx1ZSBUb1tdID0geyBSZXMwLCBSZXMxIH07CisgICAgICByZXR1cm4gQ29tYmluZVRvKE4sIFRvLCAyLCBBZGRUbyk7CisgICAgfQorCisgICAgdm9pZCBDb21taXRUYXJnZXRMb3dlcmluZ09wdChjb25zdCBUYXJnZXRMb3dlcmluZzo6VGFyZ2V0TG93ZXJpbmdPcHQgJlRMTyk7CisKKyAgcHJpdmF0ZToKKworICAgIC8vLyBTaW1wbGlmeURlbWFuZGVkQml0cyAtIENoZWNrIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBub2RlIHZhbHVlIHRvIHNlZSBpZgorICAgIC8vLyBpdCBjYW4gYmUgc2ltcGxpZmllZCBvciBpZiB0aGluZ3MgaXQgdXNlcyBjYW4gYmUgc2ltcGxpZmllZCBieSBiaXQKKyAgICAvLy8gcHJvcGFnYXRpb24uICBJZiBzbywgcmV0dXJuIHRydWUuCisgICAgYm9vbCBTaW1wbGlmeURlbWFuZGVkQml0cyhTRFZhbHVlIE9wKSB7CisgICAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IE9wLmdldFZhbHVlVHlwZSgpLmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgICAgICBBUEludCBEZW1hbmRlZCA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpOworICAgICAgcmV0dXJuIFNpbXBsaWZ5RGVtYW5kZWRCaXRzKE9wLCBEZW1hbmRlZCk7CisgICAgfQorCisgICAgYm9vbCBTaW1wbGlmeURlbWFuZGVkQml0cyhTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmRGVtYW5kZWQpOworCisgICAgYm9vbCBDb21iaW5lVG9QcmVJbmRleGVkTG9hZFN0b3JlKFNETm9kZSAqTik7CisgICAgYm9vbCBDb21iaW5lVG9Qb3N0SW5kZXhlZExvYWRTdG9yZShTRE5vZGUgKk4pOworCisgICAgdm9pZCBSZXBsYWNlTG9hZFdpdGhQcm9tb3RlZExvYWQoU0ROb2RlICpMb2FkLCBTRE5vZGUgKkV4dExvYWQpOworICAgIFNEVmFsdWUgUHJvbW90ZU9wZXJhbmQoU0RWYWx1ZSBPcCwgRVZUIFBWVCwgYm9vbCAmUmVwbGFjZSk7CisgICAgU0RWYWx1ZSBTRXh0UHJvbW90ZU9wZXJhbmQoU0RWYWx1ZSBPcCwgRVZUIFBWVCk7CisgICAgU0RWYWx1ZSBaRXh0UHJvbW90ZU9wZXJhbmQoU0RWYWx1ZSBPcCwgRVZUIFBWVCk7CisgICAgU0RWYWx1ZSBQcm9tb3RlSW50QmluT3AoU0RWYWx1ZSBPcCk7CisgICAgU0RWYWx1ZSBQcm9tb3RlSW50U2hpZnRPcChTRFZhbHVlIE9wKTsKKyAgICBTRFZhbHVlIFByb21vdGVFeHRlbmQoU0RWYWx1ZSBPcCk7CisgICAgYm9vbCBQcm9tb3RlTG9hZChTRFZhbHVlIE9wKTsKKworICAgIC8vLyBjb21iaW5lIC0gY2FsbCB0aGUgbm9kZS1zcGVjaWZpYyByb3V0aW5lIHRoYXQga25vd3MgaG93IHRvIGZvbGQgZWFjaAorICAgIC8vLyBwYXJ0aWN1bGFyIHR5cGUgb2Ygbm9kZS4gSWYgdGhhdCBkb2Vzbid0IGRvIGFueXRoaW5nLCB0cnkgdGhlCisgICAgLy8vIHRhcmdldC1zcGVjaWZpYyBEQUcgY29tYmluZXMuCisgICAgU0RWYWx1ZSBjb21iaW5lKFNETm9kZSAqTik7CisKKyAgICAvLyBWaXNpdGF0aW9uIGltcGxlbWVudGF0aW9uIC0gSW1wbGVtZW50IGRhZyBub2RlIGNvbWJpbmluZyBmb3IgZGlmZmVyZW50CisgICAgLy8gbm9kZSB0eXBlcy4gIFRoZSBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3M6CisgICAgLy8gUmV0dXJuIFZhbHVlOgorICAgIC8vICAgU0RWYWx1ZS5nZXROb2RlKCkgPT0gMCAtIE5vIGNoYW5nZSB3YXMgbWFkZQorICAgIC8vICAgU0RWYWx1ZS5nZXROb2RlKCkgPT0gTiAtIE4gd2FzIHJlcGxhY2VkLCBpcyBkZWFkIGFuZCBoYXMgYmVlbiBoYW5kbGVkLgorICAgIC8vICAgb3RoZXJ3aXNlICAgICAgICAgICAgICAtIE4gc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSByZXR1cm5lZCBPcGVyYW5kLgorICAgIC8vCisgICAgU0RWYWx1ZSB2aXNpdFRva2VuRmFjdG9yKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdE1FUkdFX1ZBTFVFUyhTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRBREQoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0U1VCKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEFEREMoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0QURERShTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRNVUwoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0U0RJVihTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRVRElWKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdFNSRU0oU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0VVJFTShTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRNVUxIVShTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRNVUxIUyhTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRTTVVMX0xPSEkoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0VU1VTF9MT0hJKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdFNESVZSRU0oU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0VURJVlJFTShTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRBTkQoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0T1IoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0WE9SKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSBTaW1wbGlmeVZCaW5PcChTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRTSEwoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0U1JBKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdFNSTChTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRDVExaKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdENUVFooU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0Q1RQT1AoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0U0VMRUNUKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdFNFTEVDVF9DQyhTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRTRVRDQyhTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRTSUdOX0VYVEVORChTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRaRVJPX0VYVEVORChTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRBTllfRVhURU5EKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdFNJR05fRVhURU5EX0lOUkVHKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdFRSVU5DQVRFKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEJJVF9DT05WRVJUKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEJVSUxEX1BBSVIoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0RkFERChTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRGU1VCKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEZNVUwoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0RkRJVihTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRGUkVNKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEZDT1BZU0lHTihTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRTSU5UX1RPX0ZQKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdFVJTlRfVE9fRlAoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0RlBfVE9fU0lOVChTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRGUF9UT19VSU5UKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEZQX1JPVU5EKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEZQX1JPVU5EX0lOUkVHKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEZQX0VYVEVORChTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRGTkVHKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEZBQlMoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0QlJDT05EKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEJSX0NDKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdExPQUQoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0U1RPUkUoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0SU5TRVJUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIHZpc2l0RVhUUkFDVF9WRUNUT1JfRUxUKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSB2aXNpdEJVSUxEX1ZFQ1RPUihTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRDT05DQVRfVkVDVE9SUyhTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRWRUNUT1JfU0hVRkZMRShTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgdmlzaXRNRU1CQVJSSUVSKFNETm9kZSAqTik7CisKKyAgICBTRFZhbHVlIFhmb3JtVG9TaHVmZmxlV2l0aFplcm8oU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIFJlYXNzb2NpYXRlT3BzKHVuc2lnbmVkIE9wYywgRGVidWdMb2MgREwsIFNEVmFsdWUgTEhTLCBTRFZhbHVlIFJIUyk7CisKKyAgICBTRFZhbHVlIHZpc2l0U2hpZnRCeUNvbnN0YW50KFNETm9kZSAqTiwgdW5zaWduZWQgQW10KTsKKworICAgIGJvb2wgU2ltcGxpZnlTZWxlY3RPcHMoU0ROb2RlICpTRUxFQ1QsIFNEVmFsdWUgTEhTLCBTRFZhbHVlIFJIUyk7CisgICAgU0RWYWx1ZSBTaW1wbGlmeUJpbk9wV2l0aFNhbWVPcGNvZGVIYW5kcyhTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgU2ltcGxpZnlTZWxlY3QoRGVidWdMb2MgREwsIFNEVmFsdWUgTjAsIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIpOworICAgIFNEVmFsdWUgU2ltcGxpZnlTZWxlY3RDQyhEZWJ1Z0xvYyBETCwgU0RWYWx1ZSBOMCwgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMywgSVNEOjpDb25kQ29kZSBDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb3RFeHRDb21wYXJlID0gZmFsc2UpOworICAgIFNEVmFsdWUgU2ltcGxpZnlTZXRDQyhFVlQgVlQsIFNEVmFsdWUgTjAsIFNEVmFsdWUgTjEsIElTRDo6Q29uZENvZGUgQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsIGJvb2wgZm9sZEJvb2xlYW5zID0gdHJ1ZSk7CisgICAgU0RWYWx1ZSBTaW1wbGlmeU5vZGVXaXRoVHdvUmVzdWx0cyhTRE5vZGUgKk4sIHVuc2lnbmVkIExvT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEhpT3ApOworICAgIFNEVmFsdWUgQ29tYmluZUNvbnNlY3V0aXZlTG9hZHMoU0ROb2RlICpOLCBFVlQgVlQpOworICAgIFNEVmFsdWUgQ29uc3RhbnRGb2xkQklUX0NPTlZFUlRvZkJVSUxEX1ZFQ1RPUihTRE5vZGUgKiwgRVZUKTsKKyAgICBTRFZhbHVlIEJ1aWxkU0RJVihTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgQnVpbGRVRElWKFNETm9kZSAqTik7CisgICAgU0ROb2RlICpNYXRjaFJvdGF0ZShTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsIERlYnVnTG9jIERMKTsKKyAgICBTRFZhbHVlIFJlZHVjZUxvYWRXaWR0aChTRE5vZGUgKk4pOworICAgIFNEVmFsdWUgUmVkdWNlTG9hZE9wU3RvcmVXaWR0aChTRE5vZGUgKk4pOworCisgICAgU0RWYWx1ZSBHZXREZW1hbmRlZEJpdHMoU0RWYWx1ZSBWLCBjb25zdCBBUEludCAmTWFzayk7CisKKyAgICAvLy8gR2F0aGVyQWxsQWxpYXNlcyAtIFdhbGsgdXAgY2hhaW4gc2tpcHBpbmcgbm9uLWFsaWFzaW5nIG1lbW9yeSBub2RlcywKKyAgICAvLy8gbG9va2luZyBmb3IgYWxpYXNpbmcgbm9kZXMgYW5kIGFkZGluZyB0aGVtIHRvIHRoZSBBbGlhc2VzIHZlY3Rvci4KKyAgICB2b2lkIEdhdGhlckFsbEFsaWFzZXMoU0ROb2RlICpOLCBTRFZhbHVlIE9yaWdpbmFsQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+ICZBbGlhc2VzKTsKKworICAgIC8vLyBpc0FsaWFzIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW55IHBvc3NpYmlsaXR5IHRoYXQgdGhlIHR3byBhZGRyZXNzZXMKKyAgICAvLy8gb3ZlcmxhcC4KKyAgICBib29sIGlzQWxpYXMoU0RWYWx1ZSBQdHIxLCBpbnQ2NF90IFNpemUxLAorICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqU3JjVmFsdWUxLCBpbnQgU3JjVmFsdWVPZmZzZXQxLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNWYWx1ZUFsaWduMSwKKyAgICAgICAgICAgICAgICAgU0RWYWx1ZSBQdHIyLCBpbnQ2NF90IFNpemUyLAorICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqU3JjVmFsdWUyLCBpbnQgU3JjVmFsdWVPZmZzZXQyLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNWYWx1ZUFsaWduMikgY29uc3Q7CisKKyAgICAvLy8gRmluZEFsaWFzSW5mbyAtIEV4dHJhY3RzIHRoZSByZWxldmFudCBhbGlhcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtZW1vcnkKKyAgICAvLy8gbm9kZS4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3BlcmFuZCB3YXMgYSBsb2FkLgorICAgIGJvb2wgRmluZEFsaWFzSW5mbyhTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJlB0ciwgaW50NjRfdCAmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKiZTcmNWYWx1ZSwgaW50ICZTcmNWYWx1ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlNyY1ZhbHVlQWxpZ25tZW50KSBjb25zdDsKKworICAgIC8vLyBGaW5kQmV0dGVyQ2hhaW4gLSBXYWxrIHVwIGNoYWluIHNraXBwaW5nIG5vbi1hbGlhc2luZyBtZW1vcnkgbm9kZXMsCisgICAgLy8vIGxvb2tpbmcgZm9yIGEgYmV0dGVyIGNoYWluIChhbGlhc2luZyBub2RlLikKKyAgICBTRFZhbHVlIEZpbmRCZXR0ZXJDaGFpbihTRE5vZGUgKk4sIFNEVmFsdWUgQ2hhaW4pOworCisgIHB1YmxpYzoKKyAgICBEQUdDb21iaW5lcihTZWxlY3Rpb25EQUcgJkQsIEFsaWFzQW5hbHlzaXMgJkEsIENvZGVHZW5PcHQ6OkxldmVsIE9MKQorICAgICAgOiBEQUcoRCksIFRMSShELmdldFRhcmdldExvd2VyaW5nSW5mbygpKSwgTGV2ZWwoVW5yZXN0cmljdGVkKSwKKyAgICAgICAgT3B0TGV2ZWwoT0wpLCBMZWdhbE9wZXJhdGlvbnMoZmFsc2UpLCBMZWdhbFR5cGVzKGZhbHNlKSwgQUEoQSkge30KKworICAgIC8vLyBSdW4gLSBydW5zIHRoZSBkYWcgY29tYmluZXIgb24gYWxsIG5vZGVzIGluIHRoZSB3b3JrIGxpc3QKKyAgICB2b2lkIFJ1bihDb21iaW5lTGV2ZWwgQXRMZXZlbCk7CisgICAgCisgICAgU2VsZWN0aW9uREFHICZnZXREQUcoKSBjb25zdCB7IHJldHVybiBEQUc7IH0KKyAgICAKKyAgICAvLy8gZ2V0U2hpZnRBbW91bnRUeSAtIFJldHVybnMgYSB0eXBlIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSB2YWxpZAorICAgIC8vLyBzaGlmdCBhbW91bnQgLSBiZWZvcmUgdHlwZSBsZWdhbGl6YXRpb24gdGhlc2UgY2FuIGJlIGh1Z2UuCisgICAgRVZUIGdldFNoaWZ0QW1vdW50VHkoKSB7CisgICAgICByZXR1cm4gTGVnYWxUeXBlcyA/IFRMSS5nZXRTaGlmdEFtb3VudFR5KCkgOiBUTEkuZ2V0UG9pbnRlclR5KCk7CisgICAgfQorICAgIAorICAgIC8vLyBpc1R5cGVMZWdhbCAtIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB3ZSBhcmUgcnVubmluZyBiZWZvcmUgdHlwZQorICAgIC8vLyBsZWdhbGl6YXRpb24gb3IgaWYgdGhlIHNwZWNpZmllZCBWVCBpcyBsZWdhbC4KKyAgICBib29sIGlzVHlwZUxlZ2FsKGNvbnN0IEVWVCAmVlQpIHsKKyAgICAgIGlmICghTGVnYWxUeXBlcykgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gVExJLmlzVHlwZUxlZ2FsKFZUKTsKKyAgICB9CisgIH07Cit9CisKKworbmFtZXNwYWNlIHsKKy8vLyBXb3JrTGlzdFJlbW92ZXIgLSBUaGlzIGNsYXNzIGlzIGEgREFHVXBkYXRlTGlzdGVuZXIgdGhhdCByZW1vdmVzIGFueSBkZWxldGVkCisvLy8gbm9kZXMgZnJvbSB0aGUgd29ya2xpc3QuCitjbGFzcyBXb3JrTGlzdFJlbW92ZXIgOiBwdWJsaWMgU2VsZWN0aW9uREFHOjpEQUdVcGRhdGVMaXN0ZW5lciB7CisgIERBR0NvbWJpbmVyICZEQzsKK3B1YmxpYzoKKyAgZXhwbGljaXQgV29ya0xpc3RSZW1vdmVyKERBR0NvbWJpbmVyICZkYykgOiBEQyhkYykge30KKworICB2aXJ0dWFsIHZvaWQgTm9kZURlbGV0ZWQoU0ROb2RlICpOLCBTRE5vZGUgKkUpIHsKKyAgICBEQy5yZW1vdmVGcm9tV29ya0xpc3QoTik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgTm9kZVVwZGF0ZWQoU0ROb2RlICpOKSB7CisgICAgLy8gSWdub3JlIHVwZGF0ZXMuCisgIH0KK307Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgVGFyZ2V0TG93ZXJpbmc6OkRBR0NvbWJpbmVySW5mbyBpbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBUYXJnZXRMb3dlcmluZzo6REFHQ29tYmluZXJJbmZvOjpBZGRUb1dvcmtsaXN0KFNETm9kZSAqTikgeworICAoKERBR0NvbWJpbmVyKilEQyktPkFkZFRvV29ya0xpc3QoTik7Cit9CisKK1NEVmFsdWUgVGFyZ2V0TG93ZXJpbmc6OkRBR0NvbWJpbmVySW5mbzo6CitDb21iaW5lVG8oU0ROb2RlICpOLCBjb25zdCBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmVG8sIGJvb2wgQWRkVG8pIHsKKyAgcmV0dXJuICgoREFHQ29tYmluZXIqKURDKS0+Q29tYmluZVRvKE4sICZUb1swXSwgVG8uc2l6ZSgpLCBBZGRUbyk7Cit9CisKK1NEVmFsdWUgVGFyZ2V0TG93ZXJpbmc6OkRBR0NvbWJpbmVySW5mbzo6CitDb21iaW5lVG8oU0ROb2RlICpOLCBTRFZhbHVlIFJlcywgYm9vbCBBZGRUbykgeworICByZXR1cm4gKChEQUdDb21iaW5lciopREMpLT5Db21iaW5lVG8oTiwgUmVzLCBBZGRUbyk7Cit9CisKKworU0RWYWx1ZSBUYXJnZXRMb3dlcmluZzo6REFHQ29tYmluZXJJbmZvOjoKK0NvbWJpbmVUbyhTRE5vZGUgKk4sIFNEVmFsdWUgUmVzMCwgU0RWYWx1ZSBSZXMxLCBib29sIEFkZFRvKSB7CisgIHJldHVybiAoKERBR0NvbWJpbmVyKilEQyktPkNvbWJpbmVUbyhOLCBSZXMwLCBSZXMxLCBBZGRUbyk7Cit9CisKK3ZvaWQgVGFyZ2V0TG93ZXJpbmc6OkRBR0NvbWJpbmVySW5mbzo6CitDb21taXRUYXJnZXRMb3dlcmluZ09wdChjb25zdCBUYXJnZXRMb3dlcmluZzo6VGFyZ2V0TG93ZXJpbmdPcHQgJlRMTykgeworICByZXR1cm4gKChEQUdDb21iaW5lciopREMpLT5Db21taXRUYXJnZXRMb3dlcmluZ09wdChUTE8pOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSGVscGVyIEZ1bmN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGlzTmVnYXRpYmxlRm9yRnJlZSAtIFJldHVybiAxIGlmIHdlIGNhbiBjb21wdXRlIHRoZSBuZWdhdGVkIGZvcm0gb2YgdGhlCisvLy8gc3BlY2lmaWVkIGV4cHJlc3Npb24gZm9yIHRoZSBzYW1lIGNvc3QgYXMgdGhlIGV4cHJlc3Npb24gaXRzZWxmLCBvciAyIGlmIHdlCisvLy8gY2FuIGNvbXB1dGUgdGhlIG5lZ2F0ZWQgZm9ybSBtb3JlIGNoZWFwbHkgdGhhbiB0aGUgZXhwcmVzc2lvbiBpdHNlbGYuCitzdGF0aWMgY2hhciBpc05lZ2F0aWJsZUZvckZyZWUoU0RWYWx1ZSBPcCwgYm9vbCBMZWdhbE9wZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSB7CisgIC8vIE5vIGNvbXBpbGUgdGltZSBvcHRpbWl6YXRpb25zIG9uIHRoaXMgdHlwZS4KKyAgaWYgKE9wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6cHBjZjEyOCkKKyAgICByZXR1cm4gMDsKKworICAvLyBmbmVnIGlzIHJlbW92YWJsZSBldmVuIGlmIGl0IGhhcyBtdWx0aXBsZSB1c2VzLgorICBpZiAoT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGTkVHKSByZXR1cm4gMjsKKworICAvLyBEb24ndCBhbGxvdyBhbnl0aGluZyB3aXRoIG11bHRpcGxlIHVzZXMuCisgIGlmICghT3AuaGFzT25lVXNlKCkpIHJldHVybiAwOworCisgIC8vIERvbid0IHJlY3Vyc2UgZXhwb25lbnRpYWxseS4KKyAgaWYgKERlcHRoID4gNikgcmV0dXJuIDA7CisKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgIGNhc2UgSVNEOjpDb25zdGFudEZQOgorICAgIC8vIERvbid0IGludmVydCBjb25zdGFudCBGUCB2YWx1ZXMgYWZ0ZXIgbGVnYWxpemUuICBUaGUgbmVnYXRlZCBjb25zdGFudAorICAgIC8vIGlzbid0IG5lY2Vzc2FyaWx5IGxlZ2FsLgorICAgIHJldHVybiBMZWdhbE9wZXJhdGlvbnMgPyAwIDogMTsKKyAgY2FzZSBJU0Q6OkZBREQ6CisgICAgLy8gRklYTUU6IGRldGVybWluZSBiZXR0ZXIgY29uZGl0aW9ucyBmb3IgdGhpcyB4Zm9ybS4KKyAgICBpZiAoIVVuc2FmZUZQTWF0aCkgcmV0dXJuIDA7CisKKyAgICAvLyBmb2xkIChmc3ViIChmYWRkIEEsIEIpKSAtPiAoZnN1YiAoZm5lZyBBKSwgQikKKyAgICBpZiAoY2hhciBWID0gaXNOZWdhdGlibGVGb3JGcmVlKE9wLmdldE9wZXJhbmQoMCksIExlZ2FsT3BlcmF0aW9ucywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gVjsKKyAgICAvLyBmb2xkIChmbmVnIChmYWRkIEEsIEIpKSAtPiAoZnN1YiAoZm5lZyBCKSwgQSkKKyAgICByZXR1cm4gaXNOZWdhdGlibGVGb3JGcmVlKE9wLmdldE9wZXJhbmQoMSksIExlZ2FsT3BlcmF0aW9ucywgRGVwdGgrMSk7CisgIGNhc2UgSVNEOjpGU1VCOgorICAgIC8vIFdlIGNhbid0IHR1cm4gLShBLUIpIGludG8gQi1BIHdoZW4gd2UgaG9ub3Igc2lnbmVkIHplcm9zLgorICAgIGlmICghVW5zYWZlRlBNYXRoKSByZXR1cm4gMDsKKworICAgIC8vIGZvbGQgKGZuZWcgKGZzdWIgQSwgQikpIC0+IChmc3ViIEIsIEEpCisgICAgcmV0dXJuIDE7CisKKyAgY2FzZSBJU0Q6OkZNVUw6CisgIGNhc2UgSVNEOjpGRElWOgorICAgIGlmIChIb25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aCgpKSByZXR1cm4gMDsKKworICAgIC8vIGZvbGQgKGZuZWcgKGZtdWwgWCwgWSkpIC0+IChmbXVsIChmbmVnIFgpLCBZKSBvciAoZm11bCBYLCAoZm5lZyBZKSkKKyAgICBpZiAoY2hhciBWID0gaXNOZWdhdGlibGVGb3JGcmVlKE9wLmdldE9wZXJhbmQoMCksIExlZ2FsT3BlcmF0aW9ucywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gVjsKKworICAgIHJldHVybiBpc05lZ2F0aWJsZUZvckZyZWUoT3AuZ2V0T3BlcmFuZCgxKSwgTGVnYWxPcGVyYXRpb25zLCBEZXB0aCsxKTsKKworICBjYXNlIElTRDo6RlBfRVhURU5EOgorICBjYXNlIElTRDo6RlBfUk9VTkQ6CisgIGNhc2UgSVNEOjpGU0lOOgorICAgIHJldHVybiBpc05lZ2F0aWJsZUZvckZyZWUoT3AuZ2V0T3BlcmFuZCgwKSwgTGVnYWxPcGVyYXRpb25zLCBEZXB0aCsxKTsKKyAgfQorfQorCisvLy8gR2V0TmVnYXRlZEV4cHJlc3Npb24gLSBJZiBpc05lZ2F0aWJsZUZvckZyZWUgcmV0dXJucyB0cnVlLCB0aGlzIGZ1bmN0aW9uCisvLy8gcmV0dXJucyB0aGUgbmV3bHkgbmVnYXRlZCBleHByZXNzaW9uLgorc3RhdGljIFNEVmFsdWUgR2V0TmVnYXRlZEV4cHJlc3Npb24oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExlZ2FsT3BlcmF0aW9ucywgdW5zaWduZWQgRGVwdGggPSAwKSB7CisgIC8vIGZuZWcgaXMgcmVtb3ZhYmxlIGV2ZW4gaWYgaXQgaGFzIG11bHRpcGxlIHVzZXMuCisgIGlmIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZORUcpIHJldHVybiBPcC5nZXRPcGVyYW5kKDApOworCisgIC8vIERvbid0IGFsbG93IGFueXRoaW5nIHdpdGggbXVsdGlwbGUgdXNlcy4KKyAgYXNzZXJ0KE9wLmhhc09uZVVzZSgpICYmICJVbmtub3duIHJldXNlISIpOworCisgIGFzc2VydChEZXB0aCA8PSA2ICYmICJHZXROZWdhdGVkRXhwcmVzc2lvbiBkb2Vzbid0IG1hdGNoIGlzTmVnYXRpYmxlRm9yRnJlZSIpOworICBzd2l0Y2ggKE9wLmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29kZSIpOworICBjYXNlIElTRDo6Q29uc3RhbnRGUDogeworICAgIEFQRmxvYXQgViA9IGNhc3Q8Q29uc3RhbnRGUFNETm9kZT4oT3ApLT5nZXRWYWx1ZUFQRigpOworICAgIFYuY2hhbmdlU2lnbigpOworICAgIHJldHVybiBEQUcuZ2V0Q29uc3RhbnRGUChWLCBPcC5nZXRWYWx1ZVR5cGUoKSk7CisgIH0KKyAgY2FzZSBJU0Q6OkZBREQ6CisgICAgLy8gRklYTUU6IGRldGVybWluZSBiZXR0ZXIgY29uZGl0aW9ucyBmb3IgdGhpcyB4Zm9ybS4KKyAgICBhc3NlcnQoVW5zYWZlRlBNYXRoKTsKKworICAgIC8vIGZvbGQgKGZuZWcgKGZhZGQgQSwgQikpIC0+IChmc3ViIChmbmVnIEEpLCBCKQorICAgIGlmIChpc05lZ2F0aWJsZUZvckZyZWUoT3AuZ2V0T3BlcmFuZCgwKSwgTGVnYWxPcGVyYXRpb25zLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIE9wLmdldERlYnVnTG9jKCksIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5lZ2F0ZWRFeHByZXNzaW9uKE9wLmdldE9wZXJhbmQoMCksIERBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbE9wZXJhdGlvbnMsIERlcHRoKzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMSkpOworICAgIC8vIGZvbGQgKGZuZWcgKGZhZGQgQSwgQikpIC0+IChmc3ViIChmbmVnIEIpLCBBKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIE9wLmdldERlYnVnTG9jKCksIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBHZXROZWdhdGVkRXhwcmVzc2lvbihPcC5nZXRPcGVyYW5kKDEpLCBEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsT3BlcmF0aW9ucywgRGVwdGgrMSksCisgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMCkpOworICBjYXNlIElTRDo6RlNVQjoKKyAgICAvLyBXZSBjYW4ndCB0dXJuIC0oQS1CKSBpbnRvIEItQSB3aGVuIHdlIGhvbm9yIHNpZ25lZCB6ZXJvcy4KKyAgICBhc3NlcnQoVW5zYWZlRlBNYXRoKTsKKworICAgIC8vIGZvbGQgKGZuZWcgKGZzdWIgMCwgQikpIC0+IEIKKyAgICBpZiAoQ29uc3RhbnRGUFNETm9kZSAqTjBDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihPcC5nZXRPcGVyYW5kKDApKSkKKyAgICAgIGlmIChOMENGUC0+Z2V0VmFsdWVBUEYoKS5pc1plcm8oKSkKKyAgICAgICAgcmV0dXJuIE9wLmdldE9wZXJhbmQoMSk7CisKKyAgICAvLyBmb2xkIChmbmVnIChmc3ViIEEsIEIpKSAtPiAoZnN1YiBCLCBBKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIE9wLmdldERlYnVnTG9jKCksIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpLCBPcC5nZXRPcGVyYW5kKDApKTsKKworICBjYXNlIElTRDo6Rk1VTDoKKyAgY2FzZSBJU0Q6OkZESVY6CisgICAgYXNzZXJ0KCFIb25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aCgpKTsKKworICAgIC8vIGZvbGQgKGZuZWcgKGZtdWwgWCwgWSkpIC0+IChmbXVsIChmbmVnIFgpLCBZKQorICAgIGlmIChpc05lZ2F0aWJsZUZvckZyZWUoT3AuZ2V0T3BlcmFuZCgwKSwgTGVnYWxPcGVyYXRpb25zLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShPcC5nZXRPcGNvZGUoKSwgT3AuZ2V0RGVidWdMb2MoKSwgT3AuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmVnYXRlZEV4cHJlc3Npb24oT3AuZ2V0T3BlcmFuZCgwKSwgREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsT3BlcmF0aW9ucywgRGVwdGgrMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgxKSk7CisKKyAgICAvLyBmb2xkIChmbmVnIChmbXVsIFgsIFkpKSAtPiAoZm11bCBYLCAoZm5lZyBZKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoT3AuZ2V0T3Bjb2RlKCksIE9wLmdldERlYnVnTG9jKCksIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICBHZXROZWdhdGVkRXhwcmVzc2lvbihPcC5nZXRPcGVyYW5kKDEpLCBEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsT3BlcmF0aW9ucywgRGVwdGgrMSkpOworCisgIGNhc2UgSVNEOjpGUF9FWFRFTkQ6CisgIGNhc2UgSVNEOjpGU0lOOgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShPcC5nZXRPcGNvZGUoKSwgT3AuZ2V0RGVidWdMb2MoKSwgT3AuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgIEdldE5lZ2F0ZWRFeHByZXNzaW9uKE9wLmdldE9wZXJhbmQoMCksIERBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxPcGVyYXRpb25zLCBEZXB0aCsxKSk7CisgIGNhc2UgSVNEOjpGUF9ST1VORDoKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1JPVU5ELCBPcC5nZXREZWJ1Z0xvYygpLCBPcC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXROZWdhdGVkRXhwcmVzc2lvbihPcC5nZXRPcGVyYW5kKDApLCBEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxPcGVyYXRpb25zLCBEZXB0aCsxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpKTsKKyAgfQorfQorCisKKy8vIGlzU2V0Q0NFcXVpdmFsZW50IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGlzIGEgc2V0Y2MsIG9yIGlzIGEgc2VsZWN0X2NjCisvLyB0aGF0IHNlbGVjdHMgYmV0d2VlbiB0aGUgdmFsdWVzIDEgYW5kIDAsIG1ha2luZyBpdCBlcXVpdmFsZW50IHRvIGEgc2V0Y2MuCisvLyBBbHNvLCBzZXQgdGhlIGluY29taW5nIExIUywgUkhTLCBhbmQgQ0MgcmVmZXJlbmNlcyB0byB0aGUgYXBwcm9wcmlhdGUKKy8vIG5vZGVzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIG5vZGUgd2UgYXJlIGNoZWNraW5nLiAgVGhpcyBzaW1wbGlmaWVzIGxpZmUgYQorLy8gYml0IGZvciB0aGUgY2FsbGVycy4KK3N0YXRpYyBib29sIGlzU2V0Q0NFcXVpdmFsZW50KFNEVmFsdWUgTiwgU0RWYWx1ZSAmTEhTLCBTRFZhbHVlICZSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZDQykgeworICBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNFVENDKSB7CisgICAgTEhTID0gTi5nZXRPcGVyYW5kKDApOworICAgIFJIUyA9IE4uZ2V0T3BlcmFuZCgxKTsKKyAgICBDQyAgPSBOLmdldE9wZXJhbmQoMik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRUxFQ1RfQ0MgJiYKKyAgICAgIE4uZ2V0T3BlcmFuZCgyKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50ICYmCisgICAgICBOLmdldE9wZXJhbmQoMykuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJgorICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDIpKS0+Z2V0QVBJbnRWYWx1ZSgpID09IDEgJiYKKyAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgzKSktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICBMSFMgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgUkhTID0gTi5nZXRPcGVyYW5kKDEpOworICAgIENDICA9IE4uZ2V0T3BlcmFuZCg0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIGlzT25lVXNlU2V0Q0MgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgU2V0Q0MtZXF1aXZhbGVudCBvcGVyYXRpb24gd2l0aCBvbmx5CisvLyBvbmUgdXNlLiAgSWYgdGhpcyBpcyB0cnVlLCBpdCBhbGxvd3MgdGhlIHVzZXJzIHRvIGludmVydCB0aGUgb3BlcmF0aW9uIGZvcgorLy8gZnJlZSB3aGVuIGl0IGlzIHByb2ZpdGFibGUgdG8gZG8gc28uCitzdGF0aWMgYm9vbCBpc09uZVVzZVNldENDKFNEVmFsdWUgTikgeworICBTRFZhbHVlIE4wLCBOMSwgTjI7CisgIGlmIChpc1NldENDRXF1aXZhbGVudChOLCBOMCwgTjEsIE4yKSAmJiBOLmdldE5vZGUoKS0+aGFzT25lVXNlKCkpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6UmVhc3NvY2lhdGVPcHModW5zaWduZWQgT3BjLCBEZWJ1Z0xvYyBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjAsIFNEVmFsdWUgTjEpIHsKKyAgRVZUIFZUID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBPcGMgJiYgaXNhPENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKSkgeworICAgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE4xKSkgeworICAgICAgLy8gcmVhc3NvYy4gKG9wIChvcCB4LCBjMSksIGMyKSAtPiAob3AgeCwgKG9wIGMxLCBjMikpCisgICAgICBTRFZhbHVlIE9wTm9kZSA9CisgICAgICAgIERBRy5Gb2xkQ29uc3RhbnRBcml0aG1ldGljKE9wYywgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihOMSkpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKE9wYywgREwsIFZULCBOMC5nZXRPcGVyYW5kKDApLCBPcE5vZGUpOworICAgIH0gZWxzZSBpZiAoTjAuaGFzT25lVXNlKCkpIHsKKyAgICAgIC8vIHJlYXNzb2MuIChvcCAob3AgeCwgYzEpLCB5KSAtPiAob3AgKG9wIHgsIHkpLCBjMSkgaWZmIHgrYzEgaGFzIG9uZSB1c2UKKyAgICAgIFNEVmFsdWUgT3BOb2RlID0gREFHLmdldE5vZGUoT3BjLCBOMC5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKSwgTjEpOworICAgICAgQWRkVG9Xb3JrTGlzdChPcE5vZGUuZ2V0Tm9kZSgpKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShPcGMsIERMLCBWVCwgT3BOb2RlLCBOMC5nZXRPcGVyYW5kKDEpKTsKKyAgICB9CisgIH0KKworICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gT3BjICYmIGlzYTxDb25zdGFudFNETm9kZT4oTjEuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihOMCkpIHsKKyAgICAgIC8vIHJlYXNzb2MuIChvcCBjMiwgKG9wIHgsIGMxKSkgLT4gKG9wIHgsIChvcCBjMSwgYzIpKQorICAgICAgU0RWYWx1ZSBPcE5vZGUgPQorICAgICAgICBEQUcuRm9sZENvbnN0YW50QXJpdGhtZXRpYyhPcGMsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihOMS5nZXRPcGVyYW5kKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTjApKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShPcGMsIERMLCBWVCwgTjEuZ2V0T3BlcmFuZCgwKSwgT3BOb2RlKTsKKyAgICB9IGVsc2UgaWYgKE4xLmhhc09uZVVzZSgpKSB7CisgICAgICAvLyByZWFzc29jLiAob3AgeSwgKG9wIHgsIGMxKSkgLT4gKG9wIChvcCB4LCB5KSwgYzEpIGlmZiB4K2MxIGhhcyBvbmUgdXNlCisgICAgICBTRFZhbHVlIE9wTm9kZSA9IERBRy5nZXROb2RlKE9wYywgTjAuZ2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4xLmdldE9wZXJhbmQoMCksIE4wKTsKKyAgICAgIEFkZFRvV29ya0xpc3QoT3BOb2RlLmdldE5vZGUoKSk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoT3BjLCBETCwgVlQsIE9wTm9kZSwgTjEuZ2V0T3BlcmFuZCgxKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6Q29tYmluZVRvKFNETm9kZSAqTiwgY29uc3QgU0RWYWx1ZSAqVG8sIHVuc2lnbmVkIE51bVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkVG8pIHsKKyAgYXNzZXJ0KE4tPmdldE51bVZhbHVlcygpID09IE51bVRvICYmICJCcm9rZW4gQ29tYmluZVRvIGNhbGwhIik7CisgICsrTm9kZXNDb21iaW5lZDsKKyAgREVCVUcoZGJncygpIDw8ICJcblJlcGxhY2luZy4xICI7CisgICAgICAgIE4tPmR1bXAoJkRBRyk7CisgICAgICAgIGRiZ3MoKSA8PCAiXG5XaXRoOiAiOworICAgICAgICBUb1swXS5nZXROb2RlKCktPmR1bXAoJkRBRyk7CisgICAgICAgIGRiZ3MoKSA8PCAiIGFuZCAiIDw8IE51bVRvLTEgPDwgIiBvdGhlciB2YWx1ZXNcbiI7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1UbzsgaSAhPSBlOyArK2kpCisgICAgICAgICAgYXNzZXJ0KCghVG9baV0uZ2V0Tm9kZSgpIHx8CisgICAgICAgICAgICAgICAgICBOLT5nZXRWYWx1ZVR5cGUoaSkgPT0gVG9baV0uZ2V0VmFsdWVUeXBlKCkpICYmCisgICAgICAgICAgICAgICAgICJDYW5ub3QgY29tYmluZSB2YWx1ZSB0byB2YWx1ZSBvZiBkaWZmZXJlbnQgdHlwZSEiKSk7CisgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICBEQUcuUmVwbGFjZUFsbFVzZXNXaXRoKE4sIFRvLCAmRGVhZE5vZGVzKTsKKworICBpZiAoQWRkVG8pIHsKKyAgICAvLyBQdXNoIHRoZSBuZXcgbm9kZXMgYW5kIGFueSB1c2VycyBvbnRvIHRoZSB3b3JrbGlzdAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1UbzsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChUb1tpXS5nZXROb2RlKCkpIHsKKyAgICAgICAgQWRkVG9Xb3JrTGlzdChUb1tpXS5nZXROb2RlKCkpOworICAgICAgICBBZGRVc2Vyc1RvV29ya0xpc3QoVG9baV0uZ2V0Tm9kZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBGaW5hbGx5LCBpZiB0aGUgbm9kZSBpcyBub3cgZGVhZCwgcmVtb3ZlIGl0IGZyb20gdGhlIGdyYXBoLiAgVGhlIG5vZGUKKyAgLy8gbWF5IG5vdCBiZSBkZWFkIGlmIHRoZSByZXBsYWNlbWVudCBwcm9jZXNzIHJlY3Vyc2l2ZWx5IHNpbXBsaWZpZWQgdG8KKyAgLy8gc29tZXRoaW5nIGVsc2UgbmVlZGluZyB0aGlzIG5vZGUuCisgIGlmIChOLT51c2VfZW1wdHkoKSkgeworICAgIC8vIE5vZGVzIGNhbiBiZSByZWludHJvZHVjZWQgaW50byB0aGUgd29ya2xpc3QuICBNYWtlIHN1cmUgd2UgZG8gbm90CisgICAgLy8gcHJvY2VzcyBhIG5vZGUgdGhhdCBoYXMgYmVlbiByZXBsYWNlZC4KKyAgICByZW1vdmVGcm9tV29ya0xpc3QoTik7CisKKyAgICAvLyBGaW5hbGx5LCBzaW5jZSB0aGUgbm9kZSBpcyBub3cgZGVhZCwgcmVtb3ZlIGl0IGZyb20gdGhlIGdyYXBoLgorICAgIERBRy5EZWxldGVOb2RlKE4pOworICB9CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCit2b2lkIERBR0NvbWJpbmVyOjoKK0NvbW1pdFRhcmdldExvd2VyaW5nT3B0KGNvbnN0IFRhcmdldExvd2VyaW5nOjpUYXJnZXRMb3dlcmluZ09wdCAmVExPKSB7CisgIC8vIFJlcGxhY2UgYWxsIHVzZXMuICBJZiBhbnkgbm9kZXMgYmVjb21lIGlzb21vcnBoaWMgdG8gb3RoZXIgbm9kZXMgYW5kCisgIC8vIGFyZSBkZWxldGVkLCBtYWtlIHN1cmUgdG8gcmVtb3ZlIHRoZW0gZnJvbSBvdXIgd29ya2xpc3QuCisgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChUTE8uT2xkLCBUTE8uTmV3LCAmRGVhZE5vZGVzKTsKKworICAvLyBQdXNoIHRoZSBuZXcgbm9kZSBhbmQgYW55IChwb3NzaWJseSBuZXcpIHVzZXJzIG9udG8gdGhlIHdvcmtsaXN0LgorICBBZGRUb1dvcmtMaXN0KFRMTy5OZXcuZ2V0Tm9kZSgpKTsKKyAgQWRkVXNlcnNUb1dvcmtMaXN0KFRMTy5OZXcuZ2V0Tm9kZSgpKTsKKworICAvLyBGaW5hbGx5LCBpZiB0aGUgbm9kZSBpcyBub3cgZGVhZCwgcmVtb3ZlIGl0IGZyb20gdGhlIGdyYXBoLiAgVGhlIG5vZGUKKyAgLy8gbWF5IG5vdCBiZSBkZWFkIGlmIHRoZSByZXBsYWNlbWVudCBwcm9jZXNzIHJlY3Vyc2l2ZWx5IHNpbXBsaWZpZWQgdG8KKyAgLy8gc29tZXRoaW5nIGVsc2UgbmVlZGluZyB0aGlzIG5vZGUuCisgIGlmIChUTE8uT2xkLmdldE5vZGUoKS0+dXNlX2VtcHR5KCkpIHsKKyAgICByZW1vdmVGcm9tV29ya0xpc3QoVExPLk9sZC5nZXROb2RlKCkpOworCisgICAgLy8gSWYgdGhlIG9wZXJhbmRzIG9mIHRoaXMgbm9kZSBhcmUgb25seSB1c2VkIGJ5IHRoZSBub2RlLCB0aGV5IHdpbGwgbm93CisgICAgLy8gYmUgZGVhZC4gIE1ha2Ugc3VyZSB0byB2aXNpdCB0aGVtIGZpcnN0IHRvIGRlbGV0ZSBkZWFkIG5vZGVzIGVhcmx5LgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUTE8uT2xkLmdldE5vZGUoKS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVExPLk9sZC5nZXROb2RlKCktPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkKKyAgICAgICAgQWRkVG9Xb3JrTGlzdChUTE8uT2xkLmdldE5vZGUoKS0+Z2V0T3BlcmFuZChpKS5nZXROb2RlKCkpOworCisgICAgREFHLkRlbGV0ZU5vZGUoVExPLk9sZC5nZXROb2RlKCkpOworICB9Cit9CisKKy8vLyBTaW1wbGlmeURlbWFuZGVkQml0cyAtIENoZWNrIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBub2RlIHZhbHVlIHRvIHNlZSBpZgorLy8vIGl0IGNhbiBiZSBzaW1wbGlmaWVkIG9yIGlmIHRoaW5ncyBpdCB1c2VzIGNhbiBiZSBzaW1wbGlmaWVkIGJ5IGJpdAorLy8vIHByb3BhZ2F0aW9uLiAgSWYgc28sIHJldHVybiB0cnVlLgorYm9vbCBEQUdDb21iaW5lcjo6U2ltcGxpZnlEZW1hbmRlZEJpdHMoU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJkRlbWFuZGVkKSB7CisgIFRhcmdldExvd2VyaW5nOjpUYXJnZXRMb3dlcmluZ09wdCBUTE8oREFHLCBMZWdhbFR5cGVzLCBMZWdhbE9wZXJhdGlvbnMpOworICBBUEludCBLbm93blplcm8sIEtub3duT25lOworICBpZiAoIVRMSS5TaW1wbGlmeURlbWFuZGVkQml0cyhPcCwgRGVtYW5kZWQsIEtub3duWmVybywgS25vd25PbmUsIFRMTykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFJldmlzaXQgdGhlIG5vZGUuCisgIEFkZFRvV29ya0xpc3QoT3AuZ2V0Tm9kZSgpKTsKKworICAvLyBSZXBsYWNlIHRoZSBvbGQgdmFsdWUgd2l0aCB0aGUgbmV3IG9uZS4KKyAgKytOb2Rlc0NvbWJpbmVkOworICBERUJVRyhkYmdzKCkgPDwgIlxuUmVwbGFjaW5nLjIgIjsgCisgICAgICAgIFRMTy5PbGQuZ2V0Tm9kZSgpLT5kdW1wKCZEQUcpOworICAgICAgICBkYmdzKCkgPDwgIlxuV2l0aDogIjsKKyAgICAgICAgVExPLk5ldy5nZXROb2RlKCktPmR1bXAoJkRBRyk7CisgICAgICAgIGRiZ3MoKSA8PCAnXG4nKTsKKworICBDb21taXRUYXJnZXRMb3dlcmluZ09wdChUTE8pOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBEQUdDb21iaW5lcjo6UmVwbGFjZUxvYWRXaXRoUHJvbW90ZWRMb2FkKFNETm9kZSAqTG9hZCwgU0ROb2RlICpFeHRMb2FkKSB7CisgIERlYnVnTG9jIGRsID0gTG9hZC0+Z2V0RGVidWdMb2MoKTsKKyAgRVZUIFZUID0gTG9hZC0+Z2V0VmFsdWVUeXBlKDApOworICBTRFZhbHVlIFRydW5jID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFZULCBTRFZhbHVlKEV4dExvYWQsIDApKTsKKworICBERUJVRyhkYmdzKCkgPDwgIlxuUmVwbGFjaW5nLjkgIjsKKyAgICAgICAgTG9hZC0+ZHVtcCgmREFHKTsKKyAgICAgICAgZGJncygpIDw8ICJcbldpdGg6ICI7CisgICAgICAgIFRydW5jLmdldE5vZGUoKS0+ZHVtcCgmREFHKTsKKyAgICAgICAgZGJncygpIDw8ICdcbicpOworICBXb3JrTGlzdFJlbW92ZXIgRGVhZE5vZGVzKCp0aGlzKTsKKyAgREFHLlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShMb2FkLCAwKSwgVHJ1bmMsICZEZWFkTm9kZXMpOworICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlKExvYWQsIDEpLCBTRFZhbHVlKEV4dExvYWQsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRGVhZE5vZGVzKTsKKyAgcmVtb3ZlRnJvbVdvcmtMaXN0KExvYWQpOworICBEQUcuRGVsZXRlTm9kZShMb2FkKTsKKyAgQWRkVG9Xb3JrTGlzdChUcnVuYy5nZXROb2RlKCkpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjpQcm9tb3RlT3BlcmFuZChTRFZhbHVlIE9wLCBFVlQgUFZULCBib29sICZSZXBsYWNlKSB7CisgIFJlcGxhY2UgPSBmYWxzZTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBpZiAoTG9hZFNETm9kZSAqTEQgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihPcCkpIHsKKyAgICBFVlQgTWVtVlQgPSBMRC0+Z2V0TWVtb3J5VlQoKTsKKyAgICBJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUgPSBJU0Q6OmlzTk9OX0VYVExvYWQoTEQpCisgICAgICA/IChUTEkuaXNMb2FkRXh0TGVnYWwoSVNEOjpaRVhUTE9BRCwgTWVtVlQpID8gSVNEOjpaRVhUTE9BRCA6IElTRDo6RVhUTE9BRCkKKyAgICAgIDogTEQtPmdldEV4dGVuc2lvblR5cGUoKTsKKyAgICBSZXBsYWNlID0gdHJ1ZTsKKyAgICByZXR1cm4gREFHLmdldEV4dExvYWQoRXh0VHlwZSwgUFZULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmdldENoYWluKCksIExELT5nZXRCYXNlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5nZXRTcmNWYWx1ZSgpLCBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtVlQsIExELT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5pc05vblRlbXBvcmFsKCksIExELT5nZXRBbGlnbm1lbnQoKSk7CisgIH0KKworICB1bnNpZ25lZCBPcGMgPSBPcC5nZXRPcGNvZGUoKTsKKyAgc3dpdGNoIChPcGMpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpBc3NlcnRTZXh0OgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFNleHQsIGRsLCBQVlQsCisgICAgICAgICAgICAgICAgICAgICAgIFNFeHRQcm9tb3RlT3BlcmFuZChPcC5nZXRPcGVyYW5kKDApLCBQVlQpLAorICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpKTsKKyAgY2FzZSBJU0Q6OkFzc2VydFpleHQ6CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QXNzZXJ0WmV4dCwgZGwsIFBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgWkV4dFByb21vdGVPcGVyYW5kKE9wLmdldE9wZXJhbmQoMCksIFBWVCksCisgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMSkpOworICBjYXNlIElTRDo6Q29uc3RhbnQ6IHsKKyAgICB1bnNpZ25lZCBFeHRPcGMgPQorICAgICAgT3AuZ2V0VmFsdWVUeXBlKCkuaXNCeXRlU2l6ZWQoKSA/IElTRDo6U0lHTl9FWFRFTkQgOiBJU0Q6OlpFUk9fRVhURU5EOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShFeHRPcGMsIGRsLCBQVlQsIE9wKTsKKyAgfSAgICAKKyAgfQorCisgIGlmICghVExJLmlzT3BlcmF0aW9uTGVnYWwoSVNEOjpBTllfRVhURU5ELCBQVlQpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLCBQVlQsIE9wKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6U0V4dFByb21vdGVPcGVyYW5kKFNEVmFsdWUgT3AsIEVWVCBQVlQpIHsKKyAgaWYgKCFUTEkuaXNPcGVyYXRpb25MZWdhbChJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBQVlQpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIEVWVCBPbGRWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGJvb2wgUmVwbGFjZSA9IGZhbHNlOworICBTRFZhbHVlIE5ld09wID0gUHJvbW90ZU9wZXJhbmQoT3AsIFBWVCwgUmVwbGFjZSk7CisgIGlmIChOZXdPcC5nZXROb2RlKCkgPT0gMCkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICBBZGRUb1dvcmtMaXN0KE5ld09wLmdldE5vZGUoKSk7CisKKyAgaWYgKFJlcGxhY2UpCisgICAgUmVwbGFjZUxvYWRXaXRoUHJvbW90ZWRMb2FkKE9wLmdldE5vZGUoKSwgTmV3T3AuZ2V0Tm9kZSgpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIGRsLCBOZXdPcC5nZXRWYWx1ZVR5cGUoKSwgTmV3T3AsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKE9sZFZUKSk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OlpFeHRQcm9tb3RlT3BlcmFuZChTRFZhbHVlIE9wLCBFVlQgUFZUKSB7CisgIEVWVCBPbGRWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGJvb2wgUmVwbGFjZSA9IGZhbHNlOworICBTRFZhbHVlIE5ld09wID0gUHJvbW90ZU9wZXJhbmQoT3AsIFBWVCwgUmVwbGFjZSk7CisgIGlmIChOZXdPcC5nZXROb2RlKCkgPT0gMCkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICBBZGRUb1dvcmtMaXN0KE5ld09wLmdldE5vZGUoKSk7CisKKyAgaWYgKFJlcGxhY2UpCisgICAgUmVwbGFjZUxvYWRXaXRoUHJvbW90ZWRMb2FkKE9wLmdldE5vZGUoKSwgTmV3T3AuZ2V0Tm9kZSgpKTsKKyAgcmV0dXJuIERBRy5nZXRaZXJvRXh0ZW5kSW5SZWcoTmV3T3AsIGRsLCBPbGRWVCk7Cit9CisKKy8vLyBQcm9tb3RlSW50QmluT3AgLSBQcm9tb3RlIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBiaW5hcnkgb3BlcmF0aW9uIGlmIHRoZQorLy8vIHRhcmdldCBpbmRpY2F0ZXMgaXQgaXMgYmVuZWZpY2lhbC4gZS5nLiBPbiB4ODYsIGl0J3MgdXN1YWxseSBiZXR0ZXIgdG8KKy8vLyBwcm9tb3RlIGkxNiBvcGVyYXRpb25zIHRvIGkzMiBzaW5jZSBpMTYgaW5zdHJ1Y3Rpb25zIGFyZSBsb25nZXIuCitTRFZhbHVlIERBR0NvbWJpbmVyOjpQcm9tb3RlSW50QmluT3AoU0RWYWx1ZSBPcCkgeworICBpZiAoIUxlZ2FsT3BlcmF0aW9ucykKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBpZiAoVlQuaXNWZWN0b3IoKSB8fCAhVlQuaXNJbnRlZ2VyKCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAvLyBJZiBvcGVyYXRpb24gdHlwZSBpcyAndW5kZXNpcmFibGUnLCBlLmcuIGkxNiBvbiB4ODYsIGNvbnNpZGVyCisgIC8vIHByb21vdGluZyBpdC4KKyAgdW5zaWduZWQgT3BjID0gT3AuZ2V0T3Bjb2RlKCk7CisgIGlmIChUTEkuaXNUeXBlRGVzaXJhYmxlRm9yT3AoT3BjLCBWVCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBFVlQgUFZUID0gVlQ7CisgIC8vIENvbnN1bHQgdGFyZ2V0IHdoZXRoZXIgaXQgaXMgYSBnb29kIGlkZWEgdG8gcHJvbW90ZSB0aGlzIG9wZXJhdGlvbiBhbmQKKyAgLy8gd2hhdCdzIHRoZSByaWdodCB0eXBlIHRvIHByb21vdGUgaXQgdG8uCisgIGlmIChUTEkuSXNEZXNpcmFibGVUb1Byb21vdGVPcChPcCwgUFZUKSkgeworICAgIGFzc2VydChQVlQgIT0gVlQgJiYgIkRvbid0IGtub3cgd2hhdCB0eXBlIHRvIHByb21vdGUgdG8hIik7CisKKyAgICBib29sIFJlcGxhY2UwID0gZmFsc2U7CisgICAgU0RWYWx1ZSBOMCA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBOTjAgPSBQcm9tb3RlT3BlcmFuZChOMCwgUFZULCBSZXBsYWNlMCk7CisgICAgaWYgKE5OMC5nZXROb2RlKCkgPT0gMCkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICBib29sIFJlcGxhY2UxID0gZmFsc2U7CisgICAgU0RWYWx1ZSBOMSA9IE9wLmdldE9wZXJhbmQoMSk7CisgICAgU0RWYWx1ZSBOTjE7CisgICAgaWYgKE4wID09IE4xKQorICAgICAgTk4xID0gTk4wOworICAgIGVsc2UgeworICAgICAgTk4xID0gUHJvbW90ZU9wZXJhbmQoTjEsIFBWVCwgUmVwbGFjZTEpOworICAgICAgaWYgKE5OMS5nZXROb2RlKCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICB9CisKKyAgICBBZGRUb1dvcmtMaXN0KE5OMC5nZXROb2RlKCkpOworICAgIGlmIChOTjEuZ2V0Tm9kZSgpKQorICAgICAgQWRkVG9Xb3JrTGlzdChOTjEuZ2V0Tm9kZSgpKTsKKworICAgIGlmIChSZXBsYWNlMCkKKyAgICAgIFJlcGxhY2VMb2FkV2l0aFByb21vdGVkTG9hZChOMC5nZXROb2RlKCksIE5OMC5nZXROb2RlKCkpOworICAgIGlmIChSZXBsYWNlMSkKKyAgICAgIFJlcGxhY2VMb2FkV2l0aFByb21vdGVkTG9hZChOMS5nZXROb2RlKCksIE5OMS5nZXROb2RlKCkpOworCisgICAgREVCVUcoZGJncygpIDw8ICJcblByb21vdGluZyAiOworICAgICAgICAgIE9wLmdldE5vZGUoKS0+ZHVtcCgmREFHKSk7CisgICAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKE9wYywgZGwsIFBWVCwgTk4wLCBOTjEpKTsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gUHJvbW90ZUludFNoaWZ0T3AgLSBQcm9tb3RlIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBzaGlmdCBvcGVyYXRpb24gaWYgdGhlCisvLy8gdGFyZ2V0IGluZGljYXRlcyBpdCBpcyBiZW5lZmljaWFsLiBlLmcuIE9uIHg4NiwgaXQncyB1c3VhbGx5IGJldHRlciB0bworLy8vIHByb21vdGUgaTE2IG9wZXJhdGlvbnMgdG8gaTMyIHNpbmNlIGkxNiBpbnN0cnVjdGlvbnMgYXJlIGxvbmdlci4KK1NEVmFsdWUgREFHQ29tYmluZXI6OlByb21vdGVJbnRTaGlmdE9wKFNEVmFsdWUgT3ApIHsKKyAgaWYgKCFMZWdhbE9wZXJhdGlvbnMpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgaWYgKFZULmlzVmVjdG9yKCkgfHwgIVZULmlzSW50ZWdlcigpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgLy8gSWYgb3BlcmF0aW9uIHR5cGUgaXMgJ3VuZGVzaXJhYmxlJywgZS5nLiBpMTYgb24geDg2LCBjb25zaWRlcgorICAvLyBwcm9tb3RpbmcgaXQuCisgIHVuc2lnbmVkIE9wYyA9IE9wLmdldE9wY29kZSgpOworICBpZiAoVExJLmlzVHlwZURlc2lyYWJsZUZvck9wKE9wYywgVlQpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgRVZUIFBWVCA9IFZUOworICAvLyBDb25zdWx0IHRhcmdldCB3aGV0aGVyIGl0IGlzIGEgZ29vZCBpZGVhIHRvIHByb21vdGUgdGhpcyBvcGVyYXRpb24gYW5kCisgIC8vIHdoYXQncyB0aGUgcmlnaHQgdHlwZSB0byBwcm9tb3RlIGl0IHRvLgorICBpZiAoVExJLklzRGVzaXJhYmxlVG9Qcm9tb3RlT3AoT3AsIFBWVCkpIHsKKyAgICBhc3NlcnQoUFZUICE9IFZUICYmICJEb24ndCBrbm93IHdoYXQgdHlwZSB0byBwcm9tb3RlIHRvISIpOworCisgICAgYm9vbCBSZXBsYWNlID0gZmFsc2U7CisgICAgU0RWYWx1ZSBOMCA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgaWYgKE9wYyA9PSBJU0Q6OlNSQSkKKyAgICAgIE4wID0gU0V4dFByb21vdGVPcGVyYW5kKE9wLmdldE9wZXJhbmQoMCksIFBWVCk7CisgICAgZWxzZSBpZiAoT3BjID09IElTRDo6U1JMKQorICAgICAgTjAgPSBaRXh0UHJvbW90ZU9wZXJhbmQoT3AuZ2V0T3BlcmFuZCgwKSwgUFZUKTsKKyAgICBlbHNlCisgICAgICBOMCA9IFByb21vdGVPcGVyYW5kKE4wLCBQVlQsIFJlcGxhY2UpOworICAgIGlmIChOMC5nZXROb2RlKCkgPT0gMCkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICBBZGRUb1dvcmtMaXN0KE4wLmdldE5vZGUoKSk7CisgICAgaWYgKFJlcGxhY2UpCisgICAgICBSZXBsYWNlTG9hZFdpdGhQcm9tb3RlZExvYWQoT3AuZ2V0T3BlcmFuZCgwKS5nZXROb2RlKCksIE4wLmdldE5vZGUoKSk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuUHJvbW90aW5nICI7CisgICAgICAgICAgT3AuZ2V0Tm9kZSgpLT5kdW1wKCZEQUcpKTsKKyAgICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoT3BjLCBkbCwgUFZULCBOMCwgT3AuZ2V0T3BlcmFuZCgxKSkpOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OlByb21vdGVFeHRlbmQoU0RWYWx1ZSBPcCkgeworICBpZiAoIUxlZ2FsT3BlcmF0aW9ucykKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBpZiAoVlQuaXNWZWN0b3IoKSB8fCAhVlQuaXNJbnRlZ2VyKCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAvLyBJZiBvcGVyYXRpb24gdHlwZSBpcyAndW5kZXNpcmFibGUnLCBlLmcuIGkxNiBvbiB4ODYsIGNvbnNpZGVyCisgIC8vIHByb21vdGluZyBpdC4KKyAgdW5zaWduZWQgT3BjID0gT3AuZ2V0T3Bjb2RlKCk7CisgIGlmIChUTEkuaXNUeXBlRGVzaXJhYmxlRm9yT3AoT3BjLCBWVCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBFVlQgUFZUID0gVlQ7CisgIC8vIENvbnN1bHQgdGFyZ2V0IHdoZXRoZXIgaXQgaXMgYSBnb29kIGlkZWEgdG8gcHJvbW90ZSB0aGlzIG9wZXJhdGlvbiBhbmQKKyAgLy8gd2hhdCdzIHRoZSByaWdodCB0eXBlIHRvIHByb21vdGUgaXQgdG8uCisgIGlmIChUTEkuSXNEZXNpcmFibGVUb1Byb21vdGVPcChPcCwgUFZUKSkgeworICAgIGFzc2VydChQVlQgIT0gVlQgJiYgIkRvbid0IGtub3cgd2hhdCB0eXBlIHRvIHByb21vdGUgdG8hIik7CisgICAgLy8gZm9sZCAoYWV4dCAoYWV4dCB4KSkgLT4gKGFleHQgeCkKKyAgICAvLyBmb2xkIChhZXh0ICh6ZXh0IHgpKSAtPiAoemV4dCB4KQorICAgIC8vIGZvbGQgKGFleHQgKHNleHQgeCkpIC0+IChzZXh0IHgpCisgICAgREVCVUcoZGJncygpIDw8ICJcblByb21vdGluZyAiOworICAgICAgICAgIE9wLmdldE5vZGUoKS0+ZHVtcCgmREFHKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKE9wLmdldE9wY29kZSgpLCBPcC5nZXREZWJ1Z0xvYygpLCBWVCwgT3AuZ2V0T3BlcmFuZCgwKSk7CisgIH0KKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworYm9vbCBEQUdDb21iaW5lcjo6UHJvbW90ZUxvYWQoU0RWYWx1ZSBPcCkgeworICBpZiAoIUxlZ2FsT3BlcmF0aW9ucykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIGlmIChWVC5pc1ZlY3RvcigpIHx8ICFWVC5pc0ludGVnZXIoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgb3BlcmF0aW9uIHR5cGUgaXMgJ3VuZGVzaXJhYmxlJywgZS5nLiBpMTYgb24geDg2LCBjb25zaWRlcgorICAvLyBwcm9tb3RpbmcgaXQuCisgIHVuc2lnbmVkIE9wYyA9IE9wLmdldE9wY29kZSgpOworICBpZiAoVExJLmlzVHlwZURlc2lyYWJsZUZvck9wKE9wYywgVlQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBFVlQgUFZUID0gVlQ7CisgIC8vIENvbnN1bHQgdGFyZ2V0IHdoZXRoZXIgaXQgaXMgYSBnb29kIGlkZWEgdG8gcHJvbW90ZSB0aGlzIG9wZXJhdGlvbiBhbmQKKyAgLy8gd2hhdCdzIHRoZSByaWdodCB0eXBlIHRvIHByb21vdGUgaXQgdG8uCisgIGlmIChUTEkuSXNEZXNpcmFibGVUb1Byb21vdGVPcChPcCwgUFZUKSkgeworICAgIGFzc2VydChQVlQgIT0gVlQgJiYgIkRvbid0IGtub3cgd2hhdCB0eXBlIHRvIHByb21vdGUgdG8hIik7CisKKyAgICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgICAgU0ROb2RlICpOID0gT3AuZ2V0Tm9kZSgpOworICAgIExvYWRTRE5vZGUgKkxEID0gY2FzdDxMb2FkU0ROb2RlPihOKTsKKyAgICBFVlQgTWVtVlQgPSBMRC0+Z2V0TWVtb3J5VlQoKTsKKyAgICBJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUgPSBJU0Q6OmlzTk9OX0VYVExvYWQoTEQpCisgICAgICA/IChUTEkuaXNMb2FkRXh0TGVnYWwoSVNEOjpaRVhUTE9BRCwgTWVtVlQpID8gSVNEOjpaRVhUTE9BRCA6IElTRDo6RVhUTE9BRCkKKyAgICAgIDogTEQtPmdldEV4dGVuc2lvblR5cGUoKTsKKyAgICBTRFZhbHVlIE5ld0xEID0gREFHLmdldEV4dExvYWQoRXh0VHlwZSwgUFZULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmdldENoYWluKCksIExELT5nZXRCYXNlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5nZXRTcmNWYWx1ZSgpLCBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtVlQsIExELT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5pc05vblRlbXBvcmFsKCksIExELT5nZXRBbGlnbm1lbnQoKSk7CisgICAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgVlQsIE5ld0xEKTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiXG5Qcm9tb3RpbmcgIjsKKyAgICAgICAgICBOLT5kdW1wKCZEQUcpOworICAgICAgICAgIGRiZ3MoKSA8PCAiXG5UbzogIjsKKyAgICAgICAgICBSZXN1bHQuZ2V0Tm9kZSgpLT5kdW1wKCZEQUcpOworICAgICAgICAgIGRiZ3MoKSA8PCAnXG4nKTsKKyAgICBXb3JrTGlzdFJlbW92ZXIgRGVhZE5vZGVzKCp0aGlzKTsKKyAgICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlKE4sIDApLCBSZXN1bHQsICZEZWFkTm9kZXMpOworICAgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksIE5ld0xELmdldFZhbHVlKDEpLCAmRGVhZE5vZGVzKTsKKyAgICByZW1vdmVGcm9tV29ya0xpc3QoTik7CisgICAgREFHLkRlbGV0ZU5vZGUoTik7CisgICAgQWRkVG9Xb3JrTGlzdChSZXN1bHQuZ2V0Tm9kZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBNYWluIERBRyBDb21iaW5lciBpbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBEQUdDb21iaW5lcjo6UnVuKENvbWJpbmVMZXZlbCBBdExldmVsKSB7CisgIC8vIHNldCB0aGUgaW5zdGFuY2UgdmFyaWFibGVzLCBzbyB0aGF0IHRoZSB2YXJpb3VzIHZpc2l0IHJvdXRpbmVzIG1heSB1c2UgaXQuCisgIExldmVsID0gQXRMZXZlbDsKKyAgTGVnYWxPcGVyYXRpb25zID0gTGV2ZWwgPj0gTm9JbGxlZ2FsT3BlcmF0aW9uczsKKyAgTGVnYWxUeXBlcyA9IExldmVsID49IE5vSWxsZWdhbFR5cGVzOworCisgIC8vIEFkZCBhbGwgdGhlIGRhZyBub2RlcyB0byB0aGUgd29ya2xpc3QuCisgIFdvcmtMaXN0LnJlc2VydmUoREFHLmFsbG5vZGVzX3NpemUoKSk7CisgIGZvciAoU2VsZWN0aW9uREFHOjphbGxub2Rlc19pdGVyYXRvciBJID0gREFHLmFsbG5vZGVzX2JlZ2luKCksCisgICAgICAgRSA9IERBRy5hbGxub2Rlc19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgV29ya0xpc3QucHVzaF9iYWNrKEkpOworCisgIC8vIENyZWF0ZSBhIGR1bW15IG5vZGUgKHdoaWNoIGlzIG5vdCBhZGRlZCB0byBhbGxub2RlcyksIHRoYXQgYWRkcyBhIHJlZmVyZW5jZQorICAvLyB0byB0aGUgcm9vdCBub2RlLCBwcmV2ZW50aW5nIGl0IGZyb20gYmVpbmcgZGVsZXRlZCwgYW5kIHRyYWNraW5nIGFueQorICAvLyBjaGFuZ2VzIG9mIHRoZSByb290LgorICBIYW5kbGVTRE5vZGUgRHVtbXkoREFHLmdldFJvb3QoKSk7CisKKyAgLy8gVGhlIHJvb3Qgb2YgdGhlIGRhZyBtYXkgZGFuZ2xlIHRvIGRlbGV0ZWQgbm9kZXMgdW50aWwgdGhlIGRhZyBjb21iaW5lciBpcworICAvLyBkb25lLiAgU2V0IGl0IHRvIG51bGwgdG8gYXZvaWQgY29uZnVzaW9uLgorICBEQUcuc2V0Um9vdChTRFZhbHVlKCkpOworCisgIC8vIHdoaWxlIHRoZSB3b3JrbGlzdCBpc24ndCBlbXB0eSwgaW5zcGVjdCB0aGUgbm9kZSBvbiB0aGUgZW5kIG9mIGl0IGFuZAorICAvLyB0cnkgYW5kIGNvbWJpbmUgaXQuCisgIHdoaWxlICghV29ya0xpc3QuZW1wdHkoKSkgeworICAgIFNETm9kZSAqTiA9IFdvcmtMaXN0LmJhY2soKTsKKyAgICBXb3JrTGlzdC5wb3BfYmFjaygpOworCisgICAgLy8gSWYgTiBoYXMgbm8gdXNlcywgaXQgaXMgZGVhZC4gIE1ha2Ugc3VyZSB0byByZXZpc2l0IGFsbCBOJ3Mgb3BlcmFuZHMgb25jZQorICAgIC8vIE4gaXMgZGVsZXRlZCBmcm9tIHRoZSBEQUcsIHNpbmNlIHRoZXkgdG9vIG1heSBub3cgYmUgZGVhZCBvciBtYXkgaGF2ZSBhCisgICAgLy8gcmVkdWNlZCBudW1iZXIgb2YgdXNlcywgYWxsb3dpbmcgb3RoZXIgeGZvcm1zLgorICAgIGlmIChOLT51c2VfZW1wdHkoKSAmJiBOICE9ICZEdW1teSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBBZGRUb1dvcmtMaXN0KE4tPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpKTsKKworICAgICAgREFHLkRlbGV0ZU5vZGUoTik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBTRFZhbHVlIFJWID0gY29tYmluZShOKTsKKworICAgIGlmIChSVi5nZXROb2RlKCkgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgKytOb2Rlc0NvbWJpbmVkOworCisgICAgLy8gSWYgd2UgZ2V0IGJhY2sgdGhlIHNhbWUgbm9kZSB3ZSBwYXNzZWQgaW4sIHJhdGhlciB0aGFuIGEgbmV3IG5vZGUgb3IKKyAgICAvLyB6ZXJvLCB3ZSBrbm93IHRoYXQgdGhlIG5vZGUgbXVzdCBoYXZlIGRlZmluZWQgbXVsdGlwbGUgdmFsdWVzIGFuZAorICAgIC8vIENvbWJpbmVUbyB3YXMgdXNlZC4gIFNpbmNlIENvbWJpbmVUbyB0YWtlcyBjYXJlIG9mIHRoZSB3b3JrbGlzdAorICAgIC8vIG1lY2hhbmljcyBmb3IgdXMsIHdlIGhhdmUgbm8gd29yayB0byBkbyBpbiB0aGlzIGNhc2UuCisgICAgaWYgKFJWLmdldE5vZGUoKSA9PSBOKQorICAgICAgY29udGludWU7CisKKyAgICBhc3NlcnQoTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpERUxFVEVEX05PREUgJiYKKyAgICAgICAgICAgUlYuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OkRFTEVURURfTk9ERSAmJgorICAgICAgICAgICAiTm9kZSB3YXMgZGVsZXRlZCBidXQgdmlzaXQgcmV0dXJuZWQgbmV3IG5vZGUhIik7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuUmVwbGFjaW5nLjMgIjsgCisgICAgICAgICAgTi0+ZHVtcCgmREFHKTsKKyAgICAgICAgICBkYmdzKCkgPDwgIlxuV2l0aDogIjsKKyAgICAgICAgICBSVi5nZXROb2RlKCktPmR1bXAoJkRBRyk7CisgICAgICAgICAgZGJncygpIDw8ICdcbicpOworICAgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICAgIGlmIChOLT5nZXROdW1WYWx1ZXMoKSA9PSBSVi5nZXROb2RlKCktPmdldE51bVZhbHVlcygpKQorICAgICAgREFHLlJlcGxhY2VBbGxVc2VzV2l0aChOLCBSVi5nZXROb2RlKCksICZEZWFkTm9kZXMpOworICAgIGVsc2UgeworICAgICAgYXNzZXJ0KE4tPmdldFZhbHVlVHlwZSgwKSA9PSBSVi5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgICAgIE4tPmdldE51bVZhbHVlcygpID09IDEgJiYgIlR5cGUgbWlzbWF0Y2giKTsKKyAgICAgIFNEVmFsdWUgT3BWID0gUlY7CisgICAgICBEQUcuUmVwbGFjZUFsbFVzZXNXaXRoKE4sICZPcFYsICZEZWFkTm9kZXMpOworICAgIH0KKworICAgIC8vIFB1c2ggdGhlIG5ldyBub2RlIGFuZCBhbnkgdXNlcnMgb250byB0aGUgd29ya2xpc3QKKyAgICBBZGRUb1dvcmtMaXN0KFJWLmdldE5vZGUoKSk7CisgICAgQWRkVXNlcnNUb1dvcmtMaXN0KFJWLmdldE5vZGUoKSk7CisKKyAgICAvLyBBZGQgYW55IHVzZXMgb2YgdGhlIG9sZCBub2RlIHRvIHRoZSB3b3JrbGlzdCBpbiBjYXNlIHRoaXMgbm9kZSBpcyB0aGUKKyAgICAvLyBsYXN0IG9uZSB0aGF0IHVzZXMgdGhlbS4gIFRoZXkgbWF5IGJlY29tZSBkZWFkIGFmdGVyIHRoaXMgbm9kZSBpcworICAgIC8vIGRlbGV0ZWQuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgQWRkVG9Xb3JrTGlzdChOLT5nZXRPcGVyYW5kKGkpLmdldE5vZGUoKSk7CisKKyAgICAvLyBGaW5hbGx5LCBpZiB0aGUgbm9kZSBpcyBub3cgZGVhZCwgcmVtb3ZlIGl0IGZyb20gdGhlIGdyYXBoLiAgVGhlIG5vZGUKKyAgICAvLyBtYXkgbm90IGJlIGRlYWQgaWYgdGhlIHJlcGxhY2VtZW50IHByb2Nlc3MgcmVjdXJzaXZlbHkgc2ltcGxpZmllZCB0bworICAgIC8vIHNvbWV0aGluZyBlbHNlIG5lZWRpbmcgdGhpcyBub2RlLgorICAgIGlmIChOLT51c2VfZW1wdHkoKSkgeworICAgICAgLy8gTm9kZXMgY2FuIGJlIHJlaW50cm9kdWNlZCBpbnRvIHRoZSB3b3JrbGlzdC4gIE1ha2Ugc3VyZSB3ZSBkbyBub3QKKyAgICAgIC8vIHByb2Nlc3MgYSBub2RlIHRoYXQgaGFzIGJlZW4gcmVwbGFjZWQuCisgICAgICByZW1vdmVGcm9tV29ya0xpc3QoTik7CisKKyAgICAgIC8vIEZpbmFsbHksIHNpbmNlIHRoZSBub2RlIGlzIG5vdyBkZWFkLCByZW1vdmUgaXQgZnJvbSB0aGUgZ3JhcGguCisgICAgICBEQUcuRGVsZXRlTm9kZShOKTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgcm9vdCBjaGFuZ2VkIChlLmcuIGl0IHdhcyBhIGRlYWQgbG9hZCwgdXBkYXRlIHRoZSByb290KS4KKyAgREFHLnNldFJvb3QoRHVtbXkuZ2V0VmFsdWUoKSk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0KFNETm9kZSAqTikgeworICBzd2l0Y2ggKE4tPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIElTRDo6VG9rZW5GYWN0b3I6ICAgICAgICByZXR1cm4gdmlzaXRUb2tlbkZhY3RvcihOKTsKKyAgY2FzZSBJU0Q6Ok1FUkdFX1ZBTFVFUzogICAgICAgcmV0dXJuIHZpc2l0TUVSR0VfVkFMVUVTKE4pOworICBjYXNlIElTRDo6QUREOiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRBREQoTik7CisgIGNhc2UgSVNEOjpTVUI6ICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdFNVQihOKTsKKyAgY2FzZSBJU0Q6OkFEREM6ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0QUREQyhOKTsKKyAgY2FzZSBJU0Q6OkFEREU6ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0QURERShOKTsKKyAgY2FzZSBJU0Q6Ok1VTDogICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0TVVMKE4pOworICBjYXNlIElTRDo6U0RJVjogICAgICAgICAgICAgICByZXR1cm4gdmlzaXRTRElWKE4pOworICBjYXNlIElTRDo6VURJVjogICAgICAgICAgICAgICByZXR1cm4gdmlzaXRVRElWKE4pOworICBjYXNlIElTRDo6U1JFTTogICAgICAgICAgICAgICByZXR1cm4gdmlzaXRTUkVNKE4pOworICBjYXNlIElTRDo6VVJFTTogICAgICAgICAgICAgICByZXR1cm4gdmlzaXRVUkVNKE4pOworICBjYXNlIElTRDo6TVVMSFU6ICAgICAgICAgICAgICByZXR1cm4gdmlzaXRNVUxIVShOKTsKKyAgY2FzZSBJU0Q6Ok1VTEhTOiAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0TVVMSFMoTik7CisgIGNhc2UgSVNEOjpTTVVMX0xPSEk6ICAgICAgICAgIHJldHVybiB2aXNpdFNNVUxfTE9ISShOKTsKKyAgY2FzZSBJU0Q6OlVNVUxfTE9ISTogICAgICAgICAgcmV0dXJuIHZpc2l0VU1VTF9MT0hJKE4pOworICBjYXNlIElTRDo6U0RJVlJFTTogICAgICAgICAgICByZXR1cm4gdmlzaXRTRElWUkVNKE4pOworICBjYXNlIElTRDo6VURJVlJFTTogICAgICAgICAgICByZXR1cm4gdmlzaXRVRElWUkVNKE4pOworICBjYXNlIElTRDo6QU5EOiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRBTkQoTik7CisgIGNhc2UgSVNEOjpPUjogICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdE9SKE4pOworICBjYXNlIElTRDo6WE9SOiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRYT1IoTik7CisgIGNhc2UgSVNEOjpTSEw6ICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdFNITChOKTsKKyAgY2FzZSBJU0Q6OlNSQTogICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0U1JBKE4pOworICBjYXNlIElTRDo6U1JMOiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRTUkwoTik7CisgIGNhc2UgSVNEOjpDVExaOiAgICAgICAgICAgICAgIHJldHVybiB2aXNpdENUTFooTik7CisgIGNhc2UgSVNEOjpDVFRaOiAgICAgICAgICAgICAgIHJldHVybiB2aXNpdENUVFooTik7CisgIGNhc2UgSVNEOjpDVFBPUDogICAgICAgICAgICAgIHJldHVybiB2aXNpdENUUE9QKE4pOworICBjYXNlIElTRDo6U0VMRUNUOiAgICAgICAgICAgICByZXR1cm4gdmlzaXRTRUxFQ1QoTik7CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6ICAgICAgICAgIHJldHVybiB2aXNpdFNFTEVDVF9DQyhOKTsKKyAgY2FzZSBJU0Q6OlNFVENDOiAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0U0VUQ0MoTik7CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORDogICAgICAgIHJldHVybiB2aXNpdFNJR05fRVhURU5EKE4pOworICBjYXNlIElTRDo6WkVST19FWFRFTkQ6ICAgICAgICByZXR1cm4gdmlzaXRaRVJPX0VYVEVORChOKTsKKyAgY2FzZSBJU0Q6OkFOWV9FWFRFTkQ6ICAgICAgICAgcmV0dXJuIHZpc2l0QU5ZX0VYVEVORChOKTsKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EX0lOUkVHOiAgcmV0dXJuIHZpc2l0U0lHTl9FWFRFTkRfSU5SRUcoTik7CisgIGNhc2UgSVNEOjpUUlVOQ0FURTogICAgICAgICAgIHJldHVybiB2aXNpdFRSVU5DQVRFKE4pOworICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6ICAgICAgICByZXR1cm4gdmlzaXRCSVRfQ09OVkVSVChOKTsKKyAgY2FzZSBJU0Q6OkJVSUxEX1BBSVI6ICAgICAgICAgcmV0dXJuIHZpc2l0QlVJTERfUEFJUihOKTsKKyAgY2FzZSBJU0Q6OkZBREQ6ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0RkFERChOKTsKKyAgY2FzZSBJU0Q6OkZTVUI6ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0RlNVQihOKTsKKyAgY2FzZSBJU0Q6OkZNVUw6ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0Rk1VTChOKTsKKyAgY2FzZSBJU0Q6OkZESVY6ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0RkRJVihOKTsKKyAgY2FzZSBJU0Q6OkZSRU06ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0RlJFTShOKTsKKyAgY2FzZSBJU0Q6OkZDT1BZU0lHTjogICAgICAgICAgcmV0dXJuIHZpc2l0RkNPUFlTSUdOKE4pOworICBjYXNlIElTRDo6U0lOVF9UT19GUDogICAgICAgICByZXR1cm4gdmlzaXRTSU5UX1RPX0ZQKE4pOworICBjYXNlIElTRDo6VUlOVF9UT19GUDogICAgICAgICByZXR1cm4gdmlzaXRVSU5UX1RPX0ZQKE4pOworICBjYXNlIElTRDo6RlBfVE9fU0lOVDogICAgICAgICByZXR1cm4gdmlzaXRGUF9UT19TSU5UKE4pOworICBjYXNlIElTRDo6RlBfVE9fVUlOVDogICAgICAgICByZXR1cm4gdmlzaXRGUF9UT19VSU5UKE4pOworICBjYXNlIElTRDo6RlBfUk9VTkQ6ICAgICAgICAgICByZXR1cm4gdmlzaXRGUF9ST1VORChOKTsKKyAgY2FzZSBJU0Q6OkZQX1JPVU5EX0lOUkVHOiAgICAgcmV0dXJuIHZpc2l0RlBfUk9VTkRfSU5SRUcoTik7CisgIGNhc2UgSVNEOjpGUF9FWFRFTkQ6ICAgICAgICAgIHJldHVybiB2aXNpdEZQX0VYVEVORChOKTsKKyAgY2FzZSBJU0Q6OkZORUc6ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0Rk5FRyhOKTsKKyAgY2FzZSBJU0Q6OkZBQlM6ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0RkFCUyhOKTsKKyAgY2FzZSBJU0Q6OkJSQ09ORDogICAgICAgICAgICAgcmV0dXJuIHZpc2l0QlJDT05EKE4pOworICBjYXNlIElTRDo6QlJfQ0M6ICAgICAgICAgICAgICByZXR1cm4gdmlzaXRCUl9DQyhOKTsKKyAgY2FzZSBJU0Q6OkxPQUQ6ICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0TE9BRChOKTsKKyAgY2FzZSBJU0Q6OlNUT1JFOiAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0U1RPUkUoTik7CisgIGNhc2UgSVNEOjpJTlNFUlRfVkVDVE9SX0VMVDogIHJldHVybiB2aXNpdElOU0VSVF9WRUNUT1JfRUxUKE4pOworICBjYXNlIElTRDo6RVhUUkFDVF9WRUNUT1JfRUxUOiByZXR1cm4gdmlzaXRFWFRSQUNUX1ZFQ1RPUl9FTFQoTik7CisgIGNhc2UgSVNEOjpCVUlMRF9WRUNUT1I6ICAgICAgIHJldHVybiB2aXNpdEJVSUxEX1ZFQ1RPUihOKTsKKyAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOiAgICAgcmV0dXJuIHZpc2l0Q09OQ0FUX1ZFQ1RPUlMoTik7CisgIGNhc2UgSVNEOjpWRUNUT1JfU0hVRkZMRTogICAgIHJldHVybiB2aXNpdFZFQ1RPUl9TSFVGRkxFKE4pOworICBjYXNlIElTRDo6TUVNQkFSUklFUjogICAgICAgICByZXR1cm4gdmlzaXRNRU1CQVJSSUVSKE4pOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OmNvbWJpbmUoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgUlYgPSB2aXNpdChOKTsKKworICAvLyBJZiBub3RoaW5nIGhhcHBlbmVkLCB0cnkgYSB0YXJnZXQtc3BlY2lmaWMgREFHIGNvbWJpbmUuCisgIGlmIChSVi5nZXROb2RlKCkgPT0gMCkgeworICAgIGFzc2VydChOLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OkRFTEVURURfTk9ERSAmJgorICAgICAgICAgICAiTm9kZSB3YXMgZGVsZXRlZCBidXQgdmlzaXQgcmV0dXJuZWQgTlVMTCEiKTsKKworICAgIGlmIChOLT5nZXRPcGNvZGUoKSA+PSBJU0Q6OkJVSUxUSU5fT1BfRU5EIHx8CisgICAgICAgIFRMSS5oYXNUYXJnZXREQUdDb21iaW5lKChJU0Q6Ok5vZGVUeXBlKU4tPmdldE9wY29kZSgpKSkgeworCisgICAgICAvLyBFeHBvc2UgdGhlIERBRyBjb21iaW5lciB0byB0aGUgdGFyZ2V0IGNvbWJpbmVyIGltcGxzLgorICAgICAgVGFyZ2V0TG93ZXJpbmc6OkRBR0NvbWJpbmVySW5mbworICAgICAgICBEYWdDb21iaW5lSW5mbyhEQUcsICFMZWdhbFR5cGVzLCAhTGVnYWxPcGVyYXRpb25zLCBmYWxzZSwgdGhpcyk7CisKKyAgICAgIFJWID0gVExJLlBlcmZvcm1EQUdDb21iaW5lKE4sIERhZ0NvbWJpbmVJbmZvKTsKKyAgICB9CisgIH0KKworICAvLyBJZiBub3RoaW5nIGhhcHBlbmVkIHN0aWxsLCB0cnkgcHJvbW90aW5nIHRoZSBvcGVyYXRpb24uCisgIGlmIChSVi5nZXROb2RlKCkgPT0gMCkgeworICAgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIElTRDo6QUREOgorICAgIGNhc2UgSVNEOjpTVUI6CisgICAgY2FzZSBJU0Q6Ok1VTDoKKyAgICBjYXNlIElTRDo6QU5EOgorICAgIGNhc2UgSVNEOjpPUjoKKyAgICBjYXNlIElTRDo6WE9SOgorICAgICAgUlYgPSBQcm9tb3RlSW50QmluT3AoU0RWYWx1ZShOLCAwKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6U0hMOgorICAgIGNhc2UgSVNEOjpTUkE6CisgICAgY2FzZSBJU0Q6OlNSTDoKKyAgICAgIFJWID0gUHJvbW90ZUludFNoaWZ0T3AoU0RWYWx1ZShOLCAwKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6CisgICAgY2FzZSBJU0Q6OlpFUk9fRVhURU5EOgorICAgIGNhc2UgSVNEOjpBTllfRVhURU5EOgorICAgICAgUlYgPSBQcm9tb3RlRXh0ZW5kKFNEVmFsdWUoTiwgMCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkxPQUQ6CisgICAgICBpZiAoUHJvbW90ZUxvYWQoU0RWYWx1ZShOLCAwKSkpCisgICAgICAgIFJWID0gU0RWYWx1ZShOLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIElmIE4gaXMgYSBjb21tdXRhdGl2ZSBiaW5hcnkgbm9kZSwgdHJ5IGNvbW11dGluZyBpdCB0byBlbmFibGUgbW9yZQorICAvLyBzZGlzZWwgQ1NFLgorICBpZiAoUlYuZ2V0Tm9kZSgpID09IDAgJiYKKyAgICAgIFNlbGVjdGlvbkRBRzo6aXNDb21tdXRhdGl2ZUJpbk9wKE4tPmdldE9wY29kZSgpKSAmJgorICAgICAgTi0+Z2V0TnVtVmFsdWVzKCkgPT0gMSkgeworICAgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworCisgICAgLy8gQ29uc3RhbnQgb3BlcmFuZHMgYXJlIGNhbm9uaWNhbGl6ZWQgdG8gUkhTLgorICAgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE4wKSB8fCAhaXNhPENvbnN0YW50U0ROb2RlPihOMSkpIHsKKyAgICAgIFNEVmFsdWUgT3BzW10gPSB7IE4xLCBOMCB9OworICAgICAgU0ROb2RlICpDU0VOb2RlID0gREFHLmdldE5vZGVJZkV4aXN0cyhOLT5nZXRPcGNvZGUoKSwgTi0+Z2V0VlRMaXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgMik7CisgICAgICBpZiAoQ1NFTm9kZSkKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoQ1NFTm9kZSwgMCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFJWOworfQorCisvLy8gZ2V0SW5wdXRDaGFpbkZvck5vZGUgLSBHaXZlbiBhIG5vZGUsIHJldHVybiBpdHMgaW5wdXQgY2hhaW4gaWYgaXQgaGFzIG9uZSwKKy8vLyBvdGhlcndpc2UgcmV0dXJuIGEgbnVsbCBzZCBvcGVyYW5kLgorc3RhdGljIFNEVmFsdWUgZ2V0SW5wdXRDaGFpbkZvck5vZGUoU0ROb2RlICpOKSB7CisgIGlmICh1bnNpZ25lZCBOdW1PcHMgPSBOLT5nZXROdW1PcGVyYW5kcygpKSB7CisgICAgaWYgKE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpPdGhlcikKKyAgICAgIHJldHVybiBOLT5nZXRPcGVyYW5kKDApOworICAgIGVsc2UgaWYgKE4tPmdldE9wZXJhbmQoTnVtT3BzLTEpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6T3RoZXIpCisgICAgICByZXR1cm4gTi0+Z2V0T3BlcmFuZChOdW1PcHMtMSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IE51bU9wcy0xOyArK2kpCisgICAgICBpZiAoTi0+Z2V0T3BlcmFuZChpKS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6Ok90aGVyKQorICAgICAgICByZXR1cm4gTi0+Z2V0T3BlcmFuZChpKTsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFRva2VuRmFjdG9yKFNETm9kZSAqTikgeworICAvLyBJZiBOIGhhcyB0d28gb3BlcmFuZHMsIHdoZXJlIG9uZSBoYXMgYW4gaW5wdXQgY2hhaW4gZXF1YWwgdG8gdGhlIG90aGVyLAorICAvLyB0aGUgJ290aGVyJyBjaGFpbiBpcyByZWR1bmRhbnQuCisgIGlmIChOLT5nZXROdW1PcGVyYW5kcygpID09IDIpIHsKKyAgICBpZiAoZ2V0SW5wdXRDaGFpbkZvck5vZGUoTi0+Z2V0T3BlcmFuZCgwKS5nZXROb2RlKCkpID09IE4tPmdldE9wZXJhbmQoMSkpCisgICAgICByZXR1cm4gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoZ2V0SW5wdXRDaGFpbkZvck5vZGUoTi0+Z2V0T3BlcmFuZCgxKS5nZXROb2RlKCkpID09IE4tPmdldE9wZXJhbmQoMCkpCisgICAgICByZXR1cm4gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgfQorCisgIFNtYWxsVmVjdG9yPFNETm9kZSAqLCA4PiBURnM7ICAgICAvLyBMaXN0IG9mIHRva2VuIGZhY3RvcnMgdG8gdmlzaXQuCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wczsgICAgLy8gT3BzIGZvciByZXBsYWNpbmcgdG9rZW4gZmFjdG9yLgorICBTbWFsbFB0clNldDxTRE5vZGUqLCAxNj4gU2Vlbk9wczsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7ICAgICAgICAgICAgIC8vIElmIHdlIHNob3VsZCByZXBsYWNlIHRoaXMgdG9rZW4gZmFjdG9yLgorCisgIC8vIFN0YXJ0IG91dCB3aXRoIHRoaXMgdG9rZW4gZmFjdG9yLgorICBURnMucHVzaF9iYWNrKE4pOworCisgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0b2tlbiBmYWN0b3JzLiAgVGhlIFRGcyBncm93cyB3aGVuIG5ldyB0b2tlbiBmYWN0b3JzIGFyZQorICAvLyBlbmNvdW50ZXJlZC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFRGcy5zaXplKCk7ICsraSkgeworICAgIFNETm9kZSAqVEYgPSBURnNbaV07CisKKyAgICAvLyBDaGVjayBlYWNoIG9mIHRoZSBvcGVyYW5kcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBpZSA9IFRGLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGllOyArK2kpIHsKKyAgICAgIFNEVmFsdWUgT3AgPSBURi0+Z2V0T3BlcmFuZChpKTsKKworICAgICAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICAgICAgY2FzZSBJU0Q6OkVudHJ5VG9rZW46CisgICAgICAgIC8vIEVudHJ5IHRva2VucyBkb24ndCBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBUaGV5IGFyZQorICAgICAgICAvLyByZWRlZHVuZGFudC4KKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElTRDo6VG9rZW5GYWN0b3I6CisgICAgICAgIGlmIChPcC5oYXNPbmVVc2UoKSAmJgorICAgICAgICAgICAgc3RkOjpmaW5kKFRGcy5iZWdpbigpLCBURnMuZW5kKCksIE9wLmdldE5vZGUoKSkgPT0gVEZzLmVuZCgpKSB7CisgICAgICAgICAgLy8gUXVldWUgdXAgZm9yIHByb2Nlc3NpbmcuCisgICAgICAgICAgVEZzLnB1c2hfYmFjayhPcC5nZXROb2RlKCkpOworICAgICAgICAgIC8vIENsZWFuIHVwIGluIGNhc2UgdGhlIHRva2VuIGZhY3RvciBpcyByZW1vdmVkLgorICAgICAgICAgIEFkZFRvV29ya0xpc3QoT3AuZ2V0Tm9kZSgpKTsKKyAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBGYWxsIHRocnUKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gT25seSBhZGQgaWYgaXQgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbGlzdC4KKyAgICAgICAgaWYgKFNlZW5PcHMuaW5zZXJ0KE9wLmdldE5vZGUoKSkpCisgICAgICAgICAgT3BzLnB1c2hfYmFjayhPcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBTRFZhbHVlIFJlc3VsdDsKKworICAvLyBJZiB3ZSd2ZSBjaGFuZ2UgdGhpbmdzIGFyb3VuZCB0aGVuIHJlcGxhY2UgdG9rZW4gZmFjdG9yLgorICBpZiAoQ2hhbmdlZCkgeworICAgIGlmIChPcHMuZW1wdHkoKSkgeworICAgICAgLy8gVGhlIGVudHJ5IHRva2VuIGlzIHRoZSBvbmx5IHBvc3NpYmxlIG91dGNvbWUuCisgICAgICBSZXN1bHQgPSBEQUcuZ2V0RW50cnlOb2RlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5ldyBhbmQgaW1wcm92ZWQgdG9rZW4gZmFjdG9yLgorICAgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsICZPcHNbMF0sIE9wcy5zaXplKCkpOworICAgIH0KKworICAgIC8vIERvbid0IGFkZCB1c2VycyB0byB3b3JrIGxpc3QuCisgICAgcmV0dXJuIENvbWJpbmVUbyhOLCBSZXN1bHQsIGZhbHNlKTsKKyAgfQorCisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBNRVJHRV9WQUxVRVMgY2FuIGFsd2F5cyBiZSBlbGltaW5hdGVkLgorU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRNRVJHRV9WQUxVRVMoU0ROb2RlICpOKSB7CisgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICAvLyBSZXBsYWNpbmcgcmVzdWx0cyBtYXkgY2F1c2UgYSBkaWZmZXJlbnQgTUVSR0VfVkFMVUVTIHRvIHN1ZGRlbmx5CisgIC8vIGJlIENTRSdkIHdpdGggTiwgYW5kIGNhcnJ5IGl0cyB1c2VzIHdpdGggaXQuIEl0ZXJhdGUgdW50aWwgbm8KKyAgLy8gdXNlcyByZW1haW4sIHRvIGVuc3VyZSB0aGF0IHRoZSBub2RlIGNhbiBiZSBzYWZlbHkgZGVsZXRlZC4KKyAgZG8geworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoTiwgaSksIE4tPmdldE9wZXJhbmQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRGVhZE5vZGVzKTsKKyAgfSB3aGlsZSAoIU4tPnVzZV9lbXB0eSgpKTsKKyAgcmVtb3ZlRnJvbVdvcmtMaXN0KE4pOworICBEQUcuRGVsZXRlTm9kZShOKTsKKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7ICAgLy8gUmV0dXJuIE4gc28gaXQgZG9lc24ndCBnZXQgcmVjaGVja2VkIQorfQorCitzdGF0aWMKK1NEVmFsdWUgY29tYmluZVNobEFkZENvbnN0YW50KERlYnVnTG9jIERMLCBTRFZhbHVlIE4wLCBTRFZhbHVlIE4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgRVZUIFZUID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisgIFNEVmFsdWUgTjAwID0gTjAuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMDEgPSBOMC5nZXRPcGVyYW5kKDEpOworICBDb25zdGFudFNETm9kZSAqTjAxQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMDEpOworCisgIGlmIChOMDFDICYmIE4wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCAmJiBOMDAuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSAmJgorICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihOMDAuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAvLyBmb2xkIChhZGQgKHNobCAoYWRkIHgsIGMxKSwgYzIpLCApIC0+IChhZGQgKGFkZCAoc2hsIHgsIGMyKSwgYzE8PGMyKSwgKQorICAgIE4wID0gREFHLmdldE5vZGUoSVNEOjpBREQsIE4wLmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTSEwsIE4wMC5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wMC5nZXRPcGVyYW5kKDApLCBOMDEpLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTSEwsIE4wMS5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wMC5nZXRPcGVyYW5kKDEpLCBOMDEpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBREQsIERMLCBWVCwgTjAsIE4xKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0QUREKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIENvbnN0YW50U0ROb2RlICpOMEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjApOworICBDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xKTsKKyAgRVZUIFZUID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisKKyAgLy8gZm9sZCB2ZWN0b3Igb3BzCisgIGlmIChWVC5pc1ZlY3RvcigpKSB7CisgICAgU0RWYWx1ZSBGb2xkZWRWT3AgPSBTaW1wbGlmeVZCaW5PcChOKTsKKyAgICBpZiAoRm9sZGVkVk9wLmdldE5vZGUoKSkgcmV0dXJuIEZvbGRlZFZPcDsKKyAgfQorCisgIC8vIGZvbGQgKGFkZCB4LCB1bmRlZikgLT4gdW5kZWYKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgcmV0dXJuIE4wOworICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gTjE7CisgIC8vIGZvbGQgKGFkZCBjMSwgYzIpIC0+IGMxK2MyCisgIGlmIChOMEMgJiYgTjFDKQorICAgIHJldHVybiBEQUcuRm9sZENvbnN0YW50QXJpdGhtZXRpYyhJU0Q6OkFERCwgVlQsIE4wQywgTjFDKTsKKyAgLy8gY2Fub25pY2FsaXplIGNvbnN0YW50IHRvIFJIUworICBpZiAoTjBDICYmICFOMUMpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjEsIE4wKTsKKyAgLy8gZm9sZCAoYWRkIHgsIDApIC0+IHgKKyAgaWYgKE4xQyAmJiBOMUMtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIE4wOworICAvLyBmb2xkIChhZGQgU3ltLCBjKSAtPiBTeW0rYworICBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EgPSBkeW5fY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihOMCkpCisgICAgaWYgKCFMZWdhbE9wZXJhdGlvbnMgJiYgVExJLmlzT2Zmc2V0Rm9sZGluZ0xlZ2FsKEdBKSAmJiBOMUMgJiYKKyAgICAgICAgR0EtPmdldE9wY29kZSgpID09IElTRDo6R2xvYmFsQWRkcmVzcykKKyAgICAgIHJldHVybiBEQUcuZ2V0R2xvYmFsQWRkcmVzcyhHQS0+Z2V0R2xvYmFsKCksIE4xQy0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0EtPmdldE9mZnNldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdClOMUMtPmdldFNFeHRWYWx1ZSgpKTsKKyAgLy8gZm9sZCAoKGMxLUEpK2MyKSAtPiAoYzErYzIpLUEKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQikKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKk4wQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDApKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE4xQy0+Z2V0QVBJbnRWYWx1ZSgpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMEMtPmdldEFQSW50VmFsdWUoKSwgVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMSkpOworICAvLyByZWFzc29jaWF0ZSBhZGQKKyAgU0RWYWx1ZSBSQUREID0gUmVhc3NvY2lhdGVPcHMoSVNEOjpBREQsIE4tPmdldERlYnVnTG9jKCksIE4wLCBOMSk7CisgIGlmIChSQURELmdldE5vZGUoKSAhPSAwKQorICAgIHJldHVybiBSQUREOworICAvLyBmb2xkICgoMC1BKSArIEIpIC0+IEItQQorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIgJiYgaXNhPENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDApKSAmJgorICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgwKSktPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1VCLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjEsIE4wLmdldE9wZXJhbmQoMSkpOworICAvLyBmb2xkIChBICsgKDAtQikpIC0+IEEtQgorICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIgJiYgaXNhPENvbnN0YW50U0ROb2RlPihOMS5nZXRPcGVyYW5kKDApKSAmJgorICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTjEuZ2V0T3BlcmFuZCgwKSktPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1VCLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE4xLmdldE9wZXJhbmQoMSkpOworICAvLyBmb2xkIChBKyhCLUEpKSAtPiBCCisgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQiAmJiBOMCA9PSBOMS5nZXRPcGVyYW5kKDEpKQorICAgIHJldHVybiBOMS5nZXRPcGVyYW5kKDApOworICAvLyBmb2xkICgoQi1BKStBKSAtPiBCCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQiAmJiBOMSA9PSBOMC5nZXRPcGVyYW5kKDEpKQorICAgIHJldHVybiBOMC5nZXRPcGVyYW5kKDApOworICAvLyBmb2xkIChBKyhCLShBK0MpKSkgdG8gKEItQykKKyAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6U1VCICYmIE4xLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQgJiYKKyAgICAgIE4wID09IE4xLmdldE9wZXJhbmQoMSkuZ2V0T3BlcmFuZCgwKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTVUIsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMS5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICBOMS5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMSkpOworICAvLyBmb2xkIChBKyhCLShDK0EpKSkgdG8gKEItQykKKyAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6U1VCICYmIE4xLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQgJiYKKyAgICAgIE4wID09IE4xLmdldE9wZXJhbmQoMSkuZ2V0T3BlcmFuZCgxKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTVUIsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMS5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICBOMS5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMCkpOworICAvLyBmb2xkIChBKygoQi1BKStvci1DKSkgdG8gKEIrb3ItQykKKyAgaWYgKChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQiB8fCBOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgJiYKKyAgICAgIE4xLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIgJiYKKyAgICAgIE4wID09IE4xLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgxKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoTjEuZ2V0T3Bjb2RlKCksIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICBOMS5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCksIE4xLmdldE9wZXJhbmQoMSkpOworCisgIC8vIGZvbGQgKEEtQikrKEMtRCkgdG8gKEErQyktKEIrRCkgd2hlbiBBIG9yIEMgaXMgY29uc3RhbnQKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6U1VCICYmIE4xLmdldE9wY29kZSgpID09IElTRDo6U1VCKSB7CisgICAgU0RWYWx1ZSBOMDAgPSBOMC5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgTjAxID0gTjAuZ2V0T3BlcmFuZCgxKTsKKyAgICBTRFZhbHVlIE4xMCA9IE4xLmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBOMTEgPSBOMS5nZXRPcGVyYW5kKDEpOworCisgICAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oTjAwKSB8fCBpc2E8Q29uc3RhbnRTRE5vZGU+KE4xMCkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTVUIsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QURELCBOMC5nZXREZWJ1Z0xvYygpLCBWVCwgTjAwLCBOMTApLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QURELCBOMS5nZXREZWJ1Z0xvYygpLCBWVCwgTjAxLCBOMTEpKTsKKyAgfQorCisgIGlmICghVlQuaXNWZWN0b3IoKSAmJiBTaW1wbGlmeURlbWFuZGVkQml0cyhTRFZhbHVlKE4sIDApKSkKKyAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKKworICAvLyBmb2xkIChhK2IpIC0+IChhfGIpIGlmZiBhIGFuZCBiIHNoYXJlIG5vIGJpdHMuCisgIGlmIChWVC5pc0ludGVnZXIoKSAmJiAhVlQuaXNWZWN0b3IoKSkgeworICAgIEFQSW50IExIU1plcm8sIExIU09uZTsKKyAgICBBUEludCBSSFNaZXJvLCBSSFNPbmU7CisgICAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSk7CisgICAgREFHLkNvbXB1dGVNYXNrZWRCaXRzKE4wLCBNYXNrLCBMSFNaZXJvLCBMSFNPbmUpOworCisgICAgaWYgKExIU1plcm8uZ2V0Qm9vbFZhbHVlKCkpIHsKKyAgICAgIERBRy5Db21wdXRlTWFza2VkQml0cyhOMSwgTWFzaywgUkhTWmVybywgUkhTT25lKTsKKworICAgICAgLy8gSWYgYWxsIHBvc3NpYmx5LXNldCBiaXRzIG9uIHRoZSBMSFMgYXJlIGNsZWFyIG9uIHRoZSBSSFMsIHJldHVybiBhbiBPUi4KKyAgICAgIC8vIElmIGFsbCBwb3NzaWJseS1zZXQgYml0cyBvbiB0aGUgUkhTIGFyZSBjbGVhciBvbiB0aGUgTEhTLCByZXR1cm4gYW4gT1IuCisgICAgICBpZiAoKFJIU1plcm8gJiAofkxIU1plcm8gJiBNYXNrKSkgPT0gKH5MSFNaZXJvICYgTWFzaykgfHwKKyAgICAgICAgICAoTEhTWmVybyAmICh+UkhTWmVybyAmIE1hc2spKSA9PSAoflJIU1plcm8gJiBNYXNrKSkKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6T1IsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwgTjEpOworICAgIH0KKyAgfQorCisgIC8vIGZvbGQgKGFkZCAoc2hsIChhZGQgeCwgYzEpLCBjMiksICkgLT4gKGFkZCAoYWRkIChzaGwgeCwgYzIpLCBjMTw8YzIpLCApCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCAmJiBOMC5nZXROb2RlKCktPmhhc09uZVVzZSgpKSB7CisgICAgU0RWYWx1ZSBSZXN1bHQgPSBjb21iaW5lU2hsQWRkQ29uc3RhbnQoTi0+Z2V0RGVidWdMb2MoKSwgTjAsIE4xLCBEQUcpOworICAgIGlmIChSZXN1bHQuZ2V0Tm9kZSgpKSByZXR1cm4gUmVzdWx0OworICB9CisgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCAmJiBOMS5nZXROb2RlKCktPmhhc09uZVVzZSgpKSB7CisgICAgU0RWYWx1ZSBSZXN1bHQgPSBjb21iaW5lU2hsQWRkQ29uc3RhbnQoTi0+Z2V0RGVidWdMb2MoKSwgTjEsIE4wLCBEQUcpOworICAgIGlmIChSZXN1bHQuZ2V0Tm9kZSgpKSByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8gZm9sZCAoYWRkIHgsIHNobCgwIC0geSwgbikpIC0+IHN1Yih4LCBzaGwoeSwgbikpCisgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCAmJgorICAgICAgTjEuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQikKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPQorICAgICAgICAgIGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMS5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCkpKQorICAgICAgaWYgKEMtPmdldEFQSW50VmFsdWUoKSA9PSAwKQorICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTVUIsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U0hMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4xLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4xLmdldE9wZXJhbmQoMSkpKTsKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6U0hMICYmCisgICAgICBOMC5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6U1VCKQorICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9CisgICAgICAgICAgZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKSkpCisgICAgICBpZiAoQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDApCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTSEwsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgxKSkpOworCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0QUREQyhTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBDb25zdGFudFNETm9kZSAqTjBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMSk7CisgIEVWVCBWVCA9IE4wLmdldFZhbHVlVHlwZSgpOworCisgIC8vIElmIHRoZSBmbGFnIHJlc3VsdCBpcyBkZWFkLCB0dXJuIHRoaXMgaW50byBhbiBBREQuCisgIGlmIChOLT5oYXNOVXNlc09mVmFsdWUoMCwgMSkpCisgICAgcmV0dXJuIENvbWJpbmVUbyhOLCBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4xLCBOMCksCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkNBUlJZX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0RGVidWdMb2MoKSwgTVZUOjpGbGFnKSk7CisKKyAgLy8gY2Fub25pY2FsaXplIGNvbnN0YW50IHRvIFJIUy4KKyAgaWYgKE4wQyAmJiAhTjFDKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFEREMsIE4tPmdldERlYnVnTG9jKCksIE4tPmdldFZUTGlzdCgpLCBOMSwgTjApOworCisgIC8vIGZvbGQgKGFkZGMgeCwgMCkgLT4geCArIG5vIGNhcnJ5IG91dAorICBpZiAoTjFDICYmIE4xQy0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gQ29tYmluZVRvKE4sIE4wLCBEQUcuZ2V0Tm9kZShJU0Q6OkNBUlJZX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldERlYnVnTG9jKCksIE1WVDo6RmxhZykpOworCisgIC8vIGZvbGQgKGFkZGMgYSwgYikgLT4gKG9yIGEsIGIpLCBDQVJSWV9GQUxTRSBpZmYgYSBhbmQgYiBzaGFyZSBubyBiaXRzLgorICBBUEludCBMSFNaZXJvLCBMSFNPbmU7CisgIEFQSW50IFJIU1plcm8sIFJIU09uZTsKKyAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSk7CisgIERBRy5Db21wdXRlTWFza2VkQml0cyhOMCwgTWFzaywgTEhTWmVybywgTEhTT25lKTsKKworICBpZiAoTEhTWmVyby5nZXRCb29sVmFsdWUoKSkgeworICAgIERBRy5Db21wdXRlTWFza2VkQml0cyhOMSwgTWFzaywgUkhTWmVybywgUkhTT25lKTsKKworICAgIC8vIElmIGFsbCBwb3NzaWJseS1zZXQgYml0cyBvbiB0aGUgTEhTIGFyZSBjbGVhciBvbiB0aGUgUkhTLCByZXR1cm4gYW4gT1IuCisgICAgLy8gSWYgYWxsIHBvc3NpYmx5LXNldCBiaXRzIG9uIHRoZSBSSFMgYXJlIGNsZWFyIG9uIHRoZSBMSFMsIHJldHVybiBhbiBPUi4KKyAgICBpZiAoKFJIU1plcm8gJiAofkxIU1plcm8gJiBNYXNrKSkgPT0gKH5MSFNaZXJvICYgTWFzaykgfHwKKyAgICAgICAgKExIU1plcm8gJiAoflJIU1plcm8gJiBNYXNrKSkgPT0gKH5SSFNaZXJvICYgTWFzaykpCisgICAgICByZXR1cm4gQ29tYmluZVRvKE4sIERBRy5nZXROb2RlKElTRDo6T1IsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwgTjEpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkNBUlJZX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXREZWJ1Z0xvYygpLCBNVlQ6OkZsYWcpKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0QURERShTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIENhcnJ5SW4gPSBOLT5nZXRPcGVyYW5kKDIpOworICBDb25zdGFudFNETm9kZSAqTjBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMSk7CisKKyAgLy8gY2Fub25pY2FsaXplIGNvbnN0YW50IHRvIFJIUworICBpZiAoTjBDICYmICFOMUMpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURERSwgTi0+Z2V0RGVidWdMb2MoKSwgTi0+Z2V0VlRMaXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgIE4xLCBOMCwgQ2FycnlJbik7CisKKyAgLy8gZm9sZCAoYWRkZSB4LCB5LCBmYWxzZSkgLT4gKGFkZGMgeCwgeSkKKyAgaWYgKENhcnJ5SW4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDQVJSWV9GQUxTRSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBRERDLCBOLT5nZXREZWJ1Z0xvYygpLCBOLT5nZXRWVExpc3QoKSwgTjEsIE4wKTsKKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFNVQihTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBDb25zdGFudFNETm9kZSAqTjBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE5vZGUoKSk7CisgIENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEuZ2V0Tm9kZSgpKTsKKyAgRVZUIFZUID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisKKyAgLy8gZm9sZCB2ZWN0b3Igb3BzCisgIGlmIChWVC5pc1ZlY3RvcigpKSB7CisgICAgU0RWYWx1ZSBGb2xkZWRWT3AgPSBTaW1wbGlmeVZCaW5PcChOKTsKKyAgICBpZiAoRm9sZGVkVk9wLmdldE5vZGUoKSkgcmV0dXJuIEZvbGRlZFZPcDsKKyAgfQorCisgIC8vIGZvbGQgKHN1YiB4LCB4KSAtPiAwCisgIGlmIChOMCA9PSBOMSkKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIC8vIGZvbGQgKHN1YiBjMSwgYzIpIC0+IGMxLWMyCisgIGlmIChOMEMgJiYgTjFDKQorICAgIHJldHVybiBEQUcuRm9sZENvbnN0YW50QXJpdGhtZXRpYyhJU0Q6OlNVQiwgVlQsIE4wQywgTjFDKTsKKyAgLy8gZm9sZCAoc3ViIHgsIGMpIC0+IChhZGQgeCwgLWMpCisgIGlmIChOMUMpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgtTjFDLT5nZXRBUEludFZhbHVlKCksIFZUKSk7CisgIC8vIENhbm9uaWNhbGl6ZSAoc3ViIC0xLCB4KSAtPiB+eCwgaS5lLiAoeG9yIHgsIC0xKQorICBpZiAoTjBDICYmIE4wQy0+aXNBbGxPbmVzVmFsdWUoKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpYT1IsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMSwgTjApOworICAvLyBmb2xkIChBK0IpLUEgLT4gQgorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQgJiYgTjAuZ2V0T3BlcmFuZCgwKSA9PSBOMSkKKyAgICByZXR1cm4gTjAuZ2V0T3BlcmFuZCgxKTsKKyAgLy8gZm9sZCAoQStCKS1CIC0+IEEKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6QUREICYmIE4wLmdldE9wZXJhbmQoMSkgPT0gTjEpCisgICAgcmV0dXJuIE4wLmdldE9wZXJhbmQoMCk7CisgIC8vIGZvbGQgKChBKyhCK29yLUMpKS1CKSAtPiBBK29yLUMKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6QUREICYmCisgICAgICAoTjAuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQiB8fAorICAgICAgIE4wLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQpICYmCisgICAgICBOMC5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMCkgPT0gTjEpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKE4wLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCksIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLCBOMC5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMSkpOworICAvLyBmb2xkICgoQSsoQytCKSktQikgLT4gQStDCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCAmJgorICAgICAgTjAuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCAmJgorICAgICAgTjAuZ2V0T3BlcmFuZCgxKS5nZXRPcGVyYW5kKDEpID09IE4xKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCksIE4wLmdldE9wZXJhbmQoMSkuZ2V0T3BlcmFuZCgwKSk7CisgIC8vIGZvbGQgKChBLShCLUMpKS1DKSAtPiBBLUIKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6U1VCICYmCisgICAgICBOMC5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IElTRDo6U1VCICYmCisgICAgICBOMC5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMSkgPT0gTjEpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1VCLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKSwgTjAuZ2V0T3BlcmFuZCgxKS5nZXRPcGVyYW5kKDApKTsKKworICAvLyBJZiBlaXRoZXIgb3BlcmFuZCBvZiBhIHN1YiBpcyB1bmRlZiwgdGhlIHJlc3VsdCBpcyB1bmRlZgorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gTjA7CisgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgIHJldHVybiBOMTsKKworICAvLyBJZiB0aGUgcmVsb2NhdGlvbiBtb2RlbCBzdXBwb3J0cyBpdCwgY29uc2lkZXIgc3ltYm9sIG9mZnNldHMuCisgIGlmIChHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE4wKSkKKyAgICBpZiAoIUxlZ2FsT3BlcmF0aW9ucyAmJiBUTEkuaXNPZmZzZXRGb2xkaW5nTGVnYWwoR0EpKSB7CisgICAgICAvLyBmb2xkIChzdWIgU3ltLCBjKSAtPiBTeW0tYworICAgICAgaWYgKE4xQyAmJiBHQS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpHbG9iYWxBZGRyZXNzKQorICAgICAgICByZXR1cm4gREFHLmdldEdsb2JhbEFkZHJlc3MoR0EtPmdldEdsb2JhbCgpLCBOMUMtPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0EtPmdldE9mZnNldCgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KU4xQy0+Z2V0U0V4dFZhbHVlKCkpOworICAgICAgLy8gZm9sZCAoc3ViIFN5bStjMSwgU3ltK2MyKSAtPiBjMS1jMgorICAgICAgaWYgKEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdCID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oTjEpKQorICAgICAgICBpZiAoR0EtPmdldEdsb2JhbCgpID09IEdCLT5nZXRHbG9iYWwoKSkKKyAgICAgICAgICByZXR1cm4gREFHLmdldENvbnN0YW50KCh1aW50NjRfdClHQS0+Z2V0T2Zmc2V0KCkgLSBHQi0+Z2V0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVCk7CisgICAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0TVVMKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIENvbnN0YW50U0ROb2RlICpOMEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjApOworICBDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xKTsKKyAgRVZUIFZUID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisKKyAgLy8gZm9sZCB2ZWN0b3Igb3BzCisgIGlmIChWVC5pc1ZlY3RvcigpKSB7CisgICAgU0RWYWx1ZSBGb2xkZWRWT3AgPSBTaW1wbGlmeVZCaW5PcChOKTsKKyAgICBpZiAoRm9sZGVkVk9wLmdldE5vZGUoKSkgcmV0dXJuIEZvbGRlZFZPcDsKKyAgfQorCisgIC8vIGZvbGQgKG11bCB4LCB1bmRlZikgLT4gMAorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRiB8fCBOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpOworICAvLyBmb2xkIChtdWwgYzEsIGMyKSAtPiBjMSpjMgorICBpZiAoTjBDICYmIE4xQykKKyAgICByZXR1cm4gREFHLkZvbGRDb25zdGFudEFyaXRobWV0aWMoSVNEOjpNVUwsIFZULCBOMEMsIE4xQyk7CisgIC8vIGNhbm9uaWNhbGl6ZSBjb25zdGFudCB0byBSSFMKKyAgaWYgKE4wQyAmJiAhTjFDKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4xLCBOMCk7CisgIC8vIGZvbGQgKG11bCB4LCAwKSAtPiAwCisgIGlmIChOMUMgJiYgTjFDLT5pc051bGxWYWx1ZSgpKQorICAgIHJldHVybiBOMTsKKyAgLy8gZm9sZCAobXVsIHgsIC0xKSAtPiAwLXgKKyAgaWYgKE4xQyAmJiBOMUMtPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1VCLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIFZUKSwgTjApOworICAvLyBmb2xkIChtdWwgeCwgKDEgPDwgYykpIC0+IHggPDwgYworICBpZiAoTjFDICYmIE4xQy0+Z2V0QVBJbnRWYWx1ZSgpLmlzUG93ZXJPZjIoKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTSEwsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE4xQy0+Z2V0QVBJbnRWYWx1ZSgpLmxvZ0Jhc2UyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgLy8gZm9sZCAobXVsIHgsIC0oMSA8PCBjKSkgLT4gLSh4IDw8IGMpIG9yICgteCkgPDwgYworICBpZiAoTjFDICYmICgtTjFDLT5nZXRBUEludFZhbHVlKCkpLmlzUG93ZXJPZjIoKSkgeworICAgIHVuc2lnbmVkIExvZzJWYWwgPSAoLU4xQy0+Z2V0QVBJbnRWYWx1ZSgpKS5sb2dCYXNlMigpOworICAgIC8vIEZJWE1FOiBJZiB0aGUgaW5wdXQgaXMgc29tZXRoaW5nIHRoYXQgaXMgZWFzaWx5IG5lZ2F0ZWQgKGUuZy4gYQorICAgIC8vIHNpbmdsZS11c2UgYWRkKSwgd2Ugc2hvdWxkIHB1dCB0aGUgbmVnYXRlIHRoZXJlLgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBWVCksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U0hMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KExvZzJWYWwsIGdldFNoaWZ0QW1vdW50VHkoKSkpKTsKKyAgfQorICAvLyAobXVsIChzaGwgWCwgYzEpLCBjMikgLT4gKG11bCBYLCBjMiA8PCBjMSkKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCAmJgorICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKSkgeworICAgIFNEVmFsdWUgQzMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4xLCBOMC5nZXRPcGVyYW5kKDEpKTsKKyAgICBBZGRUb1dvcmtMaXN0KEMzLmdldE5vZGUoKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6TVVMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKSwgQzMpOworICB9CisKKyAgLy8gQ2hhbmdlIChtdWwgKHNobCBYLCBDKSwgWSkgLT4gKHNobCAobXVsIFgsIFkpLCBDKSB3aGVuIHRoZSBzaGlmdCBoYXMgb25lCisgIC8vIHVzZS4KKyAgeworICAgIFNEVmFsdWUgU2goMCwwKSwgWSgwLDApOworICAgIC8vIENoZWNrIGZvciBib3RoIChtdWwgKHNobCBYLCBDKSwgWSkgIGFuZCAgKG11bCBZLCAoc2hsIFgsIEMpKS4KKyAgICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSEwgJiYgaXNhPENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgICBOMC5nZXROb2RlKCktPmhhc09uZVVzZSgpKSB7CisgICAgICBTaCA9IE4wOyBZID0gTjE7CisgICAgfSBlbHNlIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCAmJgorICAgICAgICAgICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihOMS5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgICAgICAgICAgTjEuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkgeworICAgICAgU2ggPSBOMTsgWSA9IE4wOworICAgIH0KKworICAgIGlmIChTaC5nZXROb2RlKCkpIHsKKyAgICAgIFNEVmFsdWUgTXVsID0gREFHLmdldE5vZGUoSVNEOjpNVUwsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaC5nZXRPcGVyYW5kKDApLCBZKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTXVsLCBTaC5nZXRPcGVyYW5kKDEpKTsKKyAgICB9CisgIH0KKworICAvLyBmb2xkIChtdWwgKGFkZCB4LCBjMSksIGMyKSAtPiAoYWRkIChtdWwgeCwgYzIpLCBjMSpjMikKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCAmJiBOMC5nZXROb2RlKCktPmhhc09uZVVzZSgpICYmCisgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6TVVMLCBOMC5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKSwgTjEpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgTjEuZ2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMSksIE4xKSk7CisKKyAgLy8gcmVhc3NvY2lhdGUgbXVsCisgIFNEVmFsdWUgUk1VTCA9IFJlYXNzb2NpYXRlT3BzKElTRDo6TVVMLCBOLT5nZXREZWJ1Z0xvYygpLCBOMCwgTjEpOworICBpZiAoUk1VTC5nZXROb2RlKCkgIT0gMCkKKyAgICByZXR1cm4gUk1VTDsKKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFNESVYoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIE4xID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4wQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXROb2RlKCkpOworICBDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xLmdldE5vZGUoKSk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICAvLyBmb2xkIHZlY3RvciBvcHMKKyAgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICBTRFZhbHVlIEZvbGRlZFZPcCA9IFNpbXBsaWZ5VkJpbk9wKE4pOworICAgIGlmIChGb2xkZWRWT3AuZ2V0Tm9kZSgpKSByZXR1cm4gRm9sZGVkVk9wOworICB9CisKKyAgLy8gZm9sZCAoc2RpdiBjMSwgYzIpIC0+IGMxL2MyCisgIGlmIChOMEMgJiYgTjFDICYmICFOMUMtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIERBRy5Gb2xkQ29uc3RhbnRBcml0aG1ldGljKElTRDo6U0RJViwgVlQsIE4wQywgTjFDKTsKKyAgLy8gZm9sZCAoc2RpdiBYLCAxKSAtPiBYCisgIGlmIChOMUMgJiYgTjFDLT5nZXRTRXh0VmFsdWUoKSA9PSAxTEwpCisgICAgcmV0dXJuIE4wOworICAvLyBmb2xkIChzZGl2IFgsIC0xKSAtPiAwLVgKKyAgaWYgKE4xQyAmJiBOMUMtPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1VCLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIFZUKSwgTjApOworICAvLyBJZiB3ZSBrbm93IHRoZSBzaWduIGJpdHMgb2YgYm90aCBvcGVyYW5kcyBhcmUgemVybywgc3RyZW5ndGggcmVkdWNlIHRvIGEKKyAgLy8gdWRpdiBpbnN0ZWFkLiAgSGFuZGxlcyAoWCYxNSkgL3MgNCAtPiBYJjE1ID4+IDIKKyAgaWYgKCFWVC5pc1ZlY3RvcigpKSB7CisgICAgaWYgKERBRy5TaWduQml0SXNaZXJvKE4xKSAmJiBEQUcuU2lnbkJpdElzWmVybyhOMCkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpVRElWLCBOLT5nZXREZWJ1Z0xvYygpLCBOMS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOMCwgTjEpOworICB9CisgIC8vIGZvbGQgKHNkaXYgWCwgcG93MikgLT4gc2ltcGxlIG9wcyBhZnRlciBsZWdhbGl6ZQorICBpZiAoTjFDICYmICFOMUMtPmlzTnVsbFZhbHVlKCkgJiYgIVRMSS5pc0ludERpdkNoZWFwKCkgJiYKKyAgICAgIChpc1Bvd2VyT2YyXzY0KE4xQy0+Z2V0U0V4dFZhbHVlKCkpIHx8CisgICAgICAgaXNQb3dlck9mMl82NCgtTjFDLT5nZXRTRXh0VmFsdWUoKSkpKSB7CisgICAgLy8gSWYgZGl2aWRpbmcgYnkgcG93ZXJzIG9mIHR3byBpcyBjaGVhcCwgdGhlbiBkb24ndCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcKKyAgICAvLyBmb2xkLgorICAgIGlmIChUTEkuaXNQb3cyRGl2Q2hlYXAoKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICBpbnQ2NF90IHBvdzIgPSBOMUMtPmdldFNFeHRWYWx1ZSgpOworICAgIGludDY0X3QgYWJzMiA9IHBvdzIgPiAwID8gcG93MiA6IC1wb3cyOworICAgIHVuc2lnbmVkIGxnMiA9IExvZzJfNjQoYWJzMik7CisKKyAgICAvLyBTcGxhdCB0aGUgc2lnbiBiaXQgaW50byB0aGUgcmVnaXN0ZXIKKyAgICBTRFZhbHVlIFNHTiA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoVlQuZ2V0U2l6ZUluQml0cygpLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hpZnRBbW91bnRUeSgpKSk7CisgICAgQWRkVG9Xb3JrTGlzdChTR04uZ2V0Tm9kZSgpKTsKKworICAgIC8vIEFkZCAoTjAgPCAwKSA/IGFiczIgLSAxIDogMDsKKyAgICBTRFZhbHVlIFNSTCA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgU0dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFZULmdldFNpemVJbkJpdHMoKSAtIGxnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgICBTRFZhbHVlIEFERCA9IERBRy5nZXROb2RlKElTRDo6QURELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIFNSTCk7CisgICAgQWRkVG9Xb3JrTGlzdChTUkwuZ2V0Tm9kZSgpKTsKKyAgICBBZGRUb1dvcmtMaXN0KEFERC5nZXROb2RlKCkpOyAgICAvLyBEaXZpZGUgYnkgcG93MgorICAgIFNEVmFsdWUgU1JBID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIE4tPmdldERlYnVnTG9jKCksIFZULCBBREQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQobGcyLCBnZXRTaGlmdEFtb3VudFR5KCkpKTsKKworICAgIC8vIElmIHdlJ3JlIGRpdmlkaW5nIGJ5IGEgcG9zaXRpdmUgdmFsdWUsIHdlJ3JlIGRvbmUuICBPdGhlcndpc2UsIHdlIG11c3QKKyAgICAvLyBuZWdhdGUgdGhlIHJlc3VsdC4KKyAgICBpZiAocG93MiA+IDApCisgICAgICByZXR1cm4gU1JBOworCisgICAgQWRkVG9Xb3JrTGlzdChTUkEuZ2V0Tm9kZSgpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTVUIsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpLCBTUkEpOworICB9CisKKyAgLy8gaWYgaW50ZWdlciBkaXZpZGUgaXMgZXhwZW5zaXZlIGFuZCB3ZSBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMsIGVtaXQgYW4KKyAgLy8gYWx0ZXJuYXRlIHNlcXVlbmNlLgorICBpZiAoTjFDICYmIChOMUMtPmdldFNFeHRWYWx1ZSgpIDwgLTEgfHwgTjFDLT5nZXRTRXh0VmFsdWUoKSA+IDEpICYmCisgICAgICAhVExJLmlzSW50RGl2Q2hlYXAoKSkgeworICAgIFNEVmFsdWUgT3AgPSBCdWlsZFNESVYoTik7CisgICAgaWYgKE9wLmdldE5vZGUoKSkgcmV0dXJuIE9wOworICB9CisKKyAgLy8gdW5kZWYgLyBYIC0+IDAKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudCgwLCBWVCk7CisgIC8vIFggLyB1bmRlZiAtPiB1bmRlZgorICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gTjE7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRVRElWKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIENvbnN0YW50U0ROb2RlICpOMEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjAuZ2V0Tm9kZSgpKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMS5nZXROb2RlKCkpOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gZm9sZCB2ZWN0b3Igb3BzCisgIGlmIChWVC5pc1ZlY3RvcigpKSB7CisgICAgU0RWYWx1ZSBGb2xkZWRWT3AgPSBTaW1wbGlmeVZCaW5PcChOKTsKKyAgICBpZiAoRm9sZGVkVk9wLmdldE5vZGUoKSkgcmV0dXJuIEZvbGRlZFZPcDsKKyAgfQorCisgIC8vIGZvbGQgKHVkaXYgYzEsIGMyKSAtPiBjMS9jMgorICBpZiAoTjBDICYmIE4xQyAmJiAhTjFDLT5pc051bGxWYWx1ZSgpKQorICAgIHJldHVybiBEQUcuRm9sZENvbnN0YW50QXJpdGhtZXRpYyhJU0Q6OlVESVYsIFZULCBOMEMsIE4xQyk7CisgIC8vIGZvbGQgKHVkaXYgeCwgKDEgPDwgYykpIC0+IHggPj51IGMKKyAgaWYgKE4xQyAmJiBOMUMtPmdldEFQSW50VmFsdWUoKS5pc1Bvd2VyT2YyKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1JMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOMUMtPmdldEFQSW50VmFsdWUoKS5sb2dCYXNlMigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hpZnRBbW91bnRUeSgpKSk7CisgIC8vIGZvbGQgKHVkaXYgeCwgKHNobCBjLCB5KSkgLT4geCA+PnUgKGxvZzIoYykreSkgaWZmIGMgaXMgcG93ZXIgb2YgMgorICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSEwpIHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlNIQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMS5nZXRPcGVyYW5kKDApKSkgeworICAgICAgaWYgKFNIQy0+Z2V0QVBJbnRWYWx1ZSgpLmlzUG93ZXJPZjIoKSkgeworICAgICAgICBFVlQgQUREVlQgPSBOMS5nZXRPcGVyYW5kKDEpLmdldFZhbHVlVHlwZSgpOworICAgICAgICBTRFZhbHVlIEFkZCA9IERBRy5nZXROb2RlKElTRDo6QURELCBOLT5nZXREZWJ1Z0xvYygpLCBBRERWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMS5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChTSEMtPmdldEFQSW50VmFsdWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvZ0Jhc2UyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFERFZUKSk7CisgICAgICAgIEFkZFRvV29ya0xpc3QoQWRkLmdldE5vZGUoKSk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLCBBZGQpOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBmb2xkICh1ZGl2IHgsIGMpIC0+IGFsdGVybmF0ZQorICBpZiAoTjFDICYmICFOMUMtPmlzTnVsbFZhbHVlKCkgJiYgIVRMSS5pc0ludERpdkNoZWFwKCkpIHsKKyAgICBTRFZhbHVlIE9wID0gQnVpbGRVRElWKE4pOworICAgIGlmIChPcC5nZXROb2RlKCkpIHJldHVybiBPcDsKKyAgfQorCisgIC8vIHVuZGVmIC8gWCAtPiAwCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpOworICAvLyBYIC8gdW5kZWYgLT4gdW5kZWYKKyAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgcmV0dXJuIE4xOworCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0U1JFTShTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBDb25zdGFudFNETm9kZSAqTjBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMSk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICAvLyBmb2xkIChzcmVtIGMxLCBjMikgLT4gYzElYzIKKyAgaWYgKE4wQyAmJiBOMUMgJiYgIU4xQy0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gREFHLkZvbGRDb25zdGFudEFyaXRobWV0aWMoSVNEOjpTUkVNLCBWVCwgTjBDLCBOMUMpOworICAvLyBJZiB3ZSBrbm93IHRoZSBzaWduIGJpdHMgb2YgYm90aCBvcGVyYW5kcyBhcmUgemVybywgc3RyZW5ndGggcmVkdWNlIHRvIGEKKyAgLy8gdXJlbSBpbnN0ZWFkLiAgSGFuZGxlcyAoWCAmIDB4MEZGRkZGRkYpICVzIDE2IC0+IFgmMTUKKyAgaWYgKCFWVC5pc1ZlY3RvcigpKSB7CisgICAgaWYgKERBRy5TaWduQml0SXNaZXJvKE4xKSAmJiBEQUcuU2lnbkJpdElzWmVybyhOMCkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpVUkVNLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE4xKTsKKyAgfQorCisgIC8vIElmIFgvQyBjYW4gYmUgc2ltcGxpZmllZCBieSB0aGUgZGl2aXNpb24tYnktY29uc3RhbnQgbG9naWMsIGxvd2VyCisgIC8vIFglQyB0byB0aGUgZXF1aXZhbGVudCBvZiBYLVgvQypDLgorICBpZiAoTjFDICYmICFOMUMtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICBTRFZhbHVlIERpdiA9IERBRy5nZXROb2RlKElTRDo6U0RJViwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLCBOMSk7CisgICAgQWRkVG9Xb3JrTGlzdChEaXYuZ2V0Tm9kZSgpKTsKKyAgICBTRFZhbHVlIE9wdGltaXplZERpdiA9IGNvbWJpbmUoRGl2LmdldE5vZGUoKSk7CisgICAgaWYgKE9wdGltaXplZERpdi5nZXROb2RlKCkgJiYgT3B0aW1pemVkRGl2LmdldE5vZGUoKSAhPSBEaXYuZ2V0Tm9kZSgpKSB7CisgICAgICBTRFZhbHVlIE11bCA9IERBRy5nZXROb2RlKElTRDo6TVVMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemVkRGl2LCBOMSk7CisgICAgICBTRFZhbHVlIFN1YiA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE11bCk7CisgICAgICBBZGRUb1dvcmtMaXN0KE11bC5nZXROb2RlKCkpOworICAgICAgcmV0dXJuIFN1YjsKKyAgICB9CisgIH0KKworICAvLyB1bmRlZiAlIFggLT4gMAorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgLy8gWCAlIHVuZGVmIC0+IHVuZGVmCisgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgIHJldHVybiBOMTsKKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFVSRU0oU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIE4xID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4wQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMCk7CisgIENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEpOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gZm9sZCAodXJlbSBjMSwgYzIpIC0+IGMxJWMyCisgIGlmIChOMEMgJiYgTjFDICYmICFOMUMtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIERBRy5Gb2xkQ29uc3RhbnRBcml0aG1ldGljKElTRDo6VVJFTSwgVlQsIE4wQywgTjFDKTsKKyAgLy8gZm9sZCAodXJlbSB4LCBwb3cyKSAtPiAoYW5kIHgsIHBvdzItMSkKKyAgaWYgKE4xQyAmJiAhTjFDLT5pc051bGxWYWx1ZSgpICYmIE4xQy0+Z2V0QVBJbnRWYWx1ZSgpLmlzUG93ZXJPZjIoKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTkQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE4xQy0+Z2V0QVBJbnRWYWx1ZSgpLTEsVlQpKTsKKyAgLy8gZm9sZCAodXJlbSB4LCAoc2hsIHBvdzIsIHkpKSAtPiAoYW5kIHgsIChhZGQgKHNobCBwb3cyLCB5KSwgLTEpKQorICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSEwpIHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlNIQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMS5nZXRPcGVyYW5kKDApKSkgeworICAgICAgaWYgKFNIQy0+Z2V0QVBJbnRWYWx1ZSgpLmlzUG93ZXJPZjIoKSkgeworICAgICAgICBTRFZhbHVlIEFkZCA9CisgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMSwKKyAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoVlQuZ2V0U2l6ZUluQml0cygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZUKSk7CisgICAgICAgIEFkZFRvV29ya0xpc3QoQWRkLmdldE5vZGUoKSk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLCBBZGQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIElmIFgvQyBjYW4gYmUgc2ltcGxpZmllZCBieSB0aGUgZGl2aXNpb24tYnktY29uc3RhbnQgbG9naWMsIGxvd2VyCisgIC8vIFglQyB0byB0aGUgZXF1aXZhbGVudCBvZiBYLVgvQypDLgorICBpZiAoTjFDICYmICFOMUMtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICBTRFZhbHVlIERpdiA9IERBRy5nZXROb2RlKElTRDo6VURJViwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLCBOMSk7CisgICAgQWRkVG9Xb3JrTGlzdChEaXYuZ2V0Tm9kZSgpKTsKKyAgICBTRFZhbHVlIE9wdGltaXplZERpdiA9IGNvbWJpbmUoRGl2LmdldE5vZGUoKSk7CisgICAgaWYgKE9wdGltaXplZERpdi5nZXROb2RlKCkgJiYgT3B0aW1pemVkRGl2LmdldE5vZGUoKSAhPSBEaXYuZ2V0Tm9kZSgpKSB7CisgICAgICBTRFZhbHVlIE11bCA9IERBRy5nZXROb2RlKElTRDo6TVVMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemVkRGl2LCBOMSk7CisgICAgICBTRFZhbHVlIFN1YiA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE11bCk7CisgICAgICBBZGRUb1dvcmtMaXN0KE11bC5nZXROb2RlKCkpOworICAgICAgcmV0dXJuIFN1YjsKKyAgICB9CisgIH0KKworICAvLyB1bmRlZiAlIFggLT4gMAorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgLy8gWCAlIHVuZGVmIC0+IHVuZGVmCisgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgIHJldHVybiBOMTsKKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdE1VTEhTKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEpOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gZm9sZCAobXVsaHMgeCwgMCkgLT4gMAorICBpZiAoTjFDICYmIE4xQy0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gTjE7CisgIC8vIGZvbGQgKG11bGhzIHgsIDEpIC0+IChzcmEgeCwgc2l6ZSh4KS0xKQorICBpZiAoTjFDICYmIE4xQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDEpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1JBLCBOLT5nZXREZWJ1Z0xvYygpLCBOMC5nZXRWYWx1ZVR5cGUoKSwgTjAsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOMC5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hpZnRBbW91bnRUeSgpKSk7CisgIC8vIGZvbGQgKG11bGhzIHgsIHVuZGVmKSAtPiAwCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGIHx8IE4xLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudCgwLCBWVCk7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRNVUxIVShTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIC8vIGZvbGQgKG11bGh1IHgsIDApIC0+IDAKKyAgaWYgKE4xQyAmJiBOMUMtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIE4xOworICAvLyBmb2xkIChtdWxodSB4LCAxKSAtPiAwCisgIGlmIChOMUMgJiYgTjFDLT5nZXRBUEludFZhbHVlKCkgPT0gMSkKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIE4wLmdldFZhbHVlVHlwZSgpKTsKKyAgLy8gZm9sZCAobXVsaHUgeCwgdW5kZWYpIC0+IDAKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYgfHwgTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gU2ltcGxpZnlOb2RlV2l0aFR3b1Jlc3VsdHMgLSBQZXJmb3JtIG9wdGltaXphdGlvbnMgY29tbW9uIHRvIG5vZGVzIHRoYXQKKy8vLyBjb21wdXRlIHR3byB2YWx1ZXMuIExvT3AgYW5kIEhpT3AgZ2l2ZSB0aGUgb3Bjb2RlcyBmb3IgdGhlIHR3byBjb21wdXRhdGlvbnMKKy8vLyB0aGF0IGFyZSBiZWluZyBwZXJmb3JtZWQuIFJldHVybiB0cnVlIGlmIGEgc2ltcGxpZmljYXRpb24gd2FzIG1hZGUuCisvLy8KK1NEVmFsdWUgREFHQ29tYmluZXI6OlNpbXBsaWZ5Tm9kZVdpdGhUd29SZXN1bHRzKFNETm9kZSAqTiwgdW5zaWduZWQgTG9PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEhpT3ApIHsKKyAgLy8gSWYgdGhlIGhpZ2ggaGFsZiBpcyBub3QgbmVlZGVkLCBqdXN0IGNvbXB1dGUgdGhlIGxvdyBoYWxmLgorICBib29sIEhpRXhpc3RzID0gTi0+aGFzQW55VXNlT2ZWYWx1ZSgxKTsKKyAgaWYgKCFIaUV4aXN0cyAmJgorICAgICAgKCFMZWdhbE9wZXJhdGlvbnMgfHwKKyAgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbChMb09wLCBOLT5nZXRWYWx1ZVR5cGUoMCkpKSkgeworICAgIFNEVmFsdWUgUmVzID0gREFHLmdldE5vZGUoTG9PcCwgTi0+Z2V0RGVidWdMb2MoKSwgTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+b3BfYmVnaW4oKSwgTi0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgICAgcmV0dXJuIENvbWJpbmVUbyhOLCBSZXMsIFJlcyk7CisgIH0KKworICAvLyBJZiB0aGUgbG93IGhhbGYgaXMgbm90IG5lZWRlZCwganVzdCBjb21wdXRlIHRoZSBoaWdoIGhhbGYuCisgIGJvb2wgTG9FeGlzdHMgPSBOLT5oYXNBbnlVc2VPZlZhbHVlKDApOworICBpZiAoIUxvRXhpc3RzICYmCisgICAgICAoIUxlZ2FsT3BlcmF0aW9ucyB8fAorICAgICAgIFRMSS5pc09wZXJhdGlvbkxlZ2FsKEhpT3AsIE4tPmdldFZhbHVlVHlwZSgxKSkpKSB7CisgICAgU0RWYWx1ZSBSZXMgPSBEQUcuZ2V0Tm9kZShIaU9wLCBOLT5nZXREZWJ1Z0xvYygpLCBOLT5nZXRWYWx1ZVR5cGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5vcF9iZWdpbigpLCBOLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgICByZXR1cm4gQ29tYmluZVRvKE4sIFJlcywgUmVzKTsKKyAgfQorCisgIC8vIElmIGJvdGggaGFsdmVzIGFyZSB1c2VkLCByZXR1cm4gYXMgaXQgaXMuCisgIGlmIChMb0V4aXN0cyAmJiBIaUV4aXN0cykKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIC8vIElmIHRoZSB0d28gY29tcHV0ZWQgcmVzdWx0cyBjYW4gYmUgc2ltcGxpZmllZCBzZXBhcmF0ZWx5LCBzZXBhcmF0ZSB0aGVtLgorICBpZiAoTG9FeGlzdHMpIHsKKyAgICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoTG9PcCwgTi0+Z2V0RGVidWdMb2MoKSwgTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5vcF9iZWdpbigpLCBOLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgICBBZGRUb1dvcmtMaXN0KExvLmdldE5vZGUoKSk7CisgICAgU0RWYWx1ZSBMb09wdCA9IGNvbWJpbmUoTG8uZ2V0Tm9kZSgpKTsKKyAgICBpZiAoTG9PcHQuZ2V0Tm9kZSgpICYmIExvT3B0LmdldE5vZGUoKSAhPSBMby5nZXROb2RlKCkgJiYKKyAgICAgICAgKCFMZWdhbE9wZXJhdGlvbnMgfHwKKyAgICAgICAgIFRMSS5pc09wZXJhdGlvbkxlZ2FsKExvT3B0LmdldE9wY29kZSgpLCBMb09wdC5nZXRWYWx1ZVR5cGUoKSkpKQorICAgICAgcmV0dXJuIENvbWJpbmVUbyhOLCBMb09wdCwgTG9PcHQpOworICB9CisKKyAgaWYgKEhpRXhpc3RzKSB7CisgICAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKEhpT3AsIE4tPmdldERlYnVnTG9jKCksIE4tPmdldFZhbHVlVHlwZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+b3BfYmVnaW4oKSwgTi0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgICAgQWRkVG9Xb3JrTGlzdChIaS5nZXROb2RlKCkpOworICAgIFNEVmFsdWUgSGlPcHQgPSBjb21iaW5lKEhpLmdldE5vZGUoKSk7CisgICAgaWYgKEhpT3B0LmdldE5vZGUoKSAmJiBIaU9wdCAhPSBIaSAmJgorICAgICAgICAoIUxlZ2FsT3BlcmF0aW9ucyB8fAorICAgICAgICAgVExJLmlzT3BlcmF0aW9uTGVnYWwoSGlPcHQuZ2V0T3Bjb2RlKCksIEhpT3B0LmdldFZhbHVlVHlwZSgpKSkpCisgICAgICByZXR1cm4gQ29tYmluZVRvKE4sIEhpT3B0LCBIaU9wdCk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFNNVUxfTE9ISShTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBSZXMgPSBTaW1wbGlmeU5vZGVXaXRoVHdvUmVzdWx0cyhOLCBJU0Q6Ok1VTCwgSVNEOjpNVUxIUyk7CisgIGlmIChSZXMuZ2V0Tm9kZSgpKSByZXR1cm4gUmVzOworCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0VU1VTF9MT0hJKFNETm9kZSAqTikgeworICBTRFZhbHVlIFJlcyA9IFNpbXBsaWZ5Tm9kZVdpdGhUd29SZXN1bHRzKE4sIElTRDo6TVVMLCBJU0Q6Ok1VTEhVKTsKKyAgaWYgKFJlcy5nZXROb2RlKCkpIHJldHVybiBSZXM7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRTRElWUkVNKFNETm9kZSAqTikgeworICBTRFZhbHVlIFJlcyA9IFNpbXBsaWZ5Tm9kZVdpdGhUd29SZXN1bHRzKE4sIElTRDo6U0RJViwgSVNEOjpTUkVNKTsKKyAgaWYgKFJlcy5nZXROb2RlKCkpIHJldHVybiBSZXM7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRVRElWUkVNKFNETm9kZSAqTikgeworICBTRFZhbHVlIFJlcyA9IFNpbXBsaWZ5Tm9kZVdpdGhUd29SZXN1bHRzKE4sIElTRDo6VURJViwgSVNEOjpVUkVNKTsKKyAgaWYgKFJlcy5nZXROb2RlKCkpIHJldHVybiBSZXM7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIFNpbXBsaWZ5QmluT3BXaXRoU2FtZU9wY29kZUhhbmRzIC0gSWYgdGhpcyBpcyBhIGJpbmFyeSBvcGVyYXRvciB3aXRoCisvLy8gdHdvIG9wZXJhbmRzIG9mIHRoZSBzYW1lIG9wY29kZSwgdHJ5IHRvIHNpbXBsaWZ5IGl0LgorU0RWYWx1ZSBEQUdDb21iaW5lcjo6U2ltcGxpZnlCaW5PcFdpdGhTYW1lT3Bjb2RlSGFuZHMoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApLCBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIEVWVCBWVCA9IE4wLmdldFZhbHVlVHlwZSgpOworICBhc3NlcnQoTjAuZ2V0T3Bjb2RlKCkgPT0gTjEuZ2V0T3Bjb2RlKCkgJiYgIkJhZCBpbnB1dCEiKTsKKworICAvLyBCYWlsIGVhcmx5IGlmIG5vbmUgb2YgdGhlc2UgdHJhbnNmb3JtcyBhcHBseS4KKyAgaWYgKE4wLmdldE5vZGUoKS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAwKSByZXR1cm4gU0RWYWx1ZSgpOworCisgIC8vIEZvciBlYWNoIG9mIE9QIGluIEFORC9PUi9YT1I6CisgIC8vIGZvbGQgKE9QICh6ZXh0IHgpLCAoemV4dCB5KSkgLT4gKHpleHQgKE9QIHgsIHkpKQorICAvLyBmb2xkIChPUCAoc2V4dCB4KSwgKHNleHQgeSkpIC0+IChzZXh0IChPUCB4LCB5KSkKKyAgLy8gZm9sZCAoT1AgKGFleHQgeCksIChhZXh0IHkpKSAtPiAoYWV4dCAoT1AgeCwgeSkpCisgIC8vIGZvbGQgKE9QICh0cnVuYyB4KSwgKHRydW5jIHkpKSAtPiAodHJ1bmMgKE9QIHgsIHkpKSAoaWYgdHJ1bmMgaXNuJ3QgZnJlZSkKKyAgLy8KKyAgLy8gZG8gbm90IHNpbmsgbG9naWNhbCBvcCBpbnNpZGUgb2YgYSB2ZWN0b3IgZXh0ZW5kLCBzaW5jZSBpdCBtYXkgY29tYmluZQorICAvLyBpbnRvIGEgdnNldGNjLgorICBFVlQgT3AwVlQgPSBOMC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICBpZiAoKE4wLmdldE9wY29kZSgpID09IElTRDo6WkVST19FWFRFTkQgfHwKKyAgICAgICBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNJR05fRVhURU5EIHx8CisgICAgICAgLy8gQXZvaWQgaW5maW5pdGUgbG9vcGluZyB3aXRoIFByb21vdGVJbnRCaW5PcC4KKyAgICAgICAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTllfRVhURU5EICYmCisgICAgICAgICghTGVnYWxUeXBlcyB8fCBUTEkuaXNUeXBlRGVzaXJhYmxlRm9yT3AoTi0+Z2V0T3Bjb2RlKCksIE9wMFZUKSkpIHx8CisgICAgICAgKE4wLmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUgJiYKKyAgICAgICAgKCFUTEkuaXNaRXh0RnJlZShWVCwgT3AwVlQpIHx8CisgICAgICAgICAhVExJLmlzVHJ1bmNhdGVGcmVlKE9wMFZULCBWVCkpICYmCisgICAgICAgIFRMSS5pc1R5cGVMZWdhbChPcDBWVCkpKSAmJgorICAgICAgIVZULmlzVmVjdG9yKCkgJiYKKyAgICAgIE9wMFZUID09IE4xLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkgJiYKKyAgICAgICghTGVnYWxPcGVyYXRpb25zIHx8IFRMSS5pc09wZXJhdGlvbkxlZ2FsKE4tPmdldE9wY29kZSgpLCBPcDBWVCkpKSB7CisgICAgU0RWYWx1ZSBPUk5vZGUgPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgTjAuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLCBOMS5nZXRPcGVyYW5kKDApKTsKKyAgICBBZGRUb1dvcmtMaXN0KE9STm9kZS5nZXROb2RlKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShOMC5nZXRPcGNvZGUoKSwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE9STm9kZSk7CisgIH0KKworICAvLyBGb3IgZWFjaCBvZiBPUCBpbiBTSEwvU1JML1NSQS9BTkQuLi4KKyAgLy8gICBmb2xkIChhbmQgKE9QIHgsIHopLCAoT1AgeSwgeikpIC0+IChPUCAoYW5kIHgsIHkpLCB6KQorICAvLyAgIGZvbGQgKG9yICAoT1AgeCwgeiksIChPUCB5LCB6KSkgLT4gKE9QIChvciAgeCwgeSksIHopCisgIC8vICAgZm9sZCAoeG9yIChPUCB4LCB6KSwgKE9QIHksIHopKSAtPiAoT1AgKHhvciB4LCB5KSwgeikKKyAgaWYgKChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCB8fCBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSTCB8fAorICAgICAgIE4wLmdldE9wY29kZSgpID09IElTRDo6U1JBIHx8IE4wLmdldE9wY29kZSgpID09IElTRDo6QU5EKSAmJgorICAgICAgTjAuZ2V0T3BlcmFuZCgxKSA9PSBOMS5nZXRPcGVyYW5kKDEpKSB7CisgICAgU0RWYWx1ZSBPUk5vZGUgPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgTjAuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLCBOMS5nZXRPcGVyYW5kKDApKTsKKyAgICBBZGRUb1dvcmtMaXN0KE9STm9kZS5nZXROb2RlKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShOMC5nZXRPcGNvZGUoKSwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIE9STm9kZSwgTjAuZ2V0T3BlcmFuZCgxKSk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdEFORChTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIExMLCBMUiwgUkwsIFJSLCBDQzAsIENDMTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4wQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMCk7CisgIENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEpOworICBFVlQgVlQgPSBOMS5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgQml0V2lkdGggPSBWVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworCisgIC8vIGZvbGQgdmVjdG9yIG9wcworICBpZiAoVlQuaXNWZWN0b3IoKSkgeworICAgIFNEVmFsdWUgRm9sZGVkVk9wID0gU2ltcGxpZnlWQmluT3AoTik7CisgICAgaWYgKEZvbGRlZFZPcC5nZXROb2RlKCkpIHJldHVybiBGb2xkZWRWT3A7CisgIH0KKworICAvLyBmb2xkIChhbmQgeCwgdW5kZWYpIC0+IDAKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYgfHwgTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgLy8gZm9sZCAoYW5kIGMxLCBjMikgLT4gYzEmYzIKKyAgaWYgKE4wQyAmJiBOMUMpCisgICAgcmV0dXJuIERBRy5Gb2xkQ29uc3RhbnRBcml0aG1ldGljKElTRDo6QU5ELCBWVCwgTjBDLCBOMUMpOworICAvLyBjYW5vbmljYWxpemUgY29uc3RhbnQgdG8gUkhTCisgIGlmIChOMEMgJiYgIU4xQykKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTkQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMSwgTjApOworICAvLyBmb2xkIChhbmQgeCwgLTEpIC0+IHgKKyAgaWYgKE4xQyAmJiBOMUMtPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgcmV0dXJuIE4wOworICAvLyBpZiAoYW5kIHgsIGMpIGlzIGtub3duIHRvIGJlIHplcm8sIHJldHVybiAwCisgIGlmIChOMUMgJiYgREFHLk1hc2tlZFZhbHVlSXNaZXJvKFNEVmFsdWUoTiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpKSkKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgLy8gcmVhc3NvY2lhdGUgYW5kCisgIFNEVmFsdWUgUkFORCA9IFJlYXNzb2NpYXRlT3BzKElTRDo6QU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBOMCwgTjEpOworICBpZiAoUkFORC5nZXROb2RlKCkgIT0gMCkKKyAgICByZXR1cm4gUkFORDsKKyAgLy8gZm9sZCAoYW5kIChvciB4LCBDKSwgRCkgLT4gRCBpZiAoQyAmIEQpID09IEQKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok9SKQorICAgIGlmIChDb25zdGFudFNETm9kZSAqT1JJID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpKQorICAgICAgaWYgKChPUkktPmdldEFQSW50VmFsdWUoKSAmIE4xQy0+Z2V0QVBJbnRWYWx1ZSgpKSA9PSBOMUMtPmdldEFQSW50VmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIE4xOworICAvLyBmb2xkIChhbmQgKGFueV9leHQgViksIGMpIC0+ICh6ZXJvX2V4dCBWKSBpZiAnYW5kJyBvbmx5IGNsZWFycyB0b3AgYml0cy4KKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFOWV9FWFRFTkQpIHsKKyAgICBTRFZhbHVlIE4wT3AwID0gTjAuZ2V0T3BlcmFuZCgwKTsKKyAgICBBUEludCBNYXNrID0gfk4xQy0+Z2V0QVBJbnRWYWx1ZSgpOworICAgIE1hc2sudHJ1bmMoTjBPcDAuZ2V0VmFsdWVTaXplSW5CaXRzKCkpOworICAgIGlmIChEQUcuTWFza2VkVmFsdWVJc1plcm8oTjBPcDAsIE1hc2spKSB7CisgICAgICBTRFZhbHVlIFpleHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCksIE4wT3AwKTsKKworICAgICAgLy8gUmVwbGFjZSB1c2VzIG9mIHRoZSBBTkQgd2l0aCB1c2VzIG9mIHRoZSBaZXJvIGV4dGVuZCBub2RlLgorICAgICAgQ29tYmluZVRvKE4sIFpleHQpOworCisgICAgICAvLyBXZSBhY3R1YWxseSB3YW50IHRvIHJlcGxhY2UgYWxsIHVzZXMgb2YgdGhlIGFueV9leHRlbmQgd2l0aCB0aGUKKyAgICAgIC8vIHplcm9fZXh0ZW5kLCB0byBhdm9pZCBkdXBsaWNhdGluZyB0aGluZ3MuICBUaGlzIHdpbGwgbGF0ZXIgY2F1c2UgdGhpcworICAgICAgLy8gQU5EIHRvIGJlIGZvbGRlZC4KKyAgICAgIENvbWJpbmVUbyhOMC5nZXROb2RlKCksIFpleHQpOworICAgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7ICAgLy8gUmV0dXJuIE4gc28gaXQgZG9lc24ndCBnZXQgcmVjaGVja2VkIQorICAgIH0KKyAgfQorICAvLyBmb2xkIChhbmQgKHNldGNjIHgpLCAoc2V0Y2MgeSkpIC0+IChzZXRjYyAoYW5kIHgsIHkpKQorICBpZiAoaXNTZXRDQ0VxdWl2YWxlbnQoTjAsIExMLCBMUiwgQ0MwKSAmJiBpc1NldENDRXF1aXZhbGVudChOMSwgUkwsIFJSLCBDQzEpKXsKKyAgICBJU0Q6OkNvbmRDb2RlIE9wMCA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KENDMCktPmdldCgpOworICAgIElTRDo6Q29uZENvZGUgT3AxID0gY2FzdDxDb25kQ29kZVNETm9kZT4oQ0MxKS0+Z2V0KCk7CisKKyAgICBpZiAoTFIgPT0gUlIgJiYgaXNhPENvbnN0YW50U0ROb2RlPihMUikgJiYgT3AwID09IE9wMSAmJgorICAgICAgICBMTC5nZXRWYWx1ZVR5cGUoKS5pc0ludGVnZXIoKSkgeworICAgICAgLy8gZm9sZCAoYW5kIChzZXRlcSBYLCAwKSwgKHNldGVxIFksIDApKSAtPiAoc2V0ZXEgKG9yIFgsIFkpLCAwKQorICAgICAgaWYgKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KExSKS0+aXNOdWxsVmFsdWUoKSAmJiBPcDEgPT0gSVNEOjpTRVRFUSkgeworICAgICAgICBTRFZhbHVlIE9STm9kZSA9IERBRy5nZXROb2RlKElTRDo6T1IsIE4wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFIuZ2V0VmFsdWVUeXBlKCksIExMLCBSTCk7CisgICAgICAgIEFkZFRvV29ya0xpc3QoT1JOb2RlLmdldE5vZGUoKSk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE9STm9kZSwgTFIsIE9wMSk7CisgICAgICB9CisgICAgICAvLyBmb2xkIChhbmQgKHNldGVxIFgsIC0xKSwgKHNldGVxIFksIC0xKSkgLT4gKHNldGVxIChhbmQgWCwgWSksIC0xKQorICAgICAgaWYgKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KExSKS0+aXNBbGxPbmVzVmFsdWUoKSAmJiBPcDEgPT0gSVNEOjpTRVRFUSkgeworICAgICAgICBTRFZhbHVlIEFORE5vZGUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgTjAuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFIuZ2V0VmFsdWVUeXBlKCksIExMLCBSTCk7CisgICAgICAgIEFkZFRvV29ya0xpc3QoQU5ETm9kZS5nZXROb2RlKCkpOworICAgICAgICByZXR1cm4gREFHLmdldFNldENDKE4tPmdldERlYnVnTG9jKCksIFZULCBBTkROb2RlLCBMUiwgT3AxKTsKKyAgICAgIH0KKyAgICAgIC8vIGZvbGQgKGFuZCAoc2V0Z3QgWCwgIC0xKSwgKHNldGd0IFksICAtMSkpIC0+IChzZXRndCAob3IgWCwgWSksIC0xKQorICAgICAgaWYgKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KExSKS0+aXNBbGxPbmVzVmFsdWUoKSAmJiBPcDEgPT0gSVNEOjpTRVRHVCkgeworICAgICAgICBTRFZhbHVlIE9STm9kZSA9IERBRy5nZXROb2RlKElTRDo6T1IsIE4wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFIuZ2V0VmFsdWVUeXBlKCksIExMLCBSTCk7CisgICAgICAgIEFkZFRvV29ya0xpc3QoT1JOb2RlLmdldE5vZGUoKSk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE9STm9kZSwgTFIsIE9wMSk7CisgICAgICB9CisgICAgfQorICAgIC8vIGNhbm9uaWNhbGl6ZSBlcXVpdmFsZW50IHRvIGxsID09IHJsCisgICAgaWYgKExMID09IFJSICYmIExSID09IFJMKSB7CisgICAgICBPcDEgPSBJU0Q6OmdldFNldENDU3dhcHBlZE9wZXJhbmRzKE9wMSk7CisgICAgICBzdGQ6OnN3YXAoUkwsIFJSKTsKKyAgICB9CisgICAgaWYgKExMID09IFJMICYmIExSID09IFJSKSB7CisgICAgICBib29sIGlzSW50ZWdlciA9IExMLmdldFZhbHVlVHlwZSgpLmlzSW50ZWdlcigpOworICAgICAgSVNEOjpDb25kQ29kZSBSZXN1bHQgPSBJU0Q6OmdldFNldENDQW5kT3BlcmF0aW9uKE9wMCwgT3AxLCBpc0ludGVnZXIpOworICAgICAgaWYgKFJlc3VsdCAhPSBJU0Q6OlNFVENDX0lOVkFMSUQgJiYKKyAgICAgICAgICAoIUxlZ2FsT3BlcmF0aW9ucyB8fCBUTEkuaXNDb25kQ29kZUxlZ2FsKFJlc3VsdCwgTEwuZ2V0VmFsdWVUeXBlKCkpKSkKKyAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhOLT5nZXREZWJ1Z0xvYygpLCBOMC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTCwgTFIsIFJlc3VsdCk7CisgICAgfQorICB9CisKKyAgLy8gU2ltcGxpZnk6IChhbmQgKG9wIHguLi4pLCAob3AgeS4uLikpICAtPiAob3AgKGFuZCB4LCB5KSkKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IE4xLmdldE9wY29kZSgpKSB7CisgICAgU0RWYWx1ZSBUbXAgPSBTaW1wbGlmeUJpbk9wV2l0aFNhbWVPcGNvZGVIYW5kcyhOKTsKKyAgICBpZiAoVG1wLmdldE5vZGUoKSkgcmV0dXJuIFRtcDsKKyAgfQorCisgIC8vIGZvbGQgKGFuZCAoc2lnbl9leHRlbmRfaW5yZWcgeCwgaTE2IHRvIGkzMiksIDEpIC0+IChhbmQgeCwgMSkKKyAgLy8gZm9sZCAoYW5kIChzcmEpKSAtPiAoYW5kIChzcmwpKSB3aGVuIHBvc3NpYmxlLgorICBpZiAoIVZULmlzVmVjdG9yKCkgJiYKKyAgICAgIFNpbXBsaWZ5RGVtYW5kZWRCaXRzKFNEVmFsdWUoTiwgMCkpKQorICAgIHJldHVybiBTRFZhbHVlKE4sIDApOworCisgIC8vIGZvbGQgKHpleHRfaW5yZWcgKGV4dGxvYWQgeCkpIC0+ICh6ZXh0bG9hZCB4KQorICBpZiAoSVNEOjppc0VYVExvYWQoTjAuZ2V0Tm9kZSgpKSAmJiBJU0Q6OmlzVU5JTkRFWEVETG9hZChOMC5nZXROb2RlKCkpKSB7CisgICAgTG9hZFNETm9kZSAqTE4wID0gY2FzdDxMb2FkU0ROb2RlPihOMCk7CisgICAgRVZUIE1lbVZUID0gTE4wLT5nZXRNZW1vcnlWVCgpOworICAgIC8vIElmIHdlIHplcm8gYWxsIHRoZSBwb3NzaWJsZSBleHRlbmRlZCBiaXRzLCB0aGVuIHdlIGNhbiB0dXJuIHRoaXMgaW50bworICAgIC8vIGEgemV4dGxvYWQgaWYgd2UgYXJlIHJ1bm5pbmcgYmVmb3JlIGxlZ2FsaXplIG9yIHRoZSBvcGVyYXRpb24gaXMgbGVnYWwuCisgICAgdW5zaWduZWQgQml0V2lkdGggPSBOMS5nZXRWYWx1ZVR5cGUoKS5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgIGlmIChEQUcuTWFza2VkVmFsdWVJc1plcm8oTjEsIEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFdpZHRoIC0gTWVtVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSkpICYmCisgICAgICAgICgoIUxlZ2FsT3BlcmF0aW9ucyAmJiAhTE4wLT5pc1ZvbGF0aWxlKCkpIHx8CisgICAgICAgICBUTEkuaXNMb2FkRXh0TGVnYWwoSVNEOjpaRVhUTE9BRCwgTWVtVlQpKSkgeworICAgICAgU0RWYWx1ZSBFeHRMb2FkID0gREFHLmdldEV4dExvYWQoSVNEOjpaRVhUTE9BRCwgVlQsIE4wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldENoYWluKCksIExOMC0+Z2V0QmFzZVB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRTcmNWYWx1ZU9mZnNldCgpLCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+aXNWb2xhdGlsZSgpLCBMTjAtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0QWxpZ25tZW50KCkpOworICAgICAgQWRkVG9Xb3JrTGlzdChOKTsKKyAgICAgIENvbWJpbmVUbyhOMC5nZXROb2RlKCksIEV4dExvYWQsIEV4dExvYWQuZ2V0VmFsdWUoMSkpOworICAgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7ICAgLy8gUmV0dXJuIE4gc28gaXQgZG9lc24ndCBnZXQgcmVjaGVja2VkIQorICAgIH0KKyAgfQorICAvLyBmb2xkICh6ZXh0X2lucmVnIChzZXh0bG9hZCB4KSkgLT4gKHpleHRsb2FkIHgpIGlmZiBsb2FkIGhhcyBvbmUgdXNlCisgIGlmIChJU0Q6OmlzU0VYVExvYWQoTjAuZ2V0Tm9kZSgpKSAmJiBJU0Q6OmlzVU5JTkRFWEVETG9hZChOMC5nZXROb2RlKCkpICYmCisgICAgICBOMC5oYXNPbmVVc2UoKSkgeworICAgIExvYWRTRE5vZGUgKkxOMCA9IGNhc3Q8TG9hZFNETm9kZT4oTjApOworICAgIEVWVCBNZW1WVCA9IExOMC0+Z2V0TWVtb3J5VlQoKTsKKyAgICAvLyBJZiB3ZSB6ZXJvIGFsbCB0aGUgcG9zc2libGUgZXh0ZW5kZWQgYml0cywgdGhlbiB3ZSBjYW4gdHVybiB0aGlzIGludG8KKyAgICAvLyBhIHpleHRsb2FkIGlmIHdlIGFyZSBydW5uaW5nIGJlZm9yZSBsZWdhbGl6ZSBvciB0aGUgb3BlcmF0aW9uIGlzIGxlZ2FsLgorICAgIHVuc2lnbmVkIEJpdFdpZHRoID0gTjEuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICBpZiAoREFHLk1hc2tlZFZhbHVlSXNaZXJvKE4xLCBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRXaWR0aCAtIE1lbVZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCkpKSAmJgorICAgICAgICAoKCFMZWdhbE9wZXJhdGlvbnMgJiYgIUxOMC0+aXNWb2xhdGlsZSgpKSB8fAorICAgICAgICAgVExJLmlzTG9hZEV4dExlZ2FsKElTRDo6WkVYVExPQUQsIE1lbVZUKSkpIHsKKyAgICAgIFNEVmFsdWUgRXh0TG9hZCA9IERBRy5nZXRFeHRMb2FkKElTRDo6WkVYVExPQUQsIFZULCBOMC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRDaGFpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRCYXNlUHRyKCksIExOMC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmlzVm9sYXRpbGUoKSwgTE4wLT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEFsaWdubWVudCgpKTsKKyAgICAgIEFkZFRvV29ya0xpc3QoTik7CisgICAgICBDb21iaW5lVG8oTjAuZ2V0Tm9kZSgpLCBFeHRMb2FkLCBFeHRMb2FkLmdldFZhbHVlKDEpKTsKKyAgICAgIHJldHVybiBTRFZhbHVlKE4sIDApOyAgIC8vIFJldHVybiBOIHNvIGl0IGRvZXNuJ3QgZ2V0IHJlY2hlY2tlZCEKKyAgICB9CisgIH0KKworICAvLyBmb2xkIChhbmQgKGxvYWQgeCksIDI1NSkgLT4gKHpleHRsb2FkIHgsIGk4KQorICAvLyBmb2xkIChhbmQgKGV4dGxvYWQgeCwgaTE2KSwgMjU1KSAtPiAoemV4dGxvYWQgeCwgaTgpCisgIC8vIGZvbGQgKGFuZCAoYW55X2V4dCAoZXh0bG9hZCB4LCBpMTYpKSwgMjU1KSAtPiAoemV4dGxvYWQgeCwgaTgpCisgIGlmIChOMUMgJiYgKE4wLmdldE9wY29kZSgpID09IElTRDo6TE9BRCB8fAorICAgICAgICAgICAgICAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTllfRVhURU5EICYmCisgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6TE9BRCkpKSB7CisgICAgYm9vbCBIYXNBbnlFeHQgPSBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFOWV9FWFRFTkQ7CisgICAgTG9hZFNETm9kZSAqTE4wID0gSGFzQW55RXh0CisgICAgICA/IGNhc3Q8TG9hZFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgwKSkKKyAgICAgIDogY2FzdDxMb2FkU0ROb2RlPihOMCk7CisgICAgaWYgKExOMC0+Z2V0RXh0ZW5zaW9uVHlwZSgpICE9IElTRDo6U0VYVExPQUQgJiYKKyAgICAgICAgTE4wLT5pc1VuaW5kZXhlZCgpICYmIE4wLmhhc09uZVVzZSgpICYmIExOMC0+aGFzT25lVXNlKCkpIHsKKyAgICAgIHVpbnQzMl90IEFjdGl2ZUJpdHMgPSBOMUMtPmdldEFQSW50VmFsdWUoKS5nZXRBY3RpdmVCaXRzKCk7CisgICAgICBpZiAoQWN0aXZlQml0cyA+IDAgJiYgQVBJbnRPcHM6OmlzTWFzayhBY3RpdmVCaXRzLCBOMUMtPmdldEFQSW50VmFsdWUoKSkpeworICAgICAgICBFVlQgRXh0VlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgQWN0aXZlQml0cyk7CisgICAgICAgIEVWVCBMb2FkZWRWVCA9IExOMC0+Z2V0TWVtb3J5VlQoKTsKKworICAgICAgICBpZiAoRXh0VlQgPT0gTG9hZGVkVlQgJiYKKyAgICAgICAgICAgICghTGVnYWxPcGVyYXRpb25zIHx8IFRMSS5pc0xvYWRFeHRMZWdhbChJU0Q6OlpFWFRMT0FELCBFeHRWVCkpKSB7CisgICAgICAgICAgRVZUIExvYWRSZXN1bHRUeSA9IEhhc0FueUV4dCA/IExOMC0+Z2V0VmFsdWVUeXBlKDApIDogVlQ7CisgICAgICAgICAgCisgICAgICAgICAgU0RWYWx1ZSBOZXdMb2FkID0gCisgICAgICAgICAgICBEQUcuZ2V0RXh0TG9hZChJU0Q6OlpFWFRMT0FELCBMb2FkUmVzdWx0VHksIExOMC0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0Q2hhaW4oKSwgTE4wLT5nZXRCYXNlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldFNyY1ZhbHVlKCksIExOMC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZULCBMTjAtPmlzVm9sYXRpbGUoKSwgTE4wLT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEFsaWdubWVudCgpKTsKKyAgICAgICAgICBBZGRUb1dvcmtMaXN0KE4pOworICAgICAgICAgIENvbWJpbmVUbyhMTjAsIE5ld0xvYWQsIE5ld0xvYWQuZ2V0VmFsdWUoMSkpOworICAgICAgICAgIHJldHVybiBTRFZhbHVlKE4sIDApOyAgIC8vIFJldHVybiBOIHNvIGl0IGRvZXNuJ3QgZ2V0IHJlY2hlY2tlZCEKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRG8gbm90IGNoYW5nZSB0aGUgd2lkdGggb2YgYSB2b2xhdGlsZSBsb2FkLgorICAgICAgICAvLyBEbyBub3QgZ2VuZXJhdGUgbG9hZHMgb2Ygbm9uLXJvdW5kIGludGVnZXIgdHlwZXMgc2luY2UgdGhlc2UgY2FuCisgICAgICAgIC8vIGJlIGV4cGVuc2l2ZSAoYW5kIHdvdWxkIGJlIHdyb25nIGlmIHRoZSB0eXBlIGlzIG5vdCBieXRlIHNpemVkKS4KKyAgICAgICAgaWYgKCFMTjAtPmlzVm9sYXRpbGUoKSAmJiBMb2FkZWRWVC5iaXRzR1QoRXh0VlQpICYmIEV4dFZULmlzUm91bmQoKSAmJgorICAgICAgICAgICAgKCFMZWdhbE9wZXJhdGlvbnMgfHwgVExJLmlzTG9hZEV4dExlZ2FsKElTRDo6WkVYVExPQUQsIEV4dFZUKSkpIHsKKyAgICAgICAgICBFVlQgUHRyVHlwZSA9IExOMC0+Z2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKTsKKworICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCA9IExOMC0+Z2V0QWxpZ25tZW50KCk7CisgICAgICAgICAgU0RWYWx1ZSBOZXdQdHIgPSBMTjAtPmdldEJhc2VQdHIoKTsKKworICAgICAgICAgIC8vIEZvciBiaWcgZW5kaWFuIHRhcmdldHMsIHdlIG5lZWQgdG8gYWRkIGFuIG9mZnNldCB0byB0aGUgcG9pbnRlcgorICAgICAgICAgIC8vIHRvIGxvYWQgdGhlIGNvcnJlY3QgYnl0ZXMuICBGb3IgbGl0dGxlIGVuZGlhbiBzeXN0ZW1zLCB3ZSBtZXJlbHkKKyAgICAgICAgICAvLyBuZWVkIHRvIHJlYWQgZmV3ZXIgYnl0ZXMgZnJvbSB0aGUgc2FtZSBwb2ludGVyLgorICAgICAgICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkgeworICAgICAgICAgICAgdW5zaWduZWQgTFZUU3RvcmVCeXRlcyA9IExvYWRlZFZULmdldFN0b3JlU2l6ZSgpOworICAgICAgICAgICAgdW5zaWduZWQgRVZUU3RvcmVCeXRlcyA9IEV4dFZULmdldFN0b3JlU2l6ZSgpOworICAgICAgICAgICAgdW5zaWduZWQgUHRyT2ZmID0gTFZUU3RvcmVCeXRlcyAtIEVWVFN0b3JlQnl0ZXM7CisgICAgICAgICAgICBOZXdQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgTE4wLT5nZXREZWJ1Z0xvYygpLCBQdHJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3UHRyLCBEQUcuZ2V0Q29uc3RhbnQoUHRyT2ZmLCBQdHJUeXBlKSk7CisgICAgICAgICAgICBBbGlnbm1lbnQgPSBNaW5BbGlnbihBbGlnbm1lbnQsIFB0ck9mZik7CisgICAgICAgICAgfQorCisgICAgICAgICAgQWRkVG9Xb3JrTGlzdChOZXdQdHIuZ2V0Tm9kZSgpKTsKKyAgICAgICAgICAKKyAgICAgICAgICBFVlQgTG9hZFJlc3VsdFR5ID0gSGFzQW55RXh0ID8gTE4wLT5nZXRWYWx1ZVR5cGUoMCkgOiBWVDsKKyAgICAgICAgICBTRFZhbHVlIExvYWQgPQorICAgICAgICAgICAgREFHLmdldEV4dExvYWQoSVNEOjpaRVhUTE9BRCwgTG9hZFJlc3VsdFR5LCBMTjAtPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldENoYWluKCksIE5ld1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0U3JjVmFsdWUoKSwgTE4wLT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VlQsIExOMC0+aXNWb2xhdGlsZSgpLCBMTjAtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCk7CisgICAgICAgICAgQWRkVG9Xb3JrTGlzdChOKTsKKyAgICAgICAgICBDb21iaW5lVG8oTE4wLCBMb2FkLCBMb2FkLmdldFZhbHVlKDEpKTsKKyAgICAgICAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsgICAvLyBSZXR1cm4gTiBzbyBpdCBkb2Vzbid0IGdldCByZWNoZWNrZWQhCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdE9SKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgTEwsIExSLCBSTCwgUlIsIENDMCwgQ0MxOworICBDb25zdGFudFNETm9kZSAqTjBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMSk7CisgIEVWVCBWVCA9IE4xLmdldFZhbHVlVHlwZSgpOworCisgIC8vIGZvbGQgdmVjdG9yIG9wcworICBpZiAoVlQuaXNWZWN0b3IoKSkgeworICAgIFNEVmFsdWUgRm9sZGVkVk9wID0gU2ltcGxpZnlWQmluT3AoTik7CisgICAgaWYgKEZvbGRlZFZPcC5nZXROb2RlKCkpIHJldHVybiBGb2xkZWRWT3A7CisgIH0KKworICAvLyBmb2xkIChvciB4LCB1bmRlZikgLT4gLTEKKyAgaWYgKCFMZWdhbE9wZXJhdGlvbnMgJiYKKyAgICAgIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGIHx8IE4xLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpKSB7CisgICAgRVZUIEVsdFZUID0gVlQuaXNWZWN0b3IoKSA/IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgOiBWVDsKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoRWx0VlQuZ2V0U2l6ZUluQml0cygpKSwgVlQpOworICB9CisgIC8vIGZvbGQgKG9yIGMxLCBjMikgLT4gYzF8YzIKKyAgaWYgKE4wQyAmJiBOMUMpCisgICAgcmV0dXJuIERBRy5Gb2xkQ29uc3RhbnRBcml0aG1ldGljKElTRDo6T1IsIFZULCBOMEMsIE4xQyk7CisgIC8vIGNhbm9uaWNhbGl6ZSBjb25zdGFudCB0byBSSFMKKyAgaWYgKE4wQyAmJiAhTjFDKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjEsIE4wKTsKKyAgLy8gZm9sZCAob3IgeCwgMCkgLT4geAorICBpZiAoTjFDICYmIE4xQy0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gTjA7CisgIC8vIGZvbGQgKG9yIHgsIC0xKSAtPiAtMQorICBpZiAoTjFDICYmIE4xQy0+aXNBbGxPbmVzVmFsdWUoKSkKKyAgICByZXR1cm4gTjE7CisgIC8vIGZvbGQgKG9yIHgsIGMpIC0+IGMgaWZmICh4ICYgfmMpID09IDAKKyAgaWYgKE4xQyAmJiBEQUcuTWFza2VkVmFsdWVJc1plcm8oTjAsIH5OMUMtPmdldEFQSW50VmFsdWUoKSkpCisgICAgcmV0dXJuIE4xOworICAvLyByZWFzc29jaWF0ZSBvcgorICBTRFZhbHVlIFJPUiA9IFJlYXNzb2NpYXRlT3BzKElTRDo6T1IsIE4tPmdldERlYnVnTG9jKCksIE4wLCBOMSk7CisgIGlmIChST1IuZ2V0Tm9kZSgpICE9IDApCisgICAgcmV0dXJuIFJPUjsKKyAgLy8gQ2Fub25pY2FsaXplIChvciAoYW5kIFgsIGMxKSwgYzIpIC0+IChhbmQgKG9yIFgsIGMyKSwgYzF8YzIpCisgIC8vIGlmZiAoYzEgJiBjMikgPT0gMC4KKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCAmJiBOMC5nZXROb2RlKCktPmhhc09uZVVzZSgpICYmCisgICAgICAgICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKSkgeworICAgIENvbnN0YW50U0ROb2RlICpDMSA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpOworICAgIGlmICgoQzEtPmdldEFQSW50VmFsdWUoKSAmIE4xQy0+Z2V0QVBJbnRWYWx1ZSgpKSAhPSAwKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBOMC5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLCBOMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLkZvbGRDb25zdGFudEFyaXRobWV0aWMoSVNEOjpPUiwgVlQsIE4xQywgQzEpKTsKKyAgfQorICAvLyBmb2xkIChvciAoc2V0Y2MgeCksIChzZXRjYyB5KSkgLT4gKHNldGNjIChvciB4LCB5KSkKKyAgaWYgKGlzU2V0Q0NFcXVpdmFsZW50KE4wLCBMTCwgTFIsIENDMCkgJiYgaXNTZXRDQ0VxdWl2YWxlbnQoTjEsIFJMLCBSUiwgQ0MxKSl7CisgICAgSVNEOjpDb25kQ29kZSBPcDAgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihDQzApLT5nZXQoKTsKKyAgICBJU0Q6OkNvbmRDb2RlIE9wMSA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KENDMSktPmdldCgpOworCisgICAgaWYgKExSID09IFJSICYmIGlzYTxDb25zdGFudFNETm9kZT4oTFIpICYmIE9wMCA9PSBPcDEgJiYKKyAgICAgICAgTEwuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkpIHsKKyAgICAgIC8vIGZvbGQgKG9yIChzZXRuZSBYLCAwKSwgKHNldG5lIFksIDApKSAtPiAoc2V0bmUgKG9yIFgsIFkpLCAwKQorICAgICAgLy8gZm9sZCAob3IgKHNldGx0IFgsIDApLCAoc2V0bHQgWSwgMCkpIC0+IChzZXRuZSAob3IgWCwgWSksIDApCisgICAgICBpZiAoY2FzdDxDb25zdGFudFNETm9kZT4oTFIpLT5pc051bGxWYWx1ZSgpICYmCisgICAgICAgICAgKE9wMSA9PSBJU0Q6OlNFVE5FIHx8IE9wMSA9PSBJU0Q6OlNFVExUKSkgeworICAgICAgICBTRFZhbHVlIE9STm9kZSA9IERBRy5nZXROb2RlKElTRDo6T1IsIExSLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFIuZ2V0VmFsdWVUeXBlKCksIExMLCBSTCk7CisgICAgICAgIEFkZFRvV29ya0xpc3QoT1JOb2RlLmdldE5vZGUoKSk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE9STm9kZSwgTFIsIE9wMSk7CisgICAgICB9CisgICAgICAvLyBmb2xkIChvciAoc2V0bmUgWCwgLTEpLCAoc2V0bmUgWSwgLTEpKSAtPiAoc2V0bmUgKGFuZCBYLCBZKSwgLTEpCisgICAgICAvLyBmb2xkIChvciAoc2V0Z3QgWCwgLTEpLCAoc2V0Z3QgWSAgLTEpKSAtPiAoc2V0Z3QgKGFuZCBYLCBZKSwgLTEpCisgICAgICBpZiAoY2FzdDxDb25zdGFudFNETm9kZT4oTFIpLT5pc0FsbE9uZXNWYWx1ZSgpICYmCisgICAgICAgICAgKE9wMSA9PSBJU0Q6OlNFVE5FIHx8IE9wMSA9PSBJU0Q6OlNFVEdUKSkgeworICAgICAgICBTRFZhbHVlIEFORE5vZGUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgTFIuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFIuZ2V0VmFsdWVUeXBlKCksIExMLCBSTCk7CisgICAgICAgIEFkZFRvV29ya0xpc3QoQU5ETm9kZS5nZXROb2RlKCkpOworICAgICAgICByZXR1cm4gREFHLmdldFNldENDKE4tPmdldERlYnVnTG9jKCksIFZULCBBTkROb2RlLCBMUiwgT3AxKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gY2Fub25pY2FsaXplIGVxdWl2YWxlbnQgdG8gbGwgPT0gcmwKKyAgICBpZiAoTEwgPT0gUlIgJiYgTFIgPT0gUkwpIHsKKyAgICAgIE9wMSA9IElTRDo6Z2V0U2V0Q0NTd2FwcGVkT3BlcmFuZHMoT3AxKTsKKyAgICAgIHN0ZDo6c3dhcChSTCwgUlIpOworICAgIH0KKyAgICBpZiAoTEwgPT0gUkwgJiYgTFIgPT0gUlIpIHsKKyAgICAgIGJvb2wgaXNJbnRlZ2VyID0gTEwuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCk7CisgICAgICBJU0Q6OkNvbmRDb2RlIFJlc3VsdCA9IElTRDo6Z2V0U2V0Q0NPck9wZXJhdGlvbihPcDAsIE9wMSwgaXNJbnRlZ2VyKTsKKyAgICAgIGlmIChSZXN1bHQgIT0gSVNEOjpTRVRDQ19JTlZBTElEICYmCisgICAgICAgICAgKCFMZWdhbE9wZXJhdGlvbnMgfHwgVExJLmlzQ29uZENvZGVMZWdhbChSZXN1bHQsIExMLmdldFZhbHVlVHlwZSgpKSkpCisgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoTi0+Z2V0RGVidWdMb2MoKSwgTjAuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEwsIExSLCBSZXN1bHQpOworICAgIH0KKyAgfQorCisgIC8vIFNpbXBsaWZ5OiAob3IgKG9wIHguLi4pLCAob3AgeS4uLikpICAtPiAob3AgKG9yIHgsIHkpKQorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gTjEuZ2V0T3Bjb2RlKCkpIHsKKyAgICBTRFZhbHVlIFRtcCA9IFNpbXBsaWZ5QmluT3BXaXRoU2FtZU9wY29kZUhhbmRzKE4pOworICAgIGlmIChUbXAuZ2V0Tm9kZSgpKSByZXR1cm4gVG1wOworICB9CisKKyAgLy8gKG9yIChhbmQgWCwgQzEpLCAoYW5kIFksIEMyKSkgIC0+IChhbmQgKG9yIFgsIFkpLCBDMykgaWYgcG9zc2libGUuCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCAmJgorICAgICAgTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTkQgJiYKKyAgICAgIE4wLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJgorICAgICAgTjEuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50ICYmCisgICAgICAvLyBEb24ndCBpbmNyZWFzZSAjIGNvbXB1dGF0aW9ucy4KKyAgICAgIChOMC5nZXROb2RlKCktPmhhc09uZVVzZSgpIHx8IE4xLmdldE5vZGUoKS0+aGFzT25lVXNlKCkpKSB7CisgICAgLy8gV2UgY2FuIG9ubHkgZG8gdGhpcyB4Zm9ybSBpZiB3ZSBrbm93IHRoYXQgYml0cyBmcm9tIFggdGhhdCBhcmUgc2V0IGluIEMyCisgICAgLy8gYnV0IG5vdCBpbiBDMSBhcmUgYWxyZWFkeSB6ZXJvLiAgTGlrZXdpc2UgZm9yIFkuCisgICAgY29uc3QgQVBJbnQgJkxIU01hc2sgPQorICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgxKSktPmdldEFQSW50VmFsdWUoKTsKKyAgICBjb25zdCBBUEludCAmUkhTTWFzayA9CisgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihOMS5nZXRPcGVyYW5kKDEpKS0+Z2V0QVBJbnRWYWx1ZSgpOworCisgICAgaWYgKERBRy5NYXNrZWRWYWx1ZUlzWmVybyhOMC5nZXRPcGVyYW5kKDApLCBSSFNNYXNrJn5MSFNNYXNrKSAmJgorICAgICAgICBEQUcuTWFza2VkVmFsdWVJc1plcm8oTjEuZ2V0T3BlcmFuZCgwKSwgTEhTTWFzayZ+UkhTTWFzaykpIHsKKyAgICAgIFNEVmFsdWUgWCA9IERBRy5nZXROb2RlKElTRDo6T1IsIE4wLmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKSwgTjEuZ2V0T3BlcmFuZCgwKSk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTkQsIE4tPmdldERlYnVnTG9jKCksIFZULCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChMSFNNYXNrIHwgUkhTTWFzaywgVlQpKTsKKyAgICB9CisgIH0KKworICAvLyBTZWUgaWYgdGhpcyBpcyBzb21lIHJvdGF0ZSBpZGlvbS4KKyAgaWYgKFNETm9kZSAqUm90ID0gTWF0Y2hSb3RhdGUoTjAsIE4xLCBOLT5nZXREZWJ1Z0xvYygpKSkKKyAgICByZXR1cm4gU0RWYWx1ZShSb3QsIDApOworCisgIC8vIFNpbXBsaWZ5IHRoZSBvcGVyYW5kcyB1c2luZyBkZW1hbmRlZC1iaXRzIGluZm9ybWF0aW9uLgorICBpZiAoIVZULmlzVmVjdG9yKCkgJiYKKyAgICAgIFNpbXBsaWZ5RGVtYW5kZWRCaXRzKFNEVmFsdWUoTiwgMCkpKQorICAgIHJldHVybiBTRFZhbHVlKE4sIDApOworCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBNYXRjaFJvdGF0ZUhhbGYgLSBNYXRjaCAiKFggc2hsL3NybCBWMSkgJiBWMiIgd2hlcmUgVjIgbWF5IG5vdCBiZSBwcmVzZW50Lgorc3RhdGljIGJvb2wgTWF0Y2hSb3RhdGVIYWxmKFNEVmFsdWUgT3AsIFNEVmFsdWUgJlNoaWZ0LCBTRFZhbHVlICZNYXNrKSB7CisgIGlmIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCkgeworICAgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBNYXNrID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgICAgIE9wID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGlmIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSTCB8fCBPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCkgeworICAgIFNoaWZ0ID0gT3A7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIE1hdGNoUm90YXRlIC0gSGFuZGxlIGFuICdvcicgb2YgdHdvIG9wZXJhbmRzLiAgSWYgdGhpcyBpcyBvbmUgb2YgdGhlIG1hbnkKKy8vIGlkaW9tcyBmb3Igcm90YXRlLCBhbmQgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyByb3RhdGlvbiBpbnN0cnVjdGlvbnMsIGdlbmVyYXRlCisvLyBhIHJvdFtscl0uCitTRE5vZGUgKkRBR0NvbWJpbmVyOjpNYXRjaFJvdGF0ZShTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsIERlYnVnTG9jIERMKSB7CisgIC8vIE11c3QgYmUgYSBsZWdhbCB0eXBlLiAgRXhwYW5kZWQgJ24gcHJvbW90ZWQgdGhpbmdzIHdvbid0IHdvcmsgd2l0aCByb3RhdGVzLgorICBFVlQgVlQgPSBMSFMuZ2V0VmFsdWVUeXBlKCk7CisgIGlmICghVExJLmlzVHlwZUxlZ2FsKFZUKSkgcmV0dXJuIDA7CisKKyAgLy8gVGhlIHRhcmdldCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHJvdGF0ZSBmbGF2b3IuCisgIGJvb2wgSGFzUk9UTCA9IFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpST1RMLCBWVCk7CisgIGJvb2wgSGFzUk9UUiA9IFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpST1RSLCBWVCk7CisgIGlmICghSGFzUk9UTCAmJiAhSGFzUk9UUikgcmV0dXJuIDA7CisKKyAgLy8gTWF0Y2ggIihYIHNobC9zcmwgVjEpICYgVjIiIHdoZXJlIFYyIG1heSBub3QgYmUgcHJlc2VudC4KKyAgU0RWYWx1ZSBMSFNTaGlmdDsgICAvLyBUaGUgc2hpZnQuCisgIFNEVmFsdWUgTEhTTWFzazsgICAgLy8gQU5EIHZhbHVlIGlmIGFueS4KKyAgaWYgKCFNYXRjaFJvdGF0ZUhhbGYoTEhTLCBMSFNTaGlmdCwgTEhTTWFzaykpCisgICAgcmV0dXJuIDA7IC8vIE5vdCBwYXJ0IG9mIGEgcm90YXRlLgorCisgIFNEVmFsdWUgUkhTU2hpZnQ7ICAgLy8gVGhlIHNoaWZ0LgorICBTRFZhbHVlIFJIU01hc2s7ICAgIC8vIEFORCB2YWx1ZSBpZiBhbnkuCisgIGlmICghTWF0Y2hSb3RhdGVIYWxmKFJIUywgUkhTU2hpZnQsIFJIU01hc2spKQorICAgIHJldHVybiAwOyAvLyBOb3QgcGFydCBvZiBhIHJvdGF0ZS4KKworICBpZiAoTEhTU2hpZnQuZ2V0T3BlcmFuZCgwKSAhPSBSSFNTaGlmdC5nZXRPcGVyYW5kKDApKQorICAgIHJldHVybiAwOyAgIC8vIE5vdCBzaGlmdGluZyB0aGUgc2FtZSB2YWx1ZS4KKworICBpZiAoTEhTU2hpZnQuZ2V0T3Bjb2RlKCkgPT0gUkhTU2hpZnQuZ2V0T3Bjb2RlKCkpCisgICAgcmV0dXJuIDA7ICAgLy8gU2hpZnRzIG11c3QgZGlzYWdyZWUuCisKKyAgLy8gQ2Fub25pY2FsaXplIHNobCB0byBsZWZ0IHNpZGUgaW4gYSBzaGwvc3JsIHBhaXIuCisgIGlmIChSSFNTaGlmdC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCkgeworICAgIHN0ZDo6c3dhcChMSFMsIFJIUyk7CisgICAgc3RkOjpzd2FwKExIU1NoaWZ0LCBSSFNTaGlmdCk7CisgICAgc3RkOjpzd2FwKExIU01hc2sgLCBSSFNNYXNrICk7CisgIH0KKworICB1bnNpZ25lZCBPcFNpemVJbkJpdHMgPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgIFNEVmFsdWUgTEhTU2hpZnRBcmcgPSBMSFNTaGlmdC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIExIU1NoaWZ0QW10ID0gTEhTU2hpZnQuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBSSFNTaGlmdEFtdCA9IFJIU1NoaWZ0LmdldE9wZXJhbmQoMSk7CisKKyAgLy8gZm9sZCAob3IgKHNobCB4LCBDMSksIChzcmwgeCwgQzIpKSAtPiAocm90bCB4LCBDMSkKKyAgLy8gZm9sZCAob3IgKHNobCB4LCBDMSksIChzcmwgeCwgQzIpKSAtPiAocm90ciB4LCBDMikKKyAgaWYgKExIU1NoaWZ0QW10LmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQgJiYKKyAgICAgIFJIU1NoaWZ0QW10LmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpIHsKKyAgICB1aW50NjRfdCBMU2hWYWwgPSBjYXN0PENvbnN0YW50U0ROb2RlPihMSFNTaGlmdEFtdCktPmdldFpFeHRWYWx1ZSgpOworICAgIHVpbnQ2NF90IFJTaFZhbCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KFJIU1NoaWZ0QW10KS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKChMU2hWYWwgKyBSU2hWYWwpICE9IE9wU2l6ZUluQml0cykKKyAgICAgIHJldHVybiAwOworCisgICAgU0RWYWx1ZSBSb3Q7CisgICAgaWYgKEhhc1JPVEwpCisgICAgICBSb3QgPSBEQUcuZ2V0Tm9kZShJU0Q6OlJPVEwsIERMLCBWVCwgTEhTU2hpZnRBcmcsIExIU1NoaWZ0QW10KTsKKyAgICBlbHNlCisgICAgICBSb3QgPSBEQUcuZ2V0Tm9kZShJU0Q6OlJPVFIsIERMLCBWVCwgTEhTU2hpZnRBcmcsIFJIU1NoaWZ0QW10KTsKKworICAgIC8vIElmIHRoZXJlIGlzIGFuIEFORCBvZiBlaXRoZXIgc2hpZnRlZCBvcGVyYW5kLCBhcHBseSBpdCB0byB0aGUgcmVzdWx0LgorICAgIGlmIChMSFNNYXNrLmdldE5vZGUoKSB8fCBSSFNNYXNrLmdldE5vZGUoKSkgeworICAgICAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoT3BTaXplSW5CaXRzKTsKKworICAgICAgaWYgKExIU01hc2suZ2V0Tm9kZSgpKSB7CisgICAgICAgIEFQSW50IFJIU0JpdHMgPSBBUEludDo6Z2V0TG93Qml0c1NldChPcFNpemVJbkJpdHMsIExTaFZhbCk7CisgICAgICAgIE1hc2sgJj0gY2FzdDxDb25zdGFudFNETm9kZT4oTEhTTWFzayktPmdldEFQSW50VmFsdWUoKSB8IFJIU0JpdHM7CisgICAgICB9CisgICAgICBpZiAoUkhTTWFzay5nZXROb2RlKCkpIHsKKyAgICAgICAgQVBJbnQgTEhTQml0cyA9IEFQSW50OjpnZXRIaWdoQml0c1NldChPcFNpemVJbkJpdHMsIFJTaFZhbCk7CisgICAgICAgIE1hc2sgJj0gY2FzdDxDb25zdGFudFNETm9kZT4oUkhTTWFzayktPmdldEFQSW50VmFsdWUoKSB8IExIU0JpdHM7CisgICAgICB9CisKKyAgICAgIFJvdCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBETCwgVlQsIFJvdCwgREFHLmdldENvbnN0YW50KE1hc2ssIFZUKSk7CisgICAgfQorCisgICAgcmV0dXJuIFJvdC5nZXROb2RlKCk7CisgIH0KKworICAvLyBJZiB0aGVyZSBpcyBhIG1hc2sgaGVyZSwgYW5kIHdlIGhhdmUgYSB2YXJpYWJsZSBzaGlmdCwgd2UgY2FuJ3QgYmUgc3VyZQorICAvLyB0aGF0IHdlJ3JlIG1hc2tpbmcgb3V0IHRoZSByaWdodCBzdHVmZi4KKyAgaWYgKExIU01hc2suZ2V0Tm9kZSgpIHx8IFJIU01hc2suZ2V0Tm9kZSgpKQorICAgIHJldHVybiAwOworCisgIC8vIGZvbGQgKG9yIChzaGwgeCwgeSksIChzcmwgeCwgKHN1YiAzMiwgeSkpKSAtPiAocm90bCB4LCB5KQorICAvLyBmb2xkIChvciAoc2hsIHgsIHkpLCAoc3JsIHgsIChzdWIgMzIsIHkpKSkgLT4gKHJvdHIgeCwgKHN1YiAzMiwgeSkpCisgIGlmIChSSFNTaGlmdEFtdC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQiAmJgorICAgICAgTEhTU2hpZnRBbXQgPT0gUkhTU2hpZnRBbXQuZ2V0T3BlcmFuZCgxKSkgeworICAgIGlmIChDb25zdGFudFNETm9kZSAqU1VCQyA9CisgICAgICAgICAgZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFJIU1NoaWZ0QW10LmdldE9wZXJhbmQoMCkpKSB7CisgICAgICBpZiAoU1VCQy0+Z2V0QVBJbnRWYWx1ZSgpID09IE9wU2l6ZUluQml0cykgeworICAgICAgICBpZiAoSGFzUk9UTCkKKyAgICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpST1RMLCBETCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIU1NoaWZ0QXJnLCBMSFNTaGlmdEFtdCkuZ2V0Tm9kZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Uk9UUiwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNTaGlmdEFyZywgUkhTU2hpZnRBbXQpLmdldE5vZGUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBmb2xkIChvciAoc2hsIHgsIChzdWIgMzIsIHkpKSwgKHNybCB4LCByKSkgLT4gKHJvdHIgeCwgeSkKKyAgLy8gZm9sZCAob3IgKHNobCB4LCAoc3ViIDMyLCB5KSksIChzcmwgeCwgcikpIC0+IChyb3RsIHgsIChzdWIgMzIsIHkpKQorICBpZiAoTEhTU2hpZnRBbXQuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIgJiYKKyAgICAgIFJIU1NoaWZ0QW10ID09IExIU1NoaWZ0QW10LmdldE9wZXJhbmQoMSkpIHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlNVQkMgPQorICAgICAgICAgIGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihMSFNTaGlmdEFtdC5nZXRPcGVyYW5kKDApKSkgeworICAgICAgaWYgKFNVQkMtPmdldEFQSW50VmFsdWUoKSA9PSBPcFNpemVJbkJpdHMpIHsKKyAgICAgICAgaWYgKEhhc1JPVFIpCisgICAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Uk9UUiwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNTaGlmdEFyZywgUkhTU2hpZnRBbXQpLmdldE5vZGUoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlJPVEwsIERMLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTU2hpZnRBcmcsIExIU1NoaWZ0QW10KS5nZXROb2RlKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gTG9vayBmb3Igc2lnbi96ZXh0L2FueS1leHRlbmRlZCBvciB0cnVuY2F0ZSBjYXNlczoKKyAgaWYgKChMSFNTaGlmdEFtdC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNJR05fRVhURU5ECisgICAgICAgfHwgTEhTU2hpZnRBbXQuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpaRVJPX0VYVEVORAorICAgICAgIHx8IExIU1NoaWZ0QW10LmdldE9wY29kZSgpID09IElTRDo6QU5ZX0VYVEVORAorICAgICAgIHx8IExIU1NoaWZ0QW10LmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUpICYmCisgICAgICAoUkhTU2hpZnRBbXQuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSUdOX0VYVEVORAorICAgICAgIHx8IFJIU1NoaWZ0QW10LmdldE9wY29kZSgpID09IElTRDo6WkVST19FWFRFTkQKKyAgICAgICB8fCBSSFNTaGlmdEFtdC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFOWV9FWFRFTkQKKyAgICAgICB8fCBSSFNTaGlmdEFtdC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFKSkgeworICAgIFNEVmFsdWUgTEV4dE9wMCA9IExIU1NoaWZ0QW10LmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBSRXh0T3AwID0gUkhTU2hpZnRBbXQuZ2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoUkV4dE9wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQiAmJgorICAgICAgICBSRXh0T3AwLmdldE9wZXJhbmQoMSkgPT0gTEV4dE9wMCkgeworICAgICAgLy8gZm9sZCAob3IgKHNobCB4LCAoKmV4dCB5KSksIChzcmwgeCwgKCpleHQgKHN1YiAzMiwgeSkpKSkgLT4KKyAgICAgIC8vICAgKHJvdGwgeCwgeSkKKyAgICAgIC8vIGZvbGQgKG9yIChzaGwgeCwgKCpleHQgeSkpLCAoc3JsIHgsICgqZXh0IChzdWIgMzIsIHkpKSkpIC0+CisgICAgICAvLyAgIChyb3RyIHgsIChzdWIgMzIsIHkpKQorICAgICAgaWYgKENvbnN0YW50U0ROb2RlICpTVUJDID0KKyAgICAgICAgICAgIGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihSRXh0T3AwLmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgIGlmIChTVUJDLT5nZXRBUEludFZhbHVlKCkgPT0gT3BTaXplSW5CaXRzKSB7CisgICAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKEhhc1JPVEwgPyBJU0Q6OlJPVEwgOiBJU0Q6OlJPVFIsIERMLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTU2hpZnRBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc1JPVEwgPyBMSFNTaGlmdEFtdCA6IFJIU1NoaWZ0QW10KS5nZXROb2RlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKExFeHRPcDAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIgJiYKKyAgICAgICAgICAgICAgIFJFeHRPcDAgPT0gTEV4dE9wMC5nZXRPcGVyYW5kKDEpKSB7CisgICAgICAvLyBmb2xkIChvciAoc2hsIHgsICgqZXh0IChzdWIgMzIsIHkpKSksIChzcmwgeCwgKCpleHQgeSkpKSAtPgorICAgICAgLy8gICAocm90ciB4LCB5KQorICAgICAgLy8gZm9sZCAob3IgKHNobCB4LCAoKmV4dCAoc3ViIDMyLCB5KSkpLCAoc3JsIHgsICgqZXh0IHkpKSkgLT4KKyAgICAgIC8vICAgKHJvdGwgeCwgKHN1YiAzMiwgeSkpCisgICAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlNVQkMgPQorICAgICAgICAgICAgZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KExFeHRPcDAuZ2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgaWYgKFNVQkMtPmdldEFQSW50VmFsdWUoKSA9PSBPcFNpemVJbkJpdHMpIHsKKyAgICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSGFzUk9UUiA/IElTRDo6Uk9UUiA6IElTRDo6Uk9UTCwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNTaGlmdEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzUk9UUiA/IFJIU1NoaWZ0QW10IDogTEhTU2hpZnRBbXQpLmdldE5vZGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFhPUihTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIExIUywgUkhTLCBDQzsKKyAgQ29uc3RhbnRTRE5vZGUgKk4wQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMCk7CisgIENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEpOworICBFVlQgVlQgPSBOMC5nZXRWYWx1ZVR5cGUoKTsKKworICAvLyBmb2xkIHZlY3RvciBvcHMKKyAgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICBTRFZhbHVlIEZvbGRlZFZPcCA9IFNpbXBsaWZ5VkJpbk9wKE4pOworICAgIGlmIChGb2xkZWRWT3AuZ2V0Tm9kZSgpKSByZXR1cm4gRm9sZGVkVk9wOworICB9CisKKyAgLy8gZm9sZCAoeG9yIHVuZGVmLCB1bmRlZikgLT4gMC4gVGhpcyBpcyBhIGNvbW1vbiBpZGlvbSAobWlzdXNlKS4KKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYgJiYgTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgLy8gZm9sZCAoeG9yIHgsIHVuZGVmKSAtPiB1bmRlZgorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gTjA7CisgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgIHJldHVybiBOMTsKKyAgLy8gZm9sZCAoeG9yIGMxLCBjMikgLT4gYzFeYzIKKyAgaWYgKE4wQyAmJiBOMUMpCisgICAgcmV0dXJuIERBRy5Gb2xkQ29uc3RhbnRBcml0aG1ldGljKElTRDo6WE9SLCBWVCwgTjBDLCBOMUMpOworICAvLyBjYW5vbmljYWxpemUgY29uc3RhbnQgdG8gUkhTCisgIGlmIChOMEMgJiYgIU4xQykKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpYT1IsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMSwgTjApOworICAvLyBmb2xkICh4b3IgeCwgMCkgLT4geAorICBpZiAoTjFDICYmIE4xQy0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gTjA7CisgIC8vIHJlYXNzb2NpYXRlIHhvcgorICBTRFZhbHVlIFJYT1IgPSBSZWFzc29jaWF0ZU9wcyhJU0Q6OlhPUiwgTi0+Z2V0RGVidWdMb2MoKSwgTjAsIE4xKTsKKyAgaWYgKFJYT1IuZ2V0Tm9kZSgpICE9IDApCisgICAgcmV0dXJuIFJYT1I7CisKKyAgLy8gZm9sZCAhKHggY2MgeSkgLT4gKHggIWNjIHkpCisgIGlmIChOMUMgJiYgTjFDLT5nZXRBUEludFZhbHVlKCkgPT0gMSAmJiBpc1NldENDRXF1aXZhbGVudChOMCwgTEhTLCBSSFMsIENDKSkgeworICAgIGJvb2wgaXNJbnQgPSBMSFMuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCk7CisgICAgSVNEOjpDb25kQ29kZSBOb3RDQyA9IElTRDo6Z2V0U2V0Q0NJbnZlcnNlKGNhc3Q8Q29uZENvZGVTRE5vZGU+KENDKS0+Z2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW50KTsKKworICAgIGlmICghTGVnYWxPcGVyYXRpb25zIHx8IFRMSS5pc0NvbmRDb2RlTGVnYWwoTm90Q0MsIExIUy5nZXRWYWx1ZVR5cGUoKSkpIHsKKyAgICAgIHN3aXRjaCAoTjAuZ2V0T3Bjb2RlKCkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBTZXRDQyBFcXVpdmFsZW50ISIpOworICAgICAgY2FzZSBJU0Q6OlNFVENDOgorICAgICAgICByZXR1cm4gREFHLmdldFNldENDKE4tPmdldERlYnVnTG9jKCksIFZULCBMSFMsIFJIUywgTm90Q0MpOworICAgICAgY2FzZSBJU0Q6OlNFTEVDVF9DQzoKKyAgICAgICAgcmV0dXJuIERBRy5nZXRTZWxlY3RDQyhOLT5nZXREZWJ1Z0xvYygpLCBMSFMsIFJIUywgTjAuZ2V0T3BlcmFuZCgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDMpLCBOb3RDQyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gZm9sZCAobm90ICh6ZXh0IChzZXRjYyB4LCB5KSkpIC0+ICh6ZXh0IChub3QgKHNldGNjIHgsIHkpKSkKKyAgaWYgKE4xQyAmJiBOMUMtPmdldEFQSW50VmFsdWUoKSA9PSAxICYmIE4wLmdldE9wY29kZSgpID09IElTRDo6WkVST19FWFRFTkQgJiYKKyAgICAgIE4wLmdldE5vZGUoKS0+aGFzT25lVXNlKCkgJiYKKyAgICAgIGlzU2V0Q0NFcXVpdmFsZW50KE4wLmdldE9wZXJhbmQoMCksIExIUywgUkhTLCBDQykpeworICAgIFNEVmFsdWUgViA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgViA9IERBRy5nZXROb2RlKElTRDo6WE9SLCBOMC5nZXREZWJ1Z0xvYygpLCBWLmdldFZhbHVlVHlwZSgpLCBWLAorICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgVi5nZXRWYWx1ZVR5cGUoKSkpOworICAgIEFkZFRvV29ya0xpc3QoVi5nZXROb2RlKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgVik7CisgIH0KKworICAvLyBmb2xkIChub3QgKG9yIHgsIHkpKSAtPiAoYW5kIChub3QgeCksIChub3QgeSkpIGlmZiB4IG9yIHkgYXJlIHNldGNjCisgIGlmIChOMUMgJiYgTjFDLT5nZXRBUEludFZhbHVlKCkgPT0gMSAmJiBWVCA9PSBNVlQ6OmkxICYmCisgICAgICAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpPUiB8fCBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCkpIHsKKyAgICBTRFZhbHVlIExIUyA9IE4wLmdldE9wZXJhbmQoMCksIFJIUyA9IE4wLmdldE9wZXJhbmQoMSk7CisgICAgaWYgKGlzT25lVXNlU2V0Q0MoUkhTKSB8fCBpc09uZVVzZVNldENDKExIUykpIHsKKyAgICAgIHVuc2lnbmVkIE5ld09wY29kZSA9IE4wLmdldE9wY29kZSgpID09IElTRDo6QU5EID8gSVNEOjpPUiA6IElTRDo6QU5EOworICAgICAgTEhTID0gREFHLmdldE5vZGUoSVNEOjpYT1IsIExIUy5nZXREZWJ1Z0xvYygpLCBWVCwgTEhTLCBOMSk7IC8vIExIUyA9IH5MSFMKKyAgICAgIFJIUyA9IERBRy5nZXROb2RlKElTRDo6WE9SLCBSSFMuZ2V0RGVidWdMb2MoKSwgVlQsIFJIUywgTjEpOyAvLyBSSFMgPSB+UkhTCisgICAgICBBZGRUb1dvcmtMaXN0KExIUy5nZXROb2RlKCkpOyBBZGRUb1dvcmtMaXN0KFJIUy5nZXROb2RlKCkpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKE5ld09wY29kZSwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIExIUywgUkhTKTsKKyAgICB9CisgIH0KKyAgLy8gZm9sZCAobm90IChvciB4LCB5KSkgLT4gKGFuZCAobm90IHgpLCAobm90IHkpKSBpZmYgeCBvciB5IGFyZSBjb25zdGFudHMKKyAgaWYgKE4xQyAmJiBOMUMtPmlzQWxsT25lc1ZhbHVlKCkgJiYKKyAgICAgIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok9SIHx8IE4wLmdldE9wY29kZSgpID09IElTRDo6QU5EKSkgeworICAgIFNEVmFsdWUgTEhTID0gTjAuZ2V0T3BlcmFuZCgwKSwgUkhTID0gTjAuZ2V0T3BlcmFuZCgxKTsKKyAgICBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihSSFMpIHx8IGlzYTxDb25zdGFudFNETm9kZT4oTEhTKSkgeworICAgICAgdW5zaWduZWQgTmV3T3Bjb2RlID0gTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTkQgPyBJU0Q6Ok9SIDogSVNEOjpBTkQ7CisgICAgICBMSFMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgTEhTLmdldERlYnVnTG9jKCksIFZULCBMSFMsIE4xKTsgLy8gTEhTID0gfkxIUworICAgICAgUkhTID0gREFHLmdldE5vZGUoSVNEOjpYT1IsIFJIUy5nZXREZWJ1Z0xvYygpLCBWVCwgUkhTLCBOMSk7IC8vIFJIUyA9IH5SSFMKKyAgICAgIEFkZFRvV29ya0xpc3QoTEhTLmdldE5vZGUoKSk7IEFkZFRvV29ya0xpc3QoUkhTLmdldE5vZGUoKSk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoTmV3T3Bjb2RlLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTEhTLCBSSFMpOworICAgIH0KKyAgfQorICAvLyBmb2xkICh4b3IgKHhvciB4LCBjMSksIGMyKSAtPiAoeG9yIHgsICh4b3IgYzEsIGMyKSkKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlhPUikgeworICAgIENvbnN0YW50U0ROb2RlICpOMDBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMCkpOworICAgIENvbnN0YW50U0ROb2RlICpOMDFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpOworICAgIGlmIChOMDBDKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6WE9SLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTjFDLT5nZXRBUEludFZhbHVlKCkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMDBDLT5nZXRBUEludFZhbHVlKCksIFZUKSk7CisgICAgaWYgKE4wMUMpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpYT1IsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOMUMtPmdldEFQSW50VmFsdWUoKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wMUMtPmdldEFQSW50VmFsdWUoKSwgVlQpKTsKKyAgfQorICAvLyBmb2xkICh4b3IgeCwgeCkgLT4gMAorICBpZiAoTjAgPT0gTjEpIHsKKyAgICBpZiAoIVZULmlzVmVjdG9yKCkpIHsKKyAgICAgIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpOworICAgIH0gZWxzZSBpZiAoIUxlZ2FsT3BlcmF0aW9ucyB8fCBUTEkuaXNPcGVyYXRpb25MZWdhbChJU0Q6OkJVSUxEX1ZFQ1RPUiwgVlQpKXsKKyAgICAgIC8vIFByb2R1Y2UgYSB2ZWN0b3Igb2YgemVyb3MuCisgICAgICBTRFZhbHVlIEVsID0gREFHLmdldENvbnN0YW50KDAsIFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkpOworICAgICAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gT3BzKFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCksIEVsKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgICAgfQorICB9CisKKyAgLy8gU2ltcGxpZnk6IHhvciAob3AgeC4uLiksIChvcCB5Li4uKSAgLT4gKG9wICh4b3IgeCwgeSkpCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBOMS5nZXRPcGNvZGUoKSkgeworICAgIFNEVmFsdWUgVG1wID0gU2ltcGxpZnlCaW5PcFdpdGhTYW1lT3Bjb2RlSGFuZHMoTik7CisgICAgaWYgKFRtcC5nZXROb2RlKCkpIHJldHVybiBUbXA7CisgIH0KKworICAvLyBTaW1wbGlmeSB0aGUgZXhwcmVzc2lvbiB1c2luZyBub24tbG9jYWwga25vd2xlZGdlLgorICBpZiAoIVZULmlzVmVjdG9yKCkgJiYKKyAgICAgIFNpbXBsaWZ5RGVtYW5kZWRCaXRzKFNEVmFsdWUoTiwgMCkpKQorICAgIHJldHVybiBTRFZhbHVlKE4sIDApOworCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyB2aXNpdFNoaWZ0QnlDb25zdGFudCAtIEhhbmRsZSB0cmFuc2Zvcm1zIGNvbW1vbiB0byB0aGUgdGhyZWUgc2hpZnRzLCB3aGVuCisvLy8gdGhlIHNoaWZ0IGFtb3VudCBpcyBhIGNvbnN0YW50LgorU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRTaGlmdEJ5Q29uc3RhbnQoU0ROb2RlICpOLCB1bnNpZ25lZCBBbXQpIHsKKyAgU0ROb2RlICpMSFMgPSBOLT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKTsKKyAgaWYgKCFMSFMtPmhhc09uZVVzZSgpKSByZXR1cm4gU0RWYWx1ZSgpOworCisgIC8vIFdlIHdhbnQgdG8gcHVsbCBzb21lIGJpbm9wcyB0aHJvdWdoIHNoaWZ0cywgc28gdGhhdCB3ZSBoYXZlIChhbmQgKHNoaWZ0KSkKKyAgLy8gaW5zdGVhZCBvZiAoc2hpZnQgKGFuZCkpLCBsaWtld2lzZSBmb3IgYWRkLCBvciwgeG9yLCBldGMuICBUaGlzIHNvcnQgb2YKKyAgLy8gdGhpbmcgaGFwcGVucyB3aXRoIGFkZHJlc3MgY2FsY3VsYXRpb25zLCBzbyBpdCdzIGltcG9ydGFudCB0byBjYW5vbmljYWxpemUKKyAgLy8gaXQuCisgIGJvb2wgSGlnaEJpdFNldCA9IGZhbHNlOyAgLy8gQ2FuIHdlIHRyYW5zZm9ybSB0aGlzIGlmIHRoZSBoaWdoIGJpdCBpcyBzZXQ/CisKKyAgc3dpdGNoIChMSFMtPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IHJldHVybiBTRFZhbHVlKCk7CisgIGNhc2UgSVNEOjpPUjoKKyAgY2FzZSBJU0Q6OlhPUjoKKyAgICBIaWdoQml0U2V0ID0gZmFsc2U7IC8vIFdlIGNhbiBvbmx5IHRyYW5zZm9ybSBzcmEgaWYgdGhlIGhpZ2ggYml0IGlzIGNsZWFyLgorICAgIGJyZWFrOworICBjYXNlIElTRDo6QU5EOgorICAgIEhpZ2hCaXRTZXQgPSB0cnVlOyAgLy8gV2UgY2FuIG9ubHkgdHJhbnNmb3JtIHNyYSBpZiB0aGUgaGlnaCBiaXQgaXMgc2V0LgorICAgIGJyZWFrOworICBjYXNlIElTRDo6QUREOgorICAgIGlmIChOLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNITCkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7IC8vIG9ubHkgc2hsKGFkZCkgbm90IHNyW2FsXShhZGQpLgorICAgIEhpZ2hCaXRTZXQgPSBmYWxzZTsgLy8gV2UgY2FuIG9ubHkgdHJhbnNmb3JtIHNyYSBpZiB0aGUgaGlnaCBiaXQgaXMgY2xlYXIuCisgICAgYnJlYWs7CisgIH0KKworICAvLyBXZSByZXF1aXJlIHRoZSBSSFMgb2YgdGhlIGJpbm9wIHRvIGJlIGEgY29uc3RhbnQgYXMgd2VsbC4KKyAgQ29uc3RhbnRTRE5vZGUgKkJpbk9wQ3N0ID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KExIUy0+Z2V0T3BlcmFuZCgxKSk7CisgIGlmICghQmluT3BDc3QpIHJldHVybiBTRFZhbHVlKCk7CisKKyAgLy8gRklYTUU6IGRpc2FibGUgdGhpcyB1bmxlc3MgdGhlIGlucHV0IHRvIHRoZSBiaW5vcCBpcyBhIHNoaWZ0IGJ5IGEgY29uc3RhbnQuCisgIC8vIElmIGl0IGlzIG5vdCBhIHNoaWZ0LCBpdCBwZXNzaW1pemVzIHNvbWUgY29tbW9uIGNhc2VzIGxpa2U6CisgIC8vCisgIC8vICAgIHZvaWQgZm9vKGludCAqWCwgaW50IGkpIHsgWFtpICYgMTIzNV0gPSAxOyB9CisgIC8vICAgIGludCBiYXIoaW50ICpYLCBpbnQgaSkgeyByZXR1cm4gWFtpICYgMjU1XTsgfQorICBTRE5vZGUgKkJpbk9wTEhTVmFsID0gTEhTLT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKTsKKyAgaWYgKChCaW5PcExIU1ZhbC0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpTSEwgJiYKKyAgICAgICBCaW5PcExIU1ZhbC0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpTUkEgJiYKKyAgICAgICBCaW5PcExIU1ZhbC0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpTUkwpIHx8CisgICAgICAhaXNhPENvbnN0YW50U0ROb2RlPihCaW5PcExIU1ZhbC0+Z2V0T3BlcmFuZCgxKSkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIHNpZ25lZCBzaGlmdCByaWdodCwgYW5kIHRoZSBoaWdoIGJpdCBpcyBtb2RpZmllZCBieSB0aGUKKyAgLy8gbG9naWNhbCBvcGVyYXRpb24sIGRvIG5vdCBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbi4gVGhlIGhpZ2hCaXRTZXQKKyAgLy8gYm9vbGVhbiBpbmRpY2F0ZXMgdGhlIHZhbHVlIG9mIHRoZSBoaWdoIGJpdCBvZiB0aGUgY29uc3RhbnQgd2hpY2ggd291bGQKKyAgLy8gY2F1c2UgaXQgdG8gYmUgbW9kaWZpZWQgZm9yIHRoaXMgb3BlcmF0aW9uLgorICBpZiAoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkEpIHsKKyAgICBib29sIEJpbk9wUkhTU2lnblNldCA9IEJpbk9wQ3N0LT5nZXRBUEludFZhbHVlKCkuaXNOZWdhdGl2ZSgpOworICAgIGlmIChCaW5PcFJIU1NpZ25TZXQgIT0gSGlnaEJpdFNldCkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICAvLyBGb2xkIHRoZSBjb25zdGFudHMsIHNoaWZ0aW5nIHRoZSBiaW5vcCBSSFMgYnkgdGhlIHNoaWZ0IGFtb3VudC4KKyAgU0RWYWx1ZSBOZXdSSFMgPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgTEhTLT5nZXRPcGVyYW5kKDEpLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIUy0+Z2V0T3BlcmFuZCgxKSwgTi0+Z2V0T3BlcmFuZCgxKSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBuZXcgc2hpZnQuCisgIFNEVmFsdWUgTmV3U2hpZnQgPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgTEhTLT5nZXRPcGVyYW5kKDApLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVCwgTEhTLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpKTsKKworICAvLyBDcmVhdGUgdGhlIG5ldyBiaW5vcC4KKyAgcmV0dXJuIERBRy5nZXROb2RlKExIUy0+Z2V0T3Bjb2RlKCksIE4tPmdldERlYnVnTG9jKCksIFZULCBOZXdTaGlmdCwgTmV3UkhTKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRTSEwoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIE4xID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4wQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMCk7CisgIENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEpOworICBFVlQgVlQgPSBOMC5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgT3BTaXplSW5CaXRzID0gVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKworICAvLyBmb2xkIChzaGwgYzEsIGMyKSAtPiBjMTw8YzIKKyAgaWYgKE4wQyAmJiBOMUMpCisgICAgcmV0dXJuIERBRy5Gb2xkQ29uc3RhbnRBcml0aG1ldGljKElTRDo6U0hMLCBWVCwgTjBDLCBOMUMpOworICAvLyBmb2xkIChzaGwgMCwgeCkgLT4gMAorICBpZiAoTjBDICYmIE4wQy0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gTjA7CisgIC8vIGZvbGQgKHNobCB4LCBjID49IHNpemUoeCkpIC0+IHVuZGVmCisgIGlmIChOMUMgJiYgTjFDLT5nZXRaRXh0VmFsdWUoKSA+PSBPcFNpemVJbkJpdHMpCisgICAgcmV0dXJuIERBRy5nZXRVTkRFRihWVCk7CisgIC8vIGZvbGQgKHNobCB4LCAwKSAtPiB4CisgIGlmIChOMUMgJiYgTjFDLT5pc051bGxWYWx1ZSgpKQorICAgIHJldHVybiBOMDsKKyAgLy8gaWYgKHNobCB4LCBjKSBpcyBrbm93biB0byBiZSB6ZXJvLCByZXR1cm4gMAorICBpZiAoREFHLk1hc2tlZFZhbHVlSXNaZXJvKFNEVmFsdWUoTiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShPcFNpemVJbkJpdHMpKSkKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgLy8gZm9sZCAoc2hsIHgsICh0cnVuYyAoYW5kIHksIGMpKSkgLT4gKHNobCB4LCAoYW5kICh0cnVuYyB5KSwgKHRydW5jIGMpKSkuCisgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFICYmCisgICAgICBOMS5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6QU5EICYmCisgICAgICBOMS5oYXNPbmVVc2UoKSAmJiBOMS5nZXRPcGVyYW5kKDApLmhhc09uZVVzZSgpKSB7CisgICAgU0RWYWx1ZSBOMTAxID0gTjEuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDEpOworICAgIGlmIChDb25zdGFudFNETm9kZSAqTjEwMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEwMSkpIHsKKyAgICAgIEVWVCBUcnVuY1ZUID0gTjEuZ2V0VmFsdWVUeXBlKCk7CisgICAgICBTRFZhbHVlIE4xMDAgPSBOMS5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCk7CisgICAgICBBUEludCBUcnVuY0MgPSBOMTAxQy0+Z2V0QVBJbnRWYWx1ZSgpOworICAgICAgVHJ1bmNDLnRydW5jKFRydW5jVlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBUcnVuY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVuY1ZULCBOMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoVHJ1bmNDLCBUcnVuY1ZUKSkpOworICAgIH0KKyAgfQorCisgIGlmIChOMUMgJiYgU2ltcGxpZnlEZW1hbmRlZEJpdHMoU0RWYWx1ZShOLCAwKSkpCisgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7CisKKyAgLy8gZm9sZCAoc2hsIChzaGwgeCwgYzEpLCBjMikgLT4gMCBvciAoc2hsIHgsIChhZGQgYzEsIGMyKSkKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCAmJgorICAgICAgTjAuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50KSB7CisgICAgdWludDY0X3QgYzEgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgdWludDY0X3QgYzIgPSBOMUMtPmdldFpFeHRWYWx1ZSgpOworICAgIGlmIChjMSArIGMyID4gT3BTaXplSW5CaXRzKQorICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudCgwLCBWVCk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0hMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KGMxICsgYzIsIE4xLmdldFZhbHVlVHlwZSgpKSk7CisgIH0KKyAgLy8gZm9sZCAoc2hsIChzcmwgeCwgYzEpLCBjMikgLT4gKHNobCAoYW5kIHgsIChzaGwgLTEsIGMxKSksIChzdWIgYzIsIGMxKSkgb3IKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNybCAoYW5kIHgsIChzaGwgLTEsIGMxKSksIChzdWIgYzEsIGMyKSkKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSTCAmJgorICAgICAgTjAuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50KSB7CisgICAgdWludDY0X3QgYzEgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKGMxIDwgVlQuZ2V0U2l6ZUluQml0cygpKSB7CisgICAgICB1aW50NjRfdCBjMiA9IE4xQy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBTRFZhbHVlIEhpQml0c01hc2sgPQorICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KFZULmdldFNpemVJbkJpdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVC5nZXRTaXplSW5CaXRzKCkgLSBjMSksCisgICAgICAgICAgICAgICAgICAgICAgICBWVCk7CisgICAgICBTRFZhbHVlIE1hc2sgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgTjAuZ2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlCaXRzTWFzayk7CisgICAgICBpZiAoYzIgPiBjMSkKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0hMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChjMi1jMSwgTjEuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1JMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChjMS1jMiwgTjEuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgICB9CisgIH0KKyAgLy8gZm9sZCAoc2hsIChzcmEgeCwgYzEpLCBjMSkgLT4gKGFuZCB4LCAoc2hsIC0xLCBjMSkpCisgIGlmIChOMUMgJiYgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkEgJiYgTjEgPT0gTjAuZ2V0T3BlcmFuZCgxKSkgeworICAgIFNEVmFsdWUgSGlCaXRzTWFzayA9CisgICAgICBEQUcuZ2V0Q29uc3RhbnQoQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KFZULmdldFNpemVJbkJpdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlQuZ2V0U2l6ZUluQml0cygpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMUMtPmdldFpFeHRWYWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBWVCk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgSGlCaXRzTWFzayk7CisgIH0KKworICBpZiAoTjFDKSB7CisgICAgU0RWYWx1ZSBOZXdTSEwgPSB2aXNpdFNoaWZ0QnlDb25zdGFudChOLCBOMUMtPmdldFpFeHRWYWx1ZSgpKTsKKyAgICBpZiAoTmV3U0hMLmdldE5vZGUoKSkKKyAgICAgIHJldHVybiBOZXdTSEw7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFNSQShTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBDb25zdGFudFNETm9kZSAqTjBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMSk7CisgIEVWVCBWVCA9IE4wLmdldFZhbHVlVHlwZSgpOworICB1bnNpZ25lZCBPcFNpemVJbkJpdHMgPSBWVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworCisgIC8vIGZvbGQgKHNyYSBjMSwgYzIpIC0+IChzcmEgYzEsIGMyKQorICBpZiAoTjBDICYmIE4xQykKKyAgICByZXR1cm4gREFHLkZvbGRDb25zdGFudEFyaXRobWV0aWMoSVNEOjpTUkEsIFZULCBOMEMsIE4xQyk7CisgIC8vIGZvbGQgKHNyYSAwLCB4KSAtPiAwCisgIGlmIChOMEMgJiYgTjBDLT5pc051bGxWYWx1ZSgpKQorICAgIHJldHVybiBOMDsKKyAgLy8gZm9sZCAoc3JhIC0xLCB4KSAtPiAtMQorICBpZiAoTjBDICYmIE4wQy0+aXNBbGxPbmVzVmFsdWUoKSkKKyAgICByZXR1cm4gTjA7CisgIC8vIGZvbGQgKHNyYSB4LCAoc2V0Z2UgYywgc2l6ZSh4KSkpIC0+IHVuZGVmCisgIGlmIChOMUMgJiYgTjFDLT5nZXRaRXh0VmFsdWUoKSA+PSBPcFNpemVJbkJpdHMpCisgICAgcmV0dXJuIERBRy5nZXRVTkRFRihWVCk7CisgIC8vIGZvbGQgKHNyYSB4LCAwKSAtPiB4CisgIGlmIChOMUMgJiYgTjFDLT5pc051bGxWYWx1ZSgpKQorICAgIHJldHVybiBOMDsKKyAgLy8gZm9sZCAoc3JhIChzaGwgeCwgYzEpLCBjMSkgLT4gc2V4dF9pbnJlZyBmb3Igc29tZSBjMSBhbmQgdGFyZ2V0IHN1cHBvcnRzCisgIC8vIHNleHRfaW5yZWcuCisgIGlmIChOMUMgJiYgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSEwgJiYgTjEgPT0gTjAuZ2V0T3BlcmFuZCgxKSkgeworICAgIHVuc2lnbmVkIExvd0JpdHMgPSBPcFNpemVJbkJpdHMgLSAodW5zaWduZWQpTjFDLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBFVlQgRXh0VlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgTG93Qml0cyk7CisgICAgaWYgKFZULmlzVmVjdG9yKCkpCisgICAgICBFeHRWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VlQsIFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICAgIGlmICgoIUxlZ2FsT3BlcmF0aW9ucyB8fAorICAgICAgICAgVExJLmlzT3BlcmF0aW9uTGVnYWwoSVNEOjpTSUdOX0VYVEVORF9JTlJFRywgRXh0VlQpKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLCBEQUcuZ2V0VmFsdWVUeXBlKEV4dFZUKSk7CisgIH0KKworICAvLyBmb2xkIChzcmEgKHNyYSB4LCBjMSksIGMyKSAtPiAoc3JhIHgsIChhZGQgYzEsIGMyKSkKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSQSkgeworICAgIGlmIChDb25zdGFudFNETm9kZSAqQzEgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHVuc2lnbmVkIFN1bSA9IE4xQy0+Z2V0WkV4dFZhbHVlKCkgKyBDMS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBpZiAoU3VtID49IE9wU2l6ZUluQml0cykgU3VtID0gT3BTaXplSW5CaXRzLTE7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTUkEsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChTdW0sIE4xQy0+Z2V0VmFsdWVUeXBlKDApKSk7CisgICAgfQorICB9CisKKyAgLy8gZm9sZCAoc3JhIChzaGwgWCwgbSksIChzdWIgcmVzdWx0X3NpemUsIG4pKQorICAvLyAtPiAoc2lnbl9leHRlbmQgKHRydW5jIChzaGwgWCwgKHN1YiAoc3ViIHJlc3VsdF9zaXplLCBuKSwgbSkpKSkgZm9yCisgIC8vIHJlc3VsdF9zaXplIC0gbiAhPSBtLgorICAvLyBJZiB0cnVuY2F0ZSBpcyBmcmVlIGZvciB0aGUgdGFyZ2V0IHNleHQoc2hsKSBpcyBsaWtlbHkgdG8gcmVzdWx0IGluIGJldHRlcgorICAvLyBjb2RlLgorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSEwpIHsKKyAgICAvLyBHZXQgdGhlIHR3byBjb25zdGFuc3Qgb2YgdGhlIHNoaWZ0cywgQ04wID0gbSwgQ04gPSBuLgorICAgIGNvbnN0IENvbnN0YW50U0ROb2RlICpOMDFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpOworICAgIGlmIChOMDFDICYmIE4xQykgeworICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQgdGhlIHRydW5jYXRlJ3MgcmVzdWx0IGJpdHNpemUgYW5kIHR5cGUgd291bGQgYmUuCisgICAgICBFVlQgVHJ1bmNWVCA9CisgICAgICAgIEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBPcFNpemVJbkJpdHMgLSBOMUMtPmdldFpFeHRWYWx1ZSgpKTsKKyAgICAgIC8vIERldGVybWluZSB0aGUgcmVzaWR1YWwgcmlnaHQtc2hpZnQgYW1vdW50LgorICAgICAgc2lnbmVkIFNoaWZ0QW10ID0gTjFDLT5nZXRaRXh0VmFsdWUoKSAtIE4wMUMtPmdldFpFeHRWYWx1ZSgpOworCisgICAgICAvLyBJZiB0aGUgc2hpZnQgaXMgbm90IGEgbm8tb3AgKGluIHdoaWNoIGNhc2UgdGhpcyBzaG91bGQgYmUganVzdCBhIHNpZ24KKyAgICAgIC8vIGV4dGVuZCBhbHJlYWR5KSwgdGhlIHRydW5jYXRlZCB0byB0eXBlIGlzIGxlZ2FsLCBzaWduX2V4dGVuZCBpcyBsZWdhbAorICAgICAgLy8gb24gdGhhdCB0eXBlLCBhbmQgdGhlIHRydW5jYXRlIHRvIHRoYXQgdHlwZSBpcyBib3RoIGxlZ2FsIGFuZCBmcmVlLAorICAgICAgLy8gcGVyZm9ybSB0aGUgdHJhbnNmb3JtLgorICAgICAgaWYgKChTaGlmdEFtdCA+IDApICYmCisgICAgICAgICAgVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OlNJR05fRVhURU5ELCBUcnVuY1ZUKSAmJgorICAgICAgICAgIFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpUUlVOQ0FURSwgVlQpICYmCisgICAgICAgICAgVExJLmlzVHJ1bmNhdGVGcmVlKFZULCBUcnVuY1ZUKSkgeworCisgICAgICAgICAgU0RWYWx1ZSBBbXQgPSBEQUcuZ2V0Q29uc3RhbnQoU2hpZnRBbXQsIGdldFNoaWZ0QW1vdW50VHkoKSk7CisgICAgICAgICAgU0RWYWx1ZSBTaGlmdCA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBOMC5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKSwgQW10KTsKKyAgICAgICAgICBTRFZhbHVlIFRydW5jID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgTjAuZ2V0RGVidWdMb2MoKSwgVHJ1bmNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hpZnQpOworICAgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRWYWx1ZVR5cGUoMCksIFRydW5jKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBmb2xkIChzcmEgeCwgKHRydW5jIChhbmQgeSwgYykpKSAtPiAoc3JhIHgsIChhbmQgKHRydW5jIHkpLCAodHJ1bmMgYykpKS4KKyAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUgJiYKKyAgICAgIE4xLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTkQgJiYKKyAgICAgIE4xLmhhc09uZVVzZSgpICYmIE4xLmdldE9wZXJhbmQoMCkuaGFzT25lVXNlKCkpIHsKKyAgICBTRFZhbHVlIE4xMDEgPSBOMS5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMSk7CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpOMTAxQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMTAxKSkgeworICAgICAgRVZUIFRydW5jVlQgPSBOMS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgIFNEVmFsdWUgTjEwMCA9IE4xLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKTsKKyAgICAgIEFQSW50IFRydW5jQyA9IE4xMDFDLT5nZXRBUEludFZhbHVlKCk7CisgICAgICBUcnVuY0MudHJ1bmMoVHJ1bmNWVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNSQSwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QU5ELCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydW5jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydW5jVlQsIE4xMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChUcnVuY0MsIFRydW5jVlQpKSk7CisgICAgfQorICB9CisKKyAgLy8gU2ltcGxpZnksIGJhc2VkIG9uIGJpdHMgc2hpZnRlZCBvdXQgb2YgdGhlIExIUy4KKyAgaWYgKE4xQyAmJiBTaW1wbGlmeURlbWFuZGVkQml0cyhTRFZhbHVlKE4sIDApKSkKKyAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKKworCisgIC8vIElmIHRoZSBzaWduIGJpdCBpcyBrbm93biB0byBiZSB6ZXJvLCBzd2l0Y2ggdGhpcyB0byBhIFNSTC4KKyAgaWYgKERBRy5TaWduQml0SXNaZXJvKE4wKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTUkwsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwgTjEpOworCisgIGlmIChOMUMpIHsKKyAgICBTRFZhbHVlIE5ld1NSQSA9IHZpc2l0U2hpZnRCeUNvbnN0YW50KE4sIE4xQy0+Z2V0WkV4dFZhbHVlKCkpOworICAgIGlmIChOZXdTUkEuZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIE5ld1NSQTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0U1JMKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIENvbnN0YW50U0ROb2RlICpOMEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjApOworICBDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xKTsKKyAgRVZUIFZUID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisgIHVuc2lnbmVkIE9wU2l6ZUluQml0cyA9IFZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisKKyAgLy8gZm9sZCAoc3JsIGMxLCBjMikgLT4gYzEgPj51IGMyCisgIGlmIChOMEMgJiYgTjFDKQorICAgIHJldHVybiBEQUcuRm9sZENvbnN0YW50QXJpdGhtZXRpYyhJU0Q6OlNSTCwgVlQsIE4wQywgTjFDKTsKKyAgLy8gZm9sZCAoc3JsIDAsIHgpIC0+IDAKKyAgaWYgKE4wQyAmJiBOMEMtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIE4wOworICAvLyBmb2xkIChzcmwgeCwgYyA+PSBzaXplKHgpKSAtPiB1bmRlZgorICBpZiAoTjFDICYmIE4xQy0+Z2V0WkV4dFZhbHVlKCkgPj0gT3BTaXplSW5CaXRzKQorICAgIHJldHVybiBEQUcuZ2V0VU5ERUYoVlQpOworICAvLyBmb2xkIChzcmwgeCwgMCkgLT4geAorICBpZiAoTjFDICYmIE4xQy0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gTjA7CisgIC8vIGlmIChzcmwgeCwgYykgaXMga25vd24gdG8gYmUgemVybywgcmV0dXJuIDAKKyAgaWYgKE4xQyAmJiBEQUcuTWFza2VkVmFsdWVJc1plcm8oU0RWYWx1ZShOLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShPcFNpemVJbkJpdHMpKSkKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKworICAvLyBmb2xkIChzcmwgKHNybCB4LCBjMSksIGMyKSAtPiAwIG9yIChzcmwgeCwgKGFkZCBjMSwgYzIpKQorICBpZiAoTjFDICYmIE4wLmdldE9wY29kZSgpID09IElTRDo6U1JMICYmCisgICAgICBOMC5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpIHsKKyAgICB1aW50NjRfdCBjMSA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICB1aW50NjRfdCBjMiA9IE4xQy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKGMxICsgYzIgPiBPcFNpemVJbkJpdHMpCisgICAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTUkwsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoYzEgKyBjMiwgTjEuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgfQorICAKKyAgLy8gZm9sZCAoc3JsIChzaGwgeCwgYyksIGMpIC0+IChhbmQgeCwgY3N0MikKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCAmJiBOMC5nZXRPcGVyYW5kKDEpID09IE4xICYmCisgICAgICBOMC5nZXRWYWx1ZVNpemVJbkJpdHMoKSA8PSA2NCkgeworICAgIHVpbnQ2NF90IFNoQW10ID0gTjFDLT5nZXRaRXh0VmFsdWUoKSs2NC1OMC5nZXRWYWx1ZVNpemVJbkJpdHMoKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTkQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQofjBVTEwgPj4gU2hBbXQsIFZUKSk7CisgIH0KKyAgCisKKyAgLy8gZm9sZCAoc3JsIChhbnlleHRlbmQgeCksIGMpIC0+IChhbnlleHRlbmQgKHNybCB4LCBjKSkKKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFOWV9FWFRFTkQpIHsKKyAgICAvLyBTaGlmdGluZyBpbiBhbGwgdW5kZWYgYml0cz8KKyAgICBFVlQgU21hbGxWVCA9IE4wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgICAgaWYgKE4xQy0+Z2V0WkV4dFZhbHVlKCkgPj0gU21hbGxWVC5nZXRTaXplSW5CaXRzKCkpCisgICAgICByZXR1cm4gREFHLmdldFVOREVGKFZUKTsKKworICAgIGlmICghTGVnYWxUeXBlcyB8fCBUTEkuaXNUeXBlRGVzaXJhYmxlRm9yT3AoSVNEOjpTUkwsIFNtYWxsVlQpKSB7CisgICAgICBTRFZhbHVlIFNtYWxsU2hpZnQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgTjAuZ2V0RGVidWdMb2MoKSwgU21hbGxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCksIE4xKTsKKyAgICAgIEFkZFRvV29ya0xpc3QoU21hbGxTaGlmdC5nZXROb2RlKCkpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIFNtYWxsU2hpZnQpOworICAgIH0KKyAgfQorCisgIC8vIGZvbGQgKHNybCAoc3JhIFgsIFkpLCAzMSkgLT4gKHNybCBYLCAzMSkuICBUaGlzIHNybCBvbmx5IGxvb2tzIGF0IHRoZSBzaWduCisgIC8vIGJpdCwgd2hpY2ggaXMgdW5tb2RpZmllZCBieSBzcmEuCisgIGlmIChOMUMgJiYgTjFDLT5nZXRaRXh0VmFsdWUoKSArIDEgPT0gVlQuZ2V0U2l6ZUluQml0cygpKSB7CisgICAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6U1JBKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1JMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSwgTjEpOworICB9CisKKyAgLy8gZm9sZCAoc3JsIChjdGx6IHgpLCAiNSIpIC0+IHggIGlmZiB4IGhhcyBvbmUgYml0IHNldCAodGhlIGxvdyBiaXQpLgorICBpZiAoTjFDICYmIE4wLmdldE9wY29kZSgpID09IElTRDo6Q1RMWiAmJgorICAgICAgTjFDLT5nZXRBUEludFZhbHVlKCkgPT0gTG9nMl8zMihWVC5nZXRTaXplSW5CaXRzKCkpKSB7CisgICAgQVBJbnQgS25vd25aZXJvLCBLbm93bk9uZTsKKyAgICBBUEludCBNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShWVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpKTsKKyAgICBEQUcuQ29tcHV0ZU1hc2tlZEJpdHMoTjAuZ2V0T3BlcmFuZCgwKSwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSk7CisKKyAgICAvLyBJZiBhbnkgb2YgdGhlIGlucHV0IGJpdHMgYXJlIEtub3duT25lLCB0aGVuIHRoZSBpbnB1dCBjb3VsZG4ndCBiZSBhbGwKKyAgICAvLyB6ZXJvcywgdGh1cyB0aGUgcmVzdWx0IG9mIHRoZSBzcmwgd2lsbCBhbHdheXMgYmUgemVyby4KKyAgICBpZiAoS25vd25PbmUuZ2V0Qm9vbFZhbHVlKCkpIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpOworCisgICAgLy8gSWYgYWxsIG9mIHRoZSBiaXRzIGlucHV0IHRoZSB0byBjdGx6IG5vZGUgYXJlIGtub3duIHRvIGJlIHplcm8sIHRoZW4KKyAgICAvLyB0aGUgcmVzdWx0IG9mIHRoZSBjdGx6IGlzICIzMiIgYW5kIHRoZSByZXN1bHQgb2YgdGhlIHNoaWZ0IGlzIG9uZS4KKyAgICBBUEludCBVbmtub3duQml0cyA9IH5Lbm93blplcm8gJiBNYXNrOworICAgIGlmIChVbmtub3duQml0cyA9PSAwKSByZXR1cm4gREFHLmdldENvbnN0YW50KDEsIFZUKTsKKworICAgIC8vIE90aGVyd2lzZSwgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIGJpdCBpbnB1dCB0byB0aGUgY3Rsei4KKyAgICBpZiAoKFVua25vd25CaXRzICYgKFVua25vd25CaXRzIC0gMSkpID09IDApIHsKKyAgICAgIC8vIE9rYXksIHdlIGtub3cgdGhhdCBvbmx5IHRoYXQgdGhlIHNpbmdsZSBiaXQgc3BlY2lmaWVkIGJ5IFVua25vd25CaXRzCisgICAgICAvLyBjb3VsZCBiZSBzZXQgb24gaW5wdXQgdG8gdGhlIENUTFogbm9kZS4gSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGUgU1JMCisgICAgICAvLyB3aWxsIHJldHVybiAwLCBpZiBpdCBpcyBjbGVhciwgaXQgcmV0dXJucyAxLiBDaGFuZ2UgdGhlIENUTFovU1JMIHBhaXIKKyAgICAgIC8vIHRvIGFuIFNSTC9YT1IgcGFpciwgd2hpY2ggaXMgbGlrZWx5IHRvIHNpbXBsaWZ5IG1vcmUuCisgICAgICB1bnNpZ25lZCBTaEFtdCA9IFVua25vd25CaXRzLmNvdW50VHJhaWxpbmdaZXJvcygpOworICAgICAgU0RWYWx1ZSBPcCA9IE4wLmdldE9wZXJhbmQoMCk7CisKKyAgICAgIGlmIChTaEFtdCkgeworICAgICAgICBPcCA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBOMC5nZXREZWJ1Z0xvYygpLCBWVCwgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFNoQW10LCBnZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgICAgICAgQWRkVG9Xb3JrTGlzdChPcC5nZXROb2RlKCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpYT1IsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wLCBEQUcuZ2V0Q29uc3RhbnQoMSwgVlQpKTsKKyAgICB9CisgIH0KKworICAvLyBmb2xkIChzcmwgeCwgKHRydW5jIChhbmQgeSwgYykpKSAtPiAoc3JsIHgsIChhbmQgKHRydW5jIHkpLCAodHJ1bmMgYykpKS4KKyAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUgJiYKKyAgICAgIE4xLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTkQgJiYKKyAgICAgIE4xLmhhc09uZVVzZSgpICYmIE4xLmdldE9wZXJhbmQoMCkuaGFzT25lVXNlKCkpIHsKKyAgICBTRFZhbHVlIE4xMDEgPSBOMS5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMSk7CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpOMTAxQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMTAxKSkgeworICAgICAgRVZUIFRydW5jVlQgPSBOMS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgIFNEVmFsdWUgTjEwMCA9IE4xLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKTsKKyAgICAgIEFQSW50IFRydW5jQyA9IE4xMDFDLT5nZXRBUEludFZhbHVlKCk7CisgICAgICBUcnVuY0MudHJ1bmMoVHJ1bmNWVC5nZXRTaXplSW5CaXRzKCkpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1JMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBTkQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1bmNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1bmNWVCwgTjEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFRydW5jQywgVHJ1bmNWVCkpKTsKKyAgICB9CisgIH0KKworICAvLyBmb2xkIG9wZXJhbmRzIG9mIHNybCBiYXNlZCBvbiBrbm93bGVkZ2UgdGhhdCB0aGUgbG93IGJpdHMgYXJlIG5vdAorICAvLyBkZW1hbmRlZC4KKyAgaWYgKE4xQyAmJiBTaW1wbGlmeURlbWFuZGVkQml0cyhTRFZhbHVlKE4sIDApKSkKKyAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKKworICBpZiAoTjFDKSB7CisgICAgU0RWYWx1ZSBOZXdTUkwgPSB2aXNpdFNoaWZ0QnlDb25zdGFudChOLCBOMUMtPmdldFpFeHRWYWx1ZSgpKTsKKyAgICBpZiAoTmV3U1JMLmdldE5vZGUoKSkKKyAgICAgIHJldHVybiBOZXdTUkw7CisgIH0KKworICAvLyBBdHRlbXB0IHRvIGNvbnZlcnQgYSBzcmwgb2YgYSBsb2FkIGludG8gYSBuYXJyb3dlciB6ZXJvLWV4dGVuZGluZyBsb2FkLgorICBTRFZhbHVlIE5hcnJvd0xvYWQgPSBSZWR1Y2VMb2FkV2lkdGgoTik7CisgIGlmIChOYXJyb3dMb2FkLmdldE5vZGUoKSkKKyAgICByZXR1cm4gTmFycm93TG9hZDsKKworICAvLyBIZXJlIGlzIGEgY29tbW9uIHNpdHVhdGlvbi4gV2Ugd2FudCB0byBvcHRpbWl6ZToKKyAgLy8KKyAgLy8gICAlYSA9IC4uLgorICAvLyAgICViID0gYW5kIGkzMiAlYSwgMgorICAvLyAgICVjID0gc3JsIGkzMiAlYiwgMQorICAvLyAgIGJyY29uZCBpMzIgJWMgLi4uCisgIC8vCisgIC8vIGludG8KKyAgLy8gCisgIC8vICAgJWEgPSAuLi4KKyAgLy8gICAlYiA9IGFuZCAlYSwgMgorICAvLyAgICVjID0gc2V0Y2MgZXEgJWIsIDAKKyAgLy8gICBicmNvbmQgJWMgLi4uCisgIC8vCisgIC8vIEhvd2V2ZXIgd2hlbiBhZnRlciB0aGUgc291cmNlIG9wZXJhbmQgb2YgU1JMIGlzIG9wdGltaXplZCBpbnRvIEFORCwgdGhlIFNSTAorICAvLyBpdHNlbGYgbWF5IG5vdCBiZSBvcHRpbWl6ZWQgZnVydGhlci4gTG9vayBmb3IgaXQgYW5kIGFkZCB0aGUgQlJDT05EIGludG8KKyAgLy8gdGhlIHdvcmtsaXN0LgorICBpZiAoTi0+aGFzT25lVXNlKCkpIHsKKyAgICBTRE5vZGUgKlVzZSA9ICpOLT51c2VfYmVnaW4oKTsKKyAgICBpZiAoVXNlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJSQ09ORCkKKyAgICAgIEFkZFRvV29ya0xpc3QoVXNlKTsKKyAgICBlbHNlIGlmIChVc2UtPmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUgJiYgVXNlLT5oYXNPbmVVc2UoKSkgeworICAgICAgLy8gQWxzbyBsb29rIHBhc3MgdGhlIHRydW5jYXRlLgorICAgICAgVXNlID0gKlVzZS0+dXNlX2JlZ2luKCk7CisgICAgICBpZiAoVXNlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJSQ09ORCkKKyAgICAgICAgQWRkVG9Xb3JrTGlzdChVc2UpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0Q1RMWihTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICAvLyBmb2xkIChjdGx6IGMxKSAtPiBjMgorICBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihOMCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Q1RMWiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wKTsKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRDVFRaKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIC8vIGZvbGQgKGN0dHogYzEpIC0+IGMyCisgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE4wKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpDVFRaLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjApOworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdENUUE9QKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIC8vIGZvbGQgKGN0cG9wIGMxKSAtPiBjMgorICBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihOMCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Q1RQT1AsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCk7CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0U0VMRUNUKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgTjIgPSBOLT5nZXRPcGVyYW5kKDIpOworICBDb25zdGFudFNETm9kZSAqTjBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMSk7CisgIENvbnN0YW50U0ROb2RlICpOMkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjIpOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBWVDAgPSBOMC5nZXRWYWx1ZVR5cGUoKTsKKworICAvLyBmb2xkIChzZWxlY3QgQywgWCwgWCkgLT4gWAorICBpZiAoTjEgPT0gTjIpCisgICAgcmV0dXJuIE4xOworICAvLyBmb2xkIChzZWxlY3QgdHJ1ZSwgWCwgWSkgLT4gWAorICBpZiAoTjBDICYmICFOMEMtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIE4xOworICAvLyBmb2xkIChzZWxlY3QgZmFsc2UsIFgsIFkpIC0+IFkKKyAgaWYgKE4wQyAmJiBOMEMtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIE4yOworICAvLyBmb2xkIChzZWxlY3QgQywgMSwgWCkgLT4gKG9yIEMsIFgpCisgIGlmIChWVCA9PSBNVlQ6OmkxICYmIE4xQyAmJiBOMUMtPmdldEFQSW50VmFsdWUoKSA9PSAxKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE4yKTsKKyAgLy8gZm9sZCAoc2VsZWN0IEMsIDAsIDEpIC0+ICh4b3IgQywgMSkKKyAgaWYgKFZULmlzSW50ZWdlcigpICYmCisgICAgICAoVlQwID09IE1WVDo6aTEgfHwKKyAgICAgICAoVlQwLmlzSW50ZWdlcigpICYmCisgICAgICAgIFRMSS5nZXRCb29sZWFuQ29udGVudHMoKSA9PSBUYXJnZXRMb3dlcmluZzo6WmVyb09yT25lQm9vbGVhbkNvbnRlbnQpKSAmJgorICAgICAgTjFDICYmIE4yQyAmJiBOMUMtPmlzTnVsbFZhbHVlKCkgJiYgTjJDLT5nZXRBUEludFZhbHVlKCkgPT0gMSkgeworICAgIFNEVmFsdWUgWE9STm9kZTsKKyAgICBpZiAoVlQgPT0gVlQwKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6WE9SLCBOLT5nZXREZWJ1Z0xvYygpLCBWVDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgTjAsIERBRy5nZXRDb25zdGFudCgxLCBWVDApKTsKKyAgICBYT1JOb2RlID0gREFHLmdldE5vZGUoSVNEOjpYT1IsIE4wLmdldERlYnVnTG9jKCksIFZUMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTjAsIERBRy5nZXRDb25zdGFudCgxLCBWVDApKTsKKyAgICBBZGRUb1dvcmtMaXN0KFhPUk5vZGUuZ2V0Tm9kZSgpKTsKKyAgICBpZiAoVlQuYml0c0dUKFZUMCkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIFhPUk5vZGUpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgWE9STm9kZSk7CisgIH0KKyAgLy8gZm9sZCAoc2VsZWN0IEMsIDAsIFgpIC0+IChhbmQgKG5vdCBDKSwgWCkKKyAgaWYgKFZUID09IFZUMCAmJiBWVCA9PSBNVlQ6OmkxICYmIE4xQyAmJiBOMUMtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICBTRFZhbHVlIE5PVE5vZGUgPSBEQUcuZ2V0Tk9UKE4wLmdldERlYnVnTG9jKCksIE4wLCBWVCk7CisgICAgQWRkVG9Xb3JrTGlzdChOT1ROb2RlLmdldE5vZGUoKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTk9UTm9kZSwgTjIpOworICB9CisgIC8vIGZvbGQgKHNlbGVjdCBDLCBYLCAxKSAtPiAob3IgKG5vdCBDKSwgWCkKKyAgaWYgKFZUID09IFZUMCAmJiBWVCA9PSBNVlQ6OmkxICYmIE4yQyAmJiBOMkMtPmdldEFQSW50VmFsdWUoKSA9PSAxKSB7CisgICAgU0RWYWx1ZSBOT1ROb2RlID0gREFHLmdldE5PVChOMC5nZXREZWJ1Z0xvYygpLCBOMCwgVlQpOworICAgIEFkZFRvV29ya0xpc3QoTk9UTm9kZS5nZXROb2RlKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTk9UTm9kZSwgTjEpOworICB9CisgIC8vIGZvbGQgKHNlbGVjdCBDLCBYLCAwKSAtPiAoYW5kIEMsIFgpCisgIGlmIChWVCA9PSBNVlQ6OmkxICYmIE4yQyAmJiBOMkMtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE4xKTsKKyAgLy8gZm9sZCAoc2VsZWN0IFgsIFgsIFkpIC0+IChvciBYLCBZKQorICAvLyBmb2xkIChzZWxlY3QgWCwgMSwgWSkgLT4gKG9yIFgsIFkpCisgIGlmIChWVCA9PSBNVlQ6OmkxICYmIChOMCA9PSBOMSB8fCAoTjFDICYmIE4xQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDEpKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpPUiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLCBOMik7CisgIC8vIGZvbGQgKHNlbGVjdCBYLCBZLCBYKSAtPiAoYW5kIFgsIFkpCisgIC8vIGZvbGQgKHNlbGVjdCBYLCBZLCAwKSAtPiAoYW5kIFgsIFkpCisgIGlmIChWVCA9PSBNVlQ6OmkxICYmIChOMCA9PSBOMiB8fCAoTjJDICYmIE4yQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDApKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTkQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwgTjEpOworCisgIC8vIElmIHdlIGNhbiBmb2xkIHRoaXMgYmFzZWQgb24gdGhlIHRydWUvZmFsc2UgdmFsdWUsIGRvIHNvLgorICBpZiAoU2ltcGxpZnlTZWxlY3RPcHMoTiwgTjEsIE4yKSkKKyAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsgIC8vIERvbid0IHJldmlzaXQgTi4KKworICAvLyBmb2xkIHNlbGVjdHMgYmFzZWQgb24gYSBzZXRjYyBpbnRvIG90aGVyIHRoaW5ncywgc3VjaCBhcyBtaW4vbWF4L2FicworICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQykgeworICAgIC8vIEZJWE1FOgorICAgIC8vIENoZWNrIGFnYWluc3QgTVZUOjpPdGhlciBmb3IgU0VMRUNUX0NDLCB3aGljaCBpcyBhIHdvcmthcm91bmQgZm9yIHRhcmdldHMKKyAgICAvLyBoYXZpbmcgdG8gc2F5IHRoZXkgZG9uJ3Qgc3VwcG9ydCBTRUxFQ1RfQ0Mgb24gZXZlcnkgdHlwZSB0aGUgREFHIGtub3dzCisgICAgLy8gYWJvdXQsIHNpbmNlIHRoZXJlIGlzIG5vIHdheSB0byBtYXJrIGFuIG9wY29kZSBpbGxlZ2FsIGF0IGFsbCB2YWx1ZSB0eXBlcworICAgIGlmIChUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6U0VMRUNUX0NDLCBNVlQ6Ok90aGVyKSAmJgorICAgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6U0VMRUNUX0NDLCBWVCkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1RfQ0MsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCksIE4wLmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTjEsIE4yLCBOMC5nZXRPcGVyYW5kKDIpKTsKKyAgICByZXR1cm4gU2ltcGxpZnlTZWxlY3QoTi0+Z2V0RGVidWdMb2MoKSwgTjAsIE4xLCBOMik7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFNFTEVDVF9DQyhTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIE4yID0gTi0+Z2V0T3BlcmFuZCgyKTsKKyAgU0RWYWx1ZSBOMyA9IE4tPmdldE9wZXJhbmQoMyk7CisgIFNEVmFsdWUgTjQgPSBOLT5nZXRPcGVyYW5kKDQpOworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oTjQpLT5nZXQoKTsKKworICAvLyBmb2xkIHNlbGVjdF9jYyBsaHMsIHJocywgeCwgeCwgY2MgLT4geAorICBpZiAoTjIgPT0gTjMpCisgICAgcmV0dXJuIE4yOworCisgIC8vIERldGVybWluZSBpZiB0aGUgY29uZGl0aW9uIHdlJ3JlIGRlYWxpbmcgd2l0aCBpcyBjb25zdGFudAorICBTRFZhbHVlIFNDQyA9IFNpbXBsaWZ5U2V0Q0MoVExJLmdldFNldENDUmVzdWx0VHlwZShOMC5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMCwgTjEsIENDLCBOLT5nZXREZWJ1Z0xvYygpLCBmYWxzZSk7CisgIGlmIChTQ0MuZ2V0Tm9kZSgpKSBBZGRUb1dvcmtMaXN0KFNDQy5nZXROb2RlKCkpOworCisgIGlmIChDb25zdGFudFNETm9kZSAqU0NDQyA9IGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRTRE5vZGU+KFNDQy5nZXROb2RlKCkpKSB7CisgICAgaWYgKCFTQ0NDLT5pc051bGxWYWx1ZSgpKQorICAgICAgcmV0dXJuIE4yOyAgICAvLyBjb25kIGFsd2F5cyB0cnVlIC0+IHRydWUgdmFsCisgICAgZWxzZQorICAgICAgcmV0dXJuIE4zOyAgICAvLyBjb25kIGFsd2F5cyBmYWxzZSAtPiBmYWxzZSB2YWwKKyAgfQorCisgIC8vIEZvbGQgdG8gYSBzaW1wbGVyIHNlbGVjdF9jYworICBpZiAoU0NDLmdldE5vZGUoKSAmJiBTQ0MuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQykKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1RfQ0MsIE4tPmdldERlYnVnTG9jKCksIE4yLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBTQ0MuZ2V0T3BlcmFuZCgwKSwgU0NDLmdldE9wZXJhbmQoMSksIE4yLCBOMywKKyAgICAgICAgICAgICAgICAgICAgICAgU0NDLmdldE9wZXJhbmQoMikpOworCisgIC8vIElmIHdlIGNhbiBmb2xkIHRoaXMgYmFzZWQgb24gdGhlIHRydWUvZmFsc2UgdmFsdWUsIGRvIHNvLgorICBpZiAoU2ltcGxpZnlTZWxlY3RPcHMoTiwgTjIsIE4zKSkKKyAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsgIC8vIERvbid0IHJldmlzaXQgTi4KKworICAvLyBmb2xkIHNlbGVjdF9jYyBpbnRvIG90aGVyIHRoaW5ncywgc3VjaCBhcyBtaW4vbWF4L2FicworICByZXR1cm4gU2ltcGxpZnlTZWxlY3RDQyhOLT5nZXREZWJ1Z0xvYygpLCBOMCwgTjEsIE4yLCBOMywgQ0MpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFNFVENDKFNETm9kZSAqTikgeworICByZXR1cm4gU2ltcGxpZnlTZXRDQyhOLT5nZXRWYWx1ZVR5cGUoMCksIE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q29uZENvZGVTRE5vZGU+KE4tPmdldE9wZXJhbmQoMikpLT5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKKy8vIEV4dGVuZFVzZXNUb0Zvcm1FeHRMb2FkIC0gVHJ5aW5nIHRvIGV4dGVuZCB1c2VzIG9mIGEgbG9hZCB0byBlbmFibGUgdGhpczoKKy8vICJmb2xkICh7c3x6fGF9ZXh0IChsb2FkIHgpKSAtPiAoe3N8enxhfWV4dCAodHJ1bmNhdGUgKHtzfHp8YX1leHRsb2FkIHgpKSkiCisvLyB0cmFuc2Zvcm1hdGlvbi4gUmV0dXJucyB0cnVlIGlmIGV4dGVuc2lvbiBhcmUgcG9zc2libGUgYW5kIHRoZSBhYm92ZQorLy8gbWVudGlvbmVkIHRyYW5zZm9ybWF0aW9uIGlzIHByb2ZpdGFibGUuCitzdGF0aWMgYm9vbCBFeHRlbmRVc2VzVG9Gb3JtRXh0TG9hZChTRE5vZGUgKk4sIFNEVmFsdWUgTjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFeHRPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxTRE5vZGUqLCA0PiAmRXh0ZW5kTm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJKSB7CisgIGJvb2wgSGFzQ29weVRvUmVnVXNlcyA9IGZhbHNlOworICBib29sIGlzVHJ1bmNGcmVlID0gVExJLmlzVHJ1bmNhdGVGcmVlKE4tPmdldFZhbHVlVHlwZSgwKSwgTjAuZ2V0VmFsdWVUeXBlKCkpOworICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIFVJID0gTjAuZ2V0Tm9kZSgpLT51c2VfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRSA9IE4wLmdldE5vZGUoKS0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IFVFOyArK1VJKSB7CisgICAgU0ROb2RlICpVc2VyID0gKlVJOworICAgIGlmIChVc2VyID09IE4pCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoVUkuZ2V0VXNlKCkuZ2V0UmVzTm8oKSAhPSBOMC5nZXRSZXNObygpKQorICAgICAgY29udGludWU7CisgICAgLy8gRklYTUU6IE9ubHkgZXh0ZW5kIFNFVENDIE4sIE4gYW5kIFNFVENDIE4sIGMgZm9yIG5vdy4KKyAgICBpZiAoRXh0T3BjICE9IElTRDo6QU5ZX0VYVEVORCAmJiBVc2VyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNFVENDKSB7CisgICAgICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oVXNlci0+Z2V0T3BlcmFuZCgyKSktPmdldCgpOworICAgICAgaWYgKEV4dE9wYyA9PSBJU0Q6OlpFUk9fRVhURU5EICYmIElTRDo6aXNTaWduZWRJbnRTZXRDQyhDQykpCisgICAgICAgIC8vIFNpZ24gYml0cyB3aWxsIGJlIGxvc3QgYWZ0ZXIgYSB6ZXh0LgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBib29sIEFkZCA9IGZhbHNlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSAyOyArK2kpIHsKKyAgICAgICAgU0RWYWx1ZSBVc2VPcCA9IFVzZXItPmdldE9wZXJhbmQoaSk7CisgICAgICAgIGlmIChVc2VPcCA9PSBOMCkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCFpc2E8Q29uc3RhbnRTRE5vZGU+KFVzZU9wKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIEFkZCA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoQWRkKQorICAgICAgICBFeHRlbmROb2Rlcy5wdXNoX2JhY2soVXNlcik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gSWYgdHJ1bmNhdGVzIGFyZW4ndCBmcmVlIGFuZCB0aGVyZSBhcmUgdXNlcnMgd2UgY2FuJ3QKKyAgICAvLyBleHRlbmQsIGl0IGlzbid0IHdvcnRod2hpbGUuCisgICAgaWYgKCFpc1RydW5jRnJlZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBSZW1lbWJlciBpZiB0aGlzIHZhbHVlIGlzIGxpdmUtb3V0LgorICAgIGlmIChVc2VyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlUb1JlZykKKyAgICAgIEhhc0NvcHlUb1JlZ1VzZXMgPSB0cnVlOworICB9CisKKyAgaWYgKEhhc0NvcHlUb1JlZ1VzZXMpIHsKKyAgICBib29sIEJvdGhMaXZlT3V0ID0gZmFsc2U7CisgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IE4tPnVzZV9iZWdpbigpLCBVRSA9IE4tPnVzZV9lbmQoKTsKKyAgICAgICAgIFVJICE9IFVFOyArK1VJKSB7CisgICAgICBTRFVzZSAmVXNlID0gVUkuZ2V0VXNlKCk7CisgICAgICBpZiAoVXNlLmdldFJlc05vKCkgPT0gMCAmJiBVc2UuZ2V0VXNlcigpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlUb1JlZykgeworICAgICAgICBCb3RoTGl2ZU91dCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoQm90aExpdmVPdXQpCisgICAgICAvLyBCb3RoIHVuZXh0ZW5kZWQgYW5kIGV4dGVuZGVkIHZhbHVlcyBhcmUgbGl2ZSBvdXQuIFRoZXJlIGhhZCBiZXR0ZXIgYmUKKyAgICAgIC8vIGdvb2QgYSByZWFzb24gZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgIHJldHVybiBFeHRlbmROb2Rlcy5zaXplKCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0U0lHTl9FWFRFTkQoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gZm9sZCAoc2V4dCBjMSkgLT4gYzEKKyAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oTjApKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjApOworCisgIC8vIGZvbGQgKHNleHQgKHNleHQgeCkpIC0+IChzZXh0IHgpCisgIC8vIGZvbGQgKHNleHQgKGFleHQgeCkpIC0+IChzZXh0IHgpCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNJR05fRVhURU5EIHx8IE4wLmdldE9wY29kZSgpID09IElTRDo6QU5ZX0VYVEVORCkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCkpOworCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFKSB7CisgICAgLy8gZm9sZCAoc2V4dCAodHJ1bmNhdGUgKGxvYWQgeCkpKSAtPiAoc2V4dCAoc21hbGxlciBsb2FkIHgpKQorICAgIC8vIGZvbGQgKHNleHQgKHRydW5jYXRlIChzcmwgKGxvYWQgeCksIGMpKSkgLT4gKHNleHQgKHNtYWxsZXIgbG9hZCAoeCtjL24pKSkKKyAgICBTRFZhbHVlIE5hcnJvd0xvYWQgPSBSZWR1Y2VMb2FkV2lkdGgoTjAuZ2V0Tm9kZSgpKTsKKyAgICBpZiAoTmFycm93TG9hZC5nZXROb2RlKCkpIHsKKyAgICAgIFNETm9kZSogb3llID0gTjAuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKTsKKyAgICAgIGlmIChOYXJyb3dMb2FkLmdldE5vZGUoKSAhPSBOMC5nZXROb2RlKCkpIHsKKyAgICAgICAgQ29tYmluZVRvKE4wLmdldE5vZGUoKSwgTmFycm93TG9hZCk7CisgICAgICAgIC8vIENvbWJpbmVUbyBkZWxldGVkIHRoZSB0cnVuY2F0ZSwgaWYgbmVlZGVkLCBidXQgbm90IHdoYXQncyB1bmRlciBpdC4KKyAgICAgICAgQWRkVG9Xb3JrTGlzdChveWUpOworICAgICAgfQorICAgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7ICAgLy8gUmV0dXJuIE4gc28gaXQgZG9lc24ndCBnZXQgcmVjaGVja2VkIQorICAgIH0KKworICAgIC8vIFNlZSBpZiB0aGUgdmFsdWUgYmVpbmcgdHJ1bmNhdGVkIGlzIGFscmVhZHkgc2lnbiBleHRlbmRlZC4gIElmIHNvLCBqdXN0CisgICAgLy8gZWxpbWluYXRlIHRoZSB0cnVuYy9zZXh0IHBhaXIuCisgICAgU0RWYWx1ZSBPcCA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgdW5zaWduZWQgT3BCaXRzICAgPSBPcC5nZXRWYWx1ZVR5cGUoKS5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgIHVuc2lnbmVkIE1pZEJpdHMgID0gTjAuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICB1bnNpZ25lZCBEZXN0Qml0cyA9IFZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgICAgdW5zaWduZWQgTnVtU2lnbkJpdHMgPSBEQUcuQ29tcHV0ZU51bVNpZ25CaXRzKE9wKTsKKworICAgIGlmIChPcEJpdHMgPT0gRGVzdEJpdHMpIHsKKyAgICAgIC8vIE9wIGlzIGkzMiwgTWlkIGlzIGk4LCBhbmQgRGVzdCBpcyBpMzIuICBJZiBPcCBoYXMgbW9yZSB0aGFuIDI0IHNpZ24KKyAgICAgIC8vIGJpdHMsIGl0IGlzIGFscmVhZHkgcmVhZHkuCisgICAgICBpZiAoTnVtU2lnbkJpdHMgPiBEZXN0Qml0cy1NaWRCaXRzKQorICAgICAgICByZXR1cm4gT3A7CisgICAgfSBlbHNlIGlmIChPcEJpdHMgPCBEZXN0Qml0cykgeworICAgICAgLy8gT3AgaXMgaTMyLCBNaWQgaXMgaTgsIGFuZCBEZXN0IGlzIGk2NC4gIElmIE9wIGhhcyBtb3JlIHRoYW4gMjQgc2lnbgorICAgICAgLy8gYml0cywganVzdCBzZXh0IGZyb20gaTMyLgorICAgICAgaWYgKE51bVNpZ25CaXRzID4gT3BCaXRzLU1pZEJpdHMpCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgT3ApOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPcCBpcyBpNjQsIE1pZCBpcyBpOCwgYW5kIERlc3QgaXMgaTMyLiAgSWYgT3AgaGFzIG1vcmUgdGhhbiA1NiBzaWduCisgICAgICAvLyBiaXRzLCBqdXN0IHRydW5jYXRlIHRvIGkzMi4KKyAgICAgIGlmIChOdW1TaWduQml0cyA+IE9wQml0cy1NaWRCaXRzKQorICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE9wKTsKKyAgICB9CisKKyAgICAvLyBmb2xkIChzZXh0ICh0cnVuY2F0ZSB4KSkgLT4gKHNleHRpbnJlZyB4KS4KKyAgICBpZiAoIUxlZ2FsT3BlcmF0aW9ucyB8fCBUTEkuaXNPcGVyYXRpb25MZWdhbChJU0Q6OlNJR05fRVhURU5EX0lOUkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldFZhbHVlVHlwZSgpKSkgeworICAgICAgaWYgKE9wQml0cyA8IERlc3RCaXRzKQorICAgICAgICBPcCA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgTjAuZ2V0RGVidWdMb2MoKSwgVlQsIE9wKTsKKyAgICAgIGVsc2UgaWYgKE9wQml0cyA+IERlc3RCaXRzKQorICAgICAgICBPcCA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIE4wLmdldERlYnVnTG9jKCksIFZULCBPcCk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORF9JTlJFRywgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWYWx1ZVR5cGUoTjAuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgICB9CisgIH0KKworICAvLyBmb2xkIChzZXh0IChsb2FkIHgpKSAtPiAoc2V4dCAodHJ1bmNhdGUgKHNleHRsb2FkIHgpKSkKKyAgaWYgKElTRDo6aXNOT05fRVhUTG9hZChOMC5nZXROb2RlKCkpICYmCisgICAgICAoKCFMZWdhbE9wZXJhdGlvbnMgJiYgIWNhc3Q8TG9hZFNETm9kZT4oTjApLT5pc1ZvbGF0aWxlKCkpIHx8CisgICAgICAgVExJLmlzTG9hZEV4dExlZ2FsKElTRDo6U0VYVExPQUQsIE4wLmdldFZhbHVlVHlwZSgpKSkpIHsKKyAgICBib29sIERvWGZvcm0gPSB0cnVlOworICAgIFNtYWxsVmVjdG9yPFNETm9kZSosIDQ+IFNldENDczsKKyAgICBpZiAoIU4wLmhhc09uZVVzZSgpKQorICAgICAgRG9YZm9ybSA9IEV4dGVuZFVzZXNUb0Zvcm1FeHRMb2FkKE4sIE4wLCBJU0Q6OlNJR05fRVhURU5ELCBTZXRDQ3MsIFRMSSk7CisgICAgaWYgKERvWGZvcm0pIHsKKyAgICAgIExvYWRTRE5vZGUgKkxOMCA9IGNhc3Q8TG9hZFNETm9kZT4oTjApOworICAgICAgU0RWYWx1ZSBFeHRMb2FkID0gREFHLmdldEV4dExvYWQoSVNEOjpTRVhUTE9BRCwgVlQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldENoYWluKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEJhc2VQdHIoKSwgTE4wLT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmlzVm9sYXRpbGUoKSwgTE4wLT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEFsaWdubWVudCgpKTsKKyAgICAgIENvbWJpbmVUbyhOLCBFeHRMb2FkKTsKKyAgICAgIFNEVmFsdWUgVHJ1bmMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBOMC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldFZhbHVlVHlwZSgpLCBFeHRMb2FkKTsKKyAgICAgIENvbWJpbmVUbyhOMC5nZXROb2RlKCksIFRydW5jLCBFeHRMb2FkLmdldFZhbHVlKDEpKTsKKworICAgICAgLy8gRXh0ZW5kIFNldENDIHVzZXMgaWYgbmVjZXNzYXJ5LgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNldENDcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFNETm9kZSAqU2V0Q0MgPSBTZXRDQ3NbaV07CisgICAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDQ+IE9wczsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IDI7ICsraikgeworICAgICAgICAgIFNEVmFsdWUgU09wID0gU2V0Q0MtPmdldE9wZXJhbmQoaik7CisgICAgICAgICAgaWYgKFNPcCA9PSBUcnVuYykKKyAgICAgICAgICAgIE9wcy5wdXNoX2JhY2soRXh0TG9hZCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgU09wKSk7CisgICAgICAgIH0KKworICAgICAgICBPcHMucHVzaF9iYWNrKFNldENDLT5nZXRPcGVyYW5kKDIpKTsKKyAgICAgICAgQ29tYmluZVRvKFNldENDLCBEQUcuZ2V0Tm9kZShJU0Q6OlNFVENDLCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENDLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk9wc1swXSwgT3BzLnNpemUoKSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsgICAvLyBSZXR1cm4gTiBzbyBpdCBkb2Vzbid0IGdldCByZWNoZWNrZWQhCisgICAgfQorICB9CisKKyAgLy8gZm9sZCAoc2V4dCAoc2V4dGxvYWQgeCkpIC0+IChzZXh0ICh0cnVuY2F0ZSAoc2V4dGxvYWQgeCkpKQorICAvLyBmb2xkIChzZXh0ICggZXh0bG9hZCB4KSkgLT4gKHNleHQgKHRydW5jYXRlIChzZXh0bG9hZCB4KSkpCisgIGlmICgoSVNEOjppc1NFWFRMb2FkKE4wLmdldE5vZGUoKSkgfHwgSVNEOjppc0VYVExvYWQoTjAuZ2V0Tm9kZSgpKSkgJiYKKyAgICAgIElTRDo6aXNVTklOREVYRURMb2FkKE4wLmdldE5vZGUoKSkgJiYgTjAuaGFzT25lVXNlKCkpIHsKKyAgICBMb2FkU0ROb2RlICpMTjAgPSBjYXN0PExvYWRTRE5vZGU+KE4wKTsKKyAgICBFVlQgTWVtVlQgPSBMTjAtPmdldE1lbW9yeVZUKCk7CisgICAgaWYgKCghTGVnYWxPcGVyYXRpb25zICYmICFMTjAtPmlzVm9sYXRpbGUoKSkgfHwKKyAgICAgICAgVExJLmlzTG9hZEV4dExlZ2FsKElTRDo6U0VYVExPQUQsIE1lbVZUKSkgeworICAgICAgU0RWYWx1ZSBFeHRMb2FkID0gREFHLmdldEV4dExvYWQoSVNEOjpTRVhUTE9BRCwgVlQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldENoYWluKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEJhc2VQdHIoKSwgTE4wLT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRTcmNWYWx1ZU9mZnNldCgpLCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+aXNWb2xhdGlsZSgpLCBMTjAtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0QWxpZ25tZW50KCkpOworICAgICAgQ29tYmluZVRvKE4sIEV4dExvYWQpOworICAgICAgQ29tYmluZVRvKE4wLmdldE5vZGUoKSwKKyAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBOMC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldFZhbHVlVHlwZSgpLCBFeHRMb2FkKSwKKyAgICAgICAgICAgICAgICBFeHRMb2FkLmdldFZhbHVlKDEpKTsKKyAgICAgIHJldHVybiBTRFZhbHVlKE4sIDApOyAgIC8vIFJldHVybiBOIHNvIGl0IGRvZXNuJ3QgZ2V0IHJlY2hlY2tlZCEKKyAgICB9CisgIH0KKworICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQykgeworICAgIC8vIHNleHQoc2V0Y2MpIC0+IHNleHRfaW5fcmVnKHZzZXRjYykgZm9yIHZlY3RvcnMuCisgICAgLy8gT25seSBkbyB0aGlzIGJlZm9yZSBsZWdhbGl6ZSBmb3Igbm93LgorICAgIGlmIChWVC5pc1ZlY3RvcigpICYmICFMZWdhbE9wZXJhdGlvbnMpIHsKKyAgICAgIEVWVCBOMFZUID0gTjAuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgICAgLy8gV2Uga25vdyB0aGF0IHRoZSAjIGVsZW1lbnRzIG9mIHRoZSByZXN1bHRzIGlzIHRoZSBzYW1lIGFzIHRoZQorICAgICAgICAvLyAjIGVsZW1lbnRzIG9mIHRoZSBjb21wYXJlIChhbmQgdGhlICMgZWxlbWVudHMgb2YgdGhlIGNvbXBhcmUgcmVzdWx0CisgICAgICAgIC8vIGZvciB0aGF0IG1hdHRlcikuICBDaGVjayB0byBzZWUgdGhhdCB0aGV5IGFyZSB0aGUgc2FtZSBzaXplLiAgSWYgc28sCisgICAgICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgZWxlbWVudCBzaXplIG9mIHRoZSBzZXh0J2QgcmVzdWx0IG1hdGNoZXMgdGhlCisgICAgICAgIC8vIGVsZW1lbnQgc2l6ZSBvZiB0aGUgY29tcGFyZSBvcGVyYW5kcy4KKyAgICAgIGlmIChWVC5nZXRTaXplSW5CaXRzKCkgPT0gTjBWVC5nZXRTaXplSW5CaXRzKCkpCisgICAgICAgIHJldHVybiBEQUcuZ2V0VlNldENDKE4tPmdldERlYnVnTG9jKCksIFZULCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbmRDb2RlU0ROb2RlPihOMC5nZXRPcGVyYW5kKDIpKS0+Z2V0KCkpOworICAgICAgLy8gSWYgdGhlIGRlc2lyZWQgZWxlbWVudHMgYXJlIHNtYWxsZXIgb3IgbGFyZ2VyIHRoYW4gdGhlIHNvdXJjZQorICAgICAgLy8gZWxlbWVudHMgd2UgY2FuIHVzZSBhIG1hdGNoaW5nIGludGVnZXIgdmVjdG9yIHR5cGUgYW5kIHRoZW4KKyAgICAgIC8vIHRydW5jYXRlL3NpZ24gZXh0ZW5kCisgICAgICBlbHNlIHsKKyAgICAgICAgRVZUIE1hdGNoaW5nRWxlbWVudFR5cGUgPQorICAgICAgICAgIEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSk7CisgICAgICAgIEVWVCBNYXRjaGluZ1ZlY3RvclR5cGUgPQorICAgICAgICAgIEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIE1hdGNoaW5nRWxlbWVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOMFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICAgICAgICBTRFZhbHVlIFZzZXRDQyA9CisgICAgICAgICAgREFHLmdldFZTZXRDQyhOLT5nZXREZWJ1Z0xvYygpLCBNYXRjaGluZ1ZlY3RvclR5cGUsIE4wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25kQ29kZVNETm9kZT4oTjAuZ2V0T3BlcmFuZCgyKSktPmdldCgpKTsKKyAgICAgICAgcmV0dXJuIERBRy5nZXRTRXh0T3JUcnVuYyhWc2V0Q0MsIE4tPmdldERlYnVnTG9jKCksIFZUKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzZXh0KHNldGNjIHgsIHksIGNjKSAtPiAoc2VsZWN0X2NjIHgsIHksIC0xLCAwLCBjYykKKyAgICB1bnNpZ25lZCBFbGVtZW50V2lkdGggPSBWVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgIFNEVmFsdWUgTmVnT25lID0KKyAgICAgIERBRy5nZXRDb25zdGFudChBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEVsZW1lbnRXaWR0aCksIFZUKTsKKyAgICBTRFZhbHVlIFNDQyA9CisgICAgICBTaW1wbGlmeVNlbGVjdENDKE4tPmdldERlYnVnTG9jKCksIE4wLmdldE9wZXJhbmQoMCksIE4wLmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgIE5lZ09uZSwgREFHLmdldENvbnN0YW50KDAsIFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25kQ29kZVNETm9kZT4oTjAuZ2V0T3BlcmFuZCgyKSktPmdldCgpLCB0cnVlKTsKKyAgICBpZiAoU0NDLmdldE5vZGUoKSkgcmV0dXJuIFNDQzsKKyAgICBpZiAoIUxlZ2FsT3BlcmF0aW9ucyB8fAorICAgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbChJU0Q6OlNFVENDLCBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKFZUKSkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRTZXRDQyhOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKSwgTjAuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q29uZENvZGVTRE5vZGU+KE4wLmdldE9wZXJhbmQoMikpLT5nZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTmVnT25lLCBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpKTsKKyAgfSAgCisKKyAgLy8gZm9sZCAoc2V4dCB4KSAtPiAoemV4dCB4KSBpZiB0aGUgc2lnbiBiaXQgaXMga25vd24gemVyby4KKyAgaWYgKCghTGVnYWxPcGVyYXRpb25zIHx8IFRMSS5pc09wZXJhdGlvbkxlZ2FsKElTRDo6WkVST19FWFRFTkQsIFZUKSkgJiYKKyAgICAgIERBRy5TaWduQml0SXNaZXJvKE4wKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wKTsKKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFpFUk9fRVhURU5EKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIC8vIGZvbGQgKHpleHQgYzEpIC0+IGMxCisgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE4wKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wKTsKKyAgLy8gZm9sZCAoemV4dCAoemV4dCB4KSkgLT4gKHpleHQgeCkKKyAgLy8gZm9sZCAoemV4dCAoYWV4dCB4KSkgLT4gKHpleHQgeCkKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6WkVST19FWFRFTkQgfHwgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTllfRVhURU5EKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKSk7CisKKyAgLy8gZm9sZCAoemV4dCAodHJ1bmNhdGUgKGxvYWQgeCkpKSAtPiAoemV4dCAoc21hbGxlciBsb2FkIHgpKQorICAvLyBmb2xkICh6ZXh0ICh0cnVuY2F0ZSAoc3JsIChsb2FkIHgpLCBjKSkpIC0+ICh6ZXh0IChzbWFsbCBsb2FkICh4K2MvbikpKQorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUUlVOQ0FURSkgeworICAgIFNEVmFsdWUgTmFycm93TG9hZCA9IFJlZHVjZUxvYWRXaWR0aChOMC5nZXROb2RlKCkpOworICAgIGlmIChOYXJyb3dMb2FkLmdldE5vZGUoKSkgeworICAgICAgU0ROb2RlKiBveWUgPSBOMC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpOworICAgICAgaWYgKE5hcnJvd0xvYWQuZ2V0Tm9kZSgpICE9IE4wLmdldE5vZGUoKSkgeworICAgICAgICBDb21iaW5lVG8oTjAuZ2V0Tm9kZSgpLCBOYXJyb3dMb2FkKTsKKyAgICAgICAgLy8gQ29tYmluZVRvIGRlbGV0ZWQgdGhlIHRydW5jYXRlLCBpZiBuZWVkZWQsIGJ1dCBub3Qgd2hhdCdzIHVuZGVyIGl0LgorICAgICAgICBBZGRUb1dvcmtMaXN0KG95ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE5hcnJvd0xvYWQpOworICAgIH0KKyAgfQorCisgIC8vIGZvbGQgKHpleHQgKHRydW5jYXRlIHgpKSAtPiAoYW5kIHgsIG1hc2spCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFICYmCisgICAgICAoIUxlZ2FsT3BlcmF0aW9ucyB8fCBUTEkuaXNPcGVyYXRpb25MZWdhbChJU0Q6OkFORCwgVlQpKSkgeworICAgIFNEVmFsdWUgT3AgPSBOMC5nZXRPcGVyYW5kKDApOworICAgIGlmIChPcC5nZXRWYWx1ZVR5cGUoKS5iaXRzTFQoVlQpKSB7CisgICAgICBPcCA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE9wKTsKKyAgICB9IGVsc2UgaWYgKE9wLmdldFZhbHVlVHlwZSgpLmJpdHNHVChWVCkpIHsKKyAgICAgIE9wID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE9wKTsKKyAgICB9CisgICAgcmV0dXJuIERBRy5nZXRaZXJvRXh0ZW5kSW5SZWcoT3AsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpKTsKKyAgfQorCisgIC8vIEZvbGQgKHpleHQgKGFuZCAodHJ1bmMgeCksIGNzdCkpIC0+IChhbmQgeCwgY3N0KSwKKyAgLy8gaWYgZWl0aGVyIG9mIHRoZSBjYXN0cyBpcyBub3QgZnJlZS4KKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6QU5EICYmCisgICAgICBOMC5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUgJiYKKyAgICAgIE4wLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJgorICAgICAgKCFUTEkuaXNUcnVuY2F0ZUZyZWUoTjAuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCkpIHx8CisgICAgICAgIVRMSS5pc1pFeHRGcmVlKE4wLmdldFZhbHVlVHlwZSgpLCBWVCkpKSB7CisgICAgU0RWYWx1ZSBYID0gTjAuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDApOworICAgIGlmIChYLmdldFZhbHVlVHlwZSgpLmJpdHNMVChWVCkpIHsKKyAgICAgIFggPSBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIFguZ2V0RGVidWdMb2MoKSwgVlQsIFgpOworICAgIH0gZWxzZSBpZiAoWC5nZXRWYWx1ZVR5cGUoKS5iaXRzR1QoVlQpKSB7CisgICAgICBYID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgWC5nZXREZWJ1Z0xvYygpLCBWVCwgWCk7CisgICAgfQorICAgIEFQSW50IE1hc2sgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKS0+Z2V0QVBJbnRWYWx1ZSgpOworICAgIE1hc2suemV4dChWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIFgsIERBRy5nZXRDb25zdGFudChNYXNrLCBWVCkpOworICB9CisKKyAgLy8gZm9sZCAoemV4dCAobG9hZCB4KSkgLT4gKHpleHQgKHRydW5jYXRlICh6ZXh0bG9hZCB4KSkpCisgIGlmIChJU0Q6OmlzTk9OX0VYVExvYWQoTjAuZ2V0Tm9kZSgpKSAmJgorICAgICAgKCghTGVnYWxPcGVyYXRpb25zICYmICFjYXN0PExvYWRTRE5vZGU+KE4wKS0+aXNWb2xhdGlsZSgpKSB8fAorICAgICAgIFRMSS5pc0xvYWRFeHRMZWdhbChJU0Q6OlpFWFRMT0FELCBOMC5nZXRWYWx1ZVR5cGUoKSkpKSB7CisgICAgYm9vbCBEb1hmb3JtID0gdHJ1ZTsKKyAgICBTbWFsbFZlY3RvcjxTRE5vZGUqLCA0PiBTZXRDQ3M7CisgICAgaWYgKCFOMC5oYXNPbmVVc2UoKSkKKyAgICAgIERvWGZvcm0gPSBFeHRlbmRVc2VzVG9Gb3JtRXh0TG9hZChOLCBOMCwgSVNEOjpaRVJPX0VYVEVORCwgU2V0Q0NzLCBUTEkpOworICAgIGlmIChEb1hmb3JtKSB7CisgICAgICBMb2FkU0ROb2RlICpMTjAgPSBjYXN0PExvYWRTRE5vZGU+KE4wKTsKKyAgICAgIFNEVmFsdWUgRXh0TG9hZCA9IERBRy5nZXRFeHRMb2FkKElTRDo6WkVYVExPQUQsIFZULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRDaGFpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRCYXNlUHRyKCksIExOMC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5pc1ZvbGF0aWxlKCksIExOMC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgICBDb21iaW5lVG8oTiwgRXh0TG9hZCk7CisgICAgICBTRFZhbHVlIFRydW5jID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgTjAuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRWYWx1ZVR5cGUoKSwgRXh0TG9hZCk7CisgICAgICBDb21iaW5lVG8oTjAuZ2V0Tm9kZSgpLCBUcnVuYywgRXh0TG9hZC5nZXRWYWx1ZSgxKSk7CisKKyAgICAgIC8vIEV4dGVuZCBTZXRDQyB1c2VzIGlmIG5lY2Vzc2FyeS4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTZXRDQ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBTRE5vZGUgKlNldENDID0gU2V0Q0NzW2ldOworICAgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBPcHM7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiAhPSAyOyArK2opIHsKKyAgICAgICAgICBTRFZhbHVlIFNPcCA9IFNldENDLT5nZXRPcGVyYW5kKGopOworICAgICAgICAgIGlmIChTT3AgPT0gVHJ1bmMpCisgICAgICAgICAgICBPcHMucHVzaF9iYWNrKEV4dExvYWQpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE9wcy5wdXNoX2JhY2soREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIFNPcCkpOworICAgICAgICB9CisKKyAgICAgICAgT3BzLnB1c2hfYmFjayhTZXRDQy0+Z2V0T3BlcmFuZCgyKSk7CisgICAgICAgIENvbWJpbmVUbyhTZXRDQywgREFHLmdldE5vZGUoSVNEOjpTRVRDQywgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRDQy0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPcHNbMF0sIE9wcy5zaXplKCkpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7ICAgLy8gUmV0dXJuIE4gc28gaXQgZG9lc24ndCBnZXQgcmVjaGVja2VkIQorICAgIH0KKyAgfQorCisgIC8vIGZvbGQgKHpleHQgKHpleHRsb2FkIHgpKSAtPiAoemV4dCAodHJ1bmNhdGUgKHpleHRsb2FkIHgpKSkKKyAgLy8gZm9sZCAoemV4dCAoIGV4dGxvYWQgeCkpIC0+ICh6ZXh0ICh0cnVuY2F0ZSAoemV4dGxvYWQgeCkpKQorICBpZiAoKElTRDo6aXNaRVhUTG9hZChOMC5nZXROb2RlKCkpIHx8IElTRDo6aXNFWFRMb2FkKE4wLmdldE5vZGUoKSkpICYmCisgICAgICBJU0Q6OmlzVU5JTkRFWEVETG9hZChOMC5nZXROb2RlKCkpICYmIE4wLmhhc09uZVVzZSgpKSB7CisgICAgTG9hZFNETm9kZSAqTE4wID0gY2FzdDxMb2FkU0ROb2RlPihOMCk7CisgICAgRVZUIE1lbVZUID0gTE4wLT5nZXRNZW1vcnlWVCgpOworICAgIGlmICgoIUxlZ2FsT3BlcmF0aW9ucyAmJiAhTE4wLT5pc1ZvbGF0aWxlKCkpIHx8CisgICAgICAgIFRMSS5pc0xvYWRFeHRMZWdhbChJU0Q6OlpFWFRMT0FELCBNZW1WVCkpIHsKKyAgICAgIFNEVmFsdWUgRXh0TG9hZCA9IERBRy5nZXRFeHRMb2FkKElTRDo6WkVYVExPQUQsIFZULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRDaGFpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRCYXNlUHRyKCksIExOMC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmlzVm9sYXRpbGUoKSwgTE4wLT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEFsaWdubWVudCgpKTsKKyAgICAgIENvbWJpbmVUbyhOLCBFeHRMb2FkKTsKKyAgICAgIENvbWJpbmVUbyhOMC5nZXROb2RlKCksCisgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgTjAuZ2V0RGVidWdMb2MoKSwgTjAuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0TG9hZCksCisgICAgICAgICAgICAgICAgRXh0TG9hZC5nZXRWYWx1ZSgxKSk7CisgICAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsgICAvLyBSZXR1cm4gTiBzbyBpdCBkb2Vzbid0IGdldCByZWNoZWNrZWQhCisgICAgfQorICB9CisKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6U0VUQ0MpIHsKKyAgICBpZiAoIUxlZ2FsT3BlcmF0aW9ucyAmJiBWVC5pc1ZlY3RvcigpKSB7CisgICAgICAvLyB6ZXh0KHNldGNjKSAtPiAoYW5kICh2c2V0Y2MpLCAoMSwgMSwgLi4uKSBmb3IgdmVjdG9ycy4KKyAgICAgIC8vIE9ubHkgZG8gdGhpcyBiZWZvcmUgbGVnYWxpemUgZm9yIG5vdy4KKyAgICAgIEVWVCBOMFZUID0gTjAuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgIEVWVCBFbHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLDg+IE9uZU9wcyhWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIEVsdFZUKSk7CisgICAgICBpZiAoVlQuZ2V0U2l6ZUluQml0cygpID09IE4wVlQuZ2V0U2l6ZUluQml0cygpKSB7CisgICAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgIyBlbGVtZW50cyBvZiB0aGUgcmVzdWx0cyBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICAgICAgLy8gIyBlbGVtZW50cyBvZiB0aGUgY29tcGFyZSAoYW5kIHRoZSAjIGVsZW1lbnRzIG9mIHRoZSBjb21wYXJlIHJlc3VsdAorICAgICAgICAvLyBmb3IgdGhhdCBtYXR0ZXIpLiAgQ2hlY2sgdG8gc2VlIHRoYXQgdGhleSBhcmUgdGhlIHNhbWUgc2l6ZS4gIElmIHNvLAorICAgICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGVsZW1lbnQgc2l6ZSBvZiB0aGUgc2V4dCdkIHJlc3VsdCBtYXRjaGVzIHRoZQorICAgICAgICAvLyBlbGVtZW50IHNpemUgb2YgdGhlIGNvbXBhcmUgb3BlcmFuZHMuCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlNldENDKE4tPmdldERlYnVnTG9jKCksIFZULCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25kQ29kZVNETm9kZT4oTjAuZ2V0T3BlcmFuZCgyKSktPmdldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPbmVPcHNbMF0sIE9uZU9wcy5zaXplKCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHRoZSBkZXNpcmVkIGVsZW1lbnRzIGFyZSBzbWFsbGVyIG9yIGxhcmdlciB0aGFuIHRoZSBzb3VyY2UKKyAgICAgICAgLy8gZWxlbWVudHMgd2UgY2FuIHVzZSBhIG1hdGNoaW5nIGludGVnZXIgdmVjdG9yIHR5cGUgYW5kIHRoZW4KKyAgICAgICAgLy8gdHJ1bmNhdGUvc2lnbiBleHRlbmQKKyAgICAgICAgRVZUIE1hdGNoaW5nRWxlbWVudFR5cGUgPQorICAgICAgICAgIEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSk7CisgICAgICAgIEVWVCBNYXRjaGluZ1ZlY3RvclR5cGUgPQorICAgICAgICAgIEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIE1hdGNoaW5nRWxlbWVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOMFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICAgICAgICBTRFZhbHVlIFZzZXRDQyA9CisgICAgICAgICAgREFHLmdldFZTZXRDQyhOLT5nZXREZWJ1Z0xvYygpLCBNYXRjaGluZ1ZlY3RvclR5cGUsIE4wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25kQ29kZVNETm9kZT4oTjAuZ2V0T3BlcmFuZCgyKSktPmdldCgpKTsKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRTRXh0T3JUcnVuYyhWc2V0Q0MsIE4tPmdldERlYnVnTG9jKCksIFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPbmVPcHNbMF0sIE9uZU9wcy5zaXplKCkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB6ZXh0KHNldGNjIHgseSxjYykgLT4gc2VsZWN0X2NjIHgsIHksIDEsIDAsIGNjCisgICAgU0RWYWx1ZSBTQ0MgPQorICAgICAgU2ltcGxpZnlTZWxlY3RDQyhOLT5nZXREZWJ1Z0xvYygpLCBOMC5nZXRPcGVyYW5kKDApLCBOMC5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgVlQpLCBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbmRDb2RlU0ROb2RlPihOMC5nZXRPcGVyYW5kKDIpKS0+Z2V0KCksIHRydWUpOworICAgIGlmIChTQ0MuZ2V0Tm9kZSgpKSByZXR1cm4gU0NDOworICB9CisKKyAgLy8gKHpleHQgKHNobCAoemV4dCB4KSwgY3N0KSkgLT4gKHNobCAoemV4dCB4KSwgY3N0KQorICBpZiAoKE4wLmdldE9wY29kZSgpID09IElTRDo6U0hMIHx8IE4wLmdldE9wY29kZSgpID09IElTRDo6U1JMKSAmJgorICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgTjAuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlpFUk9fRVhURU5EICYmCisgICAgICBOMC5oYXNPbmVVc2UoKSkgeworICAgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCkgeworICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIHNobCBtYXkgYmUgc2hpZnRpbmcgb3V0IGJpdHMsIGRvIG5vdCBwZXJmb3JtIHRoaXMKKyAgICAgIC8vIHRyYW5zZm9ybWF0aW9uLgorICAgICAgdW5zaWduZWQgU2hBbXQgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICB1bnNpZ25lZCBLbm93blplcm9CaXRzID0gTjAuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCkgLQorICAgICAgICBOMC5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgICAgaWYgKFNoQW10ID4gS25vd25aZXJvQml0cykKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICB9CisgICAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShOMC5nZXRPcGNvZGUoKSwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwgVlQsIE4wLmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgxKSkpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRBTllfRVhURU5EKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIC8vIGZvbGQgKGFleHQgYzEpIC0+IGMxCisgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE4wKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjApOworICAvLyBmb2xkIChhZXh0IChhZXh0IHgpKSAtPiAoYWV4dCB4KQorICAvLyBmb2xkIChhZXh0ICh6ZXh0IHgpKSAtPiAoemV4dCB4KQorICAvLyBmb2xkIChhZXh0IChzZXh0IHgpKSAtPiAoc2V4dCB4KQorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTllfRVhURU5EICB8fAorICAgICAgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpaRVJPX0VYVEVORCB8fAorICAgICAgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSUdOX0VYVEVORCkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoTjAuZ2V0T3Bjb2RlKCksIE4tPmdldERlYnVnTG9jKCksIFZULCBOMC5nZXRPcGVyYW5kKDApKTsKKworICAvLyBmb2xkIChhZXh0ICh0cnVuY2F0ZSAobG9hZCB4KSkpIC0+IChhZXh0IChzbWFsbGVyIGxvYWQgeCkpCisgIC8vIGZvbGQgKGFleHQgKHRydW5jYXRlIChzcmwgKGxvYWQgeCksIGMpKSkgLT4gKGFleHQgKHNtYWxsIGxvYWQgKHgrYy9uKSkpCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFKSB7CisgICAgU0RWYWx1ZSBOYXJyb3dMb2FkID0gUmVkdWNlTG9hZFdpZHRoKE4wLmdldE5vZGUoKSk7CisgICAgaWYgKE5hcnJvd0xvYWQuZ2V0Tm9kZSgpKSB7CisgICAgICBTRE5vZGUqIG95ZSA9IE4wLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKS5nZXROb2RlKCk7CisgICAgICBpZiAoTmFycm93TG9hZC5nZXROb2RlKCkgIT0gTjAuZ2V0Tm9kZSgpKSB7CisgICAgICAgIENvbWJpbmVUbyhOMC5nZXROb2RlKCksIE5hcnJvd0xvYWQpOworICAgICAgICAvLyBDb21iaW5lVG8gZGVsZXRlZCB0aGUgdHJ1bmNhdGUsIGlmIG5lZWRlZCwgYnV0IG5vdCB3aGF0J3MgdW5kZXIgaXQuCisgICAgICAgIEFkZFRvV29ya0xpc3Qob3llKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOYXJyb3dMb2FkKTsKKyAgICB9CisgIH0KKworICAvLyBmb2xkIChhZXh0ICh0cnVuY2F0ZSB4KSkKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUpIHsKKyAgICBTRFZhbHVlIFRydW5jT3AgPSBOMC5nZXRPcGVyYW5kKDApOworICAgIGlmIChUcnVuY09wLmdldFZhbHVlVHlwZSgpID09IFZUKQorICAgICAgcmV0dXJuIFRydW5jT3A7IC8vIHggaWZmIHggc2l6ZSA9PSB6ZXh0IHNpemUuCisgICAgaWYgKFRydW5jT3AuZ2V0VmFsdWVUeXBlKCkuYml0c0dUKFZUKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgVHJ1bmNPcCk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIFRydW5jT3ApOworICB9CisKKyAgLy8gRm9sZCAoYWV4dCAoYW5kICh0cnVuYyB4KSwgY3N0KSkgLT4gKGFuZCB4LCBjc3QpCisgIC8vIGlmIHRoZSB0cnVuYyBpcyBub3QgZnJlZS4KKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6QU5EICYmCisgICAgICBOMC5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUgJiYKKyAgICAgIE4wLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJgorICAgICAgIVRMSS5pc1RydW5jYXRlRnJlZShOMC5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldFZhbHVlVHlwZSgpKSkgeworICAgIFNEVmFsdWUgWCA9IE4wLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoWC5nZXRWYWx1ZVR5cGUoKS5iaXRzTFQoVlQpKSB7CisgICAgICBYID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgWCk7CisgICAgfSBlbHNlIGlmIChYLmdldFZhbHVlVHlwZSgpLmJpdHNHVChWVCkpIHsKKyAgICAgIFggPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgWCk7CisgICAgfQorICAgIEFQSW50IE1hc2sgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKS0+Z2V0QVBJbnRWYWx1ZSgpOworICAgIE1hc2suemV4dChWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIFgsIERBRy5nZXRDb25zdGFudChNYXNrLCBWVCkpOworICB9CisKKyAgLy8gZm9sZCAoYWV4dCAobG9hZCB4KSkgLT4gKGFleHQgKHRydW5jYXRlIChleHRsb2FkIHgpKSkKKyAgaWYgKElTRDo6aXNOT05fRVhUTG9hZChOMC5nZXROb2RlKCkpICYmCisgICAgICAoKCFMZWdhbE9wZXJhdGlvbnMgJiYgIWNhc3Q8TG9hZFNETm9kZT4oTjApLT5pc1ZvbGF0aWxlKCkpIHx8CisgICAgICAgVExJLmlzTG9hZEV4dExlZ2FsKElTRDo6RVhUTE9BRCwgTjAuZ2V0VmFsdWVUeXBlKCkpKSkgeworICAgIGJvb2wgRG9YZm9ybSA9IHRydWU7CisgICAgU21hbGxWZWN0b3I8U0ROb2RlKiwgND4gU2V0Q0NzOworICAgIGlmICghTjAuaGFzT25lVXNlKCkpCisgICAgICBEb1hmb3JtID0gRXh0ZW5kVXNlc1RvRm9ybUV4dExvYWQoTiwgTjAsIElTRDo6QU5ZX0VYVEVORCwgU2V0Q0NzLCBUTEkpOworICAgIGlmIChEb1hmb3JtKSB7CisgICAgICBMb2FkU0ROb2RlICpMTjAgPSBjYXN0PExvYWRTRE5vZGU+KE4wKTsKKyAgICAgIFNEVmFsdWUgRXh0TG9hZCA9IERBRy5nZXRFeHRMb2FkKElTRDo6RVhUTE9BRCwgVlQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldENoYWluKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEJhc2VQdHIoKSwgTE4wLT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmlzVm9sYXRpbGUoKSwgTE4wLT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEFsaWdubWVudCgpKTsKKyAgICAgIENvbWJpbmVUbyhOLCBFeHRMb2FkKTsKKyAgICAgIFNEVmFsdWUgVHJ1bmMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBOMC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldFZhbHVlVHlwZSgpLCBFeHRMb2FkKTsKKyAgICAgIENvbWJpbmVUbyhOMC5nZXROb2RlKCksIFRydW5jLCBFeHRMb2FkLmdldFZhbHVlKDEpKTsKKworICAgICAgLy8gRXh0ZW5kIFNldENDIHVzZXMgaWYgbmVjZXNzYXJ5LgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNldENDcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFNETm9kZSAqU2V0Q0MgPSBTZXRDQ3NbaV07CisgICAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDQ+IE9wczsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IDI7ICsraikgeworICAgICAgICAgIFNEVmFsdWUgU09wID0gU2V0Q0MtPmdldE9wZXJhbmQoaik7CisgICAgICAgICAgaWYgKFNPcCA9PSBUcnVuYykKKyAgICAgICAgICAgIE9wcy5wdXNoX2JhY2soRXh0TG9hZCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldERlYnVnTG9jKCksIFZULCBTT3ApKTsKKyAgICAgICAgfQorCisgICAgICAgIE9wcy5wdXNoX2JhY2soU2V0Q0MtPmdldE9wZXJhbmQoMikpOworICAgICAgICBDb21iaW5lVG8oU2V0Q0MsIERBRy5nZXROb2RlKElTRDo6U0VUQ0MsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q0MtPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmT3BzWzBdLCBPcHMuc2l6ZSgpKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBTRFZhbHVlKE4sIDApOyAgIC8vIFJldHVybiBOIHNvIGl0IGRvZXNuJ3QgZ2V0IHJlY2hlY2tlZCEKKyAgICB9CisgIH0KKworICAvLyBmb2xkIChhZXh0ICh6ZXh0bG9hZCB4KSkgLT4gKGFleHQgKHRydW5jYXRlICh6ZXh0bG9hZCB4KSkpCisgIC8vIGZvbGQgKGFleHQgKHNleHRsb2FkIHgpKSAtPiAoYWV4dCAodHJ1bmNhdGUgKHNleHRsb2FkIHgpKSkKKyAgLy8gZm9sZCAoYWV4dCAoIGV4dGxvYWQgeCkpIC0+IChhZXh0ICh0cnVuY2F0ZSAoZXh0bG9hZCAgeCkpKQorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpMT0FEICYmCisgICAgICAhSVNEOjppc05PTl9FWFRMb2FkKE4wLmdldE5vZGUoKSkgJiYgSVNEOjppc1VOSU5ERVhFRExvYWQoTjAuZ2V0Tm9kZSgpKSAmJgorICAgICAgTjAuaGFzT25lVXNlKCkpIHsKKyAgICBMb2FkU0ROb2RlICpMTjAgPSBjYXN0PExvYWRTRE5vZGU+KE4wKTsKKyAgICBFVlQgTWVtVlQgPSBMTjAtPmdldE1lbW9yeVZUKCk7CisgICAgU0RWYWx1ZSBFeHRMb2FkID0gREFHLmdldEV4dExvYWQoTE4wLT5nZXRFeHRlbnNpb25UeXBlKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRDaGFpbigpLCBMTjAtPmdldEJhc2VQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRTcmNWYWx1ZU9mZnNldCgpLCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmlzVm9sYXRpbGUoKSwgTE4wLT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgQ29tYmluZVRvKE4sIEV4dExvYWQpOworICAgIENvbWJpbmVUbyhOMC5nZXROb2RlKCksCisgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIE4wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldFZhbHVlVHlwZSgpLCBFeHRMb2FkKSwKKyAgICAgICAgICAgICAgRXh0TG9hZC5nZXRWYWx1ZSgxKSk7CisgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7ICAgLy8gUmV0dXJuIE4gc28gaXQgZG9lc24ndCBnZXQgcmVjaGVja2VkIQorICB9CisKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6U0VUQ0MpIHsKKyAgICAvLyBhZXh0KHNldGNjKSAtPiBzZXh0X2luX3JlZyh2c2V0Y2MpIGZvciB2ZWN0b3JzLgorICAgIC8vIE9ubHkgZG8gdGhpcyBiZWZvcmUgbGVnYWxpemUgZm9yIG5vdy4KKyAgICBpZiAoVlQuaXNWZWN0b3IoKSAmJiAhTGVnYWxPcGVyYXRpb25zKSB7CisgICAgICBFVlQgTjBWVCA9IE4wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgICAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgIyBlbGVtZW50cyBvZiB0aGUgcmVzdWx0cyBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICAgICAgLy8gIyBlbGVtZW50cyBvZiB0aGUgY29tcGFyZSAoYW5kIHRoZSAjIGVsZW1lbnRzIG9mIHRoZSBjb21wYXJlIHJlc3VsdAorICAgICAgICAvLyBmb3IgdGhhdCBtYXR0ZXIpLiAgQ2hlY2sgdG8gc2VlIHRoYXQgdGhleSBhcmUgdGhlIHNhbWUgc2l6ZS4gIElmIHNvLAorICAgICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGVsZW1lbnQgc2l6ZSBvZiB0aGUgc2V4dCdkIHJlc3VsdCBtYXRjaGVzIHRoZQorICAgICAgICAvLyBlbGVtZW50IHNpemUgb2YgdGhlIGNvbXBhcmUgb3BlcmFuZHMuCisgICAgICBpZiAoVlQuZ2V0U2l6ZUluQml0cygpID09IE4wVlQuZ2V0U2l6ZUluQml0cygpKQorICAgICAgICByZXR1cm4gREFHLmdldFZTZXRDQyhOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25kQ29kZVNETm9kZT4oTjAuZ2V0T3BlcmFuZCgyKSktPmdldCgpKTsKKyAgICAgIC8vIElmIHRoZSBkZXNpcmVkIGVsZW1lbnRzIGFyZSBzbWFsbGVyIG9yIGxhcmdlciB0aGFuIHRoZSBzb3VyY2UKKyAgICAgIC8vIGVsZW1lbnRzIHdlIGNhbiB1c2UgYSBtYXRjaGluZyBpbnRlZ2VyIHZlY3RvciB0eXBlIGFuZCB0aGVuCisgICAgICAvLyB0cnVuY2F0ZS9zaWduIGV4dGVuZAorICAgICAgZWxzZSB7CisgICAgICAgIEVWVCBNYXRjaGluZ0VsZW1lbnRUeXBlID0KKyAgICAgICAgICBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMFZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCkpOworICAgICAgICBFVlQgTWF0Y2hpbmdWZWN0b3JUeXBlID0KKyAgICAgICAgICBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBNYXRjaGluZ0VsZW1lbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTjBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpKTsKKyAgICAgICAgU0RWYWx1ZSBWc2V0Q0MgPQorICAgICAgICAgIERBRy5nZXRWU2V0Q0MoTi0+Z2V0RGVidWdMb2MoKSwgTWF0Y2hpbmdWZWN0b3JUeXBlLCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q29uZENvZGVTRE5vZGU+KE4wLmdldE9wZXJhbmQoMikpLT5nZXQoKSk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0U0V4dE9yVHJ1bmMoVnNldENDLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gYWV4dChzZXRjYyB4LHksY2MpIC0+IHNlbGVjdF9jYyB4LCB5LCAxLCAwLCBjYworICAgIFNEVmFsdWUgU0NDID0KKyAgICAgIFNpbXBsaWZ5U2VsZWN0Q0MoTi0+Z2V0RGVidWdMb2MoKSwgTjAuZ2V0T3BlcmFuZCgwKSwgTjAuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIFZUKSwgREFHLmdldENvbnN0YW50KDAsIFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25kQ29kZVNETm9kZT4oTjAuZ2V0T3BlcmFuZCgyKSktPmdldCgpLCB0cnVlKTsKKyAgICBpZiAoU0NDLmdldE5vZGUoKSkKKyAgICAgIHJldHVybiBTQ0M7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gR2V0RGVtYW5kZWRCaXRzIC0gU2VlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBjYW4gYmUgc2ltcGxpZmllZCB3aXRoIHRoZQorLy8vIGtub3dsZWRnZSB0aGF0IG9ubHkgdGhlIGJpdHMgc3BlY2lmaWVkIGJ5IE1hc2sgYXJlIHVzZWQuICBJZiBzbywgcmV0dXJuIHRoZQorLy8vIHNpbXBsZXIgb3BlcmFuZCwgb3RoZXJ3aXNlIHJldHVybiBhIG51bGwgU0RWYWx1ZS4KK1NEVmFsdWUgREFHQ29tYmluZXI6OkdldERlbWFuZGVkQml0cyhTRFZhbHVlIFYsIGNvbnN0IEFQSW50ICZNYXNrKSB7CisgIHN3aXRjaCAoVi5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6Ok9SOgorICBjYXNlIElTRDo6WE9SOgorICAgIC8vIElmIHRoZSBMSFMgb3IgUkhTIGRvbid0IGNvbnRyaWJ1dGUgYml0cyB0byB0aGUgb3IsIGRyb3AgdGhlbS4KKyAgICBpZiAoREFHLk1hc2tlZFZhbHVlSXNaZXJvKFYuZ2V0T3BlcmFuZCgwKSwgTWFzaykpCisgICAgICByZXR1cm4gVi5nZXRPcGVyYW5kKDEpOworICAgIGlmIChEQUcuTWFza2VkVmFsdWVJc1plcm8oVi5nZXRPcGVyYW5kKDEpLCBNYXNrKSkKKyAgICAgIHJldHVybiBWLmdldE9wZXJhbmQoMCk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTUkw6CisgICAgLy8gT25seSBsb29rIGF0IHNpbmdsZS11c2UgU1JMcy4KKyAgICBpZiAoIVYuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkKKyAgICAgIGJyZWFrOworICAgIGlmIChDb25zdGFudFNETm9kZSAqUkhTQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihWLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAvLyBTZWUgaWYgd2UgY2FuIHJlY3Vyc2l2ZWx5IHNpbXBsaWZ5IHRoZSBMSFMuCisgICAgICB1bnNpZ25lZCBBbXQgPSBSSFNDLT5nZXRaRXh0VmFsdWUoKTsKKworICAgICAgLy8gV2F0Y2ggb3V0IGZvciBzaGlmdCBjb3VudCBvdmVyZmxvdyB0aG91Z2guCisgICAgICBpZiAoQW10ID49IE1hc2suZ2V0Qml0V2lkdGgoKSkgYnJlYWs7CisgICAgICBBUEludCBOZXdNYXNrID0gTWFzayA8PCBBbXQ7CisgICAgICBTRFZhbHVlIFNpbXBsaWZ5TEhTID0gR2V0RGVtYW5kZWRCaXRzKFYuZ2V0T3BlcmFuZCgwKSwgTmV3TWFzayk7CisgICAgICBpZiAoU2ltcGxpZnlMSFMuZ2V0Tm9kZSgpKQorICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTUkwsIFYuZ2V0RGVidWdMb2MoKSwgVi5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsaWZ5TEhTLCBWLmdldE9wZXJhbmQoMSkpOworICAgIH0KKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gUmVkdWNlTG9hZFdpZHRoIC0gSWYgdGhlIHJlc3VsdCBvZiBhIHdpZGVyIGxvYWQgaXMgc2hpZnRlZCB0byByaWdodCBvZiBOCisvLy8gYml0cyBhbmQgdGhlbiB0cnVuY2F0ZWQgdG8gYSBuYXJyb3dlciB0eXBlIGFuZCB3aGVyZSBOIGlzIGEgbXVsdGlwbGUKKy8vLyBvZiBudW1iZXIgb2YgYml0cyBvZiB0aGUgbmFycm93ZXIgdHlwZSwgdHJhbnNmb3JtIGl0IHRvIGEgbmFycm93ZXIgbG9hZAorLy8vIGZyb20gYWRkcmVzcyArIE4gLyBudW0gb2YgYml0cyBvZiBuZXcgdHlwZS4gSWYgdGhlIHJlc3VsdCBpcyB0byBiZQorLy8vIGV4dGVuZGVkLCBhbHNvIGZvbGQgdGhlIGV4dGVuc2lvbiB0byBmb3JtIGEgZXh0ZW5kaW5nIGxvYWQuCitTRFZhbHVlIERBR0NvbWJpbmVyOjpSZWR1Y2VMb2FkV2lkdGgoU0ROb2RlICpOKSB7CisgIHVuc2lnbmVkIE9wYyA9IE4tPmdldE9wY29kZSgpOworCisgIElTRDo6TG9hZEV4dFR5cGUgRXh0VHlwZSA9IElTRDo6Tk9OX0VYVExPQUQ7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBFeHRWVCA9IFZUOworCisgIC8vIFRoaXMgdHJhbnNmb3JtYXRpb24gaXNuJ3QgdmFsaWQgZm9yIHZlY3RvciBsb2Fkcy4KKyAgaWYgKFZULmlzVmVjdG9yKCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAvLyBTcGVjaWFsIGNhc2U6IFNJR05fRVhURU5EX0lOUkVHIGlzIGJhc2ljYWxseSB0cnVuY2F0aW5nIHRvIEV4dFZUIHRoZW4KKyAgLy8gZXh0ZW5kZWQgdG8gVlQuCisgIGlmIChPcGMgPT0gSVNEOjpTSUdOX0VYVEVORF9JTlJFRykgeworICAgIEV4dFR5cGUgPSBJU0Q6OlNFWFRMT0FEOworICAgIEV4dFZUID0gY2FzdDxWVFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldFZUKCk7CisgICAgaWYgKExlZ2FsT3BlcmF0aW9ucyAmJiAhVExJLmlzTG9hZEV4dExlZ2FsKElTRDo6U0VYVExPQUQsIEV4dFZUKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0gZWxzZSBpZiAoT3BjID09IElTRDo6U1JMKSB7CisgICAgLy8gQW5ub3RoZXIgc3BlY2lhbC1jYXNlOiBTUkwgaXMgYmFzaWNhbGx5IHplcm8tZXh0ZW5kaW5nIGEgbmFycm93ZXIKKyAgICAvLyB2YWx1ZS4KKyAgICBFeHRUeXBlID0gSVNEOjpaRVhUTE9BRDsKKyAgICBOMCA9IFNEVmFsdWUoTiwgMCk7CisgICAgQ29uc3RhbnRTRE5vZGUgKk4wMSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoIU4wMSkgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICBFeHRWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlQuZ2V0U2l6ZUluQml0cygpIC0gTjAxLT5nZXRaRXh0VmFsdWUoKSk7CisgIH0KKworICB1bnNpZ25lZCBFVlRCaXRzID0gRXh0VlQuZ2V0U2l6ZUluQml0cygpOworICB1bnNpZ25lZCBTaEFtdCA9IDA7CisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSTCAmJiBOMC5oYXNPbmVVc2UoKSAmJiBFeHRWVC5pc1JvdW5kKCkpIHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKk4wMSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgU2hBbXQgPSBOMDEtPmdldFpFeHRWYWx1ZSgpOworICAgICAgLy8gSXMgdGhlIHNoaWZ0IGFtb3VudCBhIG11bHRpcGxlIG9mIHNpemUgb2YgVlQ/CisgICAgICBpZiAoKFNoQW10ICYgKEVWVEJpdHMtMSkpID09IDApIHsKKyAgICAgICAgTjAgPSBOMC5nZXRPcGVyYW5kKDApOworICAgICAgICAvLyBJcyB0aGUgbG9hZCB3aWR0aCBhIG11bHRpcGxlIG9mIHNpemUgb2YgVlQ/CisgICAgICAgIGlmICgoTjAuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpICYgKEVWVEJpdHMtMSkpICE9IDApCisgICAgICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBEbyBub3QgZ2VuZXJhdGUgbG9hZHMgb2Ygbm9uLXJvdW5kIGludGVnZXIgdHlwZXMgc2luY2UgdGhlc2UgY2FuCisgIC8vIGJlIGV4cGVuc2l2ZSAoYW5kIHdvdWxkIGJlIHdyb25nIGlmIHRoZSB0eXBlIGlzIG5vdCBieXRlIHNpemVkKS4KKyAgaWYgKGlzYTxMb2FkU0ROb2RlPihOMCkgJiYgTjAuaGFzT25lVXNlKCkgJiYgRXh0VlQuaXNSb3VuZCgpICYmCisgICAgICBjYXN0PExvYWRTRE5vZGU+KE4wKS0+Z2V0TWVtb3J5VlQoKS5nZXRTaXplSW5CaXRzKCkgPj0gRVZUQml0cyAmJgorICAgICAgLy8gRG8gbm90IGNoYW5nZSB0aGUgd2lkdGggb2YgYSB2b2xhdGlsZSBsb2FkLgorICAgICAgIWNhc3Q8TG9hZFNETm9kZT4oTjApLT5pc1ZvbGF0aWxlKCkpIHsKKyAgICBMb2FkU0ROb2RlICpMTjAgPSBjYXN0PExvYWRTRE5vZGU+KE4wKTsKKyAgICBFVlQgUHRyVHlwZSA9IE4wLmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCk7CisKKyAgICAvLyBGb3IgYmlnIGVuZGlhbiB0YXJnZXRzLCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgb2Zmc2V0IHRvIHRoZSBwb2ludGVyIHRvCisgICAgLy8gbG9hZCB0aGUgY29ycmVjdCBieXRlcy4KKyAgICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpIHsKKyAgICAgIHVuc2lnbmVkIExWVFN0b3JlQml0cyA9IExOMC0+Z2V0TWVtb3J5VlQoKS5nZXRTdG9yZVNpemVJbkJpdHMoKTsKKyAgICAgIHVuc2lnbmVkIEVWVFN0b3JlQml0cyA9IEV4dFZULmdldFN0b3JlU2l6ZUluQml0cygpOworICAgICAgU2hBbXQgPSBMVlRTdG9yZUJpdHMgLSBFVlRTdG9yZUJpdHMgLSBTaEFtdDsKKyAgICB9CisKKyAgICB1aW50NjRfdCBQdHJPZmYgPSAgU2hBbXQgLyA4OworICAgIHVuc2lnbmVkIE5ld0FsaWduID0gTWluQWxpZ24oTE4wLT5nZXRBbGlnbm1lbnQoKSwgUHRyT2ZmKTsKKyAgICBTRFZhbHVlIE5ld1B0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBMTjAtPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJUeXBlLCBMTjAtPmdldEJhc2VQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChQdHJPZmYsIFB0clR5cGUpKTsKKyAgICBBZGRUb1dvcmtMaXN0KE5ld1B0ci5nZXROb2RlKCkpOworCisgICAgU0RWYWx1ZSBMb2FkID0gKEV4dFR5cGUgPT0gSVNEOjpOT05fRVhUTE9BRCkKKyAgICAgID8gREFHLmdldExvYWQoVlQsIE4wLmdldERlYnVnTG9jKCksIExOMC0+Z2V0Q2hhaW4oKSwgTmV3UHRyLAorICAgICAgICAgICAgICAgICAgICBMTjAtPmdldFNyY1ZhbHVlKCksIExOMC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSArIFB0ck9mZiwKKyAgICAgICAgICAgICAgICAgICAgTE4wLT5pc1ZvbGF0aWxlKCksIExOMC0+aXNOb25UZW1wb3JhbCgpLCBOZXdBbGlnbikKKyAgICAgIDogREFHLmdldEV4dExvYWQoRXh0VHlwZSwgVlQsIE4wLmdldERlYnVnTG9jKCksIExOMC0+Z2V0Q2hhaW4oKSwgTmV3UHRyLAorICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldFNyY1ZhbHVlKCksIExOMC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSArIFB0ck9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgRXh0VlQsIExOMC0+aXNWb2xhdGlsZSgpLCBMTjAtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTmV3QWxpZ24pOworCisgICAgLy8gUmVwbGFjZSB0aGUgb2xkIGxvYWQncyBjaGFpbiB3aXRoIHRoZSBuZXcgbG9hZCdzIGNoYWluLgorICAgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICAgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKE4wLmdldFZhbHVlKDEpLCBMb2FkLmdldFZhbHVlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZWFkTm9kZXMpOworCisgICAgLy8gUmV0dXJuIHRoZSBuZXcgbG9hZGVkIHZhbHVlLgorICAgIHJldHVybiBMb2FkOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRTSUdOX0VYVEVORF9JTlJFRyhTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBFVlQgPSBjYXN0PFZUU0ROb2RlPihOMSktPmdldFZUKCk7CisgIHVuc2lnbmVkIFZUQml0cyA9IFZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIEVWVEJpdHMgPSBFVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKworICAvLyBmb2xkIChzZXh0X2luX3JlZyBjMSkgLT4gYzEKKyAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oTjApIHx8IE4wLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwgTjEpOworCisgIC8vIElmIHRoZSBpbnB1dCBpcyBhbHJlYWR5IHNpZ24gZXh0ZW5kZWQsIGp1c3QgZHJvcCB0aGUgZXh0ZW5zaW9uLgorICBpZiAoREFHLkNvbXB1dGVOdW1TaWduQml0cyhOMCkgPj0gVlRCaXRzLUVWVEJpdHMrMSkKKyAgICByZXR1cm4gTjA7CisKKyAgLy8gZm9sZCAoc2V4dF9pbl9yZWcgKHNleHRfaW5fcmVnIHgsIFZUMiksIFZUMSkgLT4gKHNleHRfaW5fcmVnIHgsIG1pblZUKSBwdDIKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6U0lHTl9FWFRFTkRfSU5SRUcgJiYKKyAgICAgIEVWVC5iaXRzTFQoY2FzdDxWVFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgxKSktPmdldFZUKCkpKSB7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLCBOMSk7CisgIH0KKworICAvLyBmb2xkIChzZXh0X2luX3JlZyAoc2V4dCB4KSkgLT4gKHNleHQgeCkKKyAgLy8gZm9sZCAoc2V4dF9pbl9yZWcgKGFleHQgeCkpIC0+IChzZXh0IHgpCisgIC8vIGlmIHggaXMgc21hbGwgZW5vdWdoLgorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSUdOX0VYVEVORCB8fCBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFOWV9FWFRFTkQpIHsKKyAgICBTRFZhbHVlIE4wMCA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgaWYgKE4wMC5nZXRWYWx1ZVR5cGUoKS5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpIDw9IEVWVEJpdHMgJiYKKyAgICAgICAgKCFMZWdhbE9wZXJhdGlvbnMgfHwgVExJLmlzT3BlcmF0aW9uTGVnYWwoSVNEOjpTSUdOX0VYVEVORCwgVlQpKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAwLCBOMSk7CisgIH0KKworICAvLyBmb2xkIChzZXh0X2luX3JlZyB4KSAtPiAoemV4dF9pbl9yZWcgeCkgaWYgdGhlIHNpZ24gYml0IGlzIGtub3duIHplcm8uCisgIGlmIChEQUcuTWFza2VkVmFsdWVJc1plcm8oTjAsIEFQSW50OjpnZXRCaXRzU2V0KFZUQml0cywgRVZUQml0cy0xLCBFVlRCaXRzKSkpCisgICAgcmV0dXJuIERBRy5nZXRaZXJvRXh0ZW5kSW5SZWcoTjAsIE4tPmdldERlYnVnTG9jKCksIEVWVCk7CisKKyAgLy8gZm9sZCBvcGVyYW5kcyBvZiBzZXh0X2luX3JlZyBiYXNlZCBvbiBrbm93bGVkZ2UgdGhhdCB0aGUgdG9wIGJpdHMgYXJlIG5vdAorICAvLyBkZW1hbmRlZC4KKyAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKFNEVmFsdWUoTiwgMCkpKQorICAgIHJldHVybiBTRFZhbHVlKE4sIDApOworCisgIC8vIGZvbGQgKHNleHRfaW5fcmVnIChsb2FkIHgpKSAtPiAoc21hbGxlciBzZXh0bG9hZCB4KQorICAvLyBmb2xkIChzZXh0X2luX3JlZyAoc3JsIChsb2FkIHgpLCBjKSkgLT4gKHNtYWxsZXIgc2V4dGxvYWQgKHgrYy9ldnRiaXRzKSkKKyAgU0RWYWx1ZSBOYXJyb3dMb2FkID0gUmVkdWNlTG9hZFdpZHRoKE4pOworICBpZiAoTmFycm93TG9hZC5nZXROb2RlKCkpCisgICAgcmV0dXJuIE5hcnJvd0xvYWQ7CisKKyAgLy8gZm9sZCAoc2V4dF9pbl9yZWcgKHNybCBYLCAyNCksIGk4KSAtPiAoc3JhIFgsIDI0KQorICAvLyBmb2xkIChzZXh0X2luX3JlZyAoc3JsIFgsIDIzKSwgaTgpIC0+IChzcmEgWCwgMjMpIGlmZiBwb3NzaWJsZS4KKyAgLy8gV2UgYWxyZWFkeSBmb2xkICIoc2V4dF9pbl9yZWcgKHNybCBYLCAyNSksIGk4KSAtPiBzcmwgWCwgMjUiIGFib3ZlLgorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkwpIHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlNoQW10ID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpKQorICAgICAgaWYgKFNoQW10LT5nZXRaRXh0VmFsdWUoKStFVlRCaXRzIDw9IFZUQml0cykgeworICAgICAgICAvLyBXZSBjYW4gdHVybiB0aGlzIGludG8gYW4gU1JBIGlmZiB0aGUgaW5wdXQgdG8gdGhlIFNSTCBpcyBhbHJlYWR5IHNpZ24KKyAgICAgICAgLy8gZXh0ZW5kZWQgZW5vdWdoLgorICAgICAgICB1bnNpZ25lZCBJblNpZ25CaXRzID0gREFHLkNvbXB1dGVOdW1TaWduQml0cyhOMC5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgaWYgKFZUQml0cy0oU2hBbXQtPmdldFpFeHRWYWx1ZSgpK0VWVEJpdHMpIDwgSW5TaWduQml0cykKKyAgICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTUkEsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLCBOMC5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIH0KKyAgfQorCisgIC8vIGZvbGQgKHNleHRfaW5yZWcgKGV4dGxvYWQgeCkpIC0+IChzZXh0bG9hZCB4KQorICBpZiAoSVNEOjppc0VYVExvYWQoTjAuZ2V0Tm9kZSgpKSAmJgorICAgICAgSVNEOjppc1VOSU5ERVhFRExvYWQoTjAuZ2V0Tm9kZSgpKSAmJgorICAgICAgRVZUID09IGNhc3Q8TG9hZFNETm9kZT4oTjApLT5nZXRNZW1vcnlWVCgpICYmCisgICAgICAoKCFMZWdhbE9wZXJhdGlvbnMgJiYgIWNhc3Q8TG9hZFNETm9kZT4oTjApLT5pc1ZvbGF0aWxlKCkpIHx8CisgICAgICAgVExJLmlzTG9hZEV4dExlZ2FsKElTRDo6U0VYVExPQUQsIEVWVCkpKSB7CisgICAgTG9hZFNETm9kZSAqTE4wID0gY2FzdDxMb2FkU0ROb2RlPihOMCk7CisgICAgU0RWYWx1ZSBFeHRMb2FkID0gREFHLmdldEV4dExvYWQoSVNEOjpTRVhUTE9BRCwgVlQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRDaGFpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0QmFzZVB0cigpLCBMTjAtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRTcmNWYWx1ZU9mZnNldCgpLCBFVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5pc1ZvbGF0aWxlKCksIExOMC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0QWxpZ25tZW50KCkpOworICAgIENvbWJpbmVUbyhOLCBFeHRMb2FkKTsKKyAgICBDb21iaW5lVG8oTjAuZ2V0Tm9kZSgpLCBFeHRMb2FkLCBFeHRMb2FkLmdldFZhbHVlKDEpKTsKKyAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsgICAvLyBSZXR1cm4gTiBzbyBpdCBkb2Vzbid0IGdldCByZWNoZWNrZWQhCisgIH0KKyAgLy8gZm9sZCAoc2V4dF9pbnJlZyAoemV4dGxvYWQgeCkpIC0+IChzZXh0bG9hZCB4KSBpZmYgbG9hZCBoYXMgb25lIHVzZQorICBpZiAoSVNEOjppc1pFWFRMb2FkKE4wLmdldE5vZGUoKSkgJiYgSVNEOjppc1VOSU5ERVhFRExvYWQoTjAuZ2V0Tm9kZSgpKSAmJgorICAgICAgTjAuaGFzT25lVXNlKCkgJiYKKyAgICAgIEVWVCA9PSBjYXN0PExvYWRTRE5vZGU+KE4wKS0+Z2V0TWVtb3J5VlQoKSAmJgorICAgICAgKCghTGVnYWxPcGVyYXRpb25zICYmICFjYXN0PExvYWRTRE5vZGU+KE4wKS0+aXNWb2xhdGlsZSgpKSB8fAorICAgICAgIFRMSS5pc0xvYWRFeHRMZWdhbChJU0Q6OlNFWFRMT0FELCBFVlQpKSkgeworICAgIExvYWRTRE5vZGUgKkxOMCA9IGNhc3Q8TG9hZFNETm9kZT4oTjApOworICAgIFNEVmFsdWUgRXh0TG9hZCA9IERBRy5nZXRFeHRMb2FkKElTRDo6U0VYVExPQUQsIFZULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0Q2hhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEJhc2VQdHIoKSwgTE4wLT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwgRVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+aXNWb2xhdGlsZSgpLCBMTjAtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEFsaWdubWVudCgpKTsKKyAgICBDb21iaW5lVG8oTiwgRXh0TG9hZCk7CisgICAgQ29tYmluZVRvKE4wLmdldE5vZGUoKSwgRXh0TG9hZCwgRXh0TG9hZC5nZXRWYWx1ZSgxKSk7CisgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7ICAgLy8gUmV0dXJuIE4gc28gaXQgZG9lc24ndCBnZXQgcmVjaGVja2VkIQorICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0VFJVTkNBVEUoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gbm9vcCB0cnVuY2F0ZQorICBpZiAoTjAuZ2V0VmFsdWVUeXBlKCkgPT0gTi0+Z2V0VmFsdWVUeXBlKDApKQorICAgIHJldHVybiBOMDsKKyAgLy8gZm9sZCAodHJ1bmNhdGUgYzEpIC0+IGMxCisgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE4wKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wKTsKKyAgLy8gZm9sZCAodHJ1bmNhdGUgKHRydW5jYXRlIHgpKSAtPiAodHJ1bmNhdGUgeCkKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMC5nZXRPcGVyYW5kKDApKTsKKyAgLy8gZm9sZCAodHJ1bmNhdGUgKGV4dCB4KSkgLT4gKGV4dCB4KSBvciAodHJ1bmNhdGUgeCkgb3IgeAorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpaRVJPX0VYVEVORCB8fAorICAgICAgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSUdOX0VYVEVORCB8fAorICAgICAgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTllfRVhURU5EKSB7CisgICAgaWYgKE4wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuYml0c0xUKFZUKSkKKyAgICAgIC8vIGlmIHRoZSBzb3VyY2UgaXMgc21hbGxlciB0aGFuIHRoZSBkZXN0LCB3ZSBzdGlsbCBuZWVkIGFuIGV4dGVuZAorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKE4wLmdldE9wY29kZSgpLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApKTsKKyAgICBlbHNlIGlmIChOMC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLmJpdHNHVChWVCkpCisgICAgICAvLyBpZiB0aGUgc291cmNlIGlzIGxhcmdlciB0aGFuIHRoZSBkZXN0LCB0aGFuIHdlIGp1c3QgbmVlZCB0aGUgdHJ1bmNhdGUKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSk7CisgICAgZWxzZQorICAgICAgLy8gaWYgdGhlIHNvdXJjZSBhbmQgZGVzdCBhcmUgdGhlIHNhbWUgdHlwZSwgd2UgY2FuIGRyb3AgYm90aCB0aGUgZXh0ZW5kCisgICAgICAvLyBhbmQgdGhlIHRydW5jYXRlLgorICAgICAgcmV0dXJuIE4wLmdldE9wZXJhbmQoMCk7CisgIH0KKworICAvLyBTZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IHRoZSBpbnB1dCB0byB0aGlzIHRydW5jYXRlIHRocm91Z2gga25vd2xlZGdlIHRoYXQKKyAgLy8gb25seSB0aGUgbG93IGJpdHMgYXJlIGJlaW5nIHVzZWQuICBGb3IgZXhhbXBsZSAidHJ1bmMgKG9yIChzaGwgeCwgOCksIHkpIgorICAvLyAtPiB0cnVuYyB5CisgIFNEVmFsdWUgU2hvcnRlciA9CisgICAgR2V0RGVtYW5kZWRCaXRzKE4wLCBBUEludDo6Z2V0TG93Qml0c1NldChOMC5nZXRWYWx1ZVNpemVJbkJpdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULmdldFNpemVJbkJpdHMoKSkpOworICBpZiAoU2hvcnRlci5nZXROb2RlKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIE4tPmdldERlYnVnTG9jKCksIFZULCBTaG9ydGVyKTsKKworICAvLyBmb2xkICh0cnVuY2F0ZSAobG9hZCB4KSkgLT4gKHNtYWxsZXIgbG9hZCB4KQorICAvLyBmb2xkICh0cnVuY2F0ZSAoc3JsIChsb2FkIHgpLCBjKSkgLT4gKHNtYWxsZXIgbG9hZCAoeCtjL2V2dGJpdHMpKQorICBpZiAoIUxlZ2FsVHlwZXMgfHwgVExJLmlzVHlwZURlc2lyYWJsZUZvck9wKE4wLmdldE9wY29kZSgpLCBWVCkpIHsKKyAgICBTRFZhbHVlIFJlZHVjZWQgPSBSZWR1Y2VMb2FkV2lkdGgoTik7CisgICAgaWYgKFJlZHVjZWQuZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIFJlZHVjZWQ7CisgIH0KKworICAvLyBTaW1wbGlmeSB0aGUgb3BlcmFuZHMgdXNpbmcgZGVtYW5kZWQtYml0cyBpbmZvcm1hdGlvbi4KKyAgaWYgKCFWVC5pc1ZlY3RvcigpICYmCisgICAgICBTaW1wbGlmeURlbWFuZGVkQml0cyhTRFZhbHVlKE4sIDApKSkKKyAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitzdGF0aWMgU0ROb2RlICpnZXRCdWlsZFBhaXJFbHQoU0ROb2RlICpOLCB1bnNpZ25lZCBpKSB7CisgIFNEVmFsdWUgRWx0ID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgaWYgKEVsdC5nZXRPcGNvZGUoKSAhPSBJU0Q6Ok1FUkdFX1ZBTFVFUykKKyAgICByZXR1cm4gRWx0LmdldE5vZGUoKTsKKyAgcmV0dXJuIEVsdC5nZXRPcGVyYW5kKEVsdC5nZXRSZXNObygpKS5nZXROb2RlKCk7Cit9CisKKy8vLyBDb21iaW5lQ29uc2VjdXRpdmVMb2FkcyAtIGJ1aWxkX3BhaXIgKGxvYWQsIGxvYWQpIC0+IGxvYWQKKy8vLyBpZiBsb2FkIGxvY2F0aW9ucyBhcmUgY29uc2VjdXRpdmUuCitTRFZhbHVlIERBR0NvbWJpbmVyOjpDb21iaW5lQ29uc2VjdXRpdmVMb2FkcyhTRE5vZGUgKk4sIEVWVCBWVCkgeworICBhc3NlcnQoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9QQUlSKTsKKworICBMb2FkU0ROb2RlICpMRDEgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihnZXRCdWlsZFBhaXJFbHQoTiwgMCkpOworICBMb2FkU0ROb2RlICpMRDIgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihnZXRCdWlsZFBhaXJFbHQoTiwgMSkpOworICBpZiAoIUxEMSB8fCAhTEQyIHx8ICFJU0Q6OmlzTk9OX0VYVExvYWQoTEQxKSB8fCAhTEQxLT5oYXNPbmVVc2UoKSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICBFVlQgTEQxVlQgPSBMRDEtPmdldFZhbHVlVHlwZSgwKTsKKworICBpZiAoSVNEOjppc05PTl9FWFRMb2FkKExEMikgJiYKKyAgICAgIExEMi0+aGFzT25lVXNlKCkgJiYKKyAgICAgIC8vIElmIGJvdGggYXJlIHZvbGF0aWxlIHRoaXMgd291bGQgcmVkdWNlIHRoZSBudW1iZXIgb2Ygdm9sYXRpbGUgbG9hZHMuCisgICAgICAvLyBJZiBvbmUgaXMgdm9sYXRpbGUgaXQgbWlnaHQgYmUgb2ssIGJ1dCBwbGF5IGNvbnNlcnZhdGl2ZSBhbmQgYmFpbCBvdXQuCisgICAgICAhTEQxLT5pc1ZvbGF0aWxlKCkgJiYKKyAgICAgICFMRDItPmlzVm9sYXRpbGUoKSAmJgorICAgICAgREFHLmlzQ29uc2VjdXRpdmVMb2FkKExEMiwgTEQxLCBMRDFWVC5nZXRTaXplSW5CaXRzKCkvOCwgMSkpIHsKKyAgICB1bnNpZ25lZCBBbGlnbiA9IExEMS0+Z2V0QWxpZ25tZW50KCk7CisgICAgdW5zaWduZWQgTmV3QWxpZ24gPSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT4KKyAgICAgIGdldEFCSVR5cGVBbGlnbm1lbnQoVlQuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSkpOworCisgICAgaWYgKE5ld0FsaWduIDw9IEFsaWduICYmCisgICAgICAgICghTGVnYWxPcGVyYXRpb25zIHx8IFRMSS5pc09wZXJhdGlvbkxlZ2FsKElTRDo6TE9BRCwgVlQpKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0TG9hZChWVCwgTi0+Z2V0RGVidWdMb2MoKSwgTEQxLT5nZXRDaGFpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIExEMS0+Z2V0QmFzZVB0cigpLCBMRDEtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTEQxLT5nZXRTcmNWYWx1ZU9mZnNldCgpLCBmYWxzZSwgZmFsc2UsIEFsaWduKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0QklUX0NPTlZFUlQoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gSWYgdGhlIGlucHV0IGlzIGEgQlVJTERfVkVDVE9SIHdpdGggYWxsIGNvbnN0YW50IGVsZW1lbnRzLCBmb2xkIHRoaXMgbm93LgorICAvLyBPbmx5IGRvIHRoaXMgYmVmb3JlIGxlZ2FsaXplLCBzaW5jZSBhZnRlcndhcmQgdGhlIHRhcmdldCBtYXkgYmUgZGVwZW5kaW5nCisgIC8vIG9uIHRoZSBiaXRjb252ZXJ0LgorICAvLyBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbGwgY29uc3RhbnQuCisgIGlmICghTGVnYWxUeXBlcyAmJgorICAgICAgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IgJiYgTjAuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSAmJgorICAgICAgVlQuaXNWZWN0b3IoKSkgeworICAgIGJvb2wgaXNTaW1wbGUgPSB0cnVlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOMC5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChOMC5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpICE9IElTRDo6VU5ERUYgJiYKKyAgICAgICAgICBOMC5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpICE9IElTRDo6Q29uc3RhbnQgJiYKKyAgICAgICAgICBOMC5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpICE9IElTRDo6Q29uc3RhbnRGUCkgeworICAgICAgICBpc1NpbXBsZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIEVWVCBEZXN0RWx0VlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICBhc3NlcnQoIURlc3RFbHRWVC5pc1ZlY3RvcigpICYmCisgICAgICAgICAgICJFbGVtZW50IHR5cGUgb2YgdmVjdG9yIFZhbHVlVHlwZSBtdXN0IG5vdCBiZSB2ZWN0b3IhIik7CisgICAgaWYgKGlzU2ltcGxlKQorICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZEJJVF9DT05WRVJUb2ZCVUlMRF9WRUNUT1IoTjAuZ2V0Tm9kZSgpLCBEZXN0RWx0VlQpOworICB9CisKKyAgLy8gSWYgdGhlIGlucHV0IGlzIGEgY29uc3RhbnQsIGxldCBnZXROb2RlIGZvbGQgaXQuCisgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE4wKSB8fCBpc2E8Q29uc3RhbnRGUFNETm9kZT4oTjApKSB7CisgICAgU0RWYWx1ZSBSZXMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjApOworICAgIGlmIChSZXMuZ2V0Tm9kZSgpICE9IE4pIHsKKyAgICAgIGlmICghTGVnYWxPcGVyYXRpb25zIHx8CisgICAgICAgICAgVExJLmlzT3BlcmF0aW9uTGVnYWwoUmVzLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCksIFZUKSkKKyAgICAgICAgcmV0dXJuIFJlczsKKworICAgICAgLy8gRm9sZGluZyBpdCByZXN1bHRlZCBpbiBhbiBpbGxlZ2FsIG5vZGUsIGFuZCBpdCdzIHRvbyBsYXRlIHRvCisgICAgICAvLyBkbyB0aGF0LiBDbGVhbiB1cCB0aGUgb2xkIG5vZGUgYW5kIGZvcmVnbyB0aGUgdHJhbnNmb3JtYXRpb24uCisgICAgICAvLyBJZGVhbGx5IHRoaXMgd29uJ3QgaGFwcGVuIHZlcnkgb2Z0ZW4sIGJlY2F1c2UgaW5zdGNvbWJpbmUKKyAgICAgIC8vIGFuZCB0aGUgZWFybGllciBkYWdjb21iaW5lIHJ1bnMgKHdoZXJlIGlsbGVnYWwgbm9kZXMgYXJlCisgICAgICAvLyBwZXJtaXR0ZWQpIHNob3VsZCBoYXZlIGZvbGRlZCBtb3N0IG9mIHRoZW0gYWxyZWFkeS4KKyAgICAgIERBRy5EZWxldGVOb2RlKFJlcy5nZXROb2RlKCkpOworICAgIH0KKyAgfQorCisgIC8vIChjb252IChjb252IHgsIHQxKSwgdDIpIC0+IChjb252IHgsIHQyKQorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCSVRfQ09OVkVSVCkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCkpOworCisgIC8vIGZvbGQgKGNvbnYgKGxvYWQgeCkpIC0+IChsb2FkIChjb252Kil4KQorICAvLyBJZiB0aGUgcmVzdWx0YW50IGxvYWQgZG9lc24ndCBuZWVkIGEgaGlnaGVyIGFsaWdubWVudCB0aGFuIHRoZSBvcmlnaW5hbCEKKyAgaWYgKElTRDo6aXNOb3JtYWxMb2FkKE4wLmdldE5vZGUoKSkgJiYgTjAuaGFzT25lVXNlKCkgJiYKKyAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIHdpZHRoIG9mIGEgdm9sYXRpbGUgbG9hZC4KKyAgICAgICFjYXN0PExvYWRTRE5vZGU+KE4wKS0+aXNWb2xhdGlsZSgpICYmCisgICAgICAoIUxlZ2FsT3BlcmF0aW9ucyB8fCBUTEkuaXNPcGVyYXRpb25MZWdhbChJU0Q6OkxPQUQsIFZUKSkpIHsKKyAgICBMb2FkU0ROb2RlICpMTjAgPSBjYXN0PExvYWRTRE5vZGU+KE4wKTsKKyAgICB1bnNpZ25lZCBBbGlnbiA9IFRMSS5nZXRUYXJnZXREYXRhKCktPgorICAgICAgZ2V0QUJJVHlwZUFsaWdubWVudChWVC5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKSk7CisgICAgdW5zaWduZWQgT3JpZ0FsaWduID0gTE4wLT5nZXRBbGlnbm1lbnQoKTsKKworICAgIGlmIChBbGlnbiA8PSBPcmlnQWxpZ24pIHsKKyAgICAgIFNEVmFsdWUgTG9hZCA9IERBRy5nZXRMb2FkKFZULCBOLT5nZXREZWJ1Z0xvYygpLCBMTjAtPmdldENoYWluKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldEJhc2VQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0U3JjVmFsdWUoKSwgTE4wLT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5pc1ZvbGF0aWxlKCksIExOMC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZ0FsaWduKTsKKyAgICAgIEFkZFRvV29ya0xpc3QoTik7CisgICAgICBDb21iaW5lVG8oTjAuZ2V0Tm9kZSgpLAorICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIE4wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCksIExvYWQpLAorICAgICAgICAgICAgICAgIExvYWQuZ2V0VmFsdWUoMSkpOworICAgICAgcmV0dXJuIExvYWQ7CisgICAgfQorICB9CisKKyAgLy8gZm9sZCAoYml0Y29udmVydCAoZm5lZyB4KSkgLT4gKHhvciAoYml0Y29udmVydCB4KSwgc2lnbmJpdCkKKyAgLy8gZm9sZCAoYml0Y29udmVydCAoZmFicyB4KSkgLT4gKGFuZCAoYml0Y29udmVydCB4KSwgKG5vdCBzaWduYml0KSkKKyAgLy8gVGhpcyBvZnRlbiByZWR1Y2VzIGNvbnN0YW50IHBvb2wgbG9hZHMuCisgIGlmICgoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGTkVHIHx8IE4wLmdldE9wY29kZSgpID09IElTRDo6RkFCUykgJiYKKyAgICAgIE4wLmdldE5vZGUoKS0+aGFzT25lVXNlKCkgJiYgVlQuaXNJbnRlZ2VyKCkgJiYgIVZULmlzVmVjdG9yKCkpIHsKKyAgICBTRFZhbHVlIE5ld0NvbnYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBOMC5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApKTsKKyAgICBBZGRUb1dvcmtMaXN0KE5ld0NvbnYuZ2V0Tm9kZSgpKTsKKworICAgIEFQSW50IFNpZ25CaXQgPSBBUEludDo6Z2V0U2lnbkJpdChWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZORUcpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpYT1IsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0NvbnYsIERBRy5nZXRDb25zdGFudChTaWduQml0LCBWVCkpOworICAgIGFzc2VydChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZBQlMpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIE5ld0NvbnYsIERBRy5nZXRDb25zdGFudCh+U2lnbkJpdCwgVlQpKTsKKyAgfQorCisgIC8vIGZvbGQgKGJpdGNvbnZlcnQgKGZjb3B5c2lnbiBjc3QsIHgpKSAtPgorICAvLyAgICAgICAgIChvciAoYW5kIChiaXRjb252ZXJ0IHgpLCBzaWduKSwgKGFuZCBjc3QsIChub3Qgc2lnbikpKQorICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgaGFuZGxlIChjb3B5c2lnbiB4LCBjc3QpIGJlY2F1c2UgdGhpcyBjYW4gYWx3YXlzIGJlCisgIC8vIGZvbGRlZCB0byBhbiBmbmVnIG9yIGZhYnMuCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZDT1BZU0lHTiAmJiBOMC5nZXROb2RlKCktPmhhc09uZVVzZSgpICYmCisgICAgICBpc2E8Q29uc3RhbnRGUFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgIFZULmlzSW50ZWdlcigpICYmICFWVC5pc1ZlY3RvcigpKSB7CisgICAgdW5zaWduZWQgT3JpZ1hXaWR0aCA9IE4wLmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgIEVWVCBJbnRYVlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgT3JpZ1hXaWR0aCk7CisgICAgaWYgKGlzVHlwZUxlZ2FsKEludFhWVCkpIHsKKyAgICAgIFNEVmFsdWUgWCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIE4wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRYVlQsIE4wLmdldE9wZXJhbmQoMSkpOworICAgICAgQWRkVG9Xb3JrTGlzdChYLmdldE5vZGUoKSk7CisKKyAgICAgIC8vIElmIFggaGFzIGEgZGlmZmVyZW50IHdpZHRoIHRoYW4gdGhlIHJlc3VsdC9saHMsIHNleHQgaXQgb3IgdHJ1bmNhdGUgaXQuCisgICAgICB1bnNpZ25lZCBWVFdpZHRoID0gVlQuZ2V0U2l6ZUluQml0cygpOworICAgICAgaWYgKE9yaWdYV2lkdGggPCBWVFdpZHRoKSB7CisgICAgICAgIFggPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgWCk7CisgICAgICAgIEFkZFRvV29ya0xpc3QoWC5nZXROb2RlKCkpOworICAgICAgfSBlbHNlIGlmIChPcmlnWFdpZHRoID4gVlRXaWR0aCkgeworICAgICAgICAvLyBUbyBnZXQgdGhlIHNpZ24gYml0IGluIHRoZSByaWdodCBwbGFjZSwgd2UgaGF2ZSB0byBzaGlmdCBpdCByaWdodAorICAgICAgICAvLyBiZWZvcmUgdHJ1bmNhdGluZy4KKyAgICAgICAgWCA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBYLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICBYLmdldFZhbHVlVHlwZSgpLCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE9yaWdYV2lkdGgtVlRXaWR0aCwgWC5nZXRWYWx1ZVR5cGUoKSkpOworICAgICAgICBBZGRUb1dvcmtMaXN0KFguZ2V0Tm9kZSgpKTsKKyAgICAgICAgWCA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIFguZ2V0RGVidWdMb2MoKSwgVlQsIFgpOworICAgICAgICBBZGRUb1dvcmtMaXN0KFguZ2V0Tm9kZSgpKTsKKyAgICAgIH0KKworICAgICAgQVBJbnQgU2lnbkJpdCA9IEFQSW50OjpnZXRTaWduQml0KFZULmdldFNpemVJbkJpdHMoKSk7CisgICAgICBYID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIFguZ2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgWCwgREFHLmdldENvbnN0YW50KFNpZ25CaXQsIFZUKSk7CisgICAgICBBZGRUb1dvcmtMaXN0KFguZ2V0Tm9kZSgpKTsKKworICAgICAgU0RWYWx1ZSBDc3QgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBOMC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVCwgTjAuZ2V0T3BlcmFuZCgwKSk7CisgICAgICBDc3QgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgQ3N0LmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgQ3N0LCBEQUcuZ2V0Q29uc3RhbnQoflNpZ25CaXQsIFZUKSk7CisgICAgICBBZGRUb1dvcmtMaXN0KENzdC5nZXROb2RlKCkpOworCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpPUiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIFgsIENzdCk7CisgICAgfQorICB9CisKKyAgLy8gYml0Y29udmVydChidWlsZF9wYWlyKGxkLCBsZCkpIC0+IGxkIGlmZiBsb2FkIGxvY2F0aW9ucyBhcmUgY29uc2VjdXRpdmUuCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJVSUxEX1BBSVIpIHsKKyAgICBTRFZhbHVlIENvbWJpbmVMRCA9IENvbWJpbmVDb25zZWN1dGl2ZUxvYWRzKE4wLmdldE5vZGUoKSwgVlQpOworICAgIGlmIChDb21iaW5lTEQuZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIENvbWJpbmVMRDsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0QlVJTERfUEFJUihTRE5vZGUgKk4pIHsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICByZXR1cm4gQ29tYmluZUNvbnNlY3V0aXZlTG9hZHMoTiwgVlQpOworfQorCisvLy8gQ29uc3RhbnRGb2xkQklUX0NPTlZFUlRvZkJVSUxEX1ZFQ1RPUiAtIFdlIGtub3cgdGhhdCBCViBpcyBhIGJ1aWxkX3ZlY3RvcgorLy8vIG5vZGUgd2l0aCBDb25zdGFudCwgQ29uc3RhbnRGUCBvciBVbmRlZiBvcGVyYW5kcy4gIERzdEVsdFZUIGluZGljYXRlcyB0aGUKKy8vLyBkZXN0aW5hdGlvbiBlbGVtZW50IHZhbHVlIHR5cGUuCitTRFZhbHVlIERBR0NvbWJpbmVyOjoKK0NvbnN0YW50Rm9sZEJJVF9DT05WRVJUb2ZCVUlMRF9WRUNUT1IoU0ROb2RlICpCViwgRVZUIERzdEVsdFZUKSB7CisgIEVWVCBTcmNFbHRWVCA9IEJWLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKworICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgdGhlIHJpZ2h0IHR5cGUsIHdlJ3JlIGRvbmUuCisgIGlmIChTcmNFbHRWVCA9PSBEc3RFbHRWVCkgcmV0dXJuIFNEVmFsdWUoQlYsIDApOworCisgIHVuc2lnbmVkIFNyY0JpdFNpemUgPSBTcmNFbHRWVC5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIERzdEJpdFNpemUgPSBEc3RFbHRWVC5nZXRTaXplSW5CaXRzKCk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIGNvbnZlcnNpb24gb2YgTiBlbGVtZW50cyBvZiBvbmUgdHlwZSB0byBOIGVsZW1lbnRzIG9mIGFub3RoZXIKKyAgLy8gdHlwZSwgY29udmVydCBlYWNoIGVsZW1lbnQuICBUaGlzIGhhbmRsZXMgRlA8LT5JTlQgY2FzZXMuCisgIGlmIChTcmNCaXRTaXplID09IERzdEJpdFNpemUpIHsKKyAgICBFVlQgVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBEc3RFbHRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJWLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSk7CisKKyAgICAvLyBEdWUgdG8gdGhlIEZQIGVsZW1lbnQgaGFuZGxpbmcgYmVsb3cgY2FsbGluZyB0aGlzIHJvdXRpbmUgcmVjdXJzaXZlbHksCisgICAgLy8gd2UgY2FuIGVuZCB1cCB3aXRoIGEgc2NhbGFyLXRvLXZlY3RvciBub2RlIGhlcmUuCisgICAgaWYgKEJWLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNDQUxBUl9UT19WRUNUT1IpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBCVi0+Z2V0RGVidWdMb2MoKSwgVlQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIEJWLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERzdEVsdFZULCBCVi0+Z2V0T3BlcmFuZCgwKSkpOworICAgICAgCisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCVi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFNEVmFsdWUgT3AgPSBCVi0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIC8vIElmIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlIGlzIG5vdCBsZWdhbCwgdGhlIEJVSUxEX1ZFQ1RPUiBvcGVyYW5kcworICAgICAgLy8gYXJlIHByb21vdGVkIGFuZCBpbXBsaWNpdGx5IHRydW5jYXRlZC4gIE1ha2UgdGhhdCBleHBsaWNpdCBoZXJlLgorICAgICAgaWYgKE9wLmdldFZhbHVlVHlwZSgpICE9IFNyY0VsdFZUKQorICAgICAgICBPcCA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIEJWLT5nZXREZWJ1Z0xvYygpLCBTcmNFbHRWVCwgT3ApOworICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBCVi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0RWx0VlQsIE9wKSk7CisgICAgICBBZGRUb1dvcmtMaXN0KE9wcy5iYWNrKCkuZ2V0Tm9kZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBCVi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICZPcHNbMF0sIE9wcy5zaXplKCkpOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBncm93aW5nIG9yIHNocmlua2luZyB0aGUgZWxlbWVudHMuICBUbyBhdm9pZCBoYXZpbmcgdG8KKyAgLy8gaGFuZGxlIGFubm95aW5nIGRldGFpbHMgb2YgZ3Jvd2luZy9zaHJpbmtpbmcgRlAgdmFsdWVzLCB3ZSBjb252ZXJ0IHRoZW0gdG8KKyAgLy8gaW50IGZpcnN0LgorICBpZiAoU3JjRWx0VlQuaXNGbG9hdGluZ1BvaW50KCkpIHsKKyAgICAvLyBDb252ZXJ0IHRoZSBpbnB1dCBmbG9hdCB2ZWN0b3IgdG8gYSBpbnQgdmVjdG9yIHdoZXJlIHRoZSBlbGVtZW50cyBhcmUgdGhlCisgICAgLy8gc2FtZSBzaXplcy4KKyAgICBhc3NlcnQoKFNyY0VsdFZUID09IE1WVDo6ZjMyIHx8IFNyY0VsdFZUID09IE1WVDo6ZjY0KSAmJiAiVW5rbm93biBGUCBWVCEiKTsKKyAgICBFVlQgSW50VlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgU3JjRWx0VlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgICBCViA9IENvbnN0YW50Rm9sZEJJVF9DT05WRVJUb2ZCVUlMRF9WRUNUT1IoQlYsIEludFZUKS5nZXROb2RlKCk7CisgICAgU3JjRWx0VlQgPSBJbnRWVDsKKyAgfQorCisgIC8vIE5vdyB3ZSBrbm93IHRoZSBpbnB1dCBpcyBhbiBpbnRlZ2VyIHZlY3Rvci4gIElmIHRoZSBvdXRwdXQgaXMgYSBGUCB0eXBlLAorICAvLyBjb252ZXJ0IHRvIGludGVnZXIgZmlyc3QsIHRoZW4gdG8gRlAgb2YgdGhlIHJpZ2h0IHNpemUuCisgIGlmIChEc3RFbHRWVC5pc0Zsb2F0aW5nUG9pbnQoKSkgeworICAgIGFzc2VydCgoRHN0RWx0VlQgPT0gTVZUOjpmMzIgfHwgRHN0RWx0VlQgPT0gTVZUOjpmNjQpICYmICJVbmtub3duIEZQIFZUISIpOworICAgIEVWVCBUbXBWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBEc3RFbHRWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIFNETm9kZSAqVG1wID0gQ29uc3RhbnRGb2xkQklUX0NPTlZFUlRvZkJVSUxEX1ZFQ1RPUihCViwgVG1wVlQpLmdldE5vZGUoKTsKKworICAgIC8vIE5leHQsIGNvbnZlcnQgdG8gRlAgZWxlbWVudHMgb2YgdGhlIHNhbWUgc2l6ZS4KKyAgICByZXR1cm4gQ29uc3RhbnRGb2xkQklUX0NPTlZFUlRvZkJVSUxEX1ZFQ1RPUihUbXAsIERzdEVsdFZUKTsKKyAgfQorCisgIC8vIE9rYXksIHdlIGtub3cgdGhlIHNyYy9kc3QgdHlwZXMgYXJlIGJvdGggaW50ZWdlcnMgb2YgZGlmZmVyaW5nIHR5cGVzLgorICAvLyBIYW5kbGluZyBncm93aW5nIGZpcnN0LgorICBhc3NlcnQoU3JjRWx0VlQuaXNJbnRlZ2VyKCkgJiYgRHN0RWx0VlQuaXNJbnRlZ2VyKCkpOworICBpZiAoU3JjQml0U2l6ZSA8IERzdEJpdFNpemUpIHsKKyAgICB1bnNpZ25lZCBOdW1JbnB1dHNQZXJPdXRwdXQgPSBEc3RCaXRTaXplL1NyY0JpdFNpemU7CisKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEJWLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7CisgICAgICAgICBpICs9IE51bUlucHV0c1Blck91dHB1dCkgeworICAgICAgYm9vbCBpc0xFID0gVExJLmlzTGl0dGxlRW5kaWFuKCk7CisgICAgICBBUEludCBOZXdCaXRzID0gQVBJbnQoRHN0Qml0U2l6ZSwgMCk7CisgICAgICBib29sIEVsdElzVW5kZWYgPSB0cnVlOworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiAhPSBOdW1JbnB1dHNQZXJPdXRwdXQ7ICsraikgeworICAgICAgICAvLyBTaGlmdCB0aGUgcHJldmlvdXNseSBjb21wdXRlZCBiaXRzIG92ZXIuCisgICAgICAgIE5ld0JpdHMgPDw9IFNyY0JpdFNpemU7CisgICAgICAgIFNEVmFsdWUgT3AgPSBCVi0+Z2V0T3BlcmFuZChpKyAoaXNMRSA/IChOdW1JbnB1dHNQZXJPdXRwdXQtai0xKSA6IGopKTsKKyAgICAgICAgaWYgKE9wLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpIGNvbnRpbnVlOworICAgICAgICBFbHRJc1VuZGVmID0gZmFsc2U7CisKKyAgICAgICAgTmV3Qml0cyB8PSBBUEludChjYXN0PENvbnN0YW50U0ROb2RlPihPcCktPmdldEFQSW50VmFsdWUoKSkuCisgICAgICAgICAgICAgICAgICAgemV4dE9yVHJ1bmMoU3JjQml0U2l6ZSkuemV4dChEc3RCaXRTaXplKTsKKyAgICAgIH0KKworICAgICAgaWYgKEVsdElzVW5kZWYpCisgICAgICAgIE9wcy5wdXNoX2JhY2soREFHLmdldFVOREVGKERzdEVsdFZUKSk7CisgICAgICBlbHNlCisgICAgICAgIE9wcy5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KE5ld0JpdHMsIERzdEVsdFZUKSk7CisgICAgfQorCisgICAgRVZUIFZUID0gRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwgRHN0RWx0VlQsIE9wcy5zaXplKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgQlYtPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgfQorCisgIC8vIEZpbmFsbHksIHRoaXMgbXVzdCBiZSB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgc2hyaW5raW5nIGVsZW1lbnRzOiBlYWNoIGlucHV0CisgIC8vIHR1cm5zIGludG8gbXVsdGlwbGUgb3V0cHV0cy4KKyAgYm9vbCBpc1MyViA9IElTRDo6aXNTY2FsYXJUb1ZlY3RvcihCVik7CisgIHVuc2lnbmVkIE51bU91dHB1dHNQZXJJbnB1dCA9IFNyY0JpdFNpemUvRHN0Qml0U2l6ZTsKKyAgRVZUIFZUID0gRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwgRHN0RWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtT3V0cHV0c1BlcklucHV0KkJWLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCVi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoQlYtPmdldE9wZXJhbmQoaSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikgeworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiAhPSBOdW1PdXRwdXRzUGVySW5wdXQ7ICsraikKKyAgICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0VU5ERUYoRHN0RWx0VlQpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEFQSW50IE9wVmFsID0gQVBJbnQoY2FzdDxDb25zdGFudFNETm9kZT4oQlYtPmdldE9wZXJhbmQoaSkpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFQSW50VmFsdWUoKSkuemV4dE9yVHJ1bmMoU3JjQml0U2l6ZSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IE51bU91dHB1dHNQZXJJbnB1dDsgKytqKSB7CisgICAgICBBUEludCBUaGlzVmFsID0gQVBJbnQoT3BWYWwpLnRydW5jKERzdEJpdFNpemUpOworICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoVGhpc1ZhbCwgRHN0RWx0VlQpKTsKKyAgICAgIGlmIChpc1MyViAmJiBpID09IDAgJiYgaiA9PSAwICYmIEFQSW50KFRoaXNWYWwpLnpleHQoU3JjQml0U2l6ZSkgPT0gT3BWYWwpCisgICAgICAgIC8vIFNpbXBseSB0dXJuIHRoaXMgaW50byBhIFNDQUxBUl9UT19WRUNUT1Igb2YgdGhlIG5ldyB0eXBlLgorICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBCVi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHNbMF0pOworICAgICAgT3BWYWwgPSBPcFZhbC5sc2hyKERzdEJpdFNpemUpOworICAgIH0KKworICAgIC8vIEZvciBiaWcgZW5kaWFuIHRhcmdldHMsIHN3YXAgdGhlIG9yZGVyIG9mIHRoZSBwaWVjZXMgb2YgZWFjaCBlbGVtZW50LgorICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICAgIHN0ZDo6cmV2ZXJzZShPcHMuZW5kKCktTnVtT3V0cHV0c1BlcklucHV0LCBPcHMuZW5kKCkpOworICB9CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBCVi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRGQUREKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIENvbnN0YW50RlBTRE5vZGUgKk4wQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjApOworICBDb25zdGFudEZQU0ROb2RlICpOMUNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4xKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIC8vIGZvbGQgdmVjdG9yIG9wcworICBpZiAoVlQuaXNWZWN0b3IoKSkgeworICAgIFNEVmFsdWUgRm9sZGVkVk9wID0gU2ltcGxpZnlWQmluT3AoTik7CisgICAgaWYgKEZvbGRlZFZPcC5nZXROb2RlKCkpIHJldHVybiBGb2xkZWRWT3A7CisgIH0KKworICAvLyBmb2xkIChmYWRkIGMxLCBjMikgLT4gKGZhZGQgYzEsIGMyKQorICBpZiAoTjBDRlAgJiYgTjFDRlAgJiYgVlQgIT0gTVZUOjpwcGNmMTI4KQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwgTjEpOworICAvLyBjYW5vbmljYWxpemUgY29uc3RhbnQgdG8gUkhTCisgIGlmIChOMENGUCAmJiAhTjFDRlApCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RkFERCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4xLCBOMCk7CisgIC8vIGZvbGQgKGZhZGQgQSwgMCkgLT4gQQorICBpZiAoVW5zYWZlRlBNYXRoICYmIE4xQ0ZQICYmIE4xQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKQorICAgIHJldHVybiBOMDsKKyAgLy8gZm9sZCAoZmFkZCBBLCAoZm5lZyBCKSkgLT4gKGZzdWIgQSwgQikKKyAgaWYgKGlzTmVnYXRpYmxlRm9yRnJlZShOMSwgTGVnYWxPcGVyYXRpb25zKSA9PSAyKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwKKyAgICAgICAgICAgICAgICAgICAgICAgR2V0TmVnYXRlZEV4cHJlc3Npb24oTjEsIERBRywgTGVnYWxPcGVyYXRpb25zKSk7CisgIC8vIGZvbGQgKGZhZGQgKGZuZWcgQSksIEIpIC0+IChmc3ViIEIsIEEpCisgIGlmIChpc05lZ2F0aWJsZUZvckZyZWUoTjAsIExlZ2FsT3BlcmF0aW9ucykgPT0gMikKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjEsCisgICAgICAgICAgICAgICAgICAgICAgIEdldE5lZ2F0ZWRFeHByZXNzaW9uKE4wLCBEQUcsIExlZ2FsT3BlcmF0aW9ucykpOworCisgIC8vIElmIGFsbG93ZWQsIGZvbGQgKGZhZGQgKGZhZGQgeCwgYzEpLCBjMikgLT4gKGZhZGQgeCwgKGZhZGQgYzEsIGMyKSkKKyAgaWYgKFVuc2FmZUZQTWF0aCAmJiBOMUNGUCAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZBREQgJiYKKyAgICAgIE4wLmdldE5vZGUoKS0+aGFzT25lVXNlKCkgJiYgaXNhPENvbnN0YW50RlBTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDEpLCBOMSkpOworCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0RlNVQihTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBDb25zdGFudEZQU0ROb2RlICpOMENGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4wKTsKKyAgQ29uc3RhbnRGUFNETm9kZSAqTjFDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihOMSk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICAvLyBmb2xkIHZlY3RvciBvcHMKKyAgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICBTRFZhbHVlIEZvbGRlZFZPcCA9IFNpbXBsaWZ5VkJpbk9wKE4pOworICAgIGlmIChGb2xkZWRWT3AuZ2V0Tm9kZSgpKSByZXR1cm4gRm9sZGVkVk9wOworICB9CisKKyAgLy8gZm9sZCAoZnN1YiBjMSwgYzIpIC0+IGMxLWMyCisgIGlmIChOMENGUCAmJiBOMUNGUCAmJiBWVCAhPSBNVlQ6OnBwY2YxMjgpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RlNVQiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLCBOMSk7CisgIC8vIGZvbGQgKGZzdWIgQSwgMCkgLT4gQQorICBpZiAoVW5zYWZlRlBNYXRoICYmIE4xQ0ZQICYmIE4xQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKQorICAgIHJldHVybiBOMDsKKyAgLy8gZm9sZCAoZnN1YiAwLCBCKSAtPiAtQgorICBpZiAoVW5zYWZlRlBNYXRoICYmIE4wQ0ZQICYmIE4wQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKSB7CisgICAgaWYgKGlzTmVnYXRpYmxlRm9yRnJlZShOMSwgTGVnYWxPcGVyYXRpb25zKSkKKyAgICAgIHJldHVybiBHZXROZWdhdGVkRXhwcmVzc2lvbihOMSwgREFHLCBMZWdhbE9wZXJhdGlvbnMpOworICAgIGlmICghTGVnYWxPcGVyYXRpb25zIHx8IFRMSS5pc09wZXJhdGlvbkxlZ2FsKElTRDo6Rk5FRywgVlQpKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Rk5FRywgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4xKTsKKyAgfQorICAvLyBmb2xkIChmc3ViIEEsIChmbmVnIEIpKSAtPiAoZmFkZCBBLCBCKQorICBpZiAoaXNOZWdhdGlibGVGb3JGcmVlKE4xLCBMZWdhbE9wZXJhdGlvbnMpKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwKKyAgICAgICAgICAgICAgICAgICAgICAgR2V0TmVnYXRlZEV4cHJlc3Npb24oTjEsIERBRywgTGVnYWxPcGVyYXRpb25zKSk7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRGTVVMKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIENvbnN0YW50RlBTRE5vZGUgKk4wQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjApOworICBDb25zdGFudEZQU0ROb2RlICpOMUNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4xKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIC8vIGZvbGQgdmVjdG9yIG9wcworICBpZiAoVlQuaXNWZWN0b3IoKSkgeworICAgIFNEVmFsdWUgRm9sZGVkVk9wID0gU2ltcGxpZnlWQmluT3AoTik7CisgICAgaWYgKEZvbGRlZFZPcC5nZXROb2RlKCkpIHJldHVybiBGb2xkZWRWT3A7CisgIH0KKworICAvLyBmb2xkIChmbXVsIGMxLCBjMikgLT4gYzEqYzIKKyAgaWYgKE4wQ0ZQICYmIE4xQ0ZQICYmIFZUICE9IE1WVDo6cHBjZjEyOCkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE4xKTsKKyAgLy8gY2Fub25pY2FsaXplIGNvbnN0YW50IHRvIFJIUworICBpZiAoTjBDRlAgJiYgIU4xQ0ZQKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMSwgTjApOworICAvLyBmb2xkIChmbXVsIEEsIDApIC0+IDAKKyAgaWYgKFVuc2FmZUZQTWF0aCAmJiBOMUNGUCAmJiBOMUNGUC0+Z2V0VmFsdWVBUEYoKS5pc1plcm8oKSkKKyAgICByZXR1cm4gTjE7CisgIC8vIGZvbGQgKGZtdWwgQSwgMCkgLT4gMCwgdmVjdG9yIGVkaXRpb24uCisgIGlmIChVbnNhZmVGUE1hdGggJiYgSVNEOjppc0J1aWxkVmVjdG9yQWxsWmVyb3MoTjEuZ2V0Tm9kZSgpKSkKKyAgICByZXR1cm4gTjE7CisgIC8vIGZvbGQgKGZtdWwgWCwgMi4wKSAtPiAoZmFkZCBYLCBYKQorICBpZiAoTjFDRlAgJiYgTjFDRlAtPmlzRXhhY3RseVZhbHVlKCsyLjApKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCwgTjApOworICAvLyBmb2xkIChmbXVsIFgsIC0xLjApIC0+IChmbmVnIFgpCisgIGlmIChOMUNGUCAmJiBOMUNGUC0+aXNFeGFjdGx5VmFsdWUoLTEuMCkpCisgICAgaWYgKCFMZWdhbE9wZXJhdGlvbnMgfHwgVExJLmlzT3BlcmF0aW9uTGVnYWwoSVNEOjpGTkVHLCBWVCkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGTkVHLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjApOworCisgIC8vIGZvbGQgKGZtdWwgKGZuZWcgWCksIChmbmVnIFkpKSAtPiAoZm11bCBYLCBZKQorICBpZiAoY2hhciBMSFNOZWcgPSBpc05lZ2F0aWJsZUZvckZyZWUoTjAsIExlZ2FsT3BlcmF0aW9ucykpIHsKKyAgICBpZiAoY2hhciBSSFNOZWcgPSBpc05lZ2F0aWJsZUZvckZyZWUoTjEsIExlZ2FsT3BlcmF0aW9ucykpIHsKKyAgICAgIC8vIEJvdGggY2FuIGJlIG5lZ2F0ZWQgZm9yIGZyZWUsIGNoZWNrIHRvIHNlZSBpZiBhdCBsZWFzdCBvbmUgaXMgY2hlYXBlcgorICAgICAgLy8gbmVnYXRlZC4KKyAgICAgIGlmIChMSFNOZWcgPT0gMiB8fCBSSFNOZWcgPT0gMikKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Rk1VTCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXROZWdhdGVkRXhwcmVzc2lvbihOMCwgREFHLCBMZWdhbE9wZXJhdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmVnYXRlZEV4cHJlc3Npb24oTjEsIERBRywgTGVnYWxPcGVyYXRpb25zKSk7CisgICAgfQorICB9CisKKyAgLy8gSWYgYWxsb3dlZCwgZm9sZCAoZm11bCAoZm11bCB4LCBjMSksIGMyKSAtPiAoZm11bCB4LCAoZm11bCBjMSwgYzIpKQorICBpZiAoVW5zYWZlRlBNYXRoICYmIE4xQ0ZQICYmIE4wLmdldE9wY29kZSgpID09IElTRDo6Rk1VTCAmJgorICAgICAgTjAuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSAmJiBpc2E8Q29uc3RhbnRGUFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgxKSkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Rk1VTCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6Rk1VTCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMSksIE4xKSk7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRGRElWKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIENvbnN0YW50RlBTRE5vZGUgKk4wQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjApOworICBDb25zdGFudEZQU0ROb2RlICpOMUNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4xKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIC8vIGZvbGQgdmVjdG9yIG9wcworICBpZiAoVlQuaXNWZWN0b3IoKSkgeworICAgIFNEVmFsdWUgRm9sZGVkVk9wID0gU2ltcGxpZnlWQmluT3AoTik7CisgICAgaWYgKEZvbGRlZFZPcC5nZXROb2RlKCkpIHJldHVybiBGb2xkZWRWT3A7CisgIH0KKworICAvLyBmb2xkIChmZGl2IGMxLCBjMikgLT4gYzEvYzIKKyAgaWYgKE4wQ0ZQICYmIE4xQ0ZQICYmIFZUICE9IE1WVDo6cHBjZjEyOCkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGRElWLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE4xKTsKKworCisgIC8vIChmZGl2IChmbmVnIFgpLCAoZm5lZyBZKSkgLT4gKGZkaXYgWCwgWSkKKyAgaWYgKGNoYXIgTEhTTmVnID0gaXNOZWdhdGlibGVGb3JGcmVlKE4wLCBMZWdhbE9wZXJhdGlvbnMpKSB7CisgICAgaWYgKGNoYXIgUkhTTmVnID0gaXNOZWdhdGlibGVGb3JGcmVlKE4xLCBMZWdhbE9wZXJhdGlvbnMpKSB7CisgICAgICAvLyBCb3RoIGNhbiBiZSBuZWdhdGVkIGZvciBmcmVlLCBjaGVjayB0byBzZWUgaWYgYXQgbGVhc3Qgb25lIGlzIGNoZWFwZXIKKyAgICAgIC8vIG5lZ2F0ZWQuCisgICAgICBpZiAoTEhTTmVnID09IDIgfHwgUkhTTmVnID09IDIpCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZESVYsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmVnYXRlZEV4cHJlc3Npb24oTjAsIERBRywgTGVnYWxPcGVyYXRpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5lZ2F0ZWRFeHByZXNzaW9uKE4xLCBEQUcsIExlZ2FsT3BlcmF0aW9ucykpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0RlJFTShTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBDb25zdGFudEZQU0ROb2RlICpOMENGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4wKTsKKyAgQ29uc3RhbnRGUFNETm9kZSAqTjFDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihOMSk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICAvLyBmb2xkIChmcmVtIGMxLCBjMikgLT4gZm1vZChjMSxjMikKKyAgaWYgKE4wQ0ZQICYmIE4xQ0ZQICYmIFZUICE9IE1WVDo6cHBjZjEyOCkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGUkVNLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE4xKTsKKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdEZDT1BZU0lHTihTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBDb25zdGFudEZQU0ROb2RlICpOMENGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4wKTsKKyAgQ29uc3RhbnRGUFNETm9kZSAqTjFDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihOMSk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICBpZiAoTjBDRlAgJiYgTjFDRlAgJiYgVlQgIT0gTVZUOjpwcGNmMTI4KSAgLy8gQ29uc3RhbnQgZm9sZAorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZDT1BZU0lHTiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLCBOMSk7CisKKyAgaWYgKE4xQ0ZQKSB7CisgICAgY29uc3QgQVBGbG9hdCYgViA9IE4xQ0ZQLT5nZXRWYWx1ZUFQRigpOworICAgIC8vIGNvcHlzaWduKHgsIGMxKSAtPiBmYWJzKHgpICAgICAgIGlmZiBpc3BvcyhjMSkKKyAgICAvLyBjb3B5c2lnbih4LCBjMSkgLT4gZm5lZyhmYWJzKHgpKSBpZmYgaXNuZWcoYzEpCisgICAgaWYgKCFWLmlzTmVnYXRpdmUoKSkgeworICAgICAgaWYgKCFMZWdhbE9wZXJhdGlvbnMgfHwgVExJLmlzT3BlcmF0aW9uTGVnYWwoSVNEOjpGQUJTLCBWVCkpCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZBQlMsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghTGVnYWxPcGVyYXRpb25zIHx8IFRMSS5pc09wZXJhdGlvbkxlZ2FsKElTRDo6Rk5FRywgVlQpKQorICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGTkVHLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6RkFCUywgTjAuZ2V0RGVidWdMb2MoKSwgVlQsIE4wKSk7CisgICAgfQorICB9CisKKyAgLy8gY29weXNpZ24oZmFicyh4KSwgeSkgLT4gY29weXNpZ24oeCwgeSkKKyAgLy8gY29weXNpZ24oZm5lZyh4KSwgeSkgLT4gY29weXNpZ24oeCwgeSkKKyAgLy8gY29weXNpZ24oY29weXNpZ24oeCx6KSwgeSkgLT4gY29weXNpZ24oeCwgeSkKKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6RkFCUyB8fCBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZORUcgfHwKKyAgICAgIE4wLmdldE9wY29kZSgpID09IElTRDo6RkNPUFlTSUdOKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZDT1BZU0lHTiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCksIE4xKTsKKworICAvLyBjb3B5c2lnbih4LCBhYnMoeSkpIC0+IGFicyh4KQorICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGQUJTKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZBQlMsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCk7CisKKyAgLy8gY29weXNpZ24oeCwgY29weXNpZ24oeSx6KSkgLT4gY29weXNpZ24oeCwgeikKKyAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6RkNPUFlTSUdOKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZDT1BZU0lHTiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIE4wLCBOMS5nZXRPcGVyYW5kKDEpKTsKKworICAvLyBjb3B5c2lnbih4LCBmcF9leHRlbmQoeSkpIC0+IGNvcHlzaWduKHgsIHkpCisgIC8vIGNvcHlzaWduKHgsIGZwX3JvdW5kKHkpKSAtPiBjb3B5c2lnbih4LCB5KQorICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGUF9FWFRFTkQgfHwgTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGUF9ST1VORCkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGQ09QWVNJR04sIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICBOMCwgTjEuZ2V0T3BlcmFuZCgwKSk7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRTSU5UX1RPX0ZQKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4wQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRVZUIE9wVlQgPSBOMC5nZXRWYWx1ZVR5cGUoKTsKKworICAvLyBmb2xkIChzaW50X3RvX2ZwIGMxKSAtPiBjMWZwCisgIGlmIChOMEMgJiYgT3BWVCAhPSBNVlQ6OnBwY2YxMjgpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0lOVF9UT19GUCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wKTsKKworICAvLyBJZiB0aGUgaW5wdXQgaXMgYSBsZWdhbCB0eXBlLCBhbmQgU0lOVF9UT19GUCBpcyBub3QgbGVnYWwgb24gdGhpcyB0YXJnZXQsCisgIC8vIGJ1dCBVSU5UX1RPX0ZQIGlzIGxlZ2FsIG9uIHRoaXMgdGFyZ2V0LCB0cnkgdG8gY29udmVydC4KKyAgaWYgKCFUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6U0lOVF9UT19GUCwgT3BWVCkgJiYKKyAgICAgIFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpVSU5UX1RPX0ZQLCBPcFZUKSkgeworICAgIC8vIElmIHRoZSBzaWduIGJpdCBpcyBrbm93biB0byBiZSB6ZXJvLCB3ZSBjYW4gY2hhbmdlIHRoaXMgdG8gVUlOVF9UT19GUC4KKyAgICBpZiAoREFHLlNpZ25CaXRJc1plcm8oTjApKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VUlOVF9UT19GUCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0VUlOVF9UT19GUChTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIENvbnN0YW50U0ROb2RlICpOMEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBPcFZUID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisKKyAgLy8gZm9sZCAodWludF90b19mcCBjMSkgLT4gYzFmcAorICBpZiAoTjBDICYmIE9wVlQgIT0gTVZUOjpwcGNmMTI4KQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlVJTlRfVE9fRlAsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCk7CisKKyAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbGVnYWwgdHlwZSwgYW5kIFVJTlRfVE9fRlAgaXMgbm90IGxlZ2FsIG9uIHRoaXMgdGFyZ2V0LAorICAvLyBidXQgU0lOVF9UT19GUCBpcyBsZWdhbCBvbiB0aGlzIHRhcmdldCwgdHJ5IHRvIGNvbnZlcnQuCisgIGlmICghVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OlVJTlRfVE9fRlAsIE9wVlQpICYmCisgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6U0lOVF9UT19GUCwgT3BWVCkpIHsKKyAgICAvLyBJZiB0aGUgc2lnbiBiaXQgaXMga25vd24gdG8gYmUgemVybywgd2UgY2FuIGNoYW5nZSB0aGlzIHRvIFNJTlRfVE9fRlAuCisgICAgaWYgKERBRy5TaWduQml0SXNaZXJvKE4wKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNJTlRfVE9fRlAsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdEZQX1RPX1NJTlQoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBDb25zdGFudEZQU0ROb2RlICpOMENGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4wKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIC8vIGZvbGQgKGZwX3RvX3NpbnQgYzFmcCkgLT4gYzEKKyAgaWYgKE4wQ0ZQKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1RPX1NJTlQsIE4tPmdldERlYnVnTG9jKCksIFZULCBOMCk7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRGUF9UT19VSU5UKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgQ29uc3RhbnRGUFNETm9kZSAqTjBDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihOMCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICAvLyBmb2xkIChmcF90b191aW50IGMxZnApIC0+IGMxCisgIGlmIChOMENGUCAmJiBWVCAhPSBNVlQ6OnBwY2YxMjgpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RlBfVE9fVUlOVCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wKTsKKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdEZQX1JPVU5EKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIENvbnN0YW50RlBTRE5vZGUgKk4wQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gZm9sZCAoZnBfcm91bmQgYzFmcCkgLT4gYzFmcAorICBpZiAoTjBDRlAgJiYgTjAuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjpwcGNmMTI4KQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1JPVU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjAsIE4xKTsKKworICAvLyBmb2xkIChmcF9yb3VuZCAoZnBfZXh0ZW5kIHgpKSAtPiB4CisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZQX0VYVEVORCAmJiBWVCA9PSBOMC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpKQorICAgIHJldHVybiBOMC5nZXRPcGVyYW5kKDApOworCisgIC8vIGZvbGQgKGZwX3JvdW5kIChmcF9yb3VuZCB4KSkgLT4gKGZwX3JvdW5kIHgpCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZQX1JPVU5EKSB7CisgICAgLy8gVGhpcyBpcyBhIHZhbHVlIHByZXNlcnZpbmcgdHJ1bmNhdGlvbiBpZiBib3RoIHJvdW5kJ3MgYXJlLgorICAgIGJvb2wgSXNUcnVuYyA9IE4tPmdldENvbnN0YW50T3BlcmFuZFZhbCgxKSA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgTjAuZ2V0Tm9kZSgpLT5nZXRDb25zdGFudE9wZXJhbmRWYWwoMSkgPT0gMTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGUF9ST1VORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJc1RydW5jKSk7CisgIH0KKworICAvLyBmb2xkIChmcF9yb3VuZCAoY29weXNpZ24gWCwgWSkpIC0+IChjb3B5c2lnbiAoZnBfcm91bmQgWCksIFkpCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZDT1BZU0lHTiAmJiBOMC5nZXROb2RlKCktPmhhc09uZVVzZSgpKSB7CisgICAgU0RWYWx1ZSBUbXAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1JPVU5ELCBOMC5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCksIE4xKTsKKyAgICBBZGRUb1dvcmtMaXN0KFRtcC5nZXROb2RlKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZDT1BZU0lHTiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIFRtcCwgTjAuZ2V0T3BlcmFuZCgxKSk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdEZQX1JPVU5EX0lOUkVHKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBFVlQgRVZUID0gY2FzdDxWVFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldFZUKCk7CisgIENvbnN0YW50RlBTRE5vZGUgKk4wQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjApOworCisgIC8vIGZvbGQgKGZwX3JvdW5kX2lucmVnIGMxZnApIC0+IGMxZnAKKyAgaWYgKE4wQ0ZQICYmIGlzVHlwZUxlZ2FsKEVWVCkpIHsKKyAgICBTRFZhbHVlIFJvdW5kID0gREFHLmdldENvbnN0YW50RlAoKk4wQ0ZQLT5nZXRDb25zdGFudEZQVmFsdWUoKSwgRVZUKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGUF9FWFRFTkQsIE4tPmdldERlYnVnTG9jKCksIFZULCBSb3VuZCk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdEZQX0VYVEVORChTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIENvbnN0YW50RlBTRE5vZGUgKk4wQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gSWYgdGhpcyBpcyBmcF9yb3VuZChmcGV4dGVuZCksIGRvbid0IGZvbGQgaXQsIGFsbG93IG91cnNlbHZlcyB0byBiZSBmb2xkZWQuCisgIGlmIChOLT5oYXNPbmVVc2UoKSAmJgorICAgICAgTi0+dXNlX2JlZ2luKCktPmdldE9wY29kZSgpID09IElTRDo6RlBfUk9VTkQpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAvLyBmb2xkIChmcF9leHRlbmQgYzFmcCkgLT4gYzFmcAorICBpZiAoTjBDRlAgJiYgVlQgIT0gTVZUOjpwcGNmMTI4KQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZQX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wKTsKKworICAvLyBUdXJuIGZwX2V4dGVuZChmcF9yb3VuZChYLCAxKSkgLT4geCBzaW5jZSB0aGUgZnBfcm91bmQgZG9lc24ndCBhZmZlY3QgdGhlCisgIC8vIHZhbHVlIG9mIFguCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZQX1JPVU5ECisgICAgICAmJiBOMC5nZXROb2RlKCktPmdldENvbnN0YW50T3BlcmFuZFZhbCgxKSA9PSAxKSB7CisgICAgU0RWYWx1ZSBJbiA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgaWYgKEluLmdldFZhbHVlVHlwZSgpID09IFZUKSByZXR1cm4gSW47CisgICAgaWYgKFZULmJpdHNMVChJbi5nZXRWYWx1ZVR5cGUoKSkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGUF9ST1VORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSW4sIE4wLmdldE9wZXJhbmQoMSkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZQX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIEluKTsKKyAgfQorCisgIC8vIGZvbGQgKGZwZXh0IChsb2FkIHgpKSAtPiAoZnBleHQgKGZwdHJ1bmMgKGV4dGxvYWQgeCkpKQorICBpZiAoSVNEOjppc05PTl9FWFRMb2FkKE4wLmdldE5vZGUoKSkgJiYgTjAuaGFzT25lVXNlKCkgJiYKKyAgICAgICgoIUxlZ2FsT3BlcmF0aW9ucyAmJiAhY2FzdDxMb2FkU0ROb2RlPihOMCktPmlzVm9sYXRpbGUoKSkgfHwKKyAgICAgICBUTEkuaXNMb2FkRXh0TGVnYWwoSVNEOjpFWFRMT0FELCBOMC5nZXRWYWx1ZVR5cGUoKSkpKSB7CisgICAgTG9hZFNETm9kZSAqTE4wID0gY2FzdDxMb2FkU0ROb2RlPihOMCk7CisgICAgU0RWYWx1ZSBFeHRMb2FkID0gREFHLmdldEV4dExvYWQoSVNEOjpFWFRMT0FELCBWVCwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldENoYWluKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRCYXNlUHRyKCksIExOMC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTjAtPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5pc1ZvbGF0aWxlKCksIExOMC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOMC0+Z2V0QWxpZ25tZW50KCkpOworICAgIENvbWJpbmVUbyhOLCBFeHRMb2FkKTsKKyAgICBDb21iaW5lVG8oTjAuZ2V0Tm9kZSgpLAorICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1JPVU5ELCBOMC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRWYWx1ZVR5cGUoKSwgRXh0TG9hZCwgREFHLmdldEludFB0ckNvbnN0YW50KDEpKSwKKyAgICAgICAgICAgICAgRXh0TG9hZC5nZXRWYWx1ZSgxKSk7CisgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7ICAgLy8gUmV0dXJuIE4gc28gaXQgZG9lc24ndCBnZXQgcmVjaGVja2VkIQorICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRGTkVHKFNETm9kZSAqTikgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworCisgIGlmIChpc05lZ2F0aWJsZUZvckZyZWUoTjAsIExlZ2FsT3BlcmF0aW9ucykpCisgICAgcmV0dXJuIEdldE5lZ2F0ZWRFeHByZXNzaW9uKE4wLCBEQUcsIExlZ2FsT3BlcmF0aW9ucyk7CisKKyAgLy8gVHJhbnNmb3JtIGZuZWcoYml0Y29udmVydCh4KSkgLT4gYml0Y29udmVydCh4XnNpZ24pIHRvIGF2b2lkIGxvYWRpbmcKKyAgLy8gY29uc3RhbnQgcG9vbCB2YWx1ZXMuCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJJVF9DT05WRVJUICYmIAorICAgICAgIVZULmlzVmVjdG9yKCkgJiYKKyAgICAgIE4wLmdldE5vZGUoKS0+aGFzT25lVXNlKCkgJiYKKyAgICAgIE4wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkpIHsKKyAgICBTRFZhbHVlIEludCA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgRVZUIEludFZUID0gSW50LmdldFZhbHVlVHlwZSgpOworICAgIGlmIChJbnRWVC5pc0ludGVnZXIoKSAmJiAhSW50VlQuaXNWZWN0b3IoKSkgeworICAgICAgSW50ID0gREFHLmdldE5vZGUoSVNEOjpYT1IsIE4wLmdldERlYnVnTG9jKCksIEludFZULCBJbnQsCisgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChBUEludDo6Z2V0U2lnbkJpdChJbnRWVC5nZXRTaXplSW5CaXRzKCkpLCBJbnRWVCkpOworICAgICAgQWRkVG9Xb3JrTGlzdChJbnQuZ2V0Tm9kZSgpKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZULCBJbnQpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0RkFCUyhTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIENvbnN0YW50RlBTRE5vZGUgKk4wQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gZm9sZCAoZmFicyBjMSkgLT4gZmFicyhjMSkKKyAgaWYgKE4wQ0ZQICYmIFZUICE9IE1WVDo6cHBjZjEyOCkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGQUJTLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTjApOworICAvLyBmb2xkIChmYWJzIChmYWJzIHgpKSAtPiAoZmFicyB4KQorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGQUJTKQorICAgIHJldHVybiBOLT5nZXRPcGVyYW5kKDApOworICAvLyBmb2xkIChmYWJzIChmbmVnIHgpKSAtPiAoZmFicyB4KQorICAvLyBmb2xkIChmYWJzIChmY29weXNpZ24geCwgeSkpIC0+IChmYWJzIHgpCisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZORUcgfHwgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGQ09QWVNJR04pCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RkFCUywgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4wLmdldE9wZXJhbmQoMCkpOworCisgIC8vIFRyYW5zZm9ybSBmYWJzKGJpdGNvbnZlcnQoeCkpIC0+IGJpdGNvbnZlcnQoeCZ+c2lnbikgdG8gYXZvaWQgbG9hZGluZworICAvLyBjb25zdGFudCBwb29sIHZhbHVlcy4KKyAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6QklUX0NPTlZFUlQgJiYgTjAuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSAmJgorICAgICAgTjAuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKS5pc0ludGVnZXIoKSAmJgorICAgICAgIU4wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSkgeworICAgIFNEVmFsdWUgSW50ID0gTjAuZ2V0T3BlcmFuZCgwKTsKKyAgICBFVlQgSW50VlQgPSBJbnQuZ2V0VmFsdWVUeXBlKCk7CisgICAgaWYgKEludFZULmlzSW50ZWdlcigpICYmICFJbnRWVC5pc1ZlY3RvcigpKSB7CisgICAgICBJbnQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgTjAuZ2V0RGVidWdMb2MoKSwgSW50VlQsIEludCwKKyAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQofkFQSW50OjpnZXRTaWduQml0KEludFZULmdldFNpemVJbkJpdHMoKSksIEludFZUKSk7CisgICAgICBBZGRUb1dvcmtMaXN0KEludC5nZXROb2RlKCkpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0VmFsdWVUeXBlKDApLCBJbnQpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0QlJDT05EKFNETm9kZSAqTikgeworICBTRFZhbHVlIENoYWluID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgTjIgPSBOLT5nZXRPcGVyYW5kKDIpOworCisgIC8vIElmIE4gaXMgYSBjb25zdGFudCB3ZSBjb3VsZCBmb2xkIHRoaXMgaW50byBhIGZhbGx0aHJvdWdoIG9yIHVuY29uZGl0aW9uYWwKKyAgLy8gYnJhbmNoLiBIb3dldmVyIHRoYXQgZG9lc24ndCBoYXBwZW4gdmVyeSBvZnRlbiBpbiBub3JtYWwgY29kZSwgYmVjYXVzZQorICAvLyBJbnN0Y29tYmluZS9TaW1wbGlmeUNGRyBzaG91bGQgaGF2ZSBoYW5kbGVkIHRoZSBhdmFpbGFibGUgb3Bwb3J0dW5pdGllcy4KKyAgLy8gSWYgd2UgZGlkIHRoaXMgZm9sZGluZyBoZXJlLCBpdCB3b3VsZCBiZSBuZWNlc3NhcnkgdG8gdXBkYXRlIHRoZQorICAvLyBNYWNoaW5lQmFzaWNCbG9jayBDRkcsIHdoaWNoIGlzIGF3a3dhcmQuCisKKyAgLy8gZm9sZCBhIGJyY29uZCB3aXRoIGEgc2V0Y2MgY29uZGl0aW9uIGludG8gYSBCUl9DQyBub2RlIGlmIEJSX0NDIGlzIGxlZ2FsCisgIC8vIG9uIHRoZSB0YXJnZXQuCisgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNFVENDICYmCisgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6QlJfQ0MsIE1WVDo6T3RoZXIpKSB7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlJfQ0MsIE4tPmdldERlYnVnTG9jKCksIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgIENoYWluLCBOMS5nZXRPcGVyYW5kKDIpLAorICAgICAgICAgICAgICAgICAgICAgICBOMS5nZXRPcGVyYW5kKDApLCBOMS5nZXRPcGVyYW5kKDEpLCBOMik7CisgIH0KKworICBTRE5vZGUgKlRydW5jID0gMDsKKyAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUgJiYgTjEuaGFzT25lVXNlKCkpIHsKKyAgICAvLyBMb29rIHBhc3QgdHJ1bmNhdGUuCisgICAgVHJ1bmMgPSBOMS5nZXROb2RlKCk7CisgICAgTjEgPSBOMS5nZXRPcGVyYW5kKDApOworICB9CisKKyAgaWYgKE4xLmhhc09uZVVzZSgpICYmIE4xLmdldE9wY29kZSgpID09IElTRDo6U1JMKSB7CisgICAgLy8gTWF0Y2ggdGhpcyBwYXR0ZXJuIHNvIHRoYXQgd2UgY2FuIGdlbmVyYXRlIHNpbXBsZXIgY29kZToKKyAgICAvLworICAgIC8vICAgJWEgPSAuLi4KKyAgICAvLyAgICViID0gYW5kIGkzMiAlYSwgMgorICAgIC8vICAgJWMgPSBzcmwgaTMyICViLCAxCisgICAgLy8gICBicmNvbmQgaTMyICVjIC4uLgorICAgIC8vCisgICAgLy8gaW50bworICAgIC8vIAorICAgIC8vICAgJWEgPSAuLi4KKyAgICAvLyAgICViID0gYW5kIGkzMiAlYSwgMgorICAgIC8vICAgJWMgPSBzZXRjYyBlcSAlYiwgMAorICAgIC8vICAgYnJjb25kICVjIC4uLgorICAgIC8vCisgICAgLy8gVGhpcyBhcHBsaWVzIG9ubHkgd2hlbiB0aGUgQU5EIGNvbnN0YW50IHZhbHVlIGhhcyBvbmUgYml0IHNldCBhbmQgdGhlCisgICAgLy8gU1JMIGNvbnN0YW50IGlzIGVxdWFsIHRvIHRoZSBsb2cyIG9mIHRoZSBBTkQgY29uc3RhbnQuIFRoZSBiYWNrLWVuZCBpcworICAgIC8vIHNtYXJ0IGVub3VnaCB0byBjb252ZXJ0IHRoZSByZXN1bHQgaW50byBhIFRFU1QvSk1QIHNlcXVlbmNlLgorICAgIFNEVmFsdWUgT3AwID0gTjEuZ2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIE9wMSA9IE4xLmdldE9wZXJhbmQoMSk7CisKKyAgICBpZiAoT3AwLmdldE9wY29kZSgpID09IElTRDo6QU5EICYmCisgICAgICAgIE9wMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50KSB7CisgICAgICBTRFZhbHVlIEFuZE9wMSA9IE9wMC5nZXRPcGVyYW5kKDEpOworCisgICAgICBpZiAoQW5kT3AxLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpIHsKKyAgICAgICAgY29uc3QgQVBJbnQgJkFuZENvbnN0ID0gY2FzdDxDb25zdGFudFNETm9kZT4oQW5kT3AxKS0+Z2V0QVBJbnRWYWx1ZSgpOworCisgICAgICAgIGlmIChBbmRDb25zdC5pc1Bvd2VyT2YyKCkgJiYKKyAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wMSktPmdldEFQSW50VmFsdWUoKT09QW5kQ29uc3QubG9nQmFzZTIoKSkgeworICAgICAgICAgIFNEVmFsdWUgU2V0Q0MgPQorICAgICAgICAgICAgREFHLmdldFNldENDKE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFNldENDUmVzdWx0VHlwZShPcDAuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wMCwgREFHLmdldENvbnN0YW50KDAsIE9wMC5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRORSk7CisKKyAgICAgICAgICBTRFZhbHVlIE5ld0JSQ29uZCA9IERBRy5nZXROb2RlKElTRDo6QlJDT05ELCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgQ2hhaW4sIFNldENDLCBOMik7CisgICAgICAgICAgLy8gRG9uJ3QgYWRkIHRoZSBuZXcgQlJDb25kIGludG8gdGhlIHdvcmtsaXN0IG9yIGVsc2UgU2ltcGxpZnlTZWxlY3RDQworICAgICAgICAgIC8vIHdpbGwgY29udmVydCBpdCBiYWNrIHRvIChYICYgQzEpID4+IEMyLgorICAgICAgICAgIENvbWJpbmVUbyhOLCBOZXdCUkNvbmQsIGZhbHNlKTsKKyAgICAgICAgICAvLyBUcnVuY2F0ZSBpcyBkZWFkLgorICAgICAgICAgIGlmIChUcnVuYykgeworICAgICAgICAgICAgcmVtb3ZlRnJvbVdvcmtMaXN0KFRydW5jKTsKKyAgICAgICAgICAgIERBRy5EZWxldGVOb2RlKFRydW5jKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgdXNlcyBvZiBTUkwgd2l0aCBTRVRDQworICAgICAgICAgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICAgICAgICAgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKE4xLCBTZXRDQywgJkRlYWROb2Rlcyk7CisgICAgICAgICAgcmVtb3ZlRnJvbVdvcmtMaXN0KE4xLmdldE5vZGUoKSk7CisgICAgICAgICAgREFHLkRlbGV0ZU5vZGUoTjEuZ2V0Tm9kZSgpKTsKKyAgICAgICAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsgICAvLyBSZXR1cm4gTiBzbyBpdCBkb2Vzbid0IGdldCByZWNoZWNrZWQhCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIFRyYW5zZm9ybSBicih4b3IoeCwgeSkpIC0+IGJyKHggIT0geSkKKyAgLy8gVHJhbnNmb3JtIGJyKHhvcih4b3IoeCx5KSwgMSkpIC0+IGJyICh4ID09IHkpCisgIGlmIChOMS5oYXNPbmVVc2UoKSAmJiBOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlhPUikgeworICAgIFNETm9kZSAqVGhlWG9yID0gTjEuZ2V0Tm9kZSgpOworICAgIFNEVmFsdWUgT3AwID0gVGhlWG9yLT5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgT3AxID0gVGhlWG9yLT5nZXRPcGVyYW5kKDEpOworICAgIGlmIChPcDAuZ2V0T3Bjb2RlKCkgPT0gT3AxLmdldE9wY29kZSgpKSB7CisgICAgICAvLyBBdm9pZCBtaXNzaW5nIGltcG9ydGFudCB4b3Igb3B0aW1pemF0aW9ucy4KKyAgICAgIFNEVmFsdWUgVG1wID0gdmlzaXRYT1IoVGhlWG9yKTsKKyAgICAgIGlmIChUbXAuZ2V0Tm9kZSgpICYmIFRtcC5nZXROb2RlKCkgIT0gVGhlWG9yKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXG5SZXBsYWNpbmcuOCAiOworICAgICAgICAgICAgICBUaGVYb3ItPmR1bXAoJkRBRyk7CisgICAgICAgICAgICAgIGRiZ3MoKSA8PCAiXG5XaXRoOiAiOworICAgICAgICAgICAgICBUbXAuZ2V0Tm9kZSgpLT5kdW1wKCZEQUcpOworICAgICAgICAgICAgICBkYmdzKCkgPDwgJ1xuJyk7CisgICAgICAgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICAgICAgICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChOMSwgVG1wLCAmRGVhZE5vZGVzKTsKKyAgICAgICAgcmVtb3ZlRnJvbVdvcmtMaXN0KFRoZVhvcik7CisgICAgICAgIERBRy5EZWxldGVOb2RlKFRoZVhvcik7CisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJSQ09ORCwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsIENoYWluLCBUbXAsIE4yKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoT3AwLmdldE9wY29kZSgpICE9IElTRDo6U0VUQ0MgJiYgT3AxLmdldE9wY29kZSgpICE9IElTRDo6U0VUQ0MpIHsKKyAgICAgIGJvb2wgRXF1YWwgPSBmYWxzZTsKKyAgICAgIGlmIChDb25zdGFudFNETm9kZSAqUkhTQ0kgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AwKSkKKyAgICAgICAgaWYgKFJIU0NJLT5nZXRBUEludFZhbHVlKCkgPT0gMSAmJiBPcDAuaGFzT25lVXNlKCkgJiYKKyAgICAgICAgICAgIE9wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlhPUikgeworICAgICAgICAgIFRoZVhvciA9IE9wMC5nZXROb2RlKCk7CisgICAgICAgICAgRXF1YWwgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgIFNEVmFsdWUgTm9kZVRvUmVwbGFjZSA9IFRydW5jID8gU0RWYWx1ZShUcnVuYywgMCkgOiBOMTsKKyAgICAgIAorICAgICAgRVZUIFNldENDVlQgPSBOb2RlVG9SZXBsYWNlLmdldFZhbHVlVHlwZSgpOworICAgICAgaWYgKExlZ2FsVHlwZXMpCisgICAgICAgIFNldENDVlQgPSBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKFNldENDVlQpOworICAgICAgU0RWYWx1ZSBTZXRDQyA9IERBRy5nZXRTZXRDQyhUaGVYb3ItPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENDVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wMCwgT3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcXVhbCA/IElTRDo6U0VURVEgOiBJU0Q6OlNFVE5FKTsKKyAgICAgIC8vIFJlcGxhY2UgdGhlIHVzZXMgb2YgWE9SIHdpdGggU0VUQ0MKKyAgICAgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICAgICAgREFHLlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoTm9kZVRvUmVwbGFjZSwgU2V0Q0MsICZEZWFkTm9kZXMpOworICAgICAgcmVtb3ZlRnJvbVdvcmtMaXN0KE5vZGVUb1JlcGxhY2UuZ2V0Tm9kZSgpKTsKKyAgICAgIERBRy5EZWxldGVOb2RlKE5vZGVUb1JlcGxhY2UuZ2V0Tm9kZSgpKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJSQ09ORCwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBDaGFpbiwgU2V0Q0MsIE4yKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLyBPcGVyYW5kIExpc3QgZm9yIEJSX0NDOiBDaGFpbiwgQ29uZENDLCBDb25kTEhTLCBDb25kUkhTLCBEZXN0QkIuCisvLworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRCUl9DQyhTRE5vZGUgKk4pIHsKKyAgQ29uZENvZGVTRE5vZGUgKkNDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSk7CisgIFNEVmFsdWUgQ29uZExIUyA9IE4tPmdldE9wZXJhbmQoMiksIENvbmRSSFMgPSBOLT5nZXRPcGVyYW5kKDMpOworCisgIC8vIElmIE4gaXMgYSBjb25zdGFudCB3ZSBjb3VsZCBmb2xkIHRoaXMgaW50byBhIGZhbGx0aHJvdWdoIG9yIHVuY29uZGl0aW9uYWwKKyAgLy8gYnJhbmNoLiBIb3dldmVyIHRoYXQgZG9lc24ndCBoYXBwZW4gdmVyeSBvZnRlbiBpbiBub3JtYWwgY29kZSwgYmVjYXVzZQorICAvLyBJbnN0Y29tYmluZS9TaW1wbGlmeUNGRyBzaG91bGQgaGF2ZSBoYW5kbGVkIHRoZSBhdmFpbGFibGUgb3Bwb3J0dW5pdGllcy4KKyAgLy8gSWYgd2UgZGlkIHRoaXMgZm9sZGluZyBoZXJlLCBpdCB3b3VsZCBiZSBuZWNlc3NhcnkgdG8gdXBkYXRlIHRoZQorICAvLyBNYWNoaW5lQmFzaWNCbG9jayBDRkcsIHdoaWNoIGlzIGF3a3dhcmQuCisKKyAgLy8gVXNlIFNpbXBsaWZ5U2V0Q0MgdG8gc2ltcGxpZnkgU0VUQ0Mncy4KKyAgU0RWYWx1ZSBTaW1wID0gU2ltcGxpZnlTZXRDQyhUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKENvbmRMSFMuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRMSFMsIENvbmRSSFMsIENDLT5nZXQoKSwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIGlmIChTaW1wLmdldE5vZGUoKSkgQWRkVG9Xb3JrTGlzdChTaW1wLmdldE5vZGUoKSk7CisKKyAgLy8gZm9sZCB0byBhIHNpbXBsZXIgc2V0Y2MKKyAgaWYgKFNpbXAuZ2V0Tm9kZSgpICYmIFNpbXAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQykKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCUl9DQywgTi0+Z2V0RGVidWdMb2MoKSwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgwKSwgU2ltcC5nZXRPcGVyYW5kKDIpLAorICAgICAgICAgICAgICAgICAgICAgICBTaW1wLmdldE9wZXJhbmQoMCksIFNpbXAuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCg0KSk7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIENvbWJpbmVUb1ByZUluZGV4ZWRMb2FkU3RvcmUgLSBUcnkgdHVybmluZyBhIGxvYWQgLyBzdG9yZSBpbnRvIGEKKy8vLyBwcmUtaW5kZXhlZCBsb2FkIC8gc3RvcmUgd2hlbiB0aGUgYmFzZSBwb2ludGVyIGlzIGFuIGFkZCBvciBzdWJ0cmFjdAorLy8vIGFuZCBpdCBoYXMgb3RoZXIgdXNlcyBiZXNpZGVzIHRoZSBsb2FkIC8gc3RvcmUuIEFmdGVyIHRoZQorLy8vIHRyYW5zZm9ybWF0aW9uLCB0aGUgbmV3IGluZGV4ZWQgbG9hZCAvIHN0b3JlIGhhcyBlZmZlY3RpdmVseSBmb2xkZWQKKy8vLyB0aGUgYWRkIC8gc3VidHJhY3QgaW4gYW5kIGFsbCBvZiBpdHMgb3RoZXIgdXNlcyBhcmUgcmVkaXJlY3RlZCB0byB0aGUKKy8vLyBuZXcgbG9hZCAvIHN0b3JlLgorYm9vbCBEQUdDb21iaW5lcjo6Q29tYmluZVRvUHJlSW5kZXhlZExvYWRTdG9yZShTRE5vZGUgKk4pIHsKKyAgaWYgKCFMZWdhbE9wZXJhdGlvbnMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgaXNMb2FkID0gdHJ1ZTsKKyAgU0RWYWx1ZSBQdHI7CisgIEVWVCBWVDsKKyAgaWYgKExvYWRTRE5vZGUgKkxEICA9IGR5bl9jYXN0PExvYWRTRE5vZGU+KE4pKSB7CisgICAgaWYgKExELT5pc0luZGV4ZWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBWVCA9IExELT5nZXRNZW1vcnlWVCgpOworICAgIGlmICghVExJLmlzSW5kZXhlZExvYWRMZWdhbChJU0Q6OlBSRV9JTkMsIFZUKSAmJgorICAgICAgICAhVExJLmlzSW5kZXhlZExvYWRMZWdhbChJU0Q6OlBSRV9ERUMsIFZUKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBQdHIgPSBMRC0+Z2V0QmFzZVB0cigpOworICB9IGVsc2UgaWYgKFN0b3JlU0ROb2RlICpTVCAgPSBkeW5fY2FzdDxTdG9yZVNETm9kZT4oTikpIHsKKyAgICBpZiAoU1QtPmlzSW5kZXhlZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFZUID0gU1QtPmdldE1lbW9yeVZUKCk7CisgICAgaWYgKCFUTEkuaXNJbmRleGVkU3RvcmVMZWdhbChJU0Q6OlBSRV9JTkMsIFZUKSAmJgorICAgICAgICAhVExJLmlzSW5kZXhlZFN0b3JlTGVnYWwoSVNEOjpQUkVfREVDLCBWVCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgUHRyID0gU1QtPmdldEJhc2VQdHIoKTsKKyAgICBpc0xvYWQgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJZiB0aGUgcG9pbnRlciBpcyBub3QgYW4gYWRkL3N1Yiwgb3IgaWYgaXQgZG9lc24ndCBoYXZlIG11bHRpcGxlIHVzZXMsIGJhaWwKKyAgLy8gb3V0LiAgVGhlcmUgaXMgbm8gcmVhc29uIHRvIG1ha2UgdGhpcyBhIHByZWluYy9wcmVkZWMuCisgIGlmICgoUHRyLmdldE9wY29kZSgpICE9IElTRDo6QUREICYmIFB0ci5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNVQikgfHwKKyAgICAgIFB0ci5nZXROb2RlKCktPmhhc09uZVVzZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBBc2sgdGhlIHRhcmdldCB0byBkbyBhZGRyZXNzaW5nIG1vZGUgc2VsZWN0aW9uLgorICBTRFZhbHVlIEJhc2VQdHI7CisgIFNEVmFsdWUgT2Zmc2V0OworICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gSVNEOjpVTklOREVYRUQ7CisgIGlmICghVExJLmdldFByZUluZGV4ZWRBZGRyZXNzUGFydHMoTiwgQmFzZVB0ciwgT2Zmc2V0LCBBTSwgREFHKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIC8vIERvbid0IGNyZWF0ZSBhIGluZGV4ZWQgbG9hZCAvIHN0b3JlIHdpdGggemVybyBvZmZzZXQuCisgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE9mZnNldCkgJiYKKyAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9mZnNldCktPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFRyeSB0dXJuaW5nIGl0IGludG8gYSBwcmUtaW5kZXhlZCBsb2FkIC8gc3RvcmUgZXhjZXB0IHdoZW46CisgIC8vIDEpIFRoZSBuZXcgYmFzZSBwdHIgaXMgYSBmcmFtZSBpbmRleC4KKyAgLy8gMikgSWYgTiBpcyBhIHN0b3JlIGFuZCB0aGUgbmV3IGJhc2UgcHRyIGlzIGVpdGhlciB0aGUgc2FtZSBhcyBvciBpcyBhCisgIC8vICAgIHByZWRlY2Vzc29yIG9mIHRoZSB2YWx1ZSBiZWluZyBzdG9yZWQuCisgIC8vIDMpIEFub3RoZXIgdXNlIG9mIG9sZCBiYXNlIHB0ciBpcyBhIHByZWRlY2Vzc29yIG9mIE4uIElmIHB0ciBpcyBmb2xkZWQKKyAgLy8gICAgdGhhdCB3b3VsZCBjcmVhdGUgYSBjeWNsZS4KKyAgLy8gNCkgQWxsIHVzZXMgYXJlIGxvYWQgLyBzdG9yZSBvcHMgdGhhdCB1c2UgaXQgYXMgb2xkIGJhc2UgcHRyLgorCisgIC8vIENoZWNrICMxLiAgUHJlaW5jJ2luZyBhIGZyYW1lIGluZGV4IHdvdWxkIHJlcXVpcmUgY29weWluZyB0aGUgc3RhY2sgcG9pbnRlcgorICAvLyAocGx1cyB0aGUgaW1wbGljaXQgb2Zmc2V0KSB0byBhIHJlZ2lzdGVyIHRvIHByZWluYyBhbnl3YXkuCisgIGlmIChpc2E8RnJhbWVJbmRleFNETm9kZT4oQmFzZVB0cikgfHwgaXNhPFJlZ2lzdGVyU0ROb2RlPihCYXNlUHRyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2hlY2sgIzIuCisgIGlmICghaXNMb2FkKSB7CisgICAgU0RWYWx1ZSBWYWwgPSBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0VmFsdWUoKTsKKyAgICBpZiAoVmFsID09IEJhc2VQdHIgfHwgQmFzZVB0ci5nZXROb2RlKCktPmlzUHJlZGVjZXNzb3JPZihWYWwuZ2V0Tm9kZSgpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE5vdyBjaGVjayBmb3IgIzMgYW5kICM0LgorICBib29sIFJlYWxVc2UgPSBmYWxzZTsKKyAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBJID0gUHRyLmdldE5vZGUoKS0+dXNlX2JlZ2luKCksCisgICAgICAgICBFID0gUHRyLmdldE5vZGUoKS0+dXNlX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIFNETm9kZSAqVXNlID0gKkk7CisgICAgaWYgKFVzZSA9PSBOKQorICAgICAgY29udGludWU7CisgICAgaWYgKFVzZS0+aXNQcmVkZWNlc3Nvck9mKE4pKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCEoKFVzZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpMT0FEICYmCisgICAgICAgICAgIGNhc3Q8TG9hZFNETm9kZT4oVXNlKS0+Z2V0QmFzZVB0cigpID09IFB0cikgfHwKKyAgICAgICAgICAoVXNlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNUT1JFICYmCisgICAgICAgICAgIGNhc3Q8U3RvcmVTRE5vZGU+KFVzZSktPmdldEJhc2VQdHIoKSA9PSBQdHIpKSkKKyAgICAgIFJlYWxVc2UgPSB0cnVlOworICB9CisKKyAgaWYgKCFSZWFsVXNlKQorICAgIHJldHVybiBmYWxzZTsKKworICBTRFZhbHVlIFJlc3VsdDsKKyAgaWYgKGlzTG9hZCkKKyAgICBSZXN1bHQgPSBEQUcuZ2V0SW5kZXhlZExvYWQoU0RWYWx1ZShOLDApLCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlUHRyLCBPZmZzZXQsIEFNKTsKKyAgZWxzZQorICAgIFJlc3VsdCA9IERBRy5nZXRJbmRleGVkU3RvcmUoU0RWYWx1ZShOLDApLCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVB0ciwgT2Zmc2V0LCBBTSk7CisgICsrUHJlSW5kZXhlZE5vZGVzOworICArK05vZGVzQ29tYmluZWQ7CisgIERFQlVHKGRiZ3MoKSA8PCAiXG5SZXBsYWNpbmcuNCAiOworICAgICAgICBOLT5kdW1wKCZEQUcpOworICAgICAgICBkYmdzKCkgPDwgIlxuV2l0aDogIjsKKyAgICAgICAgUmVzdWx0LmdldE5vZGUoKS0+ZHVtcCgmREFHKTsKKyAgICAgICAgZGJncygpIDw8ICdcbicpOworICBXb3JrTGlzdFJlbW92ZXIgRGVhZE5vZGVzKCp0aGlzKTsKKyAgaWYgKGlzTG9hZCkgeworICAgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoTiwgMCksIFJlc3VsdC5nZXRWYWx1ZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRGVhZE5vZGVzKTsKKyAgICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBSZXN1bHQuZ2V0VmFsdWUoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlYWROb2Rlcyk7CisgIH0gZWxzZSB7CisgICAgREFHLlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShOLCAwKSwgUmVzdWx0LmdldFZhbHVlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZWFkTm9kZXMpOworICB9CisKKyAgLy8gRmluYWxseSwgc2luY2UgdGhlIG5vZGUgaXMgbm93IGRlYWQsIHJlbW92ZSBpdCBmcm9tIHRoZSBncmFwaC4KKyAgREFHLkRlbGV0ZU5vZGUoTik7CisKKyAgLy8gUmVwbGFjZSB0aGUgdXNlcyBvZiBQdHIgd2l0aCB1c2VzIG9mIHRoZSB1cGRhdGVkIGJhc2UgdmFsdWUuCisgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFB0ciwgUmVzdWx0LmdldFZhbHVlKGlzTG9hZCA/IDEgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlYWROb2Rlcyk7CisgIHJlbW92ZUZyb21Xb3JrTGlzdChQdHIuZ2V0Tm9kZSgpKTsKKyAgREFHLkRlbGV0ZU5vZGUoUHRyLmdldE5vZGUoKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBDb21iaW5lVG9Qb3N0SW5kZXhlZExvYWRTdG9yZSAtIFRyeSB0byBjb21iaW5lIGEgbG9hZCAvIHN0b3JlIHdpdGggYQorLy8vIGFkZCAvIHN1YiBvZiB0aGUgYmFzZSBwb2ludGVyIG5vZGUgaW50byBhIHBvc3QtaW5kZXhlZCBsb2FkIC8gc3RvcmUuCisvLy8gVGhlIHRyYW5zZm9ybWF0aW9uIGZvbGRlZCB0aGUgYWRkIC8gc3VidHJhY3QgaW50byB0aGUgbmV3IGluZGV4ZWQKKy8vLyBsb2FkIC8gc3RvcmUgZWZmZWN0aXZlbHkgYW5kIGFsbCBvZiBpdHMgdXNlcyBhcmUgcmVkaXJlY3RlZCB0byB0aGUKKy8vLyBuZXcgbG9hZCAvIHN0b3JlLgorYm9vbCBEQUdDb21iaW5lcjo6Q29tYmluZVRvUG9zdEluZGV4ZWRMb2FkU3RvcmUoU0ROb2RlICpOKSB7CisgIGlmICghTGVnYWxPcGVyYXRpb25zKQorICAgIHJldHVybiBmYWxzZTsKKworICBib29sIGlzTG9hZCA9IHRydWU7CisgIFNEVmFsdWUgUHRyOworICBFVlQgVlQ7CisgIGlmIChMb2FkU0ROb2RlICpMRCAgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihOKSkgeworICAgIGlmIChMRC0+aXNJbmRleGVkKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgVlQgPSBMRC0+Z2V0TWVtb3J5VlQoKTsKKyAgICBpZiAoIVRMSS5pc0luZGV4ZWRMb2FkTGVnYWwoSVNEOjpQT1NUX0lOQywgVlQpICYmCisgICAgICAgICFUTEkuaXNJbmRleGVkTG9hZExlZ2FsKElTRDo6UE9TVF9ERUMsIFZUKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBQdHIgPSBMRC0+Z2V0QmFzZVB0cigpOworICB9IGVsc2UgaWYgKFN0b3JlU0ROb2RlICpTVCAgPSBkeW5fY2FzdDxTdG9yZVNETm9kZT4oTikpIHsKKyAgICBpZiAoU1QtPmlzSW5kZXhlZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFZUID0gU1QtPmdldE1lbW9yeVZUKCk7CisgICAgaWYgKCFUTEkuaXNJbmRleGVkU3RvcmVMZWdhbChJU0Q6OlBPU1RfSU5DLCBWVCkgJiYKKyAgICAgICAgIVRMSS5pc0luZGV4ZWRTdG9yZUxlZ2FsKElTRDo6UE9TVF9ERUMsIFZUKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBQdHIgPSBTVC0+Z2V0QmFzZVB0cigpOworICAgIGlzTG9hZCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChQdHIuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBJID0gUHRyLmdldE5vZGUoKS0+dXNlX2JlZ2luKCksCisgICAgICAgICBFID0gUHRyLmdldE5vZGUoKS0+dXNlX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIFNETm9kZSAqT3AgPSAqSTsKKyAgICBpZiAoT3AgPT0gTiB8fAorICAgICAgICAoT3AtPmdldE9wY29kZSgpICE9IElTRDo6QUREICYmIE9wLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNVQikpCisgICAgICBjb250aW51ZTsKKworICAgIFNEVmFsdWUgQmFzZVB0cjsKKyAgICBTRFZhbHVlIE9mZnNldDsKKyAgICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gSVNEOjpVTklOREVYRUQ7CisgICAgaWYgKFRMSS5nZXRQb3N0SW5kZXhlZEFkZHJlc3NQYXJ0cyhOLCBPcCwgQmFzZVB0ciwgT2Zmc2V0LCBBTSwgREFHKSkgeworICAgICAgLy8gRG9uJ3QgY3JlYXRlIGEgaW5kZXhlZCBsb2FkIC8gc3RvcmUgd2l0aCB6ZXJvIG9mZnNldC4KKyAgICAgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE9mZnNldCkgJiYKKyAgICAgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihPZmZzZXQpLT5pc051bGxWYWx1ZSgpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gVHJ5IHR1cm5pbmcgaXQgaW50byBhIHBvc3QtaW5kZXhlZCBsb2FkIC8gc3RvcmUgZXhjZXB0IHdoZW4KKyAgICAgIC8vIDEpIEFsbCB1c2VzIGFyZSBsb2FkIC8gc3RvcmUgb3BzIHRoYXQgdXNlIGl0IGFzIGJhc2UgcHRyLgorICAgICAgLy8gMikgT3AgbXVzdCBiZSBpbmRlcGVuZGVudCBvZiBOLCBpLmUuIE9wIGlzIG5laXRoZXIgYSBwcmVkZWNlc3NvcgorICAgICAgLy8gICAgbm9yIGEgc3VjY2Vzc29yIG9mIE4uIE90aGVyd2lzZSwgaWYgT3AgaXMgZm9sZGVkIHRoYXQgd291bGQKKyAgICAgIC8vICAgIGNyZWF0ZSBhIGN5Y2xlLgorCisgICAgICBpZiAoaXNhPEZyYW1lSW5kZXhTRE5vZGU+KEJhc2VQdHIpIHx8IGlzYTxSZWdpc3RlclNETm9kZT4oQmFzZVB0cikpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBDaGVjayBmb3IgIzEuCisgICAgICBib29sIFRyeU5leHQgPSBmYWxzZTsKKyAgICAgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgSUkgPSBCYXNlUHRyLmdldE5vZGUoKS0+dXNlX2JlZ2luKCksCisgICAgICAgICAgICAgRUUgPSBCYXNlUHRyLmdldE5vZGUoKS0+dXNlX2VuZCgpOyBJSSAhPSBFRTsgKytJSSkgeworICAgICAgICBTRE5vZGUgKlVzZSA9ICpJSTsKKyAgICAgICAgaWYgKFVzZSA9PSBQdHIuZ2V0Tm9kZSgpKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIElmIGFsbCB0aGUgdXNlcyBhcmUgbG9hZCAvIHN0b3JlIGFkZHJlc3NlcywgdGhlbiBkb24ndCBkbyB0aGUKKyAgICAgICAgLy8gdHJhbnNmb3JtYXRpb24uCisgICAgICAgIGlmIChVc2UtPmdldE9wY29kZSgpID09IElTRDo6QUREIHx8IFVzZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIpeworICAgICAgICAgIGJvb2wgUmVhbFVzZSA9IGZhbHNlOworICAgICAgICAgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgSUlJID0gVXNlLT51c2VfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgRUVFID0gVXNlLT51c2VfZW5kKCk7IElJSSAhPSBFRUU7ICsrSUlJKSB7CisgICAgICAgICAgICBTRE5vZGUgKlVzZVVzZSA9ICpJSUk7CisgICAgICAgICAgICBpZiAoISgoVXNlVXNlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkxPQUQgJiYKKyAgICAgICAgICAgICAgICAgICBjYXN0PExvYWRTRE5vZGU+KFVzZVVzZSktPmdldEJhc2VQdHIoKS5nZXROb2RlKCkgPT0gVXNlKSB8fAorICAgICAgICAgICAgICAgICAgKFVzZVVzZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTVE9SRSAmJgorICAgICAgICAgICAgICAgICAgIGNhc3Q8U3RvcmVTRE5vZGU+KFVzZVVzZSktPmdldEJhc2VQdHIoKS5nZXROb2RlKCkgPT0gVXNlKSkpCisgICAgICAgICAgICAgIFJlYWxVc2UgPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghUmVhbFVzZSkgeworICAgICAgICAgICAgVHJ5TmV4dCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKFRyeU5leHQpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBDaGVjayBmb3IgIzIKKyAgICAgIGlmICghT3AtPmlzUHJlZGVjZXNzb3JPZihOKSAmJiAhTi0+aXNQcmVkZWNlc3Nvck9mKE9wKSkgeworICAgICAgICBTRFZhbHVlIFJlc3VsdCA9IGlzTG9hZAorICAgICAgICAgID8gREFHLmdldEluZGV4ZWRMb2FkKFNEVmFsdWUoTiwwKSwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlUHRyLCBPZmZzZXQsIEFNKQorICAgICAgICAgIDogREFHLmdldEluZGV4ZWRTdG9yZShTRFZhbHVlKE4sMCksIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VQdHIsIE9mZnNldCwgQU0pOworICAgICAgICArK1Bvc3RJbmRleGVkTm9kZXM7CisgICAgICAgICsrTm9kZXNDb21iaW5lZDsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJcblJlcGxhY2luZy41ICI7CisgICAgICAgICAgICAgIE4tPmR1bXAoJkRBRyk7CisgICAgICAgICAgICAgIGRiZ3MoKSA8PCAiXG5XaXRoOiAiOworICAgICAgICAgICAgICBSZXN1bHQuZ2V0Tm9kZSgpLT5kdW1wKCZEQUcpOworICAgICAgICAgICAgICBkYmdzKCkgPDwgJ1xuJyk7CisgICAgICAgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICAgICAgICBpZiAoaXNMb2FkKSB7CisgICAgICAgICAgREFHLlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShOLCAwKSwgUmVzdWx0LmdldFZhbHVlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZWFkTm9kZXMpOworICAgICAgICAgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksIFJlc3VsdC5nZXRWYWx1ZSgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRGVhZE5vZGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlKE4sIDApLCBSZXN1bHQuZ2V0VmFsdWUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlYWROb2Rlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5hbGx5LCBzaW5jZSB0aGUgbm9kZSBpcyBub3cgZGVhZCwgcmVtb3ZlIGl0IGZyb20gdGhlIGdyYXBoLgorICAgICAgICBEQUcuRGVsZXRlTm9kZShOKTsKKworICAgICAgICAvLyBSZXBsYWNlIHRoZSB1c2VzIG9mIFVzZSB3aXRoIHVzZXMgb2YgdGhlIHVwZGF0ZWQgYmFzZSB2YWx1ZS4KKyAgICAgICAgREFHLlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShPcCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdC5nZXRWYWx1ZShpc0xvYWQgPyAxIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZWFkTm9kZXMpOworICAgICAgICByZW1vdmVGcm9tV29ya0xpc3QoT3ApOworICAgICAgICBEQUcuRGVsZXRlTm9kZShPcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRMT0FEKFNETm9kZSAqTikgeworICBMb2FkU0ROb2RlICpMRCAgPSBjYXN0PExvYWRTRE5vZGU+KE4pOworICBTRFZhbHVlIENoYWluID0gTEQtPmdldENoYWluKCk7CisgIFNEVmFsdWUgUHRyICAgPSBMRC0+Z2V0QmFzZVB0cigpOworCisgIC8vIElmIGxvYWQgaXMgbm90IHZvbGF0aWxlIGFuZCB0aGVyZSBhcmUgbm8gdXNlcyBvZiB0aGUgbG9hZGVkIHZhbHVlIChhbmQKKyAgLy8gdGhlIHVwZGF0ZWQgaW5kZXhlZCB2YWx1ZSBpbiBjYXNlIG9mIGluZGV4ZWQgbG9hZHMpLCBjaGFuZ2UgdXNlcyBvZiB0aGUKKyAgLy8gY2hhaW4gdmFsdWUgaW50byB1c2VzIG9mIHRoZSBjaGFpbiBpbnB1dCAoaS5lLiBkZWxldGUgdGhlIGRlYWQgbG9hZCkuCisgIGlmICghTEQtPmlzVm9sYXRpbGUoKSkgeworICAgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMSkgPT0gTVZUOjpPdGhlcikgeworICAgICAgLy8gVW5pbmRleGVkIGxvYWRzLgorICAgICAgaWYgKE4tPmhhc05Vc2VzT2ZWYWx1ZSgwLCAwKSkgeworICAgICAgICAvLyBJdCdzIG5vdCBzYWZlIHRvIHVzZSB0aGUgdHdvIHZhbHVlIENvbWJpbmVUbyB2YXJpYW50IGhlcmUuIGUuZy4KKyAgICAgICAgLy8gdjEsIGNoYWluMiA9IGxvYWQgY2hhaW4xLCBsb2MKKyAgICAgICAgLy8gdjIsIGNoYWluMyA9IGxvYWQgY2hhaW4yLCBsb2MKKyAgICAgICAgLy8gdjMgICAgICAgICA9IGFkZCB2MiwgYworICAgICAgICAvLyBOb3cgd2UgcmVwbGFjZSB1c2Ugb2YgY2hhaW4yIHdpdGggY2hhaW4xLiAgVGhpcyBtYWtlcyB0aGUgc2Vjb25kIGxvYWQKKyAgICAgICAgLy8gaXNvbW9ycGhpYyB0byB0aGUgb25lIHdlIGFyZSBkZWxldGluZywgYW5kIHRodXMgbWFrZXMgdGhpcyBsb2FkIGxpdmUuCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXG5SZXBsYWNpbmcuNiAiOworICAgICAgICAgICAgICBOLT5kdW1wKCZEQUcpOworICAgICAgICAgICAgICBkYmdzKCkgPDwgIlxuV2l0aCBjaGFpbjogIjsKKyAgICAgICAgICAgICAgQ2hhaW4uZ2V0Tm9kZSgpLT5kdW1wKCZEQUcpOworICAgICAgICAgICAgICBkYmdzKCkgPDwgIlxuIik7CisgICAgICAgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICAgICAgICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBDaGFpbiwgJkRlYWROb2Rlcyk7CisKKyAgICAgICAgaWYgKE4tPnVzZV9lbXB0eSgpKSB7CisgICAgICAgICAgcmVtb3ZlRnJvbVdvcmtMaXN0KE4pOworICAgICAgICAgIERBRy5EZWxldGVOb2RlKE4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7ICAgLy8gUmV0dXJuIE4gc28gaXQgZG9lc24ndCBnZXQgcmVjaGVja2VkIQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBJbmRleGVkIGxvYWRzLgorICAgICAgYXNzZXJ0KE4tPmdldFZhbHVlVHlwZSgyKSA9PSBNVlQ6Ok90aGVyICYmICJNYWxmb3JtZWQgaW5kZXhlZCBsb2Fkcz8iKTsKKyAgICAgIGlmIChOLT5oYXNOVXNlc09mVmFsdWUoMCwgMCkgJiYgTi0+aGFzTlVzZXNPZlZhbHVlKDAsIDEpKSB7CisgICAgICAgIFNEVmFsdWUgVW5kZWYgPSBEQUcuZ2V0VU5ERUYoTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJcblJlcGxhY2luZy43ICI7CisgICAgICAgICAgICAgIE4tPmR1bXAoJkRBRyk7CisgICAgICAgICAgICAgIGRiZ3MoKSA8PCAiXG5XaXRoOiAiOworICAgICAgICAgICAgICBVbmRlZi5nZXROb2RlKCktPmR1bXAoJkRBRyk7CisgICAgICAgICAgICAgIGRiZ3MoKSA8PCAiIGFuZCAyIG90aGVyIHZhbHVlc1xuIik7CisgICAgICAgIFdvcmtMaXN0UmVtb3ZlciBEZWFkTm9kZXMoKnRoaXMpOworICAgICAgICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlKE4sIDApLCBVbmRlZiwgJkRlYWROb2Rlcyk7CisgICAgICAgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRVTkRFRihOLT5nZXRWYWx1ZVR5cGUoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRGVhZE5vZGVzKTsKKyAgICAgICAgREFHLlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShOLCAyKSwgQ2hhaW4sICZEZWFkTm9kZXMpOworICAgICAgICByZW1vdmVGcm9tV29ya0xpc3QoTik7CisgICAgICAgIERBRy5EZWxldGVOb2RlKE4pOworICAgICAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsgICAvLyBSZXR1cm4gTiBzbyBpdCBkb2Vzbid0IGdldCByZWNoZWNrZWQhCisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhpcyBsb2FkIGlzIGRpcmVjdGx5IHN0b3JlZCwgcmVwbGFjZSB0aGUgbG9hZCB2YWx1ZSB3aXRoIHRoZSBzdG9yZWQKKyAgLy8gdmFsdWUuCisgIC8vIFRPRE86IEhhbmRsZSBzdG9yZSBsYXJnZSAtPiByZWFkIHNtYWxsIHBvcnRpb24uCisgIC8vIFRPRE86IEhhbmRsZSBUUlVOQ1NUT1JFL0xPQURFWFQKKyAgaWYgKExELT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpOT05fRVhUTE9BRCAmJgorICAgICAgIUxELT5pc1ZvbGF0aWxlKCkpIHsKKyAgICBpZiAoSVNEOjppc05PTl9UUlVOQ1N0b3JlKENoYWluLmdldE5vZGUoKSkpIHsKKyAgICAgIFN0b3JlU0ROb2RlICpQcmV2U1QgPSBjYXN0PFN0b3JlU0ROb2RlPihDaGFpbik7CisgICAgICBpZiAoUHJldlNULT5nZXRCYXNlUHRyKCkgPT0gUHRyICYmCisgICAgICAgICAgUHJldlNULT5nZXRWYWx1ZSgpLmdldFZhbHVlVHlwZSgpID09IE4tPmdldFZhbHVlVHlwZSgwKSkKKyAgICAgIHJldHVybiBDb21iaW5lVG8oTiwgQ2hhaW4uZ2V0T3BlcmFuZCgxKSwgQ2hhaW4pOworICAgIH0KKyAgfQorCisgIC8vIFRyeSB0byBpbmZlciBiZXR0ZXIgYWxpZ25tZW50IGluZm9ybWF0aW9uIHRoYW4gdGhlIGxvYWQgYWxyZWFkeSBoYXMuCisgIGlmIChPcHRMZXZlbCAhPSBDb2RlR2VuT3B0OjpOb25lICYmIExELT5pc1VuaW5kZXhlZCgpKSB7CisgICAgaWYgKHVuc2lnbmVkIEFsaWduID0gREFHLkluZmVyUHRyQWxpZ25tZW50KFB0cikpIHsKKyAgICAgIGlmIChBbGlnbiA+IExELT5nZXRBbGlnbm1lbnQoKSkKKyAgICAgICAgcmV0dXJuIERBRy5nZXRFeHRMb2FkKExELT5nZXRFeHRlbnNpb25UeXBlKCksIExELT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW4sIFB0ciwgTEQtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwgTEQtPmdldE1lbW9yeVZUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+aXNWb2xhdGlsZSgpLCBMRC0+aXNOb25UZW1wb3JhbCgpLCBBbGlnbik7CisgICAgfQorICB9CisKKyAgaWYgKENvbWJpbmVyQUEpIHsKKyAgICAvLyBXYWxrIHVwIGNoYWluIHNraXBwaW5nIG5vbi1hbGlhc2luZyBtZW1vcnkgbm9kZXMuCisgICAgU0RWYWx1ZSBCZXR0ZXJDaGFpbiA9IEZpbmRCZXR0ZXJDaGFpbihOLCBDaGFpbik7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhIGJldHRlciBjaGFpbi4KKyAgICBpZiAoQ2hhaW4gIT0gQmV0dGVyQ2hhaW4pIHsKKyAgICAgIFNEVmFsdWUgUmVwbExvYWQ7CisKKyAgICAgIC8vIFJlcGxhY2UgdGhlIGNoYWluIHRvIHZvaWQgZGVwZW5kZW5jeS4KKyAgICAgIGlmIChMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6Tk9OX0VYVExPQUQpIHsKKyAgICAgICAgUmVwbExvYWQgPSBEQUcuZ2V0TG9hZChOLT5nZXRWYWx1ZVR5cGUoMCksIExELT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJldHRlckNoYWluLCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmdldFNyY1ZhbHVlKCksIExELT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5pc1ZvbGF0aWxlKCksIExELT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmdldEFsaWdubWVudCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFJlcGxMb2FkID0gREFHLmdldEV4dExvYWQoTEQtPmdldEV4dGVuc2lvblR5cGUoKSwgTEQtPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZXR0ZXJDaGFpbiwgUHRyLCBMRC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0TWVtb3J5VlQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmdldEFsaWdubWVudCgpKTsKKyAgICAgIH0KKworICAgICAgLy8gQ3JlYXRlIHRva2VuIGZhY3RvciB0byBrZWVwIG9sZCBjaGFpbiBjb25uZWN0ZWQuCisgICAgICBTRFZhbHVlIFRva2VuID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBDaGFpbiwgUmVwbExvYWQuZ2V0VmFsdWUoMSkpOworICAgICAgCisgICAgICAvLyBNYWtlIHN1cmUgdGhlIG5ldyBhbmQgb2xkIGNoYWlucyBhcmUgY2xlYW5lZCB1cC4KKyAgICAgIEFkZFRvV29ya0xpc3QoVG9rZW4uZ2V0Tm9kZSgpKTsKKyAgICAgIAorICAgICAgLy8gUmVwbGFjZSB1c2VzIHdpdGggbG9hZCByZXN1bHQgYW5kIHRva2VuIGZhY3Rvci4gRG9uJ3QgYWRkIHVzZXJzCisgICAgICAvLyB0byB3b3JrIGxpc3QuCisgICAgICByZXR1cm4gQ29tYmluZVRvKE4sIFJlcGxMb2FkLmdldFZhbHVlKDApLCBUb2tlbiwgZmFsc2UpOworICAgIH0KKyAgfQorCisgIC8vIFRyeSB0cmFuc2Zvcm1pbmcgTiB0byBhbiBpbmRleGVkIGxvYWQuCisgIGlmIChDb21iaW5lVG9QcmVJbmRleGVkTG9hZFN0b3JlKE4pIHx8IENvbWJpbmVUb1Bvc3RJbmRleGVkTG9hZFN0b3JlKE4pKQorICAgIHJldHVybiBTRFZhbHVlKE4sIDApOworCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBDaGVja0Zvck1hc2tlZExvYWQgLSBDaGVjayB0byBzZWUgaWYgViBpcyAoYW5kIGxvYWQgKHB0ciksIGltbSksIHdoZXJlIHRoZQorLy8vIGxvYWQgaXMgaGF2aW5nIHNwZWNpZmljIGJ5dGVzIGNsZWFyZWQgb3V0LiAgSWYgc28sIHJldHVybiB0aGUgYnl0ZSBzaXplCisvLy8gYmVpbmcgbWFza2VkIG91dCBhbmQgdGhlIHNoaWZ0IGFtb3VudC4KK3N0YXRpYyBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgorQ2hlY2tGb3JNYXNrZWRMb2FkKFNEVmFsdWUgViwgU0RWYWx1ZSBQdHIsIFNEVmFsdWUgQ2hhaW4pIHsKKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gUmVzdWx0KDAsIDApOworICAKKyAgLy8gQ2hlY2sgZm9yIHRoZSBzdHJ1Y3R1cmUgd2UncmUgbG9va2luZyBmb3IuCisgIGlmIChWLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OkFORCB8fAorICAgICAgIWlzYTxDb25zdGFudFNETm9kZT4oVi0+Z2V0T3BlcmFuZCgxKSkgfHwKKyAgICAgICFJU0Q6OmlzTm9ybWFsTG9hZChWLT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKSkpCisgICAgcmV0dXJuIFJlc3VsdDsKKyAgCisgIC8vIENoZWNrIHRoZSBjaGFpbiBhbmQgcG9pbnRlci4KKyAgTG9hZFNETm9kZSAqTEQgPSBjYXN0PExvYWRTRE5vZGU+KFYtPmdldE9wZXJhbmQoMCkpOworICBpZiAoTEQtPmdldEJhc2VQdHIoKSAhPSBQdHIpIHJldHVybiBSZXN1bHQ7ICAvLyBOb3QgZnJvbSBzYW1lIHBvaW50ZXIuCisgIAorICAvLyBUaGUgc3RvcmUgc2hvdWxkIGJlIGNoYWluZWQgZGlyZWN0bHkgdG8gdGhlIGxvYWQgb3IgYmUgYW4gb3BlcmFuZCBvZiBhCisgIC8vIHRva2VuZmFjdG9yLgorICBpZiAoTEQgPT0gQ2hhaW4uZ2V0Tm9kZSgpKQorICAgIDsgLy8gb2suCisgIGVsc2UgaWYgKENoYWluLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlRva2VuRmFjdG9yKQorICAgIHJldHVybiBSZXN1bHQ7IC8vIEZhaWwuCisgIGVsc2UgeworICAgIGJvb2wgaXNPayA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDaGFpbi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoQ2hhaW4tPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpID09IExEKSB7CisgICAgICAgIGlzT2sgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBpZiAoIWlzT2spIHJldHVybiBSZXN1bHQ7CisgIH0KKyAgCisgIC8vIFRoaXMgb25seSBoYW5kbGVzIHNpbXBsZSB0eXBlcy4KKyAgaWYgKFYuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjppMTYgJiYKKyAgICAgIFYuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjppMzIgJiYKKyAgICAgIFYuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjppNjQpCisgICAgcmV0dXJuIFJlc3VsdDsKKworICAvLyBDaGVjayB0aGUgY29uc3RhbnQgbWFzay4gIEludmVydCBpdCBzbyB0aGF0IHRoZSBiaXRzIGJlaW5nIG1hc2tlZCBvdXQgYXJlCisgIC8vIDAgYW5kIHRoZSBiaXRzIGJlaW5nIGtlcHQgYXJlIDEuICBVc2UgZ2V0U0V4dFZhbHVlIHNvIHRoYXQgbGVhZGluZyBiaXRzCisgIC8vIGZvbGxvdyB0aGUgc2lnbiBiaXQgZm9yIHVuaWZvcm1pdHkuCisgIHVpbnQ2NF90IE5vdE1hc2sgPSB+Y2FzdDxDb25zdGFudFNETm9kZT4oVi0+Z2V0T3BlcmFuZCgxKSktPmdldFNFeHRWYWx1ZSgpOworICB1bnNpZ25lZCBOb3RNYXNrTFogPSBDb3VudExlYWRpbmdaZXJvc182NChOb3RNYXNrKTsKKyAgaWYgKE5vdE1hc2tMWiAmIDcpIHJldHVybiBSZXN1bHQ7ICAvLyBNdXN0IGJlIG11bHRpcGxlIG9mIGEgYnl0ZS4KKyAgdW5zaWduZWQgTm90TWFza1RaID0gQ291bnRUcmFpbGluZ1plcm9zXzY0KE5vdE1hc2spOworICBpZiAoTm90TWFza1RaICYgNykgcmV0dXJuIFJlc3VsdDsgIC8vIE11c3QgYmUgbXVsdGlwbGUgb2YgYSBieXRlLgorICBpZiAoTm90TWFza0xaID09IDY0KSByZXR1cm4gUmVzdWx0OyAgLy8gQWxsIHplcm8gbWFzay4KKyAgCisgIC8vIFNlZSBpZiB3ZSBoYXZlIGEgY29udGludW91cyBydW4gb2YgYml0cy4gIElmIHNvLCB3ZSBoYXZlIDAqMSswKgorICBpZiAoQ291bnRUcmFpbGluZ09uZXNfNjQoTm90TWFzayA+PiBOb3RNYXNrVFopK05vdE1hc2tUWitOb3RNYXNrTFogIT0gNjQpCisgICAgcmV0dXJuIFJlc3VsdDsKKworICAvLyBBZGp1c3QgTm90TWFza0xaIGRvd24gdG8gYmUgZnJvbSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGludCBpbnN0ZWFkIG9mIGk2NC4KKyAgaWYgKFYuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjppNjQgJiYgTm90TWFza0xaKQorICAgIE5vdE1hc2tMWiAtPSA2NC1WLmdldFZhbHVlU2l6ZUluQml0cygpOworICAKKyAgdW5zaWduZWQgTWFza2VkQnl0ZXMgPSAoVi5nZXRWYWx1ZVNpemVJbkJpdHMoKS1Ob3RNYXNrTFotTm90TWFza1RaKS84OworICBzd2l0Y2ggKE1hc2tlZEJ5dGVzKSB7CisgIGNhc2UgMTogCisgIGNhc2UgMjogCisgIGNhc2UgNDogYnJlYWs7CisgIGRlZmF1bHQ6IHJldHVybiBSZXN1bHQ7IC8vIEFsbCBvbmUgbWFzaywgb3IgNS1ieXRlIG1hc2suCisgIH0KKyAgCisgIC8vIFZlcmlmeSB0aGF0IHRoZSBmaXJzdCBiaXQgc3RhcnRzIGF0IGEgbXVsdGlwbGUgb2YgbWFzayBzbyB0aGF0IHRoZSBhY2Nlc3MKKyAgLy8gaXMgYWxpZ25lZCB0aGUgc2FtZSBhcyB0aGUgYWNjZXNzIHdpZHRoLgorICBpZiAoTm90TWFza1RaICYmIE5vdE1hc2tUWi84ICUgTWFza2VkQnl0ZXMpIHJldHVybiBSZXN1bHQ7CisgIAorICBSZXN1bHQuZmlyc3QgPSBNYXNrZWRCeXRlczsKKyAgUmVzdWx0LnNlY29uZCA9IE5vdE1hc2tUWi84OworICByZXR1cm4gUmVzdWx0OworfQorCisKKy8vLyBTaHJpbmtMb2FkUmVwbGFjZVN0b3JlV2l0aFN0b3JlIC0gQ2hlY2sgdG8gc2VlIGlmIElWYWwgaXMgc29tZXRoaW5nIHRoYXQKKy8vLyBwcm92aWRlcyBhIHZhbHVlIGFzIHNwZWNpZmllZCBieSBNYXNrSW5mby4gIElmIHNvLCByZXBsYWNlIHRoZSBzcGVjaWZpZWQKKy8vLyBzdG9yZSB3aXRoIGEgbmFycm93ZXIgc3RvcmUgb2YgdHJ1bmNhdGVkIElWYWwuCitzdGF0aWMgU0ROb2RlICoKK1Nocmlua0xvYWRSZXBsYWNlU3RvcmVXaXRoU3RvcmUoY29uc3Qgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gJk1hc2tJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIElWYWwsIFN0b3JlU0ROb2RlICpTdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHQ29tYmluZXIgKkRDKSB7CisgIHVuc2lnbmVkIE51bUJ5dGVzID0gTWFza0luZm8uZmlyc3Q7CisgIHVuc2lnbmVkIEJ5dGVTaGlmdCA9IE1hc2tJbmZvLnNlY29uZDsKKyAgU2VsZWN0aW9uREFHICZEQUcgPSBEQy0+Z2V0REFHKCk7CisgIAorICAvLyBDaGVjayB0byBzZWUgaWYgSVZhbCBpcyBhbGwgemVyb3MgaW4gdGhlIHBhcnQgYmVpbmcgbWFza2VkIGluIGJ5IHRoZSAnb3InCisgIC8vIHRoYXQgdXNlcyB0aGlzLiAgSWYgbm90LCB0aGlzIGlzIG5vdCBhIHJlcGxhY2VtZW50LgorICBBUEludCBNYXNrID0gfkFQSW50OjpnZXRCaXRzU2V0KElWYWwuZ2V0VmFsdWVTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVNoaWZ0KjgsIChCeXRlU2hpZnQrTnVtQnl0ZXMpKjgpOworICBpZiAoIURBRy5NYXNrZWRWYWx1ZUlzWmVybyhJVmFsLCBNYXNrKSkgcmV0dXJuIDA7CisgIAorICAvLyBDaGVjayB0aGF0IGl0IGlzIGxlZ2FsIG9uIHRoZSB0YXJnZXQgdG8gZG8gdGhpcy4gIEl0IGlzIGxlZ2FsIGlmIHRoZSBuZXcKKyAgLy8gVlQgd2UncmUgc2hyaW5raW5nIHRvIChpOC9pMTYvaTMyKSBpcyBsZWdhbCBvciB3ZSdyZSBzdGlsbCBiZWZvcmUgdHlwZQorICAvLyBsZWdhbGl6YXRpb24uCisgIE1WVCBWVCA9IE1WVDo6Z2V0SW50ZWdlclZUKE51bUJ5dGVzKjgpOworICBpZiAoIURDLT5pc1R5cGVMZWdhbChWVCkpCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBPa2F5LCB3ZSBjYW4gZG8gdGhpcyEgIFJlcGxhY2UgdGhlICdTdCcgc3RvcmUgd2l0aCBhIHN0b3JlIG9mIElWYWwgdGhhdCBpcworICAvLyBzaGlmdGVkIGJ5IEJ5dGVTaGlmdCBhbmQgdHJ1bmNhdGVkIGRvd24gdG8gTnVtQnl0ZXMuCisgIGlmIChCeXRlU2hpZnQpCisgICAgSVZhbCA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBJVmFsLT5nZXREZWJ1Z0xvYygpLCBJVmFsLmdldFZhbHVlVHlwZSgpLCBJVmFsLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQnl0ZVNoaWZ0KjgsIERDLT5nZXRTaGlmdEFtb3VudFR5KCkpKTsKKworICAvLyBGaWd1cmUgb3V0IHRoZSBvZmZzZXQgZm9yIHRoZSBzdG9yZSBhbmQgdGhlIGFsaWdubWVudCBvZiB0aGUgYWNjZXNzLgorICB1bnNpZ25lZCBTdE9mZnNldDsKKyAgdW5zaWduZWQgTmV3QWxpZ24gPSBTdC0+Z2V0QWxpZ25tZW50KCk7CisKKyAgaWYgKERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKS5pc0xpdHRsZUVuZGlhbigpKQorICAgIFN0T2Zmc2V0ID0gQnl0ZVNoaWZ0OworICBlbHNlCisgICAgU3RPZmZzZXQgPSBJVmFsLmdldFZhbHVlVHlwZSgpLmdldFN0b3JlU2l6ZSgpIC0gQnl0ZVNoaWZ0IC0gTnVtQnl0ZXM7CisgIAorICBTRFZhbHVlIFB0ciA9IFN0LT5nZXRCYXNlUHRyKCk7CisgIGlmIChTdE9mZnNldCkgeworICAgIFB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBJVmFsLT5nZXREZWJ1Z0xvYygpLCBQdHIuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgUHRyLCBEQUcuZ2V0Q29uc3RhbnQoU3RPZmZzZXQsIFB0ci5nZXRWYWx1ZVR5cGUoKSkpOworICAgIE5ld0FsaWduID0gTWluQWxpZ24oTmV3QWxpZ24sIFN0T2Zmc2V0KTsKKyAgfQorICAKKyAgLy8gVHJ1bmNhdGUgZG93biB0byB0aGUgbmV3IHNpemUuCisgIElWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBJVmFsLT5nZXREZWJ1Z0xvYygpLCBWVCwgSVZhbCk7CisgIAorICArK09wc05hcnJvd2VkOworICByZXR1cm4gREFHLmdldFN0b3JlKFN0LT5nZXRDaGFpbigpLCBTdC0+Z2V0RGVidWdMb2MoKSwgSVZhbCwgUHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICBTdC0+Z2V0U3JjVmFsdWUoKSwgU3QtPmdldFNyY1ZhbHVlT2Zmc2V0KCkrU3RPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBOZXdBbGlnbikuZ2V0Tm9kZSgpOworfQorCisKKy8vLyBSZWR1Y2VMb2FkT3BTdG9yZVdpZHRoIC0gTG9vayBmb3Igc2VxdWVuY2Ugb2YgbG9hZCAvIG9wIC8gc3RvcmUgd2hlcmUgb3AgaXMKKy8vLyBvbmUgb2YgJ29yJywgJ3hvcicsIGFuZCAnYW5kJyBvZiBpbW1lZGlhdGVzLiBJZiAnb3AnIGlzIG9ubHkgdG91Y2hpbmcgc29tZQorLy8vIG9mIHRoZSBsb2FkZWQgYml0cywgdHJ5IG5hcnJvd2luZyB0aGUgbG9hZCBhbmQgc3RvcmUgaWYgaXQgd291bGQgZW5kIHVwCisvLy8gYmVpbmcgYSB3aW4gZm9yIHBlcmZvcm1hbmNlIG9yIGNvZGUgc2l6ZS4KK1NEVmFsdWUgREFHQ29tYmluZXI6OlJlZHVjZUxvYWRPcFN0b3JlV2lkdGgoU0ROb2RlICpOKSB7CisgIFN0b3JlU0ROb2RlICpTVCAgPSBjYXN0PFN0b3JlU0ROb2RlPihOKTsKKyAgaWYgKFNULT5pc1ZvbGF0aWxlKCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBTRFZhbHVlIENoYWluID0gU1QtPmdldENoYWluKCk7CisgIFNEVmFsdWUgVmFsdWUgPSBTVC0+Z2V0VmFsdWUoKTsKKyAgU0RWYWx1ZSBQdHIgICA9IFNULT5nZXRCYXNlUHRyKCk7CisgIEVWVCBWVCA9IFZhbHVlLmdldFZhbHVlVHlwZSgpOworCisgIGlmIChTVC0+aXNUcnVuY2F0aW5nU3RvcmUoKSB8fCBWVC5pc1ZlY3RvcigpIHx8ICFWYWx1ZS5oYXNPbmVVc2UoKSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIHVuc2lnbmVkIE9wYyA9IFZhbHVlLmdldE9wY29kZSgpOworICAKKyAgLy8gSWYgdGhpcyBpcyAic3RvcmUgKG9yIFgsIFkpLCBQIiBhbmQgWCBpcyAiKGFuZCAobG9hZCBQKSwgY3N0KSIsIHdoZXJlIGNzdAorICAvLyBpcyBhIGJ5dGUgbWFzayBpbmRpY2F0aW5nIGEgY29uc2VjdXRpdmUgbnVtYmVyIG9mIGJ5dGVzLCBjaGVjayB0byBzZWUgaWYKKyAgLy8gWSBpcyBrbm93biB0byBwcm92aWRlIGp1c3QgdGhvc2UgYnl0ZXMuICBJZiBzbywgd2UgdHJ5IHRvIHJlcGxhY2UgdGhlCisgIC8vIGxvYWQgKyByZXBsYWNlICsgc3RvcmUgc2VxdWVuY2Ugd2l0aCBhIHNpbmdsZSAobmFycm93ZXIpIHN0b3JlLCB3aGljaCBtYWtlcworICAvLyB0aGUgbG9hZCBkZWFkLgorICBpZiAoT3BjID09IElTRDo6T1IpIHsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBNYXNrZWRMb2FkOworICAgIE1hc2tlZExvYWQgPSBDaGVja0Zvck1hc2tlZExvYWQoVmFsdWUuZ2V0T3BlcmFuZCgwKSwgUHRyLCBDaGFpbik7CisgICAgaWYgKE1hc2tlZExvYWQuZmlyc3QpCisgICAgICBpZiAoU0ROb2RlICpOZXdTVCA9IFNocmlua0xvYWRSZXBsYWNlU3RvcmVXaXRoU3RvcmUoTWFza2VkTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUuZ2V0T3BlcmFuZCgxKSwgU1QsdGhpcykpCisgICAgICAgIHJldHVybiBTRFZhbHVlKE5ld1NULCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvLyBPciBpcyBjb21tdXRhdGl2ZSwgc28gdHJ5IHN3YXBwaW5nIFggYW5kIFkuCisgICAgTWFza2VkTG9hZCA9IENoZWNrRm9yTWFza2VkTG9hZChWYWx1ZS5nZXRPcGVyYW5kKDEpLCBQdHIsIENoYWluKTsKKyAgICBpZiAoTWFza2VkTG9hZC5maXJzdCkKKyAgICAgIGlmIChTRE5vZGUgKk5ld1NUID0gU2hyaW5rTG9hZFJlcGxhY2VTdG9yZVdpdGhTdG9yZShNYXNrZWRMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZS5nZXRPcGVyYW5kKDApLCBTVCx0aGlzKSkKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoTmV3U1QsIDApOworICB9CisgIAorICBpZiAoKE9wYyAhPSBJU0Q6Ok9SICYmIE9wYyAhPSBJU0Q6OlhPUiAmJiBPcGMgIT0gSVNEOjpBTkQpIHx8CisgICAgICBWYWx1ZS5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpICE9IElTRDo6Q29uc3RhbnQpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBTRFZhbHVlIE4wID0gVmFsdWUuZ2V0T3BlcmFuZCgwKTsKKyAgaWYgKElTRDo6aXNOb3JtYWxMb2FkKE4wLmdldE5vZGUoKSkgJiYgTjAuaGFzT25lVXNlKCkpIHsKKyAgICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oTjApOworICAgIGlmIChMRC0+Z2V0QmFzZVB0cigpICE9IFB0cikKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICAvLyBGaW5kIHRoZSB0eXBlIHRvIG5hcnJvdyBpdCB0aGUgbG9hZCAvIG9wIC8gc3RvcmUgdG8uCisgICAgU0RWYWx1ZSBOMSA9IFZhbHVlLmdldE9wZXJhbmQoMSk7CisgICAgdW5zaWduZWQgQml0V2lkdGggPSBOMS5nZXRWYWx1ZVNpemVJbkJpdHMoKTsKKyAgICBBUEludCBJbW0gPSBjYXN0PENvbnN0YW50U0ROb2RlPihOMSktPmdldEFQSW50VmFsdWUoKTsKKyAgICBpZiAoT3BjID09IElTRDo6QU5EKQorICAgICAgSW1tIF49IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpOworICAgIGlmIChJbW0gPT0gMCB8fCBJbW0uaXNBbGxPbmVzVmFsdWUoKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgdW5zaWduZWQgU2hBbXQgPSBJbW0uY291bnRUcmFpbGluZ1plcm9zKCk7CisgICAgdW5zaWduZWQgTVNCID0gQml0V2lkdGggLSBJbW0uY291bnRMZWFkaW5nWmVyb3MoKSAtIDE7CisgICAgdW5zaWduZWQgTmV3QlcgPSBOZXh0UG93ZXJPZjIoTVNCIC0gU2hBbXQpOworICAgIEVWVCBOZXdWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBOZXdCVyk7CisgICAgd2hpbGUgKE5ld0JXIDwgQml0V2lkdGggJiYKKyAgICAgICAgICAgIShUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKE9wYywgTmV3VlQpICYmCisgICAgICAgICAgICAgVExJLmlzTmFycm93aW5nUHJvZml0YWJsZShWVCwgTmV3VlQpKSkgeworICAgICAgTmV3QlcgPSBOZXh0UG93ZXJPZjIoTmV3QlcpOworICAgICAgTmV3VlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgTmV3QlcpOworICAgIH0KKyAgICBpZiAoTmV3QlcgPj0gQml0V2lkdGgpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgICAgLy8gSWYgdGhlIGxzYiBjaGFuZ2VkIGRvZXMgbm90IHN0YXJ0IGF0IHRoZSB0eXBlIGJpdHdpZHRoIGJvdW5kYXJ5LAorICAgIC8vIHN0YXJ0IGF0IHRoZSBwcmV2aW91cyBvbmUuCisgICAgaWYgKFNoQW10ICUgTmV3QlcpCisgICAgICBTaEFtdCA9ICgoKFNoQW10ICsgTmV3QlcgLSAxKSAvIE5ld0JXKSAqIE5ld0JXKSAtIE5ld0JXOworICAgIEFQSW50IE1hc2sgPSBBUEludDo6Z2V0Qml0c1NldChCaXRXaWR0aCwgU2hBbXQsIFNoQW10ICsgTmV3QlcpOworICAgIGlmICgoSW1tICYgTWFzaykgPT0gSW1tKSB7CisgICAgICBBUEludCBOZXdJbW0gPSAoSW1tICYgTWFzaykubHNocihTaEFtdCkudHJ1bmMoTmV3QlcpOworICAgICAgaWYgKE9wYyA9PSBJU0Q6OkFORCkKKyAgICAgICAgTmV3SW1tIF49IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoTmV3QlcpOworICAgICAgdWludDY0X3QgUHRyT2ZmID0gU2hBbXQgLyA4OworICAgICAgLy8gRm9yIGJpZyBlbmRpYW4gdGFyZ2V0cywgd2UgbmVlZCB0byBhZGp1c3QgdGhlIG9mZnNldCB0byB0aGUgcG9pbnRlciB0bworICAgICAgLy8gbG9hZCB0aGUgY29ycmVjdCBieXRlcy4KKyAgICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICAgICAgUHRyT2ZmID0gKEJpdFdpZHRoICsgNyAtIE5ld0JXKSAvIDggLSBQdHJPZmY7CisKKyAgICAgIHVuc2lnbmVkIE5ld0FsaWduID0gTWluQWxpZ24oTEQtPmdldEFsaWdubWVudCgpLCBQdHJPZmYpOworICAgICAgY29uc3QgVHlwZSAqTmV3VlRUeSA9IE5ld1ZULmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpOworICAgICAgaWYgKE5ld0FsaWduIDwgVExJLmdldFRhcmdldERhdGEoKS0+Z2V0QUJJVHlwZUFsaWdubWVudChOZXdWVFR5KSkKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAgICAgU0RWYWx1ZSBOZXdQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgTEQtPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0ci5nZXRWYWx1ZVR5cGUoKSwgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoUHRyT2ZmLCBQdHIuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgICAgIFNEVmFsdWUgTmV3TEQgPSBEQUcuZ2V0TG9hZChOZXdWVCwgTjAuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0Q2hhaW4oKSwgTmV3UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5nZXRTcmNWYWx1ZSgpLCBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+aXNWb2xhdGlsZSgpLCBMRC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0FsaWduKTsKKyAgICAgIFNEVmFsdWUgTmV3VmFsID0gREFHLmdldE5vZGUoT3BjLCBWYWx1ZS5nZXREZWJ1Z0xvYygpLCBOZXdWVCwgTmV3TEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOZXdJbW0sIE5ld1ZUKSk7CisgICAgICBTRFZhbHVlIE5ld1NUID0gREFHLmdldFN0b3JlKENoYWluLCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdWYWwsIE5ld1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldFNyY1ZhbHVlKCksIFNULT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIE5ld0FsaWduKTsKKworICAgICAgQWRkVG9Xb3JrTGlzdChOZXdQdHIuZ2V0Tm9kZSgpKTsKKyAgICAgIEFkZFRvV29ya0xpc3QoTmV3TEQuZ2V0Tm9kZSgpKTsKKyAgICAgIEFkZFRvV29ya0xpc3QoTmV3VmFsLmdldE5vZGUoKSk7CisgICAgICBXb3JrTGlzdFJlbW92ZXIgRGVhZE5vZGVzKCp0aGlzKTsKKyAgICAgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKE4wLmdldFZhbHVlKDEpLCBOZXdMRC5nZXRWYWx1ZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZWFkTm9kZXMpOworICAgICAgKytPcHNOYXJyb3dlZDsKKyAgICAgIHJldHVybiBOZXdTVDsKKyAgICB9CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR0NvbWJpbmVyOjp2aXNpdFNUT1JFKFNETm9kZSAqTikgeworICBTdG9yZVNETm9kZSAqU1QgID0gY2FzdDxTdG9yZVNETm9kZT4oTik7CisgIFNEVmFsdWUgQ2hhaW4gPSBTVC0+Z2V0Q2hhaW4oKTsKKyAgU0RWYWx1ZSBWYWx1ZSA9IFNULT5nZXRWYWx1ZSgpOworICBTRFZhbHVlIFB0ciAgID0gU1QtPmdldEJhc2VQdHIoKTsKKworICAvLyBJZiB0aGlzIGlzIGEgc3RvcmUgb2YgYSBiaXQgY29udmVydCwgc3RvcmUgdGhlIGlucHV0IHZhbHVlIGlmIHRoZQorICAvLyByZXN1bHRhbnQgc3RvcmUgZG9lcyBub3QgbmVlZCBhIGhpZ2hlciBhbGlnbm1lbnQgdGhhbiB0aGUgb3JpZ2luYWwuCisgIGlmIChWYWx1ZS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJJVF9DT05WRVJUICYmICFTVC0+aXNUcnVuY2F0aW5nU3RvcmUoKSAmJgorICAgICAgU1QtPmlzVW5pbmRleGVkKCkpIHsKKyAgICB1bnNpZ25lZCBPcmlnQWxpZ24gPSBTVC0+Z2V0QWxpZ25tZW50KCk7CisgICAgRVZUIFNWVCA9IFZhbHVlLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgICAgdW5zaWduZWQgQWxpZ24gPSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT4KKyAgICAgIGdldEFCSVR5cGVBbGlnbm1lbnQoU1ZULmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpKTsKKyAgICBpZiAoQWxpZ24gPD0gT3JpZ0FsaWduICYmCisgICAgICAgICgoIUxlZ2FsT3BlcmF0aW9ucyAmJiAhU1QtPmlzVm9sYXRpbGUoKSkgfHwKKyAgICAgICAgIFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpTVE9SRSwgU1ZUKSkpCisgICAgICByZXR1cm4gREFHLmdldFN0b3JlKENoYWluLCBOLT5nZXREZWJ1Z0xvYygpLCBWYWx1ZS5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQdHIsIFNULT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwgU1QtPmlzVm9sYXRpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmlzTm9uVGVtcG9yYWwoKSwgT3JpZ0FsaWduKTsKKyAgfQorCisgIC8vIFR1cm4gJ3N0b3JlIGZsb2F0IDEuMCwgUHRyJyAtPiAnc3RvcmUgaW50IDB4MTIzNDU2NzgsIFB0cicKKyAgaWYgKENvbnN0YW50RlBTRE5vZGUgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KFZhbHVlKSkgeworICAgIC8vIE5PVEU6IElmIHRoZSBvcmlnaW5hbCBzdG9yZSBpcyB2b2xhdGlsZSwgdGhpcyB0cmFuc2Zvcm0gbXVzdCBub3QgaW5jcmVhc2UKKyAgICAvLyB0aGUgbnVtYmVyIG9mIHN0b3Jlcy4gIEZvciBleGFtcGxlLCBvbiB4ODYtMzIgYW4gZjY0IGNhbiBiZSBzdG9yZWQgaW4gb25lCisgICAgLy8gcHJvY2Vzc29yIG9wZXJhdGlvbiBidXQgYW4gaTY0ICh3aGljaCBpcyBub3QgbGVnYWwpIHJlcXVpcmVzIHR3by4gIFNvIHRoZQorICAgIC8vIHRyYW5zZm9ybSBzaG91bGQgbm90IGJlIGRvbmUgaW4gdGhpcyBjYXNlLgorICAgIGlmIChWYWx1ZS5nZXRPcGNvZGUoKSAhPSBJU0Q6OlRhcmdldENvbnN0YW50RlApIHsKKyAgICAgIFNEVmFsdWUgVG1wOworICAgICAgc3dpdGNoIChDRlAtPmdldFZhbHVlVHlwZSgwKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIEZQIHR5cGUiKTsKKyAgICAgIGNhc2UgTVZUOjpmODA6ICAgIC8vIFdlIGRvbid0IGRvIHRoaXMgZm9yIHRoZXNlIHlldC4KKyAgICAgIGNhc2UgTVZUOjpmMTI4OgorICAgICAgY2FzZSBNVlQ6OnBwY2YxMjg6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmYzMjoKKyAgICAgICAgaWYgKChpc1R5cGVMZWdhbChNVlQ6OmkzMikgJiYgIUxlZ2FsT3BlcmF0aW9ucyAmJiAhU1QtPmlzVm9sYXRpbGUoKSkgfHwKKyAgICAgICAgICAgIFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpTVE9SRSwgTVZUOjppMzIpKSB7CisgICAgICAgICAgVG1wID0gREFHLmdldENvbnN0YW50KCh1aW50MzJfdClDRlAtPmdldFZhbHVlQVBGKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRjYXN0VG9BUEludCgpLmdldFpFeHRWYWx1ZSgpLCBNVlQ6OmkzMik7CisgICAgICAgICAgcmV0dXJuIERBRy5nZXRTdG9yZShDaGFpbiwgTi0+Z2V0RGVidWdMb2MoKSwgVG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyLCBTVC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRTcmNWYWx1ZU9mZnNldCgpLCBTVC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmlzTm9uVGVtcG9yYWwoKSwgU1QtPmdldEFsaWdubWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICAgIGlmICgoVExJLmlzVHlwZUxlZ2FsKE1WVDo6aTY0KSAmJiAhTGVnYWxPcGVyYXRpb25zICYmCisgICAgICAgICAgICAgIVNULT5pc1ZvbGF0aWxlKCkpIHx8CisgICAgICAgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6U1RPUkUsIE1WVDo6aTY0KSkgeworICAgICAgICAgIFRtcCA9IERBRy5nZXRDb25zdGFudChDRlAtPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0WkV4dFZhbHVlKCksIE1WVDo6aTY0KTsKKyAgICAgICAgICByZXR1cm4gREFHLmdldFN0b3JlKENoYWluLCBOLT5nZXREZWJ1Z0xvYygpLCBUbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHIsIFNULT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldFNyY1ZhbHVlT2Zmc2V0KCksIFNULT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+aXNOb25UZW1wb3JhbCgpLCBTVC0+Z2V0QWxpZ25tZW50KCkpOworICAgICAgICB9IGVsc2UgaWYgKCFTVC0+aXNWb2xhdGlsZSgpICYmCisgICAgICAgICAgICAgICAgICAgVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OlNUT1JFLCBNVlQ6OmkzMikpIHsKKyAgICAgICAgICAvLyBNYW55IEZQIHN0b3JlcyBhcmUgbm90IG1hZGUgYXBwYXJlbnQgdW50aWwgYWZ0ZXIgbGVnYWxpemUsIGUuZy4gZm9yCisgICAgICAgICAgLy8gYXJndW1lbnQgcGFzc2luZy4gIFNpbmNlIHRoaXMgaXMgc28gY29tbW9uLCBjdXN0b20gbGVnYWxpemUgdGhlCisgICAgICAgICAgLy8gNjQtYml0IGludGVnZXIgc3RvcmUgaW50byB0d28gMzItYml0IHN0b3Jlcy4KKyAgICAgICAgICB1aW50NjRfdCBWYWwgPSBDRlAtPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKS5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICBTRFZhbHVlIExvID0gREFHLmdldENvbnN0YW50KFZhbCAmIDB4RkZGRkZGRkYsIE1WVDo6aTMyKTsKKyAgICAgICAgICBTRFZhbHVlIEhpID0gREFHLmdldENvbnN0YW50KFZhbCA+PiAzMiwgTVZUOjppMzIpOworICAgICAgICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkgc3RkOjpzd2FwKExvLCBIaSk7CisKKyAgICAgICAgICBpbnQgU1ZPZmZzZXQgPSBTVC0+Z2V0U3JjVmFsdWVPZmZzZXQoKTsKKyAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBTVC0+Z2V0QWxpZ25tZW50KCk7CisgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlID0gU1QtPmlzVm9sYXRpbGUoKTsKKyAgICAgICAgICBib29sIGlzTm9uVGVtcG9yYWwgPSBTVC0+aXNOb25UZW1wb3JhbCgpOworCisgICAgICAgICAgU0RWYWx1ZSBTdDAgPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIFNULT5nZXREZWJ1Z0xvYygpLCBMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHIsIFNULT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldEFsaWdubWVudCgpKTsKKyAgICAgICAgICBQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgTi0+Z2V0RGVidWdMb2MoKSwgUHRyLmdldFZhbHVlVHlwZSgpLCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDQsIFB0ci5nZXRWYWx1ZVR5cGUoKSkpOworICAgICAgICAgIFNWT2Zmc2V0ICs9IDQ7CisgICAgICAgICAgQWxpZ25tZW50ID0gTWluQWxpZ24oQWxpZ25tZW50LCA0VSk7CisgICAgICAgICAgU0RWYWx1ZSBTdDEgPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIFNULT5nZXREZWJ1Z0xvYygpLCBIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHIsIFNULT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0LCBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCk7CisgICAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIE4tPmdldERlYnVnTG9jKCksIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0MCwgU3QxKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFRyeSB0byBpbmZlciBiZXR0ZXIgYWxpZ25tZW50IGluZm9ybWF0aW9uIHRoYW4gdGhlIHN0b3JlIGFscmVhZHkgaGFzLgorICBpZiAoT3B0TGV2ZWwgIT0gQ29kZUdlbk9wdDo6Tm9uZSAmJiBTVC0+aXNVbmluZGV4ZWQoKSkgeworICAgIGlmICh1bnNpZ25lZCBBbGlnbiA9IERBRy5JbmZlclB0ckFsaWdubWVudChQdHIpKSB7CisgICAgICBpZiAoQWxpZ24gPiBTVC0+Z2V0QWxpZ25tZW50KCkpCisgICAgICAgIHJldHVybiBEQUcuZ2V0VHJ1bmNTdG9yZShDaGFpbiwgTi0+Z2V0RGVidWdMb2MoKSwgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHIsIFNULT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldFNyY1ZhbHVlT2Zmc2V0KCksIFNULT5nZXRNZW1vcnlWVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmlzVm9sYXRpbGUoKSwgU1QtPmlzTm9uVGVtcG9yYWwoKSwgQWxpZ24pOworICAgIH0KKyAgfQorCisgIGlmIChDb21iaW5lckFBKSB7CisgICAgLy8gV2FsayB1cCBjaGFpbiBza2lwcGluZyBub24tYWxpYXNpbmcgbWVtb3J5IG5vZGVzLgorICAgIFNEVmFsdWUgQmV0dGVyQ2hhaW4gPSBGaW5kQmV0dGVyQ2hhaW4oTiwgQ2hhaW4pOworCisgICAgLy8gSWYgdGhlcmUgaXMgYSBiZXR0ZXIgY2hhaW4uCisgICAgaWYgKENoYWluICE9IEJldHRlckNoYWluKSB7CisgICAgICBTRFZhbHVlIFJlcGxTdG9yZTsKKworICAgICAgLy8gUmVwbGFjZSB0aGUgY2hhaW4gdG8gYXZvaWQgZGVwZW5kZW5jeS4KKyAgICAgIGlmIChTVC0+aXNUcnVuY2F0aW5nU3RvcmUoKSkgeworICAgICAgICBSZXBsU3RvcmUgPSBEQUcuZ2V0VHJ1bmNTdG9yZShCZXR0ZXJDaGFpbiwgTi0+Z2V0RGVidWdMb2MoKSwgVmFsdWUsIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldFNyY1ZhbHVlKCksU1QtPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRNZW1vcnlWVCgpLCBTVC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+aXNOb25UZW1wb3JhbCgpLCBTVC0+Z2V0QWxpZ25tZW50KCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUmVwbFN0b3JlID0gREFHLmdldFN0b3JlKEJldHRlckNoYWluLCBOLT5nZXREZWJ1Z0xvYygpLCBWYWx1ZSwgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldFNyY1ZhbHVlKCksIFNULT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmlzVm9sYXRpbGUoKSwgU1QtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRBbGlnbm1lbnQoKSk7CisgICAgICB9CisKKyAgICAgIC8vIENyZWF0ZSB0b2tlbiB0byBrZWVwIGJvdGggbm9kZXMgYXJvdW5kLgorICAgICAgU0RWYWx1ZSBUb2tlbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgQ2hhaW4sIFJlcGxTdG9yZSk7CisKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbmV3IGFuZCBvbGQgY2hhaW5zIGFyZSBjbGVhbmVkIHVwLgorICAgICAgQWRkVG9Xb3JrTGlzdChUb2tlbi5nZXROb2RlKCkpOworCisgICAgICAvLyBEb24ndCBhZGQgdXNlcnMgdG8gd29yayBsaXN0LgorICAgICAgcmV0dXJuIENvbWJpbmVUbyhOLCBUb2tlbiwgZmFsc2UpOworICAgIH0KKyAgfQorCisgIC8vIFRyeSB0cmFuc2Zvcm1pbmcgTiB0byBhbiBpbmRleGVkIHN0b3JlLgorICBpZiAoQ29tYmluZVRvUHJlSW5kZXhlZExvYWRTdG9yZShOKSB8fCBDb21iaW5lVG9Qb3N0SW5kZXhlZExvYWRTdG9yZShOKSkKKyAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKKworICAvLyBGSVhNRTogaXMgdGhlcmUgc3VjaCBhIHRoaW5nIGFzIGEgdHJ1bmNhdGluZyBpbmRleGVkIHN0b3JlPworICBpZiAoU1QtPmlzVHJ1bmNhdGluZ1N0b3JlKCkgJiYgU1QtPmlzVW5pbmRleGVkKCkgJiYKKyAgICAgIFZhbHVlLmdldFZhbHVlVHlwZSgpLmlzSW50ZWdlcigpKSB7CisgICAgLy8gU2VlIGlmIHdlIGNhbiBzaW1wbGlmeSB0aGUgaW5wdXQgdG8gdGhpcyB0cnVuY3N0b3JlIHdpdGgga25vd2xlZGdlIHRoYXQKKyAgICAvLyBvbmx5IHRoZSBsb3cgYml0cyBhcmUgYmVpbmcgdXNlZC4gIEZvciBleGFtcGxlOgorICAgIC8vICJ0cnVuY3N0b3JlIChvciAoc2hsIHgsIDgpLCB5KSwgaTgiICAtPiAidHJ1bmNzdG9yZSB5LCBpOCIKKyAgICBTRFZhbHVlIFNob3J0ZXIgPQorICAgICAgR2V0RGVtYW5kZWRCaXRzKFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIEFQSW50OjpnZXRMb3dCaXRzU2V0KFZhbHVlLmdldFZhbHVlU2l6ZUluQml0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRNZW1vcnlWVCgpLmdldFNpemVJbkJpdHMoKSkpOworICAgIEFkZFRvV29ya0xpc3QoVmFsdWUuZ2V0Tm9kZSgpKTsKKyAgICBpZiAoU2hvcnRlci5nZXROb2RlKCkpCisgICAgICByZXR1cm4gREFHLmdldFRydW5jU3RvcmUoQ2hhaW4sIE4tPmdldERlYnVnTG9jKCksIFNob3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyLCBTVC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwgU1QtPmdldE1lbW9yeVZUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmlzVm9sYXRpbGUoKSwgU1QtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0QWxpZ25tZW50KCkpOworCisgICAgLy8gT3RoZXJ3aXNlLCBzZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IHRoZSBvcGVyYXRpb24gd2l0aAorICAgIC8vIFNpbXBsaWZ5RGVtYW5kZWRCaXRzLCB3aGljaCBvbmx5IHdvcmtzIGlmIHRoZSB2YWx1ZSBoYXMgYSBzaW5nbGUgdXNlLgorICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldExvd0JpdHNTZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0TWVtb3J5VlQoKS5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpKSkpCisgICAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKKyAgfQorCisgIC8vIElmIHRoaXMgaXMgYSBsb2FkIGZvbGxvd2VkIGJ5IGEgc3RvcmUgdG8gdGhlIHNhbWUgbG9jYXRpb24sIHRoZW4gdGhlIHN0b3JlCisgIC8vIGlzIGRlYWQvbm9vcC4KKyAgaWYgKExvYWRTRE5vZGUgKkxkID0gZHluX2Nhc3Q8TG9hZFNETm9kZT4oVmFsdWUpKSB7CisgICAgaWYgKExkLT5nZXRCYXNlUHRyKCkgPT0gUHRyICYmIFNULT5nZXRNZW1vcnlWVCgpID09IExkLT5nZXRNZW1vcnlWVCgpICYmCisgICAgICAgIFNULT5pc1VuaW5kZXhlZCgpICYmICFTVC0+aXNWb2xhdGlsZSgpICYmCisgICAgICAgIC8vIFRoZXJlIGNhbid0IGJlIGFueSBzaWRlIGVmZmVjdHMgYmV0d2VlbiB0aGUgbG9hZCBhbmQgc3RvcmUsIHN1Y2ggYXMKKyAgICAgICAgLy8gYSBjYWxsIG9yIHN0b3JlLgorICAgICAgICBDaGFpbi5yZWFjaGVzQ2hhaW5XaXRob3V0U2lkZUVmZmVjdHMoU0RWYWx1ZShMZCwgMSkpKSB7CisgICAgICAvLyBUaGUgc3RvcmUgaXMgZGVhZCwgcmVtb3ZlIGl0LgorICAgICAgcmV0dXJuIENoYWluOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoaXMgaXMgYW4gRlBfUk9VTkQgb3IgVFJVTkMgZm9sbG93ZWQgYnkgYSBzdG9yZSwgZm9sZCB0aGlzIGludG8gYQorICAvLyB0cnVuY2F0aW5nIHN0b3JlLiAgV2UgY2FuIGRvIHRoaXMgZXZlbiBpZiB0aGlzIGlzIGFscmVhZHkgYSB0cnVuY3N0b3JlLgorICBpZiAoKFZhbHVlLmdldE9wY29kZSgpID09IElTRDo6RlBfUk9VTkQgfHwgVmFsdWUuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUUlVOQ0FURSkKKyAgICAgICYmIFZhbHVlLmdldE5vZGUoKS0+aGFzT25lVXNlKCkgJiYgU1QtPmlzVW5pbmRleGVkKCkgJiYKKyAgICAgIFRMSS5pc1RydW5jU3RvcmVMZWdhbChWYWx1ZS5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRNZW1vcnlWVCgpKSkgeworICAgIHJldHVybiBEQUcuZ2V0VHJ1bmNTdG9yZShDaGFpbiwgTi0+Z2V0RGVidWdMb2MoKSwgVmFsdWUuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyLCBTVC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldFNyY1ZhbHVlT2Zmc2V0KCksIFNULT5nZXRNZW1vcnlWVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+aXNWb2xhdGlsZSgpLCBTVC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0QWxpZ25tZW50KCkpOworICB9CisKKyAgcmV0dXJuIFJlZHVjZUxvYWRPcFN0b3JlV2lkdGgoTik7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0SU5TRVJUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgSW5WZWMgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIEluVmFsID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBFbHRObyA9IE4tPmdldE9wZXJhbmQoMik7CisKKyAgLy8gSWYgdGhlIGluc2VydGVkIGVsZW1lbnQgaXMgYW4gVU5ERUYsIGp1c3QgdXNlIHRoZSBpbnB1dCB2ZWN0b3IuCisgIGlmIChJblZhbC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgIHJldHVybiBJblZlYzsKKworICAvLyBJZiB0aGUgaW52ZWMgaXMgYSBCVUlMRF9WRUNUT1IgYW5kIGlmIEVsdE5vIGlzIGEgY29uc3RhbnQsIGJ1aWxkIGEgbmV3CisgIC8vIHZlY3RvciB3aXRoIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICBpZiAoSW5WZWMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IgJiYgaXNhPENvbnN0YW50U0ROb2RlPihFbHRObykpIHsKKyAgICB1bnNpZ25lZCBFbHQgPSBjYXN0PENvbnN0YW50U0ROb2RlPihFbHRObyktPmdldFpFeHRWYWx1ZSgpOworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wcyhJblZlYy5nZXROb2RlKCktPm9wX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluVmVjLmdldE5vZGUoKS0+b3BfZW5kKCkpOworICAgIGlmIChFbHQgPCBPcHMuc2l6ZSgpKQorICAgICAgT3BzW0VsdF0gPSBJblZhbDsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgIEluVmVjLmdldFZhbHVlVHlwZSgpLCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgfQorICAvLyBJZiB0aGUgaW52ZWMgaXMgYW4gVU5ERUYgYW5kIGlmIEVsdE5vIGlzIGEgY29uc3RhbnQsIGNyZWF0ZSBhIG5ldyAKKyAgLy8gQlVJTERfVkVDVE9SIHdpdGggdW5kZWYgZWxlbWVudHMgYW5kIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICBpZiAoIUxlZ2FsT3BlcmF0aW9ucyAmJiBJblZlYy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGICYmIAorICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihFbHRObykpIHsKKyAgICBFVlQgVlQgPSBJblZlYy5nZXRWYWx1ZVR5cGUoKTsKKyAgICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgIHVuc2lnbmVkIE5FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHMoTkVsdHMsIERBRy5nZXRVTkRFRihFbHRWVCkpOworCisgICAgdW5zaWduZWQgRWx0ID0gY2FzdDxDb25zdGFudFNETm9kZT4oRWx0Tm8pLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBpZiAoRWx0IDwgT3BzLnNpemUoKSkKKyAgICAgIE9wc1tFbHRdID0gSW5WYWw7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICBJblZlYy5nZXRWYWx1ZVR5cGUoKSwgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgIH0KKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRFWFRSQUNUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOKSB7CisgIC8vICh2ZXh0cmFjdCAoc2NhbGFyX3RvX3ZlY3RvciB2YWwsIDApIC0+IHZhbAorICBTRFZhbHVlIEluVmVjID0gTi0+Z2V0T3BlcmFuZCgwKTsKKworIGlmIChJblZlYy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNDQUxBUl9UT19WRUNUT1IpIHsKKyAgIC8vIENoZWNrIGlmIHRoZSByZXN1bHQgdHlwZSBkb2Vzbid0IG1hdGNoIHRoZSBpbnNlcnRlZCBlbGVtZW50IHR5cGUuIEEKKyAgIC8vIFNDQUxBUl9UT19WRUNUT1IgbWF5IHRydW5jYXRlIHRoZSBpbnNlcnRlZCBlbGVtZW50IGFuZCB0aGUKKyAgIC8vIEVYVFJBQ1RfVkVDVE9SX0VMVCBtYXkgd2lkZW4gdGhlIGV4dHJhY3RlZCB2ZWN0b3IuCisgICBTRFZhbHVlIEluT3AgPSBJblZlYy5nZXRPcGVyYW5kKDApOworICAgRVZUIE5WVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgIGlmIChJbk9wLmdldFZhbHVlVHlwZSgpICE9IE5WVCkgeworICAgICBhc3NlcnQoSW5PcC5nZXRWYWx1ZVR5cGUoKS5pc0ludGVnZXIoKSAmJiBOVlQuaXNJbnRlZ2VyKCkpOworICAgICByZXR1cm4gREFHLmdldFNFeHRPclRydW5jKEluT3AsIEluVmVjLmdldERlYnVnTG9jKCksIE5WVCk7CisgICB9CisgICByZXR1cm4gSW5PcDsKKyB9CisKKyAgLy8gUGVyZm9ybSBvbmx5IGFmdGVyIGxlZ2FsaXphdGlvbiB0byBlbnN1cmUgYnVpbGRfdmVjdG9yIC8gdmVjdG9yX3NodWZmbGUKKyAgLy8gb3B0aW1pemF0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBkb25lLgorICBpZiAoIUxlZ2FsT3BlcmF0aW9ucykgcmV0dXJuIFNEVmFsdWUoKTsKKworICAvLyAodmV4dHJhY3QgKHY0ZjMyIGxvYWQgJGFkZHIpLCBjKSAtPiAoZjMyIGxvYWQgJGFkZHIrYypzaXplKQorICAvLyAodmV4dHJhY3QgKHY0ZjMyIHMydiAoZjMyIGxvYWQgJGFkZHIpKSwgYykgLT4gKGYzMiBsb2FkICRhZGRyK2Mqc2l6ZSkKKyAgLy8gKHZleHRyYWN0ICh2NGYzMiBzaHVmZmxlIChsb2FkICRhZGRyKSwgPDEsdSx1LHU+KSwgMCkgLT4gKGYzMiBsb2FkICRhZGRyKQorICBTRFZhbHVlIEVsdE5vID0gTi0+Z2V0T3BlcmFuZCgxKTsKKworICBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihFbHRObykpIHsKKyAgICB1bnNpZ25lZCBFbHQgPSBjYXN0PENvbnN0YW50U0ROb2RlPihFbHRObyktPmdldFpFeHRWYWx1ZSgpOworICAgIGJvb2wgTmV3TG9hZCA9IGZhbHNlOworICAgIGJvb2wgQkNOdW1FbHRzQ2hhbmdlZCA9IGZhbHNlOworICAgIEVWVCBWVCA9IEluVmVjLmdldFZhbHVlVHlwZSgpOworICAgIEVWVCBFeHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgRVZUIExWVCA9IEV4dFZUOworCisgICAgaWYgKEluVmVjLmdldE9wY29kZSgpID09IElTRDo6QklUX0NPTlZFUlQpIHsKKyAgICAgIEVWVCBCQ1ZUID0gSW5WZWMuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgIGlmICghQkNWVC5pc1ZlY3RvcigpIHx8IEV4dFZULmJpdHNHVChCQ1ZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkpKQorICAgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgICAgaWYgKFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgIT0gQkNWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpKQorICAgICAgICBCQ051bUVsdHNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIEluVmVjID0gSW5WZWMuZ2V0T3BlcmFuZCgwKTsKKyAgICAgIEV4dFZUID0gQkNWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgICAgTmV3TG9hZCA9IHRydWU7CisgICAgfQorCisgICAgTG9hZFNETm9kZSAqTE4wID0gTlVMTDsKKyAgICBjb25zdCBTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk4gPSBOVUxMOworICAgIGlmIChJU0Q6OmlzTm9ybWFsTG9hZChJblZlYy5nZXROb2RlKCkpKSB7CisgICAgICBMTjAgPSBjYXN0PExvYWRTRE5vZGU+KEluVmVjKTsKKyAgICB9IGVsc2UgaWYgKEluVmVjLmdldE9wY29kZSgpID09IElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiAmJgorICAgICAgICAgICAgICAgSW5WZWMuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSA9PSBFeHRWVCAmJgorICAgICAgICAgICAgICAgSVNEOjppc05vcm1hbExvYWQoSW5WZWMuZ2V0T3BlcmFuZCgwKS5nZXROb2RlKCkpKSB7CisgICAgICBMTjAgPSBjYXN0PExvYWRTRE5vZGU+KEluVmVjLmdldE9wZXJhbmQoMCkpOworICAgIH0gZWxzZSBpZiAoKFNWTiA9IGR5bl9jYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KEluVmVjKSkpIHsKKyAgICAgIC8vICh2ZXh0cmFjdCAodmVjdG9yX3NodWZmbGUgKGxvYWQgJGFkZHIpLCB2MiwgPDEsIHUsIHUsIHU+KSwgMSkKKyAgICAgIC8vID0+CisgICAgICAvLyAobG9hZCAkYWRkcisxKnNpemUpCisKKyAgICAgIC8vIElmIHRoZSBiaXQgY29udmVydCBjaGFuZ2VkIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIGl0IGlzIHVuc2FmZQorICAgICAgLy8gdG8gZXhhbWluZSB0aGUgbWFzay4KKyAgICAgIGlmIChCQ051bUVsdHNDaGFuZ2VkKQorICAgICAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgICAgICAvLyBTZWxlY3QgdGhlIGlucHV0IHZlY3RvciwgZ3VhcmRpbmcgYWdhaW5zdCBvdXQgb2YgcmFuZ2UgZXh0cmFjdCB2ZWN0b3IuCisgICAgICB1bnNpZ25lZCBOdW1FbGVtcyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICBpbnQgSWR4ID0gKEVsdCA+IE51bUVsZW1zKSA/IC0xIDogU1ZOLT5nZXRNYXNrRWx0KEVsdCk7CisgICAgICBJblZlYyA9IChJZHggPCAoaW50KU51bUVsZW1zKSA/IEluVmVjLmdldE9wZXJhbmQoMCkgOiBJblZlYy5nZXRPcGVyYW5kKDEpOworCisgICAgICBpZiAoSW5WZWMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCSVRfQ09OVkVSVCkKKyAgICAgICAgSW5WZWMgPSBJblZlYy5nZXRPcGVyYW5kKDApOworICAgICAgaWYgKElTRDo6aXNOb3JtYWxMb2FkKEluVmVjLmdldE5vZGUoKSkpIHsKKyAgICAgICAgTE4wID0gY2FzdDxMb2FkU0ROb2RlPihJblZlYyk7CisgICAgICAgIEVsdCA9IChJZHggPCAoaW50KU51bUVsZW1zKSA/IElkeCA6IElkeCAtIChpbnQpTnVtRWxlbXM7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFMTjAgfHwgIUxOMC0+aGFzT25lVXNlKCkgfHwgTE4wLT5pc1ZvbGF0aWxlKCkpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgICAgdW5zaWduZWQgQWxpZ24gPSBMTjAtPmdldEFsaWdubWVudCgpOworICAgIGlmIChOZXdMb2FkKSB7CisgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0YW50IGxvYWQgZG9lc24ndCBuZWVkIGEgaGlnaGVyIGFsaWdubWVudCB0aGFuIHRoZQorICAgICAgLy8gb3JpZ2luYWwgbG9hZC4KKyAgICAgIHVuc2lnbmVkIE5ld0FsaWduID0KKyAgICAgICAgVExJLmdldFRhcmdldERhdGEoKS0+Z2V0QUJJVHlwZUFsaWdubWVudChMVlQuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSkpOworCisgICAgICBpZiAoTmV3QWxpZ24gPiBBbGlnbiB8fCAhVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OkxPQUQsIExWVCkpCisgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICAgIEFsaWduID0gTmV3QWxpZ247CisgICAgfQorCisgICAgU0RWYWx1ZSBOZXdQdHIgPSBMTjAtPmdldEJhc2VQdHIoKTsKKyAgICBpZiAoRWx0KSB7CisgICAgICB1bnNpZ25lZCBQdHJPZmYgPSBMVlQuZ2V0U2l6ZUluQml0cygpICogRWx0IC8gODsKKyAgICAgIEVWVCBQdHJUeXBlID0gTmV3UHRyLmdldFZhbHVlVHlwZSgpOworICAgICAgaWYgKFRMSS5pc0JpZ0VuZGlhbigpKQorICAgICAgICBQdHJPZmYgPSBWVC5nZXRTaXplSW5CaXRzKCkgLyA4IC0gUHRyT2ZmOworICAgICAgTmV3UHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIE4tPmdldERlYnVnTG9jKCksIFB0clR5cGUsIE5ld1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChQdHJPZmYsIFB0clR5cGUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gREFHLmdldExvYWQoTFZULCBOLT5nZXREZWJ1Z0xvYygpLCBMTjAtPmdldENoYWluKCksIE5ld1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgTE4wLT5nZXRTcmNWYWx1ZSgpLCBMTjAtPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgIExOMC0+aXNWb2xhdGlsZSgpLCBMTjAtPmlzTm9uVGVtcG9yYWwoKSwgQWxpZ24pOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRCVUlMRF9WRUNUT1IoU0ROb2RlICpOKSB7CisgIHVuc2lnbmVkIE51bUluU2NhbGFycyA9IE4tPmdldE51bU9wZXJhbmRzKCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIEJVSUxEX1ZFQ1RPUiBvZiBhIGJ1bmNoIG9mIEVYVFJBQ1RfVkVDVE9SX0VMVAorICAvLyBvcGVyYXRpb25zLiAgSWYgc28sIGFuZCBpZiB0aGUgRVhUUkFDVF9WRUNUT1JfRUxUIHZlY3RvciBpbnB1dHMgY29tZSBmcm9tCisgIC8vIGF0IG1vc3QgdHdvIGRpc3RpbmN0IHZlY3RvcnMsIHR1cm4gdGhpcyBpbnRvIGEgc2h1ZmZsZSBub2RlLgorICBTRFZhbHVlIFZlY0luMSwgVmVjSW4yOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUluU2NhbGFyczsgKytpKSB7CisgICAgLy8gSWdub3JlIHVuZGVmIGlucHV0cy4KKyAgICBpZiAoTi0+Z2V0T3BlcmFuZChpKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKSBjb250aW51ZTsKKworICAgIC8vIElmIHRoaXMgaW5wdXQgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBFWFRSQUNUX1ZFQ1RPUl9FTFQgd2l0aCBhCisgICAgLy8gY29uc3RhbnQgaW5kZXgsIGJhaWwgb3V0LgorICAgIGlmIChOLT5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpICE9IElTRDo6RVhUUkFDVF9WRUNUT1JfRUxUIHx8CisgICAgICAgICFpc2E8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoaSkuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIFZlY0luMSA9IFZlY0luMiA9IFNEVmFsdWUoMCwgMCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgaW5wdXQgdmVjdG9yIHR5cGUgZGlzYWdyZWVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgYnVpbGRfdmVjdG9yLAorICAgIC8vIHdlIGNhbid0IG1ha2UgYSBzaHVmZmxlLgorICAgIFNEVmFsdWUgRXh0cmFjdGVkRnJvbVZlYyA9IE4tPmdldE9wZXJhbmQoaSkuZ2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoRXh0cmFjdGVkRnJvbVZlYy5nZXRWYWx1ZVR5cGUoKSAhPSBWVCkgeworICAgICAgVmVjSW4xID0gVmVjSW4yID0gU0RWYWx1ZSgwLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhpcy4gIFdlIGFsbG93IHVwIHRvIHR3byBkaXN0aW5jdCBpbnB1dCB2ZWN0b3JzLgorICAgIGlmIChFeHRyYWN0ZWRGcm9tVmVjID09IFZlY0luMSB8fCBFeHRyYWN0ZWRGcm9tVmVjID09IFZlY0luMikKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKFZlY0luMS5nZXROb2RlKCkgPT0gMCkgeworICAgICAgVmVjSW4xID0gRXh0cmFjdGVkRnJvbVZlYzsKKyAgICB9IGVsc2UgaWYgKFZlY0luMi5nZXROb2RlKCkgPT0gMCkgeworICAgICAgVmVjSW4yID0gRXh0cmFjdGVkRnJvbVZlYzsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVG9vIG1hbnkgaW5wdXRzLgorICAgICAgVmVjSW4xID0gVmVjSW4yID0gU0RWYWx1ZSgwLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIElmIGV2ZXJ5dGhpbmcgaXMgZ29vZCwgd2UgY2FuIG1ha2UgYSBzaHVmZmxlIG9wZXJhdGlvbi4KKyAgaWYgKFZlY0luMS5nZXROb2RlKCkpIHsKKyAgICBTbWFsbFZlY3RvcjxpbnQsIDg+IE1hc2s7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1JblNjYWxhcnM7ICsraSkgeworICAgICAgaWYgKE4tPmdldE9wZXJhbmQoaSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikgeworICAgICAgICBNYXNrLnB1c2hfYmFjaygtMSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBJZiBleHRyYWN0aW5nIGZyb20gdGhlIGZpcnN0IHZlY3RvciwganVzdCB1c2UgdGhlIGluZGV4IGRpcmVjdGx5LgorICAgICAgU0RWYWx1ZSBFeHRyYWN0ID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIFNEVmFsdWUgRXh0VmFsID0gRXh0cmFjdC5nZXRPcGVyYW5kKDEpOworICAgICAgaWYgKEV4dHJhY3QuZ2V0T3BlcmFuZCgwKSA9PSBWZWNJbjEpIHsKKyAgICAgICAgdW5zaWduZWQgRXh0SW5kZXggPSBjYXN0PENvbnN0YW50U0ROb2RlPihFeHRWYWwpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgaWYgKEV4dEluZGV4ID4gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSkKKyAgICAgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgICAgICAKKyAgICAgICAgTWFzay5wdXNoX2JhY2soRXh0SW5kZXgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gT3RoZXJ3aXNlLCB1c2UgSW5JZHggKyBWZWNTaXplCisgICAgICB1bnNpZ25lZCBJZHggPSBjYXN0PENvbnN0YW50U0ROb2RlPihFeHRWYWwpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIE1hc2sucHVzaF9iYWNrKElkeCtOdW1JblNjYWxhcnMpOworICAgIH0KKworICAgIC8vIEFkZCBjb3VudCBhbmQgc2l6ZSBpbmZvLgorICAgIGlmICghaXNUeXBlTGVnYWwoVlQpKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAgIC8vIFJldHVybiB0aGUgbmV3IFZFQ1RPUl9TSFVGRkxFIG5vZGUuCisgICAgU0RWYWx1ZSBPcHNbMl07CisgICAgT3BzWzBdID0gVmVjSW4xOworICAgIE9wc1sxXSA9IFZlY0luMi5nZXROb2RlKCkgPyBWZWNJbjIgOiBEQUcuZ2V0VU5ERUYoVlQpOworICAgIHJldHVybiBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShWVCwgTi0+Z2V0RGVidWdMb2MoKSwgT3BzWzBdLCBPcHNbMV0sICZNYXNrWzBdKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0Q09OQ0FUX1ZFQ1RPUlMoU0ROb2RlICpOKSB7CisgIC8vIFRPRE86IENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgQ09OQ0FUX1ZFQ1RPUlMgb2YgYSBidW5jaCBvZgorICAvLyBFWFRSQUNUX1NVQlZFQ1RPUiBvcGVyYXRpb25zLiAgSWYgc28sIGFuZCBpZiB0aGUgRVhUUkFDVF9TVUJWRUNUT1IgdmVjdG9yCisgIC8vIGlucHV0cyBjb21lIGZyb20gYXQgbW9zdCB0d28gZGlzdGluY3QgdmVjdG9ycywgdHVybiB0aGlzIGludG8gYSBzaHVmZmxlCisgIC8vIG5vZGUuCisKKyAgLy8gSWYgd2Ugb25seSBoYXZlIG9uZSBpbnB1dCB2ZWN0b3IsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IGNvbmNhdGVuYXRpb24uCisgIGlmIChOLT5nZXROdW1PcGVyYW5kcygpID09IDEpCisgICAgcmV0dXJuIE4tPmdldE9wZXJhbmQoMCk7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBEQUdDb21iaW5lcjo6dmlzaXRWRUNUT1JfU0hVRkZMRShTRE5vZGUgKk4pIHsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICB1bnNpZ25lZCBOdW1FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKworICBhc3NlcnQoTjAuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA9PSBOdW1FbHRzICYmCisgICAgICAgICJWZWN0b3Igc2h1ZmZsZSBtdXN0IGJlIG5vcm1hbGl6ZWQgaW4gREFHIik7CisKKyAgLy8gRklYTUU6IGltcGxlbWVudCBjYW5vbmljYWxpemF0aW9ucyBmcm9tIERBRy5nZXRWZWN0b3JTaHVmZmxlKCkKKworICAvLyBJZiBpdCBpcyBhIHNwbGF0LCBjaGVjayBpZiB0aGUgYXJndW1lbnQgdmVjdG9yIGlzIGEgYnVpbGRfdmVjdG9yIHdpdGgKKyAgLy8gYWxsIHNjYWxhciBlbGVtZW50cyB0aGUgc2FtZS4KKyAgaWYgKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTiktPmlzU3BsYXQoKSkgeworICAgIFNETm9kZSAqViA9IE4wLmdldE5vZGUoKTsKKworICAgIC8vIElmIHRoaXMgaXMgYSBiaXQgY29udmVydCB0aGF0IGNoYW5nZXMgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgdmVjdG9yIGJ1dAorICAgIC8vIG5vdCB0aGUgbnVtYmVyIG9mIHZlY3RvciBlbGVtZW50cywgbG9vayB0aHJvdWdoIGl0LiAgQmUgY2FyZWZ1bCBub3QgdG8KKyAgICAvLyBsb29rIHRob3VnaCBjb252ZXJzaW9ucyB0aGF0IGNoYW5nZSB0aGluZ3MgbGlrZSB2NGYzMiB0byB2MmY2NC4KKyAgICBpZiAoVi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpCSVRfQ09OVkVSVCkgeworICAgICAgU0RWYWx1ZSBDb252SW5wdXQgPSBWLT5nZXRPcGVyYW5kKDApOworICAgICAgaWYgKENvbnZJbnB1dC5nZXRWYWx1ZVR5cGUoKS5pc1ZlY3RvcigpICYmCisgICAgICAgICAgQ29udklucHV0LmdldFZhbHVlVHlwZSgpLmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0gTnVtRWx0cykKKyAgICAgICAgViA9IENvbnZJbnB1dC5nZXROb2RlKCk7CisgICAgfQorCisgICAgaWYgKFYtPmdldE9wY29kZSgpID09IElTRDo6QlVJTERfVkVDVE9SKSB7CisgICAgICB1bnNpZ25lZCBOdW1FbGVtcyA9IFYtPmdldE51bU9wZXJhbmRzKCk7CisgICAgICB1bnNpZ25lZCBCYXNlSWR4ID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKS0+Z2V0U3BsYXRJbmRleCgpOworICAgICAgaWYgKE51bUVsZW1zID4gQmFzZUlkeCkgeworICAgICAgICBTRFZhbHVlIEJhc2U7CisgICAgICAgIGJvb2wgQWxsU2FtZSA9IHRydWU7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWxlbXM7ICsraSkgeworICAgICAgICAgIGlmIChWLT5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpICE9IElTRDo6VU5ERUYpIHsKKyAgICAgICAgICAgIEJhc2UgPSBWLT5nZXRPcGVyYW5kKGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFNwbGF0IG9mIDx1LCB1LCB1LCB1PiwgcmV0dXJuIDx1LCB1LCB1LCB1PgorICAgICAgICBpZiAoIUJhc2UuZ2V0Tm9kZSgpKQorICAgICAgICAgIHJldHVybiBOMDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbGVtczsgKytpKSB7CisgICAgICAgICAgaWYgKFYtPmdldE9wZXJhbmQoaSkgIT0gQmFzZSkgeworICAgICAgICAgICAgQWxsU2FtZSA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFNwbGF0IG9mIDx4LCB4LCB4LCB4PiwgcmV0dXJuIDx4LCB4LCB4LCB4PgorICAgICAgICBpZiAoQWxsU2FtZSkKKyAgICAgICAgICByZXR1cm4gTjA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OnZpc2l0TUVNQkFSUklFUihTRE5vZGUqIE4pIHsKKyAgaWYgKCFUTEkuZ2V0U2hvdWxkRm9sZEF0b21pY0ZlbmNlcygpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgU0RWYWx1ZSBhdG9taWMgPSBOLT5nZXRPcGVyYW5kKDApOworICBzd2l0Y2ggKGF0b21pYy5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSVNEOjpBVE9NSUNfQ01QX1NXQVA6CisgICAgY2FzZSBJU0Q6OkFUT01JQ19TV0FQOgorICAgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9BREQ6CisgICAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1NVQjoKKyAgICBjYXNlIElTRDo6QVRPTUlDX0xPQURfQU5EOgorICAgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9PUjoKKyAgICBjYXNlIElTRDo6QVRPTUlDX0xPQURfWE9SOgorICAgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9OQU5EOgorICAgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9NSU46CisgICAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX01BWDoKKyAgICBjYXNlIElTRDo6QVRPTUlDX0xPQURfVU1JTjoKKyAgICBjYXNlIElTRDo6QVRPTUlDX0xPQURfVU1BWDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisKKyAgU0RWYWx1ZSBmZW5jZSA9IGF0b21pYy5nZXRPcGVyYW5kKDApOworICBpZiAoZmVuY2UuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpNRU1CQVJSSUVSKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgc3dpdGNoIChhdG9taWMuZ2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIElTRDo6QVRPTUlDX0NNUF9TV0FQOgorICAgICAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhhdG9taWMuZ2V0Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pYy5nZXRPcGVyYW5kKDEpLCBhdG9taWMuZ2V0T3BlcmFuZCgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pYy5nZXRPcGVyYW5kKDMpKSwgYXRvbWljLmdldFJlc05vKCkpOworICAgIGNhc2UgSVNEOjpBVE9NSUNfU1dBUDoKKyAgICBjYXNlIElTRDo6QVRPTUlDX0xPQURfQUREOgorICAgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9TVUI6CisgICAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX0FORDoKKyAgICBjYXNlIElTRDo6QVRPTUlDX0xPQURfT1I6CisgICAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1hPUjoKKyAgICBjYXNlIElTRDo6QVRPTUlDX0xPQURfTkFORDoKKyAgICBjYXNlIElTRDo6QVRPTUlDX0xPQURfTUlOOgorICAgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9NQVg6CisgICAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1VNSU46CisgICAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1VNQVg6CisgICAgICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKGF0b21pYy5nZXROb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZS5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbWljLmdldE9wZXJhbmQoMSksIGF0b21pYy5nZXRPcGVyYW5kKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgIGF0b21pYy5nZXRSZXNObygpKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorfQorCisvLy8gWGZvcm1Ub1NodWZmbGVXaXRoWmVybyAtIFJldHVybnMgYSB2ZWN0b3Jfc2h1ZmZsZSBpZiBpdCBhYmxlIHRvIHRyYW5zZm9ybQorLy8vIGFuIEFORCB0byBhIHZlY3Rvcl9zaHVmZmxlIHdpdGggdGhlIGRlc3RpbmF0aW9uIHZlY3RvciBhbmQgYSB6ZXJvIHZlY3Rvci4KKy8vLyBlLmcuIEFORCBWLCA8MHhmZmZmZmZmZiwgMCwgMHhmZmZmZmZmZiwgMD4uID09PgorLy8vICAgICAgdmVjdG9yX3NodWZmbGUgViwgWmVybywgPDAsIDQsIDIsIDQ+CitTRFZhbHVlIERBR0NvbWJpbmVyOjpYZm9ybVRvU2h1ZmZsZVdpdGhaZXJvKFNETm9kZSAqTikgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBMSFMgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFJIUyA9IE4tPmdldE9wZXJhbmQoMSk7CisgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCkgeworICAgIGlmIChSSFMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCSVRfQ09OVkVSVCkKKyAgICAgIFJIUyA9IFJIUy5nZXRPcGVyYW5kKDApOworICAgIGlmIChSSFMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGludCwgOD4gSW5kaWNlczsKKyAgICAgIHVuc2lnbmVkIE51bUVsdHMgPSBSSFMuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWx0czsgKytpKSB7CisgICAgICAgIFNEVmFsdWUgRWx0ID0gUkhTLmdldE9wZXJhbmQoaSk7CisgICAgICAgIGlmICghaXNhPENvbnN0YW50U0ROb2RlPihFbHQpKQorICAgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgICAgIGVsc2UgaWYgKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KEVsdCktPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICAgICAgSW5kaWNlcy5wdXNoX2JhY2soaSk7CisgICAgICAgIGVsc2UgaWYgKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KEVsdCktPmlzTnVsbFZhbHVlKCkpCisgICAgICAgICAgSW5kaWNlcy5wdXNoX2JhY2soTnVtRWx0cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgICAgfQorCisgICAgICAvLyBMZXQncyBzZWUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyB0aGlzIHZlY3Rvcl9zaHVmZmxlLgorICAgICAgRVZUIFJWVCA9IFJIUy5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgIGlmICghVExJLmlzVmVjdG9yQ2xlYXJNYXNrTGVnYWwoSW5kaWNlcywgUlZUKSkKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAgICAgLy8gUmV0dXJuIHRoZSBuZXcgVkVDVE9SX1NIVUZGTEUgbm9kZS4KKyAgICAgIEVWVCBFbHRWVCA9IFJWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSw4PiBaZXJvT3BzKFJWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBFbHRWVCkpOworICAgICAgU0RWYWx1ZSBaZXJvID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVlQsICZaZXJvT3BzWzBdLCBaZXJvT3BzLnNpemUoKSk7CisgICAgICBMSFMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgUlZULCBMSFMpOworICAgICAgU0RWYWx1ZSBTaHVmID0gREFHLmdldFZlY3RvclNodWZmbGUoUlZULCBkbCwgTEhTLCBaZXJvLCAmSW5kaWNlc1swXSk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULCBTaHVmKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gU2ltcGxpZnlWQmluT3AgLSBWaXNpdCBhIGJpbmFyeSB2ZWN0b3Igb3BlcmF0aW9uLCBsaWtlIEFERC4KK1NEVmFsdWUgREFHQ29tYmluZXI6OlNpbXBsaWZ5VkJpbk9wKFNETm9kZSAqTikgeworICAvLyBBZnRlciBsZWdhbGl6ZSwgdGhlIHRhcmdldCBtYXkgYmUgZGVwZW5kaW5nIG9uIGFkZHMgYW5kIG90aGVyCisgIC8vIGJpbmFyeSBvcHMgdG8gcHJvdmlkZSBsZWdhbCB3YXlzIHRvIGNvbnN0cnVjdCBjb25zdGFudHMgb3Igb3RoZXIKKyAgLy8gdGhpbmdzLiBTaW1wbGlmeWluZyB0aGVtIG1heSByZXN1bHQgaW4gYSBsb3NzIG9mIGxlZ2FsaXR5LgorICBpZiAoTGVnYWxPcGVyYXRpb25zKSByZXR1cm4gU0RWYWx1ZSgpOworCisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgYXNzZXJ0KFZULmlzVmVjdG9yKCkgJiYgIlNpbXBsaWZ5VkJpbk9wIG9ubHkgd29ya3Mgb24gdmVjdG9ycyEiKTsKKworICBFVlQgRWx0VHlwZSA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIFNEVmFsdWUgTEhTID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBSSFMgPSBOLT5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIFNodWZmbGUgPSBYZm9ybVRvU2h1ZmZsZVdpdGhaZXJvKE4pOworICBpZiAoU2h1ZmZsZS5nZXROb2RlKCkpIHJldHVybiBTaHVmZmxlOworCisgIC8vIElmIHRoZSBMSFMgYW5kIFJIUyBhcmUgQlVJTERfVkVDVE9SIG5vZGVzLCBzZWUgaWYgd2UgY2FuIGNvbnN0YW50IGZvbGQKKyAgLy8gdGhpcyBvcGVyYXRpb24uCisgIGlmIChMSFMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IgJiYKKyAgICAgIFJIUy5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJVSUxEX1ZFQ1RPUikgeworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTEhTLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBTRFZhbHVlIExIU09wID0gTEhTLmdldE9wZXJhbmQoaSk7CisgICAgICBTRFZhbHVlIFJIU09wID0gUkhTLmdldE9wZXJhbmQoaSk7CisgICAgICAvLyBJZiB0aGVzZSB0d28gZWxlbWVudHMgY2FuJ3QgYmUgZm9sZGVkLCBiYWlsIG91dC4KKyAgICAgIGlmICgoTEhTT3AuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpVTkRFRiAmJgorICAgICAgICAgICBMSFNPcC5nZXRPcGNvZGUoKSAhPSBJU0Q6OkNvbnN0YW50ICYmCisgICAgICAgICAgIExIU09wLmdldE9wY29kZSgpICE9IElTRDo6Q29uc3RhbnRGUCkgfHwKKyAgICAgICAgICAoUkhTT3AuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpVTkRFRiAmJgorICAgICAgICAgICBSSFNPcC5nZXRPcGNvZGUoKSAhPSBJU0Q6OkNvbnN0YW50ICYmCisgICAgICAgICAgIFJIU09wLmdldE9wY29kZSgpICE9IElTRDo6Q29uc3RhbnRGUCkpCisgICAgICAgIGJyZWFrOworCisgICAgICAvLyBDYW4ndCBmb2xkIGRpdmlkZSBieSB6ZXJvLgorICAgICAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6U0RJViB8fCBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVESVYgfHwKKyAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZESVYpIHsKKyAgICAgICAgaWYgKChSSFNPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50ICYmCisgICAgICAgICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oUkhTT3AuZ2V0Tm9kZSgpKS0+aXNOdWxsVmFsdWUoKSkgfHwKKyAgICAgICAgICAgIChSSFNPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50RlAgJiYKKyAgICAgICAgICAgICBjYXN0PENvbnN0YW50RlBTRE5vZGU+KFJIU09wLmdldE5vZGUoKSktPmdldFZhbHVlQVBGKCkuaXNaZXJvKCkpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGUgdmVjdG9yIGVsZW1lbnQgdHlwZSBpcyBub3QgbGVnYWwsIHRoZSBCVUlMRF9WRUNUT1Igb3BlcmFuZHMKKyAgICAgIC8vIGFyZSBwcm9tb3RlZCBhbmQgaW1wbGljaXRseSB0cnVuY2F0ZWQuICBNYWtlIHRoYXQgZXhwbGljaXQgaGVyZS4KKyAgICAgIGlmIChMSFNPcC5nZXRWYWx1ZVR5cGUoKSAhPSBFbHRUeXBlKQorICAgICAgICBMSFNPcCA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIExIUy5nZXREZWJ1Z0xvYygpLCBFbHRUeXBlLCBMSFNPcCk7CisgICAgICBpZiAoUkhTT3AuZ2V0VmFsdWVUeXBlKCkgIT0gRWx0VHlwZSkKKyAgICAgICAgUkhTT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBSSFMuZ2V0RGVidWdMb2MoKSwgRWx0VHlwZSwgUkhTT3ApOworCisgICAgICBTRFZhbHVlIEZvbGRPcCA9IERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBMSFMuZ2V0RGVidWdMb2MoKSwgRWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTT3AsIFJIU09wKTsKKyAgICAgIGlmIChGb2xkT3AuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpVTkRFRiAmJgorICAgICAgICAgIEZvbGRPcC5nZXRPcGNvZGUoKSAhPSBJU0Q6OkNvbnN0YW50ICYmCisgICAgICAgICAgRm9sZE9wLmdldE9wY29kZSgpICE9IElTRDo6Q29uc3RhbnRGUCkKKyAgICAgICAgYnJlYWs7CisgICAgICBPcHMucHVzaF9iYWNrKEZvbGRPcCk7CisgICAgICBBZGRUb1dvcmtMaXN0KEZvbGRPcC5nZXROb2RlKCkpOworICAgIH0KKworICAgIGlmIChPcHMuc2l6ZSgpID09IExIUy5nZXROdW1PcGVyYW5kcygpKSB7CisgICAgICBFVlQgVlQgPSBMSFMuZ2V0VmFsdWVUeXBlKCk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICZPcHNbMF0sIE9wcy5zaXplKCkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgREFHQ29tYmluZXI6OlNpbXBsaWZ5U2VsZWN0KERlYnVnTG9jIERMLCBTRFZhbHVlIE4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMil7CisgIGFzc2VydChOMC5nZXRPcGNvZGUoKSA9PUlTRDo6U0VUQ0MgJiYgIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTZXRDQyBub2RlISIpOworCisgIFNEVmFsdWUgU0NDID0gU2ltcGxpZnlTZWxlY3RDQyhETCwgTjAuZ2V0T3BlcmFuZCgwKSwgTjAuZ2V0T3BlcmFuZCgxKSwgTjEsIE4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25kQ29kZVNETm9kZT4oTjAuZ2V0T3BlcmFuZCgyKSktPmdldCgpKTsKKworICAvLyBJZiB3ZSBnb3QgYSBzaW1wbGlmaWVkIHNlbGVjdF9jYyBub2RlIGJhY2sgZnJvbSBTaW1wbGlmeVNlbGVjdENDLCB0aGVuCisgIC8vIGJyZWFrIGl0IGRvd24gaW50byBhIG5ldyBTRVRDQyBub2RlLCBhbmQgYSBuZXcgU0VMRUNUIG5vZGUsIGFuZCB0aGVuIHJldHVybgorICAvLyB0aGUgU0VMRUNUIG5vZGUsIHNpbmNlIHdlIHdlcmUgY2FsbGVkIHdpdGggYSBTRUxFQ1Qgbm9kZS4KKyAgaWYgKFNDQy5nZXROb2RlKCkpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgZ290IGEgc2VsZWN0X2NjIGJhY2sgKHRvIHR1cm4gaW50byBzZXRjYy9zZWxlY3QpLgorICAgIC8vIE90aGVyd2lzZSwganVzdCByZXR1cm4gd2hhdGV2ZXIgbm9kZSB3ZSBnb3QgYmFjaywgbGlrZSBmYWJzLgorICAgIGlmIChTQ0MuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRUxFQ1RfQ0MpIHsKKyAgICAgIFNEVmFsdWUgU0VUQ0MgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFVENDLCBOMC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQy5nZXRPcGVyYW5kKDApLCBTQ0MuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0MuZ2V0T3BlcmFuZCg0KSk7CisgICAgICBBZGRUb1dvcmtMaXN0KFNFVENDLmdldE5vZGUoKSk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIFNDQy5nZXREZWJ1Z0xvYygpLCBTQ0MuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NDLmdldE9wZXJhbmQoMiksIFNDQy5nZXRPcGVyYW5kKDMpLCBTRVRDQyk7CisgICAgfQorCisgICAgcmV0dXJuIFNDQzsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gU2ltcGxpZnlTZWxlY3RPcHMgLSBHaXZlbiBhIFNFTEVDVCBvciBhIFNFTEVDVF9DQyBub2RlLCB3aGVyZSBMSFMgYW5kIFJIUworLy8vIGFyZSB0aGUgdHdvIHZhbHVlcyBiZWluZyBzZWxlY3RlZCBiZXR3ZWVuLCBzZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IHRoZQorLy8vIHNlbGVjdC4gIENhbGxlcnMgb2YgdGhpcyBzaG91bGQgYXNzdW1lIHRoYXQgVGhlU2VsZWN0IGlzIGRlbGV0ZWQgaWYgdGhpcworLy8vIHJldHVybnMgdHJ1ZS4gIEFzIHN1Y2gsIHRoZXkgc2hvdWxkIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGhpbmcgKGUuZy4gdGhlCisvLy8gbm9kZSkgYmFjayB0byB0aGUgdG9wLWxldmVsIG9mIHRoZSBEQUcgY29tYmluZXIgbG9vcCB0byBhdm9pZCBpdCBiZWluZworLy8vIGxvb2tlZCBhdC4KK2Jvb2wgREFHQ29tYmluZXI6OlNpbXBsaWZ5U2VsZWN0T3BzKFNETm9kZSAqVGhlU2VsZWN0LCBTRFZhbHVlIExIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUkhTKSB7CisKKyAgLy8gSWYgdGhpcyBpcyBhIHNlbGVjdCBmcm9tIHR3byBpZGVudGljYWwgdGhpbmdzLCB0cnkgdG8gcHVsbCB0aGUgb3BlcmF0aW9uCisgIC8vIHRocm91Z2ggdGhlIHNlbGVjdC4KKyAgaWYgKExIUy5nZXRPcGNvZGUoKSA9PSBSSFMuZ2V0T3Bjb2RlKCkgJiYgTEhTLmhhc09uZVVzZSgpICYmIFJIUy5oYXNPbmVVc2UoKSl7CisgICAgLy8gSWYgdGhpcyBpcyBhIGxvYWQgYW5kIHRoZSB0b2tlbiBjaGFpbiBpcyBpZGVudGljYWwsIHJlcGxhY2UgdGhlIHNlbGVjdAorICAgIC8vIG9mIHR3byBsb2FkcyB3aXRoIGEgbG9hZCB0aHJvdWdoIGEgc2VsZWN0IG9mIHRoZSBhZGRyZXNzIHRvIGxvYWQgZnJvbS4KKyAgICAvLyBUaGlzIHRyaWdnZXJzIGluIHRoaW5ncyBsaWtlICJzZWxlY3QgYm9vbCBYLCAxMC4wLCAxMjMuMCIgYWZ0ZXIgdGhlIEZQCisgICAgLy8gY29uc3RhbnRzIGhhdmUgYmVlbiBkcm9wcGVkIGludG8gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgaWYgKExIUy5nZXRPcGNvZGUoKSA9PSBJU0Q6OkxPQUQgJiYKKyAgICAgICAgLy8gRG8gbm90IGxldCB0aGlzIHRyYW5zZm9ybWF0aW9uIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHZvbGF0aWxlIGxvYWRzLgorICAgICAgICAhY2FzdDxMb2FkU0ROb2RlPihMSFMpLT5pc1ZvbGF0aWxlKCkgJiYKKyAgICAgICAgIWNhc3Q8TG9hZFNETm9kZT4oUkhTKS0+aXNWb2xhdGlsZSgpICYmCisgICAgICAgIC8vIFRva2VuIGNoYWlucyBtdXN0IGJlIGlkZW50aWNhbC4KKyAgICAgICAgTEhTLmdldE9wZXJhbmQoMCkgPT0gUkhTLmdldE9wZXJhbmQoMCkpIHsKKyAgICAgIExvYWRTRE5vZGUgKkxMRCA9IGNhc3Q8TG9hZFNETm9kZT4oTEhTKTsKKyAgICAgIExvYWRTRE5vZGUgKlJMRCA9IGNhc3Q8TG9hZFNETm9kZT4oUkhTKTsKKworICAgICAgLy8gSWYgdGhpcyBpcyBhbiBFWFRMT0FELCB0aGUgVlQncyBtdXN0IG1hdGNoLgorICAgICAgaWYgKExMRC0+Z2V0TWVtb3J5VlQoKSA9PSBSTEQtPmdldE1lbW9yeVZUKCkpIHsKKyAgICAgICAgLy8gRklYTUU6IHRoaXMgZGlzY2FyZHMgc3JjIHZhbHVlIGluZm9ybWF0aW9uLiAgVGhpcyBpcworICAgICAgICAvLyBvdmVyLWNvbnNlcnZhdGl2ZS4gSXQgd291bGQgYmUgYmVuZWZpY2lhbCB0byBiZSBhYmxlIHRvIHJlbWVtYmVyCisgICAgICAgIC8vIGJvdGggcG90ZW50aWFsIG1lbW9yeSBsb2NhdGlvbnMuICBTaW5jZSB3ZSBhcmUgZGlzY2FyZGluZworICAgICAgICAvLyBzcmMgdmFsdWUgaW5mbywgZG9uJ3QgZG8gdGhlIHRyYW5zZm9ybWF0aW9uIGlmIHRoZSBtZW1vcnkKKyAgICAgICAgLy8gbG9jYXRpb25zIGFyZSBub3QgaW4gdGhlIGRlZmF1bHQgYWRkcmVzcyBzcGFjZS4KKyAgICAgICAgdW5zaWduZWQgTExEQWRkclNwYWNlID0gMCwgUkxEQWRkclNwYWNlID0gMDsKKyAgICAgICAgaWYgKGNvbnN0IFZhbHVlICpMTERWYWwgPSBMTEQtPmdldE1lbU9wZXJhbmQoKS0+Z2V0VmFsdWUoKSkgeworICAgICAgICAgIGlmIChjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oTExEVmFsLT5nZXRUeXBlKCkpKQorICAgICAgICAgICAgTExEQWRkclNwYWNlID0gUFQtPmdldEFkZHJlc3NTcGFjZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChjb25zdCBWYWx1ZSAqUkxEVmFsID0gUkxELT5nZXRNZW1PcGVyYW5kKCktPmdldFZhbHVlKCkpIHsKKyAgICAgICAgICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlBUID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFJMRFZhbC0+Z2V0VHlwZSgpKSkKKyAgICAgICAgICAgIFJMREFkZHJTcGFjZSA9IFBULT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBTRFZhbHVlIEFkZHI7CisgICAgICAgIGlmIChMTERBZGRyU3BhY2UgPT0gMCAmJiBSTERBZGRyU3BhY2UgPT0gMCkgeworICAgICAgICAgIGlmIChUaGVTZWxlY3QtPmdldE9wY29kZSgpID09IElTRDo6U0VMRUNUKSB7CisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBjb25kaXRpb24gZG9lc24ndCByZWFjaCBlaXRoZXIgbG9hZC4gIElmIHNvLCBmb2xkaW5nCisgICAgICAgICAgICAvLyB0aGlzIHdpbGwgaW5kdWNlIGEgY3ljbGUgaW50byB0aGUgREFHLgorICAgICAgICAgICAgaWYgKCghTExELT5oYXNBbnlVc2VPZlZhbHVlKDEpIHx8CisgICAgICAgICAgICAgICAgICFMTEQtPmlzUHJlZGVjZXNzb3JPZihUaGVTZWxlY3QtPmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpKSkgJiYKKyAgICAgICAgICAgICAgICAoIVJMRC0+aGFzQW55VXNlT2ZWYWx1ZSgxKSB8fAorICAgICAgICAgICAgICAgICAhUkxELT5pc1ByZWRlY2Vzc29yT2YoVGhlU2VsZWN0LT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKSkpKSB7CisgICAgICAgICAgICAgIEFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgVGhlU2VsZWN0LT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExELT5nZXRCYXNlUHRyKCkuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVTZWxlY3QtPmdldE9wZXJhbmQoMCksIExMRC0+Z2V0QmFzZVB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkxELT5nZXRCYXNlUHRyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBjb25kaXRpb24gZG9lc24ndCByZWFjaCBlaXRoZXIgbG9hZC4gIElmIHNvLCBmb2xkaW5nCisgICAgICAgICAgICAvLyB0aGlzIHdpbGwgaW5kdWNlIGEgY3ljbGUgaW50byB0aGUgREFHLgorICAgICAgICAgICAgaWYgKCghTExELT5oYXNBbnlVc2VPZlZhbHVlKDEpIHx8CisgICAgICAgICAgICAgICAgICghTExELT5pc1ByZWRlY2Vzc29yT2YoVGhlU2VsZWN0LT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICFMTEQtPmlzUHJlZGVjZXNzb3JPZihUaGVTZWxlY3QtPmdldE9wZXJhbmQoMSkuZ2V0Tm9kZSgpKSkpICYmCisgICAgICAgICAgICAgICAgKCFSTEQtPmhhc0FueVVzZU9mVmFsdWUoMSkgfHwKKyAgICAgICAgICAgICAgICAgKCFSTEQtPmlzUHJlZGVjZXNzb3JPZihUaGVTZWxlY3QtPmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpKSAmJgorICAgICAgICAgICAgICAgICAgIVJMRC0+aXNQcmVkZWNlc3Nvck9mKFRoZVNlbGVjdC0+Z2V0T3BlcmFuZCgxKS5nZXROb2RlKCkpKSkpIHsKKyAgICAgICAgICAgICAgQWRkciA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNUX0NDLCBUaGVTZWxlY3QtPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTEQtPmdldEJhc2VQdHIoKS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVNlbGVjdC0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVNlbGVjdC0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMRC0+Z2V0QmFzZVB0cigpLCBSTEQtPmdldEJhc2VQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVNlbGVjdC0+Z2V0T3BlcmFuZCg0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKEFkZHIuZ2V0Tm9kZSgpKSB7CisgICAgICAgICAgU0RWYWx1ZSBMb2FkOworICAgICAgICAgIGlmIChMTEQtPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6Ok5PTl9FWFRMT0FEKSB7CisgICAgICAgICAgICBMb2FkID0gREFHLmdldExvYWQoVGhlU2VsZWN0LT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlU2VsZWN0LT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMRC0+Z2V0Q2hhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMRC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMRC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMRC0+Z2V0QWxpZ25tZW50KCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2FkID0gREFHLmdldEV4dExvYWQoTExELT5nZXRFeHRlbnNpb25UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlU2VsZWN0LT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlU2VsZWN0LT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMRC0+Z2V0Q2hhaW4oKSwgQWRkciwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTEQtPmdldE1lbW9yeVZUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExELT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExELT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExELT5nZXRBbGlnbm1lbnQoKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gVXNlcnMgb2YgdGhlIHNlbGVjdCBub3cgdXNlIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQuCisgICAgICAgICAgQ29tYmluZVRvKFRoZVNlbGVjdCwgTG9hZCk7CisKKyAgICAgICAgICAvLyBVc2VycyBvZiB0aGUgb2xkIGxvYWRzIG5vdyB1c2UgdGhlIG5ldyBsb2FkJ3MgY2hhaW4uICBXZSBrbm93IHRoZQorICAgICAgICAgIC8vIG9sZC1sb2FkIHZhbHVlIGlzIGRlYWQgbm93LgorICAgICAgICAgIENvbWJpbmVUbyhMSFMuZ2V0Tm9kZSgpLCBMb2FkLmdldFZhbHVlKDApLCBMb2FkLmdldFZhbHVlKDEpKTsKKyAgICAgICAgICBDb21iaW5lVG8oUkhTLmdldE5vZGUoKSwgTG9hZC5nZXRWYWx1ZSgwKSwgTG9hZC5nZXRWYWx1ZSgxKSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBTaW1wbGlmeVNlbGVjdENDIC0gU2ltcGxpZnkgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAoTjAgY29uZCBOMSkgPyBOMiA6IE4zCisvLy8gd2hlcmUgJ2NvbmQnIGlzIHRoZSBjb21wYXJpc29uIHNwZWNpZmllZCBieSBDQy4KK1NEVmFsdWUgREFHQ29tYmluZXI6OlNpbXBsaWZ5U2VsZWN0Q0MoRGVidWdMb2MgREwsIFNEVmFsdWUgTjAsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Q29uZENvZGUgQ0MsIGJvb2wgTm90RXh0Q29tcGFyZSkgeworICAvLyAoeCA/IHkgOiB5KSAtPiB5LgorICBpZiAoTjIgPT0gTjMpIHJldHVybiBOMjsKKyAgCisgIEVWVCBWVCA9IE4yLmdldFZhbHVlVHlwZSgpOworICBDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xLmdldE5vZGUoKSk7CisgIENvbnN0YW50U0ROb2RlICpOMkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjIuZ2V0Tm9kZSgpKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4zQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMy5nZXROb2RlKCkpOworCisgIC8vIERldGVybWluZSBpZiB0aGUgY29uZGl0aW9uIHdlJ3JlIGRlYWxpbmcgd2l0aCBpcyBjb25zdGFudAorICBTRFZhbHVlIFNDQyA9IFNpbXBsaWZ5U2V0Q0MoVExJLmdldFNldENDUmVzdWx0VHlwZShOMC5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMCwgTjEsIENDLCBETCwgZmFsc2UpOworICBpZiAoU0NDLmdldE5vZGUoKSkgQWRkVG9Xb3JrTGlzdChTQ0MuZ2V0Tm9kZSgpKTsKKyAgQ29uc3RhbnRTRE5vZGUgKlNDQ0MgPSBkeW5fY2FzdF9vcl9udWxsPENvbnN0YW50U0ROb2RlPihTQ0MuZ2V0Tm9kZSgpKTsKKworICAvLyBmb2xkIHNlbGVjdF9jYyB0cnVlLCB4LCB5IC0+IHgKKyAgaWYgKFNDQ0MgJiYgIVNDQ0MtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIE4yOworICAvLyBmb2xkIHNlbGVjdF9jYyBmYWxzZSwgeCwgeSAtPiB5CisgIGlmIChTQ0NDICYmIFNDQ0MtPmlzTnVsbFZhbHVlKCkpCisgICAgcmV0dXJuIE4zOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gc2ltcGxpZnkgdGhlIHNlbGVjdCBpbnRvIGFuIGZhYnMgbm9kZQorICBpZiAoQ29uc3RhbnRGUFNETm9kZSAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjEpKSB7CisgICAgLy8gQWxsb3cgZWl0aGVyIC0wLjAgb3IgMC4wCisgICAgaWYgKENGUC0+Z2V0VmFsdWVBUEYoKS5pc1plcm8oKSkgeworICAgICAgLy8gc2VsZWN0IChzZXRnW3RlXSBYLCArLy0wLjApLCBYLCBmbmVnKFgpIC0+IGZhYnMKKyAgICAgIGlmICgoQ0MgPT0gSVNEOjpTRVRHRSB8fCBDQyA9PSBJU0Q6OlNFVEdUKSAmJgorICAgICAgICAgIE4wID09IE4yICYmIE4zLmdldE9wY29kZSgpID09IElTRDo6Rk5FRyAmJgorICAgICAgICAgIE4yID09IE4zLmdldE9wZXJhbmQoMCkpCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZBQlMsIERMLCBWVCwgTjApOworCisgICAgICAvLyBzZWxlY3QgKHNldGxbdGVdIFgsICsvLTAuMCksIGZuZWcoWCksIFggLT4gZmFicworICAgICAgaWYgKChDQyA9PSBJU0Q6OlNFVExUIHx8IENDID09IElTRDo6U0VUTEUpICYmCisgICAgICAgICAgTjAgPT0gTjMgJiYgTjIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGTkVHICYmCisgICAgICAgICAgTjIuZ2V0T3BlcmFuZCgwKSA9PSBOMykKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RkFCUywgREwsIFZULCBOMyk7CisgICAgfQorICB9CisgIAorICAvLyBUdXJuICIoYSBjb25kIGIpID8gMS4wZiA6IDIuMGYiIGludG8gImxvYWQgKHRtcCArICgoYSBjb25kIGIpID8gMCA6IDQpIgorICAvLyB3aGVyZSAidG1wIiBpcyBhIGNvbnN0YW50IHBvb2wgZW50cnkgY29udGFpbmluZyBhbiBhcnJheSB3aXRoIDEuMCBhbmQgMi4wCisgIC8vIGluIGl0LiAgVGhpcyBpcyBhIHdpbiB3aGVuIHRoZSBjb25zdGFudCBpcyBub3Qgb3RoZXJ3aXNlIGF2YWlsYWJsZSBiZWNhdXNlCisgIC8vIGl0IHJlcGxhY2VzIHR3byBjb25zdGFudCBwb29sIGxvYWRzIHdpdGggb25lLiAgV2Ugb25seSBkbyB0aGlzIGlmIHRoZSBGUAorICAvLyB0eXBlIGlzIGtub3duIHRvIGJlIGxlZ2FsLCBiZWNhdXNlIGlmIGl0IGlzbid0LCB0aGVuIHdlIGFyZSBiZWZvcmUgbGVnYWxpemUKKyAgLy8gdHlwZXMgYW4gd2Ugd2FudCB0aGUgb3RoZXIgbGVnYWxpemF0aW9uIHRvIGhhcHBlbiBmaXJzdCAoZS5nLiB0byBhdm9pZAorICAvLyBtZXNzaW5nIHdpdGggc29mdCBmbG9hdCkgYW5kIGlmIHRoZSBDb25zdGFudEZQIGlzIG5vdCBsZWdhbCwgYmVjYXVzZSBpZgorICAvLyBpdCBpcyBsZWdhbCwgd2UgbWF5IG5vdCBuZWVkIHRvIHN0b3JlIHRoZSBGUCBjb25zdGFudCBpbiBhIGNvbnN0YW50IHBvb2wuCisgIGlmIChDb25zdGFudEZQU0ROb2RlICpUViA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4yKSkKKyAgICBpZiAoQ29uc3RhbnRGUFNETm9kZSAqRlYgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihOMykpIHsKKyAgICAgIGlmIChUTEkuaXNUeXBlTGVnYWwoTjIuZ2V0VmFsdWVUeXBlKCkpICYmCisgICAgICAgICAgKFRMSS5nZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDb25zdGFudEZQLCBOMi5nZXRWYWx1ZVR5cGUoKSkgIT0KKyAgICAgICAgICAgVGFyZ2V0TG93ZXJpbmc6OkxlZ2FsKSAmJgorICAgICAgICAgIC8vIElmIGJvdGggY29uc3RhbnRzIGhhdmUgbXVsdGlwbGUgdXNlcywgdGhlbiB3ZSB3b24ndCBuZWVkIHRvIGRvIGFuCisgICAgICAgICAgLy8gZXh0cmEgbG9hZCwgdGhleSBhcmUgbGlrZWx5IGFyb3VuZCBpbiByZWdpc3RlcnMgZm9yIG90aGVyIHVzZXJzLgorICAgICAgICAgIChUVi0+aGFzT25lVXNlKCkgfHwgRlYtPmhhc09uZVVzZSgpKSkgeworICAgICAgICBDb25zdGFudCAqRWx0c1tdID0geworICAgICAgICAgIGNvbnN0X2Nhc3Q8Q29uc3RhbnRGUCo+KEZWLT5nZXRDb25zdGFudEZQVmFsdWUoKSksCisgICAgICAgICAgY29uc3RfY2FzdDxDb25zdGFudEZQKj4oVFYtPmdldENvbnN0YW50RlBWYWx1ZSgpKQorICAgICAgICB9OworICAgICAgICBjb25zdCBUeXBlICpGUFR5ID0gRWx0c1swXS0+Z2V0VHlwZSgpOworICAgICAgICBjb25zdCBUYXJnZXREYXRhICZURCA9ICpUTEkuZ2V0VGFyZ2V0RGF0YSgpOworICAgICAgICAKKyAgICAgICAgLy8gQ3JlYXRlIGEgQ29uc3RhbnRBcnJheSBvZiB0aGUgdHdvIGNvbnN0YW50cy4KKyAgICAgICAgQ29uc3RhbnQgKkNBID0gQ29uc3RhbnRBcnJheTo6Z2V0KEFycmF5VHlwZTo6Z2V0KEZQVHksIDIpLCBFbHRzLCAyKTsKKyAgICAgICAgU0RWYWx1ZSBDUElkeCA9IERBRy5nZXRDb25zdGFudFBvb2woQ0EsIFRMSS5nZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEQuZ2V0UHJlZlR5cGVBbGlnbm1lbnQoRlBUeSkpOworICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBjYXN0PENvbnN0YW50UG9vbFNETm9kZT4oQ1BJZHgpLT5nZXRBbGlnbm1lbnQoKTsKKworICAgICAgICAvLyBHZXQgdGhlIG9mZnNldHMgdG8gdGhlIDAgYW5kIDEgZWxlbWVudCBvZiB0aGUgYXJyYXkgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgLy8gc2VsZWN0IGJldHdlZW4gdGhlbS4KKyAgICAgICAgU0RWYWx1ZSBaZXJvID0gREFHLmdldEludFB0ckNvbnN0YW50KDApOworICAgICAgICB1bnNpZ25lZCBFbHRTaXplID0gKHVuc2lnbmVkKVRELmdldFR5cGVBbGxvY1NpemUoRWx0c1swXS0+Z2V0VHlwZSgpKTsKKyAgICAgICAgU0RWYWx1ZSBPbmUgPSBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoRWx0U2l6ZSk7CisgICAgICAgIAorICAgICAgICBTRFZhbHVlIENvbmQgPSBEQUcuZ2V0U2V0Q0MoREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKE4wLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLCBOMSwgQ0MpOworICAgICAgICBTRFZhbHVlIENzdE9mZnNldCA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBETCwgWmVyby5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kLCBPbmUsIFplcm8pOworICAgICAgICBDUElkeCA9IERBRy5nZXROb2RlKElTRDo6QURELCBETCwgVExJLmdldFBvaW50ZXJUeSgpLCBDUElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc3RPZmZzZXQpOworICAgICAgICByZXR1cm4gREFHLmdldExvYWQoVFYtPmdldFZhbHVlVHlwZSgwKSwgREwsIERBRy5nZXRFbnRyeU5vZGUoKSwgQ1BJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Q29uc3RhbnRQb29sKCksIDAsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIEFsaWdubWVudCk7CisKKyAgICAgIH0KKyAgICB9ICAKKworICAvLyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHBlcmZvcm0gdGhlICJnemlwIHRyaWNrIiwgdHJhbnNmb3JtaW5nCisgIC8vIChzZWxlY3RfY2Mgc2V0bHQgWCwgMCwgQSwgMCkgLT4gKGFuZCAoc3JhIFgsIChzdWIgc2l6ZShYKSwgMSksIEEpCisgIGlmIChOMUMgJiYgTjNDICYmIE4zQy0+aXNOdWxsVmFsdWUoKSAmJiBDQyA9PSBJU0Q6OlNFVExUICYmCisgICAgICBOMC5nZXRWYWx1ZVR5cGUoKS5pc0ludGVnZXIoKSAmJgorICAgICAgTjIuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkgJiYKKyAgICAgIChOMUMtPmlzTnVsbFZhbHVlKCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGEgPCAwKSA/IGIgOiAwCisgICAgICAgKE4xQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDEgJiYgTjAgPT0gTjIpKSkgeyAgIC8vIChhIDwgMSkgPyBhIDogMAorICAgIEVWVCBYVHlwZSA9IE4wLmdldFZhbHVlVHlwZSgpOworICAgIEVWVCBBVHlwZSA9IE4yLmdldFZhbHVlVHlwZSgpOworICAgIGlmIChYVHlwZS5iaXRzR0UoQVR5cGUpKSB7CisgICAgICAvLyBhbmQgKHNyYSBYLCBzaXplKFgpLTEsIEEpIC0+ICJhbmQgKHNybCBYLCBDMiksIEEiIGlmZiBBIGlzIGEKKyAgICAgIC8vIHNpbmdsZS1iaXQgY29uc3RhbnQuCisgICAgICBpZiAoTjJDICYmICgoTjJDLT5nZXRBUEludFZhbHVlKCkgJiAoTjJDLT5nZXRBUEludFZhbHVlKCktMSkpID09IDApKSB7CisgICAgICAgIHVuc2lnbmVkIFNoQ3RWID0gTjJDLT5nZXRBUEludFZhbHVlKCkubG9nQmFzZTIoKTsKKyAgICAgICAgU2hDdFYgPSBYVHlwZS5nZXRTaXplSW5CaXRzKCktU2hDdFYtMTsKKyAgICAgICAgU0RWYWx1ZSBTaEN0ID0gREFHLmdldENvbnN0YW50KFNoQ3RWLCBnZXRTaGlmdEFtb3VudFR5KCkpOworICAgICAgICBTRFZhbHVlIFNoaWZ0ID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIE4wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYVHlwZSwgTjAsIFNoQ3QpOworICAgICAgICBBZGRUb1dvcmtMaXN0KFNoaWZ0LmdldE5vZGUoKSk7CisKKyAgICAgICAgaWYgKFhUeXBlLmJpdHNHVChBVHlwZSkpIHsKKyAgICAgICAgICBTaGlmdCA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIERMLCBBVHlwZSwgU2hpZnQpOworICAgICAgICAgIEFkZFRvV29ya0xpc3QoU2hpZnQuZ2V0Tm9kZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgREwsIEFUeXBlLCBTaGlmdCwgTjIpOworICAgICAgfQorCisgICAgICBTRFZhbHVlIFNoaWZ0ID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIE4wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFR5cGUsIE4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChYVHlwZS5nZXRTaXplSW5CaXRzKCktMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hpZnRBbW91bnRUeSgpKSk7CisgICAgICBBZGRUb1dvcmtMaXN0KFNoaWZ0LmdldE5vZGUoKSk7CisKKyAgICAgIGlmIChYVHlwZS5iaXRzR1QoQVR5cGUpKSB7CisgICAgICAgIFNoaWZ0ID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgREwsIEFUeXBlLCBTaGlmdCk7CisgICAgICAgIEFkZFRvV29ya0xpc3QoU2hpZnQuZ2V0Tm9kZSgpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ELCBETCwgQVR5cGUsIFNoaWZ0LCBOMik7CisgICAgfQorICB9CisKKyAgLy8gZm9sZCBzZWxlY3QgQywgMTYsIDAgLT4gc2hsIEMsIDQKKyAgaWYgKE4yQyAmJiBOM0MgJiYgTjNDLT5pc051bGxWYWx1ZSgpICYmIE4yQy0+Z2V0QVBJbnRWYWx1ZSgpLmlzUG93ZXJPZjIoKSAmJgorICAgICAgVExJLmdldEJvb2xlYW5Db250ZW50cygpID09IFRhcmdldExvd2VyaW5nOjpaZXJvT3JPbmVCb29sZWFuQ29udGVudCkgeworCisgICAgLy8gSWYgdGhlIGNhbGxlciBkb2Vzbid0IHdhbnQgdXMgdG8gc2ltcGxpZnkgdGhpcyBpbnRvIGEgemV4dCBvZiBhIGNvbXBhcmUsCisgICAgLy8gZG9uJ3QgZG8gaXQuCisgICAgaWYgKE5vdEV4dENvbXBhcmUgJiYgTjJDLT5nZXRBUEludFZhbHVlKCkgPT0gMSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICAvLyBHZXQgYSBTZXRDQyBvZiB0aGUgY29uZGl0aW9uCisgICAgLy8gRklYTUU6IFNob3VsZCBwcm9iYWJseSBtYWtlIHN1cmUgdGhhdCBzZXRjYyBpcyBsZWdhbCBpZiB3ZSBldmVyIGhhdmUgYQorICAgIC8vIHRhcmdldCB3aGVyZSBpdCBpc24ndC4KKyAgICBTRFZhbHVlIFRlbXAsIFNDQzsKKyAgICAvLyBjYXN0IGZyb20gc2V0Y2MgcmVzdWx0IHR5cGUgdG8gc2VsZWN0IHJlc3VsdCB0eXBlCisgICAgaWYgKExlZ2FsVHlwZXMpIHsKKyAgICAgIFNDQyAgPSBEQUcuZ2V0U2V0Q0MoREwsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoTjAuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOMCwgTjEsIENDKTsKKyAgICAgIGlmIChOMi5nZXRWYWx1ZVR5cGUoKS5iaXRzTFQoU0NDLmdldFZhbHVlVHlwZSgpKSkKKyAgICAgICAgVGVtcCA9IERBRy5nZXRaZXJvRXh0ZW5kSW5SZWcoU0NDLCBOMi5nZXREZWJ1Z0xvYygpLCBOMi5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICBlbHNlCisgICAgICAgIFRlbXAgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBOMi5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTjIuZ2V0VmFsdWVUeXBlKCksIFNDQyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNDQyAgPSBEQUcuZ2V0U2V0Q0MoTjAuZ2V0RGVidWdMb2MoKSwgTVZUOjppMSwgTjAsIE4xLCBDQyk7CisgICAgICBUZW1wID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgTjIuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOMi5nZXRWYWx1ZVR5cGUoKSwgU0NDKTsKKyAgICB9CisKKyAgICBBZGRUb1dvcmtMaXN0KFNDQy5nZXROb2RlKCkpOworICAgIEFkZFRvV29ya0xpc3QoVGVtcC5nZXROb2RlKCkpOworCisgICAgaWYgKE4yQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDEpCisgICAgICByZXR1cm4gVGVtcDsKKworICAgIC8vIHNobCBzZXRjYyByZXN1bHQgYnkgbG9nMiBuMmMKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTSEwsIERMLCBOMi5nZXRWYWx1ZVR5cGUoKSwgVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE4yQy0+Z2V0QVBJbnRWYWx1ZSgpLmxvZ0Jhc2UyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHNldGNjCisgIC8vIEZJWE1FOiBUdXJuIGFsbCBvZiB0aGVzZSBpbnRvIHNldGNjIGlmIHNldGNjIGlmIHNldGNjIGlzIGxlZ2FsCisgIC8vIG90aGVyd2lzZSwgZ28gYWhlYWQgd2l0aCB0aGUgZm9sZHMuCisgIGlmICgwICYmIE4zQyAmJiBOM0MtPmlzTnVsbFZhbHVlKCkgJiYgTjJDICYmIChOMkMtPmdldEFQSW50VmFsdWUoKSA9PSAxVUxMKSkgeworICAgIEVWVCBYVHlwZSA9IE4wLmdldFZhbHVlVHlwZSgpOworICAgIGlmICghTGVnYWxPcGVyYXRpb25zIHx8CisgICAgICAgIFRMSS5pc09wZXJhdGlvbkxlZ2FsKElTRDo6U0VUQ0MsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoWFR5cGUpKSkgeworICAgICAgU0RWYWx1ZSBSZXMgPSBEQUcuZ2V0U2V0Q0MoREwsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoWFR5cGUpLCBOMCwgTjEsIENDKTsKKyAgICAgIGlmIChSZXMuZ2V0VmFsdWVUeXBlKCkgIT0gVlQpCisgICAgICAgIFJlcyA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIERMLCBWVCwgUmVzKTsKKyAgICAgIHJldHVybiBSZXM7CisgICAgfQorCisgICAgLy8gZm9sZCAoc2V0ZXEgWCwgMCkgLT4gKHNybCAoY3RseiBYLCBsb2cyKHNpemUoWCkpKSkKKyAgICBpZiAoTjFDICYmIE4xQy0+aXNOdWxsVmFsdWUoKSAmJiBDQyA9PSBJU0Q6OlNFVEVRICYmCisgICAgICAgICghTGVnYWxPcGVyYXRpb25zIHx8CisgICAgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbChJU0Q6OkNUTFosIFhUeXBlKSkpIHsKKyAgICAgIFNEVmFsdWUgQ3RseiA9IERBRy5nZXROb2RlKElTRDo6Q1RMWiwgTjAuZ2V0RGVidWdMb2MoKSwgWFR5cGUsIE4wKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgREwsIFhUeXBlLCBDdGx6LAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChMb2cyXzMyKFhUeXBlLmdldFNpemVJbkJpdHMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoaWZ0QW1vdW50VHkoKSkpOworICAgIH0KKyAgICAvLyBmb2xkIChzZXRndCBYLCAwKSAtPiAoc3JsIChhbmQgKC1YLCB+WCksIHNpemUoWCktMSkpCisgICAgaWYgKE4xQyAmJiBOMUMtPmlzTnVsbFZhbHVlKCkgJiYgQ0MgPT0gSVNEOjpTRVRHVCkgeworICAgICAgU0RWYWx1ZSBOZWdOMCA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBOMC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhUeXBlLCBEQUcuZ2V0Q29uc3RhbnQoMCwgWFR5cGUpLCBOMCk7CisgICAgICBTRFZhbHVlIE5vdE4wID0gREFHLmdldE5PVChOMC5nZXREZWJ1Z0xvYygpLCBOMCwgWFR5cGUpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1JMLCBETCwgWFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBTkQsIERMLCBYVHlwZSwgTmVnTjAsIE5vdE4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoWFR5cGUuZ2V0U2l6ZUluQml0cygpLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoaWZ0QW1vdW50VHkoKSkpOworICAgIH0KKyAgICAvLyBmb2xkIChzZXRndCBYLCAtMSkgLT4gKHhvciAoc3JsIChYLCBzaXplKFgpLTEpLCAxKSkKKyAgICBpZiAoTjFDICYmIE4xQy0+aXNBbGxPbmVzVmFsdWUoKSAmJiBDQyA9PSBJU0Q6OlNFVEdUKSB7CisgICAgICBTRFZhbHVlIFNpZ24gPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgTjAuZ2V0RGVidWdMb2MoKSwgWFR5cGUsIE4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFhUeXBlLmdldFNpemVJbkJpdHMoKS0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoaWZ0QW1vdW50VHkoKSkpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6WE9SLCBETCwgWFR5cGUsIFNpZ24sIERBRy5nZXRDb25zdGFudCgxLCBYVHlwZSkpOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGludGVnZXIgYWJzLgorICAvLyBzZWxlY3RfY2Mgc2V0Z1t0ZV0gWCwgIDAsICBYLCAtWCAtPgorICAvLyBzZWxlY3RfY2Mgc2V0Z3QgICAgWCwgLTEsICBYLCAtWCAtPgorICAvLyBzZWxlY3RfY2Mgc2V0bFt0ZV0gWCwgIDAsIC1YLCAgWCAtPgorICAvLyBzZWxlY3RfY2Mgc2V0bHQgICAgWCwgIDEsIC1YLCAgWCAtPgorICAvLyBZID0gc3JhIChYLCBzaXplKFgpLTEpOyB4b3IgKGFkZCAoWCwgWSksIFkpCisgIGlmIChOMUMpIHsKKyAgICBDb25zdGFudFNETm9kZSAqU3ViQyA9IE5VTEw7CisgICAgaWYgKCgoTjFDLT5pc051bGxWYWx1ZSgpICYmIChDQyA9PSBJU0Q6OlNFVEdUIHx8IENDID09IElTRDo6U0VUR0UpKSB8fAorICAgICAgICAgKE4xQy0+aXNBbGxPbmVzVmFsdWUoKSAmJiBDQyA9PSBJU0Q6OlNFVEdUKSkgJiYKKyAgICAgICAgTjAgPT0gTjIgJiYgTjMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIgJiYgTjAgPT0gTjMuZ2V0T3BlcmFuZCgxKSkKKyAgICAgIFN1YkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjMuZ2V0T3BlcmFuZCgwKSk7CisgICAgZWxzZSBpZiAoKChOMUMtPmlzTnVsbFZhbHVlKCkgJiYgKENDID09IElTRDo6U0VUTFQgfHwgQ0MgPT0gSVNEOjpTRVRMRSkpIHx8CisgICAgICAgICAgICAgIChOMUMtPmlzT25lKCkgJiYgQ0MgPT0gSVNEOjpTRVRMVCkpICYmCisgICAgICAgICAgICAgTjAgPT0gTjMgJiYgTjIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIgJiYgTjAgPT0gTjIuZ2V0T3BlcmFuZCgxKSkKKyAgICAgIFN1YkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjIuZ2V0T3BlcmFuZCgwKSk7CisKKyAgICBFVlQgWFR5cGUgPSBOMC5nZXRWYWx1ZVR5cGUoKTsKKyAgICBpZiAoU3ViQyAmJiBTdWJDLT5pc051bGxWYWx1ZSgpICYmIFhUeXBlLmlzSW50ZWdlcigpKSB7CisgICAgICBTRFZhbHVlIFNoaWZ0ID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIE4wLmdldERlYnVnTG9jKCksIFhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChYVHlwZS5nZXRTaXplSW5CaXRzKCktMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2hpZnRBbW91bnRUeSgpKSk7CisgICAgICBTRFZhbHVlIEFkZCA9IERBRy5nZXROb2RlKElTRDo6QURELCBOMC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYVHlwZSwgTjAsIFNoaWZ0KTsKKyAgICAgIEFkZFRvV29ya0xpc3QoU2hpZnQuZ2V0Tm9kZSgpKTsKKyAgICAgIEFkZFRvV29ya0xpc3QoQWRkLmdldE5vZGUoKSk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpYT1IsIERMLCBYVHlwZSwgQWRkLCBTaGlmdCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIFNpbXBsaWZ5U2V0Q0MgLSBUaGlzIGlzIGEgc3R1YiBmb3IgVGFyZ2V0TG93ZXJpbmc6OlNpbXBsaWZ5U2V0Q0MuCitTRFZhbHVlIERBR0NvbWJpbmVyOjpTaW1wbGlmeVNldENDKEVWVCBWVCwgU0RWYWx1ZSBOMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgSVNEOjpDb25kQ29kZSBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBETCwgYm9vbCBmb2xkQm9vbGVhbnMpIHsKKyAgVGFyZ2V0TG93ZXJpbmc6OkRBR0NvbWJpbmVySW5mbworICAgIERhZ0NvbWJpbmVJbmZvKERBRywgIUxlZ2FsVHlwZXMsICFMZWdhbE9wZXJhdGlvbnMsIGZhbHNlLCB0aGlzKTsKKyAgcmV0dXJuIFRMSS5TaW1wbGlmeVNldENDKFZULCBOMCwgTjEsIENvbmQsIGZvbGRCb29sZWFucywgRGFnQ29tYmluZUluZm8sIERMKTsKK30KKworLy8vIEJ1aWxkU0RJVlNlcXVlbmNlIC0gR2l2ZW4gYW4gSVNEOjpTRElWIG5vZGUgZXhwcmVzc2luZyBhIGRpdmlkZSBieSBjb25zdGFudCwKKy8vLyByZXR1cm4gYSBEQUcgZXhwcmVzc2lvbiB0byBzZWxlY3QgdGhhdCB3aWxsIGdlbmVyYXRlIHRoZSBzYW1lIHZhbHVlIGJ5CisvLy8gbXVsdGlwbHlpbmcgYnkgYSBtYWdpYyBudW1iZXIuICBTZWU6CisvLy8gPGh0dHA6Ly90aGUud2FsbC5yaXNjb20ubmV0L2Jvb2tzL3Byb2MvcHBjL2N3Zy9jb2RlMi5odG1sPgorU0RWYWx1ZSBEQUdDb21iaW5lcjo6QnVpbGRTRElWKFNETm9kZSAqTikgeworICBzdGQ6OnZlY3RvcjxTRE5vZGUqPiBCdWlsdDsKKyAgU0RWYWx1ZSBTID0gVExJLkJ1aWxkU0RJVihOLCBEQUcsICZCdWlsdCk7CisKKyAgZm9yIChzdGQ6OnZlY3RvcjxTRE5vZGUqPjo6aXRlcmF0b3IgaWkgPSBCdWlsdC5iZWdpbigpLCBlZSA9IEJ1aWx0LmVuZCgpOworICAgICAgIGlpICE9IGVlOyArK2lpKQorICAgIEFkZFRvV29ya0xpc3QoKmlpKTsKKyAgcmV0dXJuIFM7Cit9CisKKy8vLyBCdWlsZFVESVZTZXF1ZW5jZSAtIEdpdmVuIGFuIElTRDo6VURJViBub2RlIGV4cHJlc3NpbmcgYSBkaXZpZGUgYnkgY29uc3RhbnQsCisvLy8gcmV0dXJuIGEgREFHIGV4cHJlc3Npb24gdG8gc2VsZWN0IHRoYXQgd2lsbCBnZW5lcmF0ZSB0aGUgc2FtZSB2YWx1ZSBieQorLy8vIG11bHRpcGx5aW5nIGJ5IGEgbWFnaWMgbnVtYmVyLiAgU2VlOgorLy8vIDxodHRwOi8vdGhlLndhbGwucmlzY29tLm5ldC9ib29rcy9wcm9jL3BwYy9jd2cvY29kZTIuaHRtbD4KK1NEVmFsdWUgREFHQ29tYmluZXI6OkJ1aWxkVURJVihTRE5vZGUgKk4pIHsKKyAgc3RkOjp2ZWN0b3I8U0ROb2RlKj4gQnVpbHQ7CisgIFNEVmFsdWUgUyA9IFRMSS5CdWlsZFVESVYoTiwgREFHLCAmQnVpbHQpOworCisgIGZvciAoc3RkOjp2ZWN0b3I8U0ROb2RlKj46Oml0ZXJhdG9yIGlpID0gQnVpbHQuYmVnaW4oKSwgZWUgPSBCdWlsdC5lbmQoKTsKKyAgICAgICBpaSAhPSBlZTsgKytpaSkKKyAgICBBZGRUb1dvcmtMaXN0KCppaSk7CisgIHJldHVybiBTOworfQorCisvLy8gRmluZEJhc2VPZmZzZXQgLSBSZXR1cm4gdHJ1ZSBpZiBiYXNlIGlzIGEgZnJhbWUgaW5kZXgsIHdoaWNoIGlzIGtub3duIG5vdAorLy8gdG8gYWxpYXMgd2l0aCBhbnl0aGluZyBidXQgaXRzZWxmLiAgUHJvdmlkZXMgYmFzZSBvYmplY3QgYW5kIG9mZnNldCBhcyByZXN1bHRzLgorc3RhdGljIGJvb2wgRmluZEJhc2VPZmZzZXQoU0RWYWx1ZSBQdHIsIFNEVmFsdWUgJkJhc2UsIGludDY0X3QgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlIComR1YsIHZvaWQgKiZDVikgeworICAvLyBBc3N1bWUgaXQgaXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uLgorICBCYXNlID0gUHRyOyBPZmZzZXQgPSAwOyBHViA9IDA7IENWID0gMDsKKworICAvLyBJZiBpdCdzIGFuIGFkZGluZyBhIHNpbXBsZSBjb25zdGFudCB0aGVuIGludGVncmF0ZSB0aGUgb2Zmc2V0LgorICBpZiAoQmFzZS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihCYXNlLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBCYXNlID0gQmFzZS5nZXRPcGVyYW5kKDApOworICAgICAgT2Zmc2V0ICs9IEMtPmdldFpFeHRWYWx1ZSgpOworICAgIH0KKyAgfQorICAKKyAgLy8gUmV0dXJuIHRoZSB1bmRlcmx5aW5nIEdsb2JhbFZhbHVlLCBhbmQgdXBkYXRlIHRoZSBPZmZzZXQuICBSZXR1cm4gZmFsc2UKKyAgLy8gZm9yIEdsb2JhbEFkZHJlc3NTRE5vZGUgc2luY2UgdGhlIHNhbWUgR2xvYmFsQWRkcmVzcyBtYXkgYmUgcmVwcmVzZW50ZWQKKyAgLy8gYnkgbXVsdGlwbGUgbm9kZXMgd2l0aCBkaWZmZXJlbnQgb2Zmc2V0cy4KKyAgaWYgKEdsb2JhbEFkZHJlc3NTRE5vZGUgKkcgPSBkeW5fY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihCYXNlKSkgeworICAgIEdWID0gRy0+Z2V0R2xvYmFsKCk7CisgICAgT2Zmc2V0ICs9IEctPmdldE9mZnNldCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgdW5kZXJseWluZyBDb25zdGFudCB2YWx1ZSwgYW5kIHVwZGF0ZSB0aGUgT2Zmc2V0LiAgUmV0dXJuIGZhbHNlCisgIC8vIGZvciBDb25zdGFudFNETm9kZXMgc2luY2UgdGhlIHNhbWUgY29uc3RhbnQgcG9vbCBlbnRyeSBtYXkgYmUgcmVwcmVzZW50ZWQKKyAgLy8gYnkgbXVsdGlwbGUgbm9kZXMgd2l0aCBkaWZmZXJlbnQgb2Zmc2V0cy4KKyAgaWYgKENvbnN0YW50UG9vbFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50UG9vbFNETm9kZT4oQmFzZSkpIHsKKyAgICBDViA9IEMtPmlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkgPyAodm9pZCAqKUMtPmdldE1hY2hpbmVDUFZhbCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHZvaWQgKilDLT5nZXRDb25zdFZhbCgpOworICAgIE9mZnNldCArPSBDLT5nZXRPZmZzZXQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gSWYgaXQncyBhbnkgb2YgdGhlIGZvbGxvd2luZyB0aGVuIGl0IGNhbid0IGFsaWFzIHdpdGggYW55dGhpbmcgYnV0IGl0c2VsZi4KKyAgcmV0dXJuIGlzYTxGcmFtZUluZGV4U0ROb2RlPihCYXNlKTsKK30KKworLy8vIGlzQWxpYXMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbnkgcG9zc2liaWxpdHkgdGhhdCB0aGUgdHdvIGFkZHJlc3NlcworLy8vIG92ZXJsYXAuCitib29sIERBR0NvbWJpbmVyOjppc0FsaWFzKFNEVmFsdWUgUHRyMSwgaW50NjRfdCBTaXplMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNyY1ZhbHVlMSwgaW50IFNyY1ZhbHVlT2Zmc2V0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjVmFsdWVBbGlnbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyMiwgaW50NjRfdCBTaXplMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNyY1ZhbHVlMiwgaW50IFNyY1ZhbHVlT2Zmc2V0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjVmFsdWVBbGlnbjIpIGNvbnN0IHsKKyAgLy8gSWYgdGhleSBhcmUgdGhlIHNhbWUgdGhlbiB0aGV5IG11c3QgYmUgYWxpYXNlcy4KKyAgaWYgKFB0cjEgPT0gUHRyMikgcmV0dXJuIHRydWU7CisKKyAgLy8gR2F0aGVyIGJhc2Ugbm9kZSBhbmQgb2Zmc2V0IGluZm9ybWF0aW9uLgorICBTRFZhbHVlIEJhc2UxLCBCYXNlMjsKKyAgaW50NjRfdCBPZmZzZXQxLCBPZmZzZXQyOworICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YxLCAqR1YyOworICB2b2lkICpDVjEsICpDVjI7CisgIGJvb2wgaXNGcmFtZUluZGV4MSA9IEZpbmRCYXNlT2Zmc2V0KFB0cjEsIEJhc2UxLCBPZmZzZXQxLCBHVjEsIENWMSk7CisgIGJvb2wgaXNGcmFtZUluZGV4MiA9IEZpbmRCYXNlT2Zmc2V0KFB0cjIsIEJhc2UyLCBPZmZzZXQyLCBHVjIsIENWMik7CisKKyAgLy8gSWYgdGhleSBoYXZlIGEgc2FtZSBiYXNlIGFkZHJlc3MgdGhlbiBjaGVjayB0byBzZWUgaWYgdGhleSBvdmVybGFwLgorICBpZiAoQmFzZTEgPT0gQmFzZTIgfHwgKEdWMSAmJiAoR1YxID09IEdWMikpIHx8IChDVjEgJiYgKENWMSA9PSBDVjIpKSkKKyAgICByZXR1cm4gISgoT2Zmc2V0MSArIFNpemUxKSA8PSBPZmZzZXQyIHx8IChPZmZzZXQyICsgU2l6ZTIpIDw9IE9mZnNldDEpOworCisgIC8vIElmIHdlIGtub3cgd2hhdCB0aGUgYmFzZXMgYXJlLCBhbmQgdGhleSBhcmVuJ3QgaWRlbnRpY2FsLCB0aGVuIHdlIGtub3cgdGhleQorICAvLyBjYW5ub3QgYWxpYXMuCisgIGlmICgoaXNGcmFtZUluZGV4MSB8fCBDVjEgfHwgR1YxKSAmJiAoaXNGcmFtZUluZGV4MiB8fCBDVjIgfHwgR1YyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgd2Uga25vdyByZXF1aXJlZCBTcmNWYWx1ZTEgYW5kIFNyY1ZhbHVlMiBoYXZlIHJlbGF0aXZlbHkgbGFyZ2UgYWxpZ25tZW50CisgIC8vIGNvbXBhcmVkIHRvIHRoZSBzaXplIGFuZCBvZmZzZXQgb2YgdGhlIGFjY2Vzcywgd2UgbWF5IGJlIGFibGUgdG8gcHJvdmUgdGhleQorICAvLyBkbyBub3QgYWxpYXMuICBUaGlzIGNoZWNrIGlzIGNvbnNlcnZhdGl2ZSBmb3Igbm93IHRvIGNhdGNoIGNhc2VzIGNyZWF0ZWQgYnkKKyAgLy8gc3BsaXR0aW5nIHZlY3RvciB0eXBlcy4KKyAgaWYgKChTcmNWYWx1ZUFsaWduMSA9PSBTcmNWYWx1ZUFsaWduMikgJiYKKyAgICAgIChTcmNWYWx1ZU9mZnNldDEgIT0gU3JjVmFsdWVPZmZzZXQyKSAmJgorICAgICAgKFNpemUxID09IFNpemUyKSAmJiAoU3JjVmFsdWVBbGlnbjEgPiBTaXplMSkpIHsKKyAgICBpbnQ2NF90IE9mZkFsaWduMSA9IFNyY1ZhbHVlT2Zmc2V0MSAlIFNyY1ZhbHVlQWxpZ24xOworICAgIGludDY0X3QgT2ZmQWxpZ24yID0gU3JjVmFsdWVPZmZzZXQyICUgU3JjVmFsdWVBbGlnbjE7CisgICAgCisgICAgLy8gVGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoZXNlIHJlbGF0aXZlbHkgYWxpZ25lZCBhY2Nlc3NlcyBvZiBzaW1pbGFyCisgICAgLy8gc2l6ZSwgcmV0dXJuIG5vIGFsaWFzLgorICAgIGlmICgoT2ZmQWxpZ24xICsgU2l6ZTEpIDw9IE9mZkFsaWduMiB8fCAoT2ZmQWxpZ24yICsgU2l6ZTIpIDw9IE9mZkFsaWduMSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgaWYgKENvbWJpbmVyR2xvYmFsQUEpIHsKKyAgICAvLyBVc2UgYWxpYXMgYW5hbHlzaXMgaW5mb3JtYXRpb24uCisgICAgaW50NjRfdCBNaW5PZmZzZXQgPSBzdGQ6Om1pbihTcmNWYWx1ZU9mZnNldDEsIFNyY1ZhbHVlT2Zmc2V0Mik7CisgICAgaW50NjRfdCBPdmVybGFwMSA9IFNpemUxICsgU3JjVmFsdWVPZmZzZXQxIC0gTWluT2Zmc2V0OworICAgIGludDY0X3QgT3ZlcmxhcDIgPSBTaXplMiArIFNyY1ZhbHVlT2Zmc2V0MiAtIE1pbk9mZnNldDsKKyAgICBBbGlhc0FuYWx5c2lzOjpBbGlhc1Jlc3VsdCBBQVJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLmFsaWFzKFNyY1ZhbHVlMSwgT3ZlcmxhcDEsIFNyY1ZhbHVlMiwgT3ZlcmxhcDIpOworICAgIGlmIChBQVJlc3VsdCA9PSBBbGlhc0FuYWx5c2lzOjpOb0FsaWFzKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gT3RoZXJ3aXNlIHdlIGhhdmUgdG8gYXNzdW1lIHRoZXkgYWxpYXMuCisgIHJldHVybiB0cnVlOworfQorCisvLy8gRmluZEFsaWFzSW5mbyAtIEV4dHJhY3RzIHRoZSByZWxldmFudCBhbGlhcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtZW1vcnkKKy8vLyBub2RlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBvcGVyYW5kIHdhcyBhIGxvYWQuCitib29sIERBR0NvbWJpbmVyOjpGaW5kQWxpYXNJbmZvKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJlB0ciwgaW50NjRfdCAmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlIComU3JjVmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZTcmNWYWx1ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcmNWYWx1ZUFsaWduKSBjb25zdCB7CisgIGlmIChMb2FkU0ROb2RlICpMRCA9IGR5bl9jYXN0PExvYWRTRE5vZGU+KE4pKSB7CisgICAgUHRyID0gTEQtPmdldEJhc2VQdHIoKTsKKyAgICBTaXplID0gTEQtPmdldE1lbW9yeVZUKCkuZ2V0U2l6ZUluQml0cygpID4+IDM7CisgICAgU3JjVmFsdWUgPSBMRC0+Z2V0U3JjVmFsdWUoKTsKKyAgICBTcmNWYWx1ZU9mZnNldCA9IExELT5nZXRTcmNWYWx1ZU9mZnNldCgpOworICAgIFNyY1ZhbHVlQWxpZ24gPSBMRC0+Z2V0T3JpZ2luYWxBbGlnbm1lbnQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChTdG9yZVNETm9kZSAqU1QgPSBkeW5fY2FzdDxTdG9yZVNETm9kZT4oTikpIHsKKyAgICBQdHIgPSBTVC0+Z2V0QmFzZVB0cigpOworICAgIFNpemUgPSBTVC0+Z2V0TWVtb3J5VlQoKS5nZXRTaXplSW5CaXRzKCkgPj4gMzsKKyAgICBTcmNWYWx1ZSA9IFNULT5nZXRTcmNWYWx1ZSgpOworICAgIFNyY1ZhbHVlT2Zmc2V0ID0gU1QtPmdldFNyY1ZhbHVlT2Zmc2V0KCk7CisgICAgU3JjVmFsdWVBbGlnbiA9IFNULT5nZXRPcmlnaW5hbEFsaWdubWVudCgpOworICB9IGVsc2UgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIkZpbmRBbGlhc0luZm8gZXhwZWN0ZWQgYSBtZW1vcnkgb3BlcmFuZCIpOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gR2F0aGVyQWxsQWxpYXNlcyAtIFdhbGsgdXAgY2hhaW4gc2tpcHBpbmcgbm9uLWFsaWFzaW5nIG1lbW9yeSBub2RlcywKKy8vLyBsb29raW5nIGZvciBhbGlhc2luZyBub2RlcyBhbmQgYWRkaW5nIHRoZW0gdG8gdGhlIEFsaWFzZXMgdmVjdG9yLgordm9pZCBEQUdDb21iaW5lcjo6R2F0aGVyQWxsQWxpYXNlcyhTRE5vZGUgKk4sIFNEVmFsdWUgT3JpZ2luYWxDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gJkFsaWFzZXMpIHsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gQ2hhaW5zOyAgICAgLy8gTGlzdCBvZiBjaGFpbnMgdG8gdmlzaXQuCisgIFNtYWxsUHRyU2V0PFNETm9kZSAqLCAxNj4gVmlzaXRlZDsgIC8vIFZpc2l0ZWQgbm9kZSBzZXQuCisKKyAgLy8gR2V0IGFsaWFzIGluZm9ybWF0aW9uIGZvciBub2RlLgorICBTRFZhbHVlIFB0cjsKKyAgaW50NjRfdCBTaXplOworICBjb25zdCBWYWx1ZSAqU3JjVmFsdWU7CisgIGludCBTcmNWYWx1ZU9mZnNldDsKKyAgdW5zaWduZWQgU3JjVmFsdWVBbGlnbjsKKyAgYm9vbCBJc0xvYWQgPSBGaW5kQWxpYXNJbmZvKE4sIFB0ciwgU2l6ZSwgU3JjVmFsdWUsIFNyY1ZhbHVlT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY1ZhbHVlQWxpZ24pOworCisgIC8vIFN0YXJ0aW5nIG9mZi4KKyAgQ2hhaW5zLnB1c2hfYmFjayhPcmlnaW5hbENoYWluKTsKKyAgdW5zaWduZWQgRGVwdGggPSAwOworICAKKyAgLy8gTG9vayBhdCBlYWNoIGNoYWluIGFuZCBkZXRlcm1pbmUgaWYgaXQgaXMgYW4gYWxpYXMuICBJZiBzbywgYWRkIGl0IHRvIHRoZQorICAvLyBhbGlhc2VzIGxpc3QuICBJZiBub3QsIHRoZW4gY29udGludWUgdXAgdGhlIGNoYWluIGxvb2tpbmcgZm9yIHRoZSBuZXh0CisgIC8vIGNhbmRpZGF0ZS4KKyAgd2hpbGUgKCFDaGFpbnMuZW1wdHkoKSkgeworICAgIFNEVmFsdWUgQ2hhaW4gPSBDaGFpbnMuYmFjaygpOworICAgIENoYWlucy5wb3BfYmFjaygpOworICAgIAorICAgIC8vIEZvciBUb2tlbkZhY3RvciBub2RlcywgbG9vayBhdCBlYWNoIG9wZXJhbmQgYW5kIG9ubHkgY29udGludWUgdXAgdGhlIAorICAgIC8vIGNoYWluIHVudGlsIHdlIGZpbmQgdHdvIGFsaWFzZXMuICBJZiB3ZSd2ZSBzZWVuIHR3byBhbGlhc2VzLCBhc3N1bWUgd2UnbGwgCisgICAgLy8gZmluZCBtb3JlIGFuZCByZXZlcnQgdG8gb3JpZ2luYWwgY2hhaW4gc2luY2UgdGhlIHhmb3JtIGlzIHVubGlrZWx5IHRvIGJlCisgICAgLy8gcHJvZml0YWJsZS4KKyAgICAvLyAKKyAgICAvLyBGSVhNRTogVGhlIGRlcHRoIGNoZWNrIGNvdWxkIGJlIG1hZGUgdG8gcmV0dXJuIHRoZSBsYXN0IG5vbi1hbGlhc2luZyAKKyAgICAvLyBjaGFpbiB3ZSBmb3VuZCBiZWZvcmUgd2UgaGl0IGEgdG9rZW5mYWN0b3IgcmF0aGVyIHRoYW4gdGhlIG9yaWdpbmFsCisgICAgLy8gY2hhaW4uCisgICAgaWYgKERlcHRoID4gNiB8fCBBbGlhc2VzLnNpemUoKSA9PSAyKSB7CisgICAgICBBbGlhc2VzLmNsZWFyKCk7CisgICAgICBBbGlhc2VzLnB1c2hfYmFjayhPcmlnaW5hbENoYWluKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIERvbid0IGJvdGhlciBpZiB3ZSd2ZSBiZWVuIGJlZm9yZS4KKyAgICBpZiAoIVZpc2l0ZWQuaW5zZXJ0KENoYWluLmdldE5vZGUoKSkpCisgICAgICBjb250aW51ZTsKKworICAgIHN3aXRjaCAoQ2hhaW4uZ2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIElTRDo6RW50cnlUb2tlbjoKKyAgICAgIC8vIEVudHJ5IHRva2VuIGlzIGlkZWFsIGNoYWluIG9wZXJhbmQsIGJ1dCBoYW5kbGVkIGluIEZpbmRCZXR0ZXJDaGFpbi4KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJU0Q6OkxPQUQ6CisgICAgY2FzZSBJU0Q6OlNUT1JFOiB7CisgICAgICAvLyBHZXQgYWxpYXMgaW5mb3JtYXRpb24gZm9yIENoYWluLgorICAgICAgU0RWYWx1ZSBPcFB0cjsKKyAgICAgIGludDY0X3QgT3BTaXplOworICAgICAgY29uc3QgVmFsdWUgKk9wU3JjVmFsdWU7CisgICAgICBpbnQgT3BTcmNWYWx1ZU9mZnNldDsKKyAgICAgIHVuc2lnbmVkIE9wU3JjVmFsdWVBbGlnbjsKKyAgICAgIGJvb2wgSXNPcExvYWQgPSBGaW5kQWxpYXNJbmZvKENoYWluLmdldE5vZGUoKSwgT3BQdHIsIE9wU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wU3JjVmFsdWUsIE9wU3JjVmFsdWVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcFNyY1ZhbHVlQWxpZ24pOworCisgICAgICAvLyBJZiBjaGFpbiBpcyBhbGlhcyB0aGVuIHN0b3AgaGVyZS4KKyAgICAgIGlmICghKElzTG9hZCAmJiBJc09wTG9hZCkgJiYKKyAgICAgICAgICBpc0FsaWFzKFB0ciwgU2l6ZSwgU3JjVmFsdWUsIFNyY1ZhbHVlT2Zmc2V0LCBTcmNWYWx1ZUFsaWduLAorICAgICAgICAgICAgICAgICAgT3BQdHIsIE9wU2l6ZSwgT3BTcmNWYWx1ZSwgT3BTcmNWYWx1ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgIE9wU3JjVmFsdWVBbGlnbikpIHsKKyAgICAgICAgQWxpYXNlcy5wdXNoX2JhY2soQ2hhaW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTG9vayBmdXJ0aGVyIHVwIHRoZSBjaGFpbi4KKyAgICAgICAgQ2hhaW5zLnB1c2hfYmFjayhDaGFpbi5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgKytEZXB0aDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgSVNEOjpUb2tlbkZhY3RvcjoKKyAgICAgIC8vIFdlIGhhdmUgdG8gY2hlY2sgZWFjaCBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIHRva2VuIGZhY3RvciBmb3IgInNtYWxsIgorICAgICAgLy8gdG9rZW4gZmFjdG9ycywgc28gd2UgcXVldWUgdGhlbSB1cC4gIEFkZGluZyB0aGUgb3BlcmFuZHMgdG8gdGhlIHF1ZXVlCisgICAgICAvLyAoc3RhY2spIGluIHJldmVyc2Ugb3JkZXIgbWFpbnRhaW5zIHRoZSBvcmlnaW5hbCBvcmRlciBhbmQgaW5jcmVhc2VzIHRoZQorICAgICAgLy8gbGlrZWxpaG9vZCB0aGF0IGdldE5vZGUgd2lsbCBmaW5kIGEgbWF0Y2hpbmcgdG9rZW4gZmFjdG9yIChDU0UuKQorICAgICAgaWYgKENoYWluLmdldE51bU9wZXJhbmRzKCkgPiAxNikgeworICAgICAgICBBbGlhc2VzLnB1c2hfYmFjayhDaGFpbik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZm9yICh1bnNpZ25lZCBuID0gQ2hhaW4uZ2V0TnVtT3BlcmFuZHMoKTsgbjspCisgICAgICAgIENoYWlucy5wdXNoX2JhY2soQ2hhaW4uZ2V0T3BlcmFuZCgtLW4pKTsKKyAgICAgICsrRGVwdGg7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvLyBGb3IgYWxsIG90aGVyIGluc3RydWN0aW9ucyB3ZSB3aWxsIGp1c3QgaGF2ZSB0byB0YWtlIHdoYXQgd2UgY2FuIGdldC4KKyAgICAgIEFsaWFzZXMucHVzaF9iYWNrKENoYWluKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvLy8gRmluZEJldHRlckNoYWluIC0gV2FsayB1cCBjaGFpbiBza2lwcGluZyBub24tYWxpYXNpbmcgbWVtb3J5IG5vZGVzLCBsb29raW5nCisvLy8gZm9yIGEgYmV0dGVyIGNoYWluIChhbGlhc2luZyBub2RlLikKK1NEVmFsdWUgREFHQ29tYmluZXI6OkZpbmRCZXR0ZXJDaGFpbihTRE5vZGUgKk4sIFNEVmFsdWUgT2xkQ2hhaW4pIHsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gQWxpYXNlczsgIC8vIE9wcyBmb3IgcmVwbGFjaW5nIHRva2VuIGZhY3Rvci4KKworICAvLyBBY2N1bXVsYXRlIGFsbCB0aGUgYWxpYXNlcyB0byB0aGlzIG5vZGUuCisgIEdhdGhlckFsbEFsaWFzZXMoTiwgT2xkQ2hhaW4sIEFsaWFzZXMpOworCisgIGlmIChBbGlhc2VzLnNpemUoKSA9PSAwKSB7CisgICAgLy8gSWYgbm8gb3BlcmFuZHMgdGhlbiBjaGFpbiB0byBlbnRyeSB0b2tlbi4KKyAgICByZXR1cm4gREFHLmdldEVudHJ5Tm9kZSgpOworICB9IGVsc2UgaWYgKEFsaWFzZXMuc2l6ZSgpID09IDEpIHsKKyAgICAvLyBJZiBhIHNpbmdsZSBvcGVyYW5kIHRoZW4gY2hhaW4gdG8gaXQuICBXZSBkb24ndCBuZWVkIHRvIHJldmlzaXQgaXQuCisgICAgcmV0dXJuIEFsaWFzZXNbMF07CisgIH0KKyAgCisgIC8vIENvbnN0cnVjdCBhIGN1c3RvbSB0YWlsb3JlZCB0b2tlbiBmYWN0b3IuCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBOLT5nZXREZWJ1Z0xvYygpLCBNVlQ6Ok90aGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICZBbGlhc2VzWzBdLCBBbGlhc2VzLnNpemUoKSk7Cit9CisKKy8vIFNlbGVjdGlvbkRBRzo6Q29tYmluZSAtIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgZmlsZS4KKy8vCit2b2lkIFNlbGVjdGlvbkRBRzo6Q29tYmluZShDb21iaW5lTGV2ZWwgTGV2ZWwsIEFsaWFzQW5hbHlzaXMgJkFBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgLy8vIHJ1biAtIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgdG8gdGhpcyBjbGFzcy4KKyAgLy8vCisgIERBR0NvbWJpbmVyKCp0aGlzLCBBQSwgT3B0TGV2ZWwpLlJ1bihMZXZlbCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvRnVuY3Rpb25Mb3dlcmluZ0luZm8uY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0Z1bmN0aW9uTG93ZXJpbmdJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDk3ZjExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0Z1bmN0aW9uTG93ZXJpbmdJbmZvLmNwcApAQCAtMCwwICsxLDIxOCBAQAorLy89PT0tLSBGdW5jdGlvbkxvd2VyaW5nSW5mby5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGltcGxlbWVudHMgcm91dGluZXMgZm9yIHRyYW5zbGF0aW5nIGZ1bmN0aW9ucyBmcm9tIExMVk0gSVIgaW50bworLy8gTWFjaGluZSBJUi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImZ1bmN0aW9uLWxvd2VyaW5nLWluZm8iCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0Z1bmN0aW9uTG93ZXJpbmdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RlYnVnSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9BbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gaXNVc2VkT3V0c2lkZU9mRGVmaW5pbmdCbG9jayAtIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgdXNlZCBieQorLy8vIFBISSBub2RlcyBvciBvdXRzaWRlIG9mIHRoZSBiYXNpYyBibG9jayB0aGF0IGRlZmluZXMgaXQsIG9yIHVzZWQgYnkgYQorLy8vIHN3aXRjaCBvciBhdG9taWMgaW5zdHJ1Y3Rpb24sIHdoaWNoIG1heSBleHBhbmQgdG8gbXVsdGlwbGUgYmFzaWMgYmxvY2tzLgorc3RhdGljIGJvb2wgaXNVc2VkT3V0c2lkZU9mRGVmaW5pbmdCbG9jayhjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICBpZiAoSS0+dXNlX2VtcHR5KCkpIHJldHVybiBmYWxzZTsKKyAgaWYgKGlzYTxQSElOb2RlPihJKSkgcmV0dXJuIHRydWU7CisgIGNvbnN0IEJhc2ljQmxvY2sgKkJCID0gSS0+Z2V0UGFyZW50KCk7CisgIGZvciAoVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvciBVSSA9IEktPnVzZV9iZWdpbigpLCBFID0gSS0+dXNlX2VuZCgpOworICAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgY29uc3QgVXNlciAqVSA9ICpVSTsKKyAgICBpZiAoY2FzdDxJbnN0cnVjdGlvbj4oVSktPmdldFBhcmVudCgpICE9IEJCIHx8IGlzYTxQSElOb2RlPihVKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzT25seVVzZWRJbkVudHJ5QmxvY2sgLSBJZiB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IGlzIG9ubHkgdXNlZCBpbiB0aGUKKy8vLyBlbnRyeSBibG9jaywgcmV0dXJuIHRydWUuICBUaGlzIGluY2x1ZGVzIGFyZ3VtZW50cyB1c2VkIGJ5IHN3aXRjaGVzLCBzaW5jZQorLy8vIHRoZSBzd2l0Y2ggbWF5IGV4cGFuZCBpbnRvIG11bHRpcGxlIGJhc2ljIGJsb2Nrcy4KK3N0YXRpYyBib29sIGlzT25seVVzZWRJbkVudHJ5QmxvY2soY29uc3QgQXJndW1lbnQgKkEpIHsKKyAgY29uc3QgQmFzaWNCbG9jayAqRW50cnkgPSBBLT5nZXRQYXJlbnQoKS0+YmVnaW4oKTsKKyAgZm9yIChWYWx1ZTo6Y29uc3RfdXNlX2l0ZXJhdG9yIFVJID0gQS0+dXNlX2JlZ2luKCksIEUgPSBBLT51c2VfZW5kKCk7CisgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgIGNvbnN0IFVzZXIgKlUgPSAqVUk7CisgICAgaWYgKGNhc3Q8SW5zdHJ1Y3Rpb24+KFUpLT5nZXRQYXJlbnQoKSAhPSBFbnRyeSB8fCBpc2E8U3dpdGNoSW5zdD4oVSkpCisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBVc2Ugbm90IGluIGVudHJ5IGJsb2NrLgorICB9CisgIHJldHVybiB0cnVlOworfQorCitGdW5jdGlvbkxvd2VyaW5nSW5mbzo6RnVuY3Rpb25Mb3dlcmluZ0luZm8oY29uc3QgVGFyZ2V0TG93ZXJpbmcgJnRsaSkKKyAgOiBUTEkodGxpKSB7Cit9CisKK3ZvaWQgRnVuY3Rpb25Mb3dlcmluZ0luZm86OnNldChjb25zdCBGdW5jdGlvbiAmZm4sIE1hY2hpbmVGdW5jdGlvbiAmbWYpIHsKKyAgRm4gPSAmZm47CisgIE1GID0gJm1mOworICBSZWdJbmZvID0gJk1GLT5nZXRSZWdJbmZvKCk7CisKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZnVuY3Rpb24gY2FuIHJldHVybiB3aXRob3V0IHNyZXQtZGVtb3Rpb24uCisgIFNtYWxsVmVjdG9yPElTRDo6T3V0cHV0QXJnLCA0PiBPdXRzOworICBHZXRSZXR1cm5JbmZvKEZuLT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgRm4tPmdldEF0dHJpYnV0ZXMoKS5nZXRSZXRBdHRyaWJ1dGVzKCksIE91dHMsIFRMSSk7CisgIENhbkxvd2VyUmV0dXJuID0gVExJLkNhbkxvd2VyUmV0dXJuKEZuLT5nZXRDYWxsaW5nQ29udigpLCBGbi0+aXNWYXJBcmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cywgRm4tPmdldENvbnRleHQoKSk7CisKKyAgLy8gQ3JlYXRlIGEgdnJlZyBmb3IgZWFjaCBhcmd1bWVudCByZWdpc3RlciB0aGF0IGlzIG5vdCBkZWFkIGFuZCBpcyB1c2VkCisgIC8vIG91dHNpZGUgb2YgdGhlIGVudHJ5IGJsb2NrIGZvciB0aGUgZnVuY3Rpb24uCisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2FyZ19pdGVyYXRvciBBSSA9IEZuLT5hcmdfYmVnaW4oKSwgRSA9IEZuLT5hcmdfZW5kKCk7CisgICAgICAgQUkgIT0gRTsgKytBSSkKKyAgICBpZiAoIWlzT25seVVzZWRJbkVudHJ5QmxvY2soQUkpKQorICAgICAgSW5pdGlhbGl6ZVJlZ0ZvclZhbHVlKEFJKTsKKworICAvLyBJbml0aWFsaXplIHRoZSBtYXBwaW5nIG9mIHZhbHVlcyB0byByZWdpc3RlcnMuICBUaGlzIGlzIG9ubHkgc2V0IHVwIGZvcgorICAvLyBpbnN0cnVjdGlvbiB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBibG9jayB0aGF0IGRlZmluZXMKKyAgLy8gdGhlbS4KKyAgRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEJCID0gRm4tPmJlZ2luKCksIEVCID0gRm4tPmVuZCgpOworICBmb3IgKEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKGNvbnN0IEFsbG9jYUluc3QgKkFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oSSkpCisgICAgICBpZiAoY29uc3QgQ29uc3RhbnRJbnQgKkNVSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihBSS0+Z2V0QXJyYXlTaXplKCkpKSB7CisgICAgICAgIGNvbnN0IFR5cGUgKlR5ID0gQUktPmdldEFsbG9jYXRlZFR5cGUoKTsKKyAgICAgICAgdWludDY0X3QgVHlTaXplID0gVExJLmdldFRhcmdldERhdGEoKS0+Z2V0VHlwZUFsbG9jU2l6ZShUeSk7CisgICAgICAgIHVuc2lnbmVkIEFsaWduID0KKyAgICAgICAgICBzdGQ6Om1heCgodW5zaWduZWQpVExJLmdldFRhcmdldERhdGEoKS0+Z2V0UHJlZlR5cGVBbGlnbm1lbnQoVHkpLAorICAgICAgICAgICAgICAgICAgIEFJLT5nZXRBbGlnbm1lbnQoKSk7CisKKyAgICAgICAgVHlTaXplICo9IENVSS0+Z2V0WkV4dFZhbHVlKCk7ICAgLy8gR2V0IHRvdGFsIGFsbG9jYXRlZCBzaXplLgorICAgICAgICBpZiAoVHlTaXplID09IDApIFR5U2l6ZSA9IDE7IC8vIERvbid0IGNyZWF0ZSB6ZXJvLXNpemVkIHN0YWNrIG9iamVjdHMuCisKKyAgICAgICAgLy8gVGhlIG9iamVjdCBtYXkgbmVlZCB0byBiZSBwbGFjZWQgb250byB0aGUgc3RhY2sgbmVhciB0aGUgc3RhY2sKKyAgICAgICAgLy8gcHJvdGVjdG9yIGlmIG9uZSBleGlzdHMuIERldGVybWluZSBoZXJlIGlmIHRoaXMgb2JqZWN0IGlzIGEgc3VpdGFibGUKKyAgICAgICAgLy8gY2FuZGlkYXRlLiBJLmUuLCBpdCB3b3VsZCB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHN0YWNrIHByb3RlY3Rvci4KKyAgICAgICAgYm9vbCBNYXlOZWVkU1AgPQorICAgICAgICAgIChBSS0+aXNBcnJheUFsbG9jYXRpb24oKSB8fAorICAgICAgICAgICAoVHlTaXplID4gOCAmJiBpc2E8QXJyYXlUeXBlPihUeSkgJiYKKyAgICAgICAgICAgIGNhc3Q8QXJyYXlUeXBlPihUeSktPmdldEVsZW1lbnRUeXBlKCktPmlzSW50ZWdlclR5KDgpKSk7CisgICAgICAgIFN0YXRpY0FsbG9jYU1hcFtBSV0gPQorICAgICAgICAgIE1GLT5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlU3RhY2tPYmplY3QoVHlTaXplLCBBbGlnbiwgZmFsc2UsIE1heU5lZWRTUCk7CisgICAgICB9CisKKyAgZm9yICg7IEJCICE9IEVCOyArK0JCKQorICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgLy8gTWFyayB2YWx1ZXMgdXNlZCBvdXRzaWRlIHRoZWlyIGJsb2NrIGFzIGV4cG9ydGVkLCBieSBhbGxvY2F0aW5nCisgICAgICAvLyBhIHZpcnR1YWwgcmVnaXN0ZXIgZm9yIHRoZW0uCisgICAgICBpZiAoaXNVc2VkT3V0c2lkZU9mRGVmaW5pbmdCbG9jayhJKSkKKyAgICAgICAgaWYgKCFpc2E8QWxsb2NhSW5zdD4oSSkgfHwKKyAgICAgICAgICAgICFTdGF0aWNBbGxvY2FNYXAuY291bnQoY2FzdDxBbGxvY2FJbnN0PihJKSkpCisgICAgICAgICAgSW5pdGlhbGl6ZVJlZ0ZvclZhbHVlKEkpOworICAgIH0KKworICAvLyBDcmVhdGUgYW4gaW5pdGlhbCBNYWNoaW5lQmFzaWNCbG9jayBmb3IgZWFjaCBMTFZNIEJhc2ljQmxvY2sgaW4gRi4gIFRoaXMKKyAgLy8gYWxzbyBjcmVhdGVzIHRoZSBpbml0aWFsIFBISSBNYWNoaW5lSW5zdHJzLCB0aG91Z2ggbm9uZSBvZiB0aGUgaW5wdXQKKyAgLy8gb3BlcmFuZHMgYXJlIHBvcHVsYXRlZC4KKyAgZm9yIChCQiA9IEZuLT5iZWdpbigpOyBCQiAhPSBFQjsgKytCQikgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBtZi5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhCQik7CisgICAgTUJCTWFwW0JCXSA9IE1CQjsKKyAgICBNRi0+cHVzaF9iYWNrKE1CQik7CisKKyAgICAvLyBUcmFuc2ZlciB0aGUgYWRkcmVzcy10YWtlbiBmbGFnLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZXJlIGNvdWxkCisgICAgLy8gYmUgbXVsdGlwbGUgTWFjaGluZUJhc2ljQmxvY2tzIGNvcnJlc3BvbmRpbmcgdG8gb25lIEJhc2ljQmxvY2ssIGFuZCBvbmx5CisgICAgLy8gdGhlIGZpcnN0IG9uZSBzaG91bGQgYmUgbWFya2VkLgorICAgIGlmIChCQi0+aGFzQWRkcmVzc1Rha2VuKCkpCisgICAgICBNQkItPnNldEhhc0FkZHJlc3NUYWtlbigpOworCisgICAgLy8gQ3JlYXRlIE1hY2hpbmUgUEhJIG5vZGVzIGZvciBMTFZNIFBISSBub2RlcywgbG93ZXJpbmcgdGhlbSBhcworICAgIC8vIGFwcHJvcHJpYXRlLgorICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpOworICAgICAgICAgY29uc3QgUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJKTsgKytJKSB7CisgICAgICBpZiAoUE4tPnVzZV9lbXB0eSgpKSBjb250aW51ZTsKKworICAgICAgRGVidWdMb2MgREwgPSBQTi0+Z2V0RGVidWdMb2MoKTsKKyAgICAgIHVuc2lnbmVkIFBISVJlZyA9IFZhbHVlTWFwW1BOXTsKKyAgICAgIGFzc2VydChQSElSZWcgJiYgIlBISSBub2RlIGRvZXMgbm90IGhhdmUgYW4gYXNzaWduZWQgdmlydHVhbCByZWdpc3RlciEiKTsKKworICAgICAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWx1ZVZUczsKKyAgICAgIENvbXB1dGVWYWx1ZVZUcyhUTEksIFBOLT5nZXRUeXBlKCksIFZhbHVlVlRzKTsKKyAgICAgIGZvciAodW5zaWduZWQgdnRpID0gMCwgdnRlID0gVmFsdWVWVHMuc2l6ZSgpOyB2dGkgIT0gdnRlOyArK3Z0aSkgeworICAgICAgICBFVlQgVlQgPSBWYWx1ZVZUc1t2dGldOworICAgICAgICB1bnNpZ25lZCBOdW1SZWdpc3RlcnMgPSBUTEkuZ2V0TnVtUmVnaXN0ZXJzKEZuLT5nZXRDb250ZXh0KCksIFZUKTsKKyAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBNRi0+Z2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUmVnaXN0ZXJzOyArK2kpCisgICAgICAgICAgQnVpbGRNSShNQkIsIERMLCBUSUktPmdldChUYXJnZXRPcGNvZGU6OlBISSksIFBISVJlZyArIGkpOworICAgICAgICBQSElSZWcgKz0gTnVtUmVnaXN0ZXJzOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gY2xlYXIgLSBDbGVhciBvdXQgYWxsIHRoZSBmdW5jdGlvbi1zcGVjaWZpYyBzdGF0ZS4gVGhpcyByZXR1cm5zIHRoaXMKKy8vLyBGdW5jdGlvbkxvd2VyaW5nSW5mbyB0byBhbiBlbXB0eSBzdGF0ZSwgcmVhZHkgdG8gYmUgdXNlZCBmb3IgYQorLy8vIGRpZmZlcmVudCBmdW5jdGlvbi4KK3ZvaWQgRnVuY3Rpb25Mb3dlcmluZ0luZm86OmNsZWFyKCkgeworICBhc3NlcnQoQ2F0Y2hJbmZvRm91bmQuc2l6ZSgpID09IENhdGNoSW5mb0xvc3Quc2l6ZSgpICYmCisgICAgICAgICAiTm90IGFsbCBjYXRjaCBpbmZvIHdhcyBhc3NpZ25lZCB0byBhIGxhbmRpbmcgcGFkISIpOworCisgIE1CQk1hcC5jbGVhcigpOworICBWYWx1ZU1hcC5jbGVhcigpOworICBTdGF0aWNBbGxvY2FNYXAuY2xlYXIoKTsKKyNpZm5kZWYgTkRFQlVHCisgIENhdGNoSW5mb0xvc3QuY2xlYXIoKTsKKyAgQ2F0Y2hJbmZvRm91bmQuY2xlYXIoKTsKKyNlbmRpZgorICBMaXZlT3V0UmVnSW5mby5jbGVhcigpOworICBBcmdEYmdWYWx1ZXMuY2xlYXIoKTsKKyAgUmVnRml4dXBzLmNsZWFyKCk7Cit9CisKKy8vLyBDcmVhdGVSZWcgLSBBbGxvY2F0ZSBhIHNpbmdsZSB2aXJ0dWFsIHJlZ2lzdGVyIGZvciB0aGUgZ2l2ZW4gdHlwZS4KK3Vuc2lnbmVkIEZ1bmN0aW9uTG93ZXJpbmdJbmZvOjpDcmVhdGVSZWcoRVZUIFZUKSB7CisgIHJldHVybiBSZWdJbmZvLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoVExJLmdldFJlZ0NsYXNzRm9yKFZUKSk7Cit9CisKKy8vLyBDcmVhdGVSZWdzIC0gQWxsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiB2aXJ0dWFsIHJlZ2lzdGVycyBvZgorLy8vIHRoZSBjb3JyZWN0bHkgcHJvbW90ZWQgb3IgZXhwYW5kZWQgdHlwZXMuICBBc3NpZ24gdGhlc2UgcmVnaXN0ZXJzCisvLy8gY29uc2VjdXRpdmUgdnJlZyBudW1iZXJzIGFuZCByZXR1cm4gdGhlIGZpcnN0IGFzc2lnbmVkIG51bWJlci4KKy8vLworLy8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGhhcyBzdHJ1Y3Qgb3IgYXJyYXkgdHlwZSwgdGhpcyBmdW5jdGlvbgorLy8vIHdpbGwgYXNzaWduIHJlZ2lzdGVycyBmb3IgZWFjaCBtZW1iZXIgb3IgZWxlbWVudC4KKy8vLwordW5zaWduZWQgRnVuY3Rpb25Mb3dlcmluZ0luZm86OkNyZWF0ZVJlZ3MoY29uc3QgVHlwZSAqVHkpIHsKKyAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWx1ZVZUczsKKyAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgVHksIFZhbHVlVlRzKTsKKworICB1bnNpZ25lZCBGaXJzdFJlZyA9IDA7CisgIGZvciAodW5zaWduZWQgVmFsdWUgPSAwLCBlID0gVmFsdWVWVHMuc2l6ZSgpOyBWYWx1ZSAhPSBlOyArK1ZhbHVlKSB7CisgICAgRVZUIFZhbHVlVlQgPSBWYWx1ZVZUc1tWYWx1ZV07CisgICAgRVZUIFJlZ2lzdGVyVlQgPSBUTEkuZ2V0UmVnaXN0ZXJUeXBlKFR5LT5nZXRDb250ZXh0KCksIFZhbHVlVlQpOworCisgICAgdW5zaWduZWQgTnVtUmVncyA9IFRMSS5nZXROdW1SZWdpc3RlcnMoVHktPmdldENvbnRleHQoKSwgVmFsdWVWVCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1SZWdzOyArK2kpIHsKKyAgICAgIHVuc2lnbmVkIFIgPSBDcmVhdGVSZWcoUmVnaXN0ZXJWVCk7CisgICAgICBpZiAoIUZpcnN0UmVnKSBGaXJzdFJlZyA9IFI7CisgICAgfQorICB9CisgIHJldHVybiBGaXJzdFJlZzsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0luc3RyRW1pdHRlci5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvSW5zdHJFbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ2ZjhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0luc3RyRW1pdHRlci5jcHAKQEAgLTAsMCArMSw4MTYgQEAKKy8vPT0tLS0gSW5zdHJFbWl0dGVyLmNwcCAtIEVtaXQgTWFjaGluZUluc3RycyBmb3IgdGhlIFNlbGVjdGlvbkRBRyBjbGFzcyAtLS09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBFbWl0IHJvdXRpbmVzIGZvciB0aGUgU2VsZWN0aW9uREFHIGNsYXNzLCB3aGljaCBjcmVhdGVzCisvLyBNYWNoaW5lSW5zdHJzIGJhc2VkIG9uIHRoZSBkZWNpc2lvbnMgb2YgdGhlIFNlbGVjdGlvbkRBRyBpbnN0cnVjdGlvbgorLy8gc2VsZWN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiaW5zdHItZW1pdHRlciIKKyNpbmNsdWRlICJJbnN0ckVtaXR0ZXIuaCIKKyNpbmNsdWRlICJTRE5vZGVEYmdWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBDb3VudFJlc3VsdHMgLSBUaGUgcmVzdWx0cyBvZiB0YXJnZXQgbm9kZXMgaGF2ZSByZWdpc3RlciBvciBpbW1lZGlhdGUKKy8vLyBvcGVyYW5kcyBmaXJzdCwgdGhlbiBhbiBvcHRpb25hbCBjaGFpbiwgYW5kIG9wdGlvbmFsIGZsYWcgb3BlcmFuZHMgKHdoaWNoIGRvCisvLy8gbm90IGdvIGludG8gdGhlIHJlc3VsdGluZyBNYWNoaW5lSW5zdHIpLgordW5zaWduZWQgSW5zdHJFbWl0dGVyOjpDb3VudFJlc3VsdHMoU0ROb2RlICpOb2RlKSB7CisgIHVuc2lnbmVkIE4gPSBOb2RlLT5nZXROdW1WYWx1ZXMoKTsKKyAgd2hpbGUgKE4gJiYgTm9kZS0+Z2V0VmFsdWVUeXBlKE4gLSAxKSA9PSBNVlQ6OkZsYWcpCisgICAgLS1OOworICBpZiAoTiAmJiBOb2RlLT5nZXRWYWx1ZVR5cGUoTiAtIDEpID09IE1WVDo6T3RoZXIpCisgICAgLS1OOyAgICAvLyBTa2lwIG92ZXIgY2hhaW4gcmVzdWx0LgorICByZXR1cm4gTjsKK30KKworLy8vIENvdW50T3BlcmFuZHMgLSBUaGUgaW5wdXRzIHRvIHRhcmdldCBub2RlcyBoYXZlIGFueSBhY3R1YWwgaW5wdXRzIGZpcnN0LAorLy8vIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGNoYWluIG9wZXJhbmQsIHRoZW4gYW4gb3B0aW9uYWwgZmxhZyBvcGVyYW5kLgorLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBhY3R1YWwgb3BlcmFuZHMgdGhhdCB3aWxsIGdvIGludG8gdGhlIHJlc3VsdGluZworLy8vIE1hY2hpbmVJbnN0ci4KK3Vuc2lnbmVkIEluc3RyRW1pdHRlcjo6Q291bnRPcGVyYW5kcyhTRE5vZGUgKk5vZGUpIHsKKyAgdW5zaWduZWQgTiA9IE5vZGUtPmdldE51bU9wZXJhbmRzKCk7CisgIHdoaWxlIChOICYmIE5vZGUtPmdldE9wZXJhbmQoTiAtIDEpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6RmxhZykKKyAgICAtLU47CisgIGlmIChOICYmIE5vZGUtPmdldE9wZXJhbmQoTiAtIDEpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6T3RoZXIpCisgICAgLS1OOyAvLyBJZ25vcmUgY2hhaW4gaWYgaXQgZXhpc3RzLgorICByZXR1cm4gTjsKK30KKworLy8vIEVtaXRDb3B5RnJvbVJlZyAtIEdlbmVyYXRlIG1hY2hpbmUgY29kZSBmb3IgYW4gQ29weUZyb21SZWcgbm9kZSBvciBhbgorLy8vIGltcGxpY2l0IHBoeXNpY2FsIHJlZ2lzdGVyIG91dHB1dC4KK3ZvaWQgSW5zdHJFbWl0dGVyOjoKK0VtaXRDb3B5RnJvbVJlZyhTRE5vZGUgKk5vZGUsIHVuc2lnbmVkIFJlc05vLCBib29sIElzQ2xvbmUsIGJvb2wgSXNDbG9uZWQsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD4gJlZSQmFzZU1hcCkgeworICB1bnNpZ25lZCBWUkJhc2UgPSAwOworICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihTcmNSZWcpKSB7CisgICAgLy8gSnVzdCB1c2UgdGhlIGlucHV0IHJlZ2lzdGVyIGRpcmVjdGx5IQorICAgIFNEVmFsdWUgT3AoTm9kZSwgUmVzTm8pOworICAgIGlmIChJc0Nsb25lKQorICAgICAgVlJCYXNlTWFwLmVyYXNlKE9wKTsKKyAgICBib29sIGlzTmV3ID0gVlJCYXNlTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihPcCwgU3JjUmVnKSkuc2Vjb25kOworICAgIGlzTmV3ID0gaXNOZXc7IC8vIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZy4KKyAgICBhc3NlcnQoaXNOZXcgJiYgIk5vZGUgZW1pdHRlZCBvdXQgb2Ygb3JkZXIgLSBlYXJseSIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmIHRoZSBub2RlIGlzIG9ubHkgdXNlZCBieSBhIENvcHlUb1JlZyBhbmQgdGhlIGRlc3QgcmVnIGlzIGEgdnJlZywgdXNlCisgIC8vIHRoZSBDb3B5VG9SZWcnZCBkZXN0aW5hdGlvbiByZWdpc3RlciBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IHZyZWcuCisgIGJvb2wgTWF0Y2hSZWcgPSB0cnVlOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpVc2VSQyA9IE5VTEw7CisgIGlmICghSXNDbG9uZSAmJiAhSXNDbG9uZWQpCisgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IE5vZGUtPnVzZV9iZWdpbigpLCBFID0gTm9kZS0+dXNlX2VuZCgpOworICAgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgICAgU0ROb2RlICpVc2VyID0gKlVJOworICAgICAgYm9vbCBNYXRjaCA9IHRydWU7CisgICAgICBpZiAoVXNlci0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb3B5VG9SZWcgJiYgCisgICAgICAgICAgVXNlci0+Z2V0T3BlcmFuZCgyKS5nZXROb2RlKCkgPT0gTm9kZSAmJgorICAgICAgICAgIFVzZXItPmdldE9wZXJhbmQoMikuZ2V0UmVzTm8oKSA9PSBSZXNObykgeworICAgICAgICB1bnNpZ25lZCBEZXN0UmVnID0gY2FzdDxSZWdpc3RlclNETm9kZT4oVXNlci0+Z2V0T3BlcmFuZCgxKSktPmdldFJlZygpOworICAgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihEZXN0UmVnKSkgeworICAgICAgICAgIFZSQmFzZSA9IERlc3RSZWc7CisgICAgICAgICAgTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChEZXN0UmVnICE9IFNyY1JlZykKKyAgICAgICAgICBNYXRjaCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFVzZXItPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgU0RWYWx1ZSBPcCA9IFVzZXItPmdldE9wZXJhbmQoaSk7CisgICAgICAgICAgaWYgKE9wLmdldE5vZGUoKSAhPSBOb2RlIHx8IE9wLmdldFJlc05vKCkgIT0gUmVzTm8pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBFVlQgVlQgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoT3AuZ2V0UmVzTm8oKSk7CisgICAgICAgICAgaWYgKFZUID09IE1WVDo6T3RoZXIgfHwgVlQgPT0gTVZUOjpGbGFnKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICBpZiAoVXNlci0+aXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmSUkgPSBUSUktPmdldChVc2VyLT5nZXRNYWNoaW5lT3Bjb2RlKCkpOworICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSAwOworICAgICAgICAgICAgaWYgKGkrSUkuZ2V0TnVtRGVmcygpIDwgSUkuZ2V0TnVtT3BlcmFuZHMoKSkKKyAgICAgICAgICAgICAgUkMgPSBJSS5PcEluZm9baStJSS5nZXROdW1EZWZzKCldLmdldFJlZ0NsYXNzKFRSSSk7CisgICAgICAgICAgICBpZiAoIVVzZVJDKQorICAgICAgICAgICAgICBVc2VSQyA9IFJDOworICAgICAgICAgICAgZWxzZSBpZiAoUkMpIHsKKyAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQ29tUkMgPSBnZXRDb21tb25TdWJDbGFzcyhVc2VSQywgUkMpOworICAgICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSB1c2VzIGV4cGVjdCBkaXNqb2ludCByZWdpc3RlciBjbGFzc2VzLCB3ZSBlbWl0CisgICAgICAgICAgICAgIC8vIGNvcGllcyBpbiBBZGRSZWdpc3Rlck9wZXJhbmQuCisgICAgICAgICAgICAgIGlmIChDb21SQykKKyAgICAgICAgICAgICAgICBVc2VSQyA9IENvbVJDOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgTWF0Y2hSZWcgJj0gTWF0Y2g7CisgICAgICBpZiAoVlJCYXNlKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgRVZUIFZUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKFJlc05vKTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqU3JjUkMgPSAwLCAqRHN0UkMgPSAwOworICBTcmNSQyA9IFRSSS0+Z2V0TWluaW1hbFBoeXNSZWdDbGFzcyhTcmNSZWcsIFZUKTsKKyAgCisgIC8vIEZpZ3VyZSBvdXQgdGhlIHJlZ2lzdGVyIGNsYXNzIHRvIGNyZWF0ZSBmb3IgdGhlIGRlc3RyZWcuCisgIGlmIChWUkJhc2UpIHsKKyAgICBEc3RSQyA9IE1SSS0+Z2V0UmVnQ2xhc3MoVlJCYXNlKTsKKyAgfSBlbHNlIGlmIChVc2VSQykgeworICAgIGFzc2VydChVc2VSQy0+aGFzVHlwZShWVCkgJiYgIkluY29tcGF0aWJsZSBwaHlzIHJlZ2lzdGVyIGRlZiBhbmQgdXNlcyEiKTsKKyAgICBEc3RSQyA9IFVzZVJDOworICB9IGVsc2UgeworICAgIERzdFJDID0gVExJLT5nZXRSZWdDbGFzc0ZvcihWVCk7CisgIH0KKyAgICAKKyAgLy8gSWYgYWxsIHVzZXMgYXJlIHJlYWRpbmcgZnJvbSB0aGUgc3JjIHBoeXNpY2FsIHJlZ2lzdGVyIGFuZCBjb3B5aW5nIHRoZQorICAvLyByZWdpc3RlciBpcyBlaXRoZXIgaW1wb3NzaWJsZSBvciB2ZXJ5IGV4cGVuc2l2ZSwgdGhlbiBkb24ndCBjcmVhdGUgYSBjb3B5LgorICBpZiAoTWF0Y2hSZWcgJiYgU3JjUkMtPmdldENvcHlDb3N0KCkgPCAwKSB7CisgICAgVlJCYXNlID0gU3JjUmVnOworICB9IGVsc2UgeworICAgIC8vIENyZWF0ZSB0aGUgcmVnLCBlbWl0IHRoZSBjb3B5LgorICAgIFZSQmFzZSA9IE1SSS0+Y3JlYXRlVmlydHVhbFJlZ2lzdGVyKERzdFJDKTsKKyAgICBCdWlsZE1JKCpNQkIsIEluc2VydFBvcywgTm9kZS0+Z2V0RGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICAgICAgICAgIFZSQmFzZSkuYWRkUmVnKFNyY1JlZyk7CisgIH0KKworICBTRFZhbHVlIE9wKE5vZGUsIFJlc05vKTsKKyAgaWYgKElzQ2xvbmUpCisgICAgVlJCYXNlTWFwLmVyYXNlKE9wKTsKKyAgYm9vbCBpc05ldyA9IFZSQmFzZU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoT3AsIFZSQmFzZSkpLnNlY29uZDsKKyAgaXNOZXcgPSBpc05ldzsgLy8gU2lsZW5jZSBjb21waWxlciB3YXJuaW5nLgorICBhc3NlcnQoaXNOZXcgJiYgIk5vZGUgZW1pdHRlZCBvdXQgb2Ygb3JkZXIgLSBlYXJseSIpOworfQorCisvLy8gZ2V0RHN0T2ZDb3B5VG9SZWdVc2UgLSBJZiB0aGUgb25seSB1c2Ugb2YgdGhlIHNwZWNpZmllZCByZXN1bHQgbnVtYmVyIG9mCisvLy8gbm9kZSBpcyBhIENvcHlUb1JlZywgcmV0dXJuIGl0cyBkZXN0aW5hdGlvbiByZWdpc3Rlci4gUmV0dXJuIDAgb3RoZXJ3aXNlLgordW5zaWduZWQgSW5zdHJFbWl0dGVyOjpnZXREc3RPZk9ubHlDb3B5VG9SZWdVc2UoU0ROb2RlICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVzTm8pIGNvbnN0IHsKKyAgaWYgKCFOb2RlLT5oYXNPbmVVc2UoKSkKKyAgICByZXR1cm4gMDsKKworICBTRE5vZGUgKlVzZXIgPSAqTm9kZS0+dXNlX2JlZ2luKCk7CisgIGlmIChVc2VyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlUb1JlZyAmJiAKKyAgICAgIFVzZXItPmdldE9wZXJhbmQoMikuZ2V0Tm9kZSgpID09IE5vZGUgJiYKKyAgICAgIFVzZXItPmdldE9wZXJhbmQoMikuZ2V0UmVzTm8oKSA9PSBSZXNObykgeworICAgIHVuc2lnbmVkIFJlZyA9IGNhc3Q8UmVnaXN0ZXJTRE5vZGU+KFVzZXItPmdldE9wZXJhbmQoMSkpLT5nZXRSZWcoKTsKKyAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWcpKQorICAgICAgcmV0dXJuIFJlZzsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBJbnN0ckVtaXR0ZXI6OkNyZWF0ZVZpcnR1YWxSZWdpc3RlcnMoU0ROb2RlICpOb2RlLCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDbG9uZSwgYm9vbCBJc0Nsb25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwKSB7CisgIGFzc2VydChOb2RlLT5nZXRNYWNoaW5lT3Bjb2RlKCkgIT0gVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYgJiYKKyAgICAgICAgICJJTVBMSUNJVF9ERUYgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlIGVsc2V3aGVyZSEiKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgSUkuZ2V0TnVtRGVmcygpOyArK2kpIHsKKyAgICAvLyBJZiB0aGUgc3BlY2lmaWMgbm9kZSB2YWx1ZSBpcyBvbmx5IHVzZWQgYnkgYSBDb3B5VG9SZWcgYW5kIHRoZSBkZXN0IHJlZworICAgIC8vIGlzIGEgdnJlZyBpbiB0aGUgc2FtZSByZWdpc3RlciBjbGFzcywgdXNlIHRoZSBDb3B5VG9SZWcnZCBkZXN0aW5hdGlvbgorICAgIC8vIHJlZ2lzdGVyIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgdnJlZy4KKyAgICB1bnNpZ25lZCBWUkJhc2UgPSAwOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gSUkuT3BJbmZvW2ldLmdldFJlZ0NsYXNzKFRSSSk7CisgICAgaWYgKElJLk9wSW5mb1tpXS5pc09wdGlvbmFsRGVmKCkpIHsKKyAgICAgIC8vIE9wdGlvbmFsIGRlZiBtdXN0IGJlIGEgcGh5c2ljYWwgcmVnaXN0ZXIuCisgICAgICB1bnNpZ25lZCBOdW1SZXN1bHRzID0gQ291bnRSZXN1bHRzKE5vZGUpOworICAgICAgVlJCYXNlID0gY2FzdDxSZWdpc3RlclNETm9kZT4oTm9kZS0+Z2V0T3BlcmFuZChpLU51bVJlc3VsdHMpKS0+Z2V0UmVnKCk7CisgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoVlJCYXNlKSk7CisgICAgICBNSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKFZSQmFzZSwgdHJ1ZSkpOworICAgIH0KKworICAgIGlmICghVlJCYXNlICYmICFJc0Nsb25lICYmICFJc0Nsb25lZCkKKyAgICAgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBOb2RlLT51c2VfYmVnaW4oKSwgRSA9IE5vZGUtPnVzZV9lbmQoKTsKKyAgICAgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgICAgICBTRE5vZGUgKlVzZXIgPSAqVUk7CisgICAgICAgIGlmIChVc2VyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlUb1JlZyAmJiAKKyAgICAgICAgICAgIFVzZXItPmdldE9wZXJhbmQoMikuZ2V0Tm9kZSgpID09IE5vZGUgJiYKKyAgICAgICAgICAgIFVzZXItPmdldE9wZXJhbmQoMikuZ2V0UmVzTm8oKSA9PSBpKSB7CisgICAgICAgICAgdW5zaWduZWQgUmVnID0gY2FzdDxSZWdpc3RlclNETm9kZT4oVXNlci0+Z2V0T3BlcmFuZCgxKSktPmdldFJlZygpOworICAgICAgICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZykpIHsKKyAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlZ1JDID0gTVJJLT5nZXRSZWdDbGFzcyhSZWcpOworICAgICAgICAgICAgaWYgKFJlZ1JDID09IFJDKSB7CisgICAgICAgICAgICAgIFZSQmFzZSA9IFJlZzsKKyAgICAgICAgICAgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhSZWcsIHRydWUpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIHJlc3VsdCByZWdpc3RlcnMgZm9yIHRoaXMgbm9kZSBhbmQgYWRkIHRoZSByZXN1bHQgcmVncyB0bworICAgIC8vIHRoZSBtYWNoaW5lIGluc3RydWN0aW9uLgorICAgIGlmIChWUkJhc2UgPT0gMCkgeworICAgICAgYXNzZXJ0KFJDICYmICJJc24ndCBhIHJlZ2lzdGVyIG9wZXJhbmQhIik7CisgICAgICBWUkJhc2UgPSBNUkktPmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgICAgICBNSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKFZSQmFzZSwgdHJ1ZSkpOworICAgIH0KKworICAgIFNEVmFsdWUgT3AoTm9kZSwgaSk7CisgICAgaWYgKElzQ2xvbmUpCisgICAgICBWUkJhc2VNYXAuZXJhc2UoT3ApOworICAgIGJvb2wgaXNOZXcgPSBWUkJhc2VNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE9wLCBWUkJhc2UpKS5zZWNvbmQ7CisgICAgaXNOZXcgPSBpc05ldzsgLy8gU2lsZW5jZSBjb21waWxlciB3YXJuaW5nLgorICAgIGFzc2VydChpc05ldyAmJiAiTm9kZSBlbWl0dGVkIG91dCBvZiBvcmRlciAtIGVhcmx5Iik7CisgIH0KK30KKworLy8vIGdldFZSIC0gUmV0dXJuIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCByZXN1bHQKKy8vLyBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCit1bnNpZ25lZCBJbnN0ckVtaXR0ZXI6OmdldFZSKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwKSB7CisgIGlmIChPcC5pc01hY2hpbmVPcGNvZGUoKSAmJgorICAgICAgT3AuZ2V0TWFjaGluZU9wY29kZSgpID09IFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGKSB7CisgICAgLy8gQWRkIGFuIElNUExJQ0lUX0RFRiBpbnN0cnVjdGlvbiBiZWZvcmUgZXZlcnkgdXNlLgorICAgIHVuc2lnbmVkIFZSZWcgPSBnZXREc3RPZk9ubHlDb3B5VG9SZWdVc2UoT3AuZ2V0Tm9kZSgpLCBPcC5nZXRSZXNObygpKTsKKyAgICAvLyBJTVBMSUNJVF9ERUYgY2FuIHByb2R1Y2UgYW55IHR5cGUgb2YgcmVzdWx0IHNvIGl0cyBUYXJnZXRJbnN0ckRlc2MKKyAgICAvLyBkb2VzIG5vdCBpbmNsdWRlIG9wZXJhbmQgcmVnaXN0ZXIgY2xhc3MgaW5mby4KKyAgICBpZiAoIVZSZWcpIHsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gVExJLT5nZXRSZWdDbGFzc0ZvcihPcC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICBWUmVnID0gTVJJLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgIH0KKyAgICBCdWlsZE1JKCpNQkIsIEluc2VydFBvcywgT3AuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGKSwgVlJlZyk7CisgICAgcmV0dXJuIFZSZWc7CisgIH0KKworICBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD46Oml0ZXJhdG9yIEkgPSBWUkJhc2VNYXAuZmluZChPcCk7CisgIGFzc2VydChJICE9IFZSQmFzZU1hcC5lbmQoKSAmJiAiTm9kZSBlbWl0dGVkIG91dCBvZiBvcmRlciAtIGxhdGUiKTsKKyAgcmV0dXJuIEktPnNlY29uZDsKK30KKworCisvLy8gQWRkUmVnaXN0ZXJPcGVyYW5kIC0gQWRkIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgYXMgYW4gb3BlcmFuZCB0byB0aGUKKy8vLyBzcGVjaWZpZWQgbWFjaGluZSBpbnN0ci4gSW5zZXJ0IHJlZ2lzdGVyIGNvcGllcyBpZiB0aGUgcmVnaXN0ZXIgaXMKKy8vLyBub3QgaW4gdGhlIHJlcXVpcmVkIHJlZ2lzdGVyIGNsYXNzLgordm9pZAorSW5zdHJFbWl0dGVyOjpBZGRSZWdpc3Rlck9wZXJhbmQoTWFjaGluZUluc3RyICpNSSwgU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElJT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgKklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8U0RWYWx1ZSwgdW5zaWduZWQ+ICZWUkJhc2VNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRGVidWcsIGJvb2wgSXNDbG9uZSwgYm9vbCBJc0Nsb25lZCkgeworICBhc3NlcnQoT3AuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjpPdGhlciAmJgorICAgICAgICAgT3AuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjpGbGFnICYmCisgICAgICAgICAiQ2hhaW4gYW5kIGZsYWcgb3BlcmFuZHMgc2hvdWxkIG9jY3VyIGF0IGVuZCBvZiBvcGVyYW5kIGxpc3QhIik7CisgIC8vIEdldC9lbWl0IHRoZSBvcGVyYW5kLgorICB1bnNpZ25lZCBWUmVnID0gZ2V0VlIoT3AsIFZSQmFzZU1hcCk7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFZSZWcpICYmICJOb3QgYSB2cmVnPyIpOworCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUktPmdldERlc2MoKTsKKyAgYm9vbCBpc09wdERlZiA9IElJT3BOdW0gPCBUSUQuZ2V0TnVtT3BlcmFuZHMoKSAmJgorICAgIFRJRC5PcEluZm9bSUlPcE51bV0uaXNPcHRpb25hbERlZigpOworCisgIC8vIElmIHRoZSBpbnN0cnVjdGlvbiByZXF1aXJlcyBhIHJlZ2lzdGVyIGluIGEgZGlmZmVyZW50IGNsYXNzLCBjcmVhdGUKKyAgLy8gYSBuZXcgdmlydHVhbCByZWdpc3RlciBhbmQgY29weSB0aGUgdmFsdWUgaW50byBpdC4KKyAgaWYgKElJKSB7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqU3JjUkMgPSBNUkktPmdldFJlZ0NsYXNzKFZSZWcpOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkRzdFJDID0gMDsKKyAgICBpZiAoSUlPcE51bSA8IElJLT5nZXROdW1PcGVyYW5kcygpKQorICAgICAgRHN0UkMgPSBJSS0+T3BJbmZvW0lJT3BOdW1dLmdldFJlZ0NsYXNzKFRSSSk7CisgICAgYXNzZXJ0KChEc3RSQyB8fCAoVElELmlzVmFyaWFkaWMoKSAmJiBJSU9wTnVtID49IFRJRC5nZXROdW1PcGVyYW5kcygpKSkgJiYKKyAgICAgICAgICAgIkRvbid0IGhhdmUgb3BlcmFuZCBpbmZvIGZvciB0aGlzIGluc3RydWN0aW9uISIpOworICAgIGlmIChEc3RSQyAmJiBTcmNSQyAhPSBEc3RSQyAmJiAhU3JjUkMtPmhhc1N1cGVyQ2xhc3MoRHN0UkMpKSB7CisgICAgICB1bnNpZ25lZCBOZXdWUmVnID0gTVJJLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoRHN0UkMpOworICAgICAgQnVpbGRNSSgqTUJCLCBJbnNlcnRQb3MsIE9wLmdldE5vZGUoKS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgTmV3VlJlZykuYWRkUmVnKFZSZWcpOworICAgICAgVlJlZyA9IE5ld1ZSZWc7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhpcyB2YWx1ZSBoYXMgb25seSBvbmUgdXNlLCB0aGF0IHVzZSBpcyBhIGtpbGwuIFRoaXMgaXMgYQorICAvLyBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbi4gSW5zdHJFbWl0dGVyIGRvZXMgdHJpdmlhbCBjb2FsZXNjaW5nCisgIC8vIHdpdGggQ29weUZyb21SZWcgbm9kZXMsIHNvIGRvbid0IGVtaXQga2lsbCBmbGFncyBmb3IgdGhlbS4KKyAgLy8gQXZvaWQga2lsbCBmbGFncyBvbiBTY2hlZHVsZSBjbG9uZWQgbm9kZXMsIHNpbmNlIHRoZXJlIHdpbGwgYmUKKyAgLy8gbXVsdGlwbGUgdXNlcy4KKyAgLy8gVGllZCBvcGVyYW5kcyBhcmUgbmV2ZXIga2lsbGVkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQuIEFuZCB0aGF0CisgIC8vIG1lYW5zIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBvZiB0aGUgb3BlcmFuZC4KKyAgYm9vbCBpc0tpbGwgPSBPcC5oYXNPbmVVc2UoKSAmJgorICAgICAgICAgICAgICAgIE9wLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpDb3B5RnJvbVJlZyAmJgorICAgICAgICAgICAgICAgICFJc0RlYnVnICYmCisgICAgICAgICAgICAgICAgIShJc0Nsb25lIHx8IElzQ2xvbmVkKTsKKyAgaWYgKGlzS2lsbCkgeworICAgIHVuc2lnbmVkIElkeCA9IE1JLT5nZXROdW1PcGVyYW5kcygpOworICAgIHdoaWxlIChJZHggPiAwICYmCisgICAgICAgICAgIE1JLT5nZXRPcGVyYW5kKElkeC0xKS5pc1JlZygpICYmIE1JLT5nZXRPcGVyYW5kKElkeC0xKS5pc0ltcGxpY2l0KCkpCisgICAgICAtLUlkeDsKKyAgICBib29sIGlzVGllZCA9IE1JLT5nZXREZXNjKCkuZ2V0T3BlcmFuZENvbnN0cmFpbnQoSWR4LCBUT0k6OlRJRURfVE8pICE9IC0xOworICAgIGlmIChpc1RpZWQpCisgICAgICBpc0tpbGwgPSBmYWxzZTsKKyAgfQorCisgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWcoVlJlZywgaXNPcHREZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UvKmlzSW1wKi8sIGlzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZS8qaXNEZWFkKi8sIGZhbHNlLyppc1VuZGVmKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UvKmlzRWFybHlDbG9iYmVyKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC8qU3ViUmVnKi8sIElzRGVidWcpKTsKK30KKworLy8vIEFkZE9wZXJhbmQgLSBBZGQgdGhlIHNwZWNpZmllZCBvcGVyYW5kIHRvIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0ci4gIElJCisvLy8gc3BlY2lmaWVzIHRoZSBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG5vZGUsIGFuZCBJSU9wTnVtIGlzIHRoZQorLy8vIG9wZXJhbmQgbnVtYmVyIChpbiB0aGUgSUkpIHRoYXQgd2UgYXJlIGFkZGluZy4gSUlPcE51bSBhbmQgSUkgYXJlIHVzZWQgZm9yIAorLy8vIGFzc2VydGlvbnMgb25seS4KK3ZvaWQgSW5zdHJFbWl0dGVyOjpBZGRPcGVyYW5kKE1hY2hpbmVJbnN0ciAqTUksIFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJSU9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICpJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0RlYnVnLCBib29sIElzQ2xvbmUsIGJvb2wgSXNDbG9uZWQpIHsKKyAgaWYgKE9wLmlzTWFjaGluZU9wY29kZSgpKSB7CisgICAgQWRkUmVnaXN0ZXJPcGVyYW5kKE1JLCBPcCwgSUlPcE51bSwgSUksIFZSQmFzZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgSXNEZWJ1ZywgSXNDbG9uZSwgSXNDbG9uZWQpOworICB9IGVsc2UgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wKSkgeworICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVJbW0oQy0+Z2V0U0V4dFZhbHVlKCkpKTsKKyAgfSBlbHNlIGlmIChDb25zdGFudEZQU0ROb2RlICpGID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oT3ApKSB7CisgICAgY29uc3QgQ29uc3RhbnRGUCAqQ0ZQID0gRi0+Z2V0Q29uc3RhbnRGUFZhbHVlKCk7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUZQSW1tKENGUCkpOworICB9IGVsc2UgaWYgKFJlZ2lzdGVyU0ROb2RlICpSID0gZHluX2Nhc3Q8UmVnaXN0ZXJTRE5vZGU+KE9wKSkgeworICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWcoUi0+Z2V0UmVnKCksIGZhbHNlKSk7CisgIH0gZWxzZSBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqVEdBID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oT3ApKSB7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUdBKFRHQS0+Z2V0R2xvYmFsKCksIFRHQS0+Z2V0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRHQS0+Z2V0VGFyZ2V0RmxhZ3MoKSkpOworICB9IGVsc2UgaWYgKEJhc2ljQmxvY2tTRE5vZGUgKkJCTm9kZSA9IGR5bl9jYXN0PEJhc2ljQmxvY2tTRE5vZGU+KE9wKSkgeworICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVNQkIoQkJOb2RlLT5nZXRCYXNpY0Jsb2NrKCkpKTsKKyAgfSBlbHNlIGlmIChGcmFtZUluZGV4U0ROb2RlICpGSSA9IGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KE9wKSkgeworICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVGSShGSS0+Z2V0SW5kZXgoKSkpOworICB9IGVsc2UgaWYgKEp1bXBUYWJsZVNETm9kZSAqSlQgPSBkeW5fY2FzdDxKdW1wVGFibGVTRE5vZGU+KE9wKSkgeworICAgIE1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVKVEkoSlQtPmdldEluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKVC0+Z2V0VGFyZ2V0RmxhZ3MoKSkpOworICB9IGVsc2UgaWYgKENvbnN0YW50UG9vbFNETm9kZSAqQ1AgPSBkeW5fY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KE9wKSkgeworICAgIGludCBPZmZzZXQgPSBDUC0+Z2V0T2Zmc2V0KCk7CisgICAgdW5zaWduZWQgQWxpZ24gPSBDUC0+Z2V0QWxpZ25tZW50KCk7CisgICAgY29uc3QgVHlwZSAqVHlwZSA9IENQLT5nZXRUeXBlKCk7CisgICAgLy8gTWFjaGluZUNvbnN0YW50UG9vbCB3YW50cyBhbiBleHBsaWNpdCBhbGlnbm1lbnQuCisgICAgaWYgKEFsaWduID09IDApIHsKKyAgICAgIEFsaWduID0gVE0tPmdldFRhcmdldERhdGEoKS0+Z2V0UHJlZlR5cGVBbGlnbm1lbnQoVHlwZSk7CisgICAgICBpZiAoQWxpZ24gPT0gMCkgeworICAgICAgICAvLyBBbGlnbm1lbnQgb2YgdmVjdG9yIHR5cGVzLiAgRklYTUUhCisgICAgICAgIEFsaWduID0gVE0tPmdldFRhcmdldERhdGEoKS0+Z2V0VHlwZUFsbG9jU2l6ZShUeXBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgSWR4OworICAgIE1hY2hpbmVDb25zdGFudFBvb2wgKk1DUCA9IE1GLT5nZXRDb25zdGFudFBvb2woKTsKKyAgICBpZiAoQ1AtPmlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkpCisgICAgICBJZHggPSBNQ1AtPmdldENvbnN0YW50UG9vbEluZGV4KENQLT5nZXRNYWNoaW5lQ1BWYWwoKSwgQWxpZ24pOworICAgIGVsc2UKKyAgICAgIElkeCA9IE1DUC0+Z2V0Q29uc3RhbnRQb29sSW5kZXgoQ1AtPmdldENvbnN0VmFsKCksIEFsaWduKTsKKyAgICBNSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlQ1BJKElkeCwgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1AtPmdldFRhcmdldEZsYWdzKCkpKTsKKyAgfSBlbHNlIGlmIChFeHRlcm5hbFN5bWJvbFNETm9kZSAqRVMgPSBkeW5fY2FzdDxFeHRlcm5hbFN5bWJvbFNETm9kZT4oT3ApKSB7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUVTKEVTLT5nZXRTeW1ib2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVMtPmdldFRhcmdldEZsYWdzKCkpKTsKKyAgfSBlbHNlIGlmIChCbG9ja0FkZHJlc3NTRE5vZGUgKkJBID0gZHluX2Nhc3Q8QmxvY2tBZGRyZXNzU0ROb2RlPihPcCkpIHsKKyAgICBNSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlQkEoQkEtPmdldEJsb2NrQWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQS0+Z2V0VGFyZ2V0RmxhZ3MoKSkpOworICB9IGVsc2UgeworICAgIGFzc2VydChPcC5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6Ok90aGVyICYmCisgICAgICAgICAgIE9wLmdldFZhbHVlVHlwZSgpICE9IE1WVDo6RmxhZyAmJgorICAgICAgICAgICAiQ2hhaW4gYW5kIGZsYWcgb3BlcmFuZHMgc2hvdWxkIG9jY3VyIGF0IGVuZCBvZiBvcGVyYW5kIGxpc3QhIik7CisgICAgQWRkUmVnaXN0ZXJPcGVyYW5kKE1JLCBPcCwgSUlPcE51bSwgSUksIFZSQmFzZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgSXNEZWJ1ZywgSXNDbG9uZSwgSXNDbG9uZWQpOworICB9Cit9CisKKy8vLyBnZXRTdXBlclJlZ2lzdGVyUmVnQ2xhc3MgLSBSZXR1cm5zIHRoZSByZWdpc3RlciBjbGFzcyBvZiBhIHN1cGVycmVnIEEgd2hvc2UKKy8vLyAiU3ViSWR4Iid0aCBzdWItcmVnaXN0ZXIgY2xhc3MgaXMgdGhlIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcyBhbmQgd2hvc2UKKy8vLyB0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCB0eXBlLgorc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqCitnZXRTdXBlclJlZ2lzdGVyUmVnQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqVFJDLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YklkeCwgRVZUIFZUKSB7CisgIC8vIFBpY2sgdGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSBzdXBlcmVnaXN0ZXIgZm9yIHRoaXMgdHlwZQorICBmb3IgKFRhcmdldFJlZ2lzdGVySW5mbzo6cmVnY2xhc3NfaXRlcmF0b3IgSSA9IFRSQy0+c3VwZXJyZWdjbGFzc2VzX2JlZ2luKCksCisgICAgICAgICBFID0gVFJDLT5zdXBlcnJlZ2NsYXNzZXNfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmICgoKkkpLT5oYXNUeXBlKFZUKSAmJiAoKkkpLT5nZXRTdWJSZWdpc3RlclJlZ0NsYXNzKFN1YklkeCkgPT0gVFJDKQorICAgICAgcmV0dXJuICpJOworICBhc3NlcnQoZmFsc2UgJiYgIkNvdWxkbid0IGZpbmQgdGhlIHJlZ2lzdGVyIGNsYXNzIik7CisgIHJldHVybiAwOworfQorCisvLy8gRW1pdFN1YnJlZ05vZGUgLSBHZW5lcmF0ZSBtYWNoaW5lIGNvZGUgZm9yIHN1YnJlZyBub2Rlcy4KKy8vLwordm9pZCBJbnN0ckVtaXR0ZXI6OkVtaXRTdWJyZWdOb2RlKFNETm9kZSAqTm9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8U0RWYWx1ZSwgdW5zaWduZWQ+ICZWUkJhc2VNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0Nsb25lLCBib29sIElzQ2xvbmVkKSB7CisgIHVuc2lnbmVkIFZSQmFzZSA9IDA7CisgIHVuc2lnbmVkIE9wYyA9IE5vZGUtPmdldE1hY2hpbmVPcGNvZGUoKTsKKyAgCisgIC8vIElmIHRoZSBub2RlIGlzIG9ubHkgdXNlZCBieSBhIENvcHlUb1JlZyBhbmQgdGhlIGRlc3QgcmVnIGlzIGEgdnJlZywgdXNlCisgIC8vIHRoZSBDb3B5VG9SZWcnZCBkZXN0aW5hdGlvbiByZWdpc3RlciBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IHZyZWcuCisgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBOb2RlLT51c2VfYmVnaW4oKSwgRSA9IE5vZGUtPnVzZV9lbmQoKTsKKyAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgU0ROb2RlICpVc2VyID0gKlVJOworICAgIGlmIChVc2VyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlUb1JlZyAmJiAKKyAgICAgICAgVXNlci0+Z2V0T3BlcmFuZCgyKS5nZXROb2RlKCkgPT0gTm9kZSkgeworICAgICAgdW5zaWduZWQgRGVzdFJlZyA9IGNhc3Q8UmVnaXN0ZXJTRE5vZGU+KFVzZXItPmdldE9wZXJhbmQoMSkpLT5nZXRSZWcoKTsKKyAgICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKERlc3RSZWcpKSB7CisgICAgICAgIFZSQmFzZSA9IERlc3RSZWc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgaWYgKE9wYyA9PSBUYXJnZXRPcGNvZGU6OkVYVFJBQ1RfU1VCUkVHKSB7CisgICAgLy8gRVhUUkFDVF9TVUJSRUcgaXMgbG93ZXJlZCBhcyAlZHN0ID0gQ09QWSAlc3JjOnN1YgorICAgIHVuc2lnbmVkIFN1YklkeCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE5vZGUtPmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKTsKKworICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHJlZ2lzdGVyIGNsYXNzIHRvIGNyZWF0ZSBmb3IgdGhlIGRlc3RyZWcuCisgICAgdW5zaWduZWQgVlJlZyA9IGdldFZSKE5vZGUtPmdldE9wZXJhbmQoMCksIFZSQmFzZU1hcCk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqVFJDID0gTVJJLT5nZXRSZWdDbGFzcyhWUmVnKTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpTUkMgPSBUUkMtPmdldFN1YlJlZ2lzdGVyUmVnQ2xhc3MoU3ViSWR4KTsKKyAgICBhc3NlcnQoU1JDICYmICJJbnZhbGlkIHN1YnJlZ2lzdGVyIGluZGV4IGluIEVYVFJBQ1RfU1VCUkVHIik7CisKKyAgICAvLyBGaWd1cmUgb3V0IHRoZSByZWdpc3RlciBjbGFzcyB0byBjcmVhdGUgZm9yIHRoZSBkZXN0cmVnLgorICAgIC8vIE5vdGUgdGhhdCBpZiB3ZSdyZSBnb2luZyB0byBkaXJlY3RseSB1c2UgYW4gZXhpc3RpbmcgcmVnaXN0ZXIsCisgICAgLy8gaXQgbXVzdCBiZSBwcmVjaXNlbHkgdGhlIHJlcXVpcmVkIGNsYXNzLCBhbmQgbm90IGEgc3ViY2xhc3MKKyAgICAvLyB0aGVyZW9mLgorICAgIGlmIChWUkJhc2UgPT0gMCB8fCBTUkMgIT0gTVJJLT5nZXRSZWdDbGFzcyhWUkJhc2UpKSB7CisgICAgICAvLyBDcmVhdGUgdGhlIHJlZworICAgICAgYXNzZXJ0KFNSQyAmJiAiQ291bGRuJ3QgZmluZCBzb3VyY2UgcmVnaXN0ZXIgY2xhc3MiKTsKKyAgICAgIFZSQmFzZSA9IE1SSS0+Y3JlYXRlVmlydHVhbFJlZ2lzdGVyKFNSQyk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSBleHRyYWN0X3N1YnJlZyBtYWNoaW5lIGluc3RydWN0aW9uLgorICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBCdWlsZE1JKCpNRiwgTm9kZS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUktPmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLCBWUkJhc2UpOworCisgICAgLy8gQWRkIHNvdXJjZSwgYW5kIHN1YnJlZyBpbmRleAorICAgIEFkZE9wZXJhbmQoTUksIE5vZGUtPmdldE9wZXJhbmQoMCksIDAsIDAsIFZSQmFzZU1hcCwgLypJc0RlYnVnPSovZmFsc2UsCisgICAgICAgICAgICAgICBJc0Nsb25lLCBJc0Nsb25lZCk7CisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpICYmCisgICAgICAgICAgICJDYW5ub3QgeWV0IGV4dHJhY3QgZnJvbSBwaHlzcmVncyIpOworICAgIE1JLT5nZXRPcGVyYW5kKDEpLnNldFN1YlJlZyhTdWJJZHgpOworICAgIE1CQi0+aW5zZXJ0KEluc2VydFBvcywgTUkpOworICB9IGVsc2UgaWYgKE9wYyA9PSBUYXJnZXRPcGNvZGU6OklOU0VSVF9TVUJSRUcgfHwKKyAgICAgICAgICAgICBPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpTVUJSRUdfVE9fUkVHKSB7CisgICAgU0RWYWx1ZSBOMCA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBOMSA9IE5vZGUtPmdldE9wZXJhbmQoMSk7CisgICAgU0RWYWx1ZSBOMiA9IE5vZGUtPmdldE9wZXJhbmQoMik7CisgICAgdW5zaWduZWQgU3ViUmVnID0gZ2V0VlIoTjEsIFZSQmFzZU1hcCk7CisgICAgdW5zaWduZWQgU3ViSWR4ID0gY2FzdDxDb25zdGFudFNETm9kZT4oTjIpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpUUkMgPSBNUkktPmdldFJlZ0NsYXNzKFN1YlJlZyk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqU1JDID0KKyAgICAgIGdldFN1cGVyUmVnaXN0ZXJSZWdDbGFzcyhUUkMsIFN1YklkeCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApKTsKKworICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHJlZ2lzdGVyIGNsYXNzIHRvIGNyZWF0ZSBmb3IgdGhlIGRlc3RyZWcuCisgICAgLy8gTm90ZSB0aGF0IGlmIHdlJ3JlIGdvaW5nIHRvIGRpcmVjdGx5IHVzZSBhbiBleGlzdGluZyByZWdpc3RlciwKKyAgICAvLyBpdCBtdXN0IGJlIHByZWNpc2VseSB0aGUgcmVxdWlyZWQgY2xhc3MsIGFuZCBub3QgYSBzdWJjbGFzcworICAgIC8vIHRoZXJlb2YuCisgICAgaWYgKFZSQmFzZSA9PSAwIHx8IFNSQyAhPSBNUkktPmdldFJlZ0NsYXNzKFZSQmFzZSkpIHsKKyAgICAgIC8vIENyZWF0ZSB0aGUgcmVnCisgICAgICBhc3NlcnQoU1JDICYmICJDb3VsZG4ndCBmaW5kIHNvdXJjZSByZWdpc3RlciBjbGFzcyIpOworICAgICAgVlJCYXNlID0gTVJJLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoU1JDKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIGluc2VydF9zdWJyZWcgb3Igc3VicmVnX3RvX3JlZyBtYWNoaW5lIGluc3RydWN0aW9uLgorICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBCdWlsZE1JKCpNRiwgTm9kZS0+Z2V0RGVidWdMb2MoKSwgVElJLT5nZXQoT3BjKSk7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhWUkJhc2UsIHRydWUpKTsKKyAgICAKKyAgICAvLyBJZiBjcmVhdGluZyBhIHN1YnJlZ190b19yZWcsIHRoZW4gdGhlIGZpcnN0IGlucHV0IG9wZXJhbmQKKyAgICAvLyBpcyBhbiBpbXBsaWNpdCB2YWx1ZSBpbW1lZGlhdGUsIG90aGVyd2lzZSBpdCdzIGEgcmVnaXN0ZXIKKyAgICBpZiAoT3BjID09IFRhcmdldE9wY29kZTo6U1VCUkVHX1RPX1JFRykgeworICAgICAgY29uc3QgQ29uc3RhbnRTRE5vZGUgKlNEID0gY2FzdDxDb25zdGFudFNETm9kZT4oTjApOworICAgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbShTRC0+Z2V0WkV4dFZhbHVlKCkpKTsKKyAgICB9IGVsc2UKKyAgICAgIEFkZE9wZXJhbmQoTUksIE4wLCAwLCAwLCBWUkJhc2VNYXAsIC8qSXNEZWJ1Zz0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICBJc0Nsb25lLCBJc0Nsb25lZCk7CisgICAgLy8gQWRkIHRoZSBzdWJyZWdzdGVyIGJlaW5nIGluc2VydGVkCisgICAgQWRkT3BlcmFuZChNSSwgTjEsIDAsIDAsIFZSQmFzZU1hcCwgLypJc0RlYnVnPSovZmFsc2UsCisgICAgICAgICAgICAgICBJc0Nsb25lLCBJc0Nsb25lZCk7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbShTdWJJZHgpKTsKKyAgICBNQkItPmluc2VydChJbnNlcnRQb3MsIE1JKTsKKyAgfSBlbHNlCisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm9kZSBpcyBub3QgaW5zZXJ0X3N1YnJlZywgZXh0cmFjdF9zdWJyZWcsIG9yIHN1YnJlZ190b19yZWciKTsKKyAgICAgCisgIFNEVmFsdWUgT3AoTm9kZSwgMCk7CisgIGJvb2wgaXNOZXcgPSBWUkJhc2VNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE9wLCBWUkJhc2UpKS5zZWNvbmQ7CisgIGlzTmV3ID0gaXNOZXc7IC8vIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZy4KKyAgYXNzZXJ0KGlzTmV3ICYmICJOb2RlIGVtaXR0ZWQgb3V0IG9mIG9yZGVyIC0gZWFybHkiKTsKK30KKworLy8vIEVtaXRDb3B5VG9SZWdDbGFzc05vZGUgLSBHZW5lcmF0ZSBtYWNoaW5lIGNvZGUgZm9yIENPUFlfVE9fUkVHQ0xBU1Mgbm9kZXMuCisvLy8gQ09QWV9UT19SRUdDTEFTUyBpcyBqdXN0IGEgbm9ybWFsIGNvcHksIGV4Y2VwdCB0aGF0IHRoZSBkZXN0aW5hdGlvbgorLy8vIHJlZ2lzdGVyIGlzIGNvbnN0cmFpbmVkIHRvIGJlIGluIGEgcGFydGljdWxhciByZWdpc3RlciBjbGFzcy4KKy8vLwordm9pZAorSW5zdHJFbWl0dGVyOjpFbWl0Q29weVRvUmVnQ2xhc3NOb2RlKFNETm9kZSAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD4gJlZSQmFzZU1hcCkgeworICB1bnNpZ25lZCBWUmVnID0gZ2V0VlIoTm9kZS0+Z2V0T3BlcmFuZCgwKSwgVlJCYXNlTWFwKTsKKworICAvLyBDcmVhdGUgdGhlIG5ldyBWUmVnIGluIHRoZSBkZXN0aW5hdGlvbiBjbGFzcyBhbmQgZW1pdCBhIGNvcHkuCisgIHVuc2lnbmVkIERzdFJDSWR4ID0gY2FzdDxDb25zdGFudFNETm9kZT4oTm9kZS0+Z2V0T3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpEc3RSQyA9IFRSSS0+Z2V0UmVnQ2xhc3MoRHN0UkNJZHgpOworICB1bnNpZ25lZCBOZXdWUmVnID0gTVJJLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoRHN0UkMpOworICBCdWlsZE1JKCpNQkIsIEluc2VydFBvcywgTm9kZS0+Z2V0RGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICBOZXdWUmVnKS5hZGRSZWcoVlJlZyk7CisKKyAgU0RWYWx1ZSBPcChOb2RlLCAwKTsKKyAgYm9vbCBpc05ldyA9IFZSQmFzZU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoT3AsIE5ld1ZSZWcpKS5zZWNvbmQ7CisgIGlzTmV3ID0gaXNOZXc7IC8vIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZy4KKyAgYXNzZXJ0KGlzTmV3ICYmICJOb2RlIGVtaXR0ZWQgb3V0IG9mIG9yZGVyIC0gZWFybHkiKTsKK30KKworLy8vIEVtaXRSZWdTZXF1ZW5jZSAtIEdlbmVyYXRlIG1hY2hpbmUgY29kZSBmb3IgUkVHX1NFUVVFTkNFIG5vZGVzLgorLy8vCit2b2lkIEluc3RyRW1pdHRlcjo6RW1pdFJlZ1NlcXVlbmNlKFNETm9kZSAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD4gJlZSQmFzZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ2xvbmUsIGJvb2wgSXNDbG9uZWQpIHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBUTEktPmdldFJlZ0NsYXNzRm9yKE5vZGUtPmdldFZhbHVlVHlwZSgwKSk7CisgIHVuc2lnbmVkIE5ld1ZSZWcgPSBNUkktPmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIE1hY2hpbmVJbnN0ciAqTUkgPSBCdWlsZE1JKCpNRiwgTm9kZS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpSRUdfU0VRVUVOQ0UpLCBOZXdWUmVnKTsKKyAgdW5zaWduZWQgTnVtT3BzID0gTm9kZS0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgYXNzZXJ0KChOdW1PcHMgJiAxKSA9PSAwICYmCisgICAgICAgICAiUkVHX1NFUVVFTkNFIG11c3QgaGF2ZSBhbiBldmVuIG51bWJlciBvZiBvcGVyYW5kcyEiKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZJSSA9IFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6UkVHX1NFUVVFTkNFKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHM7ICsraSkgeworICAgIFNEVmFsdWUgT3AgPSBOb2RlLT5nZXRPcGVyYW5kKGkpOworICAgIGlmIChpICYgMSkgeworICAgICAgdW5zaWduZWQgU3ViSWR4ID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3ApLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIHVuc2lnbmVkIFN1YlJlZyA9IGdldFZSKE5vZGUtPmdldE9wZXJhbmQoaS0xKSwgVlJCYXNlTWFwKTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlRSQyA9IE1SSS0+Z2V0UmVnQ2xhc3MoU3ViUmVnKTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlNSQyA9CisgICAgICAgIFRSSS0+Z2V0TWF0Y2hpbmdTdXBlclJlZ0NsYXNzKFJDLCBUUkMsIFN1YklkeCk7CisgICAgICBpZiAoIVNSQykKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBzdWJyZWdpc3RlciBpbmRleCBpbiBSRUdfU0VRVUVOQ0UiKTsKKyAgICAgIGlmIChTUkMgIT0gUkMpIHsKKyAgICAgICAgTVJJLT5zZXRSZWdDbGFzcyhOZXdWUmVnLCBTUkMpOworICAgICAgICBSQyA9IFNSQzsKKyAgICAgIH0KKyAgICB9CisgICAgQWRkT3BlcmFuZChNSSwgT3AsIGkrMSwgJklJLCBWUkJhc2VNYXAsIC8qSXNEZWJ1Zz0qL2ZhbHNlLAorICAgICAgICAgICAgICAgSXNDbG9uZSwgSXNDbG9uZWQpOworICB9CisKKyAgTUJCLT5pbnNlcnQoSW5zZXJ0UG9zLCBNSSk7CisgIFNEVmFsdWUgT3AoTm9kZSwgMCk7CisgIGJvb2wgaXNOZXcgPSBWUkJhc2VNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE9wLCBOZXdWUmVnKSkuc2Vjb25kOworICBpc05ldyA9IGlzTmV3OyAvLyBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcuCisgIGFzc2VydChpc05ldyAmJiAiTm9kZSBlbWl0dGVkIG91dCBvZiBvcmRlciAtIGVhcmx5Iik7Cit9CisKKy8vLyBFbWl0RGJnVmFsdWUgLSBHZW5lcmF0ZSBtYWNoaW5lIGluc3RydWN0aW9uIGZvciBhIGRiZ192YWx1ZSBub2RlLgorLy8vCitNYWNoaW5lSW5zdHIgKgorSW5zdHJFbWl0dGVyOjpFbWl0RGJnVmFsdWUoU0REYmdWYWx1ZSAqU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD4gJlZSQmFzZU1hcCkgeworICB1aW50NjRfdCBPZmZzZXQgPSBTRC0+Z2V0T2Zmc2V0KCk7CisgIE1ETm9kZSogTURQdHIgPSBTRC0+Z2V0TURQdHIoKTsKKyAgRGVidWdMb2MgREwgPSBTRC0+Z2V0RGVidWdMb2MoKTsKKworICBpZiAoU0QtPmdldEtpbmQoKSA9PSBTRERiZ1ZhbHVlOjpGUkFNRUlYKSB7CisgICAgLy8gU3RhY2sgYWRkcmVzczsgdGhpcyBuZWVkcyB0byBiZSBsb3dlcmVkIGluIHRhcmdldC1kZXBlbmRlbnQgZmFzaGlvbi4KKyAgICAvLyBFbWl0VGFyZ2V0Q29kZUZvckZyYW1lRGVidWdWYWx1ZSBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGlvbi4KKyAgICB1bnNpZ25lZCBGcmFtZUl4ID0gU0QtPmdldEZyYW1lSXgoKTsKKyAgICByZXR1cm4gVElJLT5lbWl0RnJhbWVJbmRleERlYnVnVmFsdWUoKk1GLCBGcmFtZUl4LCBPZmZzZXQsIE1EUHRyLCBETCk7CisgIH0KKyAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBjcmVhdGUgYW4gaW5zdHJ1Y3Rpb24gaGVyZS4KKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZJSSA9IFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6REJHX1ZBTFVFKTsKKyAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKCpNRiwgREwsIElJKTsKKyAgaWYgKFNELT5nZXRLaW5kKCkgPT0gU0REYmdWYWx1ZTo6U0ROT0RFKSB7CisgICAgU0ROb2RlICpOb2RlID0gU0QtPmdldFNETm9kZSgpOworICAgIFNEVmFsdWUgT3AgPSBTRFZhbHVlKE5vZGUsIFNELT5nZXRSZXNObygpKTsKKyAgICAvLyBJdCdzIHBvc3NpYmxlIHdlIHJlcGxhY2VkIHRoaXMgU0ROb2RlIHdpdGggb3RoZXIocykgYW5kIHRoZXJlZm9yZQorICAgIC8vIGRpZG4ndCBnZW5lcmF0ZSBjb2RlIGZvciBpdC4gIEl0J3MgYmV0dGVyIHRvIGNhdGNoIHRoZXNlIGNhc2VzIHdoZXJlCisgICAgLy8gdGhleSBoYXBwZW4gYW5kIHRyYW5zZmVyIHRoZSBkZWJ1ZyBpbmZvLCBidXQgdHJ5aW5nIHRvIGd1YXJhbnRlZSB0aGF0CisgICAgLy8gaW4gYWxsIGNhc2VzIHdvdWxkIGJlIHZlcnkgZnJhZ2lsZTsgdGhpcyBpcyBhIHNhZmVndWFyZCBmb3IgYW55CisgICAgLy8gdGhhdCB3ZXJlIG1pc3NlZC4KKyAgICBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD46Oml0ZXJhdG9yIEkgPSBWUkJhc2VNYXAuZmluZChPcCk7CisgICAgaWYgKEk9PVZSQmFzZU1hcC5lbmQoKSkKKyAgICAgIE1JQi5hZGRSZWcoMFUpOyAgICAgICAvLyB1bmRlZgorICAgIGVsc2UKKyAgICAgIEFkZE9wZXJhbmQoJipNSUIsIE9wLCAoKk1JQikuZ2V0TnVtT3BlcmFuZHMoKSwgJklJLCBWUkJhc2VNYXAsCisgICAgICAgICAgICAgICAgIC8qSXNEZWJ1Zz0qL3RydWUsIC8qSXNDbG9uZT0qL2ZhbHNlLCAvKklzQ2xvbmVkPSovZmFsc2UpOworICB9IGVsc2UgaWYgKFNELT5nZXRLaW5kKCkgPT0gU0REYmdWYWx1ZTo6Q09OU1QpIHsKKyAgICBjb25zdCBWYWx1ZSAqViA9IFNELT5nZXRDb25zdCgpOworICAgIGlmIChjb25zdCBDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpIHsKKyAgICAgIC8vIEZJWE1FOiBTRERiZ1ZhbHVlIGNvbnN0YW50cyBhcmVuJ3QgdXBkYXRlZCB3aXRoIGxlZ2FsaXphdGlvbiwgc28gaXQncyAKKyAgICAgIC8vIHBvc3NpYmxlIHRvIGhhdmUgaTEyOCBjb25zdGFudHMgaW4gdGhlbSBhdCB0aGlzIHBvaW50LiBEd2FyZiB3cml0ZXIKKyAgICAgIC8vIGRvZXMgbm90IGhhbmRsZSBpMTI4IGNvbnN0YW50cyBhdCB0aGUgbW9tZW50IHNvLCBhcyBhIGNydWRlIHdvcmthcm91bmQsCisgICAgICAvLyBqdXN0IGRyb3AgdGhlIGRlYnVnIGluZm8gaWYgdGhpcyBoYXBwZW5zLgorICAgICAgaWYgKCFDSS0+Z2V0VmFsdWUoKS5pc1NpZ25lZEludE4oNjQpKQorICAgICAgICBNSUIuYWRkUmVnKDBVKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTUlCLmFkZEltbShDSS0+Z2V0U0V4dFZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAoY29uc3QgQ29uc3RhbnRGUCAqQ0YgPSBkeW5fY2FzdDxDb25zdGFudEZQPihWKSkgeworICAgICAgTUlCLmFkZEZQSW1tKENGKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ291bGQgYmUgYW4gVW5kZWYuICBJbiBhbnkgY2FzZSBpbnNlcnQgYW4gVW5kZWYgc28gd2UgY2FuIHNlZSB3aGF0IHdlCisgICAgICAvLyBkcm9wcGVkLgorICAgICAgTUlCLmFkZFJlZygwVSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIEluc2VydCBhbiBVbmRlZiBzbyB3ZSBjYW4gc2VlIHdoYXQgd2UgZHJvcHBlZC4KKyAgICBNSUIuYWRkUmVnKDBVKTsKKyAgfQorCisgIE1JQi5hZGRJbW0oT2Zmc2V0KS5hZGRNZXRhZGF0YShNRFB0cik7CisgIHJldHVybiAmKk1JQjsKK30KKworLy8vIEVtaXRNYWNoaW5lTm9kZSAtIEdlbmVyYXRlIG1hY2hpbmUgY29kZSBmb3IgYSB0YXJnZXQtc3BlY2lmaWMgbm9kZSBhbmQKKy8vLyBuZWVkZWQgZGVwZW5kZW5jaWVzLgorLy8vCit2b2lkIEluc3RyRW1pdHRlcjo6CitFbWl0TWFjaGluZU5vZGUoU0ROb2RlICpOb2RlLCBib29sIElzQ2xvbmUsIGJvb2wgSXNDbG9uZWQsCisgICAgICAgICAgICAgICAgRGVuc2VNYXA8U0RWYWx1ZSwgdW5zaWduZWQ+ICZWUkJhc2VNYXApIHsKKyAgdW5zaWduZWQgT3BjID0gTm9kZS0+Z2V0TWFjaGluZU9wY29kZSgpOworICAKKyAgLy8gSGFuZGxlIHN1YnJlZyBpbnNlcnQvZXh0cmFjdCBzcGVjaWFsbHkKKyAgaWYgKE9wYyA9PSBUYXJnZXRPcGNvZGU6OkVYVFJBQ1RfU1VCUkVHIHx8IAorICAgICAgT3BjID09IFRhcmdldE9wY29kZTo6SU5TRVJUX1NVQlJFRyB8fAorICAgICAgT3BjID09IFRhcmdldE9wY29kZTo6U1VCUkVHX1RPX1JFRykgeworICAgIEVtaXRTdWJyZWdOb2RlKE5vZGUsIFZSQmFzZU1hcCwgSXNDbG9uZSwgSXNDbG9uZWQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEhhbmRsZSBDT1BZX1RPX1JFR0NMQVNTIHNwZWNpYWxseS4KKyAgaWYgKE9wYyA9PSBUYXJnZXRPcGNvZGU6OkNPUFlfVE9fUkVHQ0xBU1MpIHsKKyAgICBFbWl0Q29weVRvUmVnQ2xhc3NOb2RlKE5vZGUsIFZSQmFzZU1hcCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSGFuZGxlIFJFR19TRVFVRU5DRSBzcGVjaWFsbHkuCisgIGlmIChPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpSRUdfU0VRVUVOQ0UpIHsKKyAgICBFbWl0UmVnU2VxdWVuY2UoTm9kZSwgVlJCYXNlTWFwLCBJc0Nsb25lLCBJc0Nsb25lZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKE9wYyA9PSBUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRikKKyAgICAvLyBXZSB3YW50IGEgdW5pcXVlIFZSIGZvciBlYWNoIElNUExJQ0lUX0RFRiB1c2UuCisgICAgcmV0dXJuOworICAKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZJSSA9IFRJSS0+Z2V0KE9wYyk7CisgIHVuc2lnbmVkIE51bVJlc3VsdHMgPSBDb3VudFJlc3VsdHMoTm9kZSk7CisgIHVuc2lnbmVkIE5vZGVPcGVyYW5kcyA9IENvdW50T3BlcmFuZHMoTm9kZSk7CisgIGJvb2wgSGFzUGh5c1JlZ091dHMgPSBOdW1SZXN1bHRzID4gSUkuZ2V0TnVtRGVmcygpICYmIElJLmdldEltcGxpY2l0RGVmcygpIT0wOworI2lmbmRlZiBOREVCVUcKKyAgdW5zaWduZWQgTnVtTUlPcGVyYW5kcyA9IE5vZGVPcGVyYW5kcyArIE51bVJlc3VsdHM7CisgIGlmIChJSS5pc1ZhcmlhZGljKCkpCisgICAgYXNzZXJ0KE51bU1JT3BlcmFuZHMgPj0gSUkuZ2V0TnVtT3BlcmFuZHMoKSAmJgorICAgICAgICAgICAiVG9vIGZldyBvcGVyYW5kcyBmb3IgYSB2YXJpYWRpYyBub2RlISIpOworICBlbHNlCisgICAgYXNzZXJ0KE51bU1JT3BlcmFuZHMgPj0gSUkuZ2V0TnVtT3BlcmFuZHMoKSAmJgorICAgICAgICAgICBOdW1NSU9wZXJhbmRzIDw9IElJLmdldE51bU9wZXJhbmRzKCkrSUkuZ2V0TnVtSW1wbGljaXREZWZzKCkgJiYKKyAgICAgICAgICAgIiNvcGVyYW5kcyBmb3IgZGFnIG5vZGUgZG9lc24ndCBtYXRjaCAudGQgZmlsZSEiKTsKKyNlbmRpZgorCisgIC8vIENyZWF0ZSB0aGUgbmV3IG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ciAqTUkgPSBCdWlsZE1JKCpNRiwgTm9kZS0+Z2V0RGVidWdMb2MoKSwgSUkpOworCisgIC8vIFRoZSBNYWNoaW5lSW5zdHIgY29uc3RydWN0b3IgYWRkcyBpbXBsaWNpdC1kZWYgb3BlcmFuZHMuIFNjYW4gdGhyb3VnaAorICAvLyB0aGVzZSB0byBkZXRlcm1pbmUgd2hpY2ggYXJlIGRlYWQuCisgIGlmIChNSS0+Z2V0TnVtT3BlcmFuZHMoKSAhPSAwICYmCisgICAgICBOb2RlLT5nZXRWYWx1ZVR5cGUoTm9kZS0+Z2V0TnVtVmFsdWVzKCktMSkgPT0gTVZUOjpGbGFnKSB7CisgICAgLy8gRmlyc3QsIGNvbGxlY3QgYWxsIHVzZWQgcmVnaXN0ZXJzLgorICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA4PiBVc2VkUmVnczsKKyAgICBmb3IgKFNETm9kZSAqRiA9IE5vZGUtPmdldEZsYWdnZWRVc2VyKCk7IEY7IEYgPSBGLT5nZXRGbGFnZ2VkVXNlcigpKQorICAgICAgaWYgKEYtPmdldE9wY29kZSgpID09IElTRDo6Q29weUZyb21SZWcpCisgICAgICAgIFVzZWRSZWdzLnB1c2hfYmFjayhjYXN0PFJlZ2lzdGVyU0ROb2RlPihGLT5nZXRPcGVyYW5kKDEpKS0+Z2V0UmVnKCkpOworICAgICAgZWxzZSB7CisgICAgICAgIC8vIENvbGxlY3QgZGVjbGFyZWQgaW1wbGljaXQgdXNlcy4KKyAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBUSUktPmdldChGLT5nZXRNYWNoaW5lT3Bjb2RlKCkpOworICAgICAgICBVc2VkUmVncy5hcHBlbmQoVElELmdldEltcGxpY2l0VXNlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgVElELmdldEltcGxpY2l0VXNlcygpICsgVElELmdldE51bUltcGxpY2l0VXNlcygpKTsKKyAgICAgICAgLy8gSW4gYWRkaXRpb24gdG8gZGVjbGFyZWQgaW1wbGljaXQgdXNlcywgd2UgbXVzdCBhbHNvIGNoZWNrIGZvcgorICAgICAgICAvLyBkaXJlY3QgUmVnaXN0ZXJTRE5vZGUgb3BlcmFuZHMuCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBpZiAoUmVnaXN0ZXJTRE5vZGUgKlIgPSBkeW5fY2FzdDxSZWdpc3RlclNETm9kZT4oRi0+Z2V0T3BlcmFuZChpKSkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIFJlZyA9IFItPmdldFJlZygpOworICAgICAgICAgICAgaWYgKFJlZyAhPSAwICYmIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpCisgICAgICAgICAgICAgIFVzZWRSZWdzLnB1c2hfYmFjayhSZWcpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAvLyBUaGVuIG1hcmsgdW51c2VkIHJlZ2lzdGVycyBhcyBkZWFkLgorICAgIE1JLT5zZXRQaHlzUmVnc0RlYWRFeGNlcHQoVXNlZFJlZ3MsICpUUkkpOworICB9CisgIAorICAvLyBBZGQgcmVzdWx0IHJlZ2lzdGVyIHZhbHVlcyBmb3IgdGhpbmdzIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhpcworICAvLyBpbnN0cnVjdGlvbi4KKyAgaWYgKE51bVJlc3VsdHMpCisgICAgQ3JlYXRlVmlydHVhbFJlZ2lzdGVycyhOb2RlLCBNSSwgSUksIElzQ2xvbmUsIElzQ2xvbmVkLCBWUkJhc2VNYXApOworICAKKyAgLy8gRW1pdCBhbGwgb2YgdGhlIGFjdHVhbCBvcGVyYW5kcyBvZiB0aGlzIGluc3RydWN0aW9uLCBhZGRpbmcgdGhlbSB0byB0aGUKKyAgLy8gaW5zdHJ1Y3Rpb24gYXMgYXBwcm9wcmlhdGUuCisgIGJvb2wgSGFzT3B0UFJlZnMgPSBJSS5nZXROdW1EZWZzKCkgPiBOdW1SZXN1bHRzOworICBhc3NlcnQoKCFIYXNPcHRQUmVmcyB8fCAhSGFzUGh5c1JlZ091dHMpICYmCisgICAgICAgICAiVW5hYmxlIHRvIGNvcGUgd2l0aCBvcHRpb25hbCBkZWZzIGFuZCBwaHlzIHJlZ3MgZGVmcyEiKTsKKyAgdW5zaWduZWQgTnVtU2tpcCA9IEhhc09wdFBSZWZzID8gSUkuZ2V0TnVtRGVmcygpIC0gTnVtUmVzdWx0cyA6IDA7CisgIGZvciAodW5zaWduZWQgaSA9IE51bVNraXA7IGkgIT0gTm9kZU9wZXJhbmRzOyArK2kpCisgICAgQWRkT3BlcmFuZChNSSwgTm9kZS0+Z2V0T3BlcmFuZChpKSwgaS1OdW1Ta2lwK0lJLmdldE51bURlZnMoKSwgJklJLAorICAgICAgICAgICAgICAgVlJCYXNlTWFwLCAvKklzRGVidWc9Ki9mYWxzZSwgSXNDbG9uZSwgSXNDbG9uZWQpOworCisgIC8vIFRyYW5zZmVyIGFsbCBvZiB0aGUgbWVtb3J5IHJlZmVyZW5jZSBkZXNjcmlwdGlvbnMgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgTUktPnNldE1lbVJlZnMoY2FzdDxNYWNoaW5lU0ROb2RlPihOb2RlKS0+bWVtb3BlcmFuZHNfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgY2FzdDxNYWNoaW5lU0ROb2RlPihOb2RlKS0+bWVtb3BlcmFuZHNfZW5kKCkpOworCisgIC8vIEluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50byBwb3NpdGlvbiBpbiB0aGUgYmxvY2suIFRoaXMgbmVlZHMgdG8KKyAgLy8gaGFwcGVuIGJlZm9yZSBhbnkgY3VzdG9tIGluc2VydGVyIGhvb2sgaXMgY2FsbGVkIHNvIHRoYXQgdGhlCisgIC8vIGhvb2sga25vd3Mgd2hlcmUgaW4gdGhlIGJsb2NrIHRvIGluc2VydCB0aGUgcmVwbGFjZW1lbnQgY29kZS4KKyAgTUJCLT5pbnNlcnQoSW5zZXJ0UG9zLCBNSSk7CisKKyAgaWYgKElJLnVzZXNDdXN0b21JbnNlcnRpb25Ib29rKCkpIHsKKyAgICAvLyBJbnNlcnQgdGhpcyBpbnN0cnVjdGlvbiBpbnRvIHRoZSBiYXNpYyBibG9jayB1c2luZyBhIHRhcmdldAorICAgIC8vIHNwZWNpZmljIGluc2VydGVyIHdoaWNoIG1heSByZXR1cm5zIGEgbmV3IGJhc2ljIGJsb2NrLgorICAgIGJvb2wgQXRFbmQgPSBJbnNlcnRQb3MgPT0gTUJCLT5lbmQoKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3TUJCID0gVExJLT5FbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIE1CQik7CisgICAgaWYgKE5ld01CQiAhPSBNQkIpIHsKKyAgICAgIGlmIChBdEVuZCkKKyAgICAgICAgSW5zZXJ0UG9zID0gTmV3TUJCLT5lbmQoKTsKKyAgICAgIE1CQiA9IE5ld01CQjsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBBZGRpdGlvbmFsIHJlc3VsdHMgbXVzdCBiZSBhbiBwaHlzaWNhbCByZWdpc3RlciBkZWYuCisgIGlmIChIYXNQaHlzUmVnT3V0cykgeworICAgIGZvciAodW5zaWduZWQgaSA9IElJLmdldE51bURlZnMoKTsgaSA8IE51bVJlc3VsdHM7ICsraSkgeworICAgICAgdW5zaWduZWQgUmVnID0gSUkuZ2V0SW1wbGljaXREZWZzKClbaSAtIElJLmdldE51bURlZnMoKV07CisgICAgICBpZiAoTm9kZS0+aGFzQW55VXNlT2ZWYWx1ZShpKSkKKyAgICAgICAgRW1pdENvcHlGcm9tUmVnKE5vZGUsIGksIElzQ2xvbmUsIElzQ2xvbmVkLCBSZWcsIFZSQmFzZU1hcCk7CisgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gdXNlcywgbWFyayB0aGUgcmVnaXN0ZXIgYXMgZGVhZCBub3csIHNvIHRoYXQKKyAgICAgIC8vIE1hY2hpbmVMSUNNL1NpbmsgY2FuIHNlZSB0aGF0IGl0J3MgZGVhZC4gRG9uJ3QgZG8gdGhpcyBpZiB0aGUKKyAgICAgIC8vIG5vZGUgaGFzIGEgRmxhZyB2YWx1ZSwgZm9yIHRoZSBiZW5lZml0IG9mIHRhcmdldHMgc3RpbGwgdXNpbmcKKyAgICAgIC8vIEZsYWcgZm9yIHZhbHVlcyBpbiBwaHlzcmVncy4KKyAgICAgIGVsc2UgaWYgKE5vZGUtPmdldFZhbHVlVHlwZShOb2RlLT5nZXROdW1WYWx1ZXMoKS0xKSAhPSBNVlQ6OkZsYWcpCisgICAgICAgIE1JLT5hZGRSZWdpc3RlckRlYWQoUmVnLCBUUkkpOworICAgIH0KKyAgfQorICAKKyAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGhhcyBpbXBsaWNpdCBkZWZzIGFuZCB0aGUgbm9kZSBkb2Vzbid0LCBtYXJrIHRoZQorICAvLyBpbXBsaWNpdCBkZWYgYXMgZGVhZC4gIElmIHRoZSBub2RlIGhhcyBhbnkgZmxhZyBvdXRwdXRzLCB3ZSBkb24ndCBkbyB0aGlzCisgIC8vIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGF0IGltcGxpY2l0IGRlZnMgYXJlIGJlaW5nIHVzZWQgYnkgZmxhZ2dlZCBub2Rlcy4KKyAgaWYgKE5vZGUtPmdldFZhbHVlVHlwZShOb2RlLT5nZXROdW1WYWx1ZXMoKS0xKSAhPSBNVlQ6OkZsYWcpCisgICAgaWYgKGNvbnN0IHVuc2lnbmVkICpJRExpc3QgPSBJSS5nZXRJbXBsaWNpdERlZnMoKSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gTnVtUmVzdWx0cywgZSA9IElJLmdldE51bURlZnMoKStJSS5nZXROdW1JbXBsaWNpdERlZnMoKTsKKyAgICAgICAgICAgaSAhPSBlOyArK2kpCisgICAgICAgIE1JLT5hZGRSZWdpc3RlckRlYWQoSURMaXN0W2ktSUkuZ2V0TnVtRGVmcygpXSwgVFJJKTsKKyAgICB9Cit9CisKKy8vLyBFbWl0U3BlY2lhbE5vZGUgLSBHZW5lcmF0ZSBtYWNoaW5lIGNvZGUgZm9yIGEgdGFyZ2V0LWluZGVwZW5kZW50IG5vZGUgYW5kCisvLy8gbmVlZGVkIGRlcGVuZGVuY2llcy4KK3ZvaWQgSW5zdHJFbWl0dGVyOjoKK0VtaXRTcGVjaWFsTm9kZShTRE5vZGUgKk5vZGUsIGJvb2wgSXNDbG9uZSwgYm9vbCBJc0Nsb25lZCwKKyAgICAgICAgICAgICAgICBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD4gJlZSQmFzZU1hcCkgeworICBzd2l0Y2ggKE5vZGUtPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6CisjaWZuZGVmIE5ERUJVRworICAgIE5vZGUtPmR1bXAoKTsKKyNlbmRpZgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlRoaXMgdGFyZ2V0LWluZGVwZW5kZW50IG5vZGUgc2hvdWxkIGhhdmUgYmVlbiBzZWxlY3RlZCEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkVudHJ5VG9rZW46CisgICAgbGx2bV91bnJlYWNoYWJsZSgiRW50cnlUb2tlbiBzaG91bGQgaGF2ZSBiZWVuIGV4Y2x1ZGVkIGZyb20gdGhlIHNjaGVkdWxlISIpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6TUVSR0VfVkFMVUVTOgorICBjYXNlIElTRDo6VG9rZW5GYWN0b3I6IC8vIGZhbGwgdGhydQorICAgIGJyZWFrOworICBjYXNlIElTRDo6Q29weVRvUmVnOiB7CisgICAgdW5zaWduZWQgU3JjUmVnOworICAgIFNEVmFsdWUgU3JjVmFsID0gTm9kZS0+Z2V0T3BlcmFuZCgyKTsKKyAgICBpZiAoUmVnaXN0ZXJTRE5vZGUgKlIgPSBkeW5fY2FzdDxSZWdpc3RlclNETm9kZT4oU3JjVmFsKSkKKyAgICAgIFNyY1JlZyA9IFItPmdldFJlZygpOworICAgIGVsc2UKKyAgICAgIFNyY1JlZyA9IGdldFZSKFNyY1ZhbCwgVlJCYXNlTWFwKTsKKyAgICAgIAorICAgIHVuc2lnbmVkIERlc3RSZWcgPSBjYXN0PFJlZ2lzdGVyU0ROb2RlPihOb2RlLT5nZXRPcGVyYW5kKDEpKS0+Z2V0UmVnKCk7CisgICAgaWYgKFNyY1JlZyA9PSBEZXN0UmVnKSAvLyBDb2FsZXNjZWQgYXdheSB0aGUgY29weT8gSWdub3JlLgorICAgICAgYnJlYWs7CisKKyAgICBCdWlsZE1JKCpNQkIsIEluc2VydFBvcywgTm9kZS0+Z2V0RGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICAgICAgICAgIERlc3RSZWcpLmFkZFJlZyhTcmNSZWcpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpDb3B5RnJvbVJlZzogeworICAgIHVuc2lnbmVkIFNyY1JlZyA9IGNhc3Q8UmVnaXN0ZXJTRE5vZGU+KE5vZGUtPmdldE9wZXJhbmQoMSkpLT5nZXRSZWcoKTsKKyAgICBFbWl0Q29weUZyb21SZWcoTm9kZSwgMCwgSXNDbG9uZSwgSXNDbG9uZWQsIFNyY1JlZywgVlJCYXNlTWFwKTsKKyAgICBicmVhazsKKyAgfQorICB9Cit9CisKKy8vLyBJbnN0ckVtaXR0ZXIgLSBDb25zdHJ1Y3QgYW4gSW5zdHJFbWl0dGVyIGFuZCBzZXQgaXQgdG8gc3RhcnQgaW5zZXJ0aW5nCisvLy8gYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBnaXZlbiBibG9jay4KK0luc3RyRW1pdHRlcjo6SW5zdHJFbWl0dGVyKE1hY2hpbmVCYXNpY0Jsb2NrICptYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgaW5zZXJ0cG9zKQorICA6IE1GKG1iYi0+Z2V0UGFyZW50KCkpLAorICAgIE1SSSgmTUYtPmdldFJlZ0luZm8oKSksCisgICAgVE0oJk1GLT5nZXRUYXJnZXQoKSksCisgICAgVElJKFRNLT5nZXRJbnN0ckluZm8oKSksCisgICAgVFJJKFRNLT5nZXRSZWdpc3RlckluZm8oKSksCisgICAgVExJKFRNLT5nZXRUYXJnZXRMb3dlcmluZygpKSwKKyAgICBNQkIobWJiKSwgSW5zZXJ0UG9zKGluc2VydHBvcykgeworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0luc3RyRW1pdHRlci5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0luc3RyRW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzA0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvSW5zdHJFbWl0dGVyLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8vPT09LS0tLSBJbnN0ckVtaXR0ZXIuaCAtIEVtaXQgTWFjaGluZUluc3RycyBmb3IgdGhlIFNlbGVjdGlvbkRBRyBjbGFzcyAtLS09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBkZWNsYXJlcyB0aGUgRW1pdCByb3V0aW5lcyBmb3IgdGhlIFNlbGVjdGlvbkRBRyBjbGFzcywgd2hpY2ggY3JlYXRlcworLy8gTWFjaGluZUluc3RycyBiYXNlZCBvbiB0aGUgZGVjaXNpb25zIG9mIHRoZSBTZWxlY3Rpb25EQUcgaW5zdHJ1Y3Rpb24KKy8vIHNlbGVjdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIElOU1RSRU1JVFRFUl9ICisjZGVmaW5lIElOU1RSRU1JVFRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUYXJnZXRJbnN0ckRlc2M7CitjbGFzcyBTRERiZ1ZhbHVlOworCitjbGFzcyBJbnN0ckVtaXR0ZXIgeworICBNYWNoaW5lRnVuY3Rpb24gKk1GOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgKlRNOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgIGNvbnN0IFRhcmdldExvd2VyaW5nICpUTEk7CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQjsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFBvczsKKworICAvLy8gRW1pdENvcHlGcm9tUmVnIC0gR2VuZXJhdGUgbWFjaGluZSBjb2RlIGZvciBhbiBDb3B5RnJvbVJlZyBub2RlIG9yIGFuCisgIC8vLyBpbXBsaWNpdCBwaHlzaWNhbCByZWdpc3RlciBvdXRwdXQuCisgIHZvaWQgRW1pdENvcHlGcm9tUmVnKFNETm9kZSAqTm9kZSwgdW5zaWduZWQgUmVzTm8sCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDbG9uZSwgYm9vbCBJc0Nsb25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD4gJlZSQmFzZU1hcCk7CisKKyAgLy8vIGdldERzdE9mQ29weVRvUmVnVXNlIC0gSWYgdGhlIG9ubHkgdXNlIG9mIHRoZSBzcGVjaWZpZWQgcmVzdWx0IG51bWJlciBvZgorICAvLy8gbm9kZSBpcyBhIENvcHlUb1JlZywgcmV0dXJuIGl0cyBkZXN0aW5hdGlvbiByZWdpc3Rlci4gUmV0dXJuIDAgb3RoZXJ3aXNlLgorICB1bnNpZ25lZCBnZXREc3RPZk9ubHlDb3B5VG9SZWdVc2UoU0ROb2RlICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVzTm8pIGNvbnN0OworCisgIHZvaWQgQ3JlYXRlVmlydHVhbFJlZ2lzdGVycyhTRE5vZGUgKk5vZGUsIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0Nsb25lLCBib29sIElzQ2xvbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8U0RWYWx1ZSwgdW5zaWduZWQ+ICZWUkJhc2VNYXApOworCisgIC8vLyBnZXRWUiAtIFJldHVybiB0aGUgdmlydHVhbCByZWdpc3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgcmVzdWx0CisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCisgIHVuc2lnbmVkIGdldFZSKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwKTsKKworICAvLy8gQWRkUmVnaXN0ZXJPcGVyYW5kIC0gQWRkIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgYXMgYW4gb3BlcmFuZCB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCBtYWNoaW5lIGluc3RyLiBJbnNlcnQgcmVnaXN0ZXIgY29waWVzIGlmIHRoZSByZWdpc3RlciBpcworICAvLy8gbm90IGluIHRoZSByZXF1aXJlZCByZWdpc3RlciBjbGFzcy4KKyAgdm9pZCBBZGRSZWdpc3Rlck9wZXJhbmQoTWFjaGluZUluc3RyICpNSSwgU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUlPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICpJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8U0RWYWx1ZSwgdW5zaWduZWQ+ICZWUkJhc2VNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNEZWJ1ZywgYm9vbCBJc0Nsb25lLCBib29sIElzQ2xvbmVkKTsKKworICAvLy8gQWRkT3BlcmFuZCAtIEFkZCB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgdG8gdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RyLiAgSUkKKyAgLy8vIHNwZWNpZmllcyB0aGUgaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBub2RlLCBhbmQgSUlPcE51bSBpcyB0aGUKKyAgLy8vIG9wZXJhbmQgbnVtYmVyIChpbiB0aGUgSUkpIHRoYXQgd2UgYXJlIGFkZGluZy4gSUlPcE51bSBhbmQgSUkgYXJlIHVzZWQgZm9yCisgIC8vLyBhc3NlcnRpb25zIG9ubHkuCisgIHZvaWQgQWRkT3BlcmFuZChNYWNoaW5lSW5zdHIgKk1JLCBTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUlPcE51bSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAqSUksCisgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD4gJlZSQmFzZU1hcCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgSXNEZWJ1ZywgYm9vbCBJc0Nsb25lLCBib29sIElzQ2xvbmVkKTsKKworICAvLy8gRW1pdFN1YnJlZ05vZGUgLSBHZW5lcmF0ZSBtYWNoaW5lIGNvZGUgZm9yIHN1YnJlZyBub2Rlcy4KKyAgLy8vCisgIHZvaWQgRW1pdFN1YnJlZ05vZGUoU0ROb2RlICpOb2RlLCBEZW5zZU1hcDxTRFZhbHVlLCB1bnNpZ25lZD4gJlZSQmFzZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ2xvbmUsIGJvb2wgSXNDbG9uZWQpOworCisgIC8vLyBFbWl0Q29weVRvUmVnQ2xhc3NOb2RlIC0gR2VuZXJhdGUgbWFjaGluZSBjb2RlIGZvciBDT1BZX1RPX1JFR0NMQVNTIG5vZGVzLgorICAvLy8gQ09QWV9UT19SRUdDTEFTUyBpcyBqdXN0IGEgbm9ybWFsIGNvcHksIGV4Y2VwdCB0aGF0IHRoZSBkZXN0aW5hdGlvbgorICAvLy8gcmVnaXN0ZXIgaXMgY29uc3RyYWluZWQgdG8gYmUgaW4gYSBwYXJ0aWN1bGFyIHJlZ2lzdGVyIGNsYXNzLgorICAvLy8KKyAgdm9pZCBFbWl0Q29weVRvUmVnQ2xhc3NOb2RlKFNETm9kZSAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwKTsKKworICAvLy8gRW1pdFJlZ1NlcXVlbmNlIC0gR2VuZXJhdGUgbWFjaGluZSBjb2RlIGZvciBSRUdfU0VRVUVOQ0Ugbm9kZXMuCisgIC8vLworICB2b2lkIEVtaXRSZWdTZXF1ZW5jZShTRE5vZGUgKk5vZGUsIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ2xvbmUsIGJvb2wgSXNDbG9uZWQpOworcHVibGljOgorICAvLy8gQ291bnRSZXN1bHRzIC0gVGhlIHJlc3VsdHMgb2YgdGFyZ2V0IG5vZGVzIGhhdmUgcmVnaXN0ZXIgb3IgaW1tZWRpYXRlCisgIC8vLyBvcGVyYW5kcyBmaXJzdCwgdGhlbiBhbiBvcHRpb25hbCBjaGFpbiwgYW5kIG9wdGlvbmFsIGZsYWcgb3BlcmFuZHMKKyAgLy8vICh3aGljaCBkbyBub3QgZ28gaW50byB0aGUgbWFjaGluZSBpbnN0cnMuKQorICBzdGF0aWMgdW5zaWduZWQgQ291bnRSZXN1bHRzKFNETm9kZSAqTm9kZSk7CisKKyAgLy8vIENvdW50T3BlcmFuZHMgLSBUaGUgaW5wdXRzIHRvIHRhcmdldCBub2RlcyBoYXZlIGFueSBhY3R1YWwgaW5wdXRzIGZpcnN0LAorICAvLy8gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgY2hhaW4gb3BlcmFuZCwgdGhlbiBmbGFnIG9wZXJhbmRzLiAgQ29tcHV0ZQorICAvLy8gdGhlIG51bWJlciBvZiBhY3R1YWwgb3BlcmFuZHMgdGhhdCB3aWxsIGdvIGludG8gdGhlIHJlc3VsdGluZworICAvLy8gTWFjaGluZUluc3RyLgorICBzdGF0aWMgdW5zaWduZWQgQ291bnRPcGVyYW5kcyhTRE5vZGUgKk5vZGUpOworCisgIC8vLyBFbWl0RGJnVmFsdWUgLSBHZW5lcmF0ZSBtYWNoaW5lIGluc3RydWN0aW9uIGZvciBhIGRiZ192YWx1ZSBub2RlLgorICAvLy8KKyAgTWFjaGluZUluc3RyICpFbWl0RGJnVmFsdWUoU0REYmdWYWx1ZSAqU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwKTsKKworICAvLy8gRW1pdE5vZGUgLSBHZW5lcmF0ZSBtYWNoaW5lIGNvZGUgZm9yIGEgbm9kZSBhbmQgbmVlZGVkIGRlcGVuZGVuY2llcy4KKyAgLy8vCisgIHZvaWQgRW1pdE5vZGUoU0ROb2RlICpOb2RlLCBib29sIElzQ2xvbmUsIGJvb2wgSXNDbG9uZWQsCisgICAgICAgICAgICAgICAgRGVuc2VNYXA8U0RWYWx1ZSwgdW5zaWduZWQ+ICZWUkJhc2VNYXApIHsKKyAgICBpZiAoTm9kZS0+aXNNYWNoaW5lT3Bjb2RlKCkpCisgICAgICBFbWl0TWFjaGluZU5vZGUoTm9kZSwgSXNDbG9uZSwgSXNDbG9uZWQsIFZSQmFzZU1hcCk7CisgICAgZWxzZQorICAgICAgRW1pdFNwZWNpYWxOb2RlKE5vZGUsIElzQ2xvbmUsIElzQ2xvbmVkLCBWUkJhc2VNYXApOworICB9CisKKyAgLy8vIGdldEJsb2NrIC0gUmV0dXJuIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrLgorICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0QmxvY2soKSB7IHJldHVybiBNQkI7IH0KKworICAvLy8gZ2V0SW5zZXJ0UG9zIC0gUmV0dXJuIHRoZSBjdXJyZW50IGluc2VydGlvbiBwb3NpdGlvbi4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGdldEluc2VydFBvcygpIHsgcmV0dXJuIEluc2VydFBvczsgfQorCisgIC8vLyBJbnN0ckVtaXR0ZXIgLSBDb25zdHJ1Y3QgYW4gSW5zdHJFbWl0dGVyIGFuZCBzZXQgaXQgdG8gc3RhcnQgaW5zZXJ0aW5nCisgIC8vLyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGdpdmVuIGJsb2NrLgorICBJbnN0ckVtaXR0ZXIoTWFjaGluZUJhc2ljQmxvY2sgKm1iYiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGluc2VydHBvcyk7CisgIAorcHJpdmF0ZToKKyAgdm9pZCBFbWl0TWFjaGluZU5vZGUoU0ROb2RlICpOb2RlLCBib29sIElzQ2xvbmUsIGJvb2wgSXNDbG9uZWQsCisgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwKTsKKyAgdm9pZCBFbWl0U3BlY2lhbE5vZGUoU0ROb2RlICpOb2RlLCBib29sIElzQ2xvbmUsIGJvb2wgSXNDbG9uZWQsCisgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvTGVnYWxpemVEQUcuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplREFHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI4NTYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplREFHLmNwcApAQCAtMCwwICsxLDMzNzYgQEAKKy8vPT09LS0gTGVnYWxpemVEQUcuY3BwIC0gSW1wbGVtZW50IFNlbGVjdGlvbkRBRzo6TGVnYWxpemUgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNlbGVjdGlvbkRBRzo6TGVnYWxpemUgbWV0aG9kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gU2VsZWN0aW9uREFHTGVnYWxpemUgLSBUaGlzIHRha2VzIGFuIGFyYml0cmFyeSBTZWxlY3Rpb25EQUcgYXMgaW5wdXQgYW5kCisvLy8gaGFja3Mgb24gaXQgdW50aWwgdGhlIHRhcmdldCBtYWNoaW5lIGNhbiBoYW5kbGUgaXQuICBUaGlzIGludm9sdmVzCisvLy8gZWxpbWluYXRpbmcgdmFsdWUgc2l6ZXMgdGhlIG1hY2hpbmUgY2Fubm90IGhhbmRsZSAocHJvbW90aW5nIHNtYWxsIHNpemVzIHRvCisvLy8gbGFyZ2Ugc2l6ZXMgb3Igc3BsaXR0aW5nIHVwIGxhcmdlIHZhbHVlcyBpbnRvIHNtYWxsIHZhbHVlcykgYXMgd2VsbCBhcworLy8vIGVsaW1pbmF0aW5nIG9wZXJhdGlvbnMgdGhlIG1hY2hpbmUgY2Fubm90IGhhbmRsZS4KKy8vLworLy8vIFRoaXMgY29kZSBhbHNvIGRvZXMgYSBzbWFsbCBhbW91bnQgb2Ygb3B0aW1pemF0aW9uIGFuZCByZWNvZ25pdGlvbiBvZiBpZGlvbXMKKy8vLyBhcyBwYXJ0IG9mIGl0cyBwcm9jZXNzaW5nLiAgRm9yIGV4YW1wbGUsIGlmIGEgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgYQorLy8vICdzZXRjYycgaW5zdHJ1Y3Rpb24gZWZmaWNpZW50bHksIGJ1dCBkb2VzIHN1cHBvcnQgJ2JyY2MnIGluc3RydWN0aW9uLCB0aGlzCisvLy8gd2lsbCBhdHRlbXB0IG1lcmdlIHNldGNjIGFuZCBicmMgaW5zdHJ1Y3Rpb25zIGludG8gYnJjYydzLgorLy8vCituYW1lc3BhY2UgeworY2xhc3MgU2VsZWN0aW9uREFHTGVnYWxpemUgeworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSTsKKyAgU2VsZWN0aW9uREFHICZEQUc7CisgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsOworCisgIC8vIExpYmNhbGwgaW5zZXJ0aW9uIGhlbHBlcnMuCisKKyAgLy8vIExhc3RDQUxMU0VRX0VORCAtIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIENBTExTRVFfRU5EIG5vZGUgdGhhdCBoYXMgYmVlbgorICAvLy8gbGVnYWxpemVkLiAgV2UgdXNlIHRoaXMgdG8gZW5zdXJlIHRoYXQgY2FsbHMgYXJlIHByb3Blcmx5IHNlcmlhbGl6ZWQKKyAgLy8vIGFnYWluc3QgZWFjaCBvdGhlciwgaW5jbHVkaW5nIGluc2VydGVkIGxpYmNhbGxzLgorICBTRFZhbHVlIExhc3RDQUxMU0VRX0VORDsKKworICAvLy8gSXNMZWdhbGl6aW5nQ2FsbCAtIFRoaXMgbWVtYmVyIGlzIHVzZWQgKm9ubHkqIGZvciBwdXJwb3NlcyBvZiBwcm92aWRpbmcKKyAgLy8vIGhlbHBmdWwgYXNzZXJ0aW9ucyB0aGF0IGEgbGliY2FsbCBpc24ndCBjcmVhdGVkIHdoaWxlIGFub3RoZXIgY2FsbCBpcworICAvLy8gYmVpbmcgbGVnYWxpemVkICh3aGljaCBjb3VsZCBsZWFkIHRvIG5vbi1zZXJpYWxpemVkIGNhbGwgc2VxdWVuY2VzKS4KKyAgYm9vbCBJc0xlZ2FsaXppbmdDYWxsOworCisgIGVudW0gTGVnYWxpemVBY3Rpb24geworICAgIExlZ2FsLCAgICAgIC8vIFRoZSB0YXJnZXQgbmF0aXZlbHkgc3VwcG9ydHMgdGhpcyBvcGVyYXRpb24uCisgICAgUHJvbW90ZSwgICAgLy8gVGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIGluIGEgbGFyZ2VyIHR5cGUuCisgICAgRXhwYW5kICAgICAgLy8gVHJ5IHRvIGV4cGFuZCB0aGlzIHRvIG90aGVyIG9wcywgb3RoZXJ3aXNlIHVzZSBhIGxpYmNhbGwuCisgIH07CisKKyAgLy8vIFZhbHVlVHlwZUFjdGlvbnMgLSBUaGlzIGlzIGEgYml0dmVjdG9yIHRoYXQgY29udGFpbnMgdHdvIGJpdHMgZm9yIGVhY2gKKyAgLy8vIHZhbHVlIHR5cGUsIHdoZXJlIHRoZSB0d28gYml0cyBjb3JyZXNwb25kIHRvIHRoZSBMZWdhbGl6ZUFjdGlvbiBlbnVtLgorICAvLy8gVGhpcyBjYW4gYmUgcXVlcmllZCB3aXRoICJnZXRUeXBlQWN0aW9uKFZUKSIuCisgIFRhcmdldExvd2VyaW5nOjpWYWx1ZVR5cGVBY3Rpb25JbXBsIFZhbHVlVHlwZUFjdGlvbnM7CisKKyAgLy8vIExlZ2FsaXplZE5vZGVzIC0gRm9yIG5vZGVzIHRoYXQgYXJlIG9mIGxlZ2FsIHdpZHRoLCBhbmQgdGhhdCBoYXZlIG1vcmUKKyAgLy8vIHRoYW4gb25lIHVzZSwgdGhpcyBtYXAgaW5kaWNhdGVzIHdoYXQgcmVndWxhcml6ZWQgb3BlcmFuZCB0byB1c2UuICBUaGlzCisgIC8vLyBhbGxvd3MgdXMgdG8gYXZvaWQgbGVnYWxpemluZyB0aGUgc2FtZSB0aGluZyBtb3JlIHRoYW4gb25jZS4KKyAgRGVuc2VNYXA8U0RWYWx1ZSwgU0RWYWx1ZT4gTGVnYWxpemVkTm9kZXM7CisKKyAgdm9pZCBBZGRMZWdhbGl6ZWRPcGVyYW5kKFNEVmFsdWUgRnJvbSwgU0RWYWx1ZSBUbykgeworICAgIExlZ2FsaXplZE5vZGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihGcm9tLCBUbykpOworICAgIC8vIElmIHNvbWVvbmUgcmVxdWVzdHMgbGVnYWxpemF0aW9uIG9mIHRoZSBuZXcgbm9kZSwgcmV0dXJuIGl0c2VsZi4KKyAgICBpZiAoRnJvbSAhPSBUbykKKyAgICAgIExlZ2FsaXplZE5vZGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihUbywgVG8pKTsKKyAgfQorCitwdWJsaWM6CisgIFNlbGVjdGlvbkRBR0xlZ2FsaXplKFNlbGVjdGlvbkRBRyAmREFHLCBDb2RlR2VuT3B0OjpMZXZlbCBvbCk7CisKKyAgLy8vIGdldFR5cGVBY3Rpb24gLSBSZXR1cm4gaG93IHdlIHNob3VsZCBsZWdhbGl6ZSB2YWx1ZXMgb2YgdGhpcyB0eXBlLCBlaXRoZXIKKyAgLy8vIGl0IGlzIGFscmVhZHkgbGVnYWwgb3Igd2UgbmVlZCB0byBleHBhbmQgaXQgaW50byBtdWx0aXBsZSByZWdpc3RlcnMgb2YKKyAgLy8vIHNtYWxsZXIgaW50ZWdlciB0eXBlLCBvciB3ZSBuZWVkIHRvIHByb21vdGUgaXQgdG8gYSBsYXJnZXIgdHlwZS4KKyAgTGVnYWxpemVBY3Rpb24gZ2V0VHlwZUFjdGlvbihFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4KKyAgICAgICAgKExlZ2FsaXplQWN0aW9uKVZhbHVlVHlwZUFjdGlvbnMuZ2V0VHlwZUFjdGlvbigqREFHLmdldENvbnRleHQoKSwgVlQpOworICB9CisKKyAgLy8vIGlzVHlwZUxlZ2FsIC0gUmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIGlzIGxlZ2FsIG9uIHRoaXMgdGFyZ2V0LgorICAvLy8KKyAgYm9vbCBpc1R5cGVMZWdhbChFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZUFjdGlvbihWVCkgPT0gTGVnYWw7CisgIH0KKworICB2b2lkIExlZ2FsaXplREFHKCk7CisKK3ByaXZhdGU6CisgIC8vLyBMZWdhbGl6ZU9wIC0gV2Uga25vdyB0aGF0IHRoZSBzcGVjaWZpZWQgdmFsdWUgaGFzIGEgbGVnYWwgdHlwZS4KKyAgLy8vIFJlY3Vyc2l2ZWx5IGVuc3VyZSB0aGF0IHRoZSBvcGVyYW5kcyBoYXZlIGxlZ2FsIHR5cGVzLCB0aGVuIHJldHVybiB0aGUKKyAgLy8vIHJlc3VsdC4KKyAgU0RWYWx1ZSBMZWdhbGl6ZU9wKFNEVmFsdWUgTyk7CisKKyAgU0RWYWx1ZSBPcHRpbWl6ZUZsb2F0U3RvcmUoU3RvcmVTRE5vZGUgKlNUKTsKKworICAvLy8gUGVyZm9ybUluc2VydFZlY3RvckVsdEluTWVtb3J5IC0gU29tZSB0YXJnZXQgY2Fubm90IGhhbmRsZSBhIHZhcmlhYmxlCisgIC8vLyBpbnNlcnRpb24gaW5kZXggZm9yIHRoZSBJTlNFUlRfVkVDVE9SX0VMVCBpbnN0cnVjdGlvbi4gIEluIHRoaXMgY2FzZSwgaXQKKyAgLy8vIGlzIG5lY2Vzc2FyeSB0byBzcGlsbCB0aGUgdmVjdG9yIGJlaW5nIGluc2VydGVkIGludG8gdG8gbWVtb3J5LCBwZXJmb3JtCisgIC8vLyB0aGUgaW5zZXJ0IHRoZXJlLCBhbmQgdGhlbiByZWFkIHRoZSByZXN1bHQgYmFjay4KKyAgU0RWYWx1ZSBQZXJmb3JtSW5zZXJ0VmVjdG9yRWx0SW5NZW1vcnkoU0RWYWx1ZSBWZWMsIFNEVmFsdWUgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIElkeCwgRGVidWdMb2MgZGwpOworICBTRFZhbHVlIEV4cGFuZElOU0VSVF9WRUNUT1JfRUxUKFNEVmFsdWUgVmVjLCBTRFZhbHVlIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIElkeCwgRGVidWdMb2MgZGwpOworCisgIC8vLyBTaHVmZmxlV2l0aE5hcnJvd2VyRWx0VHlwZSAtIFJldHVybiBhIHZlY3RvciBzaHVmZmxlIG9wZXJhdGlvbiB3aGljaAorICAvLy8gcGVyZm9ybXMgdGhlIHNhbWUgc2h1ZmZlIGluIHRlcm1zIG9mIG9yZGVyIG9yIHJlc3VsdCBieXRlcywgYnV0IG9uIGEgdHlwZQorICAvLy8gd2hvc2UgdmVjdG9yIGVsZW1lbnQgdHlwZSBpcyBuYXJyb3dlciB0aGFuIHRoZSBvcmlnaW5hbCBzaHVmZmxlIHR5cGUuCisgIC8vLyBlLmcuIDx2NGkzMj4gPDAsIDEsIDAsIDE+IC0+IHY4aTE2IDwwLCAxLCAyLCAzLCAwLCAxLCAyLCAzPgorICBTRFZhbHVlIFNodWZmbGVXaXRoTmFycm93ZXJFbHRUeXBlKEVWVCBOVlQsIEVWVCBWVCwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaykgY29uc3Q7CisKKyAgYm9vbCBMZWdhbGl6ZUFsbE5vZGVzTm90TGVhZGluZ1RvKFNETm9kZSAqTiwgU0ROb2RlICpEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8U0ROb2RlKiwgMzI+ICZOb2Rlc0xlYWRpbmdUbyk7CisKKyAgdm9pZCBMZWdhbGl6ZVNldENDQ29uZENvZGUoRVZUIFZULCBTRFZhbHVlICZMSFMsIFNEVmFsdWUgJlJIUywgU0RWYWx1ZSAmQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKTsKKworICBTRFZhbHVlIEV4cGFuZExpYkNhbGwoUlRMSUI6OkxpYmNhbGwgTEMsIFNETm9kZSAqTm9kZSwgYm9vbCBpc1NpZ25lZCk7CisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiBFeHBhbmRDaGFpbkxpYkNhbGwoUlRMSUI6OkxpYmNhbGwgTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlICpOb2RlLCBib29sIGlzU2lnbmVkKTsKKyAgU0RWYWx1ZSBFeHBhbmRGUExpYkNhbGwoU0ROb2RlICpOb2RlLCBSVExJQjo6TGliY2FsbCBDYWxsX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxpYmNhbGwgQ2FsbF9GNjQsIFJUTElCOjpMaWJjYWxsIENhbGxfRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TGliY2FsbCBDYWxsX1BQQ0YxMjgpOworICBTRFZhbHVlIEV4cGFuZEludExpYkNhbGwoU0ROb2RlICpOb2RlLCBib29sIGlzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxpYmNhbGwgQ2FsbF9JOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMaWJjYWxsIENhbGxfSTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxpYmNhbGwgQ2FsbF9JMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TGliY2FsbCBDYWxsX0k2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMaWJjYWxsIENhbGxfSTEyOCk7CisKKyAgU0RWYWx1ZSBFbWl0U3RhY2tDb252ZXJ0KFNEVmFsdWUgU3JjT3AsIEVWVCBTbG90VlQsIEVWVCBEZXN0VlQsIERlYnVnTG9jIGRsKTsKKyAgU0RWYWx1ZSBFeHBhbmRCVUlMRF9WRUNUT1IoU0ROb2RlICpOb2RlKTsKKyAgU0RWYWx1ZSBFeHBhbmRTQ0FMQVJfVE9fVkVDVE9SKFNETm9kZSAqTm9kZSk7CisgIHZvaWQgRXhwYW5kRFlOQU1JQ19TVEFDS0FMTE9DKFNETm9kZSAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZXN1bHRzKTsKKyAgU0RWYWx1ZSBFeHBhbmRGQ09QWVNJR04oU0ROb2RlICpOb2RlKTsKKyAgU0RWYWx1ZSBFeHBhbmRMZWdhbElOVF9UT19GUChib29sIGlzU2lnbmVkLCBTRFZhbHVlIExlZ2FsT3AsIEVWVCBEZXN0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpOworICBTRFZhbHVlIFByb21vdGVMZWdhbElOVF9UT19GUChTRFZhbHVlIExlZ2FsT3AsIEVWVCBEZXN0VlQsIGJvb2wgaXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKTsKKyAgU0RWYWx1ZSBQcm9tb3RlTGVnYWxGUF9UT19JTlQoU0RWYWx1ZSBMZWdhbE9wLCBFVlQgRGVzdFZULCBib29sIGlzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCk7CisKKyAgU0RWYWx1ZSBFeHBhbmRCU1dBUChTRFZhbHVlIE9wLCBEZWJ1Z0xvYyBkbCk7CisgIFNEVmFsdWUgRXhwYW5kQml0Q291bnQodW5zaWduZWQgT3BjLCBTRFZhbHVlIE9wLCBEZWJ1Z0xvYyBkbCk7CisKKyAgU0RWYWx1ZSBFeHBhbmRFeHRyYWN0RnJvbVZlY3RvclRocm91Z2hTdGFjayhTRFZhbHVlIE9wKTsKKyAgU0RWYWx1ZSBFeHBhbmRWZWN0b3JCdWlsZFRocm91Z2hTdGFjayhTRE5vZGUqIE5vZGUpOworCisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiBFeHBhbmRBdG9taWMoU0ROb2RlICpOb2RlKTsKKworICB2b2lkIEV4cGFuZE5vZGUoU0ROb2RlICpOb2RlLCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJlJlc3VsdHMpOworICB2b2lkIFByb21vdGVOb2RlKFNETm9kZSAqTm9kZSwgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZXN1bHRzKTsKK307Cit9CisKKy8vLyBTaHVmZmxlV2l0aE5hcnJvd2VyRWx0VHlwZSAtIFJldHVybiBhIHZlY3RvciBzaHVmZmxlIG9wZXJhdGlvbiB3aGljaAorLy8vIHBlcmZvcm1zIHRoZSBzYW1lIHNodWZmZSBpbiB0ZXJtcyBvZiBvcmRlciBvciByZXN1bHQgYnl0ZXMsIGJ1dCBvbiBhIHR5cGUKKy8vLyB3aG9zZSB2ZWN0b3IgZWxlbWVudCB0eXBlIGlzIG5hcnJvd2VyIHRoYW4gdGhlIG9yaWdpbmFsIHNodWZmbGUgdHlwZS4KKy8vLyBlLmcuIDx2NGkzMj4gPDAsIDEsIDAsIDE+IC0+IHY4aTE2IDwwLCAxLCAyLCAzLCAwLCAxLCAyLCAzPgorU0RWYWx1ZQorU2VsZWN0aW9uREFHTGVnYWxpemU6OlNodWZmbGVXaXRoTmFycm93ZXJFbHRUeXBlKEVWVCBOVlQsIEVWVCBWVCwgIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaykgY29uc3QgeworICB1bnNpZ25lZCBOdW1NYXNrRWx0cyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIHVuc2lnbmVkIE51bURlc3RFbHRzID0gTlZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIHVuc2lnbmVkIE51bUVsdHNHcm93dGggPSBOdW1EZXN0RWx0cyAvIE51bU1hc2tFbHRzOworCisgIGFzc2VydChOdW1FbHRzR3Jvd3RoICYmICJDYW5ub3QgcHJvbW90ZSB0byB2ZWN0b3IgdHlwZSB3aXRoIGZld2VyIGVsdHMhIik7CisKKyAgaWYgKE51bUVsdHNHcm93dGggPT0gMSkKKyAgICByZXR1cm4gREFHLmdldFZlY3RvclNodWZmbGUoTlZULCBkbCwgTjEsIE4yLCAmTWFza1swXSk7CisKKyAgU21hbGxWZWN0b3I8aW50LCA4PiBOZXdNYXNrOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bU1hc2tFbHRzOyArK2kpIHsKKyAgICBpbnQgSWR4ID0gTWFza1tpXTsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IE51bUVsdHNHcm93dGg7ICsraikgeworICAgICAgaWYgKElkeCA8IDApCisgICAgICAgIE5ld01hc2sucHVzaF9iYWNrKC0xKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTmV3TWFzay5wdXNoX2JhY2soSWR4ICogTnVtRWx0c0dyb3d0aCArIGopOworICAgIH0KKyAgfQorICBhc3NlcnQoTmV3TWFzay5zaXplKCkgPT0gTnVtRGVzdEVsdHMgJiYgIk5vbi1pbnRlZ2VyIE51bUVsdHNHcm93dGg/Iik7CisgIGFzc2VydChUTEkuaXNTaHVmZmxlTWFza0xlZ2FsKE5ld01hc2ssIE5WVCkgJiYgIlNodWZmbGUgbm90IGxlZ2FsPyIpOworICByZXR1cm4gREFHLmdldFZlY3RvclNodWZmbGUoTlZULCBkbCwgTjEsIE4yLCAmTmV3TWFza1swXSk7Cit9CisKK1NlbGVjdGlvbkRBR0xlZ2FsaXplOjpTZWxlY3Rpb25EQUdMZWdhbGl6ZShTZWxlY3Rpb25EQUcgJmRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBvbCkKKyAgOiBUTShkYWcuZ2V0VGFyZ2V0KCkpLCBUTEkoZGFnLmdldFRhcmdldExvd2VyaW5nSW5mbygpKSwKKyAgICBEQUcoZGFnKSwgT3B0TGV2ZWwob2wpLAorICAgIFZhbHVlVHlwZUFjdGlvbnMoVExJLmdldFZhbHVlVHlwZUFjdGlvbnMoKSkgeworICBhc3NlcnQoTVZUOjpMQVNUX1ZBTFVFVFlQRSA8PSBNVlQ6Ok1BWF9BTExPV0VEX1ZBTFVFVFlQRSAmJgorICAgICAgICAgIlRvbyBtYW55IHZhbHVlIHR5cGVzIGZvciBWYWx1ZVR5cGVBY3Rpb25zIHRvIGhvbGQhIik7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHTGVnYWxpemU6OkxlZ2FsaXplREFHKCkgeworICBMYXN0Q0FMTFNFUV9FTkQgPSBEQUcuZ2V0RW50cnlOb2RlKCk7CisgIElzTGVnYWxpemluZ0NhbGwgPSBmYWxzZTsKKworICAvLyBUaGUgbGVnYWxpemUgcHJvY2VzcyBpcyBpbmhlcmVudGx5IGEgYm90dG9tLXVwIHJlY3Vyc2l2ZSBwcm9jZXNzICh1c2VycworICAvLyBsZWdhbGl6ZSB0aGVpciB1c2VzIGJlZm9yZSB0aGVtc2VsdmVzKS4gIEdpdmVuIGluZmluaXRlIHN0YWNrIHNwYWNlLCB3ZQorICAvLyBjb3VsZCBqdXN0IHN0YXJ0IGxlZ2FsaXppbmcgb24gdGhlIHJvb3QgYW5kIHRyYXZlcnNlIHRoZSB3aG9sZSBncmFwaC4gIEluCisgIC8vIHByYWN0aWNlIGhvd2V2ZXIsIHRoaXMgY2F1c2VzIHVzIHRvIHJ1biBvdXQgb2Ygc3RhY2sgc3BhY2Ugb24gbGFyZ2UgYmFzaWMKKyAgLy8gYmxvY2tzLiAgVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCBjb21wdXRlIGFuIG9yZGVyaW5nIG9mIHRoZSBub2RlcyB3aGVyZSBlYWNoCisgIC8vIG5vZGUgaXMgb25seSBsZWdhbGl6ZWQgYWZ0ZXIgYWxsIG9mIGl0cyBvcGVyYW5kcyBhcmUgbGVnYWxpemVkLgorICBEQUcuQXNzaWduVG9wb2xvZ2ljYWxPcmRlcigpOworICBmb3IgKFNlbGVjdGlvbkRBRzo6YWxsbm9kZXNfaXRlcmF0b3IgSSA9IERBRy5hbGxub2Rlc19iZWdpbigpLAorICAgICAgIEUgPSBwcmlvcihEQUcuYWxsbm9kZXNfZW5kKCkpOyBJICE9IGxsdm06Om5leHQoRSk7ICsrSSkKKyAgICBMZWdhbGl6ZU9wKFNEVmFsdWUoSSwgMCkpOworCisgIC8vIEZpbmFsbHksIGl0J3MgcG9zc2libGUgdGhlIHJvb3QgY2hhbmdlZC4gIEdldCB0aGUgbmV3IHJvb3QuCisgIFNEVmFsdWUgT2xkUm9vdCA9IERBRy5nZXRSb290KCk7CisgIGFzc2VydChMZWdhbGl6ZWROb2Rlcy5jb3VudChPbGRSb290KSAmJiAiUm9vdCBkaWRuJ3QgZ2V0IGxlZ2FsaXplZD8iKTsKKyAgREFHLnNldFJvb3QoTGVnYWxpemVkTm9kZXNbT2xkUm9vdF0pOworCisgIExlZ2FsaXplZE5vZGVzLmNsZWFyKCk7CisKKyAgLy8gUmVtb3ZlIGRlYWQgbm9kZXMgbm93LgorICBEQUcuUmVtb3ZlRGVhZE5vZGVzKCk7Cit9CisKKworLy8vIEZpbmRDYWxsRW5kRnJvbUNhbGxTdGFydCAtIEdpdmVuIGEgY2hhaW5lZCBub2RlIHRoYXQgaXMgcGFydCBvZiBhIGNhbGwKKy8vLyBzZXF1ZW5jZSwgZmluZCB0aGUgQ0FMTFNFUV9FTkQgbm9kZSB0aGF0IHRlcm1pbmF0ZXMgdGhlIGNhbGwgc2VxdWVuY2UuCitzdGF0aWMgU0ROb2RlICpGaW5kQ2FsbEVuZEZyb21DYWxsU3RhcnQoU0ROb2RlICpOb2RlKSB7CisgIGlmIChOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNBTExTRVFfRU5EKQorICAgIHJldHVybiBOb2RlOworICBpZiAoTm9kZS0+dXNlX2VtcHR5KCkpCisgICAgcmV0dXJuIDA7ICAgLy8gTm8gQ2FsbFNlcUVuZAorCisgIC8vIFRoZSBjaGFpbiBpcyB1c3VhbGx5IGF0IHRoZSBlbmQuCisgIFNEVmFsdWUgVGhlQ2hhaW4oTm9kZSwgTm9kZS0+Z2V0TnVtVmFsdWVzKCktMSk7CisgIGlmIChUaGVDaGFpbi5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6Ok90aGVyKSB7CisgICAgLy8gU29tZXRpbWVzIGl0J3MgYXQgdGhlIGJlZ2lubmluZy4KKyAgICBUaGVDaGFpbiA9IFNEVmFsdWUoTm9kZSwgMCk7CisgICAgaWYgKFRoZUNoYWluLmdldFZhbHVlVHlwZSgpICE9IE1WVDo6T3RoZXIpIHsKKyAgICAgIC8vIE90aGVyd2lzZSwgaHVudCBmb3IgaXQuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gTm9kZS0+Z2V0TnVtVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoTm9kZS0+Z2V0VmFsdWVUeXBlKGkpID09IE1WVDo6T3RoZXIpIHsKKyAgICAgICAgICBUaGVDaGFpbiA9IFNEVmFsdWUoTm9kZSwgaSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSB3YWxrZWQgaW50byBhIG5vZGUgd2l0aG91dCBhIGNoYWluLgorICAgICAgaWYgKFRoZUNoYWluLmdldFZhbHVlVHlwZSgpICE9IE1WVDo6T3RoZXIpCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBOb2RlLT51c2VfYmVnaW4oKSwKKyAgICAgICBFID0gTm9kZS0+dXNlX2VuZCgpOyBVSSAhPSBFOyArK1VJKSB7CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gb25seSBmb2xsb3cgdXNlcnMgb2Ygb3VyIHRva2VuIGNoYWluLgorICAgIFNETm9kZSAqVXNlciA9ICpVSTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVXNlci0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVXNlci0+Z2V0T3BlcmFuZChpKSA9PSBUaGVDaGFpbikKKyAgICAgICAgaWYgKFNETm9kZSAqUmVzdWx0ID0gRmluZENhbGxFbmRGcm9tQ2FsbFN0YXJ0KFVzZXIpKQorICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBGaW5kQ2FsbFN0YXJ0RnJvbUNhbGxFbmQgLSBHaXZlbiBhIGNoYWluZWQgbm9kZSB0aGF0IGlzIHBhcnQgb2YgYSBjYWxsCisvLy8gc2VxdWVuY2UsIGZpbmQgdGhlIENBTExTRVFfU1RBUlQgbm9kZSB0aGF0IGluaXRpYXRlcyB0aGUgY2FsbCBzZXF1ZW5jZS4KK3N0YXRpYyBTRE5vZGUgKkZpbmRDYWxsU3RhcnRGcm9tQ2FsbEVuZChTRE5vZGUgKk5vZGUpIHsKKyAgYXNzZXJ0KE5vZGUgJiYgIkRpZG4ndCBmaW5kIGNhbGxzZXFfc3RhcnQgZm9yIGEgY2FsbD8/Iik7CisgIGlmIChOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNBTExTRVFfU1RBUlQpIHJldHVybiBOb2RlOworCisgIGFzc2VydChOb2RlLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpID09IE1WVDo6T3RoZXIgJiYKKyAgICAgICAgICJOb2RlIGRvZXNuJ3QgaGF2ZSBhIHRva2VuIGNoYWluIGFyZ3VtZW50ISIpOworICByZXR1cm4gRmluZENhbGxTdGFydEZyb21DYWxsRW5kKE5vZGUtPmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpKTsKK30KKworLy8vIExlZ2FsaXplQWxsTm9kZXNOb3RMZWFkaW5nVG8gLSBSZWN1cnNpdmVseSB3YWxrIHRoZSB1c2VzIG9mIE4sIGxvb2tpbmcgdG8KKy8vLyBzZWUgaWYgYW55IHVzZXMgY2FuIHJlYWNoIERlc3QuICBJZiBubyBkZXN0IG9wZXJhbmRzIGNhbiBnZXQgdG8gZGVzdCwKKy8vLyBsZWdhbGl6ZSB0aGVtLCBsZWdhbGl6ZSBvdXJzZWxmLCBhbmQgcmV0dXJuIGZhbHNlLCBvdGhlcndpc2UsIHJldHVybiB0cnVlLgorLy8vCisvLy8gS2VlcCB0cmFjayBvZiB0aGUgbm9kZXMgd2UgZmluZSB0aGF0IGFjdHVhbGx5IGRvIGxlYWQgdG8gRGVzdCBpbgorLy8vIE5vZGVzTGVhZGluZ1RvLiAgVGhpcyBhdm9pZHMgcmV0cmF2ZXJzaW5nIHRoZW0gZXhwb25lbnRpYWwgbnVtYmVyIG9mIHRpbWVzLgorLy8vCitib29sIFNlbGVjdGlvbkRBR0xlZ2FsaXplOjpMZWdhbGl6ZUFsbE5vZGVzTm90TGVhZGluZ1RvKFNETm9kZSAqTiwgU0ROb2RlICpEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PFNETm9kZSosIDMyPiAmTm9kZXNMZWFkaW5nVG8pIHsKKyAgaWYgKE4gPT0gRGVzdCkgcmV0dXJuIHRydWU7ICAvLyBOIGNlcnRhaW5seSBsZWFkcyB0byBEZXN0IDopCisKKyAgLy8gSWYgd2UndmUgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBub2RlIGFuZCBpdCBkb2VzIGxlYWQgdG8gRGVzdCwgdGhlcmUgaXMgbm8KKyAgLy8gbmVlZCB0byByZXByb2Nlc3MgaXQuCisgIGlmIChOb2Rlc0xlYWRpbmdUby5jb3VudChOKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gSWYgdGhlIGZpcnN0IHJlc3VsdCBvZiB0aGlzIG5vZGUgaGFzIGJlZW4gYWxyZWFkeSBsZWdhbGl6ZWQsIHRoZW4gaXQgY2Fubm90CisgIC8vIHJlYWNoIE4uCisgIGlmIChMZWdhbGl6ZWROb2Rlcy5jb3VudChTRFZhbHVlKE4sIDApKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIE9rYXksIHRoaXMgbm9kZSBoYXMgbm90IGFscmVhZHkgYmVlbiBsZWdhbGl6ZWQuICBDaGVjayBhbmQgbGVnYWxpemUgYWxsCisgIC8vIG9wZXJhbmRzLiAgSWYgbm9uZSBsZWFkIHRvIERlc3QsIHRoZW4gd2UgY2FuIGxlZ2FsaXplIHRoaXMgbm9kZS4KKyAgYm9vbCBPcGVyYW5kc0xlYWRUb0Rlc3QgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgIE9wZXJhbmRzTGVhZFRvRGVzdCB8PSAgICAgLy8gSWYgYW4gb3BlcmFuZCBsZWFkcyB0byBEZXN0LCBzbyBkbyB3ZS4KKyAgICAgIExlZ2FsaXplQWxsTm9kZXNOb3RMZWFkaW5nVG8oTi0+Z2V0T3BlcmFuZChpKS5nZXROb2RlKCksIERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVzTGVhZGluZ1RvKTsKKworICBpZiAoT3BlcmFuZHNMZWFkVG9EZXN0KSB7CisgICAgTm9kZXNMZWFkaW5nVG8uaW5zZXJ0KE4pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gT2theSwgdGhpcyBub2RlIGxvb2tzIHNhZmUsIGxlZ2FsaXplIGl0IGFuZCByZXR1cm4gZmFsc2UuCisgIExlZ2FsaXplT3AoU0RWYWx1ZShOLCAwKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEV4cGFuZENvbnN0YW50RlAgLSBFeHBhbmRzIHRoZSBDb25zdGFudEZQIG5vZGUgdG8gYW4gaW50ZWdlciBjb25zdGFudCBvcgorLy8vIGEgbG9hZCBmcm9tIHRoZSBjb25zdGFudCBwb29sLgorc3RhdGljIFNEVmFsdWUgRXhwYW5kQ29uc3RhbnRGUChDb25zdGFudEZQU0ROb2RlICpDRlAsIGJvb2wgVXNlQ1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLCBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJKSB7CisgIGJvb2wgRXh0ZW5kID0gZmFsc2U7CisgIERlYnVnTG9jIGRsID0gQ0ZQLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIElmIGEgRlAgaW1tZWRpYXRlIGlzIHByZWNpc2Ugd2hlbiByZXByZXNlbnRlZCBhcyBhIGZsb2F0IGFuZCBpZiB0aGUKKyAgLy8gdGFyZ2V0IGNhbiBkbyBhbiBleHRlbmRpbmcgbG9hZCBmcm9tIGZsb2F0IHRvIGRvdWJsZSwgd2UgcHV0IGl0IGludG8KKyAgLy8gdGhlIGNvbnN0YW50IHBvb2wgYXMgYSBmbG9hdCwgZXZlbiBpZiBpdCdzIGlzIHN0YXRpY2FsbHkgdHlwZWQgYXMgYQorICAvLyBkb3VibGUuICBUaGlzIHNocmlua3MgRlAgY29uc3RhbnRzIGFuZCBjYW5vbmljYWxpemVzIHRoZW0gZm9yIHRhcmdldHMgd2hlcmUKKyAgLy8gYW4gRlAgZXh0ZW5kaW5nIGxvYWQgaXMgdGhlIHNhbWUgY29zdCBhcyBhIG5vcm1hbCBsb2FkIChzdWNoIGFzIG9uIHRoZSB4ODcKKyAgLy8gZnAgc3RhY2sgb3IgUFBDIEZQIHVuaXQpLgorICBFVlQgVlQgPSBDRlAtPmdldFZhbHVlVHlwZSgwKTsKKyAgQ29uc3RhbnRGUCAqTExWTUMgPSBjb25zdF9jYXN0PENvbnN0YW50RlAqPihDRlAtPmdldENvbnN0YW50RlBWYWx1ZSgpKTsKKyAgaWYgKCFVc2VDUCkgeworICAgIGFzc2VydCgoVlQgPT0gTVZUOjpmNjQgfHwgVlQgPT0gTVZUOjpmMzIpICYmICJJbnZhbGlkIHR5cGUgZXhwYW5zaW9uIik7CisgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudChMTFZNQy0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZUID09IE1WVDo6ZjY0KSA/IE1WVDo6aTY0IDogTVZUOjppMzIpOworICB9CisKKyAgRVZUIE9yaWdWVCA9IFZUOworICBFVlQgU1ZUID0gVlQ7CisgIHdoaWxlIChTVlQgIT0gTVZUOjpmMzIpIHsKKyAgICBTVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKFNWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5IC0gMSk7CisgICAgaWYgKENvbnN0YW50RlBTRE5vZGU6OmlzVmFsdWVWYWxpZEZvclR5cGUoU1ZULCBDRlAtPmdldFZhbHVlQVBGKCkpICYmCisgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBpZiB0aGUgdGFyZ2V0IGhhcyBhIG5hdGl2ZSBFWFRMT0FEIGluc3RydWN0aW9uIGZyb20KKyAgICAgICAgLy8gc21hbGxlciB0eXBlLgorICAgICAgICBUTEkuaXNMb2FkRXh0TGVnYWwoSVNEOjpFWFRMT0FELCBTVlQpICYmCisgICAgICAgIFRMSS5TaG91bGRTaHJpbmtGUENvbnN0YW50KE9yaWdWVCkpIHsKKyAgICAgIGNvbnN0IFR5cGUgKlNUeXBlID0gU1ZULmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpOworICAgICAgTExWTUMgPSBjYXN0PENvbnN0YW50RlA+KENvbnN0YW50RXhwcjo6Z2V0RlBUcnVuYyhMTFZNQywgU1R5cGUpKTsKKyAgICAgIFZUID0gU1ZUOworICAgICAgRXh0ZW5kID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBTRFZhbHVlIENQSWR4ID0gREFHLmdldENvbnN0YW50UG9vbChMTFZNQywgVExJLmdldFBvaW50ZXJUeSgpKTsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KENQSWR4KS0+Z2V0QWxpZ25tZW50KCk7CisgIGlmIChFeHRlbmQpCisgICAgcmV0dXJuIERBRy5nZXRFeHRMb2FkKElTRDo6RVhUTE9BRCwgT3JpZ1ZULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEVudHJ5Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUElkeCwgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBWVCwgZmFsc2UsIGZhbHNlLCBBbGlnbm1lbnQpOworICByZXR1cm4gREFHLmdldExvYWQoT3JpZ1ZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBDUElkeCwKKyAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50KTsKK30KKworLy8vIEV4cGFuZFVuYWxpZ25lZFN0b3JlIC0gRXhwYW5kcyBhbiB1bmFsaWduZWQgc3RvcmUgdG8gMiBoYWxmLXNpemUgc3RvcmVzLgorc3RhdGljCitTRFZhbHVlIEV4cGFuZFVuYWxpZ25lZFN0b3JlKFN0b3JlU0ROb2RlICpTVCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpIHsKKyAgU0RWYWx1ZSBDaGFpbiA9IFNULT5nZXRDaGFpbigpOworICBTRFZhbHVlIFB0ciA9IFNULT5nZXRCYXNlUHRyKCk7CisgIFNEVmFsdWUgVmFsID0gU1QtPmdldFZhbHVlKCk7CisgIEVWVCBWVCA9IFZhbC5nZXRWYWx1ZVR5cGUoKTsKKyAgaW50IEFsaWdubWVudCA9IFNULT5nZXRBbGlnbm1lbnQoKTsKKyAgaW50IFNWT2Zmc2V0ID0gU1QtPmdldFNyY1ZhbHVlT2Zmc2V0KCk7CisgIERlYnVnTG9jIGRsID0gU1QtPmdldERlYnVnTG9jKCk7CisgIGlmIChTVC0+Z2V0TWVtb3J5VlQoKS5pc0Zsb2F0aW5nUG9pbnQoKSB8fAorICAgICAgU1QtPmdldE1lbW9yeVZUKCkuaXNWZWN0b3IoKSkgeworICAgIEVWVCBpbnRWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIGlmIChUTEkuaXNUeXBlTGVnYWwoaW50VlQpKSB7CisgICAgICAvLyBFeHBhbmQgdG8gYSBiaXRjb252ZXJ0IG9mIHRoZSB2YWx1ZSB0byB0aGUgaW50ZWdlciB0eXBlIG9mIHRoZQorICAgICAgLy8gc2FtZSBzaXplLCB0aGVuIGEgKG1pc2FsaWduZWQpIGludCBzdG9yZS4KKyAgICAgIC8vIEZJWE1FOiBEb2VzIG5vdCBoYW5kbGUgdHJ1bmNhdGluZyBmbG9hdGluZyBwb2ludCBzdG9yZXMhCisgICAgICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBpbnRWVCwgVmFsKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBSZXN1bHQsIFB0ciwgU1QtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0LCBTVC0+aXNWb2xhdGlsZSgpLCBTVC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBEbyBhIChhbGlnbmVkKSBzdG9yZSB0byBhIHN0YWNrIHNsb3QsIHRoZW4gY29weSBmcm9tIHRoZSBzdGFjayBzbG90CisgICAgICAvLyB0byB0aGUgZmluYWwgZGVzdGluYXRpb24gdXNpbmcgKHVuYWxpZ25lZCkgaW50ZWdlciBsb2FkcyBhbmQgc3RvcmVzLgorICAgICAgRVZUIFN0b3JlZFZUID0gU1QtPmdldE1lbW9yeVZUKCk7CisgICAgICBFVlQgUmVnVlQgPQorICAgICAgICBUTEkuZ2V0UmVnaXN0ZXJUeXBlKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlZFZULmdldFNpemVJbkJpdHMoKSkpOworICAgICAgdW5zaWduZWQgU3RvcmVkQnl0ZXMgPSBTdG9yZWRWVC5nZXRTaXplSW5CaXRzKCkgLyA4OworICAgICAgdW5zaWduZWQgUmVnQnl0ZXMgPSBSZWdWVC5nZXRTaXplSW5CaXRzKCkgLyA4OworICAgICAgdW5zaWduZWQgTnVtUmVncyA9IChTdG9yZWRCeXRlcyArIFJlZ0J5dGVzIC0gMSkgLyBSZWdCeXRlczsKKworICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzdGFjayBzbG90IGlzIGFsc28gYWxpZ25lZCBmb3IgdGhlIHJlZ2lzdGVyIHR5cGUuCisgICAgICBTRFZhbHVlIFN0YWNrUHRyID0gREFHLkNyZWF0ZVN0YWNrVGVtcG9yYXJ5KFN0b3JlZFZULCBSZWdWVCk7CisKKyAgICAgIC8vIFBlcmZvcm0gdGhlIG9yaWdpbmFsIHN0b3JlLCBvbmx5IHJlZGlyZWN0ZWQgdG8gdGhlIHN0YWNrIHNsb3QuCisgICAgICBTRFZhbHVlIFN0b3JlID0gREFHLmdldFRydW5jU3RvcmUoQ2hhaW4sIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbCwgU3RhY2tQdHIsIE5VTEwsIDAsIFN0b3JlZFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICBTRFZhbHVlIEluY3JlbWVudCA9IERBRy5nZXRDb25zdGFudChSZWdCeXRlcywgVExJLmdldFBvaW50ZXJUeSgpKTsKKyAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IFN0b3JlczsKKyAgICAgIHVuc2lnbmVkIE9mZnNldCA9IDA7CisKKyAgICAgIC8vIERvIGFsbCBidXQgb25lIGNvcGllcyB1c2luZyB0aGUgZnVsbCByZWdpc3RlciB3aWR0aC4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBOdW1SZWdzOyBpKyspIHsKKyAgICAgICAgLy8gTG9hZCBvbmUgaW50ZWdlciByZWdpc3RlcidzIHdvcnRoIGZyb20gdGhlIHN0YWNrIHNsb3QuCisgICAgICAgIFNEVmFsdWUgTG9hZCA9IERBRy5nZXRMb2FkKFJlZ1ZULCBkbCwgU3RvcmUsIFN0YWNrUHRyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICAvLyBTdG9yZSBpdCB0byB0aGUgZmluYWwgbG9jYXRpb24uICBSZW1lbWJlciB0aGUgc3RvcmUuCisgICAgICAgIFN0b3Jlcy5wdXNoX2JhY2soREFHLmdldFN0b3JlKExvYWQuZ2V0VmFsdWUoMSksIGRsLCBMb2FkLCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCArIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmlzVm9sYXRpbGUoKSwgU1QtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluQWxpZ24oU1QtPmdldEFsaWdubWVudCgpLCBPZmZzZXQpKSk7CisgICAgICAgIC8vIEluY3JlbWVudCB0aGUgcG9pbnRlcnMuCisgICAgICAgIE9mZnNldCArPSBSZWdCeXRlczsKKyAgICAgICAgU3RhY2tQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFN0YWNrUHRyLmdldFZhbHVlVHlwZSgpLCBTdGFja1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnQpOworICAgICAgICBQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0ci5nZXRWYWx1ZVR5cGUoKSwgUHRyLCBJbmNyZW1lbnQpOworICAgICAgfQorCisgICAgICAvLyBUaGUgbGFzdCBzdG9yZSBtYXkgYmUgcGFydGlhbC4gIERvIGEgdHJ1bmNhdGluZyBzdG9yZS4gIE9uIGJpZy1lbmRpYW4KKyAgICAgIC8vIG1hY2hpbmVzIHRoaXMgcmVxdWlyZXMgYW4gZXh0ZW5kaW5nIGxvYWQgZnJvbSB0aGUgc3RhY2sgc2xvdCB0byBlbnN1cmUKKyAgICAgIC8vIHRoYXQgdGhlIGJpdHMgYXJlIGluIHRoZSByaWdodCBwbGFjZS4KKyAgICAgIEVWVCBNZW1WVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAqIChTdG9yZWRCeXRlcyAtIE9mZnNldCkpOworCisgICAgICAvLyBMb2FkIGZyb20gdGhlIHN0YWNrIHNsb3QuCisgICAgICBTRFZhbHVlIExvYWQgPSBEQUcuZ2V0RXh0TG9hZChJU0Q6OkVYVExPQUQsIFJlZ1ZULCBkbCwgU3RvcmUsIFN0YWNrUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTWVtVlQsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgIFN0b3Jlcy5wdXNoX2JhY2soREFHLmdldFRydW5jU3RvcmUoTG9hZC5nZXRWYWx1ZSgxKSwgZGwsIExvYWQsIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldFNyY1ZhbHVlKCksIFNWT2Zmc2V0ICsgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1WVCwgU1QtPmlzVm9sYXRpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluQWxpZ24oU1QtPmdldEFsaWdubWVudCgpLCBPZmZzZXQpKSk7CisgICAgICAvLyBUaGUgb3JkZXIgb2YgdGhlIHN0b3JlcyBkb2Vzbid0IG1hdHRlciAtIHNheSBpdCB3aXRoIGEgVG9rZW5GYWN0b3IuCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsICZTdG9yZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVzLnNpemUoKSk7CisgICAgfQorICB9CisgIGFzc2VydChTVC0+Z2V0TWVtb3J5VlQoKS5pc0ludGVnZXIoKSAmJgorICAgICAgICAgIVNULT5nZXRNZW1vcnlWVCgpLmlzVmVjdG9yKCkgJiYKKyAgICAgICAgICJVbmFsaWduZWQgc3RvcmUgb2YgdW5rbm93biB0eXBlLiIpOworICAvLyBHZXQgdGhlIGhhbGYtc2l6ZSBWVAorICBFVlQgTmV3U3RvcmVkVlQgPSBTVC0+Z2V0TWVtb3J5VlQoKS5nZXRIYWxmU2l6ZWRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCkpOworICBpbnQgTnVtQml0cyA9IE5ld1N0b3JlZFZULmdldFNpemVJbkJpdHMoKTsKKyAgaW50IEluY3JlbWVudFNpemUgPSBOdW1CaXRzIC8gODsKKworICAvLyBEaXZpZGUgdGhlIHN0b3JlZCB2YWx1ZSBpbiB0d28gcGFydHMuCisgIFNEVmFsdWUgU2hpZnRBbW91bnQgPSBEQUcuZ2V0Q29uc3RhbnQoTnVtQml0cywgVExJLmdldFNoaWZ0QW1vdW50VHkoKSk7CisgIFNEVmFsdWUgTG8gPSBWYWw7CisgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIFZULCBWYWwsIFNoaWZ0QW1vdW50KTsKKworICAvLyBTdG9yZSB0aGUgdHdvIHBhcnRzCisgIFNEVmFsdWUgU3RvcmUxLCBTdG9yZTI7CisgIFN0b3JlMSA9IERBRy5nZXRUcnVuY1N0b3JlKENoYWluLCBkbCwgVExJLmlzTGl0dGxlRW5kaWFuKCk/TG86SGksIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldFNyY1ZhbHVlKCksIFNWT2Zmc2V0LCBOZXdTdG9yZWRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmlzVm9sYXRpbGUoKSwgU1QtPmlzTm9uVGVtcG9yYWwoKSwgQWxpZ25tZW50KTsKKyAgUHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHIuZ2V0VmFsdWVUeXBlKCksIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEluY3JlbWVudFNpemUsIFRMSS5nZXRQb2ludGVyVHkoKSkpOworICBBbGlnbm1lbnQgPSBNaW5BbGlnbihBbGlnbm1lbnQsIEluY3JlbWVudFNpemUpOworICBTdG9yZTIgPSBEQUcuZ2V0VHJ1bmNTdG9yZShDaGFpbiwgZGwsIFRMSS5pc0xpdHRsZUVuZGlhbigpP0hpOkxvLCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCArIEluY3JlbWVudFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1N0b3JlZFZULCBTVC0+aXNWb2xhdGlsZSgpLCBTVC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgU3RvcmUxLCBTdG9yZTIpOworfQorCisvLy8gRXhwYW5kVW5hbGlnbmVkTG9hZCAtIEV4cGFuZHMgYW4gdW5hbGlnbmVkIGxvYWQgdG8gMiBoYWxmLXNpemUgbG9hZHMuCitzdGF0aWMKK1NEVmFsdWUgRXhwYW5kVW5hbGlnbmVkTG9hZChMb2FkU0ROb2RlICpMRCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICBpbnQgU1ZPZmZzZXQgPSBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKTsKKyAgU0RWYWx1ZSBDaGFpbiA9IExELT5nZXRDaGFpbigpOworICBTRFZhbHVlIFB0ciA9IExELT5nZXRCYXNlUHRyKCk7CisgIEVWVCBWVCA9IExELT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBMb2FkZWRWVCA9IExELT5nZXRNZW1vcnlWVCgpOworICBEZWJ1Z0xvYyBkbCA9IExELT5nZXREZWJ1Z0xvYygpOworICBpZiAoVlQuaXNGbG9hdGluZ1BvaW50KCkgfHwgVlQuaXNWZWN0b3IoKSkgeworICAgIEVWVCBpbnRWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBMb2FkZWRWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIGlmIChUTEkuaXNUeXBlTGVnYWwoaW50VlQpKSB7CisgICAgICAvLyBFeHBhbmQgdG8gYSAobWlzYWxpZ25lZCkgaW50ZWdlciBsb2FkIG9mIHRoZSBzYW1lIHNpemUsCisgICAgICAvLyB0aGVuIGJpdGNvbnZlcnQgdG8gZmxvYXRpbmcgcG9pbnQgb3IgdmVjdG9yLgorICAgICAgU0RWYWx1ZSBuZXdMb2FkID0gREFHLmdldExvYWQoaW50VlQsIGRsLCBDaGFpbiwgUHRyLCBMRC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0LCBMRC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmlzTm9uVGVtcG9yYWwoKSwgTEQtPmdldEFsaWdubWVudCgpKTsKKyAgICAgIFNEVmFsdWUgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIExvYWRlZFZULCBuZXdMb2FkKTsKKyAgICAgIGlmIChWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJiBMb2FkZWRWVCAhPSBWVCkKKyAgICAgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpGUF9FWFRFTkQsIGRsLCBWVCwgUmVzdWx0KTsKKworICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgUmVzdWx0LCBDaGFpbiB9OworICAgICAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPcHMsIDIsIGRsKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ29weSB0aGUgdmFsdWUgdG8gYSAoYWxpZ25lZCkgc3RhY2sgc2xvdCB1c2luZyAodW5hbGlnbmVkKSBpbnRlZ2VyCisgICAgICAvLyBsb2FkcyBhbmQgc3RvcmVzLCB0aGVuIGRvIGEgKGFsaWduZWQpIGxvYWQgZnJvbSB0aGUgc3RhY2sgc2xvdC4KKyAgICAgIEVWVCBSZWdWVCA9IFRMSS5nZXRSZWdpc3RlclR5cGUoKkRBRy5nZXRDb250ZXh0KCksIGludFZUKTsKKyAgICAgIHVuc2lnbmVkIExvYWRlZEJ5dGVzID0gTG9hZGVkVlQuZ2V0U2l6ZUluQml0cygpIC8gODsKKyAgICAgIHVuc2lnbmVkIFJlZ0J5dGVzID0gUmVnVlQuZ2V0U2l6ZUluQml0cygpIC8gODsKKyAgICAgIHVuc2lnbmVkIE51bVJlZ3MgPSAoTG9hZGVkQnl0ZXMgKyBSZWdCeXRlcyAtIDEpIC8gUmVnQnl0ZXM7CisKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc3RhY2sgc2xvdCBpcyBhbHNvIGFsaWduZWQgZm9yIHRoZSByZWdpc3RlciB0eXBlLgorICAgICAgU0RWYWx1ZSBTdGFja0Jhc2UgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoTG9hZGVkVlQsIFJlZ1ZUKTsKKworICAgICAgU0RWYWx1ZSBJbmNyZW1lbnQgPSBEQUcuZ2V0Q29uc3RhbnQoUmVnQnl0ZXMsIFRMSS5nZXRQb2ludGVyVHkoKSk7CisgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBTdG9yZXM7CisgICAgICBTRFZhbHVlIFN0YWNrUHRyID0gU3RhY2tCYXNlOworICAgICAgdW5zaWduZWQgT2Zmc2V0ID0gMDsKKworICAgICAgLy8gRG8gYWxsIGJ1dCBvbmUgY29waWVzIHVzaW5nIHRoZSBmdWxsIHJlZ2lzdGVyIHdpZHRoLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IE51bVJlZ3M7IGkrKykgeworICAgICAgICAvLyBMb2FkIG9uZSBpbnRlZ2VyIHJlZ2lzdGVyJ3Mgd29ydGggZnJvbSB0aGUgb3JpZ2luYWwgbG9jYXRpb24uCisgICAgICAgIFNEVmFsdWUgTG9hZCA9IERBRy5nZXRMb2FkKFJlZ1ZULCBkbCwgQ2hhaW4sIFB0ciwgTEQtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0ICsgT2Zmc2V0LCBMRC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5BbGlnbihMRC0+Z2V0QWxpZ25tZW50KCksIE9mZnNldCkpOworICAgICAgICAvLyBGb2xsb3cgdGhlIGxvYWQgd2l0aCBhIHN0b3JlIHRvIHRoZSBzdGFjayBzbG90LiAgUmVtZW1iZXIgdGhlIHN0b3JlLgorICAgICAgICBTdG9yZXMucHVzaF9iYWNrKERBRy5nZXRTdG9yZShMb2FkLmdldFZhbHVlKDEpLCBkbCwgTG9hZCwgU3RhY2tQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSwgMCkpOworICAgICAgICAvLyBJbmNyZW1lbnQgdGhlIHBvaW50ZXJzLgorICAgICAgICBPZmZzZXQgKz0gUmVnQnl0ZXM7CisgICAgICAgIFB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyLmdldFZhbHVlVHlwZSgpLCBQdHIsIEluY3JlbWVudCk7CisgICAgICAgIFN0YWNrUHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBTdGFja1B0ci5nZXRWYWx1ZVR5cGUoKSwgU3RhY2tQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50KTsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIGxhc3QgY29weSBtYXkgYmUgcGFydGlhbC4gIERvIGFuIGV4dGVuZGluZyBsb2FkLgorICAgICAgRVZUIE1lbVZUID0gRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICogKExvYWRlZEJ5dGVzIC0gT2Zmc2V0KSk7CisgICAgICBTRFZhbHVlIExvYWQgPSBEQUcuZ2V0RXh0TG9hZChJU0Q6OkVYVExPQUQsIFJlZ1ZULCBkbCwgQ2hhaW4sIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCArIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVZULCBMRC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbkFsaWduKExELT5nZXRBbGlnbm1lbnQoKSwgT2Zmc2V0KSk7CisgICAgICAvLyBGb2xsb3cgdGhlIGxvYWQgd2l0aCBhIHN0b3JlIHRvIHRoZSBzdGFjayBzbG90LiAgUmVtZW1iZXIgdGhlIHN0b3JlLgorICAgICAgLy8gT24gYmlnLWVuZGlhbiBtYWNoaW5lcyB0aGlzIHJlcXVpcmVzIGEgdHJ1bmNhdGluZyBzdG9yZSB0byBlbnN1cmUKKyAgICAgIC8vIHRoYXQgdGhlIGJpdHMgZW5kIHVwIGluIHRoZSByaWdodCBwbGFjZS4KKyAgICAgIFN0b3Jlcy5wdXNoX2JhY2soREFHLmdldFRydW5jU3RvcmUoTG9hZC5nZXRWYWx1ZSgxKSwgZGwsIExvYWQsIFN0YWNrUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBNZW1WVCwgZmFsc2UsIGZhbHNlLCAwKSk7CisKKyAgICAgIC8vIFRoZSBvcmRlciBvZiB0aGUgc3RvcmVzIGRvZXNuJ3QgbWF0dGVyIC0gc2F5IGl0IHdpdGggYSBUb2tlbkZhY3Rvci4KKyAgICAgIFNEVmFsdWUgVEYgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgJlN0b3Jlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZXMuc2l6ZSgpKTsKKworICAgICAgLy8gRmluYWxseSwgcGVyZm9ybSB0aGUgb3JpZ2luYWwgbG9hZCBvbmx5IHJlZGlyZWN0ZWQgdG8gdGhlIHN0YWNrIHNsb3QuCisgICAgICBMb2FkID0gREFHLmdldEV4dExvYWQoTEQtPmdldEV4dGVuc2lvblR5cGUoKSwgVlQsIGRsLCBURiwgU3RhY2tCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIExvYWRlZFZULCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgICAvLyBDYWxsZXJzIGV4cGVjdCBhIE1FUkdFX1ZBTFVFUyBub2RlLgorICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTG9hZCwgVEYgfTsKKyAgICAgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMoT3BzLCAyLCBkbCk7CisgICAgfQorICB9CisgIGFzc2VydChMb2FkZWRWVC5pc0ludGVnZXIoKSAmJiAhTG9hZGVkVlQuaXNWZWN0b3IoKSAmJgorICAgICAgICAgIlVuYWxpZ25lZCBsb2FkIG9mIHVuc3VwcG9ydGVkIHR5cGUuIik7CisKKyAgLy8gQ29tcHV0ZSB0aGUgbmV3IFZUIHRoYXQgaXMgaGFsZiB0aGUgc2l6ZSBvZiB0aGUgb2xkIG9uZS4gIFRoaXMgaXMgYW4KKyAgLy8gaW50ZWdlciBNVlQuCisgIHVuc2lnbmVkIE51bUJpdHMgPSBMb2FkZWRWVC5nZXRTaXplSW5CaXRzKCk7CisgIEVWVCBOZXdMb2FkZWRWVDsKKyAgTmV3TG9hZGVkVlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgTnVtQml0cy8yKTsKKyAgTnVtQml0cyA+Pj0gMTsKKworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBMRC0+Z2V0QWxpZ25tZW50KCk7CisgIHVuc2lnbmVkIEluY3JlbWVudFNpemUgPSBOdW1CaXRzIC8gODsKKyAgSVNEOjpMb2FkRXh0VHlwZSBIaUV4dFR5cGUgPSBMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpOworCisgIC8vIElmIHRoZSBvcmlnaW5hbCBsb2FkIGlzIE5PTl9FWFRMT0FELCB0aGUgaGkgcGFydCBsb2FkIG11c3QgYmUgWkVYVExPQUQuCisgIGlmIChIaUV4dFR5cGUgPT0gSVNEOjpOT05fRVhUTE9BRCkKKyAgICBIaUV4dFR5cGUgPSBJU0Q6OlpFWFRMT0FEOworCisgIC8vIExvYWQgdGhlIHZhbHVlIGluIHR3byBwYXJ0cworICBTRFZhbHVlIExvLCBIaTsKKyAgaWYgKFRMSS5pc0xpdHRsZUVuZGlhbigpKSB7CisgICAgTG8gPSBEQUcuZ2V0RXh0TG9hZChJU0Q6OlpFWFRMT0FELCBWVCwgZGwsIENoYWluLCBQdHIsIExELT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQsIE5ld0xvYWRlZFZULCBMRC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmlzTm9uVGVtcG9yYWwoKSwgQWxpZ25tZW50KTsKKyAgICBQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0ci5nZXRWYWx1ZVR5cGUoKSwgUHRyLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbmNyZW1lbnRTaXplLCBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgICBIaSA9IERBRy5nZXRFeHRMb2FkKEhpRXh0VHlwZSwgVlQsIGRsLCBDaGFpbiwgUHRyLCBMRC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0ICsgSW5jcmVtZW50U2l6ZSwgTmV3TG9hZGVkVlQsIExELT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBMRC0+aXNOb25UZW1wb3JhbCgpLCBNaW5BbGlnbihBbGlnbm1lbnQsSW5jcmVtZW50U2l6ZSkpOworICB9IGVsc2UgeworICAgIEhpID0gREFHLmdldEV4dExvYWQoSGlFeHRUeXBlLCBWVCwgZGwsIENoYWluLCBQdHIsIExELT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQsIE5ld0xvYWRlZFZULCBMRC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmlzTm9uVGVtcG9yYWwoKSwgQWxpZ25tZW50KTsKKyAgICBQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0ci5nZXRWYWx1ZVR5cGUoKSwgUHRyLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbmNyZW1lbnRTaXplLCBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgICBMbyA9IERBRy5nZXRFeHRMb2FkKElTRDo6WkVYVExPQUQsIFZULCBkbCwgQ2hhaW4sIFB0ciwgTEQtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTVk9mZnNldCArIEluY3JlbWVudFNpemUsIE5ld0xvYWRlZFZULCBMRC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmlzTm9uVGVtcG9yYWwoKSwgTWluQWxpZ24oQWxpZ25tZW50LEluY3JlbWVudFNpemUpKTsKKyAgfQorCisgIC8vIGFnZ3JlZ2F0ZSB0aGUgdHdvIHBhcnRzCisgIFNEVmFsdWUgU2hpZnRBbW91bnQgPSBEQUcuZ2V0Q29uc3RhbnQoTnVtQml0cywgVExJLmdldFNoaWZ0QW1vdW50VHkoKSk7CisgIFNEVmFsdWUgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBWVCwgSGksIFNoaWZ0QW1vdW50KTsKKyAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFZULCBSZXN1bHQsIExvKTsKKworICBTRFZhbHVlIFRGID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIExvLmdldFZhbHVlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaS5nZXRWYWx1ZSgxKSk7CisKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgUmVzdWx0LCBURiB9OworICByZXR1cm4gREFHLmdldE1lcmdlVmFsdWVzKE9wcywgMiwgZGwpOworfQorCisvLy8gUGVyZm9ybUluc2VydFZlY3RvckVsdEluTWVtb3J5IC0gU29tZSB0YXJnZXQgY2Fubm90IGhhbmRsZSBhIHZhcmlhYmxlCisvLy8gaW5zZXJ0aW9uIGluZGV4IGZvciB0aGUgSU5TRVJUX1ZFQ1RPUl9FTFQgaW5zdHJ1Y3Rpb24uICBJbiB0aGlzIGNhc2UsIGl0CisvLy8gaXMgbmVjZXNzYXJ5IHRvIHNwaWxsIHRoZSB2ZWN0b3IgYmVpbmcgaW5zZXJ0ZWQgaW50byB0byBtZW1vcnksIHBlcmZvcm0KKy8vLyB0aGUgaW5zZXJ0IHRoZXJlLCBhbmQgdGhlbiByZWFkIHRoZSByZXN1bHQgYmFjay4KK1NEVmFsdWUgU2VsZWN0aW9uREFHTGVnYWxpemU6OgorUGVyZm9ybUluc2VydFZlY3RvckVsdEluTWVtb3J5KFNEVmFsdWUgVmVjLCBTRFZhbHVlIFZhbCwgU0RWYWx1ZSBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgU0RWYWx1ZSBUbXAxID0gVmVjOworICBTRFZhbHVlIFRtcDIgPSBWYWw7CisgIFNEVmFsdWUgVG1wMyA9IElkeDsKKworICAvLyBJZiB0aGUgdGFyZ2V0IGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLCB3ZSBoYXZlIHRvIHNwaWxsIHRoZSBpbnB1dCB2ZWN0b3IKKyAgLy8gdG8gYSB0ZW1wb3Jhcnkgc3RhY2sgc2xvdCwgdXBkYXRlIHRoZSBlbGVtZW50LCB0aGVuIHJlbG9hZCBpdC4gIFRoaXMgaXMKKyAgLy8gYmFkbmVzcy4gIFdlIGNvdWxkIGFsc28gbG9hZCB0aGUgdmFsdWUgaW50byBhIHZlY3RvciByZWdpc3RlciAoZWl0aGVyCisgIC8vIHdpdGggYSAibW92ZSB0byByZWdpc3RlciIgb3IgImV4dGxvYWQgaW50byByZWdpc3RlciIgaW5zdHJ1Y3Rpb24sIHRoZW4KKyAgLy8gcGVybXV0ZSBpdCBpbnRvIHBsYWNlLCBpZiB0aGUgaWR4IGlzIGEgY29uc3RhbnQgYW5kIGlmIHRoZSBpZHggaXMKKyAgLy8gc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQuCisgIEVWVCBWVCAgICA9IFRtcDEuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBFbHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIEVWVCBJZHhWVCA9IFRtcDMuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBQdHJWVCA9IFRMSS5nZXRQb2ludGVyVHkoKTsKKyAgU0RWYWx1ZSBTdGFja1B0ciA9IERBRy5DcmVhdGVTdGFja1RlbXBvcmFyeShWVCk7CisKKyAgaW50IFNQRkkgPSBjYXN0PEZyYW1lSW5kZXhTRE5vZGU+KFN0YWNrUHRyLmdldE5vZGUoKSktPmdldEluZGV4KCk7CisKKyAgLy8gU3RvcmUgdGhlIHZlY3Rvci4KKyAgU0RWYWx1ZSBDaCA9IERBRy5nZXRTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBUbXAxLCBTdGFja1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhTUEZJKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworCisgIC8vIFRydW5jYXRlIG9yIHplcm8gZXh0ZW5kIG9mZnNldCB0byB0YXJnZXQgcG9pbnRlciB0eXBlLgorICB1bnNpZ25lZCBDYXN0T3BjID0gSWR4VlQuYml0c0dUKFB0clZUKSA/IElTRDo6VFJVTkNBVEUgOiBJU0Q6OlpFUk9fRVhURU5EOworICBUbXAzID0gREFHLmdldE5vZGUoQ2FzdE9wYywgZGwsIFB0clZULCBUbXAzKTsKKyAgLy8gQWRkIHRoZSBvZmZzZXQgdG8gdGhlIGluZGV4LgorICB1bnNpZ25lZCBFbHRTaXplID0gRWx0VlQuZ2V0U2l6ZUluQml0cygpLzg7CisgIFRtcDMgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZGwsIElkeFZULCBUbXAzLERBRy5nZXRDb25zdGFudChFbHRTaXplLCBJZHhWVCkpOworICBTRFZhbHVlIFN0YWNrUHRyMiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgSWR4VlQsIFRtcDMsIFN0YWNrUHRyKTsKKyAgLy8gU3RvcmUgdGhlIHNjYWxhciB2YWx1ZS4KKyAgQ2ggPSBEQUcuZ2V0VHJ1bmNTdG9yZShDaCwgZGwsIFRtcDIsIFN0YWNrUHRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhTUEZJKSwgMCwgRWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgLy8gTG9hZCB0aGUgdXBkYXRlZCB2ZWN0b3IuCisgIHJldHVybiBEQUcuZ2V0TG9hZChWVCwgZGwsIENoLCBTdGFja1B0ciwKKyAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKFNQRkkpLCAwLAorICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKK30KKworCitTRFZhbHVlIFNlbGVjdGlvbkRBR0xlZ2FsaXplOjoKK0V4cGFuZElOU0VSVF9WRUNUT1JfRUxUKFNEVmFsdWUgVmVjLCBTRFZhbHVlIFZhbCwgU0RWYWx1ZSBJZHgsIERlYnVnTG9jIGRsKSB7CisgIGlmIChDb25zdGFudFNETm9kZSAqSW5zZXJ0UG9zID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KElkeCkpIHsKKyAgICAvLyBTQ0FMQVJfVE9fVkVDVE9SIHJlcXVpcmVzIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIGluc2VydGVkCisgICAgLy8gbWF0Y2ggdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgdmVjdG9yIGJlaW5nIGNyZWF0ZWQsIGV4Y2VwdCBmb3IKKyAgICAvLyBpbnRlZ2VycyBpbiB3aGljaCBjYXNlIHRoZSBpbnNlcnRlZCB2YWx1ZSBjYW4gYmUgb3ZlciB3aWR0aC4KKyAgICBFVlQgRWx0VlQgPSBWZWMuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICBpZiAoVmFsLmdldFZhbHVlVHlwZSgpID09IEVsdFZUIHx8CisgICAgICAgIChFbHRWVC5pc0ludGVnZXIoKSAmJiBWYWwuZ2V0VmFsdWVUeXBlKCkuYml0c0dFKEVsdFZUKSkpIHsKKyAgICAgIFNEVmFsdWUgU2NWZWMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlYy5nZXRWYWx1ZVR5cGUoKSwgVmFsKTsKKworICAgICAgdW5zaWduZWQgTnVtRWx0cyA9IFZlYy5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgLy8gV2UgZ2VuZXJhdGUgYSBzaHVmZmxlIG9mIEluVmVjIGFuZCBTY1ZlYywgc28gdGhlIHNodWZmbGUgbWFzaworICAgICAgLy8gc2hvdWxkIGJlIDAsMSwyLDMsNCw1Li4uIHdpdGggdGhlIGFwcHJvcHJpYXRlIGVsZW1lbnQgcmVwbGFjZWQgd2l0aAorICAgICAgLy8gZWx0IDAgb2YgdGhlIFJIUy4KKyAgICAgIFNtYWxsVmVjdG9yPGludCwgOD4gU2h1Zk9wczsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWx0czsgKytpKQorICAgICAgICBTaHVmT3BzLnB1c2hfYmFjayhpICE9IEluc2VydFBvcy0+Z2V0WkV4dFZhbHVlKCkgPyBpIDogTnVtRWx0cyk7CisKKyAgICAgIHJldHVybiBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShWZWMuZ2V0VmFsdWVUeXBlKCksIGRsLCBWZWMsIFNjVmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTaHVmT3BzWzBdKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFBlcmZvcm1JbnNlcnRWZWN0b3JFbHRJbk1lbW9yeShWZWMsIFZhbCwgSWR4LCBkbCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHTGVnYWxpemU6Ok9wdGltaXplRmxvYXRTdG9yZShTdG9yZVNETm9kZSogU1QpIHsKKyAgLy8gVHVybiAnc3RvcmUgZmxvYXQgMS4wLCBQdHInIC0+ICdzdG9yZSBpbnQgMHgxMjM0NTY3OCwgUHRyJworICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGRvIHRoaXMgZm9yIFRhcmdldENvbnN0YW50RlAncy4KKyAgLy8gRklYTUU6IG1vdmUgdGhpcyB0byB0aGUgREFHIENvbWJpbmVyISAgTm90ZSB0aGF0IHdlIGNhbid0IHJlZ3Jlc3MgZHVlCisgIC8vIHRvIHBoYXNlIG9yZGVyaW5nIGJldHdlZW4gbGVnYWxpemVkIGNvZGUgYW5kIHRoZSBkYWcgY29tYmluZXIuICBUaGlzCisgIC8vIHByb2JhYmx5IG1lYW5zIHRoYXQgd2UgbmVlZCB0byBpbnRlZ3JhdGUgZGFnIGNvbWJpbmVyIGFuZCBsZWdhbGl6ZXIKKyAgLy8gdG9nZXRoZXIuCisgIC8vIFdlIGdlbmVyYWxseSBjYW4ndCBkbyB0aGlzIG9uZSBmb3IgbG9uZyBkb3VibGVzLgorICBTRFZhbHVlIFRtcDEgPSBTVC0+Z2V0Q2hhaW4oKTsKKyAgU0RWYWx1ZSBUbXAyID0gU1QtPmdldEJhc2VQdHIoKTsKKyAgU0RWYWx1ZSBUbXAzOworICBpbnQgU1ZPZmZzZXQgPSBTVC0+Z2V0U3JjVmFsdWVPZmZzZXQoKTsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gU1QtPmdldEFsaWdubWVudCgpOworICBib29sIGlzVm9sYXRpbGUgPSBTVC0+aXNWb2xhdGlsZSgpOworICBib29sIGlzTm9uVGVtcG9yYWwgPSBTVC0+aXNOb25UZW1wb3JhbCgpOworICBEZWJ1Z0xvYyBkbCA9IFNULT5nZXREZWJ1Z0xvYygpOworICBpZiAoQ29uc3RhbnRGUFNETm9kZSAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oU1QtPmdldFZhbHVlKCkpKSB7CisgICAgaWYgKENGUC0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6ZjMyICYmCisgICAgICAgIGdldFR5cGVBY3Rpb24oTVZUOjppMzIpID09IExlZ2FsKSB7CisgICAgICBUbXAzID0gREFHLmdldENvbnN0YW50KENGUC0+Z2V0VmFsdWVBUEYoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0Y2FzdFRvQVBJbnQoKS56ZXh0T3JUcnVuYygzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7CisgICAgICByZXR1cm4gREFHLmdldFN0b3JlKFRtcDEsIGRsLCBUbXAzLCBUbXAyLCBTVC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQsIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsIEFsaWdubWVudCk7CisgICAgfSBlbHNlIGlmIChDRlAtPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmY2NCkgeworICAgICAgLy8gSWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgNjQtYml0IHJlZ2lzdGVycywgZG8gYSBzaW5nbGUgNjQtYml0IHN0b3JlLgorICAgICAgaWYgKGdldFR5cGVBY3Rpb24oTVZUOjppNjQpID09IExlZ2FsKSB7CisgICAgICAgIFRtcDMgPSBEQUcuZ2V0Q29uc3RhbnQoQ0ZQLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemV4dE9yVHJ1bmMoNjQpLCBNVlQ6Omk2NCk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0U3RvcmUoVG1wMSwgZGwsIFRtcDMsIFRtcDIsIFNULT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0LCBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLCBBbGlnbm1lbnQpOworICAgICAgfSBlbHNlIGlmIChnZXRUeXBlQWN0aW9uKE1WVDo6aTMyKSA9PSBMZWdhbCAmJiAhU1QtPmlzVm9sYXRpbGUoKSkgeworICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgMzItYml0IHJlZ2lzdGVycywgdXNlIDIgMzItYml0CisgICAgICAgIC8vIHN0b3Jlcy4gIElmIHRoZSB0YXJnZXQgc3VwcG9ydHMgbmVpdGhlciAzMi0gbm9yIDY0LWJpdHMsIHRoaXMKKyAgICAgICAgLy8geGZvcm0gaXMgY2VydGFpbmx5IG5vdCB3b3J0aCBpdC4KKyAgICAgICAgY29uc3QgQVBJbnQgJkludFZhbCA9Q0ZQLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCk7CisgICAgICAgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Q29uc3RhbnQoQVBJbnQoSW50VmFsKS50cnVuYygzMiksIE1WVDo6aTMyKTsKKyAgICAgICAgU0RWYWx1ZSBIaSA9IERBRy5nZXRDb25zdGFudChJbnRWYWwubHNocigzMikudHJ1bmMoMzIpLCBNVlQ6OmkzMik7CisgICAgICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkgc3RkOjpzd2FwKExvLCBIaSk7CisKKyAgICAgICAgTG8gPSBEQUcuZ2V0U3RvcmUoVG1wMSwgZGwsIExvLCBUbXAyLCBTVC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQsIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsIEFsaWdubWVudCk7CisgICAgICAgIFRtcDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFRtcDIuZ2V0VmFsdWVUeXBlKCksIFRtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDQpKTsKKyAgICAgICAgSGkgPSBEQUcuZ2V0U3RvcmUoVG1wMSwgZGwsIEhpLCBUbXAyLCBTVC0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQrNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwgTWluQWxpZ24oQWxpZ25tZW50LCA0VSkpOworCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgTG8sIEhpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIExlZ2FsaXplT3AgLSBXZSBrbm93IHRoYXQgdGhlIHNwZWNpZmllZCB2YWx1ZSBoYXMgYSBsZWdhbCB0eXBlLCBhbmQKKy8vLyB0aGF0IGl0cyBvcGVyYW5kcyBhcmUgbGVnYWwuICBOb3cgZW5zdXJlIHRoYXQgdGhlIG9wZXJhdGlvbiBpdHNlbGYKKy8vLyBpcyBsZWdhbCwgcmVjdXJzaXZlbHkgZW5zdXJpbmcgdGhhdCB0aGUgb3BlcmFuZHMnIG9wZXJhdGlvbnMgcmVtYWluCisvLy8gbGVnYWwuCitTRFZhbHVlIFNlbGVjdGlvbkRBR0xlZ2FsaXplOjpMZWdhbGl6ZU9wKFNEVmFsdWUgT3ApIHsKKyAgaWYgKE9wLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnQpIC8vIEFsbG93IGlsbGVnYWwgdGFyZ2V0IG5vZGVzLgorICAgIHJldHVybiBPcDsKKworICBTRE5vZGUgKk5vZGUgPSBPcC5nZXROb2RlKCk7CisgIERlYnVnTG9jIGRsID0gTm9kZS0+Z2V0RGVidWdMb2MoKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTm9kZS0+Z2V0TnVtVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgIGFzc2VydChnZXRUeXBlQWN0aW9uKE5vZGUtPmdldFZhbHVlVHlwZShpKSkgPT0gTGVnYWwgJiYKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQgaWxsZWdhbCB0eXBlISIpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOb2RlLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBhc3NlcnQoKGlzVHlwZUxlZ2FsKE5vZGUtPmdldE9wZXJhbmQoaSkuZ2V0VmFsdWVUeXBlKCkpIHx8CisgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnQpICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkIGlsbGVnYWwgdHlwZSEiKTsKKworICAvLyBOb3RlIHRoYXQgTGVnYWxpemVPcCBtYXkgYmUgcmVlbnRlcmVkIGV2ZW4gZnJvbSBzaW5nbGUtdXNlIG5vZGVzLCB3aGljaAorICAvLyBtZWFucyB0aGF0IHdlIGFsd2F5cyBtdXN0IGNhY2hlIHRyYW5zZm9ybWVkIG5vZGVzLgorICBEZW5zZU1hcDxTRFZhbHVlLCBTRFZhbHVlPjo6aXRlcmF0b3IgSSA9IExlZ2FsaXplZE5vZGVzLmZpbmQoT3ApOworICBpZiAoSSAhPSBMZWdhbGl6ZWROb2Rlcy5lbmQoKSkgcmV0dXJuIEktPnNlY29uZDsKKworICBTRFZhbHVlIFRtcDEsIFRtcDIsIFRtcDMsIFRtcDQ7CisgIFNEVmFsdWUgUmVzdWx0ID0gT3A7CisgIGJvb2wgaXNDdXN0b20gPSBmYWxzZTsKKworICAvLyBGaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGFjdGlvbjsgdGhlIHdheSB0byBxdWVyeSB0aGlzIHZhcmllcyBieSBvcGNvZGUKKyAgVGFyZ2V0TG93ZXJpbmc6OkxlZ2FsaXplQWN0aW9uIEFjdGlvbjsKKyAgYm9vbCBTaW1wbGVGaW5pc2hMZWdhbGl6aW5nID0gdHJ1ZTsKKyAgc3dpdGNoIChOb2RlLT5nZXRPcGNvZGUoKSkgeworICBjYXNlIElTRDo6SU5UUklOU0lDX1dfQ0hBSU46CisgIGNhc2UgSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU46CisgIGNhc2UgSVNEOjpJTlRSSU5TSUNfVk9JRDoKKyAgY2FzZSBJU0Q6OlZBQVJHOgorICBjYXNlIElTRDo6U1RBQ0tTQVZFOgorICAgIEFjdGlvbiA9IFRMSS5nZXRPcGVyYXRpb25BY3Rpb24oTm9kZS0+Z2V0T3Bjb2RlKCksIE1WVDo6T3RoZXIpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0lOVF9UT19GUDoKKyAgY2FzZSBJU0Q6OlVJTlRfVE9fRlA6CisgIGNhc2UgSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQ6CisgICAgQWN0aW9uID0gVExJLmdldE9wZXJhdGlvbkFjdGlvbihOb2RlLT5nZXRPcGNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6RlBfUk9VTkRfSU5SRUc6CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORF9JTlJFRzogeworICAgIEVWVCBJbm5lclR5cGUgPSBjYXN0PFZUU0ROb2RlPihOb2RlLT5nZXRPcGVyYW5kKDEpKS0+Z2V0VlQoKTsKKyAgICBBY3Rpb24gPSBUTEkuZ2V0T3BlcmF0aW9uQWN0aW9uKE5vZGUtPmdldE9wY29kZSgpLCBJbm5lclR5cGUpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6CisgIGNhc2UgSVNEOjpTRVRDQzoKKyAgY2FzZSBJU0Q6OkJSX0NDOiB7CisgICAgdW5zaWduZWQgQ0NPcGVyYW5kID0gTm9kZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTRUxFQ1RfQ0MgPyA0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNFVENDID8gMiA6IDE7CisgICAgdW5zaWduZWQgQ29tcGFyZU9wZXJhbmQgPSBOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJSX0NDID8gMiA6IDA7CisgICAgRVZUIE9wVlQgPSBOb2RlLT5nZXRPcGVyYW5kKENvbXBhcmVPcGVyYW5kKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICBJU0Q6OkNvbmRDb2RlIENDQ29kZSA9CisgICAgICAgIGNhc3Q8Q29uZENvZGVTRE5vZGU+KE5vZGUtPmdldE9wZXJhbmQoQ0NPcGVyYW5kKSktPmdldCgpOworICAgIEFjdGlvbiA9IFRMSS5nZXRDb25kQ29kZUFjdGlvbihDQ0NvZGUsIE9wVlQpOworICAgIGlmIChBY3Rpb24gPT0gVGFyZ2V0TG93ZXJpbmc6OkxlZ2FsKSB7CisgICAgICBpZiAoTm9kZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTRUxFQ1RfQ0MpCisgICAgICAgIEFjdGlvbiA9IFRMSS5nZXRPcGVyYXRpb25BY3Rpb24oTm9kZS0+Z2V0T3Bjb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQWN0aW9uID0gVExJLmdldE9wZXJhdGlvbkFjdGlvbihOb2RlLT5nZXRPcGNvZGUoKSwgT3BWVCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpMT0FEOgorICBjYXNlIElTRDo6U1RPUkU6CisgICAgLy8gRklYTUU6IE1vZGVsIHRoZXNlIHByb3Blcmx5LiAgTE9BRCBhbmQgU1RPUkUgYXJlIGNvbXBsaWNhdGVkLCBhbmQKKyAgICAvLyBTVE9SRSBleHBlY3RzIHRoZSB1bmxlZ2FsaXplZCBvcGVyYW5kIGluIHNvbWUgY2FzZXMuCisgICAgU2ltcGxlRmluaXNoTGVnYWxpemluZyA9IGZhbHNlOworICAgIGJyZWFrOworICBjYXNlIElTRDo6Q0FMTFNFUV9TVEFSVDoKKyAgY2FzZSBJU0Q6OkNBTExTRVFfRU5EOgorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICBUaGVzZSBub2RlcyBoYXZlIHNwZWNpYWwgcHJvcGVydGllcworICAgIC8vIGRlYWxpbmcgd2l0aCB0aGUgcmVjdXJzaXZlIG5hdHVyZSBvZiBsZWdhbGl6YXRpb24uICBSZW1vdmluZyB0aGlzCisgICAgLy8gc3BlY2lhbCBjYXNlIHNob3VsZCBiZSBkb25lIGFzIHBhcnQgb2YgbWFraW5nIExlZ2FsaXplREFHIG5vbi1yZWN1cnNpdmUuCisgICAgU2ltcGxlRmluaXNoTGVnYWxpemluZyA9IGZhbHNlOworICAgIGJyZWFrOworICBjYXNlIElTRDo6RVhUUkFDVF9FTEVNRU5UOgorICBjYXNlIElTRDo6RkxUX1JPVU5EU186CisgIGNhc2UgSVNEOjpTQURETzoKKyAgY2FzZSBJU0Q6OlNTVUJPOgorICBjYXNlIElTRDo6VUFERE86CisgIGNhc2UgSVNEOjpVU1VCTzoKKyAgY2FzZSBJU0Q6OlNNVUxPOgorICBjYXNlIElTRDo6VU1VTE86CisgIGNhc2UgSVNEOjpGUE9XSToKKyAgY2FzZSBJU0Q6Ok1FUkdFX1ZBTFVFUzoKKyAgY2FzZSBJU0Q6OkZSQU1FX1RPX0FSR1NfT0ZGU0VUOgorICAgIC8vIFRoZXNlIG9wZXJhdGlvbnMgbGllIGFib3V0IGJlaW5nIGxlZ2FsOiB3aGVuIHRoZXkgY2xhaW0gdG8gYmUgbGVnYWwsCisgICAgLy8gdGhleSBzaG91bGQgYWN0dWFsbHkgYmUgZXhwYW5kZWQuCisgICAgQWN0aW9uID0gVExJLmdldE9wZXJhdGlvbkFjdGlvbihOb2RlLT5nZXRPcGNvZGUoKSwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgICBpZiAoQWN0aW9uID09IFRhcmdldExvd2VyaW5nOjpMZWdhbCkKKyAgICAgIEFjdGlvbiA9IFRhcmdldExvd2VyaW5nOjpFeHBhbmQ7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpUUkFNUE9MSU5FOgorICBjYXNlIElTRDo6RlJBTUVBRERSOgorICBjYXNlIElTRDo6UkVUVVJOQUREUjoKKyAgICAvLyBUaGVzZSBvcGVyYXRpb25zIGxpZSBhYm91dCBiZWluZyBsZWdhbDogd2hlbiB0aGV5IGNsYWltIHRvIGJlIGxlZ2FsLAorICAgIC8vIHRoZXkgc2hvdWxkIGFjdHVhbGx5IGJlIGN1c3RvbS1sb3dlcmVkLgorICAgIEFjdGlvbiA9IFRMSS5nZXRPcGVyYXRpb25BY3Rpb24oTm9kZS0+Z2V0T3Bjb2RlKCksIE5vZGUtPmdldFZhbHVlVHlwZSgwKSk7CisgICAgaWYgKEFjdGlvbiA9PSBUYXJnZXRMb3dlcmluZzo6TGVnYWwpCisgICAgICBBY3Rpb24gPSBUYXJnZXRMb3dlcmluZzo6Q3VzdG9tOworICAgIGJyZWFrOworICBjYXNlIElTRDo6QlVJTERfVkVDVE9SOgorICAgIC8vIEEgd2VpcmQgY2FzZTogbGVnYWxpemF0aW9uIGZvciBCVUlMRF9WRUNUT1IgbmV2ZXIgbGVnYWxpemVzIHRoZQorICAgIC8vIG9wZXJhbmRzIQorICAgIC8vIEZJWE1FOiBUaGlzIHJlYWxseSBzdWNrcy4uLiBjaGFuZ2luZyBpdCBpc24ndCBzZW1hbnRpY2FsbHkgaW5jb3JyZWN0LAorICAgIC8vIGJ1dCBpdCBtYXNzaXZlbHkgcGVzc2ltaXplcyB0aGUgY29kZSBmb3IgZmxvYXRpbmctcG9pbnQgQlVJTERfVkVDVE9ScworICAgIC8vIGJlY2F1c2UgQ29uc3RhbnRGUCBvcGVyYW5kcyBnZXQgbGVnYWxpemVkIGludG8gY29uc3RhbnQgcG9vbCBsb2FkcworICAgIC8vIGJlZm9yZSB0aGUgQlVJTERfVkVDVE9SIGNvZGUgY2FuIHNlZSB0aGVtLiAgSXQgZG9lc24ndCB1c3VhbGx5IGJpdGUsCisgICAgLy8gdGhvdWdoLCBiZWNhdXNlIEJVSUxEX1ZFQ1RPUlMgdXN1YWxseSBnZXQgbG93ZXJlZCBpbnRvIG90aGVyIG5vZGVzCisgICAgLy8gd2hpY2ggZ2V0IGxlZ2FsaXplZCBwcm9wZXJseS4KKyAgICBTaW1wbGVGaW5pc2hMZWdhbGl6aW5nID0gZmFsc2U7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgaWYgKE5vZGUtPmdldE9wY29kZSgpID49IElTRDo6QlVJTFRJTl9PUF9FTkQpIHsKKyAgICAgIEFjdGlvbiA9IFRhcmdldExvd2VyaW5nOjpMZWdhbDsKKyAgICB9IGVsc2UgeworICAgICAgQWN0aW9uID0gVExJLmdldE9wZXJhdGlvbkFjdGlvbihOb2RlLT5nZXRPcGNvZGUoKSwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoU2ltcGxlRmluaXNoTGVnYWxpemluZykgeworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wcywgUmVzdWx0VmFsczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTm9kZS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBPcHMucHVzaF9iYWNrKExlZ2FsaXplT3AoTm9kZS0+Z2V0T3BlcmFuZChpKSkpOworICAgIHN3aXRjaCAoTm9kZS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIElTRDo6QlI6CisgICAgY2FzZSBJU0Q6OkJSSU5EOgorICAgIGNhc2UgSVNEOjpCUl9KVDoKKyAgICBjYXNlIElTRDo6QlJfQ0M6CisgICAgY2FzZSBJU0Q6OkJSQ09ORDoKKyAgICAgIC8vIEJyYW5jaGVzIHR3ZWFrIHRoZSBjaGFpbiB0byBpbmNsdWRlIExhc3RDQUxMU0VRX0VORAorICAgICAgT3BzWzBdID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIE9wc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0Q0FMTFNFUV9FTkQpOworICAgICAgT3BzWzBdID0gTGVnYWxpemVPcChPcHNbMF0pOworICAgICAgTGFzdENBTExTRVFfRU5EID0gREFHLmdldEVudHJ5Tm9kZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNITDoKKyAgICBjYXNlIElTRDo6U1JMOgorICAgIGNhc2UgSVNEOjpTUkE6CisgICAgY2FzZSBJU0Q6OlJPVEw6CisgICAgY2FzZSBJU0Q6OlJPVFI6CisgICAgICAvLyBMZWdhbGl6aW5nIHNoaWZ0cy9yb3RhdGVzIHJlcXVpcmVzIGFkanVzdGluZyB0aGUgc2hpZnQgYW1vdW50CisgICAgICAvLyB0byB0aGUgYXBwcm9wcmlhdGUgd2lkdGguCisgICAgICBpZiAoIU9wc1sxXS5nZXRWYWx1ZVR5cGUoKS5pc1ZlY3RvcigpKQorICAgICAgICBPcHNbMV0gPSBMZWdhbGl6ZU9wKERBRy5nZXRTaGlmdEFtb3VudE9wZXJhbmQoT3BzWzFdKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6U1JMX1BBUlRTOgorICAgIGNhc2UgSVNEOjpTUkFfUEFSVFM6CisgICAgY2FzZSBJU0Q6OlNITF9QQVJUUzoKKyAgICAgIC8vIExlZ2FsaXppbmcgc2hpZnRzL3JvdGF0ZXMgcmVxdWlyZXMgYWRqdXN0aW5nIHRoZSBzaGlmdCBhbW91bnQKKyAgICAgIC8vIHRvIHRoZSBhcHByb3ByaWF0ZSB3aWR0aC4KKyAgICAgIGlmICghT3BzWzJdLmdldFZhbHVlVHlwZSgpLmlzVmVjdG9yKCkpCisgICAgICAgIE9wc1syXSA9IExlZ2FsaXplT3AoREFHLmdldFNoaWZ0QW1vdW50T3BlcmFuZChPcHNbMl0pKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIFJlc3VsdCA9IFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhSZXN1bHQuZ2V0Tm9kZSgpLCBPcHMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMuc2l6ZSgpKSwgMCk7CisgICAgc3dpdGNoIChBY3Rpb24pIHsKKyAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpMZWdhbDoKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOb2RlLT5nZXROdW1WYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIFJlc3VsdFZhbHMucHVzaF9iYWNrKFJlc3VsdC5nZXRWYWx1ZShpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpDdXN0b206CisgICAgICAvLyBGSVhNRTogVGhlIGhhbmRsaW5nIGZvciBjdXN0b20gbG93ZXJpbmcgd2l0aCBtdWx0aXBsZSByZXN1bHRzIGlzCisgICAgICAvLyBhIGNvbXBsZXRlIG1lc3MuCisgICAgICBUbXAxID0gVExJLkxvd2VyT3BlcmF0aW9uKFJlc3VsdCwgREFHKTsKKyAgICAgIGlmIChUbXAxLmdldE5vZGUoKSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTm9kZS0+Z2V0TnVtVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgaWYgKGUgPT0gMSkKKyAgICAgICAgICAgIFJlc3VsdFZhbHMucHVzaF9iYWNrKFRtcDEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFJlc3VsdFZhbHMucHVzaF9iYWNrKFRtcDEuZ2V0VmFsdWUoaSkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBGQUxMIFRIUk9VR0gKKyAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpFeHBhbmQ6CisgICAgICBFeHBhbmROb2RlKFJlc3VsdC5nZXROb2RlKCksIFJlc3VsdFZhbHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUYXJnZXRMb3dlcmluZzo6UHJvbW90ZToKKyAgICAgIFByb21vdGVOb2RlKFJlc3VsdC5nZXROb2RlKCksIFJlc3VsdFZhbHMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghUmVzdWx0VmFscy5lbXB0eSgpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVzdWx0VmFscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIGlmIChSZXN1bHRWYWxzW2ldICE9IFNEVmFsdWUoTm9kZSwgaSkpCisgICAgICAgICAgUmVzdWx0VmFsc1tpXSA9IExlZ2FsaXplT3AoUmVzdWx0VmFsc1tpXSk7CisgICAgICAgIEFkZExlZ2FsaXplZE9wZXJhbmQoU0RWYWx1ZShOb2RlLCBpKSwgUmVzdWx0VmFsc1tpXSk7CisgICAgICB9CisgICAgICByZXR1cm4gUmVzdWx0VmFsc1tPcC5nZXRSZXNObygpXTsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKE5vZGUtPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6CisjaWZuZGVmIE5ERUJVRworICAgIGRiZ3MoKSA8PCAiTk9ERTogIjsKKyAgICBOb2RlLT5kdW1wKCAmREFHKTsKKyAgICBkYmdzKCkgPDwgIlxuIjsKKyNlbmRpZgorICAgIGFzc2VydCgwICYmICJEbyBub3Qga25vdyBob3cgdG8gbGVnYWxpemUgdGhpcyBvcGVyYXRvciEiKTsKKworICBjYXNlIElTRDo6QlVJTERfVkVDVE9SOgorICAgIHN3aXRjaCAoVExJLmdldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJVSUxEX1ZFQ1RPUiwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApKSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJUaGlzIGFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCEiKTsKKyAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpDdXN0b206CisgICAgICBUbXAzID0gVExJLkxvd2VyT3BlcmF0aW9uKFJlc3VsdCwgREFHKTsKKyAgICAgIGlmIChUbXAzLmdldE5vZGUoKSkgeworICAgICAgICBSZXN1bHQgPSBUbXAzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIEZBTExUSFJPVUdICisgICAgY2FzZSBUYXJnZXRMb3dlcmluZzo6RXhwYW5kOgorICAgICAgUmVzdWx0ID0gRXhwYW5kQlVJTERfVkVDVE9SKFJlc3VsdC5nZXROb2RlKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6Q0FMTFNFUV9TVEFSVDogeworICAgIFNETm9kZSAqQ2FsbEVuZCA9IEZpbmRDYWxsRW5kRnJvbUNhbGxTdGFydChOb2RlKTsKKworICAgIC8vIFJlY3Vyc2l2ZWx5IExlZ2FsaXplIGFsbCBvZiB0aGUgaW5wdXRzIG9mIHRoZSBjYWxsIGVuZCB0aGF0IGRvIG5vdCBsZWFkCisgICAgLy8gdG8gdGhpcyBjYWxsIHN0YXJ0LiAgVGhpcyBlbnN1cmVzIHRoYXQgYW55IGxpYmNhbGxzIHRoYXQgbmVlZCBiZSBpbnNlcnRlZAorICAgIC8vIGFyZSBpbnNlcnRlZCAqYmVmb3JlKiB0aGUgQ0FMTFNFUV9TVEFSVC4KKyAgICB7U21hbGxQdHJTZXQ8U0ROb2RlKiwgMzI+IE5vZGVzTGVhZGluZ1RvOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDYWxsRW5kLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIExlZ2FsaXplQWxsTm9kZXNOb3RMZWFkaW5nVG8oQ2FsbEVuZC0+Z2V0T3BlcmFuZChpKS5nZXROb2RlKCksIE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVzTGVhZGluZ1RvKTsKKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGxlZ2FsaXplZCBhbGwgb2YgdGhlIGlucHV0cyAod2hpY2ggbWF5IGhhdmUgaW5zZXJ0ZWQKKyAgICAvLyBsaWJjYWxscyksIGNyZWF0ZSB0aGUgbmV3IENBTExTRVFfU1RBUlQgbm9kZS4KKyAgICBUbXAxID0gTGVnYWxpemVPcChOb2RlLT5nZXRPcGVyYW5kKDApKTsgIC8vIExlZ2FsaXplIHRoZSBjaGFpbi4KKworICAgIC8vIE1lcmdlIGluIHRoZSBsYXN0IGNhbGwgdG8gZW5zdXJlIHRoYXQgdGhpcyBjYWxsIHN0YXJ0cyBhZnRlciB0aGUgbGFzdAorICAgIC8vIGNhbGwgZW5kZWQuCisgICAgaWYgKExhc3RDQUxMU0VRX0VORC5nZXRPcGNvZGUoKSAhPSBJU0Q6OkVudHJ5VG9rZW4pIHsKKyAgICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUbXAxLCBMYXN0Q0FMTFNFUV9FTkQpOworICAgICAgVG1wMSA9IExlZ2FsaXplT3AoVG1wMSk7CisgICAgfQorCisgICAgLy8gRG8gbm90IHRyeSB0byBsZWdhbGl6ZSB0aGUgdGFyZ2V0LXNwZWNpZmljIGFyZ3VtZW50cyAoIzErKS4KKyAgICBpZiAoVG1wMSAhPSBOb2RlLT5nZXRPcGVyYW5kKDApKSB7CisgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHMoTm9kZS0+b3BfYmVnaW4oKSwgTm9kZS0+b3BfZW5kKCkpOworICAgICAgT3BzWzBdID0gVG1wMTsKKyAgICAgIFJlc3VsdCA9IFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhSZXN1bHQuZ2V0Tm9kZSgpLCAmT3BzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wcy5zaXplKCkpLCBSZXN1bHQuZ2V0UmVzTm8oKSk7CisgICAgfQorCisgICAgLy8gUmVtZW1iZXIgdGhhdCB0aGUgQ0FMTFNFUV9TVEFSVCBpcyBsZWdhbGl6ZWQuCisgICAgQWRkTGVnYWxpemVkT3BlcmFuZChPcC5nZXRWYWx1ZSgwKSwgUmVzdWx0KTsKKyAgICBpZiAoTm9kZS0+Z2V0TnVtVmFsdWVzKCkgPT0gMikgICAgLy8gSWYgdGhpcyBoYXMgYSBmbGFnIHJlc3VsdCwgcmVtZW1iZXIgaXQuCisgICAgICBBZGRMZWdhbGl6ZWRPcGVyYW5kKE9wLmdldFZhbHVlKDEpLCBSZXN1bHQuZ2V0VmFsdWUoMSkpOworCisgICAgLy8gTm93IHRoYXQgdGhlIGNhbGxzZXFfc3RhcnQgYW5kIGFsbCBvZiB0aGUgbm9uLWNhbGwgbm9kZXMgYWJvdmUgdGhpcyBjYWxsCisgICAgLy8gc2VxdWVuY2UgaGF2ZSBiZWVuIGxlZ2FsaXplZCwgbGVnYWxpemUgdGhlIGNhbGwgaXRzZWxmLiAgRHVyaW5nIHRoaXMKKyAgICAvLyBwcm9jZXNzLCBubyBsaWJjYWxscyBjYW4vd2lsbCBiZSBpbnNlcnRlZCwgZ3VhcmFudGVlaW5nIHRoYXQgbm8gY2FsbHMKKyAgICAvLyBjYW4gb3ZlcmxhcC4KKyAgICBhc3NlcnQoIUlzTGVnYWxpemluZ0NhbGwgJiYgIkluY29uc2lzdGVudCBzZXF1ZW50aWFsaXphdGlvbiBvZiBjYWxscyEiKTsKKyAgICAvLyBOb3RlIHRoYXQgd2UgYXJlIHNlbGVjdGluZyB0aGlzIGNhbGwhCisgICAgTGFzdENBTExTRVFfRU5EID0gU0RWYWx1ZShDYWxsRW5kLCAwKTsKKyAgICBJc0xlZ2FsaXppbmdDYWxsID0gdHJ1ZTsKKworICAgIC8vIExlZ2FsaXplIHRoZSBjYWxsLCBzdGFydGluZyBmcm9tIHRoZSBDQUxMU0VRX0VORC4KKyAgICBMZWdhbGl6ZU9wKExhc3RDQUxMU0VRX0VORCk7CisgICAgYXNzZXJ0KCFJc0xlZ2FsaXppbmdDYWxsICYmICJDQUxMU0VRX0VORCBzaG91bGQgaGF2ZSBjbGVhcmVkIHRoaXMhIik7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorICBjYXNlIElTRDo6Q0FMTFNFUV9FTkQ6CisgICAgLy8gSWYgdGhlIENBTExTRVFfU1RBUlQgbm9kZSBoYXNuJ3QgYmVlbiBsZWdhbGl6ZWQgZmlyc3QsIGxlZ2FsaXplIGl0LiAgVGhpcworICAgIC8vIHdpbGwgY2F1c2UgdGhpcyBub2RlIHRvIGJlIGxlZ2FsaXplZCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGxpYmNhbGxzIHJpZ2h0LgorICAgIGlmIChMYXN0Q0FMTFNFUV9FTkQuZ2V0Tm9kZSgpICE9IE5vZGUpIHsKKyAgICAgIExlZ2FsaXplT3AoU0RWYWx1ZShGaW5kQ2FsbFN0YXJ0RnJvbUNhbGxFbmQoTm9kZSksIDApKTsKKyAgICAgIERlbnNlTWFwPFNEVmFsdWUsIFNEVmFsdWU+OjppdGVyYXRvciBJID0gTGVnYWxpemVkTm9kZXMuZmluZChPcCk7CisgICAgICBhc3NlcnQoSSAhPSBMZWdhbGl6ZWROb2Rlcy5lbmQoKSAmJgorICAgICAgICAgICAgICJMZWdhbGl6aW5nIHRoZSBjYWxsIHN0YXJ0IHNob3VsZCBoYXZlIGxlZ2FsaXplZCB0aGlzIG5vZGUhIik7CisgICAgICByZXR1cm4gSS0+c2Vjb25kOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgdGhlIGNhbGwgc3RhcnQgaGFzIGJlZW4gbGVnYWxpemVkIGFuZCBldmVyeXRoaW5nIGlzIGdvaW5nCisgICAgLy8gYWNjb3JkaW5nIHRvIHBsYW4uICBKdXN0IGxlZ2FsaXplIG91cnNlbHZlcyBub3JtYWxseSBoZXJlLgorICAgIFRtcDEgPSBMZWdhbGl6ZU9wKE5vZGUtPmdldE9wZXJhbmQoMCkpOyAgLy8gTGVnYWxpemUgdGhlIGNoYWluLgorICAgIC8vIERvIG5vdCB0cnkgdG8gbGVnYWxpemUgdGhlIHRhcmdldC1zcGVjaWZpYyBhcmd1bWVudHMgKCMxKyksIGV4Y2VwdCBmb3IKKyAgICAvLyBhbiBvcHRpb25hbCBmbGFnIGlucHV0LgorICAgIGlmIChOb2RlLT5nZXRPcGVyYW5kKE5vZGUtPmdldE51bU9wZXJhbmRzKCktMSkuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjpGbGFnKXsKKyAgICAgIGlmIChUbXAxICE9IE5vZGUtPmdldE9wZXJhbmQoMCkpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzKE5vZGUtPm9wX2JlZ2luKCksIE5vZGUtPm9wX2VuZCgpKTsKKyAgICAgICAgT3BzWzBdID0gVG1wMTsKKyAgICAgICAgUmVzdWx0ID0gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKFJlc3VsdC5nZXROb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmT3BzWzBdLCBPcHMuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQuZ2V0UmVzTm8oKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFRtcDIgPSBMZWdhbGl6ZU9wKE5vZGUtPmdldE9wZXJhbmQoTm9kZS0+Z2V0TnVtT3BlcmFuZHMoKS0xKSk7CisgICAgICBpZiAoVG1wMSAhPSBOb2RlLT5nZXRPcGVyYW5kKDApIHx8CisgICAgICAgICAgVG1wMiAhPSBOb2RlLT5nZXRPcGVyYW5kKE5vZGUtPmdldE51bU9wZXJhbmRzKCktMSkpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzKE5vZGUtPm9wX2JlZ2luKCksIE5vZGUtPm9wX2VuZCgpKTsKKyAgICAgICAgT3BzWzBdID0gVG1wMTsKKyAgICAgICAgT3BzLmJhY2soKSA9IFRtcDI7CisgICAgICAgIFJlc3VsdCA9IFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhSZXN1bHQuZ2V0Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk9wc1swXSwgT3BzLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0LmdldFJlc05vKCkpOworICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoSXNMZWdhbGl6aW5nQ2FsbCAmJiAiQ2FsbCBzZXF1ZW5jZSBpbWJhbGFuY2UgYmV0d2VlbiBzdGFydC9lbmQ/Iik7CisgICAgLy8gVGhpcyBmaW5pc2hlcyB1cCBjYWxsIGxlZ2FsaXphdGlvbi4KKyAgICBJc0xlZ2FsaXppbmdDYWxsID0gZmFsc2U7CisKKyAgICAvLyBJZiB0aGUgQ0FMTFNFUV9FTkQgbm9kZSBoYXMgYSBmbGFnLCByZW1lbWJlciB0aGF0IHdlIGxlZ2FsaXplZCBpdC4KKyAgICBBZGRMZWdhbGl6ZWRPcGVyYW5kKFNEVmFsdWUoTm9kZSwgMCksIFJlc3VsdC5nZXRWYWx1ZSgwKSk7CisgICAgaWYgKE5vZGUtPmdldE51bVZhbHVlcygpID09IDIpCisgICAgICBBZGRMZWdhbGl6ZWRPcGVyYW5kKFNEVmFsdWUoTm9kZSwgMSksIFJlc3VsdC5nZXRWYWx1ZSgxKSk7CisgICAgcmV0dXJuIFJlc3VsdC5nZXRWYWx1ZShPcC5nZXRSZXNObygpKTsKKyAgY2FzZSBJU0Q6OkxPQUQ6IHsKKyAgICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oTm9kZSk7CisgICAgVG1wMSA9IExlZ2FsaXplT3AoTEQtPmdldENoYWluKCkpOyAgIC8vIExlZ2FsaXplIHRoZSBjaGFpbi4KKyAgICBUbXAyID0gTGVnYWxpemVPcChMRC0+Z2V0QmFzZVB0cigpKTsgLy8gTGVnYWxpemUgdGhlIGJhc2UgcG9pbnRlci4KKworICAgIElTRDo6TG9hZEV4dFR5cGUgRXh0VHlwZSA9IExELT5nZXRFeHRlbnNpb25UeXBlKCk7CisgICAgaWYgKEV4dFR5cGUgPT0gSVNEOjpOT05fRVhUTE9BRCkgeworICAgICAgRVZUIFZUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICAgICAgUmVzdWx0ID0gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKFJlc3VsdC5nZXROb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wMSwgVG1wMiwgTEQtPmdldE9mZnNldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0LmdldFJlc05vKCkpOworICAgICAgVG1wMyA9IFJlc3VsdC5nZXRWYWx1ZSgwKTsKKyAgICAgIFRtcDQgPSBSZXN1bHQuZ2V0VmFsdWUoMSk7CisKKyAgICAgIHN3aXRjaCAoVExJLmdldE9wZXJhdGlvbkFjdGlvbihOb2RlLT5nZXRPcGNvZGUoKSwgVlQpKSB7CisgICAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVGhpcyBhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQhIik7CisgICAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpMZWdhbDoKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiB1bmFsaWduZWQgbG9hZCBhbmQgdGhlIHRhcmdldCBkb2Vzbid0IHN1cHBvcnQgaXQsCisgICAgICAgIC8vIGV4cGFuZCBpdC4KKyAgICAgICAgaWYgKCFUTEkuYWxsb3dzVW5hbGlnbmVkTWVtb3J5QWNjZXNzZXMoTEQtPmdldE1lbW9yeVZUKCkpKSB7CisgICAgICAgICAgY29uc3QgVHlwZSAqVHkgPSBMRC0+Z2V0TWVtb3J5VlQoKS5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICB1bnNpZ25lZCBBQklBbGlnbm1lbnQgPSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRBQklUeXBlQWxpZ25tZW50KFR5KTsKKyAgICAgICAgICBpZiAoTEQtPmdldEFsaWdubWVudCgpIDwgQUJJQWxpZ25tZW50KXsKKyAgICAgICAgICAgIFJlc3VsdCA9IEV4cGFuZFVuYWxpZ25lZExvYWQoY2FzdDxMb2FkU0ROb2RlPihSZXN1bHQuZ2V0Tm9kZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLCBUTEkpOworICAgICAgICAgICAgVG1wMyA9IFJlc3VsdC5nZXRPcGVyYW5kKDApOworICAgICAgICAgICAgVG1wNCA9IFJlc3VsdC5nZXRPcGVyYW5kKDEpOworICAgICAgICAgICAgVG1wMyA9IExlZ2FsaXplT3AoVG1wMyk7CisgICAgICAgICAgICBUbXA0ID0gTGVnYWxpemVPcChUbXA0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpDdXN0b206CisgICAgICAgIFRtcDEgPSBUTEkuTG93ZXJPcGVyYXRpb24oVG1wMywgREFHKTsKKyAgICAgICAgaWYgKFRtcDEuZ2V0Tm9kZSgpKSB7CisgICAgICAgICAgVG1wMyA9IExlZ2FsaXplT3AoVG1wMSk7CisgICAgICAgICAgVG1wNCA9IExlZ2FsaXplT3AoVG1wMS5nZXRWYWx1ZSgxKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpQcm9tb3RlOiB7CisgICAgICAgIC8vIE9ubHkgcHJvbW90ZSBhIGxvYWQgb2YgdmVjdG9yIHR5cGUgdG8gYW5vdGhlci4KKyAgICAgICAgYXNzZXJ0KFZULmlzVmVjdG9yKCkgJiYgIkNhbm5vdCBwcm9tb3RlIHRoaXMgbG9hZCEiKTsKKyAgICAgICAgLy8gQ2hhbmdlIGJhc2UgdHlwZSB0byBhIGRpZmZlcmVudCB2ZWN0b3IgdHlwZS4KKyAgICAgICAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9Qcm9tb3RlVG8oTm9kZS0+Z2V0T3Bjb2RlKCksIFZUKTsKKworICAgICAgICBUbXAxID0gREFHLmdldExvYWQoTlZULCBkbCwgVG1wMSwgVG1wMiwgTEQtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5pc1ZvbGF0aWxlKCksIExELT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0QWxpZ25tZW50KCkpOworICAgICAgICBUbXAzID0gTGVnYWxpemVPcChEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsIFRtcDEpKTsKKyAgICAgICAgVG1wNCA9IExlZ2FsaXplT3AoVG1wMS5nZXRWYWx1ZSgxKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgfQorICAgICAgLy8gU2luY2UgbG9hZHMgcHJvZHVjZSB0d28gdmFsdWVzLCBtYWtlIHN1cmUgdG8gcmVtZW1iZXIgdGhhdCB3ZQorICAgICAgLy8gbGVnYWxpemVkIGJvdGggb2YgdGhlbS4KKyAgICAgIEFkZExlZ2FsaXplZE9wZXJhbmQoU0RWYWx1ZShOb2RlLCAwKSwgVG1wMyk7CisgICAgICBBZGRMZWdhbGl6ZWRPcGVyYW5kKFNEVmFsdWUoTm9kZSwgMSksIFRtcDQpOworICAgICAgcmV0dXJuIE9wLmdldFJlc05vKCkgPyBUbXA0IDogVG1wMzsKKyAgICB9IGVsc2UgeworICAgICAgRVZUIFNyY1ZUID0gTEQtPmdldE1lbW9yeVZUKCk7CisgICAgICB1bnNpZ25lZCBTcmNXaWR0aCA9IFNyY1ZULmdldFNpemVJbkJpdHMoKTsKKyAgICAgIGludCBTVk9mZnNldCA9IExELT5nZXRTcmNWYWx1ZU9mZnNldCgpOworICAgICAgdW5zaWduZWQgQWxpZ25tZW50ID0gTEQtPmdldEFsaWdubWVudCgpOworICAgICAgYm9vbCBpc1ZvbGF0aWxlID0gTEQtPmlzVm9sYXRpbGUoKTsKKyAgICAgIGJvb2wgaXNOb25UZW1wb3JhbCA9IExELT5pc05vblRlbXBvcmFsKCk7CisKKyAgICAgIGlmIChTcmNXaWR0aCAhPSBTcmNWVC5nZXRTdG9yZVNpemVJbkJpdHMoKSAmJgorICAgICAgICAgIC8vIFNvbWUgdGFyZ2V0cyBwcmV0ZW5kIHRvIGhhdmUgYW4gaTEgbG9hZGluZyBvcGVyYXRpb24sIGFuZCBhY3R1YWxseQorICAgICAgICAgIC8vIGxvYWQgYW4gaTguICBUaGlzIHRyaWNrIGlzIGNvcnJlY3QgZm9yIFpFWFRMT0FEIGJlY2F1c2UgdGhlIHRvcCA3CisgICAgICAgICAgLy8gYml0cyBhcmUgZ3VhcmFudGVlZCB0byBiZSB6ZXJvOyBpdCBoZWxwcyB0aGUgb3B0aW1pemVycyB1bmRlcnN0YW5kCisgICAgICAgICAgLy8gdGhhdCB0aGVzZSBiaXRzIGFyZSB6ZXJvLiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIEVYVExPQUQsIHNpbmNlIGl0CisgICAgICAgICAgLy8gdGVsbHMgdGhlIG9wdGltaXplcnMgdGhhdCB0aG9zZSBiaXRzIGFyZSB1bmRlZmluZWQuICBJdCB3b3VsZCBiZQorICAgICAgICAgIC8vIG5pY2UgdG8gaGF2ZSBhbiBlZmZlY3RpdmUgZ2VuZXJpYyB3YXkgb2YgZ2V0dGluZyB0aGVzZSBiZW5lZml0cy4uLgorICAgICAgICAgIC8vIFVudGlsIHN1Y2ggYSB3YXkgaXMgZm91bmQsIGRvbid0IGluc2lzdCBvbiBwcm9tb3RpbmcgaTEgaGVyZS4KKyAgICAgICAgICAoU3JjVlQgIT0gTVZUOjppMSB8fAorICAgICAgICAgICBUTEkuZ2V0TG9hZEV4dEFjdGlvbihFeHRUeXBlLCBNVlQ6OmkxKSA9PSBUYXJnZXRMb3dlcmluZzo6UHJvbW90ZSkpIHsKKyAgICAgICAgLy8gUHJvbW90ZSB0byBhIGJ5dGUtc2l6ZWQgbG9hZCBpZiBub3QgbG9hZGluZyBhbiBpbnRlZ3JhbCBudW1iZXIgb2YKKyAgICAgICAgLy8gYnl0ZXMuICBGb3IgZXhhbXBsZSwgcHJvbW90ZSBFWFRMT0FEOmkyMCAtPiBFWFRMT0FEOmkyNC4KKyAgICAgICAgdW5zaWduZWQgTmV3V2lkdGggPSBTcmNWVC5nZXRTdG9yZVNpemVJbkJpdHMoKTsKKyAgICAgICAgRVZUIE5WVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBOZXdXaWR0aCk7CisgICAgICAgIFNEVmFsdWUgQ2g7CisKKyAgICAgICAgLy8gVGhlIGV4dHJhIGJpdHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgemVybywgc2luY2Ugd2Ugc3RvcmVkIHRoZW0gdGhhdAorICAgICAgICAvLyB3YXkuICBBIHpleHQgbG9hZCBmcm9tIE5WVCB0aHVzIGF1dG9tYXRpY2FsbHkgZ2l2ZXMgemV4dCBmcm9tIFNyY1ZULgorCisgICAgICAgIElTRDo6TG9hZEV4dFR5cGUgTmV3RXh0VHlwZSA9CisgICAgICAgICAgRXh0VHlwZSA9PSBJU0Q6OlpFWFRMT0FEID8gSVNEOjpaRVhUTE9BRCA6IElTRDo6RVhUTE9BRDsKKworICAgICAgICBSZXN1bHQgPSBEQUcuZ2V0RXh0TG9hZChOZXdFeHRUeXBlLCBOb2RlLT5nZXRWYWx1ZVR5cGUoMCksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbXAxLCBUbXAyLCBMRC0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WVCwgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwgQWxpZ25tZW50KTsKKworICAgICAgICBDaCA9IFJlc3VsdC5nZXRWYWx1ZSgxKTsgLy8gVGhlIGNoYWluLgorCisgICAgICAgIGlmIChFeHRUeXBlID09IElTRDo6U0VYVExPQUQpCisgICAgICAgICAgLy8gSGF2aW5nIHRoZSB0b3AgYml0cyB6ZXJvIGRvZXNuJ3QgaGVscCB3aGVuIHNpZ24gZXh0ZW5kaW5nLgorICAgICAgICAgIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQsIERBRy5nZXRWYWx1ZVR5cGUoU3JjVlQpKTsKKyAgICAgICAgZWxzZSBpZiAoRXh0VHlwZSA9PSBJU0Q6OlpFWFRMT0FEIHx8IE5WVCA9PSBSZXN1bHQuZ2V0VmFsdWVUeXBlKCkpCisgICAgICAgICAgLy8gQWxsIHRoZSB0b3AgYml0cyBhcmUgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIC0gaW5mb3JtIHRoZSBvcHRpbWl6ZXJzLgorICAgICAgICAgIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0WmV4dCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0LmdldFZhbHVlVHlwZSgpLCBSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShTcmNWVCkpOworCisgICAgICAgIFRtcDEgPSBMZWdhbGl6ZU9wKFJlc3VsdCk7CisgICAgICAgIFRtcDIgPSBMZWdhbGl6ZU9wKENoKTsKKyAgICAgIH0gZWxzZSBpZiAoU3JjV2lkdGggJiAoU3JjV2lkdGggLSAxKSkgeworICAgICAgICAvLyBJZiBub3QgbG9hZGluZyBhIHBvd2VyLW9mLTIgbnVtYmVyIG9mIGJpdHMsIGV4cGFuZCBhcyB0d28gbG9hZHMuCisgICAgICAgIGFzc2VydCghU3JjVlQuaXNWZWN0b3IoKSAmJiAiVW5zdXBwb3J0ZWQgZXh0bG9hZCEiKTsKKyAgICAgICAgdW5zaWduZWQgUm91bmRXaWR0aCA9IDEgPDwgTG9nMl8zMihTcmNXaWR0aCk7CisgICAgICAgIGFzc2VydChSb3VuZFdpZHRoIDwgU3JjV2lkdGgpOworICAgICAgICB1bnNpZ25lZCBFeHRyYVdpZHRoID0gU3JjV2lkdGggLSBSb3VuZFdpZHRoOworICAgICAgICBhc3NlcnQoRXh0cmFXaWR0aCA8IFJvdW5kV2lkdGgpOworICAgICAgICBhc3NlcnQoIShSb3VuZFdpZHRoICUgOCkgJiYgIShFeHRyYVdpZHRoICUgOCkgJiYKKyAgICAgICAgICAgICAgICJMb2FkIHNpemUgbm90IGFuIGludGVncmFsIG51bWJlciBvZiBieXRlcyEiKTsKKyAgICAgICAgRVZUIFJvdW5kVlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgUm91bmRXaWR0aCk7CisgICAgICAgIEVWVCBFeHRyYVZUID0gRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksIEV4dHJhV2lkdGgpOworICAgICAgICBTRFZhbHVlIExvLCBIaSwgQ2g7CisgICAgICAgIHVuc2lnbmVkIEluY3JlbWVudFNpemU7CisKKyAgICAgICAgaWYgKFRMSS5pc0xpdHRsZUVuZGlhbigpKSB7CisgICAgICAgICAgLy8gRVhUTE9BRDppMjQgLT4gWkVYVExPQUQ6aTE2IHwgKHNobCBFWFRMT0FEQCsyOmk4LCAxNikKKyAgICAgICAgICAvLyBMb2FkIHRoZSBib3R0b20gUm91bmRXaWR0aCBiaXRzLgorICAgICAgICAgIExvID0gREFHLmdldEV4dExvYWQoSVNEOjpaRVhUTE9BRCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRtcDEsIFRtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQsIFJvdW5kVlQsIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05vblRlbXBvcmFsLCBBbGlnbm1lbnQpOworCisgICAgICAgICAgLy8gTG9hZCB0aGUgcmVtYWluaW5nIEV4dHJhV2lkdGggYml0cy4KKyAgICAgICAgICBJbmNyZW1lbnRTaXplID0gUm91bmRXaWR0aCAvIDg7CisgICAgICAgICAgVG1wMiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgVG1wMi5nZXRWYWx1ZVR5cGUoKSwgVG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluY3JlbWVudFNpemUpKTsKKyAgICAgICAgICBIaSA9IERBRy5nZXRFeHRMb2FkKEV4dFR5cGUsIE5vZGUtPmdldFZhbHVlVHlwZSgwKSwgZGwsIFRtcDEsIFRtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQgKyBJbmNyZW1lbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFWVCwgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbkFsaWduKEFsaWdubWVudCwgSW5jcmVtZW50U2l6ZSkpOworCisgICAgICAgICAgLy8gQnVpbGQgYSBmYWN0b3Igbm9kZSB0byByZW1lbWJlciB0aGF0IHRoaXMgbG9hZCBpcyBpbmRlcGVuZGVudCBvZgorICAgICAgICAgIC8vIHRoZSBvdGhlciBvbmUuCisgICAgICAgICAgQ2ggPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgTG8uZ2V0VmFsdWUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIaS5nZXRWYWx1ZSgxKSk7CisKKyAgICAgICAgICAvLyBNb3ZlIHRoZSB0b3AgYml0cyB0byB0aGUgcmlnaHQgcGxhY2UuCisgICAgICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIEhpLmdldFZhbHVlVHlwZSgpLCBIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChSb3VuZFdpZHRoLCBUTEkuZ2V0U2hpZnRBbW91bnRUeSgpKSk7CisKKyAgICAgICAgICAvLyBKb2luIHRoZSBoaSBhbmQgbG8gcGFydHMuCisgICAgICAgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIE5vZGUtPmdldFZhbHVlVHlwZSgwKSwgTG8sIEhpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBCaWcgZW5kaWFuIC0gYXZvaWQgdW5hbGlnbmVkIGxvYWRzLgorICAgICAgICAgIC8vIEVYVExPQUQ6aTI0IC0+IChzaGwgRVhUTE9BRDppMTYsIDgpIHwgWkVYVExPQURAKzI6aTgKKyAgICAgICAgICAvLyBMb2FkIHRoZSB0b3AgUm91bmRXaWR0aCBiaXRzLgorICAgICAgICAgIEhpID0gREFHLmdldEV4dExvYWQoRXh0VHlwZSwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLCBkbCwgVG1wMSwgVG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCwgUm91bmRWVCwgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9uVGVtcG9yYWwsIEFsaWdubWVudCk7CisKKyAgICAgICAgICAvLyBMb2FkIHRoZSByZW1haW5pbmcgRXh0cmFXaWR0aCBiaXRzLgorICAgICAgICAgIEluY3JlbWVudFNpemUgPSBSb3VuZFdpZHRoIC8gODsKKyAgICAgICAgICBUbXAyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBUbXAyLmdldFZhbHVlVHlwZSgpLCBUbXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSW5jcmVtZW50U2l6ZSkpOworICAgICAgICAgIExvID0gREFHLmdldEV4dExvYWQoSVNEOjpaRVhUTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldFZhbHVlVHlwZSgwKSwgZGwsIFRtcDEsIFRtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQgKyBJbmNyZW1lbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFWVCwgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbkFsaWduKEFsaWdubWVudCwgSW5jcmVtZW50U2l6ZSkpOworCisgICAgICAgICAgLy8gQnVpbGQgYSBmYWN0b3Igbm9kZSB0byByZW1lbWJlciB0aGF0IHRoaXMgbG9hZCBpcyBpbmRlcGVuZGVudCBvZgorICAgICAgICAgIC8vIHRoZSBvdGhlciBvbmUuCisgICAgICAgICAgQ2ggPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgTG8uZ2V0VmFsdWUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIaS5nZXRWYWx1ZSgxKSk7CisKKyAgICAgICAgICAvLyBNb3ZlIHRoZSB0b3AgYml0cyB0byB0aGUgcmlnaHQgcGxhY2UuCisgICAgICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIEhpLmdldFZhbHVlVHlwZSgpLCBIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChFeHRyYVdpZHRoLCBUTEkuZ2V0U2hpZnRBbW91bnRUeSgpKSk7CisKKyAgICAgICAgICAvLyBKb2luIHRoZSBoaSBhbmQgbG8gcGFydHMuCisgICAgICAgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIE5vZGUtPmdldFZhbHVlVHlwZSgwKSwgTG8sIEhpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRtcDEgPSBMZWdhbGl6ZU9wKFJlc3VsdCk7CisgICAgICAgIFRtcDIgPSBMZWdhbGl6ZU9wKENoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoVExJLmdldExvYWRFeHRBY3Rpb24oRXh0VHlwZSwgU3JjVlQpKSB7CisgICAgICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJUaGlzIGFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCEiKTsKKyAgICAgICAgY2FzZSBUYXJnZXRMb3dlcmluZzo6Q3VzdG9tOgorICAgICAgICAgIGlzQ3VzdG9tID0gdHJ1ZTsKKyAgICAgICAgICAvLyBGQUxMVEhST1VHSAorICAgICAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpMZWdhbDoKKyAgICAgICAgICBSZXN1bHQgPSBTRFZhbHVlKERBRy5VcGRhdGVOb2RlT3BlcmFuZHMoUmVzdWx0LmdldE5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wMSwgVG1wMiwgTEQtPmdldE9mZnNldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdC5nZXRSZXNObygpKTsKKyAgICAgICAgICBUbXAxID0gUmVzdWx0LmdldFZhbHVlKDApOworICAgICAgICAgIFRtcDIgPSBSZXN1bHQuZ2V0VmFsdWUoMSk7CisKKyAgICAgICAgICBpZiAoaXNDdXN0b20pIHsKKyAgICAgICAgICAgIFRtcDMgPSBUTEkuTG93ZXJPcGVyYXRpb24oUmVzdWx0LCBEQUcpOworICAgICAgICAgICAgaWYgKFRtcDMuZ2V0Tm9kZSgpKSB7CisgICAgICAgICAgICAgIFRtcDEgPSBMZWdhbGl6ZU9wKFRtcDMpOworICAgICAgICAgICAgICBUbXAyID0gTGVnYWxpemVPcChUbXAzLmdldFZhbHVlKDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiB1bmFsaWduZWQgbG9hZCBhbmQgdGhlIHRhcmdldCBkb2Vzbid0IHN1cHBvcnQgaXQsCisgICAgICAgICAgICAvLyBleHBhbmQgaXQuCisgICAgICAgICAgICBpZiAoIVRMSS5hbGxvd3NVbmFsaWduZWRNZW1vcnlBY2Nlc3NlcyhMRC0+Z2V0TWVtb3J5VlQoKSkpIHsKKyAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkgPQorICAgICAgICAgICAgICAgIExELT5nZXRNZW1vcnlWVCgpLmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICB1bnNpZ25lZCBBQklBbGlnbm1lbnQgPQorICAgICAgICAgICAgICAgIFRMSS5nZXRUYXJnZXREYXRhKCktPmdldEFCSVR5cGVBbGlnbm1lbnQoVHkpOworICAgICAgICAgICAgICBpZiAoTEQtPmdldEFsaWdubWVudCgpIDwgQUJJQWxpZ25tZW50KXsKKyAgICAgICAgICAgICAgICBSZXN1bHQgPSBFeHBhbmRVbmFsaWduZWRMb2FkKGNhc3Q8TG9hZFNETm9kZT4oUmVzdWx0LmdldE5vZGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcsIFRMSSk7CisgICAgICAgICAgICAgICAgVG1wMSA9IFJlc3VsdC5nZXRPcGVyYW5kKDApOworICAgICAgICAgICAgICAgIFRtcDIgPSBSZXN1bHQuZ2V0T3BlcmFuZCgxKTsKKyAgICAgICAgICAgICAgICBUbXAxID0gTGVnYWxpemVPcChUbXAxKTsKKyAgICAgICAgICAgICAgICBUbXAyID0gTGVnYWxpemVPcChUbXAyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUYXJnZXRMb3dlcmluZzo6RXhwYW5kOgorICAgICAgICAgIC8vIGY2NCA9IEVYVExPQUQgZjMyIHNob3VsZCBleHBhbmQgdG8gTE9BRCwgRlBfRVhURU5ECisgICAgICAgICAgLy8gZjEyOCA9IEVYVExPQUQge2YzMixmNjR9IHRvbworICAgICAgICAgIGlmICgoU3JjVlQgPT0gTVZUOjpmMzIgJiYgKE5vZGUtPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmY2NCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmYxMjgpKSB8fAorICAgICAgICAgICAgICAoU3JjVlQgPT0gTVZUOjpmNjQgJiYgTm9kZS0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6ZjEyOCkpIHsKKyAgICAgICAgICAgIFNEVmFsdWUgTG9hZCA9IERBRy5nZXRMb2FkKFNyY1ZULCBkbCwgVG1wMSwgVG1wMiwgTEQtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5pc1ZvbGF0aWxlKCksIExELT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0QWxpZ25tZW50KCkpOworICAgICAgICAgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpGUF9FWFRFTkQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLCBMb2FkKTsKKyAgICAgICAgICAgIFRtcDEgPSBMZWdhbGl6ZU9wKFJlc3VsdCk7ICAvLyBSZWxlZ2FsaXplIG5ldyBub2Rlcy4KKyAgICAgICAgICAgIFRtcDIgPSBMZWdhbGl6ZU9wKExvYWQuZ2V0VmFsdWUoMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGFzc2VydChFeHRUeXBlICE9IElTRDo6RVhUTE9BRCAmJgorICAgICAgICAgICAgICAgICAiRVhUTE9BRCBzaG91bGQgYWx3YXlzIGJlIHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAvLyBUdXJuIHRoZSB1bnN1cHBvcnRlZCBsb2FkIGludG8gYW4gRVhUTE9BRCBmb2xsb3dlZCBieSBhbiBleHBsaWNpdAorICAgICAgICAgIC8vIHplcm8vc2lnbiBleHRlbmQgaW5yZWcuCisgICAgICAgICAgUmVzdWx0ID0gREFHLmdldEV4dExvYWQoSVNEOjpFWFRMT0FELCBOb2RlLT5nZXRWYWx1ZVR5cGUoMCksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRtcDEsIFRtcDIsIExELT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5nZXRTcmNWYWx1ZU9mZnNldCgpLCBTcmNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+aXNWb2xhdGlsZSgpLCBMRC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5nZXRBbGlnbm1lbnQoKSk7CisgICAgICAgICAgU0RWYWx1ZSBWYWxSZXM7CisgICAgICAgICAgaWYgKEV4dFR5cGUgPT0gSVNEOjpTRVhUTE9BRCkKKyAgICAgICAgICAgIFZhbFJlcyA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0LmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0LCBEQUcuZ2V0VmFsdWVUeXBlKFNyY1ZUKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgVmFsUmVzID0gREFHLmdldFplcm9FeHRlbmRJblJlZyhSZXN1bHQsIGRsLCBTcmNWVCk7CisgICAgICAgICAgVG1wMSA9IExlZ2FsaXplT3AoVmFsUmVzKTsgIC8vIFJlbGVnYWxpemUgbmV3IG5vZGVzLgorICAgICAgICAgIFRtcDIgPSBMZWdhbGl6ZU9wKFJlc3VsdC5nZXRWYWx1ZSgxKSk7ICAvLyBSZWxlZ2FsaXplIG5ldyBub2Rlcy4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBTaW5jZSBsb2FkcyBwcm9kdWNlIHR3byB2YWx1ZXMsIG1ha2Ugc3VyZSB0byByZW1lbWJlciB0aGF0IHdlIGxlZ2FsaXplZAorICAgICAgLy8gYm90aCBvZiB0aGVtLgorICAgICAgQWRkTGVnYWxpemVkT3BlcmFuZChTRFZhbHVlKE5vZGUsIDApLCBUbXAxKTsKKyAgICAgIEFkZExlZ2FsaXplZE9wZXJhbmQoU0RWYWx1ZShOb2RlLCAxKSwgVG1wMik7CisgICAgICByZXR1cm4gT3AuZ2V0UmVzTm8oKSA/IFRtcDIgOiBUbXAxOworICAgIH0KKyAgfQorICBjYXNlIElTRDo6U1RPUkU6IHsKKyAgICBTdG9yZVNETm9kZSAqU1QgPSBjYXN0PFN0b3JlU0ROb2RlPihOb2RlKTsKKyAgICBUbXAxID0gTGVnYWxpemVPcChTVC0+Z2V0Q2hhaW4oKSk7ICAgIC8vIExlZ2FsaXplIHRoZSBjaGFpbi4KKyAgICBUbXAyID0gTGVnYWxpemVPcChTVC0+Z2V0QmFzZVB0cigpKTsgIC8vIExlZ2FsaXplIHRoZSBwb2ludGVyLgorICAgIGludCBTVk9mZnNldCA9IFNULT5nZXRTcmNWYWx1ZU9mZnNldCgpOworICAgIHVuc2lnbmVkIEFsaWdubWVudCA9IFNULT5nZXRBbGlnbm1lbnQoKTsKKyAgICBib29sIGlzVm9sYXRpbGUgPSBTVC0+aXNWb2xhdGlsZSgpOworICAgIGJvb2wgaXNOb25UZW1wb3JhbCA9IFNULT5pc05vblRlbXBvcmFsKCk7CisKKyAgICBpZiAoIVNULT5pc1RydW5jYXRpbmdTdG9yZSgpKSB7CisgICAgICBpZiAoU0ROb2RlICpPcHRTdG9yZSA9IE9wdGltaXplRmxvYXRTdG9yZShTVCkuZ2V0Tm9kZSgpKSB7CisgICAgICAgIFJlc3VsdCA9IFNEVmFsdWUoT3B0U3RvcmUsIDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICBUbXAzID0gTGVnYWxpemVPcChTVC0+Z2V0VmFsdWUoKSk7CisgICAgICAgIFJlc3VsdCA9IFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhSZXN1bHQuZ2V0Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wMSwgVG1wMywgVG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRPZmZzZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0LmdldFJlc05vKCkpOworCisgICAgICAgIEVWVCBWVCA9IFRtcDMuZ2V0VmFsdWVUeXBlKCk7CisgICAgICAgIHN3aXRjaCAoVExJLmdldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUT1JFLCBWVCkpIHsKKyAgICAgICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlRoaXMgYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgeWV0ISIpOworICAgICAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpMZWdhbDoKKyAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIHVuYWxpZ25lZCBzdG9yZSBhbmQgdGhlIHRhcmdldCBkb2Vzbid0IHN1cHBvcnQgaXQsCisgICAgICAgICAgLy8gZXhwYW5kIGl0LgorICAgICAgICAgIGlmICghVExJLmFsbG93c1VuYWxpZ25lZE1lbW9yeUFjY2Vzc2VzKFNULT5nZXRNZW1vcnlWVCgpKSkgeworICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkgPSBTVC0+Z2V0TWVtb3J5VlQoKS5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIEFCSUFsaWdubWVudD0gVExJLmdldFRhcmdldERhdGEoKS0+Z2V0QUJJVHlwZUFsaWdubWVudChUeSk7CisgICAgICAgICAgICBpZiAoU1QtPmdldEFsaWdubWVudCgpIDwgQUJJQWxpZ25tZW50KQorICAgICAgICAgICAgICBSZXN1bHQgPSBFeHBhbmRVbmFsaWduZWRTdG9yZShjYXN0PFN0b3JlU0ROb2RlPihSZXN1bHQuZ2V0Tm9kZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLCBUTEkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUYXJnZXRMb3dlcmluZzo6Q3VzdG9tOgorICAgICAgICAgIFRtcDEgPSBUTEkuTG93ZXJPcGVyYXRpb24oUmVzdWx0LCBEQUcpOworICAgICAgICAgIGlmIChUbXAxLmdldE5vZGUoKSkgUmVzdWx0ID0gVG1wMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUYXJnZXRMb3dlcmluZzo6UHJvbW90ZToKKyAgICAgICAgICBhc3NlcnQoVlQuaXNWZWN0b3IoKSAmJiAiVW5rbm93biBsZWdhbCBwcm9tb3RlIGNhc2UhIik7CisgICAgICAgICAgVG1wMyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0VHlwZVRvUHJvbW90ZVRvKElTRDo6U1RPUkUsIFZUKSwgVG1wMyk7CisgICAgICAgICAgUmVzdWx0ID0gREFHLmdldFN0b3JlKFRtcDEsIGRsLCBUbXAzLCBUbXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQsIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9uVGVtcG9yYWwsIEFsaWdubWVudCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFRtcDMgPSBMZWdhbGl6ZU9wKFNULT5nZXRWYWx1ZSgpKTsKKworICAgICAgRVZUIFN0VlQgPSBTVC0+Z2V0TWVtb3J5VlQoKTsKKyAgICAgIHVuc2lnbmVkIFN0V2lkdGggPSBTdFZULmdldFNpemVJbkJpdHMoKTsKKworICAgICAgaWYgKFN0V2lkdGggIT0gU3RWVC5nZXRTdG9yZVNpemVJbkJpdHMoKSkgeworICAgICAgICAvLyBQcm9tb3RlIHRvIGEgYnl0ZS1zaXplZCBzdG9yZSB3aXRoIHVwcGVyIGJpdHMgemVybyBpZiBub3QKKyAgICAgICAgLy8gc3RvcmluZyBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgYnl0ZXMuICBGb3IgZXhhbXBsZSwgcHJvbW90ZQorICAgICAgICAvLyBUUlVOQ1NUT1JFOmkxIFggLT4gVFJVTkNTVE9SRTppOCAoYW5kIFgsIDEpCisgICAgICAgIEVWVCBOVlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0VlQuZ2V0U3RvcmVTaXplSW5CaXRzKCkpOworICAgICAgICBUbXAzID0gREFHLmdldFplcm9FeHRlbmRJblJlZyhUbXAzLCBkbCwgU3RWVCk7CisgICAgICAgIFJlc3VsdCA9IERBRy5nZXRUcnVuY1N0b3JlKFRtcDEsIGRsLCBUbXAzLCBUbXAyLCBTVC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQsIE5WVCwgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50KTsKKyAgICAgIH0gZWxzZSBpZiAoU3RXaWR0aCAmIChTdFdpZHRoIC0gMSkpIHsKKyAgICAgICAgLy8gSWYgbm90IHN0b3JpbmcgYSBwb3dlci1vZi0yIG51bWJlciBvZiBiaXRzLCBleHBhbmQgYXMgdHdvIHN0b3Jlcy4KKyAgICAgICAgYXNzZXJ0KCFTdFZULmlzVmVjdG9yKCkgJiYgIlVuc3VwcG9ydGVkIHRydW5jc3RvcmUhIik7CisgICAgICAgIHVuc2lnbmVkIFJvdW5kV2lkdGggPSAxIDw8IExvZzJfMzIoU3RXaWR0aCk7CisgICAgICAgIGFzc2VydChSb3VuZFdpZHRoIDwgU3RXaWR0aCk7CisgICAgICAgIHVuc2lnbmVkIEV4dHJhV2lkdGggPSBTdFdpZHRoIC0gUm91bmRXaWR0aDsKKyAgICAgICAgYXNzZXJ0KEV4dHJhV2lkdGggPCBSb3VuZFdpZHRoKTsKKyAgICAgICAgYXNzZXJ0KCEoUm91bmRXaWR0aCAlIDgpICYmICEoRXh0cmFXaWR0aCAlIDgpICYmCisgICAgICAgICAgICAgICAiU3RvcmUgc2l6ZSBub3QgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIGJ5dGVzISIpOworICAgICAgICBFVlQgUm91bmRWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBSb3VuZFdpZHRoKTsKKyAgICAgICAgRVZUIEV4dHJhVlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgRXh0cmFXaWR0aCk7CisgICAgICAgIFNEVmFsdWUgTG8sIEhpOworICAgICAgICB1bnNpZ25lZCBJbmNyZW1lbnRTaXplOworCisgICAgICAgIGlmIChUTEkuaXNMaXR0bGVFbmRpYW4oKSkgeworICAgICAgICAgIC8vIFRSVU5DU1RPUkU6aTI0IFggLT4gVFJVTkNTVE9SRTppMTYgWCwgVFJVTkNTVE9SRUArMjppOCAoc3JsIFgsIDE2KQorICAgICAgICAgIC8vIFN0b3JlIHRoZSBib3R0b20gUm91bmRXaWR0aCBiaXRzLgorICAgICAgICAgIExvID0gREFHLmdldFRydW5jU3RvcmUoVG1wMSwgZGwsIFRtcDMsIFRtcDIsIFNULT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQsIFJvdW5kVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLCBBbGlnbm1lbnQpOworCisgICAgICAgICAgLy8gU3RvcmUgdGhlIHJlbWFpbmluZyBFeHRyYVdpZHRoIGJpdHMuCisgICAgICAgICAgSW5jcmVtZW50U2l6ZSA9IFJvdW5kV2lkdGggLyA4OworICAgICAgICAgIFRtcDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFRtcDIuZ2V0VmFsdWVUeXBlKCksIFRtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJbmNyZW1lbnRTaXplKSk7CisgICAgICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIFRtcDMuZ2V0VmFsdWVUeXBlKCksIFRtcDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoUm91bmRXaWR0aCwgVExJLmdldFNoaWZ0QW1vdW50VHkoKSkpOworICAgICAgICAgIEhpID0gREFHLmdldFRydW5jU3RvcmUoVG1wMSwgZGwsIEhpLCBUbXAyLCBTVC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0ICsgSW5jcmVtZW50U2l6ZSwgRXh0cmFWVCwgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9uVGVtcG9yYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5BbGlnbihBbGlnbm1lbnQsIEluY3JlbWVudFNpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBCaWcgZW5kaWFuIC0gYXZvaWQgdW5hbGlnbmVkIHN0b3Jlcy4KKyAgICAgICAgICAvLyBUUlVOQ1NUT1JFOmkyNCBYIC0+IFRSVU5DU1RPUkU6aTE2IChzcmwgWCwgOCksIFRSVU5DU1RPUkVAKzI6aTggWAorICAgICAgICAgIC8vIFN0b3JlIHRoZSB0b3AgUm91bmRXaWR0aCBiaXRzLgorICAgICAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBUbXAzLmdldFZhbHVlVHlwZSgpLCBUbXAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEV4dHJhV2lkdGgsIFRMSS5nZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgICAgICAgICBIaSA9IERBRy5nZXRUcnVuY1N0b3JlKFRtcDEsIGRsLCBIaSwgVG1wMiwgU1QtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVk9mZnNldCwgUm91bmRWVCwgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCk7CisKKyAgICAgICAgICAvLyBTdG9yZSB0aGUgcmVtYWluaW5nIEV4dHJhV2lkdGggYml0cy4KKyAgICAgICAgICBJbmNyZW1lbnRTaXplID0gUm91bmRXaWR0aCAvIDg7CisgICAgICAgICAgVG1wMiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgVG1wMi5nZXRWYWx1ZVR5cGUoKSwgVG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluY3JlbWVudFNpemUpKTsKKyAgICAgICAgICBMbyA9IERBRy5nZXRUcnVuY1N0b3JlKFRtcDEsIGRsLCBUbXAzLCBUbXAyLCBTVC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0ICsgSW5jcmVtZW50U2l6ZSwgRXh0cmFWVCwgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9uVGVtcG9yYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5BbGlnbihBbGlnbm1lbnQsIEluY3JlbWVudFNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBvcmRlciBvZiB0aGUgc3RvcmVzIGRvZXNuJ3QgbWF0dGVyLgorICAgICAgICBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgTG8sIEhpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChUbXAxICE9IFNULT5nZXRDaGFpbigpIHx8IFRtcDMgIT0gU1QtPmdldFZhbHVlKCkgfHwKKyAgICAgICAgICAgIFRtcDIgIT0gU1QtPmdldEJhc2VQdHIoKSkKKyAgICAgICAgICBSZXN1bHQgPSBTRFZhbHVlKERBRy5VcGRhdGVOb2RlT3BlcmFuZHMoUmVzdWx0LmdldE5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wMSwgVG1wMywgVG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldE9mZnNldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdC5nZXRSZXNObygpKTsKKworICAgICAgICBzd2l0Y2ggKFRMSS5nZXRUcnVuY1N0b3JlQWN0aW9uKFNULT5nZXRWYWx1ZSgpLmdldFZhbHVlVHlwZSgpLCBTdFZUKSkgeworICAgICAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVGhpcyBhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQhIik7CisgICAgICAgIGNhc2UgVGFyZ2V0TG93ZXJpbmc6OkxlZ2FsOgorICAgICAgICAgIC8vIElmIHRoaXMgaXMgYW4gdW5hbGlnbmVkIHN0b3JlIGFuZCB0aGUgdGFyZ2V0IGRvZXNuJ3Qgc3VwcG9ydCBpdCwKKyAgICAgICAgICAvLyBleHBhbmQgaXQuCisgICAgICAgICAgaWYgKCFUTEkuYWxsb3dzVW5hbGlnbmVkTWVtb3J5QWNjZXNzZXMoU1QtPmdldE1lbW9yeVZUKCkpKSB7CisgICAgICAgICAgICBjb25zdCBUeXBlICpUeSA9IFNULT5nZXRNZW1vcnlWVCgpLmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpOworICAgICAgICAgICAgdW5zaWduZWQgQUJJQWxpZ25tZW50PSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRBQklUeXBlQWxpZ25tZW50KFR5KTsKKyAgICAgICAgICAgIGlmIChTVC0+Z2V0QWxpZ25tZW50KCkgPCBBQklBbGlnbm1lbnQpCisgICAgICAgICAgICAgIFJlc3VsdCA9IEV4cGFuZFVuYWxpZ25lZFN0b3JlKGNhc3Q8U3RvcmVTRE5vZGU+KFJlc3VsdC5nZXROb2RlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcsIFRMSSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpDdXN0b206CisgICAgICAgICAgUmVzdWx0ID0gVExJLkxvd2VyT3BlcmF0aW9uKFJlc3VsdCwgREFHKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFeHBhbmQ6CisgICAgICAgICAgLy8gVFJVTkNTVE9SRTppMTYgaTMyIC0+IFNUT1JFIGkxNgorICAgICAgICAgIGFzc2VydChpc1R5cGVMZWdhbChTdFZUKSAmJiAiRG8gbm90IGtub3cgaG93IHRvIGV4cGFuZCB0aGlzIHN0b3JlISIpOworICAgICAgICAgIFRtcDMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgU3RWVCwgVG1wMyk7CisgICAgICAgICAgUmVzdWx0ID0gREFHLmdldFN0b3JlKFRtcDEsIGRsLCBUbXAzLCBUbXAyLCBTVC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQsIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgfQorICBhc3NlcnQoUmVzdWx0LmdldFZhbHVlVHlwZSgpID09IE9wLmdldFZhbHVlVHlwZSgpICYmCisgICAgICAgICAiQmFkIGxlZ2FsaXphdGlvbiEiKTsKKworICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgaXMgaXRzZWxmIGxlZ2FsLgorICBpZiAoUmVzdWx0ICE9IE9wKQorICAgIFJlc3VsdCA9IExlZ2FsaXplT3AoUmVzdWx0KTsKKworICAvLyBOb3RlIHRoYXQgTGVnYWxpemVPcCBtYXkgYmUgcmVlbnRlcmVkIGV2ZW4gZnJvbSBzaW5nbGUtdXNlIG5vZGVzLCB3aGljaAorICAvLyBtZWFucyB0aGF0IHdlIGFsd2F5cyBtdXN0IGNhY2hlIHRyYW5zZm9ybWVkIG5vZGVzLgorICBBZGRMZWdhbGl6ZWRPcGVyYW5kKE9wLCBSZXN1bHQpOworICByZXR1cm4gUmVzdWx0OworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBR0xlZ2FsaXplOjpFeHBhbmRFeHRyYWN0RnJvbVZlY3RvclRocm91Z2hTdGFjayhTRFZhbHVlIE9wKSB7CisgIFNEVmFsdWUgVmVjID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBJZHggPSBPcC5nZXRPcGVyYW5kKDEpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIC8vIFN0b3JlIHRoZSB2YWx1ZSB0byBhIHRlbXBvcmFyeSBzdGFjayBzbG90LCB0aGVuIExPQUQgdGhlIHJldHVybmVkIHBhcnQuCisgIFNEVmFsdWUgU3RhY2tQdHIgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoVmVjLmdldFZhbHVlVHlwZSgpKTsKKyAgU0RWYWx1ZSBDaCA9IERBRy5nZXRTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBWZWMsIFN0YWNrUHRyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgLy8gQWRkIHRoZSBvZmZzZXQgdG8gdGhlIGluZGV4LgorICB1bnNpZ25lZCBFbHRTaXplID0KKyAgICAgIFZlYy5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKS84OworICBJZHggPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZGwsIElkeC5nZXRWYWx1ZVR5cGUoKSwgSWR4LAorICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoRWx0U2l6ZSwgSWR4LmdldFZhbHVlVHlwZSgpKSk7CisKKyAgaWYgKElkeC5nZXRWYWx1ZVR5cGUoKS5iaXRzR1QoVExJLmdldFBvaW50ZXJUeSgpKSkKKyAgICBJZHggPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgVExJLmdldFBvaW50ZXJUeSgpLCBJZHgpOworICBlbHNlCisgICAgSWR4ID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZGwsIFRMSS5nZXRQb2ludGVyVHkoKSwgSWR4KTsKKworICBTdGFja1B0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgSWR4LmdldFZhbHVlVHlwZSgpLCBJZHgsIFN0YWNrUHRyKTsKKworICBpZiAoT3AuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSkKKyAgICByZXR1cm4gREFHLmdldExvYWQoT3AuZ2V0VmFsdWVUeXBlKCksIGRsLCBDaCwgU3RhY2tQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgIGVsc2UKKyAgICByZXR1cm4gREFHLmdldEV4dExvYWQoSVNEOjpFWFRMT0FELCBPcC5nZXRWYWx1ZVR5cGUoKSwgZGwsIENoLCBTdGFja1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgVmVjLmdldFZhbHVlVHlwZSgpLmdldFZlY3RvckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHTGVnYWxpemU6OkV4cGFuZFZlY3RvckJ1aWxkVGhyb3VnaFN0YWNrKFNETm9kZSogTm9kZSkgeworICAvLyBXZSBjYW4ndCBoYW5kbGUgdGhpcyBjYXNlIGVmZmljaWVudGx5LiAgQWxsb2NhdGUgYSBzdWZmaWNpZW50bHkKKyAgLy8gYWxpZ25lZCBvYmplY3Qgb24gdGhlIHN0YWNrLCBzdG9yZSBlYWNoIGVsZW1lbnQgaW50byBpdCwgdGhlbiBsb2FkCisgIC8vIHRoZSByZXN1bHQgYXMgYSB2ZWN0b3IuCisgIC8vIENyZWF0ZSB0aGUgc3RhY2sgZnJhbWUgb2JqZWN0LgorICBFVlQgVlQgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBFbHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gTm9kZS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBGSVB0ciA9IERBRy5DcmVhdGVTdGFja1RlbXBvcmFyeShWVCk7CisgIGludCBGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oRklQdHIuZ2V0Tm9kZSgpKS0+Z2V0SW5kZXgoKTsKKyAgY29uc3QgVmFsdWUgKlNWID0gUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpOworCisgIC8vIEVtaXQgYSBzdG9yZSBvZiBlYWNoIGVsZW1lbnQgdG8gdGhlIHN0YWNrIHNsb3QuCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IFN0b3JlczsKKyAgdW5zaWduZWQgVHlwZUJ5dGVTaXplID0gRWx0VlQuZ2V0U2l6ZUluQml0cygpIC8gODsKKyAgLy8gU3RvcmUgKGluIHRoZSByaWdodCBlbmRpYW5uZXNzKSB0aGUgZWxlbWVudHMgdG8gbWVtb3J5LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTm9kZS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAvLyBJZ25vcmUgdW5kZWYgZWxlbWVudHMuCisgICAgaWYgKE5vZGUtPmdldE9wZXJhbmQoaSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikgY29udGludWU7CisKKyAgICB1bnNpZ25lZCBPZmZzZXQgPSBUeXBlQnl0ZVNpemUqaTsKKworICAgIFNEVmFsdWUgSWR4ID0gREFHLmdldENvbnN0YW50KE9mZnNldCwgRklQdHIuZ2V0VmFsdWVUeXBlKCkpOworICAgIElkeCA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgRklQdHIuZ2V0VmFsdWVUeXBlKCksIEZJUHRyLCBJZHgpOworCisgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIHZlY3RvciBlbGVtZW50IHR5cGUgaXMgbmFycm93ZXIgdGhhbiB0aGUgc291cmNlCisgICAgLy8gZWxlbWVudCB0eXBlLCBvbmx5IHN0b3JlIHRoZSBiaXRzIG5lY2Vzc2FyeS4KKyAgICBpZiAoRWx0VlQuYml0c0xUKE5vZGUtPmdldE9wZXJhbmQoaSkuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpKSkgeworICAgICAgU3RvcmVzLnB1c2hfYmFjayhEQUcuZ2V0VHJ1bmNTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKGkpLCBJZHgsIFNWLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsdFZULCBmYWxzZSwgZmFsc2UsIDApKTsKKyAgICB9IGVsc2UKKyAgICAgIFN0b3Jlcy5wdXNoX2JhY2soREFHLmdldFN0b3JlKERBRy5nZXRFbnRyeU5vZGUoKSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKGkpLCBJZHgsIFNWLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApKTsKKyAgfQorCisgIFNEVmFsdWUgU3RvcmVDaGFpbjsKKyAgaWYgKCFTdG9yZXMuZW1wdHkoKSkgICAgLy8gTm90IGFsbCB1bmRlZiBlbGVtZW50cz8KKyAgICBTdG9yZUNoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yZXNbMF0sIFN0b3Jlcy5zaXplKCkpOworICBlbHNlCisgICAgU3RvcmVDaGFpbiA9IERBRy5nZXRFbnRyeU5vZGUoKTsKKworICAvLyBSZXN1bHQgaXMgYSBsb2FkIGZyb20gdGhlIHN0YWNrIHNsb3QuCisgIHJldHVybiBEQUcuZ2V0TG9hZChWVCwgZGwsIFN0b3JlQ2hhaW4sIEZJUHRyLCBTViwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUdMZWdhbGl6ZTo6RXhwYW5kRkNPUFlTSUdOKFNETm9kZSogTm9kZSkgeworICBEZWJ1Z0xvYyBkbCA9IE5vZGUtPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgVG1wMSA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgVG1wMiA9IE5vZGUtPmdldE9wZXJhbmQoMSk7CisKKyAgLy8gR2V0IHRoZSBzaWduIGJpdCBvZiB0aGUgUkhTLiAgRmlyc3Qgb2J0YWluIGEgdmFsdWUgdGhhdCBoYXMgdGhlIHNhbWUKKyAgLy8gc2lnbiBhcyB0aGUgc2lnbiBiaXQsIGkuZS4gbmVnYXRpdmUgaWYgYW5kIG9ubHkgaWYgdGhlIHNpZ24gYml0IGlzIDEuCisgIFNEVmFsdWUgU2lnbkJpdDsKKyAgRVZUIEZsb2F0VlQgPSBUbXAyLmdldFZhbHVlVHlwZSgpOworICBFVlQgSVZUID0gRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksIEZsb2F0VlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgaWYgKGlzVHlwZUxlZ2FsKElWVCkpIHsKKyAgICAvLyBDb252ZXJ0IHRvIGFuIGludGVnZXIgd2l0aCB0aGUgc2FtZSBzaWduIGJpdC4KKyAgICBTaWduQml0ID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIElWVCwgVG1wMik7CisgIH0gZWxzZSB7CisgICAgLy8gU3RvcmUgdGhlIGZsb2F0IHRvIG1lbW9yeSwgdGhlbiBsb2FkIHRoZSBzaWduIHBhcnQgb3V0IGFzIGFuIGludGVnZXIuCisgICAgTVZUIExvYWRUeSA9IFRMSS5nZXRQb2ludGVyVHkoKTsKKyAgICAvLyBGaXJzdCBjcmVhdGUgYSB0ZW1wb3JhcnkgdGhhdCBpcyBhbGlnbmVkIGZvciBib3RoIHRoZSBsb2FkIGFuZCBzdG9yZS4KKyAgICBTRFZhbHVlIFN0YWNrUHRyID0gREFHLkNyZWF0ZVN0YWNrVGVtcG9yYXJ5KEZsb2F0VlQsIExvYWRUeSk7CisgICAgLy8gVGhlbiBzdG9yZSB0aGUgZmxvYXQgdG8gaXQuCisgICAgU0RWYWx1ZSBDaCA9CisgICAgICBEQUcuZ2V0U3RvcmUoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwgVG1wMiwgU3RhY2tQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpIHsKKyAgICAgIGFzc2VydChGbG9hdFZULmlzQnl0ZVNpemVkKCkgJiYgIlVuc3VwcG9ydGVkIGZsb2F0aW5nIHBvaW50IHR5cGUhIik7CisgICAgICAvLyBMb2FkIG91dCBhIGxlZ2FsIGludGVnZXIgd2l0aCB0aGUgc2FtZSBzaWduIGJpdCBhcyB0aGUgZmxvYXQuCisgICAgICBTaWduQml0ID0gREFHLmdldExvYWQoTG9hZFR5LCBkbCwgQ2gsIFN0YWNrUHRyLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworICAgIH0gZWxzZSB7IC8vIExpdHRsZSBlbmRpYW4KKyAgICAgIFNEVmFsdWUgTG9hZFB0ciA9IFN0YWNrUHRyOworICAgICAgLy8gVGhlIGZsb2F0IG1heSBiZSB3aWRlciB0aGFuIHRoZSBpbnRlZ2VyIHdlIGFyZSBnb2luZyB0byBsb2FkLiAgQWR2YW5jZQorICAgICAgLy8gdGhlIHBvaW50ZXIgc28gdGhhdCB0aGUgbG9hZGVkIGludGVnZXIgd2lsbCBjb250YWluIHRoZSBzaWduIGJpdC4KKyAgICAgIHVuc2lnbmVkIFN0cmlkZXMgPSAoRmxvYXRWVC5nZXRTaXplSW5CaXRzKCktMSkvTG9hZFR5LmdldFNpemVJbkJpdHMoKTsKKyAgICAgIHVuc2lnbmVkIEJ5dGVPZmZzZXQgPSAoU3RyaWRlcyAqIExvYWRUeS5nZXRTaXplSW5CaXRzKCkpIC8gODsKKyAgICAgIExvYWRQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIExvYWRQdHIuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZFB0ciwgREFHLmdldEludFB0ckNvbnN0YW50KEJ5dGVPZmZzZXQpKTsKKyAgICAgIC8vIExvYWQgYSBsZWdhbCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpZ24gYml0LgorICAgICAgU2lnbkJpdCA9IERBRy5nZXRMb2FkKExvYWRUeSwgZGwsIENoLCBMb2FkUHRyLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworICAgICAgLy8gTW92ZSB0aGUgc2lnbiBiaXQgdG8gdGhlIHRvcCBiaXQgb2YgdGhlIGxvYWRlZCBpbnRlZ2VyLgorICAgICAgdW5zaWduZWQgQml0U2hpZnQgPSBMb2FkVHkuZ2V0U2l6ZUluQml0cygpIC0KKyAgICAgICAgKEZsb2F0VlQuZ2V0U2l6ZUluQml0cygpIC0gOCAqIEJ5dGVPZmZzZXQpOworICAgICAgYXNzZXJ0KEJpdFNoaWZ0IDwgTG9hZFR5LmdldFNpemVJbkJpdHMoKSAmJiAiUG9pbnRlciBhZHZhbmNlZCB3cm9uZz8iKTsKKyAgICAgIGlmIChCaXRTaGlmdCkKKyAgICAgICAgU2lnbkJpdCA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTG9hZFR5LCBTaWduQml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEJpdFNoaWZ0LFRMSS5nZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgICB9CisgIH0KKyAgLy8gTm93IGdldCB0aGUgc2lnbiBiaXQgcHJvcGVyLCBieSBzZWVpbmcgd2hldGhlciB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuCisgIFNpZ25CaXQgPSBEQUcuZ2V0U2V0Q0MoZGwsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoU2lnbkJpdC5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbkJpdCwgREFHLmdldENvbnN0YW50KDAsIFNpZ25CaXQuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUTFQpOworICAvLyBHZXQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSByZXN1bHQuCisgIFNEVmFsdWUgQWJzVmFsID0gREFHLmdldE5vZGUoSVNEOjpGQUJTLCBkbCwgVG1wMS5nZXRWYWx1ZVR5cGUoKSwgVG1wMSk7CisgIC8vIFNlbGVjdCBiZXR3ZWVuIHRoZSBuYWJzIGFuZCBhYnMgdmFsdWUgYmFzZWQgb24gdGhlIHNpZ24gYml0IG9mCisgIC8vIHRoZSBpbnB1dC4KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgQWJzVmFsLmdldFZhbHVlVHlwZSgpLCBTaWduQml0LAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpGTkVHLCBkbCwgQWJzVmFsLmdldFZhbHVlVHlwZSgpLCBBYnNWYWwpLAorICAgICAgICAgICAgICAgICAgICAgQWJzVmFsKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdMZWdhbGl6ZTo6RXhwYW5kRFlOQU1JQ19TVEFDS0FMTE9DKFNETm9kZSogTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJlJlc3VsdHMpIHsKKyAgdW5zaWduZWQgU1BSZWcgPSBUTEkuZ2V0U3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlKCk7CisgIGFzc2VydChTUFJlZyAmJiAiVGFyZ2V0IGNhbm5vdCByZXF1aXJlIERZTkFNSUNfU1RBQ0tBTExPQyBleHBhbnNpb24gYW5kIgorICAgICAgICAgICIgbm90IHRlbGwgdXMgd2hpY2ggcmVnIGlzIHRoZSBzdGFjayBwb2ludGVyISIpOworICBEZWJ1Z0xvYyBkbCA9IE5vZGUtPmdldERlYnVnTG9jKCk7CisgIEVWVCBWVCA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgU0RWYWx1ZSBUbXAxID0gU0RWYWx1ZShOb2RlLCAwKTsKKyAgU0RWYWx1ZSBUbXAyID0gU0RWYWx1ZShOb2RlLCAxKTsKKyAgU0RWYWx1ZSBUbXAzID0gTm9kZS0+Z2V0T3BlcmFuZCgyKTsKKyAgU0RWYWx1ZSBDaGFpbiA9IFRtcDEuZ2V0T3BlcmFuZCgwKTsKKworICAvLyBDaGFpbiB0aGUgZHluYW1pYyBzdGFjayBhbGxvY2F0aW9uIHNvIHRoYXQgaXQgZG9lc24ndCBtb2RpZnkgdGhlIHN0YWNrCisgIC8vIHBvaW50ZXIgd2hlbiBvdGhlciBpbnN0cnVjdGlvbnMgYXJlIHVzaW5nIHRoZSBzdGFjay4KKyAgQ2hhaW4gPSBEQUcuZ2V0Q0FMTFNFUV9TVEFSVChDaGFpbiwgREFHLmdldEludFB0ckNvbnN0YW50KDAsIHRydWUpKTsKKworICBTRFZhbHVlIFNpemUgID0gVG1wMi5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIFNQID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgU1BSZWcsIFZUKTsKKyAgQ2hhaW4gPSBTUC5nZXRWYWx1ZSgxKTsKKyAgdW5zaWduZWQgQWxpZ24gPSBjYXN0PENvbnN0YW50U0ROb2RlPihUbXAzKS0+Z2V0WkV4dFZhbHVlKCk7CisgIHVuc2lnbmVkIFN0YWNrQWxpZ24gPSBUTS5nZXRGcmFtZUluZm8oKS0+Z2V0U3RhY2tBbGlnbm1lbnQoKTsKKyAgaWYgKEFsaWduID4gU3RhY2tBbGlnbikKKyAgICBTUCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgVlQsIFNQLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgtKHVpbnQ2NF90KUFsaWduLCBWVCkpOworICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBWVCwgU1AsIFNpemUpOyAgICAgICAvLyBWYWx1ZQorICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBTUFJlZywgVG1wMSk7ICAgICAvLyBPdXRwdXQgY2hhaW4KKworICBUbXAyID0gREFHLmdldENBTExTRVFfRU5EKENoYWluLCAgREFHLmdldEludFB0ckNvbnN0YW50KDAsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgwLCB0cnVlKSwgU0RWYWx1ZSgpKTsKKworICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgUmVzdWx0cy5wdXNoX2JhY2soVG1wMik7Cit9CisKKy8vLyBMZWdhbGl6ZVNldENDQ29uZENvZGUgLSBMZWdhbGl6ZSBhIFNFVENDIHdpdGggZ2l2ZW4gTEhTIGFuZCBSSFMgYW5kCisvLy8gY29uZGl0aW9uIGNvZGUgQ0Mgb24gdGhlIGN1cnJlbnQgdGFyZ2V0LiBUaGlzIHJvdXRpbmUgZXhwYW5kcyBTRVRDQyB3aXRoCisvLy8gaWxsZWdhbCBjb25kaXRpb24gY29kZSBpbnRvIEFORCAvIE9SIG9mIG11bHRpcGxlIFNFVENDIHZhbHVlcy4KK3ZvaWQgU2VsZWN0aW9uREFHTGVnYWxpemU6OkxlZ2FsaXplU2V0Q0NDb25kQ29kZShFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTEhTLCBTRFZhbHVlICZSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgRVZUIE9wVlQgPSBMSFMuZ2V0VmFsdWVUeXBlKCk7CisgIElTRDo6Q29uZENvZGUgQ0NDb2RlID0gY2FzdDxDb25kQ29kZVNETm9kZT4oQ0MpLT5nZXQoKTsKKyAgc3dpdGNoIChUTEkuZ2V0Q29uZENvZGVBY3Rpb24oQ0NDb2RlLCBPcFZUKSkgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biBjb25kaXRpb24gY29kZSBhY3Rpb24hIik7CisgIGNhc2UgVGFyZ2V0TG93ZXJpbmc6OkxlZ2FsOgorICAgIC8vIE5vdGhpbmcgdG8gZG8uCisgICAgYnJlYWs7CisgIGNhc2UgVGFyZ2V0TG93ZXJpbmc6OkV4cGFuZDogeworICAgIElTRDo6Q29uZENvZGUgQ0MxID0gSVNEOjpTRVRDQ19JTlZBTElELCBDQzIgPSBJU0Q6OlNFVENDX0lOVkFMSUQ7CisgICAgdW5zaWduZWQgT3BjID0gMDsKKyAgICBzd2l0Y2ggKENDQ29kZSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJEb24ndCBrbm93IGhvdyB0byBleHBhbmQgdGhpcyBjb25kaXRpb24hIik7CisgICAgY2FzZSBJU0Q6OlNFVE9FUTogQ0MxID0gSVNEOjpTRVRFUTsgQ0MyID0gSVNEOjpTRVRPOyAgT3BjID0gSVNEOjpBTkQ7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRPR1Q6IENDMSA9IElTRDo6U0VUR1Q7IENDMiA9IElTRDo6U0VUTzsgIE9wYyA9IElTRDo6QU5EOyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUT0dFOiBDQzEgPSBJU0Q6OlNFVEdFOyBDQzIgPSBJU0Q6OlNFVE87ICBPcGMgPSBJU0Q6OkFORDsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVE9MVDogQ0MxID0gSVNEOjpTRVRMVDsgQ0MyID0gSVNEOjpTRVRPOyAgT3BjID0gSVNEOjpBTkQ7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRPTEU6IENDMSA9IElTRDo6U0VUTEU7IENDMiA9IElTRDo6U0VUTzsgIE9wYyA9IElTRDo6QU5EOyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUT05FOiBDQzEgPSBJU0Q6OlNFVE5FOyBDQzIgPSBJU0Q6OlNFVE87ICBPcGMgPSBJU0Q6OkFORDsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVFUTogQ0MxID0gSVNEOjpTRVRFUTsgQ0MyID0gSVNEOjpTRVRVTzsgT3BjID0gSVNEOjpPUjsgIGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRVR1Q6IENDMSA9IElTRDo6U0VUR1Q7IENDMiA9IElTRDo6U0VUVU87IE9wYyA9IElTRDo6T1I7ICBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUVUdFOiBDQzEgPSBJU0Q6OlNFVEdFOyBDQzIgPSBJU0Q6OlNFVFVPOyBPcGMgPSBJU0Q6Ok9SOyAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVMVDogQ0MxID0gSVNEOjpTRVRMVDsgQ0MyID0gSVNEOjpTRVRVTzsgT3BjID0gSVNEOjpPUjsgIGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRVTEU6IENDMSA9IElTRDo6U0VUTEU7IENDMiA9IElTRDo6U0VUVU87IE9wYyA9IElTRDo6T1I7ICBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUVU5FOiBDQzEgPSBJU0Q6OlNFVE5FOyBDQzIgPSBJU0Q6OlNFVFVPOyBPcGMgPSBJU0Q6Ok9SOyAgYnJlYWs7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBtb3JlIGV4cGFuc2lvbnMuCisgICAgfQorCisgICAgU0RWYWx1ZSBTZXRDQzEgPSBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBMSFMsIFJIUywgQ0MxKTsKKyAgICBTRFZhbHVlIFNldENDMiA9IERBRy5nZXRTZXRDQyhkbCwgVlQsIExIUywgUkhTLCBDQzIpOworICAgIExIUyA9IERBRy5nZXROb2RlKE9wYywgZGwsIFZULCBTZXRDQzEsIFNldENDMik7CisgICAgUkhTID0gU0RWYWx1ZSgpOworICAgIENDICA9IFNEVmFsdWUoKTsKKyAgICBicmVhazsKKyAgfQorICB9Cit9CisKKy8vLyBFbWl0U3RhY2tDb252ZXJ0IC0gRW1pdCBhIHN0b3JlL2xvYWQgY29tYmluYXRpb24gdG8gdGhlIHN0YWNrLiAgVGhpcyBzdG9yZXMKKy8vLyBTcmNPcCB0byBhIHN0YWNrIHNsb3Qgb2YgdHlwZSBTbG90VlQsIHRydW5jYXRpbmcgaXQgaWYgbmVlZGVkLiAgSXQgdGhlbiBkb2VzCisvLy8gYSBsb2FkIGZyb20gdGhlIHN0YWNrIHNsb3QgdG8gRGVzdFZULCBleHRlbmRpbmcgaXQgaWYgbmVlZGVkLgorLy8vIFRoZSByZXN1bHRhbnQgY29kZSBuZWVkIG5vdCBiZSBsZWdhbC4KK1NEVmFsdWUgU2VsZWN0aW9uREFHTGVnYWxpemU6OkVtaXRTdGFja0NvbnZlcnQoU0RWYWx1ZSBTcmNPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFNsb3RWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIERlc3RWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgLy8gQ3JlYXRlIHRoZSBzdGFjayBmcmFtZSBvYmplY3QuCisgIHVuc2lnbmVkIFNyY0FsaWduID0KKyAgICBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRQcmVmVHlwZUFsaWdubWVudChTcmNPcC5nZXRWYWx1ZVR5cGUoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKSk7CisgIFNEVmFsdWUgRklQdHIgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoU2xvdFZULCBTcmNBbGlnbik7CisKKyAgRnJhbWVJbmRleFNETm9kZSAqU3RhY2tQdHJGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oRklQdHIpOworICBpbnQgU1BGSSA9IFN0YWNrUHRyRkktPmdldEluZGV4KCk7CisgIGNvbnN0IFZhbHVlICpTViA9IFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKFNQRkkpOworCisgIHVuc2lnbmVkIFNyY1NpemUgPSBTcmNPcC5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIFNsb3RTaXplID0gU2xvdFZULmdldFNpemVJbkJpdHMoKTsKKyAgdW5zaWduZWQgRGVzdFNpemUgPSBEZXN0VlQuZ2V0U2l6ZUluQml0cygpOworICBjb25zdCBUeXBlICpEZXN0VHlwZSA9IERlc3RWVC5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgdW5zaWduZWQgRGVzdEFsaWduID0gVExJLmdldFRhcmdldERhdGEoKS0+Z2V0UHJlZlR5cGVBbGlnbm1lbnQoRGVzdFR5cGUpOworCisgIC8vIEVtaXQgYSBzdG9yZSB0byB0aGUgc3RhY2sgc2xvdC4gIFVzZSBhIHRydW5jc3RvcmUgaWYgdGhlIGlucHV0IHZhbHVlIGlzCisgIC8vIGxhdGVyIHRoYW4gRGVzdFZULgorICBTRFZhbHVlIFN0b3JlOworCisgIGlmIChTcmNTaXplID4gU2xvdFNpemUpCisgICAgU3RvcmUgPSBEQUcuZ2V0VHJ1bmNTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBTcmNPcCwgRklQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTViwgMCwgU2xvdFZULCBmYWxzZSwgZmFsc2UsIFNyY0FsaWduKTsKKyAgZWxzZSB7CisgICAgYXNzZXJ0KFNyY1NpemUgPT0gU2xvdFNpemUgJiYgIkludmFsaWQgc3RvcmUiKTsKKyAgICBTdG9yZSA9IERBRy5nZXRTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBTcmNPcCwgRklQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU1YsIDAsIGZhbHNlLCBmYWxzZSwgU3JjQWxpZ24pOworICB9CisKKyAgLy8gUmVzdWx0IGlzIGEgbG9hZCBmcm9tIHRoZSBzdGFjayBzbG90LgorICBpZiAoU2xvdFNpemUgPT0gRGVzdFNpemUpCisgICAgcmV0dXJuIERBRy5nZXRMb2FkKERlc3RWVCwgZGwsIFN0b3JlLCBGSVB0ciwgU1YsIDAsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzdEFsaWduKTsKKworICBhc3NlcnQoU2xvdFNpemUgPCBEZXN0U2l6ZSAmJiAiVW5rbm93biBleHRlbnNpb24hIik7CisgIHJldHVybiBEQUcuZ2V0RXh0TG9hZChJU0Q6OkVYVExPQUQsIERlc3RWVCwgZGwsIFN0b3JlLCBGSVB0ciwgU1YsIDAsIFNsb3RWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgRGVzdEFsaWduKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUdMZWdhbGl6ZTo6RXhwYW5kU0NBTEFSX1RPX1ZFQ1RPUihTRE5vZGUgKk5vZGUpIHsKKyAgRGVidWdMb2MgZGwgPSBOb2RlLT5nZXREZWJ1Z0xvYygpOworICAvLyBDcmVhdGUgYSB2ZWN0b3Igc2l6ZWQvYWxpZ25lZCBzdGFjayBzbG90LCBzdG9yZSB0aGUgdmFsdWUgdG8gZWxlbWVudCAjMCwKKyAgLy8gdGhlbiBsb2FkIHRoZSB3aG9sZSB2ZWN0b3IgYmFjayBvdXQuCisgIFNEVmFsdWUgU3RhY2tQdHIgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoTm9kZS0+Z2V0VmFsdWVUeXBlKDApKTsKKworICBGcmFtZUluZGV4U0ROb2RlICpTdGFja1B0ckZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihTdGFja1B0cik7CisgIGludCBTUEZJID0gU3RhY2tQdHJGSS0+Z2V0SW5kZXgoKTsKKworICBTRFZhbHVlIENoID0gREFHLmdldFRydW5jU3RvcmUoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwgTm9kZS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soU1BGSSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgIHJldHVybiBEQUcuZ2V0TG9hZChOb2RlLT5nZXRWYWx1ZVR5cGUoMCksIGRsLCBDaCwgU3RhY2tQdHIsCisgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhTUEZJKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7Cit9CisKKworLy8vIEV4cGFuZEJVSUxEX1ZFQ1RPUiAtIEV4cGFuZCBhIEJVSUxEX1ZFQ1RPUiBub2RlIG9uIHRhcmdldHMgdGhhdCBkb24ndAorLy8vIHN1cHBvcnQgdGhlIG9wZXJhdGlvbiwgYnV0IGRvIHN1cHBvcnQgdGhlIHJlc3VsdGFudCB2ZWN0b3IgdHlwZS4KK1NEVmFsdWUgU2VsZWN0aW9uREFHTGVnYWxpemU6OkV4cGFuZEJVSUxEX1ZFQ1RPUihTRE5vZGUgKk5vZGUpIHsKKyAgdW5zaWduZWQgTnVtRWxlbXMgPSBOb2RlLT5nZXROdW1PcGVyYW5kcygpOworICBTRFZhbHVlIFZhbHVlMSwgVmFsdWUyOworICBEZWJ1Z0xvYyBkbCA9IE5vZGUtPmdldERlYnVnTG9jKCk7CisgIEVWVCBWVCA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgRVZUIE9wVlQgPSBOb2RlLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworCisgIC8vIElmIHRoZSBvbmx5IG5vbi11bmRlZiB2YWx1ZSBpcyB0aGUgbG93IGVsZW1lbnQsIHR1cm4gdGhpcyBpbnRvIGEKKyAgLy8gU0NBTEFSX1RPX1ZFQ1RPUiBub2RlLiAgSWYgdGhpcyBpcyB7IFgsIFgsIFgsIFggfSwgZGV0ZXJtaW5lIFguCisgIGJvb2wgaXNPbmx5TG93RWxlbWVudCA9IHRydWU7CisgIGJvb2wgTW9yZVRoYW5Ud29WYWx1ZXMgPSBmYWxzZTsKKyAgYm9vbCBpc0NvbnN0YW50ID0gdHJ1ZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUVsZW1zOyArK2kpIHsKKyAgICBTRFZhbHVlIFYgPSBOb2RlLT5nZXRPcGVyYW5kKGkpOworICAgIGlmIChWLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoaSA+IDApCisgICAgICBpc09ubHlMb3dFbGVtZW50ID0gZmFsc2U7CisgICAgaWYgKCFpc2E8Q29uc3RhbnRGUFNETm9kZT4oVikgJiYgIWlzYTxDb25zdGFudFNETm9kZT4oVikpCisgICAgICBpc0NvbnN0YW50ID0gZmFsc2U7CisKKyAgICBpZiAoIVZhbHVlMS5nZXROb2RlKCkpIHsKKyAgICAgIFZhbHVlMSA9IFY7CisgICAgfSBlbHNlIGlmICghVmFsdWUyLmdldE5vZGUoKSkgeworICAgICAgaWYgKFYgIT0gVmFsdWUxKQorICAgICAgICBWYWx1ZTIgPSBWOworICAgIH0gZWxzZSBpZiAoViAhPSBWYWx1ZTEgJiYgViAhPSBWYWx1ZTIpIHsKKyAgICAgIE1vcmVUaGFuVHdvVmFsdWVzID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoIVZhbHVlMS5nZXROb2RlKCkpCisgICAgcmV0dXJuIERBRy5nZXRVTkRFRihWVCk7CisKKyAgaWYgKGlzT25seUxvd0VsZW1lbnQpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIFZULCBOb2RlLT5nZXRPcGVyYW5kKDApKTsKKworICAvLyBJZiBhbGwgZWxlbWVudHMgYXJlIGNvbnN0YW50cywgY3JlYXRlIGEgbG9hZCBmcm9tIHRoZSBjb25zdGFudCBwb29sLgorICBpZiAoaXNDb25zdGFudCkgeworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gQ1Y7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE51bUVsZW1zOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKENvbnN0YW50RlBTRE5vZGUgKlYgPQorICAgICAgICAgIGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE5vZGUtPmdldE9wZXJhbmQoaSkpKSB7CisgICAgICAgIENWLnB1c2hfYmFjayhjb25zdF9jYXN0PENvbnN0YW50RlAgKj4oVi0+Z2V0Q29uc3RhbnRGUFZhbHVlKCkpKTsKKyAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRTRE5vZGUgKlYgPQorICAgICAgICAgICAgICAgICBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTm9kZS0+Z2V0T3BlcmFuZChpKSkpIHsKKyAgICAgICAgaWYgKE9wVlQ9PUVsdFZUKQorICAgICAgICAgIENWLnB1c2hfYmFjayhjb25zdF9jYXN0PENvbnN0YW50SW50ICo+KFYtPmdldENvbnN0YW50SW50VmFsdWUoKSkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvLyBJZiBPcFZUIGFuZCBFbHRWVCBkb24ndCBtYXRjaCwgRWx0VlQgaXMgbm90IGxlZ2FsIGFuZCB0aGUKKyAgICAgICAgICAvLyBlbGVtZW50IHZhbHVlcyBoYXZlIGJlZW4gcHJvbW90ZWQvdHJ1bmNhdGVkIGVhcmxpZXIuICBVbmRvIHRoaXM7CisgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCBhIHYxNmk4IHRvIGJlY29tZSBhIHYxNmkzMiBmb3IgZXhhbXBsZS4KKyAgICAgICAgICBjb25zdCBDb25zdGFudEludCAqQ0kgPSBWLT5nZXRDb25zdGFudEludFZhbHVlKCk7CisgICAgICAgICAgQ1YucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoRWx0VlQuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ktPmdldFpFeHRWYWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChOb2RlLT5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpOworICAgICAgICBjb25zdCBUeXBlICpPcE5UeSA9IEVsdFZULmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpOworICAgICAgICBDVi5wdXNoX2JhY2soVW5kZWZWYWx1ZTo6Z2V0KE9wTlR5KSk7CisgICAgICB9CisgICAgfQorICAgIENvbnN0YW50ICpDUCA9IENvbnN0YW50VmVjdG9yOjpnZXQoQ1YpOworICAgIFNEVmFsdWUgQ1BJZHggPSBEQUcuZ2V0Q29uc3RhbnRQb29sKENQLCBUTEkuZ2V0UG9pbnRlclR5KCkpOworICAgIHVuc2lnbmVkIEFsaWdubWVudCA9IGNhc3Q8Q29uc3RhbnRQb29sU0ROb2RlPihDUElkeCktPmdldEFsaWdubWVudCgpOworICAgIHJldHVybiBEQUcuZ2V0TG9hZChWVCwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwgQ1BJZHgsCisgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBBbGlnbm1lbnQpOworICB9CisKKyAgaWYgKCFNb3JlVGhhblR3b1ZhbHVlcykgeworICAgIFNtYWxsVmVjdG9yPGludCwgOD4gU2h1ZmZsZVZlYyhOdW1FbGVtcywgLTEpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1FbGVtczsgKytpKSB7CisgICAgICBTRFZhbHVlIFYgPSBOb2RlLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKFYuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICAgICAgY29udGludWU7CisgICAgICBTaHVmZmxlVmVjW2ldID0gViA9PSBWYWx1ZTEgPyAwIDogTnVtRWxlbXM7CisgICAgfQorICAgIGlmIChUTEkuaXNTaHVmZmxlTWFza0xlZ2FsKFNodWZmbGVWZWMsIE5vZGUtPmdldFZhbHVlVHlwZSgwKSkpIHsKKyAgICAgIC8vIEdldCB0aGUgc3BsYXR0ZWQgdmFsdWUgaW50byB0aGUgbG93IGVsZW1lbnQgb2YgYSB2ZWN0b3IgcmVnaXN0ZXIuCisgICAgICBTRFZhbHVlIFZlYzEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIGRsLCBWVCwgVmFsdWUxKTsKKyAgICAgIFNEVmFsdWUgVmVjMjsKKyAgICAgIGlmIChWYWx1ZTIuZ2V0Tm9kZSgpKQorICAgICAgICBWZWMyID0gREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwgVlQsIFZhbHVlMik7CisgICAgICBlbHNlCisgICAgICAgIFZlYzIgPSBEQUcuZ2V0VU5ERUYoVlQpOworCisgICAgICAvLyBSZXR1cm4gc2h1ZmZsZShMb3dWYWxWZWMsIHVuZGVmLCA8MCwwLDAsMD4pCisgICAgICByZXR1cm4gREFHLmdldFZlY3RvclNodWZmbGUoVlQsIGRsLCBWZWMxLCBWZWMyLCBTaHVmZmxlVmVjLmRhdGEoKSk7CisgICAgfQorICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBjYW4ndCBoYW5kbGUgdGhpcyBjYXNlIGVmZmljaWVudGx5LgorICByZXR1cm4gRXhwYW5kVmVjdG9yQnVpbGRUaHJvdWdoU3RhY2soTm9kZSk7Cit9CisKKy8vIEV4cGFuZExpYkNhbGwgLSBFeHBhbmQgYSBub2RlIGludG8gYSBjYWxsIHRvIGEgbGliY2FsbC4gIElmIHRoZSByZXN1bHQgdmFsdWUKKy8vIGRvZXMgbm90IGZpdCBpbnRvIGEgcmVnaXN0ZXIsIHJldHVybiB0aGUgbG8gcGFydCBhbmQgc2V0IHRoZSBoaSBwYXJ0IHRvIHRoZQorLy8gYnktcmVnIGFyZ3VtZW50LiAgSWYgaXQgZG9lcyBmaXQgaW50byBhIHNpbmdsZSByZWdpc3RlciwgcmV0dXJuIHRoZSByZXN1bHQKKy8vIGFuZCBsZWF2ZSB0aGUgSGkgcGFydCB1bnNldC4KK1NEVmFsdWUgU2VsZWN0aW9uREFHTGVnYWxpemU6OkV4cGFuZExpYkNhbGwoUlRMSUI6OkxpYmNhbGwgTEMsIFNETm9kZSAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCkgeworICBhc3NlcnQoIUlzTGVnYWxpemluZ0NhbGwgJiYgIkNhbm5vdCBvdmVybGFwIGxlZ2FsaXphdGlvbiBvZiBjYWxscyEiKTsKKyAgLy8gVGhlIGlucHV0IGNoYWluIHRvIHRoaXMgbGliY2FsbCBpcyB0aGUgZW50cnkgbm9kZSBvZiB0aGUgZnVuY3Rpb24uCisgIC8vIExlZ2FsaXppbmcgdGhlIGNhbGwgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgcHJldmlvdXMgY2FsbCB0byB0aGUKKyAgLy8gZGVwZW5kZW5jZS4KKyAgU0RWYWx1ZSBJbkNoYWluID0gREFHLmdldEVudHJ5Tm9kZSgpOworCisgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0VHkgQXJnczsKKyAgVGFyZ2V0TG93ZXJpbmc6OkFyZ0xpc3RFbnRyeSBFbnRyeTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vZGUtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgRVZUIEFyZ1ZUID0gTm9kZS0+Z2V0T3BlcmFuZChpKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICBjb25zdCBUeXBlICpBcmdUeSA9IEFyZ1ZULmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpOworICAgIEVudHJ5Lk5vZGUgPSBOb2RlLT5nZXRPcGVyYW5kKGkpOyBFbnRyeS5UeSA9IEFyZ1R5OworICAgIEVudHJ5LmlzU0V4dCA9IGlzU2lnbmVkOworICAgIEVudHJ5LmlzWkV4dCA9ICFpc1NpZ25lZDsKKyAgICBBcmdzLnB1c2hfYmFjayhFbnRyeSk7CisgIH0KKyAgU0RWYWx1ZSBDYWxsZWUgPSBEQUcuZ2V0RXh0ZXJuYWxTeW1ib2woVExJLmdldExpYmNhbGxOYW1lKExDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpKTsKKworICAvLyBTcGxpY2UgdGhlIGxpYmNhbGwgaW4gd2hlcmV2ZXIgRmluZElucHV0T3V0cHV0Q2hhaW5zIHRlbGxzIHVzIHRvLgorICBjb25zdCBUeXBlICpSZXRUeSA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKS5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+IENhbGxJbmZvID0KKyAgICBUTEkuTG93ZXJDYWxsVG8oSW5DaGFpbiwgUmV0VHksIGlzU2lnbmVkLCAhaXNTaWduZWQsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgMCwgVExJLmdldExpYmNhbGxDYWxsaW5nQ29udihMQyksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKmlzUmV0dXJuVmFsdWVVc2VkPSovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgQ2FsbGVlLCBBcmdzLCBEQUcsIE5vZGUtPmdldERlYnVnTG9jKCkpOworCisgIC8vIExlZ2FsaXplIHRoZSBjYWxsIHNlcXVlbmNlLCBzdGFydGluZyB3aXRoIHRoZSBjaGFpbi4gIFRoaXMgd2lsbCBhZHZhbmNlCisgIC8vIHRoZSBMYXN0Q0FMTFNFUV9FTkQgdG8gdGhlIGxlZ2FsaXplZCB2ZXJzaW9uIG9mIHRoZSBDQUxMU0VRX0VORCBub2RlIHRoYXQKKyAgLy8gd2FzIGFkZGVkIGJ5IExvd2VyQ2FsbFRvIChndWFyYW50ZWVpbmcgcHJvcGVyIHNlcmlhbGl6YXRpb24gb2YgY2FsbHMpLgorICBMZWdhbGl6ZU9wKENhbGxJbmZvLnNlY29uZCk7CisgIHJldHVybiBDYWxsSW5mby5maXJzdDsKK30KKworLy8gRXhwYW5kQ2hhaW5MaWJDYWxsIC0gRXhwYW5kIGEgbm9kZSBpbnRvIGEgY2FsbCB0byBhIGxpYmNhbGwuIFNpbWlsYXIgdG8KKy8vIEV4cGFuZExpYkNhbGwgZXhjZXB0IHRoYXQgdGhlIGZpcnN0IG9wZXJhbmQgaXMgdGhlIGluLWNoYWluLgorc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+CitTZWxlY3Rpb25EQUdMZWdhbGl6ZTo6RXhwYW5kQ2hhaW5MaWJDYWxsKFJUTElCOjpMaWJjYWxsIExDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgKk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTaWduZWQpIHsKKyAgYXNzZXJ0KCFJc0xlZ2FsaXppbmdDYWxsICYmICJDYW5ub3Qgb3ZlcmxhcCBsZWdhbGl6YXRpb24gb2YgY2FsbHMhIik7CisgIFNEVmFsdWUgSW5DaGFpbiA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisKKyAgVGFyZ2V0TG93ZXJpbmc6OkFyZ0xpc3RUeSBBcmdzOworICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdEVudHJ5IEVudHJ5OworICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gTm9kZS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBFVlQgQXJnVlQgPSBOb2RlLT5nZXRPcGVyYW5kKGkpLmdldFZhbHVlVHlwZSgpOworICAgIGNvbnN0IFR5cGUgKkFyZ1R5ID0gQXJnVlQuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSk7CisgICAgRW50cnkuTm9kZSA9IE5vZGUtPmdldE9wZXJhbmQoaSk7CisgICAgRW50cnkuVHkgPSBBcmdUeTsKKyAgICBFbnRyeS5pc1NFeHQgPSBpc1NpZ25lZDsKKyAgICBFbnRyeS5pc1pFeHQgPSAhaXNTaWduZWQ7CisgICAgQXJncy5wdXNoX2JhY2soRW50cnkpOworICB9CisgIFNEVmFsdWUgQ2FsbGVlID0gREFHLmdldEV4dGVybmFsU3ltYm9sKFRMSS5nZXRMaWJjYWxsTmFtZShMQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSk7CisKKyAgLy8gU3BsaWNlIHRoZSBsaWJjYWxsIGluIHdoZXJldmVyIEZpbmRJbnB1dE91dHB1dENoYWlucyB0ZWxscyB1cyB0by4KKyAgY29uc3QgVHlwZSAqUmV0VHkgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSk7CisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiBDYWxsSW5mbyA9CisgICAgVExJLkxvd2VyQ2FsbFRvKEluQ2hhaW4sIFJldFR5LCBpc1NpZ25lZCwgIWlzU2lnbmVkLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIDAsIFRMSS5nZXRMaWJjYWxsQ2FsbGluZ0NvbnYoTEMpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLyppc1JldHVyblZhbHVlVXNlZD0qL3RydWUsCisgICAgICAgICAgICAgICAgICAgIENhbGxlZSwgQXJncywgREFHLCBOb2RlLT5nZXREZWJ1Z0xvYygpKTsKKworICAvLyBMZWdhbGl6ZSB0aGUgY2FsbCBzZXF1ZW5jZSwgc3RhcnRpbmcgd2l0aCB0aGUgY2hhaW4uICBUaGlzIHdpbGwgYWR2YW5jZQorICAvLyB0aGUgTGFzdENBTExTRVFfRU5EIHRvIHRoZSBsZWdhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgQ0FMTFNFUV9FTkQgbm9kZSB0aGF0CisgIC8vIHdhcyBhZGRlZCBieSBMb3dlckNhbGxUbyAoZ3VhcmFudGVlaW5nIHByb3BlciBzZXJpYWxpemF0aW9uIG9mIGNhbGxzKS4KKyAgTGVnYWxpemVPcChDYWxsSW5mby5zZWNvbmQpOworICByZXR1cm4gQ2FsbEluZm87Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHTGVnYWxpemU6OkV4cGFuZEZQTGliQ2FsbChTRE5vZGUqIE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxpYmNhbGwgQ2FsbF9GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxpYmNhbGwgQ2FsbF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxpYmNhbGwgQ2FsbF9GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxpYmNhbGwgQ2FsbF9QUENGMTI4KSB7CisgIFJUTElCOjpMaWJjYWxsIExDOworICBzd2l0Y2ggKE5vZGUtPmdldFZhbHVlVHlwZSgwKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmV4cGVjdGVkIHJlcXVlc3QgZm9yIGxpYmNhbGwhIik7CisgIGNhc2UgTVZUOjpmMzI6IExDID0gQ2FsbF9GMzI7IGJyZWFrOworICBjYXNlIE1WVDo6ZjY0OiBMQyA9IENhbGxfRjY0OyBicmVhazsKKyAgY2FzZSBNVlQ6OmY4MDogTEMgPSBDYWxsX0Y4MDsgYnJlYWs7CisgIGNhc2UgTVZUOjpwcGNmMTI4OiBMQyA9IENhbGxfUFBDRjEyODsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEV4cGFuZExpYkNhbGwoTEMsIE5vZGUsIGZhbHNlKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUdMZWdhbGl6ZTo6RXhwYW5kSW50TGliQ2FsbChTRE5vZGUqIE5vZGUsIGJvb2wgaXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMaWJjYWxsIENhbGxfSTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMaWJjYWxsIENhbGxfSTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TGliY2FsbCBDYWxsX0kzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxpYmNhbGwgQ2FsbF9JNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMaWJjYWxsIENhbGxfSTEyOCkgeworICBSVExJQjo6TGliY2FsbCBMQzsKKyAgc3dpdGNoIChOb2RlLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5leHBlY3RlZCByZXF1ZXN0IGZvciBsaWJjYWxsISIpOworICBjYXNlIE1WVDo6aTg6ICAgTEMgPSBDYWxsX0k4OyBicmVhazsKKyAgY2FzZSBNVlQ6OmkxNjogIExDID0gQ2FsbF9JMTY7IGJyZWFrOworICBjYXNlIE1WVDo6aTMyOiAgTEMgPSBDYWxsX0kzMjsgYnJlYWs7CisgIGNhc2UgTVZUOjppNjQ6ICBMQyA9IENhbGxfSTY0OyBicmVhazsKKyAgY2FzZSBNVlQ6OmkxMjg6IExDID0gQ2FsbF9JMTI4OyBicmVhazsKKyAgfQorICByZXR1cm4gRXhwYW5kTGliQ2FsbChMQywgTm9kZSwgaXNTaWduZWQpOworfQorCisvLy8gRXhwYW5kTGVnYWxJTlRfVE9fRlAgLSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBsZWdhbGl6aW5nIGEKKy8vLyBJTlRfVE9fRlAgb3BlcmF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCB3aGVuIHRoZSB0YXJnZXQgcmVxdWVzdHMgdGhhdAorLy8vIHdlIGV4cGFuZCBpdC4gIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCB0aGUgcmVzdWx0IGFuZCBvcGVyYW5kIHR5cGVzIGFyZQorLy8vIGxlZ2FsIGZvciB0aGUgdGFyZ2V0LgorU0RWYWx1ZSBTZWxlY3Rpb25EQUdMZWdhbGl6ZTo6RXhwYW5kTGVnYWxJTlRfVE9fRlAoYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIERlc3RWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIGlmIChPcDAuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIpIHsKKyAgICAvLyBzaW1wbGUgMzItYml0IFtzaWduZWR8dW5zaWduZWRdIGludGVnZXIgdG8gZmxvYXQvZG91YmxlIGV4cGFuc2lvbgorCisgICAgLy8gR2V0IHRoZSBzdGFjayBmcmFtZSBpbmRleCBvZiBhIDggYnl0ZSBidWZmZXIuCisgICAgU0RWYWx1ZSBTdGFja1Nsb3QgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoTVZUOjpmNjQpOworCisgICAgLy8gd29yZCBvZmZzZXQgY29uc3RhbnQgZm9yIEhpL0xvIGFkZHJlc3MgY29tcHV0YXRpb24KKyAgICBTRFZhbHVlIFdvcmRPZmYgPSBEQUcuZ2V0Q29uc3RhbnQoc2l6ZW9mKGludCksIFRMSS5nZXRQb2ludGVyVHkoKSk7CisgICAgLy8gc2V0IHVwIEhpIGFuZCBMbyAoaW50byBidWZmZXIpIGFkZHJlc3MgYmFzZWQgb24gZW5kaWFuCisgICAgU0RWYWx1ZSBIaSA9IFN0YWNrU2xvdDsKKyAgICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCksIFN0YWNrU2xvdCwgV29yZE9mZik7CisgICAgaWYgKFRMSS5pc0xpdHRsZUVuZGlhbigpKQorICAgICAgc3RkOjpzd2FwKEhpLCBMbyk7CisKKyAgICAvLyBpZiBzaWduZWQgbWFwIHRvIHVuc2lnbmVkIHNwYWNlCisgICAgU0RWYWx1ZSBPcDBNYXBwZWQ7CisgICAgaWYgKGlzU2lnbmVkKSB7CisgICAgICAvLyBjb25zdGFudCB1c2VkIHRvIGludmVydCBzaWduIGJpdCAoc2lnbmVkIHRvIHVuc2lnbmVkIG1hcHBpbmcpCisgICAgICBTRFZhbHVlIFNpZ25CaXQgPSBEQUcuZ2V0Q29uc3RhbnQoMHg4MDAwMDAwMHUsIE1WVDo6aTMyKTsKKyAgICAgIE9wME1hcHBlZCA9IERBRy5nZXROb2RlKElTRDo6WE9SLCBkbCwgTVZUOjppMzIsIE9wMCwgU2lnbkJpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE9wME1hcHBlZCA9IE9wMDsKKyAgICB9CisgICAgLy8gc3RvcmUgdGhlIGxvIG9mIHRoZSBjb25zdHJ1Y3RlZCBkb3VibGUgLSBiYXNlZCBvbiBpbnRlZ2VyIGlucHV0CisgICAgU0RWYWx1ZSBTdG9yZTEgPSBEQUcuZ2V0U3RvcmUoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDBNYXBwZWQsIExvLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgLy8gaW5pdGlhbCBoaSBwb3J0aW9uIG9mIGNvbnN0cnVjdGVkIGRvdWJsZQorICAgIFNEVmFsdWUgSW5pdGlhbEhpID0gREFHLmdldENvbnN0YW50KDB4NDMzMDAwMDB1LCBNVlQ6OmkzMik7CisgICAgLy8gc3RvcmUgdGhlIGhpIG9mIHRoZSBjb25zdHJ1Y3RlZCBkb3VibGUgLSBiaWFzZWQgZXhwb25lbnQKKyAgICBTRFZhbHVlIFN0b3JlMj1EQUcuZ2V0U3RvcmUoU3RvcmUxLCBkbCwgSW5pdGlhbEhpLCBIaSwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAvLyBsb2FkIHRoZSBjb25zdHJ1Y3RlZCBkb3VibGUKKyAgICBTRFZhbHVlIExvYWQgPSBEQUcuZ2V0TG9hZChNVlQ6OmY2NCwgZGwsIFN0b3JlMiwgU3RhY2tTbG90LCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgLy8gRlAgY29uc3RhbnQgdG8gYmlhcyBjb3JyZWN0IHRoZSBmaW5hbCByZXN1bHQKKyAgICBTRFZhbHVlIEJpYXMgPSBEQUcuZ2V0Q29uc3RhbnRGUChpc1NpZ25lZCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c1RvRG91YmxlKDB4NDMzMDAwMDA4MDAwMDAwMFVMTCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHNUb0RvdWJsZSgweDQzMzAwMDAwMDAwMDAwMDBVTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6ZjY0KTsKKyAgICAvLyBzdWJ0cmFjdCB0aGUgYmlhcworICAgIFNEVmFsdWUgU3ViID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmNjQsIExvYWQsIEJpYXMpOworICAgIC8vIGZpbmFsIHJlc3VsdAorICAgIFNEVmFsdWUgUmVzdWx0OworICAgIC8vIGhhbmRsZSBmaW5hbCByb3VuZGluZworICAgIGlmIChEZXN0VlQgPT0gTVZUOjpmNjQpIHsKKyAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgIFJlc3VsdCA9IFN1YjsKKyAgICB9IGVsc2UgaWYgKERlc3RWVC5iaXRzTFQoTVZUOjpmNjQpKSB7CisgICAgICBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1JPVU5ELCBkbCwgRGVzdFZULCBTdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICAgIH0gZWxzZSBpZiAoRGVzdFZULmJpdHNHVChNVlQ6OmY2NCkpIHsKKyAgICAgIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6RlBfRVhURU5ELCBkbCwgRGVzdFZULCBTdWIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9CisgIGFzc2VydCghaXNTaWduZWQgJiYgIkxlZ2FsaXplIGNhbm5vdCBFeHBhbmQgU0lOVF9UT19GUCBmb3IgaTY0IHlldCIpOworICAvLyBDb2RlIGJlbG93IGhlcmUgYXNzdW1lcyAhaXNTaWduZWQgd2l0aG91dCBjaGVja2luZyBhZ2Fpbi4KKworICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB1bnNpZ25lZCBpNjQgdG8gZjY0IGZvbGxvd2luZyB0aGUgYWxnb3JpdGhtIGluCisgIC8vIF9fZmxvYXR1bmRpZGYgaW4gY29tcGlsZXJfcnQuIFRoaXMgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBhZHZhbnRhZ2UKKyAgLy8gb2YgcGVyZm9ybWluZyByb3VuZGluZyBjb3JyZWN0bHksIGJvdGggaW4gdGhlIGRlZmF1bHQgcm91bmRpbmcgbW9kZQorICAvLyBhbmQgaW4gYWxsIGFsdGVybmF0ZSByb3VuZGluZyBtb2Rlcy4KKyAgLy8gVE9ETzogR2VuZXJhbGl6ZSB0aGlzIGZvciB1c2Ugd2l0aCBvdGhlciB0eXBlcy4KKyAgaWYgKE9wMC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6Omk2NCAmJiBEZXN0VlQgPT0gTVZUOjpmNjQpIHsKKyAgICBTRFZhbHVlIFR3b1A1MiA9CisgICAgICBEQUcuZ2V0Q29uc3RhbnQoVUlOVDY0X0MoMHg0MzMwMDAwMDAwMDAwMDAwKSwgTVZUOjppNjQpOworICAgIFNEVmFsdWUgVHdvUDg0UGx1c1R3b1A1MiA9CisgICAgICBEQUcuZ2V0Q29uc3RhbnRGUChCaXRzVG9Eb3VibGUoVUlOVDY0X0MoMHg0NTMwMDAwMDAwMTAwMDAwKSksIE1WVDo6ZjY0KTsKKyAgICBTRFZhbHVlIFR3b1A4NCA9CisgICAgICBEQUcuZ2V0Q29uc3RhbnQoVUlOVDY0X0MoMHg0NTMwMDAwMDAwMDAwMDAwKSwgTVZUOjppNjQpOworCisgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXRaZXJvRXh0ZW5kSW5SZWcoT3AwLCBkbCwgTVZUOjppMzIpOworICAgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE1WVDo6aTY0LCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgzMiwgTVZUOjppNjQpKTsKKyAgICBTRFZhbHVlIExvT3IgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTVZUOjppNjQsIExvLCBUd29QNTIpOworICAgIFNEVmFsdWUgSGlPciA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBNVlQ6Omk2NCwgSGksIFR3b1A4NCk7CisgICAgU0RWYWx1ZSBMb0ZsdCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmY2NCwgTG9Pcik7CisgICAgU0RWYWx1ZSBIaUZsdCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmY2NCwgSGlPcik7CisgICAgU0RWYWx1ZSBIaVN1YiA9IERBRy5nZXROb2RlKElTRDo6RlNVQiwgZGwsIE1WVDo6ZjY0LCBIaUZsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdvUDg0UGx1c1R3b1A1Mik7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjY0LCBMb0ZsdCwgSGlTdWIpOworICB9CisKKyAgLy8gSW1wbGVtZW50YXRpb24gb2YgdW5zaWduZWQgaTY0IHRvIGYzMi4gIFRoaXMgaW1wbGVtZW50YXRpb24gaGFzIHRoZQorICAvLyBhZHZhbnRhZ2Ugb2YgcGVyZm9ybWluZyByb3VuZGluZyBjb3JyZWN0bHkuCisgIC8vIFRPRE86IEdlbmVyYWxpemUgdGhpcyBmb3IgdXNlIHdpdGggb3RoZXIgdHlwZXMuCisgIGlmIChPcDAuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppNjQgJiYgRGVzdFZUID09IE1WVDo6ZjMyKSB7CisgICAgRVZUIFNIVlQgPSBUTEkuZ2V0U2hpZnRBbW91bnRUeSgpOworCisgICAgU0RWYWx1ZSBBbmQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIE1WVDo6aTY0LCBPcDAsCisgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmODAwKSwgTVZUOjppNjQpKTsKKyAgICBTRFZhbHVlIE9yID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIE1WVDo6aTY0LCBBbmQsCisgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoVUlOVDY0X0MoMHg4MDApLCBNVlQ6Omk2NCkpOworICAgIFNEVmFsdWUgQW5kMiA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTVZUOjppNjQsIE9wMCwKKyAgICAgICAgIERBRy5nZXRDb25zdGFudChVSU5UNjRfQygweDdmZiksIE1WVDo6aTY0KSk7CisgICAgU0RWYWx1ZSBOZSA9IERBRy5nZXRTZXRDQyhkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShNVlQ6Omk2NCksCisgICAgICAgICAgICAgICAgICAgQW5kMiwgREFHLmdldENvbnN0YW50KFVJTlQ2NF9DKDApLCBNVlQ6Omk2NCksIElTRDo6U0VUTkUpOworICAgIFNEVmFsdWUgU2VsID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBNVlQ6Omk2NCwgTmUsIE9yLCBPcDApOworICAgIFNEVmFsdWUgR2UgPSBEQUcuZ2V0U2V0Q0MoZGwsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoTVZUOjppNjQpLAorICAgICAgICAgICAgICAgICAgIE9wMCwgREFHLmdldENvbnN0YW50KFVJTlQ2NF9DKDB4MDAyMDAwMDAwMDAwMDAwMCksIE1WVDo6aTY0KSwKKyAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRVR0UpOworICAgIFNEVmFsdWUgU2VsMiA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgTVZUOjppNjQsIEdlLCBTZWwsIE9wMCk7CisKKyAgICBTRFZhbHVlIFNoID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBNVlQ6Omk2NCwgU2VsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDMyLCBTSFZUKSk7CisgICAgU0RWYWx1ZSBUcnVuYyA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBNVlQ6OmkzMiwgU2gpOworICAgIFNEVmFsdWUgRmN2dCA9IERBRy5nZXROb2RlKElTRDo6VUlOVF9UT19GUCwgZGwsIE1WVDo6ZjY0LCBUcnVuYyk7CisgICAgU0RWYWx1ZSBUd29QMzIgPQorICAgICAgREFHLmdldENvbnN0YW50RlAoQml0c1RvRG91YmxlKFVJTlQ2NF9DKDB4NDFmMDAwMDAwMDAwMDAwMCkpLCBNVlQ6OmY2NCk7CisgICAgU0RWYWx1ZSBGbXVsID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmNjQsIFR3b1AzMiwgRmN2dCk7CisgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBNVlQ6OmkzMiwgU2VsMik7CisgICAgU0RWYWx1ZSBGY3Z0MiA9IERBRy5nZXROb2RlKElTRDo6VUlOVF9UT19GUCwgZGwsIE1WVDo6ZjY0LCBMbyk7CisgICAgU0RWYWx1ZSBGYWRkID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmNjQsIEZtdWwsIEZjdnQyKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGUF9ST1VORCwgZGwsIE1WVDo6ZjMyLCBGYWRkLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworCisgIH0KKworICBTRFZhbHVlIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJTlRfVE9fRlAsIGRsLCBEZXN0VlQsIE9wMCk7CisKKyAgU0RWYWx1ZSBTaWduU2V0ID0gREFHLmdldFNldENDKGRsLCBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKE9wMC5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDAsIERBRy5nZXRDb25zdGFudCgwLCBPcDAuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRMVCk7CisgIFNEVmFsdWUgWmVybyA9IERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSwgRm91ciA9IERBRy5nZXRJbnRQdHJDb25zdGFudCg0KTsKKyAgU0RWYWx1ZSBDc3RPZmZzZXQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIFplcm8uZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduU2V0LCBGb3VyLCBaZXJvKTsKKworICAvLyBJZiB0aGUgc2lnbiBiaXQgb2YgdGhlIGludGVnZXIgaXMgc2V0LCB0aGUgbGFyZ2UgbnVtYmVyIHdpbGwgYmUgdHJlYXRlZAorICAvLyBhcyBhIG5lZ2F0aXZlIG51bWJlci4gIFRvIGNvdW50ZXJhY3QgdGhpcywgdGhlIGR5bmFtaWMgY29kZSBhZGRzIGFuCisgIC8vIG9mZnNldCBkZXBlbmRpbmcgb24gdGhlIGRhdGEgdHlwZS4KKyAgdWludDY0X3QgRkY7CisgIHN3aXRjaCAoT3AwLmdldFZhbHVlVHlwZSgpLmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVuc3VwcG9ydGVkIGludGVnZXIgdHlwZSEiKTsKKyAgY2FzZSBNVlQ6Omk4IDogRkYgPSAweDQzODAwMDAwVUxMOyBicmVhazsgIC8vIDJeOCAgKGFzIGEgZmxvYXQpCisgIGNhc2UgTVZUOjppMTY6IEZGID0gMHg0NzgwMDAwMFVMTDsgYnJlYWs7ICAvLyAyXjE2IChhcyBhIGZsb2F0KQorICBjYXNlIE1WVDo6aTMyOiBGRiA9IDB4NEY4MDAwMDBVTEw7IGJyZWFrOyAgLy8gMl4zMiAoYXMgYSBmbG9hdCkKKyAgY2FzZSBNVlQ6Omk2NDogRkYgPSAweDVGODAwMDAwVUxMOyBicmVhazsgIC8vIDJeNjQgKGFzIGEgZmxvYXQpCisgIH0KKyAgaWYgKFRMSS5pc0xpdHRsZUVuZGlhbigpKSBGRiA8PD0gMzI7CisgIENvbnN0YW50ICpGdWRnZUZhY3RvciA9IENvbnN0YW50SW50OjpnZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQ2NFR5KCpEQUcuZ2V0Q29udGV4dCgpKSwgRkYpOworCisgIFNEVmFsdWUgQ1BJZHggPSBEQUcuZ2V0Q29uc3RhbnRQb29sKEZ1ZGdlRmFjdG9yLCBUTEkuZ2V0UG9pbnRlclR5KCkpOworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBjYXN0PENvbnN0YW50UG9vbFNETm9kZT4oQ1BJZHgpLT5nZXRBbGlnbm1lbnQoKTsKKyAgQ1BJZHggPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFRMSS5nZXRQb2ludGVyVHkoKSwgQ1BJZHgsIENzdE9mZnNldCk7CisgIEFsaWdubWVudCA9IHN0ZDo6bWluKEFsaWdubWVudCwgNHUpOworICBTRFZhbHVlIEZ1ZGdlSW5SZWc7CisgIGlmIChEZXN0VlQgPT0gTVZUOjpmMzIpCisgICAgRnVkZ2VJblJlZyA9IERBRy5nZXRMb2FkKE1WVDo6ZjMyLCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBDUElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIEFsaWdubWVudCk7CisgIGVsc2UgeworICAgIEZ1ZGdlSW5SZWcgPQorICAgICAgTGVnYWxpemVPcChEQUcuZ2V0RXh0TG9hZChJU0Q6OkVYVExPQUQsIERlc3RWVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRFbnRyeU5vZGUoKSwgQ1BJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmMzIsIGZhbHNlLCBmYWxzZSwgQWxpZ25tZW50KSk7CisgIH0KKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgRGVzdFZULCBUbXAxLCBGdWRnZUluUmVnKTsKK30KKworLy8vIFByb21vdGVMZWdhbElOVF9UT19GUCAtIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGxlZ2FsaXppbmcgYQorLy8vICpJTlRfVE9fRlAgb3BlcmF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCB3aGVuIHRoZSB0YXJnZXQgcmVxdWVzdHMgdGhhdAorLy8vIHdlIHByb21vdGUgaXQuICBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHRoYXQgdGhlIHJlc3VsdCBhbmQgb3BlcmFuZCB0eXBlcyBhcmUKKy8vLyBsZWdhbCBmb3IgdGhlIHRhcmdldCwgYW5kIHRoYXQgdGhlcmUgaXMgYSBsZWdhbCBVSU5UX1RPX0ZQIG9yIFNJTlRfVE9fRlAKKy8vLyBvcGVyYXRpb24gdGhhdCB0YWtlcyBhIGxhcmdlciBpbnB1dC4KK1NEVmFsdWUgU2VsZWN0aW9uREFHTGVnYWxpemU6OlByb21vdGVMZWdhbElOVF9UT19GUChTRFZhbHVlIExlZ2FsT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIERlc3RWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIC8vIEZpcnN0IHN0ZXAsIGZpZ3VyZSBvdXQgdGhlIGFwcHJvcHJpYXRlICpJTlRfVE9fRlAgb3BlcmF0aW9uIHRvIHVzZS4KKyAgRVZUIE5ld0luVHkgPSBMZWdhbE9wLmdldFZhbHVlVHlwZSgpOworCisgIHVuc2lnbmVkIE9wVG9Vc2UgPSAwOworCisgIC8vIFNjYW4gZm9yIHRoZSBhcHByb3ByaWF0ZSBsYXJnZXIgdHlwZSB0byB1c2UuCisgIHdoaWxlICgxKSB7CisgICAgTmV3SW5UeSA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoTmV3SW5UeS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KzEpOworICAgIGFzc2VydChOZXdJblR5LmlzSW50ZWdlcigpICYmICJSYW4gb3V0IG9mIHBvc3NpYmlsaXRpZXMhIik7CisKKyAgICAvLyBJZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIFNJTlRfVE9fRlAgb2YgdGhpcyB0eXBlLCB1c2UgaXQuCisgICAgaWYgKFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpTSU5UX1RPX0ZQLCBOZXdJblR5KSkgeworICAgICAgT3BUb1VzZSA9IElTRDo6U0lOVF9UT19GUDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaXNTaWduZWQpIGNvbnRpbnVlOworCisgICAgLy8gSWYgdGhlIHRhcmdldCBzdXBwb3J0cyBVSU5UX1RPX0ZQIG9mIHRoaXMgdHlwZSwgdXNlIGl0LgorICAgIGlmIChUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6VUlOVF9UT19GUCwgTmV3SW5UeSkpIHsKKyAgICAgIE9wVG9Vc2UgPSBJU0Q6OlVJTlRfVE9fRlA7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHRyeSBhIGxhcmdlciB0eXBlLgorICB9CisKKyAgLy8gT2theSwgd2UgZm91bmQgdGhlIG9wZXJhdGlvbiBhbmQgdHlwZSB0byB1c2UuICBaZXJvIGV4dGVuZCBvdXIgaW5wdXQgdG8gdGhlCisgIC8vIGRlc2lyZWQgdHlwZSB0aGVuIHJ1biB0aGUgb3BlcmF0aW9uIG9uIGl0LgorICByZXR1cm4gREFHLmdldE5vZGUoT3BUb1VzZSwgZGwsIERlc3RWVCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKGlzU2lnbmVkID8gSVNEOjpTSUdOX0VYVEVORCA6IElTRDo6WkVST19FWFRFTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCwgTmV3SW5UeSwgTGVnYWxPcCkpOworfQorCisvLy8gUHJvbW90ZUxlZ2FsRlBfVE9fSU5UIC0gVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgbGVnYWxpemluZyBhCisvLy8gRlBfVE9fKklOVCBvcGVyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBvcGVyYW5kIHdoZW4gdGhlIHRhcmdldCByZXF1ZXN0cyB0aGF0CisvLy8gd2UgcHJvbW90ZSBpdC4gIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCB0aGUgcmVzdWx0IGFuZCBvcGVyYW5kIHR5cGVzIGFyZQorLy8vIGxlZ2FsIGZvciB0aGUgdGFyZ2V0LCBhbmQgdGhhdCB0aGVyZSBpcyBhIGxlZ2FsIEZQX1RPX1VJTlQgb3IgRlBfVE9fU0lOVAorLy8vIG9wZXJhdGlvbiB0aGF0IHJldHVybnMgYSBsYXJnZXIgcmVzdWx0LgorU0RWYWx1ZSBTZWxlY3Rpb25EQUdMZWdhbGl6ZTo6UHJvbW90ZUxlZ2FsRlBfVE9fSU5UKFNEVmFsdWUgTGVnYWxPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgRGVzdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgLy8gRmlyc3Qgc3RlcCwgZmlndXJlIG91dCB0aGUgYXBwcm9wcmlhdGUgRlBfVE8qSU5UIG9wZXJhdGlvbiB0byB1c2UuCisgIEVWVCBOZXdPdXRUeSA9IERlc3RWVDsKKworICB1bnNpZ25lZCBPcFRvVXNlID0gMDsKKworICAvLyBTY2FuIGZvciB0aGUgYXBwcm9wcmlhdGUgbGFyZ2VyIHR5cGUgdG8gdXNlLgorICB3aGlsZSAoMSkgeworICAgIE5ld091dFR5ID0gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShOZXdPdXRUeS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KzEpOworICAgIGFzc2VydChOZXdPdXRUeS5pc0ludGVnZXIoKSAmJiAiUmFuIG91dCBvZiBwb3NzaWJpbGl0aWVzISIpOworCisgICAgaWYgKFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpGUF9UT19TSU5ULCBOZXdPdXRUeSkpIHsKKyAgICAgIE9wVG9Vc2UgPSBJU0Q6OkZQX1RPX1NJTlQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OkZQX1RPX1VJTlQsIE5ld091dFR5KSkgeworICAgICAgT3BUb1VzZSA9IElTRDo6RlBfVE9fVUlOVDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgdHJ5IGEgbGFyZ2VyIHR5cGUuCisgIH0KKworCisgIC8vIE9rYXksIHdlIGZvdW5kIHRoZSBvcGVyYXRpb24gYW5kIHR5cGUgdG8gdXNlLgorICBTRFZhbHVlIE9wZXJhdGlvbiA9IERBRy5nZXROb2RlKE9wVG9Vc2UsIGRsLCBOZXdPdXRUeSwgTGVnYWxPcCk7CisKKyAgLy8gVHJ1bmNhdGUgdGhlIHJlc3VsdCBvZiB0aGUgZXh0ZW5kZWQgRlBfVE9fKklOVCBvcGVyYXRpb24gdG8gdGhlIGRlc2lyZWQKKyAgLy8gc2l6ZS4KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBEZXN0VlQsIE9wZXJhdGlvbik7Cit9CisKKy8vLyBFeHBhbmRCU1dBUCAtIE9wZW4gY29kZSB0aGUgb3BlcmF0aW9ucyBmb3IgQlNXQVAgb2YgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uCisvLy8KK1NEVmFsdWUgU2VsZWN0aW9uREFHTGVnYWxpemU6OkV4cGFuZEJTV0FQKFNEVmFsdWUgT3AsIERlYnVnTG9jIGRsKSB7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBFVlQgU0hWVCA9IFRMSS5nZXRTaGlmdEFtb3VudFR5KCk7CisgIFNEVmFsdWUgVG1wMSwgVG1wMiwgVG1wMywgVG1wNCwgVG1wNSwgVG1wNiwgVG1wNywgVG1wODsKKyAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmhhbmRsZWQgRXhwYW5kIHR5cGUgaW4gQlNXQVAhIik7CisgIGNhc2UgTVZUOjppMTY6CisgICAgVG1wMiA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgVlQsIE9wLCBEQUcuZ2V0Q29uc3RhbnQoOCwgU0hWVCkpOworICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIFZULCBPcCwgREFHLmdldENvbnN0YW50KDgsIFNIVlQpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFZULCBUbXAxLCBUbXAyKTsKKyAgY2FzZSBNVlQ6OmkzMjoKKyAgICBUbXA0ID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBWVCwgT3AsIERBRy5nZXRDb25zdGFudCgyNCwgU0hWVCkpOworICAgIFRtcDMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIFZULCBPcCwgREFHLmdldENvbnN0YW50KDgsIFNIVlQpKTsKKyAgICBUbXAyID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBWVCwgT3AsIERBRy5nZXRDb25zdGFudCg4LCBTSFZUKSk7CisgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgVlQsIE9wLCBEQUcuZ2V0Q29uc3RhbnQoMjQsIFNIVlQpKTsKKyAgICBUbXAzID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBWVCwgVG1wMywgREFHLmdldENvbnN0YW50KDB4RkYwMDAwLCBWVCkpOworICAgIFRtcDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIFZULCBUbXAyLCBEQUcuZ2V0Q29uc3RhbnQoMHhGRjAwLCBWVCkpOworICAgIFRtcDQgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgVlQsIFRtcDQsIFRtcDMpOworICAgIFRtcDIgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgVlQsIFRtcDIsIFRtcDEpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgVlQsIFRtcDQsIFRtcDIpOworICBjYXNlIE1WVDo6aTY0OgorICAgIFRtcDggPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIFZULCBPcCwgREFHLmdldENvbnN0YW50KDU2LCBTSFZUKSk7CisgICAgVG1wNyA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgVlQsIE9wLCBEQUcuZ2V0Q29uc3RhbnQoNDAsIFNIVlQpKTsKKyAgICBUbXA2ID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBWVCwgT3AsIERBRy5nZXRDb25zdGFudCgyNCwgU0hWVCkpOworICAgIFRtcDUgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIFZULCBPcCwgREFHLmdldENvbnN0YW50KDgsIFNIVlQpKTsKKyAgICBUbXA0ID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBWVCwgT3AsIERBRy5nZXRDb25zdGFudCg4LCBTSFZUKSk7CisgICAgVG1wMyA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgVlQsIE9wLCBEQUcuZ2V0Q29uc3RhbnQoMjQsIFNIVlQpKTsKKyAgICBUbXAyID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBWVCwgT3AsIERBRy5nZXRDb25zdGFudCg0MCwgU0hWVCkpOworICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIFZULCBPcCwgREFHLmdldENvbnN0YW50KDU2LCBTSFZUKSk7CisgICAgVG1wNyA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgVlQsIFRtcDcsIERBRy5nZXRDb25zdGFudCgyNTVVTEw8PDQ4LCBWVCkpOworICAgIFRtcDYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIFZULCBUbXA2LCBEQUcuZ2V0Q29uc3RhbnQoMjU1VUxMPDw0MCwgVlQpKTsKKyAgICBUbXA1ID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBWVCwgVG1wNSwgREFHLmdldENvbnN0YW50KDI1NVVMTDw8MzIsIFZUKSk7CisgICAgVG1wNCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgVlQsIFRtcDQsIERBRy5nZXRDb25zdGFudCgyNTVVTEw8PDI0LCBWVCkpOworICAgIFRtcDMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIFZULCBUbXAzLCBEQUcuZ2V0Q29uc3RhbnQoMjU1VUxMPDwxNiwgVlQpKTsKKyAgICBUbXAyID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBWVCwgVG1wMiwgREFHLmdldENvbnN0YW50KDI1NVVMTDw8OCAsIFZUKSk7CisgICAgVG1wOCA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBWVCwgVG1wOCwgVG1wNyk7CisgICAgVG1wNiA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBWVCwgVG1wNiwgVG1wNSk7CisgICAgVG1wNCA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBWVCwgVG1wNCwgVG1wMyk7CisgICAgVG1wMiA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBWVCwgVG1wMiwgVG1wMSk7CisgICAgVG1wOCA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBWVCwgVG1wOCwgVG1wNik7CisgICAgVG1wNCA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBWVCwgVG1wNCwgVG1wMik7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBWVCwgVG1wOCwgVG1wNCk7CisgIH0KK30KKworLy8vIEV4cGFuZEJpdENvdW50IC0gRXhwYW5kIHRoZSBzcGVjaWZpZWQgYml0Y291bnQgaW5zdHJ1Y3Rpb24gaW50byBvcGVyYXRpb25zLgorLy8vCitTRFZhbHVlIFNlbGVjdGlvbkRBR0xlZ2FsaXplOjpFeHBhbmRCaXRDb3VudCh1bnNpZ25lZCBPcGMsIFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCkgeworICBzd2l0Y2ggKE9wYykgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiQ2Fubm90IGV4cGFuZCB0aGlzIHlldCEiKTsKKyAgY2FzZSBJU0Q6OkNUUE9QOiB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IG1hc2tbNl0gPSB7CisgICAgICAweDU1NTU1NTU1NTU1NTU1NTVVTEwsIDB4MzMzMzMzMzMzMzMzMzMzM1VMTCwKKyAgICAgIDB4MEYwRjBGMEYwRjBGMEYwRlVMTCwgMHgwMEZGMDBGRjAwRkYwMEZGVUxMLAorICAgICAgMHgwMDAwRkZGRjAwMDBGRkZGVUxMLCAweDAwMDAwMDAwRkZGRkZGRkZVTEwKKyAgICB9OworICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICAgIEVWVCBTaFZUID0gVExJLmdldFNoaWZ0QW1vdW50VHkoKTsKKyAgICB1bnNpZ25lZCBsZW4gPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgKDFVIDw8IGkpIDw9IChsZW4gLyAyKTsgKytpKSB7CisgICAgICAvL3ggPSAoeCAmIG1hc2tbaV1bbGVuLzhdKSArICh4ID4+ICgxIDw8IGkpICYgbWFza1tpXVtsZW4vOF0pCisgICAgICB1bnNpZ25lZCBFbHRTaXplID0gVlQuaXNWZWN0b3IoKSA/CisgICAgICAgIFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkuZ2V0U2l6ZUluQml0cygpIDogbGVuOworICAgICAgU0RWYWx1ZSBUbXAyID0gREFHLmdldENvbnN0YW50KEFQSW50KEVsdFNpemUsIG1hc2tbaV0pLCBWVCk7CisgICAgICBTRFZhbHVlIFRtcDMgPSBEQUcuZ2V0Q29uc3RhbnQoMVVMTCA8PCBpLCBTaFZUKTsKKyAgICAgIE9wID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBWVCwgT3AsIFRtcDIpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIFZULCBPcCwgVG1wMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRtcDIpKTsKKyAgICB9CisgICAgcmV0dXJuIE9wOworICB9CisgIGNhc2UgSVNEOjpDVExaOiB7CisgICAgLy8gZm9yIG5vdywgd2UgZG8gdGhpczoKKyAgICAvLyB4ID0geCB8ICh4ID4+IDEpOworICAgIC8vIHggPSB4IHwgKHggPj4gMik7CisgICAgLy8gLi4uCisgICAgLy8geCA9IHggfCAoeCA+PjE2KTsKKyAgICAvLyB4ID0geCB8ICh4ID4+MzIpOyAvLyBmb3IgNjQtYml0IGlucHV0CisgICAgLy8gcmV0dXJuIHBvcGNvdW50KH54KTsKKyAgICAvLworICAgIC8vIGJ1dCBzZWUgYWxzbzogaHR0cDovL3d3dy5oYWNrZXJzZGVsaWdodC5vcmcvSERjb2RlL25sei5jYworICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICAgIEVWVCBTaFZUID0gVExJLmdldFNoaWZ0QW1vdW50VHkoKTsKKyAgICB1bnNpZ25lZCBsZW4gPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgKDFVIDw8IGkpIDw9IChsZW4gLyAyKTsgKytpKSB7CisgICAgICBTRFZhbHVlIFRtcDMgPSBEQUcuZ2V0Q29uc3RhbnQoMVVMTCA8PCBpLCBTaFZUKTsKKyAgICAgIE9wID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFZULCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBWVCwgT3AsIFRtcDMpKTsKKyAgICB9CisgICAgT3AgPSBEQUcuZ2V0Tk9UKGRsLCBPcCwgVlQpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkNUUE9QLCBkbCwgVlQsIE9wKTsKKyAgfQorICBjYXNlIElTRDo6Q1RUWjogeworICAgIC8vIGZvciBub3csIHdlIHVzZTogeyByZXR1cm4gcG9wY291bnQofnggJiAoeCAtIDEpKTsgfQorICAgIC8vIHVubGVzcyB0aGUgdGFyZ2V0IGhhcyBjdGx6IGJ1dCBub3QgY3Rwb3AsIGluIHdoaWNoIGNhc2Ugd2UgdXNlOgorICAgIC8vIHsgcmV0dXJuIDMyIC0gbmx6KH54ICYgKHgtMSkpOyB9CisgICAgLy8gc2VlIGFsc28gaHR0cDovL3d3dy5oYWNrZXJzZGVsaWdodC5vcmcvSERjb2RlL250ei5jYworICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICAgIFNEVmFsdWUgVG1wMyA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5PVChkbCwgT3AsIFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIFZULCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgVlQpKSk7CisgICAgLy8gSWYgSVNEOjpDVExaIGlzIGxlZ2FsIGFuZCBDVFBPUCBpc24ndCwgdGhlbiBkbyB0aGF0IGluc3RlYWQuCisgICAgaWYgKCFUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6Q1RQT1AsIFZUKSAmJgorICAgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6Q1RMWiwgVlQpKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFZULmdldFNpemVJbkJpdHMoKSwgVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6Q1RMWiwgZGwsIFZULCBUbXAzKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Q1RQT1AsIGRsLCBWVCwgVG1wMyk7CisgIH0KKyAgfQorfQorCitzdGQ6OnBhaXIgPFNEVmFsdWUsIFNEVmFsdWU+IFNlbGVjdGlvbkRBR0xlZ2FsaXplOjpFeHBhbmRBdG9taWMoU0ROb2RlICpOb2RlKSB7CisgIHVuc2lnbmVkIE9wYyA9IE5vZGUtPmdldE9wY29kZSgpOworICBNVlQgVlQgPSBjYXN0PEF0b21pY1NETm9kZT4oTm9kZSktPmdldE1lbW9yeVZUKCkuZ2V0U2ltcGxlVlQoKTsKKyAgUlRMSUI6OkxpYmNhbGwgTEM7CisKKyAgc3dpdGNoIChPcGMpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgYXRvbWljIGludHJpbnNpYyBFeHBhbmQhIik7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpBVE9NSUNfU1dBUDoKKyAgICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCB2YWx1ZSB0eXBlIGZvciBhdG9taWMhIik7CisgICAgY2FzZSBNVlQ6Omk4OiAgTEMgPSBSVExJQjo6U1lOQ19MT0NLX1RFU1RfQU5EX1NFVF8xOyBicmVhazsKKyAgICBjYXNlIE1WVDo6aTE2OiBMQyA9IFJUTElCOjpTWU5DX0xPQ0tfVEVTVF9BTkRfU0VUXzI7IGJyZWFrOworICAgIGNhc2UgTVZUOjppMzI6IExDID0gUlRMSUI6OlNZTkNfTE9DS19URVNUX0FORF9TRVRfNDsgYnJlYWs7CisgICAgY2FzZSBNVlQ6Omk2NDogTEMgPSBSVExJQjo6U1lOQ19MT0NLX1RFU1RfQU5EX1NFVF84OyBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpBVE9NSUNfQ01QX1NXQVA6CisgICAgc3dpdGNoIChWVC5TaW1wbGVUeSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgdmFsdWUgdHlwZSBmb3IgYXRvbWljISIpOworICAgIGNhc2UgTVZUOjppODogIExDID0gUlRMSUI6OlNZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVBfMTsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OmkxNjogTEMgPSBSVExJQjo6U1lOQ19WQUxfQ09NUEFSRV9BTkRfU1dBUF8yOyBicmVhazsKKyAgICBjYXNlIE1WVDo6aTMyOiBMQyA9IFJUTElCOjpTWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQXzQ7IGJyZWFrOworICAgIGNhc2UgTVZUOjppNjQ6IExDID0gUlRMSUI6OlNZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVBfODsgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6QVRPTUlDX0xPQURfQUREOgorICAgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHZhbHVlIHR5cGUgZm9yIGF0b21pYyEiKTsKKyAgICBjYXNlIE1WVDo6aTg6ICBMQyA9IFJUTElCOjpTWU5DX0ZFVENIX0FORF9BRERfMTsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OmkxNjogTEMgPSBSVExJQjo6U1lOQ19GRVRDSF9BTkRfQUREXzI7IGJyZWFrOworICAgIGNhc2UgTVZUOjppMzI6IExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FERF80OyBicmVhazsKKyAgICBjYXNlIE1WVDo6aTY0OiBMQyA9IFJUTElCOjpTWU5DX0ZFVENIX0FORF9BRERfODsgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6QVRPTUlDX0xPQURfU1VCOgorICAgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHZhbHVlIHR5cGUgZm9yIGF0b21pYyEiKTsKKyAgICBjYXNlIE1WVDo6aTg6ICBMQyA9IFJUTElCOjpTWU5DX0ZFVENIX0FORF9TVUJfMTsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OmkxNjogTEMgPSBSVExJQjo6U1lOQ19GRVRDSF9BTkRfU1VCXzI7IGJyZWFrOworICAgIGNhc2UgTVZUOjppMzI6IExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX1NVQl80OyBicmVhazsKKyAgICBjYXNlIE1WVDo6aTY0OiBMQyA9IFJUTElCOjpTWU5DX0ZFVENIX0FORF9TVUJfODsgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6QVRPTUlDX0xPQURfQU5EOgorICAgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHZhbHVlIHR5cGUgZm9yIGF0b21pYyEiKTsKKyAgICBjYXNlIE1WVDo6aTg6ICBMQyA9IFJUTElCOjpTWU5DX0ZFVENIX0FORF9BTkRfMTsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OmkxNjogTEMgPSBSVExJQjo6U1lOQ19GRVRDSF9BTkRfQU5EXzI7IGJyZWFrOworICAgIGNhc2UgTVZUOjppMzI6IExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FORF80OyBicmVhazsKKyAgICBjYXNlIE1WVDo6aTY0OiBMQyA9IFJUTElCOjpTWU5DX0ZFVENIX0FORF9BTkRfODsgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6QVRPTUlDX0xPQURfT1I6CisgICAgc3dpdGNoIChWVC5TaW1wbGVUeSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgdmFsdWUgdHlwZSBmb3IgYXRvbWljISIpOworICAgIGNhc2UgTVZUOjppODogIExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX09SXzE7IGJyZWFrOworICAgIGNhc2UgTVZUOjppMTY6IExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX09SXzI7IGJyZWFrOworICAgIGNhc2UgTVZUOjppMzI6IExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX09SXzQ7IGJyZWFrOworICAgIGNhc2UgTVZUOjppNjQ6IExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX09SXzg7IGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1hPUjoKKyAgICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCB2YWx1ZSB0eXBlIGZvciBhdG9taWMhIik7CisgICAgY2FzZSBNVlQ6Omk4OiAgTEMgPSBSVExJQjo6U1lOQ19GRVRDSF9BTkRfWE9SXzE7IGJyZWFrOworICAgIGNhc2UgTVZUOjppMTY6IExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX1hPUl8yOyBicmVhazsKKyAgICBjYXNlIE1WVDo6aTMyOiBMQyA9IFJUTElCOjpTWU5DX0ZFVENIX0FORF9YT1JfNDsgYnJlYWs7CisgICAgY2FzZSBNVlQ6Omk2NDogTEMgPSBSVExJQjo6U1lOQ19GRVRDSF9BTkRfWE9SXzg7IGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX05BTkQ6CisgICAgc3dpdGNoIChWVC5TaW1wbGVUeSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgdmFsdWUgdHlwZSBmb3IgYXRvbWljISIpOworICAgIGNhc2UgTVZUOjppODogIExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX05BTkRfMTsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OmkxNjogTEMgPSBSVExJQjo6U1lOQ19GRVRDSF9BTkRfTkFORF8yOyBicmVhazsKKyAgICBjYXNlIE1WVDo6aTMyOiBMQyA9IFJUTElCOjpTWU5DX0ZFVENIX0FORF9OQU5EXzQ7IGJyZWFrOworICAgIGNhc2UgTVZUOjppNjQ6IExDID0gUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX05BTkRfODsgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEV4cGFuZENoYWluTGliQ2FsbChMQywgTm9kZSwgZmFsc2UpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0xlZ2FsaXplOjpFeHBhbmROb2RlKFNETm9kZSAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZXN1bHRzKSB7CisgIERlYnVnTG9jIGRsID0gTm9kZS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBUbXAxLCBUbXAyLCBUbXAzLCBUbXA0OworICBzd2l0Y2ggKE5vZGUtPmdldE9wY29kZSgpKSB7CisgIGNhc2UgSVNEOjpDVFBPUDoKKyAgY2FzZSBJU0Q6OkNUTFo6CisgIGNhc2UgSVNEOjpDVFRaOgorICAgIFRtcDEgPSBFeHBhbmRCaXRDb3VudChOb2RlLT5nZXRPcGNvZGUoKSwgTm9kZS0+Z2V0T3BlcmFuZCgwKSwgZGwpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6QlNXQVA6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kQlNXQVAoTm9kZS0+Z2V0T3BlcmFuZCgwKSwgZGwpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZSQU1FQUREUjoKKyAgY2FzZSBJU0Q6OlJFVFVSTkFERFI6CisgIGNhc2UgSVNEOjpGUkFNRV9UT19BUkdTX09GRlNFVDoKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoMCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGTFRfUk9VTkRTXzoKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoMSwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpQUkVGRVRDSDoKKyAgY2FzZSBJU0Q6OlZBRU5EOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKE5vZGUtPmdldE9wZXJhbmQoMCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6TUVNQkFSUklFUjogeworICAgIC8vIElmIHRoZSB0YXJnZXQgZGlkbid0IGxvd2VyIHRoaXMsIGxvd2VyIGl0IHRvICdfX3N5bmNfc3luY2hyb25pemUoKScgY2FsbAorICAgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0VHkgQXJnczsKKyAgICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gQ2FsbFJlc3VsdCA9CisgICAgICBUTEkuTG93ZXJDYWxsVG8oTm9kZS0+Z2V0T3BlcmFuZCgwKSwgVHlwZTo6Z2V0Vm9pZFR5KCpEQUcuZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgQ2FsbGluZ0NvbnY6OkMsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIC8qaXNSZXR1cm5WYWx1ZVVzZWQ9Ki90cnVlLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRFeHRlcm5hbFN5bWJvbCgiX19zeW5jX3N5bmNocm9uaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBBcmdzLCBEQUcsIGRsKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhDYWxsUmVzdWx0LnNlY29uZCk7CisgICAgYnJlYWs7CisgIH0KKyAgLy8gQnkgZGVmYXVsdCwgYXRvbWljIGludHJpbnNpY3MgYXJlIG1hcmtlZCBMZWdhbCBhbmQgbG93ZXJlZC4gVGFyZ2V0cworICAvLyB3aGljaCBkb24ndCBzdXBwb3J0IHRoZW0gZGlyZWN0bHksIGhvd2V2ZXIsIG1heSB3YW50IGxpYmNhbGxzLCBpbiB3aGljaAorICAvLyBjYXNlIHRoZXkgbWFyayB0aGVtIEV4cGFuZCwgYW5kIHdlIGdldCBoZXJlLgorICAvLyBGSVhNRTogVW5pbXBsZW1lbnRlZCBmb3Igbm93LiBBZGQgbGliY2FsbHMuCisgIGNhc2UgSVNEOjpBVE9NSUNfU1dBUDoKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX0FERDoKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1NVQjoKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX0FORDoKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX09SOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfWE9SOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfTkFORDoKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX01JTjoKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX01BWDoKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1VNSU46CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9VTUFYOgorICBjYXNlIElTRDo6QVRPTUlDX0NNUF9TV0FQOiB7CisgICAgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+IFRtcCA9IEV4cGFuZEF0b21pYyhOb2RlKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAuZmlyc3QpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcC5zZWNvbmQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0M6CisgICAgRXhwYW5kRFlOQU1JQ19TVEFDS0FMTE9DKE5vZGUsIFJlc3VsdHMpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6TUVSR0VfVkFMVUVTOgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOb2RlLT5nZXROdW1WYWx1ZXMoKTsgaSsrKQorICAgICAgUmVzdWx0cy5wdXNoX2JhY2soTm9kZS0+Z2V0T3BlcmFuZChpKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpVTkRFRjogeworICAgIEVWVCBWVCA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgICBpZiAoVlQuaXNJbnRlZ2VyKCkpCisgICAgICBSZXN1bHRzLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpKTsKKyAgICBlbHNlIHsKKyAgICAgIGFzc2VydChWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJiAiVW5rbm93biB2YWx1ZSB0eXBlISIpOworICAgICAgUmVzdWx0cy5wdXNoX2JhY2soREFHLmdldENvbnN0YW50RlAoMCwgVlQpKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlRSQVA6IHsKKyAgICAvLyBJZiB0aGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBsb3dlciBpdCB0byAnYWJvcnQoKScgY2FsbAorICAgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0VHkgQXJnczsKKyAgICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gQ2FsbFJlc3VsdCA9CisgICAgICBUTEkuTG93ZXJDYWxsVG8oTm9kZS0+Z2V0T3BlcmFuZCgwKSwgVHlwZTo6Z2V0Vm9pZFR5KCpEQUcuZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgQ2FsbGluZ0NvbnY6OkMsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIC8qaXNSZXR1cm5WYWx1ZVVzZWQ9Ki90cnVlLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRFeHRlcm5hbFN5bWJvbCgiYWJvcnQiLCBUTEkuZ2V0UG9pbnRlclR5KCkpLAorICAgICAgICAgICAgICAgICAgICAgIEFyZ3MsIERBRywgZGwpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKENhbGxSZXN1bHQuc2Vjb25kKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6RlBfUk9VTkQ6CisgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDoKKyAgICBUbXAxID0gRW1pdFN0YWNrQ29udmVydChOb2RlLT5nZXRPcGVyYW5kKDApLCBOb2RlLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLCBkbCk7CisgICAgUmVzdWx0cy5wdXNoX2JhY2soVG1wMSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGUF9FWFRFTkQ6CisgICAgVG1wMSA9IEVtaXRTdGFja0NvbnZlcnQoTm9kZS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldFZhbHVlVHlwZSgwKSwgZGwpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0lHTl9FWFRFTkRfSU5SRUc6IHsKKyAgICAvLyBOT1RFOiB3ZSBjb3VsZCBmYWxsIGJhY2sgb24gbG9hZC9zdG9yZSBoZXJlIHRvbyBmb3IgdGFyZ2V0cyB3aXRob3V0CisgICAgLy8gU0FSLiAgSG93ZXZlciwgaXQgaXMgZG91YnRmdWwgdGhhdCBhbnkgZXhpc3QuCisgICAgRVZUIEV4dHJhVlQgPSBjYXN0PFZUU0ROb2RlPihOb2RlLT5nZXRPcGVyYW5kKDEpKS0+Z2V0VlQoKTsKKyAgICBFVlQgVlQgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgRVZUIFNoaWZ0QW1vdW50VHkgPSBUTEkuZ2V0U2hpZnRBbW91bnRUeSgpOworICAgIGlmIChWVC5pc1ZlY3RvcigpKQorICAgICAgU2hpZnRBbW91bnRUeSA9IFZUOworICAgIHVuc2lnbmVkIEJpdHNEaWZmID0gVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYVZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgICAgU0RWYWx1ZSBTaGlmdENzdCA9IERBRy5nZXRDb25zdGFudChCaXRzRGlmZiwgU2hpZnRBbW91bnRUeSk7CisgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDApLCBTaGlmdENzdCk7CisgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLCBUbXAxLCBTaGlmdENzdCk7CisgICAgUmVzdWx0cy5wdXNoX2JhY2soVG1wMSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OkZQX1JPVU5EX0lOUkVHOiB7CisgICAgLy8gVGhlIG9ubHkgd2F5IHdlIGNhbiBsb3dlciB0aGlzIGlzIHRvIHR1cm4gaXQgaW50byBhIFRSVU5DU1RPUkUsCisgICAgLy8gRVhUTE9BRCBwYWlyLCB0YXJnZXR0aW5nIGEgdGVtcG9yYXJ5IGxvY2F0aW9uIChhIHN0YWNrIHNsb3QpLgorCisgICAgLy8gTk9URTogdGhlcmUgaXMgYSBjaG9pY2UgaGVyZSBiZXR3ZWVuIGNvbnN0YW50bHkgY3JlYXRpbmcgbmV3IHN0YWNrCisgICAgLy8gc2xvdHMgYW5kIGFsd2F5cyByZXVzaW5nIHRoZSBzYW1lIG9uZS4gIFdlIGN1cnJlbnRseSBhbHdheXMgY3JlYXRlCisgICAgLy8gbmV3IG9uZXMsIGFzIHJldXNlIG1heSBpbmhpYml0IHNjaGVkdWxpbmcuCisgICAgRVZUIEV4dHJhVlQgPSBjYXN0PFZUU0ROb2RlPihOb2RlLT5nZXRPcGVyYW5kKDEpKS0+Z2V0VlQoKTsKKyAgICBUbXAxID0gRW1pdFN0YWNrQ29udmVydChOb2RlLT5nZXRPcGVyYW5kKDApLCBFeHRyYVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldFZhbHVlVHlwZSgwKSwgZGwpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTSU5UX1RPX0ZQOgorICBjYXNlIElTRDo6VUlOVF9UT19GUDoKKyAgICBUbXAxID0gRXhwYW5kTGVnYWxJTlRfVE9fRlAoTm9kZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTSU5UX1RPX0ZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDApLCBOb2RlLT5nZXRWYWx1ZVR5cGUoMCksIGRsKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZQX1RPX1VJTlQ6IHsKKyAgICBTRFZhbHVlIFRydWUsIEZhbHNlOworICAgIEVWVCBWVCA9ICBOb2RlLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgIEVWVCBOVlQgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgY29uc3QgdWludDY0X3QgemVyb1tdID0gezAsIDB9OworICAgIEFQRmxvYXQgYXBmID0gQVBGbG9hdChBUEludChWVC5nZXRTaXplSW5CaXRzKCksIDIsIHplcm8pKTsKKyAgICBBUEludCB4ID0gQVBJbnQ6OmdldFNpZ25CaXQoTlZULmdldFNpemVJbkJpdHMoKSk7CisgICAgKHZvaWQpYXBmLmNvbnZlcnRGcm9tQVBJbnQoeCwgZmFsc2UsIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgIFRtcDEgPSBEQUcuZ2V0Q29uc3RhbnRGUChhcGYsIFZUKTsKKyAgICBUbXAyID0gREFHLmdldFNldENDKGRsLCBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBUbXAxLCBJU0Q6OlNFVExUKTsKKyAgICBUcnVlID0gREFHLmdldE5vZGUoSVNEOjpGUF9UT19TSU5ULCBkbCwgTlZULCBOb2RlLT5nZXRPcGVyYW5kKDApKTsKKyAgICBGYWxzZSA9IERBRy5nZXROb2RlKElTRDo6RlBfVE9fU0lOVCwgZGwsIE5WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6RlNVQiwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0T3BlcmFuZCgwKSwgVG1wMSkpOworICAgIEZhbHNlID0gREFHLmdldE5vZGUoSVNEOjpYT1IsIGRsLCBOVlQsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KHgsIE5WVCkpOworICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIE5WVCwgVG1wMiwgVHJ1ZSwgRmFsc2UpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpWQUFSRzogeworICAgIGNvbnN0IFZhbHVlICpWID0gY2FzdDxTcmNWYWx1ZVNETm9kZT4oTm9kZS0+Z2V0T3BlcmFuZCgyKSktPmdldFZhbHVlKCk7CisgICAgRVZUIFZUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICAgIFRtcDEgPSBOb2RlLT5nZXRPcGVyYW5kKDApOworICAgIFRtcDIgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworICAgIHVuc2lnbmVkIEFsaWduID0gTm9kZS0+Z2V0Q29uc3RhbnRPcGVyYW5kVmFsKDMpOworCisgICAgU0RWYWx1ZSBWQUxpc3RMb2FkID0gREFHLmdldExvYWQoVExJLmdldFBvaW50ZXJUeSgpLCBkbCwgVG1wMSwgVG1wMiwgViwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgIFNEVmFsdWUgVkFMaXN0ID0gVkFMaXN0TG9hZDsKKworICAgIGlmIChBbGlnbiA+IFRMSS5nZXRNaW5TdGFja0FyZ3VtZW50QWxpZ25tZW50KCkpIHsKKyAgICAgIGFzc2VydCgoKEFsaWduICYgKEFsaWduLTEpKSA9PSAwKSAmJiAiRXhwZWN0ZWQgQWxpZ24gdG8gYmUgYSBwb3dlciBvZiAyIik7CisKKyAgICAgIFZBTGlzdCA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgVExJLmdldFBvaW50ZXJUeSgpLCBWQUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQWxpZ24gLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSkpOworCisgICAgICBWQUxpc3QgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIFRMSS5nZXRQb2ludGVyVHkoKSwgVkFMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KC1BbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgICB9CisKKyAgICAvLyBJbmNyZW1lbnQgdGhlIHBvaW50ZXIsIFZBTGlzdCwgdG8gdGhlIG5leHQgdmFhcmcKKyAgICBUbXAzID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBUTEkuZ2V0UG9pbnRlclR5KCksIFZBTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFRMSS5nZXRUYXJnZXREYXRhKCktPgorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlQWxsb2NTaXplKFZULmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSkpOworICAgIC8vIFN0b3JlIHRoZSBpbmNyZW1lbnRlZCBWQUxpc3QgdG8gdGhlIGxlZ2FsaXplZCBwb2ludGVyCisgICAgVG1wMyA9IERBRy5nZXRTdG9yZShWQUxpc3RMb2FkLmdldFZhbHVlKDEpLCBkbCwgVG1wMywgVG1wMiwgViwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgLy8gTG9hZCB0aGUgYWN0dWFsIGFyZ3VtZW50IG91dCBvZiB0aGUgcG9pbnRlciBWQUxpc3QKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhEQUcuZ2V0TG9hZChWVCwgZGwsIFRtcDMsIFZBTGlzdCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhSZXN1bHRzWzBdLmdldFZhbHVlKDEpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6VkFDT1BZOiB7CisgICAgLy8gVGhpcyBkZWZhdWx0cyB0byBsb2FkaW5nIGEgcG9pbnRlciBmcm9tIHRoZSBpbnB1dCBhbmQgc3RvcmluZyBpdCB0byB0aGUKKyAgICAvLyBvdXRwdXQsIHJldHVybmluZyB0aGUgY2hhaW4uCisgICAgY29uc3QgVmFsdWUgKlZEID0gY2FzdDxTcmNWYWx1ZVNETm9kZT4oTm9kZS0+Z2V0T3BlcmFuZCgzKSktPmdldFZhbHVlKCk7CisgICAgY29uc3QgVmFsdWUgKlZTID0gY2FzdDxTcmNWYWx1ZVNETm9kZT4oTm9kZS0+Z2V0T3BlcmFuZCg0KSktPmdldFZhbHVlKCk7CisgICAgVG1wMSA9IERBRy5nZXRMb2FkKFRMSS5nZXRQb2ludGVyVHkoKSwgZGwsIE5vZGUtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMiksIFZTLCAwLCBmYWxzZSwgZmFsc2UsIDApOworICAgIFRtcDEgPSBEQUcuZ2V0U3RvcmUoVG1wMS5nZXRWYWx1ZSgxKSwgZGwsIFRtcDEsIE5vZGUtPmdldE9wZXJhbmQoMSksIFZELCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6RVhUUkFDVF9WRUNUT1JfRUxUOgorICAgIGlmIChOb2RlLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0gMSkKKyAgICAgIC8vIFRoaXMgbXVzdCBiZSBhbiBhY2Nlc3Mgb2YgdGhlIG9ubHkgZWxlbWVudC4gIFJldHVybiBpdC4KKyAgICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMCkpOworICAgIGVsc2UKKyAgICAgIFRtcDEgPSBFeHBhbmRFeHRyYWN0RnJvbVZlY3RvclRocm91Z2hTdGFjayhTRFZhbHVlKE5vZGUsIDApKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZEV4dHJhY3RGcm9tVmVjdG9yVGhyb3VnaFN0YWNrKFNEVmFsdWUoTm9kZSwgMCkpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOiB7CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kVmVjdG9yQnVpbGRUaHJvdWdoU3RhY2soTm9kZSkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTQ0FMQVJfVE9fVkVDVE9SOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZFNDQUxBUl9UT19WRUNUT1IoTm9kZSkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQ6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kSU5TRVJUX1ZFQ1RPUl9FTFQoTm9kZS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMiksIGRsKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpWRUNUT1JfU0hVRkZMRTogeworICAgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFzazsKKyAgICBjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE5vZGUpLT5nZXRNYXNrKE1hc2spOworCisgICAgRVZUIFZUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICAgIEVWVCBFbHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgaWYgKGdldFR5cGVBY3Rpb24oRWx0VlQpID09IFByb21vdGUpCisgICAgICBFbHRWVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgRWx0VlQpOworICAgIHVuc2lnbmVkIE51bUVsZW1zID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbGVtczsgKytpKSB7CisgICAgICBpZiAoTWFza1tpXSA8IDApIHsKKyAgICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0VU5ERUYoRWx0VlQpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1bnNpZ25lZCBJZHggPSBNYXNrW2ldOworICAgICAgaWYgKElkeCA8IE51bUVsZW1zKQorICAgICAgICBPcHMucHVzaF9iYWNrKERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgRWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSWR4KSkpOworICAgICAgZWxzZQorICAgICAgICBPcHMucHVzaF9iYWNrKERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgRWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSWR4IC0gTnVtRWxlbXMpKSk7CisgICAgfQorICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIFZULCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6RVhUUkFDVF9FTEVNRU5UOiB7CisgICAgRVZUIE9wVHkgPSBOb2RlLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgIGlmIChjYXN0PENvbnN0YW50U0ROb2RlPihOb2RlLT5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCkpIHsKKyAgICAgIC8vIDEgLT4gSGkKKyAgICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE9wVHksIE5vZGUtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE9wVHkuZ2V0U2l6ZUluQml0cygpLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLCBUbXAxKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gMCAtPiBMbworICAgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBOb2RlLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgfQorICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTVEFDS1NBVkU6CisgICAgLy8gRXhwYW5kIHRvIENvcHlGcm9tUmVnIGlmIHRoZSB0YXJnZXQgc2V0CisgICAgLy8gU3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlLgorICAgIGlmICh1bnNpZ25lZCBTUCA9IFRMSS5nZXRTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUoKSkgeworICAgICAgUmVzdWx0cy5wdXNoX2JhY2soREFHLmdldENvcHlGcm9tUmVnKE5vZGUtPmdldE9wZXJhbmQoMCksIGRsLCBTUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRWYWx1ZVR5cGUoMCkpKTsKKyAgICAgIFJlc3VsdHMucHVzaF9iYWNrKFJlc3VsdHNbMF0uZ2V0VmFsdWUoMSkpOworICAgIH0gZWxzZSB7CisgICAgICBSZXN1bHRzLnB1c2hfYmFjayhEQUcuZ2V0VU5ERUYoTm9kZS0+Z2V0VmFsdWVUeXBlKDApKSk7CisgICAgICBSZXN1bHRzLnB1c2hfYmFjayhOb2RlLT5nZXRPcGVyYW5kKDApKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTVEFDS1JFU1RPUkU6CisgICAgLy8gRXhwYW5kIHRvIENvcHlUb1JlZyBpZiB0aGUgdGFyZ2V0IHNldAorICAgIC8vIFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZS4KKyAgICBpZiAodW5zaWduZWQgU1AgPSBUTEkuZ2V0U3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlKCkpIHsKKyAgICAgIFJlc3VsdHMucHVzaF9iYWNrKERBRy5nZXRDb3B5VG9SZWcoTm9kZS0+Z2V0T3BlcmFuZCgwKSwgZGwsIFNQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDEpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFJlc3VsdHMucHVzaF9iYWNrKE5vZGUtPmdldE9wZXJhbmQoMCkpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZDT1BZU0lHTjoKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhFeHBhbmRGQ09QWVNJR04oTm9kZSkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6Rk5FRzoKKyAgICAvLyBFeHBhbmQgWSA9IEZORUcoWCkgLT4gIFkgPSBTVUIgLTAuMCwgWAorICAgIFRtcDEgPSBEQUcuZ2V0Q29uc3RhbnRGUCgtMC4wLCBOb2RlLT5nZXRWYWx1ZVR5cGUoMCkpOworICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBOb2RlLT5nZXRWYWx1ZVR5cGUoMCksIFRtcDEsCisgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMCkpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6RkFCUzogeworICAgIC8vIEV4cGFuZCBZID0gRkFCUyhYKSAtPiBZID0gKFggPnUgMC4wKSA/IFggOiBmbmVnKFgpLgorICAgIEVWVCBWVCA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgICBUbXAxID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBUbXAyID0gREFHLmdldENvbnN0YW50RlAoMC4wLCBWVCk7CisgICAgVG1wMiA9IERBRy5nZXRTZXRDQyhkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShUbXAxLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRtcDEsIFRtcDIsIElTRDo6U0VUVUdUKTsKKyAgICBUbXAzID0gREFHLmdldE5vZGUoSVNEOjpGTkVHLCBkbCwgVlQsIFRtcDEpOworICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIFZULCBUbXAyLCBUbXAxLCBUbXAzKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6RlNRUlQ6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kRlBMaWJDYWxsKE5vZGUsIFJUTElCOjpTUVJUX0YzMiwgUlRMSUI6OlNRUlRfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U1FSVF9GODAsIFJUTElCOjpTUVJUX1BQQ0YxMjgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZTSU46CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kRlBMaWJDYWxsKE5vZGUsIFJUTElCOjpTSU5fRjMyLCBSVExJQjo6U0lOX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNJTl9GODAsIFJUTElCOjpTSU5fUFBDRjEyOCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6RkNPUzoKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhFeHBhbmRGUExpYkNhbGwoTm9kZSwgUlRMSUI6OkNPU19GMzIsIFJUTElCOjpDT1NfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6Q09TX0Y4MCwgUlRMSUI6OkNPU19QUENGMTI4KSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGTE9HOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZEZQTGliQ2FsbChOb2RlLCBSVExJQjo6TE9HX0YzMiwgUlRMSUI6OkxPR19GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMT0dfRjgwLCBSVExJQjo6TE9HX1BQQ0YxMjgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZMT0cyOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZEZQTGliQ2FsbChOb2RlLCBSVExJQjo6TE9HMl9GMzIsIFJUTElCOjpMT0cyX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPRzJfRjgwLCBSVExJQjo6TE9HMl9QUENGMTI4KSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGTE9HMTA6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kRlBMaWJDYWxsKE5vZGUsIFJUTElCOjpMT0cxMF9GMzIsIFJUTElCOjpMT0cxMF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMT0cxMF9GODAsIFJUTElCOjpMT0cxMF9QUENGMTI4KSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGRVhQOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZEZQTGliQ2FsbChOb2RlLCBSVExJQjo6RVhQX0YzMiwgUlRMSUI6OkVYUF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpFWFBfRjgwLCBSVExJQjo6RVhQX1BQQ0YxMjgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZFWFAyOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZEZQTGliQ2FsbChOb2RlLCBSVExJQjo6RVhQMl9GMzIsIFJUTElCOjpFWFAyX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkVYUDJfRjgwLCBSVExJQjo6RVhQMl9QUENGMTI4KSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGVFJVTkM6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kRlBMaWJDYWxsKE5vZGUsIFJUTElCOjpUUlVOQ19GMzIsIFJUTElCOjpUUlVOQ19GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpUUlVOQ19GODAsIFJUTElCOjpUUlVOQ19QUENGMTI4KSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGRkxPT1I6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kRlBMaWJDYWxsKE5vZGUsIFJUTElCOjpGTE9PUl9GMzIsIFJUTElCOjpGTE9PUl9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpGTE9PUl9GODAsIFJUTElCOjpGTE9PUl9QUENGMTI4KSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGQ0VJTDoKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhFeHBhbmRGUExpYkNhbGwoTm9kZSwgUlRMSUI6OkNFSUxfRjMyLCBSVExJQjo6Q0VJTF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpDRUlMX0Y4MCwgUlRMSUI6OkNFSUxfUFBDRjEyOCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6RlJJTlQ6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kRlBMaWJDYWxsKE5vZGUsIFJUTElCOjpSSU5UX0YzMiwgUlRMSUI6OlJJTlRfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UklOVF9GODAsIFJUTElCOjpSSU5UX1BQQ0YxMjgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZORUFSQllJTlQ6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kRlBMaWJDYWxsKE5vZGUsIFJUTElCOjpORUFSQllJTlRfRjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TkVBUkJZSU5UX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6Ok5FQVJCWUlOVF9GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpORUFSQllJTlRfUFBDRjEyOCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6RlBPV0k6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kRlBMaWJDYWxsKE5vZGUsIFJUTElCOjpQT1dJX0YzMiwgUlRMSUI6OlBPV0lfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UE9XSV9GODAsIFJUTElCOjpQT1dJX1BQQ0YxMjgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZQT1c6CisgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kRlBMaWJDYWxsKE5vZGUsIFJUTElCOjpQT1dfRjMyLCBSVExJQjo6UE9XX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlBPV19GODAsIFJUTElCOjpQT1dfUFBDRjEyOCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6RkRJVjoKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhFeHBhbmRGUExpYkNhbGwoTm9kZSwgUlRMSUI6OkRJVl9GMzIsIFJUTElCOjpESVZfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RElWX0Y4MCwgUlRMSUI6OkRJVl9QUENGMTI4KSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGUkVNOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZEZQTGliQ2FsbChOb2RlLCBSVExJQjo6UkVNX0YzMiwgUlRMSUI6OlJFTV9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpSRU1fRjgwLCBSVExJQjo6UkVNX1BQQ0YxMjgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZQMTZfVE9fRlAzMjoKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhFeHBhbmRMaWJDYWxsKFJUTElCOjpGUEVYVF9GMTZfRjMyLCBOb2RlLCBmYWxzZSkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6RlAzMl9UT19GUDE2OgorICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZExpYkNhbGwoUlRMSUI6OkZQUk9VTkRfRjMyX0YxNiwgTm9kZSwgZmFsc2UpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkNvbnN0YW50RlA6IHsKKyAgICBDb25zdGFudEZQU0ROb2RlICpDRlAgPSBjYXN0PENvbnN0YW50RlBTRE5vZGU+KE5vZGUpOworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIEZQIGltbWVkaWF0ZSBpcyBhbHJlYWR5IGxlZ2FsLgorICAgIC8vIElmIHRoaXMgaXMgYSBsZWdhbCBjb25zdGFudCwgdHVybiBpdCBpbnRvIGEgVGFyZ2V0Q29uc3RhbnRGUCBub2RlLgorICAgIGlmIChUTEkuaXNGUEltbUxlZ2FsKENGUC0+Z2V0VmFsdWVBUEYoKSwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApKSkKKyAgICAgIFJlc3VsdHMucHVzaF9iYWNrKFNEVmFsdWUoTm9kZSwgMCkpOworICAgIGVsc2UKKyAgICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZENvbnN0YW50RlAoQ0ZQLCB0cnVlLCBEQUcsIFRMSSkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTVUI6IHsKKyAgICBFVlQgVlQgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgYXNzZXJ0KFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpBREQsIFZUKSAmJgorICAgICAgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6WE9SLCBWVCkgJiYKKyAgICAgICAgICAgIkRvbid0IGtub3cgaG93IHRvIGV4cGFuZCB0aGlzIHN1YnRyYWN0aW9uISIpOworICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIFZULCBOb2RlLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoVlQuZ2V0U2l6ZUluQml0cygpKSwgVlQpKTsKKyAgICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBWVCwgVG1wMiwgREFHLmdldENvbnN0YW50KDEsIFZUKSk7CisgICAgUmVzdWx0cy5wdXNoX2JhY2soREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBWVCwgTm9kZS0+Z2V0T3BlcmFuZCgwKSwgVG1wMSkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpVUkVNOgorICBjYXNlIElTRDo6U1JFTTogeworICAgIEVWVCBWVCA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgICBTRFZUTGlzdCBWVHMgPSBEQUcuZ2V0VlRMaXN0KFZULCBWVCk7CisgICAgYm9vbCBpc1NpZ25lZCA9IE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6U1JFTTsKKyAgICB1bnNpZ25lZCBEaXZPcGMgPSBpc1NpZ25lZCA/IElTRDo6U0RJViA6IElTRDo6VURJVjsKKyAgICB1bnNpZ25lZCBEaXZSZW1PcGMgPSBpc1NpZ25lZCA/IElTRDo6U0RJVlJFTSA6IElTRDo6VURJVlJFTTsKKyAgICBUbXAyID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBUbXAzID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBpZiAoVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShEaXZSZW1PcGMsIFZUKSkgeworICAgICAgVG1wMSA9IERBRy5nZXROb2RlKERpdlJlbU9wYywgZGwsIFZUcywgVG1wMiwgVG1wMykuZ2V0VmFsdWUoMSk7CisgICAgfSBlbHNlIGlmIChUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKERpdk9wYywgVlQpKSB7CisgICAgICAvLyBYICUgWSAtPiBYLVgvWSpZCisgICAgICBUbXAxID0gREFHLmdldE5vZGUoRGl2T3BjLCBkbCwgVlQsIFRtcDIsIFRtcDMpOworICAgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6TVVMLCBkbCwgVlQsIFRtcDEsIFRtcDMpOworICAgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwgVlQsIFRtcDIsIFRtcDEpOworICAgIH0gZWxzZSBpZiAoaXNTaWduZWQpIHsKKyAgICAgIFRtcDEgPSBFeHBhbmRJbnRMaWJDYWxsKE5vZGUsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U1JFTV9JOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTUkVNX0kxNiwgUlRMSUI6OlNSRU1fSTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNSRU1fSTY0LCBSVExJQjo6U1JFTV9JMTI4KTsKKyAgICB9IGVsc2UgeworICAgICAgVG1wMSA9IEV4cGFuZEludExpYkNhbGwoTm9kZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6VVJFTV9JOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpVUkVNX0kxNiwgUlRMSUI6OlVSRU1fSTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlVSRU1fSTY0LCBSVExJQjo6VVJFTV9JMTI4KTsKKyAgICB9CisgICAgUmVzdWx0cy5wdXNoX2JhY2soVG1wMSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlVESVY6CisgIGNhc2UgSVNEOjpTRElWOiB7CisgICAgYm9vbCBpc1NpZ25lZCA9IE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6U0RJVjsKKyAgICB1bnNpZ25lZCBEaXZSZW1PcGMgPSBpc1NpZ25lZCA/IElTRDo6U0RJVlJFTSA6IElTRDo6VURJVlJFTTsKKyAgICBFVlQgVlQgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgU0RWVExpc3QgVlRzID0gREFHLmdldFZUTGlzdChWVCwgVlQpOworICAgIGlmIChUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKERpdlJlbU9wYywgVlQpKQorICAgICAgVG1wMSA9IERBRy5nZXROb2RlKERpdlJlbU9wYywgZGwsIFZUcywgTm9kZS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBlbHNlIGlmIChpc1NpZ25lZCkKKyAgICAgIFRtcDEgPSBFeHBhbmRJbnRMaWJDYWxsKE5vZGUsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U0RJVl9JOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTRElWX0kxNiwgUlRMSUI6OlNESVZfSTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNESVZfSTY0LCBSVExJQjo6U0RJVl9JMTI4KTsKKyAgICBlbHNlCisgICAgICBUbXAxID0gRXhwYW5kSW50TGliQ2FsbChOb2RlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpVRElWX0k4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlVESVZfSTE2LCBSVExJQjo6VURJVl9JMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6VURJVl9JNjQsIFJUTElCOjpVRElWX0kxMjgpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpNVUxIVToKKyAgY2FzZSBJU0Q6Ok1VTEhTOiB7CisgICAgdW5zaWduZWQgRXhwYW5kT3Bjb2RlID0gTm9kZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpNVUxIVSA/IElTRDo6VU1VTF9MT0hJIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTTVVMX0xPSEk7CisgICAgRVZUIFZUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICAgIFNEVlRMaXN0IFZUcyA9IERBRy5nZXRWVExpc3QoVlQsIFZUKTsKKyAgICBhc3NlcnQoVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShFeHBhbmRPcGNvZGUsIFZUKSAmJgorICAgICAgICAgICAiSWYgdGhpcyB3YXNuJ3QgbGVnYWwsIGl0IHNob3VsZG4ndCBoYXZlIGJlZW4gY3JlYXRlZCEiKTsKKyAgICBUbXAxID0gREFHLmdldE5vZGUoRXhwYW5kT3Bjb2RlLCBkbCwgVlRzLCBOb2RlLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxLmdldFZhbHVlKDEpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6TVVMOiB7CisgICAgRVZUIFZUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICAgIFNEVlRMaXN0IFZUcyA9IERBRy5nZXRWVExpc3QoVlQsIFZUKTsKKyAgICAvLyBTZWUgaWYgbXVsdGlwbHkgb3IgZGl2aWRlIGNhbiBiZSBsb3dlcmVkIHVzaW5nIHR3by1yZXN1bHQgb3BlcmF0aW9ucy4KKyAgICAvLyBXZSBqdXN0IG5lZWQgdGhlIGxvdyBoYWxmIG9mIHRoZSBtdWx0aXBseTsgdHJ5IGJvdGggdGhlIHNpZ25lZAorICAgIC8vIGFuZCB1bnNpZ25lZCBmb3Jtcy4gSWYgdGhlIHRhcmdldCBzdXBwb3J0cyBib3RoIFNNVUxfTE9ISSBhbmQKKyAgICAvLyBVTVVMX0xPSEksIGZvcm0gYSBwcmVmZXJlbmNlIGJ5IGNoZWNraW5nIHdoaWNoIGZvcm1zIG9mIHBsYWluCisgICAgLy8gTVVMSCBpdCBzdXBwb3J0cy4KKyAgICBib29sIEhhc1NNVUxfTE9ISSA9IFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpTTVVMX0xPSEksIFZUKTsKKyAgICBib29sIEhhc1VNVUxfTE9ISSA9IFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpVTVVMX0xPSEksIFZUKTsKKyAgICBib29sIEhhc01VTEhTID0gVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6Ok1VTEhTLCBWVCk7CisgICAgYm9vbCBIYXNNVUxIVSA9IFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpNVUxIVSwgVlQpOworICAgIHVuc2lnbmVkIE9wVG9Vc2UgPSAwOworICAgIGlmIChIYXNTTVVMX0xPSEkgJiYgIUhhc01VTEhTKSB7CisgICAgICBPcFRvVXNlID0gSVNEOjpTTVVMX0xPSEk7CisgICAgfSBlbHNlIGlmIChIYXNVTVVMX0xPSEkgJiYgIUhhc01VTEhVKSB7CisgICAgICBPcFRvVXNlID0gSVNEOjpVTVVMX0xPSEk7CisgICAgfSBlbHNlIGlmIChIYXNTTVVMX0xPSEkpIHsKKyAgICAgIE9wVG9Vc2UgPSBJU0Q6OlNNVUxfTE9ISTsKKyAgICB9IGVsc2UgaWYgKEhhc1VNVUxfTE9ISSkgeworICAgICAgT3BUb1VzZSA9IElTRDo6VU1VTF9MT0hJOworICAgIH0KKyAgICBpZiAoT3BUb1VzZSkgeworICAgICAgUmVzdWx0cy5wdXNoX2JhY2soREFHLmdldE5vZGUoT3BUb1VzZSwgZGwsIFZUcywgTm9kZS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMSkpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBUbXAxID0gRXhwYW5kSW50TGliQ2FsbChOb2RlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TVVMX0k4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpNVUxfSTE2LCBSVExJQjo6TVVMX0kzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TVVMX0k2NCwgUlRMSUI6Ok1VTF9JMTI4KTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6U0FERE86CisgIGNhc2UgSVNEOjpTU1VCTzogeworICAgIFNEVmFsdWUgTEhTID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIFJIUyA9IE5vZGUtPmdldE9wZXJhbmQoMSk7CisgICAgU0RWYWx1ZSBTdW0gPSBEQUcuZ2V0Tm9kZShOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNBRERPID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QUREIDogSVNEOjpTVUIsIGRsLCBMSFMuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFMsIFJIUyk7CisgICAgUmVzdWx0cy5wdXNoX2JhY2soU3VtKTsKKyAgICBFVlQgT1R5cGUgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMSk7CisKKyAgICBTRFZhbHVlIFplcm8gPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTEhTLmdldFZhbHVlVHlwZSgpKTsKKworICAgIC8vICAgTEhTU2lnbiAtPiBMSFMgPj0gMAorICAgIC8vICAgUkhTU2lnbiAtPiBSSFMgPj0gMAorICAgIC8vICAgU3VtU2lnbiAtPiBTdW0gPj0gMAorICAgIC8vCisgICAgLy8gICBBZGQ6CisgICAgLy8gICBPdmVyZmxvdyAtPiAoTEhTU2lnbiA9PSBSSFNTaWduKSAmJiAoTEhTU2lnbiAhPSBTdW1TaWduKQorICAgIC8vICAgU3ViOgorICAgIC8vICAgT3ZlcmZsb3cgLT4gKExIU1NpZ24gIT0gUkhTU2lnbikgJiYgKExIU1NpZ24gIT0gU3VtU2lnbikKKyAgICAvLworICAgIFNEVmFsdWUgTEhTU2lnbiA9IERBRy5nZXRTZXRDQyhkbCwgT1R5cGUsIExIUywgWmVybywgSVNEOjpTRVRHRSk7CisgICAgU0RWYWx1ZSBSSFNTaWduID0gREFHLmdldFNldENDKGRsLCBPVHlwZSwgUkhTLCBaZXJvLCBJU0Q6OlNFVEdFKTsKKyAgICBTRFZhbHVlIFNpZ25zTWF0Y2ggPSBEQUcuZ2V0U2V0Q0MoZGwsIE9UeXBlLCBMSFNTaWduLCBSSFNTaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNBRERPID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRFUSA6IElTRDo6U0VUTkUpOworCisgICAgU0RWYWx1ZSBTdW1TaWduID0gREFHLmdldFNldENDKGRsLCBPVHlwZSwgU3VtLCBaZXJvLCBJU0Q6OlNFVEdFKTsKKyAgICBTRFZhbHVlIFN1bVNpZ25ORSA9IERBRy5nZXRTZXRDQyhkbCwgT1R5cGUsIExIU1NpZ24sIFN1bVNpZ24sIElTRDo6U0VUTkUpOworCisgICAgU0RWYWx1ZSBDbXAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIE9UeXBlLCBTaWduc01hdGNoLCBTdW1TaWduTkUpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKENtcCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlVBRERPOgorICBjYXNlIElTRDo6VVNVQk86IHsKKyAgICBTRFZhbHVlIExIUyA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBSSFMgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworICAgIFNEVmFsdWUgU3VtID0gREFHLmdldE5vZGUoTm9kZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpVQURETyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFERCA6IElTRDo6U1VCLCBkbCwgTEhTLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTLCBSSFMpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFN1bSk7CisgICAgUmVzdWx0cy5wdXNoX2JhY2soREFHLmdldFNldENDKGRsLCBOb2RlLT5nZXRWYWx1ZVR5cGUoMSksIFN1bSwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGNvZGUgKCkgPT0gSVNEOjpVQURETyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUVUxUIDogSVNEOjpTRVRVR1QpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6VU1VTE86CisgIGNhc2UgSVNEOjpTTVVMTzogeworICAgIEVWVCBWVCA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgICBTRFZhbHVlIExIUyA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBSSFMgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworICAgIFNEVmFsdWUgQm90dG9tSGFsZjsKKyAgICBTRFZhbHVlIFRvcEhhbGY7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE9wc1syXVszXSA9CisgICAgICAgIHsgeyBJU0Q6Ok1VTEhVLCBJU0Q6OlVNVUxfTE9ISSwgSVNEOjpaRVJPX0VYVEVORCB9LAorICAgICAgICAgIHsgSVNEOjpNVUxIUywgSVNEOjpTTVVMX0xPSEksIElTRDo6U0lHTl9FWFRFTkQgfX07CisgICAgYm9vbCBpc1NpZ25lZCA9IE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6U01VTE87CisgICAgaWYgKFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oT3BzW2lzU2lnbmVkXVswXSwgVlQpKSB7CisgICAgICBCb3R0b21IYWxmID0gREFHLmdldE5vZGUoSVNEOjpNVUwsIGRsLCBWVCwgTEhTLCBSSFMpOworICAgICAgVG9wSGFsZiA9IERBRy5nZXROb2RlKE9wc1tpc1NpZ25lZF1bMF0sIGRsLCBWVCwgTEhTLCBSSFMpOworICAgIH0gZWxzZSBpZiAoVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShPcHNbaXNTaWduZWRdWzFdLCBWVCkpIHsKKyAgICAgIEJvdHRvbUhhbGYgPSBEQUcuZ2V0Tm9kZShPcHNbaXNTaWduZWRdWzFdLCBkbCwgREFHLmdldFZUTGlzdChWVCwgVlQpLCBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTKTsKKyAgICAgIFRvcEhhbGYgPSBCb3R0b21IYWxmLmdldFZhbHVlKDEpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUgdG8gZmFsbCBiYWNrIHRvIGEgbGliY2FsbCB3aXRoIGFuIGlsbGVnYWwKKyAgICAgIC8vIHR5cGUgaW4gc29tZSBjYXNlcy4KKyAgICAgIC8vIEFsc28sIHdlIGNhbiBmYWxsIGJhY2sgdG8gYSBkaXZpc2lvbiBpbiBzb21lIGNhc2VzLCBidXQgdGhhdCdzIGEgYmlnCisgICAgICAvLyBwZXJmb3JtYW5jZSBoaXQgaW4gdGhlIGdlbmVyYWwgY2FzZS4KKyAgICAgIGFzc2VydChUTEkuaXNUeXBlTGVnYWwoRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULmdldFNpemVJbkJpdHMoKSAqIDIpKSAmJgorICAgICAgICAgICAgICJEb24ndCBrbm93IGhvdyB0byBleHBhbmQgdGhpcyBvcGVyYXRpb24geWV0ISIpOworICAgICAgRVZUIFdpZGVWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBWVC5nZXRTaXplSW5CaXRzKCkgKiAyKTsKKyAgICAgIExIUyA9IERBRy5nZXROb2RlKE9wc1tpc1NpZ25lZF1bMl0sIGRsLCBXaWRlVlQsIExIUyk7CisgICAgICBSSFMgPSBEQUcuZ2V0Tm9kZShPcHNbaXNTaWduZWRdWzJdLCBkbCwgV2lkZVZULCBSSFMpOworICAgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6TVVMLCBkbCwgV2lkZVZULCBMSFMsIFJIUyk7CisgICAgICBCb3R0b21IYWxmID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBWVCwgVG1wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICAgICAgVG9wSGFsZiA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgVlQsIFRtcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDEpKTsKKyAgICB9CisgICAgaWYgKGlzU2lnbmVkKSB7CisgICAgICBUbXAxID0gREFHLmdldENvbnN0YW50KFZULmdldFNpemVJbkJpdHMoKSAtIDEsIFRMSS5nZXRTaGlmdEFtb3VudFR5KCkpOworICAgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgVlQsIEJvdHRvbUhhbGYsIFRtcDEpOworICAgICAgVG9wSGFsZiA9IERBRy5nZXRTZXRDQyhkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShWVCksIFRvcEhhbGYsIFRtcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUTkUpOworICAgIH0gZWxzZSB7CisgICAgICBUb3BIYWxmID0gREFHLmdldFNldENDKGRsLCBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKFZUKSwgVG9wSGFsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIFZUKSwgSVNEOjpTRVRORSk7CisgICAgfQorICAgIFJlc3VsdHMucHVzaF9iYWNrKEJvdHRvbUhhbGYpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRvcEhhbGYpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpCVUlMRF9QQUlSOiB7CisgICAgRVZUIFBhaXJUeSA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZGwsIFBhaXJUeSwgTm9kZS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgVG1wMiA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIFBhaXJUeSwgTm9kZS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgVG1wMiA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgUGFpclR5LCBUbXAyLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoUGFpclR5LmdldFNpemVJbkJpdHMoKS8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFNoaWZ0QW1vdW50VHkoKSkpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBQYWlyVHksIFRtcDEsIFRtcDIpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6U0VMRUNUOgorICAgIFRtcDEgPSBOb2RlLT5nZXRPcGVyYW5kKDApOworICAgIFRtcDIgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworICAgIFRtcDMgPSBOb2RlLT5nZXRPcGVyYW5kKDIpOworICAgIGlmIChUbXAxLmdldE9wY29kZSgpID09IElTRDo6U0VUQ0MpIHsKKyAgICAgIFRtcDEgPSBEQUcuZ2V0U2VsZWN0Q0MoZGwsIFRtcDEuZ2V0T3BlcmFuZCgwKSwgVG1wMS5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbXAyLCBUbXAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbmRDb2RlU0ROb2RlPihUbXAxLmdldE9wZXJhbmQoMikpLT5nZXQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFRtcDEgPSBEQUcuZ2V0U2VsZWN0Q0MoZGwsIFRtcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBUbXAxLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wMiwgVG1wMywgSVNEOjpTRVRORSk7CisgICAgfQorICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6QlJfSlQ6IHsKKyAgICBTRFZhbHVlIENoYWluID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIFRhYmxlID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBTRFZhbHVlIEluZGV4ID0gTm9kZS0+Z2V0T3BlcmFuZCgyKTsKKworICAgIEVWVCBQVHkgPSBUTEkuZ2V0UG9pbnRlclR5KCk7CisKKyAgICBjb25zdCBUYXJnZXREYXRhICZURCA9ICpUTEkuZ2V0VGFyZ2V0RGF0YSgpOworICAgIHVuc2lnbmVkIEVudHJ5U2l6ZSA9CisgICAgICBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0SnVtcFRhYmxlSW5mbygpLT5nZXRFbnRyeVNpemUoVEQpOworCisgICAgSW5kZXggPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZGwsIFBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4LCBEQUcuZ2V0Q29uc3RhbnQoRW50cnlTaXplLCBQVHkpKTsKKyAgICBTRFZhbHVlIEFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFBUeSwgSW5kZXgsIFRhYmxlKTsKKworICAgIEVWVCBNZW1WVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBFbnRyeVNpemUgKiA4KTsKKyAgICBTRFZhbHVlIExEID0gREFHLmdldEV4dExvYWQoSVNEOjpTRVhUTE9BRCwgUFR5LCBkbCwgQ2hhaW4sIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRKdW1wVGFibGUoKSwgMCwgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgQWRkciA9IExEOworICAgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6UElDXykgeworICAgICAgLy8gRm9yIFBJQywgdGhlIHNlcXVlbmNlIGlzOgorICAgICAgLy8gQlJJTkQobG9hZChKdW1wdGFibGUgKyBpbmRleCkgKyBSZWxvY0Jhc2UpCisgICAgICAvLyBSZWxvY0Jhc2UgY2FuIGJlIEp1bXBUYWJsZSwgR09UIG9yIHNvbWUgc29ydCBvZiBnbG9iYWwgYmFzZS4KKyAgICAgIEFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFBUeSwgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZShUYWJsZSwgREFHKSk7CisgICAgfQorICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJSSU5ELCBkbCwgTVZUOjpPdGhlciwgTEQuZ2V0VmFsdWUoMSksIEFkZHIpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpCUkNPTkQ6CisgICAgLy8gRXhwYW5kIGJyY29uZCdzIHNldGNjIGludG8gaXRzIGNvbnN0aXR1ZW50IHBhcnRzIGFuZCBjcmVhdGUgYSBCUl9DQworICAgIC8vIE5vZGUuCisgICAgVG1wMSA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgICAgVG1wMiA9IE5vZGUtPmdldE9wZXJhbmQoMSk7CisgICAgaWYgKFRtcDIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQykgeworICAgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6QlJfQ0MsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRtcDEsIFRtcDIuZ2V0T3BlcmFuZCgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUbXAyLmdldE9wZXJhbmQoMCksIFRtcDIuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDIpKTsKKyAgICB9IGVsc2UgeworICAgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6QlJfQ0MsIGRsLCBNVlQ6Ok90aGVyLCBUbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25kQ29kZShJU0Q6OlNFVE5FKSwgVG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgVG1wMi5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0T3BlcmFuZCgyKSk7CisgICAgfQorICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUQ0M6IHsKKyAgICBUbXAxID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBUbXAyID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBUbXAzID0gTm9kZS0+Z2V0T3BlcmFuZCgyKTsKKyAgICBMZWdhbGl6ZVNldENDQ29uZENvZGUoTm9kZS0+Z2V0VmFsdWVUeXBlKDApLCBUbXAxLCBUbXAyLCBUbXAzLCBkbCk7CisKKyAgICAvLyBJZiB3ZSBleHBhbmRlZCB0aGUgU0VUQ0MgaW50byBhbiBBTkQvT1IsIHJldHVybiB0aGUgbmV3IG5vZGUKKyAgICBpZiAoVG1wMi5nZXROb2RlKCkgPT0gMCkgeworICAgICAgUmVzdWx0cy5wdXNoX2JhY2soVG1wMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIFNFVENDIGZvciB0aGUgZ2l2ZW4gY29tcGFyaXNvbiB0eXBlIG11c3QgYmUgY29tcGxldGVseQorICAgIC8vIGlsbGVnYWw7IGV4cGFuZCBpdCBpbnRvIGEgU0VMRUNUX0NDLgorICAgIEVWVCBWVCA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1RfQ0MsIGRsLCBWVCwgVG1wMSwgVG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIFZUKSwgREFHLmdldENvbnN0YW50KDAsIFZUKSwgVG1wMyk7CisgICAgUmVzdWx0cy5wdXNoX2JhY2soVG1wMSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzogeworICAgIFRtcDEgPSBOb2RlLT5nZXRPcGVyYW5kKDApOyAgIC8vIExIUworICAgIFRtcDIgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOyAgIC8vIFJIUworICAgIFRtcDMgPSBOb2RlLT5nZXRPcGVyYW5kKDIpOyAgIC8vIFRydWUKKyAgICBUbXA0ID0gTm9kZS0+Z2V0T3BlcmFuZCgzKTsgICAvLyBGYWxzZQorICAgIFNEVmFsdWUgQ0MgPSBOb2RlLT5nZXRPcGVyYW5kKDQpOworCisgICAgTGVnYWxpemVTZXRDQ0NvbmRDb2RlKFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoVG1wMS5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRtcDEsIFRtcDIsIENDLCBkbCk7CisKKyAgICBhc3NlcnQoIVRtcDIuZ2V0Tm9kZSgpICYmICJDYW4ndCBsZWdhbGl6ZSBTRUxFQ1RfQ0Mgd2l0aCBsZWdhbCBjb25kaXRpb24hIik7CisgICAgVG1wMiA9IERBRy5nZXRDb25zdGFudCgwLCBUbXAxLmdldFZhbHVlVHlwZSgpKTsKKyAgICBDQyA9IERBRy5nZXRDb25kQ29kZShJU0Q6OlNFVE5FKTsKKyAgICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1RfQ0MsIGRsLCBOb2RlLT5nZXRWYWx1ZVR5cGUoMCksIFRtcDEsIFRtcDIsCisgICAgICAgICAgICAgICAgICAgICAgIFRtcDMsIFRtcDQsIENDKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6QlJfQ0M6IHsKKyAgICBUbXAxID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsgICAgICAgICAgICAgIC8vIENoYWluCisgICAgVG1wMiA9IE5vZGUtPmdldE9wZXJhbmQoMik7ICAgICAgICAgICAgICAvLyBMSFMKKyAgICBUbXAzID0gTm9kZS0+Z2V0T3BlcmFuZCgzKTsgICAgICAgICAgICAgIC8vIFJIUworICAgIFRtcDQgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOyAgICAgICAgICAgICAgLy8gQ0MKKworICAgIExlZ2FsaXplU2V0Q0NDb25kQ29kZShUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKFRtcDIuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUbXAyLCBUbXAzLCBUbXA0LCBkbCk7CisgICAgTGFzdENBTExTRVFfRU5EID0gREFHLmdldEVudHJ5Tm9kZSgpOworCisgICAgYXNzZXJ0KCFUbXAzLmdldE5vZGUoKSAmJiAiQ2FuJ3QgbGVnYWxpemUgQlJfQ0Mgd2l0aCBsZWdhbCBjb25kaXRpb24hIik7CisgICAgVG1wMyA9IERBRy5nZXRDb25zdGFudCgwLCBUbXAyLmdldFZhbHVlVHlwZSgpKTsKKyAgICBUbXA0ID0gREFHLmdldENvbmRDb2RlKElTRDo6U0VUTkUpOworICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJSX0NDLCBkbCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLCBUbXAxLCBUbXA0LCBUbXAyLAorICAgICAgICAgICAgICAgICAgICAgICBUbXAzLCBOb2RlLT5nZXRPcGVyYW5kKDQpKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6R0xPQkFMX09GRlNFVF9UQUJMRToKKyAgY2FzZSBJU0Q6Okdsb2JhbEFkZHJlc3M6CisgIGNhc2UgSVNEOjpHbG9iYWxUTFNBZGRyZXNzOgorICBjYXNlIElTRDo6RXh0ZXJuYWxTeW1ib2w6CisgIGNhc2UgSVNEOjpDb25zdGFudFBvb2w6CisgIGNhc2UgSVNEOjpKdW1wVGFibGU6CisgIGNhc2UgSVNEOjpJTlRSSU5TSUNfV19DSEFJTjoKKyAgY2FzZSBJU0Q6OklOVFJJTlNJQ19XT19DSEFJTjoKKyAgY2FzZSBJU0Q6OklOVFJJTlNJQ19WT0lEOgorICAgIC8vIEZJWE1FOiBDdXN0b20gbG93ZXJpbmcgZm9yIHRoZXNlIG9wZXJhdGlvbnMgc2hvdWxkbid0IHJldHVybiBudWxsIQorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOb2RlLT5nZXROdW1WYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBSZXN1bHRzLnB1c2hfYmFjayhTRFZhbHVlKE5vZGUsIGkpKTsKKyAgICBicmVhazsKKyAgfQorfQordm9pZCBTZWxlY3Rpb25EQUdMZWdhbGl6ZTo6UHJvbW90ZU5vZGUoU0ROb2RlICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZXN1bHRzKSB7CisgIEVWVCBPVlQgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMCk7CisgIGlmIChOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVJTlRfVE9fRlAgfHwKKyAgICAgIE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6U0lOVF9UT19GUCB8fAorICAgICAgTm9kZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQykgeworICAgIE9WVCA9IE5vZGUtPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgIH0KKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9Qcm9tb3RlVG8oTm9kZS0+Z2V0T3Bjb2RlKCksIE9WVCk7CisgIERlYnVnTG9jIGRsID0gTm9kZS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBUbXAxLCBUbXAyLCBUbXAzOworICBzd2l0Y2ggKE5vZGUtPmdldE9wY29kZSgpKSB7CisgIGNhc2UgSVNEOjpDVFRaOgorICBjYXNlIElTRDo6Q1RMWjoKKyAgY2FzZSBJU0Q6OkNUUE9QOgorICAgIC8vIFplcm8gZXh0ZW5kIHRoZSBhcmd1bWVudC4KKyAgICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZGwsIE5WVCwgTm9kZS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgLy8gUGVyZm9ybSB0aGUgbGFyZ2VyIG9wZXJhdGlvbi4KKyAgICBUbXAxID0gREFHLmdldE5vZGUoTm9kZS0+Z2V0T3Bjb2RlKCksIGRsLCBOVlQsIFRtcDEpOworICAgIGlmIChOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNUVFopIHsKKyAgICAgIC8vaWYgVG1wMSA9PSBzaXplaW5iaXRzKE5WVCkgdGhlbiBUbXAxID0gc2l6ZWluYml0cyhPbGQgVlQpCisgICAgICBUbXAyID0gREFHLmdldFNldENDKGRsLCBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKE5WVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRtcDEsIERBRy5nZXRDb25zdGFudChOVlQuZ2V0U2l6ZUluQml0cygpLCBOVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OlNFVEVRKTsKKyAgICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIE5WVCwgVG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE9WVC5nZXRTaXplSW5CaXRzKCksIE5WVCksIFRtcDEpOworICAgIH0gZWxzZSBpZiAoTm9kZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDVExaKSB7CisgICAgICAvLyBUbXAxID0gVG1wMSAtIChzaXplaW5iaXRzKE5WVCkgLSBzaXplaW5iaXRzKE9sZCBWVCkpCisgICAgICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBOVlQsIFRtcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOVlQuZ2V0U2l6ZUluQml0cygpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9WVC5nZXRTaXplSW5CaXRzKCksIE5WVCkpOworICAgIH0KKyAgICBSZXN1bHRzLnB1c2hfYmFjayhEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgT1ZULCBUbXAxKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpCU1dBUDogeworICAgIHVuc2lnbmVkIERpZmZCaXRzID0gTlZULmdldFNpemVJbkJpdHMoKSAtIE9WVC5nZXRTaXplSW5CaXRzKCk7CisgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBOVlQsIE5vZGUtPmdldE9wZXJhbmQoMCkpOworICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJTV0FQLCBkbCwgTlZULCBUbXAxKTsKKyAgICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBOVlQsIFRtcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChEaWZmQml0cywgVExJLmdldFNoaWZ0QW1vdW50VHkoKSkpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpGUF9UT19VSU5UOgorICBjYXNlIElTRDo6RlBfVE9fU0lOVDoKKyAgICBUbXAxID0gUHJvbW90ZUxlZ2FsRlBfVE9fSU5UKE5vZGUtPmdldE9wZXJhbmQoMCksIE5vZGUtPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6RlBfVE9fU0lOVCwgZGwpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6VUlOVF9UT19GUDoKKyAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6CisgICAgVG1wMSA9IFByb21vdGVMZWdhbElOVF9UT19GUChOb2RlLT5nZXRPcGVyYW5kKDApLCBOb2RlLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNJTlRfVE9fRlAsIGRsKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhUbXAxKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkFORDoKKyAgY2FzZSBJU0Q6Ok9SOgorICBjYXNlIElTRDo6WE9SOiB7CisgICAgdW5zaWduZWQgRXh0T3AsIFRydW5jT3A7CisgICAgaWYgKE9WVC5pc1ZlY3RvcigpKSB7CisgICAgICBFeHRPcCAgID0gSVNEOjpCSVRfQ09OVkVSVDsKKyAgICAgIFRydW5jT3AgPSBJU0Q6OkJJVF9DT05WRVJUOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoT1ZULmlzSW50ZWdlcigpICYmICJDYW5ub3QgcHJvbW90ZSBsb2dpYyBvcGVyYXRpb24iKTsKKyAgICAgIEV4dE9wICAgPSBJU0Q6OkFOWV9FWFRFTkQ7CisgICAgICBUcnVuY09wID0gSVNEOjpUUlVOQ0FURTsKKyAgICB9CisgICAgLy8gUHJvbW90ZSBlYWNoIG9mIHRoZSB2YWx1ZXMgdG8gdGhlIG5ldyB0eXBlLgorICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShFeHRPcCwgZGwsIE5WVCwgTm9kZS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgVG1wMiA9IERBRy5nZXROb2RlKEV4dE9wLCBkbCwgTlZULCBOb2RlLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAvLyBQZXJmb3JtIHRoZSBsYXJnZXIgb3BlcmF0aW9uLCB0aGVuIGNvbnZlcnQgYmFjaworICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShOb2RlLT5nZXRPcGNvZGUoKSwgZGwsIE5WVCwgVG1wMSwgVG1wMik7CisgICAgUmVzdWx0cy5wdXNoX2JhY2soREFHLmdldE5vZGUoVHJ1bmNPcCwgZGwsIE9WVCwgVG1wMSkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTRUxFQ1Q6IHsKKyAgICB1bnNpZ25lZCBFeHRPcCwgVHJ1bmNPcDsKKyAgICBpZiAoTm9kZS0+Z2V0VmFsdWVUeXBlKDApLmlzVmVjdG9yKCkpIHsKKyAgICAgIEV4dE9wICAgPSBJU0Q6OkJJVF9DT05WRVJUOworICAgICAgVHJ1bmNPcCA9IElTRDo6QklUX0NPTlZFUlQ7CisgICAgfSBlbHNlIGlmIChOb2RlLT5nZXRWYWx1ZVR5cGUoMCkuaXNJbnRlZ2VyKCkpIHsKKyAgICAgIEV4dE9wICAgPSBJU0Q6OkFOWV9FWFRFTkQ7CisgICAgICBUcnVuY09wID0gSVNEOjpUUlVOQ0FURTsKKyAgICB9IGVsc2UgeworICAgICAgRXh0T3AgICA9IElTRDo6RlBfRVhURU5EOworICAgICAgVHJ1bmNPcCA9IElTRDo6RlBfUk9VTkQ7CisgICAgfQorICAgIFRtcDEgPSBOb2RlLT5nZXRPcGVyYW5kKDApOworICAgIC8vIFByb21vdGUgZWFjaCBvZiB0aGUgdmFsdWVzIHRvIHRoZSBuZXcgdHlwZS4KKyAgICBUbXAyID0gREFHLmdldE5vZGUoRXh0T3AsIGRsLCBOVlQsIE5vZGUtPmdldE9wZXJhbmQoMSkpOworICAgIFRtcDMgPSBEQUcuZ2V0Tm9kZShFeHRPcCwgZGwsIE5WVCwgTm9kZS0+Z2V0T3BlcmFuZCgyKSk7CisgICAgLy8gUGVyZm9ybSB0aGUgbGFyZ2VyIG9wZXJhdGlvbiwgdGhlbiByb3VuZCBkb3duLgorICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIE5WVCwgVG1wMSwgVG1wMiwgVG1wMyk7CisgICAgaWYgKFRydW5jT3AgIT0gSVNEOjpGUF9ST1VORCkKKyAgICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShUcnVuY09wLCBkbCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLCBUbXAxKTsKKyAgICBlbHNlCisgICAgICBUbXAxID0gREFHLmdldE5vZGUoVHJ1bmNPcCwgZGwsIE5vZGUtPmdldFZhbHVlVHlwZSgwKSwgVG1wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKFRtcDEpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpWRUNUT1JfU0hVRkZMRTogeworICAgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFzazsKKyAgICBjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE5vZGUpLT5nZXRNYXNrKE1hc2spOworCisgICAgLy8gQ2FzdCB0aGUgdHdvIGlucHV0IHZlY3RvcnMuCisgICAgVG1wMSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBOVlQsIE5vZGUtPmdldE9wZXJhbmQoMCkpOworICAgIFRtcDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTlZULCBOb2RlLT5nZXRPcGVyYW5kKDEpKTsKKworICAgIC8vIENvbnZlcnQgdGhlIHNodWZmbGUgbWFzayB0byB0aGUgcmlnaHQgIyBlbGVtZW50cy4KKyAgICBUbXAxID0gU2h1ZmZsZVdpdGhOYXJyb3dlckVsdFR5cGUoTlZULCBPVlQsIGRsLCBUbXAxLCBUbXAyLCBNYXNrKTsKKyAgICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE9WVCwgVG1wMSk7CisgICAgUmVzdWx0cy5wdXNoX2JhY2soVG1wMSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlNFVENDOiB7CisgICAgdW5zaWduZWQgRXh0T3AgPSBJU0Q6OkZQX0VYVEVORDsKKyAgICBpZiAoTlZULmlzSW50ZWdlcigpKSB7CisgICAgICBJU0Q6OkNvbmRDb2RlIENDQ29kZSA9CisgICAgICAgIGNhc3Q8Q29uZENvZGVTRE5vZGU+KE5vZGUtPmdldE9wZXJhbmQoMikpLT5nZXQoKTsKKyAgICAgIEV4dE9wID0gaXNTaWduZWRJbnRTZXRDQyhDQ0NvZGUpID8gSVNEOjpTSUdOX0VYVEVORCA6IElTRDo6WkVST19FWFRFTkQ7CisgICAgfQorICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShFeHRPcCwgZGwsIE5WVCwgTm9kZS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgVG1wMiA9IERBRy5nZXROb2RlKEV4dE9wLCBkbCwgTlZULCBOb2RlLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhEQUcuZ2V0Tm9kZShJU0Q6OlNFVENDLCBkbCwgTm9kZS0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRtcDEsIFRtcDIsIE5vZGUtPmdldE9wZXJhbmQoMikpKTsKKyAgICBicmVhazsKKyAgfQorICB9Cit9CisKKy8vIFNlbGVjdGlvbkRBRzo6TGVnYWxpemUgLSBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGZpbGUuCisvLwordm9pZCBTZWxlY3Rpb25EQUc6OkxlZ2FsaXplKENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIC8vLyBydW4gLSBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IHRvIHRoaXMgY2xhc3MuCisgIC8vLworICBTZWxlY3Rpb25EQUdMZWdhbGl6ZSgqdGhpcywgT3B0TGV2ZWwpLkxlZ2FsaXplREFHKCk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9MZWdhbGl6ZUZsb2F0VHlwZXMuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplRmxvYXRUeXBlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwZWU1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9MZWdhbGl6ZUZsb2F0VHlwZXMuY3BwCkBAIC0wLDAgKzEsMTQyNyBAQAorLy89PT0tLS0tLS0tLSBMZWdhbGl6ZUZsb2F0VHlwZXMuY3BwIC0gTGVnYWxpemF0aW9uIG9mIGZsb2F0IHR5cGVzIC0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBmbG9hdCB0eXBlIGV4cGFuc2lvbiBhbmQgc29mdGVuaW5nIGZvciBMZWdhbGl6ZVR5cGVzLgorLy8gU29mdGVuaW5nIGlzIHRoZSBhY3Qgb2YgdHVybmluZyBhIGNvbXB1dGF0aW9uIGluIGFuIGlsbGVnYWwgZmxvYXRpbmcgcG9pbnQKKy8vIHR5cGUgaW50byBhIGNvbXB1dGF0aW9uIGluIGFuIGludGVnZXIgdHlwZSBvZiB0aGUgc2FtZSBzaXplOyBhbHNvIGtub3duIGFzCisvLyAic29mdCBmbG9hdCIuICBGb3IgZXhhbXBsZSwgdHVybmluZyBmMzIgYXJpdGhtZXRpYyBpbnRvIG9wZXJhdGlvbnMgdXNpbmcgaTMyLgorLy8gVGhlIHJlc3VsdGluZyBpbnRlZ2VyIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHdoYXQgeW91IHdvdWxkIGdldCBieSBwZXJmb3JtaW5nCisvLyB0aGUgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uIGFuZCBiaXRjYXN0aW5nIHRoZSByZXN1bHQgdG8gdGhlIGludGVnZXIgdHlwZS4KKy8vIEV4cGFuc2lvbiBpcyB0aGUgYWN0IG9mIGNoYW5naW5nIGEgY29tcHV0YXRpb24gaW4gYW4gaWxsZWdhbCB0eXBlIHRvIGJlIGEKKy8vIGNvbXB1dGF0aW9uIGluIHR3byBpZGVudGljYWwgcmVnaXN0ZXJzIG9mIGEgc21hbGxlciB0eXBlLiAgRm9yIGV4YW1wbGUsCisvLyBpbXBsZW1lbnRpbmcgcHBjZjEyOCBhcml0aG1ldGljIGluIHR3byBmNjQgcmVnaXN0ZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJMZWdhbGl6ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gR2V0RlBMaWJDYWxsIC0gUmV0dXJuIHRoZSByaWdodCBsaWJjYWxsIGZvciB0aGUgZ2l2ZW4gZmxvYXRpbmcgcG9pbnQgdHlwZS4KK3N0YXRpYyBSVExJQjo6TGliY2FsbCBHZXRGUExpYkNhbGwoRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TGliY2FsbCBDYWxsX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxpYmNhbGwgQ2FsbF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMaWJjYWxsIENhbGxfRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TGliY2FsbCBDYWxsX1BQQ0YxMjgpIHsKKyAgcmV0dXJuCisgICAgVlQgPT0gTVZUOjpmMzIgPyBDYWxsX0YzMiA6CisgICAgVlQgPT0gTVZUOjpmNjQgPyBDYWxsX0Y2NCA6CisgICAgVlQgPT0gTVZUOjpmODAgPyBDYWxsX0Y4MCA6CisgICAgVlQgPT0gTVZUOjpwcGNmMTI4ID8gQ2FsbF9QUENGMTI4IDoKKyAgICBSVExJQjo6VU5LTk9XTl9MSUJDQUxMOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFJlc3VsdCBGbG9hdCB0byBJbnRlZ2VyIENvbnZlcnNpb24uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzdWx0KFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTm8pIHsKKyAgREVCVUcoZGJncygpIDw8ICJTb2Z0ZW4gZmxvYXQgcmVzdWx0ICIgPDwgUmVzTm8gPDwgIjogIjsgTi0+ZHVtcCgmREFHKTsKKyAgICAgICAgZGJncygpIDw8ICJcbiIpOworICBTRFZhbHVlIFIgPSBTRFZhbHVlKCk7CisKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorI2lmbmRlZiBOREVCVUcKKyAgICBkYmdzKCkgPDwgIlNvZnRlbkZsb2F0UmVzdWx0ICMiIDw8IFJlc05vIDw8ICI6ICI7CisgICAgTi0+ZHVtcCgmREFHKTsgZGJncygpIDw8ICJcbiI7CisjZW5kaWYKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJEbyBub3Qga25vdyBob3cgdG8gc29mdGVuIHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRvciEiKTsKKworICAgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDogUiA9IFNvZnRlbkZsb2F0UmVzX0JJVF9DT05WRVJUKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6QlVJTERfUEFJUjogIFIgPSBTb2Z0ZW5GbG9hdFJlc19CVUlMRF9QQUlSKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6Q29uc3RhbnRGUDoKKyAgICAgIFIgPSBTb2Z0ZW5GbG9hdFJlc19Db25zdGFudEZQKGNhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVDoKKyAgICAgIFIgPSBTb2Z0ZW5GbG9hdFJlc19FWFRSQUNUX1ZFQ1RPUl9FTFQoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGQUJTOiAgICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZBQlMoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGQUREOiAgICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZBREQoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGQ0VJTDogICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZDRUlMKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6RkNPUFlTSUdOOiAgIFIgPSBTb2Z0ZW5GbG9hdFJlc19GQ09QWVNJR04oTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGQ09TOiAgICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZDT1MoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGRElWOiAgICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZESVYoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGRVhQOiAgICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZFWFAoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGRVhQMjogICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZFWFAyKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6RkZMT09SOiAgICAgIFIgPSBTb2Z0ZW5GbG9hdFJlc19GRkxPT1IoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGTE9HOiAgICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZMT0coTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGTE9HMjogICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZMT0cyKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6RkxPRzEwOiAgICAgIFIgPSBTb2Z0ZW5GbG9hdFJlc19GTE9HMTAoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGTVVMOiAgICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZNVUwoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGTkVBUkJZSU5UOiAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZORUFSQllJTlQoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGTkVHOiAgICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZORUcoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGUF9FWFRFTkQ6ICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZQX0VYVEVORChOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkZQX1JPVU5EOiAgICBSID0gU29mdGVuRmxvYXRSZXNfRlBfUk9VTkQoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGUDE2X1RPX0ZQMzI6UiA9IFNvZnRlbkZsb2F0UmVzX0ZQMTZfVE9fRlAzMihOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkZQT1c6ICAgICAgICBSID0gU29mdGVuRmxvYXRSZXNfRlBPVyhOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkZQT1dJOiAgICAgICBSID0gU29mdGVuRmxvYXRSZXNfRlBPV0koTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGUkVNOiAgICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZSRU0oTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpGUklOVDogICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX0ZSSU5UKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6RlNJTjogICAgICAgIFIgPSBTb2Z0ZW5GbG9hdFJlc19GU0lOKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6RlNRUlQ6ICAgICAgIFIgPSBTb2Z0ZW5GbG9hdFJlc19GU1FSVChOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkZTVUI6ICAgICAgICBSID0gU29mdGVuRmxvYXRSZXNfRlNVQihOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkZUUlVOQzogICAgICBSID0gU29mdGVuRmxvYXRSZXNfRlRSVU5DKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6TE9BRDogICAgICAgIFIgPSBTb2Z0ZW5GbG9hdFJlc19MT0FEKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VMRUNUOiAgICAgIFIgPSBTb2Z0ZW5GbG9hdFJlc19TRUxFQ1QoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6ICAgUiA9IFNvZnRlbkZsb2F0UmVzX1NFTEVDVF9DQyhOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6CisgICAgY2FzZSBJU0Q6OlVJTlRfVE9fRlA6ICBSID0gU29mdGVuRmxvYXRSZXNfWElOVF9UT19GUChOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlVOREVGOiAgICAgICBSID0gU29mdGVuRmxvYXRSZXNfVU5ERUYoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpWQUFSRzogICAgICAgUiA9IFNvZnRlbkZsb2F0UmVzX1ZBQVJHKE4pOyBicmVhazsKKyAgfQorCisgIC8vIElmIFIgaXMgbnVsbCwgdGhlIHN1Yi1tZXRob2QgdG9vayBjYXJlIG9mIHJlZ2lzdGVyaW5nIHRoZSByZXN1bHQuCisgIGlmIChSLmdldE5vZGUoKSkKKyAgICBTZXRTb2Z0ZW5lZEZsb2F0KFNEVmFsdWUoTiwgUmVzTm8pLCBSKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19CSVRfQ09OVkVSVChTRE5vZGUgKk4pIHsKKyAgcmV0dXJuIEJpdENvbnZlcnRUb0ludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfQlVJTERfUEFJUihTRE5vZGUgKk4pIHsKKyAgLy8gQ29udmVydCB0aGUgaW5wdXRzIHRvIGludGVnZXJzLCBhbmQgYnVpbGQgYSBuZXcgcGFpciBvdXQgb2YgdGhlbS4KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfUEFJUiwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRWYWx1ZVR5cGUoMCkpLAorICAgICAgICAgICAgICAgICAgICAgQml0Q29udmVydFRvSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApKSwKKyAgICAgICAgICAgICAgICAgICAgIEJpdENvbnZlcnRUb0ludGVnZXIoTi0+Z2V0T3BlcmFuZCgxKSkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX0NvbnN0YW50RlAoQ29uc3RhbnRGUFNETm9kZSAqTikgeworICByZXR1cm4gREFHLmdldENvbnN0YW50KE4tPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKSkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX0VYVFJBQ1RfVkVDVE9SX0VMVChTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOZXdPcCA9IEJpdENvbnZlcnRWZWN0b3JUb0ludGVnZXJWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIE5ld09wLmdldFZhbHVlVHlwZSgpLmdldFZlY3RvckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICBOZXdPcCwgTi0+Z2V0T3BlcmFuZCgxKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRkFCUyhTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgdW5zaWduZWQgU2l6ZSA9IE5WVC5nZXRTaXplSW5CaXRzKCk7CisKKyAgLy8gTWFzayA9IH4oMSA8PCAoU2l6ZS0xKSkKKyAgU0RWYWx1ZSBNYXNrID0gREFHLmdldENvbnN0YW50KEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoU2l6ZSkuY2xlYXIoU2l6ZS0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WVCk7CisgIFNEVmFsdWUgT3AgPSBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTkQsIE4tPmdldERlYnVnTG9jKCksIE5WVCwgT3AsIE1hc2spOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX0ZBREQoU0ROb2RlICpOKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgT3BzWzJdID0geyBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDEpKSB9OworICByZXR1cm4gTWFrZUxpYkNhbGwoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6QUREX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6QUREX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6QUREX0Y4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6QUREX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgTlZULCBPcHMsIDIsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19GQ0VJTChTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgU0RWYWx1ZSBPcCA9IEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBNYWtlTGliQ2FsbChHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpDRUlMX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6Q0VJTF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkNFSUxfRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpDRUlMX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgTlZULCAmT3AsIDEsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19GQ09QWVNJR04oU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTEhTID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKTsKKyAgU0RWYWx1ZSBSSFMgPSBCaXRDb252ZXJ0VG9JbnRlZ2VyKE4tPmdldE9wZXJhbmQoMSkpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgRVZUIExWVCA9IExIUy5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIFJWVCA9IFJIUy5nZXRWYWx1ZVR5cGUoKTsKKworICB1bnNpZ25lZCBMU2l6ZSA9IExWVC5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIFJTaXplID0gUlZULmdldFNpemVJbkJpdHMoKTsKKworICAvLyBGaXJzdCBnZXQgdGhlIHNpZ24gYml0IG9mIHNlY29uZCBvcGVyYW5kLgorICBTRFZhbHVlIFNpZ25CaXQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIFJWVCwgREFHLmdldENvbnN0YW50KDEsIFJWVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFJTaXplIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFNoaWZ0QW1vdW50VHkoKSkpOworICBTaWduQml0ID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBSVlQsIFJIUywgU2lnbkJpdCk7CisKKyAgLy8gU2hpZnQgcmlnaHQgb3Igc2lnbi1leHRlbmQgaXQgaWYgdGhlIHR3byBvcGVyYW5kcyBoYXZlIGRpZmZlcmVudCB0eXBlcy4KKyAgaW50IFNpemVEaWZmID0gUlZULmdldFNpemVJbkJpdHMoKSAtIExWVC5nZXRTaXplSW5CaXRzKCk7CisgIGlmIChTaXplRGlmZiA+IDApIHsKKyAgICBTaWduQml0ID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBSVlQsIFNpZ25CaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChTaXplRGlmZiwgVExJLmdldFNoaWZ0QW1vdW50VHkoKSkpOworICAgIFNpZ25CaXQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTFZULCBTaWduQml0KTsKKyAgfSBlbHNlIGlmIChTaXplRGlmZiA8IDApIHsKKyAgICBTaWduQml0ID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwgTFZULCBTaWduQml0KTsKKyAgICBTaWduQml0ID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBMVlQsIFNpZ25CaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgtU2l6ZURpZmYsIFRMSS5nZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgfQorCisgIC8vIENsZWFyIHRoZSBzaWduIGJpdCBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4KKyAgU0RWYWx1ZSBNYXNrID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBMVlQsIERBRy5nZXRDb25zdGFudCgxLCBMVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChMU2l6ZSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgTWFzayA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwgTFZULCBNYXNrLCBEQUcuZ2V0Q29uc3RhbnQoMSwgTFZUKSk7CisgIExIUyA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTFZULCBMSFMsIE1hc2spOworCisgIC8vIE9yIHRoZSB2YWx1ZSB3aXRoIHRoZSBzaWduIGJpdC4KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBMVlQsIExIUywgU2lnbkJpdCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRkNPUyhTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgU0RWYWx1ZSBPcCA9IEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBNYWtlTGliQ2FsbChHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpDT1NfRjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpDT1NfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpDT1NfRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpDT1NfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICBOVlQsICZPcCwgMSwgZmFsc2UsIE4tPmdldERlYnVnTG9jKCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX0ZESVYoU0ROb2RlICpOKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgT3BzWzJdID0geyBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDEpKSB9OworICByZXR1cm4gTWFrZUxpYkNhbGwoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RElWX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RElWX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RElWX0Y4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RElWX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgTlZULCBPcHMsIDIsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19GRVhQKFNETm9kZSAqTikgeworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkVYUF9GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkVYUF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkVYUF9GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkVYUF9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgIE5WVCwgJk9wLCAxLCBmYWxzZSwgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRkVYUDIoU0ROb2RlICpOKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgT3AgPSBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gTWFrZUxpYkNhbGwoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RVhQMl9GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkVYUDJfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpFWFAyX0Y4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RVhQMl9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgIE5WVCwgJk9wLCAxLCBmYWxzZSwgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRkZMT09SKFNETm9kZSAqTikgeworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkZMT09SX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RkxPT1JfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpGTE9PUl9GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkZMT09SX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgTlZULCAmT3AsIDEsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19GTE9HKFNETm9kZSAqTikgeworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPR19GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPR19GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPR19GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPR19QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgIE5WVCwgJk9wLCAxLCBmYWxzZSwgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRkxPRzIoU0ROb2RlICpOKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgT3AgPSBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gTWFrZUxpYkNhbGwoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TE9HMl9GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPRzJfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMT0cyX0Y4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TE9HMl9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgIE5WVCwgJk9wLCAxLCBmYWxzZSwgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRkxPRzEwKFNETm9kZSAqTikgeworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPRzEwX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TE9HMTBfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMT0cxMF9GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPRzEwX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgTlZULCAmT3AsIDEsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19GTVVMKFNETm9kZSAqTikgeworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wc1syXSA9IHsgR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKSwKKyAgICAgICAgICAgICAgICAgICAgIEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgxKSkgfTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6Ok1VTF9GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6Ok1VTF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6Ok1VTF9GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6Ok1VTF9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgIE5WVCwgT3BzLCAyLCBmYWxzZSwgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRk5FQVJCWUlOVChTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgU0RWYWx1ZSBPcCA9IEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBNYWtlTGliQ2FsbChHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpORUFSQllJTlRfRjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpORUFSQllJTlRfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpORUFSQllJTlRfRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpORUFSQllJTlRfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICBOVlQsICZPcCwgMSwgZmFsc2UsIE4tPmdldERlYnVnTG9jKCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX0ZORUcoU0ROb2RlICpOKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIC8vIEV4cGFuZCBZID0gRk5FRyhYKSAtPiBZID0gU1VCIC0wLjAsIFgKKyAgU0RWYWx1ZSBPcHNbMl0gPSB7IERBRy5nZXRDb25zdGFudEZQKC0wLjAsIE4tPmdldFZhbHVlVHlwZSgwKSksCisgICAgICAgICAgICAgICAgICAgICBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpIH07CisgIHJldHVybiBNYWtlTGliQ2FsbChHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTVUJfRjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTVUJfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTVUJfRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTVUJfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICBOVlQsIE9wcywgMiwgZmFsc2UsIE4tPmdldERlYnVnTG9jKCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX0ZQX0VYVEVORChTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgU0RWYWx1ZSBPcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OmdldEZQRVhUKE9wLmdldFZhbHVlVHlwZSgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBhc3NlcnQoTEMgIT0gUlRMSUI6OlVOS05PV05fTElCQ0FMTCAmJiAiVW5zdXBwb3J0ZWQgRlBfRVhURU5EISIpOworICByZXR1cm4gTWFrZUxpYkNhbGwoTEMsIE5WVCwgJk9wLCAxLCBmYWxzZSwgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKKy8vIEZJWE1FOiBTaG91bGQgd2UganVzdCB1c2UgJ25vcm1hbCcgRlBfRVhURU5EIC8gRlBfVFJVTkMgaW5zdGVhZCBvZiBzcGVjaWFsCisvLyBub2Rlcz8KK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRlAxNl9UT19GUDMyKFNETm9kZSAqTikgeworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKFJUTElCOjpGUEVYVF9GMTZfRjMyLCBOVlQsICZPcCwgMSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19GUF9ST1VORChTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgU0RWYWx1ZSBPcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OmdldEZQUk9VTkQoT3AuZ2V0VmFsdWVUeXBlKCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmICJVbnN1cHBvcnRlZCBGUF9ST1VORCEiKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKExDLCBOVlQsICZPcCwgMSwgZmFsc2UsIE4tPmdldERlYnVnTG9jKCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX0ZQT1coU0ROb2RlICpOKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgT3BzWzJdID0geyBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDEpKSB9OworICByZXR1cm4gTWFrZUxpYkNhbGwoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UE9XX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UE9XX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UE9XX0Y4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UE9XX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgTlZULCBPcHMsIDIsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19GUE9XSShTRE5vZGUgKk4pIHsKKyAgYXNzZXJ0KE4tPmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIgJiYKKyAgICAgICAgICJVbnN1cHBvcnRlZCBwb3dlciB0eXBlISIpOworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wc1syXSA9IHsgR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKSwgTi0+Z2V0T3BlcmFuZCgxKSB9OworICByZXR1cm4gTWFrZUxpYkNhbGwoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UE9XSV9GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlBPV0lfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpQT1dJX0Y4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UE9XSV9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgIE5WVCwgT3BzLCAyLCBmYWxzZSwgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRlJFTShTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgU0RWYWx1ZSBPcHNbMl0gPSB7IEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgwKSksCisgICAgICAgICAgICAgICAgICAgICBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMSkpIH07CisgIHJldHVybiBNYWtlTGliQ2FsbChHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpSRU1fRjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpSRU1fRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpSRU1fRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpSRU1fUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICBOVlQsIE9wcywgMiwgZmFsc2UsIE4tPmdldERlYnVnTG9jKCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX0ZSSU5UKFNETm9kZSAqTikgeworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlJJTlRfRjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpSSU5UX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UklOVF9GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlJJTlRfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICBOVlQsICZPcCwgMSwgZmFsc2UsIE4tPmdldERlYnVnTG9jKCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX0ZTSU4oU0ROb2RlICpOKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgT3AgPSBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gTWFrZUxpYkNhbGwoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U0lOX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U0lOX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U0lOX0Y4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U0lOX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgTlZULCAmT3AsIDEsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19GU1FSVChTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgU0RWYWx1ZSBPcCA9IEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBNYWtlTGliQ2FsbChHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTUVJUX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U1FSVF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNRUlRfRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTUVJUX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgTlZULCAmT3AsIDEsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19GU1VCKFNETm9kZSAqTikgeworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wc1syXSA9IHsgR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKSwKKyAgICAgICAgICAgICAgICAgICAgIEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgxKSkgfTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNVQl9GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNVQl9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNVQl9GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNVQl9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgIE5WVCwgT3BzLCAyLCBmYWxzZSwgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfRlRSVU5DKFNETm9kZSAqTikgeworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIE9wID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlRSVU5DX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6VFJVTkNfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpUUlVOQ19GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlRSVU5DX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgTlZULCAmT3AsIDEsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19MT0FEKFNETm9kZSAqTikgeworICBMb2FkU0ROb2RlICpMID0gY2FzdDxMb2FkU0ROb2RlPihOKTsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBWVCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBTRFZhbHVlIE5ld0w7CisgIGlmIChMLT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpOT05fRVhUTE9BRCkgeworICAgIE5ld0wgPSBEQUcuZ2V0TG9hZChMLT5nZXRBZGRyZXNzaW5nTW9kZSgpLCBMLT5nZXRFeHRlbnNpb25UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgIE5WVCwgZGwsIEwtPmdldENoYWluKCksIEwtPmdldEJhc2VQdHIoKSwgTC0+Z2V0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgIEwtPmdldFNyY1ZhbHVlKCksIEwtPmdldFNyY1ZhbHVlT2Zmc2V0KCksIE5WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgTC0+aXNWb2xhdGlsZSgpLCBMLT5pc05vblRlbXBvcmFsKCksIEwtPmdldEFsaWdubWVudCgpKTsKKyAgICAvLyBMZWdhbGl6ZWQgdGhlIGNoYWluIHJlc3VsdCAtIHN3aXRjaCBhbnl0aGluZyB0aGF0IHVzZWQgdGhlIG9sZCBjaGFpbiB0bworICAgIC8vIHVzZSB0aGUgbmV3IG9uZS4KKyAgICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksIE5ld0wuZ2V0VmFsdWUoMSkpOworICAgIHJldHVybiBOZXdMOworICB9CisKKyAgLy8gRG8gYSBub24tZXh0ZW5kaW5nIGxvYWQgZm9sbG93ZWQgYnkgRlBfRVhURU5ELgorICBOZXdMID0gREFHLmdldExvYWQoTC0+Z2V0QWRkcmVzc2luZ01vZGUoKSwgSVNEOjpOT05fRVhUTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgIEwtPmdldE1lbW9yeVZUKCksIGRsLCBMLT5nZXRDaGFpbigpLAorICAgICAgICAgICAgICAgICAgICAgTC0+Z2V0QmFzZVB0cigpLCBMLT5nZXRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgIEwtPmdldFNyY1ZhbHVlKCksIEwtPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICBMLT5nZXRNZW1vcnlWVCgpLCBMLT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICBMLT5pc05vblRlbXBvcmFsKCksIEwtPmdldEFsaWdubWVudCgpKTsKKyAgLy8gTGVnYWxpemVkIHRoZSBjaGFpbiByZXN1bHQgLSBzd2l0Y2ggYW55dGhpbmcgdGhhdCB1c2VkIHRoZSBvbGQgY2hhaW4gdG8KKyAgLy8gdXNlIHRoZSBuZXcgb25lLgorICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksIE5ld0wuZ2V0VmFsdWUoMSkpOworICByZXR1cm4gQml0Q29udmVydFRvSW50ZWdlcihEQUcuZ2V0Tm9kZShJU0Q6OkZQX0VYVEVORCwgZGwsIFZULCBOZXdMKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfU0VMRUNUKFNETm9kZSAqTikgeworICBTRFZhbHVlIExIUyA9IEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgxKSk7CisgIFNEVmFsdWUgUkhTID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDIpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgTEhTLmdldFZhbHVlVHlwZSgpLCBOLT5nZXRPcGVyYW5kKDApLExIUyxSSFMpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX1NFTEVDVF9DQyhTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBMSFMgPSBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMikpOworICBTRFZhbHVlIFJIUyA9IEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgzKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVF9DQywgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIExIUy5nZXRWYWx1ZVR5cGUoKSwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMSksIExIUywgUkhTLCBOLT5nZXRPcGVyYW5kKDQpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdFJlc19VTkRFRihTRE5vZGUgKk4pIHsKKyAgcmV0dXJuIERBRy5nZXRVTkRFRihUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKSkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0UmVzX1ZBQVJHKFNETm9kZSAqTikgeworICBTRFZhbHVlIENoYWluID0gTi0+Z2V0T3BlcmFuZCgwKTsgLy8gR2V0IHRoZSBjaGFpbi4KKyAgU0RWYWx1ZSBQdHIgPSBOLT5nZXRPcGVyYW5kKDEpOyAvLyBHZXQgdGhlIHBvaW50ZXIuCisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgVlQpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgU0RWYWx1ZSBOZXdWQUFSRzsKKyAgTmV3VkFBUkcgPSBEQUcuZ2V0VkFBcmcoTlZULCBkbCwgQ2hhaW4sIFB0ciwgTi0+Z2V0T3BlcmFuZCgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0Q29uc3RhbnRPcGVyYW5kVmFsKDMpKTsKKworICAvLyBMZWdhbGl6ZWQgdGhlIGNoYWluIHJlc3VsdCAtIHN3aXRjaCBhbnl0aGluZyB0aGF0IHVzZWQgdGhlIG9sZCBjaGFpbiB0bworICAvLyB1c2UgdGhlIG5ldyBvbmUuCisgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCAxKSwgTmV3VkFBUkcuZ2V0VmFsdWUoMSkpOworICByZXR1cm4gTmV3VkFBUkc7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRSZXNfWElOVF9UT19GUChTRE5vZGUgKk4pIHsKKyAgYm9vbCBTaWduZWQgPSBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNJTlRfVE9fRlA7CisgIEVWVCBTVlQgPSBOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICBFVlQgUlZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBFVlQgTlZUID0gRVZUKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBJZiB0aGUgaW5wdXQgaXMgbm90IGxlZ2FsLCBlZzogaTEgLT4gZnAsIHRoZW4gaXQgbmVlZHMgdG8gYmUgcHJvbW90ZWQgdG8KKyAgLy8gYSBsYXJnZXIgdHlwZSwgZWc6IGk4IC0+IGZwLiAgRXZlbiBpZiBpdCBpcyBsZWdhbCwgbm8gbGliY2FsbCBtYXkgZXhhY3RseQorICAvLyBtYXRjaC4gIExvb2sgZm9yIGFuIGFwcHJvcHJpYXRlIGxpYmNhbGwuCisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OlVOS05PV05fTElCQ0FMTDsKKyAgZm9yICh1bnNpZ25lZCB0ID0gTVZUOjpGSVJTVF9JTlRFR0VSX1ZBTFVFVFlQRTsKKyAgICAgICB0IDw9IE1WVDo6TEFTVF9JTlRFR0VSX1ZBTFVFVFlQRSAmJiBMQyA9PSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMOyArK3QpIHsKKyAgICBOVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpdDsKKyAgICAvLyBUaGUgc291cmNlIG5lZWRzIHRvIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgb3BlcmFuZC4KKyAgICBpZiAoTlZULmJpdHNHRShTVlQpKQorICAgICAgTEMgPSBTaWduZWQgPyBSVExJQjo6Z2V0U0lOVFRPRlAoTlZULCBSVlQpOlJUTElCOjpnZXRVSU5UVE9GUCAoTlZULCBSVlQpOworICB9CisgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmICJVbnN1cHBvcnRlZCBYSU5UX1RPX0ZQISIpOworCisgIC8vIFNpZ24vemVybyBleHRlbmQgdGhlIGFyZ3VtZW50IGlmIHRoZSBsaWJjYWxsIHRha2VzIGEgbGFyZ2VyIHR5cGUuCisgIFNEVmFsdWUgT3AgPSBEQUcuZ2V0Tm9kZShTaWduZWQgPyBJU0Q6OlNJR05fRVhURU5EIDogSVNEOjpaRVJPX0VYVEVORCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVlQsIE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gTWFrZUxpYkNhbGwoTEMsIFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgUlZUKSwKKyAgICAgICAgICAgICAgICAgICAgICZPcCwgMSwgZmFsc2UsIGRsKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIE9wZXJhbmQgRmxvYXQgdG8gSW50ZWdlciBDb252ZXJzaW9uLi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2Jvb2wgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRPcGVyYW5kKFNETm9kZSAqTiwgdW5zaWduZWQgT3BObykgeworICBERUJVRyhkYmdzKCkgPDwgIlNvZnRlbiBmbG9hdCBvcGVyYW5kICIgPDwgT3BObyA8PCAiOiAiOyBOLT5kdW1wKCZEQUcpOworICAgICAgICBkYmdzKCkgPDwgIlxuIik7CisgIFNEVmFsdWUgUmVzID0gU0RWYWx1ZSgpOworCisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyNpZm5kZWYgTkRFQlVHCisgICAgZGJncygpIDw8ICJTb2Z0ZW5GbG9hdE9wZXJhbmQgT3AgIyIgPDwgT3BObyA8PCAiOiAiOworICAgIE4tPmR1bXAoJkRBRyk7IGRiZ3MoKSA8PCAiXG4iOworI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgiRG8gbm90IGtub3cgaG93IHRvIHNvZnRlbiB0aGlzIG9wZXJhdG9yJ3Mgb3BlcmFuZCEiKTsKKworICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6IFJlcyA9IFNvZnRlbkZsb2F0T3BfQklUX0NPTlZFUlQoTik7IGJyZWFrOworICBjYXNlIElTRDo6QlJfQ0M6ICAgICAgIFJlcyA9IFNvZnRlbkZsb2F0T3BfQlJfQ0MoTik7IGJyZWFrOworICBjYXNlIElTRDo6RlBfUk9VTkQ6ICAgIFJlcyA9IFNvZnRlbkZsb2F0T3BfRlBfUk9VTkQoTik7IGJyZWFrOworICBjYXNlIElTRDo6RlBfVE9fU0lOVDogIFJlcyA9IFNvZnRlbkZsb2F0T3BfRlBfVE9fU0lOVChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpGUF9UT19VSU5UOiAgUmVzID0gU29mdGVuRmxvYXRPcF9GUF9UT19VSU5UKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZQMzJfVE9fRlAxNjpSZXMgPSBTb2Z0ZW5GbG9hdE9wX0ZQMzJfVE9fRlAxNihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6ICAgUmVzID0gU29mdGVuRmxvYXRPcF9TRUxFQ1RfQ0MoTik7IGJyZWFrOworICBjYXNlIElTRDo6U0VUQ0M6ICAgICAgIFJlcyA9IFNvZnRlbkZsb2F0T3BfU0VUQ0MoTik7IGJyZWFrOworICBjYXNlIElTRDo6U1RPUkU6ICAgICAgIFJlcyA9IFNvZnRlbkZsb2F0T3BfU1RPUkUoTiwgT3BObyk7IGJyZWFrOworICB9CisKKyAgLy8gSWYgdGhlIHJlc3VsdCBpcyBudWxsLCB0aGUgc3ViLW1ldGhvZCB0b29rIGNhcmUgb2YgcmVnaXN0ZXJpbmcgcmVzdWx0cyBldGMuCisgIGlmICghUmVzLmdldE5vZGUoKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHRoZSByZXN1bHQgaXMgTiwgdGhlIHN1Yi1tZXRob2QgdXBkYXRlZCBOIGluIHBsYWNlLiAgVGVsbCB0aGUgbGVnYWxpemVyCisgIC8vIGNvcmUgYWJvdXQgdGhpcy4KKyAgaWYgKFJlcy5nZXROb2RlKCkgPT0gTikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBhc3NlcnQoUmVzLmdldFZhbHVlVHlwZSgpID09IE4tPmdldFZhbHVlVHlwZSgwKSAmJiBOLT5nZXROdW1WYWx1ZXMoKSA9PSAxICYmCisgICAgICAgICAiSW52YWxpZCBvcGVyYW5kIGV4cGFuc2lvbiIpOworCisgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCAwKSwgUmVzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gU29mdGVuU2V0Q0NPcGVyYW5kcyAtIFNvZnRlbiB0aGUgb3BlcmFuZHMgb2YgYSBjb21wYXJpc29uLiAgVGhpcyBjb2RlIGlzCisvLy8gc2hhcmVkIGFtb25nIEJSX0NDLCBTRUxFQ1RfQ0MsIGFuZCBTRVRDQyBoYW5kbGVycy4KK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuU2V0Q0NPcGVyYW5kcyhTRFZhbHVlICZOZXdMSFMsIFNEVmFsdWUgJk5ld1JIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkNvbmRDb2RlICZDQ0NvZGUsIERlYnVnTG9jIGRsKSB7CisgIFNEVmFsdWUgTEhTSW50ID0gR2V0U29mdGVuZWRGbG9hdChOZXdMSFMpOworICBTRFZhbHVlIFJIU0ludCA9IEdldFNvZnRlbmVkRmxvYXQoTmV3UkhTKTsKKyAgRVZUIFZUID0gTmV3TEhTLmdldFZhbHVlVHlwZSgpOworCisgIGFzc2VydCgoVlQgPT0gTVZUOjpmMzIgfHwgVlQgPT0gTVZUOjpmNjQpICYmICJVbnN1cHBvcnRlZCBzZXRjYyB0eXBlISIpOworCisgIC8vIEV4cGFuZCBpbnRvIG9uZSBvciBtb3JlIHNvZnQtZnAgbGliY2FsbChzKS4KKyAgUlRMSUI6OkxpYmNhbGwgTEMxID0gUlRMSUI6OlVOS05PV05fTElCQ0FMTCwgTEMyID0gUlRMSUI6OlVOS05PV05fTElCQ0FMTDsKKyAgc3dpdGNoIChDQ0NvZGUpIHsKKyAgY2FzZSBJU0Q6OlNFVEVROgorICBjYXNlIElTRDo6U0VUT0VROgorICAgIExDMSA9IChWVCA9PSBNVlQ6OmYzMikgPyBSVExJQjo6T0VRX0YzMiA6IFJUTElCOjpPRVFfRjY0OworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUTkU6CisgIGNhc2UgSVNEOjpTRVRVTkU6CisgICAgTEMxID0gKFZUID09IE1WVDo6ZjMyKSA/IFJUTElCOjpVTkVfRjMyIDogUlRMSUI6OlVORV9GNjQ7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRHRToKKyAgY2FzZSBJU0Q6OlNFVE9HRToKKyAgICBMQzEgPSAoVlQgPT0gTVZUOjpmMzIpID8gUlRMSUI6Ok9HRV9GMzIgOiBSVExJQjo6T0dFX0Y2NDsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVExUOgorICBjYXNlIElTRDo6U0VUT0xUOgorICAgIExDMSA9IChWVCA9PSBNVlQ6OmYzMikgPyBSVExJQjo6T0xUX0YzMiA6IFJUTElCOjpPTFRfRjY0OworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUTEU6CisgIGNhc2UgSVNEOjpTRVRPTEU6CisgICAgTEMxID0gKFZUID09IE1WVDo6ZjMyKSA/IFJUTElCOjpPTEVfRjMyIDogUlRMSUI6Ok9MRV9GNjQ7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRHVDoKKyAgY2FzZSBJU0Q6OlNFVE9HVDoKKyAgICBMQzEgPSAoVlQgPT0gTVZUOjpmMzIpID8gUlRMSUI6Ok9HVF9GMzIgOiBSVExJQjo6T0dUX0Y2NDsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVFVPOgorICAgIExDMSA9IChWVCA9PSBNVlQ6OmYzMikgPyBSVExJQjo6VU9fRjMyIDogUlRMSUI6OlVPX0Y2NDsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVE86CisgICAgTEMxID0gKFZUID09IE1WVDo6ZjMyKSA/IFJUTElCOjpPX0YzMiA6IFJUTElCOjpPX0Y2NDsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBMQzEgPSAoVlQgPT0gTVZUOjpmMzIpID8gUlRMSUI6OlVPX0YzMiA6IFJUTElCOjpVT19GNjQ7CisgICAgc3dpdGNoIChDQ0NvZGUpIHsKKyAgICBjYXNlIElTRDo6U0VUT05FOgorICAgICAgLy8gU0VUT05FID0gU0VUT0xUIHwgU0VUT0dUCisgICAgICBMQzEgPSAoVlQgPT0gTVZUOjpmMzIpID8gUlRMSUI6Ok9MVF9GMzIgOiBSVExJQjo6T0xUX0Y2NDsKKyAgICAgIC8vIEZhbGx0aHJvdWdoCisgICAgY2FzZSBJU0Q6OlNFVFVHVDoKKyAgICAgIExDMiA9IChWVCA9PSBNVlQ6OmYzMikgPyBSVExJQjo6T0dUX0YzMiA6IFJUTElCOjpPR1RfRjY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVHRToKKyAgICAgIExDMiA9IChWVCA9PSBNVlQ6OmYzMikgPyBSVExJQjo6T0dFX0YzMiA6IFJUTElCOjpPR0VfRjY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVMVDoKKyAgICAgIExDMiA9IChWVCA9PSBNVlQ6OmYzMikgPyBSVExJQjo6T0xUX0YzMiA6IFJUTElCOjpPTFRfRjY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVMRToKKyAgICAgIExDMiA9IChWVCA9PSBNVlQ6OmYzMikgPyBSVExJQjo6T0xFX0YzMiA6IFJUTElCOjpPTEVfRjY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVFUToKKyAgICAgIExDMiA9IChWVCA9PSBNVlQ6OmYzMikgPyBSVExJQjo6T0VRX0YzMiA6IFJUTElCOjpPRVFfRjY0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlICYmICJEbyBub3Qga25vdyBob3cgdG8gc29mdGVuIHRoaXMgc2V0Y2MhIik7CisgICAgfQorICB9CisKKyAgLy8gVXNlIHRoZSB0YXJnZXQgc3BlY2lmaWMgcmV0dXJuIHZhbHVlIGZvciBjb21wYXJpb25zIGxpYiBjYWxscy4KKyAgRVZUIFJldFZUID0gVExJLmdldENtcExpYmNhbGxSZXR1cm5UeXBlKCk7CisgIFNEVmFsdWUgT3BzWzJdID0geyBMSFNJbnQsIFJIU0ludCB9OworICBOZXdMSFMgPSBNYWtlTGliQ2FsbChMQzEsIFJldFZULCBPcHMsIDIsIGZhbHNlLypzaWduIGlycmVsZXZhbnQqLywgZGwpOworICBOZXdSSFMgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgUmV0VlQpOworICBDQ0NvZGUgPSBUTEkuZ2V0Q21wTGliY2FsbENDKExDMSk7CisgIGlmIChMQzIgIT0gUlRMSUI6OlVOS05PV05fTElCQ0FMTCkgeworICAgIFNEVmFsdWUgVG1wID0gREFHLmdldE5vZGUoSVNEOjpTRVRDQywgZGwsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoUmV0VlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdMSFMsIE5ld1JIUywgREFHLmdldENvbmRDb2RlKENDQ29kZSkpOworICAgIE5ld0xIUyA9IE1ha2VMaWJDYWxsKExDMiwgUmV0VlQsIE9wcywgMiwgZmFsc2UvKnNpZ24gaXJyZWxldmFudCovLCBkbCk7CisgICAgTmV3TEhTID0gREFHLmdldE5vZGUoSVNEOjpTRVRDQywgZGwsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoUmV0VlQpLCBOZXdMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTmV3UkhTLCBEQUcuZ2V0Q29uZENvZGUoVExJLmdldENtcExpYmNhbGxDQyhMQzIpKSk7CisgICAgTmV3TEhTID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFRtcC5nZXRWYWx1ZVR5cGUoKSwgVG1wLCBOZXdMSFMpOworICAgIE5ld1JIUyA9IFNEVmFsdWUoKTsKKyAgfQorfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0T3BfQklUX0NPTlZFUlQoU0ROb2RlICpOKSB7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBOLT5nZXREZWJ1Z0xvYygpLCBOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdE9wX0ZQX1JPVU5EKFNETm9kZSAqTikgeworICBFVlQgU1ZUID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIFJWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICBSVExJQjo6TGliY2FsbCBMQyA9IFJUTElCOjpnZXRGUFJPVU5EKFNWVCwgUlZUKTsKKyAgYXNzZXJ0KExDICE9IFJUTElCOjpVTktOT1dOX0xJQkNBTEwgJiYgIlVuc3VwcG9ydGVkIEZQX1JPVU5EIGxpYmNhbGwiKTsKKworICBTRFZhbHVlIE9wID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKExDLCBSVlQsICZPcCwgMSwgZmFsc2UsIE4tPmdldERlYnVnTG9jKCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0T3BfQlJfQ0MoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTmV3TEhTID0gTi0+Z2V0T3BlcmFuZCgyKSwgTmV3UkhTID0gTi0+Z2V0T3BlcmFuZCgzKTsKKyAgSVNEOjpDb25kQ29kZSBDQ0NvZGUgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKS0+Z2V0KCk7CisgIFNvZnRlblNldENDT3BlcmFuZHMoTmV3TEhTLCBOZXdSSFMsIENDQ29kZSwgTi0+Z2V0RGVidWdMb2MoKSk7CisKKyAgLy8gSWYgU29mdGVuU2V0Q0NPcGVyYW5kcyByZXR1cm5lZCBhIHNjYWxhciwgd2UgbmVlZCB0byBjb21wYXJlIHRoZSByZXN1bHQKKyAgLy8gYWdhaW5zdCB6ZXJvIHRvIHNlbGVjdCBiZXR3ZWVuIHRydWUgYW5kIGZhbHNlIHZhbHVlcy4KKyAgaWYgKE5ld1JIUy5nZXROb2RlKCkgPT0gMCkgeworICAgIE5ld1JIUyA9IERBRy5nZXRDb25zdGFudCgwLCBOZXdMSFMuZ2V0VmFsdWVUeXBlKCkpOworICAgIENDQ29kZSA9IElTRDo6U0VUTkU7CisgIH0KKworICAvLyBVcGRhdGUgTiB0byBoYXZlIHRoZSBvcGVyYW5kcyBzcGVjaWZpZWQuCisgIHJldHVybiBTRFZhbHVlKERBRy5VcGRhdGVOb2RlT3BlcmFuZHMoTiwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbmRDb2RlKENDQ29kZSksIE5ld0xIUywgTmV3UkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDQpKSwKKyAgICAgICAgICAgICAgICAgMCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRPcF9GUF9UT19TSU5UKFNETm9kZSAqTikgeworICBFVlQgUlZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBSVExJQjo6TGliY2FsbCBMQyA9IFJUTElCOjpnZXRGUFRPU0lOVChOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLCBSVlQpOworICBhc3NlcnQoTEMgIT0gUlRMSUI6OlVOS05PV05fTElCQ0FMTCAmJiAiVW5zdXBwb3J0ZWQgRlBfVE9fU0lOVCEiKTsKKyAgU0RWYWx1ZSBPcCA9IEdldFNvZnRlbmVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBNYWtlTGliQ2FsbChMQywgUlZULCAmT3AsIDEsIGZhbHNlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTb2Z0ZW5GbG9hdE9wX0ZQX1RPX1VJTlQoU0ROb2RlICpOKSB7CisgIEVWVCBSVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OmdldEZQVE9VSU5UKE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCksIFJWVCk7CisgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmICJVbnN1cHBvcnRlZCBGUF9UT19VSU5UISIpOworICBTRFZhbHVlIE9wID0gR2V0U29mdGVuZWRGbG9hdChOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKExDLCBSVlQsICZPcCwgMSwgZmFsc2UsIE4tPmdldERlYnVnTG9jKCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0T3BfRlAzMl9UT19GUDE2KFNETm9kZSAqTikgeworICBFVlQgUlZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBSVExJQjo6TGliY2FsbCBMQyA9IFJUTElCOjpGUFJPVU5EX0YzMl9GMTY7CisgIFNEVmFsdWUgT3AgPSBHZXRTb2Z0ZW5lZEZsb2F0KE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gTWFrZUxpYkNhbGwoTEMsIFJWVCwgJk9wLCAxLCBmYWxzZSwgTi0+Z2V0RGVidWdMb2MoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRPcF9TRUxFQ1RfQ0MoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTmV3TEhTID0gTi0+Z2V0T3BlcmFuZCgwKSwgTmV3UkhTID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgSVNEOjpDb25kQ29kZSBDQ0NvZGUgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihOLT5nZXRPcGVyYW5kKDQpKS0+Z2V0KCk7CisgIFNvZnRlblNldENDT3BlcmFuZHMoTmV3TEhTLCBOZXdSSFMsIENDQ29kZSwgTi0+Z2V0RGVidWdMb2MoKSk7CisKKyAgLy8gSWYgU29mdGVuU2V0Q0NPcGVyYW5kcyByZXR1cm5lZCBhIHNjYWxhciwgd2UgbmVlZCB0byBjb21wYXJlIHRoZSByZXN1bHQKKyAgLy8gYWdhaW5zdCB6ZXJvIHRvIHNlbGVjdCBiZXR3ZWVuIHRydWUgYW5kIGZhbHNlIHZhbHVlcy4KKyAgaWYgKE5ld1JIUy5nZXROb2RlKCkgPT0gMCkgeworICAgIE5ld1JIUyA9IERBRy5nZXRDb25zdGFudCgwLCBOZXdMSFMuZ2V0VmFsdWVUeXBlKCkpOworICAgIENDQ29kZSA9IElTRDo6U0VUTkU7CisgIH0KKworICAvLyBVcGRhdGUgTiB0byBoYXZlIHRoZSBvcGVyYW5kcyBzcGVjaWZpZWQuCisgIHJldHVybiBTRFZhbHVlKERBRy5VcGRhdGVOb2RlT3BlcmFuZHMoTiwgTmV3TEhTLCBOZXdSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMiksIE4tPmdldE9wZXJhbmQoMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25kQ29kZShDQ0NvZGUpKSwKKyAgICAgICAgICAgICAgICAgMCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U29mdGVuRmxvYXRPcF9TRVRDQyhTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOZXdMSFMgPSBOLT5nZXRPcGVyYW5kKDApLCBOZXdSSFMgPSBOLT5nZXRPcGVyYW5kKDEpOworICBJU0Q6OkNvbmRDb2RlIENDQ29kZSA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KE4tPmdldE9wZXJhbmQoMikpLT5nZXQoKTsKKyAgU29mdGVuU2V0Q0NPcGVyYW5kcyhOZXdMSFMsIE5ld1JIUywgQ0NDb2RlLCBOLT5nZXREZWJ1Z0xvYygpKTsKKworICAvLyBJZiBTb2Z0ZW5TZXRDQ09wZXJhbmRzIHJldHVybmVkIGEgc2NhbGFyLCB1c2UgaXQuCisgIGlmIChOZXdSSFMuZ2V0Tm9kZSgpID09IDApIHsKKyAgICBhc3NlcnQoTmV3TEhTLmdldFZhbHVlVHlwZSgpID09IE4tPmdldFZhbHVlVHlwZSgwKSAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBzZXRjYyBleHBhbnNpb24hIik7CisgICAgcmV0dXJuIE5ld0xIUzsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgdXBkYXRlIE4gdG8gaGF2ZSB0aGUgb3BlcmFuZHMgc3BlY2lmaWVkLgorICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sIE5ld0xIUywgTmV3UkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uZENvZGUoQ0NDb2RlKSksCisgICAgICAgICAgICAgICAgIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNvZnRlbkZsb2F0T3BfU1RPUkUoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKSB7CisgIGFzc2VydChJU0Q6OmlzVU5JTkRFWEVEU3RvcmUoTikgJiYgIkluZGV4ZWQgc3RvcmUgZHVyaW5nIHR5cGUgbGVnYWxpemF0aW9uISIpOworICBhc3NlcnQoT3BObyA9PSAxICYmICJDYW4gb25seSBzb2Z0ZW4gdGhlIHN0b3JlZCB2YWx1ZSEiKTsKKyAgU3RvcmVTRE5vZGUgKlNUID0gY2FzdDxTdG9yZVNETm9kZT4oTik7CisgIFNEVmFsdWUgVmFsID0gU1QtPmdldFZhbHVlKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBpZiAoU1QtPmlzVHJ1bmNhdGluZ1N0b3JlKCkpCisgICAgLy8gRG8gYW4gRlBfUk9VTkQgZm9sbG93ZWQgYnkgYSBub24tdHJ1bmNhdGluZyBzdG9yZS4KKyAgICBWYWwgPSBCaXRDb252ZXJ0VG9JbnRlZ2VyKERBRy5nZXROb2RlKElTRDo6RlBfUk9VTkQsIGRsLCBTVC0+Z2V0TWVtb3J5VlQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbCwgREFHLmdldEludFB0ckNvbnN0YW50KDApKSk7CisgIGVsc2UKKyAgICBWYWwgPSBHZXRTb2Z0ZW5lZEZsb2F0KFZhbCk7CisKKyAgcmV0dXJuIERBRy5nZXRTdG9yZShTVC0+Z2V0Q2hhaW4oKSwgZGwsIFZhbCwgU1QtPmdldEJhc2VQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0U3JjVmFsdWUoKSwgU1QtPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgU1QtPmlzVm9sYXRpbGUoKSwgU1QtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0QWxpZ25tZW50KCkpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRmxvYXQgUmVzdWx0IEV4cGFuc2lvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEV4cGFuZEZsb2F0UmVzdWx0IC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHNwZWNpZmllZCByZXN1bHQgb2YgdGhlCisvLy8gc3BlY2lmaWVkIG5vZGUgaXMgZm91bmQgdG8gbmVlZCBleHBhbnNpb24uICBBdCB0aGlzIHBvaW50LCB0aGUgbm9kZSBtYXkgYWxzbworLy8vIGhhdmUgaW52YWxpZCBvcGVyYW5kcyBvciBtYXkgaGF2ZSBvdGhlciByZXN1bHRzIHRoYXQgbmVlZCBwcm9tb3Rpb24sIHdlIGp1c3QKKy8vLyBrbm93IHRoYXQgKGF0IGxlYXN0KSBvbmUgcmVzdWx0IG5lZWRzIGV4cGFuc2lvbi4KK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXN1bHQoU0ROb2RlICpOLCB1bnNpZ25lZCBSZXNObykgeworICBERUJVRyhkYmdzKCkgPDwgIkV4cGFuZCBmbG9hdCByZXN1bHQ6ICI7IE4tPmR1bXAoJkRBRyk7IGRiZ3MoKSA8PCAiXG4iKTsKKyAgU0RWYWx1ZSBMbywgSGk7CisgIExvID0gSGkgPSBTRFZhbHVlKCk7CisKKyAgLy8gU2VlIGlmIHRoZSB0YXJnZXQgd2FudHMgdG8gY3VzdG9tIGV4cGFuZCB0aGlzIG5vZGUuCisgIGlmIChDdXN0b21Mb3dlck5vZGUoTiwgTi0+Z2V0VmFsdWVUeXBlKFJlc05vKSwgdHJ1ZSkpCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyNpZm5kZWYgTkRFQlVHCisgICAgZGJncygpIDw8ICJFeHBhbmRGbG9hdFJlc3VsdCAjIiA8PCBSZXNObyA8PCAiOiAiOworICAgIE4tPmR1bXAoJkRBRyk7IGRiZ3MoKSA8PCAiXG4iOworI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgiRG8gbm90IGtub3cgaG93IHRvIGV4cGFuZCB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0b3IhIik7CisKKyAgY2FzZSBJU0Q6Ok1FUkdFX1ZBTFVFUzogU3BsaXRSZXNfTUVSR0VfVkFMVUVTKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6VU5ERUY6ICAgICAgICBTcGxpdFJlc19VTkRFRihOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFTEVDVDogICAgICAgU3BsaXRSZXNfU0VMRUNUKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6U0VMRUNUX0NDOiAgICBTcGxpdFJlc19TRUxFQ1RfQ0MoTiwgTG8sIEhpKTsgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OkJJVF9DT05WRVJUOiAgICAgICAgRXhwYW5kUmVzX0JJVF9DT05WRVJUKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6QlVJTERfUEFJUjogICAgICAgICBFeHBhbmRSZXNfQlVJTERfUEFJUihOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkVYVFJBQ1RfRUxFTUVOVDogICAgRXhwYW5kUmVzX0VYVFJBQ1RfRUxFTUVOVChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVDogRXhwYW5kUmVzX0VYVFJBQ1RfVkVDVE9SX0VMVChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OlZBQVJHOiAgICAgICAgICAgICAgRXhwYW5kUmVzX1ZBQVJHKE4sIExvLCBIaSk7IGJyZWFrOworCisgIGNhc2UgSVNEOjpDb25zdGFudEZQOiBFeHBhbmRGbG9hdFJlc19Db25zdGFudEZQKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RkFCUzogICAgICAgRXhwYW5kRmxvYXRSZXNfRkFCUyhOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZBREQ6ICAgICAgIEV4cGFuZEZsb2F0UmVzX0ZBREQoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpGQ0VJTDogICAgICBFeHBhbmRGbG9hdFJlc19GQ0VJTChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZDT1BZU0lHTjogIEV4cGFuZEZsb2F0UmVzX0ZDT1BZU0lHTihOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZDT1M6ICAgICAgIEV4cGFuZEZsb2F0UmVzX0ZDT1MoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpGRElWOiAgICAgICBFeHBhbmRGbG9hdFJlc19GRElWKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RkVYUDogICAgICAgRXhwYW5kRmxvYXRSZXNfRkVYUChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZFWFAyOiAgICAgIEV4cGFuZEZsb2F0UmVzX0ZFWFAyKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RkZMT09SOiAgICAgRXhwYW5kRmxvYXRSZXNfRkZMT09SKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RkxPRzogICAgICAgRXhwYW5kRmxvYXRSZXNfRkxPRyhOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZMT0cyOiAgICAgIEV4cGFuZEZsb2F0UmVzX0ZMT0cyKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RkxPRzEwOiAgICAgRXhwYW5kRmxvYXRSZXNfRkxPRzEwKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6Rk1VTDogICAgICAgRXhwYW5kRmxvYXRSZXNfRk1VTChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZORUFSQllJTlQ6IEV4cGFuZEZsb2F0UmVzX0ZORUFSQllJTlQoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpGTkVHOiAgICAgICBFeHBhbmRGbG9hdFJlc19GTkVHKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RlBfRVhURU5EOiAgRXhwYW5kRmxvYXRSZXNfRlBfRVhURU5EKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RlBPVzogICAgICAgRXhwYW5kRmxvYXRSZXNfRlBPVyhOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZQT1dJOiAgICAgIEV4cGFuZEZsb2F0UmVzX0ZQT1dJKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RlJJTlQ6ICAgICAgRXhwYW5kRmxvYXRSZXNfRlJJTlQoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpGU0lOOiAgICAgICBFeHBhbmRGbG9hdFJlc19GU0lOKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RlNRUlQ6ICAgICAgRXhwYW5kRmxvYXRSZXNfRlNRUlQoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpGU1VCOiAgICAgICBFeHBhbmRGbG9hdFJlc19GU1VCKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RlRSVU5DOiAgICAgRXhwYW5kRmxvYXRSZXNfRlRSVU5DKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6TE9BRDogICAgICAgRXhwYW5kRmxvYXRSZXNfTE9BRChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6CisgIGNhc2UgSVNEOjpVSU5UX1RPX0ZQOiBFeHBhbmRGbG9hdFJlc19YSU5UX1RPX0ZQKE4sIExvLCBIaSk7IGJyZWFrOworICB9CisKKyAgLy8gSWYgTG8vSGkgaXMgbnVsbCwgdGhlIHN1Yi1tZXRob2QgdG9vayBjYXJlIG9mIHJlZ2lzdGVyaW5nIHJlc3VsdHMgZXRjLgorICBpZiAoTG8uZ2V0Tm9kZSgpKQorICAgIFNldEV4cGFuZGVkRmxvYXQoU0RWYWx1ZShOLCBSZXNObyksIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfQ29uc3RhbnRGUChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkhpKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIGFzc2VydChOVlQuZ2V0U2l6ZUluQml0cygpID09IGludGVnZXJQYXJ0V2lkdGggJiYKKyAgICAgICAgICJEbyBub3Qga25vdyBob3cgdG8gZXhwYW5kIHRoaXMgZmxvYXQgY29uc3RhbnQhIik7CisgIEFQSW50IEMgPSBjYXN0PENvbnN0YW50RlBTRE5vZGU+KE4pLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCk7CisgIExvID0gREFHLmdldENvbnN0YW50RlAoQVBGbG9hdChBUEludChpbnRlZ2VyUGFydFdpZHRoLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkMuZ2V0UmF3RGF0YSgpWzFdKSksIE5WVCk7CisgIEhpID0gREFHLmdldENvbnN0YW50RlAoQVBGbG9hdChBUEludChpbnRlZ2VyUGFydFdpZHRoLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkMuZ2V0UmF3RGF0YSgpWzBdKSksIE5WVCk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfRkFCUyhTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkhpKSB7CisgIGFzc2VydChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjpwcGNmMTI4ICYmCisgICAgICAgICAiTG9naWMgb25seSBjb3JyZWN0IGZvciBwcGNmMTI4ISIpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgVG1wOworICBHZXRFeHBhbmRlZEZsb2F0KE4tPmdldE9wZXJhbmQoMCksIExvLCBUbXApOworICBIaSA9IERBRy5nZXROb2RlKElTRDo6RkFCUywgZGwsIFRtcC5nZXRWYWx1ZVR5cGUoKSwgVG1wKTsKKyAgLy8gTG8gPSBIaT09ZmFicyhIaSkgPyBMbyA6IC1MbzsKKyAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVF9DQywgZGwsIExvLmdldFZhbHVlVHlwZSgpLCBUbXAsIEhpLCBMbywKKyAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkZORUcsIGRsLCBMby5nZXRWYWx1ZVR5cGUoKSwgTG8pLAorICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25kQ29kZShJU0Q6OlNFVEVRKSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfRkFERChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkhpKSB7CisgIFNEVmFsdWUgQ2FsbCA9IExpYkNhbGxpZnkoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkFERF9GMzIsIFJUTElCOjpBRERfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6QUREX0Y4MCwgUlRMSUI6OkFERF9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBmYWxzZSk7CisgIEdldFBhaXJFbGVtZW50cyhDYWxsLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0UmVzX0ZDRUlMKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIFNEVmFsdWUgQ2FsbCA9IExpYkNhbGxpZnkoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkNFSUxfRjMyLCBSVExJQjo6Q0VJTF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpDRUlMX0Y4MCwgUlRMSUI6OkNFSUxfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgZmFsc2UpOworICBHZXRQYWlyRWxlbWVudHMoQ2FsbCwgTG8sIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdFJlc19GQ09QWVNJR04oU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIFNEVmFsdWUgQ2FsbCA9IExpYkNhbGxpZnkoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkNPUFlTSUdOX0YzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkNPUFlTSUdOX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkNPUFlTSUdOX0Y4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkNPUFlTSUdOX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIGZhbHNlKTsKKyAgR2V0UGFpckVsZW1lbnRzKENhbGwsIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfRkNPUyhTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIFNEVmFsdWUgQ2FsbCA9IExpYkNhbGxpZnkoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkNPU19GMzIsIFJUTElCOjpDT1NfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6Q09TX0Y4MCwgUlRMSUI6OkNPU19QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBmYWxzZSk7CisgIEdldFBhaXJFbGVtZW50cyhDYWxsLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0UmVzX0ZESVYoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIE9wc1syXSA9IHsgTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSB9OworICBTRFZhbHVlIENhbGwgPSBNYWtlTGliQ2FsbChHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkRJVl9GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RElWX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpESVZfRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkRJVl9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0VmFsdWVUeXBlKDApLCBPcHMsIDIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXREZWJ1Z0xvYygpKTsKKyAgR2V0UGFpckVsZW1lbnRzKENhbGwsIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfRkVYUChTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIFNEVmFsdWUgQ2FsbCA9IExpYkNhbGxpZnkoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkVYUF9GMzIsIFJUTElCOjpFWFBfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RVhQX0Y4MCwgUlRMSUI6OkVYUF9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBmYWxzZSk7CisgIEdldFBhaXJFbGVtZW50cyhDYWxsLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0UmVzX0ZFWFAyKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIFNEVmFsdWUgQ2FsbCA9IExpYkNhbGxpZnkoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkVYUDJfRjMyLCBSVExJQjo6RVhQMl9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpFWFAyX0Y4MCwgUlRMSUI6OkVYUDJfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgZmFsc2UpOworICBHZXRQYWlyRWxlbWVudHMoQ2FsbCwgTG8sIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdFJlc19GRkxPT1IoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIFNEVmFsdWUgQ2FsbCA9IExpYkNhbGxpZnkoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkZMT09SX0YzMixSVExJQjo6RkxPT1JfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6RkxPT1JfRjgwLFJUTElCOjpGTE9PUl9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBmYWxzZSk7CisgIEdldFBhaXJFbGVtZW50cyhDYWxsLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0UmVzX0ZMT0coU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIENhbGwgPSBMaWJDYWxsaWZ5KEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMT0dfRjMyLCBSVExJQjo6TE9HX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPR19GODAsIFJUTElCOjpMT0dfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgZmFsc2UpOworICBHZXRQYWlyRWxlbWVudHMoQ2FsbCwgTG8sIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdFJlc19GTE9HMihTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIENhbGwgPSBMaWJDYWxsaWZ5KEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMT0cyX0YzMiwgUlRMSUI6OkxPRzJfRjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TE9HMl9GODAsIFJUTElCOjpMT0cyX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIGZhbHNlKTsKKyAgR2V0UGFpckVsZW1lbnRzKENhbGwsIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfRkxPRzEwKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIENhbGwgPSBMaWJDYWxsaWZ5KEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpMT0cxMF9GMzIsUlRMSUI6OkxPRzEwX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OkxPRzEwX0Y4MCxSVExJQjo6TE9HMTBfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgZmFsc2UpOworICBHZXRQYWlyRWxlbWVudHMoQ2FsbCwgTG8sIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdFJlc19GTVVMKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgU0RWYWx1ZSBPcHNbMl0gPSB7IE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSkgfTsKKyAgU0RWYWx1ZSBDYWxsID0gTWFrZUxpYkNhbGwoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpNVUxfRjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6Ok1VTF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TVVMX0Y4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpNVUxfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKSwgT3BzLCAyLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0RGVidWdMb2MoKSk7CisgIEdldFBhaXJFbGVtZW50cyhDYWxsLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0UmVzX0ZORUFSQllJTlQoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIENhbGwgPSBMaWJDYWxsaWZ5KEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpORUFSQllJTlRfRjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6TkVBUkJZSU5UX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6Ok5FQVJCWUlOVF9GODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpORUFSQllJTlRfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgZmFsc2UpOworICBHZXRQYWlyRWxlbWVudHMoQ2FsbCwgTG8sIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdFJlc19GTkVHKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRFeHBhbmRlZEZsb2F0KE4tPmdldE9wZXJhbmQoMCksIExvLCBIaSk7CisgIExvID0gREFHLmdldE5vZGUoSVNEOjpGTkVHLCBkbCwgTG8uZ2V0VmFsdWVUeXBlKCksIExvKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZORUcsIGRsLCBIaS5nZXRWYWx1ZVR5cGUoKSwgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0UmVzX0ZQX0VYVEVORChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZQX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgTlZULCBOLT5nZXRPcGVyYW5kKDApKTsKKyAgTG8gPSBEQUcuZ2V0Q29uc3RhbnRGUChBUEZsb2F0KEFQSW50KE5WVC5nZXRTaXplSW5CaXRzKCksIDApKSwgTlZUKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdFJlc19GUE9XKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgU0RWYWx1ZSBDYWxsID0gTGliQ2FsbGlmeShHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UE9XX0YzMiwgUlRMSUI6OlBPV19GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpQT1dfRjgwLCBSVExJQjo6UE9XX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIGZhbHNlKTsKKyAgR2V0UGFpckVsZW1lbnRzKENhbGwsIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfRlBPV0koU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgU0RWYWx1ZSBDYWxsID0gTGliQ2FsbGlmeShHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6UE9XSV9GMzIsIFJUTElCOjpQT1dJX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlBPV0lfRjgwLCBSVExJQjo6UE9XSV9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBmYWxzZSk7CisgIEdldFBhaXJFbGVtZW50cyhDYWxsLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0UmVzX0ZSSU5UKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIFNEVmFsdWUgQ2FsbCA9IExpYkNhbGxpZnkoR2V0RlBMaWJDYWxsKE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlJJTlRfRjMyLCBSVExJQjo6UklOVF9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpSSU5UX0Y4MCwgUlRMSUI6OlJJTlRfUFBDRjEyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgZmFsc2UpOworICBHZXRQYWlyRWxlbWVudHMoQ2FsbCwgTG8sIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdFJlc19GU0lOKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgU0RWYWx1ZSBDYWxsID0gTGliQ2FsbGlmeShHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U0lOX0YzMiwgUlRMSUI6OlNJTl9GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTSU5fRjgwLCBSVExJQjo6U0lOX1BQQ0YxMjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIGZhbHNlKTsKKyAgR2V0UGFpckVsZW1lbnRzKENhbGwsIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfRlNRUlQoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgU0RWYWx1ZSBDYWxsID0gTGliQ2FsbGlmeShHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U1FSVF9GMzIsIFJUTElCOjpTUVJUX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNRUlRfRjgwLCBSVExJQjo6U1FSVF9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBmYWxzZSk7CisgIEdldFBhaXJFbGVtZW50cyhDYWxsLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0UmVzX0ZTVUIoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIE9wc1syXSA9IHsgTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSB9OworICBTRFZhbHVlIENhbGwgPSBNYWtlTGliQ2FsbChHZXRGUExpYkNhbGwoTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNVQl9GMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExJQjo6U1VCX0Y2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpTVUJfRjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMSUI6OlNVQl9QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0VmFsdWVUeXBlKDApLCBPcHMsIDIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXREZWJ1Z0xvYygpKTsKKyAgR2V0UGFpckVsZW1lbnRzKENhbGwsIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfRlRSVU5DKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIENhbGwgPSBMaWJDYWxsaWZ5KEdldEZQTGliQ2FsbChOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpUUlVOQ19GMzIsIFJUTElCOjpUUlVOQ19GNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTElCOjpUUlVOQ19GODAsIFJUTElCOjpUUlVOQ19QUENGMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBmYWxzZSk7CisgIEdldFBhaXJFbGVtZW50cyhDYWxsLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0UmVzX0xPQUQoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBpZiAoSVNEOjppc05vcm1hbExvYWQoTikpIHsKKyAgICBFeHBhbmRSZXNfTm9ybWFsTG9hZChOLCBMbywgSGkpOworICAgIHJldHVybjsKKyAgfQorCisgIGFzc2VydChJU0Q6OmlzVU5JTkRFWEVETG9hZChOKSAmJiAiSW5kZXhlZCBsb2FkIGR1cmluZyB0eXBlIGxlZ2FsaXphdGlvbiEiKTsKKyAgTG9hZFNETm9kZSAqTEQgPSBjYXN0PExvYWRTRE5vZGU+KE4pOworICBTRFZhbHVlIENoYWluID0gTEQtPmdldENoYWluKCk7CisgIFNEVmFsdWUgUHRyID0gTEQtPmdldEJhc2VQdHIoKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIExELT5nZXRWYWx1ZVR5cGUoMCkpOworICBhc3NlcnQoTlZULmlzQnl0ZVNpemVkKCkgJiYgIkV4cGFuZGVkIHR5cGUgbm90IGJ5dGUgc2l6ZWQhIik7CisgIGFzc2VydChMRC0+Z2V0TWVtb3J5VlQoKS5iaXRzTEUoTlZUKSAmJiAiRmxvYXQgdHlwZSBub3Qgcm91bmQ/Iik7CisKKyAgSGkgPSBEQUcuZ2V0RXh0TG9hZChMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpLCBOVlQsIGRsLCBDaGFpbiwgUHRyLAorICAgICAgICAgICAgICAgICAgICAgIExELT5nZXRTcmNWYWx1ZSgpLCBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0TWVtb3J5VlQoKSwgTEQtPmlzVm9sYXRpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBMRC0+aXNOb25UZW1wb3JhbCgpLCBMRC0+Z2V0QWxpZ25tZW50KCkpOworCisgIC8vIFJlbWVtYmVyIHRoZSBjaGFpbi4KKyAgQ2hhaW4gPSBIaS5nZXRWYWx1ZSgxKTsKKworICAvLyBUaGUgbG93IHBhcnQgaXMgemVyby4KKyAgTG8gPSBEQUcuZ2V0Q29uc3RhbnRGUChBUEZsb2F0KEFQSW50KE5WVC5nZXRTaXplSW5CaXRzKCksIDApKSwgTlZUKTsKKworICAvLyBNb2RpZmllZCB0aGUgY2hhaW4gLSBzd2l0Y2ggYW55dGhpbmcgdGhhdCB1c2VkIHRoZSBvbGQgY2hhaW4gdG8gdXNlIHRoZQorICAvLyBuZXcgb25lLgorICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTEQsIDEpLCBDaGFpbik7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRSZXNfWElOVF9UT19GUChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkhpKSB7CisgIGFzc2VydChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjpwcGNmMTI4ICYmICJVbnN1cHBvcnRlZCBYSU5UX1RPX0ZQISIpOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIFZUKTsKKyAgU0RWYWx1ZSBTcmMgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgU3JjVlQgPSBTcmMuZ2V0VmFsdWVUeXBlKCk7CisgIGJvb2wgaXNTaWduZWQgPSBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNJTlRfVE9fRlA7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBGaXJzdCBkbyBhbiBTSU5UX1RPX0ZQLCB3aGV0aGVyIHRoZSBvcmlnaW5hbCB3YXMgc2lnbmVkIG9yIHVuc2lnbmVkLgorICAvLyBXaGVuIHByb21vdGluZyBwYXJ0aWFsIHdvcmQgdHlwZXMgdG8gaTMyIHdlIG11c3QgaG9ub3IgdGhlIHNpZ25lZG5lc3MsCisgIC8vIHRob3VnaC4KKyAgaWYgKFNyY1ZULmJpdHNMRShNVlQ6OmkzMikpIHsKKyAgICAvLyBUaGUgaW50ZWdlciBjYW4gYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBpbiBhbiBmNjQuCisgICAgU3JjID0gREFHLmdldE5vZGUoaXNTaWduZWQgPyBJU0Q6OlNJR05fRVhURU5EIDogSVNEOjpaRVJPX0VYVEVORCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIsIFNyYyk7CisgICAgTG8gPSBEQUcuZ2V0Q29uc3RhbnRGUChBUEZsb2F0KEFQSW50KE5WVC5nZXRTaXplSW5CaXRzKCksIDApKSwgTlZUKTsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6U0lOVF9UT19GUCwgZGwsIE5WVCwgU3JjKTsKKyAgfSBlbHNlIHsKKyAgICBSVExJQjo6TGliY2FsbCBMQyA9IFJUTElCOjpVTktOT1dOX0xJQkNBTEw7CisgICAgaWYgKFNyY1ZULmJpdHNMRShNVlQ6Omk2NCkpIHsKKyAgICAgIFNyYyA9IERBRy5nZXROb2RlKGlzU2lnbmVkID8gSVNEOjpTSUdOX0VYVEVORCA6IElTRDo6WkVST19FWFRFTkQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppNjQsIFNyYyk7CisgICAgICBMQyA9IFJUTElCOjpTSU5UVE9GUF9JNjRfUFBDRjEyODsKKyAgICB9IGVsc2UgaWYgKFNyY1ZULmJpdHNMRShNVlQ6OmkxMjgpKSB7CisgICAgICBTcmMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBkbCwgTVZUOjppMTI4LCBTcmMpOworICAgICAgTEMgPSBSVExJQjo6U0lOVFRPRlBfSTEyOF9QUENGMTI4OworICAgIH0KKyAgICBhc3NlcnQoTEMgIT0gUlRMSUI6OlVOS05PV05fTElCQ0FMTCAmJiAiVW5zdXBwb3J0ZWQgWElOVF9UT19GUCEiKTsKKworICAgIEhpID0gTWFrZUxpYkNhbGwoTEMsIFZULCAmU3JjLCAxLCB0cnVlLCBkbCk7CisgICAgR2V0UGFpckVsZW1lbnRzKEhpLCBMbywgSGkpOworICB9CisKKyAgaWYgKGlzU2lnbmVkKQorICAgIHJldHVybjsKKworICAvLyBVbnNpZ25lZCAtIGZpeCB1cCB0aGUgU0lOVF9UT19GUCB2YWx1ZSBqdXN0IGNhbGN1bGF0ZWQuCisgIEhpID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgVlQsIExvLCBIaSk7CisgIFNyY1ZUID0gU3JjLmdldFZhbHVlVHlwZSgpOworCisgIC8vIHg+PTAgPyAocHBjZjEyOCkoaU4peCA6IChwcGNmMTI4KShpTil4ICsgMl5OOyBOPTMyLDY0LDEyOC4KKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFR3b0UzMltdICA9IHsgMHg0MWYwMDAwMDAwMDAwMDAwTEwsIDAgfTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFR3b0U2NFtdICA9IHsgMHg0M2YwMDAwMDAwMDAwMDAwTEwsIDAgfTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFR3b0UxMjhbXSA9IHsgMHg0N2YwMDAwMDAwMDAwMDAwTEwsIDAgfTsKKyAgY29uc3QgdWludDY0X3QgKlBhcnRzID0gMDsKKworICBzd2l0Y2ggKFNyY1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoZmFsc2UgJiYgIlVuc3VwcG9ydGVkIFVJTlRfVE9fRlAhIik7CisgIGNhc2UgTVZUOjppMzI6CisgICAgUGFydHMgPSBUd29FMzI7CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjppNjQ6CisgICAgUGFydHMgPSBUd29FNjQ7CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjppMTI4OgorICAgIFBhcnRzID0gVHdvRTEyODsKKyAgICBicmVhazsKKyAgfQorCisgIExvID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgVlQsIEhpLAorICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudEZQKEFQRmxvYXQoQVBJbnQoMTI4LCAyLCBQYXJ0cykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6cHBjZjEyOCkpOworICBMbyA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNUX0NDLCBkbCwgVlQsIFNyYywgREFHLmdldENvbnN0YW50KDAsIFNyY1ZUKSwKKyAgICAgICAgICAgICAgICAgICBMbywgSGksIERBRy5nZXRDb25kQ29kZShJU0Q6OlNFVExUKSk7CisgIEdldFBhaXJFbGVtZW50cyhMbywgTG8sIEhpKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIEZsb2F0IE9wZXJhbmQgRXhwYW5zaW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRXhwYW5kRmxvYXRPcGVyYW5kIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHNwZWNpZmllZCBvcGVyYW5kIG9mIHRoZQorLy8vIHNwZWNpZmllZCBub2RlIGlzIGZvdW5kIHRvIG5lZWQgZXhwYW5zaW9uLiAgQXQgdGhpcyBwb2ludCwgYWxsIG9mIHRoZSByZXN1bHQKKy8vLyB0eXBlcyBvZiB0aGUgbm9kZSBhcmUga25vd24gdG8gYmUgbGVnYWwsIGJ1dCBvdGhlciBvcGVyYW5kcyBvZiB0aGUgbm9kZSBtYXkKKy8vLyBuZWVkIHByb21vdGlvbiBvciBleHBhbnNpb24gYXMgd2VsbCBhcyB0aGUgc3BlY2lmaWVkIG9uZS4KK2Jvb2wgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRPcGVyYW5kKFNETm9kZSAqTiwgdW5zaWduZWQgT3BObykgeworICBERUJVRyhkYmdzKCkgPDwgIkV4cGFuZCBmbG9hdCBvcGVyYW5kOiAiOyBOLT5kdW1wKCZEQUcpOyBkYmdzKCkgPDwgIlxuIik7CisgIFNEVmFsdWUgUmVzID0gU0RWYWx1ZSgpOworCisgIGlmIChUTEkuZ2V0T3BlcmF0aW9uQWN0aW9uKE4tPmdldE9wY29kZSgpLCBOLT5nZXRPcGVyYW5kKE9wTm8pLmdldFZhbHVlVHlwZSgpKQorICAgICAgPT0gVGFyZ2V0TG93ZXJpbmc6OkN1c3RvbSkKKyAgICBSZXMgPSBUTEkuTG93ZXJPcGVyYXRpb24oU0RWYWx1ZShOLCAwKSwgREFHKTsKKworICBpZiAoUmVzLmdldE5vZGUoKSA9PSAwKSB7CisgICAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6CisgICNpZm5kZWYgTkRFQlVHCisgICAgICBkYmdzKCkgPDwgIkV4cGFuZEZsb2F0T3BlcmFuZCBPcCAjIiA8PCBPcE5vIDw8ICI6ICI7CisgICAgICBOLT5kdW1wKCZEQUcpOyBkYmdzKCkgPDwgIlxuIjsKKyAgI2VuZGlmCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJEbyBub3Qga25vdyBob3cgdG8gZXhwYW5kIHRoaXMgb3BlcmF0b3IncyBvcGVyYW5kISIpOworCisgICAgY2FzZSBJU0Q6OkJJVF9DT05WRVJUOiAgICAgUmVzID0gRXhwYW5kT3BfQklUX0NPTlZFUlQoTik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpCVUlMRF9WRUNUT1I6ICAgIFJlcyA9IEV4cGFuZE9wX0JVSUxEX1ZFQ1RPUihOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkVYVFJBQ1RfRUxFTUVOVDogUmVzID0gRXhwYW5kT3BfRVhUUkFDVF9FTEVNRU5UKE4pOyBicmVhazsKKworICAgIGNhc2UgSVNEOjpCUl9DQzogICAgICBSZXMgPSBFeHBhbmRGbG9hdE9wX0JSX0NDKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6RlBfUk9VTkQ6ICAgUmVzID0gRXhwYW5kRmxvYXRPcF9GUF9ST1VORChOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkZQX1RPX1NJTlQ6IFJlcyA9IEV4cGFuZEZsb2F0T3BfRlBfVE9fU0lOVChOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkZQX1RPX1VJTlQ6IFJlcyA9IEV4cGFuZEZsb2F0T3BfRlBfVE9fVUlOVChOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFTEVDVF9DQzogIFJlcyA9IEV4cGFuZEZsb2F0T3BfU0VMRUNUX0NDKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUQ0M6ICAgICAgUmVzID0gRXhwYW5kRmxvYXRPcF9TRVRDQyhOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNUT1JFOiAgICAgIFJlcyA9IEV4cGFuZEZsb2F0T3BfU1RPUkUoY2FzdDxTdG9yZVNETm9kZT4oTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BObyk7IGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSByZXN1bHQgaXMgbnVsbCwgdGhlIHN1Yi1tZXRob2QgdG9vayBjYXJlIG9mIHJlZ2lzdGVyaW5nIHJlc3VsdHMgZXRjLgorICBpZiAoIVJlcy5nZXROb2RlKCkpIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGUgcmVzdWx0IGlzIE4sIHRoZSBzdWItbWV0aG9kIHVwZGF0ZWQgTiBpbiBwbGFjZS4gIFRlbGwgdGhlIGxlZ2FsaXplcgorICAvLyBjb3JlIGFib3V0IHRoaXMuCisgIGlmIChSZXMuZ2V0Tm9kZSgpID09IE4pCisgICAgcmV0dXJuIHRydWU7CisKKyAgYXNzZXJ0KFJlcy5nZXRWYWx1ZVR5cGUoKSA9PSBOLT5nZXRWYWx1ZVR5cGUoMCkgJiYgTi0+Z2V0TnVtVmFsdWVzKCkgPT0gMSAmJgorICAgICAgICAgIkludmFsaWQgb3BlcmFuZCBleHBhbnNpb24iKTsKKworICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTiwgMCksIFJlcyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEZsb2F0RXhwYW5kU2V0Q0NPcGVyYW5kcyAtIEV4cGFuZCB0aGUgb3BlcmFuZHMgb2YgYSBjb21wYXJpc29uLiAgVGhpcyBjb2RlCisvLy8gaXMgc2hhcmVkIGFtb25nIEJSX0NDLCBTRUxFQ1RfQ0MsIGFuZCBTRVRDQyBoYW5kbGVycy4KK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RmxvYXRFeHBhbmRTZXRDQ09wZXJhbmRzKFNEVmFsdWUgJk5ld0xIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk5ld1JIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Q29uZENvZGUgJkNDQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIFNEVmFsdWUgTEhTTG8sIExIU0hpLCBSSFNMbywgUkhTSGk7CisgIEdldEV4cGFuZGVkRmxvYXQoTmV3TEhTLCBMSFNMbywgTEhTSGkpOworICBHZXRFeHBhbmRlZEZsb2F0KE5ld1JIUywgUkhTTG8sIFJIU0hpKTsKKworICBFVlQgVlQgPSBOZXdMSFMuZ2V0VmFsdWVUeXBlKCk7CisgIGFzc2VydChWVCA9PSBNVlQ6OnBwY2YxMjggJiYgIlVuc3VwcG9ydGVkIHNldGNjIHR5cGUhIik7CisKKyAgLy8gRklYTUU6ICBUaGlzIGdlbmVyYXRlZCBjb2RlIHN1Y2tzLiAgV2Ugd2FudCB0byBnZW5lcmF0ZQorICAvLyAgICAgICAgIEZDTVBVIGNyTiwgaGkxLCBoaTIKKyAgLy8gICAgICAgICBCTkUgY3JOLCBMOgorICAvLyAgICAgICAgIEZDTVBVIGNyTiwgbG8xLCBsbzIKKyAgLy8gVGhlIGZvbGxvd2luZyBjYW4gYmUgaW1wcm92ZWQsIGJ1dCBub3QgdGhhdCBtdWNoLgorICBTRFZhbHVlIFRtcDEsIFRtcDIsIFRtcDM7CisgIFRtcDEgPSBEQUcuZ2V0U2V0Q0MoZGwsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoTEhTSGkuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgIExIU0hpLCBSSFNIaSwgSVNEOjpTRVRPRVEpOworICBUbXAyID0gREFHLmdldFNldENDKGRsLCBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKExIU0xvLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBMSFNMbywgUkhTTG8sIENDQ29kZSk7CisgIFRtcDMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIFRtcDEuZ2V0VmFsdWVUeXBlKCksIFRtcDEsIFRtcDIpOworICBUbXAxID0gREFHLmdldFNldENDKGRsLCBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKExIU0hpLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBMSFNIaSwgUkhTSGksIElTRDo6U0VUVU5FKTsKKyAgVG1wMiA9IERBRy5nZXRTZXRDQyhkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShMSFNIaS5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgTEhTSGksIFJIU0hpLCBDQ0NvZGUpOworICBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBUbXAxLmdldFZhbHVlVHlwZSgpLCBUbXAxLCBUbXAyKTsKKyAgTmV3TEhTID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFRtcDEuZ2V0VmFsdWVUeXBlKCksIFRtcDEsIFRtcDMpOworICBOZXdSSFMgPSBTRFZhbHVlKCk7ICAgLy8gTEhTIGlzIHRoZSByZXN1bHQsIG5vdCBhIGNvbXBhcmUuCit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kRmxvYXRPcF9CUl9DQyhTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOZXdMSFMgPSBOLT5nZXRPcGVyYW5kKDIpLCBOZXdSSFMgPSBOLT5nZXRPcGVyYW5kKDMpOworICBJU0Q6OkNvbmRDb2RlIENDQ29kZSA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpLT5nZXQoKTsKKyAgRmxvYXRFeHBhbmRTZXRDQ09wZXJhbmRzKE5ld0xIUywgTmV3UkhTLCBDQ0NvZGUsIE4tPmdldERlYnVnTG9jKCkpOworCisgIC8vIElmIEV4cGFuZFNldENDT3BlcmFuZHMgcmV0dXJuZWQgYSBzY2FsYXIsIHdlIG5lZWQgdG8gY29tcGFyZSB0aGUgcmVzdWx0CisgIC8vIGFnYWluc3QgemVybyB0byBzZWxlY3QgYmV0d2VlbiB0cnVlIGFuZCBmYWxzZSB2YWx1ZXMuCisgIGlmIChOZXdSSFMuZ2V0Tm9kZSgpID09IDApIHsKKyAgICBOZXdSSFMgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTmV3TEhTLmdldFZhbHVlVHlwZSgpKTsKKyAgICBDQ0NvZGUgPSBJU0Q6OlNFVE5FOworICB9CisKKyAgLy8gVXBkYXRlIE4gdG8gaGF2ZSB0aGUgb3BlcmFuZHMgc3BlY2lmaWVkLgorICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25kQ29kZShDQ0NvZGUpLCBOZXdMSFMsIE5ld1JIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCg0KSksIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0T3BfRlBfUk9VTkQoU0ROb2RlICpOKSB7CisgIGFzc2VydChOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpID09IE1WVDo6cHBjZjEyOCAmJgorICAgICAgICAgIkxvZ2ljIG9ubHkgY29ycmVjdCBmb3IgcHBjZjEyOCEiKTsKKyAgU0RWYWx1ZSBMbywgSGk7CisgIEdldEV4cGFuZGVkRmxvYXQoTi0+Z2V0T3BlcmFuZCgwKSwgTG8sIEhpKTsKKyAgLy8gUm91bmQgaXQgdGhlIHJlc3Qgb2YgdGhlIHdheSAoZS5nLiB0byBmMzIpIGlmIG5lZWRlZC4KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RlBfUk9VTkQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBOLT5nZXRWYWx1ZVR5cGUoMCksIEhpLCBOLT5nZXRPcGVyYW5kKDEpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdE9wX0ZQX1RPX1NJTlQoU0ROb2RlICpOKSB7CisgIEVWVCBSVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBFeHBhbmQgcHBjZjEyOCB0byBpMzIgYnkgaGFuZCBmb3IgdGhlIGJlbmVmaXQgb2YgbGx2bS1nY2MgYm9vdHN0cmFwIG9uCisgIC8vIFBQQyAodGhlIGxpYmNhbGwgaXMgbm90IGF2YWlsYWJsZSkuICBGSVhNRTogRG8gdGhpcyBpbiBhIGxlc3MgaGFja3kgd2F5LgorICBpZiAoUlZUID09IE1WVDo6aTMyKSB7CisgICAgYXNzZXJ0KE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpwcGNmMTI4ICYmCisgICAgICAgICAgICJMb2dpYyBvbmx5IGNvcnJlY3QgZm9yIHBwY2YxMjghIik7CisgICAgU0RWYWx1ZSBSZXMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1JPVU5EX0lOUkVHLCBkbCwgTVZUOjpwcGNmMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgwKSwgREFHLmdldFZhbHVlVHlwZShNVlQ6OmY2NCkpOworICAgIFJlcyA9IERBRy5nZXROb2RlKElTRDo6RlBfUk9VTkQsIGRsLCBNVlQ6OmY2NCwgUmVzLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgxKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RlBfVE9fU0lOVCwgZGwsIE1WVDo6aTMyLCBSZXMpOworICB9CisKKyAgUlRMSUI6OkxpYmNhbGwgTEMgPSBSVExJQjo6Z2V0RlBUT1NJTlQoTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSwgUlZUKTsKKyAgYXNzZXJ0KExDICE9IFJUTElCOjpVTktOT1dOX0xJQkNBTEwgJiYgIlVuc3VwcG9ydGVkIEZQX1RPX1NJTlQhIik7CisgIHJldHVybiBNYWtlTGliQ2FsbChMQywgUlZULCAmTi0+Z2V0T3BlcmFuZCgwKSwgMSwgZmFsc2UsIGRsKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdE9wX0ZQX1RPX1VJTlQoU0ROb2RlICpOKSB7CisgIEVWVCBSVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBFeHBhbmQgcHBjZjEyOCB0byBpMzIgYnkgaGFuZCBmb3IgdGhlIGJlbmVmaXQgb2YgbGx2bS1nY2MgYm9vdHN0cmFwIG9uCisgIC8vIFBQQyAodGhlIGxpYmNhbGwgaXMgbm90IGF2YWlsYWJsZSkuICBGSVhNRTogRG8gdGhpcyBpbiBhIGxlc3MgaGFja3kgd2F5LgorICBpZiAoUlZUID09IE1WVDo6aTMyKSB7CisgICAgYXNzZXJ0KE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpwcGNmMTI4ICYmCisgICAgICAgICAgICJMb2dpYyBvbmx5IGNvcnJlY3QgZm9yIHBwY2YxMjghIik7CisgICAgY29uc3QgdWludDY0X3QgVHdvRTMxW10gPSB7MHg0MWUwMDAwMDAwMDAwMDAwTEwsIDB9OworICAgIEFQRmxvYXQgQVBGID0gQVBGbG9hdChBUEludCgxMjgsIDIsIFR3b0UzMSkpOworICAgIFNEVmFsdWUgVG1wID0gREFHLmdldENvbnN0YW50RlAoQVBGLCBNVlQ6OnBwY2YxMjgpOworICAgIC8vICBYPj0yXjMxID8gKGludCkoWC0yXjMxKSsweDgwMDAwMDAwIDogKGludClYCisgICAgLy8gRklYTUU6IGdlbmVyYXRlZCBjb2RlIHN1Y2tzLgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVF9DQywgZGwsIE1WVDo6aTMyLCBOLT5nZXRPcGVyYW5kKDApLCBUbXAsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6RlBfVE9fU0lOVCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OnBwY2YxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRtcCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMHg4MDAwMDAwMCwgTVZUOjppMzIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpGUF9UT19TSU5ULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIsIE4tPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uZENvZGUoSVNEOjpTRVRHRSkpOworICB9CisKKyAgUlRMSUI6OkxpYmNhbGwgTEMgPSBSVExJQjo6Z2V0RlBUT1VJTlQoTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSwgUlZUKTsKKyAgYXNzZXJ0KExDICE9IFJUTElCOjpVTktOT1dOX0xJQkNBTEwgJiYgIlVuc3VwcG9ydGVkIEZQX1RPX1VJTlQhIik7CisgIHJldHVybiBNYWtlTGliQ2FsbChMQywgTi0+Z2V0VmFsdWVUeXBlKDApLCAmTi0+Z2V0T3BlcmFuZCgwKSwgMSwgZmFsc2UsIGRsKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRGbG9hdE9wX1NFTEVDVF9DQyhTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBOZXdMSFMgPSBOLT5nZXRPcGVyYW5kKDApLCBOZXdSSFMgPSBOLT5nZXRPcGVyYW5kKDEpOworICBJU0Q6OkNvbmRDb2RlIENDQ29kZSA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KE4tPmdldE9wZXJhbmQoNCkpLT5nZXQoKTsKKyAgRmxvYXRFeHBhbmRTZXRDQ09wZXJhbmRzKE5ld0xIUywgTmV3UkhTLCBDQ0NvZGUsIE4tPmdldERlYnVnTG9jKCkpOworCisgIC8vIElmIEV4cGFuZFNldENDT3BlcmFuZHMgcmV0dXJuZWQgYSBzY2FsYXIsIHdlIG5lZWQgdG8gY29tcGFyZSB0aGUgcmVzdWx0CisgIC8vIGFnYWluc3QgemVybyB0byBzZWxlY3QgYmV0d2VlbiB0cnVlIGFuZCBmYWxzZSB2YWx1ZXMuCisgIGlmIChOZXdSSFMuZ2V0Tm9kZSgpID09IDApIHsKKyAgICBOZXdSSFMgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTmV3TEhTLmdldFZhbHVlVHlwZSgpKTsKKyAgICBDQ0NvZGUgPSBJU0Q6OlNFVE5FOworICB9CisKKyAgLy8gVXBkYXRlIE4gdG8gaGF2ZSB0aGUgb3BlcmFuZHMgc3BlY2lmaWVkLgorICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sIE5ld0xIUywgTmV3UkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDIpLCBOLT5nZXRPcGVyYW5kKDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uZENvZGUoQ0NDb2RlKSksIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0T3BfU0VUQ0MoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTmV3TEhTID0gTi0+Z2V0T3BlcmFuZCgwKSwgTmV3UkhTID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgSVNEOjpDb25kQ29kZSBDQ0NvZGUgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihOLT5nZXRPcGVyYW5kKDIpKS0+Z2V0KCk7CisgIEZsb2F0RXhwYW5kU2V0Q0NPcGVyYW5kcyhOZXdMSFMsIE5ld1JIUywgQ0NDb2RlLCBOLT5nZXREZWJ1Z0xvYygpKTsKKworICAvLyBJZiBFeHBhbmRTZXRDQ09wZXJhbmRzIHJldHVybmVkIGEgc2NhbGFyLCB1c2UgaXQuCisgIGlmIChOZXdSSFMuZ2V0Tm9kZSgpID09IDApIHsKKyAgICBhc3NlcnQoTmV3TEhTLmdldFZhbHVlVHlwZSgpID09IE4tPmdldFZhbHVlVHlwZSgwKSAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBzZXRjYyBleHBhbnNpb24hIik7CisgICAgcmV0dXJuIE5ld0xIUzsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgdXBkYXRlIE4gdG8gaGF2ZSB0aGUgb3BlcmFuZHMgc3BlY2lmaWVkLgorICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sIE5ld0xIUywgTmV3UkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uZENvZGUoQ0NDb2RlKSksIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEZsb2F0T3BfU1RPUkUoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKSB7CisgIGlmIChJU0Q6OmlzTm9ybWFsU3RvcmUoTikpCisgICAgcmV0dXJuIEV4cGFuZE9wX05vcm1hbFN0b3JlKE4sIE9wTm8pOworCisgIGFzc2VydChJU0Q6OmlzVU5JTkRFWEVEU3RvcmUoTikgJiYgIkluZGV4ZWQgc3RvcmUgZHVyaW5nIHR5cGUgbGVnYWxpemF0aW9uISIpOworICBhc3NlcnQoT3BObyA9PSAxICYmICJDYW4gb25seSBleHBhbmQgdGhlIHN0b3JlZCB2YWx1ZSBzbyBmYXIiKTsKKyAgU3RvcmVTRE5vZGUgKlNUID0gY2FzdDxTdG9yZVNETm9kZT4oTik7CisKKyAgU0RWYWx1ZSBDaGFpbiA9IFNULT5nZXRDaGFpbigpOworICBTRFZhbHVlIFB0ciA9IFNULT5nZXRCYXNlUHRyKCk7CisKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0VmFsdWUoKS5nZXRWYWx1ZVR5cGUoKSk7CisgIGFzc2VydChOVlQuaXNCeXRlU2l6ZWQoKSAmJiAiRXhwYW5kZWQgdHlwZSBub3QgYnl0ZSBzaXplZCEiKTsKKyAgYXNzZXJ0KFNULT5nZXRNZW1vcnlWVCgpLmJpdHNMRShOVlQpICYmICJGbG9hdCB0eXBlIG5vdCByb3VuZD8iKTsKKworICBTRFZhbHVlIExvLCBIaTsKKyAgR2V0RXhwYW5kZWRPcChTVC0+Z2V0VmFsdWUoKSwgTG8sIEhpKTsKKworICByZXR1cm4gREFHLmdldFRydW5jU3RvcmUoQ2hhaW4sIE4tPmdldERlYnVnTG9jKCksIEhpLCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0U3JjVmFsdWUoKSwgU1QtPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0TWVtb3J5VlQoKSwgU1QtPmlzVm9sYXRpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5pc05vblRlbXBvcmFsKCksIFNULT5nZXRBbGlnbm1lbnQoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvTGVnYWxpemVJbnRlZ2VyVHlwZXMuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplSW50ZWdlclR5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGM1ODkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplSW50ZWdlclR5cGVzLmNwcApAQCAtMCwwICsxLDI0NzQgQEAKKy8vPT09LS0tLS0gTGVnYWxpemVJbnRlZ2VyVHlwZXMuY3BwIC0gTGVnYWxpemF0aW9uIG9mIGludGVnZXIgdHlwZXMgLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgaW50ZWdlciB0eXBlIGV4cGFuc2lvbiBhbmQgcHJvbW90aW9uIGZvciBMZWdhbGl6ZVR5cGVzLgorLy8gUHJvbW90aW9uIGlzIHRoZSBhY3Qgb2YgY2hhbmdpbmcgYSBjb21wdXRhdGlvbiBpbiBhbiBpbGxlZ2FsIHR5cGUgaW50byBhCisvLyBjb21wdXRhdGlvbiBpbiBhIGxhcmdlciB0eXBlLiAgRm9yIGV4YW1wbGUsIGltcGxlbWVudGluZyBpOCBhcml0aG1ldGljIGluIGFuCisvLyBpMzIgcmVnaXN0ZXIgKG9mdGVuIG5lZWRlZCBvbiBwb3dlcnBjKS4KKy8vIEV4cGFuc2lvbiBpcyB0aGUgYWN0IG9mIGNoYW5naW5nIGEgY29tcHV0YXRpb24gaW4gYW4gaWxsZWdhbCB0eXBlIGludG8gYQorLy8gY29tcHV0YXRpb24gaW4gdHdvIGlkZW50aWNhbCByZWdpc3RlcnMgb2YgYSBzbWFsbGVyIHR5cGUuICBGb3IgZXhhbXBsZSwKKy8vIGltcGxlbWVudGluZyBpNjQgYXJpdGhtZXRpYyBpbiB0d28gaTMyIHJlZ2lzdGVycyAob2Z0ZW4gbmVlZGVkIG9uIDMyLWJpdAorLy8gdGFyZ2V0cykuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkxlZ2FsaXplVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgSW50ZWdlciBSZXN1bHQgUHJvbW90aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gUHJvbW90ZUludGVnZXJSZXN1bHQgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIHJlc3VsdCBvZiBhIG5vZGUgaXMKKy8vLyBmb3VuZCB0byBiZSBpbiBuZWVkIG9mIHByb21vdGlvbiB0byBhIGxhcmdlciB0eXBlLiAgQXQgdGhpcyBwb2ludCwgdGhlIG5vZGUKKy8vLyBtYXkgYWxzbyBoYXZlIGludmFsaWQgb3BlcmFuZHMgb3IgbWF5IGhhdmUgb3RoZXIgcmVzdWx0cyB0aGF0IG5lZWQKKy8vLyBleHBhbnNpb24sIHdlIGp1c3Qga25vdyB0aGF0IChhdCBsZWFzdCkgb25lIHJlc3VsdCBuZWVkcyBwcm9tb3Rpb24uCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRlZ2VyUmVzdWx0KFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTm8pIHsKKyAgREVCVUcoZGJncygpIDw8ICJQcm9tb3RlIGludGVnZXIgcmVzdWx0OiAiOyBOLT5kdW1wKCZEQUcpOyBkYmdzKCkgPDwgIlxuIik7CisgIFNEVmFsdWUgUmVzID0gU0RWYWx1ZSgpOworCisgIC8vIFNlZSBpZiB0aGUgdGFyZ2V0IHdhbnRzIHRvIGN1c3RvbSBleHBhbmQgdGhpcyBub2RlLgorICBpZiAoQ3VzdG9tTG93ZXJOb2RlKE4sIE4tPmdldFZhbHVlVHlwZShSZXNObyksIHRydWUpKQorICAgIHJldHVybjsKKworICBzd2l0Y2ggKE4tPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6CisjaWZuZGVmIE5ERUJVRworICAgIGRiZ3MoKSA8PCAiUHJvbW90ZUludGVnZXJSZXN1bHQgIyIgPDwgUmVzTm8gPDwgIjogIjsKKyAgICBOLT5kdW1wKCZEQUcpOyBkYmdzKCkgPDwgIlxuIjsKKyNlbmRpZgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkRvIG5vdCBrbm93IGhvdyB0byBwcm9tb3RlIHRoaXMgb3BlcmF0b3IhIik7CisgIGNhc2UgSVNEOjpBc3NlcnRTZXh0OiAgUmVzID0gUHJvbW90ZUludFJlc19Bc3NlcnRTZXh0KE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkFzc2VydFpleHQ6ICBSZXMgPSBQcm9tb3RlSW50UmVzX0Fzc2VydFpleHQoTik7IGJyZWFrOworICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6IFJlcyA9IFByb21vdGVJbnRSZXNfQklUX0NPTlZFUlQoTik7IGJyZWFrOworICBjYXNlIElTRDo6QlNXQVA6ICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfQlNXQVAoTik7IGJyZWFrOworICBjYXNlIElTRDo6QlVJTERfUEFJUjogIFJlcyA9IFByb21vdGVJbnRSZXNfQlVJTERfUEFJUihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpDb25zdGFudDogICAgUmVzID0gUHJvbW90ZUludFJlc19Db25zdGFudChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpDT05WRVJUX1JORFNBVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXMgPSBQcm9tb3RlSW50UmVzX0NPTlZFUlRfUk5EU0FUKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkNUTFo6ICAgICAgICBSZXMgPSBQcm9tb3RlSW50UmVzX0NUTFooTik7IGJyZWFrOworICBjYXNlIElTRDo6Q1RQT1A6ICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfQ1RQT1AoTik7IGJyZWFrOworICBjYXNlIElTRDo6Q1RUWjogICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfQ1RUWihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzID0gUHJvbW90ZUludFJlc19FWFRSQUNUX1ZFQ1RPUl9FTFQoTik7IGJyZWFrOworICBjYXNlIElTRDo6TE9BRDogICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfTE9BRChjYXN0PExvYWRTRE5vZGU+KE4pKTticmVhazsKKyAgY2FzZSBJU0Q6OlNFTEVDVDogICAgICBSZXMgPSBQcm9tb3RlSW50UmVzX1NFTEVDVChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6ICAgUmVzID0gUHJvbW90ZUludFJlc19TRUxFQ1RfQ0MoTik7IGJyZWFrOworICBjYXNlIElTRDo6U0VUQ0M6ICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfU0VUQ0MoTik7IGJyZWFrOworICBjYXNlIElTRDo6U0hMOiAgICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfU0hMKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EX0lOUkVHOgorICAgICAgICAgICAgICAgICAgICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfU0lHTl9FWFRFTkRfSU5SRUcoTik7IGJyZWFrOworICBjYXNlIElTRDo6U1JBOiAgICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfU1JBKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNSTDogICAgICAgICBSZXMgPSBQcm9tb3RlSW50UmVzX1NSTChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpUUlVOQ0FURTogICAgUmVzID0gUHJvbW90ZUludFJlc19UUlVOQ0FURShOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpVTkRFRjogICAgICAgUmVzID0gUHJvbW90ZUludFJlc19VTkRFRihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpWQUFSRzogICAgICAgUmVzID0gUHJvbW90ZUludFJlc19WQUFSRyhOKTsgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOgorICBjYXNlIElTRDo6WkVST19FWFRFTkQ6CisgIGNhc2UgSVNEOjpBTllfRVhURU5EOiAgUmVzID0gUHJvbW90ZUludFJlc19JTlRfRVhURU5EKE4pOyBicmVhazsKKworICBjYXNlIElTRDo6RlBfVE9fU0lOVDoKKyAgY2FzZSBJU0Q6OkZQX1RPX1VJTlQ6ICBSZXMgPSBQcm9tb3RlSW50UmVzX0ZQX1RPX1hJTlQoTik7IGJyZWFrOworCisgIGNhc2UgSVNEOjpGUDMyX1RPX0ZQMTY6UmVzID0gUHJvbW90ZUludFJlc19GUDMyX1RPX0ZQMTYoTik7IGJyZWFrOworCisgIGNhc2UgSVNEOjpBTkQ6CisgIGNhc2UgSVNEOjpPUjoKKyAgY2FzZSBJU0Q6OlhPUjoKKyAgY2FzZSBJU0Q6OkFERDoKKyAgY2FzZSBJU0Q6OlNVQjoKKyAgY2FzZSBJU0Q6Ok1VTDogICAgICAgICBSZXMgPSBQcm9tb3RlSW50UmVzX1NpbXBsZUludEJpbk9wKE4pOyBicmVhazsKKworICBjYXNlIElTRDo6U0RJVjoKKyAgY2FzZSBJU0Q6OlNSRU06ICAgICAgICBSZXMgPSBQcm9tb3RlSW50UmVzX1NESVYoTik7IGJyZWFrOworCisgIGNhc2UgSVNEOjpVRElWOgorICBjYXNlIElTRDo6VVJFTTogICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfVURJVihOKTsgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OlNBRERPOgorICBjYXNlIElTRDo6U1NVQk86ICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfU0FERFNVQk8oTiwgUmVzTm8pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlVBRERPOgorICBjYXNlIElTRDo6VVNVQk86ICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfVUFERFNVQk8oTiwgUmVzTm8pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNNVUxPOgorICBjYXNlIElTRDo6VU1VTE86ICAgICAgIFJlcyA9IFByb21vdGVJbnRSZXNfWE1VTE8oTiwgUmVzTm8pOyBicmVhazsKKworICBjYXNlIElTRDo6QVRPTUlDX0xPQURfQUREOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfU1VCOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfQU5EOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfT1I6CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9YT1I6CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9OQU5EOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfTUlOOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfTUFYOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfVU1JTjoKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1VNQVg6CisgIGNhc2UgSVNEOjpBVE9NSUNfU1dBUDoKKyAgICBSZXMgPSBQcm9tb3RlSW50UmVzX0F0b21pYzEoY2FzdDxBdG9taWNTRE5vZGU+KE4pKTsgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OkFUT01JQ19DTVBfU1dBUDoKKyAgICBSZXMgPSBQcm9tb3RlSW50UmVzX0F0b21pYzIoY2FzdDxBdG9taWNTRE5vZGU+KE4pKTsgYnJlYWs7CisgIH0KKworICAvLyBJZiB0aGUgcmVzdWx0IGlzIG51bGwgdGhlbiB0aGUgc3ViLW1ldGhvZCB0b29rIGNhcmUgb2YgcmVnaXN0ZXJpbmcgaXQuCisgIGlmIChSZXMuZ2V0Tm9kZSgpKQorICAgIFNldFByb21vdGVkSW50ZWdlcihTRFZhbHVlKE4sIFJlc05vKSwgUmVzKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50UmVzX0Fzc2VydFNleHQoU0ROb2RlICpOKSB7CisgIC8vIFNpZ24tZXh0ZW5kIHRoZSBuZXcgYml0cywgYW5kIGNvbnRpbnVlIHRoZSBhc3NlcnRpb24uCisgIFNEVmFsdWUgT3AgPSBTRXh0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBc3NlcnRTZXh0LCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0VmFsdWVUeXBlKCksIE9wLCBOLT5nZXRPcGVyYW5kKDEpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50UmVzX0Fzc2VydFpleHQoU0ROb2RlICpOKSB7CisgIC8vIFplcm8gdGhlIG5ldyBiaXRzLCBhbmQgY29udGludWUgdGhlIGFzc2VydGlvbi4KKyAgU0RWYWx1ZSBPcCA9IFpFeHRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFpleHQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBPcC5nZXRWYWx1ZVR5cGUoKSwgT3AsIE4tPmdldE9wZXJhbmQoMSkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfQXRvbWljMShBdG9taWNTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBPcDIgPSBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgyKSk7CisgIFNEVmFsdWUgUmVzID0gREFHLmdldEF0b21pYyhOLT5nZXRPcGNvZGUoKSwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE1lbW9yeVZUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRDaGFpbigpLCBOLT5nZXRCYXNlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDIsIE4tPmdldFNyY1ZhbHVlKCksIE4tPmdldEFsaWdubWVudCgpKTsKKyAgLy8gTGVnYWxpemVkIHRoZSBjaGFpbiByZXN1bHQgLSBzd2l0Y2ggYW55dGhpbmcgdGhhdCB1c2VkIHRoZSBvbGQgY2hhaW4gdG8KKyAgLy8gdXNlIHRoZSBuZXcgb25lLgorICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksIFJlcy5nZXRWYWx1ZSgxKSk7CisgIHJldHVybiBSZXM7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludFJlc19BdG9taWMyKEF0b21pY1NETm9kZSAqTikgeworICBTRFZhbHVlIE9wMiA9IEdldFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDIpKTsKKyAgU0RWYWx1ZSBPcDMgPSBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgzKSk7CisgIFNEVmFsdWUgUmVzID0gREFHLmdldEF0b21pYyhOLT5nZXRPcGNvZGUoKSwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE1lbW9yeVZUKCksIE4tPmdldENoYWluKCksIE4tPmdldEJhc2VQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wMiwgT3AzLCBOLT5nZXRTcmNWYWx1ZSgpLCBOLT5nZXRBbGlnbm1lbnQoKSk7CisgIC8vIExlZ2FsaXplZCB0aGUgY2hhaW4gcmVzdWx0IC0gc3dpdGNoIGFueXRoaW5nIHRoYXQgdXNlZCB0aGUgb2xkIGNoYWluIHRvCisgIC8vIHVzZSB0aGUgbmV3IG9uZS4KKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBSZXMuZ2V0VmFsdWUoMSkpOworICByZXR1cm4gUmVzOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfQklUX0NPTlZFUlQoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgSW5PcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIEVWVCBJblZUID0gSW5PcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIE5JblZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBJblZUKTsKKyAgRVZUIE91dFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBFVlQgTk91dFZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBPdXRWVCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBzd2l0Y2ggKGdldFR5cGVBY3Rpb24oSW5WVCkpIHsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoZmFsc2UgJiYgIlVua25vd24gdHlwZSBhY3Rpb24hIik7CisgICAgYnJlYWs7CisgIGNhc2UgTGVnYWw6CisgICAgYnJlYWs7CisgIGNhc2UgUHJvbW90ZUludGVnZXI6CisgICAgaWYgKE5PdXRWVC5iaXRzRXEoTkluVlQpKQorICAgICAgLy8gVGhlIGlucHV0IHByb21vdGVzIHRvIHRoZSBzYW1lIHNpemUuICBDb252ZXJ0IHRoZSBwcm9tb3RlZCB2YWx1ZS4KKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOT3V0VlQsIEdldFByb21vdGVkSW50ZWdlcihJbk9wKSk7CisgICAgYnJlYWs7CisgIGNhc2UgU29mdGVuRmxvYXQ6CisgICAgLy8gUHJvbW90ZSB0aGUgaW50ZWdlciBvcGVyYW5kIGJ5IGhhbmQuCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIE5PdXRWVCwgR2V0U29mdGVuZWRGbG9hdChJbk9wKSk7CisgIGNhc2UgRXhwYW5kSW50ZWdlcjoKKyAgY2FzZSBFeHBhbmRGbG9hdDoKKyAgICBicmVhazsKKyAgY2FzZSBTY2FsYXJpemVWZWN0b3I6CisgICAgLy8gQ29udmVydCB0aGUgZWxlbWVudCB0byBhbiBpbnRlZ2VyIGFuZCBwcm9tb3RlIGl0IGJ5IGhhbmQuCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIE5PdXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgQml0Q29udmVydFRvSW50ZWdlcihHZXRTY2FsYXJpemVkVmVjdG9yKEluT3ApKSk7CisgIGNhc2UgU3BsaXRWZWN0b3I6IHsKKyAgICAvLyBGb3IgZXhhbXBsZSwgaTMyID0gQklUX0NPTlZFUlQgdjJpMTYgb24gYWxwaGEuICBDb252ZXJ0IHRoZSBzcGxpdAorICAgIC8vIHBpZWNlcyBvZiB0aGUgaW5wdXQgaW50byBpbnRlZ2VycyBhbmQgcmVhc3NlbWJsZSBpbiB0aGUgZmluYWwgdHlwZS4KKyAgICBTRFZhbHVlIExvLCBIaTsKKyAgICBHZXRTcGxpdFZlY3RvcihOLT5nZXRPcGVyYW5kKDApLCBMbywgSGkpOworICAgIExvID0gQml0Q29udmVydFRvSW50ZWdlcihMbyk7CisgICAgSGkgPSBCaXRDb252ZXJ0VG9JbnRlZ2VyKEhpKTsKKworICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICAgIHN0ZDo6c3dhcChMbywgSGkpOworCisgICAgSW5PcCA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgIEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT3V0VlQuZ2V0U2l6ZUluQml0cygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgSm9pbkludGVnZXJzKExvLCBIaSkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTk91dFZULCBJbk9wKTsKKyAgfQorICBjYXNlIFdpZGVuVmVjdG9yOgorICAgIGlmIChPdXRWVC5iaXRzRXEoTkluVlQpKQorICAgICAgLy8gVGhlIGlucHV0IGlzIHdpZGVuZWQgdG8gdGhlIHNhbWUgc2l6ZS4gIENvbnZlcnQgdG8gdGhlIHdpZGVuZWQgdmFsdWUuCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE91dFZULCBHZXRXaWRlbmVkVmVjdG9yKEluT3ApKTsKKyAgfQorCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLCBOT3V0VlQsCisgICAgICAgICAgICAgICAgICAgICBDcmVhdGVTdGFja1N0b3JlTG9hZChJbk9wLCBPdXRWVCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfQlNXQVAoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgT3AgPSBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIEVWVCBPVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBOVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIHVuc2lnbmVkIERpZmZCaXRzID0gTlZULmdldFNpemVJbkJpdHMoKSAtIE9WVC5nZXRTaXplSW5CaXRzKCk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE5WVCwgREFHLmdldE5vZGUoSVNEOjpCU1dBUCwgZGwsIE5WVCwgT3ApLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KERpZmZCaXRzLCBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50UmVzX0JVSUxEX1BBSVIoU0ROb2RlICpOKSB7CisgIC8vIFRoZSBwYWlyIGVsZW1lbnQgdHlwZSBtYXkgYmUgbGVnYWwsIG9yIG1heSBub3QgcHJvbW90ZSB0byB0aGUgc2FtZSB0eXBlIGFzCisgIC8vIHRoZSByZXN1bHQsIGZvciBleGFtcGxlIGkxNCA9IEJVSUxEX1BBSVIgKGk3LCBpNykuICBIYW5kbGUgYWxsIGNhc2VzLgorICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0VmFsdWVUeXBlKDApKSwgSm9pbkludGVnZXJzKE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDEpKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludFJlc19Db25zdGFudChTRE5vZGUgKk4pIHsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICAvLyBGSVhNRSB0aGVyZSBpcyBubyBhY3R1YWwgZGVidWcgaW5mbyBoZXJlCisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgLy8gWmVybyBleHRlbmQgdGhpbmdzIGxpa2UgaTEsIHNpZ24gZXh0ZW5kIGV2ZXJ5dGhpbmcgZWxzZS4gIEl0IHNob3VsZG4ndAorICAvLyBtYXR0ZXIgaW4gdGhlb3J5IHdoaWNoIG9uZSB3ZSBwaWNrLCBidXQgdGhpcyB0ZW5kcyB0byBnaXZlIGJldHRlciBjb2RlPworICB1bnNpZ25lZCBPcGMgPSBWVC5pc0J5dGVTaXplZCgpID8gSVNEOjpTSUdOX0VYVEVORCA6IElTRDo6WkVST19FWFRFTkQ7CisgIFNEVmFsdWUgUmVzdWx0ID0gREFHLmdldE5vZGUoT3BjLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKE4sIDApKTsKKyAgYXNzZXJ0KGlzYTxDb25zdGFudFNETm9kZT4oUmVzdWx0KSAmJiAiRGlkbid0IGNvbnN0YW50IGZvbGQgZXh0PyIpOworICByZXR1cm4gUmVzdWx0OworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfQ09OVkVSVF9STkRTQVQoU0ROb2RlICpOKSB7CisgIElTRDo6Q3Z0Q29kZSBDdnRDb2RlID0gY2FzdDxDdnRSbmRTYXRTRE5vZGU+KE4pLT5nZXRDdnRDb2RlKCk7CisgIGFzc2VydCAoKEN2dENvZGUgPT0gSVNEOjpDVlRfU1MgfHwgQ3Z0Q29kZSA9PSBJU0Q6OkNWVF9TVSB8fAorICAgICAgICAgICBDdnRDb2RlID09IElTRDo6Q1ZUX1VTIHx8IEN2dENvZGUgPT0gSVNEOjpDVlRfVVUgfHwKKyAgICAgICAgICAgQ3Z0Q29kZSA9PSBJU0Q6OkNWVF9TRiB8fCBDdnRDb2RlID09IElTRDo6Q1ZUX1VGKSAmJgorICAgICAgICAgICJjYW4gb25seSBwcm9tb3RlIGludGVnZXJzIik7CisgIEVWVCBPdXRWVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgcmV0dXJuIERBRy5nZXRDb252ZXJ0Um5kU2F0KE91dFZULCBOLT5nZXREZWJ1Z0xvYygpLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKSwgTi0+Z2V0T3BlcmFuZCgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMyksIE4tPmdldE9wZXJhbmQoNCksIEN2dENvZGUpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfQ1RMWihTRE5vZGUgKk4pIHsKKyAgLy8gWmVybyBleHRlbmQgdG8gdGhlIHByb21vdGVkIHR5cGUgYW5kIGRvIHRoZSBjb3VudCB0aGVyZS4KKyAgU0RWYWx1ZSBPcCA9IFpFeHRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgRVZUIE9WVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRVZUIE5WVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBPcCA9IERBRy5nZXROb2RlKElTRDo6Q1RMWiwgZGwsIE5WVCwgT3ApOworICAvLyBTdWJ0cmFjdCBvZmYgdGhlIGV4dHJhIGxlYWRpbmcgYml0cyBpbiB0aGUgYmlnZ2VyIHR5cGUuCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIE5WVCwgT3AsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTlZULmdldFNpemVJbkJpdHMoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1ZULmdldFNpemVJbkJpdHMoKSwgTlZUKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludFJlc19DVFBPUChTRE5vZGUgKk4pIHsKKyAgLy8gWmVybyBleHRlbmQgdG8gdGhlIHByb21vdGVkIHR5cGUgYW5kIGRvIHRoZSBjb3VudCB0aGVyZS4KKyAgU0RWYWx1ZSBPcCA9IFpFeHRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkNUUE9QLCBOLT5nZXREZWJ1Z0xvYygpLCBPcC5nZXRWYWx1ZVR5cGUoKSwgT3ApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfQ1RUWihTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBPcCA9IEdldFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgRVZUIE9WVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRVZUIE5WVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIC8vIFRoZSBjb3VudCBpcyB0aGUgc2FtZSBpbiB0aGUgcHJvbW90ZWQgdHlwZSBleGNlcHQgaWYgdGhlIG9yaWdpbmFsCisgIC8vIHZhbHVlIHdhcyB6ZXJvLiAgVGhpcyBjYW4gYmUgaGFuZGxlZCBieSBzZXR0aW5nIHRoZSBiaXQganVzdCBvZmYKKyAgLy8gdGhlIHRvcCBvZiB0aGUgb3JpZ2luYWwgdHlwZS4KKyAgQVBJbnQgVG9wQml0KE5WVC5nZXRTaXplSW5CaXRzKCksIDApOworICBUb3BCaXQuc2V0KE9WVC5nZXRTaXplSW5CaXRzKCkpOworICBPcCA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBOVlQsIE9wLCBEQUcuZ2V0Q29uc3RhbnQoVG9wQml0LCBOVlQpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Q1RUWiwgZGwsIE5WVCwgT3ApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfRVhUUkFDVF9WRUNUT1JfRUxUKFNETm9kZSAqTikgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE5WVCwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMSkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfRlBfVE9fWElOVChTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgdW5zaWduZWQgTmV3T3BjID0gTi0+Z2V0T3Bjb2RlKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBJZiB3ZSdyZSBwcm9tb3RpbmcgYSBVSU5UIHRvIGEgbGFyZ2VyIHNpemUgYW5kIHRoZSBsYXJnZXIgRlBfVE9fVUlOVCBpcworICAvLyBub3QgTGVnYWwsIGNoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gdXNlIEZQX1RPX1NJTlQgaW5zdGVhZC4gIChJZiBib3RoIFVJTlQKKyAgLy8gYW5kIFNJTlQgY29udmVyc2lvbnMgYXJlIEN1c3RvbSwgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgd2hpY2ggaXMKKyAgLy8gcHJlZmVyYWJsZS4gV2UgY2hvb3NlIFNJTlQgYmVjYXVzZSB0aGF0J3MgdGhlIHJpZ2h0IHRoaW5nIG9uIFBQQy4pCisgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZQX1RPX1VJTlQgJiYKKyAgICAgICFUTEkuaXNPcGVyYXRpb25MZWdhbChJU0Q6OkZQX1RPX1VJTlQsIE5WVCkgJiYKKyAgICAgIFRMSS5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpGUF9UT19TSU5ULCBOVlQpKQorICAgIE5ld09wYyA9IElTRDo6RlBfVE9fU0lOVDsKKworICBTRFZhbHVlIFJlcyA9IERBRy5nZXROb2RlKE5ld09wYywgZGwsIE5WVCwgTi0+Z2V0T3BlcmFuZCgwKSk7CisKKyAgLy8gQXNzZXJ0IHRoYXQgdGhlIGNvbnZlcnRlZCB2YWx1ZSBmaXRzIGluIHRoZSBvcmlnaW5hbCB0eXBlLiAgSWYgaXQgZG9lc24ndAorICAvLyAoZWc6IGJlY2F1c2UgdGhlIHZhbHVlIGJlaW5nIGNvbnZlcnRlZCBpcyB0b28gYmlnKSwgdGhlbiB0aGUgcmVzdWx0IG9mIHRoZQorICAvLyBvcmlnaW5hbCBvcGVyYXRpb24gd2FzIHVuZGVmaW5lZCBhbnl3YXksIHNvIHRoZSBhc3NlcnQgaXMgc3RpbGwgY29ycmVjdC4KKyAgcmV0dXJuIERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpID09IElTRDo6RlBfVE9fVUlOVCA/CisgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFzc2VydFpleHQgOiBJU0Q6OkFzc2VydFNleHQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgTlZULCBSZXMsIERBRy5nZXRWYWx1ZVR5cGUoTi0+Z2V0VmFsdWVUeXBlKDApKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludFJlc19GUDMyX1RPX0ZQMTYoU0ROb2RlICpOKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBTRFZhbHVlIFJlcyA9IERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBkbCwgTlZULCBOLT5nZXRPcGVyYW5kKDApKTsKKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBc3NlcnRaZXh0LCBkbCwKKyAgICAgICAgICAgICAgICAgICAgIE5WVCwgUmVzLCBEQUcuZ2V0VmFsdWVUeXBlKE4tPmdldFZhbHVlVHlwZSgwKSkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfSU5UX0VYVEVORChTRE5vZGUgKk4pIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIGlmIChnZXRUeXBlQWN0aW9uKE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkpID09IFByb21vdGVJbnRlZ2VyKSB7CisgICAgU0RWYWx1ZSBSZXMgPSBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7CisgICAgYXNzZXJ0KFJlcy5nZXRWYWx1ZVR5cGUoKS5iaXRzTEUoTlZUKSAmJiAiRXh0ZW5zaW9uIGRvZXNuJ3QgbWFrZSBzZW5zZSEiKTsKKworICAgIC8vIElmIHRoZSByZXN1bHQgYW5kIG9wZXJhbmQgdHlwZXMgYXJlIHRoZSBzYW1lIGFmdGVyIHByb21vdGlvbiwgc2ltcGxpZnkKKyAgICAvLyB0byBhbiBpbi1yZWdpc3RlciBleHRlbnNpb24uCisgICAgaWYgKE5WVCA9PSBSZXMuZ2V0VmFsdWVUeXBlKCkpIHsKKyAgICAgIC8vIFRoZSBoaWdoIGJpdHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGFueXRoaW5nLiAgSW5zZXJ0IGFuIGV4dGVuZC4KKyAgICAgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNJR05fRVhURU5EKQorICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORF9JTlJFRywgZGwsIE5WVCwgUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpKSk7CisgICAgICBpZiAoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpaRVJPX0VYVEVORCkKKyAgICAgICAgcmV0dXJuIERBRy5nZXRaZXJvRXh0ZW5kSW5SZWcoUmVzLCBkbCwgTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICBhc3NlcnQoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBTllfRVhURU5EICYmICJVbmtub3duIGludGVnZXIgZXh0ZW5zaW9uISIpOworICAgICAgcmV0dXJuIFJlczsKKyAgICB9CisgIH0KKworICAvLyBPdGhlcndpc2UsIGp1c3QgZXh0ZW5kIHRoZSBvcmlnaW5hbCBvcGVyYW5kIGFsbCB0aGUgd2F5IHRvIHRoZSBsYXJnZXIgdHlwZS4KKyAgcmV0dXJuIERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBkbCwgTlZULCBOLT5nZXRPcGVyYW5kKDApKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50UmVzX0xPQUQoTG9hZFNETm9kZSAqTikgeworICBhc3NlcnQoSVNEOjppc1VOSU5ERVhFRExvYWQoTikgJiYgIkluZGV4ZWQgbG9hZCBkdXJpbmcgdHlwZSBsZWdhbGl6YXRpb24hIik7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIElTRDo6TG9hZEV4dFR5cGUgRXh0VHlwZSA9CisgICAgSVNEOjppc05PTl9FWFRMb2FkKE4pID8gSVNEOjpFWFRMT0FEIDogTi0+Z2V0RXh0ZW5zaW9uVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgUmVzID0gREFHLmdldEV4dExvYWQoRXh0VHlwZSwgTlZULCBkbCwgTi0+Z2V0Q2hhaW4oKSwgTi0+Z2V0QmFzZVB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFNyY1ZhbHVlKCksIE4tPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0TWVtb3J5VlQoKSwgTi0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmlzTm9uVGVtcG9yYWwoKSwgTi0+Z2V0QWxpZ25tZW50KCkpOworCisgIC8vIExlZ2FsaXplZCB0aGUgY2hhaW4gcmVzdWx0IC0gc3dpdGNoIGFueXRoaW5nIHRoYXQgdXNlZCB0aGUgb2xkIGNoYWluIHRvCisgIC8vIHVzZSB0aGUgbmV3IG9uZS4KKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBSZXMuZ2V0VmFsdWUoMSkpOworICByZXR1cm4gUmVzOworfQorCisvLy8gUHJvbW90ZSB0aGUgb3ZlcmZsb3cgZmxhZyBvZiBhbiBvdmVyZmxvd2luZyBhcml0aG1ldGljIG5vZGUuCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfT3ZlcmZsb3coU0ROb2RlICpOKSB7CisgIC8vIFNpbXBseSBjaGFuZ2UgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBib29sZWFuIHJlc3VsdC4KKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDEpKTsKKyAgRVZUIFZhbHVlVlRzW10gPSB7IE4tPmdldFZhbHVlVHlwZSgwKSwgTlZUIH07CisgIFNEVmFsdWUgT3BzW10gPSB7IE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSkgfTsKKyAgU0RWYWx1ZSBSZXMgPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlRMaXN0KFZhbHVlVlRzLCAyKSwgT3BzLCAyKTsKKworICAvLyBNb2RpZmllZCB0aGUgc3VtIHJlc3VsdCAtIHN3aXRjaCBhbnl0aGluZyB0aGF0IHVzZWQgdGhlIG9sZCBzdW0gdG8gdXNlCisgIC8vIHRoZSBuZXcgb25lLgorICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTiwgMCksIFJlcyk7CisKKyAgcmV0dXJuIFNEVmFsdWUoUmVzLmdldE5vZGUoKSwgMSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludFJlc19TQUREU1VCTyhTRE5vZGUgKk4sIHVuc2lnbmVkIFJlc05vKSB7CisgIGlmIChSZXNObyA9PSAxKQorICAgIHJldHVybiBQcm9tb3RlSW50UmVzX092ZXJmbG93KE4pOworCisgIC8vIFRoZSBvcGVyYXRpb24gb3ZlcmZsb3dlZCBpZmYgdGhlIHJlc3VsdCBpbiB0aGUgbGFyZ2VyIHR5cGUgaXMgbm90IHRoZQorICAvLyBzaWduIGV4dGVuc2lvbiBvZiBpdHMgdHJ1bmNhdGlvbiB0byB0aGUgb3JpZ2luYWwgdHlwZS4KKyAgU0RWYWx1ZSBMSFMgPSBTRXh0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIFJIUyA9IFNFeHRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgxKSk7CisgIEVWVCBPVlQgPSBOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICBFVlQgTlZUID0gTEhTLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgLy8gRG8gdGhlIGFyaXRobWV0aWMgaW4gdGhlIGxhcmdlciB0eXBlLgorICB1bnNpZ25lZCBPcGNvZGUgPSBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNBRERPID8gSVNEOjpBREQgOiBJU0Q6OlNVQjsKKyAgU0RWYWx1ZSBSZXMgPSBEQUcuZ2V0Tm9kZShPcGNvZGUsIGRsLCBOVlQsIExIUywgUkhTKTsKKworICAvLyBDYWxjdWxhdGUgdGhlIG92ZXJmbG93IGZsYWc6IHNpZ24gZXh0ZW5kIHRoZSBhcml0aG1ldGljIHJlc3VsdCBmcm9tCisgIC8vIHRoZSBvcmlnaW5hbCB0eXBlLgorICBTRFZhbHVlIE9mbCA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIGRsLCBOVlQsIFJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKE9WVCkpOworICAvLyBPdmVyZmxvd2VkIGlmIGFuZCBvbmx5IGlmIHRoaXMgaXMgbm90IGVxdWFsIHRvIFJlcy4KKyAgT2ZsID0gREFHLmdldFNldENDKGRsLCBOLT5nZXRWYWx1ZVR5cGUoMSksIE9mbCwgUmVzLCBJU0Q6OlNFVE5FKTsKKworICAvLyBVc2UgdGhlIGNhbGN1bGF0ZWQgb3ZlcmZsb3cgZXZlcnl3aGVyZS4KKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBPZmwpOworCisgIHJldHVybiBSZXM7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludFJlc19TRElWKFNETm9kZSAqTikgeworICAvLyBTaWduIGV4dGVuZCB0aGUgaW5wdXQuCisgIFNEVmFsdWUgTEhTID0gU0V4dFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgU0RWYWx1ZSBSSFMgPSBTRXh0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMSkpOworICByZXR1cm4gREFHLmdldE5vZGUoTi0+Z2V0T3Bjb2RlKCksIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBMSFMuZ2V0VmFsdWVUeXBlKCksIExIUywgUkhTKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50UmVzX1NFTEVDVChTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBMSFMgPSBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgxKSk7CisgIFNEVmFsdWUgUkhTID0gR2V0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMikpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBMSFMuZ2V0VmFsdWVUeXBlKCksIE4tPmdldE9wZXJhbmQoMCksTEhTLFJIUyk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludFJlc19TRUxFQ1RfQ0MoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTEhTID0gR2V0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMikpOworICBTRFZhbHVlIFJIUyA9IEdldFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDMpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0VMRUNUX0NDLCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgTEhTLmdldFZhbHVlVHlwZSgpLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKSwgTEhTLCBSSFMsIE4tPmdldE9wZXJhbmQoNCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfU0VUQ0MoU0ROb2RlICpOKSB7CisgIEVWVCBTVlQgPSBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkpOworICBhc3NlcnQoaXNUeXBlTGVnYWwoU1ZUKSAmJiAiSWxsZWdhbCBTZXRDQyB0eXBlISIpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgLy8gR2V0IHRoZSBTRVRDQyByZXN1bHQgdXNpbmcgdGhlIGNhbm9uaWNhbCBTRVRDQyB0eXBlLgorICBTRFZhbHVlIFNldENDID0gREFHLmdldE5vZGUoSVNEOjpTRVRDQywgZGwsIFNWVCwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMSksIE4tPmdldE9wZXJhbmQoMikpOworCisgIC8vIENvbnZlcnQgdG8gdGhlIGV4cGVjdGVkIHR5cGUuCisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIGFzc2VydChOVlQuYml0c0xFKFNWVCkgJiYgIkludGVnZXIgdHlwZSBvdmVycHJvbW90ZWQ/Iik7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTlZULCBTZXRDQyk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludFJlc19TSEwoU0ROb2RlICpOKSB7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSksCisgICAgICAgICAgICAgICAgICAgICBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSksIE4tPmdldE9wZXJhbmQoMSkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfU0lHTl9FWFRFTkRfSU5SRUcoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgT3AgPSBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0VmFsdWVUeXBlKCksIE9wLCBOLT5nZXRPcGVyYW5kKDEpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50UmVzX1NpbXBsZUludEJpbk9wKFNETm9kZSAqTikgeworICAvLyBUaGUgaW5wdXQgbWF5IGhhdmUgc3RyYW5nZSB0aGluZ3MgaW4gdGhlIHRvcCBiaXRzIG9mIHRoZSByZWdpc3RlcnMsIGJ1dAorICAvLyB0aGVzZSBvcGVyYXRpb25zIGRvbid0IGNhcmUuICBUaGV5IG1heSBoYXZlIHdlaXJkIGJpdHMgZ29pbmcgb3V0LCBidXQKKyAgLy8gdGhhdCB0b28gaXMgb2theSBpZiB0aGV5IGFyZSBpbnRlZ2VyIG9wZXJhdGlvbnMuCisgIFNEVmFsdWUgTEhTID0gR2V0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIFJIUyA9IEdldFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDEpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICBMSFMuZ2V0VmFsdWVUeXBlKCksIExIUywgUkhTKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50UmVzX1NSQShTRE5vZGUgKk4pIHsKKyAgLy8gVGhlIGlucHV0IHZhbHVlIG11c3QgYmUgcHJvcGVybHkgc2lnbiBleHRlbmRlZC4KKyAgU0RWYWx1ZSBSZXMgPSBTRXh0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTUkEsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBSZXMuZ2V0VmFsdWVUeXBlKCksIFJlcywgTi0+Z2V0T3BlcmFuZCgxKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludFJlc19TUkwoU0ROb2RlICpOKSB7CisgIC8vIFRoZSBpbnB1dCB2YWx1ZSBtdXN0IGJlIHByb3Blcmx5IHplcm8gZXh0ZW5kZWQuCisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgVlQpOworICBTRFZhbHVlIFJlcyA9IFpFeHRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgTi0+Z2V0RGVidWdMb2MoKSwgTlZULCBSZXMsIE4tPmdldE9wZXJhbmQoMSkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfVFJVTkNBVEUoU0ROb2RlICpOKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgUmVzOworCisgIHN3aXRjaCAoZ2V0VHlwZUFjdGlvbihOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpKSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHR5cGUgYWN0aW9uISIpOworICBjYXNlIExlZ2FsOgorICBjYXNlIEV4cGFuZEludGVnZXI6CisgICAgUmVzID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICBicmVhazsKKyAgY2FzZSBQcm9tb3RlSW50ZWdlcjoKKyAgICBSZXMgPSBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7CisgICAgYnJlYWs7CisgIH0KKworICAvLyBUcnVuY2F0ZSB0byBOVlQgaW5zdGVhZCBvZiBWVAorICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgTi0+Z2V0RGVidWdMb2MoKSwgTlZULCBSZXMpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfVUFERFNVQk8oU0ROb2RlICpOLCB1bnNpZ25lZCBSZXNObykgeworICBpZiAoUmVzTm8gPT0gMSkKKyAgICByZXR1cm4gUHJvbW90ZUludFJlc19PdmVyZmxvdyhOKTsKKworICAvLyBUaGUgb3BlcmF0aW9uIG92ZXJmbG93ZWQgaWZmIHRoZSByZXN1bHQgaW4gdGhlIGxhcmdlciB0eXBlIGlzIG5vdCB0aGUKKyAgLy8gemVybyBleHRlbnNpb24gb2YgaXRzIHRydW5jYXRpb24gdG8gdGhlIG9yaWdpbmFsIHR5cGUuCisgIFNEVmFsdWUgTEhTID0gWkV4dFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgU0RWYWx1ZSBSSFMgPSBaRXh0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMSkpOworICBFVlQgT1ZUID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIE5WVCA9IExIUy5nZXRWYWx1ZVR5cGUoKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIERvIHRoZSBhcml0aG1ldGljIGluIHRoZSBsYXJnZXIgdHlwZS4KKyAgdW5zaWduZWQgT3Bjb2RlID0gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpVQURETyA/IElTRDo6QUREIDogSVNEOjpTVUI7CisgIFNEVmFsdWUgUmVzID0gREFHLmdldE5vZGUoT3Bjb2RlLCBkbCwgTlZULCBMSFMsIFJIUyk7CisKKyAgLy8gQ2FsY3VsYXRlIHRoZSBvdmVyZmxvdyBmbGFnOiB6ZXJvIGV4dGVuZCB0aGUgYXJpdGhtZXRpYyByZXN1bHQgZnJvbQorICAvLyB0aGUgb3JpZ2luYWwgdHlwZS4KKyAgU0RWYWx1ZSBPZmwgPSBEQUcuZ2V0WmVyb0V4dGVuZEluUmVnKFJlcywgZGwsIE9WVCk7CisgIC8vIE92ZXJmbG93ZWQgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyBub3QgZXF1YWwgdG8gUmVzLgorICBPZmwgPSBEQUcuZ2V0U2V0Q0MoZGwsIE4tPmdldFZhbHVlVHlwZSgxKSwgT2ZsLCBSZXMsIElTRDo6U0VUTkUpOworCisgIC8vIFVzZSB0aGUgY2FsY3VsYXRlZCBvdmVyZmxvdyBldmVyeXdoZXJlLgorICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksIE9mbCk7CisKKyAgcmV0dXJuIFJlczsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50UmVzX1VESVYoU0ROb2RlICpOKSB7CisgIC8vIFplcm8gZXh0ZW5kIHRoZSBpbnB1dC4KKyAgU0RWYWx1ZSBMSFMgPSBaRXh0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIFJIUyA9IFpFeHRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgxKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIExIUy5nZXRWYWx1ZVR5cGUoKSwgTEhTLCBSSFMpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfVU5ERUYoU0ROb2RlICpOKSB7CisgIHJldHVybiBEQUcuZ2V0VU5ERUYoVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRWYWx1ZVR5cGUoMCkpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50UmVzX1ZBQVJHKFNETm9kZSAqTikgeworICBTRFZhbHVlIENoYWluID0gTi0+Z2V0T3BlcmFuZCgwKTsgLy8gR2V0IHRoZSBjaGFpbi4KKyAgU0RWYWx1ZSBQdHIgPSBOLT5nZXRPcGVyYW5kKDEpOyAvLyBHZXQgdGhlIHBvaW50ZXIuCisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIEVWVCBSZWdWVCA9IFRMSS5nZXRSZWdpc3RlclR5cGUoKkRBRy5nZXRDb250ZXh0KCksIFZUKTsKKyAgdW5zaWduZWQgTnVtUmVncyA9IFRMSS5nZXROdW1SZWdpc3RlcnMoKkRBRy5nZXRDb250ZXh0KCksIFZUKTsKKyAgLy8gVGhlIGFyZ3VtZW50IGlzIHBhc3NlZCBhcyBOdW1SZWdzIHJlZ2lzdGVycyBvZiB0eXBlIFJlZ1ZULgorCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IFBhcnRzKE51bVJlZ3MpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtUmVnczsgKytpKSB7CisgICAgUGFydHNbaV0gPSBEQUcuZ2V0VkFBcmcoUmVnVlQsIGRsLCBDaGFpbiwgUHRyLCBOLT5nZXRPcGVyYW5kKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldENvbnN0YW50T3BlcmFuZFZhbCgzKSk7CisgICAgQ2hhaW4gPSBQYXJ0c1tpXS5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIC8vIEhhbmRsZSBlbmRpYW5uZXNzIG9mIHRoZSBsb2FkLgorICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpCisgICAgc3RkOjpyZXZlcnNlKFBhcnRzLmJlZ2luKCksIFBhcnRzLmVuZCgpKTsKKworICAvLyBBc3NlbWJsZSB0aGUgcGFydHMgaW4gdGhlIHByb21vdGVkIHR5cGUuCisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgUmVzID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZGwsIE5WVCwgUGFydHNbMF0pOworICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgTnVtUmVnczsgKytpKSB7CisgICAgU0RWYWx1ZSBQYXJ0ID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZGwsIE5WVCwgUGFydHNbaV0pOworICAgIC8vIFNoaWZ0IGl0IHRvIHRoZSByaWdodCBwb3NpdGlvbiBhbmQgIm9yIiBpdCBpbi4KKyAgICBQYXJ0ID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBOVlQsIFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChpICogUmVnVlQuZ2V0U2l6ZUluQml0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpKSk7CisgICAgUmVzID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIE5WVCwgUmVzLCBQYXJ0KTsKKyAgfQorCisgIC8vIE1vZGlmaWVkIHRoZSBjaGFpbiByZXN1bHQgLSBzd2l0Y2ggYW55dGhpbmcgdGhhdCB1c2VkIHRoZSBvbGQgY2hhaW4gdG8KKyAgLy8gdXNlIHRoZSBuZXcgb25lLgorICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksIENoYWluKTsKKworICByZXR1cm4gUmVzOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRSZXNfWE1VTE8oU0ROb2RlICpOLCB1bnNpZ25lZCBSZXNObykgeworICBhc3NlcnQoUmVzTm8gPT0gMSAmJiAiT25seSBib29sZWFuIHJlc3VsdCBwcm9tb3Rpb24gY3VycmVudGx5IHN1cHBvcnRlZCEiKTsKKyAgcmV0dXJuIFByb21vdGVJbnRSZXNfT3ZlcmZsb3coTik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgSW50ZWdlciBPcGVyYW5kIFByb21vdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFByb21vdGVJbnRlZ2VyT3BlcmFuZCAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBvZgorLy8vIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBmb3VuZCB0byBuZWVkIHByb21vdGlvbi4gIEF0IHRoaXMgcG9pbnQsIGFsbCBvZiB0aGUKKy8vLyByZXN1bHQgdHlwZXMgb2YgdGhlIG5vZGUgYXJlIGtub3duIHRvIGJlIGxlZ2FsLCBidXQgb3RoZXIgb3BlcmFuZHMgb2YgdGhlCisvLy8gbm9kZSBtYXkgbmVlZCBwcm9tb3Rpb24gb3IgZXhwYW5zaW9uIGFzIHdlbGwgYXMgdGhlIHNwZWNpZmllZCBvbmUuCitib29sIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRlZ2VyT3BlcmFuZChTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pIHsKKyAgREVCVUcoZGJncygpIDw8ICJQcm9tb3RlIGludGVnZXIgb3BlcmFuZDogIjsgTi0+ZHVtcCgmREFHKTsgZGJncygpIDw8ICJcbiIpOworICBTRFZhbHVlIFJlcyA9IFNEVmFsdWUoKTsKKworICBpZiAoQ3VzdG9tTG93ZXJOb2RlKE4sIE4tPmdldE9wZXJhbmQoT3BObykuZ2V0VmFsdWVUeXBlKCksIGZhbHNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6CisgICNpZm5kZWYgTkRFQlVHCisgICAgZGJncygpIDw8ICJQcm9tb3RlSW50ZWdlck9wZXJhbmQgT3AgIyIgPDwgT3BObyA8PCAiOiAiOworICAgIE4tPmR1bXAoJkRBRyk7IGRiZ3MoKSA8PCAiXG4iOworICAjZW5kaWYKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJEbyBub3Qga25vdyBob3cgdG8gcHJvbW90ZSB0aGlzIG9wZXJhdG9yJ3Mgb3BlcmFuZCEiKTsKKworICBjYXNlIElTRDo6QU5ZX0VYVEVORDogICBSZXMgPSBQcm9tb3RlSW50T3BfQU5ZX0VYVEVORChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDogIFJlcyA9IFByb21vdGVJbnRPcF9CSVRfQ09OVkVSVChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpCUl9DQzogICAgICAgIFJlcyA9IFByb21vdGVJbnRPcF9CUl9DQyhOLCBPcE5vKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpCUkNPTkQ6ICAgICAgIFJlcyA9IFByb21vdGVJbnRPcF9CUkNPTkQoTiwgT3BObyk7IGJyZWFrOworICBjYXNlIElTRDo6QlVJTERfUEFJUjogICBSZXMgPSBQcm9tb3RlSW50T3BfQlVJTERfUEFJUihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpCVUlMRF9WRUNUT1I6IFJlcyA9IFByb21vdGVJbnRPcF9CVUlMRF9WRUNUT1IoTik7IGJyZWFrOworICBjYXNlIElTRDo6Q09OVkVSVF9STkRTQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcyA9IFByb21vdGVJbnRPcF9DT05WRVJUX1JORFNBVChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpJTlNFUlRfVkVDVE9SX0VMVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzID0gUHJvbW90ZUludE9wX0lOU0VSVF9WRUNUT1JfRUxUKE4sIE9wTm8pO2JyZWFrOworICBjYXNlIElTRDo6TUVNQkFSUklFUjogICBSZXMgPSBQcm9tb3RlSW50T3BfTUVNQkFSUklFUihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTQ0FMQVJfVE9fVkVDVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXMgPSBQcm9tb3RlSW50T3BfU0NBTEFSX1RPX1ZFQ1RPUihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRUxFQ1Q6ICAgICAgIFJlcyA9IFByb21vdGVJbnRPcF9TRUxFQ1QoTiwgT3BObyk7IGJyZWFrOworICBjYXNlIElTRDo6U0VMRUNUX0NDOiAgICBSZXMgPSBQcm9tb3RlSW50T3BfU0VMRUNUX0NDKE4sIE9wTm8pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVENDOiAgICAgICAgUmVzID0gUHJvbW90ZUludE9wX1NFVENDKE4sIE9wTm8pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOiAgUmVzID0gUHJvbW90ZUludE9wX1NJR05fRVhURU5EKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6ICAgUmVzID0gUHJvbW90ZUludE9wX1NJTlRfVE9fRlAoTik7IGJyZWFrOworICBjYXNlIElTRDo6U1RPUkU6ICAgICAgICBSZXMgPSBQcm9tb3RlSW50T3BfU1RPUkUoY2FzdDxTdG9yZVNETm9kZT4oTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcE5vKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpUUlVOQ0FURTogICAgIFJlcyA9IFByb21vdGVJbnRPcF9UUlVOQ0FURShOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpGUDE2X1RPX0ZQMzI6CisgIGNhc2UgSVNEOjpVSU5UX1RPX0ZQOiAgIFJlcyA9IFByb21vdGVJbnRPcF9VSU5UX1RPX0ZQKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlpFUk9fRVhURU5EOiAgUmVzID0gUHJvbW90ZUludE9wX1pFUk9fRVhURU5EKE4pOyBicmVhazsKKworICBjYXNlIElTRDo6U0hMOgorICBjYXNlIElTRDo6U1JBOgorICBjYXNlIElTRDo6U1JMOgorICBjYXNlIElTRDo6Uk9UTDoKKyAgY2FzZSBJU0Q6OlJPVFI6IFJlcyA9IFByb21vdGVJbnRPcF9TaGlmdChOKTsgYnJlYWs7CisgIH0KKworICAvLyBJZiB0aGUgcmVzdWx0IGlzIG51bGwsIHRoZSBzdWItbWV0aG9kIHRvb2sgY2FyZSBvZiByZWdpc3RlcmluZyByZXN1bHRzIGV0Yy4KKyAgaWYgKCFSZXMuZ2V0Tm9kZSgpKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhlIHJlc3VsdCBpcyBOLCB0aGUgc3ViLW1ldGhvZCB1cGRhdGVkIE4gaW4gcGxhY2UuICBUZWxsIHRoZSBsZWdhbGl6ZXIKKyAgLy8gY29yZSBhYm91dCB0aGlzLgorICBpZiAoUmVzLmdldE5vZGUoKSA9PSBOKQorICAgIHJldHVybiB0cnVlOworCisgIGFzc2VydChSZXMuZ2V0VmFsdWVUeXBlKCkgPT0gTi0+Z2V0VmFsdWVUeXBlKDApICYmIE4tPmdldE51bVZhbHVlcygpID09IDEgJiYKKyAgICAgICAgICJJbnZhbGlkIG9wZXJhbmQgZXhwYW5zaW9uIik7CisKKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIDApLCBSZXMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQcm9tb3RlU2V0Q0NPcGVyYW5kcyAtIFByb21vdGUgdGhlIG9wZXJhbmRzIG9mIGEgY29tcGFyaXNvbi4gIFRoaXMgY29kZSBpcworLy8vIHNoYXJlZCBhbW9uZyBCUl9DQywgU0VMRUNUX0NDLCBhbmQgU0VUQ0MgaGFuZGxlcnMuCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVTZXRDQ09wZXJhbmRzKFNEVmFsdWUgJk5ld0xIUyxTRFZhbHVlICZOZXdSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Q29uZENvZGUgQ0NDb2RlKSB7CisgIC8vIFdlIGhhdmUgdG8gaW5zZXJ0IGV4cGxpY2l0IHNpZ24gb3IgemVybyBleHRlbmRzLiAgTm90ZSB0aGF0IHdlIGNvdWxkCisgIC8vIGluc2VydCBzaWduIGV4dGVuZHMgZm9yIEFMTCBjb25kaXRpb25zLCBidXQgemVybyBleHRlbmQgaXMgY2hlYXBlciBvbgorICAvLyBtYW55IG1hY2hpbmVzIChhbiBBTkQgaW5zdGVhZCBvZiB0d28gc2hpZnRzKSwgc28gcHJlZmVyIGl0LgorICBzd2l0Y2ggKENDQ29kZSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgY29tcGFyaXNvbiEiKTsKKyAgY2FzZSBJU0Q6OlNFVEVROgorICBjYXNlIElTRDo6U0VUTkU6CisgIGNhc2UgSVNEOjpTRVRVR0U6CisgIGNhc2UgSVNEOjpTRVRVR1Q6CisgIGNhc2UgSVNEOjpTRVRVTEU6CisgIGNhc2UgSVNEOjpTRVRVTFQ6CisgICAgLy8gQUxMIG9mIHRoZXNlIG9wZXJhdGlvbnMgd2lsbCB3b3JrIGlmIHdlIGVpdGhlciBzaWduIG9yIHplcm8gZXh0ZW5kCisgICAgLy8gdGhlIG9wZXJhbmRzIChpbmNsdWRpbmcgdGhlIHVuc2lnbmVkIGNvbXBhcmlzb25zISkuICBaZXJvIGV4dGVuZCBpcworICAgIC8vIHVzdWFsbHkgYSBzaW1wbGVyL2NoZWFwZXIgb3BlcmF0aW9uLCBzbyBwcmVmZXIgaXQuCisgICAgTmV3TEhTID0gWkV4dFByb21vdGVkSW50ZWdlcihOZXdMSFMpOworICAgIE5ld1JIUyA9IFpFeHRQcm9tb3RlZEludGVnZXIoTmV3UkhTKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVEdFOgorICBjYXNlIElTRDo6U0VUR1Q6CisgIGNhc2UgSVNEOjpTRVRMVDoKKyAgY2FzZSBJU0Q6OlNFVExFOgorICAgIE5ld0xIUyA9IFNFeHRQcm9tb3RlZEludGVnZXIoTmV3TEhTKTsKKyAgICBOZXdSSFMgPSBTRXh0UHJvbW90ZWRJbnRlZ2VyKE5ld1JIUyk7CisgICAgYnJlYWs7CisgIH0KK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50T3BfQU5ZX0VYVEVORChTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBPcCA9IEdldFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgTi0+Z2V0VmFsdWVUeXBlKDApLCBPcCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludE9wX0JJVF9DT05WRVJUKFNETm9kZSAqTikgeworICAvLyBUaGlzIHNob3VsZCBvbmx5IG9jY3VyIGluIHVudXN1YWwgc2l0dWF0aW9ucyBsaWtlIGJpdGNhc3RpbmcgdG8gYW4KKyAgLy8geDg2X2ZwODAsIHNvIGp1c3QgdHVybiBpdCBpbnRvIGEgc3RvcmUrbG9hZAorICByZXR1cm4gQ3JlYXRlU3RhY2tTdG9yZUxvYWQoTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50T3BfQlJfQ0MoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKSB7CisgIGFzc2VydChPcE5vID09IDIgJiYgIkRvbid0IGtub3cgaG93IHRvIHByb21vdGUgdGhpcyBvcGVyYW5kISIpOworCisgIFNEVmFsdWUgTEhTID0gTi0+Z2V0T3BlcmFuZCgyKTsKKyAgU0RWYWx1ZSBSSFMgPSBOLT5nZXRPcGVyYW5kKDMpOworICBQcm9tb3RlU2V0Q0NPcGVyYW5kcyhMSFMsIFJIUywgY2FzdDxDb25kQ29kZVNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldCgpKTsKKworICAvLyBUaGUgY2hhaW4gKE9wIzApLCBDQyAoIzEpIGFuZCBiYXNpYyBibG9jayBkZXN0aW5hdGlvbiAoT3AjNCkgYXJlIGFsd2F5cworICAvLyBsZWdhbCB0eXBlcy4KKyAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDEpLCBMSFMsIFJIUywgTi0+Z2V0T3BlcmFuZCg0KSksCisgICAgICAgICAgICAgICAgIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRPcF9CUkNPTkQoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKSB7CisgIGFzc2VydChPcE5vID09IDEgJiYgIm9ubHkga25vdyBob3cgdG8gcHJvbW90ZSBjb25kaXRpb24iKTsKKworICAvLyBQcm9tb3RlIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSBjYW5vbmljYWwgU2V0Q0MgdHlwZS4KKyAgRVZUIFNWVCA9IFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoTVZUOjpPdGhlcik7CisgIFNEVmFsdWUgQ29uZCA9IFByb21vdGVUYXJnZXRCb29sZWFuKE4tPmdldE9wZXJhbmQoMSksIFNWVCk7CisKKyAgLy8gVGhlIGNoYWluIChPcCMwKSBhbmQgYmFzaWMgYmxvY2sgZGVzdGluYXRpb24gKE9wIzIpIGFyZSBhbHdheXMgbGVnYWwgdHlwZXMuCisgIHJldHVybiBTRFZhbHVlKERBRy5VcGRhdGVOb2RlT3BlcmFuZHMoTiwgTi0+Z2V0T3BlcmFuZCgwKSwgQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDIpKSwgMCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludE9wX0JVSUxEX1BBSVIoU0ROb2RlICpOKSB7CisgIC8vIFNpbmNlIHRoZSByZXN1bHQgdHlwZSBpcyBsZWdhbCwgdGhlIG9wZXJhbmRzIG11c3QgcHJvbW90ZSB0byBpdC4KKyAgRVZUIE9WVCA9IE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgIFNEVmFsdWUgTG8gPSBaRXh0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIEhpID0gR2V0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMSkpOworICBhc3NlcnQoTG8uZ2V0VmFsdWVUeXBlKCkgPT0gTi0+Z2V0VmFsdWVUeXBlKDApICYmICJPcGVyYW5kIG92ZXIgcHJvbW90ZWQ/Iik7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBIaSA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTi0+Z2V0VmFsdWVUeXBlKDApLCBIaSwKKyAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoT1ZULmdldFNpemVJbkJpdHMoKSwgVExJLmdldFBvaW50ZXJUeSgpKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTi0+Z2V0VmFsdWVUeXBlKDApLCBMbywgSGkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRPcF9CVUlMRF9WRUNUT1IoU0ROb2RlICpOKSB7CisgIC8vIFRoZSB2ZWN0b3IgdHlwZSBpcyBsZWdhbCBidXQgdGhlIGVsZW1lbnQgdHlwZSBpcyBub3QuICBUaGlzIGltcGxpZXMKKyAgLy8gdGhhdCB0aGUgdmVjdG9yIGlzIGEgcG93ZXItb2YtdHdvIGluIGxlbmd0aCBhbmQgdGhhdCB0aGUgZWxlbWVudAorICAvLyB0eXBlIGRvZXMgbm90IGhhdmUgYSBzdHJhbmdlIHNpemUgKGVnOiBpdCBpcyBub3QgaTEpLgorICBFVlQgVmVjVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBWZWNWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBhc3NlcnQoIShOdW1FbHRzICYgMSkgJiYgIkxlZ2FsIHZlY3RvciBvZiBvbmUgaWxsZWdhbCBlbGVtZW50PyIpOworCisgIC8vIFByb21vdGUgdGhlIGluc2VydGVkIHZhbHVlLiAgVGhlIHR5cGUgZG9lcyBub3QgbmVlZCB0byBtYXRjaCB0aGUKKyAgLy8gdmVjdG9yIGVsZW1lbnQgdHlwZS4gIENoZWNrIHRoYXQgYW55IGV4dHJhIGJpdHMgaW50cm9kdWNlZCB3aWxsIGJlCisgIC8vIHRydW5jYXRlZCBhd2F5LgorICBhc3NlcnQoTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCkgPj0KKyAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKSAmJgorICAgICAgICAgIlR5cGUgb2YgaW5zZXJ0ZWQgdmFsdWUgbmFycm93ZXIgdGhhbiB2ZWN0b3IgZWxlbWVudCB0eXBlISIpOworCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBOZXdPcHM7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1FbHRzOyArK2kpCisgICAgTmV3T3BzLnB1c2hfYmFjayhHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZChpKSkpOworCisgIHJldHVybiBTRFZhbHVlKERBRy5VcGRhdGVOb2RlT3BlcmFuZHMoTiwgJk5ld09wc1swXSwgTnVtRWx0cyksIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRPcF9DT05WRVJUX1JORFNBVChTRE5vZGUgKk4pIHsKKyAgSVNEOjpDdnRDb2RlIEN2dENvZGUgPSBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKTsKKyAgYXNzZXJ0ICgoQ3Z0Q29kZSA9PSBJU0Q6OkNWVF9TUyB8fCBDdnRDb2RlID09IElTRDo6Q1ZUX1NVIHx8CisgICAgICAgICAgIEN2dENvZGUgPT0gSVNEOjpDVlRfVVMgfHwgQ3Z0Q29kZSA9PSBJU0Q6OkNWVF9VVSB8fAorICAgICAgICAgICBDdnRDb2RlID09IElTRDo6Q1ZUX0ZTIHx8IEN2dENvZGUgPT0gSVNEOjpDVlRfRlUpICYmCisgICAgICAgICAgICJjYW4gb25seSBwcm9tb3RlIGludGVnZXIgYXJndW1lbnRzIik7CisgIFNEVmFsdWUgSW5PcCA9IEdldFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIERBRy5nZXRDb252ZXJ0Um5kU2F0KE4tPmdldFZhbHVlVHlwZSgwKSwgTi0+Z2V0RGVidWdMb2MoKSwgSW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMSksIE4tPmdldE9wZXJhbmQoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDMpLCBOLT5nZXRPcGVyYW5kKDQpLCBDdnRDb2RlKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50T3BfSU5TRVJUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BObykgeworICBpZiAoT3BObyA9PSAxKSB7CisgICAgLy8gUHJvbW90ZSB0aGUgaW5zZXJ0ZWQgdmFsdWUuICBUaGlzIGlzIHZhbGlkIGJlY2F1c2UgdGhlIHR5cGUgZG9lcyBub3QKKyAgICAvLyBoYXZlIHRvIG1hdGNoIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlLgorCisgICAgLy8gQ2hlY2sgdGhhdCBhbnkgZXh0cmEgYml0cyBpbnRyb2R1Y2VkIHdpbGwgYmUgdHJ1bmNhdGVkIGF3YXkuCisgICAgYXNzZXJ0KE4tPmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpID49CisgICAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKSAmJgorICAgICAgICAgICAiVHlwZSBvZiBpbnNlcnRlZCB2YWx1ZSBuYXJyb3dlciB0aGFuIHZlY3RvciBlbGVtZW50IHR5cGUhIik7CisgICAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDIpKSwKKyAgICAgICAgICAgICAgICAgICAwKTsKKyAgfQorCisgIGFzc2VydChPcE5vID09IDIgJiYgIkRpZmZlcmVudCBvcGVyYW5kIGFuZCByZXN1bHQgdmVjdG9yIHR5cGVzPyIpOworCisgIC8vIFByb21vdGUgdGhlIGluZGV4LgorICBTRFZhbHVlIElkeCA9IFpFeHRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgyKSk7CisgIHJldHVybiBTRFZhbHVlKERBRy5VcGRhdGVOb2RlT3BlcmFuZHMoTiwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKSwgSWR4KSwgMCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludE9wX01FTUJBUlJJRVIoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTmV3T3BzWzZdOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIE5ld09wc1swXSA9IE4tPmdldE9wZXJhbmQoMCk7CisgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBhcnJheV9sZW5ndGhvZihOZXdPcHMpOyArK2kpIHsKKyAgICBTRFZhbHVlIEZsYWcgPSBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZChpKSk7CisgICAgTmV3T3BzW2ldID0gREFHLmdldFplcm9FeHRlbmRJblJlZyhGbGFnLCBkbCwgTVZUOjppMSk7CisgIH0KKyAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBOZXdPcHMsIGFycmF5X2xlbmd0aG9mKE5ld09wcykpLCAwKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50T3BfU0NBTEFSX1RPX1ZFQ1RPUihTRE5vZGUgKk4pIHsKKyAgLy8gSW50ZWdlciBTQ0FMQVJfVE9fVkVDVE9SIG9wZXJhbmRzIGFyZSBpbXBsaWNpdGx5IHRydW5jYXRlZCwgc28ganVzdCBwcm9tb3RlCisgIC8vIHRoZSBvcGVyYW5kIGluIHBsYWNlLgorICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApKSksIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRPcF9TRUxFQ1QoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKSB7CisgIGFzc2VydChPcE5vID09IDAgJiYgIk9ubHkga25vdyBob3cgdG8gcHJvbW90ZSBjb25kaXRpb24iKTsKKworICAvLyBQcm9tb3RlIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSBjYW5vbmljYWwgU2V0Q0MgdHlwZS4KKyAgRVZUIFNWVCA9IFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoTi0+Z2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKSk7CisgIFNEVmFsdWUgQ29uZCA9IFByb21vdGVUYXJnZXRCb29sZWFuKE4tPmdldE9wZXJhbmQoMCksIFNWVCk7CisKKyAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDEpLCBOLT5nZXRPcGVyYW5kKDIpKSwgMCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludE9wX1NFTEVDVF9DQyhTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pIHsKKyAgYXNzZXJ0KE9wTm8gPT0gMCAmJiAiRG9uJ3Qga25vdyBob3cgdG8gcHJvbW90ZSB0aGlzIG9wZXJhbmQhIik7CisKKyAgU0RWYWx1ZSBMSFMgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFJIUyA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFByb21vdGVTZXRDQ09wZXJhbmRzKExIUywgUkhTLCBjYXN0PENvbmRDb2RlU0ROb2RlPihOLT5nZXRPcGVyYW5kKDQpKS0+Z2V0KCkpOworCisgIC8vIFRoZSBDQyAoIzQpIGFuZCB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyAoIzIgYW5kICMzKSBoYXZlIGxlZ2FsIHR5cGVzLgorICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sIExIUywgUkhTLCBOLT5nZXRPcGVyYW5kKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDMpLCBOLT5nZXRPcGVyYW5kKDQpKSwgMCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludE9wX1NFVENDKFNETm9kZSAqTiwgdW5zaWduZWQgT3BObykgeworICBhc3NlcnQoT3BObyA9PSAwICYmICJEb24ndCBrbm93IGhvdyB0byBwcm9tb3RlIHRoaXMgb3BlcmFuZCEiKTsKKworICBTRFZhbHVlIExIUyA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgUkhTID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgUHJvbW90ZVNldENDT3BlcmFuZHMoTEhTLCBSSFMsIGNhc3Q8Q29uZENvZGVTRE5vZGU+KE4tPmdldE9wZXJhbmQoMikpLT5nZXQoKSk7CisKKyAgLy8gVGhlIENDICgjMikgaXMgYWx3YXlzIGxlZ2FsLgorICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sIExIUywgUkhTLCBOLT5nZXRPcGVyYW5kKDIpKSwgMCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludE9wX1NoaWZ0KFNETm9kZSAqTikgeworICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFeHRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgxKSkpLCAwKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50T3BfU0lHTl9FWFRFTkQoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgT3AgPSBHZXRQcm9tb3RlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLCBOLT5nZXRWYWx1ZVR5cGUoMCksIE9wKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIE9wLCBEQUcuZ2V0VmFsdWVUeXBlKE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpQcm9tb3RlSW50T3BfU0lOVF9UT19GUChTRE5vZGUgKk4pIHsKKyAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRXh0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCkpKSwgMCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludE9wX1NUT1JFKFN0b3JlU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKXsKKyAgYXNzZXJ0KElTRDo6aXNVTklOREVYRURTdG9yZShOKSAmJiAiSW5kZXhlZCBzdG9yZSBkdXJpbmcgdHlwZSBsZWdhbGl6YXRpb24hIik7CisgIFNEVmFsdWUgQ2ggPSBOLT5nZXRDaGFpbigpLCBQdHIgPSBOLT5nZXRCYXNlUHRyKCk7CisgIGludCBTVk9mZnNldCA9IE4tPmdldFNyY1ZhbHVlT2Zmc2V0KCk7CisgIHVuc2lnbmVkIEFsaWdubWVudCA9IE4tPmdldEFsaWdubWVudCgpOworICBib29sIGlzVm9sYXRpbGUgPSBOLT5pc1ZvbGF0aWxlKCk7CisgIGJvb2wgaXNOb25UZW1wb3JhbCA9IE4tPmlzTm9uVGVtcG9yYWwoKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIFNEVmFsdWUgVmFsID0gR2V0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldFZhbHVlKCkpOyAgLy8gR2V0IHByb21vdGVkIHZhbHVlLgorCisgIC8vIFRydW5jYXRlIHRoZSB2YWx1ZSBhbmQgc3RvcmUgdGhlIHJlc3VsdC4KKyAgcmV0dXJuIERBRy5nZXRUcnVuY1N0b3JlKENoLCBkbCwgVmFsLCBQdHIsIE4tPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTVk9mZnNldCwgTi0+Z2V0TWVtb3J5VlQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsIEFsaWdubWVudCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludE9wX1RSVU5DQVRFKFNETm9kZSAqTikgeworICBTRFZhbHVlIE9wID0gR2V0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgTi0+Z2V0RGVidWdMb2MoKSwgTi0+Z2V0VmFsdWVUeXBlKDApLCBPcCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZUludE9wX1VJTlRfVE9fRlAoU0ROb2RlICpOKSB7CisgIHJldHVybiBTRFZhbHVlKERBRy5VcGRhdGVOb2RlT3BlcmFuZHMoTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkV4dFByb21vdGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApKSksIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlByb21vdGVJbnRPcF9aRVJPX0VYVEVORChTRE5vZGUgKk4pIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIE9wID0gR2V0UHJvbW90ZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCkpOworICBPcCA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIE4tPmdldFZhbHVlVHlwZSgwKSwgT3ApOworICByZXR1cm4gREFHLmdldFplcm9FeHRlbmRJblJlZyhPcCwgZGwsIE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgSW50ZWdlciBSZXN1bHQgRXhwYW5zaW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRXhwYW5kSW50ZWdlclJlc3VsdCAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBzcGVjaWZpZWQgcmVzdWx0IG9mIHRoZQorLy8vIHNwZWNpZmllZCBub2RlIGlzIGZvdW5kIHRvIG5lZWQgZXhwYW5zaW9uLiAgQXQgdGhpcyBwb2ludCwgdGhlIG5vZGUgbWF5IGFsc28KKy8vLyBoYXZlIGludmFsaWQgb3BlcmFuZHMgb3IgbWF5IGhhdmUgb3RoZXIgcmVzdWx0cyB0aGF0IG5lZWQgcHJvbW90aW9uLCB3ZSBqdXN0CisvLy8ga25vdyB0aGF0IChhdCBsZWFzdCkgb25lIHJlc3VsdCBuZWVkcyBleHBhbnNpb24uCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludGVnZXJSZXN1bHQoU0ROb2RlICpOLCB1bnNpZ25lZCBSZXNObykgeworICBERUJVRyhkYmdzKCkgPDwgIkV4cGFuZCBpbnRlZ2VyIHJlc3VsdDogIjsgTi0+ZHVtcCgmREFHKTsgZGJncygpIDw8ICJcbiIpOworICBTRFZhbHVlIExvLCBIaTsKKyAgTG8gPSBIaSA9IFNEVmFsdWUoKTsKKworICAvLyBTZWUgaWYgdGhlIHRhcmdldCB3YW50cyB0byBjdXN0b20gZXhwYW5kIHRoaXMgbm9kZS4KKyAgaWYgKEN1c3RvbUxvd2VyTm9kZShOLCBOLT5nZXRWYWx1ZVR5cGUoUmVzTm8pLCB0cnVlKSkKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorI2lmbmRlZiBOREVCVUcKKyAgICBkYmdzKCkgPDwgIkV4cGFuZEludGVnZXJSZXN1bHQgIyIgPDwgUmVzTm8gPDwgIjogIjsKKyAgICBOLT5kdW1wKCZEQUcpOyBkYmdzKCkgPDwgIlxuIjsKKyNlbmRpZgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkRvIG5vdCBrbm93IGhvdyB0byBleHBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdG9yISIpOworCisgIGNhc2UgSVNEOjpNRVJHRV9WQUxVRVM6IFNwbGl0UmVzX01FUkdFX1ZBTFVFUyhOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFTEVDVDogICAgICAgU3BsaXRSZXNfU0VMRUNUKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6U0VMRUNUX0NDOiAgICBTcGxpdFJlc19TRUxFQ1RfQ0MoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpVTkRFRjogICAgICAgIFNwbGl0UmVzX1VOREVGKE4sIExvLCBIaSk7IGJyZWFrOworCisgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDogICAgICAgIEV4cGFuZFJlc19CSVRfQ09OVkVSVChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkJVSUxEX1BBSVI6ICAgICAgICAgRXhwYW5kUmVzX0JVSUxEX1BBSVIoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpFWFRSQUNUX0VMRU1FTlQ6ICAgIEV4cGFuZFJlc19FWFRSQUNUX0VMRU1FTlQoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQ6IEV4cGFuZFJlc19FWFRSQUNUX1ZFQ1RPUl9FTFQoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpWQUFSRzogICAgICAgICAgICAgIEV4cGFuZFJlc19WQUFSRyhOLCBMbywgSGkpOyBicmVhazsKKworICBjYXNlIElTRDo6QU5ZX0VYVEVORDogIEV4cGFuZEludFJlc19BTllfRVhURU5EKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6QXNzZXJ0U2V4dDogIEV4cGFuZEludFJlc19Bc3NlcnRTZXh0KE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6QXNzZXJ0WmV4dDogIEV4cGFuZEludFJlc19Bc3NlcnRaZXh0KE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6QlNXQVA6ICAgICAgIEV4cGFuZEludFJlc19CU1dBUChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkNvbnN0YW50OiAgICBFeHBhbmRJbnRSZXNfQ29uc3RhbnQoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpDVExaOiAgICAgICAgRXhwYW5kSW50UmVzX0NUTFooTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpDVFBPUDogICAgICAgRXhwYW5kSW50UmVzX0NUUE9QKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6Q1RUWjogICAgICAgIEV4cGFuZEludFJlc19DVFRaKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RlBfVE9fU0lOVDogIEV4cGFuZEludFJlc19GUF9UT19TSU5UKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RlBfVE9fVUlOVDogIEV4cGFuZEludFJlc19GUF9UT19VSU5UKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6TE9BRDogICAgICAgIEV4cGFuZEludFJlc19MT0FEKGNhc3Q8TG9hZFNETm9kZT4oTiksIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6TVVMOiAgICAgICAgIEV4cGFuZEludFJlc19NVUwoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRElWOiAgICAgICAgRXhwYW5kSW50UmVzX1NESVYoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORDogRXhwYW5kSW50UmVzX1NJR05fRVhURU5EKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6U0lHTl9FWFRFTkRfSU5SRUc6IEV4cGFuZEludFJlc19TSUdOX0VYVEVORF9JTlJFRyhOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNSRU06ICAgICAgICBFeHBhbmRJbnRSZXNfU1JFTShOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OlRSVU5DQVRFOiAgICBFeHBhbmRJbnRSZXNfVFJVTkNBVEUoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpVRElWOiAgICAgICAgRXhwYW5kSW50UmVzX1VESVYoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpVUkVNOiAgICAgICAgRXhwYW5kSW50UmVzX1VSRU0oTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpaRVJPX0VYVEVORDogRXhwYW5kSW50UmVzX1pFUk9fRVhURU5EKE4sIExvLCBIaSk7IGJyZWFrOworCisgIGNhc2UgSVNEOjpBTkQ6CisgIGNhc2UgSVNEOjpPUjoKKyAgY2FzZSBJU0Q6OlhPUjogRXhwYW5kSW50UmVzX0xvZ2ljYWwoTiwgTG8sIEhpKTsgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OkFERDoKKyAgY2FzZSBJU0Q6OlNVQjogRXhwYW5kSW50UmVzX0FERFNVQihOLCBMbywgSGkpOyBicmVhazsKKworICBjYXNlIElTRDo6QUREQzoKKyAgY2FzZSBJU0Q6OlNVQkM6IEV4cGFuZEludFJlc19BRERTVUJDKE4sIExvLCBIaSk7IGJyZWFrOworCisgIGNhc2UgSVNEOjpBRERFOgorICBjYXNlIElTRDo6U1VCRTogRXhwYW5kSW50UmVzX0FERFNVQkUoTiwgTG8sIEhpKTsgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OlNITDoKKyAgY2FzZSBJU0Q6OlNSQToKKyAgY2FzZSBJU0Q6OlNSTDogRXhwYW5kSW50UmVzX1NoaWZ0KE4sIExvLCBIaSk7IGJyZWFrOworCisgIGNhc2UgSVNEOjpTQURETzoKKyAgY2FzZSBJU0Q6OlNTVUJPOiBFeHBhbmRJbnRSZXNfU0FERFNVQk8oTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpVQURETzoKKyAgY2FzZSBJU0Q6OlVTVUJPOiBFeHBhbmRJbnRSZXNfVUFERFNVQk8oTiwgTG8sIEhpKTsgYnJlYWs7CisgIH0KKworICAvLyBJZiBMby9IaSBpcyBudWxsLCB0aGUgc3ViLW1ldGhvZCB0b29rIGNhcmUgb2YgcmVnaXN0ZXJpbmcgcmVzdWx0cyBldGMuCisgIGlmIChMby5nZXROb2RlKCkpCisgICAgU2V0RXhwYW5kZWRJbnRlZ2VyKFNEVmFsdWUoTiwgUmVzTm8pLCBMbywgSGkpOworfQorCisvLy8gRXhwYW5kU2hpZnRCeUNvbnN0YW50IC0gTiBpcyBhIHNoaWZ0IGJ5IGEgdmFsdWUgdGhhdCBuZWVkcyB0byBiZSBleHBhbmRlZCwKKy8vLyBhbmQgdGhlIHNoaWZ0IGFtb3VudCBpcyBhIGNvbnN0YW50ICdBbXQnLiAgRXhwYW5kIHRoZSBvcGVyYXRpb24uCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZFNoaWZ0QnlDb25zdGFudChTRE5vZGUgKk4sIHVuc2lnbmVkIEFtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIC8vIEV4cGFuZCB0aGUgaW5jb21pbmcgb3BlcmFuZCB0byBiZSBzaGlmdGVkLCBzbyB0aGF0IHdlIGhhdmUgaXRzIHBhcnRzCisgIFNEVmFsdWUgSW5MLCBJbkg7CisgIEdldEV4cGFuZGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApLCBJbkwsIEluSCk7CisKKyAgRVZUIE5WVCA9IEluTC5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgVlRCaXRzID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFNpemVJbkJpdHMoKTsKKyAgdW5zaWduZWQgTlZUQml0cyA9IE5WVC5nZXRTaXplSW5CaXRzKCk7CisgIEVWVCBTaFR5ID0gTi0+Z2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKTsKKworICBpZiAoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTSEwpIHsKKyAgICBpZiAoQW10ID4gVlRCaXRzKSB7CisgICAgICBMbyA9IEhpID0gREFHLmdldENvbnN0YW50KDAsIE5WVCk7CisgICAgfSBlbHNlIGlmIChBbXQgPiBOVlRCaXRzKSB7CisgICAgICBMbyA9IERBRy5nZXRDb25zdGFudCgwLCBOVlQpOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgIE5WVCwgSW5MLCBEQUcuZ2V0Q29uc3RhbnQoQW10LU5WVEJpdHMsU2hUeSkpOworICAgIH0gZWxzZSBpZiAoQW10ID09IE5WVEJpdHMpIHsKKyAgICAgIExvID0gREFHLmdldENvbnN0YW50KDAsIE5WVCk7CisgICAgICBIaSA9IEluTDsKKyAgICB9IGVsc2UgaWYgKEFtdCA9PSAxICYmCisgICAgICAgICAgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6QUREQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRUeXBlVG9FeHBhbmRUbygqREFHLmdldENvbnRleHQoKSwgTlZUKSkpIHsKKyAgICAgIC8vIEVtaXQgdGhpcyBYIDw8IDEgYXMgWCtYLgorICAgICAgU0RWVExpc3QgVlRMaXN0ID0gREFHLmdldFZUTGlzdChOVlQsIE1WVDo6RmxhZyk7CisgICAgICBTRFZhbHVlIExvT3BzWzJdID0geyBJbkwsIEluTCB9OworICAgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkFEREMsIGRsLCBWVExpc3QsIExvT3BzLCAyKTsKKyAgICAgIFNEVmFsdWUgSGlPcHNbM10gPSB7IEluSCwgSW5ILCBMby5nZXRWYWx1ZSgxKSB9OworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFEREUsIGRsLCBWVExpc3QsIEhpT3BzLCAzKTsKKyAgICB9IGVsc2UgeworICAgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIE5WVCwgSW5MLCBEQUcuZ2V0Q29uc3RhbnQoQW10LCBTaFR5KSk7CisgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBOVlQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTlZULCBJbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChBbXQsIFNoVHkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBOVlQsIEluTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE5WVEJpdHMtQW10LCBTaFR5KSkpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBpZiAoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkwpIHsKKyAgICBpZiAoQW10ID4gVlRCaXRzKSB7CisgICAgICBMbyA9IERBRy5nZXRDb25zdGFudCgwLCBOVlQpOworICAgICAgSGkgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKTsKKyAgICB9IGVsc2UgaWYgKEFtdCA+IE5WVEJpdHMpIHsKKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICBOVlQsIEluSCwgREFHLmdldENvbnN0YW50KEFtdC1OVlRCaXRzLFNoVHkpKTsKKyAgICAgIEhpID0gREFHLmdldENvbnN0YW50KDAsIE5WVCk7CisgICAgfSBlbHNlIGlmIChBbXQgPT0gTlZUQml0cykgeworICAgICAgTG8gPSBJbkg7CisgICAgICBIaSA9IERBRy5nZXRDb25zdGFudCgwLCBOVlQpOworICAgIH0gZWxzZSB7CisgICAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBOVlQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTlZULCBJbkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChBbXQsIFNoVHkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBOVlQsIEluSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE5WVEJpdHMtQW10LCBTaFR5KSkpOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE5WVCwgSW5ILCBEQUcuZ2V0Q29uc3RhbnQoQW10LCBTaFR5KSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIGFzc2VydChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSQSAmJiAiVW5rbm93biBzaGlmdCEiKTsKKyAgaWYgKEFtdCA+IFZUQml0cykgeworICAgIEhpID0gTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSQSwgZGwsIE5WVCwgSW5ILAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTlZUQml0cy0xLCBTaFR5KSk7CisgIH0gZWxzZSBpZiAoQW10ID4gTlZUQml0cykgeworICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIGRsLCBOVlQsIEluSCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChBbXQtTlZUQml0cywgU2hUeSkpOworICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIGRsLCBOVlQsIEluSCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOVlRCaXRzLTEsIFNoVHkpKTsKKyAgfSBlbHNlIGlmIChBbXQgPT0gTlZUQml0cykgeworICAgIExvID0gSW5IOworICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIGRsLCBOVlQsIEluSCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOVlRCaXRzLTEsIFNoVHkpKTsKKyAgfSBlbHNlIHsKKyAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBOVlQsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE5WVCwgSW5MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEFtdCwgU2hUeSkpLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBOVlQsIEluSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOVlRCaXRzLUFtdCwgU2hUeSkpKTsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgTlZULCBJbkgsIERBRy5nZXRDb25zdGFudChBbXQsIFNoVHkpKTsKKyAgfQorfQorCisvLy8gRXhwYW5kU2hpZnRXaXRoS25vd25BbW91bnRCaXQgLSBUcnkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgY2FuIHNpbXBsaWZ5CisvLy8gdGhpcyBzaGlmdCBiYXNlZCBvbiBrbm93bGVkZ2Ugb2YgdGhlIGhpZ2ggYml0IG9mIHRoZSBzaGlmdCBhbW91bnQuICBJZiB3ZQorLy8vIGNhbiB0ZWxsIHRoaXMsIHdlIGtub3cgdGhhdCBpdCBpcyA+PSAzMiBvciA8IDMyLCB3aXRob3V0IGtub3dpbmcgdGhlIGFjdHVhbAorLy8vIHNoaWZ0IGFtb3VudC4KK2Jvb2wgREFHVHlwZUxlZ2FsaXplcjo6CitFeHBhbmRTaGlmdFdpdGhLbm93bkFtb3VudEJpdChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIEFtdCA9IE4tPmdldE9wZXJhbmQoMSk7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIEVWVCBTaFR5ID0gQW10LmdldFZhbHVlVHlwZSgpOworICB1bnNpZ25lZCBTaEJpdHMgPSBTaFR5LmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIE5WVEJpdHMgPSBOVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgYXNzZXJ0KGlzUG93ZXJPZjJfMzIoTlZUQml0cykgJiYKKyAgICAgICAgICJFeHBhbmRlZCBpbnRlZ2VyIHR5cGUgc2l6ZSBub3QgYSBwb3dlciBvZiB0d28hIik7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBBUEludCBIaWdoQml0TWFzayA9IEFQSW50OjpnZXRIaWdoQml0c1NldChTaEJpdHMsIFNoQml0cyAtIExvZzJfMzIoTlZUQml0cykpOworICBBUEludCBLbm93blplcm8sIEtub3duT25lOworICBEQUcuQ29tcHV0ZU1hc2tlZEJpdHMoTi0+Z2V0T3BlcmFuZCgxKSwgSGlnaEJpdE1hc2ssIEtub3duWmVybywgS25vd25PbmUpOworCisgIC8vIElmIHdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGhpZ2ggYml0cywgZXhpdC4KKyAgaWYgKCgoS25vd25aZXJvfEtub3duT25lKSAmIEhpZ2hCaXRNYXNrKSA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBHZXQgdGhlIGluY29taW5nIG9wZXJhbmQgdG8gYmUgc2hpZnRlZC4KKyAgU0RWYWx1ZSBJbkwsIEluSDsKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCksIEluTCwgSW5IKTsKKworICAvLyBJZiB3ZSBrbm93IHRoYXQgYW55IG9mIHRoZSBoaWdoIGJpdHMgb2YgdGhlIHNoaWZ0IGFtb3VudCBhcmUgb25lLCB0aGVuIHdlCisgIC8vIGNhbiBkbyB0aGlzIGFzIGEgY291cGxlIG9mIHNpbXBsZSBzaGlmdHMuCisgIGlmIChLbm93bk9uZS5pbnRlcnNlY3RzKEhpZ2hCaXRNYXNrKSkgeworICAgIC8vIE1hc2sgb3V0IHRoZSBoaWdoIGJpdCwgd2hpY2ggd2Uga25vdyBpcyBzZXQuCisgICAgQW10ID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBTaFR5LCBBbXQsCisgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KH5IaWdoQml0TWFzaywgU2hUeSkpOworCisgICAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc2hpZnQiKTsKKyAgICBjYXNlIElTRDo6U0hMOgorICAgICAgTG8gPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKTsgICAgICAgICAgICAgIC8vIExvdyBwYXJ0IGlzIHplcm8uCisgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTlZULCBJbkwsIEFtdCk7IC8vIEhpZ2ggcGFydCBmcm9tIExvIHBhcnQuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIElTRDo6U1JMOgorICAgICAgSGkgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKTsgICAgICAgICAgICAgIC8vIEhpIHBhcnQgaXMgemVyby4KKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBOVlQsIEluSCwgQW10KTsgLy8gTG8gcGFydCBmcm9tIEhpIHBhcnQuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIElTRDo6U1JBOgorICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSQSwgZGwsIE5WVCwgSW5ILCAgICAgICAvLyBTaWduIGV4dGVuZCBoaWdoIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOVlRCaXRzLTEsIFNoVHkpKTsKKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIGRsLCBOVlQsIEluSCwgQW10KTsgLy8gTG8gcGFydCBmcm9tIEhpIHBhcnQuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworI2lmIDAKKyAgLy8gRklYTUU6IFRoaXMgY29kZSBpcyBicm9rZW4gZm9yIHNoaWZ0cyB3aXRoIGEgemVybyBhbW91bnQhCisgIC8vIElmIHdlIGtub3cgdGhhdCBhbGwgb2YgdGhlIGhpZ2ggYml0cyBvZiB0aGUgc2hpZnQgYW1vdW50IGFyZSB6ZXJvLCB0aGVuIHdlCisgIC8vIGNhbiBkbyB0aGlzIGFzIGEgY291cGxlIG9mIHNpbXBsZSBzaGlmdHMuCisgIGlmICgoS25vd25aZXJvICYgSGlnaEJpdE1hc2spID09IEhpZ2hCaXRNYXNrKSB7CisgICAgLy8gQ29tcHV0ZSAzMi1hbXQuCisgICAgU0RWYWx1ZSBBbXQyID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIFNoVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTlZUQml0cywgU2hUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbXQpOworICAgIHVuc2lnbmVkIE9wMSwgT3AyOworICAgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNoaWZ0Iik7CisgICAgY2FzZSBJU0Q6OlNITDogIE9wMSA9IElTRDo6U0hMOyBPcDIgPSBJU0Q6OlNSTDsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNSTDoKKyAgICBjYXNlIElTRDo6U1JBOiAgT3AxID0gSVNEOjpTUkw7IE9wMiA9IElTRDo6U0hMOyBicmVhazsKKyAgICB9CisKKyAgICBMbyA9IERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBOVlQsIEluTCwgQW10KTsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6T1IsIE5WVCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKE9wMSwgTlZULCBJbkgsIEFtdCksCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShPcDIsIE5WVCwgSW5MLCBBbXQyKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEV4cGFuZFNoaWZ0V2l0aFVua25vd25BbW91bnRCaXQgLSBGdWxseSBnZW5lcmFsIGV4cGFuc2lvbiBvZiBpbnRlZ2VyIHNoaWZ0CisvLy8gb2YgYW55IHNpemUuCitib29sIERBR1R5cGVMZWdhbGl6ZXI6OgorRXhwYW5kU2hpZnRXaXRoVW5rbm93bkFtb3VudEJpdChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIEFtdCA9IE4tPmdldE9wZXJhbmQoMSk7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIEVWVCBTaFR5ID0gQW10LmdldFZhbHVlVHlwZSgpOworICB1bnNpZ25lZCBOVlRCaXRzID0gTlZULmdldFNpemVJbkJpdHMoKTsKKyAgYXNzZXJ0KGlzUG93ZXJPZjJfMzIoTlZUQml0cykgJiYKKyAgICAgICAgICJFeHBhbmRlZCBpbnRlZ2VyIHR5cGUgc2l6ZSBub3QgYSBwb3dlciBvZiB0d28hIik7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBHZXQgdGhlIGluY29taW5nIG9wZXJhbmQgdG8gYmUgc2hpZnRlZC4KKyAgU0RWYWx1ZSBJbkwsIEluSDsKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCksIEluTCwgSW5IKTsKKworICBTRFZhbHVlIE5WQml0c05vZGUgPSBEQUcuZ2V0Q29uc3RhbnQoTlZUQml0cywgU2hUeSk7CisgIFNEVmFsdWUgQW10RXhjZXNzID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBTaFR5LCBBbXQsIE5WQml0c05vZGUpOworICBTRFZhbHVlIEFtdExhY2sgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIFNoVHksIE5WQml0c05vZGUsIEFtdCk7CisgIFNEVmFsdWUgaXNTaG9ydCA9IERBRy5nZXRTZXRDQyhkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShTaFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFtdCwgTlZCaXRzTm9kZSwgSVNEOjpTRVRVTFQpOworCisgIFNEVmFsdWUgTG9TLCBIaVMsIExvTCwgSGlMOworICBzd2l0Y2ggKE4tPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc2hpZnQiKTsKKyAgY2FzZSBJU0Q6OlNITDoKKyAgICAvLyBTaG9ydDogU2hBbXQgPCBOVlRCaXRzCisgICAgTG9TID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBOVlQsIEluTCwgQW10KTsKKyAgICBIaVMgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTlZULAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTlZULCBJbkgsIEFtdCksCisgICAgLy8gRklYTUU6IElmIEFtdCBpcyB6ZXJvLCB0aGUgZm9sbG93aW5nIHNoaWZ0IGdlbmVyYXRlcyBhbiB1bmRlZmluZWQgcmVzdWx0CisgICAgLy8gb24gc29tZSBhcmNoaXRlY3R1cmVzLgorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTlZULCBJbkwsIEFtdExhY2spKTsKKworICAgIC8vIExvbmc6IFNoQW10ID49IE5WVEJpdHMKKyAgICBMb0wgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBMbyBwYXJ0IGlzIHplcm8uCisgICAgSGlMID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBOVlQsIEluTCwgQW10RXhjZXNzKTsgLy8gSGkgZnJvbSBMbyBwYXJ0LgorCisgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIE5WVCwgaXNTaG9ydCwgTG9TLCBMb0wpOworICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBOVlQsIGlzU2hvcnQsIEhpUywgSGlMKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBJU0Q6OlNSTDoKKyAgICAvLyBTaG9ydDogU2hBbXQgPCBOVlRCaXRzCisgICAgSGlTID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBOVlQsIEluSCwgQW10KTsKKyAgICBMb1MgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTlZULAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTlZULCBJbkwsIEFtdCksCisgICAgLy8gRklYTUU6IElmIEFtdCBpcyB6ZXJvLCB0aGUgZm9sbG93aW5nIHNoaWZ0IGdlbmVyYXRlcyBhbiB1bmRlZmluZWQgcmVzdWx0CisgICAgLy8gb24gc29tZSBhcmNoaXRlY3R1cmVzLgorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTlZULCBJbkgsIEFtdExhY2spKTsKKworICAgIC8vIExvbmc6IFNoQW10ID49IE5WVEJpdHMKKyAgICBIaUwgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIaSBwYXJ0IGlzIHplcm8uCisgICAgTG9MID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBOVlQsIEluSCwgQW10RXhjZXNzKTsgLy8gTG8gZnJvbSBIaSBwYXJ0LgorCisgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIE5WVCwgaXNTaG9ydCwgTG9TLCBMb0wpOworICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBOVlQsIGlzU2hvcnQsIEhpUywgSGlMKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBJU0Q6OlNSQToKKyAgICAvLyBTaG9ydDogU2hBbXQgPCBOVlRCaXRzCisgICAgSGlTID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIGRsLCBOVlQsIEluSCwgQW10KTsKKyAgICBMb1MgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTlZULAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTlZULCBJbkwsIEFtdCksCisgICAgLy8gRklYTUU6IElmIEFtdCBpcyB6ZXJvLCB0aGUgZm9sbG93aW5nIHNoaWZ0IGdlbmVyYXRlcyBhbiB1bmRlZmluZWQgcmVzdWx0CisgICAgLy8gb24gc29tZSBhcmNoaXRlY3R1cmVzLgorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTlZULCBJbkgsIEFtdExhY2spKTsKKworICAgIC8vIExvbmc6IFNoQW10ID49IE5WVEJpdHMKKyAgICBIaUwgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSQSwgZGwsIE5WVCwgSW5ILCAgICAgICAgICAgICAvLyBTaWduIG9mIEhpIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE5WVEJpdHMtMSwgU2hUeSkpOworICAgIExvTCA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgTlZULCBJbkgsIEFtdEV4Y2Vzcyk7IC8vIExvIGZyb20gSGkgcGFydC4KKworICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBOVlQsIGlzU2hvcnQsIExvUywgTG9MKTsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgTlZULCBpc1Nob3J0LCBIaVMsIEhpTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX0FERFNVQihTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgLy8gRXhwYW5kIHRoZSBzdWJjb21wb25lbnRzLgorICBTRFZhbHVlIExIU0wsIExIU0gsIFJIU0wsIFJIU0g7CisgIEdldEV4cGFuZGVkSW50ZWdlcihOLT5nZXRPcGVyYW5kKDApLCBMSFNMLCBMSFNIKTsKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMSksIFJIU0wsIFJIU0gpOworCisgIEVWVCBOVlQgPSBMSFNMLmdldFZhbHVlVHlwZSgpOworICBTRFZhbHVlIExvT3BzWzJdID0geyBMSFNMLCBSSFNMIH07CisgIFNEVmFsdWUgSGlPcHNbM10gPSB7IExIU0gsIFJIU0ggfTsKKworICAvLyBEbyBub3QgZ2VuZXJhdGUgQUREQy9BRERFIG9yIFNVQkMvU1VCRSBpZiB0aGUgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQKKyAgLy8gdGhlbS4gIFRPRE86IFRlYWNoIG9wZXJhdGlvbiBsZWdhbGl6YXRpb24gaG93IHRvIGV4cGFuZCB1bnN1cHBvcnRlZAorICAvLyBBRERDL0FEREUvU1VCQy9TVUJFLiAgVGhlIHByb2JsZW0gaXMgdGhhdCB0aGVzZSBvcGVyYXRpb25zIGdlbmVyYXRlCisgIC8vIGEgY2Fycnkgb2YgdHlwZSBNVlQ6OkZsYWcsIGJ1dCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IHdheSB0bworICAvLyBnZW5lcmF0ZSBhIHZhbHVlIG9mIHRoaXMgdHlwZSBpbiB0aGUgZXhwYW5kZWQgY29kZSBzZXF1ZW5jZS4KKyAgYm9vbCBoYXNDYXJyeSA9CisgICAgVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QUREQyA6IElTRDo6U1VCQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRUeXBlVG9FeHBhbmRUbygqREFHLmdldENvbnRleHQoKSwgTlZUKSk7CisKKyAgaWYgKGhhc0NhcnJ5KSB7CisgICAgU0RWVExpc3QgVlRMaXN0ID0gREFHLmdldFZUTGlzdChOVlQsIE1WVDo6RmxhZyk7CisgICAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6QUREKSB7CisgICAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6QUREQywgZGwsIFZUTGlzdCwgTG9PcHMsIDIpOworICAgICAgSGlPcHNbMl0gPSBMby5nZXRWYWx1ZSgxKTsKKyAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpBRERFLCBkbCwgVlRMaXN0LCBIaU9wcywgMyk7CisgICAgfSBlbHNlIHsKKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpTVUJDLCBkbCwgVlRMaXN0LCBMb09wcywgMik7CisgICAgICBIaU9wc1syXSA9IExvLmdldFZhbHVlKDEpOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQkUsIGRsLCBWVExpc3QsIEhpT3BzLCAzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6QUREKSB7CisgICAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTlZULCBMb09wcywgMik7CisgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTlZULCBIaU9wcywgMik7CisgICAgICBTRFZhbHVlIENtcDEgPSBEQUcuZ2V0U2V0Q0MoZGwsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoTlZUKSwgTG8sIExvT3BzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUVUxUKTsKKyAgICAgIFNEVmFsdWUgQ2FycnkxID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBOVlQsIENtcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBOVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKSk7CisgICAgICBTRFZhbHVlIENtcDIgPSBEQUcuZ2V0U2V0Q0MoZGwsIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoTlZUKSwgTG8sIExvT3BzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUVUxUKTsKKyAgICAgIFNEVmFsdWUgQ2FycnkyID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBOVlQsIENtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBOVlQpLCBDYXJyeTEpOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE5WVCwgSGksIENhcnJ5Mik7CisgICAgfSBlbHNlIHsKKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBOVlQsIExvT3BzLCAyKTsKKyAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBOVlQsIEhpT3BzLCAyKTsKKyAgICAgIFNEVmFsdWUgQ21wID0KKyAgICAgICAgREFHLmdldFNldENDKGRsLCBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKExvT3BzWzBdLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgIExvT3BzWzBdLCBMb09wc1sxXSwgSVNEOjpTRVRVTFQpOworICAgICAgU0RWYWx1ZSBCb3Jyb3cgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIE5WVCwgQ21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgTlZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE5WVCkpOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIE5WVCwgSGksIEJvcnJvdyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX0FERFNVQkMoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgLy8gRXhwYW5kIHRoZSBzdWJjb21wb25lbnRzLgorICBTRFZhbHVlIExIU0wsIExIU0gsIFJIU0wsIFJIU0g7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCksIExIU0wsIExIU0gpOworICBHZXRFeHBhbmRlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgxKSwgUkhTTCwgUkhTSCk7CisgIFNEVlRMaXN0IFZUTGlzdCA9IERBRy5nZXRWVExpc3QoTEhTTC5nZXRWYWx1ZVR5cGUoKSwgTVZUOjpGbGFnKTsKKyAgU0RWYWx1ZSBMb09wc1syXSA9IHsgTEhTTCwgUkhTTCB9OworICBTRFZhbHVlIEhpT3BzWzNdID0geyBMSFNILCBSSFNIIH07CisKKyAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6QUREQykgeworICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpBRERDLCBkbCwgVlRMaXN0LCBMb09wcywgMik7CisgICAgSGlPcHNbMl0gPSBMby5nZXRWYWx1ZSgxKTsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6QURERSwgZGwsIFZUTGlzdCwgSGlPcHMsIDMpOworICB9IGVsc2UgeworICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpTVUJDLCBkbCwgVlRMaXN0LCBMb09wcywgMik7CisgICAgSGlPcHNbMl0gPSBMby5nZXRWYWx1ZSgxKTsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6U1VCRSwgZGwsIFZUTGlzdCwgSGlPcHMsIDMpOworICB9CisKKyAgLy8gTGVnYWxpemVkIHRoZSBmbGFnIHJlc3VsdCAtIHN3aXRjaCBhbnl0aGluZyB0aGF0IHVzZWQgdGhlIG9sZCBmbGFnIHRvCisgIC8vIHVzZSB0aGUgbmV3IG9uZS4KKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBIaS5nZXRWYWx1ZSgxKSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX0FERFNVQkUoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgLy8gRXhwYW5kIHRoZSBzdWJjb21wb25lbnRzLgorICBTRFZhbHVlIExIU0wsIExIU0gsIFJIU0wsIFJIU0g7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCksIExIU0wsIExIU0gpOworICBHZXRFeHBhbmRlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgxKSwgUkhTTCwgUkhTSCk7CisgIFNEVlRMaXN0IFZUTGlzdCA9IERBRy5nZXRWVExpc3QoTEhTTC5nZXRWYWx1ZVR5cGUoKSwgTVZUOjpGbGFnKTsKKyAgU0RWYWx1ZSBMb09wc1szXSA9IHsgTEhTTCwgUkhTTCwgTi0+Z2V0T3BlcmFuZCgyKSB9OworICBTRFZhbHVlIEhpT3BzWzNdID0geyBMSFNILCBSSFNIIH07CisKKyAgTG8gPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgZGwsIFZUTGlzdCwgTG9PcHMsIDMpOworICBIaU9wc1syXSA9IExvLmdldFZhbHVlKDEpOworICBIaSA9IERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBkbCwgVlRMaXN0LCBIaU9wcywgMyk7CisKKyAgLy8gTGVnYWxpemVkIHRoZSBmbGFnIHJlc3VsdCAtIHN3aXRjaCBhbnl0aGluZyB0aGF0IHVzZWQgdGhlIG9sZCBmbGFnIHRvCisgIC8vIHVzZSB0aGUgbmV3IG9uZS4KKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBIaS5nZXRWYWx1ZSgxKSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX0FOWV9FWFRFTkQoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIE9wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgaWYgKE9wLmdldFZhbHVlVHlwZSgpLmJpdHNMRShOVlQpKSB7CisgICAgLy8gVGhlIGxvdyBwYXJ0IGlzIGFueSBleHRlbnNpb24gb2YgdGhlIGlucHV0ICh3aGljaCBkZWdlbmVyYXRlcyB0byBhIGNvcHkpLgorICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwgTlZULCBPcCk7CisgICAgSGkgPSBEQUcuZ2V0VU5ERUYoTlZUKTsgICAvLyBUaGUgaGlnaCBwYXJ0IGlzIHVuZGVmaW5lZC4KKyAgfSBlbHNlIHsKKyAgICAvLyBGb3IgZXhhbXBsZSwgZXh0ZW5zaW9uIG9mIGFuIGk0OCB0byBhbiBpNjQuICBUaGUgb3BlcmFuZCB0eXBlIG5lY2Vzc2FyaWx5CisgICAgLy8gcHJvbW90ZXMgdG8gdGhlIHJlc3VsdCB0eXBlLCBzbyB3aWxsIGVuZCB1cCBiZWluZyBleHBhbmRlZCB0b28uCisgICAgYXNzZXJ0KGdldFR5cGVBY3Rpb24oT3AuZ2V0VmFsdWVUeXBlKCkpID09IFByb21vdGVJbnRlZ2VyICYmCisgICAgICAgICAgICJPbmx5IGtub3cgaG93IHRvIHByb21vdGUgdGhpcyByZXN1bHQhIik7CisgICAgU0RWYWx1ZSBSZXMgPSBHZXRQcm9tb3RlZEludGVnZXIoT3ApOworICAgIGFzc2VydChSZXMuZ2V0VmFsdWVUeXBlKCkgPT0gTi0+Z2V0VmFsdWVUeXBlKDApICYmCisgICAgICAgICAgICJPcGVyYW5kIG92ZXIgcHJvbW90ZWQ/Iik7CisgICAgLy8gU3BsaXQgdGhlIHByb21vdGVkIG9wZXJhbmQuICBUaGlzIHdpbGwgc2ltcGxpZnkgd2hlbiBpdCBpcyBleHBhbmRlZC4KKyAgICBTcGxpdEludGVnZXIoUmVzLCBMbywgSGkpOworICB9Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX0Fzc2VydFNleHQoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRFeHBhbmRlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSwgTG8sIEhpKTsKKyAgRVZUIE5WVCA9IExvLmdldFZhbHVlVHlwZSgpOworICBFVlQgRVZUID0gY2FzdDxWVFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldFZUKCk7CisgIHVuc2lnbmVkIE5WVEJpdHMgPSBOVlQuZ2V0U2l6ZUluQml0cygpOworICB1bnNpZ25lZCBFVlRCaXRzID0gRVZULmdldFNpemVJbkJpdHMoKTsKKworICBpZiAoTlZUQml0cyA8IEVWVEJpdHMpIHsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0U2V4dCwgZGwsIE5WVCwgSGksCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlRCaXRzIC0gTlZUQml0cykpKTsKKyAgfSBlbHNlIHsKKyAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0U2V4dCwgZGwsIE5WVCwgTG8sIERBRy5nZXRWYWx1ZVR5cGUoRVZUKSk7CisgICAgLy8gVGhlIGhpZ2ggcGFydCByZXBsaWNhdGVzIHRoZSBzaWduIGJpdCBvZiBMbywgbWFrZSBpdCBleHBsaWNpdC4KKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgTlZULCBMbywKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOVlRCaXRzLTEsIFRMSS5nZXRQb2ludGVyVHkoKSkpOworICB9Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX0Fzc2VydFpleHQoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRFeHBhbmRlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSwgTG8sIEhpKTsKKyAgRVZUIE5WVCA9IExvLmdldFZhbHVlVHlwZSgpOworICBFVlQgRVZUID0gY2FzdDxWVFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldFZUKCk7CisgIHVuc2lnbmVkIE5WVEJpdHMgPSBOVlQuZ2V0U2l6ZUluQml0cygpOworICB1bnNpZ25lZCBFVlRCaXRzID0gRVZULmdldFNpemVJbkJpdHMoKTsKKworICBpZiAoTlZUQml0cyA8IEVWVEJpdHMpIHsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0WmV4dCwgZGwsIE5WVCwgSGksCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlRCaXRzIC0gTlZUQml0cykpKTsKKyAgfSBlbHNlIHsKKyAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0WmV4dCwgZGwsIE5WVCwgTG8sIERBRy5nZXRWYWx1ZVR5cGUoRVZUKSk7CisgICAgLy8gVGhlIGhpZ2ggcGFydCBtdXN0IGJlIHplcm8sIG1ha2UgaXQgZXhwbGljaXQuCisgICAgSGkgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKTsKKyAgfQorfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludFJlc19CU1dBUChTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRFeHBhbmRlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSwgSGksIExvKTsgIC8vIE5vdGUgc3dhcHBlZCBvcGVyYW5kcy4KKyAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkJTV0FQLCBkbCwgTG8uZ2V0VmFsdWVUeXBlKCksIExvKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJTV0FQLCBkbCwgSGkuZ2V0VmFsdWVUeXBlKCksIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRSZXNfQ29uc3RhbnQoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIHVuc2lnbmVkIE5CaXRXaWR0aCA9IE5WVC5nZXRTaXplSW5CaXRzKCk7CisgIGNvbnN0IEFQSW50ICZDc3QgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOKS0+Z2V0QVBJbnRWYWx1ZSgpOworICBMbyA9IERBRy5nZXRDb25zdGFudChBUEludChDc3QpLnRydW5jKE5CaXRXaWR0aCksIE5WVCk7CisgIEhpID0gREFHLmdldENvbnN0YW50KENzdC5sc2hyKE5CaXRXaWR0aCkudHJ1bmMoTkJpdFdpZHRoKSwgTlZUKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRSZXNfQ1RMWihTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIC8vIGN0bHogKEhpTG8pIC0+IEhpICE9IDAgPyBjdGx6KEhpKSA6IChjdGx6KExvKSszMikKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCksIExvLCBIaSk7CisgIEVWVCBOVlQgPSBMby5nZXRWYWx1ZVR5cGUoKTsKKworICBTRFZhbHVlIEhpTm90WmVybyA9IERBRy5nZXRTZXRDQyhkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShOVlQpLCBIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE5WVCksIElTRDo6U0VUTkUpOworCisgIFNEVmFsdWUgTG9MWiA9IERBRy5nZXROb2RlKElTRDo6Q1RMWiwgZGwsIE5WVCwgTG8pOworICBTRFZhbHVlIEhpTFogPSBEQUcuZ2V0Tm9kZShJU0Q6OkNUTFosIGRsLCBOVlQsIEhpKTsKKworICBMbyA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgTlZULCBIaU5vdFplcm8sIEhpTFosCisgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBOVlQsIExvTFosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE5WVC5nZXRTaXplSW5CaXRzKCksIE5WVCkpKTsKKyAgSGkgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRSZXNfQ1RQT1AoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgLy8gY3Rwb3AoSGlMbykgLT4gY3Rwb3AoSGkpK2N0cG9wKExvKQorICBHZXRFeHBhbmRlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSwgTG8sIEhpKTsKKyAgRVZUIE5WVCA9IExvLmdldFZhbHVlVHlwZSgpOworICBMbyA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTlZULCBEQUcuZ2V0Tm9kZShJU0Q6OkNUUE9QLCBkbCwgTlZULCBMbyksCisgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpDVFBPUCwgZGwsIE5WVCwgSGkpKTsKKyAgSGkgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRSZXNfQ1RUWihTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIC8vIGN0dHogKEhpTG8pIC0+IExvICE9IDAgPyBjdHR6KExvKSA6IChjdHR6KEhpKSszMikKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCksIExvLCBIaSk7CisgIEVWVCBOVlQgPSBMby5nZXRWYWx1ZVR5cGUoKTsKKworICBTRFZhbHVlIExvTm90WmVybyA9IERBRy5nZXRTZXRDQyhkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShOVlQpLCBMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE5WVCksIElTRDo6U0VUTkUpOworCisgIFNEVmFsdWUgTG9MWiA9IERBRy5nZXROb2RlKElTRDo6Q1RUWiwgZGwsIE5WVCwgTG8pOworICBTRFZhbHVlIEhpTFogPSBEQUcuZ2V0Tm9kZShJU0Q6OkNUVFosIGRsLCBOVlQsIEhpKTsKKworICBMbyA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgTlZULCBMb05vdFplcm8sIExvTFosCisgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBOVlQsIEhpTFosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE5WVC5nZXRTaXplSW5CaXRzKCksIE5WVCkpKTsKKyAgSGkgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTlZUKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRSZXNfRlBfVE9fU0lOVChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgU0RWYWx1ZSBPcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OmdldEZQVE9TSU5UKE9wLmdldFZhbHVlVHlwZSgpLCBWVCk7CisgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmICJVbmV4cGVjdGVkIGZwLXRvLXNpbnQgY29udmVyc2lvbiEiKTsKKyAgU3BsaXRJbnRlZ2VyKE1ha2VMaWJDYWxsKExDLCBWVCwgJk9wLCAxLCB0cnVlLyppcnJlbGV2YW50Ki8sIGRsKSwgTG8sIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRSZXNfRlBfVE9fVUlOVChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgU0RWYWx1ZSBPcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OmdldEZQVE9VSU5UKE9wLmdldFZhbHVlVHlwZSgpLCBWVCk7CisgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmICJVbmV4cGVjdGVkIGZwLXRvLXVpbnQgY29udmVyc2lvbiEiKTsKKyAgU3BsaXRJbnRlZ2VyKE1ha2VMaWJDYWxsKExDLCBWVCwgJk9wLCAxLCBmYWxzZS8qaXJyZWxldmFudCovLCBkbCksIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX0xPQUQoTG9hZFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIGlmIChJU0Q6OmlzTm9ybWFsTG9hZChOKSkgeworICAgIEV4cGFuZFJlc19Ob3JtYWxMb2FkKE4sIExvLCBIaSk7CisgICAgcmV0dXJuOworICB9CisKKyAgYXNzZXJ0KElTRDo6aXNVTklOREVYRURMb2FkKE4pICYmICJJbmRleGVkIGxvYWQgZHVyaW5nIHR5cGUgbGVnYWxpemF0aW9uISIpOworCisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgVlQpOworICBTRFZhbHVlIENoICA9IE4tPmdldENoYWluKCk7CisgIFNEVmFsdWUgUHRyID0gTi0+Z2V0QmFzZVB0cigpOworICBJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUgPSBOLT5nZXRFeHRlbnNpb25UeXBlKCk7CisgIGludCBTVk9mZnNldCA9IE4tPmdldFNyY1ZhbHVlT2Zmc2V0KCk7CisgIHVuc2lnbmVkIEFsaWdubWVudCA9IE4tPmdldEFsaWdubWVudCgpOworICBib29sIGlzVm9sYXRpbGUgPSBOLT5pc1ZvbGF0aWxlKCk7CisgIGJvb2wgaXNOb25UZW1wb3JhbCA9IE4tPmlzTm9uVGVtcG9yYWwoKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIGFzc2VydChOVlQuaXNCeXRlU2l6ZWQoKSAmJiAiRXhwYW5kZWQgdHlwZSBub3QgYnl0ZSBzaXplZCEiKTsKKworICBpZiAoTi0+Z2V0TWVtb3J5VlQoKS5iaXRzTEUoTlZUKSkgeworICAgIEVWVCBNZW1WVCA9IE4tPmdldE1lbW9yeVZUKCk7CisKKyAgICBMbyA9IERBRy5nZXRFeHRMb2FkKEV4dFR5cGUsIE5WVCwgZGwsIENoLCBQdHIsIE4tPmdldFNyY1ZhbHVlKCksIFNWT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgTWVtVlQsIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsIEFsaWdubWVudCk7CisKKyAgICAvLyBSZW1lbWJlciB0aGUgY2hhaW4uCisgICAgQ2ggPSBMby5nZXRWYWx1ZSgxKTsKKworICAgIGlmIChFeHRUeXBlID09IElTRDo6U0VYVExPQUQpIHsKKyAgICAgIC8vIFRoZSBoaWdoIHBhcnQgaXMgb2J0YWluZWQgYnkgU1JBJ2luZyBhbGwgYnV0IG9uZSBvZiB0aGUgYml0cyBvZiB0aGUKKyAgICAgIC8vIGxvIHBhcnQuCisgICAgICB1bnNpZ25lZCBMb1NpemUgPSBMby5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgTlZULCBMbywKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KExvU2l6ZS0xLCBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgICB9IGVsc2UgaWYgKEV4dFR5cGUgPT0gSVNEOjpaRVhUTE9BRCkgeworICAgICAgLy8gVGhlIGhpZ2ggcGFydCBpcyBqdXN0IGEgemVyby4KKyAgICAgIEhpID0gREFHLmdldENvbnN0YW50KDAsIE5WVCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChFeHRUeXBlID09IElTRDo6RVhUTE9BRCAmJiAiVW5rbm93biBleHRsb2FkISIpOworICAgICAgLy8gVGhlIGhpZ2ggcGFydCBpcyB1bmRlZmluZWQuCisgICAgICBIaSA9IERBRy5nZXRVTkRFRihOVlQpOworICAgIH0KKyAgfSBlbHNlIGlmIChUTEkuaXNMaXR0bGVFbmRpYW4oKSkgeworICAgIC8vIExpdHRsZS1lbmRpYW4gLSBsb3cgYml0cyBhcmUgYXQgbG93IGFkZHJlc3Nlcy4KKyAgICBMbyA9IERBRy5nZXRMb2FkKE5WVCwgZGwsIENoLCBQdHIsIE4tPmdldFNyY1ZhbHVlKCksIFNWT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwgQWxpZ25tZW50KTsKKworICAgIHVuc2lnbmVkIEV4Y2Vzc0JpdHMgPQorICAgICAgTi0+Z2V0TWVtb3J5VlQoKS5nZXRTaXplSW5CaXRzKCkgLSBOVlQuZ2V0U2l6ZUluQml0cygpOworICAgIEVWVCBORVZUID0gRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksIEV4Y2Vzc0JpdHMpOworCisgICAgLy8gSW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHRoZSBvdGhlciBoYWxmLgorICAgIHVuc2lnbmVkIEluY3JlbWVudFNpemUgPSBOVlQuZ2V0U2l6ZUluQml0cygpLzg7CisgICAgUHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHIuZ2V0VmFsdWVUeXBlKCksIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSW5jcmVtZW50U2l6ZSkpOworICAgIEhpID0gREFHLmdldEV4dExvYWQoRXh0VHlwZSwgTlZULCBkbCwgQ2gsIFB0ciwgTi0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0K0luY3JlbWVudFNpemUsIE5FVlQsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgTWluQWxpZ24oQWxpZ25tZW50LCBJbmNyZW1lbnRTaXplKSk7CisKKyAgICAvLyBCdWlsZCBhIGZhY3RvciBub2RlIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBsb2FkIGlzIGluZGVwZW5kZW50IG9mIHRoZQorICAgIC8vIG90aGVyIG9uZS4KKyAgICBDaCA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCBMby5nZXRWYWx1ZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgIEhpLmdldFZhbHVlKDEpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBCaWctZW5kaWFuIC0gaGlnaCBiaXRzIGFyZSBhdCBsb3cgYWRkcmVzc2VzLiAgRmF2b3IgYWxpZ25lZCBsb2FkcyBhdAorICAgIC8vIHRoZSBjb3N0IG9mIHNvbWUgYml0LWZpZGRsaW5nLgorICAgIEVWVCBNZW1WVCA9IE4tPmdldE1lbW9yeVZUKCk7CisgICAgdW5zaWduZWQgRUJ5dGVzID0gTWVtVlQuZ2V0U3RvcmVTaXplKCk7CisgICAgdW5zaWduZWQgSW5jcmVtZW50U2l6ZSA9IE5WVC5nZXRTaXplSW5CaXRzKCkvODsKKyAgICB1bnNpZ25lZCBFeGNlc3NCaXRzID0gKEVCeXRlcyAtIEluY3JlbWVudFNpemUpKjg7CisKKyAgICAvLyBMb2FkIGJvdGggdGhlIGhpZ2ggYml0cyBhbmQgbWF5YmUgc29tZSBvZiB0aGUgbG93IGJpdHMuCisgICAgSGkgPSBEQUcuZ2V0RXh0TG9hZChFeHRUeXBlLCBOVlQsIGRsLCBDaCwgUHRyLCBOLT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtVlQuZ2V0U2l6ZUluQml0cygpIC0gRXhjZXNzQml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLCBBbGlnbm1lbnQpOworCisgICAgLy8gSW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHRoZSBvdGhlciBoYWxmLgorICAgIFB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyLmdldFZhbHVlVHlwZSgpLCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluY3JlbWVudFNpemUpKTsKKyAgICAvLyBMb2FkIHRoZSByZXN0IG9mIHRoZSBsb3cgYml0cy4KKyAgICBMbyA9IERBRy5nZXRFeHRMb2FkKElTRDo6WkVYVExPQUQsIE5WVCwgZGwsIENoLCBQdHIsIE4tPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTVk9mZnNldCtJbmNyZW1lbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksIEV4Y2Vzc0JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pbkFsaWduKEFsaWdubWVudCwgSW5jcmVtZW50U2l6ZSkpOworCisgICAgLy8gQnVpbGQgYSBmYWN0b3Igbm9kZSB0byByZW1lbWJlciB0aGF0IHRoaXMgbG9hZCBpcyBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICAvLyBvdGhlciBvbmUuCisgICAgQ2ggPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgTG8uZ2V0VmFsdWUoMSksCisgICAgICAgICAgICAgICAgICAgICBIaS5nZXRWYWx1ZSgxKSk7CisKKyAgICBpZiAoRXhjZXNzQml0cyA8IE5WVC5nZXRTaXplSW5CaXRzKCkpIHsKKyAgICAgIC8vIFRyYW5zZmVyIGxvdyBiaXRzIGZyb20gdGhlIGJvdHRvbSBvZiBIaSB0byB0aGUgdG9wIG9mIExvLgorICAgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTlZULCBMbywKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBOVlQsIEhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoRXhjZXNzQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSkpKTsKKyAgICAgIC8vIE1vdmUgaGlnaCBiaXRzIHRvIHRoZSByaWdodCBwb3NpdGlvbiBpbiBIaS4KKyAgICAgIEhpID0gREFHLmdldE5vZGUoRXh0VHlwZSA9PSBJU0Q6OlNFWFRMT0FEID8gSVNEOjpTUkEgOiBJU0Q6OlNSTCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgIE5WVCwgSGksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOVlQuZ2V0U2l6ZUluQml0cygpIC0gRXhjZXNzQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSkpOworICAgIH0KKyAgfQorCisgIC8vIExlZ2FsaXplZCB0aGUgY2hhaW4gcmVzdWx0IC0gc3dpdGNoIGFueXRoaW5nIHRoYXQgdXNlZCB0aGUgb2xkIGNoYWluIHRvCisgIC8vIHVzZSB0aGUgbmV3IG9uZS4KKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBDaCk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX0xvZ2ljYWwoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIExMLCBMSCwgUkwsIFJIOworICBHZXRFeHBhbmRlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSwgTEwsIExIKTsKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMSksIFJMLCBSSCk7CisgIExvID0gREFHLmdldE5vZGUoTi0+Z2V0T3Bjb2RlKCksIGRsLCBMTC5nZXRWYWx1ZVR5cGUoKSwgTEwsIFJMKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgZGwsIExMLmdldFZhbHVlVHlwZSgpLCBMSCwgUkgpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludFJlc19NVUwoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIFZUKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIGJvb2wgSGFzTVVMSFMgPSBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6TVVMSFMsIE5WVCk7CisgIGJvb2wgSGFzTVVMSFUgPSBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6TVVMSFUsIE5WVCk7CisgIGJvb2wgSGFzU01VTF9MT0hJID0gVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OlNNVUxfTE9ISSwgTlZUKTsKKyAgYm9vbCBIYXNVTVVMX0xPSEkgPSBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6VU1VTF9MT0hJLCBOVlQpOworICBpZiAoSGFzTVVMSFUgfHwgSGFzTVVMSFMgfHwgSGFzVU1VTF9MT0hJIHx8IEhhc1NNVUxfTE9ISSkgeworICAgIFNEVmFsdWUgTEwsIExILCBSTCwgUkg7CisgICAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCksIExMLCBMSCk7CisgICAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMSksIFJMLCBSSCk7CisgICAgdW5zaWduZWQgT3V0ZXJCaXRTaXplID0gVlQuZ2V0U2l6ZUluQml0cygpOworICAgIHVuc2lnbmVkIElubmVyQml0U2l6ZSA9IE5WVC5nZXRTaXplSW5CaXRzKCk7CisgICAgdW5zaWduZWQgTEhTU0IgPSBEQUcuQ29tcHV0ZU51bVNpZ25CaXRzKE4tPmdldE9wZXJhbmQoMCkpOworICAgIHVuc2lnbmVkIFJIU1NCID0gREFHLkNvbXB1dGVOdW1TaWduQml0cyhOLT5nZXRPcGVyYW5kKDEpKTsKKworICAgIEFQSW50IEhpZ2hNYXNrID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KE91dGVyQml0U2l6ZSwgSW5uZXJCaXRTaXplKTsKKyAgICBpZiAoREFHLk1hc2tlZFZhbHVlSXNaZXJvKE4tPmdldE9wZXJhbmQoMCksIEhpZ2hNYXNrKSAmJgorICAgICAgICBEQUcuTWFza2VkVmFsdWVJc1plcm8oTi0+Z2V0T3BlcmFuZCgxKSwgSGlnaE1hc2spKSB7CisgICAgICAvLyBUaGUgaW5wdXRzIGFyZSBib3RoIHplcm8tZXh0ZW5kZWQuCisgICAgICBpZiAoSGFzVU1VTF9MT0hJKSB7CisgICAgICAgIC8vIFdlIGNhbiBlbWl0IGEgdW11bF9sb2hpLgorICAgICAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6VU1VTF9MT0hJLCBkbCwgREFHLmdldFZUTGlzdChOVlQsIE5WVCksIExMLCBSTCk7CisgICAgICAgIEhpID0gU0RWYWx1ZShMby5nZXROb2RlKCksIDEpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoSGFzTVVMSFUpIHsKKyAgICAgICAgLy8gV2UgY2FuIGVtaXQgYSBtdWxodSttdWwuCisgICAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpNVUwsIGRsLCBOVlQsIExMLCBSTCk7CisgICAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpNVUxIVSwgZGwsIE5WVCwgTEwsIFJMKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBpZiAoTEhTU0IgPiBJbm5lckJpdFNpemUgJiYgUkhTU0IgPiBJbm5lckJpdFNpemUpIHsKKyAgICAgIC8vIFRoZSBpbnB1dCB2YWx1ZXMgYXJlIGJvdGggc2lnbi1leHRlbmRlZC4KKyAgICAgIGlmIChIYXNTTVVMX0xPSEkpIHsKKyAgICAgICAgLy8gV2UgY2FuIGVtaXQgYSBzbXVsX2xvaGkuCisgICAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpTTVVMX0xPSEksIGRsLCBEQUcuZ2V0VlRMaXN0KE5WVCwgTlZUKSwgTEwsIFJMKTsKKyAgICAgICAgSGkgPSBTRFZhbHVlKExvLmdldE5vZGUoKSwgMSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChIYXNNVUxIUykgeworICAgICAgICAvLyBXZSBjYW4gZW1pdCBhIG11bGhzK211bC4KKyAgICAgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZGwsIE5WVCwgTEwsIFJMKTsKKyAgICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTEhTLCBkbCwgTlZULCBMTCwgUkwpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGlmIChIYXNVTVVMX0xPSEkpIHsKKyAgICAgIC8vIExvLEhpID0gdW11bCBMSFMsIFJIUy4KKyAgICAgIFNEVmFsdWUgVU11bExPSEkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlVNVUxfTE9ISSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlRMaXN0KE5WVCwgTlZUKSwgTEwsIFJMKTsKKyAgICAgIExvID0gVU11bExPSEk7CisgICAgICBIaSA9IFVNdWxMT0hJLmdldFZhbHVlKDEpOworICAgICAgUkggPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZGwsIE5WVCwgTEwsIFJIKTsKKyAgICAgIExIID0gREFHLmdldE5vZGUoSVNEOjpNVUwsIGRsLCBOVlQsIExILCBSTCk7CisgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTlZULCBIaSwgUkgpOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE5WVCwgSGksIExIKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKEhhc01VTEhVKSB7CisgICAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6TVVMLCBkbCwgTlZULCBMTCwgUkwpOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTEhVLCBkbCwgTlZULCBMTCwgUkwpOworICAgICAgUkggPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZGwsIE5WVCwgTEwsIFJIKTsKKyAgICAgIExIID0gREFHLmdldE5vZGUoSVNEOjpNVUwsIGRsLCBOVlQsIExILCBSTCk7CisgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTlZULCBIaSwgUkgpOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE5WVCwgSGksIExIKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBJZiBub3RoaW5nIGVsc2UsIHdlIGNhbiBtYWtlIGEgbGliY2FsbC4KKyAgUlRMSUI6OkxpYmNhbGwgTEMgPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMOworICBpZiAoVlQgPT0gTVZUOjppMTYpCisgICAgTEMgPSBSVExJQjo6TVVMX0kxNjsKKyAgZWxzZSBpZiAoVlQgPT0gTVZUOjppMzIpCisgICAgTEMgPSBSVExJQjo6TVVMX0kzMjsKKyAgZWxzZSBpZiAoVlQgPT0gTVZUOjppNjQpCisgICAgTEMgPSBSVExJQjo6TVVMX0k2NDsKKyAgZWxzZSBpZiAoVlQgPT0gTVZUOjppMTI4KQorICAgIExDID0gUlRMSUI6Ok1VTF9JMTI4OworICBhc3NlcnQoTEMgIT0gUlRMSUI6OlVOS05PV05fTElCQ0FMTCAmJiAiVW5zdXBwb3J0ZWQgTVVMISIpOworCisgIFNEVmFsdWUgT3BzWzJdID0geyBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpIH07CisgIFNwbGl0SW50ZWdlcihNYWtlTGliQ2FsbChMQywgVlQsIE9wcywgMiwgdHJ1ZS8qaXJyZWxldmFudCovLCBkbCksIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX1NBRERTVUJPKFNETm9kZSAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIExIUyA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgUkhTID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgPSBOb2RlLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIEV4cGFuZCB0aGUgcmVzdWx0IGJ5IHNpbXBseSByZXBsYWNpbmcgaXQgd2l0aCB0aGUgZXF1aXZhbGVudAorICAvLyBub24tb3ZlcmZsb3ctY2hlY2tpbmcgb3BlcmF0aW9uLgorICBTRFZhbHVlIFN1bSA9IERBRy5nZXROb2RlKE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6U0FERE8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QUREIDogSVNEOjpTVUIsIGRsLCBMSFMuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTLCBSSFMpOworICBTcGxpdEludGVnZXIoU3VtLCBMbywgSGkpOworCisgIC8vIENvbXB1dGUgdGhlIG92ZXJmbG93LgorICAvLworICAvLyAgIExIU1NpZ24gLT4gTEhTID49IDAKKyAgLy8gICBSSFNTaWduIC0+IFJIUyA+PSAwCisgIC8vICAgU3VtU2lnbiAtPiBTdW0gPj0gMAorICAvLworICAvLyAgIEFkZDoKKyAgLy8gICBPdmVyZmxvdyAtPiAoTEhTU2lnbiA9PSBSSFNTaWduKSAmJiAoTEhTU2lnbiAhPSBTdW1TaWduKQorICAvLyAgIFN1YjoKKyAgLy8gICBPdmVyZmxvdyAtPiAoTEhTU2lnbiAhPSBSSFNTaWduKSAmJiAoTEhTU2lnbiAhPSBTdW1TaWduKQorICAvLworICBFVlQgT1R5cGUgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMSk7CisgIFNEVmFsdWUgWmVybyA9IERBRy5nZXRDb25zdGFudCgwLCBMSFMuZ2V0VmFsdWVUeXBlKCkpOworCisgIFNEVmFsdWUgTEhTU2lnbiA9IERBRy5nZXRTZXRDQyhkbCwgT1R5cGUsIExIUywgWmVybywgSVNEOjpTRVRHRSk7CisgIFNEVmFsdWUgUkhTU2lnbiA9IERBRy5nZXRTZXRDQyhkbCwgT1R5cGUsIFJIUywgWmVybywgSVNEOjpTRVRHRSk7CisgIFNEVmFsdWUgU2lnbnNNYXRjaCA9IERBRy5nZXRTZXRDQyhkbCwgT1R5cGUsIExIU1NpZ24sIFJIU1NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNBRERPID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VURVEgOiBJU0Q6OlNFVE5FKTsKKworICBTRFZhbHVlIFN1bVNpZ24gPSBEQUcuZ2V0U2V0Q0MoZGwsIE9UeXBlLCBTdW0sIFplcm8sIElTRDo6U0VUR0UpOworICBTRFZhbHVlIFN1bVNpZ25ORSA9IERBRy5nZXRTZXRDQyhkbCwgT1R5cGUsIExIU1NpZ24sIFN1bVNpZ24sIElTRDo6U0VUTkUpOworCisgIFNEVmFsdWUgQ21wID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBPVHlwZSwgU2lnbnNNYXRjaCwgU3VtU2lnbk5FKTsKKworICAvLyBVc2UgdGhlIGNhbGN1bGF0ZWQgb3ZlcmZsb3cgZXZlcnl3aGVyZS4KKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE5vZGUsIDEpLCBDbXApOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludFJlc19TRElWKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OlVOS05PV05fTElCQ0FMTDsKKyAgaWYgKFZUID09IE1WVDo6aTE2KQorICAgIExDID0gUlRMSUI6OlNESVZfSTE2OworICBlbHNlIGlmIChWVCA9PSBNVlQ6OmkzMikKKyAgICBMQyA9IFJUTElCOjpTRElWX0kzMjsKKyAgZWxzZSBpZiAoVlQgPT0gTVZUOjppNjQpCisgICAgTEMgPSBSVExJQjo6U0RJVl9JNjQ7CisgIGVsc2UgaWYgKFZUID09IE1WVDo6aTEyOCkKKyAgICBMQyA9IFJUTElCOjpTRElWX0kxMjg7CisgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmICJVbnN1cHBvcnRlZCBTRElWISIpOworCisgIFNEVmFsdWUgT3BzWzJdID0geyBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpIH07CisgIFNwbGl0SW50ZWdlcihNYWtlTGliQ2FsbChMQywgVlQsIE9wcywgMiwgdHJ1ZSwgZGwpLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludFJlc19TaGlmdChTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgLy8gSWYgd2UgY2FuIGVtaXQgYW4gZWZmaWNpZW50IHNoaWZ0IG9wZXJhdGlvbiwgZG8gc28gbm93LiAgQ2hlY2sgdG8gc2VlIGlmCisgIC8vIHRoZSBSSFMgaXMgYSBjb25zdGFudC4KKyAgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKSkKKyAgICByZXR1cm4gRXhwYW5kU2hpZnRCeUNvbnN0YW50KE4sIENOLT5nZXRaRXh0VmFsdWUoKSwgTG8sIEhpKTsKKworICAvLyBJZiB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlIGhpZ2ggYml0IG9mIHRoZSBzaGlmdCBpcyB6ZXJvIG9yIG9uZSwgZXZlbiBpZgorICAvLyB0aGUgbG93IGJpdHMgYXJlIHZhcmlhYmxlLCBlbWl0IHRoaXMgc2hpZnQgaW4gYW4gb3B0aW1pemVkIGZvcm0uCisgIGlmIChFeHBhbmRTaGlmdFdpdGhLbm93bkFtb3VudEJpdChOLCBMbywgSGkpKQorICAgIHJldHVybjsKKworICAvLyBJZiB0aGlzIHRhcmdldCBzdXBwb3J0cyBzaGlmdF9QQVJUUywgdXNlIGl0LiAgRmlyc3QsIG1hcCB0byB0aGUgX1BBUlRTIG9wYy4KKyAgdW5zaWduZWQgUGFydHNPcGM7CisgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCkgeworICAgIFBhcnRzT3BjID0gSVNEOjpTSExfUEFSVFM7CisgIH0gZWxzZSBpZiAoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkwpIHsKKyAgICBQYXJ0c09wYyA9IElTRDo6U1JMX1BBUlRTOworICB9IGVsc2UgeworICAgIGFzc2VydChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSQSAmJiAiVW5rbm93biBzaGlmdCEiKTsKKyAgICBQYXJ0c09wYyA9IElTRDo6U1JBX1BBUlRTOworICB9CisKKyAgLy8gTmV4dCBjaGVjayB0byBzZWUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyB0aGlzIFNITF9QQVJUUyBvcGVyYXRpb24gb3IgaWYgaXQKKyAgLy8gd2lsbCBjdXN0b20gZXhwYW5kIGl0LgorICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBWVCk7CisgIFRhcmdldExvd2VyaW5nOjpMZWdhbGl6ZUFjdGlvbiBBY3Rpb24gPSBUTEkuZ2V0T3BlcmF0aW9uQWN0aW9uKFBhcnRzT3BjLCBOVlQpOworICBpZiAoKEFjdGlvbiA9PSBUYXJnZXRMb3dlcmluZzo6TGVnYWwgJiYgVExJLmlzVHlwZUxlZ2FsKE5WVCkpIHx8CisgICAgICBBY3Rpb24gPT0gVGFyZ2V0TG93ZXJpbmc6OkN1c3RvbSkgeworICAgIC8vIEV4cGFuZCB0aGUgc3ViY29tcG9uZW50cy4KKyAgICBTRFZhbHVlIExIU0wsIExIU0g7CisgICAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCksIExIU0wsIExIU0gpOworCisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTEhTTCwgTEhTSCwgTi0+Z2V0T3BlcmFuZCgxKSB9OworICAgIEVWVCBWVCA9IExIU0wuZ2V0VmFsdWVUeXBlKCk7CisgICAgTG8gPSBEQUcuZ2V0Tm9kZShQYXJ0c09wYywgZGwsIERBRy5nZXRWVExpc3QoVlQsIFZUKSwgT3BzLCAzKTsKKyAgICBIaSA9IExvLmdldFZhbHVlKDEpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgZW1pdCBhIGxpYmNhbGwuCisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OlVOS05PV05fTElCQ0FMTDsKKyAgYm9vbCBpc1NpZ25lZDsKKyAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6U0hMKSB7CisgICAgaXNTaWduZWQgPSBmYWxzZTsgLypzaWduIGlycmVsZXZhbnQqLworICAgIGlmIChWVCA9PSBNVlQ6OmkxNikKKyAgICAgIExDID0gUlRMSUI6OlNITF9JMTY7CisgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjppMzIpCisgICAgICBMQyA9IFJUTElCOjpTSExfSTMyOworICAgIGVsc2UgaWYgKFZUID09IE1WVDo6aTY0KQorICAgICAgTEMgPSBSVExJQjo6U0hMX0k2NDsKKyAgICBlbHNlIGlmIChWVCA9PSBNVlQ6OmkxMjgpCisgICAgICBMQyA9IFJUTElCOjpTSExfSTEyODsKKyAgfSBlbHNlIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSTCkgeworICAgIGlzU2lnbmVkID0gZmFsc2U7CisgICAgaWYgKFZUID09IE1WVDo6aTE2KQorICAgICAgTEMgPSBSVExJQjo6U1JMX0kxNjsKKyAgICBlbHNlIGlmIChWVCA9PSBNVlQ6OmkzMikKKyAgICAgIExDID0gUlRMSUI6OlNSTF9JMzI7CisgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjppNjQpCisgICAgICBMQyA9IFJUTElCOjpTUkxfSTY0OworICAgIGVsc2UgaWYgKFZUID09IE1WVDo6aTEyOCkKKyAgICAgIExDID0gUlRMSUI6OlNSTF9JMTI4OworICB9IGVsc2UgeworICAgIGFzc2VydChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSQSAmJiAiVW5rbm93biBzaGlmdCEiKTsKKyAgICBpc1NpZ25lZCA9IHRydWU7CisgICAgaWYgKFZUID09IE1WVDo6aTE2KQorICAgICAgTEMgPSBSVExJQjo6U1JBX0kxNjsKKyAgICBlbHNlIGlmIChWVCA9PSBNVlQ6OmkzMikKKyAgICAgIExDID0gUlRMSUI6OlNSQV9JMzI7CisgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjppNjQpCisgICAgICBMQyA9IFJUTElCOjpTUkFfSTY0OworICAgIGVsc2UgaWYgKFZUID09IE1WVDo6aTEyOCkKKyAgICAgIExDID0gUlRMSUI6OlNSQV9JMTI4OworICB9CisKKyAgaWYgKExDICE9IFJUTElCOjpVTktOT1dOX0xJQkNBTEwgJiYgVExJLmdldExpYmNhbGxOYW1lKExDKSkgeworICAgIFNEVmFsdWUgT3BzWzJdID0geyBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpIH07CisgICAgU3BsaXRJbnRlZ2VyKE1ha2VMaWJDYWxsKExDLCBWVCwgT3BzLCAyLCBpc1NpZ25lZCwgZGwpLCBMbywgSGkpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghRXhwYW5kU2hpZnRXaXRoVW5rbm93bkFtb3VudEJpdChOLCBMbywgSGkpKQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIHNoaWZ0ISIpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludFJlc19TSUdOX0VYVEVORChTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIE9wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgaWYgKE9wLmdldFZhbHVlVHlwZSgpLmJpdHNMRShOVlQpKSB7CisgICAgLy8gVGhlIGxvdyBwYXJ0IGlzIHNpZ24gZXh0ZW5zaW9uIG9mIHRoZSBpbnB1dCAoZGVnZW5lcmF0ZXMgdG8gYSBjb3B5KS4KKyAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkQsIGRsLCBOVlQsIE4tPmdldE9wZXJhbmQoMCkpOworICAgIC8vIFRoZSBoaWdoIHBhcnQgaXMgb2J0YWluZWQgYnkgU1JBJ2luZyBhbGwgYnV0IG9uZSBvZiB0aGUgYml0cyBvZiBsb3cgcGFydC4KKyAgICB1bnNpZ25lZCBMb1NpemUgPSBOVlQuZ2V0U2l6ZUluQml0cygpOworICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIGRsLCBOVlQsIExvLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KExvU2l6ZS0xLCBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBGb3IgZXhhbXBsZSwgZXh0ZW5zaW9uIG9mIGFuIGk0OCB0byBhbiBpNjQuICBUaGUgb3BlcmFuZCB0eXBlIG5lY2Vzc2FyaWx5CisgICAgLy8gcHJvbW90ZXMgdG8gdGhlIHJlc3VsdCB0eXBlLCBzbyB3aWxsIGVuZCB1cCBiZWluZyBleHBhbmRlZCB0b28uCisgICAgYXNzZXJ0KGdldFR5cGVBY3Rpb24oT3AuZ2V0VmFsdWVUeXBlKCkpID09IFByb21vdGVJbnRlZ2VyICYmCisgICAgICAgICAgICJPbmx5IGtub3cgaG93IHRvIHByb21vdGUgdGhpcyByZXN1bHQhIik7CisgICAgU0RWYWx1ZSBSZXMgPSBHZXRQcm9tb3RlZEludGVnZXIoT3ApOworICAgIGFzc2VydChSZXMuZ2V0VmFsdWVUeXBlKCkgPT0gTi0+Z2V0VmFsdWVUeXBlKDApICYmCisgICAgICAgICAgICJPcGVyYW5kIG92ZXIgcHJvbW90ZWQ/Iik7CisgICAgLy8gU3BsaXQgdGhlIHByb21vdGVkIG9wZXJhbmQuICBUaGlzIHdpbGwgc2ltcGxpZnkgd2hlbiBpdCBpcyBleHBhbmRlZC4KKyAgICBTcGxpdEludGVnZXIoUmVzLCBMbywgSGkpOworICAgIHVuc2lnbmVkIEV4Y2Vzc0JpdHMgPQorICAgICAgT3AuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpIC0gTlZULmdldFNpemVJbkJpdHMoKTsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIGRsLCBIaS5nZXRWYWx1ZVR5cGUoKSwgSGksCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlc3NCaXRzKSkpOworICB9Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6CitFeHBhbmRJbnRSZXNfU0lHTl9FWFRFTkRfSU5SRUcoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRFeHBhbmRlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSwgTG8sIEhpKTsKKyAgRVZUIEVWVCA9IGNhc3Q8VlRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpLT5nZXRWVCgpOworCisgIGlmIChFVlQuYml0c0xFKExvLmdldFZhbHVlVHlwZSgpKSkgeworICAgIC8vIHNleHRfaW5yZWcgdGhlIGxvdyBwYXJ0IGlmIG5lZWRlZC4KKyAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIGRsLCBMby5nZXRWYWx1ZVR5cGUoKSwgTG8sCisgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDEpKTsKKworICAgIC8vIFRoZSBoaWdoIHBhcnQgZ2V0cyB0aGUgc2lnbiBleHRlbnNpb24gZnJvbSB0aGUgbG8tcGFydC4gIFRoaXMgaGFuZGxlcworICAgIC8vIHRoaW5ncyBsaWtlIHNleHRpbnJlZyBWOmk2NCBmcm9tIGk4LgorICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIGRsLCBIaS5nZXRWYWx1ZVR5cGUoKSwgTG8sCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSGkuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpKSk7CisgIH0gZWxzZSB7CisgICAgLy8gRm9yIGV4YW1wbGUsIGV4dGVuc2lvbiBvZiBhbiBpNDggdG8gYW4gaTY0LiAgTGVhdmUgdGhlIGxvdyBwYXJ0IGFsb25lLAorICAgIC8vIHNleHRfaW5yZWcgdGhlIGhpZ2ggcGFydC4KKyAgICB1bnNpZ25lZCBFeGNlc3NCaXRzID0KKyAgICAgIEVWVC5nZXRTaXplSW5CaXRzKCkgLSBMby5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBkbCwgSGkuZ2V0VmFsdWVUeXBlKCksIEhpLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXNzQml0cykpKTsKKyAgfQorfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludFJlc19TUkVNKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OlVOS05PV05fTElCQ0FMTDsKKyAgaWYgKFZUID09IE1WVDo6aTE2KQorICAgIExDID0gUlRMSUI6OlNSRU1fSTE2OworICBlbHNlIGlmIChWVCA9PSBNVlQ6OmkzMikKKyAgICBMQyA9IFJUTElCOjpTUkVNX0kzMjsKKyAgZWxzZSBpZiAoVlQgPT0gTVZUOjppNjQpCisgICAgTEMgPSBSVExJQjo6U1JFTV9JNjQ7CisgIGVsc2UgaWYgKFZUID09IE1WVDo6aTEyOCkKKyAgICBMQyA9IFJUTElCOjpTUkVNX0kxMjg7CisgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmICJVbnN1cHBvcnRlZCBTUkVNISIpOworCisgIFNEVmFsdWUgT3BzWzJdID0geyBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpIH07CisgIFNwbGl0SW50ZWdlcihNYWtlTGliQ2FsbChMQywgVlQsIE9wcywgMiwgdHJ1ZSwgZGwpLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludFJlc19UUlVOQ0FURShTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBMbyA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBOVlQsIE4tPmdldE9wZXJhbmQoMCkpOworICBIaSA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwKKyAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOVlQuZ2V0U2l6ZUluQml0cygpLCBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTlZULCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX1VBRERTVUJPKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIExIUyA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgUkhTID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIEV4cGFuZCB0aGUgcmVzdWx0IGJ5IHNpbXBseSByZXBsYWNpbmcgaXQgd2l0aCB0aGUgZXF1aXZhbGVudAorICAvLyBub24tb3ZlcmZsb3ctY2hlY2tpbmcgb3BlcmF0aW9uLgorICBTRFZhbHVlIFN1bSA9IERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpID09IElTRDo6VUFERE8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QUREIDogSVNEOjpTVUIsIGRsLCBMSFMuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTLCBSSFMpOworICBTcGxpdEludGVnZXIoU3VtLCBMbywgSGkpOworCisgIC8vIENhbGN1bGF0ZSB0aGUgb3ZlcmZsb3c6IGFkZGl0aW9uIG92ZXJmbG93cyBpZmYgYSArIGIgPCBhLCBhbmQgc3VidHJhY3Rpb24KKyAgLy8gb3ZlcmZsb3dzIGlmZiBhIC0gYiA+IGEuCisgIFNEVmFsdWUgT2ZsID0gREFHLmdldFNldENDKGRsLCBOLT5nZXRWYWx1ZVR5cGUoMSksIFN1bSwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGNvZGUgKCkgPT0gSVNEOjpVQURETyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUVUxUIDogSVNEOjpTRVRVR1QpOworCisgIC8vIFVzZSB0aGUgY2FsY3VsYXRlZCBvdmVyZmxvdyBldmVyeXdoZXJlLgorICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksIE9mbCk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50UmVzX1VESVYoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgUlRMSUI6OkxpYmNhbGwgTEMgPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMOworICBpZiAoVlQgPT0gTVZUOjppMTYpCisgICAgTEMgPSBSVExJQjo6VURJVl9JMTY7CisgIGVsc2UgaWYgKFZUID09IE1WVDo6aTMyKQorICAgIExDID0gUlRMSUI6OlVESVZfSTMyOworICBlbHNlIGlmIChWVCA9PSBNVlQ6Omk2NCkKKyAgICBMQyA9IFJUTElCOjpVRElWX0k2NDsKKyAgZWxzZSBpZiAoVlQgPT0gTVZUOjppMTI4KQorICAgIExDID0gUlRMSUI6OlVESVZfSTEyODsKKyAgYXNzZXJ0KExDICE9IFJUTElCOjpVTktOT1dOX0xJQkNBTEwgJiYgIlVuc3VwcG9ydGVkIFVESVYhIik7CisKKyAgU0RWYWx1ZSBPcHNbMl0gPSB7IE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSkgfTsKKyAgU3BsaXRJbnRlZ2VyKE1ha2VMaWJDYWxsKExDLCBWVCwgT3BzLCAyLCBmYWxzZSwgZGwpLCBMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludFJlc19VUkVNKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OlVOS05PV05fTElCQ0FMTDsKKyAgaWYgKFZUID09IE1WVDo6aTE2KQorICAgIExDID0gUlRMSUI6OlVSRU1fSTE2OworICBlbHNlIGlmIChWVCA9PSBNVlQ6OmkzMikKKyAgICBMQyA9IFJUTElCOjpVUkVNX0kzMjsKKyAgZWxzZSBpZiAoVlQgPT0gTVZUOjppNjQpCisgICAgTEMgPSBSVExJQjo6VVJFTV9JNjQ7CisgIGVsc2UgaWYgKFZUID09IE1WVDo6aTEyOCkKKyAgICBMQyA9IFJUTElCOjpVUkVNX0kxMjg7CisgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmICJVbnN1cHBvcnRlZCBVUkVNISIpOworCisgIFNEVmFsdWUgT3BzWzJdID0geyBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpIH07CisgIFNwbGl0SW50ZWdlcihNYWtlTGliQ2FsbChMQywgVlQsIE9wcywgMiwgZmFsc2UsIGRsKSwgTG8sIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRSZXNfWkVST19FWFRFTkQoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBPcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIGlmIChPcC5nZXRWYWx1ZVR5cGUoKS5iaXRzTEUoTlZUKSkgeworICAgIC8vIFRoZSBsb3cgcGFydCBpcyB6ZXJvIGV4dGVuc2lvbiBvZiB0aGUgaW5wdXQgKGRlZ2VuZXJhdGVzIHRvIGEgY29weSkuCisgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwgTlZULCBOLT5nZXRPcGVyYW5kKDApKTsKKyAgICBIaSA9IERBRy5nZXRDb25zdGFudCgwLCBOVlQpOyAgIC8vIFRoZSBoaWdoIHBhcnQgaXMganVzdCBhIHplcm8uCisgIH0gZWxzZSB7CisgICAgLy8gRm9yIGV4YW1wbGUsIGV4dGVuc2lvbiBvZiBhbiBpNDggdG8gYW4gaTY0LiAgVGhlIG9wZXJhbmQgdHlwZSBuZWNlc3NhcmlseQorICAgIC8vIHByb21vdGVzIHRvIHRoZSByZXN1bHQgdHlwZSwgc28gd2lsbCBlbmQgdXAgYmVpbmcgZXhwYW5kZWQgdG9vLgorICAgIGFzc2VydChnZXRUeXBlQWN0aW9uKE9wLmdldFZhbHVlVHlwZSgpKSA9PSBQcm9tb3RlSW50ZWdlciAmJgorICAgICAgICAgICAiT25seSBrbm93IGhvdyB0byBwcm9tb3RlIHRoaXMgcmVzdWx0ISIpOworICAgIFNEVmFsdWUgUmVzID0gR2V0UHJvbW90ZWRJbnRlZ2VyKE9wKTsKKyAgICBhc3NlcnQoUmVzLmdldFZhbHVlVHlwZSgpID09IE4tPmdldFZhbHVlVHlwZSgwKSAmJgorICAgICAgICAgICAiT3BlcmFuZCBvdmVyIHByb21vdGVkPyIpOworICAgIC8vIFNwbGl0IHRoZSBwcm9tb3RlZCBvcGVyYW5kLiAgVGhpcyB3aWxsIHNpbXBsaWZ5IHdoZW4gaXQgaXMgZXhwYW5kZWQuCisgICAgU3BsaXRJbnRlZ2VyKFJlcywgTG8sIEhpKTsKKyAgICB1bnNpZ25lZCBFeGNlc3NCaXRzID0KKyAgICAgIE9wLmdldFZhbHVlVHlwZSgpLmdldFNpemVJbkJpdHMoKSAtIE5WVC5nZXRTaXplSW5CaXRzKCk7CisgICAgSGkgPSBEQUcuZ2V0WmVyb0V4dGVuZEluUmVnKEhpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2Vzc0JpdHMpKTsKKyAgfQorfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgSW50ZWdlciBPcGVyYW5kIEV4cGFuc2lvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEV4cGFuZEludGVnZXJPcGVyYW5kIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHNwZWNpZmllZCBvcGVyYW5kIG9mCisvLy8gdGhlIHNwZWNpZmllZCBub2RlIGlzIGZvdW5kIHRvIG5lZWQgZXhwYW5zaW9uLiAgQXQgdGhpcyBwb2ludCwgYWxsIG9mIHRoZQorLy8vIHJlc3VsdCB0eXBlcyBvZiB0aGUgbm9kZSBhcmUga25vd24gdG8gYmUgbGVnYWwsIGJ1dCBvdGhlciBvcGVyYW5kcyBvZiB0aGUKKy8vLyBub2RlIG1heSBuZWVkIHByb21vdGlvbiBvciBleHBhbnNpb24gYXMgd2VsbCBhcyB0aGUgc3BlY2lmaWVkIG9uZS4KK2Jvb2wgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kSW50ZWdlck9wZXJhbmQoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiRXhwYW5kIGludGVnZXIgb3BlcmFuZDogIjsgTi0+ZHVtcCgmREFHKTsgZGJncygpIDw8ICJcbiIpOworICBTRFZhbHVlIFJlcyA9IFNEVmFsdWUoKTsKKworICBpZiAoQ3VzdG9tTG93ZXJOb2RlKE4sIE4tPmdldE9wZXJhbmQoT3BObykuZ2V0VmFsdWVUeXBlKCksIGZhbHNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAjaWZuZGVmIE5ERUJVRworICAgIGRiZ3MoKSA8PCAiRXhwYW5kSW50ZWdlck9wZXJhbmQgT3AgIyIgPDwgT3BObyA8PCAiOiAiOworICAgIE4tPmR1bXAoJkRBRyk7IGRiZ3MoKSA8PCAiXG4iOworICAjZW5kaWYKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJEbyBub3Qga25vdyBob3cgdG8gZXhwYW5kIHRoaXMgb3BlcmF0b3IncyBvcGVyYW5kISIpOworCisgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDogICAgICAgUmVzID0gRXhwYW5kT3BfQklUX0NPTlZFUlQoTik7IGJyZWFrOworICBjYXNlIElTRDo6QlJfQ0M6ICAgICAgICAgICAgIFJlcyA9IEV4cGFuZEludE9wX0JSX0NDKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkJVSUxEX1ZFQ1RPUjogICAgICBSZXMgPSBFeHBhbmRPcF9CVUlMRF9WRUNUT1IoTik7IGJyZWFrOworICBjYXNlIElTRDo6RVhUUkFDVF9FTEVNRU5UOiAgIFJlcyA9IEV4cGFuZE9wX0VYVFJBQ1RfRUxFTUVOVChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpJTlNFUlRfVkVDVE9SX0VMVDogUmVzID0gRXhwYW5kT3BfSU5TRVJUX1ZFQ1RPUl9FTFQoTik7IGJyZWFrOworICBjYXNlIElTRDo6U0NBTEFSX1RPX1ZFQ1RPUjogIFJlcyA9IEV4cGFuZE9wX1NDQUxBUl9UT19WRUNUT1IoTik7IGJyZWFrOworICBjYXNlIElTRDo6U0VMRUNUX0NDOiAgICAgICAgIFJlcyA9IEV4cGFuZEludE9wX1NFTEVDVF9DQyhOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRDQzogICAgICAgICAgICAgUmVzID0gRXhwYW5kSW50T3BfU0VUQ0MoTik7IGJyZWFrOworICBjYXNlIElTRDo6U0lOVF9UT19GUDogICAgICAgIFJlcyA9IEV4cGFuZEludE9wX1NJTlRfVE9fRlAoTik7IGJyZWFrOworICBjYXNlIElTRDo6U1RPUkU6ICAgUmVzID0gRXhwYW5kSW50T3BfU1RPUkUoY2FzdDxTdG9yZVNETm9kZT4oTiksIE9wTm8pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlRSVU5DQVRFOiAgICAgICAgICBSZXMgPSBFeHBhbmRJbnRPcF9UUlVOQ0FURShOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpVSU5UX1RPX0ZQOiAgICAgICAgUmVzID0gRXhwYW5kSW50T3BfVUlOVF9UT19GUChOKTsgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OlNITDoKKyAgY2FzZSBJU0Q6OlNSQToKKyAgY2FzZSBJU0Q6OlNSTDoKKyAgY2FzZSBJU0Q6OlJPVEw6CisgIGNhc2UgSVNEOjpST1RSOiAgICAgICAgICAgICAgUmVzID0gRXhwYW5kSW50T3BfU2hpZnQoTik7IGJyZWFrOworICBjYXNlIElTRDo6UkVUVVJOQUREUjoKKyAgY2FzZSBJU0Q6OkZSQU1FQUREUjogICAgICAgICBSZXMgPSBFeHBhbmRJbnRPcF9SRVRVUk5BRERSKE4pOyBicmVhazsKKyAgfQorCisgIC8vIElmIHRoZSByZXN1bHQgaXMgbnVsbCwgdGhlIHN1Yi1tZXRob2QgdG9vayBjYXJlIG9mIHJlZ2lzdGVyaW5nIHJlc3VsdHMgZXRjLgorICBpZiAoIVJlcy5nZXROb2RlKCkpIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGUgcmVzdWx0IGlzIE4sIHRoZSBzdWItbWV0aG9kIHVwZGF0ZWQgTiBpbiBwbGFjZS4gIFRlbGwgdGhlIGxlZ2FsaXplcgorICAvLyBjb3JlIGFib3V0IHRoaXMuCisgIGlmIChSZXMuZ2V0Tm9kZSgpID09IE4pCisgICAgcmV0dXJuIHRydWU7CisKKyAgYXNzZXJ0KFJlcy5nZXRWYWx1ZVR5cGUoKSA9PSBOLT5nZXRWYWx1ZVR5cGUoMCkgJiYgTi0+Z2V0TnVtVmFsdWVzKCkgPT0gMSAmJgorICAgICAgICAgIkludmFsaWQgb3BlcmFuZCBleHBhbnNpb24iKTsKKworICBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUoTiwgMCksIFJlcyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEludGVnZXJFeHBhbmRTZXRDQ09wZXJhbmRzIC0gRXhwYW5kIHRoZSBvcGVyYW5kcyBvZiBhIGNvbXBhcmlzb24uICBUaGlzIGNvZGUKKy8vLyBpcyBzaGFyZWQgYW1vbmcgQlJfQ0MsIFNFTEVDVF9DQywgYW5kIFNFVENDIGhhbmRsZXJzLgordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpJbnRlZ2VyRXhwYW5kU2V0Q0NPcGVyYW5kcyhTRFZhbHVlICZOZXdMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk5ld1JIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpDb25kQ29kZSAmQ0NDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCkgeworICBTRFZhbHVlIExIU0xvLCBMSFNIaSwgUkhTTG8sIFJIU0hpOworICBHZXRFeHBhbmRlZEludGVnZXIoTmV3TEhTLCBMSFNMbywgTEhTSGkpOworICBHZXRFeHBhbmRlZEludGVnZXIoTmV3UkhTLCBSSFNMbywgUkhTSGkpOworCisgIGlmIChDQ0NvZGUgPT0gSVNEOjpTRVRFUSB8fCBDQ0NvZGUgPT0gSVNEOjpTRVRORSkgeworICAgIGlmIChSSFNMbyA9PSBSSFNIaSkgeworICAgICAgaWYgKENvbnN0YW50U0ROb2RlICpSSFNDU1QgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oUkhTTG8pKSB7CisgICAgICAgIGlmIChSSFNDU1QtPmlzQWxsT25lc1ZhbHVlKCkpIHsKKyAgICAgICAgICAvLyBFcXVhbGl0eSBjb21wYXJpc29uIHRvIC0xLgorICAgICAgICAgIE5ld0xIUyA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNMby5nZXRWYWx1ZVR5cGUoKSwgTEhTTG8sIExIU0hpKTsKKyAgICAgICAgICBOZXdSSFMgPSBSSFNMbzsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBOZXdMSFMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIExIU0xvLmdldFZhbHVlVHlwZSgpLCBMSFNMbywgUkhTTG8pOworICAgIE5ld1JIUyA9IERBRy5nZXROb2RlKElTRDo6WE9SLCBkbCwgTEhTTG8uZ2V0VmFsdWVUeXBlKCksIExIU0hpLCBSSFNIaSk7CisgICAgTmV3TEhTID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIE5ld0xIUy5nZXRWYWx1ZVR5cGUoKSwgTmV3TEhTLCBOZXdSSFMpOworICAgIE5ld1JIUyA9IERBRy5nZXRDb25zdGFudCgwLCBOZXdMSFMuZ2V0VmFsdWVUeXBlKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmIHRoaXMgaXMgYSBjb21wYXJpc29uIG9mIHRoZSBzaWduIGJpdCwganVzdCBsb29rIGF0IHRoZSB0b3AgcGFydC4KKyAgLy8gWCA+IC0xLCAgeCA8IDAKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDU1QgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTmV3UkhTKSkKKyAgICBpZiAoKENDQ29kZSA9PSBJU0Q6OlNFVExUICYmIENTVC0+aXNOdWxsVmFsdWUoKSkgfHwgICAgIC8vIFggPCAwCisgICAgICAgIChDQ0NvZGUgPT0gSVNEOjpTRVRHVCAmJiBDU1QtPmlzQWxsT25lc1ZhbHVlKCkpKSB7ICAvLyBYID4gLTEKKyAgICAgIE5ld0xIUyA9IExIU0hpOworICAgICAgTmV3UkhTID0gUkhTSGk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8vIEZJWE1FOiBUaGlzIGdlbmVyYXRlZCBjb2RlIHN1Y2tzLgorICBJU0Q6OkNvbmRDb2RlIExvd0NDOworICBzd2l0Y2ggKENDQ29kZSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgc2V0Y2MhIik7CisgIGNhc2UgSVNEOjpTRVRMVDoKKyAgY2FzZSBJU0Q6OlNFVFVMVDogTG93Q0MgPSBJU0Q6OlNFVFVMVDsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRHVDoKKyAgY2FzZSBJU0Q6OlNFVFVHVDogTG93Q0MgPSBJU0Q6OlNFVFVHVDsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRMRToKKyAgY2FzZSBJU0Q6OlNFVFVMRTogTG93Q0MgPSBJU0Q6OlNFVFVMRTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRHRToKKyAgY2FzZSBJU0Q6OlNFVFVHRTogTG93Q0MgPSBJU0Q6OlNFVFVHRTsgYnJlYWs7CisgIH0KKworICAvLyBUbXAxID0gbG8ob3AxKSA8IGxvKG9wMikgICAvLyBBbHdheXMgdW5zaWduZWQgY29tcGFyaXNvbgorICAvLyBUbXAyID0gaGkob3AxKSA8IGhpKG9wMikgICAvLyBTaWduZWRuZXNzIGRlcGVuZHMgb24gb3BlcmFuZHMKKyAgLy8gZGVzdCA9IGhpKG9wMSkgPT0gaGkob3AyKSA/IFRtcDEgOiBUbXAyOworCisgIC8vIE5PVEU6IG9uIHRhcmdldHMgd2l0aG91dCBlZmZpY2llbnQgU0VMRUNUIG9mIGJvb2xzLCB3ZSBjYW4gYWx3YXlzIHVzZQorICAvLyB0aGlzIGlkZW50aXR5OiAoQjEgPyBCMiA6IEIzKSAtLT4gKEIxICYgQjIpfCghQjEmQjMpCisgIFRhcmdldExvd2VyaW5nOjpEQUdDb21iaW5lckluZm8gRGFnQ29tYmluZUluZm8oREFHLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgTlVMTCk7CisgIFNEVmFsdWUgVG1wMSwgVG1wMjsKKyAgVG1wMSA9IFRMSS5TaW1wbGlmeVNldENDKFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoTEhTTG8uZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTTG8sIFJIU0xvLCBMb3dDQywgZmFsc2UsIERhZ0NvbWJpbmVJbmZvLCBkbCk7CisgIGlmICghVG1wMS5nZXROb2RlKCkpCisgICAgVG1wMSA9IERBRy5nZXRTZXRDQyhkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShMSFNMby5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBMSFNMbywgUkhTTG8sIExvd0NDKTsKKyAgVG1wMiA9IFRMSS5TaW1wbGlmeVNldENDKFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoTEhTSGkuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTSGksIFJIU0hpLCBDQ0NvZGUsIGZhbHNlLCBEYWdDb21iaW5lSW5mbywgZGwpOworICBpZiAoIVRtcDIuZ2V0Tm9kZSgpKQorICAgIFRtcDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFVENDLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFNldENDUmVzdWx0VHlwZShMSFNIaS5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgIExIU0hpLCBSSFNIaSwgREFHLmdldENvbmRDb2RlKENDQ29kZSkpOworCisgIENvbnN0YW50U0ROb2RlICpUbXAxQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihUbXAxLmdldE5vZGUoKSk7CisgIENvbnN0YW50U0ROb2RlICpUbXAyQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihUbXAyLmdldE5vZGUoKSk7CisgIGlmICgoVG1wMUMgJiYgVG1wMUMtPmlzTnVsbFZhbHVlKCkpIHx8CisgICAgICAoVG1wMkMgJiYgVG1wMkMtPmlzTnVsbFZhbHVlKCkgJiYKKyAgICAgICAoQ0NDb2RlID09IElTRDo6U0VUTEUgfHwgQ0NDb2RlID09IElTRDo6U0VUR0UgfHwKKyAgICAgICAgQ0NDb2RlID09IElTRDo6U0VUVUdFIHx8IENDQ29kZSA9PSBJU0Q6OlNFVFVMRSkpIHx8CisgICAgICAoVG1wMkMgJiYgVG1wMkMtPmdldEFQSW50VmFsdWUoKSA9PSAxICYmCisgICAgICAgKENDQ29kZSA9PSBJU0Q6OlNFVExUIHx8IENDQ29kZSA9PSBJU0Q6OlNFVEdUIHx8CisgICAgICAgIENDQ29kZSA9PSBJU0Q6OlNFVFVHVCB8fCBDQ0NvZGUgPT0gSVNEOjpTRVRVTFQpKSkgeworICAgIC8vIGxvdyBwYXJ0IGlzIGtub3duIGZhbHNlLCByZXR1cm5zIGhpZ2ggcGFydC4KKyAgICAvLyBGb3IgTEUgLyBHRSwgaWYgaGlnaCBwYXJ0IGlzIGtub3duIGZhbHNlLCBpZ25vcmUgdGhlIGxvdyBwYXJ0LgorICAgIC8vIEZvciBMVCAvIEdULCBpZiBoaWdoIHBhcnQgaXMga25vd24gdHJ1ZSwgaWdub3JlIHRoZSBsb3cgcGFydC4KKyAgICBOZXdMSFMgPSBUbXAyOworICAgIE5ld1JIUyA9IFNEVmFsdWUoKTsKKyAgICByZXR1cm47CisgIH0KKworICBOZXdMSFMgPSBUTEkuU2ltcGxpZnlTZXRDQyhUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKExIU0hpLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTSGksIFJIU0hpLCBJU0Q6OlNFVEVRLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFnQ29tYmluZUluZm8sIGRsKTsKKyAgaWYgKCFOZXdMSFMuZ2V0Tm9kZSgpKQorICAgIE5ld0xIUyA9IERBRy5nZXRTZXRDQyhkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShMSFNIaS5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIExIU0hpLCBSSFNIaSwgSVNEOjpTRVRFUSk7CisgIE5ld0xIUyA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgVG1wMS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTmV3TEhTLCBUbXAxLCBUbXAyKTsKKyAgTmV3UkhTID0gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludE9wX0JSX0NDKFNETm9kZSAqTikgeworICBTRFZhbHVlIE5ld0xIUyA9IE4tPmdldE9wZXJhbmQoMiksIE5ld1JIUyA9IE4tPmdldE9wZXJhbmQoMyk7CisgIElTRDo6Q29uZENvZGUgQ0NDb2RlID0gY2FzdDxDb25kQ29kZVNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldCgpOworICBJbnRlZ2VyRXhwYW5kU2V0Q0NPcGVyYW5kcyhOZXdMSFMsIE5ld1JIUywgQ0NDb2RlLCBOLT5nZXREZWJ1Z0xvYygpKTsKKworICAvLyBJZiBFeHBhbmRTZXRDQ09wZXJhbmRzIHJldHVybmVkIGEgc2NhbGFyLCB3ZSBuZWVkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdAorICAvLyBhZ2FpbnN0IHplcm8gdG8gc2VsZWN0IGJldHdlZW4gdHJ1ZSBhbmQgZmFsc2UgdmFsdWVzLgorICBpZiAoTmV3UkhTLmdldE5vZGUoKSA9PSAwKSB7CisgICAgTmV3UkhTID0gREFHLmdldENvbnN0YW50KDAsIE5ld0xIUy5nZXRWYWx1ZVR5cGUoKSk7CisgICAgQ0NDb2RlID0gSVNEOjpTRVRORTsKKyAgfQorCisgIC8vIFVwZGF0ZSBOIHRvIGhhdmUgdGhlIG9wZXJhbmRzIHNwZWNpZmllZC4KKyAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uZENvZGUoQ0NDb2RlKSwgTmV3TEhTLCBOZXdSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoNCkpLCAwKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRPcF9TRUxFQ1RfQ0MoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTmV3TEhTID0gTi0+Z2V0T3BlcmFuZCgwKSwgTmV3UkhTID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgSVNEOjpDb25kQ29kZSBDQ0NvZGUgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihOLT5nZXRPcGVyYW5kKDQpKS0+Z2V0KCk7CisgIEludGVnZXJFeHBhbmRTZXRDQ09wZXJhbmRzKE5ld0xIUywgTmV3UkhTLCBDQ0NvZGUsIE4tPmdldERlYnVnTG9jKCkpOworCisgIC8vIElmIEV4cGFuZFNldENDT3BlcmFuZHMgcmV0dXJuZWQgYSBzY2FsYXIsIHdlIG5lZWQgdG8gY29tcGFyZSB0aGUgcmVzdWx0CisgIC8vIGFnYWluc3QgemVybyB0byBzZWxlY3QgYmV0d2VlbiB0cnVlIGFuZCBmYWxzZSB2YWx1ZXMuCisgIGlmIChOZXdSSFMuZ2V0Tm9kZSgpID09IDApIHsKKyAgICBOZXdSSFMgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTmV3TEhTLmdldFZhbHVlVHlwZSgpKTsKKyAgICBDQ0NvZGUgPSBJU0Q6OlNFVE5FOworICB9CisKKyAgLy8gVXBkYXRlIE4gdG8gaGF2ZSB0aGUgb3BlcmFuZHMgc3BlY2lmaWVkLgorICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sIE5ld0xIUywgTmV3UkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDIpLCBOLT5nZXRPcGVyYW5kKDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uZENvZGUoQ0NDb2RlKSksIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludE9wX1NFVENDKFNETm9kZSAqTikgeworICBTRFZhbHVlIE5ld0xIUyA9IE4tPmdldE9wZXJhbmQoMCksIE5ld1JIUyA9IE4tPmdldE9wZXJhbmQoMSk7CisgIElTRDo6Q29uZENvZGUgQ0NDb2RlID0gY2FzdDxDb25kQ29kZVNETm9kZT4oTi0+Z2V0T3BlcmFuZCgyKSktPmdldCgpOworICBJbnRlZ2VyRXhwYW5kU2V0Q0NPcGVyYW5kcyhOZXdMSFMsIE5ld1JIUywgQ0NDb2RlLCBOLT5nZXREZWJ1Z0xvYygpKTsKKworICAvLyBJZiBFeHBhbmRTZXRDQ09wZXJhbmRzIHJldHVybmVkIGEgc2NhbGFyLCB1c2UgaXQuCisgIGlmIChOZXdSSFMuZ2V0Tm9kZSgpID09IDApIHsKKyAgICBhc3NlcnQoTmV3TEhTLmdldFZhbHVlVHlwZSgpID09IE4tPmdldFZhbHVlVHlwZSgwKSAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBzZXRjYyBleHBhbnNpb24hIik7CisgICAgcmV0dXJuIE5ld0xIUzsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgdXBkYXRlIE4gdG8gaGF2ZSB0aGUgb3BlcmFuZHMgc3BlY2lmaWVkLgorICByZXR1cm4gU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sIE5ld0xIUywgTmV3UkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uZENvZGUoQ0NDb2RlKSksIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludE9wX1NoaWZ0KFNETm9kZSAqTikgeworICAvLyBUaGUgdmFsdWUgYmVpbmcgc2hpZnRlZCBpcyBsZWdhbCwgYnV0IHRoZSBzaGlmdCBhbW91bnQgaXMgdG9vIGJpZy4KKyAgLy8gSXQgZm9sbG93cyB0aGF0IGVpdGhlciB0aGUgcmVzdWx0IG9mIHRoZSBzaGlmdCBpcyB1bmRlZmluZWQsIG9yIHRoZQorICAvLyB1cHBlciBoYWxmIG9mIHRoZSBzaGlmdCBhbW91bnQgaXMgemVyby4gIEp1c3QgdXNlIHRoZSBsb3dlciBoYWxmLgorICBTRFZhbHVlIExvLCBIaTsKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMSksIExvLCBIaSk7CisgIHJldHVybiBTRFZhbHVlKERBRy5VcGRhdGVOb2RlT3BlcmFuZHMoTiwgTi0+Z2V0T3BlcmFuZCgwKSwgTG8pLCAwKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRPcF9SRVRVUk5BRERSKFNETm9kZSAqTikgeworICAvLyBUaGUgYXJndW1lbnQgb2YgUkVUVVJOQUREUiAvIEZSQU1FQUREUiBidWlsdGluIGlzIDMyIGJpdCBjb250YW50LiAgVGhpcworICAvLyBzdXJlbHkgbWFrZXMgcHJldHR5IG5pY2UgcHJvYmxlbXMgb24gOC8xNiBiaXQgdGFyZ2V0cy4gSnVzdCB0cnVuY2F0ZSB0aGlzCisgIC8vIGNvbnN0YW50IHRvIHZhbGlkIHR5cGUuCisgIFNEVmFsdWUgTG8sIEhpOworICBHZXRFeHBhbmRlZEludGVnZXIoTi0+Z2V0T3BlcmFuZCgwKSwgTG8sIEhpKTsKKyAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBMbyksIDApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZEludE9wX1NJTlRfVE9fRlAoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgT3AgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgRHN0VlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIFJUTElCOjpMaWJjYWxsIExDID0gUlRMSUI6OmdldFNJTlRUT0ZQKE9wLmdldFZhbHVlVHlwZSgpLCBEc3RWVCk7CisgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmCisgICAgICAgICAiRG9uJ3Qga25vdyBob3cgdG8gZXhwYW5kIHRoaXMgU0lOVF9UT19GUCEiKTsKKyAgcmV0dXJuIE1ha2VMaWJDYWxsKExDLCBEc3RWVCwgJk9wLCAxLCB0cnVlLCBOLT5nZXREZWJ1Z0xvYygpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRPcF9TVE9SRShTdG9yZVNETm9kZSAqTiwgdW5zaWduZWQgT3BObykgeworICBpZiAoSVNEOjppc05vcm1hbFN0b3JlKE4pKQorICAgIHJldHVybiBFeHBhbmRPcF9Ob3JtYWxTdG9yZShOLCBPcE5vKTsKKworICBhc3NlcnQoSVNEOjppc1VOSU5ERVhFRFN0b3JlKE4pICYmICJJbmRleGVkIHN0b3JlIGR1cmluZyB0eXBlIGxlZ2FsaXphdGlvbiEiKTsKKyAgYXNzZXJ0KE9wTm8gPT0gMSAmJiAiQ2FuIG9ubHkgZXhwYW5kIHRoZSBzdG9yZWQgdmFsdWUgc28gZmFyIik7CisKKyAgRVZUIFZUID0gTi0+Z2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgVlQpOworICBTRFZhbHVlIENoICA9IE4tPmdldENoYWluKCk7CisgIFNEVmFsdWUgUHRyID0gTi0+Z2V0QmFzZVB0cigpOworICBpbnQgU1ZPZmZzZXQgPSBOLT5nZXRTcmNWYWx1ZU9mZnNldCgpOworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBOLT5nZXRBbGlnbm1lbnQoKTsKKyAgYm9vbCBpc1ZvbGF0aWxlID0gTi0+aXNWb2xhdGlsZSgpOworICBib29sIGlzTm9uVGVtcG9yYWwgPSBOLT5pc05vblRlbXBvcmFsKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBMbywgSGk7CisKKyAgYXNzZXJ0KE5WVC5pc0J5dGVTaXplZCgpICYmICJFeHBhbmRlZCB0eXBlIG5vdCBieXRlIHNpemVkISIpOworCisgIGlmIChOLT5nZXRNZW1vcnlWVCgpLmJpdHNMRShOVlQpKSB7CisgICAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldFZhbHVlKCksIExvLCBIaSk7CisgICAgcmV0dXJuIERBRy5nZXRUcnVuY1N0b3JlKENoLCBkbCwgTG8sIFB0ciwgTi0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE1lbW9yeVZUKCksIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCk7CisgIH0gZWxzZSBpZiAoVExJLmlzTGl0dGxlRW5kaWFuKCkpIHsKKyAgICAvLyBMaXR0bGUtZW5kaWFuIC0gbG93IGJpdHMgYXJlIGF0IGxvdyBhZGRyZXNzZXMuCisgICAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldFZhbHVlKCksIExvLCBIaSk7CisKKyAgICBMbyA9IERBRy5nZXRTdG9yZShDaCwgZGwsIExvLCBQdHIsIE4tPmdldFNyY1ZhbHVlKCksIFNWT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsIEFsaWdubWVudCk7CisKKyAgICB1bnNpZ25lZCBFeGNlc3NCaXRzID0KKyAgICAgIE4tPmdldE1lbW9yeVZUKCkuZ2V0U2l6ZUluQml0cygpIC0gTlZULmdldFNpemVJbkJpdHMoKTsKKyAgICBFVlQgTkVWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBFeGNlc3NCaXRzKTsKKworICAgIC8vIEluY3JlbWVudCB0aGUgcG9pbnRlciB0byB0aGUgb3RoZXIgaGFsZi4KKyAgICB1bnNpZ25lZCBJbmNyZW1lbnRTaXplID0gTlZULmdldFNpemVJbkJpdHMoKS84OworICAgIFB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyLmdldFZhbHVlVHlwZSgpLCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluY3JlbWVudFNpemUpKTsKKyAgICBIaSA9IERBRy5nZXRUcnVuY1N0b3JlKENoLCBkbCwgSGksIFB0ciwgTi0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0K0luY3JlbWVudFNpemUsIE5FVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluQWxpZ24oQWxpZ25tZW50LCBJbmNyZW1lbnRTaXplKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCBMbywgSGkpOworICB9IGVsc2UgeworICAgIC8vIEJpZy1lbmRpYW4gLSBoaWdoIGJpdHMgYXJlIGF0IGxvdyBhZGRyZXNzZXMuICBGYXZvciBhbGlnbmVkIHN0b3JlcyBhdAorICAgIC8vIHRoZSBjb3N0IG9mIHNvbWUgYml0LWZpZGRsaW5nLgorICAgIEdldEV4cGFuZGVkSW50ZWdlcihOLT5nZXRWYWx1ZSgpLCBMbywgSGkpOworCisgICAgRVZUIEV4dFZUID0gTi0+Z2V0TWVtb3J5VlQoKTsKKyAgICB1bnNpZ25lZCBFQnl0ZXMgPSBFeHRWVC5nZXRTdG9yZVNpemUoKTsKKyAgICB1bnNpZ25lZCBJbmNyZW1lbnRTaXplID0gTlZULmdldFNpemVJbkJpdHMoKS84OworICAgIHVuc2lnbmVkIEV4Y2Vzc0JpdHMgPSAoRUJ5dGVzIC0gSW5jcmVtZW50U2l6ZSkqODsKKyAgICBFVlQgSGlWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VlQuZ2V0U2l6ZUluQml0cygpIC0gRXhjZXNzQml0cyk7CisKKyAgICBpZiAoRXhjZXNzQml0cyA8IE5WVC5nZXRTaXplSW5CaXRzKCkpIHsKKyAgICAgIC8vIFRyYW5zZmVyIGhpZ2ggYml0cyBmcm9tIHRoZSB0b3Agb2YgTG8gdG8gdGhlIGJvdHRvbSBvZiBIaS4KKyAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBOVlQsIEhpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTlZULmdldFNpemVJbkJpdHMoKSAtIEV4Y2Vzc0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIE5WVCwgSGksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTlZULCBMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEV4Y2Vzc0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpKSk7CisgICAgfQorCisgICAgLy8gU3RvcmUgYm90aCB0aGUgaGlnaCBiaXRzIGFuZCBtYXliZSBzb21lIG9mIHRoZSBsb3cgYml0cy4KKyAgICBIaSA9IERBRy5nZXRUcnVuY1N0b3JlKENoLCBkbCwgSGksIFB0ciwgTi0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0LCBIaVZULCBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50KTsKKworICAgIC8vIEluY3JlbWVudCB0aGUgcG9pbnRlciB0byB0aGUgb3RoZXIgaGFsZi4KKyAgICBQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0ci5nZXRWYWx1ZVR5cGUoKSwgUHRyLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJbmNyZW1lbnRTaXplKSk7CisgICAgLy8gU3RvcmUgdGhlIGxvd2VzdCBFeGNlc3NCaXRzIGJpdHMgaW4gdGhlIHNlY29uZCBoYWxmLgorICAgIExvID0gREFHLmdldFRydW5jU3RvcmUoQ2gsIGRsLCBMbywgUHRyLCBOLT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQrSW5jcmVtZW50U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBFeGNlc3NCaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5BbGlnbihBbGlnbm1lbnQsIEluY3JlbWVudFNpemUpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIExvLCBIaSk7CisgIH0KK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRPcF9UUlVOQ0FURShTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBJbkwsIEluSDsKKyAgR2V0RXhwYW5kZWRJbnRlZ2VyKE4tPmdldE9wZXJhbmQoMCksIEluTCwgSW5IKTsKKyAgLy8gSnVzdCB0cnVuY2F0ZSB0aGUgbG93IHBhcnQgb2YgdGhlIHNvdXJjZS4KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIE4tPmdldERlYnVnTG9jKCksIE4tPmdldFZhbHVlVHlwZSgwKSwgSW5MKTsKK30KKworc3RhdGljIGNvbnN0IGZsdFNlbWFudGljcyAqRVZUVG9BUEZsb2F0U2VtYW50aWNzKEVWVCBWVCkgeworICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBGUCBmb3JtYXQiKTsKKyAgY2FzZSBNVlQ6OmYzMjogICAgIHJldHVybiAmQVBGbG9hdDo6SUVFRXNpbmdsZTsKKyAgY2FzZSBNVlQ6OmY2NDogICAgIHJldHVybiAmQVBGbG9hdDo6SUVFRWRvdWJsZTsKKyAgY2FzZSBNVlQ6OmY4MDogICAgIHJldHVybiAmQVBGbG9hdDo6eDg3RG91YmxlRXh0ZW5kZWQ7CisgIGNhc2UgTVZUOjpmMTI4OiAgICByZXR1cm4gJkFQRmxvYXQ6OklFRUVxdWFkOworICBjYXNlIE1WVDo6cHBjZjEyODogcmV0dXJuICZBUEZsb2F0OjpQUENEb3VibGVEb3VibGU7CisgIH0KK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRPcF9VSU5UX1RPX0ZQKFNETm9kZSAqTikgeworICBTRFZhbHVlIE9wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgRVZUIFNyY1ZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBEc3RWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgb3B0aW1pemF0aW9uIGlzIHZhbGlkIG9ubHkgaWYgZXZlcnkgdmFsdWUgaW4gU3JjVlQgKHdoZW4KKyAgLy8gdHJlYXRlZCBhcyBzaWduZWQpIGlzIHJlcHJlc2VudGFibGUgaW4gRHN0VlQuICBDaGVjayB0aGF0IHRoZSBtYW50aXNzYQorICAvLyBzaXplIG9mIERzdFZUIGlzID49IHRoYW4gdGhlIG51bWJlciBvZiBiaXRzIGluIFNyY1ZUIC0xLgorICBjb25zdCBmbHRTZW1hbnRpY3MgKnNlbSA9IEVWVFRvQVBGbG9hdFNlbWFudGljcyhEc3RWVCk7CisgIGlmIChBUEZsb2F0OjpzZW1hbnRpY3NQcmVjaXNpb24oKnNlbSkgPj0gU3JjVlQuZ2V0U2l6ZUluQml0cygpLTEgJiYKKyAgICAgIFRMSS5nZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCBTcmNWVCkgPT0gVGFyZ2V0TG93ZXJpbmc6OkN1c3RvbSl7CisgICAgLy8gRG8gYSBzaWduZWQgY29udmVyc2lvbiB0aGVuIGFkanVzdCB0aGUgcmVzdWx0LgorICAgIFNEVmFsdWUgU2lnbmVkQ29udiA9IERBRy5nZXROb2RlKElTRDo6U0lOVF9UT19GUCwgZGwsIERzdFZULCBPcCk7CisgICAgU2lnbmVkQ29udiA9IFRMSS5Mb3dlck9wZXJhdGlvbihTaWduZWRDb252LCBEQUcpOworCisgICAgLy8gVGhlIHJlc3VsdCBvZiB0aGUgc2lnbmVkIGNvbnZlcnNpb24gbmVlZHMgYWRqdXN0aW5nIGlmIHRoZSAnc2lnbiBiaXQnIG9mCisgICAgLy8gdGhlIGluY29taW5nIGludGVnZXIgd2FzIHNldC4gIFRvIGhhbmRsZSB0aGlzLCB3ZSBkeW5hbWljYWxseSB0ZXN0IHRvIHNlZQorICAgIC8vIGlmIGl0IGlzIHNldCwgYW5kLCBpZiBzbywgYWRkIGEgZnVkZ2UgZmFjdG9yLgorCisgICAgY29uc3QgdWludDY0X3QgRjMyVHdvRTMyICA9IDB4NEY4MDAwMDBVTEw7CisgICAgY29uc3QgdWludDY0X3QgRjMyVHdvRTY0ICA9IDB4NUY4MDAwMDBVTEw7CisgICAgY29uc3QgdWludDY0X3QgRjMyVHdvRTEyOCA9IDB4N0Y4MDAwMDBVTEw7CisKKyAgICBBUEludCBGRigzMiwgMCk7CisgICAgaWYgKFNyY1ZUID09IE1WVDo6aTMyKQorICAgICAgRkYgPSBBUEludCgzMiwgRjMyVHdvRTMyKTsKKyAgICBlbHNlIGlmIChTcmNWVCA9PSBNVlQ6Omk2NCkKKyAgICAgIEZGID0gQVBJbnQoMzIsIEYzMlR3b0U2NCk7CisgICAgZWxzZSBpZiAoU3JjVlQgPT0gTVZUOjppMTI4KQorICAgICAgRkYgPSBBUEludCgzMiwgRjMyVHdvRTEyOCk7CisgICAgZWxzZQorICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbnN1cHBvcnRlZCBVSU5UX1RPX0ZQISIpOworCisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2lnbiBiaXQgaXMgc2V0LgorICAgIFNEVmFsdWUgTG8sIEhpOworICAgIEdldEV4cGFuZGVkSW50ZWdlcihPcCwgTG8sIEhpKTsKKyAgICBTRFZhbHVlIFNpZ25TZXQgPSBEQUcuZ2V0U2V0Q0MoZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoSGkuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaSwgREFHLmdldENvbnN0YW50KDAsIEhpLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRMVCk7CisKKyAgICAvLyBCdWlsZCBhIDY0IGJpdCBwYWlyICgwLCBGRikgaW4gdGhlIGNvbnN0YW50IHBvb2wsIHdpdGggRkYgaW4gdGhlIGxvIGJpdHMuCisgICAgU0RWYWx1ZSBGdWRnZVB0ciA9IERBRy5nZXRDb25zdGFudFBvb2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldCgqREFHLmdldENvbnRleHQoKSwgRkYuemV4dCg2NCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSk7CisKKyAgICAvLyBHZXQgYSBwb2ludGVyIHRvIEZGIGlmIHRoZSBzaWduIGJpdCB3YXMgc2V0LCBvciB0byAwIG90aGVyd2lzZS4KKyAgICBTRFZhbHVlIFplcm8gPSBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCk7CisgICAgU0RWYWx1ZSBGb3VyID0gREFHLmdldEludFB0ckNvbnN0YW50KDQpOworICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkgc3RkOjpzd2FwKFplcm8sIEZvdXIpOworICAgIFNEVmFsdWUgT2Zmc2V0ID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBaZXJvLmdldFZhbHVlVHlwZSgpLCBTaWduU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWmVybywgRm91cik7CisgICAgdW5zaWduZWQgQWxpZ25tZW50ID0gY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KEZ1ZGdlUHRyKS0+Z2V0QWxpZ25tZW50KCk7CisgICAgRnVkZ2VQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFRMSS5nZXRQb2ludGVyVHkoKSwgRnVkZ2VQdHIsIE9mZnNldCk7CisgICAgQWxpZ25tZW50ID0gc3RkOjptaW4oQWxpZ25tZW50LCA0dSk7CisKKyAgICAvLyBMb2FkIHRoZSB2YWx1ZSBvdXQsIGV4dGVuZGluZyBpdCBmcm9tIGYzMiB0byB0aGUgZGVzdGluYXRpb24gZmxvYXQgdHlwZS4KKyAgICAvLyBGSVhNRTogQXZvaWQgdGhlIGV4dGVuZCBieSBjb25zdHJ1Y3RpbmcgdGhlIHJpZ2h0IGNvbnN0YW50IHBvb2w/CisgICAgU0RWYWx1ZSBGdWRnZSA9IERBRy5nZXRFeHRMb2FkKElTRDo6RVhUTE9BRCwgRHN0VlQsIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1ZGdlUHRyLCBOVUxMLCAwLCBNVlQ6OmYzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBBbGlnbm1lbnQpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBEc3RWVCwgU2lnbmVkQ29udiwgRnVkZ2UpOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB1c2UgYSBsaWJjYWxsLgorICBSVExJQjo6TGliY2FsbCBMQyA9IFJUTElCOjpnZXRVSU5UVE9GUChTcmNWVCwgRHN0VlQpOworICBhc3NlcnQoTEMgIT0gUlRMSUI6OlVOS05PV05fTElCQ0FMTCAmJgorICAgICAgICAgIkRvbid0IGtub3cgaG93IHRvIGV4cGFuZCB0aGlzIFVJTlRfVE9fRlAhIik7CisgIHJldHVybiBNYWtlTGliQ2FsbChMQywgRHN0VlQsICZPcCwgMSwgdHJ1ZSwgZGwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplVHlwZXMuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplVHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTZjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvTGVnYWxpemVUeXBlcy5jcHAKQEAgLTAsMCArMSwxMTE0IEBACisvLz09PS0tIExlZ2FsaXplVHlwZXMuY3BwIC0gQ29tbW9uIGNvZGUgZm9yIERBRyB0eXBlIGxlZ2FsaXplciAtLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTZWxlY3Rpb25EQUc6OkxlZ2FsaXplVHlwZXMgbWV0aG9kLiAgSXQgdHJhbnNmb3JtcworLy8gYW4gYXJiaXRyYXJ5IHdlbGwtZm9ybWVkIFNlbGVjdGlvbkRBRyB0byBvbmx5IGNvbnNpc3Qgb2YgbGVnYWwgdHlwZXMuICBUaGlzCisvLyBpcyBjb21tb24gY29kZSBzaGFyZWQgYW1vbmcgdGhlIExlZ2FsaXplVHlwZXMqLmNwcCBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiTGVnYWxpemVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgY2w6Om9wdDxib29sPgorRW5hYmxlRXhwZW5zaXZlQ2hlY2tzKCJlbmFibGUtbGVnYWxpemUtdHlwZXMtY2hlY2tpbmciLCBjbDo6SGlkZGVuKTsKKworLy8vIFBlcmZvcm1FeHBlbnNpdmVDaGVja3MgLSBEbyBleHRlbnNpdmUsIGV4cGVuc2l2ZSwgc2FuaXR5IGNoZWNraW5nLgordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpQZXJmb3JtRXhwZW5zaXZlQ2hlY2tzKCkgeworICAvLyBJZiBhIG5vZGUgaXMgbm90IHByb2Nlc3NlZCwgdGhlbiBub25lIG9mIGl0cyB2YWx1ZXMgc2hvdWxkIGJlIG1hcHBlZCBieSBhbnkKKyAgLy8gb2YgUHJvbW90ZWRJbnRlZ2VycywgRXhwYW5kZWRJbnRlZ2VycywgLi4uLCBSZXBsYWNlZFZhbHVlcy4KKworICAvLyBJZiBhIG5vZGUgaXMgcHJvY2Vzc2VkLCB0aGVuIGVhY2ggdmFsdWUgd2l0aCBhbiBpbGxlZ2FsIHR5cGUgbXVzdCBiZSBtYXBwZWQKKyAgLy8gYnkgZXhhY3RseSBvbmUgb2YgUHJvbW90ZWRJbnRlZ2VycywgRXhwYW5kZWRJbnRlZ2VycywgLi4uLCBSZXBsYWNlZFZhbHVlcy4KKyAgLy8gVmFsdWVzIHdpdGggYSBsZWdhbCB0eXBlIG1heSBiZSBtYXBwZWQgYnkgUmVwbGFjZWRWYWx1ZXMsIGJ1dCBub3QgYnkgYW55IG9mCisgIC8vIHRoZSBvdGhlciBtYXBzLgorCisgIC8vIE5vdGUgdGhhdCB0aGVzZSBpbnZhcmlhbnRzIG1heSBub3QgaG9sZCBtb21lbnRhcmlseSB3aGVuIHByb2Nlc3NpbmcgYSBub2RlOgorICAvLyB0aGUgbm9kZSBiZWluZyBwcm9jZXNzZWQgbWF5IGJlIHB1dCBpbiBhIG1hcCBiZWZvcmUgYmVpbmcgbWFya2VkIFByb2Nlc3NlZC4KKworICAvLyBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBub2RlcyBtYXJrZWQgTmV3Tm9kZSBpbiB0aGUgREFHLiAgVGhpcyBjYW4KKyAgLy8gb2NjdXIgaW4gdHdvIHdheXMuICBGaXJzdGx5LCBhIG5vZGUgbWF5IGJlIGNyZWF0ZWQgZHVyaW5nIGxlZ2FsaXphdGlvbiBidXQKKyAgLy8gbmV2ZXIgcGFzc2VkIHRvIHRoZSBsZWdhbGl6YXRpb24gY29yZS4gIFRoaXMgaXMgdXN1YWxseSBkdWUgdG8gdGhlIGltcGxpY2l0CisgIC8vIGZvbGRpbmcgdGhhdCBvY2N1cnMgd2hlbiB1c2luZyB0aGUgREFHLmdldE5vZGUgb3BlcmF0b3JzLiAgU2Vjb25kbHksIGEgbmV3CisgIC8vIG5vZGUgbWF5IGJlIHBhc3NlZCB0byB0aGUgbGVnYWxpemF0aW9uIGNvcmUsIGJ1dCB3aGVuIGFuYWx5emVkIG1heSBtb3JwaAorICAvLyBpbnRvIGEgZGlmZmVyZW50IG5vZGUsIGxlYXZpbmcgdGhlIG9yaWdpbmFsIG5vZGUgYXMgYSBOZXdOb2RlIGluIHRoZSBEQUcuCisgIC8vIEEgbm9kZSBtYXkgbW9ycGggaWYgb25lIG9mIGl0cyBvcGVyYW5kcyBjaGFuZ2VzIGR1cmluZyBhbmFseXNpcy4gIFdoZXRoZXIKKyAgLy8gaXQgYWN0dWFsbHkgbW9ycGhzIG9yIG5vdCBkZXBlbmRzIG9uIHdoZXRoZXIsIGFmdGVyIHVwZGF0aW5nIGl0cyBvcGVyYW5kcywKKyAgLy8gaXQgaXMgZXF1aXZhbGVudCB0byBhbiBleGlzdGluZyBub2RlOiBpZiBzbywgaXQgbW9ycGhzIGludG8gdGhhdCBleGlzdGluZworICAvLyBub2RlIChDU0UpLiAgQW4gb3BlcmFuZCBjYW4gY2hhbmdlIGR1cmluZyBhbmFseXNpcyBpZiB0aGUgb3BlcmFuZCBpcyBhIG5ldworICAvLyBub2RlIHRoYXQgbW9ycGhzLCBvciBpdCBpcyBhIHByb2Nlc3NlZCB2YWx1ZSB0aGF0IHdhcyBtYXBwZWQgdG8gc29tZSBvdGhlcgorICAvLyB2YWx1ZSAoYXMgcmVjb3JkZWQgaW4gUmVwbGFjZWRWYWx1ZXMpIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhbmQgaXMgdHVybmVkCisgIC8vIGludG8gdGhhdCBvdGhlciB2YWx1ZS4gIElmIGEgbm9kZSBtb3JwaHMgdGhlbiB0aGUgbm9kZSBpdCBtb3JwaGVkIGludG8gd2lsbAorICAvLyBiZSB1c2VkIGluc3RlYWQgb2YgaXQgZm9yIGxlZ2FsaXphdGlvbiwgaG93ZXZlciB0aGUgb3JpZ2luYWwgbm9kZSBjb250aW51ZXMKKyAgLy8gdG8gbGl2ZSBvbiBpbiB0aGUgREFHLgorICAvLyBUaGUgY29uY2x1c2lvbiBpcyB0aGF0IHRob3VnaCB0aGVyZSBtYXkgYmUgbm9kZXMgbWFya2VkIE5ld05vZGUgaW4gdGhlIERBRywKKyAgLy8gYWxsIHVzZXMgb2Ygc3VjaCBub2RlcyBhcmUgYWxzbyBtYXJrZWQgTmV3Tm9kZTogdGhlIHJlc3VsdCBpcyBhIGZ1bmd1cyBvZgorICAvLyBOZXdOb2RlcyBncm93aW5nIG9uIHRvcCBvZiB0aGUgdXNlZnVsIG5vZGVzLCBhbmQgcGVyaGFwcyB1c2luZyB0aGVtLCBidXQKKyAgLy8gbm90IHVzZWQgYnkgdGhlbS4KKworICAvLyBJZiBhIHZhbHVlIGlzIG1hcHBlZCBieSBSZXBsYWNlZFZhbHVlcywgdGhlbiBpdCBtdXN0IGhhdmUgbm8gdXNlcywgZXhjZXB0CisgIC8vIGJ5IG5vZGVzIG1hcmtlZCBOZXdOb2RlIChzZWUgYWJvdmUpLgorCisgIC8vIFRoZSBmaW5hbCBub2RlIG9idGFpbmVkIGJ5IG1hcHBpbmcgYnkgUmVwbGFjZWRWYWx1ZXMgaXMgbm90IG1hcmtlZCBOZXdOb2RlLgorICAvLyBOb3RlIHRoYXQgUmVwbGFjZWRWYWx1ZXMgc2hvdWxkIGJlIGFwcGxpZWQgaXRlcmF0aXZlbHkuCisKKyAgLy8gTm90ZSB0aGF0IHRoZSBSZXBsYWNlZFZhbHVlcyBtYXAgbWF5IGFsc28gbWFwIGRlbGV0ZWQgbm9kZXMgKGJ5IGl0ZXJhdGluZworICAvLyBvdmVyIHRoZSBEQUcgd2UgbmV2ZXIgZGVyZWZlcmVuY2UgZGVsZXRlZCBub2RlcykuICBUaGlzIG1lYW5zIHRoYXQgaXQgbWF5CisgIC8vIGFsc28gbWFwIG5vZGVzIG1hcmtlZCBOZXdOb2RlIGlmIHRoZSBkZWFsbG9jYXRlZCBtZW1vcnkgd2FzIHJlYWxsb2NhdGVkIGFzCisgIC8vIGFub3RoZXIgbm9kZSwgYW5kIHRoYXQgbmV3IG5vZGUgd2FzIG5vdCBzZWVuIGJ5IHRoZSBMZWdhbGl6ZVR5cGVzIG1hY2hpbmVyeQorICAvLyAoZm9yIGV4YW1wbGUgYmVjYXVzZSBpdCB3YXMgY3JlYXRlZCBidXQgbm90IHVzZWQpLiAgSW4gZ2VuZXJhbCwgd2UgY2Fubm90CisgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gbmV3IG5vZGVzIGFuZCBkZWxldGVkIG5vZGVzLgorICBTbWFsbFZlY3RvcjxTRE5vZGUqLCAxNj4gTmV3Tm9kZXM7CisgIGZvciAoU2VsZWN0aW9uREFHOjphbGxub2Rlc19pdGVyYXRvciBJID0gREFHLmFsbG5vZGVzX2JlZ2luKCksCisgICAgICAgRSA9IERBRy5hbGxub2Rlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAvLyBSZW1lbWJlciBub2RlcyBtYXJrZWQgTmV3Tm9kZSAtIHRoZXkgYXJlIHN1YmplY3QgdG8gZXh0cmEgY2hlY2tpbmcgYmVsb3cuCisgICAgaWYgKEktPmdldE5vZGVJZCgpID09IE5ld05vZGUpCisgICAgICBOZXdOb2Rlcy5wdXNoX2JhY2soSSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+Z2V0TnVtVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBTRFZhbHVlIFJlcyhJLCBpKTsKKyAgICAgIGJvb2wgRmFpbGVkID0gZmFsc2U7CisKKyAgICAgIHVuc2lnbmVkIE1hcHBlZCA9IDA7CisgICAgICBpZiAoUmVwbGFjZWRWYWx1ZXMuZmluZChSZXMpICE9IFJlcGxhY2VkVmFsdWVzLmVuZCgpKSB7CisgICAgICAgIE1hcHBlZCB8PSAxOworICAgICAgICAvLyBDaGVjayB0aGF0IHJlbWFwcGVkIHZhbHVlcyBhcmUgb25seSB1c2VkIGJ5IG5vZGVzIG1hcmtlZCBOZXdOb2RlLgorICAgICAgICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIFVJID0gSS0+dXNlX2JlZ2luKCksIFVFID0gSS0+dXNlX2VuZCgpOworICAgICAgICAgICAgIFVJICE9IFVFOyArK1VJKQorICAgICAgICAgIGlmIChVSS5nZXRVc2UoKS5nZXRSZXNObygpID09IGkpCisgICAgICAgICAgICBhc3NlcnQoVUktPmdldE5vZGVJZCgpID09IE5ld05vZGUgJiYKKyAgICAgICAgICAgICAgICAgICAiUmVtYXBwZWQgdmFsdWUgaGFzIG5vbi10cml2aWFsIHVzZSEiKTsKKworICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBmaW5hbCByZXN1bHQgb2YgYXBwbHlpbmcgUmVwbGFjZWRWYWx1ZXMgaXMgbm90CisgICAgICAgIC8vIG1hcmtlZCBOZXdOb2RlLgorICAgICAgICBTRFZhbHVlIE5ld1ZhbCA9IFJlcGxhY2VkVmFsdWVzW1Jlc107CisgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIFNEVmFsdWU+OjppdGVyYXRvciBJID0gUmVwbGFjZWRWYWx1ZXMuZmluZChOZXdWYWwpOworICAgICAgICB3aGlsZSAoSSAhPSBSZXBsYWNlZFZhbHVlcy5lbmQoKSkgeworICAgICAgICAgIE5ld1ZhbCA9IEktPnNlY29uZDsKKyAgICAgICAgICBJID0gUmVwbGFjZWRWYWx1ZXMuZmluZChOZXdWYWwpOworICAgICAgICB9CisgICAgICAgIGFzc2VydChOZXdWYWwuZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSAhPSBOZXdOb2RlICYmCisgICAgICAgICAgICAgICAiUmVwbGFjZWRWYWx1ZXMgbWFwcyB0byBhIG5ldyBub2RlISIpOworICAgICAgfQorICAgICAgaWYgKFByb21vdGVkSW50ZWdlcnMuZmluZChSZXMpICE9IFByb21vdGVkSW50ZWdlcnMuZW5kKCkpCisgICAgICAgIE1hcHBlZCB8PSAyOworICAgICAgaWYgKFNvZnRlbmVkRmxvYXRzLmZpbmQoUmVzKSAhPSBTb2Z0ZW5lZEZsb2F0cy5lbmQoKSkKKyAgICAgICAgTWFwcGVkIHw9IDQ7CisgICAgICBpZiAoU2NhbGFyaXplZFZlY3RvcnMuZmluZChSZXMpICE9IFNjYWxhcml6ZWRWZWN0b3JzLmVuZCgpKQorICAgICAgICBNYXBwZWQgfD0gODsKKyAgICAgIGlmIChFeHBhbmRlZEludGVnZXJzLmZpbmQoUmVzKSAhPSBFeHBhbmRlZEludGVnZXJzLmVuZCgpKQorICAgICAgICBNYXBwZWQgfD0gMTY7CisgICAgICBpZiAoRXhwYW5kZWRGbG9hdHMuZmluZChSZXMpICE9IEV4cGFuZGVkRmxvYXRzLmVuZCgpKQorICAgICAgICBNYXBwZWQgfD0gMzI7CisgICAgICBpZiAoU3BsaXRWZWN0b3JzLmZpbmQoUmVzKSAhPSBTcGxpdFZlY3RvcnMuZW5kKCkpCisgICAgICAgIE1hcHBlZCB8PSA2NDsKKyAgICAgIGlmIChXaWRlbmVkVmVjdG9ycy5maW5kKFJlcykgIT0gV2lkZW5lZFZlY3RvcnMuZW5kKCkpCisgICAgICAgIE1hcHBlZCB8PSAxMjg7CisKKyAgICAgIGlmIChJLT5nZXROb2RlSWQoKSAhPSBQcm9jZXNzZWQpIHsKKyAgICAgICAgLy8gU2luY2Ugd2UgYWxsb3cgUmVwbGFjZWRWYWx1ZXMgdG8gbWFwIGRlbGV0ZWQgbm9kZXMsIGl0IG1heSBtYXAgbm9kZXMKKyAgICAgICAgLy8gbWFya2VkIE5ld05vZGUgdG9vLCBzaW5jZSBhIGRlbGV0ZWQgbm9kZSBtYXkgaGF2ZSBiZWVuIHJlYWxsb2NhdGVkIGFzCisgICAgICAgIC8vIGFub3RoZXIgbm9kZSB0aGF0IGhhcyBub3QgYmVlbiBzZWVuIGJ5IHRoZSBMZWdhbGl6ZVR5cGVzIG1hY2hpbmVyeS4KKyAgICAgICAgaWYgKChJLT5nZXROb2RlSWQoKSA9PSBOZXdOb2RlICYmIE1hcHBlZCA+IDEpIHx8CisgICAgICAgICAgICAoSS0+Z2V0Tm9kZUlkKCkgIT0gTmV3Tm9kZSAmJiBNYXBwZWQgIT0gMCkpIHsKKyAgICAgICAgICBkYmdzKCkgPDwgIlVucHJvY2Vzc2VkIHZhbHVlIGluIGEgbWFwISI7CisgICAgICAgICAgRmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpc1R5cGVMZWdhbChSZXMuZ2V0VmFsdWVUeXBlKCkpIHx8IElnbm9yZU5vZGVSZXN1bHRzKEkpKSB7CisgICAgICAgIGlmIChNYXBwZWQgPiAxKSB7CisgICAgICAgICAgZGJncygpIDw8ICJWYWx1ZSB3aXRoIGxlZ2FsIHR5cGUgd2FzIHRyYW5zZm9ybWVkISI7CisgICAgICAgICAgRmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE1hcHBlZCA9PSAwKSB7CisgICAgICAgICAgZGJncygpIDw8ICJQcm9jZXNzZWQgdmFsdWUgbm90IGluIGFueSBtYXAhIjsKKyAgICAgICAgICBGYWlsZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKE1hcHBlZCAmIChNYXBwZWQgLSAxKSkgeworICAgICAgICAgIGRiZ3MoKSA8PCAiVmFsdWUgaW4gbXVsdGlwbGUgbWFwcyEiOworICAgICAgICAgIEZhaWxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKEZhaWxlZCkgeworICAgICAgICBpZiAoTWFwcGVkICYgMSkKKyAgICAgICAgICBkYmdzKCkgPDwgIiBSZXBsYWNlZFZhbHVlcyI7CisgICAgICAgIGlmIChNYXBwZWQgJiAyKQorICAgICAgICAgIGRiZ3MoKSA8PCAiIFByb21vdGVkSW50ZWdlcnMiOworICAgICAgICBpZiAoTWFwcGVkICYgNCkKKyAgICAgICAgICBkYmdzKCkgPDwgIiBTb2Z0ZW5lZEZsb2F0cyI7CisgICAgICAgIGlmIChNYXBwZWQgJiA4KQorICAgICAgICAgIGRiZ3MoKSA8PCAiIFNjYWxhcml6ZWRWZWN0b3JzIjsKKyAgICAgICAgaWYgKE1hcHBlZCAmIDE2KQorICAgICAgICAgIGRiZ3MoKSA8PCAiIEV4cGFuZGVkSW50ZWdlcnMiOworICAgICAgICBpZiAoTWFwcGVkICYgMzIpCisgICAgICAgICAgZGJncygpIDw8ICIgRXhwYW5kZWRGbG9hdHMiOworICAgICAgICBpZiAoTWFwcGVkICYgNjQpCisgICAgICAgICAgZGJncygpIDw8ICIgU3BsaXRWZWN0b3JzIjsKKyAgICAgICAgaWYgKE1hcHBlZCAmIDEyOCkKKyAgICAgICAgICBkYmdzKCkgPDwgIiBXaWRlbmVkVmVjdG9ycyI7CisgICAgICAgIGRiZ3MoKSA8PCAiXG4iOworICAgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENoZWNrZWQgdGhhdCBOZXdOb2RlcyBhcmUgb25seSB1c2VkIGJ5IG90aGVyIE5ld05vZGVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3Tm9kZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIFNETm9kZSAqTiA9IE5ld05vZGVzW2ldOworICAgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBOLT51c2VfYmVnaW4oKSwgVUUgPSBOLT51c2VfZW5kKCk7CisgICAgICAgICBVSSAhPSBVRTsgKytVSSkKKyAgICAgIGFzc2VydChVSS0+Z2V0Tm9kZUlkKCkgPT0gTmV3Tm9kZSAmJiAiTmV3Tm9kZSB1c2VkIGJ5IG5vbi1OZXdOb2RlISIpOworICB9Cit9CisKKy8vLyBydW4gLSBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdHlwZSBsZWdhbGl6ZXIuICBUaGlzIGRvZXMgYQorLy8vIHRvcC1kb3duIHRyYXZlcnNhbCBvZiB0aGUgZGFnLCBsZWdhbGl6aW5nIHR5cGVzIGFzIGl0IGdvZXMuICBSZXR1cm5zICJ0cnVlIgorLy8vIGlmIGl0IG1hZGUgYW55IGNoYW5nZXMuCitib29sIERBR1R5cGVMZWdhbGl6ZXI6OnJ1bigpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gQ3JlYXRlIGEgZHVtbXkgbm9kZSAod2hpY2ggaXMgbm90IGFkZGVkIHRvIGFsbG5vZGVzKSwgdGhhdCBhZGRzIGEgcmVmZXJlbmNlCisgIC8vIHRvIHRoZSByb290IG5vZGUsIHByZXZlbnRpbmcgaXQgZnJvbSBiZWluZyBkZWxldGVkLCBhbmQgdHJhY2tpbmcgYW55CisgIC8vIGNoYW5nZXMgb2YgdGhlIHJvb3QuCisgIEhhbmRsZVNETm9kZSBEdW1teShEQUcuZ2V0Um9vdCgpKTsKKyAgRHVtbXkuc2V0Tm9kZUlkKFVuYW5hbHl6ZWQpOworCisgIC8vIFRoZSByb290IG9mIHRoZSBkYWcgbWF5IGRhbmdsZSB0byBkZWxldGVkIG5vZGVzIHVudGlsIHRoZSB0eXBlIGxlZ2FsaXplciBpcworICAvLyBkb25lLiAgU2V0IGl0IHRvIG51bGwgdG8gYXZvaWQgY29uZnVzaW9uLgorICBEQUcuc2V0Um9vdChTRFZhbHVlKCkpOworCisgIC8vIFdhbGsgYWxsIG5vZGVzIGluIHRoZSBncmFwaCwgYXNzaWduaW5nIHRoZW0gYSBOb2RlSWQgb2YgJ1JlYWR5VG9Qcm9jZXNzJworICAvLyAoYW5kIHJlbWVtYmVyaW5nIHRoZW0pIGlmIHRoZXkgYXJlIGxlYXZlcyBhbmQgYXNzaWduaW5nICdVbmFuYWx5emVkJyBpZgorICAvLyBub24tbGVhdmVzLgorICBmb3IgKFNlbGVjdGlvbkRBRzo6YWxsbm9kZXNfaXRlcmF0b3IgSSA9IERBRy5hbGxub2Rlc19iZWdpbigpLAorICAgICAgIEUgPSBEQUcuYWxsbm9kZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPmdldE51bU9wZXJhbmRzKCkgPT0gMCkgeworICAgICAgSS0+c2V0Tm9kZUlkKFJlYWR5VG9Qcm9jZXNzKTsKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhJKTsKKyAgICB9IGVsc2UgeworICAgICAgSS0+c2V0Tm9kZUlkKFVuYW5hbHl6ZWQpOworICAgIH0KKyAgfQorCisgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBzZXQgb2Ygbm9kZXMgdG8gcHJvY2VzcywgaGFuZGxlIHRoZW0gYWxsLgorICB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpIHsKKyNpZm5kZWYgWERFQlVHCisgICAgaWYgKEVuYWJsZUV4cGVuc2l2ZUNoZWNrcykKKyNlbmRpZgorICAgICAgUGVyZm9ybUV4cGVuc2l2ZUNoZWNrcygpOworCisgICAgU0ROb2RlICpOID0gV29ya2xpc3QuYmFjaygpOworICAgIFdvcmtsaXN0LnBvcF9iYWNrKCk7CisgICAgYXNzZXJ0KE4tPmdldE5vZGVJZCgpID09IFJlYWR5VG9Qcm9jZXNzICYmCisgICAgICAgICAgICJOb2RlIHNob3VsZCBiZSByZWFkeSBpZiBvbiB3b3JrbGlzdCEiKTsKKworICAgIGlmIChJZ25vcmVOb2RlUmVzdWx0cyhOKSkKKyAgICAgIGdvdG8gU2Nhbk9wZXJhbmRzOworCisgICAgLy8gU2NhbiB0aGUgdmFsdWVzIHByb2R1Y2VkIGJ5IHRoZSBub2RlLCBjaGVja2luZyB0byBzZWUgaWYgYW55IHJlc3VsdAorICAgIC8vIHR5cGVzIGFyZSBpbGxlZ2FsLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIE51bVJlc3VsdHMgPSBOLT5nZXROdW1WYWx1ZXMoKTsgaSA8IE51bVJlc3VsdHM7ICsraSkgeworICAgICAgRVZUIFJlc3VsdFZUID0gTi0+Z2V0VmFsdWVUeXBlKGkpOworICAgICAgc3dpdGNoIChnZXRUeXBlQWN0aW9uKFJlc3VsdFZUKSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbmtub3duIGFjdGlvbiEiKTsKKyAgICAgIGNhc2UgTGVnYWw6CisgICAgICAgIGJyZWFrOworICAgICAgLy8gVGhlIGZvbGxvd2luZyBjYWxscyBtdXN0IHRha2UgY2FyZSBvZiAqYWxsKiBvZiB0aGUgbm9kZSdzIHJlc3VsdHMsCisgICAgICAvLyBub3QganVzdCB0aGUgaWxsZWdhbCByZXN1bHQgdGhleSB3ZXJlIHBhc3NlZCAodGhpcyBpbmNsdWRlcyByZXN1bHRzCisgICAgICAvLyB3aXRoIGEgbGVnYWwgdHlwZSkuICBSZXN1bHRzIGNhbiBiZSByZW1hcHBlZCB1c2luZyBSZXBsYWNlVmFsdWVXaXRoLAorICAgICAgLy8gb3IgdGhlaXIgcHJvbW90ZWQvZXhwYW5kZWQvZXRjIHZhbHVlcyByZWdpc3RlcmVkIGluIFByb21vdGVkSW50ZWdlcnMsCisgICAgICAvLyBFeHBhbmRlZEludGVnZXJzIGV0Yy4KKyAgICAgIGNhc2UgUHJvbW90ZUludGVnZXI6CisgICAgICAgIFByb21vdGVJbnRlZ2VyUmVzdWx0KE4sIGkpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgZ290byBOb2RlRG9uZTsKKyAgICAgIGNhc2UgRXhwYW5kSW50ZWdlcjoKKyAgICAgICAgRXhwYW5kSW50ZWdlclJlc3VsdChOLCBpKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGdvdG8gTm9kZURvbmU7CisgICAgICBjYXNlIFNvZnRlbkZsb2F0OgorICAgICAgICBTb2Z0ZW5GbG9hdFJlc3VsdChOLCBpKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGdvdG8gTm9kZURvbmU7CisgICAgICBjYXNlIEV4cGFuZEZsb2F0OgorICAgICAgICBFeHBhbmRGbG9hdFJlc3VsdChOLCBpKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGdvdG8gTm9kZURvbmU7CisgICAgICBjYXNlIFNjYWxhcml6ZVZlY3RvcjoKKyAgICAgICAgU2NhbGFyaXplVmVjdG9yUmVzdWx0KE4sIGkpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgZ290byBOb2RlRG9uZTsKKyAgICAgIGNhc2UgU3BsaXRWZWN0b3I6CisgICAgICAgIFNwbGl0VmVjdG9yUmVzdWx0KE4sIGkpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgZ290byBOb2RlRG9uZTsKKyAgICAgIGNhc2UgV2lkZW5WZWN0b3I6CisgICAgICAgIFdpZGVuVmVjdG9yUmVzdWx0KE4sIGkpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgZ290byBOb2RlRG9uZTsKKyAgICAgIH0KKyAgICB9CisKK1NjYW5PcGVyYW5kczoKKyAgICAvLyBTY2FuIHRoZSBvcGVyYW5kIGxpc3QgZm9yIHRoZSBub2RlLCBoYW5kbGluZyBhbnkgbm9kZXMgd2l0aCBvcGVyYW5kcyB0aGF0CisgICAgLy8gYXJlIGlsbGVnYWwuCisgICAgeworICAgIHVuc2lnbmVkIE51bU9wZXJhbmRzID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICBib29sIE5lZWRzUmVhbmFseXppbmcgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7IGkgIT0gTnVtT3BlcmFuZHM7ICsraSkgeworICAgICAgaWYgKElnbm9yZU5vZGVSZXN1bHRzKE4tPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIEVWVCBPcFZUID0gTi0+Z2V0T3BlcmFuZChpKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgIHN3aXRjaCAoZ2V0VHlwZUFjdGlvbihPcFZUKSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbmtub3duIGFjdGlvbiEiKTsKKyAgICAgIGNhc2UgTGVnYWw6CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gVGhlIGZvbGxvd2luZyBjYWxscyBtdXN0IGVpdGhlciByZXBsYWNlIGFsbCBvZiB0aGUgbm9kZSdzIHJlc3VsdHMKKyAgICAgIC8vIHVzaW5nIFJlcGxhY2VWYWx1ZVdpdGgsIGFuZCByZXR1cm4gImZhbHNlIjsgb3IgdXBkYXRlIHRoZSBub2RlJ3MKKyAgICAgIC8vIG9wZXJhbmRzIGluIHBsYWNlLCBhbmQgcmV0dXJuICJ0cnVlIi4KKyAgICAgIGNhc2UgUHJvbW90ZUludGVnZXI6CisgICAgICAgIE5lZWRzUmVhbmFseXppbmcgPSBQcm9tb3RlSW50ZWdlck9wZXJhbmQoTiwgaSk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRXhwYW5kSW50ZWdlcjoKKyAgICAgICAgTmVlZHNSZWFuYWx5emluZyA9IEV4cGFuZEludGVnZXJPcGVyYW5kKE4sIGkpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNvZnRlbkZsb2F0OgorICAgICAgICBOZWVkc1JlYW5hbHl6aW5nID0gU29mdGVuRmxvYXRPcGVyYW5kKE4sIGkpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEV4cGFuZEZsb2F0OgorICAgICAgICBOZWVkc1JlYW5hbHl6aW5nID0gRXhwYW5kRmxvYXRPcGVyYW5kKE4sIGkpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNjYWxhcml6ZVZlY3RvcjoKKyAgICAgICAgTmVlZHNSZWFuYWx5emluZyA9IFNjYWxhcml6ZVZlY3Rvck9wZXJhbmQoTiwgaSk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU3BsaXRWZWN0b3I6CisgICAgICAgIE5lZWRzUmVhbmFseXppbmcgPSBTcGxpdFZlY3Rvck9wZXJhbmQoTiwgaSk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV2lkZW5WZWN0b3I6CisgICAgICAgIE5lZWRzUmVhbmFseXppbmcgPSBXaWRlblZlY3Rvck9wZXJhbmQoTiwgaSk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFRoZSBzdWItbWV0aG9kIHVwZGF0ZWQgTiBpbiBwbGFjZS4gIENoZWNrIHRvIHNlZSBpZiBhbnkgb3BlcmFuZHMgYXJlIG5ldywKKyAgICAvLyBhbmQgaWYgc28sIG1hcmsgdGhlbS4gIElmIHRoZSBub2RlIG5lZWRzIHJldmlzaXRpbmcsIGRvbid0IGFkZCBhbGwgdXNlcnMKKyAgICAvLyB0byB0aGUgd29ya2xpc3QgZXRjLgorICAgIGlmIChOZWVkc1JlYW5hbHl6aW5nKSB7CisgICAgICBhc3NlcnQoTi0+Z2V0Tm9kZUlkKCkgPT0gUmVhZHlUb1Byb2Nlc3MgJiYgIk5vZGUgSUQgcmVjYWxjdWxhdGVkPyIpOworICAgICAgTi0+c2V0Tm9kZUlkKE5ld05vZGUpOworICAgICAgLy8gUmVjb21wdXRlIHRoZSBOb2RlSWQgYW5kIGNvcnJlY3QgcHJvY2Vzc2VkIG9wZXJhbmRzLCBhZGRpbmcgdGhlIG5vZGUgdG8KKyAgICAgIC8vIHRoZSB3b3JrbGlzdCBpZiByZWFkeS4KKyAgICAgIFNETm9kZSAqTSA9IEFuYWx5emVOZXdOb2RlKE4pOworICAgICAgaWYgKE0gPT0gTikKKyAgICAgICAgLy8gVGhlIG5vZGUgZGlkbid0IG1vcnBoIC0gbm90aGluZyBzcGVjaWFsIHRvIGRvLCBpdCB3aWxsIGJlIHJldmlzaXRlZC4KKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFRoZSBub2RlIG1vcnBoZWQgLSB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gbGVnYWxpemluZyBieSByZXBsYWNpbmcgZXZlcnkKKyAgICAgIC8vIHZhbHVlIG9mIE4gd2l0aCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZiBNLiAgU28gZG8gdGhhdCBub3cuCisgICAgICBhc3NlcnQoTi0+Z2V0TnVtVmFsdWVzKCkgPT0gTS0+Z2V0TnVtVmFsdWVzKCkgJiYKKyAgICAgICAgICAgICAiTm9kZSBtb3JwaGluZyBjaGFuZ2VkIHRoZSBudW1iZXIgb2YgcmVzdWx0cyEiKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1WYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIC8vIFJlcGxhY2luZyB0aGUgdmFsdWUgdGFrZXMgY2FyZSBvZiByZW1hcHBpbmcgdGhlIG5ldyB2YWx1ZS4KKyAgICAgICAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIGkpLCBTRFZhbHVlKE0sIGkpKTsKKyAgICAgIGFzc2VydChOLT5nZXROb2RlSWQoKSA9PSBOZXdOb2RlICYmICJVbmV4cGVjdGVkIG5vZGUgc3RhdGUhIik7CisgICAgICAvLyBUaGUgbm9kZSBjb250aW51ZXMgdG8gbGl2ZSBvbiBhcyBwYXJ0IG9mIHRoZSBOZXdOb2RlIGZ1bmd1cyB0aGF0CisgICAgICAvLyBncm93cyBvbiB0b3Agb2YgdGhlIHVzZWZ1bCBub2Rlcy4gIE5vdGhpbmcgbW9yZSBuZWVkcyB0byBiZSBkb25lCisgICAgICAvLyB3aXRoIGl0IC0gbW92ZSBvbiB0byB0aGUgbmV4dCBub2RlLgorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKGkgPT0gTnVtT3BlcmFuZHMpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiTGVnYWxseSB0eXBlZCBub2RlOiAiOyBOLT5kdW1wKCZEQUcpOyBkYmdzKCkgPDwgIlxuIik7CisgICAgfQorICAgIH0KK05vZGVEb25lOgorCisgICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgdGhlIG5vZGUgd2FzIHByb2Nlc3NlZCwgcG90ZW50aWFsbHkgY3JlYXRpbmcgbmV3IG5vZGVzLgorICAgIC8vIE1hcmsgaXQgYXMgcHJvY2Vzc2VkIGFuZCBhZGQgaXRzIHVzZXJzIHRvIHRoZSB3b3JrbGlzdCBhcyBhcHByb3ByaWF0ZS4KKyAgICBhc3NlcnQoTi0+Z2V0Tm9kZUlkKCkgPT0gUmVhZHlUb1Byb2Nlc3MgJiYgIk5vZGUgSUQgcmVjYWxjdWxhdGVkPyIpOworICAgIE4tPnNldE5vZGVJZChQcm9jZXNzZWQpOworCisgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IE4tPnVzZV9iZWdpbigpLCBFID0gTi0+dXNlX2VuZCgpOworICAgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgICAgU0ROb2RlICpVc2VyID0gKlVJOworICAgICAgaW50IE5vZGVJZCA9IFVzZXItPmdldE5vZGVJZCgpOworCisgICAgICAvLyBUaGlzIG5vZGUgaGFzIHR3byBvcHRpb25zOiBpdCBjYW4gZWl0aGVyIGJlIGEgbmV3IG5vZGUgb3IgaXRzIE5vZGUgSUQKKyAgICAgIC8vIG1heSBiZSBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgaXQgaGFzIHRoYXQgYXJlIG5vdCByZWFkeS4KKyAgICAgIGlmIChOb2RlSWQgPiAwKSB7CisgICAgICAgIFVzZXItPnNldE5vZGVJZChOb2RlSWQtMSk7CisKKyAgICAgICAgLy8gSWYgdGhpcyB3YXMgdGhlIGxhc3QgdXNlIGl0IHdhcyB3YWl0aW5nIG9uLCBhZGQgaXQgdG8gdGhlIHJlYWR5IGxpc3QuCisgICAgICAgIGlmIChOb2RlSWQtMSA9PSBSZWFkeVRvUHJvY2VzcykKKyAgICAgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soVXNlcik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGlzIGlzIGFuIHVucmVhY2hhYmxlIG5ldyBub2RlLCB0aGVuIGlnbm9yZSBpdC4gIElmIGl0IGV2ZXIgYmVjb21lcworICAgICAgLy8gcmVhY2hhYmxlIGJ5IGJlaW5nIHVzZWQgYnkgYSBuZXdseSBjcmVhdGVkIG5vZGUgdGhlbiBpdCB3aWxsIGJlIGhhbmRsZWQKKyAgICAgIC8vIGJ5IEFuYWx5emVOZXdOb2RlLgorICAgICAgaWYgKE5vZGVJZCA9PSBOZXdOb2RlKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIG5vZGUgaXMgbmV3OiB0aGlzIGlzIHRoZSBmaXJzdCBvcGVyYW5kIG9mIGl0IHRoYXQKKyAgICAgIC8vIGJlY2FtZSByZWFkeS4gIEl0cyBuZXcgTm9kZUlkIGlzIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgaXQgaGFzIG1pbnVzIDEKKyAgICAgIC8vIChhcyB0aGlzIG5vZGUgaXMgbm93IHByb2Nlc3NlZCkuCisgICAgICBhc3NlcnQoTm9kZUlkID09IFVuYW5hbHl6ZWQgJiYgIlVua25vd24gbm9kZSBJRCEiKTsKKyAgICAgIFVzZXItPnNldE5vZGVJZChVc2VyLT5nZXROdW1PcGVyYW5kcygpIC0gMSk7CisKKyAgICAgIC8vIElmIHRoZSBub2RlIG9ubHkgaGFzIGEgc2luZ2xlIG9wZXJhbmQsIGl0IGlzIG5vdyByZWFkeS4KKyAgICAgIGlmIChVc2VyLT5nZXROdW1PcGVyYW5kcygpID09IDEpCisgICAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhVc2VyKTsKKyAgICB9CisgIH0KKworI2lmbmRlZiBYREVCVUcKKyAgaWYgKEVuYWJsZUV4cGVuc2l2ZUNoZWNrcykKKyNlbmRpZgorICAgIFBlcmZvcm1FeHBlbnNpdmVDaGVja3MoKTsKKworICAvLyBJZiB0aGUgcm9vdCBjaGFuZ2VkIChlLmcuIGl0IHdhcyBhIGRlYWQgbG9hZCkgdXBkYXRlIHRoZSByb290LgorICBEQUcuc2V0Um9vdChEdW1teS5nZXRWYWx1ZSgpKTsKKworICAvLyBSZW1vdmUgZGVhZCBub2Rlcy4gIFRoaXMgaXMgaW1wb3J0YW50IHRvIGRvIGZvciBjbGVhbmxpbmVzcyBidXQgYWxzbyBiZWZvcmUKKyAgLy8gdGhlIGNoZWNraW5nIGxvb3AgYmVsb3cuICBJbXBsaWNpdCBmb2xkaW5nIGJ5IHRoZSBEQUcuZ2V0Tm9kZSBvcGVyYXRvcnMgYW5kCisgIC8vIG5vZGUgbW9ycGhpbmcgY2FuIGNhdXNlIHVucmVhY2hhYmxlIG5vZGVzIHRvIGJlIGFyb3VuZCB3aXRoIHRoZWlyIGZsYWdzIHNldAorICAvLyB0byBuZXcuCisgIERBRy5SZW1vdmVEZWFkTm9kZXMoKTsKKworICAvLyBJbiBhIGRlYnVnIGJ1aWxkLCBzY2FuIGFsbCB0aGUgbm9kZXMgdG8gbWFrZSBzdXJlIHdlIGZvdW5kIHRoZW0gYWxsLiAgVGhpcworICAvLyBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIGN5Y2xlcyBhbmQgdGhhdCBldmVyeXRoaW5nIGdvdCBwcm9jZXNzZWQuCisjaWZuZGVmIE5ERUJVRworICBmb3IgKFNlbGVjdGlvbkRBRzo6YWxsbm9kZXNfaXRlcmF0b3IgSSA9IERBRy5hbGxub2Rlc19iZWdpbigpLAorICAgICAgIEUgPSBEQUcuYWxsbm9kZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgYm9vbCBGYWlsZWQgPSBmYWxzZTsKKworICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlc3VsdCB0eXBlcyBhcmUgbGVnYWwuCisgICAgaWYgKCFJZ25vcmVOb2RlUmVzdWx0cyhJKSkKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIE51bVZhbHMgPSBJLT5nZXROdW1WYWx1ZXMoKTsgaSA8IE51bVZhbHM7ICsraSkKKyAgICAgICAgaWYgKCFpc1R5cGVMZWdhbChJLT5nZXRWYWx1ZVR5cGUoaSkpKSB7CisgICAgICAgICAgZGJncygpIDw8ICJSZXN1bHQgdHlwZSAiIDw8IGkgPDwgIiBpbGxlZ2FsIVxuIjsKKyAgICAgICAgICBGYWlsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IGFsbCBvcGVyYW5kIHR5cGVzIGFyZSBsZWdhbC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBOdW1PcHMgPSBJLT5nZXROdW1PcGVyYW5kcygpOyBpIDwgTnVtT3BzOyArK2kpCisgICAgICBpZiAoIUlnbm9yZU5vZGVSZXN1bHRzKEktPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpKSAmJgorICAgICAgICAgICFpc1R5cGVMZWdhbChJLT5nZXRPcGVyYW5kKGkpLmdldFZhbHVlVHlwZSgpKSkgeworICAgICAgICBkYmdzKCkgPDwgIk9wZXJhbmQgdHlwZSAiIDw8IGkgPDwgIiBpbGxlZ2FsIVxuIjsKKyAgICAgICAgRmFpbGVkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgIGlmIChJLT5nZXROb2RlSWQoKSAhPSBQcm9jZXNzZWQpIHsKKyAgICAgICBpZiAoSS0+Z2V0Tm9kZUlkKCkgPT0gTmV3Tm9kZSkKKyAgICAgICAgIGRiZ3MoKSA8PCAiTmV3IG5vZGUgbm90IGFuYWx5emVkP1xuIjsKKyAgICAgICBlbHNlIGlmIChJLT5nZXROb2RlSWQoKSA9PSBVbmFuYWx5emVkKQorICAgICAgICAgZGJncygpIDw8ICJVbmFuYWx5emVkIG5vZGUgbm90IG5vdGljZWQ/XG4iOworICAgICAgIGVsc2UgaWYgKEktPmdldE5vZGVJZCgpID4gMCkKKyAgICAgICAgIGRiZ3MoKSA8PCAiT3BlcmFuZCBub3QgcHJvY2Vzc2VkP1xuIjsKKyAgICAgICBlbHNlIGlmIChJLT5nZXROb2RlSWQoKSA9PSBSZWFkeVRvUHJvY2VzcykKKyAgICAgICAgIGRiZ3MoKSA8PCAiTm90IGFkZGVkIHRvIHdvcmtsaXN0P1xuIjsKKyAgICAgICBGYWlsZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChGYWlsZWQpIHsKKyAgICAgIEktPmR1bXAoJkRBRyk7IGRiZ3MoKSA8PCAiXG4iOworICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gQW5hbHl6ZU5ld05vZGUgLSBUaGUgc3BlY2lmaWVkIG5vZGUgaXMgdGhlIHJvb3Qgb2YgYSBzdWJ0cmVlIG9mIHBvdGVudGlhbGx5CisvLy8gbmV3IG5vZGVzLiAgQ29ycmVjdCBhbnkgcHJvY2Vzc2VkIG9wZXJhbmRzICh0aGlzIG1heSBjaGFuZ2UgdGhlIG5vZGUpIGFuZAorLy8vIGNhbGN1bGF0ZSB0aGUgTm9kZUlkLiAgSWYgdGhlIG5vZGUgaXRzZWxmIGNoYW5nZXMgdG8gYSBwcm9jZXNzZWQgbm9kZSwgaXQKKy8vLyBpcyBub3QgcmVtYXBwZWQgLSB0aGUgY2FsbGVyIG5lZWRzIHRvIHRha2UgY2FyZSBvZiB0aGlzLgorLy8vIFJldHVybnMgdGhlIHBvdGVudGlhbGx5IGNoYW5nZWQgbm9kZS4KK1NETm9kZSAqREFHVHlwZUxlZ2FsaXplcjo6QW5hbHl6ZU5ld05vZGUoU0ROb2RlICpOKSB7CisgIC8vIElmIHRoaXMgd2FzIGFuIGV4aXN0aW5nIG5vZGUgdGhhdCBpcyBhbHJlYWR5IGRvbmUsIHdlJ3JlIGRvbmUuCisgIGlmIChOLT5nZXROb2RlSWQoKSAhPSBOZXdOb2RlICYmIE4tPmdldE5vZGVJZCgpICE9IFVuYW5hbHl6ZWQpCisgICAgcmV0dXJuIE47CisKKyAgLy8gUmVtb3ZlIGFueSBzdGFsZSBtYXAgZW50cmllcy4KKyAgRXhwdW5nZU5vZGUoTik7CisKKyAgLy8gT2theSwgd2Uga25vdyB0aGF0IHRoaXMgbm9kZSBpcyBuZXcuICBSZWN1cnNpdmVseSB3YWxrIGFsbCBvZiBpdHMgb3BlcmFuZHMKKyAgLy8gdG8gc2VlIGlmIHRoZXkgYXJlIG5ldyBhbHNvLiAgVGhlIGRlcHRoIG9mIHRoaXMgd2FsayBpcyBib3VuZGVkIGJ5IHRoZSBzaXplCisgIC8vIG9mIHRoZSBuZXcgdHJlZSB0aGF0IHdhcyBjb25zdHJ1Y3RlZCAodXN1YWxseSAyLTMgbm9kZXMpLCBzbyB3ZSBkb24ndCB3b3JyeQorICAvLyBhYm91dCByZXZpc2l0aW5nIG9mIG5vZGVzLgorICAvLworICAvLyBBcyB3ZSB3YWxrIHRoZSBvcGVyYW5kcywga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIG5vZGVzIHRoYXQgYXJlCisgIC8vIHByb2Nlc3NlZC4gIElmIG5vbi16ZXJvLCB0aGlzIHdpbGwgYmVjb21lIHRoZSBuZXcgbm9kZWlkIG9mIHRoaXMgbm9kZS4KKyAgLy8gT3BlcmFuZHMgbWF5IG1vcnBoIHdoZW4gdGhleSBhcmUgYW5hbHl6ZWQuICBJZiBzbywgdGhlIG5vZGUgd2lsbCBiZQorICAvLyB1cGRhdGVkIGFmdGVyIGFsbCBvcGVyYW5kcyBoYXZlIGJlZW4gYW5hbHl6ZWQuICBTaW5jZSB0aGlzIGlzIHJhcmUsCisgIC8vIHRoZSBjb2RlIHRyaWVzIHRvIG1pbmltaXplIG92ZXJoZWFkIGluIHRoZSBub24tbW9ycGhpbmcgY2FzZS4KKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBOZXdPcHM7CisgIHVuc2lnbmVkIE51bVByb2Nlc3NlZCA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIFNEVmFsdWUgT3JpZ09wID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgICBTRFZhbHVlIE9wID0gT3JpZ09wOworCisgICAgQW5hbHl6ZU5ld1ZhbHVlKE9wKTsgLy8gT3AgbWF5IG1vcnBoLgorCisgICAgaWYgKE9wLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPT0gUHJvY2Vzc2VkKQorICAgICAgKytOdW1Qcm9jZXNzZWQ7CisKKyAgICBpZiAoIU5ld09wcy5lbXB0eSgpKSB7CisgICAgICAvLyBTb21lIHByZXZpb3VzIG9wZXJhbmQgY2hhbmdlZC4gIEFkZCB0aGlzIG9uZSB0byB0aGUgbGlzdC4KKyAgICAgIE5ld09wcy5wdXNoX2JhY2soT3ApOworICAgIH0gZWxzZSBpZiAoT3AgIT0gT3JpZ09wKSB7CisgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBvcGVyYW5kIHRvIGNoYW5nZSAtIGFkZCBhbGwgb3BlcmFuZHMgc28gZmFyLgorICAgICAgTmV3T3BzLmFwcGVuZChOLT5vcF9iZWdpbigpLCBOLT5vcF9iZWdpbigpICsgaSk7CisgICAgICBOZXdPcHMucHVzaF9iYWNrKE9wKTsKKyAgICB9CisgIH0KKworICAvLyBTb21lIG9wZXJhbmRzIGNoYW5nZWQgLSB1cGRhdGUgdGhlIG5vZGUuCisgIGlmICghTmV3T3BzLmVtcHR5KCkpIHsKKyAgICBTRE5vZGUgKk0gPSBEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE4sICZOZXdPcHNbMF0sIE5ld09wcy5zaXplKCkpOworICAgIGlmIChNICE9IE4pIHsKKyAgICAgIC8vIFRoZSBub2RlIG1vcnBoZWQgaW50byBhIGRpZmZlcmVudCBub2RlLiAgTm9ybWFsbHkgZm9yIHRoaXMgdG8gaGFwcGVuCisgICAgICAvLyB0aGUgb3JpZ2luYWwgbm9kZSB3b3VsZCBoYXZlIHRvIGJlIG1hcmtlZCBOZXdOb2RlLiAgSG93ZXZlciB0aGlzIGNhbgorICAgICAgLy8gaW4gdGhlb3J5IG1vbWVudGFyaWx5IG5vdCBiZSB0aGUgY2FzZSB3aGlsZSBSZXBsYWNlVmFsdWVXaXRoIGlzIGRvaW5nCisgICAgICAvLyBpdHMgc3R1ZmYuICBNYXJrIHRoZSBvcmlnaW5hbCBub2RlIE5ld05vZGUgdG8gaGVscCBzYW5pdHkgY2hlY2tpbmcuCisgICAgICBOLT5zZXROb2RlSWQoTmV3Tm9kZSk7CisgICAgICBpZiAoTS0+Z2V0Tm9kZUlkKCkgIT0gTmV3Tm9kZSAmJiBNLT5nZXROb2RlSWQoKSAhPSBVbmFuYWx5emVkKQorICAgICAgICAvLyBJdCBtb3JwaGVkIGludG8gYSBwcmV2aW91c2x5IGFuYWx5emVkIG5vZGUgLSBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBNOworCisgICAgICAvLyBJdCBtb3JwaGVkIGludG8gYSBkaWZmZXJlbnQgbmV3IG5vZGUuICBEbyB0aGUgZXF1aXZhbGVudCBvZiBwYXNzaW5nCisgICAgICAvLyBpdCB0byBBbmFseXplTmV3Tm9kZTogZXhwdW5nZSBpdCBhbmQgY2FsY3VsYXRlIHRoZSBOb2RlSWQuICBObyBuZWVkCisgICAgICAvLyB0byByZW1hcCB0aGUgb3BlcmFuZHMsIHNpbmNlIHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZSBvcGVyYW5kcyB3ZQorICAgICAgLy8gcmVtYXBwZWQgYWJvdmUuCisgICAgICBOID0gTTsKKyAgICAgIEV4cHVuZ2VOb2RlKE4pOworICAgIH0KKyAgfQorCisgIC8vIENhbGN1bGF0ZSB0aGUgTm9kZUlkLgorICBOLT5zZXROb2RlSWQoTi0+Z2V0TnVtT3BlcmFuZHMoKSAtIE51bVByb2Nlc3NlZCk7CisgIGlmIChOLT5nZXROb2RlSWQoKSA9PSBSZWFkeVRvUHJvY2VzcykKKyAgICBXb3JrbGlzdC5wdXNoX2JhY2soTik7CisKKyAgcmV0dXJuIE47Cit9CisKKy8vLyBBbmFseXplTmV3VmFsdWUgLSBDYWxsIEFuYWx5emVOZXdOb2RlLCB1cGRhdGluZyB0aGUgbm9kZSBpbiBWYWwgaWYgbmVlZGVkLgorLy8vIElmIHRoZSBub2RlIGNoYW5nZXMgdG8gYSBwcm9jZXNzZWQgbm9kZSwgdGhlbiByZW1hcCBpdC4KK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6QW5hbHl6ZU5ld1ZhbHVlKFNEVmFsdWUgJlZhbCkgeworICBWYWwuc2V0Tm9kZShBbmFseXplTmV3Tm9kZShWYWwuZ2V0Tm9kZSgpKSk7CisgIGlmIChWYWwuZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSA9PSBQcm9jZXNzZWQpCisgICAgLy8gV2Ugd2VyZSBwYXNzZWQgYSBwcm9jZXNzZWQgbm9kZSwgb3IgaXQgbW9ycGhlZCBpbnRvIG9uZSAtIHJlbWFwIGl0LgorICAgIFJlbWFwVmFsdWUoVmFsKTsKK30KKworLy8vIEV4cHVuZ2VOb2RlIC0gSWYgTiBoYXMgYSBib2d1cyBtYXBwaW5nIGluIFJlcGxhY2VkVmFsdWVzLCBlbGltaW5hdGUgaXQuCisvLy8gVGhpcyBjYW4gb2NjdXIgd2hlbiBhIG5vZGUgaXMgZGVsZXRlZCB0aGVuIHJlYWxsb2NhdGVkIGFzIGEgbmV3IG5vZGUgLQorLy8vIHRoZSBtYXBwaW5nIGluIFJlcGxhY2VkVmFsdWVzIGFwcGxpZXMgdG8gdGhlIGRlbGV0ZWQgbm9kZSwgbm90IHRoZSBuZXcKKy8vLyBvbmUuCisvLy8gVGhlIG9ubHkgbWFwIHRoYXQgY2FuIGhhdmUgYSBkZWxldGVkIG5vZGUgYXMgYSBzb3VyY2UgaXMgUmVwbGFjZWRWYWx1ZXMuCisvLy8gT3RoZXIgbWFwcyBjYW4gaGF2ZSBkZWxldGVkIG5vZGVzIGFzIHRhcmdldHMsIGJ1dCBzaW5jZSB0aGVpciBsb29rZWQtdXAKKy8vLyB2YWx1ZXMgYXJlIGFsd2F5cyBpbW1lZGlhdGVseSByZW1hcHBlZCB1c2luZyBSZW1hcFZhbHVlLCByZXN1bHRpbmcgaW4gYQorLy8vIG5vdC1kZWxldGVkIG5vZGUsIHRoaXMgaXMgaGFybWxlc3MgYXMgbG9uZyBhcyBSZXBsYWNlZFZhbHVlcy9SZW1hcFZhbHVlCisvLy8gYWx3YXlzIHBlcmZvcm1zIGNvcnJlY3QgbWFwcGluZ3MuICBJbiBvcmRlciB0byBrZWVwIHRoZSBtYXBwaW5nIGNvcnJlY3QsCisvLy8gRXhwdW5nZU5vZGUgc2hvdWxkIGJlIGNhbGxlZCBvbiBhbnkgbmV3IG5vZGVzICpiZWZvcmUqIGFkZGluZyB0aGVtIGFzCisvLy8gZWl0aGVyIHNvdXJjZSBvciB0YXJnZXQgdG8gUmVwbGFjZWRWYWx1ZXMgKHdoaWNoIHR5cGljYWxseSBtZWFucyBjYWxsaW5nCisvLy8gRXhwdW5nZSB3aGVuIGEgbmV3IG5vZGUgaXMgZmlyc3Qgc2Vlbiwgc2luY2UgaXQgbWF5IG5vIGxvbmdlciBiZSBtYXJrZWQKKy8vLyBOZXdOb2RlIGJ5IHRoZSB0aW1lIGl0IGlzIGFkZGVkIHRvIFJlcGxhY2VkVmFsdWVzKS4KK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwdW5nZU5vZGUoU0ROb2RlICpOKSB7CisgIGlmIChOLT5nZXROb2RlSWQoKSAhPSBOZXdOb2RlKQorICAgIHJldHVybjsKKworICAvLyBJZiBOIGlzIG5vdCByZW1hcHBlZCBieSBSZXBsYWNlZFZhbHVlcyB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisgIHVuc2lnbmVkIGksIGU7CisgIGZvciAoaSA9IDAsIGUgPSBOLT5nZXROdW1WYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFJlcGxhY2VkVmFsdWVzLmZpbmQoU0RWYWx1ZShOLCBpKSkgIT0gUmVwbGFjZWRWYWx1ZXMuZW5kKCkpCisgICAgICBicmVhazsKKworICBpZiAoaSA9PSBlKQorICAgIHJldHVybjsKKworICAvLyBSZW1vdmUgTiBmcm9tIGFsbCBtYXBzIC0gdGhpcyBpcyBleHBlbnNpdmUgYnV0IHJhcmUuCisKKyAgZm9yIChEZW5zZU1hcDxTRFZhbHVlLCBTRFZhbHVlPjo6aXRlcmF0b3IgSSA9IFByb21vdGVkSW50ZWdlcnMuYmVnaW4oKSwKKyAgICAgICBFID0gUHJvbW90ZWRJbnRlZ2Vycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+Zmlyc3QuZ2V0Tm9kZSgpICE9IE4pOworICAgIFJlbWFwVmFsdWUoSS0+c2Vjb25kKTsKKyAgfQorCisgIGZvciAoRGVuc2VNYXA8U0RWYWx1ZSwgU0RWYWx1ZT46Oml0ZXJhdG9yIEkgPSBTb2Z0ZW5lZEZsb2F0cy5iZWdpbigpLAorICAgICAgIEUgPSBTb2Z0ZW5lZEZsb2F0cy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+Zmlyc3QuZ2V0Tm9kZSgpICE9IE4pOworICAgIFJlbWFwVmFsdWUoSS0+c2Vjb25kKTsKKyAgfQorCisgIGZvciAoRGVuc2VNYXA8U0RWYWx1ZSwgU0RWYWx1ZT46Oml0ZXJhdG9yIEkgPSBTY2FsYXJpemVkVmVjdG9ycy5iZWdpbigpLAorICAgICAgIEUgPSBTY2FsYXJpemVkVmVjdG9ycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+Zmlyc3QuZ2V0Tm9kZSgpICE9IE4pOworICAgIFJlbWFwVmFsdWUoSS0+c2Vjb25kKTsKKyAgfQorCisgIGZvciAoRGVuc2VNYXA8U0RWYWx1ZSwgU0RWYWx1ZT46Oml0ZXJhdG9yIEkgPSBXaWRlbmVkVmVjdG9ycy5iZWdpbigpLAorICAgICAgIEUgPSBXaWRlbmVkVmVjdG9ycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+Zmlyc3QuZ2V0Tm9kZSgpICE9IE4pOworICAgIFJlbWFwVmFsdWUoSS0+c2Vjb25kKTsKKyAgfQorCisgIGZvciAoRGVuc2VNYXA8U0RWYWx1ZSwgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+ID46Oml0ZXJhdG9yCisgICAgICAgSSA9IEV4cGFuZGVkSW50ZWdlcnMuYmVnaW4oKSwgRSA9IEV4cGFuZGVkSW50ZWdlcnMuZW5kKCk7IEkgIT0gRTsgKytJKXsKKyAgICBhc3NlcnQoSS0+Zmlyc3QuZ2V0Tm9kZSgpICE9IE4pOworICAgIFJlbWFwVmFsdWUoSS0+c2Vjb25kLmZpcnN0KTsKKyAgICBSZW1hcFZhbHVlKEktPnNlY29uZC5zZWNvbmQpOworICB9CisKKyAgZm9yIChEZW5zZU1hcDxTRFZhbHVlLCBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gPjo6aXRlcmF0b3IKKyAgICAgICBJID0gRXhwYW5kZWRGbG9hdHMuYmVnaW4oKSwgRSA9IEV4cGFuZGVkRmxvYXRzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGFzc2VydChJLT5maXJzdC5nZXROb2RlKCkgIT0gTik7CisgICAgUmVtYXBWYWx1ZShJLT5zZWNvbmQuZmlyc3QpOworICAgIFJlbWFwVmFsdWUoSS0+c2Vjb25kLnNlY29uZCk7CisgIH0KKworICBmb3IgKERlbnNlTWFwPFNEVmFsdWUsIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiA+OjppdGVyYXRvcgorICAgICAgIEkgPSBTcGxpdFZlY3RvcnMuYmVnaW4oKSwgRSA9IFNwbGl0VmVjdG9ycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+Zmlyc3QuZ2V0Tm9kZSgpICE9IE4pOworICAgIFJlbWFwVmFsdWUoSS0+c2Vjb25kLmZpcnN0KTsKKyAgICBSZW1hcFZhbHVlKEktPnNlY29uZC5zZWNvbmQpOworICB9CisKKyAgZm9yIChEZW5zZU1hcDxTRFZhbHVlLCBTRFZhbHVlPjo6aXRlcmF0b3IgSSA9IFJlcGxhY2VkVmFsdWVzLmJlZ2luKCksCisgICAgICAgRSA9IFJlcGxhY2VkVmFsdWVzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBSZW1hcFZhbHVlKEktPnNlY29uZCk7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bVZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICBSZXBsYWNlZFZhbHVlcy5lcmFzZShTRFZhbHVlKE4sIGkpKTsKK30KKworLy8vIFJlbWFwVmFsdWUgLSBJZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhbHJlYWR5IGxlZ2FsaXplZCB0byBhbm90aGVyIHZhbHVlLAorLy8vIHJlcGxhY2UgaXQgYnkgdGhhdCB2YWx1ZS4KK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6UmVtYXBWYWx1ZShTRFZhbHVlICZOKSB7CisgIERlbnNlTWFwPFNEVmFsdWUsIFNEVmFsdWU+OjppdGVyYXRvciBJID0gUmVwbGFjZWRWYWx1ZXMuZmluZChOKTsKKyAgaWYgKEkgIT0gUmVwbGFjZWRWYWx1ZXMuZW5kKCkpIHsKKyAgICAvLyBVc2UgcGF0aCBjb21wcmVzc2lvbiB0byBzcGVlZCB1cCBmdXR1cmUgbG9va3VwcyBpZiB2YWx1ZXMgZ2V0IG11bHRpcGx5CisgICAgLy8gcmVwbGFjZWQgd2l0aCBvdGhlciB2YWx1ZXMuCisgICAgUmVtYXBWYWx1ZShJLT5zZWNvbmQpOworICAgIE4gPSBJLT5zZWNvbmQ7CisgICAgYXNzZXJ0KE4uZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSAhPSBOZXdOb2RlICYmICJNYXBwZWQgdG8gbmV3IG5vZGUhIik7CisgIH0KK30KKworbmFtZXNwYWNlIHsKKyAgLy8vIE5vZGVVcGRhdGVMaXN0ZW5lciAtIFRoaXMgY2xhc3MgaXMgYSBEQUdVcGRhdGVMaXN0ZW5lciB0aGF0IGxpc3RlbnMgZm9yCisgIC8vLyB1cGRhdGVzIHRvIG5vZGVzIGFuZCByZWNvbXB1dGVzIHRoZWlyIHJlYWR5IHN0YXRlLgorICBjbGFzcyBOb2RlVXBkYXRlTGlzdGVuZXIgOiBwdWJsaWMgU2VsZWN0aW9uREFHOjpEQUdVcGRhdGVMaXN0ZW5lciB7CisgICAgREFHVHlwZUxlZ2FsaXplciAmRFRMOworICAgIFNtYWxsU2V0VmVjdG9yPFNETm9kZSosIDE2PiAmTm9kZXNUb0FuYWx5emU7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBOb2RlVXBkYXRlTGlzdGVuZXIoREFHVHlwZUxlZ2FsaXplciAmZHRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldFZlY3RvcjxTRE5vZGUqLCAxNj4gJm50YSkKKyAgICAgIDogRFRMKGR0bCksIE5vZGVzVG9BbmFseXplKG50YSkge30KKworICAgIHZpcnR1YWwgdm9pZCBOb2RlRGVsZXRlZChTRE5vZGUgKk4sIFNETm9kZSAqRSkgeworICAgICAgYXNzZXJ0KE4tPmdldE5vZGVJZCgpICE9IERBR1R5cGVMZWdhbGl6ZXI6OlJlYWR5VG9Qcm9jZXNzICYmCisgICAgICAgICAgICAgTi0+Z2V0Tm9kZUlkKCkgIT0gREFHVHlwZUxlZ2FsaXplcjo6UHJvY2Vzc2VkICYmCisgICAgICAgICAgICAgIkludmFsaWQgbm9kZSBJRCBmb3IgUkFVVyBkZWxldGlvbiEiKTsKKyAgICAgIC8vIEl0IGlzIHBvc3NpYmxlLCB0aG91Z2ggcmFyZSwgZm9yIHRoZSBkZWxldGVkIG5vZGUgTiB0byBvY2N1ciBhcyBhCisgICAgICAvLyB0YXJnZXQgaW4gYSBtYXAsIHNvIG5vdGUgdGhlIHJlcGxhY2VtZW50IE4gLT4gRSBpbiBSZXBsYWNlZFZhbHVlcy4KKyAgICAgIGFzc2VydChFICYmICJOb2RlIG5vdCByZXBsYWNlZD8iKTsKKyAgICAgIERUTC5Ob3RlRGVsZXRpb24oTiwgRSk7CisKKyAgICAgIC8vIEluIHRoZW9yeSB0aGUgZGVsZXRlZCBub2RlIGNvdWxkIGFsc28gaGF2ZSBiZWVuIHNjaGVkdWxlZCBmb3IgYW5hbHlzaXMuCisgICAgICAvLyBTbyByZW1vdmUgaXQgZnJvbSB0aGUgc2V0IG9mIG5vZGVzIHdoaWNoIHdpbGwgYmUgYW5hbHl6ZWQuCisgICAgICBOb2Rlc1RvQW5hbHl6ZS5yZW1vdmUoTik7CisKKyAgICAgIC8vIEluIGdlbmVyYWwgbm90aGluZyBuZWVkcyB0byBiZSBkb25lIGZvciBFLCBzaW5jZSBpdCBkaWRuJ3QgY2hhbmdlIGJ1dAorICAgICAgLy8gb25seSBnYWluZWQgbmV3IHVzZXMuICBIb3dldmVyIE4gLT4gRSB3YXMganVzdCBhZGRlZCB0byBSZXBsYWNlZFZhbHVlcywKKyAgICAgIC8vIGFuZCB0aGUgcmVzdWx0IG9mIGEgUmVwbGFjZWRWYWx1ZXMgbWFwcGluZyBpcyBub3QgYWxsb3dlZCB0byBiZSBtYXJrZWQKKyAgICAgIC8vIE5ld05vZGUuICBTbyBpZiBFIGlzIG1hcmtlZCBOZXdOb2RlLCB0aGVuIGl0IG5lZWRzIHRvIGJlIGFuYWx5emVkLgorICAgICAgaWYgKEUtPmdldE5vZGVJZCgpID09IERBR1R5cGVMZWdhbGl6ZXI6Ok5ld05vZGUpCisgICAgICAgIE5vZGVzVG9BbmFseXplLmluc2VydChFKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgTm9kZVVwZGF0ZWQoU0ROb2RlICpOKSB7CisgICAgICAvLyBOb2RlIHVwZGF0ZXMgY2FuIG1lYW4gcHJldHR5IG11Y2ggYW55dGhpbmcuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGFuCisgICAgICAvLyBvcGVyYW5kIHdhcyBzZXQgdG8gc29tZXRoaW5nIGFscmVhZHkgcHJvY2Vzc2VkIChmLmUuKSBpbiB3aGljaCBjYXNlCisgICAgICAvLyB0aGlzIG5vZGUgY291bGQgYmVjb21lIHJlYWR5LiAgUmVjb21wdXRlIGl0cyBmbGFncy4KKyAgICAgIGFzc2VydChOLT5nZXROb2RlSWQoKSAhPSBEQUdUeXBlTGVnYWxpemVyOjpSZWFkeVRvUHJvY2VzcyAmJgorICAgICAgICAgICAgIE4tPmdldE5vZGVJZCgpICE9IERBR1R5cGVMZWdhbGl6ZXI6OlByb2Nlc3NlZCAmJgorICAgICAgICAgICAgICJJbnZhbGlkIG5vZGUgSUQgZm9yIFJBVVcgZGVsZXRpb24hIik7CisgICAgICBOLT5zZXROb2RlSWQoREFHVHlwZUxlZ2FsaXplcjo6TmV3Tm9kZSk7CisgICAgICBOb2Rlc1RvQW5hbHl6ZS5pbnNlcnQoTik7CisgICAgfQorICB9OworfQorCisKKy8vLyBSZXBsYWNlVmFsdWVXaXRoIC0gVGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgbGVnYWxpemVkIHRvIHRoZSBzcGVjaWZpZWQgb3RoZXIKKy8vLyB2YWx1ZS4gIFVwZGF0ZSB0aGUgREFHIGFuZCBOb2RlSWRzIHJlcGxhY2luZyBhbnkgdXNlcyBvZiBGcm9tIHRvIHVzZSBUbworLy8vIGluc3RlYWQuCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OlJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZSBGcm9tLCBTRFZhbHVlIFRvKSB7CisgIGFzc2VydChGcm9tLmdldE5vZGUoKSAhPSBUby5nZXROb2RlKCkgJiYgIlBvdGVudGlhbCBsZWdhbGl6YXRpb24gbG9vcCEiKTsKKworICAvLyBJZiBleHBhbnNpb24gcHJvZHVjZWQgbmV3IG5vZGVzLCBtYWtlIHN1cmUgdGhleSBhcmUgcHJvcGVybHkgbWFya2VkLgorICBFeHB1bmdlTm9kZShGcm9tLmdldE5vZGUoKSk7CisgIEFuYWx5emVOZXdWYWx1ZShUbyk7IC8vIEV4cHVuZ2VzIFRvLgorCisgIC8vIEFueXRoaW5nIHRoYXQgdXNlZCB0aGUgb2xkIG5vZGUgc2hvdWxkIG5vdyB1c2UgdGhlIG5ldyBvbmUuICBOb3RlIHRoYXQgdGhpcworICAvLyBjYW4gcG90ZW50aWFsbHkgY2F1c2UgcmVjdXJzaXZlIG1lcmdpbmcuCisgIFNtYWxsU2V0VmVjdG9yPFNETm9kZSosIDE2PiBOb2Rlc1RvQW5hbHl6ZTsKKyAgTm9kZVVwZGF0ZUxpc3RlbmVyIE5VTCgqdGhpcywgTm9kZXNUb0FuYWx5emUpOworICBkbyB7CisgICAgREFHLlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoRnJvbSwgVG8sICZOVUwpOworCisgICAgLy8gVGhlIG9sZCBub2RlIG1heSBzdGlsbCBiZSBwcmVzZW50IGluIGEgbWFwIGxpa2UgRXhwYW5kZWRJbnRlZ2VycyBvcgorICAgIC8vIFByb21vdGVkSW50ZWdlcnMuICBJbmZvcm0gbWFwcyBhYm91dCB0aGUgcmVwbGFjZW1lbnQuCisgICAgUmVwbGFjZWRWYWx1ZXNbRnJvbV0gPSBUbzsKKworICAgIC8vIFByb2Nlc3MgdGhlIGxpc3Qgb2Ygbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlYW5hbHl6ZWQuCisgICAgd2hpbGUgKCFOb2Rlc1RvQW5hbHl6ZS5lbXB0eSgpKSB7CisgICAgICBTRE5vZGUgKk4gPSBOb2Rlc1RvQW5hbHl6ZS5iYWNrKCk7CisgICAgICBOb2Rlc1RvQW5hbHl6ZS5wb3BfYmFjaygpOworICAgICAgaWYgKE4tPmdldE5vZGVJZCgpICE9IERBR1R5cGVMZWdhbGl6ZXI6Ok5ld05vZGUpCisgICAgICAgIC8vIFRoZSBub2RlIHdhcyBhbmFseXplZCB3aGlsZSByZWFuYWx5emluZyBhbiBlYXJsaWVyIG5vZGUgLSBpdCBpcyBzYWZlCisgICAgICAgIC8vIHRvIHNraXAuICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBtb3JwaGluZyBub2RlIC0gb3RoZXJ3aXNlIGl0IHdvdWxkCisgICAgICAgIC8vIHN0aWxsIGJlIG1hcmtlZCBOZXdOb2RlLgorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gQW5hbHl6ZSB0aGUgbm9kZSdzIG9wZXJhbmRzIGFuZCByZWNhbGN1bGF0ZSB0aGUgbm9kZSBJRC4KKyAgICAgIFNETm9kZSAqTSA9IEFuYWx5emVOZXdOb2RlKE4pOworICAgICAgaWYgKE0gIT0gTikgeworICAgICAgICAvLyBUaGUgbm9kZSBtb3JwaGVkIGludG8gYSBkaWZmZXJlbnQgbm9kZS4gIE1ha2UgZXZlcnlvbmUgdXNlIHRoZSBuZXcKKyAgICAgICAgLy8gbm9kZSBpbnN0ZWFkLgorICAgICAgICBhc3NlcnQoTS0+Z2V0Tm9kZUlkKCkgIT0gTmV3Tm9kZSAmJiAiQW5hbHlzaXMgcmVzdWx0ZWQgaW4gTmV3Tm9kZSEiKTsKKyAgICAgICAgYXNzZXJ0KE4tPmdldE51bVZhbHVlcygpID09IE0tPmdldE51bVZhbHVlcygpICYmCisgICAgICAgICAgICAgICAiTm9kZSBtb3JwaGluZyBjaGFuZ2VkIHRoZSBudW1iZXIgb2YgcmVzdWx0cyEiKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bVZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIFNEVmFsdWUgT2xkVmFsKE4sIGkpOworICAgICAgICAgIFNEVmFsdWUgTmV3VmFsKE0sIGkpOworICAgICAgICAgIGlmIChNLT5nZXROb2RlSWQoKSA9PSBQcm9jZXNzZWQpCisgICAgICAgICAgICBSZW1hcFZhbHVlKE5ld1ZhbCk7CisgICAgICAgICAgREFHLlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoT2xkVmFsLCBOZXdWYWwsICZOVUwpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBub2RlIGNvbnRpbnVlcyB0byBleGlzdCBpbiB0aGUgREFHLCBtYXJrZWQgTmV3Tm9kZS4KKyAgICAgIH0KKyAgICB9CisgICAgLy8gV2hlbiByZWN1cnNpdmVseSB1cGRhdGUgbm9kZXMgd2l0aCBuZXcgbm9kZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUKKyAgICAvLyBuZXcgdXNlcyBvZiBGcm9tIGR1ZSB0byBDU0UuIElmIHRoaXMgaGFwcGVucywgcmVwbGFjZSB0aGUgbmV3IHVzZXMgb2YKKyAgICAvLyBGcm9tIHdpdGggVG8uCisgIH0gd2hpbGUgKCFGcm9tLnVzZV9lbXB0eSgpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTZXRQcm9tb3RlZEludGVnZXIoU0RWYWx1ZSBPcCwgU0RWYWx1ZSBSZXN1bHQpIHsKKyAgYXNzZXJ0KFJlc3VsdC5nZXRWYWx1ZVR5cGUoKSA9PQorICAgICAgICAgVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBPcC5nZXRWYWx1ZVR5cGUoKSkgJiYKKyAgICAgICAgICJJbnZhbGlkIHR5cGUgZm9yIHByb21vdGVkIGludGVnZXIiKTsKKyAgQW5hbHl6ZU5ld1ZhbHVlKFJlc3VsdCk7CisKKyAgU0RWYWx1ZSAmT3BFbnRyeSA9IFByb21vdGVkSW50ZWdlcnNbT3BdOworICBhc3NlcnQoT3BFbnRyeS5nZXROb2RlKCkgPT0gMCAmJiAiTm9kZSBpcyBhbHJlYWR5IHByb21vdGVkISIpOworICBPcEVudHJ5ID0gUmVzdWx0OworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OlNldFNvZnRlbmVkRmxvYXQoU0RWYWx1ZSBPcCwgU0RWYWx1ZSBSZXN1bHQpIHsKKyAgYXNzZXJ0KFJlc3VsdC5nZXRWYWx1ZVR5cGUoKSA9PQorICAgICAgICAgVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBPcC5nZXRWYWx1ZVR5cGUoKSkgJiYKKyAgICAgICAgICJJbnZhbGlkIHR5cGUgZm9yIHNvZnRlbmVkIGZsb2F0Iik7CisgIEFuYWx5emVOZXdWYWx1ZShSZXN1bHQpOworCisgIFNEVmFsdWUgJk9wRW50cnkgPSBTb2Z0ZW5lZEZsb2F0c1tPcF07CisgIGFzc2VydChPcEVudHJ5LmdldE5vZGUoKSA9PSAwICYmICJOb2RlIGlzIGFscmVhZHkgY29udmVydGVkIHRvIGludGVnZXIhIik7CisgIE9wRW50cnkgPSBSZXN1bHQ7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U2V0U2NhbGFyaXplZFZlY3RvcihTRFZhbHVlIE9wLCBTRFZhbHVlIFJlc3VsdCkgeworICBhc3NlcnQoUmVzdWx0LmdldFZhbHVlVHlwZSgpID09IE9wLmdldFZhbHVlVHlwZSgpLmdldFZlY3RvckVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgICJJbnZhbGlkIHR5cGUgZm9yIHNjYWxhcml6ZWQgdmVjdG9yIik7CisgIEFuYWx5emVOZXdWYWx1ZShSZXN1bHQpOworCisgIFNEVmFsdWUgJk9wRW50cnkgPSBTY2FsYXJpemVkVmVjdG9yc1tPcF07CisgIGFzc2VydChPcEVudHJ5LmdldE5vZGUoKSA9PSAwICYmICJOb2RlIGlzIGFscmVhZHkgc2NhbGFyaXplZCEiKTsKKyAgT3BFbnRyeSA9IFJlc3VsdDsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpHZXRFeHBhbmRlZEludGVnZXIoU0RWYWx1ZSBPcCwgU0RWYWx1ZSAmTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gJkVudHJ5ID0gRXhwYW5kZWRJbnRlZ2Vyc1tPcF07CisgIFJlbWFwVmFsdWUoRW50cnkuZmlyc3QpOworICBSZW1hcFZhbHVlKEVudHJ5LnNlY29uZCk7CisgIGFzc2VydChFbnRyeS5maXJzdC5nZXROb2RlKCkgJiYgIk9wZXJhbmQgaXNuJ3QgZXhwYW5kZWQiKTsKKyAgTG8gPSBFbnRyeS5maXJzdDsKKyAgSGkgPSBFbnRyeS5zZWNvbmQ7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U2V0RXhwYW5kZWRJbnRlZ2VyKFNEVmFsdWUgT3AsIFNEVmFsdWUgTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEhpKSB7CisgIGFzc2VydChMby5nZXRWYWx1ZVR5cGUoKSA9PQorICAgICAgICAgVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBPcC5nZXRWYWx1ZVR5cGUoKSkgJiYKKyAgICAgICAgIEhpLmdldFZhbHVlVHlwZSgpID09IExvLmdldFZhbHVlVHlwZSgpICYmCisgICAgICAgICAiSW52YWxpZCB0eXBlIGZvciBleHBhbmRlZCBpbnRlZ2VyIik7CisgIC8vIExvL0hpIG1heSBoYXZlIGJlZW4gbmV3bHkgYWxsb2NhdGVkLCBpZiBzbywgYWRkIG5vZGVpZCdzIGFzIHJlbGV2YW50LgorICBBbmFseXplTmV3VmFsdWUoTG8pOworICBBbmFseXplTmV3VmFsdWUoSGkpOworCisgIC8vIFJlbWVtYmVyIHRoYXQgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIHRoZSBub2RlLgorICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gJkVudHJ5ID0gRXhwYW5kZWRJbnRlZ2Vyc1tPcF07CisgIGFzc2VydChFbnRyeS5maXJzdC5nZXROb2RlKCkgPT0gMCAmJiAiTm9kZSBhbHJlYWR5IGV4cGFuZGVkIik7CisgIEVudHJ5LmZpcnN0ID0gTG87CisgIEVudHJ5LnNlY29uZCA9IEhpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkdldEV4cGFuZGVkRmxvYXQoU0RWYWx1ZSBPcCwgU0RWYWx1ZSAmTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+ICZFbnRyeSA9IEV4cGFuZGVkRmxvYXRzW09wXTsKKyAgUmVtYXBWYWx1ZShFbnRyeS5maXJzdCk7CisgIFJlbWFwVmFsdWUoRW50cnkuc2Vjb25kKTsKKyAgYXNzZXJ0KEVudHJ5LmZpcnN0LmdldE5vZGUoKSAmJiAiT3BlcmFuZCBpc24ndCBleHBhbmRlZCIpOworICBMbyA9IEVudHJ5LmZpcnN0OworICBIaSA9IEVudHJ5LnNlY29uZDsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTZXRFeHBhbmRlZEZsb2F0KFNEVmFsdWUgT3AsIFNEVmFsdWUgTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBIaSkgeworICBhc3NlcnQoTG8uZ2V0VmFsdWVUeXBlKCkgPT0KKyAgICAgICAgIFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgT3AuZ2V0VmFsdWVUeXBlKCkpICYmCisgICAgICAgICBIaS5nZXRWYWx1ZVR5cGUoKSA9PSBMby5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgIkludmFsaWQgdHlwZSBmb3IgZXhwYW5kZWQgZmxvYXQiKTsKKyAgLy8gTG8vSGkgbWF5IGhhdmUgYmVlbiBuZXdseSBhbGxvY2F0ZWQsIGlmIHNvLCBhZGQgbm9kZWlkJ3MgYXMgcmVsZXZhbnQuCisgIEFuYWx5emVOZXdWYWx1ZShMbyk7CisgIEFuYWx5emVOZXdWYWx1ZShIaSk7CisKKyAgLy8gUmVtZW1iZXIgdGhhdCB0aGlzIGlzIHRoZSByZXN1bHQgb2YgdGhlIG5vZGUuCisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiAmRW50cnkgPSBFeHBhbmRlZEZsb2F0c1tPcF07CisgIGFzc2VydChFbnRyeS5maXJzdC5nZXROb2RlKCkgPT0gMCAmJiAiTm9kZSBhbHJlYWR5IGV4cGFuZGVkIik7CisgIEVudHJ5LmZpcnN0ID0gTG87CisgIEVudHJ5LnNlY29uZCA9IEhpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkdldFNwbGl0VmVjdG9yKFNEVmFsdWUgT3AsIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gJkVudHJ5ID0gU3BsaXRWZWN0b3JzW09wXTsKKyAgUmVtYXBWYWx1ZShFbnRyeS5maXJzdCk7CisgIFJlbWFwVmFsdWUoRW50cnkuc2Vjb25kKTsKKyAgYXNzZXJ0KEVudHJ5LmZpcnN0LmdldE5vZGUoKSAmJiAiT3BlcmFuZCBpc24ndCBzcGxpdCIpOworICBMbyA9IEVudHJ5LmZpcnN0OworICBIaSA9IEVudHJ5LnNlY29uZDsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTZXRTcGxpdFZlY3RvcihTRFZhbHVlIE9wLCBTRFZhbHVlIExvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEhpKSB7CisgIGFzc2VydChMby5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpID09CisgICAgICAgICBPcC5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpICYmCisgICAgICAgICAyKkxvLmdldFZhbHVlVHlwZSgpLmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0KKyAgICAgICAgIE9wLmdldFZhbHVlVHlwZSgpLmdldFZlY3Rvck51bUVsZW1lbnRzKCkgJiYKKyAgICAgICAgIEhpLmdldFZhbHVlVHlwZSgpID09IExvLmdldFZhbHVlVHlwZSgpICYmCisgICAgICAgICAiSW52YWxpZCB0eXBlIGZvciBzcGxpdCB2ZWN0b3IiKTsKKyAgLy8gTG8vSGkgbWF5IGhhdmUgYmVlbiBuZXdseSBhbGxvY2F0ZWQsIGlmIHNvLCBhZGQgbm9kZWlkJ3MgYXMgcmVsZXZhbnQuCisgIEFuYWx5emVOZXdWYWx1ZShMbyk7CisgIEFuYWx5emVOZXdWYWx1ZShIaSk7CisKKyAgLy8gUmVtZW1iZXIgdGhhdCB0aGlzIGlzIHRoZSByZXN1bHQgb2YgdGhlIG5vZGUuCisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiAmRW50cnkgPSBTcGxpdFZlY3RvcnNbT3BdOworICBhc3NlcnQoRW50cnkuZmlyc3QuZ2V0Tm9kZSgpID09IDAgJiYgIk5vZGUgYWxyZWFkeSBzcGxpdCIpOworICBFbnRyeS5maXJzdCA9IExvOworICBFbnRyeS5zZWNvbmQgPSBIaTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTZXRXaWRlbmVkVmVjdG9yKFNEVmFsdWUgT3AsIFNEVmFsdWUgUmVzdWx0KSB7CisgIGFzc2VydChSZXN1bHQuZ2V0VmFsdWVUeXBlKCkgPT0KKyAgICAgICAgIFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgT3AuZ2V0VmFsdWVUeXBlKCkpICYmCisgICAgICAgICAiSW52YWxpZCB0eXBlIGZvciB3aWRlbmVkIHZlY3RvciIpOworICBBbmFseXplTmV3VmFsdWUoUmVzdWx0KTsKKworICBTRFZhbHVlICZPcEVudHJ5ID0gV2lkZW5lZFZlY3RvcnNbT3BdOworICBhc3NlcnQoT3BFbnRyeS5nZXROb2RlKCkgPT0gMCAmJiAiTm9kZSBhbHJlYWR5IHdpZGVuZWQhIik7CisgIE9wRW50cnkgPSBSZXN1bHQ7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFV0aWxpdGllcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBCaXRDb252ZXJ0VG9JbnRlZ2VyIC0gQ29udmVydCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzYW1lIHNpemUuCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkJpdENvbnZlcnRUb0ludGVnZXIoU0RWYWx1ZSBPcCkgeworICB1bnNpZ25lZCBCaXRXaWR0aCA9IE9wLmdldFZhbHVlVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIE9wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgQml0V2lkdGgpLCBPcCk7Cit9CisKKy8vLyBCaXRDb252ZXJ0VmVjdG9yVG9JbnRlZ2VyVmVjdG9yIC0gQ29udmVydCB0byBhIHZlY3RvciBvZiBpbnRlZ2VycyBvZiB0aGUKKy8vLyBzYW1lIHNpemUuCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkJpdENvbnZlcnRWZWN0b3JUb0ludGVnZXJWZWN0b3IoU0RWYWx1ZSBPcCkgeworICBhc3NlcnQoT3AuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSAmJiAiT25seSBhcHBsaWVzIHRvIHZlY3RvcnMhIik7CisgIHVuc2lnbmVkIEVsdFdpZHRoID0gT3AuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIEVWVCBFbHROVlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgRWx0V2lkdGgpOworICB1bnNpZ25lZCBOdW1FbHRzID0gT3AuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIE9wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBFbHROVlQsIE51bUVsdHMpLCBPcCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6Q3JlYXRlU3RhY2tTdG9yZUxvYWQoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIERlc3RWVCkgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIC8vIENyZWF0ZSB0aGUgc3RhY2sgZnJhbWUgb2JqZWN0LiAgTWFrZSBzdXJlIGl0IGlzIGFsaWduZWQgZm9yIGJvdGgKKyAgLy8gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdHlwZXMuCisgIFNEVmFsdWUgU3RhY2tQdHIgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoT3AuZ2V0VmFsdWVUeXBlKCksIERlc3RWVCk7CisgIC8vIEVtaXQgYSBzdG9yZSB0byB0aGUgc3RhY2sgc2xvdC4KKyAgU0RWYWx1ZSBTdG9yZSA9IERBRy5nZXRTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBPcCwgU3RhY2tQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgLy8gUmVzdWx0IGlzIGEgbG9hZCBmcm9tIHRoZSBzdGFjayBzbG90LgorICByZXR1cm4gREFHLmdldExvYWQoRGVzdFZULCBkbCwgU3RvcmUsIFN0YWNrUHRyLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworfQorCisvLy8gQ3VzdG9tTG93ZXJOb2RlIC0gUmVwbGFjZSB0aGUgbm9kZSdzIHJlc3VsdHMgd2l0aCBjdXN0b20gY29kZSBwcm92aWRlZAorLy8vIGJ5IHRoZSB0YXJnZXQgYW5kIHJldHVybiAidHJ1ZSIsIG9yIGRvIG5vdGhpbmcgYW5kIHJldHVybiAiZmFsc2UiLgorLy8vIFRoZSBsYXN0IHBhcmFtZXRlciBpcyBGQUxTRSBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgbm9kZSB3aXRoIGxlZ2FsCisvLy8gcmVzdWx0IHR5cGVzIGFuZCBpbGxlZ2FsIG9wZXJhbmQuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGRlbm90ZXMgdGhlIHR5cGUgb2YKKy8vLyBpbGxlZ2FsIE9wZXJhbmRObyBpbiB0aGF0IGNhc2UuCisvLy8gVGhlIGxhc3QgcGFyYW1ldGVyIGJlaW5nIFRSVUUgbWVhbnMgd2UgYXJlIGRlYWxpbmcgd2l0aCBhCisvLy8gbm9kZSB3aXRoIGlsbGVnYWwgcmVzdWx0IHR5cGVzLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBkZW5vdGVzIHRoZSB0eXBlIG9mCisvLy8gaWxsZWdhbCBSZXNObyBpbiB0aGF0IGNhc2UuCitib29sIERBR1R5cGVMZWdhbGl6ZXI6OkN1c3RvbUxvd2VyTm9kZShTRE5vZGUgKk4sIEVWVCBWVCwgYm9vbCBMZWdhbGl6ZVJlc3VsdCkgeworICAvLyBTZWUgaWYgdGhlIHRhcmdldCB3YW50cyB0byBjdXN0b20gbG93ZXIgdGhpcyBub2RlLgorICBpZiAoVExJLmdldE9wZXJhdGlvbkFjdGlvbihOLT5nZXRPcGNvZGUoKSwgVlQpICE9IFRhcmdldExvd2VyaW5nOjpDdXN0b20pCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IFJlc3VsdHM7CisgIGlmIChMZWdhbGl6ZVJlc3VsdCkKKyAgICBUTEkuUmVwbGFjZU5vZGVSZXN1bHRzKE4sIFJlc3VsdHMsIERBRyk7CisgIGVsc2UKKyAgICBUTEkuTG93ZXJPcGVyYXRpb25XcmFwcGVyKE4sIFJlc3VsdHMsIERBRyk7CisKKyAgaWYgKFJlc3VsdHMuZW1wdHkoKSkKKyAgICAvLyBUaGUgdGFyZ2V0IGRpZG4ndCB3YW50IHRvIGN1c3RvbSBsb3dlciBpdCBhZnRlciBhbGwuCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE1ha2UgZXZlcnl0aGluZyB0aGF0IG9uY2UgdXNlZCBOJ3MgdmFsdWVzIG5vdyB1c2UgdGhvc2UgaW4gUmVzdWx0cyBpbnN0ZWFkLgorICBhc3NlcnQoUmVzdWx0cy5zaXplKCkgPT0gTi0+Z2V0TnVtVmFsdWVzKCkgJiYKKyAgICAgICAgICJDdXN0b20gbG93ZXJpbmcgcmV0dXJuZWQgdGhlIHdyb25nIG51bWJlciBvZiByZXN1bHRzISIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVzdWx0cy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCBpKSwgUmVzdWx0c1tpXSk7CisgIHJldHVybiB0cnVlOworfQorCisKKy8vLyBDdXN0b21XaWRlbkxvd2VyTm9kZSAtIFdpZGVuIHRoZSBub2RlJ3MgcmVzdWx0cyB3aXRoIGN1c3RvbSBjb2RlIHByb3ZpZGVkCisvLy8gYnkgdGhlIHRhcmdldCBhbmQgcmV0dXJuICJ0cnVlIiwgb3IgZG8gbm90aGluZyBhbmQgcmV0dXJuICJmYWxzZSIuCitib29sIERBR1R5cGVMZWdhbGl6ZXI6OkN1c3RvbVdpZGVuTG93ZXJOb2RlKFNETm9kZSAqTiwgRVZUIFZUKSB7CisgIC8vIFNlZSBpZiB0aGUgdGFyZ2V0IHdhbnRzIHRvIGN1c3RvbSBsb3dlciB0aGlzIG5vZGUuCisgIGlmIChUTEkuZ2V0T3BlcmF0aW9uQWN0aW9uKE4tPmdldE9wY29kZSgpLCBWVCkgIT0gVGFyZ2V0TG93ZXJpbmc6OkN1c3RvbSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gUmVzdWx0czsKKyAgVExJLlJlcGxhY2VOb2RlUmVzdWx0cyhOLCBSZXN1bHRzLCBEQUcpOworCisgIGlmIChSZXN1bHRzLmVtcHR5KCkpCisgICAgLy8gVGhlIHRhcmdldCBkaWRuJ3Qgd2FudCB0byBjdXN0b20gd2lkZW4gbG93ZXIgaXRzIHJlc3VsdCAgYWZ0ZXIgYWxsLgorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBVcGRhdGUgdGhlIHdpZGVuaW5nIG1hcC4KKyAgYXNzZXJ0KFJlc3VsdHMuc2l6ZSgpID09IE4tPmdldE51bVZhbHVlcygpICYmCisgICAgICAgICAiQ3VzdG9tIGxvd2VyaW5nIHJldHVybmVkIHRoZSB3cm9uZyBudW1iZXIgb2YgcmVzdWx0cyEiKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlc3VsdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBTZXRXaWRlbmVkVmVjdG9yKFNEVmFsdWUoTiwgaSksIFJlc3VsdHNbaV0pOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIEdldFNwbGl0RGVzdFZUcyAtIENvbXB1dGUgdGhlIFZUcyBuZWVkZWQgZm9yIHRoZSBsb3cvaGkgcGFydHMgb2YgYSB0eXBlCisvLy8gd2hpY2ggaXMgc3BsaXQgaW50byB0d28gbm90IG5lY2Vzc2FyaWx5IGlkZW50aWNhbCBwaWVjZXMuCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkdldFNwbGl0RGVzdFZUcyhFVlQgSW5WVCwgRVZUICZMb1ZULCBFVlQgJkhpVlQpIHsKKyAgLy8gQ3VycmVudGx5IGFsbCB0eXBlcyBhcmUgc3BsaXQgaW4gaGFsZi4KKyAgaWYgKCFJblZULmlzVmVjdG9yKCkpIHsKKyAgICBMb1ZUID0gSGlWVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgSW5WVCk7CisgIH0gZWxzZSB7CisgICAgdW5zaWduZWQgTnVtRWxlbWVudHMgPSBJblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgYXNzZXJ0KCEoTnVtRWxlbWVudHMgJiAxKSAmJiAiU3BsaXR0aW5nIHZlY3RvciwgYnV0IG5vdCBpbiBoYWxmISIpOworICAgIExvVlQgPSBIaVZUID0gRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5WVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLCBOdW1FbGVtZW50cy8yKTsKKyAgfQorfQorCisvLy8gR2V0UGFpckVsZW1lbnRzIC0gVXNlIElTRDo6RVhUUkFDVF9FTEVNRU5UIG5vZGVzIHRvIGV4dHJhY3QgdGhlIGxvdyBhbmQKKy8vLyBoaWdoIHBhcnRzIG9mIHRoZSBnaXZlbiB2YWx1ZS4KK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6R2V0UGFpckVsZW1lbnRzKFNEVmFsdWUgUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBEZWJ1Z0xvYyBkbCA9IFBhaXIuZ2V0RGVidWdMb2MoKTsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgUGFpci5nZXRWYWx1ZVR5cGUoKSk7CisgIExvID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBOVlQsIFBhaXIsCisgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE5WVCwgUGFpciwKKyAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMSkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkdldFZlY3RvckVsZW1lbnRQb2ludGVyKFNEVmFsdWUgVmVjUHRyLCBFVlQgRWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgSW5kZXgpIHsKKyAgRGVidWdMb2MgZGwgPSBJbmRleC5nZXREZWJ1Z0xvYygpOworICAvLyBNYWtlIHN1cmUgdGhlIGluZGV4IHR5cGUgaXMgYmlnIGVub3VnaCB0byBjb21wdXRlIGluLgorICBpZiAoSW5kZXguZ2V0VmFsdWVUeXBlKCkuYml0c0dUKFRMSS5nZXRQb2ludGVyVHkoKSkpCisgICAgSW5kZXggPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgVExJLmdldFBvaW50ZXJUeSgpLCBJbmRleCk7CisgIGVsc2UKKyAgICBJbmRleCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBUTEkuZ2V0UG9pbnRlclR5KCksIEluZGV4KTsKKworICAvLyBDYWxjdWxhdGUgdGhlIGVsZW1lbnQgb2Zmc2V0IGFuZCBhZGQgaXQgdG8gdGhlIHBvaW50ZXIuCisgIHVuc2lnbmVkIEVsdFNpemUgPSBFbHRWVC5nZXRTaXplSW5CaXRzKCkgLyA4OyAvLyBGSVhNRTogc2hvdWxkIGJlIEFCSSBzaXplLgorCisgIEluZGV4ID0gREFHLmdldE5vZGUoSVNEOjpNVUwsIGRsLCBJbmRleC5nZXRWYWx1ZVR5cGUoKSwgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEVsdFNpemUsIEluZGV4LmdldFZhbHVlVHlwZSgpKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIEluZGV4LmdldFZhbHVlVHlwZSgpLCBJbmRleCwgVmVjUHRyKTsKK30KKworLy8vIEpvaW5JbnRlZ2VycyAtIEJ1aWxkIGFuIGludGVnZXIgd2l0aCBsb3cgYml0cyBMbyBhbmQgaGlnaCBiaXRzIEhpLgorU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpKb2luSW50ZWdlcnMoU0RWYWx1ZSBMbywgU0RWYWx1ZSBIaSkgeworICAvLyBBcmJpdHJhcmlseSB1c2UgZGxIaSBmb3IgcmVzdWx0IERlYnVnTG9jCisgIERlYnVnTG9jIGRsSGkgPSBIaS5nZXREZWJ1Z0xvYygpOworICBEZWJ1Z0xvYyBkbExvID0gTG8uZ2V0RGVidWdMb2MoKTsKKyAgRVZUIExWVCA9IExvLmdldFZhbHVlVHlwZSgpOworICBFVlQgSFZUID0gSGkuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBOVlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVC5nZXRTaXplSW5CaXRzKCkgKyBIVlQuZ2V0U2l6ZUluQml0cygpKTsKKworICBMbyA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsTG8sIE5WVCwgTG8pOworICBIaSA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGxIaSwgTlZULCBIaSk7CisgIEhpID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsSGksIE5WVCwgSGksCisgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KExWVC5nZXRTaXplSW5CaXRzKCksIFRMSS5nZXRQb2ludGVyVHkoKSkpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpPUiwgZGxIaSwgTlZULCBMbywgSGkpOworfQorCisvLy8gTGliQ2FsbGlmeSAtIENvbnZlcnQgdGhlIG5vZGUgaW50byBhIGxpYmNhbGwgd2l0aCB0aGUgc2FtZSBwcm90b3R5cGUuCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkxpYkNhbGxpZnkoUlRMSUI6OkxpYmNhbGwgTEMsIFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSB7CisgIHVuc2lnbmVkIE51bU9wcyA9IE4tPmdldE51bU9wZXJhbmRzKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgaWYgKE51bU9wcyA9PSAwKSB7CisgICAgcmV0dXJuIE1ha2VMaWJDYWxsKExDLCBOLT5nZXRWYWx1ZVR5cGUoMCksIDAsIDAsIGlzU2lnbmVkLCBkbCk7CisgIH0gZWxzZSBpZiAoTnVtT3BzID09IDEpIHsKKyAgICBTRFZhbHVlIE9wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICByZXR1cm4gTWFrZUxpYkNhbGwoTEMsIE4tPmdldFZhbHVlVHlwZSgwKSwgJk9wLCAxLCBpc1NpZ25lZCwgZGwpOworICB9IGVsc2UgaWYgKE51bU9wcyA9PSAyKSB7CisgICAgU0RWYWx1ZSBPcHNbMl0gPSB7IE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSkgfTsKKyAgICByZXR1cm4gTWFrZUxpYkNhbGwoTEMsIE4tPmdldFZhbHVlVHlwZSgwKSwgT3BzLCAyLCBpc1NpZ25lZCwgZGwpOworICB9CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wcyhOdW1PcHMpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtT3BzOyArK2kpCisgICAgT3BzW2ldID0gTi0+Z2V0T3BlcmFuZChpKTsKKworICByZXR1cm4gTWFrZUxpYkNhbGwoTEMsIE4tPmdldFZhbHVlVHlwZSgwKSwgJk9wc1swXSwgTnVtT3BzLCBpc1NpZ25lZCwgZGwpOworfQorCisvLy8gTWFrZUxpYkNhbGwgLSBHZW5lcmF0ZSBhIGxpYmNhbGwgdGFraW5nIHRoZSBnaXZlbiBvcGVyYW5kcyBhcyBhcmd1bWVudHMgYW5kCisvLy8gcmV0dXJuaW5nIGEgcmVzdWx0IG9mIHR5cGUgUmV0VlQuCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6Ok1ha2VMaWJDYWxsKFJUTElCOjpMaWJjYWxsIExDLCBFVlQgUmV0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkLCBEZWJ1Z0xvYyBkbCkgeworICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdFR5IEFyZ3M7CisgIEFyZ3MucmVzZXJ2ZShOdW1PcHMpOworCisgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0RW50cnkgRW50cnk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICBFbnRyeS5Ob2RlID0gT3BzW2ldOworICAgIEVudHJ5LlR5ID0gRW50cnkuTm9kZS5nZXRWYWx1ZVR5cGUoKS5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgICBFbnRyeS5pc1NFeHQgPSBpc1NpZ25lZDsKKyAgICBFbnRyeS5pc1pFeHQgPSAhaXNTaWduZWQ7CisgICAgQXJncy5wdXNoX2JhY2soRW50cnkpOworICB9CisgIFNEVmFsdWUgQ2FsbGVlID0gREFHLmdldEV4dGVybmFsU3ltYm9sKFRMSS5nZXRMaWJjYWxsTmFtZShMQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSk7CisKKyAgY29uc3QgVHlwZSAqUmV0VHkgPSBSZXRWVC5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgc3RkOjpwYWlyPFNEVmFsdWUsU0RWYWx1ZT4gQ2FsbEluZm8gPQorICAgIFRMSS5Mb3dlckNhbGxUbyhEQUcuZ2V0RW50cnlOb2RlKCksIFJldFR5LCBpc1NpZ25lZCwgIWlzU2lnbmVkLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIDAsIFRMSS5nZXRMaWJjYWxsQ2FsbGluZ0NvbnYoTEMpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLyppc1JldHVyblZhbHVlVXNlZD0qL3RydWUsCisgICAgICAgICAgICAgICAgICAgIENhbGxlZSwgQXJncywgREFHLCBkbCk7CisgIHJldHVybiBDYWxsSW5mby5maXJzdDsKK30KKworLy8vIFByb21vdGVUYXJnZXRCb29sZWFuIC0gUHJvbW90ZSB0aGUgZ2l2ZW4gdGFyZ2V0IGJvb2xlYW4gdG8gYSB0YXJnZXQgYm9vbGVhbgorLy8vIG9mIHRoZSBnaXZlbiB0eXBlLiAgQSB0YXJnZXQgYm9vbGVhbiBpcyBhbiBpbnRlZ2VyIHZhbHVlLCBub3QgbmVjZXNzYXJpbHkgb2YKKy8vLyB0eXBlIGkxLCB0aGUgYml0cyBvZiB3aGljaCBjb25mb3JtIHRvIGdldEJvb2xlYW5Db250ZW50cy4KK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6UHJvbW90ZVRhcmdldEJvb2xlYW4oU0RWYWx1ZSBCb29sLCBFVlQgVlQpIHsKKyAgRGVidWdMb2MgZGwgPSBCb29sLmdldERlYnVnTG9jKCk7CisgIElTRDo6Tm9kZVR5cGUgRXh0ZW5kQ29kZTsKKyAgc3dpdGNoIChUTEkuZ2V0Qm9vbGVhbkNvbnRlbnRzKCkpIHsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoZmFsc2UgJiYgIlVua25vd24gQm9vbGVhbkNvbnRlbnQhIik7CisgIGNhc2UgVGFyZ2V0TG93ZXJpbmc6OlVuZGVmaW5lZEJvb2xlYW5Db250ZW50OgorICAgIC8vIEV4dGVuZCB0byBWVCBieSBhZGRpbmcgcnViYmlzaCBiaXRzLgorICAgIEV4dGVuZENvZGUgPSBJU0Q6OkFOWV9FWFRFTkQ7CisgICAgYnJlYWs7CisgIGNhc2UgVGFyZ2V0TG93ZXJpbmc6Olplcm9Pck9uZUJvb2xlYW5Db250ZW50OgorICAgIC8vIEV4dGVuZCB0byBWVCBieSBhZGRpbmcgemVybyBiaXRzLgorICAgIEV4dGVuZENvZGUgPSBJU0Q6OlpFUk9fRVhURU5EOworICAgIGJyZWFrOworICBjYXNlIFRhcmdldExvd2VyaW5nOjpaZXJvT3JOZWdhdGl2ZU9uZUJvb2xlYW5Db250ZW50OiB7CisgICAgLy8gRXh0ZW5kIHRvIFZUIGJ5IGNvcHlpbmcgdGhlIHNpZ24gYml0LgorICAgIEV4dGVuZENvZGUgPSBJU0Q6OlNJR05fRVhURU5EOworICAgIGJyZWFrOworICB9CisgIH0KKyAgcmV0dXJuIERBRy5nZXROb2RlKEV4dGVuZENvZGUsIGRsLCBWVCwgQm9vbCk7Cit9CisKKy8vLyBTcGxpdEludGVnZXIgLSBSZXR1cm4gdGhlIGxvd2VyIExvVlQgYml0cyBvZiBPcCBpbiBMbyBhbmQgdGhlIHVwcGVyIEhpVlQKKy8vLyBiaXRzIGluIEhpLgordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTcGxpdEludGVnZXIoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb1ZULCBFVlQgSGlWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGFzc2VydChMb1ZULmdldFNpemVJbkJpdHMoKSArIEhpVlQuZ2V0U2l6ZUluQml0cygpID09CisgICAgICAgICBPcC5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCkgJiYgIkludmFsaWQgaW50ZWdlciBzcGxpdHRpbmchIik7CisgIExvID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIExvVlQsIE9wKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLCBPcCwKKyAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTG9WVC5nZXRTaXplSW5CaXRzKCksIFRMSS5nZXRQb2ludGVyVHkoKSkpOworICBIaSA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBIaVZULCBIaSk7Cit9CisKKy8vLyBTcGxpdEludGVnZXIgLSBSZXR1cm4gdGhlIGxvd2VyIGFuZCB1cHBlciBoYWx2ZXMgb2YgT3AncyBiaXRzIGluIGEgdmFsdWUKKy8vLyB0eXBlIGhhbGYgdGhlIHNpemUgb2YgT3Ancy4KK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRJbnRlZ2VyKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIEhhbGZWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpLzIpOworICBTcGxpdEludGVnZXIoT3AsIEhhbGZWVCwgSGFsZlZULCBMbywgSGkpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRW50cnkgUG9pbnQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBMZWdhbGl6ZVR5cGVzIC0gVGhpcyB0cmFuc2Zvcm1zIHRoZSBTZWxlY3Rpb25EQUcgaW50byBhIFNlbGVjdGlvbkRBRyB0aGF0CisvLy8gb25seSB1c2VzIHR5cGVzIG5hdGl2ZWx5IHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0LiAgUmV0dXJucyAidHJ1ZSIgaWYgaXQgbWFkZQorLy8vIGFueSBjaGFuZ2VzLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYW4gaW52b2x2ZWQgcHJvY2VzcyB0aGF0IG1heSBpbnZhbGlkYXRlIHBvaW50ZXJzIGludG8KKy8vLyB0aGUgZ3JhcGguCitib29sIFNlbGVjdGlvbkRBRzo6TGVnYWxpemVUeXBlcygpIHsKKyAgcmV0dXJuIERBR1R5cGVMZWdhbGl6ZXIoKnRoaXMpLnJ1bigpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplVHlwZXMuaCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9MZWdhbGl6ZVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4NjY5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9MZWdhbGl6ZVR5cGVzLmgKQEAgLTAsMCArMSw3NDQgQEAKKy8vPT09LS0gTGVnYWxpemVUeXBlcy5oIC0gRGVmaW5pdGlvbiBvZiB0aGUgREFHIFR5cGUgTGVnYWxpemVyIGNsYXNzIC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIERBR1R5cGVMZWdhbGl6ZXIgY2xhc3MuICBUaGlzIGlzIGEgcHJpdmF0ZSBpbnRlcmZhY2UKKy8vIHNoYXJlZCBiZXR3ZWVuIHRoZSBjb2RlIHRoYXQgaW1wbGVtZW50cyB0aGUgU2VsZWN0aW9uREFHOjpMZWdhbGl6ZVR5cGVzCisvLyBtZXRob2QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTRUxFQ1RJT05EQUdfTEVHQUxJWkVUWVBFU19ICisjZGVmaW5lIFNFTEVDVElPTkRBR19MRUdBTElaRVRZUEVTX0gKKworI2RlZmluZSBERUJVR19UWVBFICJsZWdhbGl6ZS10eXBlcyIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBEQUdUeXBlTGVnYWxpemVyIC0gVGhpcyB0YWtlcyBhbiBhcmJpdHJhcnkgU2VsZWN0aW9uREFHIGFzIGlucHV0IGFuZCBoYWNrcworLy8vIG9uIGl0IHVudGlsIG9ubHkgdmFsdWUgdHlwZXMgdGhlIHRhcmdldCBtYWNoaW5lIGNhbiBoYW5kbGUgYXJlIGxlZnQuICBUaGlzCisvLy8gaW52b2x2ZXMgcHJvbW90aW5nIHNtYWxsIHNpemVzIHRvIGxhcmdlIHNpemVzIG9yIHNwbGl0dGluZyB1cCBsYXJnZSB2YWx1ZXMKKy8vLyBpbnRvIHNtYWxsIHZhbHVlcy4KKy8vLworY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgREFHVHlwZUxlZ2FsaXplciB7CisgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEk7CisgIFNlbGVjdGlvbkRBRyAmREFHOworcHVibGljOgorICAvLyBOb2RlSWRGbGFncyAtIFRoaXMgcGFzcyB1c2VzIHRoZSBOb2RlSWQgb24gdGhlIFNETm9kZXMgdG8gaG9sZCBpbmZvcm1hdGlvbgorICAvLyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIG5vZGUuICBUaGUgZW51bSBoYXMgYWxsIHRoZSB2YWx1ZXMuCisgIGVudW0gTm9kZUlkRmxhZ3MgeworICAgIC8vLyBSZWFkeVRvUHJvY2VzcyAtIEFsbCBvcGVyYW5kcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBzbyB0aGlzIG5vZGUgaXMgcmVhZHkKKyAgICAvLy8gdG8gYmUgaGFuZGxlZC4KKyAgICBSZWFkeVRvUHJvY2VzcyA9IDAsCisKKyAgICAvLy8gTmV3Tm9kZSAtIFRoaXMgaXMgYSBuZXcgbm9kZSwgbm90IGJlZm9yZSBzZWVuLCB0aGF0IHdhcyBjcmVhdGVkIGluIHRoZQorICAgIC8vLyBwcm9jZXNzIG9mIGxlZ2FsaXppbmcgc29tZSBvdGhlciBub2RlLgorICAgIE5ld05vZGUgPSAtMSwKKworICAgIC8vLyBVbmFuYWx5emVkIC0gVGhpcyBub2RlJ3MgSUQgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgaXRzCisgICAgLy8vIHVucHJvY2Vzc2VkIG9wZXJhbmRzLgorICAgIFVuYW5hbHl6ZWQgPSAtMiwKKworICAgIC8vLyBQcm9jZXNzZWQgLSBUaGlzIGlzIGEgbm9kZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLgorICAgIFByb2Nlc3NlZCA9IC0zCisKKyAgICAvLyAxKyAtIFRoaXMgaXMgYSBub2RlIHdoaWNoIGhhcyB0aGlzIG1hbnkgdW5wcm9jZXNzZWQgb3BlcmFuZHMuCisgIH07Citwcml2YXRlOgorICBlbnVtIExlZ2FsaXplQWN0aW9uIHsKKyAgICBMZWdhbCwgICAgICAgICAgIC8vIFRoZSB0YXJnZXQgbmF0aXZlbHkgc3VwcG9ydHMgdGhpcyB0eXBlLgorICAgIFByb21vdGVJbnRlZ2VyLCAgLy8gUmVwbGFjZSB0aGlzIGludGVnZXIgdHlwZSB3aXRoIGEgbGFyZ2VyIG9uZS4KKyAgICBFeHBhbmRJbnRlZ2VyLCAgIC8vIFNwbGl0IHRoaXMgaW50ZWdlciB0eXBlIGludG8gdHdvIG9mIGhhbGYgdGhlIHNpemUuCisgICAgU29mdGVuRmxvYXQsICAgICAvLyBDb252ZXJ0IHRoaXMgZmxvYXQgdHlwZSB0byBhIHNhbWUgc2l6ZSBpbnRlZ2VyIHR5cGUuCisgICAgRXhwYW5kRmxvYXQsICAgICAvLyBTcGxpdCB0aGlzIGZsb2F0IHR5cGUgaW50byB0d28gb2YgaGFsZiB0aGUgc2l6ZS4KKyAgICBTY2FsYXJpemVWZWN0b3IsIC8vIFJlcGxhY2UgdGhpcyBvbmUtZWxlbWVudCB2ZWN0b3Igd2l0aCBpdHMgZWxlbWVudCB0eXBlLgorICAgIFNwbGl0VmVjdG9yLCAgICAgLy8gU3BsaXQgdGhpcyB2ZWN0b3IgdHlwZSBpbnRvIHR3byBvZiBoYWxmIHRoZSBzaXplLgorICAgIFdpZGVuVmVjdG9yICAgICAgLy8gVGhpcyB2ZWN0b3IgdHlwZSBzaG91bGQgYmUgd2lkZW5lZCBpbnRvIGEgbGFyZ2VyIHZlY3Rvci4KKyAgfTsKKworICAvLy8gVmFsdWVUeXBlQWN0aW9ucyAtIFRoaXMgaXMgYSBiaXR2ZWN0b3IgdGhhdCBjb250YWlucyB0d28gYml0cyBmb3IgZWFjaAorICAvLy8gc2ltcGxlIHZhbHVlIHR5cGUsIHdoZXJlIHRoZSB0d28gYml0cyBjb3JyZXNwb25kIHRvIHRoZSBMZWdhbGl6ZUFjdGlvbgorICAvLy8gZW51bSBmcm9tIFRhcmdldExvd2VyaW5nLiAgVGhpcyBjYW4gYmUgcXVlcmllZCB3aXRoICJnZXRUeXBlQWN0aW9uKFZUKSIuCisgIFRhcmdldExvd2VyaW5nOjpWYWx1ZVR5cGVBY3Rpb25JbXBsIFZhbHVlVHlwZUFjdGlvbnM7CisKKyAgLy8vIGdldFR5cGVBY3Rpb24gLSBSZXR1cm4gaG93IHdlIHNob3VsZCBsZWdhbGl6ZSB2YWx1ZXMgb2YgdGhpcyB0eXBlLgorICBMZWdhbGl6ZUFjdGlvbiBnZXRUeXBlQWN0aW9uKEVWVCBWVCkgY29uc3QgeworICAgIHN3aXRjaCAoVmFsdWVUeXBlQWN0aW9ucy5nZXRUeXBlQWN0aW9uKCpEQUcuZ2V0Q29udGV4dCgpLCBWVCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbmtub3duIGxlZ2FsaXplIGFjdGlvbiEiKTsKKyAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpMZWdhbDoKKyAgICAgIHJldHVybiBMZWdhbDsKKyAgICBjYXNlIFRhcmdldExvd2VyaW5nOjpQcm9tb3RlOgorICAgICAgLy8gUHJvbW90ZSBjYW4gbWVhbgorICAgICAgLy8gICAxKSBGb3IgaW50ZWdlcnMsIHVzZSBhIGxhcmdlciBpbnRlZ2VyIHR5cGUgKGUuZy4gaTggLT4gaTMyKS4KKyAgICAgIC8vICAgMikgRm9yIHZlY3RvcnMsIHVzZSBhIHdpZGVyIHZlY3RvciB0eXBlIChlLmcuIHYzaTMyIC0+IHY0aTMyKS4KKyAgICAgIGlmICghVlQuaXNWZWN0b3IoKSkKKyAgICAgICAgcmV0dXJuIFByb21vdGVJbnRlZ2VyOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gV2lkZW5WZWN0b3I7CisgICAgY2FzZSBUYXJnZXRMb3dlcmluZzo6RXhwYW5kOgorICAgICAgLy8gRXhwYW5kIGNhbiBtZWFuCisgICAgICAvLyAxKSBzcGxpdCBzY2FsYXIgaW4gaGFsZiwgMikgY29udmVydCBhIGZsb2F0IHRvIGFuIGludGVnZXIsCisgICAgICAvLyAzKSBzY2FsYXJpemUgYSBzaW5nbGUtZWxlbWVudCB2ZWN0b3IsIDQpIHNwbGl0IGEgdmVjdG9yIGluIHR3by4KKyAgICAgIGlmICghVlQuaXNWZWN0b3IoKSkgeworICAgICAgICBpZiAoVlQuaXNJbnRlZ2VyKCkpCisgICAgICAgICAgcmV0dXJuIEV4cGFuZEludGVnZXI7CisgICAgICAgIGVsc2UgaWYgKFZULmdldFNpemVJbkJpdHMoKSA9PQorICAgICAgICAgICAgICAgICBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIFZUKS5nZXRTaXplSW5CaXRzKCkpCisgICAgICAgICAgcmV0dXJuIFNvZnRlbkZsb2F0OworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIEV4cGFuZEZsb2F0OworICAgICAgfSBlbHNlIGlmIChWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpID09IDEpIHsKKyAgICAgICAgcmV0dXJuIFNjYWxhcml6ZVZlY3RvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTcGxpdFZlY3RvcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gaXNUeXBlTGVnYWwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgaXMgbGVnYWwgb24gdGhpcyB0YXJnZXQuCisgIGJvb2wgaXNUeXBlTGVnYWwoRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIChWYWx1ZVR5cGVBY3Rpb25zLmdldFR5cGVBY3Rpb24oKkRBRy5nZXRDb250ZXh0KCksIFZUKSA9PSAKKyAgICAgICAgICAgIFRhcmdldExvd2VyaW5nOjpMZWdhbCk7CisgIH0KKworICAvLy8gSWdub3JlTm9kZVJlc3VsdHMgLSBQcmV0ZW5kIGFsbCBvZiB0aGlzIG5vZGUncyByZXN1bHRzIGFyZSBsZWdhbC4KKyAgYm9vbCBJZ25vcmVOb2RlUmVzdWx0cyhTRE5vZGUgKk4pIGNvbnN0IHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRDb25zdGFudDsKKyAgfQorCisgIC8vLyBQcm9tb3RlZEludGVnZXJzIC0gRm9yIGludGVnZXIgbm9kZXMgdGhhdCBhcmUgYmVsb3cgbGVnYWwgd2lkdGgsIHRoaXMgbWFwCisgIC8vLyBpbmRpY2F0ZXMgd2hhdCBwcm9tb3RlZCB2YWx1ZSB0byB1c2UuCisgIERlbnNlTWFwPFNEVmFsdWUsIFNEVmFsdWU+IFByb21vdGVkSW50ZWdlcnM7CisKKyAgLy8vIEV4cGFuZGVkSW50ZWdlcnMgLSBGb3IgaW50ZWdlciBub2RlcyB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWQgdGhpcyBtYXAKKyAgLy8vIGluZGljYXRlcyB3aGljaCBvcGVyYW5kcyBhcmUgdGhlIGV4cGFuZGVkIHZlcnNpb24gb2YgdGhlIGlucHV0LgorICBEZW5zZU1hcDxTRFZhbHVlLCBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gPiBFeHBhbmRlZEludGVnZXJzOworCisgIC8vLyBTb2Z0ZW5lZEZsb2F0cyAtIEZvciBmbG9hdGluZyBwb2ludCBub2RlcyBjb252ZXJ0ZWQgdG8gaW50ZWdlcnMgb2YKKyAgLy8vIHRoZSBzYW1lIHNpemUsIHRoaXMgbWFwIGluZGljYXRlcyB0aGUgY29udmVydGVkIHZhbHVlIHRvIHVzZS4KKyAgRGVuc2VNYXA8U0RWYWx1ZSwgU0RWYWx1ZT4gU29mdGVuZWRGbG9hdHM7CisKKyAgLy8vIEV4cGFuZGVkRmxvYXRzIC0gRm9yIGZsb2F0IG5vZGVzIHRoYXQgbmVlZCB0byBiZSBleHBhbmRlZCB0aGlzIG1hcAorICAvLy8gaW5kaWNhdGVzIHdoaWNoIG9wZXJhbmRzIGFyZSB0aGUgZXhwYW5kZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQuCisgIERlbnNlTWFwPFNEVmFsdWUsIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiA+IEV4cGFuZGVkRmxvYXRzOworCisgIC8vLyBTY2FsYXJpemVkVmVjdG9ycyAtIEZvciBub2RlcyB0aGF0IGFyZSA8MSB4IHR5PiwgdGhpcyBtYXAgaW5kaWNhdGVzIHRoZQorICAvLy8gc2NhbGFyIHZhbHVlIG9mIHR5cGUgJ3R5JyB0byB1c2UuCisgIERlbnNlTWFwPFNEVmFsdWUsIFNEVmFsdWU+IFNjYWxhcml6ZWRWZWN0b3JzOworCisgIC8vLyBTcGxpdFZlY3RvcnMgLSBGb3Igbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHNwbGl0IHRoaXMgbWFwIGluZGljYXRlcworICAvLy8gd2hpY2ggb3BlcmFuZHMgYXJlIHRoZSBleHBhbmRlZCB2ZXJzaW9uIG9mIHRoZSBpbnB1dC4KKyAgRGVuc2VNYXA8U0RWYWx1ZSwgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+ID4gU3BsaXRWZWN0b3JzOworCisgIC8vLyBXaWRlbmVkVmVjdG9ycyAtIEZvciB2ZWN0b3Igbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHdpZGVuZWQsIGluZGljYXRlcworICAvLy8gdGhlIHdpZGVuZWQgdmFsdWUgdG8gdXNlLgorICBEZW5zZU1hcDxTRFZhbHVlLCBTRFZhbHVlPiBXaWRlbmVkVmVjdG9yczsKKworICAvLy8gUmVwbGFjZWRWYWx1ZXMgLSBGb3IgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggYW5vdGhlciwKKyAgLy8vIGluZGljYXRlcyB0aGUgcmVwbGFjZW1lbnQgdmFsdWUgdG8gdXNlLgorICBEZW5zZU1hcDxTRFZhbHVlLCBTRFZhbHVlPiBSZXBsYWNlZFZhbHVlczsKKworICAvLy8gV29ya2xpc3QgLSBUaGlzIGRlZmluZXMgYSB3b3JrbGlzdCBvZiBub2RlcyB0byBwcm9jZXNzLiAgSW4gb3JkZXIgdG8gYmUKKyAgLy8vIHB1c2hlZCBvbnRvIHRoaXMgd29ya2xpc3QsIGFsbCBvcGVyYW5kcyBvZiBhIG5vZGUgbXVzdCBoYXZlIGFscmVhZHkgYmVlbgorICAvLy8gcHJvY2Vzc2VkLgorICBTbWFsbFZlY3RvcjxTRE5vZGUqLCAxMjg+IFdvcmtsaXN0OworCitwdWJsaWM6CisgIGV4cGxpY2l0IERBR1R5cGVMZWdhbGl6ZXIoU2VsZWN0aW9uREFHICZkYWcpCisgICAgOiBUTEkoZGFnLmdldFRhcmdldExvd2VyaW5nSW5mbygpKSwgREFHKGRhZyksCisgICAgVmFsdWVUeXBlQWN0aW9ucyhUTEkuZ2V0VmFsdWVUeXBlQWN0aW9ucygpKSB7CisgICAgYXNzZXJ0KE1WVDo6TEFTVF9WQUxVRVRZUEUgPD0gTVZUOjpNQVhfQUxMT1dFRF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgIlRvbyBtYW55IHZhbHVlIHR5cGVzIGZvciBWYWx1ZVR5cGVBY3Rpb25zIHRvIGhvbGQhIik7CisgIH0KKworICAvLy8gcnVuIC0gVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHR5cGUgbGVnYWxpemVyLiAgVGhpcyBkb2VzIGEKKyAgLy8vIHRvcC1kb3duIHRyYXZlcnNhbCBvZiB0aGUgZGFnLCBsZWdhbGl6aW5nIHR5cGVzIGFzIGl0IGdvZXMuICBSZXR1cm5zCisgIC8vLyAidHJ1ZSIgaWYgaXQgbWFkZSBhbnkgY2hhbmdlcy4KKyAgYm9vbCBydW4oKTsKKworICB2b2lkIE5vdGVEZWxldGlvbihTRE5vZGUgKk9sZCwgU0ROb2RlICpOZXcpIHsKKyAgICBFeHB1bmdlTm9kZShPbGQpOworICAgIEV4cHVuZ2VOb2RlKE5ldyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9sZC0+Z2V0TnVtVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgUmVwbGFjZWRWYWx1ZXNbU0RWYWx1ZShPbGQsIGkpXSA9IFNEVmFsdWUoTmV3LCBpKTsKKyAgfQorCitwcml2YXRlOgorICBTRE5vZGUgKkFuYWx5emVOZXdOb2RlKFNETm9kZSAqTik7CisgIHZvaWQgQW5hbHl6ZU5ld1ZhbHVlKFNEVmFsdWUgJlZhbCk7CisgIHZvaWQgRXhwdW5nZU5vZGUoU0ROb2RlICpOKTsKKyAgdm9pZCBQZXJmb3JtRXhwZW5zaXZlQ2hlY2tzKCk7CisgIHZvaWQgUmVtYXBWYWx1ZShTRFZhbHVlICZOKTsKKworICAvLyBDb21tb24gcm91dGluZXMuCisgIFNEVmFsdWUgQml0Q29udmVydFRvSW50ZWdlcihTRFZhbHVlIE9wKTsKKyAgU0RWYWx1ZSBCaXRDb252ZXJ0VmVjdG9yVG9JbnRlZ2VyVmVjdG9yKFNEVmFsdWUgT3ApOworICBTRFZhbHVlIENyZWF0ZVN0YWNrU3RvcmVMb2FkKFNEVmFsdWUgT3AsIEVWVCBEZXN0VlQpOworICBib29sIEN1c3RvbUxvd2VyTm9kZShTRE5vZGUgKk4sIEVWVCBWVCwgYm9vbCBMZWdhbGl6ZVJlc3VsdCk7CisgIGJvb2wgQ3VzdG9tV2lkZW5Mb3dlck5vZGUoU0ROb2RlICpOLCBFVlQgVlQpOworICBTRFZhbHVlIEdldFZlY3RvckVsZW1lbnRQb2ludGVyKFNEVmFsdWUgVmVjUHRyLCBFVlQgRWx0VlQsIFNEVmFsdWUgSW5kZXgpOworICBTRFZhbHVlIEpvaW5JbnRlZ2VycyhTRFZhbHVlIExvLCBTRFZhbHVlIEhpKTsKKyAgU0RWYWx1ZSBMaWJDYWxsaWZ5KFJUTElCOjpMaWJjYWxsIExDLCBTRE5vZGUgKk4sIGJvb2wgaXNTaWduZWQpOworICBTRFZhbHVlIE1ha2VMaWJDYWxsKFJUTElCOjpMaWJjYWxsIExDLCBFVlQgUmV0VlQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsIGJvb2wgaXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpOworICBTRFZhbHVlIFByb21vdGVUYXJnZXRCb29sZWFuKFNEVmFsdWUgQm9vbCwgRVZUIFZUKTsKKyAgdm9pZCBSZXBsYWNlVmFsdWVXaXRoKFNEVmFsdWUgRnJvbSwgU0RWYWx1ZSBUbyk7CisgIHZvaWQgU3BsaXRJbnRlZ2VyKFNEVmFsdWUgT3AsIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgU3BsaXRJbnRlZ2VyKFNEVmFsdWUgT3AsIEVWVCBMb1ZULCBFVlQgSGlWVCwKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW50ZWdlciBQcm9tb3Rpb24gU3VwcG9ydDogTGVnYWxpemVJbnRlZ2VyVHlwZXMuY3BwCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBHZXRQcm9tb3RlZEludGVnZXIgLSBHaXZlbiBhIHByb2Nlc3NlZCBvcGVyYW5kIE9wIHdoaWNoIHdhcyBwcm9tb3RlZCB0byBhCisgIC8vLyBsYXJnZXIgaW50ZWdlciB0eXBlLCB0aGlzIHJldHVybnMgdGhlIHByb21vdGVkIHZhbHVlLiAgVGhlIGxvdyBiaXRzIG9mIHRoZQorICAvLy8gcHJvbW90ZWQgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgb3JpZ2luYWwgdHlwZSBhcmUgZXhhY3RseSBlcXVhbCB0byBPcC4KKyAgLy8vIFRoZSBleHRyYSBiaXRzIGNvbnRhaW4gcnViYmlzaCwgc28gdGhlIHByb21vdGVkIHZhbHVlIG1heSBuZWVkIHRvIGJlIHplcm8tCisgIC8vLyBvciBzaWduLWV4dGVuZGVkIGZyb20gdGhlIG9yaWdpbmFsIHR5cGUgYmVmb3JlIGl0IGlzIHVzYWJsZSAodGhlIGhlbHBlcnMKKyAgLy8vIFNFeHRQcm9tb3RlZEludGVnZXIgYW5kIFpFeHRQcm9tb3RlZEludGVnZXIgY2FuIGRvIHRoaXMgZm9yIHlvdSkuCisgIC8vLyBGb3IgZXhhbXBsZSwgaWYgT3AgaXMgYW4gaTE2IGFuZCB3YXMgcHJvbW90ZWQgdG8gYW4gaTMyLCB0aGVuIHRoaXMgbWV0aG9kCisgIC8vLyByZXR1cm5zIGFuIGkzMiwgdGhlIGxvd2VyIDE2IGJpdHMgb2Ygd2hpY2ggY29pbmNpZGUgd2l0aCBPcCwgYW5kIHRoZSB1cHBlcgorICAvLy8gMTYgYml0cyBvZiB3aGljaCBjb250YWluIHJ1YmJpc2guCisgIFNEVmFsdWUgR2V0UHJvbW90ZWRJbnRlZ2VyKFNEVmFsdWUgT3ApIHsKKyAgICBTRFZhbHVlICZQcm9tb3RlZE9wID0gUHJvbW90ZWRJbnRlZ2Vyc1tPcF07CisgICAgUmVtYXBWYWx1ZShQcm9tb3RlZE9wKTsKKyAgICBhc3NlcnQoUHJvbW90ZWRPcC5nZXROb2RlKCkgJiYgIk9wZXJhbmQgd2Fzbid0IHByb21vdGVkPyIpOworICAgIHJldHVybiBQcm9tb3RlZE9wOworICB9CisgIHZvaWQgU2V0UHJvbW90ZWRJbnRlZ2VyKFNEVmFsdWUgT3AsIFNEVmFsdWUgUmVzdWx0KTsKKworICAvLy8gU0V4dFByb21vdGVkSW50ZWdlciAtIEdldCBhIHByb21vdGVkIG9wZXJhbmQgYW5kIHNpZ24gZXh0ZW5kIGl0IHRvIHRoZQorICAvLy8gZmluYWwgc2l6ZS4KKyAgU0RWYWx1ZSBTRXh0UHJvbW90ZWRJbnRlZ2VyKFNEVmFsdWUgT3ApIHsKKyAgICBFVlQgT2xkVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgICAgT3AgPSBHZXRQcm9tb3RlZEludGVnZXIoT3ApOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBkbCwgT3AuZ2V0VmFsdWVUeXBlKCksIE9wLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKE9sZFZUKSk7CisgIH0KKworICAvLy8gWkV4dFByb21vdGVkSW50ZWdlciAtIEdldCBhIHByb21vdGVkIG9wZXJhbmQgYW5kIHplcm8gZXh0ZW5kIGl0IHRvIHRoZQorICAvLy8gZmluYWwgc2l6ZS4KKyAgU0RWYWx1ZSBaRXh0UHJvbW90ZWRJbnRlZ2VyKFNEVmFsdWUgT3ApIHsKKyAgICBFVlQgT2xkVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgICAgT3AgPSBHZXRQcm9tb3RlZEludGVnZXIoT3ApOworICAgIHJldHVybiBEQUcuZ2V0WmVyb0V4dGVuZEluUmVnKE9wLCBkbCwgT2xkVlQpOworICB9CisKKyAgLy8gSW50ZWdlciBSZXN1bHQgUHJvbW90aW9uLgorICB2b2lkIFByb21vdGVJbnRlZ2VyUmVzdWx0KFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTm8pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfQXNzZXJ0U2V4dChTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfQXNzZXJ0WmV4dChTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfQXRvbWljMShBdG9taWNTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfQXRvbWljMihBdG9taWNTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfQklUX0NPTlZFUlQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX0JTV0FQKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19CVUlMRF9QQUlSKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19Db25zdGFudChTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfQ09OVkVSVF9STkRTQVQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX0NUTFooU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX0NUUE9QKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19DVFRaKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19FWFRSQUNUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX0ZQX1RPX1hJTlQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX0ZQMzJfVE9fRlAxNihTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfSU5UX0VYVEVORChTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfTE9BRChMb2FkU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX092ZXJmbG93KFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19TQUREU1VCTyhTRE5vZGUgKk4sIHVuc2lnbmVkIFJlc05vKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX1NESVYoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX1NFTEVDVChTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfU0VMRUNUX0NDKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19TRVRDQyhTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfU0hMKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19TaW1wbGVJbnRCaW5PcChTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfU0lHTl9FWFRFTkRfSU5SRUcoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX1NSQShTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfU1JMKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19UUlVOQ0FURShTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfVUFERFNVQk8oU0ROb2RlICpOLCB1bnNpZ25lZCBSZXNObyk7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19VRElWKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludFJlc19VTkRFRihTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRSZXNfVkFBUkcoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50UmVzX1hNVUxPKFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTm8pOworCisgIC8vIEludGVnZXIgT3BlcmFuZCBQcm9tb3Rpb24uCisgIGJvb2wgUHJvbW90ZUludGVnZXJPcGVyYW5kKFNETm9kZSAqTiwgdW5zaWduZWQgT3BlcmFuZE5vKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50T3BfQU5ZX0VYVEVORChTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRPcF9CSVRfQ09OVkVSVChTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRPcF9CVUlMRF9QQUlSKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludE9wX0JSX0NDKFNETm9kZSAqTiwgdW5zaWduZWQgT3BObyk7CisgIFNEVmFsdWUgUHJvbW90ZUludE9wX0JSQ09ORChTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pOworICBTRFZhbHVlIFByb21vdGVJbnRPcF9CVUlMRF9WRUNUT1IoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50T3BfQ09OVkVSVF9STkRTQVQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50T3BfSU5TRVJUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50T3BfTUVNQkFSUklFUihTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRPcF9TQ0FMQVJfVE9fVkVDVE9SKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludE9wX1NFTEVDVChTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pOworICBTRFZhbHVlIFByb21vdGVJbnRPcF9TRUxFQ1RfQ0MoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50T3BfU0VUQ0MoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50T3BfU2hpZnQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50T3BfU0lHTl9FWFRFTkQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50T3BfU0lOVF9UT19GUChTRE5vZGUgKk4pOworICBTRFZhbHVlIFByb21vdGVJbnRPcF9TVE9SRShTdG9yZVNETm9kZSAqTiwgdW5zaWduZWQgT3BObyk7CisgIFNEVmFsdWUgUHJvbW90ZUludE9wX1RSVU5DQVRFKFNETm9kZSAqTik7CisgIFNEVmFsdWUgUHJvbW90ZUludE9wX1VJTlRfVE9fRlAoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBQcm9tb3RlSW50T3BfWkVST19FWFRFTkQoU0ROb2RlICpOKTsKKworICB2b2lkIFByb21vdGVTZXRDQ09wZXJhbmRzKFNEVmFsdWUgJkxIUyxTRFZhbHVlICZSSFMsIElTRDo6Q29uZENvZGUgQ29kZSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEludGVnZXIgRXhwYW5zaW9uIFN1cHBvcnQ6IExlZ2FsaXplSW50ZWdlclR5cGVzLmNwcAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gR2V0RXhwYW5kZWRJbnRlZ2VyIC0gR2l2ZW4gYSBwcm9jZXNzZWQgb3BlcmFuZCBPcCB3aGljaCB3YXMgZXhwYW5kZWQgaW50bworICAvLy8gdHdvIGludGVnZXJzIG9mIGhhbGYgdGhlIHNpemUsIHRoaXMgcmV0dXJucyB0aGUgdHdvIGhhbHZlcy4gIFRoZSBsb3cgYml0cworICAvLy8gb2YgT3AgYXJlIGV4YWN0bHkgZXF1YWwgdG8gdGhlIGJpdHMgb2YgTG87IHRoZSBoaWdoIGJpdHMgZXhhY3RseSBlcXVhbCBIaS4KKyAgLy8vIEZvciBleGFtcGxlLCBpZiBPcCBpcyBhbiBpNjQgd2hpY2ggd2FzIGV4cGFuZGVkIGludG8gdHdvIGkzMidzLCB0aGVuIHRoaXMKKyAgLy8vIG1ldGhvZCByZXR1cm5zIHRoZSB0d28gaTMyJ3MsIHdpdGggTG8gYmVpbmcgZXF1YWwgdG8gdGhlIGxvd2VyIDMyIGJpdHMgb2YKKyAgLy8vIE9wLCBhbmQgSGkgYmVpbmcgZXF1YWwgdG8gdGhlIHVwcGVyIDMyIGJpdHMuCisgIHZvaWQgR2V0RXhwYW5kZWRJbnRlZ2VyKFNEVmFsdWUgT3AsIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgU2V0RXhwYW5kZWRJbnRlZ2VyKFNEVmFsdWUgT3AsIFNEVmFsdWUgTG8sIFNEVmFsdWUgSGkpOworCisgIC8vIEludGVnZXIgUmVzdWx0IEV4cGFuc2lvbi4KKyAgdm9pZCBFeHBhbmRJbnRlZ2VyUmVzdWx0KFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTm8pOworICB2b2lkIEV4cGFuZEludFJlc19BTllfRVhURU5EICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19Bc3NlcnRTZXh0ICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19Bc3NlcnRaZXh0ICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19Db25zdGFudCAgICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19DVExaICAgICAgICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19DVFBPUCAgICAgICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19DVFRaICAgICAgICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19MT0FEICAgICAgICAgIChMb2FkU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19TSUdOX0VYVEVORCAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19TSUdOX0VYVEVORF9JTlJFRyAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19UUlVOQ0FURSAgICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19aRVJPX0VYVEVORCAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19GUF9UT19TSU5UICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZEludFJlc19GUF9UT19VSU5UICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworCisgIHZvaWQgRXhwYW5kSW50UmVzX0xvZ2ljYWwgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX0FERFNVQiAgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX0FERFNVQkMgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX0FERFNVQkUgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX0JTV0FQICAgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX01VTCAgICAgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX1NESVYgICAgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX1NSRU0gICAgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX1VESVYgICAgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX1VSRU0gICAgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgRXhwYW5kSW50UmVzX1NoaWZ0ICAgICAgICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisKKyAgdm9pZCBFeHBhbmRJbnRSZXNfU0FERFNVQk8gICAgICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRJbnRSZXNfVUFERFNVQk8gICAgICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKworICB2b2lkIEV4cGFuZFNoaWZ0QnlDb25zdGFudChTRE5vZGUgKk4sIHVuc2lnbmVkIEFtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgYm9vbCBFeHBhbmRTaGlmdFdpdGhLbm93bkFtb3VudEJpdChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIGJvb2wgRXhwYW5kU2hpZnRXaXRoVW5rbm93bkFtb3VudEJpdChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisKKyAgLy8gSW50ZWdlciBPcGVyYW5kIEV4cGFuc2lvbi4KKyAgYm9vbCBFeHBhbmRJbnRlZ2VyT3BlcmFuZChTRE5vZGUgKk4sIHVuc2lnbmVkIE9wZXJhbmRObyk7CisgIFNEVmFsdWUgRXhwYW5kSW50T3BfQklUX0NPTlZFUlQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBFeHBhbmRJbnRPcF9CUl9DQyhTRE5vZGUgKk4pOworICBTRFZhbHVlIEV4cGFuZEludE9wX0JVSUxEX1ZFQ1RPUihTRE5vZGUgKk4pOworICBTRFZhbHVlIEV4cGFuZEludE9wX0VYVFJBQ1RfRUxFTUVOVChTRE5vZGUgKk4pOworICBTRFZhbHVlIEV4cGFuZEludE9wX1NFTEVDVF9DQyhTRE5vZGUgKk4pOworICBTRFZhbHVlIEV4cGFuZEludE9wX1NFVENDKFNETm9kZSAqTik7CisgIFNEVmFsdWUgRXhwYW5kSW50T3BfU2hpZnQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBFeHBhbmRJbnRPcF9TSU5UX1RPX0ZQKFNETm9kZSAqTik7CisgIFNEVmFsdWUgRXhwYW5kSW50T3BfU1RPUkUoU3RvcmVTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pOworICBTRFZhbHVlIEV4cGFuZEludE9wX1RSVU5DQVRFKFNETm9kZSAqTik7CisgIFNEVmFsdWUgRXhwYW5kSW50T3BfVUlOVF9UT19GUChTRE5vZGUgKk4pOworICBTRFZhbHVlIEV4cGFuZEludE9wX1JFVFVSTkFERFIoU0ROb2RlICpOKTsKKworICB2b2lkIEludGVnZXJFeHBhbmRTZXRDQ09wZXJhbmRzKFNEVmFsdWUgJk5ld0xIUywgU0RWYWx1ZSAmTmV3UkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Q29uZENvZGUgJkNDQ29kZSwgRGVidWdMb2MgZGwpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGbG9hdCB0byBJbnRlZ2VyIENvbnZlcnNpb24gU3VwcG9ydDogTGVnYWxpemVGbG9hdFR5cGVzLmNwcAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gR2V0U29mdGVuZWRGbG9hdCAtIEdpdmVuIGEgcHJvY2Vzc2VkIG9wZXJhbmQgT3Agd2hpY2ggd2FzIGNvbnZlcnRlZCB0byBhbgorICAvLy8gaW50ZWdlciBvZiB0aGUgc2FtZSBzaXplLCB0aGlzIHJldHVybnMgdGhlIGludGVnZXIuICBUaGUgaW50ZWdlciBjb250YWlucworICAvLy8gZXhhY3RseSB0aGUgc2FtZSBiaXRzIGFzIE9wIC0gb25seSB0aGUgdHlwZSBjaGFuZ2VkLiAgRm9yIGV4YW1wbGUsIGlmIE9wCisgIC8vLyBpcyBhbiBmMzIgd2hpY2ggd2FzIHNvZnRlbmVkIHRvIGFuIGkzMiwgdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGkzMiwKKyAgLy8vIHRoZSBiaXRzIG9mIHdoaWNoIGNvaW5jaWRlIHdpdGggdGhvc2Ugb2YgT3AuCisgIFNEVmFsdWUgR2V0U29mdGVuZWRGbG9hdChTRFZhbHVlIE9wKSB7CisgICAgU0RWYWx1ZSAmU29mdGVuZWRPcCA9IFNvZnRlbmVkRmxvYXRzW09wXTsKKyAgICBSZW1hcFZhbHVlKFNvZnRlbmVkT3ApOworICAgIGFzc2VydChTb2Z0ZW5lZE9wLmdldE5vZGUoKSAmJiAiT3BlcmFuZCB3YXNuJ3QgY29udmVydGVkIHRvIGludGVnZXI/Iik7CisgICAgcmV0dXJuIFNvZnRlbmVkT3A7CisgIH0KKyAgdm9pZCBTZXRTb2Z0ZW5lZEZsb2F0KFNEVmFsdWUgT3AsIFNEVmFsdWUgUmVzdWx0KTsKKworICAvLyBSZXN1bHQgRmxvYXQgdG8gSW50ZWdlciBDb252ZXJzaW9uLgorICB2b2lkIFNvZnRlbkZsb2F0UmVzdWx0KFNETm9kZSAqTiwgdW5zaWduZWQgT3BObyk7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfQklUX0NPTlZFUlQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19CVUlMRF9QQUlSKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfQ29uc3RhbnRGUChDb25zdGFudEZQU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19FWFRSQUNUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GQUJTKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfRkFERChTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0UmVzX0ZDRUlMKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfRkNPUFlTSUdOKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfRkNPUyhTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0UmVzX0ZESVYoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GRVhQKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfRkVYUDIoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GRkxPT1IoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GTE9HKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfRkxPRzIoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GTE9HMTAoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GTVVMKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfRk5FQVJCWUlOVChTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0UmVzX0ZORUcoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GUF9FWFRFTkQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GUDE2X1RPX0ZQMzIoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GUF9ST1VORChTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0UmVzX0ZQT1coU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GUE9XSShTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0UmVzX0ZSRU0oU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GUklOVChTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0UmVzX0ZTSU4oU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GU1FSVChTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0UmVzX0ZTVUIoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19GVFJVTkMoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19MT0FEKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfU0VMRUNUKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfU0VMRUNUX0NDKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRSZXNfVU5ERUYoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdFJlc19WQUFSRyhTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0UmVzX1hJTlRfVE9fRlAoU0ROb2RlICpOKTsKKworICAvLyBPcGVyYW5kIEZsb2F0IHRvIEludGVnZXIgQ29udmVyc2lvbi4KKyAgYm9vbCBTb2Z0ZW5GbG9hdE9wZXJhbmQoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdE9wX0JJVF9DT05WRVJUKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRPcF9CUl9DQyhTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0T3BfRlBfUk9VTkQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdE9wX0ZQX1RPX1NJTlQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdE9wX0ZQX1RPX1VJTlQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTb2Z0ZW5GbG9hdE9wX0ZQMzJfVE9fRlAxNihTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0T3BfU0VMRUNUX0NDKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU29mdGVuRmxvYXRPcF9TRVRDQyhTRE5vZGUgKk4pOworICBTRFZhbHVlIFNvZnRlbkZsb2F0T3BfU1RPUkUoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKTsKKworICB2b2lkIFNvZnRlblNldENDT3BlcmFuZHMoU0RWYWx1ZSAmTmV3TEhTLCBTRFZhbHVlICZOZXdSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkNvbmRDb2RlICZDQ0NvZGUsIERlYnVnTG9jIGRsKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRmxvYXQgRXhwYW5zaW9uIFN1cHBvcnQ6IExlZ2FsaXplRmxvYXRUeXBlcy5jcHAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIEdldEV4cGFuZGVkRmxvYXQgLSBHaXZlbiBhIHByb2Nlc3NlZCBvcGVyYW5kIE9wIHdoaWNoIHdhcyBleHBhbmRlZCBpbnRvCisgIC8vLyB0d28gZmxvYXRpbmcgcG9pbnQgdmFsdWVzIG9mIGhhbGYgdGhlIHNpemUsIHRoaXMgcmV0dXJucyB0aGUgdHdvIGhhbHZlcy4KKyAgLy8vIFRoZSBsb3cgYml0cyBvZiBPcCBhcmUgZXhhY3RseSBlcXVhbCB0byB0aGUgYml0cyBvZiBMbzsgdGhlIGhpZ2ggYml0cworICAvLy8gZXhhY3RseSBlcXVhbCBIaS4gIEZvciBleGFtcGxlLCBpZiBPcCBpcyBhIHBwY2YxMjggd2hpY2ggd2FzIGV4cGFuZGVkCisgIC8vLyBpbnRvIHR3byBmNjQncywgdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSB0d28gZjY0J3MsIHdpdGggTG8gYmVpbmcKKyAgLy8vIGVxdWFsIHRvIHRoZSBsb3dlciA2NCBiaXRzIG9mIE9wLCBhbmQgSGkgdG8gdGhlIHVwcGVyIDY0IGJpdHMuCisgIHZvaWQgR2V0RXhwYW5kZWRGbG9hdChTRFZhbHVlIE9wLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIFNldEV4cGFuZGVkRmxvYXQoU0RWYWx1ZSBPcCwgU0RWYWx1ZSBMbywgU0RWYWx1ZSBIaSk7CisKKyAgLy8gRmxvYXQgUmVzdWx0IEV4cGFuc2lvbi4KKyAgdm9pZCBFeHBhbmRGbG9hdFJlc3VsdChTRE5vZGUgKk4sIHVuc2lnbmVkIFJlc05vKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19Db25zdGFudEZQKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GQUJTICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GQUREICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GQ0VJTCAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GQ09QWVNJR04gKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GQ09TICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GRElWICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GRVhQICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GRVhQMiAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GRkxPT1IgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GTE9HICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GTE9HMiAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GTE9HMTAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GTVVMICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GTkVBUkJZSU5UKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GTkVHICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GUF9FWFRFTkQgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GUE9XICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GUE9XSSAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GUklOVCAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GU0lOICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GU1FSVCAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GU1VCICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19GVFJVTkMgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19MT0FEICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBFeHBhbmRGbG9hdFJlc19YSU5UX1RPX0ZQKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKworICAvLyBGbG9hdCBPcGVyYW5kIEV4cGFuc2lvbi4KKyAgYm9vbCBFeHBhbmRGbG9hdE9wZXJhbmQoU0ROb2RlICpOLCB1bnNpZ25lZCBPcGVyYW5kTm8pOworICBTRFZhbHVlIEV4cGFuZEZsb2F0T3BfQlJfQ0MoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBFeHBhbmRGbG9hdE9wX0ZQX1JPVU5EKFNETm9kZSAqTik7CisgIFNEVmFsdWUgRXhwYW5kRmxvYXRPcF9GUF9UT19TSU5UKFNETm9kZSAqTik7CisgIFNEVmFsdWUgRXhwYW5kRmxvYXRPcF9GUF9UT19VSU5UKFNETm9kZSAqTik7CisgIFNEVmFsdWUgRXhwYW5kRmxvYXRPcF9TRUxFQ1RfQ0MoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBFeHBhbmRGbG9hdE9wX1NFVENDKFNETm9kZSAqTik7CisgIFNEVmFsdWUgRXhwYW5kRmxvYXRPcF9TVE9SRShTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pOworCisgIHZvaWQgRmxvYXRFeHBhbmRTZXRDQ09wZXJhbmRzKFNEVmFsdWUgJk5ld0xIUywgU0RWYWx1ZSAmTmV3UkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkNvbmRDb2RlICZDQ0NvZGUsIERlYnVnTG9jIGRsKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU2NhbGFyaXphdGlvbiBTdXBwb3J0OiBMZWdhbGl6ZVZlY3RvclR5cGVzLmNwcAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gR2V0U2NhbGFyaXplZFZlY3RvciAtIEdpdmVuIGEgcHJvY2Vzc2VkIG9uZS1lbGVtZW50IHZlY3RvciBPcCB3aGljaCB3YXMKKyAgLy8vIHNjYWxhcml6ZWQgdG8gaXRzIGVsZW1lbnQgdHlwZSwgdGhpcyByZXR1cm5zIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsCisgIC8vLyBpZiBPcCBpcyBhIHYxaTMyLCBPcCA9IDwgaTMyIHZhbCA+LCB0aGlzIG1ldGhvZCByZXR1cm5zIHZhbCwgYW4gaTMyLgorICBTRFZhbHVlIEdldFNjYWxhcml6ZWRWZWN0b3IoU0RWYWx1ZSBPcCkgeworICAgIFNEVmFsdWUgJlNjYWxhcml6ZWRPcCA9IFNjYWxhcml6ZWRWZWN0b3JzW09wXTsKKyAgICBSZW1hcFZhbHVlKFNjYWxhcml6ZWRPcCk7CisgICAgYXNzZXJ0KFNjYWxhcml6ZWRPcC5nZXROb2RlKCkgJiYgIk9wZXJhbmQgd2Fzbid0IHNjYWxhcml6ZWQ/Iik7CisgICAgcmV0dXJuIFNjYWxhcml6ZWRPcDsKKyAgfQorICB2b2lkIFNldFNjYWxhcml6ZWRWZWN0b3IoU0RWYWx1ZSBPcCwgU0RWYWx1ZSBSZXN1bHQpOworCisgIC8vIFZlY3RvciBSZXN1bHQgU2NhbGFyaXphdGlvbjogPDEgeCB0eT4gLT4gdHkuCisgIHZvaWQgU2NhbGFyaXplVmVjdG9yUmVzdWx0KFNETm9kZSAqTiwgdW5zaWduZWQgT3BObyk7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX0Jpbk9wKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX1VuYXJ5T3AoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTY2FsYXJpemVWZWNSZXNfSW5yZWdPcChTRE5vZGUgKk4pOworCisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX0JJVF9DT05WRVJUKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX0NPTlZFUlRfUk5EU0FUKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX0VYVFJBQ1RfU1VCVkVDVE9SKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX0ZQT1dJKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX0lOU0VSVF9WRUNUT1JfRUxUKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX0xPQUQoTG9hZFNETm9kZSAqTik7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX1NDQUxBUl9UT19WRUNUT1IoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTY2FsYXJpemVWZWNSZXNfU0lHTl9FWFRFTkRfSU5SRUcoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTY2FsYXJpemVWZWNSZXNfU0VMRUNUKFNETm9kZSAqTik7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjUmVzX1NFTEVDVF9DQyhTRE5vZGUgKk4pOworICBTRFZhbHVlIFNjYWxhcml6ZVZlY1Jlc19TRVRDQyhTRE5vZGUgKk4pOworICBTRFZhbHVlIFNjYWxhcml6ZVZlY1Jlc19VTkRFRihTRE5vZGUgKk4pOworICBTRFZhbHVlIFNjYWxhcml6ZVZlY1Jlc19WRUNUT1JfU0hVRkZMRShTRE5vZGUgKk4pOworICBTRFZhbHVlIFNjYWxhcml6ZVZlY1Jlc19WU0VUQ0MoU0ROb2RlICpOKTsKKworICAvLyBWZWN0b3IgT3BlcmFuZCBTY2FsYXJpemF0aW9uOiA8MSB4IHR5PiAtPiB0eS4KKyAgYm9vbCBTY2FsYXJpemVWZWN0b3JPcGVyYW5kKFNETm9kZSAqTiwgdW5zaWduZWQgT3BObyk7CisgIFNEVmFsdWUgU2NhbGFyaXplVmVjT3BfQklUX0NPTlZFUlQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTY2FsYXJpemVWZWNPcF9DT05DQVRfVkVDVE9SUyhTRE5vZGUgKk4pOworICBTRFZhbHVlIFNjYWxhcml6ZVZlY09wX0VYVFJBQ1RfVkVDVE9SX0VMVChTRE5vZGUgKk4pOworICBTRFZhbHVlIFNjYWxhcml6ZVZlY09wX1NUT1JFKFN0b3JlU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVmVjdG9yIFNwbGl0dGluZyBTdXBwb3J0OiBMZWdhbGl6ZVZlY3RvclR5cGVzLmNwcAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gR2V0U3BsaXRWZWN0b3IgLSBHaXZlbiBhIHByb2Nlc3NlZCB2ZWN0b3IgT3Agd2hpY2ggd2FzIHNwbGl0IGludG8gdmVjdG9ycworICAvLy8gb2YgaGFsZiB0aGUgc2l6ZSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaGFsdmVzLiAgVGhlIGZpcnN0IGVsZW1lbnRzIG9mCisgIC8vLyBPcCBjb2luY2lkZSB3aXRoIHRoZSBlbGVtZW50cyBvZiBMbzsgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBvZiBPcCBjb2luY2lkZQorICAvLy8gd2l0aCB0aGUgZWxlbWVudHMgb2YgSGk6IE9wIGlzIHdoYXQgeW91IHdvdWxkIGdldCBieSBjb25jYXRlbmF0aW5nIExvIGFuZAorICAvLy8gSGkuICBGb3IgZXhhbXBsZSwgaWYgT3AgaXMgYSB2OGkzMiB0aGF0IHdhcyBzcGxpdCBpbnRvIHR3byB2NGkzMidzLCB0aGVuCisgIC8vLyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSB0d28gdjRpMzIncywgd2l0aCBMbyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCA0CisgIC8vLyBlbGVtZW50cyBvZiBPcCwgYW5kIEhpIHRvIHRoZSBsYXN0IDQgZWxlbWVudHMuCisgIHZvaWQgR2V0U3BsaXRWZWN0b3IoU0RWYWx1ZSBPcCwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBTZXRTcGxpdFZlY3RvcihTRFZhbHVlIE9wLCBTRFZhbHVlIExvLCBTRFZhbHVlIEhpKTsKKworICAvLyBWZWN0b3IgUmVzdWx0IFNwbGl0dGluZzogPDEyOCB4IHR5PiAtPiAyIHggPDY0IHggdHk+LgorICB2b2lkIFNwbGl0VmVjdG9yUmVzdWx0KFNETm9kZSAqTiwgdW5zaWduZWQgT3BObyk7CisgIHZvaWQgU3BsaXRWZWNSZXNfQmluT3AoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIFNwbGl0VmVjUmVzX1VuYXJ5T3AoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIFNwbGl0VmVjUmVzX0lucmVnT3AoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworCisgIHZvaWQgU3BsaXRWZWNSZXNfQklUX0NPTlZFUlQoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIFNwbGl0VmVjUmVzX0JVSUxEX1BBSVIoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIFNwbGl0VmVjUmVzX0JVSUxEX1ZFQ1RPUihTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgU3BsaXRWZWNSZXNfQ09OQ0FUX1ZFQ1RPUlMoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIFNwbGl0VmVjUmVzX0NPTlZFUlRfUk5EU0FUKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBTcGxpdFZlY1Jlc19FWFRSQUNUX1NVQlZFQ1RPUihTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgU3BsaXRWZWNSZXNfRlBPV0koU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIFNwbGl0VmVjUmVzX0lOU0VSVF9WRUNUT1JfRUxUKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBTcGxpdFZlY1Jlc19MT0FEKExvYWRTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgU3BsaXRWZWNSZXNfU0NBTEFSX1RPX1ZFQ1RPUihTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgU3BsaXRWZWNSZXNfU0lHTl9FWFRFTkRfSU5SRUcoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIFNwbGl0VmVjUmVzX1NFVENDKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBTcGxpdFZlY1Jlc19VTkRFRihTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgU3BsaXRWZWNSZXNfVkVDVE9SX1NIVUZGTEUoU2h1ZmZsZVZlY3RvclNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpOworCisgIC8vIFZlY3RvciBPcGVyYW5kIFNwbGl0dGluZzogPDEyOCB4IHR5PiAtPiAyIHggPDY0IHggdHk+LgorICBib29sIFNwbGl0VmVjdG9yT3BlcmFuZChTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pOworICBTRFZhbHVlIFNwbGl0VmVjT3BfVW5hcnlPcChTRE5vZGUgKk4pOworCisgIFNEVmFsdWUgU3BsaXRWZWNPcF9CSVRfQ09OVkVSVChTRE5vZGUgKk4pOworICBTRFZhbHVlIFNwbGl0VmVjT3BfRVhUUkFDVF9TVUJWRUNUT1IoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBTcGxpdFZlY09wX0VYVFJBQ1RfVkVDVE9SX0VMVChTRE5vZGUgKk4pOworICBTRFZhbHVlIFNwbGl0VmVjT3BfU1RPUkUoU3RvcmVTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBWZWN0b3IgV2lkZW5pbmcgU3VwcG9ydDogTGVnYWxpemVWZWN0b3JUeXBlcy5jcHAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIEdldFdpZGVuZWRWZWN0b3IgLSBHaXZlbiBhIHByb2Nlc3NlZCB2ZWN0b3IgT3Agd2hpY2ggd2FzIHdpZGVuZWQgaW50byBhCisgIC8vLyBsYXJnZXIgdmVjdG9yLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsYXJnZXIgdmVjdG9yLiAgVGhlIGVsZW1lbnRzIG9mCisgIC8vLyB0aGUgcmV0dXJuZWQgdmVjdG9yIGNvbnNpc3Qgb2YgdGhlIGVsZW1lbnRzIG9mIE9wIGZvbGxvd2VkIGJ5IGVsZW1lbnRzCisgIC8vLyBjb250YWluaW5nIHJ1YmJpc2guICBGb3IgZXhhbXBsZSwgaWYgT3AgaXMgYSB2MmkzMiB0aGF0IHdhcyB3aWRlbmVkIHRvIGEKKyAgLy8vIHY0aTMyLCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgYSB2NGkzMiBmb3Igd2hpY2ggdGhlIGZpcnN0IHR3byBlbGVtZW50cworICAvLy8gYXJlIHRoZSBzYW1lIGFzIHRob3NlIG9mIE9wLCB3aGlsZSB0aGUgbGFzdCB0d28gZWxlbWVudHMgY29udGFpbiBydWJiaXNoLgorICBTRFZhbHVlIEdldFdpZGVuZWRWZWN0b3IoU0RWYWx1ZSBPcCkgeworICAgIFNEVmFsdWUgJldpZGVuZWRPcCA9IFdpZGVuZWRWZWN0b3JzW09wXTsKKyAgICBSZW1hcFZhbHVlKFdpZGVuZWRPcCk7CisgICAgYXNzZXJ0KFdpZGVuZWRPcC5nZXROb2RlKCkgJiYgIk9wZXJhbmQgd2Fzbid0IHdpZGVuZWQ/Iik7CisgICAgcmV0dXJuIFdpZGVuZWRPcDsKKyAgfQorICB2b2lkIFNldFdpZGVuZWRWZWN0b3IoU0RWYWx1ZSBPcCwgU0RWYWx1ZSBSZXN1bHQpOworCisgIC8vIFdpZGVuIFZlY3RvciBSZXN1bHQgUHJvbW90aW9uLgorICB2b2lkIFdpZGVuVmVjdG9yUmVzdWx0KFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTm8pOworICBTRFZhbHVlIFdpZGVuVmVjUmVzX0JJVF9DT05WRVJUKFNETm9kZSogTik7CisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfQlVJTERfVkVDVE9SKFNETm9kZSogTik7CisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfQ09OQ0FUX1ZFQ1RPUlMoU0ROb2RlKiBOKTsKKyAgU0RWYWx1ZSBXaWRlblZlY1Jlc19DT05WRVJUX1JORFNBVChTRE5vZGUqIE4pOworICBTRFZhbHVlIFdpZGVuVmVjUmVzX0VYVFJBQ1RfU1VCVkVDVE9SKFNETm9kZSogTik7CisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfSU5TRVJUX1ZFQ1RPUl9FTFQoU0ROb2RlKiBOKTsKKyAgU0RWYWx1ZSBXaWRlblZlY1Jlc19MT0FEKFNETm9kZSogTik7CisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfU0NBTEFSX1RPX1ZFQ1RPUihTRE5vZGUqIE4pOworICBTRFZhbHVlIFdpZGVuVmVjUmVzX1NJR05fRVhURU5EX0lOUkVHKFNETm9kZSogTik7CisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfU0VMRUNUKFNETm9kZSogTik7CisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfU0VMRUNUX0NDKFNETm9kZSogTik7CisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfU0VUQ0MoU0ROb2RlKiBOKTsKKyAgU0RWYWx1ZSBXaWRlblZlY1Jlc19VTkRFRihTRE5vZGUgKk4pOworICBTRFZhbHVlIFdpZGVuVmVjUmVzX1ZFQ1RPUl9TSFVGRkxFKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pOworICBTRFZhbHVlIFdpZGVuVmVjUmVzX1ZTRVRDQyhTRE5vZGUqIE4pOworCisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfQmluYXJ5KFNETm9kZSAqTik7CisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfQ29udmVydChTRE5vZGUgKk4pOworICBTRFZhbHVlIFdpZGVuVmVjUmVzX1BPV0koU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBXaWRlblZlY1Jlc19TaGlmdChTRE5vZGUgKk4pOworICBTRFZhbHVlIFdpZGVuVmVjUmVzX1VuYXJ5KFNETm9kZSAqTik7CisgIFNEVmFsdWUgV2lkZW5WZWNSZXNfSW5yZWdPcChTRE5vZGUgKk4pOworCisgIC8vIFdpZGVuIFZlY3RvciBPcGVyYW5kLgorICBib29sIFdpZGVuVmVjdG9yT3BlcmFuZChTRE5vZGUgKk4sIHVuc2lnbmVkIFJlc05vKTsKKyAgU0RWYWx1ZSBXaWRlblZlY09wX0JJVF9DT05WRVJUKFNETm9kZSAqTik7CisgIFNEVmFsdWUgV2lkZW5WZWNPcF9DT05DQVRfVkVDVE9SUyhTRE5vZGUgKk4pOworICBTRFZhbHVlIFdpZGVuVmVjT3BfRVhUUkFDVF9WRUNUT1JfRUxUKFNETm9kZSAqTik7CisgIFNEVmFsdWUgV2lkZW5WZWNPcF9FWFRSQUNUX1NVQlZFQ1RPUihTRE5vZGUgKk4pOworICBTRFZhbHVlIFdpZGVuVmVjT3BfU1RPUkUoU0ROb2RlKiBOKTsKKworICBTRFZhbHVlIFdpZGVuVmVjT3BfQ29udmVydChTRE5vZGUgKk4pOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBWZWN0b3IgV2lkZW5pbmcgVXRpbGl0aWVzIFN1cHBvcnQ6IExlZ2FsaXplVmVjdG9yVHlwZXMuY3BwCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBIZWxwZXIgR2VuV2lkZW5WZWN0b3JMb2FkcyAtIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHNldCBvZgorICAvLy8gbG9hZHMgdG8gbG9hZCBhIHZlY3RvciB3aXRoIGEgcmVzdWx0aW5nIHdpZGVyIHR5cGUuIEl0IHRha2VzCisgIC8vLyAgIExkQ2hhaW46IGxpc3Qgb2YgY2hhaW5zIGZvciB0aGUgbG9hZCB0byBiZSBnZW5lcmF0ZWQuCisgIC8vLyAgIExkOiAgICAgIGxvYWQgdG8gd2lkZW4KKyAgU0RWYWx1ZSBHZW5XaWRlblZlY3RvckxvYWRzKFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiYgTGRDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRTRE5vZGUgKkxEKTsKKworICAvLy8gR2VuV2lkZW5WZWN0b3JFeHRMb2FkcyAtIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHNldCBvZiBleHRlbnNpb24KKyAgLy8vIGxvYWRzIHRvIGxvYWQgYSBlY3RvciB3aXRoIGEgcmVzdWx0aW5nIHdpZGVyIHR5cGUuICBJdCB0YWtlcworICAvLy8gICBMZENoYWluOiBsaXN0IG9mIGNoYWlucyBmb3IgdGhlIGxvYWQgdG8gYmUgZ2VuZXJhdGVkLgorICAvLy8gICBMZDogICAgICBsb2FkIHRvIHdpZGVuCisgIC8vLyAgIEV4dFR5cGU6IGV4dGVuc2lvbiBlbGVtZW50IHR5cGUKKyAgU0RWYWx1ZSBHZW5XaWRlblZlY3RvckV4dExvYWRzKFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiYgTGRDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRTRE5vZGUgKkxELCBJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUpOworCisgIC8vLyBIZWxwZXIgZ2VuV2lkZW5WZWN0b3JTdG9yZXMgLSBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBzZXQgb2YKKyAgLy8vIHN0b3JlcyB0byBzdG9yZSBhIHdpZGVuIHZlY3RvciBpbnRvIG5vbiB3aWRlbiBtZW1vcnkKKyAgLy8vICAgU3RDaGFpbjogbGlzdCBvZiBjaGFpbnMgZm9yIHRoZSBzdG9yZXMgd2UgaGF2ZSBnZW5lcmF0ZWQKKyAgLy8vICAgU1Q6ICAgICAgc3RvcmUgb2YgYSB3aWRlbiB2YWx1ZQorICB2b2lkIEdlbldpZGVuVmVjdG9yU3RvcmVzKFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiYgU3RDaGFpbiwgU3RvcmVTRE5vZGUgKlNUKTsKKworICAvLy8gSGVscGVyIGdlbldpZGVuVmVjdG9yVHJ1bmNTdG9yZXMgLSBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBzZXQgb2YKKyAgLy8vIHN0b3JlcyB0byBzdG9yZSBhIHRydW5jYXRlIHdpZGVuIHZlY3RvciBpbnRvIG5vbiB3aWRlbiBtZW1vcnkKKyAgLy8vICAgU3RDaGFpbjogbGlzdCBvZiBjaGFpbnMgZm9yIHRoZSBzdG9yZXMgd2UgaGF2ZSBnZW5lcmF0ZWQKKyAgLy8vICAgU1Q6ICAgICAgc3RvcmUgb2YgYSB3aWRlbiB2YWx1ZQorICB2b2lkIEdlbldpZGVuVmVjdG9yVHJ1bmNTdG9yZXMoU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+JiBTdENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVTRE5vZGUgKlNUKTsKKworICAvLy8gTW9kaWZpZXMgYSB2ZWN0b3IgaW5wdXQgKHdpZGVuIG9yIG5hcnJvd3MpIHRvIGEgdmVjdG9yIG9mIE5WVC4gIFRoZQorICAvLy8gaW5wdXQgdmVjdG9yIG11c3QgaGF2ZSB0aGUgc2FtZSBlbGVtZW50IHR5cGUgYXMgTlZULgorICBTRFZhbHVlIE1vZGlmeVRvVHlwZShTRFZhbHVlIEluT3AsIEVWVCBXaWRlblZUKTsKKworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBHZW5lcmljIFNwbGl0dGluZzogTGVnYWxpemVUeXBlc0dlbmVyaWMuY3BwCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vIExlZ2FsaXphdGlvbiBtZXRob2RzIHdoaWNoIG9ubHkgdXNlIHRoYXQgdGhlIGlsbGVnYWwgdHlwZSBpcyBzcGxpdCBpbnRvIHR3bworICAvLyBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsIHR5cGVzLiAgQXMgc3VjaCB0aGV5IGNhbiBiZSB1c2VkIGZvciBzcGxpdHRpbmcKKyAgLy8gdmVjdG9ycyBhbmQgZXhwYW5kaW5nIGludGVnZXJzIGFuZCBmbG9hdHMuCisKKyAgdm9pZCBHZXRTcGxpdE9wKFNEVmFsdWUgT3AsIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICAgIGlmIChPcC5nZXRWYWx1ZVR5cGUoKS5pc1ZlY3RvcigpKQorICAgICAgR2V0U3BsaXRWZWN0b3IoT3AsIExvLCBIaSk7CisgICAgZWxzZSBpZiAoT3AuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkpCisgICAgICBHZXRFeHBhbmRlZEludGVnZXIoT3AsIExvLCBIaSk7CisgICAgZWxzZQorICAgICAgR2V0RXhwYW5kZWRGbG9hdChPcCwgTG8sIEhpKTsKKyAgfQorCisgIC8vLyBHZXRTcGxpdERlc3RWVHMgLSBDb21wdXRlIHRoZSBWVHMgbmVlZGVkIGZvciB0aGUgbG93L2hpIHBhcnRzIG9mIGEgdHlwZQorICAvLy8gd2hpY2ggaXMgc3BsaXQgKG9yIGV4cGFuZGVkKSBpbnRvIHR3byBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsIHBpZWNlcy4KKyAgdm9pZCBHZXRTcGxpdERlc3RWVHMoRVZUIEluVlQsIEVWVCAmTG9WVCwgRVZUICZIaVZUKTsKKworICAvLy8gR2V0UGFpckVsZW1lbnRzIC0gVXNlIElTRDo6RVhUUkFDVF9FTEVNRU5UIG5vZGVzIHRvIGV4dHJhY3QgdGhlIGxvdyBhbmQKKyAgLy8vIGhpZ2ggcGFydHMgb2YgdGhlIGdpdmVuIHZhbHVlLgorICB2b2lkIEdldFBhaXJFbGVtZW50cyhTRFZhbHVlIFBhaXIsIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisKKyAgLy8gR2VuZXJpYyBSZXN1bHQgU3BsaXR0aW5nLgorICB2b2lkIFNwbGl0UmVzX01FUkdFX1ZBTFVFUyhTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisgIHZvaWQgU3BsaXRSZXNfU0VMRUNUICAgICAgKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKTsKKyAgdm9pZCBTcGxpdFJlc19TRUxFQ1RfQ0MgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIFNwbGl0UmVzX1VOREVGICAgICAgIChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEdlbmVyaWMgRXhwYW5zaW9uOiBMZWdhbGl6ZVR5cGVzR2VuZXJpYy5jcHAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8gTGVnYWxpemF0aW9uIG1ldGhvZHMgd2hpY2ggb25seSB1c2UgdGhhdCB0aGUgaWxsZWdhbCB0eXBlIGlzIHNwbGl0IGludG8gdHdvCisgIC8vIGlkZW50aWNhbCB0eXBlcyBvZiBoYWxmIHRoZSBzaXplLCBhbmQgdGhhdCB0aGUgTG8vSGkgcGFydCBpcyBzdG9yZWQgZmlyc3QKKyAgLy8gaW4gbWVtb3J5IG9uIGxpdHRsZS9iaWctZW5kaWFuIG1hY2hpbmVzLCBmb2xsb3dlZCBieSB0aGUgSGkvTG8gcGFydC4gIEFzCisgIC8vIHN1Y2ggdGhleSBjYW4gYmUgdXNlZCBmb3IgZXhwYW5kaW5nIGludGVnZXJzIGFuZCBmbG9hdHMuCisKKyAgdm9pZCBHZXRFeHBhbmRlZE9wKFNEVmFsdWUgT3AsIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICAgIGlmIChPcC5nZXRWYWx1ZVR5cGUoKS5pc0ludGVnZXIoKSkKKyAgICAgIEdldEV4cGFuZGVkSW50ZWdlcihPcCwgTG8sIEhpKTsKKyAgICBlbHNlCisgICAgICBHZXRFeHBhbmRlZEZsb2F0KE9wLCBMbywgSGkpOworICB9CisKKyAgLy8gR2VuZXJpYyBSZXN1bHQgRXhwYW5zaW9uLgorICB2b2lkIEV4cGFuZFJlc19CSVRfQ09OVkVSVCAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZFJlc19CVUlMRF9QQUlSICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZFJlc19FWFRSQUNUX0VMRU1FTlQgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZFJlc19FWFRSQUNUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZFJlc19Ob3JtYWxMb2FkICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworICB2b2lkIEV4cGFuZFJlc19WQUFSRyAgICAgICAgICAgICAoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpOworCisgIC8vIEdlbmVyaWMgT3BlcmFuZCBFeHBhbnNpb24uCisgIFNEVmFsdWUgRXhwYW5kT3BfQklUX0NPTlZFUlQgICAgICAoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBFeHBhbmRPcF9CVUlMRF9WRUNUT1IgICAgIChTRE5vZGUgKk4pOworICBTRFZhbHVlIEV4cGFuZE9wX0VYVFJBQ1RfRUxFTUVOVCAgKFNETm9kZSAqTik7CisgIFNEVmFsdWUgRXhwYW5kT3BfSU5TRVJUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOKTsKKyAgU0RWYWx1ZSBFeHBhbmRPcF9TQ0FMQVJfVE9fVkVDVE9SIChTRE5vZGUgKk4pOworICBTRFZhbHVlIEV4cGFuZE9wX05vcm1hbFN0b3JlICAgICAgKFNETm9kZSAqTiwgdW5zaWduZWQgT3BObyk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvTGVnYWxpemVUeXBlc0dlbmVyaWMuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplVHlwZXNHZW5lcmljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzJiMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplVHlwZXNHZW5lcmljLmNwcApAQCAtMCwwICsxLDQ4MiBAQAorLy89PT0tLS0tLS0tLSBMZWdhbGl6ZVR5cGVzR2VuZXJpYy5jcHAgLSBHZW5lcmljIHR5cGUgbGVnYWxpemF0aW9uIC0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBnZW5lcmljIHR5cGUgZXhwYW5zaW9uIGFuZCBzcGxpdHRpbmcgZm9yIExlZ2FsaXplVHlwZXMuCisvLyBUaGUgcm91dGluZXMgaGVyZSBwZXJmb3JtIGxlZ2FsaXphdGlvbiB3aGVuIHRoZSBkZXRhaWxzIG9mIHRoZSB0eXBlIChzdWNoIGFzCisvLyB3aGV0aGVyIGl0IGlzIGFuIGludGVnZXIgb3IgYSBmbG9hdCkgZG8gbm90IG1hdHRlci4KKy8vIEV4cGFuc2lvbiBpcyB0aGUgYWN0IG9mIGNoYW5naW5nIGEgY29tcHV0YXRpb24gaW4gYW4gaWxsZWdhbCB0eXBlIHRvIGJlIGEKKy8vIGNvbXB1dGF0aW9uIGluIHR3byBpZGVudGljYWwgcmVnaXN0ZXJzIG9mIGEgc21hbGxlciB0eXBlLiAgVGhlIExvL0hpIHBhcnQKKy8vIGlzIHJlcXVpcmVkIHRvIGJlIHN0b3JlZCBmaXJzdCBpbiBtZW1vcnkgb24gbGl0dGxlL2JpZy1lbmRpYW4gbWFjaGluZXMuCisvLyBTcGxpdHRpbmcgaXMgdGhlIGFjdCBvZiBjaGFuZ2luZyBhIGNvbXB1dGF0aW9uIGluIGFuIGlsbGVnYWwgdHlwZSB0byBiZSBhCisvLyBjb21wdXRhdGlvbiBpbiB0d28gbm90IG5lY2Vzc2FyaWx5IGlkZW50aWNhbCByZWdpc3RlcnMgb2YgYSBzbWFsbGVyIHR5cGUuCisvLyBUaGVyZSBhcmUgbm8gcmVxdWlyZW1lbnRzIG9uIGhvdyB0aGUgdHlwZSBpcyByZXByZXNlbnRlZCBpbiBtZW1vcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkxlZ2FsaXplVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdlbmVyaWMgUmVzdWx0IEV4cGFuc2lvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoZXNlIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoZSBMby9IaSBwYXJ0IGlzIHN0b3JlZCBmaXJzdCBpbiBtZW1vcnkgb24KKy8vIGxpdHRsZS9iaWctZW5kaWFuIG1hY2hpbmVzLCBmb2xsb3dlZCBieSB0aGUgSGkvTG8gcGFydC4gIFRoaXMgbWVhbnMgdGhhdAorLy8gdGhleSBjYW5ub3QgYmUgdXNlZCBhcyBpcyBvbiB2ZWN0b3JzLCBmb3Igd2hpY2ggTG8gaXMgYWx3YXlzIHN0b3JlZCBmaXJzdC4KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRSZXNfQklUX0NPTlZFUlQoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkhpKSB7CisgIEVWVCBPdXRWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRVZUIE5PdXRWVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgT3V0VlQpOworICBTRFZhbHVlIEluT3AgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgSW5WVCA9IEluT3AuZ2V0VmFsdWVUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBIYW5kbGUgc29tZSBzcGVjaWFsIGNhc2VzIGVmZmljaWVudGx5LgorICBzd2l0Y2ggKGdldFR5cGVBY3Rpb24oSW5WVCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbmtub3duIHR5cGUgYWN0aW9uISIpOworICAgIGNhc2UgTGVnYWw6CisgICAgY2FzZSBQcm9tb3RlSW50ZWdlcjoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU29mdGVuRmxvYXQ6CisgICAgICAvLyBDb252ZXJ0IHRoZSBpbnRlZ2VyIG9wZXJhbmQgaW5zdGVhZC4KKyAgICAgIFNwbGl0SW50ZWdlcihHZXRTb2Z0ZW5lZEZsb2F0KEluT3ApLCBMbywgSGkpOworICAgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTk91dFZULCBMbyk7CisgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBOT3V0VlQsIEhpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEV4cGFuZEludGVnZXI6CisgICAgY2FzZSBFeHBhbmRGbG9hdDoKKyAgICAgIC8vIENvbnZlcnQgdGhlIGV4cGFuZGVkIHBpZWNlcyBvZiB0aGUgaW5wdXQuCisgICAgICBHZXRFeHBhbmRlZE9wKEluT3AsIExvLCBIaSk7CisgICAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBOT3V0VlQsIExvKTsKKyAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE5PdXRWVCwgSGkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgU3BsaXRWZWN0b3I6CisgICAgICBHZXRTcGxpdFZlY3RvcihJbk9wLCBMbywgSGkpOworICAgICAgaWYgKFRMSS5pc0JpZ0VuZGlhbigpKQorICAgICAgICBzdGQ6OnN3YXAoTG8sIEhpKTsKKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE5PdXRWVCwgTG8pOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTk91dFZULCBIaSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBTY2FsYXJpemVWZWN0b3I6CisgICAgICAvLyBDb252ZXJ0IHRoZSBlbGVtZW50IGluc3RlYWQuCisgICAgICBTcGxpdEludGVnZXIoQml0Q29udmVydFRvSW50ZWdlcihHZXRTY2FsYXJpemVkVmVjdG9yKEluT3ApKSwgTG8sIEhpKTsKKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE5PdXRWVCwgTG8pOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTk91dFZULCBIaSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBXaWRlblZlY3RvcjogeworICAgICAgYXNzZXJ0KCEoSW5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpICYgMSkgJiYgIlVuc3VwcG9ydGVkIEJJVF9DT05WRVJUIik7CisgICAgICBJbk9wID0gR2V0V2lkZW5lZFZlY3RvcihJbk9wKTsKKyAgICAgIEVWVCBJbk5WVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIEluVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpLzIpOworICAgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SLCBkbCwgSW5OVlQsIEluT3AsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSk7CisgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLCBJbk5WVCwgSW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluTlZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpKTsKKyAgICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICAgICAgc3RkOjpzd2FwKExvLCBIaSk7CisgICAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBOT3V0VlQsIExvKTsKKyAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE5PdXRWVCwgSGkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlmIChJblZULmlzVmVjdG9yKCkgJiYgT3V0VlQuaXNJbnRlZ2VyKCkpIHsKKyAgICAvLyBIYW5kbGUgY2FzZXMgbGlrZSBpNjQgPSBCSVRfQ09OVkVSVCB2MWk2NCBvbiB4ODYsIHdoZXJlIHRoZSBvcGVyYW5kCisgICAgLy8gaXMgbGVnYWwgYnV0IHRoZSByZXN1bHQgaXMgbm90LgorICAgIEVWVCBOVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBOT3V0VlQsIDIpOworCisgICAgaWYgKGlzVHlwZUxlZ2FsKE5WVCkpIHsKKyAgICAgIFNEVmFsdWUgQ2FzdEluT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTlZULCBJbk9wKTsKKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBOT3V0VlQsIENhc3RJbk9wLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE5PdXRWVCwgQ2FzdEluT3AsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgxKSk7CisKKyAgICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICAgICAgc3RkOjpzd2FwKExvLCBIaSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBMb3dlciB0aGUgYml0LWNvbnZlcnQgdG8gYSBzdG9yZS9sb2FkIGZyb20gdGhlIHN0YWNrLgorICBhc3NlcnQoTk91dFZULmlzQnl0ZVNpemVkKCkgJiYgIkV4cGFuZGVkIHR5cGUgbm90IGJ5dGUgc2l6ZWQhIik7CisKKyAgLy8gQ3JlYXRlIHRoZSBzdGFjayBmcmFtZSBvYmplY3QuICBNYWtlIHN1cmUgaXQgaXMgYWxpZ25lZCBmb3IgYm90aAorICAvLyB0aGUgc291cmNlIGFuZCBleHBhbmRlZCBkZXN0aW5hdGlvbiB0eXBlcy4KKyAgdW5zaWduZWQgQWxpZ25tZW50ID0KKyAgICBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRQcmVmVHlwZUFsaWdubWVudChOT3V0VlQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSkpOworICBTRFZhbHVlIFN0YWNrUHRyID0gREFHLkNyZWF0ZVN0YWNrVGVtcG9yYXJ5KEluVlQsIEFsaWdubWVudCk7CisgIGludCBTUEZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihTdGFja1B0ci5nZXROb2RlKCkpLT5nZXRJbmRleCgpOworICBjb25zdCBWYWx1ZSAqU1YgPSBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhTUEZJKTsKKworICAvLyBFbWl0IGEgc3RvcmUgdG8gdGhlIHN0YWNrIHNsb3QuCisgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwgSW5PcCwgU3RhY2tQdHIsIFNWLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgLy8gTG9hZCB0aGUgZmlyc3QgaGFsZiBmcm9tIHRoZSBzdGFjayBzbG90LgorICBMbyA9IERBRy5nZXRMb2FkKE5PdXRWVCwgZGwsIFN0b3JlLCBTdGFja1B0ciwgU1YsIDAsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgLy8gSW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHRoZSBvdGhlciBoYWxmLgorICB1bnNpZ25lZCBJbmNyZW1lbnRTaXplID0gTk91dFZULmdldFNpemVJbkJpdHMoKSAvIDg7CisgIFN0YWNrUHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBTdGFja1B0ci5nZXRWYWx1ZVR5cGUoKSwgU3RhY2tQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluY3JlbWVudFNpemUpKTsKKworICAvLyBMb2FkIHRoZSBzZWNvbmQgaGFsZiBmcm9tIHRoZSBzdGFjayBzbG90LgorICBIaSA9IERBRy5nZXRMb2FkKE5PdXRWVCwgZGwsIFN0b3JlLCBTdGFja1B0ciwgU1YsIEluY3JlbWVudFNpemUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgIGZhbHNlLCBNaW5BbGlnbihBbGlnbm1lbnQsIEluY3JlbWVudFNpemUpKTsKKworICAvLyBIYW5kbGUgZW5kaWFubmVzcyBvZiB0aGUgbG9hZC4KKyAgaWYgKFRMSS5pc0JpZ0VuZGlhbigpKQorICAgIHN0ZDo6c3dhcChMbywgSGkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZFJlc19CVUlMRF9QQUlSKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkhpKSB7CisgIC8vIFJldHVybiB0aGUgb3BlcmFuZHMuCisgIExvID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgSGkgPSBOLT5nZXRPcGVyYW5kKDEpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZFJlc19FWFRSQUNUX0VMRU1FTlQoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBHZXRFeHBhbmRlZE9wKE4tPmdldE9wZXJhbmQoMCksIExvLCBIaSk7CisgIFNEVmFsdWUgUGFydCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKSA/CisgICAgICAgICAgICAgICAgICAgSGkgOiBMbzsKKworICBhc3NlcnQoUGFydC5nZXRWYWx1ZVR5cGUoKSA9PSBOLT5nZXRWYWx1ZVR5cGUoMCkgJiYKKyAgICAgICAgICJUeXBlIHR3aWNlIGFzIGJpZyBhcyBleHBhbmRlZCB0eXBlIG5vdCBpdHNlbGYgZXhwYW5kZWQhIik7CisKKyAgR2V0UGFpckVsZW1lbnRzKFBhcnQsIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kUmVzX0VYVFJBQ1RfVkVDVE9SX0VMVChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkhpKSB7CisgIFNEVmFsdWUgT2xkVmVjID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgdW5zaWduZWQgT2xkRWx0cyA9IE9sZFZlYy5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgLy8gQ29udmVydCB0byBhIHZlY3RvciBvZiB0aGUgZXhwYW5kZWQgZWxlbWVudCB0eXBlLCBmb3IgZXhhbXBsZQorICAvLyA8MyB4IGk2ND4gLT4gPDYgeCBpMzI+LgorICBFVlQgT2xkVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBOZXdWVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgT2xkVlQpOworCisgIFNEVmFsdWUgTmV3VmVjID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1ZULCAyKk9sZEVsdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZFZlYyk7CisKKyAgLy8gRXh0cmFjdCB0aGUgZWxlbWVudHMgYXQgMiAqIElkeCBhbmQgMiAqIElkeCArIDEgZnJvbSB0aGUgbmV3IHZlY3Rvci4KKyAgU0RWYWx1ZSBJZHggPSBOLT5nZXRPcGVyYW5kKDEpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgdHlwZSBvZiBJZHggaXMgYmlnIGVub3VnaCB0byBob2xkIHRoZSBuZXcgdmFsdWVzLgorICBpZiAoSWR4LmdldFZhbHVlVHlwZSgpLmJpdHNMVChUTEkuZ2V0UG9pbnRlclR5KCkpKQorICAgIElkeCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBUTEkuZ2V0UG9pbnRlclR5KCksIElkeCk7CisKKyAgSWR4ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBJZHguZ2V0VmFsdWVUeXBlKCksIElkeCwgSWR4KTsKKyAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE5ld1ZULCBOZXdWZWMsIElkeCk7CisKKyAgSWR4ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBJZHguZ2V0VmFsdWVUeXBlKCksIElkeCwKKyAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIElkeC5nZXRWYWx1ZVR5cGUoKSkpOworICBIaSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgTmV3VlQsIE5ld1ZlYywgSWR4KTsKKworICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpCisgICAgc3RkOjpzd2FwKExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kUmVzX05vcm1hbExvYWQoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgYXNzZXJ0KElTRDo6aXNOb3JtYWxMb2FkKE4pICYmICJUaGlzIHJvdXRpbmUgb25seSBmb3Igbm9ybWFsIGxvYWRzISIpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgTG9hZFNETm9kZSAqTEQgPSBjYXN0PExvYWRTRE5vZGU+KE4pOworICBFVlQgTlZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBMRC0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgU0RWYWx1ZSBDaGFpbiA9IExELT5nZXRDaGFpbigpOworICBTRFZhbHVlIFB0ciA9IExELT5nZXRCYXNlUHRyKCk7CisgIGludCBTVk9mZnNldCA9IExELT5nZXRTcmNWYWx1ZU9mZnNldCgpOworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBMRC0+Z2V0QWxpZ25tZW50KCk7CisgIGJvb2wgaXNWb2xhdGlsZSA9IExELT5pc1ZvbGF0aWxlKCk7CisgIGJvb2wgaXNOb25UZW1wb3JhbCA9IExELT5pc05vblRlbXBvcmFsKCk7CisKKyAgYXNzZXJ0KE5WVC5pc0J5dGVTaXplZCgpICYmICJFeHBhbmRlZCB0eXBlIG5vdCBieXRlIHNpemVkISIpOworCisgIExvID0gREFHLmdldExvYWQoTlZULCBkbCwgQ2hhaW4sIFB0ciwgTEQtPmdldFNyY1ZhbHVlKCksIFNWT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGlzVm9sYXRpbGUsIGlzTm9uVGVtcG9yYWwsIEFsaWdubWVudCk7CisKKyAgLy8gSW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHRoZSBvdGhlciBoYWxmLgorICB1bnNpZ25lZCBJbmNyZW1lbnRTaXplID0gTlZULmdldFNpemVJbkJpdHMoKSAvIDg7CisgIFB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyLmdldFZhbHVlVHlwZSgpLCBQdHIsCisgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJbmNyZW1lbnRTaXplKSk7CisgIEhpID0gREFHLmdldExvYWQoTlZULCBkbCwgQ2hhaW4sIFB0ciwgTEQtPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQrSW5jcmVtZW50U2l6ZSwKKyAgICAgICAgICAgICAgICAgICBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgIE1pbkFsaWduKEFsaWdubWVudCwgSW5jcmVtZW50U2l6ZSkpOworCisgIC8vIEJ1aWxkIGEgZmFjdG9yIG5vZGUgdG8gcmVtZW1iZXIgdGhhdCB0aGlzIGxvYWQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlCisgIC8vIG90aGVyIG9uZS4KKyAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgTG8uZ2V0VmFsdWUoMSksCisgICAgICAgICAgICAgICAgICAgICAgSGkuZ2V0VmFsdWUoMSkpOworCisgIC8vIEhhbmRsZSBlbmRpYW5uZXNzIG9mIHRoZSBsb2FkLgorICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpCisgICAgc3RkOjpzd2FwKExvLCBIaSk7CisKKyAgLy8gTW9kaWZpZWQgdGhlIGNoYWluIC0gc3dpdGNoIGFueXRoaW5nIHRoYXQgdXNlZCB0aGUgb2xkIGNoYWluIHRvIHVzZQorICAvLyB0aGUgbmV3IG9uZS4KKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBDaGFpbik7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kUmVzX1ZBQVJHKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIEVWVCBPVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE9WVCk7CisgIFNEVmFsdWUgQ2hhaW4gPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFB0ciA9IE4tPmdldE9wZXJhbmQoMSk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgY29uc3QgdW5zaWduZWQgQWxpZ24gPSBOLT5nZXRDb25zdGFudE9wZXJhbmRWYWwoMyk7CisKKyAgTG8gPSBEQUcuZ2V0VkFBcmcoTlZULCBkbCwgQ2hhaW4sIFB0ciwgTi0+Z2V0T3BlcmFuZCgyKSwgQWxpZ24pOworICBIaSA9IERBRy5nZXRWQUFyZyhOVlQsIGRsLCBMby5nZXRWYWx1ZSgxKSwgUHRyLCBOLT5nZXRPcGVyYW5kKDIpLCAwKTsKKworICAvLyBIYW5kbGUgZW5kaWFubmVzcyBvZiB0aGUgbG9hZC4KKyAgaWYgKFRMSS5pc0JpZ0VuZGlhbigpKQorICAgIHN0ZDo6c3dhcChMbywgSGkpOworCisgIC8vIE1vZGlmaWVkIHRoZSBjaGFpbiAtIHN3aXRjaCBhbnl0aGluZyB0aGF0IHVzZWQgdGhlIG9sZCBjaGFpbiB0byB1c2UKKyAgLy8gdGhlIG5ldyBvbmUuCisgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCAxKSwgSGkuZ2V0VmFsdWUoMSkpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR2VuZXJpYyBPcGVyYW5kIEV4cGFuc2lvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZE9wX0JJVF9DT05WRVJUKFNETm9kZSAqTikgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkuaXNWZWN0b3IoKSkgeworICAgIC8vIEFuIGlsbGVnYWwgZXhwYW5kaW5nIHR5cGUgaXMgYmVpbmcgY29udmVydGVkIHRvIGEgbGVnYWwgdmVjdG9yIHR5cGUuCisgICAgLy8gTWFrZSBhIHR3byBlbGVtZW50IHZlY3RvciBvdXQgb2YgdGhlIGV4cGFuZGVkIHBhcnRzIGFuZCBjb252ZXJ0IHRoYXQKKyAgICAvLyBpbnN0ZWFkLCBidXQgb25seSBpZiB0aGUgbmV3IHZlY3RvciB0eXBlIGlzIGxlZ2FsIChvdGhlcndpc2UgdGhlcmUKKyAgICAvLyBpcyBubyBwb2ludCwgYW5kIGl0IG1pZ2h0IGNyZWF0ZSBleHBhbnNpb24gbG9vcHMpLiAgRm9yIGV4YW1wbGUsIG9uCisgICAgLy8geDg2IHRoaXMgdHVybnMgdjFpNjQgPSBCSVRfQ09OVkVSVCBpNjQgaW50byB2MWk2NCA9IEJJVF9DT05WRVJUIHYyaTMyLgorICAgIEVWVCBPVlQgPSBOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgIEVWVCBOVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgT1ZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKworICAgIGlmIChpc1R5cGVMZWdhbChOVlQpKSB7CisgICAgICBTRFZhbHVlIFBhcnRzWzJdOworICAgICAgR2V0RXhwYW5kZWRPcChOLT5nZXRPcGVyYW5kKDApLCBQYXJ0c1swXSwgUGFydHNbMV0pOworCisgICAgICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpCisgICAgICAgIHN0ZDo6c3dhcChQYXJ0c1swXSwgUGFydHNbMV0pOworCisgICAgICBTRFZhbHVlIFZlYyA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgTlZULCBQYXJ0cywgMik7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE4tPmdldFZhbHVlVHlwZSgwKSwgVmVjKTsKKyAgICB9CisgIH0KKworICAvLyBPdGhlcndpc2UsIHN0b3JlIHRvIGEgdGVtcG9yYXJ5IGFuZCBsb2FkIG91dCBhZ2FpbiBhcyB0aGUgbmV3IHR5cGUuCisgIHJldHVybiBDcmVhdGVTdGFja1N0b3JlTG9hZChOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZE9wX0JVSUxEX1ZFQ1RPUihTRE5vZGUgKk4pIHsKKyAgLy8gVGhlIHZlY3RvciB0eXBlIGlzIGxlZ2FsIGJ1dCB0aGUgZWxlbWVudCB0eXBlIG5lZWRzIGV4cGFuc2lvbi4KKyAgRVZUIFZlY1ZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICB1bnNpZ25lZCBOdW1FbHRzID0gVmVjVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgRVZUIE9sZFZUID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIE5ld1ZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBPbGRWVCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBhc3NlcnQoT2xkVlQgPT0gVmVjVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSAmJgorICAgICAgICAgIkJVSUxEX1ZFQ1RPUiBvcGVyYW5kIHR5cGUgZG9lc24ndCBtYXRjaCB2ZWN0b3IgZWxlbWVudCB0eXBlISIpOworCisgIC8vIEJ1aWxkIGEgdmVjdG9yIG9mIHR3aWNlIHRoZSBsZW5ndGggb3V0IG9mIHRoZSBleHBhbmRlZCBlbGVtZW50cy4KKyAgLy8gRm9yIGV4YW1wbGUgPDMgeCBpNjQ+IC0+IDw2IHggaTMyPi4KKyAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gTmV3RWx0czsKKyAgTmV3RWx0cy5yZXNlcnZlKE51bUVsdHMqMik7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUVsdHM7ICsraSkgeworICAgIFNEVmFsdWUgTG8sIEhpOworICAgIEdldEV4cGFuZGVkT3AoTi0+Z2V0T3BlcmFuZChpKSwgTG8sIEhpKTsKKyAgICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpCisgICAgICBzdGQ6OnN3YXAoTG8sIEhpKTsKKyAgICBOZXdFbHRzLnB1c2hfYmFjayhMbyk7CisgICAgTmV3RWx0cy5wdXNoX2JhY2soSGkpOworICB9CisKKyAgU0RWYWx1ZSBOZXdWZWMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1ZULCBOZXdFbHRzLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0VsdHNbMF0sIE5ld0VsdHMuc2l6ZSgpKTsKKworICAvLyBDb252ZXJ0IHRoZSBuZXcgdmVjdG9yIHRvIHRoZSBvbGQgdmVjdG9yIHR5cGUuCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVmVjVlQsIE5ld1ZlYyk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6RXhwYW5kT3BfRVhUUkFDVF9FTEVNRU5UKFNETm9kZSAqTikgeworICBTRFZhbHVlIExvLCBIaTsKKyAgR2V0RXhwYW5kZWRPcChOLT5nZXRPcGVyYW5kKDApLCBMbywgSGkpOworICByZXR1cm4gY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpID8gSGkgOiBMbzsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRPcF9JTlNFUlRfVkVDVE9SX0VMVChTRE5vZGUgKk4pIHsKKyAgLy8gVGhlIHZlY3RvciB0eXBlIGlzIGxlZ2FsIGJ1dCB0aGUgZWxlbWVudCB0eXBlIG5lZWRzIGV4cGFuc2lvbi4KKyAgRVZUIFZlY1ZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICB1bnNpZ25lZCBOdW1FbHRzID0gVmVjVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIFNEVmFsdWUgVmFsID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgRVZUIE9sZEVWVCA9IFZhbC5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIE5ld0VWVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgT2xkRVZUKTsKKworICBhc3NlcnQoT2xkRVZUID09IFZlY1ZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgICJJbnNlcnRlZCBlbGVtZW50IHR5cGUgZG9lc24ndCBtYXRjaCB2ZWN0b3IgZWxlbWVudCB0eXBlISIpOworCisgIC8vIEJpdGNvbnZlcnQgdG8gYSB2ZWN0b3Igb2YgdHdpY2UgdGhlIGxlbmd0aCB3aXRoIGVsZW1lbnRzIG9mIHRoZSBleHBhbmRlZAorICAvLyB0eXBlLCBpbnNlcnQgdGhlIGV4cGFuZGVkIHZlY3RvciBlbGVtZW50cywgYW5kIHRoZW4gY29udmVydCBiYWNrLgorICBFVlQgTmV3VmVjVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBOZXdFVlQsIE51bUVsdHMqMik7CisgIFNEVmFsdWUgTmV3VmVjID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3VmVjVlQsIE4tPmdldE9wZXJhbmQoMCkpOworCisgIFNEVmFsdWUgTG8sIEhpOworICBHZXRFeHBhbmRlZE9wKFZhbCwgTG8sIEhpKTsKKyAgaWYgKFRMSS5pc0JpZ0VuZGlhbigpKQorICAgIHN0ZDo6c3dhcChMbywgSGkpOworCisgIFNEVmFsdWUgSWR4ID0gTi0+Z2V0T3BlcmFuZCgyKTsKKyAgSWR4ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBJZHguZ2V0VmFsdWVUeXBlKCksIElkeCwgSWR4KTsKKyAgTmV3VmVjID0gREFHLmdldE5vZGUoSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgZGwsIE5ld1ZlY1ZULCBOZXdWZWMsIExvLCBJZHgpOworICBJZHggPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsCisgICAgICAgICAgICAgICAgICAgIElkeC5nZXRWYWx1ZVR5cGUoKSwgSWR4LCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMSkpOworICBOZXdWZWMgPSAgREFHLmdldE5vZGUoSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgZGwsIE5ld1ZlY1ZULCBOZXdWZWMsIEhpLCBJZHgpOworCisgIC8vIENvbnZlcnQgdGhlIG5ldyB2ZWN0b3IgdG8gdGhlIG9sZCB2ZWN0b3IgdHlwZS4KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWZWNWVCwgTmV3VmVjKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRPcF9TQ0FMQVJfVE9fVkVDVE9SKFNETm9kZSAqTikgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgYXNzZXJ0KFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgPT0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgIlNDQUxBUl9UT19WRUNUT1Igb3BlcmFuZCB0eXBlIGRvZXNuJ3QgbWF0Y2ggdmVjdG9yIGVsZW1lbnQgdHlwZSEiKTsKKyAgdW5zaWduZWQgTnVtRWx0cyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBPcHMoTnVtRWx0cyk7CisgIE9wc1swXSA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgVW5kZWZWYWwgPSBEQUcuZ2V0VU5ERUYoT3BzWzBdLmdldFZhbHVlVHlwZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IE51bUVsdHM7ICsraSkKKyAgICBPcHNbaV0gPSBVbmRlZlZhbDsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgVlQsICZPcHNbMF0sIE51bUVsdHMpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OkV4cGFuZE9wX05vcm1hbFN0b3JlKFNETm9kZSAqTiwgdW5zaWduZWQgT3BObykgeworICBhc3NlcnQoSVNEOjppc05vcm1hbFN0b3JlKE4pICYmICJUaGlzIHJvdXRpbmUgb25seSBmb3Igbm9ybWFsIHN0b3JlcyEiKTsKKyAgYXNzZXJ0KE9wTm8gPT0gMSAmJiAiQ2FuIG9ubHkgZXhwYW5kIHRoZSBzdG9yZWQgdmFsdWUgc28gZmFyIik7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBTdG9yZVNETm9kZSAqU3QgPSBjYXN0PFN0b3JlU0ROb2RlPihOKTsKKyAgRVZUIE5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdC0+Z2V0VmFsdWUoKS5nZXRWYWx1ZVR5cGUoKSk7CisgIFNEVmFsdWUgQ2hhaW4gPSBTdC0+Z2V0Q2hhaW4oKTsKKyAgU0RWYWx1ZSBQdHIgPSBTdC0+Z2V0QmFzZVB0cigpOworICBpbnQgU1ZPZmZzZXQgPSBTdC0+Z2V0U3JjVmFsdWVPZmZzZXQoKTsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gU3QtPmdldEFsaWdubWVudCgpOworICBib29sIGlzVm9sYXRpbGUgPSBTdC0+aXNWb2xhdGlsZSgpOworICBib29sIGlzTm9uVGVtcG9yYWwgPSBTdC0+aXNOb25UZW1wb3JhbCgpOworCisgIGFzc2VydChOVlQuaXNCeXRlU2l6ZWQoKSAmJiAiRXhwYW5kZWQgdHlwZSBub3QgYnl0ZSBzaXplZCEiKTsKKyAgdW5zaWduZWQgSW5jcmVtZW50U2l6ZSA9IE5WVC5nZXRTaXplSW5CaXRzKCkgLyA4OworCisgIFNEVmFsdWUgTG8sIEhpOworICBHZXRFeHBhbmRlZE9wKFN0LT5nZXRWYWx1ZSgpLCBMbywgSGkpOworCisgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICBzdGQ6OnN3YXAoTG8sIEhpKTsKKworICBMbyA9IERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIExvLCBQdHIsIFN0LT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwgQWxpZ25tZW50KTsKKworICBQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0ci5nZXRWYWx1ZVR5cGUoKSwgUHRyLAorICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSW5jcmVtZW50U2l6ZSkpOworICBhc3NlcnQoaXNUeXBlTGVnYWwoUHRyLmdldFZhbHVlVHlwZSgpKSAmJiAiUG9pbnRlcnMgbXVzdCBiZSBsZWdhbCEiKTsKKyAgSGkgPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBIaSwgUHRyLCBTdC0+Z2V0U3JjVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQgKyBJbmNyZW1lbnRTaXplLAorICAgICAgICAgICAgICAgICAgICBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICBNaW5BbGlnbihBbGlnbm1lbnQsIEluY3JlbWVudFNpemUpKTsKKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIExvLCBIaSk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBHZW5lcmljIFJlc3VsdCBTcGxpdHRpbmcuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gQmUgY2FyZWZ1bCB0byBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IHdoaWNoIG9mIExvL0hpIGlzIHN0b3JlZCBmaXJzdCBpbgorLy8gbWVtb3J5IChmb3IgdmVjdG9ycyBpdCBpcyBhbHdheXMgTG8gZmlyc3QgZm9sbG93ZWQgYnkgSGkgaW4gdGhlIGZvbGxvd2luZworLy8gYnl0ZXM7IGZvciBpbnRlZ2VycyBhbmQgZmxvYXRzIGl0IGlzIExvIGZpcnN0IGlmIGFuZCBvbmx5IGlmIHRoZSBtYWNoaW5lIGlzCisvLyBsaXR0bGUtZW5kaWFuKS4KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTcGxpdFJlc19NRVJHRV9WQUxVRVMoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTG8sIFNEVmFsdWUgJkhpKSB7CisgIC8vIEEgTUVSR0VfVkFMVUVTIG5vZGUgY2FuIHByb2R1Y2UgYW55IG51bWJlciBvZiB2YWx1ZXMuICBXZSBrbm93IHRoYXQgdGhlCisgIC8vIGZpcnN0IGlsbGVnYWwgb25lIG5lZWRzIHRvIGJlIGV4cGFuZGVkIGludG8gTG8vSGkuCisgIHVuc2lnbmVkIGk7CisKKyAgLy8gVGhlIHN0cmluZyBvZiBsZWdhbCByZXN1bHRzIGdldHMgdHVybmVkIGludG8gaW5wdXQgb3BlcmFuZHMsIHdoaWNoIGhhdmUKKyAgLy8gdGhlIHNhbWUgdHlwZS4KKyAgZm9yIChpID0gMDsgaXNUeXBlTGVnYWwoTi0+Z2V0VmFsdWVUeXBlKGkpKTsgKytpKQorICAgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCBpKSwgU0RWYWx1ZShOLT5nZXRPcGVyYW5kKGkpKSk7CisKKyAgLy8gVGhlIGZpcnN0IGlsbGVnYWwgcmVzdWx0IG11c3QgYmUgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGV4cGFuZGVkLgorICBHZXRTcGxpdE9wKE4tPmdldE9wZXJhbmQoaSksIExvLCBIaSk7CisKKyAgLy8gTGVnYWxpemUgdGhlIHJlc3Qgb2YgdGhlIHJlc3VsdHMgaW50byB0aGUgaW5wdXQgb3BlcmFuZHMgd2hldGhlciB0aGV5IGFyZQorICAvLyBsZWdhbCBvciBub3QuCisgIHVuc2lnbmVkIGUgPSBOLT5nZXROdW1WYWx1ZXMoKTsKKyAgZm9yICgrK2k7IGkgIT0gZTsgKytpKQorICAgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCBpKSwgU0RWYWx1ZShOLT5nZXRPcGVyYW5kKGkpKSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRSZXNfU0VMRUNUKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIExMLCBMSCwgUkwsIFJIOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIEdldFNwbGl0T3AoTi0+Z2V0T3BlcmFuZCgxKSwgTEwsIExIKTsKKyAgR2V0U3BsaXRPcChOLT5nZXRPcGVyYW5kKDIpLCBSTCwgUkgpOworCisgIFNEVmFsdWUgQ29uZCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIExvID0gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBMTC5nZXRWYWx1ZVR5cGUoKSwgQ29uZCwgTEwsIFJMKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIExILmdldFZhbHVlVHlwZSgpLCBDb25kLCBMSCwgUkgpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OlNwbGl0UmVzX1NFTEVDVF9DQyhTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgU0RWYWx1ZSBMTCwgTEgsIFJMLCBSSDsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRTcGxpdE9wKE4tPmdldE9wZXJhbmQoMiksIExMLCBMSCk7CisgIEdldFNwbGl0T3AoTi0+Z2V0T3BlcmFuZCgzKSwgUkwsIFJIKTsKKworICBMbyA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNUX0NDLCBkbCwgTEwuZ2V0VmFsdWVUeXBlKCksIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKSwgTEwsIFJMLCBOLT5nZXRPcGVyYW5kKDQpKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVF9DQywgZGwsIExILmdldFZhbHVlVHlwZSgpLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMSksIExILCBSSCwgTi0+Z2V0T3BlcmFuZCg0KSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRSZXNfVU5ERUYoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIExvVlQsIEhpVlQ7CisgIEdldFNwbGl0RGVzdFZUcyhOLT5nZXRWYWx1ZVR5cGUoMCksIExvVlQsIEhpVlQpOworICBMbyA9IERBRy5nZXRVTkRFRihMb1ZUKTsKKyAgSGkgPSBEQUcuZ2V0VU5ERUYoSGlWVCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvTGVnYWxpemVWZWN0b3JPcHMuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplVmVjdG9yT3BzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjFjMDg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL0xlZ2FsaXplVmVjdG9yT3BzLmNwcApAQCAtMCwwICsxLDI5MCBAQAorLy89PT0tLSBMZWdhbGl6ZVZlY3Rvck9wcy5jcHAgLSBJbXBsZW1lbnQgU2VsZWN0aW9uREFHOjpMZWdhbGl6ZVZlY3RvcnMgLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU2VsZWN0aW9uREFHOjpMZWdhbGl6ZVZlY3RvcnMgbWV0aG9kLgorLy8KKy8vIFRoZSB2ZWN0b3IgbGVnYWxpemVyIGxvb2tzIGZvciB2ZWN0b3Igb3BlcmF0aW9ucyB3aGljaCBtaWdodCBuZWVkIHRvIGJlCisvLyBzY2FsYXJpemVkIGFuZCBsZWdhbGl6ZXMgdGhlbS4gVGhpcyBpcyBhIHNlcGFyYXRlIHN0ZXAgZnJvbSBMZWdhbGl6ZSBiZWNhdXNlCisvLyBzY2FsYXJpemluZyBjYW4gaW50cm9kdWNlIGlsbGVnYWwgdHlwZXMuICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZSBoYXZlIGFuCisvLyBJU0Q6OlNESVYgb2YgdHlwZSB2Mmk2NCBvbiB4ODYtMzIuICBUaGUgdHlwZSBpcyBsZWdhbCAoZm9yIGV4YW1wbGUsIGFkZGl0aW9uCisvLyBvbiBhIHYyaTY0IGlzIGxlZ2FsKSwgYnV0IElTRDo6U0RJViBpc24ndCBsZWdhbCwgc28gd2UgaGF2ZSB0byB1bnJvbGwgdGhlCisvLyBvcGVyYXRpb24sIHdoaWNoIGludHJvZHVjZXMgbm9kZXMgd2l0aCB0aGUgaWxsZWdhbCB0eXBlIGk2NCB3aGljaCBtdXN0IGJlCisvLyBleHBhbmRlZC4gIFNpbWlsYXJseSwgc3VwcG9zZSB3ZSBoYXZlIGFuIElTRDo6U1JBIG9mIHR5cGUgdjE2aTggb24gUG93ZXJQQzsKKy8vIHRoZSBvcGVyYXRpb24gbXVzdCBiZSB1bnJvbGxlZCwgd2hpY2ggaW50cm9kdWNlcyBub2RlcyB3aXRoIHRoZSBpbGxlZ2FsCisvLyB0eXBlIGk4IHdoaWNoIG11c3QgYmUgcHJvbW90ZWQuCisvLworLy8gVGhpcyBkb2VzIG5vdCBsZWdhbGl6ZSB2ZWN0b3IgbWFuaXB1bGF0aW9ucyBsaWtlIElTRDo6QlVJTERfVkVDVE9SLAorLy8gb3Igb3BlcmF0aW9ucyB0aGF0IGhhcHBlbiB0byB0YWtlIGEgdmVjdG9yIHdoaWNoIGFyZSBjdXN0b20tbG93ZXJlZDsKKy8vIHRoZSBsZWdhbGl6YXRpb24gZm9yIHN1Y2ggb3BlcmF0aW9ucyBuZXZlciBwcm9kdWNlcyBub2RlcworLy8gd2l0aCBpbGxlZ2FsIHR5cGVzLCBzbyBpdCdzIG9rYXkgdG8gcHV0IG9mZiBsZWdhbGl6aW5nIHRoZW0gdW50aWwKKy8vIFNlbGVjdGlvbkRBRzo6TGVnYWxpemUgcnVucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKK2NsYXNzIFZlY3RvckxlZ2FsaXplciB7CisgIFNlbGVjdGlvbkRBRyYgREFHOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJOworICBib29sIENoYW5nZWQ7IC8vIEtlZXAgdHJhY2sgb2Ygd2hldGhlciBhbnl0aGluZyBjaGFuZ2VkCisKKyAgLy8vIExlZ2FsaXplZE5vZGVzIC0gRm9yIG5vZGVzIHRoYXQgYXJlIG9mIGxlZ2FsIHdpZHRoLCBhbmQgdGhhdCBoYXZlIG1vcmUKKyAgLy8vIHRoYW4gb25lIHVzZSwgdGhpcyBtYXAgaW5kaWNhdGVzIHdoYXQgcmVndWxhcml6ZWQgb3BlcmFuZCB0byB1c2UuICBUaGlzCisgIC8vLyBhbGxvd3MgdXMgdG8gYXZvaWQgbGVnYWxpemluZyB0aGUgc2FtZSB0aGluZyBtb3JlIHRoYW4gb25jZS4KKyAgRGVuc2VNYXA8U0RWYWx1ZSwgU0RWYWx1ZT4gTGVnYWxpemVkTm9kZXM7CisKKyAgLy8gQWRkcyBhIG5vZGUgdG8gdGhlIHRyYW5zbGF0aW9uIGNhY2hlCisgIHZvaWQgQWRkTGVnYWxpemVkT3BlcmFuZChTRFZhbHVlIEZyb20sIFNEVmFsdWUgVG8pIHsKKyAgICBMZWdhbGl6ZWROb2Rlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoRnJvbSwgVG8pKTsKKyAgICAvLyBJZiBzb21lb25lIHJlcXVlc3RzIGxlZ2FsaXphdGlvbiBvZiB0aGUgbmV3IG5vZGUsIHJldHVybiBpdHNlbGYuCisgICAgaWYgKEZyb20gIT0gVG8pCisgICAgICBMZWdhbGl6ZWROb2Rlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoVG8sIFRvKSk7CisgIH0KKworICAvLyBMZWdhbGl6ZXMgdGhlIGdpdmVuIG5vZGUKKyAgU0RWYWx1ZSBMZWdhbGl6ZU9wKFNEVmFsdWUgT3ApOworICAvLyBBc3N1bWluZyB0aGUgbm9kZSBpcyBsZWdhbCwgImxlZ2FsaXplIiB0aGUgcmVzdWx0cworICBTRFZhbHVlIFRyYW5zbGF0ZUxlZ2FsaXplUmVzdWx0cyhTRFZhbHVlIE9wLCBTRFZhbHVlIFJlc3VsdCk7CisgIC8vIEltcGxlbWVudHMgdW5yb2xsaW5nIGEgVlNFVENDLgorICBTRFZhbHVlIFVucm9sbFZTRVRDQyhTRFZhbHVlIE9wKTsKKyAgLy8gSW1wbGVtZW50cyBleHBhbnNpb24gZm9yIEZORUc7IGZhbGxzIGJhY2sgdG8gVW5yb2xsVmVjdG9yT3AgaWYgRlNVQgorICAvLyBpc24ndCBsZWdhbC4KKyAgU0RWYWx1ZSBFeHBhbmRGTkVHKFNEVmFsdWUgT3ApOworICAvLyBJbXBsZW1lbnRzIHZlY3RvciBwcm9tb3Rpb247IHRoaXMgaXMgZXNzZW50aWFsbHkganVzdCBiaXRjYXN0aW5nIHRoZQorICAvLyBvcGVyYW5kcyB0byBhIGRpZmZlcmVudCB0eXBlIGFuZCBiaXRjYXN0aW5nIHRoZSByZXN1bHQgYmFjayB0byB0aGUKKyAgLy8gb3JpZ2luYWwgdHlwZS4KKyAgU0RWYWx1ZSBQcm9tb3RlVmVjdG9yT3AoU0RWYWx1ZSBPcCk7CisKKyAgcHVibGljOgorICBib29sIFJ1bigpOworICBWZWN0b3JMZWdhbGl6ZXIoU2VsZWN0aW9uREFHJiBkYWcpIDoKKyAgICAgIERBRyhkYWcpLCBUTEkoZGFnLmdldFRhcmdldExvd2VyaW5nSW5mbygpKSwgQ2hhbmdlZChmYWxzZSkge30KK307CisKK2Jvb2wgVmVjdG9yTGVnYWxpemVyOjpSdW4oKSB7CisgIC8vIFRoZSBsZWdhbGl6ZSBwcm9jZXNzIGlzIGluaGVyZW50bHkgYSBib3R0b20tdXAgcmVjdXJzaXZlIHByb2Nlc3MgKHVzZXJzCisgIC8vIGxlZ2FsaXplIHRoZWlyIHVzZXMgYmVmb3JlIHRoZW1zZWx2ZXMpLiAgR2l2ZW4gaW5maW5pdGUgc3RhY2sgc3BhY2UsIHdlCisgIC8vIGNvdWxkIGp1c3Qgc3RhcnQgbGVnYWxpemluZyBvbiB0aGUgcm9vdCBhbmQgdHJhdmVyc2UgdGhlIHdob2xlIGdyYXBoLiAgSW4KKyAgLy8gcHJhY3RpY2UgaG93ZXZlciwgdGhpcyBjYXVzZXMgdXMgdG8gcnVuIG91dCBvZiBzdGFjayBzcGFjZSBvbiBsYXJnZSBiYXNpYworICAvLyBibG9ja3MuICBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIGNvbXB1dGUgYW4gb3JkZXJpbmcgb2YgdGhlIG5vZGVzIHdoZXJlIGVhY2gKKyAgLy8gbm9kZSBpcyBvbmx5IGxlZ2FsaXplZCBhZnRlciBhbGwgb2YgaXRzIG9wZXJhbmRzIGFyZSBsZWdhbGl6ZWQuCisgIERBRy5Bc3NpZ25Ub3BvbG9naWNhbE9yZGVyKCk7CisgIGZvciAoU2VsZWN0aW9uREFHOjphbGxub2Rlc19pdGVyYXRvciBJID0gREFHLmFsbG5vZGVzX2JlZ2luKCksCisgICAgICAgRSA9IHByaW9yKERBRy5hbGxub2Rlc19lbmQoKSk7IEkgIT0gbGx2bTo6bmV4dChFKTsgKytJKQorICAgIExlZ2FsaXplT3AoU0RWYWx1ZShJLCAwKSk7CisKKyAgLy8gRmluYWxseSwgaXQncyBwb3NzaWJsZSB0aGUgcm9vdCBjaGFuZ2VkLiAgR2V0IHRoZSBuZXcgcm9vdC4KKyAgU0RWYWx1ZSBPbGRSb290ID0gREFHLmdldFJvb3QoKTsKKyAgYXNzZXJ0KExlZ2FsaXplZE5vZGVzLmNvdW50KE9sZFJvb3QpICYmICJSb290IGRpZG4ndCBnZXQgbGVnYWxpemVkPyIpOworICBEQUcuc2V0Um9vdChMZWdhbGl6ZWROb2Rlc1tPbGRSb290XSk7CisKKyAgTGVnYWxpemVkTm9kZXMuY2xlYXIoKTsKKworICAvLyBSZW1vdmUgZGVhZCBub2RlcyBub3cuCisgIERBRy5SZW1vdmVEZWFkTm9kZXMoKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworU0RWYWx1ZSBWZWN0b3JMZWdhbGl6ZXI6OlRyYW5zbGF0ZUxlZ2FsaXplUmVzdWx0cyhTRFZhbHVlIE9wLCBTRFZhbHVlIFJlc3VsdCkgeworICAvLyBHZW5lcmljIGxlZ2FsaXphdGlvbjoganVzdCBwYXNzIHRoZSBvcGVyYW5kIHRocm91Z2guCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcC5nZXROb2RlKCktPmdldE51bVZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICBBZGRMZWdhbGl6ZWRPcGVyYW5kKE9wLmdldFZhbHVlKGkpLCBSZXN1bHQuZ2V0VmFsdWUoaSkpOworICByZXR1cm4gUmVzdWx0LmdldFZhbHVlKE9wLmdldFJlc05vKCkpOworfQorCitTRFZhbHVlIFZlY3RvckxlZ2FsaXplcjo6TGVnYWxpemVPcChTRFZhbHVlIE9wKSB7CisgIC8vIE5vdGUgdGhhdCBMZWdhbGl6ZU9wIG1heSBiZSByZWVudGVyZWQgZXZlbiBmcm9tIHNpbmdsZS11c2Ugbm9kZXMsIHdoaWNoCisgIC8vIG1lYW5zIHRoYXQgd2UgYWx3YXlzIG11c3QgY2FjaGUgdHJhbnNmb3JtZWQgbm9kZXMuCisgIERlbnNlTWFwPFNEVmFsdWUsIFNEVmFsdWU+OjppdGVyYXRvciBJID0gTGVnYWxpemVkTm9kZXMuZmluZChPcCk7CisgIGlmIChJICE9IExlZ2FsaXplZE5vZGVzLmVuZCgpKSByZXR1cm4gSS0+c2Vjb25kOworCisgIFNETm9kZSogTm9kZSA9IE9wLmdldE5vZGUoKTsKKworICAvLyBMZWdhbGl6ZSB0aGUgb3BlcmFuZHMKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTm9kZS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgT3BzLnB1c2hfYmFjayhMZWdhbGl6ZU9wKE5vZGUtPmdldE9wZXJhbmQoaSkpKTsKKworICBTRFZhbHVlIFJlc3VsdCA9CisgICAgU0RWYWx1ZShEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKE9wLmdldE5vZGUoKSwgT3BzLmRhdGEoKSwgT3BzLnNpemUoKSksIDApOworCisgIGJvb2wgSGFzVmVjdG9yVmFsdWUgPSBmYWxzZTsKKyAgZm9yIChTRE5vZGU6OnZhbHVlX2l0ZXJhdG9yIEogPSBOb2RlLT52YWx1ZV9iZWdpbigpLCBFID0gTm9kZS0+dmFsdWVfZW5kKCk7CisgICAgICAgSiAhPSBFOworICAgICAgICsrSikKKyAgICBIYXNWZWN0b3JWYWx1ZSB8PSBKLT5pc1ZlY3RvcigpOworICBpZiAoIUhhc1ZlY3RvclZhbHVlKQorICAgIHJldHVybiBUcmFuc2xhdGVMZWdhbGl6ZVJlc3VsdHMoT3AsIFJlc3VsdCk7CisKKyAgRVZUIFF1ZXJ5VHlwZTsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBUcmFuc2xhdGVMZWdhbGl6ZVJlc3VsdHMoT3AsIFJlc3VsdCk7CisgIGNhc2UgSVNEOjpBREQ6CisgIGNhc2UgSVNEOjpTVUI6CisgIGNhc2UgSVNEOjpNVUw6CisgIGNhc2UgSVNEOjpTRElWOgorICBjYXNlIElTRDo6VURJVjoKKyAgY2FzZSBJU0Q6OlNSRU06CisgIGNhc2UgSVNEOjpVUkVNOgorICBjYXNlIElTRDo6RkFERDoKKyAgY2FzZSBJU0Q6OkZTVUI6CisgIGNhc2UgSVNEOjpGTVVMOgorICBjYXNlIElTRDo6RkRJVjoKKyAgY2FzZSBJU0Q6OkZSRU06CisgIGNhc2UgSVNEOjpBTkQ6CisgIGNhc2UgSVNEOjpPUjoKKyAgY2FzZSBJU0Q6OlhPUjoKKyAgY2FzZSBJU0Q6OlNITDoKKyAgY2FzZSBJU0Q6OlNSQToKKyAgY2FzZSBJU0Q6OlNSTDoKKyAgY2FzZSBJU0Q6OlJPVEw6CisgIGNhc2UgSVNEOjpST1RSOgorICBjYXNlIElTRDo6Q1RUWjoKKyAgY2FzZSBJU0Q6OkNUTFo6CisgIGNhc2UgSVNEOjpDVFBPUDoKKyAgY2FzZSBJU0Q6OlNFTEVDVDoKKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzoKKyAgY2FzZSBJU0Q6OlZTRVRDQzoKKyAgY2FzZSBJU0Q6OlpFUk9fRVhURU5EOgorICBjYXNlIElTRDo6QU5ZX0VYVEVORDoKKyAgY2FzZSBJU0Q6OlRSVU5DQVRFOgorICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6CisgIGNhc2UgSVNEOjpGUF9UT19TSU5UOgorICBjYXNlIElTRDo6RlBfVE9fVUlOVDoKKyAgY2FzZSBJU0Q6OkZORUc6CisgIGNhc2UgSVNEOjpGQUJTOgorICBjYXNlIElTRDo6RlNRUlQ6CisgIGNhc2UgSVNEOjpGU0lOOgorICBjYXNlIElTRDo6RkNPUzoKKyAgY2FzZSBJU0Q6OkZQT1dJOgorICBjYXNlIElTRDo6RlBPVzoKKyAgY2FzZSBJU0Q6OkZMT0c6CisgIGNhc2UgSVNEOjpGTE9HMjoKKyAgY2FzZSBJU0Q6OkZMT0cxMDoKKyAgY2FzZSBJU0Q6OkZFWFA6CisgIGNhc2UgSVNEOjpGRVhQMjoKKyAgY2FzZSBJU0Q6OkZDRUlMOgorICBjYXNlIElTRDo6RlRSVU5DOgorICBjYXNlIElTRDo6RlJJTlQ6CisgIGNhc2UgSVNEOjpGTkVBUkJZSU5UOgorICBjYXNlIElTRDo6RkZMT09SOgorICAgIFF1ZXJ5VHlwZSA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EX0lOUkVHOgorICBjYXNlIElTRDo6RlBfUk9VTkRfSU5SRUc6CisgICAgUXVlcnlUeXBlID0gY2FzdDxWVFNETm9kZT4oTm9kZS0+Z2V0T3BlcmFuZCgxKSktPmdldFZUKCk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTSU5UX1RPX0ZQOgorICBjYXNlIElTRDo6VUlOVF9UT19GUDoKKyAgICBRdWVyeVR5cGUgPSBOb2RlLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChUTEkuZ2V0T3BlcmF0aW9uQWN0aW9uKE5vZGUtPmdldE9wY29kZSgpLCBRdWVyeVR5cGUpKSB7CisgIGNhc2UgVGFyZ2V0TG93ZXJpbmc6OlByb21vdGU6CisgICAgLy8gIlByb21vdGUiIHRoZSBvcGVyYXRpb24gYnkgYml0Y2FzdGluZworICAgIFJlc3VsdCA9IFByb21vdGVWZWN0b3JPcChPcCk7CisgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgVGFyZ2V0TG93ZXJpbmc6OkxlZ2FsOiBicmVhazsKKyAgY2FzZSBUYXJnZXRMb3dlcmluZzo6Q3VzdG9tOiB7CisgICAgU0RWYWx1ZSBUbXAxID0gVExJLkxvd2VyT3BlcmF0aW9uKE9wLCBEQUcpOworICAgIGlmIChUbXAxLmdldE5vZGUoKSkgeworICAgICAgUmVzdWx0ID0gVG1wMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBGQUxMIFRIUk9VR0gKKyAgfQorICBjYXNlIFRhcmdldExvd2VyaW5nOjpFeHBhbmQ6CisgICAgaWYgKE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6Rk5FRykKKyAgICAgIFJlc3VsdCA9IEV4cGFuZEZORUcoT3ApOworICAgIGVsc2UgaWYgKE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6VlNFVENDKQorICAgICAgUmVzdWx0ID0gVW5yb2xsVlNFVENDKE9wKTsKKyAgICBlbHNlCisgICAgICBSZXN1bHQgPSBEQUcuVW5yb2xsVmVjdG9yT3AoT3AuZ2V0Tm9kZSgpKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBpcyBpdHNlbGYgbGVnYWwuCisgIGlmIChSZXN1bHQgIT0gT3ApIHsKKyAgICBSZXN1bHQgPSBMZWdhbGl6ZU9wKFJlc3VsdCk7CisgICAgQ2hhbmdlZCA9IHRydWU7CisgIH0KKworICAvLyBOb3RlIHRoYXQgTGVnYWxpemVPcCBtYXkgYmUgcmVlbnRlcmVkIGV2ZW4gZnJvbSBzaW5nbGUtdXNlIG5vZGVzLCB3aGljaAorICAvLyBtZWFucyB0aGF0IHdlIGFsd2F5cyBtdXN0IGNhY2hlIHRyYW5zZm9ybWVkIG5vZGVzLgorICBBZGRMZWdhbGl6ZWRPcGVyYW5kKE9wLCBSZXN1bHQpOworICByZXR1cm4gUmVzdWx0OworfQorCitTRFZhbHVlIFZlY3RvckxlZ2FsaXplcjo6UHJvbW90ZVZlY3Rvck9wKFNEVmFsdWUgT3ApIHsKKyAgLy8gVmVjdG9yICJwcm9tb3Rpb24iIGlzIGJhc2ljYWxseSBqdXN0IGJpdGNhc3RpbmcgYW5kIGRvaW5nIHRoZSBvcGVyYXRpb24KKyAgLy8gaW4gYSBkaWZmZXJlbnQgdHlwZS4gIEZvciBleGFtcGxlLCB4ODYgcHJvbW90ZXMgSVNEOjpBTkQgb24gdjJpMzIgdG8KKyAgLy8gdjFpNjQuCisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBhc3NlcnQoT3AuZ2V0Tm9kZSgpLT5nZXROdW1WYWx1ZXMoKSA9PSAxICYmCisgICAgICAgICAiQ2FuJ3QgcHJvbW90ZSBhIHZlY3RvciB3aXRoIG11bHRpcGxlIHJlc3VsdHMhIik7CisgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvUHJvbW90ZVRvKE9wLmdldE9wY29kZSgpLCBWVCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gT3BlcmFuZHMoT3AuZ2V0TnVtT3BlcmFuZHMoKSk7CisKKyAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiAhPSBPcC5nZXROdW1PcGVyYW5kcygpOyArK2opIHsKKyAgICBpZiAoT3AuZ2V0T3BlcmFuZChqKS5nZXRWYWx1ZVR5cGUoKS5pc1ZlY3RvcigpKQorICAgICAgT3BlcmFuZHNbal0gPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTlZULCBPcC5nZXRPcGVyYW5kKGopKTsKKyAgICBlbHNlCisgICAgICBPcGVyYW5kc1tqXSA9IE9wLmdldE9wZXJhbmQoaik7CisgIH0KKworICBPcCA9IERBRy5nZXROb2RlKE9wLmdldE9wY29kZSgpLCBkbCwgTlZULCAmT3BlcmFuZHNbMF0sIE9wZXJhbmRzLnNpemUoKSk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWVCwgT3ApOworfQorCitTRFZhbHVlIFZlY3RvckxlZ2FsaXplcjo6RXhwYW5kRk5FRyhTRFZhbHVlIE9wKSB7CisgIGlmIChUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6RlNVQiwgT3AuZ2V0VmFsdWVUeXBlKCkpKSB7CisgICAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50RlAoLTAuMCwgT3AuZ2V0VmFsdWVUeXBlKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIE9wLmdldERlYnVnTG9jKCksIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBaZXJvLCBPcC5nZXRPcGVyYW5kKDApKTsKKyAgfQorICByZXR1cm4gREFHLlVucm9sbFZlY3Rvck9wKE9wLmdldE5vZGUoKSk7Cit9CisKK1NEVmFsdWUgVmVjdG9yTGVnYWxpemVyOjpVbnJvbGxWU0VUQ0MoU0RWYWx1ZSBPcCkgeworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgTnVtRWxlbXMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICBTRFZhbHVlIExIUyA9IE9wLmdldE9wZXJhbmQoMCksIFJIUyA9IE9wLmdldE9wZXJhbmQoMSksIENDID0gT3AuZ2V0T3BlcmFuZCgyKTsKKyAgRVZUIFRtcEVsdFZUID0gTEhTLmdldFZhbHVlVHlwZSgpLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzKE51bUVsZW1zKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUVsZW1zOyArK2kpIHsKKyAgICBTRFZhbHVlIExIU0VsZW0gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIFRtcEVsdFZULCBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KGkpKTsKKyAgICBTRFZhbHVlIFJIU0VsZW0gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIFRtcEVsdFZULCBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KGkpKTsKKyAgICBPcHNbaV0gPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFVENDLCBkbCwgVExJLmdldFNldENDUmVzdWx0VHlwZShUbXBFbHRWVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTEhTRWxlbSwgUkhTRWxlbSwgQ0MpOworICAgIE9wc1tpXSA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgRWx0VlQsIE9wc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRWx0VlQuZ2V0U2l6ZUluQml0cygpKSwgRWx0VlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBFbHRWVCkpOworICB9CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIFZULCAmT3BzWzBdLCBOdW1FbGVtcyk7Cit9CisKK30KKworYm9vbCBTZWxlY3Rpb25EQUc6OkxlZ2FsaXplVmVjdG9ycygpIHsKKyAgcmV0dXJuIFZlY3RvckxlZ2FsaXplcigqdGhpcykuUnVuKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvTGVnYWxpemVWZWN0b3JUeXBlcy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvTGVnYWxpemVWZWN0b3JUeXBlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhZWZmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9MZWdhbGl6ZVZlY3RvclR5cGVzLmNwcApAQCAtMCwwICsxLDI1MzggQEAKKy8vPT09LS0tLS0tLSBMZWdhbGl6ZVZlY3RvclR5cGVzLmNwcCAtIExlZ2FsaXphdGlvbiBvZiB2ZWN0b3IgdHlwZXMgLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHBlcmZvcm1zIHZlY3RvciB0eXBlIHNwbGl0dGluZyBhbmQgc2NhbGFyaXphdGlvbiBmb3IgTGVnYWxpemVUeXBlcy4KKy8vIFNjYWxhcml6YXRpb24gaXMgdGhlIGFjdCBvZiBjaGFuZ2luZyBhIGNvbXB1dGF0aW9uIGluIGFuIGlsbGVnYWwgb25lLWVsZW1lbnQKKy8vIHZlY3RvciB0eXBlIHRvIGJlIGEgY29tcHV0YXRpb24gaW4gaXRzIHNjYWxhciBlbGVtZW50IHR5cGUuICBGb3IgZXhhbXBsZSwKKy8vIGltcGxlbWVudGluZyA8MSB4IGYzMj4gYXJpdGhtZXRpYyBpbiBhIHNjYWxhciBmMzIgcmVnaXN0ZXIuICBUaGlzIGlzIG5lZWRlZAorLy8gYXMgYSBiYXNlIGNhc2Ugd2hlbiBzY2FsYXJpemluZyB2ZWN0b3IgYXJpdGhtZXRpYyBsaWtlIDw0IHggZjMyPiwgd2hpY2gKKy8vIGV2ZW50dWFsbHkgZGVjb21wb3NlcyB0byBzY2FsYXJzIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBzdXBwb3J0IHY0ZjMyIG9yIHYyZjMyCisvLyB0eXBlcy4KKy8vIFNwbGl0dGluZyBpcyB0aGUgYWN0IG9mIGNoYW5naW5nIGEgY29tcHV0YXRpb24gaW4gYW4gaW52YWxpZCB2ZWN0b3IgdHlwZSB0bworLy8gYmUgYSBjb21wdXRhdGlvbiBpbiB0d28gdmVjdG9ycyBvZiBoYWxmIHRoZSBzaXplLiAgRm9yIGV4YW1wbGUsIGltcGxlbWVudGluZworLy8gPDEyOCB4IGYzMj4gb3BlcmF0aW9ucyBpbiB0ZXJtcyBvZiB0d28gPDY0IHggZjMyPiBvcGVyYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJMZWdhbGl6ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBSZXN1bHQgVmVjdG9yIFNjYWxhcml6YXRpb246IDwxIHggdHk+IC0+IHR5LgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTY2FsYXJpemVWZWN0b3JSZXN1bHQoU0ROb2RlICpOLCB1bnNpZ25lZCBSZXNObykgeworICBERUJVRyhkYmdzKCkgPDwgIlNjYWxhcml6ZSBub2RlIHJlc3VsdCAiIDw8IFJlc05vIDw8ICI6ICI7CisgICAgICAgIE4tPmR1bXAoJkRBRyk7CisgICAgICAgIGRiZ3MoKSA8PCAiXG4iKTsKKyAgU0RWYWx1ZSBSID0gU0RWYWx1ZSgpOworCisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyNpZm5kZWYgTkRFQlVHCisgICAgZGJncygpIDw8ICJTY2FsYXJpemVWZWN0b3JSZXN1bHQgIyIgPDwgUmVzTm8gPDwgIjogIjsKKyAgICBOLT5kdW1wKCZEQUcpOworICAgIGRiZ3MoKSA8PCAiXG4iOworI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgiRG8gbm90IGtub3cgaG93IHRvIHNjYWxhcml6ZSB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0b3IhIik7CisKKyAgY2FzZSBJU0Q6OkJJVF9DT05WRVJUOiAgICAgICBSID0gU2NhbGFyaXplVmVjUmVzX0JJVF9DT05WRVJUKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkJVSUxEX1ZFQ1RPUjogICAgICBSID0gTi0+Z2V0T3BlcmFuZCgwKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpDT05WRVJUX1JORFNBVDogICAgUiA9IFNjYWxhcml6ZVZlY1Jlc19DT05WRVJUX1JORFNBVChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUjogUiA9IFNjYWxhcml6ZVZlY1Jlc19FWFRSQUNUX1NVQlZFQ1RPUihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpGUF9ST1VORF9JTlJFRzogICAgUiA9IFNjYWxhcml6ZVZlY1Jlc19JbnJlZ09wKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZQT1dJOiAgICAgICAgICAgICBSID0gU2NhbGFyaXplVmVjUmVzX0ZQT1dJKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OklOU0VSVF9WRUNUT1JfRUxUOiBSID0gU2NhbGFyaXplVmVjUmVzX0lOU0VSVF9WRUNUT1JfRUxUKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkxPQUQ6ICAgICAgICAgICBSID0gU2NhbGFyaXplVmVjUmVzX0xPQUQoY2FzdDxMb2FkU0ROb2RlPihOKSk7YnJlYWs7CisgIGNhc2UgSVNEOjpTQ0FMQVJfVE9fVkVDVE9SOiAgUiA9IFNjYWxhcml6ZVZlY1Jlc19TQ0FMQVJfVE9fVkVDVE9SKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EX0lOUkVHOiBSID0gU2NhbGFyaXplVmVjUmVzX0lucmVnT3AoTik7IGJyZWFrOworICBjYXNlIElTRDo6U0VMRUNUOiAgICAgICAgICAgIFIgPSBTY2FsYXJpemVWZWNSZXNfU0VMRUNUKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzogICAgICAgICBSID0gU2NhbGFyaXplVmVjUmVzX1NFTEVDVF9DQyhOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRDQzogICAgICAgICAgICAgUiA9IFNjYWxhcml6ZVZlY1Jlc19TRVRDQyhOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpVTkRFRjogICAgICAgICAgICAgUiA9IFNjYWxhcml6ZVZlY1Jlc19VTkRFRihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpWRUNUT1JfU0hVRkZMRTogICAgUiA9IFNjYWxhcml6ZVZlY1Jlc19WRUNUT1JfU0hVRkZMRShOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpWU0VUQ0M6ICAgICAgICAgICAgUiA9IFNjYWxhcml6ZVZlY1Jlc19WU0VUQ0MoTik7IGJyZWFrOworCisgIGNhc2UgSVNEOjpDVExaOgorICBjYXNlIElTRDo6Q1RQT1A6CisgIGNhc2UgSVNEOjpDVFRaOgorICBjYXNlIElTRDo6RkFCUzoKKyAgY2FzZSBJU0Q6OkZDT1M6CisgIGNhc2UgSVNEOjpGTkVHOgorICBjYXNlIElTRDo6RlBfVE9fU0lOVDoKKyAgY2FzZSBJU0Q6OkZQX1RPX1VJTlQ6CisgIGNhc2UgSVNEOjpGU0lOOgorICBjYXNlIElTRDo6RlNRUlQ6CisgIGNhc2UgSVNEOjpGVFJVTkM6CisgIGNhc2UgSVNEOjpGRkxPT1I6CisgIGNhc2UgSVNEOjpGQ0VJTDoKKyAgY2FzZSBJU0Q6OkZSSU5UOgorICBjYXNlIElTRDo6Rk5FQVJCWUlOVDoKKyAgY2FzZSBJU0Q6OlVJTlRfVE9fRlA6CisgIGNhc2UgSVNEOjpTSU5UX1RPX0ZQOgorICBjYXNlIElTRDo6VFJVTkNBVEU6CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORDoKKyAgY2FzZSBJU0Q6OlpFUk9fRVhURU5EOgorICBjYXNlIElTRDo6QU5ZX0VYVEVORDoKKyAgICBSID0gU2NhbGFyaXplVmVjUmVzX1VuYXJ5T3AoTik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OkFERDoKKyAgY2FzZSBJU0Q6OkFORDoKKyAgY2FzZSBJU0Q6OkZBREQ6CisgIGNhc2UgSVNEOjpGRElWOgorICBjYXNlIElTRDo6Rk1VTDoKKyAgY2FzZSBJU0Q6OkZQT1c6CisgIGNhc2UgSVNEOjpGUkVNOgorICBjYXNlIElTRDo6RlNVQjoKKyAgY2FzZSBJU0Q6Ok1VTDoKKyAgY2FzZSBJU0Q6Ok9SOgorICBjYXNlIElTRDo6U0RJVjoKKyAgY2FzZSBJU0Q6OlNSRU06CisgIGNhc2UgSVNEOjpTVUI6CisgIGNhc2UgSVNEOjpVRElWOgorICBjYXNlIElTRDo6VVJFTToKKyAgY2FzZSBJU0Q6OlhPUjoKKyAgY2FzZSBJU0Q6OlNITDoKKyAgY2FzZSBJU0Q6OlNSQToKKyAgY2FzZSBJU0Q6OlNSTDoKKyAgICBSID0gU2NhbGFyaXplVmVjUmVzX0Jpbk9wKE4pOworICAgIGJyZWFrOworICB9CisKKyAgLy8gSWYgUiBpcyBudWxsLCB0aGUgc3ViLW1ldGhvZCB0b29rIGNhcmUgb2YgcmVnaXN0ZXJpbmcgdGhlIHJlc3VsdC4KKyAgaWYgKFIuZ2V0Tm9kZSgpKQorICAgIFNldFNjYWxhcml6ZWRWZWN0b3IoU0RWYWx1ZShOLCBSZXNObyksIFIpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19CaW5PcChTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBMSFMgPSBHZXRTY2FsYXJpemVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIFJIUyA9IEdldFNjYWxhcml6ZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgxKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIExIUy5nZXRWYWx1ZVR5cGUoKSwgTEhTLCBSSFMpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19CSVRfQ09OVkVSVChTRE5vZGUgKk4pIHsKKyAgRVZUIE5ld1ZUID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgTmV3VlQsIE4tPmdldE9wZXJhbmQoMCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19DT05WRVJUX1JORFNBVChTRE5vZGUgKk4pIHsKKyAgRVZUIE5ld1ZUID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIFNEVmFsdWUgT3AwID0gR2V0U2NhbGFyaXplZFZlY3RvcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIERBRy5nZXRDb252ZXJ0Um5kU2F0KE5ld1ZULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AwLCBEQUcuZ2V0VmFsdWVUeXBlKE5ld1ZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWYWx1ZVR5cGUoT3AwLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDdnRSbmRTYXRTRE5vZGU+KE4pLT5nZXRDdnRDb2RlKCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19FWFRSQUNUX1NVQlZFQ1RPUihTRE5vZGUgKk4pIHsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3RvckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTY2FsYXJpemVWZWNSZXNfRlBPV0koU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgT3AgPSBHZXRTY2FsYXJpemVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGUE9XSSwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIE9wLmdldFZhbHVlVHlwZSgpLCBPcCwgTi0+Z2V0T3BlcmFuZCgxKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U2NhbGFyaXplVmVjUmVzX0lOU0VSVF9WRUNUT1JfRUxUKFNETm9kZSAqTikgeworICAvLyBUaGUgdmFsdWUgdG8gaW5zZXJ0IG1heSBoYXZlIGEgd2lkZXIgdHlwZSB0aGFuIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlLAorICAvLyBzbyBiZSBzdXJlIHRvIHRydW5jYXRlIGl0IHRvIHRoZSBlbGVtZW50IHR5cGUgaWYgbmVjZXNzYXJ5LgorICBTRFZhbHVlIE9wID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgRVZUIEVsdFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIGlmIChPcC5nZXRWYWx1ZVR5cGUoKSAhPSBFbHRWVCkKKyAgICAvLyBGSVhNRTogQ2FuIHRoaXMgaGFwcGVuIGZvciBmbG9hdGluZyBwb2ludCB0eXBlcz8KKyAgICBPcCA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIE4tPmdldERlYnVnTG9jKCksIEVsdFZULCBPcCk7CisgIHJldHVybiBPcDsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTY2FsYXJpemVWZWNSZXNfTE9BRChMb2FkU0ROb2RlICpOKSB7CisgIGFzc2VydChOLT5pc1VuaW5kZXhlZCgpICYmICJJbmRleGVkIHZlY3RvciBsb2FkPyIpOworCisgIFNEVmFsdWUgUmVzdWx0ID0gREFHLmdldExvYWQoSVNEOjpVTklOREVYRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0RXh0ZW5zaW9uVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0Q2hhaW4oKSwgTi0+Z2V0QmFzZVB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRVTkRFRihOLT5nZXRCYXNlUHRyKCkuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFNyY1ZhbHVlKCksIE4tPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0TWVtb3J5VlQoKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmlzVm9sYXRpbGUoKSwgTi0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9yaWdpbmFsQWxpZ25tZW50KCkpOworCisgIC8vIExlZ2FsaXplZCB0aGUgY2hhaW4gcmVzdWx0IC0gc3dpdGNoIGFueXRoaW5nIHRoYXQgdXNlZCB0aGUgb2xkIGNoYWluIHRvCisgIC8vIHVzZSB0aGUgbmV3IG9uZS4KKyAgUmVwbGFjZVZhbHVlV2l0aChTRFZhbHVlKE4sIDEpLCBSZXN1bHQuZ2V0VmFsdWUoMSkpOworICByZXR1cm4gUmVzdWx0OworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19VbmFyeU9wKFNETm9kZSAqTikgeworICAvLyBHZXQgdGhlIGRlc3QgdHlwZSAtIGl0IGRvZXNuJ3QgYWx3YXlzIG1hdGNoIHRoZSBpbnB1dCB0eXBlLCBlLmcuIGludF90b19mcC4KKyAgRVZUIERlc3RWVCA9IE4tPmdldFZhbHVlVHlwZSgwKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICBTRFZhbHVlIE9wID0gR2V0U2NhbGFyaXplZFZlY3RvcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBOLT5nZXREZWJ1Z0xvYygpLCBEZXN0VlQsIE9wKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTY2FsYXJpemVWZWNSZXNfSW5yZWdPcChTRE5vZGUgKk4pIHsKKyAgRVZUIEVsdFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIEVWVCBFeHRWVCA9IGNhc3Q8VlRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpLT5nZXRWVCgpLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIFNEVmFsdWUgTEhTID0gR2V0U2NhbGFyaXplZFZlY3RvcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBOLT5nZXREZWJ1Z0xvYygpLCBFbHRWVCwKKyAgICAgICAgICAgICAgICAgICAgIExIUywgREFHLmdldFZhbHVlVHlwZShFeHRWVCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19TQ0FMQVJfVE9fVkVDVE9SKFNETm9kZSAqTikgeworICAvLyBJZiB0aGUgb3BlcmFuZCBpcyB3aWRlciB0aGFuIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlIHRoZW4gaXQgaXMgaW1wbGljaXRseQorICAvLyB0cnVuY2F0ZWQuICBNYWtlIHRoYXQgZXhwbGljaXQgaGVyZS4KKyAgRVZUIEVsdFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIFNEVmFsdWUgSW5PcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIGlmIChJbk9wLmdldFZhbHVlVHlwZSgpICE9IEVsdFZUKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBOLT5nZXREZWJ1Z0xvYygpLCBFbHRWVCwgSW5PcCk7CisgIHJldHVybiBJbk9wOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19TRUxFQ1QoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTEhTID0gR2V0U2NhbGFyaXplZFZlY3RvcihOLT5nZXRPcGVyYW5kKDEpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgTEhTLmdldFZhbHVlVHlwZSgpLCBOLT5nZXRPcGVyYW5kKDApLCBMSFMsCisgICAgICAgICAgICAgICAgICAgICBHZXRTY2FsYXJpemVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMikpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpTY2FsYXJpemVWZWNSZXNfU0VMRUNUX0NDKFNETm9kZSAqTikgeworICBTRFZhbHVlIExIUyA9IEdldFNjYWxhcml6ZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgyKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVF9DQywgTi0+Z2V0RGVidWdMb2MoKSwgTEhTLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgIExIUywgR2V0U2NhbGFyaXplZFZlY3RvcihOLT5nZXRPcGVyYW5kKDMpKSwKKyAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoNCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19TRVRDQyhTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBMSFMgPSBHZXRTY2FsYXJpemVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIFJIUyA9IEdldFNjYWxhcml6ZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgxKSk7CisgIERlYnVnTG9jIERMID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBUdXJuIGl0IGludG8gYSBzY2FsYXIgU0VUQ0MuCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNFVENDLCBETCwgTVZUOjppMSwgTEhTLCBSSFMsIE4tPmdldE9wZXJhbmQoMikpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19VTkRFRihTRE5vZGUgKk4pIHsKKyAgcmV0dXJuIERBRy5nZXRVTkRFRihOLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U2NhbGFyaXplVmVjUmVzX1ZFQ1RPUl9TSFVGRkxFKFNETm9kZSAqTikgeworICAvLyBGaWd1cmUgb3V0IGlmIHRoZSBzY2FsYXIgaXMgdGhlIExIUyBvciBSSFMgYW5kIHJldHVybiBpdC4KKyAgU0RWYWx1ZSBBcmcgPSBOLT5nZXRPcGVyYW5kKDIpLmdldE9wZXJhbmQoMCk7CisgIGlmIChBcmcuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gREFHLmdldFVOREVGKE4tPmdldFZhbHVlVHlwZSgwKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpKTsKKyAgdW5zaWduZWQgT3AgPSAhY2FzdDxDb25zdGFudFNETm9kZT4oQXJnKS0+aXNOdWxsVmFsdWUoKTsKKyAgcmV0dXJuIEdldFNjYWxhcml6ZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZChPcCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY1Jlc19WU0VUQ0MoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgTEhTID0gR2V0U2NhbGFyaXplZFZlY3RvcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgU0RWYWx1ZSBSSFMgPSBHZXRTY2FsYXJpemVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMSkpOworICBFVlQgTlZUID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIEVWVCBTVlQgPSBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKExIUy5nZXRWYWx1ZVR5cGUoKSk7CisgIERlYnVnTG9jIERMID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBUdXJuIGl0IGludG8gYSBzY2FsYXIgU0VUQ0MuCisgIFNEVmFsdWUgUmVzID0gREFHLmdldE5vZGUoSVNEOjpTRVRDQywgREwsIFNWVCwgTEhTLCBSSFMsIE4tPmdldE9wZXJhbmQoMikpOworCisgIC8vIFZTRVRDQyBhbHdheXMgcmV0dXJucyBhIHNpZ24tZXh0ZW5kZWQgdmFsdWUsIHdoaWxlIFNFVENDIG1heSBub3QuICBUaGUKKyAgLy8gU0VUQ0MgcmVzdWx0IHR5cGUgbWF5IG5vdCBtYXRjaCB0aGUgdmVjdG9yIGVsZW1lbnQgdHlwZS4gIENvcnJlY3QgdGhlc2UuCisgIGlmIChOVlQuYml0c0xFKFNWVCkpIHsKKyAgICAvLyBUaGUgU0VUQ0MgcmVzdWx0IHR5cGUgaXMgYmlnZ2VyIHRoYW4gdGhlIHZlY3RvciBlbGVtZW50IHR5cGUuCisgICAgLy8gRW5zdXJlIHRoZSBTRVRDQyByZXN1bHQgaXMgc2lnbi1leHRlbmRlZC4KKyAgICBpZiAoVExJLmdldEJvb2xlYW5Db250ZW50cygpICE9CisgICAgICAgIFRhcmdldExvd2VyaW5nOjpaZXJvT3JOZWdhdGl2ZU9uZUJvb2xlYW5Db250ZW50KQorICAgICAgUmVzID0gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORF9JTlJFRywgREwsIFNWVCwgUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShNVlQ6OmkxKSk7CisgICAgLy8gVHJ1bmNhdGUgdG8gdGhlIGZpbmFsIHR5cGUuCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIERMLCBOVlQsIFJlcyk7CisgIH0KKworICAvLyBUaGUgU0VUQ0MgcmVzdWx0IHR5cGUgaXMgc21hbGxlciB0aGFuIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlLgorICAvLyBJZiB0aGUgU2V0Q0MgcmVzdWx0IGlzIG5vdCBzaWduLWV4dGVuZGVkLCBjaG9wIGl0IGRvd24gdG8gTVZUOjppMS4KKyAgaWYgKFRMSS5nZXRCb29sZWFuQ29udGVudHMoKSAhPQorICAgICAgICBUYXJnZXRMb3dlcmluZzo6WmVyb09yTmVnYXRpdmVPbmVCb29sZWFuQ29udGVudCkKKyAgICBSZXMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBETCwgTVZUOjppMSwgUmVzKTsKKyAgLy8gU2lnbiBleHRlbmQgdG8gdGhlIGZpbmFsIHR5cGUuCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBETCwgTlZULCBSZXMpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgT3BlcmFuZCBWZWN0b3IgU2NhbGFyaXphdGlvbiA8MSB4IHR5PiAtPiB0eS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2Jvb2wgREFHVHlwZUxlZ2FsaXplcjo6U2NhbGFyaXplVmVjdG9yT3BlcmFuZChTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pIHsKKyAgREVCVUcoZGJncygpIDw8ICJTY2FsYXJpemUgbm9kZSBvcGVyYW5kICIgPDwgT3BObyA8PCAiOiAiOworICAgICAgICBOLT5kdW1wKCZEQUcpOworICAgICAgICBkYmdzKCkgPDwgIlxuIik7CisgIFNEVmFsdWUgUmVzID0gU0RWYWx1ZSgpOworCisgIGlmIChSZXMuZ2V0Tm9kZSgpID09IDApIHsKKyAgICBzd2l0Y2ggKE4tPmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDoKKyNpZm5kZWYgTkRFQlVHCisgICAgICBkYmdzKCkgPDwgIlNjYWxhcml6ZVZlY3Rvck9wZXJhbmQgT3AgIyIgPDwgT3BObyA8PCAiOiAiOworICAgICAgTi0+ZHVtcCgmREFHKTsKKyAgICAgIGRiZ3MoKSA8PCAiXG4iOworI2VuZGlmCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJEbyBub3Qga25vdyBob3cgdG8gc2NhbGFyaXplIHRoaXMgb3BlcmF0b3IncyBvcGVyYW5kISIpOworICAgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDoKKyAgICAgIFJlcyA9IFNjYWxhcml6ZVZlY09wX0JJVF9DT05WRVJUKE4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOgorICAgICAgUmVzID0gU2NhbGFyaXplVmVjT3BfQ09OQ0FUX1ZFQ1RPUlMoTik7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6RVhUUkFDVF9WRUNUT1JfRUxUOgorICAgICAgUmVzID0gU2NhbGFyaXplVmVjT3BfRVhUUkFDVF9WRUNUT1JfRUxUKE4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNUT1JFOgorICAgICAgUmVzID0gU2NhbGFyaXplVmVjT3BfU1RPUkUoY2FzdDxTdG9yZVNETm9kZT4oTiksIE9wTm8pOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIHJlc3VsdCBpcyBudWxsLCB0aGUgc3ViLW1ldGhvZCB0b29rIGNhcmUgb2YgcmVnaXN0ZXJpbmcgcmVzdWx0cyBldGMuCisgIGlmICghUmVzLmdldE5vZGUoKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHRoZSByZXN1bHQgaXMgTiwgdGhlIHN1Yi1tZXRob2QgdXBkYXRlZCBOIGluIHBsYWNlLiAgVGVsbCB0aGUgbGVnYWxpemVyCisgIC8vIGNvcmUgYWJvdXQgdGhpcy4KKyAgaWYgKFJlcy5nZXROb2RlKCkgPT0gTikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBhc3NlcnQoUmVzLmdldFZhbHVlVHlwZSgpID09IE4tPmdldFZhbHVlVHlwZSgwKSAmJiBOLT5nZXROdW1WYWx1ZXMoKSA9PSAxICYmCisgICAgICAgICAiSW52YWxpZCBvcGVyYW5kIGV4cGFuc2lvbiIpOworCisgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCAwKSwgUmVzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gU2NhbGFyaXplVmVjT3BfQklUX0NPTlZFUlQgLSBJZiB0aGUgdmFsdWUgdG8gY29udmVydCBpcyBhIHZlY3RvciB0aGF0IG5lZWRzCisvLy8gdG8gYmUgc2NhbGFyaXplZCwgaXQgbXVzdCBiZSA8MSB4IHR5Pi4gIENvbnZlcnQgdGhlIGVsZW1lbnQgaW5zdGVhZC4KK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U2NhbGFyaXplVmVjT3BfQklUX0NPTlZFUlQoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgRWx0ID0gR2V0U2NhbGFyaXplZFZlY3RvcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBOLT5nZXRWYWx1ZVR5cGUoMCksIEVsdCk7Cit9CisKKy8vLyBTY2FsYXJpemVWZWNPcF9DT05DQVRfVkVDVE9SUyAtIFRoZSB2ZWN0b3JzIHRvIGNvbmNhdGVuYXRlIGhhdmUgbGVuZ3RoIG9uZSAtCisvLy8gdXNlIGEgQlVJTERfVkVDVE9SIGluc3RlYWQuCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY09wX0NPTkNBVF9WRUNUT1JTKFNETm9kZSAqTikgeworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHMoTi0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1PcGVyYW5kcygpOyBpIDwgZTsgKytpKQorICAgIE9wc1tpXSA9IEdldFNjYWxhcml6ZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZChpKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgTi0+Z2V0RGVidWdMb2MoKSwgTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgJk9wc1swXSwgT3BzLnNpemUoKSk7Cit9CisKKy8vLyBTY2FsYXJpemVWZWNPcF9FWFRSQUNUX1ZFQ1RPUl9FTFQgLSBJZiB0aGUgaW5wdXQgaXMgYSB2ZWN0b3IgdGhhdCBuZWVkcyB0bworLy8vIGJlIHNjYWxhcml6ZWQsIGl0IG11c3QgYmUgPDEgeCB0eT4sIHNvIGp1c3QgcmV0dXJuIHRoZSBlbGVtZW50LCBpZ25vcmluZyB0aGUKKy8vLyBpbmRleC4KK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U2NhbGFyaXplVmVjT3BfRVhUUkFDVF9WRUNUT1JfRUxUKFNETm9kZSAqTikgeworICBTRFZhbHVlIFJlcyA9IEdldFNjYWxhcml6ZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIGlmIChSZXMuZ2V0VmFsdWVUeXBlKCkgIT0gTi0+Z2V0VmFsdWVUeXBlKDApKQorICAgIFJlcyA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgTi0+Z2V0RGVidWdMb2MoKSwgTi0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgIFJlcyk7CisgIHJldHVybiBSZXM7Cit9CisKKy8vLyBTY2FsYXJpemVWZWNPcF9TVE9SRSAtIElmIHRoZSB2YWx1ZSB0byBzdG9yZSBpcyBhIHZlY3RvciB0aGF0IG5lZWRzIHRvIGJlCisvLy8gc2NhbGFyaXplZCwgaXQgbXVzdCBiZSA8MSB4IHR5Pi4gIEp1c3Qgc3RvcmUgdGhlIGVsZW1lbnQuCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNjYWxhcml6ZVZlY09wX1NUT1JFKFN0b3JlU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKXsKKyAgYXNzZXJ0KE4tPmlzVW5pbmRleGVkKCkgJiYgIkluZGV4ZWQgc3RvcmUgb2Ygb25lLWVsZW1lbnQgdmVjdG9yPyIpOworICBhc3NlcnQoT3BObyA9PSAxICYmICJEbyBub3Qga25vdyBob3cgdG8gc2NhbGFyaXplIHRoaXMgb3BlcmFuZCEiKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIGlmIChOLT5pc1RydW5jYXRpbmdTdG9yZSgpKQorICAgIHJldHVybiBEQUcuZ2V0VHJ1bmNTdG9yZShOLT5nZXRDaGFpbigpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2NhbGFyaXplZFZlY3RvcihOLT5nZXRPcGVyYW5kKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0QmFzZVB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRTcmNWYWx1ZSgpLCBOLT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRNZW1vcnlWVCgpLmdldFZlY3RvckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmlzVm9sYXRpbGUoKSwgTi0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRBbGlnbm1lbnQoKSk7CisKKyAgcmV0dXJuIERBRy5nZXRTdG9yZShOLT5nZXRDaGFpbigpLCBkbCwgR2V0U2NhbGFyaXplZFZlY3RvcihOLT5nZXRPcGVyYW5kKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRCYXNlUHRyKCksIE4tPmdldFNyY1ZhbHVlKCksIE4tPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgTi0+aXNWb2xhdGlsZSgpLCBOLT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3JpZ2luYWxBbGlnbm1lbnQoKSk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBSZXN1bHQgVmVjdG9yIFNwbGl0dGluZworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFNwbGl0VmVjdG9yUmVzdWx0IC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHNwZWNpZmllZCByZXN1bHQgb2YgdGhlCisvLy8gc3BlY2lmaWVkIG5vZGUgaXMgZm91bmQgdG8gbmVlZCB2ZWN0b3Igc3BsaXR0aW5nLiAgQXQgdGhpcyBwb2ludCwgdGhlIG5vZGUKKy8vLyBtYXkgYWxzbyBoYXZlIGludmFsaWQgb3BlcmFuZHMgb3IgbWF5IGhhdmUgb3RoZXIgcmVzdWx0cyB0aGF0IG5lZWQKKy8vLyBsZWdhbGl6YXRpb24sIHdlIGp1c3Qga25vdyB0aGF0IChhdCBsZWFzdCkgb25lIHJlc3VsdCBuZWVkcyB2ZWN0b3IKKy8vLyBzcGxpdHRpbmcuCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OlNwbGl0VmVjdG9yUmVzdWx0KFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTm8pIHsKKyAgREVCVUcoZGJncygpIDw8ICJTcGxpdCBub2RlIHJlc3VsdDogIjsKKyAgICAgICAgTi0+ZHVtcCgmREFHKTsKKyAgICAgICAgZGJncygpIDw8ICJcbiIpOworICBTRFZhbHVlIExvLCBIaTsKKworICBzd2l0Y2ggKE4tPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6CisjaWZuZGVmIE5ERUJVRworICAgIGRiZ3MoKSA8PCAiU3BsaXRWZWN0b3JSZXN1bHQgIyIgPDwgUmVzTm8gPDwgIjogIjsKKyAgICBOLT5kdW1wKCZEQUcpOworICAgIGRiZ3MoKSA8PCAiXG4iOworI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgiRG8gbm90IGtub3cgaG93IHRvIHNwbGl0IHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRvciEiKTsKKworICBjYXNlIElTRDo6TUVSR0VfVkFMVUVTOiBTcGxpdFJlc19NRVJHRV9WQUxVRVMoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRUxFQ1Q6ICAgICAgIFNwbGl0UmVzX1NFTEVDVChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzogICAgU3BsaXRSZXNfU0VMRUNUX0NDKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6VU5ERUY6ICAgICAgICBTcGxpdFJlc19VTkRFRihOLCBMbywgSGkpOyBicmVhazsKKworICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6ICAgICAgIFNwbGl0VmVjUmVzX0JJVF9DT05WRVJUKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6QlVJTERfVkVDVE9SOiAgICAgIFNwbGl0VmVjUmVzX0JVSUxEX1ZFQ1RPUihOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOiAgICBTcGxpdFZlY1Jlc19DT05DQVRfVkVDVE9SUyhOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkNPTlZFUlRfUk5EU0FUOiAgICBTcGxpdFZlY1Jlc19DT05WRVJUX1JORFNBVChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SOiBTcGxpdFZlY1Jlc19FWFRSQUNUX1NVQlZFQ1RPUihOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZQX1JPVU5EX0lOUkVHOiAgICBTcGxpdFZlY1Jlc19JbnJlZ09wKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6RlBPV0k6ICAgICAgICAgICAgIFNwbGl0VmVjUmVzX0ZQT1dJKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQ6IFNwbGl0VmVjUmVzX0lOU0VSVF9WRUNUT1JfRUxUKE4sIExvLCBIaSk7IGJyZWFrOworICBjYXNlIElTRDo6U0NBTEFSX1RPX1ZFQ1RPUjogIFNwbGl0VmVjUmVzX1NDQUxBUl9UT19WRUNUT1IoTiwgTG8sIEhpKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORF9JTlJFRzogU3BsaXRWZWNSZXNfSW5yZWdPcChOLCBMbywgSGkpOyBicmVhazsKKyAgY2FzZSBJU0Q6OkxPQUQ6CisgICAgU3BsaXRWZWNSZXNfTE9BRChjYXN0PExvYWRTRE5vZGU+KE4pLCBMbywgSGkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUQ0M6CisgIGNhc2UgSVNEOjpWU0VUQ0M6CisgICAgU3BsaXRWZWNSZXNfU0VUQ0MoTiwgTG8sIEhpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlZFQ1RPUl9TSFVGRkxFOgorICAgIFNwbGl0VmVjUmVzX1ZFQ1RPUl9TSFVGRkxFKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTiksIExvLCBIaSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OkNUVFo6CisgIGNhc2UgSVNEOjpDVExaOgorICBjYXNlIElTRDo6Q1RQT1A6CisgIGNhc2UgSVNEOjpGTkVHOgorICBjYXNlIElTRDo6RkFCUzoKKyAgY2FzZSBJU0Q6OkZTUVJUOgorICBjYXNlIElTRDo6RlNJTjoKKyAgY2FzZSBJU0Q6OkZDT1M6CisgIGNhc2UgSVNEOjpGVFJVTkM6CisgIGNhc2UgSVNEOjpGRkxPT1I6CisgIGNhc2UgSVNEOjpGQ0VJTDoKKyAgY2FzZSBJU0Q6OkZSSU5UOgorICBjYXNlIElTRDo6Rk5FQVJCWUlOVDoKKyAgY2FzZSBJU0Q6OkZQX1RPX1NJTlQ6CisgIGNhc2UgSVNEOjpGUF9UT19VSU5UOgorICBjYXNlIElTRDo6U0lOVF9UT19GUDoKKyAgY2FzZSBJU0Q6OlVJTlRfVE9fRlA6CisgIGNhc2UgSVNEOjpUUlVOQ0FURToKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOgorICBjYXNlIElTRDo6WkVST19FWFRFTkQ6CisgIGNhc2UgSVNEOjpBTllfRVhURU5EOgorICBjYXNlIElTRDo6RkVYUDoKKyAgY2FzZSBJU0Q6OkZFWFAyOgorICBjYXNlIElTRDo6RkxPRzoKKyAgY2FzZSBJU0Q6OkZMT0cyOgorICBjYXNlIElTRDo6RkxPRzEwOgorICAgIFNwbGl0VmVjUmVzX1VuYXJ5T3AoTiwgTG8sIEhpKTsKKyAgICBicmVhazsKKworICBjYXNlIElTRDo6QUREOgorICBjYXNlIElTRDo6U1VCOgorICBjYXNlIElTRDo6TVVMOgorICBjYXNlIElTRDo6RkFERDoKKyAgY2FzZSBJU0Q6OkZTVUI6CisgIGNhc2UgSVNEOjpGTVVMOgorICBjYXNlIElTRDo6U0RJVjoKKyAgY2FzZSBJU0Q6OlVESVY6CisgIGNhc2UgSVNEOjpGRElWOgorICBjYXNlIElTRDo6RlBPVzoKKyAgY2FzZSBJU0Q6OkFORDoKKyAgY2FzZSBJU0Q6Ok9SOgorICBjYXNlIElTRDo6WE9SOgorICBjYXNlIElTRDo6U0hMOgorICBjYXNlIElTRDo6U1JBOgorICBjYXNlIElTRDo6U1JMOgorICBjYXNlIElTRDo6VVJFTToKKyAgY2FzZSBJU0Q6OlNSRU06CisgIGNhc2UgSVNEOjpGUkVNOgorICAgIFNwbGl0VmVjUmVzX0Jpbk9wKE4sIExvLCBIaSk7CisgICAgYnJlYWs7CisgIH0KKworICAvLyBJZiBMby9IaSBpcyBudWxsLCB0aGUgc3ViLW1ldGhvZCB0b29rIGNhcmUgb2YgcmVnaXN0ZXJpbmcgcmVzdWx0cyBldGMuCisgIGlmIChMby5nZXROb2RlKCkpCisgICAgU2V0U3BsaXRWZWN0b3IoU0RWYWx1ZShOLCBSZXNObyksIExvLCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNSZXNfQmluT3AoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgU0RWYWx1ZSBMSFNMbywgTEhTSGk7CisgIEdldFNwbGl0VmVjdG9yKE4tPmdldE9wZXJhbmQoMCksIExIU0xvLCBMSFNIaSk7CisgIFNEVmFsdWUgUkhTTG8sIFJIU0hpOworICBHZXRTcGxpdFZlY3RvcihOLT5nZXRPcGVyYW5kKDEpLCBSSFNMbywgUkhTSGkpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgTG8gPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgZGwsIExIU0xvLmdldFZhbHVlVHlwZSgpLCBMSFNMbywgUkhTTG8pOworICBIaSA9IERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBkbCwgTEhTSGkuZ2V0VmFsdWVUeXBlKCksIExIU0hpLCBSSFNIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNSZXNfQklUX0NPTlZFUlQoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgLy8gV2Uga25vdyB0aGUgcmVzdWx0IGlzIGEgdmVjdG9yLiAgVGhlIGlucHV0IG1heSBiZSBlaXRoZXIgYSB2ZWN0b3Igb3IgYQorICAvLyBzY2FsYXIgdmFsdWUuCisgIEVWVCBMb1ZULCBIaVZUOworICBHZXRTcGxpdERlc3RWVHMoTi0+Z2V0VmFsdWVUeXBlKDApLCBMb1ZULCBIaVZUKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIFNEVmFsdWUgSW5PcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIEVWVCBJblZUID0gSW5PcC5nZXRWYWx1ZVR5cGUoKTsKKworICAvLyBIYW5kbGUgc29tZSBzcGVjaWFsIGNhc2VzIGVmZmljaWVudGx5LgorICBzd2l0Y2ggKGdldFR5cGVBY3Rpb24oSW5WVCkpIHsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoZmFsc2UgJiYgIlVua25vd24gdHlwZSBhY3Rpb24hIik7CisgIGNhc2UgTGVnYWw6CisgIGNhc2UgUHJvbW90ZUludGVnZXI6CisgIGNhc2UgU29mdGVuRmxvYXQ6CisgIGNhc2UgU2NhbGFyaXplVmVjdG9yOgorICAgIGJyZWFrOworICBjYXNlIEV4cGFuZEludGVnZXI6CisgIGNhc2UgRXhwYW5kRmxvYXQ6CisgICAgLy8gQSBzY2FsYXIgdG8gdmVjdG9yIGNvbnZlcnNpb24sIHdoZXJlIHRoZSBzY2FsYXIgbmVlZHMgZXhwYW5zaW9uLgorICAgIC8vIElmIHRoZSB2ZWN0b3IgaXMgYmVpbmcgc3BsaXQgaW4gdHdvIHRoZW4gd2UgY2FuIGp1c3QgY29udmVydCB0aGUKKyAgICAvLyBleHBhbmRlZCBwaWVjZXMuCisgICAgaWYgKExvVlQgPT0gSGlWVCkgeworICAgICAgR2V0RXhwYW5kZWRPcChJbk9wLCBMbywgSGkpOworICAgICAgaWYgKFRMSS5pc0JpZ0VuZGlhbigpKQorICAgICAgICBzdGQ6OnN3YXAoTG8sIEhpKTsKKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIExvVlQsIExvKTsKKyAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIEhpVlQsIEhpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgU3BsaXRWZWN0b3I6CisgICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgdmVjdG9yIHRoYXQgbmVlZHMgdG8gYmUgc3BsaXQsIGNvbnZlcnQgZWFjaCBzcGxpdAorICAgIC8vIHBpZWNlIG9mIHRoZSBpbnB1dCBub3cuCisgICAgR2V0U3BsaXRWZWN0b3IoSW5PcCwgTG8sIEhpKTsKKyAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBMb1ZULCBMbyk7CisgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgSGlWVCwgSGkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEluIHRoZSBnZW5lcmFsIGNhc2UsIGNvbnZlcnQgdGhlIGlucHV0IHRvIGFuIGludGVnZXIgYW5kIHNwbGl0IGl0IGJ5IGhhbmQuCisgIEVWVCBMb0ludFZUID0gRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksIExvVlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgRVZUIEhpSW50VlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgSGlWVC5nZXRTaXplSW5CaXRzKCkpOworICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpCisgICAgc3RkOjpzd2FwKExvSW50VlQsIEhpSW50VlQpOworCisgIFNwbGl0SW50ZWdlcihCaXRDb252ZXJ0VG9JbnRlZ2VyKEluT3ApLCBMb0ludFZULCBIaUludFZULCBMbywgSGkpOworCisgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICBzdGQ6OnN3YXAoTG8sIEhpKTsKKyAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTG9WVCwgTG8pOworICBIaSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBIaVZULCBIaSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNSZXNfQlVJTERfVkVDVE9SKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBFVlQgTG9WVCwgSGlWVDsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRTcGxpdERlc3RWVHMoTi0+Z2V0VmFsdWVUeXBlKDApLCBMb1ZULCBIaVZUKTsKKyAgdW5zaWduZWQgTG9OdW1FbHRzID0gTG9WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBMb09wcyhOLT5vcF9iZWdpbigpLCBOLT5vcF9iZWdpbigpK0xvTnVtRWx0cyk7CisgIExvID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBMb1ZULCAmTG9PcHNbMF0sIExvT3BzLnNpemUoKSk7CisKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gSGlPcHMoTi0+b3BfYmVnaW4oKStMb051bUVsdHMsIE4tPm9wX2VuZCgpKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIEhpVlQsICZIaU9wc1swXSwgSGlPcHMuc2l6ZSgpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTcGxpdFZlY1Jlc19DT05DQVRfVkVDVE9SUyhTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBhc3NlcnQoIShOLT5nZXROdW1PcGVyYW5kcygpICYgMSkgJiYgIlVuc3VwcG9ydGVkIENPTkNBVF9WRUNUT1JTIik7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgTnVtU3VidmVjdG9ycyA9IE4tPmdldE51bU9wZXJhbmRzKCkgLyAyOworICBpZiAoTnVtU3VidmVjdG9ycyA9PSAxKSB7CisgICAgTG8gPSBOLT5nZXRPcGVyYW5kKDApOworICAgIEhpID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgICByZXR1cm47CisgIH0KKworICBFVlQgTG9WVCwgSGlWVDsKKyAgR2V0U3BsaXREZXN0VlRzKE4tPmdldFZhbHVlVHlwZSgwKSwgTG9WVCwgSGlWVCk7CisKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gTG9PcHMoTi0+b3BfYmVnaW4oKSwgTi0+b3BfYmVnaW4oKStOdW1TdWJ2ZWN0b3JzKTsKKyAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkNPTkNBVF9WRUNUT1JTLCBkbCwgTG9WVCwgJkxvT3BzWzBdLCBMb09wcy5zaXplKCkpOworCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IEhpT3BzKE4tPm9wX2JlZ2luKCkrTnVtU3VidmVjdG9ycywgTi0+b3BfZW5kKCkpOworICBIaSA9IERBRy5nZXROb2RlKElTRDo6Q09OQ0FUX1ZFQ1RPUlMsIGRsLCBIaVZULCAmSGlPcHNbMF0sIEhpT3BzLnNpemUoKSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNSZXNfQ09OVkVSVF9STkRTQVQoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIExvVlQsIEhpVlQ7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgR2V0U3BsaXREZXN0VlRzKE4tPmdldFZhbHVlVHlwZSgwKSwgTG9WVCwgSGlWVCk7CisKKyAgU0RWYWx1ZSBEVHlPcExvID0gIERBRy5nZXRWYWx1ZVR5cGUoTG9WVCk7CisgIFNEVmFsdWUgRFR5T3BIaSA9ICBEQUcuZ2V0VmFsdWVUeXBlKEhpVlQpOworCisgIFNEVmFsdWUgUm5kT3AgPSBOLT5nZXRPcGVyYW5kKDMpOworICBTRFZhbHVlIFNhdE9wID0gTi0+Z2V0T3BlcmFuZCg0KTsKKyAgSVNEOjpDdnRDb2RlIEN2dENvZGUgPSBjYXN0PEN2dFJuZFNhdFNETm9kZT4oTiktPmdldEN2dENvZGUoKTsKKworICAvLyBTcGxpdCB0aGUgaW5wdXQuCisgIFNEVmFsdWUgVkxvLCBWSGk7CisgIEVWVCBJblZUID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgc3dpdGNoIChnZXRUeXBlQWN0aW9uKEluVlQpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgdHlwZSBhY3Rpb24hIik7CisgIGNhc2UgTGVnYWw6IHsKKyAgICBFVlQgSW5OVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBJblZULmdldFZlY3RvckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb1ZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICAgIFZMbyA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLCBJbk5WVCwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICAgIFZIaSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLCBJbk5WVCwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSW5OVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgU3BsaXRWZWN0b3I6CisgICAgR2V0U3BsaXRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSwgVkxvLCBWSGkpOworICAgIGJyZWFrOworICBjYXNlIFdpZGVuVmVjdG9yOiB7CisgICAgLy8gSWYgdGhlIHJlc3VsdCBuZWVkcyB0byBiZSBzcGxpdCBhbmQgdGhlIGlucHV0IG5lZWRzIHRvIGJlIHdpZGVuZWQsCisgICAgLy8gdGhlIHR3byB0eXBlcyBtdXN0IGhhdmUgZGlmZmVyZW50IGxlbmd0aHMuIFVzZSB0aGUgd2lkZW5lZCByZXN1bHQKKyAgICAvLyBhbmQgZXh0cmFjdCBmcm9tIGl0IHRvIGRvIHRoZSBzcGxpdC4KKyAgICBTRFZhbHVlIEluT3AgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICAgIEVWVCBJbk5WVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIEluVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSk7CisgICAgVkxvID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgZGwsIEluTlZULCBJbk9wLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKyAgICBWSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SLCBkbCwgSW5OVlQsIEluT3AsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSW5OVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSkpOworICAgIGJyZWFrOworICB9CisgIH0KKworICBTRFZhbHVlIFNUeU9wTG8gPSAgREFHLmdldFZhbHVlVHlwZShWTG8uZ2V0VmFsdWVUeXBlKCkpOworICBTRFZhbHVlIFNUeU9wSGkgPSAgREFHLmdldFZhbHVlVHlwZShWSGkuZ2V0VmFsdWVUeXBlKCkpOworCisgIExvID0gREFHLmdldENvbnZlcnRSbmRTYXQoTG9WVCwgZGwsIFZMbywgRFR5T3BMbywgU1R5T3BMbywgUm5kT3AsIFNhdE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2dENvZGUpOworICBIaSA9IERBRy5nZXRDb252ZXJ0Um5kU2F0KEhpVlQsIGRsLCBWSGksIERUeU9wSGksIFNUeU9wSGksIFJuZE9wLCBTYXRPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdnRDb2RlKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTcGxpdFZlY1Jlc19FWFRSQUNUX1NVQlZFQ1RPUihTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIFZlYyA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgSWR4ID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgRVZUIElkeFZUID0gSWR4LmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgRVZUIExvVlQsIEhpVlQ7CisgIEdldFNwbGl0RGVzdFZUcyhOLT5nZXRWYWx1ZVR5cGUoMCksIExvVlQsIEhpVlQpOworCisgIExvID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgZGwsIExvVlQsIFZlYywgSWR4KTsKKyAgSWR4ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBJZHhWVCwgSWR4LAorICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTG9WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpLCBJZHhWVCkpOworICBIaSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLCBIaVZULCBWZWMsIElkeCk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNSZXNfRlBPV0koU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRTcGxpdFZlY3RvcihOLT5nZXRPcGVyYW5kKDApLCBMbywgSGkpOworICBMbyA9IERBRy5nZXROb2RlKElTRDo6RlBPV0ksIGRsLCBMby5nZXRWYWx1ZVR5cGUoKSwgTG8sIE4tPmdldE9wZXJhbmQoMSkpOworICBIaSA9IERBRy5nZXROb2RlKElTRDo6RlBPV0ksIGRsLCBIaS5nZXRWYWx1ZVR5cGUoKSwgSGksIE4tPmdldE9wZXJhbmQoMSkpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OlNwbGl0VmVjUmVzX0lucmVnT3AoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZIaSkgeworICBTRFZhbHVlIExIU0xvLCBMSFNIaTsKKyAgR2V0U3BsaXRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSwgTEhTTG8sIExIU0hpKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIEVWVCBMb1ZULCBIaVZUOworICBHZXRTcGxpdERlc3RWVHMoY2FzdDxWVFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldFZUKCksIExvVlQsIEhpVlQpOworCisgIExvID0gREFHLmdldE5vZGUoTi0+Z2V0T3Bjb2RlKCksIGRsLCBMSFNMby5nZXRWYWx1ZVR5cGUoKSwgTEhTTG8sCisgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShMb1ZUKSk7CisgIEhpID0gREFHLmdldE5vZGUoTi0+Z2V0T3Bjb2RlKCksIGRsLCBMSFNIaS5nZXRWYWx1ZVR5cGUoKSwgTEhTSGksCisgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShIaVZUKSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNSZXNfSU5TRVJUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOLCBTRFZhbHVlICZMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgU0RWYWx1ZSBWZWMgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIEVsdCA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgSWR4ID0gTi0+Z2V0T3BlcmFuZCgyKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRTcGxpdFZlY3RvcihWZWMsIExvLCBIaSk7CisKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDSWR4ID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KElkeCkpIHsKKyAgICB1bnNpZ25lZCBJZHhWYWwgPSBDSWR4LT5nZXRaRXh0VmFsdWUoKTsKKyAgICB1bnNpZ25lZCBMb051bUVsdHMgPSBMby5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgIGlmIChJZHhWYWwgPCBMb051bUVsdHMpCisgICAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICBMby5nZXRWYWx1ZVR5cGUoKSwgTG8sIEVsdCwgSWR4KTsKKyAgICBlbHNlCisgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIGRsLCBIaS5nZXRWYWx1ZVR5cGUoKSwgSGksIEVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KElkeFZhbCAtIExvTnVtRWx0cykpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNwaWxsIHRoZSB2ZWN0b3IgdG8gdGhlIHN0YWNrLgorICBFVlQgVmVjVlQgPSBWZWMuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBFbHRWVCA9IFZlY1ZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIFNEVmFsdWUgU3RhY2tQdHIgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoVmVjVlQpOworICBTRFZhbHVlIFN0b3JlID0gREFHLmdldFN0b3JlKERBRy5nZXRFbnRyeU5vZGUoKSwgZGwsIFZlYywgU3RhY2tQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKworICAvLyBTdG9yZSB0aGUgbmV3IGVsZW1lbnQuICBUaGlzIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgdmVjdG9yIGVsZW1lbnQgdHlwZSwKKyAgLy8gc28gdXNlIGEgdHJ1bmNhdGluZyBzdG9yZS4KKyAgU0RWYWx1ZSBFbHRQdHIgPSBHZXRWZWN0b3JFbGVtZW50UG9pbnRlcihTdGFja1B0ciwgRWx0VlQsIElkeCk7CisgIGNvbnN0IFR5cGUgKlZlY1R5cGUgPSBWZWNWVC5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0KKyAgICBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRQcmVmVHlwZUFsaWdubWVudChWZWNUeXBlKTsKKyAgU3RvcmUgPSBEQUcuZ2V0VHJ1bmNTdG9yZShTdG9yZSwgZGwsIEVsdCwgRWx0UHRyLCBOVUxMLCAwLCBFbHRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworCisgIC8vIExvYWQgdGhlIExvIHBhcnQgZnJvbSB0aGUgc3RhY2sgc2xvdC4KKyAgTG8gPSBEQUcuZ2V0TG9hZChMby5nZXRWYWx1ZVR5cGUoKSwgZGwsIFN0b3JlLCBTdGFja1B0ciwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworCisgIC8vIEluY3JlbWVudCB0aGUgcG9pbnRlciB0byB0aGUgb3RoZXIgcGFydC4KKyAgdW5zaWduZWQgSW5jcmVtZW50U2l6ZSA9IExvLmdldFZhbHVlVHlwZSgpLmdldFNpemVJbkJpdHMoKSAvIDg7CisgIFN0YWNrUHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBTdGFja1B0ci5nZXRWYWx1ZVR5cGUoKSwgU3RhY2tQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluY3JlbWVudFNpemUpKTsKKworICAvLyBMb2FkIHRoZSBIaSBwYXJ0IGZyb20gdGhlIHN0YWNrIHNsb3QuCisgIEhpID0gREFHLmdldExvYWQoSGkuZ2V0VmFsdWVUeXBlKCksIGRsLCBTdG9yZSwgU3RhY2tQdHIsIE5VTEwsIDAsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgIGZhbHNlLCBNaW5BbGlnbihBbGlnbm1lbnQsIEluY3JlbWVudFNpemUpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTcGxpdFZlY1Jlc19TQ0FMQVJfVE9fVkVDVE9SKFNETm9kZSAqTiwgU0RWYWx1ZSAmTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIHsKKyAgRVZUIExvVlQsIEhpVlQ7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgR2V0U3BsaXREZXN0VlRzKE4tPmdldFZhbHVlVHlwZSgwKSwgTG9WVCwgSGlWVCk7CisgIExvID0gREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwgTG9WVCwgTi0+Z2V0T3BlcmFuZCgwKSk7CisgIEhpID0gREFHLmdldFVOREVGKEhpVlQpOworfQorCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OlNwbGl0VmVjUmVzX0xPQUQoTG9hZFNETm9kZSAqTEQsIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkhpKSB7CisgIGFzc2VydChJU0Q6OmlzVU5JTkRFWEVETG9hZChMRCkgJiYgIkluZGV4ZWQgbG9hZCBkdXJpbmcgdHlwZSBsZWdhbGl6YXRpb24hIik7CisgIEVWVCBMb1ZULCBIaVZUOworICBEZWJ1Z0xvYyBkbCA9IExELT5nZXREZWJ1Z0xvYygpOworICBHZXRTcGxpdERlc3RWVHMoTEQtPmdldFZhbHVlVHlwZSgwKSwgTG9WVCwgSGlWVCk7CisKKyAgSVNEOjpMb2FkRXh0VHlwZSBFeHRUeXBlID0gTEQtPmdldEV4dGVuc2lvblR5cGUoKTsKKyAgU0RWYWx1ZSBDaCA9IExELT5nZXRDaGFpbigpOworICBTRFZhbHVlIFB0ciA9IExELT5nZXRCYXNlUHRyKCk7CisgIFNEVmFsdWUgT2Zmc2V0ID0gREFHLmdldFVOREVGKFB0ci5nZXRWYWx1ZVR5cGUoKSk7CisgIGNvbnN0IFZhbHVlICpTViA9IExELT5nZXRTcmNWYWx1ZSgpOworICBpbnQgU1ZPZmZzZXQgPSBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKTsKKyAgRVZUIE1lbW9yeVZUID0gTEQtPmdldE1lbW9yeVZUKCk7CisgIHVuc2lnbmVkIEFsaWdubWVudCA9IExELT5nZXRPcmlnaW5hbEFsaWdubWVudCgpOworICBib29sIGlzVm9sYXRpbGUgPSBMRC0+aXNWb2xhdGlsZSgpOworICBib29sIGlzTm9uVGVtcG9yYWwgPSBMRC0+aXNOb25UZW1wb3JhbCgpOworCisgIEVWVCBMb01lbVZULCBIaU1lbVZUOworICBHZXRTcGxpdERlc3RWVHMoTWVtb3J5VlQsIExvTWVtVlQsIEhpTWVtVlQpOworCisgIExvID0gREFHLmdldExvYWQoSVNEOjpVTklOREVYRUQsIEV4dFR5cGUsIExvVlQsIGRsLCBDaCwgUHRyLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgU1YsIFNWT2Zmc2V0LCBMb01lbVZULCBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLCBBbGlnbm1lbnQpOworCisgIHVuc2lnbmVkIEluY3JlbWVudFNpemUgPSBMb01lbVZULmdldFNpemVJbkJpdHMoKS84OworICBQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0ci5nZXRWYWx1ZVR5cGUoKSwgUHRyLAorICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSW5jcmVtZW50U2l6ZSkpOworICBTVk9mZnNldCArPSBJbmNyZW1lbnRTaXplOworICBIaSA9IERBRy5nZXRMb2FkKElTRDo6VU5JTkRFWEVELCBFeHRUeXBlLCBIaVZULCBkbCwgQ2gsIFB0ciwgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIFNWLCBTVk9mZnNldCwgSGlNZW1WVCwgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwgQWxpZ25tZW50KTsKKworICAvLyBCdWlsZCBhIGZhY3RvciBub2RlIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBsb2FkIGlzIGluZGVwZW5kZW50IG9mIHRoZQorICAvLyBvdGhlciBvbmUuCisgIENoID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIExvLmdldFZhbHVlKDEpLAorICAgICAgICAgICAgICAgICAgIEhpLmdldFZhbHVlKDEpKTsKKworICAvLyBMZWdhbGl6ZWQgdGhlIGNoYWluIHJlc3VsdCAtIHN3aXRjaCBhbnl0aGluZyB0aGF0IHVzZWQgdGhlIG9sZCBjaGFpbiB0bworICAvLyB1c2UgdGhlIG5ldyBvbmUuCisgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShMRCwgMSksIENoKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTcGxpdFZlY1Jlc19TRVRDQyhTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSkgeworICBFVlQgTG9WVCwgSGlWVDsKKyAgRGVidWdMb2MgREwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRTcGxpdERlc3RWVHMoTi0+Z2V0VmFsdWVUeXBlKDApLCBMb1ZULCBIaVZUKTsKKworICAvLyBTcGxpdCB0aGUgaW5wdXQuCisgIEVWVCBJblZUID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgU0RWYWx1ZSBMTCwgTEgsIFJMLCBSSDsKKyAgRVZUIEluTlZUID0gRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwgSW5WVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSk7CisgIExMID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgREwsIEluTlZULCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSk7CisgIExIID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgREwsIEluTlZULCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJbk5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpKSk7CisKKyAgUkwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SLCBETCwgSW5OVlQsIE4tPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKyAgUkggPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SLCBETCwgSW5OVlQsIE4tPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluTlZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpKTsKKworICBMbyA9IERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBETCwgTG9WVCwgTEwsIFJMLCBOLT5nZXRPcGVyYW5kKDIpKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgREwsIEhpVlQsIExILCBSSCwgTi0+Z2V0T3BlcmFuZCgyKSk7Cit9CisKK3ZvaWQgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNSZXNfVW5hcnlPcChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkhpKSB7CisgIC8vIEdldCB0aGUgZGVzdCB0eXBlcyAtIHRoZXkgbWF5IG5vdCBtYXRjaCB0aGUgaW5wdXQgdHlwZXMsIGUuZy4gaW50X3RvX2ZwLgorICBFVlQgTG9WVCwgSGlWVDsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBHZXRTcGxpdERlc3RWVHMoTi0+Z2V0VmFsdWVUeXBlKDApLCBMb1ZULCBIaVZUKTsKKworICAvLyBTcGxpdCB0aGUgaW5wdXQuCisgIEVWVCBJblZUID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgc3dpdGNoIChnZXRUeXBlQWN0aW9uKEluVlQpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgdHlwZSBhY3Rpb24hIik7CisgIGNhc2UgTGVnYWw6IHsKKyAgICBFVlQgSW5OVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBJblZULmdldFZlY3RvckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb1ZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgZGwsIEluTlZULCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLCBJbk5WVCwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJbk5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBTcGxpdFZlY3RvcjoKKyAgICBHZXRTcGxpdFZlY3RvcihOLT5nZXRPcGVyYW5kKDApLCBMbywgSGkpOworICAgIGJyZWFrOworICBjYXNlIFdpZGVuVmVjdG9yOiB7CisgICAgLy8gSWYgdGhlIHJlc3VsdCBuZWVkcyB0byBiZSBzcGxpdCBhbmQgdGhlIGlucHV0IG5lZWRzIHRvIGJlIHdpZGVuZWQsCisgICAgLy8gdGhlIHR3byB0eXBlcyBtdXN0IGhhdmUgZGlmZmVyZW50IGxlbmd0aHMuIFVzZSB0aGUgd2lkZW5lZCByZXN1bHQKKyAgICAvLyBhbmQgZXh0cmFjdCBmcm9tIGl0IHRvIGRvIHRoZSBzcGxpdC4KKyAgICBTRFZhbHVlIEluT3AgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICAgIEVWVCBJbk5WVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIEluVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSk7CisgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SLCBkbCwgSW5OVlQsIEluT3AsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgZGwsIEluTlZULCBJbk9wLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluTlZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpKTsKKyAgICBicmVhazsKKyAgfQorICB9CisKKyAgTG8gPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgZGwsIExvVlQsIExvKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgZGwsIEhpVlQsIEhpKTsKK30KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpTcGxpdFZlY1Jlc19WRUNUT1JfU0hVRkZMRShTaHVmZmxlVmVjdG9yU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIHsKKyAgLy8gVGhlIGxvdyBhbmQgaGlnaCBwYXJ0cyBvZiB0aGUgb3JpZ2luYWwgaW5wdXQgZ2l2ZSBmb3VyIGlucHV0IHZlY3RvcnMuCisgIFNEVmFsdWUgSW5wdXRzWzRdOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIEdldFNwbGl0VmVjdG9yKE4tPmdldE9wZXJhbmQoMCksIElucHV0c1swXSwgSW5wdXRzWzFdKTsKKyAgR2V0U3BsaXRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgxKSwgSW5wdXRzWzJdLCBJbnB1dHNbM10pOworICBFVlQgTmV3VlQgPSBJbnB1dHNbMF0uZ2V0VmFsdWVUeXBlKCk7CisgIHVuc2lnbmVkIE5ld0VsdHMgPSBOZXdWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworCisgIC8vIElmIExvIG9yIEhpIHVzZXMgZWxlbWVudHMgZnJvbSBhdCBtb3N0IHR3byBvZiB0aGUgZm91ciBpbnB1dCB2ZWN0b3JzLCB0aGVuCisgIC8vIGV4cHJlc3MgaXQgYXMgYSB2ZWN0b3Igc2h1ZmZsZSBvZiB0aG9zZSB0d28gaW5wdXRzLiAgT3RoZXJ3aXNlIGV4dHJhY3QgdGhlCisgIC8vIGlucHV0IGVsZW1lbnRzIGJ5IGhhbmQgYW5kIGNvbnN0cnVjdCB0aGUgTG8vSGkgb3V0cHV0IHVzaW5nIGEgQlVJTERfVkVDVE9SLgorICBTbWFsbFZlY3RvcjxpbnQsIDE2PiBPcHM7CisgIGZvciAodW5zaWduZWQgSGlnaCA9IDA7IEhpZ2ggPCAyOyArK0hpZ2gpIHsKKyAgICBTRFZhbHVlICZPdXRwdXQgPSBIaWdoID8gSGkgOiBMbzsKKworICAgIC8vIEJ1aWxkIGEgc2h1ZmZsZSBtYXNrIGZvciB0aGUgb3V0cHV0LCBkaXNjb3ZlcmluZyBvbiB0aGUgZmx5IHdoaWNoCisgICAgLy8gaW5wdXQgdmVjdG9ycyB0byB1c2UgYXMgc2h1ZmZsZSBvcGVyYW5kcyAocmVjb3JkZWQgaW4gSW5wdXRVc2VkKS4KKyAgICAvLyBJZiBidWlsZGluZyBhIHN1aXRhYmxlIHNodWZmbGUgdmVjdG9yIHByb3ZlcyB0b28gaGFyZCwgdGhlbiBiYWlsCisgICAgLy8gb3V0IHdpdGggdXNlQnVpbGRWZWN0b3Igc2V0LgorICAgIHVuc2lnbmVkIElucHV0VXNlZFsyXSA9IHsgLTFVLCAtMVUgfTsgLy8gTm90IHlldCBkaXNjb3ZlcmVkLgorICAgIHVuc2lnbmVkIEZpcnN0TWFza0lkeCA9IEhpZ2ggKiBOZXdFbHRzOworICAgIGJvb2wgdXNlQnVpbGRWZWN0b3IgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIE1hc2tPZmZzZXQgPSAwOyBNYXNrT2Zmc2V0IDwgTmV3RWx0czsgKytNYXNrT2Zmc2V0KSB7CisgICAgICAvLyBUaGUgbWFzayBlbGVtZW50LiAgVGhpcyBpbmRleGVzIGludG8gdGhlIGlucHV0LgorICAgICAgaW50IElkeCA9IE4tPmdldE1hc2tFbHQoRmlyc3RNYXNrSWR4ICsgTWFza09mZnNldCk7CisKKyAgICAgIC8vIFRoZSBpbnB1dCB2ZWN0b3IgdGhpcyBtYXNrIGVsZW1lbnQgaW5kZXhlcyBpbnRvLgorICAgICAgdW5zaWduZWQgSW5wdXQgPSAodW5zaWduZWQpSWR4IC8gTmV3RWx0czsKKworICAgICAgaWYgKElucHV0ID49IGFycmF5X2xlbmd0aG9mKElucHV0cykpIHsKKyAgICAgICAgLy8gVGhlIG1hc2sgZWxlbWVudCBkb2VzIG5vdCBpbmRleCBpbnRvIGFueSBpbnB1dCB2ZWN0b3IuCisgICAgICAgIE9wcy5wdXNoX2JhY2soLTEpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gVHVybiB0aGUgaW5kZXggaW50byBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IHZlY3Rvci4KKyAgICAgIElkeCAtPSBJbnB1dCAqIE5ld0VsdHM7CisKKyAgICAgIC8vIEZpbmQgb3IgY3JlYXRlIGEgc2h1ZmZsZSB2ZWN0b3Igb3BlcmFuZCB0byBob2xkIHRoaXMgaW5wdXQuCisgICAgICB1bnNpZ25lZCBPcE5vOworICAgICAgZm9yIChPcE5vID0gMDsgT3BObyA8IGFycmF5X2xlbmd0aG9mKElucHV0VXNlZCk7ICsrT3BObykgeworICAgICAgICBpZiAoSW5wdXRVc2VkW09wTm9dID09IElucHV0KSB7CisgICAgICAgICAgLy8gVGhpcyBpbnB1dCB2ZWN0b3IgaXMgYWxyZWFkeSBhbiBvcGVyYW5kLgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKElucHV0VXNlZFtPcE5vXSA9PSAtMVUpIHsKKyAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgb3BlcmFuZCBmb3IgdGhpcyBpbnB1dCB2ZWN0b3IuCisgICAgICAgICAgSW5wdXRVc2VkW09wTm9dID0gSW5wdXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKE9wTm8gPj0gYXJyYXlfbGVuZ3Rob2YoSW5wdXRVc2VkKSkgeworICAgICAgICAvLyBNb3JlIHRoYW4gdHdvIGlucHV0IHZlY3RvcnMgdXNlZCEgIEdpdmUgdXAgb24gdHJ5aW5nIHRvIGNyZWF0ZSBhCisgICAgICAgIC8vIHNodWZmbGUgdmVjdG9yLiAgSW5zZXJ0IGFsbCBlbGVtZW50cyBpbnRvIGEgQlVJTERfVkVDVE9SIGluc3RlYWQuCisgICAgICAgIHVzZUJ1aWxkVmVjdG9yID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIEFkZCB0aGUgbWFzayBpbmRleCBmb3IgdGhlIG5ldyBzaHVmZmxlIHZlY3Rvci4KKyAgICAgIE9wcy5wdXNoX2JhY2soSWR4ICsgT3BObyAqIE5ld0VsdHMpOworICAgIH0KKworICAgIGlmICh1c2VCdWlsZFZlY3RvcikgeworICAgICAgRVZUIEVsdFZUID0gTmV3VlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBTVk9wczsKKworICAgICAgLy8gRXh0cmFjdCB0aGUgaW5wdXQgZWxlbWVudHMgYnkgaGFuZC4KKyAgICAgIGZvciAodW5zaWduZWQgTWFza09mZnNldCA9IDA7IE1hc2tPZmZzZXQgPCBOZXdFbHRzOyArK01hc2tPZmZzZXQpIHsKKyAgICAgICAgLy8gVGhlIG1hc2sgZWxlbWVudC4gIFRoaXMgaW5kZXhlcyBpbnRvIHRoZSBpbnB1dC4KKyAgICAgICAgaW50IElkeCA9IE4tPmdldE1hc2tFbHQoRmlyc3RNYXNrSWR4ICsgTWFza09mZnNldCk7CisKKyAgICAgICAgLy8gVGhlIGlucHV0IHZlY3RvciB0aGlzIG1hc2sgZWxlbWVudCBpbmRleGVzIGludG8uCisgICAgICAgIHVuc2lnbmVkIElucHV0ID0gKHVuc2lnbmVkKUlkeCAvIE5ld0VsdHM7CisKKyAgICAgICAgaWYgKElucHV0ID49IGFycmF5X2xlbmd0aG9mKElucHV0cykpIHsKKyAgICAgICAgICAvLyBUaGUgbWFzayBlbGVtZW50IGlzICJ1bmRlZiIgb3IgaW5kZXhlcyBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQuCisgICAgICAgICAgU1ZPcHMucHVzaF9iYWNrKERBRy5nZXRVTkRFRihFbHRWVCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVHVybiB0aGUgaW5kZXggaW50byBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IHZlY3Rvci4KKyAgICAgICAgSWR4IC09IElucHV0ICogTmV3RWx0czsKKworICAgICAgICAvLyBFeHRyYWN0IHRoZSB2ZWN0b3IgZWxlbWVudCBieSBoYW5kLgorICAgICAgICBTVk9wcy5wdXNoX2JhY2soREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBFbHRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0c1tJbnB1dF0sIERBRy5nZXRJbnRQdHJDb25zdGFudChJZHgpKSk7CisgICAgICB9CisKKyAgICAgIC8vIENvbnN0cnVjdCB0aGUgTG8vSGkgb3V0cHV0IHVzaW5nIGEgQlVJTERfVkVDVE9SLgorICAgICAgT3V0cHV0ID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsZGwsTmV3VlQsICZTVk9wc1swXSwgU1ZPcHMuc2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKElucHV0VXNlZFswXSA9PSAtMVUpIHsKKyAgICAgIC8vIE5vIGlucHV0IHZlY3RvcnMgd2VyZSB1c2VkISAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisgICAgICBPdXRwdXQgPSBEQUcuZ2V0VU5ERUYoTmV3VlQpOworICAgIH0gZWxzZSB7CisgICAgICBTRFZhbHVlIE9wMCA9IElucHV0c1tJbnB1dFVzZWRbMF1dOworICAgICAgLy8gSWYgb25seSBvbmUgaW5wdXQgd2FzIHVzZWQsIHVzZSBhbiB1bmRlZmluZWQgdmVjdG9yIGZvciB0aGUgb3RoZXIuCisgICAgICBTRFZhbHVlIE9wMSA9IElucHV0VXNlZFsxXSA9PSAtMVUgPworICAgICAgICBEQUcuZ2V0VU5ERUYoTmV3VlQpIDogSW5wdXRzW0lucHV0VXNlZFsxXV07CisgICAgICAvLyBBdCBsZWFzdCBvbmUgaW5wdXQgdmVjdG9yIHdhcyB1c2VkLiAgQ3JlYXRlIGEgbmV3IHNodWZmbGUgdmVjdG9yLgorICAgICAgT3V0cHV0ID0gIERBRy5nZXRWZWN0b3JTaHVmZmxlKE5ld1ZULCBkbCwgT3AwLCBPcDEsICZPcHNbMF0pOworICAgIH0KKworICAgIE9wcy5jbGVhcigpOworICB9Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBPcGVyYW5kIFZlY3RvciBTcGxpdHRpbmcKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBTcGxpdFZlY3Rvck9wZXJhbmQgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgb2YgdGhlCisvLy8gc3BlY2lmaWVkIG5vZGUgaXMgZm91bmQgdG8gbmVlZCB2ZWN0b3Igc3BsaXR0aW5nLiAgQXQgdGhpcyBwb2ludCwgYWxsIG9mIHRoZQorLy8vIHJlc3VsdCB0eXBlcyBvZiB0aGUgbm9kZSBhcmUga25vd24gdG8gYmUgbGVnYWwsIGJ1dCBvdGhlciBvcGVyYW5kcyBvZiB0aGUKKy8vLyBub2RlIG1heSBuZWVkIGxlZ2FsaXphdGlvbiBhcyB3ZWxsIGFzIHRoZSBzcGVjaWZpZWQgb25lLgorYm9vbCBEQUdUeXBlTGVnYWxpemVyOjpTcGxpdFZlY3Rvck9wZXJhbmQoU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiU3BsaXQgbm9kZSBvcGVyYW5kOiAiOworICAgICAgICBOLT5kdW1wKCZEQUcpOworICAgICAgICBkYmdzKCkgPDwgIlxuIik7CisgIFNEVmFsdWUgUmVzID0gU0RWYWx1ZSgpOworCisgIGlmIChSZXMuZ2V0Tm9kZSgpID09IDApIHsKKyAgICBzd2l0Y2ggKE4tPmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDoKKyNpZm5kZWYgTkRFQlVHCisgICAgICBkYmdzKCkgPDwgIlNwbGl0VmVjdG9yT3BlcmFuZCBPcCAjIiA8PCBPcE5vIDw8ICI6ICI7CisgICAgICBOLT5kdW1wKCZEQUcpOworICAgICAgZGJncygpIDw8ICJcbiI7CisjZW5kaWYKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkRvIG5vdCBrbm93IGhvdyB0byBzcGxpdCB0aGlzIG9wZXJhdG9yJ3Mgb3BlcmFuZCEiKTsKKworICAgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDogICAgICAgUmVzID0gU3BsaXRWZWNPcF9CSVRfQ09OVkVSVChOKTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SOiBSZXMgPSBTcGxpdFZlY09wX0VYVFJBQ1RfU1VCVkVDVE9SKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6RVhUUkFDVF9WRUNUT1JfRUxUOlJlcyA9IFNwbGl0VmVjT3BfRVhUUkFDVF9WRUNUT1JfRUxUKE4pOyBicmVhazsKKyAgICBjYXNlIElTRDo6U1RPUkU6CisgICAgICBSZXMgPSBTcGxpdFZlY09wX1NUT1JFKGNhc3Q8U3RvcmVTRE5vZGU+KE4pLCBPcE5vKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJU0Q6OkNUVFo6CisgICAgY2FzZSBJU0Q6OkNUTFo6CisgICAgY2FzZSBJU0Q6OkNUUE9QOgorICAgIGNhc2UgSVNEOjpGUF9UT19TSU5UOgorICAgIGNhc2UgSVNEOjpGUF9UT19VSU5UOgorICAgIGNhc2UgSVNEOjpTSU5UX1RPX0ZQOgorICAgIGNhc2UgSVNEOjpVSU5UX1RPX0ZQOgorICAgIGNhc2UgSVNEOjpUUlVOQ0FURToKKyAgICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6CisgICAgY2FzZSBJU0Q6OlpFUk9fRVhURU5EOgorICAgIGNhc2UgSVNEOjpBTllfRVhURU5EOgorICAgICAgUmVzID0gU3BsaXRWZWNPcF9VbmFyeU9wKE4pOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIHJlc3VsdCBpcyBudWxsLCB0aGUgc3ViLW1ldGhvZCB0b29rIGNhcmUgb2YgcmVnaXN0ZXJpbmcgcmVzdWx0cyBldGMuCisgIGlmICghUmVzLmdldE5vZGUoKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHRoZSByZXN1bHQgaXMgTiwgdGhlIHN1Yi1tZXRob2QgdXBkYXRlZCBOIGluIHBsYWNlLiAgVGVsbCB0aGUgbGVnYWxpemVyCisgIC8vIGNvcmUgYWJvdXQgdGhpcy4KKyAgaWYgKFJlcy5nZXROb2RlKCkgPT0gTikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBhc3NlcnQoUmVzLmdldFZhbHVlVHlwZSgpID09IE4tPmdldFZhbHVlVHlwZSgwKSAmJiBOLT5nZXROdW1WYWx1ZXMoKSA9PSAxICYmCisgICAgICAgICAiSW52YWxpZCBvcGVyYW5kIGV4cGFuc2lvbiIpOworCisgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCAwKSwgUmVzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OlNwbGl0VmVjT3BfVW5hcnlPcChTRE5vZGUgKk4pIHsKKyAgLy8gVGhlIHJlc3VsdCBoYXMgYSBsZWdhbCB2ZWN0b3IgdHlwZSwgYnV0IHRoZSBpbnB1dCBuZWVkcyBzcGxpdHRpbmcuCisgIEVWVCBSZXNWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgU0RWYWx1ZSBMbywgSGk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgR2V0U3BsaXRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSwgTG8sIEhpKTsKKyAgRVZUIEluVlQgPSBMby5nZXRWYWx1ZVR5cGUoKTsKKworICBFVlQgT3V0VlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBSZXNWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSk7CisKKyAgTG8gPSBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgZGwsIE91dFZULCBMbyk7CisgIEhpID0gREFHLmdldE5vZGUoTi0+Z2V0T3Bjb2RlKCksIGRsLCBPdXRWVCwgSGkpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkNPTkNBVF9WRUNUT1JTLCBkbCwgUmVzVlQsIExvLCBIaSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNPcF9CSVRfQ09OVkVSVChTRE5vZGUgKk4pIHsKKyAgLy8gRm9yIGV4YW1wbGUsIGk2NCA9IEJJVF9DT05WRVJUIHY0aTE2IG9uIGFscGhhLiAgVHlwaWNhbGx5IHRoZSB2ZWN0b3Igd2lsbAorICAvLyBlbmQgdXAgYmVpbmcgc3BsaXQgYWxsIHRoZSB3YXkgZG93biB0byBpbmRpdmlkdWFsIGNvbXBvbmVudHMuICBDb252ZXJ0IHRoZQorICAvLyBzcGxpdCBwaWVjZXMgaW50byBpbnRlZ2VycyBhbmQgcmVhc3NlbWJsZS4KKyAgU0RWYWx1ZSBMbywgSGk7CisgIEdldFNwbGl0VmVjdG9yKE4tPmdldE9wZXJhbmQoMCksIExvLCBIaSk7CisgIExvID0gQml0Q29udmVydFRvSW50ZWdlcihMbyk7CisgIEhpID0gQml0Q29udmVydFRvSW50ZWdlcihIaSk7CisKKyAgaWYgKFRMSS5pc0JpZ0VuZGlhbigpKQorICAgIHN0ZDo6c3dhcChMbywgSGkpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBOLT5nZXREZWJ1Z0xvYygpLCBOLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICBKb2luSW50ZWdlcnMoTG8sIEhpKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNPcF9FWFRSQUNUX1NVQlZFQ1RPUihTRE5vZGUgKk4pIHsKKyAgLy8gV2Uga25vdyB0aGF0IHRoZSBleHRyYWN0ZWQgcmVzdWx0IHR5cGUgaXMgbGVnYWwuICBGb3Igbm93LCBhc3N1bWUgdGhlIGluZGV4CisgIC8vIGlzIGEgY29uc3RhbnQuCisgIEVWVCBTdWJWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgU0RWYWx1ZSBJZHggPSBOLT5nZXRPcGVyYW5kKDEpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgTG8sIEhpOworICBHZXRTcGxpdFZlY3RvcihOLT5nZXRPcGVyYW5kKDApLCBMbywgSGkpOworCisgIHVpbnQ2NF90IExvRWx0cyA9IExvLmdldFZhbHVlVHlwZSgpLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIHVpbnQ2NF90IElkeFZhbCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KElkeCktPmdldFpFeHRWYWx1ZSgpOworCisgIGlmIChJZHhWYWwgPCBMb0VsdHMpIHsKKyAgICBhc3NlcnQoSWR4VmFsICsgU3ViVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA8PSBMb0VsdHMgJiYKKyAgICAgICAgICAgIkV4dHJhY3RlZCBzdWJ2ZWN0b3IgY3Jvc3NlcyB2ZWN0b3Igc3BsaXQhIik7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLCBTdWJWVCwgTG8sIElkeCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLCBTdWJWVCwgSGksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJZHhWYWwgLSBMb0VsdHMsIElkeC5nZXRWYWx1ZVR5cGUoKSkpOworICB9Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNPcF9FWFRSQUNUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgVmVjID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBJZHggPSBOLT5nZXRPcGVyYW5kKDEpOworICBFVlQgVmVjVlQgPSBWZWMuZ2V0VmFsdWVUeXBlKCk7CisKKyAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oSWR4KSkgeworICAgIHVpbnQ2NF90IElkeFZhbCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KElkeCktPmdldFpFeHRWYWx1ZSgpOworICAgIGFzc2VydChJZHhWYWwgPCBWZWNWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpICYmICJJbnZhbGlkIHZlY3RvciBpbmRleCEiKTsKKworICAgIFNEVmFsdWUgTG8sIEhpOworICAgIEdldFNwbGl0VmVjdG9yKFZlYywgTG8sIEhpKTsKKworICAgIHVpbnQ2NF90IExvRWx0cyA9IExvLmdldFZhbHVlVHlwZSgpLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgICBpZiAoSWR4VmFsIDwgTG9FbHRzKQorICAgICAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBMbywgSWR4KSwgMCk7CisgICAgcmV0dXJuIFNEVmFsdWUoREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSWR4VmFsIC0gTG9FbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZHguZ2V0VmFsdWVUeXBlKCkpKSwKKyAgICAgICAgICAgICAgICAgICAwKTsKKyAgfQorCisgIC8vIFN0b3JlIHRoZSB2ZWN0b3IgdG8gdGhlIHN0YWNrLgorICBFVlQgRWx0VlQgPSBWZWNWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgU3RhY2tQdHIgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoVmVjVlQpOworICBpbnQgU1BGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oU3RhY2tQdHIuZ2V0Tm9kZSgpKS0+Z2V0SW5kZXgoKTsKKyAgY29uc3QgVmFsdWUgKlNWID0gUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soU1BGSSk7CisgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwgVmVjLCBTdGFja1B0ciwgU1YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKworICAvLyBMb2FkIGJhY2sgdGhlIHJlcXVpcmVkIGVsZW1lbnQuCisgIFN0YWNrUHRyID0gR2V0VmVjdG9yRWxlbWVudFBvaW50ZXIoU3RhY2tQdHIsIEVsdFZULCBJZHgpOworICByZXR1cm4gREFHLmdldEV4dExvYWQoSVNEOjpFWFRMT0FELCBOLT5nZXRWYWx1ZVR5cGUoMCksIGRsLCBTdG9yZSwgU3RhY2tQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBTViwgMCwgRWx0VlQsIGZhbHNlLCBmYWxzZSwgMCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6U3BsaXRWZWNPcF9TVE9SRShTdG9yZVNETm9kZSAqTiwgdW5zaWduZWQgT3BObykgeworICBhc3NlcnQoTi0+aXNVbmluZGV4ZWQoKSAmJiAiSW5kZXhlZCBzdG9yZSBvZiB2ZWN0b3I/Iik7CisgIGFzc2VydChPcE5vID09IDEgJiYgIkNhbiBvbmx5IHNwbGl0IHRoZSBzdG9yZWQgdmFsdWUiKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIGJvb2wgaXNUcnVuY2F0aW5nID0gTi0+aXNUcnVuY2F0aW5nU3RvcmUoKTsKKyAgU0RWYWx1ZSBDaCAgPSBOLT5nZXRDaGFpbigpOworICBTRFZhbHVlIFB0ciA9IE4tPmdldEJhc2VQdHIoKTsKKyAgaW50IFNWT2Zmc2V0ID0gTi0+Z2V0U3JjVmFsdWVPZmZzZXQoKTsKKyAgRVZUIE1lbW9yeVZUID0gTi0+Z2V0TWVtb3J5VlQoKTsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gTi0+Z2V0T3JpZ2luYWxBbGlnbm1lbnQoKTsKKyAgYm9vbCBpc1ZvbCA9IE4tPmlzVm9sYXRpbGUoKTsKKyAgYm9vbCBpc05UID0gTi0+aXNOb25UZW1wb3JhbCgpOworICBTRFZhbHVlIExvLCBIaTsKKyAgR2V0U3BsaXRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgxKSwgTG8sIEhpKTsKKworICBFVlQgTG9NZW1WVCwgSGlNZW1WVDsKKyAgR2V0U3BsaXREZXN0VlRzKE1lbW9yeVZULCBMb01lbVZULCBIaU1lbVZUKTsKKworICB1bnNpZ25lZCBJbmNyZW1lbnRTaXplID0gTG9NZW1WVC5nZXRTaXplSW5CaXRzKCkvODsKKworICBpZiAoaXNUcnVuY2F0aW5nKQorICAgIExvID0gREFHLmdldFRydW5jU3RvcmUoQ2gsIGRsLCBMbywgUHRyLCBOLT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExvTWVtVlQsIGlzVm9sLCBpc05ULCBBbGlnbm1lbnQpOworICBlbHNlCisgICAgTG8gPSBEQUcuZ2V0U3RvcmUoQ2gsIGRsLCBMbywgUHRyLCBOLT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBpc1ZvbCwgaXNOVCwgQWxpZ25tZW50KTsKKworICAvLyBJbmNyZW1lbnQgdGhlIHBvaW50ZXIgdG8gdGhlIG90aGVyIGhhbGYuCisgIFB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyLmdldFZhbHVlVHlwZSgpLCBQdHIsCisgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJbmNyZW1lbnRTaXplKSk7CisgIFNWT2Zmc2V0ICs9IEluY3JlbWVudFNpemU7CisKKyAgaWYgKGlzVHJ1bmNhdGluZykKKyAgICBIaSA9IERBRy5nZXRUcnVuY1N0b3JlKENoLCBkbCwgSGksIFB0ciwgTi0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIaU1lbVZULCBpc1ZvbCwgaXNOVCwgQWxpZ25tZW50KTsKKyAgZWxzZQorICAgIEhpID0gREFHLmdldFN0b3JlKENoLCBkbCwgSGksIFB0ciwgTi0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaXNWb2wsIGlzTlQsIEFsaWdubWVudCk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCBMbywgSGkpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgUmVzdWx0IFZlY3RvciBXaWRlbmluZworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBEQUdUeXBlTGVnYWxpemVyOjpXaWRlblZlY3RvclJlc3VsdChTRE5vZGUgKk4sIHVuc2lnbmVkIFJlc05vKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiV2lkZW4gbm9kZSByZXN1bHQgIiA8PCBSZXNObyA8PCAiOiAiOworICAgICAgICBOLT5kdW1wKCZEQUcpOworICAgICAgICBkYmdzKCkgPDwgIlxuIik7CisKKyAgLy8gU2VlIGlmIHRoZSB0YXJnZXQgd2FudHMgdG8gY3VzdG9tIHdpZGVuIHRoaXMgbm9kZS4KKyAgaWYgKEN1c3RvbVdpZGVuTG93ZXJOb2RlKE4sIE4tPmdldFZhbHVlVHlwZShSZXNObykpKQorICAgIHJldHVybjsKKworICBTRFZhbHVlIFJlcyA9IFNEVmFsdWUoKTsKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorI2lmbmRlZiBOREVCVUcKKyAgICBkYmdzKCkgPDwgIldpZGVuVmVjdG9yUmVzdWx0ICMiIDw8IFJlc05vIDw8ICI6ICI7CisgICAgTi0+ZHVtcCgmREFHKTsKKyAgICBkYmdzKCkgPDwgIlxuIjsKKyNlbmRpZgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkRvIG5vdCBrbm93IGhvdyB0byB3aWRlbiB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0b3IhIik7CisKKyAgY2FzZSBJU0Q6OkJJVF9DT05WRVJUOiAgICAgICBSZXMgPSBXaWRlblZlY1Jlc19CSVRfQ09OVkVSVChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpCVUlMRF9WRUNUT1I6ICAgICAgUmVzID0gV2lkZW5WZWNSZXNfQlVJTERfVkVDVE9SKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOiAgICBSZXMgPSBXaWRlblZlY1Jlc19DT05DQVRfVkVDVE9SUyhOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpDT05WRVJUX1JORFNBVDogICAgUmVzID0gV2lkZW5WZWNSZXNfQ09OVkVSVF9STkRTQVQoTik7IGJyZWFrOworICBjYXNlIElTRDo6RVhUUkFDVF9TVUJWRUNUT1I6IFJlcyA9IFdpZGVuVmVjUmVzX0VYVFJBQ1RfU1VCVkVDVE9SKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkZQX1JPVU5EX0lOUkVHOiAgICBSZXMgPSBXaWRlblZlY1Jlc19JbnJlZ09wKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OklOU0VSVF9WRUNUT1JfRUxUOiBSZXMgPSBXaWRlblZlY1Jlc19JTlNFUlRfVkVDVE9SX0VMVChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpMT0FEOiAgICAgICAgICAgICAgUmVzID0gV2lkZW5WZWNSZXNfTE9BRChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTQ0FMQVJfVE9fVkVDVE9SOiAgUmVzID0gV2lkZW5WZWNSZXNfU0NBTEFSX1RPX1ZFQ1RPUihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORF9JTlJFRzogUmVzID0gV2lkZW5WZWNSZXNfSW5yZWdPcChOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRUxFQ1Q6ICAgICAgICAgICAgUmVzID0gV2lkZW5WZWNSZXNfU0VMRUNUKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzogICAgICAgICBSZXMgPSBXaWRlblZlY1Jlc19TRUxFQ1RfQ0MoTik7IGJyZWFrOworICBjYXNlIElTRDo6U0VUQ0M6ICAgICAgICAgICAgIFJlcyA9IFdpZGVuVmVjUmVzX1NFVENDKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlVOREVGOiAgICAgICAgICAgICBSZXMgPSBXaWRlblZlY1Jlc19VTkRFRihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpWRUNUT1JfU0hVRkZMRToKKyAgICBSZXMgPSBXaWRlblZlY1Jlc19WRUNUT1JfU0hVRkZMRShjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlZTRVRDQzoKKyAgICBSZXMgPSBXaWRlblZlY1Jlc19WU0VUQ0MoTik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OkFERDoKKyAgY2FzZSBJU0Q6OkFORDoKKyAgY2FzZSBJU0Q6OkJTV0FQOgorICBjYXNlIElTRDo6RkFERDoKKyAgY2FzZSBJU0Q6OkZDT1BZU0lHTjoKKyAgY2FzZSBJU0Q6OkZESVY6CisgIGNhc2UgSVNEOjpGTVVMOgorICBjYXNlIElTRDo6RlBPVzoKKyAgY2FzZSBJU0Q6OkZSRU06CisgIGNhc2UgSVNEOjpGU1VCOgorICBjYXNlIElTRDo6TVVMOgorICBjYXNlIElTRDo6TVVMSFM6CisgIGNhc2UgSVNEOjpNVUxIVToKKyAgY2FzZSBJU0Q6Ok9SOgorICBjYXNlIElTRDo6U0RJVjoKKyAgY2FzZSBJU0Q6OlNSRU06CisgIGNhc2UgSVNEOjpVRElWOgorICBjYXNlIElTRDo6VVJFTToKKyAgY2FzZSBJU0Q6OlNVQjoKKyAgY2FzZSBJU0Q6OlhPUjoKKyAgICBSZXMgPSBXaWRlblZlY1Jlc19CaW5hcnkoTik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OkZQT1dJOgorICAgIFJlcyA9IFdpZGVuVmVjUmVzX1BPV0koTik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OlNITDoKKyAgY2FzZSBJU0Q6OlNSQToKKyAgY2FzZSBJU0Q6OlNSTDoKKyAgICBSZXMgPSBXaWRlblZlY1Jlc19TaGlmdChOKTsKKyAgICBicmVhazsKKworICBjYXNlIElTRDo6RlBfUk9VTkQ6CisgIGNhc2UgSVNEOjpGUF9UT19TSU5UOgorICBjYXNlIElTRDo6RlBfVE9fVUlOVDoKKyAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6CisgIGNhc2UgSVNEOjpVSU5UX1RPX0ZQOgorICBjYXNlIElTRDo6VFJVTkNBVEU6CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORDoKKyAgY2FzZSBJU0Q6OlpFUk9fRVhURU5EOgorICBjYXNlIElTRDo6QU5ZX0VYVEVORDoKKyAgICBSZXMgPSBXaWRlblZlY1Jlc19Db252ZXJ0KE4pOworICAgIGJyZWFrOworCisgIGNhc2UgSVNEOjpDVExaOgorICBjYXNlIElTRDo6Q1RQT1A6CisgIGNhc2UgSVNEOjpDVFRaOgorICBjYXNlIElTRDo6RkFCUzoKKyAgY2FzZSBJU0Q6OkZDT1M6CisgIGNhc2UgSVNEOjpGTkVHOgorICBjYXNlIElTRDo6RlNJTjoKKyAgY2FzZSBJU0Q6OkZTUVJUOgorICBjYXNlIElTRDo6RkVYUDoKKyAgY2FzZSBJU0Q6OkZFWFAyOgorICBjYXNlIElTRDo6RkxPRzoKKyAgY2FzZSBJU0Q6OkZMT0cyOgorICBjYXNlIElTRDo6RkxPRzEwOgorICAgIFJlcyA9IFdpZGVuVmVjUmVzX1VuYXJ5KE4pOworICAgIGJyZWFrOworICB9CisKKyAgLy8gSWYgUmVzIGlzIG51bGwsIHRoZSBzdWItbWV0aG9kIHRvb2sgY2FyZSBvZiByZWdpc3RlcmluZyB0aGUgcmVzdWx0LgorICBpZiAoUmVzLmdldE5vZGUoKSkKKyAgICBTZXRXaWRlbmVkVmVjdG9yKFNEVmFsdWUoTiwgUmVzTm8pLCBSZXMpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OldpZGVuVmVjUmVzX0JpbmFyeShTRE5vZGUgKk4pIHsKKyAgLy8gQmluYXJ5IG9wIHdpZGVuaW5nLgorICB1bnNpZ25lZCBPcGNvZGUgPSBOLT5nZXRPcGNvZGUoKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBFVlQgV2lkZW5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgRVZUIFdpZGVuRWx0VlQgPSBXaWRlblZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIEVWVCBWVCA9IFdpZGVuVlQ7CisgIHVuc2lnbmVkIE51bUVsdHMgPSAgVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgd2hpbGUgKCFUTEkuaXNUeXBlU3ludGhlc2l6YWJsZShWVCkgJiYgTnVtRWx0cyAhPSAxKSB7CisgICAgIE51bUVsdHMgPSBOdW1FbHRzIC8gMjsKKyAgICAgVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBXaWRlbkVsdFZULCBOdW1FbHRzKTsKKyAgfQorCisgIGlmIChOdW1FbHRzICE9IDEgJiYgIVRMSS5jYW5PcFRyYXAoTi0+Z2V0T3Bjb2RlKCksIFZUKSkgeworICAgIC8vIE9wZXJhdGlvbiBkb2Vzbid0IHRyYXAgc28ganVzdCB3aWRlbiBhcyBub3JtYWwuCisgICAgU0RWYWx1ZSBJbk9wMSA9IEdldFdpZGVuZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSk7CisgICAgU0RWYWx1ZSBJbk9wMiA9IEdldFdpZGVuZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgxKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKE4tPmdldE9wY29kZSgpLCBkbCwgV2lkZW5WVCwgSW5PcDEsIEluT3AyKTsKKyAgfSBlbHNlIGlmIChOdW1FbHRzID09IDEpIHsKKyAgICAvLyBObyBsZWdhbCB2ZWN0b3IgdmVyc2lvbiBzbyB1bnJvbGwgdGhlIHZlY3RvciBvcGVyYXRpb24gYW5kIHRoZW4gd2lkZW4uCisgICAgcmV0dXJuIERBRy5VbnJvbGxWZWN0b3JPcChOLCBXaWRlblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICB9IGVsc2UgeworICAgIC8vIFNpbmNlIHRoZSBvcGVyYXRpb24gY2FuIHRyYXAsIGFwcGx5IG9wZXJhdGlvbiBvbiB0aGUgb3JpZ2luYWwgdmVjdG9yLgorICAgIEVWVCBNYXhWVCA9IFZUOworICAgIFNEVmFsdWUgSW5PcDEgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICAgIFNEVmFsdWUgSW5PcDIgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMSkpOworICAgIHVuc2lnbmVkIEN1ck51bUVsdHMgPSBOLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBDb25jYXRPcHMoQ3VyTnVtRWx0cyk7CisgICAgdW5zaWduZWQgQ29uY2F0RW5kID0gMDsgIC8vIEN1cnJlbnQgQ29uY2F0T3BzIGluZGV4LgorICAgIGludCBJZHggPSAwOyAgICAgICAgLy8gQ3VycmVudCBJZHggaW50byBpbnB1dCB2ZWN0b3JzLgorCisgICAgLy8gTnVtRWx0cyA6PSBncmVhdGVzdCBzeW50aGVzaXphYmxlIHZlY3RvciBzaXplIChhdCBtb3N0IFdpZGVuVlQpCisgICAgLy8gd2hpbGUgKG9yaWcuIHZlY3RvciBoYXMgdW5oYW5kbGVkIGVsZW1lbnRzKSB7CisgICAgLy8gICB0YWtlIG11bmNoZXMgb2Ygc2l6ZSBOdW1FbHRzIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgYWRkIHRvIENvbmNhdE9wcworICAgIC8vICAgTnVtRWx0cyA6PSBuZXh0IHNtYWxsZXIgc3VwcG9ydGVkIHZlY3RvciBzaXplIG9yIDEKKyAgICAvLyB9CisgICAgd2hpbGUgKEN1ck51bUVsdHMgIT0gMCkgeworICAgICAgd2hpbGUgKEN1ck51bUVsdHMgPj0gTnVtRWx0cykgeworICAgICAgICBTRFZhbHVlIEVPcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SLCBkbCwgVlQsIEluT3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSWR4KSk7CisgICAgICAgIFNEVmFsdWUgRU9wMiA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLCBWVCwgSW5PcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJZHgpKTsKKyAgICAgICAgQ29uY2F0T3BzW0NvbmNhdEVuZCsrXSA9IERBRy5nZXROb2RlKE9wY29kZSwgZGwsIFZULCBFT3AxLCBFT3AyKTsKKyAgICAgICAgSWR4ICs9IE51bUVsdHM7CisgICAgICAgIEN1ck51bUVsdHMgLT0gTnVtRWx0czsKKyAgICAgIH0KKyAgICAgIGRvIHsKKyAgICAgICAgTnVtRWx0cyA9IE51bUVsdHMgLyAyOworICAgICAgICBWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIFdpZGVuRWx0VlQsIE51bUVsdHMpOworICAgICAgfSB3aGlsZSAoIVRMSS5pc1R5cGVTeW50aGVzaXphYmxlKFZUKSAmJiBOdW1FbHRzICE9IDEpOworCisgICAgICBpZiAoTnVtRWx0cyA9PSAxKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gQ3VyTnVtRWx0czsgKytpLCArK0lkeCkgeworICAgICAgICAgIFNEVmFsdWUgRU9wMSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgV2lkZW5FbHRWVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5PcDEsIERBRy5nZXRJbnRQdHJDb25zdGFudChJZHgpKTsKKyAgICAgICAgICBTRFZhbHVlIEVPcDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIFdpZGVuRWx0VlQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluT3AyLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSWR4KSk7CisgICAgICAgICAgQ29uY2F0T3BzW0NvbmNhdEVuZCsrXSA9IERBRy5nZXROb2RlKE9wY29kZSwgZGwsIFdpZGVuRWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVPcDEsIEVPcDIpOworICAgICAgICB9CisgICAgICAgIEN1ck51bUVsdHMgPSAwOworICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgc2luZ2xlIG9wZXJhdGlvbiB3aXRoIHRoZSB3aWRlbiB0eXBlLgorICAgIGlmIChDb25jYXRFbmQgPT0gMSkgeworICAgICAgVlQgPSBDb25jYXRPcHNbMF0uZ2V0VmFsdWVUeXBlKCk7CisgICAgICBpZiAoVlQgPT0gV2lkZW5WVCkKKyAgICAgICAgcmV0dXJuIENvbmNhdE9wc1swXTsKKyAgICB9CisKKyAgICAvLyB3aGlsZSAoU29tZSBlbGVtZW50IG9mIENvbmNhdE9wcyBpcyBub3Qgb2YgdHlwZSBNYXhWVCkgeworICAgIC8vICAgRnJvbSB0aGUgZW5kIG9mIENvbmNhdE9wcywgY29sbGVjdCBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGFuZCBwdXQKKyAgICAvLyAgIHRoZW0gaW50byBhbiBvcCBvZiB0aGUgbmV4dCBsYXJnZXIgc3VwcG9ydGVkIHR5cGUKKyAgICAvLyB9CisgICAgd2hpbGUgKENvbmNhdE9wc1tDb25jYXRFbmQtMV0uZ2V0VmFsdWVUeXBlKCkgIT0gTWF4VlQpIHsKKyAgICAgIElkeCA9IENvbmNhdEVuZCAtIDE7CisgICAgICBWVCA9IENvbmNhdE9wc1tJZHgtLV0uZ2V0VmFsdWVUeXBlKCk7CisgICAgICB3aGlsZSAoSWR4ID49IDAgJiYgQ29uY2F0T3BzW0lkeF0uZ2V0VmFsdWVUeXBlKCkgPT0gVlQpCisgICAgICAgIElkeC0tOworCisgICAgICBpbnQgTmV4dFNpemUgPSBWVC5pc1ZlY3RvcigpID8gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA6IDE7CisgICAgICBFVlQgTmV4dFZUOworICAgICAgZG8geworICAgICAgICBOZXh0U2l6ZSAqPSAyOworICAgICAgICBOZXh0VlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBXaWRlbkVsdFZULCBOZXh0U2l6ZSk7CisgICAgICB9IHdoaWxlICghVExJLmlzVHlwZVN5bnRoZXNpemFibGUoTmV4dFZUKSk7CisKKyAgICAgIGlmICghVlQuaXNWZWN0b3IoKSkgeworICAgICAgICAvLyBTY2FsYXIgdHlwZSwgY3JlYXRlIGFuIElOU0VSVF9WRUNUT1JfRUxFTUVOVCBvZiB0eXBlIE5leHRWVAorICAgICAgICBTRFZhbHVlIFZlY09wID0gREFHLmdldFVOREVGKE5leHRWVCk7CisgICAgICAgIHVuc2lnbmVkIE51bVRvSW5zZXJ0ID0gQ29uY2F0RW5kIC0gSWR4IC0gMTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgT3BJZHggPSBJZHgrMTsgaSA8IE51bVRvSW5zZXJ0OyBpKyssIE9wSWR4KyspIHsKKyAgICAgICAgICBWZWNPcCA9IERBRy5nZXROb2RlKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIGRsLCBOZXh0VlQsIFZlY09wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uY2F0T3BzW09wSWR4XSwgREFHLmdldEludFB0ckNvbnN0YW50KGkpKTsKKyAgICAgICAgfQorICAgICAgICBDb25jYXRPcHNbSWR4KzFdID0gVmVjT3A7CisgICAgICAgIENvbmNhdEVuZCA9IElkeCArIDI7CisgICAgICB9IAorICAgICAgZWxzZSB7CisgICAgICAgIC8vIFZlY3RvciB0eXBlLCBjcmVhdGUgYSBDT05DQVRfVkVDVE9SUyBvZiB0eXBlIE5leHRWVAorICAgICAgICBTRFZhbHVlIHVuZGVmVmVjID0gREFHLmdldFVOREVGKFZUKTsKKyAgICAgICAgdW5zaWduZWQgT3BzVG9Db25jYXQgPSBOZXh0U2l6ZS9WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gU3ViQ29uY2F0T3BzKE9wc1RvQ29uY2F0KTsKKyAgICAgICAgdW5zaWduZWQgUmVhbFZhbHMgPSBDb25jYXRFbmQgLSBJZHggLSAxOworICAgICAgICB1bnNpZ25lZCBTdWJDb25jYXRFbmQgPSAwOworICAgICAgICB1bnNpZ25lZCBTdWJDb25jYXRJZHggPSBJZHggKyAxOworICAgICAgICB3aGlsZSAoU3ViQ29uY2F0RW5kIDwgUmVhbFZhbHMpCisgICAgICAgICAgU3ViQ29uY2F0T3BzW1N1YkNvbmNhdEVuZCsrXSA9IENvbmNhdE9wc1srK0lkeF07CisgICAgICAgIHdoaWxlIChTdWJDb25jYXRFbmQgPCBPcHNUb0NvbmNhdCkKKyAgICAgICAgICBTdWJDb25jYXRPcHNbU3ViQ29uY2F0RW5kKytdID0gdW5kZWZWZWM7CisgICAgICAgIENvbmNhdE9wc1tTdWJDb25jYXRJZHhdID0gREFHLmdldE5vZGUoSVNEOjpDT05DQVRfVkVDVE9SUywgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFZULCAmU3ViQ29uY2F0T3BzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wc1RvQ29uY2F0KTsKKyAgICAgICAgQ29uY2F0RW5kID0gU3ViQ29uY2F0SWR4ICsgMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHNpbmdsZSBvcGVyYXRpb24gd2l0aCB0aGUgd2lkZW4gdHlwZS4KKyAgICBpZiAoQ29uY2F0RW5kID09IDEpIHsKKyAgICAgIFZUID0gQ29uY2F0T3BzWzBdLmdldFZhbHVlVHlwZSgpOworICAgICAgaWYgKFZUID09IFdpZGVuVlQpCisgICAgICAgIHJldHVybiBDb25jYXRPcHNbMF07CisgICAgfQorICAgIAorICAgIC8vIGFkZCB1bmRlZnMgb2Ygc2l6ZSBNYXhWVCB1bnRpbCBDb25jYXRPcHMgZ3Jvd3MgdG8gbGVuZ3RoIG9mIFdpZGVuVlQKKyAgICB1bnNpZ25lZCBOdW1PcHMgPSAKKyAgICAgICAgV2lkZW5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpL01heFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgaWYgKE51bU9wcyAhPSBDb25jYXRFbmQgKSB7CisgICAgICBTRFZhbHVlIFVuZGVmVmFsID0gREFHLmdldFVOREVGKE1heFZUKTsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IENvbmNhdEVuZDsgaiA8IE51bU9wczsgKytqKQorICAgICAgICBDb25jYXRPcHNbal0gPSBVbmRlZlZhbDsKKyAgICB9CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Q09OQ0FUX1ZFQ1RPUlMsIGRsLCBXaWRlblZULCAmQ29uY2F0T3BzWzBdLCBOdW1PcHMpOworICB9Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNSZXNfQ29udmVydChTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBJbk9wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIEVWVCBXaWRlblZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICB1bnNpZ25lZCBXaWRlbk51bUVsdHMgPSBXaWRlblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgRVZUIEluVlQgPSBJbk9wLmdldFZhbHVlVHlwZSgpOworICBFVlQgSW5FbHRWVCA9IEluVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgRVZUIEluV2lkZW5WVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIEluRWx0VlQsIFdpZGVuTnVtRWx0cyk7CisKKyAgdW5zaWduZWQgT3Bjb2RlID0gTi0+Z2V0T3Bjb2RlKCk7CisgIHVuc2lnbmVkIEluVlROdW1FbHRzID0gSW5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworCisgIGlmIChnZXRUeXBlQWN0aW9uKEluVlQpID09IFdpZGVuVmVjdG9yKSB7CisgICAgSW5PcCA9IEdldFdpZGVuZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSk7CisgICAgSW5WVCA9IEluT3AuZ2V0VmFsdWVUeXBlKCk7CisgICAgSW5WVE51bUVsdHMgPSBJblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgaWYgKEluVlROdW1FbHRzID09IFdpZGVuTnVtRWx0cykKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShPcGNvZGUsIGRsLCBXaWRlblZULCBJbk9wKTsKKyAgfQorCisgIGlmIChUTEkuaXNUeXBlU3ludGhlc2l6YWJsZShJbldpZGVuVlQpKSB7CisgICAgLy8gQmVjYXVzZSB0aGUgcmVzdWx0IGFuZCB0aGUgaW5wdXQgYXJlIGRpZmZlcmVudCB2ZWN0b3IgdHlwZXMsIHdpZGVuaW5nCisgICAgLy8gdGhlIHJlc3VsdCBjb3VsZCBjcmVhdGUgYSBsZWdhbCB0eXBlIGJ1dCB3aWRlbmluZyB0aGUgaW5wdXQgbWlnaHQgbWFrZQorICAgIC8vIGl0IGFuIGlsbGVnYWwgdHlwZSB0aGF0IG1pZ2h0IGxlYWQgdG8gcmVwZWF0ZWRseSBzcGxpdHRpbmcgdGhlIGlucHV0CisgICAgLy8gYW5kIHRoZW4gd2lkZW5pbmcgaXQuIFRvIGF2b2lkIHRoaXMsIHdlIHdpZGVuIHRoZSBpbnB1dCBvbmx5IGlmCisgICAgLy8gaXQgcmVzdWx0cyBpbiBhIGxlZ2FsIHR5cGUuCisgICAgaWYgKFdpZGVuTnVtRWx0cyAlIEluVlROdW1FbHRzID09IDApIHsKKyAgICAgIC8vIFdpZGVuIHRoZSBpbnB1dCBhbmQgY2FsbCBjb252ZXJ0IG9uIHRoZSB3aWRlbmVkIGlucHV0IHZlY3Rvci4KKyAgICAgIHVuc2lnbmVkIE51bUNvbmNhdCA9IFdpZGVuTnVtRWx0cy9JblZUTnVtRWx0czsKKyAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBPcHMoTnVtQ29uY2F0KTsKKyAgICAgIE9wc1swXSA9IEluT3A7CisgICAgICBTRFZhbHVlIFVuZGVmVmFsID0gREFHLmdldFVOREVGKEluVlQpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBOdW1Db25jYXQ7ICsraSkKKyAgICAgICAgT3BzW2ldID0gVW5kZWZWYWw7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoT3Bjb2RlLCBkbCwgV2lkZW5WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkNPTkNBVF9WRUNUT1JTLCBkbCwgSW5XaWRlblZULAorICAgICAgICAgICAgICAgICAgICAgICAgICZPcHNbMF0sIE51bUNvbmNhdCkpOworICAgIH0KKworICAgIGlmIChJblZUTnVtRWx0cyAlIFdpZGVuTnVtRWx0cyA9PSAwKSB7CisgICAgICAvLyBFeHRyYWN0IHRoZSBpbnB1dCBhbmQgY29udmVydCB0aGUgc2hvcnRlbiBpbnB1dCB2ZWN0b3IuCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoT3Bjb2RlLCBkbCwgV2lkZW5WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SLCBkbCwgSW5XaWRlblZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluT3AsIERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSkpOworICAgIH0KKyAgfQorCisgIC8vIE90aGVyd2lzZSB1bnJvbGwgaW50byBzb21lIG5hc3R5IHNjYWxhciBjb2RlIGFuZCByZWJ1aWxkIHRoZSB2ZWN0b3IuCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBPcHMoV2lkZW5OdW1FbHRzKTsKKyAgRVZUIEVsdFZUID0gV2lkZW5WVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICB1bnNpZ25lZCBNaW5FbHRzID0gc3RkOjptaW4oSW5WVE51bUVsdHMsIFdpZGVuTnVtRWx0cyk7CisgIHVuc2lnbmVkIGk7CisgIGZvciAoaT0wOyBpIDwgTWluRWx0czsgKytpKQorICAgIE9wc1tpXSA9IERBRy5nZXROb2RlKE9wY29kZSwgZGwsIEVsdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgSW5FbHRWVCwgSW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoaSkpKTsKKworICBTRFZhbHVlIFVuZGVmVmFsID0gREFHLmdldFVOREVGKEVsdFZUKTsKKyAgZm9yICg7IGkgPCBXaWRlbk51bUVsdHM7ICsraSkKKyAgICBPcHNbaV0gPSBVbmRlZlZhbDsKKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBXaWRlblZULCAmT3BzWzBdLCBXaWRlbk51bUVsdHMpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OldpZGVuVmVjUmVzX1BPV0koU0ROb2RlICpOKSB7CisgIEVWVCBXaWRlblZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICBTRFZhbHVlIEluT3AgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIFNoT3AgPSBOLT5nZXRPcGVyYW5kKDEpOworICByZXR1cm4gREFHLmdldE5vZGUoTi0+Z2V0T3Bjb2RlKCksIE4tPmdldERlYnVnTG9jKCksIFdpZGVuVlQsIEluT3AsIFNoT3ApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OldpZGVuVmVjUmVzX1NoaWZ0KFNETm9kZSAqTikgeworICBFVlQgV2lkZW5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgU0RWYWx1ZSBJbk9wID0gR2V0V2lkZW5lZFZlY3RvcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgU0RWYWx1ZSBTaE9wID0gTi0+Z2V0T3BlcmFuZCgxKTsKKworICBFVlQgU2hWVCA9IFNoT3AuZ2V0VmFsdWVUeXBlKCk7CisgIGlmIChnZXRUeXBlQWN0aW9uKFNoVlQpID09IFdpZGVuVmVjdG9yKSB7CisgICAgU2hPcCA9IEdldFdpZGVuZWRWZWN0b3IoU2hPcCk7CisgICAgU2hWVCA9IFNoT3AuZ2V0VmFsdWVUeXBlKCk7CisgIH0KKyAgRVZUIFNoV2lkZW5WVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZW5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpKTsKKyAgaWYgKFNoVlQgIT0gU2hXaWRlblZUKQorICAgIFNoT3AgPSBNb2RpZnlUb1R5cGUoU2hPcCwgU2hXaWRlblZUKTsKKworICByZXR1cm4gREFHLmdldE5vZGUoTi0+Z2V0T3Bjb2RlKCksIE4tPmdldERlYnVnTG9jKCksIFdpZGVuVlQsIEluT3AsIFNoT3ApOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OldpZGVuVmVjUmVzX1VuYXJ5KFNETm9kZSAqTikgeworICAvLyBVbmFyeSBvcCB3aWRlbmluZy4KKyAgRVZUIFdpZGVuVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgSW5PcCA9IEdldFdpZGVuZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgTi0+Z2V0RGVidWdMb2MoKSwgV2lkZW5WVCwgSW5PcCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNSZXNfSW5yZWdPcChTRE5vZGUgKk4pIHsKKyAgRVZUIFdpZGVuVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIEVWVCBFeHRWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxWVFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldFZUKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVuVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSk7CisgIFNEVmFsdWUgV2lkZW5MSFMgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gREFHLmdldE5vZGUoTi0+Z2V0T3Bjb2RlKCksIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBXaWRlblZULCBXaWRlbkxIUywgREFHLmdldFZhbHVlVHlwZShFeHRWVCkpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OldpZGVuVmVjUmVzX0JJVF9DT05WRVJUKFNETm9kZSAqTikgeworICBTRFZhbHVlIEluT3AgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgSW5WVCA9IEluT3AuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRVZUIFdpZGVuVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIFZUKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIHN3aXRjaCAoZ2V0VHlwZUFjdGlvbihJblZUKSkgeworICBkZWZhdWx0OgorICAgIGFzc2VydChmYWxzZSAmJiAiVW5rbm93biB0eXBlIGFjdGlvbiEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBMZWdhbDoKKyAgICBicmVhazsKKyAgY2FzZSBQcm9tb3RlSW50ZWdlcjoKKyAgICAvLyBJZiB0aGUgSW5PcCBpcyBwcm9tb3RlZCB0byB0aGUgc2FtZSBzaXplLCBjb252ZXJ0IGl0LiAgT3RoZXJ3aXNlLAorICAgIC8vIGZhbGwgb3V0IG9mIHRoZSBzd2l0Y2ggYW5kIHdpZGVuIHRoZSBwcm9tb3RlZCBpbnB1dC4KKyAgICBJbk9wID0gR2V0UHJvbW90ZWRJbnRlZ2VyKEluT3ApOworICAgIEluVlQgPSBJbk9wLmdldFZhbHVlVHlwZSgpOworICAgIGlmIChXaWRlblZULmJpdHNFcShJblZUKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgV2lkZW5WVCwgSW5PcCk7CisgICAgYnJlYWs7CisgIGNhc2UgU29mdGVuRmxvYXQ6CisgIGNhc2UgRXhwYW5kSW50ZWdlcjoKKyAgY2FzZSBFeHBhbmRGbG9hdDoKKyAgY2FzZSBTY2FsYXJpemVWZWN0b3I6CisgIGNhc2UgU3BsaXRWZWN0b3I6CisgICAgYnJlYWs7CisgIGNhc2UgV2lkZW5WZWN0b3I6CisgICAgLy8gSWYgdGhlIEluT3AgaXMgd2lkZW5lZCB0byB0aGUgc2FtZSBzaXplLCBjb252ZXJ0IGl0LiAgT3RoZXJ3aXNlLCBmYWxsCisgICAgLy8gb3V0IG9mIHRoZSBzd2l0Y2ggYW5kIHdpZGVuIHRoZSB3aWRlbmVkIGlucHV0LgorICAgIEluT3AgPSBHZXRXaWRlbmVkVmVjdG9yKEluT3ApOworICAgIEluVlQgPSBJbk9wLmdldFZhbHVlVHlwZSgpOworICAgIGlmIChXaWRlblZULmJpdHNFcShJblZUKSkKKyAgICAgIC8vIFRoZSBpbnB1dCB3aWRlbnMgdG8gdGhlIHNhbWUgc2l6ZS4gQ29udmVydCB0byB0aGUgd2lkZW4gdmFsdWUuCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFdpZGVuVlQsIEluT3ApOworICAgIGJyZWFrOworICB9CisKKyAgdW5zaWduZWQgV2lkZW5TaXplID0gV2lkZW5WVC5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIEluU2l6ZSA9IEluVlQuZ2V0U2l6ZUluQml0cygpOworICBpZiAoV2lkZW5TaXplICUgSW5TaXplID09IDApIHsKKyAgICAvLyBEZXRlcm1pbmUgbmV3IGlucHV0IHZlY3RvciB0eXBlLiAgVGhlIG5ldyBpbnB1dCB2ZWN0b3IgdHlwZSB3aWxsIHVzZQorICAgIC8vIHRoZSBzYW1lIGVsZW1lbnQgdHlwZSAoaWYgaXRzIGEgdmVjdG9yKSBvciB1c2UgdGhlIGlucHV0IHR5cGUgYXMgYQorICAgIC8vIHZlY3Rvci4gIEl0IGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIHR5cGUgdG8gd2lkZW4gdG8uCisgICAgRVZUIE5ld0luVlQ7CisgICAgdW5zaWduZWQgTmV3TnVtRWx0cyA9IFdpZGVuU2l6ZSAvIEluU2l6ZTsKKyAgICBpZiAoSW5WVC5pc1ZlY3RvcigpKSB7CisgICAgICBFVlQgSW5FbHRWVCA9IEluVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICAgIE5ld0luVlQ9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIEluRWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVuU2l6ZSAvIEluRWx0VlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgICB9IGVsc2UgeworICAgICAgTmV3SW5WVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIEluVlQsIE5ld051bUVsdHMpOworICAgIH0KKworICAgIGlmIChUTEkuaXNUeXBlU3ludGhlc2l6YWJsZShOZXdJblZUKSkgeworICAgICAgLy8gQmVjYXVzZSB0aGUgcmVzdWx0IGFuZCB0aGUgaW5wdXQgYXJlIGRpZmZlcmVudCB2ZWN0b3IgdHlwZXMsIHdpZGVuaW5nCisgICAgICAvLyB0aGUgcmVzdWx0IGNvdWxkIGNyZWF0ZSBhIGxlZ2FsIHR5cGUgYnV0IHdpZGVuaW5nIHRoZSBpbnB1dCBtaWdodCBtYWtlCisgICAgICAvLyBpdCBhbiBpbGxlZ2FsIHR5cGUgdGhhdCBtaWdodCBsZWFkIHRvIHJlcGVhdGVkbHkgc3BsaXR0aW5nIHRoZSBpbnB1dAorICAgICAgLy8gYW5kIHRoZW4gd2lkZW5pbmcgaXQuIFRvIGF2b2lkIHRoaXMsIHdlIHdpZGVuIHRoZSBpbnB1dCBvbmx5IGlmCisgICAgICAvLyBpdCByZXN1bHRzIGluIGEgbGVnYWwgdHlwZS4KKyAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBPcHMoTmV3TnVtRWx0cyk7CisgICAgICBTRFZhbHVlIFVuZGVmVmFsID0gREFHLmdldFVOREVGKEluVlQpOworICAgICAgT3BzWzBdID0gSW5PcDsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBOZXdOdW1FbHRzOyArK2kpCisgICAgICAgIE9wc1tpXSA9IFVuZGVmVmFsOworCisgICAgICBTRFZhbHVlIE5ld1ZlYzsKKyAgICAgIGlmIChJblZULmlzVmVjdG9yKCkpCisgICAgICAgIE5ld1ZlYyA9IERBRy5nZXROb2RlKElTRDo6Q09OQ0FUX1ZFQ1RPUlMsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdJblZULCAmT3BzWzBdLCBOZXdOdW1FbHRzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTmV3VmVjID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdJblZULCAmT3BzWzBdLCBOZXdOdW1FbHRzKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgV2lkZW5WVCwgTmV3VmVjKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gQ3JlYXRlU3RhY2tTdG9yZUxvYWQoSW5PcCwgV2lkZW5WVCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNSZXNfQlVJTERfVkVDVE9SKFNETm9kZSAqTikgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIC8vIEJ1aWxkIGEgdmVjdG9yIHdpdGggdW5kZWZpbmVkIGZvciB0aGUgbmV3IG5vZGVzLgorICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIEVWVCBFbHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworCisgIEVWVCBXaWRlblZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBWVCk7CisgIHVuc2lnbmVkIFdpZGVuTnVtRWx0cyA9IFdpZGVuVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gTmV3T3BzKE4tPm9wX2JlZ2luKCksIE4tPm9wX2VuZCgpKTsKKyAgTmV3T3BzLnJlc2VydmUoV2lkZW5OdW1FbHRzKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gTnVtRWx0czsgaSA8IFdpZGVuTnVtRWx0czsgKytpKQorICAgIE5ld09wcy5wdXNoX2JhY2soREFHLmdldFVOREVGKEVsdFZUKSk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgV2lkZW5WVCwgJk5ld09wc1swXSwgTmV3T3BzLnNpemUoKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNSZXNfQ09OQ0FUX1ZFQ1RPUlMoU0ROb2RlICpOKSB7CisgIEVWVCBJblZUID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIFdpZGVuVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgV2lkZW5OdW1FbHRzID0gV2lkZW5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICB1bnNpZ25lZCBOdW1PcGVyYW5kcyA9IE4tPmdldE51bU9wZXJhbmRzKCk7CisKKyAgYm9vbCBJbnB1dFdpZGVuZWQgPSBmYWxzZTsgLy8gSW5kaWNhdGVzIHdlIG5lZWQgdG8gd2lkZW4gdGhlIGlucHV0LgorICBpZiAoZ2V0VHlwZUFjdGlvbihJblZUKSAhPSBXaWRlblZlY3RvcikgeworICAgIGlmIChXaWRlblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgJSBJblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0gMCkgeworICAgICAgLy8gQWRkIHVuZGVmIHZlY3RvcnMgdG8gd2lkZW4gdG8gY29ycmVjdCBsZW5ndGguCisgICAgICB1bnNpZ25lZCBOdW1Db25jYXQgPSBXaWRlblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgU0RWYWx1ZSBVbmRlZlZhbCA9IERBRy5nZXRVTkRFRihJblZUKTsKKyAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBPcHMoTnVtQ29uY2F0KTsKKyAgICAgIGZvciAodW5zaWduZWQgaT0wOyBpIDwgTnVtT3BlcmFuZHM7ICsraSkKKyAgICAgICAgT3BzW2ldID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IE51bU9wZXJhbmRzOyBpICE9IE51bUNvbmNhdDsgKytpKQorICAgICAgICBPcHNbaV0gPSBVbmRlZlZhbDsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkNPTkNBVF9WRUNUT1JTLCBkbCwgV2lkZW5WVCwgJk9wc1swXSwgTnVtQ29uY2F0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgSW5wdXRXaWRlbmVkID0gdHJ1ZTsKKyAgICBpZiAoV2lkZW5WVCA9PSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIEluVlQpKSB7CisgICAgICAvLyBUaGUgaW5wdXRzIGFuZCB0aGUgcmVzdWx0IGFyZSB3aWRlbiB0byB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgIHVuc2lnbmVkIGk7CisgICAgICBmb3IgKGk9MTsgaSA8IE51bU9wZXJhbmRzOyArK2kpCisgICAgICAgIGlmIChOLT5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpICE9IElTRDo6VU5ERUYpCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChpID4gTnVtT3BlcmFuZHMpCisgICAgICAgIC8vIEV2ZXJ5dGhpbmcgYnV0IHRoZSBmaXJzdCBvcGVyYW5kIGlzIGFuIFVOREVGIHNvIGp1c3QgcmV0dXJuIHRoZQorICAgICAgICAvLyB3aWRlbmVkIGZpcnN0IG9wZXJhbmQuCisgICAgICAgIHJldHVybiBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworCisgICAgICBpZiAoTnVtT3BlcmFuZHMgPT0gMikgeworICAgICAgICAvLyBSZXBsYWNlIGNvbmNhdCBvZiB0d28gb3BlcmFuZHMgd2l0aCBhIHNodWZmbGUuCisgICAgICAgIFNtYWxsVmVjdG9yPGludCwgMTY+IE1hc2tPcHMoV2lkZW5OdW1FbHRzKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpPTA7IGkgPCBXaWRlbk51bUVsdHMvMjsgKytpKSB7CisgICAgICAgICAgTWFza09wc1tpXSA9IGk7CisgICAgICAgICAgTWFza09wc1tpK1dpZGVuTnVtRWx0cy8yXSA9IGkrV2lkZW5OdW1FbHRzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShXaWRlblZULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFdpZGVuZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1hc2tPcHNbMF0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEZhbGwgYmFjayB0byB1c2UgZXh0cmFjdHMgYW5kIGJ1aWxkIHZlY3Rvci4KKyAgRVZUIEVsdFZUID0gV2lkZW5WVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICB1bnNpZ25lZCBOdW1JbkVsdHMgPSBJblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBPcHMoV2lkZW5OdW1FbHRzKTsKKyAgdW5zaWduZWQgSWR4ID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpPTA7IGkgPCBOdW1PcGVyYW5kczsgKytpKSB7CisgICAgU0RWYWx1ZSBJbk9wID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoSW5wdXRXaWRlbmVkKQorICAgICAgSW5PcCA9IEdldFdpZGVuZWRWZWN0b3IoSW5PcCk7CisgICAgZm9yICh1bnNpZ25lZCBqPTA7IGogPCBOdW1JbkVsdHM7ICsraikKKyAgICAgICAgT3BzW0lkeCsrXSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgRWx0VlQsIEluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoaikpOworICB9CisgIFNEVmFsdWUgVW5kZWZWYWwgPSBEQUcuZ2V0VU5ERUYoRWx0VlQpOworICBmb3IgKDsgSWR4IDwgV2lkZW5OdW1FbHRzOyArK0lkeCkKKyAgICBPcHNbSWR4XSA9IFVuZGVmVmFsOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBXaWRlblZULCAmT3BzWzBdLCBXaWRlbk51bUVsdHMpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OldpZGVuVmVjUmVzX0NPTlZFUlRfUk5EU0FUKFNETm9kZSAqTikgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgSW5PcCAgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFJuZE9wID0gTi0+Z2V0T3BlcmFuZCgzKTsKKyAgU0RWYWx1ZSBTYXRPcCA9IE4tPmdldE9wZXJhbmQoNCk7CisKKyAgRVZUICAgICAgV2lkZW5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICB1bnNpZ25lZCBXaWRlbk51bUVsdHMgPSBXaWRlblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgRVZUIEluVlQgPSBJbk9wLmdldFZhbHVlVHlwZSgpOworICBFVlQgSW5FbHRWVCA9IEluVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgRVZUIEluV2lkZW5WVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIEluRWx0VlQsIFdpZGVuTnVtRWx0cyk7CisKKyAgU0RWYWx1ZSBEVHlPcCA9IERBRy5nZXRWYWx1ZVR5cGUoV2lkZW5WVCk7CisgIFNEVmFsdWUgU1R5T3AgPSBEQUcuZ2V0VmFsdWVUeXBlKEluV2lkZW5WVCk7CisgIElTRDo6Q3Z0Q29kZSBDdnRDb2RlID0gY2FzdDxDdnRSbmRTYXRTRE5vZGU+KE4pLT5nZXRDdnRDb2RlKCk7CisKKyAgdW5zaWduZWQgSW5WVE51bUVsdHMgPSBJblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIGlmIChnZXRUeXBlQWN0aW9uKEluVlQpID09IFdpZGVuVmVjdG9yKSB7CisgICAgSW5PcCA9IEdldFdpZGVuZWRWZWN0b3IoSW5PcCk7CisgICAgSW5WVCA9IEluT3AuZ2V0VmFsdWVUeXBlKCk7CisgICAgSW5WVE51bUVsdHMgPSBJblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgaWYgKEluVlROdW1FbHRzID09IFdpZGVuTnVtRWx0cykKKyAgICAgIHJldHVybiBEQUcuZ2V0Q29udmVydFJuZFNhdChXaWRlblZULCBkbCwgSW5PcCwgRFR5T3AsIFNUeU9wLCBSbmRPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXRPcCwgQ3Z0Q29kZSk7CisgIH0KKworICBpZiAoVExJLmlzVHlwZVN5bnRoZXNpemFibGUoSW5XaWRlblZUKSkgeworICAgIC8vIEJlY2F1c2UgdGhlIHJlc3VsdCBhbmQgdGhlIGlucHV0IGFyZSBkaWZmZXJlbnQgdmVjdG9yIHR5cGVzLCB3aWRlbmluZworICAgIC8vIHRoZSByZXN1bHQgY291bGQgY3JlYXRlIGEgbGVnYWwgdHlwZSBidXQgd2lkZW5pbmcgdGhlIGlucHV0IG1pZ2h0IG1ha2UKKyAgICAvLyBpdCBhbiBpbGxlZ2FsIHR5cGUgdGhhdCBtaWdodCBsZWFkIHRvIHJlcGVhdGVkbHkgc3BsaXR0aW5nIHRoZSBpbnB1dAorICAgIC8vIGFuZCB0aGVuIHdpZGVuaW5nIGl0LiBUbyBhdm9pZCB0aGlzLCB3ZSB3aWRlbiB0aGUgaW5wdXQgb25seSBpZgorICAgIC8vIGl0IHJlc3VsdHMgaW4gYSBsZWdhbCB0eXBlLgorICAgIGlmIChXaWRlbk51bUVsdHMgJSBJblZUTnVtRWx0cyA9PSAwKSB7CisgICAgICAvLyBXaWRlbiB0aGUgaW5wdXQgYW5kIGNhbGwgY29udmVydCBvbiB0aGUgd2lkZW5lZCBpbnB1dCB2ZWN0b3IuCisgICAgICB1bnNpZ25lZCBOdW1Db25jYXQgPSBXaWRlbk51bUVsdHMvSW5WVE51bUVsdHM7CisgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gT3BzKE51bUNvbmNhdCk7CisgICAgICBPcHNbMF0gPSBJbk9wOworICAgICAgU0RWYWx1ZSBVbmRlZlZhbCA9IERBRy5nZXRVTkRFRihJblZUKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgIT0gTnVtQ29uY2F0OyArK2kpIHsKKyAgICAgICAgT3BzW2ldID0gVW5kZWZWYWw7CisgICAgICB9CisgICAgICBJbk9wID0gREFHLmdldE5vZGUoSVNEOjpDT05DQVRfVkVDVE9SUywgZGwsIEluV2lkZW5WVCwgJk9wc1swXSxOdW1Db25jYXQpOworICAgICAgcmV0dXJuIERBRy5nZXRDb252ZXJ0Um5kU2F0KFdpZGVuVlQsIGRsLCBJbk9wLCBEVHlPcCwgU1R5T3AsIFJuZE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdE9wLCBDdnRDb2RlKTsKKyAgICB9CisKKyAgICBpZiAoSW5WVE51bUVsdHMgJSBXaWRlbk51bUVsdHMgPT0gMCkgeworICAgICAgLy8gRXh0cmFjdCB0aGUgaW5wdXQgYW5kIGNvbnZlcnQgdGhlIHNob3J0ZW4gaW5wdXQgdmVjdG9yLgorICAgICAgSW5PcCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLCBJbldpZGVuVlQsIEluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Q29udmVydFJuZFNhdChXaWRlblZULCBkbCwgSW5PcCwgRFR5T3AsIFNUeU9wLCBSbmRPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F0T3AsIEN2dENvZGUpOworICAgIH0KKyAgfQorCisgIC8vIE90aGVyd2lzZSB1bnJvbGwgaW50byBzb21lIG5hc3R5IHNjYWxhciBjb2RlIGFuZCByZWJ1aWxkIHRoZSB2ZWN0b3IuCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBPcHMoV2lkZW5OdW1FbHRzKTsKKyAgRVZUIEVsdFZUID0gV2lkZW5WVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICBEVHlPcCA9IERBRy5nZXRWYWx1ZVR5cGUoRWx0VlQpOworICBTVHlPcCA9IERBRy5nZXRWYWx1ZVR5cGUoSW5FbHRWVCk7CisKKyAgdW5zaWduZWQgTWluRWx0cyA9IHN0ZDo6bWluKEluVlROdW1FbHRzLCBXaWRlbk51bUVsdHMpOworICB1bnNpZ25lZCBpOworICBmb3IgKGk9MDsgaSA8IE1pbkVsdHM7ICsraSkgeworICAgIFNEVmFsdWUgRXh0VmFsID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBJbkVsdFZULCBJbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KGkpKTsKKyAgICBPcHNbaV0gPSBEQUcuZ2V0Q29udmVydFJuZFNhdChXaWRlblZULCBkbCwgRXh0VmFsLCBEVHlPcCwgU1R5T3AsIFJuZE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdE9wLCBDdnRDb2RlKTsKKyAgfQorCisgIFNEVmFsdWUgVW5kZWZWYWwgPSBEQUcuZ2V0VU5ERUYoRWx0VlQpOworICBmb3IgKDsgaSA8IFdpZGVuTnVtRWx0czsgKytpKQorICAgIE9wc1tpXSA9IFVuZGVmVmFsOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIFdpZGVuVlQsICZPcHNbMF0sIFdpZGVuTnVtRWx0cyk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNSZXNfRVhUUkFDVF9TVUJWRUNUT1IoU0ROb2RlICpOKSB7CisgIEVWVCAgICAgIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBFVlQgICAgICBXaWRlblZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBWVCk7CisgIHVuc2lnbmVkIFdpZGVuTnVtRWx0cyA9IFdpZGVuVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgU0RWYWx1ZSAgSW5PcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgIElkeCAgPSBOLT5nZXRPcGVyYW5kKDEpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgaWYgKGdldFR5cGVBY3Rpb24oSW5PcC5nZXRWYWx1ZVR5cGUoKSkgPT0gV2lkZW5WZWN0b3IpCisgICAgSW5PcCA9IEdldFdpZGVuZWRWZWN0b3IoSW5PcCk7CisKKyAgRVZUIEluVlQgPSBJbk9wLmdldFZhbHVlVHlwZSgpOworCisgIENvbnN0YW50U0ROb2RlICpDSWR4ID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KElkeCk7CisgIGlmIChDSWR4KSB7CisgICAgdW5zaWduZWQgSWR4VmFsID0gQ0lkeC0+Z2V0WkV4dFZhbHVlKCk7CisgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGp1c3QgcmV0dXJuIHRoZSBpbnB1dCB2ZWN0b3IgYWZ0ZXIgd2lkZW5pbmcuCisgICAgaWYgKElkeFZhbCA9PSAwICYmIEluVlQgPT0gV2lkZW5WVCkKKyAgICAgIHJldHVybiBJbk9wOworCisgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGV4dHJhY3QgZnJvbSB0aGUgdmVjdG9yLgorICAgIHVuc2lnbmVkIEluTnVtRWx0cyA9IEluVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICBpZiAoSWR4VmFsICUgV2lkZW5OdW1FbHRzID09IDAgJiYgSWR4VmFsICsgV2lkZW5OdW1FbHRzIDwgSW5OdW1FbHRzKQorICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgZGwsIFdpZGVuVlQsIEluT3AsIElkeCk7CisgIH0KKworICAvLyBXZSBjb3VsZCB0cnkgd2lkZW5pbmcgdGhlIGlucHV0IHRvIHRoZSByaWdodCBsZW5ndGggYnV0IGZvciBub3csIGV4dHJhY3QKKyAgLy8gdGhlIG9yaWdpbmFsIGVsZW1lbnRzLCBmaWxsIHRoZSByZXN0IHdpdGggdW5kZWZzIGFuZCBidWlsZCBhIHZlY3Rvci4KKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+IE9wcyhXaWRlbk51bUVsdHMpOworICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICBFVlQgSWR4VlQgPSBJZHguZ2V0VmFsdWVUeXBlKCk7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICB1bnNpZ25lZCBpOworICBpZiAoQ0lkeCkgeworICAgIHVuc2lnbmVkIElkeFZhbCA9IENJZHgtPmdldFpFeHRWYWx1ZSgpOworICAgIGZvciAoaT0wOyBpIDwgTnVtRWx0czsgKytpKQorICAgICAgT3BzW2ldID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBFbHRWVCwgSW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJZHhWYWwraSwgSWR4VlQpKTsKKyAgfSBlbHNlIHsKKyAgICBPcHNbMF0gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIEVsdFZULCBJbk9wLCBJZHgpOworICAgIGZvciAoaT0xOyBpIDwgTnVtRWx0czsgKytpKSB7CisgICAgICBTRFZhbHVlIE5ld0lkeCA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgSWR4LmdldFZhbHVlVHlwZSgpLCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChpLCBJZHhWVCkpOworICAgICAgT3BzW2ldID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBFbHRWVCwgSW5PcCwgTmV3SWR4KTsKKyAgICB9CisgIH0KKworICBTRFZhbHVlIFVuZGVmVmFsID0gREFHLmdldFVOREVGKEVsdFZUKTsKKyAgZm9yICg7IGkgPCBXaWRlbk51bUVsdHM7ICsraSkKKyAgICBPcHNbaV0gPSBVbmRlZlZhbDsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgV2lkZW5WVCwgJk9wc1swXSwgV2lkZW5OdW1FbHRzKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpXaWRlblZlY1Jlc19JTlNFUlRfVkVDVE9SX0VMVChTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBJbk9wID0gR2V0V2lkZW5lZFZlY3RvcihOLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBJbk9wLmdldFZhbHVlVHlwZSgpLCBJbk9wLAorICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKSwgTi0+Z2V0T3BlcmFuZCgyKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNSZXNfTE9BRChTRE5vZGUgKk4pIHsKKyAgTG9hZFNETm9kZSAqTEQgPSBjYXN0PExvYWRTRE5vZGU+KE4pOworICBJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUgPSBMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpOworCisgIFNEVmFsdWUgUmVzdWx0OworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gTGRDaGFpbjsgIC8vIENoYWluIGZvciB0aGUgc2VyaWVzIG9mIGxvYWQKKyAgaWYgKEV4dFR5cGUgIT0gSVNEOjpOT05fRVhUTE9BRCkKKyAgICBSZXN1bHQgPSBHZW5XaWRlblZlY3RvckV4dExvYWRzKExkQ2hhaW4sIExELCBFeHRUeXBlKTsKKyAgZWxzZQorICAgIFJlc3VsdCA9IEdlbldpZGVuVmVjdG9yTG9hZHMoTGRDaGFpbiwgTEQpOworCisgIC8vIElmIHdlIGdlbmVyYXRlIGEgc2luZ2xlIGxvYWQsIHdlIGNhbiB1c2UgdGhhdCBmb3IgdGhlIGNoYWluLiAgT3RoZXJ3aXNlLAorICAvLyBidWlsZCBhIGZhY3RvciBub2RlIHRvIHJlbWVtYmVyIHRoZSBtdWx0aXBsZSBsb2FkcyBhcmUgaW5kZXBlbmRlbnQgYW5kCisgIC8vIGNoYWluIHRvIHRoYXQuCisgIFNEVmFsdWUgTmV3Q2hhaW47CisgIGlmIChMZENoYWluLnNpemUoKSA9PSAxKQorICAgIE5ld0NoYWluID0gTGRDaGFpblswXTsKKyAgZWxzZQorICAgIE5ld0NoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgTEQtPmdldERlYnVnTG9jKCksIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmTGRDaGFpblswXSwgTGRDaGFpbi5zaXplKCkpOworCisgIC8vIE1vZGlmaWVkIHRoZSBjaGFpbiAtIHN3aXRjaCBhbnl0aGluZyB0aGF0IHVzZWQgdGhlIG9sZCBjaGFpbiB0byB1c2UKKyAgLy8gdGhlIG5ldyBvbmUuCisgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCAxKSwgTmV3Q2hhaW4pOworCisgIHJldHVybiBSZXN1bHQ7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNSZXNfU0NBTEFSX1RPX1ZFQ1RPUihTRE5vZGUgKk4pIHsKKyAgRVZUIFdpZGVuVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBXaWRlblZULCBOLT5nZXRPcGVyYW5kKDApKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpXaWRlblZlY1Jlc19TRUxFQ1QoU0ROb2RlICpOKSB7CisgIEVWVCBXaWRlblZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICB1bnNpZ25lZCBXaWRlbk51bUVsdHMgPSBXaWRlblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgU0RWYWx1ZSBDb25kMSA9IE4tPmdldE9wZXJhbmQoMCk7CisgIEVWVCBDb25kVlQgPSBDb25kMS5nZXRWYWx1ZVR5cGUoKTsKKyAgaWYgKENvbmRWVC5pc1ZlY3RvcigpKSB7CisgICAgRVZUIENvbmRFbHRWVCA9IENvbmRWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgIEVWVCBDb25kV2lkZW5WVCA9ICBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRFbHRWVCwgV2lkZW5OdW1FbHRzKTsKKyAgICBpZiAoZ2V0VHlwZUFjdGlvbihDb25kVlQpID09IFdpZGVuVmVjdG9yKQorICAgICAgQ29uZDEgPSBHZXRXaWRlbmVkVmVjdG9yKENvbmQxKTsKKworICAgIGlmIChDb25kMS5nZXRWYWx1ZVR5cGUoKSAhPSBDb25kV2lkZW5WVCkKKyAgICAgICBDb25kMSA9IE1vZGlmeVRvVHlwZShDb25kMSwgQ29uZFdpZGVuVlQpOworICB9CisKKyAgU0RWYWx1ZSBJbk9wMSA9IEdldFdpZGVuZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgxKSk7CisgIFNEVmFsdWUgSW5PcDIgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMikpOworICBhc3NlcnQoSW5PcDEuZ2V0VmFsdWVUeXBlKCkgPT0gV2lkZW5WVCAmJiBJbk9wMi5nZXRWYWx1ZVR5cGUoKSA9PSBXaWRlblZUKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBOLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgV2lkZW5WVCwgQ29uZDEsIEluT3AxLCBJbk9wMik7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNSZXNfU0VMRUNUX0NDKFNETm9kZSAqTikgeworICBTRFZhbHVlIEluT3AxID0gR2V0V2lkZW5lZFZlY3RvcihOLT5nZXRPcGVyYW5kKDIpKTsKKyAgU0RWYWx1ZSBJbk9wMiA9IEdldFdpZGVuZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgzKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVF9DQywgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIEluT3AxLmdldFZhbHVlVHlwZSgpLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKSwgSW5PcDEsIEluT3AyLCBOLT5nZXRPcGVyYW5kKDQpKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpXaWRlblZlY1Jlc19TRVRDQyhTRE5vZGUgKk4pIHsKKyAgRVZUIFdpZGVuVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgIFNEVmFsdWUgSW5PcDEgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIEluT3AyID0gR2V0V2lkZW5lZFZlY3RvcihOLT5nZXRPcGVyYW5kKDEpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0VUQ0MsIE4tPmdldERlYnVnTG9jKCksIFdpZGVuVlQsCisgICAgICAgICAgICAgICAgICAgICBJbk9wMSwgSW5PcDIsIE4tPmdldE9wZXJhbmQoMikpOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OldpZGVuVmVjUmVzX1VOREVGKFNETm9kZSAqTikgeworIEVWVCBXaWRlblZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworIHJldHVybiBEQUcuZ2V0VU5ERUYoV2lkZW5WVCk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNSZXNfVkVDVE9SX1NIVUZGTEUoU2h1ZmZsZVZlY3RvclNETm9kZSAqTikgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBFVlQgV2lkZW5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSwgVlQpOworICB1bnNpZ25lZCBOdW1FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgdW5zaWduZWQgV2lkZW5OdW1FbHRzID0gV2lkZW5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworCisgIFNEVmFsdWUgSW5PcDEgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIEluT3AyID0gR2V0V2lkZW5lZFZlY3RvcihOLT5nZXRPcGVyYW5kKDEpKTsKKworICAvLyBBZGp1c3QgbWFzayBiYXNlZCBvbiBuZXcgaW5wdXQgdmVjdG9yIGxlbmd0aC4KKyAgU21hbGxWZWN0b3I8aW50LCAxNj4gTmV3TWFzazsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbHRzOyArK2kpIHsKKyAgICBpbnQgSWR4ID0gTi0+Z2V0TWFza0VsdChpKTsKKyAgICBpZiAoSWR4IDwgKGludClOdW1FbHRzKQorICAgICAgTmV3TWFzay5wdXNoX2JhY2soSWR4KTsKKyAgICBlbHNlCisgICAgICBOZXdNYXNrLnB1c2hfYmFjayhJZHggLSBOdW1FbHRzICsgV2lkZW5OdW1FbHRzKTsKKyAgfQorICBmb3IgKHVuc2lnbmVkIGkgPSBOdW1FbHRzOyBpICE9IFdpZGVuTnVtRWx0czsgKytpKQorICAgIE5ld01hc2sucHVzaF9iYWNrKC0xKTsKKyAgcmV0dXJuIERBRy5nZXRWZWN0b3JTaHVmZmxlKFdpZGVuVlQsIGRsLCBJbk9wMSwgSW5PcDIsICZOZXdNYXNrWzBdKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpXaWRlblZlY1Jlc19WU0VUQ0MoU0ROb2RlICpOKSB7CisgIEVWVCBXaWRlblZUID0gVExJLmdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICB1bnNpZ25lZCBXaWRlbk51bUVsdHMgPSBXaWRlblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgU0RWYWx1ZSBJbk9wMSA9IE4tPmdldE9wZXJhbmQoMCk7CisgIEVWVCBJblZUID0gSW5PcDEuZ2V0VmFsdWVUeXBlKCk7CisgIGFzc2VydChJblZULmlzVmVjdG9yKCkgJiYgImNhbiBub3Qgd2lkZW4gbm9uIHZlY3RvciB0eXBlIik7CisgIEVWVCBXaWRlbkluVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJblZULmdldFZlY3RvckVsZW1lbnRUeXBlKCksIFdpZGVuTnVtRWx0cyk7CisgIEluT3AxID0gR2V0V2lkZW5lZFZlY3RvcihJbk9wMSk7CisgIFNEVmFsdWUgSW5PcDIgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMSkpOworCisgIC8vIEFzc3VtZSB0aGF0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgYmUgd2lkZW4gYXBwcm9wcmlhdGVseS4gIElmIG5vdCwKKyAgLy8gd2Ugd2lsbCBoYXZlIHRvIHVucm9sbCBpdCBhdCBzb21lIHBvaW50LgorICBhc3NlcnQoSW5PcDEuZ2V0VmFsdWVUeXBlKCkgPT0gV2lkZW5JblZUICYmCisgICAgICAgICBJbk9wMi5nZXRWYWx1ZVR5cGUoKSA9PSBXaWRlbkluVlQgJiYKKyAgICAgICAgICJJbnB1dCBub3Qgd2lkZW5lZCB0byBleHBlY3RlZCB0eXBlISIpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpWU0VUQ0MsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBXaWRlblZULCBJbk9wMSwgSW5PcDIsIE4tPmdldE9wZXJhbmQoMikpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBXaWRlbiBWZWN0b3IgT3BlcmFuZAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2Jvb2wgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWN0b3JPcGVyYW5kKFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTm8pIHsKKyAgREVCVUcoZGJncygpIDw8ICJXaWRlbiBub2RlIG9wZXJhbmQgIiA8PCBSZXNObyA8PCAiOiAiOworICAgICAgICBOLT5kdW1wKCZEQUcpOworICAgICAgICBkYmdzKCkgPDwgIlxuIik7CisgIFNEVmFsdWUgUmVzID0gU0RWYWx1ZSgpOworCisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyNpZm5kZWYgTkRFQlVHCisgICAgZGJncygpIDw8ICJXaWRlblZlY3Rvck9wZXJhbmQgb3AgIyIgPDwgUmVzTm8gPDwgIjogIjsKKyAgICBOLT5kdW1wKCZEQUcpOworICAgIGRiZ3MoKSA8PCAiXG4iOworI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgiRG8gbm90IGtub3cgaG93IHRvIHdpZGVuIHRoaXMgb3BlcmF0b3IncyBvcGVyYW5kISIpOworCisgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDogICAgICAgIFJlcyA9IFdpZGVuVmVjT3BfQklUX0NPTlZFUlQoTik7IGJyZWFrOworICBjYXNlIElTRDo6Q09OQ0FUX1ZFQ1RPUlM6ICAgICBSZXMgPSBXaWRlblZlY09wX0NPTkNBVF9WRUNUT1JTKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SOiAgUmVzID0gV2lkZW5WZWNPcF9FWFRSQUNUX1NVQlZFQ1RPUihOKTsgYnJlYWs7CisgIGNhc2UgSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQ6IFJlcyA9IFdpZGVuVmVjT3BfRVhUUkFDVF9WRUNUT1JfRUxUKE4pOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNUT1JFOiAgICAgICAgICAgICAgUmVzID0gV2lkZW5WZWNPcF9TVE9SRShOKTsgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OkZQX1JPVU5EOgorICBjYXNlIElTRDo6RlBfVE9fU0lOVDoKKyAgY2FzZSBJU0Q6OkZQX1RPX1VJTlQ6CisgIGNhc2UgSVNEOjpTSU5UX1RPX0ZQOgorICBjYXNlIElTRDo6VUlOVF9UT19GUDoKKyAgY2FzZSBJU0Q6OlRSVU5DQVRFOgorICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6CisgIGNhc2UgSVNEOjpaRVJPX0VYVEVORDoKKyAgY2FzZSBJU0Q6OkFOWV9FWFRFTkQ6CisgICAgUmVzID0gV2lkZW5WZWNPcF9Db252ZXJ0KE4pOworICAgIGJyZWFrOworICB9CisKKyAgLy8gSWYgUmVzIGlzIG51bGwsIHRoZSBzdWItbWV0aG9kIHRvb2sgY2FyZSBvZiByZWdpc3RlcmluZyB0aGUgcmVzdWx0LgorICBpZiAoIVJlcy5nZXROb2RlKCkpIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGUgcmVzdWx0IGlzIE4sIHRoZSBzdWItbWV0aG9kIHVwZGF0ZWQgTiBpbiBwbGFjZS4gIFRlbGwgdGhlIGxlZ2FsaXplcgorICAvLyBjb3JlIGFib3V0IHRoaXMuCisgIGlmIChSZXMuZ2V0Tm9kZSgpID09IE4pCisgICAgcmV0dXJuIHRydWU7CisKKworICBhc3NlcnQoUmVzLmdldFZhbHVlVHlwZSgpID09IE4tPmdldFZhbHVlVHlwZSgwKSAmJiBOLT5nZXROdW1WYWx1ZXMoKSA9PSAxICYmCisgICAgICAgICAiSW52YWxpZCBvcGVyYW5kIGV4cGFuc2lvbiIpOworCisgIFJlcGxhY2VWYWx1ZVdpdGgoU0RWYWx1ZShOLCAwKSwgUmVzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6OldpZGVuVmVjT3BfQ29udmVydChTRE5vZGUgKk4pIHsKKyAgLy8gU2luY2UgdGhlIHJlc3VsdCBpcyBsZWdhbCBhbmQgdGhlIGlucHV0IGlzIGlsbGVnYWwsIGl0IGlzIHVubGlrZWx5CisgIC8vIHRoYXQgd2UgY2FuIGZpeCB0aGUgaW5wdXQgdG8gYSBsZWdhbCB0eXBlIHNvIHVucm9sbCB0aGUgY29udmVydAorICAvLyBpbnRvIHNvbWUgc2NhbGFyIGNvZGUgYW5kIGNyZWF0ZSBhIG5hc3R5IGJ1aWxkIHZlY3Rvci4KKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBTRFZhbHVlIEluT3AgPSBOLT5nZXRPcGVyYW5kKDApOworICBpZiAoZ2V0VHlwZUFjdGlvbihJbk9wLmdldFZhbHVlVHlwZSgpKSA9PSBXaWRlblZlY3RvcikKKyAgICBJbk9wID0gR2V0V2lkZW5lZFZlY3RvcihJbk9wKTsKKyAgRVZUIEluVlQgPSBJbk9wLmdldFZhbHVlVHlwZSgpOworICBFVlQgSW5FbHRWVCA9IEluVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKworICB1bnNpZ25lZCBPcGNvZGUgPSBOLT5nZXRPcGNvZGUoKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+IE9wcyhOdW1FbHRzKTsKKyAgZm9yICh1bnNpZ25lZCBpPTA7IGkgPCBOdW1FbHRzOyArK2kpCisgICAgT3BzW2ldID0gREFHLmdldE5vZGUoT3Bjb2RlLCBkbCwgRWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBJbkVsdFZULCBJbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChpKSkpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIFZULCAmT3BzWzBdLCBOdW1FbHRzKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpXaWRlblZlY09wX0JJVF9DT05WRVJUKFNETm9kZSAqTikgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIFNEVmFsdWUgSW5PcCA9IEdldFdpZGVuZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIEVWVCBJbldpZGVuVlQgPSBJbk9wLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgLy8gQ2hlY2sgaWYgd2UgY2FuIGNvbnZlcnQgYmV0d2VlbiB0d28gbGVnYWwgdmVjdG9yIHR5cGVzIGFuZCBleHRyYWN0LgorICB1bnNpZ25lZCBJbldpZGVuU2l6ZSA9IEluV2lkZW5WVC5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIFNpemUgPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgIGlmIChJbldpZGVuU2l6ZSAlIFNpemUgPT0gMCAmJiAhVlQuaXNWZWN0b3IoKSkgeworICAgIHVuc2lnbmVkIE5ld051bUVsdHMgPSBJbldpZGVuU2l6ZSAvIFNpemU7CisgICAgRVZUIE5ld1ZUID0gRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwgVlQsIE5ld051bUVsdHMpOworICAgIGlmIChUTEkuaXNUeXBlU3ludGhlc2l6YWJsZShOZXdWVCkpIHsKKyAgICAgIFNEVmFsdWUgQml0T3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTmV3VlQsIEluT3ApOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgVlQsIEJpdE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIENyZWF0ZVN0YWNrU3RvcmVMb2FkKEluT3AsIFZUKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpXaWRlblZlY09wX0NPTkNBVF9WRUNUT1JTKFNETm9kZSAqTikgeworICAvLyBJZiB0aGUgaW5wdXQgdmVjdG9yIGlzIG5vdCBsZWdhbCwgaXQgaXMgbGlrZWx5IHRoYXQgd2Ugd2lsbCBub3QgZmluZCBhCisgIC8vIGxlZ2FsIHZlY3RvciBvZiB0aGUgc2FtZSBzaXplLiBSZXBsYWNlIHRoZSBjb25jYXRlbmF0ZSB2ZWN0b3Igd2l0aCBhCisgIC8vIG5hc3R5IGJ1aWxkIHZlY3Rvci4KKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gT3BzKE51bUVsdHMpOworCisgIEVWVCBJblZUID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgTnVtSW5FbHRzID0gSW5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworCisgIHVuc2lnbmVkIElkeCA9IDA7CisgIHVuc2lnbmVkIE51bU9wZXJhbmRzID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgZm9yICh1bnNpZ25lZCBpPTA7IGkgPCBOdW1PcGVyYW5kczsgKytpKSB7CisgICAgU0RWYWx1ZSBJbk9wID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoZ2V0VHlwZUFjdGlvbihJbk9wLmdldFZhbHVlVHlwZSgpKSA9PSBXaWRlblZlY3RvcikKKyAgICAgIEluT3AgPSBHZXRXaWRlbmVkVmVjdG9yKEluT3ApOworICAgIGZvciAodW5zaWduZWQgaj0wOyBqIDwgTnVtSW5FbHRzOyArK2opCisgICAgICBPcHNbSWR4KytdID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBFbHRWVCwgSW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoaikpOworICB9CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIFZULCAmT3BzWzBdLCBOdW1FbHRzKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpXaWRlblZlY09wX0VYVFJBQ1RfU1VCVkVDVE9SKFNETm9kZSAqTikgeworICBTRFZhbHVlIEluT3AgPSBHZXRXaWRlbmVkVmVjdG9yKE4tPmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKSwgSW5PcCwgTi0+Z2V0T3BlcmFuZCgxKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNPcF9FWFRSQUNUX1ZFQ1RPUl9FTFQoU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgSW5PcCA9IEdldFdpZGVuZWRWZWN0b3IoTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKSwgSW5PcCwgTi0+Z2V0T3BlcmFuZCgxKSk7Cit9CisKK1NEVmFsdWUgREFHVHlwZUxlZ2FsaXplcjo6V2lkZW5WZWNPcF9TVE9SRShTRE5vZGUgKk4pIHsKKyAgLy8gV2UgaGF2ZSB0byB3aWRlbiB0aGUgdmFsdWUgYnV0IHdlIHdhbnQgb25seSB0byBzdG9yZSB0aGUgb3JpZ2luYWwKKyAgLy8gdmVjdG9yIHR5cGUuCisgIFN0b3JlU0ROb2RlICpTVCA9IGNhc3Q8U3RvcmVTRE5vZGU+KE4pOworCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBTdENoYWluOworICBpZiAoU1QtPmlzVHJ1bmNhdGluZ1N0b3JlKCkpCisgICAgR2VuV2lkZW5WZWN0b3JUcnVuY1N0b3JlcyhTdENoYWluLCBTVCk7CisgIGVsc2UKKyAgICBHZW5XaWRlblZlY3RvclN0b3JlcyhTdENoYWluLCBTVCk7CisKKyAgaWYgKFN0Q2hhaW4uc2l6ZSgpID09IDEpCisgICAgcmV0dXJuIFN0Q2hhaW5bMF07CisgIGVsc2UKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgU1QtPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsJlN0Q2hhaW5bMF0sU3RDaGFpbi5zaXplKCkpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVmVjdG9yIFdpZGVuaW5nIFV0aWxpdGllcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBmaW5kIHRoZSB0eXBlIHRvIGNob3AgdXAgYSB3aWRlbiB2ZWN0b3IgZm9yIGxvYWQvc3RvcmUKKy8vICBUTEk6ICAgICAgIFRhcmdldCBsb3dlcmluZyB1c2VkIHRvIGRldGVybWluZSBsZWdhbCB0eXBlcy4KKy8vICBXaWR0aDogICAgIFdpZHRoIGxlZnQgbmVlZCB0byBsb2FkL3N0b3JlLgorLy8gIFdpZGVuVlQ6ICAgVGhlIHdpZGVuIHZlY3RvciB0eXBlIHRvIGxvYWQgdG8vc3RvcmUgZnJvbQorLy8gIEFsaWduOiAgICAgSWYgMCwgZG9uJ3QgYWxsb3cgdXNlIG9mIGEgd2lkZXIgdHlwZQorLy8gIFdpZGVuRXg6ICAgSWYgQWxpZ24gaXMgbm90IDAsIHRoZSBhbW91bnQgYWRkaXRpb25hbCB3ZSBjYW4gbG9hZC9zdG9yZSBmcm9tLgorCitzdGF0aWMgRVZUIEZpbmRNZW1UeXBlKFNlbGVjdGlvbkRBRyYgREFHLCBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBXaWR0aCwgRVZUIFdpZGVuVlQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduID0gMCwgdW5zaWduZWQgV2lkZW5FeCA9IDApIHsKKyAgRVZUIFdpZGVuRWx0VlQgPSBXaWRlblZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIHVuc2lnbmVkIFdpZGVuV2lkdGggPSBXaWRlblZULmdldFNpemVJbkJpdHMoKTsKKyAgdW5zaWduZWQgV2lkZW5FbHRXaWR0aCA9IFdpZGVuRWx0VlQuZ2V0U2l6ZUluQml0cygpOworICB1bnNpZ25lZCBBbGlnbkluQml0cyA9IEFsaWduKjg7CisKKyAgLy8gSWYgd2UgaGF2ZSBvbmUgZWxlbWVudCB0byBsb2FkL3N0b3JlLCByZXR1cm4gaXQuCisgIEVWVCBSZXRWVCA9IFdpZGVuRWx0VlQ7CisgIGlmIChXaWR0aCA9PSBXaWRlbkVsdFdpZHRoKQorICAgIHJldHVybiBSZXRWVDsKKworICAvLyBTZWUgaWYgdGhlcmUgaXMgbGFyZ2VyIGxlZ2FsIGludGVnZXIgdGhhbiB0aGUgZWxlbWVudCB0eXBlIHRvIGxvYWQvc3RvcmUgCisgIHVuc2lnbmVkIFZUOworICBmb3IgKFZUID0gKHVuc2lnbmVkKU1WVDo6TEFTVF9JTlRFR0VSX1ZBTFVFVFlQRTsKKyAgICAgICBWVCA+PSAodW5zaWduZWQpTVZUOjpGSVJTVF9JTlRFR0VSX1ZBTFVFVFlQRTsgLS1WVCkgeworICAgIEVWVCBNZW1WVCgoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpIFZUKTsKKyAgICB1bnNpZ25lZCBNZW1WVFdpZHRoID0gTWVtVlQuZ2V0U2l6ZUluQml0cygpOworICAgIGlmIChNZW1WVC5nZXRTaXplSW5CaXRzKCkgPD0gV2lkZW5FbHRXaWR0aCkKKyAgICAgIGJyZWFrOworICAgIGlmIChUTEkuaXNUeXBlU3ludGhlc2l6YWJsZShNZW1WVCkgJiYgKFdpZGVuV2lkdGggJSBNZW1WVFdpZHRoKSA9PSAwICYmCisgICAgICAgIChNZW1WVFdpZHRoIDw9IFdpZHRoIHx8CisgICAgICAgICAoQWxpZ24hPTAgJiYgTWVtVlRXaWR0aDw9QWxpZ25JbkJpdHMgJiYgTWVtVlRXaWR0aDw9V2lkdGgrV2lkZW5FeCkpKSB7CisgICAgICBSZXRWVCA9IE1lbVZUOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgbGFyZ2VyIHZlY3RvciB0eXBlIHRvIGxvYWQvc3RvcmUgdGhhdCBoYXMgdGhlIHNhbWUgdmVjdG9yCisgIC8vIGVsZW1lbnQgdHlwZSBhbmQgaXMgZXZlbmx5IGRpdmlzaWJsZSB3aXRoIHRoZSBXaWRlblZULgorICBmb3IgKFZUID0gKHVuc2lnbmVkKU1WVDo6TEFTVF9WRUNUT1JfVkFMVUVUWVBFOworICAgICAgIFZUID49ICh1bnNpZ25lZClNVlQ6OkZJUlNUX1ZFQ1RPUl9WQUxVRVRZUEU7IC0tVlQpIHsKKyAgICBFVlQgTWVtVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpIFZUOworICAgIHVuc2lnbmVkIE1lbVZUV2lkdGggPSBNZW1WVC5nZXRTaXplSW5CaXRzKCk7CisgICAgaWYgKFRMSS5pc1R5cGVTeW50aGVzaXphYmxlKE1lbVZUKSAmJiBXaWRlbkVsdFZUID09IE1lbVZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgKFdpZGVuV2lkdGggJSBNZW1WVFdpZHRoKSA9PSAwICYmCisgICAgICAgIChNZW1WVFdpZHRoIDw9IFdpZHRoIHx8CisgICAgICAgICAoQWxpZ24hPTAgJiYgTWVtVlRXaWR0aDw9QWxpZ25JbkJpdHMgJiYgTWVtVlRXaWR0aDw9V2lkdGgrV2lkZW5FeCkpKSB7CisgICAgICBpZiAoUmV0VlQuZ2V0U2l6ZUluQml0cygpIDwgTWVtVlRXaWR0aCB8fCBNZW1WVCA9PSBXaWRlblZUKQorICAgICAgICByZXR1cm4gTWVtVlQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFJldFZUOworfQorCisvLyBCdWlsZHMgYSB2ZWN0b3IgdHlwZSBmcm9tIHNjYWxhciBsb2FkcworLy8gIFZlY1R5OiBSZXN1bHRpbmcgVmVjdG9yIHR5cGUKKy8vICBMRE9wczogTG9hZCBvcGVyYXRvcnMgdG8gYnVpbGQgYSB2ZWN0b3IgdHlwZQorLy8gIFtTdGFydCxFbmQpIHRoZSBsaXN0IG9mIGxvYWRzIHRvIHVzZS4KK3N0YXRpYyBTRFZhbHVlIEJ1aWxkVmVjdG9yRnJvbVNjYWxhcihTZWxlY3Rpb25EQUcmIERBRywgRVZUIFZlY1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiYgTGRPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RhcnQsIHVuc2lnbmVkIEVuZCkgeworICBEZWJ1Z0xvYyBkbCA9IExkT3BzW1N0YXJ0XS5nZXREZWJ1Z0xvYygpOworICBFVlQgTGRUeSA9IExkT3BzW1N0YXJ0XS5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgV2lkdGggPSBWZWNUeS5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBXaWR0aCAvIExkVHkuZ2V0U2l6ZUluQml0cygpOworICBFVlQgTmV3VmVjVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBMZFR5LCBOdW1FbHRzKTsKKworICB1bnNpZ25lZCBJZHggPSAxOworICBTRFZhbHVlIFZlY09wID0gREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwgTmV3VmVjVlQsTGRPcHNbU3RhcnRdKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSBTdGFydCArIDE7IGkgIT0gRW5kOyArK2kpIHsKKyAgICBFVlQgTmV3TGRUeSA9IExkT3BzW2ldLmdldFZhbHVlVHlwZSgpOworICAgIGlmIChOZXdMZFR5ICE9IExkVHkpIHsKKyAgICAgIE51bUVsdHMgPSBXaWR0aCAvIE5ld0xkVHkuZ2V0U2l6ZUluQml0cygpOworICAgICAgTmV3VmVjVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBOZXdMZFR5LCBOdW1FbHRzKTsKKyAgICAgIFZlY09wID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE5ld1ZlY1ZULCBWZWNPcCk7CisgICAgICAvLyBSZWFkanVzdCBwb3NpdGlvbiBhbmQgdmVjdG9yIHBvc2l0aW9uIGJhc2VkIG9uIG5ldyBsb2FkIHR5cGUKKyAgICAgIElkeCA9IElkeCAqIExkVHkuZ2V0U2l6ZUluQml0cygpIC8gTmV3TGRUeS5nZXRTaXplSW5CaXRzKCk7CisgICAgICBMZFR5ID0gTmV3TGRUeTsKKyAgICB9CisgICAgVmVjT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCBkbCwgTmV3VmVjVlQsIFZlY09wLCBMZE9wc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJZHgrKykpOworICB9CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVmVjVHksIFZlY09wKTsKK30KKworU0RWYWx1ZSBEQUdUeXBlTGVnYWxpemVyOjpHZW5XaWRlblZlY3RvckxvYWRzKFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiYgTGRDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkU0ROb2RlICogTEQpIHsKKyAgLy8gVGhlIHN0cmF0ZWd5IGFzc3VtZXMgdGhhdCB3ZSBjYW4gZWZmaWNpZW50bHkgbG9hZCBwb3dlcnMgb2YgdHdvIHdpZHRocy4KKyAgLy8gVGhlIHJvdXRpbmVzIGNob3BzIHRoZSB2ZWN0b3IgaW50byB0aGUgbGFyZ2VzdCB2ZWN0b3IgbG9hZHMgd2l0aCB0aGUgc2FtZQorICAvLyBlbGVtZW50IHR5cGUgb3Igc2NhbGFyIGxvYWRzIGFuZCB0aGVuIHJlY29tYmluZXMgaXQgdG8gdGhlIHdpZGVuIHZlY3RvcgorICAvLyB0eXBlLgorICBFVlQgV2lkZW5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSxMRC0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgdW5zaWduZWQgV2lkZW5XaWR0aCA9IFdpZGVuVlQuZ2V0U2l6ZUluQml0cygpOworICBFVlQgTGRWVCAgICA9IExELT5nZXRNZW1vcnlWVCgpOworICBEZWJ1Z0xvYyBkbCA9IExELT5nZXREZWJ1Z0xvYygpOworICBhc3NlcnQoTGRWVC5pc1ZlY3RvcigpICYmIFdpZGVuVlQuaXNWZWN0b3IoKSk7CisgIGFzc2VydChMZFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgPT0gV2lkZW5WVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpKTsKKworICAvLyBMb2FkIGluZm9ybWF0aW9uCisgIFNEVmFsdWUgICBDaGFpbiA9IExELT5nZXRDaGFpbigpOworICBTRFZhbHVlICAgQmFzZVB0ciA9IExELT5nZXRCYXNlUHRyKCk7CisgIGludCAgICAgICBTVk9mZnNldCA9IExELT5nZXRTcmNWYWx1ZU9mZnNldCgpOworICB1bnNpZ25lZCAgQWxpZ24gICAgPSBMRC0+Z2V0QWxpZ25tZW50KCk7CisgIGJvb2wgICAgICBpc1ZvbGF0aWxlID0gTEQtPmlzVm9sYXRpbGUoKTsKKyAgYm9vbCAgICAgIGlzTm9uVGVtcG9yYWwgPSBMRC0+aXNOb25UZW1wb3JhbCgpOworICBjb25zdCBWYWx1ZSAqU1YgPSBMRC0+Z2V0U3JjVmFsdWUoKTsKKworICBpbnQgTGRXaWR0aCA9IExkVlQuZ2V0U2l6ZUluQml0cygpOworICBpbnQgV2lkdGhEaWZmID0gV2lkZW5XaWR0aCAtIExkV2lkdGg7ICAgICAgICAgIC8vIERpZmZlcmVuY2UKKyAgdW5zaWduZWQgTGRBbGlnbiA9IChpc1ZvbGF0aWxlKSA/IDAgOiBBbGlnbjsgLy8gQWxsb3cgd2lkZXIgbG9hZHMKKworICAvLyBGaW5kIHRoZSB2ZWN0b3IgdHlwZSB0aGF0IGNhbiBsb2FkIGZyb20uCisgIEVWVCBOZXdWVCA9IEZpbmRNZW1UeXBlKERBRywgVExJLCBMZFdpZHRoLCBXaWRlblZULCBMZEFsaWduLCBXaWR0aERpZmYpOworICBpbnQgTmV3VlRXaWR0aCA9IE5ld1ZULmdldFNpemVJbkJpdHMoKTsKKyAgU0RWYWx1ZSBMZE9wID0gREFHLmdldExvYWQoTmV3VlQsIGRsLCBDaGFpbiwgQmFzZVB0ciwgU1YsIFNWT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLCBBbGlnbik7CisgIExkQ2hhaW4ucHVzaF9iYWNrKExkT3AuZ2V0VmFsdWUoMSkpOworCisgIC8vIENoZWNrIGlmIHdlIGNhbiBsb2FkIHRoZSBlbGVtZW50IHdpdGggb25lIGluc3RydWN0aW9uCisgIGlmIChMZFdpZHRoIDw9IE5ld1ZUV2lkdGgpIHsKKyAgICBpZiAoTmV3VlQuaXNWZWN0b3IoKSkgeworICAgICAgaWYgKE5ld1ZUICE9IFdpZGVuVlQpIHsKKyAgICAgICAgYXNzZXJ0KFdpZGVuV2lkdGggJSBOZXdWVFdpZHRoID09IDApOworICAgICAgICB1bnNpZ25lZCBOdW1Db25jYXQgPSBXaWRlbldpZHRoIC8gTmV3VlRXaWR0aDsKKyAgICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+IENvbmNhdE9wcyhOdW1Db25jYXQpOworICAgICAgICBTRFZhbHVlIFVuZGVmVmFsID0gREFHLmdldFVOREVGKE5ld1ZUKTsKKyAgICAgICAgQ29uY2F0T3BzWzBdID0gTGRPcDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBOdW1Db25jYXQ7ICsraSkKKyAgICAgICAgICBDb25jYXRPcHNbaV0gPSBVbmRlZlZhbDsKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Q09OQ0FUX1ZFQ1RPUlMsIGRsLCBXaWRlblZULCAmQ29uY2F0T3BzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ29uY2F0KTsKKyAgICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gTGRPcDsKKyAgICB9IGVsc2UgeworICAgICAgdW5zaWduZWQgTnVtRWx0cyA9IFdpZGVuV2lkdGggLyBOZXdWVFdpZHRoOworICAgICAgRVZUIE5ld1ZlY1ZUID0gRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwgTmV3VlQsIE51bUVsdHMpOworICAgICAgU0RWYWx1ZSBWZWNPcCA9IERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIE5ld1ZlY1ZULCBMZE9wKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgV2lkZW5WVCwgVmVjT3ApOworICAgIH0KKyAgfQorCisgIC8vIExvYWQgdmVjdG9yIGJ5IHVzaW5nIG11bHRpcGxlIGxvYWRzIGZyb20gbGFyZ2VzdCB2ZWN0b3IgdG8gc2NhbGFyCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBMZE9wczsKKyAgTGRPcHMucHVzaF9iYWNrKExkT3ApOworCisgIExkV2lkdGggLT0gTmV3VlRXaWR0aDsKKyAgdW5zaWduZWQgT2Zmc2V0ID0gMDsKKworICB3aGlsZSAoTGRXaWR0aCA+IDApIHsKKyAgICB1bnNpZ25lZCBJbmNyZW1lbnQgPSBOZXdWVFdpZHRoIC8gODsKKyAgICBPZmZzZXQgKz0gSW5jcmVtZW50OworICAgIEJhc2VQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIEJhc2VQdHIuZ2V0VmFsdWVUeXBlKCksIEJhc2VQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJbmNyZW1lbnQpKTsKKworICAgIGlmIChMZFdpZHRoIDwgTmV3VlRXaWR0aCkgeworICAgICAgLy8gT3VyIGN1cnJlbnQgdHlwZSB3ZSBhcmUgdXNpbmcgaXMgdG9vIGxhcmdlLCBmaW5kIGEgYmV0dGVyIHNpemUKKyAgICAgIE5ld1ZUID0gRmluZE1lbVR5cGUoREFHLCBUTEksIExkV2lkdGgsIFdpZGVuVlQsIExkQWxpZ24sIFdpZHRoRGlmZik7CisgICAgICBOZXdWVFdpZHRoID0gTmV3VlQuZ2V0U2l6ZUluQml0cygpOworICAgIH0KKworICAgIFNEVmFsdWUgTGRPcCA9IERBRy5nZXRMb2FkKE5ld1ZULCBkbCwgQ2hhaW4sIEJhc2VQdHIsIFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWT2Zmc2V0K09mZnNldCwgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05vblRlbXBvcmFsLCBNaW5BbGlnbihBbGlnbiwgSW5jcmVtZW50KSk7CisgICAgTGRDaGFpbi5wdXNoX2JhY2soTGRPcC5nZXRWYWx1ZSgxKSk7CisgICAgTGRPcHMucHVzaF9iYWNrKExkT3ApOworCisgICAgTGRXaWR0aCAtPSBOZXdWVFdpZHRoOworICB9CisKKyAgLy8gQnVpbGQgdGhlIHZlY3RvciBmcm9tIHRoZSBsb2FkcyBvcGVyYXRpb25zCisgIHVuc2lnbmVkIEVuZCA9IExkT3BzLnNpemUoKTsKKyAgaWYgKExkT3BzWzBdLmdldFZhbHVlVHlwZSgpLmlzVmVjdG9yKCkpIHsKKyAgICAvLyBJZiB0aGUgbG9hZCBjb250YWlucyB2ZWN0b3JzLCBidWlsZCB0aGUgdmVjdG9yIHVzaW5nIGNvbmNhdCB2ZWN0b3IuCisgICAgLy8gQWxsIG9mIHRoZSB2ZWN0b3JzIHVzZWQgdG8gbG9hZHMgYXJlIHBvd2VyIG9mIDIgYW5kIHRoZSBzY2FsYXJzIGxvYWQKKyAgICAvLyBjYW4gYmUgY29tYmluZWQgdG8gbWFrZSBhIHBvd2VyIG9mIDIgdmVjdG9yLgorICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBDb25jYXRPcHMoRW5kKTsKKyAgICBpbnQgaSA9IEVuZCAtIDE7CisgICAgaW50IElkeCA9IEVuZDsKKyAgICBFVlQgTGRUeSA9IExkT3BzW2ldLmdldFZhbHVlVHlwZSgpOworICAgIC8vIEZpcnN0IGNvbWJpbmUgdGhlIHNjYWxhciBsb2FkcyB0byBhIHZlY3RvcgorICAgIGlmICghTGRUeS5pc1ZlY3RvcigpKSAgeworICAgICAgZm9yICgtLWk7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIExkVHkgPSBMZE9wc1tpXS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgICAgaWYgKExkVHkuaXNWZWN0b3IoKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIENvbmNhdE9wc1stLUlkeF0gPSBCdWlsZFZlY3RvckZyb21TY2FsYXIoREFHLCBMZFR5LCBMZE9wcywgaSsxLCBFbmQpOworICAgIH0KKyAgICBDb25jYXRPcHNbLS1JZHhdID0gTGRPcHNbaV07CisgICAgZm9yICgtLWk7IGkgPj0gMDsgLS1pKSB7CisgICAgICBFVlQgTmV3TGRUeSA9IExkT3BzW2ldLmdldFZhbHVlVHlwZSgpOworICAgICAgaWYgKE5ld0xkVHkgIT0gTGRUeSkgeworICAgICAgICAvLyBDcmVhdGUgYSBsYXJnZXIgdmVjdG9yCisgICAgICAgIENvbmNhdE9wc1tFbmQtMV0gPSBEQUcuZ2V0Tm9kZShJU0Q6OkNPTkNBVF9WRUNUT1JTLCBkbCwgTmV3TGRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb25jYXRPcHNbSWR4XSwgRW5kIC0gSWR4KTsKKyAgICAgICAgSWR4ID0gRW5kIC0gMTsKKyAgICAgICAgTGRUeSA9IE5ld0xkVHk7CisgICAgICB9CisgICAgICBDb25jYXRPcHNbLS1JZHhdID0gTGRPcHNbaV07CisgICAgfQorCisgICAgaWYgKFdpZGVuV2lkdGggIT0gTGRUeS5nZXRTaXplSW5CaXRzKCkqKEVuZCAtIElkeCkpIHsKKyAgICAgIC8vIFdlIG5lZWQgdG8gZmlsbCB0aGUgcmVzdCB3aXRoIHVuZGVmcyB0byBidWlsZCB0aGUgdmVjdG9yCisgICAgICB1bnNpZ25lZCBOdW1PcHMgPSBXaWRlbldpZHRoIC8gTGRUeS5nZXRTaXplSW5CaXRzKCk7CisgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gV2lkZW5PcHMoTnVtT3BzKTsKKyAgICAgIFNEVmFsdWUgVW5kZWZWYWwgPSBEQUcuZ2V0VU5ERUYoTGRUeSk7CisgICAgICB1bnNpZ25lZCBpID0gMDsKKyAgICAgIGZvciAoOyBpICE9IEVuZC1JZHg7ICsraSkKKyAgICAgICAgV2lkZW5PcHNbaV0gPSBDb25jYXRPcHNbSWR4K2ldOworICAgICAgZm9yICg7IGkgIT0gTnVtT3BzOyArK2kpCisgICAgICAgIFdpZGVuT3BzW2ldID0gVW5kZWZWYWw7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpDT05DQVRfVkVDVE9SUywgZGwsIFdpZGVuVlQsICZXaWRlbk9wc1swXSxOdW1PcHMpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Q09OQ0FUX1ZFQ1RPUlMsIGRsLCBXaWRlblZULAorICAgICAgICAgICAgICAgICAgICAgICAgICZDb25jYXRPcHNbSWR4XSwgRW5kIC0gSWR4KTsKKyAgfSBlbHNlIC8vIEFsbCB0aGUgbG9hZHMgYXJlIHNjYWxhciBsb2Fkcy4KKyAgICByZXR1cm4gQnVpbGRWZWN0b3JGcm9tU2NhbGFyKERBRywgV2lkZW5WVCwgTGRPcHMsIDAsIEVuZCk7Cit9CisKK1NEVmFsdWUKK0RBR1R5cGVMZWdhbGl6ZXI6OkdlbldpZGVuVmVjdG9yRXh0TG9hZHMoU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+JiBMZENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkU0ROb2RlICogTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6TG9hZEV4dFR5cGUgRXh0VHlwZSkgeworICAvLyBGb3IgZXh0ZW5zaW9uIGxvYWRzLCBpdCBtYXkgbm90IGJlIG1vcmUgZWZmaWNpZW50IHRvIGNob3AgdXAgdGhlIHZlY3RvcgorICAvLyBhbmQgdGhlbiBleHRlbmRlZCBpdC4gIEluc3RlYWQsIHdlIHVucm9sbCB0aGUgbG9hZCBhbmQgYnVpbGQgYSBuZXcgdmVjdG9yLgorICBFVlQgV2lkZW5WVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbygqREFHLmdldENvbnRleHQoKSxMRC0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgRVZUIExkVlQgICAgPSBMRC0+Z2V0TWVtb3J5VlQoKTsKKyAgRGVidWdMb2MgZGwgPSBMRC0+Z2V0RGVidWdMb2MoKTsKKyAgYXNzZXJ0KExkVlQuaXNWZWN0b3IoKSAmJiBXaWRlblZULmlzVmVjdG9yKCkpOworCisgIC8vIExvYWQgaW5mb3JtYXRpb24KKyAgU0RWYWx1ZSAgIENoYWluID0gTEQtPmdldENoYWluKCk7CisgIFNEVmFsdWUgICBCYXNlUHRyID0gTEQtPmdldEJhc2VQdHIoKTsKKyAgaW50ICAgICAgIFNWT2Zmc2V0ID0gTEQtPmdldFNyY1ZhbHVlT2Zmc2V0KCk7CisgIHVuc2lnbmVkICBBbGlnbiAgICA9IExELT5nZXRBbGlnbm1lbnQoKTsKKyAgYm9vbCAgICAgIGlzVm9sYXRpbGUgPSBMRC0+aXNWb2xhdGlsZSgpOworICBib29sICAgICAgaXNOb25UZW1wb3JhbCA9IExELT5pc05vblRlbXBvcmFsKCk7CisgIGNvbnN0IFZhbHVlICpTViA9IExELT5nZXRTcmNWYWx1ZSgpOworCisgIEVWVCBFbHRWVCA9IFdpZGVuVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgRVZUIExkRWx0VlQgPSBMZFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBMZFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgLy8gTG9hZCBlYWNoIGVsZW1lbnQgYW5kIHdpZGVuCisgIHVuc2lnbmVkIFdpZGVuTnVtRWx0cyA9IFdpZGVuVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+IE9wcyhXaWRlbk51bUVsdHMpOworICB1bnNpZ25lZCBJbmNyZW1lbnQgPSBMZEVsdFZULmdldFNpemVJbkJpdHMoKSAvIDg7CisgIE9wc1swXSA9IERBRy5nZXRFeHRMb2FkKEV4dFR5cGUsIEVsdFZULCBkbCwgQ2hhaW4sIEJhc2VQdHIsIFNWLCBTVk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGRFbHRWVCwgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwgQWxpZ24pOworICBMZENoYWluLnB1c2hfYmFjayhPcHNbMF0uZ2V0VmFsdWUoMSkpOworICB1bnNpZ25lZCBpID0gMCwgT2Zmc2V0ID0gSW5jcmVtZW50OworICBmb3IgKGk9MTsgaSA8IE51bUVsdHM7ICsraSwgT2Zmc2V0ICs9IEluY3JlbWVudCkgeworICAgIFNEVmFsdWUgTmV3QmFzZVB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgQmFzZVB0ci5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlUHRyLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoT2Zmc2V0KSk7CisgICAgT3BzW2ldID0gREFHLmdldEV4dExvYWQoRXh0VHlwZSwgRWx0VlQsIGRsLCBDaGFpbiwgTmV3QmFzZVB0ciwgU1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQgKyBPZmZzZXQsIExkRWx0VlQsIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOb25UZW1wb3JhbCwgQWxpZ24pOworICAgIExkQ2hhaW4ucHVzaF9iYWNrKE9wc1tpXS5nZXRWYWx1ZSgxKSk7CisgIH0KKworICAvLyBGaWxsIHRoZSByZXN0IHdpdGggdW5kZWZzCisgIFNEVmFsdWUgVW5kZWZWYWwgPSBEQUcuZ2V0VU5ERUYoRWx0VlQpOworICBmb3IgKDsgaSAhPSBXaWRlbk51bUVsdHM7ICsraSkKKyAgICBPcHNbaV0gPSBVbmRlZlZhbDsKKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBXaWRlblZULCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKK30KKworCit2b2lkIERBR1R5cGVMZWdhbGl6ZXI6OkdlbldpZGVuVmVjdG9yU3RvcmVzKFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiYgU3RDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVTRE5vZGUgKlNUKSB7CisgIC8vIFRoZSBzdHJhdGVneSBhc3N1bWVzIHRoYXQgd2UgY2FuIGVmZmljaWVudGx5IHN0b3JlIHBvd2VycyBvZiB0d28gd2lkdGhzLgorICAvLyBUaGUgcm91dGluZXMgY2hvcHMgdGhlIHZlY3RvciBpbnRvIHRoZSBsYXJnZXN0IHZlY3RvciBzdG9yZXMgd2l0aCB0aGUgc2FtZQorICAvLyBlbGVtZW50IHR5cGUgb3Igc2NhbGFyIHN0b3Jlcy4KKyAgU0RWYWx1ZSAgQ2hhaW4gPSBTVC0+Z2V0Q2hhaW4oKTsKKyAgU0RWYWx1ZSAgQmFzZVB0ciA9IFNULT5nZXRCYXNlUHRyKCk7CisgIGNvbnN0ICAgIFZhbHVlICpTViA9IFNULT5nZXRTcmNWYWx1ZSgpOworICBpbnQgICAgICBTVk9mZnNldCA9IFNULT5nZXRTcmNWYWx1ZU9mZnNldCgpOworICB1bnNpZ25lZCBBbGlnbiA9IFNULT5nZXRBbGlnbm1lbnQoKTsKKyAgYm9vbCAgICAgaXNWb2xhdGlsZSA9IFNULT5pc1ZvbGF0aWxlKCk7CisgIGJvb2wgICAgIGlzTm9uVGVtcG9yYWwgPSBTVC0+aXNOb25UZW1wb3JhbCgpOworICBTRFZhbHVlICBWYWxPcCA9IEdldFdpZGVuZWRWZWN0b3IoU1QtPmdldFZhbHVlKCkpOworICBEZWJ1Z0xvYyBkbCA9IFNULT5nZXREZWJ1Z0xvYygpOworCisgIEVWVCBTdFZUID0gU1QtPmdldE1lbW9yeVZUKCk7CisgIHVuc2lnbmVkIFN0V2lkdGggPSBTdFZULmdldFNpemVJbkJpdHMoKTsKKyAgRVZUIFZhbFZUID0gVmFsT3AuZ2V0VmFsdWVUeXBlKCk7CisgIHVuc2lnbmVkIFZhbFdpZHRoID0gVmFsVlQuZ2V0U2l6ZUluQml0cygpOworICBFVlQgVmFsRWx0VlQgPSBWYWxWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICB1bnNpZ25lZCBWYWxFbHRXaWR0aCA9IFZhbEVsdFZULmdldFNpemVJbkJpdHMoKTsKKyAgYXNzZXJ0KFN0VlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSA9PSBWYWxFbHRWVCk7CisKKyAgaW50IElkeCA9IDA7ICAgICAgICAgIC8vIGN1cnJlbnQgaW5kZXggdG8gc3RvcmUKKyAgdW5zaWduZWQgT2Zmc2V0ID0gMDsgIC8vIG9mZnNldCBmcm9tIGJhc2UgdG8gc3RvcmUKKyAgd2hpbGUgKFN0V2lkdGggIT0gMCkgeworICAgIC8vIEZpbmQgdGhlIGxhcmdlc3QgdmVjdG9yIHR5cGUgd2UgY2FuIHN0b3JlIHdpdGgKKyAgICBFVlQgTmV3VlQgPSBGaW5kTWVtVHlwZShEQUcsIFRMSSwgU3RXaWR0aCwgVmFsVlQpOworICAgIHVuc2lnbmVkIE5ld1ZUV2lkdGggPSBOZXdWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgdW5zaWduZWQgSW5jcmVtZW50ID0gTmV3VlRXaWR0aCAvIDg7CisgICAgaWYgKE5ld1ZULmlzVmVjdG9yKCkpIHsKKyAgICAgIHVuc2lnbmVkIE51bVZURWx0cyA9IE5ld1ZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICBkbyB7CisgICAgICAgIFNEVmFsdWUgRU9wID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgZGwsIE5ld1ZULCBWYWxPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KElkeCkpOworICAgICAgICBTdENoYWluLnB1c2hfYmFjayhEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBFT3AsIEJhc2VQdHIsIFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZPZmZzZXQgKyBPZmZzZXQsIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluQWxpZ24oQWxpZ24sIE9mZnNldCkpKTsKKyAgICAgICAgU3RXaWR0aCAtPSBOZXdWVFdpZHRoOworICAgICAgICBPZmZzZXQgKz0gSW5jcmVtZW50OworICAgICAgICBJZHggKz0gTnVtVlRFbHRzOworICAgICAgICBCYXNlUHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBCYXNlUHRyLmdldFZhbHVlVHlwZSgpLCBCYXNlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEluY3JlbWVudCkpOworICAgICAgfSB3aGlsZSAoU3RXaWR0aCAhPSAwICYmIFN0V2lkdGggPj0gTmV3VlRXaWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENhc3QgdGhlIHZlY3RvciB0byB0aGUgc2NhbGFyIHR5cGUgd2UgY2FuIHN0b3JlCisgICAgICB1bnNpZ25lZCBOdW1FbHRzID0gVmFsV2lkdGggLyBOZXdWVFdpZHRoOworICAgICAgRVZUIE5ld1ZlY1ZUID0gRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwgTmV3VlQsIE51bUVsdHMpOworICAgICAgU0RWYWx1ZSBWZWNPcCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBOZXdWZWNWVCwgVmFsT3ApOworICAgICAgLy8gUmVhZGp1c3QgaW5kZXggcG9zaXRpb24gYmFzZWQgb24gbmV3IHZlY3RvciB0eXBlCisgICAgICBJZHggPSBJZHggKiBWYWxFbHRXaWR0aCAvIE5ld1ZUV2lkdGg7CisgICAgICBkbyB7CisgICAgICAgIFNEVmFsdWUgRU9wID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBOZXdWVCwgVmVjT3AsCisgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KElkeCsrKSk7CisgICAgICAgIFN0Q2hhaW4ucHVzaF9iYWNrKERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIEVPcCwgQmFzZVB0ciwgU1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVk9mZnNldCArIE9mZnNldCwgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9uVGVtcG9yYWwsIE1pbkFsaWduKEFsaWduLCBPZmZzZXQpKSk7CisgICAgICAgIFN0V2lkdGggLT0gTmV3VlRXaWR0aDsKKyAgICAgICAgT2Zmc2V0ICs9IEluY3JlbWVudDsKKyAgICAgICAgQmFzZVB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgQmFzZVB0ci5nZXRWYWx1ZVR5cGUoKSwgQmFzZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChJbmNyZW1lbnQpKTsKKyAgICAgIH0gd2hpbGUgKFN0V2lkdGggIT0gMCAgJiYgU3RXaWR0aCA+PSBOZXdWVFdpZHRoKTsKKyAgICAgIC8vIFJlc3RvcmUgaW5kZXggYmFjayB0byBiZSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwgd2lkZW4gZWxlbWVudCB0eXBlCisgICAgICBJZHggPSBJZHggKiBOZXdWVFdpZHRoIC8gVmFsRWx0V2lkdGg7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK0RBR1R5cGVMZWdhbGl6ZXI6OkdlbldpZGVuVmVjdG9yVHJ1bmNTdG9yZXMoU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+JiBTdENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZVNETm9kZSAqU1QpIHsKKyAgLy8gRm9yIGV4dGVuc2lvbiBsb2FkcywgaXQgbWF5IG5vdCBiZSBtb3JlIGVmZmljaWVudCB0byB0cnVuY2F0ZSB0aGUgdmVjdG9yCisgIC8vIGFuZCB0aGVuIHN0b3JlIGl0LiAgSW5zdGVhZCwgd2UgZXh0cmFjdCBlYWNoIGVsZW1lbnQgYW5kIHRoZW4gc3RvcmUgaXQuCisgIFNEVmFsdWUgIENoYWluID0gU1QtPmdldENoYWluKCk7CisgIFNEVmFsdWUgIEJhc2VQdHIgPSBTVC0+Z2V0QmFzZVB0cigpOworICBjb25zdCAgICBWYWx1ZSAqU1YgPSBTVC0+Z2V0U3JjVmFsdWUoKTsKKyAgaW50ICAgICAgU1ZPZmZzZXQgPSBTVC0+Z2V0U3JjVmFsdWVPZmZzZXQoKTsKKyAgdW5zaWduZWQgQWxpZ24gPSBTVC0+Z2V0QWxpZ25tZW50KCk7CisgIGJvb2wgICAgIGlzVm9sYXRpbGUgPSBTVC0+aXNWb2xhdGlsZSgpOworICBib29sICAgICBpc05vblRlbXBvcmFsID0gU1QtPmlzTm9uVGVtcG9yYWwoKTsKKyAgU0RWYWx1ZSAgVmFsT3AgPSBHZXRXaWRlbmVkVmVjdG9yKFNULT5nZXRWYWx1ZSgpKTsKKyAgRGVidWdMb2MgZGwgPSBTVC0+Z2V0RGVidWdMb2MoKTsKKyAgCisgIEVWVCBTdFZUID0gU1QtPmdldE1lbW9yeVZUKCk7CisgIEVWVCBWYWxWVCA9IFZhbE9wLmdldFZhbHVlVHlwZSgpOworCisgIC8vIEl0IG11c3QgYmUgdHJ1ZSB0aGF0IHdlIHRoZSB3aWRlbiB2ZWN0b3IgdHlwZSBpcyBiaWdnZXIgdGhhbiB3aGVyZQorICAvLyB3ZSBuZWVkIHRvIHN0b3JlLgorICBhc3NlcnQoU3RWVC5pc1ZlY3RvcigpICYmIFZhbE9wLmdldFZhbHVlVHlwZSgpLmlzVmVjdG9yKCkpOworICBhc3NlcnQoU3RWVC5iaXRzTFQoVmFsT3AuZ2V0VmFsdWVUeXBlKCkpKTsKKworICAvLyBGb3IgdHJ1bmNhdGluZyBzdG9yZXMsIHdlIGNhbiBub3QgcGxheSB0aGUgdHJpY2tzIG9mIGNob3BwaW5nIGxlZ2FsCisgIC8vIHZlY3RvciB0eXBlcyBhbmQgYml0IGNhc3QgaXQgdG8gdGhlIHJpZ2h0IHR5cGUuICBJbnN0ZWFkLCB3ZSB1bnJvbGwKKyAgLy8gdGhlIHN0b3JlLgorICBFVlQgU3RFbHRWVCAgPSBTdFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIEVWVCBWYWxFbHRWVCA9IFZhbFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIHVuc2lnbmVkIEluY3JlbWVudCA9IFZhbEVsdFZULmdldFNpemVJbkJpdHMoKSAvIDg7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBTdFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIFNEVmFsdWUgRU9wID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBWYWxFbHRWVCwgVmFsT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKyAgU3RDaGFpbi5wdXNoX2JhY2soREFHLmdldFRydW5jU3RvcmUoQ2hhaW4sIGRsLCBFT3AsIEJhc2VQdHIsIFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVk9mZnNldCwgU3RFbHRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwgQWxpZ24pKTsKKyAgdW5zaWduZWQgT2Zmc2V0ID0gSW5jcmVtZW50OworICBmb3IgKHVuc2lnbmVkIGk9MTsgaSA8IE51bUVsdHM7ICsraSwgT2Zmc2V0ICs9IEluY3JlbWVudCkgeworICAgIFNEVmFsdWUgTmV3QmFzZVB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgQmFzZVB0ci5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlUHRyLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoT2Zmc2V0KSk7CisgICAgU0RWYWx1ZSBFT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIFZhbEVsdFZULCBWYWxPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICAgIFN0Q2hhaW4ucHVzaF9iYWNrKERBRy5nZXRUcnVuY1N0b3JlKENoYWluLCBkbCwgRU9wLCBOZXdCYXNlUHRyLCBTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVk9mZnNldCArIE9mZnNldCwgU3RFbHRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZvbGF0aWxlLCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbkFsaWduKEFsaWduLCBPZmZzZXQpKSk7CisgIH0KK30KKworLy8vIE1vZGlmaWVzIGEgdmVjdG9yIGlucHV0ICh3aWRlbiBvciBuYXJyb3dzKSB0byBhIHZlY3RvciBvZiBOVlQuICBUaGUKKy8vLyBpbnB1dCB2ZWN0b3IgbXVzdCBoYXZlIHRoZSBzYW1lIGVsZW1lbnQgdHlwZSBhcyBOVlQuCitTRFZhbHVlIERBR1R5cGVMZWdhbGl6ZXI6Ok1vZGlmeVRvVHlwZShTRFZhbHVlIEluT3AsIEVWVCBOVlQpIHsKKyAgLy8gTm90ZSB0aGF0IEluT3AgbWlnaHQgaGF2ZSBiZWVuIHdpZGVuZWQgc28gaXQgbWlnaHQgYWxyZWFkeSBoYXZlCisgIC8vIHRoZSByaWdodCB3aWR0aCBvciBpdCBtaWdodCBuZWVkIGJlIG5hcnJvd2VkLgorICBFVlQgSW5WVCA9IEluT3AuZ2V0VmFsdWVUeXBlKCk7CisgIGFzc2VydChJblZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgPT0gTlZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgICJpbnB1dCBhbmQgd2lkZW4gZWxlbWVudCB0eXBlIG11c3QgbWF0Y2giKTsKKyAgRGVidWdMb2MgZGwgPSBJbk9wLmdldERlYnVnTG9jKCk7CisKKyAgLy8gQ2hlY2sgaWYgSW5PcCBhbHJlYWR5IGhhcyB0aGUgcmlnaHQgd2lkdGguCisgIGlmIChJblZUID09IE5WVCkKKyAgICByZXR1cm4gSW5PcDsKKworICB1bnNpZ25lZCBJbk51bUVsdHMgPSBJblZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIHVuc2lnbmVkIFdpZGVuTnVtRWx0cyA9IE5WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBpZiAoV2lkZW5OdW1FbHRzID4gSW5OdW1FbHRzICYmIFdpZGVuTnVtRWx0cyAlIEluTnVtRWx0cyA9PSAwKSB7CisgICAgdW5zaWduZWQgTnVtQ29uY2F0ID0gV2lkZW5OdW1FbHRzIC8gSW5OdW1FbHRzOworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBPcHMoTnVtQ29uY2F0KTsKKyAgICBTRFZhbHVlIFVuZGVmVmFsID0gREFHLmdldFVOREVGKEluVlQpOworICAgIE9wc1swXSA9IEluT3A7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBOdW1Db25jYXQ7ICsraSkKKyAgICAgIE9wc1tpXSA9IFVuZGVmVmFsOworCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6Q09OQ0FUX1ZFQ1RPUlMsIGRsLCBOVlQsICZPcHNbMF0sIE51bUNvbmNhdCk7CisgIH0KKworICBpZiAoV2lkZW5OdW1FbHRzIDwgSW5OdW1FbHRzICYmIEluTnVtRWx0cyAlIFdpZGVuTnVtRWx0cykKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgZGwsIE5WVCwgSW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKworICAvLyBGYWxsIGJhY2sgdG8gZXh0cmFjdCBhbmQgYnVpbGQuCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBPcHMoV2lkZW5OdW1FbHRzKTsKKyAgRVZUIEVsdFZUID0gTlZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIHVuc2lnbmVkIE1pbk51bUVsdHMgPSBzdGQ6Om1pbihXaWRlbk51bUVsdHMsIEluTnVtRWx0cyk7CisgIHVuc2lnbmVkIElkeDsKKyAgZm9yIChJZHggPSAwOyBJZHggPCBNaW5OdW1FbHRzOyArK0lkeCkKKyAgICBPcHNbSWR4XSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgRWx0VlQsIEluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoSWR4KSk7CisKKyAgU0RWYWx1ZSBVbmRlZlZhbCA9IERBRy5nZXRVTkRFRihFbHRWVCk7CisgIGZvciAoIDsgSWR4IDwgV2lkZW5OdW1FbHRzOyArK0lkeCkKKyAgICBPcHNbSWR4XSA9IFVuZGVmVmFsOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBOVlQsICZPcHNbMF0sIFdpZGVuTnVtRWx0cyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3MTZmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjIz09PS0gbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1TZWxlY3Rpb25EQUcKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9TRE5vZGVEYmdWYWx1ZS5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NETm9kZURiZ1ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyZDMzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9TRE5vZGVEYmdWYWx1ZS5oCkBAIC0wLDAgKzEsMTE0IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9TRE5vZGVEYmdWYWx1ZS5oIC0gU2VsZWN0aW9uREFHIGRiZ192YWx1ZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgU0REYmdWYWx1ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TRE5PREVEQkdWQUxVRV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TRE5PREVEQkdWQUxVRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIFNETm9kZTsKK2NsYXNzIFZhbHVlOworCisvLy8gU0REYmdWYWx1ZSAtIEhvbGRzIHRoZSBpbmZvcm1hdGlvbiBmcm9tIGEgZGJnX3ZhbHVlIG5vZGUgdGhyb3VnaCBTRElTZWwuCisvLy8gV2UgZG8gbm90IHVzZSBTRFZhbHVlIGhlcmUgdG8gYXZvaWQgaW5jbHVkaW5nIGl0cyBoZWFkZXIuCisKK2NsYXNzIFNERGJnVmFsdWUgeworcHVibGljOgorICBlbnVtIERiZ1ZhbHVlS2luZCB7CisgICAgU0ROT0RFID0gMCwgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uCisgICAgQ09OU1QgPSAxLCAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgYSBjb25zdGFudAorICAgIEZSQU1FSVggPSAyICAgICAgICAgICAgIC8vIHZhbHVlIGlzIGNvbnRlbnRzIG9mIGEgc3RhY2sgbG9jYXRpb24KKyAgfTsKK3ByaXZhdGU6CisgIGVudW0gRGJnVmFsdWVLaW5kIGtpbmQ7CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgU0ROb2RlICpOb2RlOyAgICAgICAgIC8vIHZhbGlkIGZvciBleHByZXNzaW9ucworICAgICAgdW5zaWduZWQgUmVzTm87ICAgICAgIC8vIHZhbGlkIGZvciBleHByZXNzaW9ucworICAgIH0gczsKKyAgICBjb25zdCBWYWx1ZSAqQ29uc3Q7ICAgICAvLyB2YWxpZCBmb3IgY29uc3RhbnRzCisgICAgdW5zaWduZWQgRnJhbWVJeDsgICAgICAgLy8gdmFsaWQgZm9yIHN0YWNrIG9iamVjdHMKKyAgfSB1OworICBNRE5vZGUgKm1kUHRyOworICB1aW50NjRfdCBPZmZzZXQ7CisgIERlYnVnTG9jIERMOworICB1bnNpZ25lZCBPcmRlcjsKKyAgYm9vbCBJbnZhbGlkOworcHVibGljOgorICAvLyBDb25zdHJ1Y3RvciBmb3Igbm9uLWNvbnN0YW50cy4KKyAgU0REYmdWYWx1ZShNRE5vZGUgKm1kUCwgU0ROb2RlICpOLCB1bnNpZ25lZCBSLCB1aW50NjRfdCBvZmYsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgIHVuc2lnbmVkIE8pIDogbWRQdHIobWRQKSwgT2Zmc2V0KG9mZiksIERMKGRsKSwgT3JkZXIoTyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkKGZhbHNlKSB7CisgICAga2luZCA9IFNETk9ERTsKKyAgICB1LnMuTm9kZSA9IE47CisgICAgdS5zLlJlc05vID0gUjsKKyAgfQorCisgIC8vIENvbnN0cnVjdG9yIGZvciBjb25zdGFudHMuCisgIFNERGJnVmFsdWUoTUROb2RlICptZFAsIGNvbnN0IFZhbHVlICpDLCB1aW50NjRfdCBvZmYsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgIHVuc2lnbmVkIE8pIDogCisgICAgbWRQdHIobWRQKSwgT2Zmc2V0KG9mZiksIERMKGRsKSwgT3JkZXIoTyksIEludmFsaWQoZmFsc2UpIHsKKyAgICBraW5kID0gQ09OU1Q7CisgICAgdS5Db25zdCA9IEM7CisgIH0KKworICAvLyBDb25zdHJ1Y3RvciBmb3IgZnJhbWUgaW5kaWNlcy4KKyAgU0REYmdWYWx1ZShNRE5vZGUgKm1kUCwgdW5zaWduZWQgRkksIHVpbnQ2NF90IG9mZiwgRGVidWdMb2MgZGwsIHVuc2lnbmVkIE8pIDogCisgICAgbWRQdHIobWRQKSwgT2Zmc2V0KG9mZiksIERMKGRsKSwgT3JkZXIoTyksIEludmFsaWQoZmFsc2UpIHsKKyAgICBraW5kID0gRlJBTUVJWDsKKyAgICB1LkZyYW1lSXggPSBGSTsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGtpbmQuCisgIERiZ1ZhbHVlS2luZCBnZXRLaW5kKCkgeyByZXR1cm4ga2luZDsgfQorCisgIC8vIFJldHVybnMgdGhlIE1ETm9kZSBwb2ludGVyLgorICBNRE5vZGUgKmdldE1EUHRyKCkgeyByZXR1cm4gbWRQdHI7IH0KKworICAvLyBSZXR1cm5zIHRoZSBTRE5vZGUqIGZvciBhIHJlZ2lzdGVyIHJlZgorICBTRE5vZGUgKmdldFNETm9kZSgpIHsgYXNzZXJ0IChraW5kPT1TRE5PREUpOyByZXR1cm4gdS5zLk5vZGU7IH0KKworICAvLyBSZXR1cm5zIHRoZSBSZXNObyBmb3IgYSByZWdpc3RlciByZWYKKyAgdW5zaWduZWQgZ2V0UmVzTm8oKSB7IGFzc2VydCAoa2luZD09U0ROT0RFKTsgcmV0dXJuIHUucy5SZXNObzsgfQorCisgIC8vIFJldHVybnMgdGhlIFZhbHVlKiBmb3IgYSBjb25zdGFudAorICBjb25zdCBWYWx1ZSAqZ2V0Q29uc3QoKSB7IGFzc2VydCAoa2luZD09Q09OU1QpOyByZXR1cm4gdS5Db25zdDsgfQorCisgIC8vIFJldHVybnMgdGhlIEZyYW1lSXggZm9yIGEgc3RhY2sgb2JqZWN0CisgIHVuc2lnbmVkIGdldEZyYW1lSXgoKSB7IGFzc2VydCAoa2luZD09RlJBTUVJWCk7IHJldHVybiB1LkZyYW1lSXg7IH0KKworICAvLyBSZXR1cm5zIHRoZSBvZmZzZXQuCisgIHVpbnQ2NF90IGdldE9mZnNldCgpIHsgcmV0dXJuIE9mZnNldDsgfQorCisgIC8vIFJldHVybnMgdGhlIERlYnVnTG9jLgorICBEZWJ1Z0xvYyBnZXREZWJ1Z0xvYygpIHsgcmV0dXJuIERMOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgU0ROb2RlT3JkZXIuICBUaGlzIGlzIHRoZSBvcmRlciBvZiB0aGUgcHJlY2VkaW5nIG5vZGUgaW4gdGhlCisgIC8vIGlucHV0LgorICB1bnNpZ25lZCBnZXRPcmRlcigpIHsgcmV0dXJuIE9yZGVyOyB9CisKKyAgLy8gc2V0SXNJbnZhbGlkYXRlZCAvIGlzSW52YWxpZGF0ZWQgLSBTZXR0ZXIgLyBnZXR0ZXIgb2YgdGhlICJJbnZhbGlkYXRlZCIKKyAgLy8gcHJvcGVydHkuIEEgU0REYmdWYWx1ZSBpcyBpbnZhbGlkIGlmIHRoZSBTRE5vZGUgdGhhdCBwcm9kdWNlcyB0aGUgdmFsdWUgaXMKKyAgLy8gZGVsZXRlZC4KKyAgdm9pZCBzZXRJc0ludmFsaWRhdGVkKCkgeyBJbnZhbGlkID0gdHJ1ZTsgfQorICBib29sIGlzSW52YWxpZGF0ZWQoKSB7IHJldHVybiBJbnZhbGlkOyB9Cit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9TRE5vZGVPcmRlcmluZy5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NETm9kZU9yZGVyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4YjI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9TRE5vZGVPcmRlcmluZy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1NETm9kZU9yZGVyaW5nLmggLSBTRE5vZGUgT3JkZXJpbmcgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTRE5vZGVPcmRlcmluZyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TRE5PREVPUkRFUklOR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TRE5PREVPUkRFUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFNETm9kZTsKKworLy8vIFNETm9kZU9yZGVyaW5nIC0gTWFwcyBhIHVuaXF1ZSAobW9ub3RvbmljYWxseSBpbmNyZWFzaW5nKSB2YWx1ZSB0byBlYWNoCisvLy8gU0ROb2RlIHRoYXQgcm91Z2hseSBjb3JyZXNwb25kcyB0byB0aGUgb3JkZXJpbmcgb2YgdGhlIG9yaWdpbmFsIExMVk0KKy8vLyBpbnN0cnVjdGlvbi4gVGhpcyBpcyB1c2VkIGZvciB0dXJuaW5nIG9mZiBzY2hlZHVsaW5nLCBiZWNhdXNlIHdlJ2xsIGZvcmdvCisvLy8gdGhlIG5vcm1hbCBzY2hlZHVsaW5nIGFsZ29yaXRobXMgYW5kIG91dHB1dCB0aGUgaW5zdHJ1Y3Rpb25zIGFjY29yZGluZyB0bworLy8vIHRoaXMgb3JkZXJpbmcuCitjbGFzcyBTRE5vZGVPcmRlcmluZyB7CisgIERlbnNlTWFwPGNvbnN0IFNETm9kZSosIHVuc2lnbmVkPiBPcmRlck1hcDsKKworICB2b2lkIG9wZXJhdG9yPShjb25zdCBTRE5vZGVPcmRlcmluZyYpOyAgIC8vIERvIG5vdCBpbXBsZW1lbnQuCisgIFNETm9kZU9yZGVyaW5nKGNvbnN0IFNETm9kZU9yZGVyaW5nJik7ICAgLy8gRG8gbm90IGltcGxlbWVudC4KK3B1YmxpYzoKKyAgU0ROb2RlT3JkZXJpbmcoKSB7fQorCisgIHZvaWQgYWRkKGNvbnN0IFNETm9kZSAqTm9kZSwgdW5zaWduZWQgTykgeworICAgIE9yZGVyTWFwW05vZGVdID0gTzsKKyAgfQorICB2b2lkIHJlbW92ZShjb25zdCBTRE5vZGUgKk5vZGUpIHsKKyAgICBEZW5zZU1hcDxjb25zdCBTRE5vZGUqLCB1bnNpZ25lZD46Oml0ZXJhdG9yIEl0ciA9IE9yZGVyTWFwLmZpbmQoTm9kZSk7CisgICAgaWYgKEl0ciAhPSBPcmRlck1hcC5lbmQoKSkKKyAgICAgIE9yZGVyTWFwLmVyYXNlKEl0cik7CisgIH0KKyAgdm9pZCBjbGVhcigpIHsKKyAgICBPcmRlck1hcC5jbGVhcigpOworICB9CisgIHVuc2lnbmVkIGdldE9yZGVyKGNvbnN0IFNETm9kZSAqTm9kZSkgeworICAgIHJldHVybiBPcmRlck1hcFtOb2RlXTsKKyAgfQorfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2NoZWR1bGVEQUdGYXN0LmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9TY2hlZHVsZURBR0Zhc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODZjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2NoZWR1bGVEQUdGYXN0LmNwcApAQCAtMCwwICsxLDYwNCBAQAorLy89PT0tLS0tLSBTY2hlZHVsZURBR0Zhc3QuY3BwIC0gRmFzdCBwb29yIGxpc3Qgc2NoZWR1bGVyIC0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGltcGxlbWVudHMgYSBmYXN0IHNjaGVkdWxlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInByZS1SQS1zY2hlZCIKKyNpbmNsdWRlICJTY2hlZHVsZURBR1NETm9kZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVyUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bVVuZm9sZHMsICAgICJOdW1iZXIgb2Ygbm9kZXMgdW5mb2xkZWQiKTsKK1NUQVRJU1RJQyhOdW1EdXBzLCAgICAgICAiTnVtYmVyIG9mIGR1cGxpY2F0ZWQgbm9kZXMiKTsKK1NUQVRJU1RJQyhOdW1QUkNvcGllcywgICAiTnVtYmVyIG9mIHBoeXNpY2FsIGNvcGllcyIpOworCitzdGF0aWMgUmVnaXN0ZXJTY2hlZHVsZXIKKyAgZmFzdERBR1NjaGVkdWxlcigiZmFzdCIsICJGYXN0IHN1Ym9wdGltYWwgbGlzdCBzY2hlZHVsaW5nIiwKKyAgICAgICAgICAgICAgICAgICBjcmVhdGVGYXN0REFHU2NoZWR1bGVyKTsKKworbmFtZXNwYWNlIHsKKyAgLy8vIEZhc3RQcmlvcml0eVF1ZXVlIC0gQSBkZWdlbmVyYXRlIHByaW9yaXR5IHF1ZXVlIHRoYXQgY29uc2lkZXJzCisgIC8vLyBhbGwgbm9kZXMgdG8gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eS4KKyAgLy8vCisgIHN0cnVjdCBGYXN0UHJpb3JpdHlRdWV1ZSB7CisgICAgU21hbGxWZWN0b3I8U1VuaXQgKiwgMTY+IFF1ZXVlOworCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFF1ZXVlLmVtcHR5KCk7IH0KKyAgICAKKyAgICB2b2lkIHB1c2goU1VuaXQgKlUpIHsKKyAgICAgIFF1ZXVlLnB1c2hfYmFjayhVKTsKKyAgICB9CisKKyAgICBTVW5pdCAqcG9wKCkgeworICAgICAgaWYgKGVtcHR5KCkpIHJldHVybiBOVUxMOworICAgICAgU1VuaXQgKlYgPSBRdWV1ZS5iYWNrKCk7CisgICAgICBRdWV1ZS5wb3BfYmFjaygpOworICAgICAgcmV0dXJuIFY7CisgICAgfQorICB9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFNjaGVkdWxlREFHRmFzdCAtIFRoZSBhY3R1YWwgImZhc3QiIGxpc3Qgc2NoZWR1bGVyIGltcGxlbWVudGF0aW9uLgorLy8vCitjbGFzcyBTY2hlZHVsZURBR0Zhc3QgOiBwdWJsaWMgU2NoZWR1bGVEQUdTRE5vZGVzIHsKK3ByaXZhdGU6CisgIC8vLyBBdmFpbGFibGVRdWV1ZSAtIFRoZSBwcmlvcml0eSBxdWV1ZSB0byB1c2UgZm9yIHRoZSBhdmFpbGFibGUgU1VuaXRzLgorICBGYXN0UHJpb3JpdHlRdWV1ZSBBdmFpbGFibGVRdWV1ZTsKKworICAvLy8gTGl2ZVJlZ0RlZnMgLSBBIHNldCBvZiBwaHlzaWNhbCByZWdpc3RlcnMgYW5kIHRoZWlyIGRlZmluaXRpb24KKyAgLy8vIHRoYXQgYXJlICJsaXZlIi4gVGhlc2Ugbm9kZXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIGFueSBvdGhlciBub2RlcyB0aGF0CisgIC8vLyBtb2RpZmllcyB0aGUgcmVnaXN0ZXJzIGNhbiBiZSBzY2hlZHVsZWQuCisgIHVuc2lnbmVkIE51bUxpdmVSZWdzOworICBzdGQ6OnZlY3RvcjxTVW5pdCo+IExpdmVSZWdEZWZzOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gTGl2ZVJlZ0N5Y2xlczsKKworcHVibGljOgorICBTY2hlZHVsZURBR0Zhc3QoTWFjaGluZUZ1bmN0aW9uICZtZikKKyAgICA6IFNjaGVkdWxlREFHU0ROb2RlcyhtZikge30KKworICB2b2lkIFNjaGVkdWxlKCk7CisKKyAgLy8vIEFkZFByZWQgLSBhZGRzIGEgcHJlZGVjZXNzb3IgZWRnZSB0byBTVW5pdCBTVS4KKyAgLy8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBuZXcgcHJlZGVjZXNzb3IuCisgIHZvaWQgQWRkUHJlZChTVW5pdCAqU1UsIGNvbnN0IFNEZXAgJkQpIHsKKyAgICBTVS0+YWRkUHJlZChEKTsKKyAgfQorCisgIC8vLyBSZW1vdmVQcmVkIC0gcmVtb3ZlcyBhIHByZWRlY2Vzc29yIGVkZ2UgZnJvbSBTVW5pdCBTVS4KKyAgLy8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIGFuIGVkZ2Ugd2FzIHJlbW92ZWQuCisgIHZvaWQgUmVtb3ZlUHJlZChTVW5pdCAqU1UsIGNvbnN0IFNEZXAgJkQpIHsKKyAgICBTVS0+cmVtb3ZlUHJlZChEKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIFJlbGVhc2VQcmVkKFNVbml0ICpTVSwgU0RlcCAqUHJlZEVkZ2UpOworICB2b2lkIFJlbGVhc2VQcmVkZWNlc3NvcnMoU1VuaXQgKlNVLCB1bnNpZ25lZCBDdXJDeWNsZSk7CisgIHZvaWQgU2NoZWR1bGVOb2RlQm90dG9tVXAoU1VuaXQqLCB1bnNpZ25lZCk7CisgIFNVbml0ICpDb3B5QW5kTW92ZVN1Y2Nlc3NvcnMoU1VuaXQqKTsKKyAgdm9pZCBJbnNlcnRDb3BpZXNBbmRNb3ZlU3VjY3MoU1VuaXQqLCB1bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxTVW5pdCosIDI+Jik7CisgIGJvb2wgRGVsYXlGb3JMaXZlUmVnc0JvdHRvbVVwKFNVbml0KiwgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+Jik7CisgIHZvaWQgTGlzdFNjaGVkdWxlQm90dG9tVXAoKTsKKworICAvLy8gRm9yY2VVbml0TGF0ZW5jaWVzIC0gVGhlIGZhc3Qgc2NoZWR1bGVyIGRvZXNuJ3QgY2FyZSBhYm91dCByZWFsIGxhdGVuY2llcy4KKyAgYm9vbCBGb3JjZVVuaXRMYXRlbmNpZXMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Cit9OworfSAgLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworCisvLy8gU2NoZWR1bGUgLSBTY2hlZHVsZSB0aGUgREFHIHVzaW5nIGxpc3Qgc2NoZWR1bGluZy4KK3ZvaWQgU2NoZWR1bGVEQUdGYXN0OjpTY2hlZHVsZSgpIHsKKyAgREVCVUcoZGJncygpIDw8ICIqKioqKioqKioqIExpc3QgU2NoZWR1bGluZyAqKioqKioqKioqXG4iKTsKKworICBOdW1MaXZlUmVncyA9IDA7CisgIExpdmVSZWdEZWZzLnJlc2l6ZShUUkktPmdldE51bVJlZ3MoKSwgTlVMTCk7ICAKKyAgTGl2ZVJlZ0N5Y2xlcy5yZXNpemUoVFJJLT5nZXROdW1SZWdzKCksIDApOworCisgIC8vIEJ1aWxkIHRoZSBzY2hlZHVsaW5nIGdyYXBoLgorICBCdWlsZFNjaGVkR3JhcGgoTlVMTCk7CisKKyAgREVCVUcoZm9yICh1bnNpZ25lZCBzdSA9IDAsIGUgPSBTVW5pdHMuc2l6ZSgpOyBzdSAhPSBlOyArK3N1KQorICAgICAgICAgIFNVbml0c1tzdV0uZHVtcEFsbCh0aGlzKSk7CisKKyAgLy8gRXhlY3V0ZSB0aGUgYWN0dWFsIHNjaGVkdWxpbmcgbG9vcC4KKyAgTGlzdFNjaGVkdWxlQm90dG9tVXAoKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBCb3R0b20tVXAgU2NoZWR1bGluZworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFJlbGVhc2VQcmVkIC0gRGVjcmVtZW50IHRoZSBOdW1TdWNjc0xlZnQgY291bnQgb2YgYSBwcmVkZWNlc3Nvci4gQWRkIGl0IHRvCisvLy8gdGhlIEF2YWlsYWJsZVF1ZXVlIGlmIHRoZSBjb3VudCByZWFjaGVzIHplcm8uIEFsc28gdXBkYXRlIGl0cyBjeWNsZSBib3VuZC4KK3ZvaWQgU2NoZWR1bGVEQUdGYXN0OjpSZWxlYXNlUHJlZChTVW5pdCAqU1UsIFNEZXAgKlByZWRFZGdlKSB7CisgIFNVbml0ICpQcmVkU1UgPSBQcmVkRWRnZS0+Z2V0U1VuaXQoKTsKKworI2lmbmRlZiBOREVCVUcKKyAgaWYgKFByZWRTVS0+TnVtU3VjY3NMZWZ0ID09IDApIHsKKyAgICBkYmdzKCkgPDwgIioqKiBTY2hlZHVsaW5nIGZhaWxlZCEgKioqXG4iOworICAgIFByZWRTVS0+ZHVtcCh0aGlzKTsKKyAgICBkYmdzKCkgPDwgIiBoYXMgYmVlbiByZWxlYXNlZCB0b28gbWFueSB0aW1lcyFcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorI2VuZGlmCisgIC0tUHJlZFNVLT5OdW1TdWNjc0xlZnQ7CisKKyAgLy8gSWYgYWxsIHRoZSBub2RlJ3Mgc3VjY2Vzc29ycyBhcmUgc2NoZWR1bGVkLCB0aGlzIG5vZGUgaXMgcmVhZHkKKyAgLy8gdG8gYmUgc2NoZWR1bGVkLiBJZ25vcmUgdGhlIHNwZWNpYWwgRW50cnlTVSBub2RlLgorICBpZiAoUHJlZFNVLT5OdW1TdWNjc0xlZnQgPT0gMCAmJiBQcmVkU1UgIT0gJkVudHJ5U1UpIHsKKyAgICBQcmVkU1UtPmlzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICBBdmFpbGFibGVRdWV1ZS5wdXNoKFByZWRTVSk7CisgIH0KK30KKwordm9pZCBTY2hlZHVsZURBR0Zhc3Q6OlJlbGVhc2VQcmVkZWNlc3NvcnMoU1VuaXQgKlNVLCB1bnNpZ25lZCBDdXJDeWNsZSkgeworICAvLyBCb3R0b20gdXA6IHJlbGVhc2UgcHJlZGVjZXNzb3JzCisgIGZvciAoU1VuaXQ6OnByZWRfaXRlcmF0b3IgSSA9IFNVLT5QcmVkcy5iZWdpbigpLCBFID0gU1UtPlByZWRzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgUmVsZWFzZVByZWQoU1UsICYqSSk7CisgICAgaWYgKEktPmlzQXNzaWduZWRSZWdEZXAoKSkgeworICAgICAgLy8gVGhpcyBpcyBhIHBoeXNpY2FsIHJlZ2lzdGVyIGRlcGVuZGVuY3kgYW5kIGl0J3MgaW1wb3NzaWJsZSBvcgorICAgICAgLy8gZXhwZW5zaXZlIHRvIGNvcHkgdGhlIHJlZ2lzdGVyLiBNYWtlIHN1cmUgbm90aGluZyB0aGF0IGNhbiAKKyAgICAgIC8vIGNsb2JiZXIgdGhlIHJlZ2lzdGVyIGlzIHNjaGVkdWxlZCBiZXR3ZWVuIHRoZSBwcmVkZWNlc3NvciBhbmQKKyAgICAgIC8vIHRoaXMgbm9kZS4KKyAgICAgIGlmICghTGl2ZVJlZ0RlZnNbSS0+Z2V0UmVnKCldKSB7CisgICAgICAgICsrTnVtTGl2ZVJlZ3M7CisgICAgICAgIExpdmVSZWdEZWZzW0ktPmdldFJlZygpXSA9IEktPmdldFNVbml0KCk7CisgICAgICAgIExpdmVSZWdDeWNsZXNbSS0+Z2V0UmVnKCldID0gQ3VyQ3ljbGU7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLyBTY2hlZHVsZU5vZGVCb3R0b21VcCAtIEFkZCB0aGUgbm9kZSB0byB0aGUgc2NoZWR1bGUuIERlY3JlbWVudCB0aGUgcGVuZGluZworLy8vIGNvdW50IG9mIGl0cyBwcmVkZWNlc3NvcnMuIElmIGEgcHJlZGVjZXNzb3IgcGVuZGluZyBjb3VudCBpcyB6ZXJvLCBhZGQgaXQgdG8KKy8vLyB0aGUgQXZhaWxhYmxlIHF1ZXVlLgordm9pZCBTY2hlZHVsZURBR0Zhc3Q6OlNjaGVkdWxlTm9kZUJvdHRvbVVwKFNVbml0ICpTVSwgdW5zaWduZWQgQ3VyQ3ljbGUpIHsKKyAgREVCVUcoZGJncygpIDw8ICIqKiogU2NoZWR1bGluZyBbIiA8PCBDdXJDeWNsZSA8PCAiXTogIik7CisgIERFQlVHKFNVLT5kdW1wKHRoaXMpKTsKKworICBhc3NlcnQoQ3VyQ3ljbGUgPj0gU1UtPmdldEhlaWdodCgpICYmICJOb2RlIHNjaGVkdWxlZCBiZWxvdyBpdHMgaGVpZ2h0ISIpOworICBTVS0+c2V0SGVpZ2h0VG9BdExlYXN0KEN1ckN5Y2xlKTsKKyAgU2VxdWVuY2UucHVzaF9iYWNrKFNVKTsKKworICBSZWxlYXNlUHJlZGVjZXNzb3JzKFNVLCBDdXJDeWNsZSk7CisKKyAgLy8gUmVsZWFzZSBhbGwgdGhlIGltcGxpY2l0IHBoeXNpY2FsIHJlZ2lzdGVyIGRlZnMgdGhhdCBhcmUgbGl2ZS4KKyAgZm9yIChTVW5pdDo6c3VjY19pdGVyYXRvciBJID0gU1UtPlN1Y2NzLmJlZ2luKCksIEUgPSBTVS0+U3VjY3MuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aXNBc3NpZ25lZFJlZ0RlcCgpKSB7CisgICAgICBpZiAoTGl2ZVJlZ0N5Y2xlc1tJLT5nZXRSZWcoKV0gPT0gSS0+Z2V0U1VuaXQoKS0+Z2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgYXNzZXJ0KE51bUxpdmVSZWdzID4gMCAmJiAiTnVtTGl2ZVJlZ3MgaXMgYWxyZWFkeSB6ZXJvISIpOworICAgICAgICBhc3NlcnQoTGl2ZVJlZ0RlZnNbSS0+Z2V0UmVnKCldID09IFNVICYmCisgICAgICAgICAgICAgICAiUGh5c2ljYWwgcmVnaXN0ZXIgZGVwZW5kZW5jeSB2aW9sYXRlZD8iKTsKKyAgICAgICAgLS1OdW1MaXZlUmVnczsKKyAgICAgICAgTGl2ZVJlZ0RlZnNbSS0+Z2V0UmVnKCldID0gTlVMTDsKKyAgICAgICAgTGl2ZVJlZ0N5Y2xlc1tJLT5nZXRSZWcoKV0gPSAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFNVLT5pc1NjaGVkdWxlZCA9IHRydWU7Cit9CisKKy8vLyBDb3B5QW5kTW92ZVN1Y2Nlc3NvcnMgLSBDbG9uZSB0aGUgc3BlY2lmaWVkIG5vZGUgYW5kIG1vdmUgaXRzIHNjaGVkdWxlZAorLy8vIHN1Y2Nlc3NvcnMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgbm9kZS4KK1NVbml0ICpTY2hlZHVsZURBR0Zhc3Q6OkNvcHlBbmRNb3ZlU3VjY2Vzc29ycyhTVW5pdCAqU1UpIHsKKyAgaWYgKFNVLT5nZXROb2RlKCktPmdldEZsYWdnZWROb2RlKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgU0ROb2RlICpOID0gU1UtPmdldE5vZGUoKTsKKyAgaWYgKCFOKQorICAgIHJldHVybiBOVUxMOworCisgIFNVbml0ICpOZXdTVTsKKyAgYm9vbCBUcnlVbmZvbGQgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bVZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZShpKTsKKyAgICBpZiAoVlQgPT0gTVZUOjpGbGFnKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjpPdGhlcikKKyAgICAgIFRyeVVuZm9sZCA9IHRydWU7CisgIH0KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgU0RWYWx1ZSAmT3AgPSBOLT5nZXRPcGVyYW5kKGkpOworICAgIEVWVCBWVCA9IE9wLmdldE5vZGUoKS0+Z2V0VmFsdWVUeXBlKE9wLmdldFJlc05vKCkpOworICAgIGlmIChWVCA9PSBNVlQ6OkZsYWcpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChUcnlVbmZvbGQpIHsKKyAgICBTbWFsbFZlY3RvcjxTRE5vZGUqLCAyPiBOZXdOb2RlczsKKyAgICBpZiAoIVRJSS0+dW5mb2xkTWVtb3J5T3BlcmFuZCgqREFHLCBOLCBOZXdOb2RlcykpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiVW5mb2xkaW5nIFNVICMgIiA8PCBTVS0+Tm9kZU51bSA8PCAiXG4iKTsKKyAgICBhc3NlcnQoTmV3Tm9kZXMuc2l6ZSgpID09IDIgJiYgIkV4cGVjdGVkIGEgbG9hZCBmb2xkaW5nIG5vZGUhIik7CisKKyAgICBOID0gTmV3Tm9kZXNbMV07CisgICAgU0ROb2RlICpMb2FkTm9kZSA9IE5ld05vZGVzWzBdOworICAgIHVuc2lnbmVkIE51bVZhbHMgPSBOLT5nZXROdW1WYWx1ZXMoKTsKKyAgICB1bnNpZ25lZCBPbGROdW1WYWxzID0gU1UtPmdldE5vZGUoKS0+Z2V0TnVtVmFsdWVzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1WYWxzOyArK2kpCisgICAgICBEQUctPlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShTVS0+Z2V0Tm9kZSgpLCBpKSwgU0RWYWx1ZShOLCBpKSk7CisgICAgREFHLT5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoU1UtPmdldE5vZGUoKSwgT2xkTnVtVmFscy0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShMb2FkTm9kZSwgMSkpOworCisgICAgU1VuaXQgKk5ld1NVID0gTmV3U1VuaXQoTik7CisgICAgYXNzZXJ0KE4tPmdldE5vZGVJZCgpID09IC0xICYmICJOb2RlIGFscmVhZHkgaW5zZXJ0ZWQhIik7CisgICAgTi0+c2V0Tm9kZUlkKE5ld1NVLT5Ob2RlTnVtKTsKKyAgICAgIAorICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gVElJLT5nZXQoTi0+Z2V0TWFjaGluZU9wY29kZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFRJRC5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICAgIGlmIChUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoaSwgVE9JOjpUSUVEX1RPKSAhPSAtMSkgeworICAgICAgICBOZXdTVS0+aXNUd29BZGRyZXNzID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChUSUQuaXNDb21tdXRhYmxlKCkpCisgICAgICBOZXdTVS0+aXNDb21tdXRhYmxlID0gdHJ1ZTsKKworICAgIC8vIExvYWROb2RlIG1heSBhbHJlYWR5IGV4aXN0LiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGVyZSBpcyBhbm90aGVyCisgICAgLy8gbG9hZCBmcm9tIHRoZSBzYW1lIGxvY2F0aW9uIGFuZCBwcm9kdWNpbmcgdGhlIHNhbWUgdHlwZSBvZiB2YWx1ZQorICAgIC8vIGJ1dCBpdCBoYXMgZGlmZmVyZW50IGFsaWdubWVudCBvciB2b2xhdGlsZW5lc3MuCisgICAgYm9vbCBpc05ld0xvYWQgPSB0cnVlOworICAgIFNVbml0ICpMb2FkU1U7CisgICAgaWYgKExvYWROb2RlLT5nZXROb2RlSWQoKSAhPSAtMSkgeworICAgICAgTG9hZFNVID0gJlNVbml0c1tMb2FkTm9kZS0+Z2V0Tm9kZUlkKCldOworICAgICAgaXNOZXdMb2FkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIExvYWRTVSA9IE5ld1NVbml0KExvYWROb2RlKTsKKyAgICAgIExvYWROb2RlLT5zZXROb2RlSWQoTG9hZFNVLT5Ob2RlTnVtKTsKKyAgICB9CisKKyAgICBTRGVwIENoYWluUHJlZDsKKyAgICBTbWFsbFZlY3RvcjxTRGVwLCA0PiBDaGFpblN1Y2NzOworICAgIFNtYWxsVmVjdG9yPFNEZXAsIDQ+IExvYWRQcmVkczsKKyAgICBTbWFsbFZlY3RvcjxTRGVwLCA0PiBOb2RlUHJlZHM7CisgICAgU21hbGxWZWN0b3I8U0RlcCwgND4gTm9kZVN1Y2NzOworICAgIGZvciAoU1VuaXQ6OnByZWRfaXRlcmF0b3IgSSA9IFNVLT5QcmVkcy5iZWdpbigpLCBFID0gU1UtPlByZWRzLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChJLT5pc0N0cmwoKSkKKyAgICAgICAgQ2hhaW5QcmVkID0gKkk7CisgICAgICBlbHNlIGlmIChJLT5nZXRTVW5pdCgpLT5nZXROb2RlKCkgJiYKKyAgICAgICAgICAgICAgIEktPmdldFNVbml0KCktPmdldE5vZGUoKS0+aXNPcGVyYW5kT2YoTG9hZE5vZGUpKQorICAgICAgICBMb2FkUHJlZHMucHVzaF9iYWNrKCpJKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTm9kZVByZWRzLnB1c2hfYmFjaygqSSk7CisgICAgfQorICAgIGZvciAoU1VuaXQ6OnN1Y2NfaXRlcmF0b3IgSSA9IFNVLT5TdWNjcy5iZWdpbigpLCBFID0gU1UtPlN1Y2NzLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChJLT5pc0N0cmwoKSkKKyAgICAgICAgQ2hhaW5TdWNjcy5wdXNoX2JhY2soKkkpOworICAgICAgZWxzZQorICAgICAgICBOb2RlU3VjY3MucHVzaF9iYWNrKCpJKTsKKyAgICB9CisKKyAgICBpZiAoQ2hhaW5QcmVkLmdldFNVbml0KCkpIHsKKyAgICAgIFJlbW92ZVByZWQoU1UsIENoYWluUHJlZCk7CisgICAgICBpZiAoaXNOZXdMb2FkKQorICAgICAgICBBZGRQcmVkKExvYWRTVSwgQ2hhaW5QcmVkKTsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExvYWRQcmVkcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBTRGVwICZQcmVkID0gTG9hZFByZWRzW2ldOworICAgICAgUmVtb3ZlUHJlZChTVSwgUHJlZCk7CisgICAgICBpZiAoaXNOZXdMb2FkKSB7CisgICAgICAgIEFkZFByZWQoTG9hZFNVLCBQcmVkKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vZGVQcmVkcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBTRGVwICZQcmVkID0gTm9kZVByZWRzW2ldOworICAgICAgUmVtb3ZlUHJlZChTVSwgUHJlZCk7CisgICAgICBBZGRQcmVkKE5ld1NVLCBQcmVkKTsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vZGVTdWNjcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBTRGVwIEQgPSBOb2RlU3VjY3NbaV07CisgICAgICBTVW5pdCAqU3VjY0RlcCA9IEQuZ2V0U1VuaXQoKTsKKyAgICAgIEQuc2V0U1VuaXQoU1UpOworICAgICAgUmVtb3ZlUHJlZChTdWNjRGVwLCBEKTsKKyAgICAgIEQuc2V0U1VuaXQoTmV3U1UpOworICAgICAgQWRkUHJlZChTdWNjRGVwLCBEKTsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENoYWluU3VjY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgU0RlcCBEID0gQ2hhaW5TdWNjc1tpXTsKKyAgICAgIFNVbml0ICpTdWNjRGVwID0gRC5nZXRTVW5pdCgpOworICAgICAgRC5zZXRTVW5pdChTVSk7CisgICAgICBSZW1vdmVQcmVkKFN1Y2NEZXAsIEQpOworICAgICAgaWYgKGlzTmV3TG9hZCkgeworICAgICAgICBELnNldFNVbml0KExvYWRTVSk7CisgICAgICAgIEFkZFByZWQoU3VjY0RlcCwgRCk7CisgICAgICB9CisgICAgfSAKKyAgICBpZiAoaXNOZXdMb2FkKSB7CisgICAgICBBZGRQcmVkKE5ld1NVLCBTRGVwKExvYWRTVSwgU0RlcDo6T3JkZXIsIExvYWRTVS0+TGF0ZW5jeSkpOworICAgIH0KKworICAgICsrTnVtVW5mb2xkczsKKworICAgIGlmIChOZXdTVS0+TnVtU3VjY3NMZWZ0ID09IDApIHsKKyAgICAgIE5ld1NVLT5pc0F2YWlsYWJsZSA9IHRydWU7CisgICAgICByZXR1cm4gTmV3U1U7CisgICAgfQorICAgIFNVID0gTmV3U1U7CisgIH0KKworICBERUJVRyhkYmdzKCkgPDwgIkR1cGxpY2F0aW5nIFNVICMgIiA8PCBTVS0+Tm9kZU51bSA8PCAiXG4iKTsKKyAgTmV3U1UgPSBDbG9uZShTVSk7CisKKyAgLy8gTmV3IFNVbml0IGhhcyB0aGUgZXhhY3Qgc2FtZSBwcmVkZWNlc3NvcnMuCisgIGZvciAoU1VuaXQ6OnByZWRfaXRlcmF0b3IgSSA9IFNVLT5QcmVkcy5iZWdpbigpLCBFID0gU1UtPlByZWRzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmICghSS0+aXNBcnRpZmljaWFsKCkpCisgICAgICBBZGRQcmVkKE5ld1NVLCAqSSk7CisKKyAgLy8gT25seSBjb3B5IHNjaGVkdWxlZCBzdWNjZXNzb3JzLiBDdXQgdGhlbSBmcm9tIG9sZCBub2RlJ3Mgc3VjY2Vzc29yCisgIC8vIGxpc3QgYW5kIG1vdmUgdGhlbSBvdmVyLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8U1VuaXQgKiwgU0RlcD4sIDQ+IERlbERlcHM7CisgIGZvciAoU1VuaXQ6OnN1Y2NfaXRlcmF0b3IgSSA9IFNVLT5TdWNjcy5iZWdpbigpLCBFID0gU1UtPlN1Y2NzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPmlzQXJ0aWZpY2lhbCgpKQorICAgICAgY29udGludWU7CisgICAgU1VuaXQgKlN1Y2NTVSA9IEktPmdldFNVbml0KCk7CisgICAgaWYgKFN1Y2NTVS0+aXNTY2hlZHVsZWQpIHsKKyAgICAgIFNEZXAgRCA9ICpJOworICAgICAgRC5zZXRTVW5pdChOZXdTVSk7CisgICAgICBBZGRQcmVkKFN1Y2NTVSwgRCk7CisgICAgICBELnNldFNVbml0KFNVKTsKKyAgICAgIERlbERlcHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFN1Y2NTVSwgRCkpOworICAgIH0KKyAgfQorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVsRGVwcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFJlbW92ZVByZWQoRGVsRGVwc1tpXS5maXJzdCwgRGVsRGVwc1tpXS5zZWNvbmQpOworCisgICsrTnVtRHVwczsKKyAgcmV0dXJuIE5ld1NVOworfQorCisvLy8gSW5zZXJ0Q29waWVzQW5kTW92ZVN1Y2NzIC0gSW5zZXJ0IHJlZ2lzdGVyIGNvcGllcyBhbmQgbW92ZSBhbGwKKy8vLyBzY2hlZHVsZWQgc3VjY2Vzc29ycyBvZiB0aGUgZ2l2ZW4gU1VuaXQgdG8gdGhlIGxhc3QgY29weS4KK3ZvaWQgU2NoZWR1bGVEQUdGYXN0OjpJbnNlcnRDb3BpZXNBbmRNb3ZlU3VjY3MoU1VuaXQgKlNVLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqRGVzdFJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlNyY1JDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxTVW5pdCosIDI+ICZDb3BpZXMpIHsKKyAgU1VuaXQgKkNvcHlGcm9tU1UgPSBOZXdTVW5pdChzdGF0aWNfY2FzdDxTRE5vZGUgKj4oTlVMTCkpOworICBDb3B5RnJvbVNVLT5Db3B5U3JjUkMgPSBTcmNSQzsKKyAgQ29weUZyb21TVS0+Q29weURzdFJDID0gRGVzdFJDOworCisgIFNVbml0ICpDb3B5VG9TVSA9IE5ld1NVbml0KHN0YXRpY19jYXN0PFNETm9kZSAqPihOVUxMKSk7CisgIENvcHlUb1NVLT5Db3B5U3JjUkMgPSBEZXN0UkM7CisgIENvcHlUb1NVLT5Db3B5RHN0UkMgPSBTcmNSQzsKKworICAvLyBPbmx5IGNvcHkgc2NoZWR1bGVkIHN1Y2Nlc3NvcnMuIEN1dCB0aGVtIGZyb20gb2xkIG5vZGUncyBzdWNjZXNzb3IKKyAgLy8gbGlzdCBhbmQgbW92ZSB0aGVtIG92ZXIuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxTVW5pdCAqLCBTRGVwPiwgND4gRGVsRGVwczsKKyAgZm9yIChTVW5pdDo6c3VjY19pdGVyYXRvciBJID0gU1UtPlN1Y2NzLmJlZ2luKCksIEUgPSBTVS0+U3VjY3MuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aXNBcnRpZmljaWFsKCkpCisgICAgICBjb250aW51ZTsKKyAgICBTVW5pdCAqU3VjY1NVID0gSS0+Z2V0U1VuaXQoKTsKKyAgICBpZiAoU3VjY1NVLT5pc1NjaGVkdWxlZCkgeworICAgICAgU0RlcCBEID0gKkk7CisgICAgICBELnNldFNVbml0KENvcHlUb1NVKTsKKyAgICAgIEFkZFByZWQoU3VjY1NVLCBEKTsKKyAgICAgIERlbERlcHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFN1Y2NTVSwgKkkpKTsKKyAgICB9CisgIH0KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IERlbERlcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIFJlbW92ZVByZWQoRGVsRGVwc1tpXS5maXJzdCwgRGVsRGVwc1tpXS5zZWNvbmQpOworICB9CisKKyAgQWRkUHJlZChDb3B5RnJvbVNVLCBTRGVwKFNVLCBTRGVwOjpEYXRhLCBTVS0+TGF0ZW5jeSwgUmVnKSk7CisgIEFkZFByZWQoQ29weVRvU1UsIFNEZXAoQ29weUZyb21TVSwgU0RlcDo6RGF0YSwgQ29weUZyb21TVS0+TGF0ZW5jeSwgMCkpOworCisgIENvcGllcy5wdXNoX2JhY2soQ29weUZyb21TVSk7CisgIENvcGllcy5wdXNoX2JhY2soQ29weVRvU1UpOworCisgICsrTnVtUFJDb3BpZXM7Cit9CisKKy8vLyBnZXRQaHlzaWNhbFJlZ2lzdGVyVlQgLSBSZXR1cm5zIHRoZSBWYWx1ZVR5cGUgb2YgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyCisvLy8gZGVmaW5pdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLy8gRklYTUU6IE1vdmUgdG8gU2VsZWN0aW9uREFHPworc3RhdGljIEVWVCBnZXRQaHlzaWNhbFJlZ2lzdGVyVlQoU0ROb2RlICpOLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSkgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IFRJSS0+Z2V0KE4tPmdldE1hY2hpbmVPcGNvZGUoKSk7CisgIGFzc2VydChUSUQuSW1wbGljaXREZWZzICYmICJQaHlzaWNhbCByZWcgZGVmIG11c3QgYmUgaW4gaW1wbGljaXQgZGVmIGxpc3QhIik7CisgIHVuc2lnbmVkIE51bVJlcyA9IFRJRC5nZXROdW1EZWZzKCk7CisgIGZvciAoY29uc3QgdW5zaWduZWQgKkltcERlZiA9IFRJRC5nZXRJbXBsaWNpdERlZnMoKTsgKkltcERlZjsgKytJbXBEZWYpIHsKKyAgICBpZiAoUmVnID09ICpJbXBEZWYpCisgICAgICBicmVhazsKKyAgICArK051bVJlczsKKyAgfQorICByZXR1cm4gTi0+Z2V0VmFsdWVUeXBlKE51bVJlcyk7Cit9CisKKy8vLyBEZWxheUZvckxpdmVSZWdzQm90dG9tVXAgLSBSZXR1cm5zIHRydWUgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGRlbGF5CisvLy8gc2NoZWR1bGluZyBvZiB0aGUgZ2l2ZW4gbm9kZSB0byBzYXRpc2Z5IGxpdmUgcGh5c2ljYWwgcmVnaXN0ZXIgZGVwZW5kZW5jaWVzLgorLy8vIElmIHRoZSBzcGVjaWZpYyBub2RlIGlzIHRoZSBsYXN0IG9uZSB0aGF0J3MgYXZhaWxhYmxlIHRvIHNjaGVkdWxlLCBkbworLy8vIHdoYXRldmVyIGlzIG5lY2Vzc2FyeSAoaS5lLiBiYWNrdHJhY2tpbmcgb3IgY2xvbmluZykgdG8gbWFrZSBpdCBwb3NzaWJsZS4KK2Jvb2wgU2NoZWR1bGVEQUdGYXN0OjpEZWxheUZvckxpdmVSZWdzQm90dG9tVXAoU1VuaXQgKlNVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gJkxSZWdzKXsKKyAgaWYgKE51bUxpdmVSZWdzID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiBSZWdBZGRlZDsKKyAgLy8gSWYgdGhpcyBub2RlIHdvdWxkIGNsb2JiZXIgYW55ICJsaXZlIiByZWdpc3RlciwgdGhlbiBpdCdzIG5vdCByZWFkeS4KKyAgZm9yIChTVW5pdDo6cHJlZF9pdGVyYXRvciBJID0gU1UtPlByZWRzLmJlZ2luKCksIEUgPSBTVS0+UHJlZHMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aXNBc3NpZ25lZFJlZ0RlcCgpKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSBJLT5nZXRSZWcoKTsKKyAgICAgIGlmIChMaXZlUmVnRGVmc1tSZWddICYmIExpdmVSZWdEZWZzW1JlZ10gIT0gSS0+Z2V0U1VuaXQoKSkgeworICAgICAgICBpZiAoUmVnQWRkZWQuaW5zZXJ0KFJlZykpCisgICAgICAgICAgTFJlZ3MucHVzaF9iYWNrKFJlZyk7CisgICAgICB9CisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBbGlhcyA9IFRSSS0+Z2V0QWxpYXNTZXQoUmVnKTsKKyAgICAgICAgICAgKkFsaWFzOyArK0FsaWFzKQorICAgICAgICBpZiAoTGl2ZVJlZ0RlZnNbKkFsaWFzXSAmJiBMaXZlUmVnRGVmc1sqQWxpYXNdICE9IEktPmdldFNVbml0KCkpIHsKKyAgICAgICAgICBpZiAoUmVnQWRkZWQuaW5zZXJ0KCpBbGlhcykpCisgICAgICAgICAgICBMUmVncy5wdXNoX2JhY2soKkFsaWFzKTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoU0ROb2RlICpOb2RlID0gU1UtPmdldE5vZGUoKTsgTm9kZTsgTm9kZSA9IE5vZGUtPmdldEZsYWdnZWROb2RlKCkpIHsKKyAgICBpZiAoIU5vZGUtPmlzTWFjaGluZU9wY29kZSgpKQorICAgICAgY29udGludWU7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBUSUktPmdldChOb2RlLT5nZXRNYWNoaW5lT3Bjb2RlKCkpOworICAgIGlmICghVElELkltcGxpY2l0RGVmcykKKyAgICAgIGNvbnRpbnVlOworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlJlZyA9IFRJRC5JbXBsaWNpdERlZnM7ICpSZWc7ICsrUmVnKSB7CisgICAgICBpZiAoTGl2ZVJlZ0RlZnNbKlJlZ10gJiYgTGl2ZVJlZ0RlZnNbKlJlZ10gIT0gU1UpIHsKKyAgICAgICAgaWYgKFJlZ0FkZGVkLmluc2VydCgqUmVnKSkKKyAgICAgICAgICBMUmVncy5wdXNoX2JhY2soKlJlZyk7CisgICAgICB9CisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBbGlhcyA9IFRSSS0+Z2V0QWxpYXNTZXQoKlJlZyk7CisgICAgICAgICAgICpBbGlhczsgKytBbGlhcykKKyAgICAgICAgaWYgKExpdmVSZWdEZWZzWypBbGlhc10gJiYgTGl2ZVJlZ0RlZnNbKkFsaWFzXSAhPSBTVSkgeworICAgICAgICAgIGlmIChSZWdBZGRlZC5pbnNlcnQoKkFsaWFzKSkKKyAgICAgICAgICAgIExSZWdzLnB1c2hfYmFjaygqQWxpYXMpOworICAgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAhTFJlZ3MuZW1wdHkoKTsKK30KKworCisvLy8gTGlzdFNjaGVkdWxlQm90dG9tVXAgLSBUaGUgbWFpbiBsb29wIG9mIGxpc3Qgc2NoZWR1bGluZyBmb3IgYm90dG9tLXVwCisvLy8gc2NoZWR1bGVycy4KK3ZvaWQgU2NoZWR1bGVEQUdGYXN0OjpMaXN0U2NoZWR1bGVCb3R0b21VcCgpIHsKKyAgdW5zaWduZWQgQ3VyQ3ljbGUgPSAwOworCisgIC8vIFJlbGVhc2UgYW55IHByZWRlY2Vzc29ycyBvZiB0aGUgc3BlY2lhbCBFeGl0IG5vZGUuCisgIFJlbGVhc2VQcmVkZWNlc3NvcnMoJkV4aXRTVSwgQ3VyQ3ljbGUpOworCisgIC8vIEFkZCByb290IHRvIEF2YWlsYWJsZSBxdWV1ZS4KKyAgaWYgKCFTVW5pdHMuZW1wdHkoKSkgeworICAgIFNVbml0ICpSb290U1UgPSAmU1VuaXRzW0RBRy0+Z2V0Um9vdCgpLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCldOworICAgIGFzc2VydChSb290U1UtPlN1Y2NzLmVtcHR5KCkgJiYgIkdyYXBoIHJvb3Qgc2hvdWxkbid0IGhhdmUgc3VjY2Vzc29ycyEiKTsKKyAgICBSb290U1UtPmlzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICBBdmFpbGFibGVRdWV1ZS5wdXNoKFJvb3RTVSk7CisgIH0KKworICAvLyBXaGlsZSBBdmFpbGFibGUgcXVldWUgaXMgbm90IGVtcHR5LCBncmFiIHRoZSBub2RlIHdpdGggdGhlIGhpZ2hlc3QKKyAgLy8gcHJpb3JpdHkuIElmIGl0IGlzIG5vdCByZWFkeSBwdXQgaXQgYmFjay4gIFNjaGVkdWxlIHRoZSBub2RlLgorICBTbWFsbFZlY3RvcjxTVW5pdCosIDQ+IE5vdFJlYWR5OworICBEZW5zZU1hcDxTVW5pdCosIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiA+IExSZWdzTWFwOworICBTZXF1ZW5jZS5yZXNlcnZlKFNVbml0cy5zaXplKCkpOworICB3aGlsZSAoIUF2YWlsYWJsZVF1ZXVlLmVtcHR5KCkpIHsKKyAgICBib29sIERlbGF5ZWQgPSBmYWxzZTsKKyAgICBMUmVnc01hcC5jbGVhcigpOworICAgIFNVbml0ICpDdXJTVSA9IEF2YWlsYWJsZVF1ZXVlLnBvcCgpOworICAgIHdoaWxlIChDdXJTVSkgeworICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IExSZWdzOworICAgICAgaWYgKCFEZWxheUZvckxpdmVSZWdzQm90dG9tVXAoQ3VyU1UsIExSZWdzKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBEZWxheWVkID0gdHJ1ZTsKKyAgICAgIExSZWdzTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihDdXJTVSwgTFJlZ3MpKTsKKworICAgICAgQ3VyU1UtPmlzUGVuZGluZyA9IHRydWU7ICAvLyBUaGlzIFNVIGlzIG5vdCBpbiBBdmFpbGFibGVRdWV1ZSByaWdodCBub3cuCisgICAgICBOb3RSZWFkeS5wdXNoX2JhY2soQ3VyU1UpOworICAgICAgQ3VyU1UgPSBBdmFpbGFibGVRdWV1ZS5wb3AoKTsKKyAgICB9CisKKyAgICAvLyBBbGwgY2FuZGlkYXRlcyBhcmUgZGVsYXllZCBkdWUgdG8gbGl2ZSBwaHlzaWNhbCByZWcgZGVwZW5kZW5jaWVzLgorICAgIC8vIFRyeSBjb2RlIGR1cGxpY2F0aW9uIG9yIGluc2VydGluZyBjcm9zcyBjbGFzcyBjb3BpZXMKKyAgICAvLyB0byByZXNvbHZlIGl0LgorICAgIGlmIChEZWxheWVkICYmICFDdXJTVSkgeworICAgICAgaWYgKCFDdXJTVSkgeworICAgICAgICAvLyBUcnkgZHVwbGljYXRpbmcgdGhlIG5vZGVzIHRoYXQgcHJvZHVjZXMgdGhlc2UKKyAgICAgICAgLy8gImV4cGVuc2l2ZSB0byBjb3B5IiB2YWx1ZXMgdG8gYnJlYWsgdGhlIGRlcGVuZGVuY3kuIEluIGNhc2UgZXZlbgorICAgICAgICAvLyB0aGF0IGRvZXNuJ3Qgd29yaywgaW5zZXJ0IGNyb3NzIGNsYXNzIGNvcGllcy4KKyAgICAgICAgU1VuaXQgKlRyeVNVID0gTm90UmVhZHlbMF07CisgICAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmTFJlZ3MgPSBMUmVnc01hcFtUcnlTVV07CisgICAgICAgIGFzc2VydChMUmVncy5zaXplKCkgPT0gMSAmJiAiQ2FuJ3QgaGFuZGxlIHRoaXMgeWV0ISIpOworICAgICAgICB1bnNpZ25lZCBSZWcgPSBMUmVnc1swXTsKKyAgICAgICAgU1VuaXQgKkxSRGVmID0gTGl2ZVJlZ0RlZnNbUmVnXTsKKyAgICAgICAgRVZUIFZUID0gZ2V0UGh5c2ljYWxSZWdpc3RlclZUKExSRGVmLT5nZXROb2RlKCksIFJlZywgVElJKTsKKyAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPQorICAgICAgICAgIFRSSS0+Z2V0TWluaW1hbFBoeXNSZWdDbGFzcyhSZWcsIFZUKTsKKyAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqRGVzdFJDID0gVFJJLT5nZXRDcm9zc0NvcHlSZWdDbGFzcyhSQyk7CisKKyAgICAgICAgLy8gSWYgY3Jvc3MgY29weSByZWdpc3RlciBjbGFzcyBpcyBudWxsLCB0aGVuIGl0IG11c3QgYmUgcG9zc2libGUgY29weQorICAgICAgICAvLyB0aGUgdmFsdWUgZGlyZWN0bHkuIERvIG5vdCB0cnkgZHVwbGljYXRlIHRoZSBkZWYuCisgICAgICAgIFNVbml0ICpOZXdEZWYgPSAwOworICAgICAgICBpZiAoRGVzdFJDKQorICAgICAgICAgIE5ld0RlZiA9IENvcHlBbmRNb3ZlU3VjY2Vzc29ycyhMUkRlZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBEZXN0UkMgPSBSQzsKKyAgICAgICAgaWYgKCFOZXdEZWYpIHsKKyAgICAgICAgICAvLyBJc3N1ZSBjb3BpZXMsIHRoZXNlIGNhbiBiZSBleHBlbnNpdmUgY3Jvc3MgcmVnaXN0ZXIgY2xhc3MgY29waWVzLgorICAgICAgICAgIFNtYWxsVmVjdG9yPFNVbml0KiwgMj4gQ29waWVzOworICAgICAgICAgIEluc2VydENvcGllc0FuZE1vdmVTdWNjcyhMUkRlZiwgUmVnLCBEZXN0UkMsIFJDLCBDb3BpZXMpOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQWRkaW5nIGFuIGVkZ2UgZnJvbSBTVSAjICIgPDwgVHJ5U1UtPk5vZGVOdW0KKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB0byBTVSAjIiA8PCBDb3BpZXMuZnJvbnQoKS0+Tm9kZU51bSA8PCAiXG4iKTsKKyAgICAgICAgICBBZGRQcmVkKFRyeVNVLCBTRGVwKENvcGllcy5mcm9udCgpLCBTRGVwOjpPcmRlciwgLypMYXRlbmN5PSovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qUmVnPSovMCwgLyppc05vcm1hbE1lbW9yeT0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc011c3RBbGlhcz0qL2ZhbHNlLCAvKmlzQXJ0aWZpY2lhbD0qL3RydWUpKTsKKyAgICAgICAgICBOZXdEZWYgPSBDb3BpZXMuYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJBZGRpbmcgYW4gZWRnZSBmcm9tIFNVICMgIiA8PCBOZXdEZWYtPk5vZGVOdW0KKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgdG8gU1UgIyIgPDwgVHJ5U1UtPk5vZGVOdW0gPDwgIlxuIik7CisgICAgICAgIExpdmVSZWdEZWZzW1JlZ10gPSBOZXdEZWY7CisgICAgICAgIEFkZFByZWQoTmV3RGVmLCBTRGVwKFRyeVNVLCBTRGVwOjpPcmRlciwgLypMYXRlbmN5PSovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypSZWc9Ki8wLCAvKmlzTm9ybWFsTWVtb3J5PSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNNdXN0QWxpYXM9Ki9mYWxzZSwgLyppc0FydGlmaWNpYWw9Ki90cnVlKSk7CisgICAgICAgIFRyeVNVLT5pc0F2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBDdXJTVSA9IE5ld0RlZjsKKyAgICAgIH0KKworICAgICAgaWYgKCFDdXJTVSkgeworICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmFibGUgdG8gcmVzb2x2ZSBsaXZlIHBoeXNpY2FsIHJlZ2lzdGVyIGRlcGVuZGVuY2llcyEiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBZGQgdGhlIG5vZGVzIHRoYXQgYXJlbid0IHJlYWR5IGJhY2sgb250byB0aGUgYXZhaWxhYmxlIGxpc3QuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vdFJlYWR5LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE5vdFJlYWR5W2ldLT5pc1BlbmRpbmcgPSBmYWxzZTsKKyAgICAgIC8vIE1heSBubyBsb25nZXIgYmUgYXZhaWxhYmxlIGR1ZSB0byBiYWNrdHJhY2tpbmcuCisgICAgICBpZiAoTm90UmVhZHlbaV0tPmlzQXZhaWxhYmxlKQorICAgICAgICBBdmFpbGFibGVRdWV1ZS5wdXNoKE5vdFJlYWR5W2ldKTsKKyAgICB9CisgICAgTm90UmVhZHkuY2xlYXIoKTsKKworICAgIGlmIChDdXJTVSkKKyAgICAgIFNjaGVkdWxlTm9kZUJvdHRvbVVwKEN1clNVLCBDdXJDeWNsZSk7CisgICAgKytDdXJDeWNsZTsKKyAgfQorCisgIC8vIFJldmVyc2UgdGhlIG9yZGVyIHNpbmNlIGl0IGlzIGJvdHRvbSB1cC4KKyAgc3RkOjpyZXZlcnNlKFNlcXVlbmNlLmJlZ2luKCksIFNlcXVlbmNlLmVuZCgpKTsKKworI2lmbmRlZiBOREVCVUcKKyAgVmVyaWZ5U2NoZWR1bGUoLyppc0JvdHRvbVVwPSovdHJ1ZSk7CisjZW5kaWYKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpYyBDb25zdHJ1Y3RvciBGdW5jdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xsdm06OlNjaGVkdWxlREFHU0ROb2RlcyAqCitsbHZtOjpjcmVhdGVGYXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLCBDb2RlR2VuT3B0OjpMZXZlbCkgeworICByZXR1cm4gbmV3IFNjaGVkdWxlREFHRmFzdCgqSVMtPk1GKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9TY2hlZHVsZURBR0xpc3QuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NjaGVkdWxlREFHTGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmNWRlZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9TY2hlZHVsZURBR0xpc3QuY3BwCkBAIC0wLDAgKzEsMjY4IEBACisvLz09PS0tLS0gU2NoZWR1bGVEQUdMaXN0LmNwcCAtIEltcGxlbWVudCBhIGxpc3Qgc2NoZWR1bGVyIGZvciBpc2VsIERBRyAtLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaW1wbGVtZW50cyBhIHRvcC1kb3duIGxpc3Qgc2NoZWR1bGVyLCB1c2luZyBzdGFuZGFyZCBhbGdvcml0aG1zLgorLy8gVGhlIGJhc2ljIGFwcHJvYWNoIHVzZXMgYSBwcmlvcml0eSBxdWV1ZSBvZiBhdmFpbGFibGUgbm9kZXMgdG8gc2NoZWR1bGUuCisvLyBPbmUgYXQgYSB0aW1lLCBub2RlcyBhcmUgdGFrZW4gZnJvbSB0aGUgcHJpb3JpdHkgcXVldWUgKHRodXMgaW4gcHJpb3JpdHkKKy8vIG9yZGVyKSwgY2hlY2tlZCBmb3IgbGVnYWxpdHkgdG8gc2NoZWR1bGUsIGFuZCBlbWl0dGVkIGlmIGxlZ2FsLgorLy8KKy8vIE5vZGVzIG1heSBub3QgYmUgbGVnYWwgdG8gc2NoZWR1bGUgZWl0aGVyIGR1ZSB0byBzdHJ1Y3R1cmFsIGhhemFyZHMgKGUuZy4KKy8vIHBpcGVsaW5lIG9yIHJlc291cmNlIGNvbnN0cmFpbnRzKSBvciBiZWNhdXNlIGFuIGlucHV0IHRvIHRoZSBpbnN0cnVjdGlvbiBoYXMKKy8vIG5vdCBjb21wbGV0ZWQgZXhlY3V0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicHJlLVJBLXNjaGVkIgorI2luY2x1ZGUgIlNjaGVkdWxlREFHU0ROb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MYXRlbmN5UHJpb3JpdHlRdWV1ZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVyUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgPGNsaW1pdHM+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bU5vb3BzICwgIk51bWJlciBvZiBub29wcyBpbnNlcnRlZCIpOworU1RBVElTVElDKE51bVN0YWxscywgIk51bWJlciBvZiBwaXBlbGluZSBzdGFsbHMiKTsKKworc3RhdGljIFJlZ2lzdGVyU2NoZWR1bGVyCisgIHRkTGlzdERBR1NjaGVkdWxlcigibGlzdC10ZCIsICJUb3AtZG93biBsaXN0IHNjaGVkdWxlciIsCisgICAgICAgICAgICAgICAgICAgICBjcmVhdGVURExpc3REQUdTY2hlZHVsZXIpOworICAgCituYW1lc3BhY2UgeworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBTY2hlZHVsZURBR0xpc3QgLSBUaGUgYWN0dWFsIGxpc3Qgc2NoZWR1bGVyIGltcGxlbWVudGF0aW9uLiAgVGhpcyBzdXBwb3J0cworLy8vIHRvcC1kb3duIHNjaGVkdWxpbmcuCisvLy8KK2NsYXNzIFNjaGVkdWxlREFHTGlzdCA6IHB1YmxpYyBTY2hlZHVsZURBR1NETm9kZXMgeworcHJpdmF0ZToKKyAgLy8vIEF2YWlsYWJsZVF1ZXVlIC0gVGhlIHByaW9yaXR5IHF1ZXVlIHRvIHVzZSBmb3IgdGhlIGF2YWlsYWJsZSBTVW5pdHMuCisgIC8vLworICBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSAqQXZhaWxhYmxlUXVldWU7CisgIAorICAvLy8gUGVuZGluZ1F1ZXVlIC0gVGhpcyBjb250YWlucyBhbGwgb2YgdGhlIGluc3RydWN0aW9ucyB3aG9zZSBvcGVyYW5kcyBoYXZlCisgIC8vLyBiZWVuIGlzc3VlZCwgYnV0IHRoZWlyIHJlc3VsdHMgYXJlIG5vdCByZWFkeSB5ZXQgKGR1ZSB0byB0aGUgbGF0ZW5jeSBvZgorICAvLy8gdGhlIG9wZXJhdGlvbikuICBPbmNlIHRoZSBvcGVyYW5kcyBiZWNvbWUgYXZhaWxhYmxlLCB0aGUgaW5zdHJ1Y3Rpb24gaXMKKyAgLy8vIGFkZGVkIHRvIHRoZSBBdmFpbGFibGVRdWV1ZS4KKyAgc3RkOjp2ZWN0b3I8U1VuaXQqPiBQZW5kaW5nUXVldWU7CisKKyAgLy8vIEhhemFyZFJlYyAtIFRoZSBoYXphcmQgcmVjb2duaXplciB0byB1c2UuCisgIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplciAqSGF6YXJkUmVjOworCitwdWJsaWM6CisgIFNjaGVkdWxlREFHTGlzdChNYWNoaW5lRnVuY3Rpb24gJm1mLAorICAgICAgICAgICAgICAgICAgU2NoZWR1bGluZ1ByaW9yaXR5UXVldWUgKmF2YWlscXVldWUsCisgICAgICAgICAgICAgICAgICBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgKkhSKQorICAgIDogU2NoZWR1bGVEQUdTRE5vZGVzKG1mKSwKKyAgICAgIEF2YWlsYWJsZVF1ZXVlKGF2YWlscXVldWUpLCBIYXphcmRSZWMoSFIpIHsKKyAgICB9CisKKyAgflNjaGVkdWxlREFHTGlzdCgpIHsKKyAgICBkZWxldGUgSGF6YXJkUmVjOworICAgIGRlbGV0ZSBBdmFpbGFibGVRdWV1ZTsKKyAgfQorCisgIHZvaWQgU2NoZWR1bGUoKTsKKworcHJpdmF0ZToKKyAgdm9pZCBSZWxlYXNlU3VjYyhTVW5pdCAqU1UsIGNvbnN0IFNEZXAgJkQpOworICB2b2lkIFJlbGVhc2VTdWNjZXNzb3JzKFNVbml0ICpTVSk7CisgIHZvaWQgU2NoZWR1bGVOb2RlVG9wRG93bihTVW5pdCAqU1UsIHVuc2lnbmVkIEN1ckN5Y2xlKTsKKyAgdm9pZCBMaXN0U2NoZWR1bGVUb3BEb3duKCk7Cit9OworfSAgLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworLy8vIFNjaGVkdWxlIC0gU2NoZWR1bGUgdGhlIERBRyB1c2luZyBsaXN0IHNjaGVkdWxpbmcuCit2b2lkIFNjaGVkdWxlREFHTGlzdDo6U2NoZWR1bGUoKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiKioqKioqKioqKiBMaXN0IFNjaGVkdWxpbmcgKioqKioqKioqKlxuIik7CisgIAorICAvLyBCdWlsZCB0aGUgc2NoZWR1bGluZyBncmFwaC4KKyAgQnVpbGRTY2hlZEdyYXBoKE5VTEwpOworCisgIEF2YWlsYWJsZVF1ZXVlLT5pbml0Tm9kZXMoU1VuaXRzKTsKKyAgCisgIExpc3RTY2hlZHVsZVRvcERvd24oKTsKKyAgCisgIEF2YWlsYWJsZVF1ZXVlLT5yZWxlYXNlU3RhdGUoKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBUb3AtRG93biBTY2hlZHVsaW5nCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gUmVsZWFzZVN1Y2MgLSBEZWNyZW1lbnQgdGhlIE51bVByZWRzTGVmdCBjb3VudCBvZiBhIHN1Y2Nlc3Nvci4gQWRkIGl0IHRvCisvLy8gdGhlIFBlbmRpbmdRdWV1ZSBpZiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLiBBbHNvIHVwZGF0ZSBpdHMgY3ljbGUgYm91bmQuCit2b2lkIFNjaGVkdWxlREFHTGlzdDo6UmVsZWFzZVN1Y2MoU1VuaXQgKlNVLCBjb25zdCBTRGVwICZEKSB7CisgIFNVbml0ICpTdWNjU1UgPSBELmdldFNVbml0KCk7CisKKyNpZm5kZWYgTkRFQlVHCisgIGlmIChTdWNjU1UtPk51bVByZWRzTGVmdCA9PSAwKSB7CisgICAgZGJncygpIDw8ICIqKiogU2NoZWR1bGluZyBmYWlsZWQhICoqKlxuIjsKKyAgICBTdWNjU1UtPmR1bXAodGhpcyk7CisgICAgZGJncygpIDw8ICIgaGFzIGJlZW4gcmVsZWFzZWQgdG9vIG1hbnkgdGltZXMhXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKyNlbmRpZgorICAtLVN1Y2NTVS0+TnVtUHJlZHNMZWZ0OworCisgIFN1Y2NTVS0+c2V0RGVwdGhUb0F0TGVhc3QoU1UtPmdldERlcHRoKCkgKyBELmdldExhdGVuY3koKSk7CisgIAorICAvLyBJZiBhbGwgdGhlIG5vZGUncyBwcmVkZWNlc3NvcnMgYXJlIHNjaGVkdWxlZCwgdGhpcyBub2RlIGlzIHJlYWR5CisgIC8vIHRvIGJlIHNjaGVkdWxlZC4gSWdub3JlIHRoZSBzcGVjaWFsIEV4aXRTVSBub2RlLgorICBpZiAoU3VjY1NVLT5OdW1QcmVkc0xlZnQgPT0gMCAmJiBTdWNjU1UgIT0gJkV4aXRTVSkKKyAgICBQZW5kaW5nUXVldWUucHVzaF9iYWNrKFN1Y2NTVSk7Cit9CisKK3ZvaWQgU2NoZWR1bGVEQUdMaXN0OjpSZWxlYXNlU3VjY2Vzc29ycyhTVW5pdCAqU1UpIHsKKyAgLy8gVG9wIGRvd246IHJlbGVhc2Ugc3VjY2Vzc29ycy4KKyAgZm9yIChTVW5pdDo6c3VjY19pdGVyYXRvciBJID0gU1UtPlN1Y2NzLmJlZ2luKCksIEUgPSBTVS0+U3VjY3MuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoIUktPmlzQXNzaWduZWRSZWdEZXAoKSAmJgorICAgICAgICAgICAiVGhlIGxpc3QtdGQgc2NoZWR1bGVyIGRvZXNuJ3QgeWV0IHN1cHBvcnQgcGh5c3JlZyBkZXBlbmRlbmNpZXMhIik7CisKKyAgICBSZWxlYXNlU3VjYyhTVSwgKkkpOworICB9Cit9CisKKy8vLyBTY2hlZHVsZU5vZGVUb3BEb3duIC0gQWRkIHRoZSBub2RlIHRvIHRoZSBzY2hlZHVsZS4gRGVjcmVtZW50IHRoZSBwZW5kaW5nCisvLy8gY291bnQgb2YgaXRzIHN1Y2Nlc3NvcnMuIElmIGEgc3VjY2Vzc29yIHBlbmRpbmcgY291bnQgaXMgemVybywgYWRkIGl0IHRvCisvLy8gdGhlIEF2YWlsYWJsZSBxdWV1ZS4KK3ZvaWQgU2NoZWR1bGVEQUdMaXN0OjpTY2hlZHVsZU5vZGVUb3BEb3duKFNVbml0ICpTVSwgdW5zaWduZWQgQ3VyQ3ljbGUpIHsKKyAgREVCVUcoZGJncygpIDw8ICIqKiogU2NoZWR1bGluZyBbIiA8PCBDdXJDeWNsZSA8PCAiXTogIik7CisgIERFQlVHKFNVLT5kdW1wKHRoaXMpKTsKKyAgCisgIFNlcXVlbmNlLnB1c2hfYmFjayhTVSk7CisgIGFzc2VydChDdXJDeWNsZSA+PSBTVS0+Z2V0RGVwdGgoKSAmJiAiTm9kZSBzY2hlZHVsZWQgYWJvdmUgaXRzIGRlcHRoISIpOworICBTVS0+c2V0RGVwdGhUb0F0TGVhc3QoQ3VyQ3ljbGUpOworCisgIFJlbGVhc2VTdWNjZXNzb3JzKFNVKTsKKyAgU1UtPmlzU2NoZWR1bGVkID0gdHJ1ZTsKKyAgQXZhaWxhYmxlUXVldWUtPlNjaGVkdWxlZE5vZGUoU1UpOworfQorCisvLy8gTGlzdFNjaGVkdWxlVG9wRG93biAtIFRoZSBtYWluIGxvb3Agb2YgbGlzdCBzY2hlZHVsaW5nIGZvciB0b3AtZG93bgorLy8vIHNjaGVkdWxlcnMuCit2b2lkIFNjaGVkdWxlREFHTGlzdDo6TGlzdFNjaGVkdWxlVG9wRG93bigpIHsKKyAgdW5zaWduZWQgQ3VyQ3ljbGUgPSAwOworCisgIC8vIFJlbGVhc2UgYW55IHN1Y2Nlc3NvcnMgb2YgdGhlIHNwZWNpYWwgRW50cnkgbm9kZS4KKyAgUmVsZWFzZVN1Y2Nlc3NvcnMoJkVudHJ5U1UpOworCisgIC8vIEFsbCBsZWF2ZXMgdG8gQXZhaWxhYmxlIHF1ZXVlLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU1VuaXRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAvLyBJdCBpcyBhdmFpbGFibGUgaWYgaXQgaGFzIG5vIHByZWRlY2Vzc29ycy4KKyAgICBpZiAoU1VuaXRzW2ldLlByZWRzLmVtcHR5KCkpIHsKKyAgICAgIEF2YWlsYWJsZVF1ZXVlLT5wdXNoKCZTVW5pdHNbaV0pOworICAgICAgU1VuaXRzW2ldLmlzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgCisgIC8vIFdoaWxlIEF2YWlsYWJsZSBxdWV1ZSBpcyBub3QgZW1wdHksIGdyYWIgdGhlIG5vZGUgd2l0aCB0aGUgaGlnaGVzdAorICAvLyBwcmlvcml0eS4gSWYgaXQgaXMgbm90IHJlYWR5IHB1dCBpdCBiYWNrLiAgU2NoZWR1bGUgdGhlIG5vZGUuCisgIHN0ZDo6dmVjdG9yPFNVbml0Kj4gTm90UmVhZHk7CisgIFNlcXVlbmNlLnJlc2VydmUoU1VuaXRzLnNpemUoKSk7CisgIHdoaWxlICghQXZhaWxhYmxlUXVldWUtPmVtcHR5KCkgfHwgIVBlbmRpbmdRdWV1ZS5lbXB0eSgpKSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFueSBvZiB0aGUgcGVuZGluZyBpbnN0cnVjdGlvbnMgYXJlIHJlYWR5IHRvIGlzc3VlLiAgSWYKKyAgICAvLyBzbywgYWRkIHRoZW0gdG8gdGhlIGF2YWlsYWJsZSBxdWV1ZS4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUGVuZGluZ1F1ZXVlLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChQZW5kaW5nUXVldWVbaV0tPmdldERlcHRoKCkgPT0gQ3VyQ3ljbGUpIHsKKyAgICAgICAgQXZhaWxhYmxlUXVldWUtPnB1c2goUGVuZGluZ1F1ZXVlW2ldKTsKKyAgICAgICAgUGVuZGluZ1F1ZXVlW2ldLT5pc0F2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIFBlbmRpbmdRdWV1ZVtpXSA9IFBlbmRpbmdRdWV1ZS5iYWNrKCk7CisgICAgICAgIFBlbmRpbmdRdWV1ZS5wb3BfYmFjaygpOworICAgICAgICAtLWk7IC0tZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChQZW5kaW5nUXVldWVbaV0tPmdldERlcHRoKCkgPiBDdXJDeWNsZSAmJiAiTmVnYXRpdmUgbGF0ZW5jeT8iKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGluc3RydWN0aW9ucyBhdmFpbGFibGUsIGRvbid0IHRyeSB0byBpc3N1ZSBhbnl0aGluZywgYW5kCisgICAgLy8gZG9uJ3QgYWR2YW5jZSB0aGUgaGF6YXJkIHJlY29nbml6ZXIuCisgICAgaWYgKEF2YWlsYWJsZVF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICArK0N1ckN5Y2xlOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgU1VuaXQgKkZvdW5kU1VuaXQgPSAwOworICAgIAorICAgIGJvb2wgSGFzTm9vcEhhemFyZHMgPSBmYWxzZTsKKyAgICB3aGlsZSAoIUF2YWlsYWJsZVF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICBTVW5pdCAqQ3VyU1VuaXQgPSBBdmFpbGFibGVRdWV1ZS0+cG9wKCk7CisgICAgICAKKyAgICAgIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplcjo6SGF6YXJkVHlwZSBIVCA9CisgICAgICAgIEhhemFyZFJlYy0+Z2V0SGF6YXJkVHlwZShDdXJTVW5pdCk7CisgICAgICBpZiAoSFQgPT0gU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyOjpOb0hhemFyZCkgeworICAgICAgICBGb3VuZFNVbml0ID0gQ3VyU1VuaXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIAorICAgICAgLy8gUmVtZW1iZXIgaWYgdGhpcyBpcyBhIG5vb3AgaGF6YXJkLgorICAgICAgSGFzTm9vcEhhemFyZHMgfD0gSFQgPT0gU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyOjpOb29wSGF6YXJkOworICAgICAgCisgICAgICBOb3RSZWFkeS5wdXNoX2JhY2soQ3VyU1VuaXQpOworICAgIH0KKyAgICAKKyAgICAvLyBBZGQgdGhlIG5vZGVzIHRoYXQgYXJlbid0IHJlYWR5IGJhY2sgb250byB0aGUgYXZhaWxhYmxlIGxpc3QuCisgICAgaWYgKCFOb3RSZWFkeS5lbXB0eSgpKSB7CisgICAgICBBdmFpbGFibGVRdWV1ZS0+cHVzaF9hbGwoTm90UmVhZHkpOworICAgICAgTm90UmVhZHkuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIG5vZGUgdG8gc2NoZWR1bGUsIGRvIGl0IG5vdy4KKyAgICBpZiAoRm91bmRTVW5pdCkgeworICAgICAgU2NoZWR1bGVOb2RlVG9wRG93bihGb3VuZFNVbml0LCBDdXJDeWNsZSk7CisgICAgICBIYXphcmRSZWMtPkVtaXRJbnN0cnVjdGlvbihGb3VuZFNVbml0KTsKKworICAgICAgLy8gSWYgdGhpcyBpcyBhIHBzZXVkby1vcCBub2RlLCB3ZSBkb24ndCB3YW50IHRvIGluY3JlbWVudCB0aGUgY3VycmVudAorICAgICAgLy8gY3ljbGUuCisgICAgICBpZiAoRm91bmRTVW5pdC0+TGF0ZW5jeSkgIC8vIERvbid0IGluY3JlbWVudCBDdXJDeWNsZSBmb3IgcHNldWRvLW9wcyEKKyAgICAgICAgKytDdXJDeWNsZTsgICAgICAgIAorICAgIH0gZWxzZSBpZiAoIUhhc05vb3BIYXphcmRzKSB7CisgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgYSBwaXBlbGluZSBzdGFsbCwgYnV0IG5vIG90aGVyIHByb2JsZW0sIGp1c3QgYWR2YW5jZQorICAgICAgLy8gdGhlIGN1cnJlbnQgY3ljbGUgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiKioqIEFkdmFuY2luZyBjeWNsZSwgbm8gd29yayB0byBkb1xuIik7CisgICAgICBIYXphcmRSZWMtPkFkdmFuY2VDeWNsZSgpOworICAgICAgKytOdW1TdGFsbHM7CisgICAgICArK0N1ckN5Y2xlOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgbm8gaW5zdHJ1Y3Rpb25zIHRvIGlzc3VlIGFuZCB3ZSBoYXZlIGluc3RydWN0aW9ucworICAgICAgLy8gdGhhdCB3aWxsIGZhdWx0IGlmIHdlIGRvbid0IGRvIHRoaXMgcmlnaHQuICBUaGlzIGlzIHRoZSBjYXNlIGZvcgorICAgICAgLy8gcHJvY2Vzc29ycyB3aXRob3V0IHBpcGVsaW5lIGludGVybG9ja3MgYW5kIG90aGVyIGNhc2VzLgorICAgICAgREVCVUcoZGJncygpIDw8ICIqKiogRW1pdHRpbmcgbm9vcFxuIik7CisgICAgICBIYXphcmRSZWMtPkVtaXROb29wKCk7CisgICAgICBTZXF1ZW5jZS5wdXNoX2JhY2soMCk7ICAgLy8gTlVMTCBoZXJlIG1lYW5zIG5vb3AKKyAgICAgICsrTnVtTm9vcHM7CisgICAgICArK0N1ckN5Y2xlOworICAgIH0KKyAgfQorCisjaWZuZGVmIE5ERUJVRworICBWZXJpZnlTY2hlZHVsZSgvKmlzQm90dG9tVXA9Ki9mYWxzZSk7CisjZW5kaWYKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpYyBDb25zdHJ1Y3RvciBGdW5jdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBjcmVhdGVURExpc3REQUdTY2hlZHVsZXIgLSBUaGlzIGNyZWF0ZXMgYSB0b3AtZG93biBsaXN0IHNjaGVkdWxlciB3aXRoIGEKKy8vLyBuZXcgaGF6YXJkIHJlY29nbml6ZXIuIFRoaXMgc2NoZWR1bGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgaGF6YXJkCisvLy8gcmVjb2duaXplciBhbmQgZGVsZXRlcyBpdCB3aGVuIGRvbmUuCitTY2hlZHVsZURBR1NETm9kZXMgKgorbGx2bTo6Y3JlYXRlVERMaXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLCBDb2RlR2VuT3B0OjpMZXZlbCkgeworICByZXR1cm4gbmV3IFNjaGVkdWxlREFHTGlzdCgqSVMtPk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGF0ZW5jeVByaW9yaXR5UXVldWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVMtPkNyZWF0ZVRhcmdldEhhemFyZFJlY29nbml6ZXIoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2NoZWR1bGVEQUdSUkxpc3QuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NjaGVkdWxlREFHUlJMaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTVjNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NjaGVkdWxlREFHUlJMaXN0LmNwcApAQCAtMCwwICsxLDE5OTMgQEAKKy8vPT09LS0tLS0gU2NoZWR1bGVEQUdSUkxpc3QuY3BwIC0gUmVnIHByZXNzdXJlIHJlZHVjdGlvbiBsaXN0IHNjaGVkdWxlciAtLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIGJvdHRvbS11cCBhbmQgdG9wLWRvd24gcmVnaXN0ZXIgcHJlc3N1cmUgcmVkdWN0aW9uIGxpc3QKKy8vIHNjaGVkdWxlcnMsIHVzaW5nIHN0YW5kYXJkIGFsZ29yaXRobXMuICBUaGUgYmFzaWMgYXBwcm9hY2ggdXNlcyBhIHByaW9yaXR5CisvLyBxdWV1ZSBvZiBhdmFpbGFibGUgbm9kZXMgdG8gc2NoZWR1bGUuICBPbmUgYXQgYSB0aW1lLCBub2RlcyBhcmUgdGFrZW4gZnJvbQorLy8gdGhlIHByaW9yaXR5IHF1ZXVlICh0aHVzIGluIHByaW9yaXR5IG9yZGVyKSwgY2hlY2tlZCBmb3IgbGVnYWxpdHkgdG8KKy8vIHNjaGVkdWxlLCBhbmQgZW1pdHRlZCBpZiBsZWdhbC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInByZS1SQS1zY2hlZCIKKyNpbmNsdWRlICJTY2hlZHVsZURBR1NETm9kZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lubGluZUFzbS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZXJSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjbGltaXRzPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1CYWNrdHJhY2tzLCAiTnVtYmVyIG9mIHRpbWVzIHNjaGVkdWxlciBiYWNrdHJhY2tlZCIpOworU1RBVElTVElDKE51bVVuZm9sZHMsICAgICJOdW1iZXIgb2Ygbm9kZXMgdW5mb2xkZWQiKTsKK1NUQVRJU1RJQyhOdW1EdXBzLCAgICAgICAiTnVtYmVyIG9mIGR1cGxpY2F0ZWQgbm9kZXMiKTsKK1NUQVRJU1RJQyhOdW1QUkNvcGllcywgICAiTnVtYmVyIG9mIHBoeXNpY2FsIHJlZ2lzdGVyIGNvcGllcyIpOworCitzdGF0aWMgUmVnaXN0ZXJTY2hlZHVsZXIKKyAgYnVyckxpc3REQUdTY2hlZHVsZXIoImxpc3QtYnVyciIsCisgICAgICAgICAgICAgICAgICAgICAgICJCb3R0b20tdXAgcmVnaXN0ZXIgcmVkdWN0aW9uIGxpc3Qgc2NoZWR1bGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUJVUlJMaXN0REFHU2NoZWR1bGVyKTsKK3N0YXRpYyBSZWdpc3RlclNjaGVkdWxlcgorICB0ZHJMaXN0ckRBR1NjaGVkdWxlcigibGlzdC10ZHJyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlRvcC1kb3duIHJlZ2lzdGVyIHJlZHVjdGlvbiBsaXN0IHNjaGVkdWxpbmciLAorICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVURFJSTGlzdERBR1NjaGVkdWxlcik7CitzdGF0aWMgUmVnaXN0ZXJTY2hlZHVsZXIKKyAgc291cmNlTGlzdERBR1NjaGVkdWxlcigic291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiU2ltaWxhciB0byBsaXN0LWJ1cnIgYnV0IHNjaGVkdWxlcyBpbiBzb3VyY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlciB3aGVuIHBvc3NpYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTb3VyY2VMaXN0REFHU2NoZWR1bGVyKTsKKworc3RhdGljIFJlZ2lzdGVyU2NoZWR1bGVyCisgIGh5YnJpZExpc3REQUdTY2hlZHVsZXIoImxpc3QtaHlicmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQm90dG9tLXVwIHJlZ2lzdGVyIHByZXNzdXJlIGF3YXJlIGxpc3Qgc2NoZWR1bGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIHRyaWVzIHRvIGJhbGFuY2UgbGF0ZW5jeSBhbmQgcmVnaXN0ZXIgcHJlc3N1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUh5YnJpZExpc3REQUdTY2hlZHVsZXIpOworCitzdGF0aWMgUmVnaXN0ZXJTY2hlZHVsZXIKKyAgSUxQTGlzdERBR1NjaGVkdWxlcigibGlzdC1pbHAiLAorICAgICAgICAgICAgICAgICAgICAgICJCb3R0b20tdXAgcmVnaXN0ZXIgcHJlc3N1cmUgYXdhcmUgbGlzdCBzY2hlZHVsaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggdHJpZXMgdG8gYmFsYW5jZSBJTFAgYW5kIHJlZ2lzdGVyIHByZXNzdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJTFBMaXN0REFHU2NoZWR1bGVyKTsKKworbmFtZXNwYWNlIHsKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gU2NoZWR1bGVEQUdSUkxpc3QgLSBUaGUgYWN0dWFsIHJlZ2lzdGVyIHJlZHVjdGlvbiBsaXN0IHNjaGVkdWxlcgorLy8vIGltcGxlbWVudGF0aW9uLiAgVGhpcyBzdXBwb3J0cyBib3RoIHRvcC1kb3duIGFuZCBib3R0b20tdXAgc2NoZWR1bGluZy4KKy8vLworY2xhc3MgU2NoZWR1bGVEQUdSUkxpc3QgOiBwdWJsaWMgU2NoZWR1bGVEQUdTRE5vZGVzIHsKK3ByaXZhdGU6CisgIC8vLyBpc0JvdHRvbVVwIC0gVGhpcyBpcyB0cnVlIGlmIHRoZSBzY2hlZHVsaW5nIHByb2JsZW0gaXMgYm90dG9tLXVwLCBmYWxzZSBpZgorICAvLy8gaXQgaXMgdG9wLWRvd24uCisgIGJvb2wgaXNCb3R0b21VcDsKKworICAvLy8gTmVlZExhdGVuY3kgLSBUcnVlIGlmIHRoZSBzY2hlZHVsZXIgd2lsbCBtYWtlIHVzZSBvZiBsYXRlbmN5IGluZm9ybWF0aW9uLgorICAvLy8KKyAgYm9vbCBOZWVkTGF0ZW5jeTsKKworICAvLy8gQXZhaWxhYmxlUXVldWUgLSBUaGUgcHJpb3JpdHkgcXVldWUgdG8gdXNlIGZvciB0aGUgYXZhaWxhYmxlIFNVbml0cy4KKyAgU2NoZWR1bGluZ1ByaW9yaXR5UXVldWUgKkF2YWlsYWJsZVF1ZXVlOworCisgIC8vLyBMaXZlUmVnRGVmcyAtIEEgc2V0IG9mIHBoeXNpY2FsIHJlZ2lzdGVycyBhbmQgdGhlaXIgZGVmaW5pdGlvbgorICAvLy8gdGhhdCBhcmUgImxpdmUiLiBUaGVzZSBub2RlcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgYW55IG90aGVyIG5vZGVzIHRoYXQKKyAgLy8vIG1vZGlmaWVzIHRoZSByZWdpc3RlcnMgY2FuIGJlIHNjaGVkdWxlZC4KKyAgdW5zaWduZWQgTnVtTGl2ZVJlZ3M7CisgIHN0ZDo6dmVjdG9yPFNVbml0Kj4gTGl2ZVJlZ0RlZnM7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBMaXZlUmVnQ3ljbGVzOworCisgIC8vLyBUb3BvIC0gQSB0b3BvbG9naWNhbCBvcmRlcmluZyBmb3IgU1VuaXRzIHdoaWNoIHBlcm1pdHMgZmFzdCBJc1JlYWNoYWJsZQorICAvLy8gYW5kIHNpbWlsYXIgcXVlcmllcy4KKyAgU2NoZWR1bGVEQUdUb3BvbG9naWNhbFNvcnQgVG9wbzsKKworcHVibGljOgorICBTY2hlZHVsZURBR1JSTGlzdChNYWNoaW5lRnVuY3Rpb24gJm1mLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzYm90dG9tdXAsIGJvb2wgbmVlZGxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxpbmdQcmlvcml0eVF1ZXVlICphdmFpbHF1ZXVlKQorICAgIDogU2NoZWR1bGVEQUdTRE5vZGVzKG1mKSwgaXNCb3R0b21VcChpc2JvdHRvbXVwKSwgTmVlZExhdGVuY3kobmVlZGxhdGVuY3kpLAorICAgICAgQXZhaWxhYmxlUXVldWUoYXZhaWxxdWV1ZSksIFRvcG8oU1VuaXRzKSB7CisgICAgfQorCisgIH5TY2hlZHVsZURBR1JSTGlzdCgpIHsKKyAgICBkZWxldGUgQXZhaWxhYmxlUXVldWU7CisgIH0KKworICB2b2lkIFNjaGVkdWxlKCk7CisKKyAgLy8vIElzUmVhY2hhYmxlIC0gQ2hlY2tzIGlmIFNVIGlzIHJlYWNoYWJsZSBmcm9tIFRhcmdldFNVLgorICBib29sIElzUmVhY2hhYmxlKGNvbnN0IFNVbml0ICpTVSwgY29uc3QgU1VuaXQgKlRhcmdldFNVKSB7CisgICAgcmV0dXJuIFRvcG8uSXNSZWFjaGFibGUoU1UsIFRhcmdldFNVKTsKKyAgfQorCisgIC8vLyBXaWxsQ3JlYXRlQ3ljbGUgLSBSZXR1cm5zIHRydWUgaWYgYWRkaW5nIGFuIGVkZ2UgZnJvbSBTVSB0byBUYXJnZXRTVSB3aWxsCisgIC8vLyBjcmVhdGUgYSBjeWNsZS4KKyAgYm9vbCBXaWxsQ3JlYXRlQ3ljbGUoU1VuaXQgKlNVLCBTVW5pdCAqVGFyZ2V0U1UpIHsKKyAgICByZXR1cm4gVG9wby5XaWxsQ3JlYXRlQ3ljbGUoU1UsIFRhcmdldFNVKTsKKyAgfQorCisgIC8vLyBBZGRQcmVkIC0gYWRkcyBhIHByZWRlY2Vzc29yIGVkZ2UgdG8gU1VuaXQgU1UuCisgIC8vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgbmV3IHByZWRlY2Vzc29yLgorICAvLy8gVXBkYXRlcyB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcgaWYgcmVxdWlyZWQuCisgIHZvaWQgQWRkUHJlZChTVW5pdCAqU1UsIGNvbnN0IFNEZXAgJkQpIHsKKyAgICBUb3BvLkFkZFByZWQoU1UsIEQuZ2V0U1VuaXQoKSk7CisgICAgU1UtPmFkZFByZWQoRCk7CisgIH0KKworICAvLy8gUmVtb3ZlUHJlZCAtIHJlbW92ZXMgYSBwcmVkZWNlc3NvciBlZGdlIGZyb20gU1VuaXQgU1UuCisgIC8vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiBhbiBlZGdlIHdhcyByZW1vdmVkLgorICAvLy8gVXBkYXRlcyB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcgaWYgcmVxdWlyZWQuCisgIHZvaWQgUmVtb3ZlUHJlZChTVW5pdCAqU1UsIGNvbnN0IFNEZXAgJkQpIHsKKyAgICBUb3BvLlJlbW92ZVByZWQoU1UsIEQuZ2V0U1VuaXQoKSk7CisgICAgU1UtPnJlbW92ZVByZWQoRCk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBSZWxlYXNlUHJlZChTVW5pdCAqU1UsIGNvbnN0IFNEZXAgKlByZWRFZGdlKTsKKyAgdm9pZCBSZWxlYXNlUHJlZGVjZXNzb3JzKFNVbml0ICpTVSwgdW5zaWduZWQgQ3VyQ3ljbGUpOworICB2b2lkIFJlbGVhc2VTdWNjKFNVbml0ICpTVSwgY29uc3QgU0RlcCAqU3VjY0VkZ2UpOworICB2b2lkIFJlbGVhc2VTdWNjZXNzb3JzKFNVbml0ICpTVSk7CisgIHZvaWQgQ2FwdHVyZVByZWQoU0RlcCAqUHJlZEVkZ2UpOworICB2b2lkIFNjaGVkdWxlTm9kZUJvdHRvbVVwKFNVbml0KiwgdW5zaWduZWQpOworICB2b2lkIFNjaGVkdWxlTm9kZVRvcERvd24oU1VuaXQqLCB1bnNpZ25lZCk7CisgIHZvaWQgVW5zY2hlZHVsZU5vZGVCb3R0b21VcChTVW5pdCopOworICB2b2lkIEJhY2t0cmFja0JvdHRvbVVwKFNVbml0KiwgdW5zaWduZWQsIHVuc2lnbmVkJik7CisgIFNVbml0ICpDb3B5QW5kTW92ZVN1Y2Nlc3NvcnMoU1VuaXQqKTsKKyAgdm9pZCBJbnNlcnRDb3BpZXNBbmRNb3ZlU3VjY3MoU1VuaXQqLCB1bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxTVW5pdCosIDI+Jik7CisgIGJvb2wgRGVsYXlGb3JMaXZlUmVnc0JvdHRvbVVwKFNVbml0KiwgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+Jik7CisgIHZvaWQgTGlzdFNjaGVkdWxlVG9wRG93bigpOworICB2b2lkIExpc3RTY2hlZHVsZUJvdHRvbVVwKCk7CisKKworICAvLy8gQ3JlYXRlTmV3U1VuaXQgLSBDcmVhdGVzIGEgbmV3IFNVbml0IGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBpdC4KKyAgLy8vIFVwZGF0ZXMgdGhlIHRvcG9sb2dpY2FsIG9yZGVyaW5nIGlmIHJlcXVpcmVkLgorICBTVW5pdCAqQ3JlYXRlTmV3U1VuaXQoU0ROb2RlICpOKSB7CisgICAgdW5zaWduZWQgTnVtU1VuaXRzID0gU1VuaXRzLnNpemUoKTsKKyAgICBTVW5pdCAqTmV3Tm9kZSA9IE5ld1NVbml0KE4pOworICAgIC8vIFVwZGF0ZSB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcuCisgICAgaWYgKE5ld05vZGUtPk5vZGVOdW0gPj0gTnVtU1VuaXRzKQorICAgICAgVG9wby5Jbml0REFHVG9wb2xvZ2ljYWxTb3J0aW5nKCk7CisgICAgcmV0dXJuIE5ld05vZGU7CisgIH0KKworICAvLy8gQ3JlYXRlQ2xvbmUgLSBDcmVhdGVzIGEgbmV3IFNVbml0IGZyb20gYW4gZXhpc3Rpbmcgb25lLgorICAvLy8gVXBkYXRlcyB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcgaWYgcmVxdWlyZWQuCisgIFNVbml0ICpDcmVhdGVDbG9uZShTVW5pdCAqTikgeworICAgIHVuc2lnbmVkIE51bVNVbml0cyA9IFNVbml0cy5zaXplKCk7CisgICAgU1VuaXQgKk5ld05vZGUgPSBDbG9uZShOKTsKKyAgICAvLyBVcGRhdGUgdGhlIHRvcG9sb2dpY2FsIG9yZGVyaW5nLgorICAgIGlmIChOZXdOb2RlLT5Ob2RlTnVtID49IE51bVNVbml0cykKKyAgICAgIFRvcG8uSW5pdERBR1RvcG9sb2dpY2FsU29ydGluZygpOworICAgIHJldHVybiBOZXdOb2RlOworICB9CisKKyAgLy8vIEZvcmNlVW5pdExhdGVuY2llcyAtIFJlZ2lzdGVyLXByZXNzdXJlLXJlZHVjaW5nIHNjaGVkdWxpbmcgZG9lc24ndAorICAvLy8gbmVlZCBhY3R1YWwgbGF0ZW5jeSBpbmZvcm1hdGlvbiBidXQgdGhlIGh5YnJpZCBzY2hlZHVsZXIgZG9lcy4KKyAgYm9vbCBGb3JjZVVuaXRMYXRlbmNpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuICFOZWVkTGF0ZW5jeTsKKyAgfQorfTsKK30gIC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKworLy8vIFNjaGVkdWxlIC0gU2NoZWR1bGUgdGhlIERBRyB1c2luZyBsaXN0IHNjaGVkdWxpbmcuCit2b2lkIFNjaGVkdWxlREFHUlJMaXN0OjpTY2hlZHVsZSgpIHsKKyAgREVCVUcoZGJncygpCisgICAgICAgIDw8ICIqKioqKioqKioqIExpc3QgU2NoZWR1bGluZyBCQiMiIDw8IEJCLT5nZXROdW1iZXIoKQorICAgICAgICA8PCAiICoqKioqKioqKipcbiIpOworCisgIE51bUxpdmVSZWdzID0gMDsKKyAgTGl2ZVJlZ0RlZnMucmVzaXplKFRSSS0+Z2V0TnVtUmVncygpLCBOVUxMKTsgIAorICBMaXZlUmVnQ3ljbGVzLnJlc2l6ZShUUkktPmdldE51bVJlZ3MoKSwgMCk7CisKKyAgLy8gQnVpbGQgdGhlIHNjaGVkdWxpbmcgZ3JhcGguCisgIEJ1aWxkU2NoZWRHcmFwaChOVUxMKTsKKworICBERUJVRyhmb3IgKHVuc2lnbmVkIHN1ID0gMCwgZSA9IFNVbml0cy5zaXplKCk7IHN1ICE9IGU7ICsrc3UpCisgICAgICAgICAgU1VuaXRzW3N1XS5kdW1wQWxsKHRoaXMpKTsKKyAgVG9wby5Jbml0REFHVG9wb2xvZ2ljYWxTb3J0aW5nKCk7CisKKyAgQXZhaWxhYmxlUXVldWUtPmluaXROb2RlcyhTVW5pdHMpOworICAKKyAgLy8gRXhlY3V0ZSB0aGUgYWN0dWFsIHNjaGVkdWxpbmcgbG9vcCBUb3AtRG93biBvciBCb3R0b20tVXAgYXMgYXBwcm9wcmlhdGUuCisgIGlmIChpc0JvdHRvbVVwKQorICAgIExpc3RTY2hlZHVsZUJvdHRvbVVwKCk7CisgIGVsc2UKKyAgICBMaXN0U2NoZWR1bGVUb3BEb3duKCk7CisgIAorICBBdmFpbGFibGVRdWV1ZS0+cmVsZWFzZVN0YXRlKCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgQm90dG9tLVVwIFNjaGVkdWxpbmcKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBSZWxlYXNlUHJlZCAtIERlY3JlbWVudCB0aGUgTnVtU3VjY3NMZWZ0IGNvdW50IG9mIGEgcHJlZGVjZXNzb3IuIEFkZCBpdCB0bworLy8vIHRoZSBBdmFpbGFibGVRdWV1ZSBpZiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLiBBbHNvIHVwZGF0ZSBpdHMgY3ljbGUgYm91bmQuCit2b2lkIFNjaGVkdWxlREFHUlJMaXN0OjpSZWxlYXNlUHJlZChTVW5pdCAqU1UsIGNvbnN0IFNEZXAgKlByZWRFZGdlKSB7CisgIFNVbml0ICpQcmVkU1UgPSBQcmVkRWRnZS0+Z2V0U1VuaXQoKTsKKworI2lmbmRlZiBOREVCVUcKKyAgaWYgKFByZWRTVS0+TnVtU3VjY3NMZWZ0ID09IDApIHsKKyAgICBkYmdzKCkgPDwgIioqKiBTY2hlZHVsaW5nIGZhaWxlZCEgKioqXG4iOworICAgIFByZWRTVS0+ZHVtcCh0aGlzKTsKKyAgICBkYmdzKCkgPDwgIiBoYXMgYmVlbiByZWxlYXNlZCB0b28gbWFueSB0aW1lcyFcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorI2VuZGlmCisgIC0tUHJlZFNVLT5OdW1TdWNjc0xlZnQ7CisKKyAgaWYgKCFGb3JjZVVuaXRMYXRlbmNpZXMoKSkgeworICAgIC8vIFVwZGF0aW5nIHByZWRlY2Vzc29yJ3MgaGVpZ2h0LiBUaGlzIGlzIG5vdyB0aGUgY3ljbGUgd2hlbiB0aGUKKyAgICAvLyBwcmVkZWNlc3NvciBjYW4gYmUgc2NoZWR1bGVkIHdpdGhvdXQgY2F1c2luZyBhIHBpcGVsaW5lIHN0YWxsLgorICAgIFByZWRTVS0+c2V0SGVpZ2h0VG9BdExlYXN0KFNVLT5nZXRIZWlnaHQoKSArIFByZWRFZGdlLT5nZXRMYXRlbmN5KCkpOworICB9CisKKyAgLy8gSWYgYWxsIHRoZSBub2RlJ3Mgc3VjY2Vzc29ycyBhcmUgc2NoZWR1bGVkLCB0aGlzIG5vZGUgaXMgcmVhZHkKKyAgLy8gdG8gYmUgc2NoZWR1bGVkLiBJZ25vcmUgdGhlIHNwZWNpYWwgRW50cnlTVSBub2RlLgorICBpZiAoUHJlZFNVLT5OdW1TdWNjc0xlZnQgPT0gMCAmJiBQcmVkU1UgIT0gJkVudHJ5U1UpIHsKKyAgICBQcmVkU1UtPmlzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICBBdmFpbGFibGVRdWV1ZS0+cHVzaChQcmVkU1UpOworICB9Cit9CisKK3ZvaWQgU2NoZWR1bGVEQUdSUkxpc3Q6OlJlbGVhc2VQcmVkZWNlc3NvcnMoU1VuaXQgKlNVLCB1bnNpZ25lZCBDdXJDeWNsZSkgeworICAvLyBCb3R0b20gdXA6IHJlbGVhc2UgcHJlZGVjZXNzb3JzCisgIGZvciAoU1VuaXQ6OnByZWRfaXRlcmF0b3IgSSA9IFNVLT5QcmVkcy5iZWdpbigpLCBFID0gU1UtPlByZWRzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgUmVsZWFzZVByZWQoU1UsICYqSSk7CisgICAgaWYgKEktPmlzQXNzaWduZWRSZWdEZXAoKSkgeworICAgICAgLy8gVGhpcyBpcyBhIHBoeXNpY2FsIHJlZ2lzdGVyIGRlcGVuZGVuY3kgYW5kIGl0J3MgaW1wb3NzaWJsZSBvcgorICAgICAgLy8gZXhwZW5zaXZlIHRvIGNvcHkgdGhlIHJlZ2lzdGVyLiBNYWtlIHN1cmUgbm90aGluZyB0aGF0IGNhbiAKKyAgICAgIC8vIGNsb2JiZXIgdGhlIHJlZ2lzdGVyIGlzIHNjaGVkdWxlZCBiZXR3ZWVuIHRoZSBwcmVkZWNlc3NvciBhbmQKKyAgICAgIC8vIHRoaXMgbm9kZS4KKyAgICAgIGlmICghTGl2ZVJlZ0RlZnNbSS0+Z2V0UmVnKCldKSB7CisgICAgICAgICsrTnVtTGl2ZVJlZ3M7CisgICAgICAgIExpdmVSZWdEZWZzW0ktPmdldFJlZygpXSA9IEktPmdldFNVbml0KCk7CisgICAgICAgIExpdmVSZWdDeWNsZXNbSS0+Z2V0UmVnKCldID0gQ3VyQ3ljbGU7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLyBTY2hlZHVsZU5vZGVCb3R0b21VcCAtIEFkZCB0aGUgbm9kZSB0byB0aGUgc2NoZWR1bGUuIERlY3JlbWVudCB0aGUgcGVuZGluZworLy8vIGNvdW50IG9mIGl0cyBwcmVkZWNlc3NvcnMuIElmIGEgcHJlZGVjZXNzb3IgcGVuZGluZyBjb3VudCBpcyB6ZXJvLCBhZGQgaXQgdG8KKy8vLyB0aGUgQXZhaWxhYmxlIHF1ZXVlLgordm9pZCBTY2hlZHVsZURBR1JSTGlzdDo6U2NoZWR1bGVOb2RlQm90dG9tVXAoU1VuaXQgKlNVLCB1bnNpZ25lZCBDdXJDeWNsZSkgeworICBERUJVRyhkYmdzKCkgPDwgIlxuKioqIFNjaGVkdWxpbmcgWyIgPDwgQ3VyQ3ljbGUgPDwgIl06ICIpOworICBERUJVRyhTVS0+ZHVtcCh0aGlzKSk7CisKKyNpZm5kZWYgTkRFQlVHCisgIGlmIChDdXJDeWNsZSA8IFNVLT5nZXRIZWlnaHQoKSkKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgIEhlaWdodCBbIiA8PCBTVS0+Z2V0SGVpZ2h0KCkgPDwgIl0gcGlwZWxpbmUgc3RhbGwhXG4iKTsKKyNlbmRpZgorCisgIC8vIEZJWE1FOiBIYW5kbGUgbm9vcCBoYXphcmQuCisgIFNVLT5zZXRIZWlnaHRUb0F0TGVhc3QoQ3VyQ3ljbGUpOworICBTZXF1ZW5jZS5wdXNoX2JhY2soU1UpOworCisgIEF2YWlsYWJsZVF1ZXVlLT5TY2hlZHVsZWROb2RlKFNVKTsKKworICBSZWxlYXNlUHJlZGVjZXNzb3JzKFNVLCBDdXJDeWNsZSk7CisKKyAgLy8gUmVsZWFzZSBhbGwgdGhlIGltcGxpY2l0IHBoeXNpY2FsIHJlZ2lzdGVyIGRlZnMgdGhhdCBhcmUgbGl2ZS4KKyAgZm9yIChTVW5pdDo6c3VjY19pdGVyYXRvciBJID0gU1UtPlN1Y2NzLmJlZ2luKCksIEUgPSBTVS0+U3VjY3MuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aXNBc3NpZ25lZFJlZ0RlcCgpKSB7CisgICAgICBpZiAoTGl2ZVJlZ0N5Y2xlc1tJLT5nZXRSZWcoKV0gPT0gSS0+Z2V0U1VuaXQoKS0+Z2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgYXNzZXJ0KE51bUxpdmVSZWdzID4gMCAmJiAiTnVtTGl2ZVJlZ3MgaXMgYWxyZWFkeSB6ZXJvISIpOworICAgICAgICBhc3NlcnQoTGl2ZVJlZ0RlZnNbSS0+Z2V0UmVnKCldID09IFNVICYmCisgICAgICAgICAgICAgICAiUGh5c2ljYWwgcmVnaXN0ZXIgZGVwZW5kZW5jeSB2aW9sYXRlZD8iKTsKKyAgICAgICAgLS1OdW1MaXZlUmVnczsKKyAgICAgICAgTGl2ZVJlZ0RlZnNbSS0+Z2V0UmVnKCldID0gTlVMTDsKKyAgICAgICAgTGl2ZVJlZ0N5Y2xlc1tJLT5nZXRSZWcoKV0gPSAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFNVLT5pc1NjaGVkdWxlZCA9IHRydWU7Cit9CisKKy8vLyBDYXB0dXJlUHJlZCAtIFRoaXMgZG9lcyB0aGUgb3Bwb3NpdGUgb2YgUmVsZWFzZVByZWQuIFNpbmNlIFNVIGlzIGJlaW5nCisvLy8gdW5zY2hlZHVsZWQsIGluY3JjZWFzZSB0aGUgc3VjYyBsZWZ0IGNvdW50IG9mIGl0cyBwcmVkZWNlc3NvcnMuIFJlbW92ZQorLy8vIHRoZW0gZnJvbSBBdmFpbGFibGVRdWV1ZSBpZiBuZWNlc3NhcnkuCit2b2lkIFNjaGVkdWxlREFHUlJMaXN0OjpDYXB0dXJlUHJlZChTRGVwICpQcmVkRWRnZSkgeyAgCisgIFNVbml0ICpQcmVkU1UgPSBQcmVkRWRnZS0+Z2V0U1VuaXQoKTsKKyAgaWYgKFByZWRTVS0+aXNBdmFpbGFibGUpIHsKKyAgICBQcmVkU1UtPmlzQXZhaWxhYmxlID0gZmFsc2U7CisgICAgaWYgKCFQcmVkU1UtPmlzUGVuZGluZykKKyAgICAgIEF2YWlsYWJsZVF1ZXVlLT5yZW1vdmUoUHJlZFNVKTsKKyAgfQorCisgIGFzc2VydChQcmVkU1UtPk51bVN1Y2NzTGVmdCA8IFVJTlRfTUFYICYmICJOdW1TdWNjc0xlZnQgd2lsbCBvdmVyZmxvdyEiKTsKKyAgKytQcmVkU1UtPk51bVN1Y2NzTGVmdDsKK30KKworLy8vIFVuc2NoZWR1bGVOb2RlQm90dG9tVXAgLSBSZW1vdmUgdGhlIG5vZGUgZnJvbSB0aGUgc2NoZWR1bGUsIHVwZGF0ZSBpdHMgYW5kCisvLy8gaXRzIHByZWRlY2Vzc29yIHN0YXRlcyB0byByZWZsZWN0IHRoZSBjaGFuZ2UuCit2b2lkIFNjaGVkdWxlREFHUlJMaXN0OjpVbnNjaGVkdWxlTm9kZUJvdHRvbVVwKFNVbml0ICpTVSkgeworICBERUJVRyhkYmdzKCkgPDwgIioqKiBVbnNjaGVkdWxpbmcgWyIgPDwgU1UtPmdldEhlaWdodCgpIDw8ICJdOiAiKTsKKyAgREVCVUcoU1UtPmR1bXAodGhpcykpOworCisgIGZvciAoU1VuaXQ6OnByZWRfaXRlcmF0b3IgSSA9IFNVLT5QcmVkcy5iZWdpbigpLCBFID0gU1UtPlByZWRzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgQ2FwdHVyZVByZWQoJipJKTsKKyAgICBpZiAoSS0+aXNBc3NpZ25lZFJlZ0RlcCgpICYmIFNVLT5nZXRIZWlnaHQoKSA9PSBMaXZlUmVnQ3ljbGVzW0ktPmdldFJlZygpXSl7CisgICAgICBhc3NlcnQoTnVtTGl2ZVJlZ3MgPiAwICYmICJOdW1MaXZlUmVncyBpcyBhbHJlYWR5IHplcm8hIik7CisgICAgICBhc3NlcnQoTGl2ZVJlZ0RlZnNbSS0+Z2V0UmVnKCldID09IEktPmdldFNVbml0KCkgJiYKKyAgICAgICAgICAgICAiUGh5c2ljYWwgcmVnaXN0ZXIgZGVwZW5kZW5jeSB2aW9sYXRlZD8iKTsKKyAgICAgIC0tTnVtTGl2ZVJlZ3M7CisgICAgICBMaXZlUmVnRGVmc1tJLT5nZXRSZWcoKV0gPSBOVUxMOworICAgICAgTGl2ZVJlZ0N5Y2xlc1tJLT5nZXRSZWcoKV0gPSAwOworICAgIH0KKyAgfQorCisgIGZvciAoU1VuaXQ6OnN1Y2NfaXRlcmF0b3IgSSA9IFNVLT5TdWNjcy5iZWdpbigpLCBFID0gU1UtPlN1Y2NzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPmlzQXNzaWduZWRSZWdEZXAoKSkgeworICAgICAgaWYgKCFMaXZlUmVnRGVmc1tJLT5nZXRSZWcoKV0pIHsKKyAgICAgICAgTGl2ZVJlZ0RlZnNbSS0+Z2V0UmVnKCldID0gU1U7CisgICAgICAgICsrTnVtTGl2ZVJlZ3M7CisgICAgICB9CisgICAgICBpZiAoSS0+Z2V0U1VuaXQoKS0+Z2V0SGVpZ2h0KCkgPCBMaXZlUmVnQ3ljbGVzW0ktPmdldFJlZygpXSkKKyAgICAgICAgTGl2ZVJlZ0N5Y2xlc1tJLT5nZXRSZWcoKV0gPSBJLT5nZXRTVW5pdCgpLT5nZXRIZWlnaHQoKTsKKyAgICB9CisgIH0KKworICBTVS0+c2V0SGVpZ2h0RGlydHkoKTsKKyAgU1UtPmlzU2NoZWR1bGVkID0gZmFsc2U7CisgIFNVLT5pc0F2YWlsYWJsZSA9IHRydWU7CisgIEF2YWlsYWJsZVF1ZXVlLT5wdXNoKFNVKTsKKyAgQXZhaWxhYmxlUXVldWUtPlVuc2NoZWR1bGVkTm9kZShTVSk7Cit9CisKKy8vLyBCYWNrdHJhY2tCb3R0b21VcCAtIEJhY2t0cmFjayBzY2hlZHVsaW5nIHRvIGEgcHJldmlvdXMgY3ljbGUgc3BlY2lmaWVkIGluCisvLy8gQlRDeWNsZSBpbiBvcmRlciB0byBzY2hlZHVsZSBhIHNwZWNpZmljIG5vZGUuCit2b2lkIFNjaGVkdWxlREFHUlJMaXN0OjpCYWNrdHJhY2tCb3R0b21VcChTVW5pdCAqU1UsIHVuc2lnbmVkIEJ0Q3ljbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmQ3VyQ3ljbGUpIHsKKyAgU1VuaXQgKk9sZFNVID0gTlVMTDsKKyAgd2hpbGUgKEN1ckN5Y2xlID4gQnRDeWNsZSkgeworICAgIE9sZFNVID0gU2VxdWVuY2UuYmFjaygpOworICAgIFNlcXVlbmNlLnBvcF9iYWNrKCk7CisgICAgaWYgKFNVLT5pc1N1Y2MoT2xkU1UpKQorICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlbW92ZSBTVSBmcm9tIEF2YWlsYWJsZVF1ZXVlLgorICAgICAgU1UtPmlzQXZhaWxhYmxlID0gZmFsc2U7CisgICAgVW5zY2hlZHVsZU5vZGVCb3R0b21VcChPbGRTVSk7CisgICAgLS1DdXJDeWNsZTsKKyAgICBBdmFpbGFibGVRdWV1ZS0+c2V0Q3VyQ3ljbGUoQ3VyQ3ljbGUpOworICB9CisKKyAgYXNzZXJ0KCFTVS0+aXNTdWNjKE9sZFNVKSAmJiAiU29tZXRoaW5nIGlzIHdyb25nISIpOworCisgICsrTnVtQmFja3RyYWNrczsKK30KKworc3RhdGljIGJvb2wgaXNPcGVyYW5kT2YoY29uc3QgU1VuaXQgKlNVLCBTRE5vZGUgKk4pIHsKKyAgZm9yIChjb25zdCBTRE5vZGUgKlNVTm9kZSA9IFNVLT5nZXROb2RlKCk7IFNVTm9kZTsKKyAgICAgICBTVU5vZGUgPSBTVU5vZGUtPmdldEZsYWdnZWROb2RlKCkpIHsKKyAgICBpZiAoU1VOb2RlLT5pc09wZXJhbmRPZihOKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIENvcHlBbmRNb3ZlU3VjY2Vzc29ycyAtIENsb25lIHRoZSBzcGVjaWZpZWQgbm9kZSBhbmQgbW92ZSBpdHMgc2NoZWR1bGVkCisvLy8gc3VjY2Vzc29ycyB0byB0aGUgbmV3bHkgY3JlYXRlZCBub2RlLgorU1VuaXQgKlNjaGVkdWxlREFHUlJMaXN0OjpDb3B5QW5kTW92ZVN1Y2Nlc3NvcnMoU1VuaXQgKlNVKSB7CisgIGlmIChTVS0+Z2V0Tm9kZSgpLT5nZXRGbGFnZ2VkTm9kZSgpKQorICAgIHJldHVybiBOVUxMOworCisgIFNETm9kZSAqTiA9IFNVLT5nZXROb2RlKCk7CisgIGlmICghTikKKyAgICByZXR1cm4gTlVMTDsKKworICBTVW5pdCAqTmV3U1U7CisgIGJvb2wgVHJ5VW5mb2xkID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1WYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoaSk7CisgICAgaWYgKFZUID09IE1WVDo6RmxhZykKKyAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFZUID09IE1WVDo6T3RoZXIpCisgICAgICBUcnlVbmZvbGQgPSB0cnVlOworICB9CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IFNEVmFsdWUgJk9wID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgICBFVlQgVlQgPSBPcC5nZXROb2RlKCktPmdldFZhbHVlVHlwZShPcC5nZXRSZXNObygpKTsKKyAgICBpZiAoVlQgPT0gTVZUOjpGbGFnKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoVHJ5VW5mb2xkKSB7CisgICAgU21hbGxWZWN0b3I8U0ROb2RlKiwgMj4gTmV3Tm9kZXM7CisgICAgaWYgKCFUSUktPnVuZm9sZE1lbW9yeU9wZXJhbmQoKkRBRywgTiwgTmV3Tm9kZXMpKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlVuZm9sZGluZyBTVSAjIiA8PCBTVS0+Tm9kZU51bSA8PCAiXG4iKTsKKyAgICBhc3NlcnQoTmV3Tm9kZXMuc2l6ZSgpID09IDIgJiYgIkV4cGVjdGVkIGEgbG9hZCBmb2xkaW5nIG5vZGUhIik7CisKKyAgICBOID0gTmV3Tm9kZXNbMV07CisgICAgU0ROb2RlICpMb2FkTm9kZSA9IE5ld05vZGVzWzBdOworICAgIHVuc2lnbmVkIE51bVZhbHMgPSBOLT5nZXROdW1WYWx1ZXMoKTsKKyAgICB1bnNpZ25lZCBPbGROdW1WYWxzID0gU1UtPmdldE5vZGUoKS0+Z2V0TnVtVmFsdWVzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1WYWxzOyArK2kpCisgICAgICBEQUctPlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShTVS0+Z2V0Tm9kZSgpLCBpKSwgU0RWYWx1ZShOLCBpKSk7CisgICAgREFHLT5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoU1UtPmdldE5vZGUoKSwgT2xkTnVtVmFscy0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShMb2FkTm9kZSwgMSkpOworCisgICAgLy8gTG9hZE5vZGUgbWF5IGFscmVhZHkgZXhpc3QuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZXJlIGlzIGFub3RoZXIKKyAgICAvLyBsb2FkIGZyb20gdGhlIHNhbWUgbG9jYXRpb24gYW5kIHByb2R1Y2luZyB0aGUgc2FtZSB0eXBlIG9mIHZhbHVlCisgICAgLy8gYnV0IGl0IGhhcyBkaWZmZXJlbnQgYWxpZ25tZW50IG9yIHZvbGF0aWxlbmVzcy4KKyAgICBib29sIGlzTmV3TG9hZCA9IHRydWU7CisgICAgU1VuaXQgKkxvYWRTVTsKKyAgICBpZiAoTG9hZE5vZGUtPmdldE5vZGVJZCgpICE9IC0xKSB7CisgICAgICBMb2FkU1UgPSAmU1VuaXRzW0xvYWROb2RlLT5nZXROb2RlSWQoKV07CisgICAgICBpc05ld0xvYWQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgTG9hZFNVID0gQ3JlYXRlTmV3U1VuaXQoTG9hZE5vZGUpOworICAgICAgTG9hZE5vZGUtPnNldE5vZGVJZChMb2FkU1UtPk5vZGVOdW0pOworICAgICAgQ29tcHV0ZUxhdGVuY3koTG9hZFNVKTsKKyAgICB9CisKKyAgICBTVW5pdCAqTmV3U1UgPSBDcmVhdGVOZXdTVW5pdChOKTsKKyAgICBhc3NlcnQoTi0+Z2V0Tm9kZUlkKCkgPT0gLTEgJiYgIk5vZGUgYWxyZWFkeSBpbnNlcnRlZCEiKTsKKyAgICBOLT5zZXROb2RlSWQoTmV3U1UtPk5vZGVOdW0pOworICAgICAgCisgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBUSUktPmdldChOLT5nZXRNYWNoaW5lT3Bjb2RlKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gVElELmdldE51bU9wZXJhbmRzKCk7ICsraSkgeworICAgICAgaWYgKFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChpLCBUT0k6OlRJRURfVE8pICE9IC0xKSB7CisgICAgICAgIE5ld1NVLT5pc1R3b0FkZHJlc3MgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKFRJRC5pc0NvbW11dGFibGUoKSkKKyAgICAgIE5ld1NVLT5pc0NvbW11dGFibGUgPSB0cnVlOworICAgIENvbXB1dGVMYXRlbmN5KE5ld1NVKTsKKworICAgIC8vIFJlY29yZCBhbGwgdGhlIGVkZ2VzIHRvIGFuZCBmcm9tIHRoZSBvbGQgU1UsIGJ5IGNhdGVnb3J5LgorICAgIFNtYWxsVmVjdG9yPFNEZXAsIDQ+IENoYWluUHJlZHM7CisgICAgU21hbGxWZWN0b3I8U0RlcCwgND4gQ2hhaW5TdWNjczsKKyAgICBTbWFsbFZlY3RvcjxTRGVwLCA0PiBMb2FkUHJlZHM7CisgICAgU21hbGxWZWN0b3I8U0RlcCwgND4gTm9kZVByZWRzOworICAgIFNtYWxsVmVjdG9yPFNEZXAsIDQ+IE5vZGVTdWNjczsKKyAgICBmb3IgKFNVbml0OjpwcmVkX2l0ZXJhdG9yIEkgPSBTVS0+UHJlZHMuYmVnaW4oKSwgRSA9IFNVLT5QcmVkcy5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoSS0+aXNDdHJsKCkpCisgICAgICAgIENoYWluUHJlZHMucHVzaF9iYWNrKCpJKTsKKyAgICAgIGVsc2UgaWYgKGlzT3BlcmFuZE9mKEktPmdldFNVbml0KCksIExvYWROb2RlKSkKKyAgICAgICAgTG9hZFByZWRzLnB1c2hfYmFjaygqSSk7CisgICAgICBlbHNlCisgICAgICAgIE5vZGVQcmVkcy5wdXNoX2JhY2soKkkpOworICAgIH0KKyAgICBmb3IgKFNVbml0OjpzdWNjX2l0ZXJhdG9yIEkgPSBTVS0+U3VjY3MuYmVnaW4oKSwgRSA9IFNVLT5TdWNjcy5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoSS0+aXNDdHJsKCkpCisgICAgICAgIENoYWluU3VjY3MucHVzaF9iYWNrKCpJKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTm9kZVN1Y2NzLnB1c2hfYmFjaygqSSk7CisgICAgfQorCisgICAgLy8gTm93IGFzc2lnbiBlZGdlcyB0byB0aGUgbmV3bHktY3JlYXRlZCBub2Rlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ2hhaW5QcmVkcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBTRGVwICZQcmVkID0gQ2hhaW5QcmVkc1tpXTsKKyAgICAgIFJlbW92ZVByZWQoU1UsIFByZWQpOworICAgICAgaWYgKGlzTmV3TG9hZCkKKyAgICAgICAgQWRkUHJlZChMb2FkU1UsIFByZWQpOworICAgIH0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTG9hZFByZWRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IFNEZXAgJlByZWQgPSBMb2FkUHJlZHNbaV07CisgICAgICBSZW1vdmVQcmVkKFNVLCBQcmVkKTsKKyAgICAgIGlmIChpc05ld0xvYWQpCisgICAgICAgIEFkZFByZWQoTG9hZFNVLCBQcmVkKTsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vZGVQcmVkcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBTRGVwICZQcmVkID0gTm9kZVByZWRzW2ldOworICAgICAgUmVtb3ZlUHJlZChTVSwgUHJlZCk7CisgICAgICBBZGRQcmVkKE5ld1NVLCBQcmVkKTsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vZGVTdWNjcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBTRGVwIEQgPSBOb2RlU3VjY3NbaV07CisgICAgICBTVW5pdCAqU3VjY0RlcCA9IEQuZ2V0U1VuaXQoKTsKKyAgICAgIEQuc2V0U1VuaXQoU1UpOworICAgICAgUmVtb3ZlUHJlZChTdWNjRGVwLCBEKTsKKyAgICAgIEQuc2V0U1VuaXQoTmV3U1UpOworICAgICAgQWRkUHJlZChTdWNjRGVwLCBEKTsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENoYWluU3VjY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgU0RlcCBEID0gQ2hhaW5TdWNjc1tpXTsKKyAgICAgIFNVbml0ICpTdWNjRGVwID0gRC5nZXRTVW5pdCgpOworICAgICAgRC5zZXRTVW5pdChTVSk7CisgICAgICBSZW1vdmVQcmVkKFN1Y2NEZXAsIEQpOworICAgICAgaWYgKGlzTmV3TG9hZCkgeworICAgICAgICBELnNldFNVbml0KExvYWRTVSk7CisgICAgICAgIEFkZFByZWQoU3VjY0RlcCwgRCk7CisgICAgICB9CisgICAgfSAKKworICAgIC8vIEFkZCBhIGRhdGEgZGVwZW5kZW5jeSB0byByZWZsZWN0IHRoYXQgTmV3U1UgcmVhZHMgdGhlIHZhbHVlIGRlZmluZWQKKyAgICAvLyBieSBMb2FkU1UuCisgICAgQWRkUHJlZChOZXdTVSwgU0RlcChMb2FkU1UsIFNEZXA6OkRhdGEsIExvYWRTVS0+TGF0ZW5jeSkpOworCisgICAgaWYgKGlzTmV3TG9hZCkKKyAgICAgIEF2YWlsYWJsZVF1ZXVlLT5hZGROb2RlKExvYWRTVSk7CisgICAgQXZhaWxhYmxlUXVldWUtPmFkZE5vZGUoTmV3U1UpOworCisgICAgKytOdW1VbmZvbGRzOworCisgICAgaWYgKE5ld1NVLT5OdW1TdWNjc0xlZnQgPT0gMCkgeworICAgICAgTmV3U1UtPmlzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgIHJldHVybiBOZXdTVTsKKyAgICB9CisgICAgU1UgPSBOZXdTVTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiICAgIER1cGxpY2F0aW5nIFNVICMiIDw8IFNVLT5Ob2RlTnVtIDw8ICJcbiIpOworICBOZXdTVSA9IENyZWF0ZUNsb25lKFNVKTsKKworICAvLyBOZXcgU1VuaXQgaGFzIHRoZSBleGFjdCBzYW1lIHByZWRlY2Vzc29ycy4KKyAgZm9yIChTVW5pdDo6cHJlZF9pdGVyYXRvciBJID0gU1UtPlByZWRzLmJlZ2luKCksIEUgPSBTVS0+UHJlZHMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgaWYgKCFJLT5pc0FydGlmaWNpYWwoKSkKKyAgICAgIEFkZFByZWQoTmV3U1UsICpJKTsKKworICAvLyBPbmx5IGNvcHkgc2NoZWR1bGVkIHN1Y2Nlc3NvcnMuIEN1dCB0aGVtIGZyb20gb2xkIG5vZGUncyBzdWNjZXNzb3IKKyAgLy8gbGlzdCBhbmQgbW92ZSB0aGVtIG92ZXIuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxTVW5pdCAqLCBTRGVwPiwgND4gRGVsRGVwczsKKyAgZm9yIChTVW5pdDo6c3VjY19pdGVyYXRvciBJID0gU1UtPlN1Y2NzLmJlZ2luKCksIEUgPSBTVS0+U3VjY3MuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aXNBcnRpZmljaWFsKCkpCisgICAgICBjb250aW51ZTsKKyAgICBTVW5pdCAqU3VjY1NVID0gSS0+Z2V0U1VuaXQoKTsKKyAgICBpZiAoU3VjY1NVLT5pc1NjaGVkdWxlZCkgeworICAgICAgU0RlcCBEID0gKkk7CisgICAgICBELnNldFNVbml0KE5ld1NVKTsKKyAgICAgIEFkZFByZWQoU3VjY1NVLCBEKTsKKyAgICAgIEQuc2V0U1VuaXQoU1UpOworICAgICAgRGVsRGVwcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoU3VjY1NVLCBEKSk7CisgICAgfQorICB9CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEZWxEZXBzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgUmVtb3ZlUHJlZChEZWxEZXBzW2ldLmZpcnN0LCBEZWxEZXBzW2ldLnNlY29uZCk7CisKKyAgQXZhaWxhYmxlUXVldWUtPnVwZGF0ZU5vZGUoU1UpOworICBBdmFpbGFibGVRdWV1ZS0+YWRkTm9kZShOZXdTVSk7CisKKyAgKytOdW1EdXBzOworICByZXR1cm4gTmV3U1U7Cit9CisKKy8vLyBJbnNlcnRDb3BpZXNBbmRNb3ZlU3VjY3MgLSBJbnNlcnQgcmVnaXN0ZXIgY29waWVzIGFuZCBtb3ZlIGFsbAorLy8vIHNjaGVkdWxlZCBzdWNjZXNzb3JzIG9mIHRoZSBnaXZlbiBTVW5pdCB0byB0aGUgbGFzdCBjb3B5Lgordm9pZCBTY2hlZHVsZURBR1JSTGlzdDo6SW5zZXJ0Q29waWVzQW5kTW92ZVN1Y2NzKFNVbml0ICpTVSwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpEZXN0UkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlNyY1JDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxTVW5pdCosIDI+ICZDb3BpZXMpIHsKKyAgU1VuaXQgKkNvcHlGcm9tU1UgPSBDcmVhdGVOZXdTVW5pdChOVUxMKTsKKyAgQ29weUZyb21TVS0+Q29weVNyY1JDID0gU3JjUkM7CisgIENvcHlGcm9tU1UtPkNvcHlEc3RSQyA9IERlc3RSQzsKKworICBTVW5pdCAqQ29weVRvU1UgPSBDcmVhdGVOZXdTVW5pdChOVUxMKTsKKyAgQ29weVRvU1UtPkNvcHlTcmNSQyA9IERlc3RSQzsKKyAgQ29weVRvU1UtPkNvcHlEc3RSQyA9IFNyY1JDOworCisgIC8vIE9ubHkgY29weSBzY2hlZHVsZWQgc3VjY2Vzc29ycy4gQ3V0IHRoZW0gZnJvbSBvbGQgbm9kZSdzIHN1Y2Nlc3NvcgorICAvLyBsaXN0IGFuZCBtb3ZlIHRoZW0gb3Zlci4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPFNVbml0ICosIFNEZXA+LCA0PiBEZWxEZXBzOworICBmb3IgKFNVbml0OjpzdWNjX2l0ZXJhdG9yIEkgPSBTVS0+U3VjY3MuYmVnaW4oKSwgRSA9IFNVLT5TdWNjcy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChJLT5pc0FydGlmaWNpYWwoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIFNVbml0ICpTdWNjU1UgPSBJLT5nZXRTVW5pdCgpOworICAgIGlmIChTdWNjU1UtPmlzU2NoZWR1bGVkKSB7CisgICAgICBTRGVwIEQgPSAqSTsKKyAgICAgIEQuc2V0U1VuaXQoQ29weVRvU1UpOworICAgICAgQWRkUHJlZChTdWNjU1UsIEQpOworICAgICAgRGVsRGVwcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoU3VjY1NVLCAqSSkpOworICAgIH0KKyAgfQorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVsRGVwcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFJlbW92ZVByZWQoRGVsRGVwc1tpXS5maXJzdCwgRGVsRGVwc1tpXS5zZWNvbmQpOworCisgIEFkZFByZWQoQ29weUZyb21TVSwgU0RlcChTVSwgU0RlcDo6RGF0YSwgU1UtPkxhdGVuY3ksIFJlZykpOworICBBZGRQcmVkKENvcHlUb1NVLCBTRGVwKENvcHlGcm9tU1UsIFNEZXA6OkRhdGEsIENvcHlGcm9tU1UtPkxhdGVuY3ksIDApKTsKKworICBBdmFpbGFibGVRdWV1ZS0+dXBkYXRlTm9kZShTVSk7CisgIEF2YWlsYWJsZVF1ZXVlLT5hZGROb2RlKENvcHlGcm9tU1UpOworICBBdmFpbGFibGVRdWV1ZS0+YWRkTm9kZShDb3B5VG9TVSk7CisgIENvcGllcy5wdXNoX2JhY2soQ29weUZyb21TVSk7CisgIENvcGllcy5wdXNoX2JhY2soQ29weVRvU1UpOworCisgICsrTnVtUFJDb3BpZXM7Cit9CisKKy8vLyBnZXRQaHlzaWNhbFJlZ2lzdGVyVlQgLSBSZXR1cm5zIHRoZSBWYWx1ZVR5cGUgb2YgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyCisvLy8gZGVmaW5pdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLy8gRklYTUU6IE1vdmUgdG8gU2VsZWN0aW9uREFHPworc3RhdGljIEVWVCBnZXRQaHlzaWNhbFJlZ2lzdGVyVlQoU0ROb2RlICpOLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSkgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IFRJSS0+Z2V0KE4tPmdldE1hY2hpbmVPcGNvZGUoKSk7CisgIGFzc2VydChUSUQuSW1wbGljaXREZWZzICYmICJQaHlzaWNhbCByZWcgZGVmIG11c3QgYmUgaW4gaW1wbGljaXQgZGVmIGxpc3QhIik7CisgIHVuc2lnbmVkIE51bVJlcyA9IFRJRC5nZXROdW1EZWZzKCk7CisgIGZvciAoY29uc3QgdW5zaWduZWQgKkltcERlZiA9IFRJRC5nZXRJbXBsaWNpdERlZnMoKTsgKkltcERlZjsgKytJbXBEZWYpIHsKKyAgICBpZiAoUmVnID09ICpJbXBEZWYpCisgICAgICBicmVhazsKKyAgICArK051bVJlczsKKyAgfQorICByZXR1cm4gTi0+Z2V0VmFsdWVUeXBlKE51bVJlcyk7Cit9CisKKy8vLyBDaGVja0ZvckxpdmVSZWdEZWYgLSBSZXR1cm4gdHJ1ZSBhbmQgdXBkYXRlIGxpdmUgcmVnaXN0ZXIgdmVjdG9yIGlmIHRoZQorLy8vIHNwZWNpZmllZCByZWdpc3RlciBkZWYgb2YgdGhlIHNwZWNpZmllZCBTVW5pdCBjbG9iYmVycyBhbnkgImxpdmUiIHJlZ2lzdGVycy4KK3N0YXRpYyBib29sIENoZWNrRm9yTGl2ZVJlZ0RlZihTVW5pdCAqU1UsIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTVW5pdCo+ICZMaXZlUmVnRGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDx1bnNpZ25lZCwgND4gJlJlZ0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmTFJlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIHsKKyAgYm9vbCBBZGRlZCA9IGZhbHNlOworICBpZiAoTGl2ZVJlZ0RlZnNbUmVnXSAmJiBMaXZlUmVnRGVmc1tSZWddICE9IFNVKSB7CisgICAgaWYgKFJlZ0FkZGVkLmluc2VydChSZWcpKSB7CisgICAgICBMUmVncy5wdXNoX2JhY2soUmVnKTsKKyAgICAgIEFkZGVkID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZm9yIChjb25zdCB1bnNpZ25lZCAqQWxpYXMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBbGlhczsgKytBbGlhcykKKyAgICBpZiAoTGl2ZVJlZ0RlZnNbKkFsaWFzXSAmJiBMaXZlUmVnRGVmc1sqQWxpYXNdICE9IFNVKSB7CisgICAgICBpZiAoUmVnQWRkZWQuaW5zZXJ0KCpBbGlhcykpIHsKKyAgICAgICAgTFJlZ3MucHVzaF9iYWNrKCpBbGlhcyk7CisgICAgICAgIEFkZGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIHJldHVybiBBZGRlZDsKK30KKworLy8vIERlbGF5Rm9yTGl2ZVJlZ3NCb3R0b21VcCAtIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gZGVsYXkKKy8vLyBzY2hlZHVsaW5nIG9mIHRoZSBnaXZlbiBub2RlIHRvIHNhdGlzZnkgbGl2ZSBwaHlzaWNhbCByZWdpc3RlciBkZXBlbmRlbmNpZXMuCisvLy8gSWYgdGhlIHNwZWNpZmljIG5vZGUgaXMgdGhlIGxhc3Qgb25lIHRoYXQncyBhdmFpbGFibGUgdG8gc2NoZWR1bGUsIGRvCisvLy8gd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IChpLmUuIGJhY2t0cmFja2luZyBvciBjbG9uaW5nKSB0byBtYWtlIGl0IHBvc3NpYmxlLgorYm9vbCBTY2hlZHVsZURBR1JSTGlzdDo6RGVsYXlGb3JMaXZlUmVnc0JvdHRvbVVwKFNVbml0ICpTVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gJkxSZWdzKXsKKyAgaWYgKE51bUxpdmVSZWdzID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiBSZWdBZGRlZDsKKyAgLy8gSWYgdGhpcyBub2RlIHdvdWxkIGNsb2JiZXIgYW55ICJsaXZlIiByZWdpc3RlciwgdGhlbiBpdCdzIG5vdCByZWFkeS4KKyAgZm9yIChTVW5pdDo6cHJlZF9pdGVyYXRvciBJID0gU1UtPlByZWRzLmJlZ2luKCksIEUgPSBTVS0+UHJlZHMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aXNBc3NpZ25lZFJlZ0RlcCgpKQorICAgICAgQ2hlY2tGb3JMaXZlUmVnRGVmKEktPmdldFNVbml0KCksIEktPmdldFJlZygpLCBMaXZlUmVnRGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZWdBZGRlZCwgTFJlZ3MsIFRSSSk7CisgIH0KKworICBmb3IgKFNETm9kZSAqTm9kZSA9IFNVLT5nZXROb2RlKCk7IE5vZGU7IE5vZGUgPSBOb2RlLT5nZXRGbGFnZ2VkTm9kZSgpKSB7CisgICAgaWYgKCFOb2RlLT5pc01hY2hpbmVPcGNvZGUoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gVElJLT5nZXQoTm9kZS0+Z2V0TWFjaGluZU9wY29kZSgpKTsKKyAgICBpZiAoIVRJRC5JbXBsaWNpdERlZnMpCisgICAgICBjb250aW51ZTsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpSZWcgPSBUSUQuSW1wbGljaXREZWZzOyAqUmVnOyArK1JlZykKKyAgICAgIENoZWNrRm9yTGl2ZVJlZ0RlZihTVSwgKlJlZywgTGl2ZVJlZ0RlZnMsIFJlZ0FkZGVkLCBMUmVncywgVFJJKTsKKyAgfQorICByZXR1cm4gIUxSZWdzLmVtcHR5KCk7Cit9CisKKworLy8vIExpc3RTY2hlZHVsZUJvdHRvbVVwIC0gVGhlIG1haW4gbG9vcCBvZiBsaXN0IHNjaGVkdWxpbmcgZm9yIGJvdHRvbS11cAorLy8vIHNjaGVkdWxlcnMuCit2b2lkIFNjaGVkdWxlREFHUlJMaXN0OjpMaXN0U2NoZWR1bGVCb3R0b21VcCgpIHsKKyAgdW5zaWduZWQgQ3VyQ3ljbGUgPSAwOworCisgIC8vIFJlbGVhc2UgYW55IHByZWRlY2Vzc29ycyBvZiB0aGUgc3BlY2lhbCBFeGl0IG5vZGUuCisgIFJlbGVhc2VQcmVkZWNlc3NvcnMoJkV4aXRTVSwgQ3VyQ3ljbGUpOworCisgIC8vIEFkZCByb290IHRvIEF2YWlsYWJsZSBxdWV1ZS4KKyAgaWYgKCFTVW5pdHMuZW1wdHkoKSkgeworICAgIFNVbml0ICpSb290U1UgPSAmU1VuaXRzW0RBRy0+Z2V0Um9vdCgpLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCldOworICAgIGFzc2VydChSb290U1UtPlN1Y2NzLmVtcHR5KCkgJiYgIkdyYXBoIHJvb3Qgc2hvdWxkbid0IGhhdmUgc3VjY2Vzc29ycyEiKTsKKyAgICBSb290U1UtPmlzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICBBdmFpbGFibGVRdWV1ZS0+cHVzaChSb290U1UpOworICB9CisKKyAgLy8gV2hpbGUgQXZhaWxhYmxlIHF1ZXVlIGlzIG5vdCBlbXB0eSwgZ3JhYiB0aGUgbm9kZSB3aXRoIHRoZSBoaWdoZXN0CisgIC8vIHByaW9yaXR5LiBJZiBpdCBpcyBub3QgcmVhZHkgcHV0IGl0IGJhY2suICBTY2hlZHVsZSB0aGUgbm9kZS4KKyAgU21hbGxWZWN0b3I8U1VuaXQqLCA0PiBOb3RSZWFkeTsKKyAgRGVuc2VNYXA8U1VuaXQqLCBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gPiBMUmVnc01hcDsKKyAgU2VxdWVuY2UucmVzZXJ2ZShTVW5pdHMuc2l6ZSgpKTsKKyAgd2hpbGUgKCFBdmFpbGFibGVRdWV1ZS0+ZW1wdHkoKSkgeworICAgIGJvb2wgRGVsYXllZCA9IGZhbHNlOworICAgIExSZWdzTWFwLmNsZWFyKCk7CisgICAgU1VuaXQgKkN1clNVID0gQXZhaWxhYmxlUXVldWUtPnBvcCgpOworICAgIHdoaWxlIChDdXJTVSkgeworICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IExSZWdzOworICAgICAgaWYgKCFEZWxheUZvckxpdmVSZWdzQm90dG9tVXAoQ3VyU1UsIExSZWdzKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBEZWxheWVkID0gdHJ1ZTsKKyAgICAgIExSZWdzTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihDdXJTVSwgTFJlZ3MpKTsKKworICAgICAgQ3VyU1UtPmlzUGVuZGluZyA9IHRydWU7ICAvLyBUaGlzIFNVIGlzIG5vdCBpbiBBdmFpbGFibGVRdWV1ZSByaWdodCBub3cuCisgICAgICBOb3RSZWFkeS5wdXNoX2JhY2soQ3VyU1UpOworICAgICAgQ3VyU1UgPSBBdmFpbGFibGVRdWV1ZS0+cG9wKCk7CisgICAgfQorCisgICAgLy8gQWxsIGNhbmRpZGF0ZXMgYXJlIGRlbGF5ZWQgZHVlIHRvIGxpdmUgcGh5c2ljYWwgcmVnIGRlcGVuZGVuY2llcy4KKyAgICAvLyBUcnkgYmFja3RyYWNraW5nLCBjb2RlIGR1cGxpY2F0aW9uLCBvciBpbnNlcnRpbmcgY3Jvc3MgY2xhc3MgY29waWVzCisgICAgLy8gdG8gcmVzb2x2ZSBpdC4KKyAgICBpZiAoRGVsYXllZCAmJiAhQ3VyU1UpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOb3RSZWFkeS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFNVbml0ICpUcnlTVSA9IE5vdFJlYWR5W2ldOworICAgICAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gJkxSZWdzID0gTFJlZ3NNYXBbVHJ5U1VdOworCisgICAgICAgIC8vIFRyeSB1bnNjaGVkdWxpbmcgdXAgdG8gdGhlIHBvaW50IHdoZXJlIGl0J3Mgc2FmZSB0byBzY2hlZHVsZQorICAgICAgICAvLyB0aGlzIG5vZGUuCisgICAgICAgIHVuc2lnbmVkIExpdmVDeWNsZSA9IEN1ckN5Y2xlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlZSA9IExSZWdzLnNpemUoKTsgaiAhPSBlZTsgKytqKSB7CisgICAgICAgICAgdW5zaWduZWQgUmVnID0gTFJlZ3Nbal07CisgICAgICAgICAgdW5zaWduZWQgTEN5Y2xlID0gTGl2ZVJlZ0N5Y2xlc1tSZWddOworICAgICAgICAgIExpdmVDeWNsZSA9IHN0ZDo6bWluKExpdmVDeWNsZSwgTEN5Y2xlKTsKKyAgICAgICAgfQorICAgICAgICBTVW5pdCAqT2xkU1UgPSBTZXF1ZW5jZVtMaXZlQ3ljbGVdOworICAgICAgICBpZiAoIVdpbGxDcmVhdGVDeWNsZShUcnlTVSwgT2xkU1UpKSAgeworICAgICAgICAgIEJhY2t0cmFja0JvdHRvbVVwKFRyeVNVLCBMaXZlQ3ljbGUsIEN1ckN5Y2xlKTsKKyAgICAgICAgICAvLyBGb3JjZSB0aGUgY3VycmVudCBub2RlIHRvIGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIG5vZGUgdGhhdAorICAgICAgICAgIC8vIHJlcXVpcmVzIHRoZSBwaHlzaWNhbCByZWcgZGVwLgorICAgICAgICAgIGlmIChPbGRTVS0+aXNBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIE9sZFNVLT5pc0F2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgQXZhaWxhYmxlUXVldWUtPnJlbW92ZShPbGRTVSk7CisgICAgICAgICAgfQorICAgICAgICAgIEFkZFByZWQoVHJ5U1UsIFNEZXAoT2xkU1UsIFNEZXA6Ok9yZGVyLCAvKkxhdGVuY3k9Ki8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypSZWc9Ki8wLCAvKmlzTm9ybWFsTWVtb3J5PSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzTXVzdEFsaWFzPSovZmFsc2UsIC8qaXNBcnRpZmljaWFsPSovdHJ1ZSkpOworICAgICAgICAgIC8vIElmIG9uZSBvciBtb3JlIHN1Y2Nlc3NvcnMgaGFzIGJlZW4gdW5zY2hlZHVsZWQsIHRoZW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAvLyBub2RlIGlzIG5vIGxvbmdlciBhdmFpYWxhYmxlLiBTY2hlZHVsZSBhIHN1Y2Nlc3NvciB0aGF0J3Mgbm93CisgICAgICAgICAgLy8gYXZhaWxhYmxlIGluc3RlYWQuCisgICAgICAgICAgaWYgKCFUcnlTVS0+aXNBdmFpbGFibGUpCisgICAgICAgICAgICBDdXJTVSA9IEF2YWlsYWJsZVF1ZXVlLT5wb3AoKTsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEN1clNVID0gVHJ5U1U7CisgICAgICAgICAgICBUcnlTVS0+aXNQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICBOb3RSZWFkeS5lcmFzZShOb3RSZWFkeS5iZWdpbigpK2kpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIUN1clNVKSB7CisgICAgICAgIC8vIENhbid0IGJhY2t0cmFjay4gSWYgaXQncyB0b28gZXhwZW5zaXZlIHRvIGNvcHkgdGhlIHZhbHVlLCB0aGVuIHRyeQorICAgICAgICAvLyBkdXBsaWNhdGUgdGhlIG5vZGVzIHRoYXQgcHJvZHVjZXMgdGhlc2UgInRvbyBleHBlbnNpdmUgdG8gY29weSIKKyAgICAgICAgLy8gdmFsdWVzIHRvIGJyZWFrIHRoZSBkZXBlbmRlbmN5LiBJbiBjYXNlIGV2ZW4gdGhhdCBkb2Vzbid0IHdvcmssCisgICAgICAgIC8vIGluc2VydCBjcm9zcyBjbGFzcyBjb3BpZXMuCisgICAgICAgIC8vIElmIGl0J3Mgbm90IHRvbyBleHBlbnNpdmUsIGkuZS4gY29zdCAhPSAtMSwgaXNzdWUgY29waWVzLgorICAgICAgICBTVW5pdCAqVHJ5U1UgPSBOb3RSZWFkeVswXTsKKyAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+ICZMUmVncyA9IExSZWdzTWFwW1RyeVNVXTsKKyAgICAgICAgYXNzZXJ0KExSZWdzLnNpemUoKSA9PSAxICYmICJDYW4ndCBoYW5kbGUgdGhpcyB5ZXQhIik7CisgICAgICAgIHVuc2lnbmVkIFJlZyA9IExSZWdzWzBdOworICAgICAgICBTVW5pdCAqTFJEZWYgPSBMaXZlUmVnRGVmc1tSZWddOworICAgICAgICBFVlQgVlQgPSBnZXRQaHlzaWNhbFJlZ2lzdGVyVlQoTFJEZWYtPmdldE5vZGUoKSwgUmVnLCBUSUkpOworICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9CisgICAgICAgICAgVFJJLT5nZXRNaW5pbWFsUGh5c1JlZ0NsYXNzKFJlZywgVlQpOworICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpEZXN0UkMgPSBUUkktPmdldENyb3NzQ29weVJlZ0NsYXNzKFJDKTsKKworICAgICAgICAvLyBJZiBjcm9zcyBjb3B5IHJlZ2lzdGVyIGNsYXNzIGlzIG51bGwsIHRoZW4gaXQgbXVzdCBiZSBwb3NzaWJsZSBjb3B5CisgICAgICAgIC8vIHRoZSB2YWx1ZSBkaXJlY3RseS4gRG8gbm90IHRyeSBkdXBsaWNhdGUgdGhlIGRlZi4KKyAgICAgICAgU1VuaXQgKk5ld0RlZiA9IDA7CisgICAgICAgIGlmIChEZXN0UkMpCisgICAgICAgICAgTmV3RGVmID0gQ29weUFuZE1vdmVTdWNjZXNzb3JzKExSRGVmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIERlc3RSQyA9IFJDOworICAgICAgICBpZiAoIU5ld0RlZikgeworICAgICAgICAgIC8vIElzc3VlIGNvcGllcywgdGhlc2UgY2FuIGJlIGV4cGVuc2l2ZSBjcm9zcyByZWdpc3RlciBjbGFzcyBjb3BpZXMuCisgICAgICAgICAgU21hbGxWZWN0b3I8U1VuaXQqLCAyPiBDb3BpZXM7CisgICAgICAgICAgSW5zZXJ0Q29waWVzQW5kTW92ZVN1Y2NzKExSRGVmLCBSZWcsIERlc3RSQywgUkMsIENvcGllcyk7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgICAgQWRkaW5nIGFuIGVkZ2UgZnJvbSBTVSAjIiA8PCBUcnlTVS0+Tm9kZU51bQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRvIFNVICMiIDw8IENvcGllcy5mcm9udCgpLT5Ob2RlTnVtIDw8ICJcbiIpOworICAgICAgICAgIEFkZFByZWQoVHJ5U1UsIFNEZXAoQ29waWVzLmZyb250KCksIFNEZXA6Ok9yZGVyLCAvKkxhdGVuY3k9Ki8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypSZWc9Ki8wLCAvKmlzTm9ybWFsTWVtb3J5PSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzTXVzdEFsaWFzPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzQXJ0aWZpY2lhbD0qL3RydWUpKTsKKyAgICAgICAgICBOZXdEZWYgPSBDb3BpZXMuYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgICAgQWRkaW5nIGFuIGVkZ2UgZnJvbSBTVSAjIiA8PCBOZXdEZWYtPk5vZGVOdW0KKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgdG8gU1UgIyIgPDwgVHJ5U1UtPk5vZGVOdW0gPDwgIlxuIik7CisgICAgICAgIExpdmVSZWdEZWZzW1JlZ10gPSBOZXdEZWY7CisgICAgICAgIEFkZFByZWQoTmV3RGVmLCBTRGVwKFRyeVNVLCBTRGVwOjpPcmRlciwgLypMYXRlbmN5PSovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypSZWc9Ki8wLCAvKmlzTm9ybWFsTWVtb3J5PSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNNdXN0QWxpYXM9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc0FydGlmaWNpYWw9Ki90cnVlKSk7CisgICAgICAgIFRyeVNVLT5pc0F2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBDdXJTVSA9IE5ld0RlZjsKKyAgICAgIH0KKworICAgICAgYXNzZXJ0KEN1clNVICYmICJVbmFibGUgdG8gcmVzb2x2ZSBsaXZlIHBoeXNpY2FsIHJlZ2lzdGVyIGRlcGVuZGVuY2llcyEiKTsKKyAgICB9CisKKyAgICAvLyBBZGQgdGhlIG5vZGVzIHRoYXQgYXJlbid0IHJlYWR5IGJhY2sgb250byB0aGUgYXZhaWxhYmxlIGxpc3QuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vdFJlYWR5LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE5vdFJlYWR5W2ldLT5pc1BlbmRpbmcgPSBmYWxzZTsKKyAgICAgIC8vIE1heSBubyBsb25nZXIgYmUgYXZhaWxhYmxlIGR1ZSB0byBiYWNrdHJhY2tpbmcuCisgICAgICBpZiAoTm90UmVhZHlbaV0tPmlzQXZhaWxhYmxlKQorICAgICAgICBBdmFpbGFibGVRdWV1ZS0+cHVzaChOb3RSZWFkeVtpXSk7CisgICAgfQorICAgIE5vdFJlYWR5LmNsZWFyKCk7CisKKyAgICBpZiAoQ3VyU1UpCisgICAgICBTY2hlZHVsZU5vZGVCb3R0b21VcChDdXJTVSwgQ3VyQ3ljbGUpOworICAgICsrQ3VyQ3ljbGU7CisgICAgQXZhaWxhYmxlUXVldWUtPnNldEN1ckN5Y2xlKEN1ckN5Y2xlKTsKKyAgfQorCisgIC8vIFJldmVyc2UgdGhlIG9yZGVyIGlmIGl0IGlzIGJvdHRvbSB1cC4KKyAgc3RkOjpyZXZlcnNlKFNlcXVlbmNlLmJlZ2luKCksIFNlcXVlbmNlLmVuZCgpKTsKKyAgCisjaWZuZGVmIE5ERUJVRworICBWZXJpZnlTY2hlZHVsZShpc0JvdHRvbVVwKTsKKyNlbmRpZgorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFRvcC1Eb3duIFNjaGVkdWxpbmcKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBSZWxlYXNlU3VjYyAtIERlY3JlbWVudCB0aGUgTnVtUHJlZHNMZWZ0IGNvdW50IG9mIGEgc3VjY2Vzc29yLiBBZGQgaXQgdG8KKy8vLyB0aGUgQXZhaWxhYmxlUXVldWUgaWYgdGhlIGNvdW50IHJlYWNoZXMgemVyby4gQWxzbyB1cGRhdGUgaXRzIGN5Y2xlIGJvdW5kLgordm9pZCBTY2hlZHVsZURBR1JSTGlzdDo6UmVsZWFzZVN1Y2MoU1VuaXQgKlNVLCBjb25zdCBTRGVwICpTdWNjRWRnZSkgeworICBTVW5pdCAqU3VjY1NVID0gU3VjY0VkZ2UtPmdldFNVbml0KCk7CisKKyNpZm5kZWYgTkRFQlVHCisgIGlmIChTdWNjU1UtPk51bVByZWRzTGVmdCA9PSAwKSB7CisgICAgZGJncygpIDw8ICIqKiogU2NoZWR1bGluZyBmYWlsZWQhICoqKlxuIjsKKyAgICBTdWNjU1UtPmR1bXAodGhpcyk7CisgICAgZGJncygpIDw8ICIgaGFzIGJlZW4gcmVsZWFzZWQgdG9vIG1hbnkgdGltZXMhXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKyNlbmRpZgorICAtLVN1Y2NTVS0+TnVtUHJlZHNMZWZ0OworCisgIC8vIElmIGFsbCB0aGUgbm9kZSdzIHByZWRlY2Vzc29ycyBhcmUgc2NoZWR1bGVkLCB0aGlzIG5vZGUgaXMgcmVhZHkKKyAgLy8gdG8gYmUgc2NoZWR1bGVkLiBJZ25vcmUgdGhlIHNwZWNpYWwgRXhpdFNVIG5vZGUuCisgIGlmIChTdWNjU1UtPk51bVByZWRzTGVmdCA9PSAwICYmIFN1Y2NTVSAhPSAmRXhpdFNVKSB7CisgICAgU3VjY1NVLT5pc0F2YWlsYWJsZSA9IHRydWU7CisgICAgQXZhaWxhYmxlUXVldWUtPnB1c2goU3VjY1NVKTsKKyAgfQorfQorCit2b2lkIFNjaGVkdWxlREFHUlJMaXN0OjpSZWxlYXNlU3VjY2Vzc29ycyhTVW5pdCAqU1UpIHsKKyAgLy8gVG9wIGRvd246IHJlbGVhc2Ugc3VjY2Vzc29ycworICBmb3IgKFNVbml0OjpzdWNjX2l0ZXJhdG9yIEkgPSBTVS0+U3VjY3MuYmVnaW4oKSwgRSA9IFNVLT5TdWNjcy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGFzc2VydCghSS0+aXNBc3NpZ25lZFJlZ0RlcCgpICYmCisgICAgICAgICAgICJUaGUgbGlzdC10ZHJyIHNjaGVkdWxlciBkb2Vzbid0IHlldCBzdXBwb3J0IHBoeXNyZWcgZGVwZW5kZW5jaWVzISIpOworCisgICAgUmVsZWFzZVN1Y2MoU1UsICYqSSk7CisgIH0KK30KKworLy8vIFNjaGVkdWxlTm9kZVRvcERvd24gLSBBZGQgdGhlIG5vZGUgdG8gdGhlIHNjaGVkdWxlLiBEZWNyZW1lbnQgdGhlIHBlbmRpbmcKKy8vLyBjb3VudCBvZiBpdHMgc3VjY2Vzc29ycy4gSWYgYSBzdWNjZXNzb3IgcGVuZGluZyBjb3VudCBpcyB6ZXJvLCBhZGQgaXQgdG8KKy8vLyB0aGUgQXZhaWxhYmxlIHF1ZXVlLgordm9pZCBTY2hlZHVsZURBR1JSTGlzdDo6U2NoZWR1bGVOb2RlVG9wRG93bihTVW5pdCAqU1UsIHVuc2lnbmVkIEN1ckN5Y2xlKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiKioqIFNjaGVkdWxpbmcgWyIgPDwgQ3VyQ3ljbGUgPDwgIl06ICIpOworICBERUJVRyhTVS0+ZHVtcCh0aGlzKSk7CisKKyAgYXNzZXJ0KEN1ckN5Y2xlID49IFNVLT5nZXREZXB0aCgpICYmICJOb2RlIHNjaGVkdWxlZCBhYm92ZSBpdHMgZGVwdGghIik7CisgIFNVLT5zZXREZXB0aFRvQXRMZWFzdChDdXJDeWNsZSk7CisgIFNlcXVlbmNlLnB1c2hfYmFjayhTVSk7CisKKyAgUmVsZWFzZVN1Y2Nlc3NvcnMoU1UpOworICBTVS0+aXNTY2hlZHVsZWQgPSB0cnVlOworICBBdmFpbGFibGVRdWV1ZS0+U2NoZWR1bGVkTm9kZShTVSk7Cit9CisKKy8vLyBMaXN0U2NoZWR1bGVUb3BEb3duIC0gVGhlIG1haW4gbG9vcCBvZiBsaXN0IHNjaGVkdWxpbmcgZm9yIHRvcC1kb3duCisvLy8gc2NoZWR1bGVycy4KK3ZvaWQgU2NoZWR1bGVEQUdSUkxpc3Q6Okxpc3RTY2hlZHVsZVRvcERvd24oKSB7CisgIHVuc2lnbmVkIEN1ckN5Y2xlID0gMDsKKyAgQXZhaWxhYmxlUXVldWUtPnNldEN1ckN5Y2xlKEN1ckN5Y2xlKTsKKworICAvLyBSZWxlYXNlIGFueSBzdWNjZXNzb3JzIG9mIHRoZSBzcGVjaWFsIEVudHJ5IG5vZGUuCisgIFJlbGVhc2VTdWNjZXNzb3JzKCZFbnRyeVNVKTsKKworICAvLyBBbGwgbGVhdmVzIHRvIEF2YWlsYWJsZSBxdWV1ZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNVbml0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gSXQgaXMgYXZhaWxhYmxlIGlmIGl0IGhhcyBubyBwcmVkZWNlc3NvcnMuCisgICAgaWYgKFNVbml0c1tpXS5QcmVkcy5lbXB0eSgpKSB7CisgICAgICBBdmFpbGFibGVRdWV1ZS0+cHVzaCgmU1VuaXRzW2ldKTsKKyAgICAgIFNVbml0c1tpXS5pc0F2YWlsYWJsZSA9IHRydWU7CisgICAgfQorICB9CisgIAorICAvLyBXaGlsZSBBdmFpbGFibGUgcXVldWUgaXMgbm90IGVtcHR5LCBncmFiIHRoZSBub2RlIHdpdGggdGhlIGhpZ2hlc3QKKyAgLy8gcHJpb3JpdHkuIElmIGl0IGlzIG5vdCByZWFkeSBwdXQgaXQgYmFjay4gIFNjaGVkdWxlIHRoZSBub2RlLgorICBTZXF1ZW5jZS5yZXNlcnZlKFNVbml0cy5zaXplKCkpOworICB3aGlsZSAoIUF2YWlsYWJsZVF1ZXVlLT5lbXB0eSgpKSB7CisgICAgU1VuaXQgKkN1clNVID0gQXZhaWxhYmxlUXVldWUtPnBvcCgpOworICAgIAorICAgIGlmIChDdXJTVSkKKyAgICAgIFNjaGVkdWxlTm9kZVRvcERvd24oQ3VyU1UsIEN1ckN5Y2xlKTsKKyAgICArK0N1ckN5Y2xlOworICAgIEF2YWlsYWJsZVF1ZXVlLT5zZXRDdXJDeWNsZShDdXJDeWNsZSk7CisgIH0KKyAgCisjaWZuZGVmIE5ERUJVRworICBWZXJpZnlTY2hlZHVsZShpc0JvdHRvbVVwKTsKKyNlbmRpZgorfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICBSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgYSBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSB0aGF0IHNjaGVkdWxlcyB1c2luZyBTZXRoaSBVbGxtYW4gbnVtYmVycworLy8gdG8gcmVkdWNlIHJlZ2lzdGVyIHByZXNzdXJlLgorLy8gCituYW1lc3BhY2UgeworICB0ZW1wbGF0ZTxjbGFzcyBTRj4KKyAgY2xhc3MgUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZTsKKyAgCisgIC8vLyBidV9sc19ycl9zb3J0IC0gUHJpb3JpdHkgZnVuY3Rpb24gZm9yIGJvdHRvbSB1cCByZWdpc3RlciBwcmVzc3VyZQorICAvLyByZWR1Y3Rpb24gc2NoZWR1bGVyLgorICBzdHJ1Y3QgYnVfbHNfcnJfc29ydCA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxTVW5pdCosIFNVbml0KiwgYm9vbD4geworICAgIFJlZ1JlZHVjdGlvblByaW9yaXR5UXVldWU8YnVfbHNfcnJfc29ydD4gKlNQUTsKKyAgICBidV9sc19ycl9zb3J0KFJlZ1JlZHVjdGlvblByaW9yaXR5UXVldWU8YnVfbHNfcnJfc29ydD4gKnNwcSkgOiBTUFEoc3BxKSB7fQorICAgIGJ1X2xzX3JyX3NvcnQoY29uc3QgYnVfbHNfcnJfc29ydCAmUkhTKSA6IFNQUShSSFMuU1BRKSB7fQorICAgIAorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBTVW5pdCogbGVmdCwgY29uc3QgU1VuaXQqIHJpZ2h0KSBjb25zdDsKKyAgfTsKKworICAvLyB0ZF9sc19ycl9zb3J0IC0gUHJpb3JpdHkgZnVuY3Rpb24gZm9yIHRvcCBkb3duIHJlZ2lzdGVyIHByZXNzdXJlIHJlZHVjdGlvbgorICAvLyBzY2hlZHVsZXIuCisgIHN0cnVjdCB0ZF9sc19ycl9zb3J0IDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPFNVbml0KiwgU1VuaXQqLCBib29sPiB7CisgICAgUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZTx0ZF9sc19ycl9zb3J0PiAqU1BROworICAgIHRkX2xzX3JyX3NvcnQoUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZTx0ZF9sc19ycl9zb3J0PiAqc3BxKSA6IFNQUShzcHEpIHt9CisgICAgdGRfbHNfcnJfc29ydChjb25zdCB0ZF9sc19ycl9zb3J0ICZSSFMpIDogU1BRKFJIUy5TUFEpIHt9CisgICAgCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFNVbml0KiBsZWZ0LCBjb25zdCBTVW5pdCogcmlnaHQpIGNvbnN0OworICB9OworCisgIC8vIHNyY19sc19ycl9zb3J0IC0gUHJpb3JpdHkgZnVuY3Rpb24gZm9yIHNvdXJjZSBvcmRlciBzY2hlZHVsZXIuCisgIHN0cnVjdCBzcmNfbHNfcnJfc29ydCA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxTVW5pdCosIFNVbml0KiwgYm9vbD4geworICAgIFJlZ1JlZHVjdGlvblByaW9yaXR5UXVldWU8c3JjX2xzX3JyX3NvcnQ+ICpTUFE7CisgICAgc3JjX2xzX3JyX3NvcnQoUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZTxzcmNfbHNfcnJfc29ydD4gKnNwcSkKKyAgICAgIDogU1BRKHNwcSkge30KKyAgICBzcmNfbHNfcnJfc29ydChjb25zdCBzcmNfbHNfcnJfc29ydCAmUkhTKQorICAgICAgOiBTUFEoUkhTLlNQUSkge30KKyAgICAKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgU1VuaXQqIGxlZnQsIGNvbnN0IFNVbml0KiByaWdodCkgY29uc3Q7CisgIH07CisKKyAgLy8gaHlicmlkX2xzX3JyX3NvcnQgLSBQcmlvcml0eSBmdW5jdGlvbiBmb3IgaHlicmlkIHNjaGVkdWxlci4KKyAgc3RydWN0IGh5YnJpZF9sc19ycl9zb3J0IDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPFNVbml0KiwgU1VuaXQqLCBib29sPiB7CisgICAgUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZTxoeWJyaWRfbHNfcnJfc29ydD4gKlNQUTsKKyAgICBoeWJyaWRfbHNfcnJfc29ydChSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlPGh5YnJpZF9sc19ycl9zb3J0PiAqc3BxKQorICAgICAgOiBTUFEoc3BxKSB7fQorICAgIGh5YnJpZF9sc19ycl9zb3J0KGNvbnN0IGh5YnJpZF9sc19ycl9zb3J0ICZSSFMpCisgICAgICA6IFNQUShSSFMuU1BRKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFNVbml0KiBsZWZ0LCBjb25zdCBTVW5pdCogcmlnaHQpIGNvbnN0OworICB9OworCisgIC8vIGlscF9sc19ycl9zb3J0IC0gUHJpb3JpdHkgZnVuY3Rpb24gZm9yIElMUCAoaW5zdHJ1Y3Rpb24gbGV2ZWwgcGFyYWxsZWxpc20pCisgIC8vIHNjaGVkdWxlci4KKyAgc3RydWN0IGlscF9sc19ycl9zb3J0IDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPFNVbml0KiwgU1VuaXQqLCBib29sPiB7CisgICAgUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZTxpbHBfbHNfcnJfc29ydD4gKlNQUTsKKyAgICBpbHBfbHNfcnJfc29ydChSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlPGlscF9sc19ycl9zb3J0PiAqc3BxKQorICAgICAgOiBTUFEoc3BxKSB7fQorICAgIGlscF9sc19ycl9zb3J0KGNvbnN0IGlscF9sc19ycl9zb3J0ICZSSFMpCisgICAgICA6IFNQUShSSFMuU1BRKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFNVbml0KiBsZWZ0LCBjb25zdCBTVW5pdCogcmlnaHQpIGNvbnN0OworICB9OworfSAgLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworLy8vIENhbGNOb2RlU2V0aGlVbGxtYW5OdW1iZXIgLSBDb21wdXRlIFNldGhpIFVsbG1hbiBudW1iZXIuCisvLy8gU21hbGxlciBudW1iZXIgaXMgdGhlIGhpZ2hlciBwcmlvcml0eS4KK3N0YXRpYyB1bnNpZ25lZAorQ2FsY05vZGVTZXRoaVVsbG1hbk51bWJlcihjb25zdCBTVW5pdCAqU1UsIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmU1VOdW1iZXJzKSB7CisgIHVuc2lnbmVkICZTZXRoaVVsbG1hbk51bWJlciA9IFNVTnVtYmVyc1tTVS0+Tm9kZU51bV07CisgIGlmIChTZXRoaVVsbG1hbk51bWJlciAhPSAwKQorICAgIHJldHVybiBTZXRoaVVsbG1hbk51bWJlcjsKKworICB1bnNpZ25lZCBFeHRyYSA9IDA7CisgIGZvciAoU1VuaXQ6OmNvbnN0X3ByZWRfaXRlcmF0b3IgSSA9IFNVLT5QcmVkcy5iZWdpbigpLCBFID0gU1UtPlByZWRzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPmlzQ3RybCgpKSBjb250aW51ZTsgIC8vIGlnbm9yZSBjaGFpbiBwcmVkcworICAgIFNVbml0ICpQcmVkU1UgPSBJLT5nZXRTVW5pdCgpOworICAgIHVuc2lnbmVkIFByZWRTZXRoaVVsbG1hbiA9IENhbGNOb2RlU2V0aGlVbGxtYW5OdW1iZXIoUHJlZFNVLCBTVU51bWJlcnMpOworICAgIGlmIChQcmVkU2V0aGlVbGxtYW4gPiBTZXRoaVVsbG1hbk51bWJlcikgeworICAgICAgU2V0aGlVbGxtYW5OdW1iZXIgPSBQcmVkU2V0aGlVbGxtYW47CisgICAgICBFeHRyYSA9IDA7CisgICAgfSBlbHNlIGlmIChQcmVkU2V0aGlVbGxtYW4gPT0gU2V0aGlVbGxtYW5OdW1iZXIpCisgICAgICArK0V4dHJhOworICB9CisKKyAgU2V0aGlVbGxtYW5OdW1iZXIgKz0gRXh0cmE7CisKKyAgaWYgKFNldGhpVWxsbWFuTnVtYmVyID09IDApCisgICAgU2V0aGlVbGxtYW5OdW1iZXIgPSAxOworICAKKyAgcmV0dXJuIFNldGhpVWxsbWFuTnVtYmVyOworfQorCituYW1lc3BhY2UgeworICB0ZW1wbGF0ZTxjbGFzcyBTRj4KKyAgY2xhc3MgUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZSA6IHB1YmxpYyBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSB7CisgICAgc3RkOjp2ZWN0b3I8U1VuaXQqPiBRdWV1ZTsKKyAgICBTRiBQaWNrZXI7CisgICAgdW5zaWduZWQgQ3VyUXVldWVJZDsKKyAgICBib29sIFRyYWNrc1JlZ1ByZXNzdXJlOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTVW5pdHMgLSBUaGUgU1VuaXRzIGZvciB0aGUgY3VycmVudCBncmFwaC4KKyAgICBzdGQ6OnZlY3RvcjxTVW5pdD4gKlNVbml0czsKKworICAgIE1hY2hpbmVGdW5jdGlvbiAmTUY7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSTsKKyAgICBTY2hlZHVsZURBR1JSTGlzdCAqc2NoZWR1bGVEQUc7CisKKyAgICAvLyBTZXRoaVVsbG1hbk51bWJlcnMgLSBUaGUgU2V0aGlVbGxtYW4gbnVtYmVyIGZvciBlYWNoIG5vZGUuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFNldGhpVWxsbWFuTnVtYmVyczsKKworICAgIC8vLyBSZWdQcmVzc3VyZSAtIFRyYWNraW5nIGN1cnJlbnQgcmVnIHByZXNzdXJlIHBlciByZWdpc3RlciBjbGFzcy4KKyAgICAvLy8KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUmVnUHJlc3N1cmU7CisKKyAgICAvLy8gUmVnTGltaXQgLSBUcmFja2luZyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRhYmxlIHJlZ2lzdGVycyBwZXIgcmVnaXN0ZXIKKyAgICAvLy8gY2xhc3MuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFJlZ0xpbWl0OworCisgIHB1YmxpYzoKKyAgICBSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlKE1hY2hpbmVGdW5jdGlvbiAmbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRyYWNrc3JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICp0aWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKnRyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICp0bGkpCisgICAgICA6IFBpY2tlcih0aGlzKSwgQ3VyUXVldWVJZCgwKSwgVHJhY2tzUmVnUHJlc3N1cmUodHJhY2tzcnApLAorICAgICAgICBNRihtZiksIFRJSSh0aWkpLCBUUkkodHJpKSwgVExJKHRsaSksIHNjaGVkdWxlREFHKE5VTEwpIHsKKyAgICAgIGlmIChUcmFja3NSZWdQcmVzc3VyZSkgeworICAgICAgICB1bnNpZ25lZCBOdW1SQyA9IFRSSS0+Z2V0TnVtUmVnQ2xhc3NlcygpOworICAgICAgICBSZWdMaW1pdC5yZXNpemUoTnVtUkMpOworICAgICAgICBSZWdQcmVzc3VyZS5yZXNpemUoTnVtUkMpOworICAgICAgICBzdGQ6OmZpbGwoUmVnTGltaXQuYmVnaW4oKSwgUmVnTGltaXQuZW5kKCksIDApOworICAgICAgICBzdGQ6OmZpbGwoUmVnUHJlc3N1cmUuYmVnaW4oKSwgUmVnUHJlc3N1cmUuZW5kKCksIDApOworICAgICAgICBmb3IgKFRhcmdldFJlZ2lzdGVySW5mbzo6cmVnY2xhc3NfaXRlcmF0b3IgSSA9IFRSSS0+cmVnY2xhc3NfYmVnaW4oKSwKKyAgICAgICAgICAgICAgIEUgPSBUUkktPnJlZ2NsYXNzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgICBSZWdMaW1pdFsoKkkpLT5nZXRJRCgpXSA9IHRsaS0+Z2V0UmVnUHJlc3N1cmVMaW1pdCgqSSwgTUYpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGluaXROb2RlcyhzdGQ6OnZlY3RvcjxTVW5pdD4gJnN1bml0cykgeworICAgICAgU1VuaXRzID0gJnN1bml0czsKKyAgICAgIC8vIEFkZCBwc2V1ZG8gZGVwZW5kZW5jeSBlZGdlcyBmb3IgdHdvLWFkZHJlc3Mgbm9kZXMuCisgICAgICBBZGRQc2V1ZG9Ud29BZGRyRGVwcygpOworICAgICAgLy8gUmVyb3V0ZSBlZGdlcyB0byBub2RlcyB3aXRoIG11bHRpcGxlIHVzZXMuCisgICAgICBQcmVzY2hlZHVsZU5vZGVzV2l0aE11bHRpcGxlVXNlcygpOworICAgICAgLy8gQ2FsY3VsYXRlIG5vZGUgcHJpb3JpdGllcy4KKyAgICAgIENhbGN1bGF0ZVNldGhpVWxsbWFuTnVtYmVycygpOworICAgIH0KKworICAgIHZvaWQgYWRkTm9kZShjb25zdCBTVW5pdCAqU1UpIHsKKyAgICAgIHVuc2lnbmVkIFNVU2l6ZSA9IFNldGhpVWxsbWFuTnVtYmVycy5zaXplKCk7CisgICAgICBpZiAoU1VuaXRzLT5zaXplKCkgPiBTVVNpemUpCisgICAgICAgIFNldGhpVWxsbWFuTnVtYmVycy5yZXNpemUoU1VTaXplKjIsIDApOworICAgICAgQ2FsY05vZGVTZXRoaVVsbG1hbk51bWJlcihTVSwgU2V0aGlVbGxtYW5OdW1iZXJzKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZU5vZGUoY29uc3QgU1VuaXQgKlNVKSB7CisgICAgICBTZXRoaVVsbG1hbk51bWJlcnNbU1UtPk5vZGVOdW1dID0gMDsKKyAgICAgIENhbGNOb2RlU2V0aGlVbGxtYW5OdW1iZXIoU1UsIFNldGhpVWxsbWFuTnVtYmVycyk7CisgICAgfQorCisgICAgdm9pZCByZWxlYXNlU3RhdGUoKSB7CisgICAgICBTVW5pdHMgPSAwOworICAgICAgU2V0aGlVbGxtYW5OdW1iZXJzLmNsZWFyKCk7CisgICAgICBzdGQ6OmZpbGwoUmVnUHJlc3N1cmUuYmVnaW4oKSwgUmVnUHJlc3N1cmUuZW5kKCksIDApOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldE5vZGVQcmlvcml0eShjb25zdCBTVW5pdCAqU1UpIGNvbnN0IHsKKyAgICAgIGFzc2VydChTVS0+Tm9kZU51bSA8IFNldGhpVWxsbWFuTnVtYmVycy5zaXplKCkpOworICAgICAgdW5zaWduZWQgT3BjID0gU1UtPmdldE5vZGUoKSA/IFNVLT5nZXROb2RlKCktPmdldE9wY29kZSgpIDogMDsKKyAgICAgIGlmIChPcGMgPT0gSVNEOjpUb2tlbkZhY3RvciB8fCBPcGMgPT0gSVNEOjpDb3B5VG9SZWcpCisgICAgICAgIC8vIENvcHlUb1JlZyBzaG91bGQgYmUgY2xvc2UgdG8gaXRzIHVzZXMgdG8gZmFjaWxpdGF0ZSBjb2FsZXNjaW5nIGFuZAorICAgICAgICAvLyBhdm9pZCBzcGlsbGluZy4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBpZiAoT3BjID09IFRhcmdldE9wY29kZTo6RVhUUkFDVF9TVUJSRUcgfHwKKyAgICAgICAgICBPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpTVUJSRUdfVE9fUkVHIHx8CisgICAgICAgICAgT3BjID09IFRhcmdldE9wY29kZTo6SU5TRVJUX1NVQlJFRykKKyAgICAgICAgLy8gRVhUUkFDVF9TVUJSRUcsIElOU0VSVF9TVUJSRUcsIGFuZCBTVUJSRUdfVE9fUkVHIG5vZGVzIHNob3VsZCBiZQorICAgICAgICAvLyBjbG9zZSB0byB0aGVpciB1c2VzIHRvIGZhY2lsaXRhdGUgY29hbGVzY2luZy4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBpZiAoU1UtPk51bVN1Y2NzID09IDAgJiYgU1UtPk51bVByZWRzICE9IDApCisgICAgICAgIC8vIElmIFNVIGRvZXMgbm90IGhhdmUgYSByZWdpc3RlciB1c2UsIGkuZS4gaXQgZG9lc24ndCBwcm9kdWNlIGEgdmFsdWUKKyAgICAgICAgLy8gdGhhdCB3b3VsZCBiZSBjb25zdW1lZCAoZS5nLiBzdG9yZSksIHRoZW4gaXQgdGVybWluYXRlcyBhIGNoYWluIG9mCisgICAgICAgIC8vIGNvbXB1dGF0aW9uLiAgR2l2ZSBpdCBhIGxhcmdlIFNldGhpVWxsbWFuIG51bWJlciBzbyBpdCB3aWxsIGJlCisgICAgICAgIC8vIHNjaGVkdWxlZCByaWdodCBiZWZvcmUgaXRzIHByZWRlY2Vzc29ycyB0aGF0IGl0IGRvZXNuJ3QgbGVuZ3RoZW4KKyAgICAgICAgLy8gdGhlaXIgbGl2ZSByYW5nZXMuCisgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICBpZiAoU1UtPk51bVByZWRzID09IDAgJiYgU1UtPk51bVN1Y2NzICE9IDApCisgICAgICAgIC8vIElmIFNVIGRvZXMgbm90IGhhdmUgYSByZWdpc3RlciBkZWYsIHNjaGVkdWxlIGl0IGNsb3NlIHRvIGl0cyB1c2VzCisgICAgICAgIC8vIGJlY2F1c2UgaXQgZG9lcyBub3QgbGVuZ3RoZW4gYW55IGxpdmUgcmFuZ2VzLgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHJldHVybiBTZXRoaVVsbG1hbk51bWJlcnNbU1UtPk5vZGVOdW1dOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldE5vZGVPcmRlcmluZyhjb25zdCBTVW5pdCAqU1UpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzY2hlZHVsZURBRy0+REFHLT5HZXRPcmRlcmluZyhTVS0+Z2V0Tm9kZSgpKTsKKyAgICB9CisKKyAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gUXVldWUuZW1wdHkoKTsgfQorICAgIAorICAgIHZvaWQgcHVzaChTVW5pdCAqVSkgeworICAgICAgYXNzZXJ0KCFVLT5Ob2RlUXVldWVJZCAmJiAiTm9kZSBpbiB0aGUgcXVldWUgYWxyZWFkeSIpOworICAgICAgVS0+Tm9kZVF1ZXVlSWQgPSArK0N1clF1ZXVlSWQ7CisgICAgICBRdWV1ZS5wdXNoX2JhY2soVSk7CisgICAgfQorCisgICAgU1VuaXQgKnBvcCgpIHsKKyAgICAgIGlmIChlbXB0eSgpKSByZXR1cm4gTlVMTDsKKyAgICAgIHN0ZDo6dmVjdG9yPFNVbml0ICo+OjppdGVyYXRvciBCZXN0ID0gUXVldWUuYmVnaW4oKTsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8U1VuaXQgKj46Oml0ZXJhdG9yIEkgPSBsbHZtOjpuZXh0KFF1ZXVlLmJlZ2luKCkpLAorICAgICAgICAgICBFID0gUXVldWUuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICBpZiAoUGlja2VyKCpCZXN0LCAqSSkpCisgICAgICAgICAgQmVzdCA9IEk7CisgICAgICBTVW5pdCAqViA9ICpCZXN0OworICAgICAgaWYgKEJlc3QgIT0gcHJpb3IoUXVldWUuZW5kKCkpKQorICAgICAgICBzdGQ6OnN3YXAoKkJlc3QsIFF1ZXVlLmJhY2soKSk7CisgICAgICBRdWV1ZS5wb3BfYmFjaygpOworICAgICAgVi0+Tm9kZVF1ZXVlSWQgPSAwOworICAgICAgcmV0dXJuIFY7CisgICAgfQorCisgICAgdm9pZCByZW1vdmUoU1VuaXQgKlNVKSB7CisgICAgICBhc3NlcnQoIVF1ZXVlLmVtcHR5KCkgJiYgIlF1ZXVlIGlzIGVtcHR5ISIpOworICAgICAgYXNzZXJ0KFNVLT5Ob2RlUXVldWVJZCAhPSAwICYmICJOb3QgaW4gcXVldWUhIik7CisgICAgICBzdGQ6OnZlY3RvcjxTVW5pdCAqPjo6aXRlcmF0b3IgSSA9IHN0ZDo6ZmluZChRdWV1ZS5iZWdpbigpLCBRdWV1ZS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVKTsKKyAgICAgIGlmIChJICE9IHByaW9yKFF1ZXVlLmVuZCgpKSkKKyAgICAgICAgc3RkOjpzd2FwKCpJLCBRdWV1ZS5iYWNrKCkpOworICAgICAgUXVldWUucG9wX2JhY2soKTsKKyAgICAgIFNVLT5Ob2RlUXVldWVJZCA9IDA7CisgICAgfQorCisgICAgYm9vbCBIaWdoUmVnUHJlc3N1cmUoY29uc3QgU1VuaXQgKlNVKSBjb25zdCB7CisgICAgICBpZiAoIVRMSSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBmb3IgKFNVbml0Ojpjb25zdF9wcmVkX2l0ZXJhdG9yIEkgPSBTVS0+UHJlZHMuYmVnaW4oKSxFID0gU1UtPlByZWRzLmVuZCgpOworICAgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgICBpZiAoSS0+aXNDdHJsKCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIFNVbml0ICpQcmVkU1UgPSBJLT5nZXRTVW5pdCgpOworICAgICAgICBjb25zdCBTRE5vZGUgKlBOID0gUHJlZFNVLT5nZXROb2RlKCk7CisgICAgICAgIGlmICghUE4tPmlzTWFjaGluZU9wY29kZSgpKSB7CisgICAgICAgICAgaWYgKFBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlGcm9tUmVnKSB7CisgICAgICAgICAgICBFVlQgVlQgPSBQTi0+Z2V0VmFsdWVUeXBlKDApOworICAgICAgICAgICAgdW5zaWduZWQgUkNJZCA9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NGb3IoVlQpLT5nZXRJRCgpOworICAgICAgICAgICAgdW5zaWduZWQgQ29zdCA9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NDb3N0Rm9yKFZUKTsKKyAgICAgICAgICAgIGlmICgoUmVnUHJlc3N1cmVbUkNJZF0gKyBDb3N0KSA+PSBSZWdMaW1pdFtSQ0lkXSkKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIFBPcGMgPSBQTi0+Z2V0TWFjaGluZU9wY29kZSgpOworICAgICAgICBpZiAoUE9wYyA9PSBUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRikKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKFBPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpFWFRSQUNUX1NVQlJFRykgeworICAgICAgICAgIEVWVCBWVCA9IFBOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgICAgICAgIHVuc2lnbmVkIFJDSWQgPSBUTEktPmdldFJlcFJlZ0NsYXNzRm9yKFZUKS0+Z2V0SUQoKTsKKyAgICAgICAgICB1bnNpZ25lZCBDb3N0ID0gVExJLT5nZXRSZXBSZWdDbGFzc0Nvc3RGb3IoVlQpOworICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaW5jcmVhc2VzIHJlZ2lzdGVyIHByZXNzdXJlIG9mIHRoZSBzcGVjaWZpYyByZWdpc3RlcgorICAgICAgICAgIC8vIGNsYXNzIHRvIHRoZSBwb2ludCB3aGVyZSBpdCB3b3VsZCBjYXVzZSBzcGlsbHMuCisgICAgICAgICAgaWYgKChSZWdQcmVzc3VyZVtSQ0lkXSArIENvc3QpID49IFJlZ0xpbWl0W1JDSWRdKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSBpZiAoUE9wYyA9PSBUYXJnZXRPcGNvZGU6OklOU0VSVF9TVUJSRUcgfHwKKyAgICAgICAgICAgICAgICAgICBQT3BjID09IFRhcmdldE9wY29kZTo6U1VCUkVHX1RPX1JFRykgeworICAgICAgICAgIEVWVCBWVCA9IFBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgICAgICAgdW5zaWduZWQgUkNJZCA9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NGb3IoVlQpLT5nZXRJRCgpOworICAgICAgICAgIHVuc2lnbmVkIENvc3QgPSBUTEktPmdldFJlcFJlZ0NsYXNzQ29zdEZvcihWVCk7CisgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpbmNyZWFzZXMgcmVnaXN0ZXIgcHJlc3N1cmUgb2YgdGhlIHNwZWNpZmljIHJlZ2lzdGVyCisgICAgICAgICAgLy8gY2xhc3MgdG8gdGhlIHBvaW50IHdoZXJlIGl0IHdvdWxkIGNhdXNlIHNwaWxscy4KKyAgICAgICAgICBpZiAoKFJlZ1ByZXNzdXJlW1JDSWRdICsgQ29zdCkgPj0gUmVnTGltaXRbUkNJZF0pCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBOdW1EZWZzID0gVElJLT5nZXQoUE4tPmdldE1hY2hpbmVPcGNvZGUoKSkuZ2V0TnVtRGVmcygpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bURlZnM7ICsraSkgeworICAgICAgICAgIEVWVCBWVCA9IFBOLT5nZXRWYWx1ZVR5cGUoaSk7CisgICAgICAgICAgdW5zaWduZWQgUkNJZCA9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NGb3IoVlQpLT5nZXRJRCgpOworICAgICAgICAgIGlmIChSZWdQcmVzc3VyZVtSQ0lkXSA+PSBSZWdMaW1pdFtSQ0lkXSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBSZWcgcHJlc3N1cmUgYWxyZWFkeSBoaWdoLgorICAgICAgICAgIHVuc2lnbmVkIENvc3QgPSBUTEktPmdldFJlcFJlZ0NsYXNzQ29zdEZvcihWVCk7CisgICAgICAgICAgaWYgKCFQTi0+aGFzQW55VXNlT2ZWYWx1ZShpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaW5jcmVhc2VzIHJlZ2lzdGVyIHByZXNzdXJlIG9mIHRoZSBzcGVjaWZpYyByZWdpc3RlcgorICAgICAgICAgIC8vIGNsYXNzIHRvIHRoZSBwb2ludCB3aGVyZSBpdCB3b3VsZCBjYXVzZSBzcGlsbHMuCisgICAgICAgICAgaWYgKChSZWdQcmVzc3VyZVtSQ0lkXSArIENvc3QpID49IFJlZ0xpbWl0W1JDSWRdKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgU2NoZWR1bGVkTm9kZShTVW5pdCAqU1UpIHsKKyAgICAgIGlmICghVHJhY2tzUmVnUHJlc3N1cmUpCisgICAgICAgIHJldHVybjsKKworICAgICAgY29uc3QgU0ROb2RlICpOID0gU1UtPmdldE5vZGUoKTsKKyAgICAgIGlmICghTi0+aXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICAgICAgaWYgKE4tPmdldE9wY29kZSgpICE9IElTRDo6Q29weVRvUmVnKQorICAgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIE9wYyA9IE4tPmdldE1hY2hpbmVPcGNvZGUoKTsKKyAgICAgICAgaWYgKE9wYyA9PSBUYXJnZXRPcGNvZGU6OkVYVFJBQ1RfU1VCUkVHIHx8CisgICAgICAgICAgICBPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpJTlNFUlRfU1VCUkVHIHx8CisgICAgICAgICAgICBPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpTVUJSRUdfVE9fUkVHIHx8CisgICAgICAgICAgICBPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpSRUdfU0VRVUVOQ0UgfHwKKyAgICAgICAgICAgIE9wYyA9PSBUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRikKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGZvciAoU1VuaXQ6OnByZWRfaXRlcmF0b3IgSSA9IFNVLT5QcmVkcy5iZWdpbigpLCBFID0gU1UtPlByZWRzLmVuZCgpOworICAgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgICBpZiAoSS0+aXNDdHJsKCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIFNVbml0ICpQcmVkU1UgPSBJLT5nZXRTVW5pdCgpOworICAgICAgICBpZiAoUHJlZFNVLT5OdW1TdWNjc0xlZnQgIT0gUHJlZFNVLT5OdW1TdWNjcykKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY29uc3QgU0ROb2RlICpQTiA9IFByZWRTVS0+Z2V0Tm9kZSgpOworICAgICAgICBpZiAoIVBOLT5pc01hY2hpbmVPcGNvZGUoKSkgeworICAgICAgICAgIGlmIChQTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb3B5RnJvbVJlZykgeworICAgICAgICAgICAgRVZUIFZUID0gUE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIFJDSWQgPSBUTEktPmdldFJlcFJlZ0NsYXNzRm9yKFZUKS0+Z2V0SUQoKTsKKyAgICAgICAgICAgIFJlZ1ByZXNzdXJlW1JDSWRdICs9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NDb3N0Rm9yKFZUKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgUE9wYyA9IFBOLT5nZXRNYWNoaW5lT3Bjb2RlKCk7CisgICAgICAgIGlmIChQT3BjID09IFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoUE9wYyA9PSBUYXJnZXRPcGNvZGU6OkVYVFJBQ1RfU1VCUkVHKSB7CisgICAgICAgICAgRVZUIFZUID0gUE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgICAgICAgICAgdW5zaWduZWQgUkNJZCA9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NGb3IoVlQpLT5nZXRJRCgpOworICAgICAgICAgIFJlZ1ByZXNzdXJlW1JDSWRdICs9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NDb3N0Rm9yKFZUKTsKKyAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAKKyAgICAgICAgfSBlbHNlIGlmIChQT3BjID09IFRhcmdldE9wY29kZTo6SU5TRVJUX1NVQlJFRyB8fAorICAgICAgICAgICAgICAgICAgIFBPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpTVUJSRUdfVE9fUkVHKSB7CisgICAgICAgICAgRVZUIFZUID0gUE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgICAgICAgICB1bnNpZ25lZCBSQ0lkID0gVExJLT5nZXRSZXBSZWdDbGFzc0ZvcihWVCktPmdldElEKCk7CisgICAgICAgICAgUmVnUHJlc3N1cmVbUkNJZF0gKz0gVExJLT5nZXRSZXBSZWdDbGFzc0Nvc3RGb3IoVlQpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIE51bURlZnMgPSBUSUktPmdldChQTi0+Z2V0TWFjaGluZU9wY29kZSgpKS5nZXROdW1EZWZzKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRGVmczsgKytpKSB7CisgICAgICAgICAgRVZUIFZUID0gUE4tPmdldFZhbHVlVHlwZShpKTsKKyAgICAgICAgICBpZiAoIVBOLT5oYXNBbnlVc2VPZlZhbHVlKGkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgdW5zaWduZWQgUkNJZCA9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NGb3IoVlQpLT5nZXRJRCgpOworICAgICAgICAgIFJlZ1ByZXNzdXJlW1JDSWRdICs9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NDb3N0Rm9yKFZUKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDaGVjayBmb3IgaXNNYWNoaW5lT3Bjb2RlKCkgYXMgUHJlc2NoZWR1bGVOb2Rlc1dpdGhNdWx0aXBsZVVzZXMoKQorICAgICAgLy8gbWF5IHRyYW5zZmVyIGRhdGEgZGVwZW5kZW5jaWVzIHRvIENvcHlUb1JlZy4KKyAgICAgIGlmIChTVS0+TnVtU3VjY3MgJiYgTi0+aXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICAgICAgdW5zaWduZWQgTnVtRGVmcyA9IFRJSS0+Z2V0KE4tPmdldE1hY2hpbmVPcGNvZGUoKSkuZ2V0TnVtRGVmcygpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bURlZnM7ICsraSkgeworICAgICAgICAgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZShpKTsKKyAgICAgICAgICBpZiAoIU4tPmhhc0FueVVzZU9mVmFsdWUoaSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB1bnNpZ25lZCBSQ0lkID0gVExJLT5nZXRSZXBSZWdDbGFzc0ZvcihWVCktPmdldElEKCk7CisgICAgICAgICAgaWYgKFJlZ1ByZXNzdXJlW1JDSWRdIDwgVExJLT5nZXRSZXBSZWdDbGFzc0Nvc3RGb3IoVlQpKQorICAgICAgICAgICAgLy8gUmVnaXN0ZXIgcHJlc3N1cmUgdHJhY2tpbmcgaXMgaW1wcmVjaXNlLiBUaGlzIGNhbiBoYXBwZW4uCisgICAgICAgICAgICBSZWdQcmVzc3VyZVtSQ0lkXSA9IDA7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgUmVnUHJlc3N1cmVbUkNJZF0gLT0gVExJLT5nZXRSZXBSZWdDbGFzc0Nvc3RGb3IoVlQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGR1bXBSZWdQcmVzc3VyZSgpOworICAgIH0KKworICAgIHZvaWQgVW5zY2hlZHVsZWROb2RlKFNVbml0ICpTVSkgeworICAgICAgaWYgKCFUcmFja3NSZWdQcmVzc3VyZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBjb25zdCBTRE5vZGUgKk4gPSBTVS0+Z2V0Tm9kZSgpOworICAgICAgaWYgKCFOLT5pc01hY2hpbmVPcGNvZGUoKSkgeworICAgICAgICBpZiAoTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpDb3B5VG9SZWcpCisgICAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgT3BjID0gTi0+Z2V0TWFjaGluZU9wY29kZSgpOworICAgICAgICBpZiAoT3BjID09IFRhcmdldE9wY29kZTo6RVhUUkFDVF9TVUJSRUcgfHwKKyAgICAgICAgICAgIE9wYyA9PSBUYXJnZXRPcGNvZGU6OklOU0VSVF9TVUJSRUcgfHwKKyAgICAgICAgICAgIE9wYyA9PSBUYXJnZXRPcGNvZGU6OlNVQlJFR19UT19SRUcgfHwKKyAgICAgICAgICAgIE9wYyA9PSBUYXJnZXRPcGNvZGU6OlJFR19TRVFVRU5DRSB8fAorICAgICAgICAgICAgT3BjID09IFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGKQorICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZm9yIChTVW5pdDo6cHJlZF9pdGVyYXRvciBJID0gU1UtPlByZWRzLmJlZ2luKCksIEUgPSBTVS0+UHJlZHMuZW5kKCk7CisgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAgIGlmIChJLT5pc0N0cmwoKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgU1VuaXQgKlByZWRTVSA9IEktPmdldFNVbml0KCk7CisgICAgICAgIGlmIChQcmVkU1UtPk51bVN1Y2NzTGVmdCAhPSBQcmVkU1UtPk51bVN1Y2NzKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjb25zdCBTRE5vZGUgKlBOID0gUHJlZFNVLT5nZXROb2RlKCk7CisgICAgICAgIGlmICghUE4tPmlzTWFjaGluZU9wY29kZSgpKSB7CisgICAgICAgICAgaWYgKFBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlGcm9tUmVnKSB7CisgICAgICAgICAgICBFVlQgVlQgPSBQTi0+Z2V0VmFsdWVUeXBlKDApOworICAgICAgICAgICAgdW5zaWduZWQgUkNJZCA9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NGb3IoVlQpLT5nZXRJRCgpOworICAgICAgICAgICAgUmVnUHJlc3N1cmVbUkNJZF0gKz0gVExJLT5nZXRSZXBSZWdDbGFzc0Nvc3RGb3IoVlQpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBQT3BjID0gUE4tPmdldE1hY2hpbmVPcGNvZGUoKTsKKyAgICAgICAgaWYgKFBPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChQT3BjID09IFRhcmdldE9wY29kZTo6RVhUUkFDVF9TVUJSRUcpIHsKKyAgICAgICAgICBFVlQgVlQgPSBQTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgICAgICB1bnNpZ25lZCBSQ0lkID0gVExJLT5nZXRSZXBSZWdDbGFzc0ZvcihWVCktPmdldElEKCk7CisgICAgICAgICAgUmVnUHJlc3N1cmVbUkNJZF0gKz0gVExJLT5nZXRSZXBSZWdDbGFzc0Nvc3RGb3IoVlQpOworICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKFBPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpJTlNFUlRfU1VCUkVHIHx8CisgICAgICAgICAgICAgICAgICAgUE9wYyA9PSBUYXJnZXRPcGNvZGU6OlNVQlJFR19UT19SRUcpIHsKKyAgICAgICAgICBFVlQgVlQgPSBQTi0+Z2V0VmFsdWVUeXBlKDApOworICAgICAgICAgIHVuc2lnbmVkIFJDSWQgPSBUTEktPmdldFJlcFJlZ0NsYXNzRm9yKFZUKS0+Z2V0SUQoKTsKKyAgICAgICAgICBSZWdQcmVzc3VyZVtSQ0lkXSArPSBUTEktPmdldFJlcFJlZ0NsYXNzQ29zdEZvcihWVCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgTnVtRGVmcyA9IFRJSS0+Z2V0KFBOLT5nZXRNYWNoaW5lT3Bjb2RlKCkpLmdldE51bURlZnMoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1EZWZzOyArK2kpIHsKKyAgICAgICAgICBFVlQgVlQgPSBQTi0+Z2V0VmFsdWVUeXBlKGkpOworICAgICAgICAgIGlmICghUE4tPmhhc0FueVVzZU9mVmFsdWUoaSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB1bnNpZ25lZCBSQ0lkID0gVExJLT5nZXRSZXBSZWdDbGFzc0ZvcihWVCktPmdldElEKCk7CisgICAgICAgICAgaWYgKFJlZ1ByZXNzdXJlW1JDSWRdIDwgVExJLT5nZXRSZXBSZWdDbGFzc0Nvc3RGb3IoVlQpKQorICAgICAgICAgICAgLy8gUmVnaXN0ZXIgcHJlc3N1cmUgdHJhY2tpbmcgaXMgaW1wcmVjaXNlLiBUaGlzIGNhbiBoYXBwZW4uCisgICAgICAgICAgICBSZWdQcmVzc3VyZVtSQ0lkXSA9IDA7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgUmVnUHJlc3N1cmVbUkNJZF0gLT0gVExJLT5nZXRSZXBSZWdDbGFzc0Nvc3RGb3IoVlQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGZvciBpc01hY2hpbmVPcGNvZGUoKSBhcyBQcmVzY2hlZHVsZU5vZGVzV2l0aE11bHRpcGxlVXNlcygpCisgICAgICAvLyBtYXkgdHJhbnNmZXIgZGF0YSBkZXBlbmRlbmNpZXMgdG8gQ29weVRvUmVnLgorICAgICAgaWYgKFNVLT5OdW1TdWNjcyAmJiBOLT5pc01hY2hpbmVPcGNvZGUoKSkgeworICAgICAgICB1bnNpZ25lZCBOdW1EZWZzID0gVElJLT5nZXQoTi0+Z2V0TWFjaGluZU9wY29kZSgpKS5nZXROdW1EZWZzKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IE51bURlZnMsIGUgPSBOLT5nZXROdW1WYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoaSk7CisgICAgICAgICAgaWYgKFZUID09IE1WVDo6RmxhZyB8fCBWVCA9PSBNVlQ6Ok90aGVyKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgaWYgKCFOLT5oYXNBbnlVc2VPZlZhbHVlKGkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgdW5zaWduZWQgUkNJZCA9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NGb3IoVlQpLT5nZXRJRCgpOworICAgICAgICAgIFJlZ1ByZXNzdXJlW1JDSWRdICs9IFRMSS0+Z2V0UmVwUmVnQ2xhc3NDb3N0Rm9yKFZUKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBkdW1wUmVnUHJlc3N1cmUoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNjaGVkdWxlREFHKFNjaGVkdWxlREFHUlJMaXN0ICpzY2hlZHVsZURhZykgeyAKKyAgICAgIHNjaGVkdWxlREFHID0gc2NoZWR1bGVEYWc7IAorICAgIH0KKworICAgIHZvaWQgZHVtcFJlZ1ByZXNzdXJlKCkgY29uc3QgeworICAgICAgZm9yIChUYXJnZXRSZWdpc3RlckluZm86OnJlZ2NsYXNzX2l0ZXJhdG9yIEkgPSBUUkktPnJlZ2NsYXNzX2JlZ2luKCksCisgICAgICAgICAgICAgRSA9IFRSSS0+cmVnY2xhc3NfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gKkk7CisgICAgICAgIHVuc2lnbmVkIElkID0gUkMtPmdldElEKCk7CisgICAgICAgIHVuc2lnbmVkIFJQID0gUmVnUHJlc3N1cmVbSWRdOworICAgICAgICBpZiAoIVJQKSBjb250aW51ZTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8IFJDLT5nZXROYW1lKCkgPDwgIjogIiA8PCBSUCA8PCAiIC8gIiA8PCBSZWdMaW1pdFtJZF0KKyAgICAgICAgICAgICAgPDwgJ1xuJyk7CisgICAgICB9CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBib29sIGNhbkNsb2JiZXIoY29uc3QgU1VuaXQgKlNVLCBjb25zdCBTVW5pdCAqT3ApOworICAgIHZvaWQgQWRkUHNldWRvVHdvQWRkckRlcHMoKTsKKyAgICB2b2lkIFByZXNjaGVkdWxlTm9kZXNXaXRoTXVsdGlwbGVVc2VzKCk7CisgICAgdm9pZCBDYWxjdWxhdGVTZXRoaVVsbG1hbk51bWJlcnMoKTsKKyAgfTsKKworICB0eXBlZGVmIFJlZ1JlZHVjdGlvblByaW9yaXR5UXVldWU8YnVfbHNfcnJfc29ydD4KKyAgICBCVVJlZ1JlZHVjdGlvblByaW9yaXR5UXVldWU7CisKKyAgdHlwZWRlZiBSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlPHRkX2xzX3JyX3NvcnQ+CisgICAgVERSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlOworCisgIHR5cGVkZWYgUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZTxzcmNfbHNfcnJfc29ydD4KKyAgICBTcmNSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlOworCisgIHR5cGVkZWYgUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZTxoeWJyaWRfbHNfcnJfc29ydD4KKyAgICBIeWJyaWRCVVJSUHJpb3JpdHlRdWV1ZTsKKworICB0eXBlZGVmIFJlZ1JlZHVjdGlvblByaW9yaXR5UXVldWU8aWxwX2xzX3JyX3NvcnQ+CisgICAgSUxQQlVSUlByaW9yaXR5UXVldWU7Cit9CisKKy8vLyBjbG9zZXN0U3VjYyAtIFJldHVybnMgdGhlIHNjaGVkdWxlZCBjeWNsZSBvZiB0aGUgc3VjY2Vzc29yIHdoaWNoIGlzCisvLy8gY2xvc2VzdCB0byB0aGUgY3VycmVudCBjeWNsZS4KK3N0YXRpYyB1bnNpZ25lZCBjbG9zZXN0U3VjYyhjb25zdCBTVW5pdCAqU1UpIHsKKyAgdW5zaWduZWQgTWF4SGVpZ2h0ID0gMDsKKyAgZm9yIChTVW5pdDo6Y29uc3Rfc3VjY19pdGVyYXRvciBJID0gU1UtPlN1Y2NzLmJlZ2luKCksIEUgPSBTVS0+U3VjY3MuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aXNDdHJsKCkpIGNvbnRpbnVlOyAgLy8gaWdub3JlIGNoYWluIHN1Y2NzCisgICAgdW5zaWduZWQgSGVpZ2h0ID0gSS0+Z2V0U1VuaXQoKS0+Z2V0SGVpZ2h0KCk7CisgICAgLy8gSWYgdGhlcmUgYXJlIGJ1bmNoIG9mIENvcHlUb1JlZ3Mgc3RhY2tlZCB1cCwgdGhleSBzaG91bGQgYmUgY29uc2lkZXJlZAorICAgIC8vIHRvIGJlIGF0IHRoZSBzYW1lIHBvc2l0aW9uLgorICAgIGlmIChJLT5nZXRTVW5pdCgpLT5nZXROb2RlKCkgJiYKKyAgICAgICAgSS0+Z2V0U1VuaXQoKS0+Z2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlUb1JlZykKKyAgICAgIEhlaWdodCA9IGNsb3Nlc3RTdWNjKEktPmdldFNVbml0KCkpKzE7CisgICAgaWYgKEhlaWdodCA+IE1heEhlaWdodCkKKyAgICAgIE1heEhlaWdodCA9IEhlaWdodDsKKyAgfQorICByZXR1cm4gTWF4SGVpZ2h0OworfQorCisvLy8gY2FsY01heFNjcmF0Y2hlcyAtIFJldHVybnMgYW4gY29zdCBlc3RpbWF0ZSBvZiB0aGUgd29yc2UgY2FzZSByZXF1aXJlbWVudAorLy8vIGZvciBzY3JhdGNoIHJlZ2lzdGVycywgaS5lLiBudW1iZXIgb2YgZGF0YSBkZXBlbmRlbmNpZXMuCitzdGF0aWMgdW5zaWduZWQgY2FsY01heFNjcmF0Y2hlcyhjb25zdCBTVW5pdCAqU1UpIHsKKyAgdW5zaWduZWQgU2NyYXRjaGVzID0gMDsKKyAgZm9yIChTVW5pdDo6Y29uc3RfcHJlZF9pdGVyYXRvciBJID0gU1UtPlByZWRzLmJlZ2luKCksIEUgPSBTVS0+UHJlZHMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aXNDdHJsKCkpIGNvbnRpbnVlOyAgLy8gaWdub3JlIGNoYWluIHByZWRzCisgICAgU2NyYXRjaGVzKys7CisgIH0KKyAgcmV0dXJuIFNjcmF0Y2hlczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFJSU29ydD4KK3N0YXRpYyBib29sIEJVUlJTb3J0KGNvbnN0IFNVbml0ICpsZWZ0LCBjb25zdCBTVW5pdCAqcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlPFJSU29ydD4gKlNQUSkgeworICB1bnNpZ25lZCBMUHJpb3JpdHkgPSBTUFEtPmdldE5vZGVQcmlvcml0eShsZWZ0KTsKKyAgdW5zaWduZWQgUlByaW9yaXR5ID0gU1BRLT5nZXROb2RlUHJpb3JpdHkocmlnaHQpOworICBpZiAoTFByaW9yaXR5ICE9IFJQcmlvcml0eSkKKyAgICByZXR1cm4gTFByaW9yaXR5ID4gUlByaW9yaXR5OworCisgIC8vIFRyeSBzY2hlZHVsZSBkZWYgKyB1c2UgY2xvc2VyIHdoZW4gU2V0aGktVWxsbWFuIG51bWJlcnMgYXJlIHRoZSBzYW1lLgorICAvLyBlLmcuCisgIC8vIHQxID0gb3AgdDIsIGMxCisgIC8vIHQzID0gb3AgdDQsIGMyCisgIC8vCisgIC8vIGFuZCB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyBhcmUgYm90aCByZWFkeS4KKyAgLy8gdDIgPSBvcCBjMworICAvLyB0NCA9IG9wIGM0CisgIC8vCisgIC8vIFRoZW4gc2NoZWR1bGUgdDIgPSBvcCBmaXJzdC4KKyAgLy8gaS5lLgorICAvLyB0NCA9IG9wIGM0CisgIC8vIHQyID0gb3AgYzMKKyAgLy8gdDEgPSBvcCB0MiwgYzEKKyAgLy8gdDMgPSBvcCB0NCwgYzIKKyAgLy8KKyAgLy8gVGhpcyBjcmVhdGVzIG1vcmUgc2hvcnQgbGl2ZSBpbnRlcnZhbHMuCisgIHVuc2lnbmVkIExEaXN0ID0gY2xvc2VzdFN1Y2MobGVmdCk7CisgIHVuc2lnbmVkIFJEaXN0ID0gY2xvc2VzdFN1Y2MocmlnaHQpOworICBpZiAoTERpc3QgIT0gUkRpc3QpCisgICAgcmV0dXJuIExEaXN0IDwgUkRpc3Q7CisKKyAgLy8gSG93IG1hbnkgcmVnaXN0ZXJzIGJlY29tZXMgbGl2ZSB3aGVuIHRoZSBub2RlIGlzIHNjaGVkdWxlZC4KKyAgdW5zaWduZWQgTFNjcmF0Y2ggPSBjYWxjTWF4U2NyYXRjaGVzKGxlZnQpOworICB1bnNpZ25lZCBSU2NyYXRjaCA9IGNhbGNNYXhTY3JhdGNoZXMocmlnaHQpOworICBpZiAoTFNjcmF0Y2ggIT0gUlNjcmF0Y2gpCisgICAgcmV0dXJuIExTY3JhdGNoID4gUlNjcmF0Y2g7CisKKyAgaWYgKGxlZnQtPmdldEhlaWdodCgpICE9IHJpZ2h0LT5nZXRIZWlnaHQoKSkKKyAgICByZXR1cm4gbGVmdC0+Z2V0SGVpZ2h0KCkgPiByaWdodC0+Z2V0SGVpZ2h0KCk7CisgIAorICBpZiAobGVmdC0+Z2V0RGVwdGgoKSAhPSByaWdodC0+Z2V0RGVwdGgoKSkKKyAgICByZXR1cm4gbGVmdC0+Z2V0RGVwdGgoKSA8IHJpZ2h0LT5nZXREZXB0aCgpOworCisgIGFzc2VydChsZWZ0LT5Ob2RlUXVldWVJZCAmJiByaWdodC0+Tm9kZVF1ZXVlSWQgJiYgCisgICAgICAgICAiTm9kZVF1ZXVlSWQgY2Fubm90IGJlIHplcm8iKTsKKyAgcmV0dXJuIChsZWZ0LT5Ob2RlUXVldWVJZCA+IHJpZ2h0LT5Ob2RlUXVldWVJZCk7Cit9CisKKy8vIEJvdHRvbSB1cAorYm9vbCBidV9sc19ycl9zb3J0OjpvcGVyYXRvcigpKGNvbnN0IFNVbml0ICpsZWZ0LCBjb25zdCBTVW5pdCAqcmlnaHQpIGNvbnN0IHsKKyAgcmV0dXJuIEJVUlJTb3J0KGxlZnQsIHJpZ2h0LCBTUFEpOworfQorCisvLyBTb3VyY2Ugb3JkZXIsIG90aGVyd2lzZSBib3R0b20gdXAuCitib29sIHNyY19sc19ycl9zb3J0OjpvcGVyYXRvcigpKGNvbnN0IFNVbml0ICpsZWZ0LCBjb25zdCBTVW5pdCAqcmlnaHQpIGNvbnN0IHsKKyAgdW5zaWduZWQgTE9yZGVyID0gU1BRLT5nZXROb2RlT3JkZXJpbmcobGVmdCk7CisgIHVuc2lnbmVkIFJPcmRlciA9IFNQUS0+Z2V0Tm9kZU9yZGVyaW5nKHJpZ2h0KTsKKworICAvLyBQcmVmZXIgYW4gb3JkZXJpbmcgd2hlcmUgdGhlIGxvd2VyIHRoZSBub24temVybyBvcmRlciBudW1iZXIsIHRoZSBoaWdoZXIKKyAgLy8gdGhlIHByZWZlcmVuY2UuCisgIGlmICgoTE9yZGVyIHx8IFJPcmRlcikgJiYgTE9yZGVyICE9IFJPcmRlcikKKyAgICByZXR1cm4gTE9yZGVyICE9IDAgJiYgKExPcmRlciA8IFJPcmRlciB8fCBST3JkZXIgPT0gMCk7CisKKyAgcmV0dXJuIEJVUlJTb3J0KGxlZnQsIHJpZ2h0LCBTUFEpOworfQorCitib29sIGh5YnJpZF9sc19ycl9zb3J0OjpvcGVyYXRvcigpKGNvbnN0IFNVbml0ICpsZWZ0LCBjb25zdCBTVW5pdCAqcmlnaHQpIGNvbnN0eworICBib29sIExIaWdoID0gU1BRLT5IaWdoUmVnUHJlc3N1cmUobGVmdCk7CisgIGJvb2wgUkhpZ2ggPSBTUFEtPkhpZ2hSZWdQcmVzc3VyZShyaWdodCk7CisgIC8vIEF2b2lkIGNhdXNpbmcgc3BpbGxzLiBJZiByZWdpc3RlciBwcmVzc3VyZSBpcyBoaWdoLCBzY2hlZHVsZSBmb3IKKyAgLy8gcmVnaXN0ZXIgcHJlc3N1cmUgcmVkdWN0aW9uLgorICBpZiAoTEhpZ2ggJiYgIVJIaWdoKQorICAgIHJldHVybiB0cnVlOworICBlbHNlIGlmICghTEhpZ2ggJiYgUkhpZ2gpCisgICAgcmV0dXJuIGZhbHNlOworICBlbHNlIGlmICghTEhpZ2ggJiYgIVJIaWdoKSB7CisgICAgLy8gTG93IHJlZ2lzdGVyIHByZXNzdXJlIHNpdHVhdGlvbiwgc2NoZWR1bGUgZm9yIGxhdGVuY3kgaWYgcG9zc2libGUuCisgICAgYm9vbCBMU3RhbGwgPSBsZWZ0LT5TY2hlZHVsaW5nUHJlZiA9PSBTY2hlZDo6TGF0ZW5jeSAmJgorICAgICAgU1BRLT5nZXRDdXJDeWNsZSgpIDwgbGVmdC0+Z2V0SGVpZ2h0KCk7CisgICAgYm9vbCBSU3RhbGwgPSByaWdodC0+U2NoZWR1bGluZ1ByZWYgPT0gU2NoZWQ6OkxhdGVuY3kgJiYKKyAgICAgIFNQUS0+Z2V0Q3VyQ3ljbGUoKSA8IHJpZ2h0LT5nZXRIZWlnaHQoKTsKKyAgICAvLyBJZiBzY2hlZHVsaW5nIG9uZSBvZiB0aGUgbm9kZSB3aWxsIGNhdXNlIGEgcGlwZWxpbmUgc3RhbGwsIGRlbGF5IGl0LgorICAgIC8vIElmIHNjaGVkdWxpbmcgZWl0aGVyIG9uZSBvZiB0aGUgbm9kZSB3aWxsIGNhdXNlIGEgcGlwZWxpbmUgc3RhbGwsIHNvcnQKKyAgICAvLyB0aGVtIGFjY29yZGluZyB0byB0aGVpciBoZWlnaHQuCisgICAgLy8gSWYgbmVpdGhlciB3aWxsIGNhdXNlIGEgcGlwZWxpbmUgc3RhbGwsIHRyeSB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUuCisgICAgaWYgKExTdGFsbCkgeworICAgICAgaWYgKCFSU3RhbGwpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGxlZnQtPmdldEhlaWdodCgpICE9IHJpZ2h0LT5nZXRIZWlnaHQoKSkKKyAgICAgICAgcmV0dXJuIGxlZnQtPmdldEhlaWdodCgpID4gcmlnaHQtPmdldEhlaWdodCgpOworICAgIH0gZWxzZSBpZiAoUlN0YWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgZWl0aGVyIG5vZGUgaXMgc2NoZWR1bGluZyBmb3IgbGF0ZW5jeSwgc29ydCB0aGVtIGJ5IGhlaWdodCBhbmQgbGF0ZW5jeQorICAgIC8vIGZpcnN0LgorICAgIGlmIChsZWZ0LT5TY2hlZHVsaW5nUHJlZiA9PSBTY2hlZDo6TGF0ZW5jeSB8fAorICAgICAgICByaWdodC0+U2NoZWR1bGluZ1ByZWYgPT0gU2NoZWQ6OkxhdGVuY3kpIHsKKyAgICAgIGlmIChsZWZ0LT5nZXRIZWlnaHQoKSAhPSByaWdodC0+Z2V0SGVpZ2h0KCkpCisgICAgICAgIHJldHVybiBsZWZ0LT5nZXRIZWlnaHQoKSA+IHJpZ2h0LT5nZXRIZWlnaHQoKTsKKyAgICAgIGlmIChsZWZ0LT5MYXRlbmN5ICE9IHJpZ2h0LT5MYXRlbmN5KQorICAgICAgICByZXR1cm4gbGVmdC0+TGF0ZW5jeSA+IHJpZ2h0LT5MYXRlbmN5OworICAgIH0KKyAgfQorCisgIHJldHVybiBCVVJSU29ydChsZWZ0LCByaWdodCwgU1BRKTsKK30KKworYm9vbCBpbHBfbHNfcnJfc29ydDo6b3BlcmF0b3IoKShjb25zdCBTVW5pdCAqbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1VuaXQgKnJpZ2h0KSBjb25zdCB7CisgIGJvb2wgTEhpZ2ggPSBTUFEtPkhpZ2hSZWdQcmVzc3VyZShsZWZ0KTsKKyAgYm9vbCBSSGlnaCA9IFNQUS0+SGlnaFJlZ1ByZXNzdXJlKHJpZ2h0KTsKKyAgLy8gQXZvaWQgY2F1c2luZyBzcGlsbHMuIElmIHJlZ2lzdGVyIHByZXNzdXJlIGlzIGhpZ2gsIHNjaGVkdWxlIGZvcgorICAvLyByZWdpc3RlciBwcmVzc3VyZSByZWR1Y3Rpb24uCisgIGlmIChMSGlnaCAmJiAhUkhpZ2gpCisgICAgcmV0dXJuIHRydWU7CisgIGVsc2UgaWYgKCFMSGlnaCAmJiBSSGlnaCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGVsc2UgaWYgKCFMSGlnaCAmJiAhUkhpZ2gpIHsKKyAgICAvLyBMb3cgcmVnaXN0ZXIgcHJlc3N1cmUgc2l0dWF0aW9uLCBzY2hlZHVsZSB0byBtYXhpbWl6ZSBpbnN0cnVjdGlvbiBsZXZlbAorICAgIC8vIHBhcmFsbGVsaXNtLgorICAgIGlmIChsZWZ0LT5OdW1QcmVkcyA+IHJpZ2h0LT5OdW1QcmVkcykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlIGlmIChsZWZ0LT5OdW1QcmVkcyA8IHJpZ2h0LT5OdW1QcmVkcykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBCVVJSU29ydChsZWZ0LCByaWdodCwgU1BRKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgU0Y+Citib29sCitSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlPFNGPjo6Y2FuQ2xvYmJlcihjb25zdCBTVW5pdCAqU1UsIGNvbnN0IFNVbml0ICpPcCkgeworICBpZiAoU1UtPmlzVHdvQWRkcmVzcykgeworICAgIHVuc2lnbmVkIE9wYyA9IFNVLT5nZXROb2RlKCktPmdldE1hY2hpbmVPcGNvZGUoKTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IFRJSS0+Z2V0KE9wYyk7CisgICAgdW5zaWduZWQgTnVtUmVzID0gVElELmdldE51bURlZnMoKTsKKyAgICB1bnNpZ25lZCBOdW1PcHMgPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKSAtIE51bVJlczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bU9wczsgKytpKSB7CisgICAgICBpZiAoVElELmdldE9wZXJhbmRDb25zdHJhaW50KGkrTnVtUmVzLCBUT0k6OlRJRURfVE8pICE9IC0xKSB7CisgICAgICAgIFNETm9kZSAqRFUgPSBTVS0+Z2V0Tm9kZSgpLT5nZXRPcGVyYW5kKGkpLmdldE5vZGUoKTsKKyAgICAgICAgaWYgKERVLT5nZXROb2RlSWQoKSAhPSAtMSAmJgorICAgICAgICAgICAgT3AtPk9yaWdOb2RlID09ICYoKlNVbml0cylbRFUtPmdldE5vZGVJZCgpXSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaGFzQ29weVRvUmVnVXNlIC0gUmV0dXJuIHRydWUgaWYgU1UgaGFzIGEgdmFsdWUgc3VjY2Vzc29yIHRoYXQgaXMgYQorLy8vIENvcHlUb1JlZyBub2RlLgorc3RhdGljIGJvb2wgaGFzQ29weVRvUmVnVXNlKGNvbnN0IFNVbml0ICpTVSkgeworICBmb3IgKFNVbml0Ojpjb25zdF9zdWNjX2l0ZXJhdG9yIEkgPSBTVS0+U3VjY3MuYmVnaW4oKSwgRSA9IFNVLT5TdWNjcy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChJLT5pc0N0cmwoKSkgY29udGludWU7CisgICAgY29uc3QgU1VuaXQgKlN1Y2NTVSA9IEktPmdldFNVbml0KCk7CisgICAgaWYgKFN1Y2NTVS0+Z2V0Tm9kZSgpICYmIFN1Y2NTVS0+Z2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlUb1JlZykKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGNhbkNsb2JiZXJQaHlzUmVnRGVmcyAtIFRydWUgaWYgU1Ugd291bGQgY2xvYmJlciBvbmUgb2YgU3VjY1NVJ3MKKy8vLyBwaHlzaWNhbCByZWdpc3RlciBkZWZzLgorc3RhdGljIGJvb2wgY2FuQ2xvYmJlclBoeXNSZWdEZWZzKGNvbnN0IFNVbml0ICpTdWNjU1UsIGNvbnN0IFNVbml0ICpTVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgeworICBTRE5vZGUgKk4gPSBTdWNjU1UtPmdldE5vZGUoKTsKKyAgdW5zaWduZWQgTnVtRGVmcyA9IFRJSS0+Z2V0KE4tPmdldE1hY2hpbmVPcGNvZGUoKSkuZ2V0TnVtRGVmcygpOworICBjb25zdCB1bnNpZ25lZCAqSW1wRGVmcyA9IFRJSS0+Z2V0KE4tPmdldE1hY2hpbmVPcGNvZGUoKSkuZ2V0SW1wbGljaXREZWZzKCk7CisgIGFzc2VydChJbXBEZWZzICYmICJDYWxsZXIgc2hvdWxkIGNoZWNrIGhhc1BoeXNSZWdEZWZzIik7CisgIGZvciAoY29uc3QgU0ROb2RlICpTVU5vZGUgPSBTVS0+Z2V0Tm9kZSgpOyBTVU5vZGU7CisgICAgICAgU1VOb2RlID0gU1VOb2RlLT5nZXRGbGFnZ2VkTm9kZSgpKSB7CisgICAgaWYgKCFTVU5vZGUtPmlzTWFjaGluZU9wY29kZSgpKQorICAgICAgY29udGludWU7CisgICAgY29uc3QgdW5zaWduZWQgKlNVSW1wRGVmcyA9CisgICAgICBUSUktPmdldChTVU5vZGUtPmdldE1hY2hpbmVPcGNvZGUoKSkuZ2V0SW1wbGljaXREZWZzKCk7CisgICAgaWYgKCFTVUltcERlZnMpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gTnVtRGVmcywgZSA9IE4tPmdldE51bVZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgICAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKGkpOworICAgICAgaWYgKFZUID09IE1WVDo6RmxhZyB8fCBWVCA9PSBNVlQ6Ok90aGVyKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmICghTi0+aGFzQW55VXNlT2ZWYWx1ZShpKSkKKyAgICAgICAgY29udGludWU7CisgICAgICB1bnNpZ25lZCBSZWcgPSBJbXBEZWZzW2kgLSBOdW1EZWZzXTsKKyAgICAgIGZvciAoOypTVUltcERlZnM7ICsrU1VJbXBEZWZzKSB7CisgICAgICAgIHVuc2lnbmVkIFNVUmVnID0gKlNVSW1wRGVmczsKKyAgICAgICAgaWYgKFRSSS0+cmVnc092ZXJsYXAoUmVnLCBTVVJlZykpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFByZXNjaGVkdWxlTm9kZXNXaXRoTXVsdGlwbGVVc2VzIC0gTm9kZXMgd2l0aCBtdWx0aXBsZSB1c2VzCisvLy8gYXJlIG5vdCBoYW5kbGVkIHdlbGwgYnkgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgcHJlc3N1cmUgcmVkdWN0aW9uCisvLy8gaGV1cmlzdGljcy4gV2hlbiBwcmVzZW50ZWQgd2l0aCBjb2RlIGxpa2UgdGhpczoKKy8vLworLy8vICAgICAgTgorLy8vICAgIC8gfAorLy8vICAgLyAgfAorLy8vICBVICBzdG9yZQorLy8vICB8CisvLy8gLi4uCisvLy8KKy8vLyB0aGUgaGV1cmlzdGljcyB0ZW5kIHRvIHB1c2ggdGhlIHN0b3JlIHVwLCBidXQgc2luY2UgdGhlCisvLy8gb3BlcmFuZCBvZiB0aGUgc3RvcmUgaGFzIGFub3RoZXIgdXNlIChVKSwgdGhpcyB3b3VsZCBpbmNyZWFzZQorLy8vIHRoZSBsZW5ndGggb2YgdGhhdCBvdGhlciB1c2UgKHRoZSBVLT5OIGVkZ2UpLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIGNvZGUgbGlrZSB0aGUgYWJvdmUgdG8gcm91dGUgVSdzCisvLy8gZGVwZW5kZW5jZSB0aHJvdWdoIHRoZSBzdG9yZSB3aGVuIHBvc3NpYmxlLCBsaWtlIHRoaXM6CisvLy8KKy8vLyAgICAgIE4KKy8vLyAgICAgIHx8CisvLy8gICAgICB8fAorLy8vICAgICBzdG9yZQorLy8vICAgICAgIHwKKy8vLyAgICAgICBVCisvLy8gICAgICAgfAorLy8vICAgICAgLi4uCisvLy8KKy8vLyBUaGlzIHJlc3VsdHMgaW4gdGhlIHN0b3JlIGJlaW5nIHNjaGVkdWxlZCBpbW1lZGlhdGVseQorLy8vIGFmdGVyIE4sIHdoaWNoIHNob3J0ZW5zIHRoZSBVLT5OIGxpdmUgcmFuZ2UsIHJlZHVjaW5nCisvLy8gcmVnaXN0ZXIgcHJlc3N1cmUuCisvLy8KK3RlbXBsYXRlPGNsYXNzIFNGPgordm9pZCBSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlPFNGPjo6UHJlc2NoZWR1bGVOb2Rlc1dpdGhNdWx0aXBsZVVzZXMoKSB7CisgIC8vIFZpc2l0IGFsbCB0aGUgbm9kZXMgaW4gdG9wb2xvZ2ljYWwgb3JkZXIsIHdvcmtpbmcgdG9wLWRvd24uCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVW5pdHMtPnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBTVW5pdCAqU1UgPSAmKCpTVW5pdHMpW2ldOworICAgIC8vIEZvciBub3csIG9ubHkgbG9vayBhdCBub2RlcyB3aXRoIG5vIGRhdGEgc3VjY2Vzc29ycywgc3VjaCBhcyBzdG9yZXMuCisgICAgLy8gVGhlc2UgYXJlIGVzcGVjaWFsbHkgaW1wb3J0YW50LCBkdWUgdG8gdGhlIGhldXJpc3RpY3MgaW4KKyAgICAvLyBnZXROb2RlUHJpb3JpdHkgZm9yIG5vZGVzIHdpdGggbm8gZGF0YSBzdWNjZXNzb3JzLgorICAgIGlmIChTVS0+TnVtU3VjY3MgIT0gMCkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIEZvciBub3csIG9ubHkgbG9vayBhdCBub2RlcyB3aXRoIGV4YWN0bHkgb25lIGRhdGEgcHJlZGVjZXNzb3IuCisgICAgaWYgKFNVLT5OdW1QcmVkcyAhPSAxKQorICAgICAgY29udGludWU7CisgICAgLy8gQXZvaWQgcHJlc2NoZWR1bGluZyBjb3BpZXMgdG8gdmlydHVhbCByZWdpc3RlcnMsIHdoaWNoIGRvbid0IGJlaGF2ZQorICAgIC8vIGxpa2Ugb3RoZXIgbm9kZXMgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Ygc2NoZWR1bGluZyBoZXVyaXN0aWNzLgorICAgIGlmIChTRE5vZGUgKk4gPSBTVS0+Z2V0Tm9kZSgpKQorICAgICAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6Q29weVRvUmVnICYmCisgICAgICAgICAgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcgorICAgICAgICAgICAgKGNhc3Q8UmVnaXN0ZXJTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpLT5nZXRSZWcoKSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgLy8gTG9jYXRlIHRoZSBzaW5nbGUgZGF0YSBwcmVkZWNlc3Nvci4KKyAgICBTVW5pdCAqUHJlZFNVID0gMDsKKyAgICBmb3IgKFNVbml0Ojpjb25zdF9wcmVkX2l0ZXJhdG9yIElJID0gU1UtPlByZWRzLmJlZ2luKCksCisgICAgICAgICBFRSA9IFNVLT5QcmVkcy5lbmQoKTsgSUkgIT0gRUU7ICsrSUkpCisgICAgICBpZiAoIUlJLT5pc0N0cmwoKSkgeworICAgICAgICBQcmVkU1UgPSBJSS0+Z2V0U1VuaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgYXNzZXJ0KFByZWRTVSk7CisKKyAgICAvLyBEb24ndCByZXdyaXRlIGVkZ2VzIHRoYXQgY2FycnkgcGh5c3JlZ3MsIGJlY2F1c2UgdGhhdCByZXF1aXJlcyBhZGRpdGlvbmFsCisgICAgLy8gc3VwcG9ydCBpbmZyYXN0cnVjdHVyZS4KKyAgICBpZiAoUHJlZFNVLT5oYXNQaHlzUmVnRGVmcykKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIFNob3J0LWNpcmN1aXQgdGhlIGNhc2Ugd2hlcmUgU1UgaXMgUHJlZFNVJ3Mgb25seSBkYXRhIHN1Y2Nlc3Nvci4KKyAgICBpZiAoUHJlZFNVLT5OdW1TdWNjcyA9PSAxKQorICAgICAgY29udGludWU7CisgICAgLy8gQXZvaWQgcHJlc2NoZWR1bGluZyB0byBjb3BpZXMgZnJvbSB2aXJ0dWFsIHJlZ2lzdGVycywgd2hpY2ggZG9uJ3QgYmVoYXZlCisgICAgLy8gbGlrZSBvdGhlciBub2RlcyBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBzY2hlZHVsaW5nIC8vIGhldXJpc3RpY3MuCisgICAgaWYgKFNETm9kZSAqTiA9IFNVLT5nZXROb2RlKCkpCisgICAgICBpZiAoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb3B5RnJvbVJlZyAmJgorICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIKKyAgICAgICAgICAgIChjYXN0PFJlZ2lzdGVyU0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKS0+Z2V0UmVnKCkpKQorICAgICAgICBjb250aW51ZTsKKworICAgIC8vIFBlcmZvcm0gY2hlY2tzIG9uIHRoZSBzdWNjZXNzb3JzIG9mIFByZWRTVS4KKyAgICBmb3IgKFNVbml0Ojpjb25zdF9zdWNjX2l0ZXJhdG9yIElJID0gUHJlZFNVLT5TdWNjcy5iZWdpbigpLAorICAgICAgICAgRUUgPSBQcmVkU1UtPlN1Y2NzLmVuZCgpOyBJSSAhPSBFRTsgKytJSSkgeworICAgICAgU1VuaXQgKlByZWRTdWNjU1UgPSBJSS0+Z2V0U1VuaXQoKTsKKyAgICAgIGlmIChQcmVkU3VjY1NVID09IFNVKSBjb250aW51ZTsKKyAgICAgIC8vIElmIFByZWRTVSBoYXMgYW5vdGhlciBzdWNjZXNzb3Igd2l0aCBubyBkYXRhIHN1Y2Nlc3NvcnMsIGZvcgorICAgICAgLy8gbm93IGRvbid0IGF0dGVtcHQgdG8gY2hvb3NlIGVpdGhlciBvdmVyIHRoZSBvdGhlci4KKyAgICAgIGlmIChQcmVkU3VjY1NVLT5OdW1TdWNjcyA9PSAwKQorICAgICAgICBnb3RvIG91dGVyX2xvb3BfY29udGludWU7CisgICAgICAvLyBEb24ndCBicmVhayBwaHlzaWNhbCByZWdpc3RlciBkZXBlbmRlbmNpZXMuCisgICAgICBpZiAoU1UtPmhhc1BoeXNSZWdDbG9iYmVycyAmJiBQcmVkU3VjY1NVLT5oYXNQaHlzUmVnRGVmcykKKyAgICAgICAgaWYgKGNhbkNsb2JiZXJQaHlzUmVnRGVmcyhQcmVkU3VjY1NVLCBTVSwgVElJLCBUUkkpKQorICAgICAgICAgIGdvdG8gb3V0ZXJfbG9vcF9jb250aW51ZTsKKyAgICAgIC8vIERvbid0IGludHJvZHVjZSBncmFwaCBjeWNsZXMuCisgICAgICBpZiAoc2NoZWR1bGVEQUctPklzUmVhY2hhYmxlKFNVLCBQcmVkU3VjY1NVKSkKKyAgICAgICAgZ290byBvdXRlcl9sb29wX2NvbnRpbnVlOworICAgIH0KKworICAgIC8vIE9rLCB0aGUgdHJhbnNmb3JtYXRpb24gaXMgc2FmZSBhbmQgdGhlIGhldXJpc3RpY3Mgc3VnZ2VzdCBpdCBpcworICAgIC8vIHByb2ZpdGFibGUuIFVwZGF0ZSB0aGUgZ3JhcGguCisgICAgREVCVUcoZGJncygpIDw8ICIgICAgUHJlc2NoZWR1bGluZyBTVSAjIiA8PCBTVS0+Tm9kZU51bQorICAgICAgICAgICAgICAgICA8PCAiIG5leHQgdG8gUHJlZFNVICMiIDw8IFByZWRTVS0+Tm9kZU51bQorICAgICAgICAgICAgICAgICA8PCAiIHRvIGd1aWRlIHNjaGVkdWxpbmcgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlIHVzZXNcbiIpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUHJlZFNVLT5TdWNjcy5zaXplKCk7ICsraSkgeworICAgICAgU0RlcCBFZGdlID0gUHJlZFNVLT5TdWNjc1tpXTsKKyAgICAgIGFzc2VydCghRWRnZS5pc0Fzc2lnbmVkUmVnRGVwKCkpOworICAgICAgU1VuaXQgKlN1Y2NTVSA9IEVkZ2UuZ2V0U1VuaXQoKTsKKyAgICAgIGlmIChTdWNjU1UgIT0gU1UpIHsKKyAgICAgICAgRWRnZS5zZXRTVW5pdChQcmVkU1UpOworICAgICAgICBzY2hlZHVsZURBRy0+UmVtb3ZlUHJlZChTdWNjU1UsIEVkZ2UpOworICAgICAgICBzY2hlZHVsZURBRy0+QWRkUHJlZChTVSwgRWRnZSk7CisgICAgICAgIEVkZ2Uuc2V0U1VuaXQoU1UpOworICAgICAgICBzY2hlZHVsZURBRy0+QWRkUHJlZChTdWNjU1UsIEVkZ2UpOworICAgICAgICAtLWk7CisgICAgICB9CisgICAgfQorICBvdXRlcl9sb29wX2NvbnRpbnVlOjsKKyAgfQorfQorCisvLy8gQWRkUHNldWRvVHdvQWRkckRlcHMgLSBJZiB0d28gbm9kZXMgc2hhcmUgYW4gb3BlcmFuZCBhbmQgb25lIG9mIHRoZW0gdXNlcworLy8vIGl0IGFzIGEgZGVmJnVzZSBvcGVyYW5kLiBBZGQgYSBwc2V1ZG8gY29udHJvbCBlZGdlIGZyb20gaXQgdG8gdGhlIG90aGVyCisvLy8gbm9kZSAoaWYgaXQgd29uJ3QgY3JlYXRlIGEgY3ljbGUpIHNvIHRoZSB0d28tYWRkcmVzcyBvbmUgd2lsbCBiZSBzY2hlZHVsZWQKKy8vLyBmaXJzdCAobG93ZXIgaW4gdGhlIHNjaGVkdWxlKS4gSWYgYm90aCBub2RlcyBhcmUgdHdvLWFkZHJlc3MsIGZhdm9yIHRoZQorLy8vIG9uZSB0aGF0IGhhcyBhIENvcHlUb1JlZyB1c2UgKG1vcmUgbGlrZWx5IHRvIGJlIGEgbG9vcCBpbmR1Y3Rpb24gdXBkYXRlKS4KKy8vLyBJZiBib3RoIGFyZSB0d28tYWRkcmVzcywgYnV0IG9uZSBpcyBjb21tdXRhYmxlIHdoaWxlIHRoZSBvdGhlciBpcyBub3QKKy8vLyBjb21tdXRhYmxlLCBmYXZvciB0aGUgb25lIHRoYXQncyBub3QgY29tbXV0YWJsZS4KK3RlbXBsYXRlPGNsYXNzIFNGPgordm9pZCBSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlPFNGPjo6QWRkUHNldWRvVHdvQWRkckRlcHMoKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVW5pdHMtPnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBTVW5pdCAqU1UgPSAmKCpTVW5pdHMpW2ldOworICAgIGlmICghU1UtPmlzVHdvQWRkcmVzcykKKyAgICAgIGNvbnRpbnVlOworCisgICAgU0ROb2RlICpOb2RlID0gU1UtPmdldE5vZGUoKTsKKyAgICBpZiAoIU5vZGUgfHwgIU5vZGUtPmlzTWFjaGluZU9wY29kZSgpIHx8IFNVLT5nZXROb2RlKCktPmdldEZsYWdnZWROb2RlKCkpCisgICAgICBjb250aW51ZTsKKworICAgIHVuc2lnbmVkIE9wYyA9IE5vZGUtPmdldE1hY2hpbmVPcGNvZGUoKTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IFRJSS0+Z2V0KE9wYyk7CisgICAgdW5zaWduZWQgTnVtUmVzID0gVElELmdldE51bURlZnMoKTsKKyAgICB1bnNpZ25lZCBOdW1PcHMgPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKSAtIE51bVJlczsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IE51bU9wczsgKytqKSB7CisgICAgICBpZiAoVElELmdldE9wZXJhbmRDb25zdHJhaW50KGorTnVtUmVzLCBUT0k6OlRJRURfVE8pID09IC0xKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIFNETm9kZSAqRFUgPSBTVS0+Z2V0Tm9kZSgpLT5nZXRPcGVyYW5kKGopLmdldE5vZGUoKTsKKyAgICAgIGlmIChEVS0+Z2V0Tm9kZUlkKCkgPT0gLTEpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgY29uc3QgU1VuaXQgKkRVU1UgPSAmKCpTVW5pdHMpW0RVLT5nZXROb2RlSWQoKV07CisgICAgICBpZiAoIURVU1UpIGNvbnRpbnVlOworICAgICAgZm9yIChTVW5pdDo6Y29uc3Rfc3VjY19pdGVyYXRvciBJID0gRFVTVS0+U3VjY3MuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IERVU1UtPlN1Y2NzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBpZiAoSS0+aXNDdHJsKCkpIGNvbnRpbnVlOworICAgICAgICBTVW5pdCAqU3VjY1NVID0gSS0+Z2V0U1VuaXQoKTsKKyAgICAgICAgaWYgKFN1Y2NTVSA9PSBTVSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gQmUgY29uc2VydmF0aXZlLiBJZ25vcmUgaWYgbm9kZXMgYXJlbid0IGF0IHJvdWdobHkgdGhlIHNhbWUKKyAgICAgICAgLy8gZGVwdGggYW5kIGhlaWdodC4KKyAgICAgICAgaWYgKFN1Y2NTVS0+Z2V0SGVpZ2h0KCkgPCBTVS0+Z2V0SGVpZ2h0KCkgJiYKKyAgICAgICAgICAgIChTVS0+Z2V0SGVpZ2h0KCkgLSBTdWNjU1UtPmdldEhlaWdodCgpKSA+IDEpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8vIFNraXAgcGFzdCBDT1BZX1RPX1JFR0NMQVNTIG5vZGVzLCBzbyB0aGF0IHRoZSBwc2V1ZG8gZWRnZQorICAgICAgICAvLyBjb25zdHJhaW5zIHdoYXRldmVyIGlzIHVzaW5nIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBjb3B5CisgICAgICAgIC8vIGl0c2VsZi4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY29weSBpcyBjb2FsZXNjZWQsIHRoaXMKKyAgICAgICAgLy8gcHJlc2VydmVzIHRoZSBpbnRlbnQgb2YgdGhlIHBzZXVkbyB0d28tYWRkcmVzcyBoZXVyaWV0aWNzLgorICAgICAgICB3aGlsZSAoU3VjY1NVLT5TdWNjcy5zaXplKCkgPT0gMSAmJgorICAgICAgICAgICAgICAgU3VjY1NVLT5nZXROb2RlKCktPmlzTWFjaGluZU9wY29kZSgpICYmCisgICAgICAgICAgICAgICBTdWNjU1UtPmdldE5vZGUoKS0+Z2V0TWFjaGluZU9wY29kZSgpID09CisgICAgICAgICAgICAgICAgIFRhcmdldE9wY29kZTo6Q09QWV9UT19SRUdDTEFTUykKKyAgICAgICAgICBTdWNjU1UgPSBTdWNjU1UtPlN1Y2NzLmZyb250KCkuZ2V0U1VuaXQoKTsKKyAgICAgICAgLy8gRG9uJ3QgY29uc3RyYWluIG5vbi1pbnN0cnVjdGlvbiBub2Rlcy4KKyAgICAgICAgaWYgKCFTdWNjU1UtPmdldE5vZGUoKSB8fCAhU3VjY1NVLT5nZXROb2RlKCktPmlzTWFjaGluZU9wY29kZSgpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBEb24ndCBjb25zdHJhaW4gbm9kZXMgd2l0aCBwaHlzaWNhbCByZWdpc3RlciBkZWZzIGlmIHRoZQorICAgICAgICAvLyBwcmVkZWNlc3NvciBjYW4gY2xvYmJlciB0aGVtLgorICAgICAgICBpZiAoU3VjY1NVLT5oYXNQaHlzUmVnRGVmcyAmJiBTVS0+aGFzUGh5c1JlZ0Nsb2JiZXJzKSB7CisgICAgICAgICAgaWYgKGNhbkNsb2JiZXJQaHlzUmVnRGVmcyhTdWNjU1UsIFNVLCBUSUksIFRSSSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBEb24ndCBjb25zdHJhaW4gRVhUUkFDVF9TVUJSRUcsIElOU0VSVF9TVUJSRUcsIGFuZCBTVUJSRUdfVE9fUkVHOworICAgICAgICAvLyB0aGVzZSBtYXkgYmUgY29hbGVzY2VkIGF3YXkuIFdlIHdhbnQgdGhlbSBjbG9zZSB0byB0aGVpciB1c2VzLgorICAgICAgICB1bnNpZ25lZCBTdWNjT3BjID0gU3VjY1NVLT5nZXROb2RlKCktPmdldE1hY2hpbmVPcGNvZGUoKTsKKyAgICAgICAgaWYgKFN1Y2NPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpFWFRSQUNUX1NVQlJFRyB8fAorICAgICAgICAgICAgU3VjY09wYyA9PSBUYXJnZXRPcGNvZGU6OklOU0VSVF9TVUJSRUcgfHwKKyAgICAgICAgICAgIFN1Y2NPcGMgPT0gVGFyZ2V0T3Bjb2RlOjpTVUJSRUdfVE9fUkVHKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKCFjYW5DbG9iYmVyKFN1Y2NTVSwgRFVTVSkgfHwKKyAgICAgICAgICAgICAoaGFzQ29weVRvUmVnVXNlKFNVKSAmJiAhaGFzQ29weVRvUmVnVXNlKFN1Y2NTVSkpIHx8CisgICAgICAgICAgICAgKCFTVS0+aXNDb21tdXRhYmxlICYmIFN1Y2NTVS0+aXNDb21tdXRhYmxlKSkgJiYKKyAgICAgICAgICAgICFzY2hlZHVsZURBRy0+SXNSZWFjaGFibGUoU3VjY1NVLCBTVSkpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgICBBZGRpbmcgYSBwc2V1ZG8tdHdvLWFkZHIgZWRnZSBmcm9tIFNVICMiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IFNVLT5Ob2RlTnVtIDw8ICIgdG8gU1UgIyIgPDwgU3VjY1NVLT5Ob2RlTnVtIDw8ICJcbiIpOworICAgICAgICAgIHNjaGVkdWxlREFHLT5BZGRQcmVkKFNVLCBTRGVwKFN1Y2NTVSwgU0RlcDo6T3JkZXIsIC8qTGF0ZW5jeT0qLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypSZWc9Ki8wLCAvKmlzTm9ybWFsTWVtb3J5PSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc011c3RBbGlhcz0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNBcnRpZmljaWFsPSovdHJ1ZSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLyBDYWxjdWxhdGVTZXRoaVVsbG1hbk51bWJlcnMgLSBDYWxjdWxhdGUgU2V0aGktVWxsbWFuIG51bWJlcnMgb2YgYWxsCisvLy8gc2NoZWR1bGluZyB1bml0cy4KK3RlbXBsYXRlPGNsYXNzIFNGPgordm9pZCBSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlPFNGPjo6Q2FsY3VsYXRlU2V0aGlVbGxtYW5OdW1iZXJzKCkgeworICBTZXRoaVVsbG1hbk51bWJlcnMuYXNzaWduKFNVbml0cy0+c2l6ZSgpLCAwKTsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVW5pdHMtPnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgQ2FsY05vZGVTZXRoaVVsbG1hbk51bWJlcigmKCpTVW5pdHMpW2ldLCBTZXRoaVVsbG1hbk51bWJlcnMpOworfQorCisvLy8gTGltaXRlZFN1bU9mVW5zY2hlZHVsZWRQcmVkc09mU3VjY3MgLSBDb21wdXRlIHRoZSBzdW0gb2YgdGhlIHVuc2NoZWR1bGVkCisvLy8gcHJlZGVjZXNzb3JzIG9mIHRoZSBzdWNjZXNzb3JzIG9mIHRoZSBTVW5pdCBTVS4gU3RvcCB3aGVuIHRoZSBwcm92aWRlZAorLy8vIGxpbWl0IGlzIGV4Y2VlZGVkLgorc3RhdGljIHVuc2lnbmVkIExpbWl0ZWRTdW1PZlVuc2NoZWR1bGVkUHJlZHNPZlN1Y2NzKGNvbnN0IFNVbml0ICpTVSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGltaXQpIHsKKyAgdW5zaWduZWQgU3VtID0gMDsKKyAgZm9yIChTVW5pdDo6Y29uc3Rfc3VjY19pdGVyYXRvciBJID0gU1UtPlN1Y2NzLmJlZ2luKCksIEUgPSBTVS0+U3VjY3MuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBTVW5pdCAqU3VjY1NVID0gSS0+Z2V0U1VuaXQoKTsKKyAgICBmb3IgKFNVbml0Ojpjb25zdF9wcmVkX2l0ZXJhdG9yIElJID0gU3VjY1NVLT5QcmVkcy5iZWdpbigpLAorICAgICAgICAgRUUgPSBTdWNjU1UtPlByZWRzLmVuZCgpOyBJSSAhPSBFRTsgKytJSSkgeworICAgICAgU1VuaXQgKlByZWRTVSA9IElJLT5nZXRTVW5pdCgpOworICAgICAgaWYgKCFQcmVkU1UtPmlzU2NoZWR1bGVkKQorICAgICAgICBpZiAoKytTdW0gPiBMaW1pdCkKKyAgICAgICAgICByZXR1cm4gU3VtOworICAgIH0KKyAgfQorICByZXR1cm4gU3VtOworfQorCisKKy8vIFRvcCBkb3duCitib29sIHRkX2xzX3JyX3NvcnQ6Om9wZXJhdG9yKCkoY29uc3QgU1VuaXQgKmxlZnQsIGNvbnN0IFNVbml0ICpyaWdodCkgY29uc3QgeworICB1bnNpZ25lZCBMUHJpb3JpdHkgPSBTUFEtPmdldE5vZGVQcmlvcml0eShsZWZ0KTsKKyAgdW5zaWduZWQgUlByaW9yaXR5ID0gU1BRLT5nZXROb2RlUHJpb3JpdHkocmlnaHQpOworICBib29sIExJc1RhcmdldCA9IGxlZnQtPmdldE5vZGUoKSAmJiBsZWZ0LT5nZXROb2RlKCktPmlzTWFjaGluZU9wY29kZSgpOworICBib29sIFJJc1RhcmdldCA9IHJpZ2h0LT5nZXROb2RlKCkgJiYgcmlnaHQtPmdldE5vZGUoKS0+aXNNYWNoaW5lT3Bjb2RlKCk7CisgIGJvb2wgTElzRmxvYXRlciA9IExJc1RhcmdldCAmJiBsZWZ0LT5OdW1QcmVkcyA9PSAwOworICBib29sIFJJc0Zsb2F0ZXIgPSBSSXNUYXJnZXQgJiYgcmlnaHQtPk51bVByZWRzID09IDA7CisgIHVuc2lnbmVkIExCb251cyA9IChMaW1pdGVkU3VtT2ZVbnNjaGVkdWxlZFByZWRzT2ZTdWNjcyhsZWZ0LDEpID09IDEpID8gMiA6IDA7CisgIHVuc2lnbmVkIFJCb251cyA9IChMaW1pdGVkU3VtT2ZVbnNjaGVkdWxlZFByZWRzT2ZTdWNjcyhyaWdodCwxKSA9PSAxKSA/IDIgOiAwOworCisgIGlmIChsZWZ0LT5OdW1TdWNjcyA9PSAwICYmIHJpZ2h0LT5OdW1TdWNjcyAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgZWxzZSBpZiAobGVmdC0+TnVtU3VjY3MgIT0gMCAmJiByaWdodC0+TnVtU3VjY3MgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoTElzRmxvYXRlcikKKyAgICBMQm9udXMgLT0gMjsKKyAgaWYgKFJJc0Zsb2F0ZXIpCisgICAgUkJvbnVzIC09IDI7CisgIGlmIChsZWZ0LT5OdW1TdWNjcyA9PSAxKQorICAgIExCb251cyArPSAyOworICBpZiAocmlnaHQtPk51bVN1Y2NzID09IDEpCisgICAgUkJvbnVzICs9IDI7CisKKyAgaWYgKExQcmlvcml0eStMQm9udXMgIT0gUlByaW9yaXR5K1JCb251cykKKyAgICByZXR1cm4gTFByaW9yaXR5K0xCb251cyA8IFJQcmlvcml0eStSQm9udXM7CisKKyAgaWYgKGxlZnQtPmdldERlcHRoKCkgIT0gcmlnaHQtPmdldERlcHRoKCkpCisgICAgcmV0dXJuIGxlZnQtPmdldERlcHRoKCkgPCByaWdodC0+Z2V0RGVwdGgoKTsKKworICBpZiAobGVmdC0+TnVtU3VjY3NMZWZ0ICE9IHJpZ2h0LT5OdW1TdWNjc0xlZnQpCisgICAgcmV0dXJuIGxlZnQtPk51bVN1Y2NzTGVmdCA+IHJpZ2h0LT5OdW1TdWNjc0xlZnQ7CisKKyAgYXNzZXJ0KGxlZnQtPk5vZGVRdWV1ZUlkICYmIHJpZ2h0LT5Ob2RlUXVldWVJZCAmJiAKKyAgICAgICAgICJOb2RlUXVldWVJZCBjYW5ub3QgYmUgemVybyIpOworICByZXR1cm4gKGxlZnQtPk5vZGVRdWV1ZUlkID4gcmlnaHQtPk5vZGVRdWV1ZUlkKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpYyBDb25zdHJ1Y3RvciBGdW5jdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xsdm06OlNjaGVkdWxlREFHU0ROb2RlcyAqCitsbHZtOjpjcmVhdGVCVVJSTGlzdERBR1NjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywgQ29kZUdlbk9wdDo6TGV2ZWwpIHsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBJUy0+VE07CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gVE0uZ2V0SW5zdHJJbmZvKCk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIAorICBCVVJlZ1JlZHVjdGlvblByaW9yaXR5UXVldWUgKlBRID0KKyAgICBuZXcgQlVSZWdSZWR1Y3Rpb25Qcmlvcml0eVF1ZXVlKCpJUy0+TUYsIGZhbHNlLCBUSUksIFRSSSwgMCk7CisgIFNjaGVkdWxlREFHUlJMaXN0ICpTRCA9IG5ldyBTY2hlZHVsZURBR1JSTGlzdCgqSVMtPk1GLCB0cnVlLCBmYWxzZSwgUFEpOworICBQUS0+c2V0U2NoZWR1bGVEQUcoU0QpOworICByZXR1cm4gU0Q7ICAKK30KKworbGx2bTo6U2NoZWR1bGVEQUdTRE5vZGVzICoKK2xsdm06OmNyZWF0ZVREUlJMaXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLCBDb2RlR2VuT3B0OjpMZXZlbCkgeworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IElTLT5UTTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBUTS5nZXRJbnN0ckluZm8oKTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKyAgCisgIFREUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZSAqUFEgPQorICAgIG5ldyBURFJlZ1JlZHVjdGlvblByaW9yaXR5UXVldWUoKklTLT5NRiwgZmFsc2UsIFRJSSwgVFJJLCAwKTsKKyAgU2NoZWR1bGVEQUdSUkxpc3QgKlNEID0gbmV3IFNjaGVkdWxlREFHUlJMaXN0KCpJUy0+TUYsIGZhbHNlLCBmYWxzZSwgUFEpOworICBQUS0+c2V0U2NoZWR1bGVEQUcoU0QpOworICByZXR1cm4gU0Q7Cit9CisKK2xsdm06OlNjaGVkdWxlREFHU0ROb2RlcyAqCitsbHZtOjpjcmVhdGVTb3VyY2VMaXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLCBDb2RlR2VuT3B0OjpMZXZlbCkgeworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IElTLT5UTTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBUTS5nZXRJbnN0ckluZm8oKTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKyAgCisgIFNyY1JlZ1JlZHVjdGlvblByaW9yaXR5UXVldWUgKlBRID0KKyAgICBuZXcgU3JjUmVnUmVkdWN0aW9uUHJpb3JpdHlRdWV1ZSgqSVMtPk1GLCBmYWxzZSwgVElJLCBUUkksIDApOworICBTY2hlZHVsZURBR1JSTGlzdCAqU0QgPSBuZXcgU2NoZWR1bGVEQUdSUkxpc3QoKklTLT5NRiwgdHJ1ZSwgZmFsc2UsIFBRKTsKKyAgUFEtPnNldFNjaGVkdWxlREFHKFNEKTsKKyAgcmV0dXJuIFNEOyAgCit9CisKK2xsdm06OlNjaGVkdWxlREFHU0ROb2RlcyAqCitsbHZtOjpjcmVhdGVIeWJyaWRMaXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLCBDb2RlR2VuT3B0OjpMZXZlbCkgeworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IElTLT5UTTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBUTS5nZXRJbnN0ckluZm8oKTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSSA9ICZJUy0+Z2V0VGFyZ2V0TG93ZXJpbmcoKTsKKyAgCisgIEh5YnJpZEJVUlJQcmlvcml0eVF1ZXVlICpQUSA9CisgICAgbmV3IEh5YnJpZEJVUlJQcmlvcml0eVF1ZXVlKCpJUy0+TUYsIHRydWUsIFRJSSwgVFJJLCBUTEkpOworICBTY2hlZHVsZURBR1JSTGlzdCAqU0QgPSBuZXcgU2NoZWR1bGVEQUdSUkxpc3QoKklTLT5NRiwgdHJ1ZSwgdHJ1ZSwgUFEpOworICBQUS0+c2V0U2NoZWR1bGVEQUcoU0QpOworICByZXR1cm4gU0Q7ICAKK30KKworbGx2bTo6U2NoZWR1bGVEQUdTRE5vZGVzICoKK2xsdm06OmNyZWF0ZUlMUExpc3REQUdTY2hlZHVsZXIoU2VsZWN0aW9uREFHSVNlbCAqSVMsIENvZGVHZW5PcHQ6OkxldmVsKSB7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gSVMtPlRNOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IFRNLmdldEluc3RySW5mbygpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAqVExJID0gJklTLT5nZXRUYXJnZXRMb3dlcmluZygpOworICAKKyAgSUxQQlVSUlByaW9yaXR5UXVldWUgKlBRID0KKyAgICBuZXcgSUxQQlVSUlByaW9yaXR5UXVldWUoKklTLT5NRiwgdHJ1ZSwgVElJLCBUUkksIFRMSSk7CisgIFNjaGVkdWxlREFHUlJMaXN0ICpTRCA9IG5ldyBTY2hlZHVsZURBR1JSTGlzdCgqSVMtPk1GLCB0cnVlLCB0cnVlLCBQUSk7CisgIFBRLT5zZXRTY2hlZHVsZURBRyhTRCk7CisgIHJldHVybiBTRDsgIAorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NjaGVkdWxlREFHU0ROb2Rlcy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2NoZWR1bGVEQUdTRE5vZGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWJmODJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NjaGVkdWxlREFHU0ROb2Rlcy5jcHAKQEAgLTAsMCArMSw2NzIgQEAKKy8vPT09LS0tIFNjaGVkdWxlREFHU0ROb2Rlcy5jcHAgLSBJbXBsZW1lbnQgdGhlIFNjaGVkdWxlREFHU0ROb2RlcyBjbGFzcyAtLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBTY2hlZHVsZURBRyBjbGFzcywgd2hpY2ggaXMgYSBiYXNlIGNsYXNzIHVzZWQgYnkKKy8vIHNjaGVkdWxpbmcgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInByZS1SQS1zY2hlZCIKKyNpbmNsdWRlICJTRE5vZGVEYmdWYWx1ZS5oIgorI2luY2x1ZGUgIlNjaGVkdWxlREFHU0ROb2Rlcy5oIgorI2luY2x1ZGUgIkluc3RyRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhMb2Fkc0NsdXN0ZXJlZCwgIk51bWJlciBvZiBsb2FkcyBjbHVzdGVyZWQgdG9nZXRoZXIiKTsKKworU2NoZWR1bGVEQUdTRE5vZGVzOjpTY2hlZHVsZURBR1NETm9kZXMoTWFjaGluZUZ1bmN0aW9uICZtZikKKyAgOiBTY2hlZHVsZURBRyhtZikgeworfQorCisvLy8gUnVuIC0gcGVyZm9ybSBzY2hlZHVsaW5nLgorLy8vCit2b2lkIFNjaGVkdWxlREFHU0ROb2Rlczo6UnVuKFNlbGVjdGlvbkRBRyAqZGFnLCBNYWNoaW5lQmFzaWNCbG9jayAqYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBpbnNlcnRQb3MpIHsKKyAgREFHID0gZGFnOworICBTY2hlZHVsZURBRzo6UnVuKGJiLCBpbnNlcnRQb3MpOworfQorCisvLy8gTmV3U1VuaXQgLSBDcmVhdGVzIGEgbmV3IFNVbml0IGFuZCByZXR1cm4gYSBwdHIgdG8gaXQuCisvLy8KK1NVbml0ICpTY2hlZHVsZURBR1NETm9kZXM6Ok5ld1NVbml0KFNETm9kZSAqTikgeworI2lmbmRlZiBOREVCVUcKKyAgY29uc3QgU1VuaXQgKkFkZHIgPSAwOworICBpZiAoIVNVbml0cy5lbXB0eSgpKQorICAgIEFkZHIgPSAmU1VuaXRzWzBdOworI2VuZGlmCisgIFNVbml0cy5wdXNoX2JhY2soU1VuaXQoTiwgKHVuc2lnbmVkKVNVbml0cy5zaXplKCkpKTsKKyAgYXNzZXJ0KChBZGRyID09IDAgfHwgQWRkciA9PSAmU1VuaXRzWzBdKSAmJgorICAgICAgICAgIlNVbml0cyBzdGQ6OnZlY3RvciByZWFsbG9jYXRlZCBvbiB0aGUgZmx5ISIpOworICBTVW5pdHMuYmFjaygpLk9yaWdOb2RlID0gJlNVbml0cy5iYWNrKCk7CisgIFNVbml0ICpTVSA9ICZTVW5pdHMuYmFjaygpOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLT5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKTsKKyAgaWYgKCFOIHx8CisgICAgICAoTi0+aXNNYWNoaW5lT3Bjb2RlKCkgJiYKKyAgICAgICBOLT5nZXRNYWNoaW5lT3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYpKQorICAgIFNVLT5TY2hlZHVsaW5nUHJlZiA9IFNjaGVkOjpOb25lOworICBlbHNlCisgICAgU1UtPlNjaGVkdWxpbmdQcmVmID0gVExJLmdldFNjaGVkdWxpbmdQcmVmZXJlbmNlKE4pOworICByZXR1cm4gU1U7Cit9CisKK1NVbml0ICpTY2hlZHVsZURBR1NETm9kZXM6OkNsb25lKFNVbml0ICpPbGQpIHsKKyAgU1VuaXQgKlNVID0gTmV3U1VuaXQoT2xkLT5nZXROb2RlKCkpOworICBTVS0+T3JpZ05vZGUgPSBPbGQtPk9yaWdOb2RlOworICBTVS0+TGF0ZW5jeSA9IE9sZC0+TGF0ZW5jeTsKKyAgU1UtPmlzVHdvQWRkcmVzcyA9IE9sZC0+aXNUd29BZGRyZXNzOworICBTVS0+aXNDb21tdXRhYmxlID0gT2xkLT5pc0NvbW11dGFibGU7CisgIFNVLT5oYXNQaHlzUmVnRGVmcyA9IE9sZC0+aGFzUGh5c1JlZ0RlZnM7CisgIFNVLT5oYXNQaHlzUmVnQ2xvYmJlcnMgPSBPbGQtPmhhc1BoeXNSZWdDbG9iYmVyczsKKyAgU1UtPlNjaGVkdWxpbmdQcmVmID0gT2xkLT5TY2hlZHVsaW5nUHJlZjsKKyAgT2xkLT5pc0Nsb25lZCA9IHRydWU7CisgIHJldHVybiBTVTsKK30KKworLy8vIENoZWNrRm9yUGh5c1JlZ0RlcGVuZGVuY3kgLSBDaGVjayBpZiB0aGUgZGVwZW5kZW5jeSBiZXR3ZWVuIGRlZiBhbmQgdXNlIG9mCisvLy8gYSBzcGVjaWZpZWQgb3BlcmFuZCBpcyBhIHBoeXNpY2FsIHJlZ2lzdGVyIGRlcGVuZGVuY3kuIElmIHNvLCByZXR1cm5zIHRoZQorLy8vIHJlZ2lzdGVyIGFuZCB0aGUgY29zdCBvZiBjb3B5aW5nIHRoZSByZWdpc3Rlci4KK3N0YXRpYyB2b2lkIENoZWNrRm9yUGh5c1JlZ0RlcGVuZGVuY3koU0ROb2RlICpEZWYsIFNETm9kZSAqVXNlciwgdW5zaWduZWQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZQaHlzUmVnLCBpbnQgJkNvc3QpIHsKKyAgaWYgKE9wICE9IDIgfHwgVXNlci0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpDb3B5VG9SZWcpCisgICAgcmV0dXJuOworCisgIHVuc2lnbmVkIFJlZyA9IGNhc3Q8UmVnaXN0ZXJTRE5vZGU+KFVzZXItPmdldE9wZXJhbmQoMSkpLT5nZXRSZWcoKTsKKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUmVnKSkKKyAgICByZXR1cm47CisKKyAgdW5zaWduZWQgUmVzTm8gPSBVc2VyLT5nZXRPcGVyYW5kKDIpLmdldFJlc05vKCk7CisgIGlmIChEZWYtPmlzTWFjaGluZU9wY29kZSgpKSB7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZJSSA9IFRJSS0+Z2V0KERlZi0+Z2V0TWFjaGluZU9wY29kZSgpKTsKKyAgICBpZiAoUmVzTm8gPj0gSUkuZ2V0TnVtRGVmcygpICYmCisgICAgICAgIElJLkltcGxpY2l0RGVmc1tSZXNObyAtIElJLmdldE51bURlZnMoKV0gPT0gUmVnKSB7CisgICAgICBQaHlzUmVnID0gUmVnOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPQorICAgICAgICBUUkktPmdldE1pbmltYWxQaHlzUmVnQ2xhc3MoUmVnLCBEZWYtPmdldFZhbHVlVHlwZShSZXNObykpOworICAgICAgQ29zdCA9IFJDLT5nZXRDb3B5Q29zdCgpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBBZGRGbGFncyhTRE5vZGUgKk4sIFNEVmFsdWUgRmxhZywgYm9vbCBBZGRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICpEQUcpIHsKKyAgU21hbGxWZWN0b3I8RVZULCA0PiBWVHM7CisgIFNETm9kZSAqRmxhZ0Rlc3ROb2RlID0gRmxhZy5nZXROb2RlKCk7CisKKyAgLy8gRG9uJ3QgYWRkIGEgZmxhZyBmcm9tIGEgbm9kZSB0byBpdHNlbGYuCisgIGlmIChGbGFnRGVzdE5vZGUgPT0gTikgcmV0dXJuOworCisgIC8vIERvbid0IGFkZCBhIGZsYWcgdG8gc29tZXRoaW5nIHdoaWNoIGFscmVhZHkgaGFzIGEgZmxhZy4KKyAgaWYgKE4tPmdldFZhbHVlVHlwZShOLT5nZXROdW1WYWx1ZXMoKSAtIDEpID09IE1WVDo6RmxhZykgcmV0dXJuOworCisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBOLT5nZXROdW1WYWx1ZXMoKTsgSSAhPSBFOyArK0kpCisgICAgVlRzLnB1c2hfYmFjayhOLT5nZXRWYWx1ZVR5cGUoSSkpOworCisgIGlmIChBZGRGbGFnKQorICAgIFZUcy5wdXNoX2JhY2soTVZUOjpGbGFnKTsKKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBPcHM7CisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBOLT5nZXROdW1PcGVyYW5kcygpOyBJICE9IEU7ICsrSSkKKyAgICBPcHMucHVzaF9iYWNrKE4tPmdldE9wZXJhbmQoSSkpOworCisgIGlmIChGbGFnRGVzdE5vZGUpCisgICAgT3BzLnB1c2hfYmFjayhGbGFnKTsKKworICBTRFZUTGlzdCBWVExpc3QgPSBEQUctPmdldFZUTGlzdCgmVlRzWzBdLCBWVHMuc2l6ZSgpKTsKKyAgTWFjaGluZVNETm9kZTo6bW1vX2l0ZXJhdG9yIEJlZ2luID0gMCwgRW5kID0gMDsKKyAgTWFjaGluZVNETm9kZSAqTU4gPSBkeW5fY2FzdDxNYWNoaW5lU0ROb2RlPihOKTsKKworICAvLyBTdG9yZSBtZW1vcnkgcmVmZXJlbmNlcy4KKyAgaWYgKE1OKSB7CisgICAgQmVnaW4gPSBNTi0+bWVtb3BlcmFuZHNfYmVnaW4oKTsKKyAgICBFbmQgPSBNTi0+bWVtb3BlcmFuZHNfZW5kKCk7CisgIH0KKworICBEQUctPk1vcnBoTm9kZVRvKE4sIE4tPmdldE9wY29kZSgpLCBWVExpc3QsICZPcHNbMF0sIE9wcy5zaXplKCkpOworCisgIC8vIFJlc2V0IHRoZSBtZW1vcnkgcmVmZXJlbmNlcworICBpZiAoTU4pCisgICAgTU4tPnNldE1lbVJlZnMoQmVnaW4sIEVuZCk7Cit9CisKKy8vLyBDbHVzdGVyTmVpZ2hib3JpbmdMb2FkcyAtIEZvcmNlIG5lYXJieSBsb2FkcyB0b2dldGhlciBieSAiZmxhZ2dpbmciIHRoZW0uCisvLy8gVGhpcyBmdW5jdGlvbiBmaW5kcyBsb2FkcyBvZiB0aGUgc2FtZSBiYXNlIGFuZCBkaWZmZXJlbnQgb2Zmc2V0cy4gSWYgdGhlCisvLy8gb2Zmc2V0cyBhcmUgbm90IGZhciBhcGFydCAodGFyZ2V0IHNwZWNpZmljKSwgaXQgYWRkIE1WVDo6RmxhZyBpbnB1dHMgYW5kCisvLy8gb3V0cHV0cyB0byBlbnN1cmUgdGhleSBhcmUgc2NoZWR1bGVkIHRvZ2V0aGVyIGFuZCBpbiBvcmRlci4gVGhpcworLy8vIG9wdGltaXphdGlvbiBtYXkgYmVuZWZpdCBzb21lIHRhcmdldHMgYnkgaW1wcm92aW5nIGNhY2hlIGxvY2FsaXR5Lgordm9pZCBTY2hlZHVsZURBR1NETm9kZXM6OkNsdXN0ZXJOZWlnaGJvcmluZ0xvYWRzKFNETm9kZSAqTm9kZSkgeworICBTRE5vZGUgKkNoYWluID0gMDsKKyAgdW5zaWduZWQgTnVtT3BzID0gTm9kZS0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgaWYgKE5vZGUtPmdldE9wZXJhbmQoTnVtT3BzLTEpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6T3RoZXIpCisgICAgQ2hhaW4gPSBOb2RlLT5nZXRPcGVyYW5kKE51bU9wcy0xKS5nZXROb2RlKCk7CisgIGlmICghQ2hhaW4pCisgICAgcmV0dXJuOworCisgIC8vIExvb2sgZm9yIG90aGVyIGxvYWRzIG9mIHRoZSBzYW1lIGNoYWluLiBGaW5kIGxvYWRzIHRoYXQgYXJlIGxvYWRpbmcgZnJvbQorICAvLyB0aGUgc2FtZSBiYXNlIHBvaW50ZXIgYW5kIGRpZmZlcmVudCBvZmZzZXRzLgorICBTbWFsbFB0clNldDxTRE5vZGUqLCAxNj4gVmlzaXRlZDsKKyAgU21hbGxWZWN0b3I8aW50NjRfdCwgND4gT2Zmc2V0czsKKyAgRGVuc2VNYXA8bG9uZyBsb25nLCBTRE5vZGUqPiBPMlNNYXA7ICAvLyBNYXAgZnJvbSBvZmZzZXQgdG8gU0ROb2RlLgorICBib29sIENsdXN0ZXIgPSBmYWxzZTsKKyAgU0ROb2RlICpCYXNlID0gTm9kZTsKKyAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBJID0gQ2hhaW4tPnVzZV9iZWdpbigpLCBFID0gQ2hhaW4tPnVzZV9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIFNETm9kZSAqVXNlciA9ICpJOworICAgIGlmIChVc2VyID09IE5vZGUgfHwgIVZpc2l0ZWQuaW5zZXJ0KFVzZXIpKQorICAgICAgY29udGludWU7CisgICAgaW50NjRfdCBPZmZzZXQxLCBPZmZzZXQyOworICAgIGlmICghVElJLT5hcmVMb2Fkc0Zyb21TYW1lQmFzZVB0cihCYXNlLCBVc2VyLCBPZmZzZXQxLCBPZmZzZXQyKSB8fAorICAgICAgICBPZmZzZXQxID09IE9mZnNldDIpCisgICAgICAvLyBGSVhNRTogU2hvdWxkIGJlIG9rIGlmIHRoZXkgYWRkcmVzc2VzIGFyZSBpZGVudGljYWwuIEJ1dCBlYXJsaWVyCisgICAgICAvLyBvcHRpbWl6YXRpb25zIHJlYWxseSBzaG91bGQgaGF2ZSBlbGltaW5hdGVkIG9uZSBvZiB0aGUgbG9hZHMuCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoTzJTTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihPZmZzZXQxLCBCYXNlKSkuc2Vjb25kKQorICAgICAgT2Zmc2V0cy5wdXNoX2JhY2soT2Zmc2V0MSk7CisgICAgTzJTTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihPZmZzZXQyLCBVc2VyKSk7CisgICAgT2Zmc2V0cy5wdXNoX2JhY2soT2Zmc2V0Mik7CisgICAgaWYgKE9mZnNldDIgPCBPZmZzZXQxKQorICAgICAgQmFzZSA9IFVzZXI7CisgICAgQ2x1c3RlciA9IHRydWU7CisgIH0KKworICBpZiAoIUNsdXN0ZXIpCisgICAgcmV0dXJuOworCisgIC8vIFNvcnQgdGhlbSBpbiBpbmNyZWFzaW5nIG9yZGVyLgorICBzdGQ6OnNvcnQoT2Zmc2V0cy5iZWdpbigpLCBPZmZzZXRzLmVuZCgpKTsKKworICAvLyBDaGVjayBpZiB0aGUgbG9hZHMgYXJlIGNsb3NlIGVub3VnaC4KKyAgU21hbGxWZWN0b3I8U0ROb2RlKiwgND4gTG9hZHM7CisgIHVuc2lnbmVkIE51bUxvYWRzID0gMDsKKyAgaW50NjRfdCBCYXNlT2ZmID0gT2Zmc2V0c1swXTsKKyAgU0ROb2RlICpCYXNlTG9hZCA9IE8yU01hcFtCYXNlT2ZmXTsKKyAgTG9hZHMucHVzaF9iYWNrKEJhc2VMb2FkKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE9mZnNldHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGludDY0X3QgT2Zmc2V0ID0gT2Zmc2V0c1tpXTsKKyAgICBTRE5vZGUgKkxvYWQgPSBPMlNNYXBbT2Zmc2V0XTsKKyAgICBpZiAoIVRJSS0+c2hvdWxkU2NoZWR1bGVMb2Fkc05lYXIoQmFzZUxvYWQsIExvYWQsIEJhc2VPZmYsIE9mZnNldCxOdW1Mb2FkcykpCisgICAgICBicmVhazsgLy8gU3RvcCByaWdodCBoZXJlLiBJZ25vcmUgbG9hZHMgdGhhdCBhcmUgZnVydGhlciBhd2F5LgorICAgIExvYWRzLnB1c2hfYmFjayhMb2FkKTsKKyAgICArK051bUxvYWRzOworICB9CisKKyAgaWYgKE51bUxvYWRzID09IDApCisgICAgcmV0dXJuOworCisgIC8vIENsdXN0ZXIgbG9hZHMgYnkgYWRkaW5nIE1WVDo6RmxhZyBvdXRwdXRzIGFuZCBpbnB1dHMuIFRoaXMgYWxzbworICAvLyBlbnN1cmUgdGhleSBhcmUgc2NoZWR1bGVkIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgYWRkcmVzc2VzLgorICBTRE5vZGUgKkxlYWQgPSBMb2Fkc1swXTsKKyAgQWRkRmxhZ3MoTGVhZCwgU0RWYWx1ZSgwLCAwKSwgdHJ1ZSwgREFHKTsKKworICBTRFZhbHVlIEluRmxhZyA9IFNEVmFsdWUoTGVhZCwgTGVhZC0+Z2V0TnVtVmFsdWVzKCkgLSAxKTsKKyAgZm9yICh1bnNpZ25lZCBJID0gMSwgRSA9IExvYWRzLnNpemUoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBib29sIE91dEZsYWcgPSBJIDwgRSAtIDE7CisgICAgU0ROb2RlICpMb2FkID0gTG9hZHNbSV07CisKKyAgICBBZGRGbGFncyhMb2FkLCBJbkZsYWcsIE91dEZsYWcsIERBRyk7CisKKyAgICBpZiAoT3V0RmxhZykKKyAgICAgIEluRmxhZyA9IFNEVmFsdWUoTG9hZCwgTG9hZC0+Z2V0TnVtVmFsdWVzKCkgLSAxKTsKKworICAgICsrTG9hZHNDbHVzdGVyZWQ7CisgIH0KK30KKworLy8vIENsdXN0ZXJOb2RlcyAtIENsdXN0ZXIgY2VydGFpbiBub2RlcyB3aGljaCBzaG91bGQgYmUgc2NoZWR1bGVkIHRvZ2V0aGVyLgorLy8vCit2b2lkIFNjaGVkdWxlREFHU0ROb2Rlczo6Q2x1c3Rlck5vZGVzKCkgeworICBmb3IgKFNlbGVjdGlvbkRBRzo6YWxsbm9kZXNfaXRlcmF0b3IgTkkgPSBEQUctPmFsbG5vZGVzX2JlZ2luKCksCisgICAgICAgRSA9IERBRy0+YWxsbm9kZXNfZW5kKCk7IE5JICE9IEU7ICsrTkkpIHsKKyAgICBTRE5vZGUgKk5vZGUgPSAmKk5JOworICAgIGlmICghTm9kZSB8fCAhTm9kZS0+aXNNYWNoaW5lT3Bjb2RlKCkpCisgICAgICBjb250aW51ZTsKKworICAgIHVuc2lnbmVkIE9wYyA9IE5vZGUtPmdldE1hY2hpbmVPcGNvZGUoKTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IFRJSS0+Z2V0KE9wYyk7CisgICAgaWYgKFRJRC5tYXlMb2FkKCkpCisgICAgICAvLyBDbHVzdGVyIGxvYWRzIGZyb20gIm5lYXIiIGFkZHJlc3NlcyBpbnRvIGNvbWJpbmVkIFNVbml0cy4KKyAgICAgIENsdXN0ZXJOZWlnaGJvcmluZ0xvYWRzKE5vZGUpOworICB9Cit9CisKK3ZvaWQgU2NoZWR1bGVEQUdTRE5vZGVzOjpCdWlsZFNjaGVkVW5pdHMoKSB7CisgIC8vIER1cmluZyBzY2hlZHVsaW5nLCB0aGUgTm9kZUlkIGZpZWxkIG9mIFNETm9kZSBpcyB1c2VkIHRvIG1hcCBTRE5vZGVzCisgIC8vIHRvIHRoZWlyIGFzc29jaWF0ZWQgU1VuaXRzIGJ5IGhvbGRpbmcgU1VuaXRzIHRhYmxlIGluZGljZXMuIEEgdmFsdWUKKyAgLy8gb2YgLTEgbWVhbnMgdGhlIFNETm9kZSBkb2VzIG5vdCB5ZXQgaGF2ZSBhbiBhc3NvY2lhdGVkIFNVbml0LgorICB1bnNpZ25lZCBOdW1Ob2RlcyA9IDA7CisgIGZvciAoU2VsZWN0aW9uREFHOjphbGxub2Rlc19pdGVyYXRvciBOSSA9IERBRy0+YWxsbm9kZXNfYmVnaW4oKSwKKyAgICAgICBFID0gREFHLT5hbGxub2Rlc19lbmQoKTsgTkkgIT0gRTsgKytOSSkgeworICAgIE5JLT5zZXROb2RlSWQoLTEpOworICAgICsrTnVtTm9kZXM7CisgIH0KKworICAvLyBSZXNlcnZlIGVudHJpZXMgaW4gdGhlIHZlY3RvciBmb3IgZWFjaCBvZiB0aGUgU1VuaXRzIHdlIGFyZSBjcmVhdGluZy4gIFRoaXMKKyAgLy8gZW5zdXJlIHRoYXQgcmVhbGxvY2F0aW9uIG9mIHRoZSB2ZWN0b3Igd29uJ3QgaGFwcGVuLCBzbyBTVW5pdConcyB3b24ndCBnZXQKKyAgLy8gaW52YWxpZGF0ZWQuCisgIC8vIEZJWE1FOiBNdWx0aXBseSBieSAyIGJlY2F1c2Ugd2UgbWF5IGNsb25lIG5vZGVzIGR1cmluZyBzY2hlZHVsaW5nLgorICAvLyBUaGlzIGlzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQuCisgIFNVbml0cy5yZXNlcnZlKE51bU5vZGVzICogMik7CisgIAorICAvLyBBZGQgYWxsIG5vZGVzIGluIGRlcHRoIGZpcnN0IG9yZGVyLgorICBTbWFsbFZlY3RvcjxTRE5vZGUqLCA2ND4gV29ya2xpc3Q7CisgIFNtYWxsUHRyU2V0PFNETm9kZSosIDY0PiBWaXNpdGVkOworICBXb3JrbGlzdC5wdXNoX2JhY2soREFHLT5nZXRSb290KCkuZ2V0Tm9kZSgpKTsKKyAgVmlzaXRlZC5pbnNlcnQoREFHLT5nZXRSb290KCkuZ2V0Tm9kZSgpKTsKKyAgCisgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgIFNETm9kZSAqTkkgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAKKyAgICAvLyBBZGQgYWxsIG9wZXJhbmRzIHRvIHRoZSB3b3JrbGlzdCB1bmxlc3MgdGhleSd2ZSBhbHJlYWR5IGJlZW4gYWRkZWQuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChWaXNpdGVkLmluc2VydChOSS0+Z2V0T3BlcmFuZChpKS5nZXROb2RlKCkpKQorICAgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soTkktPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpKTsKKyAgCisgICAgaWYgKGlzUGFzc2l2ZU5vZGUoTkkpKSAgLy8gTGVhZiBub2RlLCBlLmcuIGEgVGFyZ2V0SW1tZWRpYXRlLgorICAgICAgY29udGludWU7CisgICAgCisgICAgLy8gSWYgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLCBzdG9wIG5vdy4KKyAgICBpZiAoTkktPmdldE5vZGVJZCgpICE9IC0xKSBjb250aW51ZTsKKyAgICAKKyAgICBTVW5pdCAqTm9kZVNVbml0ID0gTmV3U1VuaXQoTkkpOworICAgIAorICAgIC8vIFNlZSBpZiBhbnl0aGluZyBpcyBmbGFnZ2VkIHRvIHRoaXMgbm9kZSwgaWYgc28sIGFkZCB0aGVtIHRvIGZsYWdnZWQKKyAgICAvLyBub2Rlcy4gIE5vZGVzIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGZsYWcgaW5wdXQgYW5kIG9uZSBmbGFnIG91dHB1dC4gIEZsYWdzCisgICAgLy8gYXJlIHJlcXVpcmVkIHRvIGJlIHRoZSBsYXN0IG9wZXJhbmQgYW5kIHJlc3VsdCBvZiBhIG5vZGUuCisgICAgCisgICAgLy8gU2NhbiB1cCB0byBmaW5kIGZsYWdnZWQgcHJlZHMuCisgICAgU0ROb2RlICpOID0gTkk7CisgICAgd2hpbGUgKE4tPmdldE51bU9wZXJhbmRzKCkgJiYKKyAgICAgICAgICAgTi0+Z2V0T3BlcmFuZChOLT5nZXROdW1PcGVyYW5kcygpLTEpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6RmxhZykgeworICAgICAgTiA9IE4tPmdldE9wZXJhbmQoTi0+Z2V0TnVtT3BlcmFuZHMoKS0xKS5nZXROb2RlKCk7CisgICAgICBhc3NlcnQoTi0+Z2V0Tm9kZUlkKCkgPT0gLTEgJiYgIk5vZGUgYWxyZWFkeSBpbnNlcnRlZCEiKTsKKyAgICAgIE4tPnNldE5vZGVJZChOb2RlU1VuaXQtPk5vZGVOdW0pOworICAgIH0KKyAgICAKKyAgICAvLyBTY2FuIGRvd24gdG8gZmluZCBhbnkgZmxhZ2dlZCBzdWNjcy4KKyAgICBOID0gTkk7CisgICAgd2hpbGUgKE4tPmdldFZhbHVlVHlwZShOLT5nZXROdW1WYWx1ZXMoKS0xKSA9PSBNVlQ6OkZsYWcpIHsKKyAgICAgIFNEVmFsdWUgRmxhZ1ZhbChOLCBOLT5nZXROdW1WYWx1ZXMoKS0xKTsKKyAgICAgIAorICAgICAgLy8gVGhlcmUgYXJlIGVpdGhlciB6ZXJvIG9yIG9uZSB1c2VycyBvZiB0aGUgRmxhZyByZXN1bHQuCisgICAgICBib29sIEhhc0ZsYWdVc2UgPSBmYWxzZTsKKyAgICAgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBOLT51c2VfYmVnaW4oKSwgRSA9IE4tPnVzZV9lbmQoKTsgCisgICAgICAgICAgIFVJICE9IEU7ICsrVUkpCisgICAgICAgIGlmIChGbGFnVmFsLmlzT3BlcmFuZE9mKCpVSSkpIHsKKyAgICAgICAgICBIYXNGbGFnVXNlID0gdHJ1ZTsKKyAgICAgICAgICBhc3NlcnQoTi0+Z2V0Tm9kZUlkKCkgPT0gLTEgJiYgIk5vZGUgYWxyZWFkeSBpbnNlcnRlZCEiKTsKKyAgICAgICAgICBOLT5zZXROb2RlSWQoTm9kZVNVbml0LT5Ob2RlTnVtKTsKKyAgICAgICAgICBOID0gKlVJOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBpZiAoIUhhc0ZsYWdVc2UpIGJyZWFrOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGVyZSBhcmUgZmxhZyBvcGVyYW5kcyBpbnZvbHZlZCwgTiBpcyBub3cgdGhlIGJvdHRvbS1tb3N0IG5vZGUKKyAgICAvLyBvZiB0aGUgc2VxdWVuY2Ugb2Ygbm9kZXMgdGhhdCBhcmUgZmxhZ2dlZCB0b2dldGhlci4KKyAgICAvLyBVcGRhdGUgdGhlIFNVbml0LgorICAgIE5vZGVTVW5pdC0+c2V0Tm9kZShOKTsKKyAgICBhc3NlcnQoTi0+Z2V0Tm9kZUlkKCkgPT0gLTEgJiYgIk5vZGUgYWxyZWFkeSBpbnNlcnRlZCEiKTsKKyAgICBOLT5zZXROb2RlSWQoTm9kZVNVbml0LT5Ob2RlTnVtKTsKKworICAgIC8vIEFzc2lnbiB0aGUgTGF0ZW5jeSBmaWVsZCBvZiBOb2RlU1VuaXQgdXNpbmcgdGFyZ2V0LXByb3ZpZGVkIGluZm9ybWF0aW9uLgorICAgIENvbXB1dGVMYXRlbmN5KE5vZGVTVW5pdCk7CisgIH0KK30KKwordm9pZCBTY2hlZHVsZURBR1NETm9kZXM6OkFkZFNjaGVkRWRnZXMoKSB7CisgIGNvbnN0IFRhcmdldFN1YnRhcmdldCAmU1QgPSBUTS5nZXRTdWJ0YXJnZXQ8VGFyZ2V0U3VidGFyZ2V0PigpOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgc2NoZWR1bGVyIGNhcmVzIGFib3V0IGxhdGVuY2llcy4KKyAgYm9vbCBVbml0TGF0ZW5jaWVzID0gRm9yY2VVbml0TGF0ZW5jaWVzKCk7CisKKyAgLy8gUGFzcyAyOiBhZGQgdGhlIHByZWRzLCBzdWNjcywgZXRjLgorICBmb3IgKHVuc2lnbmVkIHN1ID0gMCwgZSA9IFNVbml0cy5zaXplKCk7IHN1ICE9IGU7ICsrc3UpIHsKKyAgICBTVW5pdCAqU1UgPSAmU1VuaXRzW3N1XTsKKyAgICBTRE5vZGUgKk1haW5Ob2RlID0gU1UtPmdldE5vZGUoKTsKKyAgICAKKyAgICBpZiAoTWFpbk5vZGUtPmlzTWFjaGluZU9wY29kZSgpKSB7CisgICAgICB1bnNpZ25lZCBPcGMgPSBNYWluTm9kZS0+Z2V0TWFjaGluZU9wY29kZSgpOworICAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBUSUktPmdldChPcGMpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKTsgKytpKSB7CisgICAgICAgIGlmIChUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoaSwgVE9JOjpUSUVEX1RPKSAhPSAtMSkgeworICAgICAgICAgIFNVLT5pc1R3b0FkZHJlc3MgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoVElELmlzQ29tbXV0YWJsZSgpKQorICAgICAgICBTVS0+aXNDb21tdXRhYmxlID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLy8gRmluZCBhbGwgcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzIG9mIHRoZSBncm91cC4KKyAgICBmb3IgKFNETm9kZSAqTiA9IFNVLT5nZXROb2RlKCk7IE47IE4gPSBOLT5nZXRGbGFnZ2VkTm9kZSgpKSB7CisgICAgICBpZiAoTi0+aXNNYWNoaW5lT3Bjb2RlKCkgJiYKKyAgICAgICAgICBUSUktPmdldChOLT5nZXRNYWNoaW5lT3Bjb2RlKCkpLmdldEltcGxpY2l0RGVmcygpKSB7CisgICAgICAgIFNVLT5oYXNQaHlzUmVnQ2xvYmJlcnMgPSB0cnVlOworICAgICAgICB1bnNpZ25lZCBOdW1Vc2VkID0gSW5zdHJFbWl0dGVyOjpDb3VudFJlc3VsdHMoTik7CisgICAgICAgIHdoaWxlIChOdW1Vc2VkICE9IDAgJiYgIU4tPmhhc0FueVVzZU9mVmFsdWUoTnVtVXNlZCAtIDEpKQorICAgICAgICAgIC0tTnVtVXNlZDsgICAgLy8gU2tpcCBvdmVyIHVudXNlZCB2YWx1ZXMgYXQgdGhlIGVuZC4KKyAgICAgICAgaWYgKE51bVVzZWQgPiBUSUktPmdldChOLT5nZXRNYWNoaW5lT3Bjb2RlKCkpLmdldE51bURlZnMoKSkKKyAgICAgICAgICBTVS0+aGFzUGh5c1JlZ0RlZnMgPSB0cnVlOworICAgICAgfQorICAgICAgCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgU0ROb2RlICpPcE4gPSBOLT5nZXRPcGVyYW5kKGkpLmdldE5vZGUoKTsKKyAgICAgICAgaWYgKGlzUGFzc2l2ZU5vZGUoT3BOKSkgY29udGludWU7ICAgLy8gTm90IHNjaGVkdWxlZC4KKyAgICAgICAgU1VuaXQgKk9wU1UgPSAmU1VuaXRzW09wTi0+Z2V0Tm9kZUlkKCldOworICAgICAgICBhc3NlcnQoT3BTVSAmJiAiTm9kZSBoYXMgbm8gU1VuaXQhIik7CisgICAgICAgIGlmIChPcFNVID09IFNVKSBjb250aW51ZTsgICAgICAgICAgIC8vIEluIHRoZSBzYW1lIGdyb3VwLgorCisgICAgICAgIEVWVCBPcFZUID0gTi0+Z2V0T3BlcmFuZChpKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgICAgYXNzZXJ0KE9wVlQgIT0gTVZUOjpGbGFnICYmICJGbGFnZ2VkIG5vZGVzIHNob3VsZCBiZSBpbiBzYW1lIHN1bml0ISIpOworICAgICAgICBib29sIGlzQ2hhaW4gPSBPcFZUID09IE1WVDo6T3RoZXI7CisKKyAgICAgICAgdW5zaWduZWQgUGh5c1JlZyA9IDA7CisgICAgICAgIGludCBDb3N0ID0gMTsKKyAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBwaHlzaWNhbCByZWdpc3RlciBkZXBlbmRlbmN5LgorICAgICAgICBDaGVja0ZvclBoeXNSZWdEZXBlbmRlbmN5KE9wTiwgTiwgaSwgVFJJLCBUSUksIFBoeXNSZWcsIENvc3QpOworICAgICAgICBhc3NlcnQoKFBoeXNSZWcgPT0gMCB8fCAhaXNDaGFpbikgJiYKKyAgICAgICAgICAgICAgICJDaGFpbiBkZXBlbmRlbmNlIHZpYSBwaHlzcmVnIGRhdGE/Iik7CisgICAgICAgIC8vIEZJWE1FOiBTZWUgU2NoZWR1bGVEQUdTRE5vZGVzOjpFbWl0Q29weUZyb21SZWcuIEZvciBub3csIHNjaGVkdWxlcgorICAgICAgICAvLyBlbWl0cyBhIGNvcHkgZnJvbSB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIgdG8gYSB2aXJ0dWFsIHJlZ2lzdGVyIHVubGVzcworICAgICAgICAvLyBpdCByZXF1aXJlcyBhIGNyb3NzIGNsYXNzIGNvcHkgKGNvc3QgPCAwKS4gVGhhdCBtZWFucyB3ZSBhcmUgb25seQorICAgICAgICAvLyB0cmVhdGluZyAiZXhwZW5zaXZlIHRvIGNvcHkiIHJlZ2lzdGVyIGRlcGVuZGVuY3kgYXMgcGh5c2ljYWwgcmVnaXN0ZXIKKyAgICAgICAgLy8gZGVwZW5kZW5jeS4gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdGhvdWdoLgorICAgICAgICBpZiAoQ29zdCA+PSAwKQorICAgICAgICAgIFBoeXNSZWcgPSAwOworCisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjdHJsIGRlcCwgbGF0ZW5jeSBpcyAxLgorICAgICAgICB1bnNpZ25lZCBPcExhdGVuY3kgPSBpc0NoYWluID8gMSA6IE9wU1UtPkxhdGVuY3k7CisgICAgICAgIGNvbnN0IFNEZXAgJmRlcCA9IFNEZXAoT3BTVSwgaXNDaGFpbiA/IFNEZXA6Ok9yZGVyIDogU0RlcDo6RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcExhdGVuY3ksIFBoeXNSZWcpOworICAgICAgICBpZiAoIWlzQ2hhaW4gJiYgIVVuaXRMYXRlbmNpZXMpIHsKKyAgICAgICAgICBDb21wdXRlT3BlcmFuZExhdGVuY3koT3BOLCBOLCBpLCBjb25zdF9jYXN0PFNEZXAgJj4oZGVwKSk7CisgICAgICAgICAgU1QuYWRqdXN0U2NoZWREZXBlbmRlbmN5KE9wU1UsIFNVLCBjb25zdF9jYXN0PFNEZXAgJj4oZGVwKSk7CisgICAgICAgIH0KKworICAgICAgICBTVS0+YWRkUHJlZChkZXApOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gQnVpbGRTY2hlZEdyYXBoIC0gQnVpbGQgdGhlIFNVbml0IGdyYXBoIGZyb20gdGhlIHNlbGVjdGlvbiBkYWcgdGhhdCB3ZQorLy8vIGFyZSBpbnB1dC4gIFRoaXMgU1VuaXQgZ3JhcGggaXMgc2ltaWxhciB0byB0aGUgU2VsZWN0aW9uREFHLCBidXQKKy8vLyBleGNsdWRlcyBub2RlcyB0aGF0IGFyZW4ndCBpbnRlcmVzdGluZyB0byBzY2hlZHVsaW5nLCBhbmQgcmVwcmVzZW50cworLy8vIGZsYWdnZWQgdG9nZXRoZXIgbm9kZXMgd2l0aCBhIHNpbmdsZSBTVW5pdC4KK3ZvaWQgU2NoZWR1bGVEQUdTRE5vZGVzOjpCdWlsZFNjaGVkR3JhcGgoQWxpYXNBbmFseXNpcyAqQUEpIHsKKyAgLy8gQ2x1c3RlciBjZXJ0YWluIG5vZGVzIHdoaWNoIHNob3VsZCBiZSBzY2hlZHVsZWQgdG9nZXRoZXIuCisgIENsdXN0ZXJOb2RlcygpOworICAvLyBQb3B1bGF0ZSB0aGUgU1VuaXRzIGFycmF5LgorICBCdWlsZFNjaGVkVW5pdHMoKTsKKyAgLy8gQ29tcHV0ZSBhbGwgdGhlIHNjaGVkdWxpbmcgZGVwZW5kZW5jaWVzIGJldHdlZW4gbm9kZXMuCisgIEFkZFNjaGVkRWRnZXMoKTsKK30KKwordm9pZCBTY2hlZHVsZURBR1NETm9kZXM6OkNvbXB1dGVMYXRlbmN5KFNVbml0ICpTVSkgeworICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHNjaGVkdWxlciBjYXJlcyBhYm91dCBsYXRlbmNpZXMuCisgIGlmIChGb3JjZVVuaXRMYXRlbmNpZXMoKSkgeworICAgIFNVLT5MYXRlbmN5ID0gMTsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgJkluc3RySXRpbnMgPSBUTS5nZXRJbnN0ckl0aW5lcmFyeURhdGEoKTsKKyAgaWYgKEluc3RySXRpbnMuaXNFbXB0eSgpKSB7CisgICAgU1UtPkxhdGVuY3kgPSAxOworICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gQ29tcHV0ZSB0aGUgbGF0ZW5jeSBmb3IgdGhlIG5vZGUuICBXZSB1c2UgdGhlIHN1bSBvZiB0aGUgbGF0ZW5jaWVzIGZvcgorICAvLyBhbGwgbm9kZXMgZmxhZ2dlZCB0b2dldGhlciBpbnRvIHRoaXMgU1VuaXQuCisgIFNVLT5MYXRlbmN5ID0gMDsKKyAgZm9yIChTRE5vZGUgKk4gPSBTVS0+Z2V0Tm9kZSgpOyBOOyBOID0gTi0+Z2V0RmxhZ2dlZE5vZGUoKSkKKyAgICBpZiAoTi0+aXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICAgIFNVLT5MYXRlbmN5ICs9IEluc3RySXRpbnMuCisgICAgICAgIGdldFN0YWdlTGF0ZW5jeShUSUktPmdldChOLT5nZXRNYWNoaW5lT3Bjb2RlKCkpLmdldFNjaGVkQ2xhc3MoKSk7CisgICAgfQorfQorCit2b2lkIFNjaGVkdWxlREFHU0ROb2Rlczo6Q29tcHV0ZU9wZXJhbmRMYXRlbmN5KFNETm9kZSAqRGVmLCBTRE5vZGUgKlVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BJZHgsIFNEZXAmIGRlcCkgY29uc3R7CisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgc2NoZWR1bGVyIGNhcmVzIGFib3V0IGxhdGVuY2llcy4KKyAgaWYgKEZvcmNlVW5pdExhdGVuY2llcygpKQorICAgIHJldHVybjsKKworICBjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgJkluc3RySXRpbnMgPSBUTS5nZXRJbnN0ckl0aW5lcmFyeURhdGEoKTsKKyAgaWYgKEluc3RySXRpbnMuaXNFbXB0eSgpKQorICAgIHJldHVybjsKKyAgCisgIGlmIChkZXAuZ2V0S2luZCgpICE9IFNEZXA6OkRhdGEpCisgICAgcmV0dXJuOworCisgIHVuc2lnbmVkIERlZklkeCA9IFVzZS0+Z2V0T3BlcmFuZChPcElkeCkuZ2V0UmVzTm8oKTsKKyAgaWYgKERlZi0+aXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJklJID0gVElJLT5nZXQoRGVmLT5nZXRNYWNoaW5lT3Bjb2RlKCkpOworICAgIGlmIChEZWZJZHggPj0gSUkuZ2V0TnVtRGVmcygpKQorICAgICAgcmV0dXJuOworICAgIGludCBEZWZDeWNsZSA9IEluc3RySXRpbnMuZ2V0T3BlcmFuZEN5Y2xlKElJLmdldFNjaGVkQ2xhc3MoKSwgRGVmSWR4KTsKKyAgICBpZiAoRGVmQ3ljbGUgPCAwKQorICAgICAgcmV0dXJuOworICAgIGludCBVc2VDeWNsZSA9IDE7CisgICAgaWYgKFVzZS0+aXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIFVzZUNsYXNzID0gVElJLT5nZXQoVXNlLT5nZXRNYWNoaW5lT3Bjb2RlKCkpLmdldFNjaGVkQ2xhc3MoKTsKKyAgICAgIFVzZUN5Y2xlID0gSW5zdHJJdGlucy5nZXRPcGVyYW5kQ3ljbGUoVXNlQ2xhc3MsIE9wSWR4KTsKKyAgICB9CisgICAgaWYgKFVzZUN5Y2xlID49IDApIHsKKyAgICAgIGludCBMYXRlbmN5ID0gRGVmQ3ljbGUgLSBVc2VDeWNsZSArIDE7CisgICAgICBpZiAoTGF0ZW5jeSA+PSAwKQorICAgICAgICBkZXAuc2V0TGF0ZW5jeShMYXRlbmN5KTsKKyAgICB9CisgIH0KK30KKwordm9pZCBTY2hlZHVsZURBR1NETm9kZXM6OmR1bXBOb2RlKGNvbnN0IFNVbml0ICpTVSkgY29uc3QgeworICBpZiAoIVNVLT5nZXROb2RlKCkpIHsKKyAgICBkYmdzKCkgPDwgIlBIWVMgUkVHIENPUFlcbiI7CisgICAgcmV0dXJuOworICB9CisKKyAgU1UtPmdldE5vZGUoKS0+ZHVtcChEQUcpOworICBkYmdzKCkgPDwgIlxuIjsKKyAgU21hbGxWZWN0b3I8U0ROb2RlICosIDQ+IEZsYWdnZWROb2RlczsKKyAgZm9yIChTRE5vZGUgKk4gPSBTVS0+Z2V0Tm9kZSgpLT5nZXRGbGFnZ2VkTm9kZSgpOyBOOyBOID0gTi0+Z2V0RmxhZ2dlZE5vZGUoKSkKKyAgICBGbGFnZ2VkTm9kZXMucHVzaF9iYWNrKE4pOworICB3aGlsZSAoIUZsYWdnZWROb2Rlcy5lbXB0eSgpKSB7CisgICAgZGJncygpIDw8ICIgICAgIjsKKyAgICBGbGFnZ2VkTm9kZXMuYmFjaygpLT5kdW1wKERBRyk7CisgICAgZGJncygpIDw8ICJcbiI7CisgICAgRmxhZ2dlZE5vZGVzLnBvcF9iYWNrKCk7CisgIH0KK30KKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IE9yZGVyU29ydGVyIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPHVuc2lnbmVkLCBNYWNoaW5lSW5zdHIqPiAmQSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPHVuc2lnbmVkLCBNYWNoaW5lSW5zdHIqPiAmQikgeworICAgICAgcmV0dXJuIEEuZmlyc3QgPCBCLmZpcnN0OworICAgIH0KKyAgfTsKK30KKworLy8gUHJvY2Vzc1NvdXJjZU5vZGUgLSBQcm9jZXNzIG5vZGVzIHdpdGggc291cmNlIG9yZGVyIG51bWJlcnMuIFRoZXNlIGFyZSBhZGRlZAorLy8gdG8gYSB2ZWN0b3Igd2hpY2ggRW1pdFNjaGVkdWxlIHVzZXMgdG8gZGV0ZXJtaW5lIGhvdyB0byBpbnNlcnQgZGJnX3ZhbHVlCisvLyBpbnN0cnVjdGlvbnMgaW4gdGhlIHJpZ2h0IG9yZGVyLgorc3RhdGljIHZvaWQgUHJvY2Vzc1NvdXJjZU5vZGUoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgKkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyRW1pdHRlciAmRW1pdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiAmVlJCYXNlTWFwLAorICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIE1hY2hpbmVJbnN0cio+LCAzMj4gJk9yZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0PHVuc2lnbmVkLCA4PiAmU2VlbikgeworICB1bnNpZ25lZCBPcmRlciA9IERBRy0+R2V0T3JkZXJpbmcoTik7CisgIGlmICghT3JkZXIgfHwgIVNlZW4uaW5zZXJ0KE9yZGVyKSkKKyAgICByZXR1cm47CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKkJCID0gRW1pdHRlci5nZXRCbG9jaygpOworICBpZiAoRW1pdHRlci5nZXRJbnNlcnRQb3MoKSA9PSBCQi0+YmVnaW4oKSB8fCBCQi0+YmFjaygpLmlzUEhJKCkpIHsKKyAgICAvLyBEaWQgbm90IGluc2VydCBhbnkgaW5zdHJ1Y3Rpb24uCisgICAgT3JkZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihPcmRlciwgKE1hY2hpbmVJbnN0ciopMCkpOworICAgIHJldHVybjsKKyAgfQorCisgIE9yZGVycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoT3JkZXIsIHByaW9yKEVtaXR0ZXIuZ2V0SW5zZXJ0UG9zKCkpKSk7CisgIGlmICghTi0+Z2V0SGFzRGVidWdWYWx1ZSgpKQorICAgIHJldHVybjsKKyAgLy8gT3Bwb3J0dW5pc3RpY2FsbHkgaW5zZXJ0IGltbWVkaWF0ZSBkYmdfdmFsdWUgdXNlcywgaS5lLiB0aG9zZSB3aXRoIHNvdXJjZQorICAvLyBvcmRlciBudW1iZXIgcmlnaHQgYWZ0ZXIgdGhlIE4uCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQb3MgPSBFbWl0dGVyLmdldEluc2VydFBvcygpOworICBTbWFsbFZlY3RvcjxTRERiZ1ZhbHVlKiwyPiAmRFZzID0gREFHLT5HZXREYmdWYWx1ZXMoTik7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEVnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChEVnNbaV0tPmlzSW52YWxpZGF0ZWQoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIERWT3JkZXIgPSBEVnNbaV0tPmdldE9yZGVyKCk7CisgICAgaWYgKERWT3JkZXIgPT0gKytPcmRlcikgeworICAgICAgTWFjaGluZUluc3RyICpEYmdNSSA9IEVtaXR0ZXIuRW1pdERiZ1ZhbHVlKERWc1tpXSwgVlJCYXNlTWFwKTsKKyAgICAgIGlmIChEYmdNSSkgeworICAgICAgICBPcmRlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKERWT3JkZXIsIERiZ01JKSk7CisgICAgICAgIEJCLT5pbnNlcnQoSW5zZXJ0UG9zLCBEYmdNSSk7CisgICAgICB9CisgICAgICBEVnNbaV0tPnNldElzSW52YWxpZGF0ZWQoKTsKKyAgICB9CisgIH0KK30KKworCisvLy8gRW1pdFNjaGVkdWxlIC0gRW1pdCB0aGUgbWFjaGluZSBjb2RlIGluIHNjaGVkdWxlZCBvcmRlci4KK01hY2hpbmVCYXNpY0Jsb2NrICpTY2hlZHVsZURBR1NETm9kZXM6OkVtaXRTY2hlZHVsZSgpIHsKKyAgSW5zdHJFbWl0dGVyIEVtaXR0ZXIoQkIsIEluc2VydFBvcyk7CisgIERlbnNlTWFwPFNEVmFsdWUsIHVuc2lnbmVkPiBWUkJhc2VNYXA7CisgIERlbnNlTWFwPFNVbml0KiwgdW5zaWduZWQ+IENvcHlWUkJhc2VNYXA7CisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTWFjaGluZUluc3RyKj4sIDMyPiBPcmRlcnM7CisgIFNtYWxsU2V0PHVuc2lnbmVkLCA4PiBTZWVuOworICBib29sIEhhc0RiZyA9IERBRy0+aGFzRGVidWdWYWx1ZXMoKTsKKworICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBCQiwgZW1pdCBieXZhbCBwYXJhbWV0ZXIgZGJnX3ZhbHVlJ3MuCisgIGlmIChIYXNEYmcgJiYgQkItPmdldFBhcmVudCgpLT5iZWdpbigpID09IE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoQkIpKSB7CisgICAgU0REYmdJbmZvOjpEYmdJdGVyYXRvciBQREkgPSBEQUctPkJ5dmFsUGFybURiZ0JlZ2luKCk7CisgICAgU0REYmdJbmZvOjpEYmdJdGVyYXRvciBQREUgPSBEQUctPkJ5dmFsUGFybURiZ0VuZCgpOworICAgIGZvciAoOyBQREkgIT0gUERFOyArK1BESSkgeworICAgICAgTWFjaGluZUluc3RyICpEYmdNST0gRW1pdHRlci5FbWl0RGJnVmFsdWUoKlBESSwgVlJCYXNlTWFwKTsKKyAgICAgIGlmIChEYmdNSSkKKyAgICAgICAgQkItPmluc2VydChJbnNlcnRQb3MsIERiZ01JKTsKKyAgICB9CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU2VxdWVuY2Uuc2l6ZSgpOyBpICE9IGU7IGkrKykgeworICAgIFNVbml0ICpTVSA9IFNlcXVlbmNlW2ldOworICAgIGlmICghU1UpIHsKKyAgICAgIC8vIE51bGwgU1VuaXQqIGlzIGEgbm9vcC4KKyAgICAgIEVtaXROb29wKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBGb3IgcHJlLXJlZ2FsbG9jIHNjaGVkdWxpbmcsIGNyZWF0ZSBpbnN0cnVjdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAvLyBTRE5vZGUgYW5kIGFueSBmbGFnZ2VkIFNETm9kZXMgYW5kIGFwcGVuZCB0aGVtIHRvIHRoZSBibG9jay4KKyAgICBpZiAoIVNVLT5nZXROb2RlKCkpIHsKKyAgICAgIC8vIEVtaXQgYSBjb3B5LgorICAgICAgRW1pdFBoeXNSZWdDb3B5KFNVLCBDb3B5VlJCYXNlTWFwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFNtYWxsVmVjdG9yPFNETm9kZSAqLCA0PiBGbGFnZ2VkTm9kZXM7CisgICAgZm9yIChTRE5vZGUgKk4gPSBTVS0+Z2V0Tm9kZSgpLT5nZXRGbGFnZ2VkTm9kZSgpOyBOOworICAgICAgICAgTiA9IE4tPmdldEZsYWdnZWROb2RlKCkpCisgICAgICBGbGFnZ2VkTm9kZXMucHVzaF9iYWNrKE4pOworICAgIHdoaWxlICghRmxhZ2dlZE5vZGVzLmVtcHR5KCkpIHsKKyAgICAgIFNETm9kZSAqTiA9IEZsYWdnZWROb2Rlcy5iYWNrKCk7CisgICAgICBFbWl0dGVyLkVtaXROb2RlKEZsYWdnZWROb2Rlcy5iYWNrKCksIFNVLT5PcmlnTm9kZSAhPSBTVSwgU1UtPmlzQ2xvbmVkLAorICAgICAgICAgICAgICAgICAgICAgICBWUkJhc2VNYXApOworICAgICAgLy8gUmVtZW1iZXIgdGhlIHNvdXJjZSBvcmRlciBvZiB0aGUgaW5zZXJ0ZWQgaW5zdHJ1Y3Rpb24uCisgICAgICBpZiAoSGFzRGJnKQorICAgICAgICBQcm9jZXNzU291cmNlTm9kZShOLCBEQUcsIEVtaXR0ZXIsIFZSQmFzZU1hcCwgT3JkZXJzLCBTZWVuKTsKKyAgICAgIEZsYWdnZWROb2Rlcy5wb3BfYmFjaygpOworICAgIH0KKyAgICBFbWl0dGVyLkVtaXROb2RlKFNVLT5nZXROb2RlKCksIFNVLT5PcmlnTm9kZSAhPSBTVSwgU1UtPmlzQ2xvbmVkLAorICAgICAgICAgICAgICAgICAgICAgVlJCYXNlTWFwKTsKKyAgICAvLyBSZW1lbWJlciB0aGUgc291cmNlIG9yZGVyIG9mIHRoZSBpbnNlcnRlZCBpbnN0cnVjdGlvbi4KKyAgICBpZiAoSGFzRGJnKQorICAgICAgUHJvY2Vzc1NvdXJjZU5vZGUoU1UtPmdldE5vZGUoKSwgREFHLCBFbWl0dGVyLCBWUkJhc2VNYXAsIE9yZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlZW4pOworICB9CisKKyAgLy8gSW5zZXJ0IGFsbCB0aGUgZGJnX3ZhbHVlcyB3aGljaCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gaW5zZXJ0ZWQgaW4gc291cmNlCisgIC8vIG9yZGVyIHNlcXVlbmNlLgorICBpZiAoSGFzRGJnKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCQmVnaW4gPSBCQi0+Z2V0Rmlyc3ROb25QSEkoKTsKKworICAgIC8vIFNvcnQgdGhlIHNvdXJjZSBvcmRlciBpbnN0cnVjdGlvbnMgYW5kIHVzZSB0aGUgb3JkZXIgdG8gaW5zZXJ0IGRlYnVnCisgICAgLy8gdmFsdWVzLgorICAgIHN0ZDo6c29ydChPcmRlcnMuYmVnaW4oKSwgT3JkZXJzLmVuZCgpLCBPcmRlclNvcnRlcigpKTsKKworICAgIFNERGJnSW5mbzo6RGJnSXRlcmF0b3IgREkgPSBEQUctPkRiZ0JlZ2luKCk7CisgICAgU0REYmdJbmZvOjpEYmdJdGVyYXRvciBERSA9IERBRy0+RGJnRW5kKCk7CisgICAgLy8gTm93IGVtaXQgdGhlIHJlc3QgYWNjb3JkaW5nIHRvIHNvdXJjZSBvcmRlci4KKyAgICB1bnNpZ25lZCBMYXN0T3JkZXIgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcmRlcnMuc2l6ZSgpOyBpICE9IGUgJiYgREkgIT0gREU7ICsraSkgeworICAgICAgdW5zaWduZWQgT3JkZXIgPSBPcmRlcnNbaV0uZmlyc3Q7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gT3JkZXJzW2ldLnNlY29uZDsKKyAgICAgIC8vIEluc2VydCBhbGwgU0REYmdWYWx1ZSdzIHdob3NlIG9yZGVyKHMpIGFyZSBiZWZvcmUgIk9yZGVyIi4KKyAgICAgIGlmICghTUkpCisgICAgICAgIGNvbnRpbnVlOworI2lmbmRlZiBOREVCVUcKKyAgICAgIHVuc2lnbmVkIExhc3RESU9yZGVyID0gMDsKKyNlbmRpZgorICAgICAgZm9yICg7IERJICE9IERFICYmCisgICAgICAgICAgICAgKCpESSktPmdldE9yZGVyKCkgPj0gTGFzdE9yZGVyICYmICgqREkpLT5nZXRPcmRlcigpIDwgT3JkZXI7ICsrREkpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIGFzc2VydCgoKkRJKS0+Z2V0T3JkZXIoKSA+PSBMYXN0RElPcmRlciAmJgorICAgICAgICAgICAgICAgIlNERGJnVmFsdWUgbm9kZXMgbXVzdCBiZSBpbiBzb3VyY2Ugb3JkZXIhIik7CisgICAgICAgIExhc3RESU9yZGVyID0gKCpESSktPmdldE9yZGVyKCk7CisjZW5kaWYKKyAgICAgICAgaWYgKCgqREkpLT5pc0ludmFsaWRhdGVkKCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIE1hY2hpbmVJbnN0ciAqRGJnTUkgPSBFbWl0dGVyLkVtaXREYmdWYWx1ZSgqREksIFZSQmFzZU1hcCk7CisgICAgICAgIGlmIChEYmdNSSkgeworICAgICAgICAgIGlmICghTGFzdE9yZGVyKQorICAgICAgICAgICAgLy8gSW5zZXJ0IHRvIHN0YXJ0IG9mIHRoZSBCQiAoYWZ0ZXIgUEhJcykuCisgICAgICAgICAgICBCQi0+aW5zZXJ0KEJCQmVnaW4sIERiZ01JKTsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIEluc2VydCBhdCB0aGUgaW5zdHJ1Y3Rpb24sIHdoaWNoIG1heSBiZSBpbiBhIGRpZmZlcmVudAorICAgICAgICAgICAgLy8gYmxvY2ssIGlmIHRoZSBibG9jayB3YXMgc3BsaXQgYnkgYSBjdXN0b20gaW5zZXJ0ZXIuCisgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUG9zID0gTUk7CisgICAgICAgICAgICBNSS0+Z2V0UGFyZW50KCktPmluc2VydChsbHZtOjpuZXh0KFBvcyksIERiZ01JKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIExhc3RPcmRlciA9IE9yZGVyOworICAgIH0KKyAgICAvLyBBZGQgdHJhaWxpbmcgRGJnVmFsdWUncyBiZWZvcmUgdGhlIHRlcm1pbmF0b3IuIEZJWE1FOiBNYXkgd2FudCB0byBhZGQKKyAgICAvLyBzb21lIG9mIHRoZW0gYmVmb3JlIG9uZSBvciBtb3JlIGNvbmRpdGlvbmFsIGJyYW5jaGVzPworICAgIHdoaWxlIChESSAhPSBERSkgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkluc2VydEJCID0gRW1pdHRlci5nZXRCbG9jaygpOworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFBvcz0gRW1pdHRlci5nZXRCbG9jaygpLT5nZXRGaXJzdFRlcm1pbmF0b3IoKTsKKyAgICAgIGlmICghKCpESSktPmlzSW52YWxpZGF0ZWQoKSkgeworICAgICAgICBNYWNoaW5lSW5zdHIgKkRiZ01JPSBFbWl0dGVyLkVtaXREYmdWYWx1ZSgqREksIFZSQmFzZU1hcCk7CisgICAgICAgIGlmIChEYmdNSSkKKyAgICAgICAgICBJbnNlcnRCQi0+aW5zZXJ0KFBvcywgRGJnTUkpOworICAgICAgfQorICAgICAgKytESTsKKyAgICB9CisgIH0KKworICBCQiA9IEVtaXR0ZXIuZ2V0QmxvY2soKTsKKyAgSW5zZXJ0UG9zID0gRW1pdHRlci5nZXRJbnNlcnRQb3MoKTsKKyAgcmV0dXJuIEJCOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NjaGVkdWxlREFHU0ROb2Rlcy5oIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NjaGVkdWxlREFHU0ROb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MmZjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2NoZWR1bGVEQUdTRE5vZGVzLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vPT09LS0tLSBTY2hlZHVsZURBR1NETm9kZXMuaCAtIFNETm9kZSBTY2hlZHVsaW5nIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNjaGVkdWxlREFHU0ROb2RlcyBjbGFzcywgd2hpY2ggaW1wbGVtZW50cworLy8gc2NoZWR1bGluZyBmb3IgYW4gU0ROb2RlLWJhc2VkIGRlcGVuZGVuY3kgZ3JhcGguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTQ0hFRFVMRURBR1NETk9ERVNfSAorI2RlZmluZSBTQ0hFRFVMRURBR1NETk9ERVNfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vLyBTY2hlZHVsZURBR1NETm9kZXMgLSBBIFNjaGVkdWxlREFHIGZvciBzY2hlZHVsaW5nIFNETm9kZS1iYXNlZCBEQUdzLgorICAvLy8gCisgIC8vLyBFZGdlcyBiZXR3ZWVuIFNVbml0cyBhcmUgaW5pdGlhbGx5IGJhc2VkIG9uIGVkZ2VzIGluIHRoZSBTZWxlY3Rpb25EQUcsCisgIC8vLyBhbmQgYWRkaXRpb25hbCBlZGdlcyBjYW4gYmUgYWRkZWQgYnkgdGhlIHNjaGVkdWxlcnMgYXMgaGV1cmlzdGljcy4KKyAgLy8vIFNETm9kZXMgc3VjaCBhcyBDb25zdGFudHMsIFJlZ2lzdGVycywgYW5kIGEgZmV3IG90aGVycyB0aGF0IGFyZSBub3QKKyAgLy8vIGludGVyZXN0aW5nIHRvIHNjaGVkdWxlcnMgYXJlIG5vdCBhbGxvY2F0ZWQgU1VuaXRzLgorICAvLy8KKyAgLy8vIFNETm9kZXMgd2l0aCBNVlQ6OkZsYWcgb3BlcmFuZHMgYXJlIGdyb3VwZWQgYWxvbmcgd2l0aCB0aGUgZmxhZ2dlZAorICAvLy8gbm9kZXMgaW50byBhIHNpbmdsZSBTVW5pdCBzbyB0aGF0IHRoZXkgYXJlIHNjaGVkdWxlZCB0b2dldGhlci4KKyAgLy8vCisgIC8vLyBTRE5vZGUtYmFzZWQgc2NoZWR1bGluZyBncmFwaHMgZG8gbm90IHVzZSBTRGVwOjpBbnRpIG9yIFNEZXA6Ok91dHB1dAorICAvLy8gZWRnZXMuICBQaHlzaWNhbCByZWdpc3RlciBkZXBlbmRlbmNlIGluZm9ybWF0aW9uIGlzIG5vdCBjYXJyaWVkIGluCisgIC8vLyB0aGUgREFHIGFuZCBtdXN0IGJlIGhhbmRsZWQgZXhwbGljaXRseSBieSBzY2hlZHVsZXJzLgorICAvLy8KKyAgY2xhc3MgU2NoZWR1bGVEQUdTRE5vZGVzIDogcHVibGljIFNjaGVkdWxlREFHIHsKKyAgcHVibGljOgorICAgIFNlbGVjdGlvbkRBRyAqREFHOyAgICAgICAgICAgICAgICAgICAgLy8gREFHIG9mIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrCisKKyAgICBleHBsaWNpdCBTY2hlZHVsZURBR1NETm9kZXMoTWFjaGluZUZ1bmN0aW9uICZtZik7CisKKyAgICB2aXJ0dWFsIH5TY2hlZHVsZURBR1NETm9kZXMoKSB7fQorCisgICAgLy8vIFJ1biAtIHBlcmZvcm0gc2NoZWR1bGluZy4KKyAgICAvLy8KKyAgICB2b2lkIFJ1bihTZWxlY3Rpb25EQUcgKmRhZywgTWFjaGluZUJhc2ljQmxvY2sgKmJiLAorICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBpbnNlcnRQb3MpOworCisgICAgLy8vIGlzUGFzc2l2ZU5vZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIG5vbi1zY2hlZHVsZWQgbGVhZi4KKyAgICAvLy8KKyAgICBzdGF0aWMgYm9vbCBpc1Bhc3NpdmVOb2RlKFNETm9kZSAqTm9kZSkgeworICAgICAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oTm9kZSkpICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzYTxDb25zdGFudEZQU0ROb2RlPihOb2RlKSkgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzYTxSZWdpc3RlclNETm9kZT4oTm9kZSkpICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzYTxHbG9iYWxBZGRyZXNzU0ROb2RlPihOb2RlKSkgIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzYTxCYXNpY0Jsb2NrU0ROb2RlPihOb2RlKSkgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzYTxGcmFtZUluZGV4U0ROb2RlPihOb2RlKSkgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzYTxDb25zdGFudFBvb2xTRE5vZGU+KE5vZGUpKSAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzYTxKdW1wVGFibGVTRE5vZGU+KE5vZGUpKSAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzYTxFeHRlcm5hbFN5bWJvbFNETm9kZT4oTm9kZSkpIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzYTxCbG9ja0FkZHJlc3NTRE5vZGU+KE5vZGUpKSAgIHJldHVybiB0cnVlOworICAgICAgaWYgKE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6RW50cnlUb2tlbiB8fAorICAgICAgICAgIGlzYTxNRE5vZGVTRE5vZGU+KE5vZGUpKSByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gTmV3U1VuaXQgLSBDcmVhdGVzIGEgbmV3IFNVbml0IGFuZCByZXR1cm4gYSBwdHIgdG8gaXQuCisgICAgLy8vCisgICAgU1VuaXQgKk5ld1NVbml0KFNETm9kZSAqTik7CisKKyAgICAvLy8gQ2xvbmUgLSBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIHNwZWNpZmllZCBTVW5pdC4gSXQgZG9lcyBub3QgY29weSB0aGUKKyAgICAvLy8gcHJlZGVjZXNzb3JzIC8gc3VjY2Vzc29ycyBpbmZvIG5vciB0aGUgdGVtcG9yYXJ5IHNjaGVkdWxpbmcgc3RhdGVzLgorICAgIC8vLworICAgIFNVbml0ICpDbG9uZShTVW5pdCAqTik7CisgICAgCisgICAgLy8vIEJ1aWxkU2NoZWRHcmFwaCAtIEJ1aWxkIHRoZSBTVW5pdCBncmFwaCBmcm9tIHRoZSBzZWxlY3Rpb24gZGFnIHRoYXQgd2UKKyAgICAvLy8gYXJlIGlucHV0LiAgVGhpcyBTVW5pdCBncmFwaCBpcyBzaW1pbGFyIHRvIHRoZSBTZWxlY3Rpb25EQUcsIGJ1dAorICAgIC8vLyBleGNsdWRlcyBub2RlcyB0aGF0IGFyZW4ndCBpbnRlcmVzdGluZyB0byBzY2hlZHVsaW5nLCBhbmQgcmVwcmVzZW50cworICAgIC8vLyBmbGFnZ2VkIHRvZ2V0aGVyIG5vZGVzIHdpdGggYSBzaW5nbGUgU1VuaXQuCisgICAgdmlydHVhbCB2b2lkIEJ1aWxkU2NoZWRHcmFwaChBbGlhc0FuYWx5c2lzICpBQSk7CisKKyAgICAvLy8gQ29tcHV0ZUxhdGVuY3kgLSBDb21wdXRlIG5vZGUgbGF0ZW5jeS4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgQ29tcHV0ZUxhdGVuY3koU1VuaXQgKlNVKTsKKworICAgIC8vLyBDb21wdXRlT3BlcmFuZExhdGVuY3kgLSBPdmVycmlkZSBkZXBlbmRlbmNlIGVkZ2UgbGF0ZW5jeSB1c2luZworICAgIC8vLyBvcGVyYW5kIHVzZS9kZWYgaW5mb3JtYXRpb24KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgQ29tcHV0ZU9wZXJhbmRMYXRlbmN5KFNVbml0ICpEZWYsIFNVbml0ICpVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRGVwJiBkZXApIGNvbnN0IHsgfQorCisgICAgdmlydHVhbCB2b2lkIENvbXB1dGVPcGVyYW5kTGF0ZW5jeShTRE5vZGUgKkRlZiwgU0ROb2RlICpVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcElkeCwgU0RlcCYgZGVwKSBjb25zdDsKKworICAgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2sgKkVtaXRTY2hlZHVsZSgpOworCisgICAgLy8vIFNjaGVkdWxlIC0gT3JkZXIgbm9kZXMgYWNjb3JkaW5nIHRvIHNlbGVjdGVkIHN0eWxlLCBmaWxsaW5nCisgICAgLy8vIGluIHRoZSBTZXF1ZW5jZSBtZW1iZXIuCisgICAgLy8vCisgICAgdmlydHVhbCB2b2lkIFNjaGVkdWxlKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGR1bXBOb2RlKGNvbnN0IFNVbml0ICpTVSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEdyYXBoTm9kZUxhYmVsKGNvbnN0IFNVbml0ICpTVSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0Q3VzdG9tR3JhcGhGZWF0dXJlcyhHcmFwaFdyaXRlcjxTY2hlZHVsZURBRyo+ICZHVykgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gQ2x1c3Rlck5laWdoYm9yaW5nTG9hZHMgLSBDbHVzdGVyIGxvYWRzIGZyb20gIm5lYXIiIGFkZHJlc3NlcyBpbnRvCisgICAgLy8vIGNvbWJpbmVkIFNVbml0cy4KKyAgICB2b2lkIENsdXN0ZXJOZWlnaGJvcmluZ0xvYWRzKFNETm9kZSAqTm9kZSk7CisgICAgLy8vIENsdXN0ZXJOb2RlcyAtIENsdXN0ZXIgY2VydGFpbiBub2RlcyB3aGljaCBzaG91bGQgYmUgc2NoZWR1bGVkIHRvZ2V0aGVyLgorICAgIC8vLworICAgIHZvaWQgQ2x1c3Rlck5vZGVzKCk7CisKKyAgICAvLy8gQnVpbGRTY2hlZFVuaXRzLCBBZGRTY2hlZEVkZ2VzIC0gSGVscGVyIGZ1bmN0aW9ucyBmb3IgQnVpbGRTY2hlZEdyYXBoLgorICAgIHZvaWQgQnVpbGRTY2hlZFVuaXRzKCk7CisgICAgdm9pZCBBZGRTY2hlZEVkZ2VzKCk7CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NlbGVjdGlvbkRBRy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2VsZWN0aW9uREFHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc3ZDdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NlbGVjdGlvbkRBRy5jcHAKQEAgLTAsMCArMSw2NDQ5IEBACisvLz09PS0tIFNlbGVjdGlvbkRBRy5jcHAgLSBJbXBsZW1lbnQgdGhlIFNlbGVjdGlvbkRBRyBkYXRhIHN0cnVjdHVyZXMgLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaW1wbGVtZW50cyB0aGUgU2VsZWN0aW9uREFHIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAiU0ROb2RlT3JkZXJpbmcuaCIKKyNpbmNsdWRlICJTRE5vZGVEYmdWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxBbGlhcy5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTZWxlY3Rpb25EQUdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEludHJpbnNpY0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTXV0ZXguaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y21hdGg+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIG1ha2VWVExpc3QgLSBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIFNEVlRMaXN0IHN0cnVjdCBpbml0aWFsaXplZCB3aXRoIHRoZQorLy8vIHNwZWNpZmllZCBtZW1iZXJzLgorc3RhdGljIFNEVlRMaXN0IG1ha2VWVExpc3QoY29uc3QgRVZUICpWVHMsIHVuc2lnbmVkIE51bVZUcykgeworICBTRFZUTGlzdCBSZXMgPSB7VlRzLCBOdW1WVHN9OworICByZXR1cm4gUmVzOworfQorCitzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzICpFVlRUb0FQRmxvYXRTZW1hbnRpY3MoRVZUIFZUKSB7CisgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIEZQIGZvcm1hdCIpOworICBjYXNlIE1WVDo6ZjMyOiAgICAgcmV0dXJuICZBUEZsb2F0OjpJRUVFc2luZ2xlOworICBjYXNlIE1WVDo6ZjY0OiAgICAgcmV0dXJuICZBUEZsb2F0OjpJRUVFZG91YmxlOworICBjYXNlIE1WVDo6ZjgwOiAgICAgcmV0dXJuICZBUEZsb2F0Ojp4ODdEb3VibGVFeHRlbmRlZDsKKyAgY2FzZSBNVlQ6OmYxMjg6ICAgIHJldHVybiAmQVBGbG9hdDo6SUVFRXF1YWQ7CisgIGNhc2UgTVZUOjpwcGNmMTI4OiByZXR1cm4gJkFQRmxvYXQ6OlBQQ0RvdWJsZURvdWJsZTsKKyAgfQorfQorCitTZWxlY3Rpb25EQUc6OkRBR1VwZGF0ZUxpc3RlbmVyOjp+REFHVXBkYXRlTGlzdGVuZXIoKSB7fQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEZQU0ROb2RlIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gaXNFeGFjdGx5VmFsdWUgLSBXZSBkb24ndCByZWx5IG9uIG9wZXJhdG9yPT0gd29ya2luZyBvbiBkb3VibGUgdmFsdWVzLCBhcworLy8vIGl0IHJldHVybnMgdHJ1ZSBmb3IgdGhpbmdzIHRoYXQgYXJlIGNsZWFybHkgbm90IGVxdWFsLCBsaWtlIC0wLjAgYW5kIDAuMC4KKy8vLyBBcyBzdWNoLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkbyBhbiBleGFjdCBiaXQtZm9yLWJpdCBjb21wYXJpc29uIG9mCisvLy8gdHdvIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KK2Jvb2wgQ29uc3RhbnRGUFNETm9kZTo6aXNFeGFjdGx5VmFsdWUoY29uc3QgQVBGbG9hdCYgVikgY29uc3QgeworICByZXR1cm4gZ2V0VmFsdWVBUEYoKS5iaXR3aXNlSXNFcXVhbChWKTsKK30KKworYm9vbCBDb25zdGFudEZQU0ROb2RlOjppc1ZhbHVlVmFsaWRGb3JUeXBlKEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEZsb2F0JiBWYWwpIHsKKyAgYXNzZXJ0KFZULmlzRmxvYXRpbmdQb2ludCgpICYmICJDYW4gb25seSBjb252ZXJ0IGJldHdlZW4gRlAgdHlwZXMiKTsKKworICAvLyBQUEMgbG9uZyBkb3VibGUgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbnkgb3RoZXIgdHlwZS4KKyAgaWYgKFZUID09IE1WVDo6cHBjZjEyOCB8fAorICAgICAgJlZhbC5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6UFBDRG91YmxlRG91YmxlKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBjb252ZXJ0IG1vZGlmaWVzIGluIHBsYWNlLCBzbyBtYWtlIGEgY29weS4KKyAgQVBGbG9hdCBWYWwyID0gQVBGbG9hdChWYWwpOworICBib29sIGxvc2VzSW5mbzsKKyAgKHZvaWQpIFZhbDIuY29udmVydCgqRVZUVG9BUEZsb2F0U2VtYW50aWNzKFZUKSwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbiwKKyAgICAgICAgICAgICAgICAgICAgICAmbG9zZXNJbmZvKTsKKyAgcmV0dXJuICFsb3Nlc0luZm87Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRCBOYW1lc3BhY2UKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBpc0J1aWxkVmVjdG9yQWxsT25lcyAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhCisvLy8gQlVJTERfVkVDVE9SIHdoZXJlIGFsbCBvZiB0aGUgZWxlbWVudHMgYXJlIH4wIG9yIHVuZGVmLgorYm9vbCBJU0Q6OmlzQnVpbGRWZWN0b3JBbGxPbmVzKGNvbnN0IFNETm9kZSAqTikgeworICAvLyBMb29rIHRocm91Z2ggYSBiaXQgY29udmVydC4KKyAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6QklUX0NPTlZFUlQpCisgICAgTiA9IE4tPmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpOworCisgIGlmIChOLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OkJVSUxEX1ZFQ1RPUikgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsKKworICAvLyBTa2lwIG92ZXIgYWxsIG9mIHRoZSB1bmRlZiB2YWx1ZXMuCisgIHdoaWxlIChpICE9IGUgJiYgTi0+Z2V0T3BlcmFuZChpKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgICsraTsKKworICAvLyBEbyBub3QgYWNjZXB0IGFuIGFsbC11bmRlZiB2ZWN0b3IuCisgIGlmIChpID09IGUpIHJldHVybiBmYWxzZTsKKworICAvLyBEbyBub3QgYWNjZXB0IGJ1aWxkX3ZlY3RvcnMgdGhhdCBhcmVuJ3QgYWxsIGNvbnN0YW50cyBvciB3aGljaCBoYXZlIG5vbi1+MAorICAvLyBlbGVtZW50cy4KKyAgU0RWYWx1ZSBOb3RaZXJvID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oTm90WmVybykpIHsKKyAgICBpZiAoIWNhc3Q8Q29uc3RhbnRTRE5vZGU+KE5vdFplcm8pLT5pc0FsbE9uZXNWYWx1ZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudEZQU0ROb2RlPihOb3RaZXJvKSkgeworICAgIGlmICghY2FzdDxDb25zdGFudEZQU0ROb2RlPihOb3RaZXJvKS0+Z2V0VmFsdWVBUEYoKS4KKyAgICAgICAgICAgICAgICBiaXRjYXN0VG9BUEludCgpLmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBPa2F5LCB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB+MCB2YWx1ZSwgY2hlY2sgdG8gc2VlIGlmIHRoZSByZXN0IG1hdGNoIG9yIGFyZQorICAvLyB1bmRlZnMuCisgIGZvciAoKytpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoTi0+Z2V0T3BlcmFuZChpKSAhPSBOb3RaZXJvICYmCisgICAgICAgIE4tPmdldE9wZXJhbmQoaSkuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpVTkRFRikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vIGlzQnVpbGRWZWN0b3JBbGxaZXJvcyAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhCisvLy8gQlVJTERfVkVDVE9SIHdoZXJlIGFsbCBvZiB0aGUgZWxlbWVudHMgYXJlIDAgb3IgdW5kZWYuCitib29sIElTRDo6aXNCdWlsZFZlY3RvckFsbFplcm9zKGNvbnN0IFNETm9kZSAqTikgeworICAvLyBMb29rIHRocm91Z2ggYSBiaXQgY29udmVydC4KKyAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6QklUX0NPTlZFUlQpCisgICAgTiA9IE4tPmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpOworCisgIGlmIChOLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OkJVSUxEX1ZFQ1RPUikgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsKKworICAvLyBTa2lwIG92ZXIgYWxsIG9mIHRoZSB1bmRlZiB2YWx1ZXMuCisgIHdoaWxlIChpICE9IGUgJiYgTi0+Z2V0T3BlcmFuZChpKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgICsraTsKKworICAvLyBEbyBub3QgYWNjZXB0IGFuIGFsbC11bmRlZiB2ZWN0b3IuCisgIGlmIChpID09IGUpIHJldHVybiBmYWxzZTsKKworICAvLyBEbyBub3QgYWNjZXB0IGJ1aWxkX3ZlY3RvcnMgdGhhdCBhcmVuJ3QgYWxsIGNvbnN0YW50cyBvciB3aGljaCBoYXZlIG5vbi0wCisgIC8vIGVsZW1lbnRzLgorICBTRFZhbHVlIFplcm8gPSBOLT5nZXRPcGVyYW5kKGkpOworICBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihaZXJvKSkgeworICAgIGlmICghY2FzdDxDb25zdGFudFNETm9kZT4oWmVybyktPmlzTnVsbFZhbHVlKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAoaXNhPENvbnN0YW50RlBTRE5vZGU+KFplcm8pKSB7CisgICAgaWYgKCFjYXN0PENvbnN0YW50RlBTRE5vZGU+KFplcm8pLT5nZXRWYWx1ZUFQRigpLmlzUG9zWmVybygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gT2theSwgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgMCB2YWx1ZSwgY2hlY2sgdG8gc2VlIGlmIHRoZSByZXN0IG1hdGNoIG9yIGFyZQorICAvLyB1bmRlZnMuCisgIGZvciAoKytpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoTi0+Z2V0T3BlcmFuZChpKSAhPSBaZXJvICYmCisgICAgICAgIE4tPmdldE9wZXJhbmQoaSkuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpVTkRFRikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1NjYWxhclRvVmVjdG9yIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEKKy8vLyBJU0Q6OlNDQUxBUl9UT19WRUNUT1Igbm9kZSBvciBhIEJVSUxEX1ZFQ1RPUiBub2RlIHdoZXJlIG9ubHkgdGhlIGxvdworLy8vIGVsZW1lbnQgaXMgbm90IGFuIHVuZGVmLgorYm9vbCBJU0Q6OmlzU2NhbGFyVG9WZWN0b3IoY29uc3QgU0ROb2RlICpOKSB7CisgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNDQUxBUl9UT19WRUNUT1IpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKE4tPmdldE9wY29kZSgpICE9IElTRDo6QlVJTERfVkVDVE9SKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKE4tPmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICByZXR1cm4gZmFsc2U7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IE51bUVsZW1zOyArK2kpIHsKKyAgICBTRFZhbHVlIFYgPSBOLT5nZXRPcGVyYW5kKGkpOworICAgIGlmIChWLmdldE9wY29kZSgpICE9IElTRDo6VU5ERUYpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBnZXRTZXRDQ1N3YXBwZWRPcGVyYW5kcyAtIFJldHVybiB0aGUgb3BlcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gKFkgb3AgWCkKKy8vLyB3aGVuIGdpdmVuIHRoZSBvcGVyYXRpb24gZm9yIChYIG9wIFkpLgorSVNEOjpDb25kQ29kZSBJU0Q6OmdldFNldENDU3dhcHBlZE9wZXJhbmRzKElTRDo6Q29uZENvZGUgT3BlcmF0aW9uKSB7CisgIC8vIFRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24sIHdlIGp1c3QgbmVlZCB0byBzd2FwIHRoZSBMIGFuZCBHIGJpdHMgb2YgdGhlCisgIC8vIG9wZXJhdGlvbi4KKyAgdW5zaWduZWQgT2xkTCA9IChPcGVyYXRpb24gPj4gMikgJiAxOworICB1bnNpZ25lZCBPbGRHID0gKE9wZXJhdGlvbiA+PiAxKSAmIDE7CisgIHJldHVybiBJU0Q6OkNvbmRDb2RlKChPcGVyYXRpb24gJiB+NikgfCAgLy8gS2VlcCB0aGUgTiwgVSwgRSBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgIChPbGRMIDw8IDEpIHwgICAgICAgLy8gTmV3IEcgYml0CisgICAgICAgICAgICAgICAgICAgICAgIChPbGRHIDw8IDIpKTsgICAgICAgLy8gTmV3IEwgYml0LgorfQorCisvLy8gZ2V0U2V0Q0NJbnZlcnNlIC0gUmV0dXJuIHRoZSBvcGVyYXRpb24gY29ycmVzcG9uZGluZyB0byAhKFggb3AgWSksIHdoZXJlCisvLy8gJ29wJyBpcyBhIHZhbGlkIFNldENDIG9wZXJhdGlvbi4KK0lTRDo6Q29uZENvZGUgSVNEOjpnZXRTZXRDQ0ludmVyc2UoSVNEOjpDb25kQ29kZSBPcCwgYm9vbCBpc0ludGVnZXIpIHsKKyAgdW5zaWduZWQgT3BlcmF0aW9uID0gT3A7CisgIGlmIChpc0ludGVnZXIpCisgICAgT3BlcmF0aW9uIF49IDc7ICAgLy8gRmxpcCBMLCBHLCBFIGJpdHMsIGJ1dCBub3QgVS4KKyAgZWxzZQorICAgIE9wZXJhdGlvbiBePSAxNTsgIC8vIEZsaXAgYWxsIG9mIHRoZSBjb25kaXRpb24gYml0cy4KKworICBpZiAoT3BlcmF0aW9uID4gSVNEOjpTRVRUUlVFMikKKyAgICBPcGVyYXRpb24gJj0gfjg7ICAvLyBEb24ndCBsZXQgTiBhbmQgVSBiaXRzIGdldCBzZXQuCisKKyAgcmV0dXJuIElTRDo6Q29uZENvZGUoT3BlcmF0aW9uKTsKK30KKworCisvLy8gaXNTaWduZWRPcCAtIEZvciBhbiBpbnRlZ2VyIGNvbXBhcmlzb24sIHJldHVybiAxIGlmIHRoZSBjb21wYXJpc29uIGlzIGEKKy8vLyBzaWduZWQgb3BlcmF0aW9uIGFuZCAyIGlmIHRoZSByZXN1bHQgaXMgYW4gdW5zaWduZWQgY29tcGFyaXNvbi4gIFJldHVybiB6ZXJvCisvLy8gaWYgdGhlIG9wZXJhdGlvbiBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHNpZ24gb2YgdGhlIGlucHV0IChzZXRuZSBhbmQgc2V0ZXEpLgorc3RhdGljIGludCBpc1NpZ25lZE9wKElTRDo6Q29uZENvZGUgT3Bjb2RlKSB7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgaW50ZWdlciBzZXRjYyBvcGVyYXRpb24hIik7CisgIGNhc2UgSVNEOjpTRVRFUToKKyAgY2FzZSBJU0Q6OlNFVE5FOiByZXR1cm4gMDsKKyAgY2FzZSBJU0Q6OlNFVExUOgorICBjYXNlIElTRDo6U0VUTEU6CisgIGNhc2UgSVNEOjpTRVRHVDoKKyAgY2FzZSBJU0Q6OlNFVEdFOiByZXR1cm4gMTsKKyAgY2FzZSBJU0Q6OlNFVFVMVDoKKyAgY2FzZSBJU0Q6OlNFVFVMRToKKyAgY2FzZSBJU0Q6OlNFVFVHVDoKKyAgY2FzZSBJU0Q6OlNFVFVHRTogcmV0dXJuIDI7CisgIH0KK30KKworLy8vIGdldFNldENDT3JPcGVyYXRpb24gLSBSZXR1cm4gdGhlIHJlc3VsdCBvZiBhIGxvZ2ljYWwgT1IgYmV0d2VlbiBkaWZmZXJlbnQKKy8vLyBjb21wYXJpc29ucyBvZiBpZGVudGljYWwgdmFsdWVzOiAoKFggb3AxIFkpIHwgKFggb3AyIFkpKS4gIFRoaXMgZnVuY3Rpb24KKy8vLyByZXR1cm5zIFNFVENDX0lOVkFMSUQgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUgcmVzdWx0YW50CisvLy8gY29tcGFyaXNvbi4KK0lTRDo6Q29uZENvZGUgSVNEOjpnZXRTZXRDQ09yT3BlcmF0aW9uKElTRDo6Q29uZENvZGUgT3AxLCBJU0Q6OkNvbmRDb2RlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbnRlZ2VyKSB7CisgIGlmIChpc0ludGVnZXIgJiYgKGlzU2lnbmVkT3AoT3AxKSB8IGlzU2lnbmVkT3AoT3AyKSkgPT0gMykKKyAgICAvLyBDYW5ub3QgZm9sZCBhIHNpZ25lZCBpbnRlZ2VyIHNldGNjIHdpdGggYW4gdW5zaWduZWQgaW50ZWdlciBzZXRjYy4KKyAgICByZXR1cm4gSVNEOjpTRVRDQ19JTlZBTElEOworCisgIHVuc2lnbmVkIE9wID0gT3AxIHwgT3AyOyAgLy8gQ29tYmluZSBhbGwgb2YgdGhlIGNvbmRpdGlvbiBiaXRzLgorCisgIC8vIElmIHRoZSBOIGFuZCBVIGJpdHMgZ2V0IHNldCB0aGVuIHRoZSByZXN1bHRhbnQgY29tcGFyaXNvbiBET0VTIHN1ZGRlbmx5CisgIC8vIGNhcmUgYWJvdXQgb3JkZXJlZG5lc3MsIGFuZCBpcyB0cnVlIHdoZW4gb3JkZXJlZC4KKyAgaWYgKE9wID4gSVNEOjpTRVRUUlVFMikKKyAgICBPcCAmPSB+MTY7ICAgICAvLyBDbGVhciB0aGUgVSBiaXQgaWYgdGhlIE4gYml0IGlzIHNldC4KKworICAvLyBDYW5vbmljYWxpemUgaWxsZWdhbCBpbnRlZ2VyIHNldGNjJ3MuCisgIGlmIChpc0ludGVnZXIgJiYgT3AgPT0gSVNEOjpTRVRVTkUpICAvLyBlLmcuIFNFVFVHVCB8IFNFVFVMVAorICAgIE9wID0gSVNEOjpTRVRORTsKKworICByZXR1cm4gSVNEOjpDb25kQ29kZShPcCk7Cit9CisKKy8vLyBnZXRTZXRDQ0FuZE9wZXJhdGlvbiAtIFJldHVybiB0aGUgcmVzdWx0IG9mIGEgbG9naWNhbCBBTkQgYmV0d2VlbiBkaWZmZXJlbnQKKy8vLyBjb21wYXJpc29ucyBvZiBpZGVudGljYWwgdmFsdWVzOiAoKFggb3AxIFkpICYgKFggb3AyIFkpKS4gIFRoaXMKKy8vLyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUgcmVzdWx0YW50CisvLy8gY29tcGFyaXNvbi4KK0lTRDo6Q29uZENvZGUgSVNEOjpnZXRTZXRDQ0FuZE9wZXJhdGlvbihJU0Q6OkNvbmRDb2RlIE9wMSwgSVNEOjpDb25kQ29kZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ludGVnZXIpIHsKKyAgaWYgKGlzSW50ZWdlciAmJiAoaXNTaWduZWRPcChPcDEpIHwgaXNTaWduZWRPcChPcDIpKSA9PSAzKQorICAgIC8vIENhbm5vdCBmb2xkIGEgc2lnbmVkIHNldGNjIHdpdGggYW4gdW5zaWduZWQgc2V0Y2MuCisgICAgcmV0dXJuIElTRDo6U0VUQ0NfSU5WQUxJRDsKKworICAvLyBDb21iaW5lIGFsbCBvZiB0aGUgY29uZGl0aW9uIGJpdHMuCisgIElTRDo6Q29uZENvZGUgUmVzdWx0ID0gSVNEOjpDb25kQ29kZShPcDEgJiBPcDIpOworCisgIC8vIENhbm9uaWNhbGl6ZSBpbGxlZ2FsIGludGVnZXIgc2V0Y2Mncy4KKyAgaWYgKGlzSW50ZWdlcikgeworICAgIHN3aXRjaCAoUmVzdWx0KSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVPIDogUmVzdWx0ID0gSVNEOjpTRVRGQUxTRTsgYnJlYWs7ICAvLyBTRVRVR1QgJiBTRVRVTFQKKyAgICBjYXNlIElTRDo6U0VUT0VROiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNFVEVRICAmIFNFVFVbTEddRQorICAgIGNhc2UgSVNEOjpTRVRVRVE6IFJlc3VsdCA9IElTRDo6U0VURVEgICA7IGJyZWFrOyAgLy8gU0VUVUdFICYgU0VUVUxFCisgICAgY2FzZSBJU0Q6OlNFVE9MVDogUmVzdWx0ID0gSVNEOjpTRVRVTFQgIDsgYnJlYWs7ICAvLyBTRVRVTFQgJiBTRVRORQorICAgIGNhc2UgSVNEOjpTRVRPR1Q6IFJlc3VsdCA9IElTRDo6U0VUVUdUICA7IGJyZWFrOyAgLy8gU0VUVUdUICYgU0VUTkUKKyAgICB9CisgIH0KKworICByZXR1cm4gUmVzdWx0OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgUHJvZmlsZSBTdXBwb3J0CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQWRkTm9kZUlET3Bjb2RlIC0gQWRkIHRoZSBub2RlIG9wY29kZSB0byB0aGUgTm9kZUlEIGRhdGEuCisvLy8KK3N0YXRpYyB2b2lkIEFkZE5vZGVJRE9wY29kZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdW5zaWduZWQgT3BDKSAgeworICBJRC5BZGRJbnRlZ2VyKE9wQyk7Cit9CisKKy8vLyBBZGROb2RlSURWYWx1ZVR5cGVzIC0gVmFsdWUgdHlwZSBsaXN0cyBhcmUgaW50ZXJuJ2Qgc28gd2UgY2FuIHJlcHJlc2VudCB0aGVtCisvLy8gc29sZWx5IHdpdGggdGhlaXIgcG9pbnRlci4KK3N0YXRpYyB2b2lkIEFkZE5vZGVJRFZhbHVlVHlwZXMoRm9sZGluZ1NldE5vZGVJRCAmSUQsIFNEVlRMaXN0IFZUTGlzdCkgeworICBJRC5BZGRQb2ludGVyKFZUTGlzdC5WVHMpOworfQorCisvLy8gQWRkTm9kZUlET3BlcmFuZHMgLSBWYXJpb3VzIHJvdXRpbmVzIGZvciBhZGRpbmcgb3BlcmFuZHMgdG8gdGhlIE5vZGVJRCBkYXRhLgorLy8vCitzdGF0aWMgdm9pZCBBZGROb2RlSURPcGVyYW5kcyhGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKSB7CisgIGZvciAoOyBOdW1PcHM7IC0tTnVtT3BzLCArK09wcykgeworICAgIElELkFkZFBvaW50ZXIoT3BzLT5nZXROb2RlKCkpOworICAgIElELkFkZEludGVnZXIoT3BzLT5nZXRSZXNObygpKTsKKyAgfQorfQorCisvLy8gQWRkTm9kZUlET3BlcmFuZHMgLSBWYXJpb3VzIHJvdXRpbmVzIGZvciBhZGRpbmcgb3BlcmFuZHMgdG8gdGhlIE5vZGVJRCBkYXRhLgorLy8vCitzdGF0aWMgdm9pZCBBZGROb2RlSURPcGVyYW5kcyhGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcykgeworICBmb3IgKDsgTnVtT3BzOyAtLU51bU9wcywgKytPcHMpIHsKKyAgICBJRC5BZGRQb2ludGVyKE9wcy0+Z2V0Tm9kZSgpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKE9wcy0+Z2V0UmVzTm8oKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgQWRkTm9kZUlETm9kZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgT3BDLCBTRFZUTGlzdCBWVExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wTGlzdCwgdW5zaWduZWQgTikgeworICBBZGROb2RlSURPcGNvZGUoSUQsIE9wQyk7CisgIEFkZE5vZGVJRFZhbHVlVHlwZXMoSUQsIFZUTGlzdCk7CisgIEFkZE5vZGVJRE9wZXJhbmRzKElELCBPcExpc3QsIE4pOworfQorCisvLy8gQWRkTm9kZUlEQ3VzdG9tIC0gSWYgdGhpcyBpcyBhbiBTRE5vZGUgd2l0aCBzcGVjaWFsIGluZm8sIGFkZCB0aGlzIGluZm8gdG8KKy8vLyB0aGUgTm9kZUlEIGRhdGEuCitzdGF0aWMgdm9pZCBBZGROb2RlSURDdXN0b20oRm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IFNETm9kZSAqTikgeworICBzd2l0Y2ggKE4tPmdldE9wY29kZSgpKSB7CisgIGNhc2UgSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbDoKKyAgY2FzZSBJU0Q6OkV4dGVybmFsU3ltYm9sOgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlNob3VsZCBvbmx5IGJlIHVzZWQgb24gbm9kZXMgd2l0aCBvcGVyYW5kcyIpOworICBkZWZhdWx0OiBicmVhazsgIC8vIE5vcm1hbCBub2RlcyBkb24ndCBuZWVkIGV4dHJhIGluZm8uCisgIGNhc2UgSVNEOjpUYXJnZXRDb25zdGFudDoKKyAgY2FzZSBJU0Q6OkNvbnN0YW50OgorICAgIElELkFkZFBvaW50ZXIoY2FzdDxDb25zdGFudFNETm9kZT4oTiktPmdldENvbnN0YW50SW50VmFsdWUoKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpUYXJnZXRDb25zdGFudEZQOgorICBjYXNlIElTRDo6Q29uc3RhbnRGUDogeworICAgIElELkFkZFBvaW50ZXIoY2FzdDxDb25zdGFudEZQU0ROb2RlPihOKS0+Z2V0Q29uc3RhbnRGUFZhbHVlKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzOgorICBjYXNlIElTRDo6R2xvYmFsQWRkcmVzczoKKyAgY2FzZSBJU0Q6OlRhcmdldEdsb2JhbFRMU0FkZHJlc3M6CisgIGNhc2UgSVNEOjpHbG9iYWxUTFNBZGRyZXNzOiB7CisgICAgY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EgPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE4pOworICAgIElELkFkZFBvaW50ZXIoR0EtPmdldEdsb2JhbCgpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKEdBLT5nZXRPZmZzZXQoKSk7CisgICAgSUQuQWRkSW50ZWdlcihHQS0+Z2V0VGFyZ2V0RmxhZ3MoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OkJhc2ljQmxvY2s6CisgICAgSUQuQWRkUG9pbnRlcihjYXN0PEJhc2ljQmxvY2tTRE5vZGU+KE4pLT5nZXRCYXNpY0Jsb2NrKCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6UmVnaXN0ZXI6CisgICAgSUQuQWRkSW50ZWdlcihjYXN0PFJlZ2lzdGVyU0ROb2RlPihOKS0+Z2V0UmVnKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgSVNEOjpTUkNWQUxVRToKKyAgICBJRC5BZGRQb2ludGVyKGNhc3Q8U3JjVmFsdWVTRE5vZGU+KE4pLT5nZXRWYWx1ZSgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZyYW1lSW5kZXg6CisgIGNhc2UgSVNEOjpUYXJnZXRGcmFtZUluZGV4OgorICAgIElELkFkZEludGVnZXIoY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOKS0+Z2V0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpKdW1wVGFibGU6CisgIGNhc2UgSVNEOjpUYXJnZXRKdW1wVGFibGU6CisgICAgSUQuQWRkSW50ZWdlcihjYXN0PEp1bXBUYWJsZVNETm9kZT4oTiktPmdldEluZGV4KCkpOworICAgIElELkFkZEludGVnZXIoY2FzdDxKdW1wVGFibGVTRE5vZGU+KE4pLT5nZXRUYXJnZXRGbGFncygpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkNvbnN0YW50UG9vbDoKKyAgY2FzZSBJU0Q6OlRhcmdldENvbnN0YW50UG9vbDogeworICAgIGNvbnN0IENvbnN0YW50UG9vbFNETm9kZSAqQ1AgPSBjYXN0PENvbnN0YW50UG9vbFNETm9kZT4oTik7CisgICAgSUQuQWRkSW50ZWdlcihDUC0+Z2V0QWxpZ25tZW50KCkpOworICAgIElELkFkZEludGVnZXIoQ1AtPmdldE9mZnNldCgpKTsKKyAgICBpZiAoQ1AtPmlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkpCisgICAgICBDUC0+Z2V0TWFjaGluZUNQVmFsKCktPkFkZFNlbGVjdGlvbkRBR0NTRUlkKElEKTsKKyAgICBlbHNlCisgICAgICBJRC5BZGRQb2ludGVyKENQLT5nZXRDb25zdFZhbCgpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKENQLT5nZXRUYXJnZXRGbGFncygpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6TE9BRDogeworICAgIGNvbnN0IExvYWRTRE5vZGUgKkxEID0gY2FzdDxMb2FkU0ROb2RlPihOKTsKKyAgICBJRC5BZGRJbnRlZ2VyKExELT5nZXRNZW1vcnlWVCgpLmdldFJhd0JpdHMoKSk7CisgICAgSUQuQWRkSW50ZWdlcihMRC0+Z2V0UmF3U3ViY2xhc3NEYXRhKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTVE9SRTogeworICAgIGNvbnN0IFN0b3JlU0ROb2RlICpTVCA9IGNhc3Q8U3RvcmVTRE5vZGU+KE4pOworICAgIElELkFkZEludGVnZXIoU1QtPmdldE1lbW9yeVZUKCkuZ2V0UmF3Qml0cygpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKFNULT5nZXRSYXdTdWJjbGFzc0RhdGEoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OkFUT01JQ19DTVBfU1dBUDoKKyAgY2FzZSBJU0Q6OkFUT01JQ19TV0FQOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfQUREOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfU1VCOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfQU5EOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfT1I6CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9YT1I6CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9OQU5EOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfTUlOOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfTUFYOgorICBjYXNlIElTRDo6QVRPTUlDX0xPQURfVU1JTjoKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1VNQVg6IHsKKyAgICBjb25zdCBBdG9taWNTRE5vZGUgKkFUID0gY2FzdDxBdG9taWNTRE5vZGU+KE4pOworICAgIElELkFkZEludGVnZXIoQVQtPmdldE1lbW9yeVZUKCkuZ2V0UmF3Qml0cygpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKEFULT5nZXRSYXdTdWJjbGFzc0RhdGEoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlZFQ1RPUl9TSFVGRkxFOiB7CisgICAgY29uc3QgU2h1ZmZsZVZlY3RvclNETm9kZSAqU1ZOID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICAgICBpICE9IGU7ICsraSkKKyAgICAgIElELkFkZEludGVnZXIoU1ZOLT5nZXRNYXNrRWx0KGkpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6VGFyZ2V0QmxvY2tBZGRyZXNzOgorICBjYXNlIElTRDo6QmxvY2tBZGRyZXNzOiB7CisgICAgSUQuQWRkUG9pbnRlcihjYXN0PEJsb2NrQWRkcmVzc1NETm9kZT4oTiktPmdldEJsb2NrQWRkcmVzcygpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKGNhc3Q8QmxvY2tBZGRyZXNzU0ROb2RlPihOKS0+Z2V0VGFyZ2V0RmxhZ3MoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgfSAvLyBlbmQgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkKK30KKworLy8vIEFkZE5vZGVJRE5vZGUgLSBHZW5lcmljIHJvdXRpbmUgZm9yIGFkZGluZyBhIG5vZGVzIGluZm8gdG8gdGhlIE5vZGVJRAorLy8vIGRhdGEuCitzdGF0aWMgdm9pZCBBZGROb2RlSUROb2RlKEZvbGRpbmdTZXROb2RlSUQgJklELCBjb25zdCBTRE5vZGUgKk4pIHsKKyAgQWRkTm9kZUlET3Bjb2RlKElELCBOLT5nZXRPcGNvZGUoKSk7CisgIC8vIEFkZCB0aGUgcmV0dXJuIHZhbHVlIGluZm8uCisgIEFkZE5vZGVJRFZhbHVlVHlwZXMoSUQsIE4tPmdldFZUTGlzdCgpKTsKKyAgLy8gQWRkIHRoZSBvcGVyYW5kIGluZm8uCisgIEFkZE5vZGVJRE9wZXJhbmRzKElELCBOLT5vcF9iZWdpbigpLCBOLT5nZXROdW1PcGVyYW5kcygpKTsKKworICAvLyBIYW5kbGUgU0ROb2RlIGxlYWZzIHdpdGggc3BlY2lhbCBpbmZvLgorICBBZGROb2RlSURDdXN0b20oSUQsIE4pOworfQorCisvLy8gZW5jb2RlTWVtU0ROb2RlRmxhZ3MgLSBHZW5lcmljIHJvdXRpbmUgZm9yIGNvbXB1dGluZyBhIHZhbHVlIGZvciB1c2UgaW4KKy8vLyB0aGUgQ1NFIG1hcCB0aGF0IGNhcnJpZXMgdm9sYXRpbGl0eSwgdGVtcG9yYWxuZXNzLCBpbmRleGluZyBtb2RlLCBhbmQKKy8vLyBleHRlbnNpb24vdHJ1bmNhdGlvbiBpbmZvcm1hdGlvbi4KKy8vLworc3RhdGljIGlubGluZSB1bnNpZ25lZAorZW5jb2RlTWVtU0ROb2RlRmxhZ3MoaW50IENvbnZUeXBlLCBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGlzTm9uVGVtcG9yYWwpIHsKKyAgYXNzZXJ0KChDb252VHlwZSAmIDMpID09IENvbnZUeXBlICYmCisgICAgICAgICAiQ29udlR5cGUgbWF5IG5vdCByZXF1aXJlIG1vcmUgdGhhbiAyIGJpdHMhIik7CisgIGFzc2VydCgoQU0gJiA3KSA9PSBBTSAmJgorICAgICAgICAgIkFNIG1heSBub3QgcmVxdWlyZSBtb3JlIHRoYW4gMyBiaXRzISIpOworICByZXR1cm4gQ29udlR5cGUgfAorICAgICAgICAgKEFNIDw8IDIpIHwKKyAgICAgICAgIChpc1ZvbGF0aWxlIDw8IDUpIHwKKyAgICAgICAgIChpc05vblRlbXBvcmFsIDw8IDYpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBkb05vdENTRSAtIFJldHVybiB0cnVlIGlmIENTRSBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgdGhpcyBub2RlLgorc3RhdGljIGJvb2wgZG9Ob3RDU0UoU0ROb2RlICpOKSB7CisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjpGbGFnKQorICAgIHJldHVybiB0cnVlOyAvLyBOZXZlciBDU0UgYW55dGhpbmcgdGhhdCBwcm9kdWNlcyBhIGZsYWcuCisKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6OkhBTkRMRU5PREU6CisgICAgcmV0dXJuIHRydWU7ICAgLy8gTmV2ZXIgQ1NFIHRoZXNlIG5vZGVzLgorICB9CisKKyAgLy8gQ2hlY2sgdGhhdCByZW1haW5pbmcgdmFsdWVzIHByb2R1Y2VkIGFyZSBub3QgZmxhZ3MuCisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBOLT5nZXROdW1WYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKE4tPmdldFZhbHVlVHlwZShpKSA9PSBNVlQ6OkZsYWcpCisgICAgICByZXR1cm4gdHJ1ZTsgLy8gTmV2ZXIgQ1NFIGFueXRoaW5nIHRoYXQgcHJvZHVjZXMgYSBmbGFnLgorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFJlbW92ZURlYWROb2RlcyAtIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYWxsIHVucmVhY2hhYmxlIG5vZGVzIGluIHRoZQorLy8vIFNlbGVjdGlvbkRBRy4KK3ZvaWQgU2VsZWN0aW9uREFHOjpSZW1vdmVEZWFkTm9kZXMoKSB7CisgIC8vIENyZWF0ZSBhIGR1bW15IG5vZGUgKHdoaWNoIGlzIG5vdCBhZGRlZCB0byBhbGxub2RlcyksIHRoYXQgYWRkcyBhIHJlZmVyZW5jZQorICAvLyB0byB0aGUgcm9vdCBub2RlLCBwcmV2ZW50aW5nIGl0IGZyb20gYmVpbmcgZGVsZXRlZC4KKyAgSGFuZGxlU0ROb2RlIER1bW15KGdldFJvb3QoKSk7CisKKyAgU21hbGxWZWN0b3I8U0ROb2RlKiwgMTI4PiBEZWFkTm9kZXM7CisKKyAgLy8gQWRkIGFsbCBvYnZpb3VzbHktZGVhZCBub2RlcyB0byB0aGUgRGVhZE5vZGVzIHdvcmtsaXN0LgorICBmb3IgKGFsbG5vZGVzX2l0ZXJhdG9yIEkgPSBhbGxub2Rlc19iZWdpbigpLCBFID0gYWxsbm9kZXNfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChJLT51c2VfZW1wdHkoKSkKKyAgICAgIERlYWROb2Rlcy5wdXNoX2JhY2soSSk7CisKKyAgUmVtb3ZlRGVhZE5vZGVzKERlYWROb2Rlcyk7CisKKyAgLy8gSWYgdGhlIHJvb3QgY2hhbmdlZCAoZS5nLiBpdCB3YXMgYSBkZWFkIGxvYWQsIHVwZGF0ZSB0aGUgcm9vdCkuCisgIHNldFJvb3QoRHVtbXkuZ2V0VmFsdWUoKSk7Cit9CisKKy8vLyBSZW1vdmVEZWFkTm9kZXMgLSBUaGlzIG1ldGhvZCBkZWxldGVzIHRoZSB1bnJlYWNoYWJsZSBub2RlcyBpbiB0aGUKKy8vLyBnaXZlbiBsaXN0LCBhbmQgYW55IG5vZGVzIHRoYXQgYmVjb21lIHVucmVhY2hhYmxlIGFzIGEgcmVzdWx0Lgordm9pZCBTZWxlY3Rpb25EQUc6OlJlbW92ZURlYWROb2RlcyhTbWFsbFZlY3RvckltcGw8U0ROb2RlICo+ICZEZWFkTm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBR1VwZGF0ZUxpc3RlbmVyICpVcGRhdGVMaXN0ZW5lcikgeworCisgIC8vIFByb2Nlc3MgdGhlIHdvcmtsaXN0LCBkZWxldGluZyB0aGUgbm9kZXMgYW5kIGFkZGluZyB0aGVpciB1c2VzIHRvIHRoZQorICAvLyB3b3JrbGlzdC4KKyAgd2hpbGUgKCFEZWFkTm9kZXMuZW1wdHkoKSkgeworICAgIFNETm9kZSAqTiA9IERlYWROb2Rlcy5wb3BfYmFja192YWwoKTsKKworICAgIGlmIChVcGRhdGVMaXN0ZW5lcikKKyAgICAgIFVwZGF0ZUxpc3RlbmVyLT5Ob2RlRGVsZXRlZChOLCAwKTsKKworICAgIC8vIFRha2UgdGhlIG5vZGUgb3V0IG9mIHRoZSBhcHByb3ByaWF0ZSBDU0UgbWFwLgorICAgIFJlbW92ZU5vZGVGcm9tQ1NFTWFwcyhOKTsKKworICAgIC8vIE5leHQsIGJydXRhbGx5IHJlbW92ZSB0aGUgb3BlcmFuZCBsaXN0LiAgVGhpcyBpcyBzYWZlIHRvIGRvLCBhcyB0aGVyZSBhcmUKKyAgICAvLyBubyBjeWNsZXMgaW4gdGhlIGdyYXBoLgorICAgIGZvciAoU0ROb2RlOjpvcF9pdGVyYXRvciBJID0gTi0+b3BfYmVnaW4oKSwgRSA9IE4tPm9wX2VuZCgpOyBJICE9IEU7ICkgeworICAgICAgU0RVc2UgJlVzZSA9ICpJKys7CisgICAgICBTRE5vZGUgKk9wZXJhbmQgPSBVc2UuZ2V0Tm9kZSgpOworICAgICAgVXNlLnNldChTRFZhbHVlKCkpOworCisgICAgICAvLyBOb3cgdGhhdCB3ZSByZW1vdmVkIHRoaXMgb3BlcmFuZCwgc2VlIGlmIHRoZXJlIGFyZSBubyB1c2VzIG9mIGl0IGxlZnQuCisgICAgICBpZiAoT3BlcmFuZC0+dXNlX2VtcHR5KCkpCisgICAgICAgIERlYWROb2Rlcy5wdXNoX2JhY2soT3BlcmFuZCk7CisgICAgfQorCisgICAgRGVhbGxvY2F0ZU5vZGUoTik7CisgIH0KK30KKwordm9pZCBTZWxlY3Rpb25EQUc6OlJlbW92ZURlYWROb2RlKFNETm9kZSAqTiwgREFHVXBkYXRlTGlzdGVuZXIgKlVwZGF0ZUxpc3RlbmVyKXsKKyAgU21hbGxWZWN0b3I8U0ROb2RlKiwgMTY+IERlYWROb2RlcygxLCBOKTsKKyAgUmVtb3ZlRGVhZE5vZGVzKERlYWROb2RlcywgVXBkYXRlTGlzdGVuZXIpOworfQorCit2b2lkIFNlbGVjdGlvbkRBRzo6RGVsZXRlTm9kZShTRE5vZGUgKk4pIHsKKyAgLy8gRmlyc3QgdGFrZSB0aGlzIG91dCBvZiB0aGUgYXBwcm9wcmlhdGUgQ1NFIG1hcC4KKyAgUmVtb3ZlTm9kZUZyb21DU0VNYXBzKE4pOworCisgIC8vIEZpbmFsbHksIHJlbW92ZSB1c2VzIGR1ZSB0byBvcGVyYW5kcyBvZiB0aGlzIG5vZGUsIHJlbW92ZSBmcm9tIHRoZQorICAvLyBBbGxOb2RlcyBsaXN0LCBhbmQgZGVsZXRlIHRoZSBub2RlLgorICBEZWxldGVOb2RlTm90SW5DU0VNYXBzKE4pOworfQorCit2b2lkIFNlbGVjdGlvbkRBRzo6RGVsZXRlTm9kZU5vdEluQ1NFTWFwcyhTRE5vZGUgKk4pIHsKKyAgYXNzZXJ0KE4gIT0gQWxsTm9kZXMuYmVnaW4oKSAmJiAiQ2Fubm90IGRlbGV0ZSB0aGUgZW50cnkgbm9kZSEiKTsKKyAgYXNzZXJ0KE4tPnVzZV9lbXB0eSgpICYmICJDYW5ub3QgZGVsZXRlIGEgbm9kZSB0aGF0IGlzIG5vdCBkZWFkISIpOworCisgIC8vIERyb3AgYWxsIG9mIHRoZSBvcGVyYW5kcyBhbmQgZGVjcmVtZW50IHVzZWQgbm9kZSdzIHVzZSBjb3VudHMuCisgIE4tPkRyb3BPcGVyYW5kcygpOworCisgIERlYWxsb2NhdGVOb2RlKE4pOworfQorCit2b2lkIFNlbGVjdGlvbkRBRzo6RGVhbGxvY2F0ZU5vZGUoU0ROb2RlICpOKSB7CisgIGlmIChOLT5PcGVyYW5kc05lZWREZWxldGUpCisgICAgZGVsZXRlW10gTi0+T3BlcmFuZExpc3Q7CisKKyAgLy8gU2V0IHRoZSBvcGNvZGUgdG8gREVMRVRFRF9OT0RFIHRvIGhlbHAgY2F0Y2ggYnVncyB3aGVuIG5vZGUKKyAgLy8gbWVtb3J5IGlzIHJlYWxsb2NhdGVkLgorICBOLT5Ob2RlVHlwZSA9IElTRDo6REVMRVRFRF9OT0RFOworCisgIE5vZGVBbGxvY2F0b3IuRGVhbGxvY2F0ZShBbGxOb2Rlcy5yZW1vdmUoTikpOworCisgIC8vIFJlbW92ZSB0aGUgb3JkZXJpbmcgb2YgdGhpcyBub2RlLgorICBPcmRlcmluZy0+cmVtb3ZlKE4pOworCisgIC8vIElmIGFueSBvZiB0aGUgU0REYmdWYWx1ZSBub2RlcyByZWZlciB0byB0aGlzIFNETm9kZSwgaW52YWxpZGF0ZSB0aGVtLgorICBTbWFsbFZlY3RvcjxTRERiZ1ZhbHVlKiwgMj4gJkRiZ1ZhbHMgPSBEYmdJbmZvLT5nZXRTRERiZ1ZhbHVlcyhOKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IERiZ1ZhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBEYmdWYWxzW2ldLT5zZXRJc0ludmFsaWRhdGVkKCk7Cit9CisKKy8vLyBSZW1vdmVOb2RlRnJvbUNTRU1hcHMgLSBUYWtlIHRoZSBzcGVjaWZpZWQgbm9kZSBvdXQgb2YgdGhlIENTRSBtYXAgdGhhdAorLy8vIGNvcnJlc3BvbmQgdG8gaXQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHdlJ3JlIGFib3V0IHRvIGRlbGV0ZSBvciByZXB1cnBvc2UKKy8vLyB0aGUgbm9kZS4gIFdlIGRvbid0IHdhbnQgZnV0dXJlIHJlcXVlc3QgZm9yIHN0cnVjdHVyYWxseSBpZGVudGljYWwgbm9kZXMKKy8vLyB0byByZXR1cm4gTiBhbnltb3JlLgorYm9vbCBTZWxlY3Rpb25EQUc6OlJlbW92ZU5vZGVGcm9tQ1NFTWFwcyhTRE5vZGUgKk4pIHsKKyAgYm9vbCBFcmFzZWQgPSBmYWxzZTsKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBjYXNlIElTRDo6RW50cnlUb2tlbjoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJFbnRyeVRva2VuIHNob3VsZCBub3QgYmUgaW4gQ1NFTWFwcyEiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgSVNEOjpIQU5ETEVOT0RFOiByZXR1cm4gZmFsc2U7ICAvLyBub29wLgorICBjYXNlIElTRDo6Q09ORENPREU6CisgICAgYXNzZXJ0KENvbmRDb2RlTm9kZXNbY2FzdDxDb25kQ29kZVNETm9kZT4oTiktPmdldCgpXSAmJgorICAgICAgICAgICAiQ29uZCBjb2RlIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgRXJhc2VkID0gQ29uZENvZGVOb2Rlc1tjYXN0PENvbmRDb2RlU0ROb2RlPihOKS0+Z2V0KCldICE9IDA7CisgICAgQ29uZENvZGVOb2Rlc1tjYXN0PENvbmRDb2RlU0ROb2RlPihOKS0+Z2V0KCldID0gMDsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkV4dGVybmFsU3ltYm9sOgorICAgIEVyYXNlZCA9IEV4dGVybmFsU3ltYm9scy5lcmFzZShjYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPihOKS0+Z2V0U3ltYm9sKCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6VGFyZ2V0RXh0ZXJuYWxTeW1ib2w6IHsKKyAgICBFeHRlcm5hbFN5bWJvbFNETm9kZSAqRVNOID0gY2FzdDxFeHRlcm5hbFN5bWJvbFNETm9kZT4oTik7CisgICAgRXJhc2VkID0gVGFyZ2V0RXh0ZXJuYWxTeW1ib2xzLmVyYXNlKAorICAgICAgICAgICAgICAgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLHVuc2lnbmVkIGNoYXI+KEVTTi0+Z2V0U3ltYm9sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNOLT5nZXRUYXJnZXRGbGFncygpKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlZBTFVFVFlQRTogeworICAgIEVWVCBWVCA9IGNhc3Q8VlRTRE5vZGU+KE4pLT5nZXRWVCgpOworICAgIGlmIChWVC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgIEVyYXNlZCA9IEV4dGVuZGVkVmFsdWVUeXBlTm9kZXMuZXJhc2UoVlQpOworICAgIH0gZWxzZSB7CisgICAgICBFcmFzZWQgPSBWYWx1ZVR5cGVOb2Rlc1tWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5XSAhPSAwOworICAgICAgVmFsdWVUeXBlTm9kZXNbVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeV0gPSAwOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBkZWZhdWx0OgorICAgIC8vIFJlbW92ZSBpdCBmcm9tIHRoZSBDU0UgTWFwLgorICAgIEVyYXNlZCA9IENTRU1hcC5SZW1vdmVOb2RlKE4pOworICAgIGJyZWFrOworICB9CisjaWZuZGVmIE5ERUJVRworICAvLyBWZXJpZnkgdGhhdCB0aGUgbm9kZSB3YXMgYWN0dWFsbHkgaW4gb25lIG9mIHRoZSBDU0UgbWFwcywgdW5sZXNzIGl0IGhhcyBhCisgIC8vIGZsYWcgcmVzdWx0ICh3aGljaCBjYW5ub3QgYmUgQ1NFJ2QpIG9yIGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBjYXNlcyB0aGF0IGFyZQorICAvLyBub3Qgc3ViamVjdCB0byBDU0UuCisgIGlmICghRXJhc2VkICYmIE4tPmdldFZhbHVlVHlwZShOLT5nZXROdW1WYWx1ZXMoKS0xKSAhPSBNVlQ6OkZsYWcgJiYKKyAgICAgICFOLT5pc01hY2hpbmVPcGNvZGUoKSAmJiAhZG9Ob3RDU0UoTikpIHsKKyAgICBOLT5kdW1wKHRoaXMpOworICAgIGRiZ3MoKSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vZGUgaXMgbm90IGluIG1hcCEiKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBFcmFzZWQ7Cit9CisKKy8vLyBBZGRNb2RpZmllZE5vZGVUb0NTRU1hcHMgLSBUaGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBDU0UKKy8vLyBtYXBzIGFuZCBtb2RpZmllZCBpbiBwbGFjZS4gQWRkIGl0IGJhY2sgdG8gdGhlIENTRSBtYXBzLCB1bmxlc3MgYW4gaWRlbnRpY2FsCisvLy8gbm9kZSBhbHJlYWR5IGV4aXN0cywgaW4gd2hpY2ggY2FzZSB0cmFuc2ZlciBhbGwgaXRzIHVzZXJzIHRvIHRoZSBleGlzdGluZworLy8vIG5vZGUuIFRoaXMgdHJhbnNmZXIgY2FuIHBvdGVudGlhbGx5IHRyaWdnZXIgcmVjdXJzaXZlIG1lcmdpbmcuCisvLy8KK3ZvaWQKK1NlbGVjdGlvbkRBRzo6QWRkTW9kaWZpZWROb2RlVG9DU0VNYXBzKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBR1VwZGF0ZUxpc3RlbmVyICpVcGRhdGVMaXN0ZW5lcikgeworICAvLyBGb3Igbm9kZSB0eXBlcyB0aGF0IGFyZW4ndCBDU0UnZCwganVzdCBhY3QgYXMgaWYgbm8gaWRlbnRpY2FsIG5vZGUKKyAgLy8gYWxyZWFkeSBleGlzdHMuCisgIGlmICghZG9Ob3RDU0UoTikpIHsKKyAgICBTRE5vZGUgKkV4aXN0aW5nID0gQ1NFTWFwLkdldE9ySW5zZXJ0Tm9kZShOKTsKKyAgICBpZiAoRXhpc3RpbmcgIT0gTikgeworICAgICAgLy8gSWYgdGhlcmUgd2FzIGFscmVhZHkgYW4gZXhpc3RpbmcgbWF0Y2hpbmcgbm9kZSwgdXNlIFJlcGxhY2VBbGxVc2VzV2l0aAorICAgICAgLy8gdG8gcmVwbGFjZSB0aGUgZGVhZCBvbmUgd2l0aCB0aGUgZXhpc3Rpbmcgb25lLiAgVGhpcyBjYW4gY2F1c2UKKyAgICAgIC8vIHJlY3Vyc2l2ZSBtZXJnaW5nIG9mIG90aGVyIHVucmVsYXRlZCBub2RlcyBkb3duIHRoZSBsaW5lLgorICAgICAgUmVwbGFjZUFsbFVzZXNXaXRoKE4sIEV4aXN0aW5nLCBVcGRhdGVMaXN0ZW5lcik7CisKKyAgICAgIC8vIE4gaXMgbm93IGRlYWQuICBJbmZvcm0gdGhlIGxpc3RlbmVyIGlmIGl0IGV4aXN0cyBhbmQgZGVsZXRlIGl0LgorICAgICAgaWYgKFVwZGF0ZUxpc3RlbmVyKQorICAgICAgICBVcGRhdGVMaXN0ZW5lci0+Tm9kZURlbGV0ZWQoTiwgRXhpc3RpbmcpOworICAgICAgRGVsZXRlTm9kZU5vdEluQ1NFTWFwcyhOKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgbm9kZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QsIHdlIHVwZGF0ZWQgaXQuICBJbmZvcm0gYSBsaXN0ZW5lciBpZgorICAvLyBpdCBleGlzdHMuCisgIGlmIChVcGRhdGVMaXN0ZW5lcikKKyAgICBVcGRhdGVMaXN0ZW5lci0+Tm9kZVVwZGF0ZWQoTik7Cit9CisKKy8vLyBGaW5kTW9kaWZpZWROb2RlU2xvdCAtIEZpbmQgYSBzbG90IGZvciB0aGUgc3BlY2lmaWVkIG5vZGUgaWYgaXRzIG9wZXJhbmRzCisvLy8gd2VyZSByZXBsYWNlZCB3aXRoIHRob3NlIHNwZWNpZmllZC4gIElmIHRoaXMgbm9kZSBpcyBuZXZlciBtZW1vaXplZCwKKy8vLyByZXR1cm4gbnVsbCwgb3RoZXJ3aXNlIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHNsb3QgaXQgd291bGQgdGFrZS4gIElmIGEKKy8vLyBub2RlIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlc2Ugb3BlcmFuZHMsIHRoZSBzbG90IHdpbGwgYmUgbm9uLW51bGwuCitTRE5vZGUgKlNlbGVjdGlvbkRBRzo6RmluZE1vZGlmaWVkTm9kZVNsb3QoU0ROb2RlICpOLCBTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiZJbnNlcnRQb3MpIHsKKyAgaWYgKGRvTm90Q1NFKE4pKQorICAgIHJldHVybiAwOworCisgIFNEVmFsdWUgT3BzW10gPSB7IE9wIH07CisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIEFkZE5vZGVJRE5vZGUoSUQsIE4tPmdldE9wY29kZSgpLCBOLT5nZXRWVExpc3QoKSwgT3BzLCAxKTsKKyAgQWRkTm9kZUlEQ3VzdG9tKElELCBOKTsKKyAgU0ROb2RlICpOb2RlID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvcyk7CisgIHJldHVybiBOb2RlOworfQorCisvLy8gRmluZE1vZGlmaWVkTm9kZVNsb3QgLSBGaW5kIGEgc2xvdCBmb3IgdGhlIHNwZWNpZmllZCBub2RlIGlmIGl0cyBvcGVyYW5kcworLy8vIHdlcmUgcmVwbGFjZWQgd2l0aCB0aG9zZSBzcGVjaWZpZWQuICBJZiB0aGlzIG5vZGUgaXMgbmV2ZXIgbWVtb2l6ZWQsCisvLy8gcmV0dXJuIG51bGwsIG90aGVyd2lzZSByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzbG90IGl0IHdvdWxkIHRha2UuICBJZiBhCisvLy8gbm9kZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZXNlIG9wZXJhbmRzLCB0aGUgc2xvdCB3aWxsIGJlIG5vbi1udWxsLgorU0ROb2RlICpTZWxlY3Rpb25EQUc6OkZpbmRNb2RpZmllZE5vZGVTbG90KFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqJkluc2VydFBvcykgeworICBpZiAoZG9Ob3RDU0UoTikpCisgICAgcmV0dXJuIDA7CisKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgT3AxLCBPcDIgfTsKKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgQWRkTm9kZUlETm9kZShJRCwgTi0+Z2V0T3Bjb2RlKCksIE4tPmdldFZUTGlzdCgpLCBPcHMsIDIpOworICBBZGROb2RlSURDdXN0b20oSUQsIE4pOworICBTRE5vZGUgKk5vZGUgPSBDU0VNYXAuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9zKTsKKyAgcmV0dXJuIE5vZGU7Cit9CisKKworLy8vIEZpbmRNb2RpZmllZE5vZGVTbG90IC0gRmluZCBhIHNsb3QgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZSBpZiBpdHMgb3BlcmFuZHMKKy8vLyB3ZXJlIHJlcGxhY2VkIHdpdGggdGhvc2Ugc3BlY2lmaWVkLiAgSWYgdGhpcyBub2RlIGlzIG5ldmVyIG1lbW9pemVkLAorLy8vIHJldHVybiBudWxsLCBvdGhlcndpc2UgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc2xvdCBpdCB3b3VsZCB0YWtlLiAgSWYgYQorLy8vIG5vZGUgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGVzZSBvcGVyYW5kcywgdGhlIHNsb3Qgd2lsbCBiZSBub24tbnVsbC4KK1NETm9kZSAqU2VsZWN0aW9uREFHOjpGaW5kTW9kaWZpZWROb2RlU2xvdChTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIComSW5zZXJ0UG9zKSB7CisgIGlmIChkb05vdENTRShOKSkKKyAgICByZXR1cm4gMDsKKworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBZGROb2RlSUROb2RlKElELCBOLT5nZXRPcGNvZGUoKSwgTi0+Z2V0VlRMaXN0KCksIE9wcywgTnVtT3BzKTsKKyAgQWRkTm9kZUlEQ3VzdG9tKElELCBOKTsKKyAgU0ROb2RlICpOb2RlID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvcyk7CisgIHJldHVybiBOb2RlOworfQorCisvLy8gVmVyaWZ5Tm9kZSAtIFNhbml0eSBjaGVjayB0aGUgZ2l2ZW4gbm9kZS4gIEFib3J0cyBpZiBpdCBpcyBpbnZhbGlkLgordm9pZCBTZWxlY3Rpb25EQUc6OlZlcmlmeU5vZGUoU0ROb2RlICpOKSB7CisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkJVSUxEX1BBSVI6IHsKKyAgICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgYXNzZXJ0KE4tPmdldE51bVZhbHVlcygpID09IDEgJiYgIlRvbyBtYW55IHJlc3VsdHMhIik7CisgICAgYXNzZXJ0KCFWVC5pc1ZlY3RvcigpICYmIChWVC5pc0ludGVnZXIoKSB8fCBWVC5pc0Zsb2F0aW5nUG9pbnQoKSkgJiYKKyAgICAgICAgICAgIldyb25nIHJldHVybiB0eXBlISIpOworICAgIGFzc2VydChOLT5nZXROdW1PcGVyYW5kcygpID09IDIgJiYgIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyEiKTsKKyAgICBhc3NlcnQoTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSA9PSBOLT5nZXRPcGVyYW5kKDEpLmdldFZhbHVlVHlwZSgpICYmCisgICAgICAgICAgICJNaXNtYXRjaGVkIG9wZXJhbmQgdHlwZXMhIik7CisgICAgYXNzZXJ0KE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkgPT0gVlQuaXNJbnRlZ2VyKCkgJiYKKyAgICAgICAgICAgIldyb25nIG9wZXJhbmQgdHlwZSEiKTsKKyAgICBhc3NlcnQoVlQuZ2V0U2l6ZUluQml0cygpID09IDIgKiBOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlU2l6ZUluQml0cygpICYmCisgICAgICAgICAgICJXcm9uZyByZXR1cm4gdHlwZSBzaXplIik7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OkJVSUxEX1ZFQ1RPUjogeworICAgIGFzc2VydChOLT5nZXROdW1WYWx1ZXMoKSA9PSAxICYmICJUb28gbWFueSByZXN1bHRzISIpOworICAgIGFzc2VydChOLT5nZXRWYWx1ZVR5cGUoMCkuaXNWZWN0b3IoKSAmJiAiV3JvbmcgcmV0dXJuIHR5cGUhIik7CisgICAgYXNzZXJ0KE4tPmdldE51bU9wZXJhbmRzKCkgPT0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3Rvck51bUVsZW1lbnRzKCkgJiYKKyAgICAgICAgICAgIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyEiKTsKKyAgICBFVlQgRWx0VlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICBmb3IgKFNETm9kZTo6b3BfaXRlcmF0b3IgSSA9IE4tPm9wX2JlZ2luKCksIEUgPSBOLT5vcF9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBhc3NlcnQoKEktPmdldFZhbHVlVHlwZSgpID09IEVsdFZUIHx8CisgICAgICAgICAgICAgKEVsdFZULmlzSW50ZWdlcigpICYmIEktPmdldFZhbHVlVHlwZSgpLmlzSW50ZWdlcigpICYmCisgICAgICAgICAgICAgIEVsdFZULmJpdHNMRShJLT5nZXRWYWx1ZVR5cGUoKSkpKSAmJgorICAgICAgICAgICAgIldyb25nIG9wZXJhbmQgdHlwZSEiKTsKKyAgICBicmVhazsKKyAgfQorICB9Cit9CisKKy8vLyBnZXRFVlRBbGlnbm1lbnQgLSBDb21wdXRlIHRoZSBkZWZhdWx0IGFsaWdubWVudCB2YWx1ZSBmb3IgdGhlCisvLy8gZ2l2ZW4gdHlwZS4KKy8vLwordW5zaWduZWQgU2VsZWN0aW9uREFHOjpnZXRFVlRBbGlnbm1lbnQoRVZUIFZUKSBjb25zdCB7CisgIGNvbnN0IFR5cGUgKlR5ID0gVlQgPT0gTVZUOjppUFRSID8KKyAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZTo6Z2V0KFR5cGU6OmdldEludDhUeSgqZ2V0Q29udGV4dCgpKSwgMCkgOgorICAgICAgICAgICAgICAgICAgIFZULmdldFR5cGVGb3JFVlQoKmdldENvbnRleHQoKSk7CisKKyAgcmV0dXJuIFRMSS5nZXRUYXJnZXREYXRhKCktPmdldEFCSVR5cGVBbGlnbm1lbnQoVHkpOworfQorCisvLyBFbnRyeU5vZGUgY291bGQgbWVhbmluZ2Z1bGx5IGhhdmUgZGVidWcgaW5mbyBpZiB3ZSBjYW4gZmluZCBpdC4uLgorU2VsZWN0aW9uREFHOjpTZWxlY3Rpb25EQUcoY29uc3QgVGFyZ2V0TWFjaGluZSAmdG0pCisgIDogVE0odG0pLCBUTEkoKnRtLmdldFRhcmdldExvd2VyaW5nKCkpLCBUU0koKnRtLmdldFNlbGVjdGlvbkRBR0luZm8oKSksCisgICAgRW50cnlOb2RlKElTRDo6RW50cnlUb2tlbiwgRGVidWdMb2MoKSwgZ2V0VlRMaXN0KE1WVDo6T3RoZXIpKSwKKyAgICBSb290KGdldEVudHJ5Tm9kZSgpKSwgT3JkZXJpbmcoMCkgeworICBBbGxOb2Rlcy5wdXNoX2JhY2soJkVudHJ5Tm9kZSk7CisgIE9yZGVyaW5nID0gbmV3IFNETm9kZU9yZGVyaW5nKCk7CisgIERiZ0luZm8gPSBuZXcgU0REYmdJbmZvKCk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHOjppbml0KE1hY2hpbmVGdW5jdGlvbiAmbWYpIHsKKyAgTUYgPSAmbWY7CisgIENvbnRleHQgPSAmbWYuZ2V0RnVuY3Rpb24oKS0+Z2V0Q29udGV4dCgpOworfQorCitTZWxlY3Rpb25EQUc6On5TZWxlY3Rpb25EQUcoKSB7CisgIGFsbG5vZGVzX2NsZWFyKCk7CisgIGRlbGV0ZSBPcmRlcmluZzsKKyAgZGVsZXRlIERiZ0luZm87Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHOjphbGxub2Rlc19jbGVhcigpIHsKKyAgYXNzZXJ0KCYqQWxsTm9kZXMuYmVnaW4oKSA9PSAmRW50cnlOb2RlKTsKKyAgQWxsTm9kZXMucmVtb3ZlKEFsbE5vZGVzLmJlZ2luKCkpOworICB3aGlsZSAoIUFsbE5vZGVzLmVtcHR5KCkpCisgICAgRGVhbGxvY2F0ZU5vZGUoQWxsTm9kZXMuYmVnaW4oKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHOjpjbGVhcigpIHsKKyAgYWxsbm9kZXNfY2xlYXIoKTsKKyAgT3BlcmFuZEFsbG9jYXRvci5SZXNldCgpOworICBDU0VNYXAuY2xlYXIoKTsKKworICBFeHRlbmRlZFZhbHVlVHlwZU5vZGVzLmNsZWFyKCk7CisgIEV4dGVybmFsU3ltYm9scy5jbGVhcigpOworICBUYXJnZXRFeHRlcm5hbFN5bWJvbHMuY2xlYXIoKTsKKyAgc3RkOjpmaWxsKENvbmRDb2RlTm9kZXMuYmVnaW4oKSwgQ29uZENvZGVOb2Rlcy5lbmQoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENvbmRDb2RlU0ROb2RlKj4oMCkpOworICBzdGQ6OmZpbGwoVmFsdWVUeXBlTm9kZXMuYmVnaW4oKSwgVmFsdWVUeXBlTm9kZXMuZW5kKCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxTRE5vZGUqPigwKSk7CisKKyAgRW50cnlOb2RlLlVzZUxpc3QgPSAwOworICBBbGxOb2Rlcy5wdXNoX2JhY2soJkVudHJ5Tm9kZSk7CisgIFJvb3QgPSBnZXRFbnRyeU5vZGUoKTsKKyAgT3JkZXJpbmctPmNsZWFyKCk7CisgIERiZ0luZm8tPmNsZWFyKCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRTRXh0T3JUcnVuYyhTRFZhbHVlIE9wLCBEZWJ1Z0xvYyBETCwgRVZUIFZUKSB7CisgIHJldHVybiBWVC5iaXRzR1QoT3AuZ2V0VmFsdWVUeXBlKCkpID8KKyAgICBnZXROb2RlKElTRDo6U0lHTl9FWFRFTkQsIERMLCBWVCwgT3ApIDoKKyAgICBnZXROb2RlKElTRDo6VFJVTkNBVEUsIERMLCBWVCwgT3ApOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0WkV4dE9yVHJ1bmMoU0RWYWx1ZSBPcCwgRGVidWdMb2MgREwsIEVWVCBWVCkgeworICByZXR1cm4gVlQuYml0c0dUKE9wLmdldFZhbHVlVHlwZSgpKSA/CisgICAgZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBETCwgVlQsIE9wKSA6CisgICAgZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBETCwgVlQsIE9wKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldFplcm9FeHRlbmRJblJlZyhTRFZhbHVlIE9wLCBEZWJ1Z0xvYyBETCwgRVZUIFZUKSB7CisgIGFzc2VydCghVlQuaXNWZWN0b3IoKSAmJgorICAgICAgICAgImdldFplcm9FeHRlbmRJblJlZyBzaG91bGQgdXNlIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlIGluc3RlYWQgb2YgIgorICAgICAgICAgInRoZSB2ZWN0b3IgdHlwZSEiKTsKKyAgaWYgKE9wLmdldFZhbHVlVHlwZSgpID09IFZUKSByZXR1cm4gT3A7CisgIHVuc2lnbmVkIEJpdFdpZHRoID0gT3AuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgQVBJbnQgSW1tID0gQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULmdldFNpemVJbkJpdHMoKSk7CisgIHJldHVybiBnZXROb2RlKElTRDo6QU5ELCBETCwgT3AuZ2V0VmFsdWVUeXBlKCksIE9wLAorICAgICAgICAgICAgICAgICBnZXRDb25zdGFudChJbW0sIE9wLmdldFZhbHVlVHlwZSgpKSk7Cit9CisKKy8vLyBnZXROT1QgLSBDcmVhdGUgYSBiaXR3aXNlIE5PVCBvcGVyYXRpb24gYXMgKFhPUiBWYWwsIC0xKS4KKy8vLworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5PVChEZWJ1Z0xvYyBETCwgU0RWYWx1ZSBWYWwsIEVWVCBWVCkgeworICBFVlQgRWx0VlQgPSBWVC5nZXRTY2FsYXJUeXBlKCk7CisgIFNEVmFsdWUgTmVnT25lID0KKyAgICBnZXRDb25zdGFudChBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEVsdFZULmdldFNpemVJbkJpdHMoKSksIFZUKTsKKyAgcmV0dXJuIGdldE5vZGUoSVNEOjpYT1IsIERMLCBWVCwgVmFsLCBOZWdPbmUpOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0Q29uc3RhbnQodWludDY0X3QgVmFsLCBFVlQgVlQsIGJvb2wgaXNUKSB7CisgIEVWVCBFbHRWVCA9IFZULmdldFNjYWxhclR5cGUoKTsKKyAgYXNzZXJ0KChFbHRWVC5nZXRTaXplSW5CaXRzKCkgPj0gNjQgfHwKKyAgICAgICAgICh1aW50NjRfdCkoKGludDY0X3QpVmFsID4+IEVsdFZULmdldFNpemVJbkJpdHMoKSkgKyAxIDwgMikgJiYKKyAgICAgICAgICJnZXRDb25zdGFudCB3aXRoIGEgdWludDY0X3QgdmFsdWUgdGhhdCBkb2Vzbid0IGZpdCBpbiB0aGUgdHlwZSEiKTsKKyAgcmV0dXJuIGdldENvbnN0YW50KEFQSW50KEVsdFZULmdldFNpemVJbkJpdHMoKSwgVmFsKSwgVlQsIGlzVCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRDb25zdGFudChjb25zdCBBUEludCAmVmFsLCBFVlQgVlQsIGJvb2wgaXNUKSB7CisgIHJldHVybiBnZXRDb25zdGFudCgqQ29uc3RhbnRJbnQ6OmdldCgqQ29udGV4dCwgVmFsKSwgVlQsIGlzVCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRDb25zdGFudChjb25zdCBDb25zdGFudEludCAmVmFsLCBFVlQgVlQsIGJvb2wgaXNUKSB7CisgIGFzc2VydChWVC5pc0ludGVnZXIoKSAmJiAiQ2Fubm90IGNyZWF0ZSBGUCBpbnRlZ2VyIGNvbnN0YW50ISIpOworCisgIEVWVCBFbHRWVCA9IFZULmdldFNjYWxhclR5cGUoKTsKKyAgYXNzZXJ0KFZhbC5nZXRCaXRXaWR0aCgpID09IEVsdFZULmdldFNpemVJbkJpdHMoKSAmJgorICAgICAgICAgIkFQSW50IHNpemUgZG9lcyBub3QgbWF0Y2ggdHlwZSBzaXplISIpOworCisgIHVuc2lnbmVkIE9wYyA9IGlzVCA/IElTRDo6VGFyZ2V0Q29uc3RhbnQgOiBJU0Q6OkNvbnN0YW50OworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBZGROb2RlSUROb2RlKElELCBPcGMsIGdldFZUTGlzdChFbHRWVCksIDAsIDApOworICBJRC5BZGRQb2ludGVyKCZWYWwpOworICB2b2lkICpJUCA9IDA7CisgIFNETm9kZSAqTiA9IE5VTEw7CisgIGlmICgoTiA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpKQorICAgIGlmICghVlQuaXNWZWN0b3IoKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKE4sIDApOworCisgIGlmICghTikgeworICAgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIENvbnN0YW50U0ROb2RlKGlzVCwgJlZhbCwgRWx0VlQpOworICAgIENTRU1hcC5JbnNlcnROb2RlKE4sIElQKTsKKyAgICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIH0KKworICBTRFZhbHVlIFJlc3VsdChOLCAwKTsKKyAgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHM7CisgICAgT3BzLmFzc2lnbihWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpLCBSZXN1bHQpOworICAgIFJlc3VsdCA9IGdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIERlYnVnTG9jKCksIFZULCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgfQorICByZXR1cm4gUmVzdWx0OworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0SW50UHRyQ29uc3RhbnQodWludDY0X3QgVmFsLCBib29sIGlzVGFyZ2V0KSB7CisgIHJldHVybiBnZXRDb25zdGFudChWYWwsIFRMSS5nZXRQb2ludGVyVHkoKSwgaXNUYXJnZXQpOworfQorCisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRDb25zdGFudEZQKGNvbnN0IEFQRmxvYXQmIFYsIEVWVCBWVCwgYm9vbCBpc1RhcmdldCkgeworICByZXR1cm4gZ2V0Q29uc3RhbnRGUCgqQ29uc3RhbnRGUDo6Z2V0KCpnZXRDb250ZXh0KCksIFYpLCBWVCwgaXNUYXJnZXQpOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0Q29uc3RhbnRGUChjb25zdCBDb25zdGFudEZQJiBWLCBFVlQgVlQsIGJvb2wgaXNUYXJnZXQpeworICBhc3NlcnQoVlQuaXNGbG9hdGluZ1BvaW50KCkgJiYgIkNhbm5vdCBjcmVhdGUgaW50ZWdlciBGUCBjb25zdGFudCEiKTsKKworICBFVlQgRWx0VlQgPSBWVC5nZXRTY2FsYXJUeXBlKCk7CisKKyAgLy8gRG8gdGhlIG1hcCBsb29rdXAgdXNpbmcgdGhlIGFjdHVhbCBiaXQgcGF0dGVybiBmb3IgdGhlIGZsb2F0aW5nIHBvaW50CisgIC8vIHZhbHVlLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgcHJvYmxlbXMgd2l0aCAwLjAgY29tcGFyaW5nIGVxdWFsIHRvIC0wLjAsIGFuZAorICAvLyB3ZSBkb24ndCBoYXZlIGlzc3VlcyB3aXRoIFNOQU5zLgorICB1bnNpZ25lZCBPcGMgPSBpc1RhcmdldCA/IElTRDo6VGFyZ2V0Q29uc3RhbnRGUCA6IElTRDo6Q29uc3RhbnRGUDsKKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgQWRkTm9kZUlETm9kZShJRCwgT3BjLCBnZXRWVExpc3QoRWx0VlQpLCAwLCAwKTsKKyAgSUQuQWRkUG9pbnRlcigmVik7CisgIHZvaWQgKklQID0gMDsKKyAgU0ROb2RlICpOID0gTlVMTDsKKyAgaWYgKChOID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkpCisgICAgaWYgKCFWVC5pc1ZlY3RvcigpKQorICAgICAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7CisKKyAgaWYgKCFOKSB7CisgICAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgQ29uc3RhbnRGUFNETm9kZShpc1RhcmdldCwgJlYsIEVsdFZUKTsKKyAgICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgICAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworICB9CisKKyAgU0RWYWx1ZSBSZXN1bHQoTiwgMCk7CisgIGlmIChWVC5pc1ZlY3RvcigpKSB7CisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICAgIE9wcy5hc3NpZ24oVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSwgUmVzdWx0KTsKKyAgICAvLyBGSVhNRSBEZWJ1Z0xvYyBpbmZvIG1pZ2h0IGJlIGFwcHJvcHJpYXRlIGhlcmUKKyAgICBSZXN1bHQgPSBnZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBEZWJ1Z0xvYygpLCBWVCwgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgIH0KKyAgcmV0dXJuIFJlc3VsdDsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldENvbnN0YW50RlAoZG91YmxlIFZhbCwgRVZUIFZULCBib29sIGlzVGFyZ2V0KSB7CisgIEVWVCBFbHRWVCA9IFZULmdldFNjYWxhclR5cGUoKTsKKyAgaWYgKEVsdFZUPT1NVlQ6OmYzMikKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChBUEZsb2F0KChmbG9hdClWYWwpLCBWVCwgaXNUYXJnZXQpOworICBlbHNlIGlmIChFbHRWVD09TVZUOjpmNjQpCisgICAgcmV0dXJuIGdldENvbnN0YW50RlAoQVBGbG9hdChWYWwpLCBWVCwgaXNUYXJnZXQpOworICBlbHNlIGlmIChFbHRWVD09TVZUOjpmODAgfHwgRWx0VlQ9PU1WVDo6ZjEyOCkgeworICAgIGJvb2wgaWdub3JlZDsKKyAgICBBUEZsb2F0IGFwZiA9IEFQRmxvYXQoVmFsKTsKKyAgICBhcGYuY29udmVydCgqRVZUVG9BUEZsb2F0U2VtYW50aWNzKEVsdFZUKSwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbiwKKyAgICAgICAgICAgICAgICAmaWdub3JlZCk7CisgICAgcmV0dXJuIGdldENvbnN0YW50RlAoYXBmLCBWVCwgaXNUYXJnZXQpOworICB9IGVsc2UgeworICAgIGFzc2VydCgwICYmICJVbnN1cHBvcnRlZCB0eXBlIGluIGdldENvbnN0YW50RlAiKTsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRHbG9iYWxBZGRyZXNzKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQsIGludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhcmdldEdBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncykgeworICBhc3NlcnQoKFRhcmdldEZsYWdzID09IDAgfHwgaXNUYXJnZXRHQSkgJiYKKyAgICAgICAgICJDYW5ub3Qgc2V0IHRhcmdldCBmbGFncyBvbiB0YXJnZXQtaW5kZXBlbmRlbnQgZ2xvYmFscyIpOworCisgIC8vIFRydW5jYXRlICh3aXRoIHNpZ24tZXh0ZW5zaW9uKSB0aGUgb2Zmc2V0IHZhbHVlIHRvIHRoZSBwb2ludGVyIHNpemUuCisgIEVWVCBQVHkgPSBUTEkuZ2V0UG9pbnRlclR5KCk7CisgIHVuc2lnbmVkIEJpdFdpZHRoID0gUFR5LmdldFNpemVJbkJpdHMoKTsKKyAgaWYgKEJpdFdpZHRoIDwgNjQpCisgICAgT2Zmc2V0ID0gKE9mZnNldCA8PCAoNjQgLSBCaXRXaWR0aCkgPj4gKDY0IC0gQml0V2lkdGgpKTsKKworICBjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1ZhciA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihHVik7CisgIGlmICghR1ZhcikgeworICAgIC8vIElmIEdWIGlzIGFuIGFsaWFzIHRoZW4gdXNlIHRoZSBhbGlhc2VlIGZvciBkZXRlcm1pbmluZyB0aHJlYWQtbG9jYWxuZXNzLgorICAgIGlmIChjb25zdCBHbG9iYWxBbGlhcyAqR0EgPSBkeW5fY2FzdDxHbG9iYWxBbGlhcz4oR1YpKQorICAgICAgR1ZhciA9IGR5bl9jYXN0X29yX251bGw8R2xvYmFsVmFyaWFibGU+KEdBLT5yZXNvbHZlQWxpYXNlZEdsb2JhbChmYWxzZSkpOworICB9CisKKyAgdW5zaWduZWQgT3BjOworICBpZiAoR1ZhciAmJiBHVmFyLT5pc1RocmVhZExvY2FsKCkpCisgICAgT3BjID0gaXNUYXJnZXRHQSA/IElTRDo6VGFyZ2V0R2xvYmFsVExTQWRkcmVzcyA6IElTRDo6R2xvYmFsVExTQWRkcmVzczsKKyAgZWxzZQorICAgIE9wYyA9IGlzVGFyZ2V0R0EgPyBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MgOiBJU0Q6Okdsb2JhbEFkZHJlc3M7CisKKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgQWRkTm9kZUlETm9kZShJRCwgT3BjLCBnZXRWVExpc3QoVlQpLCAwLCAwKTsKKyAgSUQuQWRkUG9pbnRlcihHVik7CisgIElELkFkZEludGVnZXIoT2Zmc2V0KTsKKyAgSUQuQWRkSW50ZWdlcihUYXJnZXRGbGFncyk7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpCisgICAgcmV0dXJuIFNEVmFsdWUoRSwgMCk7CisKKyAgU0ROb2RlICpOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBHbG9iYWxBZGRyZXNzU0ROb2RlKE9wYywgREwsIEdWLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwgVGFyZ2V0RmxhZ3MpOworICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIEFsbE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRGcmFtZUluZGV4KGludCBGSSwgRVZUIFZULCBib29sIGlzVGFyZ2V0KSB7CisgIHVuc2lnbmVkIE9wYyA9IGlzVGFyZ2V0ID8gSVNEOjpUYXJnZXRGcmFtZUluZGV4IDogSVNEOjpGcmFtZUluZGV4OworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBZGROb2RlSUROb2RlKElELCBPcGMsIGdldFZUTGlzdChWVCksIDAsIDApOworICBJRC5BZGRJbnRlZ2VyKEZJKTsKKyAgdm9pZCAqSVAgPSAwOworICBpZiAoU0ROb2RlICpFID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkKKyAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKworICBTRE5vZGUgKk4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIEZyYW1lSW5kZXhTRE5vZGUoRkksIFZULCBpc1RhcmdldCk7CisgIENTRU1hcC5JbnNlcnROb2RlKE4sIElQKTsKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldEp1bXBUYWJsZShpbnQgSlRJLCBFVlQgVlQsIGJvb2wgaXNUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MpIHsKKyAgYXNzZXJ0KChUYXJnZXRGbGFncyA9PSAwIHx8IGlzVGFyZ2V0KSAmJgorICAgICAgICAgIkNhbm5vdCBzZXQgdGFyZ2V0IGZsYWdzIG9uIHRhcmdldC1pbmRlcGVuZGVudCBqdW1wIHRhYmxlcyIpOworICB1bnNpZ25lZCBPcGMgPSBpc1RhcmdldCA/IElTRDo6VGFyZ2V0SnVtcFRhYmxlIDogSVNEOjpKdW1wVGFibGU7CisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIEFkZE5vZGVJRE5vZGUoSUQsIE9wYywgZ2V0VlRMaXN0KFZUKSwgMCwgMCk7CisgIElELkFkZEludGVnZXIoSlRJKTsKKyAgSUQuQWRkSW50ZWdlcihUYXJnZXRGbGFncyk7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpCisgICAgcmV0dXJuIFNEVmFsdWUoRSwgMCk7CisKKyAgU0ROb2RlICpOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBKdW1wVGFibGVTRE5vZGUoSlRJLCBWVCwgaXNUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEZsYWdzKTsKKyAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0Q29uc3RhbnRQb29sKGNvbnN0IENvbnN0YW50ICpDLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwgaW50IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncykgeworICBhc3NlcnQoKFRhcmdldEZsYWdzID09IDAgfHwgaXNUYXJnZXQpICYmCisgICAgICAgICAiQ2Fubm90IHNldCB0YXJnZXQgZmxhZ3Mgb24gdGFyZ2V0LWluZGVwZW5kZW50IGdsb2JhbHMiKTsKKyAgaWYgKEFsaWdubWVudCA9PSAwKQorICAgIEFsaWdubWVudCA9IFRMSS5nZXRUYXJnZXREYXRhKCktPmdldFByZWZUeXBlQWxpZ25tZW50KEMtPmdldFR5cGUoKSk7CisgIHVuc2lnbmVkIE9wYyA9IGlzVGFyZ2V0ID8gSVNEOjpUYXJnZXRDb25zdGFudFBvb2wgOiBJU0Q6OkNvbnN0YW50UG9vbDsKKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgQWRkTm9kZUlETm9kZShJRCwgT3BjLCBnZXRWVExpc3QoVlQpLCAwLCAwKTsKKyAgSUQuQWRkSW50ZWdlcihBbGlnbm1lbnQpOworICBJRC5BZGRJbnRlZ2VyKE9mZnNldCk7CisgIElELkFkZFBvaW50ZXIoQyk7CisgIElELkFkZEludGVnZXIoVGFyZ2V0RmxhZ3MpOworICB2b2lkICpJUCA9IDA7CisgIGlmIChTRE5vZGUgKkUgPSBDU0VNYXAuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKQorICAgIHJldHVybiBTRFZhbHVlKEUsIDApOworCisgIFNETm9kZSAqTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgQ29uc3RhbnRQb29sU0ROb2RlKGlzVGFyZ2V0LCBDLCBWVCwgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQsIFRhcmdldEZsYWdzKTsKKyAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRDb25zdGFudFBvb2woTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpDLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwgaW50IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncykgeworICBhc3NlcnQoKFRhcmdldEZsYWdzID09IDAgfHwgaXNUYXJnZXQpICYmCisgICAgICAgICAiQ2Fubm90IHNldCB0YXJnZXQgZmxhZ3Mgb24gdGFyZ2V0LWluZGVwZW5kZW50IGdsb2JhbHMiKTsKKyAgaWYgKEFsaWdubWVudCA9PSAwKQorICAgIEFsaWdubWVudCA9IFRMSS5nZXRUYXJnZXREYXRhKCktPmdldFByZWZUeXBlQWxpZ25tZW50KEMtPmdldFR5cGUoKSk7CisgIHVuc2lnbmVkIE9wYyA9IGlzVGFyZ2V0ID8gSVNEOjpUYXJnZXRDb25zdGFudFBvb2wgOiBJU0Q6OkNvbnN0YW50UG9vbDsKKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgQWRkTm9kZUlETm9kZShJRCwgT3BjLCBnZXRWVExpc3QoVlQpLCAwLCAwKTsKKyAgSUQuQWRkSW50ZWdlcihBbGlnbm1lbnQpOworICBJRC5BZGRJbnRlZ2VyKE9mZnNldCk7CisgIEMtPkFkZFNlbGVjdGlvbkRBR0NTRUlkKElEKTsKKyAgSUQuQWRkSW50ZWdlcihUYXJnZXRGbGFncyk7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpCisgICAgcmV0dXJuIFNEVmFsdWUoRSwgMCk7CisKKyAgU0ROb2RlICpOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBDb25zdGFudFBvb2xTRE5vZGUoaXNUYXJnZXQsIEMsIFZULCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCwgVGFyZ2V0RmxhZ3MpOworICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIEFsbE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgQWRkTm9kZUlETm9kZShJRCwgSVNEOjpCYXNpY0Jsb2NrLCBnZXRWVExpc3QoTVZUOjpPdGhlciksIDAsIDApOworICBJRC5BZGRQb2ludGVyKE1CQik7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpCisgICAgcmV0dXJuIFNEVmFsdWUoRSwgMCk7CisKKyAgU0ROb2RlICpOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBCYXNpY0Jsb2NrU0ROb2RlKE1CQik7CisgIENTRU1hcC5JbnNlcnROb2RlKE4sIElQKTsKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldFZhbHVlVHlwZShFVlQgVlQpIHsKKyAgaWYgKFZULmlzU2ltcGxlKCkgJiYgKHVuc2lnbmVkKVZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgPj0KKyAgICAgIFZhbHVlVHlwZU5vZGVzLnNpemUoKSkKKyAgICBWYWx1ZVR5cGVOb2Rlcy5yZXNpemUoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSsxKTsKKworICBTRE5vZGUgKiZOID0gVlQuaXNFeHRlbmRlZCgpID8KKyAgICBFeHRlbmRlZFZhbHVlVHlwZU5vZGVzW1ZUXSA6IFZhbHVlVHlwZU5vZGVzW1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldOworCisgIGlmIChOKSByZXR1cm4gU0RWYWx1ZShOLCAwKTsKKyAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgVlRTRE5vZGUoVlQpOworICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0RXh0ZXJuYWxTeW1ib2woY29uc3QgY2hhciAqU3ltLCBFVlQgVlQpIHsKKyAgU0ROb2RlIComTiA9IEV4dGVybmFsU3ltYm9sc1tTeW1dOworICBpZiAoTikgcmV0dXJuIFNEVmFsdWUoTiwgMCk7CisgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIEV4dGVybmFsU3ltYm9sU0ROb2RlKGZhbHNlLCBTeW0sIDAsIFZUKTsKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldFRhcmdldEV4dGVybmFsU3ltYm9sKGNvbnN0IGNoYXIgKlN5bSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MpIHsKKyAgU0ROb2RlIComTiA9CisgICAgVGFyZ2V0RXh0ZXJuYWxTeW1ib2xzW3N0ZDo6cGFpcjxzdGQ6OnN0cmluZyx1bnNpZ25lZCBjaGFyPihTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRGbGFncyldOworICBpZiAoTikgcmV0dXJuIFNEVmFsdWUoTiwgMCk7CisgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIEV4dGVybmFsU3ltYm9sU0ROb2RlKHRydWUsIFN5bSwgVGFyZ2V0RmxhZ3MsIFZUKTsKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldENvbmRDb2RlKElTRDo6Q29uZENvZGUgQ29uZCkgeworICBpZiAoKHVuc2lnbmVkKUNvbmQgPj0gQ29uZENvZGVOb2Rlcy5zaXplKCkpCisgICAgQ29uZENvZGVOb2Rlcy5yZXNpemUoQ29uZCsxKTsKKworICBpZiAoQ29uZENvZGVOb2Rlc1tDb25kXSA9PSAwKSB7CisgICAgQ29uZENvZGVTRE5vZGUgKk4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIENvbmRDb2RlU0ROb2RlKENvbmQpOworICAgIENvbmRDb2RlTm9kZXNbQ29uZF0gPSBOOworICAgIEFsbE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKENvbmRDb2RlTm9kZXNbQ29uZF0sIDApOworfQorCisvLyBjb21tdXRlU2h1ZmZsZSAtIHN3YXBzIHRoZSB2YWx1ZXMgb2YgTjEgYW5kIE4yLCBhbmQgc3dhcHMgYWxsIGluZGljZXMgaW4KKy8vIHRoZSBzaHVmZmxlIG1hc2sgTSB0aGF0IHBvaW50IGF0IE4xIHRvIHBvaW50IGF0IE4yLCBhbmQgaW5kaWNlcyB0aGF0IHBvaW50CisvLyBOMiB0byBwb2ludCBhdCBOMS4KK3N0YXRpYyB2b2lkIGNvbW11dGVTaHVmZmxlKFNEVmFsdWUgJk4xLCBTRFZhbHVlICZOMiwgU21hbGxWZWN0b3JJbXBsPGludD4gJk0pIHsKKyAgc3RkOjpzd2FwKE4xLCBOMik7CisgIGludCBORWx0cyA9IE0uc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSAhPSBORWx0czsgKytpKSB7CisgICAgaWYgKE1baV0gPj0gTkVsdHMpCisgICAgICBNW2ldIC09IE5FbHRzOworICAgIGVsc2UgaWYgKE1baV0gPj0gMCkKKyAgICAgIE1baV0gKz0gTkVsdHM7CisgIH0KK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldFZlY3RvclNodWZmbGUoRVZUIFZULCBEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjIsIGNvbnN0IGludCAqTWFzaykgeworICBhc3NlcnQoTjEuZ2V0VmFsdWVUeXBlKCkgPT0gTjIuZ2V0VmFsdWVUeXBlKCkgJiYgIkludmFsaWQgVkVDVE9SX1NIVUZGTEUiKTsKKyAgYXNzZXJ0KFZULmlzVmVjdG9yKCkgJiYgTjEuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSAmJgorICAgICAgICAgIlZlY3RvciBTaHVmZmxlIFZUcyBtdXN0IGJlIGEgdmVjdG9ycyIpOworICBhc3NlcnQoVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSA9PSBOMS5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpCisgICAgICAgICAmJiAiVmVjdG9yIFNodWZmbGUgVlRzIG11c3QgaGF2ZSBzYW1lIGVsZW1lbnQgdHlwZSIpOworCisgIC8vIENhbm9uaWNhbGl6ZSBzaHVmZmxlIHVuZGVmLCB1bmRlZiAtPiB1bmRlZgorICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRiAmJiBOMi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgIHJldHVybiBnZXRVTkRFRihWVCk7CisKKyAgLy8gVmFsaWRhdGUgdGhhdCBhbGwgaW5kaWNlcyBpbiBNYXNrIGFyZSB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBlbGVtZW50cworICAvLyBpbnB1dCB0byB0aGUgc2h1ZmZsZS4KKyAgdW5zaWduZWQgTkVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE1hc2tWZWM7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTkVsdHM7ICsraSkgeworICAgIGFzc2VydChNYXNrW2ldIDwgKGludCkoTkVsdHMgKiAyKSAmJiAiSW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgTWFza1ZlYy5wdXNoX2JhY2soTWFza1tpXSk7CisgIH0KKworICAvLyBDYW5vbmljYWxpemUgc2h1ZmZsZSB2LCB2IC0+IHYsIHVuZGVmCisgIGlmIChOMSA9PSBOMikgeworICAgIE4yID0gZ2V0VU5ERUYoVlQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTkVsdHM7ICsraSkKKyAgICAgIGlmIChNYXNrVmVjW2ldID49IChpbnQpTkVsdHMpIE1hc2tWZWNbaV0gLT0gTkVsdHM7CisgIH0KKworICAvLyBDYW5vbmljYWxpemUgc2h1ZmZsZSB1bmRlZiwgdiAtPiB2LCB1bmRlZi4gIENvbW11dGUgdGhlIHNodWZmbGUgbWFzay4KKyAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgY29tbXV0ZVNodWZmbGUoTjEsIE4yLCBNYXNrVmVjKTsKKworICAvLyBDYW5vbmljYWxpemUgYWxsIGluZGV4IGludG8gbGhzLCAtPiBzaHVmZmxlIGxocywgdW5kZWYKKyAgLy8gQ2Fub25pY2FsaXplIGFsbCBpbmRleCBpbnRvIHJocywgLT4gc2h1ZmZsZSByaHMsIHVuZGVmCisgIGJvb2wgQWxsTEhTID0gdHJ1ZSwgQWxsUkhTID0gdHJ1ZTsKKyAgYm9vbCBOMlVuZGVmID0gTjIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBORWx0czsgKytpKSB7CisgICAgaWYgKE1hc2tWZWNbaV0gPj0gKGludClORWx0cykgeworICAgICAgaWYgKE4yVW5kZWYpCisgICAgICAgIE1hc2tWZWNbaV0gPSAtMTsKKyAgICAgIGVsc2UKKyAgICAgICAgQWxsTEhTID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChNYXNrVmVjW2ldID49IDApIHsKKyAgICAgIEFsbFJIUyA9IGZhbHNlOworICAgIH0KKyAgfQorICBpZiAoQWxsTEhTICYmIEFsbFJIUykKKyAgICByZXR1cm4gZ2V0VU5ERUYoVlQpOworICBpZiAoQWxsTEhTICYmICFOMlVuZGVmKQorICAgIE4yID0gZ2V0VU5ERUYoVlQpOworICBpZiAoQWxsUkhTKSB7CisgICAgTjEgPSBnZXRVTkRFRihWVCk7CisgICAgY29tbXV0ZVNodWZmbGUoTjEsIE4yLCBNYXNrVmVjKTsKKyAgfQorCisgIC8vIElmIElkZW50aXR5IHNodWZmbGUsIG9yIGFsbCBzaHVmZmxlIGluIHRvIHVuZGVmLCByZXR1cm4gdGhhdCBub2RlLgorICBib29sIEFsbFVuZGVmID0gdHJ1ZTsKKyAgYm9vbCBJZGVudGl0eSA9IHRydWU7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTkVsdHM7ICsraSkgeworICAgIGlmIChNYXNrVmVjW2ldID49IDAgJiYgTWFza1ZlY1tpXSAhPSAoaW50KWkpIElkZW50aXR5ID0gZmFsc2U7CisgICAgaWYgKE1hc2tWZWNbaV0gPj0gMCkgQWxsVW5kZWYgPSBmYWxzZTsKKyAgfQorICBpZiAoSWRlbnRpdHkgJiYgTkVsdHMgPT0gTjEuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSkKKyAgICByZXR1cm4gTjE7CisgIGlmIChBbGxVbmRlZikKKyAgICByZXR1cm4gZ2V0VU5ERUYoVlQpOworCisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIFNEVmFsdWUgT3BzWzJdID0geyBOMSwgTjIgfTsKKyAgQWRkTm9kZUlETm9kZShJRCwgSVNEOjpWRUNUT1JfU0hVRkZMRSwgZ2V0VlRMaXN0KFZUKSwgT3BzLCAyKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBORWx0czsgKytpKQorICAgIElELkFkZEludGVnZXIoTWFza1ZlY1tpXSk7CisKKyAgdm9pZCogSVAgPSAwOworICBpZiAoU0ROb2RlICpFID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkKKyAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKworICAvLyBBbGxvY2F0ZSB0aGUgbWFzayBhcnJheSBmb3IgdGhlIG5vZGUgb3V0IG9mIHRoZSBCdW1wUHRyQWxsb2NhdG9yLCBzaW5jZQorICAvLyBTRE5vZGUgZG9lc24ndCBoYXZlIGFjY2VzcyB0byBpdC4gIFRoaXMgbWVtb3J5IHdpbGwgYmUgImxlYWtlZCIgd2hlbgorICAvLyB0aGUgbm9kZSBpcyBkZWFsbG9jYXRlZCwgYnV0IHJlY292ZXJlZCB3aGVuIHRoZSBOb2RlQWxsb2NhdG9yIGlzIHJlbGVhc2VkLgorICBpbnQgKk1hc2tBbGxvYyA9IE9wZXJhbmRBbGxvY2F0b3IuQWxsb2NhdGU8aW50PihORWx0cyk7CisgIG1lbWNweShNYXNrQWxsb2MsICZNYXNrVmVjWzBdLCBORWx0cyAqIHNpemVvZihpbnQpKTsKKworICBTaHVmZmxlVmVjdG9yU0ROb2RlICpOID0KKyAgICBuZXcgKE5vZGVBbGxvY2F0b3IpIFNodWZmbGVWZWN0b3JTRE5vZGUoVlQsIGRsLCBOMSwgTjIsIE1hc2tBbGxvYyk7CisgIENTRU1hcC5JbnNlcnROb2RlKE4sIElQKTsKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldENvbnZlcnRSbmRTYXQoRVZUIFZULCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgVmFsLCBTRFZhbHVlIERUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU1R5LCBTRFZhbHVlIFJuZCwgU0RWYWx1ZSBTYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkN2dENvZGUgQ29kZSkgeworICAvLyBJZiB0aGUgc3JjIGFuZCBkZXN0IHR5cGVzIGFyZSB0aGUgc2FtZSBhbmQgdGhlIGNvbnZlcnNpb24gaXMgYmV0d2VlbgorICAvLyBpbnRlZ2VyIHR5cGVzIG9mIHRoZSBzYW1lIHNpZ24gb3IgdHdvIGZsb2F0cywgbm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkuCisgIGlmIChEVHkgPT0gU1R5ICYmCisgICAgICAoQ29kZSA9PSBJU0Q6OkNWVF9VVSB8fCBDb2RlID09IElTRDo6Q1ZUX1NTIHx8IENvZGUgPT0gSVNEOjpDVlRfRkYpKQorICAgIHJldHVybiBWYWw7CisKKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgVmFsLCBEVHksIFNUeSwgUm5kLCBTYXQgfTsKKyAgQWRkTm9kZUlETm9kZShJRCwgSVNEOjpDT05WRVJUX1JORFNBVCwgZ2V0VlRMaXN0KFZUKSwgJk9wc1swXSwgNSk7CisgIHZvaWQqIElQID0gMDsKKyAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpCisgICAgcmV0dXJuIFNEVmFsdWUoRSwgMCk7CisKKyAgQ3Z0Um5kU2F0U0ROb2RlICpOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBDdnRSbmRTYXRTRE5vZGUoVlQsIGRsLCBPcHMsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGUpOworICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIEFsbE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRSZWdpc3Rlcih1bnNpZ25lZCBSZWdObywgRVZUIFZUKSB7CisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIEFkZE5vZGVJRE5vZGUoSUQsIElTRDo6UmVnaXN0ZXIsIGdldFZUTGlzdChWVCksIDAsIDApOworICBJRC5BZGRJbnRlZ2VyKFJlZ05vKTsKKyAgdm9pZCAqSVAgPSAwOworICBpZiAoU0ROb2RlICpFID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkKKyAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKworICBTRE5vZGUgKk4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIFJlZ2lzdGVyU0ROb2RlKFJlZ05vLCBWVCk7CisgIENTRU1hcC5JbnNlcnROb2RlKE4sIElQKTsKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldEJsb2NrQWRkcmVzcyhjb25zdCBCbG9ja0FkZHJlc3MgKkJBLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MpIHsKKyAgdW5zaWduZWQgT3BjID0gaXNUYXJnZXQgPyBJU0Q6OlRhcmdldEJsb2NrQWRkcmVzcyA6IElTRDo6QmxvY2tBZGRyZXNzOworCisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIEFkZE5vZGVJRE5vZGUoSUQsIE9wYywgZ2V0VlRMaXN0KFZUKSwgMCwgMCk7CisgIElELkFkZFBvaW50ZXIoQkEpOworICBJRC5BZGRJbnRlZ2VyKFRhcmdldEZsYWdzKTsKKyAgdm9pZCAqSVAgPSAwOworICBpZiAoU0ROb2RlICpFID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkKKyAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKworICBTRE5vZGUgKk4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIEJsb2NrQWRkcmVzc1NETm9kZShPcGMsIFZULCBCQSwgVGFyZ2V0RmxhZ3MpOworICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIEFsbE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRTcmNWYWx1ZShjb25zdCBWYWx1ZSAqVikgeworICBhc3NlcnQoKCFWIHx8IFYtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgICJTcmNWYWx1ZSBpcyBub3QgYSBwb2ludGVyPyIpOworCisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIEFkZE5vZGVJRE5vZGUoSUQsIElTRDo6U1JDVkFMVUUsIGdldFZUTGlzdChNVlQ6Ok90aGVyKSwgMCwgMCk7CisgIElELkFkZFBvaW50ZXIoVik7CisKKyAgdm9pZCAqSVAgPSAwOworICBpZiAoU0ROb2RlICpFID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkKKyAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKworICBTRE5vZGUgKk4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIFNyY1ZhbHVlU0ROb2RlKFYpOworICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIEFsbE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7Cit9CisKKy8vLyBnZXRNRE5vZGUgLSBSZXR1cm4gYW4gTUROb2RlU0ROb2RlIHdoaWNoIGhvbGRzIGFuIE1ETm9kZS4KK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRNRE5vZGUoY29uc3QgTUROb2RlICpNRCkgeworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBZGROb2RlSUROb2RlKElELCBJU0Q6Ok1ETk9ERV9TRE5PREUsIGdldFZUTGlzdChNVlQ6Ok90aGVyKSwgMCwgMCk7CisgIElELkFkZFBvaW50ZXIoTUQpOworICAKKyAgdm9pZCAqSVAgPSAwOworICBpZiAoU0ROb2RlICpFID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkKKyAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKyAgCisgIFNETm9kZSAqTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgTUROb2RlU0ROb2RlKE1EKTsKKyAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCisKKy8vLyBnZXRTaGlmdEFtb3VudE9wZXJhbmQgLSBSZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBjYXN0ZWQgdG8KKy8vLyB0aGUgdGFyZ2V0J3MgZGVzaXJlZCBzaGlmdCBhbW91bnQgdHlwZS4KK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRTaGlmdEFtb3VudE9wZXJhbmQoU0RWYWx1ZSBPcCkgeworICBFVlQgT3BUeSA9IE9wLmdldFZhbHVlVHlwZSgpOworICBNVlQgU2hUeSA9IFRMSS5nZXRTaGlmdEFtb3VudFR5KCk7CisgIGlmIChPcFR5ID09IFNoVHkgfHwgT3BUeS5pc1ZlY3RvcigpKSByZXR1cm4gT3A7CisKKyAgSVNEOjpOb2RlVHlwZSBPcGNvZGUgPSBPcFR5LmJpdHNHVChTaFR5KSA/ICBJU0Q6OlRSVU5DQVRFIDogSVNEOjpaRVJPX0VYVEVORDsKKyAgcmV0dXJuIGdldE5vZGUoT3Bjb2RlLCBPcC5nZXREZWJ1Z0xvYygpLCBTaFR5LCBPcCk7Cit9CisKKy8vLyBDcmVhdGVTdGFja1RlbXBvcmFyeSAtIENyZWF0ZSBhIHN0YWNrIHRlbXBvcmFyeSwgc3VpdGFibGUgZm9yIGhvbGRpbmcgdGhlCisvLy8gc3BlY2lmaWVkIHZhbHVlIHR5cGUuCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Q3JlYXRlU3RhY2tUZW1wb3JhcnkoRVZUIFZULCB1bnNpZ25lZCBtaW5BbGlnbikgeworICBNYWNoaW5lRnJhbWVJbmZvICpGcmFtZUluZm8gPSBnZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRGcmFtZUluZm8oKTsKKyAgdW5zaWduZWQgQnl0ZVNpemUgPSBWVC5nZXRTdG9yZVNpemUoKTsKKyAgY29uc3QgVHlwZSAqVHkgPSBWVC5nZXRUeXBlRm9yRVZUKCpnZXRDb250ZXh0KCkpOworICB1bnNpZ25lZCBTdGFja0FsaWduID0KKyAgc3RkOjptYXgoKHVuc2lnbmVkKVRMSS5nZXRUYXJnZXREYXRhKCktPmdldFByZWZUeXBlQWxpZ25tZW50KFR5KSwgbWluQWxpZ24pOworCisgIGludCBGcmFtZUlkeCA9IEZyYW1lSW5mby0+Q3JlYXRlU3RhY2tPYmplY3QoQnl0ZVNpemUsIFN0YWNrQWxpZ24sIGZhbHNlKTsKKyAgcmV0dXJuIGdldEZyYW1lSW5kZXgoRnJhbWVJZHgsIFRMSS5nZXRQb2ludGVyVHkoKSk7Cit9CisKKy8vLyBDcmVhdGVTdGFja1RlbXBvcmFyeSAtIENyZWF0ZSBhIHN0YWNrIHRlbXBvcmFyeSBzdWl0YWJsZSBmb3IgaG9sZGluZworLy8vIGVpdGhlciBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGVzLgorU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OkNyZWF0ZVN0YWNrVGVtcG9yYXJ5KEVWVCBWVDEsIEVWVCBWVDIpIHsKKyAgdW5zaWduZWQgQnl0ZXMgPSBzdGQ6Om1heChWVDEuZ2V0U3RvcmVTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlQyLmdldFN0b3JlU2l6ZUluQml0cygpKS84OworICBjb25zdCBUeXBlICpUeTEgPSBWVDEuZ2V0VHlwZUZvckVWVCgqZ2V0Q29udGV4dCgpKTsKKyAgY29uc3QgVHlwZSAqVHkyID0gVlQyLmdldFR5cGVGb3JFVlQoKmdldENvbnRleHQoKSk7CisgIGNvbnN0IFRhcmdldERhdGEgKlREID0gVExJLmdldFRhcmdldERhdGEoKTsKKyAgdW5zaWduZWQgQWxpZ24gPSBzdGQ6Om1heChURC0+Z2V0UHJlZlR5cGVBbGlnbm1lbnQoVHkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBURC0+Z2V0UHJlZlR5cGVBbGlnbm1lbnQoVHkyKSk7CisKKyAgTWFjaGluZUZyYW1lSW5mbyAqRnJhbWVJbmZvID0gZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnJhbWVJbmZvKCk7CisgIGludCBGcmFtZUlkeCA9IEZyYW1lSW5mby0+Q3JlYXRlU3RhY2tPYmplY3QoQnl0ZXMsIEFsaWduLCBmYWxzZSk7CisgIHJldHVybiBnZXRGcmFtZUluZGV4KEZyYW1lSWR4LCBUTEkuZ2V0UG9pbnRlclR5KCkpOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Rm9sZFNldENDKEVWVCBWVCwgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMiwgSVNEOjpDb25kQ29kZSBDb25kLCBEZWJ1Z0xvYyBkbCkgeworICAvLyBUaGVzZSBzZXRjYyBvcGVyYXRpb25zIGFsd2F5cyBmb2xkLgorICBzd2l0Y2ggKENvbmQpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRGQUxTRToKKyAgY2FzZSBJU0Q6OlNFVEZBTFNFMjogcmV0dXJuIGdldENvbnN0YW50KDAsIFZUKTsKKyAgY2FzZSBJU0Q6OlNFVFRSVUU6CisgIGNhc2UgSVNEOjpTRVRUUlVFMjogIHJldHVybiBnZXRDb25zdGFudCgxLCBWVCk7CisKKyAgY2FzZSBJU0Q6OlNFVE9FUToKKyAgY2FzZSBJU0Q6OlNFVE9HVDoKKyAgY2FzZSBJU0Q6OlNFVE9HRToKKyAgY2FzZSBJU0Q6OlNFVE9MVDoKKyAgY2FzZSBJU0Q6OlNFVE9MRToKKyAgY2FzZSBJU0Q6OlNFVE9ORToKKyAgY2FzZSBJU0Q6OlNFVE86CisgIGNhc2UgSVNEOjpTRVRVTzoKKyAgY2FzZSBJU0Q6OlNFVFVFUToKKyAgY2FzZSBJU0Q6OlNFVFVORToKKyAgICBhc3NlcnQoIU4xLmdldFZhbHVlVHlwZSgpLmlzSW50ZWdlcigpICYmICJJbGxlZ2FsIHNldGNjIGZvciBpbnRlZ2VyISIpOworICAgIGJyZWFrOworICB9CisKKyAgaWYgKENvbnN0YW50U0ROb2RlICpOMkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjIuZ2V0Tm9kZSgpKSkgeworICAgIGNvbnN0IEFQSW50ICZDMiA9IE4yQy0+Z2V0QVBJbnRWYWx1ZSgpOworICAgIGlmIChDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xLmdldE5vZGUoKSkpIHsKKyAgICAgIGNvbnN0IEFQSW50ICZDMSA9IE4xQy0+Z2V0QVBJbnRWYWx1ZSgpOworCisgICAgICBzd2l0Y2ggKENvbmQpIHsKKyAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW50ZWdlciBzZXRjYyEiKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRFUTogIHJldHVybiBnZXRDb25zdGFudChDMSA9PSBDMiwgVlQpOworICAgICAgY2FzZSBJU0Q6OlNFVE5FOiAgcmV0dXJuIGdldENvbnN0YW50KEMxICE9IEMyLCBWVCk7CisgICAgICBjYXNlIElTRDo6U0VUVUxUOiByZXR1cm4gZ2V0Q29uc3RhbnQoQzEudWx0KEMyKSwgVlQpOworICAgICAgY2FzZSBJU0Q6OlNFVFVHVDogcmV0dXJuIGdldENvbnN0YW50KEMxLnVndChDMiksIFZUKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRVTEU6IHJldHVybiBnZXRDb25zdGFudChDMS51bGUoQzIpLCBWVCk7CisgICAgICBjYXNlIElTRDo6U0VUVUdFOiByZXR1cm4gZ2V0Q29uc3RhbnQoQzEudWdlKEMyKSwgVlQpOworICAgICAgY2FzZSBJU0Q6OlNFVExUOiAgcmV0dXJuIGdldENvbnN0YW50KEMxLnNsdChDMiksIFZUKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRHVDogIHJldHVybiBnZXRDb25zdGFudChDMS5zZ3QoQzIpLCBWVCk7CisgICAgICBjYXNlIElTRDo6U0VUTEU6ICByZXR1cm4gZ2V0Q29uc3RhbnQoQzEuc2xlKEMyKSwgVlQpOworICAgICAgY2FzZSBJU0Q6OlNFVEdFOiAgcmV0dXJuIGdldENvbnN0YW50KEMxLnNnZShDMiksIFZUKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKENvbnN0YW50RlBTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4xLmdldE5vZGUoKSkpIHsKKyAgICBpZiAoQ29uc3RhbnRGUFNETm9kZSAqTjJDID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjIuZ2V0Tm9kZSgpKSkgeworICAgICAgLy8gTm8gY29tcGlsZSB0aW1lIG9wZXJhdGlvbnMgb24gdGhpcyB0eXBlIHlldC4KKyAgICAgIGlmIChOMUMtPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OnBwY2YxMjgpCisgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICAgIEFQRmxvYXQ6OmNtcFJlc3VsdCBSID0gTjFDLT5nZXRWYWx1ZUFQRigpLmNvbXBhcmUoTjJDLT5nZXRWYWx1ZUFQRigpKTsKKyAgICAgIHN3aXRjaCAoQ29uZCkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlIElTRDo6U0VURVE6ICBpZiAoUj09QVBGbG9hdDo6Y21wVW5vcmRlcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VU5ERUYoVlQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICBjYXNlIElTRDo6U0VUT0VROiByZXR1cm4gZ2V0Q29uc3RhbnQoUj09QVBGbG9hdDo6Y21wRXF1YWwsIFZUKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRORTogIGlmIChSPT1BUEZsb2F0OjpjbXBVbm9yZGVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRVTkRFRihWVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgIGNhc2UgSVNEOjpTRVRPTkU6IHJldHVybiBnZXRDb25zdGFudChSPT1BUEZsb2F0OjpjbXBHcmVhdGVyVGhhbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFI9PUFQRmxvYXQ6OmNtcExlc3NUaGFuLCBWVCk7CisgICAgICBjYXNlIElTRDo6U0VUTFQ6ICBpZiAoUj09QVBGbG9hdDo6Y21wVW5vcmRlcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VU5ERUYoVlQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICBjYXNlIElTRDo6U0VUT0xUOiByZXR1cm4gZ2V0Q29uc3RhbnQoUj09QVBGbG9hdDo6Y21wTGVzc1RoYW4sIFZUKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRHVDogIGlmIChSPT1BUEZsb2F0OjpjbXBVbm9yZGVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRVTkRFRihWVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgIGNhc2UgSVNEOjpTRVRPR1Q6IHJldHVybiBnZXRDb25zdGFudChSPT1BUEZsb2F0OjpjbXBHcmVhdGVyVGhhbiwgVlQpOworICAgICAgY2FzZSBJU0Q6OlNFVExFOiAgaWYgKFI9PUFQRmxvYXQ6OmNtcFVub3JkZXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVOREVGKFZUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgY2FzZSBJU0Q6OlNFVE9MRTogcmV0dXJuIGdldENvbnN0YW50KFI9PUFQRmxvYXQ6OmNtcExlc3NUaGFuIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUj09QVBGbG9hdDo6Y21wRXF1YWwsIFZUKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRHRTogIGlmIChSPT1BUEZsb2F0OjpjbXBVbm9yZGVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRVTkRFRihWVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgIGNhc2UgSVNEOjpTRVRPR0U6IHJldHVybiBnZXRDb25zdGFudChSPT1BUEZsb2F0OjpjbXBHcmVhdGVyVGhhbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFI9PUFQRmxvYXQ6OmNtcEVxdWFsLCBWVCk7CisgICAgICBjYXNlIElTRDo6U0VUTzogICByZXR1cm4gZ2V0Q29uc3RhbnQoUiE9QVBGbG9hdDo6Y21wVW5vcmRlcmVkLCBWVCk7CisgICAgICBjYXNlIElTRDo6U0VUVU86ICByZXR1cm4gZ2V0Q29uc3RhbnQoUj09QVBGbG9hdDo6Y21wVW5vcmRlcmVkLCBWVCk7CisgICAgICBjYXNlIElTRDo6U0VUVUVROiByZXR1cm4gZ2V0Q29uc3RhbnQoUj09QVBGbG9hdDo6Y21wVW5vcmRlcmVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUj09QVBGbG9hdDo6Y21wRXF1YWwsIFZUKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRVTkU6IHJldHVybiBnZXRDb25zdGFudChSIT1BUEZsb2F0OjpjbXBFcXVhbCwgVlQpOworICAgICAgY2FzZSBJU0Q6OlNFVFVMVDogcmV0dXJuIGdldENvbnN0YW50KFI9PUFQRmxvYXQ6OmNtcFVub3JkZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFI9PUFQRmxvYXQ6OmNtcExlc3NUaGFuLCBWVCk7CisgICAgICBjYXNlIElTRDo6U0VUVUdUOiByZXR1cm4gZ2V0Q29uc3RhbnQoUj09QVBGbG9hdDo6Y21wR3JlYXRlclRoYW4gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSPT1BUEZsb2F0OjpjbXBVbm9yZGVyZWQsIFZUKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRVTEU6IHJldHVybiBnZXRDb25zdGFudChSIT1BUEZsb2F0OjpjbXBHcmVhdGVyVGhhbiwgVlQpOworICAgICAgY2FzZSBJU0Q6OlNFVFVHRTogcmV0dXJuIGdldENvbnN0YW50KFIhPUFQRmxvYXQ6OmNtcExlc3NUaGFuLCBWVCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjb25zdGFudCBvY2N1cnMgb24gdGhlIFJIUy4KKyAgICAgIHJldHVybiBnZXRTZXRDQyhkbCwgVlQsIE4yLCBOMSwgSVNEOjpnZXRTZXRDQ1N3YXBwZWRPcGVyYW5kcyhDb25kKSk7CisgICAgfQorICB9CisKKyAgLy8gQ291bGQgbm90IGZvbGQgaXQuCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBTaWduQml0SXNaZXJvIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNpZ24gYml0IG9mIE9wIGlzIGtub3duIHRvIGJlIHplcm8uICBXZQorLy8vIHVzZSB0aGlzIHByZWRpY2F0ZSB0byBzaW1wbGlmeSBvcGVyYXRpb25zIGRvd25zdHJlYW0uCitib29sIFNlbGVjdGlvbkRBRzo6U2lnbkJpdElzWmVybyhTRFZhbHVlIE9wLCB1bnNpZ25lZCBEZXB0aCkgY29uc3QgeworICAvLyBUaGlzIHByZWRpY2F0ZSBpcyBub3Qgc2FmZSBmb3IgdmVjdG9yIG9wZXJhdGlvbnMuCisgIGlmIChPcC5nZXRWYWx1ZVR5cGUoKS5pc1ZlY3RvcigpKQorICAgIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCBCaXRXaWR0aCA9IE9wLmdldFZhbHVlVHlwZSgpLmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIHJldHVybiBNYXNrZWRWYWx1ZUlzWmVybyhPcCwgQVBJbnQ6OmdldFNpZ25CaXQoQml0V2lkdGgpLCBEZXB0aCk7Cit9CisKKy8vLyBNYXNrZWRWYWx1ZUlzWmVybyAtIFJldHVybiB0cnVlIGlmICdWICYgTWFzaycgaXMga25vd24gdG8gYmUgemVyby4gIFdlIHVzZQorLy8vIHRoaXMgcHJlZGljYXRlIHRvIHNpbXBsaWZ5IG9wZXJhdGlvbnMgZG93bnN0cmVhbS4gIE1hc2sgaXMga25vd24gdG8gYmUgemVybworLy8vIGZvciBiaXRzIHRoYXQgViBjYW5ub3QgaGF2ZS4KK2Jvb2wgU2VsZWN0aW9uREFHOjpNYXNrZWRWYWx1ZUlzWmVybyhTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCkgY29uc3QgeworICBBUEludCBLbm93blplcm8sIEtub3duT25lOworICBDb21wdXRlTWFza2VkQml0cyhPcCwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSwgRGVwdGgpOworICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKyAgcmV0dXJuIChLbm93blplcm8gJiBNYXNrKSA9PSBNYXNrOworfQorCisvLy8gQ29tcHV0ZU1hc2tlZEJpdHMgLSBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGJpdHMgc3BlY2lmaWVkIGluIE1hc2sgYXJlCisvLy8ga25vd24gdG8gYmUgZWl0aGVyIHplcm8gb3Igb25lIGFuZCByZXR1cm4gdGhlbSBpbiB0aGUgS25vd25aZXJvL0tub3duT25lCisvLy8gYml0c2V0cy4gIFRoaXMgY29kZSBvbmx5IGFuYWx5emVzIGJpdHMgaW4gTWFzaywgaW4gb3JkZXIgdG8gc2hvcnQtY2lyY3VpdAorLy8vIHByb2Nlc3NpbmcuCit2b2lkIFNlbGVjdGlvbkRBRzo6Q29tcHV0ZU1hc2tlZEJpdHMoU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duWmVybywgQVBJbnQgJktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSBjb25zdCB7CisgIHVuc2lnbmVkIEJpdFdpZHRoID0gTWFzay5nZXRCaXRXaWR0aCgpOworICBhc3NlcnQoQml0V2lkdGggPT0gT3AuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSAmJgorICAgICAgICAgIk1hc2sgc2l6ZSBtaXNtYXRjaGVzIHZhbHVlIHR5cGUgc2l6ZSEiKTsKKworICBLbm93blplcm8gPSBLbm93bk9uZSA9IEFQSW50KEJpdFdpZHRoLCAwKTsgICAvLyBEb24ndCBrbm93IGFueXRoaW5nLgorICBpZiAoRGVwdGggPT0gNiB8fCBNYXNrID09IDApCisgICAgcmV0dXJuOyAgLy8gTGltaXQgc2VhcmNoIGRlcHRoLgorCisgIEFQSW50IEtub3duWmVybzIsIEtub3duT25lMjsKKworICBzd2l0Y2ggKE9wLmdldE9wY29kZSgpKSB7CisgIGNhc2UgSVNEOjpDb25zdGFudDoKKyAgICAvLyBXZSBrbm93IGFsbCBvZiB0aGUgYml0cyBmb3IgYSBjb25zdGFudCEKKyAgICBLbm93bk9uZSA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wKS0+Z2V0QVBJbnRWYWx1ZSgpICYgTWFzazsKKyAgICBLbm93blplcm8gPSB+S25vd25PbmUgJiBNYXNrOworICAgIHJldHVybjsKKyAgY2FzZSBJU0Q6OkFORDoKKyAgICAvLyBJZiBlaXRoZXIgdGhlIExIUyBvciB0aGUgUkhTIGFyZSBaZXJvLCB0aGUgcmVzdWx0IGlzIHplcm8uCisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgxKSwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSwgRGVwdGgrMSk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgTWFzayAmIH5Lbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvMiwgS25vd25PbmUyLCBEZXB0aCsxKTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKyAgICBhc3NlcnQoKEtub3duWmVybzIgJiBLbm93bk9uZTIpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOworCisgICAgLy8gT3V0cHV0IGtub3duLTEgYml0cyBhcmUgb25seSBrbm93biBpZiBzZXQgaW4gYm90aCB0aGUgTEhTICYgUkhTLgorICAgIEtub3duT25lICY9IEtub3duT25lMjsKKyAgICAvLyBPdXRwdXQga25vd24tMCBhcmUga25vd24gdG8gYmUgY2xlYXIgaWYgemVybyBpbiBlaXRoZXIgdGhlIExIUyB8IFJIUy4KKyAgICBLbm93blplcm8gfD0gS25vd25aZXJvMjsKKyAgICByZXR1cm47CisgIGNhc2UgSVNEOjpPUjoKKyAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDEpLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBNYXNrICYgfktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybzIsIEtub3duT25lMiwgRGVwdGgrMSk7CisgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7CisgICAgYXNzZXJ0KChLbm93blplcm8yICYgS25vd25PbmUyKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKworICAgIC8vIE91dHB1dCBrbm93bi0wIGJpdHMgYXJlIG9ubHkga25vd24gaWYgY2xlYXIgaW4gYm90aCB0aGUgTEhTICYgUkhTLgorICAgIEtub3duWmVybyAmPSBLbm93blplcm8yOworICAgIC8vIE91dHB1dCBrbm93bi0xIGFyZSBrbm93biB0byBiZSBzZXQgaWYgc2V0IGluIGVpdGhlciB0aGUgTEhTIHwgUkhTLgorICAgIEtub3duT25lIHw9IEtub3duT25lMjsKKyAgICByZXR1cm47CisgIGNhc2UgSVNEOjpYT1I6IHsKKyAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDEpLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBNYXNrLCBLbm93blplcm8yLCBLbm93bk9uZTIsIERlcHRoKzEpOworICAgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOworICAgIGFzc2VydCgoS25vd25aZXJvMiAmIEtub3duT25lMikgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7CisKKyAgICAvLyBPdXRwdXQga25vd24tMCBiaXRzIGFyZSBrbm93biBpZiBjbGVhciBvciBzZXQgaW4gYm90aCB0aGUgTEhTICYgUkhTLgorICAgIEFQSW50IEtub3duWmVyb091dCA9IChLbm93blplcm8gJiBLbm93blplcm8yKSB8IChLbm93bk9uZSAmIEtub3duT25lMik7CisgICAgLy8gT3V0cHV0IGtub3duLTEgYXJlIGtub3duIHRvIGJlIHNldCBpZiBzZXQgaW4gb25seSBvbmUgb2YgdGhlIExIUywgUkhTLgorICAgIEtub3duT25lID0gKEtub3duWmVybyAmIEtub3duT25lMikgfCAoS25vd25PbmUgJiBLbm93blplcm8yKTsKKyAgICBLbm93blplcm8gPSBLbm93blplcm9PdXQ7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSVNEOjpNVUw6IHsKKyAgICBBUEludCBNYXNrMiA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpOworICAgIENvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMSksIE1hc2syLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBNYXNrMiwgS25vd25aZXJvMiwgS25vd25PbmUyLCBEZXB0aCsxKTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKyAgICBhc3NlcnQoKEtub3duWmVybzIgJiBLbm93bk9uZTIpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOworCisgICAgLy8gSWYgbG93IGJpdHMgYXJlIHplcm8gaW4gZWl0aGVyIG9wZXJhbmQsIG91dHB1dCBsb3cga25vd24tMCBiaXRzLgorICAgIC8vIEFsc28gY29tcHV0ZSBhIGNvbnNlcmF0aXZlIGVzdGltYXRlIGZvciBoaWdoIGtub3duLTAgYml0cy4KKyAgICAvLyBNb3JlIHRyaWNraW5lc3MgaXMgcG9zc2libGUsIGJ1dCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIHRoZQorICAgIC8vIGludGVyZXN0aW5nIGNhc2Ugb2YgYWxpZ25tZW50IGNvbXB1dGF0aW9uLgorICAgIEtub3duT25lLmNsZWFyKCk7CisgICAgdW5zaWduZWQgVHJhaWxaID0gS25vd25aZXJvLmNvdW50VHJhaWxpbmdPbmVzKCkgKworICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybzIuY291bnRUcmFpbGluZ09uZXMoKTsKKyAgICB1bnNpZ25lZCBMZWFkWiA9ICBzdGQ6Om1heChLbm93blplcm8uY291bnRMZWFkaW5nT25lcygpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8yLmNvdW50TGVhZGluZ09uZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRXaWR0aCkgLSBCaXRXaWR0aDsKKworICAgIFRyYWlsWiA9IHN0ZDo6bWluKFRyYWlsWiwgQml0V2lkdGgpOworICAgIExlYWRaID0gc3RkOjptaW4oTGVhZFosIEJpdFdpZHRoKTsKKyAgICBLbm93blplcm8gPSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwgVHJhaWxaKSB8CisgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBMZWFkWik7CisgICAgS25vd25aZXJvICY9IE1hc2s7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSVNEOjpVRElWOiB7CisgICAgLy8gRm9yIHRoZSBwdXJwb3NlcyBvZiBjb21wdXRpbmcgbGVhZGluZyB6ZXJvcyB3ZSBjYW4gY29uc2VydmF0aXZlbHkKKyAgICAvLyB0cmVhdCBhIHVkaXYgYXMgYSBsb2dpY2FsIHJpZ2h0IHNoaWZ0IGJ5IHRoZSBwb3dlciBvZiAyIGtub3duIHRvCisgICAgLy8gYmUgbGVzcyB0aGFuIHRoZSBkZW5vbWluYXRvci4KKyAgICBBUEludCBBbGxPbmVzID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShCaXRXaWR0aCk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICBBbGxPbmVzLCBLbm93blplcm8yLCBLbm93bk9uZTIsIERlcHRoKzEpOworICAgIHVuc2lnbmVkIExlYWRaID0gS25vd25aZXJvMi5jb3VudExlYWRpbmdPbmVzKCk7CisKKyAgICBLbm93bk9uZTIuY2xlYXIoKTsKKyAgICBLbm93blplcm8yLmNsZWFyKCk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICBBbGxPbmVzLCBLbm93blplcm8yLCBLbm93bk9uZTIsIERlcHRoKzEpOworICAgIHVuc2lnbmVkIFJIU1Vua25vd25MZWFkaW5nT25lcyA9IEtub3duT25lMi5jb3VudExlYWRpbmdaZXJvcygpOworICAgIGlmIChSSFNVbmtub3duTGVhZGluZ09uZXMgIT0gQml0V2lkdGgpCisgICAgICBMZWFkWiA9IHN0ZDo6bWluKEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBMZWFkWiArIEJpdFdpZHRoIC0gUkhTVW5rbm93bkxlYWRpbmdPbmVzIC0gMSk7CisKKyAgICBLbm93blplcm8gPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIExlYWRaKSAmIE1hc2s7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSVNEOjpTRUxFQ1Q6CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgyKSwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSwgRGVwdGgrMSk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgxKSwgTWFzaywgS25vd25aZXJvMiwgS25vd25PbmUyLCBEZXB0aCsxKTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKyAgICBhc3NlcnQoKEtub3duWmVybzIgJiBLbm93bk9uZTIpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOworCisgICAgLy8gT25seSBrbm93biBpZiBrbm93biBpbiBib3RoIHRoZSBMSFMgYW5kIFJIUy4KKyAgICBLbm93bk9uZSAmPSBLbm93bk9uZTI7CisgICAgS25vd25aZXJvICY9IEtub3duWmVybzI7CisgICAgcmV0dXJuOworICBjYXNlIElTRDo6U0VMRUNUX0NDOgorICAgIENvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMyksIE1hc2ssIEtub3duWmVybywgS25vd25PbmUsIERlcHRoKzEpOworICAgIENvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMiksIE1hc2ssIEtub3duWmVybzIsIEtub3duT25lMiwgRGVwdGgrMSk7CisgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7CisgICAgYXNzZXJ0KChLbm93blplcm8yICYgS25vd25PbmUyKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKworICAgIC8vIE9ubHkga25vd24gaWYga25vd24gaW4gYm90aCB0aGUgTEhTIGFuZCBSSFMuCisgICAgS25vd25PbmUgJj0gS25vd25PbmUyOworICAgIEtub3duWmVybyAmPSBLbm93blplcm8yOworICAgIHJldHVybjsKKyAgY2FzZSBJU0Q6OlNBRERPOgorICBjYXNlIElTRDo6VUFERE86CisgIGNhc2UgSVNEOjpTU1VCTzoKKyAgY2FzZSBJU0Q6OlVTVUJPOgorICBjYXNlIElTRDo6U01VTE86CisgIGNhc2UgSVNEOjpVTVVMTzoKKyAgICBpZiAoT3AuZ2V0UmVzTm8oKSAhPSAxKQorICAgICAgcmV0dXJuOworICAgIC8vIFRoZSBib29sZWFuIHJlc3VsdCBjb25mb3JtcyB0byBnZXRCb29sZWFuQ29udGVudHMuICBGYWxsIHRocm91Z2guCisgIGNhc2UgSVNEOjpTRVRDQzoKKyAgICAvLyBJZiB3ZSBrbm93IHRoZSByZXN1bHQgb2YgYSBzZXRjYyBoYXMgdGhlIHRvcCBiaXRzIHplcm8sIHVzZSB0aGlzIGluZm8uCisgICAgaWYgKFRMSS5nZXRCb29sZWFuQ29udGVudHMoKSA9PSBUYXJnZXRMb3dlcmluZzo6WmVyb09yT25lQm9vbGVhbkNvbnRlbnQgJiYKKyAgICAgICAgQml0V2lkdGggPiAxKQorICAgICAgS25vd25aZXJvIHw9IEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgQml0V2lkdGggLSAxKTsKKyAgICByZXR1cm47CisgIGNhc2UgSVNEOjpTSEw6CisgICAgLy8gKHNobCBYLCBDMSkgJiBDMiA9PSAwICAgaWZmICAgKFggJiBDMiA+PnUgQzEpID09IDAKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlNBID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICB1bnNpZ25lZCBTaEFtdCA9IFNBLT5nZXRaRXh0VmFsdWUoKTsKKworICAgICAgLy8gSWYgdGhlIHNoaWZ0IGNvdW50IGlzIGFuIGludmFsaWQgaW1tZWRpYXRlLCBkb24ndCBkbyBhbnl0aGluZy4KKyAgICAgIGlmIChTaEFtdCA+PSBCaXRXaWR0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBNYXNrLmxzaHIoU2hBbXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvLCBLbm93bk9uZSwgRGVwdGgrMSk7CisgICAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKyAgICAgIEtub3duWmVybyA8PD0gU2hBbXQ7CisgICAgICBLbm93bk9uZSAgPDw9IFNoQW10OworICAgICAgLy8gbG93IGJpdHMga25vd24gemVyby4KKyAgICAgIEtub3duWmVybyB8PSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwgU2hBbXQpOworICAgIH0KKyAgICByZXR1cm47CisgIGNhc2UgSVNEOjpTUkw6CisgICAgLy8gKHVzaHIgWCwgQzEpICYgQzIgPT0gMCAgIGlmZiAgKC0xID4+IEMxKSAmIEMyID09IDAKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlNBID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICB1bnNpZ25lZCBTaEFtdCA9IFNBLT5nZXRaRXh0VmFsdWUoKTsKKworICAgICAgLy8gSWYgdGhlIHNoaWZ0IGNvdW50IGlzIGFuIGludmFsaWQgaW1tZWRpYXRlLCBkb24ndCBkbyBhbnl0aGluZy4KKyAgICAgIGlmIChTaEFtdCA+PSBCaXRXaWR0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDApLCAoTWFzayA8PCBTaEFtdCksCisgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKTsKKyAgICAgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOworICAgICAgS25vd25aZXJvID0gS25vd25aZXJvLmxzaHIoU2hBbXQpOworICAgICAgS25vd25PbmUgID0gS25vd25PbmUubHNocihTaEFtdCk7CisKKyAgICAgIEFQSW50IEhpZ2hCaXRzID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBTaEFtdCkgJiBNYXNrOworICAgICAgS25vd25aZXJvIHw9IEhpZ2hCaXRzOyAgLy8gSGlnaCBiaXRzIGtub3duIHplcm8uCisgICAgfQorICAgIHJldHVybjsKKyAgY2FzZSBJU0Q6OlNSQToKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlNBID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICB1bnNpZ25lZCBTaEFtdCA9IFNBLT5nZXRaRXh0VmFsdWUoKTsKKworICAgICAgLy8gSWYgdGhlIHNoaWZ0IGNvdW50IGlzIGFuIGludmFsaWQgaW1tZWRpYXRlLCBkb24ndCBkbyBhbnl0aGluZy4KKyAgICAgIGlmIChTaEFtdCA+PSBCaXRXaWR0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBBUEludCBJbkRlbWFuZGVkTWFzayA9IChNYXNrIDw8IFNoQW10KTsKKyAgICAgIC8vIElmIGFueSBvZiB0aGUgZGVtYW5kZWQgYml0cyBhcmUgcHJvZHVjZWQgYnkgdGhlIHNpZ24gZXh0ZW5zaW9uLCB3ZSBhbHNvCisgICAgICAvLyBkZW1hbmQgdGhlIGlucHV0IHNpZ24gYml0LgorICAgICAgQVBJbnQgSGlnaEJpdHMgPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIFNoQW10KSAmIE1hc2s7CisgICAgICBpZiAoSGlnaEJpdHMuZ2V0Qm9vbFZhbHVlKCkpCisgICAgICAgIEluRGVtYW5kZWRNYXNrIHw9IEFQSW50OjpnZXRTaWduQml0KEJpdFdpZHRoKTsKKworICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgSW5EZW1hbmRlZE1hc2ssIEtub3duWmVybywgS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBEZXB0aCsxKTsKKyAgICAgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOworICAgICAgS25vd25aZXJvID0gS25vd25aZXJvLmxzaHIoU2hBbXQpOworICAgICAgS25vd25PbmUgID0gS25vd25PbmUubHNocihTaEFtdCk7CisKKyAgICAgIC8vIEhhbmRsZSB0aGUgc2lnbiBiaXRzLgorICAgICAgQVBJbnQgU2lnbkJpdCA9IEFQSW50OjpnZXRTaWduQml0KEJpdFdpZHRoKTsKKyAgICAgIFNpZ25CaXQgPSBTaWduQml0LmxzaHIoU2hBbXQpOyAgLy8gQWRqdXN0IHRvIHdoZXJlIGl0IGlzIG5vdyBpbiB0aGUgbWFzay4KKworICAgICAgaWYgKEtub3duWmVyby5pbnRlcnNlY3RzKFNpZ25CaXQpKSB7CisgICAgICAgIEtub3duWmVybyB8PSBIaWdoQml0czsgIC8vIE5ldyBiaXRzIGFyZSBrbm93biB6ZXJvLgorICAgICAgfSBlbHNlIGlmIChLbm93bk9uZS5pbnRlcnNlY3RzKFNpZ25CaXQpKSB7CisgICAgICAgIEtub3duT25lICB8PSBIaWdoQml0czsgIC8vIE5ldyBiaXRzIGFyZSBrbm93biBvbmUuCisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EX0lOUkVHOiB7CisgICAgRVZUIEVWVCA9IGNhc3Q8VlRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpLT5nZXRWVCgpOworICAgIHVuc2lnbmVkIEVCaXRzID0gRVZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisKKyAgICAvLyBTaWduIGV4dGVuc2lvbi4gIENvbXB1dGUgdGhlIGRlbWFuZGVkIGJpdHMgaW4gdGhlIHJlc3VsdCB0aGF0IGFyZSBub3QKKyAgICAvLyBwcmVzZW50IGluIHRoZSBpbnB1dC4KKyAgICBBUEludCBOZXdCaXRzID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBCaXRXaWR0aCAtIEVCaXRzKSAmIE1hc2s7CisKKyAgICBBUEludCBJblNpZ25CaXQgPSBBUEludDo6Z2V0U2lnbkJpdChFQml0cyk7CisgICAgQVBJbnQgSW5wdXREZW1hbmRlZEJpdHMgPSBNYXNrICYgQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsIEVCaXRzKTsKKworICAgIC8vIElmIHRoZSBzaWduIGV4dGVuZGVkIGJpdHMgYXJlIGRlbWFuZGVkLCB3ZSBrbm93IHRoYXQgdGhlIHNpZ24KKyAgICAvLyBiaXQgaXMgZGVtYW5kZWQuCisgICAgSW5TaWduQml0LnpleHQoQml0V2lkdGgpOworICAgIGlmIChOZXdCaXRzLmdldEJvb2xWYWx1ZSgpKQorICAgICAgSW5wdXREZW1hbmRlZEJpdHMgfD0gSW5TaWduQml0OworCisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgSW5wdXREZW1hbmRlZEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvLCBLbm93bk9uZSwgRGVwdGgrMSk7CisgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7CisKKyAgICAvLyBJZiB0aGUgc2lnbiBiaXQgb2YgdGhlIGlucHV0IGlzIGtub3duIHNldCBvciBjbGVhciwgdGhlbiB3ZSBrbm93IHRoZQorICAgIC8vIHRvcCBiaXRzIG9mIHRoZSByZXN1bHQuCisgICAgaWYgKEtub3duWmVyby5pbnRlcnNlY3RzKEluU2lnbkJpdCkpIHsgICAgICAgICAvLyBJbnB1dCBzaWduIGJpdCBrbm93biBjbGVhcgorICAgICAgS25vd25aZXJvIHw9IE5ld0JpdHM7CisgICAgICBLbm93bk9uZSAgJj0gfk5ld0JpdHM7CisgICAgfSBlbHNlIGlmIChLbm93bk9uZS5pbnRlcnNlY3RzKEluU2lnbkJpdCkpIHsgICAvLyBJbnB1dCBzaWduIGJpdCBrbm93biBzZXQKKyAgICAgIEtub3duT25lICB8PSBOZXdCaXRzOworICAgICAgS25vd25aZXJvICY9IH5OZXdCaXRzOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5wdXQgc2lnbiBiaXQgdW5rbm93bgorICAgICAgS25vd25aZXJvICY9IH5OZXdCaXRzOworICAgICAgS25vd25PbmUgICY9IH5OZXdCaXRzOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBJU0Q6OkNUVFo6CisgIGNhc2UgSVNEOjpDVExaOgorICBjYXNlIElTRDo6Q1RQT1A6IHsKKyAgICB1bnNpZ25lZCBMb3dCaXRzID0gTG9nMl8zMihCaXRXaWR0aCkrMTsKKyAgICBLbm93blplcm8gPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIEJpdFdpZHRoIC0gTG93Qml0cyk7CisgICAgS25vd25PbmUuY2xlYXIoKTsKKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBJU0Q6OkxPQUQ6IHsKKyAgICBpZiAoSVNEOjppc1pFWFRMb2FkKE9wLmdldE5vZGUoKSkpIHsKKyAgICAgIExvYWRTRE5vZGUgKkxEID0gY2FzdDxMb2FkU0ROb2RlPihPcCk7CisgICAgICBFVlQgVlQgPSBMRC0+Z2V0TWVtb3J5VlQoKTsKKyAgICAgIHVuc2lnbmVkIE1lbUJpdHMgPSBWVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgICAgS25vd25aZXJvIHw9IEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgQml0V2lkdGggLSBNZW1CaXRzKSAmIE1hc2s7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBjYXNlIElTRDo6WkVST19FWFRFTkQ6IHsKKyAgICBFVlQgSW5WVCA9IE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgICAgdW5zaWduZWQgSW5CaXRzID0gSW5WVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgIEFQSW50IE5ld0JpdHMgICA9IEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgQml0V2lkdGggLSBJbkJpdHMpICYgTWFzazsKKyAgICBBUEludCBJbk1hc2sgICAgPSBNYXNrOworICAgIEluTWFzay50cnVuYyhJbkJpdHMpOworICAgIEtub3duWmVyby50cnVuYyhJbkJpdHMpOworICAgIEtub3duT25lLnRydW5jKEluQml0cyk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgSW5NYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKTsKKyAgICBLbm93blplcm8uemV4dChCaXRXaWR0aCk7CisgICAgS25vd25PbmUuemV4dChCaXRXaWR0aCk7CisgICAgS25vd25aZXJvIHw9IE5ld0JpdHM7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORDogeworICAgIEVWVCBJblZUID0gT3AuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICB1bnNpZ25lZCBJbkJpdHMgPSBJblZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgICAgQVBJbnQgSW5TaWduQml0ID0gQVBJbnQ6OmdldFNpZ25CaXQoSW5CaXRzKTsKKyAgICBBUEludCBOZXdCaXRzICAgPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIEJpdFdpZHRoIC0gSW5CaXRzKSAmIE1hc2s7CisgICAgQVBJbnQgSW5NYXNrID0gTWFzazsKKyAgICBJbk1hc2sudHJ1bmMoSW5CaXRzKTsKKworICAgIC8vIElmIGFueSBvZiB0aGUgc2lnbiBleHRlbmRlZCBiaXRzIGFyZSBkZW1hbmRlZCwgd2Uga25vdyB0aGF0IHRoZSBzaWduCisgICAgLy8gYml0IGlzIGRlbWFuZGVkLiBUZW1wb3JhcmlseSBzZXQgdGhpcyBiaXQgaW4gdGhlIG1hc2sgZm9yIG91ciBjYWxsZWUuCisgICAgaWYgKE5ld0JpdHMuZ2V0Qm9vbFZhbHVlKCkpCisgICAgICBJbk1hc2sgfD0gSW5TaWduQml0OworCisgICAgS25vd25aZXJvLnRydW5jKEluQml0cyk7CisgICAgS25vd25PbmUudHJ1bmMoSW5CaXRzKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBJbk1hc2ssIEtub3duWmVybywgS25vd25PbmUsIERlcHRoKzEpOworCisgICAgLy8gTm90ZSBpZiB0aGUgc2lnbiBiaXQgaXMga25vd24gdG8gYmUgemVybyBvciBvbmUuCisgICAgYm9vbCBTaWduQml0S25vd25aZXJvID0gS25vd25aZXJvLmlzTmVnYXRpdmUoKTsKKyAgICBib29sIFNpZ25CaXRLbm93bk9uZSAgPSBLbm93bk9uZS5pc05lZ2F0aXZlKCk7CisgICAgYXNzZXJ0KCEoU2lnbkJpdEtub3duWmVybyAmJiBTaWduQml0S25vd25PbmUpICYmCisgICAgICAgICAgICJTaWduIGJpdCBjYW4ndCBiZSBrbm93biB0byBiZSBib3RoIHplcm8gYW5kIG9uZSEiKTsKKworICAgIC8vIElmIHRoZSBzaWduIGJpdCB3YXNuJ3QgYWN0dWFsbHkgZGVtYW5kZWQgYnkgb3VyIGNhbGxlciwgd2UgZG9uJ3QKKyAgICAvLyB3YW50IGl0IHNldCBpbiB0aGUgS25vd25aZXJvIGFuZCBLbm93bk9uZSByZXN1bHQgdmFsdWVzLiBSZXNldCB0aGUKKyAgICAvLyBtYXNrIGFuZCByZWFwcGx5IGl0IHRvIHRoZSByZXN1bHQgdmFsdWVzLgorICAgIEluTWFzayA9IE1hc2s7CisgICAgSW5NYXNrLnRydW5jKEluQml0cyk7CisgICAgS25vd25aZXJvICY9IEluTWFzazsKKyAgICBLbm93bk9uZSAgJj0gSW5NYXNrOworCisgICAgS25vd25aZXJvLnpleHQoQml0V2lkdGgpOworICAgIEtub3duT25lLnpleHQoQml0V2lkdGgpOworCisgICAgLy8gSWYgdGhlIHNpZ24gYml0IGlzIGtub3duIHplcm8gb3Igb25lLCB0aGUgdG9wIGJpdHMgbWF0Y2guCisgICAgaWYgKFNpZ25CaXRLbm93blplcm8pCisgICAgICBLbm93blplcm8gfD0gTmV3Qml0czsKKyAgICBlbHNlIGlmIChTaWduQml0S25vd25PbmUpCisgICAgICBLbm93bk9uZSAgfD0gTmV3Qml0czsKKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBJU0Q6OkFOWV9FWFRFTkQ6IHsKKyAgICBFVlQgSW5WVCA9IE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgICAgdW5zaWduZWQgSW5CaXRzID0gSW5WVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgIEFQSW50IEluTWFzayA9IE1hc2s7CisgICAgSW5NYXNrLnRydW5jKEluQml0cyk7CisgICAgS25vd25aZXJvLnRydW5jKEluQml0cyk7CisgICAgS25vd25PbmUudHJ1bmMoSW5CaXRzKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBJbk1hc2ssIEtub3duWmVybywgS25vd25PbmUsIERlcHRoKzEpOworICAgIEtub3duWmVyby56ZXh0KEJpdFdpZHRoKTsKKyAgICBLbm93bk9uZS56ZXh0KEJpdFdpZHRoKTsKKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBJU0Q6OlRSVU5DQVRFOiB7CisgICAgRVZUIEluVlQgPSBPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgIHVuc2lnbmVkIEluQml0cyA9IEluVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICBBUEludCBJbk1hc2sgPSBNYXNrOworICAgIEluTWFzay56ZXh0KEluQml0cyk7CisgICAgS25vd25aZXJvLnpleHQoSW5CaXRzKTsKKyAgICBLbm93bk9uZS56ZXh0KEluQml0cyk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgSW5NYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKyAgICBLbm93blplcm8udHJ1bmMoQml0V2lkdGgpOworICAgIEtub3duT25lLnRydW5jKEJpdFdpZHRoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6QXNzZXJ0WmV4dDogeworICAgIEVWVCBWVCA9IGNhc3Q8VlRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpLT5nZXRWVCgpOworICAgIEFQSW50IEluTWFzayA9IEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLCBWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIENvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMCksIE1hc2sgJiBJbk1hc2ssIEtub3duWmVybywKKyAgICAgICAgICAgICAgICAgICAgICBLbm93bk9uZSwgRGVwdGgrMSk7CisgICAgS25vd25aZXJvIHw9ICh+SW5NYXNrKSAmIE1hc2s7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSVNEOjpGR0VUU0lHTjoKKyAgICAvLyBBbGwgYml0cyBhcmUgemVybyBleGNlcHQgdGhlIGxvdyBiaXQuCisgICAgS25vd25aZXJvID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBCaXRXaWR0aCAtIDEpOworICAgIHJldHVybjsKKworICBjYXNlIElTRDo6U1VCOiB7CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpDTEhTID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAvLyBXZSBrbm93IHRoYXQgdGhlIHRvcCBiaXRzIG9mIEMtWCBhcmUgY2xlYXIgaWYgWCBjb250YWlucyBsZXNzIGJpdHMKKyAgICAgIC8vIHRoYW4gQyAoaS5lLiBubyB3cmFwLWFyb3VuZCBjYW4gaGFwcGVuKS4gIEZvciBleGFtcGxlLCAyMC1YIGlzCisgICAgICAvLyBwb3NpdGl2ZSBpZiB3ZSBjYW4gcHJvdmUgdGhhdCBYIGlzID49IDAgYW5kIDwgMTYuCisgICAgICBpZiAoQ0xIUy0+Z2V0QVBJbnRWYWx1ZSgpLmlzTm9uTmVnYXRpdmUoKSkgeworICAgICAgICB1bnNpZ25lZCBOTFogPSAoQ0xIUy0+Z2V0QVBJbnRWYWx1ZSgpKzEpLmNvdW50TGVhZGluZ1plcm9zKCk7CisgICAgICAgIC8vIE5MWiBjYW4ndCBiZSBCaXRXaWR0aCB3aXRoIG5vIHNpZ24gYml0CisgICAgICAgIEFQSW50IE1hc2tWID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBOTForMSk7CisgICAgICAgIENvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMSksIE1hc2tWLCBLbm93blplcm8yLCBLbm93bk9uZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHRoKzEpOworCisgICAgICAgIC8vIElmIGFsbCBvZiB0aGUgTWFza1YgYml0cyBhcmUga25vd24gdG8gYmUgemVybywgdGhlbiB3ZSBrbm93IHRoZQorICAgICAgICAvLyBvdXRwdXQgdG9wIGJpdHMgYXJlIHplcm8sIGJlY2F1c2Ugd2Ugbm93IGtub3cgdGhhdCB0aGUgb3V0cHV0IGlzCisgICAgICAgIC8vIGZyb20gWzAtQ10uCisgICAgICAgIGlmICgoS25vd25aZXJvMiAmIE1hc2tWKSA9PSBNYXNrVikgeworICAgICAgICAgIHVuc2lnbmVkIE5MWjIgPSBDTEhTLT5nZXRBUEludFZhbHVlKCkuY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgICAgICAgICAvLyBUb3AgYml0cyBrbm93biB6ZXJvLgorICAgICAgICAgIEtub3duWmVybyA9IEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgTkxaMikgJiBNYXNrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8vIGZhbGwgdGhyb3VnaAorICBjYXNlIElTRDo6QUREOiB7CisgICAgLy8gT3V0cHV0IGtub3duLTAgYml0cyBhcmUga25vd24gaWYgY2xlYXIgb3Igc2V0IGluIGJvdGggdGhlIGxvdyBjbGVhciBiaXRzCisgICAgLy8gY29tbW9uIHRvIGJvdGggTEhTICYgUkhTLiAgRm9yIGV4YW1wbGUsIDgrKFg8PDMpIGlzIGtub3duIHRvIGhhdmUgdGhlCisgICAgLy8gbG93IDMgYml0cyBjbGVhci4KKyAgICBBUEludCBNYXNrMiA9IEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0V2lkdGggLSBNYXNrLmNvdW50TGVhZGluZ1plcm9zKCkpOworICAgIENvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMCksIE1hc2syLCBLbm93blplcm8yLCBLbm93bk9uZTIsIERlcHRoKzEpOworICAgIGFzc2VydCgoS25vd25aZXJvMiAmIEtub3duT25lMikgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7CisgICAgdW5zaWduZWQgS25vd25aZXJvT3V0ID0gS25vd25aZXJvMi5jb3VudFRyYWlsaW5nT25lcygpOworCisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgxKSwgTWFzazIsIEtub3duWmVybzIsIEtub3duT25lMiwgRGVwdGgrMSk7CisgICAgYXNzZXJ0KChLbm93blplcm8yICYgS25vd25PbmUyKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKyAgICBLbm93blplcm9PdXQgPSBzdGQ6Om1pbihLbm93blplcm9PdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvMi5jb3VudFRyYWlsaW5nT25lcygpKTsKKworICAgIEtub3duWmVybyB8PSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwgS25vd25aZXJvT3V0KTsKKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBJU0Q6OlNSRU06CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpSZW0gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIGNvbnN0IEFQSW50ICZSQSA9IFJlbS0+Z2V0QVBJbnRWYWx1ZSgpLmFicygpOworICAgICAgaWYgKFJBLmlzUG93ZXJPZjIoKSkgeworICAgICAgICBBUEludCBMb3dCaXRzID0gUkEgLSAxOworICAgICAgICBBUEludCBNYXNrMiA9IExvd0JpdHMgfCBBUEludDo6Z2V0U2lnbkJpdChCaXRXaWR0aCk7CisgICAgICAgIENvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMCksIE1hc2syLEtub3duWmVybzIsS25vd25PbmUyLERlcHRoKzEpOworCisgICAgICAgIC8vIFRoZSBsb3cgYml0cyBvZiB0aGUgZmlyc3Qgb3BlcmFuZCBhcmUgdW5jaGFuZ2VkIGJ5IHRoZSBzcmVtLgorICAgICAgICBLbm93blplcm8gPSBLbm93blplcm8yICYgTG93Qml0czsKKyAgICAgICAgS25vd25PbmUgPSBLbm93bk9uZTIgJiBMb3dCaXRzOworCisgICAgICAgIC8vIElmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIG5vbi1uZWdhdGl2ZSBvciBoYXMgYWxsIGxvdyBiaXRzIHplcm8sIHRoZW4KKyAgICAgICAgLy8gdGhlIHVwcGVyIGJpdHMgYXJlIGFsbCB6ZXJvLgorICAgICAgICBpZiAoS25vd25aZXJvMltCaXRXaWR0aC0xXSB8fCAoKEtub3duWmVybzIgJiBMb3dCaXRzKSA9PSBMb3dCaXRzKSkKKyAgICAgICAgICBLbm93blplcm8gfD0gfkxvd0JpdHM7CisKKyAgICAgICAgLy8gSWYgdGhlIGZpcnN0IG9wZXJhbmQgaXMgbmVnYXRpdmUgYW5kIG5vdCBhbGwgbG93IGJpdHMgYXJlIHplcm8sIHRoZW4KKyAgICAgICAgLy8gdGhlIHVwcGVyIGJpdHMgYXJlIGFsbCBvbmUuCisgICAgICAgIGlmIChLbm93bk9uZTJbQml0V2lkdGgtMV0gJiYgKChLbm93bk9uZTIgJiBMb3dCaXRzKSAhPSAwKSkKKyAgICAgICAgICBLbm93bk9uZSB8PSB+TG93Qml0czsKKworICAgICAgICBLbm93blplcm8gJj0gTWFzazsKKyAgICAgICAgS25vd25PbmUgJj0gTWFzazsKKworICAgICAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwJiYiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgY2FzZSBJU0Q6OlVSRU06IHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlJlbSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgY29uc3QgQVBJbnQgJlJBID0gUmVtLT5nZXRBUEludFZhbHVlKCk7CisgICAgICBpZiAoUkEuaXNQb3dlck9mMigpKSB7CisgICAgICAgIEFQSW50IExvd0JpdHMgPSAoUkEgLSAxKTsKKyAgICAgICAgQVBJbnQgTWFzazIgPSBMb3dCaXRzICYgTWFzazsKKyAgICAgICAgS25vd25aZXJvIHw9IH5Mb3dCaXRzICYgTWFzazsKKyAgICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgTWFzazIsIEtub3duWmVybywgS25vd25PbmUsRGVwdGgrMSk7CisgICAgICAgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAmJiJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8gU2luY2UgdGhlIHJlc3VsdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZWl0aGVyIG9wZXJhbmQsIGFueSBsZWFkaW5nCisgICAgLy8gemVybyBiaXRzIGluIGVpdGhlciBvcGVyYW5kIG11c3QgYWxzbyBleGlzdCBpbiB0aGUgcmVzdWx0LgorICAgIEFQSW50IEFsbE9uZXMgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBBbGxPbmVzLCBLbm93blplcm8sIEtub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgIERlcHRoKzEpOworICAgIENvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMSksIEFsbE9uZXMsIEtub3duWmVybzIsIEtub3duT25lMiwKKyAgICAgICAgICAgICAgICAgICAgICBEZXB0aCsxKTsKKworICAgIHVpbnQzMl90IExlYWRlcnMgPSBzdGQ6Om1heChLbm93blplcm8uY291bnRMZWFkaW5nT25lcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8yLmNvdW50TGVhZGluZ09uZXMoKSk7CisgICAgS25vd25PbmUuY2xlYXIoKTsKKyAgICBLbm93blplcm8gPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIExlYWRlcnMpICYgTWFzazsKKyAgICByZXR1cm47CisgIH0KKyAgZGVmYXVsdDoKKyAgICAvLyBBbGxvdyB0aGUgdGFyZ2V0IHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZCBmb3IgaXRzIG5vZGVzLgorICAgIGlmIChPcC5nZXRPcGNvZGUoKSA+PSBJU0Q6OkJVSUxUSU5fT1BfRU5EKSB7CisgIGNhc2UgSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU46CisgIGNhc2UgSVNEOjpJTlRSSU5TSUNfV19DSEFJTjoKKyAgY2FzZSBJU0Q6OklOVFJJTlNJQ19WT0lEOgorICAgICAgVExJLmNvbXB1dGVNYXNrZWRCaXRzRm9yVGFyZ2V0Tm9kZShPcCwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSwgKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHRoKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9Cit9CisKKy8vLyBDb21wdXRlTnVtU2lnbkJpdHMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc2lnbiBiaXQgb2YgdGhlCisvLy8gcmVnaXN0ZXIgaXMgcmVwbGljYXRlZCBpbnRvIHRoZSBvdGhlciBiaXRzLiAgV2Uga25vdyB0aGF0IGF0IGxlYXN0IDEgYml0CisvLy8gaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBzaWduIGJpdCAoaXRzZWxmKSwgYnV0IG90aGVyIGNhc2VzIGNhbiBnaXZlIHVzCisvLy8gaW5mb3JtYXRpb24uICBGb3IgZXhhbXBsZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gIlNSQSBYLCAyIiwgd2Uga25vdyB0aGF0CisvLy8gdGhlIHRvcCAzIGJpdHMgYXJlIGFsbCBlcXVhbCB0byBlYWNoIG90aGVyLCBzbyB3ZSByZXR1cm4gMy4KK3Vuc2lnbmVkIFNlbGVjdGlvbkRBRzo6Q29tcHV0ZU51bVNpZ25CaXRzKFNEVmFsdWUgT3AsIHVuc2lnbmVkIERlcHRoKSBjb25zdHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIGFzc2VydChWVC5pc0ludGVnZXIoKSAmJiAiSW52YWxpZCBWVCEiKTsKKyAgdW5zaWduZWQgVlRCaXRzID0gVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgdW5zaWduZWQgVG1wLCBUbXAyOworICB1bnNpZ25lZCBGaXJzdEFuc3dlciA9IDE7CisKKyAgaWYgKERlcHRoID09IDYpCisgICAgcmV0dXJuIDE7ICAvLyBMaW1pdCBzZWFyY2ggZGVwdGguCisKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6OkFzc2VydFNleHQ6CisgICAgVG1wID0gY2FzdDxWVFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmdldFZUKCkuZ2V0U2l6ZUluQml0cygpOworICAgIHJldHVybiBWVEJpdHMtVG1wKzE7CisgIGNhc2UgSVNEOjpBc3NlcnRaZXh0OgorICAgIFRtcCA9IGNhc3Q8VlRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpLT5nZXRWVCgpLmdldFNpemVJbkJpdHMoKTsKKyAgICByZXR1cm4gVlRCaXRzLVRtcDsKKworICBjYXNlIElTRDo6Q29uc3RhbnQ6IHsKKyAgICBjb25zdCBBUEludCAmVmFsID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3ApLT5nZXRBUEludFZhbHVlKCk7CisgICAgLy8gSWYgbmVnYXRpdmUsIHJldHVybiAjIGxlYWRpbmcgb25lcy4KKyAgICBpZiAoVmFsLmlzTmVnYXRpdmUoKSkKKyAgICAgIHJldHVybiBWYWwuY291bnRMZWFkaW5nT25lcygpOworCisgICAgLy8gUmV0dXJuICMgbGVhZGluZyB6ZXJvcy4KKyAgICByZXR1cm4gVmFsLmNvdW50TGVhZGluZ1plcm9zKCk7CisgIH0KKworICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6CisgICAgVG1wID0gVlRCaXRzLU9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICByZXR1cm4gQ29tcHV0ZU51bVNpZ25CaXRzKE9wLmdldE9wZXJhbmQoMCksIERlcHRoKzEpICsgVG1wOworCisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORF9JTlJFRzoKKyAgICAvLyBNYXggb2YgdGhlIGlucHV0IGFuZCB3aGF0IHRoaXMgZXh0ZW5kcy4KKyAgICBUbXAgPQorICAgICAgY2FzdDxWVFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmdldFZUKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICBUbXAgPSBWVEJpdHMtVG1wKzE7CisKKyAgICBUbXAyID0gQ29tcHV0ZU51bVNpZ25CaXRzKE9wLmdldE9wZXJhbmQoMCksIERlcHRoKzEpOworICAgIHJldHVybiBzdGQ6Om1heChUbXAsIFRtcDIpOworCisgIGNhc2UgSVNEOjpTUkE6CisgICAgVG1wID0gQ29tcHV0ZU51bVNpZ25CaXRzKE9wLmdldE9wZXJhbmQoMCksIERlcHRoKzEpOworICAgIC8vIFNSQSBYLCBDICAgLT4gYWRkcyBDIHNpZ24gYml0cy4KKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIFRtcCArPSBDLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIGlmIChUbXAgPiBWVEJpdHMpIFRtcCA9IFZUQml0czsKKyAgICB9CisgICAgcmV0dXJuIFRtcDsKKyAgY2FzZSBJU0Q6OlNITDoKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIC8vIHNobCBkZXN0cm95cyBzaWduIGJpdHMuCisgICAgICBUbXAgPSBDb21wdXRlTnVtU2lnbkJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgRGVwdGgrMSk7CisgICAgICBpZiAoQy0+Z2V0WkV4dFZhbHVlKCkgPj0gVlRCaXRzIHx8ICAgICAgLy8gQmFkIHNoaWZ0LgorICAgICAgICAgIEMtPmdldFpFeHRWYWx1ZSgpID49IFRtcCkgYnJlYWs7ICAgIC8vIFNoaWZ0ZWQgYWxsIHNpZ24gYml0cyBvdXQuCisgICAgICByZXR1cm4gVG1wIC0gQy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6QU5EOgorICBjYXNlIElTRDo6T1I6CisgIGNhc2UgSVNEOjpYT1I6ICAgIC8vIE5PVCBpcyBoYW5kbGVkIGhlcmUuCisgICAgLy8gTG9naWNhbCBiaW5hcnkgb3BzIHByZXNlcnZlIHRoZSBudW1iZXIgb2Ygc2lnbiBiaXRzIGF0IHRoZSB3b3JzdC4KKyAgICBUbXAgPSBDb21wdXRlTnVtU2lnbkJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgRGVwdGgrMSk7CisgICAgaWYgKFRtcCAhPSAxKSB7CisgICAgICBUbXAyID0gQ29tcHV0ZU51bVNpZ25CaXRzKE9wLmdldE9wZXJhbmQoMSksIERlcHRoKzEpOworICAgICAgRmlyc3RBbnN3ZXIgPSBzdGQ6Om1pbihUbXAsIFRtcDIpOworICAgICAgLy8gV2UgY29tcHV0ZWQgd2hhdCB3ZSBrbm93IGFib3V0IHRoZSBzaWduIGJpdHMgYXMgb3VyIGZpcnN0CisgICAgICAvLyBhbnN3ZXIuIE5vdyBwcm9jZWVkIHRvIHRoZSBnZW5lcmljIGNvZGUgdGhhdCB1c2VzCisgICAgICAvLyBDb21wdXRlTWFza2VkQml0cywgYW5kIHBpY2sgd2hpY2hldmVyIGFuc3dlciBpcyBiZXR0ZXIuCisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgSVNEOjpTRUxFQ1Q6CisgICAgVG1wID0gQ29tcHV0ZU51bVNpZ25CaXRzKE9wLmdldE9wZXJhbmQoMSksIERlcHRoKzEpOworICAgIGlmIChUbXAgPT0gMSkgcmV0dXJuIDE7ICAvLyBFYXJseSBvdXQuCisgICAgVG1wMiA9IENvbXB1dGVOdW1TaWduQml0cyhPcC5nZXRPcGVyYW5kKDIpLCBEZXB0aCsxKTsKKyAgICByZXR1cm4gc3RkOjptaW4oVG1wLCBUbXAyKTsKKworICBjYXNlIElTRDo6U0FERE86CisgIGNhc2UgSVNEOjpVQURETzoKKyAgY2FzZSBJU0Q6OlNTVUJPOgorICBjYXNlIElTRDo6VVNVQk86CisgIGNhc2UgSVNEOjpTTVVMTzoKKyAgY2FzZSBJU0Q6OlVNVUxPOgorICAgIGlmIChPcC5nZXRSZXNObygpICE9IDEpCisgICAgICBicmVhazsKKyAgICAvLyBUaGUgYm9vbGVhbiByZXN1bHQgY29uZm9ybXMgdG8gZ2V0Qm9vbGVhbkNvbnRlbnRzLiAgRmFsbCB0aHJvdWdoLgorICBjYXNlIElTRDo6U0VUQ0M6CisgICAgLy8gSWYgc2V0Y2MgcmV0dXJucyAwLy0xLCBhbGwgYml0cyBhcmUgc2lnbiBiaXRzLgorICAgIGlmIChUTEkuZ2V0Qm9vbGVhbkNvbnRlbnRzKCkgPT0KKyAgICAgICAgVGFyZ2V0TG93ZXJpbmc6Olplcm9Pck5lZ2F0aXZlT25lQm9vbGVhbkNvbnRlbnQpCisgICAgICByZXR1cm4gVlRCaXRzOworICAgIGJyZWFrOworICBjYXNlIElTRDo6Uk9UTDoKKyAgY2FzZSBJU0Q6OlJPVFI6CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICB1bnNpZ25lZCBSb3RBbXQgPSBDLT5nZXRaRXh0VmFsdWUoKSAmIChWVEJpdHMtMSk7CisKKyAgICAgIC8vIEhhbmRsZSByb3RhdGUgcmlnaHQgYnkgTiBsaWtlIGEgcm90YXRlIGxlZnQgYnkgMzItTi4KKyAgICAgIGlmIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlJPVFIpCisgICAgICAgIFJvdEFtdCA9IChWVEJpdHMtUm90QW10KSAmIChWVEJpdHMtMSk7CisKKyAgICAgIC8vIElmIHdlIGFyZW4ndCByb3RhdGluZyBvdXQgYWxsIG9mIHRoZSBrbm93bi1pbiBzaWduIGJpdHMsIHJldHVybiB0aGUKKyAgICAgIC8vIG51bWJlciB0aGF0IGFyZSBsZWZ0LiAgVGhpcyBoYW5kbGVzIHJvdGwoc2V4dCh4KSwgMSkgZm9yIGV4YW1wbGUuCisgICAgICBUbXAgPSBDb21wdXRlTnVtU2lnbkJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgRGVwdGgrMSk7CisgICAgICBpZiAoVG1wID4gUm90QW10KzEpIHJldHVybiBUbXAtUm90QW10OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkFERDoKKyAgICAvLyBBZGQgY2FuIGhhdmUgYXQgbW9zdCBvbmUgY2FycnkgYml0LiAgVGh1cyB3ZSBrbm93IHRoYXQgdGhlIG91dHB1dAorICAgIC8vIGlzLCBhdCB3b3JzdCwgb25lIG1vcmUgYml0IHRoYW4gdGhlIGlucHV0cy4KKyAgICBUbXAgPSBDb21wdXRlTnVtU2lnbkJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgRGVwdGgrMSk7CisgICAgaWYgKFRtcCA9PSAxKSByZXR1cm4gMTsgIC8vIEVhcmx5IG91dC4KKworICAgIC8vIFNwZWNpYWwgY2FzZSBkZWNyZW1lbnRpbmcgYSB2YWx1ZSAoQUREIFgsIC0xKToKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNSSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSkpCisgICAgICBpZiAoQ1JIUy0+aXNBbGxPbmVzVmFsdWUoKSkgeworICAgICAgICBBUEludCBLbm93blplcm8sIEtub3duT25lOworICAgICAgICBBUEludCBNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShWVEJpdHMpOworICAgICAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKTsKKworICAgICAgICAvLyBJZiB0aGUgaW5wdXQgaXMga25vd24gdG8gYmUgMCBvciAxLCB0aGUgb3V0cHV0IGlzIDAvLTEsIHdoaWNoIGlzIGFsbAorICAgICAgICAvLyBzaWduIGJpdHMgc2V0LgorICAgICAgICBpZiAoKEtub3duWmVybyB8IEFQSW50KFZUQml0cywgMSkpID09IE1hc2spCisgICAgICAgICAgcmV0dXJuIFZUQml0czsKKworICAgICAgICAvLyBJZiB3ZSBhcmUgc3VidHJhY3Rpbmcgb25lIGZyb20gYSBwb3NpdGl2ZSBudW1iZXIsIHRoZXJlIGlzIG5vIGNhcnJ5CisgICAgICAgIC8vIG91dCBvZiB0aGUgcmVzdWx0LgorICAgICAgICBpZiAoS25vd25aZXJvLmlzTmVnYXRpdmUoKSkKKyAgICAgICAgICByZXR1cm4gVG1wOworICAgICAgfQorCisgICAgVG1wMiA9IENvbXB1dGVOdW1TaWduQml0cyhPcC5nZXRPcGVyYW5kKDEpLCBEZXB0aCsxKTsKKyAgICBpZiAoVG1wMiA9PSAxKSByZXR1cm4gMTsKKyAgICAgIHJldHVybiBzdGQ6Om1pbihUbXAsIFRtcDIpLTE7CisgICAgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OlNVQjoKKyAgICBUbXAyID0gQ29tcHV0ZU51bVNpZ25CaXRzKE9wLmdldE9wZXJhbmQoMSksIERlcHRoKzEpOworICAgIGlmIChUbXAyID09IDEpIHJldHVybiAxOworCisgICAgLy8gSGFuZGxlIE5FRy4KKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNMSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgwKSkpCisgICAgICBpZiAoQ0xIUy0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICBBUEludCBLbm93blplcm8sIEtub3duT25lOworICAgICAgICBBUEludCBNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShWVEJpdHMpOworICAgICAgICBDb21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDEpLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKTsKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGtub3duIHRvIGJlIDAgb3IgMSwgdGhlIG91dHB1dCBpcyAwLy0xLCB3aGljaCBpcyBhbGwKKyAgICAgICAgLy8gc2lnbiBiaXRzIHNldC4KKyAgICAgICAgaWYgKChLbm93blplcm8gfCBBUEludChWVEJpdHMsIDEpKSA9PSBNYXNrKQorICAgICAgICAgIHJldHVybiBWVEJpdHM7CisKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGtub3duIHRvIGJlIHBvc2l0aXZlICh0aGUgc2lnbiBiaXQgaXMga25vd24gY2xlYXIpLAorICAgICAgICAvLyB0aGUgb3V0cHV0IG9mIHRoZSBORUcgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBzaWduIGJpdHMgYXMgdGhlIGlucHV0LgorICAgICAgICBpZiAoS25vd25aZXJvLmlzTmVnYXRpdmUoKSkKKyAgICAgICAgICByZXR1cm4gVG1wMjsKKworICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHRyZWF0IHRoaXMgbGlrZSBhIFNVQi4KKyAgICAgIH0KKworICAgIC8vIFN1YiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBjYXJyeSBiaXQuICBUaHVzIHdlIGtub3cgdGhhdCB0aGUgb3V0cHV0CisgICAgLy8gaXMsIGF0IHdvcnN0LCBvbmUgbW9yZSBiaXQgdGhhbiB0aGUgaW5wdXRzLgorICAgIFRtcCA9IENvbXB1dGVOdW1TaWduQml0cyhPcC5nZXRPcGVyYW5kKDApLCBEZXB0aCsxKTsKKyAgICBpZiAoVG1wID09IDEpIHJldHVybiAxOyAgLy8gRWFybHkgb3V0LgorICAgICAgcmV0dXJuIHN0ZDo6bWluKFRtcCwgVG1wMiktMTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlRSVU5DQVRFOgorICAgIC8vIEZJWE1FOiBpdCdzIHRyaWNreSB0byBkbyBhbnl0aGluZyB1c2VmdWwgZm9yIHRoaXMsIGJ1dCBpdCBpcyBhbiBpbXBvcnRhbnQKKyAgICAvLyBjYXNlIGZvciB0YXJnZXRzIGxpa2UgWDg2LgorICAgIGJyZWFrOworICB9CisKKyAgLy8gSGFuZGxlIExPQURYIHNlcGFyYXRlbHkgaGVyZS4gRVhUTE9BRCBjYXNlIHdpbGwgZmFsbHRocm91Z2guCisgIGlmIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkxPQUQpIHsKKyAgICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oT3ApOworICAgIHVuc2lnbmVkIEV4dFR5cGUgPSBMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpOworICAgIHN3aXRjaCAoRXh0VHlwZSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVhUTE9BRDogICAgLy8gJzE3JyBiaXRzIGtub3duCisgICAgICBUbXAgPSBMRC0+Z2V0TWVtb3J5VlQoKS5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgICAgcmV0dXJuIFZUQml0cy1UbXArMTsKKyAgICBjYXNlIElTRDo6WkVYVExPQUQ6ICAgIC8vICcxNicgYml0cyBrbm93bgorICAgICAgVG1wID0gTEQtPmdldE1lbW9yeVZUKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICAgIHJldHVybiBWVEJpdHMtVG1wOworICAgIH0KKyAgfQorCisgIC8vIEFsbG93IHRoZSB0YXJnZXQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kIGZvciBpdHMgbm9kZXMuCisgIGlmIChPcC5nZXRPcGNvZGUoKSA+PSBJU0Q6OkJVSUxUSU5fT1BfRU5EIHx8CisgICAgICBPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiB8fAorICAgICAgT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpJTlRSSU5TSUNfV19DSEFJTiB8fAorICAgICAgT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpJTlRSSU5TSUNfVk9JRCkgeworICAgIHVuc2lnbmVkIE51bUJpdHMgPSBUTEkuQ29tcHV0ZU51bVNpZ25CaXRzRm9yVGFyZ2V0Tm9kZShPcCwgRGVwdGgpOworICAgIGlmIChOdW1CaXRzID4gMSkgRmlyc3RBbnN3ZXIgPSBzdGQ6Om1heChGaXJzdEFuc3dlciwgTnVtQml0cyk7CisgIH0KKworICAvLyBGaW5hbGx5LCBpZiB3ZSBjYW4gcHJvdmUgdGhhdCB0aGUgdG9wIGJpdHMgb2YgdGhlIHJlc3VsdCBhcmUgMCdzIG9yIDEncywKKyAgLy8gdXNlIHRoaXMgaW5mb3JtYXRpb24uCisgIEFQSW50IEtub3duWmVybywgS25vd25PbmU7CisgIEFQSW50IE1hc2sgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKFZUQml0cyk7CisgIENvbXB1dGVNYXNrZWRCaXRzKE9wLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCk7CisKKyAgaWYgKEtub3duWmVyby5pc05lZ2F0aXZlKCkpIHsgICAgICAgIC8vIHNpZ24gYml0IGlzIDAKKyAgICBNYXNrID0gS25vd25aZXJvOworICB9IGVsc2UgaWYgKEtub3duT25lLmlzTmVnYXRpdmUoKSkgeyAgLy8gc2lnbiBiaXQgaXMgMTsKKyAgICBNYXNrID0gS25vd25PbmU7CisgIH0gZWxzZSB7CisgICAgLy8gTm90aGluZyBrbm93bi4KKyAgICByZXR1cm4gRmlyc3RBbnN3ZXI7CisgIH0KKworICAvLyBPa2F5LCB3ZSBrbm93IHRoYXQgdGhlIHNpZ24gYml0IGluIE1hc2sgaXMgc2V0LiAgVXNlIENMWiB0byBkZXRlcm1pbmUKKyAgLy8gdGhlIG51bWJlciBvZiBpZGVudGljYWwgYml0cyBpbiB0aGUgdG9wIG9mIHRoZSBpbnB1dCB2YWx1ZS4KKyAgTWFzayA9IH5NYXNrOworICBNYXNrIDw8PSBNYXNrLmdldEJpdFdpZHRoKCktVlRCaXRzOworICAvLyBSZXR1cm4gIyBsZWFkaW5nIHplcm9zLiAgV2UgdXNlICdtaW4nIGhlcmUgaW4gY2FzZSBWYWwgd2FzIHplcm8gYmVmb3JlCisgIC8vIHNoaWZ0aW5nLiAgV2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gJzY0JyBhcyBmb3IgYW4gaTMyICIwIi4KKyAgcmV0dXJuIHN0ZDo6bWF4KEZpcnN0QW5zd2VyLCBzdGQ6Om1pbihWVEJpdHMsIE1hc2suY291bnRMZWFkaW5nWmVyb3MoKSkpOworfQorCitib29sIFNlbGVjdGlvbkRBRzo6aXNLbm93bk5ldmVyTmFOKFNEVmFsdWUgT3ApIGNvbnN0IHsKKyAgLy8gSWYgd2UncmUgdG9sZCB0aGF0IE5hTnMgd29uJ3QgaGFwcGVuLCBhc3N1bWUgdGhleSB3b24ndC4KKyAgaWYgKE5vTmFOc0ZQTWF0aCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiB0aGUgdmFsdWUgaXMgYSBjb25zdGFudCwgd2UgY2FuIG9idmlvdXNseSBzZWUgaWYgaXQgaXMgYSBOYU4gb3Igbm90LgorICBpZiAoY29uc3QgQ29uc3RhbnRGUFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE9wKSkKKyAgICByZXR1cm4gIUMtPmdldFZhbHVlQVBGKCkuaXNOYU4oKTsKKworICAvLyBUT0RPOiBSZWNvZ25pemUgbW9yZSBjYXNlcyBoZXJlLgorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTZWxlY3Rpb25EQUc6OmlzS25vd25OZXZlclplcm8oU0RWYWx1ZSBPcCkgY29uc3QgeworICAvLyBJZiB0aGUgdmFsdWUgaXMgYSBjb25zdGFudCwgd2UgY2FuIG9idmlvdXNseSBzZWUgaWYgaXQgaXMgYSB6ZXJvIG9yIG5vdC4KKyAgaWYgKGNvbnN0IENvbnN0YW50RlBTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihPcCkpCisgICAgcmV0dXJuICFDLT5pc1plcm8oKTsKKworICAvLyBUT0RPOiBSZWNvZ25pemUgbW9yZSBjYXNlcyBoZXJlLgorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTZWxlY3Rpb25EQUc6OmlzRXF1YWxUbyhTRFZhbHVlIEEsIFNEVmFsdWUgQikgY29uc3QgeworICAvLyBDaGVjayB0aGUgb2J2aW91cyBjYXNlLgorICBpZiAoQSA9PSBCKSByZXR1cm4gdHJ1ZTsKKworICAvLyBGb3IgZm9yIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSB6ZXJvLgorICBpZiAoY29uc3QgQ29uc3RhbnRGUFNETm9kZSAqQ0EgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihBKSkKKyAgICBpZiAoY29uc3QgQ29uc3RhbnRGUFNETm9kZSAqQ0IgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihCKSkKKyAgICAgIGlmIChDQS0+aXNaZXJvKCkgJiYgQ0ItPmlzWmVybygpKSByZXR1cm4gdHJ1ZTsKKworICAvLyBPdGhlcndpc2UgdGhleSBtYXkgbm90IGJlIGVxdWFsLgorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU2VsZWN0aW9uREFHOjppc1ZlcmlmaWVkRGVidWdJbmZvRGVzYyhTRFZhbHVlIE9wKSBjb25zdCB7CisgIEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oT3ApOworICBpZiAoIUdBKSByZXR1cm4gZmFsc2U7CisgIGlmIChHQS0+Z2V0T2Zmc2V0KCkgIT0gMCkgcmV0dXJuIGZhbHNlOworICBjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oR0EtPmdldEdsb2JhbCgpKTsKKyAgaWYgKCFHVikgcmV0dXJuIGZhbHNlOworICByZXR1cm4gTUYtPmdldE1NSSgpLmhhc0RlYnVnSW5mbygpOworfQorCisKKy8vLyBnZXRTaHVmZmxlU2NhbGFyRWx0IC0gUmV0dXJucyB0aGUgc2NhbGFyIGVsZW1lbnQgdGhhdCB3aWxsIG1ha2UgdXAgdGhlIGl0aAorLy8vIGVsZW1lbnQgb2YgdGhlIHJlc3VsdCBvZiB0aGUgdmVjdG9yIHNodWZmbGUuCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0U2h1ZmZsZVNjYWxhckVsdChjb25zdCBTaHVmZmxlVmVjdG9yU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaSkgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIGlmIChOLT5nZXRNYXNrRWx0KGkpIDwgMCkKKyAgICByZXR1cm4gZ2V0VU5ERUYoVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSk7CisgIHVuc2lnbmVkIEluZGV4ID0gTi0+Z2V0TWFza0VsdChpKTsKKyAgdW5zaWduZWQgTnVtRWxlbXMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBTRFZhbHVlIFYgPSAoSW5kZXggPCBOdW1FbGVtcykgPyBOLT5nZXRPcGVyYW5kKDApIDogTi0+Z2V0T3BlcmFuZCgxKTsKKyAgSW5kZXggJT0gTnVtRWxlbXM7CisKKyAgaWYgKFYuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCSVRfQ09OVkVSVCkgeworICAgIFYgPSBWLmdldE9wZXJhbmQoMCk7CisgICAgRVZUIFZWVCA9IFYuZ2V0VmFsdWVUeXBlKCk7CisgICAgaWYgKCFWVlQuaXNWZWN0b3IoKSB8fCBWVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSAhPSAodW5zaWduZWQpTnVtRWxlbXMpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisgIGlmIChWLmdldE9wY29kZSgpID09IElTRDo6U0NBTEFSX1RPX1ZFQ1RPUikKKyAgICByZXR1cm4gKEluZGV4ID09IDApID8gVi5nZXRPcGVyYW5kKDApCisgICAgICAgICAgICAgICAgICAgICAgOiBnZXRVTkRFRihWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpKTsKKyAgaWYgKFYuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IpCisgICAgcmV0dXJuIFYuZ2V0T3BlcmFuZChJbmRleCk7CisgIGlmIChjb25zdCBTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk4gPSBkeW5fY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihWKSkKKyAgICByZXR1cm4gZ2V0U2h1ZmZsZVNjYWxhckVsdChTVk4sIEluZGV4KTsKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworCisvLy8gZ2V0Tm9kZSAtIEdldHMgb3IgY3JlYXRlcyB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLy8KK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIEVWVCBWVCkgeworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBZGROb2RlSUROb2RlKElELCBPcGNvZGUsIGdldFZUTGlzdChWVCksIDAsIDApOworICB2b2lkICpJUCA9IDA7CisgIGlmIChTRE5vZGUgKkUgPSBDU0VNYXAuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKQorICAgIHJldHVybiBTRFZhbHVlKEUsIDApOworCisgIFNETm9kZSAqTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgU0ROb2RlKE9wY29kZSwgREwsIGdldFZUTGlzdChWVCkpOworICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworI2lmbmRlZiBOREVCVUcKKyAgVmVyaWZ5Tm9kZShOKTsKKyNlbmRpZgorICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCwgU0RWYWx1ZSBPcGVyYW5kKSB7CisgIC8vIENvbnN0YW50IGZvbGQgdW5hcnkgb3BlcmF0aW9ucyB3aXRoIGFuIGludGVnZXIgY29uc3RhbnQgb3BlcmFuZC4KKyAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wZXJhbmQuZ2V0Tm9kZSgpKSkgeworICAgIGNvbnN0IEFQSW50ICZWYWwgPSBDLT5nZXRBUEludFZhbHVlKCk7CisgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6CisgICAgICByZXR1cm4gZ2V0Q29uc3RhbnQoQVBJbnQoVmFsKS5zZXh0T3JUcnVuYyhWVC5nZXRTaXplSW5CaXRzKCkpLCBWVCk7CisgICAgY2FzZSBJU0Q6OkFOWV9FWFRFTkQ6CisgICAgY2FzZSBJU0Q6OlpFUk9fRVhURU5EOgorICAgIGNhc2UgSVNEOjpUUlVOQ0FURToKKyAgICAgIHJldHVybiBnZXRDb25zdGFudChBUEludChWYWwpLnpleHRPclRydW5jKFZULmdldFNpemVJbkJpdHMoKSksIFZUKTsKKyAgICBjYXNlIElTRDo6VUlOVF9UT19GUDoKKyAgICBjYXNlIElTRDo6U0lOVF9UT19GUDogeworICAgICAgY29uc3QgdWludDY0X3QgemVyb1tdID0gezAsIDB9OworICAgICAgLy8gTm8gY29tcGlsZSB0aW1lIG9wZXJhdGlvbnMgb24gcHBjZjEyOC4KKyAgICAgIGlmIChWVCA9PSBNVlQ6OnBwY2YxMjgpIGJyZWFrOworICAgICAgQVBGbG9hdCBhcGYgPSBBUEZsb2F0KEFQSW50KFZULmdldFNpemVJbkJpdHMoKSwgMiwgemVybykpOworICAgICAgKHZvaWQpYXBmLmNvbnZlcnRGcm9tQVBJbnQoVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlPT1JU0Q6OlNJTlRfVE9fRlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICAgIHJldHVybiBnZXRDb25zdGFudEZQKGFwZiwgVlQpOworICAgIH0KKyAgICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6CisgICAgICBpZiAoVlQgPT0gTVZUOjpmMzIgJiYgQy0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTMyKQorICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChWYWwuYml0c1RvRmxvYXQoKSwgVlQpOworICAgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjpmNjQgJiYgQy0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTY0KQorICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChWYWwuYml0c1RvRG91YmxlKCksIFZUKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNEOjpCU1dBUDoKKyAgICAgIHJldHVybiBnZXRDb25zdGFudChWYWwuYnl0ZVN3YXAoKSwgVlQpOworICAgIGNhc2UgSVNEOjpDVFBPUDoKKyAgICAgIHJldHVybiBnZXRDb25zdGFudChWYWwuY291bnRQb3B1bGF0aW9uKCksIFZUKTsKKyAgICBjYXNlIElTRDo6Q1RMWjoKKyAgICAgIHJldHVybiBnZXRDb25zdGFudChWYWwuY291bnRMZWFkaW5nWmVyb3MoKSwgVlQpOworICAgIGNhc2UgSVNEOjpDVFRaOgorICAgICAgcmV0dXJuIGdldENvbnN0YW50KFZhbC5jb3VudFRyYWlsaW5nWmVyb3MoKSwgVlQpOworICAgIH0KKyAgfQorCisgIC8vIENvbnN0YW50IGZvbGQgdW5hcnkgb3BlcmF0aW9ucyB3aXRoIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb3BlcmFuZC4KKyAgaWYgKENvbnN0YW50RlBTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihPcGVyYW5kLmdldE5vZGUoKSkpIHsKKyAgICBBUEZsb2F0IFYgPSBDLT5nZXRWYWx1ZUFQRigpOyAgICAvLyBtYWtlIGNvcHkKKyAgICBpZiAoVlQgIT0gTVZUOjpwcGNmMTI4ICYmIE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjpwcGNmMTI4KSB7CisgICAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgICAgY2FzZSBJU0Q6OkZORUc6CisgICAgICAgIFYuY2hhbmdlU2lnbigpOworICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChWLCBWVCk7CisgICAgICBjYXNlIElTRDo6RkFCUzoKKyAgICAgICAgVi5jbGVhclNpZ24oKTsKKyAgICAgICAgcmV0dXJuIGdldENvbnN0YW50RlAoViwgVlQpOworICAgICAgY2FzZSBJU0Q6OkZQX1JPVU5EOgorICAgICAgY2FzZSBJU0Q6OkZQX0VYVEVORDogeworICAgICAgICBib29sIGlnbm9yZWQ7CisgICAgICAgIC8vIFRoaXMgY2FuIHJldHVybiBvdmVyZmxvdywgdW5kZXJmbG93LCBvciBpbmV4YWN0OyB3ZSBkb24ndCBjYXJlLgorICAgICAgICAvLyBGSVhNRSBuZWVkIHRvIGJlIG1vcmUgZmxleGlibGUgYWJvdXQgcm91bmRpbmcgbW9kZS4KKyAgICAgICAgKHZvaWQpVi5jb252ZXJ0KCpFVlRUb0FQRmxvYXRTZW1hbnRpY3MoVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbiwgJmlnbm9yZWQpOworICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChWLCBWVCk7CisgICAgICB9CisgICAgICBjYXNlIElTRDo6RlBfVE9fU0lOVDoKKyAgICAgIGNhc2UgSVNEOjpGUF9UT19VSU5UOiB7CisgICAgICAgIGludGVnZXJQYXJ0IHhbMl07CisgICAgICAgIGJvb2wgaWdub3JlZDsKKyAgICAgICAgYXNzZXJ0KGludGVnZXJQYXJ0V2lkdGggPj0gNjQpOworICAgICAgICAvLyBGSVhNRSBuZWVkIHRvIGJlIG1vcmUgZmxleGlibGUgYWJvdXQgcm91bmRpbmcgbW9kZS4KKyAgICAgICAgQVBGbG9hdDo6b3BTdGF0dXMgcyA9IFYuY29udmVydFRvSW50ZWdlcih4LCBWVC5nZXRTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGU9PUlTRDo6RlBfVE9fU0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQRmxvYXQ6OnJtVG93YXJkWmVybywgJmlnbm9yZWQpOworICAgICAgICBpZiAocz09QVBGbG9hdDo6b3BJbnZhbGlkT3ApICAgICAvLyBpbmV4YWN0IGlzIE9LLCBpbiBmYWN0IHVzdWFsCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIEFQSW50IGFwaShWVC5nZXRTaXplSW5CaXRzKCksIDIsIHgpOworICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnQoYXBpLCBWVCk7CisgICAgICB9CisgICAgICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6CisgICAgICAgIGlmIChWVCA9PSBNVlQ6OmkzMiAmJiBDLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjpmMzIpCisgICAgICAgICAgcmV0dXJuIGdldENvbnN0YW50KCh1aW50MzJfdClWLmJpdGNhc3RUb0FQSW50KCkuZ2V0WkV4dFZhbHVlKCksIFZUKTsKKyAgICAgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjppNjQgJiYgQy0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6ZjY0KQorICAgICAgICAgIHJldHVybiBnZXRDb25zdGFudChWLmJpdGNhc3RUb0FQSW50KCkuZ2V0WkV4dFZhbHVlKCksIFZUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdW5zaWduZWQgT3BPcGNvZGUgPSBPcGVyYW5kLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCk7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGNhc2UgSVNEOjpUb2tlbkZhY3RvcjoKKyAgY2FzZSBJU0Q6Ok1FUkdFX1ZBTFVFUzoKKyAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOgorICAgIHJldHVybiBPcGVyYW5kOyAgICAgICAgIC8vIEZhY3RvciwgbWVyZ2Ugb3IgY29uY2F0IG9mIG9uZSBub2RlPyAgTm8gbmVlZC4KKyAgY2FzZSBJU0Q6OkZQX1JPVU5EOiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIG1ldGhvZCB0byBtYWtlIEZQX1JPVU5EIG5vZGUiKTsKKyAgY2FzZSBJU0Q6OkZQX0VYVEVORDoKKyAgICBhc3NlcnQoVlQuaXNGbG9hdGluZ1BvaW50KCkgJiYKKyAgICAgICAgICAgT3BlcmFuZC5nZXRWYWx1ZVR5cGUoKS5pc0Zsb2F0aW5nUG9pbnQoKSAmJiAiSW52YWxpZCBGUCBjYXN0ISIpOworICAgIGlmIChPcGVyYW5kLmdldFZhbHVlVHlwZSgpID09IFZUKSByZXR1cm4gT3BlcmFuZDsgIC8vIG5vb3AgY29udmVyc2lvbi4KKyAgICBhc3NlcnQoKCFWVC5pc1ZlY3RvcigpIHx8CisgICAgICAgICAgICBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpID09CisgICAgICAgICAgICBPcGVyYW5kLmdldFZhbHVlVHlwZSgpLmdldFZlY3Rvck51bUVsZW1lbnRzKCkpICYmCisgICAgICAgICAgICJWZWN0b3IgZWxlbWVudCBjb3VudCBtaXNtYXRjaCEiKTsKKyAgICBpZiAoT3BlcmFuZC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgICAgcmV0dXJuIGdldFVOREVGKFZUKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOgorICAgIGFzc2VydChWVC5pc0ludGVnZXIoKSAmJiBPcGVyYW5kLmdldFZhbHVlVHlwZSgpLmlzSW50ZWdlcigpICYmCisgICAgICAgICAgICJJbnZhbGlkIFNJR05fRVhURU5EISIpOworICAgIGlmIChPcGVyYW5kLmdldFZhbHVlVHlwZSgpID09IFZUKSByZXR1cm4gT3BlcmFuZDsgICAvLyBub29wIGV4dGVuc2lvbgorICAgIGFzc2VydChPcGVyYW5kLmdldFZhbHVlVHlwZSgpLmdldFNjYWxhclR5cGUoKS5iaXRzTFQoVlQuZ2V0U2NhbGFyVHlwZSgpKSAmJgorICAgICAgICAgICAiSW52YWxpZCBzZXh0IG5vZGUsIGRzdCA8IHNyYyEiKTsKKyAgICBhc3NlcnQoKCFWVC5pc1ZlY3RvcigpIHx8CisgICAgICAgICAgICBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpID09CisgICAgICAgICAgICBPcGVyYW5kLmdldFZhbHVlVHlwZSgpLmdldFZlY3Rvck51bUVsZW1lbnRzKCkpICYmCisgICAgICAgICAgICJWZWN0b3IgZWxlbWVudCBjb3VudCBtaXNtYXRjaCEiKTsKKyAgICBpZiAoT3BPcGNvZGUgPT0gSVNEOjpTSUdOX0VYVEVORCB8fCBPcE9wY29kZSA9PSBJU0Q6OlpFUk9fRVhURU5EKQorICAgICAgcmV0dXJuIGdldE5vZGUoT3BPcGNvZGUsIERMLCBWVCwgT3BlcmFuZC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6WkVST19FWFRFTkQ6CisgICAgYXNzZXJ0KFZULmlzSW50ZWdlcigpICYmIE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgWkVST19FWFRFTkQhIik7CisgICAgaWYgKE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCkgPT0gVlQpIHJldHVybiBPcGVyYW5kOyAgIC8vIG5vb3AgZXh0ZW5zaW9uCisgICAgYXNzZXJ0KE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmJpdHNMVChWVC5nZXRTY2FsYXJUeXBlKCkpICYmCisgICAgICAgICAgICJJbnZhbGlkIHpleHQgbm9kZSwgZHN0IDwgc3JjISIpOworICAgIGFzc2VydCgoIVZULmlzVmVjdG9yKCkgfHwKKyAgICAgICAgICAgIFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0KKyAgICAgICAgICAgIE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSkgJiYKKyAgICAgICAgICAgIlZlY3RvciBlbGVtZW50IGNvdW50IG1pc21hdGNoISIpOworICAgIGlmIChPcE9wY29kZSA9PSBJU0Q6OlpFUk9fRVhURU5EKSAgIC8vICh6ZXh0ICh6ZXh0IHgpKSAtPiAoemV4dCB4KQorICAgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCkpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6QU5ZX0VYVEVORDoKKyAgICBhc3NlcnQoVlQuaXNJbnRlZ2VyKCkgJiYgT3BlcmFuZC5nZXRWYWx1ZVR5cGUoKS5pc0ludGVnZXIoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBBTllfRVhURU5EISIpOworICAgIGlmIChPcGVyYW5kLmdldFZhbHVlVHlwZSgpID09IFZUKSByZXR1cm4gT3BlcmFuZDsgICAvLyBub29wIGV4dGVuc2lvbgorICAgIGFzc2VydChPcGVyYW5kLmdldFZhbHVlVHlwZSgpLmdldFNjYWxhclR5cGUoKS5iaXRzTFQoVlQuZ2V0U2NhbGFyVHlwZSgpKSAmJgorICAgICAgICAgICAiSW52YWxpZCBhbnlleHQgbm9kZSwgZHN0IDwgc3JjISIpOworICAgIGFzc2VydCgoIVZULmlzVmVjdG9yKCkgfHwKKyAgICAgICAgICAgIFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0KKyAgICAgICAgICAgIE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSkgJiYKKyAgICAgICAgICAgIlZlY3RvciBlbGVtZW50IGNvdW50IG1pc21hdGNoISIpOworCisgICAgaWYgKE9wT3Bjb2RlID09IElTRDo6WkVST19FWFRFTkQgfHwgT3BPcGNvZGUgPT0gSVNEOjpTSUdOX0VYVEVORCB8fAorICAgICAgICBPcE9wY29kZSA9PSBJU0Q6OkFOWV9FWFRFTkQpCisgICAgICAvLyAoZXh0ICh6ZXh0IHgpKSAtPiAoemV4dCB4KSAgYW5kICAoZXh0IChzZXh0IHgpKSAtPiAoc2V4dCB4KQorICAgICAgcmV0dXJuIGdldE5vZGUoT3BPcGNvZGUsIERMLCBWVCwgT3BlcmFuZC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCkpOworCisgICAgLy8gKGV4dCAodHJ1bnggeCkpIC0+IHgKKyAgICBpZiAoT3BPcGNvZGUgPT0gSVNEOjpUUlVOQ0FURSkgeworICAgICAgU0RWYWx1ZSBPcE9wID0gT3BlcmFuZC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCk7CisgICAgICBpZiAoT3BPcC5nZXRWYWx1ZVR5cGUoKSA9PSBWVCkKKyAgICAgICAgcmV0dXJuIE9wT3A7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6VFJVTkNBVEU6CisgICAgYXNzZXJ0KFZULmlzSW50ZWdlcigpICYmIE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgVFJVTkNBVEUhIik7CisgICAgaWYgKE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCkgPT0gVlQpIHJldHVybiBPcGVyYW5kOyAgIC8vIG5vb3AgdHJ1bmNhdGUKKyAgICBhc3NlcnQoT3BlcmFuZC5nZXRWYWx1ZVR5cGUoKS5nZXRTY2FsYXJUeXBlKCkuYml0c0dUKFZULmdldFNjYWxhclR5cGUoKSkgJiYKKyAgICAgICAgICAgIkludmFsaWQgdHJ1bmNhdGUgbm9kZSwgc3JjIDwgZHN0ISIpOworICAgIGFzc2VydCgoIVZULmlzVmVjdG9yKCkgfHwKKyAgICAgICAgICAgIFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0KKyAgICAgICAgICAgIE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSkgJiYKKyAgICAgICAgICAgIlZlY3RvciBlbGVtZW50IGNvdW50IG1pc21hdGNoISIpOworICAgIGlmIChPcE9wY29kZSA9PSBJU0Q6OlRSVU5DQVRFKQorICAgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpUUlVOQ0FURSwgREwsIFZULCBPcGVyYW5kLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgZWxzZSBpZiAoT3BPcGNvZGUgPT0gSVNEOjpaRVJPX0VYVEVORCB8fCBPcE9wY29kZSA9PSBJU0Q6OlNJR05fRVhURU5EIHx8CisgICAgICAgICAgICAgT3BPcGNvZGUgPT0gSVNEOjpBTllfRVhURU5EKSB7CisgICAgICAvLyBJZiB0aGUgc291cmNlIGlzIHNtYWxsZXIgdGhhbiB0aGUgZGVzdCwgd2Ugc3RpbGwgbmVlZCBhbiBleHRlbmQuCisgICAgICBpZiAoT3BlcmFuZC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpCisgICAgICAgICAgICAuYml0c0xUKFZULmdldFNjYWxhclR5cGUoKSkpCisgICAgICAgIHJldHVybiBnZXROb2RlKE9wT3Bjb2RlLCBETCwgVlQsIE9wZXJhbmQuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIGVsc2UgaWYgKE9wZXJhbmQuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLmJpdHNHVChWVCkpCisgICAgICAgIHJldHVybiBnZXROb2RlKElTRDo6VFJVTkNBVEUsIERMLCBWVCwgT3BlcmFuZC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gT3BlcmFuZC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6CisgICAgLy8gQmFzaWMgc2FuaXR5IGNoZWNraW5nLgorICAgIGFzc2VydChWVC5nZXRTaXplSW5CaXRzKCkgPT0gT3BlcmFuZC5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCkKKyAgICAgICAgICAgJiYgIkNhbm5vdCBCSVRfQ09OVkVSVCBiZXR3ZWVuIHR5cGVzIG9mIGRpZmZlcmVudCBzaXplcyEiKTsKKyAgICBpZiAoVlQgPT0gT3BlcmFuZC5nZXRWYWx1ZVR5cGUoKSkgcmV0dXJuIE9wZXJhbmQ7ICAvLyBub29wIGNvbnZlcnNpb24uCisgICAgaWYgKE9wT3Bjb2RlID09IElTRDo6QklUX0NPTlZFUlQpICAvLyBiaXRjb252KGJpdGNvbnYoeCkpIC0+IGJpdGNvbnYoeCkKKyAgICAgIHJldHVybiBnZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIERMLCBWVCwgT3BlcmFuZC5nZXRPcGVyYW5kKDApKTsKKyAgICBpZiAoT3BPcGNvZGUgPT0gSVNEOjpVTkRFRikKKyAgICAgIHJldHVybiBnZXRVTkRFRihWVCk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTQ0FMQVJfVE9fVkVDVE9SOgorICAgIGFzc2VydChWVC5pc1ZlY3RvcigpICYmICFPcGVyYW5kLmdldFZhbHVlVHlwZSgpLmlzVmVjdG9yKCkgJiYKKyAgICAgICAgICAgKFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgPT0gT3BlcmFuZC5nZXRWYWx1ZVR5cGUoKSB8fAorICAgICAgICAgICAgKFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkuaXNJbnRlZ2VyKCkgJiYKKyAgICAgICAgICAgICBPcGVyYW5kLmdldFZhbHVlVHlwZSgpLmlzSW50ZWdlcigpICYmCisgICAgICAgICAgICAgVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5iaXRzTEUoT3BlcmFuZC5nZXRWYWx1ZVR5cGUoKSkpKSAmJgorICAgICAgICAgICAiSWxsZWdhbCBTQ0FMQVJfVE9fVkVDVE9SIG5vZGUhIik7CisgICAgaWYgKE9wT3Bjb2RlID09IElTRDo6VU5ERUYpCisgICAgICByZXR1cm4gZ2V0VU5ERUYoVlQpOworICAgIC8vIHNjYWxhcl90b192ZWN0b3IoZXh0cmFjdF92ZWN0b3JfZWx0IFYsIDApIC0+IFYsIHRvcCBiaXRzIGFyZSB1bmRlZmluZWQuCisgICAgaWYgKE9wT3Bjb2RlID09IElTRDo6RVhUUkFDVF9WRUNUT1JfRUxUICYmCisgICAgICAgIGlzYTxDb25zdGFudFNETm9kZT4oT3BlcmFuZC5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgICBPcGVyYW5kLmdldENvbnN0YW50T3BlcmFuZFZhbCgxKSA9PSAwICYmCisgICAgICAgIE9wZXJhbmQuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSA9PSBWVCkKKyAgICAgIHJldHVybiBPcGVyYW5kLmdldE9wZXJhbmQoMCk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGTkVHOgorICAgIC8vIC0oWC1ZKSAtPiAoWS1YKSBpcyB1bnNhZmUgYmVjYXVzZSB3aGVuIFg9PVksIC0wLjAgIT0gKzAuMAorICAgIGlmIChVbnNhZmVGUE1hdGggJiYgT3BPcGNvZGUgPT0gSVNEOjpGU1VCKQorICAgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpGU1VCLCBETCwgVlQsIE9wZXJhbmQuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCkpOworICAgIGlmIChPcE9wY29kZSA9PSBJU0Q6OkZORUcpICAvLyAtLVggLT4gWAorICAgICAgcmV0dXJuIE9wZXJhbmQuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApOworICAgIGJyZWFrOworICBjYXNlIElTRDo6RkFCUzoKKyAgICBpZiAoT3BPcGNvZGUgPT0gSVNEOjpGTkVHKSAgLy8gYWJzKC1YKSAtPiBhYnMoWCkKKyAgICAgIHJldHVybiBnZXROb2RlKElTRDo6RkFCUywgREwsIFZULCBPcGVyYW5kLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgYnJlYWs7CisgIH0KKworICBTRE5vZGUgKk47CisgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChWVCk7CisgIGlmIChWVCAhPSBNVlQ6OkZsYWcpIHsgLy8gRG9uJ3QgQ1NFIGZsYWcgcHJvZHVjaW5nIG5vZGVzCisgICAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgICBTRFZhbHVlIE9wc1sxXSA9IHsgT3BlcmFuZCB9OworICAgIEFkZE5vZGVJRE5vZGUoSUQsIE9wY29kZSwgVlRzLCBPcHMsIDEpOworICAgIHZvaWQgKklQID0gMDsKKyAgICBpZiAoU0ROb2RlICpFID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKEUsIDApOworCisgICAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgVW5hcnlTRE5vZGUoT3Bjb2RlLCBETCwgVlRzLCBPcGVyYW5kKTsKKyAgICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIH0gZWxzZSB7CisgICAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgVW5hcnlTRE5vZGUoT3Bjb2RlLCBETCwgVlRzLCBPcGVyYW5kKTsKKyAgfQorCisgIEFsbE5vZGVzLnB1c2hfYmFjayhOKTsKKyNpZm5kZWYgTkRFQlVHCisgIFZlcmlmeU5vZGUoTik7CisjZW5kaWYKKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpGb2xkQ29uc3RhbnRBcml0aG1ldGljKHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50U0ROb2RlICpDc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRTRE5vZGUgKkNzdDIpIHsKKyAgY29uc3QgQVBJbnQgJkMxID0gQ3N0MS0+Z2V0QVBJbnRWYWx1ZSgpLCAmQzIgPSBDc3QyLT5nZXRBUEludFZhbHVlKCk7CisKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgY2FzZSBJU0Q6OkFERDogIHJldHVybiBnZXRDb25zdGFudChDMSArIEMyLCBWVCk7CisgIGNhc2UgSVNEOjpTVUI6ICByZXR1cm4gZ2V0Q29uc3RhbnQoQzEgLSBDMiwgVlQpOworICBjYXNlIElTRDo6TVVMOiAgcmV0dXJuIGdldENvbnN0YW50KEMxICogQzIsIFZUKTsKKyAgY2FzZSBJU0Q6OlVESVY6CisgICAgaWYgKEMyLmdldEJvb2xWYWx1ZSgpKSByZXR1cm4gZ2V0Q29uc3RhbnQoQzEudWRpdihDMiksIFZUKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlVSRU06CisgICAgaWYgKEMyLmdldEJvb2xWYWx1ZSgpKSByZXR1cm4gZ2V0Q29uc3RhbnQoQzEudXJlbShDMiksIFZUKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNESVY6CisgICAgaWYgKEMyLmdldEJvb2xWYWx1ZSgpKSByZXR1cm4gZ2V0Q29uc3RhbnQoQzEuc2RpdihDMiksIFZUKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNSRU06CisgICAgaWYgKEMyLmdldEJvb2xWYWx1ZSgpKSByZXR1cm4gZ2V0Q29uc3RhbnQoQzEuc3JlbShDMiksIFZUKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkFORDogIHJldHVybiBnZXRDb25zdGFudChDMSAmIEMyLCBWVCk7CisgIGNhc2UgSVNEOjpPUjogICByZXR1cm4gZ2V0Q29uc3RhbnQoQzEgfCBDMiwgVlQpOworICBjYXNlIElTRDo6WE9SOiAgcmV0dXJuIGdldENvbnN0YW50KEMxIF4gQzIsIFZUKTsKKyAgY2FzZSBJU0Q6OlNITDogIHJldHVybiBnZXRDb25zdGFudChDMSA8PCBDMiwgVlQpOworICBjYXNlIElTRDo6U1JMOiAgcmV0dXJuIGdldENvbnN0YW50KEMxLmxzaHIoQzIpLCBWVCk7CisgIGNhc2UgSVNEOjpTUkE6ICByZXR1cm4gZ2V0Q29uc3RhbnQoQzEuYXNocihDMiksIFZUKTsKKyAgY2FzZSBJU0Q6OlJPVEw6IHJldHVybiBnZXRDb25zdGFudChDMS5yb3RsKEMyKSwgVlQpOworICBjYXNlIElTRDo6Uk9UUjogcmV0dXJuIGdldENvbnN0YW50KEMxLnJvdHIoQzIpLCBWVCk7CisgIGRlZmF1bHQ6IGJyZWFrOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMikgeworICBDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xLmdldE5vZGUoKSk7CisgIENvbnN0YW50U0ROb2RlICpOMkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjIuZ2V0Tm9kZSgpKTsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpUb2tlbkZhY3RvcjoKKyAgICBhc3NlcnQoVlQgPT0gTVZUOjpPdGhlciAmJiBOMS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6Ok90aGVyICYmCisgICAgICAgICAgIE4yLmdldFZhbHVlVHlwZSgpID09IE1WVDo6T3RoZXIgJiYgIkludmFsaWQgdG9rZW4gZmFjdG9yISIpOworICAgIC8vIEZvbGQgdHJpdmlhbCB0b2tlbiBmYWN0b3JzLgorICAgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkVudHJ5VG9rZW4pIHJldHVybiBOMjsKKyAgICBpZiAoTjIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpFbnRyeVRva2VuKSByZXR1cm4gTjE7CisgICAgaWYgKE4xID09IE4yKSByZXR1cm4gTjE7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpDT05DQVRfVkVDVE9SUzoKKyAgICAvLyBBIENPTkNBVF9WRUNUT1Igd2l0aCBhbGwgb3BlcmFuZHMgQlVJTERfVkVDVE9SIGNhbiBiZSBzaW1wbGlmaWVkIHRvCisgICAgLy8gb25lIGJpZyBCVUlMRF9WRUNUT1IuCisgICAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6QlVJTERfVkVDVE9SICYmCisgICAgICAgIE4yLmdldE9wY29kZSgpID09IElTRDo6QlVJTERfVkVDVE9SKSB7CisgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gRWx0cyhOMS5nZXROb2RlKCktPm9wX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMS5nZXROb2RlKCktPm9wX2VuZCgpKTsKKyAgICAgIEVsdHMuYXBwZW5kKE4yLmdldE5vZGUoKS0+b3BfYmVnaW4oKSwgTjIuZ2V0Tm9kZSgpLT5vcF9lbmQoKSk7CisgICAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgREwsIFZULCAmRWx0c1swXSwgRWx0cy5zaXplKCkpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkFORDoKKyAgICBhc3NlcnQoVlQuaXNJbnRlZ2VyKCkgJiYgIlRoaXMgb3BlcmF0b3IgZG9lcyBub3QgYXBwbHkgdG8gRlAgdHlwZXMhIik7CisgICAgYXNzZXJ0KE4xLmdldFZhbHVlVHlwZSgpID09IE4yLmdldFZhbHVlVHlwZSgpICYmCisgICAgICAgICAgIE4xLmdldFZhbHVlVHlwZSgpID09IFZUICYmICJCaW5hcnkgb3BlcmF0b3IgdHlwZXMgbXVzdCBtYXRjaCEiKTsKKyAgICAvLyAoWCAmIDApIC0+IDAuICBUaGlzIGNvbW1vbmx5IG9jY3VycyB3aGVuIGxlZ2FsaXppbmcgaTY0IHZhbHVlcywgc28gaXQncworICAgIC8vIHdvcnRoIGhhbmRsaW5nIGhlcmUuCisgICAgaWYgKE4yQyAmJiBOMkMtPmlzTnVsbFZhbHVlKCkpCisgICAgICByZXR1cm4gTjI7CisgICAgaWYgKE4yQyAmJiBOMkMtPmlzQWxsT25lc1ZhbHVlKCkpICAvLyBYICYgLTEgLT4gWAorICAgICAgcmV0dXJuIE4xOworICAgIGJyZWFrOworICBjYXNlIElTRDo6T1I6CisgIGNhc2UgSVNEOjpYT1I6CisgIGNhc2UgSVNEOjpBREQ6CisgIGNhc2UgSVNEOjpTVUI6CisgICAgYXNzZXJ0KFZULmlzSW50ZWdlcigpICYmICJUaGlzIG9wZXJhdG9yIGRvZXMgbm90IGFwcGx5IHRvIEZQIHR5cGVzISIpOworICAgIGFzc2VydChOMS5nZXRWYWx1ZVR5cGUoKSA9PSBOMi5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgICBOMS5nZXRWYWx1ZVR5cGUoKSA9PSBWVCAmJiAiQmluYXJ5IG9wZXJhdG9yIHR5cGVzIG11c3QgbWF0Y2ghIik7CisgICAgLy8gKFggXnwrLSAwKSAtPiBYLiAgVGhpcyBjb21tb25seSBvY2N1cnMgd2hlbiBsZWdhbGl6aW5nIGk2NCB2YWx1ZXMsIHNvCisgICAgLy8gaXQncyB3b3J0aCBoYW5kbGluZyBoZXJlLgorICAgIGlmIChOMkMgJiYgTjJDLT5pc051bGxWYWx1ZSgpKQorICAgICAgcmV0dXJuIE4xOworICAgIGJyZWFrOworICBjYXNlIElTRDo6VURJVjoKKyAgY2FzZSBJU0Q6OlVSRU06CisgIGNhc2UgSVNEOjpNVUxIVToKKyAgY2FzZSBJU0Q6Ok1VTEhTOgorICBjYXNlIElTRDo6TVVMOgorICBjYXNlIElTRDo6U0RJVjoKKyAgY2FzZSBJU0Q6OlNSRU06CisgICAgYXNzZXJ0KFZULmlzSW50ZWdlcigpICYmICJUaGlzIG9wZXJhdG9yIGRvZXMgbm90IGFwcGx5IHRvIEZQIHR5cGVzISIpOworICAgIGFzc2VydChOMS5nZXRWYWx1ZVR5cGUoKSA9PSBOMi5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgICBOMS5nZXRWYWx1ZVR5cGUoKSA9PSBWVCAmJiAiQmluYXJ5IG9wZXJhdG9yIHR5cGVzIG11c3QgbWF0Y2ghIik7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGQUREOgorICBjYXNlIElTRDo6RlNVQjoKKyAgY2FzZSBJU0Q6OkZNVUw6CisgIGNhc2UgSVNEOjpGRElWOgorICBjYXNlIElTRDo6RlJFTToKKyAgICBpZiAoVW5zYWZlRlBNYXRoKSB7CisgICAgICBpZiAoT3Bjb2RlID09IElTRDo6RkFERCkgeworICAgICAgICAvLyAwK3ggLS0+IHgKKyAgICAgICAgaWYgKENvbnN0YW50RlBTRE5vZGUgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4xKSkKKyAgICAgICAgICBpZiAoQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKQorICAgICAgICAgICAgcmV0dXJuIE4yOworICAgICAgICAvLyB4KzAgLS0+IHgKKyAgICAgICAgaWYgKENvbnN0YW50RlBTRE5vZGUgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4yKSkKKyAgICAgICAgICBpZiAoQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKQorICAgICAgICAgICAgcmV0dXJuIE4xOworICAgICAgfSBlbHNlIGlmIChPcGNvZGUgPT0gSVNEOjpGU1VCKSB7CisgICAgICAgIC8vIHgtMCAtLT4geAorICAgICAgICBpZiAoQ29uc3RhbnRGUFNETm9kZSAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjIpKQorICAgICAgICAgIGlmIChDRlAtPmdldFZhbHVlQVBGKCkuaXNaZXJvKCkpCisgICAgICAgICAgICByZXR1cm4gTjE7CisgICAgICB9CisgICAgfQorICAgIGFzc2VydChWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJiAiVGhpcyBvcGVyYXRvciBvbmx5IGFwcGxpZXMgdG8gRlAgdHlwZXMhIik7CisgICAgYXNzZXJ0KE4xLmdldFZhbHVlVHlwZSgpID09IE4yLmdldFZhbHVlVHlwZSgpICYmCisgICAgICAgICAgIE4xLmdldFZhbHVlVHlwZSgpID09IFZUICYmICJCaW5hcnkgb3BlcmF0b3IgdHlwZXMgbXVzdCBtYXRjaCEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZDT1BZU0lHTjogICAvLyBOMSBhbmQgcmVzdWx0IG11c3QgbWF0Y2guICBOMS9OMiBuZWVkIG5vdCBtYXRjaC4KKyAgICBhc3NlcnQoTjEuZ2V0VmFsdWVUeXBlKCkgPT0gVlQgJiYKKyAgICAgICAgICAgTjEuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCkgJiYKKyAgICAgICAgICAgTjIuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgRkNPUFlTSUdOISIpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0hMOgorICBjYXNlIElTRDo6U1JBOgorICBjYXNlIElTRDo6U1JMOgorICBjYXNlIElTRDo6Uk9UTDoKKyAgY2FzZSBJU0Q6OlJPVFI6CisgICAgYXNzZXJ0KFZUID09IE4xLmdldFZhbHVlVHlwZSgpICYmCisgICAgICAgICAgICJTaGlmdCBvcGVyYXRvcnMgcmV0dXJuIHR5cGUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGVpciBmaXJzdCBhcmciKTsKKyAgICBhc3NlcnQoVlQuaXNJbnRlZ2VyKCkgJiYgTjIuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkgJiYKKyAgICAgICAgICAgIlNoaWZ0cyBvbmx5IHdvcmsgb24gaW50ZWdlcnMiKTsKKworICAgIC8vIEFsd2F5cyBmb2xkIHNoaWZ0cyBvZiBpMSB2YWx1ZXMgc28gdGhlIGNvZGUgZ2VuZXJhdG9yIGRvZXNuJ3QgbmVlZCB0bworICAgIC8vIGhhbmRsZSB0aGVtLiAgU2luY2Ugd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgc2hpZnQgaGFzIHRvIGJlIGxlc3MgdGhhbiB0aGUKKyAgICAvLyBzaXplIG9mIHRoZSB2YWx1ZSwgdGhlIHNoaWZ0L3JvdGF0ZSBjb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8uCisgICAgaWYgKFZUID09IE1WVDo6aTEpCisgICAgICByZXR1cm4gTjE7CisgICAgaWYgKE4yQyAmJiBOMkMtPmlzTnVsbFZhbHVlKCkpCisgICAgICByZXR1cm4gTjE7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpGUF9ST1VORF9JTlJFRzogeworICAgIEVWVCBFVlQgPSBjYXN0PFZUU0ROb2RlPihOMiktPmdldFZUKCk7CisgICAgYXNzZXJ0KFZUID09IE4xLmdldFZhbHVlVHlwZSgpICYmICJOb3QgYW4gaW5yZWcgcm91bmQhIik7CisgICAgYXNzZXJ0KFZULmlzRmxvYXRpbmdQb2ludCgpICYmIEVWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJgorICAgICAgICAgICAiQ2Fubm90IEZQX1JPVU5EX0lOUkVHIGludGVnZXIgdHlwZXMiKTsKKyAgICBhc3NlcnQoRVZULmlzVmVjdG9yKCkgPT0gVlQuaXNWZWN0b3IoKSAmJgorICAgICAgICAgICAiRlBfUk9VTkRfSU5SRUcgdHlwZSBzaG91bGQgYmUgdmVjdG9yIGlmZiB0aGUgb3BlcmFuZCAiCisgICAgICAgICAgICJ0eXBlIGlzIHZlY3RvciEiKTsKKyAgICBhc3NlcnQoKCFFVlQuaXNWZWN0b3IoKSB8fAorICAgICAgICAgICAgRVZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSkgJiYKKyAgICAgICAgICAgIlZlY3RvciBlbGVtZW50IGNvdW50cyBtdXN0IG1hdGNoIGluIEZQX1JPVU5EX0lOUkVHIik7CisgICAgYXNzZXJ0KEVWVC5iaXRzTEUoVlQpICYmICJOb3Qgcm91bmRpbmcgZG93biEiKTsKKyAgICBpZiAoY2FzdDxWVFNETm9kZT4oTjIpLT5nZXRWVCgpID09IFZUKSByZXR1cm4gTjE7ICAvLyBOb3QgYWN0dWFsbHkgcm91bmRpbmcuCisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OkZQX1JPVU5EOgorICAgIGFzc2VydChWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJgorICAgICAgICAgICBOMS5nZXRWYWx1ZVR5cGUoKS5pc0Zsb2F0aW5nUG9pbnQoKSAmJgorICAgICAgICAgICBWVC5iaXRzTEUoTjEuZ2V0VmFsdWVUeXBlKCkpICYmCisgICAgICAgICAgIGlzYTxDb25zdGFudFNETm9kZT4oTjIpICYmICJJbnZhbGlkIEZQX1JPVU5EISIpOworICAgIGlmIChOMS5nZXRWYWx1ZVR5cGUoKSA9PSBWVCkgcmV0dXJuIE4xOyAgLy8gbm9vcCBjb252ZXJzaW9uLgorICAgIGJyZWFrOworICBjYXNlIElTRDo6QXNzZXJ0U2V4dDoKKyAgY2FzZSBJU0Q6OkFzc2VydFpleHQ6IHsKKyAgICBFVlQgRVZUID0gY2FzdDxWVFNETm9kZT4oTjIpLT5nZXRWVCgpOworICAgIGFzc2VydChWVCA9PSBOMS5nZXRWYWx1ZVR5cGUoKSAmJiAiTm90IGFuIGlucmVnIGV4dGVuZCEiKTsKKyAgICBhc3NlcnQoVlQuaXNJbnRlZ2VyKCkgJiYgRVZULmlzSW50ZWdlcigpICYmCisgICAgICAgICAgICJDYW5ub3QgKl9FWFRFTkRfSU5SRUcgRlAgdHlwZXMiKTsKKyAgICBhc3NlcnQoIUVWVC5pc1ZlY3RvcigpICYmCisgICAgICAgICAgICJBc3NlcnRTRXh0L0Fzc2VydFpFeHQgdHlwZSBzaG91bGQgYmUgdGhlIHZlY3RvciBlbGVtZW50IHR5cGUgIgorICAgICAgICAgICAicmF0aGVyIHRoYW4gdGhlIHZlY3RvciB0eXBlISIpOworICAgIGFzc2VydChFVlQuYml0c0xFKFZUKSAmJiAiTm90IGV4dGVuZGluZyEiKTsKKyAgICBpZiAoVlQgPT0gRVZUKSByZXR1cm4gTjE7IC8vIG5vb3AgYXNzZXJ0aW9uLgorICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORF9JTlJFRzogeworICAgIEVWVCBFVlQgPSBjYXN0PFZUU0ROb2RlPihOMiktPmdldFZUKCk7CisgICAgYXNzZXJ0KFZUID09IE4xLmdldFZhbHVlVHlwZSgpICYmICJOb3QgYW4gaW5yZWcgZXh0ZW5kISIpOworICAgIGFzc2VydChWVC5pc0ludGVnZXIoKSAmJiBFVlQuaXNJbnRlZ2VyKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCAqX0VYVEVORF9JTlJFRyBGUCB0eXBlcyIpOworICAgIGFzc2VydChFVlQuaXNWZWN0b3IoKSA9PSBWVC5pc1ZlY3RvcigpICYmCisgICAgICAgICAgICJTSUdOX0VYVEVORF9JTlJFRyB0eXBlIHNob3VsZCBiZSB2ZWN0b3IgaWZmIHRoZSBvcGVyYW5kICIKKyAgICAgICAgICAgInR5cGUgaXMgdmVjdG9yISIpOworICAgIGFzc2VydCgoIUVWVC5pc1ZlY3RvcigpIHx8CisgICAgICAgICAgICBFVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA9PSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpKSAmJgorICAgICAgICAgICAiVmVjdG9yIGVsZW1lbnQgY291bnRzIG11c3QgbWF0Y2ggaW4gU0lHTl9FWFRFTkRfSU5SRUciKTsKKyAgICBhc3NlcnQoRVZULmJpdHNMRShWVCkgJiYgIk5vdCBleHRlbmRpbmchIik7CisgICAgaWYgKEVWVCA9PSBWVCkgcmV0dXJuIE4xOyAgLy8gTm90IGFjdHVhbGx5IGV4dGVuZGluZworCisgICAgaWYgKE4xQykgeworICAgICAgQVBJbnQgVmFsID0gTjFDLT5nZXRBUEludFZhbHVlKCk7CisgICAgICB1bnNpZ25lZCBGcm9tQml0cyA9IEVWVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgICAgVmFsIDw8PSBWYWwuZ2V0Qml0V2lkdGgoKS1Gcm9tQml0czsKKyAgICAgIFZhbCA9IFZhbC5hc2hyKFZhbC5nZXRCaXRXaWR0aCgpLUZyb21CaXRzKTsKKyAgICAgIHJldHVybiBnZXRDb25zdGFudChWYWwsIFZUKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVDoKKyAgICAvLyBFWFRSQUNUX1ZFQ1RPUl9FTFQgb2YgYW4gVU5ERUYgaXMgYW4gVU5ERUYuCisgICAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgICByZXR1cm4gZ2V0VU5ERUYoVlQpOworCisgICAgLy8gRVhUUkFDVF9WRUNUT1JfRUxUIG9mIENPTkNBVF9WRUNUT1JTIGlzIG9mdGVuIGZvcm1lZCB3aGlsZSBsb3dlcmluZyBpcworICAgIC8vIGV4cGFuZGluZyBjb3BpZXMgb2YgbGFyZ2UgdmVjdG9ycyBmcm9tIHJlZ2lzdGVycy4KKyAgICBpZiAoTjJDICYmCisgICAgICAgIE4xLmdldE9wY29kZSgpID09IElTRDo6Q09OQ0FUX1ZFQ1RPUlMgJiYKKyAgICAgICAgTjEuZ2V0TnVtT3BlcmFuZHMoKSA+IDApIHsKKyAgICAgIHVuc2lnbmVkIEZhY3RvciA9CisgICAgICAgIE4xLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgIHJldHVybiBnZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBETCwgVlQsCisgICAgICAgICAgICAgICAgICAgICBOMS5nZXRPcGVyYW5kKE4yQy0+Z2V0WkV4dFZhbHVlKCkgLyBGYWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RhbnQoTjJDLT5nZXRaRXh0VmFsdWUoKSAlIEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4yLmdldFZhbHVlVHlwZSgpKSk7CisgICAgfQorCisgICAgLy8gRVhUUkFDVF9WRUNUT1JfRUxUIG9mIEJVSUxEX1ZFQ1RPUiBpcyBvZnRlbiBmb3JtZWQgd2hpbGUgbG93ZXJpbmcgaXMKKyAgICAvLyBleHBhbmRpbmcgbGFyZ2UgdmVjdG9yIGNvbnN0YW50cy4KKyAgICBpZiAoTjJDICYmIE4xLmdldE9wY29kZSgpID09IElTRDo6QlVJTERfVkVDVE9SKSB7CisgICAgICBTRFZhbHVlIEVsdCA9IE4xLmdldE9wZXJhbmQoTjJDLT5nZXRaRXh0VmFsdWUoKSk7CisgICAgICBFVlQgVkVsdFR5ID0gTjEuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICAgIGlmIChFbHQuZ2V0VmFsdWVUeXBlKCkgIT0gVkVsdFR5KSB7CisgICAgICAgIC8vIElmIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlIGlzIG5vdCBsZWdhbCwgdGhlIEJVSUxEX1ZFQ1RPUiBvcGVyYW5kcworICAgICAgICAvLyBhcmUgcHJvbW90ZWQgYW5kIGltcGxpY2l0bHkgdHJ1bmNhdGVkLiAgTWFrZSB0aGF0IGV4cGxpY2l0IGhlcmUuCisgICAgICAgIEVsdCA9IGdldE5vZGUoSVNEOjpUUlVOQ0FURSwgREwsIFZFbHRUeSwgRWx0KTsKKyAgICAgIH0KKyAgICAgIGlmIChWVCAhPSBWRWx0VHkpIHsKKyAgICAgICAgLy8gSWYgdGhlIHZlY3RvciBlbGVtZW50IHR5cGUgaXMgbm90IGxlZ2FsLCB0aGUgRVhUUkFDVF9WRUNUT1JfRUxUCisgICAgICAgIC8vIHJlc3VsdCBpcyBpbXBsaWNpdGx5IGV4dGVuZGVkLgorICAgICAgICBFbHQgPSBnZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgREwsIFZULCBFbHQpOworICAgICAgfQorICAgICAgcmV0dXJuIEVsdDsKKyAgICB9CisKKyAgICAvLyBFWFRSQUNUX1ZFQ1RPUl9FTFQgb2YgSU5TRVJUX1ZFQ1RPUl9FTFQgaXMgb2Z0ZW4gZm9ybWVkIHdoZW4gdmVjdG9yCisgICAgLy8gb3BlcmF0aW9ucyBhcmUgbG93ZXJlZCB0byBzY2FsYXJzLgorICAgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OklOU0VSVF9WRUNUT1JfRUxUKSB7CisgICAgICAvLyBJZiB0aGUgaW5kaWNlcyBhcmUgdGhlIHNhbWUsIHJldHVybiB0aGUgaW5zZXJ0ZWQgZWxlbWVudCBlbHNlCisgICAgICAvLyBpZiB0aGUgaW5kaWNlcyBhcmUga25vd24gZGlmZmVyZW50LCBleHRyYWN0IHRoZSBlbGVtZW50IGZyb20KKyAgICAgIC8vIHRoZSBvcmlnaW5hbCB2ZWN0b3IuCisgICAgICBTRFZhbHVlIE4xT3AyID0gTjEuZ2V0T3BlcmFuZCgyKTsKKyAgICAgIENvbnN0YW50U0ROb2RlICpOMU9wMkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjFPcDIuZ2V0Tm9kZSgpKTsKKworICAgICAgaWYgKE4xT3AyQyAmJiBOMkMpIHsKKyAgICAgICAgaWYgKE4xT3AyQy0+Z2V0WkV4dFZhbHVlKCkgPT0gTjJDLT5nZXRaRXh0VmFsdWUoKSkgeworICAgICAgICAgIGlmIChWVCA9PSBOMS5nZXRPcGVyYW5kKDEpLmdldFZhbHVlVHlwZSgpKQorICAgICAgICAgICAgcmV0dXJuIE4xLmdldE9wZXJhbmQoMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGdldFNFeHRPclRydW5jKE4xLmdldE9wZXJhbmQoMSksIERMLCBWVCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgREwsIFZULCBOMS5nZXRPcGVyYW5kKDApLCBOMik7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6RVhUUkFDVF9FTEVNRU5UOgorICAgIGFzc2VydChOMkMgJiYgKHVuc2lnbmVkKU4yQy0+Z2V0WkV4dFZhbHVlKCkgPCAyICYmICJCYWQgRVhUUkFDVF9FTEVNRU5UISIpOworICAgIGFzc2VydCghTjEuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSAmJiAhVlQuaXNWZWN0b3IoKSAmJgorICAgICAgICAgICAoTjEuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkgPT0gVlQuaXNJbnRlZ2VyKCkpICYmCisgICAgICAgICAgICJXcm9uZyB0eXBlcyBmb3IgRVhUUkFDVF9FTEVNRU5UISIpOworCisgICAgLy8gRVhUUkFDVF9FTEVNRU5UIG9mIEJVSUxEX1BBSVIgaXMgb2Z0ZW4gZm9ybWVkIHdoaWxlIGxlZ2FsaXplIGlzIGV4cGFuZGluZworICAgIC8vIDY0LWJpdCBpbnRlZ2VycyBpbnRvIDMyLWJpdCBwYXJ0cy4gIEluc3RlYWQgb2YgYnVpbGRpbmcgdGhlIGV4dHJhY3Qgb2YKKyAgICAvLyB0aGUgQlVJTERfUEFJUiwgb25seSB0byBoYXZlIGxlZ2FsaXplIHJpcCBpdCBhcGFydCwganVzdCBkbyBpdCBub3cuCisgICAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6QlVJTERfUEFJUikKKyAgICAgIHJldHVybiBOMS5nZXRPcGVyYW5kKE4yQy0+Z2V0WkV4dFZhbHVlKCkpOworCisgICAgLy8gRVhUUkFDVF9FTEVNRU5UIG9mIGEgY29uc3RhbnQgaW50IGlzIGFsc28gdmVyeSBjb21tb24uCisgICAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xKSkgeworICAgICAgdW5zaWduZWQgRWxlbWVudFNpemUgPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgICB1bnNpZ25lZCBTaGlmdCA9IEVsZW1lbnRTaXplICogTjJDLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIEFQSW50IFNoaWZ0ZWRWYWwgPSBDLT5nZXRBUEludFZhbHVlKCkubHNocihTaGlmdCk7CisgICAgICByZXR1cm4gZ2V0Q29uc3RhbnQoU2hpZnRlZFZhbC50cnVuYyhFbGVtZW50U2l6ZSksIFZUKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUjoKKyAgICBpZiAoTjEuZ2V0VmFsdWVUeXBlKCkgPT0gVlQpIC8vIFRyaXZpYWwgZXh0cmFjdGlvbi4KKyAgICAgIHJldHVybiBOMTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChOMUMpIHsKKyAgICBpZiAoTjJDKSB7CisgICAgICBTRFZhbHVlIFNWID0gRm9sZENvbnN0YW50QXJpdGhtZXRpYyhPcGNvZGUsIFZULCBOMUMsIE4yQyk7CisgICAgICBpZiAoU1YuZ2V0Tm9kZSgpKSByZXR1cm4gU1Y7CisgICAgfSBlbHNlIHsgICAgICAvLyBDYW5ub25pY2FsaXplIGNvbnN0YW50IHRvIFJIUyBpZiBjb21tdXRhdGl2ZQorICAgICAgaWYgKGlzQ29tbXV0YXRpdmVCaW5PcChPcGNvZGUpKSB7CisgICAgICAgIHN0ZDo6c3dhcChOMUMsIE4yQyk7CisgICAgICAgIHN0ZDo6c3dhcChOMSwgTjIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENvbnN0YW50IGZvbGQgRlAgb3BlcmF0aW9ucy4KKyAgQ29uc3RhbnRGUFNETm9kZSAqTjFDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihOMS5nZXROb2RlKCkpOworICBDb25zdGFudEZQU0ROb2RlICpOMkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4yLmdldE5vZGUoKSk7CisgIGlmIChOMUNGUCkgeworICAgIGlmICghTjJDRlAgJiYgaXNDb21tdXRhdGl2ZUJpbk9wKE9wY29kZSkpIHsKKyAgICAgIC8vIENhbm5vbmljYWxpemUgY29uc3RhbnQgdG8gUkhTIGlmIGNvbW11dGF0aXZlCisgICAgICBzdGQ6OnN3YXAoTjFDRlAsIE4yQ0ZQKTsKKyAgICAgIHN0ZDo6c3dhcChOMSwgTjIpOworICAgIH0gZWxzZSBpZiAoTjJDRlAgJiYgVlQgIT0gTVZUOjpwcGNmMTI4KSB7CisgICAgICBBUEZsb2F0IFYxID0gTjFDRlAtPmdldFZhbHVlQVBGKCksIFYyID0gTjJDRlAtPmdldFZhbHVlQVBGKCk7CisgICAgICBBUEZsb2F0OjpvcFN0YXR1cyBzOworICAgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICAgIGNhc2UgSVNEOjpGQUREOgorICAgICAgICBzID0gVjEuYWRkKFYyLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICAgICAgaWYgKHMgIT0gQVBGbG9hdDo6b3BJbnZhbGlkT3ApCisgICAgICAgICAgcmV0dXJuIGdldENvbnN0YW50RlAoVjEsIFZUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElTRDo6RlNVQjoKKyAgICAgICAgcyA9IFYxLnN1YnRyYWN0KFYyLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICAgICAgaWYgKHMhPUFQRmxvYXQ6Om9wSW52YWxpZE9wKQorICAgICAgICAgIHJldHVybiBnZXRDb25zdGFudEZQKFYxLCBWVCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OkZNVUw6CisgICAgICAgIHMgPSBWMS5tdWx0aXBseShWMiwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgICAgIGlmIChzIT1BUEZsb2F0OjpvcEludmFsaWRPcCkKKyAgICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChWMSwgVlQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpGRElWOgorICAgICAgICBzID0gVjEuZGl2aWRlKFYyLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICAgICAgaWYgKHMhPUFQRmxvYXQ6Om9wSW52YWxpZE9wICYmIHMhPUFQRmxvYXQ6Om9wRGl2QnlaZXJvKQorICAgICAgICAgIHJldHVybiBnZXRDb25zdGFudEZQKFYxLCBWVCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OkZSRU0gOgorICAgICAgICBzID0gVjEubW9kKFYyLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICAgICAgaWYgKHMhPUFQRmxvYXQ6Om9wSW52YWxpZE9wICYmIHMhPUFQRmxvYXQ6Om9wRGl2QnlaZXJvKQorICAgICAgICAgIHJldHVybiBnZXRDb25zdGFudEZQKFYxLCBWVCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OkZDT1BZU0lHTjoKKyAgICAgICAgVjEuY29weVNpZ24oVjIpOworICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnRGUChWMSwgVlQpOworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ2Fub25pY2FsaXplIGFuIFVOREVGIHRvIHRoZSBSSFMsIGV2ZW4gb3ZlciBhIGNvbnN0YW50LgorICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikgeworICAgIGlmIChpc0NvbW11dGF0aXZlQmluT3AoT3Bjb2RlKSkgeworICAgICAgc3RkOjpzd2FwKE4xLCBOMik7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoT3Bjb2RlKSB7CisgICAgICBjYXNlIElTRDo6RlBfUk9VTkRfSU5SRUc6CisgICAgICBjYXNlIElTRDo6U0lHTl9FWFRFTkRfSU5SRUc6CisgICAgICBjYXNlIElTRDo6U1VCOgorICAgICAgY2FzZSBJU0Q6OkZTVUI6CisgICAgICBjYXNlIElTRDo6RkRJVjoKKyAgICAgIGNhc2UgSVNEOjpGUkVNOgorICAgICAgY2FzZSBJU0Q6OlNSQToKKyAgICAgICAgcmV0dXJuIE4xOyAgICAgLy8gZm9sZCBvcCh1bmRlZiwgYXJnMikgLT4gdW5kZWYKKyAgICAgIGNhc2UgSVNEOjpVRElWOgorICAgICAgY2FzZSBJU0Q6OlNESVY6CisgICAgICBjYXNlIElTRDo6VVJFTToKKyAgICAgIGNhc2UgSVNEOjpTUkVNOgorICAgICAgY2FzZSBJU0Q6OlNSTDoKKyAgICAgIGNhc2UgSVNEOjpTSEw6CisgICAgICAgIGlmICghVlQuaXNWZWN0b3IoKSkKKyAgICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnQoMCwgVlQpOyAgICAvLyBmb2xkIG9wKHVuZGVmLCBhcmcyKSAtPiAwCisgICAgICAgIC8vIEZvciB2ZWN0b3JzLCB3ZSBjYW4ndCBlYXNpbHkgYnVpbGQgYW4gYWxsIHplcm8gdmVjdG9yLCBqdXN0IHJldHVybgorICAgICAgICAvLyB0aGUgTEhTLgorICAgICAgICByZXR1cm4gTjI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gRm9sZCBhIGJ1bmNoIG9mIG9wZXJhdG9ycyB3aGVuIHRoZSBSSFMgaXMgdW5kZWYuCisgIGlmIChOMi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKSB7CisgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBjYXNlIElTRDo6WE9SOgorICAgICAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgICAgIC8vIEhhbmRsZSB1bmRlZiBeIHVuZGVmIC0+IDAgc3BlY2lhbCBjYXNlLiBUaGlzIGlzIGEgY29tbW9uCisgICAgICAgIC8vIGlkaW9tIChtaXN1c2UpLgorICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnQoMCwgVlQpOworICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICBjYXNlIElTRDo6QUREOgorICAgIGNhc2UgSVNEOjpBRERDOgorICAgIGNhc2UgSVNEOjpBRERFOgorICAgIGNhc2UgSVNEOjpTVUI6CisgICAgY2FzZSBJU0Q6OlVESVY6CisgICAgY2FzZSBJU0Q6OlNESVY6CisgICAgY2FzZSBJU0Q6OlVSRU06CisgICAgY2FzZSBJU0Q6OlNSRU06CisgICAgICByZXR1cm4gTjI7ICAgICAgIC8vIGZvbGQgb3AoYXJnMSwgdW5kZWYpIC0+IHVuZGVmCisgICAgY2FzZSBJU0Q6OkZBREQ6CisgICAgY2FzZSBJU0Q6OkZTVUI6CisgICAgY2FzZSBJU0Q6OkZNVUw6CisgICAgY2FzZSBJU0Q6OkZESVY6CisgICAgY2FzZSBJU0Q6OkZSRU06CisgICAgICBpZiAoVW5zYWZlRlBNYXRoKQorICAgICAgICByZXR1cm4gTjI7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6TVVMOgorICAgIGNhc2UgSVNEOjpBTkQ6CisgICAgY2FzZSBJU0Q6OlNSTDoKKyAgICBjYXNlIElTRDo6U0hMOgorICAgICAgaWYgKCFWVC5pc1ZlY3RvcigpKQorICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnQoMCwgVlQpOyAgLy8gZm9sZCBvcChhcmcxLCB1bmRlZikgLT4gMAorICAgICAgLy8gRm9yIHZlY3RvcnMsIHdlIGNhbid0IGVhc2lseSBidWlsZCBhbiBhbGwgemVybyB2ZWN0b3IsIGp1c3QgcmV0dXJuCisgICAgICAvLyB0aGUgTEhTLgorICAgICAgcmV0dXJuIE4xOworICAgIGNhc2UgSVNEOjpPUjoKKyAgICAgIGlmICghVlQuaXNWZWN0b3IoKSkKKyAgICAgICAgcmV0dXJuIGdldENvbnN0YW50KEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoVlQuZ2V0U2l6ZUluQml0cygpKSwgVlQpOworICAgICAgLy8gRm9yIHZlY3RvcnMsIHdlIGNhbid0IGVhc2lseSBidWlsZCBhbiBhbGwgb25lIHZlY3RvciwganVzdCByZXR1cm4KKyAgICAgIC8vIHRoZSBMSFMuCisgICAgICByZXR1cm4gTjE7CisgICAgY2FzZSBJU0Q6OlNSQToKKyAgICAgIHJldHVybiBOMTsKKyAgICB9CisgIH0KKworICAvLyBNZW1vaXplIHRoaXMgbm9kZSBpZiBwb3NzaWJsZS4KKyAgU0ROb2RlICpOOworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQpOworICBpZiAoVlQgIT0gTVZUOjpGbGFnKSB7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTjEsIE4yIH07CisgICAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgICBBZGROb2RlSUROb2RlKElELCBPcGNvZGUsIFZUcywgT3BzLCAyKTsKKyAgICB2b2lkICpJUCA9IDA7CisgICAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpCisgICAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKworICAgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIEJpbmFyeVNETm9kZShPcGNvZGUsIERMLCBWVHMsIE4xLCBOMik7CisgICAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworICB9IGVsc2UgeworICAgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIEJpbmFyeVNETm9kZShPcGNvZGUsIERMLCBWVHMsIE4xLCBOMik7CisgIH0KKworICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisjaWZuZGVmIE5ERUJVRworICBWZXJpZnlOb2RlKE4pOworI2VuZGlmCisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4xLCBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zKSB7CisgIC8vIFBlcmZvcm0gdmFyaW91cyBzaW1wbGlmaWNhdGlvbnMuCisgIENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEuZ2V0Tm9kZSgpKTsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOgorICAgIC8vIEEgQ09OQ0FUX1ZFQ1RPUiB3aXRoIGFsbCBvcGVyYW5kcyBCVUlMRF9WRUNUT1IgY2FuIGJlIHNpbXBsaWZpZWQgdG8KKyAgICAvLyBvbmUgYmlnIEJVSUxEX1ZFQ1RPUi4KKyAgICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IgJiYKKyAgICAgICAgTjIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IgJiYKKyAgICAgICAgTjMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IpIHsKKyAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBFbHRzKE4xLmdldE5vZGUoKS0+b3BfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4xLmdldE5vZGUoKS0+b3BfZW5kKCkpOworICAgICAgRWx0cy5hcHBlbmQoTjIuZ2V0Tm9kZSgpLT5vcF9iZWdpbigpLCBOMi5nZXROb2RlKCktPm9wX2VuZCgpKTsKKyAgICAgIEVsdHMuYXBwZW5kKE4zLmdldE5vZGUoKS0+b3BfYmVnaW4oKSwgTjMuZ2V0Tm9kZSgpLT5vcF9lbmQoKSk7CisgICAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgREwsIFZULCAmRWx0c1swXSwgRWx0cy5zaXplKCkpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVENDOiB7CisgICAgLy8gVXNlIEZvbGRTZXRDQyB0byBzaW1wbGlmeSBTRVRDQydzLgorICAgIFNEVmFsdWUgU2ltcCA9IEZvbGRTZXRDQyhWVCwgTjEsIE4yLCBjYXN0PENvbmRDb2RlU0ROb2RlPihOMyktPmdldCgpLCBETCk7CisgICAgaWYgKFNpbXAuZ2V0Tm9kZSgpKSByZXR1cm4gU2ltcDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6U0VMRUNUOgorICAgIGlmIChOMUMpIHsKKyAgICAgaWYgKE4xQy0+Z2V0WkV4dFZhbHVlKCkpCisgICAgICAgIHJldHVybiBOMjsgICAgICAgICAgICAgLy8gc2VsZWN0IHRydWUsIFgsIFkgLT4gWAorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTjM7ICAgICAgICAgICAgIC8vIHNlbGVjdCBmYWxzZSwgWCwgWSAtPiBZCisgICAgfQorCisgICAgaWYgKE4yID09IE4zKSByZXR1cm4gTjI7ICAgLy8gc2VsZWN0IEMsIFgsIFggLT4gWAorICAgIGJyZWFrOworICBjYXNlIElTRDo6VkVDVE9SX1NIVUZGTEU6CisgICAgbGx2bV91bnJlYWNoYWJsZSgic2hvdWxkIHVzZSBnZXRWZWN0b3JTaHVmZmxlIGNvbnN0cnVjdG9yISIpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6CisgICAgLy8gRm9sZCBiaXRfY29udmVydCBub2RlcyBmcm9tIGEgdHlwZSB0byB0aGVtc2VsdmVzLgorICAgIGlmIChOMS5nZXRWYWx1ZVR5cGUoKSA9PSBWVCkKKyAgICAgIHJldHVybiBOMTsKKyAgICBicmVhazsKKyAgfQorCisgIC8vIE1lbW9pemUgbm9kZSBpZiBpdCBkb2Vzbid0IHByb2R1Y2UgYSBmbGFnLgorICBTRE5vZGUgKk47CisgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChWVCk7CisgIGlmIChWVCAhPSBNVlQ6OkZsYWcpIHsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBOMSwgTjIsIE4zIH07CisgICAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgICBBZGROb2RlSUROb2RlKElELCBPcGNvZGUsIFZUcywgT3BzLCAzKTsKKyAgICB2b2lkICpJUCA9IDA7CisgICAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpCisgICAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKworICAgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIFRlcm5hcnlTRE5vZGUoT3Bjb2RlLCBETCwgVlRzLCBOMSwgTjIsIE4zKTsKKyAgICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIH0gZWxzZSB7CisgICAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgVGVybmFyeVNETm9kZShPcGNvZGUsIERMLCBWVHMsIE4xLCBOMiwgTjMpOworICB9CisKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworI2lmbmRlZiBOREVCVUcKKyAgVmVyaWZ5Tm9kZShOKTsKKyNlbmRpZgorICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMiwgU0RWYWx1ZSBOMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjQpIHsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgTjEsIE4yLCBOMywgTjQgfTsKKyAgcmV0dXJuIGdldE5vZGUoT3Bjb2RlLCBETCwgVlQsIE9wcywgNCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE40LCBTRFZhbHVlIE41KSB7CisgIFNEVmFsdWUgT3BzW10gPSB7IE4xLCBOMiwgTjMsIE40LCBONSB9OworICByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVCwgT3BzLCA1KTsKK30KKworLy8vIGdldFN0YWNrQXJndW1lbnRUb2tlbkZhY3RvciAtIENvbXB1dGUgYSBUb2tlbkZhY3RvciB0byBmb3JjZSBhbGwKKy8vLyB0aGUgaW5jb21pbmcgc3RhY2sgYXJndW1lbnRzIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBzdGFjay4KK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRTdGFja0FyZ3VtZW50VG9rZW5GYWN0b3IoU0RWYWx1ZSBDaGFpbikgeworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBBcmdDaGFpbnM7CisKKyAgLy8gSW5jbHVkZSB0aGUgb3JpZ2luYWwgY2hhaW4gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4gV2hlbiB0aGlzIGlzCisgIC8vIHVzZWQgYnkgdGFyZ2V0IExvd2VyQ2FsbCBob29rcywgdGhpcyBoZWxwcyBsZWdhbGl6ZSBmaW5kIHRoZQorICAvLyBDQUxMU0VRX0JFR0lOIG5vZGUuCisgIEFyZ0NoYWlucy5wdXNoX2JhY2soQ2hhaW4pOworCisgIC8vIEFkZCBhIGNoYWluIHZhbHVlIGZvciBlYWNoIHN0YWNrIGFyZ3VtZW50LgorICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIFUgPSBnZXRFbnRyeU5vZGUoKS5nZXROb2RlKCktPnVzZV9iZWdpbigpLAorICAgICAgIFVFID0gZ2V0RW50cnlOb2RlKCkuZ2V0Tm9kZSgpLT51c2VfZW5kKCk7IFUgIT0gVUU7ICsrVSkKKyAgICBpZiAoTG9hZFNETm9kZSAqTCA9IGR5bl9jYXN0PExvYWRTRE5vZGU+KCpVKSkKKyAgICAgIGlmIChGcmFtZUluZGV4U0ROb2RlICpGSSA9IGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KEwtPmdldEJhc2VQdHIoKSkpCisgICAgICAgIGlmIChGSS0+Z2V0SW5kZXgoKSA8IDApCisgICAgICAgICAgQXJnQ2hhaW5zLnB1c2hfYmFjayhTRFZhbHVlKEwsIDEpKTsKKworICAvLyBCdWlsZCBhIHRva2VuZmFjdG9yIGZvciBhbGwgdGhlIGNoYWlucy4KKyAgcmV0dXJuIGdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgQ2hhaW4uZ2V0RGVidWdMb2MoKSwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgJkFyZ0NoYWluc1swXSwgQXJnQ2hhaW5zLnNpemUoKSk7Cit9CisKKy8vLyBnZXRNZW1zZXRWYWx1ZSAtIFZlY3Rvcml6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lbXNldCB2YWx1ZQorLy8vIG9wZXJhbmQuCitzdGF0aWMgU0RWYWx1ZSBnZXRNZW1zZXRWYWx1ZShTRFZhbHVlIFZhbHVlLCBFVlQgVlQsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgYXNzZXJ0KFZhbHVlLmdldE9wY29kZSgpICE9IElTRDo6VU5ERUYpOworCisgIHVuc2lnbmVkIE51bUJpdHMgPSBWVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oVmFsdWUpKSB7CisgICAgQVBJbnQgVmFsID0gQVBJbnQoTnVtQml0cywgQy0+Z2V0WkV4dFZhbHVlKCkgJiAyNTUpOworICAgIHVuc2lnbmVkIFNoaWZ0ID0gODsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBOdW1CaXRzOyBpID4gODsgaSA+Pj0gMSkgeworICAgICAgVmFsID0gKFZhbCA8PCBTaGlmdCkgfCBWYWw7CisgICAgICBTaGlmdCA8PD0gMTsKKyAgICB9CisgICAgaWYgKFZULmlzSW50ZWdlcigpKQorICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudChWYWwsIFZUKTsKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50RlAoQVBGbG9hdChWYWwpLCBWVCk7CisgIH0KKworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpOworICBWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBWVCwgVmFsdWUpOworICB1bnNpZ25lZCBTaGlmdCA9IDg7CisgIGZvciAodW5zaWduZWQgaSA9IE51bUJpdHM7IGkgPiA4OyBpID4+PSAxKSB7CisgICAgVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIFZULCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0U2hpZnRBbW91bnRUeSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7CisgICAgU2hpZnQgPDw9IDE7CisgIH0KKworICByZXR1cm4gVmFsdWU7Cit9CisKKy8vLyBnZXRNZW1zZXRTdHJpbmdWYWwgLSBTaW1pbGFyIHRvIGdldE1lbXNldFZhbHVlLiBFeGNlcHQgdGhpcyBpcyBvbmx5CisvLy8gdXNlZCB3aGVuIGEgbWVtY3B5IGlzIHR1cm5lZCBpbnRvIGEgbWVtc2V0IHdoZW4gdGhlIHNvdXJjZSBpcyBhIGNvbnN0YW50CisvLy8gc3RyaW5nIHB0ci4KK3N0YXRpYyBTRFZhbHVlIGdldE1lbXNldFN0cmluZ1ZhbChFVlQgVlQsIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZTdHIsIHVuc2lnbmVkIE9mZnNldCkgeworICAvLyBIYW5kbGUgdmVjdG9yIHdpdGggYWxsIGVsZW1lbnRzIHplcm8uCisgIGlmIChTdHIuZW1wdHkoKSkgeworICAgIGlmIChWVC5pc0ludGVnZXIoKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpOworICAgIGVsc2UgaWYgKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgPT0gTVZUOjpmMzIgfHwKKyAgICAgICAgICAgICBWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5ID09IE1WVDo6ZjY0KQorICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudEZQKDAuMCwgVlQpOworICAgIGVsc2UgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICAgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgTVZUIEVsdFZUID0gKFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgPT0gTVZUOjpmMzIpID8gTVZUOjppMzIgOiBNVlQ6Omk2NDsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWx0VlQsIE51bUVsdHMpKSk7CisgICAgfSBlbHNlCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJFeHBlY3RlZCB0eXBlISIpOworICB9CisKKyAgYXNzZXJ0KCFWVC5pc1ZlY3RvcigpICYmICJDYW4ndCBoYW5kbGUgdmVjdG9yIHR5cGUgaGVyZSEiKTsKKyAgdW5zaWduZWQgTnVtQml0cyA9IFZULmdldFNpemVJbkJpdHMoKTsKKyAgdW5zaWduZWQgTVNCID0gTnVtQml0cyAvIDg7CisgIHVpbnQ2NF90IFZhbCA9IDA7CisgIGlmIChUTEkuaXNMaXR0bGVFbmRpYW4oKSkKKyAgICBPZmZzZXQgPSBPZmZzZXQgKyBNU0IgLSAxOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE1TQjsgKytpKSB7CisgICAgVmFsID0gKFZhbCA8PCA4KSB8ICh1bnNpZ25lZCBjaGFyKVN0cltPZmZzZXRdOworICAgIE9mZnNldCArPSBUTEkuaXNMaXR0bGVFbmRpYW4oKSA/IC0xIDogMTsKKyAgfQorICByZXR1cm4gREFHLmdldENvbnN0YW50KFZhbCwgVlQpOworfQorCisvLy8gZ2V0TWVtQmFzZVBsdXNPZmZzZXQgLSBSZXR1cm5zIGJhc2UgYW5kIG9mZnNldCBub2RlIGZvciB0aGUKKy8vLworc3RhdGljIFNEVmFsdWUgZ2V0TWVtQmFzZVBsdXNPZmZzZXQoU0RWYWx1ZSBCYXNlLCB1bnNpZ25lZCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIEVWVCBWVCA9IEJhc2UuZ2V0VmFsdWVUeXBlKCk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgQmFzZS5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgVlQsIEJhc2UsIERBRy5nZXRDb25zdGFudChPZmZzZXQsIFZUKSk7Cit9CisKKy8vLyBpc01lbVNyY0Zyb21TdHJpbmcgLSBSZXR1cm5zIHRydWUgaWYgbWVtY3B5IHNvdXJjZSBpcyBhIHN0cmluZyBjb25zdGFudC4KKy8vLworc3RhdGljIGJvb2wgaXNNZW1TcmNGcm9tU3RyaW5nKFNEVmFsdWUgU3JjLCBzdGQ6OnN0cmluZyAmU3RyKSB7CisgIHVuc2lnbmVkIFNyY0RlbHRhID0gMDsKKyAgR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IE5VTEw7CisgIGlmIChTcmMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpHbG9iYWxBZGRyZXNzKQorICAgIEcgPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KFNyYyk7CisgIGVsc2UgaWYgKFNyYy5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCAmJgorICAgICAgICAgICBTcmMuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBJU0Q6Okdsb2JhbEFkZHJlc3MgJiYKKyAgICAgICAgICAgU3JjLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCkgeworICAgIEcgPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KFNyYy5nZXRPcGVyYW5kKDApKTsKKyAgICBTcmNEZWx0YSA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KFNyYy5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCk7CisgIH0KKyAgaWYgKCFHKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oRy0+Z2V0R2xvYmFsKCkpOworICBpZiAoR1YgJiYgR2V0Q29uc3RhbnRTdHJpbmdJbmZvKEdWLCBTdHIsIFNyY0RlbHRhLCBmYWxzZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gRmluZE9wdGltYWxNZW1PcExvd2VyaW5nIC0gRGV0ZXJtaW5lcyB0aGUgb3B0aW1pYWwgc2VyaWVzIG1lbW9yeSBvcHMKKy8vLyB0byByZXBsYWNlIHRoZSBtZW1zZXQgLyBtZW1jcHkuIFJldHVybiB0cnVlIGlmIHRoZSBudW1iZXIgb2YgbWVtb3J5IG9wcworLy8vIGlzIGJlbG93IHRoZSB0aHJlc2hvbGQuIEl0IHJldHVybnMgdGhlIHR5cGVzIG9mIHRoZSBzZXF1ZW5jZSBvZgorLy8vIG1lbW9yeSBvcHMgdG8gcGVyZm9ybSBtZW1zZXQgLyBtZW1jcHkgYnkgcmVmZXJlbmNlLgorc3RhdGljIGJvb2wgRmluZE9wdGltYWxNZW1PcExvd2VyaW5nKHN0ZDo6dmVjdG9yPEVWVD4gJk1lbU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW1pdCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEc3RBbGlnbiwgdW5zaWduZWQgU3JjQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb25TY2FsYXJJbnRTYWZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWVtY3B5U3RyU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpIHsKKyAgYXNzZXJ0KChTcmNBbGlnbiA9PSAwIHx8IFNyY0FsaWduID49IERzdEFsaWduKSAmJgorICAgICAgICAgIkV4cGVjdGluZyBtZW1jcHkgLyBtZW1zZXQgc291cmNlIHRvIG1lZXQgYWxpZ25tZW50IHJlcXVpcmVtZW50ISIpOworICAvLyBJZiAnU3JjQWxpZ24nIGlzIHplcm8sIHRoYXQgbWVhbnMgdGhlIG1lbW9yeSBvcGVyYXRpb24gZG9lcyBub3QgbmVlZCBsb2FkCisgIC8vIHRoZSB2YWx1ZSwgaS5lLiBtZW1zZXQgb3IgbWVtY3B5IGZyb20gY29uc3RhbnQgc3RyaW5nLiBPdGhlcndpc2UsIGl0J3MKKyAgLy8gdGhlIGluZmVycmVkIGFsaWdubWVudCBvZiB0aGUgc291cmNlLiAnRHN0QWxpZ24nLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgdGhlCisgIC8vIHNwZWNpZmllZCBhbGlnbm1lbnQgb2YgdGhlIG1lbW9yeSBvcGVyYXRpb24uIElmIGl0IGlzIHplcm8sIHRoYXQgbWVhbnMKKyAgLy8gaXQncyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGFsaWdubWVudCBvZiB0aGUgZGVzdGluYXRpb24uICdNZW1jcHlTdHJTcmMnCisgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZW1jcHkgc291cmNlIGlzIGNvbnN0YW50IHNvIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUKKyAgLy8gbG9hZGVkLgorICBFVlQgVlQgPSBUTEkuZ2V0T3B0aW1hbE1lbU9wVHlwZShTaXplLCBEc3RBbGlnbiwgU3JjQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vblNjYWxhckludFNhZmUsIE1lbWNweVN0clNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE1hY2hpbmVGdW5jdGlvbigpKTsKKworICBpZiAoVlQgPT0gTVZUOjpPdGhlcikgeworICAgIGlmIChEc3RBbGlnbiA+PSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRQb2ludGVyUHJlZkFsaWdubWVudCgpIHx8CisgICAgICAgIFRMSS5hbGxvd3NVbmFsaWduZWRNZW1vcnlBY2Nlc3NlcyhWVCkpIHsKKyAgICAgIFZUID0gVExJLmdldFBvaW50ZXJUeSgpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKERzdEFsaWduICYgNykgeworICAgICAgY2FzZSAwOiAgVlQgPSBNVlQ6Omk2NDsgYnJlYWs7CisgICAgICBjYXNlIDQ6ICBWVCA9IE1WVDo6aTMyOyBicmVhazsKKyAgICAgIGNhc2UgMjogIFZUID0gTVZUOjppMTY7IGJyZWFrOworICAgICAgZGVmYXVsdDogVlQgPSBNVlQ6Omk4OyAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgTVZUIExWVCA9IE1WVDo6aTY0OworICAgIHdoaWxlICghVExJLmlzVHlwZUxlZ2FsKExWVCkpCisgICAgICBMVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKExWVC5TaW1wbGVUeSAtIDEpOworICAgIGFzc2VydChMVlQuaXNJbnRlZ2VyKCkpOworCisgICAgaWYgKFZULmJpdHNHVChMVlQpKQorICAgICAgVlQgPSBMVlQ7CisgIH0KKyAgCisgIC8vIElmIHdlJ3JlIG9wdGltaXppbmcgZm9yIHNpemUsIGFuZCB0aGVyZSBpcyBhIGxpbWl0LCBidW1wIHRoZSBtYXhpbXVtIG51bWJlcgorICAvLyBvZiBvcGVyYXRpb25zIGluc2VydGVkIGRvd24gdG8gNC4gIFRoaXMgaXMgYSB3aWxkIGd1ZXNzIHRoYXQgYXBwcm94aW1hdGVzCisgIC8vIHRoZSBzaXplIG9mIGEgY2FsbCB0byBtZW1jcHkgb3IgbWVtc2V0ICgzIGFyZ3VtZW50cyArIGNhbGwpLgorICBpZiAoTGltaXQgIT0gfjBVKSB7CisgICAgY29uc3QgRnVuY3Rpb24gKkYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnVuY3Rpb24oKTsKKyAgICBpZiAoRi0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6T3B0aW1pemVGb3JTaXplKSkKKyAgICAgIExpbWl0ID0gNDsKKyAgfQorCisgIHVuc2lnbmVkIE51bU1lbU9wcyA9IDA7CisgIHdoaWxlIChTaXplICE9IDApIHsKKyAgICB1bnNpZ25lZCBWVFNpemUgPSBWVC5nZXRTaXplSW5CaXRzKCkgLyA4OworICAgIHdoaWxlIChWVFNpemUgPiBTaXplKSB7CisgICAgICAvLyBGb3Igbm93LCBvbmx5IHVzZSBub24tdmVjdG9yIGxvYWQgLyBzdG9yZSdzIGZvciB0aGUgbGVmdC1vdmVyIHBpZWNlcy4KKyAgICAgIGlmIChWVC5pc1ZlY3RvcigpIHx8IFZULmlzRmxvYXRpbmdQb2ludCgpKSB7CisgICAgICAgIFZUID0gTVZUOjppNjQ7CisgICAgICAgIHdoaWxlICghVExJLmlzVHlwZUxlZ2FsKFZUKSkKKyAgICAgICAgICBWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSAtIDEpOworICAgICAgICBWVFNpemUgPSBWVC5nZXRTaXplSW5CaXRzKCkgLyA4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gcmVzdWx0IGluIGEgdHlwZSB0aGF0IGlzIG5vdCBsZWdhbCBvbiB0aGUgdGFyZ2V0LCBlLmcuCisgICAgICAgIC8vIDEgb3IgMiBieXRlcyBvbiBQUEMuCisgICAgICAgIFZUID0gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5IC0gMSk7CisgICAgICAgIFZUU2l6ZSA+Pj0gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKytOdW1NZW1PcHMgPiBMaW1pdCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBNZW1PcHMucHVzaF9iYWNrKFZUKTsKKyAgICBTaXplIC09IFZUU2l6ZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgU0RWYWx1ZSBnZXRNZW1jcHlMb2Fkc0FuZFN0b3JlcyhTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU3JjLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIGJvb2wgaXNWb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsd2F5c0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpEc3RTViwgdWludDY0X3QgRHN0U1ZPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqU3JjU1YsIHVpbnQ2NF90IFNyY1NWT2ZmKSB7CisgIC8vIFR1cm4gYSBtZW1jcHkgb2YgdW5kZWYgdG8gbm9wLgorICBpZiAoU3JjLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgcmV0dXJuIENoYWluOworCisgIC8vIEV4cGFuZCBtZW1jcHkgdG8gYSBzZXJpZXMgb2YgbG9hZCBhbmQgc3RvcmUgb3BzIGlmIHRoZSBzaXplIG9wZXJhbmQgZmFsbHMKKyAgLy8gYmVsb3cgYSBjZXJ0YWluIHRocmVzaG9sZC4KKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSA9IERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKTsKKyAgc3RkOjp2ZWN0b3I8RVZUPiBNZW1PcHM7CisgIGJvb2wgRHN0QWxpZ25DYW5DaGFuZ2UgPSBmYWxzZTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZyYW1lSW5mbygpOworICBGcmFtZUluZGV4U0ROb2RlICpGSSA9IGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KERzdCk7CisgIGlmIChGSSAmJiAhTUZJLT5pc0ZpeGVkT2JqZWN0SW5kZXgoRkktPmdldEluZGV4KCkpKQorICAgIERzdEFsaWduQ2FuQ2hhbmdlID0gdHJ1ZTsKKyAgdW5zaWduZWQgU3JjQWxpZ24gPSBEQUcuSW5mZXJQdHJBbGlnbm1lbnQoU3JjKTsKKyAgaWYgKEFsaWduID4gU3JjQWxpZ24pCisgICAgU3JjQWxpZ24gPSBBbGlnbjsKKyAgc3RkOjpzdHJpbmcgU3RyOworICBib29sIENvcHlGcm9tU3RyID0gaXNNZW1TcmNGcm9tU3RyaW5nKFNyYywgU3RyKTsKKyAgYm9vbCBpc1plcm9TdHIgPSBDb3B5RnJvbVN0ciAmJiBTdHIuZW1wdHkoKTsKKyAgdW5zaWduZWQgTGltaXQgPSBBbHdheXNJbmxpbmUgPyB+MFUgOiBUTEkuZ2V0TWF4U3RvcmVzUGVyTWVtY3B5KCk7CisgIAorICBpZiAoIUZpbmRPcHRpbWFsTWVtT3BMb3dlcmluZyhNZW1PcHMsIExpbWl0LCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRHN0QWxpZ25DYW5DaGFuZ2UgPyAwIDogQWxpZ24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNaZXJvU3RyID8gMCA6IFNyY0FsaWduKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgQ29weUZyb21TdHIsIERBRywgVExJKSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIGlmIChEc3RBbGlnbkNhbkNoYW5nZSkgeworICAgIGNvbnN0IFR5cGUgKlR5ID0gTWVtT3BzWzBdLmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpOworICAgIHVuc2lnbmVkIE5ld0FsaWduID0gKHVuc2lnbmVkKSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRBQklUeXBlQWxpZ25tZW50KFR5KTsKKyAgICBpZiAoTmV3QWxpZ24gPiBBbGlnbikgeworICAgICAgLy8gR2l2ZSB0aGUgc3RhY2sgZnJhbWUgb2JqZWN0IGEgbGFyZ2VyIGFsaWdubWVudCBpZiBuZWVkZWQuCisgICAgICBpZiAoTUZJLT5nZXRPYmplY3RBbGlnbm1lbnQoRkktPmdldEluZGV4KCkpIDwgTmV3QWxpZ24pCisgICAgICAgIE1GSS0+c2V0T2JqZWN0QWxpZ25tZW50KEZJLT5nZXRJbmRleCgpLCBOZXdBbGlnbik7CisgICAgICBBbGlnbiA9IE5ld0FsaWduOworICAgIH0KKyAgfQorCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE91dENoYWluczsKKyAgdW5zaWduZWQgTnVtTWVtT3BzID0gTWVtT3BzLnNpemUoKTsKKyAgdWludDY0X3QgU3JjT2ZmID0gMCwgRHN0T2ZmID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1NZW1PcHM7ICsraSkgeworICAgIEVWVCBWVCA9IE1lbU9wc1tpXTsKKyAgICB1bnNpZ25lZCBWVFNpemUgPSBWVC5nZXRTaXplSW5CaXRzKCkgLyA4OworICAgIFNEVmFsdWUgVmFsdWUsIFN0b3JlOworCisgICAgaWYgKENvcHlGcm9tU3RyICYmCisgICAgICAgIChpc1plcm9TdHIgfHwgKFZULmlzSW50ZWdlcigpICYmICFWVC5pc1ZlY3RvcigpKSkpIHsKKyAgICAgIC8vIEl0J3MgdW5saWtlbHkgYSBzdG9yZSBvZiBhIHZlY3RvciBpbW1lZGlhdGUgY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUKKyAgICAgIC8vIGluc3RydWN0aW9uLiBJdCB3b3VsZCByZXF1aXJlIGEgbG9hZCBmcm9tIGEgY29uc3RhbnRwb29sIGZpcnN0LgorICAgICAgLy8gV2Ugb25seSBoYW5kbGUgemVybyB2ZWN0b3JzIGhlcmUuCisgICAgICAvLyBGSVhNRTogSGFuZGxlIG90aGVyIGNhc2VzIHdoZXJlIHN0b3JlIG9mIHZlY3RvciBpbW1lZGlhdGUgaXMgZG9uZSBpbgorICAgICAgLy8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgICAgICBWYWx1ZSA9IGdldE1lbXNldFN0cmluZ1ZhbChWVCwgZGwsIERBRywgVExJLCBTdHIsIFNyY09mZik7CisgICAgICBTdG9yZSA9IERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVtQmFzZVBsdXNPZmZzZXQoRHN0LCBEc3RPZmYsIERBRyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEc3RTViwgRHN0U1ZPZmYgKyBEc3RPZmYsIGlzVm9sLCBmYWxzZSwgQWxpZ24pOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgdHlwZSBtaWdodCBub3QgYmUgbGVnYWwgZm9yIHRoZSB0YXJnZXQuICBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbgorICAgICAgLy8gaWYgdGhlIHR5cGUgaXMgc21hbGxlciB0aGFuIGEgbGVnYWwgdHlwZSwgYXMgb24gUFBDLCBzbyB0aGUgcmlnaHQKKyAgICAgIC8vIHRoaW5nIHRvIGRvIGlzIGdlbmVyYXRlIGEgTG9hZEV4dC9TdG9yZVRydW5jIHBhaXIuICBUaGVzZSBzaW1wbGlmeQorICAgICAgLy8gdG8gTG9hZC9TdG9yZSBpZiBOVlQ9PVZULgorICAgICAgLy8gRklYTUUgZG9lcyB0aGUgY2FzZSBhYm92ZSBhbHNvIG5lZWQgdGhpcz8KKyAgICAgIEVWVCBOVlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oKkRBRy5nZXRDb250ZXh0KCksIFZUKTsKKyAgICAgIGFzc2VydChOVlQuYml0c0dFKFZUKSk7CisgICAgICBWYWx1ZSA9IERBRy5nZXRFeHRMb2FkKElTRDo6RVhUTE9BRCwgTlZULCBkbCwgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1lbUJhc2VQbHVzT2Zmc2V0KFNyYywgU3JjT2ZmLCBEQUcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNTViwgU3JjU1ZPZmYgKyBTcmNPZmYsIFZULCBpc1ZvbCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbkFsaWduKFNyY0FsaWduLCBTcmNPZmYpKTsKKyAgICAgIFN0b3JlID0gREFHLmdldFRydW5jU3RvcmUoQ2hhaW4sIGRsLCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVtQmFzZVBsdXNPZmZzZXQoRHN0LCBEc3RPZmYsIERBRyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERzdFNWLCBEc3RTVk9mZiArIERzdE9mZiwgVlQsIGlzVm9sLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ24pOworICAgIH0KKyAgICBPdXRDaGFpbnMucHVzaF9iYWNrKFN0b3JlKTsKKyAgICBTcmNPZmYgKz0gVlRTaXplOworICAgIERzdE9mZiArPSBWVFNpemU7CisgIH0KKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAmT3V0Q2hhaW5zWzBdLCBPdXRDaGFpbnMuc2l6ZSgpKTsKK30KKworc3RhdGljIFNEVmFsdWUgZ2V0TWVtbW92ZUxvYWRzQW5kU3RvcmVzKFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNyYywgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgIGJvb2wgaXNWb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbHdheXNJbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkRzdFNWLCB1aW50NjRfdCBEc3RTVk9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqU3JjU1YsIHVpbnQ2NF90IFNyY1NWT2ZmKSB7CisgIC8vIFR1cm4gYSBtZW1tb3ZlIG9mIHVuZGVmIHRvIG5vcC4KKyAgaWYgKFNyYy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgIHJldHVybiBDaGFpbjsKKworICAvLyBFeHBhbmQgbWVtbW92ZSB0byBhIHNlcmllcyBvZiBsb2FkIGFuZCBzdG9yZSBvcHMgaWYgdGhlIHNpemUgb3BlcmFuZCBmYWxscworICAvLyBiZWxvdyBhIGNlcnRhaW4gdGhyZXNob2xkLgorICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpOworICBzdGQ6OnZlY3RvcjxFVlQ+IE1lbU9wczsKKyAgYm9vbCBEc3RBbGlnbkNhbkNoYW5nZSA9IGZhbHNlOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnJhbWVJbmZvKCk7CisgIEZyYW1lSW5kZXhTRE5vZGUgKkZJID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4oRHN0KTsKKyAgaWYgKEZJICYmICFNRkktPmlzRml4ZWRPYmplY3RJbmRleChGSS0+Z2V0SW5kZXgoKSkpCisgICAgRHN0QWxpZ25DYW5DaGFuZ2UgPSB0cnVlOworICB1bnNpZ25lZCBTcmNBbGlnbiA9IERBRy5JbmZlclB0ckFsaWdubWVudChTcmMpOworICBpZiAoQWxpZ24gPiBTcmNBbGlnbikKKyAgICBTcmNBbGlnbiA9IEFsaWduOworICB1bnNpZ25lZCBMaW1pdCA9IEFsd2F5c0lubGluZSA/IH4wVSA6IFRMSS5nZXRNYXhTdG9yZXNQZXJNZW1tb3ZlKCk7CisKKyAgaWYgKCFGaW5kT3B0aW1hbE1lbU9wTG93ZXJpbmcoTWVtT3BzLCBMaW1pdCwgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERzdEFsaWduQ2FuQ2hhbmdlID8gMCA6IEFsaWduKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjQWxpZ24sIHRydWUsIGZhbHNlLCBEQUcsIFRMSSkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBpZiAoRHN0QWxpZ25DYW5DaGFuZ2UpIHsKKyAgICBjb25zdCBUeXBlICpUeSA9IE1lbU9wc1swXS5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgICB1bnNpZ25lZCBOZXdBbGlnbiA9ICh1bnNpZ25lZCkgVExJLmdldFRhcmdldERhdGEoKS0+Z2V0QUJJVHlwZUFsaWdubWVudChUeSk7CisgICAgaWYgKE5ld0FsaWduID4gQWxpZ24pIHsKKyAgICAgIC8vIEdpdmUgdGhlIHN0YWNrIGZyYW1lIG9iamVjdCBhIGxhcmdlciBhbGlnbm1lbnQgaWYgbmVlZGVkLgorICAgICAgaWYgKE1GSS0+Z2V0T2JqZWN0QWxpZ25tZW50KEZJLT5nZXRJbmRleCgpKSA8IE5ld0FsaWduKQorICAgICAgICBNRkktPnNldE9iamVjdEFsaWdubWVudChGSS0+Z2V0SW5kZXgoKSwgTmV3QWxpZ24pOworICAgICAgQWxpZ24gPSBOZXdBbGlnbjsKKyAgICB9CisgIH0KKworICB1aW50NjRfdCBTcmNPZmYgPSAwLCBEc3RPZmYgPSAwOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBMb2FkVmFsdWVzOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBMb2FkQ2hhaW5zOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPdXRDaGFpbnM7CisgIHVuc2lnbmVkIE51bU1lbU9wcyA9IE1lbU9wcy5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1NZW1PcHM7IGkrKykgeworICAgIEVWVCBWVCA9IE1lbU9wc1tpXTsKKyAgICB1bnNpZ25lZCBWVFNpemUgPSBWVC5nZXRTaXplSW5CaXRzKCkgLyA4OworICAgIFNEVmFsdWUgVmFsdWUsIFN0b3JlOworCisgICAgVmFsdWUgPSBEQUcuZ2V0TG9hZChWVCwgZGwsIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVtQmFzZVBsdXNPZmZzZXQoU3JjLCBTcmNPZmYsIERBRyksCisgICAgICAgICAgICAgICAgICAgICAgICBTcmNTViwgU3JjU1ZPZmYgKyBTcmNPZmYsIGlzVm9sLCBmYWxzZSwgU3JjQWxpZ24pOworICAgIExvYWRWYWx1ZXMucHVzaF9iYWNrKFZhbHVlKTsKKyAgICBMb2FkQ2hhaW5zLnB1c2hfYmFjayhWYWx1ZS5nZXRWYWx1ZSgxKSk7CisgICAgU3JjT2ZmICs9IFZUU2l6ZTsKKyAgfQorICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICZMb2FkQ2hhaW5zWzBdLCBMb2FkQ2hhaW5zLnNpemUoKSk7CisgIE91dENoYWlucy5jbGVhcigpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtTWVtT3BzOyBpKyspIHsKKyAgICBFVlQgVlQgPSBNZW1PcHNbaV07CisgICAgdW5zaWduZWQgVlRTaXplID0gVlQuZ2V0U2l6ZUluQml0cygpIC8gODsKKyAgICBTRFZhbHVlIFZhbHVlLCBTdG9yZTsKKworICAgIFN0b3JlID0gREFHLmdldFN0b3JlKENoYWluLCBkbCwgTG9hZFZhbHVlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNZW1CYXNlUGx1c09mZnNldChEc3QsIERzdE9mZiwgREFHKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEc3RTViwgRHN0U1ZPZmYgKyBEc3RPZmYsIGlzVm9sLCBmYWxzZSwgQWxpZ24pOworICAgIE91dENoYWlucy5wdXNoX2JhY2soU3RvcmUpOworICAgIERzdE9mZiArPSBWVFNpemU7CisgIH0KKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAmT3V0Q2hhaW5zWzBdLCBPdXRDaGFpbnMuc2l6ZSgpKTsKK30KKworc3RhdGljIFNEVmFsdWUgZ2V0TWVtc2V0U3RvcmVzKFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNyYywgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgYm9vbCBpc1ZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqRHN0U1YsIHVpbnQ2NF90IERzdFNWT2ZmKSB7CisgIC8vIFR1cm4gYSBtZW1zZXQgb2YgdW5kZWYgdG8gbm9wLgorICBpZiAoU3JjLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgcmV0dXJuIENoYWluOworCisgIC8vIEV4cGFuZCBtZW1zZXQgdG8gYSBzZXJpZXMgb2YgbG9hZC9zdG9yZSBvcHMgaWYgdGhlIHNpemUgb3BlcmFuZAorICAvLyBmYWxscyBiZWxvdyBhIGNlcnRhaW4gdGhyZXNob2xkLgorICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpOworICBzdGQ6OnZlY3RvcjxFVlQ+IE1lbU9wczsKKyAgYm9vbCBEc3RBbGlnbkNhbkNoYW5nZSA9IGZhbHNlOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnJhbWVJbmZvKCk7CisgIEZyYW1lSW5kZXhTRE5vZGUgKkZJID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4oRHN0KTsKKyAgaWYgKEZJICYmICFNRkktPmlzRml4ZWRPYmplY3RJbmRleChGSS0+Z2V0SW5kZXgoKSkpCisgICAgRHN0QWxpZ25DYW5DaGFuZ2UgPSB0cnVlOworICBib29sIE5vblNjYWxhckludFNhZmUgPQorICAgIGlzYTxDb25zdGFudFNETm9kZT4oU3JjKSAmJiBjYXN0PENvbnN0YW50U0ROb2RlPihTcmMpLT5pc051bGxWYWx1ZSgpOworICBpZiAoIUZpbmRPcHRpbWFsTWVtT3BMb3dlcmluZyhNZW1PcHMsIFRMSS5nZXRNYXhTdG9yZXNQZXJNZW1zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSwgKERzdEFsaWduQ2FuQ2hhbmdlID8gMCA6IEFsaWduKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uU2NhbGFySW50U2FmZSwgZmFsc2UsIERBRywgVExJKSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIGlmIChEc3RBbGlnbkNhbkNoYW5nZSkgeworICAgIGNvbnN0IFR5cGUgKlR5ID0gTWVtT3BzWzBdLmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpOworICAgIHVuc2lnbmVkIE5ld0FsaWduID0gKHVuc2lnbmVkKSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRBQklUeXBlQWxpZ25tZW50KFR5KTsKKyAgICBpZiAoTmV3QWxpZ24gPiBBbGlnbikgeworICAgICAgLy8gR2l2ZSB0aGUgc3RhY2sgZnJhbWUgb2JqZWN0IGEgbGFyZ2VyIGFsaWdubWVudCBpZiBuZWVkZWQuCisgICAgICBpZiAoTUZJLT5nZXRPYmplY3RBbGlnbm1lbnQoRkktPmdldEluZGV4KCkpIDwgTmV3QWxpZ24pCisgICAgICAgIE1GSS0+c2V0T2JqZWN0QWxpZ25tZW50KEZJLT5nZXRJbmRleCgpLCBOZXdBbGlnbik7CisgICAgICBBbGlnbiA9IE5ld0FsaWduOworICAgIH0KKyAgfQorCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE91dENoYWluczsKKyAgdWludDY0X3QgRHN0T2ZmID0gMDsKKyAgdW5zaWduZWQgTnVtTWVtT3BzID0gTWVtT3BzLnNpemUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bU1lbU9wczsgaSsrKSB7CisgICAgRVZUIFZUID0gTWVtT3BzW2ldOworICAgIHVuc2lnbmVkIFZUU2l6ZSA9IFZULmdldFNpemVJbkJpdHMoKSAvIDg7CisgICAgU0RWYWx1ZSBWYWx1ZSA9IGdldE1lbXNldFZhbHVlKFNyYywgVlQsIERBRywgZGwpOworICAgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1lbUJhc2VQbHVzT2Zmc2V0KERzdCwgRHN0T2ZmLCBEQUcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0U1YsIERzdFNWT2ZmICsgRHN0T2ZmLCBpc1ZvbCwgZmFsc2UsIDApOworICAgIE91dENoYWlucy5wdXNoX2JhY2soU3RvcmUpOworICAgIERzdE9mZiArPSBWVFNpemU7CisgIH0KKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAmT3V0Q2hhaW5zWzBdLCBPdXRDaGFpbnMuc2l6ZSgpKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE1lbWNweShTRFZhbHVlIENoYWluLCBEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU3JjLCBTRFZhbHVlIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBib29sIGlzVm9sLCBib29sIEFsd2F5c0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkRzdFNWLCB1aW50NjRfdCBEc3RTVk9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNyY1NWLCB1aW50NjRfdCBTcmNTVk9mZikgeworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgbG93ZXIgdGhlIG1lbWNweSB0byBsb2FkcyBhbmQgc3RvcmVzIGZpcnN0LgorICAvLyBGb3IgY2FzZXMgd2l0aGluIHRoZSB0YXJnZXQtc3BlY2lmaWVkIGxpbWl0cywgdGhpcyBpcyB0aGUgYmVzdCBjaG9pY2UuCisgIENvbnN0YW50U0ROb2RlICpDb25zdGFudFNpemUgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oU2l6ZSk7CisgIGlmIChDb25zdGFudFNpemUpIHsKKyAgICAvLyBNZW1jcHkgd2l0aCBzaXplIHplcm8/IEp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBjaGFpbi4KKyAgICBpZiAoQ29uc3RhbnRTaXplLT5pc051bGxWYWx1ZSgpKQorICAgICAgcmV0dXJuIENoYWluOworCisgICAgU0RWYWx1ZSBSZXN1bHQgPSBnZXRNZW1jcHlMb2Fkc0FuZFN0b3JlcygqdGhpcywgZGwsIENoYWluLCBEc3QsIFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50U2l6ZS0+Z2V0WkV4dFZhbHVlKCksQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVm9sLCBmYWxzZSwgRHN0U1YsIERzdFNWT2ZmLCBTcmNTViwgU3JjU1ZPZmYpOworICAgIGlmIChSZXN1bHQuZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vIFRoZW4gY2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBsb3dlciB0aGUgbWVtY3B5IHdpdGggdGFyZ2V0LXNwZWNpZmljCisgIC8vIGNvZGUuIElmIHRoZSB0YXJnZXQgY2hvb3NlcyB0byBkbyB0aGlzLCB0aGlzIGlzIHRoZSBuZXh0IGJlc3QuCisgIFNEVmFsdWUgUmVzdWx0ID0KKyAgICBUU0kuRW1pdFRhcmdldENvZGVGb3JNZW1jcHkoKnRoaXMsIGRsLCBDaGFpbiwgRHN0LCBTcmMsIFNpemUsIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZvbCwgQWx3YXlzSW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEc3RTViwgRHN0U1ZPZmYsIFNyY1NWLCBTcmNTVk9mZik7CisgIGlmIChSZXN1bHQuZ2V0Tm9kZSgpKQorICAgIHJldHVybiBSZXN1bHQ7CisKKyAgLy8gSWYgd2UgcmVhbGx5IG5lZWQgaW5saW5lIGNvZGUgYW5kIHRoZSB0YXJnZXQgZGVjbGluZWQgdG8gcHJvdmlkZSBpdCwKKyAgLy8gdXNlIGEgKHBvdGVudGlhbGx5IGxvbmcpIHNlcXVlbmNlIG9mIGxvYWRzIGFuZCBzdG9yZXMuCisgIGlmIChBbHdheXNJbmxpbmUpIHsKKyAgICBhc3NlcnQoQ29uc3RhbnRTaXplICYmICJBbHdheXNJbmxpbmUgcmVxdWlyZXMgYSBjb25zdGFudCBzaXplISIpOworICAgIHJldHVybiBnZXRNZW1jcHlMb2Fkc0FuZFN0b3JlcygqdGhpcywgZGwsIENoYWluLCBEc3QsIFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRTaXplLT5nZXRaRXh0VmFsdWUoKSwgQWxpZ24sIGlzVm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBEc3RTViwgRHN0U1ZPZmYsIFNyY1NWLCBTcmNTVk9mZik7CisgIH0KKworICAvLyBGSVhNRTogSWYgdGhlIG1lbWNweSBpcyB2b2xhdGlsZSAoaXNWb2wpLCBsb3dlcmluZyBpdCB0byBhIHBsYWluIGxpYmMKKyAgLy8gbWVtY3B5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHNhZmUuIGxpYmMgbWVtY3B5cyBhcmVuJ3QgcmVxdWlyZWQgdG8KKyAgLy8gcmVzcGVjdCB2b2xhdGlsZSwgc28gdGhleSBtYXkgZG8gdGhpbmdzIGxpa2UgcmVhZCBvciB3cml0ZSBtZW1vcnkKKyAgLy8gYmV5b25kIHRoZSBnaXZlbiBtZW1vcnkgcmVnaW9ucy4gQnV0IGZpeGluZyB0aGlzIGlzbid0IGVhc3ksIGFuZCBtb3N0CisgIC8vIHBlb3BsZSBkb24ndCBjYXJlLgorCisgIC8vIEVtaXQgYSBsaWJyYXJ5IGNhbGwuCisgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0VHkgQXJnczsKKyAgVGFyZ2V0TG93ZXJpbmc6OkFyZ0xpc3RFbnRyeSBFbnRyeTsKKyAgRW50cnkuVHkgPSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRJbnRQdHJUeXBlKCpnZXRDb250ZXh0KCkpOworICBFbnRyeS5Ob2RlID0gRHN0OyBBcmdzLnB1c2hfYmFjayhFbnRyeSk7CisgIEVudHJ5Lk5vZGUgPSBTcmM7IEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKyAgRW50cnkuTm9kZSA9IFNpemU7IEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKyAgLy8gRklYTUU6IHBhc3MgaW4gRGVidWdMb2MKKyAgc3RkOjpwYWlyPFNEVmFsdWUsU0RWYWx1ZT4gQ2FsbFJlc3VsdCA9CisgICAgVExJLkxvd2VyQ2FsbFRvKENoYWluLCBUeXBlOjpnZXRWb2lkVHkoKmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLAorICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0TGliY2FsbENhbGxpbmdDb252KFJUTElCOjpNRU1DUFkpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLyppc1JldHVyblZhbHVlVXNlZD0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICBnZXRFeHRlcm5hbFN5bWJvbChUTEkuZ2V0TGliY2FsbE5hbWUoUlRMSUI6Ok1FTUNQWSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSksCisgICAgICAgICAgICAgICAgICAgIEFyZ3MsICp0aGlzLCBkbCk7CisgIHJldHVybiBDYWxsUmVzdWx0LnNlY29uZDsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE1lbW1vdmUoU0RWYWx1ZSBDaGFpbiwgRGVidWdMb2MgZGwsIFNEVmFsdWUgRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTcmMsIFNEVmFsdWUgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBib29sIGlzVm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkRzdFNWLCB1aW50NjRfdCBEc3RTVk9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpTcmNTViwgdWludDY0X3QgU3JjU1ZPZmYpIHsKKworICAvLyBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIGxvd2VyIHRoZSBtZW1tb3ZlIHRvIGxvYWRzIGFuZCBzdG9yZXMgZmlyc3QuCisgIC8vIEZvciBjYXNlcyB3aXRoaW4gdGhlIHRhcmdldC1zcGVjaWZpZWQgbGltaXRzLCB0aGlzIGlzIHRoZSBiZXN0IGNob2ljZS4KKyAgQ29uc3RhbnRTRE5vZGUgKkNvbnN0YW50U2l6ZSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihTaXplKTsKKyAgaWYgKENvbnN0YW50U2l6ZSkgeworICAgIC8vIE1lbW1vdmUgd2l0aCBzaXplIHplcm8/IEp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBjaGFpbi4KKyAgICBpZiAoQ29uc3RhbnRTaXplLT5pc051bGxWYWx1ZSgpKQorICAgICAgcmV0dXJuIENoYWluOworCisgICAgU0RWYWx1ZSBSZXN1bHQgPQorICAgICAgZ2V0TWVtbW92ZUxvYWRzQW5kU3RvcmVzKCp0aGlzLCBkbCwgQ2hhaW4sIERzdCwgU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50U2l6ZS0+Z2V0WkV4dFZhbHVlKCksIEFsaWduLCBpc1ZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgRHN0U1YsIERzdFNWT2ZmLCBTcmNTViwgU3JjU1ZPZmYpOworICAgIGlmIChSZXN1bHQuZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vIFRoZW4gY2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBsb3dlciB0aGUgbWVtbW92ZSB3aXRoIHRhcmdldC1zcGVjaWZpYworICAvLyBjb2RlLiBJZiB0aGUgdGFyZ2V0IGNob29zZXMgdG8gZG8gdGhpcywgdGhpcyBpcyB0aGUgbmV4dCBiZXN0LgorICBTRFZhbHVlIFJlc3VsdCA9CisgICAgVFNJLkVtaXRUYXJnZXRDb2RlRm9yTWVtbW92ZSgqdGhpcywgZGwsIENoYWluLCBEc3QsIFNyYywgU2l6ZSwgQWxpZ24sIGlzVm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0U1YsIERzdFNWT2ZmLCBTcmNTViwgU3JjU1ZPZmYpOworICBpZiAoUmVzdWx0LmdldE5vZGUoKSkKKyAgICByZXR1cm4gUmVzdWx0OworCisgIC8vIEZJWE1FOiBJZiB0aGUgbWVtbW92ZSBpcyB2b2xhdGlsZSwgbG93ZXJpbmcgaXQgdG8gcGxhaW4gbGliYyBtZW1tb3ZlIG1heQorICAvLyBub3QgYmUgc2FmZS4gIFNlZSBtZW1jcHkgYWJvdmUgZm9yIG1vcmUgZGV0YWlscy4KKworICAvLyBFbWl0IGEgbGlicmFyeSBjYWxsLgorICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdFR5IEFyZ3M7CisgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0RW50cnkgRW50cnk7CisgIEVudHJ5LlR5ID0gVExJLmdldFRhcmdldERhdGEoKS0+Z2V0SW50UHRyVHlwZSgqZ2V0Q29udGV4dCgpKTsKKyAgRW50cnkuTm9kZSA9IERzdDsgQXJncy5wdXNoX2JhY2soRW50cnkpOworICBFbnRyeS5Ob2RlID0gU3JjOyBBcmdzLnB1c2hfYmFjayhFbnRyeSk7CisgIEVudHJ5Lk5vZGUgPSBTaXplOyBBcmdzLnB1c2hfYmFjayhFbnRyeSk7CisgIC8vIEZJWE1FOiAgcGFzcyBpbiBEZWJ1Z0xvYworICBzdGQ6OnBhaXI8U0RWYWx1ZSxTRFZhbHVlPiBDYWxsUmVzdWx0ID0KKyAgICBUTEkuTG93ZXJDYWxsVG8oQ2hhaW4sIFR5cGU6OmdldFZvaWRUeSgqZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsCisgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRMaWJjYWxsQ2FsbGluZ0NvbnYoUlRMSUI6Ok1FTU1PVkUpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLyppc1JldHVyblZhbHVlVXNlZD0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICBnZXRFeHRlcm5hbFN5bWJvbChUTEkuZ2V0TGliY2FsbE5hbWUoUlRMSUI6Ok1FTU1PVkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpLAorICAgICAgICAgICAgICAgICAgICBBcmdzLCAqdGhpcywgZGwpOworICByZXR1cm4gQ2FsbFJlc3VsdC5zZWNvbmQ7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRNZW1zZXQoU0RWYWx1ZSBDaGFpbiwgRGVidWdMb2MgZGwsIFNEVmFsdWUgRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNyYywgU0RWYWx1ZSBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgYm9vbCBpc1ZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkRzdFNWLCB1aW50NjRfdCBEc3RTVk9mZikgeworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgbG93ZXIgdGhlIG1lbXNldCB0byBzdG9yZXMgZmlyc3QuCisgIC8vIEZvciBjYXNlcyB3aXRoaW4gdGhlIHRhcmdldC1zcGVjaWZpZWQgbGltaXRzLCB0aGlzIGlzIHRoZSBiZXN0IGNob2ljZS4KKyAgQ29uc3RhbnRTRE5vZGUgKkNvbnN0YW50U2l6ZSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihTaXplKTsKKyAgaWYgKENvbnN0YW50U2l6ZSkgeworICAgIC8vIE1lbXNldCB3aXRoIHNpemUgemVybz8gSnVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIGNoYWluLgorICAgIGlmIChDb25zdGFudFNpemUtPmlzTnVsbFZhbHVlKCkpCisgICAgICByZXR1cm4gQ2hhaW47CisKKyAgICBTRFZhbHVlIFJlc3VsdCA9CisgICAgICBnZXRNZW1zZXRTdG9yZXMoKnRoaXMsIGRsLCBDaGFpbiwgRHN0LCBTcmMsIENvbnN0YW50U2l6ZS0+Z2V0WkV4dFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgQWxpZ24sIGlzVm9sLCBEc3RTViwgRHN0U1ZPZmYpOworCisgICAgaWYgKFJlc3VsdC5nZXROb2RlKCkpCisgICAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8gVGhlbiBjaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIGxvd2VyIHRoZSBtZW1zZXQgd2l0aCB0YXJnZXQtc3BlY2lmaWMKKyAgLy8gY29kZS4gSWYgdGhlIHRhcmdldCBjaG9vc2VzIHRvIGRvIHRoaXMsIHRoaXMgaXMgdGhlIG5leHQgYmVzdC4KKyAgU0RWYWx1ZSBSZXN1bHQgPQorICAgIFRTSS5FbWl0VGFyZ2V0Q29kZUZvck1lbXNldCgqdGhpcywgZGwsIENoYWluLCBEc3QsIFNyYywgU2l6ZSwgQWxpZ24sIGlzVm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEc3RTViwgRHN0U1ZPZmYpOworICBpZiAoUmVzdWx0LmdldE5vZGUoKSkKKyAgICByZXR1cm4gUmVzdWx0OworCisgIC8vIEVtaXQgYSBsaWJyYXJ5IGNhbGwuICAKKyAgY29uc3QgVHlwZSAqSW50UHRyVHkgPSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRJbnRQdHJUeXBlKCpnZXRDb250ZXh0KCkpOworICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdFR5IEFyZ3M7CisgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0RW50cnkgRW50cnk7CisgIEVudHJ5Lk5vZGUgPSBEc3Q7IEVudHJ5LlR5ID0gSW50UHRyVHk7CisgIEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKyAgLy8gRXh0ZW5kIG9yIHRydW5jYXRlIHRoZSBhcmd1bWVudCB0byBiZSBhbiBpMzIgdmFsdWUgZm9yIHRoZSBjYWxsLgorICBpZiAoU3JjLmdldFZhbHVlVHlwZSgpLmJpdHNHVChNVlQ6OmkzMikpCisgICAgU3JjID0gZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTVZUOjppMzIsIFNyYyk7CisgIGVsc2UKKyAgICBTcmMgPSBnZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBNVlQ6OmkzMiwgU3JjKTsKKyAgRW50cnkuTm9kZSA9IFNyYzsKKyAgRW50cnkuVHkgPSBUeXBlOjpnZXRJbnQzMlR5KCpnZXRDb250ZXh0KCkpOworICBFbnRyeS5pc1NFeHQgPSB0cnVlOworICBBcmdzLnB1c2hfYmFjayhFbnRyeSk7CisgIEVudHJ5Lk5vZGUgPSBTaXplOworICBFbnRyeS5UeSA9IEludFB0clR5OworICBFbnRyeS5pc1NFeHQgPSBmYWxzZTsKKyAgQXJncy5wdXNoX2JhY2soRW50cnkpOworICAvLyBGSVhNRTogcGFzcyBpbiBEZWJ1Z0xvYworICBzdGQ6OnBhaXI8U0RWYWx1ZSxTRFZhbHVlPiBDYWxsUmVzdWx0ID0KKyAgICBUTEkuTG93ZXJDYWxsVG8oQ2hhaW4sIFR5cGU6OmdldFZvaWRUeSgqZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsCisgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRMaWJjYWxsQ2FsbGluZ0NvbnYoUlRMSUI6Ok1FTVNFVCksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKmlzUmV0dXJuVmFsdWVVc2VkPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGdldEV4dGVybmFsU3ltYm9sKFRMSS5nZXRMaWJjYWxsTmFtZShSVExJQjo6TUVNU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpKSwKKyAgICAgICAgICAgICAgICAgICAgQXJncywgKnRoaXMsIGRsKTsKKyAgcmV0dXJuIENhbGxSZXN1bHQuc2Vjb25kOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0QXRvbWljKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBQdHIsIFNEVmFsdWUgQ21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFN3cCwgY29uc3QgVmFsdWUqIFB0clZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50KSB7CisgIGlmIChBbGlnbm1lbnQgPT0gMCkgIC8vIEVuc3VyZSB0aGF0IGNvZGVnZW4gbmV2ZXIgc2VlcyBhbGlnbm1lbnQgMAorICAgIEFsaWdubWVudCA9IGdldEVWVEFsaWdubWVudChNZW1WVCk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIG1lbW9yeSByZWZlcmVuY2UgcmVmZXJlbmNlcyBhIGZyYW1lIGluZGV4CisgIGlmICghUHRyVmFsKQorICAgIGlmIChjb25zdCBGcmFtZUluZGV4U0ROb2RlICpGSSA9CisgICAgICAgICAgZHluX2Nhc3Q8Y29uc3QgRnJhbWVJbmRleFNETm9kZT4oUHRyLmdldE5vZGUoKSkpCisgICAgICBQdHJWYWwgPSBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhGSS0+Z2V0SW5kZXgoKSk7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IGdldE1hY2hpbmVGdW5jdGlvbigpOworICB1bnNpZ25lZCBGbGFncyA9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT0xvYWQgfCBNYWNoaW5lTWVtT3BlcmFuZDo6TU9TdG9yZTsKKworICAvLyBGb3Igbm93LCBhdG9taWNzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHZvbGF0aWxlIGFsd2F5cy4KKyAgRmxhZ3MgfD0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PVm9sYXRpbGU7CisKKyAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgTUYuZ2V0TWFjaGluZU1lbU9wZXJhbmQoUHRyVmFsLCBGbGFncywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1WVC5nZXRTdG9yZVNpemUoKSwgQWxpZ25tZW50KTsKKworICByZXR1cm4gZ2V0QXRvbWljKE9wY29kZSwgZGwsIE1lbVZULCBDaGFpbiwgUHRyLCBDbXAsIFN3cCwgTU1PKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldEF0b21pYyh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyLCBTRFZhbHVlIENtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTd3AsIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pIHsKKyAgYXNzZXJ0KE9wY29kZSA9PSBJU0Q6OkFUT01JQ19DTVBfU1dBUCAmJiAiSW52YWxpZCBBdG9taWMgT3AiKTsKKyAgYXNzZXJ0KENtcC5nZXRWYWx1ZVR5cGUoKSA9PSBTd3AuZ2V0VmFsdWVUeXBlKCkgJiYgIkludmFsaWQgQXRvbWljIE9wIFR5cGVzIik7CisKKyAgRVZUIFZUID0gQ21wLmdldFZhbHVlVHlwZSgpOworCisgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChWVCwgTVZUOjpPdGhlcik7CisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIElELkFkZEludGVnZXIoTWVtVlQuZ2V0UmF3Qml0cygpKTsKKyAgU0RWYWx1ZSBPcHNbXSA9IHtDaGFpbiwgUHRyLCBDbXAsIFN3cH07CisgIEFkZE5vZGVJRE5vZGUoSUQsIE9wY29kZSwgVlRzLCBPcHMsIDQpOworICB2b2lkKiBJUCA9IDA7CisgIGlmIChTRE5vZGUgKkUgPSBDU0VNYXAuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKSB7CisgICAgY2FzdDxBdG9taWNTRE5vZGU+KEUpLT5yZWZpbmVBbGlnbm1lbnQoTU1PKTsKKyAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKyAgfQorICBTRE5vZGUgKk4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIEF0b21pY1NETm9kZShPcGNvZGUsIGRsLCBWVHMsIE1lbVZULCBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyLCBDbXAsIFN3cCwgTU1PKTsKKyAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0QXRvbWljKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBQdHIsIFNEVmFsdWUgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSogUHRyVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgaWYgKEFsaWdubWVudCA9PSAwKSAgLy8gRW5zdXJlIHRoYXQgY29kZWdlbiBuZXZlciBzZWVzIGFsaWdubWVudCAwCisgICAgQWxpZ25tZW50ID0gZ2V0RVZUQWxpZ25tZW50KE1lbVZUKTsKKworICAvLyBDaGVjayBpZiB0aGUgbWVtb3J5IHJlZmVyZW5jZSByZWZlcmVuY2VzIGEgZnJhbWUgaW5kZXgKKyAgaWYgKCFQdHJWYWwpCisgICAgaWYgKGNvbnN0IEZyYW1lSW5kZXhTRE5vZGUgKkZJID0KKyAgICAgICAgICBkeW5fY2FzdDxjb25zdCBGcmFtZUluZGV4U0ROb2RlPihQdHIuZ2V0Tm9kZSgpKSkKKyAgICAgIFB0clZhbCA9IFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKEZJLT5nZXRJbmRleCgpKTsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIHVuc2lnbmVkIEZsYWdzID0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTG9hZCB8IE1hY2hpbmVNZW1PcGVyYW5kOjpNT1N0b3JlOworCisgIC8vIEZvciBub3csIGF0b21pY3MgYXJlIGNvbnNpZGVyZWQgdG8gYmUgdm9sYXRpbGUgYWx3YXlzLgorICBGbGFncyB8PSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Wb2xhdGlsZTsKKworICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PID0KKyAgICBNRi5nZXRNYWNoaW5lTWVtT3BlcmFuZChQdHJWYWwsIEZsYWdzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVZULmdldFN0b3JlU2l6ZSgpLCBBbGlnbm1lbnQpOworCisgIHJldHVybiBnZXRBdG9taWMoT3Bjb2RlLCBkbCwgTWVtVlQsIENoYWluLCBQdHIsIFZhbCwgTU1PKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldEF0b21pYyh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyLCBTRFZhbHVlIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykgeworICBhc3NlcnQoKE9wY29kZSA9PSBJU0Q6OkFUT01JQ19MT0FEX0FERCB8fAorICAgICAgICAgIE9wY29kZSA9PSBJU0Q6OkFUT01JQ19MT0FEX1NVQiB8fAorICAgICAgICAgIE9wY29kZSA9PSBJU0Q6OkFUT01JQ19MT0FEX0FORCB8fAorICAgICAgICAgIE9wY29kZSA9PSBJU0Q6OkFUT01JQ19MT0FEX09SIHx8CisgICAgICAgICAgT3Bjb2RlID09IElTRDo6QVRPTUlDX0xPQURfWE9SIHx8CisgICAgICAgICAgT3Bjb2RlID09IElTRDo6QVRPTUlDX0xPQURfTkFORCB8fAorICAgICAgICAgIE9wY29kZSA9PSBJU0Q6OkFUT01JQ19MT0FEX01JTiB8fAorICAgICAgICAgIE9wY29kZSA9PSBJU0Q6OkFUT01JQ19MT0FEX01BWCB8fAorICAgICAgICAgIE9wY29kZSA9PSBJU0Q6OkFUT01JQ19MT0FEX1VNSU4gfHwKKyAgICAgICAgICBPcGNvZGUgPT0gSVNEOjpBVE9NSUNfTE9BRF9VTUFYIHx8CisgICAgICAgICAgT3Bjb2RlID09IElTRDo6QVRPTUlDX1NXQVApICYmCisgICAgICAgICAiSW52YWxpZCBBdG9taWMgT3AiKTsKKworICBFVlQgVlQgPSBWYWwuZ2V0VmFsdWVUeXBlKCk7CisKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZULCBNVlQ6Ok90aGVyKTsKKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgSUQuQWRkSW50ZWdlcihNZW1WVC5nZXRSYXdCaXRzKCkpOworICBTRFZhbHVlIE9wc1tdID0ge0NoYWluLCBQdHIsIFZhbH07CisgIEFkZE5vZGVJRE5vZGUoSUQsIE9wY29kZSwgVlRzLCBPcHMsIDMpOworICB2b2lkKiBJUCA9IDA7CisgIGlmIChTRE5vZGUgKkUgPSBDU0VNYXAuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKSB7CisgICAgY2FzdDxBdG9taWNTRE5vZGU+KEUpLT5yZWZpbmVBbGlnbm1lbnQoTU1PKTsKKyAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKyAgfQorICBTRE5vZGUgKk4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIEF0b21pY1NETm9kZShPcGNvZGUsIGRsLCBWVHMsIE1lbVZULCBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyLCBWYWwsIE1NTyk7CisgIENTRU1hcC5JbnNlcnROb2RlKE4sIElQKTsKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworLy8vIGdldE1lcmdlVmFsdWVzIC0gQ3JlYXRlIGEgTUVSR0VfVkFMVUVTIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gb3BlcmFuZHMuCisvLy8gQWxsb3dlZCB0byByZXR1cm4gc29tZXRoaW5nIGRpZmZlcmVudCAoYW5kIHNpbXBsZXIpIGlmIFNpbXBsaWZ5IGlzIHRydWUuCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0TWVyZ2VWYWx1ZXMoY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgaWYgKE51bU9wcyA9PSAxKQorICAgIHJldHVybiBPcHNbMF07CisKKyAgU21hbGxWZWN0b3I8RVZULCA0PiBWVHM7CisgIFZUcy5yZXNlcnZlKE51bU9wcyk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1PcHM7ICsraSkKKyAgICBWVHMucHVzaF9iYWNrKE9wc1tpXS5nZXRWYWx1ZVR5cGUoKSk7CisgIHJldHVybiBnZXROb2RlKElTRDo6TUVSR0VfVkFMVUVTLCBkbCwgZ2V0VlRMaXN0KCZWVHNbMF0sIE51bU9wcyksCisgICAgICAgICAgICAgICAgIE9wcywgTnVtT3BzKTsKK30KKworU0RWYWx1ZQorU2VsZWN0aW9uREFHOjpnZXRNZW1JbnRyaW5zaWNOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZUICpWVHMsIHVuc2lnbmVkIE51bVZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTWVtVlQsIGNvbnN0IFZhbHVlICpzcmNWYWx1ZSwgaW50IFNWT2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBib29sIFZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlYWRNZW0sIGJvb2wgV3JpdGVNZW0pIHsKKyAgcmV0dXJuIGdldE1lbUludHJpbnNpY05vZGUoT3Bjb2RlLCBkbCwgbWFrZVZUTGlzdChWVHMsIE51bVZUcyksIE9wcywgTnVtT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1WVCwgc3JjVmFsdWUsIFNWT2ZmLCBBbGlnbiwgVm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkTWVtLCBXcml0ZU1lbSk7Cit9CisKK1NEVmFsdWUKK1NlbGVjdGlvbkRBRzo6Z2V0TWVtSW50cmluc2ljTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBTRFZUTGlzdCBWVExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIE1lbVZULCBjb25zdCBWYWx1ZSAqc3JjVmFsdWUsIGludCBTVk9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgYm9vbCBWb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWFkTWVtLCBib29sIFdyaXRlTWVtKSB7CisgIGlmIChBbGlnbiA9PSAwKSAgLy8gRW5zdXJlIHRoYXQgY29kZWdlbiBuZXZlciBzZWVzIGFsaWdubWVudCAwCisgICAgQWxpZ24gPSBnZXRFVlRBbGlnbm1lbnQoTWVtVlQpOworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBnZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgdW5zaWduZWQgRmxhZ3MgPSAwOworICBpZiAoV3JpdGVNZW0pCisgICAgRmxhZ3MgfD0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PU3RvcmU7CisgIGlmIChSZWFkTWVtKQorICAgIEZsYWdzIHw9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT0xvYWQ7CisgIGlmIChWb2wpCisgICAgRmxhZ3MgfD0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PVm9sYXRpbGU7CisgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8gPQorICAgIE1GLmdldE1hY2hpbmVNZW1PcGVyYW5kKHNyY1ZhbHVlLCBGbGFncywgU1ZPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtVlQuZ2V0U3RvcmVTaXplKCksIEFsaWduKTsKKworICByZXR1cm4gZ2V0TWVtSW50cmluc2ljTm9kZShPcGNvZGUsIGRsLCBWVExpc3QsIE9wcywgTnVtT3BzLCBNZW1WVCwgTU1PKTsKK30KKworU0RWYWx1ZQorU2VsZWN0aW9uREFHOjpnZXRNZW1JbnRyaW5zaWNOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIFNEVlRMaXN0IFZUTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTWVtVlQsIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pIHsKKyAgYXNzZXJ0KChPcGNvZGUgPT0gSVNEOjpJTlRSSU5TSUNfVk9JRCB8fAorICAgICAgICAgIE9wY29kZSA9PSBJU0Q6OklOVFJJTlNJQ19XX0NIQUlOIHx8CisgICAgICAgICAgKE9wY29kZSA8PSBJTlRfTUFYICYmCisgICAgICAgICAgIChpbnQpT3Bjb2RlID49IElTRDo6RklSU1RfVEFSR0VUX01FTU9SWV9PUENPREUpKSAmJgorICAgICAgICAgIk9wY29kZSBpcyBub3QgYSBtZW1vcnktYWNjZXNzaW5nIG9wY29kZSEiKTsKKworICAvLyBNZW1vaXplIHRoZSBub2RlIHVubGVzcyBpdCByZXR1cm5zIGEgZmxhZy4KKyAgTWVtSW50cmluc2ljU0ROb2RlICpOOworICBpZiAoVlRMaXN0LlZUc1tWVExpc3QuTnVtVlRzLTFdICE9IE1WVDo6RmxhZykgeworICAgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgICAgQWRkTm9kZUlETm9kZShJRCwgT3Bjb2RlLCBWVExpc3QsIE9wcywgTnVtT3BzKTsKKyAgICB2b2lkICpJUCA9IDA7CisgICAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpIHsKKyAgICAgIGNhc3Q8TWVtSW50cmluc2ljU0ROb2RlPihFKS0+cmVmaW5lQWxpZ25tZW50KE1NTyk7CisgICAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKyAgICB9CisKKyAgICBOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBNZW1JbnRyaW5zaWNTRE5vZGUoT3Bjb2RlLCBkbCwgVlRMaXN0LCBPcHMsIE51bU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtVlQsIE1NTyk7CisgICAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworICB9IGVsc2UgeworICAgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIE1lbUludHJpbnNpY1NETm9kZShPcGNvZGUsIGRsLCBWVExpc3QsIE9wcywgTnVtT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1WVCwgTU1PKTsKKyAgfQorICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCitTRFZhbHVlCitTZWxlY3Rpb25EQUc6OmdldExvYWQoSVNEOjpNZW1JbmRleGVkTW9kZSBBTSwgSVNEOjpMb2FkRXh0VHlwZSBFeHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCwgRGVidWdMb2MgZGwsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBQdHIsIFNEVmFsdWUgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpTViwgaW50IFNWT2Zmc2V0LCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlLCBib29sIGlzTm9uVGVtcG9yYWwsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50KSB7CisgIGlmIChBbGlnbm1lbnQgPT0gMCkgIC8vIEVuc3VyZSB0aGF0IGNvZGVnZW4gbmV2ZXIgc2VlcyBhbGlnbm1lbnQgMAorICAgIEFsaWdubWVudCA9IGdldEVWVEFsaWdubWVudChWVCk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIG1lbW9yeSByZWZlcmVuY2UgcmVmZXJlbmNlcyBhIGZyYW1lIGluZGV4CisgIGlmICghU1YpCisgICAgaWYgKGNvbnN0IEZyYW1lSW5kZXhTRE5vZGUgKkZJID0KKyAgICAgICAgICBkeW5fY2FzdDxjb25zdCBGcmFtZUluZGV4U0ROb2RlPihQdHIuZ2V0Tm9kZSgpKSkKKyAgICAgIFNWID0gUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkktPmdldEluZGV4KCkpOworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBnZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgdW5zaWduZWQgRmxhZ3MgPSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Mb2FkOworICBpZiAoaXNWb2xhdGlsZSkKKyAgICBGbGFncyB8PSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Wb2xhdGlsZTsKKyAgaWYgKGlzTm9uVGVtcG9yYWwpCisgICAgRmxhZ3MgfD0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTm9uVGVtcG9yYWw7CisgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8gPQorICAgIE1GLmdldE1hY2hpbmVNZW1PcGVyYW5kKFNWLCBGbGFncywgU1ZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtVlQuZ2V0U3RvcmVTaXplKCksIEFsaWdubWVudCk7CisgIHJldHVybiBnZXRMb2FkKEFNLCBFeHRUeXBlLCBWVCwgZGwsIENoYWluLCBQdHIsIE9mZnNldCwgTWVtVlQsIE1NTyk7Cit9CisKK1NEVmFsdWUKK1NlbGVjdGlvbkRBRzo6Z2V0TG9hZChJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNLCBJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCwgRGVidWdMb2MgZGwsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBQdHIsIFNEVmFsdWUgT2Zmc2V0LCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykgeworICBpZiAoVlQgPT0gTWVtVlQpIHsKKyAgICBFeHRUeXBlID0gSVNEOjpOT05fRVhUTE9BRDsKKyAgfSBlbHNlIGlmIChFeHRUeXBlID09IElTRDo6Tk9OX0VYVExPQUQpIHsKKyAgICBhc3NlcnQoVlQgPT0gTWVtVlQgJiYgIk5vbi1leHRlbmRpbmcgbG9hZCBmcm9tIGRpZmZlcmVudCBtZW1vcnkgdHlwZSEiKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBFeHRlbmRpbmcgbG9hZC4KKyAgICBhc3NlcnQoTWVtVlQuZ2V0U2NhbGFyVHlwZSgpLmJpdHNMVChWVC5nZXRTY2FsYXJUeXBlKCkpICYmCisgICAgICAgICAgICJTaG91bGQgb25seSBiZSBhbiBleHRlbmRpbmcgbG9hZCwgbm90IHRydW5jYXRpbmchIik7CisgICAgYXNzZXJ0KFZULmlzSW50ZWdlcigpID09IE1lbVZULmlzSW50ZWdlcigpICYmCisgICAgICAgICAgICJDYW5ub3QgY29udmVydCBmcm9tIEZQIHRvIEludCBvciBJbnQgLT4gRlAhIik7CisgICAgYXNzZXJ0KFZULmlzVmVjdG9yKCkgPT0gTWVtVlQuaXNWZWN0b3IoKSAmJgorICAgICAgICAgICAiQ2Fubm90IHVzZSB0cnVuYyBzdG9yZSB0byBjb252ZXJ0IHRvIG9yIGZyb20gYSB2ZWN0b3IhIik7CisgICAgYXNzZXJ0KCghVlQuaXNWZWN0b3IoKSB8fAorICAgICAgICAgICAgVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA9PSBNZW1WVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpKSAmJgorICAgICAgICAgICAiQ2Fubm90IHVzZSB0cnVuYyBzdG9yZSB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiB2ZWN0b3IgZWxlbWVudHMhIik7CisgIH0KKworICBib29sIEluZGV4ZWQgPSBBTSAhPSBJU0Q6OlVOSU5ERVhFRDsKKyAgYXNzZXJ0KChJbmRleGVkIHx8IE9mZnNldC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKSAmJgorICAgICAgICAgIlVuaW5kZXhlZCBsb2FkIHdpdGggYW4gb2Zmc2V0ISIpOworCisgIFNEVlRMaXN0IFZUcyA9IEluZGV4ZWQgPworICAgIGdldFZUTGlzdChWVCwgUHRyLmdldFZhbHVlVHlwZSgpLCBNVlQ6Ok90aGVyKSA6IGdldFZUTGlzdChWVCwgTVZUOjpPdGhlcik7CisgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBQdHIsIE9mZnNldCB9OworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBZGROb2RlSUROb2RlKElELCBJU0Q6OkxPQUQsIFZUcywgT3BzLCAzKTsKKyAgSUQuQWRkSW50ZWdlcihNZW1WVC5nZXRSYXdCaXRzKCkpOworICBJRC5BZGRJbnRlZ2VyKGVuY29kZU1lbVNETm9kZUZsYWdzKEV4dFR5cGUsIEFNLCBNTU8tPmlzVm9sYXRpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTU8tPmlzTm9uVGVtcG9yYWwoKSkpOworICB2b2lkICpJUCA9IDA7CisgIGlmIChTRE5vZGUgKkUgPSBDU0VNYXAuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKSB7CisgICAgY2FzdDxMb2FkU0ROb2RlPihFKS0+cmVmaW5lQWxpZ25tZW50KE1NTyk7CisgICAgcmV0dXJuIFNEVmFsdWUoRSwgMCk7CisgIH0KKyAgU0ROb2RlICpOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBMb2FkU0ROb2RlKE9wcywgZGwsIFZUcywgQU0sIEV4dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1WVCwgTU1PKTsKKyAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0TG9hZChFVlQgVlQsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqU1YsIGludCBTVk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSwgYm9vbCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50KSB7CisgIFNEVmFsdWUgVW5kZWYgPSBnZXRVTkRFRihQdHIuZ2V0VmFsdWVUeXBlKCkpOworICByZXR1cm4gZ2V0TG9hZChJU0Q6OlVOSU5ERVhFRCwgSVNEOjpOT05fRVhUTE9BRCwgVlQsIGRsLCBDaGFpbiwgUHRyLCBVbmRlZiwKKyAgICAgICAgICAgICAgICAgU1YsIFNWT2Zmc2V0LCBWVCwgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwgQWxpZ25tZW50KTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldEV4dExvYWQoSVNEOjpMb2FkRXh0VHlwZSBFeHRUeXBlLCBFVlQgVlQsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqU1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1ZPZmZzZXQsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSwgYm9vbCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50KSB7CisgIFNEVmFsdWUgVW5kZWYgPSBnZXRVTkRFRihQdHIuZ2V0VmFsdWVUeXBlKCkpOworICByZXR1cm4gZ2V0TG9hZChJU0Q6OlVOSU5ERVhFRCwgRXh0VHlwZSwgVlQsIGRsLCBDaGFpbiwgUHRyLCBVbmRlZiwKKyAgICAgICAgICAgICAgICAgU1YsIFNWT2Zmc2V0LCBNZW1WVCwgaXNWb2xhdGlsZSwgaXNOb25UZW1wb3JhbCwgQWxpZ25tZW50KTsKK30KKworU0RWYWx1ZQorU2VsZWN0aW9uREFHOjpnZXRJbmRleGVkTG9hZChTRFZhbHVlIE9yaWdMb2FkLCBEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9mZnNldCwgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSkgeworICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oT3JpZ0xvYWQpOworICBhc3NlcnQoTEQtPmdldE9mZnNldCgpLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYgJiYKKyAgICAgICAgICJMb2FkIGlzIGFscmVhZHkgYSBpbmRleGVkIGxvYWQhIik7CisgIHJldHVybiBnZXRMb2FkKEFNLCBMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpLCBPcmlnTG9hZC5nZXRWYWx1ZVR5cGUoKSwgZGwsCisgICAgICAgICAgICAgICAgIExELT5nZXRDaGFpbigpLCBCYXNlLCBPZmZzZXQsIExELT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICBMRC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwgTEQtPmdldE1lbW9yeVZUKCksCisgICAgICAgICAgICAgICAgIExELT5pc1ZvbGF0aWxlKCksIExELT5pc05vblRlbXBvcmFsKCksIExELT5nZXRBbGlnbm1lbnQoKSk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRTdG9yZShTRFZhbHVlIENoYWluLCBEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBQdHIsIGNvbnN0IFZhbHVlICpTViwgaW50IFNWT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSwgYm9vbCBpc05vblRlbXBvcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCkgeworICBpZiAoQWxpZ25tZW50ID09IDApICAvLyBFbnN1cmUgdGhhdCBjb2RlZ2VuIG5ldmVyIHNlZXMgYWxpZ25tZW50IDAKKyAgICBBbGlnbm1lbnQgPSBnZXRFVlRBbGlnbm1lbnQoVmFsLmdldFZhbHVlVHlwZSgpKTsKKworICAvLyBDaGVjayBpZiB0aGUgbWVtb3J5IHJlZmVyZW5jZSByZWZlcmVuY2VzIGEgZnJhbWUgaW5kZXgKKyAgaWYgKCFTVikKKyAgICBpZiAoY29uc3QgRnJhbWVJbmRleFNETm9kZSAqRkkgPQorICAgICAgICAgIGR5bl9jYXN0PGNvbnN0IEZyYW1lSW5kZXhTRE5vZGU+KFB0ci5nZXROb2RlKCkpKQorICAgICAgU1YgPSBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhGSS0+Z2V0SW5kZXgoKSk7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IGdldE1hY2hpbmVGdW5jdGlvbigpOworICB1bnNpZ25lZCBGbGFncyA9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT1N0b3JlOworICBpZiAoaXNWb2xhdGlsZSkKKyAgICBGbGFncyB8PSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Wb2xhdGlsZTsKKyAgaWYgKGlzTm9uVGVtcG9yYWwpCisgICAgRmxhZ3MgfD0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTm9uVGVtcG9yYWw7CisgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8gPQorICAgIE1GLmdldE1hY2hpbmVNZW1PcGVyYW5kKFNWLCBGbGFncywgU1ZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsLmdldFZhbHVlVHlwZSgpLmdldFN0b3JlU2l6ZSgpLCBBbGlnbm1lbnQpOworCisgIHJldHVybiBnZXRTdG9yZShDaGFpbiwgZGwsIFZhbCwgUHRyLCBNTU8pOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0U3RvcmUoU0RWYWx1ZSBDaGFpbiwgRGVidWdMb2MgZGwsIFNEVmFsdWUgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyLCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKSB7CisgIEVWVCBWVCA9IFZhbC5nZXRWYWx1ZVR5cGUoKTsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KE1WVDo6T3RoZXIpOworICBTRFZhbHVlIFVuZGVmID0gZ2V0VU5ERUYoUHRyLmdldFZhbHVlVHlwZSgpKTsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgQ2hhaW4sIFZhbCwgUHRyLCBVbmRlZiB9OworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBZGROb2RlSUROb2RlKElELCBJU0Q6OlNUT1JFLCBWVHMsIE9wcywgNCk7CisgIElELkFkZEludGVnZXIoVlQuZ2V0UmF3Qml0cygpKTsKKyAgSUQuQWRkSW50ZWdlcihlbmNvZGVNZW1TRE5vZGVGbGFncyhmYWxzZSwgSVNEOjpVTklOREVYRUQsIE1NTy0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NTy0+aXNOb25UZW1wb3JhbCgpKSk7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpIHsKKyAgICBjYXN0PFN0b3JlU0ROb2RlPihFKS0+cmVmaW5lQWxpZ25tZW50KE1NTyk7CisgICAgcmV0dXJuIFNEVmFsdWUoRSwgMCk7CisgIH0KKyAgU0ROb2RlICpOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBTdG9yZVNETm9kZShPcHMsIGRsLCBWVHMsIElTRDo6VU5JTkRFWEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBWVCwgTU1PKTsKKyAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0VHJ1bmNTdG9yZShTRFZhbHVlIENoYWluLCBEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFB0ciwgY29uc3QgVmFsdWUgKlNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNWT2Zmc2V0LCBFVlQgU1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlLCBib29sIGlzTm9uVGVtcG9yYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgaWYgKEFsaWdubWVudCA9PSAwKSAgLy8gRW5zdXJlIHRoYXQgY29kZWdlbiBuZXZlciBzZWVzIGFsaWdubWVudCAwCisgICAgQWxpZ25tZW50ID0gZ2V0RVZUQWxpZ25tZW50KFNWVCk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIG1lbW9yeSByZWZlcmVuY2UgcmVmZXJlbmNlcyBhIGZyYW1lIGluZGV4CisgIGlmICghU1YpCisgICAgaWYgKGNvbnN0IEZyYW1lSW5kZXhTRE5vZGUgKkZJID0KKyAgICAgICAgICBkeW5fY2FzdDxjb25zdCBGcmFtZUluZGV4U0ROb2RlPihQdHIuZ2V0Tm9kZSgpKSkKKyAgICAgIFNWID0gUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkktPmdldEluZGV4KCkpOworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBnZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgdW5zaWduZWQgRmxhZ3MgPSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9TdG9yZTsKKyAgaWYgKGlzVm9sYXRpbGUpCisgICAgRmxhZ3MgfD0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PVm9sYXRpbGU7CisgIGlmIChpc05vblRlbXBvcmFsKQorICAgIEZsYWdzIHw9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT05vblRlbXBvcmFsOworICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PID0KKyAgICBNRi5nZXRNYWNoaW5lTWVtT3BlcmFuZChTViwgRmxhZ3MsIFNWT2Zmc2V0LCBTVlQuZ2V0U3RvcmVTaXplKCksIEFsaWdubWVudCk7CisKKyAgcmV0dXJuIGdldFRydW5jU3RvcmUoQ2hhaW4sIGRsLCBWYWwsIFB0ciwgU1ZULCBNTU8pOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0VHJ1bmNTdG9yZShTRFZhbHVlIENoYWluLCBEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFB0ciwgRVZUIFNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pIHsKKyAgRVZUIFZUID0gVmFsLmdldFZhbHVlVHlwZSgpOworCisgIGlmIChWVCA9PSBTVlQpCisgICAgcmV0dXJuIGdldFN0b3JlKENoYWluLCBkbCwgVmFsLCBQdHIsIE1NTyk7CisKKyAgYXNzZXJ0KFNWVC5nZXRTY2FsYXJUeXBlKCkuYml0c0xUKFZULmdldFNjYWxhclR5cGUoKSkgJiYKKyAgICAgICAgICJTaG91bGQgb25seSBiZSBhIHRydW5jYXRpbmcgc3RvcmUsIG5vdCBleHRlbmRpbmchIik7CisgIGFzc2VydChWVC5pc0ludGVnZXIoKSA9PSBTVlQuaXNJbnRlZ2VyKCkgJiYKKyAgICAgICAgICJDYW4ndCBkbyBGUC1JTlQgY29udmVyc2lvbiEiKTsKKyAgYXNzZXJ0KFZULmlzVmVjdG9yKCkgPT0gU1ZULmlzVmVjdG9yKCkgJiYKKyAgICAgICAgICJDYW5ub3QgdXNlIHRydW5jIHN0b3JlIHRvIGNvbnZlcnQgdG8gb3IgZnJvbSBhIHZlY3RvciEiKTsKKyAgYXNzZXJ0KCghVlQuaXNWZWN0b3IoKSB8fAorICAgICAgICAgIFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0gU1ZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpICYmCisgICAgICAgICAiQ2Fubm90IHVzZSB0cnVuYyBzdG9yZSB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiB2ZWN0b3IgZWxlbWVudHMhIik7CisKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KE1WVDo6T3RoZXIpOworICBTRFZhbHVlIFVuZGVmID0gZ2V0VU5ERUYoUHRyLmdldFZhbHVlVHlwZSgpKTsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgQ2hhaW4sIFZhbCwgUHRyLCBVbmRlZiB9OworICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBZGROb2RlSUROb2RlKElELCBJU0Q6OlNUT1JFLCBWVHMsIE9wcywgNCk7CisgIElELkFkZEludGVnZXIoU1ZULmdldFJhd0JpdHMoKSk7CisgIElELkFkZEludGVnZXIoZW5jb2RlTWVtU0ROb2RlRmxhZ3ModHJ1ZSwgSVNEOjpVTklOREVYRUQsIE1NTy0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NTy0+aXNOb25UZW1wb3JhbCgpKSk7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpIHsKKyAgICBjYXN0PFN0b3JlU0ROb2RlPihFKS0+cmVmaW5lQWxpZ25tZW50KE1NTyk7CisgICAgcmV0dXJuIFNEVmFsdWUoRSwgMCk7CisgIH0KKyAgU0ROb2RlICpOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBTdG9yZVNETm9kZShPcHMsIGRsLCBWVHMsIElTRDo6VU5JTkRFWEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIFNWVCwgTU1PKTsKKyAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCitTRFZhbHVlCitTZWxlY3Rpb25EQUc6OmdldEluZGV4ZWRTdG9yZShTRFZhbHVlIE9yaWdTdG9yZSwgRGVidWdMb2MgZGwsIFNEVmFsdWUgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT2Zmc2V0LCBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNKSB7CisgIFN0b3JlU0ROb2RlICpTVCA9IGNhc3Q8U3RvcmVTRE5vZGU+KE9yaWdTdG9yZSk7CisgIGFzc2VydChTVC0+Z2V0T2Zmc2V0KCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRiAmJgorICAgICAgICAgIlN0b3JlIGlzIGFscmVhZHkgYSBpbmRleGVkIHN0b3JlISIpOworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoQmFzZS5nZXRWYWx1ZVR5cGUoKSwgTVZUOjpPdGhlcik7CisgIFNEVmFsdWUgT3BzW10gPSB7IFNULT5nZXRDaGFpbigpLCBTVC0+Z2V0VmFsdWUoKSwgQmFzZSwgT2Zmc2V0IH07CisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIEFkZE5vZGVJRE5vZGUoSUQsIElTRDo6U1RPUkUsIFZUcywgT3BzLCA0KTsKKyAgSUQuQWRkSW50ZWdlcihTVC0+Z2V0TWVtb3J5VlQoKS5nZXRSYXdCaXRzKCkpOworICBJRC5BZGRJbnRlZ2VyKFNULT5nZXRSYXdTdWJjbGFzc0RhdGEoKSk7CisgIHZvaWQgKklQID0gMDsKKyAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpCisgICAgcmV0dXJuIFNEVmFsdWUoRSwgMCk7CisKKyAgU0ROb2RlICpOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBTdG9yZVNETm9kZShPcHMsIGRsLCBWVHMsIEFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5pc1RydW5jYXRpbmdTdG9yZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRNZW1vcnlWVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRNZW1PcGVyYW5kKCkpOworICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIEFsbE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXRWQUFyZyhFVlQgVlQsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24pIHsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgQ2hhaW4sIFB0ciwgU1YsIGdldFRhcmdldENvbnN0YW50KEFsaWduLCBNVlQ6OmkzMikgfTsKKyAgcmV0dXJuIGdldE5vZGUoSVNEOjpWQUFSRywgZGwsIGdldFZUTGlzdChWVCwgTVZUOjpPdGhlciksIE9wcywgNCk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcykgeworICBzd2l0Y2ggKE51bU9wcykgeworICBjYXNlIDA6IHJldHVybiBnZXROb2RlKE9wY29kZSwgREwsIFZUKTsKKyAgY2FzZSAxOiByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVCwgT3BzWzBdKTsKKyAgY2FzZSAyOiByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVCwgT3BzWzBdLCBPcHNbMV0pOworICBjYXNlIDM6IHJldHVybiBnZXROb2RlKE9wY29kZSwgREwsIFZULCBPcHNbMF0sIE9wc1sxXSwgT3BzWzJdKTsKKyAgZGVmYXVsdDogYnJlYWs7CisgIH0KKworICAvLyBDb3B5IGZyb20gYW4gU0RVc2UgYXJyYXkgaW50byBhbiBTRFZhbHVlIGFycmF5IGZvciB1c2Ugd2l0aAorICAvLyB0aGUgcmVndWxhciBnZXROb2RlIGxvZ2ljLgorICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBOZXdPcHMoT3BzLCBPcHMgKyBOdW1PcHMpOworICByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVCwgJk5ld09wc1swXSwgTnVtT3BzKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpIHsKKyAgc3dpdGNoIChOdW1PcHMpIHsKKyAgY2FzZSAwOiByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVCk7CisgIGNhc2UgMTogcmV0dXJuIGdldE5vZGUoT3Bjb2RlLCBETCwgVlQsIE9wc1swXSk7CisgIGNhc2UgMjogcmV0dXJuIGdldE5vZGUoT3Bjb2RlLCBETCwgVlQsIE9wc1swXSwgT3BzWzFdKTsKKyAgY2FzZSAzOiByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVCwgT3BzWzBdLCBPcHNbMV0sIE9wc1syXSk7CisgIGRlZmF1bHQ6IGJyZWFrOworICB9CisKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6IHsKKyAgICBhc3NlcnQoTnVtT3BzID09IDUgJiYgIlNFTEVDVF9DQyB0YWtlcyA1IG9wZXJhbmRzISIpOworICAgIGFzc2VydChPcHNbMF0uZ2V0VmFsdWVUeXBlKCkgPT0gT3BzWzFdLmdldFZhbHVlVHlwZSgpICYmCisgICAgICAgICAgICJMSFMgYW5kIFJIUyBvZiBjb25kaXRpb24gbXVzdCBoYXZlIHNhbWUgdHlwZSEiKTsKKyAgICBhc3NlcnQoT3BzWzJdLmdldFZhbHVlVHlwZSgpID09IE9wc1szXS5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgICAiVHJ1ZSBhbmQgRmFsc2UgYXJtcyBvZiBTZWxlY3RDQyBtdXN0IGhhdmUgc2FtZSB0eXBlISIpOworICAgIGFzc2VydChPcHNbMl0uZ2V0VmFsdWVUeXBlKCkgPT0gVlQgJiYKKyAgICAgICAgICAgInNlbGVjdF9jYyBub2RlIG11c3QgYmUgb2Ygc2FtZSB0eXBlIGFzIHRydWUgYW5kIGZhbHNlIHZhbHVlISIpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpCUl9DQzogeworICAgIGFzc2VydChOdW1PcHMgPT0gNSAmJiAiQlJfQ0MgdGFrZXMgNSBvcGVyYW5kcyEiKTsKKyAgICBhc3NlcnQoT3BzWzJdLmdldFZhbHVlVHlwZSgpID09IE9wc1szXS5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgICAiTEhTL1JIUyBvZiBjb21wYXJpc29uIHNob3VsZCBtYXRjaCB0eXBlcyEiKTsKKyAgICBicmVhazsKKyAgfQorICB9CisKKyAgLy8gTWVtb2l6ZSBub2Rlcy4KKyAgU0ROb2RlICpOOworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQpOworCisgIGlmIChWVCAhPSBNVlQ6OkZsYWcpIHsKKyAgICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICAgIEFkZE5vZGVJRE5vZGUoSUQsIE9wY29kZSwgVlRzLCBPcHMsIE51bU9wcyk7CisgICAgdm9pZCAqSVAgPSAwOworCisgICAgaWYgKFNETm9kZSAqRSA9IENTRU1hcC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJUCkpCisgICAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKworICAgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIFNETm9kZShPcGNvZGUsIERMLCBWVHMsIE9wcywgTnVtT3BzKTsKKyAgICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIH0gZWxzZSB7CisgICAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgU0ROb2RlKE9wY29kZSwgREwsIFZUcywgT3BzLCBOdW1PcHMpOworICB9CisKKyAgQWxsTm9kZXMucHVzaF9iYWNrKE4pOworI2lmbmRlZiBOREVCVUcKKyAgVmVyaWZ5Tm9kZShOKTsKKyNlbmRpZgorICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEVWVD4gJlJlc3VsdFR5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKSB7CisgIHJldHVybiBnZXROb2RlKE9wY29kZSwgREwsIGdldFZUTGlzdCgmUmVzdWx0VHlzWzBdLCBSZXN1bHRUeXMuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgT3BzLCBOdW1PcHMpOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZUICpWVHMsIHVuc2lnbmVkIE51bVZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKSB7CisgIGlmIChOdW1WVHMgPT0gMSkKKyAgICByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVHNbMF0sIE9wcywgTnVtT3BzKTsKKyAgcmV0dXJuIGdldE5vZGUoT3Bjb2RlLCBETCwgbWFrZVZUTGlzdChWVHMsIE51bVZUcyksIE9wcywgTnVtT3BzKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgU0RWVExpc3QgVlRMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpIHsKKyAgaWYgKFZUTGlzdC5OdW1WVHMgPT0gMSkKKyAgICByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVExpc3QuVlRzWzBdLCBPcHMsIE51bU9wcyk7CisKKyNpZiAwCisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIC8vIEZJWE1FOiBmaWd1cmUgb3V0IGhvdyB0byBzYWZlbHkgaGFuZGxlIHRoaW5ncyBsaWtlCisgIC8vIGludCBmb28oaW50IHgpIHsgcmV0dXJuIDEgPDwgKHggJiAyNTUpOyB9CisgIC8vIGludCBiYXIoKSB7IHJldHVybiBmb28oMjU2KTsgfQorICBjYXNlIElTRDo6U1JBX1BBUlRTOgorICBjYXNlIElTRDo6U1JMX1BBUlRTOgorICBjYXNlIElTRDo6U0hMX1BBUlRTOgorICAgIGlmIChOMy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNJR05fRVhURU5EX0lOUkVHICYmCisgICAgICAgIGNhc3Q8VlRTRE5vZGU+KE4zLmdldE9wZXJhbmQoMSkpLT5nZXRWVCgpICE9IE1WVDo6aTEpCisgICAgICByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVCwgTjEsIE4yLCBOMy5nZXRPcGVyYW5kKDApKTsKKyAgICBlbHNlIGlmIChOMy5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCkKKyAgICAgIGlmIChDb25zdGFudFNETm9kZSAqQW5kUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4zLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgIC8vIElmIHRoZSBhbmQgaXMgb25seSBtYXNraW5nIG91dCBiaXRzIHRoYXQgY2Fubm90IGVmZmVjdCB0aGUgc2hpZnQsCisgICAgICAgIC8vIGVsaW1pbmF0ZSB0aGUgYW5kLgorICAgICAgICB1bnNpZ25lZCBOdW1CaXRzID0gVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSoyOworICAgICAgICBpZiAoKEFuZFJIUy0+Z2V0VmFsdWUoKSAmIChOdW1CaXRzLTEpKSA9PSBOdW1CaXRzLTEpCisgICAgICAgICAgcmV0dXJuIGdldE5vZGUoT3Bjb2RlLCBETCwgVlQsIE4xLCBOMiwgTjMuZ2V0T3BlcmFuZCgwKSk7CisgICAgICB9CisgICAgYnJlYWs7CisgIH0KKyNlbmRpZgorCisgIC8vIE1lbW9pemUgdGhlIG5vZGUgdW5sZXNzIGl0IHJldHVybnMgYSBmbGFnLgorICBTRE5vZGUgKk47CisgIGlmIChWVExpc3QuVlRzW1ZUTGlzdC5OdW1WVHMtMV0gIT0gTVZUOjpGbGFnKSB7CisgICAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgICBBZGROb2RlSUROb2RlKElELCBPcGNvZGUsIFZUTGlzdCwgT3BzLCBOdW1PcHMpOworICAgIHZvaWQgKklQID0gMDsKKyAgICBpZiAoU0ROb2RlICpFID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKEUsIDApOworCisgICAgaWYgKE51bU9wcyA9PSAxKSB7CisgICAgICBOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBVbmFyeVNETm9kZShPcGNvZGUsIERMLCBWVExpc3QsIE9wc1swXSk7CisgICAgfSBlbHNlIGlmIChOdW1PcHMgPT0gMikgeworICAgICAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgQmluYXJ5U0ROb2RlKE9wY29kZSwgREwsIFZUTGlzdCwgT3BzWzBdLCBPcHNbMV0pOworICAgIH0gZWxzZSBpZiAoTnVtT3BzID09IDMpIHsKKyAgICAgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIFRlcm5hcnlTRE5vZGUoT3Bjb2RlLCBETCwgVlRMaXN0LCBPcHNbMF0sIE9wc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzWzJdKTsKKyAgICB9IGVsc2UgeworICAgICAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgU0ROb2RlKE9wY29kZSwgREwsIFZUTGlzdCwgT3BzLCBOdW1PcHMpOworICAgIH0KKyAgICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIH0gZWxzZSB7CisgICAgaWYgKE51bU9wcyA9PSAxKSB7CisgICAgICBOID0gbmV3IChOb2RlQWxsb2NhdG9yKSBVbmFyeVNETm9kZShPcGNvZGUsIERMLCBWVExpc3QsIE9wc1swXSk7CisgICAgfSBlbHNlIGlmIChOdW1PcHMgPT0gMikgeworICAgICAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgQmluYXJ5U0ROb2RlKE9wY29kZSwgREwsIFZUTGlzdCwgT3BzWzBdLCBPcHNbMV0pOworICAgIH0gZWxzZSBpZiAoTnVtT3BzID09IDMpIHsKKyAgICAgIE4gPSBuZXcgKE5vZGVBbGxvY2F0b3IpIFRlcm5hcnlTRE5vZGUoT3Bjb2RlLCBETCwgVlRMaXN0LCBPcHNbMF0sIE9wc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzWzJdKTsKKyAgICB9IGVsc2UgeworICAgICAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgU0ROb2RlKE9wY29kZSwgREwsIFZUTGlzdCwgT3BzLCBOdW1PcHMpOworICAgIH0KKyAgfQorICBBbGxOb2Rlcy5wdXNoX2JhY2soTik7CisjaWZuZGVmIE5ERUJVRworICBWZXJpZnlOb2RlKE4pOworI2VuZGlmCisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBTRFZUTGlzdCBWVExpc3QpIHsKKyAgcmV0dXJuIGdldE5vZGUoT3Bjb2RlLCBETCwgVlRMaXN0LCAwLCAwKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgU0RWVExpc3QgVlRMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSkgeworICBTRFZhbHVlIE9wc1tdID0geyBOMSB9OworICByZXR1cm4gZ2V0Tm9kZShPcGNvZGUsIERMLCBWVExpc3QsIE9wcywgMSk7Cit9CisKK1NEVmFsdWUgU2VsZWN0aW9uREFHOjpnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgREwsIFNEVlRMaXN0IFZUTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIpIHsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgTjEsIE4yIH07CisgIHJldHVybiBnZXROb2RlKE9wY29kZSwgREwsIFZUTGlzdCwgT3BzLCAyKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgU0RWVExpc3QgVlRMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMiwgU0RWYWx1ZSBOMykgeworICBTRFZhbHVlIE9wc1tdID0geyBOMSwgTjIsIE4zIH07CisgIHJldHVybiBnZXROb2RlKE9wY29kZSwgREwsIFZUTGlzdCwgT3BzLCAzKTsKK30KKworU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBETCwgU0RWVExpc3QgVlRMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMiwgU0RWYWx1ZSBOMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjQpIHsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgTjEsIE4yLCBOMywgTjQgfTsKKyAgcmV0dXJuIGdldE5vZGUoT3Bjb2RlLCBETCwgVlRMaXN0LCBPcHMsIDQpOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBTRFZUTGlzdCBWVExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4xLCBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBONCwgU0RWYWx1ZSBONSkgeworICBTRFZhbHVlIE9wc1tdID0geyBOMSwgTjIsIE4zLCBONCwgTjUgfTsKKyAgcmV0dXJuIGdldE5vZGUoT3Bjb2RlLCBETCwgVlRMaXN0LCBPcHMsIDUpOworfQorCitTRFZUTGlzdCBTZWxlY3Rpb25EQUc6OmdldFZUTGlzdChFVlQgVlQpIHsKKyAgcmV0dXJuIG1ha2VWVExpc3QoU0ROb2RlOjpnZXRWYWx1ZVR5cGVMaXN0KFZUKSwgMSk7Cit9CisKK1NEVlRMaXN0IFNlbGVjdGlvbkRBRzo6Z2V0VlRMaXN0KEVWVCBWVDEsIEVWVCBWVDIpIHsKKyAgZm9yIChzdGQ6OnZlY3RvcjxTRFZUTGlzdD46OnJldmVyc2VfaXRlcmF0b3IgSSA9IFZUTGlzdC5yYmVnaW4oKSwKKyAgICAgICBFID0gVlRMaXN0LnJlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKEktPk51bVZUcyA9PSAyICYmIEktPlZUc1swXSA9PSBWVDEgJiYgSS0+VlRzWzFdID09IFZUMikKKyAgICAgIHJldHVybiAqSTsKKworICBFVlQgKkFycmF5ID0gQWxsb2NhdG9yLkFsbG9jYXRlPEVWVD4oMik7CisgIEFycmF5WzBdID0gVlQxOworICBBcnJheVsxXSA9IFZUMjsKKyAgU0RWVExpc3QgUmVzdWx0ID0gbWFrZVZUTGlzdChBcnJheSwgMik7CisgIFZUTGlzdC5wdXNoX2JhY2soUmVzdWx0KTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworU0RWVExpc3QgU2VsZWN0aW9uREFHOjpnZXRWVExpc3QoRVZUIFZUMSwgRVZUIFZUMiwgRVZUIFZUMykgeworICBmb3IgKHN0ZDo6dmVjdG9yPFNEVlRMaXN0Pjo6cmV2ZXJzZV9pdGVyYXRvciBJID0gVlRMaXN0LnJiZWdpbigpLAorICAgICAgIEUgPSBWVExpc3QucmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoSS0+TnVtVlRzID09IDMgJiYgSS0+VlRzWzBdID09IFZUMSAmJiBJLT5WVHNbMV0gPT0gVlQyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIEktPlZUc1syXSA9PSBWVDMpCisgICAgICByZXR1cm4gKkk7CisKKyAgRVZUICpBcnJheSA9IEFsbG9jYXRvci5BbGxvY2F0ZTxFVlQ+KDMpOworICBBcnJheVswXSA9IFZUMTsKKyAgQXJyYXlbMV0gPSBWVDI7CisgIEFycmF5WzJdID0gVlQzOworICBTRFZUTGlzdCBSZXN1bHQgPSBtYWtlVlRMaXN0KEFycmF5LCAzKTsKKyAgVlRMaXN0LnB1c2hfYmFjayhSZXN1bHQpOworICByZXR1cm4gUmVzdWx0OworfQorCitTRFZUTGlzdCBTZWxlY3Rpb25EQUc6OmdldFZUTGlzdChFVlQgVlQxLCBFVlQgVlQyLCBFVlQgVlQzLCBFVlQgVlQ0KSB7CisgIGZvciAoc3RkOjp2ZWN0b3I8U0RWVExpc3Q+OjpyZXZlcnNlX2l0ZXJhdG9yIEkgPSBWVExpc3QucmJlZ2luKCksCisgICAgICAgRSA9IFZUTGlzdC5yZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChJLT5OdW1WVHMgPT0gNCAmJiBJLT5WVHNbMF0gPT0gVlQxICYmIEktPlZUc1sxXSA9PSBWVDIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSS0+VlRzWzJdID09IFZUMyAmJiBJLT5WVHNbM10gPT0gVlQ0KQorICAgICAgcmV0dXJuICpJOworCisgIEVWVCAqQXJyYXkgPSBBbGxvY2F0b3IuQWxsb2NhdGU8RVZUPig0KTsKKyAgQXJyYXlbMF0gPSBWVDE7CisgIEFycmF5WzFdID0gVlQyOworICBBcnJheVsyXSA9IFZUMzsKKyAgQXJyYXlbM10gPSBWVDQ7CisgIFNEVlRMaXN0IFJlc3VsdCA9IG1ha2VWVExpc3QoQXJyYXksIDQpOworICBWVExpc3QucHVzaF9iYWNrKFJlc3VsdCk7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK1NEVlRMaXN0IFNlbGVjdGlvbkRBRzo6Z2V0VlRMaXN0KGNvbnN0IEVWVCAqVlRzLCB1bnNpZ25lZCBOdW1WVHMpIHsKKyAgc3dpdGNoIChOdW1WVHMpIHsKKyAgICBjYXNlIDA6IGxsdm1fdW5yZWFjaGFibGUoIkNhbm5vdCBoYXZlIG5vZGVzIHdpdGhvdXQgcmVzdWx0cyEiKTsKKyAgICBjYXNlIDE6IHJldHVybiBnZXRWVExpc3QoVlRzWzBdKTsKKyAgICBjYXNlIDI6IHJldHVybiBnZXRWVExpc3QoVlRzWzBdLCBWVHNbMV0pOworICAgIGNhc2UgMzogcmV0dXJuIGdldFZUTGlzdChWVHNbMF0sIFZUc1sxXSwgVlRzWzJdKTsKKyAgICBjYXNlIDQ6IHJldHVybiBnZXRWVExpc3QoVlRzWzBdLCBWVHNbMV0sIFZUc1syXSwgVlRzWzNdKTsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorCisgIGZvciAoc3RkOjp2ZWN0b3I8U0RWVExpc3Q+OjpyZXZlcnNlX2l0ZXJhdG9yIEkgPSBWVExpc3QucmJlZ2luKCksCisgICAgICAgRSA9IFZUTGlzdC5yZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPk51bVZUcyAhPSBOdW1WVHMgfHwgVlRzWzBdICE9IEktPlZUc1swXSB8fCBWVHNbMV0gIT0gSS0+VlRzWzFdKQorICAgICAgY29udGludWU7CisKKyAgICBib29sIE5vTWF0Y2ggPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAyOyBpICE9IE51bVZUczsgKytpKQorICAgICAgaWYgKFZUc1tpXSAhPSBJLT5WVHNbaV0pIHsKKyAgICAgICAgTm9NYXRjaCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGlmICghTm9NYXRjaCkKKyAgICAgIHJldHVybiAqSTsKKyAgfQorCisgIEVWVCAqQXJyYXkgPSBBbGxvY2F0b3IuQWxsb2NhdGU8RVZUPihOdW1WVHMpOworICBzdGQ6OmNvcHkoVlRzLCBWVHMrTnVtVlRzLCBBcnJheSk7CisgIFNEVlRMaXN0IFJlc3VsdCA9IG1ha2VWVExpc3QoQXJyYXksIE51bVZUcyk7CisgIFZUTGlzdC5wdXNoX2JhY2soUmVzdWx0KTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworCisvLy8gVXBkYXRlTm9kZU9wZXJhbmRzIC0gKk11dGF0ZSogdGhlIHNwZWNpZmllZCBub2RlIGluLXBsYWNlIHRvIGhhdmUgdGhlCisvLy8gc3BlY2lmaWVkIG9wZXJhbmRzLiAgSWYgdGhlIHJlc3VsdGFudCBub2RlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBEQUcsCisvLy8gdGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIHNwZWNpZmllZCBub2RlLCBpbnN0ZWFkIGl0IHJldHVybnMgdGhlIG5vZGUgdGhhdAorLy8vIGFscmVhZHkgZXhpc3RzLiAgSWYgdGhlIHJlc3VsdGFudCBub2RlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBEQUcsIHRoZQorLy8vIGlucHV0IG5vZGUgaXMgcmV0dXJuZWQuICBBcyBhIGRlZ2VuZXJhdGUgY2FzZSwgaWYgeW91IHNwZWNpZnkgdGhlIHNhbWUKKy8vLyBpbnB1dCBvcGVyYW5kcyBhcyB0aGUgbm9kZSBhbHJlYWR5IGhhcywgdGhlIGlucHV0IG5vZGUgaXMgcmV0dXJuZWQuCitTRE5vZGUgKlNlbGVjdGlvbkRBRzo6VXBkYXRlTm9kZU9wZXJhbmRzKFNETm9kZSAqTiwgU0RWYWx1ZSBPcCkgeworICBhc3NlcnQoTi0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAxICYmICJVcGRhdGUgd2l0aCB3cm9uZyBudW1iZXIgb2Ygb3BlcmFuZHMiKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgbm8gY2hhbmdlLgorICBpZiAoT3AgPT0gTi0+Z2V0T3BlcmFuZCgwKSkgcmV0dXJuIE47CisKKyAgLy8gU2VlIGlmIHRoZSBtb2RpZmllZCBub2RlIGFscmVhZHkgZXhpc3RzLgorICB2b2lkICpJbnNlcnRQb3MgPSAwOworICBpZiAoU0ROb2RlICpFeGlzdGluZyA9IEZpbmRNb2RpZmllZE5vZGVTbG90KE4sIE9wLCBJbnNlcnRQb3MpKQorICAgIHJldHVybiBFeGlzdGluZzsKKworICAvLyBOb3BlIGl0IGRvZXNuJ3QuICBSZW1vdmUgdGhlIG5vZGUgZnJvbSBpdHMgY3VycmVudCBwbGFjZSBpbiB0aGUgbWFwcy4KKyAgaWYgKEluc2VydFBvcykKKyAgICBpZiAoIVJlbW92ZU5vZGVGcm9tQ1NFTWFwcyhOKSkKKyAgICAgIEluc2VydFBvcyA9IDA7CisKKyAgLy8gTm93IHdlIHVwZGF0ZSB0aGUgb3BlcmFuZHMuCisgIE4tPk9wZXJhbmRMaXN0WzBdLnNldChPcCk7CisKKyAgLy8gSWYgdGhpcyBnZXRzIHB1dCBpbnRvIGEgQ1NFIG1hcCwgYWRkIGl0LgorICBpZiAoSW5zZXJ0UG9zKSBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJbnNlcnRQb3MpOworICByZXR1cm4gTjsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUc6OlVwZGF0ZU5vZGVPcGVyYW5kcyhTRE5vZGUgKk4sIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMikgeworICBhc3NlcnQoTi0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAyICYmICJVcGRhdGUgd2l0aCB3cm9uZyBudW1iZXIgb2Ygb3BlcmFuZHMiKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgbm8gY2hhbmdlLgorICBpZiAoT3AxID09IE4tPmdldE9wZXJhbmQoMCkgJiYgT3AyID09IE4tPmdldE9wZXJhbmQoMSkpCisgICAgcmV0dXJuIE47ICAgLy8gTm8gb3BlcmFuZHMgY2hhbmdlZCwganVzdCByZXR1cm4gdGhlIGlucHV0IG5vZGUuCisKKyAgLy8gU2VlIGlmIHRoZSBtb2RpZmllZCBub2RlIGFscmVhZHkgZXhpc3RzLgorICB2b2lkICpJbnNlcnRQb3MgPSAwOworICBpZiAoU0ROb2RlICpFeGlzdGluZyA9IEZpbmRNb2RpZmllZE5vZGVTbG90KE4sIE9wMSwgT3AyLCBJbnNlcnRQb3MpKQorICAgIHJldHVybiBFeGlzdGluZzsKKworICAvLyBOb3BlIGl0IGRvZXNuJ3QuICBSZW1vdmUgdGhlIG5vZGUgZnJvbSBpdHMgY3VycmVudCBwbGFjZSBpbiB0aGUgbWFwcy4KKyAgaWYgKEluc2VydFBvcykKKyAgICBpZiAoIVJlbW92ZU5vZGVGcm9tQ1NFTWFwcyhOKSkKKyAgICAgIEluc2VydFBvcyA9IDA7CisKKyAgLy8gTm93IHdlIHVwZGF0ZSB0aGUgb3BlcmFuZHMuCisgIGlmIChOLT5PcGVyYW5kTGlzdFswXSAhPSBPcDEpCisgICAgTi0+T3BlcmFuZExpc3RbMF0uc2V0KE9wMSk7CisgIGlmIChOLT5PcGVyYW5kTGlzdFsxXSAhPSBPcDIpCisgICAgTi0+T3BlcmFuZExpc3RbMV0uc2V0KE9wMik7CisKKyAgLy8gSWYgdGhpcyBnZXRzIHB1dCBpbnRvIGEgQ1NFIG1hcCwgYWRkIGl0LgorICBpZiAoSW5zZXJ0UG9zKSBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJbnNlcnRQb3MpOworICByZXR1cm4gTjsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUc6OgorVXBkYXRlTm9kZU9wZXJhbmRzKFNETm9kZSAqTiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMykgeworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiwgT3AzIH07CisgIHJldHVybiBVcGRhdGVOb2RlT3BlcmFuZHMoTiwgT3BzLCAzKTsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUc6OgorVXBkYXRlTm9kZU9wZXJhbmRzKFNETm9kZSAqTiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLAorICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AzLCBTRFZhbHVlIE9wNCkgeworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiwgT3AzLCBPcDQgfTsKKyAgcmV0dXJuIFVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBPcHMsIDQpOworfQorCitTRE5vZGUgKlNlbGVjdGlvbkRBRzo6CitVcGRhdGVOb2RlT3BlcmFuZHMoU0ROb2RlICpOLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDMsIFNEVmFsdWUgT3A0LCBTRFZhbHVlIE9wNSkgeworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiwgT3AzLCBPcDQsIE9wNSB9OworICByZXR1cm4gVXBkYXRlTm9kZU9wZXJhbmRzKE4sIE9wcywgNSk7Cit9CisKK1NETm9kZSAqU2VsZWN0aW9uREFHOjoKK1VwZGF0ZU5vZGVPcGVyYW5kcyhTRE5vZGUgKk4sIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKSB7CisgIGFzc2VydChOLT5nZXROdW1PcGVyYW5kcygpID09IE51bU9wcyAmJgorICAgICAgICAgIlVwZGF0ZSB3aXRoIHdyb25nIG51bWJlciBvZiBvcGVyYW5kcyIpOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBubyBjaGFuZ2UuCisgIGJvb2wgQW55Q2hhbmdlID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICBpZiAoT3BzW2ldICE9IE4tPmdldE9wZXJhbmQoaSkpIHsKKyAgICAgIEFueUNoYW5nZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBObyBvcGVyYW5kcyBjaGFuZ2VkLCBqdXN0IHJldHVybiB0aGUgaW5wdXQgbm9kZS4KKyAgaWYgKCFBbnlDaGFuZ2UpIHJldHVybiBOOworCisgIC8vIFNlZSBpZiB0aGUgbW9kaWZpZWQgbm9kZSBhbHJlYWR5IGV4aXN0cy4KKyAgdm9pZCAqSW5zZXJ0UG9zID0gMDsKKyAgaWYgKFNETm9kZSAqRXhpc3RpbmcgPSBGaW5kTW9kaWZpZWROb2RlU2xvdChOLCBPcHMsIE51bU9wcywgSW5zZXJ0UG9zKSkKKyAgICByZXR1cm4gRXhpc3Rpbmc7CisKKyAgLy8gTm9wZSBpdCBkb2Vzbid0LiAgUmVtb3ZlIHRoZSBub2RlIGZyb20gaXRzIGN1cnJlbnQgcGxhY2UgaW4gdGhlIG1hcHMuCisgIGlmIChJbnNlcnRQb3MpCisgICAgaWYgKCFSZW1vdmVOb2RlRnJvbUNTRU1hcHMoTikpCisgICAgICBJbnNlcnRQb3MgPSAwOworCisgIC8vIE5vdyB3ZSB1cGRhdGUgdGhlIG9wZXJhbmRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bU9wczsgKytpKQorICAgIGlmIChOLT5PcGVyYW5kTGlzdFtpXSAhPSBPcHNbaV0pCisgICAgICBOLT5PcGVyYW5kTGlzdFtpXS5zZXQoT3BzW2ldKTsKKworICAvLyBJZiB0aGlzIGdldHMgcHV0IGludG8gYSBDU0UgbWFwLCBhZGQgaXQuCisgIGlmIChJbnNlcnRQb3MpIENTRU1hcC5JbnNlcnROb2RlKE4sIEluc2VydFBvcyk7CisgIHJldHVybiBOOworfQorCisvLy8gRHJvcE9wZXJhbmRzIC0gUmVsZWFzZSB0aGUgb3BlcmFuZHMgYW5kIHNldCB0aGlzIG5vZGUgdG8gaGF2ZQorLy8vIHplcm8gb3BlcmFuZHMuCit2b2lkIFNETm9kZTo6RHJvcE9wZXJhbmRzKCkgeworICAvLyBVbmxpa2UgdGhlIGNvZGUgaW4gTW9ycGhOb2RlVG8gdGhhdCBkb2VzIHRoaXMsIHdlIGRvbid0IG5lZWQgdG8KKyAgLy8gd2F0Y2ggZm9yIGRlYWQgbm9kZXMgaGVyZS4KKyAgZm9yIChvcF9pdGVyYXRvciBJID0gb3BfYmVnaW4oKSwgRSA9IG9wX2VuZCgpOyBJICE9IEU7ICkgeworICAgIFNEVXNlICZVc2UgPSAqSSsrOworICAgIFVzZS5zZXQoU0RWYWx1ZSgpKTsKKyAgfQorfQorCisvLy8gU2VsZWN0Tm9kZVRvIC0gVGhlc2UgYXJlIHdyYXBwZXJzIGFyb3VuZCBNb3JwaE5vZGVUbyB0aGF0IGFjY2VwdCBhCisvLy8gbWFjaGluZSBvcGNvZGUuCisvLy8KK1NETm9kZSAqU2VsZWN0aW9uREFHOjpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBNYWNoaW5lT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUKTsKKyAgcmV0dXJuIFNlbGVjdE5vZGVUbyhOLCBNYWNoaW5lT3BjLCBWVHMsIDAsIDApOworfQorCitTRE5vZGUgKlNlbGVjdGlvbkRBRzo6U2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgTWFjaGluZU9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZULCBTRFZhbHVlIE9wMSkgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEgfTsKKyAgcmV0dXJuIFNlbGVjdE5vZGVUbyhOLCBNYWNoaW5lT3BjLCBWVHMsIE9wcywgMSk7Cit9CisKK1NETm9kZSAqU2VsZWN0aW9uREFHOjpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBNYWNoaW5lT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQsIFNEVmFsdWUgT3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMikgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiB9OworICByZXR1cm4gU2VsZWN0Tm9kZVRvKE4sIE1hY2hpbmVPcGMsIFZUcywgT3BzLCAyKTsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUc6OlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIE1hY2hpbmVPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCwgU0RWYWx1ZSBPcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMykgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiwgT3AzIH07CisgIHJldHVybiBTZWxlY3ROb2RlVG8oTiwgTWFjaGluZU9wYywgVlRzLCBPcHMsIDMpOworfQorCitTRE5vZGUgKlNlbGVjdGlvbkRBRzo6U2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgTWFjaGluZU9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZULCBjb25zdCBTRFZhbHVlICpPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bU9wcykgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQpOworICByZXR1cm4gU2VsZWN0Tm9kZVRvKE4sIE1hY2hpbmVPcGMsIFZUcywgT3BzLCBOdW1PcHMpOworfQorCitTRE5vZGUgKlNlbGVjdGlvbkRBRzo6U2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgTWFjaGluZU9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMSwgRVZUIFZUMiwgY29uc3QgU0RWYWx1ZSAqT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1PcHMpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUMSwgVlQyKTsKKyAgcmV0dXJuIFNlbGVjdE5vZGVUbyhOLCBNYWNoaW5lT3BjLCBWVHMsIE9wcywgTnVtT3BzKTsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUc6OlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIE1hY2hpbmVPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDEsIEVWVCBWVDIpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUMSwgVlQyKTsKKyAgcmV0dXJuIFNlbGVjdE5vZGVUbyhOLCBNYWNoaW5lT3BjLCBWVHMsIChTRFZhbHVlICopMCwgMCk7Cit9CisKK1NETm9kZSAqU2VsZWN0aW9uREFHOjpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBNYWNoaW5lT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQxLCBFVlQgVlQyLCBFVlQgVlQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpPcHMsIHVuc2lnbmVkIE51bU9wcykgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQxLCBWVDIsIFZUMyk7CisgIHJldHVybiBTZWxlY3ROb2RlVG8oTiwgTWFjaGluZU9wYywgVlRzLCBPcHMsIE51bU9wcyk7Cit9CisKK1NETm9kZSAqU2VsZWN0aW9uREFHOjpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBNYWNoaW5lT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQxLCBFVlQgVlQyLCBFVlQgVlQzLCBFVlQgVlQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpPcHMsIHVuc2lnbmVkIE51bU9wcykgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQxLCBWVDIsIFZUMywgVlQ0KTsKKyAgcmV0dXJuIFNlbGVjdE5vZGVUbyhOLCBNYWNoaW5lT3BjLCBWVHMsIE9wcywgTnVtT3BzKTsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUc6OlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIE1hY2hpbmVPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDEsIEVWVCBWVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxKSB7CisgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChWVDEsIFZUMik7CisgIFNEVmFsdWUgT3BzW10gPSB7IE9wMSB9OworICByZXR1cm4gU2VsZWN0Tm9kZVRvKE4sIE1hY2hpbmVPcGMsIFZUcywgT3BzLCAxKTsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUc6OlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIE1hY2hpbmVPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDEsIEVWVCBWVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMikgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQxLCBWVDIpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiB9OworICByZXR1cm4gU2VsZWN0Tm9kZVRvKE4sIE1hY2hpbmVPcGMsIFZUcywgT3BzLCAyKTsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUc6OlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIE1hY2hpbmVPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDEsIEVWVCBWVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDMpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUMSwgVlQyKTsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgT3AxLCBPcDIsIE9wMyB9OworICByZXR1cm4gU2VsZWN0Tm9kZVRvKE4sIE1hY2hpbmVPcGMsIFZUcywgT3BzLCAzKTsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUc6OlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIE1hY2hpbmVPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDEsIEVWVCBWVDIsIEVWVCBWVDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDMpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUMSwgVlQyLCBWVDMpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiwgT3AzIH07CisgIHJldHVybiBTZWxlY3ROb2RlVG8oTiwgTWFjaGluZU9wYywgVlRzLCBPcHMsIDMpOworfQorCitTRE5vZGUgKlNlbGVjdGlvbkRBRzo6U2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgTWFjaGluZU9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWVExpc3QgVlRzLCBjb25zdCBTRFZhbHVlICpPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bU9wcykgeworICBOID0gTW9ycGhOb2RlVG8oTiwgfk1hY2hpbmVPcGMsIFZUcywgT3BzLCBOdW1PcHMpOworICAvLyBSZXNldCB0aGUgTm9kZUlEIHRvIC0xLgorICBOLT5zZXROb2RlSWQoLTEpOworICByZXR1cm4gTjsKK30KKworLy8vIE1vcnBoTm9kZVRvIC0gVGhpcyAqbXV0YXRlcyogdGhlIHNwZWNpZmllZCBub2RlIHRvIGhhdmUgdGhlIHNwZWNpZmllZAorLy8vIHJldHVybiB0eXBlLCBvcGNvZGUsIGFuZCBvcGVyYW5kcy4KKy8vLworLy8vIE5vdGUgdGhhdCBNb3JwaE5vZGVUbyByZXR1cm5zIHRoZSByZXN1bHRhbnQgbm9kZS4gIElmIHRoZXJlIGlzIGFscmVhZHkgYQorLy8vIG5vZGUgb2YgdGhlIHNwZWNpZmllZCBvcGNvZGUgYW5kIG9wZXJhbmRzLCBpdCByZXR1cm5zIHRoYXQgbm9kZSBpbnN0ZWFkIG9mCisvLy8gdGhlIGN1cnJlbnQgb25lLiAgTm90ZSB0aGF0IHRoZSBEZWJ1Z0xvYyBuZWVkIG5vdCBiZSB0aGUgc2FtZS4KKy8vLworLy8vIFVzaW5nIE1vcnBoTm9kZVRvIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG5vZGUgYW5kIHN3YXBwaW5nIGl0IGluCisvLy8gd2l0aCBSZXBsYWNlQWxsVXNlc1dpdGggYm90aCBiZWNhdXNlIGl0IG9mdGVuIGF2b2lkcyBhbGxvY2F0aW5nIGEgbmV3CisvLy8gbm9kZSwgYW5kIGJlY2F1c2UgaXQgZG9lc24ndCByZXF1aXJlIENTRSByZWNhbGN1bGF0aW9uIGZvciBhbnkgb2YKKy8vLyB0aGUgbm9kZSdzIHVzZXJzLgorLy8vCitTRE5vZGUgKlNlbGVjdGlvbkRBRzo6TW9ycGhOb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWVExpc3QgVlRzLCBjb25zdCBTRFZhbHVlICpPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtT3BzKSB7CisgIC8vIElmIGFuIGlkZW50aWNhbCBub2RlIGFscmVhZHkgZXhpc3RzLCB1c2UgaXQuCisgIHZvaWQgKklQID0gMDsKKyAgaWYgKFZUcy5WVHNbVlRzLk51bVZUcy0xXSAhPSBNVlQ6OkZsYWcpIHsKKyAgICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICAgIEFkZE5vZGVJRE5vZGUoSUQsIE9wYywgVlRzLCBPcHMsIE51bU9wcyk7CisgICAgaWYgKFNETm9kZSAqT04gPSBDU0VNYXAuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKQorICAgICAgcmV0dXJuIE9OOworICB9CisKKyAgaWYgKCFSZW1vdmVOb2RlRnJvbUNTRU1hcHMoTikpCisgICAgSVAgPSAwOworCisgIC8vIFN0YXJ0IHRoZSBtb3JwaGluZy4KKyAgTi0+Tm9kZVR5cGUgPSBPcGM7CisgIE4tPlZhbHVlTGlzdCA9IFZUcy5WVHM7CisgIE4tPk51bVZhbHVlcyA9IFZUcy5OdW1WVHM7CisKKyAgLy8gQ2xlYXIgdGhlIG9wZXJhbmRzIGxpc3QsIHVwZGF0aW5nIHVzZWQgbm9kZXMgdG8gcmVtb3ZlIHRoaXMgZnJvbSB0aGVpcgorICAvLyB1c2UgbGlzdC4gIEtlZXAgdHJhY2sgb2YgYW55IG9wZXJhbmRzIHRoYXQgYmVjb21lIGRlYWQgYXMgYSByZXN1bHQuCisgIFNtYWxsUHRyU2V0PFNETm9kZSosIDE2PiBEZWFkTm9kZVNldDsKKyAgZm9yIChTRE5vZGU6Om9wX2l0ZXJhdG9yIEkgPSBOLT5vcF9iZWdpbigpLCBFID0gTi0+b3BfZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgU0RVc2UgJlVzZSA9ICpJKys7CisgICAgU0ROb2RlICpVc2VkID0gVXNlLmdldE5vZGUoKTsKKyAgICBVc2Uuc2V0KFNEVmFsdWUoKSk7CisgICAgaWYgKFVzZWQtPnVzZV9lbXB0eSgpKQorICAgICAgRGVhZE5vZGVTZXQuaW5zZXJ0KFVzZWQpOworICB9CisKKyAgaWYgKE1hY2hpbmVTRE5vZGUgKk1OID0gZHluX2Nhc3Q8TWFjaGluZVNETm9kZT4oTikpIHsKKyAgICAvLyBJbml0aWFsaXplIHRoZSBtZW1vcnkgcmVmZXJlbmNlcyBpbmZvcm1hdGlvbi4KKyAgICBNTi0+c2V0TWVtUmVmcygwLCAwKTsKKyAgICAvLyBJZiBOdW1PcHMgaXMgbGFyZ2VyIHRoYW4gdGhlICMgb2Ygb3BlcmFuZHMgd2UgY2FuIGhhdmUgaW4gYQorICAgIC8vIE1hY2hpbmVTRE5vZGUsIHJlYWxsb2NhdGUgdGhlIG9wZXJhbmQgbGlzdC4KKyAgICBpZiAoTnVtT3BzID4gTU4tPk51bU9wZXJhbmRzIHx8ICFNTi0+T3BlcmFuZHNOZWVkRGVsZXRlKSB7CisgICAgICBpZiAoTU4tPk9wZXJhbmRzTmVlZERlbGV0ZSkKKyAgICAgICAgZGVsZXRlW10gTU4tPk9wZXJhbmRMaXN0OworICAgICAgaWYgKE51bU9wcyA+IGFycmF5X2xlbmd0aG9mKE1OLT5Mb2NhbE9wZXJhbmRzKSkKKyAgICAgICAgLy8gV2UncmUgY3JlYXRpbmcgYSBmaW5hbCBub2RlIHRoYXQgd2lsbCBsaXZlIHVubW9ycGhlZCBmb3IgdGhlCisgICAgICAgIC8vIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCBTZWxlY3Rpb25EQUcgaXRlcmF0aW9uLCBzbyB3ZSBjYW4gYWxsb2NhdGUKKyAgICAgICAgLy8gdGhlIG9wZXJhbmRzIGRpcmVjdGx5IG91dCBvZiBhIHBvb2wgd2l0aCBubyByZWN5Y2xpbmcgbWV0YWRhdGEuCisgICAgICAgIE1OLT5Jbml0T3BlcmFuZHMoT3BlcmFuZEFsbG9jYXRvci5BbGxvY2F0ZTxTRFVzZT4oTnVtT3BzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsIE51bU9wcyk7CisgICAgICBlbHNlCisgICAgICAgIE1OLT5Jbml0T3BlcmFuZHMoTU4tPkxvY2FsT3BlcmFuZHMsIE9wcywgTnVtT3BzKTsKKyAgICAgIE1OLT5PcGVyYW5kc05lZWREZWxldGUgPSBmYWxzZTsKKyAgICB9IGVsc2UKKyAgICAgIE1OLT5Jbml0T3BlcmFuZHMoTU4tPk9wZXJhbmRMaXN0LCBPcHMsIE51bU9wcyk7CisgIH0gZWxzZSB7CisgICAgLy8gSWYgTnVtT3BzIGlzIGxhcmdlciB0aGFuIHRoZSAjIG9mIG9wZXJhbmRzIHdlIGN1cnJlbnRseSBoYXZlLCByZWFsbG9jYXRlCisgICAgLy8gdGhlIG9wZXJhbmQgbGlzdC4KKyAgICBpZiAoTnVtT3BzID4gTi0+TnVtT3BlcmFuZHMpIHsKKyAgICAgIGlmIChOLT5PcGVyYW5kc05lZWREZWxldGUpCisgICAgICAgIGRlbGV0ZVtdIE4tPk9wZXJhbmRMaXN0OworICAgICAgTi0+SW5pdE9wZXJhbmRzKG5ldyBTRFVzZVtOdW1PcHNdLCBPcHMsIE51bU9wcyk7CisgICAgICBOLT5PcGVyYW5kc05lZWREZWxldGUgPSB0cnVlOworICAgIH0gZWxzZQorICAgICAgTi0+SW5pdE9wZXJhbmRzKE4tPk9wZXJhbmRMaXN0LCBPcHMsIE51bU9wcyk7CisgIH0KKworICAvLyBEZWxldGUgYW55IG5vZGVzIHRoYXQgYXJlIHN0aWxsIGRlYWQgYWZ0ZXIgYWRkaW5nIHRoZSB1c2VzIGZvciB0aGUKKyAgLy8gbmV3IG9wZXJhbmRzLgorICBpZiAoIURlYWROb2RlU2V0LmVtcHR5KCkpIHsKKyAgICBTbWFsbFZlY3RvcjxTRE5vZGUgKiwgMTY+IERlYWROb2RlczsKKyAgICBmb3IgKFNtYWxsUHRyU2V0PFNETm9kZSAqLCAxNj46Oml0ZXJhdG9yIEkgPSBEZWFkTm9kZVNldC5iZWdpbigpLAorICAgICAgICAgRSA9IERlYWROb2RlU2V0LmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmICgoKkkpLT51c2VfZW1wdHkoKSkKKyAgICAgICAgRGVhZE5vZGVzLnB1c2hfYmFjaygqSSk7CisgICAgUmVtb3ZlRGVhZE5vZGVzKERlYWROb2Rlcyk7CisgIH0KKworICBpZiAoSVApCisgICAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOyAgIC8vIE1lbW9pemUgdGhlIG5ldyBub2RlLgorICByZXR1cm4gTjsKK30KKworCisvLy8gZ2V0TWFjaGluZU5vZGUgLSBUaGVzZSBhcmUgdXNlZCBmb3IgdGFyZ2V0IHNlbGVjdG9ycyB0byBjcmVhdGUgYSBuZXcgbm9kZQorLy8vIHdpdGggc3BlY2lmaWVkIHJldHVybiB0eXBlKHMpLCBNYWNoaW5lSW5zdHIgb3Bjb2RlLCBhbmQgb3BlcmFuZHMuCisvLy8KKy8vLyBOb3RlIHRoYXQgZ2V0TWFjaGluZU5vZGUgcmV0dXJucyB0aGUgcmVzdWx0YW50IG5vZGUuICBJZiB0aGVyZSBpcyBhbHJlYWR5IGEKKy8vLyBub2RlIG9mIHRoZSBzcGVjaWZpZWQgb3Bjb2RlIGFuZCBvcGVyYW5kcywgaXQgcmV0dXJucyB0aGF0IG5vZGUgaW5zdGVhZCBvZgorLy8vIHRoZSBjdXJyZW50IG9uZS4KK01hY2hpbmVTRE5vZGUgKgorU2VsZWN0aW9uREFHOjpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgVlQpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUKTsKKyAgcmV0dXJuIGdldE1hY2hpbmVOb2RlKE9wY29kZSwgZGwsIFZUcywgMCwgMCk7Cit9CisKK01hY2hpbmVTRE5vZGUgKgorU2VsZWN0aW9uREFHOjpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgVlQsIFNEVmFsdWUgT3AxKSB7CisgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChWVCk7CisgIFNEVmFsdWUgT3BzW10gPSB7IE9wMSB9OworICByZXR1cm4gZ2V0TWFjaGluZU5vZGUoT3Bjb2RlLCBkbCwgVlRzLCBPcHMsIGFycmF5X2xlbmd0aG9mKE9wcykpOworfQorCitNYWNoaW5lU0ROb2RlICoKK1NlbGVjdGlvbkRBRzo6Z2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBkbCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUKTsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgT3AxLCBPcDIgfTsKKyAgcmV0dXJuIGdldE1hY2hpbmVOb2RlKE9wY29kZSwgZGwsIFZUcywgT3BzLCBhcnJheV9sZW5ndGhvZihPcHMpKTsKK30KKworTWFjaGluZVNETm9kZSAqCitTZWxlY3Rpb25EQUc6OmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMykgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiwgT3AzIH07CisgIHJldHVybiBnZXRNYWNoaW5lTm9kZShPcGNvZGUsIGRsLCBWVHMsIE9wcywgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7Cit9CisKK01hY2hpbmVTRE5vZGUgKgorU2VsZWN0aW9uREFHOjpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKSB7CisgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChWVCk7CisgIHJldHVybiBnZXRNYWNoaW5lTm9kZShPcGNvZGUsIGRsLCBWVHMsIE9wcywgTnVtT3BzKTsKK30KKworTWFjaGluZVNETm9kZSAqCitTZWxlY3Rpb25EQUc6OmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsIEVWVCBWVDEsIEVWVCBWVDIpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUMSwgVlQyKTsKKyAgcmV0dXJuIGdldE1hY2hpbmVOb2RlKE9wY29kZSwgZGwsIFZUcywgMCwgMCk7Cit9CisKK01hY2hpbmVTRE5vZGUgKgorU2VsZWN0aW9uREFHOjpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQxLCBFVlQgVlQyLCBTRFZhbHVlIE9wMSkgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQxLCBWVDIpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEgfTsKKyAgcmV0dXJuIGdldE1hY2hpbmVOb2RlKE9wY29kZSwgZGwsIFZUcywgT3BzLCBhcnJheV9sZW5ndGhvZihPcHMpKTsKK30KKworTWFjaGluZVNETm9kZSAqCitTZWxlY3Rpb25EQUc6OmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDEsIEVWVCBWVDIsIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMikgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQxLCBWVDIpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiB9OworICByZXR1cm4gZ2V0TWFjaGluZU5vZGUoT3Bjb2RlLCBkbCwgVlRzLCBPcHMsIGFycmF5X2xlbmd0aG9mKE9wcykpOworfQorCitNYWNoaW5lU0ROb2RlICoKK1NlbGVjdGlvbkRBRzo6Z2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMSwgRVZUIFZUMiwgU0RWYWx1ZSBPcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMykgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQxLCBWVDIpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiwgT3AzIH07CisgIHJldHVybiBnZXRNYWNoaW5lTm9kZShPcGNvZGUsIGRsLCBWVHMsIE9wcywgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7Cit9CisKK01hY2hpbmVTRE5vZGUgKgorU2VsZWN0aW9uREFHOjpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQxLCBFVlQgVlQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpPcHMsIHVuc2lnbmVkIE51bU9wcykgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQxLCBWVDIpOworICByZXR1cm4gZ2V0TWFjaGluZU5vZGUoT3Bjb2RlLCBkbCwgVlRzLCBPcHMsIE51bU9wcyk7Cit9CisKK01hY2hpbmVTRE5vZGUgKgorU2VsZWN0aW9uREFHOjpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQxLCBFVlQgVlQyLCBFVlQgVlQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUMSwgVlQyLCBWVDMpOworICBTRFZhbHVlIE9wc1tdID0geyBPcDEsIE9wMiB9OworICByZXR1cm4gZ2V0TWFjaGluZU5vZGUoT3Bjb2RlLCBkbCwgVlRzLCBPcHMsIGFycmF5X2xlbmd0aG9mKE9wcykpOworfQorCitNYWNoaW5lU0ROb2RlICoKK1NlbGVjdGlvbkRBRzo6Z2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMSwgRVZUIFZUMiwgRVZUIFZUMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMykgeworICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQxLCBWVDIsIFZUMyk7CisgIFNEVmFsdWUgT3BzW10gPSB7IE9wMSwgT3AyLCBPcDMgfTsKKyAgcmV0dXJuIGdldE1hY2hpbmVOb2RlKE9wY29kZSwgZGwsIFZUcywgT3BzLCBhcnJheV9sZW5ndGhvZihPcHMpKTsKK30KKworTWFjaGluZVNETm9kZSAqCitTZWxlY3Rpb25EQUc6OmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDEsIEVWVCBWVDIsIEVWVCBWVDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKSB7CisgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChWVDEsIFZUMiwgVlQzKTsKKyAgcmV0dXJuIGdldE1hY2hpbmVOb2RlKE9wY29kZSwgZGwsIFZUcywgT3BzLCBOdW1PcHMpOworfQorCitNYWNoaW5lU0ROb2RlICoKK1NlbGVjdGlvbkRBRzo6Z2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBEZWJ1Z0xvYyBkbCwgRVZUIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgRVZUIFZUMywgRVZUIFZUNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZUMSwgVlQyLCBWVDMsIFZUNCk7CisgIHJldHVybiBnZXRNYWNoaW5lTm9kZShPcGNvZGUsIGRsLCBWVHMsIE9wcywgTnVtT3BzKTsKK30KKworTWFjaGluZVNETm9kZSAqCitTZWxlY3Rpb25EQUc6OmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEVWVD4gJlJlc3VsdFR5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpIHsKKyAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KCZSZXN1bHRUeXNbMF0sIFJlc3VsdFR5cy5zaXplKCkpOworICByZXR1cm4gZ2V0TWFjaGluZU5vZGUoT3Bjb2RlLCBkbCwgVlRzLCBPcHMsIE51bU9wcyk7Cit9CisKK01hY2hpbmVTRE5vZGUgKgorU2VsZWN0aW9uREFHOjpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIERlYnVnTG9jIERMLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzKSB7CisgIGJvb2wgRG9DU0UgPSBWVHMuVlRzW1ZUcy5OdW1WVHMtMV0gIT0gTVZUOjpGbGFnOworICBNYWNoaW5lU0ROb2RlICpOOworICB2b2lkICpJUDsKKworICBpZiAoRG9DU0UpIHsKKyAgICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICAgIEFkZE5vZGVJRE5vZGUoSUQsIH5PcGNvZGUsIFZUcywgT3BzLCBOdW1PcHMpOworICAgIElQID0gMDsKKyAgICBpZiAoU0ROb2RlICpFID0gQ1NFTWFwLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIElQKSkKKyAgICAgIHJldHVybiBjYXN0PE1hY2hpbmVTRE5vZGU+KEUpOworICB9CisKKyAgLy8gQWxsb2NhdGUgYSBuZXcgTWFjaGluZVNETm9kZS4KKyAgTiA9IG5ldyAoTm9kZUFsbG9jYXRvcikgTWFjaGluZVNETm9kZSh+T3Bjb2RlLCBETCwgVlRzKTsKKworICAvLyBJbml0aWFsaXplIHRoZSBvcGVyYW5kcyBsaXN0LgorICBpZiAoTnVtT3BzID4gYXJyYXlfbGVuZ3Rob2YoTi0+TG9jYWxPcGVyYW5kcykpCisgICAgLy8gV2UncmUgY3JlYXRpbmcgYSBmaW5hbCBub2RlIHRoYXQgd2lsbCBsaXZlIHVubW9ycGhlZCBmb3IgdGhlCisgICAgLy8gcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IFNlbGVjdGlvbkRBRyBpdGVyYXRpb24sIHNvIHdlIGNhbiBhbGxvY2F0ZQorICAgIC8vIHRoZSBvcGVyYW5kcyBkaXJlY3RseSBvdXQgb2YgYSBwb29sIHdpdGggbm8gcmVjeWNsaW5nIG1ldGFkYXRhLgorICAgIE4tPkluaXRPcGVyYW5kcyhPcGVyYW5kQWxsb2NhdG9yLkFsbG9jYXRlPFNEVXNlPihOdW1PcHMpLAorICAgICAgICAgICAgICAgICAgICBPcHMsIE51bU9wcyk7CisgIGVsc2UKKyAgICBOLT5Jbml0T3BlcmFuZHMoTi0+TG9jYWxPcGVyYW5kcywgT3BzLCBOdW1PcHMpOworICBOLT5PcGVyYW5kc05lZWREZWxldGUgPSBmYWxzZTsKKworICBpZiAoRG9DU0UpCisgICAgQ1NFTWFwLkluc2VydE5vZGUoTiwgSVApOworCisgIEFsbE5vZGVzLnB1c2hfYmFjayhOKTsKKyNpZm5kZWYgTkRFQlVHCisgIFZlcmlmeU5vZGUoTik7CisjZW5kaWYKKyAgcmV0dXJuIE47Cit9CisKKy8vLyBnZXRUYXJnZXRFeHRyYWN0U3VicmVnIC0gQSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcKKy8vLyBUYXJnZXRPcGNvZGU6OkVYVFJBQ1RfU1VCUkVHIG5vZGVzLgorU0RWYWx1ZQorU2VsZWN0aW9uREFHOjpnZXRUYXJnZXRFeHRyYWN0U3VicmVnKGludCBTUklkeCwgRGVidWdMb2MgREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wZXJhbmQpIHsKKyAgU0RWYWx1ZSBTUklkeFZhbCA9IGdldFRhcmdldENvbnN0YW50KFNSSWR4LCBNVlQ6OmkzMik7CisgIFNETm9kZSAqU3VicmVnID0gZ2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpFWFRSQUNUX1NVQlJFRywgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlQsIE9wZXJhbmQsIFNSSWR4VmFsKTsKKyAgcmV0dXJuIFNEVmFsdWUoU3VicmVnLCAwKTsKK30KKworLy8vIGdldFRhcmdldEluc2VydFN1YnJlZyAtIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGNyZWF0aW5nCisvLy8gVGFyZ2V0T3Bjb2RlOjpJTlNFUlRfU1VCUkVHIG5vZGVzLgorU0RWYWx1ZQorU2VsZWN0aW9uREFHOjpnZXRUYXJnZXRJbnNlcnRTdWJyZWcoaW50IFNSSWR4LCBEZWJ1Z0xvYyBETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcGVyYW5kLCBTRFZhbHVlIFN1YnJlZykgeworICBTRFZhbHVlIFNSSWR4VmFsID0gZ2V0VGFyZ2V0Q29uc3RhbnQoU1JJZHgsIE1WVDo6aTMyKTsKKyAgU0ROb2RlICpSZXN1bHQgPSBnZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OklOU0VSVF9TVUJSRUcsIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULCBPcGVyYW5kLCBTdWJyZWcsIFNSSWR4VmFsKTsKKyAgcmV0dXJuIFNEVmFsdWUoUmVzdWx0LCAwKTsKK30KKworLy8vIGdldE5vZGVJZkV4aXN0cyAtIEdldCB0aGUgc3BlY2lmaWVkIG5vZGUgaWYgaXQncyBhbHJlYWR5IGF2YWlsYWJsZSwgb3IKKy8vLyBlbHNlIHJldHVybiBOVUxMLgorU0ROb2RlICpTZWxlY3Rpb25EQUc6OmdldE5vZGVJZkV4aXN0cyh1bnNpZ25lZCBPcGNvZGUsIFNEVlRMaXN0IFZUTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpIHsKKyAgaWYgKFZUTGlzdC5WVHNbVlRMaXN0Lk51bVZUcy0xXSAhPSBNVlQ6OkZsYWcpIHsKKyAgICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICAgIEFkZE5vZGVJRE5vZGUoSUQsIE9wY29kZSwgVlRMaXN0LCBPcHMsIE51bU9wcyk7CisgICAgdm9pZCAqSVAgPSAwOworICAgIGlmIChTRE5vZGUgKkUgPSBDU0VNYXAuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKQorICAgICAgcmV0dXJuIEU7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vLyBnZXREYmdWYWx1ZSAtIENyZWF0ZXMgYSBTRERiZ1ZhbHVlIG5vZGUuCisvLy8KK1NERGJnVmFsdWUgKgorU2VsZWN0aW9uREFHOjpnZXREYmdWYWx1ZShNRE5vZGUgKk1EUHRyLCBTRE5vZGUgKk4sIHVuc2lnbmVkIFIsIHVpbnQ2NF90IE9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsIHVuc2lnbmVkIE8pIHsKKyAgcmV0dXJuIG5ldyAoQWxsb2NhdG9yKSBTRERiZ1ZhbHVlKE1EUHRyLCBOLCBSLCBPZmYsIERMLCBPKTsKK30KKworU0REYmdWYWx1ZSAqCitTZWxlY3Rpb25EQUc6OmdldERiZ1ZhbHVlKE1ETm9kZSAqTURQdHIsIGNvbnN0IFZhbHVlICpDLCB1aW50NjRfdCBPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMLCB1bnNpZ25lZCBPKSB7CisgIHJldHVybiBuZXcgKEFsbG9jYXRvcikgU0REYmdWYWx1ZShNRFB0ciwgQywgT2ZmLCBETCwgTyk7Cit9CisKK1NERGJnVmFsdWUgKgorU2VsZWN0aW9uREFHOjpnZXREYmdWYWx1ZShNRE5vZGUgKk1EUHRyLCB1bnNpZ25lZCBGSSwgdWludDY0X3QgT2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBETCwgdW5zaWduZWQgTykgeworICByZXR1cm4gbmV3IChBbGxvY2F0b3IpIFNERGJnVmFsdWUoTURQdHIsIEZJLCBPZmYsIERMLCBPKTsKK30KKworbmFtZXNwYWNlIHsKKworLy8vIFJBVVdVcGRhdGVMaXN0ZW5lciAtIEhlbHBlciBmb3IgUmVwbGFjZUFsbFVzZXNXaXRoIC0gV2hlbiB0aGUgbm9kZQorLy8vIHBvaW50ZWQgdG8gYnkgYSB1c2UgaXRlcmF0b3IgaXMgZGVsZXRlZCwgaW5jcmVtZW50IHRoZSB1c2UgaXRlcmF0b3IKKy8vLyBzbyB0aGF0IGl0IGRvZXNuJ3QgZGFuZ2xlLgorLy8vCisvLy8gVGhpcyBjbGFzcyBhbHNvIG1hbmFnZXMgYSAiZG93bmxpbmsiIERBR1VwZGF0ZUxpc3RlbmVyLCB0byBmb3J3YXJkCisvLy8gbWVzc2FnZXMgdG8gUmVwbGFjZUFsbFVzZXNXaXRoJ3MgY2FsbGVycy4KKy8vLworY2xhc3MgUkFVV1VwZGF0ZUxpc3RlbmVyIDogcHVibGljIFNlbGVjdGlvbkRBRzo6REFHVXBkYXRlTGlzdGVuZXIgeworICBTZWxlY3Rpb25EQUc6OkRBR1VwZGF0ZUxpc3RlbmVyICpEb3duTGluazsKKyAgU0ROb2RlOjp1c2VfaXRlcmF0b3IgJlVJOworICBTRE5vZGU6OnVzZV9pdGVyYXRvciAmVUU7CisKKyAgdmlydHVhbCB2b2lkIE5vZGVEZWxldGVkKFNETm9kZSAqTiwgU0ROb2RlICpFKSB7CisgICAgLy8gSW5jcmVtZW50IHRoZSBpdGVyYXRvciBhcyBuZWVkZWQuCisgICAgd2hpbGUgKFVJICE9IFVFICYmIE4gPT0gKlVJKQorICAgICAgKytVSTsKKworICAgIC8vIFRoZW4gZm9yd2FyZCB0aGUgbWVzc2FnZS4KKyAgICBpZiAoRG93bkxpbmspIERvd25MaW5rLT5Ob2RlRGVsZXRlZChOLCBFKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBOb2RlVXBkYXRlZChTRE5vZGUgKk4pIHsKKyAgICAvLyBKdXN0IGZvcndhcmQgdGhlIG1lc3NhZ2UuCisgICAgaWYgKERvd25MaW5rKSBEb3duTGluay0+Tm9kZVVwZGF0ZWQoTik7CisgIH0KKworcHVibGljOgorICBSQVVXVXBkYXRlTGlzdGVuZXIoU2VsZWN0aW9uREFHOjpEQUdVcGRhdGVMaXN0ZW5lciAqZGwsCisgICAgICAgICAgICAgICAgICAgICBTRE5vZGU6OnVzZV9pdGVyYXRvciAmdWksCisgICAgICAgICAgICAgICAgICAgICBTRE5vZGU6OnVzZV9pdGVyYXRvciAmdWUpCisgICAgOiBEb3duTGluayhkbCksIFVJKHVpKSwgVUUodWUpIHt9Cit9OworCit9CisKKy8vLyBSZXBsYWNlQWxsVXNlc1dpdGggLSBNb2RpZnkgYW55dGhpbmcgdXNpbmcgJ0Zyb20nIHRvIHVzZSAnVG8nIGluc3RlYWQuCisvLy8gVGhpcyBjYW4gY2F1c2UgcmVjdXJzaXZlIG1lcmdpbmcgb2Ygbm9kZXMgaW4gdGhlIERBRy4KKy8vLworLy8vIFRoaXMgdmVyc2lvbiBhc3N1bWVzIEZyb20gaGFzIGEgc2luZ2xlIHJlc3VsdCB2YWx1ZS4KKy8vLwordm9pZCBTZWxlY3Rpb25EQUc6OlJlcGxhY2VBbGxVc2VzV2l0aChTRFZhbHVlIEZyb21OLCBTRFZhbHVlIFRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUdVcGRhdGVMaXN0ZW5lciAqVXBkYXRlTGlzdGVuZXIpIHsKKyAgU0ROb2RlICpGcm9tID0gRnJvbU4uZ2V0Tm9kZSgpOworICBhc3NlcnQoRnJvbS0+Z2V0TnVtVmFsdWVzKCkgPT0gMSAmJiBGcm9tTi5nZXRSZXNObygpID09IDAgJiYKKyAgICAgICAgICJDYW5ub3QgcmVwbGFjZSB3aXRoIHRoaXMgbWV0aG9kISIpOworICBhc3NlcnQoRnJvbSAhPSBUby5nZXROb2RlKCkgJiYgIkNhbm5vdCByZXBsYWNlIHVzZXMgb2Ygd2l0aCBzZWxmIik7CisKKyAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZXhpc3RpbmcgdXNlcyBvZiBGcm9tLiBOZXcgdXNlcyB3aWxsIGJlIGFkZGVkCisgIC8vIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVzZSBsaXN0LCB3aGljaCB3ZSBhdm9pZCB2aXNpdGluZy4KKyAgLy8gVGhpcyBzcGVjaWZpY2FsbHkgYXZvaWRzIHZpc2l0aW5nIHVzZXMgb2YgRnJvbSB0aGF0IGFyaXNlIHdoaWxlIHRoZQorICAvLyByZXBsYWNlbWVudCBpcyBoYXBwZW5pbmcsIGJlY2F1c2UgYW55IHN1Y2ggdXNlcyB3b3VsZCBiZSB0aGUgcmVzdWx0CisgIC8vIG9mIENTRTogSWYgYW4gZXhpc3Rpbmcgbm9kZSBsb29rcyBsaWtlIEZyb20gYWZ0ZXIgb25lIG9mIGl0cyBvcGVyYW5kcworICAvLyBpcyByZXBsYWNlZCBieSBUbywgd2UgZG9uJ3Qgd2FudCB0byByZXBsYWNlIG9mIGFsbCBpdHMgdXNlcnMgd2l0aCBUbworICAvLyB0b28uIFNlZSBQUjMwMTggZm9yIG1vcmUgaW5mby4KKyAgU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBGcm9tLT51c2VfYmVnaW4oKSwgVUUgPSBGcm9tLT51c2VfZW5kKCk7CisgIFJBVVdVcGRhdGVMaXN0ZW5lciBMaXN0ZW5lcihVcGRhdGVMaXN0ZW5lciwgVUksIFVFKTsKKyAgd2hpbGUgKFVJICE9IFVFKSB7CisgICAgU0ROb2RlICpVc2VyID0gKlVJOworCisgICAgLy8gVGhpcyBub2RlIGlzIGFib3V0IHRvIG1vcnBoLCByZW1vdmUgaXRzIG9sZCBzZWxmIGZyb20gdGhlIENTRSBtYXBzLgorICAgIFJlbW92ZU5vZGVGcm9tQ1NFTWFwcyhVc2VyKTsKKworICAgIC8vIEEgdXNlciBjYW4gYXBwZWFyIGluIGEgdXNlIGxpc3QgbXVsdGlwbGUgdGltZXMsIGFuZCB3aGVuIHRoaXMKKyAgICAvLyBoYXBwZW5zIHRoZSB1c2VzIGFyZSB1c3VhbGx5IG5leHQgdG8gZWFjaCBvdGhlciBpbiB0aGUgbGlzdC4KKyAgICAvLyBUbyBoZWxwIHJlZHVjZSB0aGUgbnVtYmVyIG9mIENTRSByZWNvbXB1dGF0aW9ucywgcHJvY2VzcyBhbGwKKyAgICAvLyB0aGUgdXNlcyBvZiB0aGlzIHVzZXIgdGhhdCB3ZSBjYW4gZmluZCB0aGlzIHdheS4KKyAgICBkbyB7CisgICAgICBTRFVzZSAmVXNlID0gVUkuZ2V0VXNlKCk7CisgICAgICArK1VJOworICAgICAgVXNlLnNldChUbyk7CisgICAgfSB3aGlsZSAoVUkgIT0gVUUgJiYgKlVJID09IFVzZXIpOworCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBtb2RpZmllZCBVc2VyLCBhZGQgaXQgYmFjayB0byB0aGUgQ1NFIG1hcHMuICBJZiBpdAorICAgIC8vIGFscmVhZHkgZXhpc3RzIHRoZXJlLCByZWN1cnNpdmVseSBtZXJnZSB0aGUgcmVzdWx0cyB0b2dldGhlci4KKyAgICBBZGRNb2RpZmllZE5vZGVUb0NTRU1hcHMoVXNlciwgJkxpc3RlbmVyKTsKKyAgfQorfQorCisvLy8gUmVwbGFjZUFsbFVzZXNXaXRoIC0gTW9kaWZ5IGFueXRoaW5nIHVzaW5nICdGcm9tJyB0byB1c2UgJ1RvJyBpbnN0ZWFkLgorLy8vIFRoaXMgY2FuIGNhdXNlIHJlY3Vyc2l2ZSBtZXJnaW5nIG9mIG5vZGVzIGluIHRoZSBEQUcuCisvLy8KKy8vLyBUaGlzIHZlcnNpb24gYXNzdW1lcyB0aGF0IGZvciBlYWNoIHZhbHVlIG9mIEZyb20sIHRoZXJlIGlzIGEKKy8vLyBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFRvIGluIHRoZSBzYW1lIHBvc2l0aW9uIHdpdGggdGhlIHNhbWUgdHlwZS4KKy8vLwordm9pZCBTZWxlY3Rpb25EQUc6OlJlcGxhY2VBbGxVc2VzV2l0aChTRE5vZGUgKkZyb20sIFNETm9kZSAqVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBR1VwZGF0ZUxpc3RlbmVyICpVcGRhdGVMaXN0ZW5lcikgeworI2lmbmRlZiBOREVCVUcKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZyb20tPmdldE51bVZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICBhc3NlcnQoKCFGcm9tLT5oYXNBbnlVc2VPZlZhbHVlKGkpIHx8CisgICAgICAgICAgICBGcm9tLT5nZXRWYWx1ZVR5cGUoaSkgPT0gVG8tPmdldFZhbHVlVHlwZShpKSkgJiYKKyAgICAgICAgICAgIkNhbm5vdCB1c2UgdGhpcyB2ZXJzaW9uIG9mIFJlcGxhY2VBbGxVc2VzV2l0aCEiKTsKKyNlbmRpZgorCisgIC8vIEhhbmRsZSB0aGUgdHJpdmlhbCBjYXNlLgorICBpZiAoRnJvbSA9PSBUbykKKyAgICByZXR1cm47CisKKyAgLy8gSXRlcmF0ZSBvdmVyIGp1c3QgdGhlIGV4aXN0aW5nIHVzZXJzIG9mIEZyb20uIFNlZSB0aGUgY29tbWVudHMgaW4KKyAgLy8gdGhlIFJlcGxhY2VBbGxVc2VzV2l0aCBhYm92ZS4KKyAgU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBGcm9tLT51c2VfYmVnaW4oKSwgVUUgPSBGcm9tLT51c2VfZW5kKCk7CisgIFJBVVdVcGRhdGVMaXN0ZW5lciBMaXN0ZW5lcihVcGRhdGVMaXN0ZW5lciwgVUksIFVFKTsKKyAgd2hpbGUgKFVJICE9IFVFKSB7CisgICAgU0ROb2RlICpVc2VyID0gKlVJOworCisgICAgLy8gVGhpcyBub2RlIGlzIGFib3V0IHRvIG1vcnBoLCByZW1vdmUgaXRzIG9sZCBzZWxmIGZyb20gdGhlIENTRSBtYXBzLgorICAgIFJlbW92ZU5vZGVGcm9tQ1NFTWFwcyhVc2VyKTsKKworICAgIC8vIEEgdXNlciBjYW4gYXBwZWFyIGluIGEgdXNlIGxpc3QgbXVsdGlwbGUgdGltZXMsIGFuZCB3aGVuIHRoaXMKKyAgICAvLyBoYXBwZW5zIHRoZSB1c2VzIGFyZSB1c3VhbGx5IG5leHQgdG8gZWFjaCBvdGhlciBpbiB0aGUgbGlzdC4KKyAgICAvLyBUbyBoZWxwIHJlZHVjZSB0aGUgbnVtYmVyIG9mIENTRSByZWNvbXB1dGF0aW9ucywgcHJvY2VzcyBhbGwKKyAgICAvLyB0aGUgdXNlcyBvZiB0aGlzIHVzZXIgdGhhdCB3ZSBjYW4gZmluZCB0aGlzIHdheS4KKyAgICBkbyB7CisgICAgICBTRFVzZSAmVXNlID0gVUkuZ2V0VXNlKCk7CisgICAgICArK1VJOworICAgICAgVXNlLnNldE5vZGUoVG8pOworICAgIH0gd2hpbGUgKFVJICE9IFVFICYmICpVSSA9PSBVc2VyKTsKKworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgbW9kaWZpZWQgVXNlciwgYWRkIGl0IGJhY2sgdG8gdGhlIENTRSBtYXBzLiAgSWYgaXQKKyAgICAvLyBhbHJlYWR5IGV4aXN0cyB0aGVyZSwgcmVjdXJzaXZlbHkgbWVyZ2UgdGhlIHJlc3VsdHMgdG9nZXRoZXIuCisgICAgQWRkTW9kaWZpZWROb2RlVG9DU0VNYXBzKFVzZXIsICZMaXN0ZW5lcik7CisgIH0KK30KKworLy8vIFJlcGxhY2VBbGxVc2VzV2l0aCAtIE1vZGlmeSBhbnl0aGluZyB1c2luZyAnRnJvbScgdG8gdXNlICdUbycgaW5zdGVhZC4KKy8vLyBUaGlzIGNhbiBjYXVzZSByZWN1cnNpdmUgbWVyZ2luZyBvZiBub2RlcyBpbiB0aGUgREFHLgorLy8vCisvLy8gVGhpcyB2ZXJzaW9uIGNhbiByZXBsYWNlIEZyb20gd2l0aCBhbnkgcmVzdWx0IHZhbHVlcy4gIFRvIG11c3QgbWF0Y2ggdGhlCisvLy8gbnVtYmVyIGFuZCB0eXBlcyBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgRnJvbS4KK3ZvaWQgU2VsZWN0aW9uREFHOjpSZXBsYWNlQWxsVXNlc1dpdGgoU0ROb2RlICpGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHVXBkYXRlTGlzdGVuZXIgKlVwZGF0ZUxpc3RlbmVyKSB7CisgIGlmIChGcm9tLT5nZXROdW1WYWx1ZXMoKSA9PSAxKSAgLy8gSGFuZGxlIHRoZSBzaW1wbGUgY2FzZSBlZmZpY2llbnRseS4KKyAgICByZXR1cm4gUmVwbGFjZUFsbFVzZXNXaXRoKFNEVmFsdWUoRnJvbSwgMCksIFRvWzBdLCBVcGRhdGVMaXN0ZW5lcik7CisKKyAgLy8gSXRlcmF0ZSBvdmVyIGp1c3QgdGhlIGV4aXN0aW5nIHVzZXJzIG9mIEZyb20uIFNlZSB0aGUgY29tbWVudHMgaW4KKyAgLy8gdGhlIFJlcGxhY2VBbGxVc2VzV2l0aCBhYm92ZS4KKyAgU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBGcm9tLT51c2VfYmVnaW4oKSwgVUUgPSBGcm9tLT51c2VfZW5kKCk7CisgIFJBVVdVcGRhdGVMaXN0ZW5lciBMaXN0ZW5lcihVcGRhdGVMaXN0ZW5lciwgVUksIFVFKTsKKyAgd2hpbGUgKFVJICE9IFVFKSB7CisgICAgU0ROb2RlICpVc2VyID0gKlVJOworCisgICAgLy8gVGhpcyBub2RlIGlzIGFib3V0IHRvIG1vcnBoLCByZW1vdmUgaXRzIG9sZCBzZWxmIGZyb20gdGhlIENTRSBtYXBzLgorICAgIFJlbW92ZU5vZGVGcm9tQ1NFTWFwcyhVc2VyKTsKKworICAgIC8vIEEgdXNlciBjYW4gYXBwZWFyIGluIGEgdXNlIGxpc3QgbXVsdGlwbGUgdGltZXMsIGFuZCB3aGVuIHRoaXMKKyAgICAvLyBoYXBwZW5zIHRoZSB1c2VzIGFyZSB1c3VhbGx5IG5leHQgdG8gZWFjaCBvdGhlciBpbiB0aGUgbGlzdC4KKyAgICAvLyBUbyBoZWxwIHJlZHVjZSB0aGUgbnVtYmVyIG9mIENTRSByZWNvbXB1dGF0aW9ucywgcHJvY2VzcyBhbGwKKyAgICAvLyB0aGUgdXNlcyBvZiB0aGlzIHVzZXIgdGhhdCB3ZSBjYW4gZmluZCB0aGlzIHdheS4KKyAgICBkbyB7CisgICAgICBTRFVzZSAmVXNlID0gVUkuZ2V0VXNlKCk7CisgICAgICBjb25zdCBTRFZhbHVlICZUb09wID0gVG9bVXNlLmdldFJlc05vKCldOworICAgICAgKytVSTsKKyAgICAgIFVzZS5zZXQoVG9PcCk7CisgICAgfSB3aGlsZSAoVUkgIT0gVUUgJiYgKlVJID09IFVzZXIpOworCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBtb2RpZmllZCBVc2VyLCBhZGQgaXQgYmFjayB0byB0aGUgQ1NFIG1hcHMuICBJZiBpdAorICAgIC8vIGFscmVhZHkgZXhpc3RzIHRoZXJlLCByZWN1cnNpdmVseSBtZXJnZSB0aGUgcmVzdWx0cyB0b2dldGhlci4KKyAgICBBZGRNb2RpZmllZE5vZGVUb0NTRU1hcHMoVXNlciwgJkxpc3RlbmVyKTsKKyAgfQorfQorCisvLy8gUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aCAtIFJlcGxhY2UgYW55IHVzZXMgb2YgRnJvbSB3aXRoIFRvLCBsZWF2aW5nCisvLy8gdXNlcyBvZiBvdGhlciB2YWx1ZXMgcHJvZHVjZWQgYnkgRnJvbS5nZXROb2RlKCkgYWxvbmUuICBUaGUgRGVsZXRlZAorLy8vIHZlY3RvciBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBmb3IgUmVwbGFjZUFsbFVzZXNXaXRoLgordm9pZCBTZWxlY3Rpb25EQUc6OlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZSBGcm9tLCBTRFZhbHVlIFRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHVXBkYXRlTGlzdGVuZXIgKlVwZGF0ZUxpc3RlbmVyKXsKKyAgLy8gSGFuZGxlIHRoZSByZWFsbHkgc2ltcGxlLCByZWFsbHkgdHJpdmlhbCBjYXNlIGVmZmljaWVudGx5LgorICBpZiAoRnJvbSA9PSBUbykgcmV0dXJuOworCisgIC8vIEhhbmRsZSB0aGUgc2ltcGxlLCB0cml2aWFsLCBjYXNlIGVmZmljaWVudGx5LgorICBpZiAoRnJvbS5nZXROb2RlKCktPmdldE51bVZhbHVlcygpID09IDEpIHsKKyAgICBSZXBsYWNlQWxsVXNlc1dpdGgoRnJvbSwgVG8sIFVwZGF0ZUxpc3RlbmVyKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJdGVyYXRlIG92ZXIganVzdCB0aGUgZXhpc3RpbmcgdXNlcnMgb2YgRnJvbS4gU2VlIHRoZSBjb21tZW50cyBpbgorICAvLyB0aGUgUmVwbGFjZUFsbFVzZXNXaXRoIGFib3ZlLgorICBTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IEZyb20uZ2V0Tm9kZSgpLT51c2VfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgVUUgPSBGcm9tLmdldE5vZGUoKS0+dXNlX2VuZCgpOworICBSQVVXVXBkYXRlTGlzdGVuZXIgTGlzdGVuZXIoVXBkYXRlTGlzdGVuZXIsIFVJLCBVRSk7CisgIHdoaWxlIChVSSAhPSBVRSkgeworICAgIFNETm9kZSAqVXNlciA9ICpVSTsKKyAgICBib29sIFVzZXJSZW1vdmVkRnJvbUNTRU1hcHMgPSBmYWxzZTsKKworICAgIC8vIEEgdXNlciBjYW4gYXBwZWFyIGluIGEgdXNlIGxpc3QgbXVsdGlwbGUgdGltZXMsIGFuZCB3aGVuIHRoaXMKKyAgICAvLyBoYXBwZW5zIHRoZSB1c2VzIGFyZSB1c3VhbGx5IG5leHQgdG8gZWFjaCBvdGhlciBpbiB0aGUgbGlzdC4KKyAgICAvLyBUbyBoZWxwIHJlZHVjZSB0aGUgbnVtYmVyIG9mIENTRSByZWNvbXB1dGF0aW9ucywgcHJvY2VzcyBhbGwKKyAgICAvLyB0aGUgdXNlcyBvZiB0aGlzIHVzZXIgdGhhdCB3ZSBjYW4gZmluZCB0aGlzIHdheS4KKyAgICBkbyB7CisgICAgICBTRFVzZSAmVXNlID0gVUkuZ2V0VXNlKCk7CisKKyAgICAgIC8vIFNraXAgdXNlcyBvZiBkaWZmZXJlbnQgdmFsdWVzIGZyb20gdGhlIHNhbWUgbm9kZS4KKyAgICAgIGlmIChVc2UuZ2V0UmVzTm8oKSAhPSBGcm9tLmdldFJlc05vKCkpIHsKKyAgICAgICAgKytVSTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoaXMgbm9kZSBoYXNuJ3QgYmVlbiBtb2RpZmllZCB5ZXQsIGl0J3Mgc3RpbGwgaW4gdGhlIENTRSBtYXBzLAorICAgICAgLy8gc28gcmVtb3ZlIGl0cyBvbGQgc2VsZiBmcm9tIHRoZSBDU0UgbWFwcy4KKyAgICAgIGlmICghVXNlclJlbW92ZWRGcm9tQ1NFTWFwcykgeworICAgICAgICBSZW1vdmVOb2RlRnJvbUNTRU1hcHMoVXNlcik7CisgICAgICAgIFVzZXJSZW1vdmVkRnJvbUNTRU1hcHMgPSB0cnVlOworICAgICAgfQorCisgICAgICArK1VJOworICAgICAgVXNlLnNldChUbyk7CisgICAgfSB3aGlsZSAoVUkgIT0gVUUgJiYgKlVJID09IFVzZXIpOworCisgICAgLy8gV2UgYXJlIGl0ZXJhdGluZyBvdmVyIGFsbCB1c2VzIG9mIHRoZSBGcm9tIG5vZGUsIHNvIGlmIGEgdXNlCisgICAgLy8gZG9lc24ndCB1c2UgdGhlIHNwZWNpZmljIHZhbHVlLCBubyBjaGFuZ2VzIGFyZSBtYWRlLgorICAgIGlmICghVXNlclJlbW92ZWRGcm9tQ1NFTWFwcykKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBtb2RpZmllZCBVc2VyLCBhZGQgaXQgYmFjayB0byB0aGUgQ1NFIG1hcHMuICBJZiBpdAorICAgIC8vIGFscmVhZHkgZXhpc3RzIHRoZXJlLCByZWN1cnNpdmVseSBtZXJnZSB0aGUgcmVzdWx0cyB0b2dldGhlci4KKyAgICBBZGRNb2RpZmllZE5vZGVUb0NTRU1hcHMoVXNlciwgJkxpc3RlbmVyKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworICAvLy8gVXNlTWVtbyAtIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBTZWxlY3Rpb25EQUc6OlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZXNXaXRoCisgIC8vLyB0byByZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2UuCisgIHN0cnVjdCBVc2VNZW1vIHsKKyAgICBTRE5vZGUgKlVzZXI7CisgICAgdW5zaWduZWQgSW5kZXg7CisgICAgU0RVc2UgKlVzZTsKKyAgfTsKKworICAvLy8gb3BlcmF0b3I8IC0gU29ydCBNZW1vcyBieSBVc2VyLgorICBib29sIG9wZXJhdG9yPChjb25zdCBVc2VNZW1vICZMLCBjb25zdCBVc2VNZW1vICZSKSB7CisgICAgcmV0dXJuIChpbnRwdHJfdClMLlVzZXIgPCAoaW50cHRyX3QpUi5Vc2VyOworICB9Cit9CisKKy8vLyBSZXBsYWNlQWxsVXNlc09mVmFsdWVzV2l0aCAtIFJlcGxhY2UgYW55IHVzZXMgb2YgRnJvbSB3aXRoIFRvLCBsZWF2aW5nCisvLy8gdXNlcyBvZiBvdGhlciB2YWx1ZXMgcHJvZHVjZWQgYnkgRnJvbS5nZXROb2RlKCkgYWxvbmUuICBUaGUgc2FtZSB2YWx1ZQorLy8vIG1heSBhcHBlYXIgaW4gYm90aCB0aGUgRnJvbSBhbmQgVG8gbGlzdC4gIFRoZSBEZWxldGVkIHZlY3RvciBpcworLy8vIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIGZvciBSZXBsYWNlQWxsVXNlc1dpdGguCit2b2lkIFNlbGVjdGlvbkRBRzo6UmVwbGFjZUFsbFVzZXNPZlZhbHVlc1dpdGgoY29uc3QgU0RWYWx1ZSAqRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHVXBkYXRlTGlzdGVuZXIgKlVwZGF0ZUxpc3RlbmVyKXsKKyAgLy8gSGFuZGxlIHRoZSBzaW1wbGUsIHRyaXZpYWwgY2FzZSBlZmZpY2llbnRseS4KKyAgaWYgKE51bSA9PSAxKQorICAgIHJldHVybiBSZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKCpGcm9tLCAqVG8sIFVwZGF0ZUxpc3RlbmVyKTsKKworICAvLyBSZWFkIHVwIGFsbCB0aGUgdXNlcyBhbmQgbWFrZSByZWNvcmRzIG9mIHRoZW0uIFRoaXMgaGVscHMKKyAgLy8gcHJvY2Vzc2luZyBuZXcgdXNlcyB0aGF0IGFyZSBpbnRyb2R1Y2VkIGR1cmluZyB0aGUKKyAgLy8gcmVwbGFjZW1lbnQgcHJvY2Vzcy4KKyAgU21hbGxWZWN0b3I8VXNlTWVtbywgND4gVXNlczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW07ICsraSkgeworICAgIHVuc2lnbmVkIEZyb21SZXNObyA9IEZyb21baV0uZ2V0UmVzTm8oKTsKKyAgICBTRE5vZGUgKkZyb21Ob2RlID0gRnJvbVtpXS5nZXROb2RlKCk7CisgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IEZyb21Ob2RlLT51c2VfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBGcm9tTm9kZS0+dXNlX2VuZCgpOyBVSSAhPSBFOyArK1VJKSB7CisgICAgICBTRFVzZSAmVXNlID0gVUkuZ2V0VXNlKCk7CisgICAgICBpZiAoVXNlLmdldFJlc05vKCkgPT0gRnJvbVJlc05vKSB7CisgICAgICAgIFVzZU1lbW8gTWVtbyA9IHsgKlVJLCBpLCAmVXNlIH07CisgICAgICAgIFVzZXMucHVzaF9iYWNrKE1lbW8pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFNvcnQgdGhlIHVzZXMsIHNvIHRoYXQgYWxsIHRoZSB1c2VzIGZyb20gYSBnaXZlbiBVc2VyIGFyZSB0b2dldGhlci4KKyAgc3RkOjpzb3J0KFVzZXMuYmVnaW4oKSwgVXNlcy5lbmQoKSk7CisKKyAgZm9yICh1bnNpZ25lZCBVc2VJbmRleCA9IDAsIFVzZUluZGV4RW5kID0gVXNlcy5zaXplKCk7CisgICAgICAgVXNlSW5kZXggIT0gVXNlSW5kZXhFbmQ7ICkgeworICAgIC8vIFdlIGtub3cgdGhhdCB0aGlzIHVzZXIgdXNlcyBzb21lIHZhbHVlIG9mIEZyb20uICBJZiBpdCBpcyB0aGUgcmlnaHQKKyAgICAvLyB2YWx1ZSwgdXBkYXRlIGl0LgorICAgIFNETm9kZSAqVXNlciA9IFVzZXNbVXNlSW5kZXhdLlVzZXI7CisKKyAgICAvLyBUaGlzIG5vZGUgaXMgYWJvdXQgdG8gbW9ycGgsIHJlbW92ZSBpdHMgb2xkIHNlbGYgZnJvbSB0aGUgQ1NFIG1hcHMuCisgICAgUmVtb3ZlTm9kZUZyb21DU0VNYXBzKFVzZXIpOworCisgICAgLy8gVGhlIFVzZXMgYXJyYXkgaXMgc29ydGVkLCBzbyBhbGwgdGhlIHVzZXMgZm9yIGEgZ2l2ZW4gVXNlcgorICAgIC8vIGFyZSBuZXh0IHRvIGVhY2ggb3RoZXIgaW4gdGhlIGxpc3QuCisgICAgLy8gVG8gaGVscCByZWR1Y2UgdGhlIG51bWJlciBvZiBDU0UgcmVjb21wdXRhdGlvbnMsIHByb2Nlc3MgYWxsCisgICAgLy8gdGhlIHVzZXMgb2YgdGhpcyB1c2VyIHRoYXQgd2UgY2FuIGZpbmQgdGhpcyB3YXkuCisgICAgZG8geworICAgICAgdW5zaWduZWQgaSA9IFVzZXNbVXNlSW5kZXhdLkluZGV4OworICAgICAgU0RVc2UgJlVzZSA9ICpVc2VzW1VzZUluZGV4XS5Vc2U7CisgICAgICArK1VzZUluZGV4OworCisgICAgICBVc2Uuc2V0KFRvW2ldKTsKKyAgICB9IHdoaWxlIChVc2VJbmRleCAhPSBVc2VJbmRleEVuZCAmJiBVc2VzW1VzZUluZGV4XS5Vc2VyID09IFVzZXIpOworCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBtb2RpZmllZCBVc2VyLCBhZGQgaXQgYmFjayB0byB0aGUgQ1NFIG1hcHMuICBJZiBpdAorICAgIC8vIGFscmVhZHkgZXhpc3RzIHRoZXJlLCByZWN1cnNpdmVseSBtZXJnZSB0aGUgcmVzdWx0cyB0b2dldGhlci4KKyAgICBBZGRNb2RpZmllZE5vZGVUb0NTRU1hcHMoVXNlciwgVXBkYXRlTGlzdGVuZXIpOworICB9Cit9CisKKy8vLyBBc3NpZ25Ub3BvbG9naWNhbE9yZGVyIC0gQXNzaWduIGEgdW5pcXVlIG5vZGUgaWQgZm9yIGVhY2ggbm9kZSBpbiB0aGUgREFHCisvLy8gYmFzZWQgb24gdGhlaXIgdG9wb2xvZ2ljYWwgb3JkZXIuIEl0IHJldHVybnMgdGhlIG1heGltdW0gaWQgYW5kIGEgdmVjdG9yCisvLy8gb2YgdGhlIFNETm9kZXMqIGluIGFzc2lnbmVkIG9yZGVyIGJ5IHJlZmVyZW5jZS4KK3Vuc2lnbmVkIFNlbGVjdGlvbkRBRzo6QXNzaWduVG9wb2xvZ2ljYWxPcmRlcigpIHsKKworICB1bnNpZ25lZCBEQUdTaXplID0gMDsKKworICAvLyBTb3J0ZWRQb3MgdHJhY2tzIHRoZSBwcm9ncmVzcyBvZiB0aGUgYWxnb3JpdGhtLiBOb2RlcyBiZWZvcmUgaXQgYXJlCisgIC8vIHNvcnRlZCwgbm9kZXMgYWZ0ZXIgaXQgYXJlIHVuc29ydGVkLiBXaGVuIHRoZSBhbGdvcml0aG0gY29tcGxldGVzCisgIC8vIGl0IGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgIGFsbG5vZGVzX2l0ZXJhdG9yIFNvcnRlZFBvcyA9IGFsbG5vZGVzX2JlZ2luKCk7CisKKyAgLy8gVmlzaXQgYWxsIHRoZSBub2Rlcy4gTW92ZSBub2RlcyB3aXRoIG5vIG9wZXJhbmRzIHRvIHRoZSBmcm9udCBvZgorICAvLyB0aGUgbGlzdCBpbW1lZGlhdGVseS4gQW5ub3RhdGUgbm9kZXMgdGhhdCBkbyBoYXZlIG9wZXJhbmRzIHdpdGggdGhlaXIKKyAgLy8gb3BlcmFuZCBjb3VudC4gQmVmb3JlIHdlIGRvIHRoaXMsIHRoZSBOb2RlIElkIGZpZWxkcyBvZiB0aGUgbm9kZXMKKyAgLy8gbWF5IGNvbnRhaW4gYXJiaXRyYXJ5IHZhbHVlcy4gQWZ0ZXIsIHRoZSBOb2RlIElkIGZpZWxkcyBmb3Igbm9kZXMKKyAgLy8gYmVmb3JlIFNvcnRlZFBvcyB3aWxsIGNvbnRhaW4gdGhlIHRvcG9sb2dpY2FsIHNvcnQgaW5kZXgsIGFuZCB0aGUKKyAgLy8gTm9kZSBJZCBmaWVsZHMgZm9yIG5vZGVzIEF0IFNvcnRlZFBvcyBhbmQgYWZ0ZXIgd2lsbCBjb250YWluIHRoZQorICAvLyBjb3VudCBvZiBvdXRzdGFuZGluZyBvcGVyYW5kcy4KKyAgZm9yIChhbGxub2Rlc19pdGVyYXRvciBJID0gYWxsbm9kZXNfYmVnaW4oKSxFID0gYWxsbm9kZXNfZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgU0ROb2RlICpOID0gSSsrOworICAgIGNoZWNrRm9yQ3ljbGVzKE4pOworICAgIHVuc2lnbmVkIERlZ3JlZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7CisgICAgaWYgKERlZ3JlZSA9PSAwKSB7CisgICAgICAvLyBBIG5vZGUgd2l0aCBubyB1c2VzLCBhZGQgaXQgdG8gdGhlIHJlc3VsdCBhcnJheSBpbW1lZGlhdGVseS4KKyAgICAgIE4tPnNldE5vZGVJZChEQUdTaXplKyspOworICAgICAgYWxsbm9kZXNfaXRlcmF0b3IgUSA9IE47CisgICAgICBpZiAoUSAhPSBTb3J0ZWRQb3MpCisgICAgICAgIFNvcnRlZFBvcyA9IEFsbE5vZGVzLmluc2VydChTb3J0ZWRQb3MsIEFsbE5vZGVzLnJlbW92ZShRKSk7CisgICAgICBhc3NlcnQoU29ydGVkUG9zICE9IEFsbE5vZGVzLmVuZCgpICYmICJPdmVycmFuIG5vZGUgbGlzdCIpOworICAgICAgKytTb3J0ZWRQb3M7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRlbXBvcmFyaWx5IHVzZSB0aGUgTm9kZSBJZCBhcyBzY3JhdGNoIHNwYWNlIGZvciB0aGUgZGVncmVlIGNvdW50LgorICAgICAgTi0+c2V0Tm9kZUlkKERlZ3JlZSk7CisgICAgfQorICB9CisKKyAgLy8gVmlzaXQgYWxsIHRoZSBub2Rlcy4gQXMgd2UgaXRlcmF0ZSwgbW92ZXMgbm9kZXMgaW50byBzb3J0ZWQgb3JkZXIsCisgIC8vIHN1Y2ggdGhhdCBieSB0aGUgdGltZSB0aGUgZW5kIGlzIHJlYWNoZWQgYWxsIG5vZGVzIHdpbGwgYmUgc29ydGVkLgorICBmb3IgKGFsbG5vZGVzX2l0ZXJhdG9yIEkgPSBhbGxub2Rlc19iZWdpbigpLEUgPSBhbGxub2Rlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBTRE5vZGUgKk4gPSBJOworICAgIGNoZWNrRm9yQ3ljbGVzKE4pOworICAgIC8vIE4gaXMgaW4gc29ydGVkIHBvc2l0aW9uLCBzbyBhbGwgaXRzIHVzZXMgaGF2ZSBvbmUgbGVzcyBvcGVyYW5kCisgICAgLy8gdGhhdCBuZWVkcyB0byBiZSBzb3J0ZWQuCisgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IE4tPnVzZV9iZWdpbigpLCBVRSA9IE4tPnVzZV9lbmQoKTsKKyAgICAgICAgIFVJICE9IFVFOyArK1VJKSB7CisgICAgICBTRE5vZGUgKlAgPSAqVUk7CisgICAgICB1bnNpZ25lZCBEZWdyZWUgPSBQLT5nZXROb2RlSWQoKTsKKyAgICAgIGFzc2VydChEZWdyZWUgIT0gMCAmJiAiSW52YWxpZCBub2RlIGRlZ3JlZSIpOworICAgICAgLS1EZWdyZWU7CisgICAgICBpZiAoRGVncmVlID09IDApIHsKKyAgICAgICAgLy8gQWxsIG9mIFAncyBvcGVyYW5kcyBhcmUgc29ydGVkLCBzbyBQIG1heSBzb3J0ZWQgbm93LgorICAgICAgICBQLT5zZXROb2RlSWQoREFHU2l6ZSsrKTsKKyAgICAgICAgaWYgKFAgIT0gU29ydGVkUG9zKQorICAgICAgICAgIFNvcnRlZFBvcyA9IEFsbE5vZGVzLmluc2VydChTb3J0ZWRQb3MsIEFsbE5vZGVzLnJlbW92ZShQKSk7CisgICAgICAgIGFzc2VydChTb3J0ZWRQb3MgIT0gQWxsTm9kZXMuZW5kKCkgJiYgIk92ZXJyYW4gbm9kZSBsaXN0Iik7CisgICAgICAgICsrU29ydGVkUG9zOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXBkYXRlIFAncyBvdXRzdGFuZGluZyBvcGVyYW5kIGNvdW50LgorICAgICAgICBQLT5zZXROb2RlSWQoRGVncmVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKEkgPT0gU29ydGVkUG9zKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgU0ROb2RlICpTID0gKytJOworICAgICAgZGJncygpIDw8ICJPdmVycmFuIHNvcnRlZCBwb3NpdGlvbjpcbiI7CisgICAgICBTLT5kdW1wckZ1bGwoKTsKKyNlbmRpZgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICB9CisgIH0KKworICBhc3NlcnQoU29ydGVkUG9zID09IEFsbE5vZGVzLmVuZCgpICYmCisgICAgICAgICAiVG9wb2xvZ2ljYWwgc29ydCBpbmNvbXBsZXRlISIpOworICBhc3NlcnQoQWxsTm9kZXMuZnJvbnQoKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkVudHJ5VG9rZW4gJiYKKyAgICAgICAgICJGaXJzdCBub2RlIGluIHRvcG9sb2dpY2FsIHNvcnQgaXMgbm90IHRoZSBlbnRyeSB0b2tlbiEiKTsKKyAgYXNzZXJ0KEFsbE5vZGVzLmZyb250KCkuZ2V0Tm9kZUlkKCkgPT0gMCAmJgorICAgICAgICAgIkZpcnN0IG5vZGUgaW4gdG9wb2xvZ2ljYWwgc29ydCBoYXMgbm9uLXplcm8gaWQhIik7CisgIGFzc2VydChBbGxOb2Rlcy5mcm9udCgpLmdldE51bU9wZXJhbmRzKCkgPT0gMCAmJgorICAgICAgICAgIkZpcnN0IG5vZGUgaW4gdG9wb2xvZ2ljYWwgc29ydCBoYXMgb3BlcmFuZHMhIik7CisgIGFzc2VydChBbGxOb2Rlcy5iYWNrKCkuZ2V0Tm9kZUlkKCkgPT0gKGludClEQUdTaXplLTEgJiYKKyAgICAgICAgICJMYXN0IG5vZGUgaW4gdG9wb2xvZ2ljIHNvcnQgaGFzIHVuZXhwZWN0ZWQgaWQhIik7CisgIGFzc2VydChBbGxOb2Rlcy5iYWNrKCkudXNlX2VtcHR5KCkgJiYKKyAgICAgICAgICJMYXN0IG5vZGUgaW4gdG9wb2xvZ2ljIHNvcnQgaGFzIHVzZXJzISIpOworICBhc3NlcnQoREFHU2l6ZSA9PSBhbGxub2Rlc19zaXplKCkgJiYgIk5vZGUgY291bnQgbWlzbWF0Y2ghIik7CisgIHJldHVybiBEQUdTaXplOworfQorCisvLy8gQXNzaWduT3JkZXJpbmcgLSBBc3NpZ24gYW4gb3JkZXIgdG8gdGhlIFNETm9kZS4KK3ZvaWQgU2VsZWN0aW9uREFHOjpBc3NpZ25PcmRlcmluZyhjb25zdCBTRE5vZGUgKlNELCB1bnNpZ25lZCBPcmRlcikgeworICBhc3NlcnQoU0QgJiYgIlRyeWluZyB0byBhc3NpZ24gYW4gb3JkZXIgdG8gYSBudWxsIG5vZGUhIik7CisgIE9yZGVyaW5nLT5hZGQoU0QsIE9yZGVyKTsKK30KKworLy8vIEdldE9yZGVyaW5nIC0gR2V0IHRoZSBvcmRlciBmb3IgdGhlIFNETm9kZS4KK3Vuc2lnbmVkIFNlbGVjdGlvbkRBRzo6R2V0T3JkZXJpbmcoY29uc3QgU0ROb2RlICpTRCkgY29uc3QgeworICBhc3NlcnQoU0QgJiYgIlRyeWluZyB0byBnZXQgdGhlIG9yZGVyIG9mIGEgbnVsbCBub2RlISIpOworICByZXR1cm4gT3JkZXJpbmctPmdldE9yZGVyKFNEKTsKK30KKworLy8vIEFkZERiZ1ZhbHVlIC0gQWRkIGEgZGJnX3ZhbHVlIFNETm9kZS4gSWYgU0QgaXMgbm9uLW51bGwgdGhhdCBtZWFucyB0aGUKKy8vLyB2YWx1ZSBpcyBwcm9kdWNlZCBieSBTRC4KK3ZvaWQgU2VsZWN0aW9uREFHOjpBZGREYmdWYWx1ZShTRERiZ1ZhbHVlICpEQiwgU0ROb2RlICpTRCwgYm9vbCBpc1BhcmFtZXRlcikgeworICBEYmdJbmZvLT5hZGQoREIsIFNELCBpc1BhcmFtZXRlcik7CisgIGlmIChTRCkKKyAgICBTRC0+c2V0SGFzRGVidWdWYWx1ZSh0cnVlKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitIYW5kbGVTRE5vZGU6On5IYW5kbGVTRE5vZGUoKSB7CisgIERyb3BPcGVyYW5kcygpOworfQorCitHbG9iYWxBZGRyZXNzU0ROb2RlOjpHbG9iYWxBZGRyZXNzU0ROb2RlKHVuc2lnbmVkIE9wYywgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZULCBpbnQ2NF90IG8sIHVuc2lnbmVkIGNoYXIgVEYpCisgIDogU0ROb2RlKE9wYywgREwsIGdldFNEVlRMaXN0KFZUKSksIE9mZnNldChvKSwgVGFyZ2V0RmxhZ3MoVEYpIHsKKyAgVGhlR2xvYmFsID0gR0E7Cit9CisKK01lbVNETm9kZTo6TWVtU0ROb2RlKHVuc2lnbmVkIE9wYywgRGVidWdMb2MgZGwsIFNEVlRMaXN0IFZUcywgRVZUIG1lbXZ0LAorICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKm1tbykKKyA6IFNETm9kZShPcGMsIGRsLCBWVHMpLCBNZW1vcnlWVChtZW12dCksIE1NTyhtbW8pIHsKKyAgU3ViY2xhc3NEYXRhID0gZW5jb2RlTWVtU0ROb2RlRmxhZ3MoMCwgSVNEOjpVTklOREVYRUQsIE1NTy0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTU8tPmlzTm9uVGVtcG9yYWwoKSk7CisgIGFzc2VydChpc1ZvbGF0aWxlKCkgPT0gTU1PLT5pc1ZvbGF0aWxlKCkgJiYgIlZvbGF0aWxlIGVuY29kaW5nIGVycm9yISIpOworICBhc3NlcnQoaXNOb25UZW1wb3JhbCgpID09IE1NTy0+aXNOb25UZW1wb3JhbCgpICYmCisgICAgICAgICAiTm9uLXRlbXBvcmFsIGVuY29kaW5nIGVycm9yISIpOworICBhc3NlcnQobWVtdnQuZ2V0U3RvcmVTaXplKCkgPT0gTU1PLT5nZXRTaXplKCkgJiYgIlNpemUgbWlzbWF0Y2ghIik7Cit9CisKK01lbVNETm9kZTo6TWVtU0ROb2RlKHVuc2lnbmVkIE9wYywgRGVidWdMb2MgZGwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNEVmFsdWUgKk9wcywgdW5zaWduZWQgTnVtT3BzLCBFVlQgbWVtdnQsIAorICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKm1tbykKKyAgIDogU0ROb2RlKE9wYywgZGwsIFZUcywgT3BzLCBOdW1PcHMpLAorICAgICBNZW1vcnlWVChtZW12dCksIE1NTyhtbW8pIHsKKyAgU3ViY2xhc3NEYXRhID0gZW5jb2RlTWVtU0ROb2RlRmxhZ3MoMCwgSVNEOjpVTklOREVYRUQsIE1NTy0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTU8tPmlzTm9uVGVtcG9yYWwoKSk7CisgIGFzc2VydChpc1ZvbGF0aWxlKCkgPT0gTU1PLT5pc1ZvbGF0aWxlKCkgJiYgIlZvbGF0aWxlIGVuY29kaW5nIGVycm9yISIpOworICBhc3NlcnQobWVtdnQuZ2V0U3RvcmVTaXplKCkgPT0gTU1PLT5nZXRTaXplKCkgJiYgIlNpemUgbWlzbWF0Y2ghIik7Cit9CisKKy8vLyBQcm9maWxlIC0gR2F0aGVyIHVuaXF1ZSBkYXRhIGZvciB0aGUgbm9kZS4KKy8vLwordm9pZCBTRE5vZGU6OlByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsKKyAgQWRkTm9kZUlETm9kZShJRCwgdGhpcyk7Cit9CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBFVlRBcnJheSB7CisgICAgc3RkOjp2ZWN0b3I8RVZUPiBWVHM7CisgICAgCisgICAgRVZUQXJyYXkoKSB7CisgICAgICBWVHMucmVzZXJ2ZShNVlQ6OkxBU1RfVkFMVUVUWVBFKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNVlQ6OkxBU1RfVkFMVUVUWVBFOyArK2kpCisgICAgICAgIFZUcy5wdXNoX2JhY2soTVZUKChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlpKSk7CisgICAgfQorICB9OworfQorCitzdGF0aWMgTWFuYWdlZFN0YXRpYzxzdGQ6OnNldDxFVlQsIEVWVDo6Y29tcGFyZVJhd0JpdHM+ID4gRVZUczsKK3N0YXRpYyBNYW5hZ2VkU3RhdGljPEVWVEFycmF5PiBTaW1wbGVWVEFycmF5Oworc3RhdGljIE1hbmFnZWRTdGF0aWM8c3lzOjpTbWFydE11dGV4PHRydWU+ID4gVlRNdXRleDsKKworLy8vIGdldFZhbHVlVHlwZUxpc3QgLSBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZS4KKy8vLworY29uc3QgRVZUICpTRE5vZGU6OmdldFZhbHVlVHlwZUxpc3QoRVZUIFZUKSB7CisgIGlmIChWVC5pc0V4dGVuZGVkKCkpIHsKKyAgICBzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBMb2NrKCpWVE11dGV4KTsKKyAgICByZXR1cm4gJigqRVZUcy0+aW5zZXJ0KFZUKS5maXJzdCk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgPCBNVlQ6OkxBU1RfVkFMVUVUWVBFICYmCisgICAgICAgICAgICJWYWx1ZSB0eXBlIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gJlNpbXBsZVZUQXJyYXktPlZUc1tWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5XTsKKyAgfQorfQorCisvLy8gaGFzTlVzZXNPZlZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGV4YWN0bHkgTlVTRVMgdXNlcyBvZiB0aGUKKy8vLyBpbmRpY2F0ZWQgdmFsdWUuICBUaGlzIG1ldGhvZCBpZ25vcmVzIHVzZXMgb2Ygb3RoZXIgdmFsdWVzIGRlZmluZWQgYnkgdGhpcworLy8vIG9wZXJhdGlvbi4KK2Jvb2wgU0ROb2RlOjpoYXNOVXNlc09mVmFsdWUodW5zaWduZWQgTlVzZXMsIHVuc2lnbmVkIFZhbHVlKSBjb25zdCB7CisgIGFzc2VydChWYWx1ZSA8IGdldE51bVZhbHVlcygpICYmICJCYWQgdmFsdWUhIik7CisKKyAgLy8gVE9ETzogT25seSBpdGVyYXRlIG92ZXIgdXNlcyBvZiBhIGdpdmVuIHZhbHVlIG9mIHRoZSBub2RlCisgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSB1c2VfYmVnaW4oKSwgRSA9IHVzZV9lbmQoKTsgVUkgIT0gRTsgKytVSSkgeworICAgIGlmIChVSS5nZXRVc2UoKS5nZXRSZXNObygpID09IFZhbHVlKSB7CisgICAgICBpZiAoTlVzZXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgLS1OVXNlczsKKyAgICB9CisgIH0KKworICAvLyBGb3VuZCBleGFjdGx5IHRoZSByaWdodCBudW1iZXIgb2YgdXNlcz8KKyAgcmV0dXJuIE5Vc2VzID09IDA7Cit9CisKKworLy8vIGhhc0FueVVzZU9mVmFsdWUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHVzZSBvZiB0aGUgaW5kaWNhdGVkCisvLy8gdmFsdWUuIFRoaXMgbWV0aG9kIGlnbm9yZXMgdXNlcyBvZiBvdGhlciB2YWx1ZXMgZGVmaW5lZCBieSB0aGlzIG9wZXJhdGlvbi4KK2Jvb2wgU0ROb2RlOjpoYXNBbnlVc2VPZlZhbHVlKHVuc2lnbmVkIFZhbHVlKSBjb25zdCB7CisgIGFzc2VydChWYWx1ZSA8IGdldE51bVZhbHVlcygpICYmICJCYWQgdmFsdWUhIik7CisKKyAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IHVzZV9iZWdpbigpLCBFID0gdXNlX2VuZCgpOyBVSSAhPSBFOyArK1VJKQorICAgIGlmIChVSS5nZXRVc2UoKS5nZXRSZXNObygpID09IFZhbHVlKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8vLyBpc09ubHlVc2VyT2YgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG5vZGUgaXMgdGhlIG9ubHkgdXNlIG9mIE4uCisvLy8KK2Jvb2wgU0ROb2RlOjppc09ubHlVc2VyT2YoU0ROb2RlICpOKSBjb25zdCB7CisgIGJvb2wgU2VlbiA9IGZhbHNlOworICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIEkgPSBOLT51c2VfYmVnaW4oKSwgRSA9IE4tPnVzZV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBTRE5vZGUgKlVzZXIgPSAqSTsKKyAgICBpZiAoVXNlciA9PSB0aGlzKQorICAgICAgU2VlbiA9IHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIFNlZW47Cit9CisKKy8vLyBpc09wZXJhbmQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG5vZGUgaXMgYW4gb3BlcmFuZCBvZiBOLgorLy8vCitib29sIFNEVmFsdWU6OmlzT3BlcmFuZE9mKFNETm9kZSAqTikgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCp0aGlzID09IE4tPmdldE9wZXJhbmQoaSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNETm9kZTo6aXNPcGVyYW5kT2YoU0ROb2RlICpOKSBjb25zdCB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5OdW1PcGVyYW5kczsgaSAhPSBlOyArK2kpCisgICAgaWYgKHRoaXMgPT0gTi0+T3BlcmFuZExpc3RbaV0uZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIHJlYWNoZXNDaGFpbldpdGhvdXRTaWRlRWZmZWN0cyAtIFJldHVybiB0cnVlIGlmIHRoaXMgb3BlcmFuZCAod2hpY2ggbXVzdAorLy8vIGJlIGEgY2hhaW4pIHJlYWNoZXMgdGhlIHNwZWNpZmllZCBvcGVyYW5kIHdpdGhvdXQgY3Jvc3NpbmcgYW55CisvLy8gc2lkZS1lZmZlY3RpbmcgaW5zdHJ1Y3Rpb25zLiAgSW4gcHJhY3RpY2UsIHRoaXMgbG9va3MgdGhyb3VnaCB0b2tlbgorLy8vIGZhY3RvcnMgYW5kIG5vbi12b2xhdGlsZSBsb2Fkcy4gIEluIG9yZGVyIHRvIHJlbWFpbiBlZmZpY2llbnQsIHRoaXMgb25seQorLy8vIGxvb2tzIGEgY291cGxlIG9mIG5vZGVzIGluLCBpdCBkb2VzIG5vdCBkbyBhbiBleGhhdXN0aXZlIHNlYXJjaC4KK2Jvb2wgU0RWYWx1ZTo6cmVhY2hlc0NoYWluV2l0aG91dFNpZGVFZmZlY3RzKFNEVmFsdWUgRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGgpIGNvbnN0IHsKKyAgaWYgKCp0aGlzID09IERlc3QpIHJldHVybiB0cnVlOworCisgIC8vIERvbid0IHNlYXJjaCB0b28gZGVlcGx5LCB3ZSBqdXN0IHdhbnQgdG8gYmUgYWJsZSB0byBzZWUgdGhyb3VnaAorICAvLyBUb2tlbkZhY3RvcidzIGV0Yy4KKyAgaWYgKERlcHRoID09IDApIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGlzIGlzIGEgdG9rZW4gZmFjdG9yLCBhbGwgaW5wdXRzIHRvIHRoZSBURiBoYXBwZW4gaW4gcGFyYWxsZWwuICBJZiBhbnkKKyAgLy8gb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBURiByZWFjaCBkZXN0LCB0aGVuIHdlIGNhbiBkbyB0aGUgeGZvcm0uCisgIGlmIChnZXRPcGNvZGUoKSA9PSBJU0Q6OlRva2VuRmFjdG9yKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKGdldE9wZXJhbmQoaSkucmVhY2hlc0NoYWluV2l0aG91dFNpZGVFZmZlY3RzKERlc3QsIERlcHRoLTEpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBMb2FkcyBkb24ndCBoYXZlIHNpZGUgZWZmZWN0cywgbG9vayB0aHJvdWdoIHRoZW0uCisgIGlmIChMb2FkU0ROb2RlICpMZCA9IGR5bl9jYXN0PExvYWRTRE5vZGU+KCp0aGlzKSkgeworICAgIGlmICghTGQtPmlzVm9sYXRpbGUoKSkKKyAgICAgIHJldHVybiBMZC0+Z2V0Q2hhaW4oKS5yZWFjaGVzQ2hhaW5XaXRob3V0U2lkZUVmZmVjdHMoRGVzdCwgRGVwdGgtMSk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNQcmVkZWNlc3Nvck9mIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGlzIGEgcHJlZGVjZXNzb3Igb2YgTi4gVGhpcyBub2RlCisvLy8gaXMgZWl0aGVyIGFuIG9wZXJhbmQgb2YgTiBvciBpdCBjYW4gYmUgcmVhY2hlZCBieSB0cmF2ZXJzaW5nIHVwIHRoZSBvcGVyYW5kcy4KKy8vLyBOT1RFOiB0aGlzIGlzIGFuIGV4cGVuc2l2ZSBtZXRob2QuIFVzZSBpdCBjYXJlZnVsbHkuCitib29sIFNETm9kZTo6aXNQcmVkZWNlc3Nvck9mKFNETm9kZSAqTikgY29uc3QgeworICBTbWFsbFB0clNldDxTRE5vZGUgKiwgMzI+IFZpc2l0ZWQ7CisgIFNtYWxsVmVjdG9yPFNETm9kZSAqLCAxNj4gV29ya2xpc3Q7CisgIFdvcmtsaXN0LnB1c2hfYmFjayhOKTsKKworICBkbyB7CisgICAgTiA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgU0ROb2RlICpPcCA9IE4tPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpOworICAgICAgaWYgKE9wID09IHRoaXMpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKFZpc2l0ZWQuaW5zZXJ0KE9wKSkKKyAgICAgICAgV29ya2xpc3QucHVzaF9iYWNrKE9wKTsKKyAgICB9CisgIH0gd2hpbGUgKCFXb3JrbGlzdC5lbXB0eSgpKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3VpbnQ2NF90IFNETm9kZTo6Z2V0Q29uc3RhbnRPcGVyYW5kVmFsKHVuc2lnbmVkIE51bSkgY29uc3QgeworICBhc3NlcnQoTnVtIDwgTnVtT3BlcmFuZHMgJiYgIkludmFsaWQgY2hpbGQgIyBvZiBTRE5vZGUhIik7CisgIHJldHVybiBjYXN0PENvbnN0YW50U0ROb2RlPihPcGVyYW5kTGlzdFtOdW1dKS0+Z2V0WkV4dFZhbHVlKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFNETm9kZTo6Z2V0T3BlcmF0aW9uTmFtZShjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0IHsKKyAgc3dpdGNoIChnZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIGlmIChnZXRPcGNvZGUoKSA8IElTRDo6QlVJTFRJTl9PUF9FTkQpCisgICAgICByZXR1cm4gIjw8VW5rbm93biBEQUcgTm9kZT4+IjsKKyAgICBpZiAoaXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICAgIGlmIChHKQorICAgICAgICBpZiAoY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBHLT5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKSkKKyAgICAgICAgICBpZiAoZ2V0TWFjaGluZU9wY29kZSgpIDwgVElJLT5nZXROdW1PcGNvZGVzKCkpCisgICAgICAgICAgICByZXR1cm4gVElJLT5nZXQoZ2V0TWFjaGluZU9wY29kZSgpKS5nZXROYW1lKCk7CisgICAgICByZXR1cm4gIjw8VW5rbm93biBNYWNoaW5lIE5vZGUgIyIgKyB1dG9zdHIoZ2V0T3Bjb2RlKCkpICsgIj4+IjsKKyAgICB9CisgICAgaWYgKEcpIHsKKyAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkgPSBHLT5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKTsKKyAgICAgIGNvbnN0IGNoYXIgKk5hbWUgPSBUTEkuZ2V0VGFyZ2V0Tm9kZU5hbWUoZ2V0T3Bjb2RlKCkpOworICAgICAgaWYgKE5hbWUpIHJldHVybiBOYW1lOworICAgICAgcmV0dXJuICI8PFVua25vd24gVGFyZ2V0IE5vZGUgIyIgKyB1dG9zdHIoZ2V0T3Bjb2RlKCkpICsgIj4+IjsKKyAgICB9CisgICAgcmV0dXJuICI8PFVua25vd24gTm9kZSAjIiArIHV0b3N0cihnZXRPcGNvZGUoKSkgKyAiPj4iOworCisjaWZuZGVmIE5ERUJVRworICBjYXNlIElTRDo6REVMRVRFRF9OT0RFOgorICAgIHJldHVybiAiPDxEZWxldGVkIE5vZGUhPj4iOworI2VuZGlmCisgIGNhc2UgSVNEOjpQUkVGRVRDSDogICAgICByZXR1cm4gIlByZWZldGNoIjsKKyAgY2FzZSBJU0Q6Ok1FTUJBUlJJRVI6ICAgIHJldHVybiAiTWVtQmFycmllciI7CisgIGNhc2UgSVNEOjpBVE9NSUNfQ01QX1NXQVA6ICAgIHJldHVybiAiQXRvbWljQ21wU3dhcCI7CisgIGNhc2UgSVNEOjpBVE9NSUNfU1dBUDogICAgICAgIHJldHVybiAiQXRvbWljU3dhcCI7CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9BREQ6ICAgIHJldHVybiAiQXRvbWljTG9hZEFkZCI7CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9TVUI6ICAgIHJldHVybiAiQXRvbWljTG9hZFN1YiI7CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9BTkQ6ICAgIHJldHVybiAiQXRvbWljTG9hZEFuZCI7CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9PUjogICAgIHJldHVybiAiQXRvbWljTG9hZE9yIjsKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1hPUjogICAgcmV0dXJuICJBdG9taWNMb2FkWG9yIjsKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX05BTkQ6ICAgcmV0dXJuICJBdG9taWNMb2FkTmFuZCI7CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9NSU46ICAgIHJldHVybiAiQXRvbWljTG9hZE1pbiI7CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9NQVg6ICAgIHJldHVybiAiQXRvbWljTG9hZE1heCI7CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9VTUlOOiAgIHJldHVybiAiQXRvbWljTG9hZFVNaW4iOworICBjYXNlIElTRDo6QVRPTUlDX0xPQURfVU1BWDogICByZXR1cm4gIkF0b21pY0xvYWRVTWF4IjsKKyAgY2FzZSBJU0Q6OlBDTUFSS0VSOiAgICAgIHJldHVybiAiUENNYXJrZXIiOworICBjYXNlIElTRDo6UkVBRENZQ0xFQ09VTlRFUjogcmV0dXJuICJSZWFkQ3ljbGVDb3VudGVyIjsKKyAgY2FzZSBJU0Q6OlNSQ1ZBTFVFOiAgICAgIHJldHVybiAiU3JjVmFsdWUiOworICBjYXNlIElTRDo6TUROT0RFX1NETk9ERTogcmV0dXJuICJNRE5vZGUiOworICBjYXNlIElTRDo6RW50cnlUb2tlbjogICAgcmV0dXJuICJFbnRyeVRva2VuIjsKKyAgY2FzZSBJU0Q6OlRva2VuRmFjdG9yOiAgIHJldHVybiAiVG9rZW5GYWN0b3IiOworICBjYXNlIElTRDo6QXNzZXJ0U2V4dDogICAgcmV0dXJuICJBc3NlcnRTZXh0IjsKKyAgY2FzZSBJU0Q6OkFzc2VydFpleHQ6ICAgIHJldHVybiAiQXNzZXJ0WmV4dCI7CisKKyAgY2FzZSBJU0Q6OkJhc2ljQmxvY2s6ICAgIHJldHVybiAiQmFzaWNCbG9jayI7CisgIGNhc2UgSVNEOjpWQUxVRVRZUEU6ICAgICByZXR1cm4gIlZhbHVlVHlwZSI7CisgIGNhc2UgSVNEOjpSZWdpc3RlcjogICAgICByZXR1cm4gIlJlZ2lzdGVyIjsKKworICBjYXNlIElTRDo6Q29uc3RhbnQ6ICAgICAgcmV0dXJuICJDb25zdGFudCI7CisgIGNhc2UgSVNEOjpDb25zdGFudEZQOiAgICByZXR1cm4gIkNvbnN0YW50RlAiOworICBjYXNlIElTRDo6R2xvYmFsQWRkcmVzczogcmV0dXJuICJHbG9iYWxBZGRyZXNzIjsKKyAgY2FzZSBJU0Q6Okdsb2JhbFRMU0FkZHJlc3M6IHJldHVybiAiR2xvYmFsVExTQWRkcmVzcyI7CisgIGNhc2UgSVNEOjpGcmFtZUluZGV4OiAgICByZXR1cm4gIkZyYW1lSW5kZXgiOworICBjYXNlIElTRDo6SnVtcFRhYmxlOiAgICAgcmV0dXJuICJKdW1wVGFibGUiOworICBjYXNlIElTRDo6R0xPQkFMX09GRlNFVF9UQUJMRTogcmV0dXJuICJHTE9CQUxfT0ZGU0VUX1RBQkxFIjsKKyAgY2FzZSBJU0Q6OlJFVFVSTkFERFI6IHJldHVybiAiUkVUVVJOQUREUiI7CisgIGNhc2UgSVNEOjpGUkFNRUFERFI6IHJldHVybiAiRlJBTUVBRERSIjsKKyAgY2FzZSBJU0Q6OkZSQU1FX1RPX0FSR1NfT0ZGU0VUOiByZXR1cm4gIkZSQU1FX1RPX0FSR1NfT0ZGU0VUIjsKKyAgY2FzZSBJU0Q6OkxTREFBRERSOiByZXR1cm4gIkxTREFBRERSIjsKKyAgY2FzZSBJU0Q6OkNvbnN0YW50UG9vbDogIHJldHVybiAiQ29uc3RhbnRQb29sIjsKKyAgY2FzZSBJU0Q6OkV4dGVybmFsU3ltYm9sOiByZXR1cm4gIkV4dGVybmFsU3ltYm9sIjsKKyAgY2FzZSBJU0Q6OkJsb2NrQWRkcmVzczogIHJldHVybiAiQmxvY2tBZGRyZXNzIjsKKyAgY2FzZSBJU0Q6OklOVFJJTlNJQ19XT19DSEFJTjoKKyAgY2FzZSBJU0Q6OklOVFJJTlNJQ19WT0lEOgorICBjYXNlIElTRDo6SU5UUklOU0lDX1dfQ0hBSU46IHsKKyAgICB1bnNpZ25lZCBPcE5vID0gZ2V0T3Bjb2RlKCkgPT0gSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4gPyAwIDogMTsKKyAgICB1bnNpZ25lZCBJSUQgPSBjYXN0PENvbnN0YW50U0ROb2RlPihnZXRPcGVyYW5kKE9wTm8pKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKElJRCA8IEludHJpbnNpYzo6bnVtX2ludHJpbnNpY3MpCisgICAgICByZXR1cm4gSW50cmluc2ljOjpnZXROYW1lKChJbnRyaW5zaWM6OklEKUlJRCk7CisgICAgZWxzZSBpZiAoY29uc3QgVGFyZ2V0SW50cmluc2ljSW5mbyAqVElJID0gRy0+Z2V0VGFyZ2V0KCkuZ2V0SW50cmluc2ljSW5mbygpKQorICAgICAgcmV0dXJuIFRJSS0+Z2V0TmFtZShJSUQpOworICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgaW50cmluc2ljIElEIik7CisgIH0KKworICBjYXNlIElTRDo6QlVJTERfVkVDVE9SOiAgIHJldHVybiAiQlVJTERfVkVDVE9SIjsKKyAgY2FzZSBJU0Q6OlRhcmdldENvbnN0YW50OiByZXR1cm4gIlRhcmdldENvbnN0YW50IjsKKyAgY2FzZSBJU0Q6OlRhcmdldENvbnN0YW50RlA6cmV0dXJuICJUYXJnZXRDb25zdGFudEZQIjsKKyAgY2FzZSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3M6IHJldHVybiAiVGFyZ2V0R2xvYmFsQWRkcmVzcyI7CisgIGNhc2UgSVNEOjpUYXJnZXRHbG9iYWxUTFNBZGRyZXNzOiByZXR1cm4gIlRhcmdldEdsb2JhbFRMU0FkZHJlc3MiOworICBjYXNlIElTRDo6VGFyZ2V0RnJhbWVJbmRleDogcmV0dXJuICJUYXJnZXRGcmFtZUluZGV4IjsKKyAgY2FzZSBJU0Q6OlRhcmdldEp1bXBUYWJsZTogIHJldHVybiAiVGFyZ2V0SnVtcFRhYmxlIjsKKyAgY2FzZSBJU0Q6OlRhcmdldENvbnN0YW50UG9vbDogIHJldHVybiAiVGFyZ2V0Q29uc3RhbnRQb29sIjsKKyAgY2FzZSBJU0Q6OlRhcmdldEV4dGVybmFsU3ltYm9sOiByZXR1cm4gIlRhcmdldEV4dGVybmFsU3ltYm9sIjsKKyAgY2FzZSBJU0Q6OlRhcmdldEJsb2NrQWRkcmVzczogcmV0dXJuICJUYXJnZXRCbG9ja0FkZHJlc3MiOworCisgIGNhc2UgSVNEOjpDb3B5VG9SZWc6ICAgICByZXR1cm4gIkNvcHlUb1JlZyI7CisgIGNhc2UgSVNEOjpDb3B5RnJvbVJlZzogICByZXR1cm4gIkNvcHlGcm9tUmVnIjsKKyAgY2FzZSBJU0Q6OlVOREVGOiAgICAgICAgIHJldHVybiAidW5kZWYiOworICBjYXNlIElTRDo6TUVSR0VfVkFMVUVTOiAgcmV0dXJuICJtZXJnZV92YWx1ZXMiOworICBjYXNlIElTRDo6SEFORExFTk9ERTogICAgcmV0dXJuICJoYW5kbGVub2RlIjsKKworICAvLyBVbmFyeSBvcGVyYXRvcnMKKyAgY2FzZSBJU0Q6OkZBQlM6ICAgcmV0dXJuICJmYWJzIjsKKyAgY2FzZSBJU0Q6OkZORUc6ICAgcmV0dXJuICJmbmVnIjsKKyAgY2FzZSBJU0Q6OkZTUVJUOiAgcmV0dXJuICJmc3FydCI7CisgIGNhc2UgSVNEOjpGU0lOOiAgIHJldHVybiAiZnNpbiI7CisgIGNhc2UgSVNEOjpGQ09TOiAgIHJldHVybiAiZmNvcyI7CisgIGNhc2UgSVNEOjpGVFJVTkM6IHJldHVybiAiZnRydW5jIjsKKyAgY2FzZSBJU0Q6OkZGTE9PUjogcmV0dXJuICJmZmxvb3IiOworICBjYXNlIElTRDo6RkNFSUw6ICByZXR1cm4gImZjZWlsIjsKKyAgY2FzZSBJU0Q6OkZSSU5UOiAgcmV0dXJuICJmcmludCI7CisgIGNhc2UgSVNEOjpGTkVBUkJZSU5UOiByZXR1cm4gImZuZWFyYnlpbnQiOworICBjYXNlIElTRDo6RkVYUDogICByZXR1cm4gImZleHAiOworICBjYXNlIElTRDo6RkVYUDI6ICByZXR1cm4gImZleHAyIjsKKyAgY2FzZSBJU0Q6OkZMT0c6ICAgcmV0dXJuICJmbG9nIjsKKyAgY2FzZSBJU0Q6OkZMT0cyOiAgcmV0dXJuICJmbG9nMiI7CisgIGNhc2UgSVNEOjpGTE9HMTA6IHJldHVybiAiZmxvZzEwIjsKKworICAvLyBCaW5hcnkgb3BlcmF0b3JzCisgIGNhc2UgSVNEOjpBREQ6ICAgIHJldHVybiAiYWRkIjsKKyAgY2FzZSBJU0Q6OlNVQjogICAgcmV0dXJuICJzdWIiOworICBjYXNlIElTRDo6TVVMOiAgICByZXR1cm4gIm11bCI7CisgIGNhc2UgSVNEOjpNVUxIVTogIHJldHVybiAibXVsaHUiOworICBjYXNlIElTRDo6TVVMSFM6ICByZXR1cm4gIm11bGhzIjsKKyAgY2FzZSBJU0Q6OlNESVY6ICAgcmV0dXJuICJzZGl2IjsKKyAgY2FzZSBJU0Q6OlVESVY6ICAgcmV0dXJuICJ1ZGl2IjsKKyAgY2FzZSBJU0Q6OlNSRU06ICAgcmV0dXJuICJzcmVtIjsKKyAgY2FzZSBJU0Q6OlVSRU06ICAgcmV0dXJuICJ1cmVtIjsKKyAgY2FzZSBJU0Q6OlNNVUxfTE9ISTogIHJldHVybiAic211bF9sb2hpIjsKKyAgY2FzZSBJU0Q6OlVNVUxfTE9ISTogIHJldHVybiAidW11bF9sb2hpIjsKKyAgY2FzZSBJU0Q6OlNESVZSRU06ICAgIHJldHVybiAic2RpdnJlbSI7CisgIGNhc2UgSVNEOjpVRElWUkVNOiAgICByZXR1cm4gInVkaXZyZW0iOworICBjYXNlIElTRDo6QU5EOiAgICByZXR1cm4gImFuZCI7CisgIGNhc2UgSVNEOjpPUjogICAgIHJldHVybiAib3IiOworICBjYXNlIElTRDo6WE9SOiAgICByZXR1cm4gInhvciI7CisgIGNhc2UgSVNEOjpTSEw6ICAgIHJldHVybiAic2hsIjsKKyAgY2FzZSBJU0Q6OlNSQTogICAgcmV0dXJuICJzcmEiOworICBjYXNlIElTRDo6U1JMOiAgICByZXR1cm4gInNybCI7CisgIGNhc2UgSVNEOjpST1RMOiAgIHJldHVybiAicm90bCI7CisgIGNhc2UgSVNEOjpST1RSOiAgIHJldHVybiAicm90ciI7CisgIGNhc2UgSVNEOjpGQUREOiAgIHJldHVybiAiZmFkZCI7CisgIGNhc2UgSVNEOjpGU1VCOiAgIHJldHVybiAiZnN1YiI7CisgIGNhc2UgSVNEOjpGTVVMOiAgIHJldHVybiAiZm11bCI7CisgIGNhc2UgSVNEOjpGRElWOiAgIHJldHVybiAiZmRpdiI7CisgIGNhc2UgSVNEOjpGUkVNOiAgIHJldHVybiAiZnJlbSI7CisgIGNhc2UgSVNEOjpGQ09QWVNJR046IHJldHVybiAiZmNvcHlzaWduIjsKKyAgY2FzZSBJU0Q6OkZHRVRTSUdOOiAgcmV0dXJuICJmZ2V0c2lnbiI7CisgIGNhc2UgSVNEOjpGUE9XOiAgIHJldHVybiAiZnBvdyI7CisKKyAgY2FzZSBJU0Q6OkZQT1dJOiAgcmV0dXJuICJmcG93aSI7CisgIGNhc2UgSVNEOjpTRVRDQzogICAgICAgcmV0dXJuICJzZXRjYyI7CisgIGNhc2UgSVNEOjpWU0VUQ0M6ICAgICAgcmV0dXJuICJ2c2V0Y2MiOworICBjYXNlIElTRDo6U0VMRUNUOiAgICAgIHJldHVybiAic2VsZWN0IjsKKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzogICByZXR1cm4gInNlbGVjdF9jYyI7CisgIGNhc2UgSVNEOjpJTlNFUlRfVkVDVE9SX0VMVDogICByZXR1cm4gImluc2VydF92ZWN0b3JfZWx0IjsKKyAgY2FzZSBJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVDogIHJldHVybiAiZXh0cmFjdF92ZWN0b3JfZWx0IjsKKyAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOiAgICAgIHJldHVybiAiY29uY2F0X3ZlY3RvcnMiOworICBjYXNlIElTRDo6RVhUUkFDVF9TVUJWRUNUT1I6ICAgcmV0dXJuICJleHRyYWN0X3N1YnZlY3RvciI7CisgIGNhc2UgSVNEOjpTQ0FMQVJfVE9fVkVDVE9SOiAgICByZXR1cm4gInNjYWxhcl90b192ZWN0b3IiOworICBjYXNlIElTRDo6VkVDVE9SX1NIVUZGTEU6ICAgICAgcmV0dXJuICJ2ZWN0b3Jfc2h1ZmZsZSI7CisgIGNhc2UgSVNEOjpDQVJSWV9GQUxTRTogICAgICAgICByZXR1cm4gImNhcnJ5X2ZhbHNlIjsKKyAgY2FzZSBJU0Q6OkFEREM6ICAgICAgICByZXR1cm4gImFkZGMiOworICBjYXNlIElTRDo6QURERTogICAgICAgIHJldHVybiAiYWRkZSI7CisgIGNhc2UgSVNEOjpTQURETzogICAgICAgcmV0dXJuICJzYWRkbyI7CisgIGNhc2UgSVNEOjpVQURETzogICAgICAgcmV0dXJuICJ1YWRkbyI7CisgIGNhc2UgSVNEOjpTU1VCTzogICAgICAgcmV0dXJuICJzc3VibyI7CisgIGNhc2UgSVNEOjpVU1VCTzogICAgICAgcmV0dXJuICJ1c3VibyI7CisgIGNhc2UgSVNEOjpTTVVMTzogICAgICAgcmV0dXJuICJzbXVsbyI7CisgIGNhc2UgSVNEOjpVTVVMTzogICAgICAgcmV0dXJuICJ1bXVsbyI7CisgIGNhc2UgSVNEOjpTVUJDOiAgICAgICAgcmV0dXJuICJzdWJjIjsKKyAgY2FzZSBJU0Q6OlNVQkU6ICAgICAgICByZXR1cm4gInN1YmUiOworICBjYXNlIElTRDo6U0hMX1BBUlRTOiAgIHJldHVybiAic2hsX3BhcnRzIjsKKyAgY2FzZSBJU0Q6OlNSQV9QQVJUUzogICByZXR1cm4gInNyYV9wYXJ0cyI7CisgIGNhc2UgSVNEOjpTUkxfUEFSVFM6ICAgcmV0dXJuICJzcmxfcGFydHMiOworCisgIC8vIENvbnZlcnNpb24gb3BlcmF0b3JzLgorICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6IHJldHVybiAic2lnbl9leHRlbmQiOworICBjYXNlIElTRDo6WkVST19FWFRFTkQ6IHJldHVybiAiemVyb19leHRlbmQiOworICBjYXNlIElTRDo6QU5ZX0VYVEVORDogIHJldHVybiAiYW55X2V4dGVuZCI7CisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORF9JTlJFRzogcmV0dXJuICJzaWduX2V4dGVuZF9pbnJlZyI7CisgIGNhc2UgSVNEOjpUUlVOQ0FURTogICAgcmV0dXJuICJ0cnVuY2F0ZSI7CisgIGNhc2UgSVNEOjpGUF9ST1VORDogICAgcmV0dXJuICJmcF9yb3VuZCI7CisgIGNhc2UgSVNEOjpGTFRfUk9VTkRTXzogcmV0dXJuICJmbHRfcm91bmRzIjsKKyAgY2FzZSBJU0Q6OkZQX1JPVU5EX0lOUkVHOiByZXR1cm4gImZwX3JvdW5kX2lucmVnIjsKKyAgY2FzZSBJU0Q6OkZQX0VYVEVORDogICByZXR1cm4gImZwX2V4dGVuZCI7CisKKyAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6ICByZXR1cm4gInNpbnRfdG9fZnAiOworICBjYXNlIElTRDo6VUlOVF9UT19GUDogIHJldHVybiAidWludF90b19mcCI7CisgIGNhc2UgSVNEOjpGUF9UT19TSU5UOiAgcmV0dXJuICJmcF90b19zaW50IjsKKyAgY2FzZSBJU0Q6OkZQX1RPX1VJTlQ6ICByZXR1cm4gImZwX3RvX3VpbnQiOworICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6IHJldHVybiAiYml0X2NvbnZlcnQiOworICBjYXNlIElTRDo6RlAxNl9UT19GUDMyOiByZXR1cm4gImZwMTZfdG9fZnAzMiI7CisgIGNhc2UgSVNEOjpGUDMyX1RPX0ZQMTY6IHJldHVybiAiZnAzMl90b19mcDE2IjsKKworICBjYXNlIElTRDo6Q09OVkVSVF9STkRTQVQ6IHsKKyAgICBzd2l0Y2ggKGNhc3Q8Q3Z0Um5kU2F0U0ROb2RlPih0aGlzKS0+Z2V0Q3Z0Q29kZSgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBjdnQgY29kZSEiKTsKKyAgICBjYXNlIElTRDo6Q1ZUX0ZGOiAgcmV0dXJuICJjdnRfZmYiOworICAgIGNhc2UgSVNEOjpDVlRfRlM6ICByZXR1cm4gImN2dF9mcyI7CisgICAgY2FzZSBJU0Q6OkNWVF9GVTogIHJldHVybiAiY3Z0X2Z1IjsKKyAgICBjYXNlIElTRDo6Q1ZUX1NGOiAgcmV0dXJuICJjdnRfc2YiOworICAgIGNhc2UgSVNEOjpDVlRfVUY6ICByZXR1cm4gImN2dF91ZiI7CisgICAgY2FzZSBJU0Q6OkNWVF9TUzogIHJldHVybiAiY3Z0X3NzIjsKKyAgICBjYXNlIElTRDo6Q1ZUX1NVOiAgcmV0dXJuICJjdnRfc3UiOworICAgIGNhc2UgSVNEOjpDVlRfVVM6ICByZXR1cm4gImN2dF91cyI7CisgICAgY2FzZSBJU0Q6OkNWVF9VVTogIHJldHVybiAiY3Z0X3V1IjsKKyAgICB9CisgIH0KKworICAgIC8vIENvbnRyb2wgZmxvdyBpbnN0cnVjdGlvbnMKKyAgY2FzZSBJU0Q6OkJSOiAgICAgIHJldHVybiAiYnIiOworICBjYXNlIElTRDo6QlJJTkQ6ICAgcmV0dXJuICJicmluZCI7CisgIGNhc2UgSVNEOjpCUl9KVDogICByZXR1cm4gImJyX2p0IjsKKyAgY2FzZSBJU0Q6OkJSQ09ORDogIHJldHVybiAiYnJjb25kIjsKKyAgY2FzZSBJU0Q6OkJSX0NDOiAgIHJldHVybiAiYnJfY2MiOworICBjYXNlIElTRDo6Q0FMTFNFUV9TVEFSVDogIHJldHVybiAiY2FsbHNlcV9zdGFydCI7CisgIGNhc2UgSVNEOjpDQUxMU0VRX0VORDogICAgcmV0dXJuICJjYWxsc2VxX2VuZCI7CisKKyAgICAvLyBPdGhlciBvcGVyYXRvcnMKKyAgY2FzZSBJU0Q6OkxPQUQ6ICAgICAgICAgICAgICAgcmV0dXJuICJsb2FkIjsKKyAgY2FzZSBJU0Q6OlNUT1JFOiAgICAgICAgICAgICAgcmV0dXJuICJzdG9yZSI7CisgIGNhc2UgSVNEOjpWQUFSRzogICAgICAgICAgICAgIHJldHVybiAidmFhcmciOworICBjYXNlIElTRDo6VkFDT1BZOiAgICAgICAgICAgICByZXR1cm4gInZhY29weSI7CisgIGNhc2UgSVNEOjpWQUVORDogICAgICAgICAgICAgIHJldHVybiAidmFlbmQiOworICBjYXNlIElTRDo6VkFTVEFSVDogICAgICAgICAgICByZXR1cm4gInZhc3RhcnQiOworICBjYXNlIElTRDo6RFlOQU1JQ19TVEFDS0FMTE9DOiByZXR1cm4gImR5bmFtaWNfc3RhY2thbGxvYyI7CisgIGNhc2UgSVNEOjpFWFRSQUNUX0VMRU1FTlQ6ICAgIHJldHVybiAiZXh0cmFjdF9lbGVtZW50IjsKKyAgY2FzZSBJU0Q6OkJVSUxEX1BBSVI6ICAgICAgICAgcmV0dXJuICJidWlsZF9wYWlyIjsKKyAgY2FzZSBJU0Q6OlNUQUNLU0FWRTogICAgICAgICAgcmV0dXJuICJzdGFja3NhdmUiOworICBjYXNlIElTRDo6U1RBQ0tSRVNUT1JFOiAgICAgICByZXR1cm4gInN0YWNrcmVzdG9yZSI7CisgIGNhc2UgSVNEOjpUUkFQOiAgICAgICAgICAgICAgIHJldHVybiAidHJhcCI7CisKKyAgLy8gQml0IG1hbmlwdWxhdGlvbgorICBjYXNlIElTRDo6QlNXQVA6ICAgcmV0dXJuICJic3dhcCI7CisgIGNhc2UgSVNEOjpDVFBPUDogICByZXR1cm4gImN0cG9wIjsKKyAgY2FzZSBJU0Q6OkNUVFo6ICAgIHJldHVybiAiY3R0eiI7CisgIGNhc2UgSVNEOjpDVExaOiAgICByZXR1cm4gImN0bHoiOworCisgIC8vIFRyYW1wb2xpbmVzCisgIGNhc2UgSVNEOjpUUkFNUE9MSU5FOiByZXR1cm4gInRyYW1wb2xpbmUiOworCisgIGNhc2UgSVNEOjpDT05EQ09ERToKKyAgICBzd2l0Y2ggKGNhc3Q8Q29uZENvZGVTRE5vZGU+KHRoaXMpLT5nZXQoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc2V0Y2MgY29uZGl0aW9uISIpOworICAgIGNhc2UgSVNEOjpTRVRPRVE6ICByZXR1cm4gInNldG9lcSI7CisgICAgY2FzZSBJU0Q6OlNFVE9HVDogIHJldHVybiAic2V0b2d0IjsKKyAgICBjYXNlIElTRDo6U0VUT0dFOiAgcmV0dXJuICJzZXRvZ2UiOworICAgIGNhc2UgSVNEOjpTRVRPTFQ6ICByZXR1cm4gInNldG9sdCI7CisgICAgY2FzZSBJU0Q6OlNFVE9MRTogIHJldHVybiAic2V0b2xlIjsKKyAgICBjYXNlIElTRDo6U0VUT05FOiAgcmV0dXJuICJzZXRvbmUiOworCisgICAgY2FzZSBJU0Q6OlNFVE86ICAgIHJldHVybiAic2V0byI7CisgICAgY2FzZSBJU0Q6OlNFVFVPOiAgIHJldHVybiAic2V0dW8iOworICAgIGNhc2UgSVNEOjpTRVRVRVE6ICByZXR1cm4gInNldHVlIjsKKyAgICBjYXNlIElTRDo6U0VUVUdUOiAgcmV0dXJuICJzZXR1Z3QiOworICAgIGNhc2UgSVNEOjpTRVRVR0U6ICByZXR1cm4gInNldHVnZSI7CisgICAgY2FzZSBJU0Q6OlNFVFVMVDogIHJldHVybiAic2V0dWx0IjsKKyAgICBjYXNlIElTRDo6U0VUVUxFOiAgcmV0dXJuICJzZXR1bGUiOworICAgIGNhc2UgSVNEOjpTRVRVTkU6ICByZXR1cm4gInNldHVuZSI7CisKKyAgICBjYXNlIElTRDo6U0VURVE6ICAgcmV0dXJuICJzZXRlcSI7CisgICAgY2FzZSBJU0Q6OlNFVEdUOiAgIHJldHVybiAic2V0Z3QiOworICAgIGNhc2UgSVNEOjpTRVRHRTogICByZXR1cm4gInNldGdlIjsKKyAgICBjYXNlIElTRDo6U0VUTFQ6ICAgcmV0dXJuICJzZXRsdCI7CisgICAgY2FzZSBJU0Q6OlNFVExFOiAgIHJldHVybiAic2V0bGUiOworICAgIGNhc2UgSVNEOjpTRVRORTogICByZXR1cm4gInNldG5lIjsKKyAgICB9CisgIH0KK30KKworY29uc3QgY2hhciAqU0ROb2RlOjpnZXRJbmRleGVkTW9kZU5hbWUoSVNEOjpNZW1JbmRleGVkTW9kZSBBTSkgeworICBzd2l0Y2ggKEFNKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICIiOworICBjYXNlIElTRDo6UFJFX0lOQzoKKyAgICByZXR1cm4gIjxwcmUtaW5jPiI7CisgIGNhc2UgSVNEOjpQUkVfREVDOgorICAgIHJldHVybiAiPHByZS1kZWM+IjsKKyAgY2FzZSBJU0Q6OlBPU1RfSU5DOgorICAgIHJldHVybiAiPHBvc3QtaW5jPiI7CisgIGNhc2UgSVNEOjpQT1NUX0RFQzoKKyAgICByZXR1cm4gIjxwb3N0LWRlYz4iOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIElTRDo6QXJnRmxhZ3NUeTo6Z2V0QXJnRmxhZ3NTdHJpbmcoKSB7CisgIHN0ZDo6c3RyaW5nIFMgPSAiPCAiOworCisgIGlmIChpc1pFeHQoKSkKKyAgICBTICs9ICJ6ZXh0ICI7CisgIGlmIChpc1NFeHQoKSkKKyAgICBTICs9ICJzZXh0ICI7CisgIGlmIChpc0luUmVnKCkpCisgICAgUyArPSAiaW5yZWcgIjsKKyAgaWYgKGlzU1JldCgpKQorICAgIFMgKz0gInNyZXQgIjsKKyAgaWYgKGlzQnlWYWwoKSkKKyAgICBTICs9ICJieXZhbCAiOworICBpZiAoaXNOZXN0KCkpCisgICAgUyArPSAibmVzdCAiOworICBpZiAoZ2V0QnlWYWxBbGlnbigpKQorICAgIFMgKz0gImJ5dmFsLWFsaWduOiIgKyB1dG9zdHIoZ2V0QnlWYWxBbGlnbigpKSArICIgIjsKKyAgaWYgKGdldE9yaWdBbGlnbigpKQorICAgIFMgKz0gIm9yaWctYWxpZ246IiArIHV0b3N0cihnZXRPcmlnQWxpZ24oKSkgKyAiICI7CisgIGlmIChnZXRCeVZhbFNpemUoKSkKKyAgICBTICs9ICJieXZhbC1zaXplOiIgKyB1dG9zdHIoZ2V0QnlWYWxTaXplKCkpICsgIiAiOworICByZXR1cm4gUyArICI+IjsKK30KKwordm9pZCBTRE5vZGU6OmR1bXAoKSBjb25zdCB7IGR1bXAoMCk7IH0KK3ZvaWQgU0ROb2RlOjpkdW1wKGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgY29uc3QgeworICBwcmludChkYmdzKCksIEcpOworICBkYmdzKCkgPDwgJ1xuJzsKK30KKwordm9pZCBTRE5vZGU6OnByaW50X3R5cGVzKHJhd19vc3RyZWFtICZPUywgY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdCB7CisgIE9TIDw8ICh2b2lkKil0aGlzIDw8ICI6ICI7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bVZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChpKSBPUyA8PCAiLCI7CisgICAgaWYgKGdldFZhbHVlVHlwZShpKSA9PSBNVlQ6Ok90aGVyKQorICAgICAgT1MgPDwgImNoIjsKKyAgICBlbHNlCisgICAgICBPUyA8PCBnZXRWYWx1ZVR5cGUoaSkuZ2V0RVZUU3RyaW5nKCk7CisgIH0KKyAgT1MgPDwgIiA9ICIgPDwgZ2V0T3BlcmF0aW9uTmFtZShHKTsKK30KKwordm9pZCBTRE5vZGU6OnByaW50X2RldGFpbHMocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IE1hY2hpbmVTRE5vZGUgKk1OID0gZHluX2Nhc3Q8TWFjaGluZVNETm9kZT4odGhpcykpIHsKKyAgICBpZiAoIU1OLT5tZW1vcGVyYW5kc19lbXB0eSgpKSB7CisgICAgICBPUyA8PCAiPCI7CisgICAgICBPUyA8PCAiTWVtOiI7CisgICAgICBmb3IgKE1hY2hpbmVTRE5vZGU6Om1tb19pdGVyYXRvciBpID0gTU4tPm1lbW9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICAgIGUgPSBNTi0+bWVtb3BlcmFuZHNfZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIE9TIDw8ICoqaTsKKyAgICAgICAgaWYgKGxsdm06Om5leHQoaSkgIT0gZSkKKyAgICAgICAgICBPUyA8PCAiICI7CisgICAgICB9CisgICAgICBPUyA8PCAiPiI7CisgICAgfQorICB9IGVsc2UgaWYgKGNvbnN0IFNodWZmbGVWZWN0b3JTRE5vZGUgKlNWTiA9CisgICAgICAgICAgICAgICBkeW5fY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPih0aGlzKSkgeworICAgIE9TIDw8ICI8IjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVmFsdWVMaXN0WzBdLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpbnQgSWR4ID0gU1ZOLT5nZXRNYXNrRWx0KGkpOworICAgICAgaWYgKGkpIE9TIDw8ICIsIjsKKyAgICAgIGlmIChJZHggPCAwKQorICAgICAgICBPUyA8PCAidSI7CisgICAgICBlbHNlCisgICAgICAgIE9TIDw8IElkeDsKKyAgICB9CisgICAgT1MgPDwgIj4iOworICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50U0ROb2RlICpDU0ROID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KHRoaXMpKSB7CisgICAgT1MgPDwgJzwnIDw8IENTRE4tPmdldEFQSW50VmFsdWUoKSA8PCAnPic7CisgIH0gZWxzZSBpZiAoY29uc3QgQ29uc3RhbnRGUFNETm9kZSAqQ1NETiA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KHRoaXMpKSB7CisgICAgaWYgKCZDU0ROLT5nZXRWYWx1ZUFQRigpLmdldFNlbWFudGljcygpPT0mQVBGbG9hdDo6SUVFRXNpbmdsZSkKKyAgICAgIE9TIDw8ICc8JyA8PCBDU0ROLT5nZXRWYWx1ZUFQRigpLmNvbnZlcnRUb0Zsb2F0KCkgPDwgJz4nOworICAgIGVsc2UgaWYgKCZDU0ROLT5nZXRWYWx1ZUFQRigpLmdldFNlbWFudGljcygpPT0mQVBGbG9hdDo6SUVFRWRvdWJsZSkKKyAgICAgIE9TIDw8ICc8JyA8PCBDU0ROLT5nZXRWYWx1ZUFQRigpLmNvbnZlcnRUb0RvdWJsZSgpIDw8ICc+JzsKKyAgICBlbHNlIHsKKyAgICAgIE9TIDw8ICI8QVBGbG9hdCgiOworICAgICAgQ1NETi0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpLmR1bXAoKTsKKyAgICAgIE9TIDw8ICIpPiI7CisgICAgfQorICB9IGVsc2UgaWYgKGNvbnN0IEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBRE4gPQorICAgICAgICAgICAgIGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KHRoaXMpKSB7CisgICAgaW50NjRfdCBvZmZzZXQgPSBHQUROLT5nZXRPZmZzZXQoKTsKKyAgICBPUyA8PCAnPCc7CisgICAgV3JpdGVBc09wZXJhbmQoT1MsIEdBRE4tPmdldEdsb2JhbCgpKTsKKyAgICBPUyA8PCAnPic7CisgICAgaWYgKG9mZnNldCA+IDApCisgICAgICBPUyA8PCAiICsgIiA8PCBvZmZzZXQ7CisgICAgZWxzZQorICAgICAgT1MgPDwgIiAiIDw8IG9mZnNldDsKKyAgICBpZiAodW5zaWduZWQgaW50IFRGID0gR0FETi0+Z2V0VGFyZ2V0RmxhZ3MoKSkKKyAgICAgIE9TIDw8ICIgW1RGPSIgPDwgVEYgPDwgJ10nOworICB9IGVsc2UgaWYgKGNvbnN0IEZyYW1lSW5kZXhTRE5vZGUgKkZJRE4gPSBkeW5fY2FzdDxGcmFtZUluZGV4U0ROb2RlPih0aGlzKSkgeworICAgIE9TIDw8ICI8IiA8PCBGSUROLT5nZXRJbmRleCgpIDw8ICI+IjsKKyAgfSBlbHNlIGlmIChjb25zdCBKdW1wVGFibGVTRE5vZGUgKkpURE4gPSBkeW5fY2FzdDxKdW1wVGFibGVTRE5vZGU+KHRoaXMpKSB7CisgICAgT1MgPDwgIjwiIDw8IEpURE4tPmdldEluZGV4KCkgPDwgIj4iOworICAgIGlmICh1bnNpZ25lZCBpbnQgVEYgPSBKVEROLT5nZXRUYXJnZXRGbGFncygpKQorICAgICAgT1MgPDwgIiBbVEY9IiA8PCBURiA8PCAnXSc7CisgIH0gZWxzZSBpZiAoY29uc3QgQ29uc3RhbnRQb29sU0ROb2RlICpDUCA9IGR5bl9jYXN0PENvbnN0YW50UG9vbFNETm9kZT4odGhpcykpeworICAgIGludCBvZmZzZXQgPSBDUC0+Z2V0T2Zmc2V0KCk7CisgICAgaWYgKENQLT5pc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSgpKQorICAgICAgT1MgPDwgIjwiIDw8ICpDUC0+Z2V0TWFjaGluZUNQVmFsKCkgPDwgIj4iOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICI8IiA8PCAqQ1AtPmdldENvbnN0VmFsKCkgPDwgIj4iOworICAgIGlmIChvZmZzZXQgPiAwKQorICAgICAgT1MgPDwgIiArICIgPDwgb2Zmc2V0OworICAgIGVsc2UKKyAgICAgIE9TIDw8ICIgIiA8PCBvZmZzZXQ7CisgICAgaWYgKHVuc2lnbmVkIGludCBURiA9IENQLT5nZXRUYXJnZXRGbGFncygpKQorICAgICAgT1MgPDwgIiBbVEY9IiA8PCBURiA8PCAnXSc7CisgIH0gZWxzZSBpZiAoY29uc3QgQmFzaWNCbG9ja1NETm9kZSAqQkJETiA9IGR5bl9jYXN0PEJhc2ljQmxvY2tTRE5vZGU+KHRoaXMpKSB7CisgICAgT1MgPDwgIjwiOworICAgIGNvbnN0IFZhbHVlICpMQkIgPSAoY29uc3QgVmFsdWUqKUJCRE4tPmdldEJhc2ljQmxvY2soKS0+Z2V0QmFzaWNCbG9jaygpOworICAgIGlmIChMQkIpCisgICAgICBPUyA8PCBMQkItPmdldE5hbWUoKSA8PCAiICI7CisgICAgT1MgPDwgKGNvbnN0IHZvaWQqKUJCRE4tPmdldEJhc2ljQmxvY2soKSA8PCAiPiI7CisgIH0gZWxzZSBpZiAoY29uc3QgUmVnaXN0ZXJTRE5vZGUgKlIgPSBkeW5fY2FzdDxSZWdpc3RlclNETm9kZT4odGhpcykpIHsKKyAgICBpZiAoRyAmJiBSLT5nZXRSZWcoKSAmJgorICAgICAgICBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSLT5nZXRSZWcoKSkpIHsKKyAgICAgIE9TIDw8ICIgJSIgPDwgRy0+Z2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCktPmdldE5hbWUoUi0+Z2V0UmVnKCkpOworICAgIH0gZWxzZSB7CisgICAgICBPUyA8PCAiICVyZWciIDw8IFItPmdldFJlZygpOworICAgIH0KKyAgfSBlbHNlIGlmIChjb25zdCBFeHRlcm5hbFN5bWJvbFNETm9kZSAqRVMgPQorICAgICAgICAgICAgIGR5bl9jYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPih0aGlzKSkgeworICAgIE9TIDw8ICInIiA8PCBFUy0+Z2V0U3ltYm9sKCkgPDwgIiciOworICAgIGlmICh1bnNpZ25lZCBpbnQgVEYgPSBFUy0+Z2V0VGFyZ2V0RmxhZ3MoKSkKKyAgICAgIE9TIDw8ICIgW1RGPSIgPDwgVEYgPDwgJ10nOworICB9IGVsc2UgaWYgKGNvbnN0IFNyY1ZhbHVlU0ROb2RlICpNID0gZHluX2Nhc3Q8U3JjVmFsdWVTRE5vZGU+KHRoaXMpKSB7CisgICAgaWYgKE0tPmdldFZhbHVlKCkpCisgICAgICBPUyA8PCAiPCIgPDwgTS0+Z2V0VmFsdWUoKSA8PCAiPiI7CisgICAgZWxzZQorICAgICAgT1MgPDwgIjxudWxsPiI7CisgIH0gZWxzZSBpZiAoY29uc3QgTUROb2RlU0ROb2RlICpNRCA9IGR5bl9jYXN0PE1ETm9kZVNETm9kZT4odGhpcykpIHsKKyAgICBpZiAoTUQtPmdldE1EKCkpCisgICAgICBPUyA8PCAiPCIgPDwgTUQtPmdldE1EKCkgPDwgIj4iOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICI8bnVsbD4iOworICB9IGVsc2UgaWYgKGNvbnN0IFZUU0ROb2RlICpOID0gZHluX2Nhc3Q8VlRTRE5vZGU+KHRoaXMpKSB7CisgICAgT1MgPDwgIjoiIDw8IE4tPmdldFZUKCkuZ2V0RVZUU3RyaW5nKCk7CisgIH0KKyAgZWxzZSBpZiAoY29uc3QgTG9hZFNETm9kZSAqTEQgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPih0aGlzKSkgeworICAgIE9TIDw8ICI8IiA8PCAqTEQtPmdldE1lbU9wZXJhbmQoKTsKKworICAgIGJvb2wgZG9FeHQgPSB0cnVlOworICAgIHN3aXRjaCAoTEQtPmdldEV4dGVuc2lvblR5cGUoKSkgeworICAgIGRlZmF1bHQ6IGRvRXh0ID0gZmFsc2U7IGJyZWFrOworICAgIGNhc2UgSVNEOjpFWFRMT0FEOiBPUyA8PCAiLCBhbnlleHQiOyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VYVExPQUQ6IE9TIDw8ICIsIHNleHQiOyBicmVhazsKKyAgICBjYXNlIElTRDo6WkVYVExPQUQ6IE9TIDw8ICIsIHpleHQiOyBicmVhazsKKyAgICB9CisgICAgaWYgKGRvRXh0KQorICAgICAgT1MgPDwgIiBmcm9tICIgPDwgTEQtPmdldE1lbW9yeVZUKCkuZ2V0RVZUU3RyaW5nKCk7CisKKyAgICBjb25zdCBjaGFyICpBTSA9IGdldEluZGV4ZWRNb2RlTmFtZShMRC0+Z2V0QWRkcmVzc2luZ01vZGUoKSk7CisgICAgaWYgKCpBTSkKKyAgICAgIE9TIDw8ICIsICIgPDwgQU07CisKKyAgICBPUyA8PCAiPiI7CisgIH0gZWxzZSBpZiAoY29uc3QgU3RvcmVTRE5vZGUgKlNUID0gZHluX2Nhc3Q8U3RvcmVTRE5vZGU+KHRoaXMpKSB7CisgICAgT1MgPDwgIjwiIDw8ICpTVC0+Z2V0TWVtT3BlcmFuZCgpOworCisgICAgaWYgKFNULT5pc1RydW5jYXRpbmdTdG9yZSgpKQorICAgICAgT1MgPDwgIiwgdHJ1bmMgdG8gIiA8PCBTVC0+Z2V0TWVtb3J5VlQoKS5nZXRFVlRTdHJpbmcoKTsKKworICAgIGNvbnN0IGNoYXIgKkFNID0gZ2V0SW5kZXhlZE1vZGVOYW1lKFNULT5nZXRBZGRyZXNzaW5nTW9kZSgpKTsKKyAgICBpZiAoKkFNKQorICAgICAgT1MgPDwgIiwgIiA8PCBBTTsKKyAgICAKKyAgICBPUyA8PCAiPiI7CisgIH0gZWxzZSBpZiAoY29uc3QgTWVtU0ROb2RlKiBNID0gZHluX2Nhc3Q8TWVtU0ROb2RlPih0aGlzKSkgeworICAgIE9TIDw8ICI8IiA8PCAqTS0+Z2V0TWVtT3BlcmFuZCgpIDw8ICI+IjsKKyAgfSBlbHNlIGlmIChjb25zdCBCbG9ja0FkZHJlc3NTRE5vZGUgKkJBID0KKyAgICAgICAgICAgICAgIGR5bl9jYXN0PEJsb2NrQWRkcmVzc1NETm9kZT4odGhpcykpIHsKKyAgICBPUyA8PCAiPCI7CisgICAgV3JpdGVBc09wZXJhbmQoT1MsIEJBLT5nZXRCbG9ja0FkZHJlc3MoKS0+Z2V0RnVuY3Rpb24oKSwgZmFsc2UpOworICAgIE9TIDw8ICIsICI7CisgICAgV3JpdGVBc09wZXJhbmQoT1MsIEJBLT5nZXRCbG9ja0FkZHJlc3MoKS0+Z2V0QmFzaWNCbG9jaygpLCBmYWxzZSk7CisgICAgT1MgPDwgIj4iOworICAgIGlmICh1bnNpZ25lZCBpbnQgVEYgPSBCQS0+Z2V0VGFyZ2V0RmxhZ3MoKSkKKyAgICAgIE9TIDw8ICIgW1RGPSIgPDwgVEYgPDwgJ10nOworICB9CisKKyAgaWYgKEcpCisgICAgaWYgKHVuc2lnbmVkIE9yZGVyID0gRy0+R2V0T3JkZXJpbmcodGhpcykpCisgICAgICBPUyA8PCAiIFtPUkQ9IiA8PCBPcmRlciA8PCAnXSc7CisKKyAgaWYgKGdldE5vZGVJZCgpICE9IC0xKQorICAgIE9TIDw8ICIgW0lEPSIgPDwgZ2V0Tm9kZUlkKCkgPDwgJ10nOworCisgIERlYnVnTG9jIGRsID0gZ2V0RGVidWdMb2MoKTsKKyAgaWYgKEcgJiYgIWRsLmlzVW5rbm93bigpKSB7CisgICAgRElTY29wZQorICAgICAgU2NvcGUoZGwuZ2V0U2NvcGUoRy0+Z2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnVuY3Rpb24oKS0+Z2V0Q29udGV4dCgpKSk7CisgICAgT1MgPDwgIiBkYmc6IjsKKyAgICAvLyBPbWl0IHRoZSBkaXJlY3RvcnksIHNpbmNlIGl0J3MgdXN1YWxseSBsb25nIGFuZCB1bmludGVyZXN0aW5nLgorICAgIGlmIChTY29wZS5WZXJpZnkoKSkKKyAgICAgIE9TIDw8IFNjb3BlLmdldEZpbGVuYW1lKCk7CisgICAgZWxzZQorICAgICAgT1MgPDwgIjx1bmtub3duPiI7CisgICAgT1MgPDwgJzonIDw8IGRsLmdldExpbmUoKTsKKyAgICBpZiAoZGwuZ2V0Q29sKCkgIT0gMCkKKyAgICAgIE9TIDw8ICc6JyA8PCBkbC5nZXRDb2woKTsKKyAgfQorfQorCit2b2lkIFNETm9kZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0IHsKKyAgcHJpbnRfdHlwZXMoT1MsIEcpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoaSkgT1MgPDwgIiwgIjsgZWxzZSBPUyA8PCAiICI7CisgICAgT1MgPDwgKHZvaWQqKWdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpOworICAgIGlmICh1bnNpZ25lZCBSTiA9IGdldE9wZXJhbmQoaSkuZ2V0UmVzTm8oKSkKKyAgICAgIE9TIDw8ICI6IiA8PCBSTjsKKyAgfQorICBwcmludF9kZXRhaWxzKE9TLCBHKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRyV2l0aERlcHRoSGVscGVyKHJhd19vc3RyZWFtICZPUywgY29uc3QgU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAqRywgdW5zaWduZWQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZW50KSAKK3sKKyAgaWYgKGRlcHRoID09IDApCisgICAgcmV0dXJuOworCisgIE9TLmluZGVudChpbmRlbnQpOworCisgIE4tPnByaW50KE9TLCBHKTsKKworICBpZiAoZGVwdGggPCAxKQorICAgIHJldHVybjsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBPUyA8PCAnXG4nOworICAgIHByaW50cldpdGhEZXB0aEhlbHBlcihPUywgTi0+Z2V0T3BlcmFuZChpKS5nZXROb2RlKCksIEcsIGRlcHRoLTEsIGluZGVudCsyKTsKKyAgfQorfQorCit2b2lkIFNETm9kZTo6cHJpbnRyV2l0aERlcHRoKHJhd19vc3RyZWFtICZPUywgY29uc3QgU2VsZWN0aW9uREFHICpHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRlcHRoKSBjb25zdCB7CisgIHByaW50cldpdGhEZXB0aEhlbHBlcihPUywgdGhpcywgRywgZGVwdGgsIDApOworfSAKKwordm9pZCBTRE5vZGU6OnByaW50ckZ1bGwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0IHsKKyAgLy8gRG9uJ3QgcHJpbnQgaW1wb3NzaWJseSBkZWVwIHRoaW5ncy4KKyAgcHJpbnRyV2l0aERlcHRoKE9TLCBHLCAxMDApOworfQorCit2b2lkIFNETm9kZTo6ZHVtcHJXaXRoRGVwdGgoY29uc3QgU2VsZWN0aW9uREFHICpHLCB1bnNpZ25lZCBkZXB0aCkgY29uc3QgeworICBwcmludHJXaXRoRGVwdGgoZGJncygpLCBHLCBkZXB0aCk7Cit9CisKK3ZvaWQgU0ROb2RlOjpkdW1wckZ1bGwoY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdCB7CisgIC8vIERvbid0IHByaW50IGltcG9zc2libHkgZGVlcCB0aGluZ3MuCisgIGR1bXByV2l0aERlcHRoKEcsIDEwMCk7Cit9IAorCitzdGF0aWMgdm9pZCBEdW1wTm9kZXMoY29uc3QgU0ROb2RlICpOLCB1bnNpZ25lZCBpbmRlbnQsIGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKE4tPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkKKyAgICAgIER1bXBOb2RlcyhOLT5nZXRPcGVyYW5kKGkpLmdldE5vZGUoKSwgaW5kZW50KzIsIEcpOworICAgIGVsc2UKKyAgICAgIGRiZ3MoKSA8PCAiXG4iIDw8IHN0ZDo6c3RyaW5nKGluZGVudCsyLCAnICcpCisgICAgICAgICAgIDw8ICh2b2lkKilOLT5nZXRPcGVyYW5kKGkpLmdldE5vZGUoKSA8PCAiOiA8bXVsdGlwbGUgdXNlPiI7CisKKworICBkYmdzKCkgPDwgIlxuIjsKKyAgZGJncygpLmluZGVudChpbmRlbnQpOworICBOLT5kdW1wKEcpOworfQorCitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6VW5yb2xsVmVjdG9yT3AoU0ROb2RlICpOLCB1bnNpZ25lZCBSZXNORSkgeworICBhc3NlcnQoTi0+Z2V0TnVtVmFsdWVzKCkgPT0gMSAmJgorICAgICAgICAgIkNhbid0IHVucm9sbCBhIHZlY3RvciB3aXRoIG11bHRpcGxlIHJlc3VsdHMhIik7CisKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICB1bnNpZ25lZCBORSA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIEVWVCBFbHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBTY2FsYXJzOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBPcGVyYW5kcyhOLT5nZXROdW1PcGVyYW5kcygpKTsKKworICAvLyBJZiBSZXNORSBpcyAwLCBmdWxseSB1bnJvbGwgdGhlIHZlY3RvciBvcC4KKyAgaWYgKFJlc05FID09IDApCisgICAgUmVzTkUgPSBORTsKKyAgZWxzZSBpZiAoTkUgPiBSZXNORSkKKyAgICBORSA9IFJlc05FOworCisgIHVuc2lnbmVkIGk7CisgIGZvciAoaT0gMDsgaSAhPSBORTsgKytpKSB7CisgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGogIT0gZTsgKytqKSB7CisgICAgICBTRFZhbHVlIE9wZXJhbmQgPSBOLT5nZXRPcGVyYW5kKGopOworICAgICAgRVZUIE9wZXJhbmRWVCA9IE9wZXJhbmQuZ2V0VmFsdWVUeXBlKCk7CisgICAgICBpZiAoT3BlcmFuZFZULmlzVmVjdG9yKCkpIHsKKyAgICAgICAgLy8gQSB2ZWN0b3Igb3BlcmFuZDsgZXh0cmFjdCBhIHNpbmdsZSBlbGVtZW50LgorICAgICAgICBFVlQgT3BlcmFuZEVsdFZUID0gT3BlcmFuZFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgICAgIE9wZXJhbmRzW2pdID0gZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kRWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RhbnQoaSwgTVZUOjppMzIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEEgc2NhbGFyIG9wZXJhbmQ7IGp1c3QgdXNlIGl0IGFzIGlzLgorICAgICAgICBPcGVyYW5kc1tqXSA9IE9wZXJhbmQ7CisgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICBTY2FsYXJzLnB1c2hfYmFjayhnZXROb2RlKE4tPmdldE9wY29kZSgpLCBkbCwgRWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPcGVyYW5kc1swXSwgT3BlcmFuZHMuc2l6ZSgpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6U0hMOgorICAgIGNhc2UgSVNEOjpTUkE6CisgICAgY2FzZSBJU0Q6OlNSTDoKKyAgICBjYXNlIElTRDo6Uk9UTDoKKyAgICBjYXNlIElTRDo6Uk9UUjoKKyAgICAgIFNjYWxhcnMucHVzaF9iYWNrKGdldE5vZGUoTi0+Z2V0T3Bjb2RlKCksIGRsLCBFbHRWVCwgT3BlcmFuZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoaWZ0QW1vdW50T3BlcmFuZChPcGVyYW5kc1sxXSkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNEOjpTSUdOX0VYVEVORF9JTlJFRzoKKyAgICBjYXNlIElTRDo6RlBfUk9VTkRfSU5SRUc6IHsKKyAgICAgIEVWVCBFeHRWVCA9IGNhc3Q8VlRTRE5vZGU+KE9wZXJhbmRzWzFdKS0+Z2V0VlQoKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgICAgU2NhbGFycy5wdXNoX2JhY2soZ2V0Tm9kZShOLT5nZXRPcGNvZGUoKSwgZGwsIEVsdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVUeXBlKEV4dFZUKSkpOworICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKDsgaSA8IFJlc05FOyArK2kpCisgICAgU2NhbGFycy5wdXNoX2JhY2soZ2V0VU5ERUYoRWx0VlQpKTsKKworICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsCisgICAgICAgICAgICAgICAgIEVWVDo6Z2V0VmVjdG9yVlQoKmdldENvbnRleHQoKSwgRWx0VlQsIFJlc05FKSwKKyAgICAgICAgICAgICAgICAgJlNjYWxhcnNbMF0sIFNjYWxhcnMuc2l6ZSgpKTsKK30KKworCisvLy8gaXNDb25zZWN1dGl2ZUxvYWQgLSBSZXR1cm4gdHJ1ZSBpZiBMRCBpcyBsb2FkaW5nICdCeXRlcycgYnl0ZXMgZnJvbSBhIAorLy8vIGxvY2F0aW9uIHRoYXQgaXMgJ0Rpc3QnIHVuaXRzIGF3YXkgZnJvbSB0aGUgbG9jYXRpb24gdGhhdCB0aGUgJ0Jhc2UnIGxvYWQgCisvLy8gaXMgbG9hZGluZyBmcm9tLgorYm9vbCBTZWxlY3Rpb25EQUc6OmlzQ29uc2VjdXRpdmVMb2FkKExvYWRTRE5vZGUgKkxELCBMb2FkU0ROb2RlICpCYXNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlcywgaW50IERpc3QpIGNvbnN0IHsKKyAgaWYgKExELT5nZXRDaGFpbigpICE9IEJhc2UtPmdldENoYWluKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBFVlQgVlQgPSBMRC0+Z2V0VmFsdWVUeXBlKDApOworICBpZiAoVlQuZ2V0U2l6ZUluQml0cygpIC8gOCAhPSBCeXRlcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU0RWYWx1ZSBMb2MgPSBMRC0+Z2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBCYXNlTG9jID0gQmFzZS0+Z2V0T3BlcmFuZCgxKTsKKyAgaWYgKExvYy5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZyYW1lSW5kZXgpIHsKKyAgICBpZiAoQmFzZUxvYy5nZXRPcGNvZGUoKSAhPSBJU0Q6OkZyYW1lSW5kZXgpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnJhbWVJbmZvKCk7CisgICAgaW50IEZJICA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oTG9jKS0+Z2V0SW5kZXgoKTsKKyAgICBpbnQgQkZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihCYXNlTG9jKS0+Z2V0SW5kZXgoKTsKKyAgICBpbnQgRlMgID0gTUZJLT5nZXRPYmplY3RTaXplKEZJKTsKKyAgICBpbnQgQkZTID0gTUZJLT5nZXRPYmplY3RTaXplKEJGSSk7CisgICAgaWYgKEZTICE9IEJGUyB8fCBGUyAhPSAoaW50KUJ5dGVzKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIE1GSS0+Z2V0T2JqZWN0T2Zmc2V0KEZJKSA9PSAoTUZJLT5nZXRPYmplY3RPZmZzZXQoQkZJKSArIERpc3QqQnl0ZXMpOworICB9CisgIGlmIChMb2MuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQgJiYgTG9jLmdldE9wZXJhbmQoMCkgPT0gQmFzZUxvYykgeworICAgIENvbnN0YW50U0ROb2RlICpWID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KExvYy5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoViAmJiAoVi0+Z2V0U0V4dFZhbHVlKCkgPT0gRGlzdCpCeXRlcykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IEdsb2JhbFZhbHVlICpHVjEgPSBOVUxMOworICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YyID0gTlVMTDsKKyAgaW50NjRfdCBPZmZzZXQxID0gMDsKKyAgaW50NjRfdCBPZmZzZXQyID0gMDsKKyAgYm9vbCBpc0dBMSA9IFRMSS5pc0dBUGx1c09mZnNldChMb2MuZ2V0Tm9kZSgpLCBHVjEsIE9mZnNldDEpOworICBib29sIGlzR0EyID0gVExJLmlzR0FQbHVzT2Zmc2V0KEJhc2VMb2MuZ2V0Tm9kZSgpLCBHVjIsIE9mZnNldDIpOworICBpZiAoaXNHQTEgJiYgaXNHQTIgJiYgR1YxID09IEdWMikKKyAgICByZXR1cm4gT2Zmc2V0MSA9PSAoT2Zmc2V0MiArIERpc3QqQnl0ZXMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIEluZmVyUHRyQWxpZ25tZW50IC0gSW5mZXIgYWxpZ25tZW50IG9mIGEgbG9hZCAvIHN0b3JlIGFkZHJlc3MuIFJldHVybiAwIGlmCisvLy8gaXQgY2Fubm90IGJlIGluZmVycmVkLgordW5zaWduZWQgU2VsZWN0aW9uREFHOjpJbmZlclB0ckFsaWdubWVudChTRFZhbHVlIFB0cikgY29uc3QgeworICAvLyBJZiB0aGlzIGlzIGEgR2xvYmFsQWRkcmVzcyArIGNzdCwgcmV0dXJuIHRoZSBhbGlnbm1lbnQuCisgIGNvbnN0IEdsb2JhbFZhbHVlICpHVjsKKyAgaW50NjRfdCBHVk9mZnNldCA9IDA7CisgIGlmIChUTEkuaXNHQVBsdXNPZmZzZXQoUHRyLmdldE5vZGUoKSwgR1YsIEdWT2Zmc2V0KSkgeworICAgIC8vIElmIEdWIGhhcyBzcGVjaWZpZWQgYWxpZ25tZW50LCB0aGVuIHVzZSBpdC4gT3RoZXJ3aXNlLCB1c2UgdGhlIHByZWZlcnJlZAorICAgIC8vIGFsaWdubWVudC4KKyAgICB1bnNpZ25lZCBBbGlnbiA9IEdWLT5nZXRBbGlnbm1lbnQoKTsKKyAgICBpZiAoIUFsaWduKSB7CisgICAgICBpZiAoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWYXIgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oR1YpKSB7CisgICAgICAgIGlmIChHVmFyLT5oYXNJbml0aWFsaXplcigpKSB7CisgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSBUTEkuZ2V0VGFyZ2V0RGF0YSgpOworICAgICAgICAgIEFsaWduID0gVEQtPmdldFByZWZlcnJlZEFsaWdubWVudChHVmFyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTWluQWxpZ24oQWxpZ24sIEdWT2Zmc2V0KTsKKyAgfQorCisgIC8vIElmIHRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIGEgc3RhY2sgc2xvdCwgdXNlIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAvLyBzdGFjayBzbG90J3MgYWxpZ25tZW50LgorICBpbnQgRnJhbWVJZHggPSAxIDw8IDMxOworICBpbnQ2NF90IEZyYW1lT2Zmc2V0ID0gMDsKKyAgaWYgKEZyYW1lSW5kZXhTRE5vZGUgKkZJID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4oUHRyKSkgeworICAgIEZyYW1lSWR4ID0gRkktPmdldEluZGV4KCk7CisgIH0gZWxzZSBpZiAoUHRyLmdldE9wY29kZSgpID09IElTRDo6QUREICYmCisgICAgICAgICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihQdHIuZ2V0T3BlcmFuZCgxKSkgJiYKKyAgICAgICAgICAgICBpc2E8RnJhbWVJbmRleFNETm9kZT4oUHRyLmdldE9wZXJhbmQoMCkpKSB7CisgICAgRnJhbWVJZHggPSBjYXN0PEZyYW1lSW5kZXhTRE5vZGU+KFB0ci5nZXRPcGVyYW5kKDApKS0+Z2V0SW5kZXgoKTsKKyAgICBGcmFtZU9mZnNldCA9IFB0ci5nZXRDb25zdGFudE9wZXJhbmRWYWwoMSk7CisgIH0KKworICBpZiAoRnJhbWVJZHggIT0gKDEgPDwgMzEpKSB7CisgICAgLy8gRklYTUU6IEhhbmRsZSBGSStDU1QuCisgICAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAmTUZJID0gKmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZyYW1lSW5mbygpOworICAgIHVuc2lnbmVkIEZJSW5mb0FsaWduID0gTWluQWxpZ24oTUZJLmdldE9iamVjdEFsaWdubWVudChGcmFtZUlkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZU9mZnNldCk7CisgICAgcmV0dXJuIEZJSW5mb0FsaWduOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHOjpkdW1wKCkgY29uc3QgeworICBkYmdzKCkgPDwgIlNlbGVjdGlvbkRBRyBoYXMgIiA8PCBBbGxOb2Rlcy5zaXplKCkgPDwgIiBub2RlczoiOworCisgIGZvciAoYWxsbm9kZXNfY29uc3RfaXRlcmF0b3IgSSA9IGFsbG5vZGVzX2JlZ2luKCksIEUgPSBhbGxub2Rlc19lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IFNETm9kZSAqTiA9IEk7CisgICAgaWYgKCFOLT5oYXNPbmVVc2UoKSAmJiBOICE9IGdldFJvb3QoKS5nZXROb2RlKCkpCisgICAgICBEdW1wTm9kZXMoTiwgMiwgdGhpcyk7CisgIH0KKworICBpZiAoZ2V0Um9vdCgpLmdldE5vZGUoKSkgRHVtcE5vZGVzKGdldFJvb3QoKS5nZXROb2RlKCksIDIsIHRoaXMpOworCisgIGRiZ3MoKSA8PCAiXG5cbiI7Cit9CisKK3ZvaWQgU0ROb2RlOjpwcmludHIocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0IHsKKyAgcHJpbnRfdHlwZXMoT1MsIEcpOworICBwcmludF9kZXRhaWxzKE9TLCBHKTsKK30KKwordHlwZWRlZiBTbWFsbFB0clNldDxjb25zdCBTRE5vZGUgKiwgMTI4PiBWaXNpdGVkU0ROb2RlU2V0Oworc3RhdGljIHZvaWQgRHVtcE5vZGVzcihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNETm9kZSAqTiwgdW5zaWduZWQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3Rpb25EQUcgKkcsIFZpc2l0ZWRTRE5vZGVTZXQgJm9uY2UpIHsKKyAgaWYgKCFvbmNlLmluc2VydChOKSkgICAgICAgICAgLy8gSWYgd2UndmUgYmVlbiBoZXJlIGJlZm9yZSwgcmV0dXJuIG5vdy4KKyAgICByZXR1cm47CisKKyAgLy8gRHVtcCB0aGUgY3VycmVudCBTRE5vZGUsIGJ1dCBkb24ndCBlbmQgdGhlIGxpbmUgeWV0LgorICBPUyA8PCBzdGQ6OnN0cmluZyhpbmRlbnQsICcgJyk7CisgIE4tPnByaW50cihPUywgRyk7CisKKyAgLy8gSGF2aW5nIHByaW50ZWQgdGhpcyBTRE5vZGUsIHdhbGsgdGhlIGNoaWxkcmVuOgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBTRE5vZGUgKmNoaWxkID0gTi0+Z2V0T3BlcmFuZChpKS5nZXROb2RlKCk7CisKKyAgICBpZiAoaSkgT1MgPDwgIiwiOworICAgIE9TIDw8ICIgIjsKKworICAgIGlmIChjaGlsZC0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAwKSB7CisgICAgICAvLyBUaGlzIGNoaWxkIGhhcyBubyBncmFuZGNoaWxkcmVuOyBwcmludCBpdCBpbmxpbmUgcmlnaHQgaGVyZS4KKyAgICAgIGNoaWxkLT5wcmludHIoT1MsIEcpOworICAgICAgb25jZS5pbnNlcnQoY2hpbGQpOworICAgIH0gZWxzZSB7ICAgICAgICAgLy8gSnVzdCB0aGUgYWRkcmVzcy4gRklYTUU6IGFsc28gcHJpbnQgdGhlIGNoaWxkJ3Mgb3Bjb2RlLgorICAgICAgT1MgPDwgKHZvaWQqKWNoaWxkOworICAgICAgaWYgKHVuc2lnbmVkIFJOID0gTi0+Z2V0T3BlcmFuZChpKS5nZXRSZXNObygpKQorICAgICAgICBPUyA8PCAiOiIgPDwgUk47CisgICAgfQorICB9CisKKyAgT1MgPDwgIlxuIjsKKworICAvLyBEdW1wIGNoaWxkcmVuIHRoYXQgaGF2ZSBncmFuZGNoaWxkcmVuIG9uIHRoZWlyIG93biBsaW5lKHMpLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBTRE5vZGUgKmNoaWxkID0gTi0+Z2V0T3BlcmFuZChpKS5nZXROb2RlKCk7CisgICAgRHVtcE5vZGVzcihPUywgY2hpbGQsIGluZGVudCsyLCBHLCBvbmNlKTsKKyAgfQorfQorCit2b2lkIFNETm9kZTo6ZHVtcHIoKSBjb25zdCB7CisgIFZpc2l0ZWRTRE5vZGVTZXQgb25jZTsKKyAgRHVtcE5vZGVzcihkYmdzKCksIHRoaXMsIDAsIDAsIG9uY2UpOworfQorCit2b2lkIFNETm9kZTo6ZHVtcHIoY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdCB7CisgIFZpc2l0ZWRTRE5vZGVTZXQgb25jZTsKKyAgRHVtcE5vZGVzcihkYmdzKCksIHRoaXMsIDAsIEcsIG9uY2UpOworfQorCisKKy8vIGdldEFkZHJlc3NTcGFjZSAtIFJldHVybiB0aGUgYWRkcmVzcyBzcGFjZSB0aGlzIEdsb2JhbEFkZHJlc3MgYmVsb25ncyB0by4KK3Vuc2lnbmVkIEdsb2JhbEFkZHJlc3NTRE5vZGU6OmdldEFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldEdsb2JhbCgpLT5nZXRUeXBlKCktPmdldEFkZHJlc3NTcGFjZSgpOworfQorCisKK2NvbnN0IFR5cGUgKkNvbnN0YW50UG9vbFNETm9kZTo6Z2V0VHlwZSgpIGNvbnN0IHsKKyAgaWYgKGlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkpCisgICAgcmV0dXJuIFZhbC5NYWNoaW5lQ1BWYWwtPmdldFR5cGUoKTsKKyAgcmV0dXJuIFZhbC5Db25zdFZhbC0+Z2V0VHlwZSgpOworfQorCitib29sIEJ1aWxkVmVjdG9yU0ROb2RlOjppc0NvbnN0YW50U3BsYXQoQVBJbnQgJlNwbGF0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJlNwbGF0VW5kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlNwbGF0Qml0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNBbnlVbmRlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWluU3BsYXRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNCaWdFbmRpYW4pIHsKKyAgRVZUIFZUID0gZ2V0VmFsdWVUeXBlKDApOworICBhc3NlcnQoVlQuaXNWZWN0b3IoKSAmJiAiRXhwZWN0ZWQgYSB2ZWN0b3IgdHlwZSIpOworICB1bnNpZ25lZCBzeiA9IFZULmdldFNpemVJbkJpdHMoKTsKKyAgaWYgKE1pblNwbGF0Qml0cyA+IHN6KQorICAgIHJldHVybiBmYWxzZTsKKworICBTcGxhdFZhbHVlID0gQVBJbnQoc3osIDApOworICBTcGxhdFVuZGVmID0gQVBJbnQoc3osIDApOworCisgIC8vIEdldCB0aGUgYml0cy4gIEJpdHMgd2l0aCB1bmRlZmluZWQgdmFsdWVzICh3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQKKyAgLy8gb2YgdGhlIHZlY3RvciBpcyBhbiBJU0Q6OlVOREVGIHZhbHVlKSBhcmUgc2V0IGluIFNwbGF0VW5kZWYgYW5kIGNsZWFyZWQKKyAgLy8gaW4gU3BsYXRWYWx1ZS4gIElmIGFueSBvZiB0aGUgdmFsdWVzIGFyZSBub3QgY29uc3RhbnQsIGdpdmUgdXAgYW5kIHJldHVybgorICAvLyBmYWxzZS4KKyAgdW5zaWduZWQgaW50IG5PcHMgPSBnZXROdW1PcGVyYW5kcygpOworICBhc3NlcnQobk9wcyA+IDAgJiYgImlzQ29uc3RhbnRTcGxhdCBoYXMgMC1zaXplIGJ1aWxkIHZlY3RvciIpOworICB1bnNpZ25lZCBFbHRCaXRTaXplID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisKKyAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IG5PcHM7ICsraikgeworICAgIHVuc2lnbmVkIGkgPSBpc0JpZ0VuZGlhbiA/IG5PcHMtMS1qIDogajsKKyAgICBTRFZhbHVlIE9wVmFsID0gZ2V0T3BlcmFuZChpKTsKKyAgICB1bnNpZ25lZCBCaXRQb3MgPSBqICogRWx0Qml0U2l6ZTsKKworICAgIGlmIChPcFZhbC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgICAgU3BsYXRVbmRlZiB8PSBBUEludDo6Z2V0Qml0c1NldChzeiwgQml0UG9zLCBCaXRQb3MgKyBFbHRCaXRTaXplKTsKKyAgICBlbHNlIGlmIChDb25zdGFudFNETm9kZSAqQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3BWYWwpKQorICAgICAgU3BsYXRWYWx1ZSB8PSBBUEludChDTi0+Z2V0QVBJbnRWYWx1ZSgpKS56ZXh0T3JUcnVuYyhFbHRCaXRTaXplKS4KKyAgICAgICAgICAgICAgICAgICAgemV4dE9yVHJ1bmMoc3opIDw8IEJpdFBvczsKKyAgICBlbHNlIGlmIChDb25zdGFudEZQU0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE9wVmFsKSkKKyAgICAgIFNwbGF0VmFsdWUgfD0gQ04tPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKS56ZXh0T3JUcnVuYyhzeikgPDxCaXRQb3M7CisgICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRoZSBidWlsZF92ZWN0b3IgaXMgYWxsIGNvbnN0YW50cyBvciB1bmRlZnMuICBGaW5kIHRoZSBzbWFsbGVzdCBlbGVtZW50CisgIC8vIHNpemUgdGhhdCBzcGxhdHMgdGhlIHZlY3Rvci4KKworICBIYXNBbnlVbmRlZnMgPSAoU3BsYXRVbmRlZiAhPSAwKTsKKyAgd2hpbGUgKHN6ID4gOCkgeworCisgICAgdW5zaWduZWQgSGFsZlNpemUgPSBzeiAvIDI7CisgICAgQVBJbnQgSGlnaFZhbHVlID0gQVBJbnQoU3BsYXRWYWx1ZSkubHNocihIYWxmU2l6ZSkudHJ1bmMoSGFsZlNpemUpOworICAgIEFQSW50IExvd1ZhbHVlID0gQVBJbnQoU3BsYXRWYWx1ZSkudHJ1bmMoSGFsZlNpemUpOworICAgIEFQSW50IEhpZ2hVbmRlZiA9IEFQSW50KFNwbGF0VW5kZWYpLmxzaHIoSGFsZlNpemUpLnRydW5jKEhhbGZTaXplKTsKKyAgICBBUEludCBMb3dVbmRlZiA9IEFQSW50KFNwbGF0VW5kZWYpLnRydW5jKEhhbGZTaXplKTsKKworICAgIC8vIElmIHRoZSB0d28gaGFsdmVzIGRvIG5vdCBtYXRjaCAoaWdub3JpbmcgdW5kZWYgYml0cyksIHN0b3AgaGVyZS4KKyAgICBpZiAoKEhpZ2hWYWx1ZSAmIH5Mb3dVbmRlZikgIT0gKExvd1ZhbHVlICYgfkhpZ2hVbmRlZikgfHwKKyAgICAgICAgTWluU3BsYXRCaXRzID4gSGFsZlNpemUpCisgICAgICBicmVhazsKKworICAgIFNwbGF0VmFsdWUgPSBIaWdoVmFsdWUgfCBMb3dWYWx1ZTsKKyAgICBTcGxhdFVuZGVmID0gSGlnaFVuZGVmICYgTG93VW5kZWY7CisKKyAgICBzeiA9IEhhbGZTaXplOworICB9CisKKyAgU3BsYXRCaXRTaXplID0gc3o7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFNodWZmbGVWZWN0b3JTRE5vZGU6OmlzU3BsYXRNYXNrKGNvbnN0IGludCAqTWFzaywgRVZUIFZUKSB7CisgIC8vIEZpbmQgdGhlIGZpcnN0IG5vbi11bmRlZiB2YWx1ZSBpbiB0aGUgc2h1ZmZsZSBtYXNrLgorICB1bnNpZ25lZCBpLCBlOworICBmb3IgKGkgPSAwLCBlID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsgaSAhPSBlICYmIE1hc2tbaV0gPCAwOyArK2kpCisgICAgLyogc2VhcmNoICovOworCisgIGFzc2VydChpICE9IGUgJiYgIlZFQ1RPUl9TSFVGRkxFIG5vZGUgd2l0aCBhbGwgdW5kZWYgaW5kaWNlcyEiKTsKKworICAvLyBNYWtlIHN1cmUgYWxsIHJlbWFpbmluZyBlbGVtZW50cyBhcmUgZWl0aGVyIHVuZGVmIG9yIHRoZSBzYW1lIGFzIHRoZSBmaXJzdAorICAvLyBub24tdW5kZWYgdmFsdWUuCisgIGZvciAoaW50IElkeCA9IE1hc2tbaV07IGkgIT0gZTsgKytpKQorICAgIGlmIChNYXNrW2ldID49IDAgJiYgTWFza1tpXSAhPSBJZHgpCisgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisjaWZkZWYgWERFQlVHCitzdGF0aWMgdm9pZCBjaGVja0ZvckN5Y2xlc0hlbHBlcihjb25zdCBTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxjb25zdCBTRE5vZGUqLCAzMj4gJlZpc2l0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxjb25zdCBTRE5vZGUqLCAzMj4gJkNoZWNrZWQpIHsKKyAgLy8gSWYgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCwgZG9uJ3QgY2hlY2sgaXQgYWdhaW4uCisgIGlmIChDaGVja2VkLmNvdW50KE4pKQorICAgIHJldHVybjsKKyAgCisgIC8vIElmIGEgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIHZpc2l0ZWQgb24gdGhpcyBkZXB0aC1maXJzdCB3YWxrLCByZWplY3QgaXQgYXMKKyAgLy8gYSBjeWNsZS4KKyAgaWYgKCFWaXNpdGVkLmluc2VydChOKSkgeworICAgIGRiZ3MoKSA8PCAiT2ZmZW5kaW5nIG5vZGU6XG4iOworICAgIE4tPmR1bXByRnVsbCgpOworICAgIGVycnMoKSA8PCAiRGV0ZWN0ZWQgY3ljbGUgaW4gU2VsZWN0aW9uREFHXG4iOworICAgIGFib3J0KCk7CisgIH0KKyAgCisgIGZvcih1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgIGNoZWNrRm9yQ3ljbGVzSGVscGVyKE4tPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpLCBWaXNpdGVkLCBDaGVja2VkKTsKKyAgCisgIENoZWNrZWQuaW5zZXJ0KE4pOworICBWaXNpdGVkLmVyYXNlKE4pOworfQorI2VuZGlmCisKK3ZvaWQgbGx2bTo6Y2hlY2tGb3JDeWNsZXMoY29uc3QgbGx2bTo6U0ROb2RlICpOKSB7CisjaWZkZWYgWERFQlVHCisgIGFzc2VydChOICYmICJDaGVja2luZyBub25leGlzdGFudCBTRE5vZGUiKTsKKyAgU21hbGxQdHJTZXQ8Y29uc3QgU0ROb2RlKiwgMzI+IHZpc2l0ZWQ7CisgIFNtYWxsUHRyU2V0PGNvbnN0IFNETm9kZSosIDMyPiBjaGVja2VkOworICBjaGVja0ZvckN5Y2xlc0hlbHBlcihOLCB2aXNpdGVkLCBjaGVja2VkKTsKKyNlbmRpZgorfQorCit2b2lkIGxsdm06OmNoZWNrRm9yQ3ljbGVzKGNvbnN0IGxsdm06OlNlbGVjdGlvbkRBRyAqREFHKSB7CisgIGNoZWNrRm9yQ3ljbGVzKERBRy0+Z2V0Um9vdCgpLmdldE5vZGUoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2VsZWN0aW9uREFHQnVpbGRlci5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2VsZWN0aW9uREFHQnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2ZGYxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9TZWxlY3Rpb25EQUdCdWlsZGVyLmNwcApAQCAtMCwwICsxLDUzMTIgQEAKKy8vPT09LS0gU2VsZWN0aW9uREFHQnVpbGRlci5jcHAgLSBTZWxlY3Rpb24tREFHIGJ1aWxkaW5nIC0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIHJvdXRpbmVzIGZvciB0cmFuc2xhdGluZyBmcm9tIExMVk0gSVIgaW50byBTZWxlY3Rpb25EQUcgSVIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJpc2VsIgorI2luY2x1ZGUgIlNETm9kZURiZ1ZhbHVlLmgiCisjaW5jbHVkZSAiU2VsZWN0aW9uREFHQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Db25zdGFudEZvbGRpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9BbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9GYXN0SVNlbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9GdW5jdGlvbkxvd2VyaW5nSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HQ1N0cmF0ZWd5LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dDTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRGVidWdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEludHJpbnNpY0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBMaW1pdEZsb2F0UHJlY2lzaW9uIC0gR2VuZXJhdGUgbG93LXByZWNpc2lvbiBpbmxpbmUgc2VxdWVuY2VzIGZvcgorLy8vIHNvbWUgZmxvYXQgbGliY2FsbHMgKDYsIDggb3IgMTIgYml0cykuCitzdGF0aWMgdW5zaWduZWQgTGltaXRGbG9hdFByZWNpc2lvbjsKKworc3RhdGljIGNsOjpvcHQ8dW5zaWduZWQsIHRydWU+CitMaW1pdEZQUHJlY2lzaW9uKCJsaW1pdC1mbG9hdC1wcmVjaXNpb24iLAorICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiR2VuZXJhdGUgbG93LXByZWNpc2lvbiBpbmxpbmUgc2VxdWVuY2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzb21lIGZsb2F0IGxpYmNhbGxzIiksCisgICAgICAgICAgICAgICAgIGNsOjpsb2NhdGlvbihMaW1pdEZsb2F0UHJlY2lzaW9uKSwKKyAgICAgICAgICAgICAgICAgY2w6OmluaXQoMCkpOworCisvLy8gZ2V0Q29weUZyb21QYXJ0cyAtIENyZWF0ZSBhIHZhbHVlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBsZWdhbCBwYXJ0cworLy8vIGNvbWJpbmVkIGludG8gdGhlIHZhbHVlIHRoZXkgcmVwcmVzZW50LiAgSWYgdGhlIHBhcnRzIGNvbWJpbmUgdG8gYSB0eXBlCisvLy8gbGFyZ2VyIHRoZW4gVmFsdWVWVCB0aGVuIEFzc2VydE9wIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgZXh0cmEKKy8vLyBiaXRzIGFyZSBrbm93biB0byBiZSB6ZXJvIChJU0Q6OkFzc2VydFpleHQpIG9yIHNpZ24gZXh0ZW5kZWQgZnJvbSBWYWx1ZVZUCisvLy8gKElTRDo6QXNzZXJ0U2V4dCkuCitzdGF0aWMgU0RWYWx1ZSBnZXRDb3B5RnJvbVBhcnRzKFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqUGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVBhcnRzLCBFVlQgUGFydFZULCBFVlQgVmFsdWVWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpOb2RlVHlwZSBBc3NlcnRPcCA9IElTRDo6REVMRVRFRF9OT0RFKSB7CisgIGFzc2VydChOdW1QYXJ0cyA+IDAgJiYgIk5vIHBhcnRzIHRvIGFzc2VtYmxlISIpOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpOworICBTRFZhbHVlIFZhbCA9IFBhcnRzWzBdOworCisgIGlmIChOdW1QYXJ0cyA+IDEpIHsKKyAgICAvLyBBc3NlbWJsZSB0aGUgdmFsdWUgZnJvbSBtdWx0aXBsZSBwYXJ0cy4KKyAgICBpZiAoIVZhbHVlVlQuaXNWZWN0b3IoKSAmJiBWYWx1ZVZULmlzSW50ZWdlcigpKSB7CisgICAgICB1bnNpZ25lZCBQYXJ0Qml0cyA9IFBhcnRWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgICB1bnNpZ25lZCBWYWx1ZUJpdHMgPSBWYWx1ZVZULmdldFNpemVJbkJpdHMoKTsKKworICAgICAgLy8gQXNzZW1ibGUgdGhlIHBvd2VyIG9mIDIgcGFydC4KKyAgICAgIHVuc2lnbmVkIFJvdW5kUGFydHMgPSBOdW1QYXJ0cyAmIChOdW1QYXJ0cyAtIDEpID8KKyAgICAgICAgMSA8PCBMb2cyXzMyKE51bVBhcnRzKSA6IE51bVBhcnRzOworICAgICAgdW5zaWduZWQgUm91bmRCaXRzID0gUGFydEJpdHMgKiBSb3VuZFBhcnRzOworICAgICAgRVZUIFJvdW5kVlQgPSBSb3VuZEJpdHMgPT0gVmFsdWVCaXRzID8KKyAgICAgICAgVmFsdWVWVCA6IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBSb3VuZEJpdHMpOworICAgICAgU0RWYWx1ZSBMbywgSGk7CisKKyAgICAgIEVWVCBIYWxmVlQgPSBFVlQ6OmdldEludGVnZXJWVCgqREFHLmdldENvbnRleHQoKSwgUm91bmRCaXRzLzIpOworCisgICAgICBpZiAoUm91bmRQYXJ0cyA+IDIpIHsKKyAgICAgICAgTG8gPSBnZXRDb3B5RnJvbVBhcnRzKERBRywgZGwsIFBhcnRzLCBSb3VuZFBhcnRzIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRWVCwgSGFsZlZUKTsKKyAgICAgICAgSGkgPSBnZXRDb3B5RnJvbVBhcnRzKERBRywgZGwsIFBhcnRzICsgUm91bmRQYXJ0cyAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3VuZFBhcnRzIC8gMiwgUGFydFZULCBIYWxmVlQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgSGFsZlZULCBQYXJ0c1swXSk7CisgICAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIEhhbGZWVCwgUGFydHNbMV0pOworICAgICAgfQorCisgICAgICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpCisgICAgICAgIHN0ZDo6c3dhcChMbywgSGkpOworCisgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1BBSVIsIGRsLCBSb3VuZFZULCBMbywgSGkpOworCisgICAgICBpZiAoUm91bmRQYXJ0cyA8IE51bVBhcnRzKSB7CisgICAgICAgIC8vIEFzc2VtYmxlIHRoZSB0cmFpbGluZyBub24tcG93ZXItb2YtMiBwYXJ0LgorICAgICAgICB1bnNpZ25lZCBPZGRQYXJ0cyA9IE51bVBhcnRzIC0gUm91bmRQYXJ0czsKKyAgICAgICAgRVZUIE9kZFZUID0gRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksIE9kZFBhcnRzICogUGFydEJpdHMpOworICAgICAgICBIaSA9IGdldENvcHlGcm9tUGFydHMoREFHLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRzICsgUm91bmRQYXJ0cywgT2RkUGFydHMsIFBhcnRWVCwgT2RkVlQpOworCisgICAgICAgIC8vIENvbWJpbmUgdGhlIHJvdW5kIGFuZCBvZGQgcGFydHMuCisgICAgICAgIExvID0gVmFsOworICAgICAgICBpZiAoVExJLmlzQmlnRW5kaWFuKCkpCisgICAgICAgICAgc3RkOjpzd2FwKExvLCBIaSk7CisgICAgICAgIEVWVCBUb3RhbFZUID0gRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksIE51bVBhcnRzICogUGFydEJpdHMpOworICAgICAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIFRvdGFsVlQsIEhpKTsKKyAgICAgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIFRvdGFsVlQsIEhpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChMby5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSkpOworICAgICAgICBMbyA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBUb3RhbFZULCBMbyk7CisgICAgICAgIFZhbCA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBUb3RhbFZULCBMbywgSGkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoVmFsdWVWVC5pc1ZlY3RvcigpKSB7CisgICAgICAvLyBIYW5kbGUgYSBtdWx0aS1lbGVtZW50IHZlY3Rvci4KKyAgICAgIEVWVCBJbnRlcm1lZGlhdGVWVCwgUmVnaXN0ZXJWVDsKKyAgICAgIHVuc2lnbmVkIE51bUludGVybWVkaWF0ZXM7CisgICAgICB1bnNpZ25lZCBOdW1SZWdzID0KKyAgICAgICAgVExJLmdldFZlY3RvclR5cGVCcmVha2Rvd24oKkRBRy5nZXRDb250ZXh0KCksIFZhbHVlVlQsIEludGVybWVkaWF0ZVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1JbnRlcm1lZGlhdGVzLCBSZWdpc3RlclZUKTsKKyAgICAgIGFzc2VydChOdW1SZWdzID09IE51bVBhcnRzCisgICAgICAgICAgICAgJiYgIlBhcnQgY291bnQgZG9lc24ndCBtYXRjaCB2ZWN0b3IgYnJlYWtkb3duISIpOworICAgICAgTnVtUGFydHMgPSBOdW1SZWdzOyAvLyBTaWxlbmNlIGEgY29tcGlsZXIgd2FybmluZy4KKyAgICAgIGFzc2VydChSZWdpc3RlclZUID09IFBhcnRWVAorICAgICAgICAgICAgICYmICJQYXJ0IHR5cGUgZG9lc24ndCBtYXRjaCB2ZWN0b3IgYnJlYWtkb3duISIpOworICAgICAgYXNzZXJ0KFJlZ2lzdGVyVlQgPT0gUGFydHNbMF0uZ2V0VmFsdWVUeXBlKCkgJiYKKyAgICAgICAgICAgICAiUGFydCB0eXBlIGRvZXNuJ3QgbWF0Y2ggcGFydCEiKTsKKworICAgICAgLy8gQXNzZW1ibGUgdGhlIHBhcnRzIGludG8gaW50ZXJtZWRpYXRlIG9wZXJhbmRzLgorICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzKE51bUludGVybWVkaWF0ZXMpOworICAgICAgaWYgKE51bUludGVybWVkaWF0ZXMgPT0gTnVtUGFydHMpIHsKKyAgICAgICAgLy8gSWYgdGhlIHJlZ2lzdGVyIHdhcyBub3QgZXhwYW5kZWQsIHRydW5jYXRlIG9yIGNvcHkgdGhlIHZhbHVlLAorICAgICAgICAvLyBhcyBhcHByb3ByaWF0ZS4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1QYXJ0czsgKytpKQorICAgICAgICAgIE9wc1tpXSA9IGdldENvcHlGcm9tUGFydHMoREFHLCBkbCwgJlBhcnRzW2ldLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydFZULCBJbnRlcm1lZGlhdGVWVCk7CisgICAgICB9IGVsc2UgaWYgKE51bVBhcnRzID4gMCkgeworICAgICAgICAvLyBJZiB0aGUgaW50ZXJtZWRpYXRlIHR5cGUgd2FzIGV4cGFuZGVkLCBidWlsZCB0aGUgaW50ZXJtZWRpYXRlCisgICAgICAgIC8vIG9wZXJhbmRzIGZyb20gdGhlIHBhcnRzLgorICAgICAgICBhc3NlcnQoTnVtUGFydHMgJSBOdW1JbnRlcm1lZGlhdGVzID09IDAgJiYKKyAgICAgICAgICAgICAgICJNdXN0IGV4cGFuZCBpbnRvIGEgZGl2aXNpYmxlIG51bWJlciBvZiBwYXJ0cyEiKTsKKyAgICAgICAgdW5zaWduZWQgRmFjdG9yID0gTnVtUGFydHMgLyBOdW1JbnRlcm1lZGlhdGVzOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUludGVybWVkaWF0ZXM7ICsraSkKKyAgICAgICAgICBPcHNbaV0gPSBnZXRDb3B5RnJvbVBhcnRzKERBRywgZGwsICZQYXJ0c1tpICogRmFjdG9yXSwgRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydFZULCBJbnRlcm1lZGlhdGVWVCk7CisgICAgICB9CisKKyAgICAgIC8vIEJ1aWxkIGEgdmVjdG9yIHdpdGggQlVJTERfVkVDVE9SIG9yIENPTkNBVF9WRUNUT1JTIGZyb20gdGhlCisgICAgICAvLyBpbnRlcm1lZGlhdGUgb3BlcmFuZHMuCisgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJbnRlcm1lZGlhdGVWVC5pc1ZlY3RvcigpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Q09OQ0FUX1ZFQ1RPUlMgOiBJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVZULCAmT3BzWzBdLCBOdW1JbnRlcm1lZGlhdGVzKTsKKyAgICB9IGVsc2UgaWYgKFBhcnRWVC5pc0Zsb2F0aW5nUG9pbnQoKSkgeworICAgICAgLy8gRlAgc3BsaXQgaW50byBtdWx0aXBsZSBGUCBwYXJ0cyAoZm9yIHBwY2YxMjgpCisgICAgICBhc3NlcnQoVmFsdWVWVCA9PSBFVlQoTVZUOjpwcGNmMTI4KSAmJiBQYXJ0VlQgPT0gRVZUKE1WVDo6ZjY0KSAmJgorICAgICAgICAgICAgICJVbmV4cGVjdGVkIHNwbGl0Iik7CisgICAgICBTRFZhbHVlIExvLCBIaTsKKyAgICAgIExvID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIEVWVChNVlQ6OmY2NCksIFBhcnRzWzBdKTsKKyAgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIEVWVChNVlQ6OmY2NCksIFBhcnRzWzFdKTsKKyAgICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICAgICAgc3RkOjpzd2FwKExvLCBIaSk7CisgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1BBSVIsIGRsLCBWYWx1ZVZULCBMbywgSGkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBGUCBzcGxpdCBpbnRvIGludGVnZXIgcGFydHMgKHNvZnQgZnApCisgICAgICBhc3NlcnQoVmFsdWVWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJiBQYXJ0VlQuaXNJbnRlZ2VyKCkgJiYKKyAgICAgICAgICAgICAhUGFydFZULmlzVmVjdG9yKCkgJiYgIlVuZXhwZWN0ZWQgc3BsaXQiKTsKKyAgICAgIEVWVCBJbnRWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBWYWx1ZVZULmdldFNpemVJbkJpdHMoKSk7CisgICAgICBWYWwgPSBnZXRDb3B5RnJvbVBhcnRzKERBRywgZGwsIFBhcnRzLCBOdW1QYXJ0cywgUGFydFZULCBJbnRWVCk7CisgICAgfQorICB9CisKKyAgLy8gVGhlcmUgaXMgbm93IG9uZSBwYXJ0LCBoZWxkIGluIFZhbC4gIENvcnJlY3QgaXQgdG8gbWF0Y2ggVmFsdWVWVC4KKyAgUGFydFZUID0gVmFsLmdldFZhbHVlVHlwZSgpOworCisgIGlmIChQYXJ0VlQgPT0gVmFsdWVWVCkKKyAgICByZXR1cm4gVmFsOworCisgIGlmIChQYXJ0VlQuaXNWZWN0b3IoKSkgeworICAgIGFzc2VydChWYWx1ZVZULmlzVmVjdG9yKCkgJiYgIlVua25vd24gdmVjdG9yIGNvbnZlcnNpb24hIik7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWYWx1ZVZULCBWYWwpOworICB9CisKKyAgaWYgKFZhbHVlVlQuaXNWZWN0b3IoKSkgeworICAgIGFzc2VydChWYWx1ZVZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkgPT0gUGFydFZUICYmCisgICAgICAgICAgIFZhbHVlVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA9PSAxICYmCisgICAgICAgICAgICJPbmx5IHRyaXZpYWwgc2NhbGFyLXRvLXZlY3RvciBjb252ZXJzaW9ucyBzaG91bGQgZ2V0IGhlcmUhIik7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgVmFsdWVWVCwgVmFsKTsKKyAgfQorCisgIGlmIChQYXJ0VlQuaXNJbnRlZ2VyKCkgJiYKKyAgICAgIFZhbHVlVlQuaXNJbnRlZ2VyKCkpIHsKKyAgICBpZiAoVmFsdWVWVC5iaXRzTFQoUGFydFZUKSkgeworICAgICAgLy8gRm9yIGEgdHJ1bmNhdGUsIHNlZSBpZiB3ZSBoYXZlIGFueSBpbmZvcm1hdGlvbiB0bworICAgICAgLy8gaW5kaWNhdGUgd2hldGhlciB0aGUgdHJ1bmNhdGVkIGJpdHMgd2lsbCBhbHdheXMgYmUKKyAgICAgIC8vIHplcm8gb3Igc2lnbi1leHRlbnNpb24uCisgICAgICBpZiAoQXNzZXJ0T3AgIT0gSVNEOjpERUxFVEVEX05PREUpCisgICAgICAgIFZhbCA9IERBRy5nZXROb2RlKEFzc2VydE9wLCBkbCwgUGFydFZULCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWYWx1ZVR5cGUoVmFsdWVWVCkpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBWYWx1ZVZULCBWYWwpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwgVmFsdWVWVCwgVmFsKTsKKyAgICB9CisgIH0KKworICBpZiAoUGFydFZULmlzRmxvYXRpbmdQb2ludCgpICYmIFZhbHVlVlQuaXNGbG9hdGluZ1BvaW50KCkpIHsKKyAgICBpZiAoVmFsdWVWVC5iaXRzTFQoVmFsLmdldFZhbHVlVHlwZSgpKSkgeworICAgICAgLy8gRlBfUk9VTkQncyBhcmUgYWx3YXlzIGV4YWN0IGhlcmUuCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGUF9ST1VORCwgZGwsIFZhbHVlVlQsIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMSkpOworICAgIH0KKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkZQX0VYVEVORCwgZGwsIFZhbHVlVlQsIFZhbCk7CisgIH0KKworICBpZiAoUGFydFZULmdldFNpemVJbkJpdHMoKSA9PSBWYWx1ZVZULmdldFNpemVJbkJpdHMoKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZhbHVlVlQsIFZhbCk7CisKKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBtaXNtYXRjaCEiKTsKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIGdldENvcHlUb1BhcnRzIC0gQ3JlYXRlIGEgc2VyaWVzIG9mIG5vZGVzIHRoYXQgY29udGFpbiB0aGUgc3BlY2lmaWVkIHZhbHVlCisvLy8gc3BsaXQgaW50byBsZWdhbCBwYXJ0cy4gIElmIHRoZSBwYXJ0cyBjb250YWluIG1vcmUgYml0cyB0aGFuIFZhbCwgdGhlbiwgZm9yCisvLy8gaW50ZWdlcnMsIEV4dGVuZEtpbmQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBob3cgdG8gZ2VuZXJhdGUgdGhlIGV4dHJhIGJpdHMuCitzdGF0aWMgdm9pZCBnZXRDb3B5VG9QYXJ0cyhTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFZhbCwgU0RWYWx1ZSAqUGFydHMsIHVuc2lnbmVkIE51bVBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFBhcnRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Tm9kZVR5cGUgRXh0ZW5kS2luZCA9IElTRDo6QU5ZX0VYVEVORCkgeworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpOworICBFVlQgUHRyVlQgPSBUTEkuZ2V0UG9pbnRlclR5KCk7CisgIEVWVCBWYWx1ZVZUID0gVmFsLmdldFZhbHVlVHlwZSgpOworICB1bnNpZ25lZCBQYXJ0Qml0cyA9IFBhcnRWVC5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIE9yaWdOdW1QYXJ0cyA9IE51bVBhcnRzOworICBhc3NlcnQoVExJLmlzVHlwZUxlZ2FsKFBhcnRWVCkgJiYgIkNvcHlpbmcgdG8gYW4gaWxsZWdhbCB0eXBlISIpOworCisgIGlmICghTnVtUGFydHMpCisgICAgcmV0dXJuOworCisgIGlmICghVmFsdWVWVC5pc1ZlY3RvcigpKSB7CisgICAgaWYgKFBhcnRWVCA9PSBWYWx1ZVZUKSB7CisgICAgICBhc3NlcnQoTnVtUGFydHMgPT0gMSAmJiAiTm8tb3AgY29weSB3aXRoIG11bHRpcGxlIHBhcnRzISIpOworICAgICAgUGFydHNbMF0gPSBWYWw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKE51bVBhcnRzICogUGFydEJpdHMgPiBWYWx1ZVZULmdldFNpemVJbkJpdHMoKSkgeworICAgICAgLy8gSWYgdGhlIHBhcnRzIGNvdmVyIG1vcmUgYml0cyB0aGFuIHRoZSB2YWx1ZSBoYXMsIHByb21vdGUgdGhlIHZhbHVlLgorICAgICAgaWYgKFBhcnRWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJiBWYWx1ZVZULmlzRmxvYXRpbmdQb2ludCgpKSB7CisgICAgICAgIGFzc2VydChOdW1QYXJ0cyA9PSAxICYmICJEbyBub3Qga25vdyB3aGF0IHRvIHByb21vdGUgdG8hIik7CisgICAgICAgIFZhbCA9IERBRy5nZXROb2RlKElTRDo6RlBfRVhURU5ELCBkbCwgUGFydFZULCBWYWwpOworICAgICAgfSBlbHNlIGlmIChQYXJ0VlQuaXNJbnRlZ2VyKCkgJiYgVmFsdWVWVC5pc0ludGVnZXIoKSkgeworICAgICAgICBWYWx1ZVZUID0gRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksIE51bVBhcnRzICogUGFydEJpdHMpOworICAgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShFeHRlbmRLaW5kLCBkbCwgVmFsdWVWVCwgVmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbWlzbWF0Y2ghIik7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChQYXJ0Qml0cyA9PSBWYWx1ZVZULmdldFNpemVJbkJpdHMoKSkgeworICAgICAgLy8gRGlmZmVyZW50IHR5cGVzIG9mIHRoZSBzYW1lIHNpemUuCisgICAgICBhc3NlcnQoTnVtUGFydHMgPT0gMSAmJiBQYXJ0VlQgIT0gVmFsdWVWVCk7CisgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgUGFydFZULCBWYWwpOworICAgIH0gZWxzZSBpZiAoTnVtUGFydHMgKiBQYXJ0Qml0cyA8IFZhbHVlVlQuZ2V0U2l6ZUluQml0cygpKSB7CisgICAgICAvLyBJZiB0aGUgcGFydHMgY292ZXIgbGVzcyBiaXRzIHRoYW4gdmFsdWUgaGFzLCB0cnVuY2F0ZSB0aGUgdmFsdWUuCisgICAgICBpZiAoUGFydFZULmlzSW50ZWdlcigpICYmIFZhbHVlVlQuaXNJbnRlZ2VyKCkpIHsKKyAgICAgICAgVmFsdWVWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBOdW1QYXJ0cyAqIFBhcnRCaXRzKTsKKyAgICAgICAgVmFsID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFZhbHVlVlQsIFZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIG1pc21hdGNoISIpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSB2YWx1ZSBtYXkgaGF2ZSBjaGFuZ2VkIC0gcmVjb21wdXRlIFZhbHVlVlQuCisgICAgVmFsdWVWVCA9IFZhbC5nZXRWYWx1ZVR5cGUoKTsKKyAgICBhc3NlcnQoTnVtUGFydHMgKiBQYXJ0Qml0cyA9PSBWYWx1ZVZULmdldFNpemVJbkJpdHMoKSAmJgorICAgICAgICAgICAiRmFpbGVkIHRvIHRpbGUgdGhlIHZhbHVlIHdpdGggUGFydFZUISIpOworCisgICAgaWYgKE51bVBhcnRzID09IDEpIHsKKyAgICAgIGFzc2VydChQYXJ0VlQgPT0gVmFsdWVWVCAmJiAiVHlwZSBjb252ZXJzaW9uIGZhaWxlZCEiKTsKKyAgICAgIFBhcnRzWzBdID0gVmFsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEV4cGFuZCB0aGUgdmFsdWUgaW50byBtdWx0aXBsZSBwYXJ0cy4KKyAgICBpZiAoTnVtUGFydHMgJiAoTnVtUGFydHMgLSAxKSkgeworICAgICAgLy8gVGhlIG51bWJlciBvZiBwYXJ0cyBpcyBub3QgYSBwb3dlciBvZiAyLiAgU3BsaXQgb2ZmIGFuZCBjb3B5IHRoZSB0YWlsLgorICAgICAgYXNzZXJ0KFBhcnRWVC5pc0ludGVnZXIoKSAmJiBWYWx1ZVZULmlzSW50ZWdlcigpICYmCisgICAgICAgICAgICAgIkRvIG5vdCBrbm93IHdoYXQgdG8gZXhwYW5kIHRvISIpOworICAgICAgdW5zaWduZWQgUm91bmRQYXJ0cyA9IDEgPDwgTG9nMl8zMihOdW1QYXJ0cyk7CisgICAgICB1bnNpZ25lZCBSb3VuZEJpdHMgPSBSb3VuZFBhcnRzICogUGFydEJpdHM7CisgICAgICB1bnNpZ25lZCBPZGRQYXJ0cyA9IE51bVBhcnRzIC0gUm91bmRQYXJ0czsKKyAgICAgIFNEVmFsdWUgT2RkVmFsID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBWYWx1ZVZULCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChSb3VuZEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgICAgIGdldENvcHlUb1BhcnRzKERBRywgZGwsIE9kZFZhbCwgUGFydHMgKyBSb3VuZFBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgT2RkUGFydHMsIFBhcnRWVCk7CisKKyAgICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICAgICAgLy8gVGhlIG9kZCBwYXJ0cyB3ZXJlIHJldmVyc2VkIGJ5IGdldENvcHlUb1BhcnRzIC0gdW5yZXZlcnNlIHRoZW0uCisgICAgICAgIHN0ZDo6cmV2ZXJzZShQYXJ0cyArIFJvdW5kUGFydHMsIFBhcnRzICsgTnVtUGFydHMpOworCisgICAgICBOdW1QYXJ0cyA9IFJvdW5kUGFydHM7CisgICAgICBWYWx1ZVZUID0gRVZUOjpnZXRJbnRlZ2VyVlQoKkRBRy5nZXRDb250ZXh0KCksIE51bVBhcnRzICogUGFydEJpdHMpOworICAgICAgVmFsID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFZhbHVlVlQsIFZhbCk7CisgICAgfQorCisgICAgLy8gVGhlIG51bWJlciBvZiBwYXJ0cyBpcyBhIHBvd2VyIG9mIDIuICBSZXBlYXRlZGx5IGJpc2VjdCB0aGUgdmFsdWUgdXNpbmcKKyAgICAvLyBFWFRSQUNUX0VMRU1FTlQuCisgICAgUGFydHNbMF0gPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVWVC5nZXRTaXplSW5CaXRzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsKTsKKworICAgIGZvciAodW5zaWduZWQgU3RlcFNpemUgPSBOdW1QYXJ0czsgU3RlcFNpemUgPiAxOyBTdGVwU2l6ZSAvPSAyKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtUGFydHM7IGkgKz0gU3RlcFNpemUpIHsKKyAgICAgICAgdW5zaWduZWQgVGhpc0JpdHMgPSBTdGVwU2l6ZSAqIFBhcnRCaXRzIC8gMjsKKyAgICAgICAgRVZUIFRoaXNWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBUaGlzQml0cyk7CisgICAgICAgIFNEVmFsdWUgJlBhcnQwID0gUGFydHNbaV07CisgICAgICAgIFNEVmFsdWUgJlBhcnQxID0gUGFydHNbaStTdGVwU2l6ZS8yXTsKKworICAgICAgICBQYXJ0MSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzVlQsIFBhcnQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBQdHJWVCkpOworICAgICAgICBQYXJ0MCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzVlQsIFBhcnQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBQdHJWVCkpOworCisgICAgICAgIGlmIChUaGlzQml0cyA9PSBQYXJ0Qml0cyAmJiBUaGlzVlQgIT0gUGFydFZUKSB7CisgICAgICAgICAgUGFydDAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRWVCwgUGFydDApOworICAgICAgICAgIFBhcnQxID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0VlQsIFBhcnQxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChUTEkuaXNCaWdFbmRpYW4oKSkKKyAgICAgIHN0ZDo6cmV2ZXJzZShQYXJ0cywgUGFydHMgKyBPcmlnTnVtUGFydHMpOworCisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVmVjdG9yIFZhbHVlVlQuCisgIGlmIChOdW1QYXJ0cyA9PSAxKSB7CisgICAgaWYgKFBhcnRWVCAhPSBWYWx1ZVZUKSB7CisgICAgICBpZiAoUGFydFZULmdldFNpemVJbkJpdHMoKSA9PSBWYWx1ZVZULmdldFNpemVJbkJpdHMoKSkgeworICAgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgUGFydFZULCBWYWwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KFZhbHVlVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSA9PSBQYXJ0VlQgJiYKKyAgICAgICAgICAgICAgIFZhbHVlVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA9PSAxICYmCisgICAgICAgICAgICAgICAiT25seSB0cml2aWFsIHZlY3Rvci10by1zY2FsYXIgY29udmVyc2lvbnMgc2hvdWxkIGdldCBoZXJlISIpOworICAgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRWVCwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBQYXJ0c1swXSA9IFZhbDsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBIYW5kbGUgYSBtdWx0aS1lbGVtZW50IHZlY3Rvci4KKyAgRVZUIEludGVybWVkaWF0ZVZULCBSZWdpc3RlclZUOworICB1bnNpZ25lZCBOdW1JbnRlcm1lZGlhdGVzOworICB1bnNpZ25lZCBOdW1SZWdzID0gVExJLmdldFZlY3RvclR5cGVCcmVha2Rvd24oKkRBRy5nZXRDb250ZXh0KCksIFZhbHVlVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm1lZGlhdGVWVCwgTnVtSW50ZXJtZWRpYXRlcywgUmVnaXN0ZXJWVCk7CisgIHVuc2lnbmVkIE51bUVsZW1lbnRzID0gVmFsdWVWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworCisgIGFzc2VydChOdW1SZWdzID09IE51bVBhcnRzICYmICJQYXJ0IGNvdW50IGRvZXNuJ3QgbWF0Y2ggdmVjdG9yIGJyZWFrZG93biEiKTsKKyAgTnVtUGFydHMgPSBOdW1SZWdzOyAvLyBTaWxlbmNlIGEgY29tcGlsZXIgd2FybmluZy4KKyAgYXNzZXJ0KFJlZ2lzdGVyVlQgPT0gUGFydFZUICYmICJQYXJ0IHR5cGUgZG9lc24ndCBtYXRjaCB2ZWN0b3IgYnJlYWtkb3duISIpOworCisgIC8vIFNwbGl0IHRoZSB2ZWN0b3IgaW50byBpbnRlcm1lZGlhdGUgb3BlcmFuZHMuCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wcyhOdW1JbnRlcm1lZGlhdGVzKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1JbnRlcm1lZGlhdGVzOyArK2kpIHsKKyAgICBpZiAoSW50ZXJtZWRpYXRlVlQuaXNWZWN0b3IoKSkKKyAgICAgIE9wc1tpXSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9TVUJWRUNUT1IsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJtZWRpYXRlVlQsIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChpICogKE51bUVsZW1lbnRzIC8gTnVtSW50ZXJtZWRpYXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyVlQpKTsKKyAgICBlbHNlCisgICAgICBPcHNbaV0gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm1lZGlhdGVWVCwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KGksIFB0clZUKSk7CisgIH0KKworICAvLyBTcGxpdCB0aGUgaW50ZXJtZWRpYXRlIG9wZXJhbmRzIGludG8gbGVnYWwgcGFydHMuCisgIGlmIChOdW1QYXJ0cyA9PSBOdW1JbnRlcm1lZGlhdGVzKSB7CisgICAgLy8gSWYgdGhlIHJlZ2lzdGVyIHdhcyBub3QgZXhwYW5kZWQsIHByb21vdGUgb3IgY29weSB0aGUgdmFsdWUsCisgICAgLy8gYXMgYXBwcm9wcmlhdGUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1QYXJ0czsgKytpKQorICAgICAgZ2V0Q29weVRvUGFydHMoREFHLCBkbCwgT3BzW2ldLCAmUGFydHNbaV0sIDEsIFBhcnRWVCk7CisgIH0gZWxzZSBpZiAoTnVtUGFydHMgPiAwKSB7CisgICAgLy8gSWYgdGhlIGludGVybWVkaWF0ZSB0eXBlIHdhcyBleHBhbmRlZCwgc3BsaXQgZWFjaCB0aGUgdmFsdWUgaW50bworICAgIC8vIGxlZ2FsIHBhcnRzLgorICAgIGFzc2VydChOdW1QYXJ0cyAlIE51bUludGVybWVkaWF0ZXMgPT0gMCAmJgorICAgICAgICAgICAiTXVzdCBleHBhbmQgaW50byBhIGRpdmlzaWJsZSBudW1iZXIgb2YgcGFydHMhIik7CisgICAgdW5zaWduZWQgRmFjdG9yID0gTnVtUGFydHMgLyBOdW1JbnRlcm1lZGlhdGVzOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtSW50ZXJtZWRpYXRlczsgKytpKQorICAgICAgZ2V0Q29weVRvUGFydHMoREFHLCBkbCwgT3BzW2ldLCAmUGFydHNbaSpGYWN0b3JdLCBGYWN0b3IsIFBhcnRWVCk7CisgIH0KK30KKworbmFtZXNwYWNlIHsKKyAgLy8vIFJlZ3NGb3JWYWx1ZSAtIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgdGhlIHJlZ2lzdGVycyAocGh5c2ljYWwgb3IgdmlydHVhbCkKKyAgLy8vIHRoYXQgYSBwYXJ0aWN1bGFyIHNldCBvZiB2YWx1ZXMgaXMgYXNzaWduZWQsIGFuZCB0aGUgdHlwZSBpbmZvcm1hdGlvbgorICAvLy8gYWJvdXQgdGhlIHZhbHVlLiBUaGUgbW9zdCBjb21tb24gc2l0dWF0aW9uIGlzIHRvIHJlcHJlc2VudCBvbmUgdmFsdWUgYXQgYQorICAvLy8gdGltZSwgYnV0IHN0cnVjdCBvciBhcnJheSB2YWx1ZXMgYXJlIGhhbmRsZWQgZWxlbWVudC13aXNlIGFzIG11bHRpcGxlCisgIC8vLyB2YWx1ZXMuICBUaGUgc3BsaXR0aW5nIG9mIGFnZ3JlZ2F0ZXMgaXMgcGVyZm9ybWVkIHJlY3Vyc2l2ZWx5LCBzbyB0aGF0IHdlCisgIC8vLyBuZXZlciBoYXZlIGFnZ3JlZ2F0ZS10eXBlZCByZWdpc3RlcnMuIFRoZSB2YWx1ZXMgYXQgdGhpcyBwb2ludCBkbyBub3QKKyAgLy8vIG5lY2Vzc2FyaWx5IGhhdmUgbGVnYWwgdHlwZXMsIHNvIGVhY2ggdmFsdWUgbWF5IHJlcXVpcmUgb25lIG9yIG1vcmUKKyAgLy8vIHJlZ2lzdGVycyBvZiBzb21lIGxlZ2FsIHR5cGUuCisgIC8vLworICBzdHJ1Y3QgUmVnc0ZvclZhbHVlIHsKKyAgICAvLy8gVmFsdWVWVHMgLSBUaGUgdmFsdWUgdHlwZXMgb2YgdGhlIHZhbHVlcywgd2hpY2ggbWF5IG5vdCBiZSBsZWdhbCwgYW5kCisgICAgLy8vIG1heSBuZWVkIGJlIHByb21vdGVkIG9yIHN5bnRoZXNpemVkIGZyb20gb25lIG9yIG1vcmUgcmVnaXN0ZXJzLgorICAgIC8vLworICAgIFNtYWxsVmVjdG9yPEVWVCwgND4gVmFsdWVWVHM7CisKKyAgICAvLy8gUmVnVlRzIC0gVGhlIHZhbHVlIHR5cGVzIG9mIHRoZSByZWdpc3RlcnMuIFRoaXMgaXMgdGhlIHNhbWUgc2l6ZSBhcworICAgIC8vLyBWYWx1ZVZUcyBhbmQgaXQgcmVjb3JkcywgZm9yIGVhY2ggdmFsdWUsIHdoYXQgdGhlIHR5cGUgb2YgdGhlIGFzc2lnbmVkCisgICAgLy8vIHJlZ2lzdGVyIG9yIHJlZ2lzdGVycyBhcmUuIChJbmRpdmlkdWFsIHZhbHVlcyBhcmUgbmV2ZXIgc3ludGhlc2l6ZWQKKyAgICAvLy8gZnJvbSBtb3JlIHRoYW4gb25lIHR5cGUgb2YgcmVnaXN0ZXIuKQorICAgIC8vLworICAgIC8vLyBXaXRoIHZpcnR1YWwgcmVnaXN0ZXJzLCB0aGUgY29udGVudHMgb2YgUmVnVlRzIGlzIHJlZHVuZGFudCB3aXRoIFRMSSdzCisgICAgLy8vIGdldFJlZ2lzdGVyVHlwZSBtZW1iZXIgZnVuY3Rpb24sIGhvd2V2ZXIgd2hlbiB3aXRoIHBoeXNpY2FsIHJlZ2lzdGVycworICAgIC8vLyBpdCBpcyBuZWNlc3NhcnkgdG8gaGF2ZSBhIHNlcGFyYXRlIHJlY29yZCBvZiB0aGUgdHlwZXMuCisgICAgLy8vCisgICAgU21hbGxWZWN0b3I8RVZULCA0PiBSZWdWVHM7CisKKyAgICAvLy8gUmVncyAtIFRoaXMgbGlzdCBob2xkcyB0aGUgcmVnaXN0ZXJzIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMuCisgICAgLy8vIEVhY2ggbGVnYWwgb3IgcHJvbW90ZWQgdmFsdWUgcmVxdWlyZXMgb25lIHJlZ2lzdGVyLCBhbmQgZWFjaAorICAgIC8vLyBleHBhbmRlZCB2YWx1ZSByZXF1aXJlcyBtdWx0aXBsZSByZWdpc3RlcnMuCisgICAgLy8vCisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IFJlZ3M7CisKKyAgICBSZWdzRm9yVmFsdWUoKSB7fQorCisgICAgUmVnc0ZvclZhbHVlKGNvbnN0IFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmcmVncywKKyAgICAgICAgICAgICAgICAgRVZUIHJlZ3Z0LCBFVlQgdmFsdWV2dCkKKyAgICAgIDogVmFsdWVWVHMoMSwgdmFsdWV2dCksIFJlZ1ZUcygxLCByZWd2dCksIFJlZ3MocmVncykge30KKworICAgIFJlZ3NGb3JWYWx1ZShjb25zdCBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gJnJlZ3MsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9yPEVWVCwgND4gJnJlZ3Z0cywKKyAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3I8RVZULCA0PiAmdmFsdWV2dHMpCisgICAgICA6IFZhbHVlVlRzKHZhbHVldnRzKSwgUmVnVlRzKHJlZ3Z0cyksIFJlZ3MocmVncykge30KKworICAgIFJlZ3NGb3JWYWx1ZShMTFZNQ29udGV4dCAmQ29udGV4dCwgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJnRsaSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBjb25zdCBUeXBlICpUeSkgeworICAgICAgQ29tcHV0ZVZhbHVlVlRzKHRsaSwgVHksIFZhbHVlVlRzKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBWYWx1ZSA9IDAsIGUgPSBWYWx1ZVZUcy5zaXplKCk7IFZhbHVlICE9IGU7ICsrVmFsdWUpIHsKKyAgICAgICAgRVZUIFZhbHVlVlQgPSBWYWx1ZVZUc1tWYWx1ZV07CisgICAgICAgIHVuc2lnbmVkIE51bVJlZ3MgPSB0bGkuZ2V0TnVtUmVnaXN0ZXJzKENvbnRleHQsIFZhbHVlVlQpOworICAgICAgICBFVlQgUmVnaXN0ZXJWVCA9IHRsaS5nZXRSZWdpc3RlclR5cGUoQ29udGV4dCwgVmFsdWVWVCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUmVnczsgKytpKQorICAgICAgICAgIFJlZ3MucHVzaF9iYWNrKFJlZyArIGkpOworICAgICAgICBSZWdWVHMucHVzaF9iYWNrKFJlZ2lzdGVyVlQpOworICAgICAgICBSZWcgKz0gTnVtUmVnczsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYXJlVmFsdWVUeXBlc0xlZ2FsIC0gUmV0dXJuIHRydWUgaWYgdHlwZXMgb2YgYWxsIHRoZSB2YWx1ZXMgYXJlIGxlZ2FsLgorICAgIGJvb2wgYXJlVmFsdWVUeXBlc0xlZ2FsKGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgVmFsdWUgPSAwLCBlID0gVmFsdWVWVHMuc2l6ZSgpOyBWYWx1ZSAhPSBlOyArK1ZhbHVlKSB7CisgICAgICAgIEVWVCBSZWdpc3RlclZUID0gUmVnVlRzW1ZhbHVlXTsKKyAgICAgICAgaWYgKCFUTEkuaXNUeXBlTGVnYWwoUmVnaXN0ZXJWVCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8vIGFwcGVuZCAtIEFkZCB0aGUgc3BlY2lmaWVkIHZhbHVlcyB0byB0aGlzIG9uZS4KKyAgICB2b2lkIGFwcGVuZChjb25zdCBSZWdzRm9yVmFsdWUgJlJIUykgeworICAgICAgVmFsdWVWVHMuYXBwZW5kKFJIUy5WYWx1ZVZUcy5iZWdpbigpLCBSSFMuVmFsdWVWVHMuZW5kKCkpOworICAgICAgUmVnVlRzLmFwcGVuZChSSFMuUmVnVlRzLmJlZ2luKCksIFJIUy5SZWdWVHMuZW5kKCkpOworICAgICAgUmVncy5hcHBlbmQoUkhTLlJlZ3MuYmVnaW4oKSwgUkhTLlJlZ3MuZW5kKCkpOworICAgIH0KKworICAgIC8vLyBnZXRDb3B5RnJvbVJlZ3MgLSBFbWl0IGEgc2VyaWVzIG9mIENvcHlGcm9tUmVnIG5vZGVzIHRoYXQgY29waWVzIGZyb20KKyAgICAvLy8gdGhpcyB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgVmFsdWVWVHMgdmFsdWUuICBUaGlzIHVzZXMKKyAgICAvLy8gQ2hhaW4vRmxhZyBhcyB0aGUgaW5wdXQgYW5kIHVwZGF0ZXMgdGhlbSBmb3IgdGhlIG91dHB1dCBDaGFpbi9GbGFnLgorICAgIC8vLyBJZiB0aGUgRmxhZyBwb2ludGVyIGlzIE5VTEwsIG5vIGZsYWcgaXMgdXNlZC4KKyAgICBTRFZhbHVlIGdldENvcHlGcm9tUmVncyhTZWxlY3Rpb25EQUcgJkRBRywgRnVuY3Rpb25Mb3dlcmluZ0luZm8gJkZ1bmNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkNoYWluLCBTRFZhbHVlICpGbGFnKSBjb25zdDsKKworICAgIC8vLyBnZXRDb3B5VG9SZWdzIC0gRW1pdCBhIHNlcmllcyBvZiBDb3B5VG9SZWcgbm9kZXMgdGhhdCBjb3BpZXMgdGhlCisgICAgLy8vIHNwZWNpZmllZCB2YWx1ZSBpbnRvIHRoZSByZWdpc3RlcnMgc3BlY2lmaWVkIGJ5IHRoaXMgb2JqZWN0LiAgVGhpcyB1c2VzCisgICAgLy8vIENoYWluL0ZsYWcgYXMgdGhlIGlucHV0IGFuZCB1cGRhdGVzIHRoZW0gZm9yIHRoZSBvdXRwdXQgQ2hhaW4vRmxhZy4KKyAgICAvLy8gSWYgdGhlIEZsYWcgcG9pbnRlciBpcyBOVUxMLCBubyBmbGFnIGlzIHVzZWQuCisgICAgdm9pZCBnZXRDb3B5VG9SZWdzKFNEVmFsdWUgVmFsLCBTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkNoYWluLCBTRFZhbHVlICpGbGFnKSBjb25zdDsKKworICAgIC8vLyBBZGRJbmxpbmVBc21PcGVyYW5kcyAtIEFkZCB0aGlzIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgaW5saW5lYXNtIG5vZGUKKyAgICAvLy8gb3BlcmFuZCBsaXN0LiAgVGhpcyBhZGRzIHRoZSBjb2RlIG1hcmtlciwgbWF0Y2hpbmcgaW5wdXQgb3BlcmFuZCBpbmRleAorICAgIC8vLyAoaWYgYXBwbGljYWJsZSksIGFuZCBpbmNsdWRlcyB0aGUgbnVtYmVyIG9mIHZhbHVlcyBhZGRlZCBpbnRvIGl0LgorICAgIHZvaWQgQWRkSW5saW5lQXNtT3BlcmFuZHModW5zaWduZWQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTWF0Y2hpbmcsIHVuc2lnbmVkIE1hdGNoaW5nSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3BzKSBjb25zdDsKKyAgfTsKK30KKworLy8vIGdldENvcHlGcm9tUmVncyAtIEVtaXQgYSBzZXJpZXMgb2YgQ29weUZyb21SZWcgbm9kZXMgdGhhdCBjb3BpZXMgZnJvbQorLy8vIHRoaXMgdmFsdWUgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhIFZhbHVlVlQgdmFsdWUuICBUaGlzIHVzZXMKKy8vLyBDaGFpbi9GbGFnIGFzIHRoZSBpbnB1dCBhbmQgdXBkYXRlcyB0aGVtIGZvciB0aGUgb3V0cHV0IENoYWluL0ZsYWcuCisvLy8gSWYgdGhlIEZsYWcgcG9pbnRlciBpcyBOVUxMLCBubyBmbGFnIGlzIHVzZWQuCitTRFZhbHVlIFJlZ3NGb3JWYWx1ZTo6Z2V0Q29weUZyb21SZWdzKFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkxvd2VyaW5nSW5mbyAmRnVuY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZDaGFpbiwgU0RWYWx1ZSAqRmxhZykgY29uc3QgeworICAvLyBBIFZhbHVlIHdpdGggdHlwZSB7fSBvciBbMCB4ICV0XSBuZWVkcyBubyByZWdpc3RlcnMuCisgIGlmIChWYWx1ZVZUcy5lbXB0eSgpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSA9IERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKTsKKworICAvLyBBc3NlbWJsZSB0aGUgbGVnYWwgcGFydHMgaW50byB0aGUgZmluYWwgdmFsdWVzLgorICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBWYWx1ZXMoVmFsdWVWVHMuc2l6ZSgpKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gUGFydHM7CisgIGZvciAodW5zaWduZWQgVmFsdWUgPSAwLCBQYXJ0ID0gMCwgZSA9IFZhbHVlVlRzLnNpemUoKTsgVmFsdWUgIT0gZTsgKytWYWx1ZSkgeworICAgIC8vIENvcHkgdGhlIGxlZ2FsIHBhcnRzIGZyb20gdGhlIHJlZ2lzdGVycy4KKyAgICBFVlQgVmFsdWVWVCA9IFZhbHVlVlRzW1ZhbHVlXTsKKyAgICB1bnNpZ25lZCBOdW1SZWdzID0gVExJLmdldE51bVJlZ2lzdGVycygqREFHLmdldENvbnRleHQoKSwgVmFsdWVWVCk7CisgICAgRVZUIFJlZ2lzdGVyVlQgPSBSZWdWVHNbVmFsdWVdOworCisgICAgUGFydHMucmVzaXplKE51bVJlZ3MpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUmVnczsgKytpKSB7CisgICAgICBTRFZhbHVlIFA7CisgICAgICBpZiAoRmxhZyA9PSAwKSB7CisgICAgICAgIFAgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBSZWdzW1BhcnQraV0sIFJlZ2lzdGVyVlQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFJlZ3NbUGFydCtpXSwgUmVnaXN0ZXJWVCwgKkZsYWcpOworICAgICAgICAqRmxhZyA9IFAuZ2V0VmFsdWUoMik7CisgICAgICB9CisKKyAgICAgIENoYWluID0gUC5nZXRWYWx1ZSgxKTsKKworICAgICAgLy8gSWYgdGhlIHNvdXJjZSByZWdpc3RlciB3YXMgdmlydHVhbCBhbmQgaWYgd2Uga25vdyBzb21ldGhpbmcgYWJvdXQgaXQsCisgICAgICAvLyBhZGQgYW4gYXNzZXJ0IG5vZGUuCisgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWdzW1BhcnQraV0pICYmCisgICAgICAgICAgUmVnaXN0ZXJWVC5pc0ludGVnZXIoKSAmJiAhUmVnaXN0ZXJWVC5pc1ZlY3RvcigpKSB7CisgICAgICAgIHVuc2lnbmVkIFNsb3RObyA9IFJlZ3NbUGFydCtpXS1UYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyOworICAgICAgICBpZiAoRnVuY0luZm8uTGl2ZU91dFJlZ0luZm8uc2l6ZSgpID4gU2xvdE5vKSB7CisgICAgICAgICAgY29uc3QgRnVuY3Rpb25Mb3dlcmluZ0luZm86OkxpdmVPdXRJbmZvICZMT0kgPQorICAgICAgICAgICAgRnVuY0luZm8uTGl2ZU91dFJlZ0luZm9bU2xvdE5vXTsKKworICAgICAgICAgIHVuc2lnbmVkIFJlZ1NpemUgPSBSZWdpc3RlclZULmdldFNpemVJbkJpdHMoKTsKKyAgICAgICAgICB1bnNpZ25lZCBOdW1TaWduQml0cyA9IExPSS5OdW1TaWduQml0czsKKyAgICAgICAgICB1bnNpZ25lZCBOdW1aZXJvQml0cyA9IExPSS5Lbm93blplcm8uY291bnRMZWFkaW5nT25lcygpOworCisgICAgICAgICAgLy8gRklYTUU6IFdlIGNhcHR1cmUgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZSBkYWcgY2FuIHJlcHJlc2VudC4gIEZvcgorICAgICAgICAgIC8vIG5vdywganVzdCB1c2UgdGhlIHRpZ2h0ZXN0IGFzc2VydHpleHQvYXNzZXJ0c2V4dCBwb3NzaWJsZS4KKyAgICAgICAgICBib29sIGlzU0V4dCA9IHRydWU7CisgICAgICAgICAgRVZUIEZyb21WVChNVlQ6Ok90aGVyKTsKKyAgICAgICAgICBpZiAoTnVtU2lnbkJpdHMgPT0gUmVnU2l6ZSkKKyAgICAgICAgICAgIGlzU0V4dCA9IHRydWUsIEZyb21WVCA9IE1WVDo6aTE7ICAgLy8gQVNTRVJUIFNFWFQgMQorICAgICAgICAgIGVsc2UgaWYgKE51bVplcm9CaXRzID49IFJlZ1NpemUtMSkKKyAgICAgICAgICAgIGlzU0V4dCA9IGZhbHNlLCBGcm9tVlQgPSBNVlQ6OmkxOyAgLy8gQVNTRVJUIFpFWFQgMQorICAgICAgICAgIGVsc2UgaWYgKE51bVNpZ25CaXRzID4gUmVnU2l6ZS04KQorICAgICAgICAgICAgaXNTRXh0ID0gdHJ1ZSwgRnJvbVZUID0gTVZUOjppODsgICAvLyBBU1NFUlQgU0VYVCA4CisgICAgICAgICAgZWxzZSBpZiAoTnVtWmVyb0JpdHMgPj0gUmVnU2l6ZS04KQorICAgICAgICAgICAgaXNTRXh0ID0gZmFsc2UsIEZyb21WVCA9IE1WVDo6aTg7ICAvLyBBU1NFUlQgWkVYVCA4CisgICAgICAgICAgZWxzZSBpZiAoTnVtU2lnbkJpdHMgPiBSZWdTaXplLTE2KQorICAgICAgICAgICAgaXNTRXh0ID0gdHJ1ZSwgRnJvbVZUID0gTVZUOjppMTY7ICAvLyBBU1NFUlQgU0VYVCAxNgorICAgICAgICAgIGVsc2UgaWYgKE51bVplcm9CaXRzID49IFJlZ1NpemUtMTYpCisgICAgICAgICAgICBpc1NFeHQgPSBmYWxzZSwgRnJvbVZUID0gTVZUOjppMTY7IC8vIEFTU0VSVCBaRVhUIDE2CisgICAgICAgICAgZWxzZSBpZiAoTnVtU2lnbkJpdHMgPiBSZWdTaXplLTMyKQorICAgICAgICAgICAgaXNTRXh0ID0gdHJ1ZSwgRnJvbVZUID0gTVZUOjppMzI7ICAvLyBBU1NFUlQgU0VYVCAzMgorICAgICAgICAgIGVsc2UgaWYgKE51bVplcm9CaXRzID49IFJlZ1NpemUtMzIpCisgICAgICAgICAgICBpc1NFeHQgPSBmYWxzZSwgRnJvbVZUID0gTVZUOjppMzI7IC8vIEFTU0VSVCBaRVhUIDMyCisKKyAgICAgICAgICBpZiAoRnJvbVZUICE9IE1WVDo6T3RoZXIpCisgICAgICAgICAgICBQID0gREFHLmdldE5vZGUoaXNTRXh0ID8gSVNEOjpBc3NlcnRTZXh0IDogSVNEOjpBc3NlcnRaZXh0LCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlclZULCBQLCBEQUcuZ2V0VmFsdWVUeXBlKEZyb21WVCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFBhcnRzW2ldID0gUDsKKyAgICB9CisKKyAgICBWYWx1ZXNbVmFsdWVdID0gZ2V0Q29weUZyb21QYXJ0cyhEQUcsIGRsLCBQYXJ0cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVJlZ3MsIFJlZ2lzdGVyVlQsIFZhbHVlVlQpOworICAgIFBhcnQgKz0gTnVtUmVnczsKKyAgICBQYXJ0cy5jbGVhcigpOworICB9CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6TUVSR0VfVkFMVUVTLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoJlZhbHVlVlRzWzBdLCBWYWx1ZVZUcy5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgJlZhbHVlc1swXSwgVmFsdWVWVHMuc2l6ZSgpKTsKK30KKworLy8vIGdldENvcHlUb1JlZ3MgLSBFbWl0IGEgc2VyaWVzIG9mIENvcHlUb1JlZyBub2RlcyB0aGF0IGNvcGllcyB0aGUKKy8vLyBzcGVjaWZpZWQgdmFsdWUgaW50byB0aGUgcmVnaXN0ZXJzIHNwZWNpZmllZCBieSB0aGlzIG9iamVjdC4gIFRoaXMgdXNlcworLy8vIENoYWluL0ZsYWcgYXMgdGhlIGlucHV0IGFuZCB1cGRhdGVzIHRoZW0gZm9yIHRoZSBvdXRwdXQgQ2hhaW4vRmxhZy4KKy8vLyBJZiB0aGUgRmxhZyBwb2ludGVyIGlzIE5VTEwsIG5vIGZsYWcgaXMgdXNlZC4KK3ZvaWQgUmVnc0ZvclZhbHVlOjpnZXRDb3B5VG9SZWdzKFNEVmFsdWUgVmFsLCBTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZDaGFpbiwgU0RWYWx1ZSAqRmxhZykgY29uc3QgeworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpOworCisgIC8vIEdldCB0aGUgbGlzdCBvZiB0aGUgdmFsdWVzJ3MgbGVnYWwgcGFydHMuCisgIHVuc2lnbmVkIE51bVJlZ3MgPSBSZWdzLnNpemUoKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gUGFydHMoTnVtUmVncyk7CisgIGZvciAodW5zaWduZWQgVmFsdWUgPSAwLCBQYXJ0ID0gMCwgZSA9IFZhbHVlVlRzLnNpemUoKTsgVmFsdWUgIT0gZTsgKytWYWx1ZSkgeworICAgIEVWVCBWYWx1ZVZUID0gVmFsdWVWVHNbVmFsdWVdOworICAgIHVuc2lnbmVkIE51bVBhcnRzID0gVExJLmdldE51bVJlZ2lzdGVycygqREFHLmdldENvbnRleHQoKSwgVmFsdWVWVCk7CisgICAgRVZUIFJlZ2lzdGVyVlQgPSBSZWdWVHNbVmFsdWVdOworCisgICAgZ2V0Q29weVRvUGFydHMoREFHLCBkbCwKKyAgICAgICAgICAgICAgICAgICBWYWwuZ2V0VmFsdWUoVmFsLmdldFJlc05vKCkgKyBWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgJlBhcnRzW1BhcnRdLCBOdW1QYXJ0cywgUmVnaXN0ZXJWVCk7CisgICAgUGFydCArPSBOdW1QYXJ0czsKKyAgfQorCisgIC8vIENvcHkgdGhlIHBhcnRzIGludG8gdGhlIHJlZ2lzdGVycy4KKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gQ2hhaW5zKE51bVJlZ3MpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVJlZ3M7ICsraSkgeworICAgIFNEVmFsdWUgUGFydDsKKyAgICBpZiAoRmxhZyA9PSAwKSB7CisgICAgICBQYXJ0ID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFJlZ3NbaV0sIFBhcnRzW2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgUGFydCA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBSZWdzW2ldLCBQYXJ0c1tpXSwgKkZsYWcpOworICAgICAgKkZsYWcgPSBQYXJ0LmdldFZhbHVlKDEpOworICAgIH0KKworICAgIENoYWluc1tpXSA9IFBhcnQuZ2V0VmFsdWUoMCk7CisgIH0KKworICBpZiAoTnVtUmVncyA9PSAxIHx8IEZsYWcpCisgICAgLy8gSWYgTnVtUmVncyA+IDEgJiYgRmxhZyBpcyB1c2VkIHRoZW4gdGhlIHVzZSBvZiB0aGUgbGFzdCBDb3B5VG9SZWcgaXMKKyAgICAvLyBmbGFnZ2VkIHRvIGl0LiBUaGF0IGlzIHRoZSBDb3B5VG9SZWcgbm9kZXMgYW5kIHRoZSB1c2VyIGFyZSBjb25zaWRlcmVkCisgICAgLy8gYSBzaW5nbGUgc2NoZWR1bGluZyB1bml0LiBJZiB3ZSBjcmVhdGUgYSBUb2tlbkZhY3RvciBhbmQgcmV0dXJuIGl0IGFzCisgICAgLy8gY2hhaW4sIHRoZW4gdGhlIFRva2VuRmFjdG9yIGlzIGJvdGggYSBwcmVkZWNlc3NvciAob3BlcmFuZCkgb2YgdGhlCisgICAgLy8gdXNlciBhcyB3ZWxsIGFzIGEgc3VjY2Vzc29yICh0aGUgVEYgb3BlcmFuZHMgYXJlIGZsYWdnZWQgdG8gdGhlIHVzZXIpLgorICAgIC8vIGMxLCBmMSA9IENvcHlUb1JlZworICAgIC8vIGMyLCBmMiA9IENvcHlUb1JlZworICAgIC8vIGMzICAgICA9IFRva2VuRmFjdG9yIGMxLCBjMgorICAgIC8vIC4uLgorICAgIC8vICAgICAgICA9IG9wIGMzLCAuLi4sIGYyCisgICAgQ2hhaW4gPSBDaGFpbnNbTnVtUmVncy0xXTsKKyAgZWxzZQorICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsICZDaGFpbnNbMF0sIE51bVJlZ3MpOworfQorCisvLy8gQWRkSW5saW5lQXNtT3BlcmFuZHMgLSBBZGQgdGhpcyB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIGlubGluZWFzbSBub2RlCisvLy8gb3BlcmFuZCBsaXN0LiAgVGhpcyBhZGRzIHRoZSBjb2RlIG1hcmtlciBhbmQgaW5jbHVkZXMgdGhlIG51bWJlciBvZgorLy8vIHZhbHVlcyBhZGRlZCBpbnRvIGl0Lgordm9pZCBSZWdzRm9yVmFsdWU6OkFkZElubGluZUFzbU9wZXJhbmRzKHVuc2lnbmVkIENvZGUsIGJvb2wgSGFzTWF0Y2hpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF0Y2hpbmdJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gJk9wcykgY29uc3QgeworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpOworCisgIHVuc2lnbmVkIEZsYWcgPSBJbmxpbmVBc206OmdldEZsYWdXb3JkKENvZGUsIFJlZ3Muc2l6ZSgpKTsKKyAgaWYgKEhhc01hdGNoaW5nKQorICAgIEZsYWcgPSBJbmxpbmVBc206OmdldEZsYWdXb3JkRm9yTWF0Y2hpbmdPcChGbGFnLCBNYXRjaGluZ0lkeCk7CisgIFNEVmFsdWUgUmVzID0gREFHLmdldFRhcmdldENvbnN0YW50KEZsYWcsIE1WVDo6aTMyKTsKKyAgT3BzLnB1c2hfYmFjayhSZXMpOworCisgIGZvciAodW5zaWduZWQgVmFsdWUgPSAwLCBSZWcgPSAwLCBlID0gVmFsdWVWVHMuc2l6ZSgpOyBWYWx1ZSAhPSBlOyArK1ZhbHVlKSB7CisgICAgdW5zaWduZWQgTnVtUmVncyA9IFRMSS5nZXROdW1SZWdpc3RlcnMoKkRBRy5nZXRDb250ZXh0KCksIFZhbHVlVlRzW1ZhbHVlXSk7CisgICAgRVZUIFJlZ2lzdGVyVlQgPSBSZWdWVHNbVmFsdWVdOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUmVnczsgKytpKSB7CisgICAgICBhc3NlcnQoUmVnIDwgUmVncy5zaXplKCkgJiYgIk1pc21hdGNoIGluICMgcmVnaXN0ZXJzIGV4cGVjdGVkIik7CisgICAgICBPcHMucHVzaF9iYWNrKERBRy5nZXRSZWdpc3RlcihSZWdzW1JlZysrXSwgUmVnaXN0ZXJWVCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OmluaXQoQWxpYXNBbmFseXNpcyAmYWEpIHsKKyAgQUEgPSAmYWE7CisgIFREID0gREFHLmdldFRhcmdldCgpLmdldFRhcmdldERhdGEoKTsKK30KKworLy8vIGNsZWFyIC0gQ2xlYXIgb3V0IHRoZSBjdXJyZW50IFNlbGVjdGlvbkRBRyBhbmQgdGhlIGFzc29jaWF0ZWQKKy8vLyBzdGF0ZSBhbmQgcHJlcGFyZSB0aGlzIFNlbGVjdGlvbkRBR0J1aWxkZXIgb2JqZWN0IHRvIGJlIHVzZWQKKy8vLyBmb3IgYSBuZXcgYmxvY2suIFRoaXMgZG9lc24ndCBjbGVhciBvdXQgaW5mb3JtYXRpb24gYWJvdXQKKy8vLyBhZGRpdGlvbmFsIGJsb2NrcyB0aGF0IGFyZSBuZWVkZWQgdG8gY29tcGxldGUgc3dpdGNoIGxvd2VyaW5nCisvLy8gb3IgUEhJIG5vZGUgdXBkYXRpbmc7IHRoYXQgaW5mb3JtYXRpb24gaXMgY2xlYXJlZCBvdXQgYXMgaXQgaXMKKy8vLyBjb25zdW1lZC4KK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6Y2xlYXIoKSB7CisgIE5vZGVNYXAuY2xlYXIoKTsKKyAgVW51c2VkQXJnTm9kZU1hcC5jbGVhcigpOworICBQZW5kaW5nTG9hZHMuY2xlYXIoKTsKKyAgUGVuZGluZ0V4cG9ydHMuY2xlYXIoKTsKKyAgQ3VyRGVidWdMb2MgPSBEZWJ1Z0xvYygpOworICBIYXNUYWlsQ2FsbCA9IGZhbHNlOworfQorCisvLy8gZ2V0Um9vdCAtIFJldHVybiB0aGUgY3VycmVudCB2aXJ0dWFsIHJvb3Qgb2YgdGhlIFNlbGVjdGlvbiBEQUcsCisvLy8gZmx1c2hpbmcgYW55IFBlbmRpbmdMb2FkIGl0ZW1zLiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgZW1pdHRpbmcKKy8vLyBhIHN0b3JlIG9yIGFueSBvdGhlciBub2RlIHRoYXQgbWF5IG5lZWQgdG8gYmUgb3JkZXJlZCBhZnRlciBhbnkKKy8vLyBwcmlvciBsb2FkIGluc3RydWN0aW9ucy4KKy8vLworU0RWYWx1ZSBTZWxlY3Rpb25EQUdCdWlsZGVyOjpnZXRSb290KCkgeworICBpZiAoUGVuZGluZ0xvYWRzLmVtcHR5KCkpCisgICAgcmV0dXJuIERBRy5nZXRSb290KCk7CisKKyAgaWYgKFBlbmRpbmdMb2Fkcy5zaXplKCkgPT0gMSkgeworICAgIFNEVmFsdWUgUm9vdCA9IFBlbmRpbmdMb2Fkc1swXTsKKyAgICBEQUcuc2V0Um9vdChSb290KTsKKyAgICBQZW5kaW5nTG9hZHMuY2xlYXIoKTsKKyAgICByZXR1cm4gUm9vdDsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBtYWtlIGEgdG9rZW4gZmFjdG9yIG5vZGUuCisgIFNEVmFsdWUgUm9vdCA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGdldEN1ckRlYnVnTG9jKCksIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBlbmRpbmdMb2Fkc1swXSwgUGVuZGluZ0xvYWRzLnNpemUoKSk7CisgIFBlbmRpbmdMb2Fkcy5jbGVhcigpOworICBEQUcuc2V0Um9vdChSb290KTsKKyAgcmV0dXJuIFJvb3Q7Cit9CisKKy8vLyBnZXRDb250cm9sUm9vdCAtIFNpbWlsYXIgdG8gZ2V0Um9vdCwgYnV0IGluc3RlYWQgb2YgZmx1c2hpbmcgYWxsIHRoZQorLy8vIFBlbmRpbmdMb2FkIGl0ZW1zLCBmbHVzaCBhbGwgdGhlIFBlbmRpbmdFeHBvcnRzIGl0ZW1zLiBJdCBpcyBuZWNlc3NhcnkKKy8vLyB0byBkbyB0aGlzIGJlZm9yZSBlbWl0dGluZyBhIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24uCisvLy8KK1NEVmFsdWUgU2VsZWN0aW9uREFHQnVpbGRlcjo6Z2V0Q29udHJvbFJvb3QoKSB7CisgIFNEVmFsdWUgUm9vdCA9IERBRy5nZXRSb290KCk7CisKKyAgaWYgKFBlbmRpbmdFeHBvcnRzLmVtcHR5KCkpCisgICAgcmV0dXJuIFJvb3Q7CisKKyAgLy8gVHVybiBhbGwgb2YgdGhlIENvcHlUb1JlZyBjaGFpbnMgaW50byBvbmUgZmFjdG9yZWQgbm9kZS4KKyAgaWYgKFJvb3QuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpFbnRyeVRva2VuKSB7CisgICAgdW5zaWduZWQgaSA9IDAsIGUgPSBQZW5kaW5nRXhwb3J0cy5zaXplKCk7CisgICAgZm9yICg7IGkgIT0gZTsgKytpKSB7CisgICAgICBhc3NlcnQoUGVuZGluZ0V4cG9ydHNbaV0uZ2V0Tm9kZSgpLT5nZXROdW1PcGVyYW5kcygpID4gMSk7CisgICAgICBpZiAoUGVuZGluZ0V4cG9ydHNbaV0uZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApID09IFJvb3QpCisgICAgICAgIGJyZWFrOyAgLy8gRG9uJ3QgYWRkIHRoZSByb290IGlmIHdlIGFscmVhZHkgaW5kaXJlY3RseSBkZXBlbmQgb24gaXQuCisgICAgfQorCisgICAgaWYgKGkgPT0gZSkKKyAgICAgIFBlbmRpbmdFeHBvcnRzLnB1c2hfYmFjayhSb290KTsKKyAgfQorCisgIFJvb3QgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBnZXRDdXJEZWJ1Z0xvYygpLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgJlBlbmRpbmdFeHBvcnRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0V4cG9ydHMuc2l6ZSgpKTsKKyAgUGVuZGluZ0V4cG9ydHMuY2xlYXIoKTsKKyAgREFHLnNldFJvb3QoUm9vdCk7CisgIHJldHVybiBSb290OworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OkFzc2lnbk9yZGVyaW5nVG9Ob2RlKGNvbnN0IFNETm9kZSAqTm9kZSkgeworICBpZiAoREFHLkdldE9yZGVyaW5nKE5vZGUpICE9IDApIHJldHVybjsgLy8gQWxyZWFkeSBoYXMgb3JkZXJpbmcuCisgIERBRy5Bc3NpZ25PcmRlcmluZyhOb2RlLCBTRE5vZGVPcmRlcik7CisKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IE5vZGUtPmdldE51bU9wZXJhbmRzKCk7IEkgIT0gRTsgKytJKQorICAgIEFzc2lnbk9yZGVyaW5nVG9Ob2RlKE5vZGUtPmdldE9wZXJhbmQoSSkuZ2V0Tm9kZSgpKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdChjb25zdCBJbnN0cnVjdGlvbiAmSSkgeworICAvLyBTZXQgdXAgb3V0Z29pbmcgUEhJIG5vZGUgcmVnaXN0ZXIgdmFsdWVzIGJlZm9yZSBlbWl0dGluZyB0aGUgdGVybWluYXRvci4KKyAgaWYgKGlzYTxUZXJtaW5hdG9ySW5zdD4oJkkpKQorICAgIEhhbmRsZVBISU5vZGVzSW5TdWNjZXNzb3JCbG9ja3MoSS5nZXRQYXJlbnQoKSk7CisKKyAgQ3VyRGVidWdMb2MgPSBJLmdldERlYnVnTG9jKCk7CisKKyAgdmlzaXQoSS5nZXRPcGNvZGUoKSwgSSk7CisKKyAgaWYgKCFpc2E8VGVybWluYXRvckluc3Q+KCZJKSAmJiAhSGFzVGFpbENhbGwpCisgICAgQ29weVRvRXhwb3J0UmVnc0lmTmVlZGVkKCZJKTsKKworICBDdXJEZWJ1Z0xvYyA9IERlYnVnTG9jKCk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRQSEkoY29uc3QgUEhJTm9kZSAmKSB7CisgIGxsdm1fdW5yZWFjaGFibGUoIlNlbGVjdGlvbkRBR0J1aWxkZXIgc2hvdWxkbid0IHZpc2l0IFBISSBub2RlcyEiKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdCh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFVzZXIgJkkpIHsKKyAgLy8gTm90ZTogdGhpcyBkb2Vzbid0IHVzZSBJbnN0VmlzaXRvciwgYmVjYXVzZSBpdCBoYXMgdG8gd29yayB3aXRoCisgIC8vIENvbnN0YW50RXhwcidzIGluIGFkZGl0aW9uIHRvIGluc3RydWN0aW9ucy4KKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBpbnN0cnVjdGlvbiB0eXBlIGVuY291bnRlcmVkISIpOworICAgIC8vIEJ1aWxkIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHVzaW5nIHRoZSBJbnN0cnVjdGlvbi5kZWYgZmlsZS4KKyNkZWZpbmUgSEFORExFX0lOU1QoTlVNLCBPUENPREUsIENMQVNTKSBcCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6T1BDT0RFOiB2aXNpdCMjT1BDT0RFKChDTEFTUyYpSSk7IGJyZWFrOworI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb24uZGVmIgorICB9CisKKyAgLy8gQXNzaWduIHRoZSBvcmRlcmluZyB0byB0aGUgZnJlc2hseSBjcmVhdGVkIERBRyBub2Rlcy4KKyAgaWYgKE5vZGVNYXAuY291bnQoJkkpKSB7CisgICAgKytTRE5vZGVPcmRlcjsKKyAgICBBc3NpZ25PcmRlcmluZ1RvTm9kZShnZXRWYWx1ZSgmSSkuZ2V0Tm9kZSgpKTsKKyAgfQorfQorCisvLyBnZXRWYWx1ZSAtIFJldHVybiBhbiBTRFZhbHVlIGZvciB0aGUgZ2l2ZW4gVmFsdWUuCitTRFZhbHVlIFNlbGVjdGlvbkRBR0J1aWxkZXI6OmdldFZhbHVlKGNvbnN0IFZhbHVlICpWKSB7CisgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBTRFZhbHVlIGZvciB0aGlzIHZhbHVlLCB1c2UgaXQuIEl0J3MgaW1wb3J0YW50CisgIC8vIHRvIGRvIHRoaXMgZmlyc3QsIHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEgQ29weUZyb21SZWcgaWYgd2UgYWxyZWFkeQorICAvLyBoYXZlIGEgcmVndWxhciBTRFZhbHVlLgorICBTRFZhbHVlICZOID0gTm9kZU1hcFtWXTsKKyAgaWYgKE4uZ2V0Tm9kZSgpKSByZXR1cm4gTjsKKworICAvLyBJZiB0aGVyZSdzIGEgdmlydHVhbCByZWdpc3RlciBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGZvciB0aGlzCisgIC8vIHZhbHVlLCB1c2UgaXQuCisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIHVuc2lnbmVkPjo6aXRlcmF0b3IgSXQgPSBGdW5jSW5mby5WYWx1ZU1hcC5maW5kKFYpOworICBpZiAoSXQgIT0gRnVuY0luZm8uVmFsdWVNYXAuZW5kKCkpIHsKKyAgICB1bnNpZ25lZCBJblJlZyA9IEl0LT5zZWNvbmQ7CisgICAgUmVnc0ZvclZhbHVlIFJGVigqREFHLmdldENvbnRleHQoKSwgVExJLCBJblJlZywgVi0+Z2V0VHlwZSgpKTsKKyAgICBTRFZhbHVlIENoYWluID0gREFHLmdldEVudHJ5Tm9kZSgpOworICAgIHJldHVybiBOID0gUkZWLmdldENvcHlGcm9tUmVncyhEQUcsIEZ1bmNJbmZvLCBnZXRDdXJEZWJ1Z0xvYygpLCBDaGFpbixOVUxMKTsKKyAgfQorCisgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgU0RWYWx1ZSBhbmQgcmVtZW1iZXIgaXQuCisgIFNEVmFsdWUgVmFsID0gZ2V0VmFsdWVJbXBsKFYpOworICBOb2RlTWFwW1ZdID0gVmFsOworCisgIHJldHVybiBWYWw7Cit9CisKKy8vLyBnZXROb25SZWdpc3RlclZhbHVlIC0gUmV0dXJuIGFuIFNEVmFsdWUgZm9yIHRoZSBnaXZlbiBWYWx1ZSwgYnV0CisvLy8gZG9uJ3QgbG9vayBpbiBGdW5jSW5mby5WYWx1ZU1hcCBmb3IgYSB2aXJ0dWFsIHJlZ2lzdGVyLgorU0RWYWx1ZSBTZWxlY3Rpb25EQUdCdWlsZGVyOjpnZXROb25SZWdpc3RlclZhbHVlKGNvbnN0IFZhbHVlICpWKSB7CisgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBTRFZhbHVlIGZvciB0aGlzIHZhbHVlLCB1c2UgaXQuCisgIFNEVmFsdWUgJk4gPSBOb2RlTWFwW1ZdOworICBpZiAoTi5nZXROb2RlKCkpIHJldHVybiBOOworCisgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgU0RWYWx1ZSBhbmQgcmVtZW1iZXIgaXQuCisgIFNEVmFsdWUgVmFsID0gZ2V0VmFsdWVJbXBsKFYpOworICBOb2RlTWFwW1ZdID0gVmFsOworCisgIHJldHVybiBWYWw7Cit9CisKKy8vLyBnZXRWYWx1ZUltcGwgLSBIZWxwZXIgZnVuY3Rpb24gZm9yIGdldFZhbHVlIGFuZCBnZXROb25SZWdpc3RlclZhbHVlLgorLy8vIENyZWF0ZSBhbiBTRFZhbHVlIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCitTRFZhbHVlIFNlbGVjdGlvbkRBR0J1aWxkZXI6OmdldFZhbHVlSW1wbChjb25zdCBWYWx1ZSAqVikgeworICBpZiAoY29uc3QgQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpIHsKKyAgICBFVlQgVlQgPSBUTEkuZ2V0VmFsdWVUeXBlKFYtPmdldFR5cGUoKSwgdHJ1ZSk7CisKKyAgICBpZiAoY29uc3QgQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEMpKQorICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudCgqQ0ksIFZUKTsKKworICAgIGlmIChjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oQykpCisgICAgICByZXR1cm4gREFHLmdldEdsb2JhbEFkZHJlc3MoR1YsIGdldEN1ckRlYnVnTG9jKCksIFZUKTsKKworICAgIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oQykpCisgICAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFRMSS5nZXRQb2ludGVyVHkoKSk7CisKKyAgICBpZiAoY29uc3QgQ29uc3RhbnRGUCAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oQykpCisgICAgICByZXR1cm4gREFHLmdldENvbnN0YW50RlAoKkNGUCwgVlQpOworCisgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihDKSAmJiAhVi0+Z2V0VHlwZSgpLT5pc0FnZ3JlZ2F0ZVR5cGUoKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0VU5ERUYoVlQpOworCisgICAgaWYgKGNvbnN0IENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KEMpKSB7CisgICAgICB2aXNpdChDRS0+Z2V0T3Bjb2RlKCksICpDRSk7CisgICAgICBTRFZhbHVlIE4xID0gTm9kZU1hcFtWXTsKKyAgICAgIGFzc2VydChOMS5nZXROb2RlKCkgJiYgInZpc2l0IGRpZG4ndCBwb3B1bGF0ZSB0aGUgTm9kZU1hcCEiKTsKKyAgICAgIHJldHVybiBOMTsKKyAgICB9CisKKyAgICBpZiAoaXNhPENvbnN0YW50U3RydWN0PihDKSB8fCBpc2E8Q29uc3RhbnRBcnJheT4oQykpIHsKKyAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDQ+IENvbnN0YW50czsKKyAgICAgIGZvciAoVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3IgT0kgPSBDLT5vcF9iZWdpbigpLCBPRSA9IEMtPm9wX2VuZCgpOworICAgICAgICAgICBPSSAhPSBPRTsgKytPSSkgeworICAgICAgICBTRE5vZGUgKlZhbCA9IGdldFZhbHVlKCpPSSkuZ2V0Tm9kZSgpOworICAgICAgICAvLyBJZiB0aGUgb3BlcmFuZCBpcyBhbiBlbXB0eSBhZ2dyZWdhdGUsIHRoZXJlIGFyZSBubyB2YWx1ZXMuCisgICAgICAgIGlmICghVmFsKSBjb250aW51ZTsKKyAgICAgICAgLy8gQWRkIGVhY2ggbGVhZiB2YWx1ZSBmcm9tIHRoZSBvcGVyYW5kIHRvIHRoZSBDb25zdGFudHMgbGlzdAorICAgICAgICAvLyB0byBmb3JtIGEgZmxhdHRlbmVkIGxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMuCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYWwtPmdldE51bVZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBDb25zdGFudHMucHVzaF9iYWNrKFNEVmFsdWUoVmFsLCBpKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMoJkNvbnN0YW50c1swXSwgQ29uc3RhbnRzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VyRGVidWdMb2MoKSk7CisgICAgfQorCisgICAgaWYgKEMtPmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpIHx8IEMtPmdldFR5cGUoKS0+aXNBcnJheVR5KCkpIHsKKyAgICAgIGFzc2VydCgoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oQykgfHwgaXNhPFVuZGVmVmFsdWU+KEMpKSAmJgorICAgICAgICAgICAgICJVbmtub3duIHN0cnVjdCBvciBhcnJheSBjb25zdGFudCEiKTsKKworICAgICAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWx1ZVZUczsKKyAgICAgIENvbXB1dGVWYWx1ZVZUcyhUTEksIEMtPmdldFR5cGUoKSwgVmFsdWVWVHMpOworICAgICAgdW5zaWduZWQgTnVtRWx0cyA9IFZhbHVlVlRzLnNpemUoKTsKKyAgICAgIGlmIChOdW1FbHRzID09IDApCisgICAgICAgIHJldHVybiBTRFZhbHVlKCk7IC8vIGVtcHR5IHN0cnVjdAorICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gQ29uc3RhbnRzKE51bUVsdHMpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbHRzOyArK2kpIHsKKyAgICAgICAgRVZUIEVsdFZUID0gVmFsdWVWVHNbaV07CisgICAgICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oQykpCisgICAgICAgICAgQ29uc3RhbnRzW2ldID0gREFHLmdldFVOREVGKEVsdFZUKTsKKyAgICAgICAgZWxzZSBpZiAoRWx0VlQuaXNGbG9hdGluZ1BvaW50KCkpCisgICAgICAgICAgQ29uc3RhbnRzW2ldID0gREFHLmdldENvbnN0YW50RlAoMCwgRWx0VlQpOworICAgICAgICBlbHNlCisgICAgICAgICAgQ29uc3RhbnRzW2ldID0gREFHLmdldENvbnN0YW50KDAsIEVsdFZUKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcygmQ29uc3RhbnRzWzBdLCBOdW1FbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJEZWJ1Z0xvYygpKTsKKyAgICB9CisKKyAgICBpZiAoY29uc3QgQmxvY2tBZGRyZXNzICpCQSA9IGR5bl9jYXN0PEJsb2NrQWRkcmVzcz4oQykpCisgICAgICByZXR1cm4gREFHLmdldEJsb2NrQWRkcmVzcyhCQSwgVlQpOworCisgICAgY29uc3QgVmVjdG9yVHlwZSAqVmVjVHkgPSBjYXN0PFZlY3RvclR5cGU+KFYtPmdldFR5cGUoKSk7CisgICAgdW5zaWduZWQgTnVtRWxlbWVudHMgPSBWZWNUeS0+Z2V0TnVtRWxlbWVudHMoKTsKKworICAgIC8vIE5vdyB0aGF0IHdlIGtub3cgdGhlIG51bWJlciBhbmQgdHlwZSBvZiB0aGUgZWxlbWVudHMsIGdldCB0aGF0IG51bWJlciBvZgorICAgIC8vIGVsZW1lbnRzIGludG8gdGhlIE9wcyBhcnJheSBiYXNlZCBvbiB3aGF0IGtpbmQgb2YgY29uc3RhbnQgaXQgaXMuCisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+IE9wczsKKyAgICBpZiAoY29uc3QgQ29uc3RhbnRWZWN0b3IgKkNQID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KEMpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUVsZW1lbnRzOyArK2kpCisgICAgICAgIE9wcy5wdXNoX2JhY2soZ2V0VmFsdWUoQ1AtPmdldE9wZXJhbmQoaSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEMpICYmICJVbmtub3duIHZlY3RvciBjb25zdGFudCEiKTsKKyAgICAgIEVWVCBFbHRWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoVmVjVHktPmdldEVsZW1lbnRUeXBlKCkpOworCisgICAgICBTRFZhbHVlIE9wOworICAgICAgaWYgKEVsdFZULmlzRmxvYXRpbmdQb2ludCgpKQorICAgICAgICBPcCA9IERBRy5nZXRDb25zdGFudEZQKDAsIEVsdFZUKTsKKyAgICAgIGVsc2UKKyAgICAgICAgT3AgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgRWx0VlQpOworICAgICAgT3BzLmFzc2lnbihOdW1FbGVtZW50cywgT3ApOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIEJVSUxEX1ZFQ1RPUiBub2RlLgorICAgIHJldHVybiBOb2RlTWFwW1ZdID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVCwgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgIH0KKworICAvLyBJZiB0aGlzIGlzIGEgc3RhdGljIGFsbG9jYSwgZ2VuZXJhdGUgaXQgYXMgdGhlIGZyYW1laW5kZXggaW5zdGVhZCBvZgorICAvLyBjb21wdXRhdGlvbi4KKyAgaWYgKGNvbnN0IEFsbG9jYUluc3QgKkFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oVikpIHsKKyAgICBEZW5zZU1hcDxjb25zdCBBbGxvY2FJbnN0KiwgaW50Pjo6aXRlcmF0b3IgU0kgPQorICAgICAgRnVuY0luZm8uU3RhdGljQWxsb2NhTWFwLmZpbmQoQUkpOworICAgIGlmIChTSSAhPSBGdW5jSW5mby5TdGF0aWNBbGxvY2FNYXAuZW5kKCkpCisgICAgICByZXR1cm4gREFHLmdldEZyYW1lSW5kZXgoU0ktPnNlY29uZCwgVExJLmdldFBvaW50ZXJUeSgpKTsKKyAgfQorCisgIC8vIElmIHRoaXMgaXMgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZmFzdC1pc2VsIGhhcyBkZWZlcnJlZCwgc2VsZWN0IGl0IG5vdy4KKyAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpJbnN0ID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKSB7CisgICAgdW5zaWduZWQgSW5SZWcgPSBGdW5jSW5mby5Jbml0aWFsaXplUmVnRm9yVmFsdWUoSW5zdCk7CisgICAgUmVnc0ZvclZhbHVlIFJGVigqREFHLmdldENvbnRleHQoKSwgVExJLCBJblJlZywgSW5zdC0+Z2V0VHlwZSgpKTsKKyAgICBTRFZhbHVlIENoYWluID0gREFHLmdldEVudHJ5Tm9kZSgpOworICAgIHJldHVybiBSRlYuZ2V0Q29weUZyb21SZWdzKERBRywgRnVuY0luZm8sIGdldEN1ckRlYnVnTG9jKCksIENoYWluLCBOVUxMKTsKKyAgfQorCisgIGxsdm1fdW5yZWFjaGFibGUoIkNhbid0IGdldCByZWdpc3RlciBmb3IgdmFsdWUhIik7CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRSZXQoY29uc3QgUmV0dXJuSW5zdCAmSSkgeworICBTRFZhbHVlIENoYWluID0gZ2V0Q29udHJvbFJvb3QoKTsKKyAgU21hbGxWZWN0b3I8SVNEOjpPdXRwdXRBcmcsIDg+IE91dHM7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE91dFZhbHM7CisKKyAgaWYgKCFGdW5jSW5mby5DYW5Mb3dlclJldHVybikgeworICAgIHVuc2lnbmVkIERlbW90ZVJlZyA9IEZ1bmNJbmZvLkRlbW90ZVJlZ2lzdGVyOworICAgIGNvbnN0IEZ1bmN0aW9uICpGID0gSS5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisKKyAgICAvLyBFbWl0IGEgc3RvcmUgb2YgdGhlIHJldHVybiB2YWx1ZSB0aHJvdWdoIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIC8vIExlYXZlIE91dHMgZW1wdHkgc28gdGhhdCBMb3dlclJldHVybiB3b24ndCB0cnkgdG8gbG9hZCByZXR1cm4KKyAgICAvLyByZWdpc3RlcnMgdGhlIHVzdWFsIHdheS4KKyAgICBTbWFsbFZlY3RvcjxFVlQsIDE+IFB0clZhbHVlVlRzOworICAgIENvbXB1dGVWYWx1ZVZUcyhUTEksIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoRi0+Z2V0UmV0dXJuVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgUHRyVmFsdWVWVHMpOworCisgICAgU0RWYWx1ZSBSZXRQdHIgPSBEQUcuZ2V0UmVnaXN0ZXIoRGVtb3RlUmVnLCBQdHJWYWx1ZVZUc1swXSk7CisgICAgU0RWYWx1ZSBSZXRPcCA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSk7CisKKyAgICBTbWFsbFZlY3RvcjxFVlQsIDQ+IFZhbHVlVlRzOworICAgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA0PiBPZmZzZXRzOworICAgIENvbXB1dGVWYWx1ZVZUcyhUTEksIEkuZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLCBWYWx1ZVZUcywgJk9mZnNldHMpOworICAgIHVuc2lnbmVkIE51bVZhbHVlcyA9IFZhbHVlVlRzLnNpemUoKTsKKworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDQ+IENoYWlucyhOdW1WYWx1ZXMpOworICAgIEVWVCBQdHJWVCA9IFB0clZhbHVlVlRzWzBdOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtVmFsdWVzOyArK2kpIHsKKyAgICAgIFNEVmFsdWUgQWRkID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGdldEN1ckRlYnVnTG9jKCksIFB0clZULCBSZXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChPZmZzZXRzW2ldLCBQdHJWVCkpOworICAgICAgQ2hhaW5zW2ldID0KKyAgICAgICAgREFHLmdldFN0b3JlKENoYWluLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShSZXRPcC5nZXROb2RlKCksIFJldE9wLmdldFJlc05vKCkgKyBpKSwKKyAgICAgICAgICAgICAgICAgICAgIEFkZCwgTlVMTCwgT2Zmc2V0c1tpXSwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICB9CisKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCAmQ2hhaW5zWzBdLCBOdW1WYWx1ZXMpOworICB9IGVsc2UgaWYgKEkuZ2V0TnVtT3BlcmFuZHMoKSAhPSAwKSB7CisgICAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWx1ZVZUczsKKyAgICBDb21wdXRlVmFsdWVWVHMoVExJLCBJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSwgVmFsdWVWVHMpOworICAgIHVuc2lnbmVkIE51bVZhbHVlcyA9IFZhbHVlVlRzLnNpemUoKTsKKyAgICBpZiAoTnVtVmFsdWVzKSB7CisgICAgICBTRFZhbHVlIFJldE9wID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDApKTsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGYgPSBOdW1WYWx1ZXM7IGogIT0gZjsgKytqKSB7CisgICAgICAgIEVWVCBWVCA9IFZhbHVlVlRzW2pdOworCisgICAgICAgIElTRDo6Tm9kZVR5cGUgRXh0ZW5kS2luZCA9IElTRDo6QU5ZX0VYVEVORDsKKworICAgICAgICBjb25zdCBGdW5jdGlvbiAqRiA9IEkuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICAgICAgICBpZiAoRi0+cGFyYW1IYXNBdHRyKDAsIEF0dHJpYnV0ZTo6U0V4dCkpCisgICAgICAgICAgRXh0ZW5kS2luZCA9IElTRDo6U0lHTl9FWFRFTkQ7CisgICAgICAgIGVsc2UgaWYgKEYtPnBhcmFtSGFzQXR0cigwLCBBdHRyaWJ1dGU6OlpFeHQpKQorICAgICAgICAgIEV4dGVuZEtpbmQgPSBJU0Q6OlpFUk9fRVhURU5EOworCisgICAgICAgIC8vIEZJWE1FOiBDIGNhbGxpbmcgY29udmVudGlvbiByZXF1aXJlcyB0aGUgcmV0dXJuIHR5cGUgdG8gYmUgcHJvbW90ZWQKKyAgICAgICAgLy8gdG8gYXQgbGVhc3QgMzItYml0LiBCdXQgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGZvciBub24tQyBjYWxsaW5nCisgICAgICAgIC8vIGNvbnZlbnRpb25zLiBUaGUgZnJvbnRlbmQgc2hvdWxkIG1hcmsgZnVuY3Rpb25zIHdob3NlIHJldHVybiB2YWx1ZXMKKyAgICAgICAgLy8gcmVxdWlyZSBwcm9tb3Rpbmcgd2l0aCBzaWduZXh0IG9yIHplcm9leHQgYXR0cmlidXRlcy4KKyAgICAgICAgaWYgKEV4dGVuZEtpbmQgIT0gSVNEOjpBTllfRVhURU5EICYmIFZULmlzSW50ZWdlcigpKSB7CisgICAgICAgICAgRVZUIE1pblZUID0gVExJLmdldFJlZ2lzdGVyVHlwZSgqREFHLmdldENvbnRleHQoKSwgTVZUOjppMzIpOworICAgICAgICAgIGlmIChWVC5iaXRzTFQoTWluVlQpKQorICAgICAgICAgICAgVlQgPSBNaW5WVDsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIE51bVBhcnRzID0gVExJLmdldE51bVJlZ2lzdGVycygqREFHLmdldENvbnRleHQoKSwgVlQpOworICAgICAgICBFVlQgUGFydFZUID0gVExJLmdldFJlZ2lzdGVyVHlwZSgqREFHLmdldENvbnRleHQoKSwgVlQpOworICAgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBQYXJ0cyhOdW1QYXJ0cyk7CisgICAgICAgIGdldENvcHlUb1BhcnRzKERBRywgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShSZXRPcC5nZXROb2RlKCksIFJldE9wLmdldFJlc05vKCkgKyBqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgJlBhcnRzWzBdLCBOdW1QYXJ0cywgUGFydFZULCBFeHRlbmRLaW5kKTsKKworICAgICAgICAvLyAnaW5yZWcnIG9uIGZ1bmN0aW9uIHJlZmVycyB0byByZXR1cm4gdmFsdWUKKyAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzID0gSVNEOjpBcmdGbGFnc1R5KCk7CisgICAgICAgIGlmIChGLT5wYXJhbUhhc0F0dHIoMCwgQXR0cmlidXRlOjpJblJlZykpCisgICAgICAgICAgRmxhZ3Muc2V0SW5SZWcoKTsKKworICAgICAgICAvLyBQcm9wYWdhdGUgZXh0ZW5zaW9uIHR5cGUgaWYgYW55CisgICAgICAgIGlmIChGLT5wYXJhbUhhc0F0dHIoMCwgQXR0cmlidXRlOjpTRXh0KSkKKyAgICAgICAgICBGbGFncy5zZXRTRXh0KCk7CisgICAgICAgIGVsc2UgaWYgKEYtPnBhcmFtSGFzQXR0cigwLCBBdHRyaWJ1dGU6OlpFeHQpKQorICAgICAgICAgIEZsYWdzLnNldFpFeHQoKTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtUGFydHM7ICsraSkgeworICAgICAgICAgIE91dHMucHVzaF9iYWNrKElTRDo6T3V0cHV0QXJnKEZsYWdzLCBQYXJ0c1tpXS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzZml4ZWQ9Ki90cnVlKSk7CisgICAgICAgICAgT3V0VmFscy5wdXNoX2JhY2soUGFydHNbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgYm9vbCBpc1ZhckFyZyA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRGdW5jdGlvbigpLT5pc1ZhckFyZygpOworICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYgPQorICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRGdW5jdGlvbigpLT5nZXRDYWxsaW5nQ29udigpOworICBDaGFpbiA9IFRMSS5Mb3dlclJldHVybihDaGFpbiwgQ2FsbENvbnYsIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRzLCBPdXRWYWxzLCBnZXRDdXJEZWJ1Z0xvYygpLCBEQUcpOworCisgIC8vIFZlcmlmeSB0aGF0IHRoZSB0YXJnZXQncyBMb3dlclJldHVybiBiZWhhdmVkIGFzIGV4cGVjdGVkLgorICBhc3NlcnQoQ2hhaW4uZ2V0Tm9kZSgpICYmIENoYWluLmdldFZhbHVlVHlwZSgpID09IE1WVDo6T3RoZXIgJiYKKyAgICAgICAgICJMb3dlclJldHVybiBkaWRuJ3QgcmV0dXJuIGEgdmFsaWQgY2hhaW4hIik7CisKKyAgLy8gVXBkYXRlIHRoZSBEQUcgd2l0aCB0aGUgbmV3IGNoYWluIHZhbHVlIHJlc3VsdGluZyBmcm9tIHJldHVybiBsb3dlcmluZy4KKyAgREFHLnNldFJvb3QoQ2hhaW4pOworfQorCisvLy8gQ29weVRvRXhwb3J0UmVnc0lmTmVlZGVkIC0gSWYgdGhlIGdpdmVuIHZhbHVlIGhhcyB2aXJ0dWFsIHJlZ2lzdGVycworLy8vIGNyZWF0ZWQgZm9yIGl0LCBlbWl0IG5vZGVzIHRvIGNvcHkgdGhlIHZhbHVlIGludG8gdGhlIHZpcnR1YWwKKy8vLyByZWdpc3RlcnMuCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OkNvcHlUb0V4cG9ydFJlZ3NJZk5lZWRlZChjb25zdCBWYWx1ZSAqVikgeworICBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCB1bnNpZ25lZD46Oml0ZXJhdG9yIFZNSSA9IEZ1bmNJbmZvLlZhbHVlTWFwLmZpbmQoVik7CisgIGlmIChWTUkgIT0gRnVuY0luZm8uVmFsdWVNYXAuZW5kKCkpIHsKKyAgICBhc3NlcnQoIVYtPnVzZV9lbXB0eSgpICYmICJVbnVzZWQgdmFsdWUgYXNzaWduZWQgdmlydHVhbCByZWdpc3RlcnMhIik7CisgICAgQ29weVZhbHVlVG9WaXJ0dWFsUmVnaXN0ZXIoViwgVk1JLT5zZWNvbmQpOworICB9Cit9CisKKy8vLyBFeHBvcnRGcm9tQ3VycmVudEJsb2NrIC0gSWYgdGhpcyBjb25kaXRpb24gaXNuJ3Qga25vd24gdG8gYmUgZXhwb3J0ZWQgZnJvbQorLy8vIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrLCBhZGQgaXQgdG8gVmFsdWVNYXAgbm93IHNvIHRoYXQgd2UnbGwgZ2V0IGEKKy8vLyBDb3B5VG8vRnJvbVJlZy4KK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6RXhwb3J0RnJvbUN1cnJlbnRCbG9jayhjb25zdCBWYWx1ZSAqVikgeworICAvLyBObyBuZWVkIHRvIGV4cG9ydCBjb25zdGFudHMuCisgIGlmICghaXNhPEluc3RydWN0aW9uPihWKSAmJiAhaXNhPEFyZ3VtZW50PihWKSkgcmV0dXJuOworCisgIC8vIEFscmVhZHkgZXhwb3J0ZWQ/CisgIGlmIChGdW5jSW5mby5pc0V4cG9ydGVkSW5zdChWKSkgcmV0dXJuOworCisgIHVuc2lnbmVkIFJlZyA9IEZ1bmNJbmZvLkluaXRpYWxpemVSZWdGb3JWYWx1ZShWKTsKKyAgQ29weVZhbHVlVG9WaXJ0dWFsUmVnaXN0ZXIoViwgUmVnKTsKK30KKworYm9vbCBTZWxlY3Rpb25EQUdCdWlsZGVyOjppc0V4cG9ydGFibGVGcm9tQ3VycmVudEJsb2NrKGNvbnN0IFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrICpGcm9tQkIpIHsKKyAgLy8gVGhlIG9wZXJhbmRzIG9mIHRoZSBzZXRjYyBoYXZlIHRvIGJlIGluIHRoaXMgYmxvY2suICBXZSBkb24ndCBrbm93CisgIC8vIGhvdyB0byBleHBvcnQgdGhlbSBmcm9tIHNvbWUgb3RoZXIgYmxvY2suCisgIGlmIChjb25zdCBJbnN0cnVjdGlvbiAqVkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpIHsKKyAgICAvLyBDYW4gZXhwb3J0IGZyb20gY3VycmVudCBCQi4KKyAgICBpZiAoVkktPmdldFBhcmVudCgpID09IEZyb21CQikKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gSXMgYWxyZWFkeSBleHBvcnRlZCwgbm9vcC4KKyAgICByZXR1cm4gRnVuY0luZm8uaXNFeHBvcnRlZEluc3QoVik7CisgIH0KKworICAvLyBJZiB0aGlzIGlzIGFuIGFyZ3VtZW50LCB3ZSBjYW4gZXhwb3J0IGl0IGlmIHRoZSBCQiBpcyB0aGUgZW50cnkgYmxvY2sgb3IKKyAgLy8gaWYgaXQgaXMgYWxyZWFkeSBleHBvcnRlZC4KKyAgaWYgKGlzYTxBcmd1bWVudD4oVikpIHsKKyAgICBpZiAoRnJvbUJCID09ICZGcm9tQkItPmdldFBhcmVudCgpLT5nZXRFbnRyeUJsb2NrKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE90aGVyd2lzZSwgY2FuIG9ubHkgZXhwb3J0IHRoaXMgaWYgaXQgaXMgYWxyZWFkeSBleHBvcnRlZC4KKyAgICByZXR1cm4gRnVuY0luZm8uaXNFeHBvcnRlZEluc3QoVik7CisgIH0KKworICAvLyBPdGhlcndpc2UsIGNvbnN0YW50cyBjYW4gYWx3YXlzIGJlIGV4cG9ydGVkLgorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgSW5CbG9jayhjb25zdCBWYWx1ZSAqViwgY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKQorICAgIHJldHVybiBJLT5nZXRQYXJlbnQoKSA9PSBCQjsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBFbWl0QnJhbmNoRm9yTWVyZ2VkQ29uZGl0aW9uIC0gSGVscGVyIG1ldGhvZCBmb3IgRmluZE1lcmdlZENvbmRpdGlvbnMuCisvLy8gVGhpcyBmdW5jdGlvbiBlbWl0cyBhIGJyYW5jaCBhbmQgaXMgdXNlZCBhdCB0aGUgbGVhdmVzIG9mIGFuIE9SIG9yIGFuCisvLy8gQU5EIG9wZXJhdG9yIHRyZWUuCisvLy8KK3ZvaWQKK1NlbGVjdGlvbkRBR0J1aWxkZXI6OkVtaXRCcmFuY2hGb3JNZXJnZWRDb25kaXRpb24oY29uc3QgVmFsdWUgKkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpDdXJCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCKSB7CisgIGNvbnN0IEJhc2ljQmxvY2sgKkJCID0gQ3VyQkItPmdldEJhc2ljQmxvY2soKTsKKworICAvLyBJZiB0aGUgbGVhZiBvZiB0aGUgdHJlZSBpcyBhIGNvbXBhcmlzb24sIG1lcmdlIHRoZSBjb25kaXRpb24gaW50bworICAvLyB0aGUgY2FzZWJsb2NrLgorICBpZiAoY29uc3QgQ21wSW5zdCAqQk9wID0gZHluX2Nhc3Q8Q21wSW5zdD4oQ29uZCkpIHsKKyAgICAvLyBUaGUgb3BlcmFuZHMgb2YgdGhlIGNtcCBoYXZlIHRvIGJlIGluIHRoaXMgYmxvY2suICBXZSBkb24ndCBrbm93CisgICAgLy8gaG93IHRvIGV4cG9ydCB0aGVtIGZyb20gc29tZSBvdGhlciBibG9jay4gIElmIHRoaXMgaXMgdGhlIGZpcnN0IGJsb2NrCisgICAgLy8gb2YgdGhlIHNlcXVlbmNlLCBubyBleHBvcnRpbmcgaXMgbmVlZGVkLgorICAgIGlmIChDdXJCQiA9PSBTd2l0Y2hCQiB8fAorICAgICAgICAoaXNFeHBvcnRhYmxlRnJvbUN1cnJlbnRCbG9jayhCT3AtPmdldE9wZXJhbmQoMCksIEJCKSAmJgorICAgICAgICAgaXNFeHBvcnRhYmxlRnJvbUN1cnJlbnRCbG9jayhCT3AtPmdldE9wZXJhbmQoMSksIEJCKSkpIHsKKyAgICAgIElTRDo6Q29uZENvZGUgQ29uZGl0aW9uOworICAgICAgaWYgKGNvbnN0IElDbXBJbnN0ICpJQyA9IGR5bl9jYXN0PElDbXBJbnN0PihDb25kKSkgeworICAgICAgICBDb25kaXRpb24gPSBnZXRJQ21wQ29uZENvZGUoSUMtPmdldFByZWRpY2F0ZSgpKTsKKyAgICAgIH0gZWxzZSBpZiAoY29uc3QgRkNtcEluc3QgKkZDID0gZHluX2Nhc3Q8RkNtcEluc3Q+KENvbmQpKSB7CisgICAgICAgIENvbmRpdGlvbiA9IGdldEZDbXBDb25kQ29kZShGQy0+Z2V0UHJlZGljYXRlKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29uZGl0aW9uID0gSVNEOjpTRVRFUTsgLy8gc2lsZW5jZSB3YXJuaW5nLgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGNvbXBhcmUgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIH0KKworICAgICAgQ2FzZUJsb2NrIENCKENvbmRpdGlvbiwgQk9wLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgIEJPcC0+Z2V0T3BlcmFuZCgxKSwgTlVMTCwgVEJCLCBGQkIsIEN1ckJCKTsKKyAgICAgIFN3aXRjaENhc2VzLnB1c2hfYmFjayhDQik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gQ3JlYXRlIGEgQ2FzZUJsb2NrIHJlY29yZCByZXByZXNlbnRpbmcgdGhpcyBicmFuY2guCisgIENhc2VCbG9jayBDQihJU0Q6OlNFVEVRLCBDb25kLCBDb25zdGFudEludDo6Z2V0VHJ1ZSgqREFHLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICBOVUxMLCBUQkIsIEZCQiwgQ3VyQkIpOworICBTd2l0Y2hDYXNlcy5wdXNoX2JhY2soQ0IpOworfQorCisvLy8gRmluZE1lcmdlZENvbmRpdGlvbnMgLSBJZiBDb25kIGlzIGFuIGV4cHJlc3Npb24gbGlrZQordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjpGaW5kTWVyZ2VkQ29uZGl0aW9ucyhjb25zdCBWYWx1ZSAqQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkN1ckJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3dpdGNoQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wYykgeworICAvLyBJZiB0aGlzIG5vZGUgaXMgbm90IHBhcnQgb2YgdGhlIG9yL2FuZCB0cmVlLCBlbWl0IGl0IGFzIGEgYnJhbmNoLgorICBjb25zdCBJbnN0cnVjdGlvbiAqQk9wID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KENvbmQpOworICBpZiAoIUJPcCB8fCAhKGlzYTxCaW5hcnlPcGVyYXRvcj4oQk9wKSB8fCBpc2E8Q21wSW5zdD4oQk9wKSkgfHwKKyAgICAgICh1bnNpZ25lZClCT3AtPmdldE9wY29kZSgpICE9IE9wYyB8fCAhQk9wLT5oYXNPbmVVc2UoKSB8fAorICAgICAgQk9wLT5nZXRQYXJlbnQoKSAhPSBDdXJCQi0+Z2V0QmFzaWNCbG9jaygpIHx8CisgICAgICAhSW5CbG9jayhCT3AtPmdldE9wZXJhbmQoMCksIEN1ckJCLT5nZXRCYXNpY0Jsb2NrKCkpIHx8CisgICAgICAhSW5CbG9jayhCT3AtPmdldE9wZXJhbmQoMSksIEN1ckJCLT5nZXRCYXNpY0Jsb2NrKCkpKSB7CisgICAgRW1pdEJyYW5jaEZvck1lcmdlZENvbmRpdGlvbihDb25kLCBUQkIsIEZCQiwgQ3VyQkIsIFN3aXRjaEJCKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyAgQ3JlYXRlIFRtcEJCIGFmdGVyIEN1ckJCLgorICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJCSSA9IEN1ckJCOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBNYWNoaW5lQmFzaWNCbG9jayAqVG1wQkIgPSBNRi5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhDdXJCQi0+Z2V0QmFzaWNCbG9jaygpKTsKKyAgQ3VyQkItPmdldFBhcmVudCgpLT5pbnNlcnQoKytCQkksIFRtcEJCKTsKKworICBpZiAoT3BjID09IEluc3RydWN0aW9uOjpPcikgeworICAgIC8vIENvZGVnZW4gWCB8IFkgYXM6CisgICAgLy8gICBqbXBfaWZfWCBUQkIKKyAgICAvLyAgIGptcCBUbXBCQgorICAgIC8vIFRtcEJCOgorICAgIC8vICAgam1wX2lmX1kgVEJCCisgICAgLy8gICBqbXAgRkJCCisgICAgLy8KKworICAgIC8vIEVtaXQgdGhlIExIUyBjb25kaXRpb24uCisgICAgRmluZE1lcmdlZENvbmRpdGlvbnMoQk9wLT5nZXRPcGVyYW5kKDApLCBUQkIsIFRtcEJCLCBDdXJCQiwgU3dpdGNoQkIsIE9wYyk7CisKKyAgICAvLyBFbWl0IHRoZSBSSFMgY29uZGl0aW9uIGludG8gVG1wQkIuCisgICAgRmluZE1lcmdlZENvbmRpdGlvbnMoQk9wLT5nZXRPcGVyYW5kKDEpLCBUQkIsIEZCQiwgVG1wQkIsIFN3aXRjaEJCLCBPcGMpOworICB9IGVsc2UgeworICAgIGFzc2VydChPcGMgPT0gSW5zdHJ1Y3Rpb246OkFuZCAmJiAiVW5rbm93biBtZXJnZSBvcCEiKTsKKyAgICAvLyBDb2RlZ2VuIFggJiBZIGFzOgorICAgIC8vICAgam1wX2lmX1ggVG1wQkIKKyAgICAvLyAgIGptcCBGQkIKKyAgICAvLyBUbXBCQjoKKyAgICAvLyAgIGptcF9pZl9ZIFRCQgorICAgIC8vICAgam1wIEZCQgorICAgIC8vCisgICAgLy8gIFRoaXMgcmVxdWlyZXMgY3JlYXRpb24gb2YgVG1wQkIgYWZ0ZXIgQ3VyQkIuCisKKyAgICAvLyBFbWl0IHRoZSBMSFMgY29uZGl0aW9uLgorICAgIEZpbmRNZXJnZWRDb25kaXRpb25zKEJPcC0+Z2V0T3BlcmFuZCgwKSwgVG1wQkIsIEZCQiwgQ3VyQkIsIFN3aXRjaEJCLCBPcGMpOworCisgICAgLy8gRW1pdCB0aGUgUkhTIGNvbmRpdGlvbiBpbnRvIFRtcEJCLgorICAgIEZpbmRNZXJnZWRDb25kaXRpb25zKEJPcC0+Z2V0T3BlcmFuZCgxKSwgVEJCLCBGQkIsIFRtcEJCLCBTd2l0Y2hCQiwgT3BjKTsKKyAgfQorfQorCisvLy8gSWYgdGhlIHNldCBvZiBjYXNlcyBzaG91bGQgYmUgZW1pdHRlZCBhcyBhIHNlcmllcyBvZiBicmFuY2hlcywgcmV0dXJuIHRydWUuCisvLy8gSWYgd2Ugc2hvdWxkIGVtaXQgdGhpcyBhcyBhIGJ1bmNoIG9mIGFuZC9vcidkIHRvZ2V0aGVyIGNvbmRpdGlvbnMsIHJldHVybgorLy8vIGZhbHNlLgorYm9vbAorU2VsZWN0aW9uREFHQnVpbGRlcjo6U2hvdWxkRW1pdEFzQnJhbmNoZXMoY29uc3Qgc3RkOjp2ZWN0b3I8Q2FzZUJsb2NrPiAmQ2FzZXMpeworICBpZiAoQ2FzZXMuc2l6ZSgpICE9IDIpIHJldHVybiB0cnVlOworCisgIC8vIElmIHRoaXMgaXMgdHdvIGNvbXBhcmlzb25zIG9mIHRoZSBzYW1lIHZhbHVlcyBvcidkIG9yIGFuZCdkIHRvZ2V0aGVyLCB0aGV5CisgIC8vIHdpbGwgZ2V0IGZvbGRlZCBpbnRvIGEgc2luZ2xlIGNvbXBhcmlzb24sIHNvIGRvbid0IGVtaXQgdHdvIGJsb2Nrcy4KKyAgaWYgKChDYXNlc1swXS5DbXBMSFMgPT0gQ2FzZXNbMV0uQ21wTEhTICYmCisgICAgICAgQ2FzZXNbMF0uQ21wUkhTID09IENhc2VzWzFdLkNtcFJIUykgfHwKKyAgICAgIChDYXNlc1swXS5DbXBSSFMgPT0gQ2FzZXNbMV0uQ21wTEhTICYmCisgICAgICAgQ2FzZXNbMF0uQ21wTEhTID09IENhc2VzWzFdLkNtcFJIUykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBIYW5kbGU6IChYICE9IG51bGwpIHwgKFkgIT0gbnVsbCkgLS0+IChYfFkpICE9IDAKKyAgLy8gSGFuZGxlOiAoWCA9PSBudWxsKSAmIChZID09IG51bGwpIC0tPiAoWHxZKSA9PSAwCisgIGlmIChDYXNlc1swXS5DbXBSSFMgPT0gQ2FzZXNbMV0uQ21wUkhTICYmCisgICAgICBDYXNlc1swXS5DQyA9PSBDYXNlc1sxXS5DQyAmJgorICAgICAgaXNhPENvbnN0YW50PihDYXNlc1swXS5DbXBSSFMpICYmCisgICAgICBjYXN0PENvbnN0YW50PihDYXNlc1swXS5DbXBSSFMpLT5pc051bGxWYWx1ZSgpKSB7CisgICAgaWYgKENhc2VzWzBdLkNDID09IElTRDo6U0VURVEgJiYgQ2FzZXNbMF0uVHJ1ZUJCID09IENhc2VzWzFdLlRoaXNCQikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ2FzZXNbMF0uQ0MgPT0gSVNEOjpTRVRORSAmJiBDYXNlc1swXS5GYWxzZUJCID09IENhc2VzWzFdLlRoaXNCQikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRCcihjb25zdCBCcmFuY2hJbnN0ICZJKSB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpCck1CQiA9IEZ1bmNJbmZvLk1CQjsKKworICAvLyBVcGRhdGUgbWFjaGluZS1DRkcgZWRnZXMuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjME1CQiA9IEZ1bmNJbmZvLk1CQk1hcFtJLmdldFN1Y2Nlc3NvcigwKV07CisKKyAgLy8gRmlndXJlIG91dCB3aGljaCBibG9jayBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCBvbmUuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXh0QmxvY2sgPSAwOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJCSSA9IEJyTUJCOworICBpZiAoKytCQkkgIT0gRnVuY0luZm8uTUYtPmVuZCgpKQorICAgIE5leHRCbG9jayA9IEJCSTsKKworICBpZiAoSS5pc1VuY29uZGl0aW9uYWwoKSkgeworICAgIC8vIFVwZGF0ZSBtYWNoaW5lLUNGRyBlZGdlcy4KKyAgICBCck1CQi0+YWRkU3VjY2Vzc29yKFN1Y2MwTUJCKTsKKworICAgIC8vIElmIHRoaXMgaXMgbm90IGEgZmFsbC10aHJvdWdoIGJyYW5jaCwgZW1pdCB0aGUgYnJhbmNoLgorICAgIGlmIChTdWNjME1CQiAhPSBOZXh0QmxvY2spCisgICAgICBEQUcuc2V0Um9vdChEQUcuZ2V0Tm9kZShJU0Q6OkJSLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgZ2V0Q29udHJvbFJvb3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRCYXNpY0Jsb2NrKFN1Y2MwTUJCKSkpOworCisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSWYgdGhpcyBjb25kaXRpb24gaXMgb25lIG9mIHRoZSBzcGVjaWFsIGNhc2VzIHdlIGhhbmRsZSwgZG8gc3BlY2lhbCBzdHVmZgorICAvLyBub3cuCisgIGNvbnN0IFZhbHVlICpDb25kVmFsID0gSS5nZXRDb25kaXRpb24oKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MxTUJCID0gRnVuY0luZm8uTUJCTWFwW0kuZ2V0U3VjY2Vzc29yKDEpXTsKKworICAvLyBJZiB0aGlzIGlzIGEgc2VyaWVzIG9mIGNvbmRpdGlvbnMgdGhhdCBhcmUgb3InZCBvciBhbmQnZCB0b2dldGhlciwgZW1pdAorICAvLyB0aGlzIGFzIGEgc2VxdWVuY2Ugb2YgYnJhbmNoZXMgaW5zdGVhZCBvZiBzZXRjYydzIHdpdGggYW5kL29yIG9wZXJhdGlvbnMuCisgIC8vIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBsaWtlOgorICAvLyAgICAgY21wIEEsIEIKKyAgLy8gICAgIEMgPSBzZXRlcQorICAvLyAgICAgY21wIEQsIEUKKyAgLy8gICAgIEYgPSBzZXRsZQorICAvLyAgICAgb3IgQywgRgorICAvLyAgICAgam56IGZvbworICAvLyBFbWl0OgorICAvLyAgICAgY21wIEEsIEIKKyAgLy8gICAgIGplIGZvbworICAvLyAgICAgY21wIEQsIEUKKyAgLy8gICAgIGpsZSBmb28KKyAgLy8KKyAgaWYgKGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCT3AgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oQ29uZFZhbCkpIHsKKyAgICBpZiAoQk9wLT5oYXNPbmVVc2UoKSAmJgorICAgICAgICAoQk9wLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kIHx8CisgICAgICAgICBCT3AtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpPcikpIHsKKyAgICAgIEZpbmRNZXJnZWRDb25kaXRpb25zKEJPcCwgU3VjYzBNQkIsIFN1Y2MxTUJCLCBCck1CQiwgQnJNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCT3AtPmdldE9wY29kZSgpKTsKKyAgICAgIC8vIElmIHRoZSBjb21wYXJlcyBpbiBsYXRlciBibG9ja3MgbmVlZCB0byB1c2UgdmFsdWVzIG5vdCBjdXJyZW50bHkKKyAgICAgIC8vIGV4cG9ydGVkIGZyb20gdGhpcyBibG9jaywgZXhwb3J0IHRoZW0gbm93LiAgVGhpcyBibG9jayBzaG91bGQgYWx3YXlzCisgICAgICAvLyBiZSB0aGUgZmlyc3QgZW50cnkuCisgICAgICBhc3NlcnQoU3dpdGNoQ2FzZXNbMF0uVGhpc0JCID09IEJyTUJCICYmICJVbmV4cGVjdGVkIGxvd2VyaW5nISIpOworCisgICAgICAvLyBBbGxvdyBzb21lIGNhc2VzIHRvIGJlIHJlamVjdGVkLgorICAgICAgaWYgKFNob3VsZEVtaXRBc0JyYW5jaGVzKFN3aXRjaENhc2VzKSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gU3dpdGNoQ2FzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIEV4cG9ydEZyb21DdXJyZW50QmxvY2soU3dpdGNoQ2FzZXNbaV0uQ21wTEhTKTsKKyAgICAgICAgICBFeHBvcnRGcm9tQ3VycmVudEJsb2NrKFN3aXRjaENhc2VzW2ldLkNtcFJIUyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFbWl0IHRoZSBicmFuY2ggZm9yIHRoaXMgYmxvY2suCisgICAgICAgIHZpc2l0U3dpdGNoQ2FzZShTd2l0Y2hDYXNlc1swXSwgQnJNQkIpOworICAgICAgICBTd2l0Y2hDYXNlcy5lcmFzZShTd2l0Y2hDYXNlcy5iZWdpbigpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBPa2F5LCB3ZSBkZWNpZGVkIG5vdCB0byBkbyB0aGlzLCByZW1vdmUgYW55IGluc2VydGVkIE1CQidzIGFuZCBjbGVhcgorICAgICAgLy8gU3dpdGNoQ2FzZXMuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gU3dpdGNoQ2FzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgRnVuY0luZm8uTUYtPmVyYXNlKFN3aXRjaENhc2VzW2ldLlRoaXNCQik7CisKKyAgICAgIFN3aXRjaENhc2VzLmNsZWFyKCk7CisgICAgfQorICB9CisKKyAgLy8gQ3JlYXRlIGEgQ2FzZUJsb2NrIHJlY29yZCByZXByZXNlbnRpbmcgdGhpcyBicmFuY2guCisgIENhc2VCbG9jayBDQihJU0Q6OlNFVEVRLCBDb25kVmFsLCBDb25zdGFudEludDo6Z2V0VHJ1ZSgqREFHLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICBOVUxMLCBTdWNjME1CQiwgU3VjYzFNQkIsIEJyTUJCKTsKKworICAvLyBVc2UgdmlzaXRTd2l0Y2hDYXNlIHRvIGFjdHVhbGx5IGluc2VydCB0aGUgZmFzdCBicmFuY2ggc2VxdWVuY2UgZm9yIHRoaXMKKyAgLy8gY29uZCBicmFuY2guCisgIHZpc2l0U3dpdGNoQ2FzZShDQiwgQnJNQkIpOworfQorCisvLy8gdmlzaXRTd2l0Y2hDYXNlIC0gRW1pdHMgdGhlIG5lY2Vzc2FyeSBjb2RlIHRvIHJlcHJlc2VudCBhIHNpbmdsZSBub2RlIGluCisvLy8gdGhlIGJpbmFyeSBzZWFyY2ggdHJlZSByZXN1bHRpbmcgZnJvbSBsb3dlcmluZyBhIHN3aXRjaCBpbnN0cnVjdGlvbi4KK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRTd2l0Y2hDYXNlKENhc2VCbG9jayAmQ0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3dpdGNoQkIpIHsKKyAgU0RWYWx1ZSBDb25kOworICBTRFZhbHVlIENvbmRMSFMgPSBnZXRWYWx1ZShDQi5DbXBMSFMpOworICBEZWJ1Z0xvYyBkbCA9IGdldEN1ckRlYnVnTG9jKCk7CisKKyAgLy8gQnVpbGQgdGhlIHNldGNjIG5vdy4KKyAgaWYgKENCLkNtcE1IUyA9PSBOVUxMKSB7CisgICAgLy8gRm9sZCAiKFggPT0gdHJ1ZSkiIHRvIFggYW5kICIoWCA9PSBmYWxzZSkiIHRvICFYIHRvCisgICAgLy8gaGFuZGxlIGNvbW1vbiBjYXNlcyBwcm9kdWNlZCBieSBicmFuY2ggbG93ZXJpbmcuCisgICAgaWYgKENCLkNtcFJIUyA9PSBDb25zdGFudEludDo6Z2V0VHJ1ZSgqREFHLmdldENvbnRleHQoKSkgJiYKKyAgICAgICAgQ0IuQ0MgPT0gSVNEOjpTRVRFUSkKKyAgICAgIENvbmQgPSBDb25kTEhTOworICAgIGVsc2UgaWYgKENCLkNtcFJIUyA9PSBDb25zdGFudEludDo6Z2V0RmFsc2UoKkRBRy5nZXRDb250ZXh0KCkpICYmCisgICAgICAgICAgICAgQ0IuQ0MgPT0gSVNEOjpTRVRFUSkgeworICAgICAgU0RWYWx1ZSBUcnVlID0gREFHLmdldENvbnN0YW50KDEsIENvbmRMSFMuZ2V0VmFsdWVUeXBlKCkpOworICAgICAgQ29uZCA9IERBRy5nZXROb2RlKElTRDo6WE9SLCBkbCwgQ29uZExIUy5nZXRWYWx1ZVR5cGUoKSwgQ29uZExIUywgVHJ1ZSk7CisgICAgfSBlbHNlCisgICAgICBDb25kID0gREFHLmdldFNldENDKGRsLCBNVlQ6OmkxLCBDb25kTEhTLCBnZXRWYWx1ZShDQi5DbXBSSFMpLCBDQi5DQyk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KENCLkNDID09IElTRDo6U0VUTEUgJiYgIkNhbiBoYW5kbGUgb25seSBMRSByYW5nZXMgbm93Iik7CisKKyAgICBjb25zdCBBUEludCYgTG93ID0gY2FzdDxDb25zdGFudEludD4oQ0IuQ21wTEhTKS0+Z2V0VmFsdWUoKTsKKyAgICBjb25zdCBBUEludCYgSGlnaCAgPSBjYXN0PENvbnN0YW50SW50PihDQi5DbXBSSFMpLT5nZXRWYWx1ZSgpOworCisgICAgU0RWYWx1ZSBDbXBPcCA9IGdldFZhbHVlKENCLkNtcE1IUyk7CisgICAgRVZUIFZUID0gQ21wT3AuZ2V0VmFsdWVUeXBlKCk7CisKKyAgICBpZiAoY2FzdDxDb25zdGFudEludD4oQ0IuQ21wTEhTKS0+aXNNaW5WYWx1ZSh0cnVlKSkgeworICAgICAgQ29uZCA9IERBRy5nZXRTZXRDQyhkbCwgTVZUOjppMSwgQ21wT3AsIERBRy5nZXRDb25zdGFudChIaWdoLCBWVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUTEUpOworICAgIH0gZWxzZSB7CisgICAgICBTRFZhbHVlIFNVQiA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlQsIENtcE9wLCBEQUcuZ2V0Q29uc3RhbnQoTG93LCBWVCkpOworICAgICAgQ29uZCA9IERBRy5nZXRTZXRDQyhkbCwgTVZUOjppMSwgU1VCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSGlnaC1Mb3csIFZUKSwgSVNEOjpTRVRVTEUpOworICAgIH0KKyAgfQorCisgIC8vIFVwZGF0ZSBzdWNjZXNzb3IgaW5mbworICBTd2l0Y2hCQi0+YWRkU3VjY2Vzc29yKENCLlRydWVCQik7CisgIFN3aXRjaEJCLT5hZGRTdWNjZXNzb3IoQ0IuRmFsc2VCQik7CisKKyAgLy8gU2V0IE5leHRCbG9jayB0byBiZSB0aGUgTUJCIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50IG9uZSwgaWYgYW55LgorICAvLyBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgZW1pdHRpbmcgdW5uZWNlc3NhcnkgYnJhbmNoZXMgdG8gdGhlIG5leHQgYmxvY2suCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXh0QmxvY2sgPSAwOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJCSSA9IFN3aXRjaEJCOworICBpZiAoKytCQkkgIT0gRnVuY0luZm8uTUYtPmVuZCgpKQorICAgIE5leHRCbG9jayA9IEJCSTsKKworICAvLyBJZiB0aGUgbGhzIGJsb2NrIGlzIHRoZSBuZXh0IGJsb2NrLCBpbnZlcnQgdGhlIGNvbmRpdGlvbiBzbyB0aGF0IHdlIGNhbgorICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGxocyBpbnN0ZWFkIG9mIHRoZSByaHMgYmxvY2suCisgIGlmIChDQi5UcnVlQkIgPT0gTmV4dEJsb2NrKSB7CisgICAgc3RkOjpzd2FwKENCLlRydWVCQiwgQ0IuRmFsc2VCQik7CisgICAgU0RWYWx1ZSBUcnVlID0gREFHLmdldENvbnN0YW50KDEsIENvbmQuZ2V0VmFsdWVUeXBlKCkpOworICAgIENvbmQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIENvbmQuZ2V0VmFsdWVUeXBlKCksIENvbmQsIFRydWUpOworICB9CisKKyAgU0RWYWx1ZSBCckNvbmQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJSQ09ORCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgZ2V0Q29udHJvbFJvb3QoKSwgQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0QmFzaWNCbG9jayhDQi5UcnVlQkIpKTsKKworICAvLyBJbnNlcnQgdGhlIGZhbHNlIGJyYW5jaC4KKyAgaWYgKENCLkZhbHNlQkIgIT0gTmV4dEJsb2NrKQorICAgIEJyQ29uZCA9IERBRy5nZXROb2RlKElTRDo6QlIsIGRsLCBNVlQ6Ok90aGVyLCBCckNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEJhc2ljQmxvY2soQ0IuRmFsc2VCQikpOworCisgIERBRy5zZXRSb290KEJyQ29uZCk7Cit9CisKKy8vLyB2aXNpdEp1bXBUYWJsZSAtIEVtaXQgSnVtcFRhYmxlIG5vZGUgaW4gdGhlIGN1cnJlbnQgTUJCCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0SnVtcFRhYmxlKEp1bXBUYWJsZSAmSlQpIHsKKyAgLy8gRW1pdCB0aGUgY29kZSBmb3IgdGhlIGp1bXAgdGFibGUKKyAgYXNzZXJ0KEpULlJlZyAhPSAtMVUgJiYgIlNob3VsZCBsb3dlciBKVCBIZWFkZXIgZmlyc3QhIik7CisgIEVWVCBQVHkgPSBUTEkuZ2V0UG9pbnRlclR5KCk7CisgIFNEVmFsdWUgSW5kZXggPSBEQUcuZ2V0Q29weUZyb21SZWcoZ2V0Q29udHJvbFJvb3QoKSwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKVC5SZWcsIFBUeSk7CisgIFNEVmFsdWUgVGFibGUgPSBEQUcuZ2V0SnVtcFRhYmxlKEpULkpUSSwgUFR5KTsKKyAgU0RWYWx1ZSBCckp1bXBUYWJsZSA9IERBRy5nZXROb2RlKElTRDo6QlJfSlQsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBJbmRleC5nZXRWYWx1ZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlLCBJbmRleCk7CisgIERBRy5zZXRSb290KEJySnVtcFRhYmxlKTsKK30KKworLy8vIHZpc2l0SnVtcFRhYmxlSGVhZGVyIC0gVGhpcyBmdW5jdGlvbiBlbWl0cyBuZWNlc3NhcnkgY29kZSB0byBwcm9kdWNlIGluZGV4CisvLy8gaW4gdGhlIEp1bXBUYWJsZSBmcm9tIHN3aXRjaCBjYXNlLgordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdEp1bXBUYWJsZUhlYWRlcihKdW1wVGFibGUgJkpULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKdW1wVGFibGVIZWFkZXIgJkpUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCKSB7CisgIC8vIFN1YnRyYWN0IHRoZSBsb3dlc3Qgc3dpdGNoIGNhc2UgdmFsdWUgZnJvbSB0aGUgdmFsdWUgYmVpbmcgc3dpdGNoZWQgb24gYW5kCisgIC8vIGNvbmRpdGlvbmFsIGJyYW5jaCB0byBkZWZhdWx0IG1iYiBpZiB0aGUgcmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHNtYWxsZXN0IGFuZCBsYXJnZXN0IGNhc2VzLgorICBTRFZhbHVlIFN3aXRjaE9wID0gZ2V0VmFsdWUoSlRILlNWYWx1ZSk7CisgIEVWVCBWVCA9IFN3aXRjaE9wLmdldFZhbHVlVHlwZSgpOworICBTRFZhbHVlIFN1YiA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBnZXRDdXJEZWJ1Z0xvYygpLCBWVCwgU3dpdGNoT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEpUSC5GaXJzdCwgVlQpKTsKKworICAvLyBUaGUgU0ROb2RlIHdlIGp1c3QgY3JlYXRlZCwgd2hpY2ggaG9sZHMgdGhlIHZhbHVlIGJlaW5nIHN3aXRjaGVkIG9uIG1pbnVzCisgIC8vIHRoZSBzbWFsbGVzdCBjYXNlIHZhbHVlLCBuZWVkcyB0byBiZSBjb3BpZWQgdG8gYSB2aXJ0dWFsIHJlZ2lzdGVyIHNvIGl0CisgIC8vIGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4IGludG8gdGhlIGp1bXAgdGFibGUgaW4gYSBzdWJzZXF1ZW50IGJhc2ljIGJsb2NrLgorICAvLyBUaGlzIHZhbHVlIG1heSBiZSBzbWFsbGVyIG9yIGxhcmdlciB0aGFuIHRoZSB0YXJnZXQncyBwb2ludGVyIHR5cGUsIGFuZAorICAvLyB0aGVyZWZvcmUgcmVxdWlyZSBleHRlbnNpb24gb3IgdHJ1bmNhdGluZy4KKyAgU3dpdGNoT3AgPSBEQUcuZ2V0WkV4dE9yVHJ1bmMoU3ViLCBnZXRDdXJEZWJ1Z0xvYygpLCBUTEkuZ2V0UG9pbnRlclR5KCkpOworCisgIHVuc2lnbmVkIEp1bXBUYWJsZVJlZyA9IEZ1bmNJbmZvLkNyZWF0ZVJlZyhUTEkuZ2V0UG9pbnRlclR5KCkpOworICBTRFZhbHVlIENvcHlUbyA9IERBRy5nZXRDb3B5VG9SZWcoZ2V0Q29udHJvbFJvb3QoKSwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1bXBUYWJsZVJlZywgU3dpdGNoT3ApOworICBKVC5SZWcgPSBKdW1wVGFibGVSZWc7CisKKyAgLy8gRW1pdCB0aGUgcmFuZ2UgY2hlY2sgZm9yIHRoZSBqdW1wIHRhYmxlLCBhbmQgYnJhbmNoIHRvIHRoZSBkZWZhdWx0IGJsb2NrCisgIC8vIGZvciB0aGUgc3dpdGNoIHN0YXRlbWVudCBpZiB0aGUgdmFsdWUgYmVpbmcgc3dpdGNoZWQgb24gZXhjZWVkcyB0aGUgbGFyZ2VzdAorICAvLyBjYXNlIGluIHRoZSBzd2l0Y2guCisgIFNEVmFsdWUgQ01QID0gREFHLmdldFNldENDKGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoU3ViLmdldFZhbHVlVHlwZSgpKSwgU3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSlRILkxhc3QtSlRILkZpcnN0LFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRVR1QpOworCisgIC8vIFNldCBOZXh0QmxvY2sgdG8gYmUgdGhlIE1CQiBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCBvbmUsIGlmIGFueS4KKyAgLy8gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGVtaXR0aW5nIHVubmVjZXNzYXJ5IGJyYW5jaGVzIHRvIHRoZSBuZXh0IGJsb2NrLgorICBNYWNoaW5lQmFzaWNCbG9jayAqTmV4dEJsb2NrID0gMDsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBCQkkgPSBTd2l0Y2hCQjsKKworICBpZiAoKytCQkkgIT0gRnVuY0luZm8uTUYtPmVuZCgpKQorICAgIE5leHRCbG9jayA9IEJCSTsKKworICBTRFZhbHVlIEJyQ29uZCA9IERBRy5nZXROb2RlKElTRDo6QlJDT05ELCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsIENvcHlUbywgQ01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRCYXNpY0Jsb2NrKEpULkRlZmF1bHQpKTsKKworICBpZiAoSlQuTUJCICE9IE5leHRCbG9jaykKKyAgICBCckNvbmQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJSLCBnZXRDdXJEZWJ1Z0xvYygpLCBNVlQ6Ok90aGVyLCBCckNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEJhc2ljQmxvY2soSlQuTUJCKSk7CisKKyAgREFHLnNldFJvb3QoQnJDb25kKTsKK30KKworLy8vIHZpc2l0Qml0VGVzdEhlYWRlciAtIFRoaXMgZnVuY3Rpb24gZW1pdHMgbmVjZXNzYXJ5IGNvZGUgdG8gcHJvZHVjZSB2YWx1ZQorLy8vIHN1aXRhYmxlIGZvciAiYml0IHRlc3RzIgordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdEJpdFRlc3RIZWFkZXIoQml0VGVzdEJsb2NrICZCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCKSB7CisgIC8vIFN1YnRyYWN0IHRoZSBtaW5pbXVtIHZhbHVlCisgIFNEVmFsdWUgU3dpdGNoT3AgPSBnZXRWYWx1ZShCLlNWYWx1ZSk7CisgIEVWVCBWVCA9IFN3aXRjaE9wLmdldFZhbHVlVHlwZSgpOworICBTRFZhbHVlIFN1YiA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBnZXRDdXJEZWJ1Z0xvYygpLCBWVCwgU3dpdGNoT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEIuRmlyc3QsIFZUKSk7CisKKyAgLy8gQ2hlY2sgcmFuZ2UKKyAgU0RWYWx1ZSBSYW5nZUNtcCA9IERBRy5nZXRTZXRDQyhnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRTZXRDQ1Jlc3VsdFR5cGUoU3ViLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWIsIERBRy5nZXRDb25zdGFudChCLlJhbmdlLCBWVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRVR1QpOworCisgIFNEVmFsdWUgU2hpZnRPcCA9IERBRy5nZXRaRXh0T3JUcnVuYyhTdWIsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpOworCisgIEIuUmVnID0gRnVuY0luZm8uQ3JlYXRlUmVnKFRMSS5nZXRQb2ludGVyVHkoKSk7CisgIFNEVmFsdWUgQ29weVRvID0gREFHLmdldENvcHlUb1JlZyhnZXRDb250cm9sUm9vdCgpLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQi5SZWcsIFNoaWZ0T3ApOworCisgIC8vIFNldCBOZXh0QmxvY2sgdG8gYmUgdGhlIE1CQiBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCBvbmUsIGlmIGFueS4KKyAgLy8gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGVtaXR0aW5nIHVubmVjZXNzYXJ5IGJyYW5jaGVzIHRvIHRoZSBuZXh0IGJsb2NrLgorICBNYWNoaW5lQmFzaWNCbG9jayAqTmV4dEJsb2NrID0gMDsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBCQkkgPSBTd2l0Y2hCQjsKKyAgaWYgKCsrQkJJICE9IEZ1bmNJbmZvLk1GLT5lbmQoKSkKKyAgICBOZXh0QmxvY2sgPSBCQkk7CisKKyAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiA9IEIuQ2FzZXNbMF0uVGhpc0JCOworCisgIFN3aXRjaEJCLT5hZGRTdWNjZXNzb3IoQi5EZWZhdWx0KTsKKyAgU3dpdGNoQkItPmFkZFN1Y2Nlc3NvcihNQkIpOworCisgIFNEVmFsdWUgQnJSYW5nZSA9IERBRy5nZXROb2RlKElTRDo6QlJDT05ELCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBDb3B5VG8sIFJhbmdlQ21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0QmFzaWNCbG9jayhCLkRlZmF1bHQpKTsKKworICBpZiAoTUJCICE9IE5leHRCbG9jaykKKyAgICBCclJhbmdlID0gREFHLmdldE5vZGUoSVNEOjpCUiwgZ2V0Q3VyRGVidWdMb2MoKSwgTVZUOjpPdGhlciwgQ29weVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0QmFzaWNCbG9jayhNQkIpKTsKKworICBEQUcuc2V0Um9vdChCclJhbmdlKTsKK30KKworLy8vIHZpc2l0Qml0VGVzdENhc2UgLSB0aGlzIGZ1bmN0aW9uIHByb2R1Y2VzIG9uZSAiYml0IHRlc3QiCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0Qml0VGVzdENhc2UoTWFjaGluZUJhc2ljQmxvY2sqIE5leHRNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFRlc3RDYXNlICZCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTd2l0Y2hCQikgeworICBTRFZhbHVlIFNoaWZ0T3AgPSBEQUcuZ2V0Q29weUZyb21SZWcoZ2V0Q29udHJvbFJvb3QoKSwgZ2V0Q3VyRGVidWdMb2MoKSwgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpKTsKKyAgU0RWYWx1ZSBDbXA7CisgIGlmIChDb3VudFBvcHVsYXRpb25fNjQoQi5NYXNrKSA9PSAxKSB7CisgICAgLy8gVGVzdGluZyBmb3IgYSBzaW5nbGUgYml0OyBqdXN0IGNvbXBhcmUgdGhlIHNoaWZ0IGNvdW50IHdpdGggd2hhdCBpdAorICAgIC8vIHdvdWxkIG5lZWQgdG8gYmUgdG8gc2hpZnQgYSAxIGJpdCBpbiB0aGF0IHBvc2l0aW9uLgorICAgIENtcCA9IERBRy5nZXRTZXRDQyhnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKFNoaWZ0T3AuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBTaGlmdE9wLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQ291bnRUcmFpbGluZ1plcm9zXzY0KEIuTWFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OlNFVEVRKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBNYWtlIGRlc2lyZWQgc2hpZnQKKyAgICBTRFZhbHVlIFN3aXRjaFZhbCA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIFRMSS5nZXRQb2ludGVyVHkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGlmdE9wKTsKKworICAgIC8vIEVtaXQgYml0IHRlc3RzIGFuZCBqdW1wcworICAgIFNEVmFsdWUgQW5kT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpLCBTd2l0Y2hWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChCLk1hc2ssIFRMSS5nZXRQb2ludGVyVHkoKSkpOworICAgIENtcCA9IERBRy5nZXRTZXRDQyhnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0U2V0Q0NSZXN1bHRUeXBlKEFuZE9wLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgQW5kT3AsIERBRy5nZXRDb25zdGFudCgwLCBUTEkuZ2V0UG9pbnRlclR5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OlNFVE5FKTsKKyAgfQorCisgIFN3aXRjaEJCLT5hZGRTdWNjZXNzb3IoQi5UYXJnZXRCQik7CisgIFN3aXRjaEJCLT5hZGRTdWNjZXNzb3IoTmV4dE1CQik7CisKKyAgU0RWYWx1ZSBCckFuZCA9IERBRy5nZXROb2RlKElTRDo6QlJDT05ELCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgZ2V0Q29udHJvbFJvb3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENtcCwgREFHLmdldEJhc2ljQmxvY2soQi5UYXJnZXRCQikpOworCisgIC8vIFNldCBOZXh0QmxvY2sgdG8gYmUgdGhlIE1CQiBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCBvbmUsIGlmIGFueS4KKyAgLy8gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGVtaXR0aW5nIHVubmVjZXNzYXJ5IGJyYW5jaGVzIHRvIHRoZSBuZXh0IGJsb2NrLgorICBNYWNoaW5lQmFzaWNCbG9jayAqTmV4dEJsb2NrID0gMDsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBCQkkgPSBTd2l0Y2hCQjsKKyAgaWYgKCsrQkJJICE9IEZ1bmNJbmZvLk1GLT5lbmQoKSkKKyAgICBOZXh0QmxvY2sgPSBCQkk7CisKKyAgaWYgKE5leHRNQkIgIT0gTmV4dEJsb2NrKQorICAgIEJyQW5kID0gREFHLmdldE5vZGUoSVNEOjpCUiwgZ2V0Q3VyRGVidWdMb2MoKSwgTVZUOjpPdGhlciwgQnJBbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0QmFzaWNCbG9jayhOZXh0TUJCKSk7CisKKyAgREFHLnNldFJvb3QoQnJBbmQpOworfQorCisvLy8gaGFuZGxlU21hbGxTd2l0Y2hDYXNlUmFuZ2UgLSBFbWl0IGEgc2VyaWVzIG9mIHNwZWNpZmljIHRlc3RzIChzdWl0YWJsZSBmb3IKKy8vLyBzbWFsbCBjYXNlIHJhbmdlcykuCitib29sIFNlbGVjdGlvbkRBR0J1aWxkZXI6OmhhbmRsZVNtYWxsU3dpdGNoUmFuZ2UoQ2FzZVJlYyYgQ1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzZVJlY1ZlY3RvciYgV29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUqIFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTd2l0Y2hCQikgeworICBDYXNlJiBCYWNrQ2FzZSAgPSAqKENSLlJhbmdlLnNlY29uZC0xKTsKKworICAvLyBTaXplIGlzIHRoZSBudW1iZXIgb2YgQ2FzZXMgcmVwcmVzZW50ZWQgYnkgdGhpcyByYW5nZS4KKyAgc2l6ZV90IFNpemUgPSBDUi5SYW5nZS5zZWNvbmQgLSBDUi5SYW5nZS5maXJzdDsKKyAgaWYgKFNpemUgPiAzKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBHZXQgdGhlIE1hY2hpbmVGdW5jdGlvbiB3aGljaCBob2xkcyB0aGUgY3VycmVudCBNQkIuICBUaGlzIGlzIHVzZWQgd2hlbgorICAvLyBpbnNlcnRpbmcgYW55IGFkZGl0aW9uYWwgTUJCcyBuZWNlc3NhcnkgdG8gcmVwcmVzZW50IHRoZSBzd2l0Y2guCisgIE1hY2hpbmVGdW5jdGlvbiAqQ3VyTUYgPSBGdW5jSW5mby5NRjsKKworICAvLyBGaWd1cmUgb3V0IHdoaWNoIGJsb2NrIGlzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50IG9uZS4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKk5leHRCbG9jayA9IDA7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgQkJJID0gQ1IuQ2FzZUJCOworCisgIGlmICgrK0JCSSAhPSBGdW5jSW5mby5NRi0+ZW5kKCkpCisgICAgTmV4dEJsb2NrID0gQkJJOworCisgIC8vIFRPRE86IElmIGFueSB0d28gb2YgdGhlIGNhc2VzIGhhcyB0aGUgc2FtZSBkZXN0aW5hdGlvbiwgYW5kIGlmIG9uZSB2YWx1ZQorICAvLyBpcyB0aGUgc2FtZSBhcyB0aGUgb3RoZXIsIGJ1dCBoYXMgb25lIGJpdCB1bnNldCB0aGF0IHRoZSBvdGhlciBoYXMgc2V0LAorICAvLyB1c2UgYml0IG1hbmlwdWxhdGlvbiB0byBkbyB0d28gY29tcGFyZXMgYXQgb25jZS4gIEZvciBleGFtcGxlOgorICAvLyAiaWYgKFggPT0gNiB8fCBYID09IDQpIiAtPiAiaWYgKChYfDIpID09IDYpIgorCisgIC8vIFJlYXJyYW5nZSB0aGUgY2FzZSBibG9ja3Mgc28gdGhhdCB0aGUgbGFzdCBvbmUgZmFsbHMgdGhyb3VnaCBpZiBwb3NzaWJsZS4KKyAgaWYgKE5leHRCbG9jayAmJiBEZWZhdWx0ICE9IE5leHRCbG9jayAmJiBCYWNrQ2FzZS5CQiAhPSBOZXh0QmxvY2spIHsKKyAgICAvLyBUaGUgbGFzdCBjYXNlIGJsb2NrIHdvbid0IGZhbGwgdGhyb3VnaCBpbnRvICdOZXh0QmxvY2snIGlmIHdlIGVtaXQgdGhlCisgICAgLy8gYnJhbmNoZXMgaW4gdGhpcyBvcmRlci4gIFNlZSBpZiByZWFycmFuZ2luZyBhIGNhc2UgdmFsdWUgd291bGQgaGVscC4KKyAgICBmb3IgKENhc2VJdHIgSSA9IENSLlJhbmdlLmZpcnN0LCBFID0gQ1IuUmFuZ2Uuc2Vjb25kLTE7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoSS0+QkIgPT0gTmV4dEJsb2NrKSB7CisgICAgICAgIHN0ZDo6c3dhcCgqSSwgQmFja0Nhc2UpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDcmVhdGUgYSBDYXNlQmxvY2sgcmVjb3JkIHJlcHJlc2VudGluZyBhIGNvbmRpdGlvbmFsIGJyYW5jaCB0bworICAvLyB0aGUgQ2FzZSdzIHRhcmdldCBtYmIgaWYgdGhlIHZhbHVlIGJlaW5nIHN3aXRjaGVkIG9uIFNWIGlzIGVxdWFsCisgIC8vIHRvIEMuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpDdXJCbG9jayA9IENSLkNhc2VCQjsKKyAgZm9yIChDYXNlSXRyIEkgPSBDUi5SYW5nZS5maXJzdCwgRSA9IENSLlJhbmdlLnNlY29uZDsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRmFsbFRocm91Z2g7CisgICAgaWYgKEkgIT0gRS0xKSB7CisgICAgICBGYWxsVGhyb3VnaCA9IEN1ck1GLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhDdXJCbG9jay0+Z2V0QmFzaWNCbG9jaygpKTsKKyAgICAgIEN1ck1GLT5pbnNlcnQoQkJJLCBGYWxsVGhyb3VnaCk7CisKKyAgICAgIC8vIFB1dCBTViBpbiBhIHZpcnR1YWwgcmVnaXN0ZXIgdG8gbWFrZSBpdCBhdmFpbGFibGUgZnJvbSB0aGUgbmV3IGJsb2Nrcy4KKyAgICAgIEV4cG9ydEZyb21DdXJyZW50QmxvY2soU1YpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBJZiB0aGUgbGFzdCBjYXNlIGRvZXNuJ3QgbWF0Y2gsIGdvIHRvIHRoZSBkZWZhdWx0IGJsb2NrLgorICAgICAgRmFsbFRocm91Z2ggPSBEZWZhdWx0OworICAgIH0KKworICAgIGNvbnN0IFZhbHVlICpSSFMsICpMSFMsICpNSFM7CisgICAgSVNEOjpDb25kQ29kZSBDQzsKKyAgICBpZiAoSS0+SGlnaCA9PSBJLT5Mb3cpIHsKKyAgICAgIC8vIFRoaXMgaXMganVzdCBzbWFsbCBzbWFsbCBjYXNlIHJhbmdlIDopIGNvbnRhaW5pbmcgZXhhY3RseSAxIGNhc2UKKyAgICAgIENDID0gSVNEOjpTRVRFUTsKKyAgICAgIExIUyA9IFNWOyBSSFMgPSBJLT5IaWdoOyBNSFMgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBDQyA9IElTRDo6U0VUTEU7CisgICAgICBMSFMgPSBJLT5Mb3c7IE1IUyA9IFNWOyBSSFMgPSBJLT5IaWdoOworICAgIH0KKyAgICBDYXNlQmxvY2sgQ0IoQ0MsIExIUywgUkhTLCBNSFMsIEktPkJCLCBGYWxsVGhyb3VnaCwgQ3VyQmxvY2spOworCisgICAgLy8gSWYgZW1pdHRpbmcgdGhlIGZpcnN0IGNvbXBhcmlzb24sIGp1c3QgY2FsbCB2aXNpdFN3aXRjaENhc2UgdG8gZW1pdCB0aGUKKyAgICAvLyBjb2RlIGludG8gdGhlIGN1cnJlbnQgYmxvY2suICBPdGhlcndpc2UsIHB1c2ggdGhlIENhc2VCbG9jayBvbnRvIHRoZQorICAgIC8vIHZlY3RvciB0byBiZSBsYXRlciBwcm9jZXNzZWQgYnkgU0RJU2VsLCBhbmQgaW5zZXJ0IHRoZSBub2RlJ3MgTUJCCisgICAgLy8gYmVmb3JlIHRoZSBuZXh0IE1CQi4KKyAgICBpZiAoQ3VyQmxvY2sgPT0gU3dpdGNoQkIpCisgICAgICB2aXNpdFN3aXRjaENhc2UoQ0IsIFN3aXRjaEJCKTsKKyAgICBlbHNlCisgICAgICBTd2l0Y2hDYXNlcy5wdXNoX2JhY2soQ0IpOworCisgICAgQ3VyQmxvY2sgPSBGYWxsVGhyb3VnaDsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXJlSlRzQWxsb3dlZChjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJKSB7CisgIHJldHVybiAhRGlzYWJsZUp1bXBUYWJsZXMgJiYKKyAgICAgICAgICAoVExJLmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OkJSX0pULCBNVlQ6Ok90aGVyKSB8fAorICAgICAgICAgICBUTEkuaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6QlJJTkQsIE1WVDo6T3RoZXIpKTsKK30KKworc3RhdGljIEFQSW50IENvbXB1dGVSYW5nZShjb25zdCBBUEludCAmRmlyc3QsIGNvbnN0IEFQSW50ICZMYXN0KSB7CisgIEFQSW50IExhc3RFeHQoTGFzdCksIEZpcnN0RXh0KEZpcnN0KTsKKyAgdWludDMyX3QgQml0V2lkdGggPSBzdGQ6Om1heChMYXN0LmdldEJpdFdpZHRoKCksIEZpcnN0LmdldEJpdFdpZHRoKCkpICsgMTsKKyAgTGFzdEV4dC5zZXh0KEJpdFdpZHRoKTsgRmlyc3RFeHQuc2V4dChCaXRXaWR0aCk7CisgIHJldHVybiAoTGFzdEV4dCAtIEZpcnN0RXh0ICsgMVVMTCk7Cit9CisKKy8vLyBoYW5kbGVKVFN3aXRjaENhc2UgLSBFbWl0IGp1bXB0YWJsZSBmb3IgY3VycmVudCBzd2l0Y2ggY2FzZSByYW5nZQorYm9vbCBTZWxlY3Rpb25EQUdCdWlsZGVyOjpoYW5kbGVKVFN3aXRjaENhc2UoQ2FzZVJlYyYgQ1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXNlUmVjVmVjdG9yJiBXb3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlKiBTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCKSB7CisgIENhc2UmIEZyb250Q2FzZSA9ICpDUi5SYW5nZS5maXJzdDsKKyAgQ2FzZSYgQmFja0Nhc2UgID0gKihDUi5SYW5nZS5zZWNvbmQtMSk7CisKKyAgY29uc3QgQVBJbnQgJkZpcnN0ID0gY2FzdDxDb25zdGFudEludD4oRnJvbnRDYXNlLkxvdyktPmdldFZhbHVlKCk7CisgIGNvbnN0IEFQSW50ICZMYXN0ICA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEJhY2tDYXNlLkhpZ2gpLT5nZXRWYWx1ZSgpOworCisgIEFQSW50IFRTaXplKEZpcnN0LmdldEJpdFdpZHRoKCksIDApOworICBmb3IgKENhc2VJdHIgSSA9IENSLlJhbmdlLmZpcnN0LCBFID0gQ1IuUmFuZ2Uuc2Vjb25kOworICAgICAgIEkhPUU7ICsrSSkKKyAgICBUU2l6ZSArPSBJLT5zaXplKCk7CisKKyAgaWYgKCFhcmVKVHNBbGxvd2VkKFRMSSkgfHwgVFNpemUudWx0KDQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBBUEludCBSYW5nZSA9IENvbXB1dGVSYW5nZShGaXJzdCwgTGFzdCk7CisgIGRvdWJsZSBEZW5zaXR5ID0gVFNpemUucm91bmRUb0RvdWJsZSgpIC8gUmFuZ2Uucm91bmRUb0RvdWJsZSgpOworICBpZiAoRGVuc2l0eSA8IDAuNCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgREVCVUcoZGJncygpIDw8ICJMb3dlcmluZyBqdW1wIHRhYmxlXG4iCisgICAgICAgICAgICAgICA8PCAiRmlyc3QgZW50cnk6ICIgPDwgRmlyc3QgPDwgIi4gTGFzdCBlbnRyeTogIiA8PCBMYXN0IDw8ICdcbicKKyAgICAgICAgICAgICAgIDw8ICJSYW5nZTogIiA8PCBSYW5nZQorICAgICAgICAgICAgICAgPDwgIlNpemU6ICIgPDwgVFNpemUgPDwgIi4gRGVuc2l0eTogIiA8PCBEZW5zaXR5IDw8ICJcblxuIik7CisKKyAgLy8gR2V0IHRoZSBNYWNoaW5lRnVuY3Rpb24gd2hpY2ggaG9sZHMgdGhlIGN1cnJlbnQgTUJCLiAgVGhpcyBpcyB1c2VkIHdoZW4KKyAgLy8gaW5zZXJ0aW5nIGFueSBhZGRpdGlvbmFsIE1CQnMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCB0aGUgc3dpdGNoLgorICBNYWNoaW5lRnVuY3Rpb24gKkN1ck1GID0gRnVuY0luZm8uTUY7CisKKyAgLy8gRmlndXJlIG91dCB3aGljaCBibG9jayBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCBvbmUuCisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgQkJJID0gQ1IuQ2FzZUJCOworICArK0JCSTsKKworICBjb25zdCBCYXNpY0Jsb2NrICpMTFZNQkIgPSBDUi5DYXNlQkItPmdldEJhc2ljQmxvY2soKTsKKworICAvLyBDcmVhdGUgYSBuZXcgYmFzaWMgYmxvY2sgdG8gaG9sZCB0aGUgY29kZSBmb3IgbG9hZGluZyB0aGUgYWRkcmVzcworICAvLyBvZiB0aGUganVtcCB0YWJsZSwgYW5kIGp1bXBpbmcgdG8gaXQuICBVcGRhdGUgc3VjY2Vzc29yIGluZm9ybWF0aW9uOworICAvLyB3ZSB3aWxsIGVpdGhlciBicmFuY2ggdG8gdGhlIGRlZmF1bHQgY2FzZSBmb3IgdGhlIHN3aXRjaCwgb3IgdGhlIGp1bXAKKyAgLy8gdGFibGUuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpKdW1wVGFibGVCQiA9IEN1ck1GLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNQkIpOworICBDdXJNRi0+aW5zZXJ0KEJCSSwgSnVtcFRhYmxlQkIpOworICBDUi5DYXNlQkItPmFkZFN1Y2Nlc3NvcihEZWZhdWx0KTsKKyAgQ1IuQ2FzZUJCLT5hZGRTdWNjZXNzb3IoSnVtcFRhYmxlQkIpOworCisgIC8vIEJ1aWxkIGEgdmVjdG9yIG9mIGRlc3RpbmF0aW9uIEJCcywgY29ycmVzcG9uZGluZyB0byBlYWNoIHRhcmdldAorICAvLyBvZiB0aGUganVtcCB0YWJsZS4gSWYgdGhlIHZhbHVlIG9mIHRoZSBqdW1wIHRhYmxlIHNsb3QgY29ycmVzcG9uZHMgdG8KKyAgLy8gYSBjYXNlIHN0YXRlbWVudCwgcHVzaCB0aGUgY2FzZSdzIEJCIG9udG8gdGhlIHZlY3Rvciwgb3RoZXJ3aXNlLCBwdXNoCisgIC8vIHRoZSBkZWZhdWx0IEJCLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+IERlc3RCQnM7CisgIEFQSW50IFRFSSA9IEZpcnN0OworICBmb3IgKENhc2VJdHIgSSA9IENSLlJhbmdlLmZpcnN0LCBFID0gQ1IuUmFuZ2Uuc2Vjb25kOyBJICE9IEU7ICsrVEVJKSB7CisgICAgY29uc3QgQVBJbnQgJkxvdyA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEktPkxvdyktPmdldFZhbHVlKCk7CisgICAgY29uc3QgQVBJbnQgJkhpZ2ggPSBjYXN0PENvbnN0YW50SW50PihJLT5IaWdoKS0+Z2V0VmFsdWUoKTsKKworICAgIGlmIChMb3cuc2xlKFRFSSkgJiYgVEVJLnNsZShIaWdoKSkgeworICAgICAgRGVzdEJCcy5wdXNoX2JhY2soSS0+QkIpOworICAgICAgaWYgKFRFST09SGlnaCkKKyAgICAgICAgKytJOworICAgIH0gZWxzZSB7CisgICAgICBEZXN0QkJzLnB1c2hfYmFjayhEZWZhdWx0KTsKKyAgICB9CisgIH0KKworICAvLyBVcGRhdGUgc3VjY2Vzc29yIGluZm8uIEFkZCBvbmUgZWRnZSB0byBlYWNoIHVuaXF1ZSBzdWNjZXNzb3IuCisgIEJpdFZlY3RvciBTdWNjc0hhbmRsZWQoQ1IuQ2FzZUJCLT5nZXRQYXJlbnQoKS0+Z2V0TnVtQmxvY2tJRHMoKSk7CisgIGZvciAoc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPjo6aXRlcmF0b3IgSSA9IERlc3RCQnMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBEZXN0QkJzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGlmICghU3VjY3NIYW5kbGVkWygqSSktPmdldE51bWJlcigpXSkgeworICAgICAgU3VjY3NIYW5kbGVkWygqSSktPmdldE51bWJlcigpXSA9IHRydWU7CisgICAgICBKdW1wVGFibGVCQi0+YWRkU3VjY2Vzc29yKCpJKTsKKyAgICB9CisgIH0KKworICAvLyBDcmVhdGUgYSBqdW1wIHRhYmxlIGluZGV4IGZvciB0aGlzIGp1bXAgdGFibGUuCisgIHVuc2lnbmVkIEpURW5jb2RpbmcgPSBUTEkuZ2V0SnVtcFRhYmxlRW5jb2RpbmcoKTsKKyAgdW5zaWduZWQgSlRJID0gQ3VyTUYtPmdldE9yQ3JlYXRlSnVtcFRhYmxlSW5mbyhKVEVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAtPmNyZWF0ZUp1bXBUYWJsZUluZGV4KERlc3RCQnMpOworCisgIC8vIFNldCB0aGUganVtcCB0YWJsZSBpbmZvcm1hdGlvbiBzbyB0aGF0IHdlIGNhbiBjb2RlZ2VuIGl0IGFzIGEgc2Vjb25kCisgIC8vIE1hY2hpbmVCYXNpY0Jsb2NrCisgIEp1bXBUYWJsZSBKVCgtMVUsIEpUSSwgSnVtcFRhYmxlQkIsIERlZmF1bHQpOworICBKdW1wVGFibGVIZWFkZXIgSlRIKEZpcnN0LCBMYXN0LCBTViwgQ1IuQ2FzZUJCLCAoQ1IuQ2FzZUJCID09IFN3aXRjaEJCKSk7CisgIGlmIChDUi5DYXNlQkIgPT0gU3dpdGNoQkIpCisgICAgdmlzaXRKdW1wVGFibGVIZWFkZXIoSlQsIEpUSCwgU3dpdGNoQkIpOworCisgIEpUQ2FzZXMucHVzaF9iYWNrKEp1bXBUYWJsZUJsb2NrKEpUSCwgSlQpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGhhbmRsZUJUU3BsaXRTd2l0Y2hDYXNlIC0gZW1pdCBjb21wYXJpc29uIGFuZCBzcGxpdCBiaW5hcnkgc2VhcmNoIHRyZWUgaW50bworLy8vIDIgc3VidHJlZXMuCitib29sIFNlbGVjdGlvbkRBR0J1aWxkZXI6OmhhbmRsZUJUU3BsaXRTd2l0Y2hDYXNlKENhc2VSZWMmIENSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXNlUmVjVmVjdG9yJiBXb3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUqIFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCKSB7CisgIC8vIEdldCB0aGUgTWFjaGluZUZ1bmN0aW9uIHdoaWNoIGhvbGRzIHRoZSBjdXJyZW50IE1CQi4gIFRoaXMgaXMgdXNlZCB3aGVuCisgIC8vIGluc2VydGluZyBhbnkgYWRkaXRpb25hbCBNQkJzIG5lY2Vzc2FyeSB0byByZXByZXNlbnQgdGhlIHN3aXRjaC4KKyAgTWFjaGluZUZ1bmN0aW9uICpDdXJNRiA9IEZ1bmNJbmZvLk1GOworCisgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggYmxvY2sgaXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lLgorICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJCSSA9IENSLkNhc2VCQjsKKyAgKytCQkk7CisKKyAgQ2FzZSYgRnJvbnRDYXNlID0gKkNSLlJhbmdlLmZpcnN0OworICBDYXNlJiBCYWNrQ2FzZSAgPSAqKENSLlJhbmdlLnNlY29uZC0xKTsKKyAgY29uc3QgQmFzaWNCbG9jayAqTExWTUJCID0gQ1IuQ2FzZUJCLT5nZXRCYXNpY0Jsb2NrKCk7CisKKyAgLy8gU2l6ZSBpcyB0aGUgbnVtYmVyIG9mIENhc2VzIHJlcHJlc2VudGVkIGJ5IHRoaXMgcmFuZ2UuCisgIHVuc2lnbmVkIFNpemUgPSBDUi5SYW5nZS5zZWNvbmQgLSBDUi5SYW5nZS5maXJzdDsKKworICBjb25zdCBBUEludCAmRmlyc3QgPSBjYXN0PENvbnN0YW50SW50PihGcm9udENhc2UuTG93KS0+Z2V0VmFsdWUoKTsKKyAgY29uc3QgQVBJbnQgJkxhc3QgID0gY2FzdDxDb25zdGFudEludD4oQmFja0Nhc2UuSGlnaCktPmdldFZhbHVlKCk7CisgIGRvdWJsZSBGTWV0cmljID0gMDsKKyAgQ2FzZUl0ciBQaXZvdCA9IENSLlJhbmdlLmZpcnN0ICsgU2l6ZS8yOworCisgIC8vIFNlbGVjdCBvcHRpbWFsIHBpdm90LCBtYXhpbWl6aW5nIHN1bSBkZW5zaXR5IG9mIExIUyBhbmQgUkhTLiBUaGlzIHdpbGwKKyAgLy8gKGhldXJpc3RpY2FsbHkpIGFsbG93IHVzIHRvIGVtaXQgSnVtcFRhYmxlJ3MgbGF0ZXIuCisgIEFQSW50IFRTaXplKEZpcnN0LmdldEJpdFdpZHRoKCksIDApOworICBmb3IgKENhc2VJdHIgSSA9IENSLlJhbmdlLmZpcnN0LCBFID0gQ1IuUmFuZ2Uuc2Vjb25kOworICAgICAgIEkhPUU7ICsrSSkKKyAgICBUU2l6ZSArPSBJLT5zaXplKCk7CisKKyAgQVBJbnQgTFNpemUgPSBGcm9udENhc2Uuc2l6ZSgpOworICBBUEludCBSU2l6ZSA9IFRTaXplLUxTaXplOworICBERUJVRyhkYmdzKCkgPDwgIlNlbGVjdGluZyBiZXN0IHBpdm90OiBcbiIKKyAgICAgICAgICAgICAgIDw8ICJGaXJzdDogIiA8PCBGaXJzdCA8PCAiLCBMYXN0OiAiIDw8IExhc3QgPDwnXG4nCisgICAgICAgICAgICAgICA8PCAiTFNpemU6ICIgPDwgTFNpemUgPDwgIiwgUlNpemU6ICIgPDwgUlNpemUgPDwgJ1xuJyk7CisgIGZvciAoQ2FzZUl0ciBJID0gQ1IuUmFuZ2UuZmlyc3QsIEo9SSsxLCBFID0gQ1IuUmFuZ2Uuc2Vjb25kOworICAgICAgIEohPUU7ICsrSSwgKytKKSB7CisgICAgY29uc3QgQVBJbnQgJkxFbmQgPSBjYXN0PENvbnN0YW50SW50PihJLT5IaWdoKS0+Z2V0VmFsdWUoKTsKKyAgICBjb25zdCBBUEludCAmUkJlZ2luID0gY2FzdDxDb25zdGFudEludD4oSi0+TG93KS0+Z2V0VmFsdWUoKTsKKyAgICBBUEludCBSYW5nZSA9IENvbXB1dGVSYW5nZShMRW5kLCBSQmVnaW4pOworICAgIGFzc2VydCgoUmFuZ2UgLSAyVUxMKS5pc05vbk5lZ2F0aXZlKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgY2FzZSBkaXN0YW5jZSIpOworICAgIGRvdWJsZSBMRGVuc2l0eSA9IChkb3VibGUpTFNpemUucm91bmRUb0RvdWJsZSgpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRW5kIC0gRmlyc3QgKyAxVUxMKS5yb3VuZFRvRG91YmxlKCk7CisgICAgZG91YmxlIFJEZW5zaXR5ID0gKGRvdWJsZSlSU2l6ZS5yb3VuZFRvRG91YmxlKCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKExhc3QgLSBSQmVnaW4gKyAxVUxMKS5yb3VuZFRvRG91YmxlKCk7CisgICAgZG91YmxlIE1ldHJpYyA9IFJhbmdlLmxvZ0Jhc2UyKCkqKExEZW5zaXR5K1JEZW5zaXR5KTsKKyAgICAvLyBTaG91bGQgYWx3YXlzIHNwbGl0IGluIHNvbWUgbm9uLXRyaXZpYWwgcGxhY2UKKyAgICBERUJVRyhkYmdzKCkgPDwiPT5TdGVwXG4iCisgICAgICAgICAgICAgICAgIDw8ICJMRW5kOiAiIDw8IExFbmQgPDwgIiwgUkJlZ2luOiAiIDw8IFJCZWdpbiA8PCAnXG4nCisgICAgICAgICAgICAgICAgIDw8ICJMRGVuc2l0eTogIiA8PCBMRGVuc2l0eQorICAgICAgICAgICAgICAgICA8PCAiLCBSRGVuc2l0eTogIiA8PCBSRGVuc2l0eSA8PCAnXG4nCisgICAgICAgICAgICAgICAgIDw8ICJNZXRyaWM6ICIgPDwgTWV0cmljIDw8ICdcbicpOworICAgIGlmIChGTWV0cmljIDwgTWV0cmljKSB7CisgICAgICBQaXZvdCA9IEo7CisgICAgICBGTWV0cmljID0gTWV0cmljOworICAgICAgREVCVUcoZGJncygpIDw8ICJDdXJyZW50IG1ldHJpYyBzZXQgdG86ICIgPDwgRk1ldHJpYyA8PCAnXG4nKTsKKyAgICB9CisKKyAgICBMU2l6ZSArPSBKLT5zaXplKCk7CisgICAgUlNpemUgLT0gSi0+c2l6ZSgpOworICB9CisgIGlmIChhcmVKVHNBbGxvd2VkKFRMSSkpIHsKKyAgICAvLyBJZiBvdXIgY2FzZSBpcyBkZW5zZSB3ZSAqcmVhbGx5KiBzaG91bGQgaGFuZGxlIGl0IGVhcmxpZXIhCisgICAgYXNzZXJ0KChGTWV0cmljID4gMCkgJiYgIlNob3VsZCBoYW5kbGUgZGVuc2UgcmFuZ2UgZWFybGllciEiKTsKKyAgfSBlbHNlIHsKKyAgICBQaXZvdCA9IENSLlJhbmdlLmZpcnN0ICsgU2l6ZS8yOworICB9CisKKyAgQ2FzZVJhbmdlIExIU1IoQ1IuUmFuZ2UuZmlyc3QsIFBpdm90KTsKKyAgQ2FzZVJhbmdlIFJIU1IoUGl2b3QsIENSLlJhbmdlLnNlY29uZCk7CisgIENvbnN0YW50ICpDID0gUGl2b3QtPkxvdzsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKkZhbHNlQkIgPSAwLCAqVHJ1ZUJCID0gMDsKKworICAvLyBXZSBrbm93IHRoYXQgd2UgYnJhbmNoIHRvIHRoZSBMSFMgaWYgdGhlIFZhbHVlIGJlaW5nIHN3aXRjaGVkIG9uIGlzCisgIC8vIGxlc3MgdGhhbiB0aGUgUGl2b3QgdmFsdWUsIEMuICBXZSB1c2UgdGhpcyB0byBvcHRpbWl6ZSBvdXIgYmluYXJ5CisgIC8vIHRyZWUgYSBiaXQsIGJ5IHJlY29nbml6aW5nIHRoYXQgaWYgU1YgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQorICAvLyBMSFMncyBDYXNlIFZhbHVlLCBhbmQgdGhhdCBDYXNlIFZhbHVlIGlzIGV4YWN0bHkgb25lIGxlc3MgdGhhbiB0aGUKKyAgLy8gUGl2b3QncyBWYWx1ZSwgdGhlbiB3ZSBjYW4gYnJhbmNoIGRpcmVjdGx5IHRvIHRoZSBMSFMncyBUYXJnZXQsCisgIC8vIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbGVhZiBub2RlIGZvciBpdC4KKyAgaWYgKChMSFNSLnNlY29uZCAtIExIU1IuZmlyc3QpID09IDEgJiYKKyAgICAgIExIU1IuZmlyc3QtPkhpZ2ggPT0gQ1IuR0UgJiYKKyAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KEMpLT5nZXRWYWx1ZSgpID09CisgICAgICAoY2FzdDxDb25zdGFudEludD4oQ1IuR0UpLT5nZXRWYWx1ZSgpICsgMUxMKSkgeworICAgIFRydWVCQiA9IExIU1IuZmlyc3QtPkJCOworICB9IGVsc2UgeworICAgIFRydWVCQiA9IEN1ck1GLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNQkIpOworICAgIEN1ck1GLT5pbnNlcnQoQkJJLCBUcnVlQkIpOworICAgIFdvcmtMaXN0LnB1c2hfYmFjayhDYXNlUmVjKFRydWVCQiwgQywgQ1IuR0UsIExIU1IpKTsKKworICAgIC8vIFB1dCBTViBpbiBhIHZpcnR1YWwgcmVnaXN0ZXIgdG8gbWFrZSBpdCBhdmFpbGFibGUgZnJvbSB0aGUgbmV3IGJsb2Nrcy4KKyAgICBFeHBvcnRGcm9tQ3VycmVudEJsb2NrKFNWKTsKKyAgfQorCisgIC8vIFNpbWlsYXIgdG8gdGhlIG9wdGltaXphdGlvbiBhYm92ZSwgaWYgdGhlIFZhbHVlIGJlaW5nIHN3aXRjaGVkIG9uIGlzCisgIC8vIGtub3duIHRvIGJlIGxlc3MgdGhhbiB0aGUgQ29uc3RhbnQgQ1IuTFQsIGFuZCB0aGUgY3VycmVudCBDYXNlIFZhbHVlCisgIC8vIGlzIENSLkxUIC0gMSwgdGhlbiB3ZSBjYW4gYnJhbmNoIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYmxvY2sgZm9yCisgIC8vIHRoZSBjdXJyZW50IENhc2UgVmFsdWUsIHJhdGhlciB0aGFuIGVtaXR0aW5nIGEgUkhTIGxlYWYgbm9kZSBmb3IgaXQuCisgIGlmICgoUkhTUi5zZWNvbmQgLSBSSFNSLmZpcnN0KSA9PSAxICYmIENSLkxUICYmCisgICAgICBjYXN0PENvbnN0YW50SW50PihSSFNSLmZpcnN0LT5Mb3cpLT5nZXRWYWx1ZSgpID09CisgICAgICAoY2FzdDxDb25zdGFudEludD4oQ1IuTFQpLT5nZXRWYWx1ZSgpIC0gMUxMKSkgeworICAgIEZhbHNlQkIgPSBSSFNSLmZpcnN0LT5CQjsKKyAgfSBlbHNlIHsKKyAgICBGYWxzZUJCID0gQ3VyTUYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1CQik7CisgICAgQ3VyTUYtPmluc2VydChCQkksIEZhbHNlQkIpOworICAgIFdvcmtMaXN0LnB1c2hfYmFjayhDYXNlUmVjKEZhbHNlQkIsQ1IuTFQsQyxSSFNSKSk7CisKKyAgICAvLyBQdXQgU1YgaW4gYSB2aXJ0dWFsIHJlZ2lzdGVyIHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZyb20gdGhlIG5ldyBibG9ja3MuCisgICAgRXhwb3J0RnJvbUN1cnJlbnRCbG9jayhTVik7CisgIH0KKworICAvLyBDcmVhdGUgYSBDYXNlQmxvY2sgcmVjb3JkIHJlcHJlc2VudGluZyBhIGNvbmRpdGlvbmFsIGJyYW5jaCB0bworICAvLyB0aGUgTEhTIG5vZGUgaWYgdGhlIHZhbHVlIGJlaW5nIHN3aXRjaGVkIG9uIFNWIGlzIGxlc3MgdGhhbiBDLgorICAvLyBPdGhlcndpc2UsIGJyYW5jaCB0byBMSFMuCisgIENhc2VCbG9jayBDQihJU0Q6OlNFVExULCBTViwgQywgTlVMTCwgVHJ1ZUJCLCBGYWxzZUJCLCBDUi5DYXNlQkIpOworCisgIGlmIChDUi5DYXNlQkIgPT0gU3dpdGNoQkIpCisgICAgdmlzaXRTd2l0Y2hDYXNlKENCLCBTd2l0Y2hCQik7CisgIGVsc2UKKyAgICBTd2l0Y2hDYXNlcy5wdXNoX2JhY2soQ0IpOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gaGFuZGxlQml0VGVzdHNTd2l0Y2hDYXNlIC0gaWYgY3VycmVudCBjYXNlIHJhbmdlIGhhcyBmZXcgZGVzdGluYXRpb24gYW5kCisvLy8gcmFuZ2Ugc3BhbiBsZXNzLCB0aGFuIG1hY2hpbmUgd29yZCBiaXR3aWR0aCwgZW5jb2RlIGNhc2UgcmFuZ2UgaW50byBzZXJpZXMKKy8vLyBvZiBtYXNrcyBhbmQgZW1pdCBiaXQgdGVzdHMgd2l0aCB0aGVzZSBtYXNrcy4KK2Jvb2wgU2VsZWN0aW9uREFHQnVpbGRlcjo6aGFuZGxlQml0VGVzdHNTd2l0Y2hDYXNlKENhc2VSZWMmIENSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzZVJlY1ZlY3RvciYgV29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSogU1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTd2l0Y2hCQil7CisgIEVWVCBQVHkgPSBUTEkuZ2V0UG9pbnRlclR5KCk7CisgIHVuc2lnbmVkIEludFB0ckJpdHMgPSBQVHkuZ2V0U2l6ZUluQml0cygpOworCisgIENhc2UmIEZyb250Q2FzZSA9ICpDUi5SYW5nZS5maXJzdDsKKyAgQ2FzZSYgQmFja0Nhc2UgID0gKihDUi5SYW5nZS5zZWNvbmQtMSk7CisKKyAgLy8gR2V0IHRoZSBNYWNoaW5lRnVuY3Rpb24gd2hpY2ggaG9sZHMgdGhlIGN1cnJlbnQgTUJCLiAgVGhpcyBpcyB1c2VkIHdoZW4KKyAgLy8gaW5zZXJ0aW5nIGFueSBhZGRpdGlvbmFsIE1CQnMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCB0aGUgc3dpdGNoLgorICBNYWNoaW5lRnVuY3Rpb24gKkN1ck1GID0gRnVuY0luZm8uTUY7CisKKyAgLy8gSWYgdGFyZ2V0IGRvZXMgbm90IGhhdmUgbGVnYWwgc2hpZnQgbGVmdCwgZG8gbm90IGVtaXQgYml0IHRlc3RzIGF0IGFsbC4KKyAgaWYgKCFUTEkuaXNPcGVyYXRpb25MZWdhbChJU0Q6OlNITCwgVExJLmdldFBvaW50ZXJUeSgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc2l6ZV90IG51bUNtcHMgPSAwOworICBmb3IgKENhc2VJdHIgSSA9IENSLlJhbmdlLmZpcnN0LCBFID0gQ1IuUmFuZ2Uuc2Vjb25kOworICAgICAgIEkhPUU7ICsrSSkgeworICAgIC8vIFNpbmdsZSBjYXNlIGNvdW50cyBvbmUsIGNhc2UgcmFuZ2UgLSB0d28uCisgICAgbnVtQ21wcyArPSAoSS0+TG93ID09IEktPkhpZ2ggPyAxIDogMik7CisgIH0KKworICAvLyBDb3VudCB1bmlxdWUgZGVzdGluYXRpb25zCisgIFNtYWxsU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwgND4gRGVzdHM7CisgIGZvciAoQ2FzZUl0ciBJID0gQ1IuUmFuZ2UuZmlyc3QsIEUgPSBDUi5SYW5nZS5zZWNvbmQ7IEkhPUU7ICsrSSkgeworICAgIERlc3RzLmluc2VydChJLT5CQik7CisgICAgaWYgKERlc3RzLnNpemUoKSA+IDMpCisgICAgICAvLyBEb24ndCBib3RoZXIgdGhlIGNvZGUgYmVsb3csIGlmIHRoZXJlIGFyZSB0b28gbXVjaCB1bmlxdWUgZGVzdGluYXRpb25zCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgREVCVUcoZGJncygpIDw8ICJUb3RhbCBudW1iZXIgb2YgdW5pcXVlIGRlc3RpbmF0aW9uczogIgorICAgICAgICA8PCBEZXN0cy5zaXplKCkgPDwgJ1xuJworICAgICAgICA8PCAiVG90YWwgbnVtYmVyIG9mIGNvbXBhcmlzb25zOiAiIDw8IG51bUNtcHMgPDwgJ1xuJyk7CisKKyAgLy8gQ29tcHV0ZSBzcGFuIG9mIHZhbHVlcy4KKyAgY29uc3QgQVBJbnQmIG1pblZhbHVlID0gY2FzdDxDb25zdGFudEludD4oRnJvbnRDYXNlLkxvdyktPmdldFZhbHVlKCk7CisgIGNvbnN0IEFQSW50JiBtYXhWYWx1ZSA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEJhY2tDYXNlLkhpZ2gpLT5nZXRWYWx1ZSgpOworICBBUEludCBjbXBSYW5nZSA9IG1heFZhbHVlIC0gbWluVmFsdWU7CisKKyAgREVCVUcoZGJncygpIDw8ICJDb21wYXJlIHJhbmdlOiAiIDw8IGNtcFJhbmdlIDw8ICdcbicKKyAgICAgICAgICAgICAgIDw8ICJMb3cgYm91bmQ6ICIgPDwgbWluVmFsdWUgPDwgJ1xuJworICAgICAgICAgICAgICAgPDwgIkhpZ2ggYm91bmQ6ICIgPDwgbWF4VmFsdWUgPDwgJ1xuJyk7CisKKyAgaWYgKGNtcFJhbmdlLnVnZShJbnRQdHJCaXRzKSB8fAorICAgICAgKCEoRGVzdHMuc2l6ZSgpID09IDEgJiYgbnVtQ21wcyA+PSAzKSAmJgorICAgICAgICEoRGVzdHMuc2l6ZSgpID09IDIgJiYgbnVtQ21wcyA+PSA1KSAmJgorICAgICAgICEoRGVzdHMuc2l6ZSgpID49IDMgJiYgbnVtQ21wcyA+PSA2KSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIERFQlVHKGRiZ3MoKSA8PCAiRW1pdHRpbmcgYml0IHRlc3RzXG4iKTsKKyAgQVBJbnQgbG93Qm91bmQgPSBBUEludDo6Z2V0TnVsbFZhbHVlKGNtcFJhbmdlLmdldEJpdFdpZHRoKCkpOworCisgIC8vIE9wdGltaXplIHRoZSBjYXNlIHdoZXJlIGFsbCB0aGUgY2FzZSB2YWx1ZXMgZml0IGluIGEKKyAgLy8gd29yZCB3aXRob3V0IGhhdmluZyB0byBzdWJ0cmFjdCBtaW5WYWx1ZS4gSW4gdGhpcyBjYXNlLAorICAvLyB3ZSBjYW4gb3B0aW1pemUgYXdheSB0aGUgc3VidHJhY3Rpb24uCisgIGlmIChtaW5WYWx1ZS5pc05vbk5lZ2F0aXZlKCkgJiYgbWF4VmFsdWUuc2x0KEludFB0ckJpdHMpKSB7CisgICAgY21wUmFuZ2UgPSBtYXhWYWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBsb3dCb3VuZCA9IG1pblZhbHVlOworICB9CisKKyAgQ2FzZUJpdHNWZWN0b3IgQ2FzZXNCaXRzOworICB1bnNpZ25lZCBpLCBjb3VudCA9IDA7CisKKyAgZm9yIChDYXNlSXRyIEkgPSBDUi5SYW5nZS5maXJzdCwgRSA9IENSLlJhbmdlLnNlY29uZDsgSSE9RTsgKytJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIERlc3QgPSBJLT5CQjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICAgIGlmIChEZXN0ID09IENhc2VzQml0c1tpXS5CQikKKyAgICAgICAgYnJlYWs7CisKKyAgICBpZiAoaSA9PSBjb3VudCkgeworICAgICAgYXNzZXJ0KChjb3VudCA8IDMpICYmICJUb28gbXVjaCBkZXN0aW5hdGlvbnMgdG8gdGVzdCEiKTsKKyAgICAgIENhc2VzQml0cy5wdXNoX2JhY2soQ2FzZUJpdHMoMCwgRGVzdCwgMCkpOworICAgICAgY291bnQrKzsKKyAgICB9CisKKyAgICBjb25zdCBBUEludCYgbG93VmFsdWUgPSBjYXN0PENvbnN0YW50SW50PihJLT5Mb3cpLT5nZXRWYWx1ZSgpOworICAgIGNvbnN0IEFQSW50JiBoaWdoVmFsdWUgPSBjYXN0PENvbnN0YW50SW50PihJLT5IaWdoKS0+Z2V0VmFsdWUoKTsKKworICAgIHVpbnQ2NF90IGxvID0gKGxvd1ZhbHVlIC0gbG93Qm91bmQpLmdldFpFeHRWYWx1ZSgpOworICAgIHVpbnQ2NF90IGhpID0gKGhpZ2hWYWx1ZSAtIGxvd0JvdW5kKS5nZXRaRXh0VmFsdWUoKTsKKworICAgIGZvciAodWludDY0X3QgaiA9IGxvOyBqIDw9IGhpOyBqKyspIHsKKyAgICAgIENhc2VzQml0c1tpXS5NYXNrIHw9ICAxVUxMIDw8IGo7CisgICAgICBDYXNlc0JpdHNbaV0uQml0cysrOworICAgIH0KKworICB9CisgIHN0ZDo6c29ydChDYXNlc0JpdHMuYmVnaW4oKSwgQ2FzZXNCaXRzLmVuZCgpLCBDYXNlQml0c0NtcCgpKTsKKworICBCaXRUZXN0SW5mbyBCVEM7CisKKyAgLy8gRmlndXJlIG91dCB3aGljaCBibG9jayBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCBvbmUuCisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgQkJJID0gQ1IuQ2FzZUJCOworICArK0JCSTsKKworICBjb25zdCBCYXNpY0Jsb2NrICpMTFZNQkIgPSBDUi5DYXNlQkItPmdldEJhc2ljQmxvY2soKTsKKworICBERUJVRyhkYmdzKCkgPDwgIkNhc2VzOlxuIik7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDYXNlc0JpdHMuc2l6ZSgpOyBpIT1lOyArK2kpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIk1hc2s6ICIgPDwgQ2FzZXNCaXRzW2ldLk1hc2sKKyAgICAgICAgICAgICAgICAgPDwgIiwgQml0czogIiA8PCBDYXNlc0JpdHNbaV0uQml0cworICAgICAgICAgICAgICAgICA8PCAiLCBCQjogIiA8PCBDYXNlc0JpdHNbaV0uQkIgPDwgJ1xuJyk7CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqQ2FzZUJCID0gQ3VyTUYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1CQik7CisgICAgQ3VyTUYtPmluc2VydChCQkksIENhc2VCQik7CisgICAgQlRDLnB1c2hfYmFjayhCaXRUZXN0Q2FzZShDYXNlc0JpdHNbaV0uTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc2VCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc2VzQml0c1tpXS5CQikpOworCisgICAgLy8gUHV0IFNWIGluIGEgdmlydHVhbCByZWdpc3RlciB0byBtYWtlIGl0IGF2YWlsYWJsZSBmcm9tIHRoZSBuZXcgYmxvY2tzLgorICAgIEV4cG9ydEZyb21DdXJyZW50QmxvY2soU1YpOworICB9CisKKyAgQml0VGVzdEJsb2NrIEJUQihsb3dCb3VuZCwgY21wUmFuZ2UsIFNWLAorICAgICAgICAgICAgICAgICAgIC0xVSwgKENSLkNhc2VCQiA9PSBTd2l0Y2hCQiksCisgICAgICAgICAgICAgICAgICAgQ1IuQ2FzZUJCLCBEZWZhdWx0LCBCVEMpOworCisgIGlmIChDUi5DYXNlQkIgPT0gU3dpdGNoQkIpCisgICAgdmlzaXRCaXRUZXN0SGVhZGVyKEJUQiwgU3dpdGNoQkIpOworCisgIEJpdFRlc3RDYXNlcy5wdXNoX2JhY2soQlRCKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIENsdXN0ZXJpZnkgLSBUcmFuc2Zvcm0gc2ltcGxlIGxpc3Qgb2YgQ2FzZXMgaW50byBsaXN0IG9mIENhc2VSYW5nZSdzCitzaXplX3QgU2VsZWN0aW9uREFHQnVpbGRlcjo6Q2x1c3RlcmlmeShDYXNlVmVjdG9yJiBDYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3aXRjaEluc3QmIFNJKSB7CisgIHNpemVfdCBudW1DbXBzID0gMDsKKworICAvLyBTdGFydCB3aXRoICJzaW1wbGUiIGNhc2VzCisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgU0kuZ2V0TnVtU3VjY2Vzc29ycygpOyArK2kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqU01CQiA9IEZ1bmNJbmZvLk1CQk1hcFtTSS5nZXRTdWNjZXNzb3IoaSldOworICAgIENhc2VzLnB1c2hfYmFjayhDYXNlKFNJLmdldFN1Y2Nlc3NvclZhbHVlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNJLmdldFN1Y2Nlc3NvclZhbHVlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNNQkIpKTsKKyAgfQorICBzdGQ6OnNvcnQoQ2FzZXMuYmVnaW4oKSwgQ2FzZXMuZW5kKCksIENhc2VDbXAoKSk7CisKKyAgLy8gTWVyZ2UgY2FzZSBpbnRvIGNsdXN0ZXJzCisgIGlmIChDYXNlcy5zaXplKCkgPj0gMikKKyAgICAvLyBNdXN0IHJlY29tcHV0ZSBlbmQoKSBlYWNoIGl0ZXJhdGlvbiBiZWNhdXNlIGl0IG1heSBiZQorICAgIC8vIGludmFsaWRhdGVkIGJ5IGVyYXNlIGlmIHdlIGhvbGQgb24gdG8gaXQKKyAgICBmb3IgKENhc2VJdHIgSSA9IENhc2VzLmJlZ2luKCksIEogPSArKyhDYXNlcy5iZWdpbigpKTsgSiAhPSBDYXNlcy5lbmQoKTsgKSB7CisgICAgICBjb25zdCBBUEludCYgbmV4dFZhbHVlID0gY2FzdDxDb25zdGFudEludD4oSi0+TG93KS0+Z2V0VmFsdWUoKTsKKyAgICAgIGNvbnN0IEFQSW50JiBjdXJyZW50VmFsdWUgPSBjYXN0PENvbnN0YW50SW50PihJLT5IaWdoKS0+Z2V0VmFsdWUoKTsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBuZXh0QkIgPSBKLT5CQjsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBjdXJyZW50QkIgPSBJLT5CQjsKKworICAgICAgLy8gSWYgdGhlIHR3byBuZWlnaGJvcmluZyBjYXNlcyBnbyB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiwgbWVyZ2UgdGhlbQorICAgICAgLy8gaW50byBhIHNpbmdsZSBjYXNlLgorICAgICAgaWYgKChuZXh0VmFsdWUgLSBjdXJyZW50VmFsdWUgPT0gMSkgJiYgKGN1cnJlbnRCQiA9PSBuZXh0QkIpKSB7CisgICAgICAgIEktPkhpZ2ggPSBKLT5IaWdoOworICAgICAgICBKID0gQ2FzZXMuZXJhc2UoSik7CisgICAgICB9IGVsc2UgeworICAgICAgICBJID0gSisrOworICAgICAgfQorICAgIH0KKworICBmb3IgKENhc2VJdHIgST1DYXNlcy5iZWdpbigpLCBFPUNhc2VzLmVuZCgpOyBJIT1FOyArK0ksICsrbnVtQ21wcykgeworICAgIGlmIChJLT5Mb3cgIT0gSS0+SGlnaCkKKyAgICAgIC8vIEEgcmFuZ2UgY291bnRzIGRvdWJsZSwgc2luY2UgaXQgcmVxdWlyZXMgdHdvIGNvbXBhcmVzLgorICAgICAgKytudW1DbXBzOworICB9CisKKyAgcmV0dXJuIG51bUNtcHM7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRTd2l0Y2goY29uc3QgU3dpdGNoSW5zdCAmU0kpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaE1CQiA9IEZ1bmNJbmZvLk1CQjsKKworICAvLyBGaWd1cmUgb3V0IHdoaWNoIGJsb2NrIGlzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50IG9uZS4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKk5leHRCbG9jayA9IDA7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpEZWZhdWx0ID0gRnVuY0luZm8uTUJCTWFwW1NJLmdldERlZmF1bHREZXN0KCldOworCisgIC8vIElmIHRoZXJlIGlzIG9ubHkgdGhlIGRlZmF1bHQgZGVzdGluYXRpb24sIGJyYW5jaCB0byBpdCBpZiBpdCBpcyBub3QgdGhlCisgIC8vIG5leHQgYmFzaWMgYmxvY2suICBPdGhlcndpc2UsIGp1c3QgZmFsbCB0aHJvdWdoLgorICBpZiAoU0kuZ2V0TnVtT3BlcmFuZHMoKSA9PSAyKSB7CisgICAgLy8gVXBkYXRlIG1hY2hpbmUtQ0ZHIGVkZ2VzLgorCisgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBmYWxsLXRocm91Z2ggYnJhbmNoLCBlbWl0IHRoZSBicmFuY2guCisgICAgU3dpdGNoTUJCLT5hZGRTdWNjZXNzb3IoRGVmYXVsdCk7CisgICAgaWYgKERlZmF1bHQgIT0gTmV4dEJsb2NrKQorICAgICAgREFHLnNldFJvb3QoREFHLmdldE5vZGUoSVNEOjpCUiwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsIGdldENvbnRyb2xSb290KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0QmFzaWNCbG9jayhEZWZhdWx0KSkpOworCisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSWYgdGhlcmUgYXJlIGFueSBub24tZGVmYXVsdCBjYXNlIHN0YXRlbWVudHMsIGNyZWF0ZSBhIHZlY3RvciBvZiBDYXNlcworICAvLyByZXByZXNlbnRpbmcgZWFjaCBvbmUsIGFuZCBzb3J0IHRoZSB2ZWN0b3Igc28gdGhhdCB3ZSBjYW4gZWZmaWNpZW50bHkKKyAgLy8gY3JlYXRlIGEgYmluYXJ5IHNlYXJjaCB0cmVlIGZyb20gdGhlbS4KKyAgQ2FzZVZlY3RvciBDYXNlczsKKyAgc2l6ZV90IG51bUNtcHMgPSBDbHVzdGVyaWZ5KENhc2VzLCBTSSk7CisgIERFQlVHKGRiZ3MoKSA8PCAiQ2x1c3RlcmlmeSBmaW5pc2hlZC4gVG90YWwgY2x1c3RlcnM6ICIgPDwgQ2FzZXMuc2l6ZSgpCisgICAgICAgICAgICAgICA8PCAiLiBUb3RhbCBjb21wYXJlczogIiA8PCBudW1DbXBzIDw8ICdcbicpOworICBudW1DbXBzID0gMDsKKworICAvLyBHZXQgdGhlIFZhbHVlIHRvIGJlIHN3aXRjaGVkIG9uIGFuZCBkZWZhdWx0IGJhc2ljIGJsb2Nrcywgd2hpY2ggd2lsbCBiZQorICAvLyBpbnNlcnRlZCBpbnRvIENhc2VCbG9jayByZWNvcmRzLCByZXByZXNlbnRpbmcgYmFzaWMgYmxvY2tzIGluIHRoZSBiaW5hcnkKKyAgLy8gc2VhcmNoIHRyZWUuCisgIGNvbnN0IFZhbHVlICpTViA9IFNJLmdldE9wZXJhbmQoMCk7CisKKyAgLy8gUHVzaCB0aGUgaW5pdGlhbCBDYXNlUmVjIG9udG8gdGhlIHdvcmtsaXN0CisgIENhc2VSZWNWZWN0b3IgV29ya0xpc3Q7CisgIFdvcmtMaXN0LnB1c2hfYmFjayhDYXNlUmVjKFN3aXRjaE1CQiwwLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc2VSYW5nZShDYXNlcy5iZWdpbigpLENhc2VzLmVuZCgpKSkpOworCisgIHdoaWxlICghV29ya0xpc3QuZW1wdHkoKSkgeworICAgIC8vIEdyYWIgYSByZWNvcmQgcmVwcmVzZW50aW5nIGEgY2FzZSByYW5nZSB0byBwcm9jZXNzIG9mZiB0aGUgd29ya2xpc3QKKyAgICBDYXNlUmVjIENSID0gV29ya0xpc3QuYmFjaygpOworICAgIFdvcmtMaXN0LnBvcF9iYWNrKCk7CisKKyAgICBpZiAoaGFuZGxlQml0VGVzdHNTd2l0Y2hDYXNlKENSLCBXb3JrTGlzdCwgU1YsIERlZmF1bHQsIFN3aXRjaE1CQikpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIElmIHRoZSByYW5nZSBoYXMgZmV3IGNhc2VzICh0d28gb3IgbGVzcykgZW1pdCBhIHNlcmllcyBvZiBzcGVjaWZpYworICAgIC8vIHRlc3RzLgorICAgIGlmIChoYW5kbGVTbWFsbFN3aXRjaFJhbmdlKENSLCBXb3JrTGlzdCwgU1YsIERlZmF1bHQsIFN3aXRjaE1CQikpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIElmIHRoZSBzd2l0Y2ggaGFzIG1vcmUgdGhhbiA1IGJsb2NrcywgYW5kIGF0IGxlYXN0IDQwJSBkZW5zZSwgYW5kIHRoZQorICAgIC8vIHRhcmdldCBzdXBwb3J0cyBpbmRpcmVjdCBicmFuY2hlcywgdGhlbiBlbWl0IGEganVtcCB0YWJsZSByYXRoZXIgdGhhbgorICAgIC8vIGxvd2VyaW5nIHRoZSBzd2l0Y2ggdG8gYSBiaW5hcnkgdHJlZSBvZiBjb25kaXRpb25hbCBicmFuY2hlcy4KKyAgICBpZiAoaGFuZGxlSlRTd2l0Y2hDYXNlKENSLCBXb3JrTGlzdCwgU1YsIERlZmF1bHQsIFN3aXRjaE1CQikpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEVtaXQgYmluYXJ5IHRyZWUuIFdlIG5lZWQgdG8gcGljayBhIHBpdm90LCBhbmQgcHVzaCBsZWZ0IGFuZCByaWdodCByYW5nZXMKKyAgICAvLyBvbnRvIHRoZSB3b3JrbGlzdC4gTGVhZnMgYXJlIGhhbmRsZWQgdmlhIGhhbmRsZVNtYWxsU3dpdGNoUmFuZ2UoKSBjYWxsLgorICAgIGhhbmRsZUJUU3BsaXRTd2l0Y2hDYXNlKENSLCBXb3JrTGlzdCwgU1YsIERlZmF1bHQsIFN3aXRjaE1CQik7CisgIH0KK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdEluZGlyZWN0QnIoY29uc3QgSW5kaXJlY3RCckluc3QgJkkpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKkluZGlyZWN0QnJNQkIgPSBGdW5jSW5mby5NQkI7CisKKyAgLy8gVXBkYXRlIG1hY2hpbmUtQ0ZHIGVkZ2VzIHdpdGggdW5pcXVlIHN1Y2Nlc3NvcnMuCisgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCAzMj4gc3VjY3M7CisgIHN1Y2NzLnJlc2VydmUoSS5nZXROdW1TdWNjZXNzb3JzKCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS5nZXROdW1TdWNjZXNzb3JzKCk7IGkgIT0gZTsgKytpKQorICAgIHN1Y2NzLnB1c2hfYmFjayhJLmdldFN1Y2Nlc3NvcihpKSk7CisgIGFycmF5X3BvZF9zb3J0KHN1Y2NzLmJlZ2luKCksIHN1Y2NzLmVuZCgpKTsKKyAgc3VjY3MuZXJhc2Uoc3RkOjp1bmlxdWUoc3VjY3MuYmVnaW4oKSwgc3VjY3MuZW5kKCkpLCBzdWNjcy5lbmQoKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdWNjcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIEluZGlyZWN0QnJNQkItPmFkZFN1Y2Nlc3NvcihGdW5jSW5mby5NQkJNYXBbc3VjY3NbaV1dKTsKKworICBEQUcuc2V0Um9vdChEQUcuZ2V0Tm9kZShJU0Q6OkJSSU5ELCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBnZXRDb250cm9sUm9vdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZShJLmdldEFkZHJlc3MoKSkpKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdEZTdWIoY29uc3QgVXNlciAmSSkgeworICAvLyAtMC4wIC0gWCAtLT4gZm5lZworICBjb25zdCBUeXBlICpUeSA9IEkuZ2V0VHlwZSgpOworICBpZiAoVHktPmlzVmVjdG9yVHkoKSkgeworICAgIGlmIChDb25zdGFudFZlY3RvciAqQ1YgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oSS5nZXRPcGVyYW5kKDApKSkgeworICAgICAgY29uc3QgVmVjdG9yVHlwZSAqRGVzdFR5ID0gY2FzdDxWZWN0b3JUeXBlPihJLmdldFR5cGUoKSk7CisgICAgICBjb25zdCBUeXBlICpFbFR5ID0gRGVzdFR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgdW5zaWduZWQgVkwgPSBEZXN0VHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IE5aKFZMLCBDb25zdGFudEZQOjpnZXROZWdhdGl2ZVplcm8oRWxUeSkpOworICAgICAgQ29uc3RhbnQgKkNOWiA9IENvbnN0YW50VmVjdG9yOjpnZXQoJk5aWzBdLCBOWi5zaXplKCkpOworICAgICAgaWYgKENWID09IENOWikgeworICAgICAgICBTRFZhbHVlIE9wMiA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgxKSk7CisgICAgICAgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkZORUcsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDIuZ2V0VmFsdWVUeXBlKCksIE9wMikpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKENvbnN0YW50RlAgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlA+KEkuZ2V0T3BlcmFuZCgwKSkpCisgICAgaWYgKENGUC0+aXNFeGFjdGx5VmFsdWUoQ29uc3RhbnRGUDo6Z2V0TmVnYXRpdmVaZXJvKFR5KS0+Z2V0VmFsdWVBUEYoKSkpIHsKKyAgICAgIFNEVmFsdWUgT3AyID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkZORUcsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AyLmdldFZhbHVlVHlwZSgpLCBPcDIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdmlzaXRCaW5hcnkoSSwgSVNEOjpGU1VCKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdEJpbmFyeShjb25zdCBVc2VyICZJLCB1bnNpZ25lZCBPcENvZGUpIHsKKyAgU0RWYWx1ZSBPcDEgPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIE9wMiA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgxKSk7CisgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShPcENvZGUsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDEuZ2V0VmFsdWVUeXBlKCksIE9wMSwgT3AyKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRTaGlmdChjb25zdCBVc2VyICZJLCB1bnNpZ25lZCBPcGNvZGUpIHsKKyAgU0RWYWx1ZSBPcDEgPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIE9wMiA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgxKSk7CisgIGlmICghSS5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSAmJgorICAgICAgT3AyLmdldFZhbHVlVHlwZSgpICE9IFRMSS5nZXRTaGlmdEFtb3VudFR5KCkpIHsKKyAgICAvLyBJZiB0aGUgb3BlcmFuZCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNoaWZ0IGNvdW50IHR5cGUsIHByb21vdGUgaXQuCisgICAgRVZUIFBUeSA9IFRMSS5nZXRQb2ludGVyVHkoKTsKKyAgICBFVlQgU1R5ID0gVExJLmdldFNoaWZ0QW1vdW50VHkoKTsKKyAgICBpZiAoU1R5LmJpdHNHVChPcDIuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgT3AyID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFNoaWZ0QW1vdW50VHkoKSwgT3AyKTsKKyAgICAvLyBJZiB0aGUgb3BlcmFuZCBpcyBsYXJnZXIgdGhhbiB0aGUgc2hpZnQgY291bnQgdHlwZSBidXQgdGhlIHNoaWZ0CisgICAgLy8gY291bnQgdHlwZSBoYXMgZW5vdWdoIGJpdHMgdG8gcmVwcmVzZW50IGFueSBzaGlmdCB2YWx1ZSwgdHJ1bmNhdGUKKyAgICAvLyBpdCBub3cuIFRoaXMgaXMgYSBjb21tb24gY2FzZSBhbmQgaXQgZXhwb3NlcyB0aGUgdHJ1bmNhdGUgdG8KKyAgICAvLyBvcHRpbWl6YXRpb24gZWFybHkuCisgICAgZWxzZSBpZiAoU1R5LmdldFNpemVJbkJpdHMoKSA+PQorICAgICAgICAgICAgIExvZzJfMzJfQ2VpbChPcDIuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpKSkKKyAgICAgIE9wMiA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0U2hpZnRBbW91bnRUeSgpLCBPcDIpOworICAgIC8vIE90aGVyd2lzZSB3ZSdsbCBuZWVkIHRvIHRlbXBvcmFyaWx5IHNldHRsZSBmb3Igc29tZSBvdGhlcgorICAgIC8vIGNvbnZlbmllbnQgdHlwZTsgdHlwZSBsZWdhbGl6YXRpb24gd2lsbCBtYWtlIGFkanVzdG1lbnRzIGFzCisgICAgLy8gbmVlZGVkLgorICAgIGVsc2UgaWYgKFBUeS5iaXRzTFQoT3AyLmdldFZhbHVlVHlwZSgpKSkKKyAgICAgIE9wMiA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCksIE9wMik7CisgICAgZWxzZSBpZiAoUFR5LmJpdHNHVChPcDIuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgT3AyID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpLCBPcDIpOworICB9CisKKyAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKE9wY29kZSwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wMS5nZXRWYWx1ZVR5cGUoKSwgT3AxLCBPcDIpKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdElDbXAoY29uc3QgVXNlciAmSSkgeworICBJQ21wSW5zdDo6UHJlZGljYXRlIHByZWRpY2F0ZSA9IElDbXBJbnN0OjpCQURfSUNNUF9QUkVESUNBVEU7CisgIGlmIChjb25zdCBJQ21wSW5zdCAqSUMgPSBkeW5fY2FzdDxJQ21wSW5zdD4oJkkpKQorICAgIHByZWRpY2F0ZSA9IElDLT5nZXRQcmVkaWNhdGUoKTsKKyAgZWxzZSBpZiAoY29uc3QgQ29uc3RhbnRFeHByICpJQyA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oJkkpKQorICAgIHByZWRpY2F0ZSA9IElDbXBJbnN0OjpQcmVkaWNhdGUoSUMtPmdldFByZWRpY2F0ZSgpKTsKKyAgU0RWYWx1ZSBPcDEgPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIE9wMiA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgxKSk7CisgIElTRDo6Q29uZENvZGUgT3Bjb2RlID0gZ2V0SUNtcENvbmRDb2RlKHByZWRpY2F0ZSk7CisKKyAgRVZUIERlc3RWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldFNldENDKGdldEN1ckRlYnVnTG9jKCksIERlc3RWVCwgT3AxLCBPcDIsIE9wY29kZSkpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0RkNtcChjb25zdCBVc2VyICZJKSB7CisgIEZDbXBJbnN0OjpQcmVkaWNhdGUgcHJlZGljYXRlID0gRkNtcEluc3Q6OkJBRF9GQ01QX1BSRURJQ0FURTsKKyAgaWYgKGNvbnN0IEZDbXBJbnN0ICpGQyA9IGR5bl9jYXN0PEZDbXBJbnN0PigmSSkpCisgICAgcHJlZGljYXRlID0gRkMtPmdldFByZWRpY2F0ZSgpOworICBlbHNlIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkZDID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPigmSSkpCisgICAgcHJlZGljYXRlID0gRkNtcEluc3Q6OlByZWRpY2F0ZShGQy0+Z2V0UHJlZGljYXRlKCkpOworICBTRFZhbHVlIE9wMSA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSk7CisgIFNEVmFsdWUgT3AyID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDEpKTsKKyAgSVNEOjpDb25kQ29kZSBDb25kaXRpb24gPSBnZXRGQ21wQ29uZENvZGUocHJlZGljYXRlKTsKKyAgRVZUIERlc3RWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldFNldENDKGdldEN1ckRlYnVnTG9jKCksIERlc3RWVCwgT3AxLCBPcDIsIENvbmRpdGlvbikpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0U2VsZWN0KGNvbnN0IFVzZXIgJkkpIHsKKyAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWx1ZVZUczsKKyAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgSS5nZXRUeXBlKCksIFZhbHVlVlRzKTsKKyAgdW5zaWduZWQgTnVtVmFsdWVzID0gVmFsdWVWVHMuc2l6ZSgpOworICBpZiAoTnVtVmFsdWVzID09IDApIHJldHVybjsKKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBWYWx1ZXMoTnVtVmFsdWVzKTsKKyAgU0RWYWx1ZSBDb25kICAgICA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSk7CisgIFNEVmFsdWUgVHJ1ZVZhbCAgPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMSkpOworICBTRFZhbHVlIEZhbHNlVmFsID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDIpKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVZhbHVlczsgKytpKQorICAgIFZhbHVlc1tpXSA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVmFsLmdldE5vZGUoKS0+Z2V0VmFsdWVUeXBlKFRydWVWYWwuZ2V0UmVzTm8oKStpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVHJ1ZVZhbC5nZXROb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVmFsLmdldFJlc05vKCkgKyBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKEZhbHNlVmFsLmdldE5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlVmFsLmdldFJlc05vKCkgKyBpKSk7CisKKyAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKElTRDo6TUVSR0VfVkFMVUVTLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZUTGlzdCgmVmFsdWVWVHNbMF0sIE51bVZhbHVlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmVmFsdWVzWzBdLCBOdW1WYWx1ZXMpKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdFRydW5jKGNvbnN0IFVzZXIgJkkpIHsKKyAgLy8gVHJ1bmNJbnN0IGNhbm5vdCBiZSBhIG5vLW9wIGNhc3QgYmVjYXVzZSBzaXplb2Yoc3JjKSA+IHNpemVvZihkZXN0KS4KKyAgU0RWYWx1ZSBOID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDApKTsKKyAgRVZUIERlc3RWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZ2V0Q3VyRGVidWdMb2MoKSwgRGVzdFZULCBOKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRaRXh0KGNvbnN0IFVzZXIgJkkpIHsKKyAgLy8gWkV4dCBjYW5ub3QgYmUgYSBuby1vcCBjYXN0IGJlY2F1c2Ugc2l6ZW9mKHNyYykgPCBzaXplb2YoZGVzdCkuCisgIC8vIFpFeHQgYWxzbyBjYW4ndCBiZSBhIGNhc3QgdG8gYm9vbCBmb3Igc2FtZSByZWFzb24uIFNvLCBub3RoaW5nIG11Y2ggdG8gZG8KKyAgU0RWYWx1ZSBOID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDApKTsKKyAgRVZUIERlc3RWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZ2V0Q3VyRGVidWdMb2MoKSwgRGVzdFZULCBOKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRTRXh0KGNvbnN0IFVzZXIgJkkpIHsKKyAgLy8gU0V4dCBjYW5ub3QgYmUgYSBuby1vcCBjYXN0IGJlY2F1c2Ugc2l6ZW9mKHNyYykgPCBzaXplb2YoZGVzdCkuCisgIC8vIFNFeHQgYWxzbyBjYW4ndCBiZSBhIGNhc3QgdG8gYm9vbCBmb3Igc2FtZSByZWFzb24uIFNvLCBub3RoaW5nIG11Y2ggdG8gZG8KKyAgU0RWYWx1ZSBOID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDApKTsKKyAgRVZUIERlc3RWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgZ2V0Q3VyRGVidWdMb2MoKSwgRGVzdFZULCBOKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRGUFRydW5jKGNvbnN0IFVzZXIgJkkpIHsKKyAgLy8gRlBUcnVuYyBpcyBuZXZlciBhIG5vLW9wIGNhc3QsIG5vIG5lZWQgdG8gY2hlY2sKKyAgU0RWYWx1ZSBOID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDApKTsKKyAgRVZUIERlc3RWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpGUF9ST1VORCwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RWVCwgTiwgREFHLmdldEludFB0ckNvbnN0YW50KDApKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRGUEV4dChjb25zdCBVc2VyICZJKXsKKyAgLy8gRlBUcnVuYyBpcyBuZXZlciBhIG5vLW9wIGNhc3QsIG5vIG5lZWQgdG8gY2hlY2sKKyAgU0RWYWx1ZSBOID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDApKTsKKyAgRVZUIERlc3RWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpGUF9FWFRFTkQsIGdldEN1ckRlYnVnTG9jKCksIERlc3RWVCwgTikpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0RlBUb1VJKGNvbnN0IFVzZXIgJkkpIHsKKyAgLy8gRlBUb1VJIGlzIG5ldmVyIGEgbm8tb3AgY2FzdCwgbm8gbmVlZCB0byBjaGVjaworICBTRFZhbHVlIE4gPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMCkpOworICBFVlQgRGVzdFZUID0gVExJLmdldFZhbHVlVHlwZShJLmdldFR5cGUoKSk7CisgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1RPX1VJTlQsIGdldEN1ckRlYnVnTG9jKCksIERlc3RWVCwgTikpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0RlBUb1NJKGNvbnN0IFVzZXIgJkkpIHsKKyAgLy8gRlBUb1NJIGlzIG5ldmVyIGEgbm8tb3AgY2FzdCwgbm8gbmVlZCB0byBjaGVjaworICBTRFZhbHVlIE4gPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMCkpOworICBFVlQgRGVzdFZUID0gVExJLmdldFZhbHVlVHlwZShJLmdldFR5cGUoKSk7CisgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1RPX1NJTlQsIGdldEN1ckRlYnVnTG9jKCksIERlc3RWVCwgTikpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0VUlUb0ZQKGNvbnN0IFVzZXIgJkkpIHsKKyAgLy8gVUlUb0ZQIGlzIG5ldmVyIGEgbm8tb3AgY2FzdCwgbm8gbmVlZCB0byBjaGVjaworICBTRFZhbHVlIE4gPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMCkpOworICBFVlQgRGVzdFZUID0gVExJLmdldFZhbHVlVHlwZShJLmdldFR5cGUoKSk7CisgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OlVJTlRfVE9fRlAsIGdldEN1ckRlYnVnTG9jKCksIERlc3RWVCwgTikpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0U0lUb0ZQKGNvbnN0IFVzZXIgJkkpeworICAvLyBTSVRvRlAgaXMgbmV2ZXIgYSBuby1vcCBjYXN0LCBubyBuZWVkIHRvIGNoZWNrCisgIFNEVmFsdWUgTiA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSk7CisgIEVWVCBEZXN0VlQgPSBUTEkuZ2V0VmFsdWVUeXBlKEkuZ2V0VHlwZSgpKTsKKyAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKElTRDo6U0lOVF9UT19GUCwgZ2V0Q3VyRGVidWdMb2MoKSwgRGVzdFZULCBOKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRQdHJUb0ludChjb25zdCBVc2VyICZJKSB7CisgIC8vIFdoYXQgdG8gZG8gZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgaW50ZWdlciBhbmQgdGhlIHNpemUgb2YgdGhlIHBvaW50ZXIuCisgIC8vIFdlIGNhbiBlaXRoZXIgdHJ1bmNhdGUsIHplcm8gZXh0ZW5kLCBvciBuby1vcCwgYWNjb3JkaW5nbHkuCisgIFNEVmFsdWUgTiA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSk7CisgIEVWVCBEZXN0VlQgPSBUTEkuZ2V0VmFsdWVUeXBlKEkuZ2V0VHlwZSgpKTsKKyAgc2V0VmFsdWUoJkksIERBRy5nZXRaRXh0T3JUcnVuYyhOLCBnZXRDdXJEZWJ1Z0xvYygpLCBEZXN0VlQpKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdEludFRvUHRyKGNvbnN0IFVzZXIgJkkpIHsKKyAgLy8gV2hhdCB0byBkbyBkZXBlbmRzIG9uIHRoZSBzaXplIG9mIHRoZSBpbnRlZ2VyIGFuZCB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlci4KKyAgLy8gV2UgY2FuIGVpdGhlciB0cnVuY2F0ZSwgemVybyBleHRlbmQsIG9yIG5vLW9wLCBhY2NvcmRpbmdseS4KKyAgU0RWYWx1ZSBOID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDApKTsKKyAgRVZUIERlc3RWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldFpFeHRPclRydW5jKE4sIGdldEN1ckRlYnVnTG9jKCksIERlc3RWVCkpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0Qml0Q2FzdChjb25zdCBVc2VyICZJKSB7CisgIFNEVmFsdWUgTiA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSk7CisgIEVWVCBEZXN0VlQgPSBUTEkuZ2V0VmFsdWVUeXBlKEkuZ2V0VHlwZSgpKTsKKworICAvLyBCaXRDYXN0IGFzc3VyZXMgdXMgdGhhdCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUgc2FtZSBzaXplIHNvIHRoaXMgaXMKKyAgLy8gZWl0aGVyIGEgQklUX0NPTlZFUlQgb3IgYSBuby1vcC4KKyAgaWYgKERlc3RWVCAhPSBOLmdldFZhbHVlVHlwZSgpKQorICAgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0VlQsIE4pKTsgLy8gY29udmVydCB0eXBlcy4KKyAgZWxzZQorICAgIHNldFZhbHVlKCZJLCBOKTsgICAgICAgICAgICAvLyBub29wIGNhc3QuCit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRJbnNlcnRFbGVtZW50KGNvbnN0IFVzZXIgJkkpIHsKKyAgU0RWYWx1ZSBJblZlYyA9IGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSk7CisgIFNEVmFsdWUgSW5WYWwgPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMSkpOworICBTRFZhbHVlIEluSWR4ID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0T3BlcmFuZCgyKSkpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5WZWMsIEluVmFsLCBJbklkeCkpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0RXh0cmFjdEVsZW1lbnQoY29uc3QgVXNlciAmSSkgeworICBTRFZhbHVlIEluVmVjID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDApKTsKKyAgU0RWYWx1ZSBJbklkeCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMSkpKTsKKyAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFZhbHVlVHlwZShJLmdldFR5cGUoKSksIEluVmVjLCBJbklkeCkpOworfQorCisvLyBVdGlsaXR5IGZvciB2aXNpdFNodWZmbGVWZWN0b3IgLSBSZXR1cm5zIHRydWUgaWYgdGhlIG1hc2sgaXMgbWFzayBzdGFydGluZworLy8gZnJvbSBTSW5keCBhbmQgaW5jcmVhc2luZyB0byB0aGUgZWxlbWVudCBsZW5ndGggKHVuZGVmcyBhcmUgYWxsb3dlZCkuCitzdGF0aWMgYm9vbCBTZXF1ZW50aWFsTWFzayhTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaywgdW5zaWduZWQgU0luZHgpIHsKKyAgdW5zaWduZWQgTWFza051bUVsdHMgPSBNYXNrLnNpemUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNYXNrTnVtRWx0czsgKytpKQorICAgIGlmICgoTWFza1tpXSA+PSAwKSAmJiAoTWFza1tpXSAhPSAoaW50KShpICsgU0luZHgpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRTaHVmZmxlVmVjdG9yKGNvbnN0IFVzZXIgJkkpIHsKKyAgU21hbGxWZWN0b3I8aW50LCA4PiBNYXNrOworICBTRFZhbHVlIFNyYzEgPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMCkpOworICBTRFZhbHVlIFNyYzIgPSBnZXRWYWx1ZShJLmdldE9wZXJhbmQoMSkpOworCisgIC8vIENvbnZlcnQgdGhlIENvbnN0YW50VmVjdG9yIG1hc2sgb3BlcmFuZCBpbnRvIGFuIGFycmF5IG9mIGludHMsIHdpdGggLTEKKyAgLy8gcmVwcmVzZW50aW5nIHVuZGVmIHZhbHVlcy4KKyAgU21hbGxWZWN0b3I8Q29uc3RhbnQqLCA4PiBNYXNrRWx0czsKKyAgY2FzdDxDb25zdGFudD4oSS5nZXRPcGVyYW5kKDIpKS0+Z2V0VmVjdG9yRWxlbWVudHMoTWFza0VsdHMpOworICB1bnNpZ25lZCBNYXNrTnVtRWx0cyA9IE1hc2tFbHRzLnNpemUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNYXNrTnVtRWx0czsgKytpKSB7CisgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihNYXNrRWx0c1tpXSkpCisgICAgICBNYXNrLnB1c2hfYmFjaygtMSk7CisgICAgZWxzZQorICAgICAgTWFzay5wdXNoX2JhY2soY2FzdDxDb25zdGFudEludD4oTWFza0VsdHNbaV0pLT5nZXRTRXh0VmFsdWUoKSk7CisgIH0KKworICBFVlQgVlQgPSBUTEkuZ2V0VmFsdWVUeXBlKEkuZ2V0VHlwZSgpKTsKKyAgRVZUIFNyY1ZUID0gU3JjMS5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgU3JjTnVtRWx0cyA9IFNyY1ZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgaWYgKFNyY051bUVsdHMgPT0gTWFza051bUVsdHMpIHsKKyAgICBzZXRWYWx1ZSgmSSwgREFHLmdldFZlY3RvclNodWZmbGUoVlQsIGdldEN1ckRlYnVnTG9jKCksIFNyYzEsIFNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNYXNrWzBdKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gTm9ybWFsaXplIHRoZSBzaHVmZmxlIHZlY3RvciBzaW5jZSBtYXNrIGFuZCB2ZWN0b3IgbGVuZ3RoIGRvbid0IG1hdGNoLgorICBpZiAoU3JjTnVtRWx0cyA8IE1hc2tOdW1FbHRzICYmIE1hc2tOdW1FbHRzICUgU3JjTnVtRWx0cyA9PSAwKSB7CisgICAgLy8gTWFzayBpcyBsb25nZXIgdGhhbiB0aGUgc291cmNlIHZlY3RvcnMgYW5kIGlzIGEgbXVsdGlwbGUgb2YgdGhlIHNvdXJjZQorICAgIC8vIHZlY3RvcnMuICBXZSBjYW4gdXNlIGNvbmNhdGVuYXRlIHZlY3RvciB0byBtYWtlIHRoZSBtYXNrIGFuZCB2ZWN0b3JzCisgICAgLy8gbGVuZ3RocyBtYXRjaC4KKyAgICBpZiAoU3JjTnVtRWx0cyoyID09IE1hc2tOdW1FbHRzICYmIFNlcXVlbnRpYWxNYXNrKE1hc2ssIDApKSB7CisgICAgICAvLyBUaGUgc2h1ZmZsZSBpcyBjb25jYXRlbmF0aW5nIHR3byB2ZWN0b3JzIHRvZ2V0aGVyLgorICAgICAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKElTRDo6Q09OQ0FUX1ZFQ1RPUlMsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlQsIFNyYzEsIFNyYzIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBQYWQgYm90aCB2ZWN0b3JzIHdpdGggdW5kZWZzIHRvIG1ha2UgdGhlbSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIG1hc2suCisgICAgdW5zaWduZWQgTnVtQ29uY2F0ID0gTWFza051bUVsdHMgLyBTcmNOdW1FbHRzOworICAgIGJvb2wgU3JjMVUgPSBTcmMxLmdldE9wY29kZSgpID09IElTRDo6VU5ERUY7CisgICAgYm9vbCBTcmMyVSA9IFNyYzIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRjsKKyAgICBTRFZhbHVlIFVuZGVmVmFsID0gREFHLmdldFVOREVGKFNyY1ZUKTsKKworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE1PcHMxKE51bUNvbmNhdCwgVW5kZWZWYWwpOworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE1PcHMyKE51bUNvbmNhdCwgVW5kZWZWYWwpOworICAgIE1PcHMxWzBdID0gU3JjMTsKKyAgICBNT3BzMlswXSA9IFNyYzI7CisKKyAgICBTcmMxID0gU3JjMVUgPyBEQUcuZ2V0VU5ERUYoVlQpIDogREFHLmdldE5vZGUoSVNEOjpDT05DQVRfVkVDVE9SUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VyRGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT3BzMVswXSwgTnVtQ29uY2F0KTsKKyAgICBTcmMyID0gU3JjMlUgPyBEQUcuZ2V0VU5ERUYoVlQpIDogREFHLmdldE5vZGUoSVNEOjpDT05DQVRfVkVDVE9SUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VyRGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT3BzMlswXSwgTnVtQ29uY2F0KTsKKworICAgIC8vIFJlYWRqdXN0IG1hc2sgZm9yIG5ldyBpbnB1dCB2ZWN0b3IgbGVuZ3RoLgorICAgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFwcGVkT3BzOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTWFza051bUVsdHM7ICsraSkgeworICAgICAgaW50IElkeCA9IE1hc2tbaV07CisgICAgICBpZiAoSWR4IDwgKGludClTcmNOdW1FbHRzKQorICAgICAgICBNYXBwZWRPcHMucHVzaF9iYWNrKElkeCk7CisgICAgICBlbHNlCisgICAgICAgIE1hcHBlZE9wcy5wdXNoX2JhY2soSWR4ICsgTWFza051bUVsdHMgLSBTcmNOdW1FbHRzKTsKKyAgICB9CisKKyAgICBzZXRWYWx1ZSgmSSwgREFHLmdldFZlY3RvclNodWZmbGUoVlQsIGdldEN1ckRlYnVnTG9jKCksIFNyYzEsIFNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNYXBwZWRPcHNbMF0pKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoU3JjTnVtRWx0cyA+IE1hc2tOdW1FbHRzKSB7CisgICAgLy8gQW5hbHl6ZSB0aGUgYWNjZXNzIHBhdHRlcm4gb2YgdGhlIHZlY3RvciB0byBzZWUgaWYgd2UgY2FuIGV4dHJhY3QKKyAgICAvLyB0d28gc3VidmVjdG9ycyBhbmQgZG8gdGhlIHNodWZmbGUuIFRoZSBhbmFseXNpcyBpcyBkb25lIGJ5IGNhbGN1bGF0aW5nCisgICAgLy8gdGhlIHJhbmdlIG9mIGVsZW1lbnRzIHRoZSBtYXNrIGFjY2VzcyBvbiBib3RoIHZlY3RvcnMuCisgICAgaW50IE1pblJhbmdlWzJdID0geyBTcmNOdW1FbHRzKzEsIFNyY051bUVsdHMrMX07CisgICAgaW50IE1heFJhbmdlWzJdID0gey0xLCAtMX07CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE1hc2tOdW1FbHRzOyArK2kpIHsKKyAgICAgIGludCBJZHggPSBNYXNrW2ldOworICAgICAgaW50IElucHV0ID0gMDsKKyAgICAgIGlmIChJZHggPCAwKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKElkeCA+PSAoaW50KVNyY051bUVsdHMpIHsKKyAgICAgICAgSW5wdXQgPSAxOworICAgICAgICBJZHggLT0gU3JjTnVtRWx0czsKKyAgICAgIH0KKyAgICAgIGlmIChJZHggPiBNYXhSYW5nZVtJbnB1dF0pCisgICAgICAgIE1heFJhbmdlW0lucHV0XSA9IElkeDsKKyAgICAgIGlmIChJZHggPCBNaW5SYW5nZVtJbnB1dF0pCisgICAgICAgIE1pblJhbmdlW0lucHV0XSA9IElkeDsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGUgYWNjZXNzIGlzIHNtYWxsZXIgdGhhbiB0aGUgdmVjdG9yIHNpemUgYW5kIGNhbiB3ZSBmaW5kCisgICAgLy8gYSByZWFzb25hYmxlIGV4dHJhY3QgaW5kZXguCisgICAgaW50IFJhbmdlVXNlWzJdID0geyAyLCAyIH07ICAvLyAwID0gVW51c2VkLCAxID0gRXh0cmFjdCwgMiA9IENhbiBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QuCisgICAgaW50IFN0YXJ0SWR4WzJdOyAgLy8gU3RhcnRJZHggdG8gZXh0cmFjdCBmcm9tCisgICAgZm9yIChpbnQgSW5wdXQ9MDsgSW5wdXQgPCAyOyArK0lucHV0KSB7CisgICAgICBpZiAoTWluUmFuZ2VbSW5wdXRdID09IChpbnQpKFNyY051bUVsdHMrMSkgJiYgTWF4UmFuZ2VbSW5wdXRdID09IC0xKSB7CisgICAgICAgIFJhbmdlVXNlW0lucHV0XSA9IDA7IC8vIFVudXNlZAorICAgICAgICBTdGFydElkeFtJbnB1dF0gPSAwOworICAgICAgfSBlbHNlIGlmIChNYXhSYW5nZVtJbnB1dF0gLSBNaW5SYW5nZVtJbnB1dF0gPCAoaW50KU1hc2tOdW1FbHRzKSB7CisgICAgICAgIC8vIEZpdHMgd2l0aGluIHJhbmdlIGJ1dCB3ZSBzaG91bGQgc2VlIGlmIHdlIGNhbiBmaW5kIGEgZ29vZAorICAgICAgICAvLyBzdGFydCBpbmRleCB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgdGhlIG1hc2sgbGVuZ3RoLgorICAgICAgICBpZiAoTWF4UmFuZ2VbSW5wdXRdIDwgKGludClNYXNrTnVtRWx0cykgeworICAgICAgICAgIFJhbmdlVXNlW0lucHV0XSA9IDE7IC8vIEV4dHJhY3QgZnJvbSBiZWdpbm5pbmcgb2YgdGhlIHZlY3RvcgorICAgICAgICAgIFN0YXJ0SWR4W0lucHV0XSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU3RhcnRJZHhbSW5wdXRdID0gKE1pblJhbmdlW0lucHV0XS9NYXNrTnVtRWx0cykqTWFza051bUVsdHM7CisgICAgICAgICAgaWYgKE1heFJhbmdlW0lucHV0XSAtIFN0YXJ0SWR4W0lucHV0XSA8IChpbnQpTWFza051bUVsdHMgJiYKKyAgICAgICAgICAgICAgU3RhcnRJZHhbSW5wdXRdICsgTWFza051bUVsdHMgPCBTcmNOdW1FbHRzKQorICAgICAgICAgICAgUmFuZ2VVc2VbSW5wdXRdID0gMTsgLy8gRXh0cmFjdCBmcm9tIGEgbXVsdGlwbGUgb2YgdGhlIG1hc2sgbGVuZ3RoLgorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKFJhbmdlVXNlWzBdID09IDAgJiYgUmFuZ2VVc2VbMV0gPT0gMCkgeworICAgICAgc2V0VmFsdWUoJkksIERBRy5nZXRVTkRFRihWVCkpOyAvLyBWZWN0b3JzIGFyZSBub3QgdXNlZC4KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZiAoUmFuZ2VVc2VbMF0gPCAyICYmIFJhbmdlVXNlWzFdIDwgMikgeworICAgICAgLy8gRXh0cmFjdCBhcHByb3ByaWF0ZSBzdWJ2ZWN0b3IgYW5kIGdlbmVyYXRlIGEgdmVjdG9yIHNodWZmbGUKKyAgICAgIGZvciAoaW50IElucHV0PTA7IElucHV0IDwgMjsgKytJbnB1dCkgeworICAgICAgICBTRFZhbHVlICZTcmMgPSBJbnB1dCA9PSAwID8gU3JjMSA6IFNyYzI7CisgICAgICAgIGlmIChSYW5nZVVzZVtJbnB1dF0gPT0gMCkKKyAgICAgICAgICBTcmMgPSBEQUcuZ2V0VU5ERUYoVlQpOworICAgICAgICBlbHNlCisgICAgICAgICAgU3JjID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgZ2V0Q3VyRGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoU3RhcnRJZHhbSW5wdXRdKSk7CisgICAgICB9CisKKyAgICAgIC8vIENhbGN1bGF0ZSBuZXcgbWFzay4KKyAgICAgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFwcGVkT3BzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNYXNrTnVtRWx0czsgKytpKSB7CisgICAgICAgIGludCBJZHggPSBNYXNrW2ldOworICAgICAgICBpZiAoSWR4IDwgMCkKKyAgICAgICAgICBNYXBwZWRPcHMucHVzaF9iYWNrKElkeCk7CisgICAgICAgIGVsc2UgaWYgKElkeCA8IChpbnQpU3JjTnVtRWx0cykKKyAgICAgICAgICBNYXBwZWRPcHMucHVzaF9iYWNrKElkeCAtIFN0YXJ0SWR4WzBdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIE1hcHBlZE9wcy5wdXNoX2JhY2soSWR4IC0gU3JjTnVtRWx0cyAtIFN0YXJ0SWR4WzFdICsgTWFza051bUVsdHMpOworICAgICAgfQorCisgICAgICBzZXRWYWx1ZSgmSSwgREFHLmdldFZlY3RvclNodWZmbGUoVlQsIGdldEN1ckRlYnVnTG9jKCksIFNyYzEsIFNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1hcHBlZE9wc1swXSkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIFdlIGNhbid0IHVzZSBlaXRoZXIgY29uY2F0IHZlY3RvcnMgb3IgZXh0cmFjdCBzdWJ2ZWN0b3JzIHNvIGZhbGwgYmFjayB0bworICAvLyByZXBsYWNpbmcgdGhlIHNodWZmbGUgd2l0aCBleHRyYWN0IGFuZCBidWlsZCB2ZWN0b3IuCisgIC8vIHRvIGluc2VydCBhbmQgYnVpbGQgdmVjdG9yLgorICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICBFVlQgUHRyVlQgPSBUTEkuZ2V0UG9pbnRlclR5KCk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsOD4gT3BzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE1hc2tOdW1FbHRzOyArK2kpIHsKKyAgICBpZiAoTWFza1tpXSA8IDApIHsKKyAgICAgIE9wcy5wdXNoX2JhY2soREFHLmdldFVOREVGKEVsdFZUKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBJZHggPSBNYXNrW2ldOworICAgICAgU0RWYWx1ZSBSZXM7CisKKyAgICAgIGlmIChJZHggPCAoaW50KVNyY051bUVsdHMpCisgICAgICAgIFJlcyA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFbHRWVCwgU3JjMSwgREFHLmdldENvbnN0YW50KElkeCwgUHRyVlQpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgUmVzID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVsdFZULCBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSWR4IC0gU3JjTnVtRWx0cywgUHRyVlQpKTsKKworICAgICAgT3BzLnB1c2hfYmFjayhSZXMpOworICAgIH0KKyAgfQorCisgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULCAmT3BzWzBdLCBPcHMuc2l6ZSgpKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRJbnNlcnRWYWx1ZShjb25zdCBJbnNlcnRWYWx1ZUluc3QgJkkpIHsKKyAgY29uc3QgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKTsKKyAgY29uc3QgVmFsdWUgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKyAgY29uc3QgVHlwZSAqQWdnVHkgPSBJLmdldFR5cGUoKTsKKyAgY29uc3QgVHlwZSAqVmFsVHkgPSBPcDEtPmdldFR5cGUoKTsKKyAgYm9vbCBJbnRvVW5kZWYgPSBpc2E8VW5kZWZWYWx1ZT4oT3AwKTsKKyAgYm9vbCBGcm9tVW5kZWYgPSBpc2E8VW5kZWZWYWx1ZT4oT3AxKTsKKworICB1bnNpZ25lZCBMaW5lYXJJbmRleCA9IENvbXB1dGVMaW5lYXJJbmRleChUTEksIEFnZ1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLmlkeF9iZWdpbigpLCBJLmlkeF9lbmQoKSk7CisKKyAgU21hbGxWZWN0b3I8RVZULCA0PiBBZ2dWYWx1ZVZUczsKKyAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgQWdnVHksIEFnZ1ZhbHVlVlRzKTsKKyAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWxWYWx1ZVZUczsKKyAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgVmFsVHksIFZhbFZhbHVlVlRzKTsKKworICB1bnNpZ25lZCBOdW1BZ2dWYWx1ZXMgPSBBZ2dWYWx1ZVZUcy5zaXplKCk7CisgIHVuc2lnbmVkIE51bVZhbFZhbHVlcyA9IFZhbFZhbHVlVlRzLnNpemUoKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gVmFsdWVzKE51bUFnZ1ZhbHVlcyk7CisKKyAgU0RWYWx1ZSBBZ2cgPSBnZXRWYWx1ZShPcDApOworICBTRFZhbHVlIFZhbCA9IGdldFZhbHVlKE9wMSk7CisgIHVuc2lnbmVkIGkgPSAwOworICAvLyBDb3B5IHRoZSBiZWdpbm5pbmcgdmFsdWUocykgZnJvbSB0aGUgb3JpZ2luYWwgYWdncmVnYXRlLgorICBmb3IgKDsgaSAhPSBMaW5lYXJJbmRleDsgKytpKQorICAgIFZhbHVlc1tpXSA9IEludG9VbmRlZiA/IERBRy5nZXRVTkRFRihBZ2dWYWx1ZVZUc1tpXSkgOgorICAgICAgICAgICAgICAgIFNEVmFsdWUoQWdnLmdldE5vZGUoKSwgQWdnLmdldFJlc05vKCkgKyBpKTsKKyAgLy8gQ29weSB2YWx1ZXMgZnJvbSB0aGUgaW5zZXJ0ZWQgdmFsdWUocykuCisgIGZvciAoOyBpICE9IExpbmVhckluZGV4ICsgTnVtVmFsVmFsdWVzOyArK2kpCisgICAgVmFsdWVzW2ldID0gRnJvbVVuZGVmID8gREFHLmdldFVOREVGKEFnZ1ZhbHVlVlRzW2ldKSA6CisgICAgICAgICAgICAgICAgU0RWYWx1ZShWYWwuZ2V0Tm9kZSgpLCBWYWwuZ2V0UmVzTm8oKSArIGkgLSBMaW5lYXJJbmRleCk7CisgIC8vIENvcHkgcmVtYWluaW5nIHZhbHVlKHMpIGZyb20gdGhlIG9yaWdpbmFsIGFnZ3JlZ2F0ZS4KKyAgZm9yICg7IGkgIT0gTnVtQWdnVmFsdWVzOyArK2kpCisgICAgVmFsdWVzW2ldID0gSW50b1VuZGVmID8gREFHLmdldFVOREVGKEFnZ1ZhbHVlVlRzW2ldKSA6CisgICAgICAgICAgICAgICAgU0RWYWx1ZShBZ2cuZ2V0Tm9kZSgpLCBBZ2cuZ2V0UmVzTm8oKSArIGkpOworCisgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6Ok1FUkdFX1ZBTFVFUywgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoJkFnZ1ZhbHVlVlRzWzBdLCBOdW1BZ2dWYWx1ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJlZhbHVlc1swXSwgTnVtQWdnVmFsdWVzKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRFeHRyYWN0VmFsdWUoY29uc3QgRXh0cmFjdFZhbHVlSW5zdCAmSSkgeworICBjb25zdCBWYWx1ZSAqT3AwID0gSS5nZXRPcGVyYW5kKDApOworICBjb25zdCBUeXBlICpBZ2dUeSA9IE9wMC0+Z2V0VHlwZSgpOworICBjb25zdCBUeXBlICpWYWxUeSA9IEkuZ2V0VHlwZSgpOworICBib29sIE91dE9mVW5kZWYgPSBpc2E8VW5kZWZWYWx1ZT4oT3AwKTsKKworICB1bnNpZ25lZCBMaW5lYXJJbmRleCA9IENvbXB1dGVMaW5lYXJJbmRleChUTEksIEFnZ1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLmlkeF9iZWdpbigpLCBJLmlkeF9lbmQoKSk7CisKKyAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWxWYWx1ZVZUczsKKyAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgVmFsVHksIFZhbFZhbHVlVlRzKTsKKworICB1bnNpZ25lZCBOdW1WYWxWYWx1ZXMgPSBWYWxWYWx1ZVZUcy5zaXplKCk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDQ+IFZhbHVlcyhOdW1WYWxWYWx1ZXMpOworCisgIFNEVmFsdWUgQWdnID0gZ2V0VmFsdWUoT3AwKTsKKyAgLy8gQ29weSBvdXQgdGhlIHNlbGVjdGVkIHZhbHVlKHMpLgorICBmb3IgKHVuc2lnbmVkIGkgPSBMaW5lYXJJbmRleDsgaSAhPSBMaW5lYXJJbmRleCArIE51bVZhbFZhbHVlczsgKytpKQorICAgIFZhbHVlc1tpIC0gTGluZWFySW5kZXhdID0KKyAgICAgIE91dE9mVW5kZWYgPworICAgICAgICBEQUcuZ2V0VU5ERUYoQWdnLmdldE5vZGUoKS0+Z2V0VmFsdWVUeXBlKEFnZy5nZXRSZXNObygpICsgaSkpIDoKKyAgICAgICAgU0RWYWx1ZShBZ2cuZ2V0Tm9kZSgpLCBBZ2cuZ2V0UmVzTm8oKSArIGkpOworCisgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6Ok1FUkdFX1ZBTFVFUywgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoJlZhbFZhbHVlVlRzWzBdLCBOdW1WYWxWYWx1ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJlZhbHVlc1swXSwgTnVtVmFsVmFsdWVzKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRHZXRFbGVtZW50UHRyKGNvbnN0IFVzZXIgJkkpIHsKKyAgU0RWYWx1ZSBOID0gZ2V0VmFsdWUoSS5nZXRPcGVyYW5kKDApKTsKKyAgY29uc3QgVHlwZSAqVHkgPSBJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsKKworICBmb3IgKEdldEVsZW1lbnRQdHJJbnN0Ojpjb25zdF9vcF9pdGVyYXRvciBPSSA9IEkub3BfYmVnaW4oKSsxLCBFID0gSS5vcF9lbmQoKTsKKyAgICAgICBPSSAhPSBFOyArK09JKSB7CisgICAgY29uc3QgVmFsdWUgKklkeCA9ICpPSTsKKyAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU3RUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkgeworICAgICAgdW5zaWduZWQgRmllbGQgPSBjYXN0PENvbnN0YW50SW50PihJZHgpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIGlmIChGaWVsZCkgeworICAgICAgICAvLyBOID0gTiArIE9mZnNldAorICAgICAgICB1aW50NjRfdCBPZmZzZXQgPSBURC0+Z2V0U3RydWN0TGF5b3V0KFN0VHkpLT5nZXRFbGVtZW50T2Zmc2V0KEZpZWxkKTsKKyAgICAgICAgTiA9IERBRy5nZXROb2RlKElTRDo6QURELCBnZXRDdXJEZWJ1Z0xvYygpLCBOLmdldFZhbHVlVHlwZSgpLCBOLAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KE9mZnNldCkpOworICAgICAgfQorCisgICAgICBUeSA9IFN0VHktPmdldEVsZW1lbnRUeXBlKEZpZWxkKTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0IFVuaW9uVHlwZSAqVW5UeSA9IGR5bl9jYXN0PFVuaW9uVHlwZT4oVHkpKSB7CisgICAgICB1bnNpZ25lZCBGaWVsZCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KElkeCktPmdldFpFeHRWYWx1ZSgpOworICAgICAgCisgICAgICAvLyBPZmZzZXQgY2Fub25pY2FsbHkgMCBmb3IgdW5pb25zLCBidXQgdHlwZSBjaGFuZ2VzCisgICAgICBUeSA9IFVuVHktPmdldEVsZW1lbnRUeXBlKEZpZWxkKTsKKyAgICB9IGVsc2UgeworICAgICAgVHkgPSBjYXN0PFNlcXVlbnRpYWxUeXBlPihUeSktPmdldEVsZW1lbnRUeXBlKCk7CisKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBjb25zdGFudCBzdWJzY3JpcHQsIGhhbmRsZSBpdCBxdWlja2x5LgorICAgICAgaWYgKGNvbnN0IENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJZHgpKSB7CisgICAgICAgIGlmIChDSS0+aXNaZXJvKCkpIGNvbnRpbnVlOworICAgICAgICB1aW50NjRfdCBPZmZzID0KKyAgICAgICAgICAgIFRELT5nZXRUeXBlQWxsb2NTaXplKFR5KSpjYXN0PENvbnN0YW50SW50PihDSSktPmdldFNFeHRWYWx1ZSgpOworICAgICAgICBTRFZhbHVlIE9mZnNWYWw7CisgICAgICAgIEVWVCBQVHkgPSBUTEkuZ2V0UG9pbnRlclR5KCk7CisgICAgICAgIHVuc2lnbmVkIFB0ckJpdHMgPSBQVHkuZ2V0U2l6ZUluQml0cygpOworICAgICAgICBpZiAoUHRyQml0cyA8IDY0KQorICAgICAgICAgIE9mZnNWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChPZmZzLCBNVlQ6Omk2NCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgT2Zmc1ZhbCA9IERBRy5nZXRJbnRQdHJDb25zdGFudChPZmZzKTsKKworICAgICAgICBOID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGdldEN1ckRlYnVnTG9jKCksIE4uZ2V0VmFsdWVUeXBlKCksIE4sCisgICAgICAgICAgICAgICAgICAgICAgICBPZmZzVmFsKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIE4gPSBOICsgSWR4ICogRWxlbWVudFNpemU7CisgICAgICBBUEludCBFbGVtZW50U2l6ZSA9IEFQSW50KFRMSS5nZXRQb2ludGVyVHkoKS5nZXRTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRELT5nZXRUeXBlQWxsb2NTaXplKFR5KSk7CisgICAgICBTRFZhbHVlIElkeE4gPSBnZXRWYWx1ZShJZHgpOworCisgICAgICAvLyBJZiB0aGUgaW5kZXggaXMgc21hbGxlciBvciBsYXJnZXIgdGhhbiBpbnRwdHJfdCwgdHJ1bmNhdGUgb3IgZXh0ZW5kCisgICAgICAvLyBpdC4KKyAgICAgIElkeE4gPSBEQUcuZ2V0U0V4dE9yVHJ1bmMoSWR4TiwgZ2V0Q3VyRGVidWdMb2MoKSwgTi5nZXRWYWx1ZVR5cGUoKSk7CisKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBtdWx0aXBseSBieSBhIHBvd2VyIG9mIHR3bywgdHVybiBpdCBpbnRvIGEgc2hsCisgICAgICAvLyBpbW1lZGlhdGVseS4gIFRoaXMgaXMgYSB2ZXJ5IGNvbW1vbiBjYXNlLgorICAgICAgaWYgKEVsZW1lbnRTaXplICE9IDEpIHsKKyAgICAgICAgaWYgKEVsZW1lbnRTaXplLmlzUG93ZXJPZjIoKSkgeworICAgICAgICAgIHVuc2lnbmVkIEFtdCA9IEVsZW1lbnRTaXplLmxvZ0Jhc2UyKCk7CisgICAgICAgICAgSWR4TiA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLmdldFZhbHVlVHlwZSgpLCBJZHhOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQW10LCBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTRFZhbHVlIFNjYWxlID0gREFHLmdldENvbnN0YW50KEVsZW1lbnRTaXplLCBUTEkuZ2V0UG9pbnRlclR5KCkpOworICAgICAgICAgIElkeE4gPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi5nZXRWYWx1ZVR5cGUoKSwgSWR4TiwgU2NhbGUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIE4gPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICBOLmdldFZhbHVlVHlwZSgpLCBOLCBJZHhOKTsKKyAgICB9CisgIH0KKworICBzZXRWYWx1ZSgmSSwgTik7Cit9CisKK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRBbGxvY2EoY29uc3QgQWxsb2NhSW5zdCAmSSkgeworICAvLyBJZiB0aGlzIGlzIGEgZml4ZWQgc2l6ZWQgYWxsb2NhIGluIHRoZSBlbnRyeSBibG9jayBvZiB0aGUgZnVuY3Rpb24sCisgIC8vIGFsbG9jYXRlIGl0IHN0YXRpY2FsbHkgb24gdGhlIHN0YWNrLgorICBpZiAoRnVuY0luZm8uU3RhdGljQWxsb2NhTWFwLmNvdW50KCZJKSkKKyAgICByZXR1cm47ICAgLy8gZ2V0VmFsdWUgd2lsbCBhdXRvLXBvcHVsYXRlIHRoaXMuCisKKyAgY29uc3QgVHlwZSAqVHkgPSBJLmdldEFsbG9jYXRlZFR5cGUoKTsKKyAgdWludDY0X3QgVHlTaXplID0gVExJLmdldFRhcmdldERhdGEoKS0+Z2V0VHlwZUFsbG9jU2l6ZShUeSk7CisgIHVuc2lnbmVkIEFsaWduID0KKyAgICBzdGQ6Om1heCgodW5zaWduZWQpVExJLmdldFRhcmdldERhdGEoKS0+Z2V0UHJlZlR5cGVBbGlnbm1lbnQoVHkpLAorICAgICAgICAgICAgIEkuZ2V0QWxpZ25tZW50KCkpOworCisgIFNEVmFsdWUgQWxsb2NTaXplID0gZ2V0VmFsdWUoSS5nZXRBcnJheVNpemUoKSk7CisKKyAgRVZUIEludFB0ciA9IFRMSS5nZXRQb2ludGVyVHkoKTsKKyAgaWYgKEFsbG9jU2l6ZS5nZXRWYWx1ZVR5cGUoKSAhPSBJbnRQdHIpCisgICAgQWxsb2NTaXplID0gREFHLmdldFpFeHRPclRydW5jKEFsbG9jU2l6ZSwgZ2V0Q3VyRGVidWdMb2MoKSwgSW50UHRyKTsKKworICBBbGxvY1NpemUgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZ2V0Q3VyRGVidWdMb2MoKSwgSW50UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChUeVNpemUsIEludFB0cikpOworCisgIC8vIEhhbmRsZSBhbGlnbm1lbnQuICBJZiB0aGUgcmVxdWVzdGVkIGFsaWdubWVudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgLy8gdGhlIHN0YWNrIGFsaWdubWVudCwgaWdub3JlIGl0LiAgSWYgdGhlIHNpemUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgIC8vIHRoZSBzdGFjayBhbGlnbm1lbnQsIHdlIG5vdGUgdGhpcyBpbiB0aGUgRFlOQU1JQ19TVEFDS0FMTE9DIG5vZGUuCisgIHVuc2lnbmVkIFN0YWNrQWxpZ24gPSBUTS5nZXRGcmFtZUluZm8oKS0+Z2V0U3RhY2tBbGlnbm1lbnQoKTsKKyAgaWYgKEFsaWduIDw9IFN0YWNrQWxpZ24pCisgICAgQWxpZ24gPSAwOworCisgIC8vIFJvdW5kIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uIHVwIHRvIHRoZSBzdGFjayBhbGlnbm1lbnQgc2l6ZQorICAvLyBieSBhZGQgU0EtMSB0byB0aGUgc2l6ZS4KKyAgQWxsb2NTaXplID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZS5nZXRWYWx1ZVR5cGUoKSwgQWxsb2NTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoU3RhY2tBbGlnbi0xKSk7CisKKyAgLy8gTWFzayBvdXQgdGhlIGxvdyBiaXRzIGZvciBhbGlnbm1lbnQgcHVycG9zZXMuCisgIEFsbG9jU2l6ZSA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY1NpemUuZ2V0VmFsdWVUeXBlKCksIEFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KH4odWludDY0X3QpKFN0YWNrQWxpZ24tMSkpKTsKKworICBTRFZhbHVlIE9wc1tdID0geyBnZXRSb290KCksIEFsbG9jU2l6ZSwgREFHLmdldEludFB0ckNvbnN0YW50KEFsaWduKSB9OworICBTRFZUTGlzdCBWVHMgPSBEQUcuZ2V0VlRMaXN0KEFsbG9jU2l6ZS5nZXRWYWx1ZVR5cGUoKSwgTVZUOjpPdGhlcik7CisgIFNEVmFsdWUgRFNBID0gREFHLmdldE5vZGUoSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0MsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlRzLCBPcHMsIDMpOworICBzZXRWYWx1ZSgmSSwgRFNBKTsKKyAgREFHLnNldFJvb3QoRFNBLmdldFZhbHVlKDEpKTsKKworICAvLyBJbmZvcm0gdGhlIEZyYW1lIEluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSBqdXN0IGFsbG9jYXRlZCBhIHZhcmlhYmxlLXNpemVkCisgIC8vIG9iamVjdC4KKyAgRnVuY0luZm8uTUYtPmdldEZyYW1lSW5mbygpLT5DcmVhdGVWYXJpYWJsZVNpemVkT2JqZWN0KEFsaWduID8gQWxpZ24gOiAxKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdExvYWQoY29uc3QgTG9hZEluc3QgJkkpIHsKKyAgY29uc3QgVmFsdWUgKlNWID0gSS5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFB0ciA9IGdldFZhbHVlKFNWKTsKKworICBjb25zdCBUeXBlICpUeSA9IEkuZ2V0VHlwZSgpOworCisgIGJvb2wgaXNWb2xhdGlsZSA9IEkuaXNWb2xhdGlsZSgpOworICBib29sIGlzTm9uVGVtcG9yYWwgPSBJLmdldE1ldGFkYXRhKCJub250ZW1wb3JhbCIpICE9IDA7CisgIHVuc2lnbmVkIEFsaWdubWVudCA9IEkuZ2V0QWxpZ25tZW50KCk7CisKKyAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWx1ZVZUczsKKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDQ+IE9mZnNldHM7CisgIENvbXB1dGVWYWx1ZVZUcyhUTEksIFR5LCBWYWx1ZVZUcywgJk9mZnNldHMpOworICB1bnNpZ25lZCBOdW1WYWx1ZXMgPSBWYWx1ZVZUcy5zaXplKCk7CisgIGlmIChOdW1WYWx1ZXMgPT0gMCkKKyAgICByZXR1cm47CisKKyAgU0RWYWx1ZSBSb290OworICBib29sIENvbnN0YW50TWVtb3J5ID0gZmFsc2U7CisgIGlmIChJLmlzVm9sYXRpbGUoKSkKKyAgICAvLyBTZXJpYWxpemUgdm9sYXRpbGUgbG9hZHMgd2l0aCBvdGhlciBzaWRlIGVmZmVjdHMuCisgICAgUm9vdCA9IGdldFJvb3QoKTsKKyAgZWxzZSBpZiAoQUEtPnBvaW50c1RvQ29uc3RhbnRNZW1vcnkoU1YpKSB7CisgICAgLy8gRG8gbm90IHNlcmlhbGl6ZSAobm9uLXZvbGF0aWxlKSBsb2FkcyBvZiBjb25zdGFudCBtZW1vcnkgd2l0aCBhbnl0aGluZy4KKyAgICBSb290ID0gREFHLmdldEVudHJ5Tm9kZSgpOworICAgIENvbnN0YW50TWVtb3J5ID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBEbyBub3Qgc2VyaWFsaXplIG5vbi12b2xhdGlsZSBsb2FkcyBhZ2FpbnN0IGVhY2ggb3RoZXIuCisgICAgUm9vdCA9IERBRy5nZXRSb290KCk7CisgIH0KKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBWYWx1ZXMoTnVtVmFsdWVzKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gQ2hhaW5zKE51bVZhbHVlcyk7CisgIEVWVCBQdHJWVCA9IFB0ci5nZXRWYWx1ZVR5cGUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1WYWx1ZXM7ICsraSkgeworICAgIFNEVmFsdWUgQSA9IERBRy5nZXROb2RlKElTRDo6QURELCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clZULCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE9mZnNldHNbaV0sIFB0clZUKSk7CisgICAgU0RWYWx1ZSBMID0gREFHLmdldExvYWQoVmFsdWVWVHNbaV0sIGdldEN1ckRlYnVnTG9jKCksIFJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSwgU1YsIE9mZnNldHNbaV0sIGlzVm9sYXRpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9uVGVtcG9yYWwsIEFsaWdubWVudCk7CisKKyAgICBWYWx1ZXNbaV0gPSBMOworICAgIENoYWluc1tpXSA9IEwuZ2V0VmFsdWUoMSk7CisgIH0KKworICBpZiAoIUNvbnN0YW50TWVtb3J5KSB7CisgICAgU0RWYWx1ZSBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsICZDaGFpbnNbMF0sIE51bVZhbHVlcyk7CisgICAgaWYgKGlzVm9sYXRpbGUpCisgICAgICBEQUcuc2V0Um9vdChDaGFpbik7CisgICAgZWxzZQorICAgICAgUGVuZGluZ0xvYWRzLnB1c2hfYmFjayhDaGFpbik7CisgIH0KKworICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpNRVJHRV9WQUxVRVMsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlRMaXN0KCZWYWx1ZVZUc1swXSwgTnVtVmFsdWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZWYWx1ZXNbMF0sIE51bVZhbHVlcykpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0U3RvcmUoY29uc3QgU3RvcmVJbnN0ICZJKSB7CisgIGNvbnN0IFZhbHVlICpTcmNWID0gSS5nZXRPcGVyYW5kKDApOworICBjb25zdCBWYWx1ZSAqUHRyViA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICBTbWFsbFZlY3RvcjxFVlQsIDQ+IFZhbHVlVlRzOworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgND4gT2Zmc2V0czsKKyAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgU3JjVi0+Z2V0VHlwZSgpLCBWYWx1ZVZUcywgJk9mZnNldHMpOworICB1bnNpZ25lZCBOdW1WYWx1ZXMgPSBWYWx1ZVZUcy5zaXplKCk7CisgIGlmIChOdW1WYWx1ZXMgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLy8gR2V0IHRoZSBsb3dlcmVkIG9wZXJhbmRzLiBOb3RlIHRoYXQgd2UgZG8gdGhpcyBhZnRlcgorICAvLyBjaGVja2luZyBpZiBOdW1SZXN1bHRzIGlzIHplcm8sIGJlY2F1c2Ugd2l0aCB6ZXJvIHJlc3VsdHMKKyAgLy8gdGhlIG9wZXJhbmRzIHdvbid0IGhhdmUgdmFsdWVzIGluIHRoZSBtYXAuCisgIFNEVmFsdWUgU3JjID0gZ2V0VmFsdWUoU3JjVik7CisgIFNEVmFsdWUgUHRyID0gZ2V0VmFsdWUoUHRyVik7CisKKyAgU0RWYWx1ZSBSb290ID0gZ2V0Um9vdCgpOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBDaGFpbnMoTnVtVmFsdWVzKTsKKyAgRVZUIFB0clZUID0gUHRyLmdldFZhbHVlVHlwZSgpOworICBib29sIGlzVm9sYXRpbGUgPSBJLmlzVm9sYXRpbGUoKTsKKyAgYm9vbCBpc05vblRlbXBvcmFsID0gSS5nZXRNZXRhZGF0YSgibm9udGVtcG9yYWwiKSAhPSAwOworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBJLmdldEFsaWdubWVudCgpOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtVmFsdWVzOyArK2kpIHsKKyAgICBTRFZhbHVlIEFkZCA9IERBRy5nZXROb2RlKElTRDo6QURELCBnZXRDdXJEZWJ1Z0xvYygpLCBQdHJWVCwgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE9mZnNldHNbaV0sIFB0clZUKSk7CisgICAgQ2hhaW5zW2ldID0gREFHLmdldFN0b3JlKFJvb3QsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoU3JjLmdldE5vZGUoKSwgU3JjLmdldFJlc05vKCkgKyBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkLCBQdHJWLCBPZmZzZXRzW2ldLCBpc1ZvbGF0aWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOb25UZW1wb3JhbCwgQWxpZ25tZW50KTsKKyAgfQorCisgIERBRy5zZXRSb290KERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsICZDaGFpbnNbMF0sIE51bVZhbHVlcykpOworfQorCisvLy8gdmlzaXRUYXJnZXRJbnRyaW5zaWMgLSBMb3dlciBhIGNhbGwgb2YgYSB0YXJnZXQgaW50cmluc2ljIHRvIGFuIElOVFJJTlNJQworLy8vIG5vZGUuCit2b2lkIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0VGFyZ2V0SW50cmluc2ljKGNvbnN0IENhbGxJbnN0ICZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbnRyaW5zaWMpIHsKKyAgYm9vbCBIYXNDaGFpbiA9ICFJLmRvZXNOb3RBY2Nlc3NNZW1vcnkoKTsKKyAgYm9vbCBPbmx5TG9hZCA9IEhhc0NoYWluICYmIEkub25seVJlYWRzTWVtb3J5KCk7CisKKyAgLy8gQnVpbGQgdGhlIG9wZXJhbmQgbGlzdC4KKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICBpZiAoSGFzQ2hhaW4pIHsgIC8vIElmIHRoaXMgaW50cmluc2ljIGhhcyBzaWRlLWVmZmVjdHMsIGNoYWluaWZ5IGl0LgorICAgIGlmIChPbmx5TG9hZCkgeworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBzZXJpYWxpemUgbG9hZHMgYWdhaW5zdCBvdGhlciBsb2Fkcy4KKyAgICAgIE9wcy5wdXNoX2JhY2soREFHLmdldFJvb3QoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE9wcy5wdXNoX2JhY2soZ2V0Um9vdCgpKTsKKyAgICB9CisgIH0KKworICAvLyBJbmZvIGlzIHNldCBieSBnZXRUZ3RNZW1JbnN0cmluc2ljCisgIFRhcmdldExvd2VyaW5nOjpJbnRyaW5zaWNJbmZvIEluZm87CisgIGJvb2wgSXNUZ3RJbnRyaW5zaWMgPSBUTEkuZ2V0VGd0TWVtSW50cmluc2ljKEluZm8sIEksIEludHJpbnNpYyk7CisKKyAgLy8gQWRkIHRoZSBpbnRyaW5zaWMgSUQgYXMgYW4gaW50ZWdlciBvcGVyYW5kIGlmIGl0J3Mgbm90IGEgdGFyZ2V0IGludHJpbnNpYy4KKyAgaWYgKCFJc1RndEludHJpbnNpYykKKyAgICBPcHMucHVzaF9iYWNrKERBRy5nZXRDb25zdGFudChJbnRyaW5zaWMsIFRMSS5nZXRQb2ludGVyVHkoKSkpOworCisgIC8vIEFkZCBhbGwgb3BlcmFuZHMgb2YgdGhlIGNhbGwgdG8gdGhlIG9wZXJhbmQgbGlzdC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEkuZ2V0TnVtQXJnT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBTRFZhbHVlIE9wID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKGkpKTsKKyAgICBhc3NlcnQoVExJLmlzVHlwZUxlZ2FsKE9wLmdldFZhbHVlVHlwZSgpKSAmJgorICAgICAgICAgICAiSW50cmluc2ljIHVzZXMgYSBub24tbGVnYWwgdHlwZT8iKTsKKyAgICBPcHMucHVzaF9iYWNrKE9wKTsKKyAgfQorCisgIFNtYWxsVmVjdG9yPEVWVCwgND4gVmFsdWVWVHM7CisgIENvbXB1dGVWYWx1ZVZUcyhUTEksIEkuZ2V0VHlwZSgpLCBWYWx1ZVZUcyk7CisjaWZuZGVmIE5ERUJVRworICBmb3IgKHVuc2lnbmVkIFZhbCA9IDAsIEUgPSBWYWx1ZVZUcy5zaXplKCk7IFZhbCAhPSBFOyArK1ZhbCkgeworICAgIGFzc2VydChUTEkuaXNUeXBlTGVnYWwoVmFsdWVWVHNbVmFsXSkgJiYKKyAgICAgICAgICAgIkludHJpbnNpYyB1c2VzIGEgbm9uLWxlZ2FsIHR5cGU/Iik7CisgIH0KKyNlbmRpZiAvLyBOREVCVUcKKworICBpZiAoSGFzQ2hhaW4pCisgICAgVmFsdWVWVHMucHVzaF9iYWNrKE1WVDo6T3RoZXIpOworCisgIFNEVlRMaXN0IFZUcyA9IERBRy5nZXRWVExpc3QoVmFsdWVWVHMuZGF0YSgpLCBWYWx1ZVZUcy5zaXplKCkpOworCisgIC8vIENyZWF0ZSB0aGUgbm9kZS4KKyAgU0RWYWx1ZSBSZXN1bHQ7CisgIGlmIChJc1RndEludHJpbnNpYykgeworICAgIC8vIFRoaXMgaXMgdGFyZ2V0IGludHJpbnNpYyB0aGF0IHRvdWNoZXMgbWVtb3J5CisgICAgUmVzdWx0ID0gREFHLmdldE1lbUludHJpbnNpY05vZGUoSW5mby5vcGMsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlRzLCAmT3BzWzBdLCBPcHMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8ubWVtVlQsIEluZm8ucHRyVmFsLCBJbmZvLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvLmFsaWduLCBJbmZvLnZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvLnJlYWRNZW0sIEluZm8ud3JpdGVNZW0pOworICB9IGVsc2UgaWYgKCFIYXNDaGFpbikgeworICAgIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZUcywgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgIH0gZWxzZSBpZiAoIUkuZ2V0VHlwZSgpLT5pc1ZvaWRUeSgpKSB7CisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpJTlRSSU5TSUNfV19DSEFJTiwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWVHMsICZPcHNbMF0sIE9wcy5zaXplKCkpOworICB9IGVsc2UgeworICAgIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1ZPSUQsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgVlRzLCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgfQorCisgIGlmIChIYXNDaGFpbikgeworICAgIFNEVmFsdWUgQ2hhaW4gPSBSZXN1bHQuZ2V0VmFsdWUoUmVzdWx0LmdldE5vZGUoKS0+Z2V0TnVtVmFsdWVzKCktMSk7CisgICAgaWYgKE9ubHlMb2FkKQorICAgICAgUGVuZGluZ0xvYWRzLnB1c2hfYmFjayhDaGFpbik7CisgICAgZWxzZQorICAgICAgREFHLnNldFJvb3QoQ2hhaW4pOworICB9CisKKyAgaWYgKCFJLmdldFR5cGUoKS0+aXNWb2lkVHkoKSkgeworICAgIGlmIChjb25zdCBWZWN0b3JUeXBlICpQVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihJLmdldFR5cGUoKSkpIHsKKyAgICAgIEVWVCBWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoUFR5KTsKKyAgICAgIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGdldEN1ckRlYnVnTG9jKCksIFZULCBSZXN1bHQpOworICAgIH0KKworICAgIHNldFZhbHVlKCZJLCBSZXN1bHQpOworICB9Cit9CisKKy8vLyBHZXRTaWduaWZpY2FuZCAtIEdldCB0aGUgc2lnbmlmaWNhbmQgYW5kIGJ1aWxkIGl0IGludG8gYSBmbG9hdGluZy1wb2ludAorLy8vIG51bWJlciB3aXRoIGV4cG9uZW50IG9mIDE6CisvLy8KKy8vLyAgIE9wID0gKE9wICYgMHgwMDdmZmZmZikgfCAweDNmODAwMDAwOworLy8vCisvLy8gd2hlcmUgT3AgaXMgdGhlIGhleGlkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGZsb2F0aW5nIHBvaW50IHZhbHVlLgorc3RhdGljIFNEVmFsdWUKK0dldFNpZ25pZmljYW5kKFNlbGVjdGlvbkRBRyAmREFHLCBTRFZhbHVlIE9wLCBEZWJ1Z0xvYyBkbCkgeworICBTRFZhbHVlIHQxID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBNVlQ6OmkzMiwgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMHgwMDdmZmZmZiwgTVZUOjppMzIpKTsKKyAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBNVlQ6OmkzMiwgdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMHgzZjgwMDAwMCwgTVZUOjppMzIpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmYzMiwgdDIpOworfQorCisvLy8gR2V0RXhwb25lbnQgLSBHZXQgdGhlIGV4cG9uZW50OgorLy8vCisvLy8gICAoZmxvYXQpKGludCkoKChPcCAmIDB4N2Y4MDAwMDApID4+IDIzKSAtIDEyNyk7CisvLy8KKy8vLyB3aGVyZSBPcCBpcyB0aGUgaGV4aWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCitzdGF0aWMgU0RWYWx1ZQorR2V0RXhwb25lbnQoU2VsZWN0aW9uREFHICZEQUcsIFNEVmFsdWUgT3AsIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEksCisgICAgICAgICAgICBEZWJ1Z0xvYyBkbCkgeworICBTRFZhbHVlIHQwID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBNVlQ6OmkzMiwgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMHg3ZjgwMDAwMCwgTVZUOjppMzIpKTsKKyAgU0RWYWx1ZSB0MSA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTVZUOjppMzIsIHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDIzLCBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwgTVZUOjppMzIsIHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEyNywgTVZUOjppMzIpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0lOVF9UT19GUCwgZGwsIE1WVDo6ZjMyLCB0Mik7Cit9CisKKy8vLyBnZXRGMzJDb25zdGFudCAtIEdldCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuCitzdGF0aWMgU0RWYWx1ZQorZ2V0RjMyQ29uc3RhbnQoU2VsZWN0aW9uREFHICZEQUcsIHVuc2lnbmVkIEZsdCkgeworICByZXR1cm4gREFHLmdldENvbnN0YW50RlAoQVBGbG9hdChBUEludCgzMiwgRmx0KSksIE1WVDo6ZjMyKTsKK30KKworLy8vIElubGluZWQgdXRpbGl0eSBmdW5jdGlvbiB0byBpbXBsZW1lbnQgYmluYXJ5IGlucHV0IGF0b21pYyBpbnRyaW5zaWNzIGZvcgorLy8vIHZpc2l0SW50cmluc2ljQ2FsbDogSSBpcyBhIGNhbGwgaW5zdHJ1Y3Rpb24KKy8vLyAgICAgICAgICAgICAgICAgICAgIE9wIGlzIHRoZSBhc3NvY2lhdGVkIE5vZGVUeXBlIGZvciBJCitjb25zdCBjaGFyICoKK1NlbGVjdGlvbkRBR0J1aWxkZXI6OmltcGxWaXNpdEJpbmFyeUF0b21pYyhjb25zdCBDYWxsSW5zdCYgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6Ok5vZGVUeXBlIE9wKSB7CisgIFNEVmFsdWUgUm9vdCA9IGdldFJvb3QoKTsKKyAgU0RWYWx1ZSBMID0KKyAgICBEQUcuZ2V0QXRvbWljKE9wLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDEpKS5nZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpLAorICAgICAgICAgICAgICAgICAgUm9vdCwKKyAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSksCisgICAgICAgICAgICAgICAgICBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMSkpLAorICAgICAgICAgICAgICAgICAgSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgc2V0VmFsdWUoJkksIEwpOworICBEQUcuc2V0Um9vdChMLmdldFZhbHVlKDEpKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGltcGxWaXNpdEFsdU92ZXJmbG93IC0gTG93ZXIgYXJpdGhtZXRpYyBvdmVyZmxvdyBpbnN0cmluc2ljcy4KK2NvbnN0IGNoYXIgKgorU2VsZWN0aW9uREFHQnVpbGRlcjo6aW1wbFZpc2l0QWx1T3ZlcmZsb3coY29uc3QgQ2FsbEluc3QgJkksIElTRDo6Tm9kZVR5cGUgT3ApIHsKKyAgU0RWYWx1ZSBPcDEgPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworICBTRFZhbHVlIE9wMiA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgxKSk7CisKKyAgU0RWVExpc3QgVlRzID0gREFHLmdldFZUTGlzdChPcDEuZ2V0VmFsdWVUeXBlKCksIE1WVDo6aTEpOworICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoT3AsIGdldEN1ckRlYnVnTG9jKCksIFZUcywgT3AxLCBPcDIpKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyB2aXNpdEV4cCAtIExvd2VyIGFuIGV4cCBpbnRyaW5zaWMuIEhhbmRsZXMgdGhlIHNwZWNpYWwgc2VxdWVuY2VzIGZvcgorLy8vIGxpbWl0ZWQtcHJlY2lzaW9uIG1vZGUuCit2b2lkCitTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdEV4cChjb25zdCBDYWxsSW5zdCAmSSkgeworICBTRFZhbHVlIHJlc3VsdDsKKyAgRGVidWdMb2MgZGwgPSBnZXRDdXJEZWJ1Z0xvYygpOworCisgIGlmIChnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyICYmCisgICAgICBMaW1pdEZsb2F0UHJlY2lzaW9uID4gMCAmJiBMaW1pdEZsb2F0UHJlY2lzaW9uIDw9IDE4KSB7CisgICAgU0RWYWx1ZSBPcCA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSk7CisKKyAgICAvLyBQdXQgdGhlIGV4cG9uZW50IGluIHRoZSByaWdodCBiaXQgcG9zaXRpb24gZm9yIGxhdGVyIGFkZGl0aW9uIHRvIHRoZQorICAgIC8vIGZpbmFsIHJlc3VsdDoKKyAgICAvLworICAgIC8vICAgI2RlZmluZSBMT0cyT0ZlIDEuNDQyNjk1MGYKKyAgICAvLyAgIEludGVnZXJQYXJ0T2ZYID0gKChpbnQzMl90KShYICogTE9HMk9GZSkpOworICAgIFNEVmFsdWUgdDAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZmI4YWEzYikpOworICAgIFNEVmFsdWUgSW50ZWdlclBhcnRPZlggPSBEQUcuZ2V0Tm9kZShJU0Q6OkZQX1RPX1NJTlQsIGRsLCBNVlQ6OmkzMiwgdDApOworCisgICAgLy8gICBGcmFjdGlvbmFsUGFydE9mWCA9IChYICogTE9HMk9GZSkgLSAoZmxvYXQpSW50ZWdlclBhcnRPZlg7CisgICAgU0RWYWx1ZSB0MSA9IERBRy5nZXROb2RlKElTRDo6U0lOVF9UT19GUCwgZGwsIE1WVDo6ZjMyLCBJbnRlZ2VyUGFydE9mWCk7CisgICAgU0RWYWx1ZSBYID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmMzIsIHQwLCB0MSk7CisKKyAgICAvLyAgIEludGVnZXJQYXJ0T2ZYIDw8PSAyMzsKKyAgICBJbnRlZ2VyUGFydE9mWCA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTVZUOjppMzIsIEludGVnZXJQYXJ0T2ZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDIzLCBUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKworICAgIGlmIChMaW1pdEZsb2F0UHJlY2lzaW9uIDw9IDYpIHsKKyAgICAgIC8vIEZvciBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gb2YgNjoKKyAgICAgIC8vCisgICAgICAvLyAgIFR3b1RvRnJhY3Rpb25hbFBhcnRPZlggPQorICAgICAgLy8gICAgIDAuOTk3NTM1NTc4ZiArCisgICAgICAvLyAgICAgICAoMC43MzU2MDc2MjZmICsgMC4yNTI0NjQ0MjRmICogeCkgKiB4OworICAgICAgLy8KKyAgICAgIC8vIGVycm9yIDAuMDE0NDEwMzMxNywgd2hpY2ggaXMgNiBiaXRzCisgICAgICBTRFZhbHVlIHQyID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNlODE0MzA0KSk7CisgICAgICBTRFZhbHVlIHQzID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjNjNTBjOCkpOworICAgICAgU0RWYWx1ZSB0NCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MywgWCk7CisgICAgICBTRFZhbHVlIHQ1ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjdmNWU3ZSkpOworICAgICAgU0RWYWx1ZSBUd29Ub0ZyYWNQYXJ0T2ZYID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsTVZUOjppMzIsIHQ1KTsKKworICAgICAgLy8gQWRkIHRoZSBleHBvbmVudCBpbnRvIHRoZSByZXN1bHQgaW4gaW50ZWdlciBkb21haW4uCisgICAgICBTRFZhbHVlIHQ2ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd29Ub0ZyYWNQYXJ0T2ZYLCBJbnRlZ2VyUGFydE9mWCk7CisKKyAgICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmYzMiwgdDYpOworICAgIH0gZWxzZSBpZiAoTGltaXRGbG9hdFByZWNpc2lvbiA+IDYgJiYgTGltaXRGbG9hdFByZWNpc2lvbiA8PSAxMikgeworICAgICAgLy8gRm9yIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiBvZiAxMjoKKyAgICAgIC8vCisgICAgICAvLyAgIFR3b1RvRnJhY3Rpb25hbFBhcnRPZlggPQorICAgICAgLy8gICAgIDAuOTk5ODkyOTg2ZiArCisgICAgICAvLyAgICAgICAoMC42OTY0NTczMThmICsKKyAgICAgIC8vICAgICAgICAgKDAuMjI0MzM4MzM5ZiArIDAuNzkyMDQzNDM0ZS0xZiAqIHgpICogeCkgKiB4OworICAgICAgLy8KKyAgICAgIC8vIDAuMDAwMTA3MDQ2MjU2IGVycm9yLCB3aGljaCBpcyAxMyB0byAxNCBiaXRzCisgICAgICBTRFZhbHVlIHQyID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNkYTIzNWUzKSk7CisgICAgICBTRFZhbHVlIHQzID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZTY1YjhmMykpOworICAgICAgU0RWYWx1ZSB0NCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MywgWCk7CisgICAgICBTRFZhbHVlIHQ1ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjMyNGIwNykpOworICAgICAgU0RWYWx1ZSB0NiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0NSwgWCk7CisgICAgICBTRFZhbHVlIHQ3ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjdmZjhmZCkpOworICAgICAgU0RWYWx1ZSBUd29Ub0ZyYWNQYXJ0T2ZYID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsTVZUOjppMzIsIHQ3KTsKKworICAgICAgLy8gQWRkIHRoZSBleHBvbmVudCBpbnRvIHRoZSByZXN1bHQgaW4gaW50ZWdlciBkb21haW4uCisgICAgICBTRFZhbHVlIHQ4ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd29Ub0ZyYWNQYXJ0T2ZYLCBJbnRlZ2VyUGFydE9mWCk7CisKKyAgICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmYzMiwgdDgpOworICAgIH0gZWxzZSB7IC8vIExpbWl0RmxvYXRQcmVjaXNpb24gPiAxMiAmJiBMaW1pdEZsb2F0UHJlY2lzaW9uIDw9IDE4CisgICAgICAvLyBGb3IgZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9uIG9mIDE4OgorICAgICAgLy8KKyAgICAgIC8vICAgVHdvVG9GcmFjdGlvbmFsUGFydE9mWCA9CisgICAgICAvLyAgICAgMC45OTk5OTk5ODJmICsKKyAgICAgIC8vICAgICAgICgwLjY5MzE0ODg3MmYgKworICAgICAgLy8gICAgICAgICAoMC4yNDAyMjcwNDRmICsKKyAgICAgIC8vICAgICAgICAgICAoMC41NTQ5MDYwMjFlLTFmICsKKyAgICAgIC8vICAgICAgICAgICAgICgwLjk2MTU5MTkyOGUtMmYgKworICAgICAgLy8gICAgICAgICAgICAgICAoMC4xMzYwMjgzMTJlLTJmICsgMC4xNTcwNTkxNDhlLTNmICp4KSp4KSp4KSp4KSp4KSp4OworICAgICAgLy8KKyAgICAgIC8vIGVycm9yIDIuNDcyMDgwMDAqMTBeKC03KSwgd2hpY2ggaXMgYmV0dGVyIHRoYW4gMTggYml0cworICAgICAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzOTI0YjAzZSkpOworICAgICAgU0RWYWx1ZSB0MyA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2FiMjRiODcpKTsKKyAgICAgIFNEVmFsdWUgdDQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDMsIFgpOworICAgICAgU0RWYWx1ZSB0NSA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2MxZDhjMTcpKTsKKyAgICAgIFNEVmFsdWUgdDYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDUsIFgpOworICAgICAgU0RWYWx1ZSB0NyA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2Q2MzRhMWQpKTsKKyAgICAgIFNEVmFsdWUgdDggPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDcsIFgpOworICAgICAgU0RWYWx1ZSB0OSA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2U3NWZlMTQpKTsKKyAgICAgIFNEVmFsdWUgdDEwID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQ5LCBYKTsKKyAgICAgIFNEVmFsdWUgdDExID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNmMzE3MjM0KSk7CisgICAgICBTRFZhbHVlIHQxMiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MTEsIFgpOworICAgICAgU0RWYWx1ZSB0MTMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBNVlQ6OmYzMiwgdDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2Y4MDAwMDApKTsKKyAgICAgIFNEVmFsdWUgVHdvVG9GcmFjUGFydE9mWCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIsIHQxMyk7CisKKyAgICAgIC8vIEFkZCB0aGUgZXhwb25lbnQgaW50byB0aGUgcmVzdWx0IGluIGludGVnZXIgZG9tYWluLgorICAgICAgU0RWYWx1ZSB0MTQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd29Ub0ZyYWNQYXJ0T2ZYLCBJbnRlZ2VyUGFydE9mWCk7CisKKyAgICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmYzMiwgdDE0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gTm8gc3BlY2lhbCBleHBhbnNpb24uCisgICAgcmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpGRVhQLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkpOworICB9CisKKyAgc2V0VmFsdWUoJkksIHJlc3VsdCk7Cit9CisKKy8vLyB2aXNpdExvZyAtIExvd2VyIGEgbG9nIGludHJpbnNpYy4gSGFuZGxlcyB0aGUgc3BlY2lhbCBzZXF1ZW5jZXMgZm9yCisvLy8gbGltaXRlZC1wcmVjaXNpb24gbW9kZS4KK3ZvaWQKK1NlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0TG9nKGNvbnN0IENhbGxJbnN0ICZJKSB7CisgIFNEVmFsdWUgcmVzdWx0OworICBEZWJ1Z0xvYyBkbCA9IGdldEN1ckRlYnVnTG9jKCk7CisKKyAgaWYgKGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmMzIgJiYKKyAgICAgIExpbWl0RmxvYXRQcmVjaXNpb24gPiAwICYmIExpbWl0RmxvYXRQcmVjaXNpb24gPD0gMTgpIHsKKyAgICBTRFZhbHVlIE9wID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBTRFZhbHVlIE9wMSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmkzMiwgT3ApOworCisgICAgLy8gU2NhbGUgdGhlIGV4cG9uZW50IGJ5IGxvZygyKSBbMC42OTMxNDcxOGZdLgorICAgIFNEVmFsdWUgRXhwID0gR2V0RXhwb25lbnQoREFHLCBPcDEsIFRMSSwgZGwpOworICAgIFNEVmFsdWUgTG9nT2ZFeHBvbmVudCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCBFeHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNmMzE3MjE4KSk7CisKKyAgICAvLyBHZXQgdGhlIHNpZ25pZmljYW5kIGFuZCBidWlsZCBpdCBpbnRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpdGgKKyAgICAvLyBleHBvbmVudCBvZiAxLgorICAgIFNEVmFsdWUgWCA9IEdldFNpZ25pZmljYW5kKERBRywgT3AxLCBkbCk7CisKKyAgICBpZiAoTGltaXRGbG9hdFByZWNpc2lvbiA8PSA2KSB7CisgICAgICAvLyBGb3IgZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9uIG9mIDY6CisgICAgICAvLworICAgICAgLy8gICBMb2dvZk1hbnRpc3NhID0KKyAgICAgIC8vICAgICAtMS4xNjA5NTQ2ZiArCisgICAgICAvLyAgICAgICAoMS40MDM0MDI1ZiAtIDAuMjM5MDMwMjFmICogeCkgKiB4OworICAgICAgLy8KKyAgICAgIC8vIGVycm9yIDAuMDAzNDI3NjA2Niwgd2hpY2ggaXMgYmV0dGVyIHRoYW4gOCBiaXRzCisgICAgICBTRFZhbHVlIHQwID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweGJlNzRjNDU2KSk7CisgICAgICBTRFZhbHVlIHQxID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZmIzYTJiMSkpOworICAgICAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MSwgWCk7CisgICAgICBTRFZhbHVlIExvZ09mTWFudGlzc2EgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OmYzMiwgdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2Y5NDlhMjkpKTsKKworICAgICAgcmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6ZjMyLCBMb2dPZkV4cG9uZW50LCBMb2dPZk1hbnRpc3NhKTsKKyAgICB9IGVsc2UgaWYgKExpbWl0RmxvYXRQcmVjaXNpb24gPiA2ICYmIExpbWl0RmxvYXRQcmVjaXNpb24gPD0gMTIpIHsKKyAgICAgIC8vIEZvciBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gb2YgMTI6CisgICAgICAvLworICAgICAgLy8gICBMb2dPZk1hbnRpc3NhID0KKyAgICAgIC8vICAgICAtMS43NDE3OTM5ZiArCisgICAgICAvLyAgICAgICAoMi44MjEyMDI2ZiArCisgICAgICAvLyAgICAgICAgICgtMS40Njk5NTY4ZiArCisgICAgICAvLyAgICAgICAgICAgKDAuNDQ3MTc5NTVmIC0gMC41NjU3MDg1MWUtMWYgKiB4KSAqIHgpICogeCkgKiB4OworICAgICAgLy8KKyAgICAgIC8vIGVycm9yIDAuMDAwMDYxMDExNDM2LCB3aGljaCBpcyAxNCBiaXRzCisgICAgICBTRFZhbHVlIHQwID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweGJkNjdiNmQ2KSk7CisgICAgICBTRFZhbHVlIHQxID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZWU0ZjRiOCkpOworICAgICAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MSwgWCk7CisgICAgICBTRFZhbHVlIHQzID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmMzIsIHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZmJjMjc4YikpOworICAgICAgU0RWYWx1ZSB0NCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MywgWCk7CisgICAgICBTRFZhbHVlIHQ1ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDM0OGU5NSkpOworICAgICAgU0RWYWx1ZSB0NiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0NSwgWCk7CisgICAgICBTRFZhbHVlIExvZ09mTWFudGlzc2EgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OmYzMiwgdDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2ZkZWYzMWEpKTsKKworICAgICAgcmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6ZjMyLCBMb2dPZkV4cG9uZW50LCBMb2dPZk1hbnRpc3NhKTsKKyAgICB9IGVsc2UgeyAvLyBMaW1pdEZsb2F0UHJlY2lzaW9uID4gMTIgJiYgTGltaXRGbG9hdFByZWNpc2lvbiA8PSAxOAorICAgICAgLy8gRm9yIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiBvZiAxODoKKyAgICAgIC8vCisgICAgICAvLyAgIExvZ09mTWFudGlzc2EgPQorICAgICAgLy8gICAgIC0yLjEwNzIxODRmICsKKyAgICAgIC8vICAgICAgICg0LjIzNzI3OTRmICsKKyAgICAgIC8vICAgICAgICAgKC0zLjcwMjk0ODVmICsKKyAgICAgIC8vICAgICAgICAgICAoMi4yNzgxOTQ1ZiArCisgICAgICAvLyAgICAgICAgICAgICAoLTAuODc4MjMzMTRmICsKKyAgICAgIC8vICAgICAgICAgICAgICAgKDAuMTkwNzM3MzlmIC0gMC4xNzgwOTcxMmUtMWYgKiB4KSAqIHgpICogeCkgKiB4KSAqIHgpKng7CisgICAgICAvLworICAgICAgLy8gZXJyb3IgMC4wMDAwMDIzNjYwNTY4LCB3aGljaCBpcyBiZXR0ZXIgdGhhbiAxOCBiaXRzCisgICAgICBTRFZhbHVlIHQwID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweGJjOTFlNWFjKSk7CisgICAgICBTRFZhbHVlIHQxID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZTQzNTBhYSkpOworICAgICAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MSwgWCk7CisgICAgICBTRFZhbHVlIHQzID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmMzIsIHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjYwZDNlMykpOworICAgICAgU0RWYWx1ZSB0NCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MywgWCk7CisgICAgICBTRFZhbHVlIHQ1ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDExY2RmMCkpOworICAgICAgU0RWYWx1ZSB0NiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0NSwgWCk7CisgICAgICBTRFZhbHVlIHQ3ID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmMzIsIHQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDZjZmQxYykpOworICAgICAgU0RWYWx1ZSB0OCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0NywgWCk7CisgICAgICBTRFZhbHVlIHQ5ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDg3OTdjYikpOworICAgICAgU0RWYWx1ZSB0MTAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDksIFgpOworICAgICAgU0RWYWx1ZSBMb2dPZk1hbnRpc3NhID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmMzIsIHQxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDA2ZGNhYikpOworCisgICAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmMzIsIExvZ09mRXhwb25lbnQsIExvZ09mTWFudGlzc2EpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBObyBzcGVjaWFsIGV4cGFuc2lvbi4KKyAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZMT0csIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKSk7CisgIH0KKworICBzZXRWYWx1ZSgmSSwgcmVzdWx0KTsKK30KKworLy8vIHZpc2l0TG9nMiAtIExvd2VyIGEgbG9nMiBpbnRyaW5zaWMuIEhhbmRsZXMgdGhlIHNwZWNpYWwgc2VxdWVuY2VzIGZvcgorLy8vIGxpbWl0ZWQtcHJlY2lzaW9uIG1vZGUuCit2b2lkCitTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdExvZzIoY29uc3QgQ2FsbEluc3QgJkkpIHsKKyAgU0RWYWx1ZSByZXN1bHQ7CisgIERlYnVnTG9jIGRsID0gZ2V0Q3VyRGVidWdMb2MoKTsKKworICBpZiAoZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmYzMiAmJgorICAgICAgTGltaXRGbG9hdFByZWNpc2lvbiA+IDAgJiYgTGltaXRGbG9hdFByZWNpc2lvbiA8PSAxOCkgeworICAgIFNEVmFsdWUgT3AgPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworICAgIFNEVmFsdWUgT3AxID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6aTMyLCBPcCk7CisKKyAgICAvLyBHZXQgdGhlIGV4cG9uZW50LgorICAgIFNEVmFsdWUgTG9nT2ZFeHBvbmVudCA9IEdldEV4cG9uZW50KERBRywgT3AxLCBUTEksIGRsKTsKKworICAgIC8vIEdldCB0aGUgc2lnbmlmaWNhbmQgYW5kIGJ1aWxkIGl0IGludG8gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgd2l0aAorICAgIC8vIGV4cG9uZW50IG9mIDEuCisgICAgU0RWYWx1ZSBYID0gR2V0U2lnbmlmaWNhbmQoREFHLCBPcDEsIGRsKTsKKworICAgIC8vIERpZmZlcmVudCBwb3NzaWJsZSBtaW5pbWF4IGFwcHJveGltYXRpb25zIG9mIHNpZ25pZmljYW5kIGluCisgICAgLy8gZmxvYXRpbmctcG9pbnQgZm9yIHZhcmlvdXMgZGVncmVlcyBvZiBhY2N1cmFjeSBvdmVyIFsxLDJdLgorICAgIGlmIChMaW1pdEZsb2F0UHJlY2lzaW9uIDw9IDYpIHsKKyAgICAgIC8vIEZvciBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gb2YgNjoKKyAgICAgIC8vCisgICAgICAvLyAgIExvZzJvZk1hbnRpc3NhID0gLTEuNjc0OTAzNWYgKyAoMi4wMjQ2ODE3ZiAtIC4zNDQ4NDc2OGYgKiB4KSAqIHg7CisgICAgICAvLworICAgICAgLy8gZXJyb3IgMC4wMDQ5NDUxNzQyLCB3aGljaCBpcyBtb3JlIHRoYW4gNyBiaXRzCisgICAgICBTRFZhbHVlIHQwID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweGJlYjA4ZmUwKSk7CisgICAgICBTRFZhbHVlIHQxID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDAxOTQ2MykpOworICAgICAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MSwgWCk7CisgICAgICBTRFZhbHVlIExvZzJvZk1hbnRpc3NhID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmMzIsIHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZmQ2NjMzZCkpOworCisgICAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmMzIsIExvZ09mRXhwb25lbnQsIExvZzJvZk1hbnRpc3NhKTsKKyAgICB9IGVsc2UgaWYgKExpbWl0RmxvYXRQcmVjaXNpb24gPiA2ICYmIExpbWl0RmxvYXRQcmVjaXNpb24gPD0gMTIpIHsKKyAgICAgIC8vIEZvciBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gb2YgMTI6CisgICAgICAvLworICAgICAgLy8gICBMb2cyb2ZNYW50aXNzYSA9CisgICAgICAvLyAgICAgLTIuNTEyODU0NTRmICsKKyAgICAgIC8vICAgICAgICg0LjA3MDA5MDU2ZiArCisgICAgICAvLyAgICAgICAgICgtMi4xMjA2NzQ4OWYgKworICAgICAgLy8gICAgICAgICAgICguNjQ1MTQyMjQ4ZiAtIDAuODE2MTU3ODg2ZS0xZiAqIHgpICogeCkgKiB4KSAqIHg7CisgICAgICAvLworICAgICAgLy8gZXJyb3IgMC4wMDAwODc2MTM2MDAwLCB3aGljaCBpcyBiZXR0ZXIgdGhhbiAxMyBiaXRzCisgICAgICBTRFZhbHVlIHQwID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweGJkYTcyNjJlKSk7CisgICAgICBTRFZhbHVlIHQxID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjI1MjgwYikpOworICAgICAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MSwgWCk7CisgICAgICBTRFZhbHVlIHQzID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmMzIsIHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDA3YjkyMykpOworICAgICAgU0RWYWx1ZSB0NCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MywgWCk7CisgICAgICBTRFZhbHVlIHQ1ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDgyM2UyZikpOworICAgICAgU0RWYWx1ZSB0NiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0NSwgWCk7CisgICAgICBTRFZhbHVlIExvZzJvZk1hbnRpc3NhID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmMzIsIHQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDIwZDI5YykpOworCisgICAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmMzIsIExvZ09mRXhwb25lbnQsIExvZzJvZk1hbnRpc3NhKTsKKyAgICB9IGVsc2UgeyAvLyBMaW1pdEZsb2F0UHJlY2lzaW9uID4gMTIgJiYgTGltaXRGbG9hdFByZWNpc2lvbiA8PSAxOAorICAgICAgLy8gRm9yIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiBvZiAxODoKKyAgICAgIC8vCisgICAgICAvLyAgIExvZzJvZk1hbnRpc3NhID0KKyAgICAgIC8vICAgICAtMy4wNDAwNDk1ZiArCisgICAgICAvLyAgICAgICAoNi4xMTI5OTc2ZiArCisgICAgICAvLyAgICAgICAgICgtNS4zNDIwNDA5ZiArCisgICAgICAvLyAgICAgICAgICAgKDMuMjg2NTY4M2YgKworICAgICAgLy8gICAgICAgICAgICAgKC0xLjI2NjkzNDNmICsKKyAgICAgIC8vICAgICAgICAgICAgICAgKDAuMjc1MTUxOTlmIC0KKyAgICAgIC8vICAgICAgICAgICAgICAgICAwLjI1NjkxMzI3ZS0xZiAqIHgpICogeCkgKiB4KSAqIHgpICogeCkgKiB4OworICAgICAgLy8KKyAgICAgIC8vIGVycm9yIDAuMDAwMDAxODUxNiwgd2hpY2ggaXMgYmV0dGVyIHRoYW4gMTggYml0cworICAgICAgU0RWYWx1ZSB0MCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHhiY2QyNzY5ZSkpOworICAgICAgU0RWYWx1ZSB0MSA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2U4Y2UwYjkpKTsKKyAgICAgIFNEVmFsdWUgdDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDEsIFgpOworICAgICAgU0RWYWx1ZSB0MyA9IERBRy5nZXROb2RlKElTRDo6RlNVQiwgZGwsIE1WVDo6ZjMyLCB0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2ZhMjJhZTcpKTsKKyAgICAgIFNEVmFsdWUgdDQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDMsIFgpOworICAgICAgU0RWYWx1ZSB0NSA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4NDA1MjU3MjMpKTsKKyAgICAgIFNEVmFsdWUgdDYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDUsIFgpOworICAgICAgU0RWYWx1ZSB0NyA9IERBRy5nZXROb2RlKElTRDo6RlNVQiwgZGwsIE1WVDo6ZjMyLCB0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4NDBhYWYyMDApKTsKKyAgICAgIFNEVmFsdWUgdDggPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDcsIFgpOworICAgICAgU0RWYWx1ZSB0OSA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4NDBjMzlkYWQpKTsKKyAgICAgIFNEVmFsdWUgdDEwID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQ5LCBYKTsKKyAgICAgIFNEVmFsdWUgTG9nMm9mTWFudGlzc2EgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OmYzMiwgdDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHg0MDQyOTAyYykpOworCisgICAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmMzIsIExvZ09mRXhwb25lbnQsIExvZzJvZk1hbnRpc3NhKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gTm8gc3BlY2lhbCBleHBhbnNpb24uCisgICAgcmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpGTE9HMiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpKTsKKyAgfQorCisgIHNldFZhbHVlKCZJLCByZXN1bHQpOworfQorCisvLy8gdmlzaXRMb2cxMCAtIExvd2VyIGEgbG9nMTAgaW50cmluc2ljLiBIYW5kbGVzIHRoZSBzcGVjaWFsIHNlcXVlbmNlcyBmb3IKKy8vLyBsaW1pdGVkLXByZWNpc2lvbiBtb2RlLgordm9pZAorU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRMb2cxMChjb25zdCBDYWxsSW5zdCAmSSkgeworICBTRFZhbHVlIHJlc3VsdDsKKyAgRGVidWdMb2MgZGwgPSBnZXRDdXJEZWJ1Z0xvYygpOworCisgIGlmIChnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyICYmCisgICAgICBMaW1pdEZsb2F0UHJlY2lzaW9uID4gMCAmJiBMaW1pdEZsb2F0UHJlY2lzaW9uIDw9IDE4KSB7CisgICAgU0RWYWx1ZSBPcCA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSk7CisgICAgU0RWYWx1ZSBPcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjppMzIsIE9wKTsKKworICAgIC8vIFNjYWxlIHRoZSBleHBvbmVudCBieSBsb2cxMCgyKSBbMC4zMDEwMjk5OWZdLgorICAgIFNEVmFsdWUgRXhwID0gR2V0RXhwb25lbnQoREFHLCBPcDEsIFRMSSwgZGwpOworICAgIFNEVmFsdWUgTG9nT2ZFeHBvbmVudCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCBFeHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNlOWEyMDlhKSk7CisKKyAgICAvLyBHZXQgdGhlIHNpZ25pZmljYW5kIGFuZCBidWlsZCBpdCBpbnRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpdGgKKyAgICAvLyBleHBvbmVudCBvZiAxLgorICAgIFNEVmFsdWUgWCA9IEdldFNpZ25pZmljYW5kKERBRywgT3AxLCBkbCk7CisKKyAgICBpZiAoTGltaXRGbG9hdFByZWNpc2lvbiA8PSA2KSB7CisgICAgICAvLyBGb3IgZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9uIG9mIDY6CisgICAgICAvLworICAgICAgLy8gICBMb2cxMG9mTWFudGlzc2EgPQorICAgICAgLy8gICAgIC0wLjUwNDE5NjE5ZiArCisgICAgICAvLyAgICAgICAoMC42MDk0ODk5NWYgLSAwLjEwMzgwOTUwZiAqIHgpICogeDsKKyAgICAgIC8vCisgICAgICAvLyBlcnJvciAwLjAwMTQ4ODYxNjUsIHdoaWNoIGlzIDYgYml0cworICAgICAgU0RWYWx1ZSB0MCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHhiZGQ0OWExMykpOworICAgICAgU0RWYWx1ZSB0MSA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2YxYzA3ODkpKTsKKyAgICAgIFNEVmFsdWUgdDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDEsIFgpOworICAgICAgU0RWYWx1ZSBMb2cxMG9mTWFudGlzc2EgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OmYzMiwgdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjAxMTMwMCkpOworCisgICAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmMzIsIExvZ09mRXhwb25lbnQsIExvZzEwb2ZNYW50aXNzYSk7CisgICAgfSBlbHNlIGlmIChMaW1pdEZsb2F0UHJlY2lzaW9uID4gNiAmJiBMaW1pdEZsb2F0UHJlY2lzaW9uIDw9IDEyKSB7CisgICAgICAvLyBGb3IgZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9uIG9mIDEyOgorICAgICAgLy8KKyAgICAgIC8vICAgTG9nMTBvZk1hbnRpc3NhID0KKyAgICAgIC8vICAgICAtMC42NDgzMTE4MGYgKworICAgICAgLy8gICAgICAgKDAuOTE3NTEzOTdmICsKKyAgICAgIC8vICAgICAgICAgKC0wLjMxNjY0ODA2ZiArIDAuNDc2MzcxNjhlLTFmICogeCkgKiB4KSAqIHg7CisgICAgICAvLworICAgICAgLy8gZXJyb3IgMC4wMDAxOTIyODAzNiwgd2hpY2ggaXMgYmV0dGVyIHRoYW4gMTIgYml0cworICAgICAgU0RWYWx1ZSB0MCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZDQzMWYzMSkpOworICAgICAgU0RWYWx1ZSB0MSA9IERBRy5nZXROb2RlKElTRDo6RlNVQiwgZGwsIE1WVDo6ZjMyLCB0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2VhMjFmYjIpKTsKKyAgICAgIFNEVmFsdWUgdDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDEsIFgpOworICAgICAgU0RWYWx1ZSB0MyA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2Y2YWUyMzIpKTsKKyAgICAgIFNEVmFsdWUgdDQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDMsIFgpOworICAgICAgU0RWYWx1ZSBMb2cxMG9mTWFudGlzc2EgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OmYzMiwgdDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjI1ZjdjMykpOworCisgICAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmMzIsIExvZ09mRXhwb25lbnQsIExvZzEwb2ZNYW50aXNzYSk7CisgICAgfSBlbHNlIHsgLy8gTGltaXRGbG9hdFByZWNpc2lvbiA+IDEyICYmIExpbWl0RmxvYXRQcmVjaXNpb24gPD0gMTgKKyAgICAgIC8vIEZvciBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gb2YgMTg6CisgICAgICAvLworICAgICAgLy8gICBMb2cxMG9mTWFudGlzc2EgPQorICAgICAgLy8gICAgIC0wLjg0Mjk5Mzc1ZiArCisgICAgICAvLyAgICAgICAoMS41MzI3NTgyZiArCisgICAgICAvLyAgICAgICAgICgtMS4wNjg4OTU2ZiArCisgICAgICAvLyAgICAgICAgICAgKDAuNDkxMDI0NzRmICsKKyAgICAgIC8vICAgICAgICAgICAgICgtMC4xMjUzOTgwN2YgKyAwLjEzNTA4MjczZS0xZiAqIHgpICogeCkgKiB4KSAqIHgpICogeDsKKyAgICAgIC8vCisgICAgICAvLyBlcnJvciAwLjAwMDAwMzc5OTU3MzAsIHdoaWNoIGlzIGJldHRlciB0aGFuIDE4IGJpdHMKKyAgICAgIFNEVmFsdWUgdDAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2M1ZDUxY2UpKTsKKyAgICAgIFNEVmFsdWUgdDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OmYzMiwgdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNlMDA2ODVhKSk7CisgICAgICBTRFZhbHVlIHQyID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQxLCBYKTsKKyAgICAgIFNEVmFsdWUgdDMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBNVlQ6OmYzMiwgdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNlZmI2Nzk4KSk7CisgICAgICBTRFZhbHVlIHQ0ID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQzLCBYKTsKKyAgICAgIFNEVmFsdWUgdDUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OmYzMiwgdDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNmODhkMTkyKSk7CisgICAgICBTRFZhbHVlIHQ2ID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQ1LCBYKTsKKyAgICAgIFNEVmFsdWUgdDcgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBNVlQ6OmYzMiwgdDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNmYzQzMTZjKSk7CisgICAgICBTRFZhbHVlIHQ4ID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQ3LCBYKTsKKyAgICAgIFNEVmFsdWUgTG9nMTBvZk1hbnRpc3NhID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmMzIsIHQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2Y1N2NlNzApKTsKKworICAgICAgcmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6ZjMyLCBMb2dPZkV4cG9uZW50LCBMb2cxMG9mTWFudGlzc2EpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBObyBzcGVjaWFsIGV4cGFuc2lvbi4KKyAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZMT0cxMCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpKTsKKyAgfQorCisgIHNldFZhbHVlKCZJLCByZXN1bHQpOworfQorCisvLy8gdmlzaXRFeHAyIC0gTG93ZXIgYW4gZXhwMiBpbnRyaW5zaWMuIEhhbmRsZXMgdGhlIHNwZWNpYWwgc2VxdWVuY2VzIGZvcgorLy8vIGxpbWl0ZWQtcHJlY2lzaW9uIG1vZGUuCit2b2lkCitTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdEV4cDIoY29uc3QgQ2FsbEluc3QgJkkpIHsKKyAgU0RWYWx1ZSByZXN1bHQ7CisgIERlYnVnTG9jIGRsID0gZ2V0Q3VyRGVidWdMb2MoKTsKKworICBpZiAoZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmYzMiAmJgorICAgICAgTGltaXRGbG9hdFByZWNpc2lvbiA+IDAgJiYgTGltaXRGbG9hdFByZWNpc2lvbiA8PSAxOCkgeworICAgIFNEVmFsdWUgT3AgPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworCisgICAgU0RWYWx1ZSBJbnRlZ2VyUGFydE9mWCA9IERBRy5nZXROb2RlKElTRDo6RlBfVE9fU0lOVCwgZGwsIE1WVDo6aTMyLCBPcCk7CisKKyAgICAvLyAgIEZyYWN0aW9uYWxQYXJ0T2ZYID0geCAtIChmbG9hdClJbnRlZ2VyUGFydE9mWDsKKyAgICBTRFZhbHVlIHQxID0gREFHLmdldE5vZGUoSVNEOjpTSU5UX1RPX0ZQLCBkbCwgTVZUOjpmMzIsIEludGVnZXJQYXJ0T2ZYKTsKKyAgICBTRFZhbHVlIFggPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OmYzMiwgT3AsIHQxKTsKKworICAgIC8vICAgSW50ZWdlclBhcnRPZlggPDw9IDIzOworICAgIEludGVnZXJQYXJ0T2ZYID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBNVlQ6OmkzMiwgSW50ZWdlclBhcnRPZlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMjMsIFRMSS5nZXRQb2ludGVyVHkoKSkpOworCisgICAgaWYgKExpbWl0RmxvYXRQcmVjaXNpb24gPD0gNikgeworICAgICAgLy8gRm9yIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiBvZiA2OgorICAgICAgLy8KKyAgICAgIC8vICAgVHdvVG9GcmFjdGlvbmFsUGFydE9mWCA9CisgICAgICAvLyAgICAgMC45OTc1MzU1NzhmICsKKyAgICAgIC8vICAgICAgICgwLjczNTYwNzYyNmYgKyAwLjI1MjQ2NDQyNGYgKiB4KSAqIHg7CisgICAgICAvLworICAgICAgLy8gZXJyb3IgMC4wMTQ0MTAzMzE3LCB3aGljaCBpcyA2IGJpdHMKKyAgICAgIFNEVmFsdWUgdDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2U4MTQzMDQpKTsKKyAgICAgIFNEVmFsdWUgdDMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBNVlQ6OmYzMiwgdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNmM2M1MGM4KSk7CisgICAgICBTRFZhbHVlIHQ0ID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQzLCBYKTsKKyAgICAgIFNEVmFsdWUgdDUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBNVlQ6OmYzMiwgdDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNmN2Y1ZTdlKSk7CisgICAgICBTRFZhbHVlIHQ2ID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6aTMyLCB0NSk7CisgICAgICBTRFZhbHVlIFR3b1RvRnJhY3Rpb25hbFBhcnRPZlggPQorICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCB0NiwgSW50ZWdlclBhcnRPZlgpOworCisgICAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6ZjMyLCBUd29Ub0ZyYWN0aW9uYWxQYXJ0T2ZYKTsKKyAgICB9IGVsc2UgaWYgKExpbWl0RmxvYXRQcmVjaXNpb24gPiA2ICYmIExpbWl0RmxvYXRQcmVjaXNpb24gPD0gMTIpIHsKKyAgICAgIC8vIEZvciBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gb2YgMTI6CisgICAgICAvLworICAgICAgLy8gICBUd29Ub0ZyYWN0aW9uYWxQYXJ0T2ZYID0KKyAgICAgIC8vICAgICAwLjk5OTg5Mjk4NmYgKworICAgICAgLy8gICAgICAgKDAuNjk2NDU3MzE4ZiArCisgICAgICAvLyAgICAgICAgICgwLjIyNDMzODMzOWYgKyAwLjc5MjA0MzQzNGUtMWYgKiB4KSAqIHgpICogeDsKKyAgICAgIC8vCisgICAgICAvLyBlcnJvciAwLjAwMDEwNzA0NjI1Niwgd2hpY2ggaXMgMTMgdG8gMTQgYml0cworICAgICAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZGEyMzVlMykpOworICAgICAgU0RWYWx1ZSB0MyA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2U2NWI4ZjMpKTsKKyAgICAgIFNEVmFsdWUgdDQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDMsIFgpOworICAgICAgU0RWYWx1ZSB0NSA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2YzMjRiMDcpKTsKKyAgICAgIFNEVmFsdWUgdDYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDUsIFgpOworICAgICAgU0RWYWx1ZSB0NyA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2Y3ZmY4ZmQpKTsKKyAgICAgIFNEVmFsdWUgdDggPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjppMzIsIHQ3KTsKKyAgICAgIFNEVmFsdWUgVHdvVG9GcmFjdGlvbmFsUGFydE9mWCA9CisgICAgICAgIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppMzIsIHQ4LCBJbnRlZ2VyUGFydE9mWCk7CisKKyAgICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmMzIsIFR3b1RvRnJhY3Rpb25hbFBhcnRPZlgpOworICAgIH0gZWxzZSB7IC8vIExpbWl0RmxvYXRQcmVjaXNpb24gPiAxMiAmJiBMaW1pdEZsb2F0UHJlY2lzaW9uIDw9IDE4CisgICAgICAvLyBGb3IgZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9uIG9mIDE4OgorICAgICAgLy8KKyAgICAgIC8vICAgVHdvVG9GcmFjdGlvbmFsUGFydE9mWCA9CisgICAgICAvLyAgICAgMC45OTk5OTk5ODJmICsKKyAgICAgIC8vICAgICAgICgwLjY5MzE0ODg3MmYgKworICAgICAgLy8gICAgICAgICAoMC4yNDAyMjcwNDRmICsKKyAgICAgIC8vICAgICAgICAgICAoMC41NTQ5MDYwMjFlLTFmICsKKyAgICAgIC8vICAgICAgICAgICAgICgwLjk2MTU5MTkyOGUtMmYgKworICAgICAgLy8gICAgICAgICAgICAgICAoMC4xMzYwMjgzMTJlLTJmICsgMC4xNTcwNTkxNDhlLTNmICp4KSp4KSp4KSp4KSp4KSp4OworICAgICAgLy8gZXJyb3IgMi40NzIwODAwMCoxMF4oLTcpLCB3aGljaCBpcyBiZXR0ZXIgdGhhbiAxOCBiaXRzCisgICAgICBTRFZhbHVlIHQyID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDM5MjRiMDNlKSk7CisgICAgICBTRFZhbHVlIHQzID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzYWIyNGI4NykpOworICAgICAgU0RWYWx1ZSB0NCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MywgWCk7CisgICAgICBTRFZhbHVlIHQ1ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzYzFkOGMxNykpOworICAgICAgU0RWYWx1ZSB0NiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0NSwgWCk7CisgICAgICBTRFZhbHVlIHQ3ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZDYzNGExZCkpOworICAgICAgU0RWYWx1ZSB0OCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0NywgWCk7CisgICAgICBTRFZhbHVlIHQ5ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZTc1ZmUxNCkpOworICAgICAgU0RWYWx1ZSB0MTAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDksIFgpOworICAgICAgU0RWYWx1ZSB0MTEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBNVlQ6OmYzMiwgdDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2YzMTcyMzQpKTsKKyAgICAgIFNEVmFsdWUgdDEyID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQxMSwgWCk7CisgICAgICBTRFZhbHVlIHQxMyA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjgwMDAwMCkpOworICAgICAgU0RWYWx1ZSB0MTQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjppMzIsIHQxMyk7CisgICAgICBTRFZhbHVlIFR3b1RvRnJhY3Rpb25hbFBhcnRPZlggPQorICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCB0MTQsIEludGVnZXJQYXJ0T2ZYKTsKKworICAgICAgcmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmYzMiwgVHdvVG9GcmFjdGlvbmFsUGFydE9mWCk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIE5vIHNwZWNpYWwgZXhwYW5zaW9uLgorICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6RkVYUDIsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKSk7CisgIH0KKworICBzZXRWYWx1ZSgmSSwgcmVzdWx0KTsKK30KKworLy8vIHZpc2l0UG93IC0gTG93ZXIgYSBwb3cgaW50cmluc2ljLiBIYW5kbGVzIHRoZSBzcGVjaWFsIHNlcXVlbmNlcyBmb3IKKy8vLyBsaW1pdGVkLXByZWNpc2lvbiBtb2RlIHdpdGggeCA9PSAxMC4wZi4KK3ZvaWQKK1NlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0UG93KGNvbnN0IENhbGxJbnN0ICZJKSB7CisgIFNEVmFsdWUgcmVzdWx0OworICBjb25zdCBWYWx1ZSAqVmFsID0gSS5nZXRBcmdPcGVyYW5kKDApOworICBEZWJ1Z0xvYyBkbCA9IGdldEN1ckRlYnVnTG9jKCk7CisgIGJvb2wgSXNFeHAxMCA9IGZhbHNlOworCisgIGlmIChnZXRWYWx1ZShWYWwpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyICYmCisgICAgICBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMSkpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyICYmCisgICAgICBMaW1pdEZsb2F0UHJlY2lzaW9uID4gMCAmJiBMaW1pdEZsb2F0UHJlY2lzaW9uIDw9IDE4KSB7CisgICAgaWYgKENvbnN0YW50ICpDID0gY29uc3RfY2FzdDxDb25zdGFudCo+KGR5bl9jYXN0PENvbnN0YW50PihWYWwpKSkgeworICAgICAgaWYgKENvbnN0YW50RlAgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlA+KEMpKSB7CisgICAgICAgIEFQRmxvYXQgVGVuKDEwLjBmKTsKKyAgICAgICAgSXNFeHAxMCA9IENGUC0+Z2V0VmFsdWVBUEYoKS5iaXR3aXNlSXNFcXVhbChUZW4pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChJc0V4cDEwICYmIExpbWl0RmxvYXRQcmVjaXNpb24gPiAwICYmIExpbWl0RmxvYXRQcmVjaXNpb24gPD0gMTgpIHsKKyAgICBTRFZhbHVlIE9wID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDEpKTsKKworICAgIC8vIFB1dCB0aGUgZXhwb25lbnQgaW4gdGhlIHJpZ2h0IGJpdCBwb3NpdGlvbiBmb3IgbGF0ZXIgYWRkaXRpb24gdG8gdGhlCisgICAgLy8gZmluYWwgcmVzdWx0OgorICAgIC8vCisgICAgLy8gICAjZGVmaW5lIExPRzJPRjEwIDMuMzIxOTI4MWYKKyAgICAvLyAgIEludGVnZXJQYXJ0T2ZYID0gKGludDMyX3QpKHggKiBMT0cyT0YxMCk7CisgICAgU0RWYWx1ZSB0MCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDQwNTQ5YTc4KSk7CisgICAgU0RWYWx1ZSBJbnRlZ2VyUGFydE9mWCA9IERBRy5nZXROb2RlKElTRDo6RlBfVE9fU0lOVCwgZGwsIE1WVDo6aTMyLCB0MCk7CisKKyAgICAvLyAgIEZyYWN0aW9uYWxQYXJ0T2ZYID0geCAtIChmbG9hdClJbnRlZ2VyUGFydE9mWDsKKyAgICBTRFZhbHVlIHQxID0gREFHLmdldE5vZGUoSVNEOjpTSU5UX1RPX0ZQLCBkbCwgTVZUOjpmMzIsIEludGVnZXJQYXJ0T2ZYKTsKKyAgICBTRFZhbHVlIFggPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OmYzMiwgdDAsIHQxKTsKKworICAgIC8vICAgSW50ZWdlclBhcnRPZlggPDw9IDIzOworICAgIEludGVnZXJQYXJ0T2ZYID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBNVlQ6OmkzMiwgSW50ZWdlclBhcnRPZlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMjMsIFRMSS5nZXRQb2ludGVyVHkoKSkpOworCisgICAgaWYgKExpbWl0RmxvYXRQcmVjaXNpb24gPD0gNikgeworICAgICAgLy8gRm9yIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiBvZiA2OgorICAgICAgLy8KKyAgICAgIC8vICAgdHdvVG9GcmFjdGlvbmFsUGFydE9mWCA9CisgICAgICAvLyAgICAgMC45OTc1MzU1NzhmICsKKyAgICAgIC8vICAgICAgICgwLjczNTYwNzYyNmYgKyAwLjI1MjQ2NDQyNGYgKiB4KSAqIHg7CisgICAgICAvLworICAgICAgLy8gZXJyb3IgMC4wMTQ0MTAzMzE3LCB3aGljaCBpcyA2IGJpdHMKKyAgICAgIFNEVmFsdWUgdDIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2U4MTQzMDQpKTsKKyAgICAgIFNEVmFsdWUgdDMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBNVlQ6OmYzMiwgdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNmM2M1MGM4KSk7CisgICAgICBTRFZhbHVlIHQ0ID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQzLCBYKTsKKyAgICAgIFNEVmFsdWUgdDUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBNVlQ6OmYzMiwgdDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDNmN2Y1ZTdlKSk7CisgICAgICBTRFZhbHVlIHQ2ID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6aTMyLCB0NSk7CisgICAgICBTRFZhbHVlIFR3b1RvRnJhY3Rpb25hbFBhcnRPZlggPQorICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCB0NiwgSW50ZWdlclBhcnRPZlgpOworCisgICAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6ZjMyLCBUd29Ub0ZyYWN0aW9uYWxQYXJ0T2ZYKTsKKyAgICB9IGVsc2UgaWYgKExpbWl0RmxvYXRQcmVjaXNpb24gPiA2ICYmIExpbWl0RmxvYXRQcmVjaXNpb24gPD0gMTIpIHsKKyAgICAgIC8vIEZvciBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gb2YgMTI6CisgICAgICAvLworICAgICAgLy8gICBUd29Ub0ZyYWN0aW9uYWxQYXJ0T2ZYID0KKyAgICAgIC8vICAgICAwLjk5OTg5Mjk4NmYgKworICAgICAgLy8gICAgICAgKDAuNjk2NDU3MzE4ZiArCisgICAgICAvLyAgICAgICAgICgwLjIyNDMzODMzOWYgKyAwLjc5MjA0MzQzNGUtMWYgKiB4KSAqIHgpICogeDsKKyAgICAgIC8vCisgICAgICAvLyBlcnJvciAwLjAwMDEwNzA0NjI1Niwgd2hpY2ggaXMgMTMgdG8gMTQgYml0cworICAgICAgU0RWYWx1ZSB0MiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZGEyMzVlMykpOworICAgICAgU0RWYWx1ZSB0MyA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2U2NWI4ZjMpKTsKKyAgICAgIFNEVmFsdWUgdDQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDMsIFgpOworICAgICAgU0RWYWx1ZSB0NSA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2YzMjRiMDcpKTsKKyAgICAgIFNEVmFsdWUgdDYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDUsIFgpOworICAgICAgU0RWYWx1ZSB0NyA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2Y3ZmY4ZmQpKTsKKyAgICAgIFNEVmFsdWUgdDggPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjppMzIsIHQ3KTsKKyAgICAgIFNEVmFsdWUgVHdvVG9GcmFjdGlvbmFsUGFydE9mWCA9CisgICAgICAgIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppMzIsIHQ4LCBJbnRlZ2VyUGFydE9mWCk7CisKKyAgICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmMzIsIFR3b1RvRnJhY3Rpb25hbFBhcnRPZlgpOworICAgIH0gZWxzZSB7IC8vIExpbWl0RmxvYXRQcmVjaXNpb24gPiAxMiAmJiBMaW1pdEZsb2F0UHJlY2lzaW9uIDw9IDE4CisgICAgICAvLyBGb3IgZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9uIG9mIDE4OgorICAgICAgLy8KKyAgICAgIC8vICAgVHdvVG9GcmFjdGlvbmFsUGFydE9mWCA9CisgICAgICAvLyAgICAgMC45OTk5OTk5ODJmICsKKyAgICAgIC8vICAgICAgICgwLjY5MzE0ODg3MmYgKworICAgICAgLy8gICAgICAgICAoMC4yNDAyMjcwNDRmICsKKyAgICAgIC8vICAgICAgICAgICAoMC41NTQ5MDYwMjFlLTFmICsKKyAgICAgIC8vICAgICAgICAgICAgICgwLjk2MTU5MTkyOGUtMmYgKworICAgICAgLy8gICAgICAgICAgICAgICAoMC4xMzYwMjgzMTJlLTJmICsgMC4xNTcwNTkxNDhlLTNmICp4KSp4KSp4KSp4KSp4KSp4OworICAgICAgLy8gZXJyb3IgMi40NzIwODAwMCoxMF4oLTcpLCB3aGljaCBpcyBiZXR0ZXIgdGhhbiAxOCBiaXRzCisgICAgICBTRFZhbHVlIHQyID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RjMyQ29uc3RhbnQoREFHLCAweDM5MjRiMDNlKSk7CisgICAgICBTRFZhbHVlIHQzID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzYWIyNGI4NykpOworICAgICAgU0RWYWx1ZSB0NCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0MywgWCk7CisgICAgICBTRFZhbHVlIHQ1ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzYzFkOGMxNykpOworICAgICAgU0RWYWx1ZSB0NiA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0NSwgWCk7CisgICAgICBTRFZhbHVlIHQ3ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZDYzNGExZCkpOworICAgICAgU0RWYWx1ZSB0OCA9IERBRy5nZXROb2RlKElTRDo6Rk1VTCwgZGwsIE1WVDo6ZjMyLCB0NywgWCk7CisgICAgICBTRFZhbHVlIHQ5ID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmMzIsIHQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZTc1ZmUxNCkpOworICAgICAgU0RWYWx1ZSB0MTAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZNVUwsIGRsLCBNVlQ6OmYzMiwgdDksIFgpOworICAgICAgU0RWYWx1ZSB0MTEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBREQsIGRsLCBNVlQ6OmYzMiwgdDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGMzJDb25zdGFudChEQUcsIDB4M2YzMTcyMzQpKTsKKyAgICAgIFNEVmFsdWUgdDEyID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBkbCwgTVZUOjpmMzIsIHQxMSwgWCk7CisgICAgICBTRFZhbHVlIHQxMyA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6ZjMyLCB0MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEYzMkNvbnN0YW50KERBRywgMHgzZjgwMDAwMCkpOworICAgICAgU0RWYWx1ZSB0MTQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjppMzIsIHQxMyk7CisgICAgICBTRFZhbHVlIFR3b1RvRnJhY3Rpb25hbFBhcnRPZlggPQorICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCB0MTQsIEludGVnZXJQYXJ0T2ZYKTsKKworICAgICAgcmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmYzMiwgVHdvVG9GcmFjdGlvbmFsUGFydE9mWCk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIE5vIHNwZWNpYWwgZXhwYW5zaW9uLgorICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6RlBPVywgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgxKSkpOworICB9CisKKyAgc2V0VmFsdWUoJkksIHJlc3VsdCk7Cit9CisKKworLy8vIEV4cGFuZFBvd0kgLSBFeHBhbmQgYSBsbHZtLnBvd2kgaW50cmluc2ljLgorc3RhdGljIFNEVmFsdWUgRXhwYW5kUG93SShEZWJ1Z0xvYyBETCwgU0RWYWx1ZSBMSFMsIFNEVmFsdWUgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgeworICAvLyBJZiBSSFMgaXMgYSBjb25zdGFudCwgd2UgY2FuIGV4cGFuZCB0aGlzIG91dCB0byBhIG11bHRpcGxpY2F0aW9uIHRyZWUsCisgIC8vIG90aGVyd2lzZSB3ZSBlbmQgdXAgbG93ZXJpbmcgdG8gYSBjYWxsIHRvIF9fcG93aWRmMiAoZm9yIGV4YW1wbGUpLiAgV2hlbgorICAvLyBvcHRpbWl6aW5nIGZvciBzaXplLCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBpZiB0aGUgZXhwYW5zaW9uIHdvdWxkIHByb2R1Y2UKKyAgLy8gYSBzbWFsbCBudW1iZXIgb2YgbXVsdGlwbGllcywgb3RoZXJ3aXNlIHdlIGRvIHRoZSBmdWxsIGV4cGFuc2lvbi4KKyAgaWYgKENvbnN0YW50U0ROb2RlICpSSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFJIUykpIHsKKyAgICAvLyBHZXQgdGhlIGV4cG9uZW50IGFzIGEgcG9zaXRpdmUgdmFsdWUuCisgICAgdW5zaWduZWQgVmFsID0gUkhTQy0+Z2V0U0V4dFZhbHVlKCk7CisgICAgaWYgKChpbnQpVmFsIDwgMCkgVmFsID0gLVZhbDsKKworICAgIC8vIHBvd2koeCwgMCkgLT4gMS4wCisgICAgaWYgKFZhbCA9PSAwKQorICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudEZQKDEuMCwgTEhTLmdldFZhbHVlVHlwZSgpKTsKKworICAgIGNvbnN0IEZ1bmN0aW9uICpGID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZ1bmN0aW9uKCk7CisgICAgaWYgKCFGLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpPcHRpbWl6ZUZvclNpemUpIHx8CisgICAgICAgIC8vIElmIG9wdGltaXppbmcgZm9yIHNpemUsIGRvbid0IGluc2VydCB0b28gbWFueSBtdWx0aXBsaWVzLiAgVGhpcworICAgICAgICAvLyBpbnNlcnRzIHVwIHRvIDUgbXVsdGlwbGllcy4KKyAgICAgICAgQ291bnRQb3B1bGF0aW9uXzMyKFZhbCkrTG9nMl8zMihWYWwpIDwgNykgeworICAgICAgLy8gV2UgdXNlIHRoZSBzaW1wbGUgYmluYXJ5IGRlY29tcG9zaXRpb24gbWV0aG9kIHRvIGdlbmVyYXRlIHRoZSBtdWx0aXBseQorICAgICAgLy8gc2VxdWVuY2UuICBUaGVyZSBhcmUgbW9yZSBvcHRpbWFsIHdheXMgdG8gZG8gdGhpcyAoZm9yIGV4YW1wbGUsCisgICAgICAvLyBwb3dpKHgsMTUpIGdlbmVyYXRlcyBvbmUgbW9yZSBtdWx0aXBseSB0aGFuIGl0IHNob3VsZCksIGJ1dCB0aGlzIGhhcworICAgICAgLy8gdGhlIGJlbmVmaXQgb2YgYmVpbmcgYm90aCByZWFsbHkgc2ltcGxlIGFuZCBtdWNoIGJldHRlciB0aGFuIGEgbGliY2FsbC4KKyAgICAgIFNEVmFsdWUgUmVzOyAgLy8gTG9naWNhbGx5IHN0YXJ0cyBlcXVhbCB0byAxLjAKKyAgICAgIFNEVmFsdWUgQ3VyU3F1YXJlID0gTEhTOworICAgICAgd2hpbGUgKFZhbCkgeworICAgICAgICBpZiAoVmFsICYgMSkgeworICAgICAgICAgIGlmIChSZXMuZ2V0Tm9kZSgpKQorICAgICAgICAgICAgUmVzID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBETCxSZXMuZ2V0VmFsdWVUeXBlKCksIFJlcywgQ3VyU3F1YXJlKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBSZXMgPSBDdXJTcXVhcmU7ICAvLyAxLjAqQ3VyU3F1YXJlLgorICAgICAgICB9CisKKyAgICAgICAgQ3VyU3F1YXJlID0gREFHLmdldE5vZGUoSVNEOjpGTVVMLCBETCwgQ3VyU3F1YXJlLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJTcXVhcmUsIEN1clNxdWFyZSk7CisgICAgICAgIFZhbCA+Pj0gMTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIHdhcyBuZWdhdGl2ZSwgaW52ZXJ0IHRoZSByZXN1bHQsIHByb2R1Y2luZyAxLyh4KngqeCkuCisgICAgICBpZiAoUkhTQy0+Z2V0U0V4dFZhbHVlKCkgPCAwKQorICAgICAgICBSZXMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZESVYsIERMLCBMSFMuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudEZQKDEuMCwgTEhTLmdldFZhbHVlVHlwZSgpKSwgUmVzKTsKKyAgICAgIHJldHVybiBSZXM7CisgICAgfQorICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBleHBhbmQgdG8gYSBsaWJjYWxsLgorICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGUE9XSSwgREwsIExIUy5nZXRWYWx1ZVR5cGUoKSwgTEhTLCBSSFMpOworfQorCisvLyBWaXN1YWxTdHVkaW8gZGVmaW5lcyBzZXRqbXAgYXMgX3NldGptcAorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoc2V0am1wKQorI2RlZmluZSBzZXRqbXBfdW5kZWZpbmVkX2Zvcl92aXN1YWxfc3R1ZGlvCisjdW5kZWYgc2V0am1wCisjZW5kaWYKKworLy8vIHZpc2l0SW50cmluc2ljQ2FsbCAtIExvd2VyIHRoZSBjYWxsIHRvIHRoZSBzcGVjaWZpZWQgaW50cmluc2ljIGZ1bmN0aW9uLiAgSWYKKy8vLyB3ZSB3YW50IHRvIGVtaXQgdGhpcyBhcyBhIGNhbGwgdG8gYSBuYW1lZCBleHRlcm5hbCBmdW5jdGlvbiwgcmV0dXJuIHRoZSBuYW1lCisvLy8gb3RoZXJ3aXNlIGxvd2VyIGl0IGFuZCByZXR1cm4gbnVsbC4KK2NvbnN0IGNoYXIgKgorU2VsZWN0aW9uREFHQnVpbGRlcjo6dmlzaXRJbnRyaW5zaWNDYWxsKGNvbnN0IENhbGxJbnN0ICZJLCB1bnNpZ25lZCBJbnRyaW5zaWMpIHsKKyAgRGVidWdMb2MgZGwgPSBnZXRDdXJEZWJ1Z0xvYygpOworICBTRFZhbHVlIFJlczsKKworICBzd2l0Y2ggKEludHJpbnNpYykgeworICBkZWZhdWx0OgorICAgIC8vIEJ5IGRlZmF1bHQsIHR1cm4gdGhpcyBpbnRvIGEgdGFyZ2V0IGludHJpbnNpYyBub2RlLgorICAgIHZpc2l0VGFyZ2V0SW50cmluc2ljKEksIEludHJpbnNpYyk7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW50cmluc2ljOjpyZXR1cm5hZGRyZXNzOgorICAgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OlJFVFVSTkFERFIsIGRsLCBUTEkuZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkpKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnRyaW5zaWM6OmZyYW1lYWRkcmVzczoKKyAgICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpGUkFNRUFERFIsIGRsLCBUTEkuZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkpKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnRyaW5zaWM6OnNldGptcDoKKyAgICByZXR1cm4gIl9zZXRqbXAiKyFUTEkudXNlc1VuZGVyc2NvcmVTZXRKbXAoKTsKKyAgY2FzZSBJbnRyaW5zaWM6OmxvbmdqbXA6CisgICAgcmV0dXJuICJfbG9uZ2ptcCIrIVRMSS51c2VzVW5kZXJzY29yZUxvbmdKbXAoKTsKKyAgY2FzZSBJbnRyaW5zaWM6Om1lbWNweTogeworICAgIC8vIEFzc2VydCBmb3IgYWRkcmVzcyA8IDI1NiBzaW5jZSB3ZSBzdXBwb3J0IG9ubHkgdXNlciBkZWZpbmVkIGFkZHJlc3MKKyAgICAvLyBzcGFjZXMuCisgICAgYXNzZXJ0KGNhc3Q8UG9pbnRlclR5cGU+KEkuZ2V0QXJnT3BlcmFuZCgwKS0+Z2V0VHlwZSgpKS0+Z2V0QWRkcmVzc1NwYWNlKCkKKyAgICAgICAgICAgPCAyNTYgJiYKKyAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oSS5nZXRBcmdPcGVyYW5kKDEpLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKQorICAgICAgICAgICA8IDI1NiAmJgorICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIHNwYWNlIik7CisgICAgU0RWYWx1ZSBPcDEgPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworICAgIFNEVmFsdWUgT3AyID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDEpKTsKKyAgICBTRFZhbHVlIE9wMyA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgyKSk7CisgICAgdW5zaWduZWQgQWxpZ24gPSBjYXN0PENvbnN0YW50SW50PihJLmdldEFyZ09wZXJhbmQoMykpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBib29sIGlzVm9sID0gY2FzdDxDb25zdGFudEludD4oSS5nZXRBcmdPcGVyYW5kKDQpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgREFHLnNldFJvb3QoREFHLmdldE1lbWNweShnZXRSb290KCksIGRsLCBPcDEsIE9wMiwgT3AzLCBBbGlnbiwgaXNWb2wsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS5nZXRBcmdPcGVyYW5kKDApLCAwLCBJLmdldEFyZ09wZXJhbmQoMSksIDApKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6bWVtc2V0OiB7CisgICAgLy8gQXNzZXJ0IGZvciBhZGRyZXNzIDwgMjU2IHNpbmNlIHdlIHN1cHBvcnQgb25seSB1c2VyIGRlZmluZWQgYWRkcmVzcworICAgIC8vIHNwYWNlcy4KKyAgICBhc3NlcnQoY2FzdDxQb2ludGVyVHlwZT4oSS5nZXRBcmdPcGVyYW5kKDApLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKQorICAgICAgICAgICA8IDI1NiAmJgorICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIHNwYWNlIik7CisgICAgU0RWYWx1ZSBPcDEgPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworICAgIFNEVmFsdWUgT3AyID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDEpKTsKKyAgICBTRFZhbHVlIE9wMyA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgyKSk7CisgICAgdW5zaWduZWQgQWxpZ24gPSBjYXN0PENvbnN0YW50SW50PihJLmdldEFyZ09wZXJhbmQoMykpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBib29sIGlzVm9sID0gY2FzdDxDb25zdGFudEludD4oSS5nZXRBcmdPcGVyYW5kKDQpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgREFHLnNldFJvb3QoREFHLmdldE1lbXNldChnZXRSb290KCksIGRsLCBPcDEsIE9wMiwgT3AzLCBBbGlnbiwgaXNWb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLmdldEFyZ09wZXJhbmQoMCksIDApKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6bWVtbW92ZTogeworICAgIC8vIEFzc2VydCBmb3IgYWRkcmVzcyA8IDI1NiBzaW5jZSB3ZSBzdXBwb3J0IG9ubHkgdXNlciBkZWZpbmVkIGFkZHJlc3MKKyAgICAvLyBzcGFjZXMuCisgICAgYXNzZXJ0KGNhc3Q8UG9pbnRlclR5cGU+KEkuZ2V0QXJnT3BlcmFuZCgwKS0+Z2V0VHlwZSgpKS0+Z2V0QWRkcmVzc1NwYWNlKCkKKyAgICAgICAgICAgPCAyNTYgJiYKKyAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oSS5nZXRBcmdPcGVyYW5kKDEpLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKQorICAgICAgICAgICA8IDI1NiAmJgorICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIHNwYWNlIik7CisgICAgU0RWYWx1ZSBPcDEgPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworICAgIFNEVmFsdWUgT3AyID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDEpKTsKKyAgICBTRFZhbHVlIE9wMyA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgyKSk7CisgICAgdW5zaWduZWQgQWxpZ24gPSBjYXN0PENvbnN0YW50SW50PihJLmdldEFyZ09wZXJhbmQoMykpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBib29sIGlzVm9sID0gY2FzdDxDb25zdGFudEludD4oSS5nZXRBcmdPcGVyYW5kKDQpKS0+Z2V0WkV4dFZhbHVlKCk7CisKKyAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUga25vd24gdG8gbm90IGJlIGFsaWFzZXMsIHdlIGNhbgorICAgIC8vIGxvd2VyIG1lbW1vdmUgYXMgbWVtY3B5LgorICAgIHVpbnQ2NF90IFNpemUgPSAtMVVMTDsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AzKSkKKyAgICAgIFNpemUgPSBDLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBpZiAoQUEtPmFsaWFzKEkuZ2V0QXJnT3BlcmFuZCgwKSwgU2l6ZSwgSS5nZXRBcmdPcGVyYW5kKDEpLCBTaXplKSA9PQorICAgICAgICBBbGlhc0FuYWx5c2lzOjpOb0FsaWFzKSB7CisgICAgICBEQUcuc2V0Um9vdChEQUcuZ2V0TWVtY3B5KGdldFJvb3QoKSwgZGwsIE9wMSwgT3AyLCBPcDMsIEFsaWduLCBpc1ZvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBJLmdldEFyZ09wZXJhbmQoMCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkuZ2V0QXJnT3BlcmFuZCgxKSwgMCkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgREFHLnNldFJvb3QoREFHLmdldE1lbW1vdmUoZ2V0Um9vdCgpLCBkbCwgT3AxLCBPcDIsIE9wMywgQWxpZ24sIGlzVm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkuZ2V0QXJnT3BlcmFuZCgwKSwgMCwgSS5nZXRBcmdPcGVyYW5kKDEpLCAwKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY2FzZSBJbnRyaW5zaWM6OmNvbnZlcnRmZjoKKyAgY2FzZSBJbnRyaW5zaWM6OmNvbnZlcnRmc2k6CisgIGNhc2UgSW50cmluc2ljOjpjb252ZXJ0ZnVpOgorICBjYXNlIEludHJpbnNpYzo6Y29udmVydHNpZjoKKyAgY2FzZSBJbnRyaW5zaWM6OmNvbnZlcnR1aWY6CisgIGNhc2UgSW50cmluc2ljOjpjb252ZXJ0c3M6CisgIGNhc2UgSW50cmluc2ljOjpjb252ZXJ0c3U6CisgIGNhc2UgSW50cmluc2ljOjpjb252ZXJ0dXM6CisgIGNhc2UgSW50cmluc2ljOjpjb252ZXJ0dXU6IHsKKyAgICBJU0Q6OkN2dENvZGUgQ29kZSA9IElTRDo6Q1ZUX0lOVkFMSUQ7CisgICAgc3dpdGNoIChJbnRyaW5zaWMpIHsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29udmVydGZmOiAgQ29kZSA9IElTRDo6Q1ZUX0ZGOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29udmVydGZzaTogQ29kZSA9IElTRDo6Q1ZUX0ZTOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29udmVydGZ1aTogQ29kZSA9IElTRDo6Q1ZUX0ZVOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29udmVydHNpZjogQ29kZSA9IElTRDo6Q1ZUX1NGOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29udmVydHVpZjogQ29kZSA9IElTRDo6Q1ZUX1VGOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29udmVydHNzOiAgQ29kZSA9IElTRDo6Q1ZUX1NTOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29udmVydHN1OiAgQ29kZSA9IElTRDo6Q1ZUX1NVOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29udmVydHVzOiAgQ29kZSA9IElTRDo6Q1ZUX1VTOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29udmVydHV1OiAgQ29kZSA9IElTRDo6Q1ZUX1VVOyBicmVhazsKKyAgICB9CisgICAgRVZUIERlc3RWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCkpOworICAgIGNvbnN0IFZhbHVlICpPcDEgPSBJLmdldEFyZ09wZXJhbmQoMCk7CisgICAgUmVzID0gREFHLmdldENvbnZlcnRSbmRTYXQoRGVzdFZULCBnZXRDdXJEZWJ1Z0xvYygpLCBnZXRWYWx1ZShPcDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWYWx1ZVR5cGUoRGVzdFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKGdldFZhbHVlKE9wMSkuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlKTsKKyAgICBzZXRWYWx1ZSgmSSwgUmVzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6c3FydDoKKyAgICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpGU1FSVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkpKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnRyaW5zaWM6OnBvd2k6CisgICAgc2V0VmFsdWUoJkksIEV4cGFuZFBvd0koZGwsIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDEpKSwgREFHKSk7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW50cmluc2ljOjpzaW46CisgICAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKElTRDo6RlNJTiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkpKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnRyaW5zaWM6OmNvczoKKyAgICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpGQ09TLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKSkpOworICAgIHJldHVybiAwOworICBjYXNlIEludHJpbnNpYzo6bG9nOgorICAgIHZpc2l0TG9nKEkpOworICAgIHJldHVybiAwOworICBjYXNlIEludHJpbnNpYzo6bG9nMjoKKyAgICB2aXNpdExvZzIoSSk7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW50cmluc2ljOjpsb2cxMDoKKyAgICB2aXNpdExvZzEwKEkpOworICAgIHJldHVybiAwOworICBjYXNlIEludHJpbnNpYzo6ZXhwOgorICAgIHZpc2l0RXhwKEkpOworICAgIHJldHVybiAwOworICBjYXNlIEludHJpbnNpYzo6ZXhwMjoKKyAgICB2aXNpdEV4cDIoSSk7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW50cmluc2ljOjpwb3c6CisgICAgdmlzaXRQb3coSSk7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW50cmluc2ljOjpjb252ZXJ0X3RvX2ZwMTY6CisgICAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKElTRDo6RlAzMl9UT19GUDE2LCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMTYsIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSkpKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnRyaW5zaWM6OmNvbnZlcnRfZnJvbV9mcDE2OgorICAgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkZQMTZfVE9fRlAzMiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6ZjMyLCBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpKSk7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW50cmluc2ljOjpwY21hcmtlcjogeworICAgIFNEVmFsdWUgVG1wID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBEQUcuc2V0Um9vdChEQUcuZ2V0Tm9kZShJU0Q6OlBDTUFSS0VSLCBkbCwgTVZUOjpPdGhlciwgZ2V0Um9vdCgpLCBUbXApKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6cmVhZGN5Y2xlY291bnRlcjogeworICAgIFNEVmFsdWUgT3AgPSBnZXRSb290KCk7CisgICAgUmVzID0gREFHLmdldE5vZGUoSVNEOjpSRUFEQ1lDTEVDT1VOVEVSLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlRMaXN0KE1WVDo6aTY0LCBNVlQ6Ok90aGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAmT3AsIDEpOworICAgIHNldFZhbHVlKCZJLCBSZXMpOworICAgIERBRy5zZXRSb290KFJlcy5nZXRWYWx1ZSgxKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY2FzZSBJbnRyaW5zaWM6OmJzd2FwOgorICAgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkJTV0FQLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKSkpOworICAgIHJldHVybiAwOworICBjYXNlIEludHJpbnNpYzo6Y3R0ejogeworICAgIFNEVmFsdWUgQXJnID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBFVlQgVHkgPSBBcmcuZ2V0VmFsdWVUeXBlKCk7CisgICAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKElTRDo6Q1RUWiwgZGwsIFR5LCBBcmcpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6Y3RsejogeworICAgIFNEVmFsdWUgQXJnID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBFVlQgVHkgPSBBcmcuZ2V0VmFsdWVUeXBlKCk7CisgICAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKElTRDo6Q1RMWiwgZGwsIFR5LCBBcmcpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6Y3Rwb3A6IHsKKyAgICBTRFZhbHVlIEFyZyA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSk7CisgICAgRVZUIFR5ID0gQXJnLmdldFZhbHVlVHlwZSgpOworICAgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkNUUE9QLCBkbCwgVHksIEFyZykpOworICAgIHJldHVybiAwOworICB9CisgIGNhc2UgSW50cmluc2ljOjpzdGFja3NhdmU6IHsKKyAgICBTRFZhbHVlIE9wID0gZ2V0Um9vdCgpOworICAgIFJlcyA9IERBRy5nZXROb2RlKElTRDo6U1RBQ0tTQVZFLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlRMaXN0KFRMSS5nZXRQb2ludGVyVHkoKSwgTVZUOjpPdGhlciksICZPcCwgMSk7CisgICAgc2V0VmFsdWUoJkksIFJlcyk7CisgICAgREFHLnNldFJvb3QoUmVzLmdldFZhbHVlKDEpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6c3RhY2tyZXN0b3JlOiB7CisgICAgUmVzID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBEQUcuc2V0Um9vdChEQUcuZ2V0Tm9kZShJU0Q6OlNUQUNLUkVTVE9SRSwgZGwsIE1WVDo6T3RoZXIsIGdldFJvb3QoKSwgUmVzKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY2FzZSBJbnRyaW5zaWM6OnN0YWNrcHJvdGVjdG9yOiB7CisgICAgLy8gRW1pdCBjb2RlIGludG8gdGhlIERBRyB0byBzdG9yZSB0aGUgc3RhY2sgZ3VhcmQgb250byB0aGUgc3RhY2suCisgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgICBFVlQgUHRyVHkgPSBUTEkuZ2V0UG9pbnRlclR5KCk7CisKKyAgICBTRFZhbHVlIFNyYyA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSk7ICAgLy8gVGhlIGd1YXJkJ3MgdmFsdWUuCisgICAgQWxsb2NhSW5zdCAqU2xvdCA9IGNhc3Q8QWxsb2NhSW5zdD4oSS5nZXRBcmdPcGVyYW5kKDEpKTsKKworICAgIGludCBGSSA9IEZ1bmNJbmZvLlN0YXRpY0FsbG9jYU1hcFtTbG90XTsKKyAgICBNRkktPnNldFN0YWNrUHJvdGVjdG9ySW5kZXgoRkkpOworCisgICAgU0RWYWx1ZSBGSU4gPSBEQUcuZ2V0RnJhbWVJbmRleChGSSwgUHRyVHkpOworCisgICAgLy8gU3RvcmUgdGhlIHN0YWNrIHByb3RlY3RvciBvbnRvIHRoZSBzdGFjay4KKyAgICBSZXMgPSBEQUcuZ2V0U3RvcmUoZ2V0Um9vdCgpLCBnZXRDdXJEZWJ1Z0xvYygpLCBTcmMsIEZJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAwLCB0cnVlLCBmYWxzZSwgMCk7CisgICAgc2V0VmFsdWUoJkksIFJlcyk7CisgICAgREFHLnNldFJvb3QoUmVzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6b2JqZWN0c2l6ZTogeworICAgIC8vIElmIHdlIGRvbid0IGtub3cgYnkgbm93LCB3ZSdyZSBuZXZlciBnb2luZyB0byBrbm93LgorICAgIENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLmdldEFyZ09wZXJhbmQoMSkpOworCisgICAgYXNzZXJ0KENJICYmICJOb24tY29uc3RhbnQgdHlwZSBpbiBfX2J1aWx0aW5fb2JqZWN0X3NpemU/Iik7CisKKyAgICBTRFZhbHVlIEFyZyA9IGdldFZhbHVlKEkuZ2V0Q2FsbGVkVmFsdWUoKSk7CisgICAgRVZUIFR5ID0gQXJnLmdldFZhbHVlVHlwZSgpOworCisgICAgaWYgKENJLT5pc1plcm8oKSkKKyAgICAgIFJlcyA9IERBRy5nZXRDb25zdGFudCgtMVVMTCwgVHkpOworICAgIGVsc2UKKyAgICAgIFJlcyA9IERBRy5nZXRDb25zdGFudCgwLCBUeSk7CisKKyAgICBzZXRWYWx1ZSgmSSwgUmVzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6dmFyX2Fubm90YXRpb246CisgICAgLy8gRGlzY2FyZCBhbm5vdGF0ZSBhdHRyaWJ1dGVzCisgICAgcmV0dXJuIDA7CisKKyAgY2FzZSBJbnRyaW5zaWM6OmluaXRfdHJhbXBvbGluZTogeworICAgIGNvbnN0IEZ1bmN0aW9uICpGID0gY2FzdDxGdW5jdGlvbj4oSS5nZXRBcmdPcGVyYW5kKDEpLT5zdHJpcFBvaW50ZXJDYXN0cygpKTsKKworICAgIFNEVmFsdWUgT3BzWzZdOworICAgIE9wc1swXSA9IGdldFJvb3QoKTsKKyAgICBPcHNbMV0gPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworICAgIE9wc1syXSA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgxKSk7CisgICAgT3BzWzNdID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDIpKTsKKyAgICBPcHNbNF0gPSBEQUcuZ2V0U3JjVmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBPcHNbNV0gPSBEQUcuZ2V0U3JjVmFsdWUoRik7CisKKyAgICBSZXMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSQU1QT0xJTkUsIGRsLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoVExJLmdldFBvaW50ZXJUeSgpLCBNVlQ6Ok90aGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICBPcHMsIDYpOworCisgICAgc2V0VmFsdWUoJkksIFJlcyk7CisgICAgREFHLnNldFJvb3QoUmVzLmdldFZhbHVlKDEpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6Zmx0X3JvdW5kczoKKyAgICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpGTFRfUk9VTkRTXywgZGwsIE1WVDo6aTMyKSk7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW50cmluc2ljOjp0cmFwOgorICAgIERBRy5zZXRSb290KERBRy5nZXROb2RlKElTRDo6VFJBUCwgZGwsTVZUOjpPdGhlciwgZ2V0Um9vdCgpKSk7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW50cmluc2ljOjp1YWRkX3dpdGhfb3ZlcmZsb3c6CisgICAgcmV0dXJuIGltcGxWaXNpdEFsdU92ZXJmbG93KEksIElTRDo6VUFERE8pOworICBjYXNlIEludHJpbnNpYzo6c2FkZF93aXRoX292ZXJmbG93OgorICAgIHJldHVybiBpbXBsVmlzaXRBbHVPdmVyZmxvdyhJLCBJU0Q6OlNBRERPKTsKKyAgY2FzZSBJbnRyaW5zaWM6OnVzdWJfd2l0aF9vdmVyZmxvdzoKKyAgICByZXR1cm4gaW1wbFZpc2l0QWx1T3ZlcmZsb3coSSwgSVNEOjpVU1VCTyk7CisgIGNhc2UgSW50cmluc2ljOjpzc3ViX3dpdGhfb3ZlcmZsb3c6CisgICAgcmV0dXJuIGltcGxWaXNpdEFsdU92ZXJmbG93KEksIElTRDo6U1NVQk8pOworICBjYXNlIEludHJpbnNpYzo6dW11bF93aXRoX292ZXJmbG93OgorICAgIHJldHVybiBpbXBsVmlzaXRBbHVPdmVyZmxvdyhJLCBJU0Q6OlVNVUxPKTsKKyAgY2FzZSBJbnRyaW5zaWM6OnNtdWxfd2l0aF9vdmVyZmxvdzoKKyAgICByZXR1cm4gaW1wbFZpc2l0QWx1T3ZlcmZsb3coSSwgSVNEOjpTTVVMTyk7CisKKyAgY2FzZSBJbnRyaW5zaWM6OnByZWZldGNoOiB7CisgICAgU0RWYWx1ZSBPcHNbNF07CisgICAgT3BzWzBdID0gZ2V0Um9vdCgpOworICAgIE9wc1sxXSA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSk7CisgICAgT3BzWzJdID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDEpKTsKKyAgICBPcHNbM10gPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMikpOworICAgIERBRy5zZXRSb290KERBRy5nZXROb2RlKElTRDo6UFJFRkVUQ0gsIGRsLCBNVlQ6Ok90aGVyLCAmT3BzWzBdLCA0KSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjYXNlIEludHJpbnNpYzo6bWVtb3J5X2JhcnJpZXI6IHsKKyAgICBTRFZhbHVlIE9wc1s2XTsKKyAgICBPcHNbMF0gPSBnZXRSb290KCk7CisgICAgZm9yIChpbnQgeCA9IDE7IHggPCA2OyArK3gpCisgICAgICBPcHNbeF0gPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoeCAtIDEpKTsKKworICAgIERBRy5zZXRSb290KERBRy5nZXROb2RlKElTRDo6TUVNQkFSUklFUiwgZGwsIE1WVDo6T3RoZXIsICZPcHNbMF0sIDYpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6YXRvbWljX2NtcF9zd2FwOiB7CisgICAgU0RWYWx1ZSBSb290ID0gZ2V0Um9vdCgpOworICAgIFNEVmFsdWUgTCA9CisgICAgICBEQUcuZ2V0QXRvbWljKElTRDo6QVRPTUlDX0NNUF9TV0FQLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMSkpLmdldFZhbHVlVHlwZSgpLmdldFNpbXBsZVZUKCksCisgICAgICAgICAgICAgICAgICAgIFJvb3QsCisgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSksCisgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgxKSksCisgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgyKSksCisgICAgICAgICAgICAgICAgICAgIEkuZ2V0QXJnT3BlcmFuZCgwKSk7CisgICAgc2V0VmFsdWUoJkksIEwpOworICAgIERBRy5zZXRSb290KEwuZ2V0VmFsdWUoMSkpOworICAgIHJldHVybiAwOworICB9CisgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF9hZGQ6CisgICAgcmV0dXJuIGltcGxWaXNpdEJpbmFyeUF0b21pYyhJLCBJU0Q6OkFUT01JQ19MT0FEX0FERCk7CisgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF9zdWI6CisgICAgcmV0dXJuIGltcGxWaXNpdEJpbmFyeUF0b21pYyhJLCBJU0Q6OkFUT01JQ19MT0FEX1NVQik7CisgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF9vcjoKKyAgICByZXR1cm4gaW1wbFZpc2l0QmluYXJ5QXRvbWljKEksIElTRDo6QVRPTUlDX0xPQURfT1IpOworICBjYXNlIEludHJpbnNpYzo6YXRvbWljX2xvYWRfeG9yOgorICAgIHJldHVybiBpbXBsVmlzaXRCaW5hcnlBdG9taWMoSSwgSVNEOjpBVE9NSUNfTE9BRF9YT1IpOworICBjYXNlIEludHJpbnNpYzo6YXRvbWljX2xvYWRfYW5kOgorICAgIHJldHVybiBpbXBsVmlzaXRCaW5hcnlBdG9taWMoSSwgSVNEOjpBVE9NSUNfTE9BRF9BTkQpOworICBjYXNlIEludHJpbnNpYzo6YXRvbWljX2xvYWRfbmFuZDoKKyAgICByZXR1cm4gaW1wbFZpc2l0QmluYXJ5QXRvbWljKEksIElTRDo6QVRPTUlDX0xPQURfTkFORCk7CisgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF9tYXg6CisgICAgcmV0dXJuIGltcGxWaXNpdEJpbmFyeUF0b21pYyhJLCBJU0Q6OkFUT01JQ19MT0FEX01BWCk7CisgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF9taW46CisgICAgcmV0dXJuIGltcGxWaXNpdEJpbmFyeUF0b21pYyhJLCBJU0Q6OkFUT01JQ19MT0FEX01JTik7CisgIGNhc2UgSW50cmluc2ljOjphdG9taWNfbG9hZF91bWluOgorICAgIHJldHVybiBpbXBsVmlzaXRCaW5hcnlBdG9taWMoSSwgSVNEOjpBVE9NSUNfTE9BRF9VTUlOKTsKKyAgY2FzZSBJbnRyaW5zaWM6OmF0b21pY19sb2FkX3VtYXg6CisgICAgcmV0dXJuIGltcGxWaXNpdEJpbmFyeUF0b21pYyhJLCBJU0Q6OkFUT01JQ19MT0FEX1VNQVgpOworICBjYXNlIEludHJpbnNpYzo6YXRvbWljX3N3YXA6CisgICAgcmV0dXJuIGltcGxWaXNpdEJpbmFyeUF0b21pYyhJLCBJU0Q6OkFUT01JQ19TV0FQKTsKKworICBjYXNlIEludHJpbnNpYzo6aW52YXJpYW50X3N0YXJ0OgorICBjYXNlIEludHJpbnNpYzo6bGlmZXRpbWVfc3RhcnQ6CisgICAgLy8gRGlzY2FyZCByZWdpb24gaW5mb3JtYXRpb24uCisgICAgc2V0VmFsdWUoJkksIERBRy5nZXRVTkRFRihUTEkuZ2V0UG9pbnRlclR5KCkpKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnRyaW5zaWM6OmludmFyaWFudF9lbmQ6CisgIGNhc2UgSW50cmluc2ljOjpsaWZldGltZV9lbmQ6CisgICAgLy8gRGlzY2FyZCByZWdpb24gaW5mb3JtYXRpb24uCisgICAgcmV0dXJuIDA7CisgIH0KK30KKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjpMb3dlckNhbGxUbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUYWlsQ2FsbCkgeworICBjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBjYXN0PFBvaW50ZXJUeXBlPihDUy5nZXRDYWxsZWRWYWx1ZSgpLT5nZXRUeXBlKCkpOworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IGNhc3Q8RnVuY3Rpb25UeXBlPihQVC0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIGNvbnN0IFR5cGUgKlJldFR5ID0gRlR5LT5nZXRSZXR1cm5UeXBlKCk7CisgIE1hY2hpbmVNb2R1bGVJbmZvICZNTUkgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0TU1JKCk7CisgIE1DU3ltYm9sICpCZWdpbkxhYmVsID0gMDsKKworICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdFR5IEFyZ3M7CisgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0RW50cnkgRW50cnk7CisgIEFyZ3MucmVzZXJ2ZShDUy5hcmdfc2l6ZSgpKTsKKworICAvLyBDaGVjayB3aGV0aGVyIHRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIHdpdGhvdXQgc3JldC1kZW1vdGlvbi4KKyAgU21hbGxWZWN0b3I8SVNEOjpPdXRwdXRBcmcsIDQ+IE91dHM7CisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA0PiBPZmZzZXRzOworICBHZXRSZXR1cm5JbmZvKFJldFR5LCBDUy5nZXRBdHRyaWJ1dGVzKCkuZ2V0UmV0QXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgIE91dHMsIFRMSSwgJk9mZnNldHMpOworCisgIGJvb2wgQ2FuTG93ZXJSZXR1cm4gPSBUTEkuQ2FuTG93ZXJSZXR1cm4oQ1MuZ2V0Q2FsbGluZ0NvbnYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUeS0+aXNWYXJBcmcoKSwgT3V0cywgRlR5LT5nZXRDb250ZXh0KCkpOworCisgIFNEVmFsdWUgRGVtb3RlU3RhY2tTbG90OworCisgIGlmICghQ2FuTG93ZXJSZXR1cm4pIHsKKyAgICB1aW50NjRfdCBUeVNpemUgPSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRUeXBlQWxsb2NTaXplKAorICAgICAgICAgICAgICAgICAgICAgIEZUeS0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICB1bnNpZ25lZCBBbGlnbiAgPSBUTEkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRQcmVmVHlwZUFsaWdubWVudCgKKyAgICAgICAgICAgICAgICAgICAgICBGVHktPmdldFJldHVyblR5cGUoKSk7CisgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgICBpbnQgU1NGSSA9IE1GLmdldEZyYW1lSW5mbygpLT5DcmVhdGVTdGFja09iamVjdChUeVNpemUsIEFsaWduLCBmYWxzZSk7CisgICAgY29uc3QgVHlwZSAqU3RhY2tTbG90UHRyVHlwZSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoRlR5LT5nZXRSZXR1cm5UeXBlKCkpOworCisgICAgRGVtb3RlU3RhY2tTbG90ID0gREFHLmdldEZyYW1lSW5kZXgoU1NGSSwgVExJLmdldFBvaW50ZXJUeSgpKTsKKyAgICBFbnRyeS5Ob2RlID0gRGVtb3RlU3RhY2tTbG90OworICAgIEVudHJ5LlR5ID0gU3RhY2tTbG90UHRyVHlwZTsKKyAgICBFbnRyeS5pc1NFeHQgPSBmYWxzZTsKKyAgICBFbnRyeS5pc1pFeHQgPSBmYWxzZTsKKyAgICBFbnRyeS5pc0luUmVnID0gZmFsc2U7CisgICAgRW50cnkuaXNTUmV0ID0gdHJ1ZTsKKyAgICBFbnRyeS5pc05lc3QgPSBmYWxzZTsKKyAgICBFbnRyeS5pc0J5VmFsID0gZmFsc2U7CisgICAgRW50cnkuQWxpZ25tZW50ID0gQWxpZ247CisgICAgQXJncy5wdXNoX2JhY2soRW50cnkpOworICAgIFJldFR5ID0gVHlwZTo6Z2V0Vm9pZFR5KEZUeS0+Z2V0Q29udGV4dCgpKTsKKyAgfQorCisgIGZvciAoSW1tdXRhYmxlQ2FsbFNpdGU6OmFyZ19pdGVyYXRvciBpID0gQ1MuYXJnX2JlZ2luKCksIGUgPSBDUy5hcmdfZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBTRFZhbHVlIEFyZ05vZGUgPSBnZXRWYWx1ZSgqaSk7CisgICAgRW50cnkuTm9kZSA9IEFyZ05vZGU7IEVudHJ5LlR5ID0gKCppKS0+Z2V0VHlwZSgpOworCisgICAgdW5zaWduZWQgYXR0ckluZCA9IGkgLSBDUy5hcmdfYmVnaW4oKSArIDE7CisgICAgRW50cnkuaXNTRXh0ICA9IENTLnBhcmFtSGFzQXR0cihhdHRySW5kLCBBdHRyaWJ1dGU6OlNFeHQpOworICAgIEVudHJ5LmlzWkV4dCAgPSBDUy5wYXJhbUhhc0F0dHIoYXR0ckluZCwgQXR0cmlidXRlOjpaRXh0KTsKKyAgICBFbnRyeS5pc0luUmVnID0gQ1MucGFyYW1IYXNBdHRyKGF0dHJJbmQsIEF0dHJpYnV0ZTo6SW5SZWcpOworICAgIEVudHJ5LmlzU1JldCAgPSBDUy5wYXJhbUhhc0F0dHIoYXR0ckluZCwgQXR0cmlidXRlOjpTdHJ1Y3RSZXQpOworICAgIEVudHJ5LmlzTmVzdCAgPSBDUy5wYXJhbUhhc0F0dHIoYXR0ckluZCwgQXR0cmlidXRlOjpOZXN0KTsKKyAgICBFbnRyeS5pc0J5VmFsID0gQ1MucGFyYW1IYXNBdHRyKGF0dHJJbmQsIEF0dHJpYnV0ZTo6QnlWYWwpOworICAgIEVudHJ5LkFsaWdubWVudCA9IENTLmdldFBhcmFtQWxpZ25tZW50KGF0dHJJbmQpOworICAgIEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKyAgfQorCisgIC8vIENoZWNrIGlmIHRhcmdldC1pbmRlcGVuZGVudCBjb25zdHJhaW50cyBwZXJtaXQgYSB0YWlsIGNhbGwgaGVyZS4KKyAgLy8gVGFyZ2V0LWRlcGVuZGVudCBjb25zdHJhaW50cyBhcmUgY2hlY2tlZCB3aXRoaW4gVExJLkxvd2VyQ2FsbFRvLgorICBpZiAoaXNUYWlsQ2FsbCAmJgorICAgICAgIWlzSW5UYWlsQ2FsbFBvc2l0aW9uKENTLCBDUy5nZXRBdHRyaWJ1dGVzKCkuZ2V0UmV0QXR0cmlidXRlcygpLCBUTEkpKQorICAgIGlzVGFpbENhbGwgPSBmYWxzZTsKKworICBzdGQ6OnBhaXI8U0RWYWx1ZSxTRFZhbHVlPiBSZXN1bHQgPQorICAgIFRMSS5Mb3dlckNhbGxUbyhnZXRSb290KCksIFJldFR5LAorICAgICAgICAgICAgICAgICAgICBDUy5wYXJhbUhhc0F0dHIoMCwgQXR0cmlidXRlOjpTRXh0KSwKKyAgICAgICAgICAgICAgICAgICAgQ1MucGFyYW1IYXNBdHRyKDAsIEF0dHJpYnV0ZTo6WkV4dCksIEZUeS0+aXNWYXJBcmcoKSwKKyAgICAgICAgICAgICAgICAgICAgQ1MucGFyYW1IYXNBdHRyKDAsIEF0dHJpYnV0ZTo6SW5SZWcpLCBGVHktPmdldE51bVBhcmFtcygpLAorICAgICAgICAgICAgICAgICAgICBDUy5nZXRDYWxsaW5nQ29udigpLAorICAgICAgICAgICAgICAgICAgICBpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAhQ1MuZ2V0SW5zdHJ1Y3Rpb24oKS0+dXNlX2VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgIENhbGxlZSwgQXJncywgREFHLCBnZXRDdXJEZWJ1Z0xvYygpKTsKKyAgYXNzZXJ0KChpc1RhaWxDYWxsIHx8IFJlc3VsdC5zZWNvbmQuZ2V0Tm9kZSgpKSAmJgorICAgICAgICAgIk5vbi1udWxsIGNoYWluIGV4cGVjdGVkIHdpdGggbm9uLXRhaWwgY2FsbCEiKTsKKyAgYXNzZXJ0KChSZXN1bHQuc2Vjb25kLmdldE5vZGUoKSB8fCAhUmVzdWx0LmZpcnN0LmdldE5vZGUoKSkgJiYKKyAgICAgICAgICJOdWxsIHZhbHVlIGV4cGVjdGVkIHdpdGggdGFpbCBjYWxsISIpOworICBpZiAoUmVzdWx0LmZpcnN0LmdldE5vZGUoKSkgeworICAgIHNldFZhbHVlKENTLmdldEluc3RydWN0aW9uKCksIFJlc3VsdC5maXJzdCk7CisgIH0gZWxzZSBpZiAoIUNhbkxvd2VyUmV0dXJuICYmIFJlc3VsdC5zZWNvbmQuZ2V0Tm9kZSgpKSB7CisgICAgLy8gVGhlIGluc3RydWN0aW9uIHJlc3VsdCBpcyB0aGUgcmVzdWx0IG9mIGxvYWRpbmcgZnJvbSB0aGUKKyAgICAvLyBoaWRkZW4gc3JldCBwYXJhbWV0ZXIuCisgICAgU21hbGxWZWN0b3I8RVZULCAxPiBQVlRzOworICAgIGNvbnN0IFR5cGUgKlB0clJldFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChGVHktPmdldFJldHVyblR5cGUoKSk7CisKKyAgICBDb21wdXRlVmFsdWVWVHMoVExJLCBQdHJSZXRUeSwgUFZUcyk7CisgICAgYXNzZXJ0KFBWVHMuc2l6ZSgpID09IDEgJiYgIlBvaW50ZXJzIHNob3VsZCBmaXQgaW4gb25lIHJlZ2lzdGVyIik7CisgICAgRVZUIFB0clZUID0gUFZUc1swXTsKKyAgICB1bnNpZ25lZCBOdW1WYWx1ZXMgPSBPdXRzLnNpemUoKTsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBWYWx1ZXMoTnVtVmFsdWVzKTsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBDaGFpbnMoTnVtVmFsdWVzKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1WYWx1ZXM7ICsraSkgeworICAgICAgU0RWYWx1ZSBBZGQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZ2V0Q3VyRGVidWdMb2MoKSwgUHRyVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbW90ZVN0YWNrU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE9mZnNldHNbaV0sIFB0clZUKSk7CisgICAgICBTRFZhbHVlIEwgPSBEQUcuZ2V0TG9hZChPdXRzW2ldLlZULCBnZXRDdXJEZWJ1Z0xvYygpLCBSZXN1bHQuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkLCBOVUxMLCBPZmZzZXRzW2ldLCBmYWxzZSwgZmFsc2UsIDEpOworICAgICAgVmFsdWVzW2ldID0gTDsKKyAgICAgIENoYWluc1tpXSA9IEwuZ2V0VmFsdWUoMSk7CisgICAgfQorCisgICAgU0RWYWx1ZSBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsICZDaGFpbnNbMF0sIE51bVZhbHVlcyk7CisgICAgUGVuZGluZ0xvYWRzLnB1c2hfYmFjayhDaGFpbik7CisgICAgCisgICAgLy8gQ29sbGVjdCB0aGUgbGVnYWwgdmFsdWUgcGFydHMgaW50byBwb3RlbnRpYWxseSBpbGxlZ2FsIHZhbHVlcworICAgIC8vIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgb3JpZ2luYWwgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWVzLgorICAgIFNtYWxsVmVjdG9yPEVWVCwgND4gUmV0VHlzOworICAgIFJldFR5ID0gRlR5LT5nZXRSZXR1cm5UeXBlKCk7CisgICAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgUmV0VHksIFJldFR5cyk7CisgICAgSVNEOjpOb2RlVHlwZSBBc3NlcnRPcCA9IElTRDo6REVMRVRFRF9OT0RFOworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDQ+IFJldHVyblZhbHVlczsKKyAgICB1bnNpZ25lZCBDdXJSZWcgPSAwOworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBSZXRUeXMuc2l6ZSgpOyBJICE9IEU7ICsrSSkgeworICAgICAgRVZUIFZUID0gUmV0VHlzW0ldOworICAgICAgRVZUIFJlZ2lzdGVyVlQgPSBUTEkuZ2V0UmVnaXN0ZXJUeXBlKFJldFR5LT5nZXRDb250ZXh0KCksIFZUKTsKKyAgICAgIHVuc2lnbmVkIE51bVJlZ3MgPSBUTEkuZ2V0TnVtUmVnaXN0ZXJzKFJldFR5LT5nZXRDb250ZXh0KCksIFZUKTsKKyAgCisgICAgICBTRFZhbHVlIFJldHVyblZhbHVlID0KKyAgICAgICAgZ2V0Q29weUZyb21QYXJ0cyhEQUcsIGdldEN1ckRlYnVnTG9jKCksICZWYWx1ZXNbQ3VyUmVnXSwgTnVtUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlclZULCBWVCwgQXNzZXJ0T3ApOworICAgICAgUmV0dXJuVmFsdWVzLnB1c2hfYmFjayhSZXR1cm5WYWx1ZSk7CisgICAgICBDdXJSZWcgKz0gTnVtUmVnczsKKyAgICB9CisKKyAgICBzZXRWYWx1ZShDUy5nZXRJbnN0cnVjdGlvbigpLAorICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6TUVSR0VfVkFMVUVTLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoJlJldFR5c1swXSwgUmV0VHlzLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJlJldHVyblZhbHVlc1swXSwgUmV0dXJuVmFsdWVzLnNpemUoKSkpOworCisgIH0KKworICAvLyBBcyBhIHNwZWNpYWwgY2FzZSwgYSBudWxsIGNoYWluIG1lYW5zIHRoYXQgYSB0YWlsIGNhbGwgaGFzIGJlZW4gZW1pdHRlZCBhbmQKKyAgLy8gdGhlIERBRyByb290IGlzIGFscmVhZHkgdXBkYXRlZC4KKyAgaWYgKFJlc3VsdC5zZWNvbmQuZ2V0Tm9kZSgpKQorICAgIERBRy5zZXRSb290KFJlc3VsdC5zZWNvbmQpOworICBlbHNlCisgICAgSGFzVGFpbENhbGwgPSB0cnVlOworfQorCisvLy8gSXNPbmx5VXNlZEluWmVyb0VxdWFsaXR5Q29tcGFyaXNvbiAtIFJldHVybiB0cnVlIGlmIGl0IG9ubHkgbWF0dGVycyB0aGF0IHRoZQorLy8vIHZhbHVlIGlzIGVxdWFsIG9yIG5vdC1lcXVhbCB0byB6ZXJvLgorc3RhdGljIGJvb2wgSXNPbmx5VXNlZEluWmVyb0VxdWFsaXR5Q29tcGFyaXNvbihjb25zdCBWYWx1ZSAqVikgeworICBmb3IgKFZhbHVlOjpjb25zdF91c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsKKyAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgaWYgKGNvbnN0IElDbXBJbnN0ICpJQyA9IGR5bl9jYXN0PElDbXBJbnN0PigqVUkpKQorICAgICAgaWYgKElDLT5pc0VxdWFsaXR5KCkpCisgICAgICAgIGlmIChjb25zdCBDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihJQy0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICAgICAgaWYgKEMtPmlzTnVsbFZhbHVlKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAvLyBVbmtub3duIGluc3RydWN0aW9uLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIFNEVmFsdWUgZ2V0TWVtQ21wTG9hZChjb25zdCBWYWx1ZSAqUHRyVmFsLCBNVlQgTG9hZFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpMb2FkVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBR0J1aWxkZXIgJkJ1aWxkZXIpIHsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBsb2FkIGNhbiBiZSB0cml2aWFsbHkgY29uc3RhbnQgZm9sZGVkLCBlLmcuIGlmIHRoZQorICAvLyBpbnB1dCBpcyBmcm9tIGEgc3RyaW5nIGxpdGVyYWwuCisgIGlmIChjb25zdCBDb25zdGFudCAqTG9hZElucHV0ID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0clZhbCkpIHsKKyAgICAvLyBDYXN0IHBvaW50ZXIgdG8gdGhlIHR5cGUgd2UgcmVhbGx5IHdhbnQgdG8gbG9hZC4KKyAgICBMb2FkSW5wdXQgPSBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoY29uc3RfY2FzdDxDb25zdGFudCAqPihMb2FkSW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKExvYWRUeSkpOworCisgICAgaWYgKGNvbnN0IENvbnN0YW50ICpMb2FkQ3N0ID0KKyAgICAgICAgICBDb25zdGFudEZvbGRMb2FkRnJvbUNvbnN0UHRyKGNvbnN0X2Nhc3Q8Q29uc3RhbnQgKj4oTG9hZElucHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuVEQpKQorICAgICAgcmV0dXJuIEJ1aWxkZXIuZ2V0VmFsdWUoTG9hZENzdCk7CisgIH0KKworICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gZW1pdCB0aGUgbG9hZC4gIElmIHRoZSBwb2ludGVyIGlzIHRvIHVuZm9sZGFibGUgYnV0CisgIC8vIHN0aWxsIGNvbnN0YW50IG1lbW9yeSwgdGhlIGlucHV0IGNoYWluIGNhbiBiZSB0aGUgZW50cnkgbm9kZS4KKyAgU0RWYWx1ZSBSb290OworICBib29sIENvbnN0YW50TWVtb3J5ID0gZmFsc2U7CisKKyAgLy8gRG8gbm90IHNlcmlhbGl6ZSAobm9uLXZvbGF0aWxlKSBsb2FkcyBvZiBjb25zdGFudCBtZW1vcnkgd2l0aCBhbnl0aGluZy4KKyAgaWYgKEJ1aWxkZXIuQUEtPnBvaW50c1RvQ29uc3RhbnRNZW1vcnkoUHRyVmFsKSkgeworICAgIFJvb3QgPSBCdWlsZGVyLkRBRy5nZXRFbnRyeU5vZGUoKTsKKyAgICBDb25zdGFudE1lbW9yeSA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gRG8gbm90IHNlcmlhbGl6ZSBub24tdm9sYXRpbGUgbG9hZHMgYWdhaW5zdCBlYWNoIG90aGVyLgorICAgIFJvb3QgPSBCdWlsZGVyLkRBRy5nZXRSb290KCk7CisgIH0KKworICBTRFZhbHVlIFB0ciA9IEJ1aWxkZXIuZ2V0VmFsdWUoUHRyVmFsKTsKKyAgU0RWYWx1ZSBMb2FkVmFsID0gQnVpbGRlci5EQUcuZ2V0TG9hZChMb2FkVlQsIEJ1aWxkZXIuZ2V0Q3VyRGVidWdMb2MoKSwgUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHIsIFB0clZhbCAvKlNyY1ZhbHVlKi8sIDAvKlNWT2Zmc2V0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyp2b2xhdGlsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qbm9udGVtcG9yYWwqLywgMSAvKiBhbGlnbj0xICovKTsKKworICBpZiAoIUNvbnN0YW50TWVtb3J5KQorICAgIEJ1aWxkZXIuUGVuZGluZ0xvYWRzLnB1c2hfYmFjayhMb2FkVmFsLmdldFZhbHVlKDEpKTsKKyAgcmV0dXJuIExvYWRWYWw7Cit9CisKKworLy8vIHZpc2l0TWVtQ21wQ2FsbCAtIFNlZSBpZiB3ZSBjYW4gbG93ZXIgYSBjYWxsIHRvIG1lbWNtcCBpbiBhbiBvcHRpbWl6ZWQgZm9ybS4KKy8vLyBJZiBzbywgcmV0dXJuIHRydWUgYW5kIGxvd2VyIGl0LCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlIGFuZCBpdCB3aWxsIGJlCisvLy8gbG93ZXJlZCBsaWtlIGEgbm9ybWFsIGNhbGwuCitib29sIFNlbGVjdGlvbkRBR0J1aWxkZXI6OnZpc2l0TWVtQ21wQ2FsbChjb25zdCBDYWxsSW5zdCAmSSkgeworICAvLyBWZXJpZnkgdGhhdCB0aGUgcHJvdG90eXBlIG1ha2VzIHNlbnNlLiAgaW50IG1lbWNtcCh2b2lkKix2b2lkKixzaXplX3QpCisgIGlmIChJLmdldE51bUFyZ09wZXJhbmRzKCkgIT0gMykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgVmFsdWUgKkxIUyA9IEkuZ2V0QXJnT3BlcmFuZCgwKSwgKlJIUyA9IEkuZ2V0QXJnT3BlcmFuZCgxKTsKKyAgaWYgKCFMSFMtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSB8fCAhUkhTLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkgfHwKKyAgICAgICFJLmdldEFyZ09wZXJhbmQoMiktPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSB8fAorICAgICAgIUkuZ2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBDb25zdGFudEludCAqU2l6ZSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLmdldEFyZ09wZXJhbmQoMikpOworCisgIC8vIG1lbWNtcChTMSxTMiwyKSAhPSAwIC0+ICgqKHNob3J0KilMSFMgIT0gKihzaG9ydCopUkhTKSAgIT0gMAorICAvLyBtZW1jbXAoUzEsUzIsNCkgIT0gMCAtPiAoKihpbnQqKUxIUyAhPSAqKGludCopUkhTKSAgIT0gMAorICBpZiAoU2l6ZSAmJiBJc09ubHlVc2VkSW5aZXJvRXF1YWxpdHlDb21wYXJpc29uKCZJKSkgeworICAgIGJvb2wgQWN0dWFsbHlEb0l0ID0gdHJ1ZTsKKyAgICBNVlQgTG9hZFZUOworICAgIGNvbnN0IFR5cGUgKkxvYWRUeTsKKyAgICBzd2l0Y2ggKFNpemUtPmdldFpFeHRWYWx1ZSgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIExvYWRWVCA9IE1WVDo6T3RoZXI7CisgICAgICBMb2FkVHkgPSAwOworICAgICAgQWN0dWFsbHlEb0l0ID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBMb2FkVlQgPSBNVlQ6OmkxNjsKKyAgICAgIExvYWRUeSA9IFR5cGU6OmdldEludDE2VHkoU2l6ZS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIExvYWRWVCA9IE1WVDo6aTMyOworICAgICAgTG9hZFR5ID0gVHlwZTo6Z2V0SW50MzJUeShTaXplLT5nZXRDb250ZXh0KCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgTG9hZFZUID0gTVZUOjppNjQ7CisgICAgICBMb2FkVHkgPSBUeXBlOjpnZXRJbnQ2NFR5KFNpemUtPmdldENvbnRleHQoKSk7CisgICAgICBicmVhazsKKyAgICAgICAgLyoKKyAgICBjYXNlIDE2OgorICAgICAgTG9hZFZUID0gTVZUOjp2NGkzMjsKKyAgICAgIExvYWRUeSA9IFR5cGU6OmdldEludDMyVHkoU2l6ZS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgIExvYWRUeSA9IFZlY3RvclR5cGU6OmdldChMb2FkVHksIDQpOworICAgICAgYnJlYWs7CisgICAgICAgICAqLworICAgIH0KKworICAgIC8vIFRoaXMgdHVybnMgaW50byB1bmFsaWduZWQgbG9hZHMuICBXZSBvbmx5IGRvIHRoaXMgaWYgdGhlIHRhcmdldCBuYXRpdmVseQorICAgIC8vIHN1cHBvcnRzIHRoZSBNVlQgd2UnbGwgYmUgbG9hZGluZyBvciBpZiBpdCBpcyBzbWFsbCBlbm91Z2ggKDw9IDQpIHRoYXQKKyAgICAvLyB3ZSdsbCBvbmx5IHByb2R1Y2UgYSBzbWFsbCBudW1iZXIgb2YgYnl0ZSBsb2Fkcy4KKworICAgIC8vIFJlcXVpcmUgdGhhdCB3ZSBjYW4gZmluZCBhIGxlZ2FsIE1WVCwgYW5kIG9ubHkgZG8gdGhpcyBpZiB0aGUgdGFyZ2V0CisgICAgLy8gc3VwcG9ydHMgdW5hbGlnbmVkIGxvYWRzIG9mIHRoYXQgdHlwZS4gIEV4cGFuZGluZyBpbnRvIGJ5dGUgbG9hZHMgd291bGQKKyAgICAvLyBibG9hdCB0aGUgY29kZS4KKyAgICBpZiAoQWN0dWFsbHlEb0l0ICYmIFNpemUtPmdldFpFeHRWYWx1ZSgpID4gNCkgeworICAgICAgLy8gVE9ETzogSGFuZGxlIDUgYnl0ZSBjb21wYXJlIGFzIDQtYnl0ZSArIDEgYnl0ZS4KKyAgICAgIC8vIFRPRE86IEhhbmRsZSA4IGJ5dGUgY29tcGFyZSBvbiB4ODYtMzIgYXMgdHdvIDMyLWJpdCBsb2Fkcy4KKyAgICAgIGlmICghVExJLmlzVHlwZUxlZ2FsKExvYWRWVCkgfHwhVExJLmFsbG93c1VuYWxpZ25lZE1lbW9yeUFjY2Vzc2VzKExvYWRWVCkpCisgICAgICAgIEFjdHVhbGx5RG9JdCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChBY3R1YWxseURvSXQpIHsKKyAgICAgIFNEVmFsdWUgTEhTVmFsID0gZ2V0TWVtQ21wTG9hZChMSFMsIExvYWRWVCwgTG9hZFR5LCAqdGhpcyk7CisgICAgICBTRFZhbHVlIFJIU1ZhbCA9IGdldE1lbUNtcExvYWQoUkhTLCBMb2FkVlQsIExvYWRUeSwgKnRoaXMpOworCisgICAgICBTRFZhbHVlIFJlcyA9IERBRy5nZXRTZXRDQyhnZXRDdXJEZWJ1Z0xvYygpLCBNVlQ6OmkxLCBMSFNWYWwsIFJIU1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUTkUpOworICAgICAgRVZUIENhbGxWVCA9IFRMSS5nZXRWYWx1ZVR5cGUoSS5nZXRUeXBlKCksIHRydWUpOworICAgICAgc2V0VmFsdWUoJkksIERBRy5nZXRaRXh0T3JUcnVuYyhSZXMsIGdldEN1ckRlYnVnTG9jKCksIENhbGxWVCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKworICByZXR1cm4gZmFsc2U7Cit9CisKKwordm9pZCBTZWxlY3Rpb25EQUdCdWlsZGVyOjp2aXNpdENhbGwoY29uc3QgQ2FsbEluc3QgJkkpIHsKKyAgY29uc3QgY2hhciAqUmVuYW1lRm4gPSAwOworICBpZiAoRnVuY3Rpb24gKkYgPSBJLmdldENhbGxlZEZ1bmN0aW9uKCkpIHsKKyAgICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpKSB7CisgICAgICBpZiAoY29uc3QgVGFyZ2V0SW50cmluc2ljSW5mbyAqSUkgPSBUTS5nZXRJbnRyaW5zaWNJbmZvKCkpIHsKKyAgICAgICAgaWYgKHVuc2lnbmVkIElJRCA9IElJLT5nZXRJbnRyaW5zaWNJRChGKSkgeworICAgICAgICAgIFJlbmFtZUZuID0gdmlzaXRJbnRyaW5zaWNDYWxsKEksIElJRCk7CisgICAgICAgICAgaWYgKCFSZW5hbWVGbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHVuc2lnbmVkIElJRCA9IEYtPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgICAgUmVuYW1lRm4gPSB2aXNpdEludHJpbnNpY0NhbGwoSSwgSUlEKTsKKyAgICAgICAgaWYgKCFSZW5hbWVGbikKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHdlbGwta25vd24gbGliYy9saWJtIGNhbGxzLiAgSWYgdGhlIGZ1bmN0aW9uIGlzIGludGVybmFsLCBpdAorICAgIC8vIGNhbid0IGJlIGEgbGlicmFyeSBjYWxsLgorICAgIGlmICghRi0+aGFzTG9jYWxMaW5rYWdlKCkgJiYgRi0+aGFzTmFtZSgpKSB7CisgICAgICBTdHJpbmdSZWYgTmFtZSA9IEYtPmdldE5hbWUoKTsKKyAgICAgIGlmIChOYW1lID09ICJjb3B5c2lnbiIgfHwgTmFtZSA9PSAiY29weXNpZ25mIiB8fCBOYW1lID09ICJjb3B5c2lnbmwiKSB7CisgICAgICAgIGlmIChJLmdldE51bUFyZ09wZXJhbmRzKCkgPT0gMiAmJiAgIC8vIEJhc2ljIHNhbml0eSBjaGVja3MuCisgICAgICAgICAgICBJLmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKS0+aXNGbG9hdGluZ1BvaW50VHkoKSAmJgorICAgICAgICAgICAgSS5nZXRUeXBlKCkgPT0gSS5nZXRBcmdPcGVyYW5kKDApLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIEkuZ2V0VHlwZSgpID09IEkuZ2V0QXJnT3BlcmFuZCgxKS0+Z2V0VHlwZSgpKSB7CisgICAgICAgICAgU0RWYWx1ZSBMSFMgPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworICAgICAgICAgIFNEVmFsdWUgUkhTID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDEpKTsKKyAgICAgICAgICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpGQ09QWVNJR04sIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIUy5nZXRWYWx1ZVR5cGUoKSwgTEhTLCBSSFMpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoTmFtZSA9PSAiZmFicyIgfHwgTmFtZSA9PSAiZmFic2YiIHx8IE5hbWUgPT0gImZhYnNsIikgeworICAgICAgICBpZiAoSS5nZXROdW1BcmdPcGVyYW5kcygpID09IDEgJiYgICAvLyBCYXNpYyBzYW5pdHkgY2hlY2tzLgorICAgICAgICAgICAgSS5nZXRBcmdPcGVyYW5kKDApLT5nZXRUeXBlKCktPmlzRmxvYXRpbmdQb2ludFR5KCkgJiYKKyAgICAgICAgICAgIEkuZ2V0VHlwZSgpID09IEkuZ2V0QXJnT3BlcmFuZCgwKS0+Z2V0VHlwZSgpKSB7CisgICAgICAgICAgU0RWYWx1ZSBUbXAgPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworICAgICAgICAgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkZBQlMsIGdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRtcC5nZXRWYWx1ZVR5cGUoKSwgVG1wKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKE5hbWUgPT0gInNpbiIgfHwgTmFtZSA9PSAic2luZiIgfHwgTmFtZSA9PSAic2lubCIpIHsKKyAgICAgICAgaWYgKEkuZ2V0TnVtQXJnT3BlcmFuZHMoKSA9PSAxICYmICAgLy8gQmFzaWMgc2FuaXR5IGNoZWNrcy4KKyAgICAgICAgICAgIEkuZ2V0QXJnT3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc0Zsb2F0aW5nUG9pbnRUeSgpICYmCisgICAgICAgICAgICBJLmdldFR5cGUoKSA9PSBJLmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgSS5vbmx5UmVhZHNNZW1vcnkoKSkgeworICAgICAgICAgIFNEVmFsdWUgVG1wID0gZ2V0VmFsdWUoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICAgICAgICBzZXRWYWx1ZSgmSSwgREFHLmdldE5vZGUoSVNEOjpGU0lOLCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbXAuZ2V0VmFsdWVUeXBlKCksIFRtcCkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChOYW1lID09ICJjb3MiIHx8IE5hbWUgPT0gImNvc2YiIHx8IE5hbWUgPT0gImNvc2wiKSB7CisgICAgICAgIGlmIChJLmdldE51bUFyZ09wZXJhbmRzKCkgPT0gMSAmJiAgIC8vIEJhc2ljIHNhbml0eSBjaGVja3MuCisgICAgICAgICAgICBJLmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKS0+aXNGbG9hdGluZ1BvaW50VHkoKSAmJgorICAgICAgICAgICAgSS5nZXRUeXBlKCkgPT0gSS5nZXRBcmdPcGVyYW5kKDApLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIEkub25seVJlYWRzTWVtb3J5KCkpIHsKKyAgICAgICAgICBTRFZhbHVlIFRtcCA9IGdldFZhbHVlKEkuZ2V0QXJnT3BlcmFuZCgwKSk7CisgICAgICAgICAgc2V0VmFsdWUoJkksIERBRy5nZXROb2RlKElTRDo6RkNPUywgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wLmdldFZhbHVlVHlwZSgpLCBUbXApKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoTmFtZSA9PSAic3FydCIgfHwgTmFtZSA9PSAic3FydGYiIHx8IE5hbWUgPT0gInNxcnRsIikgeworICAgICAgICBpZiAoSS5nZXROdW1BcmdPcGVyYW5kcygpID09IDEgJiYgICAvLyBCYXNpYyBzYW5pdHkgY2hlY2tzLgorICAgICAgICAgICAgSS5nZXRBcmdPcGVyYW5kKDApLT5nZXRUeXBlKCktPmlzRmxvYXRpbmdQb2ludFR5KCkgJiYKKyAgICAgICAgICAgIEkuZ2V0VHlwZSgpID09IEkuZ2V0QXJnT3BlcmFuZCgwKS0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICBJLm9ubHlSZWFkc01lbW9yeSgpKSB7CisgICAgICAgICAgU0RWYWx1ZSBUbXAgPSBnZXRWYWx1ZShJLmdldEFyZ09wZXJhbmQoMCkpOworICAgICAgICAgIHNldFZhbHVlKCZJLCBEQUcuZ2V0Tm9kZShJU0Q6OkZTUVJULCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbXAuZ2V0VmFsdWVUeXBlKCksIFRtcCkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChOYW1lID09ICJtZW1jbXAiKSB7CisgICAgICAgIGlmICh2aXNpdE1lbUNtcENhbGwoSSkpCisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgU0RWYWx1ZSBDYWxsZWU7CisgIGlmICghUmVuYW1lRm4pCisgICAgQ2FsbGVlID0gZ2V0VmFsdWUoSS5nZXRDYWxsZWRWYWx1ZSgpKTsKKyAgZWxzZQorICAgIENhbGxlZSA9IERBRy5nZXRFeHRlcm5hbFN5bWJvbChSZW5hbWVGbiwgVExJLmdldFBvaW50ZXJUeSgpKTsKKworICAvLyBDaGVjayBpZiB3ZSBjYW4gcG90ZW50aWFsbHkgcGVyZm9ybSBhIHRhaWwgY2FsbC4gTW9yZSBkZXRhaWxlZCBjaGVja2luZyBpcworICAvLyBiZSBkb25lIHdpdGhpbiBMb3dlckNhbGxUbywgYWZ0ZXIgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FsbCBpcyBrbm93bi4KKyAgTG93ZXJDYWxsVG8oJkksIENhbGxlZSwgSS5pc1RhaWxDYWxsKCkpOworfQorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBc21PcGVyYW5kSW5mbyAtIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGVhY2ggY29uc3RyYWludCB0aGF0IHdlIGFyZQorLy8vIGxvd2VyaW5nLgorY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgU0RJU2VsQXNtT3BlcmFuZEluZm8gOgorICAgIHB1YmxpYyBUYXJnZXRMb3dlcmluZzo6QXNtT3BlcmFuZEluZm8geworcHVibGljOgorICAvLy8gQ2FsbE9wZXJhbmQgLSBJZiB0aGlzIGlzIHRoZSByZXN1bHQgb3V0cHV0IG9wZXJhbmQgb3IgYSBjbG9iYmVyCisgIC8vLyB0aGlzIGlzIG51bGwsIG90aGVyd2lzZSBpdCBpcyB0aGUgaW5jb21pbmcgb3BlcmFuZCB0byB0aGUgQ2FsbEluc3QuCisgIC8vLyBUaGlzIGdldHMgbW9kaWZpZWQgYXMgdGhlIGFzbSBpcyBwcm9jZXNzZWQuCisgIFNEVmFsdWUgQ2FsbE9wZXJhbmQ7CisKKyAgLy8vIEFzc2lnbmVkUmVncyAtIElmIHRoaXMgaXMgYSByZWdpc3RlciBvciByZWdpc3RlciBjbGFzcyBvcGVyYW5kLCB0aGlzCisgIC8vLyBjb250YWlucyB0aGUgc2V0IG9mIHJlZ2lzdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9wZXJhbmQuCisgIFJlZ3NGb3JWYWx1ZSBBc3NpZ25lZFJlZ3M7CisKKyAgZXhwbGljaXQgU0RJU2VsQXNtT3BlcmFuZEluZm8oY29uc3QgSW5saW5lQXNtOjpDb25zdHJhaW50SW5mbyAmaW5mbykKKyAgICA6IFRhcmdldExvd2VyaW5nOjpBc21PcGVyYW5kSW5mbyhpbmZvKSwgQ2FsbE9wZXJhbmQoMCwwKSB7CisgIH0KKworICAvLy8gTWFya0FsbG9jYXRlZFJlZ3MgLSBPbmNlIEFzc2lnbmVkUmVncyBpcyBzZXQsIG1hcmsgdGhlIGFzc2lnbmVkIHJlZ2lzdGVycworICAvLy8gYnVzeSBpbiBPdXRwdXRSZWdzL0lucHV0UmVncy4KKyAgdm9pZCBNYXJrQWxsb2NhdGVkUmVncyhib29sIGlzT3V0UmVnLCBib29sIGlzSW5SZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8dW5zaWduZWQ+ICZPdXRwdXRSZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHVuc2lnbmVkPiAmSW5wdXRSZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdCB7CisgICAgaWYgKGlzT3V0UmVnKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXNzaWduZWRSZWdzLlJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgTWFya1JlZ0FuZEFsaWFzZXMoQXNzaWduZWRSZWdzLlJlZ3NbaV0sIE91dHB1dFJlZ3MsIFRSSSk7CisgICAgfQorICAgIGlmIChpc0luUmVnKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXNzaWduZWRSZWdzLlJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgTWFya1JlZ0FuZEFsaWFzZXMoQXNzaWduZWRSZWdzLlJlZ3NbaV0sIElucHV0UmVncywgVFJJKTsKKyAgICB9CisgIH0KKworICAvLy8gZ2V0Q2FsbE9wZXJhbmRWYWxFVlQgLSBSZXR1cm4gdGhlIEVWVCBvZiB0aGUgVmFsdWUqIHRoYXQgdGhpcyBvcGVyYW5kCisgIC8vLyBjb3JyZXNwb25kcyB0by4gIElmIHRoZXJlIGlzIG5vIFZhbHVlKiBmb3IgdGhpcyBvcGVyYW5kLCBpdCByZXR1cm5zCisgIC8vLyBNVlQ6Ok90aGVyLgorICBFVlQgZ2V0Q2FsbE9wZXJhbmRWYWxFVlQoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQpIGNvbnN0IHsKKyAgICBpZiAoQ2FsbE9wZXJhbmRWYWwgPT0gMCkgcmV0dXJuIE1WVDo6T3RoZXI7CisKKyAgICBpZiAoaXNhPEJhc2ljQmxvY2s+KENhbGxPcGVyYW5kVmFsKSkKKyAgICAgIHJldHVybiBUTEkuZ2V0UG9pbnRlclR5KCk7CisKKyAgICBjb25zdCBsbHZtOjpUeXBlICpPcFR5ID0gQ2FsbE9wZXJhbmRWYWwtPmdldFR5cGUoKTsKKworICAgIC8vIElmIHRoaXMgaXMgYW4gaW5kaXJlY3Qgb3BlcmFuZCwgdGhlIG9wZXJhbmQgaXMgYSBwb2ludGVyIHRvIHRoZQorICAgIC8vIGFjY2Vzc2VkIHR5cGUuCisgICAgaWYgKGlzSW5kaXJlY3QpIHsKKyAgICAgIGNvbnN0IGxsdm06OlBvaW50ZXJUeXBlICpQdHJUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihPcFR5KTsKKyAgICAgIGlmICghUHRyVHkpCisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiSW5kaXJlY3Qgb3BlcmFuZCBmb3IgaW5saW5lIGFzbSBub3QgYSBwb2ludGVyISIpOworICAgICAgT3BUeSA9IFB0clR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgIH0KKworICAgIC8vIElmIE9wVHkgaXMgbm90IGEgc2luZ2xlIHZhbHVlLCBpdCBtYXkgYmUgYSBzdHJ1Y3QvdW5pb24gdGhhdCB3ZQorICAgIC8vIGNhbiB0aWxlIHdpdGggaW50ZWdlcnMuCisgICAgaWYgKCFPcFR5LT5pc1NpbmdsZVZhbHVlVHlwZSgpICYmIE9wVHktPmlzU2l6ZWQoKSkgeworICAgICAgdW5zaWduZWQgQml0U2l6ZSA9IFRELT5nZXRUeXBlU2l6ZUluQml0cyhPcFR5KTsKKyAgICAgIHN3aXRjaCAoQml0U2l6ZSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDg6CisgICAgICBjYXNlIDE2OgorICAgICAgY2FzZSAzMjoKKyAgICAgIGNhc2UgNjQ6CisgICAgICBjYXNlIDEyODoKKyAgICAgICAgT3BUeSA9IEludGVnZXJUeXBlOjpnZXQoQ29udGV4dCwgQml0U2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUTEkuZ2V0VmFsdWVUeXBlKE9wVHksIHRydWUpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBNYXJrUmVnQW5kQWxpYXNlcyAtIE1hcmsgdGhlIHNwZWNpZmllZCByZWdpc3RlciBhbmQgYWxsIGFsaWFzZXMgaW4gdGhlCisgIC8vLyBzcGVjaWZpZWQgc2V0LgorICBzdGF0aWMgdm9pZCBNYXJrUmVnQW5kQWxpYXNlcyh1bnNpZ25lZCBSZWcsIHN0ZDo6c2V0PHVuc2lnbmVkPiAmUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIHsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSAmJiAiSXNuJ3QgYSBwaHlzcmVnIik7CisgICAgUmVncy5pbnNlcnQoUmVnKTsKKyAgICBpZiAoY29uc3QgdW5zaWduZWQgKkFsaWFzZXMgPSBUUkkuZ2V0QWxpYXNTZXQoUmVnKSkKKyAgICAgIGZvciAoOyAqQWxpYXNlczsgKytBbGlhc2VzKQorICAgICAgICBSZWdzLmluc2VydCgqQWxpYXNlcyk7CisgIH0KK307CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlLgorCisvLy8gaXNBbGxvY2F0YWJsZVJlZ2lzdGVyIC0gSWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBpcyBzYWZlIHRvIGFsbG9jYXRlLAorLy8vIGkuZS4gaXQgaXNuJ3QgYSBzdGFjayBwb2ludGVyIG9yIHNvbWUgb3RoZXIgc3BlY2lhbCByZWdpc3RlciwgcmV0dXJuIHRoZQorLy8vIHJlZ2lzdGVyIGNsYXNzIGZvciB0aGUgcmVnaXN0ZXIuICBPdGhlcndpc2UsIHJldHVybiBudWxsLgorc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgoraXNBbGxvY2F0YWJsZVJlZ2lzdGVyKHVuc2lnbmVkIFJlZywgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSB7CisgIEVWVCBGb3VuZFZUID0gTVZUOjpPdGhlcjsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqRm91bmRSQyA9IDA7CisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjpyZWdjbGFzc19pdGVyYXRvciBSQ0kgPSBUUkktPnJlZ2NsYXNzX2JlZ2luKCksCisgICAgICAgRSA9IFRSSS0+cmVnY2xhc3NfZW5kKCk7IFJDSSAhPSBFOyArK1JDSSkgeworICAgIEVWVCBUaGlzVlQgPSBNVlQ6Ok90aGVyOworCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSAqUkNJOworICAgIC8vIElmIG5vbmUgb2YgdGhlIHZhbHVlIHR5cGVzIGZvciB0aGlzIHJlZ2lzdGVyIGNsYXNzIGFyZSB2YWxpZCwgd2UKKyAgICAvLyBjYW4ndCB1c2UgaXQuICBGb3IgZXhhbXBsZSwgNjQtYml0IHJlZyBjbGFzc2VzIG9uIDMyLWJpdCB0YXJnZXRzLgorICAgIGZvciAoVGFyZ2V0UmVnaXN0ZXJDbGFzczo6dnRfaXRlcmF0b3IgSSA9IFJDLT52dF9iZWdpbigpLCBFID0gUkMtPnZ0X2VuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChUTEkuaXNUeXBlTGVnYWwoKkkpKSB7CisgICAgICAgIC8vIElmIHdlIGhhdmUgYWxyZWFkeSBmb3VuZCB0aGlzIHJlZ2lzdGVyIGluIGEgZGlmZmVyZW50IHJlZ2lzdGVyIGNsYXNzLAorICAgICAgICAvLyBjaG9vc2UgdGhlIG9uZSB3aXRoIHRoZSBsYXJnZXN0IFZUIHNwZWNpZmllZC4gIEZvciBleGFtcGxlLCBvbgorICAgICAgICAvLyBQb3dlclBDLCB3ZSBmYXZvciBmNjQgcmVnaXN0ZXIgY2xhc3NlcyBvdmVyIGYzMi4KKyAgICAgICAgaWYgKEZvdW5kVlQgPT0gTVZUOjpPdGhlciB8fCBGb3VuZFZULmJpdHNMVCgqSSkpIHsKKyAgICAgICAgICBUaGlzVlQgPSAqSTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChUaGlzVlQgPT0gTVZUOjpPdGhlcikgY29udGludWU7CisKKyAgICAvLyBOT1RFOiBUaGlzIGlzbid0IGlkZWFsLiAgSW4gcGFydGljdWxhciwgdGhpcyBtaWdodCBhbGxvY2F0ZSB0aGUKKyAgICAvLyBmcmFtZSBwb2ludGVyIGluIGZ1bmN0aW9ucyB0aGF0IG5lZWQgaXQgKGR1ZSB0byB0aGVtIG5vdCBiZWluZyB0YWtlbgorICAgIC8vIG91dCBvZiBhbGxvY2F0aW9uLCBiZWNhdXNlIGEgdmFyaWFibGUgc2l6ZWQgYWxsb2NhdGlvbiBoYXNuJ3QgYmVlbiBzZWVuCisgICAgLy8geWV0KS4gIFRoaXMgaXMgYSBzbGlnaHQgY29kZSBwZXNzaW1pemF0aW9uLCBidXQgc2hvdWxkIHN0aWxsIHdvcmsuCisgICAgZm9yIChUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvciBJID0gUkMtPmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oTUYpLAorICAgICAgICAgRSA9IFJDLT5hbGxvY2F0aW9uX29yZGVyX2VuZChNRik7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKCpJID09IFJlZykgeworICAgICAgICAvLyBXZSBmb3VuZCBhIG1hdGNoaW5nIHJlZ2lzdGVyIGNsYXNzLiAgS2VlcCBsb29raW5nIGF0IG90aGVycyBpbiBjYXNlCisgICAgICAgIC8vIHdlIGZpbmQgb25lIHdpdGggbGFyZ2VyIHJlZ2lzdGVycyB0aGF0IHRoaXMgcGh5c3JlZyBpcyBhbHNvIGluLgorICAgICAgICBGb3VuZFJDID0gUkM7CisgICAgICAgIEZvdW5kVlQgPSBUaGlzVlQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisgIHJldHVybiBGb3VuZFJDOworfQorCisvLy8gR2V0UmVnaXN0ZXJzRm9yVmFsdWUgLSBBc3NpZ24gcmVnaXN0ZXJzICh2aXJ0dWFsIG9yIHBoeXNpY2FsKSBmb3IgdGhlCisvLy8gc3BlY2lmaWVkIG9wZXJhbmQuICBXZSBwcmVmZXIgdG8gYXNzaWduIHZpcnR1YWwgcmVnaXN0ZXJzLCB0byBhbGxvdyB0aGUKKy8vLyByZWdpc3RlciBhbGxvY2F0b3IgdG8gaGFuZGxlIHRoZSBhc3NpZ25tZW50IHByb2Nlc3MuICBIb3dldmVyLCBpZiB0aGUgYXNtCisvLy8gdXNlcyBmZWF0dXJlcyB0aGF0IHdlIGNhbid0IG1vZGVsIG9uIG1hY2hpbmVpbnN0cnMsIHdlIGhhdmUgU0RJU2VsIGRvIHRoZQorLy8vIGFsbG9jYXRpb24uICBUaGlzIHByb2R1Y2VzIGdlbmVyYWxseSBob3JyaWJsZSwgYnV0IGNvcnJlY3QsIGNvZGUuCisvLy8KKy8vLyAgIE9wSW5mbyBkZXNjcmliZXMgdGhlIG9wZXJhbmQuCisvLy8gICBJbnB1dCBhbmQgT3V0cHV0UmVncyBhcmUgdGhlIHNldCBvZiBhbHJlYWR5IGFsbG9jYXRlZCBwaHlzaWNhbCByZWdpc3RlcnMuCisvLy8KK3ZvaWQgU2VsZWN0aW9uREFHQnVpbGRlcjo6CitHZXRSZWdpc3RlcnNGb3JWYWx1ZShTRElTZWxBc21PcGVyYW5kSW5mbyAmT3BJbmZvLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8dW5zaWduZWQ+ICZPdXRwdXRSZWdzLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8dW5zaWduZWQ+ICZJbnB1dFJlZ3MpIHsKKyAgTExWTUNvbnRleHQgJkNvbnRleHQgPSBGdW5jSW5mby5Gbi0+Z2V0Q29udGV4dCgpOworCisgIC8vIENvbXB1dGUgd2hldGhlciB0aGlzIHZhbHVlIHJlcXVpcmVzIGFuIGlucHV0IHJlZ2lzdGVyLCBhbiBvdXRwdXQgcmVnaXN0ZXIsCisgIC8vIG9yIGJvdGguCisgIGJvb2wgaXNPdXRSZWcgPSBmYWxzZTsKKyAgYm9vbCBpc0luUmVnID0gZmFsc2U7CisgIHN3aXRjaCAoT3BJbmZvLlR5cGUpIHsKKyAgY2FzZSBJbmxpbmVBc206OmlzT3V0cHV0OgorICAgIGlzT3V0UmVnID0gdHJ1ZTsKKworICAgIC8vIElmIHRoZXJlIGlzIGFuIGlucHV0IGNvbnN0cmFpbnQgdGhhdCBtYXRjaGVzIHRoaXMsIHdlIG5lZWQgdG8gcmVzZXJ2ZQorICAgIC8vIHRoZSBpbnB1dCByZWdpc3RlciBzbyBubyBvdGhlciBpbnB1dHMgYWxsb2NhdGUgdG8gaXQuCisgICAgaXNJblJlZyA9IE9wSW5mby5oYXNNYXRjaGluZ0lucHV0KCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5saW5lQXNtOjppc0lucHV0OgorICAgIGlzSW5SZWcgPSB0cnVlOworICAgIGlzT3V0UmVnID0gZmFsc2U7CisgICAgYnJlYWs7CisgIGNhc2UgSW5saW5lQXNtOjppc0Nsb2JiZXI6CisgICAgaXNPdXRSZWcgPSB0cnVlOworICAgIGlzSW5SZWcgPSB0cnVlOworICAgIGJyZWFrOworICB9CisKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gUmVnczsKKworICAvLyBJZiB0aGlzIGlzIGEgY29uc3RyYWludCBmb3IgYSBzaW5nbGUgcGh5c3JlZywgb3IgYSBjb25zdHJhaW50IGZvciBhCisgIC8vIHJlZ2lzdGVyIGNsYXNzLCBmaW5kIGl0LgorICBzdGQ6OnBhaXI8dW5zaWduZWQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqPiBQaHlzUmVnID0KKyAgICBUTEkuZ2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChPcEluZm8uQ29uc3RyYWludENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BJbmZvLkNvbnN0cmFpbnRWVCk7CisKKyAgdW5zaWduZWQgTnVtUmVncyA9IDE7CisgIGlmIChPcEluZm8uQ29uc3RyYWludFZUICE9IE1WVDo6T3RoZXIpIHsKKyAgICAvLyBJZiB0aGlzIGlzIGEgRlAgaW5wdXQgaW4gYW4gaW50ZWdlciByZWdpc3RlciAob3IgdmlzYSB2ZXJzYSkgaW5zZXJ0IGEgYml0CisgICAgLy8gY2FzdCBvZiB0aGUgaW5wdXQgdmFsdWUuICBNb3JlIGdlbmVyYWxseSwgaGFuZGxlIGFueSBjYXNlIHdoZXJlIHRoZSBpbnB1dAorICAgIC8vIHZhbHVlIGRpc2FncmVlcyB3aXRoIHRoZSByZWdpc3RlciBjbGFzcyB3ZSBwbGFuIHRvIHN0aWNrIHRoaXMgaW4uCisgICAgaWYgKE9wSW5mby5UeXBlID09IElubGluZUFzbTo6aXNJbnB1dCAmJgorICAgICAgICBQaHlzUmVnLnNlY29uZCAmJiAhUGh5c1JlZy5zZWNvbmQtPmhhc1R5cGUoT3BJbmZvLkNvbnN0cmFpbnRWVCkpIHsKKyAgICAgIC8vIFRyeSB0byBjb252ZXJ0IHRvIHRoZSBmaXJzdCBFVlQgdGhhdCB0aGUgcmVnIGNsYXNzIGNvbnRhaW5zLiAgSWYgdGhlCisgICAgICAvLyB0eXBlcyBhcmUgaWRlbnRpY2FsIHNpemUsIHVzZSBhIGJpdGNhc3QgdG8gY29udmVydCAoZS5nLiB0d28gZGlmZmVyaW5nCisgICAgICAvLyB2ZWN0b3IgdHlwZXMpLgorICAgICAgRVZUIFJlZ1ZUID0gKlBoeXNSZWcuc2Vjb25kLT52dF9iZWdpbigpOworICAgICAgaWYgKFJlZ1ZULmdldFNpemVJbkJpdHMoKSA9PSBPcEluZm8uQ29uc3RyYWludFZULmdldFNpemVJbkJpdHMoKSkgeworICAgICAgICBPcEluZm8uQ2FsbE9wZXJhbmQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBnZXRDdXJEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdWVCwgT3BJbmZvLkNhbGxPcGVyYW5kKTsKKyAgICAgICAgT3BJbmZvLkNvbnN0cmFpbnRWVCA9IFJlZ1ZUOworICAgICAgfSBlbHNlIGlmIChSZWdWVC5pc0ludGVnZXIoKSAmJiBPcEluZm8uQ29uc3RyYWludFZULmlzRmxvYXRpbmdQb2ludCgpKSB7CisgICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIEZQIHZhbHVlIGFuZCB3ZSB3YW50IGl0IGluIEZQIHJlZ2lzdGVycywgZG8gYQorICAgICAgICAvLyBiaXRjYXN0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGludGVnZXIgdHlwZS4gIFRoaXMgdHVybnMgYW4gZjY0IHZhbHVlCisgICAgICAgIC8vIGludG8gaTY0LCB3aGljaCBjYW4gYmUgcGFzc2VkIHdpdGggdHdvIGkzMiB2YWx1ZXMgb24gYSAzMi1iaXQKKyAgICAgICAgLy8gbWFjaGluZS4KKyAgICAgICAgUmVnVlQgPSBFVlQ6OmdldEludGVnZXJWVChDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wSW5mby5Db25zdHJhaW50VlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgICAgICAgT3BJbmZvLkNhbGxPcGVyYW5kID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZ2V0Q3VyRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnVlQsIE9wSW5mby5DYWxsT3BlcmFuZCk7CisgICAgICAgIE9wSW5mby5Db25zdHJhaW50VlQgPSBSZWdWVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBOdW1SZWdzID0gVExJLmdldE51bVJlZ2lzdGVycyhDb250ZXh0LCBPcEluZm8uQ29uc3RyYWludFZUKTsKKyAgfQorCisgIEVWVCBSZWdWVDsKKyAgRVZUIFZhbHVlVlQgPSBPcEluZm8uQ29uc3RyYWludFZUOworCisgIC8vIElmIHRoaXMgaXMgYSBjb25zdHJhaW50IGZvciBhIHNwZWNpZmljIHBoeXNpY2FsIHJlZ2lzdGVyLCBsaWtlIHtyMTd9LAorICAvLyBhc3NpZ24gaXQgbm93LgorICBpZiAodW5zaWduZWQgQXNzaWduZWRSZWcgPSBQaHlzUmVnLmZpcnN0KSB7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBQaHlzUmVnLnNlY29uZDsKKyAgICBpZiAoT3BJbmZvLkNvbnN0cmFpbnRWVCA9PSBNVlQ6Ok90aGVyKQorICAgICAgVmFsdWVWVCA9ICpSQy0+dnRfYmVnaW4oKTsKKworICAgIC8vIEdldCB0aGUgYWN0dWFsIHJlZ2lzdGVyIHZhbHVlIHR5cGUuICBUaGlzIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgdXNlcgorICAgIC8vIG1heSBoYXZlIGFza2VkIGZvciAoZS5nLikgdGhlIEFYIHJlZ2lzdGVyIGluIGkzMiB0eXBlLiAgV2UgbmVlZCB0bworICAgIC8vIHJlbWVtYmVyIHRoYXQgQVggaXMgYWN0dWFsbHkgaTE2IHRvIGdldCB0aGUgcmlnaHQgZXh0ZW5zaW9uLgorICAgIFJlZ1ZUID0gKlJDLT52dF9iZWdpbigpOworCisgICAgLy8gVGhpcyBpcyBhIGV4cGxpY2l0IHJlZmVyZW5jZSB0byBhIHBoeXNpY2FsIHJlZ2lzdGVyLgorICAgIFJlZ3MucHVzaF9iYWNrKEFzc2lnbmVkUmVnKTsKKworICAgIC8vIElmIHRoaXMgaXMgYW4gZXhwYW5kZWQgcmVmZXJlbmNlLCBhZGQgdGhlIHJlc3Qgb2YgdGhlIHJlZ3MgdG8gUmVncy4KKyAgICBpZiAoTnVtUmVncyAhPSAxKSB7CisgICAgICBUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvciBJID0gUkMtPmJlZ2luKCk7CisgICAgICBmb3IgKDsgKkkgIT0gQXNzaWduZWRSZWc7ICsrSSkKKyAgICAgICAgYXNzZXJ0KEkgIT0gUkMtPmVuZCgpICYmICJEaWRuJ3QgZmluZCByZWchIik7CisKKyAgICAgIC8vIEFscmVhZHkgYWRkZWQgdGhlIGZpcnN0IHJlZy4KKyAgICAgIC0tTnVtUmVnczsgKytJOworICAgICAgZm9yICg7IE51bVJlZ3M7IC0tTnVtUmVncywgKytJKSB7CisgICAgICAgIGFzc2VydChJICE9IFJDLT5lbmQoKSAmJiAiUmFuIG91dCBvZiByZWdpc3RlcnMgdG8gYWxsb2NhdGUhIik7CisgICAgICAgIFJlZ3MucHVzaF9iYWNrKCpJKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBPcEluZm8uQXNzaWduZWRSZWdzID0gUmVnc0ZvclZhbHVlKFJlZ3MsIFJlZ1ZULCBWYWx1ZVZUKTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IERBRy5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKyAgICBPcEluZm8uTWFya0FsbG9jYXRlZFJlZ3MoaXNPdXRSZWcsIGlzSW5SZWcsIE91dHB1dFJlZ3MsIElucHV0UmVncywgKlRSSSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBpZiB0aGlzIHdhcyBhIHJlZmVyZW5jZSB0byBhbiBMTFZNIHJlZ2lzdGVyIGNsYXNzLCBjcmVhdGUgdnJlZ3MKKyAgLy8gZm9yIHRoaXMgcmVmZXJlbmNlLgorICBpZiAoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBQaHlzUmVnLnNlY29uZCkgeworICAgIFJlZ1ZUID0gKlJDLT52dF9iZWdpbigpOworICAgIGlmIChPcEluZm8uQ29uc3RyYWludFZUID09IE1WVDo6T3RoZXIpCisgICAgICBWYWx1ZVZUID0gUmVnVlQ7CisKKyAgICAvLyBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZSZWdJbmZvID0gTUYuZ2V0UmVnSW5mbygpOworICAgIGZvciAoOyBOdW1SZWdzOyAtLU51bVJlZ3MpCisgICAgICBSZWdzLnB1c2hfYmFjayhSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQykpOworCisgICAgT3BJbmZvLkFzc2lnbmVkUmVncyA9IFJlZ3NGb3JWYWx1ZShSZWdzLCBSZWdWVCwgVmFsdWVWVCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHJlZ2lzdGVyIGNsYXNzIHRoYXQgZG9lc24ndCBkaXJlY3RseSBjb3JyZXNwb25kCisgIC8vIHRvIGFuIExMVk0gcmVnaXN0ZXIgY2xhc3MuICBBbGxvY2F0ZSBOdW1SZWdzIGNvbnNlY3V0aXZlLCBhdmFpbGFibGUsCisgIC8vIHJlZ2lzdGVycyBmcm9tIHRoZSBjbGFzcy4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFJlZ0NsYXNzUmVncworICAgID0gVExJLmdldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludChPcEluZm8uQ29uc3RyYWludENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wSW5mby5Db25zdHJhaW50VlQpOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gREFHLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICB1bnNpZ25lZCBOdW1BbGxvY2F0ZWQgPSAwOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnQ2xhc3NSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBSZWdDbGFzc1JlZ3NbaV07CisgICAgLy8gU2VlIGlmIHRoaXMgcmVnaXN0ZXIgaXMgYXZhaWxhYmxlLgorICAgIGlmICgoaXNPdXRSZWcgJiYgT3V0cHV0UmVncy5jb3VudChSZWcpKSB8fCAgIC8vIEFscmVhZHkgdXNlZC4KKyAgICAgICAgKGlzSW5SZWcgICYmIElucHV0UmVncy5jb3VudChSZWcpKSkgeyAgICAvLyBBbHJlYWR5IHVzZWQuCisgICAgICAvLyBNYWtlIHN1cmUgd2UgZmluZCBjb25zZWN1dGl2ZSByZWdpc3RlcnMuCisgICAgICBOdW1BbGxvY2F0ZWQgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgcmVnaXN0ZXIgaXMgYWxsb2NhdGFibGUgKGkuZS4gZG9uJ3QgZ2l2ZSBvdXQgdGhlCisgICAgLy8gc3RhY2sgcG9pbnRlcikuCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBpc0FsbG9jYXRhYmxlUmVnaXN0ZXIoUmVnLCBNRiwgVExJLCBUUkkpOworICAgIGlmICghUkMpIHsgICAgICAgIC8vIENvdWxkbid0IGFsbG9jYXRlIHRoaXMgcmVnaXN0ZXIuCisgICAgICAvLyBSZXNldCBOdW1BbGxvY2F0ZWQgdG8gbWFrZSBzdXJlIHdlIHJldHVybiBjb25zZWN1dGl2ZSByZWdpc3RlcnMuCisgICAgICBOdW1BbGxvY2F0ZWQgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gT2theSwgdGhpcyByZWdpc3RlciBpcyBnb29kLCB3ZSBjYW4gdXNlIGl0LgorICAgICsrTnVtQWxsb2NhdGVkOworCisgICAgLy8gSWYgd2UgYWxsb2NhdGVkIGVub3VnaCBjb25zZWN1dGl2ZSByZWdpc3RlcnMsIHN1Y2NlZWQuCisgICAgaWYgKE51bUFsbG9jYXRlZCA9PSBOdW1SZWdzKSB7CisgICAgICB1bnNpZ25lZCBSZWdTdGFydCA9IChpLU51bUFsbG9jYXRlZCkrMTsKKyAgICAgIHVuc2lnbmVkIFJlZ0VuZCAgID0gaSsxOworICAgICAgLy8gTWFyayBhbGwgb2YgdGhlIGFsbG9jYXRlZCByZWdpc3RlcnMgdXNlZC4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IFJlZ1N0YXJ0OyBpICE9IFJlZ0VuZDsgKytpKQorICAgICAgICBSZWdzLnB1c2hfYmFjayhSZWdDbGFzc1JlZ3NbaV0pOworCisgICAgICBPcEluZm8uQXNzaWduZWRSZWdzID0gUmVnc0ZvclZhbHVlKFJlZ3MsICpSQy0+dnRfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BJbmZvLkNvbnN0cmFpbnRWVCk7CisgICAgICBPcEluZm8uTWFya0FsbG9jYXRlZFJlZ3MoaXNPdXRSZWcsIGlzSW5SZWcsIE91dHB1dFJlZ3MsIElucHV0UmVncywgKlRSSSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBjb3VsZG4ndCBhbGxvY2F0ZSBlbm91Z2ggcmVnaXN0ZXJzIGZvciB0aGlzLgorfQorCisvLy8gVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbFRvIC0gVGhpcyBpcyB0aGUgZGVmYXVsdCBMb3dlckNhbGxUbworLy8vIGltcGxlbWVudGF0aW9uLCB3aGljaCBqdXN0IGNhbGxzIExvd2VyQ2FsbC4KKy8vLyBGSVhNRTogV2hlbiBhbGwgdGFyZ2V0cyBhcmUKKy8vLyBtaWdyYXRlZCB0byB1c2luZyBMb3dlckNhbGwsIHRoaXMgaG9vayBzaG91bGQgYmUgaW50ZWdyYXRlZCBpbnRvIFNESVNlbC4KK3N0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPgorVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbFRvKFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmV0U0V4dCwgYm9vbCBSZXRaRXh0LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbnJlZywgdW5zaWduZWQgTnVtRml4ZWRBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNSZXR1cm5WYWx1ZVVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdFR5ICZBcmdzLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCkgY29uc3QgeworICAvLyBIYW5kbGUgYWxsIG9mIHRoZSBvdXRnb2luZyBhcmd1bWVudHMuCisgIFNtYWxsVmVjdG9yPElTRDo6T3V0cHV0QXJnLCAzMj4gT3V0czsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMzI+IE91dFZhbHM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBTbWFsbFZlY3RvcjxFVlQsIDQ+IFZhbHVlVlRzOworICAgIENvbXB1dGVWYWx1ZVZUcygqdGhpcywgQXJnc1tpXS5UeSwgVmFsdWVWVHMpOworICAgIGZvciAodW5zaWduZWQgVmFsdWUgPSAwLCBOdW1WYWx1ZXMgPSBWYWx1ZVZUcy5zaXplKCk7CisgICAgICAgICBWYWx1ZSAhPSBOdW1WYWx1ZXM7ICsrVmFsdWUpIHsKKyAgICAgIEVWVCBWVCA9IFZhbHVlVlRzW1ZhbHVlXTsKKyAgICAgIGNvbnN0IFR5cGUgKkFyZ1R5ID0gVlQuZ2V0VHlwZUZvckVWVChSZXRUeS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgIFNEVmFsdWUgT3AgPSBTRFZhbHVlKEFyZ3NbaV0uTm9kZS5nZXROb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzW2ldLk5vZGUuZ2V0UmVzTm8oKSArIFZhbHVlKTsKKyAgICAgIElTRDo6QXJnRmxhZ3NUeSBGbGFnczsKKyAgICAgIHVuc2lnbmVkIE9yaWdpbmFsQWxpZ25tZW50ID0KKyAgICAgICAgZ2V0VGFyZ2V0RGF0YSgpLT5nZXRBQklUeXBlQWxpZ25tZW50KEFyZ1R5KTsKKworICAgICAgaWYgKEFyZ3NbaV0uaXNaRXh0KQorICAgICAgICBGbGFncy5zZXRaRXh0KCk7CisgICAgICBpZiAoQXJnc1tpXS5pc1NFeHQpCisgICAgICAgIEZsYWdzLnNldFNFeHQoKTsKKyAgICAgIGlmIChBcmdzW2ldLmlzSW5SZWcpCisgICAgICAgIEZsYWdzLnNldEluUmVnKCk7CisgICAgICBpZiAoQXJnc1tpXS5pc1NSZXQpCisgICAgICAgIEZsYWdzLnNldFNSZXQoKTsKKyAgICAgIGlmIChBcmdzW2ldLmlzQnlWYWwpIHsKKyAgICAgICAgRmxhZ3Muc2V0QnlWYWwoKTsKKyAgICAgICAgY29uc3QgUG9pbnRlclR5cGUgKlR5ID0gY2FzdDxQb2ludGVyVHlwZT4oQXJnc1tpXS5UeSk7CisgICAgICAgIGNvbnN0IFR5cGUgKkVsZW1lbnRUeSA9IFR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICB1bnNpZ25lZCBGcmFtZUFsaWduID0gZ2V0QnlWYWxUeXBlQWxpZ25tZW50KEVsZW1lbnRUeSk7CisgICAgICAgIHVuc2lnbmVkIEZyYW1lU2l6ZSAgPSBnZXRUYXJnZXREYXRhKCktPmdldFR5cGVBbGxvY1NpemUoRWxlbWVudFR5KTsKKyAgICAgICAgLy8gRm9yIEJ5VmFsLCBhbGlnbm1lbnQgc2hvdWxkIGNvbWUgZnJvbSBGRS4gIEJFIHdpbGwgZ3Vlc3MgaWYgdGhpcworICAgICAgICAvLyBpbmZvIGlzIG5vdCB0aGVyZSBidXQgdGhlcmUgYXJlIGNhc2VzIGl0IGNhbm5vdCBnZXQgcmlnaHQuCisgICAgICAgIGlmIChBcmdzW2ldLkFsaWdubWVudCkKKyAgICAgICAgICBGcmFtZUFsaWduID0gQXJnc1tpXS5BbGlnbm1lbnQ7CisgICAgICAgIEZsYWdzLnNldEJ5VmFsQWxpZ24oRnJhbWVBbGlnbik7CisgICAgICAgIEZsYWdzLnNldEJ5VmFsU2l6ZShGcmFtZVNpemUpOworICAgICAgfQorICAgICAgaWYgKEFyZ3NbaV0uaXNOZXN0KQorICAgICAgICBGbGFncy5zZXROZXN0KCk7CisgICAgICBGbGFncy5zZXRPcmlnQWxpZ24oT3JpZ2luYWxBbGlnbm1lbnQpOworCisgICAgICBFVlQgUGFydFZUID0gZ2V0UmVnaXN0ZXJUeXBlKFJldFR5LT5nZXRDb250ZXh0KCksIFZUKTsKKyAgICAgIHVuc2lnbmVkIE51bVBhcnRzID0gZ2V0TnVtUmVnaXN0ZXJzKFJldFR5LT5nZXRDb250ZXh0KCksIFZUKTsKKyAgICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDQ+IFBhcnRzKE51bVBhcnRzKTsKKyAgICAgIElTRDo6Tm9kZVR5cGUgRXh0ZW5kS2luZCA9IElTRDo6QU5ZX0VYVEVORDsKKworICAgICAgaWYgKEFyZ3NbaV0uaXNTRXh0KQorICAgICAgICBFeHRlbmRLaW5kID0gSVNEOjpTSUdOX0VYVEVORDsKKyAgICAgIGVsc2UgaWYgKEFyZ3NbaV0uaXNaRXh0KQorICAgICAgICBFeHRlbmRLaW5kID0gSVNEOjpaRVJPX0VYVEVORDsKKworICAgICAgZ2V0Q29weVRvUGFydHMoREFHLCBkbCwgT3AsICZQYXJ0c1swXSwgTnVtUGFydHMsCisgICAgICAgICAgICAgICAgICAgICBQYXJ0VlQsIEV4dGVuZEtpbmQpOworCisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IE51bVBhcnRzOyArK2opIHsKKyAgICAgICAgLy8gaWYgaXQgaXNuJ3QgZmlyc3QgcGllY2UsIGFsaWdubWVudCBtdXN0IGJlIDEKKyAgICAgICAgSVNEOjpPdXRwdXRBcmcgTXlGbGFncyhGbGFncywgUGFydHNbal0uZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA8IE51bUZpeGVkQXJncyk7CisgICAgICAgIGlmIChOdW1QYXJ0cyA+IDEgJiYgaiA9PSAwKQorICAgICAgICAgIE15RmxhZ3MuRmxhZ3Muc2V0U3BsaXQoKTsKKyAgICAgICAgZWxzZSBpZiAoaiAhPSAwKQorICAgICAgICAgIE15RmxhZ3MuRmxhZ3Muc2V0T3JpZ0FsaWduKDEpOworCisgICAgICAgIE91dHMucHVzaF9iYWNrKE15RmxhZ3MpOworICAgICAgICBPdXRWYWxzLnB1c2hfYmFjayhQYXJ0c1tqXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSGFuZGxlIHRoZSBpbmNvbWluZyByZXR1cm4gdmFsdWVzIGZyb20gdGhlIGNhbGwuCisgIFNtYWxsVmVjdG9yPElTRDo6SW5wdXRBcmcsIDMyPiBJbnM7CisgIFNtYWxsVmVjdG9yPEVWVCwgND4gUmV0VHlzOworICBDb21wdXRlVmFsdWVWVHMoKnRoaXMsIFJldFR5LCBSZXRUeXMpOworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gUmV0VHlzLnNpemUoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBFVlQgVlQgPSBSZXRUeXNbSV07CisgICAgRVZUIFJlZ2lzdGVyVlQgPSBnZXRSZWdpc3RlclR5cGUoUmV0VHktPmdldENvbnRleHQoKSwgVlQpOworICAgIHVuc2lnbmVkIE51bVJlZ3MgPSBnZXROdW1SZWdpc3RlcnMoUmV0VHktPmdldENvbnRleHQoKSwgVlQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUmVnczsgKytpKSB7CisgICAgICBJU0Q6OklucHV0QXJnIE15RmxhZ3M7CisgICAgICBNeUZsYWdzLlZUID0gUmVnaXN0ZXJWVDsKKyAgICAgIE15RmxhZ3MuVXNlZCA9IGlzUmV0dXJuVmFsdWVVc2VkOworICAgICAgaWYgKFJldFNFeHQpCisgICAgICAgIE15RmxhZ3MuRmxhZ3Muc2V0U0V4dCgpOworICAgICAgaWYgKFJldFpFeHQpCisgICAgICAgIE15RmxhZ3MuRmxhZ3Muc2V0WkV4dCgpOworICAgICAgaWYgKGlzSW5yZWcpCisgICAgICAgIE15RmxhZ3MuRmxhZ3Muc2V0SW5SZWcoKTsKKyAgICAgIElucy5wdXNoX2JhY2soTXlGbGFncyk7CisgICAgfQorICB9CisKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gSW5WYWxzOworICBDaGFpbiA9IExvd2VyQ2FsbChDaGFpbiwgQ2FsbGVlLCBDYWxsQ29udiwgaXNWYXJBcmcsIGlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgIE91dHMsIE91dFZhbHMsIElucywgZGwsIERBRywgSW5WYWxzKTsKKworICAvLyBWZXJpZnkgdGhhdCB0aGUgdGFyZ2V0J3MgTG93ZXJDYWxsIGJlaGF2ZWQgYXMgZXhwZWN0ZWQuCisgIGFzc2VydChDaGFpbi5nZXROb2RlKCkgJiYgQ2hhaW4uZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpPdGhlciAmJgorICAgICAgICAgIkxvd2VyQ2FsbCBkaWRuJ3QgcmV0dXJuIGEgdmFsaWQgY2hhaW4hIik7CisgIGFzc2VydCgoIWlzVGFpbENhbGwgfHwgSW5WYWxzLmVtcHR5KCkpICYmCisgICAgICAgICAiTG93ZXJDYWxsIGVtaXR0ZWQgYSByZXR1cm4gdmFsdWUgZm9yIGEgdGFpbCBjYWxsISIpOworICBhc3NlcnQoKGlzVGFpbENhbGwgfHwgSW5WYWxzLnNpemUoKSA9PSBJbnMuc2l6ZSgpKSAmJgorICAgICAgICAgIkxvd2VyQ2FsbCBkaWRuJ3QgZW1pdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdmFsdWVzISIpOworCisgIC8vIEZvciBhIHRhaWwgY2FsbCwgdGhlIHJldHVybiB2YWx1ZSBpcyBtZXJlbHkgbGl2ZS1vdXQgYW5kIHRoZXJlIGFyZW4ndAorICAvLyBhbnkgbm9kZXMgaW4gdGhlIERBRyByZXByZXNlbnRpbmcgaXQuIFJldHVybiBhIHNwZWNpYWwgdmFsdWUgdG8KKyAgLy8gaW5kaWNhdGUgdGhhdCBhIHRhaWwgY2FsbCBoYXMgYmVlbiBlbWl0dGVkIGFuZCBubyBtb3JlIEluc3RydWN0aW9ucworICAvLyBzaG91bGQgYmUgcHJvY2Vzc2VkIGluIHRoZSBjdXJyZW50IGJsb2NrLgorICBpZiAoaXNUYWlsQ2FsbCkgeworICAgIERBRy5zZXRSb290KENoYWluKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU0RWYWx1ZSgpLCBTRFZhbHVlKCkpOworICB9CisKKyAgREVCVUcoZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IElucy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgYXNzZXJ0KEluVmFsc1tpXS5nZXROb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgIkxvd2VyQ2FsbCBlbWl0dGVkIGEgbnVsbCB2YWx1ZSEiKTsKKyAgICAgICAgICBhc3NlcnQoSW5zW2ldLlZUID09IEluVmFsc1tpXS5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgICAgICAgICAiTG93ZXJDYWxsIGVtaXR0ZWQgYSB2YWx1ZSB3aXRoIHRoZSB3cm9uZyB0eXBlISIpOworICAgICAgICB9KTsKKworICAvLyBDb2xsZWN0IHRoZSBsZWdhbCB2YWx1ZSBwYXJ0cyBpbnRvIHBvdGVudGlhbGx5IGlsbGVnYWwgdmFsdWVzCisgIC8vIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgb3JpZ2luYWwgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWVzLgorICBJU0Q6Ok5vZGVUeXBlIEFzc2VydE9wID0gSVNEOjpERUxFVEVEX05PREU7CisgIGlmIChSZXRTRXh0KQorICAgIEFzc2VydE9wID0gSVNEOjpBc3NlcnRTZXh0OworICBlbHNlIGlmIChSZXRaRXh0KQorICAgIEFzc2VydE9wID0gSVNEOjpBc3NlcnRaZXh0OworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBSZXR1cm5WYWx1ZXM7CisgIHVuc2lnbmVkIEN1clJlZyA9IDA7CisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBSZXRUeXMuc2l6ZSgpOyBJICE9IEU7ICsrSSkgeworICAgIEVWVCBWVCA9IFJldFR5c1tJXTsKKyAgICBFVlQgUmVnaXN0ZXJWVCA9IGdldFJlZ2lzdGVyVHlwZShSZXRUeS0+Z2V0Q29udGV4dCgpLCBWVCk7CisgICAgdW5zaWduZWQgTnVtUmVncyA9IGdldE51bVJlZ2lzdGVycyhSZXRUeS0+Z2V0Q29udGV4dCgpLCBWVCk7CisKKyAgICBSZXR1cm5WYWx1ZXMucHVzaF9iYWNrKGdldENvcHlGcm9tUGFydHMoREFHLCBkbCwgJkluVmFsc1tDdXJSZWddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1SZWdzLCBSZWdpc3RlclZULCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0T3ApKTsKKyAgICBDdXJSZWcgKz0gTnVtUmVnczsKKyAgfQorCisgIC8vIEZvciBhIGZ1bmN0aW9uIHJldHVybmluZyB2b2lkLCB0aGVyZSBpcyBubyByZXR1cm4gdmFsdWUuIFdlIGNhbid0IGNyZWF0ZQorICAvLyBzdWNoIGEgbm9kZSwgc28gd2UganVzdCByZXR1cm4gYSBudWxsIHJldHVybiB2YWx1ZSBpbiB0aGF0IGNhc2UuIEluCisgIC8vIHRoYXQgY2FzZSwgbm90aGluZyB3aWxsIGFjdHVhbHkgbG9vayBhdCB0aGUgdmFsdWUuCisgIGlmIChSZXR1cm5WYWx1ZXMuZW1wdHkoKSkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU0RWYWx1ZSgpLCBDaGFpbik7CisKKyAgU0RWYWx1ZSBSZXMgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1FUkdFX1ZBTFVFUywgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZUTGlzdCgmUmV0VHlzWzBdLCBSZXRUeXMuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUmV0dXJuVmFsdWVzWzBdLCBSZXR1cm5WYWx1ZXMuc2l6ZSgpKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFJlcywgQ2hhaW4pOworfQorCit2b2lkIFRhcmdldExvd2VyaW5nOjpMb3dlck9wZXJhdGlvbldyYXBwZXIoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBTRFZhbHVlIFJlcyA9IExvd2VyT3BlcmF0aW9uKFNEVmFsdWUoTiwgMCksIERBRyk7CisgIGlmIChSZXMuZ2V0Tm9kZSgpKQorICAgIFJlc3VsdHMucHVzaF9iYWNrKFJlcyk7Cit9CisKK1NEVmFsdWUgVGFyZ2V0TG93ZXJpbmc6Okxvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIGxsdm1fdW5yZWFjaGFibGUoIkxvd2VyT3BlcmF0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0YXJnZXQhIik7CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK3ZvaWQKK1NlbGVjdGlvbkRBR0J1aWxkZXI6OkNvcHlWYWx1ZVRvVmlydHVhbFJlZ2lzdGVyKGNvbnN0IFZhbHVlICpWLCB1bnNpZ25lZCBSZWcpIHsKKyAgU0RWYWx1ZSBPcCA9IGdldE5vblJlZ2lzdGVyVmFsdWUoVik7CisgIGFzc2VydCgoT3AuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpDb3B5RnJvbVJlZyB8fAorICAgICAgICAgIGNhc3Q8UmVnaXN0ZXJTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpLT5nZXRSZWcoKSAhPSBSZWcpICYmCisgICAgICAgICAiQ29weSBmcm9tIGEgcmVnIHRvIHRoZSBzYW1lIHJlZyEiKTsKKyAgYXNzZXJ0KCFUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpICYmICJJcyBhIHBoeXNyZWciKTsKKworICBSZWdzRm9yVmFsdWUgUkZWKFYtPmdldENvbnRleHQoKSwgVExJLCBSZWcsIFYtPmdldFR5cGUoKSk7CisgIFNEVmFsdWUgQ2hhaW4gPSBEQUcuZ2V0RW50cnlOb2RlKCk7CisgIFJGVi5nZXRDb3B5VG9SZWdzKE9wLCBEQUcsIGdldEN1ckRlYnVnTG9jKCksIENoYWluLCAwKTsKKyAgUGVuZGluZ0V4cG9ydHMucHVzaF9iYWNrKENoYWluKTsKK30KKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisKK3ZvaWQgU2VsZWN0aW9uREFHSVNlbDo6TG93ZXJBcmd1bWVudHMoY29uc3QgQmFzaWNCbG9jayAqTExWTUJCKSB7CisgIC8vIElmIHRoaXMgaXMgdGhlIGVudHJ5IGJsb2NrLCBlbWl0IGFyZ3VtZW50cy4KKyAgY29uc3QgRnVuY3Rpb24gJkYgPSAqTExWTUJCLT5nZXRQYXJlbnQoKTsKKyAgU2VsZWN0aW9uREFHICZEQUcgPSBTREItPkRBRzsKKyAgRGVidWdMb2MgZGwgPSBTREItPmdldEN1ckRlYnVnTG9jKCk7CisgIGNvbnN0IFRhcmdldERhdGEgKlREID0gVExJLmdldFRhcmdldERhdGEoKTsKKyAgU21hbGxWZWN0b3I8SVNEOjpJbnB1dEFyZywgMTY+IEluczsKKworICAvLyBDaGVjayB3aGV0aGVyIHRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIHdpdGhvdXQgc3JldC1kZW1vdGlvbi4KKyAgU21hbGxWZWN0b3I8SVNEOjpPdXRwdXRBcmcsIDQ+IE91dHM7CisgIEdldFJldHVybkluZm8oRi5nZXRSZXR1cm5UeXBlKCksIEYuZ2V0QXR0cmlidXRlcygpLmdldFJldEF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICBPdXRzLCBUTEkpOworCisgIGlmICghRnVuY0luZm8tPkNhbkxvd2VyUmV0dXJuKSB7CisgICAgLy8gUHV0IGluIGFuIHNyZXQgcG9pbnRlciBwYXJhbWV0ZXIgYmVmb3JlIGFsbCB0aGUgb3RoZXIgcGFyYW1ldGVycy4KKyAgICBTbWFsbFZlY3RvcjxFVlQsIDE+IFZhbHVlVlRzOworICAgIENvbXB1dGVWYWx1ZVZUcyhUTEksIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoRi5nZXRSZXR1cm5UeXBlKCkpLCBWYWx1ZVZUcyk7CisKKyAgICAvLyBOT1RFOiBBc3N1bWluZyB0aGF0IGEgcG9pbnRlciB3aWxsIG5ldmVyIGJyZWFrIGRvd24gdG8gbW9yZSB0aGFuIG9uZSBWVAorICAgIC8vIG9yIG9uZSByZWdpc3Rlci4KKyAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3M7CisgICAgRmxhZ3Muc2V0U1JldCgpOworICAgIEVWVCBSZWdpc3RlclZUID0gVExJLmdldFJlZ2lzdGVyVHlwZSgqREFHLmdldENvbnRleHQoKSwgVmFsdWVWVHNbMF0pOworICAgIElTRDo6SW5wdXRBcmcgUmV0QXJnKEZsYWdzLCBSZWdpc3RlclZULCB0cnVlKTsKKyAgICBJbnMucHVzaF9iYWNrKFJldEFyZyk7CisgIH0KKworICAvLyBTZXQgdXAgdGhlIGluY29taW5nIGFyZ3VtZW50IGRlc2NyaXB0aW9uIHZlY3Rvci4KKyAgdW5zaWduZWQgSWR4ID0gMTsKKyAgZm9yIChGdW5jdGlvbjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEkgPSBGLmFyZ19iZWdpbigpLCBFID0gRi5hcmdfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0ksICsrSWR4KSB7CisgICAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWx1ZVZUczsKKyAgICBDb21wdXRlVmFsdWVWVHMoVExJLCBJLT5nZXRUeXBlKCksIFZhbHVlVlRzKTsKKyAgICBib29sIGlzQXJnVmFsdWVVc2VkID0gIUktPnVzZV9lbXB0eSgpOworICAgIGZvciAodW5zaWduZWQgVmFsdWUgPSAwLCBOdW1WYWx1ZXMgPSBWYWx1ZVZUcy5zaXplKCk7CisgICAgICAgICBWYWx1ZSAhPSBOdW1WYWx1ZXM7ICsrVmFsdWUpIHsKKyAgICAgIEVWVCBWVCA9IFZhbHVlVlRzW1ZhbHVlXTsKKyAgICAgIGNvbnN0IFR5cGUgKkFyZ1R5ID0gVlQuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSk7CisgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3M7CisgICAgICB1bnNpZ25lZCBPcmlnaW5hbEFsaWdubWVudCA9CisgICAgICAgIFRELT5nZXRBQklUeXBlQWxpZ25tZW50KEFyZ1R5KTsKKworICAgICAgaWYgKEYucGFyYW1IYXNBdHRyKElkeCwgQXR0cmlidXRlOjpaRXh0KSkKKyAgICAgICAgRmxhZ3Muc2V0WkV4dCgpOworICAgICAgaWYgKEYucGFyYW1IYXNBdHRyKElkeCwgQXR0cmlidXRlOjpTRXh0KSkKKyAgICAgICAgRmxhZ3Muc2V0U0V4dCgpOworICAgICAgaWYgKEYucGFyYW1IYXNBdHRyKElkeCwgQXR0cmlidXRlOjpJblJlZykpCisgICAgICAgIEZsYWdzLnNldEluUmVnKCk7CisgICAgICBpZiAoRi5wYXJhbUhhc0F0dHIoSWR4LCBBdHRyaWJ1dGU6OlN0cnVjdFJldCkpCisgICAgICAgIEZsYWdzLnNldFNSZXQoKTsKKyAgICAgIGlmIChGLnBhcmFtSGFzQXR0cihJZHgsIEF0dHJpYnV0ZTo6QnlWYWwpKSB7CisgICAgICAgIEZsYWdzLnNldEJ5VmFsKCk7CisgICAgICAgIGNvbnN0IFBvaW50ZXJUeXBlICpUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KEktPmdldFR5cGUoKSk7CisgICAgICAgIGNvbnN0IFR5cGUgKkVsZW1lbnRUeSA9IFR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICB1bnNpZ25lZCBGcmFtZUFsaWduID0gVExJLmdldEJ5VmFsVHlwZUFsaWdubWVudChFbGVtZW50VHkpOworICAgICAgICB1bnNpZ25lZCBGcmFtZVNpemUgID0gVEQtPmdldFR5cGVBbGxvY1NpemUoRWxlbWVudFR5KTsKKyAgICAgICAgLy8gRm9yIEJ5VmFsLCBhbGlnbm1lbnQgc2hvdWxkIGJlIHBhc3NlZCBmcm9tIEZFLiAgQkUgd2lsbCBndWVzcyBpZgorICAgICAgICAvLyB0aGlzIGluZm8gaXMgbm90IHRoZXJlIGJ1dCB0aGVyZSBhcmUgY2FzZXMgaXQgY2Fubm90IGdldCByaWdodC4KKyAgICAgICAgaWYgKEYuZ2V0UGFyYW1BbGlnbm1lbnQoSWR4KSkKKyAgICAgICAgICBGcmFtZUFsaWduID0gRi5nZXRQYXJhbUFsaWdubWVudChJZHgpOworICAgICAgICBGbGFncy5zZXRCeVZhbEFsaWduKEZyYW1lQWxpZ24pOworICAgICAgICBGbGFncy5zZXRCeVZhbFNpemUoRnJhbWVTaXplKTsKKyAgICAgIH0KKyAgICAgIGlmIChGLnBhcmFtSGFzQXR0cihJZHgsIEF0dHJpYnV0ZTo6TmVzdCkpCisgICAgICAgIEZsYWdzLnNldE5lc3QoKTsKKyAgICAgIEZsYWdzLnNldE9yaWdBbGlnbihPcmlnaW5hbEFsaWdubWVudCk7CisKKyAgICAgIEVWVCBSZWdpc3RlclZUID0gVExJLmdldFJlZ2lzdGVyVHlwZSgqQ3VyREFHLT5nZXRDb250ZXh0KCksIFZUKTsKKyAgICAgIHVuc2lnbmVkIE51bVJlZ3MgPSBUTEkuZ2V0TnVtUmVnaXN0ZXJzKCpDdXJEQUctPmdldENvbnRleHQoKSwgVlQpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1SZWdzOyArK2kpIHsKKyAgICAgICAgSVNEOjpJbnB1dEFyZyBNeUZsYWdzKEZsYWdzLCBSZWdpc3RlclZULCBpc0FyZ1ZhbHVlVXNlZCk7CisgICAgICAgIGlmIChOdW1SZWdzID4gMSAmJiBpID09IDApCisgICAgICAgICAgTXlGbGFncy5GbGFncy5zZXRTcGxpdCgpOworICAgICAgICAvLyBpZiBpdCBpc24ndCBmaXJzdCBwaWVjZSwgYWxpZ25tZW50IG11c3QgYmUgMQorICAgICAgICBlbHNlIGlmIChpID4gMCkKKyAgICAgICAgICBNeUZsYWdzLkZsYWdzLnNldE9yaWdBbGlnbigxKTsKKyAgICAgICAgSW5zLnB1c2hfYmFjayhNeUZsYWdzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDYWxsIHRoZSB0YXJnZXQgdG8gc2V0IHVwIHRoZSBhcmd1bWVudCB2YWx1ZXMuCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IEluVmFsczsKKyAgU0RWYWx1ZSBOZXdSb290ID0gVExJLkxvd2VyRm9ybWFsQXJndW1lbnRzKERBRy5nZXRSb290KCksIEYuZ2V0Q2FsbGluZ0NvbnYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYuaXNWYXJBcmcoKSwgSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIERBRywgSW5WYWxzKTsKKworICAvLyBWZXJpZnkgdGhhdCB0aGUgdGFyZ2V0J3MgTG93ZXJGb3JtYWxBcmd1bWVudHMgYmVoYXZlZCBhcyBleHBlY3RlZC4KKyAgYXNzZXJ0KE5ld1Jvb3QuZ2V0Tm9kZSgpICYmIE5ld1Jvb3QuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpPdGhlciAmJgorICAgICAgICAgIkxvd2VyRm9ybWFsQXJndW1lbnRzIGRpZG4ndCByZXR1cm4gYSB2YWxpZCBjaGFpbiEiKTsKKyAgYXNzZXJ0KEluVmFscy5zaXplKCkgPT0gSW5zLnNpemUoKSAmJgorICAgICAgICAgIkxvd2VyRm9ybWFsQXJndW1lbnRzIGRpZG4ndCBlbWl0IHRoZSBjb3JyZWN0IG51bWJlciBvZiB2YWx1ZXMhIik7CisgIERFQlVHKHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBhc3NlcnQoSW5WYWxzW2ldLmdldE5vZGUoKSAmJgorICAgICAgICAgICAgICAgIkxvd2VyRm9ybWFsQXJndW1lbnRzIGVtaXR0ZWQgYSBudWxsIHZhbHVlISIpOworICAgICAgICBhc3NlcnQoSW5zW2ldLlZUID09IEluVmFsc1tpXS5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgICAgICAgIkxvd2VyRm9ybWFsQXJndW1lbnRzIGVtaXR0ZWQgYSB2YWx1ZSB3aXRoIHRoZSB3cm9uZyB0eXBlISIpOworICAgICAgfQorICAgIH0pOworCisgIC8vIFVwZGF0ZSB0aGUgREFHIHdpdGggdGhlIG5ldyBjaGFpbiB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhcmd1bWVudCBsb3dlcmluZy4KKyAgREFHLnNldFJvb3QoTmV3Um9vdCk7CisKKyAgLy8gU2V0IHVwIHRoZSBhcmd1bWVudCB2YWx1ZXMuCisgIHVuc2lnbmVkIGkgPSAwOworICBJZHggPSAxOworICBpZiAoIUZ1bmNJbmZvLT5DYW5Mb3dlclJldHVybikgeworICAgIC8vIENyZWF0ZSBhIHZpcnR1YWwgcmVnaXN0ZXIgZm9yIHRoZSBzcmV0IHBvaW50ZXIsIGFuZCBwdXQgaW4gYSBjb3B5CisgICAgLy8gZnJvbSB0aGUgc3JldCBhcmd1bWVudCBpbnRvIGl0LgorICAgIFNtYWxsVmVjdG9yPEVWVCwgMT4gVmFsdWVWVHM7CisgICAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgUG9pbnRlclR5cGU6OmdldFVucXVhbChGLmdldFJldHVyblR5cGUoKSksIFZhbHVlVlRzKTsKKyAgICBFVlQgVlQgPSBWYWx1ZVZUc1swXTsKKyAgICBFVlQgUmVnVlQgPSBUTEkuZ2V0UmVnaXN0ZXJUeXBlKCpDdXJEQUctPmdldENvbnRleHQoKSwgVlQpOworICAgIElTRDo6Tm9kZVR5cGUgQXNzZXJ0T3AgPSBJU0Q6OkRFTEVURURfTk9ERTsKKyAgICBTRFZhbHVlIEFyZ1ZhbHVlID0gZ2V0Q29weUZyb21QYXJ0cyhEQUcsIGRsLCAmSW5WYWxzWzBdLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1ZULCBWVCwgQXNzZXJ0T3ApOworCisgICAgTWFjaGluZUZ1bmN0aW9uJiBNRiA9IFNEQi0+REFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8mIFJlZ0luZm8gPSBNRi5nZXRSZWdJbmZvKCk7CisgICAgdW5zaWduZWQgU1JldFJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFRMSS5nZXRSZWdDbGFzc0ZvcihSZWdWVCkpOworICAgIEZ1bmNJbmZvLT5EZW1vdGVSZWdpc3RlciA9IFNSZXRSZWc7CisgICAgTmV3Um9vdCA9IFNEQi0+REFHLmdldENvcHlUb1JlZyhOZXdSb290LCBTREItPmdldEN1ckRlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUmV0UmVnLCBBcmdWYWx1ZSk7CisgICAgREFHLnNldFJvb3QoTmV3Um9vdCk7CisKKyAgICAvLyBpIGluZGV4ZXMgbG93ZXJlZCBhcmd1bWVudHMuICBCdW1wIGl0IHBhc3QgdGhlIGhpZGRlbiBzcmV0IGFyZ3VtZW50LgorICAgIC8vIElkeCBpbmRleGVzIExMVk0gYXJndW1lbnRzLiAgRG9uJ3QgdG91Y2ggaXQuCisgICAgKytpOworICB9CisKKyAgZm9yIChGdW5jdGlvbjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEkgPSBGLmFyZ19iZWdpbigpLCBFID0gRi5hcmdfZW5kKCk7IEkgIT0gRTsKKyAgICAgICsrSSwgKytJZHgpIHsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBBcmdWYWx1ZXM7CisgICAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWx1ZVZUczsKKyAgICBDb21wdXRlVmFsdWVWVHMoVExJLCBJLT5nZXRUeXBlKCksIFZhbHVlVlRzKTsKKyAgICB1bnNpZ25lZCBOdW1WYWx1ZXMgPSBWYWx1ZVZUcy5zaXplKCk7CisKKyAgICAvLyBJZiB0aGlzIGFyZ3VtZW50IGlzIHVudXNlZCB0aGVuIHJlbWVtYmVyIGl0cyB2YWx1ZS4gSXQgaXMgdXNlZCB0byBnZW5lcmF0ZQorICAgIC8vIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAgICBpZiAoSS0+dXNlX2VtcHR5KCkgJiYgTnVtVmFsdWVzKQorICAgICAgU0RCLT5zZXRVbnVzZWRBcmdWYWx1ZShJLCBJblZhbHNbaV0pOworCisgICAgZm9yICh1bnNpZ25lZCBWYWx1ZSA9IDA7IFZhbHVlICE9IE51bVZhbHVlczsgKytWYWx1ZSkgeworICAgICAgRVZUIFZUID0gVmFsdWVWVHNbVmFsdWVdOworICAgICAgRVZUIFBhcnRWVCA9IFRMSS5nZXRSZWdpc3RlclR5cGUoKkN1ckRBRy0+Z2V0Q29udGV4dCgpLCBWVCk7CisgICAgICB1bnNpZ25lZCBOdW1QYXJ0cyA9IFRMSS5nZXROdW1SZWdpc3RlcnMoKkN1ckRBRy0+Z2V0Q29udGV4dCgpLCBWVCk7CisKKyAgICAgIGlmICghSS0+dXNlX2VtcHR5KCkpIHsKKyAgICAgICAgSVNEOjpOb2RlVHlwZSBBc3NlcnRPcCA9IElTRDo6REVMRVRFRF9OT0RFOworICAgICAgICBpZiAoRi5wYXJhbUhhc0F0dHIoSWR4LCBBdHRyaWJ1dGU6OlNFeHQpKQorICAgICAgICAgIEFzc2VydE9wID0gSVNEOjpBc3NlcnRTZXh0OworICAgICAgICBlbHNlIGlmIChGLnBhcmFtSGFzQXR0cihJZHgsIEF0dHJpYnV0ZTo6WkV4dCkpCisgICAgICAgICAgQXNzZXJ0T3AgPSBJU0Q6OkFzc2VydFpleHQ7CisKKyAgICAgICAgQXJnVmFsdWVzLnB1c2hfYmFjayhnZXRDb3B5RnJvbVBhcnRzKERBRywgZGwsICZJblZhbHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1QYXJ0cywgUGFydFZULCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydE9wKSk7CisgICAgICB9CisKKyAgICAgIGkgKz0gTnVtUGFydHM7CisgICAgfQorCisgICAgaWYgKCFJLT51c2VfZW1wdHkoKSkgeworICAgICAgU0RWYWx1ZSBSZXM7CisgICAgICBpZiAoIUFyZ1ZhbHVlcy5lbXB0eSgpKQorICAgICAgICBSZXMgPSBEQUcuZ2V0TWVyZ2VWYWx1ZXMoJkFyZ1ZhbHVlc1swXSwgTnVtVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RCLT5nZXRDdXJEZWJ1Z0xvYygpKTsKKyAgICAgIFNEQi0+c2V0VmFsdWUoSSwgUmVzKTsKKworICAgICAgLy8gSWYgdGhpcyBhcmd1bWVudCBpcyBsaXZlIG91dHNpZGUgb2YgdGhlIGVudHJ5IGJsb2NrLCBpbnNlcnQgYSBjb3B5IGZyb20KKyAgICAgIC8vIHdoZXJlZXZlciB3ZSBnb3QgaXQgdG8gdGhlIHZyZWcgdGhhdCBvdGhlciBCQidzIHdpbGwgcmVmZXJlbmNlIGl0IGFzLgorICAgICAgU0RCLT5Db3B5VG9FeHBvcnRSZWdzSWZOZWVkZWQoSSk7CisgICAgfQorICB9CisKKyAgYXNzZXJ0KGkgPT0gSW5WYWxzLnNpemUoKSAmJiAiQXJndW1lbnQgcmVnaXN0ZXIgY291bnQgbWlzbWF0Y2ghIik7CisKKyAgLy8gRmluYWxseSwgaWYgdGhlIHRhcmdldCBoYXMgYW55dGhpbmcgc3BlY2lhbCB0byBkbywgYWxsb3cgaXQgdG8gZG8gc28uCisgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBpbnNlcnQgY29kZSBpbnRvIHRoZSBEQUchCisgIEVtaXRGdW5jdGlvbkVudHJ5Q29kZSgpOworfQorCisvLy8gSGFuZGxlIFBISSBub2RlcyBpbiBzdWNjZXNzb3IgYmxvY2tzLiAgRW1pdCBjb2RlIGludG8gdGhlIFNlbGVjdGlvbkRBRyB0bworLy8vIGVuc3VyZSBjb25zdGFudHMgYXJlIGdlbmVyYXRlZCB3aGVuIG5lZWRlZC4gIFJlbWVtYmVyIHRoZSB2aXJ0dWFsIHJlZ2lzdGVycworLy8vIHRoYXQgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgTWFjaGluZSBQSEkgbm9kZXMgYXMgaW5wdXQuICBXZSBjYW5ub3QganVzdAorLy8vIGRpcmVjdGx5IGFkZCB0aGVtLCBiZWNhdXNlIGV4cGFuc2lvbiBtaWdodCByZXN1bHQgaW4gbXVsdGlwbGUgTUJCJ3MgZm9yIG9uZQorLy8vIEJCLiAgQXMgc3VjaCwgdGhlIHN0YXJ0IG9mIHRoZSBCQiBtaWdodCBjb3JyZXNwb25kIHRvIGEgZGlmZmVyZW50IE1CQiB0aGFuCisvLy8gdGhlIGVuZC4KKy8vLwordm9pZAorU2VsZWN0aW9uREFHQnVpbGRlcjo6SGFuZGxlUEhJTm9kZXNJblN1Y2Nlc3NvckJsb2Nrcyhjb25zdCBCYXNpY0Jsb2NrICpMTFZNQkIpIHsKKyAgY29uc3QgVGVybWluYXRvckluc3QgKlRJID0gTExWTUJCLT5nZXRUZXJtaW5hdG9yKCk7CisKKyAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sgKiwgND4gU3VjY3NIYW5kbGVkOworCisgIC8vIENoZWNrIHN1Y2Nlc3NvciBub2RlcycgUEhJIG5vZGVzIHRoYXQgZXhwZWN0IGEgY29uc3RhbnQgdG8gYmUgYXZhaWxhYmxlCisgIC8vIGZyb20gdGhpcyBibG9jay4KKyAgZm9yICh1bnNpZ25lZCBzdWNjID0gMCwgZSA9IFRJLT5nZXROdW1TdWNjZXNzb3JzKCk7IHN1Y2MgIT0gZTsgKytzdWNjKSB7CisgICAgY29uc3QgQmFzaWNCbG9jayAqU3VjY0JCID0gVEktPmdldFN1Y2Nlc3NvcihzdWNjKTsKKyAgICBpZiAoIWlzYTxQSElOb2RlPihTdWNjQkItPmJlZ2luKCkpKSBjb250aW51ZTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY01CQiA9IEZ1bmNJbmZvLk1CQk1hcFtTdWNjQkJdOworCisgICAgLy8gSWYgdGhpcyB0ZXJtaW5hdG9yIGhhcyBtdWx0aXBsZSBpZGVudGljYWwgc3VjY2Vzc29ycyAoY29tbW9uIGZvcgorICAgIC8vIHN3aXRjaGVzKSwgb25seSBoYW5kbGUgZWFjaCBzdWNjIG9uY2UuCisgICAgaWYgKCFTdWNjc0hhbmRsZWQuaW5zZXJ0KFN1Y2NNQkIpKSBjb250aW51ZTsKKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gU3VjY01CQi0+YmVnaW4oKTsKKworICAgIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHRoZXJlIGlzIGEgMS0xIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gTExWTSBQSEkKKyAgICAvLyBub2RlcyBhbmQgTWFjaGluZSBQSEkgbm9kZXMsIGJ1dCB0aGUgaW5jb21pbmcgb3BlcmFuZHMgaGF2ZSBub3QgYmVlbgorICAgIC8vIGVtaXR0ZWQgeWV0LgorICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IFN1Y2NCQi0+YmVnaW4oKTsKKyAgICAgICAgIGNvbnN0IFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSSk7ICsrSSkgeworICAgICAgLy8gSWdub3JlIGRlYWQgcGhpJ3MuCisgICAgICBpZiAoUE4tPnVzZV9lbXB0eSgpKSBjb250aW51ZTsKKworICAgICAgdW5zaWduZWQgUmVnOworICAgICAgY29uc3QgVmFsdWUgKlBISU9wID0gUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhMTFZNQkIpOworCisgICAgICBpZiAoY29uc3QgQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUEhJT3ApKSB7CisgICAgICAgIHVuc2lnbmVkICZSZWdPdXQgPSBDb25zdGFudHNPdXRbQ107CisgICAgICAgIGlmIChSZWdPdXQgPT0gMCkgeworICAgICAgICAgIFJlZ091dCA9IEZ1bmNJbmZvLkNyZWF0ZVJlZ3MoQy0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICBDb3B5VmFsdWVUb1ZpcnR1YWxSZWdpc3RlcihDLCBSZWdPdXQpOworICAgICAgICB9CisgICAgICAgIFJlZyA9IFJlZ091dDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIHVuc2lnbmVkPjo6aXRlcmF0b3IgSSA9CisgICAgICAgICAgRnVuY0luZm8uVmFsdWVNYXAuZmluZChQSElPcCk7CisgICAgICAgIGlmIChJICE9IEZ1bmNJbmZvLlZhbHVlTWFwLmVuZCgpKQorICAgICAgICAgIFJlZyA9IEktPnNlY29uZDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgYXNzZXJ0KGlzYTxBbGxvY2FJbnN0PihQSElPcCkgJiYKKyAgICAgICAgICAgICAgICAgRnVuY0luZm8uU3RhdGljQWxsb2NhTWFwLmNvdW50KGNhc3Q8QWxsb2NhSW5zdD4oUEhJT3ApKSAmJgorICAgICAgICAgICAgICAgICAiRGlkbid0IGNvZGVnZW4gdmFsdWUgaW50byBhIHJlZ2lzdGVyIT8/Iik7CisgICAgICAgICAgUmVnID0gRnVuY0luZm8uQ3JlYXRlUmVncyhQSElPcC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICBDb3B5VmFsdWVUb1ZpcnR1YWxSZWdpc3RlcihQSElPcCwgUmVnKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBSZW1lbWJlciB0aGF0IHRoaXMgcmVnaXN0ZXIgbmVlZHMgdG8gYWRkZWQgdG8gdGhlIG1hY2hpbmUgUEhJIG5vZGUgYXMKKyAgICAgIC8vIHRoZSBpbnB1dCBmb3IgdGhpcyBNQkIuCisgICAgICBTbWFsbFZlY3RvcjxFVlQsIDQ+IFZhbHVlVlRzOworICAgICAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgUE4tPmdldFR5cGUoKSwgVmFsdWVWVHMpOworICAgICAgZm9yICh1bnNpZ25lZCB2dGkgPSAwLCB2dGUgPSBWYWx1ZVZUcy5zaXplKCk7IHZ0aSAhPSB2dGU7ICsrdnRpKSB7CisgICAgICAgIEVWVCBWVCA9IFZhbHVlVlRzW3Z0aV07CisgICAgICAgIHVuc2lnbmVkIE51bVJlZ2lzdGVycyA9IFRMSS5nZXROdW1SZWdpc3RlcnMoKkRBRy5nZXRDb250ZXh0KCksIFZUKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE51bVJlZ2lzdGVyczsgaSAhPSBlOyArK2kpCisgICAgICAgICAgRnVuY0luZm8uUEhJTm9kZXNUb1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTUJCSSsrLCBSZWcraSkpOworICAgICAgICBSZWcgKz0gTnVtUmVnaXN0ZXJzOworICAgICAgfQorICAgIH0KKyAgfQorICBDb25zdGFudHNPdXQuY2xlYXIoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9TZWxlY3Rpb25EQUdCdWlsZGVyLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2VsZWN0aW9uREFHQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDdlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2VsZWN0aW9uREFHQnVpbGRlci5oCkBAIC0wLDAgKzEsNDk1IEBACisvLz09PS0tIFNlbGVjdGlvbkRBR0J1aWxkZXIuaCAtIFNlbGVjdGlvbi1EQUcgYnVpbGRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaW1wbGVtZW50cyByb3V0aW5lcyBmb3IgdHJhbnNsYXRpbmcgZnJvbSBMTFZNIElSIGludG8gU2VsZWN0aW9uREFHIElSLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU0VMRUNUSU9OREFHQlVJTERFUl9ICisjZGVmaW5lIFNFTEVDVElPTkRBR0JVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2VuZGlmCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxpYXNBbmFseXNpczsKK2NsYXNzIEFsbG9jYUluc3Q7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQml0Q2FzdEluc3Q7CitjbGFzcyBCcmFuY2hJbnN0OworY2xhc3MgQ2FsbEluc3Q7CitjbGFzcyBFeHRyYWN0RWxlbWVudEluc3Q7CitjbGFzcyBFeHRyYWN0VmFsdWVJbnN0OworY2xhc3MgRkNtcEluc3Q7CitjbGFzcyBGUEV4dEluc3Q7CitjbGFzcyBGUFRvU0lJbnN0OworY2xhc3MgRlBUb1VJSW5zdDsKK2NsYXNzIEZQVHJ1bmNJbnN0OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBGdW5jdGlvbkxvd2VyaW5nSW5mbzsKK2NsYXNzIEdldEVsZW1lbnRQdHJJbnN0OworY2xhc3MgSUNtcEluc3Q7CitjbGFzcyBJbnRUb1B0ckluc3Q7CitjbGFzcyBJbmRpcmVjdEJySW5zdDsKK2NsYXNzIEluc2VydEVsZW1lbnRJbnN0OworY2xhc3MgSW5zZXJ0VmFsdWVJbnN0OworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMb2FkSW5zdDsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIFBISU5vZGU7CitjbGFzcyBQdHJUb0ludEluc3Q7CitjbGFzcyBSZXR1cm5JbnN0OworY2xhc3MgU0RJU2VsQXNtT3BlcmFuZEluZm87CitjbGFzcyBTRERiZ1ZhbHVlOworY2xhc3MgU0V4dEluc3Q7CitjbGFzcyBTZWxlY3RJbnN0OworY2xhc3MgU2h1ZmZsZVZlY3Rvckluc3Q7CitjbGFzcyBTSVRvRlBJbnN0OworY2xhc3MgU3RvcmVJbnN0OworY2xhc3MgU3dpdGNoSW5zdDsKK2NsYXNzIFRhcmdldERhdGE7CitjbGFzcyBUYXJnZXRMb3dlcmluZzsKK2NsYXNzIFRydW5jSW5zdDsKK2NsYXNzIFVJVG9GUEluc3Q7CitjbGFzcyBVbnJlYWNoYWJsZUluc3Q7CitjbGFzcyBWQUFyZ0luc3Q7CitjbGFzcyBaRXh0SW5zdDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBTZWxlY3Rpb25EQUdCdWlsZGVyIC0gVGhpcyBpcyB0aGUgY29tbW9uIHRhcmdldC1pbmRlcGVuZGVudCBsb3dlcmluZworLy8vIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgcGFyYW1ldGVyaXplZCBieSBhIFRhcmdldExvd2VyaW5nIG9iamVjdC4KKy8vLworY2xhc3MgU2VsZWN0aW9uREFHQnVpbGRlciB7CisgIC8vLyBDdXJEZWJ1Z0xvYyAtIGN1cnJlbnQgZmlsZSArIGxpbmUgbnVtYmVyLiAgQ2hhbmdlcyBhcyB3ZSBidWlsZCB0aGUgREFHLgorICBEZWJ1Z0xvYyBDdXJEZWJ1Z0xvYzsKKworICBEZW5zZU1hcDxjb25zdCBWYWx1ZSosIFNEVmFsdWU+IE5vZGVNYXA7CisgIAorICAvLy8gVW51c2VkQXJnTm9kZU1hcCAtIE1hcHMgYXJndW1lbnQgdmFsdWUgZm9yIHVudXNlZCBhcmd1bWVudHMuIFRoaXMgaXMgdXNlZAorICAvLy8gdG8gcHJlc2VydmUgZGVidWcgaW5mb3JtYXRpb24gZm9yIGluY29taW5nIGFyZ3VtZW50cy4KKyAgRGVuc2VNYXA8Y29uc3QgVmFsdWUqLCBTRFZhbHVlPiBVbnVzZWRBcmdOb2RlTWFwOworCitwdWJsaWM6CisgIC8vLyBQZW5kaW5nTG9hZHMgLSBMb2FkcyBhcmUgbm90IGVtaXR0ZWQgdG8gdGhlIHByb2dyYW0gaW1tZWRpYXRlbHkuICBXZSBidW5jaAorICAvLy8gdGhlbSB1cCBhbmQgdGhlbiBlbWl0IHRva2VuIGZhY3RvciBub2RlcyB3aGVuIHBvc3NpYmxlLiAgVGhpcyBhbGxvd3MgdXMgdG8KKyAgLy8vIGdldCBzaW1wbGUgZGlzYW1iaWd1YXRpb24gYmV0d2VlbiBsb2FkcyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGFsaWFzCisgIC8vLyBhbmFseXNpcy4KKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gUGVuZGluZ0xvYWRzOworcHJpdmF0ZToKKworICAvLy8gUGVuZGluZ0V4cG9ydHMgLSBDb3B5VG9SZWcgbm9kZXMgdGhhdCBjb3B5IHZhbHVlcyB0byB2aXJ0dWFsIHJlZ2lzdGVycworICAvLy8gZm9yIGV4cG9ydCB0byBvdGhlciBibG9ja3MgbmVlZCB0byBiZSBlbWl0dGVkIGJlZm9yZSBhbnkgdGVybWluYXRvcgorICAvLy8gaW5zdHJ1Y3Rpb24sIGJ1dCB0aGV5IGhhdmUgbm8gb3RoZXIgb3JkZXJpbmcgcmVxdWlyZW1lbnRzLiBXZSBidW5jaCB0aGVtCisgIC8vLyB1cCBhbmQgdGhlIGVtaXQgYSBzaW5nbGUgdG9rZW5mYWN0b3IgZm9yIHRoZW0ganVzdCBiZWZvcmUgdGVybWluYXRvcgorICAvLy8gaW5zdHJ1Y3Rpb25zLgorICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBQZW5kaW5nRXhwb3J0czsKKworICAvLy8gU0ROb2RlT3JkZXIgLSBBIHVuaXF1ZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgbnVtYmVyIHVzZWQgdG8gb3JkZXIgdGhlCisgIC8vLyBTRE5vZGVzIHdlIGNyZWF0ZS4KKyAgdW5zaWduZWQgU0ROb2RlT3JkZXI7CisKKyAgLy8vIENhc2UgLSBBIHN0cnVjdCB0byByZWNvcmQgdGhlIFZhbHVlIGZvciBhIHN3aXRjaCBjYXNlLCBhbmQgdGhlCisgIC8vLyBjYXNlJ3MgdGFyZ2V0IGJhc2ljIGJsb2NrLgorICBzdHJ1Y3QgQ2FzZSB7CisgICAgQ29uc3RhbnQqIExvdzsKKyAgICBDb25zdGFudCogSGlnaDsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogQkI7CisKKyAgICBDYXNlKCkgOiBMb3coMCksIEhpZ2goMCksIEJCKDApIHsgfQorICAgIENhc2UoQ29uc3RhbnQqIGxvdywgQ29uc3RhbnQqIGhpZ2gsIE1hY2hpbmVCYXNpY0Jsb2NrKiBiYikgOgorICAgICAgTG93KGxvdyksIEhpZ2goaGlnaCksIEJCKGJiKSB7IH0KKyAgICBBUEludCBzaXplKCkgY29uc3QgeworICAgICAgY29uc3QgQVBJbnQgJnJIaWdoID0gY2FzdDxDb25zdGFudEludD4oSGlnaCktPmdldFZhbHVlKCk7CisgICAgICBjb25zdCBBUEludCAmckxvdyAgPSBjYXN0PENvbnN0YW50SW50PihMb3cpLT5nZXRWYWx1ZSgpOworICAgICAgcmV0dXJuIChySGlnaCAtIHJMb3cgKyAxVUxMKTsKKyAgICB9CisgIH07CisKKyAgc3RydWN0IENhc2VCaXRzIHsKKyAgICB1aW50NjRfdCBNYXNrOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBCQjsKKyAgICB1bnNpZ25lZCBCaXRzOworCisgICAgQ2FzZUJpdHModWludDY0X3QgbWFzaywgTWFjaGluZUJhc2ljQmxvY2sqIGJiLCB1bnNpZ25lZCBiaXRzKToKKyAgICAgIE1hc2sobWFzayksIEJCKGJiKSwgQml0cyhiaXRzKSB7IH0KKyAgfTsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPENhc2U+ICAgICAgICAgICBDYXNlVmVjdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPENhc2VCaXRzPiAgICAgICBDYXNlQml0c1ZlY3RvcjsKKyAgdHlwZWRlZiBDYXNlVmVjdG9yOjppdGVyYXRvciAgICAgICAgQ2FzZUl0cjsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Q2FzZUl0ciwgQ2FzZUl0cj4gQ2FzZVJhbmdlOworCisgIC8vLyBDYXNlUmVjIC0gQSBzdHJ1Y3Qgd2l0aCBjdG9yIHVzZWQgaW4gbG93ZXJpbmcgc3dpdGNoZXMgdG8gYSBiaW5hcnkgdHJlZQorICAvLy8gb2YgY29uZGl0aW9uYWwgYnJhbmNoZXMuCisgIHN0cnVjdCBDYXNlUmVjIHsKKyAgICBDYXNlUmVjKE1hY2hpbmVCYXNpY0Jsb2NrICpiYiwgY29uc3QgQ29uc3RhbnQgKmx0LCBjb25zdCBDb25zdGFudCAqZ2UsCisgICAgICAgICAgICBDYXNlUmFuZ2UgcikgOgorICAgIENhc2VCQihiYiksIExUKGx0KSwgR0UoZ2UpLCBSYW5nZShyKSB7fQorCisgICAgLy8vIENhc2VCQiAtIFRoZSBNQkIgaW4gd2hpY2ggdG8gZW1pdCB0aGUgY29tcGFyZSBhbmQgYnJhbmNoCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkNhc2VCQjsKKyAgICAvLy8gTFQsIEdFIC0gSWYgbm9uemVybywgd2Uga25vdyB0aGUgY3VycmVudCBjYXNlIHZhbHVlIG11c3QgYmUgbGVzcy10aGFuIG9yCisgICAgLy8vIGdyZWF0ZXItdGhhbi1vci1lcXVhbC10byB0aGVzZSBDb25zdGFudHMuCisgICAgY29uc3QgQ29uc3RhbnQgKkxUOworICAgIGNvbnN0IENvbnN0YW50ICpHRTsKKyAgICAvLy8gUmFuZ2UgLSBBIHBhaXIgb2YgaXRlcmF0b3JzIHJlcHJlc2VudGluZyB0aGUgcmFuZ2Ugb2YgY2FzZSB2YWx1ZXMgdG8gYmUKKyAgICAvLy8gcHJvY2Vzc2VkIGF0IHRoaXMgcG9pbnQgaW4gdGhlIGJpbmFyeSBzZWFyY2ggdHJlZS4KKyAgICBDYXNlUmFuZ2UgUmFuZ2U7CisgIH07CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDYXNlUmVjPiBDYXNlUmVjVmVjdG9yOworCisgIC8vLyBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyB0aGUgc3dpdGNoIGNhc2UgdmFsdWVzIGluIHRoZSB2ZWN0b3IuCisgIC8vLyBXQVJOSU5HOiBDYXNlIHJhbmdlcyBzaG91bGQgYmUgZGlzam9pbnQhCisgIHN0cnVjdCBDYXNlQ21wIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgQ2FzZSAmQzEsIGNvbnN0IENhc2UgJkMyKSB7CisgICAgICBhc3NlcnQoaXNhPENvbnN0YW50SW50PihDMS5Mb3cpICYmIGlzYTxDb25zdGFudEludD4oQzIuSGlnaCkpOworICAgICAgY29uc3QgQ29uc3RhbnRJbnQqIENJMSA9IGNhc3Q8Y29uc3QgQ29uc3RhbnRJbnQ+KEMxLkxvdyk7CisgICAgICBjb25zdCBDb25zdGFudEludCogQ0kyID0gY2FzdDxjb25zdCBDb25zdGFudEludD4oQzIuSGlnaCk7CisgICAgICByZXR1cm4gQ0kxLT5nZXRWYWx1ZSgpLnNsdChDSTItPmdldFZhbHVlKCkpOworICAgIH0KKyAgfTsKKworICBzdHJ1Y3QgQ2FzZUJpdHNDbXAgeworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBDYXNlQml0cyAmQzEsIGNvbnN0IENhc2VCaXRzICZDMikgeworICAgICAgcmV0dXJuIEMxLkJpdHMgPiBDMi5CaXRzOworICAgIH0KKyAgfTsKKworICBzaXplX3QgQ2x1c3RlcmlmeShDYXNlVmVjdG9yICZDYXNlcywgY29uc3QgU3dpdGNoSW5zdCAmU0kpOworCisgIC8vLyBDYXNlQmxvY2sgLSBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4KKyAgLy8vIFNlbGVjdGlvbkRBR0J1aWxkZXIgYW5kIFNESVNlbCBmb3IgdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBhZGRpdGlvbmFsIGJhc2ljCisgIC8vLyBibG9ja3MgbmVlZGVkIGJ5IG11bHRpLWNhc2Ugc3dpdGNoIHN0YXRlbWVudHMuCisgIHN0cnVjdCBDYXNlQmxvY2sgeworICAgIENhc2VCbG9jayhJU0Q6OkNvbmRDb2RlIGNjLCBjb25zdCBWYWx1ZSAqY21wbGhzLCBjb25zdCBWYWx1ZSAqY21wcmhzLAorICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqY21wbWlkZGxlLAorICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqdHJ1ZWJiLCBNYWNoaW5lQmFzaWNCbG9jayAqZmFsc2ViYiwKKyAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKm1lKQorICAgICAgOiBDQyhjYyksIENtcExIUyhjbXBsaHMpLCBDbXBNSFMoY21wbWlkZGxlKSwgQ21wUkhTKGNtcHJocyksCisgICAgICAgIFRydWVCQih0cnVlYmIpLCBGYWxzZUJCKGZhbHNlYmIpLCBUaGlzQkIobWUpIHt9CisgICAgLy8gQ0MgLSB0aGUgY29uZGl0aW9uIGNvZGUgdG8gdXNlIGZvciB0aGUgY2FzZSBibG9jaydzIHNldGNjIG5vZGUKKyAgICBJU0Q6OkNvbmRDb2RlIENDOworICAgIC8vIENtcExIUy9DbXBSSFMvQ21wTUhTIC0gVGhlIExIUy9NSFMvUkhTIG9mIHRoZSBjb21wYXJpc29uIHRvIGVtaXQuCisgICAgLy8gRW1pdCBieSBkZWZhdWx0IExIUyBvcCBSSFMuIE1IUyBpcyB1c2VkIGZvciByYW5nZSBjb21wYXJpc29uczoKKyAgICAvLyBJZiBNSFMgaXMgbm90IG51bGw6IChMSFMgPD0gTUhTKSBhbmQgKE1IUyA8PSBSSFMpLgorICAgIGNvbnN0IFZhbHVlICpDbXBMSFMsICpDbXBNSFMsICpDbXBSSFM7CisgICAgLy8gVHJ1ZUJCL0ZhbHNlQkIgLSB0aGUgYmxvY2sgdG8gYnJhbmNoIHRvIGlmIHRoZSBzZXRjYyBpcyB0cnVlL2ZhbHNlLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUcnVlQkIsICpGYWxzZUJCOworICAgIC8vIFRoaXNCQiAtIHRoZSBibG9jayBpbnRvIHdoaWNoIHRvIGVtaXQgdGhlIGNvZGUgZm9yIHRoZSBzZXRjYyBhbmQgYnJhbmNoZXMKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqVGhpc0JCOworICB9OworICBzdHJ1Y3QgSnVtcFRhYmxlIHsKKyAgICBKdW1wVGFibGUodW5zaWduZWQgUiwgdW5zaWduZWQgSiwgTWFjaGluZUJhc2ljQmxvY2sgKk0sCisgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpEKTogUmVnKFIpLCBKVEkoSiksIE1CQihNKSwgRGVmYXVsdChEKSB7fQorICAKKyAgICAvLy8gUmVnIC0gdGhlIHZpcnR1YWwgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgaW5kZXggb2YgdGhlIGp1bXAgdGFibGUgZW50cnkKKyAgICAvLy4gdG8ganVtcCB0by4KKyAgICB1bnNpZ25lZCBSZWc7CisgICAgLy8vIEpUSSAtIHRoZSBKdW1wVGFibGVJbmRleCBmb3IgdGhpcyBqdW1wIHRhYmxlIGluIHRoZSBmdW5jdGlvbi4KKyAgICB1bnNpZ25lZCBKVEk7CisgICAgLy8vIE1CQiAtIHRoZSBNQkIgaW50byB3aGljaCB0byBlbWl0IHRoZSBjb2RlIGZvciB0aGUgaW5kaXJlY3QganVtcC4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCOworICAgIC8vLyBEZWZhdWx0IC0gdGhlIE1CQiBvZiB0aGUgZGVmYXVsdCBiYiwgd2hpY2ggaXMgYSBzdWNjZXNzb3Igb2YgdGhlIHJhbmdlCisgICAgLy8vIGNoZWNrIE1CQi4gIFRoaXMgaXMgd2hlbiB1cGRhdGluZyBQSEkgbm9kZXMgaW4gc3VjY2Vzc29ycy4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRGVmYXVsdDsKKyAgfTsKKyAgc3RydWN0IEp1bXBUYWJsZUhlYWRlciB7CisgICAgSnVtcFRhYmxlSGVhZGVyKEFQSW50IEYsIEFQSW50IEwsIGNvbnN0IFZhbHVlICpTViwgTWFjaGluZUJhc2ljQmxvY2sgKkgsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgRSA9IGZhbHNlKToKKyAgICAgIEZpcnN0KEYpLCBMYXN0KEwpLCBTVmFsdWUoU1YpLCBIZWFkZXJCQihIKSwgRW1pdHRlZChFKSB7fQorICAgIEFQSW50IEZpcnN0OworICAgIEFQSW50IExhc3Q7CisgICAgY29uc3QgVmFsdWUgKlNWYWx1ZTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqSGVhZGVyQkI7CisgICAgYm9vbCBFbWl0dGVkOworICB9OworICB0eXBlZGVmIHN0ZDo6cGFpcjxKdW1wVGFibGVIZWFkZXIsIEp1bXBUYWJsZT4gSnVtcFRhYmxlQmxvY2s7CisKKyAgc3RydWN0IEJpdFRlc3RDYXNlIHsKKyAgICBCaXRUZXN0Q2FzZSh1aW50NjRfdCBNLCBNYWNoaW5lQmFzaWNCbG9jayogVCwgTWFjaGluZUJhc2ljQmxvY2sqIFRyKToKKyAgICAgIE1hc2soTSksIFRoaXNCQihUKSwgVGFyZ2V0QkIoVHIpIHsgfQorICAgIHVpbnQ2NF90IE1hc2s7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKlRoaXNCQjsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqVGFyZ2V0QkI7CisgIH07CisKKyAgdHlwZWRlZiBTbWFsbFZlY3RvcjxCaXRUZXN0Q2FzZSwgMz4gQml0VGVzdEluZm87CisKKyAgc3RydWN0IEJpdFRlc3RCbG9jayB7CisgICAgQml0VGVzdEJsb2NrKEFQSW50IEYsIEFQSW50IFIsIGNvbnN0IFZhbHVlKiBTViwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmcsIGJvb2wgRSwKKyAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIFAsIE1hY2hpbmVCYXNpY0Jsb2NrKiBELAorICAgICAgICAgICAgICAgICBjb25zdCBCaXRUZXN0SW5mbyYgQyk6CisgICAgICBGaXJzdChGKSwgUmFuZ2UoUiksIFNWYWx1ZShTViksIFJlZyhSZyksIEVtaXR0ZWQoRSksCisgICAgICBQYXJlbnQoUCksIERlZmF1bHQoRCksIENhc2VzKEMpIHsgfQorICAgIEFQSW50IEZpcnN0OworICAgIEFQSW50IFJhbmdlOworICAgIGNvbnN0IFZhbHVlICpTVmFsdWU7CisgICAgdW5zaWduZWQgUmVnOworICAgIGJvb2wgRW1pdHRlZDsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqUGFyZW50OworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpEZWZhdWx0OworICAgIEJpdFRlc3RJbmZvIENhc2VzOworICB9OworCitwdWJsaWM6CisgIC8vIFRMSSAtIFRoaXMgaXMgaW5mb3JtYXRpb24gdGhhdCBkZXNjcmliZXMgdGhlIGF2YWlsYWJsZSB0YXJnZXQgZmVhdHVyZXMgd2UKKyAgLy8gbmVlZCBmb3IgbG93ZXJpbmcuICBUaGlzIGluZGljYXRlcyB3aGVuIG9wZXJhdGlvbnMgYXJlIHVuYXZhaWxhYmxlLAorICAvLyBpbXBsZW1lbnRlZCB3aXRoIGEgbGliY2FsbCwgZXRjLgorICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSTsKKyAgU2VsZWN0aW9uREFHICZEQUc7CisgIGNvbnN0IFRhcmdldERhdGEgKlREOworICBBbGlhc0FuYWx5c2lzICpBQTsKKworICAvLy8gU3dpdGNoQ2FzZXMgLSBWZWN0b3Igb2YgQ2FzZUJsb2NrIHN0cnVjdHVyZXMgdXNlZCB0byBjb21tdW5pY2F0ZQorICAvLy8gU3dpdGNoSW5zdCBjb2RlIGdlbmVyYXRpb24gaW5mb3JtYXRpb24uCisgIHN0ZDo6dmVjdG9yPENhc2VCbG9jaz4gU3dpdGNoQ2FzZXM7CisgIC8vLyBKVENhc2VzIC0gVmVjdG9yIG9mIEp1bXBUYWJsZSBzdHJ1Y3R1cmVzIHVzZWQgdG8gY29tbXVuaWNhdGUKKyAgLy8vIFN3aXRjaEluc3QgY29kZSBnZW5lcmF0aW9uIGluZm9ybWF0aW9uLgorICBzdGQ6OnZlY3RvcjxKdW1wVGFibGVCbG9jaz4gSlRDYXNlczsKKyAgLy8vIEJpdFRlc3RDYXNlcyAtIFZlY3RvciBvZiBCaXRUZXN0QmxvY2sgc3RydWN0dXJlcyB1c2VkIHRvIGNvbW11bmljYXRlCisgIC8vLyBTd2l0Y2hJbnN0IGNvZGUgZ2VuZXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgc3RkOjp2ZWN0b3I8Qml0VGVzdEJsb2NrPiBCaXRUZXN0Q2FzZXM7CisKKyAgLy8gRW1pdCBQSEktbm9kZS1vcGVyYW5kIGNvbnN0YW50cyBvbmx5IG9uY2UgZXZlbiBpZiB1c2VkIGJ5IG11bHRpcGxlCisgIC8vIFBISSBub2Rlcy4KKyAgRGVuc2VNYXA8Y29uc3QgQ29uc3RhbnQgKiwgdW5zaWduZWQ+IENvbnN0YW50c091dDsKKworICAvLy8gRnVuY0luZm8gLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZnVuY3Rpb24gYXMgYSB3aG9sZS4KKyAgLy8vCisgIEZ1bmN0aW9uTG93ZXJpbmdJbmZvICZGdW5jSW5mbzsKKworICAvLy8gT3B0TGV2ZWwgLSBXaGF0IG9wdGltaXphdGlvbiBsZXZlbCB3ZSdyZSBnZW5lcmF0aW5nIGNvZGUgZm9yLgorICAvLy8gCisgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsOworCisgIC8vLyBIYXNUYWlsQ2FsbCAtIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgYSBjYWxsIGluIHRoZSBjdXJyZW50CisgIC8vLyBibG9jayBoYXMgYmVlbiB0cmFuc2xhdGVkIGFzIGEgdGFpbCBjYWxsLiBJbiB0aGlzIGNhc2UsCisgIC8vLyBubyBzdWJzZXF1ZW50IERBRyBub2RlcyBzaG91bGQgYmUgY3JlYXRlZC4KKyAgLy8vCisgIGJvb2wgSGFzVGFpbENhbGw7CisKKyAgTExWTUNvbnRleHQgKkNvbnRleHQ7CisKKyAgU2VsZWN0aW9uREFHQnVpbGRlcihTZWxlY3Rpb25EQUcgJmRhZywgRnVuY3Rpb25Mb3dlcmluZ0luZm8gJmZ1bmNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIG9sKQorICAgIDogU0ROb2RlT3JkZXIoMCksIFRNKGRhZy5nZXRUYXJnZXQoKSksIFRMSShkYWcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkpLAorICAgICAgREFHKGRhZyksIEZ1bmNJbmZvKGZ1bmNpbmZvKSwgT3B0TGV2ZWwob2wpLAorICAgICAgSGFzVGFpbENhbGwoZmFsc2UpLCBDb250ZXh0KGRhZy5nZXRDb250ZXh0KCkpIHsKKyAgfQorCisgIHZvaWQgaW5pdChBbGlhc0FuYWx5c2lzICZhYSk7CisKKyAgLy8vIGNsZWFyIC0gQ2xlYXIgb3V0IHRoZSBjdXJyZW50IFNlbGVjdGlvbkRBRyBhbmQgdGhlIGFzc29jaWF0ZWQKKyAgLy8vIHN0YXRlIGFuZCBwcmVwYXJlIHRoaXMgU2VsZWN0aW9uREFHQnVpbGRlciBvYmplY3QgdG8gYmUgdXNlZAorICAvLy8gZm9yIGEgbmV3IGJsb2NrLiBUaGlzIGRvZXNuJ3QgY2xlYXIgb3V0IGluZm9ybWF0aW9uIGFib3V0CisgIC8vLyBhZGRpdGlvbmFsIGJsb2NrcyB0aGF0IGFyZSBuZWVkZWQgdG8gY29tcGxldGUgc3dpdGNoIGxvd2VyaW5nCisgIC8vLyBvciBQSEkgbm9kZSB1cGRhdGluZzsgdGhhdCBpbmZvcm1hdGlvbiBpcyBjbGVhcmVkIG91dCBhcyBpdCBpcworICAvLy8gY29uc3VtZWQuCisgIHZvaWQgY2xlYXIoKTsKKworICAvLy8gZ2V0Um9vdCAtIFJldHVybiB0aGUgY3VycmVudCB2aXJ0dWFsIHJvb3Qgb2YgdGhlIFNlbGVjdGlvbiBEQUcsCisgIC8vLyBmbHVzaGluZyBhbnkgUGVuZGluZ0xvYWQgaXRlbXMuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBlbWl0dGluZworICAvLy8gYSBzdG9yZSBvciBhbnkgb3RoZXIgbm9kZSB0aGF0IG1heSBuZWVkIHRvIGJlIG9yZGVyZWQgYWZ0ZXIgYW55CisgIC8vLyBwcmlvciBsb2FkIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIFNEVmFsdWUgZ2V0Um9vdCgpOworCisgIC8vLyBnZXRDb250cm9sUm9vdCAtIFNpbWlsYXIgdG8gZ2V0Um9vdCwgYnV0IGluc3RlYWQgb2YgZmx1c2hpbmcgYWxsIHRoZQorICAvLy8gUGVuZGluZ0xvYWQgaXRlbXMsIGZsdXNoIGFsbCB0aGUgUGVuZGluZ0V4cG9ydHMgaXRlbXMuIEl0IGlzIG5lY2Vzc2FyeQorICAvLy8gdG8gZG8gdGhpcyBiZWZvcmUgZW1pdHRpbmcgYSB0ZXJtaW5hdG9yIGluc3RydWN0aW9uLgorICAvLy8KKyAgU0RWYWx1ZSBnZXRDb250cm9sUm9vdCgpOworCisgIERlYnVnTG9jIGdldEN1ckRlYnVnTG9jKCkgY29uc3QgeyByZXR1cm4gQ3VyRGVidWdMb2M7IH0KKworICB1bnNpZ25lZCBnZXRTRE5vZGVPcmRlcigpIGNvbnN0IHsgcmV0dXJuIFNETm9kZU9yZGVyOyB9CisKKyAgdm9pZCBDb3B5VmFsdWVUb1ZpcnR1YWxSZWdpc3Rlcihjb25zdCBWYWx1ZSAqViwgdW5zaWduZWQgUmVnKTsKKworICAvLy8gQXNzaWduT3JkZXJpbmdUb05vZGUgLSBBc3NpZ24gYW4gb3JkZXJpbmcgdG8gdGhlIG5vZGUuIFRoZSBvcmRlciBpcyBnb3R0ZW4KKyAgLy8vIGZyb20gaG93IHRoZSBjb2RlIGFwcGVhcmVkIGluIHRoZSBzb3VyY2UuIFRoZSBvcmRlcmluZyBpcyB1c2VkIGJ5IHRoZQorICAvLy8gc2NoZWR1bGVyIHRvIGVmZmVjdGl2ZWx5IHR1cm4gb2ZmIHNjaGVkdWxpbmcuCisgIHZvaWQgQXNzaWduT3JkZXJpbmdUb05vZGUoY29uc3QgU0ROb2RlICpOb2RlKTsKKworICB2b2lkIHZpc2l0KGNvbnN0IEluc3RydWN0aW9uICZJKTsKKworICB2b2lkIHZpc2l0KHVuc2lnbmVkIE9wY29kZSwgY29uc3QgVXNlciAmSSk7CisKKyAgU0RWYWx1ZSBnZXRWYWx1ZShjb25zdCBWYWx1ZSAqVik7CisgIFNEVmFsdWUgZ2V0Tm9uUmVnaXN0ZXJWYWx1ZShjb25zdCBWYWx1ZSAqVik7CisgIFNEVmFsdWUgZ2V0VmFsdWVJbXBsKGNvbnN0IFZhbHVlICpWKTsKKworICB2b2lkIHNldFZhbHVlKGNvbnN0IFZhbHVlICpWLCBTRFZhbHVlIE5ld04pIHsKKyAgICBTRFZhbHVlICZOID0gTm9kZU1hcFtWXTsKKyAgICBhc3NlcnQoTi5nZXROb2RlKCkgPT0gMCAmJiAiQWxyZWFkeSBzZXQgYSB2YWx1ZSBmb3IgdGhpcyBub2RlISIpOworICAgIE4gPSBOZXdOOworICB9CisgIAorICB2b2lkIHNldFVudXNlZEFyZ1ZhbHVlKGNvbnN0IFZhbHVlICpWLCBTRFZhbHVlIE5ld04pIHsKKyAgICBTRFZhbHVlICZOID0gVW51c2VkQXJnTm9kZU1hcFtWXTsKKyAgICBhc3NlcnQoTi5nZXROb2RlKCkgPT0gMCAmJiAiQWxyZWFkeSBzZXQgYSB2YWx1ZSBmb3IgdGhpcyBub2RlISIpOworICAgIE4gPSBOZXdOOworICB9CisgIAorICB2b2lkIEdldFJlZ2lzdGVyc0ZvclZhbHVlKFNESVNlbEFzbU9wZXJhbmRJbmZvICZPcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8dW5zaWduZWQ+ICZPdXRwdXRSZWdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDx1bnNpZ25lZD4gJklucHV0UmVncyk7CisKKyAgdm9pZCBGaW5kTWVyZ2VkQ29uZGl0aW9ucyhjb25zdCBWYWx1ZSAqQ29uZCwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLCBNYWNoaW5lQmFzaWNCbG9jayAqQ3VyQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCLCB1bnNpZ25lZCBPcGMpOworICB2b2lkIEVtaXRCcmFuY2hGb3JNZXJnZWRDb25kaXRpb24oY29uc3QgVmFsdWUgKkNvbmQsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkN1ckJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCKTsKKyAgYm9vbCBTaG91bGRFbWl0QXNCcmFuY2hlcyhjb25zdCBzdGQ6OnZlY3RvcjxDYXNlQmxvY2s+ICZDYXNlcyk7CisgIGJvb2wgaXNFeHBvcnRhYmxlRnJvbUN1cnJlbnRCbG9jayhjb25zdCBWYWx1ZSAqViwgY29uc3QgQmFzaWNCbG9jayAqRnJvbUJCKTsKKyAgdm9pZCBDb3B5VG9FeHBvcnRSZWdzSWZOZWVkZWQoY29uc3QgVmFsdWUgKlYpOworICB2b2lkIEV4cG9ydEZyb21DdXJyZW50QmxvY2soY29uc3QgVmFsdWUgKlYpOworICB2b2lkIExvd2VyQ2FsbFRvKEltbXV0YWJsZUNhbGxTaXRlIENTLCBTRFZhbHVlIENhbGxlZSwgYm9vbCBJc1RhaWxDYWxsKTsKKworcHJpdmF0ZToKKyAgLy8gVGVybWluYXRvciBpbnN0cnVjdGlvbnMuCisgIHZvaWQgdmlzaXRSZXQoY29uc3QgUmV0dXJuSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRCcihjb25zdCBCcmFuY2hJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdFN3aXRjaChjb25zdCBTd2l0Y2hJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdEluZGlyZWN0QnIoY29uc3QgSW5kaXJlY3RCckluc3QgJkkpOworICB2b2lkIHZpc2l0VW5yZWFjaGFibGUoY29uc3QgVW5yZWFjaGFibGVJbnN0ICZJKSB7IC8qIG5vb3AgKi8gfQorCisgIC8vIEhlbHBlcnMgZm9yIHZpc2l0U3dpdGNoCisgIGJvb2wgaGFuZGxlU21hbGxTd2l0Y2hSYW5nZShDYXNlUmVjJiBDUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc2VSZWNWZWN0b3ImIFdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUqIFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3dpdGNoQkIpOworICBib29sIGhhbmRsZUpUU3dpdGNoQ2FzZShDYXNlUmVjJiBDUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzZVJlY1ZlY3RvciYgV29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlKiBTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTd2l0Y2hCQik7CisgIGJvb2wgaGFuZGxlQlRTcGxpdFN3aXRjaENhc2UoQ2FzZVJlYyYgQ1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzZVJlY1ZlY3RvciYgV29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUqIFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTd2l0Y2hCQik7CisgIGJvb2wgaGFuZGxlQml0VGVzdHNTd2l0Y2hDYXNlKENhc2VSZWMmIENSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXNlUmVjVmVjdG9yJiBXb3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUqIFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCKTsKK3B1YmxpYzoKKyAgdm9pZCB2aXNpdFN3aXRjaENhc2UoQ2FzZUJsb2NrICZDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCKTsKKyAgdm9pZCB2aXNpdEJpdFRlc3RIZWFkZXIoQml0VGVzdEJsb2NrICZCLCBNYWNoaW5lQmFzaWNCbG9jayAqU3dpdGNoQkIpOworICB2b2lkIHZpc2l0Qml0VGVzdENhc2UoTWFjaGluZUJhc2ljQmxvY2sqIE5leHRNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRUZXN0Q2FzZSAmQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTd2l0Y2hCQik7CisgIHZvaWQgdmlzaXRKdW1wVGFibGUoSnVtcFRhYmxlICZKVCk7CisgIHZvaWQgdmlzaXRKdW1wVGFibGVIZWFkZXIoSnVtcFRhYmxlICZKVCwgSnVtcFRhYmxlSGVhZGVyICZKVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN3aXRjaEJCKTsKKyAgCitwcml2YXRlOgorICB2b2lkIHZpc2l0QmluYXJ5KGNvbnN0IFVzZXIgJkksIHVuc2lnbmVkIE9wQ29kZSk7CisgIHZvaWQgdmlzaXRTaGlmdChjb25zdCBVc2VyICZJLCB1bnNpZ25lZCBPcGNvZGUpOworICB2b2lkIHZpc2l0QWRkKGNvbnN0IFVzZXIgJkkpICB7IHZpc2l0QmluYXJ5KEksIElTRDo6QUREKTsgfQorICB2b2lkIHZpc2l0RkFkZChjb25zdCBVc2VyICZJKSB7IHZpc2l0QmluYXJ5KEksIElTRDo6RkFERCk7IH0KKyAgdm9pZCB2aXNpdFN1Yihjb25zdCBVc2VyICZJKSAgeyB2aXNpdEJpbmFyeShJLCBJU0Q6OlNVQik7IH0KKyAgdm9pZCB2aXNpdEZTdWIoY29uc3QgVXNlciAmSSk7CisgIHZvaWQgdmlzaXRNdWwoY29uc3QgVXNlciAmSSkgIHsgdmlzaXRCaW5hcnkoSSwgSVNEOjpNVUwpOyB9CisgIHZvaWQgdmlzaXRGTXVsKGNvbnN0IFVzZXIgJkkpIHsgdmlzaXRCaW5hcnkoSSwgSVNEOjpGTVVMKTsgfQorICB2b2lkIHZpc2l0VVJlbShjb25zdCBVc2VyICZJKSB7IHZpc2l0QmluYXJ5KEksIElTRDo6VVJFTSk7IH0KKyAgdm9pZCB2aXNpdFNSZW0oY29uc3QgVXNlciAmSSkgeyB2aXNpdEJpbmFyeShJLCBJU0Q6OlNSRU0pOyB9CisgIHZvaWQgdmlzaXRGUmVtKGNvbnN0IFVzZXIgJkkpIHsgdmlzaXRCaW5hcnkoSSwgSVNEOjpGUkVNKTsgfQorICB2b2lkIHZpc2l0VURpdihjb25zdCBVc2VyICZJKSB7IHZpc2l0QmluYXJ5KEksIElTRDo6VURJVik7IH0KKyAgdm9pZCB2aXNpdFNEaXYoY29uc3QgVXNlciAmSSkgeyB2aXNpdEJpbmFyeShJLCBJU0Q6OlNESVYpOyB9CisgIHZvaWQgdmlzaXRGRGl2KGNvbnN0IFVzZXIgJkkpIHsgdmlzaXRCaW5hcnkoSSwgSVNEOjpGRElWKTsgfQorICB2b2lkIHZpc2l0QW5kIChjb25zdCBVc2VyICZJKSB7IHZpc2l0QmluYXJ5KEksIElTRDo6QU5EKTsgfQorICB2b2lkIHZpc2l0T3IgIChjb25zdCBVc2VyICZJKSB7IHZpc2l0QmluYXJ5KEksIElTRDo6T1IpOyB9CisgIHZvaWQgdmlzaXRYb3IgKGNvbnN0IFVzZXIgJkkpIHsgdmlzaXRCaW5hcnkoSSwgSVNEOjpYT1IpOyB9CisgIHZvaWQgdmlzaXRTaGwgKGNvbnN0IFVzZXIgJkkpIHsgdmlzaXRTaGlmdChJLCBJU0Q6OlNITCk7IH0KKyAgdm9pZCB2aXNpdExTaHIoY29uc3QgVXNlciAmSSkgeyB2aXNpdFNoaWZ0KEksIElTRDo6U1JMKTsgfQorICB2b2lkIHZpc2l0QVNocihjb25zdCBVc2VyICZJKSB7IHZpc2l0U2hpZnQoSSwgSVNEOjpTUkEpOyB9CisgIHZvaWQgdmlzaXRJQ21wKGNvbnN0IFVzZXIgJkkpOworICB2b2lkIHZpc2l0RkNtcChjb25zdCBVc2VyICZJKTsKKyAgLy8gVmlzaXQgdGhlIGNvbnZlcnNpb24gaW5zdHJ1Y3Rpb25zCisgIHZvaWQgdmlzaXRUcnVuYyhjb25zdCBVc2VyICZJKTsKKyAgdm9pZCB2aXNpdFpFeHQoY29uc3QgVXNlciAmSSk7CisgIHZvaWQgdmlzaXRTRXh0KGNvbnN0IFVzZXIgJkkpOworICB2b2lkIHZpc2l0RlBUcnVuYyhjb25zdCBVc2VyICZJKTsKKyAgdm9pZCB2aXNpdEZQRXh0KGNvbnN0IFVzZXIgJkkpOworICB2b2lkIHZpc2l0RlBUb1VJKGNvbnN0IFVzZXIgJkkpOworICB2b2lkIHZpc2l0RlBUb1NJKGNvbnN0IFVzZXIgJkkpOworICB2b2lkIHZpc2l0VUlUb0ZQKGNvbnN0IFVzZXIgJkkpOworICB2b2lkIHZpc2l0U0lUb0ZQKGNvbnN0IFVzZXIgJkkpOworICB2b2lkIHZpc2l0UHRyVG9JbnQoY29uc3QgVXNlciAmSSk7CisgIHZvaWQgdmlzaXRJbnRUb1B0cihjb25zdCBVc2VyICZJKTsKKyAgdm9pZCB2aXNpdEJpdENhc3QoY29uc3QgVXNlciAmSSk7CisKKyAgdm9pZCB2aXNpdEV4dHJhY3RFbGVtZW50KGNvbnN0IFVzZXIgJkkpOworICB2b2lkIHZpc2l0SW5zZXJ0RWxlbWVudChjb25zdCBVc2VyICZJKTsKKyAgdm9pZCB2aXNpdFNodWZmbGVWZWN0b3IoY29uc3QgVXNlciAmSSk7CisKKyAgdm9pZCB2aXNpdEV4dHJhY3RWYWx1ZShjb25zdCBFeHRyYWN0VmFsdWVJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdEluc2VydFZhbHVlKGNvbnN0IEluc2VydFZhbHVlSW5zdCAmSSk7CisKKyAgdm9pZCB2aXNpdEdldEVsZW1lbnRQdHIoY29uc3QgVXNlciAmSSk7CisgIHZvaWQgdmlzaXRTZWxlY3QoY29uc3QgVXNlciAmSSk7CisKKyAgdm9pZCB2aXNpdEFsbG9jYShjb25zdCBBbGxvY2FJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdExvYWQoY29uc3QgTG9hZEluc3QgJkkpOworICB2b2lkIHZpc2l0U3RvcmUoY29uc3QgU3RvcmVJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdFBISShjb25zdCBQSElOb2RlICZJKTsKKyAgdm9pZCB2aXNpdENhbGwoY29uc3QgQ2FsbEluc3QgJkkpOworICBib29sIHZpc2l0TWVtQ21wQ2FsbChjb25zdCBDYWxsSW5zdCAmSSk7CisgIAorICBjb25zdCBjaGFyICp2aXNpdEludHJpbnNpY0NhbGwoY29uc3QgQ2FsbEluc3QgJkksIHVuc2lnbmVkIEludHJpbnNpYyk7CisgIHZvaWQgdmlzaXRUYXJnZXRJbnRyaW5zaWMoY29uc3QgQ2FsbEluc3QgJkksIHVuc2lnbmVkIEludHJpbnNpYyk7CisKKyAgdm9pZCB2aXNpdFBvdyhjb25zdCBDYWxsSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRFeHAyKGNvbnN0IENhbGxJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdEV4cChjb25zdCBDYWxsSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRMb2coY29uc3QgQ2FsbEluc3QgJkkpOworICB2b2lkIHZpc2l0TG9nMihjb25zdCBDYWxsSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRMb2cxMChjb25zdCBDYWxsSW5zdCAmSSk7CisKKyAgdm9pZCB2aXNpdFVzZXJPcDEoY29uc3QgSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVc2VyT3AxIHNob3VsZCBub3QgZXhpc3QgYXQgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHRpbWUhIik7CisgIH0KKyAgdm9pZCB2aXNpdFVzZXJPcDIoY29uc3QgSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVc2VyT3AyIHNob3VsZCBub3QgZXhpc3QgYXQgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHRpbWUhIik7CisgIH0KKyAgCisgIGNvbnN0IGNoYXIgKmltcGxWaXNpdEJpbmFyeUF0b21pYyhjb25zdCBDYWxsSW5zdCYgSSwgSVNEOjpOb2RlVHlwZSBPcCk7CisgIGNvbnN0IGNoYXIgKmltcGxWaXNpdEFsdU92ZXJmbG93KGNvbnN0IENhbGxJbnN0ICZJLCBJU0Q6Ok5vZGVUeXBlIE9wKTsKKworICB2b2lkIEhhbmRsZVBISU5vZGVzSW5TdWNjZXNzb3JCbG9ja3MoY29uc3QgQmFzaWNCbG9jayAqTExWTUJCKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NlbGVjdGlvbkRBR0lTZWwuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NlbGVjdGlvbkRBR0lTZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTNmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2VsZWN0aW9uREFHSVNlbC5jcHAKQEAgLTAsMCArMSwyNDE3IEBACisvLz09PS0tIFNlbGVjdGlvbkRBR0lTZWwuY3BwIC0gSW1wbGVtZW50IHRoZSBTZWxlY3Rpb25EQUdJU2VsIGNsYXNzIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaW1wbGVtZW50cyB0aGUgU2VsZWN0aW9uREFHSVNlbCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImlzZWwiCisjaW5jbHVkZSAiU2NoZWR1bGVEQUdTRE5vZGVzLmgiCisjaW5jbHVkZSAiU2VsZWN0aW9uREFHQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9GdW5jdGlvbkxvd2VyaW5nSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lubGluZUFzbS5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0Zhc3RJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dDU3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR0NNZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlclJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEludHJpbnNpY0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGltZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUZhc3RJc2VsRmFpbHVyZXMsICJOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGZhc3QgaXNlbCBmYWlsZWQgb24iKTsKK1NUQVRJU1RJQyhOdW1EQUdJc2VsUmV0cmllcywiTnVtYmVyIG9mIHRpbWVzIGRhZyBpc2VsIGhhcyB0byB0cnkgYW5vdGhlciBwYXRoIik7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitFbmFibGVGYXN0SVNlbFZlcmJvc2UoImZhc3QtaXNlbC12ZXJib3NlIiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICBjbDo6ZGVzYygiRW5hYmxlIHZlcmJvc2UgbWVzc2FnZXMgaW4gdGhlIFwiZmFzdFwiICIKKyAgICAgICAgICAgICAgICAgICAiaW5zdHJ1Y3Rpb24gc2VsZWN0b3IiKSk7CitzdGF0aWMgY2w6Om9wdDxib29sPgorRW5hYmxlRmFzdElTZWxBYm9ydCgiZmFzdC1pc2VsLWFib3J0IiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICBjbDo6ZGVzYygiRW5hYmxlIGFib3J0IGNhbGxzIHdoZW4gXCJmYXN0XCIgaW5zdHJ1Y3Rpb24gZmFpbHMiKSk7CisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgY2w6Om9wdDxib29sPgorVmlld0RBR0NvbWJpbmUxKCJ2aWV3LWRhZy1jb21iaW5lMS1kYWdzIiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICBjbDo6ZGVzYygiUG9wIHVwIGEgd2luZG93IHRvIHNob3cgZGFncyBiZWZvcmUgdGhlIGZpcnN0ICIKKyAgICAgICAgICAgICAgICAgICAiZGFnIGNvbWJpbmUgcGFzcyIpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitWaWV3TGVnYWxpemVUeXBlc0RBR3MoInZpZXctbGVnYWxpemUtdHlwZXMtZGFncyIsIGNsOjpIaWRkZW4sCisgICAgICAgICAgY2w6OmRlc2MoIlBvcCB1cCBhIHdpbmRvdyB0byBzaG93IGRhZ3MgYmVmb3JlIGxlZ2FsaXplIHR5cGVzIikpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK1ZpZXdMZWdhbGl6ZURBR3MoInZpZXctbGVnYWxpemUtZGFncyIsIGNsOjpIaWRkZW4sCisgICAgICAgICAgY2w6OmRlc2MoIlBvcCB1cCBhIHdpbmRvdyB0byBzaG93IGRhZ3MgYmVmb3JlIGxlZ2FsaXplIikpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK1ZpZXdEQUdDb21iaW5lMigidmlldy1kYWctY29tYmluZTItZGFncyIsIGNsOjpIaWRkZW4sCisgICAgICAgICAgY2w6OmRlc2MoIlBvcCB1cCBhIHdpbmRvdyB0byBzaG93IGRhZ3MgYmVmb3JlIHRoZSBzZWNvbmQgIgorICAgICAgICAgICAgICAgICAgICJkYWcgY29tYmluZSBwYXNzIikpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK1ZpZXdEQUdDb21iaW5lTFQoInZpZXctZGFnLWNvbWJpbmUtbHQtZGFncyIsIGNsOjpIaWRkZW4sCisgICAgICAgICAgY2w6OmRlc2MoIlBvcCB1cCBhIHdpbmRvdyB0byBzaG93IGRhZ3MgYmVmb3JlIHRoZSBwb3N0IGxlZ2FsaXplIHR5cGVzIgorICAgICAgICAgICAgICAgICAgICIgZGFnIGNvbWJpbmUgcGFzcyIpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitWaWV3SVNlbERBR3MoInZpZXctaXNlbC1kYWdzIiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICBjbDo6ZGVzYygiUG9wIHVwIGEgd2luZG93IHRvIHNob3cgaXNlbCBkYWdzIGFzIHRoZXkgYXJlIHNlbGVjdGVkIikpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK1ZpZXdTY2hlZERBR3MoInZpZXctc2NoZWQtZGFncyIsIGNsOjpIaWRkZW4sCisgICAgICAgICAgY2w6OmRlc2MoIlBvcCB1cCBhIHdpbmRvdyB0byBzaG93IHNjaGVkIGRhZ3MgYXMgdGhleSBhcmUgcHJvY2Vzc2VkIikpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK1ZpZXdTVW5pdERBR3MoInZpZXctc3VuaXQtZGFncyIsIGNsOjpIaWRkZW4sCisgICAgICBjbDo6ZGVzYygiUG9wIHVwIGEgd2luZG93IHRvIHNob3cgU1VuaXQgZGFncyBhZnRlciB0aGV5IGFyZSBwcm9jZXNzZWQiKSk7CisjZWxzZQorc3RhdGljIGNvbnN0IGJvb2wgVmlld0RBR0NvbWJpbmUxID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICBWaWV3TGVnYWxpemVUeXBlc0RBR3MgPSBmYWxzZSwgVmlld0xlZ2FsaXplREFHcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgVmlld0RBR0NvbWJpbmUyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICBWaWV3REFHQ29tYmluZUxUID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICBWaWV3SVNlbERBR3MgPSBmYWxzZSwgVmlld1NjaGVkREFHcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgVmlld1NVbml0REFHcyA9IGZhbHNlOworI2VuZGlmCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFJlZ2lzdGVyU2NoZWR1bGVyIGNsYXNzIC0gVHJhY2sgdGhlIHJlZ2lzdHJhdGlvbiBvZiBpbnN0cnVjdGlvbiBzY2hlZHVsZXJzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitNYWNoaW5lUGFzc1JlZ2lzdHJ5IFJlZ2lzdGVyU2NoZWR1bGVyOjpSZWdpc3RyeTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gSVNIZXVyaXN0aWMgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gc2NoZWR1bGVycy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworc3RhdGljIGNsOjpvcHQ8UmVnaXN0ZXJTY2hlZHVsZXI6OkZ1bmN0aW9uUGFzc0N0b3IsIGZhbHNlLAorICAgICAgICAgICAgICAgUmVnaXN0ZXJQYXNzUGFyc2VyPFJlZ2lzdGVyU2NoZWR1bGVyPiA+CitJU0hldXJpc3RpYygicHJlLVJBLXNjaGVkIiwKKyAgICAgICAgICAgIGNsOjppbml0KCZjcmVhdGVEZWZhdWx0U2NoZWR1bGVyKSwKKyAgICAgICAgICAgIGNsOjpkZXNjKCJJbnN0cnVjdGlvbiBzY2hlZHVsZXJzIGF2YWlsYWJsZSAoYmVmb3JlIHJlZ2lzdGVyIgorICAgICAgICAgICAgICAgICAgICAgIiBhbGxvY2F0aW9uKToiKSk7CisKK3N0YXRpYyBSZWdpc3RlclNjaGVkdWxlcgorZGVmYXVsdExpc3REQUdTY2hlZHVsZXIoImRlZmF1bHQiLCAiQmVzdCBzY2hlZHVsZXIgZm9yIHRoZSB0YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVmYXVsdFNjaGVkdWxlcik7CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBjcmVhdGVEZWZhdWx0U2NoZWR1bGVyIC0gVGhpcyBjcmVhdGVzIGFuIGluc3RydWN0aW9uIHNjaGVkdWxlciBhcHByb3ByaWF0ZQorICAvLy8gZm9yIHRoZSB0YXJnZXQuCisgIFNjaGVkdWxlREFHU0ROb2RlcyogY3JlYXRlRGVmYXVsdFNjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSA9IElTLT5nZXRUYXJnZXRMb3dlcmluZygpOworCisgICAgaWYgKE9wdExldmVsID09IENvZGVHZW5PcHQ6Ok5vbmUpCisgICAgICByZXR1cm4gY3JlYXRlU291cmNlTGlzdERBR1NjaGVkdWxlcihJUywgT3B0TGV2ZWwpOworICAgIGlmIChUTEkuZ2V0U2NoZWR1bGluZ1ByZWZlcmVuY2UoKSA9PSBTY2hlZDo6TGF0ZW5jeSkKKyAgICAgIHJldHVybiBjcmVhdGVURExpc3REQUdTY2hlZHVsZXIoSVMsIE9wdExldmVsKTsKKyAgICBpZiAoVExJLmdldFNjaGVkdWxpbmdQcmVmZXJlbmNlKCkgPT0gU2NoZWQ6OlJlZ1ByZXNzdXJlKQorICAgICAgcmV0dXJuIGNyZWF0ZUJVUlJMaXN0REFHU2NoZWR1bGVyKElTLCBPcHRMZXZlbCk7CisgICAgaWYgKFRMSS5nZXRTY2hlZHVsaW5nUHJlZmVyZW5jZSgpID09IFNjaGVkOjpIeWJyaWQpCisgICAgICByZXR1cm4gY3JlYXRlSHlicmlkTGlzdERBR1NjaGVkdWxlcihJUywgT3B0TGV2ZWwpOworICAgIGFzc2VydChUTEkuZ2V0U2NoZWR1bGluZ1ByZWZlcmVuY2UoKSA9PSBTY2hlZDo6SUxQICYmCisgICAgICAgICAgICJVbmtub3duIHNjaGVkIHR5cGUhIik7CisgICAgcmV0dXJuIGNyZWF0ZUlMUExpc3REQUdTY2hlZHVsZXIoSVMsIE9wdExldmVsKTsKKyAgfQorfQorCisvLyBFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIgLSBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cworLy8gdGhhdCBtYXJrIGluc3RydWN0aW9ucyB3aXRoIHRoZSAndXNlc0N1c3RvbUluc2VydGVyJyBmbGFnLiAgVGhlc2UKKy8vIGluc3RydWN0aW9ucyBhcmUgc3BlY2lhbCBpbiB2YXJpb3VzIHdheXMsIHdoaWNoIHJlcXVpcmUgc3BlY2lhbCBzdXBwb3J0IHRvCisvLyBpbnNlcnQuICBUaGUgc3BlY2lmaWVkIE1hY2hpbmVJbnN0ciBpcyBjcmVhdGVkIGJ1dCBub3QgaW5zZXJ0ZWQgaW50byBhbnkKKy8vIGJhc2ljIGJsb2NrcywgYW5kIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBleHBhbmQgaXQgaW50byBhIHNlcXVlbmNlIG9mCisvLyBpbnN0cnVjdGlvbnMsIHBvdGVudGlhbGx5IGFsc28gY3JlYXRpbmcgbmV3IGJhc2ljIGJsb2NrcyBhbmQgY29udHJvbCBmbG93LgorLy8gV2hlbiBuZXcgYmFzaWMgYmxvY2tzIGFyZSBpbnNlcnRlZCBhbmQgdGhlIGVkZ2VzIGZyb20gTUJCIHRvIGl0cyBzdWNjZXNzb3JzCisvLyBhcmUgbW9kaWZpZWQsIHRoZSBtZXRob2Qgc2hvdWxkIGluc2VydCBwYWlycyBvZiA8T2xkU3VjYywgTmV3U3VjYz4gaW50byB0aGUKKy8vIERlbnNlTWFwLgorTWFjaGluZUJhc2ljQmxvY2sgKgorVGFyZ2V0TG93ZXJpbmc6OkVtaXRJbnN0cldpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdCB7CisjaWZuZGVmIE5ERUJVRworICBkYmdzKCkgPDwgIklmIGEgdGFyZ2V0IG1hcmtzIGFuIGluc3RydWN0aW9uIHdpdGggIgorICAgICAgICAgICIndXNlc0N1c3RvbUluc2VydGVyJywgaXQgbXVzdCBpbXBsZW1lbnQgIgorICAgICAgICAgICJUYXJnZXRMb3dlcmluZzo6RW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyISI7CisjZW5kaWYKKyAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb25EQUdJU2VsIGNvZGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NlbGVjdGlvbkRBR0lTZWw6OlNlbGVjdGlvbkRBR0lTZWwoY29uc3QgVGFyZ2V0TWFjaGluZSAmdG0sIENvZGVHZW5PcHQ6OkxldmVsIE9MKSA6CisgIE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpLCBUTSh0bSksIFRMSSgqdG0uZ2V0VGFyZ2V0TG93ZXJpbmcoKSksCisgIEZ1bmNJbmZvKG5ldyBGdW5jdGlvbkxvd2VyaW5nSW5mbyhUTEkpKSwKKyAgQ3VyREFHKG5ldyBTZWxlY3Rpb25EQUcodG0pKSwKKyAgU0RCKG5ldyBTZWxlY3Rpb25EQUdCdWlsZGVyKCpDdXJEQUcsICpGdW5jSW5mbywgT0wpKSwKKyAgT3B0TGV2ZWwoT0wpLAorICBEQUdTaXplKDApCit7fQorCitTZWxlY3Rpb25EQUdJU2VsOjp+U2VsZWN0aW9uREFHSVNlbCgpIHsKKyAgZGVsZXRlIFNEQjsKKyAgZGVsZXRlIEN1ckRBRzsKKyAgZGVsZXRlIEZ1bmNJbmZvOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0lTZWw6OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuYWRkUmVxdWlyZWQ8QWxpYXNBbmFseXNpcz4oKTsKKyAgQVUuYWRkUHJlc2VydmVkPEFsaWFzQW5hbHlzaXM+KCk7CisgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworfQorCisvLy8gRnVuY3Rpb25DYWxsc1NldEptcCAtIFJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBoYXMgYSBjYWxsIHRvIHNldGptcCBvcgorLy8vIG90aGVyIGZ1bmN0aW9uIHRoYXQgZ2NjIHJlY29nbml6ZXMgYXMgInJldHVybmluZyB0d2ljZSIuIFRoaXMgaXMgdXNlZCB0bworLy8vIGxpbWl0IGNvZGUtZ2VuIG9wdGltaXphdGlvbnMgb24gdGhlIG1hY2hpbmUgZnVuY3Rpb24uCisvLy8KKy8vLyBGSVhNRTogUmVtb3ZlIGFmdGVyIDxyZGFyOi8vcHJvYmxlbS84MDMxNzE0PiBpcyBmaXhlZC4KK3N0YXRpYyBib29sIEZ1bmN0aW9uQ2FsbHNTZXRKbXAoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgY29uc3QgTW9kdWxlICpNID0gRi0+Z2V0UGFyZW50KCk7CisgIHN0YXRpYyBjb25zdCBjaGFyICpSZXR1cm5zVHdpY2VGbnNbXSA9IHsKKyAgICAic2V0am1wIiwKKyAgICAic2lnc2V0am1wIiwKKyAgICAic2V0am1wX3N5c2NhbGwiLAorICAgICJzYXZlY3R4IiwKKyAgICAicXNldGptcCIsCisgICAgInZmb3JrIiwKKyAgICAiZ2V0Y29udGV4dCIKKyAgfTsKKyNkZWZpbmUgTlVNX1JFVFVSTlNfVFdJQ0VfRk5TIHNpemVvZihSZXR1cm5zVHdpY2VGbnMpIC8gc2l6ZW9mKGNvbnN0IGNoYXIgKikKKworICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgTlVNX1JFVFVSTlNfVFdJQ0VfRk5TOyArK0kpCisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uICpDYWxsZWUgPSBNLT5nZXRGdW5jdGlvbihSZXR1cm5zVHdpY2VGbnNbSV0pKSB7CisgICAgICBpZiAoIUNhbGxlZS0+dXNlX2VtcHR5KCkpCisgICAgICAgIGZvciAoVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvcgorICAgICAgICAgICAgICAgSSA9IENhbGxlZS0+dXNlX2JlZ2luKCksIEUgPSBDYWxsZWUtPnVzZV9lbmQoKTsKKyAgICAgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgICAgICBpZiAoY29uc3QgQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KCpJKSkKKyAgICAgICAgICAgIGlmIChDSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpID09IEYpCisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICByZXR1cm4gZmFsc2U7CisjdW5kZWYgTlVNX1JFVFVSTlNfVFdJQ0VfRk5TCit9CisKK2Jvb2wgU2VsZWN0aW9uREFHSVNlbDo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZtZikgeworICBjb25zdCBGdW5jdGlvbiAmRm4gPSAqbWYuZ2V0RnVuY3Rpb24oKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkgPSAqVE0uZ2V0SW5zdHJJbmZvKCk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJID0gKlRNLmdldFJlZ2lzdGVySW5mbygpOworCisgIE1GID0gJm1mOworICBSZWdJbmZvID0gJk1GLT5nZXRSZWdJbmZvKCk7CisgIEFBID0gJmdldEFuYWx5c2lzPEFsaWFzQW5hbHlzaXM+KCk7CisKKyAgREVCVUcoZGJncygpIDw8ICJcblxuXG49PT0gIiA8PCBGbi5nZXROYW1lKCkgPDwgIlxuIik7CisKKyAgQ3VyREFHLT5pbml0KCpNRik7CisgIEZ1bmNJbmZvLT5zZXQoRm4sICpNRik7CisgIFNEQi0+aW5pdCgqQUEpOworCisgIFNlbGVjdEFsbEJhc2ljQmxvY2tzKEZuKTsKKworICAvLyBJZiB0aGUgZmlyc3QgYmFzaWMgYmxvY2sgaW4gdGhlIGZ1bmN0aW9uIGhhcyBsaXZlIGlucyB0aGF0IG5lZWQgdG8gYmUKKyAgLy8gY29waWVkIGludG8gdnJlZ3MsIGVtaXQgdGhlIGNvcGllcyBpbnRvIHRoZSB0b3Agb2YgdGhlIGJsb2NrIGJlZm9yZQorICAvLyBlbWl0dGluZyB0aGUgY29kZSBmb3IgdGhlIGJsb2NrLgorICBNYWNoaW5lQmFzaWNCbG9jayAqRW50cnlNQkIgPSBNRi0+YmVnaW4oKTsKKyAgUmVnSW5mby0+RW1pdExpdmVJbkNvcGllcyhFbnRyeU1CQiwgVFJJLCBUSUkpOworCisgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gTGl2ZUluTWFwOworICBpZiAoIUZ1bmNJbmZvLT5BcmdEYmdWYWx1ZXMuZW1wdHkoKSkKKyAgICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OmxpdmVpbl9pdGVyYXRvciBMSSA9IFJlZ0luZm8tPmxpdmVpbl9iZWdpbigpLAorICAgICAgICAgICBFID0gUmVnSW5mby0+bGl2ZWluX2VuZCgpOyBMSSAhPSBFOyArK0xJKQorICAgICAgaWYgKExJLT5zZWNvbmQpIAorICAgICAgICBMaXZlSW5NYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKExJLT5maXJzdCwgTEktPnNlY29uZCkpOworCisgIC8vIEluc2VydCBEQkdfVkFMVUUgaW5zdHJ1Y3Rpb25zIGZvciBmdW5jdGlvbiBhcmd1bWVudHMgdG8gdGhlIGVudHJ5IGJsb2NrLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRnVuY0luZm8tPkFyZ0RiZ1ZhbHVlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZUluc3RyICpNSSA9IEZ1bmNJbmZvLT5BcmdEYmdWYWx1ZXNbZS1pLTFdOworICAgIHVuc2lnbmVkIFJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpKQorICAgICAgRW50cnlNQkItPmluc2VydChFbnRyeU1CQi0+YmVnaW4oKSwgTUkpOworICAgIGVsc2UgeworICAgICAgTWFjaGluZUluc3RyICpEZWYgPSBSZWdJbmZvLT5nZXRWUmVnRGVmKFJlZyk7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UG9zID0gRGVmOworICAgICAgLy8gRklYTUU6IFZSIGRlZiBtYXkgbm90IGJlIGluIGVudHJ5IGJsb2NrLgorICAgICAgRGVmLT5nZXRQYXJlbnQoKS0+aW5zZXJ0KGxsdm06Om5leHQoSW5zZXJ0UG9zKSwgTUkpOworICAgIH0KKworICAgIC8vIElmIFJlZyBpcyBsaXZlLWluIHRoZW4gdXBkYXRlIGRlYnVnIGluZm8gdG8gdHJhY2sgaXRzIGNvcHkgaW4gYSB2cmVnLgorICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD46Oml0ZXJhdG9yIExESSA9IExpdmVJbk1hcC5maW5kKFJlZyk7CisgICAgaWYgKExESSAhPSBMaXZlSW5NYXAuZW5kKCkpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqRGVmID0gUmVnSW5mby0+Z2V0VlJlZ0RlZihMREktPnNlY29uZCk7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UG9zID0gRGVmOworICAgICAgY29uc3QgTUROb2RlICpWYXJpYWJsZSA9IAorICAgICAgICBNSS0+Z2V0T3BlcmFuZChNSS0+Z2V0TnVtT3BlcmFuZHMoKS0xKS5nZXRNZXRhZGF0YSgpOworICAgICAgdW5zaWduZWQgT2Zmc2V0ID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCk7CisgICAgICAvLyBEZWYgaXMgbmV2ZXIgYSB0ZXJtaW5hdG9yIGhlcmUsIHNvIGl0IGlzIG9rIHRvIGluY3JlbWVudCBJbnNlcnRQb3MuCisgICAgICBCdWlsZE1JKCpFbnRyeU1CQiwgKytJbnNlcnRQb3MsIE1JLT5nZXREZWJ1Z0xvYygpLCAKKyAgICAgICAgICAgICAgVElJLmdldChUYXJnZXRPcGNvZGU6OkRCR19WQUxVRSkpCisgICAgICAgIC5hZGRSZWcoTERJLT5zZWNvbmQsIFJlZ1N0YXRlOjpEZWJ1ZykKKyAgICAgICAgLmFkZEltbShPZmZzZXQpLmFkZE1ldGFkYXRhKFZhcmlhYmxlKTsKKyAgICB9CisgIH0KKworICAvLyBEZXRlcm1pbmUgaWYgdGhlcmUgYXJlIGFueSBjYWxscyBpbiB0aGlzIG1hY2hpbmUgZnVuY3Rpb24uCisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLT5nZXRGcmFtZUluZm8oKTsKKyAgaWYgKCFNRkktPmhhc0NhbGxzKCkpIHsKKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgSSA9IE1GLT5iZWdpbigpLCBFID0gTUYtPmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IEk7CisgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgIElJID0gTUJCLT5iZWdpbigpLCBJRSA9IE1CQi0+ZW5kKCk7IElJICE9IElFOyArK0lJKSB7CisgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gVE0uZ2V0SW5zdHJJbmZvKCktPmdldChJSS0+Z2V0T3Bjb2RlKCkpOworCisgICAgICAgIC8vIE9wZXJhbmQgMSBvZiBhbiBpbmxpbmUgYXNtIGluc3RydWN0aW9uIGluZGljYXRlcyB3aGV0aGVyIHRoZSBhc20KKyAgICAgICAgLy8gbmVlZHMgc3RhY2sgb3Igbm90LgorICAgICAgICBpZiAoVElELmlzQ2FsbCgpICYmICFUSUQuaXNSZXR1cm4oKSkgeworICAgICAgICAgIE1GSS0+c2V0SGFzQ2FsbHModHJ1ZSk7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICBkb25lOjsKKyAgfQorCisgIC8vIERldGVybWluZSBpZiB0aGVyZSBpcyBhIGNhbGwgdG8gc2V0am1wIGluIHRoZSBtYWNoaW5lIGZ1bmN0aW9uLgorICBNRi0+c2V0Q2FsbHNTZXRKbXAoRnVuY3Rpb25DYWxsc1NldEptcCgmRm4pKTsKKworICAvLyBSZXBsYWNlIGZvcndhcmQtZGVjbGFyZWQgcmVnaXN0ZXJzIHdpdGggdGhlIHJlZ2lzdGVycyBjb250YWluaW5nCisgIC8vIHRoZSBkZXNpcmVkIHZhbHVlLgorICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkgPSBNRi0+Z2V0UmVnSW5mbygpOworICBmb3IgKERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD46Oml0ZXJhdG9yCisgICAgICAgSSA9IEZ1bmNJbmZvLT5SZWdGaXh1cHMuYmVnaW4oKSwgRSA9IEZ1bmNJbmZvLT5SZWdGaXh1cHMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICB1bnNpZ25lZCBGcm9tID0gSS0+Zmlyc3Q7CisgICAgdW5zaWduZWQgVG8gPSBJLT5zZWNvbmQ7CisgICAgLy8gSWYgVG8gaXMgYWxzbyBzY2hlZHVsZWQgdG8gYmUgcmVwbGFjZWQsIGZpbmQgd2hhdCBpdHMgdWx0aW1hdGUKKyAgICAvLyByZXBsYWNlbWVudCBpcy4KKyAgICBmb3IgKDs7KSB7CisgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+OjppdGVyYXRvciBKID0KKyAgICAgICAgRnVuY0luZm8tPlJlZ0ZpeHVwcy5maW5kKFRvKTsKKyAgICAgIGlmIChKID09IEUpIGJyZWFrOworICAgICAgVG8gPSBKLT5zZWNvbmQ7CisgICAgfQorICAgIC8vIFJlcGxhY2UgaXQuCisgICAgTVJJLnJlcGxhY2VSZWdXaXRoKEZyb20sIFRvKTsKKyAgfQorCisgIC8vIFJlbGVhc2UgZnVuY3Rpb24tc3BlY2lmaWMgc3RhdGUuIFNEQiBhbmQgQ3VyREFHIGFyZSBhbHJlYWR5IGNsZWFyZWQKKyAgLy8gYXQgdGhpcyBwb2ludC4KKyAgRnVuY0luZm8tPmNsZWFyKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQKK1NlbGVjdGlvbkRBR0lTZWw6OlNlbGVjdEJhc2ljQmxvY2soQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSGFkVGFpbENhbGwpIHsKKyAgLy8gTG93ZXIgYWxsIG9mIHRoZSBub24tdGVybWluYXRvciBpbnN0cnVjdGlvbnMuIElmIGEgY2FsbCBpcyBlbWl0dGVkCisgIC8vIGFzIGEgdGFpbCBjYWxsLCBjZWFzZSBlbWl0dGluZyBub2RlcyBmb3IgdGhpcyBibG9jay4gVGVybWluYXRvcnMKKyAgLy8gYXJlIGhhbmRsZWQgYmVsb3cuCisgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJlZ2luOyBJICE9IEVuZCAmJiAhU0RCLT5IYXNUYWlsQ2FsbDsgKytJKQorICAgIFNEQi0+dmlzaXQoKkkpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgcm9vdCBvZiB0aGUgREFHIGlzIHVwLXRvLWRhdGUuCisgIEN1ckRBRy0+c2V0Um9vdChTREItPmdldENvbnRyb2xSb290KCkpOworICBIYWRUYWlsQ2FsbCA9IFNEQi0+SGFzVGFpbENhbGw7CisgIFNEQi0+Y2xlYXIoKTsKKworICAvLyBGaW5hbCBzdGVwLCBlbWl0IHRoZSBsb3dlcmVkIERBRyBhcyBtYWNoaW5lIGNvZGUuCisgIENvZGVHZW5BbmRFbWl0REFHKCk7Cit9CisKK25hbWVzcGFjZSB7CisvLy8gV29ya0xpc3RSZW1vdmVyIC0gVGhpcyBjbGFzcyBpcyBhIERBR1VwZGF0ZUxpc3RlbmVyIHRoYXQgcmVtb3ZlcyBhbnkgZGVsZXRlZAorLy8vIG5vZGVzIGZyb20gdGhlIHdvcmtsaXN0LgorY2xhc3MgU0RPUHNXb3JrTGlzdFJlbW92ZXIgOiBwdWJsaWMgU2VsZWN0aW9uREFHOjpEQUdVcGRhdGVMaXN0ZW5lciB7CisgIFNtYWxsVmVjdG9yPFNETm9kZSosIDEyOD4gJldvcmtsaXN0OworICBTbWFsbFB0clNldDxTRE5vZGUqLCAxMjg+ICZJbldvcmtsaXN0OworcHVibGljOgorICBTRE9Qc1dvcmtMaXN0UmVtb3ZlcihTbWFsbFZlY3RvcjxTRE5vZGUqLCAxMjg+ICZ3bCwKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8U0ROb2RlKiwgMTI4PiAmaW53bCkKKyAgICA6IFdvcmtsaXN0KHdsKSwgSW5Xb3JrbGlzdChpbndsKSB7fQorCisgIHZvaWQgUmVtb3ZlRnJvbVdvcmtsaXN0KFNETm9kZSAqTikgeworICAgIGlmICghSW5Xb3JrbGlzdC5lcmFzZShOKSkgcmV0dXJuOworICAgIAorICAgIFNtYWxsVmVjdG9yPFNETm9kZSosIDEyOD46Oml0ZXJhdG9yIEkgPQorICAgIHN0ZDo6ZmluZChXb3JrbGlzdC5iZWdpbigpLCBXb3JrbGlzdC5lbmQoKSwgTik7CisgICAgYXNzZXJ0KEkgIT0gV29ya2xpc3QuZW5kKCkgJiYgIk5vdCBpbiB3b3JrbGlzdCIpOworICAgIAorICAgICpJID0gV29ya2xpc3QuYmFjaygpOworICAgIFdvcmtsaXN0LnBvcF9iYWNrKCk7CisgIH0KKyAgCisgIHZpcnR1YWwgdm9pZCBOb2RlRGVsZXRlZChTRE5vZGUgKk4sIFNETm9kZSAqRSkgeworICAgIFJlbW92ZUZyb21Xb3JrbGlzdChOKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBOb2RlVXBkYXRlZChTRE5vZGUgKk4pIHsKKyAgICAvLyBJZ25vcmUgdXBkYXRlcy4KKyAgfQorfTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdJU2VsOjpDb21wdXRlTGl2ZU91dFZSZWdJbmZvKCkgeworICBTbWFsbFB0clNldDxTRE5vZGUqLCAxMjg+IFZpc2l0ZWROb2RlczsKKyAgU21hbGxWZWN0b3I8U0ROb2RlKiwgMTI4PiBXb3JrbGlzdDsKKworICBXb3JrbGlzdC5wdXNoX2JhY2soQ3VyREFHLT5nZXRSb290KCkuZ2V0Tm9kZSgpKTsKKworICBBUEludCBNYXNrOworICBBUEludCBLbm93blplcm87CisgIEFQSW50IEtub3duT25lOworCisgIGRvIHsKKyAgICBTRE5vZGUgKk4gPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKworICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIG5vZGUsIGlnbm9yZSBpdC4KKyAgICBpZiAoIVZpc2l0ZWROb2Rlcy5pbnNlcnQoTikpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIE90aGVyd2lzZSwgYWRkIGFsbCBjaGFpbiBvcGVyYW5kcyB0byB0aGUgd29ya2xpc3QuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKE4tPmdldE9wZXJhbmQoaSkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpPdGhlcikKKyAgICAgICAgV29ya2xpc3QucHVzaF9iYWNrKE4tPmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpKTsKKworICAgIC8vIElmIHRoaXMgaXMgYSBDb3B5VG9SZWcgd2l0aCBhIHZyZWcgZGVzdCwgcHJvY2VzcyBpdC4KKyAgICBpZiAoTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpDb3B5VG9SZWcpCisgICAgICBjb250aW51ZTsKKworICAgIHVuc2lnbmVkIERlc3RSZWcgPSBjYXN0PFJlZ2lzdGVyU0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKS0+Z2V0UmVnKCk7CisgICAgaWYgKCFUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKERlc3RSZWcpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBJZ25vcmUgbm9uLXNjYWxhciBvciBub24taW50ZWdlciB2YWx1ZXMuCisgICAgU0RWYWx1ZSBTcmMgPSBOLT5nZXRPcGVyYW5kKDIpOworICAgIEVWVCBTcmNWVCA9IFNyYy5nZXRWYWx1ZVR5cGUoKTsKKyAgICBpZiAoIVNyY1ZULmlzSW50ZWdlcigpIHx8IFNyY1ZULmlzVmVjdG9yKCkpCisgICAgICBjb250aW51ZTsKKworICAgIHVuc2lnbmVkIE51bVNpZ25CaXRzID0gQ3VyREFHLT5Db21wdXRlTnVtU2lnbkJpdHMoU3JjKTsKKyAgICBNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShTcmNWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIEN1ckRBRy0+Q29tcHV0ZU1hc2tlZEJpdHMoU3JjLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lKTsKKworICAgIC8vIE9ubHkgaW5zdGFsbCB0aGlzIGluZm9ybWF0aW9uIGlmIGl0IHRlbGxzIHVzIHNvbWV0aGluZy4KKyAgICBpZiAoTnVtU2lnbkJpdHMgIT0gMSB8fCBLbm93blplcm8gIT0gMCB8fCBLbm93bk9uZSAhPSAwKSB7CisgICAgICBEZXN0UmVnIC09IFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXI7CisgICAgICBpZiAoRGVzdFJlZyA+PSBGdW5jSW5mby0+TGl2ZU91dFJlZ0luZm8uc2l6ZSgpKQorICAgICAgICBGdW5jSW5mby0+TGl2ZU91dFJlZ0luZm8ucmVzaXplKERlc3RSZWcrMSk7CisgICAgICBGdW5jdGlvbkxvd2VyaW5nSW5mbzo6TGl2ZU91dEluZm8gJkxPSSA9CisgICAgICAgIEZ1bmNJbmZvLT5MaXZlT3V0UmVnSW5mb1tEZXN0UmVnXTsKKyAgICAgIExPSS5OdW1TaWduQml0cyA9IE51bVNpZ25CaXRzOworICAgICAgTE9JLktub3duT25lID0gS25vd25PbmU7CisgICAgICBMT0kuS25vd25aZXJvID0gS25vd25aZXJvOworICAgIH0KKyAgfSB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0lTZWw6OkNvZGVHZW5BbmRFbWl0REFHKCkgeworICBzdGQ6OnN0cmluZyBHcm91cE5hbWU7CisgIGlmIChUaW1lUGFzc2VzSXNFbmFibGVkKQorICAgIEdyb3VwTmFtZSA9ICJJbnN0cnVjdGlvbiBTZWxlY3Rpb24gYW5kIFNjaGVkdWxpbmciOworICBzdGQ6OnN0cmluZyBCbG9ja05hbWU7CisgIGlmIChWaWV3REFHQ29tYmluZTEgfHwgVmlld0xlZ2FsaXplVHlwZXNEQUdzIHx8IFZpZXdMZWdhbGl6ZURBR3MgfHwKKyAgICAgIFZpZXdEQUdDb21iaW5lMiB8fCBWaWV3REFHQ29tYmluZUxUIHx8IFZpZXdJU2VsREFHcyB8fCBWaWV3U2NoZWREQUdzIHx8CisgICAgICBWaWV3U1VuaXREQUdzKQorICAgIEJsb2NrTmFtZSA9IE1GLT5nZXRGdW5jdGlvbigpLT5nZXROYW1lU3RyKCkgKyAiOiIgKworICAgICAgICAgICAgICAgIEZ1bmNJbmZvLT5NQkItPmdldEJhc2ljQmxvY2soKS0+Z2V0TmFtZVN0cigpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiSW5pdGlhbCBzZWxlY3Rpb24gREFHOlxuIjsgQ3VyREFHLT5kdW1wKCkpOworCisgIGlmIChWaWV3REFHQ29tYmluZTEpIEN1ckRBRy0+dmlld0dyYXBoKCJkYWctY29tYmluZTEgaW5wdXQgZm9yICIgKyBCbG9ja05hbWUpOworCisgIC8vIFJ1biB0aGUgREFHIGNvbWJpbmVyIGluIHByZS1sZWdhbGl6ZSBtb2RlLgorICB7CisgICAgTmFtZWRSZWdpb25UaW1lciBUKCJEQUcgQ29tYmluaW5nIDEiLCBHcm91cE5hbWUsIFRpbWVQYXNzZXNJc0VuYWJsZWQpOworICAgIEN1ckRBRy0+Q29tYmluZShVbnJlc3RyaWN0ZWQsICpBQSwgT3B0TGV2ZWwpOworICB9CisKKyAgREVCVUcoZGJncygpIDw8ICJPcHRpbWl6ZWQgbG93ZXJlZCBzZWxlY3Rpb24gREFHOlxuIjsgQ3VyREFHLT5kdW1wKCkpOworCisgIC8vIFNlY29uZCBzdGVwLCBoYWNrIG9uIHRoZSBEQUcgdW50aWwgaXQgb25seSB1c2VzIG9wZXJhdGlvbnMgYW5kIHR5cGVzIHRoYXQKKyAgLy8gdGhlIHRhcmdldCBzdXBwb3J0cy4KKyAgaWYgKFZpZXdMZWdhbGl6ZVR5cGVzREFHcykgQ3VyREFHLT52aWV3R3JhcGgoImxlZ2FsaXplLXR5cGVzIGlucHV0IGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tOYW1lKTsKKworICBib29sIENoYW5nZWQ7CisgIHsKKyAgICBOYW1lZFJlZ2lvblRpbWVyIFQoIlR5cGUgTGVnYWxpemF0aW9uIiwgR3JvdXBOYW1lLCBUaW1lUGFzc2VzSXNFbmFibGVkKTsKKyAgICBDaGFuZ2VkID0gQ3VyREFHLT5MZWdhbGl6ZVR5cGVzKCk7CisgIH0KKworICBERUJVRyhkYmdzKCkgPDwgIlR5cGUtbGVnYWxpemVkIHNlbGVjdGlvbiBEQUc6XG4iOyBDdXJEQUctPmR1bXAoKSk7CisKKyAgaWYgKENoYW5nZWQpIHsKKyAgICBpZiAoVmlld0RBR0NvbWJpbmVMVCkKKyAgICAgIEN1ckRBRy0+dmlld0dyYXBoKCJkYWctY29tYmluZS1sdCBpbnB1dCBmb3IgIiArIEJsb2NrTmFtZSk7CisKKyAgICAvLyBSdW4gdGhlIERBRyBjb21iaW5lciBpbiBwb3N0LXR5cGUtbGVnYWxpemUgbW9kZS4KKyAgICB7CisgICAgICBOYW1lZFJlZ2lvblRpbWVyIFQoIkRBRyBDb21iaW5pbmcgYWZ0ZXIgbGVnYWxpemUgdHlwZXMiLCBHcm91cE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVBhc3Nlc0lzRW5hYmxlZCk7CisgICAgICBDdXJEQUctPkNvbWJpbmUoTm9JbGxlZ2FsVHlwZXMsICpBQSwgT3B0TGV2ZWwpOworICAgIH0KKworICAgIERFQlVHKGRiZ3MoKSA8PCAiT3B0aW1pemVkIHR5cGUtbGVnYWxpemVkIHNlbGVjdGlvbiBEQUc6XG4iOworICAgICAgICAgIEN1ckRBRy0+ZHVtcCgpKTsKKyAgfQorCisgIHsKKyAgICBOYW1lZFJlZ2lvblRpbWVyIFQoIlZlY3RvciBMZWdhbGl6YXRpb24iLCBHcm91cE5hbWUsIFRpbWVQYXNzZXNJc0VuYWJsZWQpOworICAgIENoYW5nZWQgPSBDdXJEQUctPkxlZ2FsaXplVmVjdG9ycygpOworICB9CisKKyAgaWYgKENoYW5nZWQpIHsKKyAgICB7CisgICAgICBOYW1lZFJlZ2lvblRpbWVyIFQoIlR5cGUgTGVnYWxpemF0aW9uIDIiLCBHcm91cE5hbWUsIFRpbWVQYXNzZXNJc0VuYWJsZWQpOworICAgICAgQ3VyREFHLT5MZWdhbGl6ZVR5cGVzKCk7CisgICAgfQorCisgICAgaWYgKFZpZXdEQUdDb21iaW5lTFQpCisgICAgICBDdXJEQUctPnZpZXdHcmFwaCgiZGFnLWNvbWJpbmUtbHYgaW5wdXQgZm9yICIgKyBCbG9ja05hbWUpOworCisgICAgLy8gUnVuIHRoZSBEQUcgY29tYmluZXIgaW4gcG9zdC10eXBlLWxlZ2FsaXplIG1vZGUuCisgICAgeworICAgICAgTmFtZWRSZWdpb25UaW1lciBUKCJEQUcgQ29tYmluaW5nIGFmdGVyIGxlZ2FsaXplIHZlY3RvcnMiLCBHcm91cE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVBhc3Nlc0lzRW5hYmxlZCk7CisgICAgICBDdXJEQUctPkNvbWJpbmUoTm9JbGxlZ2FsT3BlcmF0aW9ucywgKkFBLCBPcHRMZXZlbCk7CisgICAgfQorCisgICAgREVCVUcoZGJncygpIDw8ICJPcHRpbWl6ZWQgdmVjdG9yLWxlZ2FsaXplZCBzZWxlY3Rpb24gREFHOlxuIjsKKyAgICAgICAgICBDdXJEQUctPmR1bXAoKSk7CisgIH0KKworICBpZiAoVmlld0xlZ2FsaXplREFHcykgQ3VyREFHLT52aWV3R3JhcGgoImxlZ2FsaXplIGlucHV0IGZvciAiICsgQmxvY2tOYW1lKTsKKworICB7CisgICAgTmFtZWRSZWdpb25UaW1lciBUKCJEQUcgTGVnYWxpemF0aW9uIiwgR3JvdXBOYW1lLCBUaW1lUGFzc2VzSXNFbmFibGVkKTsKKyAgICBDdXJEQUctPkxlZ2FsaXplKE9wdExldmVsKTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiTGVnYWxpemVkIHNlbGVjdGlvbiBEQUc6XG4iOyBDdXJEQUctPmR1bXAoKSk7CisKKyAgaWYgKFZpZXdEQUdDb21iaW5lMikgQ3VyREFHLT52aWV3R3JhcGgoImRhZy1jb21iaW5lMiBpbnB1dCBmb3IgIiArIEJsb2NrTmFtZSk7CisKKyAgLy8gUnVuIHRoZSBEQUcgY29tYmluZXIgaW4gcG9zdC1sZWdhbGl6ZSBtb2RlLgorICB7CisgICAgTmFtZWRSZWdpb25UaW1lciBUKCJEQUcgQ29tYmluaW5nIDIiLCBHcm91cE5hbWUsIFRpbWVQYXNzZXNJc0VuYWJsZWQpOworICAgIEN1ckRBRy0+Q29tYmluZShOb0lsbGVnYWxPcGVyYXRpb25zLCAqQUEsIE9wdExldmVsKTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiT3B0aW1pemVkIGxlZ2FsaXplZCBzZWxlY3Rpb24gREFHOlxuIjsgQ3VyREFHLT5kdW1wKCkpOworCisgIGlmIChPcHRMZXZlbCAhPSBDb2RlR2VuT3B0OjpOb25lKQorICAgIENvbXB1dGVMaXZlT3V0VlJlZ0luZm8oKTsKKworICBpZiAoVmlld0lTZWxEQUdzKSBDdXJEQUctPnZpZXdHcmFwaCgiaXNlbCBpbnB1dCBmb3IgIiArIEJsb2NrTmFtZSk7CisKKyAgLy8gVGhpcmQsIGluc3RydWN0aW9uIHNlbGVjdCBhbGwgb2YgdGhlIG9wZXJhdGlvbnMgdG8gbWFjaGluZSBjb2RlLCBhZGRpbmcgdGhlCisgIC8vIGNvZGUgdG8gdGhlIE1hY2hpbmVCYXNpY0Jsb2NrLgorICB7CisgICAgTmFtZWRSZWdpb25UaW1lciBUKCJJbnN0cnVjdGlvbiBTZWxlY3Rpb24iLCBHcm91cE5hbWUsIFRpbWVQYXNzZXNJc0VuYWJsZWQpOworICAgIERvSW5zdHJ1Y3Rpb25TZWxlY3Rpb24oKTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiU2VsZWN0ZWQgc2VsZWN0aW9uIERBRzpcbiI7IEN1ckRBRy0+ZHVtcCgpKTsKKworICBpZiAoVmlld1NjaGVkREFHcykgQ3VyREFHLT52aWV3R3JhcGgoInNjaGVkdWxlciBpbnB1dCBmb3IgIiArIEJsb2NrTmFtZSk7CisKKyAgLy8gU2NoZWR1bGUgbWFjaGluZSBjb2RlLgorICBTY2hlZHVsZURBR1NETm9kZXMgKlNjaGVkdWxlciA9IENyZWF0ZVNjaGVkdWxlcigpOworICB7CisgICAgTmFtZWRSZWdpb25UaW1lciBUKCJJbnN0cnVjdGlvbiBTY2hlZHVsaW5nIiwgR3JvdXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBUaW1lUGFzc2VzSXNFbmFibGVkKTsKKyAgICBTY2hlZHVsZXItPlJ1bihDdXJEQUcsIEZ1bmNJbmZvLT5NQkIsIEZ1bmNJbmZvLT5JbnNlcnRQdCk7CisgIH0KKworICBpZiAoVmlld1NVbml0REFHcykgU2NoZWR1bGVyLT52aWV3R3JhcGgoKTsKKworICAvLyBFbWl0IG1hY2hpbmUgY29kZSB0byBCQi4gIFRoaXMgY2FuIGNoYW5nZSAnQkInIHRvIHRoZSBsYXN0IGJsb2NrIGJlaW5nCisgIC8vIGluc2VydGVkIGludG8uCisgIHsKKyAgICBOYW1lZFJlZ2lvblRpbWVyIFQoIkluc3RydWN0aW9uIENyZWF0aW9uIiwgR3JvdXBOYW1lLCBUaW1lUGFzc2VzSXNFbmFibGVkKTsKKworICAgIEZ1bmNJbmZvLT5NQkIgPSBTY2hlZHVsZXItPkVtaXRTY2hlZHVsZSgpOworICAgIEZ1bmNJbmZvLT5JbnNlcnRQdCA9IFNjaGVkdWxlci0+SW5zZXJ0UG9zOworICB9CisKKyAgLy8gRnJlZSB0aGUgc2NoZWR1bGVyIHN0YXRlLgorICB7CisgICAgTmFtZWRSZWdpb25UaW1lciBUKCJJbnN0cnVjdGlvbiBTY2hlZHVsaW5nIENsZWFudXAiLCBHcm91cE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFRpbWVQYXNzZXNJc0VuYWJsZWQpOworICAgIGRlbGV0ZSBTY2hlZHVsZXI7CisgIH0KKworICAvLyBGcmVlIHRoZSBTZWxlY3Rpb25EQUcgc3RhdGUsIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkIHdpdGggaXQuCisgIEN1ckRBRy0+Y2xlYXIoKTsKK30KKwordm9pZCBTZWxlY3Rpb25EQUdJU2VsOjpEb0luc3RydWN0aW9uU2VsZWN0aW9uKCkgeworICBERUJVRyhlcnJzKCkgPDwgIj09PT09IEluc3RydWN0aW9uIHNlbGVjdGlvbiBiZWdpbnM6XG4iKTsKKworICBQcmVwcm9jZXNzSVNlbERBRygpOworICAKKyAgLy8gU2VsZWN0IHRhcmdldCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBEQUcuCisgIHsKKyAgICAvLyBOdW1iZXIgYWxsIG5vZGVzIHdpdGggYSB0b3BvbG9naWNhbCBvcmRlciBhbmQgc2V0IERBR1NpemUuCisgICAgREFHU2l6ZSA9IEN1ckRBRy0+QXNzaWduVG9wb2xvZ2ljYWxPcmRlcigpOworICAgIAorICAgIC8vIENyZWF0ZSBhIGR1bW15IG5vZGUgKHdoaWNoIGlzIG5vdCBhZGRlZCB0byBhbGxub2RlcyksIHRoYXQgYWRkcworICAgIC8vIGEgcmVmZXJlbmNlIHRvIHRoZSByb290IG5vZGUsIHByZXZlbnRpbmcgaXQgZnJvbSBiZWluZyBkZWxldGVkLAorICAgIC8vIGFuZCB0cmFja2luZyBhbnkgY2hhbmdlcyBvZiB0aGUgcm9vdC4KKyAgICBIYW5kbGVTRE5vZGUgRHVtbXkoQ3VyREFHLT5nZXRSb290KCkpOworICAgIElTZWxQb3NpdGlvbiA9IFNlbGVjdGlvbkRBRzo6YWxsbm9kZXNfaXRlcmF0b3IoQ3VyREFHLT5nZXRSb290KCkuZ2V0Tm9kZSgpKTsKKyAgICArK0lTZWxQb3NpdGlvbjsKKyAgICAKKyAgICAvLyBUaGUgQWxsTm9kZXMgbGlzdCBpcyBub3cgdG9wb2xvZ2ljYWwtc29ydGVkLiBWaXNpdCB0aGUKKyAgICAvLyBub2RlcyBieSBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0ICh0aGUgcm9vdCBvZiB0aGUKKyAgICAvLyBncmFwaCkgYW5kIHByZWNlZGluZyBiYWNrIHRvd2FyZCB0aGUgYmVnaW5uaW5nICh0aGUgZW50cnkKKyAgICAvLyBub2RlKS4KKyAgICB3aGlsZSAoSVNlbFBvc2l0aW9uICE9IEN1ckRBRy0+YWxsbm9kZXNfYmVnaW4oKSkgeworICAgICAgU0ROb2RlICpOb2RlID0gLS1JU2VsUG9zaXRpb247CisgICAgICAvLyBTa2lwIGRlYWQgbm9kZXMuIERBR0NvbWJpbmVyIGlzIGV4cGVjdGVkIHRvIGVsaW1pbmF0ZSBhbGwgZGVhZCBub2RlcywKKyAgICAgIC8vIGJ1dCB0aGVyZSBhcmUgY3VycmVudGx5IHNvbWUgY29ybmVyIGNhc2VzIHRoYXQgaXQgbWlzc2VzLiBBbHNvLCB0aGlzCisgICAgICAvLyBtYWtlcyBpdCB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIERBR0NvbWJpbmVyLgorICAgICAgaWYgKE5vZGUtPnVzZV9lbXB0eSgpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgU0ROb2RlICpSZXNOb2RlID0gU2VsZWN0KE5vZGUpOworICAgICAgCisgICAgICAvLyBGSVhNRTogVGhpcyBpcyBwcmV0dHkgZ3Jvc3MuICAnU2VsZWN0JyBzaG91bGQgYmUgY2hhbmdlZCB0byBub3QgcmV0dXJuCisgICAgICAvLyBhbnl0aGluZyBhdCBhbGwgYW5kIHRoaXMgY29kZSBzaG91bGQgYmUgbnVrZWQgd2l0aCBhIHRhY3RpY2FsIHN0cmlrZS4KKyAgICAgIAorICAgICAgLy8gSWYgbm9kZSBzaG91bGQgbm90IGJlIHJlcGxhY2VkLCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZS4KKyAgICAgIGlmIChSZXNOb2RlID09IE5vZGUgfHwgTm9kZS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpERUxFVEVEX05PREUpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gUmVwbGFjZSBub2RlLgorICAgICAgaWYgKFJlc05vZGUpCisgICAgICAgIFJlcGxhY2VVc2VzKE5vZGUsIFJlc05vZGUpOworICAgICAgCisgICAgICAvLyBJZiBhZnRlciB0aGUgcmVwbGFjZW1lbnQgdGhpcyBub2RlIGlzIG5vdCB1c2VkIGFueSBtb3JlLAorICAgICAgLy8gcmVtb3ZlIHRoaXMgZGVhZCBub2RlLgorICAgICAgaWYgKE5vZGUtPnVzZV9lbXB0eSgpKSB7IC8vIERvbid0IGRlbGV0ZSBFbnRyeVRva2VuLCBldGMuCisgICAgICAgIElTZWxVcGRhdGVyIElTVShJU2VsUG9zaXRpb24pOworICAgICAgICBDdXJEQUctPlJlbW92ZURlYWROb2RlKE5vZGUsICZJU1UpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBDdXJEQUctPnNldFJvb3QoRHVtbXkuZ2V0VmFsdWUoKSk7CisgIH0gICAgCisKKyAgREVCVUcoZXJycygpIDw8ICI9PT09PSBJbnN0cnVjdGlvbiBzZWxlY3Rpb24gZW5kczpcbiIpOworCisgIFBvc3Rwcm9jZXNzSVNlbERBRygpOworfQorCit2b2lkIFNlbGVjdGlvbkRBR0lTZWw6OlNlbGVjdEFsbEJhc2ljQmxvY2tzKGNvbnN0IEZ1bmN0aW9uICZGbikgeworICAvLyBJdGVyYXRlIG92ZXIgYWxsIGJhc2ljIGJsb2NrcyBpbiB0aGUgZnVuY3Rpb24uCisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEkgPSBGbi5iZWdpbigpLCBFID0gRm4uZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgQmFzaWNCbG9jayAqTExWTUJCID0gJipJOworICAgIEZ1bmNJbmZvLT5NQkIgPSBGdW5jSW5mby0+TUJCTWFwW0xMVk1CQl07CisgICAgRnVuY0luZm8tPkluc2VydFB0ID0gRnVuY0luZm8tPk1CQi0+Z2V0Rmlyc3ROb25QSEkoKTsKKworICAgIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IEJlZ2luID0gTExWTUJCLT5nZXRGaXJzdE5vblBISSgpOworICAgIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IEVuZCA9IExMVk1CQi0+ZW5kKCk7CisgICAgQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgQkkgPSBFbmQ7CisKKyAgICBGdW5jSW5mby0+SW5zZXJ0UHQgPSBGdW5jSW5mby0+TUJCLT5nZXRGaXJzdE5vblBISSgpOworICAgIAorICAgIC8vIExvd2VyIGFueSBhcmd1bWVudHMgbmVlZGVkIGluIHRoaXMgYmxvY2sgaWYgdGhpcyBpcyB0aGUgZW50cnkgYmxvY2suCisgICAgaWYgKExMVk1CQiA9PSAmRm4uZ2V0RW50cnlCbG9jaygpKQorICAgICAgTG93ZXJBcmd1bWVudHMoTExWTUJCKTsKKworICAgIC8vIFJ1biBTZWxlY3Rpb25EQUcgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIG9uIHRoZSByZW1haW5kZXIgb2YgdGhlIGJsb2NrCisgICAgLy8gbm90IGhhbmRsZWQgYnkgRmFzdElTZWwuIElmIEZhc3RJU2VsIGlzIG5vdCBydW4sIHRoaXMgaXMgdGhlIGVudGlyZQorICAgIC8vIGJsb2NrLgorICAgIGJvb2wgSGFkVGFpbENhbGw7CisgICAgU2VsZWN0QmFzaWNCbG9jayhCZWdpbiwgQkksIEhhZFRhaWxDYWxsKTsKKworICAgIEZpbmlzaEJhc2ljQmxvY2soKTsKKyAgICBGdW5jSW5mby0+UEhJTm9kZXNUb1VwZGF0ZS5jbGVhcigpOworICB9Cit9CisKK3ZvaWQKK1NlbGVjdGlvbkRBR0lTZWw6OkZpbmlzaEJhc2ljQmxvY2soKSB7CisKKyAgREVCVUcoZGJncygpIDw8ICJUb3RhbCBhbW91bnQgb2YgcGhpIG5vZGVzIHRvIHVwZGF0ZTogIgorICAgICAgICAgICAgICAgPDwgRnVuY0luZm8tPlBISU5vZGVzVG9VcGRhdGUuc2l6ZSgpIDw8ICJcbiI7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGdW5jSW5mby0+UEhJTm9kZXNUb1VwZGF0ZS5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIGRiZ3MoKSA8PCAiTm9kZSAiIDw8IGkgPDwgIiA6ICgiCisgICAgICAgICAgICAgICAgIDw8IEZ1bmNJbmZvLT5QSElOb2Rlc1RvVXBkYXRlW2ldLmZpcnN0CisgICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgRnVuY0luZm8tPlBISU5vZGVzVG9VcGRhdGVbaV0uc2Vjb25kIDw8ICIpXG4iKTsKKworICAvLyBOZXh0LCBub3cgdGhhdCB3ZSBrbm93IHdoYXQgdGhlIGxhc3QgTUJCIHRoZSBMTFZNIEJCIGV4cGFuZGVkIGlzLCB1cGRhdGUKKyAgLy8gUEhJIG5vZGVzIGluIHN1Y2Nlc3NvcnMuCisgIGlmIChTREItPlN3aXRjaENhc2VzLmVtcHR5KCkgJiYKKyAgICAgIFNEQi0+SlRDYXNlcy5lbXB0eSgpICYmCisgICAgICBTREItPkJpdFRlc3RDYXNlcy5lbXB0eSgpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZ1bmNJbmZvLT5QSElOb2Rlc1RvVXBkYXRlLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqUEhJID0gRnVuY0luZm8tPlBISU5vZGVzVG9VcGRhdGVbaV0uZmlyc3Q7CisgICAgICBhc3NlcnQoUEhJLT5pc1BISSgpICYmCisgICAgICAgICAgICAgIlRoaXMgaXMgbm90IGEgbWFjaGluZSBQSEkgbm9kZSB0aGF0IHdlIGFyZSB1cGRhdGluZyEiKTsKKyAgICAgIGlmICghRnVuY0luZm8tPk1CQi0+aXNTdWNjZXNzb3IoUEhJLT5nZXRQYXJlbnQoKSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgUEhJLT5hZGRPcGVyYW5kKAorICAgICAgICBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKEZ1bmNJbmZvLT5QSElOb2Rlc1RvVXBkYXRlW2ldLnNlY29uZCwgZmFsc2UpKTsKKyAgICAgIFBISS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTUJCKEZ1bmNJbmZvLT5NQkIpKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNEQi0+Qml0VGVzdENhc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAvLyBMb3dlciBoZWFkZXIgZmlyc3QsIGlmIGl0IHdhc24ndCBhbHJlYWR5IGxvd2VyZWQKKyAgICBpZiAoIVNEQi0+Qml0VGVzdENhc2VzW2ldLkVtaXR0ZWQpIHsKKyAgICAgIC8vIFNldCB0aGUgY3VycmVudCBiYXNpYyBibG9jayB0byB0aGUgbWJiIHdlIHdpc2ggdG8gaW5zZXJ0IHRoZSBjb2RlIGludG8KKyAgICAgIEZ1bmNJbmZvLT5NQkIgPSBTREItPkJpdFRlc3RDYXNlc1tpXS5QYXJlbnQ7CisgICAgICBGdW5jSW5mby0+SW5zZXJ0UHQgPSBGdW5jSW5mby0+TUJCLT5lbmQoKTsKKyAgICAgIC8vIEVtaXQgdGhlIGNvZGUKKyAgICAgIFNEQi0+dmlzaXRCaXRUZXN0SGVhZGVyKFNEQi0+Qml0VGVzdENhc2VzW2ldLCBGdW5jSW5mby0+TUJCKTsKKyAgICAgIEN1ckRBRy0+c2V0Um9vdChTREItPmdldFJvb3QoKSk7CisgICAgICBTREItPmNsZWFyKCk7CisgICAgICBDb2RlR2VuQW5kRW1pdERBRygpOworICAgIH0KKworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVqID0gU0RCLT5CaXRUZXN0Q2FzZXNbaV0uQ2FzZXMuc2l6ZSgpOyBqICE9IGVqOyArK2opIHsKKyAgICAgIC8vIFNldCB0aGUgY3VycmVudCBiYXNpYyBibG9jayB0byB0aGUgbWJiIHdlIHdpc2ggdG8gaW5zZXJ0IHRoZSBjb2RlIGludG8KKyAgICAgIEZ1bmNJbmZvLT5NQkIgPSBTREItPkJpdFRlc3RDYXNlc1tpXS5DYXNlc1tqXS5UaGlzQkI7CisgICAgICBGdW5jSW5mby0+SW5zZXJ0UHQgPSBGdW5jSW5mby0+TUJCLT5lbmQoKTsKKyAgICAgIC8vIEVtaXQgdGhlIGNvZGUKKyAgICAgIGlmIChqKzEgIT0gZWopCisgICAgICAgIFNEQi0+dmlzaXRCaXRUZXN0Q2FzZShTREItPkJpdFRlc3RDYXNlc1tpXS5DYXNlc1tqKzFdLlRoaXNCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEQi0+Qml0VGVzdENhc2VzW2ldLlJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEQi0+Qml0VGVzdENhc2VzW2ldLkNhc2VzW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY0luZm8tPk1CQik7CisgICAgICBlbHNlCisgICAgICAgIFNEQi0+dmlzaXRCaXRUZXN0Q2FzZShTREItPkJpdFRlc3RDYXNlc1tpXS5EZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RCLT5CaXRUZXN0Q2FzZXNbaV0uUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RCLT5CaXRUZXN0Q2FzZXNbaV0uQ2FzZXNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jSW5mby0+TUJCKTsKKworCisgICAgICBDdXJEQUctPnNldFJvb3QoU0RCLT5nZXRSb290KCkpOworICAgICAgU0RCLT5jbGVhcigpOworICAgICAgQ29kZUdlbkFuZEVtaXREQUcoKTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgUEhJIE5vZGVzCisgICAgZm9yICh1bnNpZ25lZCBwaSA9IDAsIHBlID0gRnVuY0luZm8tPlBISU5vZGVzVG9VcGRhdGUuc2l6ZSgpOworICAgICAgICAgcGkgIT0gcGU7ICsrcGkpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqUEhJID0gRnVuY0luZm8tPlBISU5vZGVzVG9VcGRhdGVbcGldLmZpcnN0OworICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlBISUJCID0gUEhJLT5nZXRQYXJlbnQoKTsKKyAgICAgIGFzc2VydChQSEktPmlzUEhJKCkgJiYKKyAgICAgICAgICAgICAiVGhpcyBpcyBub3QgYSBtYWNoaW5lIFBISSBub2RlIHRoYXQgd2UgYXJlIHVwZGF0aW5nISIpOworICAgICAgLy8gVGhpcyBpcyAiZGVmYXVsdCIgQkIuIFdlIGhhdmUgdHdvIGp1bXBzIHRvIGl0LiBGcm9tICJoZWFkZXIiIEJCIGFuZAorICAgICAgLy8gZnJvbSBsYXN0ICJjYXNlIiBCQi4KKyAgICAgIGlmIChQSElCQiA9PSBTREItPkJpdFRlc3RDYXNlc1tpXS5EZWZhdWx0KSB7CisgICAgICAgIFBISS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6CisgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZWcoRnVuY0luZm8tPlBISU5vZGVzVG9VcGRhdGVbcGldLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworICAgICAgICBQSEktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZU1CQihTREItPkJpdFRlc3RDYXNlc1tpXS5QYXJlbnQpKTsKKyAgICAgICAgUEhJLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjoKKyAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVJlZyhGdW5jSW5mby0+UEhJTm9kZXNUb1VwZGF0ZVtwaV0uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisgICAgICAgIFBISS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTUJCKFNEQi0+Qml0VGVzdENhc2VzW2ldLkNhc2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKCkuVGhpc0JCKSk7CisgICAgICB9CisgICAgICAvLyBPbmUgb2YgImNhc2VzIiBCQi4KKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVqID0gU0RCLT5CaXRUZXN0Q2FzZXNbaV0uQ2FzZXMuc2l6ZSgpOworICAgICAgICAgICBqICE9IGVqOyArK2opIHsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIGNCQiA9IFNEQi0+Qml0VGVzdENhc2VzW2ldLkNhc2VzW2pdLlRoaXNCQjsKKyAgICAgICAgaWYgKGNCQi0+aXNTdWNjZXNzb3IoUEhJQkIpKSB7CisgICAgICAgICAgUEhJLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUmVnKEZ1bmNJbmZvLT5QSElOb2Rlc1RvVXBkYXRlW3BpXS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworICAgICAgICAgIFBISS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTUJCKGNCQikpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIFNEQi0+Qml0VGVzdENhc2VzLmNsZWFyKCk7CisKKyAgLy8gSWYgdGhlIEp1bXBUYWJsZSByZWNvcmQgaXMgZmlsbGVkIGluLCB0aGVuIHdlIG5lZWQgdG8gZW1pdCBhIGp1bXAgdGFibGUuCisgIC8vIFVwZGF0aW5nIHRoZSBQSEkgbm9kZXMgaXMgdHJpY2t5IGluIHRoaXMgY2FzZSwgc2luY2Ugd2UgbmVlZCB0byBkZXRlcm1pbmUKKyAgLy8gd2hldGhlciB0aGUgUEhJIGlzIGEgc3VjY2Vzc29yIG9mIHRoZSByYW5nZSBjaGVjayBNQkIgb3IgdGhlIGp1bXAgdGFibGUgTUJCCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTREItPkpUQ2FzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIC8vIExvd2VyIGhlYWRlciBmaXJzdCwgaWYgaXQgd2Fzbid0IGFscmVhZHkgbG93ZXJlZAorICAgIGlmICghU0RCLT5KVENhc2VzW2ldLmZpcnN0LkVtaXR0ZWQpIHsKKyAgICAgIC8vIFNldCB0aGUgY3VycmVudCBiYXNpYyBibG9jayB0byB0aGUgbWJiIHdlIHdpc2ggdG8gaW5zZXJ0IHRoZSBjb2RlIGludG8KKyAgICAgIEZ1bmNJbmZvLT5NQkIgPSBTREItPkpUQ2FzZXNbaV0uZmlyc3QuSGVhZGVyQkI7CisgICAgICBGdW5jSW5mby0+SW5zZXJ0UHQgPSBGdW5jSW5mby0+TUJCLT5lbmQoKTsKKyAgICAgIC8vIEVtaXQgdGhlIGNvZGUKKyAgICAgIFNEQi0+dmlzaXRKdW1wVGFibGVIZWFkZXIoU0RCLT5KVENhc2VzW2ldLnNlY29uZCwgU0RCLT5KVENhc2VzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jSW5mby0+TUJCKTsKKyAgICAgIEN1ckRBRy0+c2V0Um9vdChTREItPmdldFJvb3QoKSk7CisgICAgICBTREItPmNsZWFyKCk7CisgICAgICBDb2RlR2VuQW5kRW1pdERBRygpOworICAgIH0KKworICAgIC8vIFNldCB0aGUgY3VycmVudCBiYXNpYyBibG9jayB0byB0aGUgbWJiIHdlIHdpc2ggdG8gaW5zZXJ0IHRoZSBjb2RlIGludG8KKyAgICBGdW5jSW5mby0+TUJCID0gU0RCLT5KVENhc2VzW2ldLnNlY29uZC5NQkI7CisgICAgRnVuY0luZm8tPkluc2VydFB0ID0gRnVuY0luZm8tPk1CQi0+ZW5kKCk7CisgICAgLy8gRW1pdCB0aGUgY29kZQorICAgIFNEQi0+dmlzaXRKdW1wVGFibGUoU0RCLT5KVENhc2VzW2ldLnNlY29uZCk7CisgICAgQ3VyREFHLT5zZXRSb290KFNEQi0+Z2V0Um9vdCgpKTsKKyAgICBTREItPmNsZWFyKCk7CisgICAgQ29kZUdlbkFuZEVtaXREQUcoKTsKKworICAgIC8vIFVwZGF0ZSBQSEkgTm9kZXMKKyAgICBmb3IgKHVuc2lnbmVkIHBpID0gMCwgcGUgPSBGdW5jSW5mby0+UEhJTm9kZXNUb1VwZGF0ZS5zaXplKCk7CisgICAgICAgICBwaSAhPSBwZTsgKytwaSkgeworICAgICAgTWFjaGluZUluc3RyICpQSEkgPSBGdW5jSW5mby0+UEhJTm9kZXNUb1VwZGF0ZVtwaV0uZmlyc3Q7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUEhJQkIgPSBQSEktPmdldFBhcmVudCgpOworICAgICAgYXNzZXJ0KFBISS0+aXNQSEkoKSAmJgorICAgICAgICAgICAgICJUaGlzIGlzIG5vdCBhIG1hY2hpbmUgUEhJIG5vZGUgdGhhdCB3ZSBhcmUgdXBkYXRpbmchIik7CisgICAgICAvLyAiZGVmYXVsdCIgQkIuIFdlIGNhbiBnbyB0aGVyZSBvbmx5IGZyb20gaGVhZGVyIEJCLgorICAgICAgaWYgKFBISUJCID09IFNEQi0+SlRDYXNlc1tpXS5zZWNvbmQuRGVmYXVsdCkgeworICAgICAgICBQSEktPmFkZE9wZXJhbmQKKyAgICAgICAgICAoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhGdW5jSW5mby0+UEhJTm9kZXNUb1VwZGF0ZVtwaV0uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisgICAgICAgIFBISS0+YWRkT3BlcmFuZAorICAgICAgICAgIChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTUJCKFNEQi0+SlRDYXNlc1tpXS5maXJzdC5IZWFkZXJCQikpOworICAgICAgfQorICAgICAgLy8gSlQgQkIuIEp1c3QgaXRlcmF0ZSBvdmVyIHN1Y2Nlc3NvcnMgaGVyZQorICAgICAgaWYgKEZ1bmNJbmZvLT5NQkItPmlzU3VjY2Vzc29yKFBISUJCKSkgeworICAgICAgICBQSEktPmFkZE9wZXJhbmQKKyAgICAgICAgICAoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhGdW5jSW5mby0+UEhJTm9kZXNUb1VwZGF0ZVtwaV0uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisgICAgICAgIFBISS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTUJCKEZ1bmNJbmZvLT5NQkIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgU0RCLT5KVENhc2VzLmNsZWFyKCk7CisKKyAgLy8gSWYgdGhlIHN3aXRjaCBibG9jayBpbnZvbHZlZCBhIGJyYW5jaCB0byBvbmUgb2YgdGhlIGFjdHVhbCBzdWNjZXNzb3JzLCB3ZQorICAvLyBuZWVkIHRvIHVwZGF0ZSBQSEkgbm9kZXMgaW4gdGhhdCBibG9jay4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZ1bmNJbmZvLT5QSElOb2Rlc1RvVXBkYXRlLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lSW5zdHIgKlBISSA9IEZ1bmNJbmZvLT5QSElOb2Rlc1RvVXBkYXRlW2ldLmZpcnN0OworICAgIGFzc2VydChQSEktPmlzUEhJKCkgJiYKKyAgICAgICAgICAgIlRoaXMgaXMgbm90IGEgbWFjaGluZSBQSEkgbm9kZSB0aGF0IHdlIGFyZSB1cGRhdGluZyEiKTsKKyAgICBpZiAoRnVuY0luZm8tPk1CQi0+aXNTdWNjZXNzb3IoUEhJLT5nZXRQYXJlbnQoKSkpIHsKKyAgICAgIFBISS0+YWRkT3BlcmFuZCgKKyAgICAgICAgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhGdW5jSW5mby0+UEhJTm9kZXNUb1VwZGF0ZVtpXS5zZWNvbmQsIGZhbHNlKSk7CisgICAgICBQSEktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZU1CQihGdW5jSW5mby0+TUJCKSk7CisgICAgfQorICB9CisKKyAgLy8gSWYgd2UgZ2VuZXJhdGVkIGFueSBzd2l0Y2ggbG93ZXJpbmcgaW5mb3JtYXRpb24sIGJ1aWxkIGFuZCBjb2RlZ2VuIGFueQorICAvLyBhZGRpdGlvbmFsIERBR3MgbmVjZXNzYXJ5LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU0RCLT5Td2l0Y2hDYXNlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gU2V0IHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrIHRvIHRoZSBtYmIgd2Ugd2lzaCB0byBpbnNlcnQgdGhlIGNvZGUgaW50bworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUaGlzQkIgPSBGdW5jSW5mby0+TUJCID0gU0RCLT5Td2l0Y2hDYXNlc1tpXS5UaGlzQkI7CisgICAgRnVuY0luZm8tPkluc2VydFB0ID0gRnVuY0luZm8tPk1CQi0+ZW5kKCk7CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHVuaXF1ZSBzdWNjZXNzb3JzLgorICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICosIDI+IFN1Y2NzOworICAgIFN1Y2NzLnB1c2hfYmFjayhTREItPlN3aXRjaENhc2VzW2ldLlRydWVCQik7CisgICAgaWYgKFNEQi0+U3dpdGNoQ2FzZXNbaV0uVHJ1ZUJCICE9IFNEQi0+U3dpdGNoQ2FzZXNbaV0uRmFsc2VCQikKKyAgICAgIFN1Y2NzLnB1c2hfYmFjayhTREItPlN3aXRjaENhc2VzW2ldLkZhbHNlQkIpOworCisgICAgLy8gRW1pdCB0aGUgY29kZS4gTm90ZSB0aGF0IHRoaXMgY291bGQgcmVzdWx0IGluIFRoaXNCQiBiZWluZyBzcGxpdCwgc28KKyAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzLgorICAgIFNEQi0+dmlzaXRTd2l0Y2hDYXNlKFNEQi0+U3dpdGNoQ2FzZXNbaV0sIEZ1bmNJbmZvLT5NQkIpOworICAgIEN1ckRBRy0+c2V0Um9vdChTREItPmdldFJvb3QoKSk7CisgICAgU0RCLT5jbGVhcigpOworICAgIENvZGVHZW5BbmRFbWl0REFHKCk7CisgICAgVGhpc0JCID0gRnVuY0luZm8tPk1CQjsKKworICAgIC8vIEhhbmRsZSBhbnkgUEhJIG5vZGVzIGluIHN1Y2Nlc3NvcnMgb2YgdGhpcyBjaHVuaywgYXMgaWYgd2Ugd2VyZSBjb21pbmcKKyAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBCQiBiZWZvcmUgc3dpdGNoIGV4cGFuc2lvbi4gIE5vdGUgdGhhdCBQSEkgbm9kZXMgY2FuCisgICAgLy8gb2NjdXIgbXVsdGlwbGUgdGltZXMgaW4gUEhJTm9kZXNUb1VwZGF0ZS4gIFdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHRvCisgICAgLy8gaGFuZGxlIHRoZW0gdGhlIHJpZ2h0IG51bWJlciBvZiB0aW1lcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3VjY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgRnVuY0luZm8tPk1CQiA9IFN1Y2NzW2ldOworICAgICAgRnVuY0luZm8tPkluc2VydFB0ID0gRnVuY0luZm8tPk1CQi0+ZW5kKCk7CisgICAgICAvLyBGdW5jSW5mby0+TUJCIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBDRkcgaWYgYSBicmFuY2ggd2FzCisgICAgICAvLyBjb25zdGFudCBmb2xkZWQuCisgICAgICBpZiAoVGhpc0JCLT5pc1N1Y2Nlc3NvcihGdW5jSW5mby0+TUJCKSkgeworICAgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBQaGkgPSBGdW5jSW5mby0+TUJCLT5iZWdpbigpOworICAgICAgICAgICAgIFBoaSAhPSBGdW5jSW5mby0+TUJCLT5lbmQoKSAmJiBQaGktPmlzUEhJKCk7CisgICAgICAgICAgICAgKytQaGkpIHsKKyAgICAgICAgICAvLyBUaGlzIHZhbHVlIGZvciB0aGlzIFBISSBub2RlIGlzIHJlY29yZGVkIGluIFBISU5vZGVzVG9VcGRhdGUuCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBwbiA9IDA7IDsgKytwbikgeworICAgICAgICAgICAgYXNzZXJ0KHBuICE9IEZ1bmNJbmZvLT5QSElOb2Rlc1RvVXBkYXRlLnNpemUoKSAmJgorICAgICAgICAgICAgICAgICAgICJEaWRuJ3QgZmluZCBQSEkgZW50cnkhIik7CisgICAgICAgICAgICBpZiAoRnVuY0luZm8tPlBISU5vZGVzVG9VcGRhdGVbcG5dLmZpcnN0ID09IFBoaSkgeworICAgICAgICAgICAgICBQaGktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUmVnKEZ1bmNJbmZvLT5QSElOb2Rlc1RvVXBkYXRlW3BuXS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKTsKKyAgICAgICAgICAgICAgUGhpLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVNQkIoVGhpc0JCKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBTREItPlN3aXRjaENhc2VzLmNsZWFyKCk7Cit9CisKKworLy8vIENyZWF0ZSB0aGUgc2NoZWR1bGVyLiBJZiBhIHNwZWNpZmljIHNjaGVkdWxlciB3YXMgc3BlY2lmaWVkCisvLy8gdmlhIHRoZSBTY2hlZHVsZXJSZWdpc3RyeSwgdXNlIGl0LCBvdGhlcndpc2Ugc2VsZWN0IHRoZQorLy8vIG9uZSBwcmVmZXJyZWQgYnkgdGhlIHRhcmdldC4KKy8vLworU2NoZWR1bGVEQUdTRE5vZGVzICpTZWxlY3Rpb25EQUdJU2VsOjpDcmVhdGVTY2hlZHVsZXIoKSB7CisgIFJlZ2lzdGVyU2NoZWR1bGVyOjpGdW5jdGlvblBhc3NDdG9yIEN0b3IgPSBSZWdpc3RlclNjaGVkdWxlcjo6Z2V0RGVmYXVsdCgpOworCisgIGlmICghQ3RvcikgeworICAgIEN0b3IgPSBJU0hldXJpc3RpYzsKKyAgICBSZWdpc3RlclNjaGVkdWxlcjo6c2V0RGVmYXVsdChDdG9yKTsKKyAgfQorCisgIHJldHVybiBDdG9yKHRoaXMsIE9wdExldmVsKTsKK30KKworU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICpTZWxlY3Rpb25EQUdJU2VsOjpDcmVhdGVUYXJnZXRIYXphcmRSZWNvZ25pemVyKCkgeworICByZXR1cm4gbmV3IFNjaGVkdWxlSGF6YXJkUmVjb2duaXplcigpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSGVscGVyIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkIGJ5IHRibGdlbi4KKworLy8vIENoZWNrQW5kTWFzayAtIFRoZSBpc2VsIGlzIHRyeWluZyB0byBtYXRjaCBzb21ldGhpbmcgbGlrZSAoYW5kIFgsIDI1NSkuICBJZgorLy8vIHRoZSBkYWcgY29tYmluZXIgc2ltcGxpZmllZCB0aGUgMjU1LCB3ZSBzdGlsbCB3YW50IHRvIG1hdGNoLiAgUkhTIGlzIHRoZQorLy8vIGFjdHVhbCB2YWx1ZSBpbiB0aGUgREFHIG9uIHRoZSBSSFMgb2YgYW4gQU5ELCBhbmQgRGVzaXJlZE1hc2tTIGlzIHRoZSB2YWx1ZQorLy8vIHNwZWNpZmllZCBpbiB0aGUgLnRkIGZpbGUgKGUuZy4gMjU1KS4KK2Jvb2wgU2VsZWN0aW9uREFHSVNlbDo6Q2hlY2tBbmRNYXNrKFNEVmFsdWUgTEhTLCBDb25zdGFudFNETm9kZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBEZXNpcmVkTWFza1MpIGNvbnN0IHsKKyAgY29uc3QgQVBJbnQgJkFjdHVhbE1hc2sgPSBSSFMtPmdldEFQSW50VmFsdWUoKTsKKyAgY29uc3QgQVBJbnQgJkRlc2lyZWRNYXNrID0gQVBJbnQoTEhTLmdldFZhbHVlU2l6ZUluQml0cygpLCBEZXNpcmVkTWFza1MpOworCisgIC8vIElmIHRoZSBhY3R1YWwgbWFzayBleGFjdGx5IG1hdGNoZXMsIHN1Y2Nlc3MhCisgIGlmIChBY3R1YWxNYXNrID09IERlc2lyZWRNYXNrKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIElmIHRoZSBhY3R1YWwgQU5EIG1hc2sgaXMgYWxsb3dpbmcgdW5hbGxvd2VkIGJpdHMsIHRoaXMgZG9lc24ndCBtYXRjaC4KKyAgaWYgKEFjdHVhbE1hc2suaW50ZXJzZWN0cyh+RGVzaXJlZE1hc2spKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBPdGhlcndpc2UsIHRoZSBEQUcgQ29tYmluZXIgbWF5IGhhdmUgcHJvdmVuIHRoYXQgdGhlIHZhbHVlIGNvbWluZyBpbiBpcworICAvLyBlaXRoZXIgYWxyZWFkeSB6ZXJvIG9yIGlzIG5vdCBkZW1hbmRlZC4gIENoZWNrIGZvciBrbm93biB6ZXJvIGlucHV0IGJpdHMuCisgIEFQSW50IE5lZWRlZE1hc2sgPSBEZXNpcmVkTWFzayAmIH5BY3R1YWxNYXNrOworICBpZiAoQ3VyREFHLT5NYXNrZWRWYWx1ZUlzWmVybyhMSFMsIE5lZWRlZE1hc2spKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFRPRE86IGNoZWNrIHRvIHNlZSBpZiBtaXNzaW5nIGJpdHMgYXJlIGp1c3Qgbm90IGRlbWFuZGVkLgorCisgIC8vIE90aGVyd2lzZSwgdGhpcyBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2guCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIENoZWNrT3JNYXNrIC0gVGhlIGlzZWwgaXMgdHJ5aW5nIHRvIG1hdGNoIHNvbWV0aGluZyBsaWtlIChvciBYLCAyNTUpLiAgSWYKKy8vLyB0aGUgZGFnIGNvbWJpbmVyIHNpbXBsaWZpZWQgdGhlIDI1NSwgd2Ugc3RpbGwgd2FudCB0byBtYXRjaC4gIFJIUyBpcyB0aGUKKy8vLyBhY3R1YWwgdmFsdWUgaW4gdGhlIERBRyBvbiB0aGUgUkhTIG9mIGFuIE9SLCBhbmQgRGVzaXJlZE1hc2tTIGlzIHRoZSB2YWx1ZQorLy8vIHNwZWNpZmllZCBpbiB0aGUgLnRkIGZpbGUgKGUuZy4gMjU1KS4KK2Jvb2wgU2VsZWN0aW9uREFHSVNlbDo6Q2hlY2tPck1hc2soU0RWYWx1ZSBMSFMsIENvbnN0YW50U0ROb2RlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgRGVzaXJlZE1hc2tTKSBjb25zdCB7CisgIGNvbnN0IEFQSW50ICZBY3R1YWxNYXNrID0gUkhTLT5nZXRBUEludFZhbHVlKCk7CisgIGNvbnN0IEFQSW50ICZEZXNpcmVkTWFzayA9IEFQSW50KExIUy5nZXRWYWx1ZVNpemVJbkJpdHMoKSwgRGVzaXJlZE1hc2tTKTsKKworICAvLyBJZiB0aGUgYWN0dWFsIG1hc2sgZXhhY3RseSBtYXRjaGVzLCBzdWNjZXNzIQorICBpZiAoQWN0dWFsTWFzayA9PSBEZXNpcmVkTWFzaykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiB0aGUgYWN0dWFsIEFORCBtYXNrIGlzIGFsbG93aW5nIHVuYWxsb3dlZCBiaXRzLCB0aGlzIGRvZXNuJ3QgbWF0Y2guCisgIGlmIChBY3R1YWxNYXNrLmludGVyc2VjdHMofkRlc2lyZWRNYXNrKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gT3RoZXJ3aXNlLCB0aGUgREFHIENvbWJpbmVyIG1heSBoYXZlIHByb3ZlbiB0aGF0IHRoZSB2YWx1ZSBjb21pbmcgaW4gaXMKKyAgLy8gZWl0aGVyIGFscmVhZHkgemVybyBvciBpcyBub3QgZGVtYW5kZWQuICBDaGVjayBmb3Iga25vd24gemVybyBpbnB1dCBiaXRzLgorICBBUEludCBOZWVkZWRNYXNrID0gRGVzaXJlZE1hc2sgJiB+QWN0dWFsTWFzazsKKworICBBUEludCBLbm93blplcm8sIEtub3duT25lOworICBDdXJEQUctPkNvbXB1dGVNYXNrZWRCaXRzKExIUywgTmVlZGVkTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSk7CisKKyAgLy8gSWYgYWxsIHRoZSBtaXNzaW5nIGJpdHMgaW4gdGhlIG9yIGFyZSBhbHJlYWR5IGtub3duIHRvIGJlIHNldCwgbWF0Y2ghCisgIGlmICgoTmVlZGVkTWFzayAmIEtub3duT25lKSA9PSBOZWVkZWRNYXNrKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFRPRE86IGNoZWNrIHRvIHNlZSBpZiBtaXNzaW5nIGJpdHMgYXJlIGp1c3Qgbm90IGRlbWFuZGVkLgorCisgIC8vIE90aGVyd2lzZSwgdGhpcyBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2guCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZHMgLSBDYWxscyB0byB0aGlzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorLy8vIGJ5IHRibGdlbi4gIE90aGVycyBzaG91bGQgbm90IGNhbGwgaXQuCit2b2lkIFNlbGVjdGlvbkRBR0lTZWw6OgorU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZHMoc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gJk9wcykgeworICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiBJbk9wczsKKyAgc3RkOjpzd2FwKEluT3BzLCBPcHMpOworCisgIE9wcy5wdXNoX2JhY2soSW5PcHNbSW5saW5lQXNtOjpPcF9JbnB1dENoYWluXSk7IC8vIDAKKyAgT3BzLnB1c2hfYmFjayhJbk9wc1tJbmxpbmVBc206Ok9wX0FzbVN0cmluZ10pOyAgLy8gMQorICBPcHMucHVzaF9iYWNrKEluT3BzW0lubGluZUFzbTo6T3BfTUROb2RlXSk7ICAgICAvLyAyLCAhc3JjbG9jCisgIE9wcy5wdXNoX2JhY2soSW5PcHNbSW5saW5lQXNtOjpPcF9Jc0FsaWduU3RhY2tdKTsgIC8vIDMKKworICB1bnNpZ25lZCBpID0gSW5saW5lQXNtOjpPcF9GaXJzdE9wZXJhbmQsIGUgPSBJbk9wcy5zaXplKCk7CisgIGlmIChJbk9wc1tlLTFdLmdldFZhbHVlVHlwZSgpID09IE1WVDo6RmxhZykKKyAgICAtLWU7ICAvLyBEb24ndCBwcm9jZXNzIGEgZmxhZyBvcGVyYW5kIGlmIGl0IGlzIGhlcmUuCisKKyAgd2hpbGUgKGkgIT0gZSkgeworICAgIHVuc2lnbmVkIEZsYWdzID0gY2FzdDxDb25zdGFudFNETm9kZT4oSW5PcHNbaV0pLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBpZiAoIUlubGluZUFzbTo6aXNNZW1LaW5kKEZsYWdzKSkgeworICAgICAgLy8gSnVzdCBza2lwIG92ZXIgdGhpcyBvcGVyYW5kLCBjb3B5aW5nIHRoZSBvcGVyYW5kcyB2ZXJiYXRpbS4KKyAgICAgIE9wcy5pbnNlcnQoT3BzLmVuZCgpLCBJbk9wcy5iZWdpbigpK2ksCisgICAgICAgICAgICAgICAgIEluT3BzLmJlZ2luKCkraStJbmxpbmVBc206OmdldE51bU9wZXJhbmRSZWdpc3RlcnMoRmxhZ3MpICsgMSk7CisgICAgICBpICs9IElubGluZUFzbTo6Z2V0TnVtT3BlcmFuZFJlZ2lzdGVycyhGbGFncykgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoSW5saW5lQXNtOjpnZXROdW1PcGVyYW5kUmVnaXN0ZXJzKEZsYWdzKSA9PSAxICYmCisgICAgICAgICAgICAgIk1lbW9yeSBvcGVyYW5kIHdpdGggbXVsdGlwbGUgdmFsdWVzPyIpOworICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgbWVtb3J5IG9wZXJhbmQuICBBc2sgdGhlIHRhcmdldCB0byBzZWxlY3QgaXQuCisgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiBTZWxPcHM7CisgICAgICBpZiAoU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChJbk9wc1tpKzFdLCAnbScsIFNlbE9wcykpCisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiQ291bGQgbm90IG1hdGNoIG1lbW9yeSBhZGRyZXNzLiAgSW5saW5lIGFzbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmFpbHVyZSEiKTsKKworICAgICAgLy8gQWRkIHRoaXMgdG8gdGhlIG91dHB1dCBub2RlLgorICAgICAgdW5zaWduZWQgTmV3RmxhZ3MgPQorICAgICAgICBJbmxpbmVBc206OmdldEZsYWdXb3JkKElubGluZUFzbTo6S2luZF9NZW0sIFNlbE9wcy5zaXplKCkpOworICAgICAgT3BzLnB1c2hfYmFjayhDdXJEQUctPmdldFRhcmdldENvbnN0YW50KE5ld0ZsYWdzLCBNVlQ6OmkzMikpOworICAgICAgT3BzLmluc2VydChPcHMuZW5kKCksIFNlbE9wcy5iZWdpbigpLCBTZWxPcHMuZW5kKCkpOworICAgICAgaSArPSAyOworICAgIH0KKyAgfQorCisgIC8vIEFkZCB0aGUgZmxhZyBpbnB1dCBiYWNrIGlmIHByZXNlbnQuCisgIGlmIChlICE9IEluT3BzLnNpemUoKSkKKyAgICBPcHMucHVzaF9iYWNrKEluT3BzLmJhY2soKSk7Cit9CisKKy8vLyBmaW5kRmxhZ1VzZSAtIFJldHVybiB1c2Ugb2YgRVZUOjpGbGFnIHZhbHVlIHByb2R1Y2VkIGJ5IHRoZSBzcGVjaWZpZWQKKy8vLyBTRE5vZGUuCisvLy8KK3N0YXRpYyBTRE5vZGUgKmZpbmRGbGFnVXNlKFNETm9kZSAqTikgeworICB1bnNpZ25lZCBGbGFnUmVzTm8gPSBOLT5nZXROdW1WYWx1ZXMoKS0xOworICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIEkgPSBOLT51c2VfYmVnaW4oKSwgRSA9IE4tPnVzZV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBTRFVzZSAmVXNlID0gSS5nZXRVc2UoKTsKKyAgICBpZiAoVXNlLmdldFJlc05vKCkgPT0gRmxhZ1Jlc05vKQorICAgICAgcmV0dXJuIFVzZS5nZXRVc2VyKCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vLyBmaW5kTm9uSW1tVXNlIC0gUmV0dXJuIHRydWUgaWYgIlVzZSIgaXMgYSBub24taW1tZWRpYXRlIHVzZSBvZiAiRGVmIi4KKy8vLyBUaGlzIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlcyB1cCB0aGUgb3BlcmFuZCBjaGFpbiwgaWdub3JpbmcKKy8vLyBjZXJ0YWluIG5vZGVzLgorc3RhdGljIGJvb2wgZmluZE5vbkltbVVzZShTRE5vZGUgKlVzZSwgU0ROb2RlKiBEZWYsIFNETm9kZSAqSW1tZWRVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNETm9kZSAqUm9vdCwgU21hbGxQdHJTZXQ8U0ROb2RlKiwgMTY+ICZWaXNpdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZUNoYWlucykgeworICAvLyBUaGUgTm9kZUlEJ3MgYXJlIGdpdmVuIHVuaXF1ZXMgSUQncyB3aGVyZSBhIG5vZGUgSUQgaXMgZ3VhcmFudGVlZCB0byBiZQorICAvLyBncmVhdGVyIHRoYW4gYWxsIG9mIGl0cyAocmVjdXJzaXZlKSBvcGVyYW5kcy4gIElmIHdlIHNjYW4gdG8gYSBwb2ludCB3aGVyZQorICAvLyAndXNlJyBpcyBzbWFsbGVyIHRoYW4gdGhlIG5vZGUgd2UncmUgc2Nhbm5pbmcgZm9yLCB0aGVuIHdlIGtub3cgd2Ugd2lsbAorICAvLyBuZXZlciBmaW5kIGl0LgorICAvLworICAvLyBUaGUgVXNlIG1heSBiZSAtMSAodW5hc3NpZ25lZCkgaWYgaXQgaXMgYSBuZXdseSBhbGxvY2F0ZWQgbm9kZS4gIFRoaXMgY2FuCisgIC8vIGhhcHBlbiBiZWNhdXNlIHdlIHNjYW4gZG93biB0byBuZXdseSBzZWxlY3RlZCBub2RlcyBpbiB0aGUgY2FzZSBvZiBmbGFnCisgIC8vIHVzZXMuCisgIGlmICgoVXNlLT5nZXROb2RlSWQoKSA8IERlZi0+Z2V0Tm9kZUlkKCkgJiYgVXNlLT5nZXROb2RlSWQoKSAhPSAtMSkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gRG9uJ3QgcmV2aXNpdCBub2RlcyBpZiB3ZSBhbHJlYWR5IHNjYW5uZWQgaXQgYW5kIGRpZG4ndCBmYWlsLCB3ZSBrbm93IHdlCisgIC8vIHdvbid0IGZhaWwgaWYgd2Ugc2NhbiBpdCBhZ2Fpbi4KKyAgaWYgKCFWaXNpdGVkLmluc2VydChVc2UpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVXNlLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIC8vIElnbm9yZSBjaGFpbiB1c2VzLCB0aGV5IGFyZSB2YWxpZGF0ZWQgYnkgSGFuZGxlTWVyZ2VJbnB1dENoYWlucy4KKyAgICBpZiAoVXNlLT5nZXRPcGVyYW5kKGkpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6T3RoZXIgJiYgSWdub3JlQ2hhaW5zKQorICAgICAgY29udGludWU7CisgICAgCisgICAgU0ROb2RlICpOID0gVXNlLT5nZXRPcGVyYW5kKGkpLmdldE5vZGUoKTsKKyAgICBpZiAoTiA9PSBEZWYpIHsKKyAgICAgIGlmIChVc2UgPT0gSW1tZWRVc2UgfHwgVXNlID09IFJvb3QpCisgICAgICAgIGNvbnRpbnVlOyAgLy8gV2UgYXJlIG5vdCBsb29raW5nIGZvciBpbW1lZGlhdGUgdXNlLgorICAgICAgYXNzZXJ0KE4gIT0gUm9vdCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgb3BlcmFuZCBjaGFpbi4KKyAgICBpZiAoZmluZE5vbkltbVVzZShOLCBEZWYsIEltbWVkVXNlLCBSb290LCBWaXNpdGVkLCBJZ25vcmVDaGFpbnMpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gSXNQcm9maXRhYmxlVG9Gb2xkIC0gUmV0dXJucyB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byBmb2xkIHRoZSBzcGVjaWZpYworLy8vIG9wZXJhbmQgbm9kZSBOIG9mIFUgZHVyaW5nIGluc3RydWN0aW9uIHNlbGVjdGlvbiB0aGF0IHN0YXJ0cyBhdCBSb290LgorYm9vbCBTZWxlY3Rpb25EQUdJU2VsOjpJc1Byb2ZpdGFibGVUb0ZvbGQoU0RWYWx1ZSBOLCBTRE5vZGUgKlUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgKlJvb3QpIGNvbnN0IHsKKyAgaWYgKE9wdExldmVsID09IENvZGVHZW5PcHQ6Ok5vbmUpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIE4uaGFzT25lVXNlKCk7Cit9CisKKy8vLyBJc0xlZ2FsVG9Gb2xkIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpYyBvcGVyYW5kIG5vZGUgTiBvZgorLy8vIFUgY2FuIGJlIGZvbGRlZCBkdXJpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHRoYXQgc3RhcnRzIGF0IFJvb3QuCitib29sIFNlbGVjdGlvbkRBR0lTZWw6OklzTGVnYWxUb0ZvbGQoU0RWYWx1ZSBOLCBTRE5vZGUgKlUsIFNETm9kZSAqUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZUNoYWlucykgeworICBpZiAoT3B0TGV2ZWwgPT0gQ29kZUdlbk9wdDo6Tm9uZSkgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIFJvb3QgdXNlIGNhbiBzb21laG93IHJlYWNoIE4gdGhyb3VnaCBhIHBhdGggdGhhdCB0aGF0IGRvZXNuJ3QgY29udGFpbgorICAvLyBVIHRoZW4gZm9sZGluZyBOIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlLiBlLmcuIEluIHRoZSBmb2xsb3dpbmcKKyAgLy8gZGlhZ3JhbSwgUm9vdCBjYW4gcmVhY2ggTiB0aHJvdWdoIFguIElmIE4gaXMgZm9sZGVkIGludG8gaW50byBSb290LCB0aGVuCisgIC8vIFggaXMgYm90aCBhIHByZWRlY2Vzc29yIGFuZCBhIHN1Y2Nlc3NvciBvZiBVLgorICAvLworICAvLyAgICAgICAgICBbTipdICAgICAgICAgICAvLworICAvLyAgICAgICAgIF4gICBeICAgICAgICAgICAvLworICAvLyAgICAgICAgLyAgICAgXCAgICAgICAgICAvLworICAvLyAgICAgIFtVKl0gICAgW1hdPyAgICAgICAvLworICAvLyAgICAgICAgXiAgICAgXiAgICAgICAgICAvLworICAvLyAgICAgICAgIFwgICAvICAgICAgICAgICAvLworICAvLyAgICAgICAgICBcIC8gICAgICAgICAgICAvLworICAvLyAgICAgICAgIFtSb290Kl0gICAgICAgICAvLworICAvLworICAvLyAqIGluZGljYXRlcyBub2RlcyB0byBiZSBmb2xkZWQgdG9nZXRoZXIuCisgIC8vCisgIC8vIElmIFJvb3QgcHJvZHVjZXMgYSBmbGFnLCB0aGVuIGl0IGdldHMgKGV2ZW4gbW9yZSkgaW50ZXJlc3RpbmcuIFNpbmNlIGl0CisgIC8vIHdpbGwgYmUgImdsdWVkIiB0b2dldGhlciB3aXRoIGl0cyBmbGFnIHVzZSBpbiB0aGUgc2NoZWR1bGVyLCB3ZSBuZWVkIHRvCisgIC8vIGNoZWNrIGlmIGl0IG1pZ2h0IHJlYWNoIE4uCisgIC8vCisgIC8vICAgICAgICAgIFtOKl0gICAgICAgICAgIC8vCisgIC8vICAgICAgICAgXiAgIF4gICAgICAgICAgIC8vCisgIC8vICAgICAgICAvICAgICBcICAgICAgICAgIC8vCisgIC8vICAgICAgW1UqXSAgICBbWF0/ICAgICAgIC8vCisgIC8vICAgICAgICBeICAgICAgIF4gICAgICAgIC8vCisgIC8vICAgICAgICAgXCAgICAgICBcICAgICAgIC8vCisgIC8vICAgICAgICAgIFwgICAgICB8ICAgICAgIC8vCisgIC8vICAgICAgICAgW1Jvb3QqXSB8ICAgICAgIC8vCisgIC8vICAgICAgICAgIF4gICAgICB8ICAgICAgIC8vCisgIC8vICAgICAgICAgIGYgICAgICB8ICAgICAgIC8vCisgIC8vICAgICAgICAgIHwgICAgICAvICAgICAgIC8vCisgIC8vICAgICAgICAgW1ldICAgIC8gICAgICAgIC8vCisgIC8vICAgICAgICAgICBeICAgLyAgICAgICAgIC8vCisgIC8vICAgICAgICAgICBmICAvICAgICAgICAgIC8vCisgIC8vICAgICAgICAgICB8IC8gICAgICAgICAgIC8vCisgIC8vICAgICAgICAgIFtGVV0gICAgICAgICAgIC8vCisgIC8vCisgIC8vIElmIEZVIChmbGFnIHVzZSkgaW5kaXJlY3RseSByZWFjaGVzIE4gKHRoZSBsb2FkKSwgYW5kIFJvb3QgZm9sZHMgTgorICAvLyAoY2FsbCBpdCBGb2xkKSwgdGhlbiBYIGlzIGEgcHJlZGVjZXNzb3Igb2YgRlUgYW5kIGEgc3VjY2Vzc29yIG9mCisgIC8vIEZvbGQuIEJ1dCBzaW5jZSBGb2xkIGFuZCBGVSBhcmUgZmxhZ2dlZCB0b2dldGhlciwgdGhpcyB3aWxsIGNyZWF0ZQorICAvLyBhIGN5Y2xlIGluIHRoZSBzY2hlZHVsaW5nIGdyYXBoLgorCisgIC8vIElmIHRoZSBub2RlIGhhcyBmbGFncywgd2FsayBkb3duIHRoZSBncmFwaCB0byB0aGUgImxvd2VzdCIgbm9kZSBpbiB0aGUKKyAgLy8gZmxhZ2dlZCBzZXQuCisgIEVWVCBWVCA9IFJvb3QtPmdldFZhbHVlVHlwZShSb290LT5nZXROdW1WYWx1ZXMoKS0xKTsKKyAgd2hpbGUgKFZUID09IE1WVDo6RmxhZykgeworICAgIFNETm9kZSAqRlUgPSBmaW5kRmxhZ1VzZShSb290KTsKKyAgICBpZiAoRlUgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworICAgIFJvb3QgPSBGVTsKKyAgICBWVCA9IFJvb3QtPmdldFZhbHVlVHlwZShSb290LT5nZXROdW1WYWx1ZXMoKS0xKTsKKyAgICAKKyAgICAvLyBJZiBvdXIgcXVlcnkgbm9kZSBoYXMgYSBmbGFnIHJlc3VsdCB3aXRoIGEgdXNlLCB3ZSd2ZSB3YWxrZWQgdXAgaXQuICBJZgorICAgIC8vIHRoZSB1c2VyICh3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHNlbGVjdGVkKSBoYXMgYSBjaGFpbiBvciBpbmRpcmVjdGx5IHVzZXMKKyAgICAvLyB0aGUgY2hhaW4sIG91ciBXYWxrQ2hhaW5Vc2VycyBwcmVkaWNhdGUgd2lsbCBub3QgY29uc2lkZXIgaXQuICBCZWNhdXNlIG9mCisgICAgLy8gdGhpcywgd2UgY2Fubm90IGlnbm9yZSBjaGFpbnMgaW4gdGhpcyBwcmVkaWNhdGUuCisgICAgSWdub3JlQ2hhaW5zID0gZmFsc2U7CisgIH0KKyAgCisKKyAgU21hbGxQdHJTZXQ8U0ROb2RlKiwgMTY+IFZpc2l0ZWQ7CisgIHJldHVybiAhZmluZE5vbkltbVVzZShSb290LCBOLmdldE5vZGUoKSwgVSwgUm9vdCwgVmlzaXRlZCwgSWdub3JlQ2hhaW5zKTsKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUdJU2VsOjpTZWxlY3RfVU5ERUYoU0ROb2RlICpOKSB7CisgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRixOLT5nZXRWYWx1ZVR5cGUoMCkpOworfQorCisvLy8gR2V0VkJSIC0gZGVjb2RlIGEgdmJyIGVuY29kaW5nIHdob3NlIHRvcCBiaXQgaXMgc2V0LgorQUxXQVlTX0lOTElORSBzdGF0aWMgdWludDY0X3QKK0dldFZCUih1aW50NjRfdCBWYWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKk1hdGNoZXJUYWJsZSwgdW5zaWduZWQgJklkeCkgeworICBhc3NlcnQoVmFsID49IDEyOCAmJiAiTm90IGEgVkJSIik7CisgIFZhbCAmPSAxMjc7ICAvLyBSZW1vdmUgZmlyc3QgdmJyIGJpdC4KKyAgCisgIHVuc2lnbmVkIFNoaWZ0ID0gNzsKKyAgdWludDY0X3QgTmV4dEJpdHM7CisgIGRvIHsKKyAgICBOZXh0Qml0cyA9IE1hdGNoZXJUYWJsZVtJZHgrK107CisgICAgVmFsIHw9IChOZXh0Qml0cyYxMjcpIDw8IFNoaWZ0OworICAgIFNoaWZ0ICs9IDc7CisgIH0gd2hpbGUgKE5leHRCaXRzICYgMTI4KTsKKyAgCisgIHJldHVybiBWYWw7Cit9CisKKworLy8vIFVwZGF0ZUNoYWluc0FuZEZsYWdzIC0gV2hlbiBhIG1hdGNoIGlzIGNvbXBsZXRlLCB0aGlzIG1ldGhvZCB1cGRhdGVzIHVzZXMgb2YKKy8vLyBpbnRlcmlvciBmbGFnIGFuZCBjaGFpbiByZXN1bHRzIHRvIHVzZSB0aGUgbmV3IGZsYWcgYW5kIGNoYWluIHJlc3VsdHMuCit2b2lkIFNlbGVjdGlvbkRBR0lTZWw6OgorVXBkYXRlQ2hhaW5zQW5kRmxhZ3MoU0ROb2RlICpOb2RlVG9NYXRjaCwgU0RWYWx1ZSBJbnB1dENoYWluLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNETm9kZSo+ICZDaGFpbk5vZGVzTWF0Y2hlZCwKKyAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgSW5wdXRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNETm9kZSo+ICZGbGFnUmVzdWx0Tm9kZXNNYXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vcnBoTm9kZVRvKSB7CisgIFNtYWxsVmVjdG9yPFNETm9kZSosIDQ+IE5vd0RlYWROb2RlczsKKyAgCisgIElTZWxVcGRhdGVyIElTVShJU2VsUG9zaXRpb24pOworCisgIC8vIE5vdyB0aGF0IGFsbCB0aGUgbm9ybWFsIHJlc3VsdHMgYXJlIHJlcGxhY2VkLCB3ZSByZXBsYWNlIHRoZSBjaGFpbiBhbmQKKyAgLy8gZmxhZyByZXN1bHRzIGlmIHByZXNlbnQuCisgIGlmICghQ2hhaW5Ob2Rlc01hdGNoZWQuZW1wdHkoKSkgeworICAgIGFzc2VydChJbnB1dENoYWluLmdldE5vZGUoKSAhPSAwICYmCisgICAgICAgICAgICJNYXRjaGVkIGlucHV0IGNoYWlucyBidXQgZGlkbid0IHByb2R1Y2UgYSBjaGFpbiIpOworICAgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIG5vZGVzIHdlIG1hdGNoZWQgdGhhdCBwcm9kdWNlZCBhIGNoYWluIHJlc3VsdC4KKyAgICAvLyBSZXBsYWNlIGFsbCB0aGUgY2hhaW4gcmVzdWx0cyB3aXRoIHRoZSBmaW5hbCBjaGFpbiB3ZSBlbmRlZCB1cCB3aXRoLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDaGFpbk5vZGVzTWF0Y2hlZC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBTRE5vZGUgKkNoYWluTm9kZSA9IENoYWluTm9kZXNNYXRjaGVkW2ldOworICAgICAgCisgICAgICAvLyBJZiB0aGlzIG5vZGUgd2FzIGFscmVhZHkgZGVsZXRlZCwgZG9uJ3QgbG9vayBhdCBpdC4KKyAgICAgIGlmIChDaGFpbk5vZGUtPmdldE9wY29kZSgpID09IElTRDo6REVMRVRFRF9OT0RFKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgLy8gRG9uJ3QgcmVwbGFjZSB0aGUgcmVzdWx0cyBvZiB0aGUgcm9vdCBub2RlIGlmIHdlJ3JlIGRvaW5nIGEKKyAgICAgIC8vIE1vcnBoTm9kZVRvLgorICAgICAgaWYgKENoYWluTm9kZSA9PSBOb2RlVG9NYXRjaCAmJiBpc01vcnBoTm9kZVRvKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgU0RWYWx1ZSBDaGFpblZhbCA9IFNEVmFsdWUoQ2hhaW5Ob2RlLCBDaGFpbk5vZGUtPmdldE51bVZhbHVlcygpLTEpOworICAgICAgaWYgKENoYWluVmFsLmdldFZhbHVlVHlwZSgpID09IE1WVDo6RmxhZykKKyAgICAgICAgQ2hhaW5WYWwgPSBDaGFpblZhbC5nZXRWYWx1ZShDaGFpblZhbC0+Z2V0TnVtVmFsdWVzKCktMik7CisgICAgICBhc3NlcnQoQ2hhaW5WYWwuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpPdGhlciAmJiAiTm90IGEgY2hhaW4/Iik7CisgICAgICBDdXJEQUctPlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoQ2hhaW5WYWwsIElucHV0Q2hhaW4sICZJU1UpOworICAgICAgCisgICAgICAvLyBJZiB0aGUgbm9kZSBiZWNhbWUgZGVhZCBhbmQgd2UgaGF2ZW4ndCBhbHJlYWR5IHNlZW4gaXQsIGRlbGV0ZSBpdC4KKyAgICAgIGlmIChDaGFpbk5vZGUtPnVzZV9lbXB0eSgpICYmCisgICAgICAgICAgIXN0ZDo6Y291bnQoTm93RGVhZE5vZGVzLmJlZ2luKCksIE5vd0RlYWROb2Rlcy5lbmQoKSwgQ2hhaW5Ob2RlKSkKKyAgICAgICAgTm93RGVhZE5vZGVzLnB1c2hfYmFjayhDaGFpbk5vZGUpOworICAgIH0KKyAgfQorICAKKyAgLy8gSWYgdGhlIHJlc3VsdCBwcm9kdWNlcyBhIGZsYWcsIHVwZGF0ZSBhbnkgZmxhZyByZXN1bHRzIGluIHRoZSBtYXRjaGVkCisgIC8vIHBhdHRlcm4gd2l0aCB0aGUgZmxhZyByZXN1bHQuCisgIGlmIChJbnB1dEZsYWcuZ2V0Tm9kZSgpICE9IDApIHsKKyAgICAvLyBIYW5kbGUgYW55IGludGVyaW9yIG5vZGVzIGV4cGxpY2l0bHkgbWFya2VkLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGbGFnUmVzdWx0Tm9kZXNNYXRjaGVkLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFNETm9kZSAqRlJOID0gRmxhZ1Jlc3VsdE5vZGVzTWF0Y2hlZFtpXTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhpcyBub2RlIHdhcyBhbHJlYWR5IGRlbGV0ZWQsIGRvbid0IGxvb2sgYXQgaXQuCisgICAgICBpZiAoRlJOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkRFTEVURURfTk9ERSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIGFzc2VydChGUk4tPmdldFZhbHVlVHlwZShGUk4tPmdldE51bVZhbHVlcygpLTEpID09IE1WVDo6RmxhZyAmJgorICAgICAgICAgICAgICJEb2Vzbid0IGhhdmUgYSBmbGFnIHJlc3VsdCIpOworICAgICAgQ3VyREFHLT5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoRlJOLCBGUk4tPmdldE51bVZhbHVlcygpLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0RmxhZywgJklTVSk7CisgICAgICAKKyAgICAgIC8vIElmIHRoZSBub2RlIGJlY2FtZSBkZWFkIGFuZCB3ZSBoYXZlbid0IGFscmVhZHkgc2VlbiBpdCwgZGVsZXRlIGl0LgorICAgICAgaWYgKEZSTi0+dXNlX2VtcHR5KCkgJiYKKyAgICAgICAgICAhc3RkOjpjb3VudChOb3dEZWFkTm9kZXMuYmVnaW4oKSwgTm93RGVhZE5vZGVzLmVuZCgpLCBGUk4pKQorICAgICAgICBOb3dEZWFkTm9kZXMucHVzaF9iYWNrKEZSTik7CisgICAgfQorICB9CisgIAorICBpZiAoIU5vd0RlYWROb2Rlcy5lbXB0eSgpKQorICAgIEN1ckRBRy0+UmVtb3ZlRGVhZE5vZGVzKE5vd0RlYWROb2RlcywgJklTVSk7CisgIAorICBERUJVRyhlcnJzKCkgPDwgIklTRUw6IE1hdGNoIGNvbXBsZXRlIVxuIik7Cit9CisKK2VudW0gQ2hhaW5SZXN1bHQgeworICBDUl9TaW1wbGUsCisgIENSX0luZHVjZXNDeWNsZSwKKyAgQ1JfTGVhZHNUb0ludGVyaW9yTm9kZQorfTsKKworLy8vIFdhbGtDaGFpblVzZXJzIC0gV2FsayBkb3duIHRoZSB1c2VycyBvZiB0aGUgc3BlY2lmaWVkIGNoYWluZWQgbm9kZSB0aGF0IGlzCisvLy8gcGFydCBvZiB0aGUgcGF0dGVybiB3ZSdyZSBtYXRjaGluZywgbG9va2luZyBhdCBhbGwgb2YgdGhlIHVzZXJzIHdlIGZpbmQuCisvLy8gVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgc29tZXRoaW5nIGlzIGFuIGludGVyaW9yIG5vZGUsIHdoZXRoZXIgd2UgaGF2ZSBhCisvLy8gbm9uLXBhdHRlcm4gbm9kZSBpbiBiZXR3ZWVuIHR3byBwYXR0ZXJuIG5vZGVzICh3aGljaCBwcmV2ZW50IGZvbGRpbmcgYmVjYXVzZQorLy8vIGl0IHdvdWxkIGluZHVjZSBhIGN5Y2xlKSBhbmQgd2hldGhlciB3ZSBoYXZlIGEgVG9rZW5GYWN0b3Igbm9kZSBzYW5kd2ljaGVkCisvLy8gYmV0d2VlbiBwYXR0ZXJuIG5vZGVzIChpbiB3aGljaCBjYXNlIHRoZSBURiBiZWNvbWVzIHBhcnQgb2YgdGhlIHBhdHRlcm4pLgorLy8vCisvLy8gVGhlIHdhbGsgd2UgZG8gaGVyZSBpcyBndWFyYW50ZWVkIHRvIGJlIHNtYWxsIGJlY2F1c2Ugd2UgcXVpY2tseSBnZXQgZG93biB0bworLy8vIGFscmVhZHkgc2VsZWN0ZWQgbm9kZXMgImJlbG93IiB1cy4KK3N0YXRpYyBDaGFpblJlc3VsdCAKK1dhbGtDaGFpblVzZXJzKFNETm9kZSAqQ2hhaW5lZE5vZGUsCisgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0ROb2RlKj4gJkNoYWluZWROb2Rlc0luUGF0dGVybiwKKyAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRE5vZGUqPiAmSW50ZXJpb3JDaGFpbmVkTm9kZXMpIHsKKyAgQ2hhaW5SZXN1bHQgUmVzdWx0ID0gQ1JfU2ltcGxlOworICAKKyAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IENoYWluZWROb2RlLT51c2VfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBDaGFpbmVkTm9kZS0+dXNlX2VuZCgpOyBVSSAhPSBFOyArK1VJKSB7CisgICAgLy8gTWFrZSBzdXJlIHRoZSB1c2UgaXMgb2YgdGhlIGNoYWluLCBub3Qgc29tZSBvdGhlciB2YWx1ZSB3ZSBwcm9kdWNlLgorICAgIGlmIChVSS5nZXRVc2UoKS5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6Ok90aGVyKSBjb250aW51ZTsKKyAgICAKKyAgICBTRE5vZGUgKlVzZXIgPSAqVUk7CisKKyAgICAvLyBJZiB3ZSBzZWUgYW4gYWxyZWFkeS1zZWxlY3RlZCBtYWNoaW5lIG5vZGUsIHRoZW4gd2UndmUgZ29uZSBiZXlvbmQgdGhlCisgICAgLy8gcGF0dGVybiB0aGF0IHdlJ3JlIHNlbGVjdGluZyBkb3duIGludG8gdGhlIGFscmVhZHkgc2VsZWN0ZWQgY2h1bmsgb2YgdGhlCisgICAgLy8gREFHLgorICAgIGlmIChVc2VyLT5pc01hY2hpbmVPcGNvZGUoKSB8fAorICAgICAgICBVc2VyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkhBTkRMRU5PREUpICAvLyBSb290IG9mIHRoZSBncmFwaC4KKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIGlmIChVc2VyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlUb1JlZyB8fAorICAgICAgICBVc2VyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlGcm9tUmVnKSB7CisgICAgICAvLyBJZiB0aGVpciBub2RlIElEIGdvdCByZXNldCB0byAtMSB0aGVuIHRoZXkndmUgYWxyZWFkeSBiZWVuIHNlbGVjdGVkLgorICAgICAgLy8gVHJlYXQgdGhlbSBsaWtlIGEgTWFjaGluZU9wY29kZS4KKyAgICAgIGlmIChVc2VyLT5nZXROb2RlSWQoKSA9PSAtMSkKKyAgICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgd2UgaGF2ZSBhIFRva2VuRmFjdG9yLCB3ZSBoYW5kbGUgaXQgc3BlY2lhbGx5LgorICAgIGlmIChVc2VyLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlRva2VuRmFjdG9yKSB7CisgICAgICAvLyBJZiB0aGUgbm9kZSBpc24ndCBhIHRva2VuIGZhY3RvciBhbmQgaXNuJ3QgcGFydCBvZiBvdXIgcGF0dGVybiwgdGhlbiBpdAorICAgICAgLy8gbXVzdCBiZSBhIHJhbmRvbSBjaGFpbmVkIG5vZGUgaW4gYmV0d2VlbiB0d28gbm9kZXMgd2UncmUgc2VsZWN0aW5nLgorICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGF2ZSBzb21ldGhpbmcgbGlrZToKKyAgICAgIC8vICAgeCA9IGxvYWQgcHRyCisgICAgICAvLyAgIGNhbGwKKyAgICAgIC8vICAgeSA9IHgrNAorICAgICAgLy8gICBzdG9yZSB5IC0+IHB0cgorICAgICAgLy8gQmVjYXVzZSB3ZSBzdHJ1Y3R1cmFsbHkgbWF0Y2ggdGhlIGxvYWQvc3RvcmUgYXMgYSByZWFkL21vZGlmeS93cml0ZSwKKyAgICAgIC8vIGJ1dCB0aGUgY2FsbCBpcyBjaGFpbmVkIGJldHdlZW4gdGhlbS4gIFdlIGNhbm5vdCBmb2xkIGluIHRoaXMgY2FzZQorICAgICAgLy8gYmVjYXVzZSBpdCB3b3VsZCBpbmR1Y2UgYSBjeWNsZSBpbiB0aGUgZ3JhcGguCisgICAgICBpZiAoIXN0ZDo6Y291bnQoQ2hhaW5lZE5vZGVzSW5QYXR0ZXJuLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgQ2hhaW5lZE5vZGVzSW5QYXR0ZXJuLmVuZCgpLCBVc2VyKSkKKyAgICAgICAgcmV0dXJuIENSX0luZHVjZXNDeWNsZTsKKyAgICAgIAorICAgICAgLy8gT3RoZXJ3aXNlIHdlIGZvdW5kIGEgbm9kZSB0aGF0IGlzIHBhcnQgb2Ygb3VyIHBhdHRlcm4uICBGb3IgZXhhbXBsZSBpbjoKKyAgICAgIC8vICAgeCA9IGxvYWQgcHRyCisgICAgICAvLyAgIHkgPSB4KzQKKyAgICAgIC8vICAgc3RvcmUgeSAtPiBwdHIKKyAgICAgIC8vIFRoaXMgd291bGQgaGFwcGVuIHdoZW4gd2UncmUgc2Nhbm5pbmcgZG93biBmcm9tIHRoZSBsb2FkIGFuZCBzZWUgdGhlCisgICAgICAvLyBzdG9yZSBhcyBhIHVzZXIuICBSZWNvcmQgdGhhdCB0aGVyZSBpcyBhIHVzZSBvZiBDaGFpbmVkTm9kZSB0aGF0IGlzCisgICAgICAvLyBwYXJ0IG9mIHRoZSBwYXR0ZXJuIGFuZCBrZWVwIHNjYW5uaW5nIHVzZXMuCisgICAgICBSZXN1bHQgPSBDUl9MZWFkc1RvSW50ZXJpb3JOb2RlOworICAgICAgSW50ZXJpb3JDaGFpbmVkTm9kZXMucHVzaF9iYWNrKFVzZXIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8vIElmIHdlIGZvdW5kIGEgVG9rZW5GYWN0b3IsIHRoZXJlIGFyZSB0d28gY2FzZXMgdG8gY29uc2lkZXI6IGZpcnN0IGlmIHRoZQorICAgIC8vIFRva2VuRmFjdG9yIGlzIGp1c3QgaGFuZ2luZyAiYmVsb3ciIHRoZSBwYXR0ZXJuIHdlJ3JlIG1hdGNoaW5nIChpLmUuIG5vCisgICAgLy8gdXNlcyBvZiB0aGUgVEYgYXJlIGluIG91ciBwYXR0ZXJuKSB3ZSBqdXN0IHdhbnQgdG8gaWdub3JlIGl0LiAgU2Vjb25kLAorICAgIC8vIHRoZSBUb2tlbkZhY3RvciBjYW4gYmUgc2FuZHdpY2hlZCBpbiBiZXR3ZWVuIHR3byBjaGFpbmVkIG5vZGVzLCBsaWtlIHNvOgorICAgIC8vICAgICBbTG9hZCBjaGFpbl0KKyAgICAvLyAgICAgICAgIF4KKyAgICAvLyAgICAgICAgIHwKKyAgICAvLyAgICAgICBbTG9hZF0KKyAgICAvLyAgICAgICBeICAgIF4KKyAgICAvLyAgICAgICB8ICAgIFwgICAgICAgICAgICAgICAgICAgIERBRydzIGxpa2UgY2hlZXNlCisgICAgLy8gICAgICAvICAgICAgIFwgICAgICAgICAgICAgICAgICAgICAgIGRvIHlvdT8KKyAgICAvLyAgICAgLyAgICAgICAgIHwKKyAgICAvLyBbVG9rZW5GYWN0b3JdIFtPcF0KKyAgICAvLyAgICAgXiAgICAgICAgICBeCisgICAgLy8gICAgIHwgICAgICAgICAgfAorICAgIC8vICAgICAgXCAgICAgICAgLworICAgIC8vICAgICAgIFwgICAgICAvCisgICAgLy8gICAgICAgW1N0b3JlXQorICAgIC8vCisgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgVG9rZW5GYWN0b3IgYmVjb21lcyBwYXJ0IG9mIG91ciBtYXRjaCBhbmQgd2UgcmV3cml0ZSBpdAorICAgIC8vIGFzIGEgbmV3IFRva2VuRmFjdG9yLgorICAgIC8vCisgICAgLy8gVG8gZGlzdGluZ3Vpc2ggdGhlc2UgdHdvIGNhc2VzLCBkbyBhIHJlY3Vyc2l2ZSB3YWxrIGRvd24gdGhlIHVzZXMuCisgICAgc3dpdGNoIChXYWxrQ2hhaW5Vc2VycyhVc2VyLCBDaGFpbmVkTm9kZXNJblBhdHRlcm4sIEludGVyaW9yQ2hhaW5lZE5vZGVzKSkgeworICAgIGNhc2UgQ1JfU2ltcGxlOgorICAgICAgLy8gSWYgdGhlIHVzZXMgb2YgdGhlIFRva2VuRmFjdG9yIGFyZSBqdXN0IGFscmVhZHktc2VsZWN0ZWQgbm9kZXMsIGlnbm9yZQorICAgICAgLy8gaXQsIGl0IGlzICJiZWxvdyIgb3VyIHBhdHRlcm4uCisgICAgICBjb250aW51ZTsKKyAgICBjYXNlIENSX0luZHVjZXNDeWNsZToKKyAgICAgIC8vIElmIHRoZSB1c2VzIG9mIHRoZSBUb2tlbkZhY3RvciBsZWFkIHRvIG5vZGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIG91cgorICAgICAgLy8gcGF0dGVybiB0aGF0IGFyZSBub3Qgc2VsZWN0ZWQsIGZvbGRpbmcgd291bGQgdHVybiB0aGlzIGludG8gYSBjeWNsZSwKKyAgICAgIC8vIGJhaWwgb3V0IG5vdy4KKyAgICAgIHJldHVybiBDUl9JbmR1Y2VzQ3ljbGU7CisgICAgY2FzZSBDUl9MZWFkc1RvSW50ZXJpb3JOb2RlOgorICAgICAgYnJlYWs7ICAvLyBPdGhlcndpc2UsIGtlZXAgcHJvY2Vzc2luZy4KKyAgICB9CisgICAgCisgICAgLy8gT2theSwgd2Uga25vdyB3ZSdyZSBpbiB0aGUgaW50ZXJlc3RpbmcgaW50ZXJpb3IgY2FzZS4gIFRoZSBUb2tlbkZhY3RvcgorICAgIC8vIGlzIG5vdyBnb2luZyB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHBhdHRlcm4gc28gdGhhdCB3ZSByZXdyaXRlIGl0cworICAgIC8vIHVzZXMgKGl0IG1heSBoYXZlIHVzZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHBhdHRlcm4pIHdpdGggdGhlCisgICAgLy8gdWx0aW1hdGUgY2hhaW4gcmVzdWx0IG9mIHRoZSBnZW5lcmF0ZWQgY29kZS4gIFdlIHdpbGwgYWxzbyBhZGQgaXRzIGNoYWluCisgICAgLy8gaW5wdXRzIGFzIGlucHV0cyB0byB0aGUgdWx0aW1hdGUgVG9rZW5GYWN0b3Igd2UgY3JlYXRlLgorICAgIFJlc3VsdCA9IENSX0xlYWRzVG9JbnRlcmlvck5vZGU7CisgICAgQ2hhaW5lZE5vZGVzSW5QYXR0ZXJuLnB1c2hfYmFjayhVc2VyKTsKKyAgICBJbnRlcmlvckNoYWluZWROb2Rlcy5wdXNoX2JhY2soVXNlcik7CisgICAgY29udGludWU7CisgIH0KKyAgCisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBIYW5kbGVNZXJnZUlucHV0Q2hhaW5zIC0gVGhpcyBpbXBsZW1lbnRzIHRoZSBPUENfRW1pdE1lcmdlSW5wdXRDaGFpbnMKKy8vLyBvcGVyYXRpb24gZm9yIHdoZW4gdGhlIHBhdHRlcm4gbWF0Y2hlZCBhdCBsZWFzdCBvbmUgbm9kZSB3aXRoIGEgY2hhaW5zLiAgVGhlCisvLy8gaW5wdXQgdmVjdG9yIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgb2YgdGhlIGNoYWluZWQgbm9kZXMgdGhhdCB3ZSBtYXRjaC4gIFdlCisvLy8gbXVzdCBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHZhbGlkIHRoaW5nIHRvIGNvdmVyIChpLmUuIG1hdGNoaW5nIGl0IHdvbid0CisvLy8gaW5kdWNlIGN5Y2xlcyBpbiB0aGUgREFHKSBhbmQgaWYgc28sIGNyZWF0aW5nIGEgVG9rZW5GYWN0b3Igbm9kZS4gdGhhdCB3aWxsCisvLy8gYmUgdXNlZCBhcyB0aGUgaW5wdXQgbm9kZSBjaGFpbiBmb3IgdGhlIGdlbmVyYXRlZCBub2Rlcy4KK3N0YXRpYyBTRFZhbHVlCitIYW5kbGVNZXJnZUlucHV0Q2hhaW5zKFNtYWxsVmVjdG9ySW1wbDxTRE5vZGUqPiAmQ2hhaW5Ob2Rlc01hdGNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAqQ3VyREFHKSB7CisgIC8vIFdhbGsgYWxsIG9mIHRoZSBjaGFpbmVkIG5vZGVzIHdlJ3ZlIG1hdGNoZWQsIHJlY3Vyc2l2ZWx5IHNjYW5uaW5nIGRvd24gdGhlCisgIC8vIHVzZXJzIG9mIHRoZSBjaGFpbiByZXN1bHQuIFRoaXMgYWRkcyBhbnkgVG9rZW5GYWN0b3Igbm9kZXMgdGhhdCBhcmUgY2F1Z2h0CisgIC8vIGluIGJldHdlZW4gY2hhaW5lZCBub2RlcyB0byB0aGUgY2hhaW5lZCBhbmQgaW50ZXJpb3Igbm9kZXMgbGlzdC4KKyAgU21hbGxWZWN0b3I8U0ROb2RlKiwgMz4gSW50ZXJpb3JDaGFpbmVkTm9kZXM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDaGFpbk5vZGVzTWF0Y2hlZC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKFdhbGtDaGFpblVzZXJzKENoYWluTm9kZXNNYXRjaGVkW2ldLCBDaGFpbk5vZGVzTWF0Y2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJpb3JDaGFpbmVkTm9kZXMpID09IENSX0luZHVjZXNDeWNsZSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7IC8vIFdvdWxkIGluZHVjZSBhIGN5Y2xlLgorICB9CisgIAorICAvLyBPa2F5LCB3ZSBoYXZlIHdhbGtlZCBhbGwgdGhlIG1hdGNoZWQgbm9kZXMgYW5kIGNvbGxlY3RlZCBUb2tlbkZhY3RvciBub2RlcworICAvLyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgRm9ybSBvdXIgaW5wdXQgVG9rZW5GYWN0b3Igbm9kZS4KKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMz4gSW5wdXRDaGFpbnM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDaGFpbk5vZGVzTWF0Y2hlZC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gQWRkIHRoZSBpbnB1dCBjaGFpbiBvZiB0aGlzIG5vZGUgdG8gdGhlIElucHV0Q2hhaW5zIGxpc3QgKHdoaWNoIHdpbGwgYmUKKyAgICAvLyB0aGUgb3BlcmFuZHMgb2YgdGhlIGdlbmVyYXRlZCBUb2tlbkZhY3RvcikgaWYgaXQncyBub3QgYW4gaW50ZXJpb3Igbm9kZS4KKyAgICBTRE5vZGUgKk4gPSBDaGFpbk5vZGVzTWF0Y2hlZFtpXTsKKyAgICBpZiAoTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpUb2tlbkZhY3RvcikgeworICAgICAgaWYgKHN0ZDo6Y291bnQoSW50ZXJpb3JDaGFpbmVkTm9kZXMuYmVnaW4oKSxJbnRlcmlvckNoYWluZWROb2Rlcy5lbmQoKSxOKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSwgYWRkIHRoZSBpbnB1dCBjaGFpbi4KKyAgICAgIFNEVmFsdWUgSW5DaGFpbiA9IENoYWluTm9kZXNNYXRjaGVkW2ldLT5nZXRPcGVyYW5kKDApOworICAgICAgYXNzZXJ0KEluQ2hhaW4uZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpPdGhlciAmJiAiTm90IGEgY2hhaW4iKTsKKyAgICAgIElucHV0Q2hhaW5zLnB1c2hfYmFjayhJbkNoYWluKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB3ZSBoYXZlIGEgdG9rZW4gZmFjdG9yLCB3ZSB3YW50IHRvIGFkZCBhbGwgaW5wdXRzIG9mIHRoZSB0b2tlbiBmYWN0b3IKKyAgICAvLyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgcGF0dGVybiB3ZSdyZSBtYXRjaGluZy4KKyAgICBmb3IgKHVuc2lnbmVkIG9wID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IG9wICE9IGU7ICsrb3ApIHsKKyAgICAgIGlmICghc3RkOjpjb3VudChDaGFpbk5vZGVzTWF0Y2hlZC5iZWdpbigpLCBDaGFpbk5vZGVzTWF0Y2hlZC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKG9wKS5nZXROb2RlKCkpKQorICAgICAgICBJbnB1dENoYWlucy5wdXNoX2JhY2soTi0+Z2V0T3BlcmFuZChvcCkpOworICAgIH0KKyAgfQorICAKKyAgU0RWYWx1ZSBSZXM7CisgIGlmIChJbnB1dENoYWlucy5zaXplKCkgPT0gMSkKKyAgICByZXR1cm4gSW5wdXRDaGFpbnNbMF07CisgIHJldHVybiBDdXJEQUctPmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgQ2hhaW5Ob2Rlc01hdGNoZWRbMF0tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgJklucHV0Q2hhaW5zWzBdLCBJbnB1dENoYWlucy5zaXplKCkpOworfSAgCisKKy8vLyBNb3JwaE5vZGUgLSBIYW5kbGUgbW9ycGhpbmcgYSBub2RlIGluIHBsYWNlIGZvciB0aGUgc2VsZWN0b3IuCitTRE5vZGUgKlNlbGVjdGlvbkRBR0lTZWw6OgorTW9ycGhOb2RlKFNETm9kZSAqTm9kZSwgdW5zaWduZWQgVGFyZ2V0T3BjLCBTRFZUTGlzdCBWVExpc3QsCisgICAgICAgICAgY29uc3QgU0RWYWx1ZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsIHVuc2lnbmVkIEVtaXROb2RlSW5mbykgeworICAvLyBJdCBpcyBwb3NzaWJsZSB3ZSdyZSB1c2luZyBNb3JwaE5vZGVUbyB0byByZXBsYWNlIGEgbm9kZSB3aXRoIG5vCisgIC8vIG5vcm1hbCByZXN1bHRzIHdpdGggb25lIHRoYXQgaGFzIGEgbm9ybWFsIHJlc3VsdCAob3Igd2UgY291bGQgYmUKKyAgLy8gYWRkaW5nIGEgY2hhaW4pIGFuZCB0aGUgaW5wdXQgY291bGQgaGF2ZSBmbGFncyBhbmQgY2hhaW5zIGFzIHdlbGwuCisgIC8vIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIHNoaWZ0IHRoZSBvcGVyYW5kcyBkb3duLgorICAvLyBGSVhNRTogVGhpcyBpcyBhIGhvcnJpYmxlIGhhY2sgYW5kIGJyb2tlbiBpbiBvYnNjdXJlIGNhc2VzLCBubyB3b3JzZQorICAvLyB0aGFuIHRoZSBvbGQgaXNlbCB0aG91Z2guCisgIGludCBPbGRGbGFnUmVzdWx0Tm8gPSAtMSwgT2xkQ2hhaW5SZXN1bHRObyA9IC0xOworCisgIHVuc2lnbmVkIE5UTU51bVJlc3VsdHMgPSBOb2RlLT5nZXROdW1WYWx1ZXMoKTsKKyAgaWYgKE5vZGUtPmdldFZhbHVlVHlwZShOVE1OdW1SZXN1bHRzLTEpID09IE1WVDo6RmxhZykgeworICAgIE9sZEZsYWdSZXN1bHRObyA9IE5UTU51bVJlc3VsdHMtMTsKKyAgICBpZiAoTlRNTnVtUmVzdWx0cyAhPSAxICYmCisgICAgICAgIE5vZGUtPmdldFZhbHVlVHlwZShOVE1OdW1SZXN1bHRzLTIpID09IE1WVDo6T3RoZXIpCisgICAgICBPbGRDaGFpblJlc3VsdE5vID0gTlRNTnVtUmVzdWx0cy0yOworICB9IGVsc2UgaWYgKE5vZGUtPmdldFZhbHVlVHlwZShOVE1OdW1SZXN1bHRzLTEpID09IE1WVDo6T3RoZXIpCisgICAgT2xkQ2hhaW5SZXN1bHRObyA9IE5UTU51bVJlc3VsdHMtMTsKKworICAvLyBDYWxsIHRoZSB1bmRlcmx5aW5nIFNlbGVjdGlvbkRBRyByb3V0aW5lIHRvIGRvIHRoZSB0cmFuc21vZ3JpZmljYXRpb24uIE5vdGUKKyAgLy8gdGhhdCB0aGlzIGRlbGV0ZXMgb3BlcmFuZHMgb2YgdGhlIG9sZCBub2RlIHRoYXQgYmVjb21lIGRlYWQuCisgIFNETm9kZSAqUmVzID0gQ3VyREFHLT5Nb3JwaE5vZGVUbyhOb2RlLCB+VGFyZ2V0T3BjLCBWVExpc3QsIE9wcywgTnVtT3BzKTsKKworICAvLyBNb3JwaE5vZGVUbyBjYW4gb3BlcmF0ZSBpbiB0d28gd2F5czogaWYgYW4gZXhpc3Rpbmcgbm9kZSB3aXRoIHRoZQorICAvLyBzcGVjaWZpZWQgb3BlcmFuZHMgZXhpc3RzLCBpdCBjYW4ganVzdCByZXR1cm4gaXQuICBPdGhlcndpc2UsIGl0CisgIC8vIHVwZGF0ZXMgdGhlIG5vZGUgaW4gcGxhY2UgdG8gaGF2ZSB0aGUgcmVxdWVzdGVkIG9wZXJhbmRzLgorICBpZiAoUmVzID09IE5vZGUpIHsKKyAgICAvLyBJZiB3ZSB1cGRhdGVkIHRoZSBub2RlIGluIHBsYWNlLCByZXNldCB0aGUgbm9kZSBJRC4gIFRvIHRoZSBpc2VsLAorICAgIC8vIHRoaXMgc2hvdWxkIGJlIGp1c3QgbGlrZSBhIG5ld2x5IGFsbG9jYXRlZCBtYWNoaW5lIG5vZGUuCisgICAgUmVzLT5zZXROb2RlSWQoLTEpOworICB9CisKKyAgdW5zaWduZWQgUmVzTnVtUmVzdWx0cyA9IFJlcy0+Z2V0TnVtVmFsdWVzKCk7CisgIC8vIE1vdmUgdGhlIGZsYWcgaWYgbmVlZGVkLgorICBpZiAoKEVtaXROb2RlSW5mbyAmIE9QRkxfRmxhZ091dHB1dCkgJiYgT2xkRmxhZ1Jlc3VsdE5vICE9IC0xICYmCisgICAgICAodW5zaWduZWQpT2xkRmxhZ1Jlc3VsdE5vICE9IFJlc051bVJlc3VsdHMtMSkKKyAgICBDdXJEQUctPlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShOb2RlLCBPbGRGbGFnUmVzdWx0Tm8pLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShSZXMsIFJlc051bVJlc3VsdHMtMSkpOworCisgIGlmICgoRW1pdE5vZGVJbmZvICYgT1BGTF9GbGFnT3V0cHV0KSAhPSAwKQorICAgIC0tUmVzTnVtUmVzdWx0czsKKworICAvLyBNb3ZlIHRoZSBjaGFpbiByZWZlcmVuY2UgaWYgbmVlZGVkLgorICBpZiAoKEVtaXROb2RlSW5mbyAmIE9QRkxfQ2hhaW4pICYmIE9sZENoYWluUmVzdWx0Tm8gIT0gLTEgJiYKKyAgICAgICh1bnNpZ25lZClPbGRDaGFpblJlc3VsdE5vICE9IFJlc051bVJlc3VsdHMtMSkKKyAgICBDdXJEQUctPlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShOb2RlLCBPbGRDaGFpblJlc3VsdE5vKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoUmVzLCBSZXNOdW1SZXN1bHRzLTEpKTsKKworICAvLyBPdGhlcndpc2UsIG5vIHJlcGxhY2VtZW50IGhhcHBlbmVkIGJlY2F1c2UgdGhlIG5vZGUgYWxyZWFkeSBleGlzdHMuIFJlcGxhY2UKKyAgLy8gVXNlcyBvZiB0aGUgb2xkIG5vZGUgd2l0aCB0aGUgbmV3IG9uZS4KKyAgaWYgKFJlcyAhPSBOb2RlKQorICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNXaXRoKE5vZGUsIFJlcyk7CisgIAorICByZXR1cm4gUmVzOworfQorCisvLy8gQ2hlY2tQYXR0ZXJuUHJlZGljYXRlIC0gSW1wbGVtZW50cyBPUF9DaGVja1BhdHRlcm5QcmVkaWNhdGUuCitBTFdBWVNfSU5MSU5FIHN0YXRpYyBib29sCitDaGVja1NhbWUoY29uc3QgdW5zaWduZWQgY2hhciAqTWF0Y2hlclRhYmxlLCB1bnNpZ25lZCAmTWF0Y2hlckluZGV4LAorICAgICAgICAgIFNEVmFsdWUgTiwgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZWNvcmRlZE5vZGVzKSB7CisgIC8vIEFjY2VwdCBpZiBpdCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGEgcHJldmlvdXNseSByZWNvcmRlZCBub2RlLgorICB1bnNpZ25lZCBSZWNObyA9IE1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgIGFzc2VydChSZWNObyA8IFJlY29yZGVkTm9kZXMuc2l6ZSgpICYmICJJbnZhbGlkIENoZWNrU2FtZSIpOworICByZXR1cm4gTiA9PSBSZWNvcmRlZE5vZGVzW1JlY05vXTsKK30KKyAgCisvLy8gQ2hlY2tQYXR0ZXJuUHJlZGljYXRlIC0gSW1wbGVtZW50cyBPUF9DaGVja1BhdHRlcm5QcmVkaWNhdGUuCitBTFdBWVNfSU5MSU5FIHN0YXRpYyBib29sCitDaGVja1BhdHRlcm5QcmVkaWNhdGUoY29uc3QgdW5zaWduZWQgY2hhciAqTWF0Y2hlclRhYmxlLCB1bnNpZ25lZCAmTWF0Y2hlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBR0lTZWwgJlNESVNlbCkgeworICByZXR1cm4gU0RJU2VsLkNoZWNrUGF0dGVyblByZWRpY2F0ZShNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdKTsKK30KKworLy8vIENoZWNrTm9kZVByZWRpY2F0ZSAtIEltcGxlbWVudHMgT1BfQ2hlY2tOb2RlUHJlZGljYXRlLgorQUxXQVlTX0lOTElORSBzdGF0aWMgYm9vbAorQ2hlY2tOb2RlUHJlZGljYXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKk1hdGNoZXJUYWJsZSwgdW5zaWduZWQgJk1hdGNoZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUdJU2VsICZTRElTZWwsIFNETm9kZSAqTikgeworICByZXR1cm4gU0RJU2VsLkNoZWNrTm9kZVByZWRpY2F0ZShOLCBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdKTsKK30KKworQUxXQVlTX0lOTElORSBzdGF0aWMgYm9vbAorQ2hlY2tPcGNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqTWF0Y2hlclRhYmxlLCB1bnNpZ25lZCAmTWF0Y2hlckluZGV4LAorICAgICAgICAgICAgU0ROb2RlICpOKSB7CisgIHVpbnQxNl90IE9wYyA9IE1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgIE9wYyB8PSAodW5zaWduZWQgc2hvcnQpTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXSA8PCA4OworICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gT3BjOworfQorCitBTFdBWVNfSU5MSU5FIHN0YXRpYyBib29sCitDaGVja1R5cGUoY29uc3QgdW5zaWduZWQgY2hhciAqTWF0Y2hlclRhYmxlLCB1bnNpZ25lZCAmTWF0Y2hlckluZGV4LAorICAgICAgICAgIFNEVmFsdWUgTiwgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICBpZiAoTi5nZXRWYWx1ZVR5cGUoKSA9PSBWVCkgcmV0dXJuIHRydWU7CisgIAorICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlbiBWVCBpcyBpUFRSLgorICByZXR1cm4gVlQgPT0gTVZUOjppUFRSICYmIE4uZ2V0VmFsdWVUeXBlKCkgPT0gVExJLmdldFBvaW50ZXJUeSgpOworfQorCitBTFdBWVNfSU5MSU5FIHN0YXRpYyBib29sCitDaGVja0NoaWxkVHlwZShjb25zdCB1bnNpZ25lZCBjaGFyICpNYXRjaGVyVGFibGUsIHVuc2lnbmVkICZNYXRjaGVySW5kZXgsCisgICAgICAgICAgICAgICBTRFZhbHVlIE4sIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEksCisgICAgICAgICAgICAgICB1bnNpZ25lZCBDaGlsZE5vKSB7CisgIGlmIChDaGlsZE5vID49IE4uZ2V0TnVtT3BlcmFuZHMoKSkKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBNYXRjaCBmYWlscyBpZiBvdXQgb2YgcmFuZ2UgY2hpbGQgIy4KKyAgcmV0dXJuIDo6Q2hlY2tUeXBlKE1hdGNoZXJUYWJsZSwgTWF0Y2hlckluZGV4LCBOLmdldE9wZXJhbmQoQ2hpbGRObyksIFRMSSk7Cit9CisKKworQUxXQVlTX0lOTElORSBzdGF0aWMgYm9vbAorQ2hlY2tDb25kQ29kZShjb25zdCB1bnNpZ25lZCBjaGFyICpNYXRjaGVyVGFibGUsIHVuc2lnbmVkICZNYXRjaGVySW5kZXgsCisgICAgICAgICAgICAgIFNEVmFsdWUgTikgeworICByZXR1cm4gY2FzdDxDb25kQ29kZVNETm9kZT4oTiktPmdldCgpID09CisgICAgICAoSVNEOjpDb25kQ29kZSlNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworfQorCitBTFdBWVNfSU5MSU5FIHN0YXRpYyBib29sCitDaGVja1ZhbHVlVHlwZShjb25zdCB1bnNpZ25lZCBjaGFyICpNYXRjaGVyVGFibGUsIHVuc2lnbmVkICZNYXRjaGVySW5kZXgsCisgICAgICAgICAgICAgICBTRFZhbHVlIE4sIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpIHsKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgaWYgKGNhc3Q8VlRTRE5vZGU+KE4pLT5nZXRWVCgpID09IFZUKQorICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZW4gVlQgaXMgaVBUUi4KKyAgcmV0dXJuIFZUID09IE1WVDo6aVBUUiAmJiBjYXN0PFZUU0ROb2RlPihOKS0+Z2V0VlQoKSA9PSBUTEkuZ2V0UG9pbnRlclR5KCk7Cit9CisKK0FMV0FZU19JTkxJTkUgc3RhdGljIGJvb2wKK0NoZWNrSW50ZWdlcihjb25zdCB1bnNpZ25lZCBjaGFyICpNYXRjaGVyVGFibGUsIHVuc2lnbmVkICZNYXRjaGVySW5kZXgsCisgICAgICAgICAgICAgU0RWYWx1ZSBOKSB7CisgIGludDY0X3QgVmFsID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgaWYgKFZhbCAmIDEyOCkKKyAgICBWYWwgPSBHZXRWQlIoVmFsLCBNYXRjaGVyVGFibGUsIE1hdGNoZXJJbmRleCk7CisgIAorICBDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOKTsKKyAgcmV0dXJuIEMgIT0gMCAmJiBDLT5nZXRTRXh0VmFsdWUoKSA9PSBWYWw7Cit9CisKK0FMV0FZU19JTkxJTkUgc3RhdGljIGJvb2wKK0NoZWNrQW5kSW1tKGNvbnN0IHVuc2lnbmVkIGNoYXIgKk1hdGNoZXJUYWJsZSwgdW5zaWduZWQgJk1hdGNoZXJJbmRleCwKKyAgICAgICAgICAgIFNEVmFsdWUgTiwgU2VsZWN0aW9uREFHSVNlbCAmU0RJU2VsKSB7CisgIGludDY0X3QgVmFsID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgaWYgKFZhbCAmIDEyOCkKKyAgICBWYWwgPSBHZXRWQlIoVmFsLCBNYXRjaGVyVGFibGUsIE1hdGNoZXJJbmRleCk7CisgIAorICBpZiAoTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpBTkQpIHJldHVybiBmYWxzZTsKKyAgCisgIENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpOworICByZXR1cm4gQyAhPSAwICYmIFNESVNlbC5DaGVja0FuZE1hc2soTi5nZXRPcGVyYW5kKDApLCBDLCBWYWwpOworfQorCitBTFdBWVNfSU5MSU5FIHN0YXRpYyBib29sCitDaGVja09ySW1tKGNvbnN0IHVuc2lnbmVkIGNoYXIgKk1hdGNoZXJUYWJsZSwgdW5zaWduZWQgJk1hdGNoZXJJbmRleCwKKyAgICAgICAgICAgU0RWYWx1ZSBOLCBTZWxlY3Rpb25EQUdJU2VsICZTRElTZWwpIHsKKyAgaW50NjRfdCBWYWwgPSBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICBpZiAoVmFsICYgMTI4KQorICAgIFZhbCA9IEdldFZCUihWYWwsIE1hdGNoZXJUYWJsZSwgTWF0Y2hlckluZGV4KTsKKyAgCisgIGlmIChOLT5nZXRPcGNvZGUoKSAhPSBJU0Q6Ok9SKSByZXR1cm4gZmFsc2U7CisgIAorICBDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKTsKKyAgcmV0dXJuIEMgIT0gMCAmJiBTRElTZWwuQ2hlY2tPck1hc2soTi5nZXRPcGVyYW5kKDApLCBDLCBWYWwpOworfQorCisvLy8gSXNQcmVkaWNhdGVLbm93blRvRmFpbCAtIElmIHdlIGtub3cgaG93IGFuZCBjYW4gZG8gc28gd2l0aG91dCBwdXNoaW5nIGEKKy8vLyBzY29wZSwgZXZhbHVhdGUgdGhlIGN1cnJlbnQgbm9kZS4gIElmIHRoZSBjdXJyZW50IHByZWRpY2F0ZSBpcyBrbm93biB0bworLy8vIGZhaWwsIHNldCBSZXN1bHQ9dHJ1ZSBhbmQgcmV0dXJuIGFueXRoaW5nLiAgSWYgdGhlIGN1cnJlbnQgcHJlZGljYXRlIGlzCisvLy8ga25vd24gdG8gcGFzcywgc2V0IFJlc3VsdD1mYWxzZSBhbmQgcmV0dXJuIHRoZSBNYXRjaGVySW5kZXggdG8gY29udGludWUKKy8vLyB3aXRoLiAgSWYgdGhlIGN1cnJlbnQgcHJlZGljYXRlIGlzIHVua25vd24sIHNldCBSZXN1bHQ9ZmFsc2UgYW5kIHJldHVybiB0aGUKKy8vLyBNYXRjaGVySW5kZXggdG8gY29udGludWUgd2l0aC4gCitzdGF0aWMgdW5zaWduZWQgSXNQcmVkaWNhdGVLbm93blRvRmFpbChjb25zdCB1bnNpZ25lZCBjaGFyICpUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGV4LCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZSZXN1bHQsIFNlbGVjdGlvbkRBR0lTZWwgJlNESVNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmUmVjb3JkZWROb2Rlcyl7CisgIHN3aXRjaCAoVGFibGVbSW5kZXgrK10pIHsKKyAgZGVmYXVsdDoKKyAgICBSZXN1bHQgPSBmYWxzZTsKKyAgICByZXR1cm4gSW5kZXgtMTsgIC8vIENvdWxkIG5vdCBldmFsdWF0ZSB0aGlzIHByZWRpY2F0ZS4KKyAgY2FzZSBTZWxlY3Rpb25EQUdJU2VsOjpPUENfQ2hlY2tTYW1lOgorICAgIFJlc3VsdCA9ICE6OkNoZWNrU2FtZShUYWJsZSwgSW5kZXgsIE4sIFJlY29yZGVkTm9kZXMpOworICAgIHJldHVybiBJbmRleDsKKyAgY2FzZSBTZWxlY3Rpb25EQUdJU2VsOjpPUENfQ2hlY2tQYXR0ZXJuUHJlZGljYXRlOgorICAgIFJlc3VsdCA9ICE6OkNoZWNrUGF0dGVyblByZWRpY2F0ZShUYWJsZSwgSW5kZXgsIFNESVNlbCk7CisgICAgcmV0dXJuIEluZGV4OworICBjYXNlIFNlbGVjdGlvbkRBR0lTZWw6Ok9QQ19DaGVja1ByZWRpY2F0ZToKKyAgICBSZXN1bHQgPSAhOjpDaGVja05vZGVQcmVkaWNhdGUoVGFibGUsIEluZGV4LCBTRElTZWwsIE4uZ2V0Tm9kZSgpKTsKKyAgICByZXR1cm4gSW5kZXg7CisgIGNhc2UgU2VsZWN0aW9uREFHSVNlbDo6T1BDX0NoZWNrT3Bjb2RlOgorICAgIFJlc3VsdCA9ICE6OkNoZWNrT3Bjb2RlKFRhYmxlLCBJbmRleCwgTi5nZXROb2RlKCkpOworICAgIHJldHVybiBJbmRleDsKKyAgY2FzZSBTZWxlY3Rpb25EQUdJU2VsOjpPUENfQ2hlY2tUeXBlOgorICAgIFJlc3VsdCA9ICE6OkNoZWNrVHlwZShUYWJsZSwgSW5kZXgsIE4sIFNESVNlbC5UTEkpOworICAgIHJldHVybiBJbmRleDsKKyAgY2FzZSBTZWxlY3Rpb25EQUdJU2VsOjpPUENfQ2hlY2tDaGlsZDBUeXBlOgorICBjYXNlIFNlbGVjdGlvbkRBR0lTZWw6Ok9QQ19DaGVja0NoaWxkMVR5cGU6CisgIGNhc2UgU2VsZWN0aW9uREFHSVNlbDo6T1BDX0NoZWNrQ2hpbGQyVHlwZToKKyAgY2FzZSBTZWxlY3Rpb25EQUdJU2VsOjpPUENfQ2hlY2tDaGlsZDNUeXBlOgorICBjYXNlIFNlbGVjdGlvbkRBR0lTZWw6Ok9QQ19DaGVja0NoaWxkNFR5cGU6CisgIGNhc2UgU2VsZWN0aW9uREFHSVNlbDo6T1BDX0NoZWNrQ2hpbGQ1VHlwZToKKyAgY2FzZSBTZWxlY3Rpb25EQUdJU2VsOjpPUENfQ2hlY2tDaGlsZDZUeXBlOgorICBjYXNlIFNlbGVjdGlvbkRBR0lTZWw6Ok9QQ19DaGVja0NoaWxkN1R5cGU6CisgICAgUmVzdWx0ID0gITo6Q2hlY2tDaGlsZFR5cGUoVGFibGUsIEluZGV4LCBOLCBTRElTZWwuVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVbSW5kZXgtMV0gLSBTZWxlY3Rpb25EQUdJU2VsOjpPUENfQ2hlY2tDaGlsZDBUeXBlKTsKKyAgICByZXR1cm4gSW5kZXg7CisgIGNhc2UgU2VsZWN0aW9uREFHSVNlbDo6T1BDX0NoZWNrQ29uZENvZGU6CisgICAgUmVzdWx0ID0gITo6Q2hlY2tDb25kQ29kZShUYWJsZSwgSW5kZXgsIE4pOworICAgIHJldHVybiBJbmRleDsKKyAgY2FzZSBTZWxlY3Rpb25EQUdJU2VsOjpPUENfQ2hlY2tWYWx1ZVR5cGU6CisgICAgUmVzdWx0ID0gITo6Q2hlY2tWYWx1ZVR5cGUoVGFibGUsIEluZGV4LCBOLCBTRElTZWwuVExJKTsKKyAgICByZXR1cm4gSW5kZXg7CisgIGNhc2UgU2VsZWN0aW9uREFHSVNlbDo6T1BDX0NoZWNrSW50ZWdlcjoKKyAgICBSZXN1bHQgPSAhOjpDaGVja0ludGVnZXIoVGFibGUsIEluZGV4LCBOKTsKKyAgICByZXR1cm4gSW5kZXg7CisgIGNhc2UgU2VsZWN0aW9uREFHSVNlbDo6T1BDX0NoZWNrQW5kSW1tOgorICAgIFJlc3VsdCA9ICE6OkNoZWNrQW5kSW1tKFRhYmxlLCBJbmRleCwgTiwgU0RJU2VsKTsKKyAgICByZXR1cm4gSW5kZXg7CisgIGNhc2UgU2VsZWN0aW9uREFHSVNlbDo6T1BDX0NoZWNrT3JJbW06CisgICAgUmVzdWx0ID0gITo6Q2hlY2tPckltbShUYWJsZSwgSW5kZXgsIE4sIFNESVNlbCk7CisgICAgcmV0dXJuIEluZGV4OworICB9Cit9CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBNYXRjaFNjb3BlIHsKKyAgLy8vIEZhaWxJbmRleCAtIElmIHRoaXMgbWF0Y2ggZmFpbHMsIHRoaXMgaXMgdGhlIGluZGV4IHRvIGNvbnRpbnVlIHdpdGguCisgIHVuc2lnbmVkIEZhaWxJbmRleDsKKyAgCisgIC8vLyBOb2RlU3RhY2sgLSBUaGUgbm9kZSBzdGFjayB3aGVuIHRoZSBzY29wZSB3YXMgZm9ybWVkLgorICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBOb2RlU3RhY2s7CisgIAorICAvLy8gTnVtUmVjb3JkZWROb2RlcyAtIFRoZSBudW1iZXIgb2YgcmVjb3JkZWQgbm9kZXMgd2hlbiB0aGUgc2NvcGUgd2FzIGZvcm1lZC4KKyAgdW5zaWduZWQgTnVtUmVjb3JkZWROb2RlczsKKyAgCisgIC8vLyBOdW1NYXRjaGVkTWVtUmVmcyAtIFRoZSBudW1iZXIgb2YgbWF0Y2hlZCBtZW1yZWYgZW50cmllcy4KKyAgdW5zaWduZWQgTnVtTWF0Y2hlZE1lbVJlZnM7CisgIAorICAvLy8gSW5wdXRDaGFpbi9JbnB1dEZsYWcgLSBUaGUgY3VycmVudCBjaGFpbi9mbGFnIAorICBTRFZhbHVlIElucHV0Q2hhaW4sIElucHV0RmxhZzsKKworICAvLy8gSGFzQ2hhaW5Ob2Rlc01hdGNoZWQgLSBUcnVlIGlmIHRoZSBDaGFpbk5vZGVzTWF0Y2hlZCBsaXN0IGlzIG5vbi1lbXB0eS4KKyAgYm9vbCBIYXNDaGFpbk5vZGVzTWF0Y2hlZCwgSGFzRmxhZ1Jlc3VsdE5vZGVzTWF0Y2hlZDsKK307CisKK30KKworU0ROb2RlICpTZWxlY3Rpb25EQUdJU2VsOjoKK1NlbGVjdENvZGVDb21tb24oU0ROb2RlICpOb2RlVG9NYXRjaCwgY29uc3QgdW5zaWduZWQgY2hhciAqTWF0Y2hlclRhYmxlLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUYWJsZVNpemUpIHsKKyAgLy8gRklYTUU6IFNob3VsZCB0aGVzZSBldmVuIGJlIHNlbGVjdGVkPyAgSGFuZGxlIHRoZXNlIGNhc2VzIGluIHRoZSBjYWxsZXI/CisgIHN3aXRjaCAoTm9kZVRvTWF0Y2gtPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpFbnRyeVRva2VuOiAgICAgICAvLyBUaGVzZSBub2RlcyByZW1haW4gdGhlIHNhbWUuCisgIGNhc2UgSVNEOjpCYXNpY0Jsb2NrOgorICBjYXNlIElTRDo6UmVnaXN0ZXI6CisgIC8vY2FzZSBJU0Q6OlZBTFVFVFlQRToKKyAgLy9jYXNlIElTRDo6Q09ORENPREU6CisgIGNhc2UgSVNEOjpIQU5ETEVOT0RFOgorICBjYXNlIElTRDo6TUROT0RFX1NETk9ERToKKyAgY2FzZSBJU0Q6OlRhcmdldENvbnN0YW50OgorICBjYXNlIElTRDo6VGFyZ2V0Q29uc3RhbnRGUDoKKyAgY2FzZSBJU0Q6OlRhcmdldENvbnN0YW50UG9vbDoKKyAgY2FzZSBJU0Q6OlRhcmdldEZyYW1lSW5kZXg6CisgIGNhc2UgSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbDoKKyAgY2FzZSBJU0Q6OlRhcmdldEJsb2NrQWRkcmVzczoKKyAgY2FzZSBJU0Q6OlRhcmdldEp1bXBUYWJsZToKKyAgY2FzZSBJU0Q6OlRhcmdldEdsb2JhbFRMU0FkZHJlc3M6CisgIGNhc2UgSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzOgorICBjYXNlIElTRDo6VG9rZW5GYWN0b3I6CisgIGNhc2UgSVNEOjpDb3B5RnJvbVJlZzoKKyAgY2FzZSBJU0Q6OkNvcHlUb1JlZzoKKyAgICBOb2RlVG9NYXRjaC0+c2V0Tm9kZUlkKC0xKTsgLy8gTWFyayBzZWxlY3RlZC4KKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJU0Q6OkFzc2VydFNleHQ6CisgIGNhc2UgSVNEOjpBc3NlcnRaZXh0OgorICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlKE5vZGVUb01hdGNoLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZVRvTWF0Y2gtPmdldE9wZXJhbmQoMCkpOworICAgIHJldHVybiAwOworICBjYXNlIElTRDo6VU5ERUY6ICAgICByZXR1cm4gU2VsZWN0X1VOREVGKE5vZGVUb01hdGNoKTsKKyAgfQorICAKKyAgYXNzZXJ0KCFOb2RlVG9NYXRjaC0+aXNNYWNoaW5lT3Bjb2RlKCkgJiYgIk5vZGUgYWxyZWFkeSBzZWxlY3RlZCEiKTsKKworICAvLyBTZXQgdXAgdGhlIG5vZGUgc3RhY2sgd2l0aCBOb2RlVG9NYXRjaCBhcyB0aGUgb25seSBub2RlIG9uIHRoZSBzdGFjay4KKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gTm9kZVN0YWNrOworICBTRFZhbHVlIE4gPSBTRFZhbHVlKE5vZGVUb01hdGNoLCAwKTsKKyAgTm9kZVN0YWNrLnB1c2hfYmFjayhOKTsKKworICAvLyBNYXRjaFNjb3BlcyAtIFNjb3BlcyB1c2VkIHdoZW4gbWF0Y2hpbmcsIGlmIGEgbWF0Y2ggZmFpbHVyZSBoYXBwZW5zLCB0aGlzCisgIC8vIGluZGljYXRlcyB3aGVyZSB0byBjb250aW51ZSBjaGVja2luZy4KKyAgU21hbGxWZWN0b3I8TWF0Y2hTY29wZSwgOD4gTWF0Y2hTY29wZXM7CisgIAorICAvLyBSZWNvcmRlZE5vZGVzIC0gVGhpcyBpcyB0aGUgc2V0IG9mIG5vZGVzIHRoYXQgaGF2ZSBiZWVuIHJlY29yZGVkIGJ5IHRoZQorICAvLyBzdGF0ZSBtYWNoaW5lLgorICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBSZWNvcmRlZE5vZGVzOworICAKKyAgLy8gTWF0Y2hlZE1lbVJlZnMgLSBUaGlzIGlzIHRoZSBzZXQgb2YgTWVtUmVmJ3Mgd2UndmUgc2VlbiBpbiB0aGUgaW5wdXQKKyAgLy8gcGF0dGVybi4KKyAgU21hbGxWZWN0b3I8TWFjaGluZU1lbU9wZXJhbmQqLCAyPiBNYXRjaGVkTWVtUmVmczsKKyAgCisgIC8vIFRoZXNlIGFyZSB0aGUgY3VycmVudCBpbnB1dCBjaGFpbiBhbmQgZmxhZyBmb3IgdXNlIHdoZW4gZ2VuZXJhdGluZyBub2Rlcy4KKyAgLy8gVmFyaW91cyBFbWl0IG9wZXJhdGlvbnMgY2hhbmdlIHRoZXNlLiAgRm9yIGV4YW1wbGUsIGVtaXR0aW5nIGEgY29weXRvcmVnCisgIC8vIHVzZXMgYW5kIHVwZGF0ZXMgdGhlc2UuCisgIFNEVmFsdWUgSW5wdXRDaGFpbiwgSW5wdXRGbGFnOworICAKKyAgLy8gQ2hhaW5Ob2Rlc01hdGNoZWQgLSBJZiBhIHBhdHRlcm4gbWF0Y2hlcyBub2RlcyB0aGF0IGhhdmUgaW5wdXQvb3V0cHV0CisgIC8vIGNoYWlucywgdGhlIE9QQ19FbWl0TWVyZ2VJbnB1dENoYWlucyBvcGVyYXRpb24gaXMgZW1pdHRlZCB3aGljaCBpbmRpY2F0ZXMKKyAgLy8gd2hpY2ggb25lcyB0aGV5IGFyZS4gIFRoZSByZXN1bHQgaXMgY2FwdHVyZWQgaW50byB0aGlzIGxpc3Qgc28gdGhhdCB3ZSBjYW4KKyAgLy8gdXBkYXRlIHRoZSBjaGFpbiByZXN1bHRzIHdoZW4gdGhlIHBhdHRlcm4gaXMgY29tcGxldGUuCisgIFNtYWxsVmVjdG9yPFNETm9kZSosIDM+IENoYWluTm9kZXNNYXRjaGVkOworICBTbWFsbFZlY3RvcjxTRE5vZGUqLCAzPiBGbGFnUmVzdWx0Tm9kZXNNYXRjaGVkOworICAKKyAgREVCVUcoZXJycygpIDw8ICJJU0VMOiBTdGFydGluZyBwYXR0ZXJuIG1hdGNoIG9uIHJvb3Qgbm9kZTogIjsKKyAgICAgICAgTm9kZVRvTWF0Y2gtPmR1bXAoQ3VyREFHKTsKKyAgICAgICAgZXJycygpIDw8ICdcbicpOworICAKKyAgLy8gRGV0ZXJtaW5lIHdoZXJlIHRvIHN0YXJ0IHRoZSBpbnRlcnByZXRlci4gIE5vcm1hbGx5IHdlIHN0YXJ0IGF0IG9wY29kZSAjMCwKKyAgLy8gYnV0IGlmIHRoZSBzdGF0ZSBtYWNoaW5lIHN0YXJ0cyB3aXRoIGFuIE9QQ19Td2l0Y2hPcGNvZGUsIHRoZW4gd2UKKyAgLy8gYWNjZWxlcmF0ZSB0aGUgZmlyc3QgbG9va3VwICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGhvdCkgd2l0aCB0aGUKKyAgLy8gT3Bjb2RlT2Zmc2V0IHRhYmxlLgorICB1bnNpZ25lZCBNYXRjaGVySW5kZXggPSAwOworICAKKyAgaWYgKCFPcGNvZGVPZmZzZXQuZW1wdHkoKSkgeworICAgIC8vIEFscmVhZHkgY29tcHV0ZWQgdGhlIE9wY29kZU9mZnNldCB0YWJsZSwganVzdCBpbmRleCBpbnRvIGl0LgorICAgIGlmIChOLmdldE9wY29kZSgpIDwgT3Bjb2RlT2Zmc2V0LnNpemUoKSkKKyAgICAgIE1hdGNoZXJJbmRleCA9IE9wY29kZU9mZnNldFtOLmdldE9wY29kZSgpXTsKKyAgICBERUJVRyhlcnJzKCkgPDwgIiAgSW5pdGlhbCBPcGNvZGUgaW5kZXggdG8gIiA8PCBNYXRjaGVySW5kZXggPDwgIlxuIik7CisKKyAgfSBlbHNlIGlmIChNYXRjaGVyVGFibGVbMF0gPT0gT1BDX1N3aXRjaE9wY29kZSkgeworICAgIC8vIE90aGVyd2lzZSwgdGhlIHRhYmxlIGlzbid0IGNvbXB1dGVkLCBidXQgdGhlIHN0YXRlIG1hY2hpbmUgZG9lcyBzdGFydAorICAgIC8vIHdpdGggYW4gT1BDX1N3aXRjaE9wY29kZSBpbnN0cnVjdGlvbi4gIFBvcHVsYXRlIHRoZSB0YWJsZSBub3csIHNpbmNlIHRoaXMKKyAgICAvLyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZWxlY3RpbmcgYW4gaW5zdHJ1Y3Rpb24uCisgICAgdW5zaWduZWQgSWR4ID0gMTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgLy8gR2V0IHRoZSBzaXplIG9mIHRoaXMgY2FzZS4KKyAgICAgIHVuc2lnbmVkIENhc2VTaXplID0gTWF0Y2hlclRhYmxlW0lkeCsrXTsKKyAgICAgIGlmIChDYXNlU2l6ZSAmIDEyOCkKKyAgICAgICAgQ2FzZVNpemUgPSBHZXRWQlIoQ2FzZVNpemUsIE1hdGNoZXJUYWJsZSwgSWR4KTsKKyAgICAgIGlmIChDYXNlU2l6ZSA9PSAwKSBicmVhazsKKworICAgICAgLy8gR2V0IHRoZSBvcGNvZGUsIGFkZCB0aGUgaW5kZXggdG8gdGhlIHRhYmxlLgorICAgICAgdWludDE2X3QgT3BjID0gTWF0Y2hlclRhYmxlW0lkeCsrXTsKKyAgICAgIE9wYyB8PSAodW5zaWduZWQgc2hvcnQpTWF0Y2hlclRhYmxlW0lkeCsrXSA8PCA4OworICAgICAgaWYgKE9wYyA+PSBPcGNvZGVPZmZzZXQuc2l6ZSgpKQorICAgICAgICBPcGNvZGVPZmZzZXQucmVzaXplKChPcGMrMSkqMik7CisgICAgICBPcGNvZGVPZmZzZXRbT3BjXSA9IElkeDsKKyAgICAgIElkeCArPSBDYXNlU2l6ZTsKKyAgICB9CisKKyAgICAvLyBPa2F5LCBkbyB0aGUgbG9va3VwIGZvciB0aGUgZmlyc3Qgb3Bjb2RlLgorICAgIGlmIChOLmdldE9wY29kZSgpIDwgT3Bjb2RlT2Zmc2V0LnNpemUoKSkKKyAgICAgIE1hdGNoZXJJbmRleCA9IE9wY29kZU9mZnNldFtOLmdldE9wY29kZSgpXTsKKyAgfQorICAKKyAgd2hpbGUgKDEpIHsKKyAgICBhc3NlcnQoTWF0Y2hlckluZGV4IDwgVGFibGVTaXplICYmICJJbnZhbGlkIGluZGV4Iik7CisjaWZuZGVmIE5ERUJVRworICAgIHVuc2lnbmVkIEN1cnJlbnRPcGNvZGVJbmRleCA9IE1hdGNoZXJJbmRleDsKKyNlbmRpZgorICAgIEJ1aWx0aW5PcGNvZGVzIE9wY29kZSA9IChCdWlsdGluT3Bjb2RlcylNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICAgIHN3aXRjaCAoT3Bjb2RlKSB7CisgICAgY2FzZSBPUENfU2NvcGU6IHsKKyAgICAgIC8vIE9rYXksIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBvcGVyYXRpb24gYXJlIHRoYXQgd2Ugc2hvdWxkIHB1c2ggYSBzY29wZQorICAgICAgLy8gdGhlbiBldmFsdWF0ZSB0aGUgZmlyc3QgY2hpbGQuICBIb3dldmVyLCBwdXNoaW5nIGEgc2NvcGUgb25seSB0byBoYXZlCisgICAgICAvLyB0aGUgZmlyc3QgY2hlY2sgZmFpbCAod2hpY2ggdGhlbiBwb3BzIGl0KSBpcyBpbmVmZmljaWVudC4gIElmIHdlIGNhbgorICAgICAgLy8gZGV0ZXJtaW5lIGltbWVkaWF0ZWx5IHRoYXQgdGhlIGZpcnN0IGNoZWNrIChvciBmaXJzdCBzZXZlcmFsKSB3aWxsCisgICAgICAvLyBpbW1lZGlhdGVseSBmYWlsLCBkb24ndCBldmVuIGJvdGhlciBwdXNoaW5nIGEgc2NvcGUgZm9yIHRoZW0uCisgICAgICB1bnNpZ25lZCBGYWlsSW5kZXg7CisgICAgICAKKyAgICAgIHdoaWxlICgxKSB7CisgICAgICAgIHVuc2lnbmVkIE51bVRvU2tpcCA9IE1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgICAgICAgIGlmIChOdW1Ub1NraXAgJiAxMjgpCisgICAgICAgICAgTnVtVG9Ta2lwID0gR2V0VkJSKE51bVRvU2tpcCwgTWF0Y2hlclRhYmxlLCBNYXRjaGVySW5kZXgpOworICAgICAgICAvLyBGb3VuZCB0aGUgZW5kIG9mIHRoZSBzY29wZSB3aXRoIG5vIG1hdGNoLgorICAgICAgICBpZiAoTnVtVG9Ta2lwID09IDApIHsKKyAgICAgICAgICBGYWlsSW5kZXggPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBGYWlsSW5kZXggPSBNYXRjaGVySW5kZXgrTnVtVG9Ta2lwOworICAgICAgICAKKyAgICAgICAgdW5zaWduZWQgTWF0Y2hlckluZGV4T2ZQcmVkaWNhdGUgPSBNYXRjaGVySW5kZXg7CisgICAgICAgICh2b2lkKU1hdGNoZXJJbmRleE9mUHJlZGljYXRlOyAvLyBzaWxlbmNlIHdhcm5pbmcuCisgICAgICAgIAorICAgICAgICAvLyBJZiB3ZSBjYW4ndCBldmFsdWF0ZSB0aGlzIHByZWRpY2F0ZSB3aXRob3V0IHB1c2hpbmcgYSBzY29wZSAoZS5nLiBpZgorICAgICAgICAvLyBpdCBpcyBhICdNb3ZlUGFyZW50Jykgb3IgaWYgdGhlIHByZWRpY2F0ZSBzdWNjZWVkcyBvbiB0aGlzIG5vZGUsIHdlCisgICAgICAgIC8vIHB1c2ggdGhlIHNjb3BlIGFuZCBldmFsdWF0ZSB0aGUgZnVsbCBwcmVkaWNhdGUgY2hhaW4uCisgICAgICAgIGJvb2wgUmVzdWx0OworICAgICAgICBNYXRjaGVySW5kZXggPSBJc1ByZWRpY2F0ZUtub3duVG9GYWlsKE1hdGNoZXJUYWJsZSwgTWF0Y2hlckluZGV4LCBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdCwgKnRoaXMsIFJlY29yZGVkTm9kZXMpOworICAgICAgICBpZiAoIVJlc3VsdCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIERFQlVHKGVycnMoKSA8PCAiICBTa2lwcGVkIHNjb3BlIGVudHJ5IChkdWUgdG8gZmFsc2UgcHJlZGljYXRlKSBhdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCAiaW5kZXggIiA8PCBNYXRjaGVySW5kZXhPZlByZWRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgPDwgIiwgY29udGludWluZyBhdCAiIDw8IEZhaWxJbmRleCA8PCAiXG4iKTsKKyAgICAgICAgKytOdW1EQUdJc2VsUmV0cmllczsKKyAgICAgICAgCisgICAgICAgIC8vIE90aGVyd2lzZSwgd2Uga25vdyB0aGF0IHRoaXMgY2FzZSBvZiB0aGUgU2NvcGUgaXMgZ3VhcmFudGVlZCB0byBmYWlsLAorICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXh0IGNhc2UuCisgICAgICAgIE1hdGNoZXJJbmRleCA9IEZhaWxJbmRleDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gSWYgdGhlIHdob2xlIHNjb3BlIGZhaWxlZCB0byBtYXRjaCwgYmFpbC4KKyAgICAgIGlmIChGYWlsSW5kZXggPT0gMCkgYnJlYWs7CisgICAgICAKKyAgICAgIC8vIFB1c2ggYSBNYXRjaFNjb3BlIHdoaWNoIGluZGljYXRlcyB3aGVyZSB0byBnbyBpZiB0aGUgZmlyc3QgY2hpbGQgZmFpbHMKKyAgICAgIC8vIHRvIG1hdGNoLgorICAgICAgTWF0Y2hTY29wZSBOZXdFbnRyeTsKKyAgICAgIE5ld0VudHJ5LkZhaWxJbmRleCA9IEZhaWxJbmRleDsKKyAgICAgIE5ld0VudHJ5Lk5vZGVTdGFjay5hcHBlbmQoTm9kZVN0YWNrLmJlZ2luKCksIE5vZGVTdGFjay5lbmQoKSk7CisgICAgICBOZXdFbnRyeS5OdW1SZWNvcmRlZE5vZGVzID0gUmVjb3JkZWROb2Rlcy5zaXplKCk7CisgICAgICBOZXdFbnRyeS5OdW1NYXRjaGVkTWVtUmVmcyA9IE1hdGNoZWRNZW1SZWZzLnNpemUoKTsKKyAgICAgIE5ld0VudHJ5LklucHV0Q2hhaW4gPSBJbnB1dENoYWluOworICAgICAgTmV3RW50cnkuSW5wdXRGbGFnID0gSW5wdXRGbGFnOworICAgICAgTmV3RW50cnkuSGFzQ2hhaW5Ob2Rlc01hdGNoZWQgPSAhQ2hhaW5Ob2Rlc01hdGNoZWQuZW1wdHkoKTsKKyAgICAgIE5ld0VudHJ5Lkhhc0ZsYWdSZXN1bHROb2Rlc01hdGNoZWQgPSAhRmxhZ1Jlc3VsdE5vZGVzTWF0Y2hlZC5lbXB0eSgpOworICAgICAgTWF0Y2hTY29wZXMucHVzaF9iYWNrKE5ld0VudHJ5KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjYXNlIE9QQ19SZWNvcmROb2RlOgorICAgICAgLy8gUmVtZW1iZXIgdGhpcyBub2RlLCBpdCBtYXkgZW5kIHVwIGJlaW5nIGFuIG9wZXJhbmQgaW4gdGhlIHBhdHRlcm4uCisgICAgICBSZWNvcmRlZE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICBjYXNlIE9QQ19SZWNvcmRDaGlsZDA6IGNhc2UgT1BDX1JlY29yZENoaWxkMToKKyAgICBjYXNlIE9QQ19SZWNvcmRDaGlsZDI6IGNhc2UgT1BDX1JlY29yZENoaWxkMzoKKyAgICBjYXNlIE9QQ19SZWNvcmRDaGlsZDQ6IGNhc2UgT1BDX1JlY29yZENoaWxkNToKKyAgICBjYXNlIE9QQ19SZWNvcmRDaGlsZDY6IGNhc2UgT1BDX1JlY29yZENoaWxkNzogeworICAgICAgdW5zaWduZWQgQ2hpbGRObyA9IE9wY29kZS1PUENfUmVjb3JkQ2hpbGQwOworICAgICAgaWYgKENoaWxkTm8gPj0gTi5nZXROdW1PcGVyYW5kcygpKQorICAgICAgICBicmVhazsgIC8vIE1hdGNoIGZhaWxzIGlmIG91dCBvZiByYW5nZSBjaGlsZCAjLgorCisgICAgICBSZWNvcmRlZE5vZGVzLnB1c2hfYmFjayhOLT5nZXRPcGVyYW5kKENoaWxkTm8pKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjYXNlIE9QQ19SZWNvcmRNZW1SZWY6CisgICAgICBNYXRjaGVkTWVtUmVmcy5wdXNoX2JhY2soY2FzdDxNZW1TRE5vZGU+KE4pLT5nZXRNZW1PcGVyYW5kKCkpOworICAgICAgY29udGludWU7CisgICAgICAgIAorICAgIGNhc2UgT1BDX0NhcHR1cmVGbGFnSW5wdXQ6CisgICAgICAvLyBJZiB0aGUgY3VycmVudCBub2RlIGhhcyBhbiBpbnB1dCBmbGFnLCBjYXB0dXJlIGl0IGluIElucHV0RmxhZy4KKyAgICAgIGlmIChOLT5nZXROdW1PcGVyYW5kcygpICE9IDAgJiYKKyAgICAgICAgICBOLT5nZXRPcGVyYW5kKE4tPmdldE51bU9wZXJhbmRzKCktMSkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpGbGFnKQorICAgICAgICBJbnB1dEZsYWcgPSBOLT5nZXRPcGVyYW5kKE4tPmdldE51bU9wZXJhbmRzKCktMSk7CisgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgY2FzZSBPUENfTW92ZUNoaWxkOiB7CisgICAgICB1bnNpZ25lZCBDaGlsZE5vID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIGlmIChDaGlsZE5vID49IE4uZ2V0TnVtT3BlcmFuZHMoKSkKKyAgICAgICAgYnJlYWs7ICAvLyBNYXRjaCBmYWlscyBpZiBvdXQgb2YgcmFuZ2UgY2hpbGQgIy4KKyAgICAgIE4gPSBOLmdldE9wZXJhbmQoQ2hpbGRObyk7CisgICAgICBOb2RlU3RhY2sucHVzaF9iYWNrKE4pOworICAgICAgY29udGludWU7CisgICAgfQorICAgICAgICAKKyAgICBjYXNlIE9QQ19Nb3ZlUGFyZW50OgorICAgICAgLy8gUG9wIHRoZSBjdXJyZW50IG5vZGUgb2ZmIHRoZSBOb2RlU3RhY2suCisgICAgICBOb2RlU3RhY2sucG9wX2JhY2soKTsKKyAgICAgIGFzc2VydCghTm9kZVN0YWNrLmVtcHR5KCkgJiYgIk5vZGUgc3RhY2sgaW1iYWxhbmNlISIpOworICAgICAgTiA9IE5vZGVTdGFjay5iYWNrKCk7ICAKKyAgICAgIGNvbnRpbnVlOworICAgICAKKyAgICBjYXNlIE9QQ19DaGVja1NhbWU6CisgICAgICBpZiAoITo6Q2hlY2tTYW1lKE1hdGNoZXJUYWJsZSwgTWF0Y2hlckluZGV4LCBOLCBSZWNvcmRlZE5vZGVzKSkgYnJlYWs7CisgICAgICBjb250aW51ZTsKKyAgICBjYXNlIE9QQ19DaGVja1BhdHRlcm5QcmVkaWNhdGU6CisgICAgICBpZiAoITo6Q2hlY2tQYXR0ZXJuUHJlZGljYXRlKE1hdGNoZXJUYWJsZSwgTWF0Y2hlckluZGV4LCAqdGhpcykpIGJyZWFrOworICAgICAgY29udGludWU7CisgICAgY2FzZSBPUENfQ2hlY2tQcmVkaWNhdGU6CisgICAgICBpZiAoITo6Q2hlY2tOb2RlUHJlZGljYXRlKE1hdGNoZXJUYWJsZSwgTWF0Y2hlckluZGV4LCAqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi5nZXROb2RlKCkpKQorICAgICAgICBicmVhazsKKyAgICAgIGNvbnRpbnVlOworICAgIGNhc2UgT1BDX0NoZWNrQ29tcGxleFBhdDogeworICAgICAgdW5zaWduZWQgQ1BOdW0gPSBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICAgICAgdW5zaWduZWQgUmVjTm8gPSBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICAgICAgYXNzZXJ0KFJlY05vIDwgUmVjb3JkZWROb2Rlcy5zaXplKCkgJiYgIkludmFsaWQgQ2hlY2tDb21wbGV4UGF0Iik7CisgICAgICBpZiAoIUNoZWNrQ29tcGxleFBhdHRlcm4oTm9kZVRvTWF0Y2gsIFJlY29yZGVkTm9kZXNbUmVjTm9dLCBDUE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRlZE5vZGVzKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgY2FzZSBPUENfQ2hlY2tPcGNvZGU6CisgICAgICBpZiAoITo6Q2hlY2tPcGNvZGUoTWF0Y2hlclRhYmxlLCBNYXRjaGVySW5kZXgsIE4uZ2V0Tm9kZSgpKSkgYnJlYWs7CisgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgY2FzZSBPUENfQ2hlY2tUeXBlOgorICAgICAgaWYgKCE6OkNoZWNrVHlwZShNYXRjaGVyVGFibGUsIE1hdGNoZXJJbmRleCwgTiwgVExJKSkgYnJlYWs7CisgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgY2FzZSBPUENfU3dpdGNoT3Bjb2RlOiB7CisgICAgICB1bnNpZ25lZCBDdXJOb2RlT3Bjb2RlID0gTi5nZXRPcGNvZGUoKTsKKyAgICAgIHVuc2lnbmVkIFN3aXRjaFN0YXJ0ID0gTWF0Y2hlckluZGV4LTE7ICh2b2lkKVN3aXRjaFN0YXJ0OworICAgICAgdW5zaWduZWQgQ2FzZVNpemU7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICAvLyBHZXQgdGhlIHNpemUgb2YgdGhpcyBjYXNlLgorICAgICAgICBDYXNlU2l6ZSA9IE1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgICAgICAgIGlmIChDYXNlU2l6ZSAmIDEyOCkKKyAgICAgICAgICBDYXNlU2l6ZSA9IEdldFZCUihDYXNlU2l6ZSwgTWF0Y2hlclRhYmxlLCBNYXRjaGVySW5kZXgpOworICAgICAgICBpZiAoQ2FzZVNpemUgPT0gMCkgYnJlYWs7CisKKyAgICAgICAgdWludDE2X3QgT3BjID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgICAgT3BjIHw9ICh1bnNpZ25lZCBzaG9ydClNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdIDw8IDg7CisKKyAgICAgICAgLy8gSWYgdGhlIG9wY29kZSBtYXRjaGVzLCB0aGVuIHdlIHdpbGwgZXhlY3V0ZSB0aGlzIGNhc2UuCisgICAgICAgIGlmIChDdXJOb2RlT3Bjb2RlID09IE9wYykKKyAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgICAvLyBPdGhlcndpc2UsIHNraXAgb3ZlciB0aGlzIGNhc2UuCisgICAgICAgIE1hdGNoZXJJbmRleCArPSBDYXNlU2l6ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gSWYgbm8gY2FzZXMgbWF0Y2hlZCwgYmFpbCBvdXQuCisgICAgICBpZiAoQ2FzZVNpemUgPT0gMCkgYnJlYWs7CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSwgZXhlY3V0ZSB0aGUgY2FzZSB3ZSBmb3VuZC4KKyAgICAgIERFQlVHKGVycnMoKSA8PCAiICBPcGNvZGVTd2l0Y2ggZnJvbSAiIDw8IFN3aXRjaFN0YXJ0CisgICAgICAgICAgICAgICAgICAgPDwgIiB0byAiIDw8IE1hdGNoZXJJbmRleCA8PCAiXG4iKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAgICAgCisgICAgY2FzZSBPUENfU3dpdGNoVHlwZTogeworICAgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgQ3VyTm9kZVZUID0gTi5nZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5OworICAgICAgdW5zaWduZWQgU3dpdGNoU3RhcnQgPSBNYXRjaGVySW5kZXgtMTsgKHZvaWQpU3dpdGNoU3RhcnQ7CisgICAgICB1bnNpZ25lZCBDYXNlU2l6ZTsKKyAgICAgIHdoaWxlICgxKSB7CisgICAgICAgIC8vIEdldCB0aGUgc2l6ZSBvZiB0aGlzIGNhc2UuCisgICAgICAgIENhc2VTaXplID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgICAgaWYgKENhc2VTaXplICYgMTI4KQorICAgICAgICAgIENhc2VTaXplID0gR2V0VkJSKENhc2VTaXplLCBNYXRjaGVyVGFibGUsIE1hdGNoZXJJbmRleCk7CisgICAgICAgIGlmIChDYXNlU2l6ZSA9PSAwKSBicmVhazsKKyAgICAgICAgCisgICAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIENhc2VWVCA9CisgICAgICAgICAgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKU1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgICAgICAgIGlmIChDYXNlVlQgPT0gTVZUOjppUFRSKQorICAgICAgICAgIENhc2VWVCA9IFRMSS5nZXRQb2ludGVyVHkoKS5TaW1wbGVUeTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBWVCBtYXRjaGVzLCB0aGVuIHdlIHdpbGwgZXhlY3V0ZSB0aGlzIGNhc2UuCisgICAgICAgIGlmIChDdXJOb2RlVlQgPT0gQ2FzZVZUKQorICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBza2lwIG92ZXIgdGhpcyBjYXNlLgorICAgICAgICBNYXRjaGVySW5kZXggKz0gQ2FzZVNpemU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIElmIG5vIGNhc2VzIG1hdGNoZWQsIGJhaWwgb3V0LgorICAgICAgaWYgKENhc2VTaXplID09IDApIGJyZWFrOworICAgICAgCisgICAgICAvLyBPdGhlcndpc2UsIGV4ZWN1dGUgdGhlIGNhc2Ugd2UgZm91bmQuCisgICAgICBERUJVRyhlcnJzKCkgPDwgIiAgVHlwZVN3aXRjaFsiIDw8IEVWVChDdXJOb2RlVlQpLmdldEVWVFN0cmluZygpCisgICAgICAgICAgICAgICAgICAgPDwgIl0gZnJvbSAiIDw8IFN3aXRjaFN0YXJ0IDw8ICIgdG8gIiA8PCBNYXRjaGVySW5kZXg8PCdcbicpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGNhc2UgT1BDX0NoZWNrQ2hpbGQwVHlwZTogY2FzZSBPUENfQ2hlY2tDaGlsZDFUeXBlOgorICAgIGNhc2UgT1BDX0NoZWNrQ2hpbGQyVHlwZTogY2FzZSBPUENfQ2hlY2tDaGlsZDNUeXBlOgorICAgIGNhc2UgT1BDX0NoZWNrQ2hpbGQ0VHlwZTogY2FzZSBPUENfQ2hlY2tDaGlsZDVUeXBlOgorICAgIGNhc2UgT1BDX0NoZWNrQ2hpbGQ2VHlwZTogY2FzZSBPUENfQ2hlY2tDaGlsZDdUeXBlOgorICAgICAgaWYgKCE6OkNoZWNrQ2hpbGRUeXBlKE1hdGNoZXJUYWJsZSwgTWF0Y2hlckluZGV4LCBOLCBUTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlLU9QQ19DaGVja0NoaWxkMFR5cGUpKQorICAgICAgICBicmVhazsKKyAgICAgIGNvbnRpbnVlOworICAgIGNhc2UgT1BDX0NoZWNrQ29uZENvZGU6CisgICAgICBpZiAoITo6Q2hlY2tDb25kQ29kZShNYXRjaGVyVGFibGUsIE1hdGNoZXJJbmRleCwgTikpIGJyZWFrOworICAgICAgY29udGludWU7CisgICAgY2FzZSBPUENfQ2hlY2tWYWx1ZVR5cGU6CisgICAgICBpZiAoITo6Q2hlY2tWYWx1ZVR5cGUoTWF0Y2hlclRhYmxlLCBNYXRjaGVySW5kZXgsIE4sIFRMSSkpIGJyZWFrOworICAgICAgY29udGludWU7CisgICAgY2FzZSBPUENfQ2hlY2tJbnRlZ2VyOgorICAgICAgaWYgKCE6OkNoZWNrSW50ZWdlcihNYXRjaGVyVGFibGUsIE1hdGNoZXJJbmRleCwgTikpIGJyZWFrOworICAgICAgY29udGludWU7CisgICAgY2FzZSBPUENfQ2hlY2tBbmRJbW06CisgICAgICBpZiAoITo6Q2hlY2tBbmRJbW0oTWF0Y2hlclRhYmxlLCBNYXRjaGVySW5kZXgsIE4sICp0aGlzKSkgYnJlYWs7CisgICAgICBjb250aW51ZTsKKyAgICBjYXNlIE9QQ19DaGVja09ySW1tOgorICAgICAgaWYgKCE6OkNoZWNrT3JJbW0oTWF0Y2hlclRhYmxlLCBNYXRjaGVySW5kZXgsIE4sICp0aGlzKSkgYnJlYWs7CisgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgY2FzZSBPUENfQ2hlY2tGb2xkYWJsZUNoYWluTm9kZTogeworICAgICAgYXNzZXJ0KE5vZGVTdGFjay5zaXplKCkgIT0gMSAmJiAiTm8gcGFyZW50IG5vZGUiKTsKKyAgICAgIC8vIFZlcmlmeSB0aGF0IGFsbCBpbnRlcm1lZGlhdGUgbm9kZXMgYmV0d2VlbiB0aGUgcm9vdCBhbmQgdGhpcyBvbmUgaGF2ZQorICAgICAgLy8gYSBzaW5nbGUgdXNlLgorICAgICAgYm9vbCBIYXNNdWx0aXBsZVVzZXMgPSBmYWxzZTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBOb2RlU3RhY2suc2l6ZSgpLTE7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoIU5vZGVTdGFja1tpXS5oYXNPbmVVc2UoKSkgeworICAgICAgICAgIEhhc011bHRpcGxlVXNlcyA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGlmIChIYXNNdWx0aXBsZVVzZXMpIGJyZWFrOworCisgICAgICAvLyBDaGVjayB0byBzZWUgdGhhdCB0aGUgdGFyZ2V0IHRoaW5rcyB0aGlzIGlzIHByb2ZpdGFibGUgdG8gZm9sZCBhbmQgdGhhdAorICAgICAgLy8gd2UgY2FuIGZvbGQgaXQgd2l0aG91dCBpbmR1Y2luZyBjeWNsZXMgaW4gdGhlIGdyYXBoLgorICAgICAgaWYgKCFJc1Byb2ZpdGFibGVUb0ZvbGQoTiwgTm9kZVN0YWNrW05vZGVTdGFjay5zaXplKCktMl0uZ2V0Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZVRvTWF0Y2gpIHx8CisgICAgICAgICAgIUlzTGVnYWxUb0ZvbGQoTiwgTm9kZVN0YWNrW05vZGVTdGFjay5zaXplKCktMl0uZ2V0Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVUb01hdGNoLCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLypXZSB2YWxpZGF0ZSBvdXIgb3duIGNoYWlucyovKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjYXNlIE9QQ19FbWl0SW50ZWdlcjogeworICAgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQgPQorICAgICAgICAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIGludDY0X3QgVmFsID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIGlmIChWYWwgJiAxMjgpCisgICAgICAgIFZhbCA9IEdldFZCUihWYWwsIE1hdGNoZXJUYWJsZSwgTWF0Y2hlckluZGV4KTsKKyAgICAgIFJlY29yZGVkTm9kZXMucHVzaF9iYWNrKEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoVmFsLCBWVCkpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGNhc2UgT1BDX0VtaXRSZWdpc3RlcjogeworICAgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQgPQorICAgICAgICAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIHVuc2lnbmVkIFJlZ05vID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIFJlY29yZGVkTm9kZXMucHVzaF9iYWNrKEN1ckRBRy0+Z2V0UmVnaXN0ZXIoUmVnTm8sIFZUKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgICAgIAorICAgIGNhc2UgT1BDX0VtaXRDb252ZXJ0VG9UYXJnZXQ6ICB7CisgICAgICAvLyBDb252ZXJ0IGZyb20gSU1NL0ZQSU1NIHRvIHRhcmdldCB2ZXJzaW9uLgorICAgICAgdW5zaWduZWQgUmVjTm8gPSBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICAgICAgYXNzZXJ0KFJlY05vIDwgUmVjb3JkZWROb2Rlcy5zaXplKCkgJiYgIkludmFsaWQgQ2hlY2tTYW1lIik7CisgICAgICBTRFZhbHVlIEltbSA9IFJlY29yZGVkTm9kZXNbUmVjTm9dOworCisgICAgICBpZiAoSW1tLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50KSB7CisgICAgICAgIGludDY0X3QgVmFsID0gY2FzdDxDb25zdGFudFNETm9kZT4oSW1tKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgIEltbSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoVmFsLCBJbW0uZ2V0VmFsdWVUeXBlKCkpOworICAgICAgfSBlbHNlIGlmIChJbW0tPmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnRGUCkgeworICAgICAgICBjb25zdCBDb25zdGFudEZQICpWYWw9Y2FzdDxDb25zdGFudEZQU0ROb2RlPihJbW0pLT5nZXRDb25zdGFudEZQVmFsdWUoKTsKKyAgICAgICAgSW1tID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudEZQKCpWYWwsIEltbS5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIFJlY29yZGVkTm9kZXMucHVzaF9iYWNrKEltbSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgICAgIAorICAgIGNhc2UgT1BDX0VtaXRNZXJnZUlucHV0Q2hhaW5zMV8wOiAgICAvLyBPUENfRW1pdE1lcmdlSW5wdXRDaGFpbnMsIDEsIDAKKyAgICBjYXNlIE9QQ19FbWl0TWVyZ2VJbnB1dENoYWluczFfMTogeyAgLy8gT1BDX0VtaXRNZXJnZUlucHV0Q2hhaW5zLCAxLCAxCisgICAgICAvLyBUaGVzZSBhcmUgc3BhY2Utb3B0aW1pemVkIGZvcm1zIG9mIE9QQ19FbWl0TWVyZ2VJbnB1dENoYWlucy4KKyAgICAgIGFzc2VydChJbnB1dENoYWluLmdldE5vZGUoKSA9PSAwICYmCisgICAgICAgICAgICAgIkVtaXRNZXJnZUlucHV0Q2hhaW5zIHNob3VsZCBiZSB0aGUgZmlyc3QgY2hhaW4gcHJvZHVjaW5nIG5vZGUiKTsKKyAgICAgIGFzc2VydChDaGFpbk5vZGVzTWF0Y2hlZC5lbXB0eSgpICYmCisgICAgICAgICAgICAgIlNob3VsZCBvbmx5IGhhdmUgb25lIEVtaXRNZXJnZUlucHV0Q2hhaW5zIHBlciBtYXRjaCIpOworICAgICAgCisgICAgICAvLyBSZWFkIGFsbCBvZiB0aGUgY2hhaW5lZCBub2Rlcy4KKyAgICAgIHVuc2lnbmVkIFJlY05vID0gT3Bjb2RlID09IE9QQ19FbWl0TWVyZ2VJbnB1dENoYWluczFfMTsKKyAgICAgIGFzc2VydChSZWNObyA8IFJlY29yZGVkTm9kZXMuc2l6ZSgpICYmICJJbnZhbGlkIENoZWNrU2FtZSIpOworICAgICAgQ2hhaW5Ob2Rlc01hdGNoZWQucHVzaF9iYWNrKFJlY29yZGVkTm9kZXNbUmVjTm9dLmdldE5vZGUoKSk7CisgICAgICAgIAorICAgICAgLy8gRklYTUU6IFdoYXQgaWYgb3RoZXIgdmFsdWUgcmVzdWx0cyBvZiB0aGUgbm9kZSBoYXZlIHVzZXMgbm90IG1hdGNoZWQKKyAgICAgIC8vIGJ5IHRoaXMgcGF0dGVybj8KKyAgICAgIGlmIChDaGFpbk5vZGVzTWF0Y2hlZC5iYWNrKCkgIT0gTm9kZVRvTWF0Y2ggJiYKKyAgICAgICAgICAhUmVjb3JkZWROb2Rlc1tSZWNOb10uaGFzT25lVXNlKCkpIHsKKyAgICAgICAgQ2hhaW5Ob2Rlc01hdGNoZWQuY2xlYXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIE1lcmdlIHRoZSBpbnB1dCBjaGFpbnMgaWYgdGhleSBhcmUgbm90IGludHJhLXBhdHRlcm4gcmVmZXJlbmNlcy4KKyAgICAgIElucHV0Q2hhaW4gPSBIYW5kbGVNZXJnZUlucHV0Q2hhaW5zKENoYWluTm9kZXNNYXRjaGVkLCBDdXJEQUcpOworICAgICAgCisgICAgICBpZiAoSW5wdXRDaGFpbi5nZXROb2RlKCkgPT0gMCkKKyAgICAgICAgYnJlYWs7ICAvLyBGYWlsZWQgdG8gbWVyZ2UuCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgICAgIAorICAgIGNhc2UgT1BDX0VtaXRNZXJnZUlucHV0Q2hhaW5zOiB7CisgICAgICBhc3NlcnQoSW5wdXRDaGFpbi5nZXROb2RlKCkgPT0gMCAmJgorICAgICAgICAgICAgICJFbWl0TWVyZ2VJbnB1dENoYWlucyBzaG91bGQgYmUgdGhlIGZpcnN0IGNoYWluIHByb2R1Y2luZyBub2RlIik7CisgICAgICAvLyBUaGlzIG5vZGUgZ2V0cyBhIGxpc3Qgb2Ygbm9kZXMgd2UgbWF0Y2hlZCBpbiB0aGUgaW5wdXQgdGhhdCBoYXZlCisgICAgICAvLyBjaGFpbnMuICBXZSB3YW50IHRvIHRva2VuIGZhY3RvciBhbGwgb2YgdGhlIGlucHV0IGNoYWlucyB0byB0aGVzZSBub2RlcworICAgICAgLy8gdG9nZXRoZXIuICBIb3dldmVyLCBpZiBhbnkgb2YgdGhlIGlucHV0IGNoYWlucyBpcyBhY3R1YWxseSBvbmUgb2YgdGhlCisgICAgICAvLyBub2RlcyBtYXRjaGVkIGluIHRoaXMgcGF0dGVybiwgdGhlbiB3ZSBoYXZlIGFuIGludHJhLW1hdGNoIHJlZmVyZW5jZS4KKyAgICAgIC8vIElnbm9yZSB0aGVzZSBiZWNhdXNlIHRoZSBuZXdseSB0b2tlbiBmYWN0b3JlZCBjaGFpbiBzaG91bGQgbm90IHJlZmVyIHRvCisgICAgICAvLyB0aGUgb2xkIG5vZGVzLgorICAgICAgdW5zaWduZWQgTnVtQ2hhaW5zID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIGFzc2VydChOdW1DaGFpbnMgIT0gMCAmJiAiQ2FuJ3QgVEYgemVybyBjaGFpbnMiKTsKKworICAgICAgYXNzZXJ0KENoYWluTm9kZXNNYXRjaGVkLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAiU2hvdWxkIG9ubHkgaGF2ZSBvbmUgRW1pdE1lcmdlSW5wdXRDaGFpbnMgcGVyIG1hdGNoIik7CisKKyAgICAgIC8vIFJlYWQgYWxsIG9mIHRoZSBjaGFpbmVkIG5vZGVzLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1DaGFpbnM7ICsraSkgeworICAgICAgICB1bnNpZ25lZCBSZWNObyA9IE1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgICAgICAgIGFzc2VydChSZWNObyA8IFJlY29yZGVkTm9kZXMuc2l6ZSgpICYmICJJbnZhbGlkIENoZWNrU2FtZSIpOworICAgICAgICBDaGFpbk5vZGVzTWF0Y2hlZC5wdXNoX2JhY2soUmVjb3JkZWROb2Rlc1tSZWNOb10uZ2V0Tm9kZSgpKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIG90aGVyIHZhbHVlIHJlc3VsdHMgb2YgdGhlIG5vZGUgaGF2ZSB1c2VzIG5vdCBtYXRjaGVkCisgICAgICAgIC8vIGJ5IHRoaXMgcGF0dGVybj8KKyAgICAgICAgaWYgKENoYWluTm9kZXNNYXRjaGVkLmJhY2soKSAhPSBOb2RlVG9NYXRjaCAmJgorICAgICAgICAgICAgIVJlY29yZGVkTm9kZXNbUmVjTm9dLmhhc09uZVVzZSgpKSB7CisgICAgICAgICAgQ2hhaW5Ob2Rlc01hdGNoZWQuY2xlYXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiB0aGUgaW5uZXIgbG9vcCBicm9rZSBvdXQsIHRoZSBtYXRjaCBmYWlscy4KKyAgICAgIGlmIChDaGFpbk5vZGVzTWF0Y2hlZC5lbXB0eSgpKQorICAgICAgICBicmVhazsKKworICAgICAgLy8gTWVyZ2UgdGhlIGlucHV0IGNoYWlucyBpZiB0aGV5IGFyZSBub3QgaW50cmEtcGF0dGVybiByZWZlcmVuY2VzLgorICAgICAgSW5wdXRDaGFpbiA9IEhhbmRsZU1lcmdlSW5wdXRDaGFpbnMoQ2hhaW5Ob2Rlc01hdGNoZWQsIEN1ckRBRyk7CisgICAgICAKKyAgICAgIGlmIChJbnB1dENoYWluLmdldE5vZGUoKSA9PSAwKQorICAgICAgICBicmVhazsgIC8vIEZhaWxlZCB0byBtZXJnZS4KKworICAgICAgY29udGludWU7CisgICAgfQorICAgICAgICAKKyAgICBjYXNlIE9QQ19FbWl0Q29weVRvUmVnOiB7CisgICAgICB1bnNpZ25lZCBSZWNObyA9IE1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgICAgICBhc3NlcnQoUmVjTm8gPCBSZWNvcmRlZE5vZGVzLnNpemUoKSAmJiAiSW52YWxpZCBDaGVja1NhbWUiKTsKKyAgICAgIHVuc2lnbmVkIERlc3RQaHlzUmVnID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIAorICAgICAgaWYgKElucHV0Q2hhaW4uZ2V0Tm9kZSgpID09IDApCisgICAgICAgIElucHV0Q2hhaW4gPSBDdXJEQUctPmdldEVudHJ5Tm9kZSgpOworICAgICAgCisgICAgICBJbnB1dENoYWluID0gQ3VyREFHLT5nZXRDb3B5VG9SZWcoSW5wdXRDaGFpbiwgTm9kZVRvTWF0Y2gtPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdFBoeXNSZWcsIFJlY29yZGVkTm9kZXNbUmVjTm9dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0RmxhZyk7CisgICAgICAKKyAgICAgIElucHV0RmxhZyA9IElucHV0Q2hhaW4uZ2V0VmFsdWUoMSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgICAgIAorICAgIGNhc2UgT1BDX0VtaXROb2RlWEZvcm06IHsKKyAgICAgIHVuc2lnbmVkIFhGb3JtTm8gPSBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICAgICAgdW5zaWduZWQgUmVjTm8gPSBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICAgICAgYXNzZXJ0KFJlY05vIDwgUmVjb3JkZWROb2Rlcy5zaXplKCkgJiYgIkludmFsaWQgQ2hlY2tTYW1lIik7CisgICAgICBSZWNvcmRlZE5vZGVzLnB1c2hfYmFjayhSdW5TRE5vZGVYRm9ybShSZWNvcmRlZE5vZGVzW1JlY05vXSwgWEZvcm1ObykpOworICAgICAgY29udGludWU7CisgICAgfQorICAgICAgICAKKyAgICBjYXNlIE9QQ19FbWl0Tm9kZToKKyAgICBjYXNlIE9QQ19Nb3JwaE5vZGVUbzogeworICAgICAgdWludDE2X3QgVGFyZ2V0T3BjID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIFRhcmdldE9wYyB8PSAodW5zaWduZWQgc2hvcnQpTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXSA8PCA4OworICAgICAgdW5zaWduZWQgRW1pdE5vZGVJbmZvID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIC8vIEdldCB0aGUgcmVzdWx0IFZUIGxpc3QuCisgICAgICB1bnNpZ25lZCBOdW1WVHMgPSBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICAgICAgU21hbGxWZWN0b3I8RVZULCA0PiBWVHM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVZUczsgKytpKSB7CisgICAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUID0KKyAgICAgICAgICAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgICAgaWYgKFZUID09IE1WVDo6aVBUUikgVlQgPSBUTEkuZ2V0UG9pbnRlclR5KCkuU2ltcGxlVHk7CisgICAgICAgIFZUcy5wdXNoX2JhY2soVlQpOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoRW1pdE5vZGVJbmZvICYgT1BGTF9DaGFpbikKKyAgICAgICAgVlRzLnB1c2hfYmFjayhNVlQ6Ok90aGVyKTsKKyAgICAgIGlmIChFbWl0Tm9kZUluZm8gJiBPUEZMX0ZsYWdPdXRwdXQpCisgICAgICAgIFZUcy5wdXNoX2JhY2soTVZUOjpGbGFnKTsKKyAgICAgIAorICAgICAgLy8gVGhpcyBpcyBob3QgY29kZSwgc28gb3B0aW1pemUgdGhlIHR3byBtb3N0IGNvbW1vbiBjYXNlcyBvZiAxIGFuZCAyCisgICAgICAvLyByZXN1bHRzLgorICAgICAgU0RWVExpc3QgVlRMaXN0OworICAgICAgaWYgKFZUcy5zaXplKCkgPT0gMSkKKyAgICAgICAgVlRMaXN0ID0gQ3VyREFHLT5nZXRWVExpc3QoVlRzWzBdKTsKKyAgICAgIGVsc2UgaWYgKFZUcy5zaXplKCkgPT0gMikKKyAgICAgICAgVlRMaXN0ID0gQ3VyREFHLT5nZXRWVExpc3QoVlRzWzBdLCBWVHNbMV0pOworICAgICAgZWxzZQorICAgICAgICBWVExpc3QgPSBDdXJEQUctPmdldFZUTGlzdChWVHMuZGF0YSgpLCBWVHMuc2l6ZSgpKTsKKworICAgICAgLy8gR2V0IHRoZSBvcGVyYW5kIGxpc3QuCisgICAgICB1bnNpZ25lZCBOdW1PcHMgPSBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHM7ICsraSkgeworICAgICAgICB1bnNpZ25lZCBSZWNObyA9IE1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgICAgICAgIGlmIChSZWNObyAmIDEyOCkKKyAgICAgICAgICBSZWNObyA9IEdldFZCUihSZWNObywgTWF0Y2hlclRhYmxlLCBNYXRjaGVySW5kZXgpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0KFJlY05vIDwgUmVjb3JkZWROb2Rlcy5zaXplKCkgJiYgIkludmFsaWQgRW1pdE5vZGUiKTsKKyAgICAgICAgT3BzLnB1c2hfYmFjayhSZWNvcmRlZE5vZGVzW1JlY05vXSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIElmIHRoZXJlIGFyZSB2YXJpYWRpYyBvcGVyYW5kcyB0byBhZGQsIGhhbmRsZSB0aGVtIG5vdy4KKyAgICAgIGlmIChFbWl0Tm9kZUluZm8gJiBPUEZMX1ZhcmlhZGljSW5mbykgeworICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHN0YXJ0IGluZGV4IHRvIGNvcHkgZnJvbS4KKyAgICAgICAgdW5zaWduZWQgRmlyc3RPcFRvQ29weSA9IGdldE51bUZpeGVkRnJvbVZhcmlhZGljSW5mbyhFbWl0Tm9kZUluZm8pOworICAgICAgICBGaXJzdE9wVG9Db3B5ICs9IChFbWl0Tm9kZUluZm8gJiBPUEZMX0NoYWluKSA/IDEgOiAwOworICAgICAgICBhc3NlcnQoTm9kZVRvTWF0Y2gtPmdldE51bU9wZXJhbmRzKCkgPj0gRmlyc3RPcFRvQ29weSAmJgorICAgICAgICAgICAgICAgIkludmFsaWQgdmFyaWFkaWMgbm9kZSIpOworICAgICAgICAvLyBDb3B5IGFsbCBvZiB0aGUgdmFyaWFkaWMgb3BlcmFuZHMsIG5vdCBpbmNsdWRpbmcgYSBwb3RlbnRpYWwgZmxhZworICAgICAgICAvLyBpbnB1dC4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gRmlyc3RPcFRvQ29weSwgZSA9IE5vZGVUb01hdGNoLT5nZXROdW1PcGVyYW5kcygpOworICAgICAgICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgU0RWYWx1ZSBWID0gTm9kZVRvTWF0Y2gtPmdldE9wZXJhbmQoaSk7CisgICAgICAgICAgaWYgKFYuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpGbGFnKSBicmVhazsKKyAgICAgICAgICBPcHMucHVzaF9iYWNrKFYpOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIElmIHRoaXMgaGFzIGNoYWluL2ZsYWcgaW5wdXRzLCBhZGQgdGhlbS4KKyAgICAgIGlmIChFbWl0Tm9kZUluZm8gJiBPUEZMX0NoYWluKQorICAgICAgICBPcHMucHVzaF9iYWNrKElucHV0Q2hhaW4pOworICAgICAgaWYgKChFbWl0Tm9kZUluZm8gJiBPUEZMX0ZsYWdJbnB1dCkgJiYgSW5wdXRGbGFnLmdldE5vZGUoKSAhPSAwKQorICAgICAgICBPcHMucHVzaF9iYWNrKElucHV0RmxhZyk7CisgICAgICAKKyAgICAgIC8vIENyZWF0ZSB0aGUgbm9kZS4KKyAgICAgIFNETm9kZSAqUmVzID0gMDsKKyAgICAgIGlmIChPcGNvZGUgIT0gT1BDX01vcnBoTm9kZVRvKSB7CisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBub3JtYWwgRW1pdE5vZGUgY29tbWFuZCwganVzdCBjcmVhdGUgdGhlIG5ldyBub2RlIGFuZAorICAgICAgICAvLyBhZGQgdGhlIHJlc3VsdHMgdG8gdGhlIFJlY29yZGVkTm9kZXMgbGlzdC4KKyAgICAgICAgUmVzID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGMsIE5vZGVUb01hdGNoLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZUTGlzdCwgT3BzLmRhdGEoKSwgT3BzLnNpemUoKSk7CisgICAgICAgIAorICAgICAgICAvLyBBZGQgYWxsIHRoZSBub24tZmxhZy9ub24tY2hhaW4gcmVzdWx0cyB0byB0aGUgUmVjb3JkZWROb2RlcyBsaXN0LgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBpZiAoVlRzW2ldID09IE1WVDo6T3RoZXIgfHwgVlRzW2ldID09IE1WVDo6RmxhZykgYnJlYWs7CisgICAgICAgICAgUmVjb3JkZWROb2Rlcy5wdXNoX2JhY2soU0RWYWx1ZShSZXMsIGkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFJlcyA9IE1vcnBoTm9kZShOb2RlVG9NYXRjaCwgVGFyZ2V0T3BjLCBWVExpc3QsIE9wcy5kYXRhKCksIE9wcy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICBFbWl0Tm9kZUluZm8pOworICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiB0aGUgbm9kZSBoYWQgY2hhaW4vZmxhZyByZXN1bHRzLCB1cGRhdGUgb3VyIG5vdGlvbiBvZiB0aGUgY3VycmVudAorICAgICAgLy8gY2hhaW4gYW5kIGZsYWcuCisgICAgICBpZiAoRW1pdE5vZGVJbmZvICYgT1BGTF9GbGFnT3V0cHV0KSB7CisgICAgICAgIElucHV0RmxhZyA9IFNEVmFsdWUoUmVzLCBWVHMuc2l6ZSgpLTEpOworICAgICAgICBpZiAoRW1pdE5vZGVJbmZvICYgT1BGTF9DaGFpbikKKyAgICAgICAgICBJbnB1dENoYWluID0gU0RWYWx1ZShSZXMsIFZUcy5zaXplKCktMik7CisgICAgICB9IGVsc2UgaWYgKEVtaXROb2RlSW5mbyAmIE9QRkxfQ2hhaW4pCisgICAgICAgIElucHV0Q2hhaW4gPSBTRFZhbHVlKFJlcywgVlRzLnNpemUoKS0xKTsKKworICAgICAgLy8gSWYgdGhlIE9QRkxfTWVtUmVmcyBmbGFnIGlzIHNldCBvbiB0aGlzIG5vZGUsIHNsYXAgYWxsIG9mIHRoZQorICAgICAgLy8gYWNjdW11bGF0ZWQgbWVtcmVmcyBvbnRvIGl0LgorICAgICAgLy8KKyAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIHZhc3RseSBpbmNvcnJlY3QgZm9yIHBhdHRlcm5zIHdpdGggbXVsdGlwbGUgb3V0cHV0cworICAgICAgLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgYWNjZXNzIG1lbW9yeSBhbmQgZm9yIENvbXBsZXhQYXR0ZXJucyB0aGF0IG1hdGNoCisgICAgICAvLyBsb2Fkcy4KKyAgICAgIGlmIChFbWl0Tm9kZUluZm8gJiBPUEZMX01lbVJlZnMpIHsKKyAgICAgICAgTWFjaGluZVNETm9kZTo6bW1vX2l0ZXJhdG9yIE1lbVJlZnMgPQorICAgICAgICAgIE1GLT5hbGxvY2F0ZU1lbVJlZnNBcnJheShNYXRjaGVkTWVtUmVmcy5zaXplKCkpOworICAgICAgICBzdGQ6OmNvcHkoTWF0Y2hlZE1lbVJlZnMuYmVnaW4oKSwgTWF0Y2hlZE1lbVJlZnMuZW5kKCksIE1lbVJlZnMpOworICAgICAgICBjYXN0PE1hY2hpbmVTRE5vZGU+KFJlcykKKyAgICAgICAgICAtPnNldE1lbVJlZnMoTWVtUmVmcywgTWVtUmVmcyArIE1hdGNoZWRNZW1SZWZzLnNpemUoKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiICAiCisgICAgICAgICAgICAgICAgICAgPDwgKE9wY29kZSA9PSBPUENfTW9ycGhOb2RlVG8gPyAiTW9ycGhlZCIgOiAiQ3JlYXRlZCIpCisgICAgICAgICAgICAgICAgICAgPDwgIiBub2RlOiAiOyBSZXMtPmR1bXAoQ3VyREFHKTsgZXJycygpIDw8ICJcbiIpOworICAgICAgCisgICAgICAvLyBJZiB0aGlzIHdhcyBhIE1vcnBoTm9kZVRvIHRoZW4gd2UncmUgY29tcGxldGVseSBkb25lIQorICAgICAgaWYgKE9wY29kZSA9PSBPUENfTW9ycGhOb2RlVG8pIHsKKyAgICAgICAgLy8gVXBkYXRlIGNoYWluIGFuZCBmbGFnIHVzZXMuCisgICAgICAgIFVwZGF0ZUNoYWluc0FuZEZsYWdzKE5vZGVUb01hdGNoLCBJbnB1dENoYWluLCBDaGFpbk5vZGVzTWF0Y2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRGbGFnLCBGbGFnUmVzdWx0Tm9kZXNNYXRjaGVkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIFJlczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgY29udGludWU7CisgICAgfQorICAgICAgICAKKyAgICBjYXNlIE9QQ19NYXJrRmxhZ1Jlc3VsdHM6IHsKKyAgICAgIHVuc2lnbmVkIE51bU5vZGVzID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgIAorICAgICAgLy8gUmVhZCBhbmQgcmVtZW1iZXIgYWxsIHRoZSBmbGFnLXJlc3VsdCBub2Rlcy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtTm9kZXM7ICsraSkgeworICAgICAgICB1bnNpZ25lZCBSZWNObyA9IE1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgICAgICAgIGlmIChSZWNObyAmIDEyOCkKKyAgICAgICAgICBSZWNObyA9IEdldFZCUihSZWNObywgTWF0Y2hlclRhYmxlLCBNYXRjaGVySW5kZXgpOworCisgICAgICAgIGFzc2VydChSZWNObyA8IFJlY29yZGVkTm9kZXMuc2l6ZSgpICYmICJJbnZhbGlkIENoZWNrU2FtZSIpOworICAgICAgICBGbGFnUmVzdWx0Tm9kZXNNYXRjaGVkLnB1c2hfYmFjayhSZWNvcmRlZE5vZGVzW1JlY05vXS5nZXROb2RlKCkpOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgICAgCisgICAgY2FzZSBPUENfQ29tcGxldGVNYXRjaDogeworICAgICAgLy8gVGhlIG1hdGNoIGhhcyBiZWVuIGNvbXBsZXRlZCwgYW5kIGFueSBuZXcgbm9kZXMgKGlmIGFueSkgaGF2ZSBiZWVuCisgICAgICAvLyBjcmVhdGVkLiAgUGF0Y2ggdXAgcmVmZXJlbmNlcyB0byB0aGUgbWF0Y2hlZCBkYWcgdG8gdXNlIHRoZSBuZXdseQorICAgICAgLy8gY3JlYXRlZCBub2Rlcy4KKyAgICAgIHVuc2lnbmVkIE51bVJlc3VsdHMgPSBNYXRjaGVyVGFibGVbTWF0Y2hlckluZGV4KytdOworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVJlc3VsdHM7ICsraSkgeworICAgICAgICB1bnNpZ25lZCBSZXNTbG90ID0gTWF0Y2hlclRhYmxlW01hdGNoZXJJbmRleCsrXTsKKyAgICAgICAgaWYgKFJlc1Nsb3QgJiAxMjgpCisgICAgICAgICAgUmVzU2xvdCA9IEdldFZCUihSZXNTbG90LCBNYXRjaGVyVGFibGUsIE1hdGNoZXJJbmRleCk7CisgICAgICAgIAorICAgICAgICBhc3NlcnQoUmVzU2xvdCA8IFJlY29yZGVkTm9kZXMuc2l6ZSgpICYmICJJbnZhbGlkIENoZWNrU2FtZSIpOworICAgICAgICBTRFZhbHVlIFJlcyA9IFJlY29yZGVkTm9kZXNbUmVzU2xvdF07CisgICAgICAgIAorICAgICAgICBhc3NlcnQoaSA8IE5vZGVUb01hdGNoLT5nZXROdW1WYWx1ZXMoKSAmJgorICAgICAgICAgICAgICAgTm9kZVRvTWF0Y2gtPmdldFZhbHVlVHlwZShpKSAhPSBNVlQ6Ok90aGVyICYmCisgICAgICAgICAgICAgICBOb2RlVG9NYXRjaC0+Z2V0VmFsdWVUeXBlKGkpICE9IE1WVDo6RmxhZyAmJgorICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIHJlc3VsdHMgdG8gY29tcGxldGUhIik7CisgICAgICAgIGFzc2VydCgoTm9kZVRvTWF0Y2gtPmdldFZhbHVlVHlwZShpKSA9PSBSZXMuZ2V0VmFsdWVUeXBlKCkgfHwKKyAgICAgICAgICAgICAgICBOb2RlVG9NYXRjaC0+Z2V0VmFsdWVUeXBlKGkpID09IE1WVDo6aVBUUiB8fAorICAgICAgICAgICAgICAgIFJlcy5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmlQVFIgfHwKKyAgICAgICAgICAgICAgICBOb2RlVG9NYXRjaC0+Z2V0VmFsdWVUeXBlKGkpLmdldFNpemVJbkJpdHMoKSA9PQorICAgICAgICAgICAgICAgICAgICBSZXMuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpKSAmJgorICAgICAgICAgICAgICAgImludmFsaWQgcmVwbGFjZW1lbnQiKTsKKyAgICAgICAgQ3VyREFHLT5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoTm9kZVRvTWF0Y2gsIGkpLCBSZXMpOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGUgcm9vdCBub2RlIGRlZmluZXMgYSBmbGFnLCBhZGQgaXQgdG8gdGhlIGZsYWcgbm9kZXMgdG8gdXBkYXRlCisgICAgICAvLyBsaXN0LgorICAgICAgaWYgKE5vZGVUb01hdGNoLT5nZXRWYWx1ZVR5cGUoTm9kZVRvTWF0Y2gtPmdldE51bVZhbHVlcygpLTEpID09IE1WVDo6RmxhZykKKyAgICAgICAgRmxhZ1Jlc3VsdE5vZGVzTWF0Y2hlZC5wdXNoX2JhY2soTm9kZVRvTWF0Y2gpOworICAgICAgCisgICAgICAvLyBVcGRhdGUgY2hhaW4gYW5kIGZsYWcgdXNlcy4KKyAgICAgIFVwZGF0ZUNoYWluc0FuZEZsYWdzKE5vZGVUb01hdGNoLCBJbnB1dENoYWluLCBDaGFpbk5vZGVzTWF0Y2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0RmxhZywgRmxhZ1Jlc3VsdE5vZGVzTWF0Y2hlZCwgZmFsc2UpOworICAgICAgCisgICAgICBhc3NlcnQoTm9kZVRvTWF0Y2gtPnVzZV9lbXB0eSgpICYmCisgICAgICAgICAgICAgIkRpZG4ndCByZXBsYWNlIGFsbCB1c2VzIG9mIHRoZSBub2RlPyIpOworICAgICAgCisgICAgICAvLyBGSVhNRTogV2UganVzdCByZXR1cm4gaGVyZSwgd2hpY2ggaW50ZXJhY3RzIGNvcnJlY3RseSB3aXRoIFNlbGVjdFJvb3QKKyAgICAgIC8vIGFib3ZlLiAgV2Ugc2hvdWxkIGZpeCB0aGlzIHRvIG5vdCByZXR1cm4gYW4gU0ROb2RlKiBhbnltb3JlLgorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGUgY29kZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZW4gdGhlIG1hdGNoIGZhaWxlZC4gIFNlZSBpZiB0aGVyZSBpcworICAgIC8vIGFub3RoZXIgY2hpbGQgdG8gdHJ5IGluIHRoZSBjdXJyZW50ICdTY29wZScsIG90aGVyd2lzZSBwb3AgaXQgdW50aWwgd2UKKyAgICAvLyBmaW5kIGEgY2FzZSB0byBjaGVjay4KKyAgICBERUJVRyhlcnJzKCkgPDwgIiAgTWF0Y2ggZmFpbGVkIGF0IGluZGV4ICIgPDwgQ3VycmVudE9wY29kZUluZGV4IDw8ICJcbiIpOworICAgICsrTnVtREFHSXNlbFJldHJpZXM7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGlmIChNYXRjaFNjb3Blcy5lbXB0eSgpKSB7CisgICAgICAgIENhbm5vdFlldFNlbGVjdChOb2RlVG9NYXRjaCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICAvLyBSZXN0b3JlIHRoZSBpbnRlcnByZXRlciBzdGF0ZSBiYWNrIHRvIHRoZSBwb2ludCB3aGVyZSB0aGUgc2NvcGUgd2FzCisgICAgICAvLyBmb3JtZWQuCisgICAgICBNYXRjaFNjb3BlICZMYXN0U2NvcGUgPSBNYXRjaFNjb3Blcy5iYWNrKCk7CisgICAgICBSZWNvcmRlZE5vZGVzLnJlc2l6ZShMYXN0U2NvcGUuTnVtUmVjb3JkZWROb2Rlcyk7CisgICAgICBOb2RlU3RhY2suY2xlYXIoKTsKKyAgICAgIE5vZGVTdGFjay5hcHBlbmQoTGFzdFNjb3BlLk5vZGVTdGFjay5iZWdpbigpLCBMYXN0U2NvcGUuTm9kZVN0YWNrLmVuZCgpKTsKKyAgICAgIE4gPSBOb2RlU3RhY2suYmFjaygpOworCisgICAgICBpZiAoTGFzdFNjb3BlLk51bU1hdGNoZWRNZW1SZWZzICE9IE1hdGNoZWRNZW1SZWZzLnNpemUoKSkKKyAgICAgICAgTWF0Y2hlZE1lbVJlZnMucmVzaXplKExhc3RTY29wZS5OdW1NYXRjaGVkTWVtUmVmcyk7CisgICAgICBNYXRjaGVySW5kZXggPSBMYXN0U2NvcGUuRmFpbEluZGV4OworICAgICAgCisgICAgICBERUJVRyhlcnJzKCkgPDwgIiAgQ29udGludWluZyBhdCAiIDw8IE1hdGNoZXJJbmRleCA8PCAiXG4iKTsKKyAgICAKKyAgICAgIElucHV0Q2hhaW4gPSBMYXN0U2NvcGUuSW5wdXRDaGFpbjsKKyAgICAgIElucHV0RmxhZyA9IExhc3RTY29wZS5JbnB1dEZsYWc7CisgICAgICBpZiAoIUxhc3RTY29wZS5IYXNDaGFpbk5vZGVzTWF0Y2hlZCkKKyAgICAgICAgQ2hhaW5Ob2Rlc01hdGNoZWQuY2xlYXIoKTsKKyAgICAgIGlmICghTGFzdFNjb3BlLkhhc0ZsYWdSZXN1bHROb2Rlc01hdGNoZWQpCisgICAgICAgIEZsYWdSZXN1bHROb2Rlc01hdGNoZWQuY2xlYXIoKTsKKworICAgICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQgdGhlIG9mZnNldCBpcyBhdCB0aGUgbmV3IE1hdGNoZXJJbmRleC4gIElmIGl0IGlzIHplcm8KKyAgICAgIC8vIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoaXMgc2NvcGUsIG90aGVyd2lzZSB3ZSBoYXZlIGFub3RoZXIgY2hpbGQKKyAgICAgIC8vIGluIHRoZSBjdXJyZW50IHNjb3BlIHRvIHRyeS4KKyAgICAgIHVuc2lnbmVkIE51bVRvU2tpcCA9IE1hdGNoZXJUYWJsZVtNYXRjaGVySW5kZXgrK107CisgICAgICBpZiAoTnVtVG9Ta2lwICYgMTI4KQorICAgICAgICBOdW1Ub1NraXAgPSBHZXRWQlIoTnVtVG9Ta2lwLCBNYXRjaGVyVGFibGUsIE1hdGNoZXJJbmRleCk7CisKKyAgICAgIC8vIElmIHdlIGhhdmUgYW5vdGhlciBjaGlsZCBpbiB0aGlzIHNjb3BlIHRvIG1hdGNoLCB1cGRhdGUgRmFpbEluZGV4IGFuZAorICAgICAgLy8gdHJ5IGl0LgorICAgICAgaWYgKE51bVRvU2tpcCAhPSAwKSB7CisgICAgICAgIExhc3RTY29wZS5GYWlsSW5kZXggPSBNYXRjaGVySW5kZXgrTnVtVG9Ta2lwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gRW5kIG9mIHRoaXMgc2NvcGUsIHBvcCBpdCBhbmQgdHJ5IHRoZSBuZXh0IGNoaWxkIGluIHRoZSBjb250YWluaW5nCisgICAgICAvLyBzY29wZS4KKyAgICAgIE1hdGNoU2NvcGVzLnBvcF9iYWNrKCk7CisgICAgfQorICB9Cit9CisgICAgCisKKwordm9pZCBTZWxlY3Rpb25EQUdJU2VsOjpDYW5ub3RZZXRTZWxlY3QoU0ROb2RlICpOKSB7CisgIHN0ZDo6c3RyaW5nIG1zZzsKKyAgcmF3X3N0cmluZ19vc3RyZWFtIE1zZyhtc2cpOworICBNc2cgPDwgIkNhbm5vdCB5ZXQgc2VsZWN0OiAiOworICAKKyAgaWYgKE4tPmdldE9wY29kZSgpICE9IElTRDo6SU5UUklOU0lDX1dfQ0hBSU4gJiYKKyAgICAgIE4tPmdldE9wY29kZSgpICE9IElTRDo6SU5UUklOU0lDX1dPX0NIQUlOICYmCisgICAgICBOLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OklOVFJJTlNJQ19WT0lEKSB7CisgICAgTi0+cHJpbnRyRnVsbChNc2csIEN1ckRBRyk7CisgIH0gZWxzZSB7CisgICAgYm9vbCBIYXNJbnB1dENoYWluID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6Ok90aGVyOworICAgIHVuc2lnbmVkIGlpZCA9CisgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKEhhc0lucHV0Q2hhaW4pKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKGlpZCA8IEludHJpbnNpYzo6bnVtX2ludHJpbnNpY3MpCisgICAgICBNc2cgPDwgImludHJpbnNpYyAlIiA8PCBJbnRyaW5zaWM6OmdldE5hbWUoKEludHJpbnNpYzo6SUQpaWlkKTsKKyAgICBlbHNlIGlmIChjb25zdCBUYXJnZXRJbnRyaW5zaWNJbmZvICpUSUkgPSBUTS5nZXRJbnRyaW5zaWNJbmZvKCkpCisgICAgICBNc2cgPDwgInRhcmdldCBpbnRyaW5zaWMgJSIgPDwgVElJLT5nZXROYW1lKGlpZCk7CisgICAgZWxzZQorICAgICAgTXNnIDw8ICJ1bmtub3duIGludHJpbnNpYyAjIiA8PCBpaWQ7CisgIH0KKyAgcmVwb3J0X2ZhdGFsX2Vycm9yKE1zZy5zdHIoKSk7Cit9CisKK2NoYXIgU2VsZWN0aW9uREFHSVNlbDo6SUQgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NlbGVjdGlvbkRBR1ByaW50ZXIuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1NlbGVjdGlvbkRBR1ByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTNkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvU2VsZWN0aW9uREFHUHJpbnRlci5jcHAKQEAgLTAsMCArMSwzMDEgQEAKKy8vPT09LS0gU2VsZWN0aW9uREFHUHJpbnRlci5jcHAgLSBJbXBsZW1lbnQgU2VsZWN0aW9uREFHOjp2aWV3R3JhcGgoKSAtLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBTZWxlY3Rpb25EQUc6OnZpZXdHcmFwaCBtZXRob2QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNjaGVkdWxlREFHU0ROb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRGVidWdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HcmFwaFdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvY29uZmlnLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIGxsdm0geworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBET1RHcmFwaFRyYWl0czxTZWxlY3Rpb25EQUcqPiA6IHB1YmxpYyBEZWZhdWx0RE9UR3JhcGhUcmFpdHMgeworCisgICAgZXhwbGljaXQgRE9UR3JhcGhUcmFpdHMoYm9vbCBpc1NpbXBsZT1mYWxzZSkgOgorICAgICAgRGVmYXVsdERPVEdyYXBoVHJhaXRzKGlzU2ltcGxlKSB7fQorCisgICAgc3RhdGljIGJvb2wgaGFzRWRnZURlc3RMYWJlbHMoKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQgbnVtRWRnZURlc3RMYWJlbHMoY29uc3Qgdm9pZCAqTm9kZSkgeworICAgICAgcmV0dXJuICgoY29uc3QgU0ROb2RlICopIE5vZGUpLT5nZXROdW1WYWx1ZXMoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RWRnZURlc3RMYWJlbChjb25zdCB2b2lkICpOb2RlLCB1bnNpZ25lZCBpKSB7CisgICAgICByZXR1cm4gKChjb25zdCBTRE5vZGUgKikgTm9kZSktPmdldFZhbHVlVHlwZShpKS5nZXRFVlRTdHJpbmcoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFZGdlSXRlcj4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RWRnZVNvdXJjZUxhYmVsKGNvbnN0IHZvaWQgKk5vZGUsIEVkZ2VJdGVyIEkpIHsKKyAgICAgIHJldHVybiBpdG9zdHIoSSAtIFNETm9kZUl0ZXJhdG9yOjpiZWdpbigoU0ROb2RlICopIE5vZGUpKTsKKyAgICB9CisKKyAgICAvLy8gZWRnZVRhcmdldHNFZGdlU291cmNlIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoaXMgb3V0Z29pbmcgZWRnZQorICAgIC8vLyBzaG91bGQgYWN0dWFsbHkgdGFyZ2V0IGFub3RoZXIgZWRnZSBzb3VyY2UsIG5vdCBhIG5vZGUuICBJZiB0aGlzIG1ldGhvZAorICAgIC8vLyBpcyBpbXBsZW1lbnRlZCwgZ2V0RWRnZVRhcmdldCBzaG91bGQgYmUgaW1wbGVtZW50ZWQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRWRnZUl0ZXI+CisgICAgc3RhdGljIGJvb2wgZWRnZVRhcmdldHNFZGdlU291cmNlKGNvbnN0IHZvaWQgKk5vZGUsIEVkZ2VJdGVyIEkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBnZXRFZGdlVGFyZ2V0IC0gSWYgZWRnZVRhcmdldHNFZGdlU291cmNlIHJldHVybnMgdHJ1ZSwgdGhpcyBtZXRob2QgaXMKKyAgICAvLy8gY2FsbGVkIHRvIGRldGVybWluZSB3aGljaCBvdXRnb2luZyBlZGdlIG9mIE5vZGUgaXMgdGhlIHRhcmdldCBvZiB0aGlzCisgICAgLy8vIGVkZ2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRWRnZUl0ZXI+CisgICAgc3RhdGljIEVkZ2VJdGVyIGdldEVkZ2VUYXJnZXQoY29uc3Qgdm9pZCAqTm9kZSwgRWRnZUl0ZXIgSSkgeworICAgICAgU0ROb2RlICpUYXJnZXROb2RlID0gKkk7CisgICAgICBTRE5vZGVJdGVyYXRvciBOSSA9IFNETm9kZUl0ZXJhdG9yOjpiZWdpbihUYXJnZXROb2RlKTsKKyAgICAgIHN0ZDo6YWR2YW5jZShOSSwgSS5nZXROb2RlKCktPmdldE9wZXJhbmQoSS5nZXRPcGVyYW5kKCkpLmdldFJlc05vKCkpOworICAgICAgcmV0dXJuIE5JOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRHcmFwaE5hbWUoY29uc3QgU2VsZWN0aW9uREFHICpHKSB7CisgICAgICByZXR1cm4gRy0+Z2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZSgpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIHJlbmRlckdyYXBoRnJvbUJvdHRvbVVwKCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaGFzTm9kZUFkZHJlc3NMYWJlbChjb25zdCBTRE5vZGUgKk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3Rpb25EQUcgKkdyYXBoKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLy8gSWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGRvdCBhdHRyaWJ1dGVzIHByaW50ZWQgZm9yIGEgcGFydGljdWxhcgorICAgIC8vLyBlZGdlLCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFZGdlSXRlcj4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RWRnZUF0dHJpYnV0ZXMoY29uc3Qgdm9pZCAqTm9kZSwgRWRnZUl0ZXIgRUkpIHsKKyAgICAgIFNEVmFsdWUgT3AgPSBFSS5nZXROb2RlKCktPmdldE9wZXJhbmQoRUkuZ2V0T3BlcmFuZCgpKTsKKyAgICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICAgICAgaWYgKFZUID09IE1WVDo6RmxhZykKKyAgICAgICAgcmV0dXJuICJjb2xvcj1yZWQsc3R5bGU9Ym9sZCI7CisgICAgICBlbHNlIGlmIChWVCA9PSBNVlQ6Ok90aGVyKQorICAgICAgICByZXR1cm4gImNvbG9yPWJsdWUsc3R5bGU9ZGFzaGVkIjsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRTaW1wbGVOb2RlTGFiZWwoY29uc3QgU0ROb2RlICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0aW9uREFHICpHKSB7CisgICAgICBzdGQ6OnN0cmluZyBSZXN1bHQgPSBOb2RlLT5nZXRPcGVyYXRpb25OYW1lKEcpOworICAgICAgeworICAgICAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoUmVzdWx0KTsKKyAgICAgICAgTm9kZS0+cHJpbnRfZGV0YWlscyhPUywgRyk7CisgICAgICB9CisgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBnZXROb2RlTGFiZWwoY29uc3QgU0ROb2RlICpOb2RlLCBjb25zdCBTZWxlY3Rpb25EQUcgKkdyYXBoKTsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0Tm9kZUF0dHJpYnV0ZXMoY29uc3QgU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3Rpb25EQUcgKkdyYXBoKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkF0dHJzID0gR3JhcGgtPmdldEdyYXBoQXR0cnMoTik7CisgICAgICBpZiAoIUF0dHJzLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKEF0dHJzLmZpbmQoInNoYXBlPSIpID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygic2hhcGU9TXJlY29yZCwiKSArIEF0dHJzOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIEF0dHJzOworICAgICAgfQorI2VuZGlmCisgICAgICByZXR1cm4gInNoYXBlPU1yZWNvcmQiOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFkZEN1c3RvbUdyYXBoRmVhdHVyZXMoU2VsZWN0aW9uREFHICpHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhXcml0ZXI8U2VsZWN0aW9uREFHKj4gJkdXKSB7CisgICAgICBHVy5lbWl0U2ltcGxlTm9kZSgwLCAicGxhaW50ZXh0PWNpcmNsZSIsICJHcmFwaFJvb3QiKTsKKyAgICAgIGlmIChHLT5nZXRSb290KCkuZ2V0Tm9kZSgpKQorICAgICAgICBHVy5lbWl0RWRnZSgwLCAtMSwgRy0+Z2V0Um9vdCgpLmdldE5vZGUoKSwgRy0+Z2V0Um9vdCgpLmdldFJlc05vKCksCisgICAgICAgICAgICAgICAgICAgICJjb2xvcj1ibHVlLHN0eWxlPWRhc2hlZCIpOworICAgIH0KKyAgfTsKK30KKworc3RkOjpzdHJpbmcgRE9UR3JhcGhUcmFpdHM8U2VsZWN0aW9uREFHKj46OmdldE5vZGVMYWJlbChjb25zdCBTRE5vZGUgKk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgeworICByZXR1cm4gRE9UR3JhcGhUcmFpdHM8U2VsZWN0aW9uREFHKj46OmdldFNpbXBsZU5vZGVMYWJlbChOb2RlLCBHKTsKK30KKworCisvLy8gdmlld0dyYXBoIC0gUG9wIHVwIGEgZ2hvc3R2aWV3IHdpbmRvdyB3aXRoIHRoZSByZWFjaGFibGUgcGFydHMgb2YgdGhlIERBRworLy8vIHJlbmRlcmVkIHVzaW5nICdkb3QnLgorLy8vCit2b2lkIFNlbGVjdGlvbkRBRzo6dmlld0dyYXBoKGNvbnN0IHN0ZDo6c3RyaW5nICZUaXRsZSkgeworLy8gVGhpcyBjb2RlIGlzIG9ubHkgZm9yIGRlYnVnZ2luZyEKKyNpZm5kZWYgTkRFQlVHCisgIFZpZXdHcmFwaCh0aGlzLCAiZGFnLiIgKyBnZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRGdW5jdGlvbigpLT5nZXROYW1lU3RyKCksCisgICAgICAgICAgICBmYWxzZSwgVGl0bGUpOworI2Vsc2UKKyAgZXJycygpIDw8ICJTZWxlY3Rpb25EQUc6OnZpZXdHcmFwaCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBkZWJ1ZyBidWlsZHMgb24gIgorICAgICAgICAgPDwgInN5c3RlbXMgd2l0aCBHcmFwaHZpeiBvciBndiFcbiI7CisjZW5kaWYgIC8vIE5ERUJVRworfQorCisvLyBUaGlzIG92ZXJsb2FkIGlzIGRlZmluZWQgb3V0LW9mLWxpbmUgaGVyZSBpbnN0ZWFkIG9mIGp1c3QgdXNpbmcgYQorLy8gZGVmYXVsdCBwYXJhbWV0ZXIgYmVjYXVzZSB0aGlzIGlzIGVhc2llc3QgZm9yIGdkYiB0byBjYWxsLgordm9pZCBTZWxlY3Rpb25EQUc6OnZpZXdHcmFwaCgpIHsKKyAgdmlld0dyYXBoKCIiKTsKK30KKworLy8vIGNsZWFyR3JhcGhBdHRycyAtIENsZWFyIGFsbCBwcmV2aW91c2x5IGRlZmluZWQgbm9kZSBncmFwaCBhdHRyaWJ1dGVzLgorLy8vIEludGVuZGVkIHRvIGJlIHVzZWQgZnJvbSBhIGRlYnVnZ2luZyB0b29sIChlZy4gZ2RiKS4KK3ZvaWQgU2VsZWN0aW9uREFHOjpjbGVhckdyYXBoQXR0cnMoKSB7CisjaWZuZGVmIE5ERUJVRworICBOb2RlR3JhcGhBdHRycy5jbGVhcigpOworI2Vsc2UKKyAgZXJycygpIDw8ICJTZWxlY3Rpb25EQUc6OmNsZWFyR3JhcGhBdHRycyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBkZWJ1ZyBidWlsZHMiCisgICAgICAgICA8PCAiIG9uIHN5c3RlbXMgd2l0aCBHcmFwaHZpeiBvciBndiFcbiI7CisjZW5kaWYKK30KKworCisvLy8gc2V0R3JhcGhBdHRycyAtIFNldCBncmFwaCBhdHRyaWJ1dGVzIGZvciBhIG5vZGUuIChlZy4gImNvbG9yPXJlZCIuKQorLy8vCit2b2lkIFNlbGVjdGlvbkRBRzo6c2V0R3JhcGhBdHRycyhjb25zdCBTRE5vZGUgKk4sIGNvbnN0IGNoYXIgKkF0dHJzKSB7CisjaWZuZGVmIE5ERUJVRworICBOb2RlR3JhcGhBdHRyc1tOXSA9IEF0dHJzOworI2Vsc2UKKyAgZXJycygpIDw8ICJTZWxlY3Rpb25EQUc6OnNldEdyYXBoQXR0cnMgaXMgb25seSBhdmFpbGFibGUgaW4gZGVidWcgYnVpbGRzIgorICAgICAgICAgPDwgIiBvbiBzeXN0ZW1zIHdpdGggR3JhcGh2aXogb3IgZ3YhXG4iOworI2VuZGlmCit9CisKKworLy8vIGdldEdyYXBoQXR0cnMgLSBHZXQgZ3JhcGggYXR0cmlidXRlcyBmb3IgYSBub2RlLiAoZWcuICJjb2xvcj1yZWQiLikKKy8vLyBVc2VkIGZyb20gZ2V0Tm9kZUF0dHJpYnV0ZXMuCitjb25zdCBzdGQ6OnN0cmluZyBTZWxlY3Rpb25EQUc6OmdldEdyYXBoQXR0cnMoY29uc3QgU0ROb2RlICpOKSBjb25zdCB7CisjaWZuZGVmIE5ERUJVRworICBzdGQ6Om1hcDxjb25zdCBTRE5vZGUgKiwgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBJID0KKyAgICBOb2RlR3JhcGhBdHRycy5maW5kKE4pOworCisgIGlmIChJICE9IE5vZGVHcmFwaEF0dHJzLmVuZCgpKQorICAgIHJldHVybiBJLT5zZWNvbmQ7CisgIGVsc2UKKyAgICByZXR1cm4gIiI7CisjZWxzZQorICBlcnJzKCkgPDwgIlNlbGVjdGlvbkRBRzo6Z2V0R3JhcGhBdHRycyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBkZWJ1ZyBidWlsZHMiCisgICAgICAgICA8PCAiIG9uIHN5c3RlbXMgd2l0aCBHcmFwaHZpeiBvciBndiFcbiI7CisgIHJldHVybiBzdGQ6OnN0cmluZygpOworI2VuZGlmCit9CisKKy8vLyBzZXRHcmFwaENvbG9yIC0gQ29udmVuaWVuY2UgZm9yIHNldHRpbmcgbm9kZSBjb2xvciBhdHRyaWJ1dGUuCisvLy8KK3ZvaWQgU2VsZWN0aW9uREFHOjpzZXRHcmFwaENvbG9yKGNvbnN0IFNETm9kZSAqTiwgY29uc3QgY2hhciAqQ29sb3IpIHsKKyNpZm5kZWYgTkRFQlVHCisgIE5vZGVHcmFwaEF0dHJzW05dID0gc3RkOjpzdHJpbmcoImNvbG9yPSIpICsgQ29sb3I7CisjZWxzZQorICBlcnJzKCkgPDwgIlNlbGVjdGlvbkRBRzo6c2V0R3JhcGhDb2xvciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBkZWJ1ZyBidWlsZHMiCisgICAgICAgICA8PCAiIG9uIHN5c3RlbXMgd2l0aCBHcmFwaHZpeiBvciBndiFcbiI7CisjZW5kaWYKK30KKworLy8vIHNldFN1YmdyYXBoQ29sb3JIZWxwZXIgLSBJbXBsZW1lbnQgc2V0U3ViZ3JhcGhDb2xvci4gIFJldHVybgorLy8vIHdoZXRoZXIgd2UgdHJ1bmNhdGVkIHRoZSBzZWFyY2guCisvLy8KK2Jvb2wgU2VsZWN0aW9uREFHOjpzZXRTdWJncmFwaENvbG9ySGVscGVyKFNETm9kZSAqTiwgY29uc3QgY2hhciAqQ29sb3IsIERlbnNlU2V0PFNETm9kZSAqPiAmdmlzaXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwgYm9vbCAmcHJpbnRlZCkgeworICBib29sIGhpdF9saW1pdCA9IGZhbHNlOworCisjaWZuZGVmIE5ERUJVRworICBpZiAobGV2ZWwgPj0gMjApIHsKKyAgICBpZiAoIXByaW50ZWQpIHsKKyAgICAgIHByaW50ZWQgPSB0cnVlOworICAgICAgREVCVUcoZGJncygpIDw8ICJzZXRTdWJncmFwaENvbG9yIGhpdCBtYXggbGV2ZWxcbiIpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHVuc2lnbmVkIG9sZFNpemUgPSB2aXNpdGVkLnNpemUoKTsKKyAgdmlzaXRlZC5pbnNlcnQoTik7CisgIGlmICh2aXNpdGVkLnNpemUoKSAhPSBvbGRTaXplKSB7CisgICAgc2V0R3JhcGhDb2xvcihOLCBDb2xvcik7CisgICAgZm9yKFNETm9kZUl0ZXJhdG9yIGkgPSBTRE5vZGVJdGVyYXRvcjo6YmVnaW4oTiksIGllbmQgPSBTRE5vZGVJdGVyYXRvcjo6ZW5kKE4pOworICAgICAgICBpICE9IGllbmQ7CisgICAgICAgICsraSkgeworICAgICAgaGl0X2xpbWl0ID0gc2V0U3ViZ3JhcGhDb2xvckhlbHBlcigqaSwgQ29sb3IsIHZpc2l0ZWQsIGxldmVsKzEsIHByaW50ZWQpIHx8IGhpdF9saW1pdDsKKyAgICB9CisgIH0KKyNlbHNlCisgIGVycnMoKSA8PCAiU2VsZWN0aW9uREFHOjpzZXRTdWJncmFwaENvbG9yIGlzIG9ubHkgYXZhaWxhYmxlIGluIGRlYnVnIGJ1aWxkcyIKKyAgICAgICAgIDw8ICIgb24gc3lzdGVtcyB3aXRoIEdyYXBodml6IG9yIGd2IVxuIjsKKyNlbmRpZgorICByZXR1cm4gaGl0X2xpbWl0OworfQorCisvLy8gc2V0U3ViZ3JhcGhDb2xvciAtIENvbnZlbmllbmNlIGZvciBzZXR0aW5nIHN1YmdyYXBoIGNvbG9yIGF0dHJpYnV0ZS4KKy8vLwordm9pZCBTZWxlY3Rpb25EQUc6OnNldFN1YmdyYXBoQ29sb3IoU0ROb2RlICpOLCBjb25zdCBjaGFyICpDb2xvcikgeworI2lmbmRlZiBOREVCVUcKKyAgRGVuc2VTZXQ8U0ROb2RlICo+IHZpc2l0ZWQ7CisgIGJvb2wgcHJpbnRlZCA9IGZhbHNlOworICBpZiAoc2V0U3ViZ3JhcGhDb2xvckhlbHBlcihOLCBDb2xvciwgdmlzaXRlZCwgMCwgcHJpbnRlZCkpIHsKKyAgICAvLyBWaXN1YWxseSBtYXJrIHRoYXQgd2UgaGl0IHRoZSBsaW1pdAorICAgIGlmIChzdHJjbXAoQ29sb3IsICJyZWQiKSA9PSAwKSB7CisgICAgICBzZXRTdWJncmFwaENvbG9ySGVscGVyKE4sICJibHVlIiwgdmlzaXRlZCwgMCwgcHJpbnRlZCk7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoQ29sb3IsICJ5ZWxsb3ciKSA9PSAwKSB7CisgICAgICBzZXRTdWJncmFwaENvbG9ySGVscGVyKE4sICJncmVlbiIsIHZpc2l0ZWQsIDAsIHByaW50ZWQpOworICAgIH0KKyAgfQorCisjZWxzZQorICBlcnJzKCkgPDwgIlNlbGVjdGlvbkRBRzo6c2V0U3ViZ3JhcGhDb2xvciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBkZWJ1ZyBidWlsZHMiCisgICAgICAgICA8PCAiIG9uIHN5c3RlbXMgd2l0aCBHcmFwaHZpeiBvciBndiFcbiI7CisjZW5kaWYKK30KKworc3RkOjpzdHJpbmcgU2NoZWR1bGVEQUdTRE5vZGVzOjpnZXRHcmFwaE5vZGVMYWJlbChjb25zdCBTVW5pdCAqU1UpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgczsKKyAgcmF3X3N0cmluZ19vc3RyZWFtIE8ocyk7CisgIE8gPDwgIlNVKCIgPDwgU1UtPk5vZGVOdW0gPDwgIik6ICI7CisgIGlmIChTVS0+Z2V0Tm9kZSgpKSB7CisgICAgU21hbGxWZWN0b3I8U0ROb2RlICosIDQ+IEZsYWdnZWROb2RlczsKKyAgICBmb3IgKFNETm9kZSAqTiA9IFNVLT5nZXROb2RlKCk7IE47IE4gPSBOLT5nZXRGbGFnZ2VkTm9kZSgpKQorICAgICAgRmxhZ2dlZE5vZGVzLnB1c2hfYmFjayhOKTsKKyAgICB3aGlsZSAoIUZsYWdnZWROb2Rlcy5lbXB0eSgpKSB7CisgICAgICBPIDw8IERPVEdyYXBoVHJhaXRzPFNlbGVjdGlvbkRBRyo+CisgICAgICAgIDo6Z2V0U2ltcGxlTm9kZUxhYmVsKEZsYWdnZWROb2Rlcy5iYWNrKCksIERBRyk7CisgICAgICBGbGFnZ2VkTm9kZXMucG9wX2JhY2soKTsKKyAgICAgIGlmICghRmxhZ2dlZE5vZGVzLmVtcHR5KCkpCisgICAgICAgIE8gPDwgIlxuICAgICI7CisgICAgfQorICB9IGVsc2UgeworICAgIE8gPDwgIkNST1NTIFJDIENPUFkiOworICB9CisgIHJldHVybiBPLnN0cigpOworfQorCit2b2lkIFNjaGVkdWxlREFHU0ROb2Rlczo6Z2V0Q3VzdG9tR3JhcGhGZWF0dXJlcyhHcmFwaFdyaXRlcjxTY2hlZHVsZURBRyo+ICZHVykgY29uc3QgeworICBpZiAoREFHKSB7CisgICAgLy8gRHJhdyBhIHNwZWNpYWwgIkdyYXBoUm9vdCIgbm9kZSB0byBpbmRpY2F0ZSB0aGUgcm9vdCBvZiB0aGUgZ3JhcGguCisgICAgR1cuZW1pdFNpbXBsZU5vZGUoMCwgInBsYWludGV4dD1jaXJjbGUiLCAiR3JhcGhSb290Iik7CisgICAgY29uc3QgU0ROb2RlICpOID0gREFHLT5nZXRSb290KCkuZ2V0Tm9kZSgpOworICAgIGlmIChOICYmIE4tPmdldE5vZGVJZCgpICE9IC0xKQorICAgICAgR1cuZW1pdEVkZ2UoMCwgLTEsICZTVW5pdHNbTi0+Z2V0Tm9kZUlkKCldLCAtMSwKKyAgICAgICAgICAgICAgICAgICJjb2xvcj1ibHVlLHN0eWxlPWRhc2hlZCIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvVGFyZ2V0TG93ZXJpbmcuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1RhcmdldExvd2VyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmE0YjcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2VsZWN0aW9uREFHL1RhcmdldExvd2VyaW5nLmNwcApAQCAtMCwwICsxLDI5MDcgQEAKKy8vPT09LS0gVGFyZ2V0TG93ZXJpbmcuY3BwIC0gSW1wbGVtZW50IHRoZSBUYXJnZXRMb3dlcmluZyBjbGFzcyAtLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBUYXJnZXRMb3dlcmluZyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSBsbHZtIHsKK1RMU01vZGVsOjpNb2RlbCBnZXRUTFNNb2RlbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIFJlbG9jOjpNb2RlbCByZWxvYykgeworICBib29sIGlzTG9jYWwgPSBHVi0+aGFzTG9jYWxMaW5rYWdlKCk7CisgIGJvb2wgaXNEZWNsYXJhdGlvbiA9IEdWLT5pc0RlY2xhcmF0aW9uKCk7CisgIC8vIEZJWE1FOiB3aGF0IHNob3VsZCB3ZSBkbyBmb3IgcHJvdGVjdGVkIGFuZCBpbnRlcm5hbCB2aXNpYmlsaXR5PworICAvLyBGb3IgdmFyaWFibGVzLCBpcyBpbnRlcm5hbCBkaWZmZXJlbnQgZnJvbSBoaWRkZW4/CisgIGJvb2wgaXNIaWRkZW4gPSBHVi0+aGFzSGlkZGVuVmlzaWJpbGl0eSgpOworCisgIGlmIChyZWxvYyA9PSBSZWxvYzo6UElDXykgeworICAgIGlmIChpc0xvY2FsIHx8IGlzSGlkZGVuKQorICAgICAgcmV0dXJuIFRMU01vZGVsOjpMb2NhbER5bmFtaWM7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFRMU01vZGVsOjpHZW5lcmFsRHluYW1pYzsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIWlzRGVjbGFyYXRpb24gfHwgaXNIaWRkZW4pCisgICAgICByZXR1cm4gVExTTW9kZWw6OkxvY2FsRXhlYzsKKyAgICBlbHNlCisgICAgICByZXR1cm4gVExTTW9kZWw6OkluaXRpYWxFeGVjOworICB9Cit9Cit9CisKKy8vLyBJbml0TGliY2FsbE5hbWVzIC0gU2V0IGRlZmF1bHQgbGliY2FsbCBuYW1lcy4KKy8vLworc3RhdGljIHZvaWQgSW5pdExpYmNhbGxOYW1lcyhjb25zdCBjaGFyICoqTmFtZXMpIHsKKyAgTmFtZXNbUlRMSUI6OlNITF9JMTZdID0gIl9fYXNobGhpMyI7CisgIE5hbWVzW1JUTElCOjpTSExfSTMyXSA9ICJfX2FzaGxzaTMiOworICBOYW1lc1tSVExJQjo6U0hMX0k2NF0gPSAiX19hc2hsZGkzIjsKKyAgTmFtZXNbUlRMSUI6OlNITF9JMTI4XSA9ICJfX2FzaGx0aTMiOworICBOYW1lc1tSVExJQjo6U1JMX0kxNl0gPSAiX19sc2hyaGkzIjsKKyAgTmFtZXNbUlRMSUI6OlNSTF9JMzJdID0gIl9fbHNocnNpMyI7CisgIE5hbWVzW1JUTElCOjpTUkxfSTY0XSA9ICJfX2xzaHJkaTMiOworICBOYW1lc1tSVExJQjo6U1JMX0kxMjhdID0gIl9fbHNocnRpMyI7CisgIE5hbWVzW1JUTElCOjpTUkFfSTE2XSA9ICJfX2FzaHJoaTMiOworICBOYW1lc1tSVExJQjo6U1JBX0kzMl0gPSAiX19hc2hyc2kzIjsKKyAgTmFtZXNbUlRMSUI6OlNSQV9JNjRdID0gIl9fYXNocmRpMyI7CisgIE5hbWVzW1JUTElCOjpTUkFfSTEyOF0gPSAiX19hc2hydGkzIjsKKyAgTmFtZXNbUlRMSUI6Ok1VTF9JOF0gPSAiX19tdWxxaTMiOworICBOYW1lc1tSVExJQjo6TVVMX0kxNl0gPSAiX19tdWxoaTMiOworICBOYW1lc1tSVExJQjo6TVVMX0kzMl0gPSAiX19tdWxzaTMiOworICBOYW1lc1tSVExJQjo6TVVMX0k2NF0gPSAiX19tdWxkaTMiOworICBOYW1lc1tSVExJQjo6TVVMX0kxMjhdID0gIl9fbXVsdGkzIjsKKyAgTmFtZXNbUlRMSUI6OlNESVZfSThdID0gIl9fZGl2cWkzIjsKKyAgTmFtZXNbUlRMSUI6OlNESVZfSTE2XSA9ICJfX2RpdmhpMyI7CisgIE5hbWVzW1JUTElCOjpTRElWX0kzMl0gPSAiX19kaXZzaTMiOworICBOYW1lc1tSVExJQjo6U0RJVl9JNjRdID0gIl9fZGl2ZGkzIjsKKyAgTmFtZXNbUlRMSUI6OlNESVZfSTEyOF0gPSAiX19kaXZ0aTMiOworICBOYW1lc1tSVExJQjo6VURJVl9JOF0gPSAiX191ZGl2cWkzIjsKKyAgTmFtZXNbUlRMSUI6OlVESVZfSTE2XSA9ICJfX3VkaXZoaTMiOworICBOYW1lc1tSVExJQjo6VURJVl9JMzJdID0gIl9fdWRpdnNpMyI7CisgIE5hbWVzW1JUTElCOjpVRElWX0k2NF0gPSAiX191ZGl2ZGkzIjsKKyAgTmFtZXNbUlRMSUI6OlVESVZfSTEyOF0gPSAiX191ZGl2dGkzIjsKKyAgTmFtZXNbUlRMSUI6OlNSRU1fSThdID0gIl9fbW9kcWkzIjsKKyAgTmFtZXNbUlRMSUI6OlNSRU1fSTE2XSA9ICJfX21vZGhpMyI7CisgIE5hbWVzW1JUTElCOjpTUkVNX0kzMl0gPSAiX19tb2RzaTMiOworICBOYW1lc1tSVExJQjo6U1JFTV9JNjRdID0gIl9fbW9kZGkzIjsKKyAgTmFtZXNbUlRMSUI6OlNSRU1fSTEyOF0gPSAiX19tb2R0aTMiOworICBOYW1lc1tSVExJQjo6VVJFTV9JOF0gPSAiX191bW9kcWkzIjsKKyAgTmFtZXNbUlRMSUI6OlVSRU1fSTE2XSA9ICJfX3Vtb2RoaTMiOworICBOYW1lc1tSVExJQjo6VVJFTV9JMzJdID0gIl9fdW1vZHNpMyI7CisgIE5hbWVzW1JUTElCOjpVUkVNX0k2NF0gPSAiX191bW9kZGkzIjsKKyAgTmFtZXNbUlRMSUI6OlVSRU1fSTEyOF0gPSAiX191bW9kdGkzIjsKKyAgTmFtZXNbUlRMSUI6Ok5FR19JMzJdID0gIl9fbmVnc2kyIjsKKyAgTmFtZXNbUlRMSUI6Ok5FR19JNjRdID0gIl9fbmVnZGkyIjsKKyAgTmFtZXNbUlRMSUI6OkFERF9GMzJdID0gIl9fYWRkc2YzIjsKKyAgTmFtZXNbUlRMSUI6OkFERF9GNjRdID0gIl9fYWRkZGYzIjsKKyAgTmFtZXNbUlRMSUI6OkFERF9GODBdID0gIl9fYWRkeGYzIjsKKyAgTmFtZXNbUlRMSUI6OkFERF9QUENGMTI4XSA9ICJfX2djY19xYWRkIjsKKyAgTmFtZXNbUlRMSUI6OlNVQl9GMzJdID0gIl9fc3Vic2YzIjsKKyAgTmFtZXNbUlRMSUI6OlNVQl9GNjRdID0gIl9fc3ViZGYzIjsKKyAgTmFtZXNbUlRMSUI6OlNVQl9GODBdID0gIl9fc3VieGYzIjsKKyAgTmFtZXNbUlRMSUI6OlNVQl9QUENGMTI4XSA9ICJfX2djY19xc3ViIjsKKyAgTmFtZXNbUlRMSUI6Ok1VTF9GMzJdID0gIl9fbXVsc2YzIjsKKyAgTmFtZXNbUlRMSUI6Ok1VTF9GNjRdID0gIl9fbXVsZGYzIjsKKyAgTmFtZXNbUlRMSUI6Ok1VTF9GODBdID0gIl9fbXVseGYzIjsKKyAgTmFtZXNbUlRMSUI6Ok1VTF9QUENGMTI4XSA9ICJfX2djY19xbXVsIjsKKyAgTmFtZXNbUlRMSUI6OkRJVl9GMzJdID0gIl9fZGl2c2YzIjsKKyAgTmFtZXNbUlRMSUI6OkRJVl9GNjRdID0gIl9fZGl2ZGYzIjsKKyAgTmFtZXNbUlRMSUI6OkRJVl9GODBdID0gIl9fZGl2eGYzIjsKKyAgTmFtZXNbUlRMSUI6OkRJVl9QUENGMTI4XSA9ICJfX2djY19xZGl2IjsKKyAgTmFtZXNbUlRMSUI6OlJFTV9GMzJdID0gImZtb2RmIjsKKyAgTmFtZXNbUlRMSUI6OlJFTV9GNjRdID0gImZtb2QiOworICBOYW1lc1tSVExJQjo6UkVNX0Y4MF0gPSAiZm1vZGwiOworICBOYW1lc1tSVExJQjo6UkVNX1BQQ0YxMjhdID0gImZtb2RsIjsKKyAgTmFtZXNbUlRMSUI6OlBPV0lfRjMyXSA9ICJfX3Bvd2lzZjIiOworICBOYW1lc1tSVExJQjo6UE9XSV9GNjRdID0gIl9fcG93aWRmMiI7CisgIE5hbWVzW1JUTElCOjpQT1dJX0Y4MF0gPSAiX19wb3dpeGYyIjsKKyAgTmFtZXNbUlRMSUI6OlBPV0lfUFBDRjEyOF0gPSAiX19wb3dpdGYyIjsKKyAgTmFtZXNbUlRMSUI6OlNRUlRfRjMyXSA9ICJzcXJ0ZiI7CisgIE5hbWVzW1JUTElCOjpTUVJUX0Y2NF0gPSAic3FydCI7CisgIE5hbWVzW1JUTElCOjpTUVJUX0Y4MF0gPSAic3FydGwiOworICBOYW1lc1tSVExJQjo6U1FSVF9QUENGMTI4XSA9ICJzcXJ0bCI7CisgIE5hbWVzW1JUTElCOjpMT0dfRjMyXSA9ICJsb2dmIjsKKyAgTmFtZXNbUlRMSUI6OkxPR19GNjRdID0gImxvZyI7CisgIE5hbWVzW1JUTElCOjpMT0dfRjgwXSA9ICJsb2dsIjsKKyAgTmFtZXNbUlRMSUI6OkxPR19QUENGMTI4XSA9ICJsb2dsIjsKKyAgTmFtZXNbUlRMSUI6OkxPRzJfRjMyXSA9ICJsb2cyZiI7CisgIE5hbWVzW1JUTElCOjpMT0cyX0Y2NF0gPSAibG9nMiI7CisgIE5hbWVzW1JUTElCOjpMT0cyX0Y4MF0gPSAibG9nMmwiOworICBOYW1lc1tSVExJQjo6TE9HMl9QUENGMTI4XSA9ICJsb2cybCI7CisgIE5hbWVzW1JUTElCOjpMT0cxMF9GMzJdID0gImxvZzEwZiI7CisgIE5hbWVzW1JUTElCOjpMT0cxMF9GNjRdID0gImxvZzEwIjsKKyAgTmFtZXNbUlRMSUI6OkxPRzEwX0Y4MF0gPSAibG9nMTBsIjsKKyAgTmFtZXNbUlRMSUI6OkxPRzEwX1BQQ0YxMjhdID0gImxvZzEwbCI7CisgIE5hbWVzW1JUTElCOjpFWFBfRjMyXSA9ICJleHBmIjsKKyAgTmFtZXNbUlRMSUI6OkVYUF9GNjRdID0gImV4cCI7CisgIE5hbWVzW1JUTElCOjpFWFBfRjgwXSA9ICJleHBsIjsKKyAgTmFtZXNbUlRMSUI6OkVYUF9QUENGMTI4XSA9ICJleHBsIjsKKyAgTmFtZXNbUlRMSUI6OkVYUDJfRjMyXSA9ICJleHAyZiI7CisgIE5hbWVzW1JUTElCOjpFWFAyX0Y2NF0gPSAiZXhwMiI7CisgIE5hbWVzW1JUTElCOjpFWFAyX0Y4MF0gPSAiZXhwMmwiOworICBOYW1lc1tSVExJQjo6RVhQMl9QUENGMTI4XSA9ICJleHAybCI7CisgIE5hbWVzW1JUTElCOjpTSU5fRjMyXSA9ICJzaW5mIjsKKyAgTmFtZXNbUlRMSUI6OlNJTl9GNjRdID0gInNpbiI7CisgIE5hbWVzW1JUTElCOjpTSU5fRjgwXSA9ICJzaW5sIjsKKyAgTmFtZXNbUlRMSUI6OlNJTl9QUENGMTI4XSA9ICJzaW5sIjsKKyAgTmFtZXNbUlRMSUI6OkNPU19GMzJdID0gImNvc2YiOworICBOYW1lc1tSVExJQjo6Q09TX0Y2NF0gPSAiY29zIjsKKyAgTmFtZXNbUlRMSUI6OkNPU19GODBdID0gImNvc2wiOworICBOYW1lc1tSVExJQjo6Q09TX1BQQ0YxMjhdID0gImNvc2wiOworICBOYW1lc1tSVExJQjo6UE9XX0YzMl0gPSAicG93ZiI7CisgIE5hbWVzW1JUTElCOjpQT1dfRjY0XSA9ICJwb3ciOworICBOYW1lc1tSVExJQjo6UE9XX0Y4MF0gPSAicG93bCI7CisgIE5hbWVzW1JUTElCOjpQT1dfUFBDRjEyOF0gPSAicG93bCI7CisgIE5hbWVzW1JUTElCOjpDRUlMX0YzMl0gPSAiY2VpbGYiOworICBOYW1lc1tSVExJQjo6Q0VJTF9GNjRdID0gImNlaWwiOworICBOYW1lc1tSVExJQjo6Q0VJTF9GODBdID0gImNlaWxsIjsKKyAgTmFtZXNbUlRMSUI6OkNFSUxfUFBDRjEyOF0gPSAiY2VpbGwiOworICBOYW1lc1tSVExJQjo6VFJVTkNfRjMyXSA9ICJ0cnVuY2YiOworICBOYW1lc1tSVExJQjo6VFJVTkNfRjY0XSA9ICJ0cnVuYyI7CisgIE5hbWVzW1JUTElCOjpUUlVOQ19GODBdID0gInRydW5jbCI7CisgIE5hbWVzW1JUTElCOjpUUlVOQ19QUENGMTI4XSA9ICJ0cnVuY2wiOworICBOYW1lc1tSVExJQjo6UklOVF9GMzJdID0gInJpbnRmIjsKKyAgTmFtZXNbUlRMSUI6OlJJTlRfRjY0XSA9ICJyaW50IjsKKyAgTmFtZXNbUlRMSUI6OlJJTlRfRjgwXSA9ICJyaW50bCI7CisgIE5hbWVzW1JUTElCOjpSSU5UX1BQQ0YxMjhdID0gInJpbnRsIjsKKyAgTmFtZXNbUlRMSUI6Ok5FQVJCWUlOVF9GMzJdID0gIm5lYXJieWludGYiOworICBOYW1lc1tSVExJQjo6TkVBUkJZSU5UX0Y2NF0gPSAibmVhcmJ5aW50IjsKKyAgTmFtZXNbUlRMSUI6Ok5FQVJCWUlOVF9GODBdID0gIm5lYXJieWludGwiOworICBOYW1lc1tSVExJQjo6TkVBUkJZSU5UX1BQQ0YxMjhdID0gIm5lYXJieWludGwiOworICBOYW1lc1tSVExJQjo6RkxPT1JfRjMyXSA9ICJmbG9vcmYiOworICBOYW1lc1tSVExJQjo6RkxPT1JfRjY0XSA9ICJmbG9vciI7CisgIE5hbWVzW1JUTElCOjpGTE9PUl9GODBdID0gImZsb29ybCI7CisgIE5hbWVzW1JUTElCOjpGTE9PUl9QUENGMTI4XSA9ICJmbG9vcmwiOworICBOYW1lc1tSVExJQjo6Q09QWVNJR05fRjMyXSA9ICJjb3B5c2lnbmYiOworICBOYW1lc1tSVExJQjo6Q09QWVNJR05fRjY0XSA9ICJjb3B5c2lnbiI7CisgIE5hbWVzW1JUTElCOjpDT1BZU0lHTl9GODBdID0gImNvcHlzaWdubCI7CisgIE5hbWVzW1JUTElCOjpDT1BZU0lHTl9QUENGMTI4XSA9ICJjb3B5c2lnbmwiOworICBOYW1lc1tSVExJQjo6RlBFWFRfRjMyX0Y2NF0gPSAiX19leHRlbmRzZmRmMiI7CisgIE5hbWVzW1JUTElCOjpGUEVYVF9GMTZfRjMyXSA9ICJfX2dudV9oMmZfaWVlZSI7CisgIE5hbWVzW1JUTElCOjpGUFJPVU5EX0YzMl9GMTZdID0gIl9fZ251X2YyaF9pZWVlIjsKKyAgTmFtZXNbUlRMSUI6OkZQUk9VTkRfRjY0X0YzMl0gPSAiX190cnVuY2Rmc2YyIjsKKyAgTmFtZXNbUlRMSUI6OkZQUk9VTkRfRjgwX0YzMl0gPSAiX190cnVuY3hmc2YyIjsKKyAgTmFtZXNbUlRMSUI6OkZQUk9VTkRfUFBDRjEyOF9GMzJdID0gIl9fdHJ1bmN0ZnNmMiI7CisgIE5hbWVzW1JUTElCOjpGUFJPVU5EX0Y4MF9GNjRdID0gIl9fdHJ1bmN4ZmRmMiI7CisgIE5hbWVzW1JUTElCOjpGUFJPVU5EX1BQQ0YxMjhfRjY0XSA9ICJfX3RydW5jdGZkZjIiOworICBOYW1lc1tSVExJQjo6RlBUT1NJTlRfRjMyX0k4XSA9ICJfX2ZpeHNmcWkiOworICBOYW1lc1tSVExJQjo6RlBUT1NJTlRfRjMyX0kxNl0gPSAiX19maXhzZmhpIjsKKyAgTmFtZXNbUlRMSUI6OkZQVE9TSU5UX0YzMl9JMzJdID0gIl9fZml4c2ZzaSI7CisgIE5hbWVzW1JUTElCOjpGUFRPU0lOVF9GMzJfSTY0XSA9ICJfX2ZpeHNmZGkiOworICBOYW1lc1tSVExJQjo6RlBUT1NJTlRfRjMyX0kxMjhdID0gIl9fZml4c2Z0aSI7CisgIE5hbWVzW1JUTElCOjpGUFRPU0lOVF9GNjRfSThdID0gIl9fZml4ZGZxaSI7CisgIE5hbWVzW1JUTElCOjpGUFRPU0lOVF9GNjRfSTE2XSA9ICJfX2ZpeGRmaGkiOworICBOYW1lc1tSVExJQjo6RlBUT1NJTlRfRjY0X0kzMl0gPSAiX19maXhkZnNpIjsKKyAgTmFtZXNbUlRMSUI6OkZQVE9TSU5UX0Y2NF9JNjRdID0gIl9fZml4ZGZkaSI7CisgIE5hbWVzW1JUTElCOjpGUFRPU0lOVF9GNjRfSTEyOF0gPSAiX19maXhkZnRpIjsKKyAgTmFtZXNbUlRMSUI6OkZQVE9TSU5UX0Y4MF9JMzJdID0gIl9fZml4eGZzaSI7CisgIE5hbWVzW1JUTElCOjpGUFRPU0lOVF9GODBfSTY0XSA9ICJfX2ZpeHhmZGkiOworICBOYW1lc1tSVExJQjo6RlBUT1NJTlRfRjgwX0kxMjhdID0gIl9fZml4eGZ0aSI7CisgIE5hbWVzW1JUTElCOjpGUFRPU0lOVF9QUENGMTI4X0kzMl0gPSAiX19maXh0ZnNpIjsKKyAgTmFtZXNbUlRMSUI6OkZQVE9TSU5UX1BQQ0YxMjhfSTY0XSA9ICJfX2ZpeHRmZGkiOworICBOYW1lc1tSVExJQjo6RlBUT1NJTlRfUFBDRjEyOF9JMTI4XSA9ICJfX2ZpeHRmdGkiOworICBOYW1lc1tSVExJQjo6RlBUT1VJTlRfRjMyX0k4XSA9ICJfX2ZpeHVuc3NmcWkiOworICBOYW1lc1tSVExJQjo6RlBUT1VJTlRfRjMyX0kxNl0gPSAiX19maXh1bnNzZmhpIjsKKyAgTmFtZXNbUlRMSUI6OkZQVE9VSU5UX0YzMl9JMzJdID0gIl9fZml4dW5zc2ZzaSI7CisgIE5hbWVzW1JUTElCOjpGUFRPVUlOVF9GMzJfSTY0XSA9ICJfX2ZpeHVuc3NmZGkiOworICBOYW1lc1tSVExJQjo6RlBUT1VJTlRfRjMyX0kxMjhdID0gIl9fZml4dW5zc2Z0aSI7CisgIE5hbWVzW1JUTElCOjpGUFRPVUlOVF9GNjRfSThdID0gIl9fZml4dW5zZGZxaSI7CisgIE5hbWVzW1JUTElCOjpGUFRPVUlOVF9GNjRfSTE2XSA9ICJfX2ZpeHVuc2RmaGkiOworICBOYW1lc1tSVExJQjo6RlBUT1VJTlRfRjY0X0kzMl0gPSAiX19maXh1bnNkZnNpIjsKKyAgTmFtZXNbUlRMSUI6OkZQVE9VSU5UX0Y2NF9JNjRdID0gIl9fZml4dW5zZGZkaSI7CisgIE5hbWVzW1JUTElCOjpGUFRPVUlOVF9GNjRfSTEyOF0gPSAiX19maXh1bnNkZnRpIjsKKyAgTmFtZXNbUlRMSUI6OkZQVE9VSU5UX0Y4MF9JMzJdID0gIl9fZml4dW5zeGZzaSI7CisgIE5hbWVzW1JUTElCOjpGUFRPVUlOVF9GODBfSTY0XSA9ICJfX2ZpeHVuc3hmZGkiOworICBOYW1lc1tSVExJQjo6RlBUT1VJTlRfRjgwX0kxMjhdID0gIl9fZml4dW5zeGZ0aSI7CisgIE5hbWVzW1JUTElCOjpGUFRPVUlOVF9QUENGMTI4X0kzMl0gPSAiX19maXh1bnN0ZnNpIjsKKyAgTmFtZXNbUlRMSUI6OkZQVE9VSU5UX1BQQ0YxMjhfSTY0XSA9ICJfX2ZpeHVuc3RmZGkiOworICBOYW1lc1tSVExJQjo6RlBUT1VJTlRfUFBDRjEyOF9JMTI4XSA9ICJfX2ZpeHVuc3RmdGkiOworICBOYW1lc1tSVExJQjo6U0lOVFRPRlBfSTMyX0YzMl0gPSAiX19mbG9hdHNpc2YiOworICBOYW1lc1tSVExJQjo6U0lOVFRPRlBfSTMyX0Y2NF0gPSAiX19mbG9hdHNpZGYiOworICBOYW1lc1tSVExJQjo6U0lOVFRPRlBfSTMyX0Y4MF0gPSAiX19mbG9hdHNpeGYiOworICBOYW1lc1tSVExJQjo6U0lOVFRPRlBfSTMyX1BQQ0YxMjhdID0gIl9fZmxvYXRzaXRmIjsKKyAgTmFtZXNbUlRMSUI6OlNJTlRUT0ZQX0k2NF9GMzJdID0gIl9fZmxvYXRkaXNmIjsKKyAgTmFtZXNbUlRMSUI6OlNJTlRUT0ZQX0k2NF9GNjRdID0gIl9fZmxvYXRkaWRmIjsKKyAgTmFtZXNbUlRMSUI6OlNJTlRUT0ZQX0k2NF9GODBdID0gIl9fZmxvYXRkaXhmIjsKKyAgTmFtZXNbUlRMSUI6OlNJTlRUT0ZQX0k2NF9QUENGMTI4XSA9ICJfX2Zsb2F0ZGl0ZiI7CisgIE5hbWVzW1JUTElCOjpTSU5UVE9GUF9JMTI4X0YzMl0gPSAiX19mbG9hdHRpc2YiOworICBOYW1lc1tSVExJQjo6U0lOVFRPRlBfSTEyOF9GNjRdID0gIl9fZmxvYXR0aWRmIjsKKyAgTmFtZXNbUlRMSUI6OlNJTlRUT0ZQX0kxMjhfRjgwXSA9ICJfX2Zsb2F0dGl4ZiI7CisgIE5hbWVzW1JUTElCOjpTSU5UVE9GUF9JMTI4X1BQQ0YxMjhdID0gIl9fZmxvYXR0aXRmIjsKKyAgTmFtZXNbUlRMSUI6OlVJTlRUT0ZQX0kzMl9GMzJdID0gIl9fZmxvYXR1bnNpc2YiOworICBOYW1lc1tSVExJQjo6VUlOVFRPRlBfSTMyX0Y2NF0gPSAiX19mbG9hdHVuc2lkZiI7CisgIE5hbWVzW1JUTElCOjpVSU5UVE9GUF9JMzJfRjgwXSA9ICJfX2Zsb2F0dW5zaXhmIjsKKyAgTmFtZXNbUlRMSUI6OlVJTlRUT0ZQX0kzMl9QUENGMTI4XSA9ICJfX2Zsb2F0dW5zaXRmIjsKKyAgTmFtZXNbUlRMSUI6OlVJTlRUT0ZQX0k2NF9GMzJdID0gIl9fZmxvYXR1bmRpc2YiOworICBOYW1lc1tSVExJQjo6VUlOVFRPRlBfSTY0X0Y2NF0gPSAiX19mbG9hdHVuZGlkZiI7CisgIE5hbWVzW1JUTElCOjpVSU5UVE9GUF9JNjRfRjgwXSA9ICJfX2Zsb2F0dW5kaXhmIjsKKyAgTmFtZXNbUlRMSUI6OlVJTlRUT0ZQX0k2NF9QUENGMTI4XSA9ICJfX2Zsb2F0dW5kaXRmIjsKKyAgTmFtZXNbUlRMSUI6OlVJTlRUT0ZQX0kxMjhfRjMyXSA9ICJfX2Zsb2F0dW50aXNmIjsKKyAgTmFtZXNbUlRMSUI6OlVJTlRUT0ZQX0kxMjhfRjY0XSA9ICJfX2Zsb2F0dW50aWRmIjsKKyAgTmFtZXNbUlRMSUI6OlVJTlRUT0ZQX0kxMjhfRjgwXSA9ICJfX2Zsb2F0dW50aXhmIjsKKyAgTmFtZXNbUlRMSUI6OlVJTlRUT0ZQX0kxMjhfUFBDRjEyOF0gPSAiX19mbG9hdHVudGl0ZiI7CisgIE5hbWVzW1JUTElCOjpPRVFfRjMyXSA9ICJfX2Vxc2YyIjsKKyAgTmFtZXNbUlRMSUI6Ok9FUV9GNjRdID0gIl9fZXFkZjIiOworICBOYW1lc1tSVExJQjo6VU5FX0YzMl0gPSAiX19uZXNmMiI7CisgIE5hbWVzW1JUTElCOjpVTkVfRjY0XSA9ICJfX25lZGYyIjsKKyAgTmFtZXNbUlRMSUI6Ok9HRV9GMzJdID0gIl9fZ2VzZjIiOworICBOYW1lc1tSVExJQjo6T0dFX0Y2NF0gPSAiX19nZWRmMiI7CisgIE5hbWVzW1JUTElCOjpPTFRfRjMyXSA9ICJfX2x0c2YyIjsKKyAgTmFtZXNbUlRMSUI6Ok9MVF9GNjRdID0gIl9fbHRkZjIiOworICBOYW1lc1tSVExJQjo6T0xFX0YzMl0gPSAiX19sZXNmMiI7CisgIE5hbWVzW1JUTElCOjpPTEVfRjY0XSA9ICJfX2xlZGYyIjsKKyAgTmFtZXNbUlRMSUI6Ok9HVF9GMzJdID0gIl9fZ3RzZjIiOworICBOYW1lc1tSVExJQjo6T0dUX0Y2NF0gPSAiX19ndGRmMiI7CisgIE5hbWVzW1JUTElCOjpVT19GMzJdID0gIl9fdW5vcmRzZjIiOworICBOYW1lc1tSVExJQjo6VU9fRjY0XSA9ICJfX3Vub3JkZGYyIjsKKyAgTmFtZXNbUlRMSUI6Ok9fRjMyXSA9ICJfX3Vub3Jkc2YyIjsKKyAgTmFtZXNbUlRMSUI6Ok9fRjY0XSA9ICJfX3Vub3JkZGYyIjsKKyAgTmFtZXNbUlRMSUI6Ok1FTUNQWV0gPSAibWVtY3B5IjsKKyAgTmFtZXNbUlRMSUI6Ok1FTU1PVkVdID0gIm1lbW1vdmUiOworICBOYW1lc1tSVExJQjo6TUVNU0VUXSA9ICJtZW1zZXQiOworICBOYW1lc1tSVExJQjo6VU5XSU5EX1JFU1VNRV0gPSAiX1Vud2luZF9SZXN1bWUiOworICBOYW1lc1tSVExJQjo6U1lOQ19WQUxfQ09NUEFSRV9BTkRfU1dBUF8xXSA9ICJfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXBfMSI7CisgIE5hbWVzW1JUTElCOjpTWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQXzJdID0gIl9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcF8yIjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVBfNF0gPSAiX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwXzQiOworICBOYW1lc1tSVExJQjo6U1lOQ19WQUxfQ09NUEFSRV9BTkRfU1dBUF84XSA9ICJfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXBfOCI7CisgIE5hbWVzW1JUTElCOjpTWU5DX0xPQ0tfVEVTVF9BTkRfU0VUXzFdID0gIl9fc3luY19sb2NrX3Rlc3RfYW5kX3NldF8xIjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfTE9DS19URVNUX0FORF9TRVRfMl0gPSAiX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0XzIiOworICBOYW1lc1tSVExJQjo6U1lOQ19MT0NLX1RFU1RfQU5EX1NFVF80XSA9ICJfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXRfNCI7CisgIE5hbWVzW1JUTElCOjpTWU5DX0xPQ0tfVEVTVF9BTkRfU0VUXzhdID0gIl9fc3luY19sb2NrX3Rlc3RfYW5kX3NldF84IjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FERF8xXSA9ICJfX3N5bmNfZmV0Y2hfYW5kX2FkZF8xIjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FERF8yXSA9ICJfX3N5bmNfZmV0Y2hfYW5kX2FkZF8yIjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FERF80XSA9ICJfX3N5bmNfZmV0Y2hfYW5kX2FkZF80IjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FERF84XSA9ICJfX3N5bmNfZmV0Y2hfYW5kX2FkZF84IjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX1NVQl8xXSA9ICJfX3N5bmNfZmV0Y2hfYW5kX3N1Yl8xIjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX1NVQl8yXSA9ICJfX3N5bmNfZmV0Y2hfYW5kX3N1Yl8yIjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX1NVQl80XSA9ICJfX3N5bmNfZmV0Y2hfYW5kX3N1Yl80IjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX1NVQl84XSA9ICJfX3N5bmNfZmV0Y2hfYW5kX3N1Yl84IjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FORF8xXSA9ICJfX3N5bmNfZmV0Y2hfYW5kX2FuZF8xIjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FORF8yXSA9ICJfX3N5bmNfZmV0Y2hfYW5kX2FuZF8yIjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FORF80XSA9ICJfX3N5bmNfZmV0Y2hfYW5kX2FuZF80IjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX0FORF84XSA9ICJfX3N5bmNfZmV0Y2hfYW5kX2FuZF84IjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX09SXzFdID0gIl9fc3luY19mZXRjaF9hbmRfb3JfMSI7CisgIE5hbWVzW1JUTElCOjpTWU5DX0ZFVENIX0FORF9PUl8yXSA9ICJfX3N5bmNfZmV0Y2hfYW5kX29yXzIiOworICBOYW1lc1tSVExJQjo6U1lOQ19GRVRDSF9BTkRfT1JfNF0gPSAiX19zeW5jX2ZldGNoX2FuZF9vcl80IjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX09SXzhdID0gIl9fc3luY19mZXRjaF9hbmRfb3JfOCI7CisgIE5hbWVzW1JUTElCOjpTWU5DX0ZFVENIX0FORF9YT1JfMV0gPSAiX19zeW5jX2ZldGNoX2FuZF94b3JfMSI7CisgIE5hbWVzW1JUTElCOjpTWU5DX0ZFVENIX0FORF9YT1JfMl0gPSAiX19zeW5jX2ZldGNoX2FuZF94b3JfMiI7CisgIE5hbWVzW1JUTElCOjpTWU5DX0ZFVENIX0FORF9YT1JfNF0gPSAiX19zeW5jX2ZldGNoX2FuZC14b3JfNCI7CisgIE5hbWVzW1JUTElCOjpTWU5DX0ZFVENIX0FORF9YT1JfOF0gPSAiX19zeW5jX2ZldGNoX2FuZF94b3JfOCI7CisgIE5hbWVzW1JUTElCOjpTWU5DX0ZFVENIX0FORF9OQU5EXzFdID0gIl9fc3luY19mZXRjaF9hbmRfbmFuZF8xIjsKKyAgTmFtZXNbUlRMSUI6OlNZTkNfRkVUQ0hfQU5EX05BTkRfMl0gPSAiX19zeW5jX2ZldGNoX2FuZF9uYW5kXzIiOworICBOYW1lc1tSVExJQjo6U1lOQ19GRVRDSF9BTkRfTkFORF80XSA9ICJfX3N5bmNfZmV0Y2hfYW5kX25hbmRfNCI7CisgIE5hbWVzW1JUTElCOjpTWU5DX0ZFVENIX0FORF9OQU5EXzhdID0gIl9fc3luY19mZXRjaF9hbmRfbmFuZF84IjsKK30KKworLy8vIEluaXRMaWJjYWxsQ2FsbGluZ0NvbnZzIC0gU2V0IGRlZmF1bHQgbGliY2FsbCBDYWxsaW5nQ29udnMuCisvLy8KK3N0YXRpYyB2b2lkIEluaXRMaWJjYWxsQ2FsbGluZ0NvbnZzKENhbGxpbmdDb252OjpJRCAqQ0NzKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgUlRMSUI6OlVOS05PV05fTElCQ0FMTDsgKytpKSB7CisgICAgQ0NzW2ldID0gQ2FsbGluZ0NvbnY6OkM7CisgIH0KK30KKworLy8vIGdldEZQRVhUIC0gUmV0dXJuIHRoZSBGUEVYVF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKy8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KK1JUTElCOjpMaWJjYWxsIFJUTElCOjpnZXRGUEVYVChFVlQgT3BWVCwgRVZUIFJldFZUKSB7CisgIGlmIChPcFZUID09IE1WVDo6ZjMyKSB7CisgICAgaWYgKFJldFZUID09IE1WVDo6ZjY0KQorICAgICAgcmV0dXJuIEZQRVhUX0YzMl9GNjQ7CisgIH0KKworICByZXR1cm4gVU5LTk9XTl9MSUJDQUxMOworfQorCisvLy8gZ2V0RlBST1VORCAtIFJldHVybiB0aGUgRlBST1VORF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKy8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KK1JUTElCOjpMaWJjYWxsIFJUTElCOjpnZXRGUFJPVU5EKEVWVCBPcFZULCBFVlQgUmV0VlQpIHsKKyAgaWYgKFJldFZUID09IE1WVDo6ZjMyKSB7CisgICAgaWYgKE9wVlQgPT0gTVZUOjpmNjQpCisgICAgICByZXR1cm4gRlBST1VORF9GNjRfRjMyOworICAgIGlmIChPcFZUID09IE1WVDo6ZjgwKQorICAgICAgcmV0dXJuIEZQUk9VTkRfRjgwX0YzMjsKKyAgICBpZiAoT3BWVCA9PSBNVlQ6OnBwY2YxMjgpCisgICAgICByZXR1cm4gRlBST1VORF9QUENGMTI4X0YzMjsKKyAgfSBlbHNlIGlmIChSZXRWVCA9PSBNVlQ6OmY2NCkgeworICAgIGlmIChPcFZUID09IE1WVDo6ZjgwKQorICAgICAgcmV0dXJuIEZQUk9VTkRfRjgwX0Y2NDsKKyAgICBpZiAoT3BWVCA9PSBNVlQ6OnBwY2YxMjgpCisgICAgICByZXR1cm4gRlBST1VORF9QUENGMTI4X0Y2NDsKKyAgfQorCisgIHJldHVybiBVTktOT1dOX0xJQkNBTEw7Cit9CisKKy8vLyBnZXRGUFRPU0lOVCAtIFJldHVybiB0aGUgRlBUT1NJTlRfKl8qIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdHlwZXMsIG9yCisvLy8gVU5LTk9XTl9MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCitSVExJQjo6TGliY2FsbCBSVExJQjo6Z2V0RlBUT1NJTlQoRVZUIE9wVlQsIEVWVCBSZXRWVCkgeworICBpZiAoT3BWVCA9PSBNVlQ6OmYzMikgeworICAgIGlmIChSZXRWVCA9PSBNVlQ6Omk4KQorICAgICAgcmV0dXJuIEZQVE9TSU5UX0YzMl9JODsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppMTYpCisgICAgICByZXR1cm4gRlBUT1NJTlRfRjMyX0kxNjsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppMzIpCisgICAgICByZXR1cm4gRlBUT1NJTlRfRjMyX0kzMjsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppNjQpCisgICAgICByZXR1cm4gRlBUT1NJTlRfRjMyX0k2NDsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppMTI4KQorICAgICAgcmV0dXJuIEZQVE9TSU5UX0YzMl9JMTI4OworICB9IGVsc2UgaWYgKE9wVlQgPT0gTVZUOjpmNjQpIHsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppOCkKKyAgICAgIHJldHVybiBGUFRPU0lOVF9GNjRfSTg7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTE2KQorICAgICAgcmV0dXJuIEZQVE9TSU5UX0Y2NF9JMTY7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTMyKQorICAgICAgcmV0dXJuIEZQVE9TSU5UX0Y2NF9JMzI7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTY0KQorICAgICAgcmV0dXJuIEZQVE9TSU5UX0Y2NF9JNjQ7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTEyOCkKKyAgICAgIHJldHVybiBGUFRPU0lOVF9GNjRfSTEyODsKKyAgfSBlbHNlIGlmIChPcFZUID09IE1WVDo6ZjgwKSB7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTMyKQorICAgICAgcmV0dXJuIEZQVE9TSU5UX0Y4MF9JMzI7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTY0KQorICAgICAgcmV0dXJuIEZQVE9TSU5UX0Y4MF9JNjQ7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTEyOCkKKyAgICAgIHJldHVybiBGUFRPU0lOVF9GODBfSTEyODsKKyAgfSBlbHNlIGlmIChPcFZUID09IE1WVDo6cHBjZjEyOCkgeworICAgIGlmIChSZXRWVCA9PSBNVlQ6OmkzMikKKyAgICAgIHJldHVybiBGUFRPU0lOVF9QUENGMTI4X0kzMjsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppNjQpCisgICAgICByZXR1cm4gRlBUT1NJTlRfUFBDRjEyOF9JNjQ7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTEyOCkKKyAgICAgIHJldHVybiBGUFRPU0lOVF9QUENGMTI4X0kxMjg7CisgIH0KKyAgcmV0dXJuIFVOS05PV05fTElCQ0FMTDsKK30KKworLy8vIGdldEZQVE9VSU5UIC0gUmV0dXJuIHRoZSBGUFRPVUlOVF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKy8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KK1JUTElCOjpMaWJjYWxsIFJUTElCOjpnZXRGUFRPVUlOVChFVlQgT3BWVCwgRVZUIFJldFZUKSB7CisgIGlmIChPcFZUID09IE1WVDo6ZjMyKSB7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTgpCisgICAgICByZXR1cm4gRlBUT1VJTlRfRjMyX0k4OworICAgIGlmIChSZXRWVCA9PSBNVlQ6OmkxNikKKyAgICAgIHJldHVybiBGUFRPVUlOVF9GMzJfSTE2OworICAgIGlmIChSZXRWVCA9PSBNVlQ6OmkzMikKKyAgICAgIHJldHVybiBGUFRPVUlOVF9GMzJfSTMyOworICAgIGlmIChSZXRWVCA9PSBNVlQ6Omk2NCkKKyAgICAgIHJldHVybiBGUFRPVUlOVF9GMzJfSTY0OworICAgIGlmIChSZXRWVCA9PSBNVlQ6OmkxMjgpCisgICAgICByZXR1cm4gRlBUT1VJTlRfRjMyX0kxMjg7CisgIH0gZWxzZSBpZiAoT3BWVCA9PSBNVlQ6OmY2NCkgeworICAgIGlmIChSZXRWVCA9PSBNVlQ6Omk4KQorICAgICAgcmV0dXJuIEZQVE9VSU5UX0Y2NF9JODsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppMTYpCisgICAgICByZXR1cm4gRlBUT1VJTlRfRjY0X0kxNjsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppMzIpCisgICAgICByZXR1cm4gRlBUT1VJTlRfRjY0X0kzMjsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppNjQpCisgICAgICByZXR1cm4gRlBUT1VJTlRfRjY0X0k2NDsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppMTI4KQorICAgICAgcmV0dXJuIEZQVE9VSU5UX0Y2NF9JMTI4OworICB9IGVsc2UgaWYgKE9wVlQgPT0gTVZUOjpmODApIHsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppMzIpCisgICAgICByZXR1cm4gRlBUT1VJTlRfRjgwX0kzMjsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppNjQpCisgICAgICByZXR1cm4gRlBUT1VJTlRfRjgwX0k2NDsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppMTI4KQorICAgICAgcmV0dXJuIEZQVE9VSU5UX0Y4MF9JMTI4OworICB9IGVsc2UgaWYgKE9wVlQgPT0gTVZUOjpwcGNmMTI4KSB7CisgICAgaWYgKFJldFZUID09IE1WVDo6aTMyKQorICAgICAgcmV0dXJuIEZQVE9VSU5UX1BQQ0YxMjhfSTMyOworICAgIGlmIChSZXRWVCA9PSBNVlQ6Omk2NCkKKyAgICAgIHJldHVybiBGUFRPVUlOVF9QUENGMTI4X0k2NDsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjppMTI4KQorICAgICAgcmV0dXJuIEZQVE9VSU5UX1BQQ0YxMjhfSTEyODsKKyAgfQorICByZXR1cm4gVU5LTk9XTl9MSUJDQUxMOworfQorCisvLy8gZ2V0U0lOVFRPRlAgLSBSZXR1cm4gdGhlIFNJTlRUT0ZQXypfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGVzLCBvcgorLy8vIFVOS05PV05fTElCQ0FMTCBpZiB0aGVyZSBpcyBub25lLgorUlRMSUI6OkxpYmNhbGwgUlRMSUI6OmdldFNJTlRUT0ZQKEVWVCBPcFZULCBFVlQgUmV0VlQpIHsKKyAgaWYgKE9wVlQgPT0gTVZUOjppMzIpIHsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjpmMzIpCisgICAgICByZXR1cm4gU0lOVFRPRlBfSTMyX0YzMjsKKyAgICBlbHNlIGlmIChSZXRWVCA9PSBNVlQ6OmY2NCkKKyAgICAgIHJldHVybiBTSU5UVE9GUF9JMzJfRjY0OworICAgIGVsc2UgaWYgKFJldFZUID09IE1WVDo6ZjgwKQorICAgICAgcmV0dXJuIFNJTlRUT0ZQX0kzMl9GODA7CisgICAgZWxzZSBpZiAoUmV0VlQgPT0gTVZUOjpwcGNmMTI4KQorICAgICAgcmV0dXJuIFNJTlRUT0ZQX0kzMl9QUENGMTI4OworICB9IGVsc2UgaWYgKE9wVlQgPT0gTVZUOjppNjQpIHsKKyAgICBpZiAoUmV0VlQgPT0gTVZUOjpmMzIpCisgICAgICByZXR1cm4gU0lOVFRPRlBfSTY0X0YzMjsKKyAgICBlbHNlIGlmIChSZXRWVCA9PSBNVlQ6OmY2NCkKKyAgICAgIHJldHVybiBTSU5UVE9GUF9JNjRfRjY0OworICAgIGVsc2UgaWYgKFJldFZUID09IE1WVDo6ZjgwKQorICAgICAgcmV0dXJuIFNJTlRUT0ZQX0k2NF9GODA7CisgICAgZWxzZSBpZiAoUmV0VlQgPT0gTVZUOjpwcGNmMTI4KQorICAgICAgcmV0dXJuIFNJTlRUT0ZQX0k2NF9QUENGMTI4OworICB9IGVsc2UgaWYgKE9wVlQgPT0gTVZUOjppMTI4KSB7CisgICAgaWYgKFJldFZUID09IE1WVDo6ZjMyKQorICAgICAgcmV0dXJuIFNJTlRUT0ZQX0kxMjhfRjMyOworICAgIGVsc2UgaWYgKFJldFZUID09IE1WVDo6ZjY0KQorICAgICAgcmV0dXJuIFNJTlRUT0ZQX0kxMjhfRjY0OworICAgIGVsc2UgaWYgKFJldFZUID09IE1WVDo6ZjgwKQorICAgICAgcmV0dXJuIFNJTlRUT0ZQX0kxMjhfRjgwOworICAgIGVsc2UgaWYgKFJldFZUID09IE1WVDo6cHBjZjEyOCkKKyAgICAgIHJldHVybiBTSU5UVE9GUF9JMTI4X1BQQ0YxMjg7CisgIH0KKyAgcmV0dXJuIFVOS05PV05fTElCQ0FMTDsKK30KKworLy8vIGdldFVJTlRUT0ZQIC0gUmV0dXJuIHRoZSBVSU5UVE9GUF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKy8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KK1JUTElCOjpMaWJjYWxsIFJUTElCOjpnZXRVSU5UVE9GUChFVlQgT3BWVCwgRVZUIFJldFZUKSB7CisgIGlmIChPcFZUID09IE1WVDo6aTMyKSB7CisgICAgaWYgKFJldFZUID09IE1WVDo6ZjMyKQorICAgICAgcmV0dXJuIFVJTlRUT0ZQX0kzMl9GMzI7CisgICAgZWxzZSBpZiAoUmV0VlQgPT0gTVZUOjpmNjQpCisgICAgICByZXR1cm4gVUlOVFRPRlBfSTMyX0Y2NDsKKyAgICBlbHNlIGlmIChSZXRWVCA9PSBNVlQ6OmY4MCkKKyAgICAgIHJldHVybiBVSU5UVE9GUF9JMzJfRjgwOworICAgIGVsc2UgaWYgKFJldFZUID09IE1WVDo6cHBjZjEyOCkKKyAgICAgIHJldHVybiBVSU5UVE9GUF9JMzJfUFBDRjEyODsKKyAgfSBlbHNlIGlmIChPcFZUID09IE1WVDo6aTY0KSB7CisgICAgaWYgKFJldFZUID09IE1WVDo6ZjMyKQorICAgICAgcmV0dXJuIFVJTlRUT0ZQX0k2NF9GMzI7CisgICAgZWxzZSBpZiAoUmV0VlQgPT0gTVZUOjpmNjQpCisgICAgICByZXR1cm4gVUlOVFRPRlBfSTY0X0Y2NDsKKyAgICBlbHNlIGlmIChSZXRWVCA9PSBNVlQ6OmY4MCkKKyAgICAgIHJldHVybiBVSU5UVE9GUF9JNjRfRjgwOworICAgIGVsc2UgaWYgKFJldFZUID09IE1WVDo6cHBjZjEyOCkKKyAgICAgIHJldHVybiBVSU5UVE9GUF9JNjRfUFBDRjEyODsKKyAgfSBlbHNlIGlmIChPcFZUID09IE1WVDo6aTEyOCkgeworICAgIGlmIChSZXRWVCA9PSBNVlQ6OmYzMikKKyAgICAgIHJldHVybiBVSU5UVE9GUF9JMTI4X0YzMjsKKyAgICBlbHNlIGlmIChSZXRWVCA9PSBNVlQ6OmY2NCkKKyAgICAgIHJldHVybiBVSU5UVE9GUF9JMTI4X0Y2NDsKKyAgICBlbHNlIGlmIChSZXRWVCA9PSBNVlQ6OmY4MCkKKyAgICAgIHJldHVybiBVSU5UVE9GUF9JMTI4X0Y4MDsKKyAgICBlbHNlIGlmIChSZXRWVCA9PSBNVlQ6OnBwY2YxMjgpCisgICAgICByZXR1cm4gVUlOVFRPRlBfSTEyOF9QUENGMTI4OworICB9CisgIHJldHVybiBVTktOT1dOX0xJQkNBTEw7Cit9CisKKy8vLyBJbml0Q21wTGliY2FsbENDcyAtIFNldCBkZWZhdWx0IGNvbXBhcmlzb24gbGliY2FsbCBDQy4KKy8vLworc3RhdGljIHZvaWQgSW5pdENtcExpYmNhbGxDQ3MoSVNEOjpDb25kQ29kZSAqQ0NzKSB7CisgIG1lbXNldChDQ3MsIElTRDo6U0VUQ0NfSU5WQUxJRCwgc2l6ZW9mKElTRDo6Q29uZENvZGUpKlJUTElCOjpVTktOT1dOX0xJQkNBTEwpOworICBDQ3NbUlRMSUI6Ok9FUV9GMzJdID0gSVNEOjpTRVRFUTsKKyAgQ0NzW1JUTElCOjpPRVFfRjY0XSA9IElTRDo6U0VURVE7CisgIENDc1tSVExJQjo6VU5FX0YzMl0gPSBJU0Q6OlNFVE5FOworICBDQ3NbUlRMSUI6OlVORV9GNjRdID0gSVNEOjpTRVRORTsKKyAgQ0NzW1JUTElCOjpPR0VfRjMyXSA9IElTRDo6U0VUR0U7CisgIENDc1tSVExJQjo6T0dFX0Y2NF0gPSBJU0Q6OlNFVEdFOworICBDQ3NbUlRMSUI6Ok9MVF9GMzJdID0gSVNEOjpTRVRMVDsKKyAgQ0NzW1JUTElCOjpPTFRfRjY0XSA9IElTRDo6U0VUTFQ7CisgIENDc1tSVExJQjo6T0xFX0YzMl0gPSBJU0Q6OlNFVExFOworICBDQ3NbUlRMSUI6Ok9MRV9GNjRdID0gSVNEOjpTRVRMRTsKKyAgQ0NzW1JUTElCOjpPR1RfRjMyXSA9IElTRDo6U0VUR1Q7CisgIENDc1tSVExJQjo6T0dUX0Y2NF0gPSBJU0Q6OlNFVEdUOworICBDQ3NbUlRMSUI6OlVPX0YzMl0gPSBJU0Q6OlNFVE5FOworICBDQ3NbUlRMSUI6OlVPX0Y2NF0gPSBJU0Q6OlNFVE5FOworICBDQ3NbUlRMSUI6Ok9fRjMyXSA9IElTRDo6U0VURVE7CisgIENDc1tSVExJQjo6T19GNjRdID0gSVNEOjpTRVRFUTsKK30KKworLy8vIE5PVEU6IFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBvd25lcnNoaXAgb2YgVExPRi4KK1RhcmdldExvd2VyaW5nOjpUYXJnZXRMb3dlcmluZyhjb25zdCBUYXJnZXRNYWNoaW5lICZ0bSkKKyAgOiBUTSh0bSksIFREKFRNLmdldFRhcmdldERhdGEoKSkgeworICAvLyBBbGwgb3BlcmF0aW9ucyBkZWZhdWx0IHRvIGJlaW5nIHN1cHBvcnRlZC4KKyAgbWVtc2V0KE9wQWN0aW9ucywgMCwgc2l6ZW9mKE9wQWN0aW9ucykpOworICBtZW1zZXQoTG9hZEV4dEFjdGlvbnMsIDAsIHNpemVvZihMb2FkRXh0QWN0aW9ucykpOworICBtZW1zZXQoVHJ1bmNTdG9yZUFjdGlvbnMsIDAsIHNpemVvZihUcnVuY1N0b3JlQWN0aW9ucykpOworICBtZW1zZXQoSW5kZXhlZE1vZGVBY3Rpb25zLCAwLCBzaXplb2YoSW5kZXhlZE1vZGVBY3Rpb25zKSk7CisgIG1lbXNldChDb25kQ29kZUFjdGlvbnMsIDAsIHNpemVvZihDb25kQ29kZUFjdGlvbnMpKTsKKworICAvLyBTZXQgZGVmYXVsdCBhY3Rpb25zIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMuCisgIGZvciAodW5zaWduZWQgVlQgPSAwOyBWVCAhPSAodW5zaWduZWQpTVZUOjpMQVNUX1ZBTFVFVFlQRTsgKytWVCkgeworICAgIC8vIERlZmF1bHQgYWxsIGluZGV4ZWQgbG9hZCAvIHN0b3JlIHRvIGV4cGFuZC4KKyAgICBmb3IgKHVuc2lnbmVkIElNID0gKHVuc2lnbmVkKUlTRDo6UFJFX0lOQzsKKyAgICAgICAgIElNICE9ICh1bnNpZ25lZClJU0Q6OkxBU1RfSU5ERVhFRF9NT0RFOyArK0lNKSB7CisgICAgICBzZXRJbmRleGVkTG9hZEFjdGlvbihJTSwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgICAgc2V0SW5kZXhlZFN0b3JlQWN0aW9uKElNLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgfQorICAgIAorICAgIC8vIFRoZXNlIG9wZXJhdGlvbnMgZGVmYXVsdCB0byBleHBhbmQuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkdFVFNJR04sIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDT05DQVRfVkVDVE9SUywgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICB9CisKKyAgLy8gTW9zdCB0YXJnZXRzIGlnbm9yZSB0aGUgQGxsdm0ucHJlZmV0Y2ggaW50cmluc2ljLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpQUkVGRVRDSCwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgCisgIC8vIENvbnN0YW50RlAgbm9kZXMgZGVmYXVsdCB0byBleHBhbmQuICBUYXJnZXRzIGNhbiBlaXRoZXIgY2hhbmdlIHRoaXMgdG8gCisgIC8vIExlZ2FsLCBpbiB3aGljaCBjYXNlIGFsbCBmcCBjb25zdGFudHMgYXJlIGxlZ2FsLCBvciB1c2UgaXNGUEltbUxlZ2FsKCkKKyAgLy8gdG8gb3B0aW1pemUgZXhwYW5zaW9ucyBmb3IgY2VydGFpbiBjb25zdGFudHMuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50RlAsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDb25zdGFudEZQLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q29uc3RhbnRGUCwgTVZUOjpmODAsIEV4cGFuZCk7CisKKyAgLy8gVGhlc2UgbGlicmFyeSBmdW5jdGlvbnMgZGVmYXVsdCB0byBleHBhbmQuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZMT0cgLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxPRzIsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTE9HMTAsTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZFWFAgLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkVYUDIsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTE9HICwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZMT0cyLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxPRzEwLE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGRVhQICwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZFWFAyLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICAvLyBEZWZhdWx0IElTRDo6VFJBUCB0byBleHBhbmQgKHdoaWNoIHR1cm5zIGl0IGludG8gYWJvcnQpLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpUUkFQLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICAgIAorICBJc0xpdHRsZUVuZGlhbiA9IFRELT5pc0xpdHRsZUVuZGlhbigpOworICBTaGlmdEFtb3VudFR5ID0gUG9pbnRlclR5ID0gTVZUOjpnZXRJbnRlZ2VyVlQoOCpURC0+Z2V0UG9pbnRlclNpemUoKSk7CisgIG1lbXNldChSZWdDbGFzc0ZvclZULCAwLE1WVDo6TEFTVF9WQUxVRVRZUEUqc2l6ZW9mKFRhcmdldFJlZ2lzdGVyQ2xhc3MqKSk7CisgIG1lbXNldChUYXJnZXREQUdDb21iaW5lQXJyYXksIDAsIGFycmF5X2xlbmd0aG9mKFRhcmdldERBR0NvbWJpbmVBcnJheSkpOworICBtYXhTdG9yZXNQZXJNZW1zZXQgPSBtYXhTdG9yZXNQZXJNZW1jcHkgPSBtYXhTdG9yZXNQZXJNZW1tb3ZlID0gODsKKyAgYmVuZWZpdEZyb21Db2RlUGxhY2VtZW50T3B0ID0gZmFsc2U7CisgIFVzZVVuZGVyc2NvcmVTZXRKbXAgPSBmYWxzZTsKKyAgVXNlVW5kZXJzY29yZUxvbmdKbXAgPSBmYWxzZTsKKyAgU2VsZWN0SXNFeHBlbnNpdmUgPSBmYWxzZTsKKyAgSW50RGl2SXNDaGVhcCA9IGZhbHNlOworICBQb3cyRGl2SXNDaGVhcCA9IGZhbHNlOworICBTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUgPSAwOworICBCb29sZWFuQ29udGVudHMgPSBVbmRlZmluZWRCb29sZWFuQ29udGVudDsKKyAgU2NoZWRQcmVmZXJlbmNlSW5mbyA9IFNjaGVkOjpMYXRlbmN5OworICBKdW1wQnVmU2l6ZSA9IDA7CisgIEp1bXBCdWZBbGlnbm1lbnQgPSAwOworICBQcmVmTG9vcEFsaWdubWVudCA9IDA7CisgIE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQgPSAxOworICBTaG91bGRGb2xkQXRvbWljRmVuY2VzID0gZmFsc2U7CisKKyAgSW5pdExpYmNhbGxOYW1lcyhMaWJjYWxsUm91dGluZU5hbWVzKTsKKyAgSW5pdENtcExpYmNhbGxDQ3MoQ21wTGliY2FsbENDcyk7CisgIEluaXRMaWJjYWxsQ2FsbGluZ0NvbnZzKExpYmNhbGxDYWxsaW5nQ29udnMpOworfQorCitUYXJnZXRMb3dlcmluZzo6flRhcmdldExvd2VyaW5nKCkgeworfQorCisvLy8gY2FuT3BUcmFwIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBvcGVyYXRpb24gY2FuIHRyYXAgZm9yIHRoZSB2YWx1ZSB0eXBlLgorLy8vIFZUIG11c3QgYmUgYSBsZWdhbCB0eXBlLgorYm9vbCBUYXJnZXRMb3dlcmluZzo6Y2FuT3BUcmFwKHVuc2lnbmVkIE9wLCBFVlQgVlQpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzVHlwZUxlZ2FsKFZUKSk7CisgIHN3aXRjaCAoT3ApIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgSVNEOjpGRElWOgorICBjYXNlIElTRDo6RlJFTToKKyAgY2FzZSBJU0Q6OlNESVY6CisgIGNhc2UgSVNEOjpVRElWOgorICBjYXNlIElTRDo6U1JFTToKKyAgY2FzZSBJU0Q6OlVSRU06CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworCitzdGF0aWMgdW5zaWduZWQgZ2V0VmVjdG9yVHlwZUJyZWFrZG93bk1WVChNVlQgVlQsIE1WVCAmSW50ZXJtZWRpYXRlVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtSW50ZXJtZWRpYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCAmUmVnaXN0ZXJWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldExvd2VyaW5nICpUTEkpIHsKKyAgLy8gRmlndXJlIG91dCB0aGUgcmlnaHQsIGxlZ2FsIGRlc3RpbmF0aW9uIHJlZyB0byBjb3B5IGludG8uCisgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBNVlQgRWx0VHkgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAKKyAgdW5zaWduZWQgTnVtVmVjdG9yUmVncyA9IDE7CisgIAorICAvLyBGSVhNRTogV2UgZG9uJ3Qgc3VwcG9ydCBub24tcG93ZXItb2YtMi1zaXplZCB2ZWN0b3JzIGZvciBub3cuICBJZGVhbGx5IHdlIAorICAvLyBjb3VsZCBicmVhayBkb3duIGludG8gTEhTL1JIUyBsaWtlIExlZ2FsaXplREFHIGRvZXMuCisgIGlmICghaXNQb3dlck9mMl8zMihOdW1FbHRzKSkgeworICAgIE51bVZlY3RvclJlZ3MgPSBOdW1FbHRzOworICAgIE51bUVsdHMgPSAxOworICB9CisgIAorICAvLyBEaXZpZGUgdGhlIGlucHV0IHVudGlsIHdlIGdldCB0byBhIHN1cHBvcnRlZCBzaXplLiAgVGhpcyB3aWxsIGFsd2F5cworICAvLyBlbmQgd2l0aCBhIHNjYWxhciBpZiB0aGUgdGFyZ2V0IGRvZXNuJ3Qgc3VwcG9ydCB2ZWN0b3JzLgorICB3aGlsZSAoTnVtRWx0cyA+IDEgJiYgIVRMSS0+aXNUeXBlTGVnYWwoTVZUOjpnZXRWZWN0b3JWVChFbHRUeSwgTnVtRWx0cykpKSB7CisgICAgTnVtRWx0cyA+Pj0gMTsKKyAgICBOdW1WZWN0b3JSZWdzIDw8PSAxOworICB9CisKKyAgTnVtSW50ZXJtZWRpYXRlcyA9IE51bVZlY3RvclJlZ3M7CisgIAorICBNVlQgTmV3VlQgPSBNVlQ6OmdldFZlY3RvclZUKEVsdFR5LCBOdW1FbHRzKTsKKyAgaWYgKCFUTEktPmlzVHlwZUxlZ2FsKE5ld1ZUKSkKKyAgICBOZXdWVCA9IEVsdFR5OworICBJbnRlcm1lZGlhdGVWVCA9IE5ld1ZUOworCisgIEVWVCBEZXN0VlQgPSBUTEktPmdldFJlZ2lzdGVyVHlwZShOZXdWVCk7CisgIFJlZ2lzdGVyVlQgPSBEZXN0VlQ7CisgIGlmIChFVlQoRGVzdFZUKS5iaXRzTFQoTmV3VlQpKSAgICAvLyBWYWx1ZSBpcyBleHBhbmRlZCwgZS5nLiBpNjQgLT4gaTE2LgorICAgIHJldHVybiBOdW1WZWN0b3JSZWdzKihOZXdWVC5nZXRTaXplSW5CaXRzKCkvRGVzdFZULmdldFNpemVJbkJpdHMoKSk7CisgIAorICAvLyBPdGhlcndpc2UsIHByb21vdGlvbiBvciBsZWdhbCB0eXBlcyB1c2UgdGhlIHNhbWUgbnVtYmVyIG9mIHJlZ2lzdGVycyBhcworICAvLyB0aGUgdmVjdG9yIGRlY2ltYXRlZCB0byB0aGUgYXBwcm9wcmlhdGUgbGV2ZWwuCisgIHJldHVybiBOdW1WZWN0b3JSZWdzOworfQorCisvLy8gaXNMZWdhbFJDIC0gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHR5cGVzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IHRoZQorLy8vIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcyBhcmUgYWxsIGxlZ2FsLgorYm9vbCBUYXJnZXRMb3dlcmluZzo6aXNMZWdhbFJDKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJDbGFzczo6dnRfaXRlcmF0b3IgSSA9IFJDLT52dF9iZWdpbigpLCBFID0gUkMtPnZ0X2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKGlzVHlwZUxlZ2FsKCpJKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGhhc0xlZ2FsU3VwZXJSZWdSZWdDbGFzc2VzIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcworLy8vIGhhcyBvbmUgb3IgbW9yZSBzdXBlci1yZWcgcmVnaXN0ZXIgY2xhc3NlcyB0aGF0IGFyZSBsZWdhbC4KK2Jvb2wKK1RhcmdldExvd2VyaW5nOjpoYXNMZWdhbFN1cGVyUmVnUmVnQ2xhc3Nlcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3R7CisgIGlmICgqUkMtPnN1cGVycmVnY2xhc3Nlc19iZWdpbigpID09IDApCisgICAgcmV0dXJuIGZhbHNlOworICBmb3IgKFRhcmdldFJlZ2lzdGVySW5mbzo6cmVnY2xhc3NfaXRlcmF0b3IgSSA9IFJDLT5zdXBlcnJlZ2NsYXNzZXNfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBSQy0+c3VwZXJyZWdjbGFzc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJSQyA9ICpJOworICAgIGlmIChpc0xlZ2FsUkMoUlJDKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGZpbmRSZXByZXNlbnRhdGl2ZUNsYXNzIC0gUmV0dXJuIHRoZSBsYXJnZXN0IGxlZ2FsIHN1cGVyLXJlZyByZWdpc3RlciBjbGFzcworLy8vIG9mIHRoZSByZWdpc3RlciBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBpdHMgYXNzb2NpYXRlZCAiY29zdCIuCitzdGQ6OnBhaXI8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyosIHVpbnQ4X3Q+CitUYXJnZXRMb3dlcmluZzo6ZmluZFJlcHJlc2VudGF0aXZlQ2xhc3MoRVZUIFZUKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gUmVnQ2xhc3NGb3JWVFtWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5XTsKKyAgaWYgKCFSQykKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoUkMsIDApOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpCZXN0UkMgPSBSQzsKKyAgZm9yIChUYXJnZXRSZWdpc3RlckluZm86OnJlZ2NsYXNzX2l0ZXJhdG9yIEkgPSBSQy0+c3VwZXJyZWdjbGFzc2VzX2JlZ2luKCksCisgICAgICAgICBFID0gUkMtPnN1cGVycmVnY2xhc3Nlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSUkMgPSAqSTsKKyAgICBpZiAoUlJDLT5pc0FTdWJDbGFzcygpIHx8ICFpc0xlZ2FsUkMoUlJDKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghaGFzTGVnYWxTdXBlclJlZ1JlZ0NsYXNzZXMoUlJDKSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihSUkMsIDEpOworICAgIEJlc3RSQyA9IFJSQzsKKyAgfQorICByZXR1cm4gc3RkOjptYWtlX3BhaXIoQmVzdFJDLCAxKTsKK30KKworLy8vIGNvbXB1dGVSZWdpc3RlclByb3BlcnRpZXMgLSBPbmNlIGFsbCBvZiB0aGUgcmVnaXN0ZXIgY2xhc3NlcyBhcmUgYWRkZWQsCisvLy8gdGhpcyBhbGxvd3MgdXMgdG8gY29tcHV0ZSBkZXJpdmVkIHByb3BlcnRpZXMgd2UgZXhwb3NlLgordm9pZCBUYXJnZXRMb3dlcmluZzo6Y29tcHV0ZVJlZ2lzdGVyUHJvcGVydGllcygpIHsKKyAgYXNzZXJ0KE1WVDo6TEFTVF9WQUxVRVRZUEUgPD0gTVZUOjpNQVhfQUxMT1dFRF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICJUb28gbWFueSB2YWx1ZSB0eXBlcyBmb3IgVmFsdWVUeXBlQWN0aW9ucyB0byBob2xkISIpOworCisgIC8vIEV2ZXJ5dGhpbmcgZGVmYXVsdHMgdG8gbmVlZGluZyBvbmUgcmVnaXN0ZXIuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTVZUOjpMQVNUX1ZBTFVFVFlQRTsgKytpKSB7CisgICAgTnVtUmVnaXN0ZXJzRm9yVlRbaV0gPSAxOworICAgIFJlZ2lzdGVyVHlwZUZvclZUW2ldID0gVHJhbnNmb3JtVG9UeXBlW2ldID0gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKWk7CisgIH0KKyAgLy8gLi4uZXhjZXB0IGlzVm9pZCwgd2hpY2ggZG9lc24ndCBuZWVkIGFueSByZWdpc3RlcnMuCisgIE51bVJlZ2lzdGVyc0ZvclZUW01WVDo6aXNWb2lkXSA9IDA7CisKKyAgLy8gRmluZCB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHJlZ2lzdGVyIGNsYXNzLgorICB1bnNpZ25lZCBMYXJnZXN0SW50UmVnID0gTVZUOjpMQVNUX0lOVEVHRVJfVkFMVUVUWVBFOworICBmb3IgKDsgUmVnQ2xhc3NGb3JWVFtMYXJnZXN0SW50UmVnXSA9PSAwOyAtLUxhcmdlc3RJbnRSZWcpCisgICAgYXNzZXJ0KExhcmdlc3RJbnRSZWcgIT0gTVZUOjppMSAmJiAiTm8gaW50ZWdlciByZWdpc3RlcnMgZGVmaW5lZCEiKTsKKworICAvLyBFdmVyeSBpbnRlZ2VyIHZhbHVlIHR5cGUgbGFyZ2VyIHRoYW4gdGhpcyBsYXJnZXN0IHJlZ2lzdGVyIHRha2VzIHR3aWNlIGFzCisgIC8vIG1hbnkgcmVnaXN0ZXJzIHRvIHJlcHJlc2VudCBhcyB0aGUgcHJldmlvdXMgVmFsdWVUeXBlLgorICBmb3IgKHVuc2lnbmVkIEV4cGFuZGVkUmVnID0gTGFyZ2VzdEludFJlZyArIDE7IDsgKytFeHBhbmRlZFJlZykgeworICAgIEVWVCBFeHBhbmRlZFZUID0gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKUV4cGFuZGVkUmVnOworICAgIGlmICghRXhwYW5kZWRWVC5pc0ludGVnZXIoKSkKKyAgICAgIGJyZWFrOworICAgIE51bVJlZ2lzdGVyc0ZvclZUW0V4cGFuZGVkUmVnXSA9IDIqTnVtUmVnaXN0ZXJzRm9yVlRbRXhwYW5kZWRSZWctMV07CisgICAgUmVnaXN0ZXJUeXBlRm9yVlRbRXhwYW5kZWRSZWddID0gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKUxhcmdlc3RJbnRSZWc7CisgICAgVHJhbnNmb3JtVG9UeXBlW0V4cGFuZGVkUmVnXSA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoRXhwYW5kZWRSZWcgLSAxKTsKKyAgICBWYWx1ZVR5cGVBY3Rpb25zLnNldFR5cGVBY3Rpb24oRXhwYW5kZWRWVCwgRXhwYW5kKTsKKyAgfQorCisgIC8vIEluc3BlY3QgYWxsIG9mIHRoZSBWYWx1ZVR5cGUncyBzbWFsbGVyIHRoYW4gdGhlIGxhcmdlc3QgaW50ZWdlcgorICAvLyByZWdpc3RlciB0byBzZWUgd2hpY2ggb25lcyBuZWVkIHByb21vdGlvbi4KKyAgdW5zaWduZWQgTGVnYWxJbnRSZWcgPSBMYXJnZXN0SW50UmVnOworICBmb3IgKHVuc2lnbmVkIEludFJlZyA9IExhcmdlc3RJbnRSZWcgLSAxOworICAgICAgIEludFJlZyA+PSAodW5zaWduZWQpTVZUOjppMTsgLS1JbnRSZWcpIHsKKyAgICBFVlQgSVZUID0gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKUludFJlZzsKKyAgICBpZiAoaXNUeXBlTGVnYWwoSVZUKSkgeworICAgICAgTGVnYWxJbnRSZWcgPSBJbnRSZWc7CisgICAgfSBlbHNlIHsKKyAgICAgIFJlZ2lzdGVyVHlwZUZvclZUW0ludFJlZ10gPSBUcmFuc2Zvcm1Ub1R5cGVbSW50UmVnXSA9CisgICAgICAgIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlMZWdhbEludFJlZzsKKyAgICAgIFZhbHVlVHlwZUFjdGlvbnMuc2V0VHlwZUFjdGlvbihJVlQsIFByb21vdGUpOworICAgIH0KKyAgfQorCisgIC8vIHBwY2YxMjggdHlwZSBpcyByZWFsbHkgdHdvIGY2NCdzLgorICBpZiAoIWlzVHlwZUxlZ2FsKE1WVDo6cHBjZjEyOCkpIHsKKyAgICBOdW1SZWdpc3RlcnNGb3JWVFtNVlQ6OnBwY2YxMjhdID0gMipOdW1SZWdpc3RlcnNGb3JWVFtNVlQ6OmY2NF07CisgICAgUmVnaXN0ZXJUeXBlRm9yVlRbTVZUOjpwcGNmMTI4XSA9IE1WVDo6ZjY0OworICAgIFRyYW5zZm9ybVRvVHlwZVtNVlQ6OnBwY2YxMjhdID0gTVZUOjpmNjQ7CisgICAgVmFsdWVUeXBlQWN0aW9ucy5zZXRUeXBlQWN0aW9uKE1WVDo6cHBjZjEyOCwgRXhwYW5kKTsKKyAgfSAgICAKKworICAvLyBEZWNpZGUgaG93IHRvIGhhbmRsZSBmNjQuIElmIHRoZSB0YXJnZXQgZG9lcyBub3QgaGF2ZSBuYXRpdmUgZjY0IHN1cHBvcnQsCisgIC8vIGV4cGFuZCBpdCB0byBpNjQgYW5kIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBzb2Z0IGZsb2F0IGxpYnJhcnkgY2FsbHMuCisgIGlmICghaXNUeXBlTGVnYWwoTVZUOjpmNjQpKSB7CisgICAgTnVtUmVnaXN0ZXJzRm9yVlRbTVZUOjpmNjRdID0gTnVtUmVnaXN0ZXJzRm9yVlRbTVZUOjppNjRdOworICAgIFJlZ2lzdGVyVHlwZUZvclZUW01WVDo6ZjY0XSA9IFJlZ2lzdGVyVHlwZUZvclZUW01WVDo6aTY0XTsKKyAgICBUcmFuc2Zvcm1Ub1R5cGVbTVZUOjpmNjRdID0gTVZUOjppNjQ7CisgICAgVmFsdWVUeXBlQWN0aW9ucy5zZXRUeXBlQWN0aW9uKE1WVDo6ZjY0LCBFeHBhbmQpOworICB9CisKKyAgLy8gRGVjaWRlIGhvdyB0byBoYW5kbGUgZjMyLiBJZiB0aGUgdGFyZ2V0IGRvZXMgbm90IGhhdmUgbmF0aXZlIHN1cHBvcnQgZm9yCisgIC8vIGYzMiwgcHJvbW90ZSBpdCB0byBmNjQgaWYgaXQgaXMgbGVnYWwuIE90aGVyd2lzZSwgZXhwYW5kIGl0IHRvIGkzMi4KKyAgaWYgKCFpc1R5cGVMZWdhbChNVlQ6OmYzMikpIHsKKyAgICBpZiAoaXNUeXBlTGVnYWwoTVZUOjpmNjQpKSB7CisgICAgICBOdW1SZWdpc3RlcnNGb3JWVFtNVlQ6OmYzMl0gPSBOdW1SZWdpc3RlcnNGb3JWVFtNVlQ6OmY2NF07CisgICAgICBSZWdpc3RlclR5cGVGb3JWVFtNVlQ6OmYzMl0gPSBSZWdpc3RlclR5cGVGb3JWVFtNVlQ6OmY2NF07CisgICAgICBUcmFuc2Zvcm1Ub1R5cGVbTVZUOjpmMzJdID0gTVZUOjpmNjQ7CisgICAgICBWYWx1ZVR5cGVBY3Rpb25zLnNldFR5cGVBY3Rpb24oTVZUOjpmMzIsIFByb21vdGUpOworICAgIH0gZWxzZSB7CisgICAgICBOdW1SZWdpc3RlcnNGb3JWVFtNVlQ6OmYzMl0gPSBOdW1SZWdpc3RlcnNGb3JWVFtNVlQ6OmkzMl07CisgICAgICBSZWdpc3RlclR5cGVGb3JWVFtNVlQ6OmYzMl0gPSBSZWdpc3RlclR5cGVGb3JWVFtNVlQ6OmkzMl07CisgICAgICBUcmFuc2Zvcm1Ub1R5cGVbTVZUOjpmMzJdID0gTVZUOjppMzI7CisgICAgICBWYWx1ZVR5cGVBY3Rpb25zLnNldFR5cGVBY3Rpb24oTVZUOjpmMzIsIEV4cGFuZCk7CisgICAgfQorICB9CisgIAorICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSB2ZWN0b3IgdmFsdWUgdHlwZXMgdG8gc2VlIHdoaWNoIG5lZWQgdHJhbnNmb3JtYXRpb25zLgorICBmb3IgKHVuc2lnbmVkIGkgPSBNVlQ6OkZJUlNUX1ZFQ1RPUl9WQUxVRVRZUEU7CisgICAgICAgaSA8PSAodW5zaWduZWQpTVZUOjpMQVNUX1ZFQ1RPUl9WQUxVRVRZUEU7ICsraSkgeworICAgIE1WVCBWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlpOworICAgIGlmIChpc1R5cGVMZWdhbChWVCkpIGNvbnRpbnVlOworICAgIAorICAgIE1WVCBJbnRlcm1lZGlhdGVWVDsKKyAgICBFVlQgUmVnaXN0ZXJWVDsKKyAgICB1bnNpZ25lZCBOdW1JbnRlcm1lZGlhdGVzOworICAgIE51bVJlZ2lzdGVyc0ZvclZUW2ldID0KKyAgICAgIGdldFZlY3RvclR5cGVCcmVha2Rvd25NVlQoVlQsIEludGVybWVkaWF0ZVZULCBOdW1JbnRlcm1lZGlhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlclZULCB0aGlzKTsKKyAgICBSZWdpc3RlclR5cGVGb3JWVFtpXSA9IFJlZ2lzdGVyVlQ7CisgICAgCisgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgbGVnYWwgd2lkZXIgdHlwZS4KKyAgICBib29sIElzTGVnYWxXaWRlclR5cGUgPSBmYWxzZTsKKyAgICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgIHVuc2lnbmVkIE5FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIG5WVCA9IGkrMTsgblZUIDw9IE1WVDo6TEFTVF9WRUNUT1JfVkFMVUVUWVBFOyArK25WVCkgeworICAgICAgRVZUIFNWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSluVlQ7CisgICAgICBpZiAoaXNUeXBlU3ludGhlc2l6YWJsZShTVlQpICYmIFNWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpID09IEVsdFZUICYmCisgICAgICAgICAgU1ZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPiBORWx0cyAmJiBORWx0cyAhPSAxKSB7CisgICAgICAgIFRyYW5zZm9ybVRvVHlwZVtpXSA9IFNWVDsKKyAgICAgICAgVmFsdWVUeXBlQWN0aW9ucy5zZXRUeXBlQWN0aW9uKFZULCBQcm9tb3RlKTsKKyAgICAgICAgSXNMZWdhbFdpZGVyVHlwZSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIUlzTGVnYWxXaWRlclR5cGUpIHsKKyAgICAgIEVWVCBOVlQgPSBWVC5nZXRQb3cyVmVjdG9yVHlwZSgpOworICAgICAgaWYgKE5WVCA9PSBWVCkgeworICAgICAgICAvLyBUeXBlIGlzIGFscmVhZHkgYSBwb3dlciBvZiAyLiAgVGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIHNwbGl0LgorICAgICAgICBUcmFuc2Zvcm1Ub1R5cGVbaV0gPSBNVlQ6Ok90aGVyOworICAgICAgICBWYWx1ZVR5cGVBY3Rpb25zLnNldFR5cGVBY3Rpb24oVlQsIEV4cGFuZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBUcmFuc2Zvcm1Ub1R5cGVbaV0gPSBOVlQ7CisgICAgICAgIFZhbHVlVHlwZUFjdGlvbnMuc2V0VHlwZUFjdGlvbihWVCwgUHJvbW90ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSAncmVwcmVzZW50YXRpdmUnIHJlZ2lzdGVyIGNsYXNzIGZvciBlYWNoIHZhbHVlIHR5cGUuCisgIC8vIEFuIHJlcHJlc2VudGF0aXZlIHJlZ2lzdGVyIGNsYXNzIGlzIHRoZSBsYXJnZXN0IChtZWFuaW5nIG9uZSB3aGljaCBpcworICAvLyBub3QgYSBzdWItcmVnaXN0ZXIgY2xhc3MgLyBzdWJyZWcgcmVnaXN0ZXIgY2xhc3MpIGxlZ2FsIHJlZ2lzdGVyIGNsYXNzIGZvcgorICAvLyBhIGdyb3VwIG9mIHZhbHVlIHR5cGVzLiBGb3IgZXhhbXBsZSwgb24gaTM4NiwgaTgsIGkxNiwgYW5kIGkzMgorICAvLyByZXByZXNlbnRhdGl2ZSB3b3VsZCBiZSBHUjMyOyB3aGlsZSBvbiB4ODZfNjQgaXQncyBHUjY0LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE1WVDo6TEFTVF9WQUxVRVRZUEU7ICsraSkgeworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIFJSQzsKKyAgICB1aW50OF90IENvc3Q7CisgICAgdGllKFJSQywgQ29zdCkgPSAgZmluZFJlcHJlc2VudGF0aXZlQ2xhc3MoKE1WVDo6U2ltcGxlVmFsdWVUeXBlKWkpOworICAgIFJlcFJlZ0NsYXNzRm9yVlRbaV0gPSBSUkM7CisgICAgUmVwUmVnQ2xhc3NDb3N0Rm9yVlRbaV0gPSBDb3N0OworICB9Cit9CisKK2NvbnN0IGNoYXIgKlRhcmdldExvd2VyaW5nOjpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0IHsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVGFyZ2V0TG93ZXJpbmc6OmdldFNldENDUmVzdWx0VHlwZShFVlQgVlQpIGNvbnN0IHsKKyAgcmV0dXJuIFBvaW50ZXJUeS5TaW1wbGVUeTsKK30KKworTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVGFyZ2V0TG93ZXJpbmc6OmdldENtcExpYmNhbGxSZXR1cm5UeXBlKCkgY29uc3QgeworICByZXR1cm4gTVZUOjppMzI7IC8vIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZQorfQorCisvLy8gZ2V0VmVjdG9yVHlwZUJyZWFrZG93biAtIFZlY3RvciB0eXBlcyBhcmUgYnJva2VuIGRvd24gaW50byBzb21lIG51bWJlciBvZgorLy8vIGxlZ2FsIGZpcnN0IGNsYXNzIHR5cGVzLiAgRm9yIGV4YW1wbGUsIE1WVDo6djhmMzIgbWFwcyB0byAyIE1WVDo6djRmMzIKKy8vLyB3aXRoIEFsdGl2ZWMgb3IgU1NFMSwgb3IgOCBwcm9tb3RlZCBNVlQ6OmY2NCB2YWx1ZXMgd2l0aCB0aGUgWDg2IEZQIHN0YWNrLgorLy8vIFNpbWlsYXJseSwgTVZUOjp2Mmk2NCB0dXJucyBpbnRvIDQgTVZUOjppMzIgdmFsdWVzIHdpdGggYm90aCBQUEMgYW5kIFg4Ni4KKy8vLworLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiByZWdpc3RlcnMgbmVlZGVkLCBhbmQgdGhlIFZUIGZvciBlYWNoCisvLy8gcmVnaXN0ZXIuICBJdCBhbHNvIHJldHVybnMgdGhlIFZUIGFuZCBxdWFudGl0eSBvZiB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworLy8vIGJlZm9yZSB0aGV5IGFyZSBwcm9tb3RlZC9leHBhbmRlZC4KKy8vLwordW5zaWduZWQgVGFyZ2V0TG93ZXJpbmc6OmdldFZlY3RvclR5cGVCcmVha2Rvd24oTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCAmSW50ZXJtZWRpYXRlVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtSW50ZXJtZWRpYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCAmUmVnaXN0ZXJWVCkgY29uc3QgeworICAvLyBGaWd1cmUgb3V0IHRoZSByaWdodCwgbGVnYWwgZGVzdGluYXRpb24gcmVnIHRvIGNvcHkgaW50by4KKyAgdW5zaWduZWQgTnVtRWx0cyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIEVWVCBFbHRUeSA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIAorICB1bnNpZ25lZCBOdW1WZWN0b3JSZWdzID0gMTsKKyAgCisgIC8vIEZJWE1FOiBXZSBkb24ndCBzdXBwb3J0IG5vbi1wb3dlci1vZi0yLXNpemVkIHZlY3RvcnMgZm9yIG5vdy4gIElkZWFsbHkgd2UgCisgIC8vIGNvdWxkIGJyZWFrIGRvd24gaW50byBMSFMvUkhTIGxpa2UgTGVnYWxpemVEQUcgZG9lcy4KKyAgaWYgKCFpc1Bvd2VyT2YyXzMyKE51bUVsdHMpKSB7CisgICAgTnVtVmVjdG9yUmVncyA9IE51bUVsdHM7CisgICAgTnVtRWx0cyA9IDE7CisgIH0KKyAgCisgIC8vIERpdmlkZSB0aGUgaW5wdXQgdW50aWwgd2UgZ2V0IHRvIGEgc3VwcG9ydGVkIHNpemUuICBUaGlzIHdpbGwgYWx3YXlzCisgIC8vIGVuZCB3aXRoIGEgc2NhbGFyIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBzdXBwb3J0IHZlY3RvcnMuCisgIHdoaWxlIChOdW1FbHRzID4gMSAmJiAhaXNUeXBlTGVnYWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVDo6Z2V0VmVjdG9yVlQoQ29udGV4dCwgRWx0VHksIE51bUVsdHMpKSkgeworICAgIE51bUVsdHMgPj49IDE7CisgICAgTnVtVmVjdG9yUmVncyA8PD0gMTsKKyAgfQorCisgIE51bUludGVybWVkaWF0ZXMgPSBOdW1WZWN0b3JSZWdzOworICAKKyAgRVZUIE5ld1ZUID0gRVZUOjpnZXRWZWN0b3JWVChDb250ZXh0LCBFbHRUeSwgTnVtRWx0cyk7CisgIGlmICghaXNUeXBlTGVnYWwoTmV3VlQpKQorICAgIE5ld1ZUID0gRWx0VHk7CisgIEludGVybWVkaWF0ZVZUID0gTmV3VlQ7CisKKyAgRVZUIERlc3RWVCA9IGdldFJlZ2lzdGVyVHlwZShDb250ZXh0LCBOZXdWVCk7CisgIFJlZ2lzdGVyVlQgPSBEZXN0VlQ7CisgIGlmIChEZXN0VlQuYml0c0xUKE5ld1ZUKSkgeworICAgIC8vIFZhbHVlIGlzIGV4cGFuZGVkLCBlLmcuIGk2NCAtPiBpMTYuCisgICAgcmV0dXJuIE51bVZlY3RvclJlZ3MqKE5ld1ZULmdldFNpemVJbkJpdHMoKS9EZXN0VlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPdGhlcndpc2UsIHByb21vdGlvbiBvciBsZWdhbCB0eXBlcyB1c2UgdGhlIHNhbWUgbnVtYmVyIG9mIHJlZ2lzdGVycyBhcworICAgIC8vIHRoZSB2ZWN0b3IgZGVjaW1hdGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsZXZlbC4KKyAgICByZXR1cm4gTnVtVmVjdG9yUmVnczsKKyAgfQorICAKKyAgcmV0dXJuIDE7Cit9CisKKy8vLyBHZXQgdGhlIEVWVHMgYW5kIEFyZ0ZsYWdzIGNvbGxlY3Rpb25zIHRoYXQgcmVwcmVzZW50IHRoZSBsZWdhbGl6ZWQgcmV0dXJuIAorLy8vIHR5cGUgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiAgVGhpcyBkb2VzIG5vdCByZXF1aXJlIGEgREFHIG9yIGEgcmV0dXJuIHZhbHVlLAorLy8vIGFuZCBpcyBzdWl0YWJsZSBmb3IgdXNlIGJlZm9yZSBhbnkgREFHcyBmb3IgdGhlIGZ1bmN0aW9uIGFyZSBjb25zdHJ1Y3RlZC4KKy8vLyBUT0RPOiBNb3ZlIHRoaXMgb3V0IG9mIFRhcmdldExvd2VyaW5nLmNwcC4KK3ZvaWQgbGx2bTo6R2V0UmV0dXJuSW5mbyhjb25zdCBUeXBlKiBSZXR1cm5UeXBlLCBBdHRyaWJ1dGVzIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1aW50NjRfdD4gKk9mZnNldHMpIHsKKyAgU21hbGxWZWN0b3I8RVZULCA0PiBWYWx1ZVZUczsKKyAgQ29tcHV0ZVZhbHVlVlRzKFRMSSwgUmV0dXJuVHlwZSwgVmFsdWVWVHMpOworICB1bnNpZ25lZCBOdW1WYWx1ZXMgPSBWYWx1ZVZUcy5zaXplKCk7CisgIGlmIChOdW1WYWx1ZXMgPT0gMCkgcmV0dXJuOworICB1bnNpZ25lZCBPZmZzZXQgPSAwOworCisgIGZvciAodW5zaWduZWQgaiA9IDAsIGYgPSBOdW1WYWx1ZXM7IGogIT0gZjsgKytqKSB7CisgICAgRVZUIFZUID0gVmFsdWVWVHNbal07CisgICAgSVNEOjpOb2RlVHlwZSBFeHRlbmRLaW5kID0gSVNEOjpBTllfRVhURU5EOworCisgICAgaWYgKGF0dHIgJiBBdHRyaWJ1dGU6OlNFeHQpCisgICAgICBFeHRlbmRLaW5kID0gSVNEOjpTSUdOX0VYVEVORDsKKyAgICBlbHNlIGlmIChhdHRyICYgQXR0cmlidXRlOjpaRXh0KQorICAgICAgRXh0ZW5kS2luZCA9IElTRDo6WkVST19FWFRFTkQ7CisKKyAgICAvLyBGSVhNRTogQyBjYWxsaW5nIGNvbnZlbnRpb24gcmVxdWlyZXMgdGhlIHJldHVybiB0eXBlIHRvIGJlIHByb21vdGVkIHRvCisgICAgLy8gYXQgbGVhc3QgMzItYml0LiBCdXQgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGZvciBub24tQyBjYWxsaW5nCisgICAgLy8gY29udmVudGlvbnMuIFRoZSBmcm9udGVuZCBzaG91bGQgbWFyayBmdW5jdGlvbnMgd2hvc2UgcmV0dXJuIHZhbHVlcworICAgIC8vIHJlcXVpcmUgcHJvbW90aW5nIHdpdGggc2lnbmV4dCBvciB6ZXJvZXh0IGF0dHJpYnV0ZXMuCisgICAgaWYgKEV4dGVuZEtpbmQgIT0gSVNEOjpBTllfRVhURU5EICYmIFZULmlzSW50ZWdlcigpKSB7CisgICAgICBFVlQgTWluVlQgPSBUTEkuZ2V0UmVnaXN0ZXJUeXBlKFJldHVyblR5cGUtPmdldENvbnRleHQoKSwgTVZUOjppMzIpOworICAgICAgaWYgKFZULmJpdHNMVChNaW5WVCkpCisgICAgICAgIFZUID0gTWluVlQ7CisgICAgfQorCisgICAgdW5zaWduZWQgTnVtUGFydHMgPSBUTEkuZ2V0TnVtUmVnaXN0ZXJzKFJldHVyblR5cGUtPmdldENvbnRleHQoKSwgVlQpOworICAgIEVWVCBQYXJ0VlQgPSBUTEkuZ2V0UmVnaXN0ZXJUeXBlKFJldHVyblR5cGUtPmdldENvbnRleHQoKSwgVlQpOworICAgIHVuc2lnbmVkIFBhcnRTaXplID0gVExJLmdldFRhcmdldERhdGEoKS0+Z2V0VHlwZUFsbG9jU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRWVC5nZXRUeXBlRm9yRVZUKFJldHVyblR5cGUtPmdldENvbnRleHQoKSkpOworCisgICAgLy8gJ2lucmVnJyBvbiBmdW5jdGlvbiByZWZlcnMgdG8gcmV0dXJuIHZhbHVlCisgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzID0gSVNEOjpBcmdGbGFnc1R5KCk7CisgICAgaWYgKGF0dHIgJiBBdHRyaWJ1dGU6OkluUmVnKQorICAgICAgRmxhZ3Muc2V0SW5SZWcoKTsKKworICAgIC8vIFByb3BhZ2F0ZSBleHRlbnNpb24gdHlwZSBpZiBhbnkKKyAgICBpZiAoYXR0ciAmIEF0dHJpYnV0ZTo6U0V4dCkKKyAgICAgIEZsYWdzLnNldFNFeHQoKTsKKyAgICBlbHNlIGlmIChhdHRyICYgQXR0cmlidXRlOjpaRXh0KQorICAgICAgRmxhZ3Muc2V0WkV4dCgpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bVBhcnRzOyArK2kpIHsKKyAgICAgIE91dHMucHVzaF9iYWNrKElTRDo6T3V0cHV0QXJnKEZsYWdzLCBQYXJ0VlQsIC8qaXNGaXhlZD0qL3RydWUpKTsKKyAgICAgIGlmIChPZmZzZXRzKSB7CisgICAgICAgIE9mZnNldHMtPnB1c2hfYmFjayhPZmZzZXQpOworICAgICAgICBPZmZzZXQgKz0gUGFydFNpemU7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLyBnZXRCeVZhbFR5cGVBbGlnbm1lbnQgLSBSZXR1cm4gdGhlIGRlc2lyZWQgYWxpZ25tZW50IGZvciBCeVZhbCBhZ2dyZWdhdGUKKy8vLyBmdW5jdGlvbiBhcmd1bWVudHMgaW4gdGhlIGNhbGxlciBwYXJhbWV0ZXIgYXJlYS4gIFRoaXMgaXMgdGhlIGFjdHVhbAorLy8vIGFsaWdubWVudCwgbm90IGl0cyBsb2dhcml0aG0uCit1bnNpZ25lZCBUYXJnZXRMb3dlcmluZzo6Z2V0QnlWYWxUeXBlQWxpZ25tZW50KGNvbnN0IFR5cGUgKlR5KSBjb25zdCB7CisgIHJldHVybiBURC0+Z2V0Q2FsbEZyYW1lVHlwZUFsaWdubWVudChUeSk7Cit9CisKKy8vLyBnZXRKdW1wVGFibGVFbmNvZGluZyAtIFJldHVybiB0aGUgZW50cnkgZW5jb2RpbmcgZm9yIGEganVtcCB0YWJsZSBpbiB0aGUKKy8vLyBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIHJldHVybmVkIHZhbHVlIGlzIGEgbWVtYmVyIG9mIHRoZQorLy8vIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpKVEVudHJ5S2luZCBlbnVtLgordW5zaWduZWQgVGFyZ2V0TG93ZXJpbmc6OmdldEp1bXBUYWJsZUVuY29kaW5nKCkgY29uc3QgeworICAvLyBJbiBub24tcGljIG1vZGVzLCBqdXN0IHVzZSB0aGUgYWRkcmVzcyBvZiBhIGJsb2NrLgorICBpZiAoZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFJlbG9jYXRpb25Nb2RlbCgpICE9IFJlbG9jOjpQSUNfKQorICAgIHJldHVybiBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfQmxvY2tBZGRyZXNzOworICAKKyAgLy8gSW4gUElDIG1vZGUsIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgYSBHUFJlbDMyIGRpcmVjdGl2ZSwgdXNlIGl0LgorICBpZiAoZ2V0VGFyZ2V0TWFjaGluZSgpLmdldE1DQXNtSW5mbygpLT5nZXRHUFJlbDMyRGlyZWN0aXZlKCkgIT0gMCkKKyAgICByZXR1cm4gTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0dQUmVsMzJCbG9ja0FkZHJlc3M7CisgIAorICAvLyBPdGhlcndpc2UsIHVzZSBhIGxhYmVsIGRpZmZlcmVuY2UuCisgIHJldHVybiBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfTGFiZWxEaWZmZXJlbmNlMzI7Cit9CisKK1NEVmFsdWUgVGFyZ2V0TG93ZXJpbmc6OmdldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZShTRFZhbHVlIFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIElmIG91ciBQSUMgbW9kZWwgaXMgR1AgcmVsYXRpdmUsIHVzZSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBhcyB0aGUgYmFzZS4KKyAgaWYgKGdldEp1bXBUYWJsZUVuY29kaW5nKCkgPT0gTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0dQUmVsMzJCbG9ja0FkZHJlc3MpCisgICAgcmV0dXJuIERBRy5nZXRHTE9CQUxfT0ZGU0VUX1RBQkxFKGdldFBvaW50ZXJUeSgpKTsKKyAgcmV0dXJuIFRhYmxlOworfQorCisvLy8gZ2V0UElDSnVtcFRhYmxlUmVsb2NCYXNlRXhwciAtIFRoaXMgcmV0dXJucyB0aGUgcmVsb2NhdGlvbiBiYXNlIGZvciB0aGUKKy8vLyBnaXZlbiBQSUMganVtcHRhYmxlLCB0aGUgc2FtZSBhcyBnZXRQSUNKdW1wVGFibGVSZWxvY0Jhc2UsIGJ1dCBhcyBhbgorLy8vIE1DRXhwci4KK2NvbnN0IE1DRXhwciAqCitUYXJnZXRMb3dlcmluZzo6Z2V0UElDSnVtcFRhYmxlUmVsb2NCYXNlRXhwcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSlRJLE1DQ29udGV4dCAmQ3R4KSBjb25zdHsKKyAgLy8gVGhlIG5vcm1hbCBQSUMgcmVsb2MgYmFzZSBpcyB0aGUgbGFiZWwgYXQgdGhlIHN0YXJ0IG9mIHRoZSBqdW1wIHRhYmxlLgorICByZXR1cm4gTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoTUYtPmdldEpUSVN5bWJvbChKVEksIEN0eCksIEN0eCk7Cit9CisKK2Jvb2wKK1RhcmdldExvd2VyaW5nOjppc09mZnNldEZvbGRpbmdMZWdhbChjb25zdCBHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSkgY29uc3QgeworICAvLyBBc3N1bWUgdGhhdCBldmVyeXRoaW5nIGlzIHNhZmUgaW4gc3RhdGljIG1vZGUuCisgIGlmIChnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlN0YXRpYykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBJbiBkeW5hbWljLW5vLXBpYyBtb2RlLCBhc3N1bWUgdGhhdCBrbm93biBkZWZpbmVkIHZhbHVlcyBhcmUgc2FmZS4KKyAgaWYgKGdldFRhcmdldE1hY2hpbmUoKS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6RHluYW1pY05vUElDICYmCisgICAgICBHQSAmJgorICAgICAgIUdBLT5nZXRHbG9iYWwoKS0+aXNEZWNsYXJhdGlvbigpICYmCisgICAgICAhR0EtPmdldEdsb2JhbCgpLT5pc1dlYWtGb3JMaW5rZXIoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBPdGhlcndpc2UgYXNzdW1lIG5vdGhpbmcgaXMgc2FmZS4KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIE9wdGltaXphdGlvbiBNZXRob2RzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gU2hyaW5rRGVtYW5kZWRDb25zdGFudCAtIENoZWNrIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgb2YgdGhlIAorLy8vIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBpcyBhIGNvbnN0YW50IGludGVnZXIuICBJZiBzbywgY2hlY2sgdG8gc2VlIGlmIHRoZXJlCisvLy8gYXJlIGFueSBiaXRzIHNldCBpbiB0aGUgY29uc3RhbnQgdGhhdCBhcmUgbm90IGRlbWFuZGVkLiAgSWYgc28sIHNocmluayB0aGUKKy8vLyBjb25zdGFudCBhbmQgcmV0dXJuIHRydWUuCitib29sIFRhcmdldExvd2VyaW5nOjpUYXJnZXRMb3dlcmluZ09wdDo6U2hyaW5rRGVtYW5kZWRDb25zdGFudChTRFZhbHVlIE9wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJkRlbWFuZGVkKSB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBGSVhNRTogSVNEOjpTRUxFQ1QsIElTRDo6U0VMRUNUX0NDCisgIHN3aXRjaCAoT3AuZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpYT1I6CisgIGNhc2UgSVNEOjpBTkQ6CisgIGNhc2UgSVNEOjpPUjogeworICAgIENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpOworICAgIGlmICghQykgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKE9wLmdldE9wY29kZSgpID09IElTRDo6WE9SICYmCisgICAgICAgIChDLT5nZXRBUEludFZhbHVlKCkgfCAofkRlbWFuZGVkKSkuaXNBbGxPbmVzVmFsdWUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIGlmIHdlIGNhbiBleHBhbmQgaXQgdG8gaGF2ZSBhbGwgYml0cyBzZXQsIGRvIGl0CisgICAgaWYgKEMtPmdldEFQSW50VmFsdWUoKS5pbnRlcnNlY3RzKH5EZW1hbmRlZCkpIHsKKyAgICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICAgICAgU0RWYWx1ZSBOZXcgPSBEQUcuZ2V0Tm9kZShPcC5nZXRPcGNvZGUoKSwgZGwsIFZULCBPcC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoRGVtYW5kZWQgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQy0+Z2V0QVBJbnRWYWx1ZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZUKSk7CisgICAgICByZXR1cm4gQ29tYmluZVRvKE9wLCBOZXcpOworICAgIH0KKworICAgIGJyZWFrOworICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBTaHJpbmtEZW1hbmRlZE9wIC0gQ29udmVydCB4K3kgdG8gKFZUKSgoU21hbGxWVCl4KyhTbWFsbFZUKXkpIGlmIHRoZQorLy8vIGNhc3RzIGFyZSBmcmVlLiAgVGhpcyB1c2VzIGlzWkV4dEZyZWUgYW5kIFpFUk9fRVhURU5EIGZvciB0aGUgd2lkZW5pbmcKKy8vLyBjYXN0LCBidXQgaXQgY291bGQgYmUgZ2VuZXJhbGl6ZWQgZm9yIHRhcmdldHMgd2l0aCBvdGhlciB0eXBlcyBvZgorLy8vIGltcGxpY2l0IHdpZGVuaW5nIGNhc3RzLgorYm9vbAorVGFyZ2V0TG93ZXJpbmc6OlRhcmdldExvd2VyaW5nT3B0OjpTaHJpbmtEZW1hbmRlZE9wKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJkRlbWFuZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIGFzc2VydChPcC5nZXROdW1PcGVyYW5kcygpID09IDIgJiYKKyAgICAgICAgICJTaHJpbmtEZW1hbmRlZE9wIG9ubHkgc3VwcG9ydHMgYmluYXJ5IG9wZXJhdG9ycyEiKTsKKyAgYXNzZXJ0KE9wLmdldE5vZGUoKS0+Z2V0TnVtVmFsdWVzKCkgPT0gMSAmJgorICAgICAgICAgIlNocmlua0RlbWFuZGVkT3Agb25seSBzdXBwb3J0cyBub2RlcyB3aXRoIG9uZSByZXN1bHQhIik7CisKKyAgLy8gRG9uJ3QgZG8gdGhpcyBpZiB0aGUgbm9kZSBoYXMgYW5vdGhlciB1c2VyLCB3aGljaCBtYXkgcmVxdWlyZSB0aGUKKyAgLy8gZnVsbCB2YWx1ZS4KKyAgaWYgKCFPcC5nZXROb2RlKCktPmhhc09uZVVzZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBTZWFyY2ggZm9yIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgd2l0aCBmcmVlIGNhc3RzIHRvIGFuZCBmcm9tCisgIC8vIE9wJ3MgdHlwZS4gRm9yIGV4cGVkaWVuY2UsIGp1c3QgY2hlY2sgcG93ZXItb2YtMiBpbnRlZ2VyIHR5cGVzLgorICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpOworICB1bnNpZ25lZCBTbWFsbFZUQml0cyA9IEJpdFdpZHRoIC0gRGVtYW5kZWQuY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgaWYgKCFpc1Bvd2VyT2YyXzMyKFNtYWxsVlRCaXRzKSkKKyAgICBTbWFsbFZUQml0cyA9IE5leHRQb3dlck9mMihTbWFsbFZUQml0cyk7CisgIGZvciAoOyBTbWFsbFZUQml0cyA8IEJpdFdpZHRoOyBTbWFsbFZUQml0cyA9IE5leHRQb3dlck9mMihTbWFsbFZUQml0cykpIHsKKyAgICBFVlQgU21hbGxWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKCpEQUcuZ2V0Q29udGV4dCgpLCBTbWFsbFZUQml0cyk7CisgICAgaWYgKFRMSS5pc1RydW5jYXRlRnJlZShPcC5nZXRWYWx1ZVR5cGUoKSwgU21hbGxWVCkgJiYKKyAgICAgICAgVExJLmlzWkV4dEZyZWUoU21hbGxWVCwgT3AuZ2V0VmFsdWVUeXBlKCkpKSB7CisgICAgICAvLyBXZSBmb3VuZCBhIHR5cGUgd2l0aCBmcmVlIGNhc3RzLgorICAgICAgU0RWYWx1ZSBYID0gREFHLmdldE5vZGUoT3AuZ2V0T3Bjb2RlKCksIGRsLCBTbWFsbFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFNtYWxsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFNtYWxsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXROb2RlKCktPmdldE9wZXJhbmQoMSkpKTsKKyAgICAgIFNEVmFsdWUgWiA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwgWCk7CisgICAgICByZXR1cm4gQ29tYmluZVRvKE9wLCBaKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gU2ltcGxpZnlEZW1hbmRlZEJpdHMgLSBMb29rIGF0IE9wLiAgQXQgdGhpcyBwb2ludCwgd2Uga25vdyB0aGF0IG9ubHkgdGhlCisvLy8gRGVtYW5kZWRNYXNrIGJpdHMgb2YgdGhlIHJlc3VsdCBvZiBPcCBhcmUgZXZlciB1c2VkIGRvd25zdHJlYW0uICBJZiB3ZSBjYW4KKy8vLyB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBzaW1wbGlmeSBPcCwgY3JlYXRlIGEgbmV3IHNpbXBsaWZpZWQgREFHIG5vZGUgYW5kCisvLy8gcmV0dXJuIHRydWUsIHJldHVybmluZyB0aGUgb3JpZ2luYWwgYW5kIG5ldyBub2RlcyBpbiBPbGQgYW5kIE5ldy4gT3RoZXJ3aXNlLAorLy8vIGFuYWx5emUgdGhlIGV4cHJlc3Npb24gYW5kIHJldHVybiBhIG1hc2sgb2YgS25vd25PbmUgYW5kIEtub3duWmVybyBiaXRzIGZvcgorLy8vIHRoZSBleHByZXNzaW9uICh1c2VkIHRvIHNpbXBsaWZ5IHRoZSBjYWxsZXIpLiAgVGhlIEtub3duWmVyby9PbmUgYml0cyBtYXkKKy8vLyBvbmx5IGJlIGFjY3VyYXRlIGZvciB0aG9zZSBiaXRzIGluIHRoZSBEZW1hbmRlZE1hc2suCitib29sIFRhcmdldExvd2VyaW5nOjpTaW1wbGlmeURlbWFuZGVkQml0cyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJkRlbWFuZGVkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZ09wdCAmVExPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGgpIGNvbnN0IHsKKyAgdW5zaWduZWQgQml0V2lkdGggPSBEZW1hbmRlZE1hc2suZ2V0Qml0V2lkdGgoKTsKKyAgYXNzZXJ0KE9wLmdldFZhbHVlVHlwZSgpLmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCkgPT0gQml0V2lkdGggJiYKKyAgICAgICAgICJNYXNrIHNpemUgbWlzbWF0Y2hlcyB2YWx1ZSB0eXBlIHNpemUhIik7CisgIEFQSW50IE5ld01hc2sgPSBEZW1hbmRlZE1hc2s7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBEb24ndCBrbm93IGFueXRoaW5nLgorICBLbm93blplcm8gPSBLbm93bk9uZSA9IEFQSW50KEJpdFdpZHRoLCAwKTsKKworICAvLyBPdGhlciB1c2VycyBtYXkgdXNlIHRoZXNlIGJpdHMuCisgIGlmICghT3AuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkgeyAKKyAgICBpZiAoRGVwdGggIT0gMCkgeworICAgICAgLy8gSWYgbm90IGF0IHRoZSByb290LCBKdXN0IGNvbXB1dGUgdGhlIEtub3duWmVyby9Lbm93bk9uZSBiaXRzIHRvIAorICAgICAgLy8gc2ltcGxpZnkgdGhpbmdzIGRvd25zdHJlYW0uCisgICAgICBUTE8uREFHLkNvbXB1dGVNYXNrZWRCaXRzKE9wLCBEZW1hbmRlZE1hc2ssIEtub3duWmVybywgS25vd25PbmUsIERlcHRoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBiZWluZyBzaW1wbGlmaWVkLCBhbGxvdyBpdCB0byBoYXZlIG11bHRpcGxlIHVzZXMsCisgICAgLy8ganVzdCBzZXQgdGhlIE5ld01hc2sgdG8gYWxsIGJpdHMuCisgICAgTmV3TWFzayA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpOworICB9IGVsc2UgaWYgKERlbWFuZGVkTWFzayA9PSAwKSB7ICAgCisgICAgLy8gTm90IGRlbWFuZGluZyBhbnkgYml0cyBmcm9tIE9wLgorICAgIGlmIChPcC5nZXRPcGNvZGUoKSAhPSBJU0Q6OlVOREVGKQorICAgICAgcmV0dXJuIFRMTy5Db21iaW5lVG8oT3AsIFRMTy5EQUcuZ2V0VU5ERUYoT3AuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAoRGVwdGggPT0gNikgeyAgICAgICAgLy8gTGltaXQgc2VhcmNoIGRlcHRoLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEFQSW50IEtub3duWmVybzIsIEtub3duT25lMiwgS25vd25aZXJvT3V0LCBLbm93bk9uZU91dDsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBjYXNlIElTRDo6Q29uc3RhbnQ6CisgICAgLy8gV2Uga25vdyBhbGwgb2YgdGhlIGJpdHMgZm9yIGEgY29uc3RhbnQhCisgICAgS25vd25PbmUgPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcCktPmdldEFQSW50VmFsdWUoKSAmIE5ld01hc2s7CisgICAgS25vd25aZXJvID0gfktub3duT25lICYgTmV3TWFzazsKKyAgICByZXR1cm4gZmFsc2U7ICAgLy8gRG9uJ3QgZmFsbCB0aHJvdWdoLCB3aWxsIGluZmluaXRlbHkgbG9vcC4KKyAgY2FzZSBJU0Q6OkFORDoKKyAgICAvLyBJZiB0aGUgUkhTIGlzIGEgY29uc3RhbnQsIGNoZWNrIHRvIHNlZSBpZiB0aGUgTEhTIHdvdWxkIGJlIHplcm8gd2l0aG91dAorICAgIC8vIHVzaW5nIHRoZSBiaXRzIGZyb20gdGhlIFJIUy4gIEJlbG93LCB3ZSB1c2Uga25vd2xlZGdlIGFib3V0IHRoZSBSSFMgdG8KKyAgICAvLyBzaW1wbGlmeSB0aGUgTEhTLCBoZXJlIHdlJ3JlIHVzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIExIUyB0byBzaW1wbGlmeQorICAgIC8vIHRoZSBSSFMuCisgICAgaWYgKENvbnN0YW50U0ROb2RlICpSSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBBUEludCBMSFNaZXJvLCBMSFNPbmU7CisgICAgICBUTE8uREFHLkNvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMCksIE5ld01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIU1plcm8sIExIU09uZSwgRGVwdGgrMSk7CisgICAgICAvLyBJZiB0aGUgTEhTIGFscmVhZHkgaGFzIHplcm9zIHdoZXJlIFJIU0MgZG9lcywgdGhpcyBhbmQgaXMgZGVhZC4KKyAgICAgIGlmICgoTEhTWmVybyAmIE5ld01hc2spID09ICh+UkhTQy0+Z2V0QVBJbnRWYWx1ZSgpICYgTmV3TWFzaykpCisgICAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLCBPcC5nZXRPcGVyYW5kKDApKTsKKyAgICAgIC8vIElmIGFueSBvZiB0aGUgc2V0IGJpdHMgaW4gdGhlIFJIUyBhcmUga25vd24gemVybyBvbiB0aGUgTEhTLCBzaHJpbmsKKyAgICAgIC8vIHRoZSBjb25zdGFudC4KKyAgICAgIGlmIChUTE8uU2hyaW5rRGVtYW5kZWRDb25zdGFudChPcCwgfkxIU1plcm8gJiBOZXdNYXNrKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhPcC5nZXRPcGVyYW5kKDEpLCBOZXdNYXNrLCBLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duT25lLCBUTE8sIERlcHRoKzEpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhPcC5nZXRPcGVyYW5kKDApLCB+S25vd25aZXJvICYgTmV3TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvMiwgS25vd25PbmUyLCBUTE8sIERlcHRoKzEpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYXNzZXJ0KChLbm93blplcm8yICYgS25vd25PbmUyKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgICAKKyAgICAvLyBJZiBhbGwgb2YgdGhlIGRlbWFuZGVkIGJpdHMgYXJlIGtub3duIG9uZSBvbiBvbmUgc2lkZSwgcmV0dXJuIHRoZSBvdGhlci4KKyAgICAvLyBUaGVzZSBiaXRzIGNhbm5vdCBjb250cmlidXRlIHRvIHRoZSByZXN1bHQgb2YgdGhlICdhbmQnLgorICAgIGlmICgoTmV3TWFzayAmIH5Lbm93blplcm8yICYgS25vd25PbmUpID09ICh+S25vd25aZXJvMiAmIE5ld01hc2spKQorICAgICAgcmV0dXJuIFRMTy5Db21iaW5lVG8oT3AsIE9wLmdldE9wZXJhbmQoMCkpOworICAgIGlmICgoTmV3TWFzayAmIH5Lbm93blplcm8gJiBLbm93bk9uZTIpID09ICh+S25vd25aZXJvICYgTmV3TWFzaykpCisgICAgICByZXR1cm4gVExPLkNvbWJpbmVUbyhPcCwgT3AuZ2V0T3BlcmFuZCgxKSk7CisgICAgLy8gSWYgYWxsIG9mIHRoZSBkZW1hbmRlZCBiaXRzIGluIHRoZSBpbnB1dHMgYXJlIGtub3duIHplcm9zLCByZXR1cm4gemVyby4KKyAgICBpZiAoKE5ld01hc2sgJiAoS25vd25aZXJvfEtub3duWmVybzIpKSA9PSBOZXdNYXNrKQorICAgICAgcmV0dXJuIFRMTy5Db21iaW5lVG8oT3AsIFRMTy5EQUcuZ2V0Q29uc3RhbnQoMCwgT3AuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgICAvLyBJZiB0aGUgUkhTIGlzIGEgY29uc3RhbnQsIHNlZSBpZiB3ZSBjYW4gc2ltcGxpZnkgaXQuCisgICAgaWYgKFRMTy5TaHJpbmtEZW1hbmRlZENvbnN0YW50KE9wLCB+S25vd25aZXJvMiAmIE5ld01hc2spKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gSWYgdGhlIG9wZXJhdGlvbiBjYW4gYmUgZG9uZSBpbiBhIHNtYWxsZXIgdHlwZSwgZG8gc28uCisgICAgaWYgKFRMTy5TaHJpbmtEZW1hbmRlZE9wKE9wLCBCaXRXaWR0aCwgTmV3TWFzaywgZGwpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBPdXRwdXQga25vd24tMSBiaXRzIGFyZSBvbmx5IGtub3duIGlmIHNldCBpbiBib3RoIHRoZSBMSFMgJiBSSFMuCisgICAgS25vd25PbmUgJj0gS25vd25PbmUyOworICAgIC8vIE91dHB1dCBrbm93bi0wIGFyZSBrbm93biB0byBiZSBjbGVhciBpZiB6ZXJvIGluIGVpdGhlciB0aGUgTEhTIHwgUkhTLgorICAgIEtub3duWmVybyB8PSBLbm93blplcm8yOworICAgIGJyZWFrOworICBjYXNlIElTRDo6T1I6CisgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKE9wLmdldE9wZXJhbmQoMSksIE5ld01hc2ssIEtub3duWmVybywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duT25lLCBUTE8sIERlcHRoKzEpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhPcC5nZXRPcGVyYW5kKDApLCB+S25vd25PbmUgJiBOZXdNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8yLCBLbm93bk9uZTIsIFRMTywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBhc3NlcnQoKEtub3duWmVybzIgJiBLbm93bk9uZTIpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICAKKyAgICAvLyBJZiBhbGwgb2YgdGhlIGRlbWFuZGVkIGJpdHMgYXJlIGtub3duIHplcm8gb24gb25lIHNpZGUsIHJldHVybiB0aGUgb3RoZXIuCisgICAgLy8gVGhlc2UgYml0cyBjYW5ub3QgY29udHJpYnV0ZSB0byB0aGUgcmVzdWx0IG9mIHRoZSAnb3InLgorICAgIGlmICgoTmV3TWFzayAmIH5Lbm93bk9uZTIgJiBLbm93blplcm8pID09ICh+S25vd25PbmUyICYgTmV3TWFzaykpCisgICAgICByZXR1cm4gVExPLkNvbWJpbmVUbyhPcCwgT3AuZ2V0T3BlcmFuZCgwKSk7CisgICAgaWYgKChOZXdNYXNrICYgfktub3duT25lICYgS25vd25aZXJvMikgPT0gKH5Lbm93bk9uZSAmIE5ld01hc2spKQorICAgICAgcmV0dXJuIFRMTy5Db21iaW5lVG8oT3AsIE9wLmdldE9wZXJhbmQoMSkpOworICAgIC8vIElmIGFsbCBvZiB0aGUgcG90ZW50aWFsbHkgc2V0IGJpdHMgb24gb25lIHNpZGUgYXJlIGtub3duIHRvIGJlIHNldCBvbgorICAgIC8vIHRoZSBvdGhlciBzaWRlLCBqdXN0IHVzZSB0aGUgJ290aGVyJyBzaWRlLgorICAgIGlmICgoTmV3TWFzayAmIH5Lbm93blplcm8gJiBLbm93bk9uZTIpID09ICh+S25vd25aZXJvICYgTmV3TWFzaykpCisgICAgICByZXR1cm4gVExPLkNvbWJpbmVUbyhPcCwgT3AuZ2V0T3BlcmFuZCgwKSk7CisgICAgaWYgKChOZXdNYXNrICYgfktub3duWmVybzIgJiBLbm93bk9uZSkgPT0gKH5Lbm93blplcm8yICYgTmV3TWFzaykpCisgICAgICByZXR1cm4gVExPLkNvbWJpbmVUbyhPcCwgT3AuZ2V0T3BlcmFuZCgxKSk7CisgICAgLy8gSWYgdGhlIFJIUyBpcyBhIGNvbnN0YW50LCBzZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IGl0LgorICAgIGlmIChUTE8uU2hyaW5rRGVtYW5kZWRDb25zdGFudChPcCwgTmV3TWFzaykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBJZiB0aGUgb3BlcmF0aW9uIGNhbiBiZSBkb25lIGluIGEgc21hbGxlciB0eXBlLCBkbyBzby4KKyAgICBpZiAoVExPLlNocmlua0RlbWFuZGVkT3AoT3AsIEJpdFdpZHRoLCBOZXdNYXNrLCBkbCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE91dHB1dCBrbm93bi0wIGJpdHMgYXJlIG9ubHkga25vd24gaWYgY2xlYXIgaW4gYm90aCB0aGUgTEhTICYgUkhTLgorICAgIEtub3duWmVybyAmPSBLbm93blplcm8yOworICAgIC8vIE91dHB1dCBrbm93bi0xIGFyZSBrbm93biB0byBiZSBzZXQgaWYgc2V0IGluIGVpdGhlciB0aGUgTEhTIHwgUkhTLgorICAgIEtub3duT25lIHw9IEtub3duT25lMjsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlhPUjoKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoT3AuZ2V0T3BlcmFuZCgxKSwgTmV3TWFzaywgS25vd25aZXJvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25PbmUsIFRMTywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKE9wLmdldE9wZXJhbmQoMCksIE5ld01hc2ssIEtub3duWmVybzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duT25lMiwgVExPLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGFzc2VydCgoS25vd25aZXJvMiAmIEtub3duT25lMikgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIAorICAgIC8vIElmIGFsbCBvZiB0aGUgZGVtYW5kZWQgYml0cyBhcmUga25vd24gemVybyBvbiBvbmUgc2lkZSwgcmV0dXJuIHRoZSBvdGhlci4KKyAgICAvLyBUaGVzZSBiaXRzIGNhbm5vdCBjb250cmlidXRlIHRvIHRoZSByZXN1bHQgb2YgdGhlICd4b3InLgorICAgIGlmICgoS25vd25aZXJvICYgTmV3TWFzaykgPT0gTmV3TWFzaykKKyAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLCBPcC5nZXRPcGVyYW5kKDApKTsKKyAgICBpZiAoKEtub3duWmVybzIgJiBOZXdNYXNrKSA9PSBOZXdNYXNrKQorICAgICAgcmV0dXJuIFRMTy5Db21iaW5lVG8oT3AsIE9wLmdldE9wZXJhbmQoMSkpOworICAgIC8vIElmIHRoZSBvcGVyYXRpb24gY2FuIGJlIGRvbmUgaW4gYSBzbWFsbGVyIHR5cGUsIGRvIHNvLgorICAgIGlmIChUTE8uU2hyaW5rRGVtYW5kZWRPcChPcCwgQml0V2lkdGgsIE5ld01hc2ssIGRsKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gSWYgYWxsIG9mIHRoZSB1bmtub3duIGJpdHMgYXJlIGtub3duIHRvIGJlIHplcm8gb24gb25lIHNpZGUgb3IgdGhlIG90aGVyCisgICAgLy8gKGJ1dCBub3QgYm90aCkgdHVybiB0aGlzIGludG8gYW4gKmluY2x1c2l2ZSogb3IuCisgICAgLy8gICAgZS5nLiAoQSAmIEMxKV4oQiAmIEMyKSAtPiAoQSAmIEMxKXwoQiAmIEMyKSBpZmYgQzEmQzIgPT0gMAorICAgIGlmICgoTmV3TWFzayAmIH5Lbm93blplcm8gJiB+S25vd25aZXJvMikgPT0gMCkKKyAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLCBUTE8uREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpKSk7CisgICAgCisgICAgLy8gT3V0cHV0IGtub3duLTAgYml0cyBhcmUga25vd24gaWYgY2xlYXIgb3Igc2V0IGluIGJvdGggdGhlIExIUyAmIFJIUy4KKyAgICBLbm93blplcm9PdXQgPSAoS25vd25aZXJvICYgS25vd25aZXJvMikgfCAoS25vd25PbmUgJiBLbm93bk9uZTIpOworICAgIC8vIE91dHB1dCBrbm93bi0xIGFyZSBrbm93biB0byBiZSBzZXQgaWYgc2V0IGluIG9ubHkgb25lIG9mIHRoZSBMSFMsIFJIUy4KKyAgICBLbm93bk9uZU91dCA9IChLbm93blplcm8gJiBLbm93bk9uZTIpIHwgKEtub3duT25lICYgS25vd25aZXJvMik7CisgICAgCisgICAgLy8gSWYgYWxsIG9mIHRoZSBkZW1hbmRlZCBiaXRzIG9uIG9uZSBzaWRlIGFyZSBrbm93biwgYW5kIGFsbCBvZiB0aGUgc2V0CisgICAgLy8gYml0cyBvbiB0aGF0IHNpZGUgYXJlIGFsc28ga25vd24gdG8gYmUgc2V0IG9uIHRoZSBvdGhlciBzaWRlLCB0dXJuIHRoaXMKKyAgICAvLyBpbnRvIGFuIEFORCwgYXMgd2Uga25vdyB0aGUgYml0cyB3aWxsIGJlIGNsZWFyZWQuCisgICAgLy8gICAgZS5nLiAoWCB8IEMxKSBeIEMyIC0tPiAoWCB8IEMxKSAmIH5DMiBpZmYgKEMxJkMyKSA9PSBDMgorICAgIGlmICgoTmV3TWFzayAmIChLbm93blplcm98S25vd25PbmUpKSA9PSBOZXdNYXNrKSB7IC8vIGFsbCBrbm93bgorICAgICAgaWYgKChLbm93bk9uZSAmIEtub3duT25lMikgPT0gS25vd25PbmUpIHsKKyAgICAgICAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgICAgICAgIFNEVmFsdWUgQU5EQyA9IFRMTy5EQUcuZ2V0Q29uc3RhbnQofktub3duT25lICYgTmV3TWFzaywgVlQpOworICAgICAgICByZXR1cm4gVExPLkNvbWJpbmVUbyhPcCwgVExPLkRBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgVlQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMCksIEFOREMpKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gSWYgdGhlIFJIUyBpcyBhIGNvbnN0YW50LCBzZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IGl0LgorICAgIC8vIGZvciBYT1IsIHdlIHByZWZlciB0byBmb3JjZSBiaXRzIHRvIDEgaWYgdGhleSB3aWxsIG1ha2UgYSAtMS4KKyAgICAvLyBpZiB3ZSBjYW4ndCBmb3JjZSBiaXRzLCB0cnkgdG8gc2hyaW5rIGNvbnN0YW50CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBBUEludCBFeHBhbmRlZCA9IEMtPmdldEFQSW50VmFsdWUoKSB8ICh+TmV3TWFzayk7CisgICAgICAvLyBpZiB3ZSBjYW4gZXhwYW5kIGl0IHRvIGhhdmUgYWxsIGJpdHMgc2V0LCBkbyBpdAorICAgICAgaWYgKEV4cGFuZGVkLmlzQWxsT25lc1ZhbHVlKCkpIHsKKyAgICAgICAgaWYgKEV4cGFuZGVkICE9IEMtPmdldEFQSW50VmFsdWUoKSkgeworICAgICAgICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICAgICAgICAgIFNEVmFsdWUgTmV3ID0gVExPLkRBRy5nZXROb2RlKE9wLmdldE9wY29kZSgpLCBkbCxWVCwgT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMTy5EQUcuZ2V0Q29uc3RhbnQoRXhwYW5kZWQsIFZUKSk7CisgICAgICAgICAgcmV0dXJuIFRMTy5Db21iaW5lVG8oT3AsIE5ldyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgaXQgYWxyZWFkeSBoYXMgYWxsIHRoZSBiaXRzIHNldCwgbm90aGluZyB0byBjaGFuZ2UKKyAgICAgICAgLy8gYnV0IGRvbid0IHNocmluayBlaXRoZXIhCisgICAgICB9IGVsc2UgaWYgKFRMTy5TaHJpbmtEZW1hbmRlZENvbnN0YW50KE9wLCBOZXdNYXNrKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBLbm93blplcm8gPSBLbm93blplcm9PdXQ7CisgICAgS25vd25PbmUgID0gS25vd25PbmVPdXQ7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTRUxFQ1Q6CisgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKE9wLmdldE9wZXJhbmQoMiksIE5ld01hc2ssIEtub3duWmVybywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duT25lLCBUTE8sIERlcHRoKzEpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKE9wLmdldE9wZXJhbmQoMSksIE5ld01hc2ssIEtub3duWmVybzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duT25lMiwgVExPLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICBhc3NlcnQoKEtub3duWmVybzIgJiBLbm93bk9uZTIpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICAKKyAgICAvLyBJZiB0aGUgb3BlcmFuZHMgYXJlIGNvbnN0YW50cywgc2VlIGlmIHdlIGNhbiBzaW1wbGlmeSB0aGVtLgorICAgIGlmIChUTE8uU2hyaW5rRGVtYW5kZWRDb25zdGFudChPcCwgTmV3TWFzaykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICAvLyBPbmx5IGtub3duIGlmIGtub3duIGluIGJvdGggdGhlIExIUyBhbmQgUkhTLgorICAgIEtub3duT25lICY9IEtub3duT25lMjsKKyAgICBLbm93blplcm8gJj0gS25vd25aZXJvMjsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzoKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoT3AuZ2V0T3BlcmFuZCgzKSwgTmV3TWFzaywgS25vd25aZXJvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25PbmUsIFRMTywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoT3AuZ2V0T3BlcmFuZCgyKSwgTmV3TWFzaywgS25vd25aZXJvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25PbmUyLCBUTE8sIERlcHRoKzEpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIGFzc2VydCgoS25vd25aZXJvMiAmIEtub3duT25lMikgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIAorICAgIC8vIElmIHRoZSBvcGVyYW5kcyBhcmUgY29uc3RhbnRzLCBzZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IHRoZW0uCisgICAgaWYgKFRMTy5TaHJpbmtEZW1hbmRlZENvbnN0YW50KE9wLCBOZXdNYXNrKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgICAgCisgICAgLy8gT25seSBrbm93biBpZiBrbm93biBpbiBib3RoIHRoZSBMSFMgYW5kIFJIUy4KKyAgICBLbm93bk9uZSAmPSBLbm93bk9uZTI7CisgICAgS25vd25aZXJvICY9IEtub3duWmVybzI7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTSEw6CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpTQSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgdW5zaWduZWQgU2hBbXQgPSBTQS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBTRFZhbHVlIEluT3AgPSBPcC5nZXRPcGVyYW5kKDApOworCisgICAgICAvLyBJZiB0aGUgc2hpZnQgY291bnQgaXMgYW4gaW52YWxpZCBpbW1lZGlhdGUsIGRvbid0IGRvIGFueXRoaW5nLgorICAgICAgaWYgKFNoQW10ID49IEJpdFdpZHRoKQorICAgICAgICBicmVhazsKKworICAgICAgLy8gSWYgdGhpcyBpcyAoKFggPj51IEMxKSA8PCBTaEFtdCksIHNlZSBpZiB3ZSBjYW4gc2ltcGxpZnkgdGhpcyBpbnRvIGEKKyAgICAgIC8vIHNpbmdsZSBzaGlmdC4gIFdlIGNhbiBkbyB0aGlzIGlmIHRoZSBib3R0b20gYml0cyAod2hpY2ggYXJlIHNoaWZ0ZWQKKyAgICAgIC8vIG91dCkgYXJlIG5ldmVyIGRlbWFuZGVkLgorICAgICAgaWYgKEluT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkwgJiYKKyAgICAgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KEluT3AuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgaWYgKFNoQW10ICYmIChOZXdNYXNrICYgQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsIFNoQW10KSkgPT0gMCkgeworICAgICAgICAgIHVuc2lnbmVkIEMxPSBjYXN0PENvbnN0YW50U0ROb2RlPihJbk9wLmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICB1bnNpZ25lZCBPcGMgPSBJU0Q6OlNITDsKKyAgICAgICAgICBpbnQgRGlmZiA9IFNoQW10LUMxOworICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgRGlmZiA9IC1EaWZmOworICAgICAgICAgICAgT3BjID0gSVNEOjpTUkw7CisgICAgICAgICAgfSAgICAgICAgICAKKyAgICAgICAgICAKKyAgICAgICAgICBTRFZhbHVlIE5ld1NBID0gCisgICAgICAgICAgICBUTE8uREFHLmdldENvbnN0YW50KERpZmYsIE9wLmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkpOworICAgICAgICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICAgICAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLCBUTE8uREFHLmdldE5vZGUoT3BjLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbk9wLmdldE9wZXJhbmQoMCksIE5ld1NBKSk7CisgICAgICAgIH0KKyAgICAgIH0gICAgICAKKyAgICAgIAorICAgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEluT3AsIE5ld01hc2subHNocihTaEFtdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvLCBLbm93bk9uZSwgVExPLCBEZXB0aCsxKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIENvbnZlcnQgKHNobCAoYW55ZXh0IHgsIGMpKSB0byAoYW55ZXh0IChzaGwgeCwgYykpIGlmIHRoZSBoaWdoIGJpdHMKKyAgICAgIC8vIGFyZSBub3QgZGVtYW5kZWQuIFRoaXMgd2lsbCBsaWtlbHkgYWxsb3cgdGhlIGFueWV4dCB0byBiZSBmb2xkZWQgYXdheS4KKyAgICAgIGlmIChJbk9wLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBTllfRVhURU5EKSB7CisgICAgICAgIFNEVmFsdWUgSW5uZXJPcCA9IEluT3AuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApOworICAgICAgICBFVlQgSW5uZXJWVCA9IElubmVyT3AuZ2V0VmFsdWVUeXBlKCk7CisgICAgICAgIGlmICgoQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRXaWR0aCAtIElubmVyVlQuZ2V0U2l6ZUluQml0cygpKSAmCisgICAgICAgICAgICAgICBEZW1hbmRlZE1hc2spID09IDAgJiYKKyAgICAgICAgICAgIGlzVHlwZURlc2lyYWJsZUZvck9wKElTRDo6U0hMLCBJbm5lclZUKSkgeworICAgICAgICAgIEVWVCBTaFR5ID0gZ2V0U2hpZnRBbW91bnRUeSgpOworICAgICAgICAgIGlmICghQVBJbnQoQml0V2lkdGgsIFNoQW10KS5pc0ludE4oU2hUeS5nZXRTaXplSW5CaXRzKCkpKQorICAgICAgICAgICAgU2hUeSA9IElubmVyVlQ7CisgICAgICAgICAgU0RWYWx1ZSBOYXJyb3dTaGwgPQorICAgICAgICAgICAgVExPLkRBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgSW5uZXJWVCwgSW5uZXJPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTE8uREFHLmdldENvbnN0YW50KFNoQW10LCBTaFR5KSk7CisgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBUTE8uQ29tYmluZVRvKE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUTE8uREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwgT3AuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXJyb3dTaGwpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBLbm93blplcm8gPDw9IFNBLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIEtub3duT25lICA8PD0gU0EtPmdldFpFeHRWYWx1ZSgpOworICAgICAgLy8gbG93IGJpdHMga25vd24gemVyby4KKyAgICAgIEtub3duWmVybyB8PSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwgU0EtPmdldFpFeHRWYWx1ZSgpKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTUkw6CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpTQSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgICAgICB1bnNpZ25lZCBTaEFtdCA9IFNBLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIHVuc2lnbmVkIFZUU2l6ZSA9IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICAgIFNEVmFsdWUgSW5PcCA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgICAKKyAgICAgIC8vIElmIHRoZSBzaGlmdCBjb3VudCBpcyBhbiBpbnZhbGlkIGltbWVkaWF0ZSwgZG9uJ3QgZG8gYW55dGhpbmcuCisgICAgICBpZiAoU2hBbXQgPj0gQml0V2lkdGgpCisgICAgICAgIGJyZWFrOworCisgICAgICAvLyBJZiB0aGlzIGlzICgoWCA8PCBDMSkgPj51IFNoQW10KSwgc2VlIGlmIHdlIGNhbiBzaW1wbGlmeSB0aGlzIGludG8gYQorICAgICAgLy8gc2luZ2xlIHNoaWZ0LiAgV2UgY2FuIGRvIHRoaXMgaWYgdGhlIHRvcCBiaXRzICh3aGljaCBhcmUgc2hpZnRlZCBvdXQpCisgICAgICAvLyBhcmUgbmV2ZXIgZGVtYW5kZWQuCisgICAgICBpZiAoSW5PcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCAmJgorICAgICAgICAgIGlzYTxDb25zdGFudFNETm9kZT4oSW5PcC5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICBpZiAoU2hBbXQgJiYgKE5ld01hc2sgJiBBUEludDo6Z2V0SGlnaEJpdHNTZXQoVlRTaXplLCBTaEFtdCkpID09IDApIHsKKyAgICAgICAgICB1bnNpZ25lZCBDMT0gY2FzdDxDb25zdGFudFNETm9kZT4oSW5PcC5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgICAgdW5zaWduZWQgT3BjID0gSVNEOjpTUkw7CisgICAgICAgICAgaW50IERpZmYgPSBTaEFtdC1DMTsKKyAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgIERpZmYgPSAtRGlmZjsKKyAgICAgICAgICAgIE9wYyA9IElTRDo6U0hMOworICAgICAgICAgIH0gICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgU0RWYWx1ZSBOZXdTQSA9CisgICAgICAgICAgICBUTE8uREFHLmdldENvbnN0YW50KERpZmYsIE9wLmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkpOworICAgICAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLCBUTE8uREFHLmdldE5vZGUoT3BjLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbk9wLmdldE9wZXJhbmQoMCksIE5ld1NBKSk7CisgICAgICAgIH0KKyAgICAgIH0gICAgICAKKyAgICAgIAorICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGJpdHMgdGhhdCBhcmUgYXQgdGhlIHRvcCBub3cuCisgICAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoSW5PcCwgKE5ld01hc2sgPDwgU2hBbXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybywgS25vd25PbmUsIFRMTywgRGVwdGgrMSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgICAgS25vd25aZXJvID0gS25vd25aZXJvLmxzaHIoU2hBbXQpOworICAgICAgS25vd25PbmUgID0gS25vd25PbmUubHNocihTaEFtdCk7CisKKyAgICAgIEFQSW50IEhpZ2hCaXRzID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBTaEFtdCk7CisgICAgICBLbm93blplcm8gfD0gSGlnaEJpdHM7ICAvLyBIaWdoIGJpdHMga25vd24gemVyby4KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTUkE6CisgICAgLy8gSWYgdGhpcyBpcyBhbiBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IGFuZCBvbmx5IHRoZSBsb3ctYml0IGlzIHNldCwgd2UgY2FuCisgICAgLy8gYWx3YXlzIGNvbnZlcnQgdGhpcyBpbnRvIGEgbG9naWNhbCBzaHIsIGV2ZW4gaWYgdGhlIHNoaWZ0IGFtb3VudCBpcworICAgIC8vIHZhcmlhYmxlLiAgVGhlIGxvdyBiaXQgb2YgdGhlIHNoaWZ0IGNhbm5vdCBiZSBhbiBpbnB1dCBzaWduIGJpdCB1bmxlc3MKKyAgICAvLyB0aGUgc2hpZnQgYW1vdW50IGlzID49IHRoZSBzaXplIG9mIHRoZSBkYXRhdHlwZSwgd2hpY2ggaXMgdW5kZWZpbmVkLgorICAgIGlmIChEZW1hbmRlZE1hc2sgPT0gMSkKKyAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVExPLkRBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgT3AuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgwKSwgT3AuZ2V0T3BlcmFuZCgxKSkpOworCisgICAgaWYgKENvbnN0YW50U0ROb2RlICpTQSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgICAgICB1bnNpZ25lZCBTaEFtdCA9IFNBLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIHNoaWZ0IGNvdW50IGlzIGFuIGludmFsaWQgaW1tZWRpYXRlLCBkb24ndCBkbyBhbnl0aGluZy4KKyAgICAgIGlmIChTaEFtdCA+PSBCaXRXaWR0aCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIEFQSW50IEluRGVtYW5kZWRNYXNrID0gKE5ld01hc2sgPDwgU2hBbXQpOworCisgICAgICAvLyBJZiBhbnkgb2YgdGhlIGRlbWFuZGVkIGJpdHMgYXJlIHByb2R1Y2VkIGJ5IHRoZSBzaWduIGV4dGVuc2lvbiwgd2UgYWxzbworICAgICAgLy8gZGVtYW5kIHRoZSBpbnB1dCBzaWduIGJpdC4KKyAgICAgIEFQSW50IEhpZ2hCaXRzID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBTaEFtdCk7CisgICAgICBpZiAoSGlnaEJpdHMuaW50ZXJzZWN0cyhOZXdNYXNrKSkKKyAgICAgICAgSW5EZW1hbmRlZE1hc2sgfD0gQVBJbnQ6OmdldFNpZ25CaXQoVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSk7CisgICAgICAKKyAgICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBJbkRlbWFuZGVkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8sIEtub3duT25lLCBUTE8sIERlcHRoKzEpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICAgIEtub3duWmVybyA9IEtub3duWmVyby5sc2hyKFNoQW10KTsKKyAgICAgIEtub3duT25lICA9IEtub3duT25lLmxzaHIoU2hBbXQpOworICAgICAgCisgICAgICAvLyBIYW5kbGUgdGhlIHNpZ24gYml0LCBhZGp1c3RlZCB0byB3aGVyZSBpdCBpcyBub3cgaW4gdGhlIG1hc2suCisgICAgICBBUEludCBTaWduQml0ID0gQVBJbnQ6OmdldFNpZ25CaXQoQml0V2lkdGgpLmxzaHIoU2hBbXQpOworICAgICAgCisgICAgICAvLyBJZiB0aGUgaW5wdXQgc2lnbiBiaXQgaXMga25vd24gdG8gYmUgemVybywgb3IgaWYgbm9uZSBvZiB0aGUgdG9wIGJpdHMKKyAgICAgIC8vIGFyZSBkZW1hbmRlZCwgdHVybiB0aGlzIGludG8gYW4gdW5zaWduZWQgc2hpZnQgcmlnaHQuCisgICAgICBpZiAoS25vd25aZXJvLmludGVyc2VjdHMoU2lnbkJpdCkgfHwgKEhpZ2hCaXRzICYgfk5ld01hc2spID09IEhpZ2hCaXRzKSB7CisgICAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLCBUTE8uREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBWVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpKSk7CisgICAgICB9IGVsc2UgaWYgKEtub3duT25lLmludGVyc2VjdHMoU2lnbkJpdCkpIHsgLy8gTmV3IGJpdHMgYXJlIGtub3duIG9uZS4KKyAgICAgICAgS25vd25PbmUgfD0gSGlnaEJpdHM7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6U0lHTl9FWFRFTkRfSU5SRUc6IHsKKyAgICBFVlQgRVZUID0gY2FzdDxWVFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmdldFZUKCk7CisKKyAgICAvLyBTaWduIGV4dGVuc2lvbi4gIENvbXB1dGUgdGhlIGRlbWFuZGVkIGJpdHMgaW4gdGhlIHJlc3VsdCB0aGF0IGFyZSBub3QgCisgICAgLy8gcHJlc2VudCBpbiB0aGUgaW5wdXQuCisgICAgQVBJbnQgTmV3Qml0cyA9CisgICAgICBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0V2lkdGggLSBFVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSk7CisgICAgCisgICAgLy8gSWYgbm9uZSBvZiB0aGUgZXh0ZW5kZWQgYml0cyBhcmUgZGVtYW5kZWQsIGVsaW1pbmF0ZSB0aGUgc2V4dGlucmVnLgorICAgIGlmICgoTmV3Qml0cyAmIE5ld01hc2spID09IDApCisgICAgICByZXR1cm4gVExPLkNvbWJpbmVUbyhPcCwgT3AuZ2V0T3BlcmFuZCgwKSk7CisKKyAgICBBUEludCBJblNpZ25CaXQgPSBBUEludDo6Z2V0U2lnbkJpdChFVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKSk7CisgICAgSW5TaWduQml0LnpleHQoQml0V2lkdGgpOworICAgIEFQSW50IElucHV0RGVtYW5kZWRCaXRzID0KKyAgICAgIEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCkpICYKKyAgICAgIE5ld01hc2s7CisgICAgCisgICAgLy8gU2luY2UgdGhlIHNpZ24gZXh0ZW5kZWQgYml0cyBhcmUgZGVtYW5kZWQsIHdlIGtub3cgdGhhdCB0aGUgc2lnbgorICAgIC8vIGJpdCBpcyBkZW1hbmRlZC4KKyAgICBJbnB1dERlbWFuZGVkQml0cyB8PSBJblNpZ25CaXQ7CisKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoT3AuZ2V0T3BlcmFuZCgwKSwgSW5wdXREZW1hbmRlZEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybywgS25vd25PbmUsIFRMTywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisKKyAgICAvLyBJZiB0aGUgc2lnbiBiaXQgb2YgdGhlIGlucHV0IGlzIGtub3duIHNldCBvciBjbGVhciwgdGhlbiB3ZSBrbm93IHRoZQorICAgIC8vIHRvcCBiaXRzIG9mIHRoZSByZXN1bHQuCisgICAgCisgICAgLy8gSWYgdGhlIGlucHV0IHNpZ24gYml0IGlzIGtub3duIHplcm8sIGNvbnZlcnQgdGhpcyBpbnRvIGEgemVybyBleHRlbnNpb24uCisgICAgaWYgKEtub3duWmVyby5pbnRlcnNlY3RzKEluU2lnbkJpdCkpCisgICAgICByZXR1cm4gVExPLkNvbWJpbmVUbyhPcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUTE8uREFHLmdldFplcm9FeHRlbmRJblJlZyhPcC5nZXRPcGVyYW5kKDApLGRsLEVWVCkpOworICAgIAorICAgIGlmIChLbm93bk9uZS5pbnRlcnNlY3RzKEluU2lnbkJpdCkpIHsgICAgLy8gSW5wdXQgc2lnbiBiaXQga25vd24gc2V0CisgICAgICBLbm93bk9uZSB8PSBOZXdCaXRzOworICAgICAgS25vd25aZXJvICY9IH5OZXdCaXRzOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnB1dCBzaWduIGJpdCB1bmtub3duCisgICAgICBLbm93blplcm8gJj0gfk5ld0JpdHM7CisgICAgICBLbm93bk9uZSAmPSB+TmV3Qml0czsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlpFUk9fRVhURU5EOiB7CisgICAgdW5zaWduZWQgT3BlcmFuZEJpdFdpZHRoID0KKyAgICAgIE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICBBUEludCBJbk1hc2sgPSBOZXdNYXNrOworICAgIEluTWFzay50cnVuYyhPcGVyYW5kQml0V2lkdGgpOworICAgIAorICAgIC8vIElmIG5vbmUgb2YgdGhlIHRvcCBiaXRzIGFyZSBkZW1hbmRlZCwgY29udmVydCB0aGlzIGludG8gYW4gYW55X2V4dGVuZC4KKyAgICBBUEludCBOZXdCaXRzID0KKyAgICAgIEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgQml0V2lkdGggLSBPcGVyYW5kQml0V2lkdGgpICYgTmV3TWFzazsKKyAgICBpZiAoIU5ld0JpdHMuaW50ZXJzZWN0cyhOZXdNYXNrKSkKKyAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLCBUTE8uREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0VmFsdWVUeXBlKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApKSk7CisgICAgCisgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKE9wLmdldE9wZXJhbmQoMCksIEluTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvLCBLbm93bk9uZSwgVExPLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICBLbm93blplcm8uemV4dChCaXRXaWR0aCk7CisgICAgS25vd25PbmUuemV4dChCaXRXaWR0aCk7CisgICAgS25vd25aZXJvIHw9IE5ld0JpdHM7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOiB7CisgICAgRVZUIEluVlQgPSBPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgIHVuc2lnbmVkIEluQml0cyA9IEluVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICBBUEludCBJbk1hc2sgICAgPSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwgSW5CaXRzKTsKKyAgICBBUEludCBJblNpZ25CaXQgPSBBUEludDo6Z2V0Qml0c1NldChCaXRXaWR0aCwgSW5CaXRzIC0gMSwgSW5CaXRzKTsKKyAgICBBUEludCBOZXdCaXRzICAgPSB+SW5NYXNrICYgTmV3TWFzazsKKyAgICAKKyAgICAvLyBJZiBub25lIG9mIHRoZSB0b3AgYml0cyBhcmUgZGVtYW5kZWQsIGNvbnZlcnQgdGhpcyBpbnRvIGFuIGFueV9leHRlbmQuCisgICAgaWYgKE5ld0JpdHMgPT0gMCkKKyAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLFRMTy5EQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMCkpKTsKKyAgICAKKyAgICAvLyBTaW5jZSBzb21lIG9mIHRoZSBzaWduIGV4dGVuZGVkIGJpdHMgYXJlIGRlbWFuZGVkLCB3ZSBrbm93IHRoYXQgdGhlIHNpZ24KKyAgICAvLyBiaXQgaXMgZGVtYW5kZWQuCisgICAgQVBJbnQgSW5EZW1hbmRlZEJpdHMgPSBJbk1hc2sgJiBOZXdNYXNrOworICAgIEluRGVtYW5kZWRCaXRzIHw9IEluU2lnbkJpdDsKKyAgICBJbkRlbWFuZGVkQml0cy50cnVuYyhJbkJpdHMpOworICAgIAorICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBJbkRlbWFuZGVkQml0cywgS25vd25aZXJvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25PbmUsIFRMTywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBLbm93blplcm8uemV4dChCaXRXaWR0aCk7CisgICAgS25vd25PbmUuemV4dChCaXRXaWR0aCk7CisgICAgCisgICAgLy8gSWYgdGhlIHNpZ24gYml0IGlzIGtub3duIHplcm8sIGNvbnZlcnQgdGhpcyB0byBhIHplcm8gZXh0ZW5kLgorICAgIGlmIChLbm93blplcm8uaW50ZXJzZWN0cyhJblNpZ25CaXQpKQorICAgICAgcmV0dXJuIFRMTy5Db21iaW5lVG8oT3AsIFRMTy5EQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0VmFsdWVUeXBlKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApKSk7CisgICAgCisgICAgLy8gSWYgdGhlIHNpZ24gYml0IGlzIGtub3duIG9uZSwgdGhlIHRvcCBiaXRzIG1hdGNoLgorICAgIGlmIChLbm93bk9uZS5pbnRlcnNlY3RzKEluU2lnbkJpdCkpIHsKKyAgICAgIEtub3duT25lICB8PSBOZXdCaXRzOworICAgICAgS25vd25aZXJvICY9IH5OZXdCaXRzOworICAgIH0gZWxzZSB7ICAgLy8gT3RoZXJ3aXNlLCB0b3AgYml0cyBhcmVuJ3Qga25vd24uCisgICAgICBLbm93bk9uZSAgJj0gfk5ld0JpdHM7CisgICAgICBLbm93blplcm8gJj0gfk5ld0JpdHM7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpBTllfRVhURU5EOiB7CisgICAgdW5zaWduZWQgT3BlcmFuZEJpdFdpZHRoID0KKyAgICAgIE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICBBUEludCBJbk1hc2sgPSBOZXdNYXNrOworICAgIEluTWFzay50cnVuYyhPcGVyYW5kQml0V2lkdGgpOworICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBJbk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybywgS25vd25PbmUsIFRMTywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgS25vd25aZXJvLnpleHQoQml0V2lkdGgpOworICAgIEtub3duT25lLnpleHQoQml0V2lkdGgpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpUUlVOQ0FURTogeworICAgIC8vIFNpbXBsaWZ5IHRoZSBpbnB1dCwgdXNpbmcgZGVtYW5kZWQgYml0IGluZm9ybWF0aW9uLCBhbmQgY29tcHV0ZSB0aGUga25vd24KKyAgICAvLyB6ZXJvL29uZSBiaXRzIGxpdmUgb3V0LgorICAgIHVuc2lnbmVkIE9wZXJhbmRCaXRXaWR0aCA9CisgICAgICBPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgICAgQVBJbnQgVHJ1bmNNYXNrID0gTmV3TWFzazsKKyAgICBUcnVuY01hc2suemV4dChPcGVyYW5kQml0V2lkdGgpOworICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBUcnVuY01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybywgS25vd25PbmUsIFRMTywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBLbm93blplcm8udHJ1bmMoQml0V2lkdGgpOworICAgIEtub3duT25lLnRydW5jKEJpdFdpZHRoKTsKKyAgICAKKyAgICAvLyBJZiB0aGUgaW5wdXQgaXMgb25seSB1c2VkIGJ5IHRoaXMgdHJ1bmNhdGUsIHNlZSBpZiB3ZSBjYW4gc2hyaW5rIGl0IGJhc2VkCisgICAgLy8gb24gdGhlIGtub3duIGRlbWFuZGVkIGJpdHMuCisgICAgaWYgKE9wLmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkgeworICAgICAgU0RWYWx1ZSBJbiA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgICBzd2l0Y2ggKEluLmdldE9wY29kZSgpKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTUkw6CisgICAgICAgIC8vIFNocmluayBTUkwgYnkgYSBjb25zdGFudCBpZiBub25lIG9mIHRoZSBoaWdoIGJpdHMgc2hpZnRlZCBpbiBhcmUKKyAgICAgICAgLy8gZGVtYW5kZWQuCisgICAgICAgIGlmIChUTE8uTGVnYWxUeXBlcygpICYmCisgICAgICAgICAgICAhaXNUeXBlRGVzaXJhYmxlRm9yT3AoSVNEOjpTUkwsIE9wLmdldFZhbHVlVHlwZSgpKSkKKyAgICAgICAgICAvLyBEbyBub3QgdHVybiAodnQxIHRydW5jYXRlICh2dDIgc3JsKSkgaW50byAodnQxIHNybCkgaWYgdnQxIGlzCisgICAgICAgICAgLy8gdW5kZXNpcmFibGUuCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIENvbnN0YW50U0ROb2RlICpTaEFtdCA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihJbi5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgaWYgKCFTaEFtdCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgQVBJbnQgSGlnaEJpdHMgPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoT3BlcmFuZEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kQml0V2lkdGggLSBCaXRXaWR0aCk7CisgICAgICAgIEhpZ2hCaXRzID0gSGlnaEJpdHMubHNocihTaEFtdC0+Z2V0WkV4dFZhbHVlKCkpOworICAgICAgICBIaWdoQml0cy50cnVuYyhCaXRXaWR0aCk7CisKKyAgICAgICAgaWYgKFNoQW10LT5nZXRaRXh0VmFsdWUoKSA8IEJpdFdpZHRoICYmICEoSGlnaEJpdHMgJiBOZXdNYXNrKSkgeworICAgICAgICAgIC8vIE5vbmUgb2YgdGhlIHNoaWZ0ZWQgaW4gYml0cyBhcmUgbmVlZGVkLiAgQWRkIGEgdHJ1bmNhdGUgb2YgdGhlCisgICAgICAgICAgLy8gc2hpZnQgaW5wdXQsIHRoZW4gc2hpZnQgaXQuCisgICAgICAgICAgU0RWYWx1ZSBOZXdUcnVuYyA9IFRMTy5EQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldFZhbHVlVHlwZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluLmdldE9wZXJhbmQoMCkpOworICAgICAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLCBUTE8uREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdUcnVuYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbi5nZXRPcGVyYW5kKDEpKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIAorICAgIGFzc2VydCgoS25vd25aZXJvICYgS25vd25PbmUpID09IDAgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6QXNzZXJ0WmV4dDogeworICAgIC8vIERlbWFuZCBhbGwgdGhlIGJpdHMgb2YgdGhlIGlucHV0IHRoYXQgYXJlIGRlbWFuZGVkIGluIHRoZSBvdXRwdXQuCisgICAgLy8gVGhlIGxvdyBiaXRzIGFyZSBvYnZpb3VzOyB0aGUgaGlnaCBiaXRzIGFyZSBkZW1hbmRlZCBiZWNhdXNlIHdlJ3JlCisgICAgLy8gYXNzZXJ0aW5nIHRoYXQgdGhleSdyZSB6ZXJvIGhlcmUuCisgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKE9wLmdldE9wZXJhbmQoMCksIE5ld01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybywgS25vd25PbmUsIFRMTywgRGVwdGgrMSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBhc3NlcnQoKEtub3duWmVybyAmIEtub3duT25lKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisKKyAgICBFVlQgVlQgPSBjYXN0PFZUU0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKS0+Z2V0VlQoKTsKKyAgICBBUEludCBJbk1hc2sgPSBBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIEtub3duWmVybyB8PSB+SW5NYXNrICYgTmV3TWFzazsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6CisjaWYgMAorICAgIC8vIElmIHRoaXMgaXMgYW4gRlAtPkludCBiaXRjYXN0IGFuZCBpZiB0aGUgc2lnbiBiaXQgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdAorICAgIC8vIGlzIGRlbWFuZGVkLCB0dXJuIHRoaXMgaW50byBhIEZHRVRTSUdOLgorICAgIGlmIChOZXdNYXNrID09IEVWVDo6Z2V0SW50ZWdlclZUU2lnbkJpdChPcC5nZXRWYWx1ZVR5cGUoKSkgJiYKKyAgICAgICAgTVZUOjppc0Zsb2F0aW5nUG9pbnQoT3AuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSkgJiYKKyAgICAgICAgIU1WVDo6aXNWZWN0b3IoT3AuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSkpIHsKKyAgICAgIC8vIE9ubHkgZG8gdGhpcyB4Zm9ybSBpZiBGR0VUU0lHTiBpcyB2YWxpZCBvciBpZiBiZWZvcmUgbGVnYWxpemUuCisgICAgICBpZiAoIVRMTy5BZnRlckxlZ2FsaXplIHx8CisgICAgICAgICAgaXNPcGVyYXRpb25MZWdhbChJU0Q6OkZHRVRTSUdOLCBPcC5nZXRWYWx1ZVR5cGUoKSkpIHsKKyAgICAgICAgLy8gTWFrZSBhIEZHRVRTSUdOICsgU0hMIHRvIG1vdmUgdGhlIHNpZ24gYml0IGludG8gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgIC8vIHBsYWNlLiAgV2UgZXhwZWN0IHRoZSBTSEwgdG8gYmUgZWxpbWluYXRlZCBieSBvdGhlciBvcHRpbWl6YXRpb25zLgorICAgICAgICBTRFZhbHVlIFNpZ24gPSBUTE8uREFHLmdldE5vZGUoSVNEOjpGR0VUU0lHTiwgT3AuZ2V0VmFsdWVUeXBlKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgdW5zaWduZWQgU2hWYWwgPSBPcC5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCktMTsKKyAgICAgICAgU0RWYWx1ZSBTaEFtdCA9IFRMTy5EQUcuZ2V0Q29uc3RhbnQoU2hWYWwsIGdldFNoaWZ0QW1vdW50VHkoKSk7CisgICAgICAgIHJldHVybiBUTE8uQ29tYmluZVRvKE9wLCBUTE8uREFHLmdldE5vZGUoSVNEOjpTSEwsIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ24sIFNoQW10KSk7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpBREQ6CisgIGNhc2UgSVNEOjpNVUw6CisgIGNhc2UgSVNEOjpTVUI6IHsKKyAgICAvLyBBZGQsIFN1YiwgYW5kIE11bCBkb24ndCBkZW1hbmQgYW55IGJpdHMgaW4gcG9zaXRpb25zIGJleW9uZCB0aGF0CisgICAgLy8gb2YgdGhlIGhpZ2hlc3QgYml0IGRlbWFuZGVkIG9mIHRoZW0uCisgICAgQVBJbnQgTG9NYXNrID0gQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0V2lkdGggLSBOZXdNYXNrLmNvdW50TGVhZGluZ1plcm9zKCkpOworICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhPcC5nZXRPcGVyYW5kKDApLCBMb01hc2ssIEtub3duWmVybzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duT25lMiwgVExPLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhPcC5nZXRPcGVyYW5kKDEpLCBMb01hc2ssIEtub3duWmVybzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duT25lMiwgVExPLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIC8vIFNlZSBpZiB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgYXQgYSBzbWFsbGVyIGJpdCB3aWR0aC4KKyAgICBpZiAoVExPLlNocmlua0RlbWFuZGVkT3AoT3AsIEJpdFdpZHRoLCBOZXdNYXNrLCBkbCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAvLyBGQUxMIFRIUk9VR0gKKyAgZGVmYXVsdDoKKyAgICAvLyBKdXN0IHVzZSBDb21wdXRlTWFza2VkQml0cyB0byBjb21wdXRlIG91dHB1dCBiaXRzLgorICAgIFRMTy5EQUcuQ29tcHV0ZU1hc2tlZEJpdHMoT3AsIE5ld01hc2ssIEtub3duWmVybywgS25vd25PbmUsIERlcHRoKTsKKyAgICBicmVhazsKKyAgfQorICAKKyAgLy8gSWYgd2Uga25vdyB0aGUgdmFsdWUgb2YgYWxsIG9mIHRoZSBkZW1hbmRlZCBiaXRzLCByZXR1cm4gdGhpcyBhcyBhCisgIC8vIGNvbnN0YW50LgorICBpZiAoKE5ld01hc2sgJiAoS25vd25aZXJvfEtub3duT25lKSkgPT0gTmV3TWFzaykKKyAgICByZXR1cm4gVExPLkNvbWJpbmVUbyhPcCwgVExPLkRBRy5nZXRDb25zdGFudChLbm93bk9uZSwgT3AuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGNvbXB1dGVNYXNrZWRCaXRzRm9yVGFyZ2V0Tm9kZSAtIERldGVybWluZSB3aGljaCBvZiB0aGUgYml0cyBzcGVjaWZpZWQgCisvLy8gaW4gTWFzayBhcmUga25vd24gdG8gYmUgZWl0aGVyIHplcm8gb3Igb25lIGFuZCByZXR1cm4gdGhlbSBpbiB0aGUgCisvLy8gS25vd25aZXJvL0tub3duT25lIGJpdHNldHMuCit2b2lkIFRhcmdldExvd2VyaW5nOjpjb21wdXRlTWFza2VkQml0c0ZvclRhcmdldE5vZGUoY29uc3QgU0RWYWx1ZSBPcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duWmVybywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSBjb25zdCB7CisgIGFzc2VydCgoT3AuZ2V0T3Bjb2RlKCkgPj0gSVNEOjpCVUlMVElOX09QX0VORCB8fAorICAgICAgICAgIE9wLmdldE9wY29kZSgpID09IElTRDo6SU5UUklOU0lDX1dPX0NIQUlOIHx8CisgICAgICAgICAgT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpJTlRSSU5TSUNfV19DSEFJTiB8fAorICAgICAgICAgIE9wLmdldE9wY29kZSgpID09IElTRDo6SU5UUklOU0lDX1ZPSUQpICYmCisgICAgICAgICAiU2hvdWxkIHVzZSBNYXNrZWRWYWx1ZUlzWmVybyBpZiB5b3UgZG9uJ3Qga25vdyB3aGV0aGVyIE9wIgorICAgICAgICAgIiBpcyBhIHRhcmdldCBub2RlISIpOworICBLbm93blplcm8gPSBLbm93bk9uZSA9IEFQSW50KE1hc2suZ2V0Qml0V2lkdGgoKSwgMCk7Cit9CisKKy8vLyBDb21wdXRlTnVtU2lnbkJpdHNGb3JUYXJnZXROb2RlIC0gVGhpcyBtZXRob2QgY2FuIGJlIGltcGxlbWVudGVkIGJ5CisvLy8gdGFyZ2V0cyB0aGF0IHdhbnQgdG8gZXhwb3NlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgc2lnbiBiaXRzIHRvIHRoZQorLy8vIERBRyBDb21iaW5lci4KK3Vuc2lnbmVkIFRhcmdldExvd2VyaW5nOjpDb21wdXRlTnVtU2lnbkJpdHNGb3JUYXJnZXROb2RlKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCkgY29uc3QgeworICBhc3NlcnQoKE9wLmdldE9wY29kZSgpID49IElTRDo6QlVJTFRJTl9PUF9FTkQgfHwKKyAgICAgICAgICBPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiB8fAorICAgICAgICAgIE9wLmdldE9wY29kZSgpID09IElTRDo6SU5UUklOU0lDX1dfQ0hBSU4gfHwKKyAgICAgICAgICBPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OklOVFJJTlNJQ19WT0lEKSAmJgorICAgICAgICAgIlNob3VsZCB1c2UgQ29tcHV0ZU51bVNpZ25CaXRzIGlmIHlvdSBkb24ndCBrbm93IHdoZXRoZXIgT3AiCisgICAgICAgICAiIGlzIGEgdGFyZ2V0IG5vZGUhIik7CisgIHJldHVybiAxOworfQorCisvLy8gVmFsdWVIYXNFeGFjdGx5T25lQml0U2V0IC0gVGVzdCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMga25vd24gdG8gaGF2ZSBleGFjdGx5CisvLy8gb25lIGJpdCBzZXQuIFRoaXMgZGlmZmVycyBmcm9tIENvbXB1dGVNYXNrZWRCaXRzIGluIHRoYXQgaXQgZG9lc24ndCBuZWVkIHRvCisvLy8gZGV0ZXJtaW5lIHdoaWNoIGJpdCBpcyBzZXQuCisvLy8KK3N0YXRpYyBib29sIFZhbHVlSGFzRXhhY3RseU9uZUJpdFNldChTRFZhbHVlIFZhbCwgY29uc3QgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgLy8gQSBsZWZ0LXNoaWZ0IG9mIGEgY29uc3RhbnQgb25lIHdpbGwgaGF2ZSBleGFjdGx5IG9uZSBiaXQgc2V0LCBiZWNhdXNlCisgIC8vIHNoaWZ0aW5nIHRoZSBiaXQgb2ZmIHRoZSBlbmQgaXMgdW5kZWZpbmVkLgorICBpZiAoVmFsLmdldE9wY29kZSgpID09IElTRDo6U0hMKQorICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9CisgICAgICAgICBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oVmFsLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICBpZiAoQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDEpCisgICAgICAgIHJldHVybiB0cnVlOworCisgIC8vIFNpbWlsYXJseSwgYSByaWdodC1zaGlmdCBvZiBhIGNvbnN0YW50IHNpZ24tYml0IHdpbGwgaGF2ZSBleGFjdGx5CisgIC8vIG9uZSBiaXQgc2V0LgorICBpZiAoVmFsLmdldE9wY29kZSgpID09IElTRDo6U1JMKQorICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9CisgICAgICAgICBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oVmFsLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICBpZiAoQy0+Z2V0QVBJbnRWYWx1ZSgpLmlzU2lnbkJpdCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBNb3JlIGNvdWxkIGJlIGRvbmUgaGVyZSwgdGhvdWdoIHRoZSBhYm92ZSBjaGVja3MgYXJlIGVub3VnaAorICAvLyB0byBoYW5kbGUgc29tZSBjb21tb24gY2FzZXMuCisKKyAgLy8gRmFsbCBiYWNrIHRvIENvbXB1dGVNYXNrZWRCaXRzIHRvIGNhdGNoIG90aGVyIGtub3duIGNhc2VzLgorICBFVlQgT3BWVCA9IFZhbC5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgQml0V2lkdGggPSBPcFZULmdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIEFQSW50IE1hc2sgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKTsKKyAgQVBJbnQgS25vd25aZXJvLCBLbm93bk9uZTsKKyAgREFHLkNvbXB1dGVNYXNrZWRCaXRzKFZhbCwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSk7CisgIHJldHVybiAoS25vd25aZXJvLmNvdW50UG9wdWxhdGlvbigpID09IEJpdFdpZHRoIC0gMSkgJiYKKyAgICAgICAgIChLbm93bk9uZS5jb3VudFBvcHVsYXRpb24oKSA9PSAxKTsKK30KKworLy8vIFNpbXBsaWZ5U2V0Q0MgLSBUcnkgdG8gc2ltcGxpZnkgYSBzZXRjYyBidWlsdCB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmFuZHMgCisvLy8gYW5kIGNjLiBJZiBpdCBpcyB1bmFibGUgdG8gc2ltcGxpZnkgaXQsIHJldHVybiBhIG51bGwgU0RWYWx1ZS4KK1NEVmFsdWUKK1RhcmdldExvd2VyaW5nOjpTaW1wbGlmeVNldENDKEVWVCBWVCwgU0RWYWx1ZSBOMCwgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Q29uZENvZGUgQ29uZCwgYm9vbCBmb2xkQm9vbGVhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUdDb21iaW5lckluZm8gJkRDSSwgRGVidWdMb2MgZGwpIGNvbnN0IHsKKyAgU2VsZWN0aW9uREFHICZEQUcgPSBEQ0kuREFHOworICBMTFZNQ29udGV4dCAmQ29udGV4dCA9ICpEQUcuZ2V0Q29udGV4dCgpOworCisgIC8vIFRoZXNlIHNldGNjIG9wZXJhdGlvbnMgYWx3YXlzIGZvbGQuCisgIHN3aXRjaCAoQ29uZCkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVEZBTFNFOgorICBjYXNlIElTRDo6U0VURkFMU0UyOiByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgY2FzZSBJU0Q6OlNFVFRSVUU6CisgIGNhc2UgSVNEOjpTRVRUUlVFMjogIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoMSwgVlQpOworICB9CisKKyAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oTjAuZ2V0Tm9kZSgpKSkgeworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjb25zdGFudCBvY2N1cnMgb24gdGhlIFJIUywgYW5kIGZvbGQgY29uc3RhbnQKKyAgICAvLyBjb21wYXJpc29ucy4KKyAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgTjEsIE4wLCBJU0Q6OmdldFNldENDU3dhcHBlZE9wZXJhbmRzKENvbmQpKTsKKyAgfQorCisgIGlmIChDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xLmdldE5vZGUoKSkpIHsKKyAgICBjb25zdCBBUEludCAmQzEgPSBOMUMtPmdldEFQSW50VmFsdWUoKTsKKworICAgIC8vIElmIHRoZSBMSFMgaXMgJyhzcmwgKGN0bHogeCksIDUpJywgdGhlIFJIUyBpcyAwLzEsIGFuZCB0aGlzIGlzIGFuCisgICAgLy8gZXF1YWxpdHkgY29tcGFyaXNvbiwgdGhlbiB3ZSdyZSBqdXN0IGNvbXBhcmluZyB3aGV0aGVyIFggaXRzZWxmIGlzCisgICAgLy8gemVyby4KKyAgICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkwgJiYgKEMxID09IDAgfHwgQzEgPT0gMSkgJiYKKyAgICAgICAgTjAuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNUTFogJiYKKyAgICAgICAgTjAuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50KSB7CisgICAgICBjb25zdCBBUEludCAmU2hBbXQKKyAgICAgICAgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKS0+Z2V0QVBJbnRWYWx1ZSgpOworICAgICAgaWYgKChDb25kID09IElTRDo6U0VURVEgfHwgQ29uZCA9PSBJU0Q6OlNFVE5FKSAmJgorICAgICAgICAgIFNoQW10ID09IExvZzJfMzIoTjAuZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpKSkgeworICAgICAgICBpZiAoKEMxID09IDApID09IChDb25kID09IElTRDo6U0VURVEpKSB7CisgICAgICAgICAgLy8gKHNybCAoY3RseiB4KSwgNSkgPT0gMCAgLT4gWCAhPSAwCisgICAgICAgICAgLy8gKHNybCAoY3RseiB4KSwgNSkgIT0gMSAgLT4gWCAhPSAwCisgICAgICAgICAgQ29uZCA9IElTRDo6U0VUTkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gKHNybCAoY3RseiB4KSwgNSkgIT0gMCAgLT4gWCA9PSAwCisgICAgICAgICAgLy8gKHNybCAoY3RseiB4KSwgNSkgPT0gMSAgLT4gWCA9PSAwCisgICAgICAgICAgQ29uZCA9IElTRDo6U0VURVE7CisgICAgICAgIH0KKyAgICAgICAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50KDAsIE4wLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBaZXJvLCBDb25kKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgTEhTIGlzICcoYW5kIGxvYWQsIGNvbnN0KScsIHRoZSBSSFMgaXMgMCwKKyAgICAvLyB0aGUgdGVzdCBpcyBmb3IgZXF1YWxpdHkgb3IgdW5zaWduZWQsIGFuZCBhbGwgMSBiaXRzIG9mIHRoZSBjb25zdCBhcmUKKyAgICAvLyBpbiB0aGUgc2FtZSBwYXJ0aWFsIHdvcmQsIHNlZSBpZiB3ZSBjYW4gc2hvcnRlbiB0aGUgbG9hZC4KKyAgICBpZiAoRENJLmlzQmVmb3JlTGVnYWxpemUoKSAmJgorICAgICAgICBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCAmJiBDMSA9PSAwICYmCisgICAgICAgIE4wLmdldE5vZGUoKS0+aGFzT25lVXNlKCkgJiYKKyAgICAgICAgaXNhPExvYWRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgIE4wLmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSAmJgorICAgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBMb2FkU0ROb2RlICpMb2QgPSBjYXN0PExvYWRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMCkpOworICAgICAgQVBJbnQgYmVzdE1hc2s7CisgICAgICB1bnNpZ25lZCBiZXN0V2lkdGggPSAwLCBiZXN0T2Zmc2V0ID0gMDsKKyAgICAgIGlmICghTG9kLT5pc1ZvbGF0aWxlKCkgJiYgTG9kLT5pc1VuaW5kZXhlZCgpKSB7CisgICAgICAgIHVuc2lnbmVkIG9yaWdXaWR0aCA9IE4wLmdldFZhbHVlVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICAgICAgdW5zaWduZWQgbWFza1dpZHRoID0gb3JpZ1dpZHRoOworICAgICAgICAvLyBXZSBjYW4gbmFycm93IChlLmcuKSAxNi1iaXQgZXh0ZW5kaW5nIGxvYWRzIG9uIDMyLWJpdCB0YXJnZXQgdG8gCisgICAgICAgIC8vIDggYml0cywgYnV0IGhhdmUgdG8gYmUgY2FyZWZ1bC4uLgorICAgICAgICBpZiAoTG9kLT5nZXRFeHRlbnNpb25UeXBlKCkgIT0gSVNEOjpOT05fRVhUTE9BRCkKKyAgICAgICAgICBvcmlnV2lkdGggPSBMb2QtPmdldE1lbW9yeVZUKCkuZ2V0U2l6ZUluQml0cygpOworICAgICAgICBjb25zdCBBUEludCAmTWFzayA9CisgICAgICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgxKSktPmdldEFQSW50VmFsdWUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCB3aWR0aCA9IG9yaWdXaWR0aCAvIDI7IHdpZHRoPj04OyB3aWR0aCAvPSAyKSB7CisgICAgICAgICAgQVBJbnQgbmV3TWFzayA9IEFQSW50OjpnZXRMb3dCaXRzU2V0KG1hc2tXaWR0aCwgd2lkdGgpOworICAgICAgICAgIGZvciAodW5zaWduZWQgb2Zmc2V0PTA7IG9mZnNldDxvcmlnV2lkdGgvd2lkdGg7IG9mZnNldCsrKSB7CisgICAgICAgICAgICBpZiAoKG5ld01hc2sgJiBNYXNrKSA9PSBNYXNrKSB7CisgICAgICAgICAgICAgIGlmICghVEQtPmlzTGl0dGxlRW5kaWFuKCkpCisgICAgICAgICAgICAgICAgYmVzdE9mZnNldCA9IChvcmlnV2lkdGgvd2lkdGggLSBvZmZzZXQgLSAxKSAqICh3aWR0aC84KTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJlc3RPZmZzZXQgPSAodWludDY0X3Qpb2Zmc2V0ICogKHdpZHRoLzgpOworICAgICAgICAgICAgICBiZXN0TWFzayA9IE1hc2subHNocihvZmZzZXQgKiAod2lkdGgvOCkgKiA4KTsKKyAgICAgICAgICAgICAgYmVzdFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3TWFzayA9IG5ld01hc2sgPDwgd2lkdGg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoYmVzdFdpZHRoKSB7CisgICAgICAgIEVWVCBuZXdWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKENvbnRleHQsIGJlc3RXaWR0aCk7CisgICAgICAgIGlmIChuZXdWVC5pc1JvdW5kKCkpIHsKKyAgICAgICAgICBFVlQgUHRyVHlwZSA9IExvZC0+Z2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgICAgICBTRFZhbHVlIFB0ciA9IExvZC0+Z2V0QmFzZVB0cigpOworICAgICAgICAgIGlmIChiZXN0T2Zmc2V0ICE9IDApCisgICAgICAgICAgICBQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clR5cGUsIExvZC0+Z2V0QmFzZVB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KGJlc3RPZmZzZXQsIFB0clR5cGUpKTsKKyAgICAgICAgICB1bnNpZ25lZCBOZXdBbGlnbiA9IE1pbkFsaWduKExvZC0+Z2V0QWxpZ25tZW50KCksIGJlc3RPZmZzZXQpOworICAgICAgICAgIFNEVmFsdWUgTmV3TG9hZCA9IERBRy5nZXRMb2FkKG5ld1ZULCBkbCwgTG9kLT5nZXRDaGFpbigpLCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9kLT5nZXRTcmNWYWx1ZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2QtPmdldFNyY1ZhbHVlT2Zmc2V0KCkgKyBiZXN0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgTmV3QWxpZ24pOworICAgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgbmV3VlQsIE5ld0xvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChiZXN0TWFzay50cnVuYyhiZXN0V2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VlQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwTEwsIG5ld1ZUKSwgQ29uZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgTEhTIGlzIGEgWkVST19FWFRFTkQsIHBlcmZvcm0gdGhlIGNvbXBhcmlzb24gb24gdGhlIGlucHV0LgorICAgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlpFUk9fRVhURU5EKSB7CisgICAgICB1bnNpZ25lZCBJblNpemUgPSBOMC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKworICAgICAgLy8gSWYgdGhlIGNvbXBhcmlzb24gY29uc3RhbnQgaGFzIGJpdHMgaW4gdGhlIHVwcGVyIHBhcnQsIHRoZQorICAgICAgLy8gemVyby1leHRlbmRlZCB2YWx1ZSBjb3VsZCBuZXZlciBtYXRjaC4KKyAgICAgIGlmIChDMS5pbnRlcnNlY3RzKEFQSW50OjpnZXRIaWdoQml0c1NldChDMS5nZXRCaXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMxLmdldEJpdFdpZHRoKCkgLSBJblNpemUpKSkgeworICAgICAgICBzd2l0Y2ggKENvbmQpIHsKKyAgICAgICAgY2FzZSBJU0Q6OlNFVFVHVDoKKyAgICAgICAgY2FzZSBJU0Q6OlNFVFVHRToKKyAgICAgICAgY2FzZSBJU0Q6OlNFVEVROiByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgICAgICAgY2FzZSBJU0Q6OlNFVFVMVDoKKyAgICAgICAgY2FzZSBJU0Q6OlNFVFVMRToKKyAgICAgICAgY2FzZSBJU0Q6OlNFVE5FOiByZXR1cm4gREFHLmdldENvbnN0YW50KDEsIFZUKTsKKyAgICAgICAgY2FzZSBJU0Q6OlNFVEdUOgorICAgICAgICBjYXNlIElTRDo6U0VUR0U6CisgICAgICAgICAgLy8gVHJ1ZSBpZiB0aGUgc2lnbiBiaXQgb2YgQzEgaXMgc2V0LgorICAgICAgICAgIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoQzEuaXNOZWdhdGl2ZSgpLCBWVCk7CisgICAgICAgIGNhc2UgSVNEOjpTRVRMVDoKKyAgICAgICAgY2FzZSBJU0Q6OlNFVExFOgorICAgICAgICAgIC8vIFRydWUgaWYgdGhlIHNpZ24gYml0IG9mIEMxIGlzbid0IHNldC4KKyAgICAgICAgICByZXR1cm4gREFHLmdldENvbnN0YW50KEMxLmlzTm9uTmVnYXRpdmUoKSwgVlQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIE90aGVyd2lzZSwgd2UgY2FuIHBlcmZvcm0gdGhlIGNvbXBhcmlzb24gd2l0aCB0aGUgbG93IGJpdHMuCisgICAgICBzd2l0Y2ggKENvbmQpIHsKKyAgICAgIGNhc2UgSVNEOjpTRVRFUToKKyAgICAgIGNhc2UgSVNEOjpTRVRORToKKyAgICAgIGNhc2UgSVNEOjpTRVRVR1Q6CisgICAgICBjYXNlIElTRDo6U0VUVUdFOgorICAgICAgY2FzZSBJU0Q6OlNFVFVMVDoKKyAgICAgIGNhc2UgSVNEOjpTRVRVTEU6IHsKKyAgICAgICAgRVZUIG5ld1ZUID0gTjAuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgICAgaWYgKERDSS5pc0JlZm9yZUxlZ2FsaXplT3BzKCkgfHwKKyAgICAgICAgICAgIChpc09wZXJhdGlvbkxlZ2FsKElTRDo6U0VUQ0MsIG5ld1ZUKSAmJgorICAgICAgICAgICAgICBnZXRDb25kQ29kZUFjdGlvbihDb25kLCBuZXdWVCk9PUxlZ2FsKSkKKyAgICAgICAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChBUEludChDMSkudHJ1bmMoSW5TaXplKSwgbmV3VlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7ICAgLy8gdG9kbywgYmUgbW9yZSBjYXJlZnVsIHdpdGggc2lnbmVkIGNvbXBhcmlzb25zCisgICAgICB9CisgICAgfSBlbHNlIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNJR05fRVhURU5EX0lOUkVHICYmCisgICAgICAgICAgICAgICAoQ29uZCA9PSBJU0Q6OlNFVEVRIHx8IENvbmQgPT0gSVNEOjpTRVRORSkpIHsKKyAgICAgIEVWVCBFeHRTcmNUeSA9IGNhc3Q8VlRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpLT5nZXRWVCgpOworICAgICAgdW5zaWduZWQgRXh0U3JjVHlCaXRzID0gRXh0U3JjVHkuZ2V0U2l6ZUluQml0cygpOworICAgICAgRVZUIEV4dERzdFR5ID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisgICAgICB1bnNpZ25lZCBFeHREc3RUeUJpdHMgPSBFeHREc3RUeS5nZXRTaXplSW5CaXRzKCk7CisKKyAgICAgIC8vIElmIHRoZSBjb25zdGFudCBkb2Vzbid0IGZpdCBpbnRvIHRoZSBudW1iZXIgb2YgYml0cyBmb3IgdGhlIHNvdXJjZSBvZgorICAgICAgLy8gdGhlIHNpZ24gZXh0ZW5zaW9uLCBpdCBpcyBpbXBvc3NpYmxlIGZvciBib3RoIHNpZGVzIHRvIGJlIGVxdWFsLgorICAgICAgaWYgKEMxLmdldE1pblNpZ25lZEJpdHMoKSA+IEV4dFNyY1R5Qml0cykKKyAgICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudChDb25kID09IElTRDo6U0VUTkUsIFZUKTsKKyAgICAgIAorICAgICAgU0RWYWx1ZSBaZXh0T3A7CisgICAgICBFVlQgT3AwVHkgPSBOMC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgICAgaWYgKE9wMFR5ID09IEV4dFNyY1R5KSB7CisgICAgICAgIFpleHRPcCA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBUEludCBJbW0gPSBBUEludDo6Z2V0TG93Qml0c1NldChFeHREc3RUeUJpdHMsIEV4dFNyY1R5Qml0cyk7CisgICAgICAgIFpleHRPcCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgT3AwVHksIE4wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSW1tLCBPcDBUeSkpOworICAgICAgfQorICAgICAgaWYgKCFEQ0kuaXNDYWxsZWRCeUxlZ2FsaXplcigpKQorICAgICAgICBEQ0kuQWRkVG9Xb3JrbGlzdChaZXh0T3AuZ2V0Tm9kZSgpKTsKKyAgICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGlzIGEgdXNlIG9mIGEgemV4dC4KKyAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBaZXh0T3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQzEgJiBBUEludDo6Z2V0TG93Qml0c1NldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0RHN0VHlCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRTcmNUeUJpdHMpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dERzdFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZCk7CisgICAgfSBlbHNlIGlmICgoTjFDLT5pc051bGxWYWx1ZSgpIHx8IE4xQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDEpICYmCisgICAgICAgICAgICAgICAgKENvbmQgPT0gSVNEOjpTRVRFUSB8fCBDb25kID09IElTRDo6U0VUTkUpKSB7CisgICAgICAvLyBTRVRDQyAoU0VUQ0MpLCBbMHwxXSwgW0VRfE5FXSAgLT4gU0VUQ0MKKyAgICAgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNFVENDICYmCisgICAgICAgICAgaXNUeXBlTGVnYWwoVlQpICYmIFZULmJpdHNMRShOMC5nZXRWYWx1ZVR5cGUoKSkpIHsKKyAgICAgICAgYm9vbCBUcnVlV2hlblRydWUgPSAoQ29uZCA9PSBJU0Q6OlNFVEVRKSBeIChOMUMtPmdldEFQSW50VmFsdWUoKSAhPSAxKTsKKyAgICAgICAgaWYgKFRydWVXaGVuVHJ1ZSkKKyAgICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFZULCBOMCk7ICAgICAgICAKKyAgICAgICAgLy8gSW52ZXJ0IHRoZSBjb25kaXRpb24uCisgICAgICAgIElTRDo6Q29uZENvZGUgQ0MgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihOMC5nZXRPcGVyYW5kKDIpKS0+Z2V0KCk7CisgICAgICAgIENDID0gSVNEOjpnZXRTZXRDQ0ludmVyc2UoQ0MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuaXNJbnRlZ2VyKCkpOworICAgICAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSwgTjAuZ2V0T3BlcmFuZCgxKSwgQ0MpOworICAgICAgfQorCisgICAgICBpZiAoKE4wLmdldE9wY29kZSgpID09IElTRDo6WE9SIHx8CisgICAgICAgICAgIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCAmJiAKKyAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpYT1IgJiYKKyAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMSkgPT0gTjAuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDEpKSkgJiYKKyAgICAgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgxKSktPmdldEFQSW50VmFsdWUoKSA9PSAxKSB7CisgICAgICAgIC8vIElmIHRoaXMgaXMgKFheMSkgPT0gMC8xLCBzd2FwIHRoZSBSSFMgYW5kIGVsaW1pbmF0ZSB0aGUgeG9yLiAgV2UKKyAgICAgICAgLy8gY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgdG9wIGJpdHMgYXJlIGtub3duIHplcm8uCisgICAgICAgIHVuc2lnbmVkIEJpdFdpZHRoID0gTjAuZ2V0VmFsdWVTaXplSW5CaXRzKCk7CisgICAgICAgIGlmIChEQUcuTWFza2VkVmFsdWVJc1plcm8oTjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRXaWR0aC0xKSkpIHsKKyAgICAgICAgICAvLyBPa2F5LCBnZXQgdGhlIHVuLWludmVydGVkIGlucHV0IHZhbHVlLgorICAgICAgICAgIFNEVmFsdWUgVmFsOworICAgICAgICAgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlhPUikKKyAgICAgICAgICAgIFZhbCA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTkQgJiYgCisgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpYT1IpOworICAgICAgICAgICAgLy8gKChYXjEpJjEpXjEgLT4gWCAmIDEKKyAgICAgICAgICAgIFZhbCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTjAuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMC5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgVmFsLCBOMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmQgPT0gSVNEOjpTRVRFUSA/IElTRDo6U0VUTkUgOiBJU0Q6OlNFVEVRKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChOMUMtPmdldEFQSW50VmFsdWUoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgIChWVCA9PSBNVlQ6OmkxIHx8CisgICAgICAgICAgICAgICAgICBnZXRCb29sZWFuQ29udGVudHMoKSA9PSBaZXJvT3JPbmVCb29sZWFuQ29udGVudCkpIHsKKyAgICAgICAgU0RWYWx1ZSBPcDAgPSBOMDsKKyAgICAgICAgaWYgKE9wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFKQorICAgICAgICAgIE9wMCA9IE9wMC5nZXRPcGVyYW5kKDApOworCisgICAgICAgIGlmICgoT3AwLmdldE9wY29kZSgpID09IElTRDo6WE9SKSAmJgorICAgICAgICAgICAgT3AwLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQyAmJgorICAgICAgICAgICAgT3AwLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQykgeworICAgICAgICAgIC8vICh4b3IgKHNldGNjKSwgKHNldGNjKSkgPT0gLyAhPSAxIC0+IChzZXRjYykgIT0gLyA9PSAoc2V0Y2MpCisgICAgICAgICAgQ29uZCA9IChDb25kID09IElTRDo6U0VURVEpID8gSVNEOjpTRVRORSA6IElTRDo6U0VURVE7CisgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE9wMC5nZXRPcGVyYW5kKDApLCBPcDAuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmQpOworICAgICAgICB9IGVsc2UgaWYgKE9wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCAmJgorICAgICAgICAgICAgICAgIGlzYTxDb25zdGFudFNETm9kZT4oT3AwLmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oT3AwLmdldE9wZXJhbmQoMSkpLT5nZXRBUEludFZhbHVlKCkgPT0gMSkgeworICAgICAgICAgIC8vIElmIHRoaXMgaXMgKFgmMSkgPT0gLyAhPSAxLCBub3JtYWxpemUgaXQgdG8gKFgmMSkgIT0gLyA9PSAwLgorICAgICAgICAgIGlmIChPcDAuZ2V0VmFsdWVUeXBlKCkuYml0c0dUKFZUKSkKKyAgICAgICAgICAgIE9wMCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBWVCwgT3AwLmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgVlQpKTsKKyAgICAgICAgICBlbHNlIGlmIChPcDAuZ2V0VmFsdWVUeXBlKCkuYml0c0xUKFZUKSkKKyAgICAgICAgICAgIE9wMCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLCBWVCwgT3AwLmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIFZUKSk7CisKKyAgICAgICAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE9wMC5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kID09IElTRDo6U0VURVEgPyBJU0Q6OlNFVE5FIDogSVNEOjpTRVRFUSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgQVBJbnQgTWluVmFsLCBNYXhWYWw7CisgICAgdW5zaWduZWQgT3BlcmFuZEJpdFNpemUgPSBOMUMtPmdldFZhbHVlVHlwZSgwKS5nZXRTaXplSW5CaXRzKCk7CisgICAgaWYgKElTRDo6aXNTaWduZWRJbnRTZXRDQyhDb25kKSkgeworICAgICAgTWluVmFsID0gQVBJbnQ6OmdldFNpZ25lZE1pblZhbHVlKE9wZXJhbmRCaXRTaXplKTsKKyAgICAgIE1heFZhbCA9IEFQSW50OjpnZXRTaWduZWRNYXhWYWx1ZShPcGVyYW5kQml0U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE1pblZhbCA9IEFQSW50OjpnZXRNaW5WYWx1ZShPcGVyYW5kQml0U2l6ZSk7CisgICAgICBNYXhWYWwgPSBBUEludDo6Z2V0TWF4VmFsdWUoT3BlcmFuZEJpdFNpemUpOworICAgIH0KKworICAgIC8vIENhbm9uaWNhbGl6ZSBHRS9MRSBjb21wYXJpc29ucyB0byB1c2UgR1QvTFQgY29tcGFyaXNvbnMuCisgICAgaWYgKENvbmQgPT0gSVNEOjpTRVRHRSB8fCBDb25kID09IElTRDo6U0VUVUdFKSB7CisgICAgICBpZiAoQzEgPT0gTWluVmFsKSByZXR1cm4gREFHLmdldENvbnN0YW50KDEsIFZUKTsgICAvLyBYID49IE1JTiAtLT4gdHJ1ZQorICAgICAgLy8gWCA+PSBDMCAtLT4gWCA+IChDMC0xKQorICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEMxLTEsIE4xLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbmQgPT0gSVNEOjpTRVRHRSkgPyBJU0Q6OlNFVEdUIDogSVNEOjpTRVRVR1QpOworICAgIH0KKworICAgIGlmIChDb25kID09IElTRDo6U0VUTEUgfHwgQ29uZCA9PSBJU0Q6OlNFVFVMRSkgeworICAgICAgaWYgKEMxID09IE1heFZhbCkgcmV0dXJuIERBRy5nZXRDb25zdGFudCgxLCBWVCk7ICAgLy8gWCA8PSBNQVggLS0+IHRydWUKKyAgICAgIC8vIFggPD0gQzAgLS0+IFggPCAoQzArMSkKKyAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChDMSsxLCBOMS5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChDb25kID09IElTRDo6U0VUTEUpID8gSVNEOjpTRVRMVCA6IElTRDo6U0VUVUxUKTsKKyAgICB9CisKKyAgICBpZiAoKENvbmQgPT0gSVNEOjpTRVRMVCB8fCBDb25kID09IElTRDo6U0VUVUxUKSAmJiBDMSA9PSBNaW5WYWwpCisgICAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIFZUKTsgICAgICAvLyBYIDwgTUlOIC0tPiBmYWxzZQorICAgIGlmICgoQ29uZCA9PSBJU0Q6OlNFVEdFIHx8IENvbmQgPT0gSVNEOjpTRVRVR0UpICYmIEMxID09IE1pblZhbCkKKyAgICAgIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoMSwgVlQpOyAgICAgIC8vIFggPj0gTUlOIC0tPiB0cnVlCisgICAgaWYgKChDb25kID09IElTRDo6U0VUR1QgfHwgQ29uZCA9PSBJU0Q6OlNFVFVHVCkgJiYgQzEgPT0gTWF4VmFsKQorICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudCgwLCBWVCk7ICAgICAgLy8gWCA+IE1BWCAtLT4gZmFsc2UKKyAgICBpZiAoKENvbmQgPT0gSVNEOjpTRVRMRSB8fCBDb25kID09IElTRDo6U0VUVUxFKSAmJiBDMSA9PSBNYXhWYWwpCisgICAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDEsIFZUKTsgICAgICAvLyBYIDw9IE1BWCAtLT4gdHJ1ZQorCisgICAgLy8gQ2Fub25pY2FsaXplIHNldGd0IFgsIE1pbiAtLT4gc2V0bmUgWCwgTWluCisgICAgaWYgKChDb25kID09IElTRDo6U0VUR1QgfHwgQ29uZCA9PSBJU0Q6OlNFVFVHVCkgJiYgQzEgPT0gTWluVmFsKQorICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRORSk7CisgICAgLy8gQ2Fub25pY2FsaXplIHNldGx0IFgsIE1heCAtLT4gc2V0bmUgWCwgTWF4CisgICAgaWYgKChDb25kID09IElTRDo6U0VUTFQgfHwgQ29uZCA9PSBJU0Q6OlNFVFVMVCkgJiYgQzEgPT0gTWF4VmFsKQorICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRORSk7CisKKyAgICAvLyBJZiB3ZSBoYXZlIHNldHVsdCBYLCAxLCB0dXJuIGl0IGludG8gc2V0ZXEgWCwgMAorICAgIGlmICgoQ29uZCA9PSBJU0Q6OlNFVExUIHx8IENvbmQgPT0gSVNEOjpTRVRVTFQpICYmIEMxID09IE1pblZhbCsxKQorICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE1pblZhbCwgTjAuZ2V0VmFsdWVUeXBlKCkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRFUSk7CisgICAgLy8gSWYgd2UgaGF2ZSBzZXR1Z3QgWCwgTWF4LTEsIHR1cm4gaXQgaW50byBzZXRlcSBYLCBNYXgKKyAgICBlbHNlIGlmICgoQ29uZCA9PSBJU0Q6OlNFVEdUIHx8IENvbmQgPT0gSVNEOjpTRVRVR1QpICYmIEMxID09IE1heFZhbC0xKQorICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE1heFZhbCwgTjAuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OlNFVEVRKTsKKworICAgIC8vIElmIHdlIGhhdmUgInNldGNjIFgsIEMwIiwgY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBzaHJpbmsgdGhlIGltbWVkaWF0ZQorICAgIC8vIGJ5IGNoYW5naW5nIGNjLgorCisgICAgLy8gU0VUVUdUIFgsIFNJTlRNQVggIC0+IFNFVExUIFgsIDAKKyAgICBpZiAoQ29uZCA9PSBJU0Q6OlNFVFVHVCAmJiAKKyAgICAgICAgQzEgPT0gQVBJbnQ6OmdldFNpZ25lZE1heFZhbHVlKE9wZXJhbmRCaXRTaXplKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBOMS5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUTFQpOworCisgICAgLy8gU0VUVUxUIFgsIFNJTlRNSU4gIC0+IFNFVEdUIFgsIC0xCisgICAgaWYgKENvbmQgPT0gSVNEOjpTRVRVTFQgJiYKKyAgICAgICAgQzEgPT0gQVBJbnQ6OmdldFNpZ25lZE1pblZhbHVlKE9wZXJhbmRCaXRTaXplKSkgeworICAgICAgU0RWYWx1ZSBDb25zdE1pbnVzT25lID0KKyAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShPcGVyYW5kQml0U2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE4xLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMCwgQ29uc3RNaW51c09uZSwgSVNEOjpTRVRHVCk7CisgICAgfQorCisgICAgLy8gRm9sZCBiaXQgY29tcGFyaXNvbnMgd2hlbiB3ZSBjYW4uCisgICAgaWYgKChDb25kID09IElTRDo6U0VURVEgfHwgQ29uZCA9PSBJU0Q6OlNFVE5FKSAmJgorICAgICAgICAoVlQgPT0gTjAuZ2V0VmFsdWVUeXBlKCkgfHwKKyAgICAgICAgIChpc1R5cGVMZWdhbChWVCkgJiYgVlQuYml0c0xFKE4wLmdldFZhbHVlVHlwZSgpKSkpICYmCisgICAgICAgIE4wLmdldE9wY29kZSgpID09IElTRDo6QU5EKQorICAgICAgaWYgKENvbnN0YW50U0ROb2RlICpBbmRSSFMgPQorICAgICAgICAgICAgICAgICAgZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgIEVWVCBTaGlmdFR5ID0gRENJLmlzQmVmb3JlTGVnYWxpemUoKSA/CisgICAgICAgICAgZ2V0UG9pbnRlclR5KCkgOiBnZXRTaGlmdEFtb3VudFR5KCk7CisgICAgICAgIGlmIChDb25kID09IElTRDo6U0VUTkUgJiYgQzEgPT0gMCkgey8vIChYICYgOCkgIT0gMCAgLS0+ICAoWCAmIDgpID4+IDMKKyAgICAgICAgICAvLyBQZXJmb3JtIHRoZSB4Zm9ybSBpZiB0aGUgQU5EIFJIUyBpcyBhIHNpbmdsZSBiaXQuCisgICAgICAgICAgaWYgKEFuZFJIUy0+Z2V0QVBJbnRWYWx1ZSgpLmlzUG93ZXJPZjIoKSkgeworICAgICAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTjAuZ2V0VmFsdWVUeXBlKCksIE4wLAorICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChBbmRSSFMtPmdldEFQSW50VmFsdWUoKS5sb2dCYXNlMigpLCBTaGlmdFR5KSkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChDb25kID09IElTRDo6U0VURVEgJiYgQzEgPT0gQW5kUkhTLT5nZXRBUEludFZhbHVlKCkpIHsKKyAgICAgICAgICAvLyAoWCAmIDgpID09IDggIC0tPiAgKFggJiA4KSA+PiAzCisgICAgICAgICAgLy8gUGVyZm9ybSB0aGUgeGZvcm0gaWYgQzEgaXMgYSBzaW5nbGUgYml0LgorICAgICAgICAgIGlmIChDMS5pc1Bvd2VyT2YyKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBOMC5nZXRWYWx1ZVR5cGUoKSwgTjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChDMS5sb2dCYXNlMigpLCBTaGlmdFR5KSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICB9CisKKyAgaWYgKGlzYTxDb25zdGFudEZQU0ROb2RlPihOMC5nZXROb2RlKCkpKSB7CisgICAgLy8gQ29uc3RhbnQgZm9sZCBvciBjb21tdXRlIHNldGNjLgorICAgIFNEVmFsdWUgTyA9IERBRy5Gb2xkU2V0Q0MoVlQsIE4wLCBOMSwgQ29uZCwgZGwpOworICAgIGlmIChPLmdldE5vZGUoKSkgcmV0dXJuIE87CisgIH0gZWxzZSBpZiAoQ29uc3RhbnRGUFNETm9kZSAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTjEuZ2V0Tm9kZSgpKSkgeworICAgIC8vIElmIHRoZSBSSFMgb2YgYW4gRlAgY29tcGFyaXNvbiBpcyBhIGNvbnN0YW50LCBzaW1wbGlmeSBpdCBhd2F5IGluCisgICAgLy8gc29tZSBjYXNlcy4KKyAgICBpZiAoQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzTmFOKCkpIHsKKyAgICAgIC8vIElmIGFuIG9wZXJhbmQgaXMga25vd24gdG8gYmUgYSBuYW4sIHdlIGNhbiBmb2xkIGl0LgorICAgICAgc3dpdGNoIChJU0Q6OmdldFVub3JkZXJlZEZsYXZvcihDb25kKSkgeworICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBmbGF2b3IhIik7CisgICAgICBjYXNlIDA6ICAvLyBLbm93biBmYWxzZS4KKyAgICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudCgwLCBWVCk7CisgICAgICBjYXNlIDE6ICAvLyBLbm93biB0cnVlLgorICAgICAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDEsIFZUKTsKKyAgICAgIGNhc2UgMjogIC8vIFVuZGVmaW5lZC4KKyAgICAgICAgcmV0dXJuIERBRy5nZXRVTkRFRihWVCk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIE90aGVyd2lzZSwgd2Uga25vdyB0aGUgUkhTIGlzIG5vdCBhIE5hTi4gIFNpbXBsaWZ5IHRoZSBub2RlIHRvIGRyb3AgdGhlCisgICAgLy8gY29uc3RhbnQgaWYga25vd2luZyB0aGF0IHRoZSBvcGVyYW5kIGlzIG5vbi1uYW4gaXMgZW5vdWdoLiAgV2UgcHJlZmVyIHRvCisgICAgLy8gaGF2ZSBTRVRPKHgseCkgaW5zdGVhZCBvZiBTRVRPKHgsIDAuMCkgYmVjYXVzZSB0aGlzIGF2b2lkcyBoYXZpbmcgdG8KKyAgICAvLyBtYXRlcmlhbGl6ZSAwLjAuCisgICAgaWYgKENvbmQgPT0gSVNEOjpTRVRPIHx8IENvbmQgPT0gSVNEOjpTRVRVTykKKyAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMCwgTjAsIENvbmQpOworCisgICAgLy8gSWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbGVnYWwsIHNlZSBpZiB3ZSBjYW4gZmluZCBhbiBlcXVpdmFsZW50IG9uZQorICAgIC8vIHdoaWNoIGlzIGxlZ2FsLgorICAgIGlmICghaXNDb25kQ29kZUxlZ2FsKENvbmQsIE4wLmdldFZhbHVlVHlwZSgpKSkgeworICAgICAgLy8gSWYgdGhlIGNvbXBhcmlzb24gd2FzIGFuIGF3a3dhcmQgZmxvYXRpbmctcG9pbnQgPT0gb3IgIT0gYW5kIG9uZSBvZgorICAgICAgLy8gdGhlIGNvbXBhcmlzb24gb3BlcmFuZHMgaXMgaW5maW5pdHkgb3IgbmVnYXRpdmUgaW5maW5pdHksIGNvbnZlcnQgdGhlCisgICAgICAvLyBjb25kaXRpb24gdG8gYSBsZXNzLWF3a3dhcmQgPD0gb3IgPj0uCisgICAgICBpZiAoQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzSW5maW5pdHkoKSkgeworICAgICAgICBpZiAoQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzTmVnYXRpdmUoKSkgeworICAgICAgICAgIGlmIChDb25kID09IElTRDo6U0VUT0VRICYmCisgICAgICAgICAgICAgIGlzQ29uZENvZGVMZWdhbChJU0Q6OlNFVE9MRSwgTjAuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRPTEUpOworICAgICAgICAgIGlmIChDb25kID09IElTRDo6U0VUVUVRICYmCisgICAgICAgICAgICAgIGlzQ29uZENvZGVMZWdhbChJU0Q6OlNFVE9MRSwgTjAuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRVTEUpOworICAgICAgICAgIGlmIChDb25kID09IElTRDo6U0VUVU5FICYmCisgICAgICAgICAgICAgIGlzQ29uZENvZGVMZWdhbChJU0Q6OlNFVFVHVCwgTjAuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRVR1QpOworICAgICAgICAgIGlmIChDb25kID09IElTRDo6U0VUT05FICYmCisgICAgICAgICAgICAgIGlzQ29uZENvZGVMZWdhbChJU0Q6OlNFVFVHVCwgTjAuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRPR1QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChDb25kID09IElTRDo6U0VUT0VRICYmCisgICAgICAgICAgICAgIGlzQ29uZENvZGVMZWdhbChJU0Q6OlNFVE9HRSwgTjAuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRPR0UpOworICAgICAgICAgIGlmIChDb25kID09IElTRDo6U0VUVUVRICYmCisgICAgICAgICAgICAgIGlzQ29uZENvZGVMZWdhbChJU0Q6OlNFVE9HRSwgTjAuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRVR0UpOworICAgICAgICAgIGlmIChDb25kID09IElTRDo6U0VUVU5FICYmCisgICAgICAgICAgICAgIGlzQ29uZENvZGVMZWdhbChJU0Q6OlNFVFVMVCwgTjAuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRVTFQpOworICAgICAgICAgIGlmIChDb25kID09IElTRDo6U0VUT05FICYmCisgICAgICAgICAgICAgIGlzQ29uZENvZGVMZWdhbChJU0Q6OlNFVFVMVCwgTjAuZ2V0VmFsdWVUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgSVNEOjpTRVRPTFQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKE4wID09IE4xKSB7CisgICAgLy8gV2UgY2FuIGFsd2F5cyBmb2xkIFggPT0gWCBmb3IgaW50ZWdlciBzZXRjYydzLgorICAgIGlmIChOMC5nZXRWYWx1ZVR5cGUoKS5pc0ludGVnZXIoKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoSVNEOjppc1RydWVXaGVuRXF1YWwoQ29uZCksIFZUKTsKKyAgICB1bnNpZ25lZCBVT0YgPSBJU0Q6OmdldFVub3JkZXJlZEZsYXZvcihDb25kKTsKKyAgICBpZiAoVU9GID09IDIpICAgLy8gRlAgb3BlcmF0b3JzIHRoYXQgYXJlIHVuZGVmaW5lZCBvbiBOYU5zLgorICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudChJU0Q6OmlzVHJ1ZVdoZW5FcXVhbChDb25kKSwgVlQpOworICAgIGlmIChVT0YgPT0gdW5zaWduZWQoSVNEOjppc1RydWVXaGVuRXF1YWwoQ29uZCkpKQorICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudChVT0YsIFZUKTsKKyAgICAvLyBPdGhlcndpc2UsIHdlIGNhbid0IGZvbGQgaXQuICBIb3dldmVyLCB3ZSBjYW4gc2ltcGxpZnkgaXQgdG8gU0VUVU8vU0VUTworICAgIC8vIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgorICAgIElTRDo6Q29uZENvZGUgTmV3Q29uZCA9IFVPRiA9PSAwID8gSVNEOjpTRVRPIDogSVNEOjpTRVRVTzsKKyAgICBpZiAoTmV3Q29uZCAhPSBDb25kKQorICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLCBOMSwgTmV3Q29uZCk7CisgIH0KKworICBpZiAoKENvbmQgPT0gSVNEOjpTRVRFUSB8fCBDb25kID09IElTRDo6U0VUTkUpICYmCisgICAgICBOMC5nZXRWYWx1ZVR5cGUoKS5pc0ludGVnZXIoKSkgeworICAgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCB8fCBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQiB8fAorICAgICAgICBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlhPUikgeworICAgICAgLy8gU2ltcGxpZnkgKFgrWSkgPT0gKFgrWikgLS0+ICBZID09IFoKKyAgICAgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBOMS5nZXRPcGNvZGUoKSkgeworICAgICAgICBpZiAoTjAuZ2V0T3BlcmFuZCgwKSA9PSBOMS5nZXRPcGVyYW5kKDApKQorICAgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMC5nZXRPcGVyYW5kKDEpLCBOMS5nZXRPcGVyYW5kKDEpLCBDb25kKTsKKyAgICAgICAgaWYgKE4wLmdldE9wZXJhbmQoMSkgPT0gTjEuZ2V0T3BlcmFuZCgxKSkKKyAgICAgICAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSwgTjEuZ2V0T3BlcmFuZCgwKSwgQ29uZCk7CisgICAgICAgIGlmIChEQUcuaXNDb21tdXRhdGl2ZUJpbk9wKE4wLmdldE9wY29kZSgpKSkgeworICAgICAgICAgIC8vIElmIFggb3AgWSA9PSBZIG9wIFgsIHRyeSBvdGhlciBjb21iaW5hdGlvbnMuCisgICAgICAgICAgaWYgKE4wLmdldE9wZXJhbmQoMCkgPT0gTjEuZ2V0T3BlcmFuZCgxKSkKKyAgICAgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMC5nZXRPcGVyYW5kKDEpLCBOMS5nZXRPcGVyYW5kKDApLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZCk7CisgICAgICAgICAgaWYgKE4wLmdldE9wZXJhbmQoMSkgPT0gTjEuZ2V0T3BlcmFuZCgwKSkKKyAgICAgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMC5nZXRPcGVyYW5kKDApLCBOMS5nZXRPcGVyYW5kKDEpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKENvbnN0YW50U0ROb2RlICpSSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xKSkgeworICAgICAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkxIU1IgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICAvLyBUdXJuIChYK0MxKSA9PSBDMiAtLT4gWCA9PSBDMi1DMQorICAgICAgICAgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCAmJiBOMC5nZXROb2RlKCktPmhhc09uZVVzZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFJIU0MtPmdldEFQSW50VmFsdWUoKS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIU1ItPmdldEFQSW50VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCkpLCBDb25kKTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLy8gVHVybiAoWF5DMSkgPT0gQzIgaW50byBYID09IEMxXkMyIGlmZiBYJn5DMSA9IDAuCisgICAgICAgICAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6WE9SKQorICAgICAgICAgICAgLy8gSWYgd2Uga25vdyB0aGF0IGFsbCBvZiB0aGUgaW52ZXJ0ZWQgYml0cyBhcmUgemVybywgZG9uJ3QgYm90aGVyCisgICAgICAgICAgICAvLyBwZXJmb3JtaW5nIHRoZSBpbnZlcnNpb24uCisgICAgICAgICAgICBpZiAoREFHLk1hc2tlZFZhbHVlSXNaZXJvKE4wLmdldE9wZXJhbmQoMCksIH5MSFNSLT5nZXRBUEludFZhbHVlKCkpKQorICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTEhTUi0+Z2V0QVBJbnRWYWx1ZSgpIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTQy0+Z2V0QVBJbnRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVHVybiAoQzEtWCkgPT0gQzIgLS0+IFggPT0gQzEtQzIKKyAgICAgICAgaWYgKENvbnN0YW50U0ROb2RlICpTVUJDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgICAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6U1VCICYmIE4wLmdldE5vZGUoKS0+aGFzT25lVXNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMC5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFNVQkMtPmdldEFQSW50VmFsdWUoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFNDLT5nZXRBUEludFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZCk7CisgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgIAorICAgICAgfQorCisgICAgICAvLyBTaW1wbGlmeSAoWCtaKSA9PSBYIC0tPiAgWiA9PSAwCisgICAgICBpZiAoTjAuZ2V0T3BlcmFuZCgwKSA9PSBOMSkKKyAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgTjAuZ2V0VmFsdWVUeXBlKCkpLCBDb25kKTsKKyAgICAgIGlmIChOMC5nZXRPcGVyYW5kKDEpID09IE4xKSB7CisgICAgICAgIGlmIChEQUcuaXNDb21tdXRhdGl2ZUJpbk9wKE4wLmdldE9wY29kZSgpKSkKKyAgICAgICAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgTjAuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE4wLmdldFZhbHVlVHlwZSgpKSwgQ29uZCk7CisgICAgICAgIGVsc2UgaWYgKE4wLmdldE5vZGUoKS0+aGFzT25lVXNlKCkpIHsKKyAgICAgICAgICBhc3NlcnQoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIgJiYgIlVuZXhwZWN0ZWQgb3BlcmF0aW9uISIpOworICAgICAgICAgIC8vIChaLVgpID09IFggIC0tPiBaID09IFg8PDEKKyAgICAgICAgICBTRFZhbHVlIFNIID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBOMS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIGdldFNoaWZ0QW1vdW50VHkoKSkpOworICAgICAgICAgIGlmICghRENJLmlzQ2FsbGVkQnlMZWdhbGl6ZXIoKSkKKyAgICAgICAgICAgIERDSS5BZGRUb1dvcmtsaXN0KFNILmdldE5vZGUoKSk7CisgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4wLmdldE9wZXJhbmQoMCksIFNILCBDb25kKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCB8fCBOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQiB8fAorICAgICAgICBOMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlhPUikgeworICAgICAgLy8gU2ltcGxpZnkgIFggPT0gKFgrWikgLS0+ICBaID09IDAKKyAgICAgIGlmIChOMS5nZXRPcGVyYW5kKDApID09IE4wKSB7CisgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBOMS5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE4xLmdldFZhbHVlVHlwZSgpKSwgQ29uZCk7CisgICAgICB9IGVsc2UgaWYgKE4xLmdldE9wZXJhbmQoMSkgPT0gTjApIHsKKyAgICAgICAgaWYgKERBRy5pc0NvbW11dGF0aXZlQmluT3AoTjEuZ2V0T3Bjb2RlKCkpKSB7CisgICAgICAgICAgcmV0dXJuIERBRy5nZXRTZXRDQyhkbCwgVlQsIE4xLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBOMS5nZXRWYWx1ZVR5cGUoKSksIENvbmQpOworICAgICAgICB9IGVsc2UgaWYgKE4xLmdldE5vZGUoKS0+aGFzT25lVXNlKCkpIHsKKyAgICAgICAgICBhc3NlcnQoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIgJiYgIlVuZXhwZWN0ZWQgb3BlcmF0aW9uISIpOworICAgICAgICAgIC8vIFggPT0gKFotWCkgIC0tPiBYPDwxID09IFoKKyAgICAgICAgICBTRFZhbHVlIFNIID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBOMS5nZXRWYWx1ZVR5cGUoKSwgTjAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBnZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgICAgICAgICBpZiAoIURDSS5pc0NhbGxlZEJ5TGVnYWxpemVyKCkpCisgICAgICAgICAgICBEQ0kuQWRkVG9Xb3JrbGlzdChTSC5nZXROb2RlKCkpOworICAgICAgICAgIHJldHVybiBEQUcuZ2V0U2V0Q0MoZGwsIFZULCBTSCwgTjEuZ2V0T3BlcmFuZCgwKSwgQ29uZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTaW1wbGlmeSB4JnkgPT0geSB0byB4JnkgIT0gMCBpZiB5IGhhcyBleGFjdGx5IG9uZSBiaXQgc2V0LgorICAgIC8vIE5vdGUgdGhhdCB3aGVyZSB5IGlzIHZhcmlhYmxlIGFuZCBpcyBrbm93biB0byBoYXZlIGF0IG1vc3QKKyAgICAvLyBvbmUgYml0IHNldCAoZm9yIGV4YW1wbGUsIGlmIGl0IGlzIHomMSkgd2UgY2Fubm90IGRvIHRoaXM7CisgICAgLy8gdGhlIGV4cHJlc3Npb25zIGFyZSBub3QgZXF1aXZhbGVudCB3aGVuIHk9PTAuCisgICAgaWYgKE4wLmdldE9wY29kZSgpID09IElTRDo6QU5EKQorICAgICAgaWYgKE4wLmdldE9wZXJhbmQoMCkgPT0gTjEgfHwgTjAuZ2V0T3BlcmFuZCgxKSA9PSBOMSkgeworICAgICAgICBpZiAoVmFsdWVIYXNFeGFjdGx5T25lQml0U2V0KE4xLCBEQUcpKSB7CisgICAgICAgICAgQ29uZCA9IElTRDo6Z2V0U2V0Q0NJbnZlcnNlKENvbmQsIC8qaXNJbnRlZ2VyPSovdHJ1ZSk7CisgICAgICAgICAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50KDAsIE4xLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgICAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgTjAsIFplcm8sIENvbmQpOworICAgICAgICB9CisgICAgICB9CisgICAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6QU5EKQorICAgICAgaWYgKE4xLmdldE9wZXJhbmQoMCkgPT0gTjAgfHwgTjEuZ2V0T3BlcmFuZCgxKSA9PSBOMCkgeworICAgICAgICBpZiAoVmFsdWVIYXNFeGFjdGx5T25lQml0U2V0KE4wLCBEQUcpKSB7CisgICAgICAgICAgQ29uZCA9IElTRDo6Z2V0U2V0Q0NJbnZlcnNlKENvbmQsIC8qaXNJbnRlZ2VyPSovdHJ1ZSk7CisgICAgICAgICAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50KDAsIE4wLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgICAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgTjEsIFplcm8sIENvbmQpOworICAgICAgICB9CisgICAgICB9CisgIH0KKworICAvLyBGb2xkIGF3YXkgQUxMIGJvb2xlYW4gc2V0Y2Mncy4KKyAgU0RWYWx1ZSBUZW1wOworICBpZiAoTjAuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMSAmJiBmb2xkQm9vbGVhbnMpIHsKKyAgICBzd2l0Y2ggKENvbmQpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgc2V0Y2MhIik7CisgICAgY2FzZSBJU0Q6OlNFVEVROiAgLy8gWCA9PSBZICAtPiB+KFheWSkKKyAgICAgIFRlbXAgPSBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIE1WVDo6aTEsIE4wLCBOMSk7CisgICAgICBOMCA9IERBRy5nZXROT1QoZGwsIFRlbXAsIE1WVDo6aTEpOworICAgICAgaWYgKCFEQ0kuaXNDYWxsZWRCeUxlZ2FsaXplcigpKQorICAgICAgICBEQ0kuQWRkVG9Xb3JrbGlzdChUZW1wLmdldE5vZGUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUTkU6ICAvLyBYICE9IFkgICAtLT4gIChYXlkpCisgICAgICBOMCA9IERBRy5nZXROb2RlKElTRDo6WE9SLCBkbCwgTVZUOjppMSwgTjAsIE4xKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRHVDogIC8vIFggPnMgWSAgIC0tPiAgWCA9PSAwICYgWSA9PSAxICAtLT4gIH5YICYgWQorICAgIGNhc2UgSVNEOjpTRVRVTFQ6IC8vIFggPHUgWSAgIC0tPiAgWCA9PSAwICYgWSA9PSAxICAtLT4gIH5YICYgWQorICAgICAgVGVtcCA9IERBRy5nZXROT1QoZGwsIE4wLCBNVlQ6OmkxKTsKKyAgICAgIE4wID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBNVlQ6OmkxLCBOMSwgVGVtcCk7CisgICAgICBpZiAoIURDSS5pc0NhbGxlZEJ5TGVnYWxpemVyKCkpCisgICAgICAgIERDSS5BZGRUb1dvcmtsaXN0KFRlbXAuZ2V0Tm9kZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRMVDogIC8vIFggPHMgWSAgIC0tPiBYID09IDEgJiBZID09IDAgIC0tPiAgflkgJiBYCisgICAgY2FzZSBJU0Q6OlNFVFVHVDogLy8gWCA+dSBZICAgLS0+IFggPT0gMSAmIFkgPT0gMCAgLS0+ICB+WSAmIFgKKyAgICAgIFRlbXAgPSBEQUcuZ2V0Tk9UKGRsLCBOMSwgTVZUOjppMSk7CisgICAgICBOMCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTVZUOjppMSwgTjAsIFRlbXApOworICAgICAgaWYgKCFEQ0kuaXNDYWxsZWRCeUxlZ2FsaXplcigpKQorICAgICAgICBEQ0kuQWRkVG9Xb3JrbGlzdChUZW1wLmdldE5vZGUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUVUxFOiAvLyBYIDw9dSBZICAtLT4gWCA9PSAwIHwgWSA9PSAxICAtLT4gIH5YIHwgWQorICAgIGNhc2UgSVNEOjpTRVRHRTogIC8vIFggPj1zIFkgIC0tPiBYID09IDAgfCBZID09IDEgIC0tPiAgflggfCBZCisgICAgICBUZW1wID0gREFHLmdldE5PVChkbCwgTjAsIE1WVDo6aTEpOworICAgICAgTjAgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTVZUOjppMSwgTjEsIFRlbXApOworICAgICAgaWYgKCFEQ0kuaXNDYWxsZWRCeUxlZ2FsaXplcigpKQorICAgICAgICBEQ0kuQWRkVG9Xb3JrbGlzdChUZW1wLmdldE5vZGUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUVUdFOiAvLyBYID49dSBZICAtLT4gWCA9PSAxIHwgWSA9PSAwICAtLT4gIH5ZIHwgWAorICAgIGNhc2UgSVNEOjpTRVRMRTogIC8vIFggPD1zIFkgIC0tPiBYID09IDEgfCBZID09IDAgIC0tPiAgflkgfCBYCisgICAgICBUZW1wID0gREFHLmdldE5PVChkbCwgTjEsIE1WVDo6aTEpOworICAgICAgTjAgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTVZUOjppMSwgTjAsIFRlbXApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChWVCAhPSBNVlQ6OmkxKSB7CisgICAgICBpZiAoIURDSS5pc0NhbGxlZEJ5TGVnYWxpemVyKCkpCisgICAgICAgIERDSS5BZGRUb1dvcmtsaXN0KE4wLmdldE5vZGUoKSk7CisgICAgICAvLyBGSVhNRTogSWYgcnVubmluZyBhZnRlciBsZWdhbGl6ZSwgd2UgcHJvYmFibHkgY2FuJ3QgZG8gdGhpcy4KKyAgICAgIE4wID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZGwsIFZULCBOMCk7CisgICAgfQorICAgIHJldHVybiBOMDsKKyAgfQorCisgIC8vIENvdWxkIG5vdCBmb2xkIGl0LgorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gaXNHQVBsdXNPZmZzZXQgLSBSZXR1cm5zIHRydWUgKGFuZCB0aGUgR2xvYmFsVmFsdWUgYW5kIHRoZSBvZmZzZXQpIGlmIHRoZQorLy8vIG5vZGUgaXMgYSBHbG9iYWxBZGRyZXNzICsgb2Zmc2V0LgorYm9vbCBUYXJnZXRMb3dlcmluZzo6aXNHQVBsdXNPZmZzZXQoU0ROb2RlICpOLCBjb25zdCBHbG9iYWxWYWx1ZSogJkdBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmT2Zmc2V0KSBjb25zdCB7CisgIGlmIChpc2E8R2xvYmFsQWRkcmVzc1NETm9kZT4oTikpIHsKKyAgICBHbG9iYWxBZGRyZXNzU0ROb2RlICpHQVNEID0gY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihOKTsKKyAgICBHQSA9IEdBU0QtPmdldEdsb2JhbCgpOworICAgIE9mZnNldCArPSBHQVNELT5nZXRPZmZzZXQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgTjIgPSBOLT5nZXRPcGVyYW5kKDEpOworICAgIGlmIChpc0dBUGx1c09mZnNldChOMS5nZXROb2RlKCksIEdBLCBPZmZzZXQpKSB7CisgICAgICBDb25zdGFudFNETm9kZSAqViA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMik7CisgICAgICBpZiAoVikgeworICAgICAgICBPZmZzZXQgKz0gVi0+Z2V0U0V4dFZhbHVlKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNHQVBsdXNPZmZzZXQoTjIuZ2V0Tm9kZSgpLCBHQSwgT2Zmc2V0KSkgeworICAgICAgQ29uc3RhbnRTRE5vZGUgKlYgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEpOworICAgICAgaWYgKFYpIHsKKyAgICAgICAgT2Zmc2V0ICs9IFYtPmdldFNFeHRWYWx1ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKK1NEVmFsdWUgVGFyZ2V0TG93ZXJpbmc6OgorUGVyZm9ybURBR0NvbWJpbmUoU0ROb2RlICpOLCBEQUdDb21iaW5lckluZm8gJkRDSSkgY29uc3QgeworICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uOiBubyBvcHRpbWl6YXRpb24uCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgSW5saW5lIEFzc2VtYmxlciBJbXBsZW1lbnRhdGlvbiBNZXRob2RzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKK1RhcmdldExvd2VyaW5nOjpDb25zdHJhaW50VHlwZQorVGFyZ2V0TG93ZXJpbmc6OmdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdCB7CisgIC8vIEZJWE1FOiBsb3RzIG1vcmUgc3RhbmRhcmQgb25lcyB0byBoYW5kbGUuCisgIGlmIChDb25zdHJhaW50LnNpemUoKSA9PSAxKSB7CisgICAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAncic6IHJldHVybiBDX1JlZ2lzdGVyQ2xhc3M7CisgICAgY2FzZSAnbSc6ICAgIC8vIG1lbW9yeQorICAgIGNhc2UgJ28nOiAgICAvLyBvZmZzZXRhYmxlCisgICAgY2FzZSAnVic6ICAgIC8vIG5vdCBvZmZzZXRhYmxlCisgICAgICByZXR1cm4gQ19NZW1vcnk7CisgICAgY2FzZSAnaSc6ICAgIC8vIFNpbXBsZSBJbnRlZ2VyIG9yIFJlbG9jYXRhYmxlIENvbnN0YW50CisgICAgY2FzZSAnbic6ICAgIC8vIFNpbXBsZSBJbnRlZ2VyCisgICAgY2FzZSAncyc6ICAgIC8vIFJlbG9jYXRhYmxlIENvbnN0YW50CisgICAgY2FzZSAnWCc6ICAgIC8vIEFsbG93IEFOWSB2YWx1ZS4KKyAgICBjYXNlICdJJzogICAgLy8gVGFyZ2V0IHJlZ2lzdGVycy4KKyAgICBjYXNlICdKJzoKKyAgICBjYXNlICdLJzoKKyAgICBjYXNlICdMJzoKKyAgICBjYXNlICdNJzoKKyAgICBjYXNlICdOJzoKKyAgICBjYXNlICdPJzoKKyAgICBjYXNlICdQJzoKKyAgICAgIHJldHVybiBDX090aGVyOworICAgIH0KKyAgfQorICAKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID4gMSAmJiBDb25zdHJhaW50WzBdID09ICd7JyAmJiAKKyAgICAgIENvbnN0cmFpbnRbQ29uc3RyYWludC5zaXplKCktMV0gPT0gJ30nKQorICAgIHJldHVybiBDX1JlZ2lzdGVyOworICByZXR1cm4gQ19Vbmtub3duOworfQorCisvLy8gTG93ZXJYQ29uc3RyYWludCAtIHRyeSB0byByZXBsYWNlIGFuIFggY29uc3RyYWludCwgd2hpY2ggbWF0Y2hlcyBhbnl0aGluZywKKy8vLyB3aXRoIGFub3RoZXIgdGhhdCBoYXMgbW9yZSBzcGVjaWZpYyByZXF1aXJlbWVudHMgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlCisvLy8gY29ycmVzcG9uZGluZyBvcGVyYW5kLgorY29uc3QgY2hhciAqVGFyZ2V0TG93ZXJpbmc6Okxvd2VyWENvbnN0cmFpbnQoRVZUIENvbnN0cmFpbnRWVCkgY29uc3R7CisgIGlmIChDb25zdHJhaW50VlQuaXNJbnRlZ2VyKCkpCisgICAgcmV0dXJuICJyIjsKKyAgaWYgKENvbnN0cmFpbnRWVC5pc0Zsb2F0aW5nUG9pbnQoKSkKKyAgICByZXR1cm4gImYiOyAgICAgIC8vIHdvcmtzIGZvciBtYW55IHRhcmdldHMKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBMb3dlckFzbU9wZXJhbmRGb3JDb25zdHJhaW50IC0gTG93ZXIgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGludG8gdGhlIE9wcworLy8vIHZlY3Rvci4gIElmIGl0IGlzIGludmFsaWQsIGRvbid0IGFkZCBhbnl0aGluZyB0byBPcHMuCit2b2lkIFRhcmdldExvd2VyaW5nOjpMb3dlckFzbU9wZXJhbmRGb3JDb25zdHJhaW50KFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgQ29uc3RyYWludExldHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgc3dpdGNoIChDb25zdHJhaW50TGV0dGVyKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlICdYJzogICAgIC8vIEFsbG93cyBhbnkgb3BlcmFuZDsgbGFiZWxzIChiYXNpYyBibG9jaykgdXNlIHRoaXMuCisgICAgaWYgKE9wLmdldE9wY29kZSgpID09IElTRDo6QmFzaWNCbG9jaykgeworICAgICAgT3BzLnB1c2hfYmFjayhPcCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGZhbGwgdGhyb3VnaAorICBjYXNlICdpJzogICAgLy8gU2ltcGxlIEludGVnZXIgb3IgUmVsb2NhdGFibGUgQ29uc3RhbnQKKyAgY2FzZSAnbic6ICAgIC8vIFNpbXBsZSBJbnRlZ2VyCisgIGNhc2UgJ3MnOiB7ICAvLyBSZWxvY2F0YWJsZSBDb25zdGFudAorICAgIC8vIFRoZXNlIG9wZXJhbmRzIGFyZSBpbnRlcmVzdGVkIGluIHZhbHVlcyBvZiB0aGUgZm9ybSAoR1YrQyksIHdoZXJlIEMgbWF5CisgICAgLy8gYmUgZm9sZGVkIGluIGFzIGFuIG9mZnNldCBvZiBHViwgb3IgaXQgbWF5IGJlIGV4cGxpY2l0bHkgYWRkZWQuICBBbHNvLCBpdAorICAgIC8vIGlzIHBvc3NpYmxlIGFuZCBmaW5lIGlmIGVpdGhlciBHViBvciBDIGFyZSBtaXNzaW5nLgorICAgIENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wKTsKKyAgICBHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKTsKKyAgICAKKyAgICAvLyBJZiB3ZSBoYXZlICIoYWRkIEdWLCBDKSIsIHB1bGwgb3V0IEdWL0MKKyAgICBpZiAoT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQpIHsKKyAgICAgIEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSk7CisgICAgICBHQSA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wLmdldE9wZXJhbmQoMCkpOworICAgICAgaWYgKEMgPT0gMCB8fCBHQSA9PSAwKSB7CisgICAgICAgIEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgwKSk7CisgICAgICAgIEdBID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSk7CisgICAgICB9CisgICAgICBpZiAoQyA9PSAwIHx8IEdBID09IDApCisgICAgICAgIEMgPSAwLCBHQSA9IDA7CisgICAgfQorICAgIAorICAgIC8vIElmIHdlIGZpbmQgYSB2YWxpZCBvcGVyYW5kLCBtYXAgdG8gdGhlIFRhcmdldFhYWCB2ZXJzaW9uIHNvIHRoYXQgdGhlCisgICAgLy8gdmFsdWUgaXRzZWxmIGRvZXNuJ3QgZ2V0IHNlbGVjdGVkLgorICAgIGlmIChHQSkgeyAgIC8vIEVpdGhlciAmR1YgICBvciAgICZHVitDCisgICAgICBpZiAoQ29uc3RyYWludExldHRlciAhPSAnbicpIHsKKyAgICAgICAgaW50NjRfdCBPZmZzID0gR0EtPmdldE9mZnNldCgpOworICAgICAgICBpZiAoQykgT2ZmcyArPSBDLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHQS0+Z2V0R2xvYmFsKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMgPyBDLT5nZXREZWJ1Z0xvYygpIDogRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRWYWx1ZVR5cGUoKSwgT2ZmcykpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGlmIChDKSB7ICAgLy8ganVzdCBDLCBubyBHVi4KKyAgICAgIC8vIFNpbXBsZSBjb25zdGFudHMgYXJlIG5vdCBhbGxvd2VkIGZvciAncycuCisgICAgICBpZiAoQ29uc3RyYWludExldHRlciAhPSAncycpIHsKKyAgICAgICAgLy8gZ2NjIHByaW50cyB0aGVzZSBhcyBzaWduIGV4dGVuZGVkLiAgU2lnbiBleHRlbmQgdmFsdWUgdG8gNjQgYml0cworICAgICAgICAvLyBub3c7IHdpdGhvdXQgdGhpcyBpdCB3b3VsZCBnZXQgWkV4dCdkIGxhdGVyIGluCisgICAgICAgIC8vIFNjaGVkdWxlREFHU0ROb2Rlczo6RW1pdE5vZGUsIHdoaWNoIGlzIHZlcnkgZ2VuZXJpYy4KKyAgICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoQy0+Z2V0QVBJbnRWYWx1ZSgpLmdldFNFeHRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Omk2NCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9CisgIH0KK30KKworc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFRhcmdldExvd2VyaW5nOjoKK2dldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0IHsKKyAgcmV0dXJuIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPigpOworfQorCisKK3N0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+IFRhcmdldExvd2VyaW5nOjoKK2dldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3QgeworICBpZiAoQ29uc3RyYWludFswXSAhPSAneycpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDB1LCBzdGF0aWNfY2FzdDxUYXJnZXRSZWdpc3RlckNsYXNzKj4oMCkpOworICBhc3NlcnQoKihDb25zdHJhaW50LmVuZCgpLTEpID09ICd9JyAmJiAiTm90IGEgYnJhY2UgZW5jbG9zZWQgY29uc3RyYWludD8iKTsKKworICAvLyBSZW1vdmUgdGhlIGJyYWNlcyBmcm9tIGFyb3VuZCB0aGUgbmFtZS4KKyAgU3RyaW5nUmVmIFJlZ05hbWUoQ29uc3RyYWludC5kYXRhKCkrMSwgQ29uc3RyYWludC5zaXplKCktMik7CisKKyAgLy8gRmlndXJlIG91dCB3aGljaCByZWdpc3RlciBjbGFzcyBjb250YWlucyB0aGlzIHJlZy4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICBmb3IgKFRhcmdldFJlZ2lzdGVySW5mbzo6cmVnY2xhc3NfaXRlcmF0b3IgUkNJID0gUkktPnJlZ2NsYXNzX2JlZ2luKCksCisgICAgICAgRSA9IFJJLT5yZWdjbGFzc19lbmQoKTsgUkNJICE9IEU7ICsrUkNJKSB7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSAqUkNJOworICAgIAorICAgIC8vIElmIG5vbmUgb2YgdGhlIHZhbHVlIHR5cGVzIGZvciB0aGlzIHJlZ2lzdGVyIGNsYXNzIGFyZSB2YWxpZCwgd2UgCisgICAgLy8gY2FuJ3QgdXNlIGl0LiAgRm9yIGV4YW1wbGUsIDY0LWJpdCByZWcgY2xhc3NlcyBvbiAzMi1iaXQgdGFyZ2V0cy4KKyAgICBib29sIGlzTGVnYWwgPSBmYWxzZTsKKyAgICBmb3IgKFRhcmdldFJlZ2lzdGVyQ2xhc3M6OnZ0X2l0ZXJhdG9yIEkgPSBSQy0+dnRfYmVnaW4oKSwgRSA9IFJDLT52dF9lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoaXNUeXBlTGVnYWwoKkkpKSB7CisgICAgICAgIGlzTGVnYWwgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFpc0xlZ2FsKSBjb250aW51ZTsKKyAgICAKKyAgICBmb3IgKFRhcmdldFJlZ2lzdGVyQ2xhc3M6Oml0ZXJhdG9yIEkgPSBSQy0+YmVnaW4oKSwgRSA9IFJDLT5lbmQoKTsgCisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKFJlZ05hbWUuZXF1YWxzX2xvd2VyKFJJLT5nZXROYW1lKCpJKSkpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigqSSwgUkMpOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDB1LCBzdGF0aWNfY2FzdDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4oMCkpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29uc3RyYWludCBTZWxlY3Rpb24uCisKKy8vLyBpc01hdGNoaW5nSW5wdXRDb25zdHJhaW50IC0gUmV0dXJuIHRydWUgb2YgdGhpcyBpcyBhbiBpbnB1dCBvcGVyYW5kIHRoYXQgaXMKKy8vLyBhIG1hdGNoaW5nIGNvbnN0cmFpbnQgbGlrZSAiNCIuCitib29sIFRhcmdldExvd2VyaW5nOjpBc21PcGVyYW5kSW5mbzo6aXNNYXRjaGluZ0lucHV0Q29uc3RyYWludCgpIGNvbnN0IHsKKyAgYXNzZXJ0KCFDb25zdHJhaW50Q29kZS5lbXB0eSgpICYmICJObyBrbm93biBjb25zdHJhaW50ISIpOworICByZXR1cm4gaXNkaWdpdChDb25zdHJhaW50Q29kZVswXSk7Cit9CisKKy8vLyBnZXRNYXRjaGVkT3BlcmFuZCAtIElmIHRoaXMgaXMgYW4gaW5wdXQgbWF0Y2hpbmcgY29uc3RyYWludCwgdGhpcyBtZXRob2QKKy8vLyByZXR1cm5zIHRoZSBvdXRwdXQgb3BlcmFuZCBpdCBtYXRjaGVzLgordW5zaWduZWQgVGFyZ2V0TG93ZXJpbmc6OkFzbU9wZXJhbmRJbmZvOjpnZXRNYXRjaGVkT3BlcmFuZCgpIGNvbnN0IHsKKyAgYXNzZXJ0KCFDb25zdHJhaW50Q29kZS5lbXB0eSgpICYmICJObyBrbm93biBjb25zdHJhaW50ISIpOworICByZXR1cm4gYXRvaShDb25zdHJhaW50Q29kZS5jX3N0cigpKTsKK30KKworCisvLy8gZ2V0Q29uc3RyYWludEdlbmVyYWxpdHkgLSBSZXR1cm4gYW4gaW50ZWdlciBpbmRpY2F0aW5nIGhvdyBnZW5lcmFsIENUCisvLy8gaXMuCitzdGF0aWMgdW5zaWduZWQgZ2V0Q29uc3RyYWludEdlbmVyYWxpdHkoVGFyZ2V0TG93ZXJpbmc6OkNvbnN0cmFpbnRUeXBlIENUKSB7CisgIHN3aXRjaCAoQ1QpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBjb25zdHJhaW50IHR5cGUhIik7CisgIGNhc2UgVGFyZ2V0TG93ZXJpbmc6OkNfT3RoZXI6CisgIGNhc2UgVGFyZ2V0TG93ZXJpbmc6OkNfVW5rbm93bjoKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBUYXJnZXRMb3dlcmluZzo6Q19SZWdpc3RlcjoKKyAgICByZXR1cm4gMTsKKyAgY2FzZSBUYXJnZXRMb3dlcmluZzo6Q19SZWdpc3RlckNsYXNzOgorICAgIHJldHVybiAyOworICBjYXNlIFRhcmdldExvd2VyaW5nOjpDX01lbW9yeToKKyAgICByZXR1cm4gMzsKKyAgfQorfQorCisvLy8gQ2hvb3NlQ29uc3RyYWludCAtIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBkaWZmZXJlbnQgY29uc3RyYWludHMgdGhhdCB3ZQorLy8vIGNvdWxkIHBpY2sgZm9yIHRoaXMgb3BlcmFuZCAoZS5nLiAiaW1yIikgdHJ5IHRvIHBpY2sgdGhlICdiZXN0JyBvbmUuCisvLy8gVGhpcyBpcyBzb21ld2hhdCB0cmlja3k6IGNvbnN0cmFpbnRzIGZhbGwgaW50byBmb3VyIGNsYXNzZXM6CisvLy8gICAgT3RoZXIgICAgICAgICAtPiBpbW1lZGlhdGVzIGFuZCBtYWdpYyB2YWx1ZXMKKy8vLyAgICBSZWdpc3RlciAgICAgIC0+IG9uZSBzcGVjaWZpYyByZWdpc3RlcgorLy8vICAgIFJlZ2lzdGVyQ2xhc3MgLT4gYSBncm91cCBvZiByZWdzCisvLy8gICAgTWVtb3J5ICAgICAgICAtPiBtZW1vcnkKKy8vLyBJZGVhbGx5LCB3ZSB3b3VsZCBwaWNrIHRoZSBtb3N0IHNwZWNpZmljIGNvbnN0cmFpbnQgcG9zc2libGU6IGlmIHdlIGhhdmUKKy8vLyBzb21ldGhpbmcgdGhhdCBmaXRzIGludG8gYSByZWdpc3Rlciwgd2Ugd291bGQgcGljayBpdC4gIFRoZSBwcm9ibGVtIGhlcmUKKy8vLyBpcyB0aGF0IGlmIHdlIGhhdmUgc29tZXRoaW5nIHRoYXQgY291bGQgZWl0aGVyIGJlIGluIGEgcmVnaXN0ZXIgb3IgaW4KKy8vLyBtZW1vcnkgdGhhdCB1c2Ugb2YgdGhlIHJlZ2lzdGVyIGNvdWxkIGNhdXNlIHNlbGVjdGlvbiBvZiAqb3RoZXIqCisvLy8gb3BlcmFuZHMgdG8gZmFpbDogdGhleSBtaWdodCBvbmx5IHN1Y2NlZWQgaWYgd2UgcGljayBtZW1vcnkuICBCZWNhdXNlIG9mCisvLy8gdGhpcyB0aGUgaGV1cmlzdGljIHdlIHVzZSBpczoKKy8vLworLy8vICAxKSBJZiB0aGVyZSBpcyBhbiAnb3RoZXInIGNvbnN0cmFpbnQsIGFuZCBpZiB0aGUgb3BlcmFuZCBpcyB2YWxpZCBmb3IKKy8vLyAgICAgdGhhdCBjb25zdHJhaW50LCB1c2UgaXQuICBUaGlzIG1ha2VzIHVzIHRha2UgYWR2YW50YWdlIG9mICdpJworLy8vICAgICBjb25zdHJhaW50cyB3aGVuIGF2YWlsYWJsZS4KKy8vLyAgMikgT3RoZXJ3aXNlLCBwaWNrIHRoZSBtb3N0IGdlbmVyYWwgY29uc3RyYWludCBwcmVzZW50LiAgVGhpcyBwcmVmZXJzCisvLy8gICAgICdtJyBvdmVyICdyJywgZm9yIGV4YW1wbGUuCisvLy8KK3N0YXRpYyB2b2lkIENob29zZUNvbnN0cmFpbnQoVGFyZ2V0TG93ZXJpbmc6OkFzbU9wZXJhbmRJbmZvICZPcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAqREFHKSB7CisgIGFzc2VydChPcEluZm8uQ29kZXMuc2l6ZSgpID4gMSAmJiAiRG9lc24ndCBoYXZlIG11bHRpcGxlIGNvbnN0cmFpbnQgb3B0aW9ucyIpOworICB1bnNpZ25lZCBCZXN0SWR4ID0gMDsKKyAgVGFyZ2V0TG93ZXJpbmc6OkNvbnN0cmFpbnRUeXBlIEJlc3RUeXBlID0gVGFyZ2V0TG93ZXJpbmc6OkNfVW5rbm93bjsKKyAgaW50IEJlc3RHZW5lcmFsaXR5ID0gLTE7CisKKyAgLy8gTG9vcCBvdmVyIHRoZSBvcHRpb25zLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3N0IGdlbmVyYWwgb25lLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BJbmZvLkNvZGVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUgQ1R5cGUgPQorICAgICAgVExJLmdldENvbnN0cmFpbnRUeXBlKE9wSW5mby5Db2Rlc1tpXSk7CisKKyAgICAvLyBJZiB0aGlzIGlzIGFuICdvdGhlcicgY29uc3RyYWludCwgc2VlIGlmIHRoZSBvcGVyYW5kIGlzIHZhbGlkIGZvciBpdC4KKyAgICAvLyBGb3IgZXhhbXBsZSwgb24gWDg2IHdlIG1pZ2h0IGhhdmUgYW4gJ3JJJyBjb25zdHJhaW50LiAgSWYgdGhlIG9wZXJhbmQKKyAgICAvLyBpcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMC4uMzFdIHdlIHdhbnQgdG8gdXNlIEkgKHNhdmluZyBhIGxvYWQKKyAgICAvLyBvZiBhIHJlZ2lzdGVyKSwgb3RoZXJ3aXNlIHdlIG11c3QgdXNlICdyJy4KKyAgICBpZiAoQ1R5cGUgPT0gVGFyZ2V0TG93ZXJpbmc6OkNfT3RoZXIgJiYgT3AuZ2V0Tm9kZSgpKSB7CisgICAgICBhc3NlcnQoT3BJbmZvLkNvZGVzW2ldLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgIlVuaGFuZGxlZCBtdWx0aS1sZXR0ZXIgJ290aGVyJyBjb25zdHJhaW50Iik7CisgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiBSZXN1bHRPcHM7CisgICAgICBUTEkuTG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludChPcCwgT3BJbmZvLkNvZGVzW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0T3BzLCAqREFHKTsKKyAgICAgIGlmICghUmVzdWx0T3BzLmVtcHR5KCkpIHsKKyAgICAgICAgQmVzdFR5cGUgPSBDVHlwZTsKKyAgICAgICAgQmVzdElkeCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBUaGluZ3Mgd2l0aCBtYXRjaGluZyBjb25zdHJhaW50cyBjYW4gb25seSBiZSByZWdpc3RlcnMsIHBlciBnY2MKKyAgICAvLyBkb2N1bWVudGF0aW9uLiAgVGhpcyBtYWlubHkgYWZmZWN0cyAiZyIgY29uc3RyYWludHMuCisgICAgaWYgKENUeXBlID09IFRhcmdldExvd2VyaW5nOjpDX01lbW9yeSAmJiBPcEluZm8uaGFzTWF0Y2hpbmdJbnB1dCgpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgLy8gVGhpcyBjb25zdHJhaW50IGxldHRlciBpcyBtb3JlIGdlbmVyYWwgdGhhbiB0aGUgcHJldmlvdXMgb25lLCB1c2UgaXQuCisgICAgaW50IEdlbmVyYWxpdHkgPSBnZXRDb25zdHJhaW50R2VuZXJhbGl0eShDVHlwZSk7CisgICAgaWYgKEdlbmVyYWxpdHkgPiBCZXN0R2VuZXJhbGl0eSkgeworICAgICAgQmVzdFR5cGUgPSBDVHlwZTsKKyAgICAgIEJlc3RJZHggPSBpOworICAgICAgQmVzdEdlbmVyYWxpdHkgPSBHZW5lcmFsaXR5OworICAgIH0KKyAgfQorICAKKyAgT3BJbmZvLkNvbnN0cmFpbnRDb2RlID0gT3BJbmZvLkNvZGVzW0Jlc3RJZHhdOworICBPcEluZm8uQ29uc3RyYWludFR5cGUgPSBCZXN0VHlwZTsKK30KKworLy8vIENvbXB1dGVDb25zdHJhaW50VG9Vc2UgLSBEZXRlcm1pbmVzIHRoZSBjb25zdHJhaW50IGNvZGUgYW5kIGNvbnN0cmFpbnQKKy8vLyB0eXBlIHRvIHVzZSBmb3IgdGhlIHNwZWNpZmljIEFzbU9wZXJhbmRJbmZvLCBzZXR0aW5nCisvLy8gT3BJbmZvLkNvbnN0cmFpbnRDb2RlIGFuZCBPcEluZm8uQ29uc3RyYWludFR5cGUuCit2b2lkIFRhcmdldExvd2VyaW5nOjpDb21wdXRlQ29uc3RyYWludFRvVXNlKEFzbU9wZXJhbmRJbmZvICZPcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgKkRBRykgY29uc3QgeworICBhc3NlcnQoIU9wSW5mby5Db2Rlcy5lbXB0eSgpICYmICJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNvbnN0cmFpbnQiKTsKKyAgCisgIC8vIFNpbmdsZS1sZXR0ZXIgY29uc3RyYWludHMgKCdyJykgYXJlIHZlcnkgY29tbW9uLgorICBpZiAoT3BJbmZvLkNvZGVzLnNpemUoKSA9PSAxKSB7CisgICAgT3BJbmZvLkNvbnN0cmFpbnRDb2RlID0gT3BJbmZvLkNvZGVzWzBdOworICAgIE9wSW5mby5Db25zdHJhaW50VHlwZSA9IGdldENvbnN0cmFpbnRUeXBlKE9wSW5mby5Db25zdHJhaW50Q29kZSk7CisgIH0gZWxzZSB7CisgICAgQ2hvb3NlQ29uc3RyYWludChPcEluZm8sICp0aGlzLCBPcCwgREFHKTsKKyAgfQorICAKKyAgLy8gJ1gnIG1hdGNoZXMgYW55dGhpbmcuCisgIGlmIChPcEluZm8uQ29uc3RyYWludENvZGUgPT0gIlgiICYmIE9wSW5mby5DYWxsT3BlcmFuZFZhbCkgeworICAgIC8vIExhYmVscyBhbmQgY29uc3RhbnRzIGFyZSBoYW5kbGVkIGVsc2V3aGVyZSAoJ1gnIGlzIHRoZSBvbmx5IHRoaW5nCisgICAgLy8gdGhhdCBtYXRjaGVzIGxhYmVscykuICBGb3IgRnVuY3Rpb25zLCB0aGUgdHlwZSBoZXJlIGlzIHRoZSB0eXBlIG9mCisgICAgLy8gdGhlIHJlc3VsdCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudCB0byBsb29rIGF0OyBsZWF2ZSB0aGVtIGFsb25lLgorICAgIFZhbHVlICp2ID0gT3BJbmZvLkNhbGxPcGVyYW5kVmFsOworICAgIGlmIChpc2E8QmFzaWNCbG9jaz4odikgfHwgaXNhPENvbnN0YW50SW50Pih2KSB8fCBpc2E8RnVuY3Rpb24+KHYpKSB7CisgICAgICBPcEluZm8uQ2FsbE9wZXJhbmRWYWwgPSB2OworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIHRyeSB0byByZXNvbHZlIGl0IHRvIHNvbWV0aGluZyB3ZSBrbm93IGFib3V0IGJ5IGxvb2tpbmcgYXQKKyAgICAvLyB0aGUgYWN0dWFsIG9wZXJhbmQgdHlwZS4KKyAgICBpZiAoY29uc3QgY2hhciAqUmVwbCA9IExvd2VyWENvbnN0cmFpbnQoT3BJbmZvLkNvbnN0cmFpbnRWVCkpIHsKKyAgICAgIE9wSW5mby5Db25zdHJhaW50Q29kZSA9IFJlcGw7CisgICAgICBPcEluZm8uQ29uc3RyYWludFR5cGUgPSBnZXRDb25zdHJhaW50VHlwZShPcEluZm8uQ29uc3RyYWludENvZGUpOworICAgIH0KKyAgfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIExvb3AgU3RyZW5ndGggUmVkdWN0aW9uIGhvb2tzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gaXNMZWdhbEFkZHJlc3NpbmdNb2RlIC0gUmV0dXJuIHRydWUgaWYgdGhlIGFkZHJlc3NpbmcgbW9kZSByZXByZXNlbnRlZAorLy8vIGJ5IEFNIGlzIGxlZ2FsIGZvciB0aGlzIHRhcmdldCwgZm9yIGEgbG9hZC9zdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCitib29sIFRhcmdldExvd2VyaW5nOjppc0xlZ2FsQWRkcmVzc2luZ01vZGUoY29uc3QgQWRkck1vZGUgJkFNLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgY29uc3QgeworICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGltcGxlbWVudHMgYSBjb25zZXJ2YXRpdmUgUklTQ3ksIHIrciBhbmQKKyAgLy8gcitpIGFkZHIgbW9kZS4KKworICAvLyBBbGxvd3MgYSBzaWduLWV4dGVuZGVkIDE2LWJpdCBpbW1lZGlhdGUgZmllbGQuCisgIGlmIChBTS5CYXNlT2ZmcyA8PSAtKDFMTCA8PCAxNikgfHwgQU0uQmFzZU9mZnMgPj0gKDFMTCA8PCAxNiktMSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICAvLyBObyBnbG9iYWwgaXMgZXZlciBhbGxvd2VkIGFzIGEgYmFzZS4KKyAgaWYgKEFNLkJhc2VHVikKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICAvLyBPbmx5IHN1cHBvcnQgcityLCAKKyAgc3dpdGNoIChBTS5TY2FsZSkgeworICBjYXNlIDA6ICAvLyAicitpIiBvciBqdXN0ICJpIiwgZGVwZW5kaW5nIG9uIEhhc0Jhc2VSZWcuCisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICBpZiAoQU0uSGFzQmFzZVJlZyAmJiBBTS5CYXNlT2ZmcykgIC8vICJyK3IraSIgaXMgbm90IGFsbG93ZWQuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gT3RoZXJ3aXNlIHdlIGhhdmUgcityIG9yIHIraS4KKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIGlmIChBTS5IYXNCYXNlUmVnIHx8IEFNLkJhc2VPZmZzKSAgLy8gMipyK3IgIG9yICAyKnIraSBpcyBub3QgYWxsb3dlZC4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBBbGxvdyAyKnIgYXMgcityLgorICAgIGJyZWFrOworICB9CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIEJ1aWxkU0RJVlNlcXVlbmNlIC0gR2l2ZW4gYW4gSVNEOjpTRElWIG5vZGUgZXhwcmVzc2luZyBhIGRpdmlkZSBieSBjb25zdGFudCwKKy8vLyByZXR1cm4gYSBEQUcgZXhwcmVzc2lvbiB0byBzZWxlY3QgdGhhdCB3aWxsIGdlbmVyYXRlIHRoZSBzYW1lIHZhbHVlIGJ5CisvLy8gbXVsdGlwbHlpbmcgYnkgYSBtYWdpYyBudW1iZXIuICBTZWU6CisvLy8gPGh0dHA6Ly90aGUud2FsbC5yaXNjb20ubmV0L2Jvb2tzL3Byb2MvcHBjL2N3Zy9jb2RlMi5odG1sPgorU0RWYWx1ZSBUYXJnZXRMb3dlcmluZzo6QnVpbGRTRElWKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNETm9kZSo+KiBDcmVhdGVkKSBjb25zdCB7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgRGVidWdMb2MgZGw9IE4tPmdldERlYnVnTG9jKCk7CisgIAorICAvLyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIHRoaXMuCisgIC8vIEZJWE1FOiBXZSBzaG91bGQgYmUgbW9yZSBhZ2dyZXNzaXZlIGhlcmUuCisgIGlmICghaXNUeXBlTGVnYWwoVlQpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIAorICBBUEludCBkID0gY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldEFQSW50VmFsdWUoKTsKKyAgQVBJbnQ6Om1zIG1hZ2ljcyA9IGQubWFnaWMoKTsKKyAgCisgIC8vIE11bHRpcGx5IHRoZSBudW1lcmF0b3IgKG9wZXJhbmQgMCkgYnkgdGhlIG1hZ2ljIHZhbHVlCisgIC8vIEZJWE1FOiBXZSBzaG91bGQgc3VwcG9ydCBkb2luZyBhIE1VTCBpbiBhIHdpZGVyIHR5cGUKKyAgU0RWYWx1ZSBROworICBpZiAoaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6TVVMSFMsIFZUKSkKKyAgICBRID0gREFHLmdldE5vZGUoSVNEOjpNVUxIUywgZGwsIFZULCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQobWFnaWNzLm0sIFZUKSk7CisgIGVsc2UgaWYgKGlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OlNNVUxfTE9ISSwgVlQpKQorICAgIFEgPSBTRFZhbHVlKERBRy5nZXROb2RlKElTRDo6U01VTF9MT0hJLCBkbCwgREFHLmdldFZUTGlzdChWVCwgVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChtYWdpY3MubSwgVlQpKS5nZXROb2RlKCksIDEpOworICBlbHNlCisgICAgcmV0dXJuIFNEVmFsdWUoKTsgICAgICAgLy8gTm8gbXVsaHMgb3IgZXF1dmlhbGVudAorICAvLyBJZiBkID4gMCBhbmQgbSA8IDAsIGFkZCB0aGUgbnVtZXJhdG9yCisgIGlmIChkLmlzU3RyaWN0bHlQb3NpdGl2ZSgpICYmIG1hZ2ljcy5tLmlzTmVnYXRpdmUoKSkgeyAKKyAgICBRID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBWVCwgUSwgTi0+Z2V0T3BlcmFuZCgwKSk7CisgICAgaWYgKENyZWF0ZWQpCisgICAgICBDcmVhdGVkLT5wdXNoX2JhY2soUS5nZXROb2RlKCkpOworICB9CisgIC8vIElmIGQgPCAwIGFuZCBtID4gMCwgc3VidHJhY3QgdGhlIG51bWVyYXRvci4KKyAgaWYgKGQuaXNOZWdhdGl2ZSgpICYmIG1hZ2ljcy5tLmlzU3RyaWN0bHlQb3NpdGl2ZSgpKSB7CisgICAgUSA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwgVlQsIFEsIE4tPmdldE9wZXJhbmQoMCkpOworICAgIGlmIChDcmVhdGVkKQorICAgICAgQ3JlYXRlZC0+cHVzaF9iYWNrKFEuZ2V0Tm9kZSgpKTsKKyAgfQorICAvLyBTaGlmdCByaWdodCBhbGdlYnJhaWMgaWYgc2hpZnQgdmFsdWUgaXMgbm9uemVybworICBpZiAobWFnaWNzLnMgPiAwKSB7CisgICAgUSA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgVlQsIFEsIAorICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQobWFnaWNzLnMsIGdldFNoaWZ0QW1vdW50VHkoKSkpOworICAgIGlmIChDcmVhdGVkKQorICAgICAgQ3JlYXRlZC0+cHVzaF9iYWNrKFEuZ2V0Tm9kZSgpKTsKKyAgfQorICAvLyBFeHRyYWN0IHRoZSBzaWduIGJpdCBhbmQgYWRkIGl0IHRvIHRoZSBxdW90aWVudAorICBTRFZhbHVlIFQgPQorICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgVlQsIFEsIERBRy5nZXRDb25zdGFudChWVC5nZXRTaXplSW5CaXRzKCktMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgaWYgKENyZWF0ZWQpCisgICAgQ3JlYXRlZC0+cHVzaF9iYWNrKFQuZ2V0Tm9kZSgpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgVlQsIFEsIFQpOworfQorCisvLy8gQnVpbGRVRElWU2VxdWVuY2UgLSBHaXZlbiBhbiBJU0Q6OlVESVYgbm9kZSBleHByZXNzaW5nIGEgZGl2aWRlIGJ5IGNvbnN0YW50LAorLy8vIHJldHVybiBhIERBRyBleHByZXNzaW9uIHRvIHNlbGVjdCB0aGF0IHdpbGwgZ2VuZXJhdGUgdGhlIHNhbWUgdmFsdWUgYnkKKy8vLyBtdWx0aXBseWluZyBieSBhIG1hZ2ljIG51bWJlci4gIFNlZToKKy8vLyA8aHR0cDovL3RoZS53YWxsLnJpc2NvbS5uZXQvYm9va3MvcHJvYy9wcGMvY3dnL2NvZGUyLmh0bWw+CitTRFZhbHVlIFRhcmdldExvd2VyaW5nOjpCdWlsZFVESVYoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRE5vZGUqPiogQ3JlYXRlZCkgY29uc3QgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIHRoaXMuCisgIC8vIEZJWE1FOiBXZSBzaG91bGQgYmUgbW9yZSBhZ2dyZXNzaXZlIGhlcmUuCisgIGlmICghaXNUeXBlTGVnYWwoVlQpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgLy8gRklYTUU6IFdlIHNob3VsZCB1c2UgYSBuYXJyb3dlciBjb25zdGFudCB3aGVuIHRoZSB1cHBlcgorICAvLyBiaXRzIGFyZSBrbm93biB0byBiZSB6ZXJvLgorICBDb25zdGFudFNETm9kZSAqTjFDID0gY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSk7CisgIEFQSW50OjptdSBtYWdpY3MgPSBOMUMtPmdldEFQSW50VmFsdWUoKS5tYWdpY3UoKTsKKworICAvLyBNdWx0aXBseSB0aGUgbnVtZXJhdG9yIChvcGVyYW5kIDApIGJ5IHRoZSBtYWdpYyB2YWx1ZQorICAvLyBGSVhNRTogV2Ugc2hvdWxkIHN1cHBvcnQgZG9pbmcgYSBNVUwgaW4gYSB3aWRlciB0eXBlCisgIFNEVmFsdWUgUTsKKyAgaWYgKGlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6Ok1VTEhVLCBWVCkpCisgICAgUSA9IERBRy5nZXROb2RlKElTRDo6TVVMSFUsIGRsLCBWVCwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KG1hZ2ljcy5tLCBWVCkpOworICBlbHNlIGlmIChpc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpVTVVMX0xPSEksIFZUKSkKKyAgICBRID0gU0RWYWx1ZShEQUcuZ2V0Tm9kZShJU0Q6OlVNVUxfTE9ISSwgZGwsIERBRy5nZXRWVExpc3QoVlQsIFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQobWFnaWNzLm0sIFZUKSkuZ2V0Tm9kZSgpLCAxKTsKKyAgZWxzZQorICAgIHJldHVybiBTRFZhbHVlKCk7ICAgICAgIC8vIE5vIG11bGh1IG9yIGVxdXZpYWxlbnQKKyAgaWYgKENyZWF0ZWQpCisgICAgQ3JlYXRlZC0+cHVzaF9iYWNrKFEuZ2V0Tm9kZSgpKTsKKworICBpZiAobWFnaWNzLmEgPT0gMCkgeworICAgIGFzc2VydChtYWdpY3MucyA8IE4xQy0+Z2V0QVBJbnRWYWx1ZSgpLmdldEJpdFdpZHRoKCkgJiYKKyAgICAgICAgICAgIldlIHNob3VsZG4ndCBnZW5lcmF0ZSBhbiB1bmRlZmluZWQgc2hpZnQhIik7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgVlQsIFEsIAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQobWFnaWNzLnMsIGdldFNoaWZ0QW1vdW50VHkoKSkpOworICB9IGVsc2UgeworICAgIFNEVmFsdWUgTlBRID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBWVCwgTi0+Z2V0T3BlcmFuZCgwKSwgUSk7CisgICAgaWYgKENyZWF0ZWQpCisgICAgICBDcmVhdGVkLT5wdXNoX2JhY2soTlBRLmdldE5vZGUoKSk7CisgICAgTlBRID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBWVCwgTlBRLCAKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgZ2V0U2hpZnRBbW91bnRUeSgpKSk7CisgICAgaWYgKENyZWF0ZWQpCisgICAgICBDcmVhdGVkLT5wdXNoX2JhY2soTlBRLmdldE5vZGUoKSk7CisgICAgTlBRID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBWVCwgTlBRLCBRKTsKKyAgICBpZiAoQ3JlYXRlZCkKKyAgICAgIENyZWF0ZWQtPnB1c2hfYmFjayhOUFEuZ2V0Tm9kZSgpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBWVCwgTlBRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KG1hZ2ljcy5zLTEsIGdldFNoaWZ0QW1vdW50VHkoKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TZWxlY3Rpb25EQUcvVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4MWUzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9UYXJnZXRTZWxlY3Rpb25EQUdJbmZvLmNwcApAQCAtMCwwICsxLDIzIEBACisvLz09PS0tIFRhcmdldFNlbGVjdGlvbkRBR0luZm8uY3BwIC0gU2VsZWN0aW9uREFHIEluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaW1wbGVtZW50cyB0aGUgVGFyZ2V0U2VsZWN0aW9uREFHSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitUYXJnZXRTZWxlY3Rpb25EQUdJbmZvOjpUYXJnZXRTZWxlY3Rpb25EQUdJbmZvKGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKQorICA6IFREKFRNLmdldFRhcmdldERhdGEoKSkgeworfQorCitUYXJnZXRTZWxlY3Rpb25EQUdJbmZvOjp+VGFyZ2V0U2VsZWN0aW9uREFHSW5mbygpIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Nocmlua1dyYXBwaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Nocmlua1dyYXBwaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWFhMzhiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2hyaW5rV3JhcHBpbmcuY3BwCkBAIC0wLDAgKzEsMTE1MiBAQAorLy89PT0tLSBTaHJpbmtXcmFwcGluZy5jcHAgLSBSZWR1Y2Ugc3BpbGxzL3Jlc3RvcmVzIG9mIGNhbGxlZS1zYXZlZCByZWdzIC0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHNocmluayB3cmFwcGluZyB2YXJpYW50IG9mIHByb2xvZy9lcGlsb2cgaW5zZXJ0aW9uOgorLy8gLSBTcGlsbHMgYW5kIHJlc3RvcmVzIG9mIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgKENTUnMpIGFyZSBwbGFjZWQgaW4gdGhlCisvLyAgIG1hY2hpbmUgQ0ZHIHRvIHRpZ2h0bHkgc3Vycm91bmQgdGhlaXIgdXNlcyBzbyB0aGF0IGV4ZWN1dGlvbiBwYXRocyB0aGF0CisvLyAgIGRvIG5vdCB1c2UgQ1NScyBkbyBub3QgcGF5IHRoZSBzcGlsbC9yZXN0b3JlIHBlbmFsdHkuCisvLworLy8gLSBBdm9pZGluZyBwbGFjbWVudCBvZiBzcGlsbHMvcmVzdG9yZXMgaW4gbG9vcHM6IGlmIGEgQ1NSIGlzIHVzZWQgaW5zaWRlIGEKKy8vICAgbG9vcCB0aGUgc3BpbGxzIGFyZSBwbGFjZWQgaW4gdGhlIGxvb3AgcHJlaGVhZGVyLCBhbmQgcmVzdG9yZXMgYXJlCisvLyAgIHBsYWNlZCBpbiB0aGUgbG9vcCBleGl0IG5vZGVzICh0aGUgc3VjY2Vzc29ycyBvZiBsb29wIF9leGl0aW5nXyBub2RlcykuCisvLworLy8gLSBDb3ZlcmluZyBwYXRocyB3aXRob3V0IENTUiB1c2VzOgorLy8gICBJZiBhIHJlZ2lvbiBpbiBhIENGRyB1c2VzIENTUnMgYW5kIGhhcyBtdWx0aXBsZSBlbnRyeSBhbmQvb3IgZXhpdCBwb2ludHMsCisvLyAgIHRoZSB1c2UgaW5mbyBmb3IgdGhlIENTUnMgaW5zaWRlIHRoZSByZWdpb24gaXMgcHJvcGFnYXRlZCBvdXR3YXJkIGluIHRoZQorLy8gICBDRkcgdG8gZW5zdXJlIHZhbGlkaXR5IG9mIHRoZSBzcGlsbC9yZXN0b3JlIHBsYWNlbWVudHMuIFRoaXMgZGVjcmVhc2VzCisvLyAgIHRoZSBlZmZlY3RpdmVuZXNzIG9mIHNocmluayB3cmFwcGluZyBidXQgZG9lcyBub3QgcmVxdWlyZSBlZGdlIHNwbGl0dGluZworLy8gICBpbiB0aGUgbWFjaGluZSBDRkcuCisvLworLy8gVGhpcyBzaHJpbmsgd3JhcHBpbmcgaW1wbGVtZW50YXRpb24gdXNlcyBhbiBpdGVyYXRpdmUgYW5hbHlzaXMgdG8gZGV0ZXJtaW5lCisvLyB3aGljaCBiYXNpYyBibG9ja3MgcmVxdWlyZSBzcGlsbHMgYW5kIHJlc3RvcmVzIGZvciBDU1JzLgorLy8KKy8vIFRoaXMgcGFzcyB1c2VzIE1hY2hpbmVEb21pbmF0b3JzIGFuZCBNYWNoaW5lTG9vcEluZm8uIExvb3AgaW5mb3JtYXRpb24KKy8vIGlzIHVzZWQgdG8gcHJldmVudCBwbGFjZW1lbnQgb2YgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIHNwaWxscy9yZXN0b3JlcworLy8gaW4gdGhlIGJvZGllcyBvZiBsb29wcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInNocmluay13cmFwIgorCisjaW5jbHVkZSAiUHJvbG9nRXBpbG9nSW5zZXJ0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3BhcnNlQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMobnVtU1JSZWR1Y2VkLCAiTnVtYmVyIG9mIENTUiBzcGlsbHMrcmVzdG9yZXMgcmVkdWNlZC4iKTsKKworLy8gU2hyaW5rIFdyYXBwaW5nOgorc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK1Nocmlua1dyYXBwaW5nKCJzaHJpbmstd3JhcCIsCisgICAgICAgICAgICAgICBjbDo6ZGVzYygiU2hyaW5rIHdyYXAgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIHNwaWxscy9yZXN0b3JlcyIpKTsKKworLy8gU2hyaW5rIHdyYXAgb25seSB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLCBhIGRlYnVnZ2luZyBhaWQuCitzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KK1Nocmlua1dyYXBGdW5jKCJzaHJpbmstd3JhcC1mdW5jIiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICAgICAgIGNsOjpkZXNjKCJTaHJpbmsgd3JhcCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIiksCisgICAgICAgICAgICAgICBjbDo6dmFsdWVfZGVzYygiZnVuY25hbWUiKSwKKyAgICAgICAgICAgICAgIGNsOjppbml0KCIiKSk7CisKKy8vIERlYnVnZ2luZyBsZXZlbCBmb3Igc2hyaW5rIHdyYXBwaW5nLgorZW51bSBTaHJpbmtXcmFwRGVidWdMZXZlbCB7CisgIE5vbmUsIEJhc2ljSW5mbywgSXRlcmF0aW9ucywgRGV0YWlscworfTsKKworc3RhdGljIGNsOjpvcHQ8ZW51bSBTaHJpbmtXcmFwRGVidWdMZXZlbD4KK1Nocmlua1dyYXBEZWJ1Z2dpbmcoInNocmluay13cmFwLWRiZyIsIGNsOjpIaWRkZW4sCisgIGNsOjpkZXNjKCJQcmludCBzaHJpbmsgd3JhcHBpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIiksCisgIGNsOjp2YWx1ZXMoCisgICAgY2xFbnVtVmFsKE5vbmUgICAgICAsICJkaXNhYmxlIGRlYnVnIG91dHB1dCIpLAorICAgIGNsRW51bVZhbChCYXNpY0luZm8gLCAicHJpbnQgYmFzaWMgREYgc2V0cyIpLAorICAgIGNsRW51bVZhbChJdGVyYXRpb25zLCAicHJpbnQgU1Igc2V0cyBmb3IgZWFjaCBpdGVyYXRpb24iKSwKKyAgICBjbEVudW1WYWwoRGV0YWlscyAgICwgInByaW50IGFsbCBERiBzZXRzIiksCisgICAgY2xFbnVtVmFsRW5kKSk7CisKKwordm9pZCBQRUk6OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuc2V0UHJlc2VydmVzQ0ZHKCk7CisgIGlmIChTaHJpbmtXcmFwcGluZyB8fCBTaHJpbmtXcmFwRnVuYyAhPSAiIikgeworICAgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVMb29wSW5mbz4oKTsKKyAgICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgfQorICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZUxvb3BJbmZvPigpOworICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZURvbWluYXRvclRyZWU+KCk7CisgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFNocmlua1dyYXBwaW5nIGltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBDb252aWVuZW5jZXMgZm9yIGRlYWxpbmcgd2l0aCBtYWNoaW5lIGxvb3BzLgorTWFjaGluZUJhc2ljQmxvY2sqIFBFSTo6Z2V0VG9wTGV2ZWxMb29wUHJlaGVhZGVyKE1hY2hpbmVMb29wKiBMUCkgeworICBhc3NlcnQoTFAgJiYgIk1hY2hpbmUgbG9vcCBpcyBOVUxMLiIpOworICBNYWNoaW5lQmFzaWNCbG9jayogUEhEUiA9IExQLT5nZXRMb29wUHJlaGVhZGVyKCk7CisgIE1hY2hpbmVMb29wKiBQTFAgPSBMUC0+Z2V0UGFyZW50TG9vcCgpOworICB3aGlsZSAoUExQKSB7CisgICAgUEhEUiA9IFBMUC0+Z2V0TG9vcFByZWhlYWRlcigpOworICAgIFBMUCA9IFBMUC0+Z2V0UGFyZW50TG9vcCgpOworICB9CisgIHJldHVybiBQSERSOworfQorCitNYWNoaW5lTG9vcCogUEVJOjpnZXRUb3BMZXZlbExvb3BQYXJlbnQoTWFjaGluZUxvb3AgKkxQKSB7CisgIGlmIChMUCA9PSAwKQorICAgIHJldHVybiAwOworICBNYWNoaW5lTG9vcCogUExQID0gTFAtPmdldFBhcmVudExvb3AoKTsKKyAgd2hpbGUgKFBMUCkgeworICAgIExQID0gUExQOworICAgIFBMUCA9IFBMUC0+Z2V0UGFyZW50TG9vcCgpOworICB9CisgIHJldHVybiBMUDsKK30KKworYm9vbCBQRUk6OmlzUmV0dXJuQmxvY2soTWFjaGluZUJhc2ljQmxvY2sqIE1CQikgeworICByZXR1cm4gKE1CQiAmJiAhTUJCLT5lbXB0eSgpICYmIE1CQi0+YmFjaygpLmdldERlc2MoKS5pc1JldHVybigpKTsKK30KKworLy8gSW5pdGlhbGl6ZSBzaHJpbmsgd3JhcHBpbmcgREZBIHNldHMsIGNhbGxlZCBiZWZvcmUgaXRlcmF0aW9ucy4KK3ZvaWQgUEVJOjpjbGVhckFudGljQXZhaWxTZXRzKCkgeworICBBbnRpY0luLmNsZWFyKCk7CisgIEFudGljT3V0LmNsZWFyKCk7CisgIEF2YWlsSW4uY2xlYXIoKTsKKyAgQXZhaWxPdXQuY2xlYXIoKTsKK30KKworLy8gQ2xlYXIgYWxsIHNldHMgY29uc3RydWN0ZWQgYnkgc2hyaW5rIHdyYXBwaW5nLgordm9pZCBQRUk6OmNsZWFyQWxsU2V0cygpIHsKKyAgUmV0dXJuQmxvY2tzLmNsZWFyKCk7CisgIGNsZWFyQW50aWNBdmFpbFNldHMoKTsKKyAgVXNlZENTUmVncy5jbGVhcigpOworICBDU1JVc2VkLmNsZWFyKCk7CisgIFRMTG9vcHMuY2xlYXIoKTsKKyAgQ1NSU2F2ZS5jbGVhcigpOworICBDU1JSZXN0b3JlLmNsZWFyKCk7Cit9CisKKy8vIEluaXRpYWxpemUgYWxsIHNocmluayB3cmFwcGluZyBkYXRhLgordm9pZCBQRUk6OmluaXRTaHJpbmtXcmFwcGluZ0luZm8oKSB7CisgIGNsZWFyQWxsU2V0cygpOworICBFbnRyeUJsb2NrID0gMDsKKyNpZm5kZWYgTkRFQlVHCisgIEhhc0Zhc3RFeGl0UGF0aCA9IGZhbHNlOworI2VuZGlmCisgIFNocmlua1dyYXBUaGlzRnVuY3Rpb24gPSBTaHJpbmtXcmFwcGluZzsKKyAgLy8gREVCVUc6IGVuYWJsZSBvciBkaXNhYmxlIHNocmluayB3cmFwcGluZyBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24KKyAgLy8gdmlhIC0tc2hyaW5rLXdyYXAtZnVuYz08ZnVuY25hbWU+LgorI2lmbmRlZiBOREVCVUcKKyAgaWYgKFNocmlua1dyYXBGdW5jICE9ICIiKSB7CisgICAgc3RkOjpzdHJpbmcgTUZOYW1lID0gTUYtPmdldEZ1bmN0aW9uKCktPmdldE5hbWVTdHIoKTsKKyAgICBTaHJpbmtXcmFwVGhpc0Z1bmN0aW9uID0gKE1GTmFtZSA9PSBTaHJpbmtXcmFwRnVuYyk7CisgIH0KKyNlbmRpZgorfQorCisKKy8vLyBwbGFjZUNTUlNwaWxsc0FuZFJlc3RvcmVzIC0gZGV0ZXJtaW5lIHdoaWNoIE1CQnMgb2YgdGhlIGZ1bmN0aW9uCisvLy8gbmVlZCBzYXZlLCByZXN0b3JlIGNvZGUgZm9yIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgYnkgZG9pbmcgYSBERiBhbmFseXNpcworLy8vIHNpbWlsYXIgdG8gdGhlIG9uZSB1c2VkIGluIGNvZGUgbW90aW9uIChHVk5QUkUpLiBUaGlzIHByb2R1Y2VzIG1hcHMgb2YgTUJCcworLy8vIHRvIHNldHMgb2YgcmVnaXN0ZXJzIChDU1JzKSBmb3Igc2F2ZXMgYW5kIHJlc3RvcmVzLiBNYWNoaW5lTG9vcEluZm8KKy8vLyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IENTUiBzYXZlL3Jlc3RvcmUgY29kZSBpcyBub3QgcGxhY2VkIGluc2lkZSBsb29wcy4KKy8vLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBtYXBzIG9mIE1CQnMgLT4gQ1NScyB0byBzcGlsbCBhbmQgcmVzdG9yZQorLy8vIGluIENTUlNhdmUsIENTUlJlc3RvcmUuCisvLy8KKy8vLyBJZiBzaHJpbmsgd3JhcHBpbmcgaXMgbm90IGJlaW5nIHBlcmZvcm1lZCwgcGxhY2UgYWxsIHNwaWxscyBpbgorLy8vIHRoZSBlbnRyeSBibG9jaywgYWxsIHJlc3RvcmVzIGluIHJldHVybiBibG9ja3MuIEluIHRoaXMgY2FzZSwKKy8vLyBDU1JTYXZlIGhhcyBhIHNpbmdsZSBtYXBwaW5nLCBDU1JSZXN0b3JlIGhhcyBtYXBwaW5ncyBmb3IgZWFjaAorLy8vIHJldHVybiBibG9jay4KKy8vLwordm9pZCBQRUk6OnBsYWNlQ1NSU3BpbGxzQW5kUmVzdG9yZXMoTWFjaGluZUZ1bmN0aW9uICZGbikgeworCisgIERFQlVHKE1GID0gJkZuKTsKKworICBpbml0U2hyaW5rV3JhcHBpbmdJbmZvKCk7CisKKyAgREVCVUcoaWYgKFNocmlua1dyYXBUaGlzRnVuY3Rpb24pIHsKKyAgICAgIGRiZ3MoKSA8PCAiUGxhY2UgQ1NSIHNwaWxscy9yZXN0b3JlcyBmb3IgIgorICAgICAgICAgICAgIDw8IE1GLT5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkgPDwgIlxuIjsKKyAgICB9KTsKKworICBpZiAoY2FsY3VsYXRlU2V0cyhGbikpCisgICAgcGxhY2VTcGlsbHNBbmRSZXN0b3JlcyhGbik7Cit9CisKKy8vLyBjYWxjQW50aWNJbk91dCAtIGNhbGN1bGF0ZSB0aGUgYW50aWNpcGF0ZWQgaW4vb3V0IHJlZyBzZXRzCisvLy8gZm9yIHRoZSBnaXZlbiBNQkIgYnkgbG9va2luZyBmb3J3YXJkIGluIHRoZSBNQ0ZHIGF0IE1CQidzCisvLy8gc3VjY2Vzc29ycy4KKy8vLworYm9vbCBQRUk6OmNhbGNBbnRpY0luT3V0KE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIpIHsKKyAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gQW50aWNPdXRbTUJCXSA9IElOVEVSU0VDVChBbnRpY0luW1NdIGZvciBTIGluIFNVQ0NFU1NPUlMoTUJCKSkKKyAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA0PiBzdWNjZXNzb3JzOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpzdWNjX2l0ZXJhdG9yIFNJID0gTUJCLT5zdWNjX2JlZ2luKCksCisgICAgICAgICBTRSA9IE1CQi0+c3VjY19lbmQoKTsgU0kgIT0gU0U7ICsrU0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogU1VDQyA9ICpTSTsKKyAgICBpZiAoU1VDQyAhPSBNQkIpCisgICAgICBzdWNjZXNzb3JzLnB1c2hfYmFjayhTVUNDKTsKKyAgfQorCisgIHVuc2lnbmVkIGkgPSAwLCBlID0gc3VjY2Vzc29ycy5zaXplKCk7CisgIGlmIChpICE9IGUpIHsKKyAgICBDU1JlZ1NldCBwcmV2QW50aWNPdXQgPSBBbnRpY091dFtNQkJdOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBTVUNDID0gc3VjY2Vzc29yc1tpXTsKKworICAgIEFudGljT3V0W01CQl0gPSBBbnRpY0luW1NVQ0NdOworICAgIGZvciAoKytpOyBpICE9IGU7ICsraSkgeworICAgICAgU1VDQyA9IHN1Y2Nlc3NvcnNbaV07CisgICAgICBBbnRpY091dFtNQkJdICY9IEFudGljSW5bU1VDQ107CisgICAgfQorICAgIGlmIChwcmV2QW50aWNPdXQgIT0gQW50aWNPdXRbTUJCXSkKKyAgICAgIGNoYW5nZWQgPSB0cnVlOworICB9CisKKyAgLy8gQW50aWNJbltNQkJdID0gVU5JT04oQ1NSVXNlZFtNQkJdLCBBbnRpY091dFtNQkJdKTsKKyAgQ1NSZWdTZXQgcHJldkFudGljSW4gPSBBbnRpY0luW01CQl07CisgIEFudGljSW5bTUJCXSA9IENTUlVzZWRbTUJCXSB8IEFudGljT3V0W01CQl07CisgIGlmIChwcmV2QW50aWNJbiB8PSBBbnRpY0luW01CQl0pCisgICAgY2hhbmdlZCA9IHRydWU7CisgIHJldHVybiBjaGFuZ2VkOworfQorCisvLy8gY2FsY0F2YWlsSW5PdXQgLSBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBpbi9vdXQgcmVnIHNldHMKKy8vLyBmb3IgdGhlIGdpdmVuIE1CQiBieSBsb29raW5nIGJhY2t3YXJkIGluIHRoZSBNQ0ZHIGF0IE1CQidzCisvLy8gcHJlZGVjZXNzb3JzLgorLy8vCitib29sIFBFSTo6Y2FsY0F2YWlsSW5PdXQoTWFjaGluZUJhc2ljQmxvY2sqIE1CQikgeworICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKworICAvLyBBdmFpbEluW01CQl0gPSBJTlRFUlNFQ1QoQXZhaWxPdXRbUF0gZm9yIFAgaW4gUFJFREVDRVNTT1JTKE1CQikpCisgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgND4gcHJlZGVjZXNzb3JzOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpwcmVkX2l0ZXJhdG9yIFBJID0gTUJCLT5wcmVkX2JlZ2luKCksCisgICAgICAgICBQRSA9IE1CQi0+cHJlZF9lbmQoKTsgUEkgIT0gUEU7ICsrUEkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogUFJFRCA9ICpQSTsKKyAgICBpZiAoUFJFRCAhPSBNQkIpCisgICAgICBwcmVkZWNlc3NvcnMucHVzaF9iYWNrKFBSRUQpOworICB9CisKKyAgdW5zaWduZWQgaSA9IDAsIGUgPSBwcmVkZWNlc3NvcnMuc2l6ZSgpOworICBpZiAoaSAhPSBlKSB7CisgICAgQ1NSZWdTZXQgcHJldkF2YWlsSW4gPSBBdmFpbEluW01CQl07CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIFBSRUQgPSBwcmVkZWNlc3NvcnNbaV07CisKKyAgICBBdmFpbEluW01CQl0gPSBBdmFpbE91dFtQUkVEXTsKKyAgICBmb3IgKCsraTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFBSRUQgPSBwcmVkZWNlc3NvcnNbaV07CisgICAgICBBdmFpbEluW01CQl0gJj0gQXZhaWxPdXRbUFJFRF07CisgICAgfQorICAgIGlmIChwcmV2QXZhaWxJbiAhPSBBdmFpbEluW01CQl0pCisgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgfQorCisgIC8vIEF2YWlsT3V0W01CQl0gPSBVTklPTihDU1JVc2VkW01CQl0sIEF2YWlsSW5bTUJCXSk7CisgIENTUmVnU2V0IHByZXZBdmFpbE91dCA9IEF2YWlsT3V0W01CQl07CisgIEF2YWlsT3V0W01CQl0gPSBDU1JVc2VkW01CQl0gfCBBdmFpbEluW01CQl07CisgIGlmIChwcmV2QXZhaWxPdXQgfD0gQXZhaWxPdXRbTUJCXSkKKyAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8vLyBjYWxjdWxhdGVBbnRpY0F2YWlsIC0gYnVpbGQgdGhlIHNldHMgYW50aWNpcGF0ZWQgYW5kIGF2YWlsYWJsZQorLy8vIHJlZ2lzdGVycyBpbiB0aGUgTUNGRyBvZiB0aGUgY3VycmVudCBmdW5jdGlvbiBpdGVyYXRpdmVseSwKKy8vLyBkb2luZyBhIGNvbWJpbmVkIGZvcndhcmQgYW5kIGJhY2t3YXJkIGFuYWx5c2lzLgorLy8vCit2b2lkIFBFSTo6Y2FsY3VsYXRlQW50aWNBdmFpbChNYWNoaW5lRnVuY3Rpb24gJkZuKSB7CisgIC8vIEluaXRpYWxpemUgZGF0YSBmbG93IHNldHMuCisgIGNsZWFyQW50aWNBdmFpbFNldHMoKTsKKworICAvLyBDYWx1bGF0ZSBBbnRpY3tJbixPdXR9IGFuZCBBdmFpbHtJbixPdXR9IGl0ZXJhdGl2ZWx5IG9uIHRoZSBNQ0ZHLgorICBib29sIGNoYW5nZWQgPSB0cnVlOworICB1bnNpZ25lZCBpdGVyYXRpb25zID0gMDsKKyAgd2hpbGUgKGNoYW5nZWQpIHsKKyAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgKytpdGVyYXRpb25zOworICAgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkJJID0gRm4uYmVnaW4oKSwgTUJCRSA9IEZuLmVuZCgpOworICAgICAgICAgTUJCSSAhPSBNQkJFOyArK01CQkkpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIgPSBNQkJJOworCisgICAgICAvLyBDYWxjdWxhdGUgYW50aWNpcGF0ZWQgaW4sIG91dCByZWdzIGF0IE1CQiBmcm9tCisgICAgICAvLyBhbnRpY2lwYXRlZCBhdCBzdWNjZXNzb3JzIG9mIE1CQi4KKyAgICAgIGNoYW5nZWQgfD0gY2FsY0FudGljSW5PdXQoTUJCKTsKKworICAgICAgLy8gQ2FsY3VsYXRlIGF2YWlsYWJsZSBpbiwgb3V0IHJlZ3MgYXQgTUJCIGZyb20KKyAgICAgIC8vIGF2YWlsYWJsZSBhdCBwcmVkZWNlc3NvcnMgb2YgTUJCLgorICAgICAgY2hhbmdlZCB8PSBjYWxjQXZhaWxJbk91dChNQkIpOworICAgIH0KKyAgfQorCisgIERFQlVHKHsKKyAgICAgIGlmIChTaHJpbmtXcmFwRGVidWdnaW5nID49IERldGFpbHMpIHsKKyAgICAgICAgZGJncygpCisgICAgICAgICAgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgICAgICAgPDwgIiBBbnRpYy9BdmFpbCBTZXRzOlxuIgorICAgICAgICAgIDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICAgICAgIDw8ICJpdGVyYXRpb25zID0gIiA8PCBpdGVyYXRpb25zIDw8ICJcbiIKKyAgICAgICAgICA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAgICAgICA8PCAiTUJCIHwgVVNFRCB8IEFOVElDX0lOIHwgQU5USUNfT1VUIHwgQVZBSUxfSU4gfCBBVkFJTF9PVVRcbiIKKyAgICAgICAgICA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisKKyAgICAgICAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBGbi5iZWdpbigpLCBNQkJFID0gRm4uZW5kKCk7CisgICAgICAgICAgICAgTUJCSSAhPSBNQkJFOyArK01CQkkpIHsKKyAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogTUJCID0gTUJCSTsKKyAgICAgICAgICBkdW1wU2V0cyhNQkIpOworICAgICAgICB9CisKKyAgICAgICAgZGJncygpCisgICAgICAgICAgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgICAgfQorICAgIH0pOworfQorCisvLy8gcHJvcGFnYXRlVXNlc0Fyb3VuZExvb3AgLSBjb3B5IHVzZWQgcmVnaXN0ZXIgaW5mbyBmcm9tIE1CQiB0byBhbGwgYmxvY2tzCisvLy8gb2YgdGhlIGxvb3AgZ2l2ZW4gYnkgTFAgYW5kIGl0cyBwYXJlbnQgbG9vcHMuIFRoaXMgcHJldmVudHMgc3BpbGxzL3Jlc3RvcmVzCisvLy8gZnJvbSBiZWluZyBwbGFjZWQgaW4gdGhlIGJvZGllcyBvZiBsb29wcy4KKy8vLwordm9pZCBQRUk6OnByb3BhZ2F0ZVVzZXNBcm91bmRMb29wKE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIsIE1hY2hpbmVMb29wKiBMUCkgeworICBpZiAoISBNQkIgfHwgIUxQKQorICAgIHJldHVybjsKKworICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+IGxvb3BCbG9ja3MgPSBMUC0+Z2V0QmxvY2tzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBsb29wQmxvY2tzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogTEJCID0gbG9vcEJsb2Nrc1tpXTsKKyAgICBpZiAoTEJCID09IE1CQikKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChDU1JVc2VkW0xCQl0uY29udGFpbnMoQ1NSVXNlZFtNQkJdKSkKKyAgICAgIGNvbnRpbnVlOworICAgIENTUlVzZWRbTEJCXSB8PSBDU1JVc2VkW01CQl07CisgIH0KK30KKworLy8vIGNhbGN1bGF0ZVNldHMgLSBjb2xsZWN0IHRoZSBDU1JzIHVzZWQgaW4gdGhpcyBmdW5jdGlvbiwgY29tcHV0ZQorLy8vIHRoZSBERiBzZXRzIHRoYXQgZGVzY3JpYmUgdGhlIGluaXRpYWwgbWluaW1hbCByZWdpb25zIGluIHRoZQorLy8vIE1hY2hpbmUgQ0ZHIGFyb3VuZCB3aGljaCBDU1Igc3BpbGxzIGFuZCByZXN0b3JlcyBtdXN0IGJlIHBsYWNlZC4KKy8vLworLy8vIEFkZGl0aW9uYWxseSwgdGhpcyBmdW5jdGlvbiBkZWNpZGVzIGlmIHNocmluayB3cmFwcGluZyBzaG91bGQKKy8vLyBiZSBkaXNhYmxlZCBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24sIGNoZWNraW5nIHRoZSBmb2xsb3dpbmc6CisvLy8gIDEuIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGhhcyBtb3JlIHRoYW4gNTAwIE1CQnM6IGhldXJpc3RpYyBsaW1pdAorLy8vICAgICBvbiBmdW5jdGlvbiBzaXplIHRvIHJlZHVjZSBjb21waWxlIHRpbWUgaW1wYWN0IG9mIHRoZSBjdXJyZW50CisvLy8gICAgIGl0ZXJhdGl2ZSBhbGdvcml0aG0uCisvLy8gIDIuIGFsbCBDU1JzIGFyZSB1c2VkIGluIHRoZSBlbnRyeSBibG9jay4KKy8vLyAgMy4gYWxsIENTUnMgYXJlIHVzZWQgaW4gYWxsIGltbWVkaWF0ZSBzdWNjZXNzb3JzIG9mIHRoZSBlbnRyeSBibG9jay4KKy8vLyAgNC4gYWxsIENTUnMgYXJlIHVzZWQgaW4gYSBzdWJzZXQgb2YgYmxvY2tzLCBlYWNoIG9mIHdoaWNoIGRvbWluYXRlcworLy8vICAgICBhbGwgcmV0dXJuIGJsb2Nrcy4gVGhlc2UgYmxvY2tzLCB0YWtlbiBhcyBhIHN1YmdyYXBoIG9mIHRoZSBNQ0ZHLAorLy8vICAgICBhcmUgZXF1aXZhbGVudCB0byB0aGUgZW50cnkgYmxvY2sgc2luY2UgYWxsIGV4ZWN1dGlvbiBwYXRocyBwYXNzCisvLy8gICAgIHRocm91Z2ggdGhlbS4KKy8vLworYm9vbCBQRUk6OmNhbGN1bGF0ZVNldHMoTWFjaGluZUZ1bmN0aW9uICZGbikgeworICAvLyBTZXRzIHVzZWQgdG8gY29tcHV0ZSBzcGlsbCwgcmVzdG9yZSBwbGFjZW1lbnQgc2V0cy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiBDU0kgPQorICAgIEZuLmdldEZyYW1lSW5mbygpLT5nZXRDYWxsZWVTYXZlZEluZm8oKTsKKworICAvLyBJZiBubyBDU1JzIHVzZWQsIHdlIGFyZSBkb25lLgorICBpZiAoQ1NJLmVtcHR5KCkpIHsKKyAgICBERUJVRyhpZiAoU2hyaW5rV3JhcFRoaXNGdW5jdGlvbikKKyAgICAgICAgICAgIGRiZ3MoKSA8PCAiRElTQUJMRUQ6ICIgPDwgRm4uZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIjogdXNlcyBubyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBTYXZlIHJlZnMgdG8gZW50cnkgYW5kIHJldHVybiBibG9ja3MuCisgIEVudHJ5QmxvY2sgPSBGbi5iZWdpbigpOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUJCID0gRm4uYmVnaW4oKSwgRSA9IEZuLmVuZCgpOworICAgICAgIE1CQiAhPSBFOyArK01CQikKKyAgICBpZiAoaXNSZXR1cm5CbG9jayhNQkIpKQorICAgICAgUmV0dXJuQmxvY2tzLnB1c2hfYmFjayhNQkIpOworCisgIC8vIERldGVybWluZSBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBmYXN0IGV4aXQgcGF0aHMuCisgIERFQlVHKGlmIChTaHJpbmtXcmFwVGhpc0Z1bmN0aW9uKQorICAgICAgICAgIGZpbmRGYXN0RXhpdFBhdGgoKSk7CisKKyAgLy8gTGltaXQgc2hyaW5rIHdyYXBwaW5nIHZpYSB0aGUgY3VycmVudCBpdGVyYXRpdmUgYml0IHZlY3RvcgorICAvLyBpbXBsZW1lbnRhdGlvbiB0byBmdW5jdGlvbnMgd2l0aCA8PSA1MDAgTUJCcy4KKyAgaWYgKEZuLnNpemUoKSA+IDUwMCkgeworICAgIERFQlVHKGlmIChTaHJpbmtXcmFwVGhpc0Z1bmN0aW9uKQorICAgICAgICAgICAgZGJncygpIDw8ICJESVNBQkxFRDogIiA8PCBGbi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiOiB0b28gbGFyZ2UgKCIgPDwgRm4uc2l6ZSgpIDw8ICIgTUJCcylcbiIpOworICAgIFNocmlua1dyYXBUaGlzRnVuY3Rpb24gPSBmYWxzZTsKKyAgfQorCisgIC8vIFJldHVybiBub3cgaWYgbm90IHNocmluayB3cmFwcGluZy4KKyAgaWYgKCEgU2hyaW5rV3JhcFRoaXNGdW5jdGlvbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ29sbGVjdCBzZXQgb2YgdXNlZCBDU1JzLgorICBmb3IgKHVuc2lnbmVkIGlueCA9IDAsIGUgPSBDU0kuc2l6ZSgpOyBpbnggIT0gZTsgKytpbngpIHsKKyAgICBVc2VkQ1NSZWdzLnNldChpbngpOworICB9CisKKyAgLy8gV2FsayBpbnN0cnVjdGlvbnMgaW4gYWxsIE1CQnMsIGNyZWF0ZSBDU1JVc2VkW10gc2V0cywgY2hvb3NlCisgIC8vIHdoZXRoZXIgb3Igbm90IHRvIHNocmluayB3cmFwIHRoaXMgZnVuY3Rpb24uCisgIE1hY2hpbmVMb29wSW5mbyAmTEkgPSBnZXRBbmFseXNpczxNYWNoaW5lTG9vcEluZm8+KCk7CisgIE1hY2hpbmVEb21pbmF0b3JUcmVlICZEVCA9IGdldEFuYWx5c2lzPE1hY2hpbmVEb21pbmF0b3JUcmVlPigpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IEZuLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworCisgIGJvb2wgYWxsQ1NSVXNlc0luRW50cnlCbG9jayA9IHRydWU7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkJJID0gRm4uYmVnaW4oKSwgTUJCRSA9IEZuLmVuZCgpOworICAgICAgIE1CQkkgIT0gTUJCRTsgKytNQkJJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiA9IE1CQkk7CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi0+YmVnaW4oKTsgSSAhPSBNQkItPmVuZCgpOyArK0kpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaW54ID0gMCwgZSA9IENTSS5zaXplKCk7IGlueCAhPSBlOyArK2lueCkgeworICAgICAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaW54XS5nZXRSZWcoKTsKKyAgICAgICAgLy8gSWYgaW5zdHJ1Y3Rpb24gSSByZWFkcyBvciBtb2RpZmllcyBSZWcsIGFkZCBpdCB0byBVc2VkQ1NSZWdzLAorICAgICAgICAvLyBDU1JVc2VkIG1hcCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgICAgICAgIGZvciAodW5zaWduZWQgb3BJbnggPSAwLCBvcEVuZCA9IEktPmdldE51bU9wZXJhbmRzKCk7CisgICAgICAgICAgICAgb3BJbnggIT0gb3BFbmQ7ICsrb3BJbngpIHsKKyAgICAgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJLT5nZXRPcGVyYW5kKG9wSW54KTsKKyAgICAgICAgICBpZiAoISAoTU8uaXNSZWcoKSAmJiAoTU8uaXNVc2UoKSB8fCBNTy5pc0RlZigpKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB1bnNpZ25lZCBNT1JlZyA9IE1PLmdldFJlZygpOworICAgICAgICAgIGlmICghTU9SZWcpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBpZiAoTU9SZWcgPT0gUmVnIHx8CisgICAgICAgICAgICAgIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihNT1JlZykgJiYKKyAgICAgICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykgJiYKKyAgICAgICAgICAgICAgIFRSSS0+aXNTdWJSZWdpc3RlcihSZWcsIE1PUmVnKSkpIHsKKyAgICAgICAgICAgIC8vIENTUiBSZWcgaXMgZGVmaW5lZC91c2VkIGluIGJsb2NrIE1CQi4KKyAgICAgICAgICAgIENTUlVzZWRbTUJCXS5zZXQoaW54KTsKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciB1c2VzIGluIEVudHJ5QmxvY2suCisgICAgICAgICAgICBpZiAoTUJCICE9IEVudHJ5QmxvY2spCisgICAgICAgICAgICAgIGFsbENTUlVzZXNJbkVudHJ5QmxvY2sgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoQ1NSVXNlZFtNQkJdLmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIFByb3BhZ2F0ZSBDU1JVc2VkW01CQl0gaW4gbG9vcHMKKyAgICBpZiAoTWFjaGluZUxvb3AqIExQID0gTEkuZ2V0TG9vcEZvcihNQkIpKSB7CisgICAgICAvLyBBZGQgdG9wIGxldmVsIGxvb3AgdG8gd29yayBsaXN0LgorICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIEhEUiA9IGdldFRvcExldmVsTG9vcFByZWhlYWRlcihMUCk7CisgICAgICBNYWNoaW5lTG9vcCogUExQID0gZ2V0VG9wTGV2ZWxMb29wUGFyZW50KExQKTsKKworICAgICAgaWYgKCEgSERSKSB7CisgICAgICAgIEhEUiA9IFBMUC0+Z2V0SGVhZGVyKCk7CisgICAgICAgIGFzc2VydChIRFItPnByZWRfc2l6ZSgpID4gMCAmJiAiTG9vcCBoZWFkZXIgaGFzIG5vIHByZWRlY2Vzc29ycz8iKTsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6OnByZWRfaXRlcmF0b3IgUEkgPSBIRFItPnByZWRfYmVnaW4oKTsKKyAgICAgICAgSERSID0gKlBJOworICAgICAgfQorICAgICAgVExMb29wc1tIRFJdID0gUExQOworCisgICAgICAvLyBQdXNoIHVzZXMgZnJvbSBpbnNpZGUgbG9vcCB0byBpdHMgcGFyZW50IGxvb3BzLAorICAgICAgLy8gb3IgdG8gYWxsIG90aGVyIE1CQnMgaW4gaXRzIGxvb3AuCisgICAgICBpZiAoTFAtPmdldExvb3BEZXB0aCgpID4gMSkgeworICAgICAgICBmb3IgKE1hY2hpbmVMb29wKiBQTFAgPSBMUC0+Z2V0UGFyZW50TG9vcCgpOyBQTFA7CisgICAgICAgICAgICAgUExQID0gUExQLT5nZXRQYXJlbnRMb29wKCkpIHsKKyAgICAgICAgICBwcm9wYWdhdGVVc2VzQXJvdW5kTG9vcChNQkIsIFBMUCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByb3BhZ2F0ZVVzZXNBcm91bmRMb29wKE1CQiwgTFApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChhbGxDU1JVc2VzSW5FbnRyeUJsb2NrKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJESVNBQkxFRDogIiA8PCBGbi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIjogYWxsIENTUnMgdXNlZCBpbiBFbnRyeUJsb2NrXG4iKTsKKyAgICBTaHJpbmtXcmFwVGhpc0Z1bmN0aW9uID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgYm9vbCBhbGxDU1JzVXNlZEluRW50cnlGYW5vdXQgPSB0cnVlOworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnN1Y2NfaXRlcmF0b3IgU0kgPSBFbnRyeUJsb2NrLT5zdWNjX2JlZ2luKCksCisgICAgICAgICAgIFNFID0gRW50cnlCbG9jay0+c3VjY19lbmQoKTsgU0kgIT0gU0U7ICsrU0kpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBTVUNDID0gKlNJOworICAgICAgaWYgKENTUlVzZWRbU1VDQ10gIT0gVXNlZENTUmVncykKKyAgICAgICAgYWxsQ1NSc1VzZWRJbkVudHJ5RmFub3V0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChhbGxDU1JzVXNlZEluRW50cnlGYW5vdXQpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRElTQUJMRUQ6ICIgPDwgRm4uZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIjogYWxsIENTUnMgdXNlZCBpbiBpbW0gc3VjY2Vzc29ycyBvZiBFbnRyeUJsb2NrXG4iKTsKKyAgICAgIFNocmlua1dyYXBUaGlzRnVuY3Rpb24gPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBpZiAoU2hyaW5rV3JhcFRoaXNGdW5jdGlvbikgeworICAgIC8vIENoZWNrIGlmIE1CQiB1c2VzIENTUnMgYW5kIGRvbWluYXRlcyBhbGwgZXhpdCBub2Rlcy4KKyAgICAvLyBTdWNoIG5vZGVzIGFyZSBlcXVpdi4gdG8gdGhlIGVudHJ5IG5vZGUgdy5yLnQuCisgICAgLy8gQ1NSIHVzZXM6IGV2ZXJ5IHBhdGggdGhyb3VnaCB0aGUgZnVuY3Rpb24gbXVzdAorICAgIC8vIHBhc3MgdGhyb3VnaCB0aGlzIG5vZGUuIElmIGVhY2ggQ1NSIGlzIHVzZWQgYXQgbGVhc3QKKyAgICAvLyBvbmNlIGJ5IHRoZXNlIG5vZGVzLCBzaHJpbmsgd3JhcHBpbmcgaXMgZGlzYWJsZWQuCisgICAgQ1NSZWdTZXQgQ1NSVXNlZEluQ2hva2VQb2ludHM7CisgICAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBGbi5iZWdpbigpLCBNQkJFID0gRm4uZW5kKCk7CisgICAgICAgICBNQkJJICE9IE1CQkU7ICsrTUJCSSkgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiA9IE1CQkk7CisgICAgICBpZiAoTUJCID09IEVudHJ5QmxvY2sgfHwgQ1NSVXNlZFtNQkJdLmVtcHR5KCkgfHwgTUJCLT5zdWNjX3NpemUoKSA8IDEpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgYm9vbCBkb21pbmF0ZXNFeGl0Tm9kZXMgPSB0cnVlOworICAgICAgZm9yICh1bnNpZ25lZCByaSA9IDAsIHJlID0gUmV0dXJuQmxvY2tzLnNpemUoKTsgcmkgIT0gcmU7ICsrcmkpCisgICAgICAgIGlmICghIERULmRvbWluYXRlcyhNQkIsIFJldHVybkJsb2Nrc1tyaV0pKSB7CisgICAgICAgICAgZG9taW5hdGVzRXhpdE5vZGVzID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGlmIChkb21pbmF0ZXNFeGl0Tm9kZXMpIHsKKyAgICAgICAgQ1NSVXNlZEluQ2hva2VQb2ludHMgfD0gQ1NSVXNlZFtNQkJdOworICAgICAgICBpZiAoQ1NSVXNlZEluQ2hva2VQb2ludHMgPT0gVXNlZENTUmVncykgeworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRElTQUJMRUQ6ICIgPDwgRm4uZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IGFsbCBDU1JzIHVzZWQgaW4gY2hva2UgcG9pbnQocykgYXQgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBnZXRCYXNpY0Jsb2NrTmFtZShNQkIpIDw8ICJcbiIpOworICAgICAgICAgIFNocmlua1dyYXBUaGlzRnVuY3Rpb24gPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFJldHVybiBub3cgaWYgd2UgaGF2ZSBkZWNpZGVkIG5vdCB0byBhcHBseSBzaHJpbmsgd3JhcHBpbmcKKyAgLy8gdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIGlmICghIFNocmlua1dyYXBUaGlzRnVuY3Rpb24pCisgICAgcmV0dXJuIGZhbHNlOworCisgIERFQlVHKHsKKyAgICAgIGRiZ3MoKSA8PCAiRU5BQkxFRDogIiA8PCBGbi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCk7CisgICAgICBpZiAoSGFzRmFzdEV4aXRQYXRoKQorICAgICAgICBkYmdzKCkgPDwgIiAoZmFzdCBleGl0IHBhdGgpIjsKKyAgICAgIGRiZ3MoKSA8PCAiXG4iOworICAgICAgaWYgKFNocmlua1dyYXBEZWJ1Z2dpbmcgPj0gQmFzaWNJbmZvKSB7CisgICAgICAgIGRiZ3MoKSA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgIDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICAgICAgZGJncygpIDw8ICJVc2VkQ1NSZWdzID0gIiA8PCBzdHJpbmdpZnlDU1JlZ1NldChVc2VkQ1NSZWdzKSA8PCAiXG4iOworICAgICAgICBpZiAoU2hyaW5rV3JhcERlYnVnZ2luZyA+PSBEZXRhaWxzKSB7CisgICAgICAgICAgZGJncygpIDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICAgICAgICAgICA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgICAgICAgZHVtcEFsbFVzZWQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworCisgIC8vIEJ1aWxkIGluaXRpYWwgREYgc2V0cyB0byBkZXRlcm1pbmUgbWluaW1hbCByZWdpb25zIGluIHRoZQorICAvLyBNYWNoaW5lIENGRyBhcm91bmQgd2hpY2ggQ1NScyBtdXN0IGJlIHNwaWxsZWQgYW5kIHJlc3RvcmVkLgorICBjYWxjdWxhdGVBbnRpY0F2YWlsKEZuKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGFkZFVzZXNGb3JNRU1FUmVnaW9uIC0gYWRkIHVzZXMgb2YgQ1NScyBzcGlsbGVkIG9yIHJlc3RvcmVkIGluCisvLy8gbXVsdGktZW50cnksIG11bHRpLWV4aXQgKE1FTUUpIHJlZ2lvbnMgc28gc3BpbGwgYW5kIHJlc3RvcmUKKy8vLyBwbGFjZW1lbnQgd2lsbCBub3QgYnJlYWsgY29kZSB0aGF0IGVudGVycyBvciBsZWF2ZXMgYQorLy8vIHNocmluay13cmFwcGVkIHJlZ2lvbiBieSBpbmR1Y2luZyBzcGlsbHMgd2l0aCBubyBtYXRjaGluZworLy8vIHJlc3RvcmVzIG9yIHJlc3RvcmVzIHdpdGggbm8gbWF0Y2hpbmcgc3BpbGxzLiBBIE1FTUUgcmVnaW9uCisvLy8gaXMgYSBzdWJncmFwaCBvZiB0aGUgTUNGRyB3aXRoIG11bHRpcGxlIGVudHJ5IGVkZ2VzLCBtdWx0aXBsZQorLy8vIGV4aXQgZWRnZXMsIG9yIGJvdGguIFRoaXMgY29kZSBwcm9wYWdhdGVzIHVzZSBpbmZvcm1hdGlvbgorLy8vIHRocm91Z2ggdGhlIE1DRkcgdW50aWwgYWxsIHBhdGhzIHJlcXVpcmluZyBzcGlsbHMgYW5kIHJlc3RvcmVzCisvLy8gX291dHNpZGVfIHRoZSBjb21wdXRlZCBtaW5pbWFsIHBsYWNlbWVudCByZWdpb25zIGhhdmUgYmVlbiBjb3ZlcmVkLgorLy8vCitib29sIFBFSTo6YWRkVXNlc0Zvck1FTUVSZWdpb24oTWFjaGluZUJhc2ljQmxvY2sqIE1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDQ+JiBibGtzKSB7CisgIGlmIChNQkItPnN1Y2Nfc2l6ZSgpIDwgMiAmJiBNQkItPnByZWRfc2l6ZSgpIDwgMikgeworICAgIGJvb2wgcHJvY2Vzc1RoaXNCbG9jayA9IGZhbHNlOworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnN1Y2NfaXRlcmF0b3IgU0kgPSBNQkItPnN1Y2NfYmVnaW4oKSwKKyAgICAgICAgICAgU0UgPSBNQkItPnN1Y2NfZW5kKCk7IFNJICE9IFNFOyArK1NJKSB7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayogU1VDQyA9ICpTSTsKKyAgICAgIGlmIChTVUNDLT5wcmVkX3NpemUoKSA+IDEpIHsKKyAgICAgICAgcHJvY2Vzc1RoaXNCbG9jayA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIUNTUlJlc3RvcmVbTUJCXS5lbXB0eSgpICYmIE1CQi0+c3VjY19zaXplKCkgPiAwKSB7CisgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpwcmVkX2l0ZXJhdG9yIFBJID0gTUJCLT5wcmVkX2JlZ2luKCksCisgICAgICAgICAgICAgUEUgPSBNQkItPnByZWRfZW5kKCk7IFBJICE9IFBFOyArK1BJKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBQUkVEID0gKlBJOworICAgICAgICBpZiAoUFJFRC0+c3VjY19zaXplKCkgPiAxKSB7CisgICAgICAgICAgcHJvY2Vzc1RoaXNCbG9jayA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCEgcHJvY2Vzc1RoaXNCbG9jaykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIENTUmVnU2V0IHByb3A7CisgIGlmICghQ1NSU2F2ZVtNQkJdLmVtcHR5KCkpCisgICAgcHJvcCA9IENTUlNhdmVbTUJCXTsKKyAgZWxzZSBpZiAoIUNTUlJlc3RvcmVbTUJCXS5lbXB0eSgpKQorICAgIHByb3AgPSBDU1JSZXN0b3JlW01CQl07CisgIGVsc2UKKyAgICBwcm9wID0gQ1NSVXNlZFtNQkJdOworICBpZiAocHJvcC5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBQcm9wYWdhdGUgc2VsZWN0ZWQgYml0cyB0byBzdWNjZXNzb3JzLCBwcmVkZWNlc3NvcnMgb2YgTUJCLgorICBib29sIGFkZGVkVXNlcyA9IGZhbHNlOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpzdWNjX2l0ZXJhdG9yIFNJID0gTUJCLT5zdWNjX2JlZ2luKCksCisgICAgICAgICBTRSA9IE1CQi0+c3VjY19lbmQoKTsgU0kgIT0gU0U7ICsrU0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogU1VDQyA9ICpTSTsKKyAgICAvLyBTZWxmLWxvb3AKKyAgICBpZiAoU1VDQyA9PSBNQkIpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoISBDU1JVc2VkW1NVQ0NdLmNvbnRhaW5zKHByb3ApKSB7CisgICAgICBDU1JVc2VkW1NVQ0NdIHw9IHByb3A7CisgICAgICBhZGRlZFVzZXMgPSB0cnVlOworICAgICAgYmxrcy5wdXNoX2JhY2soU1VDQyk7CisgICAgICBERUJVRyhpZiAoU2hyaW5rV3JhcERlYnVnZ2luZyA+PSBJdGVyYXRpb25zKQorICAgICAgICAgICAgICBkYmdzKCkgPDwgZ2V0QmFzaWNCbG9ja05hbWUoTUJCKQorICAgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCBzdHJpbmdpZnlDU1JlZ1NldChwcm9wKSA8PCAiKS0+IgorICAgICAgICAgICAgICAgICAgIDw8ICJzdWNjZXNzb3IgIiA8PCBnZXRCYXNpY0Jsb2NrTmFtZShTVUNDKSA8PCAiXG4iKTsKKyAgICB9CisgIH0KKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6cHJlZF9pdGVyYXRvciBQSSA9IE1CQi0+cHJlZF9iZWdpbigpLAorICAgICAgICAgUEUgPSBNQkItPnByZWRfZW5kKCk7IFBJICE9IFBFOyArK1BJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIFBSRUQgPSAqUEk7CisgICAgLy8gU2VsZi1sb29wCisgICAgaWYgKFBSRUQgPT0gTUJCKQorICAgICAgY29udGludWU7CisgICAgaWYgKCEgQ1NSVXNlZFtQUkVEXS5jb250YWlucyhwcm9wKSkgeworICAgICAgQ1NSVXNlZFtQUkVEXSB8PSBwcm9wOworICAgICAgYWRkZWRVc2VzID0gdHJ1ZTsKKyAgICAgIGJsa3MucHVzaF9iYWNrKFBSRUQpOworICAgICAgREVCVUcoaWYgKFNocmlua1dyYXBEZWJ1Z2dpbmcgPj0gSXRlcmF0aW9ucykKKyAgICAgICAgICAgICAgZGJncygpIDw8IGdldEJhc2ljQmxvY2tOYW1lKE1CQikKKyAgICAgICAgICAgICAgICAgICA8PCAiKCIgPDwgc3RyaW5naWZ5Q1NSZWdTZXQocHJvcCkgPDwgIiktPiIKKyAgICAgICAgICAgICAgICAgICA8PCAicHJlZGVjZXNzb3IgIiA8PCBnZXRCYXNpY0Jsb2NrTmFtZShQUkVEKSA8PCAiXG4iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGFkZGVkVXNlczsKK30KKworLy8vIGFkZFVzZXNGb3JUb3BMZXZlbExvb3BzIC0gYWRkIHVzZXMgZm9yIENTUnMgdXNlZCBpbnNpZGUgdG9wCisvLy8gbGV2ZWwgbG9vcHMgdG8gdGhlIGV4aXQgYmxvY2tzIG9mIHRob3NlIGxvb3BzLgorLy8vCitib29sIFBFSTo6YWRkVXNlc0ZvclRvcExldmVsTG9vcHMoU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA0PiYgYmxrcykgeworICBib29sIGFkZGVkVXNlcyA9IGZhbHNlOworCisgIC8vIFBsYWNlIHJlc3RvcmVzIGZvciB0b3AgbGV2ZWwgbG9vcHMgd2hlcmUgbmVlZGVkLgorICBmb3IgKERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgTWFjaGluZUxvb3AqPjo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSBUTExvb3BzLmJlZ2luKCksIEUgPSBUTExvb3BzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIgPSBJLT5maXJzdDsKKyAgICBNYWNoaW5lTG9vcCogTFAgPSBJLT5zZWNvbmQ7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIEhEUiA9IExQLT5nZXRIZWFkZXIoKTsKKyAgICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDQ+IGV4aXRCbG9ja3M7CisgICAgQ1NSZWdTZXQgbG9vcFNwaWxsczsKKworICAgIGxvb3BTcGlsbHMgPSBDU1JTYXZlW01CQl07CisgICAgaWYgKENTUlNhdmVbTUJCXS5lbXB0eSgpKSB7CisgICAgICBsb29wU3BpbGxzID0gQ1NSVXNlZFtIRFJdOworICAgICAgYXNzZXJ0KCFsb29wU3BpbGxzLmVtcHR5KCkgJiYgIk5vIENTUnMgdXNlZCBpbiBsb29wPyIpOworICAgIH0gZWxzZSBpZiAoQ1NSUmVzdG9yZVtNQkJdLmNvbnRhaW5zKENTUlNhdmVbTUJCXSkpCisgICAgICBjb250aW51ZTsKKworICAgIExQLT5nZXRFeGl0QmxvY2tzKGV4aXRCbG9ja3MpOworICAgIGFzc2VydChleGl0QmxvY2tzLnNpemUoKSA+IDAgJiYgIkxvb3AgaGFzIG5vIHRvcCBsZXZlbCBleGl0IGJsb2Nrcz8iKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZXhpdEJsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayogRVhCID0gZXhpdEJsb2Nrc1tpXTsKKyAgICAgIGlmICghIENTUlVzZWRbRVhCXS5jb250YWlucyhsb29wU3BpbGxzKSkgeworICAgICAgICBDU1JVc2VkW0VYQl0gfD0gbG9vcFNwaWxsczsKKyAgICAgICAgYWRkZWRVc2VzID0gdHJ1ZTsKKyAgICAgICAgREVCVUcoaWYgKFNocmlua1dyYXBEZWJ1Z2dpbmcgPj0gSXRlcmF0aW9ucykKKyAgICAgICAgICAgICAgICBkYmdzKCkgPDwgIkxPT1AgIiA8PCBnZXRCYXNpY0Jsb2NrTmFtZShNQkIpCisgICAgICAgICAgICAgICAgICAgICA8PCAiKCIgPDwgc3RyaW5naWZ5Q1NSZWdTZXQobG9vcFNwaWxscykgPDwgIiktPiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGdldEJhc2ljQmxvY2tOYW1lKEVYQikgPDwgIlxuIik7CisgICAgICAgIGlmIChFWEItPnN1Y2Nfc2l6ZSgpID4gMSB8fCBFWEItPnByZWRfc2l6ZSgpID4gMSkKKyAgICAgICAgICBibGtzLnB1c2hfYmFjayhFWEIpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gYWRkZWRVc2VzOworfQorCisvLy8gY2FsY1NwaWxsUGxhY2VtZW50cyAtIGRldGVybWluZSB3aGljaCBDU1JzIHNob3VsZCBiZSBzcGlsbGVkCisvLy8gaW4gTUJCIHVzaW5nIEFudGljSW4gc2V0cyBvZiBNQkIncyBwcmVkZWNlc3NvcnMsIGtlZXBpbmcgdHJhY2sKKy8vLyBvZiBjaGFuZ2VzIHRvIHNwaWxsZWQgcmVnIHNldHMuIEFkZCBNQkIgdG8gdGhlIHNldCBvZiBibG9ja3MKKy8vLyB0aGF0IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGZvciBwcm9wYWdhdGluZyB1c2UgaW5mbyB0byBjb3ZlcgorLy8vIG11bHRpLWVudHJ5L2V4aXQgcmVnaW9ucy4KKy8vLworYm9vbCBQRUk6OmNhbGNTcGlsbFBsYWNlbWVudHMoTWFjaGluZUJhc2ljQmxvY2sqIE1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgND4gJmJsa3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1JlZ0Jsb2NrTWFwICZwcmV2U3BpbGxzKSB7CisgIGJvb2wgcGxhY2VkU3BpbGxzID0gZmFsc2U7CisgIC8vIEludGVyc2VjdCAoQ1NSZWdzIC0gQW50aWNJbltQXSkgZm9yIFAgaW4gUHJlZGVjZXNzb3JzKE1CQikKKyAgQ1NSZWdTZXQgYW50aWNJblByZWRzOworICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDQ+IHByZWRlY2Vzc29yczsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6cHJlZF9pdGVyYXRvciBQSSA9IE1CQi0+cHJlZF9iZWdpbigpLAorICAgICAgICAgUEUgPSBNQkItPnByZWRfZW5kKCk7IFBJICE9IFBFOyArK1BJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIFBSRUQgPSAqUEk7CisgICAgaWYgKFBSRUQgIT0gTUJCKQorICAgICAgcHJlZGVjZXNzb3JzLnB1c2hfYmFjayhQUkVEKTsKKyAgfQorICB1bnNpZ25lZCBpID0gMCwgZSA9IHByZWRlY2Vzc29ycy5zaXplKCk7CisgIGlmIChpICE9IGUpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogUFJFRCA9IHByZWRlY2Vzc29yc1tpXTsKKyAgICBhbnRpY0luUHJlZHMgPSBVc2VkQ1NSZWdzIC0gQW50aWNJbltQUkVEXTsKKyAgICBmb3IgKCsraTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFBSRUQgPSBwcmVkZWNlc3NvcnNbaV07CisgICAgICBhbnRpY0luUHJlZHMgJj0gKFVzZWRDU1JlZ3MgLSBBbnRpY0luW1BSRURdKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gSGFuZGxlIHVzZXMgaW4gZW50cnkgYmxvY2tzICh3aGljaCBoYXZlIG5vIHByZWRlY2Vzc29ycykuCisgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgREZBIGZvcm11bGF0aW9uIGFzc3VtZXMgdGhlCisgICAgLy8gZW50cnkgYW5kIChtdWx0aXBsZSkgZXhpdCBub2RlcyBjYW5ub3QgaGF2ZSBDU1IgdXNlcywgd2hpY2gKKyAgICAvLyBpcyBub3QgdGhlIGNhc2UgaW4gdGhlIHJlYWwgd29ybGQuCisgICAgYW50aWNJblByZWRzID0gVXNlZENTUmVnczsKKyAgfQorICAvLyBDb21wdXRlIHNwaWxscyByZXF1aXJlZCBhdCBNQkI6CisgIENTUlNhdmVbTUJCXSB8PSAoQW50aWNJbltNQkJdIC0gQXZhaWxJbltNQkJdKSAmIGFudGljSW5QcmVkczsKKworICBpZiAoISBDU1JTYXZlW01CQl0uZW1wdHkoKSkgeworICAgIGlmIChNQkIgPT0gRW50cnlCbG9jaykgeworICAgICAgZm9yICh1bnNpZ25lZCByaSA9IDAsIHJlID0gUmV0dXJuQmxvY2tzLnNpemUoKTsgcmkgIT0gcmU7ICsrcmkpCisgICAgICAgIENTUlJlc3RvcmVbUmV0dXJuQmxvY2tzW3JpXV0gfD0gQ1NSU2F2ZVtNQkJdOworICAgIH0gZWxzZSB7CisgICAgICAvLyBSZXNldCBhbGwgcmVncyBzcGlsbGVkIGluIE1CQiB0aGF0IGFyZSBhbHNvIHNwaWxsZWQgaW4gRW50cnlCbG9jay4KKyAgICAgIGlmIChDU1JTYXZlW0VudHJ5QmxvY2tdLmludGVyc2VjdHMoQ1NSU2F2ZVtNQkJdKSkgeworICAgICAgICBDU1JTYXZlW01CQl0gPSBDU1JTYXZlW01CQl0gLSBDU1JTYXZlW0VudHJ5QmxvY2tdOworICAgICAgfQorICAgIH0KKyAgfQorICBwbGFjZWRTcGlsbHMgPSAoQ1NSU2F2ZVtNQkJdICE9IHByZXZTcGlsbHNbTUJCXSk7CisgIHByZXZTcGlsbHNbTUJCXSA9IENTUlNhdmVbTUJCXTsKKyAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayBmb3IgYWRkaW5nIHJlc3RvcmVzIHRvIHN1Y2Nlc3NvcgorICAvLyBibG9ja3MgZm9yIG11bHRpLWVudHJ5IHJlZ2lvbi4KKyAgaWYgKHBsYWNlZFNwaWxscykKKyAgICBibGtzLnB1c2hfYmFjayhNQkIpOworCisgIERFQlVHKGlmICghIENTUlNhdmVbTUJCXS5lbXB0eSgpICYmIFNocmlua1dyYXBEZWJ1Z2dpbmcgPj0gSXRlcmF0aW9ucykKKyAgICAgICAgICBkYmdzKCkgPDwgIlNBVkVbIiA8PCBnZXRCYXNpY0Jsb2NrTmFtZShNQkIpIDw8ICJdID0gIgorICAgICAgICAgICAgICAgPDwgc3RyaW5naWZ5Q1NSZWdTZXQoQ1NSU2F2ZVtNQkJdKSA8PCAiXG4iKTsKKworICByZXR1cm4gcGxhY2VkU3BpbGxzOworfQorCisvLy8gY2FsY1Jlc3RvcmVQbGFjZW1lbnRzIC0gZGV0ZXJtaW5lIHdoaWNoIENTUnMgc2hvdWxkIGJlIHJlc3RvcmVkCisvLy8gaW4gTUJCIHVzaW5nIEF2YWlsT3V0IHNldHMgb2YgTUJCJ3Mgc3VjY2Nlc3NvcnMsIGtlZXBpbmcgdHJhY2sKKy8vLyBvZiBjaGFuZ2VzIHRvIHJlc3RvcmVkIHJlZyBzZXRzLiBBZGQgTUJCIHRvIHRoZSBzZXQgb2YgYmxvY2tzCisvLy8gdGhhdCBuZWVkIHRvIGJlIHByb2Nlc3NlZCBmb3IgcHJvcGFnYXRpbmcgdXNlIGluZm8gdG8gY292ZXIKKy8vLyBtdWx0aS1lbnRyeS9leGl0IHJlZ2lvbnMuCisvLy8KK2Jvb2wgUEVJOjpjYWxjUmVzdG9yZVBsYWNlbWVudHMoTWFjaGluZUJhc2ljQmxvY2sqIE1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA0PiAmYmxrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NSZWdCbG9ja01hcCAmcHJldlJlc3RvcmVzKSB7CisgIGJvb2wgcGxhY2VkUmVzdG9yZXMgPSBmYWxzZTsKKyAgLy8gSW50ZXJzZWN0IChDU1JlZ3MgLSBBdmFpbE91dFtTXSkgZm9yIFMgaW4gU3VjY2Vzc29ycyhNQkIpCisgIENTUmVnU2V0IGF2YWlsT3V0U3VjYzsKKyAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA0PiBzdWNjZXNzb3JzOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpzdWNjX2l0ZXJhdG9yIFNJID0gTUJCLT5zdWNjX2JlZ2luKCksCisgICAgICAgICBTRSA9IE1CQi0+c3VjY19lbmQoKTsgU0kgIT0gU0U7ICsrU0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogU1VDQyA9ICpTSTsKKyAgICBpZiAoU1VDQyAhPSBNQkIpCisgICAgICBzdWNjZXNzb3JzLnB1c2hfYmFjayhTVUNDKTsKKyAgfQorICB1bnNpZ25lZCBpID0gMCwgZSA9IHN1Y2Nlc3NvcnMuc2l6ZSgpOworICBpZiAoaSAhPSBlKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIFNVQ0MgPSBzdWNjZXNzb3JzW2ldOworICAgIGF2YWlsT3V0U3VjYyA9IFVzZWRDU1JlZ3MgLSBBdmFpbE91dFtTVUNDXTsKKyAgICBmb3IgKCsraTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFNVQ0MgPSBzdWNjZXNzb3JzW2ldOworICAgICAgYXZhaWxPdXRTdWNjICY9IChVc2VkQ1NSZWdzIC0gQXZhaWxPdXRbU1VDQ10pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoISBDU1JVc2VkW01CQl0uZW1wdHkoKSB8fCAhIEF2YWlsT3V0W01CQl0uZW1wdHkoKSkgeworICAgICAgLy8gSGFuZGxlIHVzZXMgaW4gcmV0dXJuIGJsb2NrcyAod2hpY2ggaGF2ZSBubyBzdWNjZXNzb3JzKS4KKyAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIERGQSBmb3JtdWxhdGlvbiBhc3N1bWVzIHRoZQorICAgICAgLy8gZW50cnkgYW5kIChtdWx0aXBsZSkgZXhpdCBub2RlcyBjYW5ub3QgaGF2ZSBDU1IgdXNlcywgd2hpY2gKKyAgICAgIC8vIGlzIG5vdCB0aGUgY2FzZSBpbiB0aGUgcmVhbCB3b3JsZC4KKyAgICAgIGF2YWlsT3V0U3VjYyA9IFVzZWRDU1JlZ3M7CisgICAgfQorICB9CisgIC8vIENvbXB1dGUgcmVzdG9yZXMgcmVxdWlyZWQgYXQgTUJCOgorICBDU1JSZXN0b3JlW01CQl0gfD0gKEF2YWlsT3V0W01CQl0gLSBBbnRpY091dFtNQkJdKSAmIGF2YWlsT3V0U3VjYzsKKworICAvLyBQb3N0cHJvY2VzcyByZXN0b3JlIHBsYWNlbWVudHMgYXQgTUJCLgorICAvLyBSZW1vdmUgdGhlIENTUnMgdGhhdCBhcmUgcmVzdG9yZWQgaW4gdGhlIHJldHVybiBibG9ja3MuCisgIC8vIExlc3QgdGhpcyBiZSBjb25mdXNpbmcsIG5vdGUgdGhhdDoKKyAgLy8gQ1NSU2F2ZVtFbnRyeUJsb2NrXSA9PSBDU1JSZXN0b3JlW0JdIGZvciBhbGwgQiBpbiBSZXR1cm5CbG9ja3MuCisgIGlmIChNQkItPnN1Y2Nfc2l6ZSgpICYmICEgQ1NSUmVzdG9yZVtNQkJdLmVtcHR5KCkpIHsKKyAgICBpZiAoISBDU1JTYXZlW0VudHJ5QmxvY2tdLmVtcHR5KCkpCisgICAgICBDU1JSZXN0b3JlW01CQl0gPSBDU1JSZXN0b3JlW01CQl0gLSBDU1JTYXZlW0VudHJ5QmxvY2tdOworICB9CisgIHBsYWNlZFJlc3RvcmVzID0gKENTUlJlc3RvcmVbTUJCXSAhPSBwcmV2UmVzdG9yZXNbTUJCXSk7CisgIHByZXZSZXN0b3Jlc1tNQkJdID0gQ1NSUmVzdG9yZVtNQkJdOworICAvLyBSZW1lbWJlciB0aGlzIGJsb2NrIGZvciBhZGRpbmcgc2F2ZXMgdG8gcHJlZGVjZXNzb3IKKyAgLy8gYmxvY2tzIGZvciBtdWx0aS1lbnRyeSByZWdpb24uCisgIGlmIChwbGFjZWRSZXN0b3JlcykKKyAgICBibGtzLnB1c2hfYmFjayhNQkIpOworCisgIERFQlVHKGlmICghIENTUlJlc3RvcmVbTUJCXS5lbXB0eSgpICYmIFNocmlua1dyYXBEZWJ1Z2dpbmcgPj0gSXRlcmF0aW9ucykKKyAgICAgICAgICBkYmdzKCkgPDwgIlJFU1RPUkVbIiA8PCBnZXRCYXNpY0Jsb2NrTmFtZShNQkIpIDw8ICJdID0gIgorICAgICAgICAgICAgICAgPDwgc3RyaW5naWZ5Q1NSZWdTZXQoQ1NSUmVzdG9yZVtNQkJdKSA8PCAiXG4iKTsKKworICByZXR1cm4gcGxhY2VkUmVzdG9yZXM7Cit9CisKKy8vLyBwbGFjZVNwaWxsc0FuZFJlc3RvcmVzIC0gcGxhY2Ugc3BpbGxzIGFuZCByZXN0b3JlcyBvZiBDU1JzCisvLy8gdXNlZCBpbiBNQkJzIGluIG1pbmltYWwgcmVnaW9ucyB0aGF0IGNvbnRhaW4gdGhlIHVzZXMuCisvLy8KK3ZvaWQgUEVJOjpwbGFjZVNwaWxsc0FuZFJlc3RvcmVzKE1hY2hpbmVGdW5jdGlvbiAmRm4pIHsKKyAgQ1NSZWdCbG9ja01hcCBwcmV2Q1NSU2F2ZTsKKyAgQ1NSZWdCbG9ja01hcCBwcmV2Q1NSUmVzdG9yZTsKKyAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA0PiBjdkJsb2NrcywgbmN2QmxvY2tzOworICBib29sIGNoYW5nZWQgPSB0cnVlOworICB1bnNpZ25lZCBpdGVyYXRpb25zID0gMDsKKworICAvLyBJdGVyYXRlIGNvbXB1dGF0aW9uIG9mIHNwaWxsIGFuZCByZXN0b3JlIHBsYWNlbWVudHMgaW4gdGhlIE1DRkcgdW50aWw6CisgIC8vICAgMS4gQ1NSIHVzZSBpbmZvIGhhcyBiZWVuIGZ1bGx5IHByb3BhZ2F0ZWQgYXJvdW5kIHRoZSBNQ0ZHLCBhbmQKKyAgLy8gICAyLiBjb21wdXRhdGlvbiBvZiBDU1JTYXZlW10sIENTUlJlc3RvcmVbXSByZWFjaCBmaXhlZCBwb2ludHMuCisgIHdoaWxlIChjaGFuZ2VkKSB7CisgICAgY2hhbmdlZCA9IGZhbHNlOworICAgICsraXRlcmF0aW9uczsKKworICAgIERFQlVHKGlmIChTaHJpbmtXcmFwRGVidWdnaW5nID49IEl0ZXJhdGlvbnMpCisgICAgICAgICAgICBkYmdzKCkgPDwgIml0ZXIgIiA8PCBpdGVyYXRpb25zCisgICAgICAgICAgICAgICAgIDw8ICIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisgICAgLy8gQ2FsY3VsYXRlIENTUntTYXZlLFJlc3RvcmV9IHNldHMgdXNpbmcgQW50aWMsIEF2YWlsIG9uIHRoZSBNQ0ZHLAorICAgIC8vIHdoaWNoIGRldGVybWluZXMgdGhlIHBsYWNlbWVudHMgb2Ygc3BpbGxzIGFuZCByZXN0b3Jlcy4KKyAgICAvLyBLZWVwIHRyYWNrIG9mIGNoYW5nZXMgdG8gc3BpbGxzLCByZXN0b3JlcyBpbiBlYWNoIGl0ZXJhdGlvbiB0bworICAgIC8vIG1pbmltaXplIHRoZSB0b3RhbCBpdGVyYXRpb25zLgorICAgIGJvb2wgU1JDaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBGbi5iZWdpbigpLCBNQkJFID0gRm4uZW5kKCk7CisgICAgICAgICBNQkJJICE9IE1CQkU7ICsrTUJCSSkgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiA9IE1CQkk7CisKKyAgICAgIC8vIFBsYWNlIHNwaWxscyBmb3IgQ1NScyBpbiBNQkIuCisgICAgICBTUkNoYW5nZWQgfD0gY2FsY1NwaWxsUGxhY2VtZW50cyhNQkIsIGN2QmxvY2tzLCBwcmV2Q1NSU2F2ZSk7CisKKyAgICAgIC8vIFBsYWNlIHJlc3RvcmVzIGZvciBDU1JzIGluIE1CQi4KKyAgICAgIFNSQ2hhbmdlZCB8PSBjYWxjUmVzdG9yZVBsYWNlbWVudHMoTUJCLCBjdkJsb2NrcywgcHJldkNTUlJlc3RvcmUpOworICAgIH0KKworICAgIC8vIEFkZCB1c2VzIG9mIENTUnMgdXNlZCBpbnNpZGUgbG9vcHMgd2hlcmUgbmVlZGVkLgorICAgIGNoYW5nZWQgfD0gYWRkVXNlc0ZvclRvcExldmVsTG9vcHMoY3ZCbG9ja3MpOworCisgICAgLy8gQWRkIHVzZXMgZm9yIENTUnMgc3BpbGxlZCBvciByZXN0b3JlZCBhdCBicmFuY2gsIGpvaW4gcG9pbnRzLgorICAgIGlmIChjaGFuZ2VkIHx8IFNSQ2hhbmdlZCkgeworICAgICAgd2hpbGUgKCEgY3ZCbG9ja3MuZW1wdHkoKSkgeworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogTUJCID0gY3ZCbG9ja3MucG9wX2JhY2tfdmFsKCk7CisgICAgICAgIGNoYW5nZWQgfD0gYWRkVXNlc0Zvck1FTUVSZWdpb24oTUJCLCBuY3ZCbG9ja3MpOworICAgICAgfQorICAgICAgaWYgKCEgbmN2QmxvY2tzLmVtcHR5KCkpIHsKKyAgICAgICAgY3ZCbG9ja3MgPSBuY3ZCbG9ja3M7CisgICAgICAgIG5jdkJsb2Nrcy5jbGVhcigpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICBjYWxjdWxhdGVBbnRpY0F2YWlsKEZuKTsKKyAgICAgIENTUlNhdmUuY2xlYXIoKTsKKyAgICAgIENTUlJlc3RvcmUuY2xlYXIoKTsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBmb3IgZWZmZWN0aXZlbmVzczoKKyAgLy8gIFNSMCA9IHtyIHwgciBpbiBDU1JTYXZlW0VudHJ5QmxvY2tdLCBDU1JSZXN0b3JlW1JCXSwgUkIgaW4gUmV0dXJuQmxvY2tzfQorICAvLyAgbnVtU1JSZWR1Y2VkID0gfChVc2VkQ1NSZWdzIC0gU1IwKXwsIGFwcHJveC4gU1IwIGJ5IENTUlNhdmVbRW50cnlCbG9ja10KKyAgLy8gR2l2ZXMgYSBtZWFzdXJlIG9mIGhvdyBtYW55IENTUiBzcGlsbHMgaGF2ZSBiZWVuIG1vdmVkIGZyb20gRW50cnlCbG9jaworICAvLyB0byBtaW5pbWFsIHJlZ2lvbnMgZW5jbG9zaW5nIHRoZWlyIHVzZXMuCisgIENTUmVnU2V0IG5vdFNwaWxsZWRJbkVudHJ5QmxvY2sgPSAoVXNlZENTUmVncyAtIENTUlNhdmVbRW50cnlCbG9ja10pOworICB1bnNpZ25lZCBudW1TUlJlZHVjZWRUaGlzRnVuYyA9IG5vdFNwaWxsZWRJbkVudHJ5QmxvY2suY291bnQoKTsKKyAgbnVtU1JSZWR1Y2VkICs9IG51bVNSUmVkdWNlZFRoaXNGdW5jOworICBERUJVRyhpZiAoU2hyaW5rV3JhcERlYnVnZ2luZyA+PSBCYXNpY0luZm8pIHsKKyAgICAgIGRiZ3MoKSA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgICBkYmdzKCkgPDwgInRvdGFsIGl0ZXJhdGlvbnMgPSAiIDw8IGl0ZXJhdGlvbnMgPDwgIiAoICIKKyAgICAgICAgICAgPDwgRm4uZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZSgpCisgICAgICAgICAgIDw8ICIgIiA8PCBudW1TUlJlZHVjZWRUaGlzRnVuYworICAgICAgICAgICA8PCAiICIgPDwgRm4uc2l6ZSgpCisgICAgICAgICAgIDw8ICIgKVxuIjsKKyAgICAgIGRiZ3MoKSA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgICBkdW1wU1JTZXRzKCk7CisgICAgICBkYmdzKCkgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgICAgaWYgKG51bVNSUmVkdWNlZFRoaXNGdW5jKQorICAgICAgICB2ZXJpZnlTcGlsbFJlc3RvcmVQbGFjZW1lbnQoKTsKKyAgICB9KTsKK30KKworLy8gRGVidWdnaW5nIG1ldGhvZHMuCisjaWZuZGVmIE5ERUJVRworLy8vIGZpbmRGYXN0RXhpdFBhdGggLSBkZWJ1Z2dpbmcgbWV0aG9kIHVzZWQgdG8gZGV0ZWN0IGZ1bmN0aW9ucworLy8vIHdpdGggYXQgbGVhc3Qgb25lIHBhdGggZnJvbSB0aGUgZW50cnkgYmxvY2sgdG8gYSByZXR1cm4gYmxvY2sKKy8vLyBkaXJlY3RseSBvciB3aGljaCBoYXMgYSB2ZXJ5IHNtYWxsIG51bWJlciBvZiBlZGdlcy4KKy8vLwordm9pZCBQRUk6OmZpbmRGYXN0RXhpdFBhdGgoKSB7CisgIGlmICghIEVudHJ5QmxvY2spCisgICAgcmV0dXJuOworICAvLyBGaW5hIGEgcGF0aCBmcm9tIEVudHJ5QmxvY2sgdG8gYW55IHJldHVybiBibG9jayB0aGF0IGRvZXMgbm90IGJyYW5jaDoKKyAgLy8gICAgICAgIEVudHJ5CisgIC8vICAgICAgICAgIHwgICAgIC4uLgorICAvLyAgICAgICAgICB2ICAgICAgfAorICAvLyAgICAgICAgIEIxPC0tLS0tKworICAvLyAgICAgICAgICB8CisgIC8vICAgICAgICAgIHYKKyAgLy8gICAgICAgUmV0dXJuCisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnN1Y2NfaXRlcmF0b3IgU0kgPSBFbnRyeUJsb2NrLT5zdWNjX2JlZ2luKCksCisgICAgICAgICBTRSA9IEVudHJ5QmxvY2stPnN1Y2NfZW5kKCk7IFNJICE9IFNFOyArK1NJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIFNVQ0MgPSAqU0k7CisKKyAgICAvLyBBc3N1bWUgcG9zaXRpdmUsIGRpc3Byb3ZlIGV4aXN0ZW5jZSBvZiBmYXN0IHBhdGguCisgICAgSGFzRmFzdEV4aXRQYXRoID0gdHJ1ZTsKKworICAgIC8vIENoZWNrIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29ycy4KKyAgICBpZiAoaXNSZXR1cm5CbG9jayhTVUNDKSkgeworICAgICAgaWYgKFNocmlua1dyYXBEZWJ1Z2dpbmcgPj0gQmFzaWNJbmZvKQorICAgICAgICBkYmdzKCkgPDwgIkZhc3QgZXhpdCBwYXRoOiAiIDw8IGdldEJhc2ljQmxvY2tOYW1lKEVudHJ5QmxvY2spCisgICAgICAgICAgICAgPDwgIi0+IiA8PCBnZXRCYXNpY0Jsb2NrTmFtZShTVUNDKSA8PCAiXG4iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIFRyYXZlcnNlIGRmIGZyb20gU1VDQywgbG9vayBmb3IgYSBicmFuY2ggYmxvY2suCisgICAgc3RkOjpzdHJpbmcgZXhpdFBhdGggPSBnZXRCYXNpY0Jsb2NrTmFtZShTVUNDKTsKKyAgICBmb3IgKGRmX2l0ZXJhdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gQkkgPSBkZl9iZWdpbihTVUNDKSwKKyAgICAgICAgICAgQkUgPSBkZl9lbmQoU1VDQyk7IEJJICE9IEJFOyArK0JJKSB7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayogU0JCID0gKkJJOworICAgICAgLy8gUmVqZWN0IHBhdGhzIHdpdGggYnJhbmNoIG5vZGVzLgorICAgICAgaWYgKFNCQi0+c3VjY19zaXplKCkgPiAxKSB7CisgICAgICAgIEhhc0Zhc3RFeGl0UGF0aCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGV4aXRQYXRoICs9ICItPiIgKyBnZXRCYXNpY0Jsb2NrTmFtZShTQkIpOworICAgIH0KKyAgICBpZiAoSGFzRmFzdEV4aXRQYXRoKSB7CisgICAgICBpZiAoU2hyaW5rV3JhcERlYnVnZ2luZyA+PSBCYXNpY0luZm8pCisgICAgICAgIGRiZ3MoKSA8PCAiRmFzdCBleGl0IHBhdGg6ICIgPDwgZ2V0QmFzaWNCbG9ja05hbWUoRW50cnlCbG9jaykKKyAgICAgICAgICAgICA8PCAiLT4iIDw8IGV4aXRQYXRoIDw8ICJcbiI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLy8vIHZlcmlmeVNwaWxsUmVzdG9yZVBsYWNlbWVudCAtIGNoZWNrIHRoZSBjdXJyZW50IHNwaWxsL3Jlc3RvcmUKKy8vLyBzZXRzIGZvciBzYWZldHkuIEF0dGVtcHQgdG8gZmluZCBzcGlsbHMgd2l0aG91dCByZXN0b3JlcyBvcgorLy8vIHJlc3RvcmVzIHdpdGhvdXQgc3BpbGxzLgorLy8vIFNwaWxsczogd2FsayBkZiBmcm9tIGVhY2ggTUJCIGluIHNwaWxsIHNldCBlbnN1cmluZyB0aGF0CisvLy8gICAgICAgICBhbGwgQ1NScyBzcGlsbGVkIGF0IE1NQkIgYXJlIHJlc3RvcmVkIG9uIGFsbCBwYXRocworLy8vICAgICAgICAgZnJvbSBNQkIgdG8gYWxsIGV4aXQgYmxvY2tzLgorLy8vIFJlc3RvcmVzOiB3YWxrIGlkZiBmcm9tIGVhY2ggTUJCIGluIHJlc3RvcmUgc2V0IGVuc3VyaW5nIHRoYXQKKy8vLyAgICAgICAgICAgYWxsIENTUnMgcmVzdG9yZWQgYXQgTUJCIGFyZSBzcGlsbGVkIG9uIGFsbCBwYXRocworLy8vICAgICAgICAgICByZWFjaGluZyBNQkIuCisvLy8KK3ZvaWQgUEVJOjp2ZXJpZnlTcGlsbFJlc3RvcmVQbGFjZW1lbnQoKSB7CisgIHVuc2lnbmVkIG51bVJldHVybkJsb2NrcyA9IDA7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkJJID0gTUYtPmJlZ2luKCksIE1CQkUgPSBNRi0+ZW5kKCk7CisgICAgICAgTUJCSSAhPSBNQkJFOyArK01CQkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogTUJCID0gTUJCSTsKKyAgICBpZiAoaXNSZXR1cm5CbG9jayhNQkIpIHx8IE1CQi0+c3VjY19zaXplKCkgPT0gMCkKKyAgICAgICsrbnVtUmV0dXJuQmxvY2tzOworICB9CisgIGZvciAoQ1NSZWdCbG9ja01hcDo6aXRlcmF0b3IgQkkgPSBDU1JTYXZlLmJlZ2luKCksCisgICAgICAgICBCRSA9IENTUlNhdmUuZW5kKCk7IEJJICE9IEJFOyArK0JJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiA9IEJJLT5maXJzdDsKKyAgICBDU1JlZ1NldCBzcGlsbGVkID0gQkktPnNlY29uZDsKKyAgICBDU1JlZ1NldCByZXN0b3JlZDsKKworICAgIGlmIChzcGlsbGVkLmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiU0FWRVsiIDw8IGdldEJhc2ljQmxvY2tOYW1lKE1CQikgPDwgIl0gPSAiCisgICAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KHNwaWxsZWQpCisgICAgICAgICAgICAgICAgIDw8ICIgIFJFU1RPUkVbIiA8PCBnZXRCYXNpY0Jsb2NrTmFtZShNQkIpIDw8ICJdID0gIgorICAgICAgICAgICAgICAgICA8PCBzdHJpbmdpZnlDU1JlZ1NldChDU1JSZXN0b3JlW01CQl0pIDw8ICJcbiIpOworCisgICAgaWYgKENTUlJlc3RvcmVbTUJCXS5pbnRlcnNlY3RzKHNwaWxsZWQpKSB7CisgICAgICByZXN0b3JlZCB8PSAoQ1NSUmVzdG9yZVtNQkJdICYgc3BpbGxlZCk7CisgICAgfQorCisgICAgLy8gV2FsayBkZXB0aCBmaXJzdCBmcm9tIE1CQiB0byBmaW5kIHJlc3RvcmVzIG9mIGFsbCBDU1JzIHNwaWxsZWQgYXQgTUJCOgorICAgIC8vIHdlIG11c3QgZmluZCByZXN0b3JlcyBmb3IgYWxsIHNwaWxscyB3L25vIGludGVydmVuaW5nIHNwaWxscyBvbiBhbGwKKyAgICAvLyBwYXRocyBmcm9tIE1CQiB0byBhbGwgcmV0dXJuIGJsb2Nrcy4KKyAgICBmb3IgKGRmX2l0ZXJhdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gQkkgPSBkZl9iZWdpbihNQkIpLAorICAgICAgICAgICBCRSA9IGRmX2VuZChNQkIpOyBCSSAhPSBCRTsgKytCSSkgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIFNCQiA9ICpCSTsKKyAgICAgIGlmIChTQkIgPT0gTUJCKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIFN0b3Agd2hlbiB3ZSBlbmNvdW50ZXIgc3BpbGxzIG9mIGFueSBDU1JzIHNwaWxsZWQgYXQgTUJCIHRoYXQKKyAgICAgIC8vIGhhdmUgbm90IHlldCBiZWVuIHNlZW4gdG8gYmUgcmVzdG9yZWQuCisgICAgICBpZiAoQ1NSU2F2ZVtTQkJdLmludGVyc2VjdHMoc3BpbGxlZCkgJiYKKyAgICAgICAgICAhcmVzdG9yZWQuY29udGFpbnMoQ1NSU2F2ZVtTQkJdICYgc3BpbGxlZCkpCisgICAgICAgIGJyZWFrOworICAgICAgLy8gQ29sbGVjdCB0aGUgQ1NScyBzcGlsbGVkIGF0IE1CQiB0aGF0IGFyZSByZXN0b3JlZAorICAgICAgLy8gYXQgdGhpcyBERiBzdWNjZXNzb3Igb2YgTUJCLgorICAgICAgaWYgKENTUlJlc3RvcmVbU0JCXS5pbnRlcnNlY3RzKHNwaWxsZWQpKQorICAgICAgICByZXN0b3JlZCB8PSAoQ1NSUmVzdG9yZVtTQkJdICYgc3BpbGxlZCk7CisgICAgICAvLyBJZiB3ZSBhcmUgYXQgYSByZXR1biBibG9jaywgY2hlY2sgdGhhdCB0aGUgcmVzdG9yZXMKKyAgICAgIC8vIHdlIGhhdmUgc2VlbiBzbyBmYXIgZXhoYXVzdCB0aGUgc3BpbGxzIGF0IE1CQiwgdGhlbgorICAgICAgLy8gcmVzZXQgdGhlIHJlc3RvcmVzLgorICAgICAgaWYgKGlzUmV0dXJuQmxvY2soU0JCKSB8fCBTQkItPnN1Y2Nfc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKHJlc3RvcmVkICE9IHNwaWxsZWQpIHsKKyAgICAgICAgICBDU1JlZ1NldCBub3RSZXN0b3JlZCA9IChzcGlsbGVkIC0gcmVzdG9yZWQpOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCBNRi0+Z2V0RnVuY3Rpb24oKS0+Z2V0TmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RyaW5naWZ5Q1NSZWdTZXQobm90UmVzdG9yZWQpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgc3BpbGxlZCBhdCAiIDw8IGdldEJhc2ljQmxvY2tOYW1lKE1CQikKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBhcmUgbmV2ZXIgcmVzdG9yZWQgb24gcGF0aCB0byByZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBnZXRCYXNpY0Jsb2NrTmFtZShTQkIpIDw8ICJcbiIpOworICAgICAgICB9CisgICAgICAgIHJlc3RvcmVkLmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgcmVzdG9yZSBwbGFjZW1lbnRzLgorICBmb3IgKENTUmVnQmxvY2tNYXA6Oml0ZXJhdG9yIEJJID0gQ1NSUmVzdG9yZS5iZWdpbigpLAorICAgICAgICAgQkUgPSBDU1JSZXN0b3JlLmVuZCgpOyBCSSAhPSBCRTsgKytCSSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIgPSBCSS0+Zmlyc3Q7CisgICAgQ1NSZWdTZXQgcmVzdG9yZWQgPSBCSS0+c2Vjb25kOworICAgIENTUmVnU2V0IHNwaWxsZWQ7CisKKyAgICBpZiAocmVzdG9yZWQuZW1wdHkoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgREVCVUcoZGJncygpIDw8ICJTQVZFWyIgPDwgZ2V0QmFzaWNCbG9ja05hbWUoTUJCKSA8PCAiXSA9ICIKKyAgICAgICAgICAgICAgICAgPDwgc3RyaW5naWZ5Q1NSZWdTZXQoQ1NSU2F2ZVtNQkJdKQorICAgICAgICAgICAgICAgICA8PCAiICBSRVNUT1JFWyIgPDwgZ2V0QmFzaWNCbG9ja05hbWUoTUJCKSA8PCAiXSA9ICIKKyAgICAgICAgICAgICAgICAgPDwgc3RyaW5naWZ5Q1NSZWdTZXQocmVzdG9yZWQpIDw8ICJcbiIpOworCisgICAgaWYgKENTUlNhdmVbTUJCXS5pbnRlcnNlY3RzKHJlc3RvcmVkKSkgeworICAgICAgc3BpbGxlZCB8PSAoQ1NSU2F2ZVtNQkJdICYgcmVzdG9yZWQpOworICAgIH0KKyAgICAvLyBXYWxrIGludmVyc2UgZGVwdGggZmlyc3QgZnJvbSBNQkIgdG8gZmluZCBzcGlsbHMgb2YgYWxsCisgICAgLy8gQ1NScyByZXN0b3JlZCBhdCBNQkI6CisgICAgZm9yIChpZGZfaXRlcmF0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiBCSSA9IGlkZl9iZWdpbihNQkIpLAorICAgICAgICAgICBCRSA9IGlkZl9lbmQoTUJCKTsgQkkgIT0gQkU7ICsrQkkpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBQQkIgPSAqQkk7CisgICAgICBpZiAoUEJCID09IE1CQikKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBTdG9wIHdoZW4gd2UgZW5jb3VudGVyIHJlc3RvcmVzIG9mIGFueSBDU1JzIHJlc3RvcmVkIGF0IE1CQiB0aGF0CisgICAgICAvLyBoYXZlIG5vdCB5ZXQgYmVlbiBzZWVuIHRvIGJlIHNwaWxsZWQuCisgICAgICBpZiAoQ1NSUmVzdG9yZVtQQkJdLmludGVyc2VjdHMocmVzdG9yZWQpICYmCisgICAgICAgICAgIXNwaWxsZWQuY29udGFpbnMoQ1NSUmVzdG9yZVtQQkJdICYgcmVzdG9yZWQpKQorICAgICAgICBicmVhazsKKyAgICAgIC8vIENvbGxlY3QgdGhlIENTUnMgcmVzdG9yZWQgYXQgTUJCIHRoYXQgYXJlIHNwaWxsZWQKKyAgICAgIC8vIGF0IHRoaXMgREYgcHJlZGVjZXNzb3Igb2YgTUJCLgorICAgICAgaWYgKENTUlNhdmVbUEJCXS5pbnRlcnNlY3RzKHJlc3RvcmVkKSkKKyAgICAgICAgc3BpbGxlZCB8PSAoQ1NSU2F2ZVtQQkJdICYgcmVzdG9yZWQpOworICAgIH0KKyAgICBpZiAoc3BpbGxlZCAhPSByZXN0b3JlZCkgeworICAgICAgQ1NSZWdTZXQgbm90U3BpbGxlZCA9IChyZXN0b3JlZCAtIHNwaWxsZWQpOworICAgICAgREVCVUcoZGJncygpIDw8IE1GLT5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KG5vdFNwaWxsZWQpCisgICAgICAgICAgICAgICAgICAgPDwgIiByZXN0b3JlZCBhdCAiIDw8IGdldEJhc2ljQmxvY2tOYW1lKE1CQikKKyAgICAgICAgICAgICAgICAgICA8PCAiIGFyZSBuZXZlciBzcGlsbGVkXG4iKTsKKyAgICB9CisgIH0KK30KKworLy8gRGVidWdnaW5nIHByaW50IG1ldGhvZHMuCitzdGQ6OnN0cmluZyBQRUk6OmdldEJhc2ljQmxvY2tOYW1lKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIpIHsKKyAgaWYgKCFNQkIpCisgICAgcmV0dXJuICIiOworCisgIGlmIChNQkItPmdldEJhc2ljQmxvY2soKSkKKyAgICByZXR1cm4gTUJCLT5nZXRCYXNpY0Jsb2NrKCktPmdldE5hbWVTdHIoKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZTsKKyAgbmFtZSA8PCAiX01CQl8iIDw8IE1CQi0+Z2V0TnVtYmVyKCk7CisgIHJldHVybiBuYW1lLnN0cigpOworfQorCitzdGQ6OnN0cmluZyBQRUk6OnN0cmluZ2lmeUNTUmVnU2V0KGNvbnN0IENTUmVnU2V0JiBzKSB7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyogVFJJID0gTUYtPmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICBjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+IENTSSA9CisgICAgTUYtPmdldEZyYW1lSW5mbygpLT5nZXRDYWxsZWVTYXZlZEluZm8oKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3JlcDsKKyAgaWYgKENTSS5zaXplKCkgPT0gMCkgeworICAgIHNyZXAgPDwgIltdIjsKKyAgICByZXR1cm4gc3JlcC5zdHIoKTsKKyAgfQorICBzcmVwIDw8ICJbIjsKKyAgQ1NSZWdTZXQ6Oml0ZXJhdG9yIEkgPSBzLmJlZ2luKCksIEUgPSBzLmVuZCgpOworICBpZiAoSSAhPSBFKSB7CisgICAgdW5zaWduZWQgcmVnID0gQ1NJWypJXS5nZXRSZWcoKTsKKyAgICBzcmVwIDw8IFRSSS0+Z2V0TmFtZShyZWcpOworICAgIGZvciAoKytJOyBJICE9IEU7ICsrSSkgeworICAgICAgcmVnID0gQ1NJWypJXS5nZXRSZWcoKTsKKyAgICAgIHNyZXAgPDwgIiwiOworICAgICAgc3JlcCA8PCBUUkktPmdldE5hbWUocmVnKTsKKyAgICB9CisgIH0KKyAgc3JlcCA8PCAiXSI7CisgIHJldHVybiBzcmVwLnN0cigpOworfQorCit2b2lkIFBFSTo6ZHVtcFNldChjb25zdCBDU1JlZ1NldCYgcykgeworICBERUJVRyhkYmdzKCkgPDwgc3RyaW5naWZ5Q1NSZWdTZXQocykgPDwgIlxuIik7Cit9CisKK3ZvaWQgUEVJOjpkdW1wVXNlZChNYWNoaW5lQmFzaWNCbG9jayogTUJCKSB7CisgIERFQlVHKHsKKyAgICAgIGlmIChNQkIpCisgICAgICAgIGRiZ3MoKSA8PCAiQ1NSVXNlZFsiIDw8IGdldEJhc2ljQmxvY2tOYW1lKE1CQikgPDwgIl0gPSAiCisgICAgICAgICAgICAgICA8PCBzdHJpbmdpZnlDU1JlZ1NldChDU1JVc2VkW01CQl0pICA8PCAiXG4iOworICAgIH0pOworfQorCit2b2lkIFBFSTo6ZHVtcEFsbFVzZWQoKSB7CisgICAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBNRi0+YmVnaW4oKSwgTUJCRSA9IE1GLT5lbmQoKTsKKyAgICAgICAgIE1CQkkgIT0gTUJCRTsgKytNQkJJKSB7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayogTUJCID0gTUJCSTsKKyAgICAgIGR1bXBVc2VkKE1CQik7CisgICAgfQorfQorCit2b2lkIFBFSTo6ZHVtcFNldHMoTWFjaGluZUJhc2ljQmxvY2sqIE1CQikgeworICBERUJVRyh7CisgICAgICBpZiAoTUJCKQorICAgICAgICBkYmdzKCkgPDwgZ2V0QmFzaWNCbG9ja05hbWUoTUJCKSAgICAgICAgICAgPDwgIiB8ICIKKyAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KENTUlVzZWRbTUJCXSkgIDw8ICIgfCAiCisgICAgICAgICAgICAgICA8PCBzdHJpbmdpZnlDU1JlZ1NldChBbnRpY0luW01CQl0pICA8PCAiIHwgIgorICAgICAgICAgICAgICAgPDwgc3RyaW5naWZ5Q1NSZWdTZXQoQW50aWNPdXRbTUJCXSkgPDwgIiB8ICIKKyAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KEF2YWlsSW5bTUJCXSkgIDw8ICIgfCAiCisgICAgICAgICAgICAgICA8PCBzdHJpbmdpZnlDU1JlZ1NldChBdmFpbE91dFtNQkJdKSA8PCAiXG4iOworICAgIH0pOworfQorCit2b2lkIFBFSTo6ZHVtcFNldHMxKE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIpIHsKKyAgREVCVUcoeworICAgICAgaWYgKE1CQikKKyAgICAgICAgZGJncygpIDw8IGdldEJhc2ljQmxvY2tOYW1lKE1CQikgICAgICAgICAgICAgPDwgIiB8ICIKKyAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KENTUlVzZWRbTUJCXSkgICAgPDwgIiB8ICIKKyAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KEFudGljSW5bTUJCXSkgICAgPDwgIiB8ICIKKyAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KEFudGljT3V0W01CQl0pICAgPDwgIiB8ICIKKyAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KEF2YWlsSW5bTUJCXSkgICAgPDwgIiB8ICIKKyAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KEF2YWlsT3V0W01CQl0pICAgPDwgIiB8ICIKKyAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KENTUlNhdmVbTUJCXSkgICAgPDwgIiB8ICIKKyAgICAgICAgICAgICAgIDw8IHN0cmluZ2lmeUNTUmVnU2V0KENTUlJlc3RvcmVbTUJCXSkgPDwgIlxuIjsKKyAgICB9KTsKK30KKwordm9pZCBQRUk6OmR1bXBBbGxTZXRzKCkgeworICAgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkJJID0gTUYtPmJlZ2luKCksIE1CQkUgPSBNRi0+ZW5kKCk7CisgICAgICAgICBNQkJJICE9IE1CQkU7ICsrTUJCSSkgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiA9IE1CQkk7CisgICAgICBkdW1wU2V0czEoTUJCKTsKKyAgICB9Cit9CisKK3ZvaWQgUEVJOjpkdW1wU1JTZXRzKCkgeworICBERUJVRyh7CisgICAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUJCID0gTUYtPmJlZ2luKCksIEUgPSBNRi0+ZW5kKCk7CisgICAgICAgICAgIE1CQiAhPSBFOyArK01CQikgeworICAgICAgICBpZiAoIUNTUlNhdmVbTUJCXS5lbXB0eSgpKSB7CisgICAgICAgICAgZGJncygpIDw8ICJTQVZFWyIgPDwgZ2V0QmFzaWNCbG9ja05hbWUoTUJCKSA8PCAiXSA9ICIKKyAgICAgICAgICAgICAgICAgPDwgc3RyaW5naWZ5Q1NSZWdTZXQoQ1NSU2F2ZVtNQkJdKTsKKyAgICAgICAgICBpZiAoQ1NSUmVzdG9yZVtNQkJdLmVtcHR5KCkpCisgICAgICAgICAgICBkYmdzKCkgPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghQ1NSUmVzdG9yZVtNQkJdLmVtcHR5KCkgJiYgIUNTUlNhdmVbTUJCXS5lbXB0eSgpKQorICAgICAgICAgIGRiZ3MoKSA8PCAiICAgICIKKyAgICAgICAgICAgICAgICAgPDwgIlJFU1RPUkVbIiA8PCBnZXRCYXNpY0Jsb2NrTmFtZShNQkIpIDw8ICJdID0gIgorICAgICAgICAgICAgICAgICA8PCBzdHJpbmdpZnlDU1JlZ1NldChDU1JSZXN0b3JlW01CQl0pIDw8ICJcbiI7CisgICAgICB9CisgICAgfSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkY2M2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcuY3BwCkBAIC0wLDAgKzEsMTgzOCBAQAorLy89PT0tLSBTaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcuY3BwIC0gUmVnaXN0ZXIgQ29hbGVzY2luZyAtLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHNpbXBsZSByZWdpc3RlciBjb2FsZXNjaW5nIHBhc3MgdGhhdCBhdHRlbXB0cyB0bworLy8gYWdncmVzc2l2ZWx5IGNvYWxlc2NlIGV2ZXJ5IHJlZ2lzdGVyIGNvcHkgdGhhdCBpdCBjYW4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJyZWdjb2FsZXNjaW5nIgorI2luY2x1ZGUgIlNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZy5oIgorI2luY2x1ZGUgIlZpcnRSZWdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlckNvYWxlc2Nlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMobnVtSm9pbnMgICAgLCAiTnVtYmVyIG9mIGludGVydmFsIGpvaW5zIHBlcmZvcm1lZCIpOworU1RBVElTVElDKG51bUNyb3NzUkNzICwgIk51bWJlciBvZiBjcm9zcyBjbGFzcyBqb2lucyBwZXJmb3JtZWQiKTsKK1NUQVRJU1RJQyhudW1Db21tdXRlcyAsICJOdW1iZXIgb2YgaW5zdHJ1Y3Rpb24gY29tbXV0aW5nIHBlcmZvcm1lZCIpOworU1RBVElTVElDKG51bUV4dGVuZHMgICwgIk51bWJlciBvZiBjb3BpZXMgZXh0ZW5kZWQiKTsKK1NUQVRJU1RJQyhOdW1SZU1hdHMgICAsICJOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHJlLW1hdGVyaWFsaXplZCIpOworU1RBVElTVElDKG51bVBlZXAgICAgICwgIk51bWJlciBvZiBpZGVudGl0eSBtb3ZlcyBlbGltaW5hdGVkIGFmdGVyIGNvYWxlc2NpbmciKTsKK1NUQVRJU1RJQyhudW1BYm9ydHMgICAsICJOdW1iZXIgb2YgdGltZXMgaW50ZXJ2YWwgam9pbmluZyBhYm9ydGVkIik7CitTVEFUSVNUSUMobnVtRGVhZFZhbE5vLCAiTnVtYmVyIG9mIHZhbG5vIGRlZiBtYXJrZWQgZGVhZCIpOworCitjaGFyIFNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZzo6SUQgPSAwOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0VuYWJsZUpvaW5pbmcoImpvaW4tbGl2ZWludGVydmFscyIsCisgICAgICAgICAgICAgIGNsOjpkZXNjKCJDb2FsZXNjZSBjb3BpZXMgKGRlZmF1bHQ9dHJ1ZSkiKSwKKyAgICAgICAgICAgICAgY2w6OmluaXQodHJ1ZSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPgorRGlzYWJsZUNyb3NzQ2xhc3NKb2luKCJkaXNhYmxlLWNyb3NzLWNsYXNzLWpvaW4iLAorICAgICAgICAgICAgICAgY2w6OmRlc2MoIkF2b2lkIGNvYWxlc2NpbmcgY3Jvc3MgcmVnaXN0ZXIgY2xhc3MgY29waWVzIiksCisgICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSksIGNsOjpIaWRkZW4pOworCitzdGF0aWMgUmVnaXN0ZXJQYXNzPFNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZz4KK1goInNpbXBsZS1yZWdpc3Rlci1jb2FsZXNjaW5nIiwgIlNpbXBsZSBSZWdpc3RlciBDb2FsZXNjaW5nIik7CisKKy8vIERlY2xhcmUgdGhhdCB3ZSBpbXBsZW1lbnQgdGhlIFJlZ2lzdGVyQ29hbGVzY2VyIGludGVyZmFjZQorc3RhdGljIFJlZ2lzdGVyQW5hbHlzaXNHcm91cDxSZWdpc3RlckNvYWxlc2NlciwgdHJ1ZS8qVGhlIERlZmF1bHQqLz4gVihYKTsKKworY2hhciAmbGx2bTo6U2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nSUQgPSBTaW1wbGVSZWdpc3RlckNvYWxlc2Npbmc6OklEOworCit2b2lkIFNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZzo6Z2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgQVUuYWRkUmVxdWlyZWQ8QWxpYXNBbmFseXNpcz4oKTsKKyAgQVUuYWRkUmVxdWlyZWQ8TGl2ZUludGVydmFscz4oKTsKKyAgQVUuYWRkUHJlc2VydmVkPExpdmVJbnRlcnZhbHM+KCk7CisgIEFVLmFkZFByZXNlcnZlZDxTbG90SW5kZXhlcz4oKTsKKyAgQVUuYWRkUmVxdWlyZWQ8TWFjaGluZUxvb3BJbmZvPigpOworICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZUxvb3BJbmZvPigpOworICBBVS5hZGRQcmVzZXJ2ZWRJRChNYWNoaW5lRG9taW5hdG9yc0lEKTsKKyAgaWYgKFN0cm9uZ1BISUVsaW0pCisgICAgQVUuYWRkUHJlc2VydmVkSUQoU3Ryb25nUEhJRWxpbWluYXRpb25JRCk7CisgIGVsc2UKKyAgICBBVS5hZGRQcmVzZXJ2ZWRJRChQSElFbGltaW5hdGlvbklEKTsKKyAgQVUuYWRkUHJlc2VydmVkSUQoVHdvQWRkcmVzc0luc3RydWN0aW9uUGFzc0lEKTsKKyAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7Cit9CisKKy8vLyBBZGp1c3RDb3BpZXNCYWNrRnJvbSAtIFdlIGZvdW5kIGEgbm9uLXRyaXZpYWxseS1jb2FsZXNjYWJsZSBjb3B5IHdpdGggSW50QQorLy8vIGJlaW5nIHRoZSBzb3VyY2UgYW5kIEludEIgYmVpbmcgdGhlIGRlc3QsIHRodXMgdGhpcyBkZWZpbmVzIGEgdmFsdWUgbnVtYmVyCisvLy8gaW4gSW50Qi4gIElmIHRoZSBzb3VyY2UgdmFsdWUgbnVtYmVyIChpbiBJbnRBKSBpcyBkZWZpbmVkIGJ5IGEgY29weSBmcm9tIEIsCisvLy8gc2VlIGlmIHdlIGNhbiBtZXJnZSB0aGVzZSB0d28gcGllY2VzIG9mIEIgaW50byBhIHNpbmdsZSB2YWx1ZSBudW1iZXIsCisvLy8gZWxpbWluYXRpbmcgYSBjb3B5LiAgRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgQTMgPSBCMAorLy8vICAgIC4uLgorLy8vICBCMSA9IEEzICAgICAgPC0gdGhpcyBjb3B5CisvLy8KKy8vLyBJbiB0aGlzIGNhc2UsIEIwIGNhbiBiZSBleHRlbmRlZCB0byB3aGVyZSB0aGUgQjEgY29weSBsaXZlcywgYWxsb3dpbmcgdGhlIEIxCisvLy8gdmFsdWUgbnVtYmVyIHRvIGJlIHJlcGxhY2VkIHdpdGggQjAgKHdoaWNoIHNpbXBsaWZpZXMgdGhlIEIgbGl2ZWludGVydmFsKS4KKy8vLworLy8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIGFuIGludGVydmFsIHdhcyBtb2RpZmllZC4KKy8vLworYm9vbCBTaW1wbGVSZWdpc3RlckNvYWxlc2Npbmc6OkFkanVzdENvcGllc0JhY2tGcm9tKGNvbnN0IENvYWxlc2NlclBhaXIgJkNQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqQ29weU1JKSB7CisgIC8vIEJhaWwgaWYgdGhlcmUgaXMgbm8gZHN0IGludGVydmFsIC0gY2FuIGhhcHBlbiB3aGVuIG1lcmdpbmcgcGh5c2ljYWwgc3VicmVnCisgIC8vIG9wZXJhdGlvbnMuCisgIGlmICghbGlfLT5oYXNJbnRlcnZhbChDUC5nZXREc3RSZWcoKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIExpdmVJbnRlcnZhbCAmSW50QSA9CisgICAgbGlfLT5nZXRJbnRlcnZhbChDUC5pc0ZsaXBwZWQoKSA/IENQLmdldERzdFJlZygpIDogQ1AuZ2V0U3JjUmVnKCkpOworICBMaXZlSW50ZXJ2YWwgJkludEIgPQorICAgIGxpXy0+Z2V0SW50ZXJ2YWwoQ1AuaXNGbGlwcGVkKCkgPyBDUC5nZXRTcmNSZWcoKSA6IENQLmdldERzdFJlZygpKTsKKyAgU2xvdEluZGV4IENvcHlJZHggPSBsaV8tPmdldEluc3RydWN0aW9uSW5kZXgoQ29weU1JKS5nZXREZWZJbmRleCgpOworCisgIC8vIEJWYWxObyBpcyBhIHZhbHVlIG51bWJlciBpbiBCIHRoYXQgaXMgZGVmaW5lZCBieSBhIGNvcHkgZnJvbSBBLiAgJ0IzJyBpbgorICAvLyB0aGUgZXhhbXBsZSBhYm92ZS4KKyAgTGl2ZUludGVydmFsOjppdGVyYXRvciBCTFIgPSBJbnRCLkZpbmRMaXZlUmFuZ2VDb250YWluaW5nKENvcHlJZHgpOworICBpZiAoQkxSID09IEludEIuZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgVk5JbmZvICpCVmFsTm8gPSBCTFItPnZhbG5vOworCisgIC8vIEdldCB0aGUgbG9jYXRpb24gdGhhdCBCIGlzIGRlZmluZWQgYXQuICBUd28gb3B0aW9uczogZWl0aGVyIHRoaXMgdmFsdWUgaGFzCisgIC8vIGFuIHVua25vd24gZGVmaW5pdGlvbiBwb2ludCBvciBpdCBpcyBkZWZpbmVkIGF0IENvcHlJZHguICBJZiB1bmtub3duLCB3ZQorICAvLyBjYW4ndCBwcm9jZXNzIGl0LgorICBpZiAoIUJWYWxOby0+Z2V0Q29weSgpKSByZXR1cm4gZmFsc2U7CisgIGFzc2VydChCVmFsTm8tPmRlZiA9PSBDb3B5SWR4ICYmICJDb3B5IGRvZXNuJ3QgZGVmaW5lIHRoZSB2YWx1ZT8iKTsKKworICAvLyBBVmFsTm8gaXMgdGhlIHZhbHVlIG51bWJlciBpbiBBIHRoYXQgZGVmaW5lcyB0aGUgY29weSwgQTMgaW4gdGhlIGV4YW1wbGUuCisgIFNsb3RJbmRleCBDb3B5VXNlSWR4ID0gQ29weUlkeC5nZXRVc2VJbmRleCgpOworICBMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yIEFMUiA9IEludEEuRmluZExpdmVSYW5nZUNvbnRhaW5pbmcoQ29weVVzZUlkeCk7CisgIC8vIFRoZSBsaXZlIHJhbmdlIG1pZ2h0IG5vdCBleGlzdCBhZnRlciBmdW4gd2l0aCBwaHlzcmVnIGNvYWxlc2NpbmcuCisgIGlmIChBTFIgPT0gSW50QS5lbmQoKSkgcmV0dXJuIGZhbHNlOworICBWTkluZm8gKkFWYWxObyA9IEFMUi0+dmFsbm87CisgIC8vIElmIGl0J3MgcmUtZGVmaW5lZCBieSBhbiBlYXJseSBjbG9iYmVyIHNvbWV3aGVyZSBpbiB0aGUgbGl2ZSByYW5nZSwgdGhlbgorICAvLyBpdCdzIG5vdCBzYWZlIHRvIGVsaW1pbmF0ZSB0aGUgY29weS4gRklYTUU6IFRoaXMgaXMgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZC4KKyAgLy8gU2VlIFBSMzE0OToKKyAgLy8gMTcyICAgICAlRUNYPGRlZj4gPSBNT1YzMnJyICVyZWcxMDM5PGtpbGw+CisgIC8vIDE4MCAgICAgSU5MSU5FQVNNIDxlczpzdWJsICQ1LCQxCisgIC8vICAgICAgICAgc2JibCAkMywkMD4sIDEwLCAlRUFYPGRlZj4sIDE0LCAlRUNYPGVhcmx5Y2xvYmJlcixkZWY+LCA5LAorICAvLyAgICAgICAgICVFQVg8a2lsbD4sCisgIC8vIDM2LCA8ZmkjMD4sIDEsICVyZWcwLCAwLCA5LCAlRUNYPGtpbGw+LCAzNiwgPGZpIzE+LCAxLCAlcmVnMCwgMAorICAvLyAxODggICAgICVFQVg8ZGVmPiA9IE1PVjMycnIgJUVBWDxraWxsPgorICAvLyAxOTYgICAgICVFQ1g8ZGVmPiA9IE1PVjMycnIgJUVDWDxraWxsPgorICAvLyAyMDQgICAgICVFQ1g8ZGVmPiA9IE1PVjMycnIgJUVDWDxraWxsPgorICAvLyAyMTIgICAgICVFQVg8ZGVmPiA9IE1PVjMycnIgJUVBWDxraWxsPgorICAvLyAyMjAgICAgICVFQVg8ZGVmPiA9IE1PVjMycnIgJUVBWAorICAvLyAyMjggICAgICVyZWcxMDM5PGRlZj4gPSBNT1YzMnJyICVFQ1g8a2lsbD4KKyAgLy8gVGhlIGVhcmx5IGNsb2JiZXIgb3BlcmFuZCB0aWVzIEVDWCBpbnB1dCB0byB0aGUgRUNYIGRlZi4KKyAgLy8KKyAgLy8gVGhlIGxpdmUgaW50ZXJ2YWwgb2YgRUNYIGlzIHJlcHJlc2VudGVkIGFzIHRoaXM6CisgIC8vICVyZWcyMCxpbmYgPSBbNDYsNDc6MSlbMTc0LDIzMDowKSAgMEAxNzQtKDIzMCkgMUA0Ni0oNDcpCisgIC8vIFRoZSBjb2FsZXNjZXIgaGFzIG5vIGlkZWEgdGhlcmUgd2FzIGEgZGVmIGluIHRoZSBtaWRkbGUgb2YgWzE3NCwyMzBdLgorICBpZiAoQVZhbE5vLT5oYXNSZWRlZkJ5RUMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgQVZhbE5vIGlzIGRlZmluZWQgYXMgYSBjb3B5IGZyb20gSW50Qiwgd2UgY2FuIHBvdGVudGlhbGx5IHByb2Nlc3MgdGhpcy4KKyAgLy8gR2V0IHRoZSBpbnN0cnVjdGlvbiB0aGF0IGRlZmluZXMgdGhpcyB2YWx1ZSBudW1iZXIuCisgIGlmICghQ1AuaXNDb2FsZXNjYWJsZShBVmFsTm8tPmdldENvcHkoKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEdldCB0aGUgTGl2ZVJhbmdlIGluIEludEIgdGhhdCB0aGlzIHZhbHVlIG51bWJlciBzdGFydHMgd2l0aC4KKyAgTGl2ZUludGVydmFsOjppdGVyYXRvciBWYWxMUiA9CisgICAgSW50Qi5GaW5kTGl2ZVJhbmdlQ29udGFpbmluZyhBVmFsTm8tPmRlZi5nZXRQcmV2U2xvdCgpKTsKKyAgaWYgKFZhbExSID09IEludEIuZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBlbmQgb2YgdGhlIGxpdmUgcmFuZ2UgaXMgaW5zaWRlIHRoZSBzYW1lIGJsb2NrIGFzCisgIC8vIENvcHlNSS4KKyAgTWFjaGluZUluc3RyICpWYWxMUkVuZEluc3QgPQorICAgIGxpXy0+Z2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoVmFsTFItPmVuZC5nZXRQcmV2U2xvdCgpKTsKKyAgaWYgKCFWYWxMUkVuZEluc3QgfHwgVmFsTFJFbmRJbnN0LT5nZXRQYXJlbnQoKSAhPSBDb3B5TUktPmdldFBhcmVudCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBPa2F5LCB3ZSBub3cga25vdyB0aGF0IFZhbExSIGVuZHMgaW4gdGhlIHNhbWUgYmxvY2sgdGhhdCB0aGUgQ29weU1JCisgIC8vIGxpdmUtcmFuZ2Ugc3RhcnRzLiAgSWYgdGhlcmUgYXJlIG5vIGludGVydmVuaW5nIGxpdmUgcmFuZ2VzIGJldHdlZW4gdGhlbSBpbgorICAvLyBJbnRCLCB3ZSBjYW4gbWVyZ2UgdGhlbS4KKyAgaWYgKFZhbExSKzEgIT0gQkxSKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgYSBsaXZlIGludGVydmFsIGlzIGEgcGh5c2ljYWwgcmVnaXN0ZXIsIGNvbnNlcnZhdGl2ZWx5IGNoZWNrIGlmIGFueQorICAvLyBvZiBpdHMgc3ViLXJlZ2lzdGVycyBpcyBvdmVybGFwcGluZyB0aGUgbGl2ZSBpbnRlcnZhbCBvZiB0aGUgdmlydHVhbAorICAvLyByZWdpc3Rlci4gSWYgc28sIGRvIG5vdCBjb2FsZXNjZS4KKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKEludEIucmVnKSAmJgorICAgICAgKnRyaV8tPmdldFN1YlJlZ2lzdGVycyhJbnRCLnJlZykpIHsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkKiBTUiA9IHRyaV8tPmdldFN1YlJlZ2lzdGVycyhJbnRCLnJlZyk7ICpTUjsgKytTUikKKyAgICAgIGlmIChsaV8tPmhhc0ludGVydmFsKCpTUikgJiYgSW50QS5vdmVybGFwcyhsaV8tPmdldEludGVydmFsKCpTUikpKSB7CisgICAgICAgIERFQlVHKHsKKyAgICAgICAgICAgIGRiZ3MoKSA8PCAiXHRcdEludGVyZmVyZSB3aXRoIHN1Yi1yZWdpc3RlciAiOworICAgICAgICAgICAgbGlfLT5nZXRJbnRlcnZhbCgqU1IpLnByaW50KGRiZ3MoKSwgdHJpXyk7CisgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgfQorCisgIERFQlVHKHsKKyAgICAgIGRiZ3MoKSA8PCAiRXh0ZW5kaW5nOiAiOworICAgICAgSW50Qi5wcmludChkYmdzKCksIHRyaV8pOworICAgIH0pOworCisgIFNsb3RJbmRleCBGaWxsZXJTdGFydCA9IFZhbExSLT5lbmQsIEZpbGxlckVuZCA9IEJMUi0+c3RhcnQ7CisgIC8vIFdlIGFyZSBhYm91dCB0byBkZWxldGUgQ29weU1JLCBzbyBuZWVkIHRvIHJlbW92ZSBpdCBhcyB0aGUgJ2luc3RydWN0aW9uCisgIC8vIHRoYXQgZGVmaW5lcyB0aGlzIHZhbHVlICMnLiBVcGRhdGUgdGhlIHZhbG51bSB3aXRoIHRoZSBuZXcgZGVmaW5pbmcKKyAgLy8gaW5zdHJ1Y3Rpb24gIy4KKyAgQlZhbE5vLT5kZWYgID0gRmlsbGVyU3RhcnQ7CisgIEJWYWxOby0+c2V0Q29weSgwKTsKKworICAvLyBPa2F5LCB3ZSBjYW4gbWVyZ2UgdGhlbS4gIFdlIG5lZWQgdG8gaW5zZXJ0IGEgbmV3IGxpdmVyYW5nZToKKyAgLy8gW1ZhbExSLmVuZCwgQkxSLmJlZ2luKSBvZiBlaXRoZXIgdmFsdWUgbnVtYmVyLCB0aGVuIHdlIG1lcmdlIHRoZQorICAvLyB0d28gdmFsdWUgbnVtYmVycy4KKyAgSW50Qi5hZGRSYW5nZShMaXZlUmFuZ2UoRmlsbGVyU3RhcnQsIEZpbGxlckVuZCwgQlZhbE5vKSk7CisKKyAgLy8gSWYgdGhlIEludEIgbGl2ZSByYW5nZSBpcyBhc3NpZ25lZCB0byBhIHBoeXNpY2FsIHJlZ2lzdGVyLCBhbmQgaWYgdGhhdAorICAvLyBwaHlzcmVnIGhhcyBzdWItcmVnaXN0ZXJzLCB1cGRhdGUgdGhlaXIgbGl2ZSBpbnRlcnZhbHMgYXMgd2VsbC4KKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKEludEIucmVnKSkgeworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlNSID0gdHJpXy0+Z2V0U3ViUmVnaXN0ZXJzKEludEIucmVnKTsgKlNSOyArK1NSKSB7CisgICAgICBpZiAoIWxpXy0+aGFzSW50ZXJ2YWwoKlNSKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBMaXZlSW50ZXJ2YWwgJlNSTEkgPSBsaV8tPmdldEludGVydmFsKCpTUik7CisgICAgICBTUkxJLmFkZFJhbmdlKExpdmVSYW5nZShGaWxsZXJTdGFydCwgRmlsbGVyRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JMSS5nZXROZXh0VmFsdWUoRmlsbGVyU3RhcnQsIDAsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaV8tPmdldFZOSW5mb0FsbG9jYXRvcigpKSkpOworICAgIH0KKyAgfQorCisgIC8vIE9rYXksIG1lcmdlICJCMSIgaW50byB0aGUgc2FtZSB2YWx1ZSBudW1iZXIgYXMgIkIwIi4KKyAgaWYgKEJWYWxObyAhPSBWYWxMUi0+dmFsbm8pIHsKKyAgICBJbnRCLk1lcmdlVmFsdWVOdW1iZXJJbnRvKEJWYWxObywgVmFsTFItPnZhbG5vKTsKKyAgfQorICBERUJVRyh7CisgICAgICBkYmdzKCkgPDwgIiAgIHJlc3VsdCA9ICI7CisgICAgICBJbnRCLnByaW50KGRiZ3MoKSwgdHJpXyk7CisgICAgICBkYmdzKCkgPDwgIlxuIjsKKyAgICB9KTsKKworICAvLyBJZiB0aGUgc291cmNlIGluc3RydWN0aW9uIHdhcyBraWxsaW5nIHRoZSBzb3VyY2UgcmVnaXN0ZXIgYmVmb3JlIHRoZQorICAvLyBtZXJnZSwgdW5zZXQgdGhlIGlzS2lsbCBtYXJrZXIgZ2l2ZW4gdGhlIGxpdmUgcmFuZ2UgaGFzIGJlZW4gZXh0ZW5kZWQuCisgIGludCBVSWR4ID0gVmFsTFJFbmRJbnN0LT5maW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KEludEIucmVnLCB0cnVlKTsKKyAgaWYgKFVJZHggIT0gLTEpIHsKKyAgICBWYWxMUkVuZEluc3QtPmdldE9wZXJhbmQoVUlkeCkuc2V0SXNLaWxsKGZhbHNlKTsKKyAgfQorCisgIC8vIElmIHRoZSBjb3B5IGluc3RydWN0aW9uIHdhcyBraWxsaW5nIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBiZWZvcmUgdGhlCisgIC8vIG1lcmdlLCBmaW5kIHRoZSBsYXN0IHVzZSBhbmQgdHJpbSB0aGUgbGl2ZSByYW5nZS4gVGhhdCB3aWxsIGFsc28gYWRkIHRoZQorICAvLyBpc0tpbGwgbWFya2VyLgorICBpZiAoQUxSLT5lbmQgPT0gQ29weUlkeCkKKyAgICBUcmltTGl2ZUludGVydmFsVG9MYXN0VXNlKENvcHlVc2VJZHgsIENvcHlNSS0+Z2V0UGFyZW50KCksIEludEEsIEFMUik7CisKKyAgKytudW1FeHRlbmRzOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIEhhc090aGVyUmVhY2hpbmdEZWZzIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGRlZmluaXRpb25zIG9mIEludEIKKy8vLyBvdGhlciB0aGFuIEJWYWxObyB2YWwjIHRoYXQgY2FuIHJlYWNoIHVzZXMgb2YgQVZhbG5vIHZhbCMgb2YgSW50QS4KK2Jvb2wgU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nOjpIYXNPdGhlclJlYWNoaW5nRGVmcyhMaXZlSW50ZXJ2YWwgJkludEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFsICZJbnRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOSW5mbyAqQVZhbE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOSW5mbyAqQlZhbE5vKSB7CisgIGZvciAoTGl2ZUludGVydmFsOjppdGVyYXRvciBBSSA9IEludEEuYmVnaW4oKSwgQUUgPSBJbnRBLmVuZCgpOworICAgICAgIEFJICE9IEFFOyArK0FJKSB7CisgICAgaWYgKEFJLT52YWxubyAhPSBBVmFsTm8pIGNvbnRpbnVlOworICAgIExpdmVJbnRlcnZhbDo6UmFuZ2VzOjppdGVyYXRvciBCSSA9CisgICAgICBzdGQ6OnVwcGVyX2JvdW5kKEludEIucmFuZ2VzLmJlZ2luKCksIEludEIucmFuZ2VzLmVuZCgpLCBBSS0+c3RhcnQpOworICAgIGlmIChCSSAhPSBJbnRCLnJhbmdlcy5iZWdpbigpKQorICAgICAgLS1CSTsKKyAgICBmb3IgKDsgQkkgIT0gSW50Qi5yYW5nZXMuZW5kKCkgJiYgQUktPmVuZCA+PSBCSS0+c3RhcnQ7ICsrQkkpIHsKKyAgICAgIGlmIChCSS0+dmFsbm8gPT0gQlZhbE5vKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIFdoZW4gQlZhbE5vIGlzIG51bGwsIHdlJ3JlIGxvb2tpbmcgZm9yIGEgZHVtbXkgY2xvYmJlci12YWx1ZSBmb3IgYSBzdWJyZWcuCisgICAgICBpZiAoIUJWYWxObyAmJiAhQkktPnZhbG5vLT5pc0RlZkFjY3VyYXRlKCkgJiYgIUJJLT52YWxuby0+Z2V0Q29weSgpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChCSS0+c3RhcnQgPD0gQUktPnN0YXJ0ICYmIEJJLT5lbmQgPiBBSS0+c3RhcnQpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKEJJLT5zdGFydCA+IEFJLT5zdGFydCAmJiBCSS0+c3RhcnQgPCBBSS0+ZW5kKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZAorVHJhbnNmZXJJbXBsaWNpdE9wcyhNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lSW5zdHIgKk5ld01JKSB7CisgIGZvciAodW5zaWduZWQgaSA9IE1JLT5nZXREZXNjKCkuZ2V0TnVtT3BlcmFuZHMoKSwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOworICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNJbXBsaWNpdCgpKQorICAgICAgTmV3TUktPmFkZE9wZXJhbmQoTU8pOworICB9Cit9CisKKy8vLyBSZW1vdmVDb3B5QnlDb21tdXRpbmdEZWYgLSBXZSBmb3VuZCBhIG5vbi10cml2aWFsbHktY29hbGVzY2FibGUgY29weSB3aXRoCisvLy8gSW50QSBiZWluZyB0aGUgc291cmNlIGFuZCBJbnRCIGJlaW5nIHRoZSBkZXN0LCB0aHVzIHRoaXMgZGVmaW5lcyBhIHZhbHVlCisvLy8gbnVtYmVyIGluIEludEIuICBJZiB0aGUgc291cmNlIHZhbHVlIG51bWJlciAoaW4gSW50QSkgaXMgZGVmaW5lZCBieSBhCisvLy8gY29tbXV0YWJsZSBpbnN0cnVjdGlvbiBhbmQgaXRzIG90aGVyIG9wZXJhbmQgaXMgY29hbGVzY2VkIHRvIHRoZSBjb3B5IGRlc3QKKy8vLyByZWdpc3Rlciwgc2VlIGlmIHdlIGNhbiB0cmFuc2Zvcm0gdGhlIGNvcHkgaW50byBhIG5vb3AgYnkgY29tbXV0aW5nIHRoZQorLy8vIGRlZmluaXRpb24uIEZvciBleGFtcGxlLAorLy8vCisvLy8gIEEzID0gb3AgQTIgQjA8a2lsbD4KKy8vLyAgICAuLi4KKy8vLyAgQjEgPSBBMyAgICAgIDwtIHRoaXMgY29weQorLy8vICAgIC4uLgorLy8vICAgICA9IG9wIEEzICAgPC0gbW9yZSB1c2VzCisvLy8KKy8vLyA9PT4KKy8vLworLy8vICBCMiA9IG9wIEIwIEEyPGtpbGw+CisvLy8gICAgLi4uCisvLy8gIEIxID0gQjIgICAgICA8LSBub3cgYW4gaWRlbnRpZnkgY29weQorLy8vICAgIC4uLgorLy8vICAgICA9IG9wIEIyICAgPC0gbW9yZSB1c2VzCisvLy8KKy8vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiBhbiBpbnRlcnZhbCB3YXMgbW9kaWZpZWQuCisvLy8KK2Jvb2wgU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nOjpSZW1vdmVDb3B5QnlDb21tdXRpbmdEZWYoY29uc3QgQ29hbGVzY2VyUGFpciAmQ1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqQ29weU1JKSB7CisgIC8vIEZJWE1FOiBGb3Igbm93LCBvbmx5IGVsaW1pbmF0ZSB0aGUgY29weSBieSBjb21tdXRpbmcgaXRzIGRlZiB3aGVuIHRoZQorICAvLyBzb3VyY2UgcmVnaXN0ZXIgaXMgYSB2aXJ0dWFsIHJlZ2lzdGVyLiBXZSB3YW50IHRvIGd1YXJkIGFnYWluc3QgY2FzZXMKKyAgLy8gd2hlcmUgdGhlIGNvcHkgaXMgYSBiYWNrIGVkZ2UgY29weSBhbmQgY29tbXV0aW5nIHRoZSBkZWYgbGVuZ3RoZW4gdGhlCisgIC8vIGxpdmUgaW50ZXJ2YWwgb2YgdGhlIHNvdXJjZSByZWdpc3RlciB0byB0aGUgZW50aXJlIGxvb3AuCisgIGlmIChDUC5pc1BoeXMoKSAmJiBDUC5pc0ZsaXBwZWQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQmFpbCBpZiB0aGVyZSBpcyBubyBkc3QgaW50ZXJ2YWwuCisgIGlmICghbGlfLT5oYXNJbnRlcnZhbChDUC5nZXREc3RSZWcoKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNsb3RJbmRleCBDb3B5SWR4ID0KKyAgICBsaV8tPmdldEluc3RydWN0aW9uSW5kZXgoQ29weU1JKS5nZXREZWZJbmRleCgpOworCisgIExpdmVJbnRlcnZhbCAmSW50QSA9CisgICAgbGlfLT5nZXRJbnRlcnZhbChDUC5pc0ZsaXBwZWQoKSA/IENQLmdldERzdFJlZygpIDogQ1AuZ2V0U3JjUmVnKCkpOworICBMaXZlSW50ZXJ2YWwgJkludEIgPQorICAgIGxpXy0+Z2V0SW50ZXJ2YWwoQ1AuaXNGbGlwcGVkKCkgPyBDUC5nZXRTcmNSZWcoKSA6IENQLmdldERzdFJlZygpKTsKKworICAvLyBCVmFsTm8gaXMgYSB2YWx1ZSBudW1iZXIgaW4gQiB0aGF0IGlzIGRlZmluZWQgYnkgYSBjb3B5IGZyb20gQS4gJ0IzJyBpbgorICAvLyB0aGUgZXhhbXBsZSBhYm92ZS4KKyAgTGl2ZUludGVydmFsOjppdGVyYXRvciBCTFIgPSBJbnRCLkZpbmRMaXZlUmFuZ2VDb250YWluaW5nKENvcHlJZHgpOworICBpZiAoQkxSID09IEludEIuZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgVk5JbmZvICpCVmFsTm8gPSBCTFItPnZhbG5vOworCisgIC8vIEdldCB0aGUgbG9jYXRpb24gdGhhdCBCIGlzIGRlZmluZWQgYXQuICBUd28gb3B0aW9uczogZWl0aGVyIHRoaXMgdmFsdWUgaGFzCisgIC8vIGFuIHVua25vd24gZGVmaW5pdGlvbiBwb2ludCBvciBpdCBpcyBkZWZpbmVkIGF0IENvcHlJZHguICBJZiB1bmtub3duLCB3ZQorICAvLyBjYW4ndCBwcm9jZXNzIGl0LgorICBpZiAoIUJWYWxOby0+Z2V0Q29weSgpKSByZXR1cm4gZmFsc2U7CisgIGFzc2VydChCVmFsTm8tPmRlZiA9PSBDb3B5SWR4ICYmICJDb3B5IGRvZXNuJ3QgZGVmaW5lIHRoZSB2YWx1ZT8iKTsKKworICAvLyBBVmFsTm8gaXMgdGhlIHZhbHVlIG51bWJlciBpbiBBIHRoYXQgZGVmaW5lcyB0aGUgY29weSwgQTMgaW4gdGhlIGV4YW1wbGUuCisgIExpdmVJbnRlcnZhbDo6aXRlcmF0b3IgQUxSID0KKyAgICBJbnRBLkZpbmRMaXZlUmFuZ2VDb250YWluaW5nKENvcHlJZHguZ2V0VXNlSW5kZXgoKSk7IC8vIAorCisgIGFzc2VydChBTFIgIT0gSW50QS5lbmQoKSAmJiAiTGl2ZSByYW5nZSBub3QgZm91bmQhIik7CisgIFZOSW5mbyAqQVZhbE5vID0gQUxSLT52YWxubzsKKyAgLy8gSWYgb3RoZXIgZGVmcyBjYW4gcmVhY2ggdXNlcyBvZiB0aGlzIGRlZiwgdGhlbiBpdCdzIG5vdCBzYWZlIHRvIHBlcmZvcm0KKyAgLy8gdGhlIG9wdGltaXphdGlvbi4gRklYTUU6IERvIGlzUEhJRGVmIGFuZCBpc0RlZkFjY3VyYXRlIGJvdGggbmVlZCB0byBiZQorICAvLyB0ZXN0ZWQ/CisgIGlmIChBVmFsTm8tPmlzUEhJRGVmKCkgfHwgIUFWYWxOby0+aXNEZWZBY2N1cmF0ZSgpIHx8CisgICAgICBBVmFsTm8tPmlzVW51c2VkKCkgfHwgQVZhbE5vLT5oYXNQSElLaWxsKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBNYWNoaW5lSW5zdHIgKkRlZk1JID0gbGlfLT5nZXRJbnN0cnVjdGlvbkZyb21JbmRleChBVmFsTm8tPmRlZik7CisgIGlmICghRGVmTUkpCisgICAgcmV0dXJuIGZhbHNlOworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IERlZk1JLT5nZXREZXNjKCk7CisgIGlmICghVElELmlzQ29tbXV0YWJsZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgLy8gSWYgRGVmTUkgaXMgYSB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbiB0aGVuIGNvbW11dGluZyBpdCB3aWxsIGNoYW5nZSB0aGUKKyAgLy8gZGVzdGluYXRpb24gcmVnaXN0ZXIuCisgIGludCBEZWZJZHggPSBEZWZNSS0+ZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeChJbnRBLnJlZyk7CisgIGFzc2VydChEZWZJZHggIT0gLTEpOworICB1bnNpZ25lZCBVc2VPcElkeDsKKyAgaWYgKCFEZWZNSS0+aXNSZWdUaWVkVG9Vc2VPcGVyYW5kKERlZklkeCwgJlVzZU9wSWR4KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHVuc2lnbmVkIE9wMSwgT3AyLCBOZXdEc3RJZHg7CisgIGlmICghdGlpXy0+ZmluZENvbW11dGVkT3BJbmRpY2VzKERlZk1JLCBPcDEsIE9wMikpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoT3AxID09IFVzZU9wSWR4KQorICAgIE5ld0RzdElkeCA9IE9wMjsKKyAgZWxzZSBpZiAoT3AyID09IFVzZU9wSWR4KQorICAgIE5ld0RzdElkeCA9IE9wMTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKKworICBNYWNoaW5lT3BlcmFuZCAmTmV3RHN0TU8gPSBEZWZNSS0+Z2V0T3BlcmFuZChOZXdEc3RJZHgpOworICB1bnNpZ25lZCBOZXdSZWcgPSBOZXdEc3RNTy5nZXRSZWcoKTsKKyAgaWYgKE5ld1JlZyAhPSBJbnRCLnJlZyB8fCAhTmV3RHN0TU8uaXNLaWxsKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gb3RoZXIgZGVmaW5pdGlvbnMgb2YgSW50QiB0aGF0IHdvdWxkIHJlYWNoIHRoZQorICAvLyB1c2VzIHdoaWNoIHRoZSBuZXcgZGVmaW5pdGlvbiBjYW4gcmVhY2guCisgIGlmIChIYXNPdGhlclJlYWNoaW5nRGVmcyhJbnRBLCBJbnRCLCBBVmFsTm8sIEJWYWxObykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgQkhhc1N1YlJlZ3MgPSBmYWxzZTsKKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKEludEIucmVnKSkKKyAgICBCSGFzU3ViUmVncyA9ICp0cmlfLT5nZXRTdWJSZWdpc3RlcnMoSW50Qi5yZWcpOworCisgIC8vIEFib3J0IGlmIHRoZSBzdWJyZWdpc3RlcnMgb2YgSW50Qi5yZWcgaGF2ZSB2YWx1ZXMgdGhhdCBhcmUgbm90IHNpbXBseSB0aGUKKyAgLy8gY2xvYmJlcnMgZnJvbSB0aGUgc3VwZXJyZWcuCisgIGlmIChCSGFzU3ViUmVncykKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTUiA9IHRyaV8tPmdldFN1YlJlZ2lzdGVycyhJbnRCLnJlZyk7ICpTUjsgKytTUikKKyAgICAgIGlmIChsaV8tPmhhc0ludGVydmFsKCpTUikgJiYKKyAgICAgICAgICBIYXNPdGhlclJlYWNoaW5nRGVmcyhJbnRBLCBsaV8tPmdldEludGVydmFsKCpTUiksIEFWYWxObywgMCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiBzb21lIG9mIHRoZSB1c2VzIG9mIEludEEucmVnIGlzIGFscmVhZHkgY29hbGVzY2VkIGF3YXksIHJldHVybiBmYWxzZS4KKyAgLy8gSXQncyBub3QgcG9zc2libGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQncyBzYWZlIHRvIHBlcmZvcm0gdGhlIGNvYWxlc2NpbmcuCisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6dXNlX25vZGJnX2l0ZXJhdG9yIFVJID0gCisgICAgICAgICBtcmlfLT51c2Vfbm9kYmdfYmVnaW4oSW50QS5yZWcpLCAKKyAgICAgICBVRSA9IG1yaV8tPnVzZV9ub2RiZ19lbmQoKTsgVUkgIT0gVUU7ICsrVUkpIHsKKyAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gJipVSTsKKyAgICBTbG90SW5kZXggVXNlSWR4ID0gbGlfLT5nZXRJbnN0cnVjdGlvbkluZGV4KFVzZU1JKTsKKyAgICBMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yIFVMUiA9IEludEEuRmluZExpdmVSYW5nZUNvbnRhaW5pbmcoVXNlSWR4KTsKKyAgICBpZiAoVUxSID09IEludEEuZW5kKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoVUxSLT52YWxubyA9PSBBVmFsTm8gJiYgSm9pbmVkQ29waWVzLmNvdW50KFVzZU1JKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBkZWNpZGVkIHRoYXQgaXQgaXMgbGVnYWwgdG8gZG8gdGhpcworICAvLyB0cmFuc2Zvcm1hdGlvbi4gIFN0YXJ0IGJ5IGNvbW11dGluZyB0aGUgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBEZWZNSS0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVJbnN0ciAqTmV3TUkgPSB0aWlfLT5jb21tdXRlSW5zdHJ1Y3Rpb24oRGVmTUkpOworICBpZiAoIU5ld01JKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKE5ld01JICE9IERlZk1JKSB7CisgICAgbGlfLT5SZXBsYWNlTWFjaGluZUluc3RySW5NYXBzKERlZk1JLCBOZXdNSSk7CisgICAgTUJCLT5pbnNlcnQoRGVmTUksIE5ld01JKTsKKyAgICBNQkItPmVyYXNlKERlZk1JKTsKKyAgfQorICB1bnNpZ25lZCBPcElkeCA9IE5ld01JLT5maW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KEludEEucmVnLCBmYWxzZSk7CisgIE5ld01JLT5nZXRPcGVyYW5kKE9wSWR4KS5zZXRJc0tpbGwoKTsKKworICBib29sIEJIYXNQSElLaWxsID0gQlZhbE5vLT5oYXNQSElLaWxsKCk7CisgIFNtYWxsVmVjdG9yPFZOSW5mbyosIDQ+IEJEZWFkVmFsTm9zOworICBzdGQ6Om1hcDxTbG90SW5kZXgsIFNsb3RJbmRleD4gQkV4dGVuZDsKKworICAvLyBJZiBBTFIgYW5kIEJMUiBvdmVybGFwcyBhbmQgZW5kIG9mIEJMUiBleHRlbmRzIGJleW9uZCBlbmQgb2YgQUxSLCBlLmcuCisgIC8vIEEgPSBvciBBLCBCCisgIC8vIC4uLgorICAvLyBCID0gQQorICAvLyAuLi4KKyAgLy8gQyA9IEE8a2lsbD4KKyAgLy8gLi4uCisgIC8vICAgPSBCCisgIGJvb2wgRXh0ZW5kZWQgPSBCTFItPmVuZCA+IEFMUi0+ZW5kICYmIEFMUi0+ZW5kICE9IEFMUi0+c3RhcnQ7CisgIGlmIChFeHRlbmRlZCkKKyAgICBCRXh0ZW5kW0FMUi0+ZW5kXSA9IEJMUi0+ZW5kOworCisgIC8vIFVwZGF0ZSB1c2VzIG9mIEludEEgb2YgdGhlIHNwZWNpZmljIFZhbCMgd2l0aCBJbnRCLgorICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9pdGVyYXRvciBVSSA9IG1yaV8tPnVzZV9iZWdpbihJbnRBLnJlZyksCisgICAgICAgICBVRSA9IG1yaV8tPnVzZV9lbmQoKTsgVUkgIT0gVUU7KSB7CisgICAgTWFjaGluZU9wZXJhbmQgJlVzZU1PID0gVUkuZ2V0T3BlcmFuZCgpOworICAgIE1hY2hpbmVJbnN0ciAqVXNlTUkgPSAmKlVJOworICAgICsrVUk7CisgICAgaWYgKEpvaW5lZENvcGllcy5jb3VudChVc2VNSSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoVXNlTUktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgICAvLyBGSVhNRSBUaGVzZSBkb24ndCBoYXZlIGFuIGluc3RydWN0aW9uIGluZGV4LiAgTm90IGNsZWFyIHdlIGhhdmUgZW5vdWdoCisgICAgICAvLyBpbmZvIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGRvIHRoaXMgcmVwbGFjZW1lbnQgb3Igbm90LiAgRm9yIG5vdyBkbyBpdC4KKyAgICAgIFVzZU1PLnNldFJlZyhOZXdSZWcpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIFNsb3RJbmRleCBVc2VJZHggPSBsaV8tPmdldEluc3RydWN0aW9uSW5kZXgoVXNlTUkpLmdldFVzZUluZGV4KCk7CisgICAgTGl2ZUludGVydmFsOjppdGVyYXRvciBVTFIgPSBJbnRBLkZpbmRMaXZlUmFuZ2VDb250YWluaW5nKFVzZUlkeCk7CisgICAgaWYgKFVMUiA9PSBJbnRBLmVuZCgpIHx8IFVMUi0+dmFsbm8gIT0gQVZhbE5vKQorICAgICAgY29udGludWU7CisgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKE5ld1JlZykpCisgICAgICBVc2VNTy5zdWJzdFBoeXNSZWcoTmV3UmVnLCAqdHJpXyk7CisgICAgZWxzZQorICAgICAgVXNlTU8uc2V0UmVnKE5ld1JlZyk7CisgICAgaWYgKFVzZU1JID09IENvcHlNSSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChVc2VNTy5pc0tpbGwoKSkgeworICAgICAgaWYgKEV4dGVuZGVkKQorICAgICAgICBVc2VNTy5zZXRJc0tpbGwoZmFsc2UpOworICAgIH0KKyAgICBpZiAoIVVzZU1JLT5pc0NvcHkoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChVc2VNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSAhPSBJbnRCLnJlZyB8fAorICAgICAgICBVc2VNSS0+Z2V0T3BlcmFuZCgwKS5nZXRTdWJSZWcoKSkKKyAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICAvLyBUaGlzIGNvcHkgd2lsbCBiZWNvbWUgYSBub29wLiBJZiBpdCdzIGRlZmluaW5nIGEgbmV3IHZhbCMsCisgICAgLy8gcmVtb3ZlIHRoYXQgdmFsIyBhcyB3ZWxsLiBIb3dldmVyIHRoaXMgbGl2ZSByYW5nZSBpcyBiZWluZworICAgIC8vIGV4dGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGV4aXN0aW5nIGxpdmUgcmFuZ2UgZGVmaW5lZCBieSB0aGUgY29weS4KKyAgICBTbG90SW5kZXggRGVmSWR4ID0gVXNlSWR4LmdldERlZkluZGV4KCk7CisgICAgY29uc3QgTGl2ZVJhbmdlICpETFIgPSBJbnRCLmdldExpdmVSYW5nZUNvbnRhaW5pbmcoRGVmSWR4KTsKKyAgICBpZiAoIURMUikKKyAgICAgIGNvbnRpbnVlOworICAgIEJIYXNQSElLaWxsIHw9IERMUi0+dmFsbm8tPmhhc1BISUtpbGwoKTsKKyAgICBhc3NlcnQoRExSLT52YWxuby0+ZGVmID09IERlZklkeCk7CisgICAgQkRlYWRWYWxOb3MucHVzaF9iYWNrKERMUi0+dmFsbm8pOworICAgIEJFeHRlbmRbRExSLT5zdGFydF0gPSBETFItPmVuZDsKKyAgICBKb2luZWRDb3BpZXMuaW5zZXJ0KFVzZU1JKTsKKyAgfQorCisgIC8vIFdlIG5lZWQgdG8gaW5zZXJ0IGEgbmV3IGxpdmVyYW5nZTogW0FMUi5zdGFydCwgTGFzdFVzZSkuIEl0IG1heSBiZSB3ZSBjYW4KKyAgLy8gc2ltcGx5IGV4dGVuZCBCTFIgaWYgQ29weU1JIGRvZXNuJ3QgZW5kIHRoZSByYW5nZS4KKyAgREVCVUcoeworICAgICAgZGJncygpIDw8ICJFeHRlbmRpbmc6ICI7CisgICAgICBJbnRCLnByaW50KGRiZ3MoKSwgdHJpXyk7CisgICAgfSk7CisKKyAgLy8gUmVtb3ZlIHZhbCMncyBkZWZpbmVkIGJ5IGNvcGllcyB0aGF0IHdpbGwgYmUgY29hbGVzY2VkIGF3YXkuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCRGVhZFZhbE5vcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgVk5JbmZvICpEZWFkVk5JID0gQkRlYWRWYWxOb3NbaV07CisgICAgaWYgKEJIYXNTdWJSZWdzKSB7CisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTUiA9IHRyaV8tPmdldFN1YlJlZ2lzdGVycyhJbnRCLnJlZyk7ICpTUjsgKytTUikgeworICAgICAgICBpZiAoIWxpXy0+aGFzSW50ZXJ2YWwoKlNSKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgTGl2ZUludGVydmFsICZTUkxJID0gbGlfLT5nZXRJbnRlcnZhbCgqU1IpOworICAgICAgICBpZiAoY29uc3QgTGl2ZVJhbmdlICpTUkxSID0gU1JMSS5nZXRMaXZlUmFuZ2VDb250YWluaW5nKERlYWRWTkktPmRlZikpCisgICAgICAgICAgU1JMSS5yZW1vdmVWYWxObyhTUkxSLT52YWxubyk7CisgICAgICB9CisgICAgfQorICAgIEludEIucmVtb3ZlVmFsTm8oQkRlYWRWYWxOb3NbaV0pOworICB9CisKKyAgLy8gRXh0ZW5kIEJWYWxObyBieSBtZXJnaW5nIGluIEludEEgbGl2ZSByYW5nZXMgb2YgQVZhbE5vLiBWYWwjIGRlZmluaXRpb24KKyAgLy8gaXMgdXBkYXRlZC4KKyAgVk5JbmZvICpWYWxObyA9IEJWYWxObzsKKyAgVmFsTm8tPmRlZiA9IEFWYWxOby0+ZGVmOworICBWYWxOby0+c2V0Q29weSgwKTsKKyAgZm9yIChMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yIEFJID0gSW50QS5iZWdpbigpLCBBRSA9IEludEEuZW5kKCk7CisgICAgICAgQUkgIT0gQUU7ICsrQUkpIHsKKyAgICBpZiAoQUktPnZhbG5vICE9IEFWYWxObykgY29udGludWU7CisgICAgU2xvdEluZGV4IEVuZCA9IEFJLT5lbmQ7CisgICAgc3RkOjptYXA8U2xvdEluZGV4LCBTbG90SW5kZXg+OjppdGVyYXRvcgorICAgICAgRUkgPSBCRXh0ZW5kLmZpbmQoRW5kKTsKKyAgICBpZiAoRUkgIT0gQkV4dGVuZC5lbmQoKSkKKyAgICAgIEVuZCA9IEVJLT5zZWNvbmQ7CisgICAgSW50Qi5hZGRSYW5nZShMaXZlUmFuZ2UoQUktPnN0YXJ0LCBFbmQsIFZhbE5vKSk7CisgIH0KKyAgVmFsTm8tPnNldEhhc1BISUtpbGwoQkhhc1BISUtpbGwpOworCisgIERFQlVHKHsKKyAgICAgIGRiZ3MoKSA8PCAiICAgcmVzdWx0ID0gIjsKKyAgICAgIEludEIucHJpbnQoZGJncygpLCB0cmlfKTsKKyAgICAgIGRiZ3MoKSA8PCAiXG5TaG9ydGVuaW5nOiAiOworICAgICAgSW50QS5wcmludChkYmdzKCksIHRyaV8pOworICAgIH0pOworCisgIEludEEucmVtb3ZlVmFsTm8oQVZhbE5vKTsKKworICBERUJVRyh7CisgICAgICBkYmdzKCkgPDwgIiAgIHJlc3VsdCA9ICI7CisgICAgICBJbnRBLnByaW50KGRiZ3MoKSwgdHJpXyk7CisgICAgICBkYmdzKCkgPDwgJ1xuJzsKKyAgICB9KTsKKworICArK251bUNvbW11dGVzOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzU2FtZU9yRmFsbFRocm91Z2hCQiAtIFJldHVybiB0cnVlIGlmIE1CQiA9PSBTdWNjTUJCIG9yIE1CQiBzaW1wbHkKKy8vLyBmYWxsdGhvdWdocyB0byBTdWNjTUJCLgorc3RhdGljIGJvb2wgaXNTYW1lT3JGYWxsVGhyb3VnaEJCKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2NNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICp0aWlfKSB7CisgIGlmIChNQkIgPT0gU3VjY01CQikKKyAgICByZXR1cm4gdHJ1ZTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiA9IDAsICpGQkIgPSAwOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwgND4gQ29uZDsKKyAgcmV0dXJuICF0aWlfLT5BbmFseXplQnJhbmNoKCpNQkIsIFRCQiwgRkJCLCBDb25kKSAmJiAhVEJCICYmICFGQkIgJiYKKyAgICBNQkItPmlzU3VjY2Vzc29yKFN1Y2NNQkIpOworfQorCisvLy8gcmVtb3ZlUmFuZ2UgLSBXcmFwcGVyIGZvciBMaXZlSW50ZXJ2YWw6OnJlbW92ZVJhbmdlLiBUaGlzIHJlbW92ZXMgYSByYW5nZQorLy8vIGZyb20gYSBwaHlzaWNhbCByZWdpc3RlciBsaXZlIGludGVydmFsIGFzIHdlbGwgYXMgZnJvbSB0aGUgbGl2ZSBpbnRlcnZhbHMKKy8vLyBvZiBpdHMgc3ViLXJlZ2lzdGVycy4KK3N0YXRpYyB2b2lkIHJlbW92ZVJhbmdlKExpdmVJbnRlcnZhbCAmbGksCisgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggU3RhcnQsIFNsb3RJbmRleCBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWxzICpsaV8sIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqdHJpXykgeworICBsaS5yZW1vdmVSYW5nZShTdGFydCwgRW5kLCB0cnVlKTsKKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKGxpLnJlZykpIHsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkKiBTUiA9IHRyaV8tPmdldFN1YlJlZ2lzdGVycyhsaS5yZWcpOyAqU1I7ICsrU1IpIHsKKyAgICAgIGlmICghbGlfLT5oYXNJbnRlcnZhbCgqU1IpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIExpdmVJbnRlcnZhbCAmc2xpID0gbGlfLT5nZXRJbnRlcnZhbCgqU1IpOworICAgICAgU2xvdEluZGV4IFJlbW92ZVN0YXJ0ID0gU3RhcnQ7CisgICAgICBTbG90SW5kZXggUmVtb3ZlRW5kID0gU3RhcnQ7CisKKyAgICAgIHdoaWxlIChSZW1vdmVFbmQgIT0gRW5kKSB7CisgICAgICAgIExpdmVJbnRlcnZhbDo6aXRlcmF0b3IgTFIgPSBzbGkuRmluZExpdmVSYW5nZUNvbnRhaW5pbmcoUmVtb3ZlU3RhcnQpOworICAgICAgICBpZiAoTFIgPT0gc2xpLmVuZCgpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBSZW1vdmVFbmQgPSAoTFItPmVuZCA8IEVuZCkgPyBMUi0+ZW5kIDogRW5kOworICAgICAgICBzbGkucmVtb3ZlUmFuZ2UoUmVtb3ZlU3RhcnQsIFJlbW92ZUVuZCwgdHJ1ZSk7CisgICAgICAgIFJlbW92ZVN0YXJ0ID0gUmVtb3ZlRW5kOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gVHJpbUxpdmVJbnRlcnZhbFRvTGFzdFVzZSAtIElmIHRoZXJlIGlzIGEgbGFzdCB1c2UgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2sKKy8vLyBhcyB0aGUgY29weSBpbnN0cnVjdGlvbiwgdHJpbSB0aGUgbGl2ZSBpbnRlcnZhbCB0byB0aGUgbGFzdCB1c2UgYW5kIHJldHVybgorLy8vIHRydWUuCitib29sCitTaW1wbGVSZWdpc3RlckNvYWxlc2Npbmc6OlRyaW1MaXZlSW50ZXJ2YWxUb0xhc3RVc2UoU2xvdEluZGV4IENvcHlJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkNvcHlNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaXZlUmFuZ2UgKkxSKSB7CisgIFNsb3RJbmRleCBNQkJTdGFydCA9IGxpXy0+Z2V0TUJCU3RhcnRJZHgoQ29weU1CQik7CisgIFNsb3RJbmRleCBMYXN0VXNlSWR4OworICBNYWNoaW5lT3BlcmFuZCAqTGFzdFVzZSA9CisgICAgbGFzdFJlZ2lzdGVyVXNlKExSLT5zdGFydCwgQ29weUlkeC5nZXRQcmV2U2xvdCgpLCBsaS5yZWcsIExhc3RVc2VJZHgpOworICBpZiAoTGFzdFVzZSkgeworICAgIE1hY2hpbmVJbnN0ciAqTGFzdFVzZU1JID0gTGFzdFVzZS0+Z2V0UGFyZW50KCk7CisgICAgaWYgKCFpc1NhbWVPckZhbGxUaHJvdWdoQkIoTGFzdFVzZU1JLT5nZXRQYXJlbnQoKSwgQ29weU1CQiwgdGlpXykpIHsKKyAgICAgIC8vIHIxMDI0ID0gb3AKKyAgICAgIC8vIC4uLgorICAgICAgLy8gQkIxOgorICAgICAgLy8gICAgICAgPSByMTAyNAorICAgICAgLy8KKyAgICAgIC8vIEJCMjoKKyAgICAgIC8vIHIxMDI1PGRlYWQ+ID0gcjEwMjQ8a2lsbD4KKyAgICAgIGlmIChNQkJTdGFydCA8IExSLT5lbmQpCisgICAgICAgIHJlbW92ZVJhbmdlKGxpLCBNQkJTdGFydCwgTFItPmVuZCwgbGlfLCB0cmlfKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFRoZXJlIGFyZSB1c2VzIGJlZm9yZSB0aGUgY29weSwganVzdCBzaG9ydGVuIHRoZSBsaXZlIHJhbmdlIHRvIHRoZSBlbmQKKyAgICAvLyBvZiBsYXN0IHVzZS4KKyAgICBMYXN0VXNlLT5zZXRJc0tpbGwoKTsKKyAgICByZW1vdmVSYW5nZShsaSwgTGFzdFVzZUlkeC5nZXREZWZJbmRleCgpLCBMUi0+ZW5kLCBsaV8sIHRyaV8pOworICAgIGlmIChMYXN0VXNlTUktPmlzQ29weSgpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmRGVmTU8gPSBMYXN0VXNlTUktPmdldE9wZXJhbmQoMCk7CisgICAgICBpZiAoRGVmTU8uZ2V0UmVnKCkgPT0gbGkucmVnICYmICFEZWZNTy5nZXRTdWJSZWcoKSkKKyAgICAgICAgRGVmTU8uc2V0SXNEZWFkKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gSXMgaXQgbGl2ZWluPworICBpZiAoTFItPnN0YXJ0IDw9IE1CQlN0YXJ0ICYmIExSLT5lbmQgPiBNQkJTdGFydCkgeworICAgIGlmIChMUi0+c3RhcnQgPT0gbGlfLT5nZXRaZXJvSW5kZXgoKSkgeworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKGxpLnJlZykpOworICAgICAgLy8gTGl2ZS1pbiB0byB0aGUgZnVuY3Rpb24gYnV0IGRlYWQuIFJlbW92ZSBpdCBmcm9tIGVudHJ5IGxpdmUtaW4gc2V0LgorICAgICAgbWZfLT5iZWdpbigpLT5yZW1vdmVMaXZlSW4obGkucmVnKTsKKyAgICB9CisgICAgLy8gRklYTUU6IFNob3J0ZW4gaW50ZXJ2YWxzIGluIEJCcyB0aGF0IHJlYWNoZXMgdGhpcyBCQi4KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFJlTWF0ZXJpYWxpemVUcml2aWFsRGVmIC0gSWYgdGhlIHNvdXJjZSBvZiBhIGNvcHkgaXMgZGVmaW5lZCBieSBhIHRyaXZpYWwKKy8vLyBjb21wdXRhdGlvbiwgcmVwbGFjZSB0aGUgY29weSBieSByZW1hdGVyaWFsaXplIHRoZSBkZWZpbml0aW9uLgorYm9vbCBTaW1wbGVSZWdpc3RlckNvYWxlc2Npbmc6OlJlTWF0ZXJpYWxpemVUcml2aWFsRGVmKExpdmVJbnRlcnZhbCAmU3JjSW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEc3RTdWJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpDb3B5TUkpIHsKKyAgU2xvdEluZGV4IENvcHlJZHggPSBsaV8tPmdldEluc3RydWN0aW9uSW5kZXgoQ29weU1JKS5nZXRVc2VJbmRleCgpOworICBMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yIFNyY0xSID0gU3JjSW50LkZpbmRMaXZlUmFuZ2VDb250YWluaW5nKENvcHlJZHgpOworICBhc3NlcnQoU3JjTFIgIT0gU3JjSW50LmVuZCgpICYmICJMaXZlIHJhbmdlIG5vdCBmb3VuZCEiKTsKKyAgVk5JbmZvICpWYWxObyA9IFNyY0xSLT52YWxubzsKKyAgLy8gSWYgb3RoZXIgZGVmcyBjYW4gcmVhY2ggdXNlcyBvZiB0aGlzIGRlZiwgdGhlbiBpdCdzIG5vdCBzYWZlIHRvIHBlcmZvcm0KKyAgLy8gdGhlIG9wdGltaXphdGlvbi4gRklYTUU6IERvIGlzUEhJRGVmIGFuZCBpc0RlZkFjY3VyYXRlIGJvdGggbmVlZCB0byBiZQorICAvLyB0ZXN0ZWQ/CisgIGlmIChWYWxOby0+aXNQSElEZWYoKSB8fCAhVmFsTm8tPmlzRGVmQWNjdXJhdGUoKSB8fAorICAgICAgVmFsTm8tPmlzVW51c2VkKCkgfHwgVmFsTm8tPmhhc1BISUtpbGwoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBsaV8tPmdldEluc3RydWN0aW9uRnJvbUluZGV4KFZhbE5vLT5kZWYpOworICBhc3NlcnQoRGVmTUkgJiYgIkRlZmluaW5nIGluc3RydWN0aW9uIGRpc2FwcGVhcmVkIik7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gRGVmTUktPmdldERlc2MoKTsKKyAgaWYgKCFUSUQuaXNBc0NoZWFwQXNBTW92ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCF0aWlfLT5pc1RyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoRGVmTUksIEFBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGJvb2wgU2F3U3RvcmUgPSBmYWxzZTsKKyAgaWYgKCFEZWZNSS0+aXNTYWZlVG9Nb3ZlKHRpaV8sIEFBLCBTYXdTdG9yZSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoVElELmdldE51bURlZnMoKSAhPSAxKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFEZWZNSS0+aXNJbXBsaWNpdERlZigpKSB7CisgICAgLy8gTWFrZSBzdXJlIHRoZSBjb3B5IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGNsYXNzIGZpdHMgdGhlIGluc3RydWN0aW9uCisgICAgLy8gZGVmaW5pdGlvbiByZWdpc3RlciBjbGFzcy4gVGhlIG1pc21hdGNoIGNhbiBoYXBwZW4gYXMgYSByZXN1bHQgb2YgZWFybGllcgorICAgIC8vIGV4dHJhY3Rfc3VicmVnLCBpbnNlcnRfc3VicmVnLCBzdWJyZWdfdG9fcmVnIGNvYWxlc2NpbmcuCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBUSUQuT3BJbmZvWzBdLmdldFJlZ0NsYXNzKHRyaV8pOworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKERzdFJlZykpIHsKKyAgICAgIGlmIChtcmlfLT5nZXRSZWdDbGFzcyhEc3RSZWcpICE9IFJDKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmICghUkMtPmNvbnRhaW5zKERzdFJlZykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJZiBkZXN0aW5hdGlvbiByZWdpc3RlciBoYXMgYSBzdWItcmVnaXN0ZXIgaW5kZXggb24gaXQsIG1ha2Ugc3VyZSBpdCBtdGNoZXMKKyAgLy8gdGhlIGluc3RydWN0aW9uIHJlZ2lzdGVyIGNsYXNzLgorICBpZiAoRHN0U3ViSWR4KSB7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBEZWZNSS0+Z2V0RGVzYygpOworICAgIGlmIChUSUQuZ2V0TnVtRGVmcygpICE9IDEpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqRHN0UkMgPSBtcmlfLT5nZXRSZWdDbGFzcyhEc3RSZWcpOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkRzdFN1YlJDID0KKyAgICAgIERzdFJDLT5nZXRTdWJSZWdpc3RlclJlZ0NsYXNzKERzdFN1YklkeCk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqRGVmUkMgPSBUSUQuT3BJbmZvWzBdLmdldFJlZ0NsYXNzKHRyaV8pOworICAgIGlmIChEZWZSQyA9PSBEc3RSQykKKyAgICAgIERzdFN1YklkeCA9IDA7CisgICAgZWxzZSBpZiAoRGVmUkMgIT0gRHN0U3ViUkMpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBSZW1vdmVDb3B5RmxhZyhEc3RSZWcsIENvcHlNSSk7CisKKyAgLy8gSWYgY29weSBraWxscyB0aGUgc291cmNlIHJlZ2lzdGVyLCBmaW5kIHRoZSBsYXN0IHVzZSBhbmQgcHJvcGFnYXRlCisgIC8vIGtpbGwuCisgIGJvb2wgY2hlY2tGb3JEZWFkRGVmID0gZmFsc2U7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBDb3B5TUktPmdldFBhcmVudCgpOworICBpZiAoU3JjTFItPmVuZCA9PSBDb3B5SWR4LmdldERlZkluZGV4KCkpCisgICAgaWYgKCFUcmltTGl2ZUludGVydmFsVG9MYXN0VXNlKENvcHlJZHgsIE1CQiwgU3JjSW50LCBTcmNMUikpIHsKKyAgICAgIGNoZWNrRm9yRGVhZERlZiA9IHRydWU7CisgICAgfQorCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSUkgPQorICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKENvcHlNSSkpOworICB0aWlfLT5yZU1hdGVyaWFsaXplKCpNQkIsIE1JSSwgRHN0UmVnLCBEc3RTdWJJZHgsIERlZk1JLCAqdHJpXyk7CisgIE1hY2hpbmVJbnN0ciAqTmV3TUkgPSBwcmlvcihNSUkpOworCisgIGlmIChjaGVja0ZvckRlYWREZWYpIHsKKyAgICAvLyBQUjQwOTAgZml4OiBUcmltIGludGVydmFsIGZhaWxlZCBiZWNhdXNlIHRoZXJlIHdhcyBubyB1c2Ugb2YgdGhlCisgICAgLy8gc291cmNlIGludGVydmFsIGluIHRoaXMgTUJCLiBJZiB0aGUgZGVmIGlzIGluIHRoaXMgTUJCIHRvbyB0aGVuIHdlCisgICAgLy8gc2hvdWxkIG1hcmsgaXQgZGVhZDoKKyAgICBpZiAoRGVmTUktPmdldFBhcmVudCgpID09IE1CQikgeworICAgICAgRGVmTUktPmFkZFJlZ2lzdGVyRGVhZChTcmNJbnQucmVnLCB0cmlfKTsKKyAgICAgIFNyY0xSLT5lbmQgPSBTcmNMUi0+c3RhcnQuZ2V0TmV4dFNsb3QoKTsKKyAgICB9CisgIH0KKworICAvLyBDb3B5TUkgbWF5IGhhdmUgaW1wbGljaXQgb3BlcmFuZHMsIHRyYW5zZmVyIHRoZW0gb3ZlciB0byB0aGUgbmV3bHkKKyAgLy8gcmVtYXRlcmlhbGl6ZWQgaW5zdHJ1Y3Rpb24uIEFuZCB1cGRhdGUgaW1wbGljaXQgZGVmIGludGVydmFsIHZhbG5vcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gQ29weU1JLT5nZXREZXNjKCkuZ2V0TnVtT3BlcmFuZHMoKSwKKyAgICAgICAgIGUgPSBDb3B5TUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gQ29weU1JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmlzSW1wbGljaXQoKSkKKyAgICAgIE5ld01JLT5hZGRPcGVyYW5kKE1PKTsKKyAgICBpZiAoTU8uaXNEZWYoKSkKKyAgICAgIFJlbW92ZUNvcHlGbGFnKE1PLmdldFJlZygpLCBDb3B5TUkpOworICB9CisKKyAgVHJhbnNmZXJJbXBsaWNpdE9wcyhDb3B5TUksIE5ld01JKTsKKyAgbGlfLT5SZXBsYWNlTWFjaGluZUluc3RySW5NYXBzKENvcHlNSSwgTmV3TUkpOworICBDb3B5TUktPmVyYXNlRnJvbVBhcmVudCgpOworICBSZU1hdENvcGllcy5pbnNlcnQoQ29weU1JKTsKKyAgUmVNYXREZWZzLmluc2VydChEZWZNSSk7CisgIERFQlVHKGRiZ3MoKSA8PCAiUmVtYXQ6ICIgPDwgKk5ld01JKTsKKyAgKytOdW1SZU1hdHM7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gVXBkYXRlUmVnRGVmc1VzZXMgLSBSZXBsYWNlIGFsbCBkZWZzIGFuZCB1c2VzIG9mIFNyY1JlZyB0byBEc3RSZWcgYW5kCisvLy8gdXBkYXRlIHRoZSBzdWJyZWdpc3RlciBudW1iZXIgaWYgaXQgaXMgbm90IHplcm8uIElmIERzdFJlZyBpcyBhCisvLy8gcGh5c2ljYWwgcmVnaXN0ZXIgYW5kIHRoZSBleGlzdGluZyBzdWJyZWdpc3RlciBudW1iZXIgb2YgdGhlIGRlZiAvIHVzZQorLy8vIGJlaW5nIHVwZGF0ZWQgaXMgbm90IHplcm8sIG1ha2Ugc3VyZSB0byBzZXQgaXQgdG8gdGhlIGNvcnJlY3QgcGh5c2ljYWwKKy8vLyBzdWJyZWdpc3Rlci4KK3ZvaWQKK1NpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZzo6VXBkYXRlUmVnRGVmc1VzZXMoY29uc3QgQ29hbGVzY2VyUGFpciAmQ1ApIHsKKyAgYm9vbCBEc3RJc1BoeXMgPSBDUC5pc1BoeXMoKTsKKyAgdW5zaWduZWQgU3JjUmVnID0gQ1AuZ2V0U3JjUmVnKCk7CisgIHVuc2lnbmVkIERzdFJlZyA9IENQLmdldERzdFJlZygpOworICB1bnNpZ25lZCBTdWJJZHggPSBDUC5nZXRTdWJJZHgoKTsKKworICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnJlZ19pdGVyYXRvciBJID0gbXJpXy0+cmVnX2JlZ2luKFNyY1JlZyk7CisgICAgICAgTWFjaGluZUluc3RyICpVc2VNSSA9IEkuc2tpcEluc3RydWN0aW9uKCk7KSB7CisgICAgLy8gQSBQaHlzUmVnIGNvcHkgdGhhdCB3b24ndCBiZSBjb2FsZXNjZWQgY2FuIHBlcmhhcHMgYmUgcmVtYXRlcmlhbGl6ZWQKKyAgICAvLyBpbnN0ZWFkLgorICAgIGlmIChEc3RJc1BoeXMpIHsKKyAgICAgIGlmIChVc2VNSS0+aXNDb3B5KCkgJiYKKyAgICAgICAgICAhVXNlTUktPmdldE9wZXJhbmQoMSkuZ2V0U3ViUmVnKCkgJiYKKyAgICAgICAgICAhVXNlTUktPmdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCkgJiYKKyAgICAgICAgICBVc2VNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSA9PSBTcmNSZWcgJiYKKyAgICAgICAgICBVc2VNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSAhPSBTcmNSZWcgJiYKKyAgICAgICAgICBVc2VNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSAhPSBEc3RSZWcgJiYKKyAgICAgICAgICAhSm9pbmVkQ29waWVzLmNvdW50KFVzZU1JKSAmJgorICAgICAgICAgIFJlTWF0ZXJpYWxpemVUcml2aWFsRGVmKGxpXy0+Z2V0SW50ZXJ2YWwoU3JjUmVnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSwgMCwgVXNlTUkpKQorICAgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCw4PiBPcHM7CisgICAgYm9vbCBSZWFkcywgV3JpdGVzOworICAgIHRpZShSZWFkcywgV3JpdGVzKSA9IFVzZU1JLT5yZWFkc1dyaXRlc1ZpcnR1YWxSZWdpc3RlcihTcmNSZWcsICZPcHMpOworICAgIGJvb2wgS2lsbHMgPSBmYWxzZSwgRGVhZHMgPSBmYWxzZTsKKworICAgIC8vIFJlcGxhY2UgU3JjUmVnIHdpdGggRHN0UmVnIGluIGFsbCBVc2VNSSBvcGVyYW5kcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IFVzZU1JLT5nZXRPcGVyYW5kKE9wc1tpXSk7CisgICAgICBLaWxscyB8PSBNTy5pc0tpbGwoKTsKKyAgICAgIERlYWRzIHw9IE1PLmlzRGVhZCgpOworCisgICAgICBpZiAoRHN0SXNQaHlzKQorICAgICAgICBNTy5zdWJzdFBoeXNSZWcoRHN0UmVnLCAqdHJpXyk7CisgICAgICBlbHNlCisgICAgICAgIE1PLnN1YnN0VmlydFJlZyhEc3RSZWcsIFN1YklkeCwgKnRyaV8pOworICAgIH0KKworICAgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBjb3B5IHRoYXQgd2lsbCBiZSByZW1vdmVkLgorICAgIGlmIChKb2luZWRDb3BpZXMuY291bnQoVXNlTUkpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoU3ViSWR4KSB7CisgICAgICAvLyBJZiBVc2VNSSB3YXMgYSBzaW1wbGUgU3JjUmVnIGRlZiwgbWFrZSBzdXJlIHdlIGRpZG4ndCB0dXJuIGl0IGludG8gYQorICAgICAgLy8gcmVhZC1tb2RpZnktd3JpdGUgb2YgRHN0UmVnLgorICAgICAgaWYgKERlYWRzKQorICAgICAgICBVc2VNSS0+YWRkUmVnaXN0ZXJEZWFkKERzdFJlZywgdHJpXyk7CisgICAgICBlbHNlIGlmICghUmVhZHMgJiYgV3JpdGVzKQorICAgICAgICBVc2VNSS0+YWRkUmVnaXN0ZXJEZWZpbmVkKERzdFJlZywgdHJpXyk7CisKKyAgICAgIC8vIEtpbGwgZmxhZ3MgYXBwbHkgdG8gdGhlIHdob2xlIHBoeXNpY2FsIHJlZ2lzdGVyLgorICAgICAgaWYgKERzdElzUGh5cyAmJiBLaWxscykKKyAgICAgICAgVXNlTUktPmFkZFJlZ2lzdGVyS2lsbGVkKERzdFJlZywgdHJpXyk7CisgICAgfQorCisgICAgREVCVUcoeworICAgICAgICBkYmdzKCkgPDwgIlx0XHR1cGRhdGVkOiAiOworICAgICAgICBpZiAoIVVzZU1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICAgICBkYmdzKCkgPDwgbGlfLT5nZXRJbnN0cnVjdGlvbkluZGV4KFVzZU1JKSA8PCAiXHQiOworICAgICAgICBkYmdzKCkgPDwgKlVzZU1JOworICAgICAgfSk7CisgIH0KK30KKworLy8vIHJlbW92ZUludGVydmFsSWZFbXB0eSAtIENoZWNrIGlmIHRoZSBsaXZlIGludGVydmFsIG9mIGEgcGh5c2ljYWwgcmVnaXN0ZXIKKy8vLyBpcyBlbXB0eSwgaWYgc28gcmVtb3ZlIGl0IGFuZCBhbHNvIHJlbW92ZSB0aGUgZW1wdHkgaW50ZXJ2YWxzIG9mIGl0cworLy8vIHN1Yi1yZWdpc3RlcnMuIFJldHVybiB0cnVlIGlmIGxpdmUgaW50ZXJ2YWwgaXMgcmVtb3ZlZC4KK3N0YXRpYyBib29sIHJlbW92ZUludGVydmFsSWZFbXB0eShMaXZlSW50ZXJ2YWwgJmxpLCBMaXZlSW50ZXJ2YWxzICpsaV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICp0cmlfKSB7CisgIGlmIChsaS5lbXB0eSgpKSB7CisgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKGxpLnJlZykpCisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkKiBTUiA9IHRyaV8tPmdldFN1YlJlZ2lzdGVycyhsaS5yZWcpOyAqU1I7ICsrU1IpIHsKKyAgICAgICAgaWYgKCFsaV8tPmhhc0ludGVydmFsKCpTUikpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIExpdmVJbnRlcnZhbCAmc2xpID0gbGlfLT5nZXRJbnRlcnZhbCgqU1IpOworICAgICAgICBpZiAoc2xpLmVtcHR5KCkpCisgICAgICAgICAgbGlfLT5yZW1vdmVJbnRlcnZhbCgqU1IpOworICAgICAgfQorICAgIGxpXy0+cmVtb3ZlSW50ZXJ2YWwobGkucmVnKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBTaG9ydGVuRGVhZENvcHlMaXZlUmFuZ2UgLSBTaG9ydGVuIGEgbGl2ZSByYW5nZSBkZWZpbmVkIGJ5IGEgZGVhZCBjb3B5LgorLy8vIFJldHVybiB0cnVlIGlmIGxpdmUgaW50ZXJ2YWwgaXMgcmVtb3ZlZC4KK2Jvb2wgU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nOjpTaG9ydGVuRGVhZENvcHlMaXZlUmFuZ2UoTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpDb3B5TUkpIHsKKyAgU2xvdEluZGV4IENvcHlJZHggPSBsaV8tPmdldEluc3RydWN0aW9uSW5kZXgoQ29weU1JKTsKKyAgTGl2ZUludGVydmFsOjppdGVyYXRvciBNTFIgPQorICAgIGxpLkZpbmRMaXZlUmFuZ2VDb250YWluaW5nKENvcHlJZHguZ2V0RGVmSW5kZXgoKSk7CisgIGlmIChNTFIgPT0gbGkuZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOyAgLy8gQWxyZWFkeSByZW1vdmVkIGJ5IFNob3J0ZW5EZWFkQ29weVNyY0xpdmVSYW5nZS4KKyAgU2xvdEluZGV4IFJlbW92ZVN0YXJ0ID0gTUxSLT5zdGFydDsKKyAgU2xvdEluZGV4IFJlbW92ZUVuZCA9IE1MUi0+ZW5kOworICBTbG90SW5kZXggRGVmSWR4ID0gQ29weUlkeC5nZXREZWZJbmRleCgpOworICAvLyBSZW1vdmUgdGhlIGxpdmVyYW5nZSB0aGF0J3MgZGVmaW5lZCBieSB0aGlzLgorICBpZiAoUmVtb3ZlU3RhcnQgPT0gRGVmSWR4ICYmIFJlbW92ZUVuZCA9PSBEZWZJZHguZ2V0U3RvcmVJbmRleCgpKSB7CisgICAgcmVtb3ZlUmFuZ2UobGksIFJlbW92ZVN0YXJ0LCBSZW1vdmVFbmQsIGxpXywgdHJpXyk7CisgICAgcmV0dXJuIHJlbW92ZUludGVydmFsSWZFbXB0eShsaSwgbGlfLCB0cmlfKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBSZW1vdmVEZWFkRGVmIC0gSWYgYSBkZWYgb2YgYSBsaXZlIGludGVydmFsIGlzIG5vdyBkZXRlcm1pbmVkIGRlYWQsIHJlbW92ZQorLy8vIHRoZSB2YWwjIGl0IGRlZmluZXMuIElmIHRoZSBsaXZlIGludGVydmFsIGJlY29tZXMgZW1wdHksIHJlbW92ZSBpdCBhcyB3ZWxsLgorYm9vbCBTaW1wbGVSZWdpc3RlckNvYWxlc2Npbmc6OlJlbW92ZURlYWREZWYoTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqRGVmTUkpIHsKKyAgU2xvdEluZGV4IERlZklkeCA9IGxpXy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleChEZWZNSSkuZ2V0RGVmSW5kZXgoKTsKKyAgTGl2ZUludGVydmFsOjppdGVyYXRvciBNTFIgPSBsaS5GaW5kTGl2ZVJhbmdlQ29udGFpbmluZyhEZWZJZHgpOworICBpZiAoRGVmSWR4ICE9IE1MUi0+dmFsbm8tPmRlZikKKyAgICByZXR1cm4gZmFsc2U7CisgIGxpLnJlbW92ZVZhbE5vKE1MUi0+dmFsbm8pOworICByZXR1cm4gcmVtb3ZlSW50ZXJ2YWxJZkVtcHR5KGxpLCBsaV8sIHRyaV8pOworfQorCit2b2lkIFNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZzo6UmVtb3ZlQ29weUZsYWcodW5zaWduZWQgRHN0UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAqQ29weU1JKSB7CisgIFNsb3RJbmRleCBEZWZJZHggPSBsaV8tPmdldEluc3RydWN0aW9uSW5kZXgoQ29weU1JKS5nZXREZWZJbmRleCgpOworICBpZiAobGlfLT5oYXNJbnRlcnZhbChEc3RSZWcpKSB7CisgICAgTGl2ZUludGVydmFsICZMSSA9IGxpXy0+Z2V0SW50ZXJ2YWwoRHN0UmVnKTsKKyAgICBpZiAoY29uc3QgTGl2ZVJhbmdlICpMUiA9IExJLmdldExpdmVSYW5nZUNvbnRhaW5pbmcoRGVmSWR4KSkKKyAgICAgIGlmIChMUi0+dmFsbm8tPmdldENvcHkoKSA9PSBDb3B5TUkpCisgICAgICAgIExSLT52YWxuby0+c2V0Q29weSgwKTsKKyAgfQorICBpZiAoIVRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKERzdFJlZykpCisgICAgcmV0dXJuOworICBmb3IgKGNvbnN0IHVuc2lnbmVkKiBBUyA9IHRyaV8tPmdldEFsaWFzU2V0KERzdFJlZyk7ICpBUzsgKytBUykgeworICAgIGlmICghbGlfLT5oYXNJbnRlcnZhbCgqQVMpKQorICAgICAgY29udGludWU7CisgICAgTGl2ZUludGVydmFsICZMSSA9IGxpXy0+Z2V0SW50ZXJ2YWwoKkFTKTsKKyAgICBpZiAoY29uc3QgTGl2ZVJhbmdlICpMUiA9IExJLmdldExpdmVSYW5nZUNvbnRhaW5pbmcoRGVmSWR4KSkKKyAgICAgIGlmIChMUi0+dmFsbm8tPmdldENvcHkoKSA9PSBDb3B5TUkpCisgICAgICAgIExSLT52YWxuby0+c2V0Q29weSgwKTsKKyAgfQorfQorCisvLy8gUHJvcGFnYXRlRGVhZG5lc3MgLSBQcm9wYWdhdGUgdGhlIGRlYWQgbWFya2VyIHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaAorLy8vIGRlZmluZXMgdGhlIHZhbCMuCitzdGF0aWMgdm9pZCBQcm9wYWdhdGVEZWFkbmVzcyhMaXZlSW50ZXJ2YWwgJmxpLCBNYWNoaW5lSW5zdHIgKkNvcHlNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RJbmRleCAmTFJTdGFydCwgTGl2ZUludGVydmFscyAqbGlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvKiB0cmlfKSB7CisgIE1hY2hpbmVJbnN0ciAqRGVmTUkgPQorICAgIGxpXy0+Z2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoTFJTdGFydC5nZXREZWZJbmRleCgpKTsKKyAgaWYgKERlZk1JICYmIERlZk1JICE9IENvcHlNSSkgeworICAgIGludCBEZWFkSWR4ID0gRGVmTUktPmZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgobGkucmVnKTsKKyAgICBpZiAoRGVhZElkeCAhPSAtMSkKKyAgICAgIERlZk1JLT5nZXRPcGVyYW5kKERlYWRJZHgpLnNldElzRGVhZCgpOworICAgIGVsc2UKKyAgICAgIERlZk1JLT5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWcobGkucmVnLAorICAgICAgICAgICAgICAgICAgIC8qZGVmKi90cnVlLCAvKmltcGxpY2l0Ki90cnVlLCAvKmtpbGwqL2ZhbHNlLCAvKmRlYWQqL3RydWUpKTsKKyAgICBMUlN0YXJ0ID0gTFJTdGFydC5nZXROZXh0U2xvdCgpOworICB9Cit9CisKKy8vLyBTaG9ydGVuRGVhZENvcHlTcmNMaXZlUmFuZ2UgLSBTaG9ydGVuIGEgbGl2ZSByYW5nZSBhcyBpdCdzIGFydGlmaWNpYWxseQorLy8vIGV4dGVuZGVkIGJ5IGEgZGVhZCBjb3B5LiBNYXJrIHRoZSBsYXN0IHVzZSAoaWYgYW55KSBvZiB0aGUgdmFsIyBhcyBraWxsIGFzCisvLy8gZW5kcyB0aGUgbGl2ZSByYW5nZSB0aGVyZS4gSWYgdGhlcmUgaXNuJ3QgYW5vdGhlciB1c2UsIHRoZW4gdGhpcyBsaXZlIHJhbmdlCisvLy8gaXMgZGVhZC4gUmV0dXJuIHRydWUgaWYgbGl2ZSBpbnRlcnZhbCBpcyByZW1vdmVkLgorYm9vbAorU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nOjpTaG9ydGVuRGVhZENvcHlTcmNMaXZlUmFuZ2UoTGl2ZUludGVydmFsICZsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqQ29weU1JKSB7CisgIFNsb3RJbmRleCBDb3B5SWR4ID0gbGlfLT5nZXRJbnN0cnVjdGlvbkluZGV4KENvcHlNSSk7CisgIGlmIChDb3B5SWR4ID09IFNsb3RJbmRleCgpKSB7CisgICAgLy8gRklYTUU6IHNwZWNpYWwgY2FzZTogZnVuY3Rpb24gbGl2ZSBpbi4gSXQgY2FuIGJlIGEgZ2VuZXJhbCBjYXNlIGlmIHRoZQorICAgIC8vIGZpcnN0IGluc3RydWN0aW9uIGluZGV4IHN0YXJ0cyBhdCA+IDAgdmFsdWUuCisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKGxpLnJlZykpOworICAgIC8vIExpdmUtaW4gdG8gdGhlIGZ1bmN0aW9uIGJ1dCBkZWFkLiBSZW1vdmUgaXQgZnJvbSBlbnRyeSBsaXZlLWluIHNldC4KKyAgICBpZiAobWZfLT5iZWdpbigpLT5pc0xpdmVJbihsaS5yZWcpKQorICAgICAgbWZfLT5iZWdpbigpLT5yZW1vdmVMaXZlSW4obGkucmVnKTsKKyAgICBpZiAoY29uc3QgTGl2ZVJhbmdlICpMUiA9IGxpLmdldExpdmVSYW5nZUNvbnRhaW5pbmcoQ29weUlkeCkpCisgICAgICByZW1vdmVSYW5nZShsaSwgTFItPnN0YXJ0LCBMUi0+ZW5kLCBsaV8sIHRyaV8pOworICAgIHJldHVybiByZW1vdmVJbnRlcnZhbElmRW1wdHkobGksIGxpXywgdHJpXyk7CisgIH0KKworICBMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yIExSID0KKyAgICBsaS5GaW5kTGl2ZVJhbmdlQ29udGFpbmluZyhDb3B5SWR4LmdldFByZXZJbmRleCgpLmdldFN0b3JlSW5kZXgoKSk7CisgIGlmIChMUiA9PSBsaS5lbmQoKSkKKyAgICAvLyBMaXZlaW4gYnV0IGRlZmluZWQgYnkgYSBwaGkuCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNsb3RJbmRleCBSZW1vdmVTdGFydCA9IExSLT5zdGFydDsKKyAgU2xvdEluZGV4IFJlbW92ZUVuZCA9IENvcHlJZHguZ2V0U3RvcmVJbmRleCgpOworICBpZiAoTFItPmVuZCA+IFJlbW92ZUVuZCkKKyAgICAvLyBNb3JlIHVzZXMgcGFzdCB0aGlzIGNvcHk/IE5vdGhpbmcgdG8gZG8uCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHRoZXJlIGlzIGEgbGFzdCB1c2UgaW4gdGhlIHNhbWUgYmIsIHdlIGNhbid0IHJlbW92ZSB0aGUgbGl2ZSByYW5nZS4KKyAgLy8gU2hvcnRlbiB0aGUgbGl2ZSBpbnRlcnZhbCBhbmQgcmV0dXJuLgorICBNYWNoaW5lQmFzaWNCbG9jayAqQ29weU1CQiA9IENvcHlNSS0+Z2V0UGFyZW50KCk7CisgIGlmIChUcmltTGl2ZUludGVydmFsVG9MYXN0VXNlKENvcHlJZHgsIENvcHlNQkIsIGxpLCBMUikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFRoZXJlIGFyZSBvdGhlciBraWxscyBvZiB0aGUgdmFsIy4gTm90aGluZyB0byBkby4KKyAgaWYgKCFsaS5pc09ubHlMUk9mVmFsTm8oTFIpKQorICAgIHJldHVybiBmYWxzZTsKKworICBNYWNoaW5lQmFzaWNCbG9jayAqU3RhcnRNQkIgPSBsaV8tPmdldE1CQkZyb21JbmRleChSZW1vdmVTdGFydCk7CisgIGlmICghaXNTYW1lT3JGYWxsVGhyb3VnaEJCKFN0YXJ0TUJCLCBDb3B5TUJCLCB0aWlfKSkKKyAgICAvLyBJZiB0aGUgbGl2ZSByYW5nZSBzdGFydHMgaW4gYW5vdGhlciBtYmIgYW5kIHRoZSBjb3B5IG1iYiBpcyBub3QgYSBmYWxsCisgICAgLy8gdGhyb3VnaCBtYmIsIHRoZW4gd2UgY2FuIG9ubHkgY3V0IHRoZSByYW5nZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgLy8gY29weSBtYmIuCisgICAgUmVtb3ZlU3RhcnQgPSBsaV8tPmdldE1CQlN0YXJ0SWR4KENvcHlNQkIpLmdldE5leHRJbmRleCgpLmdldEJhc2VJbmRleCgpOworCisgIGlmIChMUi0+dmFsbm8tPmRlZiA9PSBSZW1vdmVTdGFydCkgeworICAgIC8vIElmIHRoZSBkZWYgTUkgZGVmaW5lcyB0aGUgdmFsIyBhbmQgdGhpcyBjb3B5IGlzIHRoZSBvbmx5IGtpbGwgb2YgdGhlCisgICAgLy8gdmFsIywgdGhlbiBwcm9wYWdhdGUgdGhlIGRlYWQgbWFya2VyLgorICAgIFByb3BhZ2F0ZURlYWRuZXNzKGxpLCBDb3B5TUksIFJlbW92ZVN0YXJ0LCBsaV8sIHRyaV8pOworICAgICsrbnVtRGVhZFZhbE5vOworICB9CisKKyAgcmVtb3ZlUmFuZ2UobGksIFJlbW92ZVN0YXJ0LCBSZW1vdmVFbmQsIGxpXywgdHJpXyk7CisgIHJldHVybiByZW1vdmVJbnRlcnZhbElmRW1wdHkobGksIGxpXywgdHJpXyk7Cit9CisKKworLy8vIGlzV2luVG9Kb2luQ3Jvc3NDbGFzcyAtIFJldHVybiB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byBjb2FsZXNjZQorLy8vIHR3byB2aXJ0dWFsIHJlZ2lzdGVycyBmcm9tIGRpZmZlcmVudCByZWdpc3RlciBjbGFzc2VzLgorYm9vbAorU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nOjppc1dpblRvSm9pbkNyb3NzQ2xhc3ModW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRHN0UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqU3JjUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpEc3RSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKk5ld1JDKSB7CisgIHVuc2lnbmVkIE5ld1JDQ291bnQgPSBhbGxvY2F0YWJsZVJDUmVnc19bTmV3UkNdLmNvdW50KCk7CisgIC8vIFRoaXMgaGV1cmlzdGljcyBpcyBnb29kIGVub3VnaCBpbiBwcmFjdGljZSwgYnV0IGl0J3Mgb2J2aW91c2x5IG5vdCAqcmlnaHQqLgorICAvLyA0IGlzIGEgbWFnaWMgbnVtYmVyIHRoYXQgd29ya3Mgd2VsbCBlbm91Z2ggZm9yIHg4NiwgQVJNLCBldGMuIEl0IGZpbHRlcgorICAvLyBvdXQgYWxsIGJ1dCB0aGUgbW9zdCByZXN0cmljdGl2ZSByZWdpc3RlciBjbGFzc2VzLgorICBpZiAoTmV3UkNDb3VudCA+IDQgfHwKKyAgICAgIC8vIEVhcmx5IGV4aXQgaWYgdGhlIGZ1bmN0aW9uIGlzIGZhaXJseSBzbWFsbCwgY29hbGVzY2UgYWdncmVzc2l2ZWx5IGlmCisgICAgICAvLyB0aGF0J3MgdGhlIGNhc2UuIEZvciByZWFsbHkgc3BlY2lhbCByZWdpc3RlciBjbGFzc2VzIHdpdGggMyBvcgorICAgICAgLy8gZmV3ZXIgcmVnaXN0ZXJzLCBiZSBhIGJpdCBtb3JlIGNhcmVmdWwuCisgICAgICAobGlfLT5nZXRGdW5jSW5zdHJ1Y3Rpb25Db3VudCgpIC8gTmV3UkNDb3VudCkgPCA4KQorICAgIHJldHVybiB0cnVlOworICBMaXZlSW50ZXJ2YWwgJlNyY0ludCA9IGxpXy0+Z2V0SW50ZXJ2YWwoU3JjUmVnKTsKKyAgTGl2ZUludGVydmFsICZEc3RJbnQgPSBsaV8tPmdldEludGVydmFsKERzdFJlZyk7CisgIHVuc2lnbmVkIFNyY1NpemUgPSBsaV8tPmdldEFwcHJveGltYXRlSW5zdHJ1Y3Rpb25Db3VudChTcmNJbnQpOworICB1bnNpZ25lZCBEc3RTaXplID0gbGlfLT5nZXRBcHByb3hpbWF0ZUluc3RydWN0aW9uQ291bnQoRHN0SW50KTsKKyAgaWYgKFNyY1NpemUgPD0gTmV3UkNDb3VudCAmJiBEc3RTaXplIDw9IE5ld1JDQ291bnQpCisgICAgcmV0dXJuIHRydWU7CisgIC8vIEVzdGltYXRlICpyZWdpc3RlciB1c2UgZGVuc2l0eSouIElmIGl0IGRvdWJsZXMgb3IgbW9yZSwgYWJvcnQuCisgIHVuc2lnbmVkIFNyY1VzZXMgPSBzdGQ6OmRpc3RhbmNlKG1yaV8tPnVzZV9ub2RiZ19iZWdpbihTcmNSZWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcmlfLT51c2Vfbm9kYmdfZW5kKCkpOworICB1bnNpZ25lZCBEc3RVc2VzID0gc3RkOjpkaXN0YW5jZShtcmlfLT51c2Vfbm9kYmdfYmVnaW4oRHN0UmVnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJpXy0+dXNlX25vZGJnX2VuZCgpKTsKKyAgdW5zaWduZWQgTmV3VXNlcyA9IFNyY1VzZXMgKyBEc3RVc2VzOworICB1bnNpZ25lZCBOZXdTaXplID0gU3JjU2l6ZSArIERzdFNpemU7CisgIGlmIChTcmNSQyAhPSBOZXdSQyAmJiBTcmNTaXplID4gTmV3UkNDb3VudCkgeworICAgIHVuc2lnbmVkIFNyY1JDQ291bnQgPSBhbGxvY2F0YWJsZVJDUmVnc19bU3JjUkNdLmNvdW50KCk7CisgICAgaWYgKE5ld1VzZXMqU3JjU2l6ZSpTcmNSQ0NvdW50ID4gMipTcmNVc2VzKk5ld1NpemUqTmV3UkNDb3VudCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoRHN0UkMgIT0gTmV3UkMgJiYgRHN0U2l6ZSA+IE5ld1JDQ291bnQpIHsKKyAgICB1bnNpZ25lZCBEc3RSQ0NvdW50ID0gYWxsb2NhdGFibGVSQ1JlZ3NfW0RzdFJDXS5jb3VudCgpOworICAgIGlmIChOZXdVc2VzKkRzdFNpemUqRHN0UkNDb3VudCA+IDIqRHN0VXNlcypOZXdTaXplKk5ld1JDQ291bnQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vIEpvaW5Db3B5IC0gQXR0ZW1wdCB0byBqb2luIGludGVydmFscyBjb3JyZXNwb25kaW5nIHRvIFNyY1JlZy9Ec3RSZWcsCisvLy8gd2hpY2ggYXJlIHRoZSBzcmMvZHN0IG9mIHRoZSBjb3B5IGluc3RydWN0aW9uIENvcHlNSS4gIFRoaXMgcmV0dXJucyB0cnVlCisvLy8gaWYgdGhlIGNvcHkgd2FzIHN1Y2Nlc3NmdWxseSBjb2FsZXNjZWQgYXdheS4gSWYgaXQgaXMgbm90IGN1cnJlbnRseQorLy8vIHBvc3NpYmxlIHRvIGNvYWxlc2NlIHRoaXMgaW50ZXJ2YWwsIGJ1dCBpdCBtYXkgYmUgcG9zc2libGUgaWYgb3RoZXIKKy8vLyB0aGluZ3MgZ2V0IGNvYWxlc2NlZCwgdGhlbiBpdCByZXR1cm5zIHRydWUgYnkgcmVmZXJlbmNlIGluICdBZ2FpbicuCitib29sIFNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZzo6Sm9pbkNvcHkoQ29weVJlYyAmVGhlQ29weSwgYm9vbCAmQWdhaW4pIHsKKyAgTWFjaGluZUluc3RyICpDb3B5TUkgPSBUaGVDb3B5Lk1JOworCisgIEFnYWluID0gZmFsc2U7CisgIGlmIChKb2luZWRDb3BpZXMuY291bnQoQ29weU1JKSB8fCBSZU1hdENvcGllcy5jb3VudChDb3B5TUkpKQorICAgIHJldHVybiBmYWxzZTsgLy8gQWxyZWFkeSBkb25lLgorCisgIERFQlVHKGRiZ3MoKSA8PCBsaV8tPmdldEluc3RydWN0aW9uSW5kZXgoQ29weU1JKSA8PCAnXHQnIDw8ICpDb3B5TUkpOworCisgIENvYWxlc2NlclBhaXIgQ1AoKnRpaV8sICp0cmlfKTsKKyAgaWYgKCFDUC5zZXRSZWdpc3RlcnMoQ29weU1JKSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHROb3QgY29hbGVzY2FibGUuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJZiB0aGV5IGFyZSBhbHJlYWR5IGpvaW5lZCB3ZSBjb250aW51ZS4KKyAgaWYgKENQLmdldFNyY1JlZygpID09IENQLmdldERzdFJlZygpKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJcdENvcHkgYWxyZWFkeSBjb2FsZXNjZWQuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBOb3QgY29hbGVzY2FibGUuCisgIH0KKworICBERUJVRyhkYmdzKCkgPDwgIlx0Q29uc2lkZXJpbmcgbWVyZ2luZyAlcmVnIiA8PCBDUC5nZXRTcmNSZWcoKSk7CisKKyAgLy8gRW5mb3JjZSBwb2xpY2llcy4KKyAgaWYgKENQLmlzUGh5cygpKSB7CisgICAgREVCVUcoZGJncygpIDw8IiB3aXRoIHBoeXNyZWcgJSIgPDwgdHJpXy0+Z2V0TmFtZShDUC5nZXREc3RSZWcoKSkgPDwgIlxuIik7CisgICAgLy8gT25seSBjb2FsZXNjZSB0byBhbGxvY2F0YWJsZSBwaHlzcmVnLgorICAgIGlmICghbGlfLT5pc0FsbG9jYXRhYmxlKENQLmdldERzdFJlZygpKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJcdFJlZ2lzdGVyIGlzIGFuIHVuYWxsb2NhdGFibGUgcGh5c3JlZy5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gTm90IGNvYWxlc2NhYmxlLgorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBERUJVRyh7CisgICAgICBkYmdzKCkgPDwgIiB3aXRoIHJlZyUiIDw8IENQLmdldERzdFJlZygpOworICAgICAgaWYgKENQLmdldFN1YklkeCgpKQorICAgICAgICBkYmdzKCkgPDwgIjoiIDw8IHRyaV8tPmdldFN1YlJlZ0luZGV4TmFtZShDUC5nZXRTdWJJZHgoKSk7CisgICAgICBkYmdzKCkgPDwgIiB0byAiIDw8IENQLmdldE5ld1JDKCktPmdldE5hbWUoKSA8PCAiXG4iOworICAgIH0pOworCisgICAgLy8gQXZvaWQgY29uc3RyYWluaW5nIHZpcnR1YWwgcmVnaXN0ZXIgcmVnY2xhc3MgdG9vIG11Y2guCisgICAgaWYgKENQLmlzQ3Jvc3NDbGFzcygpKSB7CisgICAgICBpZiAoRGlzYWJsZUNyb3NzQ2xhc3NKb2luKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRDcm9zcy1jbGFzcyBqb2lucyBkaXNhYmxlZC5cbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoIWlzV2luVG9Kb2luQ3Jvc3NDbGFzcyhDUC5nZXRTcmNSZWcoKSwgQ1AuZ2V0RHN0UmVnKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcmlfLT5nZXRSZWdDbGFzcyhDUC5nZXRTcmNSZWcoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcmlfLT5nZXRSZWdDbGFzcyhDUC5nZXREc3RSZWcoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUC5nZXROZXdSQygpKSkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0QXZvaWQgY29hbGVzY2luZyB0byBjb25zdHJhaW5lZCByZWdpc3RlciBjbGFzczogIgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1AuZ2V0TmV3UkMoKS0+Z2V0TmFtZSgpIDw8ICIuXG4iKTsKKyAgICAgICAgQWdhaW4gPSB0cnVlOyAgLy8gTWF5IGJlIHBvc3NpYmxlIHRvIGNvYWxlc2NlIGxhdGVyLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgLy8gV2hlbiBwb3NzaWJsZSwgbGV0IERzdFJlZyBiZSB0aGUgbGFyZ2VyIGludGVydmFsLgorICAgIGlmICghQ1AuZ2V0U3ViSWR4KCkgJiYgbGlfLT5nZXRJbnRlcnZhbChDUC5nZXRTcmNSZWcoKSkucmFuZ2VzLnNpemUoKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaV8tPmdldEludGVydmFsKENQLmdldERzdFJlZygpKS5yYW5nZXMuc2l6ZSgpKQorICAgICAgQ1AuZmxpcCgpOworICB9CisKKyAgLy8gV2UgbmVlZCB0byBiZSBjYXJlZnVsIGFib3V0IGNvYWxlc2NpbmcgYSBzb3VyY2UgcGh5c2ljYWwgcmVnaXN0ZXIgd2l0aCBhCisgIC8vIHZpcnR1YWwgcmVnaXN0ZXIuIE9uY2UgdGhlIGNvYWxlc2NpbmcgaXMgZG9uZSwgaXQgY2Fubm90IGJlIGJyb2tlbiBhbmQKKyAgLy8gdGhlc2UgYXJlIG5vdCBzcGlsbGFibGUhIElmIHRoZSBkZXN0aW5hdGlvbiBpbnRlcnZhbCB1c2VzIGFyZSBmYXIgYXdheSwKKyAgLy8gdGhpbmsgdHdpY2UgYWJvdXQgY29hbGVzY2luZyB0aGVtIQorICAvLyBGSVhNRTogV2h5IGFyZSB3ZSBza2lwcGluZyB0aGlzIHRlc3QgZm9yIHBhcnRpYWwgY29waWVzPworICAvLyAgICAgICAgQ29kZUdlbi9YODYvcGh5c19zdWJyZWdfY29hbGVzY2UtMy5sbCBuZWVkcyBpdC4KKyAgaWYgKCFDUC5pc1BhcnRpYWwoKSAmJiBDUC5pc1BoeXMoKSkgeworICAgIExpdmVJbnRlcnZhbCAmSm9pblZJbnQgPSBsaV8tPmdldEludGVydmFsKENQLmdldFNyY1JlZygpKTsKKworICAgIC8vIERvbid0IGpvaW4gd2l0aCBwaHlzcmVncyB0aGF0IGhhdmUgYSByaWRpY3Vsb3VzIG51bWJlciBvZiBsaXZlCisgICAgLy8gcmFuZ2VzLiBUaGUgZGF0YSBzdHJ1Y3R1cmUgcGVyZm9ybWFuY2UgaXMgcmVhbGx5IGJhZCB3aGVuIHRoYXQKKyAgICAvLyBoYXBwZW5zLgorICAgIGlmIChsaV8tPmhhc0ludGVydmFsKENQLmdldERzdFJlZygpKSAmJgorICAgICAgICBsaV8tPmdldEludGVydmFsKENQLmdldERzdFJlZygpKS5yYW5nZXMuc2l6ZSgpID4gMTAwMCkgeworICAgICAgKytudW1BYm9ydHM7CisgICAgICBERUJVRyhkYmdzKCkKKyAgICAgICAgICAgPDwgIlx0UGh5c2ljYWwgcmVnaXN0ZXIgbGl2ZSBpbnRlcnZhbCB0b28gY29tcGxpY2F0ZWQsIGFib3J0IVxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBtcmlfLT5nZXRSZWdDbGFzcyhDUC5nZXRTcmNSZWcoKSk7CisgICAgdW5zaWduZWQgVGhyZXNob2xkID0gYWxsb2NhdGFibGVSQ1JlZ3NfW1JDXS5jb3VudCgpICogMjsKKyAgICB1bnNpZ25lZCBMZW5ndGggPSBsaV8tPmdldEFwcHJveGltYXRlSW5zdHJ1Y3Rpb25Db3VudChKb2luVkludCk7CisgICAgaWYgKExlbmd0aCA+IFRocmVzaG9sZCAmJgorICAgICAgICBzdGQ6OmRpc3RhbmNlKG1yaV8tPnVzZV9ub2RiZ19iZWdpbihDUC5nZXRTcmNSZWcoKSksCisgICAgICAgICAgICAgICAgICAgICAgbXJpXy0+dXNlX25vZGJnX2VuZCgpKSAqIFRocmVzaG9sZCA8IExlbmd0aCkgeworICAgICAgLy8gQmVmb3JlIGdpdmluZyB1cCBjb2FsZXNjaW5nLCBpZiBkZWZpbml0aW9uIG9mIHNvdXJjZSBpcyBkZWZpbmVkIGJ5CisgICAgICAvLyB0cml2aWFsIGNvbXB1dGF0aW9uLCB0cnkgcmVtYXRlcmlhbGl6aW5nIGl0LgorICAgICAgaWYgKCFDUC5pc0ZsaXBwZWQoKSAmJgorICAgICAgICAgIFJlTWF0ZXJpYWxpemVUcml2aWFsRGVmKEpvaW5WSW50LCBDUC5nZXREc3RSZWcoKSwgMCwgQ29weU1JKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICsrbnVtQWJvcnRzOworICAgICAgREVCVUcoZGJncygpIDw8ICJcdE1heSB0aWUgZG93biBhIHBoeXNpY2FsIHJlZ2lzdGVyLCBhYm9ydCFcbiIpOworICAgICAgQWdhaW4gPSB0cnVlOyAgLy8gTWF5IGJlIHBvc3NpYmxlIHRvIGNvYWxlc2NlIGxhdGVyLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIE9rYXksIGF0dGVtcHQgdG8gam9pbiB0aGVzZSB0d28gaW50ZXJ2YWxzLiAgT24gZmFpbHVyZSwgdGhpcyByZXR1cm5zIGZhbHNlLgorICAvLyBPdGhlcndpc2UsIGlmIG9uZSBvZiB0aGUgaW50ZXJ2YWxzIGJlaW5nIGpvaW5lZCBpcyBhIHBoeXNyZWcsIHRoaXMgbWV0aG9kCisgIC8vIGFsd2F5cyBjYW5vbmljYWxpemVzIERzdEludCB0byBiZSBpdC4gIFRoZSBvdXRwdXQgIlNyY0ludCIgd2lsbCBub3QgaGF2ZQorICAvLyBiZWVuIG1vZGlmaWVkLCBzbyB3ZSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gYmVsb3cgdG8gdXBkYXRlIGFsaWFzZXMuCisgIGlmICghSm9pbkludGVydmFscyhDUCkpIHsKKyAgICAvLyBDb2FsZXNjaW5nIGZhaWxlZC4KKworICAgIC8vIElmIGRlZmluaXRpb24gb2Ygc291cmNlIGlzIGRlZmluZWQgYnkgdHJpdmlhbCBjb21wdXRhdGlvbiwgdHJ5CisgICAgLy8gcmVtYXRlcmlhbGl6aW5nIGl0LgorICAgIGlmICghQ1AuaXNGbGlwcGVkKCkgJiYKKyAgICAgICAgUmVNYXRlcmlhbGl6ZVRyaXZpYWxEZWYobGlfLT5nZXRJbnRlcnZhbChDUC5nZXRTcmNSZWcoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQLmdldERzdFJlZygpLCAwLCBDb3B5TUkpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBJZiB3ZSBjYW4gZWxpbWluYXRlIHRoZSBjb3B5IHdpdGhvdXQgbWVyZ2luZyB0aGUgbGl2ZSByYW5nZXMsIGRvIHNvIG5vdy4KKyAgICBpZiAoIUNQLmlzUGFydGlhbCgpKSB7CisgICAgICBpZiAoQWRqdXN0Q29waWVzQmFja0Zyb20oQ1AsIENvcHlNSSkgfHwKKyAgICAgICAgICBSZW1vdmVDb3B5QnlDb21tdXRpbmdEZWYoQ1AsIENvcHlNSSkpIHsKKyAgICAgICAgSm9pbmVkQ29waWVzLmluc2VydChDb3B5TUkpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0VHJpdmlhbCFcbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlIGFyZSB1bmFibGUgdG8gam9pbiB0aGUgaW50ZXJ2YWxzLgorICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRJbnRlcmZlcmVuY2UhXG4iKTsKKyAgICBBZ2FpbiA9IHRydWU7ICAvLyBNYXkgYmUgcG9zc2libGUgdG8gY29hbGVzY2UgbGF0ZXIuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ29hbGVzY2luZyB0byBhIHZpcnR1YWwgcmVnaXN0ZXIgdGhhdCBpcyBvZiBhIHN1Yi1yZWdpc3RlciBjbGFzcyBvZiB0aGUKKyAgLy8gb3RoZXIuIE1ha2Ugc3VyZSB0aGUgcmVzdWx0aW5nIHJlZ2lzdGVyIGlzIHNldCB0byB0aGUgcmlnaHQgcmVnaXN0ZXIgY2xhc3MuCisgIGlmIChDUC5pc0Nyb3NzQ2xhc3MoKSkgeworICAgICsrbnVtQ3Jvc3NSQ3M7CisgICAgbXJpXy0+c2V0UmVnQ2xhc3MoQ1AuZ2V0RHN0UmVnKCksIENQLmdldE5ld1JDKCkpOworICB9CisKKyAgLy8gUmVtZW1iZXIgdG8gZGVsZXRlIHRoZSBjb3B5IGluc3RydWN0aW9uLgorICBKb2luZWRDb3BpZXMuaW5zZXJ0KENvcHlNSSk7CisKKyAgVXBkYXRlUmVnRGVmc1VzZXMoQ1ApOworCisgIC8vIElmIHdlIGhhdmUgZXh0ZW5kZWQgdGhlIGxpdmUgcmFuZ2Ugb2YgYSBwaHlzaWNhbCByZWdpc3RlciwgbWFrZSBzdXJlIHdlCisgIC8vIHVwZGF0ZSBsaXZlLWluIGxpc3RzIGFzIHdlbGwuCisgIGlmIChDUC5pc1BoeXMoKSkgeworICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgMTY+IEJsb2NrU2VxOworICAgIC8vIEpvaW5JbnRlcnZhbHMgaW52YWxpZGF0ZXMgdGhlIFZOSW5mb3MgaW4gU3JjSW50LCBidXQgd2Ugb25seSBuZWVkIHRoZQorICAgIC8vIHJhbmdlcyBmb3IgdGhpcywgYW5kIHRoZXkgYXJlIHByZXNlcnZlZC4KKyAgICBMaXZlSW50ZXJ2YWwgJlNyY0ludCA9IGxpXy0+Z2V0SW50ZXJ2YWwoQ1AuZ2V0U3JjUmVnKCkpOworICAgIGZvciAoTGl2ZUludGVydmFsOjpjb25zdF9pdGVyYXRvciBJID0gU3JjSW50LmJlZ2luKCksIEUgPSBTcmNJbnQuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSApIHsKKyAgICAgIGxpXy0+ZmluZExpdmVJbk1CQnMoSS0+c3RhcnQsIEktPmVuZCwgQmxvY2tTZXEpOworICAgICAgZm9yICh1bnNpZ25lZCBpZHggPSAwLCBzaXplID0gQmxvY2tTZXEuc2l6ZSgpOyBpZHggIT0gc2l6ZTsgKytpZHgpIHsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJmJsb2NrID0gKkJsb2NrU2VxW2lkeF07CisgICAgICAgIGlmICghYmxvY2suaXNMaXZlSW4oQ1AuZ2V0RHN0UmVnKCkpKQorICAgICAgICAgIGJsb2NrLmFkZExpdmVJbihDUC5nZXREc3RSZWcoKSk7CisgICAgICB9CisgICAgICBCbG9ja1NlcS5jbGVhcigpOworICAgIH0KKyAgfQorCisgIC8vIFNyY1JlZyBpcyBndWFyYXRlZWQgdG8gYmUgdGhlIHJlZ2lzdGVyIHdob3NlIGxpdmUgaW50ZXJ2YWwgdGhhdCBpcworICAvLyBiZWluZyBtZXJnZWQuCisgIGxpXy0+cmVtb3ZlSW50ZXJ2YWwoQ1AuZ2V0U3JjUmVnKCkpOworCisgIC8vIFVwZGF0ZSByZWdhbGxvYyBoaW50LgorICB0cmlfLT5VcGRhdGVSZWdBbGxvY0hpbnQoQ1AuZ2V0U3JjUmVnKCksIENQLmdldERzdFJlZygpLCAqbWZfKTsKKworICBERUJVRyh7CisgICAgTGl2ZUludGVydmFsICZEc3RJbnQgPSBsaV8tPmdldEludGVydmFsKENQLmdldERzdFJlZygpKTsKKyAgICBkYmdzKCkgPDwgIlx0Sm9pbmVkLiBSZXN1bHQgPSAiOworICAgIERzdEludC5wcmludChkYmdzKCksIHRyaV8pOworICAgIGRiZ3MoKSA8PCAiXG4iOworICB9KTsKKworICArK251bUpvaW5zOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIENvbXB1dGVVbHRpbWF0ZVZOIC0gQXNzdW1pbmcgd2UgYXJlIGdvaW5nIHRvIGpvaW4gdHdvIGxpdmUgaW50ZXJ2YWxzLAorLy8vIGNvbXB1dGUgd2hhdCB0aGUgcmVzdWx0YW50IHZhbHVlIG51bWJlcnMgZm9yIGVhY2ggdmFsdWUgaW4gdGhlIGlucHV0IHR3bworLy8vIHJhbmdlcyB3aWxsIGJlLiAgVGhpcyBpcyBjb21wbGljYXRlZCBieSBjb3BpZXMgYmV0d2VlbiB0aGUgdHdvIHdoaWNoIGNhbgorLy8vIGFuZCB3aWxsIGNvbW1vbmx5IGNhdXNlIG11bHRpcGxlIHZhbHVlIG51bWJlcnMgdG8gYmUgbWVyZ2VkIGludG8gb25lLgorLy8vCisvLy8gVk4gaXMgdGhlIHZhbHVlIG51bWJlciB0aGF0IHdlJ3JlIHRyeWluZyB0byByZXNvbHZlLiAgSW5zdERlZmluaW5nVmFsdWUKKy8vLyBrZWVwcyB0cmFjayBvZiB0aGUgbmV3IEluc3REZWZpbmluZ1ZhbHVlIGFzc2lnbm1lbnQgZm9yIHRoZSByZXN1bHQKKy8vLyBMaXZlSW50ZXJ2YWwuICBUaGlzRnJvbU90aGVyL090aGVyRnJvbVRoaXMgYXJlIHNldHMgdGhhdCBrZWVwIHRyYWNrIG9mCisvLy8gd2hldGhlciBhIHZhbHVlIGluIHRoaXMgb3Igb3RoZXIgaXMgYSBjb3B5IGZyb20gdGhlIG9wcG9zaXRlIHNldC4KKy8vLyBUaGlzVmFsTm9Bc3NpZ25tZW50cy9PdGhlclZhbE5vQXNzaWdubWVudHMga2VlcCB0cmFjayBvZiB2YWx1ZSAjJ3MgdGhhdCBoYXZlCisvLy8gYWxyZWFkeSBiZWVuIGFzc2lnbmVkLgorLy8vCisvLy8gVGhpc0Zyb21PdGhlclt4XSAtIElmIHggaXMgZGVmaW5lZCBhcyBhIGNvcHkgZnJvbSB0aGUgb3RoZXIgaW50ZXJ2YWwsIHRoaXMKKy8vLyBjb250YWlucyB0aGUgdmFsdWUgbnVtYmVyIHRoZSBjb3B5IGlzIGZyb20uCisvLy8KK3N0YXRpYyB1bnNpZ25lZCBDb21wdXRlVWx0aW1hdGVWTihWTkluZm8gKlZOSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxWTkluZm8qLCAxNj4gJk5ld1ZOSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxWTkluZm8qLCBWTkluZm8qPiAmVGhpc0Zyb21PdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxWTkluZm8qLCBWTkluZm8qPiAmT3RoZXJGcm9tVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxpbnQsIDE2PiAmVGhpc1ZhbE5vQXNzaWdubWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8aW50LCAxNj4gJk90aGVyVmFsTm9Bc3NpZ25tZW50cykgeworICB1bnNpZ25lZCBWTiA9IFZOSS0+aWQ7CisKKyAgLy8gSWYgdGhlIFZOIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIGp1c3QgcmV0dXJuIGl0LgorICBpZiAoVGhpc1ZhbE5vQXNzaWdubWVudHNbVk5dID49IDApCisgICAgcmV0dXJuIFRoaXNWYWxOb0Fzc2lnbm1lbnRzW1ZOXTsKKyAgYXNzZXJ0KFRoaXNWYWxOb0Fzc2lnbm1lbnRzW1ZOXSAhPSAtMiAmJiAiQ3ljbGljIHZhbHVlIG51bWJlcnMiKTsKKworICAvLyBJZiB0aGlzIHZhbCBpcyBub3QgYSBjb3B5IGZyb20gdGhlIG90aGVyIHZhbCwgdGhlbiBpdCBtdXN0IGJlIGEgbmV3IHZhbHVlCisgIC8vIG51bWJlciBpbiB0aGUgZGVzdGluYXRpb24uCisgIERlbnNlTWFwPFZOSW5mbyosIFZOSW5mbyo+OjppdGVyYXRvciBJID0gVGhpc0Zyb21PdGhlci5maW5kKFZOSSk7CisgIGlmIChJID09IFRoaXNGcm9tT3RoZXIuZW5kKCkpIHsKKyAgICBOZXdWTkluZm8ucHVzaF9iYWNrKFZOSSk7CisgICAgcmV0dXJuIFRoaXNWYWxOb0Fzc2lnbm1lbnRzW1ZOXSA9IE5ld1ZOSW5mby5zaXplKCktMTsKKyAgfQorICBWTkluZm8gKk90aGVyVmFsTm8gPSBJLT5zZWNvbmQ7CisKKyAgLy8gT3RoZXJ3aXNlLCB0aGlzICppcyogYSBjb3B5IGZyb20gdGhlIFJIUy4gIElmIHRoZSBvdGhlciBzaWRlIGhhcyBhbHJlYWR5CisgIC8vIGJlZW4gY29tcHV0ZWQsIHJldHVybiBpdC4KKyAgaWYgKE90aGVyVmFsTm9Bc3NpZ25tZW50c1tPdGhlclZhbE5vLT5pZF0gPj0gMCkKKyAgICByZXR1cm4gVGhpc1ZhbE5vQXNzaWdubWVudHNbVk5dID0gT3RoZXJWYWxOb0Fzc2lnbm1lbnRzW090aGVyVmFsTm8tPmlkXTsKKworICAvLyBNYXJrIHRoaXMgdmFsdWUgbnVtYmVyIGFzIGN1cnJlbnRseSBiZWluZyBjb21wdXRlZCwgdGhlbiBhc2sgd2hhdCB0aGUKKyAgLy8gdWx0aW1hdGUgdmFsdWUgIyBvZiB0aGUgb3RoZXIgdmFsdWUgaXMuCisgIFRoaXNWYWxOb0Fzc2lnbm1lbnRzW1ZOXSA9IC0yOworICB1bnNpZ25lZCBVbHRpbWF0ZVZOID0KKyAgICBDb21wdXRlVWx0aW1hdGVWTihPdGhlclZhbE5vLCBOZXdWTkluZm8sIE90aGVyRnJvbVRoaXMsIFRoaXNGcm9tT3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgT3RoZXJWYWxOb0Fzc2lnbm1lbnRzLCBUaGlzVmFsTm9Bc3NpZ25tZW50cyk7CisgIHJldHVybiBUaGlzVmFsTm9Bc3NpZ25tZW50c1tWTl0gPSBVbHRpbWF0ZVZOOworfQorCisvLy8gSm9pbkludGVydmFscyAtIEF0dGVtcHQgdG8gam9pbiB0aGVzZSB0d28gaW50ZXJ2YWxzLiAgT24gZmFpbHVyZSwgdGhpcworLy8vIHJldHVybnMgZmFsc2UuCitib29sIFNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZzo6Sm9pbkludGVydmFscyhDb2FsZXNjZXJQYWlyICZDUCkgeworICBMaXZlSW50ZXJ2YWwgJlJIUyA9IGxpXy0+Z2V0SW50ZXJ2YWwoQ1AuZ2V0U3JjUmVnKCkpOworICBERUJVRyh7IGRiZ3MoKSA8PCAiXHRcdFJIUyA9ICI7IFJIUy5wcmludChkYmdzKCksIHRyaV8pOyBkYmdzKCkgPDwgIlxuIjsgfSk7CisKKyAgLy8gSWYgYSBsaXZlIGludGVydmFsIGlzIGEgcGh5c2ljYWwgcmVnaXN0ZXIsIGNoZWNrIGZvciBpbnRlcmZlcmVuY2Ugd2l0aCBhbnkKKyAgLy8gYWxpYXNlcy4gVGhlIGludGVyZmVyZW5jZSBjaGVjayBpbXBsZW1lbnRlZCBoZXJlIGlzIGEgYml0IG1vcmUgY29uc2VydmF0aXZlCisgIC8vIHRoYW4gdGhlIGZ1bGwgaW50ZXJmZWVuY2UgY2hlY2sgYmVsb3cuIFdlIGFsbG93IG92ZXJsYXBwaW5nIGxpdmUgcmFuZ2VzCisgIC8vIG9ubHkgd2hlbiBvbmUgaXMgYSBjb3B5IG9mIHRoZSBvdGhlci4KKyAgaWYgKENQLmlzUGh5cygpKSB7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSB0cmlfLT5nZXRBbGlhc1NldChDUC5nZXREc3RSZWcoKSk7ICpBUzsgKytBUyl7CisgICAgICBpZiAoIWxpXy0+aGFzSW50ZXJ2YWwoKkFTKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBjb25zdCBMaXZlSW50ZXJ2YWwgJkxIUyA9IGxpXy0+Z2V0SW50ZXJ2YWwoKkFTKTsKKyAgICAgIExpdmVJbnRlcnZhbDo6Y29uc3RfaXRlcmF0b3IgTEkgPSBMSFMuYmVnaW4oKTsKKyAgICAgIGZvciAoTGl2ZUludGVydmFsOjpjb25zdF9pdGVyYXRvciBSSSA9IFJIUy5iZWdpbigpLCBSRSA9IFJIUy5lbmQoKTsKKyAgICAgICAgICAgUkkgIT0gUkU7ICsrUkkpIHsKKyAgICAgICAgTEkgPSBzdGQ6Omxvd2VyX2JvdW5kKExJLCBMSFMuZW5kKCksIFJJLT5zdGFydCk7CisgICAgICAgIC8vIERvZXMgTEhTIGhhdmUgYW4gb3ZlcmxhcHBpbmcgbGl2ZSByYW5nZSBzdGFydGluZyBiZWZvcmUgUkk/CisgICAgICAgIGlmICgoTEkgIT0gTEhTLmJlZ2luKCkgJiYgTElbLTFdLmVuZCA+IFJJLT5zdGFydCkgJiYKKyAgICAgICAgICAgIChSSS0+c3RhcnQgIT0gUkktPnZhbG5vLT5kZWYgfHwKKyAgICAgICAgICAgICAhQ1AuaXNDb2FsZXNjYWJsZShsaV8tPmdldEluc3RydWN0aW9uRnJvbUluZGV4KFJJLT5zdGFydCkpKSkgeworICAgICAgICAgIERFQlVHKHsKKyAgICAgICAgICAgIGRiZ3MoKSA8PCAiXHRcdEludGVyZmVyZW5jZSBmcm9tIGFsaWFzOiAiOworICAgICAgICAgICAgTEhTLnByaW50KGRiZ3MoKSwgdHJpXyk7CisgICAgICAgICAgICBkYmdzKCkgPDwgIlxuXHRcdE92ZXJsYXAgYXQgIiA8PCBSSS0+c3RhcnQgPDwgIiBhbmQgbm8gY29weS5cbiI7CisgICAgICAgICAgfSk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBMSFMgcmFuZ2VzIGJlZ2lubmluZyBpbiB0aGlzIHJhbmdlIGFyZSBjb3BpZXMuCisgICAgICAgIGZvciAoOyBMSSAhPSBMSFMuZW5kKCkgJiYgTEktPnN0YXJ0IDwgUkktPmVuZDsgKytMSSkgeworICAgICAgICAgIGlmIChMSS0+c3RhcnQgIT0gTEktPnZhbG5vLT5kZWYgfHwKKyAgICAgICAgICAgICAgIUNQLmlzQ29hbGVzY2FibGUobGlfLT5nZXRJbnN0cnVjdGlvbkZyb21JbmRleChMSS0+c3RhcnQpKSkgeworICAgICAgICAgICAgREVCVUcoeworICAgICAgICAgICAgICBkYmdzKCkgPDwgIlx0XHRJbnRlcmZlcmVuY2UgZnJvbSBhbGlhczogIjsKKyAgICAgICAgICAgICAgTEhTLnByaW50KGRiZ3MoKSwgdHJpXyk7CisgICAgICAgICAgICAgIGRiZ3MoKSA8PCAiXG5cdFx0RGVmIGF0ICIgPDwgTEktPnN0YXJ0IDw8ICIgaXMgbm90IGEgY29weS5cbiI7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDb21wdXRlIHRoZSBmaW5hbCB2YWx1ZSBhc3NpZ25tZW50LCBhc3N1bWluZyB0aGF0IHRoZSBsaXZlIHJhbmdlcyBjYW4gYmUKKyAgLy8gY29hbGVzY2VkLgorICBTbWFsbFZlY3RvcjxpbnQsIDE2PiBMSFNWYWxOb0Fzc2lnbm1lbnRzOworICBTbWFsbFZlY3RvcjxpbnQsIDE2PiBSSFNWYWxOb0Fzc2lnbm1lbnRzOworICBEZW5zZU1hcDxWTkluZm8qLCBWTkluZm8qPiBMSFNWYWxzRGVmaW5lZEZyb21SSFM7CisgIERlbnNlTWFwPFZOSW5mbyosIFZOSW5mbyo+IFJIU1ZhbHNEZWZpbmVkRnJvbUxIUzsKKyAgU21hbGxWZWN0b3I8Vk5JbmZvKiwgMTY+IE5ld1ZOSW5mbzsKKworICBMaXZlSW50ZXJ2YWwgJkxIUyA9IGxpXy0+Z2V0T3JDcmVhdGVJbnRlcnZhbChDUC5nZXREc3RSZWcoKSk7CisgIERFQlVHKHsgZGJncygpIDw8ICJcdFx0TEhTID0gIjsgTEhTLnByaW50KGRiZ3MoKSwgdHJpXyk7IGRiZ3MoKSA8PCAiXG4iOyB9KTsKKworICAvLyBMb29wIG92ZXIgdGhlIHZhbHVlIG51bWJlcnMgb2YgdGhlIExIUywgc2VlaW5nIGlmIGFueSBhcmUgZGVmaW5lZCBmcm9tCisgIC8vIHRoZSBSSFMuCisgIGZvciAoTGl2ZUludGVydmFsOjp2bmlfaXRlcmF0b3IgaSA9IExIUy52bmlfYmVnaW4oKSwgZSA9IExIUy52bmlfZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBWTkluZm8gKlZOSSA9ICppOworICAgIGlmIChWTkktPmlzVW51c2VkKCkgfHwgVk5JLT5nZXRDb3B5KCkgPT0gMCkgIC8vIFNyYyBub3QgZGVmaW5lZCBieSBhIGNvcHk/CisgICAgICBjb250aW51ZTsKKworICAgIC8vIE5ldmVyIGpvaW4gd2l0aCBhIHJlZ2lzdGVyIHRoYXQgaGFzIEVhcmx5Q2xvYmJlciByZWRlZnMuCisgICAgaWYgKFZOSS0+aGFzUmVkZWZCeUVDKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBEc3RSZWcgaXMga25vd24gdG8gYmUgYSByZWdpc3RlciBpbiB0aGUgTEhTIGludGVydmFsLiAgSWYgdGhlIHNyYyBpcworICAgIC8vIGZyb20gdGhlIFJIUyBpbnRlcnZhbCwgd2UgY2FuIHVzZSBpdHMgdmFsdWUgIy4KKyAgICBpZiAoIUNQLmlzQ29hbGVzY2FibGUoVk5JLT5nZXRDb3B5KCkpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBGaWd1cmUgb3V0IHRoZSB2YWx1ZSAjIGZyb20gdGhlIFJIUy4KKyAgICBMaXZlUmFuZ2UgKmxyID0gUkhTLmdldExpdmVSYW5nZUNvbnRhaW5pbmcoVk5JLT5kZWYuZ2V0UHJldlNsb3QoKSk7CisgICAgLy8gVGhlIGNvcHkgY291bGQgYmUgdG8gYW4gYWxpYXNlZCBwaHlzcmVnLgorICAgIGlmICghbHIpIGNvbnRpbnVlOworICAgIExIU1ZhbHNEZWZpbmVkRnJvbVJIU1tWTkldID0gbHItPnZhbG5vOworICB9CisKKyAgLy8gTG9vcCBvdmVyIHRoZSB2YWx1ZSBudW1iZXJzIG9mIHRoZSBSSFMsIHNlZWluZyBpZiBhbnkgYXJlIGRlZmluZWQgZnJvbQorICAvLyB0aGUgTEhTLgorICBmb3IgKExpdmVJbnRlcnZhbDo6dm5pX2l0ZXJhdG9yIGkgPSBSSFMudm5pX2JlZ2luKCksIGUgPSBSSFMudm5pX2VuZCgpOworICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgVk5JbmZvICpWTkkgPSAqaTsKKyAgICBpZiAoVk5JLT5pc1VudXNlZCgpIHx8IFZOSS0+Z2V0Q29weSgpID09IDApICAvLyBTcmMgbm90IGRlZmluZWQgYnkgYSBjb3B5PworICAgICAgY29udGludWU7CisKKyAgICAvLyBOZXZlciBqb2luIHdpdGggYSByZWdpc3RlciB0aGF0IGhhcyBFYXJseUNsb2JiZXIgcmVkZWZzLgorICAgIGlmIChWTkktPmhhc1JlZGVmQnlFQygpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRHN0UmVnIGlzIGtub3duIHRvIGJlIGEgcmVnaXN0ZXIgaW4gdGhlIFJIUyBpbnRlcnZhbC4gIElmIHRoZSBzcmMgaXMKKyAgICAvLyBmcm9tIHRoZSBMSFMgaW50ZXJ2YWwsIHdlIGNhbiB1c2UgaXRzIHZhbHVlICMuCisgICAgaWYgKCFDUC5pc0NvYWxlc2NhYmxlKFZOSS0+Z2V0Q29weSgpKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gRmlndXJlIG91dCB0aGUgdmFsdWUgIyBmcm9tIHRoZSBMSFMuCisgICAgTGl2ZVJhbmdlICpsciA9IExIUy5nZXRMaXZlUmFuZ2VDb250YWluaW5nKFZOSS0+ZGVmLmdldFByZXZTbG90KCkpOworICAgIC8vIFRoZSBjb3B5IGNvdWxkIGJlIHRvIGFuIGFsaWFzZWQgcGh5c3JlZy4KKyAgICBpZiAoIWxyKSBjb250aW51ZTsKKyAgICBSSFNWYWxzRGVmaW5lZEZyb21MSFNbVk5JXSA9IGxyLT52YWxubzsKKyAgfQorCisgIExIU1ZhbE5vQXNzaWdubWVudHMucmVzaXplKExIUy5nZXROdW1WYWxOdW1zKCksIC0xKTsKKyAgUkhTVmFsTm9Bc3NpZ25tZW50cy5yZXNpemUoUkhTLmdldE51bVZhbE51bXMoKSwgLTEpOworICBOZXdWTkluZm8ucmVzZXJ2ZShMSFMuZ2V0TnVtVmFsTnVtcygpICsgUkhTLmdldE51bVZhbE51bXMoKSk7CisKKyAgZm9yIChMaXZlSW50ZXJ2YWw6OnZuaV9pdGVyYXRvciBpID0gTEhTLnZuaV9iZWdpbigpLCBlID0gTEhTLnZuaV9lbmQoKTsKKyAgICAgICBpICE9IGU7ICsraSkgeworICAgIFZOSW5mbyAqVk5JID0gKmk7CisgICAgdW5zaWduZWQgVk4gPSBWTkktPmlkOworICAgIGlmIChMSFNWYWxOb0Fzc2lnbm1lbnRzW1ZOXSA+PSAwIHx8IFZOSS0+aXNVbnVzZWQoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIENvbXB1dGVVbHRpbWF0ZVZOKFZOSSwgTmV3Vk5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgIExIU1ZhbHNEZWZpbmVkRnJvbVJIUywgUkhTVmFsc0RlZmluZWRGcm9tTEhTLAorICAgICAgICAgICAgICAgICAgICAgIExIU1ZhbE5vQXNzaWdubWVudHMsIFJIU1ZhbE5vQXNzaWdubWVudHMpOworICB9CisgIGZvciAoTGl2ZUludGVydmFsOjp2bmlfaXRlcmF0b3IgaSA9IFJIUy52bmlfYmVnaW4oKSwgZSA9IFJIUy52bmlfZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBWTkluZm8gKlZOSSA9ICppOworICAgIHVuc2lnbmVkIFZOID0gVk5JLT5pZDsKKyAgICBpZiAoUkhTVmFsTm9Bc3NpZ25tZW50c1tWTl0gPj0gMCB8fCBWTkktPmlzVW51c2VkKCkpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBJZiB0aGlzIHZhbHVlIG51bWJlciBpc24ndCBhIGNvcHkgZnJvbSB0aGUgTEhTLCBpdCdzIGEgbmV3IG51bWJlci4KKyAgICBpZiAoUkhTVmFsc0RlZmluZWRGcm9tTEhTLmZpbmQoVk5JKSA9PSBSSFNWYWxzRGVmaW5lZEZyb21MSFMuZW5kKCkpIHsKKyAgICAgIE5ld1ZOSW5mby5wdXNoX2JhY2soVk5JKTsKKyAgICAgIFJIU1ZhbE5vQXNzaWdubWVudHNbVk5dID0gTmV3Vk5JbmZvLnNpemUoKS0xOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgQ29tcHV0ZVVsdGltYXRlVk4oVk5JLCBOZXdWTkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgUkhTVmFsc0RlZmluZWRGcm9tTEhTLCBMSFNWYWxzRGVmaW5lZEZyb21SSFMsCisgICAgICAgICAgICAgICAgICAgICAgUkhTVmFsTm9Bc3NpZ25tZW50cywgTEhTVmFsTm9Bc3NpZ25tZW50cyk7CisgIH0KKworICAvLyBBcm1lZCB3aXRoIHRoZSBtYXBwaW5ncyBvZiBMSFMvUkhTIHZhbHVlcyB0byB1bHRpbWF0ZSB2YWx1ZXMsIHdhbGsgdGhlCisgIC8vIGludGVydmFsIGxpc3RzIHRvIHNlZSBpZiB0aGVzZSBpbnRlcnZhbHMgYXJlIGNvYWxlc2NhYmxlLgorICBMaXZlSW50ZXJ2YWw6OmNvbnN0X2l0ZXJhdG9yIEkgPSBMSFMuYmVnaW4oKTsKKyAgTGl2ZUludGVydmFsOjpjb25zdF9pdGVyYXRvciBJRSA9IExIUy5lbmQoKTsKKyAgTGl2ZUludGVydmFsOjpjb25zdF9pdGVyYXRvciBKID0gUkhTLmJlZ2luKCk7CisgIExpdmVJbnRlcnZhbDo6Y29uc3RfaXRlcmF0b3IgSkUgPSBSSFMuZW5kKCk7CisKKyAgLy8gU2tpcCBhaGVhZCB1bnRpbCB0aGUgZmlyc3QgcGxhY2Ugb2YgcG90ZW50aWFsIHNoYXJpbmcuCisgIGlmIChJICE9IElFICYmIEogIT0gSkUpIHsKKyAgICBpZiAoSS0+c3RhcnQgPCBKLT5zdGFydCkgeworICAgICAgSSA9IHN0ZDo6dXBwZXJfYm91bmQoSSwgSUUsIEotPnN0YXJ0KTsKKyAgICAgIGlmIChJICE9IExIUy5iZWdpbigpKSAtLUk7CisgICAgfSBlbHNlIGlmIChKLT5zdGFydCA8IEktPnN0YXJ0KSB7CisgICAgICBKID0gc3RkOjp1cHBlcl9ib3VuZChKLCBKRSwgSS0+c3RhcnQpOworICAgICAgaWYgKEogIT0gUkhTLmJlZ2luKCkpIC0tSjsKKyAgICB9CisgIH0KKworICB3aGlsZSAoSSAhPSBJRSAmJiBKICE9IEpFKSB7CisgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXNlIHR3byBsaXZlIHJhbmdlcyBvdmVybGFwLgorICAgIGJvb2wgT3ZlcmxhcHM7CisgICAgaWYgKEktPnN0YXJ0IDwgSi0+c3RhcnQpIHsKKyAgICAgIE92ZXJsYXBzID0gSS0+ZW5kID4gSi0+c3RhcnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIE92ZXJsYXBzID0gSi0+ZW5kID4gSS0+c3RhcnQ7CisgICAgfQorCisgICAgLy8gSWYgc28sIGNoZWNrIHZhbHVlICMgaW5mbyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgcmVhbGx5IGRpZmZlcmVudC4KKyAgICBpZiAoT3ZlcmxhcHMpIHsKKyAgICAgIC8vIElmIHRoZSBsaXZlIHJhbmdlIG92ZXJsYXAgd2lsbCBtYXAgdG8gdGhlIHNhbWUgdmFsdWUgbnVtYmVyIGluIHRoZQorICAgICAgLy8gcmVzdWx0IGxpdmVyYW5nZSwgd2UgY2FuIHN0aWxsIGNvYWxlc2NlIHRoZW0uICBJZiBub3QsIHdlIGNhbid0LgorICAgICAgaWYgKExIU1ZhbE5vQXNzaWdubWVudHNbSS0+dmFsbm8tPmlkXSAhPQorICAgICAgICAgIFJIU1ZhbE5vQXNzaWdubWVudHNbSi0+dmFsbm8tPmlkXSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgLy8gSWYgaXQncyByZS1kZWZpbmVkIGJ5IGFuIGVhcmx5IGNsb2JiZXIgc29tZXdoZXJlIGluIHRoZSBsaXZlIHJhbmdlLAorICAgICAgLy8gdGhlbiBjb25zZXJ2YXRpdmVseSBhYm9ydCBjb2FsZXNjaW5nLgorICAgICAgaWYgKE5ld1ZOSW5mb1tMSFNWYWxOb0Fzc2lnbm1lbnRzW0ktPnZhbG5vLT5pZF1dLT5oYXNSZWRlZkJ5RUMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChJLT5lbmQgPCBKLT5lbmQpCisgICAgICArK0k7CisgICAgZWxzZQorICAgICAgKytKOworICB9CisKKyAgLy8gVXBkYXRlIGtpbGwgaW5mby4gU29tZSBsaXZlIHJhbmdlcyBhcmUgZXh0ZW5kZWQgZHVlIHRvIGNvcHkgY29hbGVzY2luZy4KKyAgZm9yIChEZW5zZU1hcDxWTkluZm8qLCBWTkluZm8qPjo6aXRlcmF0b3IgSSA9IExIU1ZhbHNEZWZpbmVkRnJvbVJIUy5iZWdpbigpLAorICAgICAgICAgRSA9IExIU1ZhbHNEZWZpbmVkRnJvbVJIUy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBWTkluZm8gKlZOSSA9IEktPmZpcnN0OworICAgIHVuc2lnbmVkIExIU1ZhbElEID0gTEhTVmFsTm9Bc3NpZ25tZW50c1tWTkktPmlkXTsKKyAgICBpZiAoVk5JLT5oYXNQSElLaWxsKCkpCisgICAgICBOZXdWTkluZm9bTEhTVmFsSURdLT5zZXRIYXNQSElLaWxsKHRydWUpOworICB9CisKKyAgLy8gVXBkYXRlIGtpbGwgaW5mby4gU29tZSBsaXZlIHJhbmdlcyBhcmUgZXh0ZW5kZWQgZHVlIHRvIGNvcHkgY29hbGVzY2luZy4KKyAgZm9yIChEZW5zZU1hcDxWTkluZm8qLCBWTkluZm8qPjo6aXRlcmF0b3IgSSA9IFJIU1ZhbHNEZWZpbmVkRnJvbUxIUy5iZWdpbigpLAorICAgICAgICAgRSA9IFJIU1ZhbHNEZWZpbmVkRnJvbUxIUy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBWTkluZm8gKlZOSSA9IEktPmZpcnN0OworICAgIHVuc2lnbmVkIFJIU1ZhbElEID0gUkhTVmFsTm9Bc3NpZ25tZW50c1tWTkktPmlkXTsKKyAgICBpZiAoVk5JLT5oYXNQSElLaWxsKCkpCisgICAgICBOZXdWTkluZm9bUkhTVmFsSURdLT5zZXRIYXNQSElLaWxsKHRydWUpOworICB9CisKKyAgaWYgKExIU1ZhbE5vQXNzaWdubWVudHMuZW1wdHkoKSkKKyAgICBMSFNWYWxOb0Fzc2lnbm1lbnRzLnB1c2hfYmFjaygtMSk7CisgIGlmIChSSFNWYWxOb0Fzc2lnbm1lbnRzLmVtcHR5KCkpCisgICAgUkhTVmFsTm9Bc3NpZ25tZW50cy5wdXNoX2JhY2soLTEpOworCisgIC8vIElmIHdlIGdldCBoZXJlLCB3ZSBrbm93IHRoYXQgd2UgY2FuIGNvYWxlc2NlIHRoZSBsaXZlIHJhbmdlcy4gIEFzayB0aGUKKyAgLy8gaW50ZXJ2YWxzIHRvIGNvYWxlc2NlIHRoZW1zZWx2ZXMgbm93LgorICBMSFMuam9pbihSSFMsICZMSFNWYWxOb0Fzc2lnbm1lbnRzWzBdLCAmUkhTVmFsTm9Bc3NpZ25tZW50c1swXSwgTmV3Vk5JbmZvLAorICAgICAgICAgICBtcmlfKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSB7CisgIC8vIERlcHRoTUJCQ29tcGFyZSAtIENvbXBhcmlzb24gcHJlZGljYXRlIHRoYXQgc29ydCBmaXJzdCBiYXNlZCBvbiB0aGUgbG9vcAorICAvLyBkZXB0aCBvZiB0aGUgYmFzaWMgYmxvY2sgKHRoZSB1bnNpZ25lZCksIGFuZCB0aGVuIG9uIHRoZSBNQkIgbnVtYmVyLgorICBzdHJ1Y3QgRGVwdGhNQkJDb21wYXJlIHsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTWFjaGluZUJhc2ljQmxvY2sqPiBEZXB0aE1CQlBhaXI7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IERlcHRoTUJCUGFpciAmTEhTLCBjb25zdCBEZXB0aE1CQlBhaXIgJlJIUykgY29uc3QgeworICAgICAgLy8gRGVlcGVyIGxvb3BzIGZpcnN0CisgICAgICBpZiAoTEhTLmZpcnN0ICE9IFJIUy5maXJzdCkKKyAgICAgICAgcmV0dXJuIExIUy5maXJzdCA+IFJIUy5maXJzdDsKKworICAgICAgLy8gUHJlZmVyIGJsb2NrcyB0aGF0IGFyZSBtb3JlIGNvbm5lY3RlZCBpbiB0aGUgQ0ZHLiBUaGlzIHRha2VzIGNhcmUgb2YKKyAgICAgIC8vIHRoZSBtb3N0IGRpZmZpY3VsdCBjb3BpZXMgZmlyc3Qgd2hpbGUgaW50ZXJ2YWxzIGFyZSBzaG9ydC4KKyAgICAgIHVuc2lnbmVkIGNsID0gTEhTLnNlY29uZC0+cHJlZF9zaXplKCkgKyBMSFMuc2Vjb25kLT5zdWNjX3NpemUoKTsKKyAgICAgIHVuc2lnbmVkIGNyID0gUkhTLnNlY29uZC0+cHJlZF9zaXplKCkgKyBSSFMuc2Vjb25kLT5zdWNjX3NpemUoKTsKKyAgICAgIGlmIChjbCAhPSBjcikKKyAgICAgICAgcmV0dXJuIGNsID4gY3I7CisKKyAgICAgIC8vIEFzIGEgbGFzdCByZXNvcnQsIHNvcnQgYnkgYmxvY2sgbnVtYmVyLgorICAgICAgcmV0dXJuIExIUy5zZWNvbmQtPmdldE51bWJlcigpIDwgUkhTLnNlY29uZC0+Z2V0TnVtYmVyKCk7CisgICAgfQorICB9OworfQorCit2b2lkIFNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZzo6Q29weUNvYWxlc2NlSW5NQkIoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29weVJlYz4gJlRyeUFnYWluKSB7CisgIERFQlVHKGRiZ3MoKSA8PCBNQkItPmdldE5hbWUoKSA8PCAiOlxuIik7CisKKyAgc3RkOjp2ZWN0b3I8Q29weVJlYz4gVmlydENvcGllczsKKyAgc3RkOjp2ZWN0b3I8Q29weVJlYz4gUGh5c0NvcGllczsKKyAgc3RkOjp2ZWN0b3I8Q29weVJlYz4gSW1wRGVmQ29waWVzOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSUkgPSBNQkItPmJlZ2luKCksIEUgPSBNQkItPmVuZCgpOworICAgICAgIE1JSSAhPSBFOykgeworICAgIE1hY2hpbmVJbnN0ciAqSW5zdCA9IE1JSSsrOworCisgICAgLy8gSWYgdGhpcyBpc24ndCBhIGNvcHkgbm9yIGEgZXh0cmFjdF9zdWJyZWcsIHdlIGNhbid0IGpvaW4gaW50ZXJ2YWxzLgorICAgIHVuc2lnbmVkIFNyY1JlZywgRHN0UmVnOworICAgIGlmIChJbnN0LT5pc0NvcHkoKSkgeworICAgICAgRHN0UmVnID0gSW5zdC0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAgIFNyY1JlZyA9IEluc3QtPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgfSBlbHNlIGlmIChJbnN0LT5pc1N1YnJlZ1RvUmVnKCkpIHsKKyAgICAgIERzdFJlZyA9IEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgICBTcmNSZWcgPSBJbnN0LT5nZXRPcGVyYW5kKDIpLmdldFJlZygpOworICAgIH0gZWxzZQorICAgICAgY29udGludWU7CisKKyAgICBib29sIFNyY0lzUGh5cyA9IFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFNyY1JlZyk7CisgICAgYm9vbCBEc3RJc1BoeXMgPSBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihEc3RSZWcpOworICAgIGlmIChsaV8tPmhhc0ludGVydmFsKFNyY1JlZykgJiYgbGlfLT5nZXRJbnRlcnZhbChTcmNSZWcpLmVtcHR5KCkpCisgICAgICBJbXBEZWZDb3BpZXMucHVzaF9iYWNrKENvcHlSZWMoSW5zdCwgMCkpOworICAgIGVsc2UgaWYgKFNyY0lzUGh5cyB8fCBEc3RJc1BoeXMpCisgICAgICBQaHlzQ29waWVzLnB1c2hfYmFjayhDb3B5UmVjKEluc3QsIDApKTsKKyAgICBlbHNlCisgICAgICBWaXJ0Q29waWVzLnB1c2hfYmFjayhDb3B5UmVjKEluc3QsIDApKTsKKyAgfQorCisgIC8vIFRyeSBjb2FsZXNjaW5nIGltcGxpY2l0IGNvcGllcyBhbmQgaW5zZXJ0X3N1YnJlZyA8dW5kZWY+IGZpcnN0LAorICAvLyBmb2xsb3dlZCBieSBjb3BpZXMgdG8gLyBmcm9tIHBoeXNpY2FsIHJlZ2lzdGVycywgdGhlbiBmaW5hbGx5IGNvcGllcworICAvLyBmcm9tIHZpcnR1YWwgcmVnaXN0ZXJzIHRvIHZpcnR1YWwgcmVnaXN0ZXJzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW1wRGVmQ29waWVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDb3B5UmVjICZUaGVDb3B5ID0gSW1wRGVmQ29waWVzW2ldOworICAgIGJvb2wgQWdhaW4gPSBmYWxzZTsKKyAgICBpZiAoIUpvaW5Db3B5KFRoZUNvcHksIEFnYWluKSkKKyAgICAgIGlmIChBZ2FpbikKKyAgICAgICAgVHJ5QWdhaW4ucHVzaF9iYWNrKFRoZUNvcHkpOworICB9CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQaHlzQ29waWVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDb3B5UmVjICZUaGVDb3B5ID0gUGh5c0NvcGllc1tpXTsKKyAgICBib29sIEFnYWluID0gZmFsc2U7CisgICAgaWYgKCFKb2luQ29weShUaGVDb3B5LCBBZ2FpbikpCisgICAgICBpZiAoQWdhaW4pCisgICAgICAgIFRyeUFnYWluLnB1c2hfYmFjayhUaGVDb3B5KTsKKyAgfQorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVmlydENvcGllcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ29weVJlYyAmVGhlQ29weSA9IFZpcnRDb3BpZXNbaV07CisgICAgYm9vbCBBZ2FpbiA9IGZhbHNlOworICAgIGlmICghSm9pbkNvcHkoVGhlQ29weSwgQWdhaW4pKQorICAgICAgaWYgKEFnYWluKQorICAgICAgICBUcnlBZ2Fpbi5wdXNoX2JhY2soVGhlQ29weSk7CisgIH0KK30KKwordm9pZCBTaW1wbGVSZWdpc3RlckNvYWxlc2Npbmc6OmpvaW5JbnRlcnZhbHMoKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiKioqKioqKioqKiBKT0lOSU5HIElOVEVSVkFMUyAqKioqKioqKioqKlxuIik7CisKKyAgc3RkOjp2ZWN0b3I8Q29weVJlYz4gVHJ5QWdhaW5MaXN0OworICBpZiAobG9vcEluZm8tPmVtcHR5KCkpIHsKKyAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbG9vcHMgaW4gdGhlIGZ1bmN0aW9uLCBqb2luIGludGVydmFscyBpbiBmdW5jdGlvbiBvcmRlci4KKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IG1mXy0+YmVnaW4oKSwgRSA9IG1mXy0+ZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIENvcHlDb2FsZXNjZUluTUJCKEksIFRyeUFnYWluTGlzdCk7CisgIH0gZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlLCBqb2luIGludGVydmFscyBpbiBpbm5lciBsb29wcyBiZWZvcmUgb3RoZXIgaW50ZXJ2YWxzLgorICAgIC8vIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QganVzdCBpdGVyYXRlIG92ZXIgbG9vcCBoaWVyYXJjaHkgaGVyZSBiZWNhdXNlCisgICAgLy8gdGhlcmUgbWF5IGJlIG1vcmUgTUJCJ3MgdGhhbiBCQidzLiAgQ29sbGVjdCBNQkIncyBmb3Igc29ydGluZy4KKworICAgIC8vIEpvaW4gaW50ZXJ2YWxzIGluIHRoZSBmdW5jdGlvbiBwcm9sb2cgZmlyc3QuIFdlIHdhbnQgdG8gam9pbiBwaHlzaWNhbAorICAgIC8vIHJlZ2lzdGVycyB3aXRoIHZpcnR1YWwgcmVnaXN0ZXJzIGJlZm9yZSB0aGUgaW50ZXJ2YWxzIGdvdCB0b28gbG9uZy4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIE1hY2hpbmVCYXNpY0Jsb2NrKj4gPiBNQkJzOworICAgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gbWZfLT5iZWdpbigpLCBFID0gbWZfLT5lbmQoKTtJICE9IEU7KytJKXsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBJOworICAgICAgTUJCcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobG9vcEluZm8tPmdldExvb3BEZXB0aChNQkIpLCBJKSk7CisgICAgfQorCisgICAgLy8gU29ydCBieSBsb29wIGRlcHRoLgorICAgIHN0ZDo6c29ydChNQkJzLmJlZ2luKCksIE1CQnMuZW5kKCksIERlcHRoTUJCQ29tcGFyZSgpKTsKKworICAgIC8vIEZpbmFsbHksIGpvaW4gaW50ZXJ2YWxzIGluIGxvb3AgbmVzdCBvcmRlci4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUJCcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgQ29weUNvYWxlc2NlSW5NQkIoTUJCc1tpXS5zZWNvbmQsIFRyeUFnYWluTGlzdCk7CisgIH0KKworICAvLyBKb2luaW5nIGludGVydmFscyBjYW4gYWxsb3cgb3RoZXIgaW50ZXJ2YWxzIHRvIGJlIGpvaW5lZC4gIEl0ZXJhdGl2ZWx5IGpvaW4KKyAgLy8gdW50aWwgd2UgbWFrZSBubyBwcm9ncmVzcy4KKyAgYm9vbCBQcm9ncmVzc01hZGUgPSB0cnVlOworICB3aGlsZSAoUHJvZ3Jlc3NNYWRlKSB7CisgICAgUHJvZ3Jlc3NNYWRlID0gZmFsc2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVHJ5QWdhaW5MaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIENvcHlSZWMgJlRoZUNvcHkgPSBUcnlBZ2Fpbkxpc3RbaV07CisgICAgICBpZiAoIVRoZUNvcHkuTUkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBib29sIEFnYWluID0gZmFsc2U7CisgICAgICBib29sIFN1Y2Nlc3MgPSBKb2luQ29weShUaGVDb3B5LCBBZ2Fpbik7CisgICAgICBpZiAoU3VjY2VzcyB8fCAhQWdhaW4pIHsKKyAgICAgICAgVGhlQ29weS5NSSA9IDA7ICAgLy8gTWFyayB0aGlzIG9uZSBhcyBkb25lLgorICAgICAgICBQcm9ncmVzc01hZGUgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHR3byBzcGVjaWZpZWQgcmVnaXN0ZXJzIGJlbG9uZyB0byBkaWZmZXJlbnQgcmVnaXN0ZXIKKy8vLyBjbGFzc2VzLiAgVGhlIHJlZ2lzdGVycyBtYXkgYmUgZWl0aGVyIHBoeXMgb3IgdmlydCByZWdzLgorYm9vbAorU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nOjpkaWZmZXJpbmdSZWdpc3RlckNsYXNzZXModW5zaWduZWQgUmVnQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZ0IpIGNvbnN0IHsKKyAgLy8gR2V0IHRoZSByZWdpc3RlciBjbGFzc2VzIGZvciB0aGUgZmlyc3QgcmVnLgorICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnQSkpIHsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWdCKSAmJgorICAgICAgICAgICAiU2hvdWxkbid0IGNvbnNpZGVyIHR3byBwaHlzcmVncyEiKTsKKyAgICByZXR1cm4gIW1yaV8tPmdldFJlZ0NsYXNzKFJlZ0IpLT5jb250YWlucyhSZWdBKTsKKyAgfQorCisgIC8vIENvbXBhcmUgYWdhaW5zdCB0aGUgcmVnY2xhc3MgZm9yIHRoZSBzZWNvbmQgcmVnLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSZWdDbGFzc0EgPSBtcmlfLT5nZXRSZWdDbGFzcyhSZWdBKTsKKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUmVnQikpIHsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSZWdDbGFzc0IgPSBtcmlfLT5nZXRSZWdDbGFzcyhSZWdCKTsKKyAgICByZXR1cm4gUmVnQ2xhc3NBICE9IFJlZ0NsYXNzQjsKKyAgfQorICByZXR1cm4gIVJlZ0NsYXNzQS0+Y29udGFpbnMoUmVnQik7Cit9CisKKy8vLyBsYXN0UmVnaXN0ZXJVc2UgLSBSZXR1cm5zIHRoZSBsYXN0IChub24tZGVidWcpIHVzZSBvZiB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIKKy8vLyBiZXR3ZWVuIGN5Y2xlcyBTdGFydCBhbmQgRW5kIG9yIE5VTEwgaWYgdGhlcmUgYXJlIG5vIHVzZXMuCitNYWNoaW5lT3BlcmFuZCAqCitTaW1wbGVSZWdpc3RlckNvYWxlc2Npbmc6Omxhc3RSZWdpc3RlclVzZShTbG90SW5kZXggU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4ICZVc2VJZHgpIGNvbnN0eworICBVc2VJZHggPSBTbG90SW5kZXgoKTsKKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUmVnKSkgeworICAgIE1hY2hpbmVPcGVyYW5kICpMYXN0VXNlID0gTlVMTDsKKyAgICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9ub2RiZ19pdGVyYXRvciBJID0gbXJpXy0+dXNlX25vZGJnX2JlZ2luKFJlZyksCisgICAgICAgICAgIEUgPSBtcmlfLT51c2Vfbm9kYmdfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmVXNlID0gSS5nZXRPcGVyYW5kKCk7CisgICAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gVXNlLmdldFBhcmVudCgpOworICAgICAgaWYgKFVzZU1JLT5pc0lkZW50aXR5Q29weSgpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIFNsb3RJbmRleCBJZHggPSBsaV8tPmdldEluc3RydWN0aW9uSW5kZXgoVXNlTUkpOworICAgICAgLy8gRklYTUU6IFNob3VsZCB0aGlzIGJlIElkeCAhPSBVc2VJZHg/IFNsb3RJbmRleCgpIHdpbGwgcmV0dXJuIHNvbWV0aGluZworICAgICAgLy8gdGhhdCBjb21wYXJlcyBoaWdoZXIgdGhhbiBhbnkgb3RoZXIgaW50ZXJ2YWwuCisgICAgICBpZiAoSWR4ID49IFN0YXJ0ICYmIElkeCA8IEVuZCAmJiBJZHggPj0gVXNlSWR4KSB7CisgICAgICAgIExhc3RVc2UgPSAmVXNlOworICAgICAgICBVc2VJZHggPSBJZHguZ2V0VXNlSW5kZXgoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIExhc3RVc2U7CisgIH0KKworICBTbG90SW5kZXggcyA9IFN0YXJ0OworICBTbG90SW5kZXggZSA9IEVuZC5nZXRQcmV2U2xvdCgpLmdldEJhc2VJbmRleCgpOworICB3aGlsZSAoZSA+PSBzKSB7CisgICAgLy8gU2tpcCBkZWxldGVkIGluc3RydWN0aW9ucworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBsaV8tPmdldEluc3RydWN0aW9uRnJvbUluZGV4KGUpOworICAgIHdoaWxlIChlICE9IFNsb3RJbmRleCgpICYmIGUuZ2V0UHJldkluZGV4KCkgPj0gcyAmJiAhTUkpIHsKKyAgICAgIGUgPSBlLmdldFByZXZJbmRleCgpOworICAgICAgTUkgPSBsaV8tPmdldEluc3RydWN0aW9uRnJvbUluZGV4KGUpOworICAgIH0KKyAgICBpZiAoZSA8IHMgfHwgTUkgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gSWdub3JlIGlkZW50aXR5IGNvcGllcy4KKyAgICBpZiAoIU1JLT5pc0lkZW50aXR5Q29weSgpKQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgTnVtT3BzID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICAgICAgTWFjaGluZU9wZXJhbmQgJlVzZSA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgICBpZiAoVXNlLmlzUmVnKCkgJiYgVXNlLmlzVXNlKCkgJiYgVXNlLmdldFJlZygpICYmCisgICAgICAgICAgICB0cmlfLT5yZWdzT3ZlcmxhcChVc2UuZ2V0UmVnKCksIFJlZykpIHsKKyAgICAgICAgICBVc2VJZHggPSBlLmdldFVzZUluZGV4KCk7CisgICAgICAgICAgcmV0dXJuICZVc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIGUgPSBlLmdldFByZXZJbmRleCgpOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nOjpyZWxlYXNlTWVtb3J5KCkgeworICBKb2luZWRDb3BpZXMuY2xlYXIoKTsKKyAgUmVNYXRDb3BpZXMuY2xlYXIoKTsKKyAgUmVNYXREZWZzLmNsZWFyKCk7Cit9CisKK2Jvb2wgU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJmZuKSB7CisgIG1mXyA9ICZmbjsKKyAgbXJpXyA9ICZmbi5nZXRSZWdJbmZvKCk7CisgIHRtXyA9ICZmbi5nZXRUYXJnZXQoKTsKKyAgdHJpXyA9IHRtXy0+Z2V0UmVnaXN0ZXJJbmZvKCk7CisgIHRpaV8gPSB0bV8tPmdldEluc3RySW5mbygpOworICBsaV8gPSAmZ2V0QW5hbHlzaXM8TGl2ZUludGVydmFscz4oKTsKKyAgQUEgPSAmZ2V0QW5hbHlzaXM8QWxpYXNBbmFseXNpcz4oKTsKKyAgbG9vcEluZm8gPSAmZ2V0QW5hbHlzaXM8TWFjaGluZUxvb3BJbmZvPigpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiKioqKioqKioqKiBTSU1QTEUgUkVHSVNURVIgQ09BTEVTQ0lORyAqKioqKioqKioqXG4iCisgICAgICAgICAgICAgICA8PCAiKioqKioqKioqKiBGdW5jdGlvbjogIgorICAgICAgICAgICAgICAgPDwgKChWYWx1ZSopbWZfLT5nZXRGdW5jdGlvbigpKS0+Z2V0TmFtZSgpIDw8ICdcbicpOworCisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjpyZWdjbGFzc19pdGVyYXRvciBJID0gdHJpXy0+cmVnY2xhc3NfYmVnaW4oKSwKKyAgICAgICAgIEUgPSB0cmlfLT5yZWdjbGFzc19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgYWxsb2NhdGFibGVSQ1JlZ3NfLmluc2VydChzdGQ6Om1ha2VfcGFpcigqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaV8tPmdldEFsbG9jYXRhYmxlU2V0KGZuLCAqSSkpKTsKKworICAvLyBKb2luIChjb2FsZXNjZSkgaW50ZXJ2YWxzIGlmIHJlcXVlc3RlZC4KKyAgaWYgKEVuYWJsZUpvaW5pbmcpIHsKKyAgICBqb2luSW50ZXJ2YWxzKCk7CisgICAgREVCVUcoeworICAgICAgICBkYmdzKCkgPDwgIioqKioqKioqKiogSU5URVJWQUxTIFBPU1QgSk9JTklORyAqKioqKioqKioqXG4iOworICAgICAgICBmb3IgKExpdmVJbnRlcnZhbHM6Oml0ZXJhdG9yIEkgPSBsaV8tPmJlZ2luKCksIEUgPSBsaV8tPmVuZCgpOworICAgICAgICAgICAgIEkgIT0gRTsgKytJKXsKKyAgICAgICAgICBJLT5zZWNvbmQtPnByaW50KGRiZ3MoKSwgdHJpXyk7CisgICAgICAgICAgZGJncygpIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICAgIH0pOworICB9CisKKyAgLy8gUGVyZm9ybSBhIGZpbmFsIHBhc3Mgb3ZlciB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCBjb21wdXRlIHNwaWxsIHdlaWdodHMKKyAgLy8gYW5kIHJlbW92ZSBpZGVudGl0eSBtb3Zlcy4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IERlYWREZWZzOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgbWJiaSA9IG1mXy0+YmVnaW4oKSwgbWJiZSA9IG1mXy0+ZW5kKCk7CisgICAgICAgbWJiaSAhPSBtYmJlOyArK21iYmkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogbWJiID0gbWJiaTsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBtaWkgPSBtYmItPmJlZ2luKCksIG1pZSA9IG1iYi0+ZW5kKCk7CisgICAgICAgICBtaWkgIT0gbWllOyApIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBtaWk7CisgICAgICBpZiAoSm9pbmVkQ29waWVzLmNvdW50KE1JKSkgeworICAgICAgICAvLyBEZWxldGUgYWxsIGNvYWxlc2NlZCBjb3BpZXMuCisgICAgICAgIGJvb2wgRG9EZWxldGUgPSB0cnVlOworICAgICAgICBhc3NlcnQoTUktPmlzQ29weUxpa2UoKSAmJiAiVW5yZWNvZ25pemVkIGNvcHkgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgICAgdW5zaWduZWQgU3JjUmVnID0gTUktPmdldE9wZXJhbmQoTUktPmlzU3VicmVnVG9SZWcoKSA/IDIgOiAxKS5nZXRSZWcoKTsKKyAgICAgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFNyY1JlZykgJiYKKyAgICAgICAgICAgIE1JLT5nZXROdW1PcGVyYW5kcygpID4gMikKKyAgICAgICAgICAvLyBEbyBub3QgZGVsZXRlIGV4dHJhY3Rfc3VicmVnLCBpbnNlcnRfc3VicmVnIG9mIHBoeXNpY2FsCisgICAgICAgICAgLy8gcmVnaXN0ZXJzIHVubGVzcyB0aGUgZGVmaW5pdGlvbiBpcyBkZWFkLiBlLmcuCisgICAgICAgICAgLy8gJURPPGRlZj4gPSBJTlNFUlRfU1VCUkVHICVEMDx1bmRlZj4sICVTMDxraWxsPiwgMQorICAgICAgICAgIC8vIG9yIGVsc2UgdGhlIHNjYXZlbmdlciBtYXkgY29tcGxhaW4uIExvd2VyU3VicmVncyB3aWxsCisgICAgICAgICAgLy8gZGVsZXRlIHRoZW0gbGF0ZXIuCisgICAgICAgICAgRG9EZWxldGUgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIGlmIChNSS0+YWxsRGVmc0FyZURlYWQoKSkgeworICAgICAgICAgIExpdmVJbnRlcnZhbCAmbGkgPSBsaV8tPmdldEludGVydmFsKFNyY1JlZyk7CisgICAgICAgICAgaWYgKCFTaG9ydGVuRGVhZENvcHlTcmNMaXZlUmFuZ2UobGksIE1JKSkKKyAgICAgICAgICAgIFNob3J0ZW5EZWFkQ29weUxpdmVSYW5nZShsaSwgTUkpOworICAgICAgICAgIERvRGVsZXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIURvRGVsZXRlKSB7CisgICAgICAgICAgLy8gV2UgbmVlZCB0aGUgaW5zdHJ1Y3Rpb24gdG8gYWRqdXN0IGxpdmVuZXNzLCBzbyBtYWtlIGl0IGEgS0lMTC4KKyAgICAgICAgICBpZiAoTUktPmlzU3VicmVnVG9SZWcoKSkgeworICAgICAgICAgICAgTUktPlJlbW92ZU9wZXJhbmQoMyk7CisgICAgICAgICAgICBNSS0+UmVtb3ZlT3BlcmFuZCgxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgTUktPnNldERlc2ModGlpXy0+Z2V0KFRhcmdldE9wY29kZTo6S0lMTCkpOworICAgICAgICAgIG1paSA9IGxsdm06Om5leHQobWlpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsaV8tPlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKE1JKTsKKyAgICAgICAgICBtaWkgPSBtYmJpLT5lcmFzZShtaWkpOworICAgICAgICAgICsrbnVtUGVlcDsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gTm93IGNoZWNrIGlmIHRoaXMgaXMgYSByZW1hdCdlZCBkZWYgaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbm93IGRlYWQuCisgICAgICBpZiAoUmVNYXREZWZzLmNvdW50KE1JKSkgeworICAgICAgICBib29sIGlzRGVhZCA9IHRydWU7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgICBpZiAoIU1PLmlzUmVnKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgICAgICBpZiAoIVJlZykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZykpCisgICAgICAgICAgICBEZWFkRGVmcy5wdXNoX2JhY2soUmVnKTsKKyAgICAgICAgICBpZiAoTU8uaXNEZWFkKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSB8fAorICAgICAgICAgICAgICAhbXJpXy0+dXNlX25vZGJnX2VtcHR5KFJlZykpIHsKKyAgICAgICAgICAgIGlzRGVhZCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc0RlYWQpIHsKKyAgICAgICAgICB3aGlsZSAoIURlYWREZWZzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIERlYWREZWYgPSBEZWFkRGVmcy5iYWNrKCk7CisgICAgICAgICAgICBEZWFkRGVmcy5wb3BfYmFjaygpOworICAgICAgICAgICAgUmVtb3ZlRGVhZERlZihsaV8tPmdldEludGVydmFsKERlYWREZWYpLCBNSSk7CisgICAgICAgICAgfQorICAgICAgICAgIGxpXy0+UmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMobWlpKTsKKyAgICAgICAgICBtaWkgPSBtYmJpLT5lcmFzZShtaWkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBEZWFkRGVmcy5jbGVhcigpOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGUgbW92ZSB3aWxsIGJlIGFuIGlkZW50aXR5IG1vdmUgZGVsZXRlIGl0CisgICAgICBpZiAoTUktPmlzSWRlbnRpdHlDb3B5KCkpIHsKKyAgICAgICAgdW5zaWduZWQgU3JjUmVnID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICAgIGlmIChsaV8tPmhhc0ludGVydmFsKFNyY1JlZykpIHsKKyAgICAgICAgICBMaXZlSW50ZXJ2YWwgJlJlZ0ludCA9IGxpXy0+Z2V0SW50ZXJ2YWwoU3JjUmVnKTsKKyAgICAgICAgICAvLyBJZiBkZWYgb2YgdGhpcyBtb3ZlIGluc3RydWN0aW9uIGlzIGRlYWQsIHJlbW92ZSBpdHMgbGl2ZSByYW5nZQorICAgICAgICAgIC8vIGZyb20gdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyJ3MgbGl2ZSBpbnRlcnZhbC4KKyAgICAgICAgICBpZiAoTUktPmFsbERlZnNBcmVEZWFkKCkpIHsKKyAgICAgICAgICAgIGlmICghU2hvcnRlbkRlYWRDb3B5U3JjTGl2ZVJhbmdlKFJlZ0ludCwgTUkpKQorICAgICAgICAgICAgICBTaG9ydGVuRGVhZENvcHlMaXZlUmFuZ2UoUmVnSW50LCBNSSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxpXy0+UmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoTUkpOworICAgICAgICBtaWkgPSBtYmJpLT5lcmFzZShtaWkpOworICAgICAgICArK251bVBlZXA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICArK21paTsKKworICAgICAgLy8gQ2hlY2sgZm9yIG5vdyB1bm5lY2Vzc2FyeSBraWxsIGZsYWdzLgorICAgICAgaWYgKGxpXy0+aXNOb3RJbk1JTWFwKE1JKSkgY29udGludWU7CisgICAgICBTbG90SW5kZXggRGVmSWR4ID0gbGlfLT5nZXRJbnN0cnVjdGlvbkluZGV4KE1JKS5nZXREZWZJbmRleCgpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc0tpbGwoKSkgY29udGludWU7CisgICAgICAgIHVuc2lnbmVkIHJlZyA9IE1PLmdldFJlZygpOworICAgICAgICBpZiAoIXJlZyB8fCAhbGlfLT5oYXNJbnRlcnZhbChyZWcpKSBjb250aW51ZTsKKyAgICAgICAgaWYgKCFsaV8tPmdldEludGVydmFsKHJlZykua2lsbGVkQXQoRGVmSWR4KSkKKyAgICAgICAgICBNTy5zZXRJc0tpbGwoZmFsc2UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIERFQlVHKGR1bXAoKSk7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gcHJpbnQgLSBJbXBsZW1lbnQgdGhlIGR1bXAgbWV0aG9kLgordm9pZCBTaW1wbGVSZWdpc3RlckNvYWxlc2Npbmc6OnByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUqIG0pIGNvbnN0IHsKKyAgIGxpXy0+cHJpbnQoTywgbSk7Cit9CisKK1JlZ2lzdGVyQ29hbGVzY2VyKiBsbHZtOjpjcmVhdGVTaW1wbGVSZWdpc3RlckNvYWxlc2NlcigpIHsKKyAgcmV0dXJuIG5ldyBTaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcoKTsKK30KKworLy8gTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgdGhhdCB1c2VzIFJlZ2lzdGVyQ29hbGVzY2VyIHB1bGxzIGluIHRoaXMgZmlsZS4uLgorREVGSU5JTkdfRklMRV9GT1IoU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTViZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nLmgKQEAgLTAsMCArMSwxODggQEAKKy8vPT09LS0gU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nLmggLSBSZWdpc3RlciBDb2FsZXNjaW5nIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBzaW1wbGUgcmVnaXN0ZXIgY29weSBjb2FsZXNjaW5nIHBoYXNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NJTVBMRV9SRUdJU1RFUl9DT0FMRVNDSU5HX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NJTVBMRV9SRUdJU1RFUl9DT0FMRVNDSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbEFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1JlZ2lzdGVyQ29hbGVzY2VyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nOworICBjbGFzcyBMaXZlVmFyaWFibGVzOworICBjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisgIGNsYXNzIFRhcmdldEluc3RySW5mbzsKKyAgY2xhc3MgVmlydFJlZ01hcDsKKyAgY2xhc3MgTWFjaGluZUxvb3BJbmZvOworCisgIC8vLyBDb3B5UmVjIC0gUmVwcmVzZW50YXRpb24gZm9yIGNvcHkgaW5zdHJ1Y3Rpb25zIGluIGNvYWxlc2NlciBxdWV1ZS4KKyAgLy8vCisgIHN0cnVjdCBDb3B5UmVjIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JOworICAgIHVuc2lnbmVkIExvb3BEZXB0aDsKKyAgICBDb3B5UmVjKE1hY2hpbmVJbnN0ciAqbWksIHVuc2lnbmVkIGRlcHRoKQorICAgICAgOiBNSShtaSksIExvb3BEZXB0aChkZXB0aCkge30KKyAgfTsKKworICBjbGFzcyBTaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlZ2lzdGVyQ29hbGVzY2VyIHsKKyAgICBNYWNoaW5lRnVuY3Rpb24qIG1mXzsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvKiBtcmlfOworICAgIGNvbnN0IFRhcmdldE1hY2hpbmUqIHRtXzsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8qIHRyaV87CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvKiB0aWlfOworICAgIExpdmVJbnRlcnZhbHMgKmxpXzsKKyAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8qIGxvb3BJbmZvOworICAgIEFsaWFzQW5hbHlzaXMgKkFBOworICAgIAorICAgIERlbnNlTWFwPGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqLCBCaXRWZWN0b3I+IGFsbG9jYXRhYmxlUkNSZWdzXzsKKworICAgIC8vLyBKb2luZWRDb3BpZXMgLSBLZWVwIHRyYWNrIG9mIGNvcGllcyBlbGltaW5hdGVkIGR1ZSB0byBjb2FsZXNjaW5nLgorICAgIC8vLworICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciosIDMyPiBKb2luZWRDb3BpZXM7CisKKyAgICAvLy8gUmVNYXRDb3BpZXMgLSBLZWVwIHRyYWNrIG9mIGNvcGllcyBlbGltaW5hdGVkIGR1ZSB0byByZW1hdC4KKyAgICAvLy8KKyAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCAzMj4gUmVNYXRDb3BpZXM7CisKKyAgICAvLy8gUmVNYXREZWZzIC0gS2VlcCB0cmFjayBvZiBkZWZpbml0aW9uIGluc3RydWN0aW9ucyB3aGljaCBoYXZlCisgICAgLy8vIGJlZW4gcmVtYXQnZWQuCisgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgOD4gUmVNYXREZWZzOworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgc3RydWN0IEluc3RyU2xvdHMgeworICAgICAgZW51bSB7CisgICAgICAgIExPQUQgID0gMCwKKyAgICAgICAgVVNFICAgPSAxLAorICAgICAgICBERUYgICA9IDIsCisgICAgICAgIFNUT1JFID0gMywKKyAgICAgICAgTlVNICAgPSA0CisgICAgICB9OworICAgIH07CisgICAgCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisKKyAgICAvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24gLSBwYXNzIGVudHJ5IHBvaW50CisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiYpOworCisgICAgYm9vbCBjb2FsZXNjZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmbWYsIFJlZ2FsbG9jUXVlcnkgJikgeworICAgICAgLy8gVGhpcyBydW5zIGFzIGFuIGluZGVwZW5kZW50IHBhc3MsIHNvIGRvbid0IGRvIGFueXRoaW5nLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyBwcmludCAtIEltcGxlbWVudCB0aGUgZHVtcCBtZXRob2QuCisgICAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUqID0gMCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gam9pbkludGVydmFscyAtIGpvaW4gY29tcGF0aWJsZSBsaXZlIGludGVydmFscworICAgIHZvaWQgam9pbkludGVydmFscygpOworCisgICAgLy8vIENvcHlDb2FsZXNjZUluTUJCIC0gQ29hbGVzY2UgY29waWVzIGluIHRoZSBzcGVjaWZpZWQgTUJCLCBwdXR0aW5nCisgICAgLy8vIGNvcGllcyB0aGF0IGNhbm5vdCB5ZXQgYmUgY29hbGVzY2VkIGludG8gdGhlICJUcnlBZ2FpbiIgbGlzdC4KKyAgICB2b2lkIENvcHlDb2FsZXNjZUluTUJCKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb3B5UmVjPiAmVHJ5QWdhaW4pOworCisgICAgLy8vIEpvaW5Db3B5IC0gQXR0ZW1wdCB0byBqb2luIGludGVydmFscyBjb3JyZXNwb25kaW5nIHRvIFNyY1JlZy9Ec3RSZWcsCisgICAgLy8vIHdoaWNoIGFyZSB0aGUgc3JjL2RzdCBvZiB0aGUgY29weSBpbnN0cnVjdGlvbiBDb3B5TUkuICBUaGlzIHJldHVybnMgdHJ1ZQorICAgIC8vLyBpZiB0aGUgY29weSB3YXMgc3VjY2Vzc2Z1bGx5IGNvYWxlc2NlZCBhd2F5LiBJZiBpdCBpcyBub3QgY3VycmVudGx5CisgICAgLy8vIHBvc3NpYmxlIHRvIGNvYWxlc2NlIHRoaXMgaW50ZXJ2YWwsIGJ1dCBpdCBtYXkgYmUgcG9zc2libGUgaWYgb3RoZXIKKyAgICAvLy8gdGhpbmdzIGdldCBjb2FsZXNjZWQsIHRoZW4gaXQgcmV0dXJucyB0cnVlIGJ5IHJlZmVyZW5jZSBpbiAnQWdhaW4nLgorICAgIGJvb2wgSm9pbkNvcHkoQ29weVJlYyAmVGhlQ29weSwgYm9vbCAmQWdhaW4pOworCisgICAgLy8vIEpvaW5JbnRlcnZhbHMgLSBBdHRlbXB0IHRvIGpvaW4gdGhlc2UgdHdvIGludGVydmFscy4gIE9uIGZhaWx1cmUsIHRoaXMKKyAgICAvLy8gcmV0dXJucyBmYWxzZS4gIFRoZSBvdXRwdXQgIlNyY0ludCIgd2lsbCBub3QgaGF2ZSBiZWVuIG1vZGlmaWVkLCBzbyB3ZSBjYW4KKyAgICAvLy8gdXNlIHRoaXMgaW5mb3JtYXRpb24gYmVsb3cgdG8gdXBkYXRlIGFsaWFzZXMuCisgICAgYm9vbCBKb2luSW50ZXJ2YWxzKENvYWxlc2NlclBhaXIgJkNQKTsKKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIHNwZWNpZmllZCByZWdpc3RlcnMgYmVsb25nIHRvIGRpZmZlcmVudCByZWdpc3RlcgorICAgIC8vLyBjbGFzc2VzLiAgVGhlIHJlZ2lzdGVycyBtYXkgYmUgZWl0aGVyIHBoeXMgb3IgdmlydCByZWdzLgorICAgIGJvb2wgZGlmZmVyaW5nUmVnaXN0ZXJDbGFzc2VzKHVuc2lnbmVkIFJlZ0EsIHVuc2lnbmVkIFJlZ0IpIGNvbnN0OworCisgICAgLy8vIEFkanVzdENvcGllc0JhY2tGcm9tIC0gV2UgZm91bmQgYSBub24tdHJpdmlhbGx5LWNvYWxlc2NhYmxlIGNvcHkuIElmCisgICAgLy8vIHRoZSBzb3VyY2UgdmFsdWUgbnVtYmVyIGlzIGRlZmluZWQgYnkgYSBjb3B5IGZyb20gdGhlIGRlc3RpbmF0aW9uIHJlZworICAgIC8vLyBzZWUgaWYgd2UgY2FuIG1lcmdlIHRoZXNlIHR3byBkZXN0aW5hdGlvbiByZWcgdmFsbm8jIGludG8gYSBzaW5nbGUKKyAgICAvLy8gdmFsdWUgbnVtYmVyLCBlbGltaW5hdGluZyBhIGNvcHkuCisgICAgYm9vbCBBZGp1c3RDb3BpZXNCYWNrRnJvbShjb25zdCBDb2FsZXNjZXJQYWlyICZDUCwgTWFjaGluZUluc3RyICpDb3B5TUkpOworCisgICAgLy8vIEhhc090aGVyUmVhY2hpbmdEZWZzIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGRlZmluaXRpb25zIG9mIEludEIKKyAgICAvLy8gb3RoZXIgdGhhbiBCVmFsTm8gdmFsIyB0aGF0IGNhbiByZWFjaCB1c2VzIG9mIEFWYWxubyB2YWwjIG9mIEludEEuCisgICAgYm9vbCBIYXNPdGhlclJlYWNoaW5nRGVmcyhMaXZlSW50ZXJ2YWwgJkludEEsIExpdmVJbnRlcnZhbCAmSW50QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOSW5mbyAqQVZhbE5vLCBWTkluZm8gKkJWYWxObyk7CisKKyAgICAvLy8gUmVtb3ZlQ29weUJ5Q29tbXV0aW5nRGVmIC0gV2UgZm91bmQgYSBub24tdHJpdmlhbGx5LWNvYWxlc2NhYmxlIGNvcHkuCisgICAgLy8vIElmIHRoZSBzb3VyY2UgdmFsdWUgbnVtYmVyIGlzIGRlZmluZWQgYnkgYSBjb21tdXRhYmxlIGluc3RydWN0aW9uIGFuZAorICAgIC8vLyBpdHMgb3RoZXIgb3BlcmFuZCBpcyBjb2FsZXNjZWQgdG8gdGhlIGNvcHkgZGVzdCByZWdpc3Rlciwgc2VlIGlmIHdlCisgICAgLy8vIGNhbiB0cmFuc2Zvcm0gdGhlIGNvcHkgaW50byBhIG5vb3AgYnkgY29tbXV0aW5nIHRoZSBkZWZpbml0aW9uLgorICAgIGJvb2wgUmVtb3ZlQ29weUJ5Q29tbXV0aW5nRGVmKGNvbnN0IENvYWxlc2NlclBhaXIgJkNQLE1hY2hpbmVJbnN0ciAqQ29weU1JKTsKKworICAgIC8vLyBUcmltTGl2ZUludGVydmFsVG9MYXN0VXNlIC0gSWYgdGhlcmUgaXMgYSBsYXN0IHVzZSBpbiB0aGUgc2FtZSBiYXNpYworICAgIC8vLyBibG9jayBhcyB0aGUgY29weSBpbnN0cnVjdGlvbiwgdHJpbSB0aGUgaXZlIGludGVydmFsIHRvIHRoZSBsYXN0IHVzZQorICAgIC8vLyBhbmQgcmV0dXJuIHRydWUuCisgICAgYm9vbCBUcmltTGl2ZUludGVydmFsVG9MYXN0VXNlKFNsb3RJbmRleCBDb3B5SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQ29weU1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFsICZsaSwgY29uc3QgTGl2ZVJhbmdlICpMUik7CisKKyAgICAvLy8gUmVNYXRlcmlhbGl6ZVRyaXZpYWxEZWYgLSBJZiB0aGUgc291cmNlIG9mIGEgY29weSBpcyBkZWZpbmVkIGJ5IGEgdHJpdmlhbAorICAgIC8vLyBjb21wdXRhdGlvbiwgcmVwbGFjZSB0aGUgY29weSBieSByZW1hdGVyaWFsaXplIHRoZSBkZWZpbml0aW9uLgorICAgIGJvb2wgUmVNYXRlcmlhbGl6ZVRyaXZpYWxEZWYoTGl2ZUludGVydmFsICZTcmNJbnQsIHVuc2lnbmVkIERzdFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdFN1YklkeCwgTWFjaGluZUluc3RyICpDb3B5TUkpOworCisgICAgLy8vIGlzV2luVG9Kb2luQ3Jvc3NDbGFzcyAtIFJldHVybiB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byBjb2FsZXNjZQorICAgIC8vLyB0d28gdmlydHVhbCByZWdpc3RlcnMgZnJvbSBkaWZmZXJlbnQgcmVnaXN0ZXIgY2xhc3Nlcy4KKyAgICBib29sIGlzV2luVG9Kb2luQ3Jvc3NDbGFzcyh1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRHN0UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlNyY1JDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkRzdFJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKk5ld1JDKTsKKworICAgIC8vLyBVcGRhdGVSZWdEZWZzVXNlcyAtIFJlcGxhY2UgYWxsIGRlZnMgYW5kIHVzZXMgb2YgU3JjUmVnIHRvIERzdFJlZyBhbmQKKyAgICAvLy8gdXBkYXRlIHRoZSBzdWJyZWdpc3RlciBudW1iZXIgaWYgaXQgaXMgbm90IHplcm8uIElmIERzdFJlZyBpcyBhCisgICAgLy8vIHBoeXNpY2FsIHJlZ2lzdGVyIGFuZCB0aGUgZXhpc3Rpbmcgc3VicmVnaXN0ZXIgbnVtYmVyIG9mIHRoZSBkZWYgLyB1c2UKKyAgICAvLy8gYmVpbmcgdXBkYXRlZCBpcyBub3QgemVybywgbWFrZSBzdXJlIHRvIHNldCBpdCB0byB0aGUgY29ycmVjdCBwaHlzaWNhbAorICAgIC8vLyBzdWJyZWdpc3Rlci4KKyAgICB2b2lkIFVwZGF0ZVJlZ0RlZnNVc2VzKGNvbnN0IENvYWxlc2NlclBhaXIgJkNQKTsKKworICAgIC8vLyBTaG9ydGVuRGVhZENvcHlMaXZlUmFuZ2UgLSBTaG9ydGVuIGEgbGl2ZSByYW5nZSBkZWZpbmVkIGJ5IGEgZGVhZCBjb3B5LgorICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBsaXZlIGludGVydmFsIGlzIHJlbW92ZWQuCisgICAgYm9vbCBTaG9ydGVuRGVhZENvcHlMaXZlUmFuZ2UoTGl2ZUludGVydmFsICZsaSwgTWFjaGluZUluc3RyICpDb3B5TUkpOworCisgICAgLy8vIFNob3J0ZW5EZWFkQ29weUxpdmVSYW5nZSAtIFNob3J0ZW4gYSBsaXZlIHJhbmdlIGFzIGl0J3MgYXJ0aWZpY2lhbGx5CisgICAgLy8vIGV4dGVuZGVkIGJ5IGEgZGVhZCBjb3B5LiBNYXJrIHRoZSBsYXN0IHVzZSAoaWYgYW55KSBvZiB0aGUgdmFsIyBhcyBraWxsCisgICAgLy8vIGFzIGVuZHMgdGhlIGxpdmUgcmFuZ2UgdGhlcmUuIElmIHRoZXJlIGlzbid0IGFub3RoZXIgdXNlLCB0aGVuIHRoaXMKKyAgICAvLy8gbGl2ZSByYW5nZSBpcyBkZWFkLiBSZXR1cm4gdHJ1ZSBpZiBsaXZlIGludGVydmFsIGlzIHJlbW92ZWQuCisgICAgYm9vbCBTaG9ydGVuRGVhZENvcHlTcmNMaXZlUmFuZ2UoTGl2ZUludGVydmFsICZsaSwgTWFjaGluZUluc3RyICpDb3B5TUkpOworCisgICAgLy8vIFJlbW92ZURlYWREZWYgLSBJZiBhIGRlZiBvZiBhIGxpdmUgaW50ZXJ2YWwgaXMgbm93IGRldGVybWluZWQgZGVhZCwKKyAgICAvLy8gcmVtb3ZlIHRoZSB2YWwjIGl0IGRlZmluZXMuIElmIHRoZSBsaXZlIGludGVydmFsIGJlY29tZXMgZW1wdHksIHJlbW92ZQorICAgIC8vLyBpdCBhcyB3ZWxsLgorICAgIGJvb2wgUmVtb3ZlRGVhZERlZihMaXZlSW50ZXJ2YWwgJmxpLCBNYWNoaW5lSW5zdHIgKkRlZk1JKTsKKworICAgIC8vLyBSZW1vdmVDb3B5RmxhZyAtIElmIERzdFJlZyBpcyBubyBsb25nZXIgZGVmaW5lZCBieSBDb3B5TUksIGNsZWFyIHRoZQorICAgIC8vLyBWTkluZm8gY29weSBmbGFnIGZvciBEc3RSZWcgYW5kIGFsbCBhbGlhc2VzLgorICAgIHZvaWQgUmVtb3ZlQ29weUZsYWcodW5zaWduZWQgRHN0UmVnLCBjb25zdCBNYWNoaW5lSW5zdHIgKkNvcHlNSSk7CisKKyAgICAvLy8gbGFzdFJlZ2lzdGVyVXNlIC0gUmV0dXJucyB0aGUgbGFzdCB1c2Ugb2YgdGhlIHNwZWNpZmljIHJlZ2lzdGVyIGJldHdlZW4KKyAgICAvLy8gY3ljbGVzIFN0YXJ0IGFuZCBFbmQgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbm8gdXNlcy4KKyAgICBNYWNoaW5lT3BlcmFuZCAqbGFzdFJlZ2lzdGVyVXNlKFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywgU2xvdEluZGV4ICZMYXN0VXNlSWR4KSBjb25zdDsKKyAgfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TbG90SW5kZXhlcy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TbG90SW5kZXhlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjMTQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1Nsb3RJbmRleGVzLmNwcApAQCAtMCwwICsxLDIyOSBAQAorLy89PT0tLSBTbG90SW5kZXhlcy5jcHAgLSBTbG90IEluZGV4ZXMgUGFzcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzbG90aW5kZXhlcyIKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworCisvLyBZZXAgLSB0aGVzZSBhcmUgdGhyZWFkIHNhZmUuIFNlZSB0aGUgaGVhZGVyIGZvciBkZXRhaWxzLiAKK25hbWVzcGFjZSB7CisKKworICBjbGFzcyBFbXB0eUluZGV4TGlzdEVudHJ5IDogcHVibGljIEluZGV4TGlzdEVudHJ5IHsKKyAgcHVibGljOgorICAgIEVtcHR5SW5kZXhMaXN0RW50cnkoKSA6IEluZGV4TGlzdEVudHJ5KEVNUFRZX0tFWSkge30KKyAgfTsKKworICBjbGFzcyBUb21ic3RvbmVJbmRleExpc3RFbnRyeSA6IHB1YmxpYyBJbmRleExpc3RFbnRyeSB7CisgIHB1YmxpYzoKKyAgICBUb21ic3RvbmVJbmRleExpc3RFbnRyeSgpIDogSW5kZXhMaXN0RW50cnkoVE9NQlNUT05FX0tFWSkge30KKyAgfTsKKworICAvLyBUaGUgZm9sbG93aW5nIHN0YXRpY3MgYXJlIHRocmVhZCBzYWZlLiBUaGV5J3JlIHJlYWQgb25seSwgYW5kIHlvdQorICAvLyBjYW4ndCBzdGVwIGZyb20gdGhlbSB0byBhbnkgb3RoZXIgbGlzdCBlbnRyaWVzLgorICBNYW5hZ2VkU3RhdGljPEVtcHR5SW5kZXhMaXN0RW50cnk+IEluZGV4TGlzdEVudHJ5RW1wdHlLZXk7CisgIE1hbmFnZWRTdGF0aWM8VG9tYnN0b25lSW5kZXhMaXN0RW50cnk+IEluZGV4TGlzdEVudHJ5VG9tYnN0b25lS2V5OworfQorCitjaGFyIFNsb3RJbmRleGVzOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoU2xvdEluZGV4ZXMsICJzbG90aW5kZXhlcyIsCisgICAgICAgICAgICAgICAgIlNsb3QgaW5kZXggbnVtYmVyaW5nIiwgZmFsc2UsIGZhbHNlKTsKKworSW5kZXhMaXN0RW50cnkqIEluZGV4TGlzdEVudHJ5OjpnZXRFbXB0eUtleUVudHJ5KCkgeworICByZXR1cm4gJipJbmRleExpc3RFbnRyeUVtcHR5S2V5OworfQorCitJbmRleExpc3RFbnRyeSogSW5kZXhMaXN0RW50cnk6OmdldFRvbWJzdG9uZUtleUVudHJ5KCkgeworICByZXR1cm4gJipJbmRleExpc3RFbnRyeVRvbWJzdG9uZUtleTsKK30KKworCit2b2lkIFNsb3RJbmRleGVzOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJmF1KSBjb25zdCB7CisgIGF1LnNldFByZXNlcnZlc0FsbCgpOworICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKGF1KTsKK30KKwordm9pZCBTbG90SW5kZXhlczo6cmVsZWFzZU1lbW9yeSgpIHsKKyAgbWkyaU1hcC5jbGVhcigpOworICBtYmIySWR4TWFwLmNsZWFyKCk7CisgIGlkeDJNQkJNYXAuY2xlYXIoKTsKKyAgdGVybWluYXRvckdhcHMuY2xlYXIoKTsKKyAgY2xlYXJMaXN0KCk7Cit9CisKK2Jvb2wgU2xvdEluZGV4ZXM6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmZm4pIHsKKworICAvLyBDb21wdXRlIG51bWJlcmluZyBhcyBmb2xsb3dzOgorICAvLyBHcmFiIGFuIGl0ZXJhdG9yIHRvIHRoZSBzdGFydCBvZiB0aGUgaW5kZXggbGlzdC4KKyAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBNQkJzLCBhbmQgd2l0aGluIGVhY2ggTUJCIGFsbCBNSXMsIGtlZXBpbmcgdGhlIE1JCisgIC8vIGl0ZXJhdG9yIGluIGxvY2stc3RlcCAodGhvdWdoIHNraXBwaW5nIGl0IG92ZXIgaW5kZXhlcyB3aGljaCBoYXZlCisgIC8vIG51bGwgcG9pbnRlcnMgaW4gdGhlIGluc3RydWN0aW9uIGZpZWxkKS4KKyAgLy8gQXQgZWFjaCBpdGVyYXRpb24gYXNzZXJ0IHRoYXQgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQgdG8gaW4gdGhlIGluZGV4CisgIC8vIGlzIHRoZSBzYW1lIG9uZSBwb2ludGVkIHRvIGJ5IHRoZSBNSSBpdGVyYXRvci4gVGhpcyAKKworICAvLyBGSVhNRTogVGhpcyBjYW4gYmUgc2ltcGxpZmllZC4gVGhlIG1pMmlNYXBfLCBJZHgyTUJCTWFwLCBldGMuIHNob3VsZAorICAvLyBvbmx5IG5lZWQgdG8gYmUgc2V0IHVwIG9uY2UgYWZ0ZXIgdGhlIGZpcnN0IG51bWJlcmluZyBpcyBjb21wdXRlZC4KKworICBtZiA9ICZmbjsKKyAgaW5pdExpc3QoKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBsaXN0IGNvbnRhaW5zIG9ubHkgdGhlIHNlbnRpbmFsLgorICBhc3NlcnQoaW5kZXhMaXN0SGVhZC0+Z2V0TmV4dCgpID09IDAgJiYKKyAgICAgICAgICJJbmRleCBsaXN0IG5vbi1lbXB0eSBhdCBpbml0aWFsIG51bWJlcmluZz8iKTsKKyAgYXNzZXJ0KGlkeDJNQkJNYXAuZW1wdHkoKSAmJgorICAgICAgICAgIkluZGV4IC0+IE1CQiBtYXBwaW5nIG5vbi1lbXB0eSBhdCBpbml0aWFsIG51bWJlcmluZz8iKTsKKyAgYXNzZXJ0KG1iYjJJZHhNYXAuZW1wdHkoKSAmJgorICAgICAgICAgIk1CQiAtPiBJbmRleCBtYXBwaW5nIG5vbi1lbXB0eSBhdCBpbml0aWFsIG51bWJlcmluZz8iKTsKKyAgYXNzZXJ0KG1pMmlNYXAuZW1wdHkoKSAmJgorICAgICAgICAgIk1hY2hpbmVJbnN0ciAtPiBJbmRleCBtYXBwaW5nIG5vbi1lbXB0eSBhdCBpbml0aWFsIG51bWJlcmluZz8iKTsKKworICBmdW5jdGlvblNpemUgPSAwOworICB1bnNpZ25lZCBpbmRleCA9IDA7CisKKyAgcHVzaF9iYWNrKGNyZWF0ZUVudHJ5KDAsIGluZGV4KSk7CisKKyAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBmdW5jdGlvbi4KKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIG1iYkl0ciA9IG1mLT5iZWdpbigpLCBtYmJFbmQgPSBtZi0+ZW5kKCk7CisgICAgICAgbWJiSXRyICE9IG1iYkVuZDsgKyttYmJJdHIpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqbWJiID0gJiptYmJJdHI7CisKKyAgICAvLyBJbnNlcnQgYW4gaW5kZXggZm9yIHRoZSBNQkIgc3RhcnQuCisgICAgU2xvdEluZGV4IGJsb2NrU3RhcnRJbmRleChiYWNrKCksIFNsb3RJbmRleDo6TE9BRCk7CisKKyAgICBpbmRleCArPSBTbG90SW5kZXg6Ok5VTTsKKworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIG1pSXRyID0gbWJiLT5iZWdpbigpLCBtaUVuZCA9IG1iYi0+ZW5kKCk7CisgICAgICAgICBtaUl0ciAhPSBtaUVuZDsgKyttaUl0cikgeworICAgICAgTWFjaGluZUluc3RyICptaSA9IG1pSXRyOworICAgICAgaWYgKG1pLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChtaUl0ciA9PSBtYmItPmdldEZpcnN0VGVybWluYXRvcigpKSB7CisgICAgICAgIHB1c2hfYmFjayhjcmVhdGVFbnRyeSgwLCBpbmRleCkpOworICAgICAgICB0ZXJtaW5hdG9yR2Fwcy5pbnNlcnQoCisgICAgICAgICAgc3RkOjptYWtlX3BhaXIobWJiLCBTbG90SW5kZXgoYmFjaygpLCBTbG90SW5kZXg6OlBISV9CSVQpKSk7CisgICAgICAgIGluZGV4ICs9IFNsb3RJbmRleDo6TlVNOworICAgICAgfQorCisgICAgICAvLyBJbnNlcnQgYSBzdG9yZSBpbmRleCBmb3IgdGhlIGluc3RyLgorICAgICAgcHVzaF9iYWNrKGNyZWF0ZUVudHJ5KG1pLCBpbmRleCkpOworCisgICAgICAvLyBTYXZlIHRoaXMgYmFzZSBpbmRleCBpbiB0aGUgbWFwcy4KKyAgICAgIG1pMmlNYXAuaW5zZXJ0KAorICAgICAgICBzdGQ6Om1ha2VfcGFpcihtaSwgU2xvdEluZGV4KGJhY2soKSwgU2xvdEluZGV4OjpMT0FEKSkpOworIAorICAgICAgKytmdW5jdGlvblNpemU7CisKKyAgICAgIHVuc2lnbmVkIFNsb3RzID0gbWktPmdldERlc2MoKS5nZXROdW1EZWZzKCk7CisgICAgICBpZiAoU2xvdHMgPT0gMCkKKyAgICAgICAgU2xvdHMgPSAxOworCisgICAgICBpbmRleCArPSAoU2xvdHMgKyAxKSAqIFNsb3RJbmRleDo6TlVNOworICAgIH0KKworICAgIGlmIChtYmItPmdldEZpcnN0VGVybWluYXRvcigpID09IG1iYi0+ZW5kKCkpIHsKKyAgICAgIHB1c2hfYmFjayhjcmVhdGVFbnRyeSgwLCBpbmRleCkpOworICAgICAgdGVybWluYXRvckdhcHMuaW5zZXJ0KAorICAgICAgICBzdGQ6Om1ha2VfcGFpcihtYmIsIFNsb3RJbmRleChiYWNrKCksIFNsb3RJbmRleDo6UEhJX0JJVCkpKTsKKyAgICAgIGluZGV4ICs9IFNsb3RJbmRleDo6TlVNOworICAgIH0KKworICAgIC8vIE9uZSBibGFuayBpbnN0cnVjdGlvbiBhdCB0aGUgZW5kLgorICAgIHB1c2hfYmFjayhjcmVhdGVFbnRyeSgwLCBpbmRleCkpOyAgICAKKworICAgIFNsb3RJbmRleCBibG9ja0VuZEluZGV4KGJhY2soKSwgU2xvdEluZGV4OjpMT0FEKTsKKyAgICBtYmIySWR4TWFwLmluc2VydCgKKyAgICAgIHN0ZDo6bWFrZV9wYWlyKG1iYiwgc3RkOjptYWtlX3BhaXIoYmxvY2tTdGFydEluZGV4LCBibG9ja0VuZEluZGV4KSkpOworCisgICAgaWR4Mk1CQk1hcC5wdXNoX2JhY2soSWR4TUJCUGFpcihibG9ja1N0YXJ0SW5kZXgsIG1iYikpOworICB9CisKKyAgLy8gU29ydCB0aGUgSWR4Mk1CQk1hcAorICBzdGQ6OnNvcnQoaWR4Mk1CQk1hcC5iZWdpbigpLCBpZHgyTUJCTWFwLmVuZCgpLCBJZHgyTUJCQ29tcGFyZSgpKTsKKworICBERUJVRyhkdW1wKCkpOworCisgIC8vIEFuZCB3ZSdyZSBkb25lIQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2xvdEluZGV4ZXM6OnJlbnVtYmVySW5kZXhlcygpIHsKKworICAvLyBSZW51bWJlciB1cGRhdGVzIHRoZSBpbmRleCBvZiBldmVyeSBlbGVtZW50IG9mIHRoZSBpbmRleCBsaXN0LgorICAvLyBJZiBhbGwgaW5zdHJzIGluIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuIGluZGV4ICh3aGljaCBoYXMgYmVlbgorICAvLyBwbGFjZWQgaW4gdGhlIGluZGV4IGxpc3QgaW4gdGhlIG9yZGVyIG9mIGluc3RydWN0aW9uIGl0ZXJhdGlvbikgdGhlbiB0aGUKKyAgLy8gcmVzdWx0aW5nIG51bWJlcmluZyB3aWxsIG1hdGNoIHdoYXQgd291bGQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB0aGUKKyAgLy8gcGFzcyBkdXJpbmcgdGhlIGluaXRpYWwgbnVtYmVyaW5nIG9mIHRoZSBmdW5jdGlvbiBpZiB0aGUgbmV3IGluc3RydWN0aW9ucworICAvLyBoYWQgYmVlbiBwcmVzZW50LgorCisgIGZ1bmN0aW9uU2l6ZSA9IDA7CisgIHVuc2lnbmVkIGluZGV4ID0gMDsKKworICBmb3IgKEluZGV4TGlzdEVudHJ5ICpjdXJFbnRyeSA9IGZyb250KCk7IGN1ckVudHJ5ICE9IGdldFRhaWwoKTsKKyAgICAgICBjdXJFbnRyeSA9IGN1ckVudHJ5LT5nZXROZXh0KCkpIHsKKworICAgIGN1ckVudHJ5LT5zZXRJbmRleChpbmRleCk7CisKKyAgICBpZiAoY3VyRW50cnktPmdldEluc3RyKCkgPT0gMCkgeworICAgICAgLy8gTUJCIHN0YXJ0IGVudHJ5IG9yIHRlcm1pbmF0b3IgZ2FwLiBKdXN0IHN0ZXAgaW5kZXggYnkgMS4KKyAgICAgIGluZGV4ICs9IFNsb3RJbmRleDo6TlVNOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICsrZnVuY3Rpb25TaXplOworICAgICAgdW5zaWduZWQgU2xvdHMgPSBjdXJFbnRyeS0+Z2V0SW5zdHIoKS0+Z2V0RGVzYygpLmdldE51bURlZnMoKTsKKyAgICAgIGlmIChTbG90cyA9PSAwKQorICAgICAgICBTbG90cyA9IDE7CisKKyAgICAgIGluZGV4ICs9IChTbG90cyArIDEpICogU2xvdEluZGV4OjpOVU07CisgICAgfQorICB9Cit9CisKK3ZvaWQgU2xvdEluZGV4ZXM6OmR1bXAoKSBjb25zdCB7CisgIGZvciAoY29uc3QgSW5kZXhMaXN0RW50cnkgKml0ciA9IGZyb250KCk7IGl0ciAhPSBnZXRUYWlsKCk7CisgICAgICAgaXRyID0gaXRyLT5nZXROZXh0KCkpIHsKKyAgICBkYmdzKCkgPDwgaXRyLT5nZXRJbmRleCgpIDw8ICIgIjsKKworICAgIGlmIChpdHItPmdldEluc3RyKCkgIT0gMCkgeworICAgICAgZGJncygpIDw8ICppdHItPmdldEluc3RyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRiZ3MoKSA8PCAiXG4iOworICAgIH0KKyAgfQorCisgIGZvciAoTUJCMklkeE1hcDo6Y29uc3RfaXRlcmF0b3IgaXRyID0gbWJiMklkeE1hcC5iZWdpbigpOworICAgICAgIGl0ciAhPSBtYmIySWR4TWFwLmVuZCgpOyArK2l0cikgeworICAgIGRiZ3MoKSA8PCAiTUJCICIgPDwgaXRyLT5maXJzdC0+Z2V0TnVtYmVyKCkgPDwgIiAoIiA8PCBpdHItPmZpcnN0IDw8ICIpIC0gWyIKKyAgICAgICAgICAgPDwgaXRyLT5zZWNvbmQuZmlyc3QgPDwgIiwgIiA8PCBpdHItPnNlY29uZC5zZWNvbmQgPDwgIl1cbiI7CisgIH0KK30KKworLy8gUHJpbnQgYSBTbG90SW5kZXggdG8gYSByYXdfb3N0cmVhbS4KK3ZvaWQgU2xvdEluZGV4OjpwcmludChyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IHsKKyAgb3MgPDwgZW50cnkoKS5nZXRJbmRleCgpOworICBpZiAoaXNQSEkoKSkKKyAgICBvcyA8PCAiKiI7CisgIGVsc2UKKyAgICBvcyA8PCAiTHVkUyJbZ2V0U2xvdCgpXTsKK30KKworLy8gRHVtcCBhIFNsb3RJbmRleCB0byBzdGRlcnIuCit2b2lkIFNsb3RJbmRleDo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsKKyAgZGJncygpIDw8ICJcbiI7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NwaWxsZXIuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU3BpbGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxN2FmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NwaWxsZXIuY3BwCkBAIC0wLDAgKzEsNTI5IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9TcGlsbGVyLmNwcCAtICBTcGlsbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInNwaWxsZXIiCisKKyNpbmNsdWRlICJTcGlsbGVyLmgiCisjaW5jbHVkZSAiVmlydFJlZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8c2V0PgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKyAgZW51bSBTcGlsbGVyTmFtZSB7IHRyaXZpYWwsIHN0YW5kYXJkLCBzcGxpdHRpbmcsIGlubGluZV8gfTsKK30KKworc3RhdGljIGNsOjpvcHQ8U3BpbGxlck5hbWU+CitzcGlsbGVyT3B0KCJzcGlsbGVyIiwKKyAgICAgICAgICAgY2w6OmRlc2MoIlNwaWxsZXIgdG8gdXNlOiAoZGVmYXVsdDogc3RhbmRhcmQpIiksCisgICAgICAgICAgIGNsOjpQcmVmaXgsCisgICAgICAgICAgIGNsOjp2YWx1ZXMoY2xFbnVtVmFsKHRyaXZpYWwsICAgInRyaXZpYWwgc3BpbGxlciIpLAorICAgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbChzdGFuZGFyZCwgICJkZWZhdWx0IHNwaWxsZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWwoc3BsaXR0aW5nLCAic3BsaXR0aW5nIHNwaWxsZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKGlubGluZV8sICAiaW5saW5lIiwgImlubGluZSBzcGlsbGVyIiksCisgICAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsRW5kKSwKKyAgICAgICAgICAgY2w6OmluaXQoc3RhbmRhcmQpKTsKKworLy8gU3BpbGxlciB2aXJ0dWFsIGRlc3RydWN0b3IgaW1wbGVtZW50YXRpb24uCitTcGlsbGVyOjp+U3BpbGxlcigpIHt9CisKK25hbWVzcGFjZSB7CisKKy8vLyBVdGlsaXR5IGNsYXNzIGZvciBzcGlsbGVycy4KK2NsYXNzIFNwaWxsZXJCYXNlIDogcHVibGljIFNwaWxsZXIgeworcHJvdGVjdGVkOgorICBNYWNoaW5lRnVuY3Rpb25QYXNzICpwYXNzOworICBNYWNoaW5lRnVuY3Rpb24gKm1mOworICBWaXJ0UmVnTWFwICp2cm07CisgIExpdmVJbnRlcnZhbHMgKmxpczsKKyAgTWFjaGluZUZyYW1lSW5mbyAqbWZpOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICptcmk7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqdGlpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKnRyaTsKKworICAvLy8gQ29uc3RydWN0IGEgc3BpbGxlciBiYXNlLgorICBTcGlsbGVyQmFzZShNYWNoaW5lRnVuY3Rpb25QYXNzICZwYXNzLCBNYWNoaW5lRnVuY3Rpb24gJm1mLCBWaXJ0UmVnTWFwICZ2cm0pCisgICAgOiBwYXNzKCZwYXNzKSwgbWYoJm1mKSwgdnJtKCZ2cm0pCisgIHsKKyAgICBsaXMgPSAmcGFzcy5nZXRBbmFseXNpczxMaXZlSW50ZXJ2YWxzPigpOworICAgIG1maSA9IG1mLmdldEZyYW1lSW5mbygpOworICAgIG1yaSA9ICZtZi5nZXRSZWdJbmZvKCk7CisgICAgdGlpID0gbWYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgICAgdHJpID0gbWYuZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIH0KKworICAvLy8gQWRkIHNwaWxsIHJhbmdlcyBmb3IgZXZlcnkgdXNlL2RlZiBvZiB0aGUgbGl2ZSBpbnRlcnZhbCwgaW5zZXJ0aW5nIGxvYWRzCisgIC8vLyBpbW1lZGlhdGVseSBiZWZvcmUgZWFjaCB1c2UsIGFuZCBzdG9yZXMgYWZ0ZXIgZWFjaCBkZWYuIE5vIGZvbGRpbmcgb3IKKyAgLy8vIHJlbWF0IGlzIGF0dGVtcHRlZC4KKyAgdm9pZCB0cml2aWFsU3BpbGxFdmVyeXdoZXJlKExpdmVJbnRlcnZhbCAqbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiAmbmV3SW50ZXJ2YWxzKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJTcGlsbGluZyBldmVyeXdoZXJlICIgPDwgKmxpIDw8ICJcbiIpOworCisgICAgYXNzZXJ0KGxpLT53ZWlnaHQgIT0gSFVHRV9WQUxGICYmCisgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHNwaWxsIGFscmVhZHkgc3BpbGxlZCB2YWx1ZS4iKTsKKworICAgIGFzc2VydCghbGktPmlzU3RhY2tTbG90KCkgJiYKKyAgICAgICAgICAgIlRyeWluZyB0byBzcGlsbCBhIHN0YWNrIHNsb3QuIik7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlRyaXZpYWwgc3BpbGwgZXZlcnl3aGVyZSBvZiByZWciIDw8IGxpLT5yZWcgPDwgIlxuIik7CisKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICp0cmMgPSBtcmktPmdldFJlZ0NsYXNzKGxpLT5yZWcpOworICAgIHVuc2lnbmVkIHNzID0gdnJtLT5hc3NpZ25WaXJ0MlN0YWNrU2xvdChsaS0+cmVnKTsKKworICAgIC8vIEl0ZXJhdGUgb3ZlciByZWcgdXNlcy9kZWZzLgorICAgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6cmVnX2l0ZXJhdG9yCisgICAgICAgICByZWdJdHIgPSBtcmktPnJlZ19iZWdpbihsaS0+cmVnKTsgcmVnSXRyICE9IG1yaS0+cmVnX2VuZCgpOykgeworCisgICAgICAvLyBHcmFiIHRoZSB1c2UvZGVmIGluc3RyLgorICAgICAgTWFjaGluZUluc3RyICptaSA9ICYqcmVnSXRyOworCisgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgUHJvY2Vzc2luZyAiIDw8ICptaSk7CisKKyAgICAgIC8vIFN0ZXAgcmVnSXRyIHRvIHRoZSBuZXh0IHVzZS9kZWYgaW5zdHIuCisgICAgICBkbyB7CisgICAgICAgICsrcmVnSXRyOworICAgICAgfSB3aGlsZSAocmVnSXRyICE9IG1yaS0+cmVnX2VuZCgpICYmICgmKnJlZ0l0ciA9PSBtaSkpOworCisgICAgICAvLyBDb2xsZWN0IHVzZXMgJiBkZWZzIGZvciB0aGlzIGluc3RyLgorICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IGluZGljZXM7CisgICAgICBib29sIGhhc1VzZSA9IGZhbHNlOworICAgICAgYm9vbCBoYXNEZWYgPSBmYWxzZTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gbWktPmdldE51bU9wZXJhbmRzKCk7ICsraSkgeworICAgICAgICBNYWNoaW5lT3BlcmFuZCAmb3AgPSBtaS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKCFvcC5pc1JlZygpIHx8IG9wLmdldFJlZygpICE9IGxpLT5yZWcpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGhhc1VzZSB8PSBtaS0+Z2V0T3BlcmFuZChpKS5pc1VzZSgpOworICAgICAgICBoYXNEZWYgfD0gbWktPmdldE9wZXJhbmQoaSkuaXNEZWYoKTsKKyAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2soaSk7CisgICAgICB9CisKKyAgICAgIC8vIENyZWF0ZSBhIG5ldyB2cmVnICYgaW50ZXJ2YWwgZm9yIHRoaXMgaW5zdHIuCisgICAgICB1bnNpZ25lZCBuZXdWUmVnID0gbXJpLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIodHJjKTsKKyAgICAgIHZybS0+Z3JvdygpOworICAgICAgdnJtLT5hc3NpZ25WaXJ0MlN0YWNrU2xvdChuZXdWUmVnLCBzcyk7CisgICAgICBMaXZlSW50ZXJ2YWwgKm5ld0xJID0gJmxpcy0+Z2V0T3JDcmVhdGVJbnRlcnZhbChuZXdWUmVnKTsKKyAgICAgIG5ld0xJLT53ZWlnaHQgPSBIVUdFX1ZBTEY7CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgcmVnIG9wZXJhbmRzICYga2lsbCBmbGFncy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpbmRpY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIG1vcElkeCA9IGluZGljZXNbaV07CisgICAgICAgIE1hY2hpbmVPcGVyYW5kICZtb3AgPSBtaS0+Z2V0T3BlcmFuZChtb3BJZHgpOworICAgICAgICBtb3Auc2V0UmVnKG5ld1ZSZWcpOworICAgICAgICBpZiAobW9wLmlzVXNlKCkgJiYgIW1pLT5pc1JlZ1RpZWRUb0RlZk9wZXJhbmQobW9wSWR4KSkgeworICAgICAgICAgIG1vcC5zZXRJc0tpbGwodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGFzc2VydChoYXNVc2UgfHwgaGFzRGVmKTsKKworICAgICAgLy8gSW5zZXJ0IHJlbG9hZCBpZiBuZWNlc3NhcnkuCisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgbWlJdHIobWkpOworICAgICAgaWYgKGhhc1VzZSkgeworICAgICAgICB0aWktPmxvYWRSZWdGcm9tU3RhY2tTbG90KCptaS0+Z2V0UGFyZW50KCksIG1pSXRyLCBuZXdWUmVnLCBzcywgdHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaSk7CisgICAgICAgIE1hY2hpbmVJbnN0ciAqbG9hZEluc3RyKHByaW9yKG1pSXRyKSk7CisgICAgICAgIFNsb3RJbmRleCBsb2FkSW5kZXggPQorICAgICAgICAgIGxpcy0+SW5zZXJ0TWFjaGluZUluc3RySW5NYXBzKGxvYWRJbnN0cikuZ2V0RGVmSW5kZXgoKTsKKyAgICAgICAgdnJtLT5hZGRTcGlsbFNsb3RVc2Uoc3MsIGxvYWRJbnN0cik7CisgICAgICAgIFNsb3RJbmRleCBlbmRJbmRleCA9IGxvYWRJbmRleC5nZXROZXh0SW5kZXgoKTsKKyAgICAgICAgVk5JbmZvICpsb2FkVk5JID0KKyAgICAgICAgICBuZXdMSS0+Z2V0TmV4dFZhbHVlKGxvYWRJbmRleCwgMCwgdHJ1ZSwgbGlzLT5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisgICAgICAgIG5ld0xJLT5hZGRSYW5nZShMaXZlUmFuZ2UobG9hZEluZGV4LCBlbmRJbmRleCwgbG9hZFZOSSkpOworICAgICAgfQorCisgICAgICAvLyBJbnNlcnQgc3RvcmUgaWYgbmVjZXNzYXJ5LgorICAgICAgaWYgKGhhc0RlZikgeworICAgICAgICB0aWktPnN0b3JlUmVnVG9TdGFja1Nsb3QoKm1pLT5nZXRQYXJlbnQoKSwgbGx2bTo6bmV4dChtaUl0ciksIG5ld1ZSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBzcywgdHJjLCB0cmkpOworICAgICAgICBNYWNoaW5lSW5zdHIgKnN0b3JlSW5zdHIobGx2bTo6bmV4dChtaUl0cikpOworICAgICAgICBTbG90SW5kZXggc3RvcmVJbmRleCA9CisgICAgICAgICAgbGlzLT5JbnNlcnRNYWNoaW5lSW5zdHJJbk1hcHMoc3RvcmVJbnN0cikuZ2V0RGVmSW5kZXgoKTsKKyAgICAgICAgdnJtLT5hZGRTcGlsbFNsb3RVc2Uoc3MsIHN0b3JlSW5zdHIpOworICAgICAgICBTbG90SW5kZXggYmVnaW5JbmRleCA9IHN0b3JlSW5kZXguZ2V0UHJldkluZGV4KCk7CisgICAgICAgIFZOSW5mbyAqc3RvcmVWTkkgPQorICAgICAgICAgIG5ld0xJLT5nZXROZXh0VmFsdWUoYmVnaW5JbmRleCwgMCwgdHJ1ZSwgbGlzLT5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisgICAgICAgIG5ld0xJLT5hZGRSYW5nZShMaXZlUmFuZ2UoYmVnaW5JbmRleCwgc3RvcmVJbmRleCwgc3RvcmVWTkkpKTsKKyAgICAgIH0KKworICAgICAgbmV3SW50ZXJ2YWxzLnB1c2hfYmFjayhuZXdMSSk7CisgICAgfQorICB9Cit9OworCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSB7CisKKy8vLyBTcGlsbHMgYW55IGxpdmUgcmFuZ2UgdXNpbmcgdGhlIHNwaWxsLWV2ZXJ5d2hlcmUgbWV0aG9kIHdpdGggbm8gYXR0ZW1wdCBhdAorLy8vIGZvbGRpbmcuCitjbGFzcyBUcml2aWFsU3BpbGxlciA6IHB1YmxpYyBTcGlsbGVyQmFzZSB7CitwdWJsaWM6CisKKyAgVHJpdmlhbFNwaWxsZXIoTWFjaGluZUZ1bmN0aW9uUGFzcyAmcGFzcywgTWFjaGluZUZ1bmN0aW9uICZtZiwKKyAgICAgICAgICAgICAgICAgVmlydFJlZ01hcCAmdnJtKQorICAgIDogU3BpbGxlckJhc2UocGFzcywgbWYsIHZybSkge30KKworICB2b2lkIHNwaWxsKExpdmVJbnRlcnZhbCAqbGksCisgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TGl2ZUludGVydmFsKj4gJm5ld0ludGVydmFscywKKyAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TGl2ZUludGVydmFsKj4gJiwKKyAgICAgICAgICAgICBTbG90SW5kZXgqKSB7CisgICAgLy8gSWdub3JlIHNwaWxsSXMgLSB3ZSBkb24ndCB1c2UgaXQuCisgICAgdHJpdmlhbFNwaWxsRXZlcnl3aGVyZShsaSwgbmV3SW50ZXJ2YWxzKTsKKyAgfQorfTsKKworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCituYW1lc3BhY2UgeworCisvLy8gRmFsbHMgYmFjayBvbiBMaXZlSW50ZXJ2YWxzOjphZGRJbnRlcnZhbHNGb3JTcGlsbHMuCitjbGFzcyBTdGFuZGFyZFNwaWxsZXIgOiBwdWJsaWMgU3BpbGxlciB7Citwcm90ZWN0ZWQ6CisgIExpdmVJbnRlcnZhbHMgKmxpczsKKyAgTWFjaGluZUxvb3BJbmZvICpsb29wSW5mbzsKKyAgVmlydFJlZ01hcCAqdnJtOworcHVibGljOgorICBTdGFuZGFyZFNwaWxsZXIoTWFjaGluZUZ1bmN0aW9uUGFzcyAmcGFzcywgTWFjaGluZUZ1bmN0aW9uICZtZiwKKyAgICAgICAgICAgICAgICAgIFZpcnRSZWdNYXAgJnZybSkKKyAgICA6IGxpcygmcGFzcy5nZXRBbmFseXNpczxMaXZlSW50ZXJ2YWxzPigpKSwKKyAgICAgIGxvb3BJbmZvKHBhc3MuZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxNYWNoaW5lTG9vcEluZm8+KCkpLAorICAgICAgdnJtKCZ2cm0pIHt9CisKKyAgLy8vIEZhbGxzIGJhY2sgb24gTGl2ZUludGVydmFsczo6YWRkSW50ZXJ2YWxzRm9yU3BpbGxzLgorICB2b2lkIHNwaWxsKExpdmVJbnRlcnZhbCAqbGksCisgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TGl2ZUludGVydmFsKj4gJm5ld0ludGVydmFscywKKyAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TGl2ZUludGVydmFsKj4gJnNwaWxsSXMsCisgICAgICAgICAgICAgU2xvdEluZGV4KikgeworICAgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+IGFkZGVkID0KKyAgICAgIGxpcy0+YWRkSW50ZXJ2YWxzRm9yU3BpbGxzKCpsaSwgc3BpbGxJcywgbG9vcEluZm8sICp2cm0pOworICAgIG5ld0ludGVydmFscy5pbnNlcnQobmV3SW50ZXJ2YWxzLmVuZCgpLCBhZGRlZC5iZWdpbigpLCBhZGRlZC5lbmQoKSk7CisgIH0KK307CisKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHsKKworLy8vIFdoZW4gYSBjYWxsIHRvIHNwaWxsIGlzIHBsYWNlZCB0aGlzIHNwaWxsZXIgd2lsbCBmaXJzdCB0cnkgdG8gYnJlYWsgdGhlCisvLy8gaW50ZXJ2YWwgdXAgaW50byBpdHMgY29tcG9uZW50IHZhbHVlcyAob25lIG5ldyBpbnRlcnZhbCBwZXIgdmFsdWUpLgorLy8vIElmIHRoaXMgZmFpbHMsIG9yIGlmIGEgY2FsbCBpcyBwbGFjZWQgdG8gc3BpbGwgYSBwcmV2aW91c2x5IHNwbGl0IGludGVydmFsCisvLy8gdGhlbiB0aGUgc3BpbGxlciBmYWxscyBiYWNrIG9uIHRoZSBzdGFuZGFyZCBzcGlsbGluZyBtZWNoYW5pc20uCitjbGFzcyBTcGxpdHRpbmdTcGlsbGVyIDogcHVibGljIFN0YW5kYXJkU3BpbGxlciB7CitwdWJsaWM6CisgIFNwbGl0dGluZ1NwaWxsZXIoTWFjaGluZUZ1bmN0aW9uUGFzcyAmcGFzcywgTWFjaGluZUZ1bmN0aW9uICZtZiwKKyAgICAgICAgICAgICAgICAgICBWaXJ0UmVnTWFwICZ2cm0pCisgICAgOiBTdGFuZGFyZFNwaWxsZXIocGFzcywgbWYsIHZybSkgeworICAgIG1yaSA9ICZtZi5nZXRSZWdJbmZvKCk7CisgICAgdGlpID0gbWYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgICAgdHJpID0gbWYuZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIH0KKworICB2b2lkIHNwaWxsKExpdmVJbnRlcnZhbCAqbGksCisgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TGl2ZUludGVydmFsKj4gJm5ld0ludGVydmFscywKKyAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TGl2ZUludGVydmFsKj4gJnNwaWxsSXMsCisgICAgICAgICAgICAgU2xvdEluZGV4ICplYXJsaWVzdFN0YXJ0KSB7CisgICAgaWYgKHdvcnRoVHJ5aW5nVG9TcGxpdChsaSkpCisgICAgICB0cnlWTklTcGxpdChsaSwgZWFybGllc3RTdGFydCk7CisgICAgZWxzZQorICAgICAgU3RhbmRhcmRTcGlsbGVyOjpzcGlsbChsaSwgbmV3SW50ZXJ2YWxzLCBzcGlsbElzLCBlYXJsaWVzdFN0YXJ0KTsKKyAgfQorCitwcml2YXRlOgorCisgIE1hY2hpbmVSZWdpc3RlckluZm8gKm1yaTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICp0aWk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqdHJpOworICBEZW5zZVNldDxMaXZlSW50ZXJ2YWwqPiBhbHJlYWR5U3BsaXQ7CisKKyAgYm9vbCB3b3J0aFRyeWluZ1RvU3BsaXQoTGl2ZUludGVydmFsICpsaSkgY29uc3QgeworICAgIHJldHVybiAoIWFscmVhZHlTcGxpdC5jb3VudChsaSkgJiYgbGktPmdldE51bVZhbE51bXMoKSA+IDEpOworICB9CisKKyAgLy8vIFRyeSB0byBicmVhayBhIExpdmVJbnRlcnZhbCBpbnRvIGl0cyBjb21wb25lbnQgdmFsdWVzLgorICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiB0cnlWTklTcGxpdChMaXZlSW50ZXJ2YWwgKmxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggKmVhcmxpZXN0U3RhcnQpIHsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiVHJ5aW5nIFZOSSBzcGxpdCBvZiAlcmVnIiA8PCAqbGkgPDwgIlxuIik7CisKKyAgICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiBhZGRlZDsKKyAgICBTbWFsbFZlY3RvcjxWTkluZm8qLCA0PiB2bmlzOworCisgICAgc3RkOjpjb3B5KGxpLT52bmlfYmVnaW4oKSwgbGktPnZuaV9lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHZuaXMpKTsKKworICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPFZOSW5mbyo+OjppdGVyYXRvciB2bmlJdHIgPSB2bmlzLmJlZ2luKCksCisgICAgICAgICB2bmlFbmQgPSB2bmlzLmVuZCgpOyB2bmlJdHIgIT0gdm5pRW5kOyArK3ZuaUl0cikgeworICAgICAgVk5JbmZvICp2bmkgPSAqdm5pSXRyOworCisgICAgICAvLyBTa2lwIHVudXNlZCBWTklzLgorICAgICAgaWYgKHZuaS0+aXNVbnVzZWQoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICBFeHRyYWN0ZWQgVmFsICMiIDw8IHZuaS0+aWQgPDwgIiBhcyAiKTsKKyAgICAgIExpdmVJbnRlcnZhbCAqc3BsaXRJbnRlcnZhbCA9IGV4dHJhY3RWTkkobGksIHZuaSk7CisKKyAgICAgIGlmIChzcGxpdEludGVydmFsICE9IDApIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICpzcGxpdEludGVydmFsIDw8ICJcbiIpOworICAgICAgICBhZGRlZC5wdXNoX2JhY2soc3BsaXRJbnRlcnZhbCk7CisgICAgICAgIGFscmVhZHlTcGxpdC5pbnNlcnQoc3BsaXRJbnRlcnZhbCk7CisgICAgICAgIGlmIChlYXJsaWVzdFN0YXJ0ICE9IDApIHsKKyAgICAgICAgICBpZiAoc3BsaXRJbnRlcnZhbC0+YmVnaW5JbmRleCgpIDwgKmVhcmxpZXN0U3RhcnQpCisgICAgICAgICAgICAqZWFybGllc3RTdGFydCA9IHNwbGl0SW50ZXJ2YWwtPmJlZ2luSW5kZXgoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIwXG4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIk9yaWdpbmFsIExJOiAiIDw8ICpsaSA8PCAiXG4iKTsKKworICAgIC8vIElmIHRoZXJlIG9yaWdpbmFsIGludGVydmFsIHN0aWxsIGNvbnRhaW5zIHNvbWUgbGl2ZSByYW5nZXMKKyAgICAvLyBhZGQgaXQgdG8gYWRkZWQgYW5kIGFscmVhZHlTcGxpdC4KKyAgICBpZiAoIWxpLT5lbXB0eSgpKSB7CisgICAgICBhZGRlZC5wdXNoX2JhY2sobGkpOworICAgICAgYWxyZWFkeVNwbGl0Lmluc2VydChsaSk7CisgICAgICBpZiAoZWFybGllc3RTdGFydCAhPSAwKSB7CisgICAgICAgIGlmIChsaS0+YmVnaW5JbmRleCgpIDwgKmVhcmxpZXN0U3RhcnQpCisgICAgICAgICAgKmVhcmxpZXN0U3RhcnQgPSBsaS0+YmVnaW5JbmRleCgpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhZGRlZDsKKyAgfQorCisgIC8vLyBFeHRyYWN0IHRoZSBnaXZlbiB2YWx1ZSBudW1iZXIgZnJvbSB0aGUgaW50ZXJ2YWwuCisgIExpdmVJbnRlcnZhbCogZXh0cmFjdFZOSShMaXZlSW50ZXJ2YWwgKmxpLCBWTkluZm8gKnZuaSkgY29uc3QgeworICAgIGFzc2VydCh2bmktPmlzRGVmQWNjdXJhdGUoKSB8fCB2bmktPmlzUEhJRGVmKCkpOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IHZyZWcgYW5kIGxpdmUgaW50ZXJ2YWwsIGNvcHkgVk5JIHJhbmdlcyBvdmVyLgorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKnRyYyA9IG1yaS0+Z2V0UmVnQ2xhc3MobGktPnJlZyk7CisgICAgdW5zaWduZWQgbmV3VlJlZyA9IG1yaS0+Y3JlYXRlVmlydHVhbFJlZ2lzdGVyKHRyYyk7CisgICAgdnJtLT5ncm93KCk7CisgICAgTGl2ZUludGVydmFsICpuZXdMSSA9ICZsaXMtPmdldE9yQ3JlYXRlSW50ZXJ2YWwobmV3VlJlZyk7CisgICAgVk5JbmZvICpuZXdWTkkgPSBuZXdMSS0+Y3JlYXRlVmFsdWVDb3B5KHZuaSwgbGlzLT5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisKKyAgICAvLyBTdGFydCBieSBjb3B5aW5nIGFsbCBsaXZlIHJhbmdlcyBpbiB0aGUgVk4gdG8gdGhlIG5ldyBpbnRlcnZhbC4KKyAgICBmb3IgKExpdmVJbnRlcnZhbDo6aXRlcmF0b3Igckl0ciA9IGxpLT5iZWdpbigpLCByRW5kID0gbGktPmVuZCgpOworICAgICAgICAgckl0ciAhPSByRW5kOyArK3JJdHIpIHsKKyAgICAgIGlmIChySXRyLT52YWxubyA9PSB2bmkpIHsKKyAgICAgICAgbmV3TEktPmFkZFJhbmdlKExpdmVSYW5nZShySXRyLT5zdGFydCwgckl0ci0+ZW5kLCBuZXdWTkkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFcmFzZSB0aGUgb2xkIFZOSSAmIHJhbmdlcy4KKyAgICBsaS0+cmVtb3ZlVmFsTm8odm5pKTsKKworICAgIC8vIENvbGxlY3QgYWxsIGN1cnJlbnQgdXNlcyBvZiB0aGUgcmVnaXN0ZXIgYmVsb25naW5nIHRvIHRoZSBnaXZlbiBWTkkuCisgICAgLy8gV2UnbGwgdXNlIHRoaXMgdG8gcmVuYW1lIHRoZSByZWdpc3RlciBhZnRlciB3ZSd2ZSBkZWFsdCB3aXRoIHRoZSBkZWYuCisgICAgc3RkOjpzZXQ8TWFjaGluZUluc3RyKj4gdXNlczsKKyAgICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9pdGVyYXRvcgorICAgICAgICAgdXNlSXRyID0gbXJpLT51c2VfYmVnaW4obGktPnJlZyksIHVzZUVuZCA9IG1yaS0+dXNlX2VuZCgpOworICAgICAgICAgdXNlSXRyICE9IHVzZUVuZDsgKyt1c2VJdHIpIHsKKyAgICAgIHVzZXMuaW5zZXJ0KCYqdXNlSXRyKTsKKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIHRoZSBkZWYgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgVk5JLgorICAgIGlmIChuZXdWTkktPmlzUEhJRGVmKCkpIHsKKyAgICAgIC8vIEluc2VydCBhIGNvcHkgYXQgdGhlIHN0YXJ0IG9mIHRoZSBNQkIuIFRoZSByYW5nZSBwcm9jZWVkaW5nIHRoZQorICAgICAgLy8gY29weSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBvcmlnaW5hbCBMaXZlSW50ZXJ2YWwuCisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqZGVmTUJCID0gbGlzLT5nZXRNQkJGcm9tSW5kZXgobmV3Vk5JLT5kZWYpOworICAgICAgTWFjaGluZUluc3RyICpjb3B5TUkgPSBCdWlsZE1JKCpkZWZNQkIsIGRlZk1CQi0+YmVnaW4oKSwgRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWktPmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLCBuZXdWUmVnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcobGktPnJlZywgUmVnU3RhdGU6OktpbGwpOworICAgICAgU2xvdEluZGV4IGNvcHlJZHggPSBsaXMtPkluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhjb3B5TUkpOworICAgICAgVk5JbmZvICpwaGlEZWZWTkkgPSBsaS0+Z2V0TmV4dFZhbHVlKGxpcy0+Z2V0TUJCU3RhcnRJZHgoZGVmTUJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwgbGlzLT5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisgICAgICBwaGlEZWZWTkktPnNldElzUEhJRGVmKHRydWUpOworICAgICAgbGktPmFkZFJhbmdlKExpdmVSYW5nZShwaGlEZWZWTkktPmRlZiwgY29weUlkeC5nZXREZWZJbmRleCgpLCBwaGlEZWZWTkkpKTsKKyAgICAgIExpdmVSYW5nZSAqb2xkUEhJRGVmUmFuZ2UgPQorICAgICAgICBuZXdMSS0+Z2V0TGl2ZVJhbmdlQ29udGFpbmluZyhsaXMtPmdldE1CQlN0YXJ0SWR4KGRlZk1CQikpOworCisgICAgICAvLyBJZiB0aGUgb2xkIHBoaSBkZWYgc3RhcnRzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJhbmdlIGNob3AgaXQgdXAuCisgICAgICBpZiAob2xkUEhJRGVmUmFuZ2UtPnN0YXJ0IDwgbGlzLT5nZXRNQkJTdGFydElkeChkZWZNQkIpKSB7CisgICAgICAgIExpdmVSYW5nZSBvbGRQSElEZWZSYW5nZTIoY29weUlkeC5nZXREZWZJbmRleCgpLCBvbGRQSElEZWZSYW5nZS0+ZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBISURlZlJhbmdlLT52YWxubyk7CisgICAgICAgIG9sZFBISURlZlJhbmdlLT5lbmQgPSBsaXMtPmdldE1CQlN0YXJ0SWR4KGRlZk1CQik7CisgICAgICAgIG5ld0xJLT5hZGRSYW5nZShvbGRQSElEZWZSYW5nZTIpOworICAgICAgfSBlbHNlIGlmIChvbGRQSElEZWZSYW5nZS0+c3RhcnQgPT0gbGlzLT5nZXRNQkJTdGFydElkeChkZWZNQkIpKSB7CisgICAgICAgIC8vIE90aGVyd2lzZSBpZiBpdCdzIGF0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UganVzdCB0cmltIGl0LgorICAgICAgICBvbGRQSElEZWZSYW5nZS0+c3RhcnQgPSBjb3B5SWR4LmdldERlZkluZGV4KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgIlBISSBkZWYgcmFuZ2UgZG9lc24ndCBjb3ZlciBQSEkgZGVmPyIpOworICAgICAgfQorCisgICAgICBuZXdWTkktPmRlZiA9IGNvcHlJZHguZ2V0RGVmSW5kZXgoKTsKKyAgICAgIG5ld1ZOSS0+c2V0Q29weShjb3B5TUkpOworICAgICAgbmV3Vk5JLT5zZXRJc1BISURlZihmYWxzZSk7IC8vIG5vdCBhIFBISSBkZWYgYW55bW9yZS4KKyAgICAgIG5ld1ZOSS0+c2V0SXNEZWZBY2N1cmF0ZSh0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gbm9uLVBISSBkZWYuIFJlbmFtZSB0aGUgZGVmLiBJZiBpdCdzIHR3by1hZGRyIHRoYXQgbWVhbnMgcmVuYW1pbmcgdGhlCisgICAgICAvLyB1c2UgYW5kIGluc2VydGluZyBhIG5ldyBjb3B5IHRvby4KKyAgICAgIE1hY2hpbmVJbnN0ciAqZGVmSW5zdCA9IGxpcy0+Z2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgobmV3Vk5JLT5kZWYpOworICAgICAgLy8gV2UnbGwgcmVuYW1lIHRoaXMgbm93LCBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGZyb20gdXNlcy4KKyAgICAgIHVzZXMuZXJhc2UoZGVmSW5zdCk7CisgICAgICB1bnNpZ25lZCBkZWZPcElkeCA9IGRlZkluc3QtPmZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgobGktPnJlZyk7CisgICAgICBib29sIGlzVHdvQWRkciA9IGRlZkluc3QtPmlzUmVnVGllZFRvVXNlT3BlcmFuZChkZWZPcElkeCksCisgICAgICAgIHR3b0FkZHJVc2VJc1VuZGVmID0gZmFsc2U7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZWZJbnN0LT5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICAgICAgTWFjaGluZU9wZXJhbmQgJm1vID0gZGVmSW5zdC0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKG1vLmlzUmVnKCkgJiYgKG1vLmlzRGVmKCkgfHwgaXNUd29BZGRyKSAmJiAobW8uZ2V0UmVnKCk9PWxpLT5yZWcpKSB7CisgICAgICAgICAgbW8uc2V0UmVnKG5ld1ZSZWcpOworICAgICAgICAgIGlmIChpc1R3b0FkZHIgJiYgbW8uaXNVc2UoKSAmJiBtby5pc1VuZGVmKCkpCisgICAgICAgICAgICB0d29BZGRyVXNlSXNVbmRlZiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgU2xvdEluZGV4IGRlZklkeCA9IGxpcy0+Z2V0SW5zdHJ1Y3Rpb25JbmRleChkZWZJbnN0KTsKKyAgICAgIG5ld1ZOSS0+ZGVmID0gZGVmSWR4LmdldERlZkluZGV4KCk7CisKKyAgICAgIGlmIChpc1R3b0FkZHIgJiYgIXR3b0FkZHJVc2VJc1VuZGVmKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpkZWZNQkIgPSBkZWZJbnN0LT5nZXRQYXJlbnQoKTsKKyAgICAgICAgTWFjaGluZUluc3RyICpjb3B5TUkgPSBCdWlsZE1JKCpkZWZNQkIsIGRlZkluc3QsIERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWktPmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLCBuZXdWUmVnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhsaS0+cmVnLCBSZWdTdGF0ZTo6S2lsbCk7CisgICAgICAgIFNsb3RJbmRleCBjb3B5SWR4ID0gbGlzLT5JbnNlcnRNYWNoaW5lSW5zdHJJbk1hcHMoY29weU1JKTsKKyAgICAgICAgTGl2ZVJhbmdlICpvcmlnVXNlUmFuZ2UgPQorICAgICAgICAgIGxpLT5nZXRMaXZlUmFuZ2VDb250YWluaW5nKG5ld1ZOSS0+ZGVmLmdldFVzZUluZGV4KCkpOworICAgICAgICBvcmlnVXNlUmFuZ2UtPmVuZCA9IGNvcHlJZHguZ2V0RGVmSW5kZXgoKTsKKyAgICAgICAgVk5JbmZvICpjb3B5Vk5JID0gbmV3TEktPmdldE5leHRWYWx1ZShjb3B5SWR4LmdldERlZkluZGV4KCksIGNvcHlNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBsaXMtPmdldFZOSW5mb0FsbG9jYXRvcigpKTsKKyAgICAgICAgTGl2ZVJhbmdlIGNvcHlSYW5nZShjb3B5SWR4LmdldERlZkluZGV4KCksZGVmSWR4LmdldERlZkluZGV4KCksY29weVZOSSk7CisgICAgICAgIG5ld0xJLT5hZGRSYW5nZShjb3B5UmFuZ2UpOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoc3RkOjpzZXQ8TWFjaGluZUluc3RyKj46Oml0ZXJhdG9yCisgICAgICAgICB1c2VzSXRyID0gdXNlcy5iZWdpbigpLCB1c2VzRW5kID0gdXNlcy5lbmQoKTsKKyAgICAgICAgIHVzZXNJdHIgIT0gdXNlc0VuZDsgKyt1c2VzSXRyKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKnVzZUluc3QgPSAqdXNlc0l0cjsKKyAgICAgIFNsb3RJbmRleCB1c2VJZHggPSBsaXMtPmdldEluc3RydWN0aW9uSW5kZXgodXNlSW5zdCk7CisgICAgICBMaXZlUmFuZ2UgKnVzZVJhbmdlID0KKyAgICAgICAgbmV3TEktPmdldExpdmVSYW5nZUNvbnRhaW5pbmcodXNlSWR4LmdldFVzZUluZGV4KCkpOworCisgICAgICAvLyBJZiB0aGlzIHVzZSBkb2Vzbid0IGJlbG9uZyB0byB0aGUgbmV3IGludGVydmFsIHNraXAgaXQuCisgICAgICBpZiAodXNlUmFuZ2UgPT0gMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFRoaXMgdXNlIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBWTkksIHNraXAgaXQuCisgICAgICBpZiAodXNlUmFuZ2UtPnZhbG5vICE9IG5ld1ZOSSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIENoZWNrIGlmIHRoaXMgaW5zdHIgaXMgdHdvIGFkZHJlc3MuCisgICAgICB1bnNpZ25lZCB1c2VPcElkeCA9IHVzZUluc3QtPmZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgobGktPnJlZyk7CisgICAgICBib29sIGlzVHdvQWRkcmVzcyA9IHVzZUluc3QtPmlzUmVnVGllZFRvRGVmT3BlcmFuZCh1c2VPcElkeCk7CisKKyAgICAgIC8vIFJlbmFtZSB1c2VzIChhbmQgZGVmcyBmb3IgdHdvLWFkZHJlc3MgaW5zdHJzKS4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB1c2VJbnN0LT5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICAgICAgTWFjaGluZU9wZXJhbmQgJm1vID0gdXNlSW5zdC0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKG1vLmlzUmVnKCkgJiYgKG1vLmlzVXNlKCkgfHwgaXNUd29BZGRyZXNzKSAmJgorICAgICAgICAgICAgKG1vLmdldFJlZygpID09IGxpLT5yZWcpKSB7CisgICAgICAgICAgbW8uc2V0UmVnKG5ld1ZSZWcpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoaXMgaXMgYSB0d28gYWRkcmVzcyBpbnN0cnVjdGlvbiB3ZSd2ZSBnb3Qgc29tZSBleHRyYSB3b3JrIHRvIGRvLgorICAgICAgaWYgKGlzVHdvQWRkcmVzcykgeworICAgICAgICAvLyBXZSBtb2RpZmllZCB0aGUgZGVmIG9wZXJhbmQsIHNvIHdlIG5lZWQgdG8gY29weSBiYWNrIHRvIHRoZSBvcmlnaW5hbAorICAgICAgICAvLyByZWcuCisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICp1c2VNQkIgPSB1c2VJbnN0LT5nZXRQYXJlbnQoKTsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIHVzZUl0cih1c2VJbnN0KTsKKyAgICAgICAgTWFjaGluZUluc3RyICpjb3B5TUkgPSBCdWlsZE1JKCp1c2VNQkIsIGxsdm06Om5leHQodXNlSXRyKSwgRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpaS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksIG5ld1ZSZWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKGxpLT5yZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgICAgICAgU2xvdEluZGV4IGNvcHlJZHggPSBsaXMtPkluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhjb3B5TUkpOworCisgICAgICAgIC8vIENoYW5nZSB0aGUgb2xkIHR3by1hZGRyZXNzIGRlZmluZWQgcmFuZ2UgJiB2bmkgdG8gc3RhcnQgYXQKKyAgICAgICAgLy8gKGFuZCBiZSBkZWZpbmVkIGJ5KSB0aGUgY29weS4KKyAgICAgICAgTGl2ZVJhbmdlICpvcmlnRGVmUmFuZ2UgPQorICAgICAgICAgIGxpLT5nZXRMaXZlUmFuZ2VDb250YWluaW5nKHVzZUlkeC5nZXREZWZJbmRleCgpKTsKKyAgICAgICAgb3JpZ0RlZlJhbmdlLT5zdGFydCA9IGNvcHlJZHguZ2V0RGVmSW5kZXgoKTsKKyAgICAgICAgb3JpZ0RlZlJhbmdlLT52YWxuby0+ZGVmID0gY29weUlkeC5nZXREZWZJbmRleCgpOworICAgICAgICBvcmlnRGVmUmFuZ2UtPnZhbG5vLT5zZXRDb3B5KGNvcHlNSSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IGEgbmV3IHJhbmdlICYgdm5pIGZvciB0aGUgdHdvLWFkZHJlc3MtdG8tY29weSB2YWx1ZS4gVGhpcworICAgICAgICAvLyB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXcgbGl2ZSBpbnRlcnZhbC4KKyAgICAgICAgVk5JbmZvICpjb3B5Vk5JID0KKyAgICAgICAgICBuZXdMSS0+Z2V0TmV4dFZhbHVlKHVzZUlkeC5nZXREZWZJbmRleCgpLCAwLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzLT5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisgICAgICAgIExpdmVSYW5nZSBjb3B5UmFuZ2UodXNlSWR4LmdldERlZkluZGV4KCksY29weUlkeC5nZXREZWZJbmRleCgpLGNvcHlWTkkpOworICAgICAgICBuZXdMSS0+YWRkUmFuZ2UoY29weVJhbmdlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJdGVyYXRlIG92ZXIgYW55IFBISSBraWxscyAtIHdlJ2xsIG5lZWQgdG8gaW5zZXJ0IG5ldyBjb3BpZXMgZm9yIHRoZW0uCisgICAgZm9yIChMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yIExSSSA9IG5ld0xJLT5iZWdpbigpLCBMUkUgPSBuZXdMSS0+ZW5kKCk7CisgICAgICAgICBMUkkgIT0gTFJFOyArK0xSSSkgeworICAgICAgaWYgKExSSS0+dmFsbm8gIT0gbmV3Vk5JIHx8IExSSS0+ZW5kLmlzUEhJKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgU2xvdEluZGV4IGtpbGxJZHggPSBMUkktPmVuZDsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpraWxsTUJCID0gbGlzLT5nZXRNQkJGcm9tSW5kZXgoa2lsbElkeCk7CisgICAgICBNYWNoaW5lSW5zdHIgKmNvcHlNSSA9IEJ1aWxkTUkoKmtpbGxNQkIsIGtpbGxNQkItPmdldEZpcnN0VGVybWluYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jKCksIHRpaS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGktPnJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKG5ld1ZSZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgICAgIFNsb3RJbmRleCBjb3B5SWR4ID0gbGlzLT5JbnNlcnRNYWNoaW5lSW5zdHJJbk1hcHMoY29weU1JKTsKKworICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBlbmQuIFdlIG1heSBuZWVkIGl0IHRvIGFkZCBhIG5ldyByYW5nZSBpZiB0aGUKKyAgICAgIC8vIGN1cnJlbnQgcmFuZ2UgcnVucyBvZiB0aGUgZW5kIG9mIHRoZSBNQkIuCisgICAgICBTbG90SW5kZXggbmV3S2lsbFJhbmdlRW5kID0gTFJJLT5lbmQ7CisgICAgICBMUkktPmVuZCA9IGNvcHlJZHguZ2V0RGVmSW5kZXgoKTsKKworICAgICAgaWYgKG5ld0tpbGxSYW5nZUVuZCAhPSBsaXMtPmdldE1CQkVuZElkeChraWxsTUJCKSkgeworICAgICAgICBhc3NlcnQobmV3S2lsbFJhbmdlRW5kID4gbGlzLT5nZXRNQkJFbmRJZHgoa2lsbE1CQikgJiYKKyAgICAgICAgICAgICAgICJQSEkga2lsbCByYW5nZSBkb2Vzbid0IHJlYWNoIGtpbGwtYmxvY2sgZW5kLiBOb3Qgc2FuZS4iKTsKKyAgICAgICAgbmV3TEktPmFkZFJhbmdlKExpdmVSYW5nZShsaXMtPmdldE1CQkVuZElkeChraWxsTUJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdLaWxsUmFuZ2VFbmQsIG5ld1ZOSSkpOworICAgICAgfQorCisgICAgICBWTkluZm8gKm5ld0tpbGxWTkkgPSBsaS0+Z2V0TmV4dFZhbHVlKGNvcHlJZHguZ2V0RGVmSW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weU1JLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXMtPmdldFZOSW5mb0FsbG9jYXRvcigpKTsKKyAgICAgIG5ld0tpbGxWTkktPnNldEhhc1BISUtpbGwodHJ1ZSk7CisgICAgICBsaS0+YWRkUmFuZ2UoTGl2ZVJhbmdlKGNvcHlJZHguZ2V0RGVmSW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzLT5nZXRNQkJFbmRJZHgoa2lsbE1CQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0tpbGxWTkkpKTsKKyAgICB9CisgICAgbmV3Vk5JLT5zZXRIYXNQSElLaWxsKGZhbHNlKTsKKworICAgIHJldHVybiBuZXdMSTsKKyAgfQorCit9OworCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKworbmFtZXNwYWNlIGxsdm0geworU3BpbGxlciAqY3JlYXRlSW5saW5lU3BpbGxlcihNYWNoaW5lRnVuY3Rpb25QYXNzICZwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJm1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0UmVnTWFwICZ2cm0pOworfQorCitsbHZtOjpTcGlsbGVyKiBsbHZtOjpjcmVhdGVTcGlsbGVyKE1hY2hpbmVGdW5jdGlvblBhc3MgJnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnRSZWdNYXAgJnZybSkgeworICBzd2l0Y2ggKHNwaWxsZXJPcHQpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgInVua25vd24gc3BpbGxlciIpOworICBjYXNlIHRyaXZpYWw6IHJldHVybiBuZXcgVHJpdmlhbFNwaWxsZXIocGFzcywgbWYsIHZybSk7CisgIGNhc2Ugc3RhbmRhcmQ6IHJldHVybiBuZXcgU3RhbmRhcmRTcGlsbGVyKHBhc3MsIG1mLCB2cm0pOworICBjYXNlIHNwbGl0dGluZzogcmV0dXJuIG5ldyBTcGxpdHRpbmdTcGlsbGVyKHBhc3MsIG1mLCB2cm0pOworICBjYXNlIGlubGluZV86IHJldHVybiBjcmVhdGVJbmxpbmVTcGlsbGVyKHBhc3MsIG1mLCB2cm0pOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TcGlsbGVyLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TcGlsbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1MTcyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NwaWxsZXIuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9TcGlsbGVyLmggLSBTcGlsbGVyIC0qLSBDKysgLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TUElMTEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NQSUxMRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBMaXZlSW50ZXJ2YWw7CisgIGNsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uUGFzczsKKyAgY2xhc3MgU2xvdEluZGV4OworICBjbGFzcyBWaXJ0UmVnTWFwOworCisgIC8vLyBTcGlsbGVyIGludGVyZmFjZS4KKyAgLy8vCisgIC8vLyBJbXBsZW1lbnRhdGlvbnMgYXJlIHV0aWxpdHkgY2xhc3NlcyB3aGljaCBpbnNlcnQgc3BpbGwgb3IgcmVtYXQgY29kZSBvbgorICAvLy8gZGVtYW5kLgorICBjbGFzcyBTcGlsbGVyIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgflNwaWxsZXIoKSA9IDA7CisKKyAgICAvLy8gc3BpbGwgLSBTcGlsbCB0aGUgZ2l2ZW4gbGl2ZSBpbnRlcnZhbC4gVGhlIG1ldGhvZCB1c2VkIHdpbGwgZGVwZW5kIG9uCisgICAgLy8vIHRoZSBTcGlsbGVyIGltcGxlbWVudGF0aW9uIHNlbGVjdGVkLgorICAgIC8vLworICAgIC8vLyBAcGFyYW0gbGkgICAgICAgICAgICBUaGUgbGl2ZSBpbnRlcnZhbCB0byBiZSBzcGlsbGVkLgorICAgIC8vLyBAcGFyYW0gc3BpbGxJcyAgICAgICBBIGxpc3Qgb2YgaW50ZXJ2YWxzIHRoYXQgYXJlIGFib3V0IHRvIGJlIHNwaWxsZWQsCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIGFuZCBzbyBjYW5ub3QgYmUgdXNlZCBmb3IgcmVtYXQgZXRjLgorICAgIC8vLyBAcGFyYW0gbmV3SW50ZXJ2YWxzICBUaGUgbmV3bHkgY3JlYXRlZCBpbnRlcnZhbHMgd2lsbCBiZSBhcHBlbmRlZCBoZXJlLgorICAgIC8vLyBAcGFyYW0gZWFybGllc3RJbmRleCBUaGUgZWFybGllc3QgcG9pbnQgZm9yIHNwbGl0dGluZy4gKE9LLCBpdCdzIGFub3RoZXIKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgYWxsb2NhdG9yIGd1dHMpLgorICAgIHZpcnR1YWwgdm9pZCBzcGlsbChMaXZlSW50ZXJ2YWwgKmxpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMaXZlSW50ZXJ2YWwqPiAmbmV3SW50ZXJ2YWxzLAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TGl2ZUludGVydmFsKj4gJnNwaWxsSXMsCisgICAgICAgICAgICAgICAgICAgICAgIFNsb3RJbmRleCAqZWFybGllc3RJbmRleCA9IDApID0gMDsKKworICB9OworCisgIC8vLyBDcmVhdGUgYW5kIHJldHVybiBhIHNwaWxsZXIgb2JqZWN0LCBhcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgU3BpbGxlciogY3JlYXRlU3BpbGxlcihNYWNoaW5lRnVuY3Rpb25QYXNzICZwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmlydFJlZ01hcCAmdnJtKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9TcGxpdEtpdC5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TcGxpdEtpdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3YTRkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NwbGl0S2l0LmNwcApAQCAtMCwwICsxLDYyMiBAQAorLy89PT0tLS0tLS0tLS0tIFNwbGl0S2l0LmNwcCAtIFRvb2xraXQgZm9yIHNwbGl0dGluZyBsaXZlIHJhbmdlcyAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFNwbGl0QW5hbHlzaXMgY2xhc3MgYXMgd2VsbCBhcyBtdXRhdG9yIGZ1bmN0aW9ucyBmb3IKKy8vIGxpdmUgcmFuZ2Ugc3BsaXR0aW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAic3BsaXR0ZXIiCisjaW5jbHVkZSAiU3BsaXRLaXQuaCIKKyNpbmNsdWRlICJWaXJ0UmVnTWFwLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0NhbGNTcGlsbFdlaWdodHMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0FsbG93U3BsaXQoInNwaWxsZXItc3BsaXRzLWVkZ2VzIiwKKyAgICAgICAgICAgY2w6OmRlc2MoIkFsbG93IGNyaXRpY2FsIGVkZ2Ugc3BsaXR0aW5nIGR1cmluZyBzcGlsbGluZyIpKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BsaXQgQW5hbHlzaXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NwbGl0QW5hbHlzaXM6OlNwbGl0QW5hbHlzaXMoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGl2ZUludGVydmFscyAmbGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8gJm1saSkKKyAgOiBtZl8obWYpLAorICAgIGxpc18obGlzKSwKKyAgICBsb29wc18obWxpKSwKKyAgICB0aWlfKCptZi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKSksCisgICAgY3VybGlfKDApIHt9CisKK3ZvaWQgU3BsaXRBbmFseXNpczo6Y2xlYXIoKSB7CisgIHVzaW5nSW5zdHJzXy5jbGVhcigpOworICB1c2luZ0Jsb2Nrc18uY2xlYXIoKTsKKyAgdXNpbmdMb29wc18uY2xlYXIoKTsKKyAgY3VybGlfID0gMDsKK30KKworYm9vbCBTcGxpdEFuYWx5c2lzOjpjYW5BbmFseXplQnJhbmNoKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlQsICpGOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwgND4gQ29uZDsKKyAgcmV0dXJuICF0aWlfLkFuYWx5emVCcmFuY2goY29uc3RfY2FzdDxNYWNoaW5lQmFzaWNCbG9jayY+KCpNQkIpLCBULCBGLCBDb25kKTsKK30KKworLy8vIGFuYWx5emVVc2VzIC0gQ291bnQgaW5zdHJ1Y3Rpb25zLCBiYXNpYyBibG9ja3MsIGFuZCBsb29wcyB1c2luZyBjdXJsaS4KK3ZvaWQgU3BsaXRBbmFseXNpczo6YW5hbHl6ZVVzZXMoKSB7CisgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSA9IG1mXy5nZXRSZWdJbmZvKCk7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6cmVnX2l0ZXJhdG9yIEkgPSBNUkkucmVnX2JlZ2luKGN1cmxpXy0+cmVnKTsKKyAgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gSS5za2lwSW5zdHJ1Y3Rpb24oKTspIHsKKyAgICBpZiAoTUktPmlzRGVidWdWYWx1ZSgpIHx8ICF1c2luZ0luc3Ryc18uaW5zZXJ0KE1JKSkKKyAgICAgIGNvbnRpbnVlOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNSS0+Z2V0UGFyZW50KCk7CisgICAgaWYgKHVzaW5nQmxvY2tzX1tNQkJdKyspCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoTWFjaGluZUxvb3AgKkxvb3AgPSBsb29wc18uZ2V0TG9vcEZvcihNQkIpKQorICAgICAgdXNpbmdMb29wc18uaW5zZXJ0KExvb3ApOworICB9CisgIERFQlVHKGRiZ3MoKSA8PCAiQ291bnRlZCAiCisgICAgICAgICAgICAgICA8PCB1c2luZ0luc3Ryc18uc2l6ZSgpIDw8ICIgaW5zdHJzLCAiCisgICAgICAgICAgICAgICA8PCB1c2luZ0Jsb2Nrc18uc2l6ZSgpIDw8ICIgYmxvY2tzLCAiCisgICAgICAgICAgICAgICA8PCB1c2luZ0xvb3BzXy5zaXplKCkgIDw8ICIgbG9vcHMgaW4gIgorICAgICAgICAgICAgICAgPDwgKmN1cmxpXyA8PCAiXG4iKTsKK30KKworLy8gR2V0IHRocmVlIHNldHMgb2YgYmFzaWMgYmxvY2tzIHN1cnJvdW5kaW5nIGEgbG9vcDogQmxvY2tzIGluc2lkZSB0aGUgbG9vcCwKKy8vIHByZWRlY2Vzc29yIGJsb2NrcywgYW5kIGV4aXQgYmxvY2tzLgordm9pZCBTcGxpdEFuYWx5c2lzOjpnZXRMb29wQmxvY2tzKGNvbnN0IE1hY2hpbmVMb29wICpMb29wLCBMb29wQmxvY2tzICZCbG9ja3MpIHsKKyAgQmxvY2tzLmNsZWFyKCk7CisKKyAgLy8gQmxvY2tzIGluIHRoZSBsb29wLgorICBCbG9ja3MuTG9vcC5pbnNlcnQoTG9vcC0+YmxvY2tfYmVnaW4oKSwgTG9vcC0+YmxvY2tfZW5kKCkpOworCisgIC8vIFByZWRlY2Vzc29yIGJsb2Nrcy4KKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkhlYWRlciA9IExvb3AtPmdldEhlYWRlcigpOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9wcmVkX2l0ZXJhdG9yIEkgPSBIZWFkZXItPnByZWRfYmVnaW4oKSwKKyAgICAgICBFID0gSGVhZGVyLT5wcmVkX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoIUJsb2Nrcy5Mb29wLmNvdW50KCpJKSkKKyAgICAgIEJsb2Nrcy5QcmVkcy5pbnNlcnQoKkkpOworCisgIC8vIEV4aXQgYmxvY2tzLgorICBmb3IgKE1hY2hpbmVMb29wOjpibG9ja19pdGVyYXRvciBJID0gTG9vcC0+YmxvY2tfYmVnaW4oKSwKKyAgICAgICBFID0gTG9vcC0+YmxvY2tfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9ICpJOworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgU0kgPSBNQkItPnN1Y2NfYmVnaW4oKSwKKyAgICAgICBTRSA9IE1CQi0+c3VjY19lbmQoKTsgU0kgIT0gU0U7ICsrU0kpCisgICAgICBpZiAoIUJsb2Nrcy5Mb29wLmNvdW50KCpTSSkpCisgICAgICAgIEJsb2Nrcy5FeGl0cy5pbnNlcnQoKlNJKTsKKyAgfQorfQorCisvLy8gYW5hbHl6ZUxvb3BQZXJpcGhlcmFsVXNlIC0gUmV0dXJuIGFuIGVudW0gZGVzY3JpYmluZyBob3cgY3VybGlfIGlzIHVzZWQgaW4KKy8vLyBhbmQgYXJvdW5kIHRoZSBMb29wLgorU3BsaXRBbmFseXNpczo6TG9vcFBlcmlwaGVyYWxVc2UgU3BsaXRBbmFseXNpczo6CithbmFseXplTG9vcFBlcmlwaGVyYWxVc2UoY29uc3QgU3BsaXRBbmFseXNpczo6TG9vcEJsb2NrcyAmQmxvY2tzKSB7CisgIExvb3BQZXJpcGhlcmFsVXNlIHVzZSA9IENvbnRhaW5lZEluTG9vcDsKKyAgZm9yIChCbG9ja0NvdW50TWFwOjppdGVyYXRvciBJID0gdXNpbmdCbG9ja3NfLmJlZ2luKCksIEUgPSB1c2luZ0Jsb2Nrc18uZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gSS0+Zmlyc3Q7CisgICAgLy8gSXMgdGhpcyBhIHBlcmlwaGVyYWwgYmxvY2s/CisgICAgaWYgKHVzZSA8IE11bHRpUGVyaXBoZXJhbCAmJgorICAgICAgICAoQmxvY2tzLlByZWRzLmNvdW50KE1CQikgfHwgQmxvY2tzLkV4aXRzLmNvdW50KE1CQikpKSB7CisgICAgICBpZiAoSS0+c2Vjb25kID4gMSkgdXNlID0gTXVsdGlQZXJpcGhlcmFsOworICAgICAgZWxzZSAgICAgICAgICAgICAgIHVzZSA9IFNpbmdsZVBlcmlwaGVyYWw7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gSXMgaXQgYSBsb29wIGJsb2NrPworICAgIGlmIChCbG9ja3MuTG9vcC5jb3VudChNQkIpKQorICAgICAgY29udGludWU7CisgICAgLy8gSXQgbXVzdCBiZSBhbiB1bnJlbGF0ZWQgYmxvY2suCisgICAgcmV0dXJuIE91dHNpZGVMb29wOworICB9CisgIHJldHVybiB1c2U7Cit9CisKKy8vLyBnZXRDcml0aWNhbEV4aXRzIC0gSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBwYXJ0aWFsbHkgYnJlYWsgY3JpdGljYWwgZWRnZXMKKy8vLyBsZWF2aW5nIHRoZSBsb29wIGlmIGFuIGV4aXQgYmxvY2sgaGFzIHBoaSB1c2VzIG9mIGN1cmxpLiBDb2xsZWN0IHRoZSBleGl0CisvLy8gYmxvY2tzIHRoYXQgbmVlZCBzcGVjaWFsIHRyZWF0bWVudCBpbnRvIENyaXRpY2FsRXhpdHMuCit2b2lkIFNwbGl0QW5hbHlzaXM6OmdldENyaXRpY2FsRXhpdHMoY29uc3QgU3BsaXRBbmFseXNpczo6TG9vcEJsb2NrcyAmQmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrUHRyU2V0ICZDcml0aWNhbEV4aXRzKSB7CisgIENyaXRpY2FsRXhpdHMuY2xlYXIoKTsKKworICAvLyBBIGNyaXRpY2FsIGV4aXQgYmxvY2sgY29udGFpbnMgYSBwaGkgZGVmIG9mIGN1cmxpLCBhbmQgaGFzIGEgcHJlZGVjZXNzb3IKKyAgLy8gdGhhdCBpcyBub3QgaW4gdGhlIGxvb3Agbm9yIGEgbG9vcCBwcmVkZWNlc3Nvci4KKyAgLy8gRm9yIHN1Y2ggYW4gZXhpdCBibG9jaywgdGhlIGVkZ2VzIGNhcnJ5aW5nIHRoZSBuZXcgdmFyaWFibGUgbXVzdCBiZSBtb3ZlZAorICAvLyB0byBhIG5ldyBwcmUtZXhpdCBibG9jay4KKyAgZm9yIChCbG9ja1B0clNldDo6aXRlcmF0b3IgSSA9IEJsb2Nrcy5FeGl0cy5iZWdpbigpLCBFID0gQmxvY2tzLkV4aXRzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MgPSAqSTsKKyAgICBTbG90SW5kZXggU3VjY0lkeCA9IGxpc18uZ2V0TUJCU3RhcnRJZHgoU3VjYyk7CisgICAgVk5JbmZvICpTdWNjVk5JID0gY3VybGlfLT5nZXRWTkluZm9BdChTdWNjSWR4KTsKKyAgICAvLyBUaGlzIGV4aXQgbWF5IG5vdCBoYXZlIGN1cmxpIGxpdmUgaW4gYXQgYWxsLiBObyBuZWVkIHRvIHNwbGl0LgorICAgIGlmICghU3VjY1ZOSSkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIElmIHRoaXMgaXMgbm90IGEgUEhJIGRlZiwgaXQgaXMgZWl0aGVyIHVzaW5nIGEgdmFsdWUgZnJvbSBiZWZvcmUgdGhlCisgICAgLy8gbG9vcCwgb3IgYSB2YWx1ZSBkZWZpbmVkIGluc2lkZSB0aGUgbG9vcC4gQm90aCBhcmUgc2FmZS4KKyAgICBpZiAoIVN1Y2NWTkktPmlzUEhJRGVmKCkgfHwgU3VjY1ZOSS0+ZGVmLmdldEJhc2VJbmRleCgpICE9IFN1Y2NJZHgpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBUaGlzIGV4aXQgYmxvY2sgZG9lcyBoYXZlIGEgUEhJLiBEb2VzIGl0IGFsc28gaGF2ZSBhIHByZWRlY2Vzc29yIHRoYXQgaXMKKyAgICAvLyBub3QgYSBsb29wIGJsb2NrIG9yIGxvb3AgcHJlZGVjZXNzb3I/CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfcHJlZF9pdGVyYXRvciBQSSA9IFN1Y2MtPnByZWRfYmVnaW4oKSwKKyAgICAgICAgIFBFID0gU3VjYy0+cHJlZF9lbmQoKTsgUEkgIT0gUEU7ICsrUEkpIHsKKyAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkID0gKlBJOworICAgICAgaWYgKEJsb2Nrcy5Mb29wLmNvdW50KFByZWQpIHx8IEJsb2Nrcy5QcmVkcy5jb3VudChQcmVkKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBUaGlzIGlzIGEgY3JpdGljYWwgZXhpdCBibG9jaywgYW5kIHdlIG5lZWQgdG8gc3BsaXQgdGhlIGV4aXQgZWRnZS4KKyAgICAgIENyaXRpY2FsRXhpdHMuaW5zZXJ0KFN1Y2MpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8vLyBjYW5TcGxpdENyaXRpY2FsRXhpdHMgLSBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBpbnNlcnQgbmV3IGV4aXQKKy8vLyBibG9ja3MgYmVmb3JlIHRoZSBibG9ja3MgaW4gQ3JpdGljYWxFeGl0cy4KK2Jvb2wKK1NwbGl0QW5hbHlzaXM6OmNhblNwbGl0Q3JpdGljYWxFeGl0cyhjb25zdCBTcGxpdEFuYWx5c2lzOjpMb29wQmxvY2tzICZCbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tQdHJTZXQgJkNyaXRpY2FsRXhpdHMpIHsKKyAgLy8gSWYgd2UgZG9uJ3QgYWxsb3cgY3JpdGljYWwgZWRnZSBzcGxpdHRpbmcsIHJlcXVpcmUgbm8gY3JpdGljYWwgZXhpdHMuCisgIGlmICghQWxsb3dTcGxpdCkKKyAgICByZXR1cm4gQ3JpdGljYWxFeGl0cy5lbXB0eSgpOworCisgIGZvciAoQmxvY2tQdHJTZXQ6Oml0ZXJhdG9yIEkgPSBDcml0aWNhbEV4aXRzLmJlZ2luKCksIEUgPSBDcml0aWNhbEV4aXRzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MgPSAqSTsKKyAgICAvLyBXZSB3YW50IHRvIGluc2VydCBhIG5ldyBwcmUtZXhpdCBNQkIgYmVmb3JlIFN1Y2MsIGFuZCBjaGFuZ2UgYWxsIHRoZQorICAgIC8vIGluLWxvb3AgYmxvY2tzIHRvIGJyYW5jaCB0byB0aGUgcHJlLWV4aXQgaW5zdGVhZCBvZiBTdWNjLgorICAgIC8vIENoZWNrIHRoYXQgYWxsIHRoZSBpbi1sb29wIHByZWRlY2Vzc29ycyBjYW4gYmUgY2hhbmdlZC4KKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9wcmVkX2l0ZXJhdG9yIFBJID0gU3VjYy0+cHJlZF9iZWdpbigpLAorICAgICAgICAgUEUgPSBTdWNjLT5wcmVkX2VuZCgpOyBQSSAhPSBQRTsgKytQSSkgeworICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlByZWQgPSAqUEk7CisgICAgICAvLyBUaGUgZXh0ZXJuYWwgcHJlZGVjZXNzb3JzIHdvbid0IGJlIGFsdGVyZWQuCisgICAgICBpZiAoIUJsb2Nrcy5Mb29wLmNvdW50KFByZWQpICYmICFCbG9ja3MuUHJlZHMuY291bnQoUHJlZCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKCFjYW5BbmFseXplQnJhbmNoKFByZWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSWYgU3VjYydzIGxheW91dCBwcmVkZWNlc3NvciBmYWxscyB0aHJvdWdoLCB0aGF0IHRvbyBtdXN0IGJlIGFuYWx5emFibGUuCisgICAgLy8gV2UgbmVlZCB0byBpbnNlcnQgdGhlIHByZS1leGl0IGJsb2NrIGluIHRoZSBnYXAuCisgICAgTWFjaGluZUZ1bmN0aW9uOjpjb25zdF9pdGVyYXRvciBNRkkgPSBTdWNjOworICAgIGlmIChNRkkgPT0gbWZfLmJlZ2luKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIWNhbkFuYWx5emVCcmFuY2goLS1NRkkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vIHByb2JsZW1zIGZvdW5kLgorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTcGxpdEFuYWx5c2lzOjphbmFseXplKGNvbnN0IExpdmVJbnRlcnZhbCAqbGkpIHsKKyAgY2xlYXIoKTsKKyAgY3VybGlfID0gbGk7CisgIGFuYWx5emVVc2VzKCk7Cit9CisKK2NvbnN0IE1hY2hpbmVMb29wICpTcGxpdEFuYWx5c2lzOjpnZXRCZXN0U3BsaXRMb29wKCkgeworICBhc3NlcnQoY3VybGlfICYmICJDYWxsIGFuYWx5emUoKSBiZWZvcmUgZ2V0QmVzdFNwbGl0TG9vcCIpOworICBpZiAodXNpbmdMb29wc18uZW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKworICBMb29wUHRyU2V0IExvb3BzLCBTZWNvbmRMb29wczsKKyAgTG9vcEJsb2NrcyBCbG9ja3M7CisgIEJsb2NrUHRyU2V0IENyaXRpY2FsRXhpdHM7CisKKyAgLy8gRmluZCBmaXJzdC1jbGFzcyBhbmQgc2Vjb25kIGNsYXNzIGNhbmRpZGF0ZSBsb29wcy4KKyAgLy8gV2UgcHJlZmVyIHRvIHNwbGl0IGFyb3VuZCBsb29wcyB3aGVyZSBjdXJsaSBpcyB1c2VkIG91dHNpZGUgdGhlIHBlcmlwaGVyeS4KKyAgZm9yIChMb29wUHRyU2V0Ojpjb25zdF9pdGVyYXRvciBJID0gdXNpbmdMb29wc18uYmVnaW4oKSwKKyAgICAgICBFID0gdXNpbmdMb29wc18uZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgZ2V0TG9vcEJsb2NrcygqSSwgQmxvY2tzKTsKKworICAgIC8vIEZJWE1FOiBXZSBuZWVkIGFuIFNTQSB1cGRhdGVyIHRvIHByb3Blcmx5IGhhbmRsZSBtdWx0aXBsZSBleGl0IGJsb2Nrcy4KKyAgICBpZiAoQmxvY2tzLkV4aXRzLnNpemUoKSA+IDEpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiTXVsdGlwbGVFeGl0czogIiA8PCAqKkkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgTG9vcFB0clNldCAqTFBTID0gMDsKKyAgICBzd2l0Y2goYW5hbHl6ZUxvb3BQZXJpcGhlcmFsVXNlKEJsb2NrcykpIHsKKyAgICBjYXNlIE91dHNpZGVMb29wOgorICAgICAgTFBTID0gJkxvb3BzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNdWx0aVBlcmlwaGVyYWw6CisgICAgICBMUFMgPSAmU2Vjb25kTG9vcHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIENvbnRhaW5lZEluTG9vcDoKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQ29udGFpbmVkSW5Mb29wOiAiIDw8ICoqSSk7CisgICAgICBjb250aW51ZTsKKyAgICBjYXNlIFNpbmdsZVBlcmlwaGVyYWw6CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlNpbmdsZVBlcmlwaGVyYWw6ICIgPDwgKipJKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBXaWxsIGl0IGJlIHBvc3NpYmxlIHRvIHNwbGl0IGFyb3VuZCB0aGlzIGxvb3A/CisgICAgZ2V0Q3JpdGljYWxFeGl0cyhCbG9ja3MsIENyaXRpY2FsRXhpdHMpOworICAgIERFQlVHKGRiZ3MoKSA8PCBDcml0aWNhbEV4aXRzLnNpemUoKSA8PCAiIGNyaXRpY2FsIGV4aXRzOiAiIDw8ICoqSSk7CisgICAgaWYgKCFjYW5TcGxpdENyaXRpY2FsRXhpdHMoQmxvY2tzLCBDcml0aWNhbEV4aXRzKSkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIFRoaXMgaXMgYSBwb3NzaWJsZSBzcGxpdC4KKyAgICBhc3NlcnQoTFBTKTsKKyAgICBMUFMtPmluc2VydCgqSSk7CisgIH0KKworICBERUJVRyhkYmdzKCkgPDwgIkdvdCAiIDw8IExvb3BzLnNpemUoKSA8PCAiICsgIiA8PCBTZWNvbmRMb29wcy5zaXplKCkKKyAgICAgICAgICAgICAgIDw8ICIgY2FuZGlkYXRlIGxvb3BzXG4iKTsKKworICAvLyBJZiB0aGVyZSBhcmUgbm8gZmlyc3QgY2xhc3MgbG9vcHMgYXZhaWxhYmxlLCBsb29rIGF0IHNlY29uZCBjbGFzcyBsb29wcy4KKyAgaWYgKExvb3BzLmVtcHR5KCkpCisgICAgTG9vcHMgPSBTZWNvbmRMb29wczsKKworICBpZiAoTG9vcHMuZW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBQaWNrIHRoZSBlYXJsaWVzdCBsb29wLgorICAvLyBGSVhNRTogQXJlIHRoZXJlIG90aGVyIGhldXJpc3RpY3MgdG8gY29uc2lkZXI/CisgIGNvbnN0IE1hY2hpbmVMb29wICpCZXN0ID0gMDsKKyAgU2xvdEluZGV4IEJlc3RJZHg7CisgIGZvciAoTG9vcFB0clNldDo6Y29uc3RfaXRlcmF0b3IgSSA9IExvb3BzLmJlZ2luKCksIEUgPSBMb29wcy5lbmQoKTsgSSAhPSBFOworICAgICAgICsrSSkgeworICAgIFNsb3RJbmRleCBJZHggPSBsaXNfLmdldE1CQlN0YXJ0SWR4KCgqSSktPmdldEhlYWRlcigpKTsKKyAgICBpZiAoIUJlc3QgfHwgSWR4IDwgQmVzdElkeCkKKyAgICAgIEJlc3QgPSAqSSwgQmVzdElkeCA9IElkeDsKKyAgfQorICBERUJVRyhkYmdzKCkgPDwgIkJlc3Q6ICIgPDwgKkJlc3QpOworICByZXR1cm4gQmVzdDsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BsaXQgRWRpdG9yCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQ3JlYXRlIGEgbmV3IFNwbGl0RWRpdG9yIGZvciBlZGl0aW5nIHRoZSBMaXZlSW50ZXJ2YWwgYW5hbHl6ZWQgYnkgU0EuCitTcGxpdEVkaXRvcjo6U3BsaXRFZGl0b3IoU3BsaXRBbmFseXNpcyAmc2EsIExpdmVJbnRlcnZhbHMgJmxpcywgVmlydFJlZ01hcCAmdnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+ICZpbnRlcnZhbHMpCisgIDogc2FfKHNhKSwgbGlzXyhsaXMpLCB2cm1fKHZybSksCisgICAgbXJpXyh2cm0uZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0UmVnSW5mbygpKSwKKyAgICB0aWlfKCp2cm0uZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCkpLAorICAgIGN1cmxpXyhzYV8uZ2V0Q3VyTEkoKSksCisgICAgZHVwbGlfKDApLCBvcGVubGlfKDApLAorICAgIGludGVydmFsc18oaW50ZXJ2YWxzKSwKKyAgICBmaXJzdEludGVydmFsKGludGVydmFsc18uc2l6ZSgpKQoreworICBhc3NlcnQoY3VybGlfICYmICJTcGxpdEVkaXRvciBjcmVhdGVkIGZyb20gZW1wdHkgU3BsaXRBbmFseXNpcyIpOworCisgIC8vIE1ha2Ugc3VyZSBjdXJsaV8gaXMgYXNzaWduZWQgYSBzdGFjayBzbG90LCBzbyBhbGwgb3VyIGludGVydmFscyBnZXQgdGhlCisgIC8vIHNhbWUgc2xvdCBhcyBjdXJsaV8uCisgIGlmICh2cm1fLmdldFN0YWNrU2xvdChjdXJsaV8tPnJlZykgPT0gVmlydFJlZ01hcDo6Tk9fU1RBQ0tfU0xPVCkKKyAgICB2cm1fLmFzc2lnblZpcnQyU3RhY2tTbG90KGN1cmxpXy0+cmVnKTsKKworfQorCitMaXZlSW50ZXJ2YWwgKlNwbGl0RWRpdG9yOjpjcmVhdGVJbnRlcnZhbCgpIHsKKyAgdW5zaWduZWQgY3VybGkgPSBzYV8uZ2V0Q3VyTEkoKS0+cmVnOworICB1bnNpZ25lZCBSZWcgPSBtcmlfLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihtcmlfLmdldFJlZ0NsYXNzKGN1cmxpKSk7CisgIExpdmVJbnRlcnZhbCAmSW50diA9IGxpc18uZ2V0T3JDcmVhdGVJbnRlcnZhbChSZWcpOworICB2cm1fLmdyb3coKTsKKyAgdnJtXy5hc3NpZ25WaXJ0MlN0YWNrU2xvdChSZWcsIHZybV8uZ2V0U3RhY2tTbG90KGN1cmxpKSk7CisgIHJldHVybiAmSW50djsKK30KKworTGl2ZUludGVydmFsICpTcGxpdEVkaXRvcjo6Z2V0RHVwTEkoKSB7CisgIGlmICghZHVwbGlfKSB7CisgICAgLy8gQ3JlYXRlIGFuIGludGVydmFsIGZvciBkdXBsaSB0aGF0IGlzIGEgY29weSBvZiBjdXJsaS4KKyAgICBkdXBsaV8gPSBjcmVhdGVJbnRlcnZhbCgpOworICAgIGR1cGxpXy0+Q29weSgqY3VybGlfLCAmbXJpXywgbGlzXy5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisgICAgREVCVUcoZGJncygpIDw8ICJTcGxpdEVkaXRvciBEdXBMSTogIiA8PCAqZHVwbGlfIDw8ICdcbicpOworICB9CisgIHJldHVybiBkdXBsaV87Cit9CisKK1ZOSW5mbyAqU3BsaXRFZGl0b3I6Om1hcFZhbHVlKGNvbnN0IFZOSW5mbyAqY3VybGlWTkkpIHsKKyAgVk5JbmZvIComVk5JID0gdmFsdWVNYXBfW2N1cmxpVk5JXTsKKyAgaWYgKCFWTkkpCisgICAgVk5JID0gb3BlbmxpXy0+Y3JlYXRlVmFsdWVDb3B5KGN1cmxpVk5JLCBsaXNfLmdldFZOSW5mb0FsbG9jYXRvcigpKTsKKyAgcmV0dXJuIFZOSTsKK30KKworLy8vIEluc2VydCBhIENPUFkgaW5zdHJ1Y3Rpb24gY3VybGkgLT4gbGkuIEFsbG9jYXRlIGEgbmV3IHZhbHVlIGZyb20gbGkKKy8vLyBkZWZpbmVkIGJ5IHRoZSBDT1BZLiBOb3RlIHRoYXQgcmV3cml0ZSgpIHdpbGwgZGVhbCB3aXRoIHRoZSBjdXJsaQorLy8vIHJlZ2lzdGVyLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvcHkgZnJvbSBhbnkgaW50ZXJ2YWwgLSBvcGVubGksCisvLy8gY3VybGksIG9yIGR1cGxpLgorVk5JbmZvICpTcGxpdEVkaXRvcjo6aW5zZXJ0Q29weShMaXZlSW50ZXJ2YWwgJkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gQnVpbGRNSShNQkIsIEksIERlYnVnTG9jKCksIHRpaV8uZ2V0KFRhcmdldE9wY29kZTo6Q09QWSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJLnJlZykuYWRkUmVnKGN1cmxpXy0+cmVnKTsKKyAgU2xvdEluZGV4IERlZklkeCA9IGxpc18uSW5zZXJ0TWFjaGluZUluc3RySW5NYXBzKE1JKS5nZXREZWZJbmRleCgpOworICByZXR1cm4gTEkuZ2V0TmV4dFZhbHVlKERlZklkeCwgTUksIHRydWUsIGxpc18uZ2V0Vk5JbmZvQWxsb2NhdG9yKCkpOworfQorCisvLy8gQ3JlYXRlIGEgbmV3IHZpcnR1YWwgcmVnaXN0ZXIgYW5kIGxpdmUgaW50ZXJ2YWwuCit2b2lkIFNwbGl0RWRpdG9yOjpvcGVuSW50digpIHsKKyAgYXNzZXJ0KCFvcGVubGlfICYmICJQcmV2aW91cyBMSSBub3QgY2xvc2VkIGJlZm9yZSBvcGVuSW50diIpOworICBvcGVubGlfID0gY3JlYXRlSW50ZXJ2YWwoKTsKKyAgaW50ZXJ2YWxzXy5wdXNoX2JhY2sob3BlbmxpXyk7CisgIGxpdmVUaHJvdWdoXyA9IGZhbHNlOworfQorCisvLy8gZW50ZXJJbnR2QXRFbmQgLSBFbnRlciBvcGVubGkgYXQgdGhlIGVuZCBvZiBNQkIuCisvLy8gUGhpTUJCIGlzIGEgc3VjY2Vzc29yIGluc2lkZSBvcGVubGkgd2hlcmUgYSBQSEkgdmFsdWUgaXMgY3JlYXRlZC4KKy8vLyBDdXJyZW50bHksIGFsbCBlbnRyaWVzIG11c3Qgc2hhcmUgdGhlIHNhbWUgUGhpTUJCLgordm9pZCBTcGxpdEVkaXRvcjo6ZW50ZXJJbnR2QXRFbmQoTWFjaGluZUJhc2ljQmxvY2sgJkEsIE1hY2hpbmVCYXNpY0Jsb2NrICZCKSB7CisgIGFzc2VydChvcGVubGlfICYmICJvcGVuSW50diBub3QgY2FsbGVkIGJlZm9yZSBlbnRlckludHZBdEVuZCIpOworCisgIFNsb3RJbmRleCBFbmRBID0gbGlzXy5nZXRNQkJFbmRJZHgoJkEpOworICBWTkluZm8gKkN1clZOSUEgPSBjdXJsaV8tPmdldFZOSW5mb0F0KEVuZEEuZ2V0UHJldkluZGV4KCkpOworICBpZiAoIUN1clZOSUEpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgaWdub3JpbmcgZW50ZXJJbnR2QXRFbmQsIGN1cmxpIG5vdCBsaXZlIG91dCBvZiBCQiMiCisgICAgICAgICAgICAgICAgIDw8IEEuZ2V0TnVtYmVyKCkgPDwgIi5cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEFkZCBhIHBoaSBraWxsIHZhbHVlIGFuZCBsaXZlIHJhbmdlIG91dCBvZiBBLgorICBWTkluZm8gKlZOSUEgPSBpbnNlcnRDb3B5KCpvcGVubGlfLCBBLCBBLmdldEZpcnN0VGVybWluYXRvcigpKTsKKyAgb3BlbmxpXy0+YWRkUmFuZ2UoTGl2ZVJhbmdlKFZOSUEtPmRlZiwgRW5kQSwgVk5JQSkpOworCisgIC8vIEZJWE1FOiBJZiB0aGlzIGlzIHRoZSBvbmx5IGVudHJ5IGVkZ2UsIHdlIGRvbid0IG5lZWQgdGhlIGV4dHJhIFBISSB2YWx1ZS4KKyAgLy8gRklYTUU6IElmIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyeSBibG9ja3MgKHNvIG5vdCBhIGxvb3ApLCB3ZSBuZWVkIHByb3BlcgorICAvLyBTU0EgdXBkYXRlLgorCisgIC8vIE5vdyBsb29rIGF0IHRoZSBzdGFydCBvZiBCLgorICBTbG90SW5kZXggU3RhcnRCID0gbGlzXy5nZXRNQkJTdGFydElkeCgmQik7CisgIFNsb3RJbmRleCBFbmRCID0gbGlzXy5nZXRNQkJFbmRJZHgoJkIpOworICBjb25zdCBMaXZlUmFuZ2UgKkN1ckIgPSBjdXJsaV8tPmdldExpdmVSYW5nZUNvbnRhaW5pbmcoU3RhcnRCKTsKKyAgaWYgKCFDdXJCKSB7CisgICAgREVCVUcoZGJncygpIDw8ICIgIGVudGVySW50dkF0RW5kOiBjdXJsaSBub3QgbGl2ZSBpbiB0byBCQiMiCisgICAgICAgICAgICAgICAgIDw8IEIuZ2V0TnVtYmVyKCkgPDwgIi5cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIFZOSW5mbyAqVk5JQiA9IG9wZW5saV8tPmdldFZOSW5mb0F0KFN0YXJ0Qik7CisgIGlmICghVk5JQikgeworICAgIC8vIENyZWF0ZSBhIHBoaSB2YWx1ZS4KKyAgICBWTklCID0gb3BlbmxpXy0+Z2V0TmV4dFZhbHVlKFNsb3RJbmRleChTdGFydEIsIHRydWUpLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc18uZ2V0Vk5JbmZvQWxsb2NhdG9yKCkpOworICAgIFZOSUItPnNldElzUEhJRGVmKHRydWUpOworICAgIC8vIEFkZCBhIG1pbmltYWwgcmFuZ2UgZm9yIHRoZSBuZXcgdmFsdWUuCisgICAgb3BlbmxpXy0+YWRkUmFuZ2UoTGl2ZVJhbmdlKFZOSUItPmRlZiwgc3RkOjptaW4oRW5kQiwgQ3VyQi0+ZW5kKSwgVk5JQikpOworCisgICAgVk5JbmZvICombWFwVk5JID0gdmFsdWVNYXBfW0N1ckItPnZhbG5vXTsKKyAgICBpZiAobWFwVk5JKSB7CisgICAgICAvLyBNdWx0aXBsZSBjb3BpZXMgLSBtdXN0IGNyZWF0ZSBQSEkgdmFsdWUuCisgICAgICBhYm9ydCgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBjb3B5IG9mIGR1cExSLiBNYXJrIHRoZSBtYXBwaW5nLgorICAgICAgbWFwVk5JID0gVk5JQjsKKyAgICB9CisKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiICBlbnRlckludHZBdEVuZDogIiA8PCAqb3BlbmxpXyA8PCAnXG4nKTsKK30KKworLy8vIHVzZUludHYgLSBpbmRpY2F0ZSB0aGF0IGFsbCBpbnN0cnVjdGlvbnMgaW4gTUJCIHNob3VsZCB1c2Ugb3BlbmxpLgordm9pZCBTcGxpdEVkaXRvcjo6dXNlSW50dihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSB7CisgIHVzZUludHYobGlzXy5nZXRNQkJTdGFydElkeCgmTUJCKSwgbGlzXy5nZXRNQkJFbmRJZHgoJk1CQikpOworfQorCit2b2lkIFNwbGl0RWRpdG9yOjp1c2VJbnR2KFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCkgeworICBhc3NlcnQob3BlbmxpXyAmJiAib3BlbkludHYgbm90IGNhbGxlZCBiZWZvcmUgdXNlSW50diIpOworCisgIC8vIE1hcCB0aGUgY3VybGkgdmFsdWVzIGZyb20gdGhlIGludGVydmFsIGludG8gb3BlbmxpXworICBMaXZlSW50ZXJ2YWw6OmNvbnN0X2l0ZXJhdG9yIEIgPSBjdXJsaV8tPmJlZ2luKCksIEUgPSBjdXJsaV8tPmVuZCgpOworICBMaXZlSW50ZXJ2YWw6OmNvbnN0X2l0ZXJhdG9yIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKEIsIEUsIFN0YXJ0KTsKKworICBpZiAoSSAhPSBCKSB7CisgICAgLS1JOworICAgIC8vIEkgYmVnaW5zIGJlZm9yZSBTdGFydCwgYnV0IG92ZXJsYXBzLiBvcGVubGkgbWF5IGFscmVhZHkgaGF2ZSBhIHZhbHVlLgorICAgIGlmIChJLT5lbmQgPiBTdGFydCAmJiAhb3BlbmxpXy0+bGl2ZUF0KFN0YXJ0KSkKKyAgICAgIG9wZW5saV8tPmFkZFJhbmdlKExpdmVSYW5nZShTdGFydCwgc3RkOjptaW4oRW5kLCBJLT5lbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUoSS0+dmFsbm8pKSk7CisgICAgKytJOworICB9CisKKyAgLy8gVGhlIHJlbWFpbmluZyByYW5nZXMgYmVnaW4gYWZ0ZXIgU3RhcnQuCisgIGZvciAoO0kgIT0gRSAmJiBJLT5zdGFydCA8IEVuZDsgKytJKQorICAgIG9wZW5saV8tPmFkZFJhbmdlKExpdmVSYW5nZShJLT5zdGFydCwgc3RkOjptaW4oRW5kLCBJLT5lbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBWYWx1ZShJLT52YWxubykpKTsKKyAgREVCVUcoZGJncygpIDw8ICIgIGFkZGVkIHJhbmdlIFsiIDw8IFN0YXJ0IDw8ICc7JyA8PCBFbmQgPDwgIik6ICIgPDwgKm9wZW5saV8KKyAgICAgICAgICAgICAgIDw8ICdcbicpOworfQorCisvLy8gbGVhdmVJbnR2QXRUb3AgLSBMZWF2ZSB0aGUgaW50ZXJ2YWwgYXQgdGhlIHRvcCBvZiBNQkIuCisvLy8gQ3VycmVudGx5LCBvbmx5IG9uZSB2YWx1ZSBjYW4gbGVhdmUgdGhlIGludGVydmFsLgordm9pZCBTcGxpdEVkaXRvcjo6bGVhdmVJbnR2QXRUb3AoTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgeworICBhc3NlcnQob3BlbmxpXyAmJiAib3BlbkludHYgbm90IGNhbGxlZCBiZWZvcmUgbGVhdmVJbnR2QXRUb3AiKTsKKworICBTbG90SW5kZXggU3RhcnQgPSBsaXNfLmdldE1CQlN0YXJ0SWR4KCZNQkIpOworICBjb25zdCBMaXZlUmFuZ2UgKkN1ckxSID0gY3VybGlfLT5nZXRMaXZlUmFuZ2VDb250YWluaW5nKFN0YXJ0KTsKKworICAvLyBJcyBjdXJsaSBldmVuIGxpdmUtaW4gdG8gTUJCPworICBpZiAoIUN1ckxSKSB7CisgICAgREVCVUcoZGJncygpIDw8ICIgIGxlYXZlSW50dkF0VG9wIGF0ICIgPDwgU3RhcnQgPDwgIjogbm90IGxpdmVcbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElzIGN1cmxpIGRlZmluZWQgYnkgUEhJIGF0IHRoZSBiZWdpbm5pbmcgb2YgTUJCPworICBib29sIGlzUEhJRGVmID0gQ3VyTFItPnZhbG5vLT5pc1BISURlZigpICYmCisgICAgICAgICAgICAgICAgICBDdXJMUi0+dmFsbm8tPmRlZi5nZXRCYXNlSW5kZXgoKSA9PSBTdGFydDsKKworICAvLyBJZiBNQkIgaXMgdXNpbmcgYSB2YWx1ZSBvZiBjdXJsaSB0aGF0IHdhcyBkZWZpbmVkIG91dHNpZGUgdGhlIG9wZW5saSByYW5nZSwKKyAgLy8gd2UgZG9uJ3Qgd2FudCB0byBjb3B5IGl0IGJhY2sgaGVyZS4KKyAgaWYgKCFpc1BISURlZiAmJiAhb3BlbmxpXy0+bGl2ZUF0KEN1ckxSLT52YWxuby0+ZGVmKSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBsZWF2ZUludHZBdFRvcCBhdCAiIDw8IFN0YXJ0CisgICAgICAgICAgICAgICAgIDw8ICI6IHVzaW5nIGV4dGVybmFsIHZhbHVlXG4iKTsKKyAgICBsaXZlVGhyb3VnaF8gPSB0cnVlOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFdlIGFyZSBnb2luZyB0byBpbnNlcnQgYSBiYWNrIGNvcHksIHNvIHdlIG11c3QgaGF2ZSBhIGR1cGxpXy4KKyAgTGl2ZVJhbmdlICpEdXBMUiA9IGdldER1cExJKCktPmdldExpdmVSYW5nZUNvbnRhaW5pbmcoU3RhcnQpOworICBhc3NlcnQoRHVwTFIgJiYgImR1cGxpIG5vdCBsaXZlIGludG8gYmxhY2ssIGJ1dCBjdXJsaSBpcz8iKTsKKworICAvLyBJbnNlcnQgdGhlIENPUFkgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ciAqTUkgPSBCdWlsZE1JKE1CQiwgTUJCLmJlZ2luKCksIERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpaV8uZ2V0KFRhcmdldE9wY29kZTo6Q09QWSksIGR1cGxpXy0+cmVnKQorICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKG9wZW5saV8tPnJlZyk7CisgIFNsb3RJbmRleCBJZHggPSBsaXNfLkluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhNSSkuZ2V0RGVmSW5kZXgoKTsKKworICAvLyBBZGp1c3QgZHVwbGkgYW5kIG9wZW5saSB2YWx1ZXMuCisgIGlmIChpc1BISURlZikgeworICAgIC8vIGR1cGxpIHdhcyBhbHJlYWR5IGEgUEhJIG9uIGVudHJ5IHRvIE1CQi4gU2ltcGx5IGluc2VydCBhbiBvcGVubGkgUEhJLAorICAgIC8vIGFuZCBzaGlmdCB0aGUgZHVwbGkgZGVmIGRvd24gdG8gdGhlIENPUFkuCisgICAgVk5JbmZvICpWTkkgPSBvcGVubGlfLT5nZXROZXh0VmFsdWUoU2xvdEluZGV4KFN0YXJ0LCB0cnVlKSwgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzXy5nZXRWTkluZm9BbGxvY2F0b3IoKSk7CisgICAgVk5JLT5zZXRJc1BISURlZih0cnVlKTsKKyAgICBvcGVubGlfLT5hZGRSYW5nZShMaXZlUmFuZ2UoVk5JLT5kZWYsIElkeCwgVk5JKSk7CisKKyAgICBkdXBsaV8tPnJlbW92ZVJhbmdlKFN0YXJ0LCBJZHgpOworICAgIER1cExSLT52YWxuby0+ZGVmID0gSWR4OworICAgIER1cExSLT52YWxuby0+c2V0SXNQSElEZWYoZmFsc2UpOworICB9IGVsc2UgeworICAgIC8vIFRoZSBkdXBsaSB2YWx1ZSB3YXMgZGVmaW5lZCBzb21ld2hlcmUgaW5zaWRlIHRoZSBvcGVubGkgcmFuZ2UuCisgICAgREVCVUcoZGJncygpIDw8ICIgIGxlYXZlSW50dkF0VG9wIHNvdXJjZSB2YWx1ZSBkZWZpbmVkIGF0ICIKKyAgICAgICAgICAgICAgICAgPDwgRHVwTFItPnZhbG5vLT5kZWYgPDwgIlxuIik7CisgICAgLy8gRklYTUU6IFdlIG1heSBub3QgbmVlZCBhIFBISSBoZXJlIGlmIGFsbCBwcmVkZWNlc3NvcnMgaGF2ZSB0aGUgc2FtZQorICAgIC8vIHZhbHVlLgorICAgIFZOSW5mbyAqVk5JID0gb3BlbmxpXy0+Z2V0TmV4dFZhbHVlKFNsb3RJbmRleChTdGFydCwgdHJ1ZSksIDAsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc18uZ2V0Vk5JbmZvQWxsb2NhdG9yKCkpOworICAgIFZOSS0+c2V0SXNQSElEZWYodHJ1ZSk7CisgICAgb3BlbmxpXy0+YWRkUmFuZ2UoTGl2ZVJhbmdlKFZOSS0+ZGVmLCBJZHgsIFZOSSkpOworCisgICAgLy8gRklYTUU6IFdoYXQgaWYgRHVwTFItPnZhbG5vIGlzIHVzZWQgYnkgbXVsdGlwbGUgZXhpdHM/IFNTQSBVcGRhdGUuCisKKyAgICAvLyBjbG9zZUludHYgaXMgZ29pbmcgdG8gcmVtb3ZlIHRoZSBzdXBlcmZsdW91cyBsaXZlIHJhbmdlcy4KKyAgICBEdXBMUi0+dmFsbm8tPmRlZiA9IElkeDsKKyAgICBEdXBMUi0+dmFsbm8tPnNldElzUEhJRGVmKGZhbHNlKTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiICBsZWF2ZUludHZBdFRvcCBhdCAiIDw8IElkeCA8PCAiOiAiIDw8ICpvcGVubGlfIDw8ICdcbicpOworfQorCisvLy8gY2xvc2VJbnR2IC0gSW5kaWNhdGUgdGhhdCB3ZSBhcmUgZG9uZSBlZGl0aW5nIHRoZSBjdXJyZW50bHkgb3BlbgorLy8vIExpdmVJbnRlcnZhbCwgYW5kIHJhbmdlcyBjYW4gYmUgdHJpbW1lZC4KK3ZvaWQgU3BsaXRFZGl0b3I6OmNsb3NlSW50digpIHsKKyAgYXNzZXJ0KG9wZW5saV8gJiYgIm9wZW5JbnR2IG5vdCBjYWxsZWQgYmVmb3JlIGNsb3NlSW50diIpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiICBjbG9zZUludHYgY2xlYW5pbmcgdXBcbiIpOworICBERUJVRyhkYmdzKCkgPDwgIiAgICBvcGVuICIgPDwgKm9wZW5saV8gPDwgJ1xuJyk7CisKKyAgaWYgKGxpdmVUaHJvdWdoXykgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiICB2YWx1ZSBsaXZlIHRocm91Z2ggcmVnaW9uLCBsZWF2aW5nIGR1cGxpIGFzIGlzLlxuIik7CisgIH0gZWxzZSB7CisgICAgLy8gbGl2ZSBvdXQgd2l0aCBjb3BpZXMgaW5zZXJ0ZWQsIG9yIGtpbGxlZCBieSByZWdpb24uIEVpdGhlciB3YXkgd2UgbmVlZCB0bworICAgIC8vIHJlbW92ZSB0aGUgb3ZlcmxhcHBpbmcgcmVnaW9uIGZyb20gZHVwbGkuCisgICAgZ2V0RHVwTEkoKTsKKyAgICBmb3IgKExpdmVJbnRlcnZhbDo6aXRlcmF0b3IgSSA9IG9wZW5saV8tPmJlZ2luKCksIEUgPSBvcGVubGlfLT5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBkdXBsaV8tPnJlbW92ZVJhbmdlKEktPnN0YXJ0LCBJLT5lbmQpOworICAgIH0KKyAgICAvLyBGSVhNRTogQSBibG9jayBicmFuY2hpbmcgdG8gdGhlIGVudHJ5IGJsb2NrIG1heSBhbHNvIGJyYW5jaCBlbHNld2hlcmUKKyAgICAvLyBjdXJsaSBpcyBsaXZlLiBXZSBuZWVkIGJvdGggb3BlbmxpIGFuZCBjdXJsaSB0byBiZSBsaXZlIGluIHRoYXQgY2FzZS4KKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgICBkdXAyICIgPDwgKmR1cGxpXyA8PCAnXG4nKTsKKyAgfQorICBvcGVubGlfID0gMDsKK30KKworLy8vIHJld3JpdGUgLSBhZnRlciBhbGwgdGhlIG5ldyBsaXZlIHJhbmdlcyBoYXZlIGJlZW4gY3JlYXRlZCwgcmV3cml0ZQorLy8vIGluc3RydWN0aW9ucyB1c2luZyBjdXJsaSB0byB1c2UgdGhlIG5ldyBpbnRlcnZhbHMuCit2b2lkIFNwbGl0RWRpdG9yOjpyZXdyaXRlKCkgeworICBhc3NlcnQoIW9wZW5saV8gJiYgIlByZXZpb3VzIExJIG5vdCBjbG9zZWQgYmVmb3JlIHJld3JpdGUiKTsKKyAgY29uc3QgTGl2ZUludGVydmFsICpjdXJsaSA9IHNhXy5nZXRDdXJMSSgpOworICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnJlZ19pdGVyYXRvciBSSSA9IG1yaV8ucmVnX2JlZ2luKGN1cmxpLT5yZWcpLAorICAgICAgIFJFID0gbXJpXy5yZWdfZW5kKCk7IFJJICE9IFJFOykgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IFJJLmdldE9wZXJhbmQoKTsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gTU8uZ2V0UGFyZW50KCk7CisgICAgKytSSTsKKyAgICBpZiAoTUktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlphcHBpbmcgIiA8PCAqTUkpOworICAgICAgLy8gRklYTUU6IFdlIGNhbiBkbyBtdWNoIGJldHRlciB3aXRoIGRlYnVnIHZhbHVlcy4KKyAgICAgIE1PLnNldFJlZygwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBTbG90SW5kZXggSWR4ID0gbGlzXy5nZXRJbnN0cnVjdGlvbkluZGV4KE1JKTsKKyAgICBJZHggPSBNTy5pc1VzZSgpID8gSWR4LmdldFVzZUluZGV4KCkgOiBJZHguZ2V0RGVmSW5kZXgoKTsKKyAgICBMaXZlSW50ZXJ2YWwgKkxJID0gZHVwbGlfOworICAgIGZvciAodW5zaWduZWQgaSA9IGZpcnN0SW50ZXJ2YWwsIGUgPSBpbnRlcnZhbHNfLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIExpdmVJbnRlcnZhbCAqdGVzdGxpID0gaW50ZXJ2YWxzX1tpXTsKKyAgICAgIGlmICh0ZXN0bGktPmxpdmVBdChJZHgpKSB7CisgICAgICAgIExJID0gdGVzdGxpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKExJKQorICAgICAgTU8uc2V0UmVnKExJLT5yZWcpOworICAgIERFQlVHKGRiZ3MoKSA8PCAicmV3cml0ZSAiIDw8IElkeCA8PCAnXHQnIDw8ICpNSSk7CisgIH0KKworICAvLyBkdXBsaV8gZ29lcyBpbiBsYXN0LCBhZnRlciByZXdyaXRpbmcuCisgIGlmIChkdXBsaV8pIHsKKyAgICBkdXBsaV8tPlJlbnVtYmVyVmFsdWVzKCk7CisgICAgaW50ZXJ2YWxzXy5wdXNoX2JhY2soZHVwbGlfKTsKKyAgfQorCisgIC8vIENhbGN1bGF0ZSBzcGlsbCB3ZWlnaHQgYW5kIGFsbG9jYXRpb24gaGludHMgZm9yIG5ldyBpbnRlcnZhbHMuCisgIFZpcnRSZWdBdXhJbmZvIHZyYWkodnJtXy5nZXRNYWNoaW5lRnVuY3Rpb24oKSwgbGlzXywgc2FfLmxvb3BzXyk7CisgIGZvciAodW5zaWduZWQgaSA9IGZpcnN0SW50ZXJ2YWwsIGUgPSBpbnRlcnZhbHNfLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBMaXZlSW50ZXJ2YWwgJmxpID0gKmludGVydmFsc19baV07CisgICAgdnJhaS5DYWxjdWxhdGVSZWdDbGFzcyhsaS5yZWcpOworICAgIHZyYWkuQ2FsY3VsYXRlV2VpZ2h0QW5kSGludChsaSk7CisgICAgREVCVUcoZGJncygpIDw8ICJuZXcgaW50diAiIDw8IG1yaV8uZ2V0UmVnQ2xhc3MobGkucmVnKS0+Z2V0TmFtZSgpIDw8ICI6IgorICAgICAgICAgICAgICAgICA8PCBsaSA8PCAnXG4nKTsKKyAgfQorfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wIFNwbGl0dGluZworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworYm9vbCBTcGxpdEVkaXRvcjo6c3BsaXRBcm91bmRMb29wKGNvbnN0IE1hY2hpbmVMb29wICpMb29wKSB7CisgIFNwbGl0QW5hbHlzaXM6Okxvb3BCbG9ja3MgQmxvY2tzOworICBzYV8uZ2V0TG9vcEJsb2NrcyhMb29wLCBCbG9ja3MpOworCisgIC8vIEJyZWFrIGNyaXRpY2FsIGVkZ2VzIGFzIG5lZWRlZC4KKyAgU3BsaXRBbmFseXNpczo6QmxvY2tQdHJTZXQgQ3JpdGljYWxFeGl0czsKKyAgc2FfLmdldENyaXRpY2FsRXhpdHMoQmxvY2tzLCBDcml0aWNhbEV4aXRzKTsKKyAgYXNzZXJ0KENyaXRpY2FsRXhpdHMuZW1wdHkoKSAmJiAiQ2Fubm90IGJyZWFrIGNyaXRpY2FsIGV4aXRzIHlldCIpOworCisgIC8vIENyZWF0ZSBuZXcgbGl2ZSBpbnRlcnZhbCBmb3IgdGhlIGxvb3AuCisgIG9wZW5JbnR2KCk7CisKKyAgLy8gSW5zZXJ0IGNvcGllcyBpbiB0aGUgcHJlZGVjZXNzb3JzLgorICBmb3IgKFNwbGl0QW5hbHlzaXM6OkJsb2NrUHRyU2V0OjppdGVyYXRvciBJID0gQmxvY2tzLlByZWRzLmJlZ2luKCksCisgICAgICAgRSA9IEJsb2Nrcy5QcmVkcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gY29uc3RfY2FzdDxNYWNoaW5lQmFzaWNCbG9jayY+KCoqSSk7CisgICAgZW50ZXJJbnR2QXRFbmQoTUJCLCAqTG9vcC0+Z2V0SGVhZGVyKCkpOworICB9CisKKyAgLy8gU3dpdGNoIGFsbCBsb29wIGJsb2Nrcy4KKyAgZm9yIChTcGxpdEFuYWx5c2lzOjpCbG9ja1B0clNldDo6aXRlcmF0b3IgSSA9IEJsb2Nrcy5Mb29wLmJlZ2luKCksCisgICAgICAgRSA9IEJsb2Nrcy5Mb29wLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgdXNlSW50digqKkkpOworCisgIC8vIEluc2VydCBiYWNrIGNvcGllcyBpbiB0aGUgZXhpdCBibG9ja3MuCisgIGZvciAoU3BsaXRBbmFseXNpczo6QmxvY2tQdHJTZXQ6Oml0ZXJhdG9yIEkgPSBCbG9ja3MuRXhpdHMuYmVnaW4oKSwKKyAgICAgICBFID0gQmxvY2tzLkV4aXRzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIgPSBjb25zdF9jYXN0PE1hY2hpbmVCYXNpY0Jsb2NrJj4oKipJKTsKKyAgICBsZWF2ZUludHZBdFRvcChNQkIpOworICB9CisKKyAgLy8gRG9uZS4KKyAgY2xvc2VJbnR2KCk7CisgIHJld3JpdGUoKTsKKyAgcmV0dXJuIGR1cGxpXzsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vU3BsaXRLaXQuaCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NwbGl0S2l0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNWE0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NwbGl0S2l0LmgKQEAgLTAsMCArMSwyMjggQEAKKy8vPT09LS0tLS0tLS0tLSBTcGxpdEtpdC5jcHAgLSBUb29sa2l0IGZvciBzcGxpdHRpbmcgbGl2ZSByYW5nZXMgLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBTcGxpdEFuYWx5c2lzIGNsYXNzIGFzIHdlbGwgYXMgbXV0YXRvciBmdW5jdGlvbnMgZm9yCisvLyBsaXZlIHJhbmdlIHNwbGl0dGluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExpdmVJbnRlcnZhbDsKK2NsYXNzIExpdmVJbnRlcnZhbHM7CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lTG9vcDsKK2NsYXNzIE1hY2hpbmVMb29wSW5mbzsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBWaXJ0UmVnTWFwOworY2xhc3MgVk5JbmZvOworCisvLy8gU3BsaXRBbmFseXNpcyAtIEFuYWx5emUgYSBMaXZlSW50ZXJ2YWwsIGxvb2tpbmcgZm9yIGxpdmUgcmFuZ2Ugc3BsaXR0aW5nCisvLy8gb3Bwb3J0dW5pdGllcy4KK2NsYXNzIFNwbGl0QW5hbHlzaXMgeworcHVibGljOgorICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJm1mXzsKKyAgY29uc3QgTGl2ZUludGVydmFscyAmbGlzXzsKKyAgY29uc3QgTWFjaGluZUxvb3BJbmZvICZsb29wc187CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpXzsKKworcHJpdmF0ZToKKyAgLy8gQ3VycmVudCBsaXZlIGludGVydmFsLgorICBjb25zdCBMaXZlSW50ZXJ2YWwgKmN1cmxpXzsKKworICAvLyBJbnN0cnVjdGlvbnMgdXNpbmcgdGhlIHRoZSBjdXJyZW50IHJlZ2lzdGVyLgorICB0eXBlZGVmIFNtYWxsUHRyU2V0PGNvbnN0IE1hY2hpbmVJbnN0ciosIDE2PiBJbnN0clB0clNldDsKKyAgSW5zdHJQdHJTZXQgdXNpbmdJbnN0cnNfOworCisgIC8vIFRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHVzaW5nIGN1cmxpIGluIGVhY2ggYmFzaWMgYmxvY2suCisgIHR5cGVkZWYgRGVuc2VNYXA8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sqLCB1bnNpZ25lZD4gQmxvY2tDb3VudE1hcDsKKyAgQmxvY2tDb3VudE1hcCB1c2luZ0Jsb2Nrc187CisKKyAgLy8gTG9vcHMgd2hlcmUgdGhlIGN1cmVudCBpbnRlcnZhbCBpcyB1c2VkLgorICB0eXBlZGVmIFNtYWxsUHRyU2V0PGNvbnN0IE1hY2hpbmVMb29wKiwgMTY+IExvb3BQdHJTZXQ7CisgIExvb3BQdHJTZXQgdXNpbmdMb29wc187CisKKyAgLy8gU3VtYXJpemUgc3RhdGlzdGljcyBieSBjb3VudGluZyBpbnN0cnVjdGlvbnMgdXNpbmcgY3VybGlfLgorICB2b2lkIGFuYWx5emVVc2VzKCk7CisKKyAgLy8vIGNhbkFuYWx5emVCcmFuY2ggLSBSZXR1cm4gdHJ1ZSBpZiBNQkIgZW5kcyBpbiBhIGJyYW5jaCB0aGF0IGNhbiBiZQorICAvLy8gYW5hbHl6ZWQuCisgIGJvb2wgY2FuQW5hbHl6ZUJyYW5jaChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKworcHVibGljOgorICBTcGxpdEFuYWx5c2lzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmbWYsIGNvbnN0IExpdmVJbnRlcnZhbHMgJmxpcywKKyAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8gJm1saSk7CisKKyAgLy8vIGFuYWx5emUgLSBzZXQgY3VybGkgdG8gdGhlIHNwZWNpZmllZCBpbnRlcnZhbCwgYW5kIGFuYWx5emUgaG93IGl0IG1heSBiZQorICAvLy8gc3BsaXQuCisgIHZvaWQgYW5hbHl6ZShjb25zdCBMaXZlSW50ZXJ2YWwgKmxpKTsKKworICBjb25zdCBMaXZlSW50ZXJ2YWwgKmdldEN1ckxJKCkgeyByZXR1cm4gY3VybGlfOyB9CisKKyAgLy8vIGNsZWFyIC0gY2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlcyBzbyBTcGxpdEFuYWx5c2lzIGlzIHJlYWR5IHRvIGFuYWx5emUgYQorICAvLy8gbmV3IGludGVydmFsLgorICB2b2lkIGNsZWFyKCk7CisKKyAgdHlwZWRlZiBTbWFsbFB0clNldDxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayosIDE2PiBCbG9ja1B0clNldDsKKworICAvLyBTZXRzIG9mIGJhc2ljIGJsb2NrcyBzdXJyb3VuZGluZyBhIG1hY2hpbmUgbG9vcC4KKyAgc3RydWN0IExvb3BCbG9ja3MgeworICAgIEJsb2NrUHRyU2V0IExvb3A7ICAvLyBCbG9ja3MgaW4gdGhlIGxvb3AuCisgICAgQmxvY2tQdHJTZXQgUHJlZHM7IC8vIExvb3AgcHJlZGVjZXNzb3IgYmxvY2tzLgorICAgIEJsb2NrUHRyU2V0IEV4aXRzOyAvLyBMb29wIGV4aXQgYmxvY2tzLgorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIExvb3AuY2xlYXIoKTsKKyAgICAgIFByZWRzLmNsZWFyKCk7CisgICAgICBFeGl0cy5jbGVhcigpOworICAgIH0KKyAgfTsKKworICAvLyBDYWxjdWxhdGUgdGhlIGJsb2NrIHNldHMgc3Vycm91bmRpbmcgdGhlIGxvb3AuCisgIHZvaWQgZ2V0TG9vcEJsb2Nrcyhjb25zdCBNYWNoaW5lTG9vcCAqTG9vcCwgTG9vcEJsb2NrcyAmQmxvY2tzKTsKKworICAvLy8gTG9vcFBlcmlwaGVyYWxVc2UgLSBob3cgaXMgYSB2YXJpYWJsZSB1c2VkIGluIGFuZCBhcm91bmQgYSBsb29wPworICAvLy8gUGVyaXBoZXJhbCBibG9ja3MgYXJlIHRoZSBsb29wIHByZWRlY2Vzc29ycyBhbmQgZXhpdCBibG9ja3MuCisgIGVudW0gTG9vcFBlcmlwaGVyYWxVc2UgeworICAgIENvbnRhaW5lZEluTG9vcCwgIC8vIEFsbCB1c2VzIGFyZSBpbnNpZGUgdGhlIGxvb3AuCisgICAgU2luZ2xlUGVyaXBoZXJhbCwgLy8gQXQgbW9zdCBvbmUgaW5zdHJ1Y3Rpb24gcGVyIHBlcmlwaGVyYWwgYmxvY2suCisgICAgTXVsdGlQZXJpcGhlcmFsLCAgLy8gTXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIGluIHNvbWUgcGVyaXBoZXJhbCBibG9ja3MuCisgICAgT3V0c2lkZUxvb3AgICAgICAgLy8gVXNlcyBvdXRzaWRlIGxvb3AgcGVyaXBoZXJ5LgorICB9OworCisgIC8vLyBhbmFseXplTG9vcFBlcmlwaGVyYWxVc2UgLSBSZXR1cm4gYW4gZW51bSBkZXNjcmliaW5nIGhvdyBjdXJsaV8gaXMgdXNlZCBpbgorICAvLy8gYW5kIGFyb3VuZCB0aGUgTG9vcC4KKyAgTG9vcFBlcmlwaGVyYWxVc2UgYW5hbHl6ZUxvb3BQZXJpcGhlcmFsVXNlKGNvbnN0IExvb3BCbG9ja3MmKTsKKworICAvLy8gZ2V0Q3JpdGljYWxFeGl0cyAtIEl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcGFydGlhbGx5IGJyZWFrIGNyaXRpY2FsIGVkZ2VzCisgIC8vLyBsZWF2aW5nIHRoZSBsb29wIGlmIGFuIGV4aXQgYmxvY2sgaGFzIHBoaSB1c2VzIG9mIGN1cmxpLiBDb2xsZWN0IHRoZSBleGl0CisgIC8vLyBibG9ja3MgdGhhdCBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGludG8gQ3JpdGljYWxFeGl0cy4KKyAgdm9pZCBnZXRDcml0aWNhbEV4aXRzKGNvbnN0IExvb3BCbG9ja3MgJkJsb2NrcywgQmxvY2tQdHJTZXQgJkNyaXRpY2FsRXhpdHMpOworCisgIC8vLyBjYW5TcGxpdENyaXRpY2FsRXhpdHMgLSBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBpbnNlcnQgbmV3IGV4aXQKKyAgLy8vIGJsb2NrcyBiZWZvcmUgdGhlIGJsb2NrcyBpbiBDcml0aWNhbEV4aXRzLgorICBib29sIGNhblNwbGl0Q3JpdGljYWxFeGl0cyhjb25zdCBMb29wQmxvY2tzICZCbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrUHRyU2V0ICZDcml0aWNhbEV4aXRzKTsKKworICAvLy8gZ2V0QmVzdFNwbGl0TG9vcCAtIFJldHVybiB0aGUgbG9vcCB3aGVyZSBjdXJsaSBtYXkgYmVzdCBiZSBzcGxpdCB0byBhCisgIC8vLyBzZXBhcmF0ZSByZWdpc3Rlciwgb3IgTlVMTC4KKyAgY29uc3QgTWFjaGluZUxvb3AgKmdldEJlc3RTcGxpdExvb3AoKTsKK307CisKKy8vLyBTcGxpdEVkaXRvciAtIEVkaXQgbWFjaGluZSBjb2RlIGFuZCBMaXZlSW50ZXJ2YWxzIGZvciBsaXZlIHJhbmdlCisvLy8gc3BsaXR0aW5nLgorLy8vCisvLy8gLSBDcmVhdGUgYSBTcGxpdEVkaXRvciBmcm9tIGEgU3BsaXRBbmFseXNpcy4KKy8vLyAtIFN0YXJ0IGEgbmV3IGxpdmUgaW50ZXJ2YWwgd2l0aCBvcGVuSW50di4KKy8vLyAtIE1hcmsgdGhlIHBsYWNlcyB3aGVyZSB0aGUgbmV3IGludGVydmFsIGlzIGVudGVyZWQgdXNpbmcgZW50ZXJJbnR2KgorLy8vIC0gTWFyayB0aGUgcmFuZ2VzIHdoZXJlIHRoZSBuZXcgaW50ZXJ2YWwgaXMgdXNlZCB3aXRoIHVzZUludHYqIAorLy8vIC0gTWFyayB0aGUgcGxhY2VzIHdoZXJlIHRoZSBpbnRlcnZhbCBpcyBleGl0ZWQgd2l0aCBleGl0SW50diouCisvLy8gLSBGaW5pc2ggdGhlIGN1cnJlbnQgaW50ZXJ2YWwgd2l0aCBjbG9zZUludHYgYW5kIHJlcGVhdCBmcm9tIDIuCisvLy8gLSBSZXdyaXRlIGluc3RydWN0aW9ucyB3aXRoIHJld3JpdGUoKS4KKy8vLworY2xhc3MgU3BsaXRFZGl0b3IgeworICBTcGxpdEFuYWx5c2lzICZzYV87CisgIExpdmVJbnRlcnZhbHMgJmxpc187CisgIFZpcnRSZWdNYXAgJnZybV87CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJm1yaV87CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpXzsKKworICAvLy8gY3VybGlfIC0gVGhlIGltbXV0YWJsZSBpbnRlcnZhbCB3ZSBhcmUgY3VycmVudGx5IHNwbGl0dGluZy4KKyAgY29uc3QgTGl2ZUludGVydmFsICpjb25zdCBjdXJsaV87CisKKyAgLy8vIGR1cGxpXyAtIENyZWF0ZWQgYXMgYSBjb3B5IG9mIGN1cmxpXywgcmFuZ2VzIGFyZSBjYXJ2ZWQgb3V0IGFzIG5ldworICAvLy8gaW50ZXJ2YWxzIGdldCBhZGRlZCB0aHJvdWdoIG9wZW5JbnR2IC8gY2xvc2VJbnR2LiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQKKyAgLy8vIGVkaXRpbmcgY3VybGlfLgorICBMaXZlSW50ZXJ2YWwgKmR1cGxpXzsKKworICAvLy8gQ3VycmVudGx5IG9wZW4gTGl2ZUludGVydmFsLgorICBMaXZlSW50ZXJ2YWwgKm9wZW5saV87CisKKyAgLy8vIGNyZWF0ZUludGVydmFsIC0gQ3JlYXRlIGEgbmV3IHZpcnR1YWwgcmVnaXN0ZXIgYW5kIExpdmVJbnRlcnZhbCB3aXRoIHNhbWUKKyAgLy8vIHJlZ2lzdGVyIGNsYXNzIGFuZCBzcGlsbCBzbG90IGFzIGN1cmxpLgorICBMaXZlSW50ZXJ2YWwgKmNyZWF0ZUludGVydmFsKCk7CisKKyAgLy8vIGdldER1cExJIC0gRW5zdXJlIGR1cGxpIGlzIGNyZWF0ZWQgYW5kIHJldHVybiBpdC4KKyAgTGl2ZUludGVydmFsICpnZXREdXBMSSgpOworCisgIC8vLyB2YWx1ZU1hcF8gLSBNYXAgdmFsdWVzIGluIGR1cGxpIHRvIHZhbHVlcyBpbiBvcGVuSW50di4gVGhlc2UgYXJlIGRpcmVjdCAxLTEKKyAgLy8vIG1hcHBpbmdzLCBhbmQgZG8gbm90IGluY2x1ZGUgdmFsdWVzIGNyZWF0ZWQgYnkgaW5zZXJ0ZWQgY29waWVzLgorICBEZW5zZU1hcDxjb25zdCBWTkluZm8qLCBWTkluZm8qPiB2YWx1ZU1hcF87CisKKyAgLy8vIG1hcFZhbHVlIC0gUmV0dXJuIHRoZSBvcGVuSW50diB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBjdXJsaQorICAvLy8gdmFsdWUuCisgIFZOSW5mbyAqbWFwVmFsdWUoY29uc3QgVk5JbmZvICpjdXJsaVZOSSk7CisKKyAgLy8vIEEgZHVwbGkgdmFsdWUgaXMgbGl2ZSB0aHJvdWdoIG9wZW5JbnR2LgorICBib29sIGxpdmVUaHJvdWdoXzsKKworICAvLy8gQWxsIHRoZSBuZXcgaW50ZXJ2YWxzIGNyZWF0ZWQgZm9yIHRoaXMgc3BsaXQgYXJlIGFkZGVkIHRvIGludGVydmFsc18uCisgIHN0ZDo6dmVjdG9yPExpdmVJbnRlcnZhbCo+ICZpbnRlcnZhbHNfOworCisgIC8vLyBUaGUgaW5kZXggaW50byBpbnRlcnZhbHNfIG9mIHRoZSBmaXJzdCBpbnRlcnZhbCB3ZSBhZGRlZC4gVGhlcmUgbWF5IGJlCisgIC8vLyBvdGhlcnMgZnJvbSBiZWZvcmUgd2UgZ290IGl0LgorICB1bnNpZ25lZCBmaXJzdEludGVydmFsOworCisgIC8vLyBJbnNlcnQgYSBDT1BZIGluc3RydWN0aW9uIGN1cmxpIC0+IGxpLiBBbGxvY2F0ZSBhIG5ldyB2YWx1ZSBmcm9tIGxpCisgIC8vLyBkZWZpbmVkIGJ5IHRoZSBDT1BZCisgIFZOSW5mbyAqaW5zZXJ0Q29weShMaXZlSW50ZXJ2YWwgJkxJLAorICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKTsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGEgbmV3IFNwbGl0RWRpdG9yIGZvciBlZGl0aW5nIHRoZSBMaXZlSW50ZXJ2YWwgYW5hbHl6ZWQgYnkgU0EuCisgIC8vLyBOZXdseSBjcmVhdGVkIGludGVydmFscyB3aWxsIGJlIGFwcGVuZGVkIHRvIG5ld0ludGVydmFscy4KKyAgU3BsaXRFZGl0b3IoU3BsaXRBbmFseXNpcyAmU0EsIExpdmVJbnRlcnZhbHMmLCBWaXJ0UmVnTWFwJiwKKyAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TGl2ZUludGVydmFsKj4gJm5ld0ludGVydmFscyk7CisKKyAgLy8vIGdldEFuYWx5c2lzIC0gR2V0IHRoZSBjb3JyZXNwb25kaW5nIGFuYWx5c2lzLgorICBTcGxpdEFuYWx5c2lzICZnZXRBbmFseXNpcygpIHsgcmV0dXJuIHNhXzsgfQorCisgIC8vLyBDcmVhdGUgYSBuZXcgdmlydHVhbCByZWdpc3RlciBhbmQgbGl2ZSBpbnRlcnZhbC4KKyAgdm9pZCBvcGVuSW50digpOworCisgIC8vLyBlbnRlckludHZBdEVuZCAtIEVudGVyIG9wZW5saSBhdCB0aGUgZW5kIG9mIE1CQi4KKyAgLy8vIFBoaU1CQiBpcyBhIHN1Y2Nlc3NvciBpbnNpZGUgb3BlbmxpIHdoZXJlIGEgUEhJIHZhbHVlIGlzIGNyZWF0ZWQuCisgIC8vLyBDdXJyZW50bHksIGFsbCBlbnRyaWVzIG11c3Qgc2hhcmUgdGhlIHNhbWUgUGhpTUJCLgorICB2b2lkIGVudGVySW50dkF0RW5kKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICZQaGlNQkIpOworCisgIC8vLyB1c2VJbnR2IC0gaW5kaWNhdGUgdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIGluIE1CQiBzaG91bGQgdXNlIG9wZW5saS4KKyAgdm9pZCB1c2VJbnR2KGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyB1c2VJbnR2IC0gaW5kaWNhdGUgdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIGluIHJhbmdlIHNob3VsZCB1c2Ugb3BlbmxpLgorICB2b2lkIHVzZUludHYoU2xvdEluZGV4IFN0YXJ0LCBTbG90SW5kZXggRW5kKTsKKworICAvLy8gbGVhdmVJbnR2QXRUb3AgLSBMZWF2ZSB0aGUgaW50ZXJ2YWwgYXQgdGhlIHRvcCBvZiBNQkIuCisgIC8vLyBDdXJyZW50bHksIG9ubHkgb25lIHZhbHVlIGNhbiBsZWF2ZSB0aGUgaW50ZXJ2YWwuCisgIHZvaWQgbGVhdmVJbnR2QXRUb3AoTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIGNsb3NlSW50diAtIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgZWRpdGluZyB0aGUgY3VycmVudGx5IG9wZW4KKyAgLy8vIExpdmVJbnRlcnZhbCwgYW5kIHJhbmdlcyBjYW4gYmUgdHJpbW1lZC4KKyAgdm9pZCBjbG9zZUludHYoKTsKKworICAvLy8gcmV3cml0ZSAtIGFmdGVyIGFsbCB0aGUgbmV3IGxpdmUgcmFuZ2VzIGhhdmUgYmVlbiBjcmVhdGVkLCByZXdyaXRlCisgIC8vLyBpbnN0cnVjdGlvbnMgdXNpbmcgY3VybGkgdG8gdXNlIHRoZSBuZXcgaW50ZXJ2YWxzLgorICB2b2lkIHJld3JpdGUoKTsKKworICAvLyA9PT0tLS0gSGlnaCBsZXZlbCBtZXRob2RzIC0tLT09PQorCisgIC8vLyBzcGxpdEFyb3VuZExvb3AgLSBTcGxpdCBjdXJsaSBpbnRvIGEgc2VwYXJhdGUgbGl2ZSBpbnRlcnZhbCBpbnNpZGUKKyAgLy8vIHRoZSBsb29wLiBSZXR1cm4gdHJ1ZSBpZiBjdXJsaSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlcGxhY2VkLCBmYWxzZSBpZgorICAvLy8gY3VybGkgaXMgc3RpbGwgaW50YWN0LCBhbmQgbmVlZHMgdG8gYmUgc3BpbGxlZCBvciBzcGxpdCBmdXJ0aGVyLgorICBib29sIHNwbGl0QXJvdW5kTG9vcChjb25zdCBNYWNoaW5lTG9vcCopOworCit9OworCisKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1NwbGl0dGVyLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TcGxpdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MjZhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9TcGxpdHRlci5oCkBAIC0wLDAgKzEsOTkgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1NwbGl0dGVyLmggLSBTcGxpdHRlciAtKi0gQysrIC0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NQTElUVEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NQTElUVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBMaXZlSW50ZXJ2YWw7CisgIGNsYXNzIExpdmVJbnRlcnZhbHM7CisgIHN0cnVjdCBMaXZlUmFuZ2U7CisgIGNsYXNzIExvb3BTcGxpdDsKKyAgY2xhc3MgTWFjaGluZURvbWluYXRvclRyZWU7CisgIGNsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisgIGNsYXNzIFNsb3RJbmRleGVzOworICBjbGFzcyBUYXJnZXRJbnN0ckluZm87CisgIGNsYXNzIFZOSW5mbzsKKworICBjbGFzcyBMb29wU3BsaXR0ZXIgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgZnJpZW5kIGNsYXNzIExvb3BTcGxpdDsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworCisgICAgTG9vcFNwbGl0dGVyKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmYXUpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmZm4pOworCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKworCisgIHByaXZhdGU6CisKKyAgICBNYWNoaW5lRnVuY3Rpb24gKm1mOworICAgIExpdmVJbnRlcnZhbHMgKmxpczsKKyAgICBNYWNoaW5lTG9vcEluZm8gKm1saTsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICptcmk7CisgICAgTWFjaGluZURvbWluYXRvclRyZWUgKm1kdDsKKyAgICBTbG90SW5kZXhlcyAqc2lzOworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqdGlpOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqdHJpOworCisgICAgc3RkOjpzdHJpbmcgZnFuOworICAgIHN0ZDo6ZGVxdWU8TGl2ZUludGVydmFsKj4gaW50ZXJ2YWxzOworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8U2xvdEluZGV4LCBTbG90SW5kZXg+IFNsb3RQYWlyOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8U2xvdFBhaXI+IExvb3BSYW5nZXM7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxNYWNoaW5lTG9vcCosIExvb3BSYW5nZXM+IExvb3BSYW5nZU1hcDsKKyAgICBMb29wUmFuZ2VNYXAgbG9vcFJhbmdlTWFwOworCisgICAgdm9pZCBkdW1wTG9vcEluZm8oTWFjaGluZUxvb3AgJmxvb3ApOworCisgICAgdm9pZCBkdW1wT2RkVGVybWluYXRvcnMoKTsKKworICAgIHZvaWQgdXBkYXRlVGVybWluYXRvcnMoTWFjaGluZUJhc2ljQmxvY2sgJm1iYik7CisKKyAgICBib29sIGNhbkluc2VydFByZUhlYWRlcihNYWNoaW5lTG9vcCAmbG9vcCk7CisgICAgTWFjaGluZUJhc2ljQmxvY2smIGluc2VydFByZUhlYWRlcihNYWNoaW5lTG9vcCAmbG9vcCk7CisKKyAgICBib29sIGlzQ3JpdGljYWxFZGdlKE1hY2hpbmVMb29wOjpFZGdlICZlZGdlKTsKKyAgICBib29sIGNhblNwbGl0RWRnZShNYWNoaW5lTG9vcDo6RWRnZSAmZWRnZSk7CisgICAgTWFjaGluZUJhc2ljQmxvY2smIHNwbGl0RWRnZShNYWNoaW5lTG9vcDo6RWRnZSAmZWRnZSwgTWFjaGluZUxvb3AgJmxvb3ApOworCisgICAgTG9vcFJhbmdlcyYgZ2V0TG9vcFJhbmdlcyhNYWNoaW5lTG9vcCAmbG9vcCk7CisgICAgc3RkOjpwYWlyPGJvb2wsIFNsb3RQYWlyPiBnZXRMb29wU3ViUmFuZ2UoY29uc3QgTGl2ZVJhbmdlICZsciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTG9vcCAmbG9vcCk7CisKKyAgICB2b2lkIGR1bXBMb29wUmFuZ2VzKE1hY2hpbmVMb29wICZsb29wKTsKKworICAgIHZvaWQgcHJvY2Vzc0hlYWRlcihMb29wU3BsaXQgJnNwbGl0KTsKKyAgICB2b2lkIHByb2Nlc3NMb29wRXhpdHMoTG9vcFNwbGl0ICZzcGxpdCk7CisgICAgdm9pZCBwcm9jZXNzTG9vcFVzZXMoTG9vcFNwbGl0ICZzcGxpdCk7CisKKyAgICBib29sIHNwbGl0T3Zlckxvb3AoTGl2ZUludGVydmFsICZsaSwgTWFjaGluZUxvb3AgJmxvb3ApOworCisgICAgdm9pZCBwcm9jZXNzSW50ZXJ2YWwoTGl2ZUludGVydmFsICZsaSk7CisKKyAgICB2b2lkIHByb2Nlc3NJbnRlcnZhbHMoKTsKKyAgfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1N0YWNrUHJvdGVjdG9yLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1N0YWNrUHJvdGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTZmZWIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU3RhY2tQcm90ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMjQwIEBACisvLz09PS0tIFN0YWNrUHJvdGVjdG9yLmNwcCAtIFN0YWNrIFByb3RlY3RvciBJbnNlcnRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpbnNlcnRzIHN0YWNrIHByb3RlY3RvcnMgaW50byBmdW5jdGlvbnMgd2hpY2ggbmVlZCB0aGVtLiBBIHZhcmlhYmxlCisvLyB3aXRoIGEgcmFuZG9tIHZhbHVlIGluIGl0IGlzIHN0b3JlZCBvbnRvIHRoZSBzdGFjayBiZWZvcmUgdGhlIGxvY2FsIHZhcmlhYmxlcworLy8gYXJlIGFsbG9jYXRlZC4gVXBvbiBleGl0aW5nIHRoZSBibG9jaywgdGhlIHN0b3JlZCB2YWx1ZSBpcyBjaGVja2VkLiBJZiBpdCdzCisvLyBjaGFuZ2VkLCB0aGVuIHRoZXJlIHdhcyBzb21lIHNvcnQgb2YgdmlvbGF0aW9uIGFuZCB0aGUgcHJvZ3JhbSBhYm9ydHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzdGFjay1wcm90ZWN0b3IiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIFNTUEJ1ZmZlclNpemUgLSBUaGUgbG93ZXIgYm91bmQgZm9yIGEgYnVmZmVyIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHN0YWNrCisvLyBzbWFzaGluZyBwcm90ZWN0aW9uLgorc3RhdGljIGNsOjpvcHQ8dW5zaWduZWQ+CitTU1BCdWZmZXJTaXplKCJzdGFjay1wcm90ZWN0b3ItYnVmZmVyLXNpemUiLCBjbDo6aW5pdCg4KSwKKyAgICAgICAgICAgICAgY2w6OmRlc2MoIkxvd2VyIGJvdW5kIGZvciBhIGJ1ZmZlciB0byBiZSBjb25zaWRlcmVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICJzdGFjayBwcm90ZWN0aW9uIikpOworCituYW1lc3BhY2UgeworICBjbGFzcyBTdGFja1Byb3RlY3RvciA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICAgIC8vLyBUTEkgLSBLZWVwIGEgcG9pbnRlciBvZiBhIFRhcmdldExvd2VyaW5nIHRvIGNvbnN1bHQgZm9yIGRldGVybWluaW5nCisgICAgLy8vIHRhcmdldCB0eXBlIHNpemVzLgorICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICpUTEk7CisKKyAgICBGdW5jdGlvbiAqRjsKKyAgICBNb2R1bGUgKk07CisKKyAgICAvLy8gSW5zZXJ0U3RhY2tQcm90ZWN0b3JzIC0gSW5zZXJ0IGNvZGUgaW50byB0aGUgcHJvbG9ndWUgYW5kIGVwaWxvZ3VlIG9mCisgICAgLy8vIHRoZSBmdW5jdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gIC0gVGhlIHByb2xvZ3VlIGNvZGUgbG9hZHMgYW5kIHN0b3JlcyB0aGUgc3RhY2sgZ3VhcmQgb250byB0aGUgc3RhY2suCisgICAgLy8vICAtIFRoZSBlcGlsb2d1ZSBjaGVja3MgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgcHJvbG9ndWUgYWdhaW5zdCB0aGUKKyAgICAvLy8gICAgb3JpZ2luYWwgdmFsdWUuIEl0IGNhbGxzIF9fc3RhY2tfY2hrX2ZhaWwgaWYgdGhleSBkaWZmZXIuCisgICAgYm9vbCBJbnNlcnRTdGFja1Byb3RlY3RvcnMoKTsKKworICAgIC8vLyBDcmVhdGVGYWlsQkIgLSBDcmVhdGUgYSBiYXNpYyBibG9jayB0byBqdW1wIHRvIHdoZW4gdGhlIHN0YWNrIHByb3RlY3RvcgorICAgIC8vLyBjaGVjayBmYWlscy4KKyAgICBCYXNpY0Jsb2NrICpDcmVhdGVGYWlsQkIoKTsKKworICAgIC8vLyBSZXF1aXJlc1N0YWNrUHJvdGVjdG9yIC0gQ2hlY2sgd2hldGhlciBvciBub3QgdGhpcyBmdW5jdGlvbiBuZWVkcyBhCisgICAgLy8vIHN0YWNrIHByb3RlY3RvciBiYXNlZCB1cG9uIHRoZSBzdGFjayBwcm90ZWN0b3IgbGV2ZWwuCisgICAgYm9vbCBSZXF1aXJlc1N0YWNrUHJvdGVjdG9yKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgICAgICAgICAgICAgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZC4KKyAgICBTdGFja1Byb3RlY3RvcigpIDogRnVuY3Rpb25QYXNzKElEKSwgVExJKDApIHt9CisgICAgU3RhY2tQcm90ZWN0b3IoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKnRsaSkKKyAgICAgIDogRnVuY3Rpb25QYXNzKElEKSwgVExJKHRsaSkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGbik7CisgIH07Cit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2NoYXIgU3RhY2tQcm90ZWN0b3I6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhTdGFja1Byb3RlY3RvciwgInN0YWNrLXByb3RlY3RvciIsCisgICAgICAgICAgICAgICAgIkluc2VydCBzdGFjayBwcm90ZWN0b3JzIiwgZmFsc2UsIGZhbHNlKTsKKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVTdGFja1Byb3RlY3RvclBhc3MoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKnRsaSkgeworICByZXR1cm4gbmV3IFN0YWNrUHJvdGVjdG9yKHRsaSk7Cit9CisKK2Jvb2wgU3RhY2tQcm90ZWN0b3I6OnJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkZuKSB7CisgIEYgPSAmRm47CisgIE0gPSBGLT5nZXRQYXJlbnQoKTsKKworICBpZiAoIVJlcXVpcmVzU3RhY2tQcm90ZWN0b3IoKSkgcmV0dXJuIGZhbHNlOworICAKKyAgcmV0dXJuIEluc2VydFN0YWNrUHJvdGVjdG9ycygpOworfQorCisvLy8gUmVxdWlyZXNTdGFja1Byb3RlY3RvciAtIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoaXMgZnVuY3Rpb24gbmVlZHMgYSBzdGFjaworLy8vIHByb3RlY3RvciBiYXNlZCB1cG9uIHRoZSBzdGFjayBwcm90ZWN0b3IgbGV2ZWwuIFRoZSBoZXVyaXN0aWMgd2UgdXNlIGlzIHRvCisvLy8gYWRkIGEgZ3VhcmQgdmFyaWFibGUgdG8gZnVuY3Rpb25zIHRoYXQgY2FsbCBhbGxvY2EsIGFuZCBmdW5jdGlvbnMgd2l0aAorLy8vIGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gU1NQQnVmZmVyU2l6ZSBieXRlcy4KK2Jvb2wgU3RhY2tQcm90ZWN0b3I6OlJlcXVpcmVzU3RhY2tQcm90ZWN0b3IoKSBjb25zdCB7CisgIGlmIChGLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpTdGFja1Byb3RlY3RSZXEpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghRi0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6U3RhY2tQcm90ZWN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSBUTEktPmdldFRhcmdldERhdGEoKTsKKworICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBJID0gRi0+YmVnaW4oKSwgRSA9IEYtPmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEJhc2ljQmxvY2sgKkJCID0gSTsKKworICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IKKyAgICAgICAgICAgSUkgPSBCQi0+YmVnaW4oKSwgSUUgPSBCQi0+ZW5kKCk7IElJICE9IElFOyArK0lJKQorICAgICAgaWYgKEFsbG9jYUluc3QgKkFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oSUkpKSB7CisgICAgICAgIGlmIChBSS0+aXNBcnJheUFsbG9jYXRpb24oKSkKKyAgICAgICAgICAvLyBUaGlzIGlzIGEgY2FsbCB0byBhbGxvY2Egd2l0aCBhIHZhcmlhYmxlIHNpemUuIEVtaXQgc3RhY2sKKyAgICAgICAgICAvLyBwcm90ZWN0b3JzLgorICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChjb25zdCBBcnJheVR5cGUgKkFUID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihBSS0+Z2V0QWxsb2NhdGVkVHlwZSgpKSkgeworICAgICAgICAgIC8vIFdlIGFwcGFyZW50bHkgb25seSBjYXJlIGFib3V0IGNoYXJhY3RlciBhcnJheXMuCisgICAgICAgICAgaWYgKCFBVC0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHkoOCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIC8vIElmIGFuIGFycmF5IGhhcyBtb3JlIHRoYW4gU1NQQnVmZmVyU2l6ZSBieXRlcyBvZiBhbGxvY2F0ZWQgc3BhY2UsCisgICAgICAgICAgLy8gdGhlbiB3ZSBlbWl0IHN0YWNrIHByb3RlY3RvcnMuCisgICAgICAgICAgaWYgKFNTUEJ1ZmZlclNpemUgPD0gVEQtPmdldFR5cGVBbGxvY1NpemUoQVQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEluc2VydFN0YWNrUHJvdGVjdG9ycyAtIEluc2VydCBjb2RlIGludG8gdGhlIHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSBvZiB0aGUKKy8vLyBmdW5jdGlvbi4KKy8vLworLy8vICAtIFRoZSBwcm9sb2d1ZSBjb2RlIGxvYWRzIGFuZCBzdG9yZXMgdGhlIHN0YWNrIGd1YXJkIG9udG8gdGhlIHN0YWNrLgorLy8vICAtIFRoZSBlcGlsb2d1ZSBjaGVja3MgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgcHJvbG9ndWUgYWdhaW5zdCB0aGUgb3JpZ2luYWwKKy8vLyAgICB2YWx1ZS4gSXQgY2FsbHMgX19zdGFja19jaGtfZmFpbCBpZiB0aGV5IGRpZmZlci4KK2Jvb2wgU3RhY2tQcm90ZWN0b3I6Okluc2VydFN0YWNrUHJvdGVjdG9ycygpIHsKKyAgQmFzaWNCbG9jayAqRmFpbEJCID0gMDsgICAgICAgLy8gVGhlIGJhc2ljIGJsb2NrIHRvIGp1bXAgdG8gaWYgY2hlY2sgZmFpbHMuCisgIEFsbG9jYUluc3QgKkFJID0gMDsgICAgICAgICAgIC8vIFBsYWNlIG9uIHN0YWNrIHRoYXQgc3RvcmVzIHRoZSBzdGFjayBndWFyZC4KKyAgVmFsdWUgKlN0YWNrR3VhcmRWYXIgPSAwOyAgLy8gVGhlIHN0YWNrIGd1YXJkIHZhcmlhYmxlLgorCisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgQmFzaWNCbG9jayAqQkIgPSBJKys7CisKKyAgICBSZXR1cm5JbnN0ICpSSSA9IGR5bl9jYXN0PFJldHVybkluc3Q+KEJCLT5nZXRUZXJtaW5hdG9yKCkpOworICAgIGlmICghUkkpIGNvbnRpbnVlOworCisgICAgaWYgKCFGYWlsQkIpIHsKKyAgICAgIC8vIEluc2VydCBjb2RlIGludG8gdGhlIGVudHJ5IGJsb2NrIHRoYXQgc3RvcmVzIHRoZSBfX3N0YWNrX2Noa19ndWFyZAorICAgICAgLy8gdmFyaWFibGUgb250byB0aGUgc3RhY2s6CisgICAgICAvLworICAgICAgLy8gICBlbnRyeToKKyAgICAgIC8vICAgICBTdGFja0d1YXJkU2xvdCA9IGFsbG9jYSBpOCoKKyAgICAgIC8vICAgICBTdGFja0d1YXJkID0gbG9hZCBfX3N0YWNrX2Noa19ndWFyZAorICAgICAgLy8gICAgIGNhbGwgdm9pZCBAbGx2bS5zdGFja3Byb3RlY3QuY3JlYXRlKFN0YWNrR3VhcmQsIFN0YWNrR3VhcmRTbG90KQorICAgICAgLy8gCisgICAgICBjb25zdCBQb2ludGVyVHlwZSAqUHRyVHkgPSBUeXBlOjpnZXRJbnQ4UHRyVHkoUkktPmdldENvbnRleHQoKSk7CisgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsIE9mZnNldDsKKyAgICAgIGlmIChUTEktPmdldFN0YWNrQ29va2llTG9jYXRpb24oQWRkcmVzc1NwYWNlLCBPZmZzZXQpKSB7CisgICAgICAgIENvbnN0YW50ICpPZmZzZXRWYWwgPQorICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShSSS0+Z2V0Q29udGV4dCgpKSwgT2Zmc2V0KTsKKyAgICAgICAgCisgICAgICAgIFN0YWNrR3VhcmRWYXIgPSBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKE9mZnNldFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclR5cGU6OmdldChQdHJUeSwgQWRkcmVzc1NwYWNlKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBTdGFja0d1YXJkVmFyID0gTS0+Z2V0T3JJbnNlcnRHbG9iYWwoIl9fc3RhY2tfY2hrX2d1YXJkIiwgUHRyVHkpOyAKKyAgICAgIH0KKworICAgICAgQmFzaWNCbG9jayAmRW50cnkgPSBGLT5nZXRFbnRyeUJsb2NrKCk7CisgICAgICBJbnN0cnVjdGlvbiAqSW5zUHQgPSAmRW50cnkuZnJvbnQoKTsKKworICAgICAgQUkgPSBuZXcgQWxsb2NhSW5zdChQdHJUeSwgSW5zUHQpOworICAgICAgTG9hZEluc3QgKkxJID0gbmV3IExvYWRJbnN0KFN0YWNrR3VhcmRWYXIsIGZhbHNlLCBJbnNQdCk7CisKKyAgICAgIFZhbHVlICpBcmdzW10gPSB7IExJLCBBSSB9OworICAgICAgQ2FsbEluc3Q6OgorICAgICAgICBDcmVhdGUoSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihNLCBJbnRyaW5zaWM6OnN0YWNrcHJvdGVjdG9yKSwKKyAgICAgICAgICAgICAgICZBcmdzWzBdLCBhcnJheV9lbmRvZihBcmdzKSwgIiIsIEluc1B0KTsKKworICAgICAgLy8gQ3JlYXRlIHRoZSBiYXNpYyBibG9jayB0byBqdW1wIHRvIHdoZW4gdGhlIGd1YXJkIGNoZWNrIGZhaWxzLgorICAgICAgRmFpbEJCID0gQ3JlYXRlRmFpbEJCKCk7CisgICAgfQorCisgICAgLy8gRm9yIGVhY2ggYmxvY2sgd2l0aCBhIHJldHVybiBpbnN0cnVjdGlvbiwgY29udmVydCB0aGlzOgorICAgIC8vCisgICAgLy8gICByZXR1cm46CisgICAgLy8gICAgIC4uLgorICAgIC8vICAgICByZXQgLi4uCisgICAgLy8KKyAgICAvLyBpbnRvIHRoaXM6CisgICAgLy8KKyAgICAvLyAgIHJldHVybjoKKyAgICAvLyAgICAgLi4uCisgICAgLy8gICAgICUxID0gbG9hZCBfX3N0YWNrX2Noa19ndWFyZAorICAgIC8vICAgICAlMiA9IGxvYWQgU3RhY2tHdWFyZFNsb3QKKyAgICAvLyAgICAgJTMgPSBjbXAgaTEgJTEsICUyCisgICAgLy8gICAgIGJyIGkxICUzLCBsYWJlbCAlU1BfcmV0dXJuLCBsYWJlbCAlQ2FsbFN0YWNrQ2hlY2tGYWlsQmxrCisgICAgLy8KKyAgICAvLyAgIFNQX3JldHVybjoKKyAgICAvLyAgICAgcmV0IC4uLgorICAgIC8vCisgICAgLy8gICBDYWxsU3RhY2tDaGVja0ZhaWxCbGs6CisgICAgLy8gICAgIGNhbGwgdm9pZCBAX19zdGFja19jaGtfZmFpbCgpCisgICAgLy8gICAgIHVucmVhY2hhYmxlCisKKyAgICAvLyBTcGxpdCB0aGUgYmFzaWMgYmxvY2sgYmVmb3JlIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24uCisgICAgQmFzaWNCbG9jayAqTmV3QkIgPSBCQi0+c3BsaXRCYXNpY0Jsb2NrKFJJKTsKKworICAgIC8vIFJlbW92ZSBkZWZhdWx0IGJyYW5jaCBpbnN0cnVjdGlvbiB0byB0aGUgbmV3IEJCLgorICAgIEJCLT5nZXRUZXJtaW5hdG9yKCktPmVyYXNlRnJvbVBhcmVudCgpOworCisgICAgLy8gTW92ZSB0aGUgbmV3bHkgY3JlYXRlZCBiYXNpYyBibG9jayB0byB0aGUgcG9pbnQgcmlnaHQgYWZ0ZXIgdGhlIG9sZCBiYXNpYworICAgIC8vIGJsb2NrIHNvIHRoYXQgaXQncyBpbiB0aGUgImZhbGwgdGhyb3VnaCIgcG9zaXRpb24uCisgICAgTmV3QkItPm1vdmVBZnRlcihCQik7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgc3RhY2sgcHJvdGVjdG9yIGluc3RydWN0aW9ucyBpbiB0aGUgb2xkIGJhc2ljIGJsb2NrLgorICAgIExvYWRJbnN0ICpMSTEgPSBuZXcgTG9hZEluc3QoU3RhY2tHdWFyZFZhciwgIiIsIGZhbHNlLCBCQik7CisgICAgTG9hZEluc3QgKkxJMiA9IG5ldyBMb2FkSW5zdChBSSwgIiIsIHRydWUsIEJCKTsKKyAgICBJQ21wSW5zdCAqQ21wID0gbmV3IElDbXBJbnN0KCpCQiwgQ21wSW5zdDo6SUNNUF9FUSwgTEkxLCBMSTIpOworICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShOZXdCQiwgRmFpbEJCLCBDbXAsIEJCKTsKKyAgfQorCisgIC8vIFJldHVybiBpZiB3ZSBkaWRuJ3QgbW9kaWZ5IGFueSBiYXNpYyBibG9ja3MuIEkuZS4sIHRoZXJlIGFyZSBubyByZXR1cm4KKyAgLy8gc3RhdGVtZW50cyBpbiB0aGUgZnVuY3Rpb24uCisgIGlmICghRmFpbEJCKSByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBDcmVhdGVGYWlsQkIgLSBDcmVhdGUgYSBiYXNpYyBibG9jayB0byBqdW1wIHRvIHdoZW4gdGhlIHN0YWNrIHByb3RlY3RvcgorLy8vIGNoZWNrIGZhaWxzLgorQmFzaWNCbG9jayAqU3RhY2tQcm90ZWN0b3I6OkNyZWF0ZUZhaWxCQigpIHsKKyAgQmFzaWNCbG9jayAqRmFpbEJCID0gQmFzaWNCbG9jazo6Q3JlYXRlKEYtPmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYpOworICBDb25zdGFudCAqU3RhY2tDaGtGYWlsID0KKyAgICBNLT5nZXRPckluc2VydEZ1bmN0aW9uKCJfX3N0YWNrX2Noa19mYWlsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldFZvaWRUeShGLT5nZXRDb250ZXh0KCkpLCBOVUxMKTsKKyAgQ2FsbEluc3Q6OkNyZWF0ZShTdGFja0Noa0ZhaWwsICIiLCBGYWlsQkIpOworICBuZXcgVW5yZWFjaGFibGVJbnN0KEYtPmdldENvbnRleHQoKSwgRmFpbEJCKTsKKyAgcmV0dXJuIEZhaWxCQjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1N0YWNrU2xvdENvbG9yaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1N0YWNrU2xvdENvbG9yaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI2YmMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU3RhY2tTbG90Q29sb3JpbmcuY3BwCkBAIC0wLDAgKzEsNzU5IEBACisvLz09PS0tIFN0YWNrU2xvdENvbG9yaW5nLmNwcCAtIFN0YWNrIHNsb3QgY29sb3JpbmcgcGFzcy4gLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzdGFjayBzbG90IGNvbG9yaW5nIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzdGFja2NvbG9yaW5nIgorI2luY2x1ZGUgIlZpcnRSZWdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbEFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVTdGFja0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1lbU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSA8dmVjdG9yPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitEaXNhYmxlU2hhcmluZygibm8tc3RhY2stc2xvdC1zaGFyaW5nIiwKKyAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSksIGNsOjpIaWRkZW4sCisgICAgICAgICAgICAgY2w6OmRlc2MoIlN1cHByZXNzIHNsb3Qgc2hhcmluZyBkdXJpbmcgc3RhY2sgY29sb3JpbmciKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitDb2xvcldpdGhSZWdzT3B0KCJjb2xvci1zcy13aXRoLXJlZ3MiLAorICAgICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSksIGNsOjpIaWRkZW4sCisgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJDb2xvciBzdGFjayBzbG90cyB3aXRoIGZyZWUgcmVnaXN0ZXJzIikpOworCisKK3N0YXRpYyBjbDo6b3B0PGludD4gRENFTGltaXQoInNzYy1kY2UtbGltaXQiLCBjbDo6aW5pdCgtMSksIGNsOjpIaWRkZW4pOworCitTVEFUSVNUSUMoTnVtRWxpbWluYXRlZCwgIk51bWJlciBvZiBzdGFjayBzbG90cyBlbGltaW5hdGVkIGR1ZSB0byBjb2xvcmluZyIpOworU1RBVElTVElDKE51bVJlZ1JlcGwsICAgICJOdW1iZXIgb2Ygc3RhY2sgc2xvdCByZWZzIHJlcGxhY2VkIHdpdGggcmVnIHJlZnMiKTsKK1NUQVRJU1RJQyhOdW1Mb2FkRWxpbSwgICAiTnVtYmVyIG9mIGxvYWRzIGVsaW1pbmF0ZWQiKTsKK1NUQVRJU1RJQyhOdW1TdG9yZUVsaW0sICAiTnVtYmVyIG9mIHN0b3JlcyBlbGltaW5hdGVkIik7CitTVEFUSVNUSUMoTnVtRGVhZCwgICAgICAgIk51bWJlciBvZiB0cml2aWFsbHkgZGVhZCBzdGFjayBhY2Nlc3NlcyBlbGltaW5hdGVkIik7CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIFN0YWNrU2xvdENvbG9yaW5nIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIGJvb2wgQ29sb3JXaXRoUmVnczsKKyAgICBMaXZlU3RhY2tzKiBMUzsKKyAgICBWaXJ0UmVnTWFwKiBWUk07CisgICAgTWFjaGluZUZyYW1lSW5mbyAqTUZJOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gICpUSUk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgICAgY29uc3QgTWFjaGluZUxvb3BJbmZvICpsb29wSW5mbzsKKworICAgIC8vIFNTSW50ZXJ2YWxzIC0gU3BpbGwgc2xvdCBpbnRlcnZhbHMuCisgICAgc3RkOjp2ZWN0b3I8TGl2ZUludGVydmFsKj4gU1NJbnRlcnZhbHM7CisKKyAgICAvLyBTU1JlZnMgLSBLZWVwIGEgbGlzdCBvZiBmcmFtZSBpbmRleCByZWZlcmVuY2VzIGZvciBlYWNoIHNwaWxsIHNsb3QuCisgICAgU21hbGxWZWN0b3I8U21hbGxWZWN0b3I8TWFjaGluZUluc3RyKiwgOD4sIDE2PiBTU1JlZnM7CisKKyAgICAvLyBPcmlnQWxpZ25tZW50cyAtIEFsaWdubWVudHMgb2Ygc3RhY2sgb2JqZWN0cyBiZWZvcmUgY29sb3JpbmcuCisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE2PiBPcmlnQWxpZ25tZW50czsKKworICAgIC8vIE9yaWdTaXplcyAtIFNpemVzcyBvZiBzdGFjayBvYmplY3RzIGJlZm9yZSBjb2xvcmluZy4KKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMTY+IE9yaWdTaXplczsKKworICAgIC8vIEFsbENvbG9ycyAtIElmIGluZGV4IGlzIHNldCwgaXQncyBhIHNwaWxsIHNsb3QsIGkuZS4gY29sb3IuCisgICAgLy8gRklYTUU6IFRoaXMgYXNzdW1lcyBQRUkgbG9jYXRlIHNwaWxsIHNsb3Qgd2l0aCBzbWFsbGVyIGluZGljZXMKKyAgICAvLyBjbG9zZXN0IHRvIHN0YWNrIHBvaW50ZXIgLyBmcmFtZSBwb2ludGVyLiBUaGVyZWZvcmUsIHNtYWxsZXIKKyAgICAvLyBpbmRleCA9PSBiZXR0ZXIgY29sb3IuCisgICAgQml0VmVjdG9yIEFsbENvbG9yczsKKworICAgIC8vIE5leHRDb2xvciAtIE5leHQgImNvbG9yIiB0aGF0J3Mgbm90IHlldCB1c2VkLgorICAgIGludCBOZXh0Q29sb3I7CisKKyAgICAvLyBVc2VkQ29sb3JzIC0gIkNvbG9ycyIgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQuCisgICAgQml0VmVjdG9yIFVzZWRDb2xvcnM7CisKKyAgICAvLyBBc3NpZ25tZW50cyAtIENvbG9yIHRvIGludGVydmFscyBtYXBwaW5nLgorICAgIFNtYWxsVmVjdG9yPFNtYWxsVmVjdG9yPExpdmVJbnRlcnZhbCosND4sIDE2PiBBc3NpZ25tZW50czsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24KKyAgICBTdGFja1Nsb3RDb2xvcmluZygpIDoKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpLCBDb2xvcldpdGhSZWdzKGZhbHNlKSwgTmV4dENvbG9yKC0xKSB7fQorICAgIFN0YWNrU2xvdENvbG9yaW5nKGJvb2wgUmVnQ29sb3IpIDoKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpLCBDb2xvcldpdGhSZWdzKFJlZ0NvbG9yKSwgTmV4dENvbG9yKC0xKSB7fQorICAgIAorICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPFNsb3RJbmRleGVzPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPFNsb3RJbmRleGVzPigpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8TGl2ZVN0YWNrcz4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPFZpcnRSZWdNYXA+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8VmlydFJlZ01hcD4oKTsgICAgICAKKyAgICAgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVMb29wSW5mbz4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxNYWNoaW5lTG9vcEluZm8+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWRJRChNYWNoaW5lRG9taW5hdG9yc0lEKTsKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJTdGFjayBTbG90IENvbG9yaW5nIjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIEluaXRpYWxpemVTbG90cygpOworICAgIGJvb2wgQ2hlY2tGb3JTZXRKbXBDYWxsKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIHZvaWQgU2NhbkZvclNwaWxsU2xvdFJlZnMoTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgYm9vbCBPdmVybGFwV2l0aEFzc2lnbm1lbnRzKExpdmVJbnRlcnZhbCAqbGksIGludCBDb2xvcikgY29uc3Q7CisgICAgaW50IENvbG9yU2xvdChMaXZlSW50ZXJ2YWwgKmxpKTsKKyAgICBib29sIENvbG9yU2xvdHMoTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgYm9vbCBDb2xvclNsb3RzV2l0aEZyZWVSZWdzKFNtYWxsVmVjdG9yPGludCwgMTY+ICZTbG90TWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8U21hbGxWZWN0b3I8aW50LCA0PiwgMTY+ICZSZXZNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmU2xvdElzUmVnKTsKKyAgICB2b2lkIFJld3JpdGVJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT2xkRkksIGludCBOZXdGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKyAgICBib29sIFByb3BhZ2F0ZUJhY2t3YXJkKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT2xkUmVnLCB1bnNpZ25lZCBOZXdSZWcpOworICAgIGJvb2wgUHJvcGFnYXRlRm9yd2FyZChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUlJLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPbGRSZWcsIHVuc2lnbmVkIE5ld1JlZyk7CisgICAgdm9pZCBVbmZvbGRBbmRSZXdyaXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwgaW50IE9sZEZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiAmRGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpOworICAgIGJvb2wgQWxsTWVtUmVmc0NhbkJlVW5mb2xkZWQoaW50IFNTKTsKKyAgICBib29sIFJlbW92ZURlYWRTdG9yZXMoTWFjaGluZUJhc2ljQmxvY2sqIE1CQik7CisgIH07Cit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2NoYXIgU3RhY2tTbG90Q29sb3Jpbmc6OklEID0gMDsKKworSU5JVElBTElaRV9QQVNTKFN0YWNrU2xvdENvbG9yaW5nLCAic3RhY2stc2xvdC1jb2xvcmluZyIsCisgICAgICAgICAgICAgICAgIlN0YWNrIFNsb3QgQ29sb3JpbmciLCBmYWxzZSwgZmFsc2UpOworCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZVN0YWNrU2xvdENvbG9yaW5nUGFzcyhib29sIFJlZ0NvbG9yKSB7CisgIHJldHVybiBuZXcgU3RhY2tTbG90Q29sb3JpbmcoUmVnQ29sb3IpOworfQorCituYW1lc3BhY2UgeworICAvLyBJbnRlcnZhbFNvcnRlciAtIENvbXBhcmlzb24gcHJlZGljYXRlIHRoYXQgc29ydCBsaXZlIGludGVydmFscyBieQorICAvLyB0aGVpciB3ZWlnaHQuCisgIHN0cnVjdCBJbnRlcnZhbFNvcnRlciB7CisgICAgYm9vbCBvcGVyYXRvcigpKExpdmVJbnRlcnZhbCogTEhTLCBMaXZlSW50ZXJ2YWwqIFJIUykgY29uc3QgeworICAgICAgcmV0dXJuIExIUy0+d2VpZ2h0ID4gUkhTLT53ZWlnaHQ7CisgICAgfQorICB9OworfQorCisvLy8gU2NhbkZvclNwaWxsU2xvdFJlZnMgLSBTY2FuIGFsbCB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbnMgZm9yIHNwaWxsIHNsb3QKKy8vLyByZWZlcmVuY2VzIGFuZCB1cGRhdGUgc3BpbGwgc2xvdCB3ZWlnaHRzLgordm9pZCBTdGFja1Nsb3RDb2xvcmluZzo6U2NhbkZvclNwaWxsU2xvdFJlZnMoTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBTU1JlZnMucmVzaXplKE1GSS0+Z2V0T2JqZWN0SW5kZXhFbmQoKSk7CisKKyAgLy8gRklYTUU6IE5lZWQgdGhlIGVxdWl2YWxlbnQgb2YgTWFjaGluZVJlZ2lzdGVySW5mbyBmb3IgZnJhbWVpbmRleCBvcGVyYW5kcy4KKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7CisgICAgICAgTUJCSSAhPSBFOyArK01CQkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gJipNQkJJOworICAgIHVuc2lnbmVkIGxvb3BEZXB0aCA9IGxvb3BJbmZvLT5nZXRMb29wRGVwdGgoTUJCKTsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSUkgPSBNQkItPmJlZ2luKCksIEVFID0gTUJCLT5lbmQoKTsKKyAgICAgICAgIE1JSSAhPSBFRTsgKytNSUkpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqTUkgPSAmKk1JSTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICAgIGlmICghTU8uaXNGSSgpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpbnQgRkkgPSBNTy5nZXRJbmRleCgpOworICAgICAgICBpZiAoRkkgPCAwKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIUxTLT5oYXNJbnRlcnZhbChGSSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIExpdmVJbnRlcnZhbCAmbGkgPSBMUy0+Z2V0SW50ZXJ2YWwoRkkpOworICAgICAgICBpZiAoIU1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICAgICBsaS53ZWlnaHQgKz0gTGl2ZUludGVydmFsczo6Z2V0U3BpbGxXZWlnaHQoZmFsc2UsIHRydWUsIGxvb3BEZXB0aCk7CisgICAgICAgIFNTUmVmc1tGSV0ucHVzaF9iYWNrKE1JKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8vIEluaXRpYWxpemVTbG90cyAtIFByb2Nlc3MgYWxsIHNwaWxsIHN0YWNrIHNsb3QgbGl2ZWludGVydmFscyBhbmQgYWRkIHRoZW0KKy8vLyB0byBhIHNvcnRlZCAoYnkgd2VpZ2h0KSBsaXN0Lgordm9pZCBTdGFja1Nsb3RDb2xvcmluZzo6SW5pdGlhbGl6ZVNsb3RzKCkgeworICBpbnQgTGFzdEZJID0gTUZJLT5nZXRPYmplY3RJbmRleEVuZCgpOworICBPcmlnQWxpZ25tZW50cy5yZXNpemUoTGFzdEZJKTsKKyAgT3JpZ1NpemVzLnJlc2l6ZShMYXN0RkkpOworICBBbGxDb2xvcnMucmVzaXplKExhc3RGSSk7CisgIFVzZWRDb2xvcnMucmVzaXplKExhc3RGSSk7CisgIEFzc2lnbm1lbnRzLnJlc2l6ZShMYXN0RkkpOworCisgIC8vIEdhdGhlciBhbGwgc3BpbGwgc2xvdHMgaW50byBhIGxpc3QuCisgIERFQlVHKGRiZ3MoKSA8PCAiU3BpbGwgc2xvdCBpbnRlcnZhbHM6XG4iKTsKKyAgZm9yIChMaXZlU3RhY2tzOjppdGVyYXRvciBpID0gTFMtPmJlZ2luKCksIGUgPSBMUy0+ZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTGl2ZUludGVydmFsICZsaSA9IGktPnNlY29uZDsKKyAgICBERUJVRyhsaS5kdW1wKCkpOworICAgIGludCBGSSA9IGxpLmdldFN0YWNrU2xvdEluZGV4KCk7CisgICAgaWYgKE1GSS0+aXNEZWFkT2JqZWN0SW5kZXgoRkkpKQorICAgICAgY29udGludWU7CisgICAgU1NJbnRlcnZhbHMucHVzaF9iYWNrKCZsaSk7CisgICAgT3JpZ0FsaWdubWVudHNbRkldID0gTUZJLT5nZXRPYmplY3RBbGlnbm1lbnQoRkkpOworICAgIE9yaWdTaXplc1tGSV0gICAgICA9IE1GSS0+Z2V0T2JqZWN0U2l6ZShGSSk7CisgICAgQWxsQ29sb3JzLnNldChGSSk7CisgIH0KKyAgREVCVUcoZGJncygpIDw8ICdcbicpOworCisgIC8vIFNvcnQgdGhlbSBieSB3ZWlnaHQuCisgIHN0ZDo6c3RhYmxlX3NvcnQoU1NJbnRlcnZhbHMuYmVnaW4oKSwgU1NJbnRlcnZhbHMuZW5kKCksIEludGVydmFsU29ydGVyKCkpOworCisgIC8vIEdldCBmaXJzdCAiY29sb3IiLgorICBOZXh0Q29sb3IgPSBBbGxDb2xvcnMuZmluZF9maXJzdCgpOworfQorCisvLy8gT3ZlcmxhcFdpdGhBc3NpZ25tZW50cyAtIFJldHVybiB0cnVlIGlmIExpdmVJbnRlcnZhbCBvdmVybGFwcyB3aXRoIGFueQorLy8vIExpdmVJbnRlcnZhbHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWVkIGNvbG9yLgorYm9vbAorU3RhY2tTbG90Q29sb3Jpbmc6Ok92ZXJsYXBXaXRoQXNzaWdubWVudHMoTGl2ZUludGVydmFsICpsaSwgaW50IENvbG9yKSBjb25zdCB7CisgIGNvbnN0IFNtYWxsVmVjdG9yPExpdmVJbnRlcnZhbCosND4gJk90aGVyTElzID0gQXNzaWdubWVudHNbQ29sb3JdOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3RoZXJMSXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIExpdmVJbnRlcnZhbCAqT3RoZXJMSSA9IE90aGVyTElzW2ldOworICAgIGlmIChPdGhlckxJLT5vdmVybGFwcygqbGkpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gQ29sb3JTbG90c1dpdGhGcmVlUmVncyAtIElmIHRoZXJlIGFyZSBhbnkgZnJlZSByZWdpc3RlcnMgYXZhaWxhYmxlLCB0cnkKKy8vLyByZXBsYWNpbmcgc3BpbGwgc2xvdHMgcmVmZXJlbmNlcyB3aXRoIHJlZ2lzdGVycyBpbnN0ZWFkLgorYm9vbAorU3RhY2tTbG90Q29sb3Jpbmc6OkNvbG9yU2xvdHNXaXRoRnJlZVJlZ3MoU21hbGxWZWN0b3I8aW50LCAxNj4gJlNsb3RNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxTbWFsbFZlY3RvcjxpbnQsIDQ+LCAxNj4gJlJldk1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0VmVjdG9yICZTbG90SXNSZWcpIHsKKyAgaWYgKCEoQ29sb3JXaXRoUmVncyB8fCBDb2xvcldpdGhSZWdzT3B0KSB8fCAhVlJNLT5IYXNVbnVzZWRSZWdpc3RlcnMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIERFQlVHKGRiZ3MoKSA8PCAiQXNzaWduaW5nIHVudXNlZCByZWdpc3RlcnMgdG8gc3BpbGwgc2xvdHM6XG4iKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNTSW50ZXJ2YWxzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBMaXZlSW50ZXJ2YWwgKmxpID0gU1NJbnRlcnZhbHNbaV07CisgICAgaW50IFNTID0gbGktPmdldFN0YWNrU2xvdEluZGV4KCk7CisgICAgaWYgKCFVc2VkQ29sb3JzW1NTXSB8fCBsaS0+d2VpZ2h0IDwgMjApCisgICAgICAvLyBJZiB0aGUgd2VpZ2h0IGlzIDwgMjAsIGkuZS4gdHdvIHJlZmVyZW5jZXMgaW4gYSBsb29wIHdpdGggZGVwdGggMSwKKyAgICAgIC8vIGRvbid0IGJvdGhlciB3aXRoIGl0LgorICAgICAgY29udGludWU7CisKKyAgICAvLyBUaGVzZSBzbG90cyBhbGxvdyB0byBzaGFyZSB0aGUgc2FtZSByZWdpc3RlcnMuCisgICAgYm9vbCBBbGxDb2xvcmVkID0gdHJ1ZTsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gQ29sb3JlZFJlZ3M7CisgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZWUgPSBSZXZNYXBbU1NdLnNpemUoKTsgaiAhPSBlZTsgKytqKSB7CisgICAgICBpbnQgUlNTID0gUmV2TWFwW1NTXVtqXTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gTFMtPmdldEludGVydmFsUmVnQ2xhc3MoUlNTKTsKKyAgICAgIC8vIElmIGl0J3Mgbm90IGNvbG9yZWQgdG8gYW5vdGhlciBzdGFjayBzbG90LCB0cnkgY29sb3JpbmcgaXQKKyAgICAgIC8vIHRvIGEgImZyZWUiIHJlZ2lzdGVyLgorICAgICAgaWYgKCFSQykgeworICAgICAgICBBbGxDb2xvcmVkID0gZmFsc2U7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdW5zaWduZWQgUmVnID0gVlJNLT5nZXRGaXJzdFVudXNlZFJlZ2lzdGVyKFJDKTsKKyAgICAgIGlmICghUmVnKSB7CisgICAgICAgIEFsbENvbG9yZWQgPSBmYWxzZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoIUFsbE1lbVJlZnNDYW5CZVVuZm9sZGVkKFJTUykpIHsKKyAgICAgICAgQWxsQ29sb3JlZCA9IGZhbHNlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQXNzaWduaW5nIGZpIyIgPDwgUlNTIDw8ICIgdG8gIgorICAgICAgICAgICAgICAgICAgICAgPDwgVFJJLT5nZXROYW1lKFJlZykgPDwgJ1xuJyk7CisgICAgICAgIENvbG9yZWRSZWdzLnB1c2hfYmFjayhSZWcpOworICAgICAgICBTbG90TWFwcGluZ1tSU1NdID0gUmVnOworICAgICAgICBTbG90SXNSZWcuc2V0KFJTUyk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIGFuZCBpdHMgc3ViLXJlZ2lzdGVycyBhcmUgbm8gbG9uZ2VyIGZyZWUuCisgICAgd2hpbGUgKCFDb2xvcmVkUmVncy5lbXB0eSgpKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSBDb2xvcmVkUmVncy5iYWNrKCk7CisgICAgICBDb2xvcmVkUmVncy5wb3BfYmFjaygpOworICAgICAgVlJNLT5zZXRSZWdpc3RlclVzZWQoUmVnKTsKKyAgICAgIC8vIElmIHJlZyBpcyBhIGNhbGxlZS1zYXZlZCByZWdpc3RlciwgaXQgd2lsbCBoYXZlIHRvIGJlIHNwaWxsZWQgaW4KKyAgICAgIC8vIHRoZSBwcm9sb2d1ZS4KKyAgICAgIE1SSS0+c2V0UGh5c1JlZ1VzZWQoUmVnKTsKKyAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFTID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqQVM7ICsrQVMpIHsKKyAgICAgICAgVlJNLT5zZXRSZWdpc3RlclVzZWQoKkFTKTsKKyAgICAgICAgTVJJLT5zZXRQaHlzUmVnVXNlZCgqQVMpOworICAgICAgfQorICAgIH0KKyAgICAvLyBUaGlzIHNwaWxsIHNsb3QgaXMgZGVhZCBhZnRlciB0aGUgcmV3cml0ZXMKKyAgICBpZiAoQWxsQ29sb3JlZCkgeworICAgICAgTUZJLT5SZW1vdmVTdGFja09iamVjdChTUyk7CisgICAgICArK051bUVsaW1pbmF0ZWQ7CisgICAgfQorICB9CisgIERFQlVHKGRiZ3MoKSA8PCAnXG4nKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIENvbG9yU2xvdCAtIEFzc2lnbiBhICJjb2xvciIgKHN0YWNrIHNsb3QpIHRvIHRoZSBzcGVjaWZpZWQgc3RhY2sgc2xvdC4KKy8vLworaW50IFN0YWNrU2xvdENvbG9yaW5nOjpDb2xvclNsb3QoTGl2ZUludGVydmFsICpsaSkgeworICBpbnQgQ29sb3IgPSAtMTsKKyAgYm9vbCBTaGFyZSA9IGZhbHNlOworICBpZiAoIURpc2FibGVTaGFyaW5nKSB7CisgICAgLy8gQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSB0byByZXVzZSBhbnkgb2YgdGhlIHVzZWQgY29sb3JzLgorICAgIENvbG9yID0gVXNlZENvbG9ycy5maW5kX2ZpcnN0KCk7CisgICAgd2hpbGUgKENvbG9yICE9IC0xKSB7CisgICAgICBpZiAoIU92ZXJsYXBXaXRoQXNzaWdubWVudHMobGksIENvbG9yKSkgeworICAgICAgICBTaGFyZSA9IHRydWU7CisgICAgICAgICsrTnVtRWxpbWluYXRlZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBDb2xvciA9IFVzZWRDb2xvcnMuZmluZF9uZXh0KENvbG9yKTsKKyAgICB9CisgIH0KKworICAvLyBBc3NpZ24gaXQgdG8gdGhlIGZpcnN0IGF2YWlsYWJsZSBjb2xvciAoYXNzdW1lZCB0byBiZSB0aGUgYmVzdCkgaWYgaXQncworICAvLyBub3QgcG9zc2libGUgdG8gc2hhcmUgYSB1c2VkIGNvbG9yIHdpdGggb3RoZXIgb2JqZWN0cy4KKyAgaWYgKCFTaGFyZSkgeworICAgIGFzc2VydChOZXh0Q29sb3IgIT0gLTEgJiYgIk5vIG1vcmUgc3BpbGwgc2xvdHM/Iik7CisgICAgQ29sb3IgPSBOZXh0Q29sb3I7CisgICAgVXNlZENvbG9ycy5zZXQoQ29sb3IpOworICAgIE5leHRDb2xvciA9IEFsbENvbG9ycy5maW5kX25leHQoTmV4dENvbG9yKTsKKyAgfQorCisgIC8vIFJlY29yZCB0aGUgYXNzaWdubWVudC4KKyAgQXNzaWdubWVudHNbQ29sb3JdLnB1c2hfYmFjayhsaSk7CisgIGludCBGSSA9IGxpLT5nZXRTdGFja1Nsb3RJbmRleCgpOworICBERUJVRyhkYmdzKCkgPDwgIkFzc2lnbmluZyBmaSMiIDw8IEZJIDw8ICIgdG8gZmkjIiA8PCBDb2xvciA8PCAiXG4iKTsKKworICAvLyBDaGFuZ2Ugc2l6ZSBhbmQgYWxpZ25tZW50IG9mIHRoZSBhbGxvY2F0ZWQgc2xvdC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCisgIC8vIG9iamVjdHMgc2hhcmluZyB0aGUgc2FtZSBzbG90LCB0aGVuIG1ha2Ugc3VyZSB0aGUgc2l6ZSBhbmQgYWxpZ25tZW50CisgIC8vIGFyZSBsYXJnZSBlbm91Z2ggZm9yIGFsbC4KKyAgdW5zaWduZWQgQWxpZ24gPSBPcmlnQWxpZ25tZW50c1tGSV07CisgIGlmICghU2hhcmUgfHwgQWxpZ24gPiBNRkktPmdldE9iamVjdEFsaWdubWVudChDb2xvcikpCisgICAgTUZJLT5zZXRPYmplY3RBbGlnbm1lbnQoQ29sb3IsIEFsaWduKTsKKyAgaW50NjRfdCBTaXplID0gT3JpZ1NpemVzW0ZJXTsKKyAgaWYgKCFTaGFyZSB8fCBTaXplID4gTUZJLT5nZXRPYmplY3RTaXplKENvbG9yKSkKKyAgICBNRkktPnNldE9iamVjdFNpemUoQ29sb3IsIFNpemUpOworICByZXR1cm4gQ29sb3I7Cit9CisKKy8vLyBDb2xvcnNsb3RzIC0gQ29sb3IgYWxsIHNwaWxsIHN0YWNrIHNsb3RzIGFuZCByZXdyaXRlIGFsbCBmcmFtZWluZGV4IG1hY2hpbmUKKy8vLyBvcGVyYW5kcyBpbiB0aGUgZnVuY3Rpb24uCitib29sIFN0YWNrU2xvdENvbG9yaW5nOjpDb2xvclNsb3RzKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgdW5zaWduZWQgTnVtT2JqcyA9IE1GSS0+Z2V0T2JqZWN0SW5kZXhFbmQoKTsKKyAgU21hbGxWZWN0b3I8aW50LCAxNj4gU2xvdE1hcHBpbmcoTnVtT2JqcywgLTEpOworICBTbWFsbFZlY3RvcjxmbG9hdCwgMTY+IFNsb3RXZWlnaHRzKE51bU9ianMsIDAuMCk7CisgIFNtYWxsVmVjdG9yPFNtYWxsVmVjdG9yPGludCwgND4sIDE2PiBSZXZNYXAoTnVtT2Jqcyk7CisgIEJpdFZlY3RvciBTbG90SXNSZWcoTnVtT2Jqcyk7CisgIEJpdFZlY3RvciBVc2VkQ29sb3JzKE51bU9ianMpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiQ29sb3Igc3BpbGwgc2xvdCBpbnRlcnZhbHM6XG4iKTsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTU0ludGVydmFscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTGl2ZUludGVydmFsICpsaSA9IFNTSW50ZXJ2YWxzW2ldOworICAgIGludCBTUyA9IGxpLT5nZXRTdGFja1Nsb3RJbmRleCgpOworICAgIGludCBOZXdTUyA9IENvbG9yU2xvdChsaSk7CisgICAgYXNzZXJ0KE5ld1NTID49IDAgJiYgIlN0YWNrIGNvbG9yaW5nIGZhaWxlZD8iKTsKKyAgICBTbG90TWFwcGluZ1tTU10gPSBOZXdTUzsKKyAgICBSZXZNYXBbTmV3U1NdLnB1c2hfYmFjayhTUyk7CisgICAgU2xvdFdlaWdodHNbTmV3U1NdICs9IGxpLT53ZWlnaHQ7CisgICAgVXNlZENvbG9ycy5zZXQoTmV3U1MpOworICAgIENoYW5nZWQgfD0gKFNTICE9IE5ld1NTKTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiXG5TcGlsbCBzbG90cyBhZnRlciBjb2xvcmluZzpcbiIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU1NJbnRlcnZhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIExpdmVJbnRlcnZhbCAqbGkgPSBTU0ludGVydmFsc1tpXTsKKyAgICBpbnQgU1MgPSBsaS0+Z2V0U3RhY2tTbG90SW5kZXgoKTsKKyAgICBsaS0+d2VpZ2h0ID0gU2xvdFdlaWdodHNbU1NdOworICB9CisgIC8vIFNvcnQgdGhlbSBieSBuZXcgd2VpZ2h0LgorICBzdGQ6OnN0YWJsZV9zb3J0KFNTSW50ZXJ2YWxzLmJlZ2luKCksIFNTSW50ZXJ2YWxzLmVuZCgpLCBJbnRlcnZhbFNvcnRlcigpKTsKKworI2lmbmRlZiBOREVCVUcKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNTSW50ZXJ2YWxzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgREVCVUcoU1NJbnRlcnZhbHNbaV0tPmR1bXAoKSk7CisgIERFQlVHKGRiZ3MoKSA8PCAnXG4nKTsKKyNlbmRpZgorCisgIC8vIENhbiB3ZSAiY29sb3IiIGEgc3RhY2sgc2xvdCB3aXRoIGEgdW51c2VkIHJlZ2lzdGVyPworICBDaGFuZ2VkIHw9IENvbG9yU2xvdHNXaXRoRnJlZVJlZ3MoU2xvdE1hcHBpbmcsIFJldk1hcCwgU2xvdElzUmVnKTsKKworICBpZiAoIUNoYW5nZWQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFJld3JpdGUgYWxsIE1PX0ZyYW1lSW5kZXggb3BlcmFuZHMuCisgIFNtYWxsVmVjdG9yPFNtYWxsU2V0PHVuc2lnbmVkLCA0PiwgND4gTmV3RGVmcyhNRi5nZXROdW1CbG9ja0lEcygpKTsKKyAgZm9yICh1bnNpZ25lZCBTUyA9IDAsIFNFID0gU1NSZWZzLnNpemUoKTsgU1MgIT0gU0U7ICsrU1MpIHsKKyAgICBib29sIGlzUmVnID0gU2xvdElzUmVnW1NTXTsKKyAgICBpbnQgTmV3RkkgPSBTbG90TWFwcGluZ1tTU107CisgICAgaWYgKE5ld0ZJID09IC0xIHx8IChOZXdGSSA9PSAoaW50KVNTICYmICFpc1JlZykpCisgICAgICBjb250aW51ZTsKKworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gTFMtPmdldEludGVydmFsUmVnQ2xhc3MoU1MpOworICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDg+ICZSZWZNSXMgPSBTU1JlZnNbU1NdOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWZNSXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICghaXNSZWcpCisgICAgICAgIFJld3JpdGVJbnN0cnVjdGlvbihSZWZNSXNbaV0sIFNTLCBOZXdGSSwgTUYpOworICAgICAgZWxzZSB7CisgICAgICAgIC8vIFJld3JpdGUgdG8gdXNlIGEgcmVnaXN0ZXIgaW5zdGVhZC4KKyAgICAgICAgdW5zaWduZWQgTUJCSWQgPSBSZWZNSXNbaV0tPmdldFBhcmVudCgpLT5nZXROdW1iZXIoKTsKKyAgICAgICAgU21hbGxTZXQ8dW5zaWduZWQsIDQ+ICZEZWZzID0gTmV3RGVmc1tNQkJJZF07CisgICAgICAgIFVuZm9sZEFuZFJld3JpdGVJbnN0cnVjdGlvbihSZWZNSXNbaV0sIFNTLCBOZXdGSSwgUkMsIERlZnMsIE1GKTsKKyAgICAgIH0KKyAgfQorCisgIC8vIERlbGV0ZSB1bnVzZWQgc3RhY2sgc2xvdHMuCisgIHdoaWxlIChOZXh0Q29sb3IgIT0gLTEpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlJlbW92aW5nIHVudXNlZCBzdGFjayBvYmplY3QgZmkjIiA8PCBOZXh0Q29sb3IgPDwgIlxuIik7CisgICAgTUZJLT5SZW1vdmVTdGFja09iamVjdChOZXh0Q29sb3IpOworICAgIE5leHRDb2xvciA9IEFsbENvbG9ycy5maW5kX25leHQoTmV4dENvbG9yKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLy8gQWxsTWVtUmVmc0NhbkJlVW5mb2xkZWQgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgcmVmZXJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkCisvLy8gc3BpbGwgc2xvdCBpbmRleCBjYW4gYmUgdW5mb2xkZWQuCitib29sIFN0YWNrU2xvdENvbG9yaW5nOjpBbGxNZW1SZWZzQ2FuQmVVbmZvbGRlZChpbnQgU1MpIHsKKyAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyKiwgOD4gJlJlZk1JcyA9IFNTUmVmc1tTU107CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWZNSXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBSZWZNSXNbaV07CisgICAgaWYgKFRJSS0+aXNMb2FkRnJvbVN0YWNrU2xvdChNSSwgU1MpIHx8CisgICAgICAgIFRJSS0+aXNTdG9yZVRvU3RhY2tTbG90KE1JLCBTUykpCisgICAgICAvLyBSZXN0b3JlIGFuZCBzcGlsbCB3aWxsIGJlY29tZSBjb3BpZXMuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIVRJSS0+Z2V0T3Bjb2RlQWZ0ZXJNZW1vcnlVbmZvbGQoTUktPmdldE9wY29kZSgpLCBmYWxzZSwgZmFsc2UpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGogIT0gZWU7ICsraikgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaik7CisgICAgICBpZiAoTU8uaXNGSSgpICYmIE1PLmdldEluZGV4KCkgIT0gU1MpCisgICAgICAgIC8vIElmIGl0IHVzZXMgYW5vdGhlciBmcmFtZWluZGV4LCB3ZSBjYW4sIGN1cnJlbnRseSogdW5mb2xkIGl0LgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gUmV3cml0ZUluc3RydWN0aW9uIC0gUmV3cml0ZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gYnkgcmVwbGFjaW5nIHJlZmVyZW5jZXMKKy8vLyB0byBvbGQgZnJhbWUgaW5kZXggd2l0aCBuZXcgb25lLgordm9pZCBTdGFja1Nsb3RDb2xvcmluZzo6UmV3cml0ZUluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAqTUksIGludCBPbGRGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTmV3RkksIE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgLy8gVXBkYXRlIHRoZSBvcGVyYW5kcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZWUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc0ZJKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpbnQgRkkgPSBNTy5nZXRJbmRleCgpOworICAgIGlmIChGSSAhPSBPbGRGSSkKKyAgICAgIGNvbnRpbnVlOworICAgIE1PLnNldEluZGV4KE5ld0ZJKTsKKyAgfQorCisgIC8vIFVwZGF0ZSB0aGUgbWVtb3J5IHJlZmVyZW5jZXMuIFRoaXMgY2hhbmdlcyB0aGUgTWFjaGluZU1lbU9wZXJhbmRzCisgIC8vIGRpcmVjdGx5LiBUaGV5IG1heSBiZSBpbiB1c2UgYnkgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zLCBob3dldmVyIGFsbAorICAvLyBpbnN0cnVjdGlvbnMgdXNpbmcgT2xkRkkgYXJlIGJlaW5nIHJld3JpdHRlbiB0byB1c2UgTmV3RkkuCisgIGNvbnN0IFZhbHVlICpPbGRTViA9IFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKE9sZEZJKTsKKyAgY29uc3QgVmFsdWUgKk5ld1NWID0gUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soTmV3RkkpOworICBmb3IgKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIEkgPSBNSS0+bWVtb3BlcmFuZHNfYmVnaW4oKSwKKyAgICAgICBFID0gTUktPm1lbW9wZXJhbmRzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoKCpJKS0+Z2V0VmFsdWUoKSA9PSBPbGRTVikKKyAgICAgICgqSSktPnNldFZhbHVlKE5ld1NWKTsKK30KKworLy8vIFByb3BhZ2F0ZUJhY2t3YXJkIC0gVHJhdmVyc2UgYmFja3dhcmQgYW5kIGxvb2sgZm9yIHRoZSBkZWZpbml0aW9uIG9mCisvLy8gT2xkUmVnLiBJZiBpdCBjYW4gc3VjY2Vzc2Z1bGx5IHVwZGF0ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZXMgd2l0aCBOZXdSZWcsCisvLy8gZG8gc28gYW5kIHJldHVybiB0cnVlLgorYm9vbCBTdGFja1Nsb3RDb2xvcmluZzo6UHJvcGFnYXRlQmFja3dhcmQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPbGRSZWcsIHVuc2lnbmVkIE5ld1JlZykgeworICBpZiAoTUlJID09IE1CQi0+YmVnaW4oKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQqLCA0PiBVc2VzOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCosIDQ+IFJlZnM7CisgIHdoaWxlICgtLU1JSSAhPSBNQkItPmJlZ2luKCkpIHsKKyAgICBib29sIEZvdW5kRGVmID0gZmFsc2U7ICAvLyBOb3QgY291bnRpbmcgMmFkZHJlc3MgZGVmLgorCisgICAgVXNlcy5jbGVhcigpOworICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUlJLT5nZXREZXNjKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgIGlmIChSZWcgPT0gMCkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoUmVnID09IE9sZFJlZykgeworICAgICAgICBpZiAoTU8uaXNJbXBsaWNpdCgpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBBYm9ydCB0aGUgdXNlIGlzIGFjdHVhbGx5IGEgc3ViLXJlZ2lzdGVyIGRlZi4gV2UgZG9uJ3QgaGF2ZSBlbm91Z2gKKyAgICAgICAgLy8gaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCBpZiBpdCBpcyByZWFsbHkgbGVnYWwuCisgICAgICAgIGlmIChNTy5nZXRTdWJSZWcoKSB8fCBNSUktPmlzU3VicmVnVG9SZWcoKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBUSUQuT3BJbmZvW2ldLmdldFJlZ0NsYXNzKFRSSSk7CisgICAgICAgIGlmIChSQyAmJiAhUkMtPmNvbnRhaW5zKE5ld1JlZykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChNTy5pc1VzZSgpKSB7CisgICAgICAgICAgVXNlcy5wdXNoX2JhY2soJk1PKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBSZWZzLnB1c2hfYmFjaygmTU8pOworICAgICAgICAgIGlmICghTUlJLT5pc1JlZ1RpZWRUb1VzZU9wZXJhbmQoaSkpCisgICAgICAgICAgICBGb3VuZERlZiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoVFJJLT5yZWdzT3ZlcmxhcChSZWcsIE5ld1JlZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIGlmIChUUkktPnJlZ3NPdmVybGFwKFJlZywgT2xkUmVnKSkgeworICAgICAgICBpZiAoIU1PLmlzVXNlKCkgfHwgIU1PLmlzS2lsbCgpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRm91bmREZWYpIHsKKyAgICAgIC8vIEZvdW5kIG5vbi10d28tYWRkcmVzcyBkZWYuIFN0b3AgaGVyZS4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWZzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIFJlZnNbaV0tPnNldFJlZyhOZXdSZWcpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gVHdvLWFkZHJlc3MgdXNlcyBtdXN0IGJlIHVwZGF0ZWQgYXMgd2VsbC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVXNlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgUmVmcy5wdXNoX2JhY2soVXNlc1tpXSk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUHJvcGFnYXRlRm9yd2FyZCAtIFRyYXZlcnNlIGZvcndhcmQgYW5kIGxvb2sgZm9yIHRoZSBraWxsIG9mIE9sZFJlZy4gSWYKKy8vLyBpdCBjYW4gc3VjY2Vzc2Z1bGx5IHVwZGF0ZSBhbGwgb2YgdGhlIHVzZXMgd2l0aCBOZXdSZWcsIGRvIHNvIGFuZAorLy8vIHJldHVybiB0cnVlLgorYm9vbCBTdGFja1Nsb3RDb2xvcmluZzo6UHJvcGFnYXRlRm9yd2FyZChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUlJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPbGRSZWcsIHVuc2lnbmVkIE5ld1JlZykgeworICBpZiAoTUlJID09IE1CQi0+ZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kKiwgND4gVXNlczsKKyAgd2hpbGUgKCsrTUlJICE9IE1CQi0+ZW5kKCkpIHsKKyAgICBib29sIEZvdW5kS2lsbCA9IGZhbHNlOworICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUlJLT5nZXREZXNjKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgIGlmIChSZWcgPT0gMCkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoUmVnID09IE9sZFJlZykgeworICAgICAgICBpZiAoTU8uaXNEZWYoKSB8fCBNTy5pc0ltcGxpY2l0KCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIEFib3J0IHRoZSB1c2UgaXMgYWN0dWFsbHkgYSBzdWItcmVnaXN0ZXIgdXNlLiBXZSBkb24ndCBoYXZlIGVub3VnaAorICAgICAgICAvLyBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IGlmIGl0IGlzIHJlYWxseSBsZWdhbC4KKyAgICAgICAgaWYgKE1PLmdldFN1YlJlZygpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IFRJRC5PcEluZm9baV0uZ2V0UmVnQ2xhc3MoVFJJKTsKKyAgICAgICAgaWYgKFJDICYmICFSQy0+Y29udGFpbnMoTmV3UmVnKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChNTy5pc0tpbGwoKSkKKyAgICAgICAgICBGb3VuZEtpbGwgPSB0cnVlOworCisgICAgICAgIFVzZXMucHVzaF9iYWNrKCZNTyk7CisgICAgICB9IGVsc2UgaWYgKFRSSS0+cmVnc092ZXJsYXAoUmVnLCBOZXdSZWcpIHx8CisgICAgICAgICAgICAgICAgIFRSSS0+cmVnc092ZXJsYXAoUmVnLCBPbGRSZWcpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChGb3VuZEtpbGwpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIFVzZXNbaV0tPnNldFJlZyhOZXdSZWcpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFVuZm9sZEFuZFJld3JpdGVJbnN0cnVjdGlvbiAtIFJld3JpdGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGJ5IHVuZm9sZGluZworLy8vIGZvbGRlZCBtZW1vcnkgcmVmZXJlbmNlcyBhbmQgcmVwbGFjaW5nIHRob3NlIHJlZmVyZW5jZXMgd2l0aCByZWdpc3RlcgorLy8vIHJlZmVyZW5jZXMgaW5zdGVhZC4KK3ZvaWQKK1N0YWNrU2xvdENvbG9yaW5nOjpVbmZvbGRBbmRSZXdyaXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwgaW50IE9sZEZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDx1bnNpZ25lZCwgND4gJkRlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1JLT5nZXRQYXJlbnQoKTsKKyAgaWYgKHVuc2lnbmVkIERzdFJlZyA9IFRJSS0+aXNMb2FkRnJvbVN0YWNrU2xvdChNSSwgT2xkRkkpKSB7CisgICAgaWYgKFByb3BhZ2F0ZUZvcndhcmQoTUksIE1CQiwgRHN0UmVnLCBSZWcpKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkVsaW1pbmF0ZWQgbG9hZDogIik7CisgICAgICBERUJVRyhNSS0+ZHVtcCgpKTsKKyAgICAgICsrTnVtTG9hZEVsaW07CisgICAgfSBlbHNlIHsKKyAgICAgIEJ1aWxkTUkoKk1CQiwgTUksIE1JLT5nZXREZWJ1Z0xvYygpLCBUSUktPmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLAorICAgICAgICAgICAgICBEc3RSZWcpLmFkZFJlZyhSZWcpOworICAgICAgKytOdW1SZWdSZXBsOworICAgIH0KKworICAgIGlmICghRGVmcy5jb3VudChSZWcpKSB7CisgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB1c2Ugb2YgUmVnIGluIHRoaXMgTUJCIGFuZCBpdCB3YXNuJ3QgcHJldmlvdXNseQorICAgICAgLy8gZGVmaW5lZCBpbiBNQkIsIGFkZCBpdCB0byBsaXZlaW4uCisgICAgICBNQkItPmFkZExpdmVJbihSZWcpOworICAgICAgRGVmcy5pbnNlcnQoUmVnKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodW5zaWduZWQgU3JjUmVnID0gVElJLT5pc1N0b3JlVG9TdGFja1Nsb3QoTUksIE9sZEZJKSkgeworICAgIGlmIChNSS0+a2lsbHNSZWdpc3RlcihTcmNSZWcpICYmIFByb3BhZ2F0ZUJhY2t3YXJkKE1JLCBNQkIsIFNyY1JlZywgUmVnKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJFbGltaW5hdGVkIHN0b3JlOiAiKTsKKyAgICAgIERFQlVHKE1JLT5kdW1wKCkpOworICAgICAgKytOdW1TdG9yZUVsaW07CisgICAgfSBlbHNlIHsKKyAgICAgIEJ1aWxkTUkoKk1CQiwgTUksIE1JLT5nZXREZWJ1Z0xvYygpLCBUSUktPmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLCBSZWcpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnKTsKKyAgICAgICsrTnVtUmVnUmVwbDsKKyAgICB9CisKKyAgICAvLyBSZW1lbWJlciByZWcgaGFzIGJlZW4gZGVmaW5lZCBpbiBNQkIuCisgICAgRGVmcy5pbnNlcnQoUmVnKTsKKyAgfSBlbHNlIHsKKyAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBOZXdNSXM7CisgICAgYm9vbCBTdWNjZXNzID0gVElJLT51bmZvbGRNZW1vcnlPcGVyYW5kKE1GLCBNSSwgUmVnLCBmYWxzZSwgZmFsc2UsIE5ld01Jcyk7CisgICAgU3VjY2VzcyA9IFN1Y2Nlc3M7IC8vIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZy4KKyAgICBhc3NlcnQoU3VjY2VzcyAmJiAiRmFpbGVkIHRvIHVuZm9sZCEiKTsKKyAgICBNYWNoaW5lSW5zdHIgKk5ld01JID0gTmV3TUlzWzBdOworICAgIE1CQi0+aW5zZXJ0KE1JLCBOZXdNSSk7CisgICAgKytOdW1SZWdSZXBsOworCisgICAgaWYgKE5ld01JLT5yZWFkc1JlZ2lzdGVyKFJlZykpIHsKKyAgICAgIGlmICghRGVmcy5jb3VudChSZWcpKQorICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB1c2Ugb2YgUmVnIGluIHRoaXMgTUJCIGFuZCBpdCB3YXNuJ3QgcHJldmlvdXNseQorICAgICAgICAvLyBkZWZpbmVkIGluIE1CQiwgYWRkIGl0IHRvIGxpdmVpbi4KKyAgICAgICAgTUJCLT5hZGRMaXZlSW4oUmVnKTsKKyAgICAgIERlZnMuaW5zZXJ0KFJlZyk7CisgICAgfQorICB9CisgIE1CQi0+ZXJhc2UoTUkpOworfQorCisvLy8gUmVtb3ZlRGVhZFN0b3JlcyAtIFNjYW4gdGhyb3VnaCBhIGJhc2ljIGJsb2NrIGFuZCBsb29rIGZvciBsb2FkcyBmb2xsb3dlZAorLy8vIGJ5IHN0b3Jlcy4gIElmIHRoZXkncmUgYm90aCB1c2luZyB0aGUgc2FtZSBzdGFjayBzbG90LCB0aGVuIHRoZSBzdG9yZSBpcworLy8vIGRlZmluaXRlbHkgZGVhZC4gIFRoaXMgY291bGQgb2J2aW91c2x5IGJlIG11Y2ggbW9yZSBhZ2dyZXNzaXZlIChjb25zaWRlcgorLy8vIHBhaXJzIHdpdGggaW5zdHJ1Y3Rpb25zIGJldHdlZW4gdGhlbSksIGJ1dCBzdWNoIGV4dGVuc2lvbnMgbWlnaHQgaGF2ZSBhCisvLy8gY29uc2lkZXJhYmxlIGNvbXBpbGUgdGltZSBpbXBhY3QuCitib29sIFN0YWNrU2xvdENvbG9yaW5nOjpSZW1vdmVEZWFkU3RvcmVzKE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIpIHsKKyAgLy8gRklYTUU6IFRoaXMgY291bGQgYmUgbXVjaCBtb3JlIGFnZ3Jlc3NpdmUsIGJ1dCB3ZSBuZWVkIHRvIGludmVzdGlnYXRlCisgIC8vIHRoZSBjb21waWxlIHRpbWUgaW1wYWN0IG9mIGRvaW5nIHNvLgorICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKworICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiB0b0VyYXNlOworCisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkItPmJlZ2luKCksIEUgPSBNQkItPmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKERDRUxpbWl0ICE9IC0xICYmIChpbnQpTnVtRGVhZCA+PSBEQ0VMaW1pdCkKKyAgICAgIGJyZWFrOworICAgIAorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBOZXh0TUkgPSBsbHZtOjpuZXh0KEkpOworICAgIGlmIChOZXh0TUkgPT0gTUJCLT5lbmQoKSkgY29udGludWU7CisgICAgCisgICAgaW50IEZpcnN0U1MsIFNlY29uZFNTOworICAgIHVuc2lnbmVkIExvYWRSZWcgPSAwOworICAgIHVuc2lnbmVkIFN0b3JlUmVnID0gMDsKKyAgICBpZiAoIShMb2FkUmVnID0gVElJLT5pc0xvYWRGcm9tU3RhY2tTbG90KEksIEZpcnN0U1MpKSkgY29udGludWU7CisgICAgaWYgKCEoU3RvcmVSZWcgPSBUSUktPmlzU3RvcmVUb1N0YWNrU2xvdChOZXh0TUksIFNlY29uZFNTKSkpIGNvbnRpbnVlOworICAgIGlmIChGaXJzdFNTICE9IFNlY29uZFNTIHx8IExvYWRSZWcgIT0gU3RvcmVSZWcgfHwgRmlyc3RTUyA9PSAtMSkgY29udGludWU7CisgICAgCisgICAgKytOdW1EZWFkOworICAgIGNoYW5nZWQgPSB0cnVlOworICAgIAorICAgIGlmIChOZXh0TUktPmZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgoTG9hZFJlZywgdHJ1ZSwgMCkgIT0gLTEpIHsKKyAgICAgICsrTnVtRGVhZDsKKyAgICAgIHRvRXJhc2UucHVzaF9iYWNrKEkpOworICAgIH0KKyAgICAKKyAgICB0b0VyYXNlLnB1c2hfYmFjayhOZXh0TUkpOworICAgICsrSTsKKyAgfQorICAKKyAgZm9yIChTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0Pjo6aXRlcmF0b3IgSSA9IHRvRXJhc2UuYmVnaW4oKSwKKyAgICAgICBFID0gdG9FcmFzZS5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgKCpJKS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIAorICByZXR1cm4gY2hhbmdlZDsKK30KKworCitib29sIFN0YWNrU2xvdENvbG9yaW5nOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIERFQlVHKHsKKyAgICAgIGRiZ3MoKSA8PCAiKioqKioqKioqKiBTdGFjayBTbG90IENvbG9yaW5nICoqKioqKioqKipcbiIKKyAgICAgICAgICAgICA8PCAiKioqKioqKioqKiBGdW5jdGlvbjogIiAKKyAgICAgICAgICAgICA8PCBNRi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkgPDwgJ1xuJzsKKyAgICB9KTsKKworICBNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTVJJID0gJk1GLmdldFJlZ0luZm8oKTsgCisgIFRJSSA9IE1GLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworICBUUkkgPSBNRi5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKyAgTFMgPSAmZ2V0QW5hbHlzaXM8TGl2ZVN0YWNrcz4oKTsKKyAgVlJNID0gJmdldEFuYWx5c2lzPFZpcnRSZWdNYXA+KCk7CisgIGxvb3BJbmZvID0gJmdldEFuYWx5c2lzPE1hY2hpbmVMb29wSW5mbz4oKTsKKworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICB1bnNpZ25lZCBOdW1TbG90cyA9IExTLT5nZXROdW1JbnRlcnZhbHMoKTsKKyAgaWYgKE51bVNsb3RzIDwgMikgeworICAgIGlmIChOdW1TbG90cyA9PSAwIHx8ICFWUk0tPkhhc1VudXNlZFJlZ2lzdGVycygpKQorICAgICAgLy8gTm90aGluZyB0byBkbyEKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElmIHRoZXJlIGFyZSBjYWxscyB0byBzZXRqbXAgb3Igc2lnc2V0am1wLCBkb24ndCBwZXJmb3JtIHN0YWNrIHNsb3QKKyAgLy8gY29sb3JpbmcuIFRoZSBzdGFjayBjb3VsZCBiZSBtb2RpZmllZCBiZWZvcmUgdGhlIGxvbmdqbXAgaXMgZXhlY3V0ZWQsCisgIC8vIHJlc3VsdGluZyBpbiB0aGUgd3JvbmcgdmFsdWUgYmVpbmcgdXNlZCBhZnRlcndhcmRzLiAoU2VlCisgIC8vIDxyZGFyOi8vcHJvYmxlbS84MDA3NTAwPi4pCisgIGlmIChNRi5jYWxsc1NldEptcCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBHYXRoZXIgc3BpbGwgc2xvdCByZWZlcmVuY2VzCisgIFNjYW5Gb3JTcGlsbFNsb3RSZWZzKE1GKTsKKyAgSW5pdGlhbGl6ZVNsb3RzKCk7CisgIENoYW5nZWQgPSBDb2xvclNsb3RzKE1GKTsKKworICBOZXh0Q29sb3IgPSAtMTsKKyAgU1NJbnRlcnZhbHMuY2xlYXIoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNTUmVmcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFNTUmVmc1tpXS5jbGVhcigpOworICBTU1JlZnMuY2xlYXIoKTsKKyAgT3JpZ0FsaWdubWVudHMuY2xlYXIoKTsKKyAgT3JpZ1NpemVzLmNsZWFyKCk7CisgIEFsbENvbG9ycy5jbGVhcigpOworICBVc2VkQ29sb3JzLmNsZWFyKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBc3NpZ25tZW50cy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIEFzc2lnbm1lbnRzW2ldLmNsZWFyKCk7CisgIEFzc2lnbm1lbnRzLmNsZWFyKCk7CisKKyAgaWYgKENoYW5nZWQpIHsKKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBDaGFuZ2VkIHw9IFJlbW92ZURlYWRTdG9yZXMoSSk7CisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1N0cm9uZ1BISUVsaW1pbmF0aW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1N0cm9uZ1BISUVsaW1pbmF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTJkNDE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vU3Ryb25nUEhJRWxpbWluYXRpb24uY3BwCkBAIC0wLDAgKzEsMTA0NiBAQAorLy89PT0tIFN0cm9uZ1BoaUVsaW1pbmF0aW9uLmNwcCAtIEVsaW1pbmF0ZSBQSEkgbm9kZXMgYnkgaW5zZXJ0aW5nIGNvcGllcyAtPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgZWxpbWluYXRlcyBtYWNoaW5lIGluc3RydWN0aW9uIFBISSBub2RlcyBieSBpbnNlcnRpbmcgY29weQorLy8gaW5zdHJ1Y3Rpb25zLCB1c2luZyBhbiBpbnRlbGxpZ2VudCBjb3B5LWZvbGRpbmcgdGVjaG5pcXVlIGJhc2VkIG9uCisvLyBkb21pbmF0b3IgaW5mb3JtYXRpb24uICBUaGlzIGlzIHRlY2huaXF1ZSBpcyBkZXJpdmVkIGZyb206CisvLyAKKy8vICAgIEJ1ZGltbGljLCBldCBhbC4gRmFzdCBjb3B5IGNvYWxlc2NpbmcgYW5kIGxpdmUtcmFuZ2UgaWRlbnRpZmljYXRpb24uCisvLyAgICBJbiBQcm9jZWVkaW5ncyBvZiB0aGUgQUNNIFNJR1BMQU4gMjAwMiBDb25mZXJlbmNlIG9uIFByb2dyYW1taW5nIExhbmd1YWdlCisvLyAgICBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIChCZXJsaW4sIEdlcm1hbnksIEp1bmUgMTcgLSAxOSwgMjAwMikuCisvLyAgICBQTERJICcwMi4gQUNNLCBOZXcgWW9yaywgTlksIDI1LTMyLgorLy8gICAgRE9JPSBodHRwOi8vZG9pLmFjbS5vcmcvMTAuMTE0NS81MTI1MjkuNTEyNTM0CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzdHJvbmdwaGllbGltIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlckNvYWxlc2Nlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgU3Ryb25nUEhJRWxpbWluYXRpb24gOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBTdHJvbmdQSElFbGltaW5hdGlvbigpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIC8vIFdhaXRpbmcgc3RvcmVzLCBmb3IgZWFjaCBNQkIsIHRoZSBzZXQgb2YgY29waWVzIHRoYXQgbmVlZCB0bworICAgIC8vIGJlIGluc2VydGVkIGludG8gdGhhdCBNQkIKKyAgICBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosCisgICAgICAgICAgICAgc3RkOjptdWx0aW1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+ID4gV2FpdGluZzsKKyAgICAKKyAgICAvLyBTdGFja3MgaG9sZHMgdGhlIHJlbmFtaW5nIHN0YWNrIGZvciBlYWNoIHJlZ2lzdGVyCisgICAgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiA+IFN0YWNrczsKKyAgICAKKyAgICAvLyBSZWdpc3RlcnMgaW4gVXNlZEJ5QW5vdGhlciBhcmUgUEhJIG5vZGVzIHRoYXQgYXJlIHRoZW1zZWx2ZXMKKyAgICAvLyB1c2VkIGFzIG9wZXJhbmRzIHRvIGFub3RoZXIgUEhJIG5vZGUKKyAgICBzdGQ6OnNldDx1bnNpZ25lZD4gVXNlZEJ5QW5vdGhlcjsKKyAgICAKKyAgICAvLyBSZW5hbWVTZXRzIGFyZSB0aGUgaXMgYSBtYXAgZnJvbSBhIFBISS1kZWZpbmVkIHJlZ2lzdGVyCisgICAgLy8gdG8gdGhlIGlucHV0IHJlZ2lzdGVycyB0byBiZSBjb2FsZXNjZWQgYWxvbmcgd2l0aCB0aGUgCisgICAgLy8gcHJlZGVjZXNzb3IgYmxvY2sgZm9yIHRob3NlIGlucHV0IHJlZ2lzdGVycy4KKyAgICBzdGQ6Om1hcDx1bnNpZ25lZCwgc3RkOjptYXA8dW5zaWduZWQsIE1hY2hpbmVCYXNpY0Jsb2NrKj4gPiBSZW5hbWVTZXRzOworICAgIAorICAgIC8vIFBoaVZhbHVlTnVtYmVyIGhvbGRzIHRoZSBJRCBudW1iZXJzIG9mIHRoZSBWTnMgZm9yIGVhY2ggcGhpIHRoYXQgd2UncmUKKyAgICAvLyBlbGltaW5hdGluZywgaW5kZXhlZCBieSB0aGUgcmVnaXN0ZXIgZGVmaW5lZCBieSB0aGF0IHBoaS4KKyAgICBzdGQ6Om1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+IFBoaVZhbHVlTnVtYmVyOworCisgICAgLy8gU3RvcmUgdGhlIERGUy1pbiBudW1iZXIgb2YgZWFjaCBibG9jaworICAgIERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+IHByZW9yZGVyOworICAgIAorICAgIC8vIFN0b3JlIHRoZSBERlMtb3V0IG51bWJlciBvZiBlYWNoIGJsb2NrCisgICAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCB1bnNpZ25lZD4gbWF4cHJlb3JkZXI7CisKKyAgICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRm4pOworICAgIAorICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVEb21pbmF0b3JUcmVlPigpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8U2xvdEluZGV4ZXM+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8U2xvdEluZGV4ZXM+KCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxMaXZlSW50ZXJ2YWxzPigpOworICAgICAgCisgICAgICAvLyBUT0RPOiBBY3R1YWxseSBtYWtlIHRoaXMgdHJ1ZS4KKyAgICAgIEFVLmFkZFByZXNlcnZlZDxMaXZlSW50ZXJ2YWxzPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPFJlZ2lzdGVyQ29hbGVzY2VyPigpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorICAgIAorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlTWVtb3J5KCkgeworICAgICAgcHJlb3JkZXIuY2xlYXIoKTsKKyAgICAgIG1heHByZW9yZGVyLmNsZWFyKCk7CisgICAgICAKKyAgICAgIFdhaXRpbmcuY2xlYXIoKTsKKyAgICAgIFN0YWNrcy5jbGVhcigpOworICAgICAgVXNlZEJ5QW5vdGhlci5jbGVhcigpOworICAgICAgUmVuYW1lU2V0cy5jbGVhcigpOworICAgIH0KKworICBwcml2YXRlOgorICAgIAorICAgIC8vLyBEb21Gb3Jlc3ROb2RlIC0gUmVwcmVzZW50cyBhIG5vZGUgaW4gdGhlICJkb21pbmF0b3IgZm9yZXN0Ii4gIFRoaXMgaXMKKyAgICAvLy8gYSBmb3Jlc3QgaW4gd2hpY2ggdGhlIG5vZGVzIHJlcHJlc2VudCByZWdpc3RlcnMgYW5kIHRoZSBlZGdlcworICAgIC8vLyByZXByZXNlbnQgYSBkb21pbmFuY2UgcmVsYXRpb24gaW4gdGhlIGJsb2NrIGRlZmluaW5nIHRob3NlIHJlZ2lzdGVycy4KKyAgICBzdHJ1Y3QgRG9tRm9yZXN0Tm9kZSB7CisgICAgcHJpdmF0ZToKKyAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZXMgdG8gb3VyIGNoaWxkcmVuCisgICAgICBzdGQ6OnZlY3RvcjxEb21Gb3Jlc3ROb2RlKj4gY2hpbGRyZW47CisgICAgICAvLyBUaGUgcmVnaXN0ZXIgd2UgcmVwcmVzZW50CisgICAgICB1bnNpZ25lZCByZWc7CisgICAgICAKKyAgICAgIC8vIEFkZCBhbm90aGVyIG5vZGUgYXMgb3VyIGNoaWxkCisgICAgICB2b2lkIGFkZENoaWxkKERvbUZvcmVzdE5vZGUqIERGTikgeyBjaGlsZHJlbi5wdXNoX2JhY2soREZOKTsgfQorICAgICAgCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxEb21Gb3Jlc3ROb2RlKj46Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgCisgICAgICAvLyBDcmVhdGUgYSBEb21Gb3Jlc3ROb2RlIGJ5IHByb3ZpZGluZyB0aGUgcmVnaXN0ZXIgaXQgcmVwcmVzZW50cywgYW5kCisgICAgICAvLyB0aGUgbm9kZSB0byBiZSBpdHMgcGFyZW50LiAgVGhlIHZpcnR1YWwgcm9vdCBub2RlIGhhcyByZWdpc3RlciAwCisgICAgICAvLyBhbmQgYSBudWxsIHBhcmVudC4KKyAgICAgIERvbUZvcmVzdE5vZGUodW5zaWduZWQgciwgRG9tRm9yZXN0Tm9kZSogcGFyZW50KSA6IHJlZyhyKSB7CisgICAgICAgIGlmIChwYXJlbnQpCisgICAgICAgICAgcGFyZW50LT5hZGRDaGlsZCh0aGlzKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgfkRvbUZvcmVzdE5vZGUoKSB7CisgICAgICAgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgICAgZGVsZXRlICpJOworICAgICAgfQorICAgICAgCisgICAgICAvLy8gZ2V0UmVnIC0gUmV0dXJuIHRoZSByZWdpc2VyIHRoYXQgdGhpcyBub2RlIHJlcHJlc2VudHMKKyAgICAgIGlubGluZSB1bnNpZ25lZCBnZXRSZWcoKSB7IHJldHVybiByZWc7IH0KKyAgICAgIAorICAgICAgLy8gUHJvdmlkZSBpdGVyYXRvciBhY2Nlc3MgdG8gb3VyIGNoaWxkcmVuCisgICAgICBpbmxpbmUgRG9tRm9yZXN0Tm9kZTo6aXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBjaGlsZHJlbi5iZWdpbigpOyB9CisgICAgICBpbmxpbmUgRG9tRm9yZXN0Tm9kZTo6aXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gY2hpbGRyZW4uZW5kKCk7IH0KKyAgICB9OworICAgIAorICAgIHZvaWQgY29tcHV0ZURGUyhNYWNoaW5lRnVuY3Rpb24mIE1GKTsKKyAgICB2b2lkIHByb2Nlc3NCbG9jayhNYWNoaW5lQmFzaWNCbG9jayogTUJCKTsKKyAgICAKKyAgICBzdGQ6OnZlY3RvcjxEb21Gb3Jlc3ROb2RlKj4gY29tcHV0ZURvbUZvcmVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBNYWNoaW5lQmFzaWNCbG9jayo+JiBpbnN0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyYgTVJJKTsKKyAgICB2b2lkIHByb2Nlc3NQSElVbmlvbihNYWNoaW5lSW5zdHIqIEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dW5zaWduZWQsIE1hY2hpbmVCYXNpY0Jsb2NrKj4mIFBISVVuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cm9uZ1BISUVsaW1pbmF0aW9uOjpEb21Gb3Jlc3ROb2RlKj4mIERGLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+ID4mIGxvY2Fscyk7CisgICAgdm9pZCBTY2hlZHVsZUNvcGllcyhNYWNoaW5lQmFzaWNCbG9jayogTUJCLCBzdGQ6OnNldDx1bnNpZ25lZD4mIHB1c2hlZCk7CisgICAgdm9pZCBJbnNlcnRDb3BpZXMoTWFjaGluZURvbVRyZWVOb2RlKiBNQkIsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLCAxNj4mIHYpOworICAgIGJvb2wgbWVyZ2VMaXZlSW50ZXJ2YWxzKHVuc2lnbmVkIHByaW1hcnksIHVuc2lnbmVkIHNlY29uZGFyeSk7CisgIH07Cit9CisKK2NoYXIgU3Ryb25nUEhJRWxpbWluYXRpb246OklEID0gMDsKK3N0YXRpYyBSZWdpc3RlclBhc3M8U3Ryb25nUEhJRWxpbWluYXRpb24+CitYKCJzdHJvbmctcGhpLW5vZGUtZWxpbWluYXRpb24iLAorICAiRWxpbWluYXRlIFBISSBub2RlcyBmb3IgcmVnaXN0ZXIgYWxsb2NhdGlvbiwgaW50ZWxsaWdlbnRseSIpOworCitjaGFyICZsbHZtOjpTdHJvbmdQSElFbGltaW5hdGlvbklEID0gU3Ryb25nUEhJRWxpbWluYXRpb246OklEOworCisvLy8gY29tcHV0ZURGUyAtIENvbXB1dGVzIHRoZSBERlMtaW4gYW5kIERGUy1vdXQgbnVtYmVycyBvZiB0aGUgZG9taW5hdG9yIHRyZWUKKy8vLyBvZiB0aGUgZ2l2ZW4gTWFjaGluZUZ1bmN0aW9uLiAgVGhlc2UgbnVtYmVycyBhcmUgdGhlbiB1c2VkIGluIG90aGVyIHBhcnRzCisvLy8gb2YgdGhlIFBISSBlbGltaW5hdGlvbiBwcm9jZXNzLgordm9pZCBTdHJvbmdQSElFbGltaW5hdGlvbjo6Y29tcHV0ZURGUyhNYWNoaW5lRnVuY3Rpb24mIE1GKSB7CisgIFNtYWxsUHRyU2V0PE1hY2hpbmVEb21UcmVlTm9kZSosIDg+IGZyb250aWVyOworICBTbWFsbFB0clNldDxNYWNoaW5lRG9tVHJlZU5vZGUqLCA4PiB2aXNpdGVkOworICAKKyAgdW5zaWduZWQgdGltZSA9IDA7CisgIAorICBNYWNoaW5lRG9taW5hdG9yVHJlZSYgRFQgPSBnZXRBbmFseXNpczxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgCisgIE1hY2hpbmVEb21UcmVlTm9kZSogbm9kZSA9IERULmdldFJvb3ROb2RlKCk7CisgIAorICBzdGQ6OnZlY3RvcjxNYWNoaW5lRG9tVHJlZU5vZGUqPiB3b3JrbGlzdDsKKyAgd29ya2xpc3QucHVzaF9iYWNrKG5vZGUpOworICAKKyAgd2hpbGUgKCF3b3JrbGlzdC5lbXB0eSgpKSB7CisgICAgTWFjaGluZURvbVRyZWVOb2RlKiBjdXJyTm9kZSA9IHdvcmtsaXN0LmJhY2soKTsKKyAgICAKKyAgICBpZiAoIWZyb250aWVyLmNvdW50KGN1cnJOb2RlKSkgeworICAgICAgZnJvbnRpZXIuaW5zZXJ0KGN1cnJOb2RlKTsKKyAgICAgICsrdGltZTsKKyAgICAgIHByZW9yZGVyLmluc2VydChzdGQ6Om1ha2VfcGFpcihjdXJyTm9kZS0+Z2V0QmxvY2soKSwgdGltZSkpOworICAgIH0KKyAgICAKKyAgICBib29sIGluc2VydGVkID0gZmFsc2U7CisgICAgZm9yIChNYWNoaW5lRG9tVHJlZU5vZGU6Oml0ZXJhdG9yIEkgPSBjdXJyTm9kZS0+YmVnaW4oKSwgRSA9IGN1cnJOb2RlLT5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgaWYgKCFmcm9udGllci5jb3VudCgqSSkgJiYgIXZpc2l0ZWQuY291bnQoKkkpKSB7CisgICAgICAgIHdvcmtsaXN0LnB1c2hfYmFjaygqSSk7CisgICAgICAgIGluc2VydGVkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgCisgICAgaWYgKCFpbnNlcnRlZCkgeworICAgICAgZnJvbnRpZXIuZXJhc2UoY3Vyck5vZGUpOworICAgICAgdmlzaXRlZC5pbnNlcnQoY3Vyck5vZGUpOworICAgICAgbWF4cHJlb3JkZXIuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGN1cnJOb2RlLT5nZXRCbG9jaygpLCB0aW1lKSk7CisgICAgICAKKyAgICAgIHdvcmtsaXN0LnBvcF9iYWNrKCk7CisgICAgfQorICB9Cit9CisKK25hbWVzcGFjZSB7CisKKy8vLyBQcmVvcmRlclNvcnRlciAtIGEgaGVscGVyIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBzb3J0IHJlZ2lzdGVycworLy8vIGFjY29yZGluZyB0byB0aGUgcHJlb3JkZXIgbnVtYmVyIG9mIHRoZWlyIGRlZmluaW5nIGJsb2NrcworY2xhc3MgUHJlb3JkZXJTb3J0ZXIgeworcHJpdmF0ZToKKyAgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCB1bnNpZ25lZD4mIHByZW9yZGVyOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvJiBNUkk7CisgIAorcHVibGljOgorICBQcmVvcmRlclNvcnRlcihEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIHVuc2lnbmVkPiYgcCwKKyAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvJiBNKSA6IHByZW9yZGVyKHApLCBNUkkoTSkgeyB9CisgIAorICBib29sIG9wZXJhdG9yKCkodW5zaWduZWQgQSwgdW5zaWduZWQgQikgeworICAgIGlmIChBID09IEIpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgTWFjaGluZUJhc2ljQmxvY2sqIEFCbG9jayA9IE1SSS5nZXRWUmVnRGVmKEEpLT5nZXRQYXJlbnQoKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogQkJsb2NrID0gTVJJLmdldFZSZWdEZWYoQiktPmdldFBhcmVudCgpOworICAgIAorICAgIGlmIChwcmVvcmRlcltBQmxvY2tdIDwgcHJlb3JkZXJbQkJsb2NrXSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UgaWYgKHByZW9yZGVyW0FCbG9ja10gPiBwcmVvcmRlcltCQmxvY2tdKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworfQorCisvLy8gY29tcHV0ZURvbUZvcmVzdCAtIGNvbXB1dGUgdGhlIHN1YmZvcmVzdCBvZiB0aGUgRG9tVHJlZSBjb3JyZXNwb25kaW5nCisvLy8gdG8gdGhlIGRlZmluaW5nIGJsb2NrcyBvZiB0aGUgcmVnaXN0ZXJzIGluIHF1ZXN0aW9uCitzdGQ6OnZlY3RvcjxTdHJvbmdQSElFbGltaW5hdGlvbjo6RG9tRm9yZXN0Tm9kZSo+CitTdHJvbmdQSElFbGltaW5hdGlvbjo6Y29tcHV0ZURvbUZvcmVzdCgKKyAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBNYWNoaW5lQmFzaWNCbG9jayo+JiByZWdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVSZWdpc3RlckluZm8mIE1SSSkgeworICAvLyBCZWdpbiBieSBjcmVhdGluZyBhIHZpcnR1YWwgcm9vdCBub2RlLCBzaW5jZSB0aGUgYWN0dWFsIHJlc3VsdHMKKyAgLy8gbWF5IHdlbGwgYmUgYSBmb3Jlc3QuICBBc3N1bWUgdGhpcyBub2RlIGhhcyBtYXhpbXVtIERGUy1vdXQgbnVtYmVyLgorICBEb21Gb3Jlc3ROb2RlKiBWaXJ0dWFsUm9vdCA9IG5ldyBEb21Gb3Jlc3ROb2RlKDAsIDApOworICBtYXhwcmVvcmRlci5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKE1hY2hpbmVCYXNpY0Jsb2NrKikwLCB+MFVMKSk7CisgIAorICAvLyBQb3B1bGF0ZSBhIHdvcmtsaXN0IHdpdGggdGhlIHJlZ2lzdGVycworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gd29ya2xpc3Q7CisgIHdvcmtsaXN0LnJlc2VydmUocmVncy5zaXplKCkpOworICBmb3IgKHN0ZDo6bWFwPHVuc2lnbmVkLCBNYWNoaW5lQmFzaWNCbG9jayo+OjppdGVyYXRvciBJID0gcmVncy5iZWdpbigpLAorICAgICAgIEUgPSByZWdzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICB3b3JrbGlzdC5wdXNoX2JhY2soSS0+Zmlyc3QpOworICAKKyAgLy8gU29ydCB0aGUgcmVnaXN0ZXJzIGJ5IHRoZSBERlMtaW4gbnVtYmVyIG9mIHRoZWlyIGRlZmluaW5nIGJsb2NrCisgIFByZW9yZGVyU29ydGVyIFBTKHByZW9yZGVyLCBNUkkpOworICBzdGQ6OnNvcnQod29ya2xpc3QuYmVnaW4oKSwgd29ya2xpc3QuZW5kKCksIFBTKTsKKyAgCisgIC8vIENyZWF0ZSBhICJjdXJyZW50IHBhcmVudCIgc3RhY2ssIGFuZCBwdXQgdGhlIHZpcnR1YWwgcm9vdCBvbiB0b3Agb2YgaXQKKyAgRG9tRm9yZXN0Tm9kZSogQ3VycmVudFBhcmVudCA9IFZpcnR1YWxSb290OworICBzdGQ6OnZlY3RvcjxEb21Gb3Jlc3ROb2RlKj4gc3RhY2s7CisgIHN0YWNrLnB1c2hfYmFjayhWaXJ0dWFsUm9vdCk7CisgIAorICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcnMgaW4gdGhlIHByZXZpb3VzbHkgY29tcHV0ZWQgb3JkZXIKKyAgZm9yIChzdGQ6OnZlY3Rvcjx1bnNpZ25lZD46Oml0ZXJhdG9yIEkgPSB3b3JrbGlzdC5iZWdpbigpLCBFID0gd29ya2xpc3QuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICB1bnNpZ25lZCBwcmUgPSBwcmVvcmRlcltNUkkuZ2V0VlJlZ0RlZigqSSktPmdldFBhcmVudCgpXTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogcGFyZW50QmxvY2sgPSBDdXJyZW50UGFyZW50LT5nZXRSZWcoKSA/CisgICAgICAgICAgICAgICAgIE1SSS5nZXRWUmVnRGVmKEN1cnJlbnRQYXJlbnQtPmdldFJlZygpKS0+Z2V0UGFyZW50KCkgOgorICAgICAgICAgICAgICAgICAwOworICAgIAorICAgIC8vIElmIHRoZSBERlMtaW4gbnVtYmVyIG9mIHRoZSByZWdpc3RlciBpcyBncmVhdGVyIHRoYW4gdGhlIERGUy1vdXQgbnVtYmVyCisgICAgLy8gb2YgdGhlIGN1cnJlbnQgcGFyZW50LCByZXBlYXRlZGx5IHBvcCB0aGUgcGFyZW50IHN0YWNrIHVudGlsIGl0IGlzbid0LgorICAgIHdoaWxlIChwcmUgPiBtYXhwcmVvcmRlcltwYXJlbnRCbG9ja10pIHsKKyAgICAgIHN0YWNrLnBvcF9iYWNrKCk7CisgICAgICBDdXJyZW50UGFyZW50ID0gc3RhY2suYmFjaygpOworICAgICAgCisgICAgICBwYXJlbnRCbG9jayA9IEN1cnJlbnRQYXJlbnQtPmdldFJlZygpID8KKyAgICAgICAgICAgICAgICAgICBNUkkuZ2V0VlJlZ0RlZihDdXJyZW50UGFyZW50LT5nZXRSZWcoKSktPmdldFBhcmVudCgpIDoKKyAgICAgICAgICAgICAgICAgICAwOworICAgIH0KKyAgICAKKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBmb3VuZCB0aGUgYXBwcm9wcmlhdGUgcGFyZW50LCBjcmVhdGUgYSBEb21Gb3Jlc3ROb2RlIGZvcgorICAgIC8vIHRoaXMgcmVnaXN0ZXIgYW5kIGF0dGFjaCBpdCB0byB0aGUgZm9yZXN0CisgICAgRG9tRm9yZXN0Tm9kZSogY2hpbGQgPSBuZXcgRG9tRm9yZXN0Tm9kZSgqSSwgQ3VycmVudFBhcmVudCk7CisgICAgCisgICAgLy8gUHVzaCB0aGlzIG5ldyBub2RlIG9uIHRoZSAiY3VycmVudCBwYXJlbnQiIHN0YWNrCisgICAgc3RhY2sucHVzaF9iYWNrKGNoaWxkKTsKKyAgICBDdXJyZW50UGFyZW50ID0gY2hpbGQ7CisgIH0KKyAgCisgIC8vIFJldHVybiBhIHZlY3RvciBjb250YWluaW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgdmlydHVhbCByb290IG5vZGUKKyAgc3RkOjp2ZWN0b3I8RG9tRm9yZXN0Tm9kZSo+IHJldDsKKyAgcmV0Lmluc2VydChyZXQuZW5kKCksIFZpcnR1YWxSb290LT5iZWdpbigpLCBWaXJ0dWFsUm9vdC0+ZW5kKCkpOworICByZXR1cm4gcmV0OworfQorCisvLy8gaXNMaXZlSW4gLSBoZWxwZXIgbWV0aG9kIHRoYXQgZGV0ZXJtaW5lcywgZnJvbSBhIHJlZ25vLCBpZiBhIHJlZ2lzdGVyCisvLy8gaXMgbGl2ZSBpbnRvIGEgYmxvY2sKK3N0YXRpYyBib29sIGlzTGl2ZUluKHVuc2lnbmVkIHIsIE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIsCisgICAgICAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWxzJiBMSSkgeworICBMaXZlSW50ZXJ2YWwmIEkgPSBMSS5nZXRPckNyZWF0ZUludGVydmFsKHIpOworICBTbG90SW5kZXggaWR4ID0gTEkuZ2V0TUJCU3RhcnRJZHgoTUJCKTsKKyAgcmV0dXJuIEkubGl2ZUF0KGlkeCk7Cit9CisKKy8vLyBpc0xpdmVPdXQgLSBoZWxwIG1ldGhvZCB0aGF0IGRldGVybWluZXMsIGZyb20gYSByZWdubywgaWYgYSByZWdpc3RlciBpcworLy8vIGxpdmUgb3V0IG9mIGEgYmxvY2suCitzdGF0aWMgYm9vbCBpc0xpdmVPdXQodW5zaWduZWQgciwgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiwKKyAgICAgICAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWxzJiBMSSkgeworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpzdWNjX2l0ZXJhdG9yIFBJID0gTUJCLT5zdWNjX2JlZ2luKCksCisgICAgICAgRSA9IE1CQi0+c3VjY19lbmQoKTsgUEkgIT0gRTsgKytQSSkKKyAgICBpZiAoaXNMaXZlSW4ociwgKlBJLCBMSSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGludGVyZmVyZXMgLSBjaGVja3MgZm9yIGxvY2FsIGludGVyZmVyZW5jZXMgYnkgc2Nhbm5pbmcgYSBibG9jay4gIFRoZSBvbmx5CisvLy8gdHJpY2sgcGFyYW1ldGVyIGlzICdtb2RlJyB3aGljaCB0ZWxscyBpdCB0aGUgcmVsYXRpb25zaGlwIG9mIHRoZSB0d28KKy8vLyByZWdpc3RlcnMuIDAgLSBkZWZpbmVkIGluIHRoZSBzYW1lIGJsb2NrLCAxIC0gZmlyc3QgcHJvcGVybHkgZG9taW5hdGVzCisvLy8gc2Vjb25kLCAyIC0gc2Vjb25kIHByb3Blcmx5IGRvbWluYXRlcyBmaXJzdCAKK3N0YXRpYyBib29sIGludGVyZmVyZXModW5zaWduZWQgYSwgdW5zaWduZWQgYiwgTWFjaGluZUJhc2ljQmxvY2sqIHNjYW4sCisgICAgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlcnZhbHMmIExWLCB1bnNpZ25lZCBtb2RlKSB7CisgIE1hY2hpbmVJbnN0ciogZGVmID0gMDsKKyAgTWFjaGluZUluc3RyKiBraWxsID0gMDsKKyAgCisgIC8vIFRoZSBjb2RlIGlzIHN0aWxsIGluIFNTQSBmb3JtIGF0IHRoaXMgcG9pbnQsIHNvIHRoZXJlIGlzIG9ubHkgb25lCisgIC8vIGRlZmluaXRpb24gcGVyIFZSZWcuICBUaHVzIHdlIGNhbiBzYWZlbHkgdXNlIE1SSS0+Z2V0VlJlZ0RlZigpLgorICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvKiBNUkkgPSAmc2Nhbi0+Z2V0UGFyZW50KCktPmdldFJlZ0luZm8oKTsKKyAgCisgIGJvb2wgaW50ZXJmZXJlbmNlID0gZmFsc2U7CisgIAorICAvLyBXYWxsayB0aGUgYmxvY2ssIGNoZWNraW5nIGZvciBpbnRlcmZlcmVuY2VzCisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CSSA9IHNjYW4tPmJlZ2luKCksIE1CRSA9IHNjYW4tPmVuZCgpOworICAgICAgIE1CSSAhPSBNQkU7ICsrTUJJKSB7CisgICAgTWFjaGluZUluc3RyKiBjdXJyID0gTUJJOworICAgIAorICAgIC8vIFNhbWUgZGVmaW5pbmcgYmxvY2suLi4KKyAgICBpZiAobW9kZSA9PSAwKSB7CisgICAgICBpZiAoY3VyciA9PSBNUkktPmdldFZSZWdEZWYoYSkpIHsKKyAgICAgICAgLy8gSWYgd2UgZmluZCBvdXIgZmlyc3QgZGVmaW5pdGlvbiwgc2F2ZSBpdAorICAgICAgICBpZiAoIWRlZikgeworICAgICAgICAgIGRlZiA9IGN1cnI7CisgICAgICAgIC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhbiB1bmtpbGxlZCBkZWZpbml0aW9uLCB0aGVuIAorICAgICAgICAvLyB0aGlzIGlzIGFuIGludGVyZmVyZW5jZQorICAgICAgICB9IGVsc2UgaWYgKCFraWxsKSB7CisgICAgICAgICAgaW50ZXJmZXJlbmNlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gSWYgdGhlcmUncyBhIGRlZmluaXRpb24gZm9sbG93ZWQgYnkgYSBLaWxsSW5zdCwgdGhlbgorICAgICAgICAvLyB0aGV5IGNhbid0IGludGVyZmVyZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludGVyZmVyZW5jZSA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAvLyBTeW1tZXRyaWMgd2l0aCB0aGUgYWJvdmUKKyAgICAgIH0gZWxzZSBpZiAoY3VyciA9PSBNUkktPmdldFZSZWdEZWYoYikpIHsKKyAgICAgICAgaWYgKCFkZWYpIHsKKyAgICAgICAgICBkZWYgPSBjdXJyOworICAgICAgICB9IGVsc2UgaWYgKCFraWxsKSB7CisgICAgICAgICAgaW50ZXJmZXJlbmNlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnRlcmZlcmVuY2UgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgLy8gU3RvcmUgS2lsbEluc3RzIGlmIHRoZXkgbWF0Y2ggdXAgd2l0aCB0aGUgZGVmaW5pdGlvbgorICAgICAgfSBlbHNlIGlmIChjdXJyLT5raWxsc1JlZ2lzdGVyKGEpKSB7CisgICAgICAgIGlmIChkZWYgPT0gTVJJLT5nZXRWUmVnRGVmKGEpKSB7CisgICAgICAgICAga2lsbCA9IGN1cnI7CisgICAgICAgIH0gZWxzZSBpZiAoY3Vyci0+a2lsbHNSZWdpc3RlcihiKSkgeworICAgICAgICAgIGlmIChkZWYgPT0gTVJJLT5nZXRWUmVnRGVmKGIpKSB7CisgICAgICAgICAgICBraWxsID0gY3VycjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAvLyBGaXJzdCBwcm9wZXJseSBkb21pbmF0ZXMgc2Vjb25kLi4uCisgICAgfSBlbHNlIGlmIChtb2RlID09IDEpIHsKKyAgICAgIGlmIChjdXJyID09IE1SSS0+Z2V0VlJlZ0RlZihiKSkgeworICAgICAgICAvLyBEZWZpbml0aW9uIG9mIHNlY29uZCB3aXRob3V0IGtpbGwgb2YgZmlyc3QgaXMgYW4gaW50ZXJmZXJlbmNlCisgICAgICAgIGlmICgha2lsbCkgeworICAgICAgICAgIGludGVyZmVyZW5jZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIERlZmluaXRpb24gYWZ0ZXIgYSBraWxsIGlzIGEgbm9uLWludGVyZmVyZW5jZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludGVyZmVyZW5jZSA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAvLyBTYXZlIEtpbGxJbnN0cyBvZiBGaXJzdAorICAgICAgfSBlbHNlIGlmIChjdXJyLT5raWxsc1JlZ2lzdGVyKGEpKSB7CisgICAgICAgIGtpbGwgPSBjdXJyOworICAgICAgfQorICAgIC8vIFN5bW1ldHJpYyB3aXRoIHRoZSBhYm92ZQorICAgIH0gZWxzZSBpZiAobW9kZSA9PSAyKSB7CisgICAgICBpZiAoY3VyciA9PSBNUkktPmdldFZSZWdEZWYoYSkpIHsKKyAgICAgICAgaWYgKCFraWxsKSB7CisgICAgICAgICAgaW50ZXJmZXJlbmNlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnRlcmZlcmVuY2UgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjdXJyLT5raWxsc1JlZ2lzdGVyKGIpKSB7CisgICAgICAgIGtpbGwgPSBjdXJyOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIGludGVyZmVyZW5jZTsKK30KKworLy8vIHByb2Nlc3NCbG9jayAtIERldGVybWluZSBob3cgdG8gYnJlYWsgdXAgUEhJcyBpbiB0aGUgY3VycmVudCBibG9jay4gIEVhY2gKKy8vLyBQSEkgaXMgYnJva2VuIHVwIGJ5IHNvbWUgY29tYmluYXRpb24gb2YgcmVuYW1pbmcgaXRzIG9wZXJhbmRzIGFuZCBpbnNlcnRpbmcKKy8vLyBjb3BpZXMuICBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggb3BlcmFuZHMgcmVjZWl2ZQorLy8vIHdoaWNoIHRyZWF0bWVudC4KK3ZvaWQgU3Ryb25nUEhJRWxpbWluYXRpb246OnByb2Nlc3NCbG9jayhNYWNoaW5lQmFzaWNCbG9jayogTUJCKSB7CisgIExpdmVJbnRlcnZhbHMmIExJID0gZ2V0QW5hbHlzaXM8TGl2ZUludGVydmFscz4oKTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyYgTVJJID0gTUJCLT5nZXRQYXJlbnQoKS0+Z2V0UmVnSW5mbygpOworICAKKyAgLy8gSG9sZHMgbmFtZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gYSBzZXQgaW4gYW55IFBISSB3aXRoaW4gdGhpcyBibG9jaworICAvLyBiZWZvcmUgdGhlIGN1cnJlbnQgb25lLgorICBzdGQ6OnNldDx1bnNpZ25lZD4gUHJvY2Vzc2VkTmFtZXM7CisgIAorICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBQSEkgbm9kZXMgaW4gdGhpcyBibG9jaworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUCA9IE1CQi0+YmVnaW4oKTsKKyAgd2hpbGUgKFAgIT0gTUJCLT5lbmQoKSAmJiBQLT5pc1BISSgpKSB7CisgICAgdW5zaWduZWQgRGVzdFJlZyA9IFAtPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgCisgICAgLy8gRG9uJ3QgYm90aCBkb2luZyBQSEkgZWxpbWluYXRpb24gZm9yIGRlYWQgUEhJJ3MuCisgICAgaWYgKFAtPnJlZ2lzdGVyRGVmSXNEZWFkKERlc3RSZWcpKSB7CisgICAgICArK1A7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBMaXZlSW50ZXJ2YWwmIFBJID0gTEkuZ2V0T3JDcmVhdGVJbnRlcnZhbChEZXN0UmVnKTsKKyAgICBTbG90SW5kZXggcElkeCA9IExJLmdldEluc3RydWN0aW9uSW5kZXgoUCkuZ2V0RGVmSW5kZXgoKTsKKyAgICBWTkluZm8qIFBWTiA9IFBJLmdldExpdmVSYW5nZUNvbnRhaW5pbmcocElkeCktPnZhbG5vOworICAgIFBoaVZhbHVlTnVtYmVyLmluc2VydChzdGQ6Om1ha2VfcGFpcihEZXN0UmVnLCBQVk4tPmlkKSk7CisKKyAgICAvLyBQSElVbmlvbiBpcyB0aGUgc2V0IG9mIGluY29taW5nIHJlZ2lzdGVycyB0byB0aGUgUEhJIG5vZGUgdGhhdAorICAgIC8vIGFyZSBnb2luZyB0byBiZSByZW5hbWVzIHJhdGhlciB0aGFuIGhhdmluZyBjb3BpZXMgaW5zZXJ0ZWQuICBUaGlzIHNldAorICAgIC8vIGlzIHJlZmluZGVkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGlzIGZ1bmN0aW9uLiAgVW5pb25lZEJsb2NrcyBpcyB0aGUgc2V0CisgICAgLy8gb2YgY29ycmVzcG9uZGluZyBNQkJzLgorICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBNYWNoaW5lQmFzaWNCbG9jayo+IFBISVVuaW9uOworICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwgOD4gVW5pb25lZEJsb2NrczsKKyAgCisgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBvcGVyYW5kcyBvZiB0aGUgUEhJIG5vZGUKKyAgICBmb3IgKGludCBpID0gUC0+Z2V0TnVtT3BlcmFuZHMoKSAtIDE7IGkgPj0gMjsgaS09MikgeworICAgICAgdW5zaWduZWQgU3JjUmVnID0gUC0+Z2V0T3BlcmFuZChpLTEpLmdldFJlZygpOworICAgICAgCisgICAgICAvLyBEb24ndCBuZWVkIHRvIHRyeSB0byBjb2FsZXNjZSBhIHJlZ2lzdGVyIHdpdGggaXRzZWxmLgorICAgICAgaWYgKFNyY1JlZyA9PSBEZXN0UmVnKSB7CisgICAgICAgIFByb2Nlc3NlZE5hbWVzLmluc2VydChTcmNSZWcpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBpbnNlcnQgY29waWVzIGZvciBpbXBsaWNpdF9kZWZzLgorICAgICAgTWFjaGluZUluc3RyKiBEZWZNSSA9IE1SSS5nZXRWUmVnRGVmKFNyY1JlZyk7CisgICAgICBpZiAoRGVmTUktPmlzSW1wbGljaXREZWYoKSkKKyAgICAgICAgUHJvY2Vzc2VkTmFtZXMuaW5zZXJ0KFNyY1JlZyk7CisgICAgCisgICAgICAvLyBDaGVjayBmb3IgdHJpdmlhbCBpbnRlcmZlcmVuY2VzIHZpYSBsaXZlbmVzcyBpbmZvcm1hdGlvbiwgYWxsb3dpbmcgdXMKKyAgICAgIC8vIHRvIGF2b2lkIGV4dHJhIHdvcmsgbGF0ZXIuICBBbnkgcmVnaXN0ZXJzIHRoYXQgaW50ZXJmZXJlIGNhbm5vdCBib3RoCisgICAgICAvLyBiZSBpbiB0aGUgcmVuYW1pbmcgc2V0LCBzbyBjaG9vc2Ugb25lIGFuZCBhZGQgY29waWVzIGZvciBpdCBpbnN0ZWFkLgorICAgICAgLy8gVGhlIGNvbmRpdGlvbnMgYXJlOgorICAgICAgLy8gICAxKSBpZiB0aGUgb3BlcmFuZCBpcyBsaXZlIGludG8gdGhlIFBISSBub2RlJ3MgYmxvY2sgT1IKKyAgICAgIC8vICAgMikgaWYgdGhlIFBISSBub2RlIGlzIGxpdmUgb3V0IG9mIHRoZSBvcGVyYW5kJ3MgZGVmaW5pbmcgYmxvY2sgT1IKKyAgICAgIC8vICAgMykgaWYgdGhlIG9wZXJhbmQgaXMgaXRzZWxmIGEgUEhJIG5vZGUgYW5kIHRoZSBvcmlnaW5hbCBQSEkgaXMKKyAgICAgIC8vICAgICAgbGl2ZSBpbnRvIHRoZSBvcGVyYW5kJ3MgZGVmaW5pbmcgYmxvY2sgT1IKKyAgICAgIC8vICAgNCkgaWYgdGhlIG9wZXJhbmQgaXMgYWxyZWFkeSBiZWluZyByZW5hbWVkIGZvciBhbm90aGVyIFBISSBub2RlCisgICAgICAvLyAgICAgIGluIHRoaXMgYmxvY2sgT1IKKyAgICAgIC8vICAgNSkgaWYgYW55IHR3byBvcGVyYW5kcyBhcmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBibG9jaywgaW5zZXJ0IGNvcGllcworICAgICAgLy8gICAgICBmb3Igb25lIG9mIHRoZW0KKyAgICAgIGlmIChpc0xpdmVJbihTcmNSZWcsIFAtPmdldFBhcmVudCgpLCBMSSkgfHwKKyAgICAgICAgICBpc0xpdmVPdXQoUC0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgTVJJLmdldFZSZWdEZWYoU3JjUmVnKS0+Z2V0UGFyZW50KCksIExJKSB8fAorICAgICAgICAgICggTVJJLmdldFZSZWdEZWYoU3JjUmVnKS0+aXNQSEkoKSAmJgorICAgICAgICAgICAgaXNMaXZlSW4oUC0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgIE1SSS5nZXRWUmVnRGVmKFNyY1JlZyktPmdldFBhcmVudCgpLCBMSSkgKSB8fAorICAgICAgICAgIFByb2Nlc3NlZE5hbWVzLmNvdW50KFNyY1JlZykgfHwKKyAgICAgICAgICBVbmlvbmVkQmxvY2tzLmNvdW50KE1SSS5nZXRWUmVnRGVmKFNyY1JlZyktPmdldFBhcmVudCgpKSkgeworICAgICAgICAKKyAgICAgICAgLy8gQWRkIGEgY29weSBmb3IgdGhlIHNlbGVjdGVkIHJlZ2lzdGVyCisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBGcm9tID0gUC0+Z2V0T3BlcmFuZChpKS5nZXRNQkIoKTsKKyAgICAgICAgV2FpdGluZ1tGcm9tXS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoU3JjUmVnLCBEZXN0UmVnKSk7CisgICAgICAgIFVzZWRCeUFub3RoZXIuaW5zZXJ0KFNyY1JlZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPdGhlcndpc2UsIGFkZCBpdCB0byB0aGUgcmVuYW1pbmcgc2V0CisgICAgICAgIFBISVVuaW9uLmluc2VydChzdGQ6Om1ha2VfcGFpcihTcmNSZWcsUC0+Z2V0T3BlcmFuZChpKS5nZXRNQkIoKSkpOworICAgICAgICBVbmlvbmVkQmxvY2tzLmluc2VydChNUkkuZ2V0VlJlZ0RlZihTcmNSZWcpLT5nZXRQYXJlbnQoKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIENvbXB1dGUgdGhlIGRvbWluYXRvciBmb3Jlc3QgZm9yIHRoZSByZW5hbWluZyBzZXQuICBUaGlzIGlzIGEgZm9yZXN0CisgICAgLy8gd2hlcmUgdGhlIG5vZGVzIGFyZSB0aGUgcmVnaXN0ZXJzIGFuZCB0aGUgZWRnZXMgcmVwcmVzZW50IGRvbWluYW5jZSAKKyAgICAvLyByZWxhdGlvbnMgYmV0d2VlbiB0aGUgZGVmaW5pbmcgYmxvY2tzIG9mIHRoZSByZWdpc3RlcnMKKyAgICBzdGQ6OnZlY3RvcjxTdHJvbmdQSElFbGltaW5hdGlvbjo6RG9tRm9yZXN0Tm9kZSo+IERGID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlRG9tRm9yZXN0KFBISVVuaW9uLCBNUkkpOworICAgIAorICAgIC8vIFdhbGsgRG9tRm9yZXN0IHRvIHJlc29sdmUgaW50ZXJmZXJlbmNlcyBhdCBhbiBpbnRlci1ibG9jayBsZXZlbC4gIFRoaXMKKyAgICAvLyB3aWxsIHJlbW92ZSByZWdpc3RlcnMgZnJvbSB0aGUgcmVuYW1pbmcgc2V0IChhbmQgaW5zZXJ0IGNvcGllcyBmb3IgdGhlbSkKKyAgICAvLyBpZiBpbnRlcmZlcmVuY2VzIGFyZSBmb3VuZC4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiA+IGxvY2FsSW50ZXJmZXJlbmNlczsKKyAgICBwcm9jZXNzUEhJVW5pb24oUCwgUEhJVW5pb24sIERGLCBsb2NhbEludGVyZmVyZW5jZXMpOworICAgIAorICAgIC8vIElmIG9uZSBvZiB0aGUgaW5wdXRzIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgYmxvY2sgYXMgdGhlIGN1cnJlbnQgUEhJCisgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGZvciBhIGxvY2FsIGludGVyZmVyZW5jZSBiZXR3ZWVuIHRoYXQgaW5wdXQgYW5kCisgICAgLy8gdGhlIFBISS4KKyAgICBmb3IgKHN0ZDo6bWFwPHVuc2lnbmVkLCBNYWNoaW5lQmFzaWNCbG9jayo+OjppdGVyYXRvciBJID0gUEhJVW5pb24uYmVnaW4oKSwKKyAgICAgICAgIEUgPSBQSElVbmlvbi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoTVJJLmdldFZSZWdEZWYoSS0+Zmlyc3QpLT5nZXRQYXJlbnQoKSA9PSBQLT5nZXRQYXJlbnQoKSkKKyAgICAgICAgbG9jYWxJbnRlcmZlcmVuY2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihJLT5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKSk7CisgICAgCisgICAgLy8gVGhlIGRvbWluYXRvciBmb3Jlc3Qgd2FsayBtYXkgaGF2ZSByZXR1cm5lZCBzb21lIHJlZ2lzdGVyIHBhaXJzIHdob3NlCisgICAgLy8gaW50ZXJmZXJlbmNlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGZyb20gZG9taW5hdG9yIGFuYWx5c2lzLiAgV2Ugbm93IAorICAgIC8vIGV4YW1pbmUgdGhlc2UgcGFpcnMgZm9yIGxvY2FsIGludGVyZmVyZW5jZXMuCisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiA+OjppdGVyYXRvciBJID0KKyAgICAgICAgbG9jYWxJbnRlcmZlcmVuY2VzLmJlZ2luKCksIEUgPSBsb2NhbEludGVyZmVyZW5jZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBwID0gKkk7CisgICAgICAKKyAgICAgIE1hY2hpbmVEb21pbmF0b3JUcmVlJiBNRFQgPSBnZXRBbmFseXNpczxNYWNoaW5lRG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIAorICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBibG9jayB3ZSBuZWVkIHRvIHNjYW4gYW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbgorICAgICAgLy8gdGhlIHR3byByZWdpc3RlcnMKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBzY2FuID0gMDsKKyAgICAgIHVuc2lnbmVkIG1vZGUgPSAwOworICAgICAgaWYgKE1SSS5nZXRWUmVnRGVmKHAuZmlyc3QpLT5nZXRQYXJlbnQoKSA9PQorICAgICAgICAgIE1SSS5nZXRWUmVnRGVmKHAuc2Vjb25kKS0+Z2V0UGFyZW50KCkpIHsKKyAgICAgICAgc2NhbiA9IE1SSS5nZXRWUmVnRGVmKHAuZmlyc3QpLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgbW9kZSA9IDA7IC8vIFNhbWUgYmxvY2sKKyAgICAgIH0gZWxzZSBpZiAoTURULmRvbWluYXRlcyhNUkkuZ2V0VlJlZ0RlZihwLmZpcnN0KS0+Z2V0UGFyZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVJJLmdldFZSZWdEZWYocC5zZWNvbmQpLT5nZXRQYXJlbnQoKSkpIHsKKyAgICAgICAgc2NhbiA9IE1SSS5nZXRWUmVnRGVmKHAuc2Vjb25kKS0+Z2V0UGFyZW50KCk7CisgICAgICAgIG1vZGUgPSAxOyAvLyBGaXJzdCBkb21pbmF0ZXMgc2Vjb25kCisgICAgICB9IGVsc2UgeworICAgICAgICBzY2FuID0gTVJJLmdldFZSZWdEZWYocC5maXJzdCktPmdldFBhcmVudCgpOworICAgICAgICBtb2RlID0gMjsgLy8gU2Vjb25kIGRvbWluYXRlcyBmaXJzdAorICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiB0aGVyZSdzIGFuIGludGVyZmVyZW5jZSwgd2UgbmVlZCB0byBpbnNlcnQgIGNvcGllcworICAgICAgaWYgKGludGVyZmVyZXMocC5maXJzdCwgcC5zZWNvbmQsIHNjYW4sIExJLCBtb2RlKSkgeworICAgICAgICAvLyBJbnNlcnQgY29waWVzIGZvciBGaXJzdAorICAgICAgICBmb3IgKGludCBpID0gUC0+Z2V0TnVtT3BlcmFuZHMoKSAtIDE7IGkgPj0gMjsgaS09MikgeworICAgICAgICAgIGlmIChQLT5nZXRPcGVyYW5kKGktMSkuZ2V0UmVnKCkgPT0gcC5maXJzdCkgeworICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnID0gcC5maXJzdDsKKyAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBGcm9tID0gUC0+Z2V0T3BlcmFuZChpKS5nZXRNQkIoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgV2FpdGluZ1tGcm9tXS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUC0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkpOworICAgICAgICAgICAgVXNlZEJ5QW5vdGhlci5pbnNlcnQoU3JjUmVnKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUEhJVW5pb24uZXJhc2UoU3JjUmVnKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gQWRkIHRoZSByZW5hbWluZyBzZXQgZm9yIHRoaXMgUEhJIG5vZGUgdG8gb3VyIG92ZXJhbGwgcmVuYW1pbmcgaW5mb3JtYXRpb24KKyAgICBmb3IgKHN0ZDo6bWFwPHVuc2lnbmVkLCBNYWNoaW5lQmFzaWNCbG9jayo+OjppdGVyYXRvciBRSSA9IFBISVVuaW9uLmJlZ2luKCksCisgICAgICAgICBRRSA9IFBISVVuaW9uLmVuZCgpOyBRSSAhPSBRRTsgKytRSSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJBZGRpbmcgUmVuYW1pbmc6ICIgPDwgUUktPmZpcnN0IDw8ICIgLT4gIgorICAgICAgICAgICAgICAgICAgIDw8IFAtPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgPDwgIlxuIik7CisgICAgfQorICAgIAorICAgIFJlbmFtZVNldHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFAtPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCksIFBISVVuaW9uKSk7CisgICAgCisgICAgLy8gUmVtZW1iZXIgd2hpY2ggcmVnaXN0ZXJzIGFyZSBhbHJlYWR5IHJlbmFtZWQsIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIAorICAgIC8vIHJlbmFtZSB0aGVtIGZvciBhbm90aGVyIFBISSBub2RlIGluIHRoaXMgYmxvY2sKKyAgICBmb3IgKHN0ZDo6bWFwPHVuc2lnbmVkLCBNYWNoaW5lQmFzaWNCbG9jayo+OjppdGVyYXRvciBJID0gUEhJVW5pb24uYmVnaW4oKSwKKyAgICAgICAgIEUgPSBQSElVbmlvbi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBQcm9jZXNzZWROYW1lcy5pbnNlcnQoSS0+Zmlyc3QpOworICAgIAorICAgICsrUDsKKyAgfQorfQorCisvLy8gcHJvY2Vzc1BISVVuaW9uIC0gVGFrZSBhIHNldCBvZiBjYW5kaWRhdGUgcmVnaXN0ZXJzIHRvIGJlIGNvYWxlc2NlZCB3aGVuCisvLy8gZGVjb21wb3NpbmcgdGhlIFBISSBpbnN0cnVjdGlvbi4gIFVzZSB0aGUgRG9taW5hbmNlRm9yZXN0IHRvIHJlbW92ZSB0aGUgb25lcworLy8vIHRoYXQgYXJlIGtub3duIHRvIGludGVyZmVyZSwgYW5kIGZsYWcgb3RoZXJzIHRoYXQgbmVlZCB0byBiZSBjaGVja2VkIGZvcgorLy8vIGxvY2FsIGludGVyZmVyZW5jZXMuCit2b2lkIFN0cm9uZ1BISUVsaW1pbmF0aW9uOjpwcm9jZXNzUEhJVW5pb24oTWFjaGluZUluc3RyKiBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dW5zaWduZWQsIE1hY2hpbmVCYXNpY0Jsb2NrKj4mIFBISVVuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3Ryb25nUEhJRWxpbWluYXRpb246OkRvbUZvcmVzdE5vZGUqPiYgREYsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiA+JiBsb2NhbHMpIHsKKyAgCisgIHN0ZDo6dmVjdG9yPERvbUZvcmVzdE5vZGUqPiB3b3JrbGlzdChERi5iZWdpbigpLCBERi5lbmQoKSk7CisgIFNtYWxsUHRyU2V0PERvbUZvcmVzdE5vZGUqLCA0PiB2aXNpdGVkOworICAKKyAgLy8gQ29kZSBpcyBzdGlsbCBpbiBTU0EgZm9ybSwgc28gd2UgY2FuIHVzZSBNUkk6OmdldFZSZWdEZWYoKQorICBNYWNoaW5lUmVnaXN0ZXJJbmZvJiBNUkkgPSBJbnN0LT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmdldFJlZ0luZm8oKTsKKyAgCisgIExpdmVJbnRlcnZhbHMmIExJID0gZ2V0QW5hbHlzaXM8TGl2ZUludGVydmFscz4oKTsKKyAgdW5zaWduZWQgRGVzdFJlZyA9IEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIAorICAvLyBERiB3YWxrIG9uIHRoZSBEb21Gb3Jlc3QKKyAgd2hpbGUgKCF3b3JrbGlzdC5lbXB0eSgpKSB7CisgICAgRG9tRm9yZXN0Tm9kZSogREZOb2RlID0gd29ya2xpc3QuYmFjaygpOworICAgIAorICAgIHZpc2l0ZWQuaW5zZXJ0KERGTm9kZSk7CisgICAgCisgICAgYm9vbCBpbnNlcnRlZCA9IGZhbHNlOworICAgIGZvciAoRG9tRm9yZXN0Tm9kZTo6aXRlcmF0b3IgQ0kgPSBERk5vZGUtPmJlZ2luKCksIENFID0gREZOb2RlLT5lbmQoKTsKKyAgICAgICAgIENJICE9IENFOyArK0NJKSB7CisgICAgICBEb21Gb3Jlc3ROb2RlKiBjaGlsZCA9ICpDSTsgICAKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBsaXZlLW91dCBvZiB0aGUgZGVmaW5pbmcgYmxvY2sgb2Ygb25lIG9mIGl0cworICAgICAgLy8gY2hpbGRyZW4sIGluc2VydCBhIGNvcHkgZm9yIGl0LiAgTk9URTogVGhlIHBhcGVyIGFjdHVhbGx5IGNhbGxzIGZvcgorICAgICAgLy8gYSBtb3JlIGVsYWJvcmF0ZSBoZXVyaXN0aWMgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgdG8gaW5zZXJ0IGNvcGllcworICAgICAgLy8gZm9yIHRoZSBjaGlsZCBvciB0aGUgcGFyZW50LiAgSW4gdGhlIGludGVyZXN0IG9mIHNpbXBsaWNpdHksIHdlJ3JlCisgICAgICAvLyBqdXN0IGFsd2F5cyBjaG9vc2luZyB0aGUgcGFyZW50LgorICAgICAgaWYgKGlzTGl2ZU91dChERk5vZGUtPmdldFJlZygpLAorICAgICAgICAgIE1SSS5nZXRWUmVnRGVmKGNoaWxkLT5nZXRSZWcoKSktPmdldFBhcmVudCgpLCBMSSkpIHsKKyAgICAgICAgLy8gSW5zZXJ0IGNvcGllcyBmb3IgcGFyZW50CisgICAgICAgIGZvciAoaW50IGkgPSBJbnN0LT5nZXROdW1PcGVyYW5kcygpIC0gMTsgaSA+PSAyOyBpLT0yKSB7CisgICAgICAgICAgaWYgKEluc3QtPmdldE9wZXJhbmQoaS0xKS5nZXRSZWcoKSA9PSBERk5vZGUtPmdldFJlZygpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcgPSBERk5vZGUtPmdldFJlZygpOworICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIEZyb20gPSBJbnN0LT5nZXRPcGVyYW5kKGkpLmdldE1CQigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBXYWl0aW5nW0Zyb21dLmluc2VydChzdGQ6Om1ha2VfcGFpcihTcmNSZWcsIERlc3RSZWcpKTsKKyAgICAgICAgICAgIFVzZWRCeUFub3RoZXIuaW5zZXJ0KFNyY1JlZyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFBISVVuaW9uLmVyYXNlKFNyY1JlZyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIC8vIElmIGEgbm9kZSBpcyBsaXZlLWluIHRvIHRoZSBkZWZpbmluZyBibG9jayBvZiBvbmUgb2YgaXRzIGNoaWxkcmVuLCBidXQKKyAgICAgIC8vIG5vdCBsaXZlLW91dCwgdGhlbiB3ZSBuZWVkIHRvIHNjYW4gdGhhdCBibG9jayBmb3IgbG9jYWwgaW50ZXJmZXJlbmNlcy4KKyAgICAgIH0gZWxzZSBpZiAoaXNMaXZlSW4oREZOb2RlLT5nZXRSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTVJJLmdldFZSZWdEZWYoY2hpbGQtPmdldFJlZygpKS0+Z2V0UGFyZW50KCksIExJKSB8fAorICAgICAgICAgICAgICAgICBNUkkuZ2V0VlJlZ0RlZihERk5vZGUtPmdldFJlZygpKS0+Z2V0UGFyZW50KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1SSS5nZXRWUmVnRGVmKGNoaWxkLT5nZXRSZWcoKSktPmdldFBhcmVudCgpKSB7CisgICAgICAgIC8vIEFkZCAocCwgYykgdG8gcG9zc2libGUgbG9jYWwgaW50ZXJmZXJlbmNlcworICAgICAgICBsb2NhbHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKERGTm9kZS0+Z2V0UmVnKCksIGNoaWxkLT5nZXRSZWcoKSkpOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoIXZpc2l0ZWQuY291bnQoY2hpbGQpKSB7CisgICAgICAgIHdvcmtsaXN0LnB1c2hfYmFjayhjaGlsZCk7CisgICAgICAgIGluc2VydGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFpbnNlcnRlZCkgd29ya2xpc3QucG9wX2JhY2soKTsKKyAgfQorfQorCisvLy8gU2NoZWR1bGVDb3BpZXMgLSBJbnNlcnQgY29waWVzIGludG8gcHJlZGVjZXNzb3IgYmxvY2tzLCBzY2hlZHVsaW5nCisvLy8gdGhlbSBwcm9wZXJseSBzbyBhcyB0byBhdm9pZCB0aGUgJ2xvc3QgY29weScgYW5kIHRoZSAndmlydHVhbCBzd2FwJworLy8vIHByb2JsZW1zLgorLy8vCisvLy8gQmFzZWQgb24gIlByYWN0aWNhbCBJbXByb3ZlbWVudHMgdG8gdGhlIENvbnN0cnVjdGlvbiBhbmQgRGVzdHJ1Y3Rpb24KKy8vLyBvZiBTdGF0aWMgU2luZ2xlIEFzc2lnbm1lbnQgRm9ybSIgYnkgQnJpZ2dzLCBldCBhbC4KK3ZvaWQgU3Ryb25nUEhJRWxpbWluYXRpb246OlNjaGVkdWxlQ29waWVzKE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDx1bnNpZ25lZD4mIHB1c2hlZCkgeworICAvLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byB1cGRhdGUgTGl2ZUludGVydmFscworICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4mIGNvcHlfc2V0PSBXYWl0aW5nW01CQl07CisgIAorICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gd29ya2xpc3Q7CisgIHN0ZDo6bWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gbWFwOworICAKKyAgLy8gU2V0dXAgd29ya2xpc3Qgb2YgaW5pdGlhbCBjb3BpZXMKKyAgZm9yIChzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCB1bnNpZ25lZD46Oml0ZXJhdG9yIEkgPSBjb3B5X3NldC5iZWdpbigpLAorICAgICAgIEUgPSBjb3B5X3NldC5lbmQoKTsgSSAhPSBFOyApIHsKKyAgICBtYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEktPmZpcnN0LCBJLT5maXJzdCkpOworICAgIG1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSS0+c2Vjb25kLCBJLT5zZWNvbmQpKTsKKyAgICAgICAgIAorICAgIGlmICghVXNlZEJ5QW5vdGhlci5jb3VudChJLT5zZWNvbmQpKSB7CisgICAgICB3b3JrbGlzdC5pbnNlcnQoKkkpOworICAgICAgCisgICAgICAvLyBBdm9pZCBpdGVyYXRvciBpbnZhbGlkYXRpb24KKyAgICAgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIHVuc2lnbmVkPjo6aXRlcmF0b3IgT0kgPSBJOworICAgICAgKytJOworICAgICAgY29weV9zZXQuZXJhc2UoT0kpOworICAgIH0gZWxzZSB7CisgICAgICArK0k7CisgICAgfQorICB9CisgIAorICBMaXZlSW50ZXJ2YWxzJiBMSSA9IGdldEFuYWx5c2lzPExpdmVJbnRlcnZhbHM+KCk7CisgIE1hY2hpbmVGdW5jdGlvbiogTUYgPSBNQkItPmdldFBhcmVudCgpOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvJiBNUkkgPSBNRi0+Z2V0UmVnSW5mbygpOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IE1GLT5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKTsKKyAgCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTWFjaGluZUluc3RyKj4sIDQ+IEluc2VydGVkUEhJRGVzdHM7CisgIAorICAvLyBJdGVyYXRlIG92ZXIgdGhlIHdvcmtsaXN0LCBpbnNlcnRpbmcgY29waWVzCisgIHdoaWxlICghd29ya2xpc3QuZW1wdHkoKSB8fCAhY29weV9zZXQuZW1wdHkoKSkgeworICAgIHdoaWxlICghd29ya2xpc3QuZW1wdHkoKSkgeworICAgICAgc3RkOjptdWx0aW1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+OjppdGVyYXRvciBXSSA9IHdvcmtsaXN0LmJlZ2luKCk7CisgICAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBjdXJyID0gKldJOworICAgICAgd29ya2xpc3QuZXJhc2UoV0kpOworICAgICAgCisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IE1GLT5nZXRSZWdJbmZvKCkuZ2V0UmVnQ2xhc3MoY3Vyci5maXJzdCk7CisgICAgICAKKyAgICAgIGlmIChpc0xpdmVPdXQoY3Vyci5zZWNvbmQsIE1CQiwgTEkpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeQorICAgICAgICB1bnNpZ25lZCB0ID0gTUYtPmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgICAgICAKKyAgICAgICAgLy8gSW5zZXJ0IGNvcHkgZnJvbSBjdXJyLnNlY29uZCB0byBhIHRlbXBvcmFyeSBhdAorICAgICAgICAvLyB0aGUgUGhpIGRlZmluaW5nIGN1cnIuc2Vjb25kCisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBQSSA9IE1SSS5nZXRWUmVnRGVmKGN1cnIuc2Vjb25kKTsKKyAgICAgICAgQnVpbGRNSSgqUEktPmdldFBhcmVudCgpLCBQSSwgRGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICAgICAgICAgICAgICB0KS5hZGRSZWcoY3Vyci5zZWNvbmQpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkluc2VydGVkIGNvcHkgZnJvbSAiIDw8IGN1cnIuc2Vjb25kIDw8ICIgdG8gIiA8PCB0CisgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iKTsKKyAgICAgICAgCisgICAgICAgIC8vIFB1c2ggdGVtcG9yYXJ5IG9uIFN0YWNrcworICAgICAgICBTdGFja3NbY3Vyci5zZWNvbmRdLnB1c2hfYmFjayh0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEluc2VydCBjdXJyLnNlY29uZCBpbiBwdXNoZWQKKyAgICAgICAgcHVzaGVkLmluc2VydChjdXJyLnNlY29uZCk7CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgYSBsaXZlIGludGVydmFsIGZvciB0aGlzIHRlbXBvcmFyeQorICAgICAgICBJbnNlcnRlZFBISURlc3RzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcih0LCAtLVBJKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIEluc2VydCBjb3B5IGZyb20gbWFwW2N1cnIuZmlyc3RdIHRvIGN1cnIuc2Vjb25kCisgICAgICBCdWlsZE1JKCpNQkIsIE1CQi0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCksIERlYnVnTG9jKCksCisgICAgICAgICAgICAgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgY3Vyci5zZWNvbmQpLmFkZFJlZyhtYXBbY3Vyci5maXJzdF0pOworICAgICAgbWFwW2N1cnIuZmlyc3RdID0gY3Vyci5zZWNvbmQ7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkluc2VydGVkIGNvcHkgZnJvbSAiIDw8IGN1cnIuZmlyc3QgPDwgIiB0byAiCisgICAgICAgICAgICAgICAgICAgPDwgY3Vyci5zZWNvbmQgPDwgIlxuIik7CisgICAgICAKKyAgICAgIC8vIFB1c2ggdGhpcyBjb3B5IG9udG8gSW5zZXJ0ZWRQSElDb3BpZXMgc28gd2UgY2FuCisgICAgICAvLyB1cGRhdGUgTGl2ZUludGVydmFscyB3aXRoIGl0LgorICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JID0gTUJCLT5nZXRGaXJzdFRlcm1pbmF0b3IoKTsKKyAgICAgIEluc2VydGVkUEhJRGVzdHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGN1cnIuc2Vjb25kLCAtLU1JKSk7CisgICAgICAKKyAgICAgIC8vIElmIGN1cnIuZmlyc3QgaXMgYSBkZXN0aW5hdGlvbiBpbiBjb3B5X3NldC4uLgorICAgICAgZm9yIChzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCB1bnNpZ25lZD46Oml0ZXJhdG9yIEkgPSBjb3B5X3NldC5iZWdpbigpLAorICAgICAgICAgICBFID0gY29weV9zZXQuZW5kKCk7IEkgIT0gRTsgKQorICAgICAgICBpZiAoY3Vyci5maXJzdCA9PSBJLT5zZWNvbmQpIHsKKyAgICAgICAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiB0ZW1wID0gKkk7CisgICAgICAgICAgd29ya2xpc3QuaW5zZXJ0KHRlbXApOworICAgICAgICAgIAorICAgICAgICAgIC8vIEF2b2lkIGl0ZXJhdG9yIGludmFsaWRhdGlvbgorICAgICAgICAgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIHVuc2lnbmVkPjo6aXRlcmF0b3IgT0kgPSBJOworICAgICAgICAgICsrSTsKKyAgICAgICAgICBjb3B5X3NldC5lcmFzZShPSSk7CisgICAgICAgICAgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytJOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmICghY29weV9zZXQuZW1wdHkoKSkgeworICAgICAgc3RkOjptdWx0aW1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+OjppdGVyYXRvciBDSSA9IGNvcHlfc2V0LmJlZ2luKCk7CisgICAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBjdXJyID0gKkNJOworICAgICAgd29ya2xpc3QuaW5zZXJ0KGN1cnIpOworICAgICAgY29weV9zZXQuZXJhc2UoQ0kpOworICAgICAgCisgICAgICBMaXZlSW50ZXJ2YWwmIEkgPSBMSS5nZXRJbnRlcnZhbChjdXJyLnNlY29uZCk7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgdGVybSA9IE1CQi0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCk7CisgICAgICBTbG90SW5kZXggZW5kSWR4ID0gU2xvdEluZGV4KCk7CisgICAgICBpZiAodGVybSAhPSBNQkItPmVuZCgpKQorICAgICAgICBlbmRJZHggPSBMSS5nZXRJbnN0cnVjdGlvbkluZGV4KHRlcm0pOworICAgICAgZWxzZQorICAgICAgICBlbmRJZHggPSBMSS5nZXRNQkJFbmRJZHgoTUJCKTsKKyAgICAgIAorICAgICAgaWYgKEkubGl2ZUF0KGVuZElkeCkpIHsKKyAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUYtPmdldFJlZ0luZm8oKS5nZXRSZWdDbGFzcyhjdXJyLmZpcnN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEluc2VydCBhIGNvcHkgZnJvbSBkZXN0IHRvIGEgbmV3IHRlbXBvcmFyeSB0IGF0IHRoZSBlbmQgb2YgYgorICAgICAgICB1bnNpZ25lZCB0ID0gTUYtPmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgICAgICBCdWlsZE1JKCpNQkIsIE1CQi0+Z2V0Rmlyc3RUZXJtaW5hdG9yKCksIERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgdCkuYWRkUmVnKGN1cnIuc2Vjb25kKTsKKyAgICAgICAgbWFwW2N1cnIuc2Vjb25kXSA9IHQ7CisgICAgICAgIAorICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgVEkgPSBNQkItPmdldEZpcnN0VGVybWluYXRvcigpOworICAgICAgICBJbnNlcnRlZFBISURlc3RzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcih0LCAtLVRJKSk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvLyBSZW51bWJlciB0aGUgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgd2UgY2FuIHBlcmZvcm0gdGhlIGluZGV4IGNvbXB1dGF0aW9ucworICAvLyBuZWVkZWQgdG8gY3JlYXRlIG5ldyBsaXZlIGludGVydmFscy4KKyAgTEkucmVudW1iZXIoKTsKKyAgCisgIC8vIEZvciBjb3BpZXMgdGhhdCB3ZSBpbnNlcnRlZCBhdCB0aGUgZW5kcyBvZiBwcmVkZWNlc3NvcnMsIHdlIGNvbnN0cnVjdAorICAvLyBsaXZlIGludGVydmFscy4gIFRoaXMgaXMgcHJldHR5IGVhc3ksIHNpbmNlIHdlIGtub3cgdGhhdCB0aGUgZGVzdGluYXRpb24KKyAgLy8gcmVnaXN0ZXIgY2Fubm90IGhhdmUgYmUgaW4gbGl2ZSBhdCB0aGF0IHBvaW50IHByZXZpb3VzbHkuICBXZSBqdXN0IGhhdmUKKyAgLy8gdG8gbWFrZSBzdXJlIHRoYXQsIGZvciByZWdpc3RlcnMgdGhhdCBzZXJ2ZSBhcyBpbnB1dHMgdG8gbW9yZSB0aGFuIG9uZQorICAvLyBQSEksIHdlIGRvbid0IGNyZWF0ZSBtdWx0aXBsZSBvdmVybGFwcGluZyBsaXZlIGludGVydmFscy4KKyAgc3RkOjpzZXQ8dW5zaWduZWQ+IFJlZ0hhbmRsZWQ7CisgIGZvciAoU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBNYWNoaW5lSW5zdHIqPiwgND46Oml0ZXJhdG9yIEkgPQorICAgICAgIEluc2VydGVkUEhJRGVzdHMuYmVnaW4oKSwgRSA9IEluc2VydGVkUEhJRGVzdHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKFJlZ0hhbmRsZWQuaW5zZXJ0KEktPmZpcnN0KS5zZWNvbmQpIHsKKyAgICAgIExpdmVJbnRlcnZhbCYgSW50ID0gTEkuZ2V0T3JDcmVhdGVJbnRlcnZhbChJLT5maXJzdCk7CisgICAgICBTbG90SW5kZXggaW5zdHJJZHggPSBMSS5nZXRJbnN0cnVjdGlvbkluZGV4KEktPnNlY29uZCk7CisgICAgICBpZiAoSW50LmxpdmVBdChpbnN0cklkeC5nZXREZWZJbmRleCgpKSkKKyAgICAgICAgSW50LnJlbW92ZVJhbmdlKGluc3RySWR4LmdldERlZkluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICBMSS5nZXRNQkJFbmRJZHgoSS0+c2Vjb25kLT5nZXRQYXJlbnQoKSkuZ2V0TmV4dFNsb3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgCisgICAgICBMaXZlUmFuZ2UgUiA9IExJLmFkZExpdmVSYW5nZVRvRW5kT2ZCbG9jayhJLT5maXJzdCwgSS0+c2Vjb25kKTsKKyAgICAgIFIudmFsbm8tPnNldENvcHkoSS0+c2Vjb25kKTsKKyAgICAgIFIudmFsbm8tPmRlZiA9IExJLmdldEluc3RydWN0aW9uSW5kZXgoSS0+c2Vjb25kKS5nZXREZWZJbmRleCgpOworICAgIH0KKyAgfQorfQorCisvLy8gSW5zZXJ0Q29waWVzIC0gaW5zZXJ0IGNvcGllcyBpbnRvIE1CQiBhbmQgYWxsIG9mIGl0cyBzdWNjZXNzb3JzCit2b2lkIFN0cm9uZ1BISUVsaW1pbmF0aW9uOjpJbnNlcnRDb3BpZXMoTWFjaGluZURvbVRyZWVOb2RlKiBNRFROLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLCAxNj4mIHZpc2l0ZWQpIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sqIE1CQiA9IE1EVE4tPmdldEJsb2NrKCk7CisgIHZpc2l0ZWQuaW5zZXJ0KE1CQik7CisgIAorICBzdGQ6OnNldDx1bnNpZ25lZD4gcHVzaGVkOworICAKKyAgTGl2ZUludGVydmFscyYgTEkgPSBnZXRBbmFseXNpczxMaXZlSW50ZXJ2YWxzPigpOworICAvLyBSZXdyaXRlIHJlZ2lzdGVyIHVzZXMgZnJvbSBTdGFja3MKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi0+YmVnaW4oKSwgRSA9IE1CQi0+ZW5kKCk7CisgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChJLT5pc1BISSgpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEktPmdldE51bU9wZXJhbmRzKCk7ICsraSkKKyAgICAgIGlmIChJLT5nZXRPcGVyYW5kKGkpLmlzUmVnKCkgJiYKKyAgICAgICAgICBTdGFja3NbSS0+Z2V0T3BlcmFuZChpKS5nZXRSZWcoKV0uc2l6ZSgpKSB7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgbGl2ZSByYW5nZSBmb3IgdGhlIG9sZCB2cmVnLgorICAgICAgICBMaXZlSW50ZXJ2YWwmIE9sZEludCA9IExJLmdldEludGVydmFsKEktPmdldE9wZXJhbmQoaSkuZ2V0UmVnKCkpOworICAgICAgICBMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yIE9sZExSID0KKyAgICAgICAgICBPbGRJbnQuRmluZExpdmVSYW5nZUNvbnRhaW5pbmcoTEkuZ2V0SW5zdHJ1Y3Rpb25JbmRleChJKS5nZXRVc2VJbmRleCgpKTsKKyAgICAgICAgaWYgKE9sZExSICE9IE9sZEludC5lbmQoKSkKKyAgICAgICAgICBPbGRJbnQucmVtb3ZlUmFuZ2UoKk9sZExSLCB0cnVlKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoYW5nZSB0aGUgcmVnaXN0ZXIKKyAgICAgICAgSS0+Z2V0T3BlcmFuZChpKS5zZXRSZWcoU3RhY2tzW0ktPmdldE9wZXJhbmQoaSkuZ2V0UmVnKCldLmJhY2soKSk7CisgICAgICAgIAorICAgICAgICAvLyBBZGQgYSBsaXZlIHJhbmdlIGZvciB0aGUgbmV3IHZyZWcKKyAgICAgICAgTGl2ZUludGVydmFsJiBJbnQgPSBMSS5nZXRJbnRlcnZhbChJLT5nZXRPcGVyYW5kKGkpLmdldFJlZygpKTsKKyAgICAgICAgVk5JbmZvKiBGaXJzdFZOID0gKkludC52bmlfYmVnaW4oKTsKKyAgICAgICAgRmlyc3RWTi0+c2V0SGFzUEhJS2lsbChmYWxzZSk7CisgICAgICAgIExpdmVSYW5nZSBMUiAoTEkuZ2V0TUJCU3RhcnRJZHgoSS0+Z2V0UGFyZW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgIExJLmdldEluc3RydWN0aW9uSW5kZXgoSSkuZ2V0VXNlSW5kZXgoKS5nZXROZXh0U2xvdCgpLAorICAgICAgICAgICAgICAgICAgICAgIEZpcnN0Vk4pOworICAgICAgICAKKyAgICAgICAgSW50LmFkZFJhbmdlKExSKTsKKyAgICAgIH0KKyAgfSAgICAKKyAgCisgIC8vIFNjaGVkdWxlIHRoZSBjb3BpZXMgZm9yIHRoaXMgYmxvY2sKKyAgU2NoZWR1bGVDb3BpZXMoTUJCLCBwdXNoZWQpOworICAKKyAgLy8gUmVjdXIgZG93biB0aGUgZG9taW5hdG9yIHRyZWUuCisgIGZvciAoTWFjaGluZURvbVRyZWVOb2RlOjppdGVyYXRvciBJID0gTURUTi0+YmVnaW4oKSwKKyAgICAgICBFID0gTURUTi0+ZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmICghdmlzaXRlZC5jb3VudCgoKkkpLT5nZXRCbG9jaygpKSkKKyAgICAgIEluc2VydENvcGllcygqSSwgdmlzaXRlZCk7CisgIAorICAvLyBBcyB3ZSBleGl0IHRoaXMgYmxvY2ssIHBvcCB0aGUgbmFtZXMgd2UgcHVzaGVkIHdoaWxlIHByb2Nlc3NpbmcgaXQKKyAgZm9yIChzdGQ6OnNldDx1bnNpZ25lZD46Oml0ZXJhdG9yIEkgPSBwdXNoZWQuYmVnaW4oKSwgCisgICAgICAgRSA9IHB1c2hlZC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgU3RhY2tzWypJXS5wb3BfYmFjaygpOworfQorCitib29sIFN0cm9uZ1BISUVsaW1pbmF0aW9uOjptZXJnZUxpdmVJbnRlcnZhbHModW5zaWduZWQgcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzZWNvbmRhcnkpIHsKKyAgCisgIExpdmVJbnRlcnZhbHMmIExJID0gZ2V0QW5hbHlzaXM8TGl2ZUludGVydmFscz4oKTsKKyAgTGl2ZUludGVydmFsJiBMSFMgPSBMSS5nZXRPckNyZWF0ZUludGVydmFsKHByaW1hcnkpOworICBMaXZlSW50ZXJ2YWwmIFJIUyA9IExJLmdldE9yQ3JlYXRlSW50ZXJ2YWwoc2Vjb25kYXJ5KTsKKyAgCisgIExJLnJlbnVtYmVyKCk7CisgIAorICBEZW5zZU1hcDxWTkluZm8qLCBWTkluZm8qPiBWTk1hcDsKKyAgZm9yIChMaXZlSW50ZXJ2YWw6Oml0ZXJhdG9yIEkgPSBSSFMuYmVnaW4oKSwgRSA9IFJIUy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBMaXZlUmFuZ2UgUiA9ICpJOworIAorICAgIFNsb3RJbmRleCBTdGFydCA9IFIuc3RhcnQ7CisgICAgU2xvdEluZGV4IEVuZCA9IFIuZW5kOworICAgIGlmIChMSFMuZ2V0TGl2ZVJhbmdlQ29udGFpbmluZyhTdGFydCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgaWYgKExIUy5nZXRMaXZlUmFuZ2VDb250YWluaW5nKEVuZCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgTGl2ZUludGVydmFsOjppdGVyYXRvciBSSSA9IHN0ZDo6dXBwZXJfYm91bmQoTEhTLmJlZ2luKCksIExIUy5lbmQoKSwgUik7CisgICAgaWYgKFJJICE9IExIUy5lbmQoKSAmJiBSSS0+c3RhcnQgPCBFbmQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIGZvciAoTGl2ZUludGVydmFsOjppdGVyYXRvciBJID0gUkhTLmJlZ2luKCksIEUgPSBSSFMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgTGl2ZVJhbmdlIFIgPSAqSTsKKyAgICBWTkluZm8qIE9sZFZOID0gUi52YWxubzsKKyAgICBWTkluZm8qJiBOZXdWTiA9IFZOTWFwW09sZFZOXTsKKyAgICBpZiAoIU5ld1ZOKSB7CisgICAgICBOZXdWTiA9IExIUy5jcmVhdGVWYWx1ZUNvcHkoT2xkVk4sIExJLmdldFZOSW5mb0FsbG9jYXRvcigpKTsKKyAgICB9CisgICAgCisgICAgTGl2ZVJhbmdlIExSIChSLnN0YXJ0LCBSLmVuZCwgTmV3Vk4pOworICAgIExIUy5hZGRSYW5nZShMUik7CisgIH0KKyAgCisgIExJLnJlbW92ZUludGVydmFsKFJIUy5yZWcpOworICAKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3Ryb25nUEhJRWxpbWluYXRpb246OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRm4pIHsKKyAgTGl2ZUludGVydmFscyYgTEkgPSBnZXRBbmFseXNpczxMaXZlSW50ZXJ2YWxzPigpOworICAKKyAgLy8gQ29tcHV0ZSBERlMgbnVtYmVycyBvZiBlYWNoIGJsb2NrCisgIGNvbXB1dGVERlMoRm4pOworICAKKyAgLy8gRGV0ZXJtaW5lIHdoaWNoIHBoaSBub2RlIG9wZXJhbmRzIG5lZWQgY29waWVzCisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gRm4uYmVnaW4oKSwgRSA9IEZuLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoIUktPmVtcHR5KCkgJiYgSS0+YmVnaW4oKS0+aXNQSEkoKSkKKyAgICAgIHByb2Nlc3NCbG9jayhJKTsKKyAgCisgIC8vIEJyZWFrIGludGVyZmVyZW5jZXMgd2hlcmUgdHdvIGRpZmZlcmVudCBwaGlzIHdhbnQgdG8gY29hbGVzY2UKKyAgLy8gaW4gdGhlIHNhbWUgcmVnaXN0ZXIuCisgIHN0ZDo6c2V0PHVuc2lnbmVkPiBzZWVuOworICB0eXBlZGVmIHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6Om1hcDx1bnNpZ25lZCwgTWFjaGluZUJhc2ljQmxvY2sqPiA+CisgICAgICAgICAgUmVuYW1lU2V0VHlwZTsKKyAgZm9yIChSZW5hbWVTZXRUeXBlOjppdGVyYXRvciBJID0gUmVuYW1lU2V0cy5iZWdpbigpLCBFID0gUmVuYW1lU2V0cy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGZvciAoc3RkOjptYXA8dW5zaWduZWQsIE1hY2hpbmVCYXNpY0Jsb2NrKj46Oml0ZXJhdG9yCisgICAgICAgICBPSSA9IEktPnNlY29uZC5iZWdpbigpLCBPRSA9IEktPnNlY29uZC5lbmQoKTsgT0kgIT0gT0U7ICkgeworICAgICAgaWYgKCFzZWVuLmNvdW50KE9JLT5maXJzdCkpIHsKKyAgICAgICAgc2Vlbi5pbnNlcnQoT0ktPmZpcnN0KTsKKyAgICAgICAgKytPSTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFdhaXRpbmdbT0ktPnNlY29uZF0uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE9JLT5maXJzdCwgSS0+Zmlyc3QpKTsKKyAgICAgICAgdW5zaWduZWQgcmVnID0gT0ktPmZpcnN0OworICAgICAgICArK09JOworICAgICAgICBJLT5zZWNvbmQuZXJhc2UocmVnKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJSZW1vdmluZyBSZW5hbWluZzogIiA8PCByZWcgPDwgIiAtPiAiIDw8IEktPmZpcnN0CisgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIEluc2VydCBjb3BpZXMKKyAgLy8gRklYTUU6IFRoaXMgcHJvY2VzcyBzaG91bGQgcHJvYmFibHkgcHJlc2VydmUgTGl2ZUludGVydmFscworICBTbWFsbFB0clNldDxNYWNoaW5lQmFzaWNCbG9jayosIDE2PiB2aXNpdGVkOworICBNYWNoaW5lRG9taW5hdG9yVHJlZSYgTURUID0gZ2V0QW5hbHlzaXM8TWFjaGluZURvbWluYXRvclRyZWU+KCk7CisgIEluc2VydENvcGllcyhNRFQuZ2V0Um9vdE5vZGUoKSwgdmlzaXRlZCk7CisgIAorICAvLyBQZXJmb3JtIHJlbmFtaW5nCisgIGZvciAoUmVuYW1lU2V0VHlwZTo6aXRlcmF0b3IgSSA9IFJlbmFtZVNldHMuYmVnaW4oKSwgRSA9IFJlbmFtZVNldHMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgd2hpbGUgKEktPnNlY29uZC5zaXplKCkpIHsKKyAgICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBNYWNoaW5lQmFzaWNCbG9jayo+OjppdGVyYXRvciBTSSA9IEktPnNlY29uZC5iZWdpbigpOworICAgICAgCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlbmFtaW5nOiAiIDw8IFNJLT5maXJzdCA8PCAiIC0+ICIgPDwgSS0+Zmlyc3QgPDwgIlxuIik7CisgICAgICAKKyAgICAgIGlmIChTSS0+Zmlyc3QgIT0gSS0+Zmlyc3QpIHsKKyAgICAgICAgaWYgKG1lcmdlTGl2ZUludGVydmFscyhJLT5maXJzdCwgU0ktPmZpcnN0KSkgeworICAgICAgICAgIEZuLmdldFJlZ0luZm8oKS5yZXBsYWNlUmVnV2l0aChTSS0+Zmlyc3QsIEktPmZpcnN0KTsKKyAgICAgIAorICAgICAgICAgIGlmIChSZW5hbWVTZXRzLmNvdW50KFNJLT5maXJzdCkpIHsKKyAgICAgICAgICAgIEktPnNlY29uZC5pbnNlcnQoUmVuYW1lU2V0c1tTSS0+Zmlyc3RdLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmFtZVNldHNbU0ktPmZpcnN0XS5lbmQoKSk7CisgICAgICAgICAgICBSZW5hbWVTZXRzLmVyYXNlKFNJLT5maXJzdCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEluc2VydCBhIGxhc3QtbWludXRlIGNvcHkgaWYgYSBjb25mbGljdCB3YXMgZGV0ZWN0ZWQuCisgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBGbi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKTsKKyAgICAgICAgICBCdWlsZE1JKCpTSS0+c2Vjb25kLCBTSS0+c2Vjb25kLT5nZXRGaXJzdFRlcm1pbmF0b3IoKSwgRGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksIEktPmZpcnN0KS5hZGRSZWcoU0ktPmZpcnN0KTsKKyAgICAgICAgICAKKyAgICAgICAgICBMSS5yZW51bWJlcigpOworICAgICAgICAgIAorICAgICAgICAgIExpdmVJbnRlcnZhbCYgSW50ID0gTEkuZ2V0T3JDcmVhdGVJbnRlcnZhbChJLT5maXJzdCk7CisgICAgICAgICAgU2xvdEluZGV4IGluc3RySWR4ID0KKyAgICAgICAgICAgICAgICAgICAgIExJLmdldEluc3RydWN0aW9uSW5kZXgoLS1TSS0+c2Vjb25kLT5nZXRGaXJzdFRlcm1pbmF0b3IoKSk7CisgICAgICAgICAgaWYgKEludC5saXZlQXQoaW5zdHJJZHguZ2V0RGVmSW5kZXgoKSkpCisgICAgICAgICAgICBJbnQucmVtb3ZlUmFuZ2UoaW5zdHJJZHguZ2V0RGVmSW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSS5nZXRNQkJFbmRJZHgoU0ktPnNlY29uZCkuZ2V0TmV4dFNsb3QoKSwgdHJ1ZSk7CisKKyAgICAgICAgICBMaXZlUmFuZ2UgUiA9IExJLmFkZExpdmVSYW5nZVRvRW5kT2ZCbG9jayhJLT5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1TSS0+c2Vjb25kLT5nZXRGaXJzdFRlcm1pbmF0b3IoKSk7CisgICAgICAgICAgUi52YWxuby0+c2V0Q29weSgtLVNJLT5zZWNvbmQtPmdldEZpcnN0VGVybWluYXRvcigpKTsKKyAgICAgICAgICBSLnZhbG5vLT5kZWYgPSBpbnN0cklkeC5nZXREZWZJbmRleCgpOworICAgICAgICAgIAorICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUmVuYW1pbmcgZmFpbGVkOiAiIDw8IFNJLT5maXJzdCA8PCAiIC0+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgSS0+Zmlyc3QgPDwgIlxuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgTGl2ZUludGVydmFsJiBJbnQgPSBMSS5nZXRPckNyZWF0ZUludGVydmFsKEktPmZpcnN0KTsKKyAgICAgIGNvbnN0IExpdmVSYW5nZSogTFIgPQorICAgICAgICAgICAgICAgICAgICAgICBJbnQuZ2V0TGl2ZVJhbmdlQ29udGFpbmluZyhMSS5nZXRNQkJFbmRJZHgoU0ktPnNlY29uZCkpOworICAgICAgTFItPnZhbG5vLT5zZXRIYXNQSElLaWxsKHRydWUpOworICAgICAgCisgICAgICBJLT5zZWNvbmQuZXJhc2UoU0ktPmZpcnN0KTsKKyAgICB9CisgIAorICAvLyBSZW1vdmUgUEhJcworICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPiBwaGlzOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IEZuLmJlZ2luKCksIEUgPSBGbi5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCSSA9IEktPmJlZ2luKCksIEJFID0gSS0+ZW5kKCk7CisgICAgICAgICBCSSAhPSBCRTsgKytCSSkKKyAgICAgIGlmIChCSS0+aXNQSEkoKSkKKyAgICAgICAgcGhpcy5wdXNoX2JhY2soQkkpOworICB9CisgIAorICBmb3IgKHN0ZDo6dmVjdG9yPE1hY2hpbmVJbnN0cio+OjppdGVyYXRvciBJID0gcGhpcy5iZWdpbigpLCBFID0gcGhpcy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICkgeworICAgIE1hY2hpbmVJbnN0ciogUEluc3RyID0gKihJKyspOworICAgIAorICAgIC8vIElmIHRoaXMgaXMgYSBkZWFkIFBISSBub2RlLCB0aGVuIHJlbW92ZSBpdCBmcm9tIExpdmVJbnRlcnZhbHMuCisgICAgdW5zaWduZWQgRGVzdFJlZyA9IFBJbnN0ci0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICBMaXZlSW50ZXJ2YWwmIFBJID0gTEkuZ2V0SW50ZXJ2YWwoRGVzdFJlZyk7CisgICAgaWYgKFBJbnN0ci0+cmVnaXN0ZXJEZWZJc0RlYWQoRGVzdFJlZykpIHsKKyAgICAgIGlmIChQSS5jb250YWluc09uZVZhbHVlKCkpIHsKKyAgICAgICAgTEkucmVtb3ZlSW50ZXJ2YWwoRGVzdFJlZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBTbG90SW5kZXggaWR4ID0gTEkuZ2V0SW5zdHJ1Y3Rpb25JbmRleChQSW5zdHIpLmdldERlZkluZGV4KCk7CisgICAgICAgIFBJLnJlbW92ZVJhbmdlKCpQSS5nZXRMaXZlUmFuZ2VDb250YWluaW5nKGlkeCksIHRydWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBUcmltIGxpdmUgaW50ZXJ2YWxzIG9mIGlucHV0IHJlZ2lzdGVycy4gIFRoZXkgYXJlIG5vIGxvbmdlciBsaXZlIGludG8KKyAgICAgIC8vIHRoaXMgYmxvY2sgaWYgdGhleSBkaWVkIGFmdGVyIHRoZSBQSEkuICBJZiB0aGV5IGxpdmVkIGFmdGVyIGl0LCBkb24ndAorICAgICAgLy8gdHJpbSB0aGVtIGJlY2F1c2UgdGhleSBtaWdodCBoYXZlIG90aGVyIGxlZ2l0aW1hdGUgdXNlcy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBQSW5zdHItPmdldE51bU9wZXJhbmRzKCk7IGkgKz0gMikgeworICAgICAgICB1bnNpZ25lZCByZWcgPSBQSW5zdHItPmdldE9wZXJhbmQoaSkuZ2V0UmVnKCk7CisgICAgICAgIAorICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogTUJCID0gUEluc3RyLT5nZXRPcGVyYW5kKGkrMSkuZ2V0TUJCKCk7CisgICAgICAgIExpdmVJbnRlcnZhbCYgSW5wdXRJID0gTEkuZ2V0SW50ZXJ2YWwocmVnKTsKKyAgICAgICAgaWYgKE1CQiAhPSBQSW5zdHItPmdldFBhcmVudCgpICYmCisgICAgICAgICAgICBJbnB1dEkubGl2ZUF0KExJLmdldE1CQlN0YXJ0SWR4KFBJbnN0ci0+Z2V0UGFyZW50KCkpKSAmJgorICAgICAgICAgICAgSW5wdXRJLmV4cGlyZWRBdChMSS5nZXRJbnN0cnVjdGlvbkluZGV4KFBJbnN0cikuZ2V0TmV4dEluZGV4KCkpKQorICAgICAgICAgIElucHV0SS5yZW1vdmVSYW5nZShMSS5nZXRNQkJTdGFydElkeChQSW5zdHItPmdldFBhcmVudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEkuZ2V0SW5zdHJ1Y3Rpb25JbmRleChQSW5zdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gSWYgdGhlIFBISSBpcyBub3QgZGVhZCwgdGhlbiB0aGUgdmFsbm8gZGVmaW5lZCBieSB0aGUgUEhJCisgICAgICAvLyBub3cgaGFzIGFuIHVua25vd24gZGVmLgorICAgICAgU2xvdEluZGV4IGlkeCA9IExJLmdldEluc3RydWN0aW9uSW5kZXgoUEluc3RyKS5nZXREZWZJbmRleCgpOworICAgICAgY29uc3QgTGl2ZVJhbmdlKiBQTFIgPSBQSS5nZXRMaXZlUmFuZ2VDb250YWluaW5nKGlkeCk7CisgICAgICBQTFItPnZhbG5vLT5zZXRJc1BISURlZih0cnVlKTsKKyAgICAgIExpdmVSYW5nZSBSIChMSS5nZXRNQkJTdGFydElkeChQSW5zdHItPmdldFBhcmVudCgpKSwKKyAgICAgICAgICAgICAgICAgICBQTFItPnN0YXJ0LCBQTFItPnZhbG5vKTsKKyAgICAgIFBJLmFkZFJhbmdlKFIpOworICAgIH0KKyAgICAKKyAgICBMSS5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhQSW5zdHIpOworICAgIFBJbnN0ci0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KKyAgCisgIExJLnJlbnVtYmVyKCk7CisgIAorICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1RhaWxEdXBsaWNhdGlvbi5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9UYWlsRHVwbGljYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTViMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9UYWlsRHVwbGljYXRpb24uY3BwCkBAIC0wLDAgKzEsNjUzIEBACisvLz09PS0tIFRhaWxEdXBsaWNhdGlvbi5jcHAgLSBEdXBsaWNhdGUgYmxvY2tzIGludG8gcHJlZGVjZXNzb3JzJyB0YWlscyAtLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBkdXBsaWNhdGVzIGJhc2ljIGJsb2NrcyBlbmRpbmcgaW4gdW5jb25kaXRpb25hbCBicmFuY2hlcyBpbnRvCisvLyB0aGUgdGFpbHMgb2YgdGhlaXIgcHJlZGVjZXNzb3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAidGFpbGR1cGxpY2F0aW9uIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVTU0FVcGRhdGVyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1UYWlscyAgICAgLCAiTnVtYmVyIG9mIHRhaWxzIGR1cGxpY2F0ZWQiKTsKK1NUQVRJU1RJQyhOdW1UYWlsRHVwcyAgLCAiTnVtYmVyIG9mIHRhaWwgZHVwbGljYXRlZCBibG9ja3MiKTsKK1NUQVRJU1RJQyhOdW1JbnN0ckR1cHMgLCAiQWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgZHVlIHRvIHRhaWwgZHVwbGljYXRpb24iKTsKK1NUQVRJU1RJQyhOdW1EZWFkQmxvY2tzLCAiTnVtYmVyIG9mIGRlYWQgYmxvY2tzIHJlbW92ZWQiKTsKKworLy8gSGV1cmlzdGljIGZvciB0YWlsIGR1cGxpY2F0aW9uLgorc3RhdGljIGNsOjpvcHQ8dW5zaWduZWQ+CitUYWlsRHVwbGljYXRlU2l6ZSgidGFpbC1kdXAtc2l6ZSIsCisgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiTWF4aW11bSBpbnN0cnVjdGlvbnMgdG8gY29uc2lkZXIgdGFpbCBkdXBsaWNhdGluZyIpLAorICAgICAgICAgICAgICAgICAgY2w6OmluaXQoMiksIGNsOjpIaWRkZW4pOworCitzdGF0aWMgY2w6Om9wdDxib29sPgorVGFpbER1cFZlcmlmeSgidGFpbC1kdXAtdmVyaWZ5IiwKKyAgICAgICAgICAgICAgY2w6OmRlc2MoIlZlcmlmeSBzYW5pdHkgb2YgUEhJIGluc3RydWN0aW9ucyBkdXJpbmcgdGFpbGR1cCIpLAorICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSksIGNsOjpIaWRkZW4pOworCitzdGF0aWMgY2w6Om9wdDx1bnNpZ25lZD4KK1RhaWxEdXBMaW1pdCgidGFpbC1kdXAtbGltaXQiLCBjbDo6aW5pdCh+MFUpLCBjbDo6SGlkZGVuKTsKKwordHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8TWFjaGluZUJhc2ljQmxvY2sqLHVuc2lnbmVkPiA+IEF2YWlsYWJsZVZhbHNUeTsKKworbmFtZXNwYWNlIHsKKyAgLy8vIFRhaWxEdXBsaWNhdGVQYXNzIC0gUGVyZm9ybSB0YWlsIGR1cGxpY2F0aW9uLgorICBjbGFzcyBUYWlsRHVwbGljYXRlUGFzcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBib29sIFByZVJlZ0FsbG9jOworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUk7CisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJOworCisgICAgLy8gU1NBVXBkYXRlVlJzIC0gQSBsaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzIGZvciB3aGljaCB0byB1cGRhdGUgU1NBIGZvcm0uCisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE2PiBTU0FVcGRhdGVWUnM7CisKKyAgICAvLyBTU0FVcGRhdGVWYWxzIC0gRm9yIGVhY2ggdmlydHVhbCByZWdpc3RlciBpbiBTU0FVcGRhdGVWYWxzIGtlZXAgYSBsaXN0IG9mCisgICAgLy8gc291cmNlIHZpcnR1YWwgcmVnaXN0ZXJzLgorICAgIERlbnNlTWFwPHVuc2lnbmVkLCBBdmFpbGFibGVWYWxzVHk+IFNTQVVwZGF0ZVZhbHM7CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworICAgIGV4cGxpY2l0IFRhaWxEdXBsaWNhdGVQYXNzKGJvb2wgUHJlUkEpIDoKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpLCBQcmVSZWdBbGxvYyhQcmVSQSkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gIlRhaWwgRHVwbGljYXRpb24iOyB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIEFkZFNTQVVwZGF0ZUVudHJ5KHVuc2lnbmVkIE9yaWdSZWcsIHVuc2lnbmVkIE5ld1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisgICAgdm9pZCBQcm9jZXNzUEhJKE1hY2hpbmVJbnN0ciAqTUksIE1hY2hpbmVCYXNpY0Jsb2NrICpUYWlsQkIsCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkQkIsCisgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gJkxvY2FsVlJNYXAsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4sIDQ+ICZDb3BpZXMpOworICAgIHZvaWQgRHVwbGljYXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUYWlsQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gJkxvY2FsVlJNYXApOworICAgIHZvaWQgVXBkYXRlU3VjY2Vzc29yc1BISXMoTWFjaGluZUJhc2ljQmxvY2sgKkZyb21CQiwgYm9vbCBpc0RlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDg+ICZUREJCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0VmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgOD4gJlN1Y2NzKTsKKyAgICBib29sIFRhaWxEdXBsaWNhdGVCbG9ja3MoTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgYm9vbCBUYWlsRHVwbGljYXRlKE1hY2hpbmVCYXNpY0Jsb2NrICpUYWlsQkIsIE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgOD4gJlREQkJzLAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCAxNj4gJkNvcGllcyk7CisgICAgdm9pZCBSZW1vdmVEZWFkQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisgIH07CisKKyAgY2hhciBUYWlsRHVwbGljYXRlUGFzczo6SUQgPSAwOworfQorCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZVRhaWxEdXBsaWNhdGVQYXNzKGJvb2wgUHJlUmVnQWxsb2MpIHsKKyAgcmV0dXJuIG5ldyBUYWlsRHVwbGljYXRlUGFzcyhQcmVSZWdBbGxvYyk7Cit9CisKK2Jvb2wgVGFpbER1cGxpY2F0ZVBhc3M6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgVElJID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgIE1SSSA9ICZNRi5nZXRSZWdJbmZvKCk7CisgIE1NSSA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8TWFjaGluZU1vZHVsZUluZm8+KCk7CisKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIHdoaWxlIChUYWlsRHVwbGljYXRlQmxvY2tzKE1GKSkKKyAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKworICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworc3RhdGljIHZvaWQgVmVyaWZ5UEhJcyhNYWNoaW5lRnVuY3Rpb24gJk1GLCBib29sIENoZWNrRXh0cmEpIHsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSArK01GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gSTsKKyAgICBTbWFsbFNldFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDg+IFByZWRzKE1CQi0+cHJlZF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJCLT5wcmVkX2VuZCgpKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkgPSBNQkItPmJlZ2luKCk7CisgICAgd2hpbGUgKE1JICE9IE1CQi0+ZW5kKCkpIHsKKyAgICAgIGlmICghTUktPmlzUEhJKCkpCisgICAgICAgIGJyZWFrOworICAgICAgZm9yIChTbWFsbFNldFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqLCA4Pjo6aXRlcmF0b3IgUEkgPSBQcmVkcy5iZWdpbigpLAorICAgICAgICAgICAgIFBFID0gUHJlZHMuZW5kKCk7IFBJICE9IFBFOyArK1BJKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkQkIgPSAqUEk7CisgICAgICAgIGJvb2wgRm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7IGkgKz0gMikgeworICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQSElCQiA9IE1JLT5nZXRPcGVyYW5kKGkrMSkuZ2V0TUJCKCk7CisgICAgICAgICAgaWYgKFBISUJCID09IFByZWRCQikgeworICAgICAgICAgICAgRm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghRm91bmQpIHsKKyAgICAgICAgICBkYmdzKCkgPDwgIk1hbGZvcm1lZCBQSEkgaW4gQkIjIiA8PCBNQkItPmdldE51bWJlcigpIDw8ICI6ICIgPDwgKk1JOworICAgICAgICAgIGRiZ3MoKSA8PCAiICBtaXNzaW5nIGlucHV0IGZyb20gcHJlZGVjZXNzb3IgQkIjIgorICAgICAgICAgICAgICAgICA8PCBQcmVkQkItPmdldE51bWJlcigpIDw8ICdcbic7CisgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgaSArPSAyKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQSElCQiA9IE1JLT5nZXRPcGVyYW5kKGkrMSkuZ2V0TUJCKCk7CisgICAgICAgIGlmIChDaGVja0V4dHJhICYmICFQcmVkcy5jb3VudChQSElCQikpIHsKKyAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGhhcmQgZXJyb3IuCisgICAgICAgICAgZGJncygpIDw8ICJXYXJuaW5nOiBtYWxmb3JtZWQgUEhJIGluIEJCIyIgPDwgTUJCLT5nZXROdW1iZXIoKQorICAgICAgICAgICAgICAgICA8PCAiOiAiIDw8ICpNSTsKKyAgICAgICAgICBkYmdzKCkgPDwgIiAgZXh0cmEgaW5wdXQgZnJvbSBwcmVkZWNlc3NvciBCQiMiCisgICAgICAgICAgICAgICAgIDw8IFBISUJCLT5nZXROdW1iZXIoKSA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIGlmIChQSElCQi0+Z2V0TnVtYmVyKCkgPCAwKSB7CisgICAgICAgICAgZGJncygpIDw8ICJNYWxmb3JtZWQgUEhJIGluIEJCIyIgPDwgTUJCLT5nZXROdW1iZXIoKSA8PCAiOiAiIDw8ICpNSTsKKyAgICAgICAgICBkYmdzKCkgPDwgIiAgbm9uLWV4aXN0aW5nIEJCIyIgPDwgUEhJQkItPmdldE51bWJlcigpIDw8ICdcbic7CisgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKytNSTsKKyAgICB9CisgIH0KK30KKworLy8vIFRhaWxEdXBsaWNhdGVCbG9ja3MgLSBMb29rIGZvciBzbWFsbCBibG9ja3MgdGhhdCBhcmUgdW5jb25kaXRpb25hbGx5CisvLy8gYnJhbmNoZWQgdG8gYW5kIGRvIG5vdCBmYWxsIHRocm91Z2guIFRhaWwtZHVwbGljYXRlIHRoZWlyIGluc3RydWN0aW9ucworLy8vIGludG8gdGhlaXIgcHJlZGVjZXNzb3JzIHRvIGVsaW1pbmF0ZSAoZHluYW1pYykgYnJhbmNoZXMuCitib29sIFRhaWxEdXBsaWNhdGVQYXNzOjpUYWlsRHVwbGljYXRlQmxvY2tzKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgaWYgKFByZVJlZ0FsbG9jICYmIFRhaWxEdXBWZXJpZnkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuKioqIEJlZm9yZSB0YWlsLWR1cGxpY2F0aW5nXG4iKTsKKyAgICBWZXJpZnlQSElzKE1GLCB0cnVlKTsKKyAgfQorCisgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDg+IE5ld1BISXM7CisgIE1hY2hpbmVTU0FVcGRhdGVyIFNTQVVwZGF0ZShNRiwgJk5ld1BISXMpOworCisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gKytNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IEkrKzsKKworICAgIGlmIChOdW1UYWlscyA9PSBUYWlsRHVwTGltaXQpCisgICAgICBicmVhazsKKworICAgIC8vIE9ubHkgZHVwbGljYXRlIGJsb2NrcyB0aGF0IGVuZCB3aXRoIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMuCisgICAgaWYgKE1CQi0+Y2FuRmFsbFRocm91Z2goKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gU2F2ZSB0aGUgc3VjY2Vzc29ycyBsaXN0LgorICAgIFNtYWxsU2V0VmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgOD4gU3VjY3MoTUJCLT5zdWNjX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkItPnN1Y2NfZW5kKCkpOworCisgICAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA4PiBUREJCczsKKyAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCAxNj4gQ29waWVzOworICAgIGlmIChUYWlsRHVwbGljYXRlKE1CQiwgTUYsIFREQkJzLCBDb3BpZXMpKSB7CisgICAgICArK051bVRhaWxzOworCisgICAgICAvLyBUYWlsQkIncyBpbW1lZGlhdGUgc3VjY2Vzc29ycyBhcmUgbm93IHN1Y2Nlc3NvcnMgb2YgdGhvc2UgcHJlZGVjZXNzb3JzCisgICAgICAvLyB3aGljaCBkdXBsaWNhdGVkIFRhaWxCQi4gQWRkIHRoZSBwcmVkZWNlc3NvcnMgYXMgc291cmNlcyB0byB0aGUgUEhJCisgICAgICAvLyBpbnN0cnVjdGlvbnMuCisgICAgICBib29sIGlzRGVhZCA9IE1CQi0+cHJlZF9lbXB0eSgpOworICAgICAgaWYgKFByZVJlZ0FsbG9jKQorICAgICAgICBVcGRhdGVTdWNjZXNzb3JzUEhJcyhNQkIsIGlzRGVhZCwgVERCQnMsIFN1Y2NzKTsKKworICAgICAgLy8gSWYgaXQgaXMgZGVhZCwgcmVtb3ZlIGl0LgorICAgICAgaWYgKGlzRGVhZCkgeworICAgICAgICBOdW1JbnN0ckR1cHMgLT0gTUJCLT5zaXplKCk7CisgICAgICAgIFJlbW92ZURlYWRCbG9jayhNQkIpOworICAgICAgICArK051bURlYWRCbG9ja3M7CisgICAgICB9CisKKyAgICAgIC8vIFVwZGF0ZSBTU0EgZm9ybS4KKyAgICAgIGlmICghU1NBVXBkYXRlVlJzLmVtcHR5KCkpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNTQVVwZGF0ZVZScy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgdW5zaWduZWQgVlJlZyA9IFNTQVVwZGF0ZVZSc1tpXTsKKyAgICAgICAgICBTU0FVcGRhdGUuSW5pdGlhbGl6ZShWUmVnKTsKKworICAgICAgICAgIC8vIElmIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIGlzIHN0aWxsIGFyb3VuZCwgYWRkIGl0IGFzIGFuIGF2YWlsYWJsZQorICAgICAgICAgIC8vIHZhbHVlLgorICAgICAgICAgIE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBNUkktPmdldFZSZWdEZWYoVlJlZyk7CisgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkRlZkJCID0gMDsKKyAgICAgICAgICBpZiAoRGVmTUkpIHsKKyAgICAgICAgICAgIERlZkJCID0gRGVmTUktPmdldFBhcmVudCgpOworICAgICAgICAgICAgU1NBVXBkYXRlLkFkZEF2YWlsYWJsZVZhbHVlKERlZkJCLCBWUmVnKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBBZGQgdGhlIG5ldyB2cmVncyBhcyBhdmFpbGFibGUgdmFsdWVzLgorICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCBBdmFpbGFibGVWYWxzVHk+OjppdGVyYXRvciBMSSA9CisgICAgICAgICAgICBTU0FVcGRhdGVWYWxzLmZpbmQoVlJlZyk7ICAKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlZSA9IExJLT5zZWNvbmQuc2l6ZSgpOyBqICE9IGVlOyArK2opIHsKKyAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTcmNCQiA9IExJLT5zZWNvbmRbal0uZmlyc3Q7CisgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcgPSBMSS0+c2Vjb25kW2pdLnNlY29uZDsKKyAgICAgICAgICAgIFNTQVVwZGF0ZS5BZGRBdmFpbGFibGVWYWx1ZShTcmNCQiwgU3JjUmVnKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBSZXdyaXRlIHVzZXMgdGhhdCBhcmUgb3V0c2lkZSBvZiB0aGUgb3JpZ2luYWwgZGVmJ3MgYmxvY2suCisgICAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbzo6dXNlX2l0ZXJhdG9yIFVJID0gTVJJLT51c2VfYmVnaW4oVlJlZyk7CisgICAgICAgICAgd2hpbGUgKFVJICE9IE1SSS0+dXNlX2VuZCgpKSB7CisgICAgICAgICAgICBNYWNoaW5lT3BlcmFuZCAmVXNlTU8gPSBVSS5nZXRPcGVyYW5kKCk7CisgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gJipVSTsKKyAgICAgICAgICAgICsrVUk7CisgICAgICAgICAgICBpZiAoVXNlTUktPmdldFBhcmVudCgpID09IERlZkJCKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFNTQVVwZGF0ZS5SZXdyaXRlVXNlKFVzZU1PKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTU0FVcGRhdGVWUnMuY2xlYXIoKTsKKyAgICAgICAgU1NBVXBkYXRlVmFscy5jbGVhcigpOworICAgICAgfQorCisgICAgICAvLyBFbGltaW5hdGUgc29tZSBvZiB0aGUgY29waWVzIGluc2VydGVkIGJ5IHRhaWwgZHVwbGljYXRpb24gdG8gbWFpbnRhaW4KKyAgICAgIC8vIFNTQSBmb3JtLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvcGllcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIE1hY2hpbmVJbnN0ciAqQ29weSA9IENvcGllc1tpXTsKKyAgICAgICAgaWYgKCFDb3B5LT5pc0NvcHkoKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdW5zaWduZWQgRHN0ID0gQ29weS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAgICAgdW5zaWduZWQgU3JjID0gQ29weS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbzo6dXNlX2l0ZXJhdG9yIFVJID0gTVJJLT51c2VfYmVnaW4oU3JjKTsKKyAgICAgICAgaWYgKCsrVUkgPT0gTVJJLT51c2VfZW5kKCkpIHsKKyAgICAgICAgICAvLyBDb3B5IGlzIHRoZSBvbmx5IHVzZS4gRG8gdHJpdmlhbCBjb3B5IHByb3BhZ2F0aW9uIGhlcmUuCisgICAgICAgICAgTVJJLT5yZXBsYWNlUmVnV2l0aChEc3QsIFNyYyk7CisgICAgICAgICAgQ29weS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKFByZVJlZ0FsbG9jICYmIFRhaWxEdXBWZXJpZnkpCisgICAgICAgIFZlcmlmeVBISXMoTUYsIGZhbHNlKTsKKyAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCitzdGF0aWMgYm9vbCBpc0RlZkxpdmVPdXQodW5zaWduZWQgUmVnLCBNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJKSB7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6dXNlX2l0ZXJhdG9yIFVJID0gTVJJLT51c2VfYmVnaW4oUmVnKSwKKyAgICAgICAgIFVFID0gTVJJLT51c2VfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgTWFjaGluZUluc3RyICpVc2VNSSA9ICYqVUk7CisgICAgaWYgKFVzZU1JLT5nZXRQYXJlbnQoKSAhPSBCQikKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGdldFBISVNyY1JlZ09wSWR4KE1hY2hpbmVJbnN0ciAqTUksIE1hY2hpbmVCYXNpY0Jsb2NrICpTcmNCQikgeworICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgaSArPSAyKQorICAgIGlmIChNSS0+Z2V0T3BlcmFuZChpKzEpLmdldE1CQigpID09IFNyY0JCKQorICAgICAgcmV0dXJuIGk7CisgIHJldHVybiAwOworfQorCisvLy8gQWRkU1NBVXBkYXRlRW50cnkgLSBBZGQgYSBkZWZpbml0aW9uIGFuZCBzb3VyY2UgdmlydHVhbCByZWdpc3RlcnMgcGFpciBmb3IKKy8vLyBTU0EgdXBkYXRlLgordm9pZCBUYWlsRHVwbGljYXRlUGFzczo6QWRkU1NBVXBkYXRlRW50cnkodW5zaWduZWQgT3JpZ1JlZywgdW5zaWduZWQgTmV3UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSB7CisgIERlbnNlTWFwPHVuc2lnbmVkLCBBdmFpbGFibGVWYWxzVHk+OjppdGVyYXRvciBMST0gU1NBVXBkYXRlVmFscy5maW5kKE9yaWdSZWcpOworICBpZiAoTEkgIT0gU1NBVXBkYXRlVmFscy5lbmQoKSkKKyAgICBMSS0+c2Vjb25kLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihCQiwgTmV3UmVnKSk7CisgIGVsc2UgeworICAgIEF2YWlsYWJsZVZhbHNUeSBWYWxzOworICAgIFZhbHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEJCLCBOZXdSZWcpKTsKKyAgICBTU0FVcGRhdGVWYWxzLmluc2VydChzdGQ6Om1ha2VfcGFpcihPcmlnUmVnLCBWYWxzKSk7CisgICAgU1NBVXBkYXRlVlJzLnB1c2hfYmFjayhPcmlnUmVnKTsKKyAgfQorfQorCisvLy8gUHJvY2Vzc1BISSAtIFByb2Nlc3MgUEhJIG5vZGUgaW4gVGFpbEJCIGJ5IHR1cm5pbmcgaXQgaW50byBhIGNvcHkgaW4gUHJlZEJCLgorLy8vIFJlbWVtYmVyIHRoZSBzb3VyY2UgcmVnaXN0ZXIgdGhhdCdzIGNvbnRyaWJ1dGVkIGJ5IFByZWRCQiBhbmQgdXBkYXRlIFNTQQorLy8vIHVwZGF0ZSBtYXAuCit2b2lkIFRhaWxEdXBsaWNhdGVQYXNzOjpQcm9jZXNzUEhJKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUYWlsQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gJkxvY2FsVlJNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLHVuc2lnbmVkPiwgND4gJkNvcGllcykgeworICB1bnNpZ25lZCBEZWZSZWcgPSBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgU3JjT3BJZHggPSBnZXRQSElTcmNSZWdPcElkeChNSSwgUHJlZEJCKTsKKyAgYXNzZXJ0KFNyY09wSWR4ICYmICJVbmFibGUgdG8gZmluZCBtYXRjaGluZyBQSEkgc291cmNlPyIpOworICB1bnNpZ25lZCBTcmNSZWcgPSBNSS0+Z2V0T3BlcmFuZChTcmNPcElkeCkuZ2V0UmVnKCk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gTVJJLT5nZXRSZWdDbGFzcyhEZWZSZWcpOworICBMb2NhbFZSTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihEZWZSZWcsIFNyY1JlZykpOworCisgIC8vIEluc2VydCBhIGNvcHkgZnJvbSBzb3VyY2UgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2suIFRoZSBkZWYgcmVnaXN0ZXIgaXMgdGhlCisgIC8vIGF2YWlsYWJsZSB2YWx1ZSBsaXZlb3V0IG9mIHRoZSBibG9jay4KKyAgdW5zaWduZWQgTmV3RGVmID0gTVJJLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICBDb3BpZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE5ld0RlZiwgU3JjUmVnKSk7CisgIGlmIChpc0RlZkxpdmVPdXQoRGVmUmVnLCBUYWlsQkIsIE1SSSkpCisgICAgQWRkU1NBVXBkYXRlRW50cnkoRGVmUmVnLCBOZXdEZWYsIFByZWRCQik7CisKKyAgLy8gUmVtb3ZlIFByZWRCQiBmcm9tIHRoZSBQSEkgbm9kZS4KKyAgTUktPlJlbW92ZU9wZXJhbmQoU3JjT3BJZHgrMSk7CisgIE1JLT5SZW1vdmVPcGVyYW5kKFNyY09wSWR4KTsKKyAgaWYgKE1JLT5nZXROdW1PcGVyYW5kcygpID09IDEpCisgICAgTUktPmVyYXNlRnJvbVBhcmVudCgpOworfQorCisvLy8gRHVwbGljYXRlSW5zdHJ1Y3Rpb24gLSBEdXBsaWNhdGUgYSBUYWlsQkIgaW5zdHJ1Y3Rpb24gdG8gUHJlZEJCIGFuZCB1cGRhdGUKKy8vLyB0aGUgc291cmNlIG9wZXJhbmRzIGR1ZSB0byBlYXJsaWVyIFBISSB0cmFuc2xhdGlvbi4KK3ZvaWQgVGFpbER1cGxpY2F0ZVBhc3M6OkR1cGxpY2F0ZUluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlRhaWxCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8dW5zaWduZWQsIHVuc2lnbmVkPiAmTG9jYWxWUk1hcCkgeworICBNYWNoaW5lSW5zdHIgKk5ld01JID0gVElJLT5kdXBsaWNhdGUoTUksIE1GKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5ld01JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE5ld01JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmICghUmVnIHx8IFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoTU8uaXNEZWYoKSkgeworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBNUkktPmdldFJlZ0NsYXNzKFJlZyk7CisgICAgICB1bnNpZ25lZCBOZXdSZWcgPSBNUkktPmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgICAgICBNTy5zZXRSZWcoTmV3UmVnKTsKKyAgICAgIExvY2FsVlJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFJlZywgTmV3UmVnKSk7CisgICAgICBpZiAoaXNEZWZMaXZlT3V0KFJlZywgVGFpbEJCLCBNUkkpKQorICAgICAgICBBZGRTU0FVcGRhdGVFbnRyeShSZWcsIE5ld1JlZywgUHJlZEJCKTsKKyAgICB9IGVsc2UgeworICAgICAgRGVuc2VNYXA8dW5zaWduZWQsIHVuc2lnbmVkPjo6aXRlcmF0b3IgVkkgPSBMb2NhbFZSTWFwLmZpbmQoUmVnKTsKKyAgICAgIGlmIChWSSAhPSBMb2NhbFZSTWFwLmVuZCgpKQorICAgICAgICBNTy5zZXRSZWcoVkktPnNlY29uZCk7CisgICAgfQorICB9CisgIFByZWRCQi0+aW5zZXJ0KFByZWRCQi0+ZW5kKCksIE5ld01JKTsKK30KKworLy8vIFVwZGF0ZVN1Y2Nlc3NvcnNQSElzIC0gQWZ0ZXIgRnJvbUJCIGlzIHRhaWwgZHVwbGljYXRlZCBpbnRvIGl0cyBwcmVkZWNlc3NvcgorLy8vIGJsb2NrcywgdGhlIHN1Y2Nlc3NvcnMgaGF2ZSBnYWluZWQgbmV3IHByZWRlY2Vzc29ycy4gVXBkYXRlIHRoZSBQSEkKKy8vLyBpbnN0cnVjdGlvbnMgaW4gdGhlbSBhY2NvcmRpbmdseS4KK3ZvaWQKK1RhaWxEdXBsaWNhdGVQYXNzOjpVcGRhdGVTdWNjZXNzb3JzUEhJcyhNYWNoaW5lQmFzaWNCbG9jayAqRnJvbUJCLCBib29sIGlzRGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDg+ICZUREJCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosOD4gJlN1Y2NzKSB7CisgIGZvciAoU21hbGxTZXRWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA4Pjo6aXRlcmF0b3IgU0kgPSBTdWNjcy5iZWdpbigpLAorICAgICAgICAgU0UgPSBTdWNjcy5lbmQoKTsgU0kgIT0gU0U7ICsrU0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY0JCID0gKlNJOworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gU3VjY0JCLT5iZWdpbigpLCBFRSA9IFN1Y2NCQi0+ZW5kKCk7CisgICAgICAgICBJSSAhPSBFRTsgKytJSSkgeworICAgICAgaWYgKCFJSS0+aXNQSEkoKSkKKyAgICAgICAgYnJlYWs7CisgICAgICB1bnNpZ25lZCBJZHggPSAwOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IElJLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7IGkgKz0gMikgeworICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJSS0+Z2V0T3BlcmFuZChpKzEpOworICAgICAgICBpZiAoTU8uZ2V0TUJCKCkgPT0gRnJvbUJCKSB7CisgICAgICAgICAgSWR4ID0gaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBhc3NlcnQoSWR4ICE9IDApOworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PMCA9IElJLT5nZXRPcGVyYW5kKElkeCk7CisgICAgICB1bnNpZ25lZCBSZWcgPSBNTzAuZ2V0UmVnKCk7CisgICAgICBpZiAoaXNEZWFkKSB7CisgICAgICAgIC8vIEZvbGRlZCBpbnRvIHRoZSBwcmV2aW91cyBCQi4KKyAgICAgICAgLy8gVGhlcmUgY291bGQgYmUgZHVwbGljYXRlIHBoaSBzb3VyY2UgZW50cmllcy4gRklYTUU6IFNob3VsZCBzZGlzZWwKKyAgICAgICAgLy8gb3IgZWFybGllciBwYXNzIGZpeGVkIHRoaXM/CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IElJLT5nZXROdW1PcGVyYW5kcygpLTI7IGkgIT0gSWR4OyBpIC09IDIpIHsKKyAgICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJSS0+Z2V0T3BlcmFuZChpKzEpOworICAgICAgICAgIGlmIChNTy5nZXRNQkIoKSA9PSBGcm9tQkIpIHsKKyAgICAgICAgICAgIElJLT5SZW1vdmVPcGVyYW5kKGkrMSk7CisgICAgICAgICAgICBJSS0+UmVtb3ZlT3BlcmFuZChpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZQorICAgICAgICBJZHggPSAwOworCisgICAgICAvLyBJZiBJZHggaXMgc2V0LCB0aGUgb3BlcmFuZHMgYXQgSWR4IGFuZCBJZHgrMSBtdXN0IGJlIHJlbW92ZWQuCisgICAgICAvLyBXZSByZXVzZSB0aGUgbG9jYXRpb24gdG8gYXZvaWQgZXhwZW5zaXZlIFJlbW92ZU9wZXJhbmQgY2FsbHMuCisKKyAgICAgIERlbnNlTWFwPHVuc2lnbmVkLEF2YWlsYWJsZVZhbHNUeT46Oml0ZXJhdG9yIExJPVNTQVVwZGF0ZVZhbHMuZmluZChSZWcpOworICAgICAgaWYgKExJICE9IFNTQVVwZGF0ZVZhbHMuZW5kKCkpIHsKKyAgICAgICAgLy8gVGhpcyByZWdpc3RlciBpcyBkZWZpbmVkIGluIHRoZSB0YWlsIGJsb2NrLgorICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlZSA9IExJLT5zZWNvbmQuc2l6ZSgpOyBqICE9IGVlOyArK2opIHsKKyAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3JjQkIgPSBMSS0+c2Vjb25kW2pdLmZpcnN0OworICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZyA9IExJLT5zZWNvbmRbal0uc2Vjb25kOworICAgICAgICAgIGlmIChJZHggIT0gMCkgeworICAgICAgICAgICAgSUktPmdldE9wZXJhbmQoSWR4KS5zZXRSZWcoU3JjUmVnKTsKKyAgICAgICAgICAgIElJLT5nZXRPcGVyYW5kKElkeCsxKS5zZXRNQkIoU3JjQkIpOworICAgICAgICAgICAgSWR4ID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhTcmNSZWcsIGZhbHNlKSk7CisgICAgICAgICAgICBJSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTUJCKFNyY0JCKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBMaXZlIGluIHRhaWwgYmxvY2ssIG11c3QgYWxzbyBiZSBsaXZlIGluIHByZWRlY2Vzc29ycy4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZWUgPSBUREJCcy5zaXplKCk7IGogIT0gZWU7ICsraikgeworICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTcmNCQiA9IFREQkJzW2pdOworICAgICAgICAgIGlmIChJZHggIT0gMCkgeworICAgICAgICAgICAgSUktPmdldE9wZXJhbmQoSWR4KS5zZXRSZWcoUmVnKTsKKyAgICAgICAgICAgIElJLT5nZXRPcGVyYW5kKElkeCsxKS5zZXRNQkIoU3JjQkIpOworICAgICAgICAgICAgSWR4ID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhSZWcsIGZhbHNlKSk7CisgICAgICAgICAgICBJSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTUJCKFNyY0JCKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoSWR4ICE9IDApIHsKKyAgICAgICAgSUktPlJlbW92ZU9wZXJhbmQoSWR4KzEpOworICAgICAgICBJSS0+UmVtb3ZlT3BlcmFuZChJZHgpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gVGFpbER1cGxpY2F0ZSAtIElmIGl0IGlzIHByb2ZpdGFibGUsIGR1cGxpY2F0ZSBUYWlsQkIncyBjb250ZW50cyBpbiBlYWNoCisvLy8gb2YgaXRzIHByZWRlY2Vzc29ycy4KK2Jvb2wKK1RhaWxEdXBsaWNhdGVQYXNzOjpUYWlsRHVwbGljYXRlKE1hY2hpbmVCYXNpY0Jsb2NrICpUYWlsQkIsIE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDg+ICZUREJCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDE2PiAmQ29waWVzKSB7CisgIC8vIFNldCB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gZHVwbGljYXRlLCB3aXRoIGEgZGVmYXVsdAorICAvLyBvZiBvbmUgbGVzcyB0aGFuIHRoZSB0YWlsLW1lcmdlIHRocmVzaG9sZC4gV2hlbiBvcHRpbWl6aW5nIGZvciBzaXplLAorICAvLyBkdXBsaWNhdGUgb25seSBvbmUsIGJlY2F1c2Ugb25lIGJyYW5jaCBpbnN0cnVjdGlvbiBjYW4gYmUgZWxpbWluYXRlZCB0bworICAvLyBjb21wZW5zYXRlIGZvciB0aGUgZHVwbGljYXRpb24uCisgIHVuc2lnbmVkIE1heER1cGxpY2F0ZUNvdW50OworICBpZiAoTUYuZ2V0RnVuY3Rpb24oKS0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6T3B0aW1pemVGb3JTaXplKSkKKyAgICBNYXhEdXBsaWNhdGVDb3VudCA9IDE7CisgIGVsc2UKKyAgICBNYXhEdXBsaWNhdGVDb3VudCA9IFRhaWxEdXBsaWNhdGVTaXplOworCisgIGlmIChQcmVSZWdBbGxvYykgeworICAgICAgLy8gUHJlLXJlZ2FsbG9jIHRhaWwgZHVwbGljYXRpb24gaHVydHMgY29tcGlsZSB0aW1lIGFuZCBkb2Vzbid0IGhlbHAKKyAgICAgIC8vIG11Y2ggZXhjZXB0IGZvciBpbmRpcmVjdCBicmFuY2hlcy4KKyAgICBpZiAoVGFpbEJCLT5lbXB0eSgpIHx8ICFUYWlsQkItPmJhY2soKS5nZXREZXNjKCkuaXNJbmRpcmVjdEJyYW5jaCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIElmIHRoZSB0YXJnZXQgaGFzIGhhcmR3YXJlIGJyYW5jaCBwcmVkaWN0aW9uIHRoYXQgY2FuIGhhbmRsZSBpbmRpcmVjdAorICAgIC8vIGJyYW5jaGVzLCBkdXBsaWNhdGluZyB0aGVtIGNhbiBvZnRlbiBtYWtlIHRoZW0gcHJlZGljdGFibGUgd2hlbiB0aGVyZQorICAgIC8vIGFyZSBjb21tb24gcGF0aHMgdGhyb3VnaCB0aGUgY29kZS4gIFRoZSBsaW1pdCBuZWVkcyB0byBiZSBoaWdoIGVub3VnaAorICAgIC8vIHRvIGFsbG93IHVuZG9pbmcgdGhlIGVmZmVjdHMgb2YgdGFpbCBtZXJnaW5nIGFuZCBvdGhlciBvcHRpbWl6YXRpb25zCisgICAgLy8gdGhhdCByZWFycmFuZ2UgdGhlIHByZWRlY2Vzc29ycyBvZiB0aGUgaW5kaXJlY3QgYnJhbmNoLgorICAgIE1heER1cGxpY2F0ZUNvdW50ID0gMjA7CisgIH0KKworICAvLyBEb24ndCB0cnkgdG8gdGFpbC1kdXBsaWNhdGUgc2luZ2xlLWJsb2NrIGxvb3BzLgorICBpZiAoVGFpbEJCLT5pc1N1Y2Nlc3NvcihUYWlsQkIpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBDaGVjayB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBibG9jayB0byBkZXRlcm1pbmUgd2hldGhlciB0YWlsLWR1cGxpY2F0aW9uCisgIC8vIGlzIGludmFsaWQgb3IgdW5saWtlbHkgdG8gYmUgcHJvZml0YWJsZS4KKyAgdW5zaWduZWQgSW5zdHJDb3VudCA9IDA7CisgIGJvb2wgSGFzQ2FsbCA9IGZhbHNlOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gVGFpbEJCLT5iZWdpbigpOworICAgICAgIEkgIT0gVGFpbEJCLT5lbmQoKTsgKytJKSB7CisgICAgLy8gTm9uLWR1cGxpY2FibGUgdGhpbmdzIHNob3VsZG4ndCBiZSB0YWlsLWR1cGxpY2F0ZWQuCisgICAgaWYgKEktPmdldERlc2MoKS5pc05vdER1cGxpY2FibGUoKSkgcmV0dXJuIGZhbHNlOworICAgIC8vIERvIG5vdCBkdXBsaWNhdGUgJ3JldHVybicgaW5zdHJ1Y3Rpb25zIGlmIHRoaXMgaXMgYSBwcmUtcmVnYWxsb2MgcnVuLgorICAgIC8vIEEgcmV0dXJuIG1heSBleHBhbmQgaW50byBhIGxvdCBtb3JlIGluc3RydWN0aW9ucyAoZS5nLiByZWxvYWQgb2YgY2FsbGVlCisgICAgLy8gc2F2ZWQgcmVnaXN0ZXJzKSBhZnRlciBQRUkuCisgICAgaWYgKFByZVJlZ0FsbG9jICYmIEktPmdldERlc2MoKS5pc1JldHVybigpKSByZXR1cm4gZmFsc2U7CisgICAgLy8gRG9uJ3QgZHVwbGljYXRlIG1vcmUgdGhhbiB0aGUgdGhyZXNob2xkLgorICAgIGlmIChJbnN0ckNvdW50ID09IE1heER1cGxpY2F0ZUNvdW50KSByZXR1cm4gZmFsc2U7CisgICAgLy8gUmVtZW1iZXIgaWYgd2Ugc2F3IGEgY2FsbC4KKyAgICBpZiAoSS0+Z2V0RGVzYygpLmlzQ2FsbCgpKSBIYXNDYWxsID0gdHJ1ZTsKKyAgICBpZiAoIUktPmlzUEhJKCkgJiYgIUktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgSW5zdHJDb3VudCArPSAxOworICB9CisgIC8vIEhldXJpc3RpY2FsbHksIGRvbid0IHRhaWwtZHVwbGljYXRlIGNhbGxzIGlmIGl0IHdvdWxkIGV4cGFuZCBjb2RlIHNpemUsCisgIC8vIGFzIGl0J3MgbGVzcyBsaWtlbHkgdG8gYmUgd29ydGggdGhlIGV4dHJhIGNvc3QuCisgIGlmIChJbnN0ckNvdW50ID4gMSAmJiBIYXNDYWxsKQorICAgIHJldHVybiBmYWxzZTsKKworICBERUJVRyhkYmdzKCkgPDwgIlxuKioqIFRhaWwtZHVwbGljYXRpbmcgQkIjIiA8PCBUYWlsQkItPmdldE51bWJlcigpIDw8ICdcbicpOworCisgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHVuaXF1ZSBwcmVkZWNlc3NvcnMgYW5kIHRhaWwtZHVwbGljYXRlIHRoaXMKKyAgLy8gYmxvY2sgaW50byB0aGVtLCBpZiBwb3NzaWJsZS4gQ29weWluZyB0aGUgbGlzdCBhaGVhZCBvZiB0aW1lIGFsc28KKyAgLy8gYXZvaWRzIHRyb3VibGUgd2l0aCB0aGUgcHJlZGVjZXNzb3IgbGlzdCByZWFsbG9jYXRpbmcuCisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBTbWFsbFNldFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayosIDg+IFByZWRzKFRhaWxCQi0+cHJlZF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhaWxCQi0+cHJlZF9lbmQoKSk7CisgIGZvciAoU21hbGxTZXRWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKiwgOD46Oml0ZXJhdG9yIFBJID0gUHJlZHMuYmVnaW4oKSwKKyAgICAgICBQRSA9IFByZWRzLmVuZCgpOyBQSSAhPSBQRTsgKytQSSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkQkIgPSAqUEk7CisKKyAgICBhc3NlcnQoVGFpbEJCICE9IFByZWRCQiAmJgorICAgICAgICAgICAiU2luZ2xlLWJsb2NrIGxvb3Agc2hvdWxkIGhhdmUgYmVlbiByZWplY3RlZCBlYXJsaWVyISIpOworICAgIGlmIChQcmVkQkItPnN1Y2Nfc2l6ZSgpID4gMSkgY29udGludWU7CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZFRCQiwgKlByZWRGQkI7CisgICAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDQ+IFByZWRDb25kOworICAgIGlmIChUSUktPkFuYWx5emVCcmFuY2goKlByZWRCQiwgUHJlZFRCQiwgUHJlZEZCQiwgUHJlZENvbmQsIHRydWUpKQorICAgICAgY29udGludWU7CisgICAgaWYgKCFQcmVkQ29uZC5lbXB0eSgpKQorICAgICAgY29udGludWU7CisgICAgLy8gRUggZWRnZXMgYXJlIGlnbm9yZWQgYnkgQW5hbHl6ZUJyYW5jaC4KKyAgICBpZiAoUHJlZEJCLT5zdWNjX3NpemUoKSAhPSAxKQorICAgICAgY29udGludWU7CisgICAgLy8gRG9uJ3QgZHVwbGljYXRlIGludG8gYSBmYWxsLXRocm91Z2ggcHJlZGVjZXNzb3IgKGF0IGxlYXN0IGZvciBub3cpLgorICAgIGlmIChQcmVkQkItPmlzTGF5b3V0U3VjY2Vzc29yKFRhaWxCQikgJiYgUHJlZEJCLT5jYW5GYWxsVGhyb3VnaCgpKQorICAgICAgY29udGludWU7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuVGFpbC1kdXBsaWNhdGluZyBpbnRvIFByZWRCQjogIiA8PCAqUHJlZEJCCisgICAgICAgICAgICAgICAgIDw8ICJGcm9tIFN1Y2M6ICIgPDwgKlRhaWxCQik7CisKKyAgICBUREJCcy5wdXNoX2JhY2soUHJlZEJCKTsKKworICAgIC8vIFJlbW92ZSBQcmVkQkIncyB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KKyAgICBUSUktPlJlbW92ZUJyYW5jaCgqUHJlZEJCKTsKKworICAgIC8vIENsb25lIHRoZSBjb250ZW50cyBvZiBUYWlsQkIgaW50byBQcmVkQkIuCisgICAgRGVuc2VNYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBMb2NhbFZSTWFwOworICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4sIDQ+IENvcHlJbmZvczsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IFRhaWxCQi0+YmVnaW4oKTsKKyAgICB3aGlsZSAoSSAhPSBUYWlsQkItPmVuZCgpKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gJipJOworICAgICAgKytJOworICAgICAgaWYgKE1JLT5pc1BISSgpKSB7CisgICAgICAgIC8vIFJlcGxhY2UgdGhlIHVzZXMgb2YgdGhlIGRlZiBvZiB0aGUgUEhJIHdpdGggdGhlIHJlZ2lzdGVyIGNvbWluZworICAgICAgICAvLyBmcm9tIFByZWRCQi4KKyAgICAgICAgUHJvY2Vzc1BISShNSSwgVGFpbEJCLCBQcmVkQkIsIExvY2FsVlJNYXAsIENvcHlJbmZvcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBSZXBsYWNlIGRlZiBvZiB2aXJ0dWFsIHJlZ2lzdGVycyB3aXRoIG5ldyByZWdpc3RlcnMsIGFuZCB1cGRhdGUKKyAgICAgICAgLy8gdXNlcyB3aXRoIFBISSBzb3VyY2UgcmVnaXN0ZXIgb3IgdGhlIG5ldyByZWdpc3RlcnMuCisgICAgICAgIER1cGxpY2F0ZUluc3RydWN0aW9uKE1JLCBUYWlsQkIsIFByZWRCQiwgTUYsIExvY2FsVlJNYXApOworICAgICAgfQorICAgIH0KKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTG9jID0gUHJlZEJCLT5nZXRGaXJzdFRlcm1pbmF0b3IoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ29weUluZm9zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIENvcGllcy5wdXNoX2JhY2soQnVpbGRNSSgqUHJlZEJCLCBMb2MsIERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5SW5mb3NbaV0uZmlyc3QpLmFkZFJlZyhDb3B5SW5mb3NbaV0uc2Vjb25kKSk7CisgICAgfQorICAgIE51bUluc3RyRHVwcyArPSBUYWlsQkItPnNpemUoKSAtIDE7IC8vIHN1YnRyYWN0IG9uZSBmb3IgcmVtb3ZlZCBicmFuY2gKKworICAgIC8vIFVwZGF0ZSB0aGUgQ0ZHLgorICAgIFByZWRCQi0+cmVtb3ZlU3VjY2Vzc29yKFByZWRCQi0+c3VjY19iZWdpbigpKTsKKyAgICBhc3NlcnQoUHJlZEJCLT5zdWNjX2VtcHR5KCkgJiYKKyAgICAgICAgICAgIlRhaWxEdXBsaWNhdGUgY2FsbGVkIG9uIGJsb2NrIHdpdGggbXVsdGlwbGUgc3VjY2Vzc29ycyEiKTsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpzdWNjX2l0ZXJhdG9yIEkgPSBUYWlsQkItPnN1Y2NfYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IFRhaWxCQi0+c3VjY19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBQcmVkQkItPmFkZFN1Y2Nlc3NvcigqSSk7CisKKyAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICArK051bVRhaWxEdXBzOworICB9CisKKyAgLy8gSWYgVGFpbEJCIHdhcyBkdXBsaWNhdGVkIGludG8gYWxsIGl0cyBwcmVkZWNlc3NvcnMgZXhjZXB0IGZvciB0aGUgcHJpb3IKKyAgLy8gYmxvY2ssIHdoaWNoIGZhbGxzIHRocm91Z2ggdW5jb25kaXRpb25hbGx5LCBtb3ZlIHRoZSBjb250ZW50cyBvZiB0aGlzCisgIC8vIGJsb2NrIGludG8gdGhlIHByaW9yIGJsb2NrLgorICBNYWNoaW5lQmFzaWNCbG9jayAqUHJldkJCID0gcHJpb3IoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihUYWlsQkIpKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlByaW9yVEJCID0gMCwgKlByaW9yRkJCID0gMDsKKyAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDQ+IFByaW9yQ29uZDsKKyAgYm9vbCBQcmlvclVuQW5hbHl6YWJsZSA9CisgICAgVElJLT5BbmFseXplQnJhbmNoKCpQcmV2QkIsIFByaW9yVEJCLCBQcmlvckZCQiwgUHJpb3JDb25kLCB0cnVlKTsKKyAgLy8gVGhpcyBoYXMgdG8gY2hlY2sgUHJldkJCLT5zdWNjX3NpemUoKSBiZWNhdXNlIEVIIGVkZ2VzIGFyZSBpZ25vcmVkIGJ5CisgIC8vIEFuYWx5emVCcmFuY2guCisgIGlmICghUHJpb3JVbkFuYWx5emFibGUgJiYgUHJpb3JDb25kLmVtcHR5KCkgJiYgIVByaW9yVEJCICYmCisgICAgICBUYWlsQkItPnByZWRfc2l6ZSgpID09IDEgJiYgUHJldkJCLT5zdWNjX3NpemUoKSA9PSAxICYmCisgICAgICAhVGFpbEJCLT5oYXNBZGRyZXNzVGFrZW4oKSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiXG5NZXJnaW5nIGludG8gYmxvY2s6ICIgPDwgKlByZXZCQgorICAgICAgICAgIDw8ICJGcm9tIE1CQjogIiA8PCAqVGFpbEJCKTsKKyAgICBpZiAoUHJlUmVnQWxsb2MpIHsKKyAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gTG9jYWxWUk1hcDsKKyAgICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4sIDQ+IENvcHlJbmZvczsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gVGFpbEJCLT5iZWdpbigpOworICAgICAgLy8gUHJvY2VzcyBQSEkgaW5zdHJ1Y3Rpb25zIGZpcnN0LgorICAgICAgd2hpbGUgKEkgIT0gVGFpbEJCLT5lbmQoKSAmJiBJLT5pc1BISSgpKSB7CisgICAgICAgIC8vIFJlcGxhY2UgdGhlIHVzZXMgb2YgdGhlIGRlZiBvZiB0aGUgUEhJIHdpdGggdGhlIHJlZ2lzdGVyIGNvbWluZworICAgICAgICAvLyBmcm9tIFByZWRCQi4KKyAgICAgICAgTWFjaGluZUluc3RyICpNSSA9ICYqSSsrOworICAgICAgICBQcm9jZXNzUEhJKE1JLCBUYWlsQkIsIFByZXZCQiwgTG9jYWxWUk1hcCwgQ29weUluZm9zKTsKKyAgICAgICAgaWYgKE1JLT5nZXRQYXJlbnQoKSkKKyAgICAgICAgICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICB9CisKKyAgICAgIC8vIE5vdyBjb3B5IHRoZSBub24tUEhJIGluc3RydWN0aW9ucy4KKyAgICAgIHdoaWxlIChJICE9IFRhaWxCQi0+ZW5kKCkpIHsKKyAgICAgICAgLy8gUmVwbGFjZSBkZWYgb2YgdmlydHVhbCByZWdpc3RlcnMgd2l0aCBuZXcgcmVnaXN0ZXJzLCBhbmQgdXBkYXRlCisgICAgICAgIC8vIHVzZXMgd2l0aCBQSEkgc291cmNlIHJlZ2lzdGVyIG9yIHRoZSBuZXcgcmVnaXN0ZXJzLgorICAgICAgICBNYWNoaW5lSW5zdHIgKk1JID0gJipJKys7CisgICAgICAgIER1cGxpY2F0ZUluc3RydWN0aW9uKE1JLCBUYWlsQkIsIFByZXZCQiwgTUYsIExvY2FsVlJNYXApOworICAgICAgICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICB9CisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTG9jID0gUHJldkJCLT5nZXRGaXJzdFRlcm1pbmF0b3IoKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDb3B5SW5mb3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBDb3BpZXMucHVzaF9iYWNrKEJ1aWxkTUkoKlByZXZCQiwgTG9jLCBEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlJbmZvc1tpXS5maXJzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoQ29weUluZm9zW2ldLnNlY29uZCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBObyBQSElzIHRvIHdvcnJ5IGFib3V0LCBqdXN0IHNwbGljZSB0aGUgaW5zdHJ1Y3Rpb25zIG92ZXIuCisgICAgICBQcmV2QkItPnNwbGljZShQcmV2QkItPmVuZCgpLCBUYWlsQkIsIFRhaWxCQi0+YmVnaW4oKSwgVGFpbEJCLT5lbmQoKSk7CisgICAgfQorICAgIFByZXZCQi0+cmVtb3ZlU3VjY2Vzc29yKFByZXZCQi0+c3VjY19iZWdpbigpKTsKKyAgICBhc3NlcnQoUHJldkJCLT5zdWNjX2VtcHR5KCkpOworICAgIFByZXZCQi0+dHJhbnNmZXJTdWNjZXNzb3JzKFRhaWxCQik7CisgICAgVERCQnMucHVzaF9iYWNrKFByZXZCQik7CisgICAgQ2hhbmdlZCA9IHRydWU7CisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIFJlbW92ZURlYWRCbG9jayAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGRlYWQgbWFjaGluZSBiYXNpYyBibG9jayBmcm9tIHRoZQorLy8vIGZ1bmN0aW9uLCB1cGRhdGluZyB0aGUgQ0ZHLgordm9pZCBUYWlsRHVwbGljYXRlUGFzczo6UmVtb3ZlRGVhZEJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgYXNzZXJ0KE1CQi0+cHJlZF9lbXB0eSgpICYmICJNQkIgbXVzdCBiZSBkZWFkISIpOworICBERUJVRyhkYmdzKCkgPDwgIlxuUmVtb3ZpbmcgTUJCOiAiIDw8ICpNQkIpOworCisgIC8vIFJlbW92ZSBhbGwgc3VjY2Vzc29ycy4KKyAgd2hpbGUgKCFNQkItPnN1Y2NfZW1wdHkoKSkKKyAgICBNQkItPnJlbW92ZVN1Y2Nlc3NvcihNQkItPnN1Y2NfZW5kKCktMSk7CisKKyAgLy8gUmVtb3ZlIHRoZSBibG9jay4KKyAgTUJCLT5lcmFzZUZyb21QYXJlbnQoKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vVGFyZ2V0SW5zdHJJbmZvSW1wbC5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9UYXJnZXRJbnN0ckluZm9JbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTRhMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vVGFyZ2V0SW5zdHJJbmZvSW1wbC5jcHAKQEAgLTAsMCArMSw0MjEgQEAKKy8vPT09LS0gVGFyZ2V0SW5zdHJJbmZvSW1wbC5jcHAgLSBUYXJnZXQgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFRhcmdldEluc3RySW5mb0ltcGwgY2xhc3MsIGl0IGp1c3QgcHJvdmlkZXMgZGVmYXVsdAorLy8gaW1wbGVtZW50YXRpb25zIG9mIHZhcmlvdXMgbWV0aG9kcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bvc3RSQUhhemFyZFJlY29nbml6ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBSZXBsYWNlVGFpbFdpdGhCcmFuY2hUbyAtIERlbGV0ZSB0aGUgaW5zdHJ1Y3Rpb24gT2xkSW5zdCBhbmQgZXZlcnl0aGluZworLy8vIGFmdGVyIGl0LCByZXBsYWNpbmcgaXQgd2l0aCBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byBOZXdEZXN0Lgordm9pZAorVGFyZ2V0SW5zdHJJbmZvSW1wbDo6UmVwbGFjZVRhaWxXaXRoQnJhbmNoVG8oTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3RGVzdCkgY29uc3QgeworICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gVGFpbC0+Z2V0UGFyZW50KCk7CisKKyAgLy8gUmVtb3ZlIGFsbCB0aGUgb2xkIHN1Y2Nlc3NvcnMgb2YgTUJCIGZyb20gdGhlIENGRy4KKyAgd2hpbGUgKCFNQkItPnN1Y2NfZW1wdHkoKSkKKyAgICBNQkItPnJlbW92ZVN1Y2Nlc3NvcihNQkItPnN1Y2NfYmVnaW4oKSk7CisKKyAgLy8gUmVtb3ZlIGFsbCB0aGUgZGVhZCBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgZW5kIG9mIE1CQi4KKyAgTUJCLT5lcmFzZShUYWlsLCBNQkItPmVuZCgpKTsKKworICAvLyBJZiBNQkIgaXNuJ3QgaW1tZWRpYXRlbHkgYmVmb3JlIE1CQiwgaW5zZXJ0IGEgYnJhbmNoIHRvIGl0LgorICBpZiAoKytNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKE1CQikgIT0gTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihOZXdEZXN0KSkKKyAgICBJbnNlcnRCcmFuY2goKk1CQiwgTmV3RGVzdCwgMCwgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDA+KCksCisgICAgICAgICAgICAgICAgIFRhaWwtPmdldERlYnVnTG9jKCkpOworICBNQkItPmFkZFN1Y2Nlc3NvcihOZXdEZXN0KTsKK30KKworLy8gY29tbXV0ZUluc3RydWN0aW9uIC0gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QganVzdCBleGNoYW5nZXMKKy8vIHRoZSB0d28gb3BlcmFuZHMgcmV0dXJuZWQgYnkgZmluZENvbW11dGVkT3BJbmRpY2VzLgorTWFjaGluZUluc3RyICpUYXJnZXRJbnN0ckluZm9JbXBsOjpjb21tdXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTmV3TUkpIGNvbnN0IHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS0+Z2V0RGVzYygpOworICBib29sIEhhc0RlZiA9IFRJRC5nZXROdW1EZWZzKCk7CisgIGlmIChIYXNEZWYgJiYgIU1JLT5nZXRPcGVyYW5kKDApLmlzUmVnKCkpCisgICAgLy8gTm8gaWRlYSBob3cgdG8gY29tbXV0ZSB0aGlzIGluc3RydWN0aW9uLiBUYXJnZXQgc2hvdWxkIGltcGxlbWVudCBpdHMgb3duLgorICAgIHJldHVybiAwOworICB1bnNpZ25lZCBJZHgxLCBJZHgyOworICBpZiAoIWZpbmRDb21tdXRlZE9wSW5kaWNlcyhNSSwgSWR4MSwgSWR4MikpIHsKKyAgICBzdGQ6OnN0cmluZyBtc2c7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIE1zZyhtc2cpOworICAgIE1zZyA8PCAiRG9uJ3Qga25vdyBob3cgdG8gY29tbXV0ZTogIiA8PCAqTUk7CisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKE1zZy5zdHIoKSk7CisgIH0KKworICBhc3NlcnQoTUktPmdldE9wZXJhbmQoSWR4MSkuaXNSZWcoKSAmJiBNSS0+Z2V0T3BlcmFuZChJZHgyKS5pc1JlZygpICYmCisgICAgICAgICAiVGhpcyBvbmx5IGtub3dzIGhvdyB0byBjb21tdXRlIHJlZ2lzdGVyIG9wZXJhbmRzIHNvIGZhciIpOworICB1bnNpZ25lZCBSZWcxID0gTUktPmdldE9wZXJhbmQoSWR4MSkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIFJlZzIgPSBNSS0+Z2V0T3BlcmFuZChJZHgyKS5nZXRSZWcoKTsKKyAgYm9vbCBSZWcxSXNLaWxsID0gTUktPmdldE9wZXJhbmQoSWR4MSkuaXNLaWxsKCk7CisgIGJvb2wgUmVnMklzS2lsbCA9IE1JLT5nZXRPcGVyYW5kKElkeDIpLmlzS2lsbCgpOworICBib29sIENoYW5nZVJlZzAgPSBmYWxzZTsKKyAgaWYgKEhhc0RlZiAmJiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBSZWcxKSB7CisgICAgLy8gTXVzdCBiZSB0d28gYWRkcmVzcyBpbnN0cnVjdGlvbiEKKyAgICBhc3NlcnQoTUktPmdldERlc2MoKS5nZXRPcGVyYW5kQ29uc3RyYWludCgwLCBUT0k6OlRJRURfVE8pICYmCisgICAgICAgICAgICJFeHBlY3RpbmcgYSB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbiEiKTsKKyAgICBSZWcySXNLaWxsID0gZmFsc2U7CisgICAgQ2hhbmdlUmVnMCA9IHRydWU7CisgIH0KKworICBpZiAoTmV3TUkpIHsKKyAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdHJ1Y3Rpb24uCisgICAgdW5zaWduZWQgUmVnMCA9IEhhc0RlZgorICAgICAgPyAoQ2hhbmdlUmVnMCA/IFJlZzIgOiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkgOiAwOworICAgIGJvb2wgUmVnMElzRGVhZCA9IEhhc0RlZiA/IE1JLT5nZXRPcGVyYW5kKDApLmlzRGVhZCgpIDogZmFsc2U7CisgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICAgIGlmIChIYXNEZWYpCisgICAgICByZXR1cm4gQnVpbGRNSShNRiwgTUktPmdldERlYnVnTG9jKCksIE1JLT5nZXREZXNjKCkpCisgICAgICAgIC5hZGRSZWcoUmVnMCwgUmVnU3RhdGU6OkRlZmluZSB8IGdldERlYWRSZWdTdGF0ZShSZWcwSXNEZWFkKSkKKyAgICAgICAgLmFkZFJlZyhSZWcyLCBnZXRLaWxsUmVnU3RhdGUoUmVnMklzS2lsbCkpCisgICAgICAgIC5hZGRSZWcoUmVnMSwgZ2V0S2lsbFJlZ1N0YXRlKFJlZzJJc0tpbGwpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQnVpbGRNSShNRiwgTUktPmdldERlYnVnTG9jKCksIE1JLT5nZXREZXNjKCkpCisgICAgICAgIC5hZGRSZWcoUmVnMiwgZ2V0S2lsbFJlZ1N0YXRlKFJlZzJJc0tpbGwpKQorICAgICAgICAuYWRkUmVnKFJlZzEsIGdldEtpbGxSZWdTdGF0ZShSZWcySXNLaWxsKSk7CisgIH0KKworICBpZiAoQ2hhbmdlUmVnMCkKKyAgICBNSS0+Z2V0T3BlcmFuZCgwKS5zZXRSZWcoUmVnMik7CisgIE1JLT5nZXRPcGVyYW5kKElkeDIpLnNldFJlZyhSZWcxKTsKKyAgTUktPmdldE9wZXJhbmQoSWR4MSkuc2V0UmVnKFJlZzIpOworICBNSS0+Z2V0T3BlcmFuZChJZHgyKS5zZXRJc0tpbGwoUmVnMUlzS2lsbCk7CisgIE1JLT5nZXRPcGVyYW5kKElkeDEpLnNldElzS2lsbChSZWcySXNLaWxsKTsKKyAgcmV0dXJuIE1JOworfQorCisvLy8gZmluZENvbW11dGVkT3BJbmRpY2VzIC0gSWYgc3BlY2lmaWVkIE1JIGlzIGNvbW11dGFibGUsIHJldHVybiB0aGUgdHdvCisvLy8gb3BlcmFuZCBpbmRpY2VzIHRoYXQgd291bGQgc3dhcCB2YWx1ZS4gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uCisvLy8gaXMgbm90IGluIGEgZm9ybSB3aGljaCB0aGlzIHJvdXRpbmUgdW5kZXJzdGFuZHMuCitib29sIFRhcmdldEluc3RySW5mb0ltcGw6OmZpbmRDb21tdXRlZE9wSW5kaWNlcyhNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlNyY09wSWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcmNPcElkeDIpIGNvbnN0IHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS0+Z2V0RGVzYygpOworICBpZiAoIVRJRC5pc0NvbW11dGFibGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIC8vIFRoaXMgYXNzdW1lcyB2MCA9IG9wIHYxLCB2MiBhbmQgY29tbXV0aW5nIHdvdWxkIHN3YXAgdjEgYW5kIHYyLiBJZiB0aGlzCisgIC8vIGlzIG5vdCB0cnVlLCB0aGVuIHRoZSB0YXJnZXQgbXVzdCBpbXBsZW1lbnQgdGhpcy4KKyAgU3JjT3BJZHgxID0gVElELmdldE51bURlZnMoKTsKKyAgU3JjT3BJZHgyID0gU3JjT3BJZHgxICsgMTsKKyAgaWYgKCFNSS0+Z2V0T3BlcmFuZChTcmNPcElkeDEpLmlzUmVnKCkgfHwKKyAgICAgICFNSS0+Z2V0T3BlcmFuZChTcmNPcElkeDIpLmlzUmVnKCkpCisgICAgLy8gTm8gaWRlYS4KKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgVGFyZ2V0SW5zdHJJbmZvSW1wbDo6UHJlZGljYXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZQcmVkKSBjb25zdCB7CisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgIGlmICghVElELmlzUHJlZGljYWJsZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGZvciAodW5zaWduZWQgaiA9IDAsIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKFRJRC5PcEluZm9baV0uaXNQcmVkaWNhdGUoKSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoTU8uaXNSZWcoKSkgeworICAgICAgICBNTy5zZXRSZWcoUHJlZFtqXS5nZXRSZWcoKSk7CisgICAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChNTy5pc0ltbSgpKSB7CisgICAgICAgIE1PLnNldEltbShQcmVkW2pdLmdldEltbSgpKTsKKyAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKE1PLmlzTUJCKCkpIHsKKyAgICAgICAgTU8uc2V0TUJCKFByZWRbal0uZ2V0TUJCKCkpOworICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgICsrajsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKK3ZvaWQgVGFyZ2V0SW5zdHJJbmZvSW1wbDo6cmVNYXRlcmlhbGl6ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3ViSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAqT3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3QgeworICBNYWNoaW5lSW5zdHIgKk1JID0gTUJCLmdldFBhcmVudCgpLT5DbG9uZU1hY2hpbmVJbnN0cihPcmlnKTsKKyAgTUktPnN1YnN0aXR1dGVSZWdpc3RlcihNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSwgRGVzdFJlZywgU3ViSWR4LCBUUkkpOworICBNQkIuaW5zZXJ0KEksIE1JKTsKK30KKworYm9vbCBUYXJnZXRJbnN0ckluZm9JbXBsOjpwcm9kdWNlU2FtZVZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkxKSBjb25zdCB7CisgIHJldHVybiBNSTAtPmlzSWRlbnRpY2FsVG8oTUkxLCBNYWNoaW5lSW5zdHI6Oklnbm9yZVZSZWdEZWZzKTsKK30KKworTWFjaGluZUluc3RyICpUYXJnZXRJbnN0ckluZm9JbXBsOjpkdXBsaWNhdGUoTWFjaGluZUluc3RyICpPcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBhc3NlcnQoIU9yaWctPmdldERlc2MoKS5pc05vdER1cGxpY2FibGUoKSAmJgorICAgICAgICAgIkluc3RydWN0aW9uIGNhbm5vdCBiZSBkdXBsaWNhdGVkIik7CisgIHJldHVybiBNRi5DbG9uZU1hY2hpbmVJbnN0cihPcmlnKTsKK30KKworLy8gSWYgdGhlIENPUFkgaW5zdHJ1Y3Rpb24gaW4gTUkgY2FuIGJlIGZvbGRlZCB0byBhIHN0YWNrIG9wZXJhdGlvbiwgcmV0dXJuCisvLyB0aGUgcmVnaXN0ZXIgY2xhc3MgdG8gdXNlLgorc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmNhbkZvbGRDb3B5KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRm9sZElkeCkgeworICBhc3NlcnQoTUktPmlzQ29weSgpICYmICJNSSBtdXN0IGJlIGEgQ09QWSBpbnN0cnVjdGlvbiIpOworICBpZiAoTUktPmdldE51bU9wZXJhbmRzKCkgIT0gMikKKyAgICByZXR1cm4gMDsKKyAgYXNzZXJ0KEZvbGRJZHg8MiAmJiAiRm9sZElkeCByZWZlcnMgbm8gbm9uZXhpc3RlbnQgb3BlcmFuZCIpOworCisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZGb2xkT3AgPSBNSS0+Z2V0T3BlcmFuZChGb2xkSWR4KTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJkxpdmVPcCA9IE1JLT5nZXRPcGVyYW5kKDEtRm9sZElkeCk7CisKKyAgaWYgKEZvbGRPcC5nZXRTdWJSZWcoKSB8fCBMaXZlT3AuZ2V0U3ViUmVnKCkpCisgICAgcmV0dXJuIDA7CisKKyAgdW5zaWduZWQgRm9sZFJlZyA9IEZvbGRPcC5nZXRSZWcoKTsKKyAgdW5zaWduZWQgTGl2ZVJlZyA9IExpdmVPcC5nZXRSZWcoKTsKKworICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihGb2xkUmVnKSAmJgorICAgICAgICAgIkNhbm5vdCBmb2xkIHBoeXNyZWdzIik7CisKKyAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJID0gTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0UmVnSW5mbygpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IE1SSS5nZXRSZWdDbGFzcyhGb2xkUmVnKTsKKworICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoTGl2ZU9wLmdldFJlZygpKSkKKyAgICByZXR1cm4gUkMtPmNvbnRhaW5zKExpdmVPcC5nZXRSZWcoKSkgPyBSQyA6IDA7CisKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqTGl2ZVJDID0gTVJJLmdldFJlZ0NsYXNzKExpdmVSZWcpOworICBpZiAoUkMgPT0gTGl2ZVJDIHx8IFJDLT5oYXNTdWJDbGFzcyhMaXZlUkMpKQorICAgIHJldHVybiBSQzsKKworICAvLyBGSVhNRTogQWxsb3cgZm9sZGluZyB3aGVuIHJlZ2lzdGVyIGNsYXNzZXMgYXJlIG1lbW9yeSBjb21wYXRpYmxlLgorICByZXR1cm4gMDsKK30KKworYm9vbCBUYXJnZXRJbnN0ckluZm9JbXBsOjoKK2NhbkZvbGRNZW1vcnlPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZPcHMpIGNvbnN0IHsKKyAgcmV0dXJuIE1JLT5pc0NvcHkoKSAmJiBPcHMuc2l6ZSgpID09IDEgJiYgY2FuRm9sZENvcHkoTUksIE9wc1swXSk7Cit9CisKKy8vLyBmb2xkTWVtb3J5T3BlcmFuZCAtIEF0dGVtcHQgdG8gZm9sZCBhIGxvYWQgb3Igc3RvcmUgb2YgdGhlIHNwZWNpZmllZCBzdGFjaworLy8vIHNsb3QgaW50byB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmFuZChzKS4KKy8vLyBJZiB0aGlzIGlzIHBvc3NpYmxlLCBhIG5ldyBpbnN0cnVjdGlvbiBpcyByZXR1cm5lZCB3aXRoIHRoZSBzcGVjaWZpZWQKKy8vLyBvcGVyYW5kIGZvbGRlZCwgb3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuIFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yCisvLy8gcmVtb3ZpbmcgdGhlIG9sZCBpbnN0cnVjdGlvbiBhbmQgYWRkaW5nIHRoZSBuZXcgb25lIGluIHRoZSBpbnN0cnVjdGlvbgorLy8vIHN0cmVhbS4KK01hY2hpbmVJbnN0cioKK1RhcmdldEluc3RySW5mbzo6Zm9sZE1lbW9yeU9wZXJhbmQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGSSkgY29uc3QgeworICB1bnNpZ25lZCBGbGFncyA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoTUktPmdldE9wZXJhbmQoT3BzW2ldKS5pc0RlZigpKQorICAgICAgRmxhZ3MgfD0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PU3RvcmU7CisgICAgZWxzZQorICAgICAgRmxhZ3MgfD0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTG9hZDsKKworICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTUktPmdldFBhcmVudCgpOworICBhc3NlcnQoTUJCICYmICJmb2xkTWVtb3J5T3BlcmFuZCBuZWVkcyBhbiBpbnNlcnRlZCBpbnN0cnVjdGlvbiIpOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi0+Z2V0UGFyZW50KCk7CisKKyAgLy8gQXNrIHRoZSB0YXJnZXQgdG8gZG8gdGhlIGFjdHVhbCBmb2xkaW5nLgorICBpZiAoTWFjaGluZUluc3RyICpOZXdNSSA9IGZvbGRNZW1vcnlPcGVyYW5kSW1wbChNRiwgTUksIE9wcywgRkkpKSB7CisgICAgLy8gQWRkIGEgbWVtb3J5IG9wZXJhbmQsIGZvbGRNZW1vcnlPcGVyYW5kSW1wbCBkb2Vzbid0IGRvIHRoYXQuCisgICAgYXNzZXJ0KCghKEZsYWdzICYgTWFjaGluZU1lbU9wZXJhbmQ6Ok1PU3RvcmUpIHx8CisgICAgICAgICAgICBOZXdNSS0+Z2V0RGVzYygpLm1heVN0b3JlKCkpICYmCisgICAgICAgICAgICJGb2xkZWQgYSBkZWYgdG8gYSBub24tc3RvcmUhIik7CisgICAgYXNzZXJ0KCghKEZsYWdzICYgTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTG9hZCkgfHwKKyAgICAgICAgICAgIE5ld01JLT5nZXREZXNjKCkubWF5TG9hZCgpKSAmJgorICAgICAgICAgICAiRm9sZGVkIGEgdXNlIHRvIGEgbm9uLWxvYWQhIik7CisgICAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAmTUZJID0gKk1GLmdldEZyYW1lSW5mbygpOworICAgIGFzc2VydChNRkkuZ2V0T2JqZWN0T2Zmc2V0KEZJKSAhPSAtMSk7CisgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgICBNRi5nZXRNYWNoaW5lTWVtT3BlcmFuZChQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhGSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncywgLypPZmZzZXQ9Ki8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZJLmdldE9iamVjdFNpemUoRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZJLmdldE9iamVjdEFsaWdubWVudChGSSkpOworICAgIE5ld01JLT5hZGRNZW1PcGVyYW5kKE1GLCBNTU8pOworCisgICAgLy8gRklYTUU6IGNoYW5nZSBmb2xkTWVtb3J5T3BlcmFuZEltcGwgc2VtYW50aWNzIHRvIGFsc28gaW5zZXJ0IE5ld01JLgorICAgIHJldHVybiBNQkItPmluc2VydChNSSwgTmV3TUkpOworICB9CisKKyAgLy8gU3RyYWlnaHQgQ09QWSBtYXkgZm9sZCBhcyBsb2FkL3N0b3JlLgorICBpZiAoIU1JLT5pc0NvcHkoKSB8fCBPcHMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIDA7CisKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBjYW5Gb2xkQ29weShNSSwgT3BzWzBdKTsKKyAgaWYgKCFSQykKKyAgICByZXR1cm4gMDsKKworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZCgxLU9wc1swXSk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBQb3MgPSBNSTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBNRi5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKworICBpZiAoRmxhZ3MgPT0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PU3RvcmUpCisgICAgc3RvcmVSZWdUb1N0YWNrU2xvdCgqTUJCLCBQb3MsIE1PLmdldFJlZygpLCBNTy5pc0tpbGwoKSwgRkksIFJDLCBUUkkpOworICBlbHNlCisgICAgbG9hZFJlZ0Zyb21TdGFja1Nsb3QoKk1CQiwgUG9zLCBNTy5nZXRSZWcoKSwgRkksIFJDLCBUUkkpOworICByZXR1cm4gLS1Qb3M7Cit9CisKKy8vLyBmb2xkTWVtb3J5T3BlcmFuZCAtIFNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24gZXhjZXB0IGl0IGFsbG93cyBmb2xkaW5nCisvLy8gb2YgYW55IGxvYWQgYW5kIHN0b3JlIGZyb20gLyB0byBhbnkgYWRkcmVzcywgbm90IGp1c3QgZnJvbSBhIHNwZWNpZmljCisvLy8gc3RhY2sgc2xvdC4KK01hY2hpbmVJbnN0cioKK1RhcmdldEluc3RySW5mbzo6Zm9sZE1lbW9yeU9wZXJhbmQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciogTG9hZE1JKSBjb25zdCB7CisgIGFzc2VydChMb2FkTUktPmdldERlc2MoKS5jYW5Gb2xkQXNMb2FkKCkgJiYgIkxvYWRNSSBpc24ndCBmb2xkYWJsZSEiKTsKKyNpZm5kZWYgTkRFQlVHCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBhc3NlcnQoTUktPmdldE9wZXJhbmQoT3BzW2ldKS5pc1VzZSgpICYmICJGb2xkaW5nIGxvYWQgaW50byBkZWYhIik7CisjZW5kaWYKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9ICpNSS0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworCisgIC8vIEFzayB0aGUgdGFyZ2V0IHRvIGRvIHRoZSBhY3R1YWwgZm9sZGluZy4KKyAgTWFjaGluZUluc3RyICpOZXdNSSA9IGZvbGRNZW1vcnlPcGVyYW5kSW1wbChNRiwgTUksIE9wcywgTG9hZE1JKTsKKyAgaWYgKCFOZXdNSSkgcmV0dXJuIDA7CisKKyAgTmV3TUkgPSBNQkIuaW5zZXJ0KE1JLCBOZXdNSSk7CisKKyAgLy8gQ29weSB0aGUgbWVtb3BlcmFuZHMgZnJvbSB0aGUgbG9hZCB0byB0aGUgZm9sZGVkIGluc3RydWN0aW9uLgorICBOZXdNSS0+c2V0TWVtUmVmcyhMb2FkTUktPm1lbW9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIExvYWRNSS0+bWVtb3BlcmFuZHNfZW5kKCkpOworCisgIHJldHVybiBOZXdNSTsKK30KKworYm9vbCBUYXJnZXRJbnN0ckluZm86OgoraXNSZWFsbHlUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlR2VuZXJpYyhjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICpBQSkgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1JLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSA9IE1GLmdldFJlZ0luZm8oKTsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkgPSAqVE0uZ2V0SW5zdHJJbmZvKCk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJID0gKlRNLmdldFJlZ2lzdGVySW5mbygpOworCisgIC8vIEEgbG9hZCBmcm9tIGEgZml4ZWQgc3RhY2sgc2xvdCBjYW4gYmUgcmVtYXRlcmlhbGl6ZWQuIFRoaXMgbWF5IGJlCisgIC8vIHJlZHVuZGFudCB3aXRoIHN1YnNlcXVlbnQgY2hlY2tzLCBidXQgaXQncyB0YXJnZXQtaW5kZXBlbmRlbnQsCisgIC8vIHNpbXBsZSwgYW5kIGEgY29tbW9uIGNhc2UuCisgIGludCBGcmFtZUlkeCA9IDA7CisgIGlmIChUSUkuaXNMb2FkRnJvbVN0YWNrU2xvdChNSSwgRnJhbWVJZHgpICYmCisgICAgICBNRi5nZXRGcmFtZUluZm8oKS0+aXNJbW11dGFibGVPYmplY3RJbmRleChGcmFtZUlkeCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS0+Z2V0RGVzYygpOworCisgIC8vIEF2b2lkIGluc3RydWN0aW9ucyBvYnZpb3VzbHkgdW5zYWZlIGZvciByZW1hdC4KKyAgaWYgKFRJRC5oYXNVbm1vZGVsZWRTaWRlRWZmZWN0cygpIHx8IFRJRC5pc05vdER1cGxpY2FibGUoKSB8fAorICAgICAgVElELm1heVN0b3JlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEF2b2lkIGluc3RydWN0aW9ucyB3aGljaCBsb2FkIGZyb20gcG90ZW50aWFsbHkgdmFyeWluZyBtZW1vcnkuCisgIGlmIChUSUQubWF5TG9hZCgpICYmICFNSS0+aXNJbnZhcmlhbnRMb2FkKEFBKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgYW55IG9mIHRoZSByZWdpc3RlcnMgYWNjZXNzZWQgYXJlIG5vbi1jb25zdGFudCwgY29uc2VydmF0aXZlbHkgYXNzdW1lCisgIC8vIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgcmVtYXRlcmlhbGl6YWJsZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSkgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKFJlZyA9PSAwKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBDaGVjayBmb3IgYSB3ZWxsLWJlaGF2ZWQgcGh5c2ljYWwgcmVnaXN0ZXIuCisgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpIHsKKyAgICAgIGlmIChNTy5pc1VzZSgpKSB7CisgICAgICAgIC8vIElmIHRoZSBwaHlzcmVnIGhhcyBubyBkZWZzIGFueXdoZXJlLCBpdCdzIGp1c3QgYW4gYW1iaWVudCByZWdpc3RlcgorICAgICAgICAvLyBhbmQgd2UgY2FuIGZyZWVseSBtb3ZlIGl0cyB1c2VzLiBBbHRlcm5hdGl2ZWx5LCBpZiBpdCdzIGFsbG9jYXRhYmxlLAorICAgICAgICAvLyBpdCBjb3VsZCBnZXQgYWxsb2NhdGVkIHRvIHNvbWV0aGluZyB3aXRoIGEgZGVmIGR1cmluZyBhbGxvY2F0aW9uLgorICAgICAgICBpZiAoIU1SSS5kZWZfZW1wdHkoUmVnKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIEJpdFZlY3RvciBBbGxvY2F0YWJsZVJlZ3MgPSBUUkkuZ2V0QWxsb2NhdGFibGVTZXQoTUYsIDApOworICAgICAgICBpZiAoQWxsb2NhdGFibGVSZWdzLnRlc3QoUmVnKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIENoZWNrIGZvciBhIGRlZiBhbW9uZyB0aGUgcmVnaXN0ZXIncyBhbGlhc2VzIHRvby4KKyAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQWxpYXMgPSBUUkkuZ2V0QWxpYXNTZXQoUmVnKTsgKkFsaWFzOyArK0FsaWFzKSB7CisgICAgICAgICAgdW5zaWduZWQgQWxpYXNSZWcgPSAqQWxpYXM7CisgICAgICAgICAgaWYgKCFNUkkuZGVmX2VtcHR5KEFsaWFzUmVnKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBpZiAoQWxsb2NhdGFibGVSZWdzLnRlc3QoQWxpYXNSZWcpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBBIHBoeXNyZWcgZGVmLiBXZSBjYW4ndCByZW1hdCBpdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gT25seSBhbGxvdyBvbmUgdmlydHVhbC1yZWdpc3RlciBkZWYsIGFuZCB0aGF0IGluIHRoZSBmaXJzdCBvcGVyYW5kLgorICAgIGlmIChNTy5pc0RlZigpICE9IChpID09IDApKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRm9yIHRoZSBkZWYsIGl0IHNob3VsZCBiZSB0aGUgb25seSBkZWYgb2YgdGhhdCByZWdpc3Rlci4KKyAgICBpZiAoTU8uaXNEZWYoKSAmJiAobGx2bTo6bmV4dChNUkkuZGVmX2JlZ2luKFJlZykpICE9IE1SSS5kZWZfZW5kKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgTVJJLmlzTGl2ZUluKFJlZykpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRG9uJ3QgYWxsb3cgYW55IHZpcnR1YWwtcmVnaXN0ZXIgdXNlcy4gUmVtYXR0aW5nIGFuIGluc3RydWN0aW9uIHdpdGgKKyAgICAvLyB2aXJ0dWFsIHJlZ2lzdGVyIHVzZXMgd291bGQgbGVuZ3RoIHRoZSBsaXZlIHJhbmdlcyBvZiB0aGUgdXNlcywgd2hpY2gKKyAgICAvLyBpcyBub3QgbmVjZXNzYXJpbHkgYSBnb29kIGlkZWEsIGNlcnRhaW5seSBub3QgInRyaXZpYWwiLgorICAgIGlmIChNTy5pc1VzZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRXZlcnl0aGluZyBjaGVja2VkIG91dC4KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1NjaGVkdWxpbmdCb3VuZGFyeSAtIFRlc3QgaWYgdGhlIGdpdmVuIGluc3RydWN0aW9uIHNob3VsZCBiZQorLy8vIGNvbnNpZGVyZWQgYSBzY2hlZHVsaW5nIGJvdW5kYXJ5LiBUaGlzIHByaW1hcmlseSBpbmNsdWRlcyBsYWJlbHMKKy8vLyBhbmQgdGVybWluYXRvcnMuCitib29sIFRhcmdldEluc3RySW5mb0ltcGw6OmlzU2NoZWR1bGluZ0JvdW5kYXJ5KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0eworICAvLyBUZXJtaW5hdG9ycyBhbmQgbGFiZWxzIGNhbid0IGJlIHNjaGVkdWxlZCBhcm91bmQuCisgIGlmIChNSS0+Z2V0RGVzYygpLmlzVGVybWluYXRvcigpIHx8IE1JLT5pc0xhYmVsKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gRG9uJ3QgYXR0ZW1wdCB0byBzY2hlZHVsZSBhcm91bmQgYW55IGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcworICAvLyBhIHN0YWNrLW9yaWVudGVkIHBvaW50ZXIsIGFzIGl0J3MgdW5saWtlbHkgdG8gYmUgcHJvZml0YWJsZS4gVGhpcworICAvLyBzYXZlcyBjb21waWxlIHRpbWUsIGJlY2F1c2UgaXQgZG9lc24ndCByZXF1aXJlIGV2ZXJ5IHNpbmdsZQorICAvLyBzdGFjayBzbG90IHJlZmVyZW5jZSB0byBkZXBlbmQgb24gdGhlIGluc3RydWN0aW9uIHRoYXQgZG9lcyB0aGUKKyAgLy8gbW9kaWZpY2F0aW9uLgorICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gKk1GLmdldFRhcmdldCgpLmdldFRhcmdldExvd2VyaW5nKCk7CisgIGlmIChNSS0+ZGVmaW5lc1JlZ2lzdGVyKFRMSS5nZXRTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUoKSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIENyZWF0ZVRhcmdldFBvc3RSQUhhemFyZFJlY29nbml6ZXIuCitTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgKlRhcmdldEluc3RySW5mb0ltcGw6OgorQ3JlYXRlVGFyZ2V0UG9zdFJBSGF6YXJkUmVjb2duaXplcihjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgJklJKSBjb25zdCB7CisgIHJldHVybiAoU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICopbmV3IFBvc3RSQUhhemFyZFJlY29nbml6ZXIoSUkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vVHdvQWRkcmVzc0luc3RydWN0aW9uUGFzcy5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9Ud29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQwMjViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vVHdvQWRkcmVzc0luc3RydWN0aW9uUGFzcy5jcHAKQEAgLTAsMCArMSwxNDk3IEBACisvLz09PS0tIFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3MuY3BwIC0gVHdvLUFkZHJlc3MgaW5zdHJ1Y3Rpb24gcGFzcyAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBUd29BZGRyZXNzIGluc3RydWN0aW9uIHBhc3Mgd2hpY2ggaXMgdXNlZAorLy8gYnkgbW9zdCByZWdpc3RlciBhbGxvY2F0b3JzLiBUd28tQWRkcmVzcyBpbnN0cnVjdGlvbnMgYXJlIHJld3JpdHRlbgorLy8gZnJvbToKKy8vCisvLyAgICAgQSA9IEIgb3AgQworLy8KKy8vIHRvOgorLy8KKy8vICAgICBBID0gQgorLy8gICAgIEEgb3A9IEMKKy8vCisvLyBOb3RlIHRoYXQgaWYgYSByZWdpc3RlciBhbGxvY2F0b3IgY2hvb3NlcyB0byB1c2UgdGhpcyBwYXNzLCB0aGF0IGl0CisvLyBoYXMgdG8gYmUgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgbm9uLVNTQSBuYXR1cmUgb2YgdGhlc2UgcmV3cml0dGVuCisvLyB2aXJ0dWFsIHJlZ2lzdGVycy4KKy8vCisvLyBJdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBkdXBsaWNhdGUgb3BlcmFuZCBvZiB0aGUgdHdvCisvLyBhZGRyZXNzIGluc3RydWN0aW9uIGlzIHJlbW92ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJ0d29hZGRyaW5zdHIiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1Ud29BZGRyZXNzSW5zdHJzLCAiTnVtYmVyIG9mIHR3by1hZGRyZXNzIGluc3RydWN0aW9ucyIpOworU1RBVElTVElDKE51bUNvbW11dGVkICAgICAgICAsICJOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGNvbW11dGVkIHRvIGNvYWxlc2NlIik7CitTVEFUSVNUSUMoTnVtQWdnckNvbW11dGVkICAgICwgIk51bWJlciBvZiBpbnN0cnVjdGlvbnMgYWdncmVzc2l2ZWx5IGNvbW11dGVkIik7CitTVEFUSVNUSUMoTnVtQ29udmVydGVkVG8zQWRkciwgIk51bWJlciBvZiBpbnN0cnVjdGlvbnMgcHJvbW90ZWQgdG8gMy1hZGRyZXNzIik7CitTVEFUSVNUSUMoTnVtM0FkZHJTdW5rLCAgICAgICAgIk51bWJlciBvZiAzLWFkZHJlc3MgaW5zdHJ1Y3Rpb25zIHN1bmsiKTsKK1NUQVRJU1RJQyhOdW1SZU1hdHMsICAgICAgICAgICAiTnVtYmVyIG9mIGluc3RydWN0aW9ucyByZS1tYXRlcmlhbGl6ZWQiKTsKK1NUQVRJU1RJQyhOdW1EZWxldGVzLCAgICAgICAgICAiTnVtYmVyIG9mIGRlYWQgaW5zdHJ1Y3Rpb25zIGRlbGV0ZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgVHdvQWRkcmVzc0luc3RydWN0aW9uUGFzcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisgICAgTGl2ZVZhcmlhYmxlcyAqTFY7CisgICAgQWxpYXNBbmFseXNpcyAqQUE7CisKKyAgICAvLyBEaXN0YW5jZU1hcCAtIEtlZXAgdHJhY2sgdGhlIGRpc3RhbmNlIG9mIGEgTUkgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisgICAgLy8gY3VycmVudCBiYXNpYyBibG9jay4KKyAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD4gRGlzdGFuY2VNYXA7CisKKyAgICAvLyBTcmNSZWdNYXAgLSBBIG1hcCBmcm9tIHZpcnR1YWwgcmVnaXN0ZXJzIHRvIHBoeXNpY2FsIHJlZ2lzdGVycyB3aGljaAorICAgIC8vIGFyZSBsaWtlbHkgdGFyZ2V0cyB0byBiZSBjb2FsZXNjZWQgdG8gZHVlIHRvIGNvcGllcyBmcm9tIHBoeXNpY2FsCisgICAgLy8gcmVnaXN0ZXJzIHRvIHZpcnR1YWwgcmVnaXN0ZXJzLiBlLmcuIHYxMDI0ID0gbW92ZSByMC4KKyAgICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+IFNyY1JlZ01hcDsKKworICAgIC8vIERzdFJlZ01hcCAtIEEgbWFwIGZyb20gdmlydHVhbCByZWdpc3RlcnMgdG8gcGh5c2ljYWwgcmVnaXN0ZXJzIHdoaWNoCisgICAgLy8gYXJlIGxpa2VseSB0YXJnZXRzIHRvIGJlIGNvYWxlc2NlZCB0byBkdWUgdG8gY29waWVzIHRvIHBoeXNpY2FsCisgICAgLy8gcmVnaXN0ZXJzIGZyb20gdmlydHVhbCByZWdpc3RlcnMuIGUuZy4gcjEgPSBtb3ZlIHYxMDI0LgorICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gRHN0UmVnTWFwOworCisgICAgLy8vIFJlZ1NlcXVlbmNlcyAtIEtlZXAgdHJhY2sgdGhlIGxpc3Qgb2YgUkVHX1NFUVVFTkNFIGluc3RydWN0aW9ucyBzZWVuCisgICAgLy8vIGR1cmluZyB0aGUgaW5pdGlhbCB3YWxrIG9mIHRoZSBtYWNoaW5lIGZ1bmN0aW9uLgorICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDE2PiBSZWdTZXF1ZW5jZXM7CisKKyAgICBib29sIFNpbmszQWRkckluc3RydWN0aW9uKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgT2xkUG9zKTsKKworICAgIGJvb2wgaXNQcm9maXRhYmxlVG9SZU1hdCh1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lSW5zdHIgKkRlZk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCB1bnNpZ25lZCBMb2MpOworCisgICAgYm9vbCBOb1VzZUFmdGVyTGFzdERlZih1bnNpZ25lZCBSZWcsIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIHVuc2lnbmVkIERpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTGFzdERlZik7CisKKyAgICBNYWNoaW5lSW5zdHIgKkZpbmRMYXN0VXNlSW5NQkIodW5zaWduZWQgUmVnLCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaXN0KTsKKworICAgIGJvb2wgaXNQcm9maXRhYmxlVG9Db21tdXRlKHVuc2lnbmVkIHJlZ0IsIHVuc2lnbmVkIHJlZ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaXN0KTsKKworICAgIGJvb2wgQ29tbXV0ZUluc3RydWN0aW9uKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciAmbWJiaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWdCLCB1bnNpZ25lZCBSZWdDLCB1bnNpZ25lZCBEaXN0KTsKKworICAgIGJvb2wgaXNQcm9maXRhYmxlVG9Db252M0FkZHIodW5zaWduZWQgUmVnQSk7CisKKyAgICBib29sIENvbnZlcnRJbnN0VG8zQWRkcihNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmbm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgJm1iYmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnQiwgdW5zaWduZWQgRGlzdCk7CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnBhaXI8dW5zaWduZWQsIGJvb2w+LCBNYWNoaW5lSW5zdHIqPiBOZXdLaWxsOworICAgIGJvb2wgY2FuVXBkYXRlRGVsZXRlZEtpbGxzKFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmS2lsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TmV3S2lsbCwgND4gJk5ld0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIHVuc2lnbmVkIERpc3QpOworICAgIGJvb2wgRGVsZXRlVW51c2VkSW5zdHIoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmbm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciAmbWJiaSwgdW5zaWduZWQgRGlzdCk7CisKKyAgICBib29sIFRyeUluc3RydWN0aW9uVHJhbnNmb3JtKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJm5taSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgJm1iYmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNJZHgsIHVuc2lnbmVkIERzdElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERpc3QpOworCisgICAgdm9pZCBQcm9jZXNzQ29weShNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgOD4gJlByb2Nlc3NlZCk7CisKKyAgICB2b2lkIENvYWxlc2NlRXh0U3ViUmVncyhTbWFsbFZlY3Rvcjx1bnNpZ25lZCw0PiAmU3JjcywgdW5zaWduZWQgRHN0UmVnKTsKKworICAgIC8vLyBFbGltaW5hdGVSZWdTZXF1ZW5jZXMgLSBFbGltaW5hdGUgUkVHX1NFUVVFTkNFIGluc3RydWN0aW9ucyBhcyBwYXJ0CisgICAgLy8vIG9mIHRoZSBkZS1zc2EgcHJvY2Vzcy4gVGhpcyByZXBsYWNlcyBzb3VyY2VzIG9mIFJFR19TRVFVRU5DRSBhcworICAgIC8vLyBzdWItcmVnaXN0ZXIgcmVmZXJlbmNlcyBvZiB0aGUgcmVnaXN0ZXIgZGVmaW5lZCBieSBSRUdfU0VRVUVOQ0UuCisgICAgYm9vbCBFbGltaW5hdGVSZWdTZXF1ZW5jZXMoKTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLnNldFByZXNlcnZlc0NGRygpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8QWxpYXNBbmFseXNpcz4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxMaXZlVmFyaWFibGVzPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkSUQoTWFjaGluZUxvb3BJbmZvSUQpOworICAgICAgQVUuYWRkUHJlc2VydmVkSUQoTWFjaGluZURvbWluYXRvcnNJRCk7CisgICAgICBpZiAoU3Ryb25nUEhJRWxpbSkKKyAgICAgICAgQVUuYWRkUHJlc2VydmVkSUQoU3Ryb25nUEhJRWxpbWluYXRpb25JRCk7CisgICAgICBlbHNlCisgICAgICAgIEFVLmFkZFByZXNlcnZlZElEKFBISUVsaW1pbmF0aW9uSUQpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgICAgLy8vIHJ1bk9uTWFjaGluZUZ1bmN0aW9uIC0gUGFzcyBlbnRyeSBwb2ludC4KKyAgICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiYpOworICB9OworfQorCitjaGFyIFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3M6OklEID0gMDsKK3N0YXRpYyBSZWdpc3RlclBhc3M8VHdvQWRkcmVzc0luc3RydWN0aW9uUGFzcz4KK1goInR3b2FkZHJlc3NpbnN0cnVjdGlvbiIsICJUd28tQWRkcmVzcyBpbnN0cnVjdGlvbiBwYXNzIik7CisKK2NoYXIgJmxsdm06OlR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3NJRCA9IFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3M6OklEOworCisvLy8gU2luazNBZGRySW5zdHJ1Y3Rpb24gLSBBIHR3by1hZGRyZXNzIGluc3RydWN0aW9uIGhhcyBiZWVuIGNvbnZlcnRlZCB0byBhCisvLy8gdGhyZWUtYWRkcmVzcyBpbnN0cnVjdGlvbiB0byBhdm9pZCBjbG9iYmVyaW5nIGEgcmVnaXN0ZXIuIFRyeSB0byBzaW5rIGl0CisvLy8gcGFzdCB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB3b3VsZCBraWxsIHRoZSBhYm92ZSBtZW50aW9uZWQgcmVnaXN0ZXIgdG8gcmVkdWNlCisvLy8gcmVnaXN0ZXIgcHJlc3N1cmUuCitib29sIFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3M6OlNpbmszQWRkckluc3RydWN0aW9uKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgU2F2ZWRSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE9sZFBvcykgeworICAvLyBDaGVjayBpZiBpdCdzIHNhZmUgdG8gbW92ZSB0aGlzIGluc3RydWN0aW9uLgorICBib29sIFNlZW5TdG9yZSA9IHRydWU7IC8vIEJlIGNvbnNlcnZhdGl2ZS4KKyAgaWYgKCFNSS0+aXNTYWZlVG9Nb3ZlKFRJSSwgQUEsIFNlZW5TdG9yZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIERlZlJlZyA9IDA7CisgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiBVc2VSZWdzOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkpCisgICAgICBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBNT1JlZyA9IE1PLmdldFJlZygpOworICAgIGlmICghTU9SZWcpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoTU8uaXNVc2UoKSAmJiBNT1JlZyAhPSBTYXZlZFJlZykKKyAgICAgIFVzZVJlZ3MuaW5zZXJ0KE1PLmdldFJlZygpKTsKKyAgICBpZiAoIU1PLmlzRGVmKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoTU8uaXNJbXBsaWNpdCgpKQorICAgICAgLy8gRG9uJ3QgdHJ5IHRvIG1vdmUgaXQgaWYgaXQgaW1wbGljaXRseSBkZWZpbmVzIGEgcmVnaXN0ZXIuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKERlZlJlZykKKyAgICAgIC8vIEZvciBub3csIGRvbid0IG1vdmUgYW55IGluc3RydWN0aW9ucyB0aGF0IGRlZmluZSBtdWx0aXBsZSByZWdpc3RlcnMuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgRGVmUmVnID0gTU8uZ2V0UmVnKCk7CisgIH0KKworICAvLyBGaW5kIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGtpbGxzIFNhdmVkUmVnLgorICBNYWNoaW5lSW5zdHIgKktpbGxNSSA9IE5VTEw7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6dXNlX25vZGJnX2l0ZXJhdG9yCisgICAgICAgICBVSSA9IE1SSS0+dXNlX25vZGJnX2JlZ2luKFNhdmVkUmVnKSwKKyAgICAgICAgIFVFID0gTVJJLT51c2Vfbm9kYmdfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJlVzZU1PID0gVUkuZ2V0T3BlcmFuZCgpOworICAgIGlmICghVXNlTU8uaXNLaWxsKCkpCisgICAgICBjb250aW51ZTsKKyAgICBLaWxsTUkgPSBVc2VNTy5nZXRQYXJlbnQoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmICghS2lsbE1JIHx8IEtpbGxNSS0+Z2V0UGFyZW50KCkgIT0gTUJCIHx8IEtpbGxNSSA9PSBNSSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgYW55IG9mIHRoZSBkZWZpbml0aW9ucyBhcmUgdXNlZCBieSBhbm90aGVyIGluc3RydWN0aW9uIGJldHdlZW4gdGhlCisgIC8vIHBvc2l0aW9uIGFuZCB0aGUga2lsbCB1c2UsIHRoZW4gaXQncyBub3Qgc2FmZSB0byBzaW5rIGl0LgorICAvLyAKKyAgLy8gRklYTUU6IFRoaXMgY2FuIGJlIHNwZWQgdXAgaWYgdGhlcmUgaXMgYW4gZWFzeSB3YXkgdG8gcXVlcnkgd2hldGhlciBhbgorICAvLyBpbnN0cnVjdGlvbiBpcyBiZWZvcmUgb3IgYWZ0ZXIgYW5vdGhlciBpbnN0cnVjdGlvbi4gVGhlbiB3ZSBjYW4gdXNlCisgIC8vIE1hY2hpbmVSZWdpc3RlckluZm8gZGVmIC8gdXNlIGluc3RlYWQuCisgIE1hY2hpbmVPcGVyYW5kICpLaWxsTU8gPSBOVUxMOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgS2lsbFBvcyA9IEtpbGxNSTsKKyAgKytLaWxsUG9zOworCisgIHVuc2lnbmVkIE51bVZpc2l0ZWQgPSAwOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gbGx2bTo6bmV4dChPbGRQb3MpOyBJICE9IEtpbGxQb3M7ICsrSSkgeworICAgIE1hY2hpbmVJbnN0ciAqT3RoZXJNSSA9IEk7CisgICAgLy8gREJHX1ZBTFVFIGNhbm5vdCBiZSBjb3VudGVkIGFnYWluc3QgdGhlIGxpbWl0LgorICAgIGlmIChPdGhlck1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChOdW1WaXNpdGVkID4gMzApICAvLyBGSVhNRTogQXJiaXRyYXJ5IGxpbWl0IHRvIHJlZHVjZSBjb21waWxlIHRpbWUgY29zdC4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICArK051bVZpc2l0ZWQ7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE90aGVyTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBPdGhlck1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKCFNTy5pc1JlZygpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHVuc2lnbmVkIE1PUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBpZiAoIU1PUmVnKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChEZWZSZWcgPT0gTU9SZWcpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKE1PLmlzS2lsbCgpKSB7CisgICAgICAgIGlmIChPdGhlck1JID09IEtpbGxNSSAmJiBNT1JlZyA9PSBTYXZlZFJlZykKKyAgICAgICAgICAvLyBTYXZlIHRoZSBvcGVyYW5kIHRoYXQga2lsbHMgdGhlIHJlZ2lzdGVyLiBXZSB3YW50IHRvIHVuc2V0IHRoZSBraWxsCisgICAgICAgICAgLy8gbWFya2VyIGlmIHdlIGNhbiBzaW5rIE1JIHBhc3QgaXQuCisgICAgICAgICAgS2lsbE1PID0gJk1POworICAgICAgICBlbHNlIGlmIChVc2VSZWdzLmNvdW50KE1PUmVnKSkKKyAgICAgICAgICAvLyBPbmUgb2YgdGhlIHVzZXMgaXMga2lsbGVkIGJlZm9yZSB0aGUgZGVzdGluYXRpb24uCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFVwZGF0ZSBraWxsIGFuZCBMViBpbmZvcm1hdGlvbi4KKyAgS2lsbE1PLT5zZXRJc0tpbGwoZmFsc2UpOworICBLaWxsTU8gPSBNSS0+ZmluZFJlZ2lzdGVyVXNlT3BlcmFuZChTYXZlZFJlZywgZmFsc2UsIFRSSSk7CisgIEtpbGxNTy0+c2V0SXNLaWxsKHRydWUpOworICAKKyAgaWYgKExWKQorICAgIExWLT5yZXBsYWNlS2lsbEluc3RydWN0aW9uKFNhdmVkUmVnLCBLaWxsTUksIE1JKTsKKworICAvLyBNb3ZlIGluc3RydWN0aW9uIHRvIGl0cyBkZXN0aW5hdGlvbi4KKyAgTUJCLT5yZW1vdmUoTUkpOworICBNQkItPmluc2VydChLaWxsUG9zLCBNSSk7CisKKyAgKytOdW0zQWRkclN1bms7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gaXNUd29BZGRyVXNlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBNSSBpcyB1c2luZyB0aGUgc3BlY2lmaWVkCisvLy8gcmVnaXN0ZXIgYXMgYSB0d28tYWRkcmVzcyBvcGVyYW5kLgorc3RhdGljIGJvb2wgaXNUd29BZGRyVXNlKE1hY2hpbmVJbnN0ciAqVXNlTUksIHVuc2lnbmVkIFJlZykgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IFVzZU1JLT5nZXREZXNjKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBVc2VNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5nZXRSZWcoKSA9PSBSZWcgJiYKKyAgICAgICAgKE1PLmlzRGVmKCkgfHwgVXNlTUktPmlzUmVnVGllZFRvRGVmT3BlcmFuZChpKSkpCisgICAgICAvLyBFYXJsaWVyIHVzZSBpcyBhIHR3by1hZGRyZXNzIG9uZS4KKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzUHJvZml0YWJsZVRvUmVNYXQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaGV1cmlzdGljcyBkZXRlcm1pbmVzIGl0IGlzIGxpa2VseQorLy8vIHRvIGJlIHByb2ZpdGFibGUgdG8gcmUtbWF0ZXJpYWxpemUgdGhlIGRlZmluaXRpb24gb2YgUmVnIHJhdGhlciB0aGFuIGNvcHkKKy8vLyB0aGUgcmVnaXN0ZXIuCitib29sCitUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzOjppc1Byb2ZpdGFibGVUb1JlTWF0KHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqTUksIE1hY2hpbmVJbnN0ciAqRGVmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIHVuc2lnbmVkIExvYykgeworICBib29sIE90aGVyVXNlID0gZmFsc2U7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6dXNlX25vZGJnX2l0ZXJhdG9yIFVJID0gTVJJLT51c2Vfbm9kYmdfYmVnaW4oUmVnKSwKKyAgICAgICAgIFVFID0gTVJJLT51c2Vfbm9kYmdfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJlVzZU1PID0gVUkuZ2V0T3BlcmFuZCgpOworICAgIE1hY2hpbmVJbnN0ciAqVXNlTUkgPSBVc2VNTy5nZXRQYXJlbnQoKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqVXNlTUJCID0gVXNlTUktPmdldFBhcmVudCgpOworICAgIGlmIChVc2VNQkIgPT0gTUJCKSB7CisgICAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD46Oml0ZXJhdG9yIERJID0gRGlzdGFuY2VNYXAuZmluZChVc2VNSSk7CisgICAgICBpZiAoREkgIT0gRGlzdGFuY2VNYXAuZW5kKCkgJiYgREktPnNlY29uZCA9PSBMb2MpCisgICAgICAgIGNvbnRpbnVlOyAgLy8gQ3VycmVudCB1c2UuCisgICAgICBPdGhlclVzZSA9IHRydWU7CisgICAgICAvLyBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIgdXNlIGluIHRoZSBNQkIgdGhhdCB3aWxsIGNsb2JiZXIgdGhlCisgICAgICAvLyByZWdpc3Rlci4gCisgICAgICBpZiAoaXNUd29BZGRyVXNlKFVzZU1JLCBSZWcpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBJZiBvdGhlciB1c2VzIGluIE1CQiBhcmUgbm90IHR3by1hZGRyZXNzIHVzZXMsIHRoZW4gZG9uJ3QgcmVtYXQuCisgIGlmIChPdGhlclVzZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gTm8gb3RoZXIgdXNlcyBpbiB0aGUgc2FtZSBibG9jaywgcmVtYXQgaWYgaXQncyBkZWZpbmVkIGluIHRoZSBzYW1lCisgIC8vIGJsb2NrIHNvIGl0IGRvZXMgbm90IHVubmVjZXNzYXJpbHkgZXh0ZW5kIHRoZSBsaXZlIHJhbmdlLgorICByZXR1cm4gTUJCID09IERlZk1JLT5nZXRQYXJlbnQoKTsKK30KKworLy8vIE5vVXNlQWZ0ZXJMYXN0RGVmIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG5vIGludGVydmVuaW5nIHVzZXMgYmV0d2VlbiB0aGUKKy8vLyBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBNQkIgdGhhdCBkZWZpbmVzIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgYW5kIHRoZQorLy8vIHR3by1hZGRyZXNzIGluc3RydWN0aW9uIHdoaWNoIGlzIGJlaW5nIHByb2Nlc3NlZC4gSXQgYWxzbyByZXR1cm5zIHRoZSBsYXN0CisvLy8gZGVmIGxvY2F0aW9uIGJ5IHJlZmVyZW5jZQorYm9vbCBUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzOjpOb1VzZUFmdGVyTGFzdERlZih1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwgdW5zaWduZWQgRGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTGFzdERlZikgeworICBMYXN0RGVmID0gMDsKKyAgdW5zaWduZWQgTGFzdFVzZSA9IERpc3Q7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6cmVnX2l0ZXJhdG9yIEkgPSBNUkktPnJlZ19iZWdpbihSZWcpLAorICAgICAgICAgRSA9IE1SSS0+cmVnX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IEkuZ2V0T3BlcmFuZCgpOworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBNTy5nZXRQYXJlbnQoKTsKKyAgICBpZiAoTUktPmdldFBhcmVudCgpICE9IE1CQiB8fCBNSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICBjb250aW51ZTsKKyAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD46Oml0ZXJhdG9yIERJID0gRGlzdGFuY2VNYXAuZmluZChNSSk7CisgICAgaWYgKERJID09IERpc3RhbmNlTWFwLmVuZCgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKE1PLmlzVXNlKCkgJiYgREktPnNlY29uZCA8IExhc3RVc2UpCisgICAgICBMYXN0VXNlID0gREktPnNlY29uZDsKKyAgICBpZiAoTU8uaXNEZWYoKSAmJiBESS0+c2Vjb25kID4gTGFzdERlZikKKyAgICAgIExhc3REZWYgPSBESS0+c2Vjb25kOworICB9CisKKyAgcmV0dXJuICEoTGFzdFVzZSA+IExhc3REZWYgJiYgTGFzdFVzZSA8IERpc3QpOworfQorCitNYWNoaW5lSW5zdHIgKlR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3M6OkZpbmRMYXN0VXNlSW5NQkIodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERpc3QpIHsKKyAgdW5zaWduZWQgTGFzdFVzZURpc3QgPSAwOworICBNYWNoaW5lSW5zdHIgKkxhc3RVc2UgPSAwOworICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnJlZ19pdGVyYXRvciBJID0gTVJJLT5yZWdfYmVnaW4oUmVnKSwKKyAgICAgICAgIEUgPSBNUkktPnJlZ19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJLmdldE9wZXJhbmQoKTsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gTU8uZ2V0UGFyZW50KCk7CisgICAgaWYgKE1JLT5nZXRQYXJlbnQoKSAhPSBNQkIgfHwgTUktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisgICAgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+OjppdGVyYXRvciBESSA9IERpc3RhbmNlTWFwLmZpbmQoTUkpOworICAgIGlmIChESSA9PSBEaXN0YW5jZU1hcC5lbmQoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChESS0+c2Vjb25kID49IERpc3QpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChNTy5pc1VzZSgpICYmIERJLT5zZWNvbmQgPiBMYXN0VXNlRGlzdCkgeworICAgICAgTGFzdFVzZSA9IERJLT5maXJzdDsKKyAgICAgIExhc3RVc2VEaXN0ID0gREktPnNlY29uZDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIExhc3RVc2U7Cit9CisKKy8vLyBpc0NvcHlUb1JlZyAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgTUkgaXMgYSBjb3B5IGluc3RydWN0aW9uIG9yCisvLy8gYSBleHRyYWN0X3N1YnJlZyBpbnN0cnVjdGlvbi4gSXQgYWxzbyByZXR1cm5zIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCisvLy8gcmVnaXN0ZXJzIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHBoeXNpY2FsIHJlZ2lzdGVycyBieSByZWZlcmVuY2UuCitzdGF0aWMgYm9vbCBpc0NvcHlUb1JlZyhNYWNoaW5lSW5zdHIgJk1JLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcmNSZWcsIHVuc2lnbmVkICZEc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJc1NyY1BoeXMsIGJvb2wgJklzRHN0UGh5cykgeworICBTcmNSZWcgPSAwOworICBEc3RSZWcgPSAwOworICBpZiAoTUkuaXNDb3B5KCkpIHsKKyAgICBEc3RSZWcgPSBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIFNyY1JlZyA9IE1JLmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgIH0gZWxzZSBpZiAoTUkuaXNJbnNlcnRTdWJyZWcoKSB8fCBNSS5pc1N1YnJlZ1RvUmVnKCkpIHsKKyAgICBEc3RSZWcgPSBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIFNyY1JlZyA9IE1JLmdldE9wZXJhbmQoMikuZ2V0UmVnKCk7CisgIH0gZWxzZQorICAgIHJldHVybiBmYWxzZTsKKworICBJc1NyY1BoeXMgPSBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihTcmNSZWcpOworICBJc0RzdFBoeXMgPSBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihEc3RSZWcpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzS2lsbGVkIC0gVGVzdCBpZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgdmFsdWUsIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGdpdmVuCisvLy8gaW5zdHJ1Y3Rpb24sIGlzIGtpbGxlZCBieSB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uIFRoaXMgbG9va3MgdGhyb3VnaAorLy8vIGNvYWxlc2NhYmxlIGNvcGllcyB0byBzZWUgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIGlzIHBvdGVudGlhbGx5IG5vdCBraWxsZWQuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgaW4gdGhpcyBjb2RlOgorLy8vCisvLy8gICAlcmVnMTAzNCA9IGNvcHkgJXJlZzEwMjQKKy8vLyAgICVyZWcxMDM1ID0gY29weSAlcmVnMTAyNTxraWxsPgorLy8vICAgJXJlZzEwMzYgPSBhZGQgJXJlZzEwMzQ8a2lsbD4sICVyZWcxMDM1PGtpbGw+CisvLy8KKy8vLyAlcmVnMTAzNCBpcyBub3QgY29uc2lkZXJlZCB0byBiZSBraWxsZWQsIHNpbmNlIGl0IGlzIGNvcGllZCBmcm9tIGEKKy8vLyByZWdpc3RlciB3aGljaCBpcyBub3Qga2lsbGVkLiBUcmVhdGluZyBpdCBhcyBub3Qga2lsbGVkIGxldHMgdGhlCisvLy8gbm9ybWFsIGhldXJpc3RpY3MgY29tbXV0ZSB0aGUgKHR3by1hZGRyZXNzKSBhZGQsIHdoaWNoIGxldHMKKy8vLyBjb2FsZXNjaW5nIGVsaW1pbmF0ZSB0aGUgZXh0cmEgY29weS4KKy8vLworc3RhdGljIGJvb2wgaXNLaWxsZWQoTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkpIHsKKyAgTWFjaGluZUluc3RyICpEZWZNSSA9ICZNSTsKKyAgZm9yICg7OykgeworICAgIGlmICghRGVmTUktPmtpbGxzUmVnaXN0ZXIoUmVnKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIE1hY2hpbmVSZWdpc3RlckluZm86OmRlZl9pdGVyYXRvciBCZWdpbiA9IE1SSS0+ZGVmX2JlZ2luKFJlZyk7CisgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlZnMsIHdlIGNhbid0IGRvIGEgc2ltcGxlIGFuYWx5c2lzLCBzbyBqdXN0CisgICAgLy8gZ28gd2l0aCB3aGF0IHRoZSBraWxsIGZsYWcgc2F5cy4KKyAgICBpZiAobGx2bTo6bmV4dChCZWdpbikgIT0gTVJJLT5kZWZfZW5kKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBEZWZNSSA9ICYqQmVnaW47CisgICAgYm9vbCBJc1NyY1BoeXMsIElzRHN0UGh5czsKKyAgICB1bnNpZ25lZCBTcmNSZWcsICBEc3RSZWc7CisgICAgLy8gSWYgdGhlIGRlZiBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGNvcHksIHRoZW4gaXQgaXNuJ3QgZ29pbmcgdG8KKyAgICAvLyBiZSBjb2FsZXNjZWQsIHNvIGZvbGxvdyB0aGUga2lsbCBmbGFnLgorICAgIGlmICghaXNDb3B5VG9SZWcoKkRlZk1JLCBUSUksIFNyY1JlZywgRHN0UmVnLCBJc1NyY1BoeXMsIElzRHN0UGh5cykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBSZWcgPSBTcmNSZWc7CisgIH0KK30KKworLy8vIGlzVHdvQWRkclVzZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgTUkgdXNlcyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyCisvLy8gYXMgYSB0d28tYWRkcmVzcyB1c2UuIElmIHNvLCByZXR1cm4gdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGJ5IHJlZmVyZW5jZS4KK3N0YXRpYyBib29sIGlzVHdvQWRkclVzZShNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBSZWcsIHVuc2lnbmVkICZEc3RSZWcpIHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS5nZXREZXNjKCk7CisgIHVuc2lnbmVkIE51bU9wcyA9IFRJRC5nZXROdW1PcGVyYW5kcygpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bU9wczsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzVXNlKCkgfHwgTU8uZ2V0UmVnKCkgIT0gUmVnKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgdGk7CisgICAgaWYgKE1JLmlzUmVnVGllZFRvRGVmT3BlcmFuZChpLCAmdGkpKSB7CisgICAgICBEc3RSZWcgPSBNSS5nZXRPcGVyYW5kKHRpKS5nZXRSZWcoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBmaW5kT25seUludGVyZXN0aW5nVXNlIC0gR2l2ZW4gYSByZWdpc3RlciwgaWYgaGFzIGEgc2luZ2xlIGluLWJhc2ljIGJsb2NrCisvLy8gdXNlLCByZXR1cm4gdGhlIHVzZSBpbnN0cnVjdGlvbiBpZiBpdCdzIGEgY29weSBvciBhIHR3by1hZGRyZXNzIHVzZS4KK3N0YXRpYworTWFjaGluZUluc3RyICpmaW5kT25seUludGVyZXN0aW5nVXNlKHVuc2lnbmVkIFJlZywgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSXNDb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEc3RSZWcsIGJvb2wgJklzRHN0UGh5cykgeworICBpZiAoIU1SSS0+aGFzT25lTm9uREJHVXNlKFJlZykpCisgICAgLy8gTm9uZSBvciBtb3JlIHRoYW4gb25lIHVzZS4KKyAgICByZXR1cm4gMDsKKyAgTWFjaGluZUluc3RyICZVc2VNSSA9ICpNUkktPnVzZV9ub2RiZ19iZWdpbihSZWcpOworICBpZiAoVXNlTUkuZ2V0UGFyZW50KCkgIT0gTUJCKQorICAgIHJldHVybiAwOworICB1bnNpZ25lZCBTcmNSZWc7CisgIGJvb2wgSXNTcmNQaHlzOworICBpZiAoaXNDb3B5VG9SZWcoVXNlTUksIFRJSSwgU3JjUmVnLCBEc3RSZWcsIElzU3JjUGh5cywgSXNEc3RQaHlzKSkgeworICAgIElzQ29weSA9IHRydWU7CisgICAgcmV0dXJuICZVc2VNSTsKKyAgfQorICBJc0RzdFBoeXMgPSBmYWxzZTsKKyAgaWYgKGlzVHdvQWRkclVzZShVc2VNSSwgUmVnLCBEc3RSZWcpKSB7CisgICAgSXNEc3RQaHlzID0gVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoRHN0UmVnKTsKKyAgICByZXR1cm4gJlVzZU1JOworICB9CisgIHJldHVybiAwOworfQorCisvLy8gZ2V0TWFwcGVkUmVnIC0gUmV0dXJuIHRoZSBwaHlzaWNhbCByZWdpc3RlciB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIKKy8vLyBtaWdodCBiZSBtYXBwZWQgdG8uCitzdGF0aWMgdW5zaWduZWQKK2dldE1hcHBlZFJlZyh1bnNpZ25lZCBSZWcsIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gJlJlZ01hcCkgeworICB3aGlsZSAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWcpKSAgeworICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD46Oml0ZXJhdG9yIFNJID0gUmVnTWFwLmZpbmQoUmVnKTsKKyAgICBpZiAoU0kgPT0gUmVnTWFwLmVuZCgpKQorICAgICAgcmV0dXJuIDA7CisgICAgUmVnID0gU0ktPnNlY29uZDsKKyAgfQorICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnKSkKKyAgICByZXR1cm4gUmVnOworICByZXR1cm4gMDsKK30KKworLy8vIHJlZ3NBcmVDb21wYXRpYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHR3byByZWdpc3RlcnMgYXJlIGVxdWFsIG9yIGFsaWFzZWQuCisvLy8KK3N0YXRpYyBib29sCityZWdzQXJlQ29tcGF0aWJsZSh1bnNpZ25lZCBSZWdBLCB1bnNpZ25lZCBSZWdCLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgeworICBpZiAoUmVnQSA9PSBSZWdCKQorICAgIHJldHVybiB0cnVlOworICBpZiAoIVJlZ0EgfHwgIVJlZ0IpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gVFJJLT5yZWdzT3ZlcmxhcChSZWdBLCBSZWdCKTsKK30KKworCisvLy8gaXNQcm9maXRhYmxlVG9SZU1hdCAtIFJldHVybiB0cnVlIGlmIGl0J3MgcG90ZW50aWFsbHkgcHJvZml0YWJsZSB0byBjb21tdXRlCisvLy8gdGhlIHR3by1hZGRyZXNzIGluc3RydWN0aW9uIHRoYXQncyBiZWluZyBwcm9jZXNzZWQuCitib29sCitUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzOjppc1Byb2ZpdGFibGVUb0NvbW11dGUodW5zaWduZWQgcmVnQiwgdW5zaWduZWQgcmVnQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqTUksIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaXN0KSB7CisgIC8vIERldGVybWluZSBpZiBpdCdzIHByb2ZpdGFibGUgdG8gY29tbXV0ZSB0aGlzIHR3byBhZGRyZXNzIGluc3RydWN0aW9uLiBJbgorICAvLyBnZW5lcmFsLCB3ZSB3YW50IG5vIHVzZXMgYmV0d2VlbiB0aGlzIGluc3RydWN0aW9uIGFuZCB0aGUgZGVmaW5pdGlvbiBvZgorICAvLyB0aGUgdHdvLWFkZHJlc3MgcmVnaXN0ZXIuCisgIC8vIGUuZy4KKyAgLy8gJXJlZzEwMjg8ZGVmPiA9IEVYVFJBQ1RfU1VCUkVHICVyZWcxMDI3PGtpbGw+LCAxCisgIC8vICVyZWcxMDI5PGRlZj4gPSBNT1Y4cnIgJXJlZzEwMjgKKyAgLy8gJXJlZzEwMjk8ZGVmPiA9IFNIUjhyaSAlcmVnMTAyOSwgNywgJUVGTEFHUzxpbXAtZGVmLGRlYWQ+CisgIC8vIGluc2VydCA9PiAlcmVnMTAzMDxkZWY+ID0gTU9WOHJyICVyZWcxMDI4CisgIC8vICVyZWcxMDMwPGRlZj4gPSBBREQ4cnIgJXJlZzEwMjg8a2lsbD4sICVyZWcxMDI5PGtpbGw+LCAlRUZMQUdTPGltcC1kZWYsZGVhZD4KKyAgLy8gSW4gdGhpcyBjYXNlLCBpdCBtaWdodCBub3QgYmUgcG9zc2libGUgdG8gY29hbGVzY2UgdGhlIHNlY29uZCBNT1Y4cnIKKyAgLy8gaW5zdHJ1Y3Rpb24gaWYgdGhlIGZpcnN0IG9uZSBpcyBjb2FsZXNjZWQuIFNvIGl0IHdvdWxkIGJlIHByb2ZpdGFibGUgdG8KKyAgLy8gY29tbXV0ZSBpdDoKKyAgLy8gJXJlZzEwMjg8ZGVmPiA9IEVYVFJBQ1RfU1VCUkVHICVyZWcxMDI3PGtpbGw+LCAxCisgIC8vICVyZWcxMDI5PGRlZj4gPSBNT1Y4cnIgJXJlZzEwMjgKKyAgLy8gJXJlZzEwMjk8ZGVmPiA9IFNIUjhyaSAlcmVnMTAyOSwgNywgJUVGTEFHUzxpbXAtZGVmLGRlYWQ+CisgIC8vIGluc2VydCA9PiAlcmVnMTAzMDxkZWY+ID0gTU9WOHJyICVyZWcxMDI5CisgIC8vICVyZWcxMDMwPGRlZj4gPSBBREQ4cnIgJXJlZzEwMjk8a2lsbD4sICVyZWcxMDI4PGtpbGw+LCAlRUZMQUdTPGltcC1kZWYsZGVhZD4gIAorCisgIGlmICghTUktPmtpbGxzUmVnaXN0ZXIocmVnQykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE9rLCB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlOgorICAvLyAlcmVnMTAzMDxkZWY+ID0gQUREOHJyICVyZWcxMDI4PGtpbGw+LCAlcmVnMTAyOTxraWxsPiwgJUVGTEFHUzxpbXAtZGVmLGRlYWQ+CisgIC8vIGxldCdzIHNlZSBpZiBpdCdzIHdvcnRoIGNvbW11dGluZyBpdC4KKworICAvLyBMb29rIGZvciBzaXR1YXRpb25zIGxpa2UgdGhpczoKKyAgLy8gJXJlZzEwMjQ8ZGVmPiA9IE1PViByMQorICAvLyAlcmVnMTAyNTxkZWY+ID0gTU9WIHIwCisgIC8vICVyZWcxMDI2PGRlZj4gPSBBREQgJXJlZzEwMjQsICVyZWcxMDI1CisgIC8vIHIwICAgICAgICAgICAgPSBNT1YgJXJlZzEwMjYKKyAgLy8gQ29tbXV0ZSB0aGUgQUREIHRvIGhvcGVmdWxseSBlbGltaW5hdGUgYW4gb3RoZXJ3aXNlIHVuYXZvaWRhYmxlIGNvcHkuCisgIHVuc2lnbmVkIEZyb21SZWdCID0gZ2V0TWFwcGVkUmVnKHJlZ0IsIFNyY1JlZ01hcCk7CisgIHVuc2lnbmVkIEZyb21SZWdDID0gZ2V0TWFwcGVkUmVnKHJlZ0MsIFNyY1JlZ01hcCk7CisgIHVuc2lnbmVkIFRvUmVnQiA9IGdldE1hcHBlZFJlZyhyZWdCLCBEc3RSZWdNYXApOworICB1bnNpZ25lZCBUb1JlZ0MgPSBnZXRNYXBwZWRSZWcocmVnQywgRHN0UmVnTWFwKTsKKyAgaWYgKCFyZWdzQXJlQ29tcGF0aWJsZShGcm9tUmVnQiwgVG9SZWdCLCBUUkkpICYmCisgICAgICAocmVnc0FyZUNvbXBhdGlibGUoRnJvbVJlZ0IsIFRvUmVnQywgVFJJKSB8fAorICAgICAgIHJlZ3NBcmVDb21wYXRpYmxlKEZyb21SZWdDLCBUb1JlZ0IsIFRSSSkpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIElmIHRoZXJlIGlzIGEgdXNlIG9mIHJlZ0MgYmV0d2VlbiBpdHMgbGFzdCBkZWYgKGNvdWxkIGJlIGxpdmVpbikgYW5kIHRoaXMKKyAgLy8gaW5zdHJ1Y3Rpb24sIHRoZW4gYmFpbC4KKyAgdW5zaWduZWQgTGFzdERlZkMgPSAwOworICBpZiAoIU5vVXNlQWZ0ZXJMYXN0RGVmKHJlZ0MsIE1CQiwgRGlzdCwgTGFzdERlZkMpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGVyZSBpcyBhIHVzZSBvZiByZWdCIGJldHdlZW4gaXRzIGxhc3QgZGVmIChjb3VsZCBiZSBsaXZlaW4pIGFuZCB0aGlzCisgIC8vIGluc3RydWN0aW9uLCB0aGVuIGdvIGFoZWFkIGFuZCBtYWtlIHRoaXMgdHJhbnNmb3JtYXRpb24uCisgIHVuc2lnbmVkIExhc3REZWZCID0gMDsKKyAgaWYgKCFOb1VzZUFmdGVyTGFzdERlZihyZWdCLCBNQkIsIERpc3QsIExhc3REZWZCKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBTaW5jZSB0aGVyZSBhcmUgbm8gaW50ZXJ2ZW5pbmcgdXNlcyBmb3IgYm90aCByZWdpc3RlcnMsIHRoZW4gY29tbXV0ZQorICAvLyBpZiB0aGUgZGVmIG9mIHJlZ0MgaXMgY2xvc2VyLiBJdHMgbGl2ZSBpbnRlcnZhbCBpcyBzaG9ydGVyLgorICByZXR1cm4gTGFzdERlZkIgJiYgTGFzdERlZkMgJiYgTGFzdERlZkMgPiBMYXN0RGVmQjsKK30KKworLy8vIENvbW11dGVJbnN0cnVjdGlvbiAtIENvbW11dGUgYSB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbiBhbmQgdXBkYXRlIHRoZSBiYXNpYworLy8vIGJsb2NrLCBkaXN0YW5jZSBtYXAsIGFuZCBsaXZlIHZhcmlhYmxlcyBpZiBuZWVkZWQuIFJldHVybiB0cnVlIGlmIGl0IGlzCisvLy8gc3VjY2Vzc2Z1bC4KK2Jvb2wKK1R3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3M6OkNvbW11dGVJbnN0cnVjdGlvbihNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgJm1iYmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnQiwgdW5zaWduZWQgUmVnQywgdW5zaWduZWQgRGlzdCkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gbWk7CisgIERFQlVHKGRiZ3MoKSA8PCAiMmFkZHI6IENPTU1VVElORyAgOiAiIDw8ICpNSSk7CisgIE1hY2hpbmVJbnN0ciAqTmV3TUkgPSBUSUktPmNvbW11dGVJbnN0cnVjdGlvbihNSSk7CisKKyAgaWYgKE5ld01JID09IDApIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIjJhZGRyOiBDT01NVVRJTkcgRkFJTEVEIVxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgREVCVUcoZGJncygpIDw8ICIyYWRkcjogQ09NTVVURUQgVE86ICIgPDwgKk5ld01JKTsKKyAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGNoYW5nZWQgdG8gY29tbXV0ZSBpdCwgdXBkYXRlIGxpdmV2YXIuCisgIGlmIChOZXdNSSAhPSBNSSkgeworICAgIGlmIChMVikKKyAgICAgIC8vIFVwZGF0ZSBsaXZlIHZhcmlhYmxlcworICAgICAgTFYtPnJlcGxhY2VLaWxsSW5zdHJ1Y3Rpb24oUmVnQywgTUksIE5ld01JKTsKKworICAgIG1iYmktPmluc2VydChtaSwgTmV3TUkpOyAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgaW5zdAorICAgIG1iYmktPmVyYXNlKG1pKTsgICAgICAgICAgICAgICAgICAgLy8gTnVrZSB0aGUgb2xkIGluc3QuCisgICAgbWkgPSBOZXdNSTsKKyAgICBEaXN0YW5jZU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTmV3TUksIERpc3QpKTsKKyAgfQorCisgIC8vIFVwZGF0ZSBzb3VyY2UgcmVnaXN0ZXIgbWFwLgorICB1bnNpZ25lZCBGcm9tUmVnQyA9IGdldE1hcHBlZFJlZyhSZWdDLCBTcmNSZWdNYXApOworICBpZiAoRnJvbVJlZ0MpIHsKKyAgICB1bnNpZ25lZCBSZWdBID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgU3JjUmVnTWFwW1JlZ0FdID0gRnJvbVJlZ0M7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzUHJvZml0YWJsZVRvQ29udjNBZGRyIC0gUmV0dXJuIHRydWUgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBjb252ZXJ0IHRoZQorLy8vIGdpdmVuIDItYWRkcmVzcyBpbnN0cnVjdGlvbiB0byBhIDMtYWRkcmVzcyBvbmUuCitib29sCitUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzOjppc1Byb2ZpdGFibGVUb0NvbnYzQWRkcih1bnNpZ25lZCBSZWdBKSB7CisgIC8vIExvb2sgZm9yIHNpdHVhdGlvbnMgbGlrZSB0aGlzOgorICAvLyAlcmVnMTAyNDxkZWY+ID0gTU9WIHIxCisgIC8vICVyZWcxMDI1PGRlZj4gPSBNT1YgcjAKKyAgLy8gJXJlZzEwMjY8ZGVmPiA9IEFERCAlcmVnMTAyNCwgJXJlZzEwMjUKKyAgLy8gcjIgICAgICAgICAgICA9IE1PViAlcmVnMTAyNgorICAvLyBUdXJuIEFERCBpbnRvIGEgMy1hZGRyZXNzIGluc3RydWN0aW9uIHRvIGF2b2lkIGEgY29weS4KKyAgdW5zaWduZWQgRnJvbVJlZ0EgPSBnZXRNYXBwZWRSZWcoUmVnQSwgU3JjUmVnTWFwKTsKKyAgdW5zaWduZWQgVG9SZWdBID0gZ2V0TWFwcGVkUmVnKFJlZ0EsIERzdFJlZ01hcCk7CisgIHJldHVybiAoRnJvbVJlZ0EgJiYgVG9SZWdBICYmICFyZWdzQXJlQ29tcGF0aWJsZShGcm9tUmVnQSwgVG9SZWdBLCBUUkkpKTsKK30KKworLy8vIENvbnZlcnRJbnN0VG8zQWRkciAtIENvbnZlcnQgdGhlIHNwZWNpZmllZCB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbiBpbnRvIGEKKy8vLyB0aHJlZSBhZGRyZXNzIG9uZS4gUmV0dXJuIHRydWUgaWYgdGhpcyB0cmFuc2Zvcm1hdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KK2Jvb2wKK1R3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3M6OkNvbnZlcnRJbnN0VG8zQWRkcihNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmbm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgJm1iYmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnQiwgdW5zaWduZWQgRGlzdCkgeworICBNYWNoaW5lSW5zdHIgKk5ld01JID0gVElJLT5jb252ZXJ0VG9UaHJlZUFkZHJlc3MobWJiaSwgbWksIExWKTsKKyAgaWYgKE5ld01JKSB7CisgICAgREVCVUcoZGJncygpIDw8ICIyYWRkcjogQ09OVkVSVElORyAyLUFERFI6ICIgPDwgKm1pKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIjJhZGRyOiAgICAgICAgIFRPIDMtQUREUjogIiA8PCAqTmV3TUkpOworICAgIGJvb2wgU3VuayA9IGZhbHNlOworCisgICAgaWYgKE5ld01JLT5maW5kUmVnaXN0ZXJVc2VPcGVyYW5kKFJlZ0IsIGZhbHNlLCBUUkkpKQorICAgICAgLy8gRklYTUU6IFRlbXBvcmFyeSB3b3JrYXJvdW5kLiBJZiB0aGUgbmV3IGluc3RydWN0aW9uIGRvZXNuJ3QKKyAgICAgIC8vIHVzZXMgUmVnQiwgY29udmVydFRvVGhyZWVBZGRyZXNzIG11c3QgaGF2ZSBjcmVhdGVkIG1vcmUKKyAgICAgIC8vIHRoZW4gb25lIGluc3RydWN0aW9uLgorICAgICAgU3VuayA9IFNpbmszQWRkckluc3RydWN0aW9uKG1iYmksIE5ld01JLCBSZWdCLCBtaSk7CisKKyAgICBtYmJpLT5lcmFzZShtaSk7IC8vIE51a2UgdGhlIG9sZCBpbnN0LgorCisgICAgaWYgKCFTdW5rKSB7CisgICAgICBEaXN0YW5jZU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTmV3TUksIERpc3QpKTsKKyAgICAgIG1pID0gTmV3TUk7CisgICAgICBubWkgPSBsbHZtOjpuZXh0KG1pKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQcm9jZXNzQ29weSAtIElmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgbm90IHlldCBwcm9jZXNzZWQsIHByb2Nlc3MgaXQKKy8vLyBpZiBpdCdzIGEgY29weS4gRm9yIGEgY29weSBpbnN0cnVjdGlvbiwgd2UgZmluZCB0aGUgcGh5c2ljYWwgcmVnaXN0ZXJzIHRoZQorLy8vIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmVnaXN0ZXJzIG1pZ2h0IGJlIG1hcHBlZCB0by4gVGhlc2UgYXJlIGtlcHQgaW4KKy8vLyBwb2ludC10byBtYXBzIHVzZWQgdG8gZGV0ZXJtaW5lIGZ1dHVyZSBvcHRpbWl6YXRpb25zLiBlLmcuCisvLy8gdjEwMjQgPSBtb3YgcjAKKy8vLyB2MTAyNSA9IG1vdiByMQorLy8vIHYxMDI2ID0gYWRkIHYxMDI0LCB2MTAyNQorLy8vIHIxICAgID0gbW92IHIxMDI2CisvLy8gSWYgJ2FkZCcgaXMgYSB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbiwgdjEwMjQsIHYxMDI2IGFyZSBib3RoIHBvdGVudGlhbGx5CisvLy8gY29hbGVzY2VkIHRvIHIwIChmcm9tIHRoZSBpbnB1dCBzaWRlKS4gdjEwMjUgaXMgbWFwcGVkIHRvIHIxLiB2MTAyNiBpcworLy8vIHBvdGVudGlhbGx5IGpvaW5lZCB3aXRoIHIxIG9uIHRoZSBvdXRwdXQgc2lkZS4gSXQncyB3b3J0aHdoaWxlIHRvIGNvbW11dGUKKy8vLyAnYWRkJyB0byBlbGltaW5hdGUgYSBjb3B5Lgordm9pZCBUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzOjpQcm9jZXNzQ29weShNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgOD4gJlByb2Nlc3NlZCkgeworICBpZiAoUHJvY2Vzc2VkLmNvdW50KE1JKSkKKyAgICByZXR1cm47CisKKyAgYm9vbCBJc1NyY1BoeXMsIElzRHN0UGh5czsKKyAgdW5zaWduZWQgU3JjUmVnLCBEc3RSZWc7CisgIGlmICghaXNDb3B5VG9SZWcoKk1JLCBUSUksIFNyY1JlZywgRHN0UmVnLCBJc1NyY1BoeXMsIElzRHN0UGh5cykpCisgICAgcmV0dXJuOworCisgIGlmIChJc0RzdFBoeXMgJiYgIUlzU3JjUGh5cykKKyAgICBEc3RSZWdNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFNyY1JlZywgRHN0UmVnKSk7CisgIGVsc2UgaWYgKCFJc0RzdFBoeXMgJiYgSXNTcmNQaHlzKSB7CisgICAgYm9vbCBpc05ldyA9IFNyY1JlZ01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoRHN0UmVnLCBTcmNSZWcpKS5zZWNvbmQ7CisgICAgaWYgKCFpc05ldykKKyAgICAgIGFzc2VydChTcmNSZWdNYXBbRHN0UmVnXSA9PSBTcmNSZWcgJiYKKyAgICAgICAgICAgICAiQ2FuJ3QgbWFwIHRvIHR3byBzcmMgcGh5c2ljYWwgcmVnaXN0ZXJzISIpOworCisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IFZpcnRSZWdQYWlyczsKKyAgICBib29sIElzQ29weSA9IGZhbHNlOworICAgIHVuc2lnbmVkIE5ld1JlZyA9IDA7CisgICAgd2hpbGUgKE1hY2hpbmVJbnN0ciAqVXNlTUkgPSBmaW5kT25seUludGVyZXN0aW5nVXNlKERzdFJlZywgTUJCLCBNUkksVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNDb3B5LCBOZXdSZWcsIElzRHN0UGh5cykpIHsKKyAgICAgIGlmIChJc0NvcHkpIHsKKyAgICAgICAgaWYgKCFQcm9jZXNzZWQuaW5zZXJ0KFVzZU1JKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+OjppdGVyYXRvciBESSA9IERpc3RhbmNlTWFwLmZpbmQoVXNlTUkpOworICAgICAgaWYgKERJICE9IERpc3RhbmNlTWFwLmVuZCgpKQorICAgICAgICAvLyBFYXJsaWVyIGluIHRoZSBzYW1lIE1CQi5SZWFjaGVkIHZpYSBhIGJhY2sgZWRnZS4KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChJc0RzdFBoeXMpIHsKKyAgICAgICAgVmlydFJlZ1BhaXJzLnB1c2hfYmFjayhOZXdSZWcpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJvb2wgaXNOZXcgPSBTcmNSZWdNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE5ld1JlZywgRHN0UmVnKSkuc2Vjb25kOworICAgICAgaWYgKCFpc05ldykKKyAgICAgICAgYXNzZXJ0KFNyY1JlZ01hcFtOZXdSZWddID09IERzdFJlZyAmJgorICAgICAgICAgICAgICAgIkNhbid0IG1hcCB0byB0d28gc3JjIHBoeXNpY2FsIHJlZ2lzdGVycyEiKTsKKyAgICAgIFZpcnRSZWdQYWlycy5wdXNoX2JhY2soTmV3UmVnKTsKKyAgICAgIERzdFJlZyA9IE5ld1JlZzsKKyAgICB9CisKKyAgICBpZiAoIVZpcnRSZWdQYWlycy5lbXB0eSgpKSB7CisgICAgICB1bnNpZ25lZCBUb1JlZyA9IFZpcnRSZWdQYWlycy5iYWNrKCk7CisgICAgICBWaXJ0UmVnUGFpcnMucG9wX2JhY2soKTsKKyAgICAgIHdoaWxlICghVmlydFJlZ1BhaXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdW5zaWduZWQgRnJvbVJlZyA9IFZpcnRSZWdQYWlycy5iYWNrKCk7CisgICAgICAgIFZpcnRSZWdQYWlycy5wb3BfYmFjaygpOworICAgICAgICBib29sIGlzTmV3ID0gRHN0UmVnTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihGcm9tUmVnLCBUb1JlZykpLnNlY29uZDsKKyAgICAgICAgaWYgKCFpc05ldykKKyAgICAgICAgICBhc3NlcnQoRHN0UmVnTWFwW0Zyb21SZWddID09IFRvUmVnICYmCisgICAgICAgICAgICAgICAgICJDYW4ndCBtYXAgdG8gdHdvIGRzdCBwaHlzaWNhbCByZWdpc3RlcnMhIik7CisgICAgICAgIFRvUmVnID0gRnJvbVJlZzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBQcm9jZXNzZWQuaW5zZXJ0KE1JKTsKK30KKworLy8vIGlzU2FmZVRvRGVsZXRlIC0gSWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBkb2VzIG5vdCBwcm9kdWNlIGFueSBzaWRlCisvLy8gZWZmZWN0cyBhbmQgYWxsIG9mIGl0cyBkZWZzIGFyZSBkZWFkLCB0aGVuIGl0J3Mgc2FmZSB0byBkZWxldGUuCitzdGF0aWMgYm9vbCBpc1NhZmVUb0RlbGV0ZShNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gJktpbGxzKSB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUktPmdldERlc2MoKTsKKyAgaWYgKFRJRC5tYXlTdG9yZSgpIHx8IFRJRC5pc0NhbGwoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChUSUQuaXNUZXJtaW5hdG9yKCkgfHwgVElELmhhc1VubW9kZWxlZFNpZGVFZmZlY3RzKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoTU8uaXNEZWYoKSAmJiAhTU8uaXNEZWFkKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKE1PLmlzVXNlKCkgJiYgTU8uaXNLaWxsKCkpCisgICAgICBLaWxscy5wdXNoX2JhY2soTU8uZ2V0UmVnKCkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gY2FuVXBkYXRlRGVsZXRlZEtpbGxzIC0gQ2hlY2sgaWYgYWxsIHRoZSByZWdpc3RlcnMgbGlzdGVkIGluIEtpbGxzIGFyZQorLy8vIGtpbGxlZCBieSBpbnN0cnVjdGlvbnMgaW4gTUJCIHByZWNlZGluZyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBhdAorLy8vIHBvc2l0aW9uIERpc3QuICBJZiBzbywgcmV0dXJuIHRydWUgYW5kIHJlY29yZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKy8vLyBwcmVjZWRpbmcga2lsbHMgaW4gTmV3S2lsbHMuCitib29sIFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3M6OgorY2FuVXBkYXRlRGVsZXRlZEtpbGxzKFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmS2lsbHMsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TmV3S2lsbCwgND4gJk5ld0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIHVuc2lnbmVkIERpc3QpIHsKKyAgd2hpbGUgKCFLaWxscy5lbXB0eSgpKSB7CisgICAgdW5zaWduZWQgS2lsbCA9IEtpbGxzLmJhY2soKTsKKyAgICBLaWxscy5wb3BfYmFjaygpOworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihLaWxsKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIE1hY2hpbmVJbnN0ciAqTGFzdEtpbGwgPSBGaW5kTGFzdFVzZUluTUJCKEtpbGwsIE1CQiwgRGlzdCk7CisgICAgaWYgKCFMYXN0S2lsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgaXNNb2RSZWYgPSBMYXN0S2lsbC0+ZGVmaW5lc1JlZ2lzdGVyKEtpbGwpOworICAgIE5ld0tpbGxzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihzdGQ6Om1ha2VfcGFpcihLaWxsLCBpc01vZFJlZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RLaWxsKSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBEZWxldGVVbnVzZWRJbnN0ciAtIElmIGFuIGluc3RydWN0aW9uIHdpdGggYSB0aWVkIHJlZ2lzdGVyIG9wZXJhbmQgY2FuCisvLy8gYmUgc2FmZWx5IGRlbGV0ZWQsIGp1c3QgZGVsZXRlIGl0LgorYm9vbAorVHdvQWRkcmVzc0luc3RydWN0aW9uUGFzczo6RGVsZXRlVW51c2VkSW5zdHIoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmbm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciAmbWJiaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERpc3QpIHsKKyAgLy8gQ2hlY2sgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBubyBzaWRlIGVmZmVjdHMgYW5kIGlmIGFsbCBpdHMgZGVmcyBhcmUgZGVhZC4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IEtpbGxzOworICBpZiAoIWlzU2FmZVRvRGVsZXRlKG1pLCBUSUksIEtpbGxzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhpcyBpbnN0cnVjdGlvbiBraWxscyBzb21lIHZpcnR1YWwgcmVnaXN0ZXJzLCB3ZSBuZWVkIHRvCisgIC8vIHVwZGF0ZSB0aGUga2lsbCBpbmZvcm1hdGlvbi4gSWYgaXQncyBub3QgcG9zc2libGUgdG8gZG8gc28sCisgIC8vIHRoZW4gYmFpbCBvdXQuCisgIFNtYWxsVmVjdG9yPE5ld0tpbGwsIDQ+IE5ld0tpbGxzOworICBpZiAoIWNhblVwZGF0ZURlbGV0ZWRLaWxscyhLaWxscywgTmV3S2lsbHMsICYqbWJiaSwgRGlzdCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChMVikgeworICAgIHdoaWxlICghTmV3S2lsbHMuZW1wdHkoKSkgeworICAgICAgTWFjaGluZUluc3RyICpOZXdLaWxsID0gTmV3S2lsbHMuYmFjaygpLnNlY29uZDsKKyAgICAgIHVuc2lnbmVkIEtpbGwgPSBOZXdLaWxscy5iYWNrKCkuZmlyc3QuZmlyc3Q7CisgICAgICBib29sIGlzRGVhZCA9IE5ld0tpbGxzLmJhY2soKS5maXJzdC5zZWNvbmQ7CisgICAgICBOZXdLaWxscy5wb3BfYmFjaygpOworICAgICAgaWYgKExWLT5yZW1vdmVWaXJ0dWFsUmVnaXN0ZXJLaWxsZWQoS2lsbCwgbWkpKSB7CisgICAgICAgIGlmIChpc0RlYWQpCisgICAgICAgICAgTFYtPmFkZFZpcnR1YWxSZWdpc3RlckRlYWQoS2lsbCwgTmV3S2lsbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBMVi0+YWRkVmlydHVhbFJlZ2lzdGVyS2lsbGVkKEtpbGwsIE5ld0tpbGwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG1iYmktPmVyYXNlKG1pKTsgLy8gTnVrZSB0aGUgb2xkIGluc3QuCisgIG1pID0gbm1pOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFRyeUluc3RydWN0aW9uVHJhbnNmb3JtIC0gRm9yIHRoZSBjYXNlIHdoZXJlIGFuIGluc3RydWN0aW9uIGhhcyBhIHNpbmdsZQorLy8vIHBhaXIgb2YgdGllZCByZWdpc3RlciBvcGVyYW5kcywgYXR0ZW1wdCBzb21lIHRyYW5zZm9ybWF0aW9ucyB0aGF0IG1heQorLy8vIGVpdGhlciBlbGltaW5hdGUgdGhlIHRpZWQgb3BlcmFuZHMgb3IgaW1wcm92ZSB0aGUgb3Bwb3J0dW5pdGllcyBmb3IKKy8vLyBjb2FsZXNjaW5nIGF3YXkgdGhlIHJlZ2lzdGVyIGNvcHkuICBSZXR1cm5zIHRydWUgaWYgdGhlIHRpZWQgb3BlcmFuZHMKKy8vLyBhcmUgZWxpbWluYXRlZCBhbHRvZ2V0aGVyLgorYm9vbCBUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzOjoKK1RyeUluc3RydWN0aW9uVHJhbnNmb3JtKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmbWksCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJm5taSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgJm1iYmksCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNJZHgsIHVuc2lnbmVkIERzdElkeCwgdW5zaWduZWQgRGlzdCkgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IG1pLT5nZXREZXNjKCk7CisgIHVuc2lnbmVkIHJlZ0EgPSBtaS0+Z2V0T3BlcmFuZChEc3RJZHgpLmdldFJlZygpOworICB1bnNpZ25lZCByZWdCID0gbWktPmdldE9wZXJhbmQoU3JjSWR4KS5nZXRSZWcoKTsKKworICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihyZWdCKSAmJgorICAgICAgICAgImNhbm5vdCBtYWtlIGluc3RydWN0aW9uIGludG8gdHdvLWFkZHJlc3MgZm9ybSIpOworCisgIC8vIElmIHJlZ0EgaXMgZGVhZCBhbmQgdGhlIGluc3RydWN0aW9uIGNhbiBiZSBkZWxldGVkLCBqdXN0IGRlbGV0ZQorICAvLyBpdCBzbyBpdCBkb2Vzbid0IGNsb2JiZXIgcmVnQi4KKyAgYm9vbCByZWdCS2lsbGVkID0gaXNLaWxsZWQoKm1pLCByZWdCLCBNUkksIFRJSSk7CisgIGlmICghcmVnQktpbGxlZCAmJiBtaS0+Z2V0T3BlcmFuZChEc3RJZHgpLmlzRGVhZCgpICYmCisgICAgICBEZWxldGVVbnVzZWRJbnN0cihtaSwgbm1pLCBtYmJpLCBEaXN0KSkgeworICAgICsrTnVtRGVsZXRlczsKKyAgICByZXR1cm4gdHJ1ZTsgLy8gRG9uZSB3aXRoIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIH0KKworICAvLyBDaGVjayBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIGNvbW11dGUgdGhlIG9wZXJhbmRzLgorICB1bnNpZ25lZCBTcmNPcDEsIFNyY09wMjsKKyAgdW5zaWduZWQgcmVnQyA9IDA7CisgIHVuc2lnbmVkIHJlZ0NJZHggPSB+MFU7CisgIGJvb2wgVHJ5Q29tbXV0ZSA9IGZhbHNlOworICBib29sIEFnZ3Jlc3NpdmVDb21tdXRlID0gZmFsc2U7CisgIGlmIChUSUQuaXNDb21tdXRhYmxlKCkgJiYgbWktPmdldE51bU9wZXJhbmRzKCkgPj0gMyAmJgorICAgICAgVElJLT5maW5kQ29tbXV0ZWRPcEluZGljZXMobWksIFNyY09wMSwgU3JjT3AyKSkgeworICAgIGlmIChTcmNJZHggPT0gU3JjT3AxKQorICAgICAgcmVnQ0lkeCA9IFNyY09wMjsKKyAgICBlbHNlIGlmIChTcmNJZHggPT0gU3JjT3AyKQorICAgICAgcmVnQ0lkeCA9IFNyY09wMTsKKworICAgIGlmIChyZWdDSWR4ICE9IH4wVSkgeworICAgICAgcmVnQyA9IG1pLT5nZXRPcGVyYW5kKHJlZ0NJZHgpLmdldFJlZygpOworICAgICAgaWYgKCFyZWdCS2lsbGVkICYmIGlzS2lsbGVkKCptaSwgcmVnQywgTVJJLCBUSUkpKQorICAgICAgICAvLyBJZiBDIGRpZXMgYnV0IEIgZG9lcyBub3QsIHN3YXAgdGhlIEIgYW5kIEMgb3BlcmFuZHMuCisgICAgICAgIC8vIFRoaXMgbWFrZXMgdGhlIGxpdmUgcmFuZ2VzIG9mIEEgYW5kIEMgam9pbmFibGUuCisgICAgICAgIFRyeUNvbW11dGUgPSB0cnVlOworICAgICAgZWxzZSBpZiAoaXNQcm9maXRhYmxlVG9Db21tdXRlKHJlZ0IsIHJlZ0MsIG1pLCBtYmJpLCBEaXN0KSkgeworICAgICAgICBUcnlDb21tdXRlID0gdHJ1ZTsKKyAgICAgICAgQWdncmVzc2l2ZUNvbW11dGUgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIElmIGl0J3MgcHJvZml0YWJsZSB0byBjb21tdXRlLCB0cnkgdG8gZG8gc28uCisgIGlmIChUcnlDb21tdXRlICYmIENvbW11dGVJbnN0cnVjdGlvbihtaSwgbWJiaSwgcmVnQiwgcmVnQywgRGlzdCkpIHsKKyAgICArK051bUNvbW11dGVkOworICAgIGlmIChBZ2dyZXNzaXZlQ29tbXV0ZSkKKyAgICAgICsrTnVtQWdnckNvbW11dGVkOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChUSUQuaXNDb252ZXJ0aWJsZVRvM0FkZHIoKSkgeworICAgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgcG90ZW50aWFsbHkgY29udmVydGlibGUgdG8gYSB0cnVlCisgICAgLy8gdGhyZWUtYWRkcmVzcyBpbnN0cnVjdGlvbi4gIENoZWNrIGlmIGl0IGlzIHByb2ZpdGFibGUuCisgICAgaWYgKCFyZWdCS2lsbGVkIHx8IGlzUHJvZml0YWJsZVRvQ29udjNBZGRyKHJlZ0EpKSB7CisgICAgICAvLyBUcnkgdG8gY29udmVydCBpdC4KKyAgICAgIGlmIChDb252ZXJ0SW5zdFRvM0FkZHIobWksIG5taSwgbWJiaSwgcmVnQiwgRGlzdCkpIHsKKyAgICAgICAgKytOdW1Db252ZXJ0ZWRUbzNBZGRyOworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRG9uZSB3aXRoIHRoaXMgaW5zdHJ1Y3Rpb24uCisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhpcyBpcyBhbiBpbnN0cnVjdGlvbiB3aXRoIGEgbG9hZCBmb2xkZWQgaW50byBpdCwgdHJ5IHVuZm9sZGluZworICAvLyB0aGUgbG9hZCwgZS5nLiBhdm9pZCB0aGlzOgorICAvLyAgIG1vdnEgJXJkeCwgJXJjeAorICAvLyAgIGFkZHEgKCVyYXgpLCAlcmN4CisgIC8vIGluIGZhdm9yIG9mIHRoaXM6CisgIC8vICAgbW92cSAoJXJheCksICVyY3gKKyAgLy8gICBhZGRxICVyZHgsICVyY3gKKyAgLy8gYmVjYXVzZSBpdCdzIHByZWZlcmFibGUgdG8gc2NoZWR1bGUgYSBsb2FkIHRoYW4gYSByZWdpc3RlciBjb3B5LgorICBpZiAoVElELm1heUxvYWQoKSAmJiAhcmVnQktpbGxlZCkgeworICAgIC8vIERldGVybWluZSBpZiBhIGxvYWQgY2FuIGJlIHVuZm9sZGVkLgorICAgIHVuc2lnbmVkIExvYWRSZWdJbmRleDsKKyAgICB1bnNpZ25lZCBOZXdPcGMgPQorICAgICAgVElJLT5nZXRPcGNvZGVBZnRlck1lbW9yeVVuZm9sZChtaS0+Z2V0T3Bjb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVW5mb2xkTG9hZD0qL3RydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVW5mb2xkU3RvcmU9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkxvYWRSZWdJbmRleCk7CisgICAgaWYgKE5ld09wYyAhPSAwKSB7CisgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlVuZm9sZFRJRCA9IFRJSS0+Z2V0KE5ld09wYyk7CisgICAgICBpZiAoVW5mb2xkVElELmdldE51bURlZnMoKSA9PSAxKSB7CisgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqbWJiaS0+Z2V0UGFyZW50KCk7CisKKyAgICAgICAgLy8gVW5mb2xkIHRoZSBsb2FkLgorICAgICAgICBERUJVRyhkYmdzKCkgPDwgIjJhZGRyOiAgIFVORk9MRElORzogIiA8PCAqbWkpOworICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9CisgICAgICAgICAgVW5mb2xkVElELk9wSW5mb1tMb2FkUmVnSW5kZXhdLmdldFJlZ0NsYXNzKFRSSSk7CisgICAgICAgIHVuc2lnbmVkIFJlZyA9IE1SSS0+Y3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyICosIDI+IE5ld01JczsKKyAgICAgICAgaWYgKCFUSUktPnVuZm9sZE1lbW9yeU9wZXJhbmQoTUYsIG1pLCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVW5mb2xkTG9hZD0qL3RydWUsLypVbmZvbGRTdG9yZT0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdNSXMpKSB7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIyYWRkcjogQUJBTkRPTklORyBVTkZPTERcbiIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoTmV3TUlzLnNpemUoKSA9PSAyICYmCisgICAgICAgICAgICAgICAiVW5mb2xkZWQgYSBsb2FkIGludG8gbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zISIpOworICAgICAgICAvLyBUaGUgbG9hZCB3YXMgcHJldmlvdXNseSBmb2xkZWQsIHNvIHRoaXMgaXMgdGhlIG9ubHkgdXNlLgorICAgICAgICBOZXdNSXNbMV0tPmFkZFJlZ2lzdGVyS2lsbGVkKFJlZywgVFJJKTsKKworICAgICAgICAvLyBUZW50YXRpdmVseSBpbnNlcnQgdGhlIGluc3RydWN0aW9ucyBpbnRvIHRoZSBibG9jayBzbyB0aGF0IHRoZXkKKyAgICAgICAgLy8gbG9vayAibm9ybWFsIiB0byB0aGUgdHJhbnNmb3JtYXRpb24gbG9naWMuCisgICAgICAgIG1iYmktPmluc2VydChtaSwgTmV3TUlzWzBdKTsKKyAgICAgICAgbWJiaS0+aW5zZXJ0KG1pLCBOZXdNSXNbMV0pOworCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiMmFkZHI6ICAgIE5FVyBMT0FEOiAiIDw8ICpOZXdNSXNbMF0KKyAgICAgICAgICAgICAgICAgICAgIDw8ICIyYWRkcjogICAgTkVXIElOU1Q6ICIgPDwgKk5ld01Jc1sxXSk7CisKKyAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBpbnN0cnVjdGlvbiwgbm93IHRoYXQgaXQgbm8gbG9uZ2VyIGhhcyBhIGxvYWQuCisgICAgICAgIHVuc2lnbmVkIE5ld0RzdElkeCA9IE5ld01Jc1sxXS0+ZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeChyZWdBKTsKKyAgICAgICAgdW5zaWduZWQgTmV3U3JjSWR4ID0gTmV3TUlzWzFdLT5maW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KHJlZ0IpOworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTmV3TUkgPSBOZXdNSXNbMV07CisgICAgICAgIGJvb2wgVHJhbnNmb3JtU3VjY2VzcyA9CisgICAgICAgICAgVHJ5SW5zdHJ1Y3Rpb25UcmFuc2Zvcm0oTmV3TUksIG1pLCBtYmJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1NyY0lkeCwgTmV3RHN0SWR4LCBEaXN0KTsKKyAgICAgICAgaWYgKFRyYW5zZm9ybVN1Y2Nlc3MgfHwKKyAgICAgICAgICAgIE5ld01Jc1sxXS0+Z2V0T3BlcmFuZChOZXdTcmNJZHgpLmlzS2lsbCgpKSB7CisgICAgICAgICAgLy8gU3VjY2Vzcywgb3IgYXQgbGVhc3Qgd2UgbWFkZSBhbiBpbXByb3ZlbWVudC4gS2VlcCB0aGUgdW5mb2xkZWQKKyAgICAgICAgICAvLyBpbnN0cnVjdGlvbnMgYW5kIGRpc2NhcmQgdGhlIG9yaWdpbmFsLgorICAgICAgICAgIGlmIChMVikgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IG1pLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBtaS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uZ2V0UmVnKCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihNTy5nZXRSZWcoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTU8uaXNVc2UoKSkgeworICAgICAgICAgICAgICAgICAgaWYgKE1PLmlzS2lsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChOZXdNSXNbMF0tPmtpbGxzUmVnaXN0ZXIoTU8uZ2V0UmVnKCkpKQorICAgICAgICAgICAgICAgICAgICAgIExWLT5yZXBsYWNlS2lsbEluc3RydWN0aW9uKE1PLmdldFJlZygpLCBtaSwgTmV3TUlzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KE5ld01Jc1sxXS0+a2lsbHNSZWdpc3RlcihNTy5nZXRSZWcoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktpbGwgbWlzc2luZyBhZnRlciBsb2FkIHVuZm9sZCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICBMVi0+cmVwbGFjZUtpbGxJbnN0cnVjdGlvbihNTy5nZXRSZWcoKSwgbWksIE5ld01Jc1sxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKExWLT5yZW1vdmVWaXJ0dWFsUmVnaXN0ZXJEZWFkKE1PLmdldFJlZygpLCBtaSkpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChOZXdNSXNbMV0tPnJlZ2lzdGVyRGVmSXNEZWFkKE1PLmdldFJlZygpKSkKKyAgICAgICAgICAgICAgICAgICAgTFYtPmFkZFZpcnR1YWxSZWdpc3RlckRlYWQoTU8uZ2V0UmVnKCksIE5ld01Jc1sxXSk7CisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KE5ld01Jc1swXS0+cmVnaXN0ZXJEZWZJc0RlYWQoTU8uZ2V0UmVnKCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVhZCBmbGFnIG1pc3NpbmcgYWZ0ZXIgbG9hZCB1bmZvbGQhIik7CisgICAgICAgICAgICAgICAgICAgIExWLT5hZGRWaXJ0dWFsUmVnaXN0ZXJEZWFkKE1PLmdldFJlZygpLCBOZXdNSXNbMF0pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTFYtPmFkZFZpcnR1YWxSZWdpc3RlcktpbGxlZChSZWcsIE5ld01Jc1sxXSk7CisgICAgICAgICAgfQorICAgICAgICAgIG1pLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgICBtaSA9IE5ld01Jc1sxXTsKKyAgICAgICAgICBpZiAoVHJhbnNmb3JtU3VjY2VzcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFRyYW5zZm9ybWluZyBkaWRuJ3QgZWxpbWluYXRlIHRoZSB0aWUgYW5kIGRpZG4ndCBsZWFkIHRvIGFuCisgICAgICAgICAgLy8gaW1wcm92ZW1lbnQuIENsZWFuIHVwIHRoZSB1bmZvbGRlZCBpbnN0cnVjdGlvbnMgYW5kIGtlZXAgdGhlCisgICAgICAgICAgLy8gb3JpZ2luYWwuCisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIyYWRkcjogQUJBTkRPTklORyBVTkZPTERcbiIpOworICAgICAgICAgIE5ld01Jc1swXS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgICAgTmV3TUlzWzFdLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIHJ1bk9uTWFjaGluZUZ1bmN0aW9uIC0gUmVkdWNlIHR3by1hZGRyZXNzIGluc3RydWN0aW9ucyB0byB0d28gb3BlcmFuZHMuCisvLy8KK2Jvb2wgVHdvQWRkcmVzc0luc3RydWN0aW9uUGFzczo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBERUJVRyhkYmdzKCkgPDwgIk1hY2hpbmUgRnVuY3Rpb25cbiIpOworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICBNUkkgPSAmTUYuZ2V0UmVnSW5mbygpOworICBUSUkgPSBUTS5nZXRJbnN0ckluZm8oKTsKKyAgVFJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIExWID0gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxMaXZlVmFyaWFibGVzPigpOworICBBQSA9ICZnZXRBbmFseXNpczxBbGlhc0FuYWx5c2lzPigpOworCisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworCisgIERFQlVHKGRiZ3MoKSA8PCAiKioqKioqKioqKiBSRVdSSVRJTkcgVFdPLUFERFIgSU5TVFJTICoqKioqKioqKipcbiIpOworICBERUJVRyhkYmdzKCkgPDwgIioqKioqKioqKiogRnVuY3Rpb246ICIgCisgICAgICAgIDw8IE1GLmdldEZ1bmN0aW9uKCktPmdldE5hbWUoKSA8PCAnXG4nKTsKKworICAvLyBSZU1hdFJlZ3MgLSBLZWVwIHRyYWNrIG9mIHRoZSByZWdpc3RlcnMgd2hvc2UgZGVmJ3MgYXJlIHJlbWF0J2VkLgorICBCaXRWZWN0b3IgUmVNYXRSZWdzOworICBSZU1hdFJlZ3MucmVzaXplKE1SSS0+Z2V0TGFzdFZpcnRSZWcoKSsxKTsKKworICB0eXBlZGVmIERlbnNlTWFwPHVuc2lnbmVkLCBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiwgND4gPgorICAgIFRpZWRPcGVyYW5kTWFwOworICBUaWVkT3BlcmFuZE1hcCBUaWVkT3BlcmFuZHMoNCk7CisKKyAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgOD4gUHJvY2Vzc2VkOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgbWJiaSA9IE1GLmJlZ2luKCksIG1iYmUgPSBNRi5lbmQoKTsKKyAgICAgICBtYmJpICE9IG1iYmU7ICsrbWJiaSkgeworICAgIHVuc2lnbmVkIERpc3QgPSAwOworICAgIERpc3RhbmNlTWFwLmNsZWFyKCk7CisgICAgU3JjUmVnTWFwLmNsZWFyKCk7CisgICAgRHN0UmVnTWFwLmNsZWFyKCk7CisgICAgUHJvY2Vzc2VkLmNsZWFyKCk7CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgbWkgPSBtYmJpLT5iZWdpbigpLCBtZSA9IG1iYmktPmVuZCgpOworICAgICAgICAgbWkgIT0gbWU7ICkgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIG5taSA9IGxsdm06Om5leHQobWkpOworICAgICAgaWYgKG1pLT5pc0RlYnVnVmFsdWUoKSkgeworICAgICAgICBtaSA9IG5taTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFJlbWVtYmVyIFJFR19TRVFVRU5DRSBpbnN0cnVjdGlvbnMsIHdlJ2xsIGRlYWwgd2l0aCB0aGVtIGxhdGVyLgorICAgICAgaWYgKG1pLT5pc1JlZ1NlcXVlbmNlKCkpCisgICAgICAgIFJlZ1NlcXVlbmNlcy5wdXNoX2JhY2soJiptaSk7CisKKyAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gbWktPmdldERlc2MoKTsKKyAgICAgIGJvb2wgRmlyc3RUaWVkID0gdHJ1ZTsKKworICAgICAgRGlzdGFuY2VNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG1pLCArK0Rpc3QpKTsKKworICAgICAgUHJvY2Vzc0NvcHkoJiptaSwgJiptYmJpLCBQcm9jZXNzZWQpOworCisgICAgICAvLyBGaXJzdCBzY2FuIHRocm91Z2ggYWxsIHRoZSB0aWVkIHJlZ2lzdGVyIHVzZXMgaW4gdGhpcyBpbnN0cnVjdGlvbgorICAgICAgLy8gYW5kIHJlY29yZCBhIGxpc3Qgb2YgcGFpcnMgb2YgdGllZCBvcGVyYW5kcyBmb3IgZWFjaCByZWdpc3Rlci4KKyAgICAgIHVuc2lnbmVkIE51bU9wcyA9IFRJRC5nZXROdW1PcGVyYW5kcygpOworICAgICAgZm9yICh1bnNpZ25lZCBTcmNJZHggPSAwOyBTcmNJZHggPCBOdW1PcHM7ICsrU3JjSWR4KSB7CisgICAgICAgIHVuc2lnbmVkIERzdElkeCA9IDA7CisgICAgICAgIGlmICghbWktPmlzUmVnVGllZFRvRGVmT3BlcmFuZChTcmNJZHgsICZEc3RJZHgpKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChGaXJzdFRpZWQpIHsKKyAgICAgICAgICBGaXJzdFRpZWQgPSBmYWxzZTsKKyAgICAgICAgICArK051bVR3b0FkZHJlc3NJbnN0cnM7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICdcdCcgPDwgKm1pKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydChtaS0+Z2V0T3BlcmFuZChTcmNJZHgpLmlzUmVnKCkgJiYKKyAgICAgICAgICAgICAgIG1pLT5nZXRPcGVyYW5kKFNyY0lkeCkuZ2V0UmVnKCkgJiYKKyAgICAgICAgICAgICAgIG1pLT5nZXRPcGVyYW5kKFNyY0lkeCkuaXNVc2UoKSAmJgorICAgICAgICAgICAgICAgInR3byBhZGRyZXNzIGluc3RydWN0aW9uIGludmFsaWQiKTsKKworICAgICAgICB1bnNpZ25lZCByZWdCID0gbWktPmdldE9wZXJhbmQoU3JjSWR4KS5nZXRSZWcoKTsKKyAgICAgICAgVGllZE9wZXJhbmRNYXA6Oml0ZXJhdG9yIE9JID0gVGllZE9wZXJhbmRzLmZpbmQocmVnQik7CisgICAgICAgIGlmIChPSSA9PSBUaWVkT3BlcmFuZHMuZW5kKCkpIHsKKyAgICAgICAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiwgND4gVGllZFBhaXI7CisgICAgICAgICAgT0kgPSBUaWVkT3BlcmFuZHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHJlZ0IsIFRpZWRQYWlyKSkuZmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgT0ktPnNlY29uZC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoU3JjSWR4LCBEc3RJZHgpKTsKKyAgICAgIH0KKworICAgICAgLy8gTm93IGl0ZXJhdGUgb3ZlciB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGFib3ZlLgorICAgICAgZm9yIChUaWVkT3BlcmFuZE1hcDo6aXRlcmF0b3IgT0kgPSBUaWVkT3BlcmFuZHMuYmVnaW4oKSwKKyAgICAgICAgICAgICBPRSA9IFRpZWRPcGVyYW5kcy5lbmQoKTsgT0kgIT0gT0U7ICsrT0kpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4sIDQ+ICZUaWVkUGFpcnMgPSBPSS0+c2Vjb25kOworCisgICAgICAgIC8vIElmIHRoZSBpbnN0cnVjdGlvbiBoYXMgYSBzaW5nbGUgcGFpciBvZiB0aWVkIG9wZXJhbmRzLCB0cnkgc29tZQorICAgICAgICAvLyB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBtYXkgZWl0aGVyIGVsaW1pbmF0ZSB0aGUgdGllZCBvcGVyYW5kcyBvcgorICAgICAgICAvLyBpbXByb3ZlIHRoZSBvcHBvcnR1bml0aWVzIGZvciBjb2FsZXNjaW5nIGF3YXkgdGhlIHJlZ2lzdGVyIGNvcHkuCisgICAgICAgIGlmIChUaWVkT3BlcmFuZHMuc2l6ZSgpID09IDEgJiYgVGllZFBhaXJzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgdW5zaWduZWQgU3JjSWR4ID0gVGllZFBhaXJzWzBdLmZpcnN0OworICAgICAgICAgIHVuc2lnbmVkIERzdElkeCA9IFRpZWRQYWlyc1swXS5zZWNvbmQ7CisKKyAgICAgICAgICAvLyBJZiB0aGUgcmVnaXN0ZXJzIGFyZSBhbHJlYWR5IGVxdWFsLCBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUuCisgICAgICAgICAgaWYgKG1pLT5nZXRPcGVyYW5kKFNyY0lkeCkuZ2V0UmVnKCkgPT0KKyAgICAgICAgICAgICAgbWktPmdldE9wZXJhbmQoRHN0SWR4KS5nZXRSZWcoKSkKKyAgICAgICAgICAgIGJyZWFrOyAvLyBEb25lIHdpdGggdGhpcyBpbnN0cnVjdGlvbi4KKworICAgICAgICAgIGlmIChUcnlJbnN0cnVjdGlvblRyYW5zZm9ybShtaSwgbm1pLCBtYmJpLCBTcmNJZHgsIERzdElkeCwgRGlzdCkpCisgICAgICAgICAgICBicmVhazsgLy8gVGhlIHRpZWQgb3BlcmFuZHMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQuCisgICAgICAgIH0KKworICAgICAgICBib29sIFJlbW92ZWRLaWxsRmxhZyA9IGZhbHNlOworICAgICAgICBib29sIEFsbFVzZXNDb3BpZWQgPSB0cnVlOworICAgICAgICB1bnNpZ25lZCBMYXN0Q29waWVkUmVnID0gMDsKKyAgICAgICAgdW5zaWduZWQgcmVnQiA9IE9JLT5maXJzdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCB0cGkgPSAwLCB0cGUgPSBUaWVkUGFpcnMuc2l6ZSgpOyB0cGkgIT0gdHBlOyArK3RwaSkgeworICAgICAgICAgIHVuc2lnbmVkIFNyY0lkeCA9IFRpZWRQYWlyc1t0cGldLmZpcnN0OworICAgICAgICAgIHVuc2lnbmVkIERzdElkeCA9IFRpZWRQYWlyc1t0cGldLnNlY29uZDsKKyAgICAgICAgICB1bnNpZ25lZCByZWdBID0gbWktPmdldE9wZXJhbmQoRHN0SWR4KS5nZXRSZWcoKTsKKyAgICAgICAgICAvLyBHcmFiIHJlZ0IgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gYmVjYXVzZSBpdCBtYXkgaGF2ZSBjaGFuZ2VkIGlmIHRoZQorICAgICAgICAgIC8vIGluc3RydWN0aW9uIHdhcyBjb21tdXRlZC4KKyAgICAgICAgICByZWdCID0gbWktPmdldE9wZXJhbmQoU3JjSWR4KS5nZXRSZWcoKTsKKworICAgICAgICAgIGlmIChyZWdBID09IHJlZ0IpIHsKKyAgICAgICAgICAgIC8vIFRoZSByZWdpc3RlciBpcyB0aWVkIHRvIG11bHRpcGxlIGRlc3RpbmF0aW9ucyAob3IgZWxzZSB3ZSB3b3VsZAorICAgICAgICAgICAgLy8gbm90IGhhdmUgY29udGludWVkIHRoaXMgZmFyKSwgYnV0IHRoaXMgdXNlIG9mIHRoZSByZWdpc3RlcgorICAgICAgICAgICAgLy8gYWxyZWFkeSBtYXRjaGVzIHRoZSB0aWVkIGRlc3RpbmF0aW9uLiAgTGVhdmUgaXQuCisgICAgICAgICAgICBBbGxVc2VzQ29waWVkID0gZmFsc2U7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgTGFzdENvcGllZFJlZyA9IHJlZ0E7CisKKyAgICAgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihyZWdCKSAmJgorICAgICAgICAgICAgICAgICAiY2Fubm90IG1ha2UgaW5zdHJ1Y3Rpb24gaW50byB0d28tYWRkcmVzcyBmb3JtIik7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgLy8gRmlyc3QsIHZlcmlmeSB0aGF0IHdlIGRvbid0IGhhdmUgYSB1c2Ugb2YgImEiIGluIHRoZSBpbnN0cnVjdGlvbgorICAgICAgICAgIC8vIChhID0gYiArIGEgZm9yIGV4YW1wbGUpIGJlY2F1c2Ugb3VyIHRyYW5zZm9ybWF0aW9uIHdpbGwgbm90CisgICAgICAgICAgLy8gd29yay4gVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIgYmVjYXVzZSB3ZSBhcmUgaW4gU1NBIGZvcm0uCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBtaS0+Z2V0TnVtT3BlcmFuZHMoKTsgKytpKQorICAgICAgICAgICAgYXNzZXJ0KGkgPT0gRHN0SWR4IHx8CisgICAgICAgICAgICAgICAgICAgIW1pLT5nZXRPcGVyYW5kKGkpLmlzUmVnKCkgfHwKKyAgICAgICAgICAgICAgICAgICBtaS0+Z2V0T3BlcmFuZChpKS5nZXRSZWcoKSAhPSByZWdBKTsKKyNlbmRpZgorCisgICAgICAgICAgLy8gRW1pdCBhIGNvcHkgb3IgcmVtYXRlcmlhbGl6ZSB0aGUgZGVmaW5pdGlvbi4KKyAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpyYyA9IE1SSS0+Z2V0UmVnQ2xhc3MocmVnQik7CisgICAgICAgICAgTWFjaGluZUluc3RyICpEZWZNSSA9IE1SSS0+Z2V0VlJlZ0RlZihyZWdCKTsKKyAgICAgICAgICAvLyBJZiBpdCdzIHNhZmUgYW5kIHByb2ZpdGFibGUsIHJlbWF0IHRoZSBkZWZpbml0aW9uIGluc3RlYWQgb2YKKyAgICAgICAgICAvLyBjb3B5aW5nIGl0LgorICAgICAgICAgIGlmIChEZWZNSSAmJgorICAgICAgICAgICAgICBEZWZNSS0+Z2V0RGVzYygpLmlzQXNDaGVhcEFzQU1vdmUoKSAmJgorICAgICAgICAgICAgICBEZWZNSS0+aXNTYWZlVG9SZU1hdChUSUksIEFBLCByZWdCKSAmJgorICAgICAgICAgICAgICBpc1Byb2ZpdGFibGVUb1JlTWF0KHJlZ0IsIHJjLCBtaSwgRGVmTUksIG1iYmksIERpc3QpKXsKKyAgICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiMmFkZHI6IFJFTUFUVElORyA6ICIgPDwgKkRlZk1JIDw8ICJcbiIpOworICAgICAgICAgICAgdW5zaWduZWQgcmVnQVN1YklkeCA9IG1pLT5nZXRPcGVyYW5kKERzdElkeCkuZ2V0U3ViUmVnKCk7CisgICAgICAgICAgICBUSUktPnJlTWF0ZXJpYWxpemUoKm1iYmksIG1pLCByZWdBLCByZWdBU3ViSWR4LCBEZWZNSSwgKlRSSSk7CisgICAgICAgICAgICBSZU1hdFJlZ3Muc2V0KHJlZ0IpOworICAgICAgICAgICAgKytOdW1SZU1hdHM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJ1aWxkTUkoKm1iYmksIG1pLCBtaS0+Z2V0RGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICAgICAgICAgICAgICAgICAgcmVnQSkuYWRkUmVnKHJlZ0IpOworICAgICAgICAgIH0KKworICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBwcmV2TUkgPSBwcmlvcihtaSk7CisgICAgICAgICAgLy8gVXBkYXRlIERpc3RhbmNlTWFwLgorICAgICAgICAgIERpc3RhbmNlTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihwcmV2TUksIERpc3QpKTsKKyAgICAgICAgICBEaXN0YW5jZU1hcFttaV0gPSArK0Rpc3Q7CisKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRwcmVwZW5kOlx0IiA8PCAqcHJldk1JKTsKKworICAgICAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IG1pLT5nZXRPcGVyYW5kKFNyY0lkeCk7CisgICAgICAgICAgYXNzZXJ0KE1PLmlzUmVnKCkgJiYgTU8uZ2V0UmVnKCkgPT0gcmVnQiAmJiBNTy5pc1VzZSgpICYmCisgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgb3BlcmFuZCBpbmZvIGZvciAyLXJlZyBwYXNzIik7CisgICAgICAgICAgaWYgKE1PLmlzS2lsbCgpKSB7CisgICAgICAgICAgICBNTy5zZXRJc0tpbGwoZmFsc2UpOworICAgICAgICAgICAgUmVtb3ZlZEtpbGxGbGFnID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgTU8uc2V0UmVnKHJlZ0EpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEFsbFVzZXNDb3BpZWQpIHsKKyAgICAgICAgICAvLyBSZXBsYWNlIG90aGVyICh1bi10aWVkKSB1c2VzIG9mIHJlZ0Igd2l0aCBMYXN0Q29waWVkUmVnLgorICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBtaS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IG1pLT5nZXRPcGVyYW5kKGkpOworICAgICAgICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uZ2V0UmVnKCkgPT0gcmVnQiAmJiBNTy5pc1VzZSgpKSB7CisgICAgICAgICAgICAgIGlmIChNTy5pc0tpbGwoKSkgeworICAgICAgICAgICAgICAgIE1PLnNldElzS2lsbChmYWxzZSk7CisgICAgICAgICAgICAgICAgUmVtb3ZlZEtpbGxGbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBNTy5zZXRSZWcoTGFzdENvcGllZFJlZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gVXBkYXRlIGxpdmUgdmFyaWFibGVzIGZvciByZWdCLgorICAgICAgICAgIGlmIChSZW1vdmVkS2lsbEZsYWcgJiYgTFYgJiYgTFYtPmdldFZhckluZm8ocmVnQikucmVtb3ZlS2lsbChtaSkpCisgICAgICAgICAgICBMVi0+YWRkVmlydHVhbFJlZ2lzdGVyS2lsbGVkKHJlZ0IsIHByaW9yKG1pKSk7CisKKyAgICAgICAgfSBlbHNlIGlmIChSZW1vdmVkS2lsbEZsYWcpIHsKKyAgICAgICAgICAvLyBTb21lIHRpZWQgdXNlcyBvZiByZWdCIG1hdGNoZWQgdGhlaXIgZGVzdGluYXRpb24gcmVnaXN0ZXJzLCBzbworICAgICAgICAgIC8vIHJlZ0IgaXMgc3RpbGwgdXNlZCBpbiB0aGlzIGluc3RydWN0aW9uLCBidXQgYSBraWxsIGZsYWcgd2FzCisgICAgICAgICAgLy8gcmVtb3ZlZCBmcm9tIGEgZGlmZmVyZW50IHRpZWQgdXNlIG9mIHJlZ0IsIHNvIG5vdyB3ZSBuZWVkIHRvIGFkZAorICAgICAgICAgIC8vIGEga2lsbCBmbGFnIHRvIG9uZSBvZiB0aGUgcmVtYWluaW5nIHVzZXMgb2YgcmVnQi4KKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gbWktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBtaS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmdldFJlZygpID09IHJlZ0IgJiYgTU8uaXNVc2UoKSkgeworICAgICAgICAgICAgICBNTy5zZXRJc0tpbGwodHJ1ZSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNjaGVkdWxlIHRoZSBzb3VyY2UgY29weSAvIHJlbWF0IGluc2VydGVkIHRvIGZvcm0gdHdvLWFkZHJlc3MKKyAgICAgICAgLy8gaW5zdHJ1Y3Rpb24uIEZJWE1FOiBEb2VzIGl0IG1hdHRlciB0aGUgZGlzdGFuY2UgbWFwIG1heSBub3QgYmUKKyAgICAgICAgLy8gYWNjdXJhdGUgYWZ0ZXIgaXQncyBzY2hlZHVsZWQ/CisgICAgICAgIFRJSS0+c2NoZWR1bGVUd29BZGRyU291cmNlKHByaW9yKG1pKSwgbWksICpUUkkpOworCisgICAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdHJld3JpdGUgdG86XHQiIDw8ICptaSk7CisgICAgICB9CisKKyAgICAgIC8vIFJld3JpdGUgSU5TRVJUX1NVQlJFRyBhcyBDT1BZIG5vdyB0aGF0IHdlIG5vIGxvbmdlciBuZWVkIFNTQSBmb3JtLgorICAgICAgaWYgKG1pLT5pc0luc2VydFN1YnJlZygpKSB7CisgICAgICAgIC8vIEZyb20gJXJlZyA9IElOU0VSVF9TVUJSRUcgJXJlZywgJXN1YnJlZywgc3ViaWR4CisgICAgICAgIC8vIFRvICAgJXJlZzpzdWJpZHggPSBDT1BZICVzdWJyZWcKKyAgICAgICAgdW5zaWduZWQgU3ViSWR4ID0gbWktPmdldE9wZXJhbmQoMykuZ2V0SW1tKCk7CisgICAgICAgIG1pLT5SZW1vdmVPcGVyYW5kKDMpOworICAgICAgICBhc3NlcnQobWktPmdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCkgPT0gMCAmJiAiVW5leHBlY3RlZCBzdWJyZWcgaWR4Iik7CisgICAgICAgIG1pLT5nZXRPcGVyYW5kKDApLnNldFN1YlJlZyhTdWJJZHgpOworICAgICAgICBtaS0+UmVtb3ZlT3BlcmFuZCgxKTsKKyAgICAgICAgbWktPnNldERlc2MoVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSk7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdGNvbnZlcnQgdG86XHQiIDw8ICptaSk7CisgICAgICB9CisKKyAgICAgIC8vIENsZWFyIFRpZWRPcGVyYW5kcyBoZXJlIGluc3RlYWQgb2YgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcAorICAgICAgLy8gc2luY2UgbW9zdCBpbnN0cnVjdGlvbnMgZG8gbm90IGhhdmUgdGllZCBvcGVyYW5kcy4KKyAgICAgIFRpZWRPcGVyYW5kcy5jbGVhcigpOworICAgICAgbWkgPSBubWk7CisgICAgfQorICB9CisKKyAgLy8gU29tZSByZW1hdCdlZCBpbnN0cnVjdGlvbnMgYXJlIGRlYWQuCisgIGludCBWUmVnID0gUmVNYXRSZWdzLmZpbmRfZmlyc3QoKTsKKyAgd2hpbGUgKFZSZWcgIT0gLTEpIHsKKyAgICBpZiAoTVJJLT51c2Vfbm9kYmdfZW1wdHkoVlJlZykpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBNUkktPmdldFZSZWdEZWYoVlJlZyk7CisgICAgICBEZWZNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgfQorICAgIFZSZWcgPSBSZU1hdFJlZ3MuZmluZF9uZXh0KFZSZWcpOworICB9CisKKyAgLy8gRWxpbWluYXRlIFJFR19TRVFVRU5DRSBpbnN0cnVjdGlvbnMuIFRoZWlyIHdob2xlIHB1cnBvc2Ugd2FzIHRvIHByZXNldmUKKyAgLy8gU1NBIGZvcm0uIEl0J3Mgbm93IHNhZmUgdG8gZGUtU1NBLgorICBNYWRlQ2hhbmdlIHw9IEVsaW1pbmF0ZVJlZ1NlcXVlbmNlcygpOworCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCitzdGF0aWMgdm9pZCBVcGRhdGVSZWdTZXF1ZW5jZVNyY3ModW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdFJlZywgdW5zaWduZWQgU3ViSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgeworICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnJlZ19pdGVyYXRvciBSSSA9IE1SSS0+cmVnX2JlZ2luKFNyY1JlZyksCisgICAgICAgICBSRSA9IE1SSS0+cmVnX2VuZCgpOyBSSSAhPSBSRTsgKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gUkkuZ2V0T3BlcmFuZCgpOworICAgICsrUkk7CisgICAgTU8uc3Vic3RWaXJ0UmVnKERzdFJlZywgU3ViSWR4LCBUUkkpOworICB9Cit9CisKKy8vLyBDb2FsZXNjZUV4dFN1YlJlZ3MgLSBJZiBhIG51bWJlciBvZiBzb3VyY2VzIG9mIHRoZSBSRUdfU0VRVUVOQ0UgYXJlCisvLy8gRVhUUkFDVF9TVUJSRUcgZnJvbSB0aGUgc2FtZSByZWdpc3RlciBhbmQgdG8gdGhlIHNhbWUgdmlydHVhbCByZWdpc3RlcgorLy8vIHdpdGggZGlmZmVyZW50IHN1Yi1yZWdpc3RlciBpbmRpY2VzLCBhdHRlbXB0IHRvIGNvbWJpbmUgdGhlCisvLy8gRVhUUkFDVF9TVUJSRUdzIGFuZCBwcmUtY29hbGVzY2UgdGhlbS4gZS5nLgorLy8vICVyZWcxMDI2PGRlZj4gPSBWTERNUSAlcmVnMTAyNTxraWxsPiwgMjYwLCBwcmVkOjE0LCBwcmVkOiVyZWcwCisvLy8gJXJlZzEwMjk6NjxkZWY+ID0gRVhUUkFDVF9TVUJSRUcgJXJlZzEwMjYsIDYKKy8vLyAlcmVnMTAyOTo1PGRlZj4gPSBFWFRSQUNUX1NVQlJFRyAlcmVnMTAyNjxraWxsPiwgNQorLy8vIFNpbmNlIEQgc3VicmVncyA1LCA2IGNhbiBjb21iaW5lIHRvIGEgUSByZWdpc3Rlciwgd2UgY2FuIGNvYWxlc2NlCisvLy8gcmVnMTAyNiB0byByZWcxMDI5Lgordm9pZAorVHdvQWRkcmVzc0luc3RydWN0aW9uUGFzczo6Q29hbGVzY2VFeHRTdWJSZWdzKFNtYWxsVmVjdG9yPHVuc2lnbmVkLDQ+ICZTcmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdFJlZykgeworICBTbWFsbFNldDx1bnNpZ25lZCwgND4gU2VlbjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNyY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIFNyY1JlZyA9IFNyY3NbaV07CisgICAgaWYgKCFTZWVuLmluc2VydChTcmNSZWcpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBpbnN0cnVjdGlvbnMgYXJlIGFsbCBpbiB0aGUgc2FtZSBiYXNpYyBibG9jay4KKyAgICBNYWNoaW5lSW5zdHIgKlNyY0RlZk1JID0gTVJJLT5nZXRWUmVnRGVmKFNyY1JlZyk7CisgICAgTWFjaGluZUluc3RyICpEc3REZWZNSSA9IE1SSS0+Z2V0VlJlZ0RlZihEc3RSZWcpOworICAgIGlmIChTcmNEZWZNSS0+Z2V0UGFyZW50KCkgIT0gRHN0RGVmTUktPmdldFBhcmVudCgpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgdXNlcyB0aGFuIGNvcGllcyB3aGljaCBmZWVkIGludG8KKyAgICAvLyB0aGUgcmVnX3NlcXVlbmNlLCB0aGVuIHdlIG1pZ2h0IGJlIGFibGUgdG8gY29hbGVzY2UgdGhlbS4KKyAgICBib29sIENhbkNvYWxlc2NlID0gdHJ1ZTsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gU3JjU3ViSW5kaWNlcywgRHN0U3ViSW5kaWNlczsKKyAgICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9ub2RiZ19pdGVyYXRvcgorICAgICAgICAgICBVSSA9IE1SSS0+dXNlX25vZGJnX2JlZ2luKFNyY1JlZyksCisgICAgICAgICAgIFVFID0gTVJJLT51c2Vfbm9kYmdfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gJipVSTsKKyAgICAgIGlmICghVXNlTUktPmlzQ29weSgpIHx8IFVzZU1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpICE9IERzdFJlZykgeworICAgICAgICBDYW5Db2FsZXNjZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIFNyY1N1YkluZGljZXMucHVzaF9iYWNrKFVzZU1JLT5nZXRPcGVyYW5kKDEpLmdldFN1YlJlZygpKTsKKyAgICAgIERzdFN1YkluZGljZXMucHVzaF9iYWNrKFVzZU1JLT5nZXRPcGVyYW5kKDApLmdldFN1YlJlZygpKTsKKyAgICB9CisKKyAgICBpZiAoIUNhbkNvYWxlc2NlIHx8IFNyY1N1YkluZGljZXMuc2l6ZSgpIDwgMikKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgc291cmNlIHN1YnJlZ2lzdGVycyBjYW4gYmUgY29tYmluZWQuCisgICAgc3RkOjpzb3J0KFNyY1N1YkluZGljZXMuYmVnaW4oKSwgU3JjU3ViSW5kaWNlcy5lbmQoKSk7CisgICAgdW5zaWduZWQgTmV3U3JjU3ViSWR4ID0gMDsKKyAgICBpZiAoIVRSSS0+Y2FuQ29tYmluZVN1YlJlZ0luZGljZXMoTVJJLT5nZXRSZWdDbGFzcyhTcmNSZWcpLCBTcmNTdWJJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdTcmNTdWJJZHgpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBkZXN0aW5hdGlvbiBzdWJyZWdpc3RlcnMgY2FuIGFsc28gYmUgY29tYmluZWQuCisgICAgc3RkOjpzb3J0KERzdFN1YkluZGljZXMuYmVnaW4oKSwgRHN0U3ViSW5kaWNlcy5lbmQoKSk7CisgICAgdW5zaWduZWQgTmV3RHN0U3ViSWR4ID0gMDsKKyAgICBpZiAoIVRSSS0+Y2FuQ29tYmluZVN1YlJlZ0luZGljZXMoTVJJLT5nZXRSZWdDbGFzcyhEc3RSZWcpLCBEc3RTdWJJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdEc3RTdWJJZHgpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBJZiBuZWl0aGVyIHNvdXJjZSBub3IgZGVzdGluYXRpb24gY2FuIGJlIGNvbWJpbmVkIHRvIHRoZSBmdWxsIHJlZ2lzdGVyLAorICAgIC8vIGp1c3QgZ2l2ZSB1cC4gIFRoaXMgY291bGQgYmUgaW1wcm92ZWQgaWYgaXQgZXZlciBtYXR0ZXJzLgorICAgIGlmIChOZXdTcmNTdWJJZHggIT0gMCAmJiBOZXdEc3RTdWJJZHggIT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gTm93IHRoYXQgd2Uga25vdyB0aGF0IGFsbCB0aGUgdXNlcyBhcmUgZXh0cmFjdF9zdWJyZWdzIGFuZCB0aGF0IHRob3NlCisgICAgLy8gc3VicmVncyBjYW4gc29tZWhvdyBiZSBjb21iaW5lZCwgc2NhbiBhbGwgdGhlIGV4dHJhY3Rfc3VicmVncyBhZ2FpbiB0bworICAgIC8vIG1ha2Ugc3VyZSB0aGUgc3VicmVncyBhcmUgaW4gdGhlIHJpZ2h0IG9yZGVyIGFuZCBjYW4gYmUgY29tcG9zZWQuCisgICAgTWFjaGluZUluc3RyICpTb21lTUkgPSAwOworICAgIENhbkNvYWxlc2NlID0gdHJ1ZTsKKyAgICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9ub2RiZ19pdGVyYXRvcgorICAgICAgICAgICBVSSA9IE1SSS0+dXNlX25vZGJnX2JlZ2luKFNyY1JlZyksCisgICAgICAgICAgIFVFID0gTVJJLT51c2Vfbm9kYmdfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gJipVSTsKKyAgICAgIGFzc2VydChVc2VNSS0+aXNDb3B5KCkpOworICAgICAgdW5zaWduZWQgRHN0U3ViSWR4ID0gVXNlTUktPmdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCk7CisgICAgICB1bnNpZ25lZCBTcmNTdWJJZHggPSBVc2VNSS0+Z2V0T3BlcmFuZCgxKS5nZXRTdWJSZWcoKTsKKyAgICAgIGFzc2VydChEc3RTdWJJZHggIT0gMCAmJiAibWlzc2luZyBzdWJyZWcgZnJvbSBSZWdTZXF1ZW5jZSBlbGltaW5hdGlvbiIpOworICAgICAgaWYgKChOZXdEc3RTdWJJZHggPT0gMCAmJgorICAgICAgICAgICBUUkktPmNvbXBvc2VTdWJSZWdJbmRpY2VzKE5ld1NyY1N1YklkeCwgRHN0U3ViSWR4KSAhPSBTcmNTdWJJZHgpIHx8CisgICAgICAgICAgKE5ld1NyY1N1YklkeCA9PSAwICYmCisgICAgICAgICAgIFRSSS0+Y29tcG9zZVN1YlJlZ0luZGljZXMoTmV3RHN0U3ViSWR4LCBTcmNTdWJJZHgpICE9IERzdFN1YklkeCkpIHsKKyAgICAgICAgQ2FuQ29hbGVzY2UgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBLZWVwIHRyYWNrIG9mIG9uZSBvZiB0aGUgdXNlcy4KKyAgICAgIFNvbWVNSSA9IFVzZU1JOworICAgIH0KKyAgICBpZiAoIUNhbkNvYWxlc2NlKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBJbnNlcnQgYSBjb3B5IHRvIHJlcGxhY2UgdGhlIG9yaWdpbmFsLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRMb2MgPSBTb21lTUk7CisgICAgTWFjaGluZUluc3RyICpDb3B5TUkgPSBCdWlsZE1JKCpTb21lTUktPmdldFBhcmVudCgpLCBTb21lTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWVNSS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSkKKyAgICAgIC5hZGRSZWcoRHN0UmVnLCBSZWdTdGF0ZTo6RGVmaW5lLCBOZXdEc3RTdWJJZHgpCisgICAgICAuYWRkUmVnKFNyY1JlZywgMCwgTmV3U3JjU3ViSWR4KTsKKworICAgIC8vIFJlbW92ZSBhbGwgdGhlIG9sZCBleHRyYWN0IGluc3RydWN0aW9ucy4KKyAgICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OnVzZV9ub2RiZ19pdGVyYXRvcgorICAgICAgICAgICBVSSA9IE1SSS0+dXNlX25vZGJnX2JlZ2luKFNyY1JlZyksCisgICAgICAgICAgIFVFID0gTVJJLT51c2Vfbm9kYmdfZW5kKCk7IFVJICE9IFVFOyApIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqVXNlTUkgPSAmKlVJOworICAgICAgKytVSTsKKyAgICAgIGlmIChVc2VNSSA9PSBDb3B5TUkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgYXNzZXJ0KFVzZU1JLT5pc0NvcHkoKSk7CisgICAgICAvLyBNb3ZlIGFueSBraWxscyB0byB0aGUgbmV3IGNvcHkgb3IgZXh0cmFjdCBpbnN0cnVjdGlvbi4KKyAgICAgIGlmIChVc2VNSS0+Z2V0T3BlcmFuZCgxKS5pc0tpbGwoKSkgeworICAgICAgICBDb3B5TUktPmdldE9wZXJhbmQoMSkuc2V0SXNLaWxsKCk7CisgICAgICAgIGlmIChMVikKKyAgICAgICAgICAvLyBVcGRhdGUgbGl2ZSB2YXJpYWJsZXMKKyAgICAgICAgICBMVi0+cmVwbGFjZUtpbGxJbnN0cnVjdGlvbihTcmNSZWcsIFVzZU1JLCAmKkNvcHlNSSk7CisgICAgICB9CisgICAgICBVc2VNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBib29sIEhhc090aGVyUmVnU2VxdWVuY2VVc2VzKHVuc2lnbmVkIFJlZywgTWFjaGluZUluc3RyICpSZWdTZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkkpIHsKKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjp1c2VfaXRlcmF0b3IgVUkgPSBNUkktPnVzZV9iZWdpbihSZWcpLAorICAgICAgICAgVUUgPSBNUkktPnVzZV9lbmQoKTsgVUkgIT0gVUU7ICsrVUkpIHsKKyAgICBNYWNoaW5lSW5zdHIgKlVzZU1JID0gJipVSTsKKyAgICBpZiAoVXNlTUkgIT0gUmVnU2VxICYmIFVzZU1JLT5pc1JlZ1NlcXVlbmNlKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBFbGltaW5hdGVSZWdTZXF1ZW5jZXMgLSBFbGltaW5hdGUgUkVHX1NFUVVFTkNFIGluc3RydWN0aW9ucyBhcyBwYXJ0CisvLy8gb2YgdGhlIGRlLXNzYSBwcm9jZXNzLiBUaGlzIHJlcGxhY2VzIHNvdXJjZXMgb2YgUkVHX1NFUVVFTkNFIGFzCisvLy8gc3ViLXJlZ2lzdGVyIHJlZmVyZW5jZXMgb2YgdGhlIHJlZ2lzdGVyIGRlZmluZWQgYnkgUkVHX1NFUVVFTkNFLiBlLmcuCisvLy8KKy8vLyAlcmVnMTAyOTxkZWY+LCAlcmVnMTAzMDxkZWY+ID0gVkxEMXExNiAlcmVnMTAyNDxraWxsPiwgLi4uCisvLy8gJXJlZzEwMzE8ZGVmPiA9IFJFR19TRVFVRU5DRSAlcmVnMTAyOTxraWxsPiwgNSwgJXJlZzEwMzA8a2lsbD4sIDYKKy8vLyA9PgorLy8vICVyZWcxMDMxOjU8ZGVmPiwgJXJlZzEwMzE6NjxkZWY+ID0gVkxEMXExNiAlcmVnMTAyNDxraWxsPiwgLi4uCitib29sIFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3M6OkVsaW1pbmF0ZVJlZ1NlcXVlbmNlcygpIHsKKyAgaWYgKFJlZ1NlcXVlbmNlcy5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnU2VxdWVuY2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gUmVnU2VxdWVuY2VzW2ldOworICAgIHVuc2lnbmVkIERzdFJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRTdWJSZWcoKSB8fAorICAgICAgICBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihEc3RSZWcpIHx8CisgICAgICAgICEoTUktPmdldE51bU9wZXJhbmRzKCkgJiAxKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJJbGxlZ2FsIFJFR19TRVFVRU5DRSBpbnN0cnVjdGlvbjoiIDw8ICpNSSk7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgIH0KKworICAgIGJvb2wgSXNJbXBEZWYgPSB0cnVlOworICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBSZWFsU3JjczsKKyAgICBTbWFsbFNldDx1bnNpZ25lZCwgND4gU2VlbjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgPCBlOyBpICs9IDIpIHsKKyAgICAgIHVuc2lnbmVkIFNyY1JlZyA9IE1JLT5nZXRPcGVyYW5kKGkpLmdldFJlZygpOworICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKGkpLmdldFN1YlJlZygpIHx8CisgICAgICAgICAgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoU3JjUmVnKSkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIklsbGVnYWwgUkVHX1NFUVVFTkNFIGluc3RydWN0aW9uOiIgPDwgKk1JKTsKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICAgIH0KKworICAgICAgTWFjaGluZUluc3RyICpEZWZNSSA9IE1SSS0+Z2V0VlJlZ0RlZihTcmNSZWcpOworICAgICAgaWYgKERlZk1JLT5pc0ltcGxpY2l0RGVmKCkpIHsKKyAgICAgICAgRGVmTUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIElzSW1wRGVmID0gZmFsc2U7CisKKyAgICAgIC8vIFJlbWVtYmVyIENPUFkgc291cmNlcy4gVGhlc2UgbWlnaHQgYmUgY2FuZGlkYXRlIGZvciBjb2FsZXNjaW5nLgorICAgICAgaWYgKERlZk1JLT5pc0NvcHkoKSAmJiBEZWZNSS0+Z2V0T3BlcmFuZCgxKS5nZXRTdWJSZWcoKSkKKyAgICAgICAgUmVhbFNyY3MucHVzaF9iYWNrKERlZk1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpKTsKKworICAgICAgYm9vbCBpc0tpbGwgPSBNSS0+Z2V0T3BlcmFuZChpKS5pc0tpbGwoKTsKKyAgICAgIGlmICghU2Vlbi5pbnNlcnQoU3JjUmVnKSB8fCBNSS0+Z2V0UGFyZW50KCkgIT0gRGVmTUktPmdldFBhcmVudCgpIHx8CisgICAgICAgICAgIWlzS2lsbCB8fCBIYXNPdGhlclJlZ1NlcXVlbmNlVXNlcyhTcmNSZWcsIE1JLCBNUkkpKSB7CisgICAgICAgIC8vIFJFR19TRVFVRU5DRSBjYW5ub3QgaGF2ZSBkdXBsaWNhdGVkIG9wZXJhbmRzLCBhZGQgYSBjb3B5LgorICAgICAgICAvLyBBbHNvIGFkZCBhbiBjb3B5IGlmIHRoZSBzb3VyY2UgaXMgbGl2ZS1pbiB0aGUgYmxvY2suIFdlIGRvbid0IHdhbnQKKyAgICAgICAgLy8gdG8gZW5kIHVwIHdpdGggYSBwYXJ0aWFsLXJlZGVmIG9mIGEgbGl2ZWluLCBlLmcuCisgICAgICAgIC8vIEJCMDoKKyAgICAgICAgLy8gcmVnMTA1MToxMDxkZWY+ID0KKyAgICAgICAgLy8gLi4uCisgICAgICAgIC8vIEJCMToKKyAgICAgICAgLy8gLi4uID0gcmVnMTA1MToxMAorICAgICAgICAvLyBCQjI6CisgICAgICAgIC8vIHJlZzEwNTE6OTxkZWY+ID0KKyAgICAgICAgLy8gTGl2ZUludGVydmFsQW5hbHlzaXMgd29uJ3QgbGlrZSBpdC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhlIFJFR19TRVFVRU5DRSBkb2Vzbid0IGtpbGwgaXRzIHNvdXJjZSwga2VlcGluZyBsaXZlIHZhcmlhYmxlcworICAgICAgICAvLyBjb3JyZWN0bHkgdXAgdG8gZGF0ZSBiZWNvbWVzIHZlcnkgZGlmZmljdWx0LiBJbnNlcnQgYSBjb3B5LgorCisgICAgICAgIC8vIERlZmVyIGFueSBraWxsIGZsYWcgdG8gdGhlIGxhc3Qgb3BlcmFuZCB1c2luZyBTcmNSZWcuIE90aGVyd2lzZSwgd2UKKyAgICAgICAgLy8gbWlnaHQgaW5zZXJ0IGEgQ09QWSB0aGF0IHVzZXMgU3JjUmVnIGFmdGVyIGlzIHdhcyBraWxsZWQuCisgICAgICAgIGlmIChpc0tpbGwpCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gaSArIDI7IGogPCBlOyBqICs9IDIpCisgICAgICAgICAgICBpZiAoTUktPmdldE9wZXJhbmQoaikuZ2V0UmVnKCkgPT0gU3JjUmVnKSB7CisgICAgICAgICAgICAgIE1JLT5nZXRPcGVyYW5kKGopLnNldElzS2lsbCgpOworICAgICAgICAgICAgICBpc0tpbGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydExvYyA9IE1JOworICAgICAgICBNYWNoaW5lSW5zdHIgKkNvcHlNSSA9IEJ1aWxkTUkoKk1JLT5nZXRQYXJlbnQoKSwgSW5zZXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSS0+Z2V0RGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSkKKyAgICAgICAgICAgIC5hZGRSZWcoRHN0UmVnLCBSZWdTdGF0ZTo6RGVmaW5lLCBNSS0+Z2V0T3BlcmFuZChpKzEpLmdldEltbSgpKQorICAgICAgICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKTsKKyAgICAgICAgTUktPmdldE9wZXJhbmQoaSkuc2V0UmVnKDApOworICAgICAgICBpZiAoTFYgJiYgaXNLaWxsKQorICAgICAgICAgIExWLT5yZXBsYWNlS2lsbEluc3RydWN0aW9uKFNyY1JlZywgTUksIENvcHlNSSk7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiSW5zZXJ0ZWQ6ICIgPDwgKkNvcHlNSSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpIDwgZTsgaSArPSAyKSB7CisgICAgICB1bnNpZ25lZCBTcmNSZWcgPSBNSS0+Z2V0T3BlcmFuZChpKS5nZXRSZWcoKTsKKyAgICAgIGlmICghU3JjUmVnKSBjb250aW51ZTsKKyAgICAgIHVuc2lnbmVkIFN1YklkeCA9IE1JLT5nZXRPcGVyYW5kKGkrMSkuZ2V0SW1tKCk7CisgICAgICBVcGRhdGVSZWdTZXF1ZW5jZVNyY3MoU3JjUmVnLCBEc3RSZWcsIFN1YklkeCwgTVJJLCAqVFJJKTsKKyAgICB9CisKKyAgICBpZiAoSXNJbXBEZWYpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiVHVybmVkOiAiIDw8ICpNSSA8PCAiIGludG8gYW4gSU1QTElDSVRfREVGIik7CisgICAgICBNSS0+c2V0RGVzYyhUSUktPmdldChUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRikpOworICAgICAgZm9yIChpbnQgaiA9IE1JLT5nZXROdW1PcGVyYW5kcygpIC0gMSwgZWUgPSAwOyBqID4gZWU7IC0taikKKyAgICAgICAgTUktPlJlbW92ZU9wZXJhbmQoaik7ICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRWxpbWluYXRlZDogIiA8PCAqTUkpOworICAgICAgTUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIH0KKworICAgIC8vIFRyeSBjb2FsZXNjaW5nIHNvbWUgRVhUUkFDVF9TVUJSRUcgaW5zdHJ1Y3Rpb25zLiBUaGlzIGNhbiBjcmVhdGUKKyAgICAvLyBJTlNFUlRfU1VCUkVHIGluc3RydWN0aW9ucyB0aGF0IG11c3QgaGF2ZSA8dW5kZWY+IGZsYWdzIGFkZGVkIGJ5CisgICAgLy8gTGl2ZUludGVydmFsQW5hbHlzaXMsIHNvIG9ubHkgcnVuIGl0IHdoZW4gTGl2ZVZhcmlhYmxlcyBpcyBhdmFpbGFibGUuCisgICAgaWYgKExWKQorICAgICAgQ29hbGVzY2VFeHRTdWJSZWdzKFJlYWxTcmNzLCBEc3RSZWcpOworICB9CisKKyAgUmVnU2VxdWVuY2VzLmNsZWFyKCk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vVW5yZWFjaGFibGVCbG9ja0VsaW0uY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vVW5yZWFjaGFibGVCbG9ja0VsaW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZTJhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9VbnJlYWNoYWJsZUJsb2NrRWxpbS5jcHAKQEAgLTAsMCArMSwyMDYgQEAKKy8vPT09LS0gVW5yZWFjaGFibGVCbG9ja0VsaW0uY3BwIC0gUmVtb3ZlIHVucmVhY2hhYmxlIGJsb2NrcyBmb3IgY29kZWdlbiAtLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGlzIGFuIGV4dHJlbWVseSBzaW1wbGUgdmVyc2lvbiBvZiB0aGUgU2ltcGxpZnlDRkcgcGFzcy4gIEl0cyBzb2xlCisvLyBqb2IgaXMgdG8gZGVsZXRlIExMVk0gYmFzaWMgYmxvY2tzIHRoYXQgYXJlIG5vdCByZWFjaGFibGUgZnJvbSB0aGUgZW50cnkKKy8vIG5vZGUuICBUbyBkbyB0aGlzLCBpdCBwZXJmb3JtcyBhIHNpbXBsZSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwgb2YgdGhlIENGRywKKy8vIHRoZW4gZGVsZXRlcyBhbnkgdW52aXNpdGVkIG5vZGVzLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIHBhc3MgaXMgcmVhbGx5IGEgaGFjay4gIEluIHBhcnRpY3VsYXIsIHRoZSBpbnN0cnVjdGlvbgorLy8gc2VsZWN0b3JzIGZvciB2YXJpb3VzIHRhcmdldHMgc2hvdWxkIGp1c3Qgbm90IGdlbmVyYXRlIGNvZGUgZm9yIHVucmVhY2hhYmxlCisvLyBibG9ja3MuICBVbnRpbCBMTFZNIGhhcyBhIG1vcmUgc3lzdGVtYXRpYyB3YXkgb2YgZGVmaW5pbmcgaW5zdHJ1Y3Rpb24KKy8vIHNlbGVjdG9ycywgaG93ZXZlciwgd2UgY2Fubm90IHJlYWxseSBleHBlY3QgdGhlbSB0byBoYW5kbGUgYWRkaXRpb25hbAorLy8gY29tcGxleGl0eS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1Byb2ZpbGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBjbGFzcyBVbnJlYWNoYWJsZUJsb2NrRWxpbSA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICAgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgVW5yZWFjaGFibGVCbG9ja0VsaW0oKSA6IEZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8UHJvZmlsZUluZm8+KCk7CisgICAgfQorICB9OworfQorY2hhciBVbnJlYWNoYWJsZUJsb2NrRWxpbTo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKFVucmVhY2hhYmxlQmxvY2tFbGltLCAidW5yZWFjaGFibGVibG9ja2VsaW0iLAorICAgICAgICAgICAgICAgICJSZW1vdmUgdW5yZWFjaGFibGUgYmxvY2tzIGZyb20gdGhlIENGRyIsIGZhbHNlLCBmYWxzZSk7CisKK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlVW5yZWFjaGFibGVCbG9ja0VsaW1pbmF0aW9uUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBVbnJlYWNoYWJsZUJsb2NrRWxpbSgpOworfQorCitib29sIFVucmVhY2hhYmxlQmxvY2tFbGltOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgIFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sqLCA4PiBSZWFjaGFibGU7CisKKyAgLy8gTWFyayBhbGwgcmVhY2hhYmxlIGJsb2Nrcy4KKyAgZm9yIChkZl9leHRfaXRlcmF0b3I8RnVuY3Rpb24qLCBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgOD4gPiBJID0KKyAgICAgICBkZl9leHRfYmVnaW4oJkYsIFJlYWNoYWJsZSksIEUgPSBkZl9leHRfZW5kKCZGLCBSZWFjaGFibGUpOyBJICE9IEU7ICsrSSkKKyAgICAvKiBNYXJrIGFsbCByZWFjaGFibGUgYmxvY2tzICovOworCisgIC8vIExvb3Agb3ZlciBhbGwgZGVhZCBibG9ja3MsIHJlbWVtYmVyaW5nIHRoZW0gYW5kIGRlbGV0aW5nIGFsbCBpbnN0cnVjdGlvbnMKKyAgLy8gaW4gdGhlbS4KKyAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+IERlYWRCbG9ja3M7CisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoIVJlYWNoYWJsZS5jb3VudChJKSkgeworICAgICAgQmFzaWNCbG9jayAqQkIgPSBJOworICAgICAgRGVhZEJsb2Nrcy5wdXNoX2JhY2soQkIpOworICAgICAgd2hpbGUgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oQkItPmJlZ2luKCkpKSB7CisgICAgICAgIFBOLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShQTi0+Z2V0VHlwZSgpKSk7CisgICAgICAgIEJCLT5nZXRJbnN0TGlzdCgpLnBvcF9mcm9udCgpOworICAgICAgfQorICAgICAgZm9yIChzdWNjX2l0ZXJhdG9yIFNJID0gc3VjY19iZWdpbihCQiksIEUgPSBzdWNjX2VuZChCQik7IFNJICE9IEU7ICsrU0kpCisgICAgICAgICgqU0kpLT5yZW1vdmVQcmVkZWNlc3NvcihCQik7CisgICAgICBCQi0+ZHJvcEFsbFJlZmVyZW5jZXMoKTsKKyAgICB9CisKKyAgLy8gQWN0dWFsbHkgcmVtb3ZlIHRoZSBibG9ja3Mgbm93LgorICBQcm9maWxlSW5mbyAqUEkgPSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFByb2ZpbGVJbmZvPigpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVhZEJsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKFBJKSBQSS0+cmVtb3ZlQmxvY2soRGVhZEJsb2Nrc1tpXSk7CisgICAgRGVhZEJsb2Nrc1tpXS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KKworICByZXR1cm4gRGVhZEJsb2Nrcy5zaXplKCk7Cit9CisKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgVW5yZWFjaGFibGVNYWNoaW5lQmxvY2tFbGltIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpOworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKyAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JOworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBVbnJlYWNoYWJsZU1hY2hpbmVCbG9ja0VsaW0oKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisgIH07Cit9CitjaGFyIFVucmVhY2hhYmxlTWFjaGluZUJsb2NrRWxpbTo6SUQgPSAwOworCitzdGF0aWMgUmVnaXN0ZXJQYXNzPFVucmVhY2hhYmxlTWFjaGluZUJsb2NrRWxpbT4KK1koInVucmVhY2hhYmxlLW1iYi1lbGltaW5hdGlvbiIsCisgICJSZW1vdmUgdW5yZWFjaGFibGUgbWFjaGluZSBiYXNpYyBibG9ja3MiKTsKKworY2hhciAmbGx2bTo6VW5yZWFjaGFibGVNYWNoaW5lQmxvY2tFbGltSUQgPSBVbnJlYWNoYWJsZU1hY2hpbmVCbG9ja0VsaW06OklEOworCit2b2lkIFVucmVhY2hhYmxlTWFjaGluZUJsb2NrRWxpbTo6Z2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZUxvb3BJbmZvPigpOworICBBVS5hZGRQcmVzZXJ2ZWQ8TWFjaGluZURvbWluYXRvclRyZWU+KCk7CisgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworfQorCitib29sIFVucmVhY2hhYmxlTWFjaGluZUJsb2NrRWxpbTo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSB7CisgIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwgOD4gUmVhY2hhYmxlOworCisgIE1NSSA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8TWFjaGluZU1vZHVsZUluZm8+KCk7CisgIE1hY2hpbmVEb21pbmF0b3JUcmVlICpNRFQgPSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPE1hY2hpbmVEb21pbmF0b3JUcmVlPigpOworICBNYWNoaW5lTG9vcEluZm8gKk1MSSA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8TWFjaGluZUxvb3BJbmZvPigpOworCisgIC8vIE1hcmsgYWxsIHJlYWNoYWJsZSBibG9ja3MuCisgIGZvciAoZGZfZXh0X2l0ZXJhdG9yPE1hY2hpbmVGdW5jdGlvbiosIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwgOD4gPgorICAgICAgIEkgPSBkZl9leHRfYmVnaW4oJkYsIFJlYWNoYWJsZSksIEUgPSBkZl9leHRfZW5kKCZGLCBSZWFjaGFibGUpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIC8qIE1hcmsgYWxsIHJlYWNoYWJsZSBibG9ja3MgKi87CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBkZWFkIGJsb2NrcywgcmVtZW1iZXJpbmcgdGhlbSBhbmQgZGVsZXRpbmcgYWxsIGluc3RydWN0aW9ucworICAvLyBpbiB0aGVtLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+IERlYWRCbG9ja3M7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gRi5iZWdpbigpLCBFID0gRi5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIgPSBJOworCisgICAgLy8gVGVzdCBmb3IgZGVhZG5lc3MuCisgICAgaWYgKCFSZWFjaGFibGUuY291bnQoQkIpKSB7CisgICAgICBEZWFkQmxvY2tzLnB1c2hfYmFjayhCQik7CisKKyAgICAgIC8vIFVwZGF0ZSBkb21pbmF0b3IgYW5kIGxvb3AgaW5mby4KKyAgICAgIGlmIChNTEkpIE1MSS0+cmVtb3ZlQmxvY2soQkIpOworICAgICAgaWYgKE1EVCAmJiBNRFQtPmdldE5vZGUoQkIpKSBNRFQtPmVyYXNlTm9kZShCQik7CisKKyAgICAgIHdoaWxlIChCQi0+c3VjY19iZWdpbigpICE9IEJCLT5zdWNjX2VuZCgpKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBzdWNjID0gKkJCLT5zdWNjX2JlZ2luKCk7CisKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIHN0YXJ0ID0gc3VjYy0+YmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKHN0YXJ0ICE9IHN1Y2MtPmVuZCgpICYmIHN0YXJ0LT5pc1BISSgpKSB7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gc3RhcnQtPmdldE51bU9wZXJhbmRzKCkgLSAxOyBpID49IDI7IGktPTIpCisgICAgICAgICAgICBpZiAoc3RhcnQtPmdldE9wZXJhbmQoaSkuaXNNQkIoKSAmJgorICAgICAgICAgICAgICAgIHN0YXJ0LT5nZXRPcGVyYW5kKGkpLmdldE1CQigpID09IEJCKSB7CisgICAgICAgICAgICAgIHN0YXJ0LT5SZW1vdmVPcGVyYW5kKGkpOworICAgICAgICAgICAgICBzdGFydC0+UmVtb3ZlT3BlcmFuZChpLTEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIEJCLT5yZW1vdmVTdWNjZXNzb3IoQkItPnN1Y2NfYmVnaW4oKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQWN0dWFsbHkgcmVtb3ZlIHRoZSBibG9ja3Mgbm93LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVhZEJsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIERlYWRCbG9ja3NbaV0tPmVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vIENsZWFudXAgUEhJIG5vZGVzLgorICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IEYuYmVnaW4oKSwgRSA9IEYuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCID0gSTsKKyAgICAvLyBQcnVuZSB1bm5lZWRlZCBQSEkgZW50cmllcy4KKyAgICBTbWFsbFB0clNldDxNYWNoaW5lQmFzaWNCbG9jayosIDg+IHByZWRzKEJCLT5wcmVkX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQi0+cHJlZF9lbmQoKSk7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIHBoaSA9IEJCLT5iZWdpbigpOworICAgIHdoaWxlIChwaGkgIT0gQkItPmVuZCgpICYmIHBoaS0+aXNQSEkoKSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gcGhpLT5nZXROdW1PcGVyYW5kcygpIC0gMTsgaSA+PSAyOyBpLT0yKQorICAgICAgICBpZiAoIXByZWRzLmNvdW50KHBoaS0+Z2V0T3BlcmFuZChpKS5nZXRNQkIoKSkpIHsKKyAgICAgICAgICBwaGktPlJlbW92ZU9wZXJhbmQoaSk7CisgICAgICAgICAgcGhpLT5SZW1vdmVPcGVyYW5kKGktMSk7CisgICAgICAgIH0KKworICAgICAgaWYgKHBoaS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAzKSB7CisgICAgICAgIHVuc2lnbmVkIElucHV0ID0gcGhpLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgICAgICB1bnNpZ25lZCBPdXRwdXQgPSBwaGktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisKKyAgICAgICAgTWFjaGluZUluc3RyKiB0ZW1wID0gcGhpOworICAgICAgICArK3BoaTsKKyAgICAgICAgdGVtcC0+ZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgICAgICAgaWYgKElucHV0ICE9IE91dHB1dCkKKyAgICAgICAgICBGLmdldFJlZ0luZm8oKS5yZXBsYWNlUmVnV2l0aChPdXRwdXQsIElucHV0KTsKKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgKytwaGk7CisgICAgfQorICB9CisKKyAgRi5SZW51bWJlckJsb2NrcygpOworCisgIHJldHVybiBEZWFkQmxvY2tzLnNpemUoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1ZpcnRSZWdNYXAuY3BwIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vVmlydFJlZ01hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmZmNmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1ZpcnRSZWdNYXAuY3BwCkBAIC0wLDAgKzEsMjgzIEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9WaXJ0UmVnTWFwLmNwcCAtIFZpcnR1YWwgUmVnaXN0ZXIgTWFwIC0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBWaXJ0UmVnTWFwIGNsYXNzLgorLy8KKy8vIEl0IGFsc28gY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBTcGlsbGVyIGludGVyZmFjZSwgd2hpY2gsIGdpdmVuIGEKKy8vIHZpcnR1YWwgcmVnaXN0ZXIgbWFwIGFuZCBhIG1hY2hpbmUgZnVuY3Rpb24sIGVsaW1pbmF0ZXMgYWxsIHZpcnR1YWwKKy8vIHJlZmVyZW5jZXMgYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCBwaHlzaWNhbCByZWdpc3RlciByZWZlcmVuY2VzIC0gYWRkaW5nIHNwaWxsCisvLyBjb2RlIGFzIG5lY2Vzc2FyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInZpcnRyZWdtYXAiCisjaW5jbHVkZSAiVmlydFJlZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bVNwaWxscyAgLCAiTnVtYmVyIG9mIHJlZ2lzdGVyIHNwaWxscyIpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFZpcnRSZWdNYXAgaW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NoYXIgVmlydFJlZ01hcDo6SUQgPSAwOworCitJTklUSUFMSVpFX1BBU1MoVmlydFJlZ01hcCwgInZpcnRyZWdtYXAiLCAiVmlydHVhbCBSZWdpc3RlciBNYXAiLCBmYWxzZSwgZmFsc2UpOworCitib29sIFZpcnRSZWdNYXA6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmbWYpIHsKKyAgTVJJID0gJm1mLmdldFJlZ0luZm8oKTsKKyAgVElJID0gbWYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgIFRSSSA9IG1mLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICBNRiA9ICZtZjsKKworICBSZU1hdElkID0gTUFYX1NUQUNLX1NMT1QrMTsKKyAgTG93U3BpbGxTbG90ID0gSGlnaFNwaWxsU2xvdCA9IE5PX1NUQUNLX1NMT1Q7CisgIAorICBWaXJ0MlBoeXNNYXAuY2xlYXIoKTsKKyAgVmlydDJTdGFja1Nsb3RNYXAuY2xlYXIoKTsKKyAgVmlydDJSZU1hdElkTWFwLmNsZWFyKCk7CisgIFZpcnQyU3BsaXRNYXAuY2xlYXIoKTsKKyAgVmlydDJTcGxpdEtpbGxNYXAuY2xlYXIoKTsKKyAgUmVNYXRNYXAuY2xlYXIoKTsKKyAgSW1wbGljaXREZWZlZC5jbGVhcigpOworICBTcGlsbFNsb3RUb1VzZXNNYXAuY2xlYXIoKTsKKyAgTUkyVmlydE1hcC5jbGVhcigpOworICBTcGlsbFB0MlZpcnRNYXAuY2xlYXIoKTsKKyAgUmVzdG9yZVB0MlZpcnRNYXAuY2xlYXIoKTsKKyAgRW1lcmdlbmN5U3BpbGxNYXAuY2xlYXIoKTsKKyAgRW1lcmdlbmN5U3BpbGxTbG90cy5jbGVhcigpOworICAKKyAgU3BpbGxTbG90VG9Vc2VzTWFwLnJlc2l6ZSg4KTsKKyAgSW1wbGljaXREZWZlZC5yZXNpemUoTUYtPmdldFJlZ0luZm8oKS5nZXRMYXN0VmlydFJlZygpKzEtCisgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXIpOworCisgIGFsbG9jYXRhYmxlUkNSZWdzLmNsZWFyKCk7CisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjpyZWdjbGFzc19pdGVyYXRvciBJID0gVFJJLT5yZWdjbGFzc19iZWdpbigpLAorICAgICAgICAgRSA9IFRSSS0+cmVnY2xhc3NfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGFsbG9jYXRhYmxlUkNSZWdzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJJLT5nZXRBbGxvY2F0YWJsZVNldChtZiwgKkkpKSk7CisKKyAgZ3JvdygpOworICAKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFZpcnRSZWdNYXA6Omdyb3coKSB7CisgIHVuc2lnbmVkIExhc3RWaXJ0UmVnID0gTUYtPmdldFJlZ0luZm8oKS5nZXRMYXN0VmlydFJlZygpOworICBWaXJ0MlBoeXNNYXAuZ3JvdyhMYXN0VmlydFJlZyk7CisgIFZpcnQyU3RhY2tTbG90TWFwLmdyb3coTGFzdFZpcnRSZWcpOworICBWaXJ0MlJlTWF0SWRNYXAuZ3JvdyhMYXN0VmlydFJlZyk7CisgIFZpcnQyU3BsaXRNYXAuZ3JvdyhMYXN0VmlydFJlZyk7CisgIFZpcnQyU3BsaXRLaWxsTWFwLmdyb3coTGFzdFZpcnRSZWcpOworICBSZU1hdE1hcC5ncm93KExhc3RWaXJ0UmVnKTsKKyAgSW1wbGljaXREZWZlZC5yZXNpemUoTGFzdFZpcnRSZWctVGFyZ2V0UmVnaXN0ZXJJbmZvOjpGaXJzdFZpcnR1YWxSZWdpc3RlcisxKTsKK30KKwordW5zaWduZWQgVmlydFJlZ01hcDo6Z2V0UmVnQWxsb2NQcmVmKHVuc2lnbmVkIHZpcnRSZWcpIHsKKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gSGludCA9IE1SSS0+Z2V0UmVnQWxsb2NhdGlvbkhpbnQodmlydFJlZyk7CisgIHVuc2lnbmVkIHBoeXNSZWcgPSBIaW50LnNlY29uZDsKKyAgaWYgKHBoeXNSZWcgJiYKKyAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIocGh5c1JlZykgJiYgaGFzUGh5cyhwaHlzUmVnKSkKKyAgICBwaHlzUmVnID0gZ2V0UGh5cyhwaHlzUmVnKTsKKyAgaWYgKEhpbnQuZmlyc3QgPT0gMCkKKyAgICByZXR1cm4gKHBoeXNSZWcgJiYgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIocGh5c1JlZykpCisgICAgICA/IHBoeXNSZWcgOiAwOworICByZXR1cm4gVFJJLT5SZXNvbHZlUmVnQWxsb2NIaW50KEhpbnQuZmlyc3QsIHBoeXNSZWcsICpNRik7Cit9CisKK2ludCBWaXJ0UmVnTWFwOjphc3NpZ25WaXJ0MlN0YWNrU2xvdCh1bnNpZ25lZCB2aXJ0UmVnKSB7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKHZpcnRSZWcpKTsKKyAgYXNzZXJ0KFZpcnQyU3RhY2tTbG90TWFwW3ZpcnRSZWddID09IE5PX1NUQUNLX1NMT1QgJiYKKyAgICAgICAgICJhdHRlbXB0IHRvIGFzc2lnbiBzdGFjayBzbG90IHRvIGFscmVhZHkgc3BpbGxlZCByZWdpc3RlciIpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBSQyA9IE1GLT5nZXRSZWdJbmZvKCkuZ2V0UmVnQ2xhc3ModmlydFJlZyk7CisgIGludCBTUyA9IE1GLT5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlU3BpbGxTdGFja09iamVjdChSQy0+Z2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDLT5nZXRBbGlnbm1lbnQoKSk7CisgIGlmIChMb3dTcGlsbFNsb3QgPT0gTk9fU1RBQ0tfU0xPVCkKKyAgICBMb3dTcGlsbFNsb3QgPSBTUzsKKyAgaWYgKEhpZ2hTcGlsbFNsb3QgPT0gTk9fU1RBQ0tfU0xPVCB8fCBTUyA+IEhpZ2hTcGlsbFNsb3QpCisgICAgSGlnaFNwaWxsU2xvdCA9IFNTOworICB1bnNpZ25lZCBJZHggPSBTUy1Mb3dTcGlsbFNsb3Q7CisgIHdoaWxlIChJZHggPj0gU3BpbGxTbG90VG9Vc2VzTWFwLnNpemUoKSkKKyAgICBTcGlsbFNsb3RUb1VzZXNNYXAucmVzaXplKFNwaWxsU2xvdFRvVXNlc01hcC5zaXplKCkqMik7CisgIFZpcnQyU3RhY2tTbG90TWFwW3ZpcnRSZWddID0gU1M7CisgICsrTnVtU3BpbGxzOworICByZXR1cm4gU1M7Cit9CisKK3ZvaWQgVmlydFJlZ01hcDo6YXNzaWduVmlydDJTdGFja1Nsb3QodW5zaWduZWQgdmlydFJlZywgaW50IFNTKSB7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKHZpcnRSZWcpKTsKKyAgYXNzZXJ0KFZpcnQyU3RhY2tTbG90TWFwW3ZpcnRSZWddID09IE5PX1NUQUNLX1NMT1QgJiYKKyAgICAgICAgICJhdHRlbXB0IHRvIGFzc2lnbiBzdGFjayBzbG90IHRvIGFscmVhZHkgc3BpbGxlZCByZWdpc3RlciIpOworICBhc3NlcnQoKFNTID49IDAgfHwKKyAgICAgICAgICAoU1MgPj0gTUYtPmdldEZyYW1lSW5mbygpLT5nZXRPYmplY3RJbmRleEJlZ2luKCkpKSAmJgorICAgICAgICAgImlsbGVnYWwgZml4ZWQgZnJhbWUgaW5kZXgiKTsKKyAgVmlydDJTdGFja1Nsb3RNYXBbdmlydFJlZ10gPSBTUzsKK30KKworaW50IFZpcnRSZWdNYXA6OmFzc2lnblZpcnRSZU1hdElkKHVuc2lnbmVkIHZpcnRSZWcpIHsKKyAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIodmlydFJlZykpOworICBhc3NlcnQoVmlydDJSZU1hdElkTWFwW3ZpcnRSZWddID09IE5PX1NUQUNLX1NMT1QgJiYKKyAgICAgICAgICJhdHRlbXB0IHRvIGFzc2lnbiByZS1tYXQgaWQgdG8gYWxyZWFkeSBzcGlsbGVkIHJlZ2lzdGVyIik7CisgIFZpcnQyUmVNYXRJZE1hcFt2aXJ0UmVnXSA9IFJlTWF0SWQ7CisgIHJldHVybiBSZU1hdElkKys7Cit9CisKK3ZvaWQgVmlydFJlZ01hcDo6YXNzaWduVmlydFJlTWF0SWQodW5zaWduZWQgdmlydFJlZywgaW50IGlkKSB7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKHZpcnRSZWcpKTsKKyAgYXNzZXJ0KFZpcnQyUmVNYXRJZE1hcFt2aXJ0UmVnXSA9PSBOT19TVEFDS19TTE9UICYmCisgICAgICAgICAiYXR0ZW1wdCB0byBhc3NpZ24gcmUtbWF0IGlkIHRvIGFscmVhZHkgc3BpbGxlZCByZWdpc3RlciIpOworICBWaXJ0MlJlTWF0SWRNYXBbdmlydFJlZ10gPSBpZDsKK30KKworaW50IFZpcnRSZWdNYXA6OmdldEVtZXJnZW5jeVNwaWxsU2xvdChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgeworICBzdGQ6Om1hcDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiwgaW50Pjo6aXRlcmF0b3IgSSA9CisgICAgRW1lcmdlbmN5U3BpbGxTbG90cy5maW5kKFJDKTsKKyAgaWYgKEkgIT0gRW1lcmdlbmN5U3BpbGxTbG90cy5lbmQoKSkKKyAgICByZXR1cm4gSS0+c2Vjb25kOworICBpbnQgU1MgPSBNRi0+Z2V0RnJhbWVJbmZvKCktPkNyZWF0ZVNwaWxsU3RhY2tPYmplY3QoUkMtPmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQy0+Z2V0QWxpZ25tZW50KCkpOworICBpZiAoTG93U3BpbGxTbG90ID09IE5PX1NUQUNLX1NMT1QpCisgICAgTG93U3BpbGxTbG90ID0gU1M7CisgIGlmIChIaWdoU3BpbGxTbG90ID09IE5PX1NUQUNLX1NMT1QgfHwgU1MgPiBIaWdoU3BpbGxTbG90KQorICAgIEhpZ2hTcGlsbFNsb3QgPSBTUzsKKyAgRW1lcmdlbmN5U3BpbGxTbG90c1tSQ10gPSBTUzsKKyAgcmV0dXJuIFNTOworfQorCit2b2lkIFZpcnRSZWdNYXA6OmFkZFNwaWxsU2xvdFVzZShpbnQgRkksIE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgaWYgKCFNRi0+Z2V0RnJhbWVJbmZvKCktPmlzRml4ZWRPYmplY3RJbmRleChGSSkpIHsKKyAgICAvLyBJZiBGSSA8IExvd1NwaWxsU2xvdCwgdGhpcyBzdGFjayByZWZlcmVuY2Ugd2FzIHByb2R1Y2VkIGJ5CisgICAgLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGFuZCBpcyBub3QgYSBzcGlsbAorICAgIGlmIChGSSA+PSBMb3dTcGlsbFNsb3QpIHsKKyAgICAgIGFzc2VydChGSSA+PSAwICYmICJTcGlsbCBzbG90IGluZGV4IHNob3VsZCBub3QgYmUgbmVnYXRpdmUhIik7CisgICAgICBhc3NlcnQoKHVuc2lnbmVkKUZJLUxvd1NwaWxsU2xvdCA8IFNwaWxsU2xvdFRvVXNlc01hcC5zaXplKCkKKyAgICAgICAgICAgICAmJiAiSW52YWxpZCBzcGlsbCBzbG90Iik7CisgICAgICBTcGlsbFNsb3RUb1VzZXNNYXBbRkktTG93U3BpbGxTbG90XS5pbnNlcnQoTUkpOworICAgIH0KKyAgfQorfQorCit2b2lkIFZpcnRSZWdNYXA6OnZpcnRGb2xkZWQodW5zaWduZWQgVmlydFJlZywgTWFjaGluZUluc3RyICpPbGRNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk5ld01JLCBNb2RSZWYgTVJJbmZvKSB7CisgIC8vIE1vdmUgcHJldmlvdXMgbWVtb3J5IHJlZmVyZW5jZXMgZm9sZGVkIHRvIG5ldyBpbnN0cnVjdGlvbi4KKyAgTUkyVmlydE1hcFR5OjppdGVyYXRvciBJUCA9IE1JMlZpcnRNYXAubG93ZXJfYm91bmQoTmV3TUkpOworICBmb3IgKE1JMlZpcnRNYXBUeTo6aXRlcmF0b3IgSSA9IE1JMlZpcnRNYXAubG93ZXJfYm91bmQoT2xkTUkpLAorICAgICAgICAgRSA9IE1JMlZpcnRNYXAuZW5kKCk7IEkgIT0gRSAmJiBJLT5maXJzdCA9PSBPbGRNSTsgKSB7CisgICAgTUkyVmlydE1hcC5pbnNlcnQoSVAsIHN0ZDo6bWFrZV9wYWlyKE5ld01JLCBJLT5zZWNvbmQpKTsKKyAgICBNSTJWaXJ0TWFwLmVyYXNlKEkrKyk7CisgIH0KKworICAvLyBhZGQgbmV3IG1lbW9yeSByZWZlcmVuY2UKKyAgTUkyVmlydE1hcC5pbnNlcnQoSVAsIHN0ZDo6bWFrZV9wYWlyKE5ld01JLCBzdGQ6Om1ha2VfcGFpcihWaXJ0UmVnLCBNUkluZm8pKSk7Cit9CisKK3ZvaWQgVmlydFJlZ01hcDo6dmlydEZvbGRlZCh1bnNpZ25lZCBWaXJ0UmVnLCBNYWNoaW5lSW5zdHIgKk1JLCBNb2RSZWYgTVJJbmZvKSB7CisgIE1JMlZpcnRNYXBUeTo6aXRlcmF0b3IgSVAgPSBNSTJWaXJ0TWFwLmxvd2VyX2JvdW5kKE1JKTsKKyAgTUkyVmlydE1hcC5pbnNlcnQoSVAsIHN0ZDo6bWFrZV9wYWlyKE1JLCBzdGQ6Om1ha2VfcGFpcihWaXJ0UmVnLCBNUkluZm8pKSk7Cit9CisKK3ZvaWQgVmlydFJlZ01hcDo6UmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoTWFjaGluZUluc3RyICpNSSkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc0ZJKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpbnQgRkkgPSBNTy5nZXRJbmRleCgpOworICAgIGlmIChNRi0+Z2V0RnJhbWVJbmZvKCktPmlzRml4ZWRPYmplY3RJbmRleChGSSkpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBUaGlzIHN0YWNrIHJlZmVyZW5jZSB3YXMgcHJvZHVjZWQgYnkgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGFuZAorICAgIC8vIGlzIG5vdCBhIHNwaWxsCisgICAgaWYgKEZJIDwgTG93U3BpbGxTbG90KQorICAgICAgY29udGludWU7CisgICAgYXNzZXJ0KCh1bnNpZ25lZClGSS1Mb3dTcGlsbFNsb3QgPCBTcGlsbFNsb3RUb1VzZXNNYXAuc2l6ZSgpCisgICAgICAgICAgICYmICJJbnZhbGlkIHNwaWxsIHNsb3QiKTsKKyAgICBTcGlsbFNsb3RUb1VzZXNNYXBbRkktTG93U3BpbGxTbG90XS5lcmFzZShNSSk7CisgIH0KKyAgTUkyVmlydE1hcC5lcmFzZShNSSk7CisgIFNwaWxsUHQyVmlydE1hcC5lcmFzZShNSSk7CisgIFJlc3RvcmVQdDJWaXJ0TWFwLmVyYXNlKE1JKTsKKyAgRW1lcmdlbmN5U3BpbGxNYXAuZXJhc2UoTUkpOworfQorCisvLy8gRmluZFVudXNlZFJlZ2lzdGVycyAtIEdhdGhlciBhIGxpc3Qgb2YgYWxsb2NhdGFibGUgcmVnaXN0ZXJzIHRoYXQKKy8vLyBoYXZlIG5vdCBiZWVuIGFsbG9jYXRlZCB0byBhbnkgdmlydHVhbCByZWdpc3Rlci4KK2Jvb2wgVmlydFJlZ01hcDo6RmluZFVudXNlZFJlZ2lzdGVycyhMaXZlSW50ZXJ2YWxzKiBMSXMpIHsKKyAgdW5zaWduZWQgTnVtUmVncyA9IFRSSS0+Z2V0TnVtUmVncygpOworICBVbnVzZWRSZWdzLnJlc2V0KCk7CisgIFVudXNlZFJlZ3MucmVzaXplKE51bVJlZ3MpOworCisgIEJpdFZlY3RvciBVc2VkKE51bVJlZ3MpOworICBmb3IgKHVuc2lnbmVkIGkgPSBUYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyLAorICAgICAgICAgZSA9IE1GLT5nZXRSZWdJbmZvKCkuZ2V0TGFzdFZpcnRSZWcoKTsgaSA8PSBlOyArK2kpCisgICAgaWYgKFZpcnQyUGh5c01hcFtpXSAhPSAodW5zaWduZWQpVmlydFJlZ01hcDo6Tk9fUEhZU19SRUcpCisgICAgICBVc2VkLnNldChWaXJ0MlBoeXNNYXBbaV0pOworCisgIEJpdFZlY3RvciBBbGxvY2F0YWJsZSA9IFRSSS0+Z2V0QWxsb2NhdGFibGVTZXQoKk1GKTsKKyAgYm9vbCBBbnlVbnVzZWQgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBSZWcgPSAxOyBSZWcgPCBOdW1SZWdzOyArK1JlZykgeworICAgIGlmIChBbGxvY2F0YWJsZVtSZWddICYmICFVc2VkW1JlZ10gJiYgIUxJcy0+aGFzSW50ZXJ2YWwoUmVnKSkgeworICAgICAgYm9vbCBSZWFsbHlVbnVzZWQgPSB0cnVlOworICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBUzsgKytBUykgeworICAgICAgICBpZiAoVXNlZFsqQVNdIHx8IExJcy0+aGFzSW50ZXJ2YWwoKkFTKSkgeworICAgICAgICAgIFJlYWxseVVudXNlZCA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoUmVhbGx5VW51c2VkKSB7CisgICAgICAgIEFueVVudXNlZCA9IHRydWU7CisgICAgICAgIFVudXNlZFJlZ3Muc2V0KFJlZyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEFueVVudXNlZDsKK30KKwordm9pZCBWaXJ0UmVnTWFwOjpwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSogTSkgY29uc3QgeworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8qIFRSSSA9IE1GLT5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKyAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJID0gTUYtPmdldFJlZ0luZm8oKTsKKworICBPUyA8PCAiKioqKioqKioqKiBSRUdJU1RFUiBNQVAgKioqKioqKioqKlxuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gVGFyZ2V0UmVnaXN0ZXJJbmZvOjpGaXJzdFZpcnR1YWxSZWdpc3RlciwKKyAgICAgICAgIGUgPSBNRi0+Z2V0UmVnSW5mbygpLmdldExhc3RWaXJ0UmVnKCk7IGkgPD0gZTsgKytpKSB7CisgICAgaWYgKFZpcnQyUGh5c01hcFtpXSAhPSAodW5zaWduZWQpVmlydFJlZ01hcDo6Tk9fUEhZU19SRUcpCisgICAgICBPUyA8PCAiW3JlZyIgPDwgaSA8PCAiIC0+ICIgPDwgVFJJLT5nZXROYW1lKFZpcnQyUGh5c01hcFtpXSkKKyAgICAgICAgIDw8ICJdICIgPDwgTVJJLmdldFJlZ0NsYXNzKGkpLT5nZXROYW1lKCkgPDwgIlxuIjsKKyAgfQorCisgIGZvciAodW5zaWduZWQgaSA9IFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXIsCisgICAgICAgICBlID0gTUYtPmdldFJlZ0luZm8oKS5nZXRMYXN0VmlydFJlZygpOyBpIDw9IGU7ICsraSkKKyAgICBpZiAoVmlydDJTdGFja1Nsb3RNYXBbaV0gIT0gVmlydFJlZ01hcDo6Tk9fU1RBQ0tfU0xPVCkKKyAgICAgIE9TIDw8ICJbcmVnIiA8PCBpIDw8ICIgLT4gZmkjIiA8PCBWaXJ0MlN0YWNrU2xvdE1hcFtpXQorICAgICAgICAgPDwgIl0gIiA8PCBNUkkuZ2V0UmVnQ2xhc3MoaSktPmdldE5hbWUoKSA8PCAiXG4iOworICBPUyA8PCAnXG4nOworfQorCit2b2lkIFZpcnRSZWdNYXA6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29kZUdlbi9WaXJ0UmVnTWFwLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9WaXJ0UmVnTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI2MDgyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1ZpcnRSZWdNYXAuaApAQCAtMCwwICsxLDUwMCBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vVmlydFJlZ01hcC5oIC0gVmlydHVhbCBSZWdpc3RlciBNYXAgLSotIEMrKyAtKi0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHZpcnR1YWwgcmVnaXN0ZXIgbWFwLiBUaGlzIG1hcHMgdmlydHVhbCByZWdpc3RlcnMgdG8KKy8vIHBoeXNpY2FsIHJlZ2lzdGVycyBhbmQgdmlydHVhbCByZWdpc3RlcnMgdG8gc3RhY2sgc2xvdHMuIEl0IGlzIGNyZWF0ZWQgYW5kCisvLyB1cGRhdGVkIGJ5IGEgcmVnaXN0ZXIgYWxsb2NhdG9yIGFuZCB0aGVuIHVzZWQgYnkgYSBtYWNoaW5lIGNvZGUgcmV3cml0ZXIgdGhhdAorLy8gYWRkcyBzcGlsbCBjb2RlIGFuZCByZXdyaXRlcyB2aXJ0dWFsIGludG8gcGh5c2ljYWwgcmVnaXN0ZXIgcmVmZXJlbmNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9WSVJUUkVHTUFQX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1ZJUlRSRUdNQVBfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbmRleGVkTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBMaXZlSW50ZXJ2YWxzOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKyAgY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKKyAgY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworICBjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIGNsYXNzIFZpcnRSZWdNYXAgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIHB1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgIE5PX1BIWVNfUkVHID0gMCwKKyAgICAgIE5PX1NUQUNLX1NMT1QgPSAoMUwgPDwgMzApLTEsCisgICAgICBNQVhfU1RBQ0tfU0xPVCA9ICgxTCA8PCAxOCktMQorICAgIH07CisKKyAgICBlbnVtIE1vZFJlZiB7IGlzUmVmID0gMSwgaXNNb2QgPSAyLCBpc01vZFJlZiA9IDMgfTsKKyAgICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8TWFjaGluZUluc3RyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBNb2RSZWY+ID4gTUkyVmlydE1hcFR5OworCisgIHByaXZhdGU6CisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJOworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICAgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisKKyAgICBEZW5zZU1hcDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiwgQml0VmVjdG9yPiBhbGxvY2F0YWJsZVJDUmVnczsKKworICAgIC8vLyBWaXJ0MlBoeXNNYXAgLSBUaGlzIGlzIGEgdmlydHVhbCB0byBwaHlzaWNhbCByZWdpc3RlcgorICAgIC8vLyBtYXBwaW5nLiBFYWNoIHZpcnR1YWwgcmVnaXN0ZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhbiBlbnRyeSBpbgorICAgIC8vLyBpdDsgZXZlbiBzcGlsbGVkIHZpcnR1YWwgcmVnaXN0ZXJzICh0aGUgcmVnaXN0ZXIgbWFwcGVkIHRvIGEKKyAgICAvLy8gc3BpbGxlZCByZWdpc3RlciBpcyB0aGUgdGVtcG9yYXJ5IHVzZWQgdG8gbG9hZCBpdCBmcm9tIHRoZQorICAgIC8vLyBzdGFjaykuCisgICAgSW5kZXhlZE1hcDx1bnNpZ25lZCwgVmlydFJlZzJJbmRleEZ1bmN0b3I+IFZpcnQyUGh5c01hcDsKKworICAgIC8vLyBWaXJ0MlN0YWNrU2xvdE1hcCAtIFRoaXMgaXMgdmlydHVhbCByZWdpc3RlciB0byBzdGFjayBzbG90CisgICAgLy8vIG1hcHBpbmcuIEVhY2ggc3BpbGxlZCB2aXJ0dWFsIHJlZ2lzdGVyIGhhcyBhbiBlbnRyeSBpbiBpdAorICAgIC8vLyB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgc3RhY2sgc2xvdCB0aGlzIHJlZ2lzdGVyIGlzIHNwaWxsZWQKKyAgICAvLy8gYXQuCisgICAgSW5kZXhlZE1hcDxpbnQsIFZpcnRSZWcySW5kZXhGdW5jdG9yPiBWaXJ0MlN0YWNrU2xvdE1hcDsKKworICAgIC8vLyBWaXJ0MlJlTWF0SWRNYXAgLSBUaGlzIGlzIHZpcnR1YWwgcmVnaXN0ZXIgdG8gcmVtYXRlcmlhbGl6YXRpb24gaWQKKyAgICAvLy8gbWFwcGluZy4gRWFjaCBzcGlsbGVkIHZpcnR1YWwgcmVnaXN0ZXIgdGhhdCBzaG91bGQgYmUgcmVtYXQnZCBoYXMgYW4KKyAgICAvLy8gZW50cnkgaW4gaXQgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHJlbWF0IGlkLgorICAgIEluZGV4ZWRNYXA8aW50LCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gVmlydDJSZU1hdElkTWFwOworCisgICAgLy8vIFZpcnQyU3BsaXRNYXAgLSBUaGlzIGlzIHZpcnR1YWwgcmVnaXN0ZXIgdG8gc3BsaXR0ZWQgdmlydHVhbCByZWdpc3RlcgorICAgIC8vLyBtYXBwaW5nLgorICAgIEluZGV4ZWRNYXA8dW5zaWduZWQsIFZpcnRSZWcySW5kZXhGdW5jdG9yPiBWaXJ0MlNwbGl0TWFwOworCisgICAgLy8vIFZpcnQyU3BsaXRLaWxsTWFwIC0gVGhpcyBpcyBzcGxpdHRlZCB2aXJ0dWFsIHJlZ2lzdGVyIHRvIGl0cyBsYXN0IHVzZQorICAgIC8vLyAoa2lsbCkgaW5kZXggbWFwcGluZy4KKyAgICBJbmRleGVkTWFwPFNsb3RJbmRleD4gVmlydDJTcGxpdEtpbGxNYXA7CisKKyAgICAvLy8gUmVNYXRNYXAgLSBUaGlzIGlzIHZpcnR1YWwgcmVnaXN0ZXIgdG8gcmUtbWF0ZXJpYWxpemVkIGluc3RydWN0aW9uCisgICAgLy8vIG1hcHBpbmcuIEVhY2ggdmlydHVhbCByZWdpc3RlciB3aG9zZSBkZWZpbml0aW9uIGlzIGdvaW5nIHRvIGJlCisgICAgLy8vIHJlLW1hdGVyaWFsaXplZCBoYXMgYW4gZW50cnkgaW4gaXQuCisgICAgSW5kZXhlZE1hcDxNYWNoaW5lSW5zdHIqLCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gUmVNYXRNYXA7CisKKyAgICAvLy8gTUkyVmlydE1hcCAtIFRoaXMgaXMgTWFjaGluZUluc3RyIHRvIHZpcnR1YWwgcmVnaXN0ZXIKKyAgICAvLy8gbWFwcGluZy4gSW4gdGhlIGNhc2Ugb2YgbWVtb3J5IHNwaWxsIGNvZGUgYmVpbmcgZm9sZGVkIGludG8KKyAgICAvLy8gaW5zdHJ1Y3Rpb25zLCB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggdmlydHVhbCByZWdpc3RlciB3YXMKKyAgICAvLy8gcmVhZC93cml0dGVuIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24uCisgICAgTUkyVmlydE1hcFR5IE1JMlZpcnRNYXA7CisKKyAgICAvLy8gU3BpbGxQdDJWaXJ0TWFwIC0gVGhpcyByZWNvcmRzIHRoZSB2aXJ0dWFsIHJlZ2lzdGVycyB3aGljaCBzaG91bGQKKyAgICAvLy8gYmUgc3BpbGxlZCByaWdodCBhZnRlciB0aGUgTWFjaGluZUluc3RyIGR1ZSB0byBsaXZlIGludGVydmFsCisgICAgLy8vIHNwbGl0dGluZy4KKyAgICBzdGQ6Om1hcDxNYWNoaW5lSW5zdHIqLCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsYm9vbD4gPiA+CisgICAgU3BpbGxQdDJWaXJ0TWFwOworCisgICAgLy8vIFJlc3RvcmVQdDJWaXJ0TWFwIC0gVGhpcyByZWNvcmRzIHRoZSB2aXJ0dWFsIHJlZ2lzdGVycyB3aGljaCBzaG91bGQKKyAgICAvLy8gYmUgcmVzdG9yZWQgcmlnaHQgYmVmb3JlIHRoZSBNYWNoaW5lSW5zdHIgZHVlIHRvIGxpdmUgaW50ZXJ2YWwKKyAgICAvLy8gc3BsaXR0aW5nLgorICAgIHN0ZDo6bWFwPE1hY2hpbmVJbnN0ciosIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiA+IFJlc3RvcmVQdDJWaXJ0TWFwOworCisgICAgLy8vIEVtZXJnZW5jeVNwaWxsTWFwIC0gVGhpcyByZWNvcmRzIHRoZSBwaHlzaWNhbCByZWdpc3RlcnMgdGhhdCBzaG91bGQKKyAgICAvLy8gYmUgc3BpbGxlZCAvIHJlc3RvcmVkIGFyb3VuZCB0aGUgTWFjaGluZUluc3RyIHNpbmNlIHRoZSByZWdpc3RlcgorICAgIC8vLyBhbGxvY2F0b3IgaGFzIHJ1biBvdXQgb2YgcmVnaXN0ZXJzLgorICAgIHN0ZDo6bWFwPE1hY2hpbmVJbnN0ciosIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiA+IEVtZXJnZW5jeVNwaWxsTWFwOworCisgICAgLy8vIEVtZXJnZW5jeVNwaWxsU2xvdHMgLSBUaGlzIHJlY29yZHMgZW1lcmdlbmN5IHNwaWxsIHNsb3RzIHVzZWQgdG8KKyAgICAvLy8gc3BpbGwgcGh5c2ljYWwgcmVnaXN0ZXJzIHdoZW4gdGhlIHJlZ2lzdGVyIGFsbG9jYXRvciBydW5zIG91dCBvZgorICAgIC8vLyByZWdpc3RlcnMuIElkZWFsbHkgb25seSBvbmUgc3RhY2sgc2xvdCBpcyB1c2VkIHBlciBmdW5jdGlvbiBwZXIKKyAgICAvLy8gcmVnaXN0ZXIgY2xhc3MuCisgICAgc3RkOjptYXA8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyosIGludD4gRW1lcmdlbmN5U3BpbGxTbG90czsKKworICAgIC8vLyBSZU1hdElkIC0gSW5zdGVhZCBvZiBhc3NpZ25pbmcgYSBzdGFjayBzbG90IHRvIGEgdG8gYmUgcmVtYXRlcmlhbGl6ZWQKKyAgICAvLy8gdmlydHVhbCByZWdpc3RlciwgYW4gdW5pcXVlIGlkIGlzIGJlaW5nIGFzc2lnbmVkLiBUaGlzIGtlZXBzIHRyYWNrIG9mCisgICAgLy8vIHRoZSBoaWdoZXN0IGlkIHVzZWQgc28gZmFyLiBOb3RlLCB0aGlzIHN0YXJ0cyBhdCAoMTw8MTgpIHRvIGF2b2lkCisgICAgLy8vIGNvbmZsaWN0cyB3aXRoIHN0YWNrIHNsb3QgbnVtYmVycy4KKyAgICBpbnQgUmVNYXRJZDsKKworICAgIC8vLyBMb3dTcGlsbFNsb3QsIEhpZ2hTcGlsbFNsb3QgLSBMb3dlc3QgYW5kIGhpZ2hlc3Qgc3BpbGwgc2xvdCBpbmRleGVzLgorICAgIGludCBMb3dTcGlsbFNsb3QsIEhpZ2hTcGlsbFNsb3Q7CisKKyAgICAvLy8gU3BpbGxTbG90VG9Vc2VzTWFwIC0gUmVjb3JkcyB1c2VzIGZvciBlYWNoIHJlZ2lzdGVyIHNwaWxsIHNsb3QuCisgICAgU21hbGxWZWN0b3I8U21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgND4sIDg+IFNwaWxsU2xvdFRvVXNlc01hcDsKKworICAgIC8vLyBJbXBsaWNpdERlZmVkIC0gT25lIGJpdCBmb3IgZWFjaCB2aXJ0dWFsIHJlZ2lzdGVyLiBJZiBzZXQgaXQgaW5kaWNhdGVzCisgICAgLy8vIHRoZSByZWdpc3RlciBpcyBpbXBsaWNpdGx5IGRlZmluZWQuCisgICAgQml0VmVjdG9yIEltcGxpY2l0RGVmZWQ7CisKKyAgICAvLy8gVW51c2VkUmVncyAtIEEgbGlzdCBvZiBwaHlzaWNhbCByZWdpc3RlcnMgdGhhdCBoYXZlIG5vdCBiZWVuIHVzZWQuCisgICAgQml0VmVjdG9yIFVudXNlZFJlZ3M7CisKKyAgICBWaXJ0UmVnTWFwKGNvbnN0IFZpcnRSZWdNYXAmKTsgICAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBWaXJ0UmVnTWFwJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgVmlydFJlZ01hcCgpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCksIFZpcnQyUGh5c01hcChOT19QSFlTX1JFRyksCisgICAgICAgICAgICAgICAgICAgVmlydDJTdGFja1Nsb3RNYXAoTk9fU1RBQ0tfU0xPVCksIAorICAgICAgICAgICAgICAgICAgIFZpcnQyUmVNYXRJZE1hcChOT19TVEFDS19TTE9UKSwgVmlydDJTcGxpdE1hcCgwKSwKKyAgICAgICAgICAgICAgICAgICBWaXJ0MlNwbGl0S2lsbE1hcChTbG90SW5kZXgoKSksIFJlTWF0TWFwKE5VTEwpLAorICAgICAgICAgICAgICAgICAgIFJlTWF0SWQoTUFYX1NUQUNLX1NMT1QrMSksCisgICAgICAgICAgICAgICAgICAgTG93U3BpbGxTbG90KE5PX1NUQUNLX1NMT1QpLCBIaWdoU3BpbGxTbG90KE5PX1NUQUNLX1NMT1QpIHsgfQorICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICAgIH0KKworICAgIE1hY2hpbmVGdW5jdGlvbiAmZ2V0TWFjaGluZUZ1bmN0aW9uKCkgY29uc3QgeworICAgICAgYXNzZXJ0KE1GICYmICJnZXRNYWNoaW5lRnVuY3Rpb24gY2FsbGVkIGJlZm9yZSBydW5Pbk1BY2hpbmVGdW5jdGlvbiIpOworICAgICAgcmV0dXJuICpNRjsKKyAgICB9CisKKyAgICB2b2lkIGdyb3coKTsKKworICAgIC8vLyBAYnJpZWYgcmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3RlciBpcworICAgIC8vLyBtYXBwZWQgdG8gYSBwaHlzaWNhbCByZWdpc3RlcgorICAgIGJvb2wgaGFzUGh5cyh1bnNpZ25lZCB2aXJ0UmVnKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0UGh5cyh2aXJ0UmVnKSAhPSBOT19QSFlTX1JFRzsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIG1hcHBlZCB0byB0aGUgc3BlY2lmaWVkCisgICAgLy8vIHZpcnR1YWwgcmVnaXN0ZXIKKyAgICB1bnNpZ25lZCBnZXRQaHlzKHVuc2lnbmVkIHZpcnRSZWcpIGNvbnN0IHsKKyAgICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKHZpcnRSZWcpKTsKKyAgICAgIHJldHVybiBWaXJ0MlBoeXNNYXBbdmlydFJlZ107CisgICAgfQorCisgICAgLy8vIEBicmllZiBjcmVhdGVzIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyIHRvCisgICAgLy8vIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcmVnaXN0ZXIKKyAgICB2b2lkIGFzc2lnblZpcnQyUGh5cyh1bnNpZ25lZCB2aXJ0UmVnLCB1bnNpZ25lZCBwaHlzUmVnKSB7CisgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3Rlcih2aXJ0UmVnKSAmJgorICAgICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKHBoeXNSZWcpKTsKKyAgICAgIGFzc2VydChWaXJ0MlBoeXNNYXBbdmlydFJlZ10gPT0gTk9fUEhZU19SRUcgJiYKKyAgICAgICAgICAgICAiYXR0ZW1wdCB0byBhc3NpZ24gcGh5c2ljYWwgcmVnaXN0ZXIgdG8gYWxyZWFkeSBtYXBwZWQgIgorICAgICAgICAgICAgICJ2aXJ0dWFsIHJlZ2lzdGVyIik7CisgICAgICBWaXJ0MlBoeXNNYXBbdmlydFJlZ10gPSBwaHlzUmVnOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgY2xlYXJzIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3RlcidzLCBwaHlzaWNhbAorICAgIC8vLyByZWdpc3RlciBtYXBwaW5nCisgICAgdm9pZCBjbGVhclZpcnQodW5zaWduZWQgdmlydFJlZykgeworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIodmlydFJlZykpOworICAgICAgYXNzZXJ0KFZpcnQyUGh5c01hcFt2aXJ0UmVnXSAhPSBOT19QSFlTX1JFRyAmJgorICAgICAgICAgICAgICJhdHRlbXB0IHRvIGNsZWFyIGEgbm90IGFzc2lnbmVkIHZpcnR1YWwgcmVnaXN0ZXIiKTsKKyAgICAgIFZpcnQyUGh5c01hcFt2aXJ0UmVnXSA9IE5PX1BIWVNfUkVHOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgY2xlYXJzIGFsbCB2aXJ0dWFsIHRvIHBoeXNpY2FsIHJlZ2lzdGVyIG1hcHBpbmdzCisgICAgdm9pZCBjbGVhckFsbFZpcnQoKSB7CisgICAgICBWaXJ0MlBoeXNNYXAuY2xlYXIoKTsKKyAgICAgIGdyb3coKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gcHJlZmVyZW5jZS4KKyAgICB1bnNpZ25lZCBnZXRSZWdBbGxvY1ByZWYodW5zaWduZWQgdmlydFJlZyk7CisKKyAgICAvLy8gQGJyaWVmIHJlY29yZHMgdmlydFJlZyBpcyBhIHNwbGl0IGxpdmUgaW50ZXJ2YWwgZnJvbSBTUmVnLgorICAgIHZvaWQgc2V0SXNTcGxpdEZyb21SZWcodW5zaWduZWQgdmlydFJlZywgdW5zaWduZWQgU1JlZykgeworICAgICAgVmlydDJTcGxpdE1hcFt2aXJ0UmVnXSA9IFNSZWc7CisgICAgfQorCisgICAgLy8vIEBicmllZiByZXR1cm5zIHRoZSBsaXZlIGludGVydmFsIHZpcnRSZWcgaXMgc3BsaXQgZnJvbS4KKyAgICB1bnNpZ25lZCBnZXRQcmVTcGxpdFJlZyh1bnNpZ25lZCB2aXJ0UmVnKSB7CisgICAgICByZXR1cm4gVmlydDJTcGxpdE1hcFt2aXJ0UmVnXTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIgaXMgbm90CisgICAgLy8vIG1hcHBlZCB0byBhIHN0YWNrIHNsb3Qgb3IgcmVtYXRlcmlhbGl6ZWQuCisgICAgYm9vbCBpc0Fzc2lnbmVkUmVnKHVuc2lnbmVkIHZpcnRSZWcpIGNvbnN0IHsKKyAgICAgIGlmIChnZXRTdGFja1Nsb3QodmlydFJlZykgPT0gTk9fU1RBQ0tfU0xPVCAmJgorICAgICAgICAgIGdldFJlTWF0SWQodmlydFJlZykgPT0gTk9fU1RBQ0tfU0xPVCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAvLyBTcGxpdCByZWdpc3RlciBjYW4gYmUgYXNzaWduZWQgYSBwaHlzaWNhbCByZWdpc3RlciBhcyB3ZWxsIGFzIGEKKyAgICAgIC8vIHN0YWNrIHNsb3Qgb3IgcmVtYXQgaWQuCisgICAgICByZXR1cm4gKFZpcnQyU3BsaXRNYXBbdmlydFJlZ10gJiYgVmlydDJQaHlzTWFwW3ZpcnRSZWddICE9IE5PX1BIWVNfUkVHKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdGhlIHN0YWNrIHNsb3QgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQgdmlydHVhbAorICAgIC8vLyByZWdpc3RlcgorICAgIGludCBnZXRTdGFja1Nsb3QodW5zaWduZWQgdmlydFJlZykgY29uc3QgeworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIodmlydFJlZykpOworICAgICAgcmV0dXJuIFZpcnQyU3RhY2tTbG90TWFwW3ZpcnRSZWddOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmV0dXJucyB0aGUgcmVtYXRlcmlhbGl6YXRpb24gaWQgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQgdmlydHVhbAorICAgIC8vLyByZWdpc3RlcgorICAgIGludCBnZXRSZU1hdElkKHVuc2lnbmVkIHZpcnRSZWcpIGNvbnN0IHsKKyAgICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKHZpcnRSZWcpKTsKKyAgICAgIHJldHVybiBWaXJ0MlJlTWF0SWRNYXBbdmlydFJlZ107CisgICAgfQorCisgICAgLy8vIEBicmllZiBjcmVhdGUgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmZWQgdmlydHVhbCByZWdpc3RlciB0bworICAgIC8vLyB0aGUgbmV4dCBhdmFpbGFibGUgc3RhY2sgc2xvdAorICAgIGludCBhc3NpZ25WaXJ0MlN0YWNrU2xvdCh1bnNpZ25lZCB2aXJ0UmVnKTsKKyAgICAvLy8gQGJyaWVmIGNyZWF0ZSBhIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3RlciB0bworICAgIC8vLyB0aGUgc3BlY2lmaWVkIHN0YWNrIHNsb3QKKyAgICB2b2lkIGFzc2lnblZpcnQyU3RhY2tTbG90KHVuc2lnbmVkIHZpcnRSZWcsIGludCBmcmFtZUluZGV4KTsKKworICAgIC8vLyBAYnJpZWYgYXNzaWduIGFuIHVuaXF1ZSByZS1tYXRlcmlhbGl6YXRpb24gaWQgdG8gdGhlIHNwZWNpZmllZAorICAgIC8vLyB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIGludCBhc3NpZ25WaXJ0UmVNYXRJZCh1bnNpZ25lZCB2aXJ0UmVnKTsKKyAgICAvLy8gQGJyaWVmIGFzc2lnbiBhbiB1bmlxdWUgcmUtbWF0ZXJpYWxpemF0aW9uIGlkIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gdmlydHVhbCByZWdpc3Rlci4KKyAgICB2b2lkIGFzc2lnblZpcnRSZU1hdElkKHVuc2lnbmVkIHZpcnRSZWcsIGludCBpZCk7CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIgaXMgYmVpbmcKKyAgICAvLy8gcmUtbWF0ZXJpYWxpemVkLgorICAgIGJvb2wgaXNSZU1hdGVyaWFsaXplZCh1bnNpZ25lZCB2aXJ0UmVnKSBjb25zdCB7CisgICAgICByZXR1cm4gUmVNYXRNYXBbdmlydFJlZ10gIT0gTlVMTDsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdGhlIG9yaWdpbmFsIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gYmVpbmcgcmUtaXNzdWVkCisgICAgLy8vIHRvIHJlLW1hdGVyaWFsaXplIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3Rlci4KKyAgICBNYWNoaW5lSW5zdHIgKmdldFJlTWF0ZXJpYWxpemVkTUkodW5zaWduZWQgdmlydFJlZykgY29uc3QgeworICAgICAgcmV0dXJuIFJlTWF0TWFwW3ZpcnRSZWddOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmVjb3JkcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIgd2lsbCBiZQorICAgIC8vLyByZS1tYXRlcmlhbGl6ZWQgYW5kIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiB3aGljaCB3aWxsIGJlIHJlLWlzc2VkCisgICAgLy8vIGZvciB0aGlzIHB1cnBvc2UuICBJZiBwYXJhbWV0ZXIgYWxsIGlzIHRydWUsIHRoZW4gYWxsIHVzZXMgb2YgdGhlCisgICAgLy8vIHJlZ2lzdGVycyBhcmUgcmVtYXRlcmlhbGl6ZWQgYW5kIGl0J3Mgc2FmZSB0byBkZWxldGUgdGhlIGRlZmluaXRpb24uCisgICAgdm9pZCBzZXRWaXJ0SXNSZU1hdGVyaWFsaXplZCh1bnNpZ25lZCB2aXJ0UmVnLCBNYWNoaW5lSW5zdHIgKmRlZikgeworICAgICAgUmVNYXRNYXBbdmlydFJlZ10gPSBkZWY7CisgICAgfQorCisgICAgLy8vIEBicmllZiByZWNvcmQgdGhlIGxhc3QgdXNlIChraWxsKSBvZiBhIHNwbGl0IHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgdm9pZCBhZGRLaWxsUG9pbnQodW5zaWduZWQgdmlydFJlZywgU2xvdEluZGV4IGluZGV4KSB7CisgICAgICBWaXJ0MlNwbGl0S2lsbE1hcFt2aXJ0UmVnXSA9IGluZGV4OworICAgIH0KKworICAgIFNsb3RJbmRleCBnZXRLaWxsUG9pbnQodW5zaWduZWQgdmlydFJlZykgY29uc3QgeworICAgICAgcmV0dXJuIFZpcnQyU3BsaXRLaWxsTWFwW3ZpcnRSZWddOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmVtb3ZlIHRoZSBsYXN0IHVzZSAoa2lsbCkgb2YgYSBzcGxpdCB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIHZvaWQgcmVtb3ZlS2lsbFBvaW50KHVuc2lnbmVkIHZpcnRSZWcpIHsKKyAgICAgIFZpcnQyU3BsaXRLaWxsTWFwW3ZpcnRSZWddID0gU2xvdEluZGV4KCk7CisgICAgfQorCisgICAgLy8vIEBicmllZiByZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBNYWNoaW5lSW5zdHIgaXMgYSBzcGlsbCBwb2ludC4KKyAgICBib29sIGlzU3BpbGxQdChNYWNoaW5lSW5zdHIgKlB0KSBjb25zdCB7CisgICAgICByZXR1cm4gU3BpbGxQdDJWaXJ0TWFwLmZpbmQoUHQpICE9IFNwaWxsUHQyVmlydE1hcC5lbmQoKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdGhlIHZpcnR1YWwgcmVnaXN0ZXJzIHRoYXQgc2hvdWxkIGJlIHNwaWxsZWQgZHVlIHRvCisgICAgLy8vIHNwbGl0dGluZyByaWdodCBhZnRlciB0aGUgc3BlY2lmaWVkIE1hY2hpbmVJbnN0ci4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsYm9vbD4gPiAmZ2V0U3BpbGxQdFNwaWxscyhNYWNoaW5lSW5zdHIgKlB0KSB7CisgICAgICByZXR1cm4gU3BpbGxQdDJWaXJ0TWFwW1B0XTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJlY29yZHMgdGhlIHNwZWNpZmllZCBNYWNoaW5lSW5zdHIgYXMgYSBzcGlsbCBwb2ludCBmb3IgdmlydFJlZy4KKyAgICB2b2lkIGFkZFNwaWxsUG9pbnQodW5zaWduZWQgdmlydFJlZywgYm9vbCBpc0tpbGwsIE1hY2hpbmVJbnN0ciAqUHQpIHsKKyAgICAgIHN0ZDo6bWFwPE1hY2hpbmVJbnN0ciosIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCxib29sPiA+ID46Oml0ZXJhdG9yCisgICAgICAgIEkgPSBTcGlsbFB0MlZpcnRNYXAuZmluZChQdCk7CisgICAgICBpZiAoSSAhPSBTcGlsbFB0MlZpcnRNYXAuZW5kKCkpCisgICAgICAgIEktPnNlY29uZC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIodmlydFJlZywgaXNLaWxsKSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLGJvb2w+ID4gVmlydHM7CisgICAgICAgIFZpcnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcih2aXJ0UmVnLCBpc0tpbGwpKTsKKyAgICAgICAgU3BpbGxQdDJWaXJ0TWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihQdCwgVmlydHMpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIC0gdHJhbnNmZXIgc3BpbGwgcG9pbnQgaW5mb3JtYXRpb24gZnJvbSBvbmUgaW5zdHJ1Y3Rpb24gdG8KKyAgICAvLy8gYW5vdGhlci4KKyAgICB2b2lkIHRyYW5zZmVyU3BpbGxQdHMoTWFjaGluZUluc3RyICpPbGQsIE1hY2hpbmVJbnN0ciAqTmV3KSB7CisgICAgICBzdGQ6Om1hcDxNYWNoaW5lSW5zdHIqLCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsYm9vbD4gPiA+OjppdGVyYXRvcgorICAgICAgICBJID0gU3BpbGxQdDJWaXJ0TWFwLmZpbmQoT2xkKTsKKyAgICAgIGlmIChJID09IFNwaWxsUHQyVmlydE1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgd2hpbGUgKCFJLT5zZWNvbmQuZW1wdHkoKSkgeworICAgICAgICB1bnNpZ25lZCB2aXJ0UmVnID0gSS0+c2Vjb25kLmJhY2soKS5maXJzdDsKKyAgICAgICAgYm9vbCBpc0tpbGwgPSBJLT5zZWNvbmQuYmFjaygpLnNlY29uZDsKKyAgICAgICAgSS0+c2Vjb25kLnBvcF9iYWNrKCk7CisgICAgICAgIGFkZFNwaWxsUG9pbnQodmlydFJlZywgaXNLaWxsLCBOZXcpOworICAgICAgfQorICAgICAgU3BpbGxQdDJWaXJ0TWFwLmVyYXNlKEkpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgTWFjaGluZUluc3RyIGlzIGEgcmVzdG9yZSBwb2ludC4KKyAgICBib29sIGlzUmVzdG9yZVB0KE1hY2hpbmVJbnN0ciAqUHQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBSZXN0b3JlUHQyVmlydE1hcC5maW5kKFB0KSAhPSBSZXN0b3JlUHQyVmlydE1hcC5lbmQoKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdGhlIHZpcnR1YWwgcmVnaXN0ZXJzIHRoYXQgc2hvdWxkIGJlIHJlc3RvcmVlZCBkdWUgdG8KKyAgICAvLy8gc3BsaXR0aW5nIHJpZ2h0IGFmdGVyIHRoZSBzcGVjaWZpZWQgTWFjaGluZUluc3RyLgorICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmZ2V0UmVzdG9yZVB0UmVzdG9yZXMoTWFjaGluZUluc3RyICpQdCkgeworICAgICAgcmV0dXJuIFJlc3RvcmVQdDJWaXJ0TWFwW1B0XTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJlY29yZHMgdGhlIHNwZWNpZmllZCBNYWNoaW5lSW5zdHIgYXMgYSByZXN0b3JlIHBvaW50IGZvciB2aXJ0UmVnLgorICAgIHZvaWQgYWRkUmVzdG9yZVBvaW50KHVuc2lnbmVkIHZpcnRSZWcsIE1hY2hpbmVJbnN0ciAqUHQpIHsKKyAgICAgIHN0ZDo6bWFwPE1hY2hpbmVJbnN0ciosIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiA+OjppdGVyYXRvciBJID0KKyAgICAgICAgUmVzdG9yZVB0MlZpcnRNYXAuZmluZChQdCk7CisgICAgICBpZiAoSSAhPSBSZXN0b3JlUHQyVmlydE1hcC5lbmQoKSkKKyAgICAgICAgSS0+c2Vjb25kLnB1c2hfYmFjayh2aXJ0UmVnKTsKKyAgICAgIGVsc2UgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gVmlydHM7CisgICAgICAgIFZpcnRzLnB1c2hfYmFjayh2aXJ0UmVnKTsKKyAgICAgICAgUmVzdG9yZVB0MlZpcnRNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFB0LCBWaXJ0cykpOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBAYnJpZWYgLSB0cmFuc2ZlciByZXN0b3JlIHBvaW50IGluZm9ybWF0aW9uIGZyb20gb25lIGluc3RydWN0aW9uIHRvCisgICAgLy8vIGFub3RoZXIuCisgICAgdm9pZCB0cmFuc2ZlclJlc3RvcmVQdHMoTWFjaGluZUluc3RyICpPbGQsIE1hY2hpbmVJbnN0ciAqTmV3KSB7CisgICAgICBzdGQ6Om1hcDxNYWNoaW5lSW5zdHIqLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gPjo6aXRlcmF0b3IgSSA9CisgICAgICAgIFJlc3RvcmVQdDJWaXJ0TWFwLmZpbmQoT2xkKTsKKyAgICAgIGlmIChJID09IFJlc3RvcmVQdDJWaXJ0TWFwLmVuZCgpKQorICAgICAgICByZXR1cm47CisgICAgICB3aGlsZSAoIUktPnNlY29uZC5lbXB0eSgpKSB7CisgICAgICAgIHVuc2lnbmVkIHZpcnRSZWcgPSBJLT5zZWNvbmQuYmFjaygpOworICAgICAgICBJLT5zZWNvbmQucG9wX2JhY2soKTsKKyAgICAgICAgYWRkUmVzdG9yZVBvaW50KHZpcnRSZWcsIE5ldyk7CisgICAgICB9CisgICAgICBSZXN0b3JlUHQyVmlydE1hcC5lcmFzZShJKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJlY29yZHMgdGhhdCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyIG11c3QgYmUgc3BpbGxlZAorICAgIC8vLyBhcm91bmQgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RyLgorICAgIHZvaWQgYWRkRW1lcmdlbmN5U3BpbGwodW5zaWduZWQgUGh5c1JlZywgTWFjaGluZUluc3RyICpNSSkgeworICAgICAgaWYgKEVtZXJnZW5jeVNwaWxsTWFwLmZpbmQoTUkpICE9IEVtZXJnZW5jeVNwaWxsTWFwLmVuZCgpKQorICAgICAgICBFbWVyZ2VuY3lTcGlsbE1hcFtNSV0ucHVzaF9iYWNrKFBoeXNSZWcpOworICAgICAgZWxzZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBQaHlzUmVnczsKKyAgICAgICAgUGh5c1JlZ3MucHVzaF9iYWNrKFBoeXNSZWcpOworICAgICAgICBFbWVyZ2VuY3lTcGlsbE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTUksIFBoeXNSZWdzKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIEBicmllZiByZXR1cm5zIHRydWUgaWYgb25lIG9yIG1vcmUgcGh5c2ljYWwgcmVnaXN0ZXJzIG11c3QgYmUgc3BpbGxlZAorICAgIC8vLyBhcm91bmQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgICBib29sIGhhc0VtZXJnZW5jeVNwaWxscyhNYWNoaW5lSW5zdHIgKk1JKSBjb25zdCB7CisgICAgICByZXR1cm4gRW1lcmdlbmN5U3BpbGxNYXAuZmluZChNSSkgIT0gRW1lcmdlbmN5U3BpbGxNYXAuZW5kKCk7CisgICAgfQorCisgICAgLy8vIEBicmllZiByZXR1cm5zIHRoZSBwaHlzaWNhbCByZWdpc3RlcnMgdG8gYmUgc3BpbGxlZCBhbmQgcmVzdG9yZWQgYXJvdW5kCisgICAgLy8vIHRoZSBpbnN0cnVjdGlvbi4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJmdldEVtZXJnZW5jeVNwaWxscyhNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgICByZXR1cm4gRW1lcmdlbmN5U3BpbGxNYXBbTUldOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgLSB0cmFuc2ZlciBlbWVyZ2VuY3kgc3BpbGwgaW5mb3JtYXRpb24gZnJvbSBvbmUgaW5zdHJ1Y3Rpb24gdG8KKyAgICAvLy8gYW5vdGhlci4KKyAgICB2b2lkIHRyYW5zZmVyRW1lcmdlbmN5U3BpbGxzKE1hY2hpbmVJbnN0ciAqT2xkLCBNYWNoaW5lSW5zdHIgKk5ldykgeworICAgICAgc3RkOjptYXA8TWFjaGluZUluc3RyKixzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gPjo6aXRlcmF0b3IgSSA9CisgICAgICAgIEVtZXJnZW5jeVNwaWxsTWFwLmZpbmQoT2xkKTsKKyAgICAgIGlmIChJID09IEVtZXJnZW5jeVNwaWxsTWFwLmVuZCgpKQorICAgICAgICByZXR1cm47CisgICAgICB3aGlsZSAoIUktPnNlY29uZC5lbXB0eSgpKSB7CisgICAgICAgIHVuc2lnbmVkIHZpcnRSZWcgPSBJLT5zZWNvbmQuYmFjaygpOworICAgICAgICBJLT5zZWNvbmQucG9wX2JhY2soKTsKKyAgICAgICAgYWRkRW1lcmdlbmN5U3BpbGwodmlydFJlZywgTmV3KTsKKyAgICAgIH0KKyAgICAgIEVtZXJnZW5jeVNwaWxsTWFwLmVyYXNlKEkpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmV0dXJuIG9yIGdldCBhIGVtZXJnZW5jeSBzcGlsbCBzbG90IGZvciB0aGUgcmVnaXN0ZXIgY2xhc3MuCisgICAgaW50IGdldEVtZXJnZW5jeVNwaWxsU2xvdChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgICAvLy8gQGJyaWVmIFJldHVybiBsb3dlc3Qgc3BpbGwgc2xvdCBpbmRleC4KKyAgICBpbnQgZ2V0TG93U3BpbGxTbG90KCkgY29uc3QgeworICAgICAgcmV0dXJuIExvd1NwaWxsU2xvdDsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIFJldHVybiBoaWdoZXN0IHNwaWxsIHNsb3QgaW5kZXguCisgICAgaW50IGdldEhpZ2hTcGlsbFNsb3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gSGlnaFNwaWxsU2xvdDsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIFJlY29yZHMgYSBzcGlsbCBzbG90IHVzZS4KKyAgICB2b2lkIGFkZFNwaWxsU2xvdFVzZShpbnQgRnJhbWVJbmRleCwgTWFjaGluZUluc3RyICpNSSk7CisKKyAgICAvLy8gQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBzcGlsbCBzbG90IGhhcyBiZWVuIHVzZWQuCisgICAgYm9vbCBpc1NwaWxsU2xvdFVzZWQoaW50IEZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChGcmFtZUluZGV4ID49IDAgJiYgIlNwaWxsIHNsb3QgaW5kZXggc2hvdWxkIG5vdCBiZSBuZWdhdGl2ZSEiKTsKKyAgICAgIHJldHVybiAhU3BpbGxTbG90VG9Vc2VzTWFwW0ZyYW1lSW5kZXgtTG93U3BpbGxTbG90XS5lbXB0eSgpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgTWFyayB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGFzIGJlaW5nIGltcGxpY2l0bHkgZGVmaW5lZC4KKyAgICB2b2lkIHNldElzSW1wbGljaXRseURlZmluZWQodW5zaWduZWQgVmlydFJlZykgeworICAgICAgSW1wbGljaXREZWZlZC5zZXQoVmlydFJlZy1UYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmlydHVhbCByZWdpc3RlciBpcyBpbXBsaWNpdGx5IGRlZmluZWQuCisgICAgYm9vbCBpc0ltcGxpY2l0bHlEZWZpbmVkKHVuc2lnbmVkIFZpcnRSZWcpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJbXBsaWNpdERlZmVkW1ZpcnRSZWctVGFyZ2V0UmVnaXN0ZXJJbmZvOjpGaXJzdFZpcnR1YWxSZWdpc3Rlcl07CisgICAgfQorCisgICAgLy8vIEBicmllZiBVcGRhdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3RlcidzIHZhbHVlCisgICAgLy8vIGZvbGRlZCBpbnRvIG5ld01JIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgICAgdm9pZCB2aXJ0Rm9sZGVkKHVuc2lnbmVkIFZpcnRSZWcsIE1hY2hpbmVJbnN0ciAqT2xkTUksIE1hY2hpbmVJbnN0ciAqTmV3TUksCisgICAgICAgICAgICAgICAgICAgIE1vZFJlZiBNUkluZm8pOworCisgICAgLy8vIEBicmllZiBVcGRhdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3RlcidzIHZhbHVlCisgICAgLy8vIGZvbGRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgICB2b2lkIHZpcnRGb2xkZWQodW5zaWduZWQgVmlydFJlZywgTWFjaGluZUluc3RyICpNSSwgTW9kUmVmIE1SSW5mbyk7CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdGhlIHZpcnR1YWwgcmVnaXN0ZXJzJyB2YWx1ZXMgZm9sZGVkIGluIG1lbW9yeQorICAgIC8vLyBvcGVyYW5kcyBvZiB0aGlzIGluc3RydWN0aW9uCisgICAgc3RkOjpwYWlyPE1JMlZpcnRNYXBUeTo6Y29uc3RfaXRlcmF0b3IsIE1JMlZpcnRNYXBUeTo6Y29uc3RfaXRlcmF0b3I+CisgICAgZ2V0Rm9sZGVkVmlydHMoTWFjaGluZUluc3RyKiBNSSkgY29uc3QgeworICAgICAgcmV0dXJuIE1JMlZpcnRNYXAuZXF1YWxfcmFuZ2UoTUkpOworICAgIH0KKyAgICAKKyAgICAvLy8gUmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMgLSBNSSBpcyBiZWluZyBlcmFzZWQsIHJlbW92ZSBpdCBmcm9tIHRoZQorICAgIC8vLyB0aGUgZm9sZGVkIGluc3RydWN0aW9uIG1hcCBhbmQgc3BpbGwgcG9pbnQgbWFwLgorICAgIHZvaWQgUmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoTWFjaGluZUluc3RyICpNSSk7CisKKyAgICAvLy8gRmluZFVudXNlZFJlZ2lzdGVycyAtIEdhdGhlciBhIGxpc3Qgb2YgYWxsb2NhdGFibGUgcmVnaXN0ZXJzIHRoYXQKKyAgICAvLy8gaGF2ZSBub3QgYmVlbiBhbGxvY2F0ZWQgdG8gYW55IHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgYm9vbCBGaW5kVW51c2VkUmVnaXN0ZXJzKExpdmVJbnRlcnZhbHMqIExJcyk7CisKKyAgICAvLy8gSGFzVW51c2VkUmVnaXN0ZXJzIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSBhbGxvY2F0YWJsZSByZWdpc3RlcnMKKyAgICAvLy8gdGhhdCBoYXZlIG5vdCBiZWVuIGFsbG9jYXRlZCB0byBhbnkgdmlydHVhbCByZWdpc3Rlci4KKyAgICBib29sIEhhc1VudXNlZFJlZ2lzdGVycygpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhVW51c2VkUmVncy5ub25lKCk7CisgICAgfQorCisgICAgLy8vIHNldFJlZ2lzdGVyVXNlZCAtIFJlbWVtYmVyIHRoZSBwaHlzaWNhbCByZWdpc3RlciBpcyBub3cgdXNlZC4KKyAgICB2b2lkIHNldFJlZ2lzdGVyVXNlZCh1bnNpZ25lZCBSZWcpIHsKKyAgICAgIFVudXNlZFJlZ3MucmVzZXQoUmVnKTsKKyAgICB9CisKKyAgICAvLy8gaXNSZWdpc3RlclVudXNlZCAtIFJldHVybiB0cnVlIGlmIHRoZSBwaHlzaWNhbCByZWdpc3RlciBoYXMgbm90IGJlZW4KKyAgICAvLy8gdXNlZC4KKyAgICBib29sIGlzUmVnaXN0ZXJVbnVzZWQodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgICByZXR1cm4gVW51c2VkUmVnc1tSZWddOworICAgIH0KKworICAgIC8vLyBnZXRGaXJzdFVudXNlZFJlZ2lzdGVyIC0gUmV0dXJuIHRoZSBmaXJzdCBwaHlzaWNhbCByZWdpc3RlciB0aGF0IGhhcyBub3QKKyAgICAvLy8gYmVlbiB1c2VkLgorICAgIHVuc2lnbmVkIGdldEZpcnN0VW51c2VkUmVnaXN0ZXIoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIHsKKyAgICAgIGludCBSZWcgPSBVbnVzZWRSZWdzLmZpbmRfZmlyc3QoKTsKKyAgICAgIHdoaWxlIChSZWcgIT0gLTEpIHsKKyAgICAgICAgaWYgKGFsbG9jYXRhYmxlUkNSZWdzW1JDXVtSZWddKQorICAgICAgICAgIHJldHVybiAodW5zaWduZWQpUmVnOworICAgICAgICBSZWcgPSBVbnVzZWRSZWdzLmZpbmRfbmV4dChSZWcpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSogTSA9IDApIGNvbnN0OworICAgIHZvaWQgZHVtcCgpIGNvbnN0OworICB9OworCisgIGlubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFZpcnRSZWdNYXAgJlZSTSkgeworICAgIFZSTS5wcmludChPUyk7CisgICAgcmV0dXJuIE9TOworICB9Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db2RlR2VuL1ZpcnRSZWdSZXdyaXRlci5jcHAgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9WaXJ0UmVnUmV3cml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWI1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29kZUdlbi9WaXJ0UmVnUmV3cml0ZXIuY3BwCkBAIC0wLDAgKzEsMjU0NSBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vUmV3cml0ZXIuY3BwIC0gIFJld3JpdGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJ2aXJ0cmVncmV3cml0ZXIiCisjaW5jbHVkZSAiVmlydFJlZ1Jld3JpdGVyLmgiCisjaW5jbHVkZSAiVmlydFJlZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1EU0UgICAgICwgIk51bWJlciBvZiBkZWFkIHN0b3JlcyBlbGlkZWQiKTsKK1NUQVRJU1RJQyhOdW1EU1MgICAgICwgIk51bWJlciBvZiBkZWFkIHNwaWxsIHNsb3RzIHJlbW92ZWQiKTsKK1NUQVRJU1RJQyhOdW1Db21tdXRlcywgIk51bWJlciBvZiBpbnN0cnVjdGlvbnMgY29tbXV0ZWQiKTsKK1NUQVRJU1RJQyhOdW1EUk0gICAgICwgIk51bWJlciBvZiByZS1tYXRlcmlhbGl6YWJsZSBkZWZzIGVsaWRlZCIpOworU1RBVElTVElDKE51bVN0b3JlcyAgLCAiTnVtYmVyIG9mIHN0b3JlcyBhZGRlZCIpOworU1RBVElTVElDKE51bVBTcGlsbHMgLCAiTnVtYmVyIG9mIHBoeXNpY2FsIHJlZ2lzdGVyIHNwaWxscyIpOworU1RBVElTVElDKE51bU9taXR0ZWQgLCAiTnVtYmVyIG9mIHJlbG9hZHMgb21pdGVkIik7CitTVEFUSVNUSUMoTnVtQXZvaWRlZCAsICJOdW1iZXIgb2YgcmVsb2FkcyBkZWVtZWQgdW5uZWNlc3NhcnkiKTsKK1NUQVRJU1RJQyhOdW1Db3BpZmllZCwgIk51bWJlciBvZiBhdmFpbGFibGUgcmVsb2FkcyB0dXJuZWQgaW50byBjb3BpZXMiKTsKK1NUQVRJU1RJQyhOdW1SZU1hdHMgICwgIk51bWJlciBvZiByZS1tYXRlcmlhbGl6YXRpb24iKTsKK1NUQVRJU1RJQyhOdW1Mb2FkcyAgICwgIk51bWJlciBvZiBsb2FkcyBhZGRlZCIpOworU1RBVElTVElDKE51bVJldXNlZCAgLCAiTnVtYmVyIG9mIHZhbHVlcyByZXVzZWQiKTsKK1NUQVRJU1RJQyhOdW1EQ0UgICAgICwgIk51bWJlciBvZiBjb3BpZXMgZWxpZGVkIik7CitTVEFUSVNUSUMoTnVtU1VuZm9sZCAsICJOdW1iZXIgb2Ygc3RvcmVzIHVuZm9sZGVkIik7CitTVEFUSVNUSUMoTnVtTW9kUmVmVW5mb2xkLCAiTnVtYmVyIG9mIG1vZHJlZiB1bmZvbGRlZCIpOworCituYW1lc3BhY2UgeworICBlbnVtIFJld3JpdGVyTmFtZSB7IGxvY2FsLCB0cml2aWFsIH07Cit9CisKK3N0YXRpYyBjbDo6b3B0PFJld3JpdGVyTmFtZT4KK1Jld3JpdGVyT3B0KCJyZXdyaXRlciIsCisgICAgICAgICAgICBjbDo6ZGVzYygiUmV3cml0ZXIgdG8gdXNlIChkZWZhdWx0PWxvY2FsKSIpLAorICAgICAgICAgICAgY2w6OlByZWZpeCwKKyAgICAgICAgICAgIGNsOjp2YWx1ZXMoY2xFbnVtVmFsKGxvY2FsLCAgICJsb2NhbCByZXdyaXRlciIpLAorICAgICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWwodHJpdmlhbCwgInRyaXZpYWwgcmV3cml0ZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsRW5kKSwKKyAgICAgICAgICAgIGNsOjppbml0KGxvY2FsKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitTY2hlZHVsZVNwaWxscygic2NoZWR1bGUtc3BpbGxzIiwKKyAgICAgICAgICAgICAgIGNsOjpkZXNjKCJTY2hlZHVsZSBzcGlsbCBjb2RlIiksCisgICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSkpOworCitWaXJ0UmVnUmV3cml0ZXI6On5WaXJ0UmVnUmV3cml0ZXIoKSB7fQorCisvLy8gc3Vic3RpdHV0ZVBoeXNSZWcgLSBSZXBsYWNlIHZpcnR1YWwgcmVnaXN0ZXIgaW4gTWFjaGluZU9wZXJhbmQgd2l0aCBhCisvLy8gcGh5c2ljYWwgcmVnaXN0ZXIuIERvIHRoZSByaWdodCB0aGluZyB3aXRoIHRoZSBzdWItcmVnaXN0ZXIgaW5kZXguCisvLy8gTm90ZSB0aGF0IG9wZXJhbmRzIG1heSBiZSBhZGRlZCwgc28gdGhlIE1PIHJlZmVyZW5jZSBpcyBubyBsb25nZXIgdmFsaWQuCitzdGF0aWMgdm9pZCBzdWJzdGl0dXRlUGh5c1JlZyhNYWNoaW5lT3BlcmFuZCAmTU8sIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSB7CisgIGlmICh1bnNpZ25lZCBTdWJJZHggPSBNTy5nZXRTdWJSZWcoKSkgeworICAgIC8vIEluc2VydCB0aGUgcGh5c2ljYWwgc3VicmVnIGFuZCByZXNldCB0aGUgc3VicmVnIGZpZWxkLgorICAgIE1PLnNldFJlZyhUUkkuZ2V0U3ViUmVnKFJlZywgU3ViSWR4KSk7CisgICAgTU8uc2V0U3ViUmVnKDApOworCisgICAgLy8gQW55IGRlZiwgZGVhZCwgYW5kIGtpbGwgZmxhZ3MgYXBwbHkgdG8gdGhlIGZ1bGwgdmlydHVhbCByZWdpc3Rlciwgc28gdGhleQorICAgIC8vIGFsc28gYXBwbHkgdG8gdGhlIGZ1bGwgcGh5c2ljYWwgcmVnaXN0ZXIuIEFkZCBpbXAtZGVmL2RlYWQgYW5kIGltcC1raWxsCisgICAgLy8gYXMgbmVlZGVkLgorICAgIE1hY2hpbmVJbnN0ciAmTUkgPSAqTU8uZ2V0UGFyZW50KCk7CisgICAgaWYgKE1PLmlzRGVmKCkpCisgICAgICBpZiAoTU8uaXNEZWFkKCkpCisgICAgICAgIE1JLmFkZFJlZ2lzdGVyRGVhZChSZWcsICZUUkksIC8qQWRkSWZOb3RGb3VuZD0qLyB0cnVlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTUkuYWRkUmVnaXN0ZXJEZWZpbmVkKFJlZywgJlRSSSk7CisgICAgZWxzZSBpZiAoIU1PLmlzVW5kZWYoKSAmJgorICAgICAgICAgICAgIChNTy5pc0tpbGwoKSB8fAorICAgICAgICAgICAgICBNSS5pc1JlZ1RpZWRUb0RlZk9wZXJhbmQoJk1PLSZNSS5nZXRPcGVyYW5kKDApKSkpCisgICAgICBNSS5hZGRSZWdpc3RlcktpbGxlZChSZWcsICZUUkksIC8qQWRkSWZOb3RGb3VuZD0qLyB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBNTy5zZXRSZWcoUmVnKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworCisvLy8gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIG5ldyBzcGlsbGluZyBmcmFtZXdvcmsgb25seS4gSXQKKy8vLyByZXdyaXRlcyB2cmVnIGRlZi91c2VzIHRvIHVzZSB0aGUgYXNzaWduZWQgcHJlZywgYnV0IGRvZXMgbm90IGluc2VydCBhbnkKKy8vLyBzcGlsbCBjb2RlLgorc3RydWN0IFRyaXZpYWxSZXdyaXRlciA6IHB1YmxpYyBWaXJ0UmVnUmV3cml0ZXIgeworCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRiwgVmlydFJlZ01hcCAmVlJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlcnZhbHMqIExJcykgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiKioqKioqKioqKiBSRVdSSVRFIE1BQ0hJTkUgQ09ERSAqKioqKioqKioqXG4iKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIioqKioqKioqKiogRnVuY3Rpb246ICIKKyAgICAgICAgICA8PCBNRi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkgPDwgJ1xuJyk7CisgICAgREVCVUcoZGJncygpIDw8ICIqKioqIE1hY2hpbmUgSW5zdHJzIgorICAgICAgICAgIDw8ICIoTk9URSEgRG9lcyBub3QgaW5jbHVkZSBzcGlsbHMgYW5kIHJlbG9hZHMhKSAqKioqXG4iKTsKKyAgICBERUJVRyhNRi5kdW1wKCkpOworCisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAqbXJpID0gJk1GLmdldFJlZ0luZm8oKTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKnRyaSA9IE1GLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworCisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisKKyAgICBmb3IgKExpdmVJbnRlcnZhbHM6Oml0ZXJhdG9yIGxpSXRyID0gTElzLT5iZWdpbigpLCBsaUVuZCA9IExJcy0+ZW5kKCk7CisgICAgICAgICBsaUl0ciAhPSBsaUVuZDsgKytsaUl0cikgeworCisgICAgICBjb25zdCBMaXZlSW50ZXJ2YWwgKmxpID0gbGlJdHItPnNlY29uZDsKKyAgICAgIHVuc2lnbmVkIHJlZyA9IGxpLT5yZWc7CisKKyAgICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihyZWcpKSB7CisgICAgICAgIGlmICghbGktPmVtcHR5KCkpCisgICAgICAgICAgbXJpLT5zZXRQaHlzUmVnVXNlZChyZWcpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmICghVlJNLmhhc1BoeXMocmVnKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdW5zaWduZWQgcFJlZyA9IFZSTS5nZXRQaHlzKHJlZyk7CisgICAgICAgIG1yaS0+c2V0UGh5c1JlZ1VzZWQocFJlZyk7CisgICAgICAgIC8vIENvcHkgdGhlIHJlZ2lzdGVyIHVzZS1saXN0IGJlZm9yZSB0cmF2ZXJzaW5nIGl0LgorICAgICAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+LCAzMj4gcmVnbGlzdDsKKyAgICAgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpyZWdfaXRlcmF0b3IgSSA9IG1yaS0+cmVnX2JlZ2luKHJlZyksCisgICAgICAgICAgICAgICBFID0gbXJpLT5yZWdfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICAgIHJlZ2xpc3QucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCYqSSwgSS5nZXRPcGVyYW5kTm8oKSkpOworICAgICAgICBmb3IgKHVuc2lnbmVkIE49MDsgTiAhPSByZWdsaXN0LnNpemUoKTsgKytOKQorICAgICAgICAgIHN1YnN0aXR1dGVQaHlzUmVnKHJlZ2xpc3RbTl0uZmlyc3QtPmdldE9wZXJhbmQocmVnbGlzdFtOXS5zZWNvbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWcsICp0cmkpOworICAgICAgICBjaGFuZ2VkIHw9ICFyZWdsaXN0LmVtcHR5KCk7CisgICAgICB9CisgICAgfQorCisgICAgREVCVUcoZGJncygpIDw8ICIqKioqIFBvc3QgTWFjaGluZSBJbnN0cnMgKioqKlxuIik7CisgICAgREVCVUcoTUYuZHVtcCgpKTsKKworICAgIHJldHVybiBjaGFuZ2VkOworICB9CisKK307CisKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisKK25hbWVzcGFjZSB7CisKKy8vLyBBdmFpbGFibGVTcGlsbHMgLSBBcyB0aGUgbG9jYWwgcmV3cml0ZXIgaXMgc2Nhbm5pbmcgYW5kIHJld3JpdGluZyBhbiBNQkIKKy8vLyBmcm9tIHRvcCBkb3duLCBrZWVwIHRyYWNrIG9mIHdoaWNoIHNwaWxsIHNsb3RzIG9yIHJlbWF0IGFyZSBhdmFpbGFibGUgaW4KKy8vLyBlYWNoIHJlZ2lzdGVyLgorLy8vCisvLy8gTm90ZSB0aGF0IG5vdCBhbGwgcGh5c3JlZ3MgYXJlIGNyZWF0ZWQgZXF1YWwgaGVyZS4gIEluIHBhcnRpY3VsYXIsIHNvbWUKKy8vLyBwaHlzcmVncyBhcmUgcmVsb2FkcyB0aGF0IHdlIGFyZSBhbGxvd2VkIHRvIGNsb2JiZXIgb3IgaWdub3JlIGF0IGFueSB0aW1lLgorLy8vIE90aGVyIHBoeXNyZWdzIGFyZSB2YWx1ZXMgdGhhdCB0aGUgcmVnaXN0ZXIgYWxsb2NhdGVkIHByb2dyYW0gaXMgdXNpbmcKKy8vLyB0aGF0IHdlIGNhbm5vdCBDSEFOR0UsIGJ1dCB3ZSBjYW4gcmVhZCBpZiB3ZSBsaWtlLiAgV2Uga2VlcCB0cmFjayBvZiB0aGlzCisvLy8gb24gYSBwZXItc3RhY2stc2xvdCAvIHJlbWF0IGlkIGJhc2lzIGFzIHRoZSBsb3cgYml0IGluIHRoZSB2YWx1ZSBvZiB0aGUKKy8vLyBTcGlsbFNsb3RzQXZhaWxhYmxlIGVudHJpZXMuICBUaGUgcHJlZGljYXRlICdjYW5DbG9iYmVyUGh5c1JlZygpJyBjaGVja3MKKy8vLyB0aGlzIGJpdCBhbmQgYWRkQXZhaWxhYmxlIHNldHMgaXQgaWYuCitjbGFzcyBBdmFpbGFibGVTcGlsbHMgeworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisKKyAgLy8gU3BpbGxTbG90c09yUmVNYXRzQXZhaWxhYmxlIC0gVGhpcyBtYXAga2VlcHMgdHJhY2sgb2YgYWxsIG9mIHRoZSBzcGlsbGVkCisgIC8vIG9yIHJlbWF0J2VkIHZpcnR1YWwgcmVnaXN0ZXIgdmFsdWVzIHRoYXQgYXJlIHN0aWxsIGF2YWlsYWJsZSwgZHVlIHRvCisgIC8vIGJlaW5nIGxvYWRlZCBvciBzdG9yZWQgdG8sIGJ1dCBub3QgaW52YWxpZGF0ZWQgeWV0LgorICBzdGQ6Om1hcDxpbnQsIHVuc2lnbmVkPiBTcGlsbFNsb3RzT3JSZU1hdHNBdmFpbGFibGU7CisKKyAgLy8gUGh5c1JlZ3NBdmFpbGFibGUgLSBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIFNwaWxsU2xvdHNPclJlTWF0c0F2YWlsYWJsZSwKKyAgLy8gaW5kaWNhdGluZyB3aGljaCBzdGFjayBzbG90IHZhbHVlcyBhcmUgY3VycmVudGx5IGhlbGQgYnkgYSBwaHlzcmVnLiAgVGhpcworICAvLyBpcyB1c2VkIHRvIGludmFsaWRhdGUgZW50cmllcyBpbiBTcGlsbFNsb3RzT3JSZU1hdHNBdmFpbGFibGUgd2hlbiBhCisgIC8vIHBoeXNyZWcgaXMgbW9kaWZpZWQuCisgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIGludD4gUGh5c1JlZ3NBdmFpbGFibGU7CisKKyAgdm9pZCBkaXNhbGxvd0Nsb2JiZXJQaHlzUmVnT25seSh1bnNpZ25lZCBQaHlzUmVnKTsKKworICB2b2lkIENsb2JiZXJQaHlzUmVnT25seSh1bnNpZ25lZCBQaHlzUmVnKTsKK3B1YmxpYzoKKyAgQXZhaWxhYmxlU3BpbGxzKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqdHJpLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gKnRpaSkKKyAgICA6IFRSSSh0cmkpLCBUSUkodGlpKSB7CisgIH0KKworICAvLy8gY2xlYXIgLSBSZXNldCB0aGUgc3RhdGUuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgU3BpbGxTbG90c09yUmVNYXRzQXZhaWxhYmxlLmNsZWFyKCk7CisgICAgUGh5c1JlZ3NBdmFpbGFibGUuY2xlYXIoKTsKKyAgfQorCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqZ2V0UmVnSW5mbygpIGNvbnN0IHsgcmV0dXJuIFRSSTsgfQorCisgIC8vLyBnZXRTcGlsbFNsb3RPclJlTWF0UGh5c1JlZyAtIElmIHRoZSBzcGVjaWZpZWQgc3RhY2sgc2xvdCBvciByZW1hdCBpcworICAvLy8gYXZhaWxhYmxlIGluIGEgcGh5c2ljYWwgcmVnaXN0ZXIsIHJldHVybiB0aGF0IFBoeXNSZWcsIG90aGVyd2lzZQorICAvLy8gcmV0dXJuIDAuCisgIHVuc2lnbmVkIGdldFNwaWxsU2xvdE9yUmVNYXRQaHlzUmVnKGludCBTbG90KSBjb25zdCB7CisgICAgc3RkOjptYXA8aW50LCB1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIEkgPQorICAgICAgU3BpbGxTbG90c09yUmVNYXRzQXZhaWxhYmxlLmZpbmQoU2xvdCk7CisgICAgaWYgKEkgIT0gU3BpbGxTbG90c09yUmVNYXRzQXZhaWxhYmxlLmVuZCgpKSB7CisgICAgICByZXR1cm4gSS0+c2Vjb25kID4+IDE7ICAvLyBSZW1vdmUgdGhlIENhbkNsb2JiZXIgYml0LgorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBhZGRBdmFpbGFibGUgLSBNYXJrIHRoYXQgdGhlIHNwZWNpZmllZCBzdGFjayBzbG90IC8gcmVtYXQgaXMgYXZhaWxhYmxlCisgIC8vLyBpbiB0aGUgc3BlY2lmaWVkIHBoeXNyZWcuICBJZiBDYW5DbG9iYmVyIGlzIHRydWUsIHRoZSBwaHlzcmVnIGNhbiBiZQorICAvLy8gbW9kaWZpZWQgYXQgYW55IHRpbWUgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VtYW50aWNzIG9mIHRoZSBwcm9ncmFtLgorICB2b2lkIGFkZEF2YWlsYWJsZShpbnQgU2xvdE9yUmVNYXQsIHVuc2lnbmVkIFJlZywgYm9vbCBDYW5DbG9iYmVyID0gdHJ1ZSkgeworICAgIC8vIElmIHRoaXMgc3RhY2sgc2xvdCBpcyB0aG91Z2h0IHRvIGJlIGF2YWlsYWJsZSBpbiBzb21lIG90aGVyIHBoeXNyZWcsCisgICAgLy8gcmVtb3ZlIGl0cyByZWNvcmQuCisgICAgTW9kaWZ5U3RhY2tTbG90T3JSZU1hdChTbG90T3JSZU1hdCk7CisKKyAgICBQaHlzUmVnc0F2YWlsYWJsZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUmVnLCBTbG90T3JSZU1hdCkpOworICAgIFNwaWxsU2xvdHNPclJlTWF0c0F2YWlsYWJsZVtTbG90T3JSZU1hdF09IChSZWcgPDwgMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClDYW5DbG9iYmVyOworCisgICAgaWYgKFNsb3RPclJlTWF0ID4gVmlydFJlZ01hcDo6TUFYX1NUQUNLX1NMT1QpCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlbWVtYmVyaW5nIFJNIyIKKyAgICAgICAgICAgICAgICAgICA8PCBTbG90T3JSZU1hdC1WaXJ0UmVnTWFwOjpNQVhfU1RBQ0tfU0xPVC0xKTsKKyAgICBlbHNlCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlbWVtYmVyaW5nIFNTIyIgPDwgU2xvdE9yUmVNYXQpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiIGluIHBoeXNyZWcgIiA8PCBUUkktPmdldE5hbWUoUmVnKSA8PCAiXG4iKTsKKyAgfQorCisgIC8vLyBjYW5DbG9iYmVyUGh5c1JlZ0ZvclNTIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwaWxsZXIgaXMgYWxsb3dlZCB0byBjaGFuZ2UKKyAgLy8vIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHN0YWNrc2xvdCByZWdpc3RlciBpZiBpdCBkZXNpcmVzLiBUaGUKKyAgLy8vIHNwZWNpZmllZCBzdGFjayBzbG90IG11c3QgYmUgYXZhaWxhYmxlIGluIGEgcGh5c3JlZyBmb3IgdGhpcyBxdWVyeSB0bworICAvLy8gbWFrZSBzZW5zZS4KKyAgYm9vbCBjYW5DbG9iYmVyUGh5c1JlZ0ZvclNTKGludCBTbG90T3JSZU1hdCkgY29uc3QgeworICAgIGFzc2VydChTcGlsbFNsb3RzT3JSZU1hdHNBdmFpbGFibGUuY291bnQoU2xvdE9yUmVNYXQpICYmCisgICAgICAgICAgICJWYWx1ZSBub3QgYXZhaWxhYmxlISIpOworICAgIHJldHVybiBTcGlsbFNsb3RzT3JSZU1hdHNBdmFpbGFibGUuZmluZChTbG90T3JSZU1hdCktPnNlY29uZCAmIDE7CisgIH0KKworICAvLy8gY2FuQ2xvYmJlclBoeXNSZWcgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BpbGxlciBpcyBhbGxvd2VkIHRvIGNsb2JiZXIgdGhlCisgIC8vLyBwaHlzaWNhbCByZWdpc3RlciB3aGVyZSB2YWx1ZXMgZm9yIHNvbWUgc3RhY2sgc2xvdChzKSBtaWdodCBiZQorICAvLy8gYXZhaWxhYmxlLgorICBib29sIGNhbkNsb2JiZXJQaHlzUmVnKHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0IHsKKyAgICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBpbnQ+Ojpjb25zdF9pdGVyYXRvciBJID0KKyAgICAgIFBoeXNSZWdzQXZhaWxhYmxlLmxvd2VyX2JvdW5kKFBoeXNSZWcpOworICAgIHdoaWxlIChJICE9IFBoeXNSZWdzQXZhaWxhYmxlLmVuZCgpICYmIEktPmZpcnN0ID09IFBoeXNSZWcpIHsKKyAgICAgIGludCBTbG90T3JSZU1hdCA9IEktPnNlY29uZDsKKyAgICAgIEkrKzsKKyAgICAgIGlmICghY2FuQ2xvYmJlclBoeXNSZWdGb3JTUyhTbG90T3JSZU1hdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gZGlzYWxsb3dDbG9iYmVyUGh5c1JlZyAtIFVuc2V0IHRoZSBDYW5DbG9iYmVyIGJpdCBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBzdGFja3Nsb3QgcmVnaXN0ZXIuIFRoZSByZWdpc3RlciBpcyBzdGlsbCBhdmFpbGFibGUgYnV0IGlzIG5vIGxvbmdlcgorICAvLy8gYWxsb3dlZCB0byBiZSBtb2RpZmVkLgorICB2b2lkIGRpc2FsbG93Q2xvYmJlclBoeXNSZWcodW5zaWduZWQgUGh5c1JlZyk7CisKKyAgLy8vIENsb2JiZXJQaHlzUmVnIC0gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHBoeXNyZWcgY2hhbmdlcworICAvLy8gdmFsdWUuICBXZSB1c2UgdGhpcyB0byBpbnZhbGlkYXRlIGFueSBpbmZvIGFib3V0IHN0dWZmIHRoYXQgbGl2ZXMgaW4KKyAgLy8vIGl0IGFuZCBhbnkgb2YgaXRzIGFsaWFzZXMuCisgIHZvaWQgQ2xvYmJlclBoeXNSZWcodW5zaWduZWQgUGh5c1JlZyk7CisKKyAgLy8vIE1vZGlmeVN0YWNrU2xvdE9yUmVNYXQgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgaW4gYSBzdGFjaworICAvLy8gc2xvdCBjaGFuZ2VzLiAgVGhpcyByZW1vdmVzIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHJlZ2lzdGVyIHRoZQorICAvLy8gcHJldmlvdXMgdmFsdWUgZm9yIHRoaXMgc2xvdCBsaXZlcyBpbiAoYXMgdGhlIHByZXZpb3VzIHZhbHVlIGlzIGRlYWQKKyAgLy8vIG5vdykuCisgIHZvaWQgTW9kaWZ5U3RhY2tTbG90T3JSZU1hdChpbnQgU2xvdE9yUmVNYXQpOworCisgIC8vLyBBZGRBdmFpbGFibGVSZWdzVG9MaXZlSW4gLSBBdmFpbGFiaWxpdHkgaW5mb3JtYXRpb24gaXMgYmVpbmcga2VwdCBjb21pbmcKKyAgLy8vIGludG8gdGhlIHNwZWNpZmllZCBNQkIuIEFkZCBhdmFpbGFibGUgcGh5c2ljYWwgcmVnaXN0ZXJzIGFzIHBvdGVudGlhbAorICAvLy8gbGl2ZS1pbidzLiBJZiB0aGV5IGFyZSByZXVzZWQgaW4gdGhlIE1CQiwgdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZQorICAvLy8gbGl2ZS1pbiBzZXQgdG8gbWFrZSByZWdpc3RlciBzY2F2ZW5nZXIgYW5kIHBvc3QtYWxsb2NhdGlvbiBzY2hlZHVsZXIuCisgIHZvaWQgQWRkQXZhaWxhYmxlUmVnc1RvTGl2ZUluKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIEJpdFZlY3RvciAmUmVnS2lsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kKj4gJktpbGxPcHMpOworfTsKKworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KKworLy8gR2l2ZW4gYSBsb2NhdGlvbiB3aGVyZSBhIHJlbG9hZCBvZiBhIHNwaWxsZWQgcmVnaXN0ZXIgb3IgYSByZW1hdCBvZgorLy8gYSBjb25zdGFudCBpcyB0byBiZSBpbnNlcnRlZCwgYXR0ZW1wdCB0byBmaW5kIGEgc2FmZSBsb2NhdGlvbiB0bworLy8gaW5zZXJ0IHRoZSBsb2FkIGF0IGFuIGVhcmxpZXIgcG9pbnQgaW4gdGhlIGJhc2ljLWJsb2NrLCB0byBoaWRlCisvLyBsYXRlbmN5IG9mIHRoZSBsb2FkIGFuZCB0byBhdm9pZCBhZGRyZXNzLWdlbmVyYXRpb24gaW50ZXJsb2NrCisvLyBpc3N1ZXMuCitzdGF0aWMgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yCitDb21wdXRlUmVsb2FkTG9jKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBjb25zdCBJbnNlcnRMb2MsCisgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBjb25zdCBCZWdpbiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgUGh5c1JlZywKKyAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgIGJvb2wgRG9SZU1hdCwKKyAgICAgICAgICAgICAgICAgaW50IFNTb3JSTUlkLAorICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSwKKyAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikKK3sKKyAgaWYgKCFTY2hlZHVsZVNwaWxscykKKyAgICByZXR1cm4gSW5zZXJ0TG9jOworCisgIC8vIFNwaWxsIGJhY2tzY2hlZHVsaW5nIGlzIG9mIHByaW1hcnkgaW50ZXJlc3QgdG8gYWRkcmVzc2VzLCBzbworICAvLyBkb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgcmVnaXN0ZXIgaXNuJ3QgaW4gdGhlIHJlZ2lzdGVyIGNsYXNzCisgIC8vIHVzZWQgZm9yIHBvaW50ZXJzLgorCisgIGNvbnN0IFRhcmdldExvd2VyaW5nICpUTCA9IE1GLmdldFRhcmdldCgpLmdldFRhcmdldExvd2VyaW5nKCk7CisKKyAgaWYgKCFUTC0+aXNUeXBlTGVnYWwoVEwtPmdldFBvaW50ZXJUeSgpKSkKKyAgICAvLyBCZWxpZXZlIGl0IG9yIG5vdCwgdGhpcyBpcyB0cnVlIG9uIFBJQzE2LgorICAgIHJldHVybiBJbnNlcnRMb2M7CisKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqcHRyUmVnQ2xhc3MgPQorICAgIFRMLT5nZXRSZWdDbGFzc0ZvcihUTC0+Z2V0UG9pbnRlclR5KCkpOworICBpZiAoIXB0clJlZ0NsYXNzLT5jb250YWlucyhQaHlzUmVnKSkKKyAgICByZXR1cm4gSW5zZXJ0TG9jOworCisgIC8vIFNjYW4gdXB3YXJkcyB0aHJvdWdoIHRoZSBwcmVjZWRpbmcgaW5zdHJ1Y3Rpb25zLiBJZiBhbiBpbnN0cnVjdGlvbiBkb2Vzbid0CisgIC8vIHJlZmVyZW5jZSB0aGUgc3RhY2sgc2xvdCBvciB0aGUgcmVnaXN0ZXIgd2UncmUgbG9hZGluZywgd2UgY2FuCisgIC8vIGJhY2tzY2hlZHVsZSB0aGUgcmVsb2FkIHVwIHBhc3QgaXQuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBOZXdJbnNlcnRMb2MgPSBJbnNlcnRMb2M7CisgIHdoaWxlIChOZXdJbnNlcnRMb2MgIT0gQmVnaW4pIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUHJldiA9IHByaW9yKE5ld0luc2VydExvYyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFByZXYtPmdldE51bU9wZXJhbmRzKCk7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk9wID0gUHJldi0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghRG9SZU1hdCAmJiBPcC5pc0ZJKCkgJiYgT3AuZ2V0SW5kZXgoKSA9PSBTU29yUk1JZCkKKyAgICAgICAgZ290byBzdG9wOworICAgIH0KKyAgICBpZiAoUHJldi0+ZmluZFJlZ2lzdGVyVXNlT3BlcmFuZElkeChQaHlzUmVnKSAhPSAtMSB8fAorICAgICAgICBQcmV2LT5maW5kUmVnaXN0ZXJEZWZPcGVyYW5kKFBoeXNSZWcpKQorICAgICAgZ290byBzdG9wOworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzID0gVFJJLT5nZXRBbGlhc1NldChQaHlzUmVnKTsgKkFsaWFzOyArK0FsaWFzKQorICAgICAgaWYgKFByZXYtPmZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgoKkFsaWFzKSAhPSAtMSB8fAorICAgICAgICAgIFByZXYtPmZpbmRSZWdpc3RlckRlZk9wZXJhbmQoKkFsaWFzKSkKKyAgICAgICAgZ290byBzdG9wOworICAgIE5ld0luc2VydExvYyA9IFByZXY7CisgIH0KK3N0b3A6OworCisgIC8vIElmIHdlIG1hZGUgaXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2ssIHR1cm4gYXJvdW5kIGFuZCBtb3ZlIGJhY2sKKyAgLy8gZG93biBqdXN0IHBhc3QgYW55IGV4aXN0aW5nIHJlbG9hZHMuIFRoZXkncmUgbGlrZWx5IHRvIGJlIHJlbG9hZHMvcmVtYXRzCisgIC8vIGZvciBpbnN0cnVjdGlvbnMgZWFybGllciB0aGFuIHdoYXQgb3VyIGN1cnJlbnQgcmVsb2FkL3JlbWF0IGlzIGZvciwgc28KKyAgLy8gdGhleSBzaG91bGQgYmUgc2NoZWR1bGVkIGVhcmxpZXIuCisgIGlmIChOZXdJbnNlcnRMb2MgPT0gQmVnaW4pIHsKKyAgICBpbnQgRnJhbWVJZHg7CisgICAgd2hpbGUgKEluc2VydExvYyAhPSBOZXdJbnNlcnRMb2MgJiYKKyAgICAgICAgICAgKFRJSS0+aXNMb2FkRnJvbVN0YWNrU2xvdChOZXdJbnNlcnRMb2MsIEZyYW1lSWR4KSB8fAorICAgICAgICAgICAgVElJLT5pc1RyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoTmV3SW5zZXJ0TG9jKSkpCisgICAgICArK05ld0luc2VydExvYzsKKyAgfQorCisgIHJldHVybiBOZXdJbnNlcnRMb2M7Cit9CisKK25hbWVzcGFjZSB7CisKKy8vIFJldXNlZE9wIC0gRm9yIGVhY2ggcmV1c2VkIG9wZXJhbmQsIHdlIGtlZXAgdHJhY2sgb2YgYSBiaXQgb2YgaW5mb3JtYXRpb24sCisvLyBpbiBjYXNlIHdlIG5lZWQgdG8gcm9sbGJhY2sgdXBvbiBwcm9jZXNzaW5nIGEgbmV3IG9wZXJhbmQuICBTZWUgY29tbWVudHMKKy8vIGJlbG93Lgorc3RydWN0IFJldXNlZE9wIHsKKyAgLy8gVGhlIE1hY2hpbmVJbnN0ciBvcGVyYW5kIHRoYXQgcmV1c2VkIGFuIGF2YWlsYWJsZSB2YWx1ZS4KKyAgdW5zaWduZWQgT3BlcmFuZDsKKworICAvLyBTdGFja1Nsb3RPclJlTWF0IC0gVGhlIHNwaWxsIHNsb3Qgb3IgcmVtYXQgaWQgb2YgdGhlIHZhbHVlIGJlaW5nIHJldXNlZC4KKyAgdW5zaWduZWQgU3RhY2tTbG90T3JSZU1hdDsKKworICAvLyBQaHlzUmVnUmV1c2VkIC0gVGhlIHBoeXNpY2FsIHJlZ2lzdGVyIHRoZSB2YWx1ZSB3YXMgYXZhaWxhYmxlIGluLgorICB1bnNpZ25lZCBQaHlzUmVnUmV1c2VkOworCisgIC8vIEFzc2lnbmVkUGh5c1JlZyAtIFRoZSBwaHlzcmVnIHRoYXQgd2FzIGFzc2lnbmVkIGZvciB1c2UgYnkgdGhlIHJlbG9hZC4KKyAgdW5zaWduZWQgQXNzaWduZWRQaHlzUmVnOworCisgIC8vIFZpcnRSZWcgLSBUaGUgdmlydHVhbCByZWdpc3RlciBpdHNlbGYuCisgIHVuc2lnbmVkIFZpcnRSZWc7CisKKyAgUmV1c2VkT3AodW5zaWduZWQgbywgdW5zaWduZWQgc3MsIHVuc2lnbmVkIHByciwgdW5zaWduZWQgYXByLAorICAgICAgICAgICB1bnNpZ25lZCB2cmVnKQorICAgIDogT3BlcmFuZChvKSwgU3RhY2tTbG90T3JSZU1hdChzcyksIFBoeXNSZWdSZXVzZWQocHJyKSwKKyAgICAgIEFzc2lnbmVkUGh5c1JlZyhhcHIpLCBWaXJ0UmVnKHZyZWcpIHt9Cit9OworCisvLy8gUmV1c2VJbmZvIC0gVGhpcyBtYWludGFpbnMgYSBjb2xsZWN0aW9uIG9mIFJldXNlT3AncyBmb3IgZWFjaCBvcGVyYW5kIHRoYXQKKy8vLyBpcyByZXVzZWQgaW5zdGVhZCBvZiByZWxvYWRlZC4KK2NsYXNzIFJldXNlSW5mbyB7CisgIE1hY2hpbmVJbnN0ciAmTUk7CisgIHN0ZDo6dmVjdG9yPFJldXNlZE9wPiBSZXVzZXM7CisgIEJpdFZlY3RvciBQaHlzUmVnc0Nsb2JiZXJlZDsKK3B1YmxpYzoKKyAgUmV1c2VJbmZvKE1hY2hpbmVJbnN0ciAmbWksIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqdHJpKSA6IE1JKG1pKSB7CisgICAgUGh5c1JlZ3NDbG9iYmVyZWQucmVzaXplKHRyaS0+Z2V0TnVtUmVncygpKTsKKyAgfQorCisgIGJvb2wgaGFzUmV1c2VzKCkgY29uc3QgeworICAgIHJldHVybiAhUmV1c2VzLmVtcHR5KCk7CisgIH0KKworICAvLy8gYWRkUmV1c2UgLSBJZiB3ZSBjaG9vc2UgdG8gcmV1c2UgYSB2aXJ0dWFsIHJlZ2lzdGVyIHRoYXQgaXMgYWxyZWFkeQorICAvLy8gYXZhaWxhYmxlIGluc3RlYWQgb2YgcmVsb2FkaW5nIGl0LCByZW1lbWJlciB0aGF0IHdlIGRpZCBzby4KKyAgdm9pZCBhZGRSZXVzZSh1bnNpZ25lZCBPcE5vLCB1bnNpZ25lZCBTdGFja1Nsb3RPclJlTWF0LAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBoeXNSZWdSZXVzZWQsIHVuc2lnbmVkIEFzc2lnbmVkUGh5c1JlZywKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBWaXJ0UmVnKSB7CisgICAgLy8gSWYgdGhlIHJlbG9hZCBpcyB0byB0aGUgYXNzaWduZWQgcmVnaXN0ZXIgYW55d2F5LCBubyB1bmRvIHdpbGwgYmUKKyAgICAvLyByZXF1aXJlZC4KKyAgICBpZiAoUGh5c1JlZ1JldXNlZCA9PSBBc3NpZ25lZFBoeXNSZWcpIHJldHVybjsKKworICAgIC8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhpcy4KKyAgICBSZXVzZXMucHVzaF9iYWNrKFJldXNlZE9wKE9wTm8sIFN0YWNrU2xvdE9yUmVNYXQsIFBoeXNSZWdSZXVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NpZ25lZFBoeXNSZWcsIFZpcnRSZWcpKTsKKyAgfQorCisgIHZvaWQgbWFya0Nsb2JiZXJlZCh1bnNpZ25lZCBQaHlzUmVnKSB7CisgICAgUGh5c1JlZ3NDbG9iYmVyZWQuc2V0KFBoeXNSZWcpOworICB9CisKKyAgYm9vbCBpc0Nsb2JiZXJlZCh1bnNpZ25lZCBQaHlzUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIFBoeXNSZWdzQ2xvYmJlcmVkLnRlc3QoUGh5c1JlZyk7CisgIH0KKworICAvLy8gR2V0UmVnRm9yUmVsb2FkIC0gV2UgYXJlIGFib3V0IHRvIGVtaXQgYSByZWxvYWQgaW50byBQaHlzUmVnLiAgSWYgdGhlcmUKKyAgLy8vIGlzIHNvbWUgb3RoZXIgb3BlcmFuZCB0aGF0IGlzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIsIGVpdGhlciBwaWNrCisgIC8vLyBhIG5ldyByZWdpc3RlciB0byB1c2UsIG9yIGV2aWN0IHRoZSBwcmV2aW91cyByZWxvYWQgYW5kIHVzZSB0aGlzIHJlZy4KKyAgdW5zaWduZWQgR2V0UmVnRm9yUmVsb2FkKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLCB1bnNpZ25lZCBQaHlzUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVNwaWxscyAmU3BpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyKj4gJk1heWJlRGVhZFN0b3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0PHVuc2lnbmVkLCA4PiAmUmVqZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnRSZWdNYXAgJlZSTSk7CisKKyAgLy8vIEdldFJlZ0ZvclJlbG9hZCAtIEhlbHBlciBmb3IgdGhlIGFib3ZlIEdldFJlZ0ZvclJlbG9hZCgpLiBBZGQgYQorICAvLy8gJ1JlamVjdGVkJyBzZXQgdG8gcmVtZW1iZXIgd2hpY2ggcmVnaXN0ZXJzIGhhdmUgYmVlbiBjb25zaWRlcmVkIGFuZAorICAvLy8gcmVqZWN0ZWQgZm9yIHRoZSByZWxvYWQuIFRoaXMgYXZvaWRzIGluZmluaXRlIGxvb3BpbmcgaW4gY2FzZSBsaWtlCisgIC8vLyB0aGlzOgorICAvLy8gdDEgOj0gb3AgdDIsIHQzCisgIC8vLyB0MiA8LSBhc3NpZ25lZCByMCBmb3IgdXNlIGJ5IHRoZSByZWxvYWQgYnV0IGVuZGVkIHVwIHJldXNlIHIxCisgIC8vLyB0MyA8LSBhc3NpZ25lZCByMSBmb3IgdXNlIGJ5IHRoZSByZWxvYWQgYnV0IGVuZGVkIHVwIHJldXNlIHIwCisgIC8vLyB0MSA8LSBkZXNpcmVzIHIxCisgIC8vLyAgICAgICBzZWVzIHIxIGlzIHRha2VuIGJ5IHQyLCB0cmllcyB0MidzIHJlbG9hZCByZWdpc3RlciByMAorICAvLy8gICAgICAgc2VlcyByMCBpcyB0YWtlbiBieSB0MywgdHJpZXMgdDMncyByZWxvYWQgcmVnaXN0ZXIgcjEKKyAgLy8vICAgICAgIHNlZXMgcjEgaXMgdGFrZW4gYnkgdDIsIHRyaWVzIHQyJ3MgcmVsb2FkIHJlZ2lzdGVyIHIwIC4uLgorICB1bnNpZ25lZCBHZXRSZWdGb3JSZWxvYWQodW5zaWduZWQgVmlydFJlZywgdW5zaWduZWQgUGh5c1JlZywgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVNwaWxscyAmU3BpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyKj4gJk1heWJlRGVhZFN0b3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmUmVnS2lsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lT3BlcmFuZCo+ICZLaWxsT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlydFJlZ01hcCAmVlJNKSB7CisgICAgU21hbGxTZXQ8dW5zaWduZWQsIDg+IFJlamVjdGVkOworICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBSQyA9IE1GLmdldFJlZ0luZm8oKS5nZXRSZWdDbGFzcyhWaXJ0UmVnKTsKKyAgICByZXR1cm4gR2V0UmVnRm9yUmVsb2FkKFJDLCBQaHlzUmVnLCBNRiwgTUksIFNwaWxscywgTWF5YmVEZWFkU3RvcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVqZWN0ZWQsIFJlZ0tpbGxzLCBLaWxsT3BzLCBWUk0pOworICB9Cit9OworCit9CisKKy8vICoqKioqKioqKioqKioqKioqKiAvLworLy8gVXRpbGl0eSBGdW5jdGlvbnMgIC8vCisvLyAqKioqKioqKioqKioqKioqKiogLy8KKworLy8vIGZpbmRTaW5nbGVQcmVkU3VjY2Vzc29yIC0gUmV0dXJuIHZpYSByZWZlcmVuY2UgYSB2ZWN0b3Igb2YgbWFjaGluZSBiYXNpYworLy8vIGJsb2NrcyBlYWNoIG9mIHdoaWNoIGlzIGEgc3VjY2Vzc29yIG9mIHRoZSBzcGVjaWZpZWQgQkIgYW5kIGhhcyBubyBvdGhlcgorLy8vIHByZWRlY2Vzc29yLgorc3RhdGljIHZvaWQgZmluZFNpbmdsZVByZWRTdWNjZXNzb3IoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVCYXNpY0Jsb2NrICo+ICZTdWNjcyl7CisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OnN1Y2NfaXRlcmF0b3IgU0kgPSBNQkItPnN1Y2NfYmVnaW4oKSwKKyAgICAgICAgIFNFID0gTUJCLT5zdWNjX2VuZCgpOyBTSSAhPSBTRTsgKytTSSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjTUJCID0gKlNJOworICAgIGlmIChTdWNjTUJCLT5wcmVkX3NpemUoKSA9PSAxKQorICAgICAgU3VjY3MucHVzaF9iYWNrKFN1Y2NNQkIpOworICB9Cit9CisKKy8vLyBJbnZhbGlkYXRlS2lsbCAtIEludmFsaWRhdGUgcmVnaXN0ZXIga2lsbCBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYworLy8vIHJlZ2lzdGVyLiBUaGlzIGFsc28gdW5zZXRzIHRoZSBraWxscyBtYXJrZXIgb24gdGhlIGxhc3Qga2lsbCBvcGVyYW5kLgorc3RhdGljIHZvaWQgSW52YWxpZGF0ZUtpbGwodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvKiBUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcykgeworICBpZiAoUmVnS2lsbHNbUmVnXSkgeworICAgIEtpbGxPcHNbUmVnXS0+c2V0SXNLaWxsKGZhbHNlKTsKKyAgICAvLyBLaWxsT3BzW1JlZ10gbWlnaHQgYmUgYSBkZWYgb2YgYSBzdXBlci1yZWdpc3Rlci4KKyAgICB1bnNpZ25lZCBLUmVnID0gS2lsbE9wc1tSZWddLT5nZXRSZWcoKTsKKyAgICBLaWxsT3BzW0tSZWddID0gTlVMTDsKKyAgICBSZWdLaWxscy5yZXNldChLUmVnKTsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTUiA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKEtSZWcpOyAqU1I7ICsrU1IpIHsKKyAgICAgIGlmIChSZWdLaWxsc1sqU1JdKSB7CisgICAgICAgIEtpbGxPcHNbKlNSXS0+c2V0SXNLaWxsKGZhbHNlKTsKKyAgICAgICAgS2lsbE9wc1sqU1JdID0gTlVMTDsKKyAgICAgICAgUmVnS2lsbHMucmVzZXQoKlNSKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8vIEludmFsaWRhdGVLaWxscyAtIE1JIGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQuIElmIGFueSBvZiBpdHMgb3BlcmFuZHMgYXJlCisvLy8gbWFya2VkIGtpbGwsIHRoZW4gaW52YWxpZGF0ZSB0aGUgaW5mb3JtYXRpb24uCitzdGF0aWMgdm9pZCBJbnZhbGlkYXRlS2lsbHMoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8qIFRSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kKj4gJktpbGxPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+ICpLaWxsUmVncyA9IE5VTEwpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzVXNlKCkgfHwgIU1PLmlzS2lsbCgpIHx8IE1PLmlzVW5kZWYoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZykpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoS2lsbFJlZ3MpCisgICAgICBLaWxsUmVncy0+cHVzaF9iYWNrKFJlZyk7CisgICAgYXNzZXJ0KFJlZyA8IEtpbGxPcHMuc2l6ZSgpKTsKKyAgICBpZiAoS2lsbE9wc1tSZWddID09ICZNTykgeworICAgICAgS2lsbE9wc1tSZWddID0gTlVMTDsKKyAgICAgIFJlZ0tpbGxzLnJlc2V0KFJlZyk7CisgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTUiA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7ICpTUjsgKytTUikgeworICAgICAgICBpZiAoUmVnS2lsbHNbKlNSXSkgeworICAgICAgICAgIEtpbGxPcHNbKlNSXSA9IE5VTEw7CisgICAgICAgICAgUmVnS2lsbHMucmVzZXQoKlNSKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gSW52YWxpZGF0ZVJlZ0RlZiAtIElmIHRoZSBkZWYgb3BlcmFuZCBvZiB0aGUgc3BlY2lmaWVkIGRlZiBNSSBpcyBub3cgZGVhZAorLy8vIChzaW5jZSBpdHMgc3BpbGwgaW5zdHJ1Y3Rpb24gaXMgcmVtb3ZlZCksIG1hcmsgaXQgaXNEZWFkLiBBbHNvIGNoZWNrcyBpZgorLy8vIHRoZSBkZWYgTUkgaGFzIG90aGVyIGRlZmluaXRpb24gb3BlcmFuZHMgdGhhdCBhcmUgbm90IGRlYWQuIFJldHVybnMgaXQgYnkKKy8vLyByZWZlcmVuY2UuCitzdGF0aWMgYm9vbCBJbnZhbGlkYXRlUmVnRGVmKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgJk5ld0RlZiwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNMaXZlRGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgeworICAvLyBEdWUgdG8gcmVtYXQsIGl0J3MgcG9zc2libGUgdGhpcyByZWcgaXNuJ3QgYmVpbmcgcmV1c2VkLiBUaGF0IGlzLAorICAvLyB0aGUgZGVmIG9mIHRoaXMgcmVnIChieSBwcmV2IE1JKSBpcyBub3cgZGVhZC4KKyAgTWFjaGluZUluc3RyICpEZWZNSSA9IEk7CisgIE1hY2hpbmVPcGVyYW5kICpEZWZPcCA9IE5VTEw7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEZWZNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBEZWZNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzRGVmKCkgfHwgIU1PLmlzS2lsbCgpIHx8IE1PLmlzVW5kZWYoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChNTy5nZXRSZWcoKSA9PSBSZWcpCisgICAgICBEZWZPcCA9ICZNTzsKKyAgICBlbHNlIGlmICghTU8uaXNEZWFkKCkpCisgICAgICBIYXNMaXZlRGVmID0gdHJ1ZTsKKyAgfQorICBpZiAoIURlZk9wKQorICAgIHJldHVybiBmYWxzZTsKKworICBib29sIEZvdW5kVXNlID0gZmFsc2UsIERvbmUgPSBmYWxzZTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEUgPSAmTmV3RGVmOworICArK0k7ICsrRTsKKyAgZm9yICg7ICFEb25lICYmIEkgIT0gRTsgKytJKSB7CisgICAgTWFjaGluZUluc3RyICpOTUkgPSBJOworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVlID0gTk1JLT5nZXROdW1PcGVyYW5kcygpOyBqICE9IGVlOyArK2opIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE5NSS0+Z2V0T3BlcmFuZChqKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSB8fCBNTy5nZXRSZWcoKSA9PSAwIHx8CisgICAgICAgICAgKE1PLmdldFJlZygpICE9IFJlZyAmJiAhVFJJLT5pc1N1YlJlZ2lzdGVyKFJlZywgTU8uZ2V0UmVnKCkpKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoTU8uaXNVc2UoKSkKKyAgICAgICAgRm91bmRVc2UgPSB0cnVlOworICAgICAgRG9uZSA9IHRydWU7IC8vIFN0b3AgYWZ0ZXIgc2Nhbm5pbmcgYWxsIHRoZSBvcGVyYW5kcyBvZiB0aGlzIE1JLgorICAgIH0KKyAgfQorICBpZiAoIUZvdW5kVXNlKSB7CisgICAgLy8gRGVmIGlzIGRlYWQhCisgICAgRGVmT3AtPnNldElzRGVhZCgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFVwZGF0ZUtpbGxzIC0gVHJhY2sgYW5kIHVwZGF0ZSBraWxsIGluZm8uIElmIGEgTUkgcmVhZHMgYSByZWdpc3RlciB0aGF0IGlzCisvLy8gbWFya2VkIGtpbGwsIHRoZW4gaXQgbXVzdCBiZSBkdWUgdG8gcmVnaXN0ZXIgcmV1c2UuIFRyYW5zZmVyIHRoZSBraWxsIGluZm8KKy8vLyBvdmVyLgorc3RhdGljIHZvaWQgVXBkYXRlS2lsbHMoTWFjaGluZUluc3RyICZNSSwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvKiBUUkksCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcykgeworICAvLyBUaGVzZSBkbyBub3QgYWZmZWN0IGtpbGwgaW5mbyBhdCBhbGwuCisgIGlmIChNSS5pc0RlYnVnVmFsdWUoKSkKKyAgICByZXR1cm47CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc1VzZSgpIHx8IE1PLmlzVW5kZWYoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChSZWcgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKFJlZ0tpbGxzW1JlZ10gJiYgS2lsbE9wc1tSZWddLT5nZXRQYXJlbnQoKSAhPSAmTUkpIHsKKyAgICAgIC8vIFRoYXQgY2FuJ3QgYmUgcmlnaHQuIFJlZ2lzdGVyIGlzIGtpbGxlZCBidXQgbm90IHJlLWRlZmluZWQgYW5kIGl0J3MKKyAgICAgIC8vIGJlaW5nIHJldXNlZC4gTGV0J3MgZml4IHRoYXQuCisgICAgICBLaWxsT3BzW1JlZ10tPnNldElzS2lsbChmYWxzZSk7CisgICAgICAvLyBLaWxsT3BzW1JlZ10gbWlnaHQgYmUgYSBkZWYgb2YgYSBzdXBlci1yZWdpc3Rlci4KKyAgICAgIHVuc2lnbmVkIEtSZWcgPSBLaWxsT3BzW1JlZ10tPmdldFJlZygpOworICAgICAgS2lsbE9wc1tLUmVnXSA9IE5VTEw7CisgICAgICBSZWdLaWxscy5yZXNldChLUmVnKTsKKworICAgICAgLy8gTXVzdCBiZSBhIGRlZiBvZiBhIHN1cGVyLXJlZ2lzdGVyLiBJdHMgb3RoZXIgc3ViLXJlZ3N0ZXJzIGFyZSBubworICAgICAgLy8gbG9uZ2VyIGtpbGxlZCBhcyB3ZWxsLgorICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU1IgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhLUmVnKTsgKlNSOyArK1NSKSB7CisgICAgICAgIEtpbGxPcHNbKlNSXSA9IE5VTEw7CisgICAgICAgIFJlZ0tpbGxzLnJlc2V0KCpTUik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENoZWNrIGZvciBzdWJyZWcga2lsbHMgYXMgd2VsbC4KKyAgICAgIC8vIGQ0ID0KKyAgICAgIC8vIHN0b3JlIGQ0LCBmaSMwCisgICAgICAvLyAuLi4KKyAgICAgIC8vICAgID0gczg8a2lsbD4KKyAgICAgIC8vIC4uLgorICAgICAgLy8gICAgPSBkNCAgPGF2b2lkaW5nIHJlbG9hZD4KKyAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlNSID0gVFJJLT5nZXRTdWJSZWdpc3RlcnMoUmVnKTsgKlNSOyArK1NSKSB7CisgICAgICAgIHVuc2lnbmVkIFNSZWcgPSAqU1I7CisgICAgICAgIGlmIChSZWdLaWxsc1tTUmVnXSAmJiBLaWxsT3BzW1NSZWddLT5nZXRQYXJlbnQoKSAhPSAmTUkpIHsKKyAgICAgICAgICBLaWxsT3BzW1NSZWddLT5zZXRJc0tpbGwoZmFsc2UpOworICAgICAgICAgIHVuc2lnbmVkIEtSZWcgPSBLaWxsT3BzW1NSZWddLT5nZXRSZWcoKTsKKyAgICAgICAgICBLaWxsT3BzW0tSZWddID0gTlVMTDsKKyAgICAgICAgICBSZWdLaWxscy5yZXNldChLUmVnKTsKKworICAgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlNTUiA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKEtSZWcpOyAqU1NSOyArK1NTUikgeworICAgICAgICAgICAgS2lsbE9wc1sqU1NSXSA9IE5VTEw7CisgICAgICAgICAgICBSZWdLaWxscy5yZXNldCgqU1NSKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTU8uaXNLaWxsKCkpIHsKKyAgICAgIFJlZ0tpbGxzLnNldChSZWcpOworICAgICAgS2lsbE9wc1tSZWddID0gJk1POworICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU1IgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhSZWcpOyAqU1I7ICsrU1IpIHsKKyAgICAgICAgUmVnS2lsbHMuc2V0KCpTUik7CisgICAgICAgIEtpbGxPcHNbKlNSXSA9ICZNTzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uZ2V0UmVnKCkgfHwgIU1PLmlzRGVmKCkpCisgICAgICBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICBSZWdLaWxscy5yZXNldChSZWcpOworICAgIEtpbGxPcHNbUmVnXSA9IE5VTEw7CisgICAgLy8gSXQgYWxzbyBkZWZpbmVzIChvciBwYXJ0aWFsbHkgZGVmaW5lKSBhbGlhc2VzLgorICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlNSID0gVFJJLT5nZXRTdWJSZWdpc3RlcnMoUmVnKTsgKlNSOyArK1NSKSB7CisgICAgICBSZWdLaWxscy5yZXNldCgqU1IpOworICAgICAgS2lsbE9wc1sqU1JdID0gTlVMTDsKKyAgICB9CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU1IgPSBUUkktPmdldFN1cGVyUmVnaXN0ZXJzKFJlZyk7ICpTUjsgKytTUikgeworICAgICAgUmVnS2lsbHMucmVzZXQoKlNSKTsKKyAgICAgIEtpbGxPcHNbKlNSXSA9IE5VTEw7CisgICAgfQorICB9Cit9CisKKy8vLyBSZU1hdGVyaWFsaXplIC0gUmUtbWF0ZXJpYWxpemUgZGVmaW5pdGlvbiBmb3IgUmVnIHRhcmdldHRpbmcgRGVzdFJlZy4KKy8vLworc3RhdGljIHZvaWQgUmVNYXRlcmlhbGl6ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1JSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnRSZWdNYXAgJlZSTSkgeworICBNYWNoaW5lSW5zdHIgKlJlTWF0RGVmTUkgPSBWUk0uZ2V0UmVNYXRlcmlhbGl6ZWRNSShSZWcpOworI2lmbmRlZiBOREVCVUcKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBSZU1hdERlZk1JLT5nZXREZXNjKCk7CisgIGFzc2VydChUSUQuZ2V0TnVtRGVmcygpID09IDEgJiYKKyAgICAgICAgICJEb24ndCBrbm93IGhvdyB0byByZW1hdCBpbnN0cnVjdGlvbnMgdGhhdCBkZWZpbmUgPiAxIHZhbHVlcyEiKTsKKyNlbmRpZgorICBUSUktPnJlTWF0ZXJpYWxpemUoTUJCLCBNSUksIERlc3RSZWcsIDAsIFJlTWF0RGVmTUksICpUUkkpOworICBNYWNoaW5lSW5zdHIgKk5ld01JID0gcHJpb3IoTUlJKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5ld01JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE5ld01JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSB8fCBNTy5nZXRSZWcoKSA9PSAwKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgVmlydFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihWaXJ0UmVnKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGFzc2VydChNTy5pc1VzZSgpKTsKKyAgICB1bnNpZ25lZCBQaHlzID0gVlJNLmdldFBoeXMoVmlydFJlZyk7CisgICAgYXNzZXJ0KFBoeXMgJiYgIlZpcnR1YWwgcmVnaXN0ZXIgaXMgbm90IGFzc2lnbmVkIGEgcmVnaXN0ZXI/Iik7CisgICAgc3Vic3RpdHV0ZVBoeXNSZWcoTU8sIFBoeXMsICpUUkkpOworICB9CisgICsrTnVtUmVNYXRzOworfQorCisvLy8gZmluZFN1cGVyUmVnIC0gRmluZCB0aGUgU3ViUmVnJ3Mgc3VwZXItcmVnaXN0ZXIgb2YgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MKKy8vLyB3aGVyZSBpdHMgU3ViSWR4IHN1Yi1yZWdpc3RlciBpcyBTdWJSZWcuCitzdGF0aWMgdW5zaWduZWQgZmluZFN1cGVyUmVnKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLCB1bnNpZ25lZCBTdWJSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YklkeCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIHsKKyAgZm9yIChUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvciBJID0gUkMtPmJlZ2luKCksIEUgPSBSQy0+ZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSAqSTsKKyAgICBpZiAoVFJJLT5nZXRTdWJSZWcoUmVnLCBTdWJJZHgpID09IFN1YlJlZykKKyAgICAgIHJldHVybiBSZWc7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisvLyBBdmFpbGFibGUgU3BpbGxzIEltcGxlbWVudGF0aW9uICAvLworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KKworLy8vIGRpc2FsbG93Q2xvYmJlclBoeXNSZWdPbmx5IC0gVW5zZXQgdGhlIENhbkNsb2JiZXIgYml0IG9mIHRoZSBzcGVjaWZpZWQKKy8vLyBzdGFja3Nsb3QgcmVnaXN0ZXIuIFRoZSByZWdpc3RlciBpcyBzdGlsbCBhdmFpbGFibGUgYnV0IGlzIG5vIGxvbmdlcgorLy8vIGFsbG93ZWQgdG8gYmUgbW9kaWZlZC4KK3ZvaWQgQXZhaWxhYmxlU3BpbGxzOjpkaXNhbGxvd0Nsb2JiZXJQaHlzUmVnT25seSh1bnNpZ25lZCBQaHlzUmVnKSB7CisgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIGludD46Oml0ZXJhdG9yIEkgPQorICAgIFBoeXNSZWdzQXZhaWxhYmxlLmxvd2VyX2JvdW5kKFBoeXNSZWcpOworICB3aGlsZSAoSSAhPSBQaHlzUmVnc0F2YWlsYWJsZS5lbmQoKSAmJiBJLT5maXJzdCA9PSBQaHlzUmVnKSB7CisgICAgaW50IFNsb3RPclJlTWF0ID0gSS0+c2Vjb25kOworICAgIEkrKzsKKyAgICBhc3NlcnQoKFNwaWxsU2xvdHNPclJlTWF0c0F2YWlsYWJsZVtTbG90T3JSZU1hdF0gPj4gMSkgPT0gUGh5c1JlZyAmJgorICAgICAgICAgICAiQmlkaXJlY3Rpb25hbCBtYXAgbWlzbWF0Y2ghIik7CisgICAgU3BpbGxTbG90c09yUmVNYXRzQXZhaWxhYmxlW1Nsb3RPclJlTWF0XSAmPSB+MTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlBoeXNSZWcgIiA8PCBUUkktPmdldE5hbWUoUGh5c1JlZykKKyAgICAgICAgIDw8ICIgY29waWVkLCBpdCBpcyBhdmFpbGFibGUgZm9yIHVzZSBidXQgY2FuIG5vIGxvbmdlciBiZSBtb2RpZmllZFxuIik7CisgIH0KK30KKworLy8vIGRpc2FsbG93Q2xvYmJlclBoeXNSZWcgLSBVbnNldCB0aGUgQ2FuQ2xvYmJlciBiaXQgb2YgdGhlIHNwZWNpZmllZAorLy8vIHN0YWNrc2xvdCByZWdpc3RlciBhbmQgaXRzIGFsaWFzZXMuIFRoZSByZWdpc3RlciBhbmQgaXRzIGFsaWFzZXMgbWF5CisvLy8gc3RpbGwgYXZhaWxhYmxlIGJ1dCBpcyBubyBsb25nZXIgYWxsb3dlZCB0byBiZSBtb2RpZmVkLgordm9pZCBBdmFpbGFibGVTcGlsbHM6OmRpc2FsbG93Q2xvYmJlclBoeXNSZWcodW5zaWduZWQgUGh5c1JlZykgeworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBUyA9IFRSSS0+Z2V0QWxpYXNTZXQoUGh5c1JlZyk7ICpBUzsgKytBUykKKyAgICBkaXNhbGxvd0Nsb2JiZXJQaHlzUmVnT25seSgqQVMpOworICBkaXNhbGxvd0Nsb2JiZXJQaHlzUmVnT25seShQaHlzUmVnKTsKK30KKworLy8vIENsb2JiZXJQaHlzUmVnT25seSAtIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHNwZWNpZmllZCBwaHlzcmVnIGNoYW5nZXMKKy8vLyB2YWx1ZS4gIFdlIHVzZSB0aGlzIHRvIGludmFsaWRhdGUgYW55IGluZm8gYWJvdXQgc3R1ZmYgd2UgdGhpbmcgbGl2ZXMgaW4gaXQuCit2b2lkIEF2YWlsYWJsZVNwaWxsczo6Q2xvYmJlclBoeXNSZWdPbmx5KHVuc2lnbmVkIFBoeXNSZWcpIHsKKyAgc3RkOjptdWx0aW1hcDx1bnNpZ25lZCwgaW50Pjo6aXRlcmF0b3IgSSA9CisgICAgUGh5c1JlZ3NBdmFpbGFibGUubG93ZXJfYm91bmQoUGh5c1JlZyk7CisgIHdoaWxlIChJICE9IFBoeXNSZWdzQXZhaWxhYmxlLmVuZCgpICYmIEktPmZpcnN0ID09IFBoeXNSZWcpIHsKKyAgICBpbnQgU2xvdE9yUmVNYXQgPSBJLT5zZWNvbmQ7CisgICAgUGh5c1JlZ3NBdmFpbGFibGUuZXJhc2UoSSsrKTsKKyAgICBhc3NlcnQoKFNwaWxsU2xvdHNPclJlTWF0c0F2YWlsYWJsZVtTbG90T3JSZU1hdF0gPj4gMSkgPT0gUGh5c1JlZyAmJgorICAgICAgICAgICAiQmlkaXJlY3Rpb25hbCBtYXAgbWlzbWF0Y2ghIik7CisgICAgU3BpbGxTbG90c09yUmVNYXRzQXZhaWxhYmxlLmVyYXNlKFNsb3RPclJlTWF0KTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlBoeXNSZWcgIiA8PCBUUkktPmdldE5hbWUoUGh5c1JlZykKKyAgICAgICAgICA8PCAiIGNsb2JiZXJlZCwgaW52YWxpZGF0aW5nICIpOworICAgIGlmIChTbG90T3JSZU1hdCA+IFZpcnRSZWdNYXA6Ok1BWF9TVEFDS19TTE9UKQorICAgICAgREVCVUcoZGJncygpIDw8ICJSTSMiIDw8IFNsb3RPclJlTWF0LVZpcnRSZWdNYXA6Ok1BWF9TVEFDS19TTE9ULTEgPDwiXG4iKTsKKyAgICBlbHNlCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlNTIyIgPDwgU2xvdE9yUmVNYXQgPDwgIlxuIik7CisgIH0KK30KKworLy8vIENsb2JiZXJQaHlzUmVnIC0gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHBoeXNyZWcgY2hhbmdlcworLy8vIHZhbHVlLiAgV2UgdXNlIHRoaXMgdG8gaW52YWxpZGF0ZSBhbnkgaW5mbyBhYm91dCBzdHVmZiB3ZSB0aGluZyBsaXZlcyBpbgorLy8vIGl0IGFuZCBhbnkgb2YgaXRzIGFsaWFzZXMuCit2b2lkIEF2YWlsYWJsZVNwaWxsczo6Q2xvYmJlclBoeXNSZWcodW5zaWduZWQgUGh5c1JlZykgeworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpBUyA9IFRSSS0+Z2V0QWxpYXNTZXQoUGh5c1JlZyk7ICpBUzsgKytBUykKKyAgICBDbG9iYmVyUGh5c1JlZ09ubHkoKkFTKTsKKyAgQ2xvYmJlclBoeXNSZWdPbmx5KFBoeXNSZWcpOworfQorCisvLy8gQWRkQXZhaWxhYmxlUmVnc1RvTGl2ZUluIC0gQXZhaWxhYmlsaXR5IGluZm9ybWF0aW9uIGlzIGJlaW5nIGtlcHQgY29taW5nCisvLy8gaW50byB0aGUgc3BlY2lmaWVkIE1CQi4gQWRkIGF2YWlsYWJsZSBwaHlzaWNhbCByZWdpc3RlcnMgYXMgcG90ZW50aWFsCisvLy8gbGl2ZS1pbidzLiBJZiB0aGV5IGFyZSByZXVzZWQgaW4gdGhlIE1CQiwgdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZQorLy8vIGxpdmUtaW4gc2V0IHRvIG1ha2UgcmVnaXN0ZXIgc2NhdmVuZ2VyIGFuZCBwb3N0LWFsbG9jYXRpb24gc2NoZWR1bGVyLgordm9pZCBBdmFpbGFibGVTcGlsbHM6OkFkZEF2YWlsYWJsZVJlZ3NUb0xpdmVJbihNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmUmVnS2lsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcykgeworICBzdGQ6OnNldDx1bnNpZ25lZD4gTm90QXZhaWxhYmxlOworICBmb3IgKHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIGludD46Oml0ZXJhdG9yCisgICAgICAgICBJID0gUGh5c1JlZ3NBdmFpbGFibGUuYmVnaW4oKSwgRSA9IFBoeXNSZWdzQXZhaWxhYmxlLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgdW5zaWduZWQgUmVnID0gSS0+Zmlyc3Q7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogUkMgPSBUUkktPmdldE1pbmltYWxQaHlzUmVnQ2xhc3MoUmVnKTsKKyAgICAvLyBGSVhNRTogQSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZC4gV2UgY2FuJ3QgcmV1c2UgYXZhaWxhYmxlIHZhbHVlIGlmIGl0J3MKKyAgICAvLyBub3Qgc2FmZSB0byBtb3ZlIHRoZSBkZWYgb2YgdGhlIHZpcnR1YWwgcmVnaXN0ZXIncyBjbGFzcy4gZS5nLgorICAgIC8vIFg4Njo6UkZQKiByZWdpc3RlciBjbGFzc2VzLiBEbyBub3QgYWRkIGl0IGFzIGEgbGl2ZS1pbi4KKyAgICBpZiAoIVRJSS0+aXNTYWZlVG9Nb3ZlUmVnQ2xhc3NEZWZzKFJDKSkKKyAgICAgIC8vIFRoaXMgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KKyAgICAgIE5vdEF2YWlsYWJsZS5pbnNlcnQoUmVnKTsKKyAgICBlbHNlIHsKKyAgICAgIE1CQi5hZGRMaXZlSW4oUmVnKTsKKyAgICAgIEludmFsaWRhdGVLaWxsKFJlZywgVFJJLCBSZWdLaWxscywgS2lsbE9wcyk7CisgICAgfQorCisgICAgLy8gU2tpcCBvdmVyIHRoZSBzYW1lIHJlZ2lzdGVyLgorICAgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIGludD46Oml0ZXJhdG9yIE5JID0gbGx2bTo6bmV4dChJKTsKKyAgICB3aGlsZSAoTkkgIT0gRSAmJiBOSS0+Zmlyc3QgPT0gUmVnKSB7CisgICAgICArK0k7CisgICAgICArK05JOworICAgIH0KKyAgfQorCisgIGZvciAoc3RkOjpzZXQ8dW5zaWduZWQ+OjppdGVyYXRvciBJID0gTm90QXZhaWxhYmxlLmJlZ2luKCksCisgICAgICAgICBFID0gTm90QXZhaWxhYmxlLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIENsb2JiZXJQaHlzUmVnKCpJKTsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICpTdWJSZWdzID0gVFJJLT5nZXRTdWJSZWdpc3RlcnMoKkkpOworICAgICAgICpTdWJSZWdzOyArK1N1YlJlZ3MpCisgICAgICBDbG9iYmVyUGh5c1JlZygqU3ViUmVncyk7CisgIH0KK30KKworLy8vIE1vZGlmeVN0YWNrU2xvdE9yUmVNYXQgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgaW4gYSBzdGFjaworLy8vIHNsb3QgY2hhbmdlcy4gIFRoaXMgcmVtb3ZlcyBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCByZWdpc3RlciB0aGUgcHJldmlvdXMKKy8vLyB2YWx1ZSBmb3IgdGhpcyBzbG90IGxpdmVzIGluIChhcyB0aGUgcHJldmlvdXMgdmFsdWUgaXMgZGVhZCBub3cpLgordm9pZCBBdmFpbGFibGVTcGlsbHM6Ok1vZGlmeVN0YWNrU2xvdE9yUmVNYXQoaW50IFNsb3RPclJlTWF0KSB7CisgIHN0ZDo6bWFwPGludCwgdW5zaWduZWQ+OjppdGVyYXRvciBJdCA9CisgICAgU3BpbGxTbG90c09yUmVNYXRzQXZhaWxhYmxlLmZpbmQoU2xvdE9yUmVNYXQpOworICBpZiAoSXQgPT0gU3BpbGxTbG90c09yUmVNYXRzQXZhaWxhYmxlLmVuZCgpKSByZXR1cm47CisgIHVuc2lnbmVkIFJlZyA9IEl0LT5zZWNvbmQgPj4gMTsKKyAgU3BpbGxTbG90c09yUmVNYXRzQXZhaWxhYmxlLmVyYXNlKEl0KTsKKworICAvLyBUaGlzIHJlZ2lzdGVyIG1heSBob2xkIHRoZSB2YWx1ZSBvZiBtdWx0aXBsZSBzdGFjayBzbG90cywgb25seSByZW1vdmUgdGhpcworICAvLyBzdGFjayBzbG90IGZyb20gdGhlIHNldCBvZiB2YWx1ZXMgdGhlIHJlZ2lzdGVyIGNvbnRhaW5zLgorICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBpbnQ+OjppdGVyYXRvciBJID0gUGh5c1JlZ3NBdmFpbGFibGUubG93ZXJfYm91bmQoUmVnKTsKKyAgZm9yICg7IDsgKytJKSB7CisgICAgYXNzZXJ0KEkgIT0gUGh5c1JlZ3NBdmFpbGFibGUuZW5kKCkgJiYgSS0+Zmlyc3QgPT0gUmVnICYmCisgICAgICAgICAgICJNYXAgaW52ZXJzZSBicm9rZW4hIik7CisgICAgaWYgKEktPnNlY29uZCA9PSBTbG90T3JSZU1hdCkgYnJlYWs7CisgIH0KKyAgUGh5c1JlZ3NBdmFpbGFibGUuZXJhc2UoSSk7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisvLyBSZXVzZSBJbmZvIEltcGxlbWVudGF0aW9uICAvLworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KKworLy8vIEdldFJlZ0ZvclJlbG9hZCAtIFdlIGFyZSBhYm91dCB0byBlbWl0IGEgcmVsb2FkIGludG8gUGh5c1JlZy4gIElmIHRoZXJlCisvLy8gaXMgc29tZSBvdGhlciBvcGVyYW5kIHRoYXQgaXMgdXNpbmcgdGhlIHNwZWNpZmllZCByZWdpc3RlciwgZWl0aGVyIHBpY2sKKy8vLyBhIG5ldyByZWdpc3RlciB0byB1c2UsIG9yIGV2aWN0IHRoZSBwcmV2aW91cyByZWxvYWQgYW5kIHVzZSB0aGlzIHJlZy4KK3Vuc2lnbmVkIFJldXNlSW5mbzo6R2V0UmVnRm9yUmVsb2FkKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBoeXNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk1JLCBBdmFpbGFibGVTcGlsbHMgJlNwaWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPiAmTWF5YmVEZWFkU3RvcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0PHVuc2lnbmVkLCA4PiAmUmVqZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQml0VmVjdG9yICZSZWdLaWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lT3BlcmFuZCo+ICZLaWxsT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnRSZWdNYXAgJlZSTSkgeworICBjb25zdCBUYXJnZXRJbnN0ckluZm8qIFRJSSA9IE1GLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IFNwaWxscy5nZXRSZWdJbmZvKCk7CisKKyAgaWYgKFJldXNlcy5lbXB0eSgpKSByZXR1cm4gUGh5c1JlZzsgIC8vIFRoaXMgaXMgbW9zdCBvZnRlbiBlbXB0eS4KKworICBmb3IgKHVuc2lnbmVkIHJvID0gMCwgZSA9IFJldXNlcy5zaXplKCk7IHJvICE9IGU7ICsrcm8pIHsKKyAgICBSZXVzZWRPcCAmT3AgPSBSZXVzZXNbcm9dOworICAgIC8vIElmIHdlIGZpbmQgc29tZSBvdGhlciByZXVzZSB0aGF0IHdhcyBzdXBwb3NlZCB0byB1c2UgdGhpcyByZWdpc3RlcgorICAgIC8vIGV4YWN0bHkgZm9yIGl0cyByZWxvYWQsIHdlIGNhbiBjaGFuZ2UgdGhpcyByZWxvYWQgdG8gdXNlIElUUyByZWxvYWQKKyAgICAvLyByZWdpc3Rlci4gVGhhdCBpcywgdW5sZXNzIGl0cyByZWxvYWQgcmVnaXN0ZXIgaGFzIGFscmVhZHkgYmVlbgorICAgIC8vIGNvbnNpZGVyZWQgYW5kIHN1YnNlcXVlbnRseSByZWplY3RlZCBiZWNhdXNlIGl0IGhhcyBhbHNvIGJlZW4gcmV1c2VkCisgICAgLy8gYnkgYW5vdGhlciBvcGVyYW5kLgorICAgIGlmIChPcC5QaHlzUmVnUmV1c2VkID09IFBoeXNSZWcgJiYKKyAgICAgICAgUmVqZWN0ZWQuY291bnQoT3AuQXNzaWduZWRQaHlzUmVnKSA9PSAwICYmCisgICAgICAgIFJDLT5jb250YWlucyhPcC5Bc3NpZ25lZFBoeXNSZWcpKSB7CisgICAgICAvLyBZdXAsIHVzZSB0aGUgcmVsb2FkIHJlZ2lzdGVyIHRoYXQgd2UgZGlkbid0IHVzZSBiZWZvcmUuCisgICAgICB1bnNpZ25lZCBOZXdSZWcgPSBPcC5Bc3NpZ25lZFBoeXNSZWc7CisgICAgICBSZWplY3RlZC5pbnNlcnQoUGh5c1JlZyk7CisgICAgICByZXR1cm4gR2V0UmVnRm9yUmVsb2FkKFJDLCBOZXdSZWcsIE1GLCBNSSwgU3BpbGxzLCBNYXliZURlYWRTdG9yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlamVjdGVkLCBSZWdLaWxscywgS2lsbE9wcywgVlJNKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBtaWdodCBhbHNvIGhhdmUgYSBwcm9ibGVtIGlmIGEgcHJldmlvdXNseSByZXVzZWQKKyAgICAgIC8vIHZhbHVlIGFsaWFzZXMgdGhlIG5ldyByZWdpc3Rlci4gSWYgc28sIGNvZGVnZW4gdGhlIHByZXZpb3VzIHJlbG9hZAorICAgICAgLy8gYW5kIHVzZSB0aGlzIG9uZS4KKyAgICAgIHVuc2lnbmVkIFBSUlUgPSBPcC5QaHlzUmVnUmV1c2VkOworICAgICAgaWYgKFRSSS0+cmVnc092ZXJsYXAoUFJSVSwgUGh5c1JlZykpIHsKKyAgICAgICAgLy8gT2theSwgd2UgZm91bmQgb3V0IHRoYXQgYW4gYWxpYXMgb2YgYSByZXVzZWQgcmVnaXN0ZXIKKyAgICAgICAgLy8gd2FzIHVzZWQuICBUaGlzIGlzbid0IGdvb2QgYmVjYXVzZSBpdCBtZWFucyB3ZSBoYXZlCisgICAgICAgIC8vIHRvIHVuZG8gYSBwcmV2aW91cyByZXVzZS4KKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1JLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQWxpYXNSQyA9CisgICAgICAgICAgTUJCLT5nZXRQYXJlbnQoKS0+Z2V0UmVnSW5mbygpLmdldFJlZ0NsYXNzKE9wLlZpcnRSZWcpOworCisgICAgICAgIC8vIENvcHkgT3Agb3V0IG9mIHRoZSB2ZWN0b3IgYW5kIHJlbW92ZSBpdCwgd2UncmUgZ29pbmcgdG8gaW5zZXJ0IGFuCisgICAgICAgIC8vIGV4cGxpY2l0IGxvYWQgZm9yIGl0LgorICAgICAgICBSZXVzZWRPcCBOZXdPcCA9IE9wOworICAgICAgICBSZXVzZXMuZXJhc2UoUmV1c2VzLmJlZ2luKCkrcm8pOworCisgICAgICAgIC8vIE1JIG1heSBiZSB1c2luZyBvbmx5IGEgc3ViLXJlZ2lzdGVyIG9mIFBoeXNSZWdVc2VkLgorICAgICAgICB1bnNpZ25lZCBSZWFsUGh5c1JlZ1VzZWQgPSBNSS0+Z2V0T3BlcmFuZChOZXdPcC5PcGVyYW5kKS5nZXRSZWcoKTsKKyAgICAgICAgdW5zaWduZWQgU3ViSWR4ID0gMDsKKyAgICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlYWxQaHlzUmVnVXNlZCkgJiYKKyAgICAgICAgICAgICAgICJBIHJldXNlIGNhbm5vdCBiZSBhIHZpcnR1YWwgcmVnaXN0ZXIiKTsKKyAgICAgICAgaWYgKFBSUlUgIT0gUmVhbFBoeXNSZWdVc2VkKSB7CisgICAgICAgICAgLy8gV2hhdCB3YXMgdGhlIHN1Yi1yZWdpc3RlciBpbmRleD8KKyAgICAgICAgICBTdWJJZHggPSBUUkktPmdldFN1YlJlZ0luZGV4KFBSUlUsIFJlYWxQaHlzUmVnVXNlZCk7CisgICAgICAgICAgYXNzZXJ0KFN1YklkeCAmJgorICAgICAgICAgICAgICAgICAiT3BlcmFuZCBwaHlzcmVnIGlzIG5vdCBhIHN1Yi1yZWdpc3RlciBvZiBQaHlzUmVnVXNlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT2ssIHdlJ3JlIGdvaW5nIHRvIHRyeSB0byByZWxvYWQgdGhlIGFzc2lnbmVkIHBoeXNyZWcgaW50byB0aGUKKyAgICAgICAgLy8gc2xvdCB0aGF0IHdlIHdlcmUgc3VwcG9zZWQgdG8gaW4gdGhlIGZpcnN0IHBsYWNlLiAgSG93ZXZlciwgdGhhdAorICAgICAgICAvLyByZWdpc3RlciBjb3VsZCBob2xkIGEgcmV1c2UuICBDaGVjayB0byBzZWUgaWYgaXQgY29uZmxpY3RzIG9yCisgICAgICAgIC8vIHdvdWxkIHByZWZlciB1cyB0byB1c2UgYSBkaWZmZXJlbnQgcmVnaXN0ZXIuCisgICAgICAgIHVuc2lnbmVkIE5ld1BoeXNSZWcgPSBHZXRSZWdGb3JSZWxvYWQoUkMsIE5ld09wLkFzc2lnbmVkUGh5c1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRiwgTUksIFNwaWxscywgTWF5YmVEZWFkU3RvcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlamVjdGVkLCBSZWdLaWxscywgS2lsbE9wcywgVlJNKTsKKworICAgICAgICBib29sIERvUmVNYXQgPSBOZXdPcC5TdGFja1Nsb3RPclJlTWF0ID4gVmlydFJlZ01hcDo6TUFYX1NUQUNLX1NMT1Q7CisgICAgICAgIGludCBTU29yUk1JZCA9IERvUmVNYXQKKyAgICAgICAgICA/IFZSTS5nZXRSZU1hdElkKE5ld09wLlZpcnRSZWcpIDogKGludCkgTmV3T3AuU3RhY2tTbG90T3JSZU1hdDsKKworICAgICAgICAvLyBCYWNrLXNjaGVkdWxlIHJlbG9hZHMgYW5kIHJlbWF0cy4KKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydExvYyA9CisgICAgICAgICAgQ29tcHV0ZVJlbG9hZExvYyhNSSwgTUJCLT5iZWdpbigpLCBQaHlzUmVnLCBUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEb1JlTWF0LCBTU29yUk1JZCwgVElJLCBNRik7CisKKyAgICAgICAgaWYgKERvUmVNYXQpIHsKKyAgICAgICAgICBSZU1hdGVyaWFsaXplKCpNQkIsIEluc2VydExvYywgTmV3UGh5c1JlZywgTmV3T3AuVmlydFJlZywgVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgVFJJLCBWUk0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFRJSS0+bG9hZFJlZ0Zyb21TdGFja1Nsb3QoKk1CQiwgSW5zZXJ0TG9jLCBOZXdQaHlzUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3T3AuU3RhY2tTbG90T3JSZU1hdCwgQWxpYXNSQywgVFJJKTsKKyAgICAgICAgICBNYWNoaW5lSW5zdHIgKkxvYWRNSSA9IHByaW9yKEluc2VydExvYyk7CisgICAgICAgICAgVlJNLmFkZFNwaWxsU2xvdFVzZShOZXdPcC5TdGFja1Nsb3RPclJlTWF0LCBMb2FkTUkpOworICAgICAgICAgIC8vIEFueSBzdG9yZXMgdG8gdGhpcyBzdGFjayBzbG90IGFyZSBub3QgZGVhZCBhbnltb3JlLgorICAgICAgICAgIE1heWJlRGVhZFN0b3Jlc1tOZXdPcC5TdGFja1Nsb3RPclJlTWF0XSA9IE5VTEw7CisgICAgICAgICAgKytOdW1Mb2FkczsKKyAgICAgICAgfQorICAgICAgICBTcGlsbHMuQ2xvYmJlclBoeXNSZWcoTmV3UGh5c1JlZyk7CisgICAgICAgIFNwaWxscy5DbG9iYmVyUGh5c1JlZyhOZXdPcC5QaHlzUmVnUmV1c2VkKTsKKworICAgICAgICB1bnNpZ25lZCBSUmVnID0gU3ViSWR4ID8gVFJJLT5nZXRTdWJSZWcoTmV3UGh5c1JlZywgU3ViSWR4KSA6TmV3UGh5c1JlZzsKKyAgICAgICAgTUktPmdldE9wZXJhbmQoTmV3T3AuT3BlcmFuZCkuc2V0UmVnKFJSZWcpOworICAgICAgICBNSS0+Z2V0T3BlcmFuZChOZXdPcC5PcGVyYW5kKS5zZXRTdWJSZWcoMCk7CisKKyAgICAgICAgU3BpbGxzLmFkZEF2YWlsYWJsZShOZXdPcC5TdGFja1Nsb3RPclJlTWF0LCBOZXdQaHlzUmVnKTsKKyAgICAgICAgVXBkYXRlS2lsbHMoKnByaW9yKEluc2VydExvYyksIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgJ1x0JyA8PCAqcHJpb3IoSW5zZXJ0TG9jKSk7CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJSZXVzZSB1bmRvbmUhXG4iKTsKKyAgICAgICAgLS1OdW1SZXVzZWQ7CisKKyAgICAgICAgLy8gRmluYWxseSwgUGh5c1JlZyBpcyBub3cgYXZhaWxhYmxlLCBnbyBhaGVhZCBhbmQgdXNlIGl0LgorICAgICAgICByZXR1cm4gUGh5c1JlZzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFBoeXNSZWc7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLworCisvLy8gRm9sZHNTdGFja1Nsb3RNb2RSZWYgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIE1JIGZvbGRzIHRoZSBzcGVjaWZpZWQKKy8vLyBzdGFjayBzbG90IG1vZC9yZWYuIEl0IGFsc28gY2hlY2tzIGlmIGl0J3MgcG9zc2libGUgdG8gdW5mb2xkIHRoZQorLy8vIGluc3RydWN0aW9uIGJ5IGhhdmluZyBpdCBkZWZpbmUgYSBzcGVjaWZpZWQgcGh5c2ljYWwgcmVnaXN0ZXIgaW5zdGVhZC4KK3N0YXRpYyBib29sIEZvbGRzU3RhY2tTbG90TW9kUmVmKE1hY2hpbmVJbnN0ciAmTUksIGludCBTUywgdW5zaWduZWQgUGh5c1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0UmVnTWFwICZWUk0pIHsKKyAgaWYgKFZSTS5oYXNFbWVyZ2VuY3lTcGlsbHMoJk1JKSB8fCBWUk0uaXNTcGlsbFB0KCZNSSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgRm91bmQgPSBmYWxzZTsKKyAgVmlydFJlZ01hcDo6TUkyVmlydE1hcFR5Ojpjb25zdF9pdGVyYXRvciBJLCBFbmQ7CisgIGZvciAodGllKEksIEVuZCkgPSBWUk0uZ2V0Rm9sZGVkVmlydHMoJk1JKTsgSSAhPSBFbmQ7ICsrSSkgeworICAgIHVuc2lnbmVkIFZpcnRSZWcgPSBJLT5zZWNvbmQuZmlyc3Q7CisgICAgVmlydFJlZ01hcDo6TW9kUmVmIE1SID0gSS0+c2Vjb25kLnNlY29uZDsKKyAgICBpZiAoTVIgJiBWaXJ0UmVnTWFwOjppc01vZFJlZikKKyAgICAgIGlmIChWUk0uZ2V0U3RhY2tTbG90KFZpcnRSZWcpID09IFNTKSB7CisgICAgICAgIEZvdW5kPSBUSUktPmdldE9wY29kZUFmdGVyTWVtb3J5VW5mb2xkKE1JLmdldE9wY29kZSgpLCB0cnVlLCB0cnVlKSAhPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfQorICBpZiAoIUZvdW5kKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBEb2VzIHRoZSBpbnN0cnVjdGlvbiB1c2VzIGEgcmVnaXN0ZXIgdGhhdCBvdmVybGFwcyB0aGUgc2NyYXRjaCByZWdpc3Rlcj8KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgTU8uZ2V0UmVnKCkgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZykpIHsKKyAgICAgIGlmICghVlJNLmhhc1BoeXMoUmVnKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBSZWcgPSBWUk0uZ2V0UGh5cyhSZWcpOworICAgIH0KKyAgICBpZiAoVFJJLT5yZWdzT3ZlcmxhcChQaHlzUmVnLCBSZWcpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gRmluZEZyZWVSZWdpc3RlciAtIEZpbmQgYSBmcmVlIHJlZ2lzdGVyIG9mIGEgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MgYnkgbG9va2luZworLy8vIGF0IChhdCBtb3N0KSB0aGUgbGFzdCB0d28gbWFjaGluZSBpbnN0cnVjdGlvbnMuCitzdGF0aWMgdW5zaWduZWQgRmluZEZyZWVSZWdpc3RlcihNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUlJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJkFsbG9jYXRhYmxlUmVncykgeworICBCaXRWZWN0b3IgRGVmcyhUUkktPmdldE51bVJlZ3MoKSk7CisgIEJpdFZlY3RvciBVc2VzKFRSSS0+Z2V0TnVtUmVncygpKTsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IExvY2FsVXNlczsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IEtpbGxzOworCisgIC8vIFRha2UgYSBsb29rIGF0IDIgaW5zdHJ1Y3Rpb25zIGF0IG1vc3QuCisgIHVuc2lnbmVkIENvdW50ID0gMDsKKyAgd2hpbGUgKENvdW50IDwgMikgeworICAgIGlmIChNSUkgPT0gTUJCLmJlZ2luKCkpCisgICAgICBicmVhazsKKyAgICBNYWNoaW5lSW5zdHIgKlByZXZNSSA9IHByaW9yKE1JSSk7CisgICAgTUlJID0gUHJldk1JOworCisgICAgaWYgKFByZXZNSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICBjb250aW51ZTsgLy8gU2tpcCBvdmVyIGRiZ192YWx1ZSBpbnN0cnVjdGlvbnMuCisgICAgKytDb3VudDsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcmV2TUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBQcmV2TUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwgTU8uZ2V0UmVnKCkgPT0gMCkKKyAgICAgICAgY29udGludWU7CisgICAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgIGlmIChNTy5pc0RlZigpKSB7CisgICAgICAgIERlZnMuc2V0KFJlZyk7CisgICAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFTID0gVFJJLT5nZXRBbGlhc1NldChSZWcpOyAqQVM7ICsrQVMpCisgICAgICAgICAgRGVmcy5zZXQoKkFTKTsKKyAgICAgIH0gZWxzZSAgeworICAgICAgICBMb2NhbFVzZXMucHVzaF9iYWNrKFJlZyk7CisgICAgICAgIGlmIChNTy5pc0tpbGwoKSAmJiBBbGxvY2F0YWJsZVJlZ3NbUmVnXSkKKyAgICAgICAgICBLaWxscy5wdXNoX2JhY2soUmVnKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gS2lsbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgdW5zaWduZWQgS2lsbCA9IEtpbGxzW2ldOworICAgICAgaWYgKCFEZWZzW0tpbGxdICYmICFVc2VzW0tpbGxdICYmCisgICAgICAgICAgUkMtPmNvbnRhaW5zKEtpbGwpKQorICAgICAgICByZXR1cm4gS2lsbDsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExvY2FsVXNlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSBMb2NhbFVzZXNbaV07CisgICAgICBVc2VzLnNldChSZWcpOworICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqQVMgPSBUUkktPmdldEFsaWFzU2V0KFJlZyk7ICpBUzsgKytBUykKKyAgICAgICAgVXNlcy5zZXQoKkFTKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljCit2b2lkIEFzc2lnblBoeXNUb1ZpcnRSZWcoTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgVmlydFJlZywgdW5zaWduZWQgUGh5c1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uZ2V0UmVnKCkgPT0gVmlydFJlZykKKyAgICAgIHN1YnN0aXR1dGVQaHlzUmVnKE1PLCBQaHlzUmVnLCBUUkkpOworICB9Cit9CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBSZWZTb3J0ZXIgeworICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPE1hY2hpbmVJbnN0ciosIGludD4gJkEsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnBhaXI8TWFjaGluZUluc3RyKiwgaW50PiAmQikgeworICAgIHJldHVybiBBLnNlY29uZCA8IEIuc2Vjb25kOworICB9Cit9OworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLworLy8gTG9jYWwgU3BpbGxlciBJbXBsZW1lbnRhdGlvbiAgLy8KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisKK2NsYXNzIExvY2FsUmV3cml0ZXIgOiBwdWJsaWMgVmlydFJlZ1Jld3JpdGVyIHsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgIFZpcnRSZWdNYXAgKlZSTTsKKyAgQml0VmVjdG9yIEFsbG9jYXRhYmxlUmVnczsKKyAgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+IERpc3RhbmNlTWFwOworICBEZW5zZU1hcDxpbnQsIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosND4gPiBTbG90MkRiZ1ZhbHVlczsKKworICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCOyAgICAgICAvLyBCYXNpYyBibG9jayBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLgorCitwdWJsaWM6CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GLCBWaXJ0UmVnTWFwICZWUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyogTElzKTsKKworcHJpdmF0ZToKKworICBib29sIE9wdGltaXplQnlVbmZvbGQyKHVuc2lnbmVkIFZpcnRSZWcsIGludCBTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1JSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPiAmTWF5YmVEZWFkU3RvcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVNwaWxscyAmU3BpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmUmVnS2lsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcyk7CisKKyAgYm9vbCBPcHRpbWl6ZUJ5VW5mb2xkKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUlJLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyKj4gJk1heWJlRGVhZFN0b3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVNwaWxscyAmU3BpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgQml0VmVjdG9yICZSZWdLaWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kKj4gJktpbGxPcHMpOworCisgIGJvb2wgQ29tbXV0ZVRvRm9sZFJlbG9hZChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1JSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZpcnRSZWcsIHVuc2lnbmVkIFNyY1JlZywgaW50IFNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlU3BpbGxzICZTcGlsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKKworICB2b2lkIFNwaWxsUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSWR4LCB1bnNpZ25lZCBQaHlzUmVnLCBpbnQgU3RhY2tTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQXZhaWxhYmxlLCBNYWNoaW5lSW5zdHIgKiZMYXN0U3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGVTcGlsbHMgJlNwaWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0PE1hY2hpbmVJbnN0ciosIDQ+ICZSZU1hdERlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcyk7CisKKyAgdm9pZCBUcmFuc2ZlckRlYWRuZXNzKHVuc2lnbmVkIFJlZywgQml0VmVjdG9yICZSZWdLaWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kKj4gJktpbGxPcHMpOworCisgIGJvb2wgSW5zZXJ0RW1lcmdlbmN5U3BpbGxzKE1hY2hpbmVJbnN0ciAqTUkpOworCisgIGJvb2wgSW5zZXJ0UmVzdG9yZXMoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGVTcGlsbHMgJlNwaWxscywKKyAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kKj4gJktpbGxPcHMpOworCisgIGJvb2wgSW5zZXJ0U3BpbGxzKE1hY2hpbmVJbnN0ciAqTUkpOworCisgIHZvaWQgUmV3cml0ZU1CQihMaXZlSW50ZXJ2YWxzICpMSXMsCisgICAgICAgICAgICAgICAgICBBdmFpbGFibGVTcGlsbHMgJlNwaWxscywgQml0VmVjdG9yICZSZWdLaWxscywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kKj4gJktpbGxPcHMpOworfTsKK30KKworYm9vbCBMb2NhbFJld3JpdGVyOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GLCBWaXJ0UmVnTWFwICZ2cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlcnZhbHMqIExJcykgeworICBNUkkgPSAmTUYuZ2V0UmVnSW5mbygpOworICBUUkkgPSBNRi5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKyAgVElJID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgIFZSTSA9ICZ2cm07CisgIEFsbG9jYXRhYmxlUmVncyA9IFRSSS0+Z2V0QWxsb2NhdGFibGVTZXQoTUYpOworICBERUJVRyhkYmdzKCkgPDwgIlxuKioqKiBMb2NhbCBzcGlsbGVyIHJld3JpdGluZyBmdW5jdGlvbiAnIgorICAgICAgICA8PCBNRi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkgPDwgIic6XG4iKTsKKyAgREVCVUcoZGJncygpIDw8ICIqKioqIE1hY2hpbmUgSW5zdHJzIChOT1RFISBEb2VzIG5vdCBpbmNsdWRlIHNwaWxscyBhbmQiCisgICAgICAgICIgcmVsb2FkcyEpICoqKipcbiIpOworICBERUJVRyhNRi5kdW1wKCkpOworCisgIC8vIFNwaWxscyAtIEtlZXAgdHJhY2sgb2Ygd2hpY2ggc3BpbGxlZCB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBpbiBwaHlzcmVncworICAvLyBzbyB0aGF0IHdlIGNhbiBjaG9vc2UgdG8gcmV1c2UgdGhlIHBoeXNyZWdzIGluc3RlYWQgb2YgZW1pdHRpbmcKKyAgLy8gcmVsb2Fkcy4gVGhpcyBpcyB1c3VhbGx5IHJlZnJlc2hlZCBwZXIgYmFzaWMgYmxvY2suCisgIEF2YWlsYWJsZVNwaWxscyBTcGlsbHMoVFJJLCBUSUkpOworCisgIC8vIEtlZXAgdHJhY2sgb2Yga2lsbCBpbmZvcm1hdGlvbi4KKyAgQml0VmVjdG9yIFJlZ0tpbGxzKFRSSS0+Z2V0TnVtUmVncygpKTsKKyAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiBLaWxsT3BzOworICBLaWxsT3BzLnJlc2l6ZShUUkktPmdldE51bVJlZ3MoKSwgTlVMTCk7CisKKyAgLy8gU2luZ2xlRW50cnlTdWNjcyAtIFN1Y2Nlc3NvciBibG9ja3Mgd2hpY2ggaGF2ZSBhIHNpbmdsZSBwcmVkZWNlc3Nvci4KKyAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCA0PiBTaW5nbGVQcmVkU3VjY3M7CisgIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwxNj4gRWFybHlWaXNpdGVkOworCisgIC8vIFRyYXZlcnNlIHRoZSBiYXNpYyBibG9ja3MgZGVwdGggZmlyc3QuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpFbnRyeSA9IE1GLmJlZ2luKCk7CisgIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwxNj4gVmlzaXRlZDsKKyAgZm9yIChkZl9leHRfaXRlcmF0b3I8TWFjaGluZUJhc2ljQmxvY2sqLAorICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLDE2PiA+CisgICAgICAgICBERkkgPSBkZl9leHRfYmVnaW4oRW50cnksIFZpc2l0ZWQpLCBFID0gZGZfZXh0X2VuZChFbnRyeSwgVmlzaXRlZCk7CisgICAgICAgREZJICE9IEU7ICsrREZJKSB7CisgICAgTUJCID0gKkRGSTsKKyAgICBpZiAoIUVhcmx5VmlzaXRlZC5jb3VudChNQkIpKQorICAgICAgUmV3cml0ZU1CQihMSXMsIFNwaWxscywgUmVnS2lsbHMsIEtpbGxPcHMpOworCisgICAgLy8gSWYgdGhpcyBNQkIgaXMgdGhlIG9ubHkgcHJlZGVjZXNzb3Igb2YgYSBzdWNjZXNzb3IuIEtlZXAgdGhlCisgICAgLy8gYXZhaWxhYmlsaXR5IGluZm9ybWF0aW9uIGFuZCB2aXNpdCBpdCBuZXh0LgorICAgIGRvIHsKKyAgICAgIC8vIEtlZXAgdmlzaXRpbmcgc2luZ2xlIHByZWRlY2Vzc29yIHN1Y2Nlc3NvciBhcyBsb25nIGFzIHBvc3NpYmxlLgorICAgICAgU2luZ2xlUHJlZFN1Y2NzLmNsZWFyKCk7CisgICAgICBmaW5kU2luZ2xlUHJlZFN1Y2Nlc3NvcihNQkIsIFNpbmdsZVByZWRTdWNjcyk7CisgICAgICBpZiAoU2luZ2xlUHJlZFN1Y2NzLmVtcHR5KCkpCisgICAgICAgIE1CQiA9IDA7CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gRklYTUU6IE1vcmUgdGhhbiBvbmUgc3VjY2Vzc29ycywgZWFjaCBvZiB3aGljaCBoYXMgTUJCIGhhcworICAgICAgICAvLyB0aGUgb25seSBwcmVkZWNlc3Nvci4KKyAgICAgICAgTUJCID0gU2luZ2xlUHJlZFN1Y2NzWzBdOworICAgICAgICBpZiAoIVZpc2l0ZWQuY291bnQoTUJCKSAmJiBFYXJseVZpc2l0ZWQuaW5zZXJ0KE1CQikpIHsKKyAgICAgICAgICBTcGlsbHMuQWRkQXZhaWxhYmxlUmVnc1RvTGl2ZUluKCpNQkIsIFJlZ0tpbGxzLCBLaWxsT3BzKTsKKyAgICAgICAgICBSZXdyaXRlTUJCKExJcywgU3BpbGxzLCBSZWdLaWxscywgS2lsbE9wcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlIChNQkIpOworCisgICAgLy8gQ2xlYXIgdGhlIGF2YWlsYWJpbGl0eSBpbmZvLgorICAgIFNwaWxscy5jbGVhcigpOworICB9CisKKyAgREVCVUcoZGJncygpIDw8ICIqKioqIFBvc3QgTWFjaGluZSBJbnN0cnMgKioqKlxuIik7CisgIERFQlVHKE1GLmR1bXAoKSk7CisKKyAgLy8gTWFyayB1bnVzZWQgc3BpbGwgc2xvdHMuCisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBpbnQgU1MgPSBWUk0tPmdldExvd1NwaWxsU2xvdCgpOworICBpZiAoU1MgIT0gVmlydFJlZ01hcDo6Tk9fU1RBQ0tfU0xPVCkgeworICAgIGZvciAoaW50IGUgPSBWUk0tPmdldEhpZ2hTcGlsbFNsb3QoKTsgU1MgPD0gZTsgKytTUykgeworICAgICAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyKiwgND4gJkRiZ1ZhbHVlcyA9IFNsb3QyRGJnVmFsdWVzW1NTXTsKKyAgICAgIGlmICghVlJNLT5pc1NwaWxsU2xvdFVzZWQoU1MpKSB7CisgICAgICAgIE1GSS0+UmVtb3ZlU3RhY2tPYmplY3QoU1MpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlZSA9IERiZ1ZhbHVlcy5zaXplKCk7IGogIT0gZWU7ICsraikgeworICAgICAgICAgIE1hY2hpbmVJbnN0ciAqRFZNSSA9IERiZ1ZhbHVlc1tqXTsKKyAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRFZNQkIgPSBEVk1JLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlbW92aW5nIGRlYnVnIGluZm8gcmVmZXJlbmNpbmcgRkkjIiA8PCBTUyA8PCAnXG4nKTsKKyAgICAgICAgICBWUk0tPlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKERWTUkpOworICAgICAgICAgIERWTUJCLT5lcmFzZShEVk1JKTsKKyAgICAgICAgfQorICAgICAgICArK051bURTUzsKKyAgICAgIH0KKyAgICAgIERiZ1ZhbHVlcy5jbGVhcigpOworICAgIH0KKyAgfQorICBTbG90MkRiZ1ZhbHVlcy5jbGVhcigpOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gT3B0aW1pemVCeVVuZm9sZDIgLSBVbmZvbGQgYSBzZXJpZXMgb2YgbG9hZCAvIHN0b3JlIGZvbGRpbmcgaW5zdHJ1Y3Rpb25zIGlmCisvLy8gYSBzY3JhdGNoIHJlZ2lzdGVyIGlzIGF2YWlsYWJsZS4KKy8vLyAgICAgeG9ycSAgJXIxMjxraWxsPiwgJXIxMworLy8vICAgICBhZGRxICAlcmF4LCAtMTg0KCVyYnApCisvLy8gICAgIGFkZHEgICVyMTMsIC0xODQoJXJicCkKKy8vLyA9PT4KKy8vLyAgICAgeG9ycSAgJXIxMjxraWxsPiwgJXIxMworLy8vICAgICBtb3ZxICAtMTg0KCVyYnApLCAlcjEyCisvLy8gICAgIGFkZHEgICVyYXgsICVyMTIKKy8vLyAgICAgYWRkcSAgJXIxMywgJXIxMgorLy8vICAgICBtb3ZxICAlcjEyLCAtMTg0KCVyYnApCitib29sIExvY2FsUmV3cml0ZXI6OgorT3B0aW1pemVCeVVuZm9sZDIodW5zaWduZWQgVmlydFJlZywgaW50IFNTLAorICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNSUksCisgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPiAmTWF5YmVEZWFkU3RvcmVzLAorICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlU3BpbGxzICZTcGlsbHMsCisgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcykgeworCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBOZXh0TUlJID0gbGx2bTo6bmV4dChNSUkpOworICAvLyBTa2lwIG92ZXIgZGJnX3ZhbHVlIGluc3RydWN0aW9ucy4KKyAgd2hpbGUgKE5leHRNSUkgIT0gTUJCLT5lbmQoKSAmJiBOZXh0TUlJLT5pc0RlYnVnVmFsdWUoKSkKKyAgICBOZXh0TUlJID0gbGx2bTo6bmV4dChOZXh0TUlJKTsKKyAgaWYgKE5leHRNSUkgPT0gTUJCLT5lbmQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKFRJSS0+Z2V0T3Bjb2RlQWZ0ZXJNZW1vcnlVbmZvbGQoTUlJLT5nZXRPcGNvZGUoKSwgdHJ1ZSwgdHJ1ZSkgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gTm93IGxldCdzIHNlZSBpZiB0aGUgbGFzdCBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zIGhhcHBlbnMgdG8gaGF2ZSBmcmVlZCB1cAorICAvLyBhIHJlZ2lzdGVyLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBSQyA9IE1SSS0+Z2V0UmVnQ2xhc3MoVmlydFJlZyk7CisgIHVuc2lnbmVkIFBoeXNSZWcgPSBGaW5kRnJlZVJlZ2lzdGVyKE1JSSwgKk1CQiwgUkMsIFRSSSwgQWxsb2NhdGFibGVSZWdzKTsKKyAgaWYgKCFQaHlzUmVnKQorICAgIHJldHVybiBmYWxzZTsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi0+Z2V0UGFyZW50KCk7CisgIFRSSSA9IE1GLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICBNYWNoaW5lSW5zdHIgJk1JID0gKk1JSTsKKyAgaWYgKCFGb2xkc1N0YWNrU2xvdE1vZFJlZihNSSwgU1MsIFBoeXNSZWcsIFRJSSwgVFJJLCAqVlJNKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gYWxzbyBmb2xkcyB0aGUgc2FtZSBTUyBtb2RyZWYgYW5kIGNhbiBiZSB1bmZvbGVkLAorICAvLyB0aGVuIGl0J3Mgd29ydGh3aGlsZSB0byBpc3N1ZSBhIGxvYWQgZnJvbSBTUyBpbnRvIHRoZSBmcmVlIHJlZ2lzdGVyIGFuZAorICAvLyB0aGVuIHVuZm9sZCB0aGVzZSBpbnN0cnVjdGlvbnMuCisgIGlmICghRm9sZHNTdGFja1Nsb3RNb2RSZWYoKk5leHRNSUksIFNTLCBQaHlzUmVnLCBUSUksIFRSSSwgKlZSTSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEJhY2stc2NoZWR1bGUgcmVsb2FkcyBhbmQgcmVtYXRzLgorICBDb21wdXRlUmVsb2FkTG9jKE1JSSwgTUJCLT5iZWdpbigpLCBQaHlzUmVnLCBUUkksIGZhbHNlLCBTUywgVElJLCBNRik7CisKKyAgLy8gTG9hZCBmcm9tIFNTIHRvIHRoZSBzcGFyZSBwaHlzaWNhbCByZWdpc3Rlci4KKyAgVElJLT5sb2FkUmVnRnJvbVN0YWNrU2xvdCgqTUJCLCBNSUksIFBoeXNSZWcsIFNTLCBSQywgVFJJKTsKKyAgLy8gVGhpcyBpbnZhbGlkYXRlcyBQaHlzLgorICBTcGlsbHMuQ2xvYmJlclBoeXNSZWcoUGh5c1JlZyk7CisgIC8vIFJlbWVtYmVyIGl0J3MgYXZhaWxhYmxlLgorICBTcGlsbHMuYWRkQXZhaWxhYmxlKFNTLCBQaHlzUmVnKTsKKyAgTWF5YmVEZWFkU3RvcmVzW1NTXSA9IE5VTEw7CisKKyAgLy8gVW5mb2xkIGN1cnJlbnQgTUkuCisgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDQ+IE5ld01JczsKKyAgaWYgKCFUSUktPnVuZm9sZE1lbW9yeU9wZXJhbmQoTUYsICZNSSwgVmlydFJlZywgZmFsc2UsIGZhbHNlLCBOZXdNSXMpKQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuYWJsZSB1bmZvbGQgdGhlIGxvYWQgLyBzdG9yZSBmb2xkaW5nIGluc3RydWN0aW9uISIpOworICBhc3NlcnQoTmV3TUlzLnNpemUoKSA9PSAxKTsKKyAgQXNzaWduUGh5c1RvVmlydFJlZyhOZXdNSXNbMF0sIFZpcnRSZWcsIFBoeXNSZWcsICpUUkkpOworICBWUk0tPnRyYW5zZmVyUmVzdG9yZVB0cygmTUksIE5ld01Jc1swXSk7CisgIE1JSSA9IE1CQi0+aW5zZXJ0KE1JSSwgTmV3TUlzWzBdKTsKKyAgSW52YWxpZGF0ZUtpbGxzKE1JLCBUUkksIFJlZ0tpbGxzLCBLaWxsT3BzKTsKKyAgVlJNLT5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcygmTUkpOworICBNQkItPmVyYXNlKCZNSSk7CisgICsrTnVtTW9kUmVmVW5mb2xkOworCisgIC8vIFVuZm9sZCBuZXh0IGluc3RydWN0aW9ucyB0aGF0IGZvbGQgdGhlIHNhbWUgU1MuCisgIGRvIHsKKyAgICBNYWNoaW5lSW5zdHIgJk5leHRNSSA9ICpOZXh0TUlJOworICAgIE5leHRNSUkgPSBsbHZtOjpuZXh0KE5leHRNSUkpOworICAgIE5ld01Jcy5jbGVhcigpOworICAgIGlmICghVElJLT51bmZvbGRNZW1vcnlPcGVyYW5kKE1GLCAmTmV4dE1JLCBWaXJ0UmVnLCBmYWxzZSwgZmFsc2UsIE5ld01JcykpCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmFibGUgdW5mb2xkIHRoZSBsb2FkIC8gc3RvcmUgZm9sZGluZyBpbnN0cnVjdGlvbiEiKTsKKyAgICBhc3NlcnQoTmV3TUlzLnNpemUoKSA9PSAxKTsKKyAgICBBc3NpZ25QaHlzVG9WaXJ0UmVnKE5ld01Jc1swXSwgVmlydFJlZywgUGh5c1JlZywgKlRSSSk7CisgICAgVlJNLT50cmFuc2ZlclJlc3RvcmVQdHMoJk5leHRNSSwgTmV3TUlzWzBdKTsKKyAgICBNQkItPmluc2VydChOZXh0TUlJLCBOZXdNSXNbMF0pOworICAgIEludmFsaWRhdGVLaWxscyhOZXh0TUksIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgIFZSTS0+UmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoJk5leHRNSSk7CisgICAgTUJCLT5lcmFzZSgmTmV4dE1JKTsKKyAgICArK051bU1vZFJlZlVuZm9sZDsKKyAgICAvLyBTa2lwIG92ZXIgZGJnX3ZhbHVlIGluc3RydWN0aW9ucy4KKyAgICB3aGlsZSAoTmV4dE1JSSAhPSBNQkItPmVuZCgpICYmIE5leHRNSUktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgTmV4dE1JSSA9IGxsdm06Om5leHQoTmV4dE1JSSk7CisgICAgaWYgKE5leHRNSUkgPT0gTUJCLT5lbmQoKSkKKyAgICAgIGJyZWFrOworICB9IHdoaWxlIChGb2xkc1N0YWNrU2xvdE1vZFJlZigqTmV4dE1JSSwgU1MsIFBoeXNSZWcsIFRJSSwgVFJJLCAqVlJNKSk7CisKKyAgLy8gU3RvcmUgdGhlIHZhbHVlIGJhY2sgaW50byBTUy4KKyAgVElJLT5zdG9yZVJlZ1RvU3RhY2tTbG90KCpNQkIsIE5leHRNSUksIFBoeXNSZWcsIHRydWUsIFNTLCBSQywgVFJJKTsKKyAgTWFjaGluZUluc3RyICpTdG9yZU1JID0gcHJpb3IoTmV4dE1JSSk7CisgIFZSTS0+YWRkU3BpbGxTbG90VXNlKFNTLCBTdG9yZU1JKTsKKyAgVlJNLT52aXJ0Rm9sZGVkKFZpcnRSZWcsIFN0b3JlTUksIFZpcnRSZWdNYXA6OmlzTW9kKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIE9wdGltaXplQnlVbmZvbGQgLSBUdXJuIGEgc3RvcmUgZm9sZGluZyBpbnN0cnVjdGlvbiBpbnRvIGEgbG9hZCBmb2xkaW5nCisvLy8gaW5zdHJ1Y3Rpb24uIGUuZy4KKy8vLyAgICAgeG9ybCAgJWVkaSwgJWVheAorLy8vICAgICBtb3ZsICAlZWF4LCAtMzIoJWVicCkKKy8vLyAgICAgbW92bCAgLTM2KCVlYnApLCAlZWF4CisvLy8gICAgIG9ybCAgICVlYXgsIC0zMiglZWJwKQorLy8vID09PgorLy8vICAgICB4b3JsICAlZWRpLCAlZWF4CisvLy8gICAgIG9ybCAgIC0zNiglZWJwKSwgJWVheAorLy8vICAgICBtb3YgICAlZWF4LCAtMzIoJWVicCkKKy8vLyBUaGlzIGVuYWJsZXMgdW5mb2xkaW5nIG9wdGltaXphdGlvbiBmb3IgYSBzdWJzZXF1ZW50IGluc3RydWN0aW9uIHdoaWNoIHdpbGwKKy8vLyBhbHNvIGVsaW1pbmF0ZSB0aGUgbmV3bHkgaW50cm9kdWNlZCBzdG9yZSBpbnN0cnVjdGlvbi4KK2Jvb2wgTG9jYWxSZXdyaXRlcjo6CitPcHRpbWl6ZUJ5VW5mb2xkKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUlJLAorICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPiAmTWF5YmVEZWFkU3RvcmVzLAorICAgICAgICAgICAgICAgICBBdmFpbGFibGVTcGlsbHMgJlNwaWxscywKKyAgICAgICAgICAgICAgICAgQml0VmVjdG9yICZSZWdLaWxscywKKyAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcykgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVJbnN0ciAmTUkgPSAqTUlJOworICB1bnNpZ25lZCBVbmZvbGRlZE9wYyA9IDA7CisgIHVuc2lnbmVkIFVuZm9sZFBSID0gMDsKKyAgdW5zaWduZWQgVW5mb2xkVlIgPSAwOworICBpbnQgRm9sZGVkU1MgPSBWaXJ0UmVnTWFwOjpOT19TVEFDS19TTE9UOworICBWaXJ0UmVnTWFwOjpNSTJWaXJ0TWFwVHk6OmNvbnN0X2l0ZXJhdG9yIEksIEVuZDsKKyAgZm9yICh0aWUoSSwgRW5kKSA9IFZSTS0+Z2V0Rm9sZGVkVmlydHMoJk1JKTsgSSAhPSBFbmQ7ICkgeworICAgIC8vIE9ubHkgdHJhbnNmb3JtIGEgTUkgdGhhdCBmb2xkcyBhIHNpbmdsZSByZWdpc3Rlci4KKyAgICBpZiAoVW5mb2xkZWRPcGMpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgVW5mb2xkVlIgPSBJLT5zZWNvbmQuZmlyc3Q7CisgICAgVmlydFJlZ01hcDo6TW9kUmVmIE1SID0gSS0+c2Vjb25kLnNlY29uZDsKKyAgICAvLyBNSTJWaXJ0TWFwIGJlIGNhbiB1cGRhdGVkIHdoaWNoIGludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgorICAgIC8vIEluY3JlbWVudCB0aGUgaXRlcmF0b3IgZmlyc3QuCisgICAgKytJOworICAgIGlmIChWUk0tPmlzQXNzaWduZWRSZWcoVW5mb2xkVlIpKQorICAgICAgY29udGludWU7CisgICAgLy8gSWYgdGhpcyByZWZlcmVuY2UgaXMgbm90IGEgdXNlLCBhbnkgcHJldmlvdXMgc3RvcmUgaXMgbm93IGRlYWQuCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgc3RvcmUgdG8gdGhpcyBzdGFjayBzbG90IGlzIG5vdCBkZWFkIGFueW1vcmUuCisgICAgRm9sZGVkU1MgPSBWUk0tPmdldFN0YWNrU2xvdChVbmZvbGRWUik7CisgICAgTWFjaGluZUluc3RyKiBEZWFkU3RvcmUgPSBNYXliZURlYWRTdG9yZXNbRm9sZGVkU1NdOworICAgIGlmIChEZWFkU3RvcmUgJiYgKE1SICYgVmlydFJlZ01hcDo6aXNNb2RSZWYpKSB7CisgICAgICB1bnNpZ25lZCBQaHlzUmVnID0gU3BpbGxzLmdldFNwaWxsU2xvdE9yUmVNYXRQaHlzUmVnKEZvbGRlZFNTKTsKKyAgICAgIGlmICghUGh5c1JlZyB8fCAhRGVhZFN0b3JlLT5yZWFkc1JlZ2lzdGVyKFBoeXNSZWcpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIFVuZm9sZFBSID0gUGh5c1JlZzsKKyAgICAgIFVuZm9sZGVkT3BjID0gVElJLT5nZXRPcGNvZGVBZnRlck1lbW9yeVVuZm9sZChNSS5nZXRPcGNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSk7CisgICAgfQorICB9CisKKyAgaWYgKCFVbmZvbGRlZE9wYykgeworICAgIGlmICghVW5mb2xkVlIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBMb29rIGZvciBvdGhlciB1bmZvbGRpbmcgb3Bwb3J0dW5pdGllcy4KKyAgICByZXR1cm4gT3B0aW1pemVCeVVuZm9sZDIoVW5mb2xkVlIsIEZvbGRlZFNTLCBNSUksIE1heWJlRGVhZFN0b3JlcywgU3BpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdLaWxscywgS2lsbE9wcyk7CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSB8fCBNTy5nZXRSZWcoKSA9PSAwIHx8ICFNTy5pc1VzZSgpKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgVmlydFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihWaXJ0UmVnKSB8fCBNTy5nZXRTdWJSZWcoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChWUk0tPmlzQXNzaWduZWRSZWcoVmlydFJlZykpIHsKKyAgICAgIHVuc2lnbmVkIFBoeXNSZWcgPSBWUk0tPmdldFBoeXMoVmlydFJlZyk7CisgICAgICBpZiAoUGh5c1JlZyAmJiBUUkktPnJlZ3NPdmVybGFwKFBoeXNSZWcsIFVuZm9sZFBSKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoVlJNLT5pc1JlTWF0ZXJpYWxpemVkKFZpcnRSZWcpKQorICAgICAgY29udGludWU7CisgICAgaW50IFNTID0gVlJNLT5nZXRTdGFja1Nsb3QoVmlydFJlZyk7CisgICAgdW5zaWduZWQgUGh5c1JlZyA9IFNwaWxscy5nZXRTcGlsbFNsb3RPclJlTWF0UGh5c1JlZyhTUyk7CisgICAgaWYgKFBoeXNSZWcpIHsKKyAgICAgIGlmIChUUkktPnJlZ3NPdmVybGFwKFBoeXNSZWcsIFVuZm9sZFBSKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChWUk0tPmhhc1BoeXMoVmlydFJlZykpIHsKKyAgICAgIFBoeXNSZWcgPSBWUk0tPmdldFBoeXMoVmlydFJlZyk7CisgICAgICBpZiAoIVRSSS0+cmVnc092ZXJsYXAoUGh5c1JlZywgVW5mb2xkUFIpKQorICAgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBPaywgd2UnbGwgbmVlZCB0byByZWxvYWQgdGhlIHZhbHVlIGludG8gYSByZWdpc3RlciB3aGljaCBtYWtlcworICAgIC8vIGl0IGltcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgc3RvcmUgdW5mb2xkaW5nIG9wdGltaXphdGlvbiBsYXRlci4KKyAgICAvLyBMZXQncyBzZWUgaWYgaXQgaXMgcG9zc2libGUgdG8gZm9sZCB0aGUgbG9hZCBpZiB0aGUgc3RvcmUgaXMKKyAgICAvLyB1bmZvbGRlZC4gVGhpcyBhbGxvd3MgdXMgdG8gcGVyZm9ybSB0aGUgc3RvcmUgdW5mb2xkaW5nCisgICAgLy8gb3B0aW1pemF0aW9uLgorICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDQ+IE5ld01JczsKKyAgICBpZiAoVElJLT51bmZvbGRNZW1vcnlPcGVyYW5kKE1GLCAmTUksIFVuZm9sZFZSLCBmYWxzZSwgZmFsc2UsIE5ld01JcykpIHsKKyAgICAgIGFzc2VydChOZXdNSXMuc2l6ZSgpID09IDEpOworICAgICAgTWFjaGluZUluc3RyICpOZXdNSSA9IE5ld01Jcy5iYWNrKCk7CisgICAgICBNQkItPmluc2VydChNSUksIE5ld01JKTsKKyAgICAgIE5ld01Jcy5jbGVhcigpOworICAgICAgaW50IElkeCA9IE5ld01JLT5maW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KFZpcnRSZWcsIGZhbHNlKTsKKyAgICAgIGFzc2VydChJZHggIT0gLTEpOworICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE+IE9wczsKKyAgICAgIE9wcy5wdXNoX2JhY2soSWR4KTsKKyAgICAgIE1hY2hpbmVJbnN0ciAqRm9sZGVkTUkgPSBUSUktPmZvbGRNZW1vcnlPcGVyYW5kKE5ld01JLCBPcHMsIFNTKTsKKyAgICAgIE5ld01JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIGlmIChGb2xkZWRNSSkgeworICAgICAgICBWUk0tPmFkZFNwaWxsU2xvdFVzZShTUywgRm9sZGVkTUkpOworICAgICAgICBpZiAoIVZSTS0+aGFzUGh5cyhVbmZvbGRWUikpCisgICAgICAgICAgVlJNLT5hc3NpZ25WaXJ0MlBoeXMoVW5mb2xkVlIsIFVuZm9sZFBSKTsKKyAgICAgICAgVlJNLT52aXJ0Rm9sZGVkKFZpcnRSZWcsIEZvbGRlZE1JLCBWaXJ0UmVnTWFwOjppc1JlZik7CisgICAgICAgIE1JSSA9IEZvbGRlZE1JOworICAgICAgICBJbnZhbGlkYXRlS2lsbHMoTUksIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgICAgICBWUk0tPlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKCZNSSk7CisgICAgICAgIE1CQi0+ZXJhc2UoJk1JKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gQ29tbXV0ZUNoYW5nZXNEZXN0aW5hdGlvbiAtIFdlIGFyZSBsb29raW5nIGZvciByMCA9IG9wIHIxLCByMiBhbmQKKy8vLyB3aGVyZSBTcmNSZWcgaXMgcjEgYW5kIGl0IGlzIHRpZWQgdG8gcjAuIFJldHVybiB0cnVlIGlmIGFmdGVyCisvLy8gY29tbXV0aW5nIHRoaXMgaW5zdHJ1Y3Rpb24gaXQgd2lsbCBiZSByMCA9IG9wIHIyLCByMS4KK3N0YXRpYyBib29sIENvbW11dGVDaGFuZ2VzRGVzdGluYXRpb24oTWFjaGluZUluc3RyICpEZWZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEc3RJZHgpIHsKKyAgaWYgKFRJRC5nZXROdW1EZWZzKCkgIT0gMSAmJiBUSUQuZ2V0TnVtT3BlcmFuZHMoKSAhPSAzKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFEZWZNSS0+Z2V0T3BlcmFuZCgxKS5pc1JlZygpIHx8CisgICAgICBEZWZNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSAhPSBTcmNSZWcpCisgICAgcmV0dXJuIGZhbHNlOworICB1bnNpZ25lZCBEZWZJZHg7CisgIGlmICghRGVmTUktPmlzUmVnVGllZFRvRGVmT3BlcmFuZCgxLCAmRGVmSWR4KSB8fCBEZWZJZHggIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHVuc2lnbmVkIFNyY0lkeDEsIFNyY0lkeDI7CisgIGlmICghVElJLT5maW5kQ29tbXV0ZWRPcEluZGljZXMoRGVmTUksIFNyY0lkeDEsIFNyY0lkeDIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKFNyY0lkeDEgPT0gMSAmJiBTcmNJZHgyID09IDIpIHsKKyAgICBEc3RJZHggPSAyOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIENvbW11dGVUb0ZvbGRSZWxvYWQgLQorLy8vIExvb2sgZm9yCisvLy8gcjEgPSBsb2FkIGZpIzEKKy8vLyByMSA9IG9wIHIxLCByMjxraWxsPgorLy8vIHN0b3JlIHIxLCBmaSMxCisvLy8KKy8vLyBJZiBvcCBpcyBjb21tdXRhYmxlIGFuZCByMiBpcyBraWxsZWQsIHRoZW4gd2UgY2FuIHhmb3JtIHRoZXNlIHRvCisvLy8gcjIgPSBvcCByMiwgZmkjMQorLy8vIHN0b3JlIHIyLCBmaSMxCitib29sIExvY2FsUmV3cml0ZXI6OgorQ29tbXV0ZVRvRm9sZFJlbG9hZChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1JSSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmlydFJlZywgdW5zaWduZWQgU3JjUmVnLCBpbnQgU1MsCisgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVNwaWxscyAmU3BpbGxzLAorICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lT3BlcmFuZCo+ICZLaWxsT3BzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgeworICBpZiAoTUlJID09IE1CQi0+YmVnaW4oKSB8fCAhTUlJLT5raWxsc1JlZ2lzdGVyKFNyY1JlZykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIE1hY2hpbmVJbnN0ciAmTUkgPSAqTUlJOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRGVmTUlJID0gcHJpb3IoTUlJKTsKKyAgTWFjaGluZUluc3RyICpEZWZNSSA9IERlZk1JSTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBEZWZNSS0+Z2V0RGVzYygpOworICB1bnNpZ25lZCBOZXdEc3RJZHg7CisgIGlmIChEZWZNSUkgIT0gTUJCLT5iZWdpbigpICYmCisgICAgICBUSUQuaXNDb21tdXRhYmxlKCkgJiYKKyAgICAgIENvbW11dGVDaGFuZ2VzRGVzdGluYXRpb24oRGVmTUksIFRJRCwgU3JjUmVnLCBUSUksIE5ld0RzdElkeCkpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTmV3RHN0TU8gPSBEZWZNSS0+Z2V0T3BlcmFuZChOZXdEc3RJZHgpOworICAgIHVuc2lnbmVkIE5ld1JlZyA9IE5ld0RzdE1PLmdldFJlZygpOworICAgIGlmICghTmV3RHN0TU8uaXNLaWxsKCkgfHwgVFJJLT5yZWdzT3ZlcmxhcChOZXdSZWcsIFNyY1JlZykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgTWFjaGluZUluc3RyICpSZWxvYWRNSSA9IHByaW9yKERlZk1JSSk7CisgICAgaW50IEZyYW1lSWR4OworICAgIHVuc2lnbmVkIERlc3RSZWcgPSBUSUktPmlzTG9hZEZyb21TdGFja1Nsb3QoUmVsb2FkTUksIEZyYW1lSWR4KTsKKyAgICBpZiAoRGVzdFJlZyAhPSBTcmNSZWcgfHwgRnJhbWVJZHggIT0gU1MpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaW50IFVzZUlkeCA9IERlZk1JLT5maW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KERlc3RSZWcsIGZhbHNlKTsKKyAgICBpZiAoVXNlSWR4ID09IC0xKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHVuc2lnbmVkIERlZklkeDsKKyAgICBpZiAoIU1JLmlzUmVnVGllZFRvRGVmT3BlcmFuZChVc2VJZHgsICZEZWZJZHgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGFzc2VydChEZWZNSS0+Z2V0T3BlcmFuZChEZWZJZHgpLmlzUmVnKCkgJiYKKyAgICAgICAgICAgRGVmTUktPmdldE9wZXJhbmQoRGVmSWR4KS5nZXRSZWcoKSA9PSBTcmNSZWcpOworCisgICAgLy8gTm93IGNvbW11dGUgZGVmIGluc3RydWN0aW9uLgorICAgIE1hY2hpbmVJbnN0ciAqQ29tbXV0ZWRNSSA9IFRJSS0+Y29tbXV0ZUluc3RydWN0aW9uKERlZk1JLCB0cnVlKTsKKyAgICBpZiAoIUNvbW11dGVkTUkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgTUJCLT5pbnNlcnQoTUlJLCBDb21tdXRlZE1JKTsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMT4gT3BzOworICAgIE9wcy5wdXNoX2JhY2soTmV3RHN0SWR4KTsKKyAgICBNYWNoaW5lSW5zdHIgKkZvbGRlZE1JID0gVElJLT5mb2xkTWVtb3J5T3BlcmFuZChDb21tdXRlZE1JLCBPcHMsIFNTKTsKKyAgICAvLyBOb3QgbmVlZGVkIHNpbmNlIGZvbGRNZW1vcnlPcGVyYW5kIHJldHVybnMgbmV3IE1JLgorICAgIENvbW11dGVkTUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIGlmICghRm9sZGVkTUkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBWUk0tPmFkZFNwaWxsU2xvdFVzZShTUywgRm9sZGVkTUkpOworICAgIFZSTS0+dmlydEZvbGRlZChWaXJ0UmVnLCBGb2xkZWRNSSwgVmlydFJlZ01hcDo6aXNSZWYpOworICAgIC8vIEluc2VydCBuZXcgZGVmIE1JIGFuZCBzcGlsbCBNSS4KKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBSQyA9IE1SSS0+Z2V0UmVnQ2xhc3MoVmlydFJlZyk7CisgICAgVElJLT5zdG9yZVJlZ1RvU3RhY2tTbG90KCpNQkIsICZNSSwgTmV3UmVnLCB0cnVlLCBTUywgUkMsIFRSSSk7CisgICAgTUlJID0gcHJpb3IoTUlJKTsKKyAgICBNYWNoaW5lSW5zdHIgKlN0b3JlTUkgPSBNSUk7CisgICAgVlJNLT5hZGRTcGlsbFNsb3RVc2UoU1MsIFN0b3JlTUkpOworICAgIFZSTS0+dmlydEZvbGRlZChWaXJ0UmVnLCBTdG9yZU1JLCBWaXJ0UmVnTWFwOjppc01vZCk7CisgICAgTUlJID0gRm9sZGVkTUk7ICAvLyBVcGRhdGUgTUlJIHRvIGJhY2t0cmFjay4KKworICAgIC8vIERlbGV0ZSBhbGwgMyBvbGQgaW5zdHJ1Y3Rpb25zLgorICAgIEludmFsaWRhdGVLaWxscygqUmVsb2FkTUksIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgIFZSTS0+UmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoUmVsb2FkTUkpOworICAgIE1CQi0+ZXJhc2UoUmVsb2FkTUkpOworICAgIEludmFsaWRhdGVLaWxscygqRGVmTUksIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgIFZSTS0+UmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoRGVmTUkpOworICAgIE1CQi0+ZXJhc2UoRGVmTUkpOworICAgIEludmFsaWRhdGVLaWxscyhNSSwgVFJJLCBSZWdLaWxscywgS2lsbE9wcyk7CisgICAgVlJNLT5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcygmTUkpOworICAgIE1CQi0+ZXJhc2UoJk1JKTsKKworICAgIC8vIElmIE5ld1JlZyB3YXMgcHJldmlvdXNseSBob2xkaW5nIHZhbHVlIG9mIHNvbWUgU1MsIGl0J3Mgbm93IGNsb2JiZXJlZC4KKyAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIG5vdyBiZWNhdXNlIGl0J3MgYSBwaHlzaWNhbCByZWdpc3Rlci4gV2hlbiB0aGlzCisgICAgLy8gaW5zdHJ1Y3Rpb24gaXMgcmUtdmlzaXRlZCwgaXQncyBpZ25vcmVkLgorICAgIFNwaWxscy5DbG9iYmVyUGh5c1JlZyhOZXdSZWcpOworCisgICAgKytOdW1Db21tdXRlczsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFNwaWxsUmVnVG9TdGFja1Nsb3QgLSBTcGlsbCBhIHJlZ2lzdGVyIHRvIGEgc3BlY2lmaWVkIHN0YWNrIHNsb3QuIENoZWNrIGlmCisvLy8gdGhlIGxhc3Qgc3RvcmUgdG8gdGhlIHNhbWUgc2xvdCBpcyBub3cgZGVhZC4gSWYgc28sIHJlbW92ZSB0aGUgbGFzdCBzdG9yZS4KK3ZvaWQgTG9jYWxSZXdyaXRlcjo6CitTcGlsbFJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUlJLAorICAgICAgICAgICAgICAgICAgICBpbnQgSWR4LCB1bnNpZ25lZCBQaHlzUmVnLCBpbnQgU3RhY2tTbG90LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0F2YWlsYWJsZSwgTWFjaGluZUluc3RyIComTGFzdFN0b3JlLAorICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGVTcGlsbHMgJlNwaWxscywKKyAgICAgICAgICAgICAgICAgICAgU21hbGxTZXQ8TWFjaGluZUluc3RyKiwgND4gJlJlTWF0RGVmcywKKyAgICAgICAgICAgICAgICAgICAgQml0VmVjdG9yICZSZWdLaWxscywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcykgeworCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBvbGROZXh0TUlJID0gbGx2bTo6bmV4dChNSUkpOworICBUSUktPnN0b3JlUmVnVG9TdGFja1Nsb3QoKk1CQiwgbGx2bTo6bmV4dChNSUkpLCBQaHlzUmVnLCB0cnVlLCBTdGFja1Nsb3QsIFJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJJKTsKKyAgTWFjaGluZUluc3RyICpTdG9yZU1JID0gcHJpb3Iob2xkTmV4dE1JSSk7CisgIFZSTS0+YWRkU3BpbGxTbG90VXNlKFN0YWNrU2xvdCwgU3RvcmVNSSk7CisgIERFQlVHKGRiZ3MoKSA8PCAiU3RvcmU6XHQiIDw8ICpTdG9yZU1JKTsKKworICAvLyBJZiB0aGVyZSBpcyBhIGRlYWQgc3RvcmUgdG8gdGhpcyBzdGFjayBzbG90LCBudWtlIGl0IG5vdy4KKyAgaWYgKExhc3RTdG9yZSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiUmVtb3ZlZCBkZWFkIHN0b3JlOlx0IiA8PCAqTGFzdFN0b3JlKTsKKyAgICArK051bURTRTsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMj4gS2lsbFJlZ3M7CisgICAgSW52YWxpZGF0ZUtpbGxzKCpMYXN0U3RvcmUsIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMsICZLaWxsUmVncyk7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFByZXZNSUkgPSBMYXN0U3RvcmU7CisgICAgYm9vbCBDaGVja0RlZiA9IFByZXZNSUkgIT0gTUJCLT5iZWdpbigpOworICAgIGlmIChDaGVja0RlZikKKyAgICAgIC0tUHJldk1JSTsKKyAgICBWUk0tPlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKExhc3RTdG9yZSk7CisgICAgTUJCLT5lcmFzZShMYXN0U3RvcmUpOworICAgIGlmIChDaGVja0RlZikgeworICAgICAgLy8gTG9vayBhdCBkZWZzIG9mIGtpbGxlZCByZWdpc3RlcnMgb24gdGhlIHN0b3JlLiBNYXJrIHRoZSBkZWZzCisgICAgICAvLyBhcyBkZWFkIHNpbmNlIHRoZSBzdG9yZSBoYXMgYmVlbiBkZWxldGVkIGFuZCB0aGV5IGFyZW4ndAorICAgICAgLy8gYmVpbmcgcmV1c2VkLgorICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZWUgPSBLaWxsUmVncy5zaXplKCk7IGogIT0gZWU7ICsraikgeworICAgICAgICBib29sIEhhc090aGVyRGVmID0gZmFsc2U7CisgICAgICAgIGlmIChJbnZhbGlkYXRlUmVnRGVmKFByZXZNSUksICpNSUksIEtpbGxSZWdzW2pdLCBIYXNPdGhlckRlZiwgVFJJKSkgeworICAgICAgICAgIE1hY2hpbmVJbnN0ciAqRGVhZERlZiA9IFByZXZNSUk7CisgICAgICAgICAgaWYgKFJlTWF0RGVmcy5jb3VudChEZWFkRGVmKSAmJiAhSGFzT3RoZXJEZWYpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGFzc3VtZXMgYSByZW1hdCBkZWYgZG9lcyBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuCisgICAgICAgICAgICBWUk0tPlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKERlYWREZWYpOworICAgICAgICAgICAgTUJCLT5lcmFzZShEZWFkRGVmKTsKKyAgICAgICAgICAgICsrTnVtRFJNOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEFsbG93IGZvciBtdWx0aS1pbnN0cnVjdGlvbiBzcGlsbCBzZXF1ZW5jZXMsIGFzIG9uIFBQQyBBbHRpdmVjLiAgUHJlc3VtZQorICAvLyB0aGUgbGFzdCBvZiBtdWx0aXBsZSBpbnN0cnVjdGlvbnMgaXMgdGhlIGFjdHVhbCBzdG9yZS4KKyAgTGFzdFN0b3JlID0gcHJpb3Iob2xkTmV4dE1JSSk7CisKKyAgLy8gSWYgdGhlIHN0YWNrIHNsb3QgdmFsdWUgd2FzIHByZXZpb3VzbHkgYXZhaWxhYmxlIGluIHNvbWUgb3RoZXIKKyAgLy8gcmVnaXN0ZXIsIGNoYW5nZSBpdCBub3cuICBPdGhlcndpc2UsIG1ha2UgdGhlIHJlZ2lzdGVyIGF2YWlsYWJsZSwKKyAgLy8gaW4gUGh5c1JlZy4KKyAgU3BpbGxzLk1vZGlmeVN0YWNrU2xvdE9yUmVNYXQoU3RhY2tTbG90KTsKKyAgU3BpbGxzLkNsb2JiZXJQaHlzUmVnKFBoeXNSZWcpOworICBTcGlsbHMuYWRkQXZhaWxhYmxlKFN0YWNrU2xvdCwgUGh5c1JlZywgaXNBdmFpbGFibGUpOworICArK051bVN0b3JlczsKK30KKworLy8vIGlzU2FmZVRvRGVsZXRlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBkb2Vzbid0IHByb2R1Y2UgYW55IHNpZGUKKy8vLyBlZmZlY3QgYW5kIGFsbCBvZiBpdHMgZGVmcyBhcmUgZGVhZC4KK3N0YXRpYyBib29sIGlzU2FmZVRvRGVsZXRlKE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS5nZXREZXNjKCk7CisgIGlmIChUSUQubWF5TG9hZCgpIHx8IFRJRC5tYXlTdG9yZSgpIHx8IFRJRC5pc0NhbGwoKSB8fCBUSUQuaXNUZXJtaW5hdG9yKCkgfHwKKyAgICAgIFRJRC5pc0NhbGwoKSB8fCBUSUQuaXNCYXJyaWVyKCkgfHwgVElELmlzUmV0dXJuKCkgfHwKKyAgICAgIFRJRC5oYXNVbm1vZGVsZWRTaWRlRWZmZWN0cygpKQorICAgIHJldHVybiBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmdldFJlZygpKQorICAgICAgY29udGludWU7CisgICAgaWYgKE1PLmlzRGVmKCkgJiYgIU1PLmlzRGVhZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChNTy5pc1VzZSgpICYmIE1PLmlzS2lsbCgpKQorICAgICAgLy8gRklYTUU6IFdlIGNhbid0IHJlbW92ZSBraWxsIG1hcmtlcnMgb3IgZWxzZSB0aGUgc2NhdmVuZ2VyIHdpbGwgYXNzZXJ0LgorICAgICAgLy8gQW4gYWx0ZXJuYXRpdmUgaXMgdG8gYWRkIGEgQUREIHBzZXVkbyBpbnN0cnVjdGlvbiB0byByZXBsYWNlIGtpbGwKKyAgICAgIC8vIG1hcmtlcnMuCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBUcmFuc2ZlckRlYWRuZXNzIC0gQSBpZGVudGl0eSBjb3B5IGRlZmluaXRpb24gaXMgZGVhZCBhbmQgaXQncyBiZWluZworLy8vIHJlbW92ZWQuIEZpbmQgdGhlIGxhc3QgZGVmIG9yIHVzZSBhbmQgbWFyayBpdCBhcyBkZWFkIC8ga2lsbC4KK3ZvaWQgTG9jYWxSZXdyaXRlcjo6CitUcmFuc2ZlckRlYWRuZXNzKHVuc2lnbmVkIFJlZywgQml0VmVjdG9yICZSZWdLaWxscywKKyAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQqPiAmS2lsbE9wcykgeworICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0PiBTZWVuczsKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPE1hY2hpbmVJbnN0ciosIGludD4sOD4gUmVmczsKKyAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpyZWdfaXRlcmF0b3IgUkkgPSBNUkktPnJlZ19iZWdpbihSZWcpLAorICAgICAgICAgUkUgPSBNUkktPnJlZ19lbmQoKTsgUkkgIT0gUkU7ICsrUkkpIHsKKyAgICBNYWNoaW5lSW5zdHIgKlVETUkgPSAmKlJJOworICAgIGlmIChVRE1JLT5pc0RlYnVnVmFsdWUoKSB8fCBVRE1JLT5nZXRQYXJlbnQoKSAhPSBNQkIpCisgICAgICBjb250aW51ZTsKKyAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD46Oml0ZXJhdG9yIERJID0gRGlzdGFuY2VNYXAuZmluZChVRE1JKTsKKyAgICBpZiAoREkgPT0gRGlzdGFuY2VNYXAuZW5kKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoU2VlbnMuaW5zZXJ0KFVETUkpKQorICAgICAgUmVmcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoVURNSSwgREktPnNlY29uZCkpOworICB9CisKKyAgaWYgKFJlZnMuZW1wdHkoKSkKKyAgICByZXR1cm47CisgIHN0ZDo6c29ydChSZWZzLmJlZ2luKCksIFJlZnMuZW5kKCksIFJlZlNvcnRlcigpKTsKKworICB3aGlsZSAoIVJlZnMuZW1wdHkoKSkgeworICAgIE1hY2hpbmVJbnN0ciAqTGFzdFVETUkgPSBSZWZzLmJhY2soKS5maXJzdDsKKyAgICBSZWZzLnBvcF9iYWNrKCk7CisKKyAgICBNYWNoaW5lT3BlcmFuZCAqTGFzdFVEID0gTlVMTDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTGFzdFVETUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBMYXN0VURNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSB8fCBNTy5nZXRSZWcoKSAhPSBSZWcpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKCFMYXN0VUQgfHwgKExhc3RVRC0+aXNVc2UoKSAmJiBNTy5pc0RlZigpKSkKKyAgICAgICAgTGFzdFVEID0gJk1POworICAgICAgaWYgKExhc3RVRE1JLT5pc1JlZ1RpZWRUb0RlZk9wZXJhbmQoaSkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoTGFzdFVELT5pc0RlZigpKSB7CisgICAgICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIHNpZGUgZWZmZWN0LCBkZWxldGUgaXQgYW5kIHByb3BhZ2F0ZQorICAgICAgLy8gYmFja3dhcmQgZnVydGhlci4gT3RoZXJ3aXNlLCBtYXJrIGlzIGRlYWQgYW5kIHdlIGFyZSBkb25lLgorICAgICAgaWYgKCFpc1NhZmVUb0RlbGV0ZSgqTGFzdFVETUkpKSB7CisgICAgICAgIExhc3RVRC0+c2V0SXNEZWFkKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgVlJNLT5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhMYXN0VURNSSk7CisgICAgICBNQkItPmVyYXNlKExhc3RVRE1JKTsKKyAgICB9IGVsc2UgeworICAgICAgTGFzdFVELT5zZXRJc0tpbGwoKTsKKyAgICAgIFJlZ0tpbGxzLnNldChSZWcpOworICAgICAgS2lsbE9wc1tSZWddID0gTGFzdFVEOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8vLyBJbnNlcnRFbWVyZ2VuY3lTcGlsbHMgLSBJbnNlcnQgZW1lcmdlbmN5IHNwaWxscyBiZWZvcmUgTUkgaWYgcmVxdWVzdGVkIGJ5CisvLy8gVlJNLiBSZXR1cm4gdHJ1ZSBpZiBzcGlsbHMgd2VyZSBpbnNlcnRlZC4KK2Jvb2wgTG9jYWxSZXdyaXRlcjo6SW5zZXJ0RW1lcmdlbmN5U3BpbGxzKE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgaWYgKCFWUk0tPmhhc0VtZXJnZW5jeVNwaWxscyhNSSkpCisgICAgcmV0dXJuIGZhbHNlOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUlJID0gTUk7CisgIFNtYWxsU2V0PGludCwgND4gVXNlZFNTOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJkVtU3BpbGxzID0gVlJNLT5nZXRFbWVyZ2VuY3lTcGlsbHMoTUkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRW1TcGlsbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIFBoeXNSZWcgPSBFbVNwaWxsc1tpXTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IFRSSS0+Z2V0TWluaW1hbFBoeXNSZWdDbGFzcyhQaHlzUmVnKTsKKyAgICBhc3NlcnQoUkMgJiYgIlVuYWJsZSB0byBkZXRlcm1pbmUgcmVnaXN0ZXIgY2xhc3MhIik7CisgICAgaW50IFNTID0gVlJNLT5nZXRFbWVyZ2VuY3lTcGlsbFNsb3QoUkMpOworICAgIGlmIChVc2VkU1MuY291bnQoU1MpKQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiTmVlZCB0byBzcGlsbCBtb3JlIHRoYW4gb25lIHBoeXNpY2FsIHJlZ2lzdGVycyEiKTsKKyAgICBVc2VkU1MuaW5zZXJ0KFNTKTsKKyAgICBUSUktPnN0b3JlUmVnVG9TdGFja1Nsb3QoKk1CQiwgTUlJLCBQaHlzUmVnLCB0cnVlLCBTUywgUkMsIFRSSSk7CisgICAgTWFjaGluZUluc3RyICpTdG9yZU1JID0gcHJpb3IoTUlJKTsKKyAgICBWUk0tPmFkZFNwaWxsU2xvdFVzZShTUywgU3RvcmVNSSk7CisKKyAgICAvLyBCYWNrLXNjaGVkdWxlIHJlbG9hZHMgYW5kIHJlbWF0cy4KKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0TG9jID0KKyAgICAgIENvbXB1dGVSZWxvYWRMb2MobGx2bTo6bmV4dChNSUkpLCBNQkItPmJlZ2luKCksIFBoeXNSZWcsIFRSSSwgZmFsc2UsIFNTLAorICAgICAgICAgICAgICAgICAgICAgICBUSUksICpNQkItPmdldFBhcmVudCgpKTsKKworICAgIFRJSS0+bG9hZFJlZ0Zyb21TdGFja1Nsb3QoKk1CQiwgSW5zZXJ0TG9jLCBQaHlzUmVnLCBTUywgUkMsIFRSSSk7CisKKyAgICBNYWNoaW5lSW5zdHIgKkxvYWRNSSA9IHByaW9yKEluc2VydExvYyk7CisgICAgVlJNLT5hZGRTcGlsbFNsb3RVc2UoU1MsIExvYWRNSSk7CisgICAgKytOdW1QU3BpbGxzOworICAgIERpc3RhbmNlTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihMb2FkTUksIERpc3RhbmNlTWFwLnNpemUoKSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gSW5zZXJ0UmVzdG9yZXMgLSBSZXN0b3JlIHJlZ2lzdGVycyBiZWZvcmUgTUkgaXMgcmVxdWVzdGVkIGJ5IFZSTS4gUmV0dXJuCisvLy8gdHJ1ZSBpcyBhbnkgaW5zdHJ1Y3Rpb25zIHdlcmUgaW5zZXJ0ZWQuCitib29sIExvY2FsUmV3cml0ZXI6Okluc2VydFJlc3RvcmVzKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVNwaWxscyAmU3BpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlJlZ0tpbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lT3BlcmFuZCo+ICZLaWxsT3BzKSB7CisgIGlmICghVlJNLT5pc1Jlc3RvcmVQdChNSSkpCisgICAgcmV0dXJuIGZhbHNlOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUlJID0gTUk7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmUmVzdG9yZVJlZ3MgPSBWUk0tPmdldFJlc3RvcmVQdFJlc3RvcmVzKE1JKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlc3RvcmVSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBWaXJ0UmVnID0gUmVzdG9yZVJlZ3NbZS1pLTFdOyAgLy8gUmV2ZXJzZSBvcmRlci4KKyAgICBpZiAoIVZSTS0+Z2V0UHJlU3BsaXRSZWcoVmlydFJlZykpCisgICAgICBjb250aW51ZTsgLy8gU3BsaXQgaW50ZXJ2YWwgc3BpbGxlZCBhZ2Fpbi4KKyAgICB1bnNpZ25lZCBQaHlzID0gVlJNLT5nZXRQaHlzKFZpcnRSZWcpOworICAgIE1SSS0+c2V0UGh5c1JlZ1VzZWQoUGh5cyk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgYmVpbmcgcmVzdG9yZWQgaWYgYXZhaWxhYmxlLiBJZiBzbywgaXQgbXVzdCBiZQorICAgIC8vIGZyb20gYSBwcmVkZWNlc3NvciBCQiB0aGF0IGZhbGx0aHJvdWdoIGludG8gdGhpcyBCQi4gV2UgZG8gbm90CisgICAgLy8gZXhwZWN0OgorICAgIC8vIEJCMToKKyAgICAvLyByMSA9IGxvYWQgZmkjMQorICAgIC8vIC4uLgorICAgIC8vICAgID0gcjE8a2lsbD4KKyAgICAvLyAuLi4gIyByMSBub3QgY2xvYmJlcmVkCisgICAgLy8gLi4uCisgICAgLy8gICAgPSBsb2FkIGZpIzEKKyAgICBib29sIERvUmVNYXQgPSBWUk0tPmlzUmVNYXRlcmlhbGl6ZWQoVmlydFJlZyk7CisgICAgaW50IFNTb3JSTUlkID0gRG9SZU1hdAorICAgICAgPyBWUk0tPmdldFJlTWF0SWQoVmlydFJlZykgOiBWUk0tPmdldFN0YWNrU2xvdChWaXJ0UmVnKTsKKyAgICB1bnNpZ25lZCBJblJlZyA9IFNwaWxscy5nZXRTcGlsbFNsb3RPclJlTWF0UGh5c1JlZyhTU29yUk1JZCk7CisgICAgaWYgKEluUmVnID09IFBoeXMpIHsKKyAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGF2YWlsYWJsZSBpbiB0aGUgZXhwZWN0ZWQgcmVnaXN0ZXIsIHNhdmUKKyAgICAgIC8vIGEgcmVsb2FkIC8gcmVtYXQuCisgICAgICBpZiAoU1NvclJNSWQpCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUmV1c2luZyBSTSMiCisgICAgICAgICAgICAgICAgICAgICA8PCBTU29yUk1JZC1WaXJ0UmVnTWFwOjpNQVhfU1RBQ0tfU0xPVC0xKTsKKyAgICAgIGVsc2UKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJSZXVzaW5nIFNTIyIgPDwgU1NvclJNSWQpOworICAgICAgREVCVUcoZGJncygpIDw8ICIgZnJvbSBwaHlzcmVnICIKKyAgICAgICAgICAgICAgICAgICA8PCBUUkktPmdldE5hbWUoSW5SZWcpIDw8ICIgZm9yIHZyZWciCisgICAgICAgICAgICAgICAgICAgPDwgVmlydFJlZyA8PCIgaW5zdGVhZCBvZiByZWxvYWRpbmcgaW50byBwaHlzcmVnICIKKyAgICAgICAgICAgICAgICAgICA8PCBUUkktPmdldE5hbWUoUGh5cykgPDwgJ1xuJyk7CisgICAgICArK051bU9taXR0ZWQ7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKEluUmVnICYmIEluUmVnICE9IFBoeXMpIHsKKyAgICAgIGlmIChTU29yUk1JZCkKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJSZXVzaW5nIFJNIyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IFNTb3JSTUlkLVZpcnRSZWdNYXA6Ok1BWF9TVEFDS19TTE9ULTEpOworICAgICAgZWxzZQorICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJldXNpbmcgU1MjIiA8PCBTU29yUk1JZCk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIiBmcm9tIHBoeXNyZWcgIgorICAgICAgICAgICAgICAgICAgIDw8IFRSSS0+Z2V0TmFtZShJblJlZykgPDwgIiBmb3IgdnJlZyIKKyAgICAgICAgICAgICAgICAgICA8PCBWaXJ0UmVnIDw8IiBieSBjb3B5aW5nIGl0IGludG8gcGh5c3JlZyAiCisgICAgICAgICAgICAgICAgICAgPDwgVFJJLT5nZXROYW1lKFBoeXMpIDw8ICdcbicpOworCisgICAgICAvLyBJZiB0aGUgcmVsb2FkZWQgLyByZW1hdCB2YWx1ZSBpcyBhdmFpbGFibGUgaW4gYW5vdGhlciByZWdpc3RlciwKKyAgICAgIC8vIGNvcHkgaXQgdG8gdGhlIGRlc2lyZWQgcmVnaXN0ZXIuCisKKyAgICAgIC8vIEJhY2stc2NoZWR1bGUgcmVsb2FkcyBhbmQgcmVtYXRzLgorICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydExvYyA9CisgICAgICAgIENvbXB1dGVSZWxvYWRMb2MoTUlJLCBNQkItPmJlZ2luKCksIFBoeXMsIFRSSSwgRG9SZU1hdCwgU1NvclJNSWQsIFRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqTUJCLT5nZXRQYXJlbnQoKSk7CisgICAgICBNYWNoaW5lSW5zdHIgKkNvcHlNSSA9IEJ1aWxkTUkoKk1CQiwgSW5zZXJ0TG9jLCBNSS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUktPmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLCBQaHlzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoSW5SZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKworICAgICAgLy8gVGhpcyBpbnZhbGlkYXRlcyBQaHlzLgorICAgICAgU3BpbGxzLkNsb2JiZXJQaHlzUmVnKFBoeXMpOworICAgICAgLy8gUmVtZW1iZXIgaXQncyBhdmFpbGFibGUuCisgICAgICBTcGlsbHMuYWRkQXZhaWxhYmxlKFNTb3JSTUlkLCBQaHlzKTsKKworICAgICAgQ29weU1JLT5zZXRBc21QcmludGVyRmxhZyhNYWNoaW5lSW5zdHI6OlJlbG9hZFJldXNlKTsKKyAgICAgIFVwZGF0ZUtpbGxzKCpDb3B5TUksIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworCisgICAgICBERUJVRyhkYmdzKCkgPDwgJ1x0JyA8PCAqQ29weU1JKTsKKyAgICAgICsrTnVtQ29waWZpZWQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBCYWNrLXNjaGVkdWxlIHJlbG9hZHMgYW5kIHJlbWF0cy4KKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0TG9jID0KKyAgICAgIENvbXB1dGVSZWxvYWRMb2MoTUlJLCBNQkItPmJlZ2luKCksIFBoeXMsIFRSSSwgRG9SZU1hdCwgU1NvclJNSWQsIFRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgKk1CQi0+Z2V0UGFyZW50KCkpOworCisgICAgaWYgKFZSTS0+aXNSZU1hdGVyaWFsaXplZChWaXJ0UmVnKSkgeworICAgICAgUmVNYXRlcmlhbGl6ZSgqTUJCLCBJbnNlcnRMb2MsIFBoeXMsIFZpcnRSZWcsIFRJSSwgVFJJLCAqVlJNKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogUkMgPSBNUkktPmdldFJlZ0NsYXNzKFZpcnRSZWcpOworICAgICAgVElJLT5sb2FkUmVnRnJvbVN0YWNrU2xvdCgqTUJCLCBJbnNlcnRMb2MsIFBoeXMsIFNTb3JSTUlkLCBSQywgVFJJKTsKKyAgICAgIE1hY2hpbmVJbnN0ciAqTG9hZE1JID0gcHJpb3IoSW5zZXJ0TG9jKTsKKyAgICAgIFZSTS0+YWRkU3BpbGxTbG90VXNlKFNTb3JSTUlkLCBMb2FkTUkpOworICAgICAgKytOdW1Mb2FkczsKKyAgICAgIERpc3RhbmNlTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihMb2FkTUksIERpc3RhbmNlTWFwLnNpemUoKSkpOworICAgIH0KKworICAgIC8vIFRoaXMgaW52YWxpZGF0ZXMgUGh5cy4KKyAgICBTcGlsbHMuQ2xvYmJlclBoeXNSZWcoUGh5cyk7CisgICAgLy8gUmVtZW1iZXIgaXQncyBhdmFpbGFibGUuCisgICAgU3BpbGxzLmFkZEF2YWlsYWJsZShTU29yUk1JZCwgUGh5cyk7CisKKyAgICBVcGRhdGVLaWxscygqcHJpb3IoSW5zZXJ0TG9jKSwgVFJJLCBSZWdLaWxscywgS2lsbE9wcyk7CisgICAgREVCVUcoZGJncygpIDw8ICdcdCcgPDwgKnByaW9yKE1JSSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gSW5zZXJ0RW1lcmdlbmN5U3BpbGxzIC0gSW5zZXJ0IHNwaWxscyBhZnRlciBNSSBpZiByZXF1ZXN0ZWQgYnkgVlJNLiBSZXR1cm4KKy8vLyB0cnVlIGlmIHNwaWxscyB3ZXJlIGluc2VydGVkLgorYm9vbCBMb2NhbFJld3JpdGVyOjpJbnNlcnRTcGlsbHMoTWFjaGluZUluc3RyICpNSSkgeworICBpZiAoIVZSTS0+aXNTcGlsbFB0KE1JKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSUkgPSBNSTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLGJvb2w+ID4gJlNwaWxsUmVncyA9CisgICAgVlJNLT5nZXRTcGlsbFB0U3BpbGxzKE1JKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNwaWxsUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgVmlydFJlZyA9IFNwaWxsUmVnc1tpXS5maXJzdDsKKyAgICBib29sIGlzS2lsbCA9IFNwaWxsUmVnc1tpXS5zZWNvbmQ7CisgICAgaWYgKCFWUk0tPmdldFByZVNwbGl0UmVnKFZpcnRSZWcpKQorICAgICAgY29udGludWU7IC8vIFNwbGl0IGludGVydmFsIHNwaWxsZWQgYWdhaW4uCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBNUkktPmdldFJlZ0NsYXNzKFZpcnRSZWcpOworICAgIHVuc2lnbmVkIFBoeXMgPSBWUk0tPmdldFBoeXMoVmlydFJlZyk7CisgICAgaW50IFN0YWNrU2xvdCA9IFZSTS0+Z2V0U3RhY2tTbG90KFZpcnRSZWcpOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBvbGROZXh0TUlJID0gbGx2bTo6bmV4dChNSUkpOworICAgIFRJSS0+c3RvcmVSZWdUb1N0YWNrU2xvdCgqTUJCLCBsbHZtOjpuZXh0KE1JSSksIFBoeXMsIGlzS2lsbCwgU3RhY2tTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQywgVFJJKTsKKyAgICBNYWNoaW5lSW5zdHIgKlN0b3JlTUkgPSBwcmlvcihvbGROZXh0TUlJKTsKKyAgICBWUk0tPmFkZFNwaWxsU2xvdFVzZShTdGFja1Nsb3QsIFN0b3JlTUkpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiU3RvcmU6XHQiIDw8ICpTdG9yZU1JKTsKKyAgICBWUk0tPnZpcnRGb2xkZWQoVmlydFJlZywgU3RvcmVNSSwgVmlydFJlZ01hcDo6aXNNb2QpOworICB9CisgIHJldHVybiB0cnVlOworfQorCisKKy8vLyByZXdyaXRlTUJCIC0gS2VlcCB0cmFjayBvZiB3aGljaCBzcGlsbHMgYXJlIGF2YWlsYWJsZSBldmVuIGFmdGVyIHRoZQorLy8vIHJlZ2lzdGVyIGFsbG9jYXRvciBpcyBkb25lIHdpdGggdGhlbS4gIElmIHBvc3NpYmxlLCBhdm9pZCByZWxvYWRpbmcgdnJlZ3MuCit2b2lkCitMb2NhbFJld3JpdGVyOjpSZXdyaXRlTUJCKExpdmVJbnRlcnZhbHMgKkxJcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlU3BpbGxzICZTcGlsbHMsIEJpdFZlY3RvciAmUmVnS2lsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kKj4gJktpbGxPcHMpIHsKKworICBERUJVRyhkYmdzKCkgPDwgIlxuKioqKiBMb2NhbCBzcGlsbGVyIHJld3JpdGluZyBNQkIgJyIKKyAgICAgICAgICAgICAgIDw8IE1CQi0+Z2V0TmFtZSgpIDw8ICInOlxuIik7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkItPmdldFBhcmVudCgpOworCisgIC8vIE1heWJlRGVhZFN0b3JlcyAtIFdoZW4gd2UgbmVlZCB0byB3cml0ZSBhIHZhbHVlIGJhY2sgaW50byBhIHN0YWNrIHNsb3QsCisgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIGluc2VydGVkIHN0b3JlLiAgSWYgdGhlIHN0YWNrIHNsb3QgdmFsdWUgaXMgbmV2ZXIgcmVhZAorICAvLyAoYmVjYXVzZSB0aGUgdmFsdWUgd2FzIHVzZWQgZnJvbSBzb21lIGF2YWlsYWJsZSByZWdpc3RlciwgZm9yIGV4YW1wbGUpLCBhbmQKKyAgLy8gc3Vic2VxdWVudGx5IHN0b3JlZCB0bywgdGhlIG9yaWdpbmFsIHN0b3JlIGlzIGRlYWQuICBUaGlzIG1hcCBrZWVwcyB0cmFjaworICAvLyBvZiBpbnNlcnRlZCBzdG9yZXMgdGhhdCBhcmUgbm90IHVzZWQuICBJZiB3ZSBzZWUgYSBzdWJzZXF1ZW50IHN0b3JlIHRvIHRoZQorICAvLyBzYW1lIHN0YWNrIHNsb3QsIHRoZSBvcmlnaW5hbCBzdG9yZSBpcyBkZWxldGVkLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPiBNYXliZURlYWRTdG9yZXM7CisgIE1heWJlRGVhZFN0b3Jlcy5yZXNpemUoTUYuZ2V0RnJhbWVJbmZvKCktPmdldE9iamVjdEluZGV4RW5kKCksIE5VTEwpOworCisgIC8vIFJlTWF0RGVmcyAtIFRoZXNlIGFyZSByZW1hdGVyaWFsaXphYmxlIGRlZiBNSXMgd2hpY2ggYXJlIG5vdCBkZWxldGVkLgorICBTbWFsbFNldDxNYWNoaW5lSW5zdHIqLCA0PiBSZU1hdERlZnM7CisKKyAgLy8gQ2xlYXIga2lsbCBpbmZvLgorICBTbWFsbFNldDx1bnNpZ25lZCwgMj4gS2lsbGVkTUlSZWdzOworCisgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIHJlZ2lzdGVycyB3ZSBoYXZlIGFscmVhZHkgc3BpbGxlZCBpbiBjYXNlIHRoZXJlIGFyZQorICAvLyBtdWx0aXBsZSBkZWZzIG9mIHRoZSBzYW1lIHJlZ2lzdGVyIGluIE1JLgorICBTbWFsbFNldDx1bnNpZ25lZCwgOD4gU3BpbGxlZE1JUmVnczsKKworICBSZWdLaWxscy5yZXNldCgpOworICBLaWxsT3BzLmNsZWFyKCk7CisgIEtpbGxPcHMucmVzaXplKFRSSS0+Z2V0TnVtUmVncygpLCBOVUxMKTsKKworICBEaXN0YW5jZU1hcC5jbGVhcigpOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSUkgPSBNQkItPmJlZ2luKCksIEUgPSBNQkItPmVuZCgpOworICAgICAgIE1JSSAhPSBFOyApIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTmV4dE1JSSA9IGxsdm06Om5leHQoTUlJKTsKKworICAgIGlmIChPcHRpbWl6ZUJ5VW5mb2xkKE1JSSwgTWF5YmVEZWFkU3RvcmVzLCBTcGlsbHMsIFJlZ0tpbGxzLCBLaWxsT3BzKSkKKyAgICAgIE5leHRNSUkgPSBsbHZtOjpuZXh0KE1JSSk7CisKKyAgICBpZiAoSW5zZXJ0RW1lcmdlbmN5U3BpbGxzKE1JSSkpCisgICAgICBOZXh0TUlJID0gbGx2bTo6bmV4dChNSUkpOworCisgICAgSW5zZXJ0UmVzdG9yZXMoTUlJLCBTcGlsbHMsIFJlZ0tpbGxzLCBLaWxsT3BzKTsKKworICAgIGlmIChJbnNlcnRTcGlsbHMoTUlJKSkKKyAgICAgIE5leHRNSUkgPSBsbHZtOjpuZXh0KE1JSSk7CisKKyAgICBib29sIEVyYXNlZCA9IGZhbHNlOworICAgIGJvb2wgQmFja1RyYWNrZWQgPSBmYWxzZTsKKyAgICBNYWNoaW5lSW5zdHIgJk1JID0gKk1JSTsKKworICAgIC8vIFJlbWVtYmVyIERiZ1ZhbHVlJ3Mgd2hpY2ggcmVmZXJlbmNlIHN0YWNrIHNsb3RzLgorICAgIGlmIChNSS5pc0RlYnVnVmFsdWUoKSAmJiBNSS5nZXRPcGVyYW5kKDApLmlzRkkoKSkKKyAgICAgIFNsb3QyRGJnVmFsdWVzW01JLmdldE9wZXJhbmQoMCkuZ2V0SW5kZXgoKV0ucHVzaF9iYWNrKCZNSSk7CisKKyAgICAvLy8gUmV1c2VkT3BlcmFuZHMgLSBLZWVwIHRyYWNrIG9mIG9wZXJhbmQgcmV1c2UgaW4gY2FzZSB3ZSBuZWVkIHRvIHVuZG8KKyAgICAvLy8gcmV1c2UuCisgICAgUmV1c2VJbmZvIFJldXNlZE9wZXJhbmRzKE1JLCBUUkkpOworICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBWaXJ0VXNlT3BzOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSB8fCBNTy5nZXRSZWcoKSA9PSAwKQorICAgICAgICBjb250aW51ZTsgICAvLyBJZ25vcmUgbm9uLXJlZ2lzdGVyIG9wZXJhbmRzLgorCisgICAgICB1bnNpZ25lZCBWaXJ0UmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoVmlydFJlZykpIHsKKyAgICAgICAgLy8gSWdub3JlIHBoeXNyZWdzIGZvciBzcGlsbGluZywgYnV0IHJlbWVtYmVyIHRoYXQgaXQgaXMgdXNlZCBieSB0aGlzCisgICAgICAgIC8vIGZ1bmN0aW9uLgorICAgICAgICBNUkktPnNldFBoeXNSZWdVc2VkKFZpcnRSZWcpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gV2Ugd2FudCB0byBwcm9jZXNzIGltcGxpY2l0IHZpcnR1YWwgcmVnaXN0ZXIgdXNlcyBmaXJzdC4KKyAgICAgIGlmIChNTy5pc0ltcGxpY2l0KCkpCisgICAgICAgIC8vIElmIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGlzIGltcGxpY2l0bHkgZGVmaW5lZCwgZW1pdCBhIGltcGxpY2l0X2RlZgorICAgICAgICAvLyBiZWZvcmUgc28gc2NhdmVuZ2VyIGtub3dzIGl0J3MgImRlZmluZWQiLgorICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhvcnJpYmxlIGhhY2sgZG9uZSB0aGUgYnkgcmVnaXN0ZXIgYWxsb2NhdG9yIHRvCisgICAgICAgIC8vIHJlbWF0IGEgZGVmaW5pdGlvbiB3aXRoIHZpcnR1YWwgcmVnaXN0ZXIgb3BlcmFuZC4KKyAgICAgICAgVmlydFVzZU9wcy5pbnNlcnQoVmlydFVzZU9wcy5iZWdpbigpLCBpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgVmlydFVzZU9wcy5wdXNoX2JhY2soaSk7CisgICAgfQorCisgICAgLy8gUHJvY2VzcyBhbGwgb2YgdGhlIHNwaWxsZWQgdXNlcyBhbmQgYWxsIG5vbiBzcGlsbGVkIHJlZyByZWZlcmVuY2VzLgorICAgIFNtYWxsVmVjdG9yPGludCwgMj4gUG90ZW50aWFsRGVhZFN0b3JlU2xvdHM7CisgICAgS2lsbGVkTUlSZWdzLmNsZWFyKCk7CisgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZSA9IFZpcnRVc2VPcHMuc2l6ZSgpOyBqICE9IGU7ICsraikgeworICAgICAgdW5zaWduZWQgaSA9IFZpcnRVc2VPcHNbal07CisgICAgICB1bnNpZ25lZCBWaXJ0UmVnID0gTUkuZ2V0T3BlcmFuZChpKS5nZXRSZWcoKTsKKyAgICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFZpcnRSZWcpICYmCisgICAgICAgICAgICAgIk5vdCBhIHZpcnR1YWwgcmVnaXN0ZXI/Iik7CisKKyAgICAgIHVuc2lnbmVkIFN1YklkeCA9IE1JLmdldE9wZXJhbmQoaSkuZ2V0U3ViUmVnKCk7CisgICAgICBpZiAoVlJNLT5pc0Fzc2lnbmVkUmVnKFZpcnRSZWcpKSB7CisgICAgICAgIC8vIFRoaXMgdmlydHVhbCByZWdpc3RlciB3YXMgYXNzaWduZWQgYSBwaHlzcmVnIQorICAgICAgICB1bnNpZ25lZCBQaHlzID0gVlJNLT5nZXRQaHlzKFZpcnRSZWcpOworICAgICAgICBNUkktPnNldFBoeXNSZWdVc2VkKFBoeXMpOworICAgICAgICBpZiAoTUkuZ2V0T3BlcmFuZChpKS5pc0RlZigpKQorICAgICAgICAgIFJldXNlZE9wZXJhbmRzLm1hcmtDbG9iYmVyZWQoUGh5cyk7CisgICAgICAgIHN1YnN0aXR1dGVQaHlzUmVnKE1JLmdldE9wZXJhbmQoaSksIFBoeXMsICpUUkkpOworICAgICAgICBpZiAoVlJNLT5pc0ltcGxpY2l0bHlEZWZpbmVkKFZpcnRSZWcpKQorICAgICAgICAgIC8vIEZJWE1FOiBJcyB0aGlzIG5lZWRlZD8KKyAgICAgICAgICBCdWlsZE1JKCpNQkIsICZNSSwgTUkuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGKSwgUGh5cyk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBUaGlzIHZpcnR1YWwgcmVnaXN0ZXIgaXMgbm93IGtub3duIHRvIGJlIGEgc3BpbGxlZCB2YWx1ZS4KKyAgICAgIGlmICghTUkuZ2V0T3BlcmFuZChpKS5pc1VzZSgpKQorICAgICAgICBjb250aW51ZTsgIC8vIEhhbmRsZSBkZWZzIGluIHRoZSBsb29wIGJlbG93IChoYW5kbGUgdXNlJmRlZiBoZXJlIHRob3VnaCkKKworICAgICAgYm9vbCBBdm9pZFJlbG9hZCA9IE1JLmdldE9wZXJhbmQoaSkuaXNVbmRlZigpOworICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgZGVmaW5lZCBieSBhbiBpbXBsaWNpdCBkZWYuIEl0IHNob3VsZCBub3QgYmUgc3BpbGxlZC4KKyAgICAgIC8vIE5vdGUsIHRoaXMgaXMgZm9yIGNvcnJlY3RuZXNzIHJlYXNvbi4gZS5nLgorICAgICAgLy8gOCAgICVyZWcxMDI0PGRlZj4gPSBJTVBMSUNJVF9ERUYKKyAgICAgIC8vIDEyICAlcmVnMTAyNDxkZWY+ID0gSU5TRVJUX1NVQlJFRyAlcmVnMTAyNDxraWxsPiwgJXJlZzEwMjUsIDIKKyAgICAgIC8vIFRoZSBsaXZlIHJhbmdlIFsxMiwgMTQpIGFyZSBub3QgcGFydCBvZiB0aGUgcjEwMjQgbGl2ZSBpbnRlcnZhbCBzaW5jZQorICAgICAgLy8gaXQncyBkZWZpbmVkIGJ5IGFuIGltcGxpY2l0IGRlZi4gSXQgd2lsbCBub3QgY29uZmxpY3RzIHdpdGggbGl2ZQorICAgICAgLy8gaW50ZXJ2YWwgb2YgcjEwMjUuIE5vdyBzdXBwb3NlIGJvdGggcmVnaXN0ZXJzIGFyZSBzcGlsbGVkLCB5b3UgY2FuCisgICAgICAvLyBlYXNpbHkgc2VlIGEgc2l0dWF0aW9uIHdoZXJlIGJvdGggcmVnaXN0ZXJzIGFyZSByZWxvYWRlZCBiZWZvcmUKKyAgICAgIC8vIHRoZSBJTlNFUlRfU1VCUkVHIGFuZCBib3RoIHRhcmdldCByZWdpc3RlcnMgdGhhdCB3b3VsZCBvdmVybGFwLgorICAgICAgYm9vbCBEb1JlTWF0ID0gVlJNLT5pc1JlTWF0ZXJpYWxpemVkKFZpcnRSZWcpOworICAgICAgaW50IFNTb3JSTUlkID0gRG9SZU1hdAorICAgICAgICA/IFZSTS0+Z2V0UmVNYXRJZChWaXJ0UmVnKSA6IFZSTS0+Z2V0U3RhY2tTbG90KFZpcnRSZWcpOworICAgICAgaW50IFJldXNlU2xvdCA9IFNTb3JSTUlkOworCisgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBzdGFjayBzbG90IGlzIGF2YWlsYWJsZS4KKyAgICAgIHVuc2lnbmVkIFBoeXNSZWcgPSBTcGlsbHMuZ2V0U3BpbGxTbG90T3JSZU1hdFBoeXNSZWcoU1NvclJNSWQpOworCisgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViLXJlZ2lzdGVyIHVzZSwgbWFrZSBzdXJlIHRoZSByZXVzZSByZWdpc3RlciBpcyBpbiB0aGUKKyAgICAgIC8vIHJpZ2h0IHJlZ2lzdGVyIGNsYXNzLiBGb3IgZXhhbXBsZSwgZm9yIHg4NiBub3QgYWxsIG9mIHRoZSAzMi1iaXQKKyAgICAgIC8vIHJlZ2lzdGVycyBoYXZlIGFjY2Vzc2libGUgc3ViLXJlZ2lzdGVycy4KKyAgICAgIC8vIFNpbWlsYXJseSBzbyBmb3IgRVhUUkFDVF9TVUJSRUcuIENvbnNpZGVyIHRoaXM6CisgICAgICAvLyBFREkgPSBvcAorICAgICAgLy8gTU9WMzJfbXIgZmkjMSwgRURJCisgICAgICAvLyAuLi4KKyAgICAgIC8vICAgICAgID0gRVhUUkFDVF9TVUJSRUcgZmkjMQorICAgICAgLy8gZmkjMSBpcyBhdmFpbGFibGUgaW4gRURJLCBidXQgaXQgY2Fubm90IGJlIHJldXNlZCBiZWNhdXNlIGl0J3Mgbm90IGluCisgICAgICAvLyB0aGUgcmlnaHQgcmVnaXN0ZXIgZmlsZS4KKyAgICAgIGlmIChQaHlzUmVnICYmICFBdm9pZFJlbG9hZCAmJiBTdWJJZHgpIHsKKyAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogUkMgPSBNUkktPmdldFJlZ0NsYXNzKFZpcnRSZWcpOworICAgICAgICBpZiAoIVJDLT5jb250YWlucyhQaHlzUmVnKSkKKyAgICAgICAgICBQaHlzUmVnID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKFBoeXNSZWcgJiYgIUF2b2lkUmVsb2FkKSB7CisgICAgICAgIC8vIFRoaXMgc3BpbGxlZCBvcGVyYW5kIG1pZ2h0IGJlIHBhcnQgb2YgYSB0d28tYWRkcmVzcyBvcGVyYW5kLiAgSWYgdGhpcworICAgICAgICAvLyBpcyB0aGUgY2FzZSwgdGhlbiBjaGFuZ2luZyBpdCB3aWxsIG5lY2Vzc2FyaWx5IHJlcXVpcmUgY2hhbmdpbmcgdGhlCisgICAgICAgIC8vIGRlZiBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiBhcyB3ZWxsLiAgSG93ZXZlciwgaW4gc29tZSBjYXNlcywgd2UKKyAgICAgICAgLy8gYXJlbid0IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSByZXVzZWQgcmVnaXN0ZXIuICBJZiBub25lIG9mIHRoZXNlIGNhc2VzCisgICAgICAgIC8vIGFwcGx5LCByZXVzZSBpdC4KKyAgICAgICAgYm9vbCBDYW5SZXVzZSA9IHRydWU7CisgICAgICAgIGJvb2wgaXNUaWVkID0gTUkuaXNSZWdUaWVkVG9EZWZPcGVyYW5kKGkpOworICAgICAgICBpZiAoaXNUaWVkKSB7CisgICAgICAgICAgLy8gT2theSwgd2UgaGF2ZSBhIHR3byBhZGRyZXNzIG9wZXJhbmQuICBXZSBjYW4gcmV1c2UgdGhpcyBwaHlzcmVnIGFzCisgICAgICAgICAgLy8gbG9uZyBhcyB3ZSBhcmUgYWxsb3dlZCB0byBjbG9iYmVyIHRoZSB2YWx1ZSBhbmQgdGhlcmUgaXNuJ3QgYW4KKyAgICAgICAgICAvLyBlYXJsaWVyIGRlZiB0aGF0IGhhcyBhbHJlYWR5IGNsb2JiZXJlZCB0aGUgcGh5c3JlZy4KKyAgICAgICAgICBDYW5SZXVzZSA9ICFSZXVzZWRPcGVyYW5kcy5pc0Nsb2JiZXJlZChQaHlzUmVnKSAmJgorICAgICAgICAgICAgU3BpbGxzLmNhbkNsb2JiZXJQaHlzUmVnKFBoeXNSZWcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENhblJldXNlKSB7CisgICAgICAgICAgLy8gSWYgdGhpcyBzdGFjayBzbG90IHZhbHVlIGlzIGFscmVhZHkgYXZhaWxhYmxlLCByZXVzZSBpdCEKKyAgICAgICAgICBpZiAoUmV1c2VTbG90ID4gVmlydFJlZ01hcDo6TUFYX1NUQUNLX1NMT1QpCisgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJldXNpbmcgUk0jIgorICAgICAgICAgICAgICAgICAgPDwgUmV1c2VTbG90LVZpcnRSZWdNYXA6Ok1BWF9TVEFDS19TTE9ULTEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUmV1c2luZyBTUyMiIDw8IFJldXNlU2xvdCk7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgZnJvbSBwaHlzcmVnICIKKyAgICAgICAgICAgICAgICA8PCBUUkktPmdldE5hbWUoUGh5c1JlZykgPDwgIiBmb3IgdnJlZyIKKyAgICAgICAgICAgICAgICA8PCBWaXJ0UmVnIDw8IiBpbnN0ZWFkIG9mIHJlbG9hZGluZyBpbnRvIHBoeXNyZWcgIgorICAgICAgICAgICAgICAgIDw8IFRSSS0+Z2V0TmFtZShWUk0tPmdldFBoeXMoVmlydFJlZykpIDw8ICdcbicpOworICAgICAgICAgIHVuc2lnbmVkIFJSZWcgPSBTdWJJZHggPyBUUkktPmdldFN1YlJlZyhQaHlzUmVnLCBTdWJJZHgpIDogUGh5c1JlZzsKKyAgICAgICAgICBNSS5nZXRPcGVyYW5kKGkpLnNldFJlZyhSUmVnKTsKKyAgICAgICAgICBNSS5nZXRPcGVyYW5kKGkpLnNldFN1YlJlZygwKTsKKworICAgICAgICAgIC8vIFRoZSBvbmx5IHRlY2huaWNhbCBkZXRhaWwgd2UgaGF2ZSBpcyB0aGF0IHdlIGRvbid0IGtub3cgdGhhdAorICAgICAgICAgIC8vIFBoeXNSZWcgd29uJ3QgYmUgY2xvYmJlcmVkIGJ5IGEgcmVsb2FkZWQgc3RhY2sgc2xvdCB0aGF0IG9jY3VycworICAgICAgICAgIC8vIGxhdGVyIGluIHRoZSBpbnN0cnVjdGlvbi4gIEluIHBhcnRpY3VsYXIsIGNvbnNpZGVyICdvcCBWMSwgVjInLgorICAgICAgICAgIC8vIElmIFYxIGlzIGF2YWlsYWJsZSBpbiBwaHlzcmVnIFIwLCB3ZSB3b3VsZCBjaG9vc2UgdG8gcmV1c2UgaXQKKyAgICAgICAgICAvLyBoZXJlLCBpbnN0ZWFkIG9mIHJlbG9hZGluZyBpdCBpbnRvIHRoZSByZWdpc3RlciB0aGUgYWxsb2NhdG9yCisgICAgICAgICAgLy8gaW5kaWNhdGVkIChzYXkgUjEpLiAgSG93ZXZlciwgVjIgbWlnaHQgaGF2ZSB0byBiZSByZWxvYWRlZAorICAgICAgICAgIC8vIGxhdGVyLCBhbmQgaXQgbWlnaHQgaW5kaWNhdGUgdGhhdCBpdCBuZWVkcyB0byBsaXZlIGluIFIwLiAgV2hlbgorICAgICAgICAgIC8vIHRoaXMgb2NjdXJzLCB3ZSBuZWVkIHRvIGhhdmUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRoYXQKKyAgICAgICAgICAvLyBpbmRpY2F0ZXMgaXQgaXMgc2FmZSB0byB1c2UgUjEgZm9yIHRoZSByZWxvYWQgaW5zdGVhZCBvZiBSMC4KKyAgICAgICAgICAvLworICAgICAgICAgIC8vIFRvIGZ1cnRoZXIgY29tcGxpY2F0ZSBtYXR0ZXJzLCB3ZSBtaWdodCBjb25mbGljdCB3aXRoIGFuIGFsaWFzLAorICAgICAgICAgIC8vIG9yIFIwIGFuZCBSMSBtaWdodCBub3QgYmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIuICBJbiB0aGlzCisgICAgICAgICAgLy8gY2FzZSwgd2UgYWN0dWFsbHkgaW5zZXJ0IGEgcmVsb2FkIGZvciBWMSBpbiBSMSwgZW5zdXJpbmcgdGhhdAorICAgICAgICAgIC8vIHdlIGNhbiBnZXQgYXQgUjAgb3IgaXRzIGFsaWFzLgorICAgICAgICAgIFJldXNlZE9wZXJhbmRzLmFkZFJldXNlKGksIFJldXNlU2xvdCwgUGh5c1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUk0tPmdldFBoeXMoVmlydFJlZyksIFZpcnRSZWcpOworICAgICAgICAgIGlmIChpc1RpZWQpCisgICAgICAgICAgICAvLyBPbmx5IG1hcmsgaXQgY2xvYmJlcmVkIGlmIHRoaXMgaXMgYSB1c2UmZGVmIG9wZXJhbmQuCisgICAgICAgICAgICBSZXVzZWRPcGVyYW5kcy5tYXJrQ2xvYmJlcmVkKFBoeXNSZWcpOworICAgICAgICAgICsrTnVtUmV1c2VkOworCisgICAgICAgICAgaWYgKE1JLmdldE9wZXJhbmQoaSkuaXNLaWxsKCkgJiYKKyAgICAgICAgICAgICAgUmV1c2VTbG90IDw9IFZpcnRSZWdNYXA6Ok1BWF9TVEFDS19TTE9UKSB7CisKKyAgICAgICAgICAgIC8vIFRoZSBzdG9yZSBvZiB0aGlzIHNwaWxsZWQgdmFsdWUgaXMgcG90ZW50aWFsbHkgZGVhZCwgYnV0IHdlCisgICAgICAgICAgICAvLyB3b24ndCBrbm93IGZvciBjZXJ0YWluIHVudGlsIHdlJ3ZlIGNvbmZpcm1lZCB0aGF0IHRoZSByZS11c2UKKyAgICAgICAgICAgIC8vIGFib3ZlIGlzIHZhbGlkLCB3aGljaCBtZWFucyB3YWl0aW5nIHVudGlsIHRoZSBvdGhlciBvcGVyYW5kcworICAgICAgICAgICAgLy8gYXJlIHByb2Nlc3NlZC4gRm9yIG5vdyB3ZSBqdXN0IHRyYWNrIHRoZSBzcGlsbCBzbG90LCB3ZSdsbAorICAgICAgICAgICAgLy8gcmVtb3ZlIGl0IGFmdGVyIHRoZSBvdGhlciBvcGVyYW5kcyBhcmUgcHJvY2Vzc2VkIGlmIHZhbGlkLgorCisgICAgICAgICAgICBQb3RlbnRpYWxEZWFkU3RvcmVTbG90cy5wdXNoX2JhY2soUmV1c2VTbG90KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBNYXJrIGlzIGlzS2lsbCBpZiBpdCdzIHRoZXJlIG5vIG90aGVyIHVzZXMgb2YgdGhlIHNhbWUgdmlydHVhbAorICAgICAgICAgIC8vIHJlZ2lzdGVyIGFuZCBpdCdzIG5vdCBhIHR3by1hZGRyZXNzIG9wZXJhbmQuIElzS2lsbCB3aWxsIGJlCisgICAgICAgICAgLy8gdW5zZXQgaWYgcmVnIGlzIHJldXNlZC4KKyAgICAgICAgICBpZiAoIWlzVGllZCAmJiBLaWxsZWRNSVJlZ3MuY291bnQoVmlydFJlZykgPT0gMCkgeworICAgICAgICAgICAgTUkuZ2V0T3BlcmFuZChpKS5zZXRJc0tpbGwoKTsKKyAgICAgICAgICAgIEtpbGxlZE1JUmVncy5pbnNlcnQoVmlydFJlZyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gIC8vIENhblJldXNlCisKKyAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGhhdmUgYSBzaXR1YXRpb24gd2hlcmUgd2UgaGF2ZSBhIHR3by1hZGRyZXNzIGluc3RydWN0aW9uCisgICAgICAgIC8vIHdob3NlIG1vZC9yZWYgb3BlcmFuZCBuZWVkcyB0byBiZSByZWxvYWRlZC4gIFRoaXMgcmVsb2FkIGlzIGFscmVhZHkKKyAgICAgICAgLy8gYXZhaWxhYmxlIGluIHNvbWUgcmVnaXN0ZXIgIlBoeXNSZWciLCBidXQgaWYgd2UgdXNlZCBQaHlzUmVnIGFzIHRoZQorICAgICAgICAvLyBvcGVyYW5kIHRvIG91ciAyLWFkZHIgaW5zdHJ1Y3Rpb24sIHRoZSBpbnN0cnVjdGlvbiB3b3VsZCBtb2RpZnkKKyAgICAgICAgLy8gUGh5c1JlZy4gIFRoaXMgaXNuJ3QgY29vbCBpZiBzb21ldGhpbmcgbGF0ZXIgdXNlcyBQaHlzUmVnIGFuZCBleHBlY3RzCisgICAgICAgIC8vIHRvIGdldCBpdHMgaW5pdGlhbCB2YWx1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCBhbmQgdG8gYXZvaWQgZG9pbmcgYSBsb2FkIHJpZ2h0IGFmdGVyIGEgc3RvcmUsCisgICAgICAgIC8vIHdlIGVtaXQgYSBjb3B5IGZyb20gUGh5c1JlZyBpbnRvIHRoZSBkZXNpZ25hdGVkIHJlZ2lzdGVyIGZvciB0aGlzCisgICAgICAgIC8vIG9wZXJhbmQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgY2FzZSBhbHNvIGFwcGxpZXMgdG8gYW4gZWFybHljbG9iYmVyJ2QgUGh5c1JlZy4KKyAgICAgICAgdW5zaWduZWQgRGVzaWduYXRlZFJlZyA9IFZSTS0+Z2V0UGh5cyhWaXJ0UmVnKTsKKyAgICAgICAgYXNzZXJ0KERlc2lnbmF0ZWRSZWcgJiYgIk11c3QgbWFwIHZpcnRyZWcgdG8gcGh5c3JlZyEiKTsKKworICAgICAgICAvLyBOb3RlIHRoYXQsIGlmIHdlIHJldXNlZCBhIHJlZ2lzdGVyIGZvciBhIHByZXZpb3VzIG9wZXJhbmQsIHRoZQorICAgICAgICAvLyByZWdpc3RlciB3ZSB3YW50IHRvIHJlbG9hZCBpbnRvIG1pZ2h0IG5vdCBhY3R1YWxseSBiZQorICAgICAgICAvLyBhdmFpbGFibGUuICBJZiB0aGlzIG9jY3VycywgdXNlIHRoZSByZWdpc3RlciBpbmRpY2F0ZWQgYnkgdGhlCisgICAgICAgIC8vIHJldXNlci4KKyAgICAgICAgaWYgKFJldXNlZE9wZXJhbmRzLmhhc1JldXNlcygpKQorICAgICAgICAgIERlc2lnbmF0ZWRSZWcgPSBSZXVzZWRPcGVyYW5kcy4KKyAgICAgICAgICAgIEdldFJlZ0ZvclJlbG9hZChWaXJ0UmVnLCBEZXNpZ25hdGVkUmVnLCAmTUksIFNwaWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXliZURlYWRTdG9yZXMsIFJlZ0tpbGxzLCBLaWxsT3BzLCAqVlJNKTsKKworICAgICAgICAvLyBJZiB0aGUgbWFwcGVkIGRlc2lnbmF0ZWQgcmVnaXN0ZXIgaXMgYWN0dWFsbHkgdGhlIHBoeXNyZWcgd2UgaGF2ZQorICAgICAgICAvLyBpbmNvbWluZywgd2UgZG9uJ3QgbmVlZCB0byBpbnNlcnRlZCBhIGRlYWQgY29weS4KKyAgICAgICAgaWYgKERlc2lnbmF0ZWRSZWcgPT0gUGh5c1JlZykgeworICAgICAgICAgIC8vIElmIHRoaXMgc3RhY2sgc2xvdCB2YWx1ZSBpcyBhbHJlYWR5IGF2YWlsYWJsZSwgcmV1c2UgaXQhCisgICAgICAgICAgaWYgKFJldXNlU2xvdCA+IFZpcnRSZWdNYXA6Ok1BWF9TVEFDS19TTE9UKQorICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJSZXVzaW5nIFJNIyIKKyAgICAgICAgICAgICAgICAgIDw8IFJldXNlU2xvdC1WaXJ0UmVnTWFwOjpNQVhfU1RBQ0tfU0xPVC0xKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJldXNpbmcgU1MjIiA8PCBSZXVzZVNsb3QpOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiIGZyb20gcGh5c3JlZyAiIDw8IFRSSS0+Z2V0TmFtZShQaHlzUmVnKQorICAgICAgICAgICAgICAgIDw8ICIgZm9yIHZyZWciIDw8IFZpcnRSZWcKKyAgICAgICAgICAgICAgICA8PCAiIGluc3RlYWQgb2YgcmVsb2FkaW5nIGludG8gc2FtZSBwaHlzcmVnLlxuIik7CisgICAgICAgICAgdW5zaWduZWQgUlJlZyA9IFN1YklkeCA/IFRSSS0+Z2V0U3ViUmVnKFBoeXNSZWcsIFN1YklkeCkgOiBQaHlzUmVnOworICAgICAgICAgIE1JLmdldE9wZXJhbmQoaSkuc2V0UmVnKFJSZWcpOworICAgICAgICAgIE1JLmdldE9wZXJhbmQoaSkuc2V0U3ViUmVnKDApOworICAgICAgICAgIFJldXNlZE9wZXJhbmRzLm1hcmtDbG9iYmVyZWQoUlJlZyk7CisgICAgICAgICAgKytOdW1SZXVzZWQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBNUkktPnNldFBoeXNSZWdVc2VkKERlc2lnbmF0ZWRSZWcpOworICAgICAgICBSZXVzZWRPcGVyYW5kcy5tYXJrQ2xvYmJlcmVkKERlc2lnbmF0ZWRSZWcpOworCisgICAgICAgIC8vIEJhY2stc2NoZWR1bGUgcmVsb2FkcyBhbmQgcmVtYXRzLgorICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0TG9jID0KKyAgICAgICAgICBDb21wdXRlUmVsb2FkTG9jKCZNSSwgTUJCLT5iZWdpbigpLCBQaHlzUmVnLCBUUkksIERvUmVNYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTU29yUk1JZCwgVElJLCBNRik7CisgICAgICAgIE1hY2hpbmVJbnN0ciAqQ29weU1JID0gQnVpbGRNSSgqTUJCLCBJbnNlcnRMb2MsIE1JLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUktPmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzaWduYXRlZFJlZykuYWRkUmVnKFBoeXNSZWcpOworICAgICAgICBDb3B5TUktPnNldEFzbVByaW50ZXJGbGFnKE1hY2hpbmVJbnN0cjo6UmVsb2FkUmV1c2UpOworICAgICAgICBVcGRhdGVLaWxscygqQ29weU1JLCBUUkksIFJlZ0tpbGxzLCBLaWxsT3BzKTsKKworICAgICAgICAvLyBUaGlzIGludmFsaWRhdGVzIERlc2lnbmF0ZWRSZWcuCisgICAgICAgIFNwaWxscy5DbG9iYmVyUGh5c1JlZyhEZXNpZ25hdGVkUmVnKTsKKworICAgICAgICBTcGlsbHMuYWRkQXZhaWxhYmxlKFJldXNlU2xvdCwgRGVzaWduYXRlZFJlZyk7CisgICAgICAgIHVuc2lnbmVkIFJSZWcgPQorICAgICAgICAgIFN1YklkeCA/IFRSSS0+Z2V0U3ViUmVnKERlc2lnbmF0ZWRSZWcsIFN1YklkeCkgOiBEZXNpZ25hdGVkUmVnOworICAgICAgICBNSS5nZXRPcGVyYW5kKGkpLnNldFJlZyhSUmVnKTsKKyAgICAgICAgTUkuZ2V0T3BlcmFuZChpKS5zZXRTdWJSZWcoMCk7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAnXHQnIDw8ICpwcmlvcihNSUkpKTsKKyAgICAgICAgKytOdW1SZXVzZWQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSAvLyBpZiAoUGh5c1JlZykKKworICAgICAgICAvLyBPdGhlcndpc2UsIHJlbG9hZCBpdCBhbmQgcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIGl0LgorICAgICAgUGh5c1JlZyA9IFZSTS0+Z2V0UGh5cyhWaXJ0UmVnKTsKKyAgICAgIGFzc2VydChQaHlzUmVnICYmICJNdXN0IG1hcCB2aXJ0cmVnIHRvIHBoeXNyZWchIik7CisKKyAgICAgIC8vIE5vdGUgdGhhdCwgaWYgd2UgcmV1c2VkIGEgcmVnaXN0ZXIgZm9yIGEgcHJldmlvdXMgb3BlcmFuZCwgdGhlCisgICAgICAvLyByZWdpc3RlciB3ZSB3YW50IHRvIHJlbG9hZCBpbnRvIG1pZ2h0IG5vdCBhY3R1YWxseSBiZQorICAgICAgLy8gYXZhaWxhYmxlLiAgSWYgdGhpcyBvY2N1cnMsIHVzZSB0aGUgcmVnaXN0ZXIgaW5kaWNhdGVkIGJ5IHRoZQorICAgICAgLy8gcmV1c2VyLgorICAgICAgaWYgKFJldXNlZE9wZXJhbmRzLmhhc1JldXNlcygpKQorICAgICAgICBQaHlzUmVnID0gUmV1c2VkT3BlcmFuZHMuR2V0UmVnRm9yUmVsb2FkKFZpcnRSZWcsIFBoeXNSZWcsICZNSSwKKyAgICAgICAgICAgICAgICAgICAgU3BpbGxzLCBNYXliZURlYWRTdG9yZXMsIFJlZ0tpbGxzLCBLaWxsT3BzLCAqVlJNKTsKKworICAgICAgTVJJLT5zZXRQaHlzUmVnVXNlZChQaHlzUmVnKTsKKyAgICAgIFJldXNlZE9wZXJhbmRzLm1hcmtDbG9iYmVyZWQoUGh5c1JlZyk7CisgICAgICBpZiAoQXZvaWRSZWxvYWQpCisgICAgICAgICsrTnVtQXZvaWRlZDsKKyAgICAgIGVsc2UgeworICAgICAgICAvLyBCYWNrLXNjaGVkdWxlIHJlbG9hZHMgYW5kIHJlbWF0cy4KKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydExvYyA9CisgICAgICAgICAgQ29tcHV0ZVJlbG9hZExvYyhNSUksIE1CQi0+YmVnaW4oKSwgUGh5c1JlZywgVFJJLCBEb1JlTWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NvclJNSWQsIFRJSSwgTUYpOworCisgICAgICAgIGlmIChEb1JlTWF0KSB7CisgICAgICAgICAgUmVNYXRlcmlhbGl6ZSgqTUJCLCBJbnNlcnRMb2MsIFBoeXNSZWcsIFZpcnRSZWcsIFRJSSwgVFJJLCAqVlJNKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBSQyA9IE1SSS0+Z2V0UmVnQ2xhc3MoVmlydFJlZyk7CisgICAgICAgICAgVElJLT5sb2FkUmVnRnJvbVN0YWNrU2xvdCgqTUJCLCBJbnNlcnRMb2MsIFBoeXNSZWcsIFNTb3JSTUlkLCBSQyxUUkkpOworICAgICAgICAgIE1hY2hpbmVJbnN0ciAqTG9hZE1JID0gcHJpb3IoSW5zZXJ0TG9jKTsKKyAgICAgICAgICBWUk0tPmFkZFNwaWxsU2xvdFVzZShTU29yUk1JZCwgTG9hZE1JKTsKKyAgICAgICAgICArK051bUxvYWRzOworICAgICAgICAgIERpc3RhbmNlTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihMb2FkTUksIERpc3RhbmNlTWFwLnNpemUoKSkpOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgaW52YWxpZGF0ZXMgUGh5c1JlZy4KKyAgICAgICAgU3BpbGxzLkNsb2JiZXJQaHlzUmVnKFBoeXNSZWcpOworCisgICAgICAgIC8vIEFueSBzdG9yZXMgdG8gdGhpcyBzdGFjayBzbG90IGFyZSBub3QgZGVhZCBhbnltb3JlLgorICAgICAgICBpZiAoIURvUmVNYXQpCisgICAgICAgICAgTWF5YmVEZWFkU3RvcmVzW1NTb3JSTUlkXSA9IE5VTEw7CisgICAgICAgIFNwaWxscy5hZGRBdmFpbGFibGUoU1NvclJNSWQsIFBoeXNSZWcpOworICAgICAgICAvLyBBc3N1bWVzIHRoaXMgaXMgdGhlIGxhc3QgdXNlLiBJc0tpbGwgd2lsbCBiZSB1bnNldCBpZiByZWcgaXMgcmV1c2VkCisgICAgICAgIC8vIHVubGVzcyBpdCdzIGEgdHdvLWFkZHJlc3Mgb3BlcmFuZC4KKyAgICAgICAgaWYgKCFNSS5pc1JlZ1RpZWRUb0RlZk9wZXJhbmQoaSkgJiYKKyAgICAgICAgICAgIEtpbGxlZE1JUmVncy5jb3VudChWaXJ0UmVnKSA9PSAwKSB7CisgICAgICAgICAgTUkuZ2V0T3BlcmFuZChpKS5zZXRJc0tpbGwoKTsKKyAgICAgICAgICBLaWxsZWRNSVJlZ3MuaW5zZXJ0KFZpcnRSZWcpOworICAgICAgICB9CisKKyAgICAgICAgVXBkYXRlS2lsbHMoKnByaW9yKEluc2VydExvYyksIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgJ1x0JyA8PCAqcHJpb3IoSW5zZXJ0TG9jKSk7CisgICAgICB9CisgICAgICB1bnNpZ25lZCBSUmVnID0gU3ViSWR4ID8gVFJJLT5nZXRTdWJSZWcoUGh5c1JlZywgU3ViSWR4KSA6IFBoeXNSZWc7CisgICAgICBNSS5nZXRPcGVyYW5kKGkpLnNldFJlZyhSUmVnKTsKKyAgICAgIE1JLmdldE9wZXJhbmQoaSkuc2V0U3ViUmVnKDApOworICAgIH0KKworICAgIC8vIE9rIC0gbm93IHdlIGNhbiByZW1vdmUgc3RvcmVzIHRoYXQgaGF2ZSBiZWVuIGNvbmZpcm1lZCBkZWFkLgorICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGUgPSBQb3RlbnRpYWxEZWFkU3RvcmVTbG90cy5zaXplKCk7IGogIT0gZTsgKytqKSB7CisgICAgICAvLyBUaGlzIHdhcyB0aGUgbGFzdCB1c2UgYW5kIHRoZSBzcGlsbGVkIHZhbHVlIGlzIHN0aWxsIGF2YWlsYWJsZQorICAgICAgLy8gZm9yIHJldXNlLiBUaGF0IG1lYW5zIHRoZSBzcGlsbCB3YXMgdW5uZWNlc3NhcnkhCisgICAgICBpbnQgUERTU2xvdCA9IFBvdGVudGlhbERlYWRTdG9yZVNsb3RzW2pdOworICAgICAgTWFjaGluZUluc3RyKiBEZWFkU3RvcmUgPSBNYXliZURlYWRTdG9yZXNbUERTU2xvdF07CisgICAgICBpZiAoRGVhZFN0b3JlKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUmVtb3ZlZCBkZWFkIHN0b3JlOlx0IiA8PCAqRGVhZFN0b3JlKTsKKyAgICAgICAgSW52YWxpZGF0ZUtpbGxzKCpEZWFkU3RvcmUsIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgICAgICBWUk0tPlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKERlYWRTdG9yZSk7CisgICAgICAgIE1CQi0+ZXJhc2UoRGVhZFN0b3JlKTsKKyAgICAgICAgTWF5YmVEZWFkU3RvcmVzW1BEU1Nsb3RdID0gTlVMTDsKKyAgICAgICAgKytOdW1EU0U7CisgICAgICB9CisgICAgfQorCisKKyAgICBERUJVRyhkYmdzKCkgPDwgJ1x0JyA8PCBNSSk7CisKKworICAgIC8vIElmIHdlIGhhdmUgZm9sZGVkIHJlZmVyZW5jZXMgdG8gbWVtb3J5IG9wZXJhbmRzLCBtYWtlIHN1cmUgd2UgY2xlYXIgYWxsCisgICAgLy8gcGh5c2ljYWwgcmVnaXN0ZXJzIHRoYXQgbWF5IGNvbnRhaW4gdGhlIHZhbHVlIG9mIHRoZSBzcGlsbGVkIHZpcnR1YWwKKyAgICAvLyByZWdpc3RlcgorCisgICAgLy8gQ29weSB0aGUgZm9sZGVkIHZpcnRzIHRvIGEgc21hbGwgdmVjdG9yLCB3ZSBtYXkgY2hhbmdlIE1JMlZpcnRNYXAuCisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBWaXJ0UmVnTWFwOjpNb2RSZWY+LCA0PiBGb2xkZWRWaXJ0czsKKyAgICAvLyBDKysweCBGVFchCisgICAgZm9yIChzdGQ6OnBhaXI8VmlydFJlZ01hcDo6TUkyVmlydE1hcFR5Ojpjb25zdF9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICBWaXJ0UmVnTWFwOjpNSTJWaXJ0TWFwVHk6OmNvbnN0X2l0ZXJhdG9yPiBGVlJhbmdlID0KKyAgICAgICAgICAgVlJNLT5nZXRGb2xkZWRWaXJ0cygmTUkpOworICAgICAgICAgRlZSYW5nZS5maXJzdCAhPSBGVlJhbmdlLnNlY29uZDsgKytGVlJhbmdlLmZpcnN0KQorICAgICAgRm9sZGVkVmlydHMucHVzaF9iYWNrKEZWUmFuZ2UuZmlyc3QtPnNlY29uZCk7CisKKyAgICBTbWFsbFNldDxpbnQsIDI+IEZvbGRlZFNTOworICAgIGZvciAodW5zaWduZWQgRlZJID0gMCwgRlZFID0gRm9sZGVkVmlydHMuc2l6ZSgpOyBGVkkgIT0gRlZFOyArK0ZWSSkgeworICAgICAgdW5zaWduZWQgVmlydFJlZyA9IEZvbGRlZFZpcnRzW0ZWSV0uZmlyc3Q7CisgICAgICBWaXJ0UmVnTWFwOjpNb2RSZWYgTVIgPSBGb2xkZWRWaXJ0c1tGVkldLnNlY29uZDsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRm9sZGVkIHZyZWc6ICIgPDwgVmlydFJlZyA8PCAiICBNUjogIiA8PCBNUik7CisKKyAgICAgIGludCBTUyA9IFZSTS0+Z2V0U3RhY2tTbG90KFZpcnRSZWcpOworICAgICAgaWYgKFNTID09IFZpcnRSZWdNYXA6Ok5PX1NUQUNLX1NMT1QpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgRm9sZGVkU1MuaW5zZXJ0KFNTKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiIC0gU3RhY2tTbG90OiAiIDw8IFNTIDw8ICJcbiIpOworCisgICAgICAvLyBJZiB0aGlzIGZvbGRlZCBpbnN0cnVjdGlvbiBpcyBqdXN0IGEgdXNlLCBjaGVjayB0byBzZWUgaWYgaXQncyBhCisgICAgICAvLyBzdHJhaWdodCBsb2FkIGZyb20gdGhlIHZpcnQgcmVnIHNsb3QuCisgICAgICBpZiAoKE1SICYgVmlydFJlZ01hcDo6aXNSZWYpICYmICEoTVIgJiBWaXJ0UmVnTWFwOjppc01vZCkpIHsKKyAgICAgICAgaW50IEZyYW1lSWR4OworICAgICAgICB1bnNpZ25lZCBEZXN0UmVnID0gVElJLT5pc0xvYWRGcm9tU3RhY2tTbG90KCZNSSwgRnJhbWVJZHgpOworICAgICAgICBpZiAoRGVzdFJlZyAmJiBGcmFtZUlkeCA9PSBTUykgeworICAgICAgICAgIC8vIElmIHRoaXMgc3BpbGwgc2xvdCBpcyBhdmFpbGFibGUsIHR1cm4gaXQgaW50byBhIGNvcHkgKG9yIG5vdGhpbmcpCisgICAgICAgICAgLy8gaW5zdGVhZCBvZiBsZWF2aW5nIGl0IGFzIGEgbG9hZCEKKyAgICAgICAgICBpZiAodW5zaWduZWQgSW5SZWcgPSBTcGlsbHMuZ2V0U3BpbGxTbG90T3JSZU1hdFBoeXNSZWcoU1MpKSB7CisgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlByb21vdGVkIExvYWQgVG8gQ29weTogIiA8PCBNSSk7CisgICAgICAgICAgICBpZiAoRGVzdFJlZyAhPSBJblJlZykgeworICAgICAgICAgICAgICBNYWNoaW5lT3BlcmFuZCAqRGVmTU8gPSBNSS5maW5kUmVnaXN0ZXJEZWZPcGVyYW5kKERlc3RSZWcpOworICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKkNvcHlNSSA9IEJ1aWxkTUkoKk1CQiwgJk1JLCBNSS5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSkKKyAgICAgICAgICAgICAgICAuYWRkUmVnKERlc3RSZWcsIFJlZ1N0YXRlOjpEZWZpbmUsIERlZk1PLT5nZXRTdWJSZWcoKSkKKyAgICAgICAgICAgICAgICAuYWRkUmVnKEluUmVnLCBSZWdTdGF0ZTo6S2lsbCk7CisgICAgICAgICAgICAgIC8vIFJldmlzaXQgdGhlIGNvcHkgc28gd2UgbWFrZSBzdXJlIHRvIG5vdGljZSB0aGUgZWZmZWN0cyBvZiB0aGUKKyAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uIG9uIHRoZSBkZXN0cmVnIChlaXRoZXIgbmVlZGluZyB0byBSQSBpdCBpZiBpdCdzCisgICAgICAgICAgICAgIC8vIHZpcnR1YWwgb3IgbmVlZGluZyB0byBjbG9iYmVyIGFueSB2YWx1ZXMgaWYgaXQncyBwaHlzaWNhbCkuCisgICAgICAgICAgICAgIE5leHRNSUkgPSBDb3B5TUk7CisgICAgICAgICAgICAgIE5leHRNSUktPnNldEFzbVByaW50ZXJGbGFnKE1hY2hpbmVJbnN0cjo6UmVsb2FkUmV1c2UpOworICAgICAgICAgICAgICBCYWNrVHJhY2tlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlbW92aW5nIG5vdy1ub29wIGNvcHk6ICIgPDwgTUkpOworICAgICAgICAgICAgICAvLyBVbnNldCBsYXN0IGtpbGwgc2luY2UgaXQncyBiZWluZyByZXVzZWQuCisgICAgICAgICAgICAgIEludmFsaWRhdGVLaWxsKEluUmVnLCBUUkksIFJlZ0tpbGxzLCBLaWxsT3BzKTsKKyAgICAgICAgICAgICAgU3BpbGxzLmRpc2FsbG93Q2xvYmJlclBoeXNSZWcoSW5SZWcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnZhbGlkYXRlS2lsbHMoTUksIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgICAgICAgICAgVlJNLT5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcygmTUkpOworICAgICAgICAgICAgTUJCLT5lcmFzZSgmTUkpOworICAgICAgICAgICAgRXJhc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gUHJvY2Vzc05leHRJbnN0OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1bnNpZ25lZCBQaHlzUmVnID0gU3BpbGxzLmdldFNwaWxsU2xvdE9yUmVNYXRQaHlzUmVnKFNTKTsKKyAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBOZXdNSXM7CisgICAgICAgICAgaWYgKFBoeXNSZWcgJiYKKyAgICAgICAgICAgICAgVElJLT51bmZvbGRNZW1vcnlPcGVyYW5kKE1GLCAmTUksIFBoeXNSZWcsIGZhbHNlLCBmYWxzZSwgTmV3TUlzKSl7CisgICAgICAgICAgICBNQkItPmluc2VydChNSUksIE5ld01Jc1swXSk7CisgICAgICAgICAgICBJbnZhbGlkYXRlS2lsbHMoTUksIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgICAgICAgICAgVlJNLT5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcygmTUkpOworICAgICAgICAgICAgTUJCLT5lcmFzZSgmTUkpOworICAgICAgICAgICAgRXJhc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIC0tTmV4dE1JSTsgIC8vIGJhY2t0cmFjayB0byB0aGUgdW5mb2xkZWQgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgICBCYWNrVHJhY2tlZCA9IHRydWU7CisgICAgICAgICAgICBnb3RvIFByb2Nlc3NOZXh0SW5zdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhpcyByZWZlcmVuY2UgaXMgbm90IGEgdXNlLCBhbnkgcHJldmlvdXMgc3RvcmUgaXMgbm93IGRlYWQuCisgICAgICAvLyBPdGhlcndpc2UsIHRoZSBzdG9yZSB0byB0aGlzIHN0YWNrIHNsb3QgaXMgbm90IGRlYWQgYW55bW9yZS4KKyAgICAgIE1hY2hpbmVJbnN0ciogRGVhZFN0b3JlID0gTWF5YmVEZWFkU3RvcmVzW1NTXTsKKyAgICAgIGlmIChEZWFkU3RvcmUpIHsKKyAgICAgICAgYm9vbCBpc0RlYWQgPSAhKE1SICYgVmlydFJlZ01hcDo6aXNSZWYpOworICAgICAgICBNYWNoaW5lSW5zdHIgKk5ld1N0b3JlID0gTlVMTDsKKyAgICAgICAgaWYgKE1SICYgVmlydFJlZ01hcDo6aXNNb2RSZWYpIHsKKyAgICAgICAgICB1bnNpZ25lZCBQaHlzUmVnID0gU3BpbGxzLmdldFNwaWxsU2xvdE9yUmVNYXRQaHlzUmVnKFNTKTsKKyAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBOZXdNSXM7CisgICAgICAgICAgLy8gV2UgY2FuIHJldXNlIHRoaXMgcGh5c3JlZyBhcyBsb25nIGFzIHdlIGFyZSBhbGxvd2VkIHRvIGNsb2JiZXIKKyAgICAgICAgICAvLyB0aGUgdmFsdWUgYW5kIHRoZXJlIGlzbid0IGFuIGVhcmxpZXIgZGVmIHRoYXQgaGFzIGFscmVhZHkgY2xvYmJlcmVkCisgICAgICAgICAgLy8gdGhlIHBoeXNyZWcuCisgICAgICAgICAgaWYgKFBoeXNSZWcgJiYKKyAgICAgICAgICAgICAgIVJldXNlZE9wZXJhbmRzLmlzQ2xvYmJlcmVkKFBoeXNSZWcpICYmCisgICAgICAgICAgICAgIFNwaWxscy5jYW5DbG9iYmVyUGh5c1JlZyhQaHlzUmVnKSAmJgorICAgICAgICAgICAgICAhVElJLT5pc1N0b3JlVG9TdGFja1Nsb3QoJk1JLCBTUykpIHsgLy8gTm90IHByb2ZpdGFibGUhCisgICAgICAgICAgICBNYWNoaW5lT3BlcmFuZCAqS2lsbE9wbmQgPQorICAgICAgICAgICAgICBEZWFkU3RvcmUtPmZpbmRSZWdpc3RlclVzZU9wZXJhbmQoUGh5c1JlZywgdHJ1ZSk7CisgICAgICAgICAgICAvLyBOb3RlLCBpZiB0aGUgc3RvcmUgaXMgc3RvcmluZyBhIHN1Yi1yZWdpc3RlciwgaXQncyBwb3NzaWJsZSB0aGUKKyAgICAgICAgICAgIC8vIHN1cGVyLXJlZ2lzdGVyIGlzIG5lZWRlZCBiZWxvdy4KKyAgICAgICAgICAgIGlmIChLaWxsT3BuZCAmJiAhS2lsbE9wbmQtPmdldFN1YlJlZygpICYmCisgICAgICAgICAgICAgICAgVElJLT51bmZvbGRNZW1vcnlPcGVyYW5kKE1GLCAmTUksIFBoeXNSZWcsIGZhbHNlLCB0cnVlLE5ld01JcykpeworICAgICAgICAgICAgICBNQkItPmluc2VydChNSUksIE5ld01Jc1swXSk7CisgICAgICAgICAgICAgIE5ld1N0b3JlID0gTmV3TUlzWzFdOworICAgICAgICAgICAgICBNQkItPmluc2VydChNSUksIE5ld1N0b3JlKTsKKyAgICAgICAgICAgICAgVlJNLT5hZGRTcGlsbFNsb3RVc2UoU1MsIE5ld1N0b3JlKTsKKyAgICAgICAgICAgICAgSW52YWxpZGF0ZUtpbGxzKE1JLCBUUkksIFJlZ0tpbGxzLCBLaWxsT3BzKTsKKyAgICAgICAgICAgICAgVlJNLT5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcygmTUkpOworICAgICAgICAgICAgICBNQkItPmVyYXNlKCZNSSk7CisgICAgICAgICAgICAgIEVyYXNlZCA9IHRydWU7CisgICAgICAgICAgICAgIC0tTmV4dE1JSTsKKyAgICAgICAgICAgICAgLS1OZXh0TUlJOyAgLy8gYmFja3RyYWNrIHRvIHRoZSB1bmZvbGRlZCBpbnN0cnVjdGlvbi4KKyAgICAgICAgICAgICAgQmFja1RyYWNrZWQgPSB0cnVlOworICAgICAgICAgICAgICBpc0RlYWQgPSB0cnVlOworICAgICAgICAgICAgICArK051bVNVbmZvbGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzRGVhZCkgeyAgLy8gUHJldmlvdXMgc3RvcmUgaXMgZGVhZC4KKyAgICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgdGhlIHN0b3JlIGlzIGRlYWQsIG51a2UgaXQgbm93LgorICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUmVtb3ZlZCBkZWFkIHN0b3JlOlx0IiA8PCAqRGVhZFN0b3JlKTsKKyAgICAgICAgICBJbnZhbGlkYXRlS2lsbHMoKkRlYWRTdG9yZSwgVFJJLCBSZWdLaWxscywgS2lsbE9wcyk7CisgICAgICAgICAgVlJNLT5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhEZWFkU3RvcmUpOworICAgICAgICAgIE1CQi0+ZXJhc2UoRGVhZFN0b3JlKTsKKyAgICAgICAgICBpZiAoIU5ld1N0b3JlKQorICAgICAgICAgICAgKytOdW1EU0U7CisgICAgICAgIH0KKworICAgICAgICBNYXliZURlYWRTdG9yZXNbU1NdID0gTlVMTDsKKyAgICAgICAgaWYgKE5ld1N0b3JlKSB7CisgICAgICAgICAgLy8gVHJlYXQgdGhpcyBzdG9yZSBhcyBhIHNwaWxsIG1lcmdlZCBpbnRvIGEgY29weS4gVGhhdCBtYWtlcyB0aGUKKyAgICAgICAgICAvLyBzdGFjayBzbG90IHZhbHVlIGF2YWlsYWJsZS4KKyAgICAgICAgICBWUk0tPnZpcnRGb2xkZWQoVmlydFJlZywgTmV3U3RvcmUsIFZpcnRSZWdNYXA6OmlzTW9kKTsKKyAgICAgICAgICBnb3RvIFByb2Nlc3NOZXh0SW5zdDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBJZiB0aGUgc3BpbGwgc2xvdCB2YWx1ZSBpcyBhdmFpbGFibGUsIGFuZCB0aGlzIGlzIGEgbmV3IGRlZmluaXRpb24gb2YKKyAgICAgIC8vIHRoZSB2YWx1ZSwgdGhlIHZhbHVlIGlzIG5vdCBhdmFpbGFibGUgYW55bW9yZS4KKyAgICAgIGlmIChNUiAmIFZpcnRSZWdNYXA6OmlzTW9kKSB7CisgICAgICAgIC8vIE5vdGljZSB0aGF0IHRoZSB2YWx1ZSBpbiB0aGlzIHN0YWNrIHNsb3QgaGFzIGJlZW4gbW9kaWZpZWQuCisgICAgICAgIFNwaWxscy5Nb2RpZnlTdGFja1Nsb3RPclJlTWF0KFNTKTsKKworICAgICAgICAvLyBJZiB0aGlzIGlzICpqdXN0KiBhIG1vZCBvZiB0aGUgdmFsdWUsIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGp1c3QgYQorICAgICAgICAvLyBzdG9yZSB0byB0aGUgc3BpbGwgc2xvdCAoaS5lLiB0aGUgc3BpbGwgZ290IG1lcmdlZCBpbnRvIHRoZSBjb3B5KS4gSWYKKyAgICAgICAgLy8gc28sIHJlYWxpemUgdGhhdCB0aGUgdnJlZyBpcyBhdmFpbGFibGUgbm93LCBhbmQgYWRkIHRoZSBzdG9yZSB0byB0aGUKKyAgICAgICAgLy8gTWF5YmVEZWFkU3RvcmUgaW5mby4KKyAgICAgICAgaW50IFN0YWNrU2xvdDsKKyAgICAgICAgaWYgKCEoTVIgJiBWaXJ0UmVnTWFwOjppc1JlZikpIHsKKyAgICAgICAgICBpZiAodW5zaWduZWQgU3JjUmVnID0gVElJLT5pc1N0b3JlVG9TdGFja1Nsb3QoJk1JLCBTdGFja1Nsb3QpKSB7CisgICAgICAgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoU3JjUmVnKSAmJgorICAgICAgICAgICAgICAgICAgICJTcmMgaGFzbid0IGJlZW4gYWxsb2NhdGVkIHlldD8iKTsKKworICAgICAgICAgICAgaWYgKENvbW11dGVUb0ZvbGRSZWxvYWQoTUlJLCBWaXJ0UmVnLCBTcmNSZWcsIFN0YWNrU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwaWxscywgUmVnS2lsbHMsIEtpbGxPcHMsIFRSSSkpIHsKKyAgICAgICAgICAgICAgTmV4dE1JSSA9IGxsdm06Om5leHQoTUlJKTsKKyAgICAgICAgICAgICAgQmFja1RyYWNrZWQgPSB0cnVlOworICAgICAgICAgICAgICBnb3RvIFByb2Nlc3NOZXh0SW5zdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT2theSwgdGhpcyBpcyBjZXJ0YWlubHkgYSBzdG9yZSBvZiBTcmNSZWcgdG8gW1N0YWNrU2xvdF0uICBNYXJrCisgICAgICAgICAgICAvLyB0aGlzIGFzIGEgcG90ZW50aWFsbHkgZGVhZCBzdG9yZSBpbiBjYXNlIHRoZXJlIGlzIGEgc3Vic2VxdWVudAorICAgICAgICAgICAgLy8gc3RvcmUgaW50byB0aGUgc3RhY2sgc2xvdCB3aXRob3V0IGEgcmVhZCBmcm9tIGl0LgorICAgICAgICAgICAgTWF5YmVEZWFkU3RvcmVzW1N0YWNrU2xvdF0gPSAmTUk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBzdGFjayBzbG90IHZhbHVlIHdhcyBwcmV2aW91c2x5IGF2YWlsYWJsZSBpbiBzb21lIG90aGVyCisgICAgICAgICAgICAvLyByZWdpc3RlciwgY2hhbmdlIGl0IG5vdy4gIE90aGVyd2lzZSwgbWFrZSB0aGUgcmVnaXN0ZXIKKyAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBpbiBQaHlzUmVnLgorICAgICAgICAgICAgU3BpbGxzLmFkZEF2YWlsYWJsZShTdGFja1Nsb3QsIFNyY1JlZywgTUkua2lsbHNSZWdpc3RlcihTcmNSZWcpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIGFsbCBvZiB0aGUgc3BpbGxlZCBkZWZzLgorICAgIFNwaWxsZWRNSVJlZ3MuY2xlYXIoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIShNTy5pc1JlZygpICYmIE1PLmdldFJlZygpICYmIE1PLmlzRGVmKCkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgdW5zaWduZWQgVmlydFJlZyA9IE1PLmdldFJlZygpOworICAgICAgaWYgKCFUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFZpcnRSZWcpKSB7CisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgbm9vcCBjb3B5LiAgSWYgc28sIGVsaW1pbmF0ZSB0aGUKKyAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gYmVmb3JlIGNvbnNpZGVyaW5nIHRoZSBkZXN0IHJlZyB0byBiZSBjaGFuZ2VkLgorICAgICAgICAvLyBBbHNvIGNoZWNrIGlmIGl0J3MgY29weWluZyBmcm9tIGFuICJ1bmRlZiIsIGlmIHNvLCB3ZSBjYW4ndAorICAgICAgICAvLyBlbGltaW5hdGUgdGhpcyBvciBlbHNlIHRoZSB1bmRlZiBtYXJrZXIgaXMgbG9zdCBhbmQgaXQgd2lsbAorICAgICAgICAvLyBjb25mdXNlcyB0aGUgc2NhdmVuZ2VyLiBUaGlzIGlzIGV4dHJlbWVseSByYXJlLgorICAgICAgICBpZiAoTUkuaXNJZGVudGl0eUNvcHkoKSAmJiAhTUkuZ2V0T3BlcmFuZCgxKS5pc1VuZGVmKCkgJiYKKyAgICAgICAgICAgIE1JLmdldE51bU9wZXJhbmRzKCkgPT0gMikgeworICAgICAgICAgICsrTnVtRENFOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUmVtb3Zpbmcgbm93LW5vb3AgY29weTogIiA8PCBNSSk7CisgICAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IEtpbGxSZWdzOworICAgICAgICAgIEludmFsaWRhdGVLaWxscyhNSSwgVFJJLCBSZWdLaWxscywgS2lsbE9wcywgJktpbGxSZWdzKTsKKyAgICAgICAgICBpZiAoTU8uaXNEZWFkKCkgJiYgIUtpbGxSZWdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIFNvdXJjZSByZWdpc3RlciBvciBhbiBpbXBsaWNpdCBzdXBlci9zdWItcmVnaXN0ZXIgdXNlIGlzIGtpbGxlZC4KKyAgICAgICAgICAgIGFzc2VydChUUkktPnJlZ3NPdmVybGFwKEtpbGxSZWdzWzBdLCBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpKSk7CisgICAgICAgICAgICAvLyBMYXN0IGRlZiBpcyBub3cgZGVhZC4KKyAgICAgICAgICAgIFRyYW5zZmVyRGVhZG5lc3MoTUkuZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgICAgICAgIH0KKyAgICAgICAgICBWUk0tPlJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKCZNSSk7CisgICAgICAgICAgTUJCLT5lcmFzZSgmTUkpOworICAgICAgICAgIEVyYXNlZCA9IHRydWU7CisgICAgICAgICAgU3BpbGxzLmRpc2FsbG93Q2xvYmJlclBoeXNSZWcoVmlydFJlZyk7CisgICAgICAgICAgZ290byBQcm9jZXNzTmV4dEluc3Q7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBpdCdzIG5vdCBhIG5vLW9wIGNvcHksIGl0IGNsb2JiZXJzIHRoZSB2YWx1ZSBpbiB0aGUgZGVzdHJlZy4KKyAgICAgICAgU3BpbGxzLkNsb2JiZXJQaHlzUmVnKFZpcnRSZWcpOworICAgICAgICBSZXVzZWRPcGVyYW5kcy5tYXJrQ2xvYmJlcmVkKFZpcnRSZWcpOworCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCBpbnRvCisgICAgICAgIC8vIGEgcmVnaXN0ZXIuICBJZiBzbywgdGhpcyBwcm92aWRlcyB0aGUgc3RhY2sgc2xvdCB2YWx1ZSBpbiB0aGUgcmVnLgorICAgICAgICBpbnQgRnJhbWVJZHg7CisgICAgICAgIGlmICh1bnNpZ25lZCBEZXN0UmVnID0gVElJLT5pc0xvYWRGcm9tU3RhY2tTbG90KCZNSSwgRnJhbWVJZHgpKSB7CisgICAgICAgICAgYXNzZXJ0KERlc3RSZWcgPT0gVmlydFJlZyAmJiAiVW5rbm93biBsb2FkIHNpdHVhdGlvbiEiKTsKKworICAgICAgICAgIC8vIElmIGl0IGlzIGEgZm9sZGVkIHJlZmVyZW5jZSwgdGhlbiBpdCdzIG5vdCBzYWZlIHRvIGNsb2JiZXIuCisgICAgICAgICAgYm9vbCBGb2xkZWQgPSBGb2xkZWRTUy5jb3VudChGcmFtZUlkeCk7CisgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBpdCB3YXNuJ3QgYXZhaWxhYmxlLCByZW1lbWJlciB0aGF0IGl0IGlzIG5vdyEKKyAgICAgICAgICBTcGlsbHMuYWRkQXZhaWxhYmxlKEZyYW1lSWR4LCBEZXN0UmVnLCAhRm9sZGVkKTsKKyAgICAgICAgICBnb3RvIFByb2Nlc3NOZXh0SW5zdDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB1bnNpZ25lZCBTdWJJZHggPSBNTy5nZXRTdWJSZWcoKTsKKyAgICAgIGJvb2wgRG9SZU1hdCA9IFZSTS0+aXNSZU1hdGVyaWFsaXplZChWaXJ0UmVnKTsKKyAgICAgIGlmIChEb1JlTWF0KQorICAgICAgICBSZU1hdERlZnMuaW5zZXJ0KCZNSSk7CisKKyAgICAgIC8vIFRoZSBvbmx5IHZyZWdzIGxlZnQgYXJlIHN0YWNrIHNsb3QgZGVmaW5pdGlvbnMuCisgICAgICBpbnQgU3RhY2tTbG90ID0gVlJNLT5nZXRTdGFja1Nsb3QoVmlydFJlZyk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IE1SSS0+Z2V0UmVnQ2xhc3MoVmlydFJlZyk7CisKKyAgICAgIC8vIElmIHRoaXMgZGVmIGlzIHBhcnQgb2YgYSB0d28tYWRkcmVzcyBvcGVyYW5kLCBtYWtlIHN1cmUgdG8gZXhlY3V0ZQorICAgICAgLy8gdGhlIHN0b3JlIGZyb20gdGhlIGNvcnJlY3QgcGh5c2ljYWwgcmVnaXN0ZXIuCisgICAgICB1bnNpZ25lZCBQaHlzUmVnOworICAgICAgdW5zaWduZWQgVGllZE9wOworICAgICAgaWYgKE1JLmlzUmVnVGllZFRvVXNlT3BlcmFuZChpLCAmVGllZE9wKSkgeworICAgICAgICBQaHlzUmVnID0gTUkuZ2V0T3BlcmFuZChUaWVkT3ApLmdldFJlZygpOworICAgICAgICBpZiAoU3ViSWR4KSB7CisgICAgICAgICAgdW5zaWduZWQgU3VwZXJSZWcgPSBmaW5kU3VwZXJSZWcoUkMsIFBoeXNSZWcsIFN1YklkeCwgVFJJKTsKKyAgICAgICAgICBhc3NlcnQoU3VwZXJSZWcgJiYgVFJJLT5nZXRTdWJSZWcoU3VwZXJSZWcsIFN1YklkeCkgPT0gUGh5c1JlZyAmJgorICAgICAgICAgICAgICAgICAiQ2FuJ3QgZmluZCBjb3JyZXNwb25kaW5nIHN1cGVyLXJlZ2lzdGVyISIpOworICAgICAgICAgIFBoeXNSZWcgPSBTdXBlclJlZzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgUGh5c1JlZyA9IFZSTS0+Z2V0UGh5cyhWaXJ0UmVnKTsKKyAgICAgICAgaWYgKFJldXNlZE9wZXJhbmRzLmlzQ2xvYmJlcmVkKFBoeXNSZWcpKSB7CisgICAgICAgICAgLy8gQW5vdGhlciBkZWYgaGFzIHRha2VuIHRoZSBhc3NpZ25lZCBwaHlzcmVnLiBJdCBtdXN0IGhhdmUgYmVlbiBhCisgICAgICAgICAgLy8gdXNlJmRlZiB3aGljaCBnb3QgaXQgZHVlIHRvIHJldXNlLiBVbmRvIHRoZSByZXVzZSEKKyAgICAgICAgICBQaHlzUmVnID0gUmV1c2VkT3BlcmFuZHMuR2V0UmVnRm9yUmVsb2FkKFZpcnRSZWcsIFBoeXNSZWcsICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICBTcGlsbHMsIE1heWJlRGVhZFN0b3JlcywgUmVnS2lsbHMsIEtpbGxPcHMsICpWUk0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGFzc2VydChQaHlzUmVnICYmICJWUiBub3QgYXNzaWduZWQgYSBwaHlzaWNhbCByZWdpc3Rlcj8iKTsKKyAgICAgIE1SSS0+c2V0UGh5c1JlZ1VzZWQoUGh5c1JlZyk7CisgICAgICB1bnNpZ25lZCBSUmVnID0gU3ViSWR4ID8gVFJJLT5nZXRTdWJSZWcoUGh5c1JlZywgU3ViSWR4KSA6IFBoeXNSZWc7CisgICAgICBSZXVzZWRPcGVyYW5kcy5tYXJrQ2xvYmJlcmVkKFJSZWcpOworICAgICAgTUkuZ2V0T3BlcmFuZChpKS5zZXRSZWcoUlJlZyk7CisgICAgICBNSS5nZXRPcGVyYW5kKGkpLnNldFN1YlJlZygwKTsKKworICAgICAgaWYgKCFNTy5pc0RlYWQoKSAmJiBTcGlsbGVkTUlSZWdzLmluc2VydChWaXJ0UmVnKSkgeworICAgICAgICBNYWNoaW5lSW5zdHIgKiZMYXN0U3RvcmUgPSBNYXliZURlYWRTdG9yZXNbU3RhY2tTbG90XTsKKyAgICAgICAgU3BpbGxSZWdUb1N0YWNrU2xvdChNSUksIC0xLCBQaHlzUmVnLCBTdGFja1Nsb3QsIFJDLCB0cnVlLAorICAgICAgICAgIExhc3RTdG9yZSwgU3BpbGxzLCBSZU1hdERlZnMsIFJlZ0tpbGxzLCBLaWxsT3BzKTsKKyAgICAgICAgTmV4dE1JSSA9IGxsdm06Om5leHQoTUlJKTsKKworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIG5vb3AgY29weS4gIElmIHNvLCBlbGltaW5hdGUgdGhlCisgICAgICAgIC8vIGluc3RydWN0aW9uIGJlZm9yZSBjb25zaWRlcmluZyB0aGUgZGVzdCByZWcgdG8gYmUgY2hhbmdlZC4KKyAgICAgICAgaWYgKE1JLmlzSWRlbnRpdHlDb3B5KCkpIHsKKyAgICAgICAgICArK051bURDRTsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlbW92aW5nIG5vdy1ub29wIGNvcHk6ICIgPDwgTUkpOworICAgICAgICAgIEludmFsaWRhdGVLaWxscyhNSSwgVFJJLCBSZWdLaWxscywgS2lsbE9wcyk7CisgICAgICAgICAgVlJNLT5SZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcygmTUkpOworICAgICAgICAgIE1CQi0+ZXJhc2UoJk1JKTsKKyAgICAgICAgICBFcmFzZWQgPSB0cnVlOworICAgICAgICAgIFVwZGF0ZUtpbGxzKCpMYXN0U3RvcmUsIFRSSSwgUmVnS2lsbHMsIEtpbGxPcHMpOworICAgICAgICAgIGdvdG8gUHJvY2Vzc05leHRJbnN0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFByb2Nlc3NOZXh0SW5zdDoKKyAgICAvLyBEZWxldGUgZGVhZCBpbnN0cnVjdGlvbnMgd2l0aG91dCBzaWRlIGVmZmVjdHMuCisgICAgaWYgKCFFcmFzZWQgJiYgIUJhY2tUcmFja2VkICYmIGlzU2FmZVRvRGVsZXRlKE1JKSkgeworICAgICAgSW52YWxpZGF0ZUtpbGxzKE1JLCBUUkksIFJlZ0tpbGxzLCBLaWxsT3BzKTsKKyAgICAgIFZSTS0+UmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoJk1JKTsKKyAgICAgIE1CQi0+ZXJhc2UoJk1JKTsKKyAgICAgIEVyYXNlZCA9IHRydWU7CisgICAgfQorICAgIGlmICghRXJhc2VkKQorICAgICAgRGlzdGFuY2VNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCZNSSwgRGlzdGFuY2VNYXAuc2l6ZSgpKSk7CisgICAgaWYgKCFFcmFzZWQgJiYgIUJhY2tUcmFja2VkKSB7CisgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSA9ICZNSTsgSUkgIT0gTmV4dE1JSTsgKytJSSkKKyAgICAgICAgVXBkYXRlS2lsbHMoKklJLCBUUkksIFJlZ0tpbGxzLCBLaWxsT3BzKTsKKyAgICB9CisgICAgTUlJID0gTmV4dE1JSTsKKyAgfQorCit9CisKK2xsdm06OlZpcnRSZWdSZXdyaXRlciogbGx2bTo6Y3JlYXRlVmlydFJlZ1Jld3JpdGVyKCkgeworICBzd2l0Y2ggKFJld3JpdGVyT3B0KSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVucmVhY2hhYmxlISIpOworICBjYXNlIGxvY2FsOgorICAgIHJldHVybiBuZXcgTG9jYWxSZXdyaXRlcigpOworICBjYXNlIHRyaXZpYWw6CisgICAgcmV0dXJuIG5ldyBUcml2aWFsUmV3cml0ZXIoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvZGVHZW4vVmlydFJlZ1Jld3JpdGVyLmggYi9zcmMvTExWTS9saWIvQ29kZUdlbi9WaXJ0UmVnUmV3cml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ3NGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvZGVHZW4vVmlydFJlZ1Jld3JpdGVyLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vVmlydFJlZ1Jld3JpdGVyLmggLSBWaXJ0UmVnUmV3cml0ZXIgLSotIEMrKyAtKi0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVklSVFJFR1JFV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1ZJUlRSRUdSRVdSSVRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTGl2ZUludGVydmFsczsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworICBjbGFzcyBWaXJ0UmVnTWFwOworICAKKyAgLy8vIFZpcnRSZWdSZXdyaXRlciBpbnRlcmZhY2U6IEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBhc3NpZ24KKyAgLy8vIHNwaWxsZWQgdmlydHVhbCByZWdpc3RlcnMgdG8gc3RhY2sgc2xvdHMsIHJld3JpdGluZyB0aGUgY29kZS4KKyAgc3RydWN0IFZpcnRSZWdSZXdyaXRlciB7CisgICAgdmlydHVhbCB+VmlydFJlZ1Jld3JpdGVyKCk7CisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYsIFZpcnRSZWdNYXAgJlZSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyogTElzKSA9IDA7CisgIH07CisKKyAgLy8vIGNyZWF0ZVZpcnRSZWdSZXdyaXRlciAtIENyZWF0ZSBhbiByZXR1cm4gYSByZXdyaXRlciBvYmplY3QsIGFzIHNwZWNpZmllZAorICAvLy8gb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgVmlydFJlZ1Jld3JpdGVyKiBjcmVhdGVWaXJ0UmVnUmV3cml0ZXIoKTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db21waWxlckRyaXZlci9BY3Rpb24uY3BwIGIvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL0FjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlODA0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9Db21waWxlckRyaXZlci9BY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvLz09PS0tLSBBY3Rpb24uY3BwIC0gVGhlIExMVk0gQ29tcGlsZXIgRHJpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBBY3Rpb24gY2xhc3MgLSBpbXBsZW1lbnRhdGlvbiBhbmQgYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db21waWxlckRyaXZlci9BY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvbXBpbGVyRHJpdmVyL0J1aWx0aW5PcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Db21waWxlckRyaXZlci9FcnJvci5oIgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1N5c3RlbVV0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUHJvZ3JhbS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1RpbWVWYWx1ZS5oIgorCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBuYW1lc3BhY2UgbGx2bWM7CisKK25hbWVzcGFjZSBsbHZtYyB7CisKK2V4dGVybiBpbnQgTWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpOworZXh0ZXJuIGNvbnN0IGNoYXIqIFByb2dyYW1OYW1lOworCit9CisKK25hbWVzcGFjZSB7CisKKyAgdm9pZCBQcmludFN0cmluZyAoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIGVycnMoKSA8PCBzdHIgPDwgJyAnOworICB9CisKKyAgdm9pZCBQcmludENvbW1hbmQgKGNvbnN0IHN0ZDo6c3RyaW5nJiBDbWQsIGNvbnN0IFN0clZlY3RvciYgQXJncykgeworICAgIGVycnMoKSA8PCBDbWQgPDwgJyAnOworICAgIHN0ZDo6Zm9yX2VhY2goQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLCAmUHJpbnRTdHJpbmcpOworICAgIGVycnMoKSA8PCAnXG4nOworICB9CisKKyAgYm9vbCBJc1NlZ21lbnRhdGlvbkZhdWx0IChpbnQgcmV0dXJuQ29kZSkgeworI2lmZGVmIExMVk1fT05fV0lOMzIKKyAgICByZXR1cm4gKHJldHVybkNvZGUgPj0gMHhjMDAwMDAwMFVMKQorI2Vsc2UKKyAgICByZXR1cm4gKHJldHVybkNvZGUgPCAwKTsKKyNlbmRpZgorICB9CisKKyAgaW50IEV4ZWN1dGVQcm9ncmFtIChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJWZWN0b3ImIGFyZ3MpIHsKKyAgICBzeXM6OlBhdGggcHJvZyA9IHN5czo6UHJvZ3JhbTo6RmluZFByb2dyYW1CeU5hbWUobmFtZSk7CisKKyAgICBpZiAocHJvZy5pc0VtcHR5KCkpIHsKKyAgICAgIHByb2cgPSBGaW5kRXhlY3V0YWJsZShuYW1lLCBQcm9ncmFtTmFtZSwgKHZvaWQgKikoaW50cHRyX3QpJk1haW4pOworICAgICAgaWYgKHByb2cuaXNFbXB0eSgpKSB7CisgICAgICAgIFByaW50RXJyb3IoIkNhbid0IGZpbmQgcHJvZ3JhbSAnIiArIG5hbWUgKyAiJyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICAgIGlmICghcHJvZy5jYW5FeGVjdXRlKCkpIHsKKyAgICAgIFByaW50RXJyb3IoIlByb2dyYW0gJyIgKyBuYW1lICsgIicgaXMgbm90IGV4ZWN1dGFibGUuIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gQnVpbGQgdGhlIGNvbW1hbmQgbGluZSB2ZWN0b3IgYW5kIHRoZSByZWRpcmVjdHMgYXJyYXkuCisgICAgY29uc3Qgc3lzOjpQYXRoKiByZWRpcmVjdHNbM10gPSB7MCwwLDB9OworICAgIHN5czo6UGF0aCBzdGRvdXRfcmVkaXJlY3Q7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gYXJndjsKKyAgICBhcmd2LnJlc2VydmUoKGFyZ3Muc2l6ZSgpKzIpKTsKKyAgICBhcmd2LnB1c2hfYmFjayhuYW1lLmNfc3RyKCkpOworCisgICAgZm9yIChTdHJWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIgPSBhcmdzLmJlZ2luKCksIEUgPSBhcmdzLmVuZCgpOworICAgICAgICAgQiE9RTsgKytCKSB7CisgICAgICBpZiAoKkIgPT0gIj4iKSB7CisgICAgICAgICsrQjsKKyAgICAgICAgc3Rkb3V0X3JlZGlyZWN0LnNldCgqQik7CisgICAgICAgIHJlZGlyZWN0c1sxXSA9ICZzdGRvdXRfcmVkaXJlY3Q7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgYXJndi5wdXNoX2JhY2soKCpCKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9CisgICAgYXJndi5wdXNoX2JhY2soMCk7ICAvLyBudWxsIHRlcm1pbmF0ZSBsaXN0LgorCisgICAgLy8gSW52b2tlIHRoZSBwcm9ncmFtLgorICAgIGludCByZXQgPSBzeXM6OlByb2dyYW06OkV4ZWN1dGVBbmRXYWl0KHByb2csICZhcmd2WzBdLCAwLCAmcmVkaXJlY3RzWzBdKTsKKworICAgIGlmIChJc1NlZ21lbnRhdGlvbkZhdWx0KHJldCkpIHsKKyAgICAgIGVycnMoKSA8PCAiU2VnbWVudGF0aW9uIGZhdWx0OiAiOworICAgICAgUHJpbnRDb21tYW5kKG5hbWUsIGFyZ3MpOworICAgIH0KKworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworbmFtZXNwYWNlIGxsdm1jIHsKKyAgdm9pZCBBcHBlbmRUb0dsb2JhbFRpbWVMb2cgKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWQsIGRvdWJsZSB0aW1lKTsKK30KKworaW50IGxsdm1jOjpBY3Rpb246OkV4ZWN1dGUgKCkgY29uc3QgeworICBpZiAoRHJ5UnVuIHx8IFZlcmJvc2VNb2RlKQorICAgIFByaW50Q29tbWFuZChDb21tYW5kXywgQXJnc18pOworCisgIGlmICghRHJ5UnVuKSB7CisgICAgaWYgKFRpbWUpIHsKKyAgICAgIHN5czo6VGltZVZhbHVlIG5vdyA9IHN5czo6VGltZVZhbHVlOjpub3coKTsKKyAgICAgIGludCByZXQgPSBFeGVjdXRlUHJvZ3JhbShDb21tYW5kXywgQXJnc18pOworICAgICAgc3lzOjpUaW1lVmFsdWUgbm93MiA9IHN5czo6VGltZVZhbHVlOjpub3coKTsKKyAgICAgIG5vdzIgLT0gbm93OworICAgICAgZG91YmxlIGVsYXBzZWQgPSBub3cyLnNlY29uZHMoKSAgKyBub3cyLm1pY3Jvc2Vjb25kcygpICAvIDEwMDAwMDAuMDsKKyAgICAgIEFwcGVuZFRvR2xvYmFsVGltZUxvZyhDb21tYW5kXywgZWxhcHNlZCk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0dXJuIEV4ZWN1dGVQcm9ncmFtKENvbW1hbmRfLCBBcmdzXyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29tcGlsZXJEcml2ZXIvQnVpbHRpbk9wdGlvbnMuY3BwIGIvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL0J1aWx0aW5PcHRpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWFjOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL0J1aWx0aW5PcHRpb25zLmNwcApAQCAtMCwwICsxLDU5IEBACisvLz09PS0tLSBCdWlsdGluT3B0aW9ucy5jcHAgLSBUaGUgTExWTSBDb21waWxlciBEcml2ZXIgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBEZWZpbml0aW9ucyBvZiBhbGwgZ2xvYmFsIGNvbW1hbmQtbGluZSBvcHRpb24gdmFyaWFibGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvbXBpbGVyRHJpdmVyL0J1aWx0aW5PcHRpb25zLmgiCisKKyNpZmRlZiBFTkFCTEVfTExWTUNfRFlOQU1JQ19QTFVHSU5TCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BsdWdpbkxvYWRlci5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBjbCA9IGxsdm06OmNsOworCisvLyBFeHRlcm5hbCBsaW5rYWdlIGhlcmUgaXMgaW50ZW50aW9uYWwuCisKK2NsOjpsaXN0PHN0ZDo6c3RyaW5nPiBJbnB1dEZpbGVuYW1lcyhjbDo6UG9zaXRpb25hbCwgY2w6OmRlc2MoIjxpbnB1dCBmaWxlPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpaZXJvT3JNb3JlKTsKK2NsOjpvcHQ8c3RkOjpzdHJpbmc+IE91dHB1dEZpbGVuYW1lKCJvIiwgY2w6OmRlc2MoIk91dHB1dCBmaWxlIG5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjp2YWx1ZV9kZXNjKCJmaWxlIiksIGNsOjpQcmVmaXgpOworY2w6Om9wdDxzdGQ6OnN0cmluZz4gVGVtcERpcm5hbWUoInRlbXAtZGlyIiwgY2w6OmRlc2MoIlRlbXAgZGlyIG5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjp2YWx1ZV9kZXNjKCI8ZGlyZWN0b3J5PiIpLCBjbDo6UHJlZml4KTsKK2NsOjpsaXN0PHN0ZDo6c3RyaW5nPiBMYW5ndWFnZXMoIngiLAorICAgICAgICAgIGNsOjpkZXNjKCJTcGVjaWZ5IHRoZSBsYW5ndWFnZSBvZiB0aGUgZm9sbG93aW5nIGlucHV0IGZpbGVzIiksCisgICAgICAgICAgY2w6Olplcm9Pck1vcmUpOworCitjbDo6b3B0PGJvb2w+IERyeVJ1bigiZHJ5LXJ1biIsCisgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiT25seSBwcmV0ZW5kIHRvIHJ1biBjb21tYW5kcyIpKTsKK2NsOjpvcHQ8Ym9vbD4gVGltZSgidGltZSIsIGNsOjpkZXNjKCJUaW1lIGluZGl2aWR1YWwgY29tbWFuZHMiKSk7CitjbDo6b3B0PGJvb2w+IFZlcmJvc2VNb2RlKCJ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkVuYWJsZSB2ZXJib3NlIG1vZGUiKSk7CisKK2NsOjpvcHQ8Ym9vbD4gQ2hlY2tHcmFwaCgiY2hlY2stZ3JhcGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJDaGVjayB0aGUgY29tcGlsYXRpb24gZ3JhcGggZm9yIGVycm9ycyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpIaWRkZW4pOworY2w6Om9wdDxib29sPiBXcml0ZUdyYXBoKCJ3cml0ZS1ncmFwaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIldyaXRlIGNvbXBpbGF0aW9uLWdyYXBoLmRvdCBmaWxlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OkhpZGRlbik7CitjbDo6b3B0PGJvb2w+IFZpZXdHcmFwaCgidmlldy1ncmFwaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIlNob3cgY29tcGlsYXRpb24gZ3JhcGggaW4gR2hvc3RWaWV3IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OkhpZGRlbik7CisKK2NsOjpvcHQ8U2F2ZVRlbXBzRW51bTo6VmFsdWVzPiBTYXZlVGVtcHMKKygic2F2ZS10ZW1wcyIsIGNsOjpkZXNjKCJLZWVwIHRlbXBvcmFyeSBmaWxlcyIpLAorIGNsOjppbml0KFNhdmVUZW1wc0VudW06OlVuc2V0KSwKKyBjbDo6dmFsdWVzKGNsRW51bVZhbE4oU2F2ZVRlbXBzRW51bTo6T2JqLCAib2JqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlNhdmUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgd2l0aCAtbyIpLAorICAgICAgICAgICAgY2xFbnVtVmFsTihTYXZlVGVtcHNFbnVtOjpDd2QsICJjd2QiLAorICAgICAgICAgICAgICAgICAgICAgICAiVXNlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkiKSwKKyAgICAgICAgICAgIGNsRW51bVZhbE4oU2F2ZVRlbXBzRW51bTo6T2JqLCAiIiwgIlNhbWUgYXMgJ2N3ZCciKSwKKyAgICAgICAgICAgIGNsRW51bVZhbEVuZCksCisgY2w6OlZhbHVlT3B0aW9uYWwpOwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2RkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29tcGlsZXJEcml2ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMCBAQAorc2V0KExMVk1fTElOS19DT01QT05FTlRTIHN1cHBvcnQgc3lzdGVtKQorc2V0KExMVk1fUkVRVUlSRVNfRUggMSkKKworYWRkX2xsdm1fdG9vbChsbHZtYworICBBY3Rpb24uY3BwCisgIENvbXBpbGF0aW9uR3JhcGguY3BwCisgIGxsdm1jLmNwcAorICBQbHVnaW4uY3BwCisgIFRvb2wuY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9Db21waWxlckRyaXZlci9Db21waWxhdGlvbkdyYXBoLmNwcCBiL3NyYy9MTFZNL2xpYi9Db21waWxlckRyaXZlci9Db21waWxhdGlvbkdyYXBoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk5MTFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL0NvbXBpbGF0aW9uR3JhcGguY3BwCkBAIC0wLDAgKzEsNjM1IEBACisvLz09PS0tLSBDb21waWxhdGlvbkdyYXBoLmNwcCAtIFRoZSBMTFZNIENvbXBpbGVyIERyaXZlciAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBDb21waWxhdGlvbiBncmFwaCAtIGltcGxlbWVudGF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvbXBpbGVyRHJpdmVyL0J1aWx0aW5PcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Db21waWxlckRyaXZlci9Db21waWxhdGlvbkdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9Db21waWxlckRyaXZlci9FcnJvci5oIgorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RPVEdyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dyYXBoV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8cXVldWU+CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIGxsdm1jOworCituYW1lc3BhY2UgbGx2bWMgeworCisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBMYW5ndWFnZU1hcDo6R2V0TGFuZ3VhZ2UoY29uc3Qgc3lzOjpQYXRoJiBGaWxlKSBjb25zdCB7CisgICAgU3RyaW5nUmVmIHN1ZiA9IEZpbGUuZ2V0U3VmZml4KCk7CisgICAgTGFuZ3VhZ2VNYXA6OmNvbnN0X2l0ZXJhdG9yIExhbmcgPQorICAgICAgdGhpcy0+ZmluZChzdWYuZW1wdHkoKSA/ICIqZW1wdHkqIiA6IHN1Zik7CisgICAgaWYgKExhbmcgPT0gdGhpcy0+ZW5kKCkpIHsKKyAgICAgIFByaW50RXJyb3IoIkZpbGUgJyIgKyBGaWxlLnN0cigpICsgIicgaGFzIHVua25vd24gc3VmZml4ICciCisgICAgICAgICAgICAgICAgICsgc3VmLnN0cigpICsgJ1wnJyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuICZMYW5nLT5zZWNvbmQ7CisgIH0KK30KKworbmFtZXNwYWNlIHsKKworICAvLy8gQ2hvb3NlRWRnZSAtIFJldHVybiB0aGUgZWRnZSB3aXRoIHRoZSBtYXhpbXVtIHdlaWdodC4KKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIGNvbnN0IEVkZ2UqIENob29zZUVkZ2UoY29uc3QgQyYgRWRnZXNDb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRMYW5ndWFnZXNTZXQmIEluTGFuZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE5vZGVOYW1lID0gInJvb3QiKSB7CisgICAgY29uc3QgRWRnZSogTWF4RWRnZSA9IDA7CisgICAgdW5zaWduZWQgTWF4V2VpZ2h0ID0gMDsKKyAgICBib29sIFNpbmdsZU1heCA9IHRydWU7CisKKyAgICBmb3IgKHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yIEIgPSBFZGdlc0NvbnRhaW5lci5iZWdpbigpLAorICAgICAgICAgICBFID0gRWRnZXNDb250YWluZXIuZW5kKCk7IEIgIT0gRTsgKytCKSB7CisgICAgICBjb25zdCBFZGdlKiBlID0gQi0+Z2V0UHRyKCk7CisgICAgICB1bnNpZ25lZCBFVyA9IGUtPldlaWdodChJbkxhbmdzKTsKKyAgICAgIGlmIChFVyA+IE1heFdlaWdodCkgeworICAgICAgICBNYXhFZGdlID0gZTsKKyAgICAgICAgTWF4V2VpZ2h0ID0gRVc7CisgICAgICAgIFNpbmdsZU1heCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKEVXID09IE1heFdlaWdodCkgeworICAgICAgICBTaW5nbGVNYXggPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIVNpbmdsZU1heCkgeworICAgICAgUHJpbnRFcnJvcigiTm9kZSAiICsgTm9kZU5hbWUgKyAiOiBtdWx0aXBsZSBtYXhpbWFsIG91dHdhcmQgZWRnZXMgZm91bmQhIgorICAgICAgICAgICAgICAgICAiIE1vc3QgcHJvYmFibHkgYSBzcGVjaWZpY2F0aW9uIGVycm9yLiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghTWF4RWRnZSkgeworICAgICAgUHJpbnRFcnJvcigiTm9kZSAiICsgTm9kZU5hbWUgKyAiOiBubyBtYXhpbWFsIG91dHdhcmQgZWRnZSBmb3VuZCEiCisgICAgICAgICAgICAgICAgICIgTW9zdCBwcm9iYWJseSBhIHNwZWNpZmljYXRpb24gZXJyb3IuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIE1heEVkZ2U7CisgIH0KKworfQorCit2b2lkIE5vZGU6OkFkZEVkZ2UoRWRnZSogRWRnKSB7CisgIC8vIElmIHRoZXJlIGFscmVhZHkgd2FzIGFuIGVkZ2UgYmV0d2VlbiB0d28gbm9kZXMsIG1vZGlmeSBpdCBpbnN0ZWFkCisgIC8vIG9mIGFkZGluZyBhIG5ldyBlZGdlLgorICBjb25zdCBzdGQ6OnN0cmluZyYgVG9vbE5hbWUgPSBFZGctPlRvb2xOYW1lKCk7CisgIGZvciAoY29udGFpbmVyX3R5cGU6Oml0ZXJhdG9yIEIgPSBPdXRFZGdlcy5iZWdpbigpLCBFID0gT3V0RWRnZXMuZW5kKCk7CisgICAgICAgQiAhPSBFOyArK0IpIHsKKyAgICBpZiAoKCpCKS0+VG9vbE5hbWUoKSA9PSBUb29sTmFtZSkgeworICAgICAgbGx2bTo6SW50cnVzaXZlUmVmQ250UHRyPEVkZ2U+KEVkZykuc3dhcCgqQik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIE91dEVkZ2VzLnB1c2hfYmFjayhsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8RWRnZT4oRWRnKSk7Cit9CisKK0NvbXBpbGF0aW9uR3JhcGg6OkNvbXBpbGF0aW9uR3JhcGgoKSB7CisgIE5vZGVzTWFwWyJyb290Il0gPSBOb2RlKHRoaXMpOworfQorCitOb2RlKiBDb21waWxhdGlvbkdyYXBoOjpnZXROb2RlKGNvbnN0IHN0ZDo6c3RyaW5nJiBUb29sTmFtZSkgeworICBub2Rlc19tYXBfdHlwZTo6aXRlcmF0b3IgSSA9IE5vZGVzTWFwLmZpbmQoVG9vbE5hbWUpOworICBpZiAoSSA9PSBOb2Rlc01hcC5lbmQoKSkgeworICAgIFByaW50RXJyb3IoIk5vZGUgIiArIFRvb2xOYW1lICsgIiBpcyBub3QgaW4gdGhlIGdyYXBoIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICZJLT5zZWNvbmQ7Cit9CisKK2NvbnN0IE5vZGUqIENvbXBpbGF0aW9uR3JhcGg6OmdldE5vZGUoY29uc3Qgc3RkOjpzdHJpbmcmIFRvb2xOYW1lKSBjb25zdCB7CisgIG5vZGVzX21hcF90eXBlOjpjb25zdF9pdGVyYXRvciBJID0gTm9kZXNNYXAuZmluZChUb29sTmFtZSk7CisgIGlmIChJID09IE5vZGVzTWFwLmVuZCgpKSB7CisgICAgUHJpbnRFcnJvcigiTm9kZSAiICsgVG9vbE5hbWUgKyAiIGlzIG5vdCBpbiB0aGUgZ3JhcGghIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICZJLT5zZWNvbmQ7Cit9CisKKy8vIEZpbmQgdGhlIHRvb2xzIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbmFtZS4KK2NvbnN0IENvbXBpbGF0aW9uR3JhcGg6OnRvb2xzX3ZlY3Rvcl90eXBlKgorQ29tcGlsYXRpb25HcmFwaDo6Z2V0VG9vbHNWZWN0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIExhbmdOYW1lKSBjb25zdAoreworICB0b29sc19tYXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgSSA9IFRvb2xzTWFwLmZpbmQoTGFuZ05hbWUpOworICBpZiAoSSA9PSBUb29sc01hcC5lbmQoKSkgeworICAgIFByaW50RXJyb3IoIk5vIHRvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgbGFuZ3VhZ2UgIiArIExhbmdOYW1lICsgIiBmb3VuZCIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAmSS0+c2Vjb25kOworfQorCit2b2lkIENvbXBpbGF0aW9uR3JhcGg6Omluc2VydE5vZGUoVG9vbCogVikgeworICBpZiAoTm9kZXNNYXAuY291bnQoVi0+TmFtZSgpKSA9PSAwKQorICAgIE5vZGVzTWFwW1YtPk5hbWUoKV0gPSBOb2RlKHRoaXMsIFYpOworfQorCitpbnQgQ29tcGlsYXRpb25HcmFwaDo6aW5zZXJ0RWRnZShjb25zdCBzdGQ6OnN0cmluZyYgQSwgRWRnZSogRWRnKSB7CisgIE5vZGUqIEIgPSBnZXROb2RlKEVkZy0+VG9vbE5hbWUoKSk7CisgIGlmIChCID09IDApCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKEEgPT0gInJvb3QiKSB7CisgICAgY29uc3QgY2hhcioqIEluTGFuZ3MgPSBCLT5Ub29sUHRyLT5JbnB1dExhbmd1YWdlcygpOworICAgIGZvciAoOypJbkxhbmdzOyArK0luTGFuZ3MpCisgICAgICBUb29sc01hcFsqSW5MYW5nc10ucHVzaF9iYWNrKEludHJ1c2l2ZVJlZkNudFB0cjxFZGdlPihFZGcpKTsKKyAgICBOb2Rlc01hcFsicm9vdCJdLkFkZEVkZ2UoRWRnKTsKKyAgfQorICBlbHNlIHsKKyAgICBOb2RlKiBOID0gZ2V0Tm9kZShBKTsKKyAgICBpZiAoTiA9PSAwKQorICAgICAgcmV0dXJuIDE7CisKKyAgICBOLT5BZGRFZGdlKEVkZyk7CisgIH0KKyAgLy8gSW5jcmVhc2UgdGhlIGlud2FyZCBlZGdlIGNvdW50ZXIuCisgIEItPkluY3JJbkVkZ2VzKCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFBhc3MgaW5wdXQgZmlsZSB0aHJvdWdoIHRoZSBjaGFpbiB1bnRpbCB3ZSBidW1wIGludG8gYSBKb2luIG5vZGUgb3IKKy8vIGEgbm9kZSB0aGF0IHNheXMgdGhhdCBpdCBpcyB0aGUgbGFzdC4KK2ludCBDb21waWxhdGlvbkdyYXBoOjpQYXNzVGhyb3VnaEdyYXBoIChjb25zdCBzeXM6OlBhdGgmIEluRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOb2RlKiBTdGFydE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRMYW5ndWFnZXNTZXQmIEluTGFuZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3lzOjpQYXRoJiBUZW1wRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmd1YWdlTWFwJiBMYW5nTWFwKSBjb25zdCB7CisgIHN5czo6UGF0aCBJbiA9IEluRmlsZTsKKyAgY29uc3QgTm9kZSogQ3VyTm9kZSA9IFN0YXJ0Tm9kZTsKKworICB3aGlsZSh0cnVlKSB7CisgICAgVG9vbCogQ3VyVG9vbCA9IEN1ck5vZGUtPlRvb2xQdHIuZ2V0UHRyKCk7CisKKyAgICBpZiAoQ3VyVG9vbC0+SXNKb2luKCkpIHsKKyAgICAgIEpvaW5Ub29sJiBKVCA9IHN0YXRpY19jYXN0PEpvaW5Ub29sJj4oKkN1clRvb2wpOworICAgICAgSlQuQWRkVG9Kb2luTGlzdChJbik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBY3Rpb24gQ3VyQWN0aW9uOworICAgIGlmIChpbnQgcmV0ID0gQ3VyVG9vbC0+R2VuZXJhdGVBY3Rpb24oQ3VyQWN0aW9uLCBJbiwgQ3VyTm9kZS0+SGFzQ2hpbGRyZW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBEaXIsIEluTGFuZ3MsIExhbmdNYXApKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChpbnQgcmV0ID0gQ3VyQWN0aW9uLkV4ZWN1dGUoKSkKKyAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoQ3VyQWN0aW9uLlN0b3BDb21waWxhdGlvbigpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBjb25zdCBFZGdlKiBFZGcgPSBDaG9vc2VFZGdlKEN1ck5vZGUtPk91dEVkZ2VzLCBJbkxhbmdzLCBDdXJOb2RlLT5OYW1lKCkpOworICAgIGlmIChFZGcgPT0gMCkKKyAgICAgIHJldHVybiAxOworCisgICAgQ3VyTm9kZSA9IGdldE5vZGUoRWRnLT5Ub29sTmFtZSgpKTsKKyAgICBpZiAoQ3VyTm9kZSA9PSAwKQorICAgICAgcmV0dXJuIDE7CisKKyAgICBJbiA9IEN1ckFjdGlvbi5PdXRGaWxlKCk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLy8gRmluZCB0aGUgaGVhZCBvZiB0aGUgdG9vbGNoYWluIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZpbGUuCisvLyBBbHNvLCBpbnNlcnQgYW4gaW5wdXQgbGFuZ3VhZ2UgaW50byBJbkxhbmdzLgorY29uc3QgTm9kZSogQ29tcGlsYXRpb25HcmFwaDo6CitGaW5kVG9vbENoYWluKGNvbnN0IHN5czo6UGF0aCYgSW4sIGNvbnN0IHN0ZDo6c3RyaW5nKiBGb3JjZUxhbmd1YWdlLAorICAgICAgICAgICAgICBJbnB1dExhbmd1YWdlc1NldCYgSW5MYW5ncywgY29uc3QgTGFuZ3VhZ2VNYXAmIExhbmdNYXApIGNvbnN0IHsKKworICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IGxhbmd1YWdlLgorICBjb25zdCBzdGQ6OnN0cmluZyogSW5MYW5nID0gTGFuZ01hcC5HZXRMYW5ndWFnZShJbik7CisgIGlmIChJbkxhbmcgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIEluTGFuZ3VhZ2UgPSAoRm9yY2VMYW5ndWFnZSA/ICpGb3JjZUxhbmd1YWdlIDogKkluTGFuZyk7CisKKyAgLy8gQWRkIHRoZSBjdXJyZW50IGlucHV0IGxhbmd1YWdlIHRvIHRoZSBpbnB1dCBsYW5ndWFnZSBzZXQuCisgIEluTGFuZ3MuaW5zZXJ0KEluTGFuZ3VhZ2UpOworCisgIC8vIEZpbmQgdGhlIHRvb2xjaGFpbiBmb3IgdGhlIGlucHV0IGxhbmd1YWdlLgorICBjb25zdCB0b29sc192ZWN0b3JfdHlwZSogcFRWID0gZ2V0VG9vbHNWZWN0b3IoSW5MYW5ndWFnZSk7CisgIGlmIChwVFYgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBjb25zdCB0b29sc192ZWN0b3JfdHlwZSYgVFYgPSAqcFRWOworICBpZiAoVFYuZW1wdHkoKSkgeworICAgIFByaW50RXJyb3IoIk5vIHRvb2xjaGFpbiBjb3JyZXNwb25kaW5nIHRvIGxhbmd1YWdlICIKKyAgICAgICAgICAgICAgICsgSW5MYW5ndWFnZSArICIgZm91bmQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNvbnN0IEVkZ2UqIEVkZyA9IENob29zZUVkZ2UoVFYsIEluTGFuZ3MpOworICBpZiAoRWRnID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIGdldE5vZGUoRWRnLT5Ub29sTmFtZSgpKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgQnVpbGQoKS4KKy8vIFRyYXZlcnNlcyBpbml0aWFsIHBvcnRpb25zIG9mIHRoZSB0b29sY2hhaW5zICh1cCB0byB0aGUgZmlyc3QgSm9pbiBub2RlKS4KKy8vIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIC14IG9wdGlvbi4KK2ludCBDb21waWxhdGlvbkdyYXBoOjpCdWlsZEluaXRpYWwgKElucHV0TGFuZ3VhZ2VzU2V0JiBJbkxhbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3lzOjpQYXRoJiBUZW1wRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ3VhZ2VNYXAmIExhbmdNYXApIHsKKyAgLy8gVGhpcyBpcyByZWxhdGVkIHRvIC14IG9wdGlvbiBoYW5kbGluZy4KKyAgY2w6Omxpc3Q8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciB4SXRlciA9IExhbmd1YWdlcy5iZWdpbigpLAorICAgIHhCZWdpbiA9IHhJdGVyLCB4RW5kID0gTGFuZ3VhZ2VzLmVuZCgpOworICBib29sIHhFbXB0eSA9IHRydWU7CisgIGNvbnN0IHN0ZDo6c3RyaW5nKiB4TGFuZ3VhZ2UgPSAwOworICB1bnNpZ25lZCB4UG9zID0gMCwgeFBvc05leHQgPSAwLCBmaWxlUG9zID0gMDsKKworICBpZiAoeEl0ZXIgIT0geEVuZCkgeworICAgIHhFbXB0eSA9IGZhbHNlOworICAgIHhQb3MgPSBMYW5ndWFnZXMuZ2V0UG9zaXRpb24oeEl0ZXIgLSB4QmVnaW4pOworICAgIGNsOjpsaXN0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgeE5leHQgPSBsbHZtOjpuZXh0KHhJdGVyKTsKKyAgICB4UG9zTmV4dCA9ICh4TmV4dCA9PSB4RW5kKSA/IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKQorICAgICAgOiBMYW5ndWFnZXMuZ2V0UG9zaXRpb24oeE5leHQgLSB4QmVnaW4pOworICAgIHhMYW5ndWFnZSA9ICgqeEl0ZXIgPT0gIm5vbmUiKSA/IDAgOiAmKCp4SXRlcik7CisgIH0KKworICAvLyBGb3IgZWFjaCBpbnB1dCBmaWxlOgorICBmb3IgKGNsOjpsaXN0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgQiA9IElucHV0RmlsZW5hbWVzLmJlZ2luKCksCisgICAgICAgICBDQiA9IEIsIEUgPSBJbnB1dEZpbGVuYW1lcy5lbmQoKTsgQiAhPSBFOyArK0IpIHsKKyAgICBzeXM6OlBhdGggSW4gPSBzeXM6OlBhdGgoKkIpOworCisgICAgLy8gQ29kZSBmb3IgaGFuZGxpbmcgdGhlIC14IG9wdGlvbi4KKyAgICAvLyBPdXRwdXQ6IHN0ZDo6c3RyaW5nKiB4TGFuZ3VhZ2UgKGNhbiBiZSBOVUxMKS4KKyAgICBpZiAoIXhFbXB0eSkgeworICAgICAgZmlsZVBvcyA9IElucHV0RmlsZW5hbWVzLmdldFBvc2l0aW9uKEIgLSBDQik7CisKKyAgICAgIGlmICh4UG9zIDwgZmlsZVBvcykgeworICAgICAgICBpZiAoZmlsZVBvcyA8IHhQb3NOZXh0KSB7CisgICAgICAgICAgeExhbmd1YWdlID0gKCp4SXRlciA9PSAibm9uZSIpID8gMCA6ICYoKnhJdGVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gZmlsZVBvcyA+PSB4UG9zTmV4dAorICAgICAgICAgIC8vIFNraXAgeEl0ZXJzIHdoaWxlIGZpbGVQb3MgPiB4UG9zTmV4dAorICAgICAgICAgIHdoaWxlIChmaWxlUG9zID4geFBvc05leHQpIHsKKyAgICAgICAgICAgICsreEl0ZXI7CisgICAgICAgICAgICB4UG9zID0geFBvc05leHQ7CisKKyAgICAgICAgICAgIGNsOjpsaXN0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgeE5leHQgPSBsbHZtOjpuZXh0KHhJdGVyKTsKKyAgICAgICAgICAgIGlmICh4TmV4dCA9PSB4RW5kKQorICAgICAgICAgICAgICB4UG9zTmV4dCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeFBvc05leHQgPSBMYW5ndWFnZXMuZ2V0UG9zaXRpb24oeE5leHQgLSB4QmVnaW4pOworICAgICAgICAgICAgeExhbmd1YWdlID0gKCp4SXRlciA9PSAibm9uZSIpID8gMCA6ICYoKnhJdGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGaW5kIHRoZSB0b29sY2hhaW4gY29ycmVzcG9uZGluZyB0byB0aGlzIGZpbGUuCisgICAgY29uc3QgTm9kZSogTiA9IEZpbmRUb29sQ2hhaW4oSW4sIHhMYW5ndWFnZSwgSW5MYW5ncywgTGFuZ01hcCk7CisgICAgaWYgKE4gPT0gMCkKKyAgICAgIHJldHVybiAxOworICAgIC8vIFBhc3MgZmlsZSB0aHJvdWdoIHRoZSBjaGFpbiBzdGFydGluZyBhdCBoZWFkLgorICAgIGlmIChpbnQgcmV0ID0gUGFzc1Rocm91Z2hHcmFwaChJbiwgTiwgSW5MYW5ncywgVGVtcERpciwgTGFuZ01hcCkpCisgICAgICByZXR1cm4gcmV0OworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFNvcnQgdGhlIG5vZGVzIGluIHRvcG9sb2dpY2FsIG9yZGVyLgoraW50IENvbXBpbGF0aW9uR3JhcGg6OlRvcG9sb2dpY2FsU29ydChzdGQ6OnZlY3Rvcjxjb25zdCBOb2RlKj4mIE91dCkgeworICBzdGQ6OnF1ZXVlPGNvbnN0IE5vZGUqPiBROworCisgIE5vZGUqIFJvb3QgPSBnZXROb2RlKCJyb290Iik7CisgIGlmIChSb290ID09IDApCisgICAgcmV0dXJuIDE7CisKKyAgUS5wdXNoKFJvb3QpOworCisgIHdoaWxlICghUS5lbXB0eSgpKSB7CisgICAgY29uc3QgTm9kZSogQSA9IFEuZnJvbnQoKTsKKyAgICBRLnBvcCgpOworICAgIE91dC5wdXNoX2JhY2soQSk7CisgICAgZm9yIChOb2RlOjpjb25zdF9pdGVyYXRvciBFQiA9IEEtPkVkZ2VzQmVnaW4oKSwgRUUgPSBBLT5FZGdlc0VuZCgpOworICAgICAgICAgRUIgIT0gRUU7ICsrRUIpIHsKKyAgICAgIE5vZGUqIEIgPSBnZXROb2RlKCgqRUIpLT5Ub29sTmFtZSgpKTsKKyAgICAgIGlmIChCID09IDApCisgICAgICAgIHJldHVybiAxOworCisgICAgICBCLT5EZWNySW5FZGdlcygpOworICAgICAgaWYgKEItPkhhc05vSW5FZGdlcygpKQorICAgICAgICBRLnB1c2goQik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK25hbWVzcGFjZSB7CisgIGJvb2wgTm90Sm9pbk5vZGUoY29uc3QgTm9kZSogTikgeworICAgIHJldHVybiBOLT5Ub29sUHRyID8gIU4tPlRvb2xQdHItPklzSm9pbigpIDogdHJ1ZTsKKyAgfQorfQorCisvLyBDYWxsIFRvcG9sb2dpY2FsU29ydCBhbmQgZmlsdGVyIHRoZSByZXN1bHRpbmcgbGlzdCB0byBpbmNsdWRlCisvLyBvbmx5IEpvaW4gbm9kZXMuCitpbnQgQ29tcGlsYXRpb25HcmFwaDo6CitUb3BvbG9naWNhbFNvcnRGaWx0ZXJKb2luTm9kZXMoc3RkOjp2ZWN0b3I8Y29uc3QgTm9kZSo+JiBPdXQpIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgTm9kZSo+IFRvcFNvcnRlZDsKKyAgaWYgKGludCByZXQgPSBUb3BvbG9naWNhbFNvcnQoVG9wU29ydGVkKSkKKyAgICByZXR1cm4gcmV0OworICBzdGQ6OnJlbW92ZV9jb3B5X2lmKFRvcFNvcnRlZC5iZWdpbigpLCBUb3BTb3J0ZWQuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKE91dCksIE5vdEpvaW5Ob2RlKTsKKworICByZXR1cm4gMDsKK30KKworaW50IENvbXBpbGF0aW9uR3JhcGg6OkJ1aWxkIChjb25zdCBzeXM6OlBhdGgmIFRlbXBEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmd1YWdlTWFwJiBMYW5nTWFwKSB7CisgIElucHV0TGFuZ3VhZ2VzU2V0IEluTGFuZ3M7CisgIGJvb2wgV2FzU29tZUFjdGlvbkdlbmVyYXRlZCA9ICFJbnB1dEZpbGVuYW1lcy5lbXB0eSgpOworCisgIC8vIFRyYXZlcnNlIGluaXRpYWwgcGFydHMgb2YgdGhlIHRvb2xjaGFpbnMgYW5kIGZpbGwgaW4gSW5MYW5ncy4KKyAgaWYgKGludCByZXQgPSBCdWlsZEluaXRpYWwoSW5MYW5ncywgVGVtcERpciwgTGFuZ01hcCkpCisgICAgcmV0dXJuIHJldDsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBOb2RlKj4gSlRWOworICBpZiAoaW50IHJldCA9IFRvcG9sb2dpY2FsU29ydEZpbHRlckpvaW5Ob2RlcyhKVFYpKQorICAgIHJldHVybiByZXQ7CisKKyAgLy8gRm9yIGFsbCBqb2luIG5vZGVzIGluIHRvcG9sb2dpY2FsIG9yZGVyOgorICBmb3IgKHN0ZDo6dmVjdG9yPGNvbnN0IE5vZGUqPjo6aXRlcmF0b3IgQiA9IEpUVi5iZWdpbigpLCBFID0gSlRWLmVuZCgpOworICAgICAgIEIgIT0gRTsgKytCKSB7CisKKyAgICBjb25zdCBOb2RlKiBDdXJOb2RlID0gKkI7CisgICAgSm9pblRvb2wqIEpUID0gJnN0YXRpY19jYXN0PEpvaW5Ub29sJj4oKkN1ck5vZGUtPlRvb2xQdHIuZ2V0UHRyKCkpOworCisgICAgLy8gQXJlIHRoZXJlIGFueSBmaWxlcyBpbiB0aGUgam9pbiBsaXN0PworICAgIGlmIChKVC0+Sm9pbkxpc3RFbXB0eSgpICYmICEoSlQtPldvcmtzT25FbXB0eSgpICYmIElucHV0RmlsZW5hbWVzLmVtcHR5KCkpKQorICAgICAgY29udGludWU7CisKKyAgICBXYXNTb21lQWN0aW9uR2VuZXJhdGVkID0gdHJ1ZTsKKyAgICBBY3Rpb24gQ3VyQWN0aW9uOworICAgIGlmIChpbnQgcmV0ID0gSlQtPkdlbmVyYXRlQWN0aW9uKEN1ckFjdGlvbiwgQ3VyTm9kZS0+SGFzQ2hpbGRyZW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wRGlyLCBJbkxhbmdzLCBMYW5nTWFwKSkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoaW50IHJldCA9IEN1ckFjdGlvbi5FeGVjdXRlKCkpCisgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKEN1ckFjdGlvbi5TdG9wQ29tcGlsYXRpb24oKSkKKyAgICAgIHJldHVybiAwOworCisgICAgY29uc3QgRWRnZSogRWRnID0gQ2hvb3NlRWRnZShDdXJOb2RlLT5PdXRFZGdlcywgSW5MYW5ncywgQ3VyTm9kZS0+TmFtZSgpKTsKKyAgICBpZiAoRWRnID09IDApCisgICAgICByZXR1cm4gMTsKKworICAgIGNvbnN0IE5vZGUqIE5leHROb2RlID0gZ2V0Tm9kZShFZGctPlRvb2xOYW1lKCkpOworICAgIGlmIChOZXh0Tm9kZSA9PSAwKQorICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoaW50IHJldCA9IFBhc3NUaHJvdWdoR3JhcGgoc3lzOjpQYXRoKEN1ckFjdGlvbi5PdXRGaWxlKCkpLCBOZXh0Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5MYW5ncywgVGVtcERpciwgTGFuZ01hcCkpIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisKKyAgaWYgKCFXYXNTb21lQWN0aW9uR2VuZXJhdGVkKSB7CisgICAgUHJpbnRFcnJvcigibm8gaW5wdXQgZmlsZXMiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCitpbnQgQ29tcGlsYXRpb25HcmFwaDo6Q2hlY2tMYW5ndWFnZU5hbWVzKCkgY29uc3QgeworICBpbnQgcmV0ID0gMDsKKworICAvLyBDaGVjayB0aGF0IG5hbWVzIGZvciBvdXRwdXQgYW5kIGlucHV0IGxhbmd1YWdlcyBvbiBhbGwgZWRnZXMgZG8gbWF0Y2guCisgIGZvciAoY29uc3Rfbm9kZXNfaXRlcmF0b3IgQiA9IHRoaXMtPk5vZGVzTWFwLmJlZ2luKCksCisgICAgICAgICBFID0gdGhpcy0+Tm9kZXNNYXAuZW5kKCk7IEIgIT0gRTsgKytCKSB7CisKKyAgICBjb25zdCBOb2RlICYgTjEgPSBCLT5zZWNvbmQ7CisgICAgaWYgKE4xLlRvb2xQdHIpIHsKKyAgICAgIGZvciAoTm9kZTo6Y29uc3RfaXRlcmF0b3IgRUIgPSBOMS5FZGdlc0JlZ2luKCksIEVFID0gTjEuRWRnZXNFbmQoKTsKKyAgICAgICAgICAgRUIgIT0gRUU7ICsrRUIpIHsKKyAgICAgICAgY29uc3QgTm9kZSogTjIgPSB0aGlzLT5nZXROb2RlKCgqRUIpLT5Ub29sTmFtZSgpKTsKKyAgICAgICAgaWYgKE4yID09IDApCisgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgaWYgKCFOMi0+VG9vbFB0cikgeworICAgICAgICAgICsrcmV0OworICAgICAgICAgIGVycnMoKSA8PCAiRXJyb3I6IHRoZXJlIGlzIGFuIGVkZ2UgZnJvbSAnIiA8PCBOMS5Ub29sUHRyLT5OYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIicgYmFjayB0byB0aGUgcm9vdCFcblxuIjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXIqIE91dExhbmcgPSBOMS5Ub29sUHRyLT5PdXRwdXRMYW5ndWFnZSgpOworICAgICAgICBjb25zdCBjaGFyKiogSW5MYW5ncyA9IE4yLT5Ub29sUHRyLT5JbnB1dExhbmd1YWdlcygpOworICAgICAgICBib29sIGVxID0gZmFsc2U7CisgICAgICAgIGZvciAoOypJbkxhbmdzOyArK0luTGFuZ3MpIHsKKyAgICAgICAgICBpZiAoc3RkOjpzdHJjbXAoT3V0TGFuZywgKkluTGFuZ3MpID09IDApIHsKKyAgICAgICAgICAgIGVxID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZXEpIHsKKyAgICAgICAgICArK3JldDsKKyAgICAgICAgICBlcnJzKCkgPDwgIkVycm9yOiBPdXRwdXQtPmlucHV0IGxhbmd1YWdlIG1pc21hdGNoIGluIHRoZSBlZGdlICciCisgICAgICAgICAgICAgICAgIDw8IE4xLlRvb2xQdHItPk5hbWUoKSA8PCAiJyAtPiAnIiA8PCBOMi0+VG9vbFB0ci0+TmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICInIVxuIgorICAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgb25lIG9mIHsgIjsKKworICAgICAgICAgIEluTGFuZ3MgPSBOMi0+VG9vbFB0ci0+SW5wdXRMYW5ndWFnZXMoKTsKKyAgICAgICAgICBmb3IgKDsqSW5MYW5nczsgKytJbkxhbmdzKSB7CisgICAgICAgICAgICBlcnJzKCkgPDwgJ1wnJyA8PCAqSW5MYW5ncyA8PCAoKihJbkxhbmdzKzEpID8gIicsICIgOiAiJyIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGVycnMoKSA8PCAiIH0sIGJ1dCBnb3QgJyIgPDwgT3V0TGFuZyA8PCAiJyFcblxuIjsKKyAgICAgICAgfQorCisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworaW50IENvbXBpbGF0aW9uR3JhcGg6OkNoZWNrTXVsdGlwbGVEZWZhdWx0RWRnZXMoKSBjb25zdCB7CisgIGludCByZXQgPSAwOworICBJbnB1dExhbmd1YWdlc1NldCBEdW1teTsKKworICAvLyBGb3IgYWxsIG5vZGVzLCBqdXN0IGl0ZXJhdGUgb3ZlciB0aGUgb3V0Z29pbmcgZWRnZXMgYW5kIGNoZWNrIGlmIHRoZXJlIGlzCisgIC8vIG1vcmUgdGhhbiBvbmUgZWRnZSB3aXRoIG1heGltdW0gd2VpZ2h0LgorICBmb3IgKGNvbnN0X25vZGVzX2l0ZXJhdG9yIEIgPSB0aGlzLT5Ob2Rlc01hcC5iZWdpbigpLAorICAgICAgICAgRSA9IHRoaXMtPk5vZGVzTWFwLmVuZCgpOyBCICE9IEU7ICsrQikgeworICAgIGNvbnN0IE5vZGUmIE4gPSBCLT5zZWNvbmQ7CisgICAgdW5zaWduZWQgTWF4V2VpZ2h0ID0gMDsKKworICAgIC8vIElnbm9yZSB0aGUgcm9vdCBub2RlLgorICAgIGlmICghTi5Ub29sUHRyKQorICAgICAgY29udGludWU7CisKKyAgICBmb3IgKE5vZGU6OmNvbnN0X2l0ZXJhdG9yIEVCID0gTi5FZGdlc0JlZ2luKCksIEVFID0gTi5FZGdlc0VuZCgpOworICAgICAgICAgRUIgIT0gRUU7ICsrRUIpIHsKKyAgICAgIHVuc2lnbmVkIEVkZ2VXZWlnaHQgPSAoKkVCKS0+V2VpZ2h0KER1bW15KTsKKyAgICAgIGlmIChFZGdlV2VpZ2h0ID4gTWF4V2VpZ2h0KSB7CisgICAgICAgIE1heFdlaWdodCA9IEVkZ2VXZWlnaHQ7CisgICAgICB9CisgICAgICBlbHNlIGlmIChFZGdlV2VpZ2h0ID09IE1heFdlaWdodCkgeworICAgICAgICArK3JldDsKKyAgICAgICAgZXJycygpIDw8ICJFcnJvcjogdGhlcmUgYXJlIG11bHRpcGxlIG1heGltYWwgZWRnZXMgc3RlbW1pbmcgZnJvbSB0aGUgJyIKKyAgICAgICAgICAgICAgIDw8IE4uVG9vbFB0ci0+TmFtZSgpIDw8ICInIG5vZGUhXG5cbiI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBDb21waWxhdGlvbkdyYXBoOjpDaGVja0N5Y2xlcygpIHsKKyAgdW5zaWduZWQgZGVsZXRlZCA9IDA7CisgIHN0ZDo6cXVldWU8Tm9kZSo+IFE7CisKKyAgTm9kZSogUm9vdCA9IGdldE5vZGUoInJvb3QiKTsKKyAgaWYgKFJvb3QgPT0gMCkKKyAgICByZXR1cm4gMTsKKworICBRLnB1c2goUm9vdCk7CisKKyAgLy8gVHJ5IHRvIGRlbGV0ZSBhbGwgbm9kZXMgdGhhdCBoYXZlIG5vIGluZ29pbmcgZWRnZXMsIHN0YXJ0aW5nIGZyb20gdGhlCisgIC8vIHJvb3QuIElmIHRoZXJlIGFyZSBhbnkgbm9kZXMgbGVmdCBhZnRlciB0aGlzIG9wZXJhdGlvbiwgdGhlbiB3ZSBoYXZlIGEKKyAgLy8gY3ljbGUuIFRoaXMgcmVsaWVzIG9uICctLWNoZWNrLWdyYXBoJyBub3QgcGVyZm9ybWluZyB0aGUgdG9wb2xvZ2ljYWwgc29ydC4KKyAgd2hpbGUgKCFRLmVtcHR5KCkpIHsKKyAgICBOb2RlKiBBID0gUS5mcm9udCgpOworICAgIFEucG9wKCk7CisgICAgKytkZWxldGVkOworCisgICAgZm9yIChOb2RlOjppdGVyYXRvciBFQiA9IEEtPkVkZ2VzQmVnaW4oKSwgRUUgPSBBLT5FZGdlc0VuZCgpOworICAgICAgICAgRUIgIT0gRUU7ICsrRUIpIHsKKyAgICAgIE5vZGUqIEIgPSBnZXROb2RlKCgqRUIpLT5Ub29sTmFtZSgpKTsKKyAgICAgIGlmIChCID09IDApCisgICAgICAgIHJldHVybiAxOworCisgICAgICBCLT5EZWNySW5FZGdlcygpOworICAgICAgaWYgKEItPkhhc05vSW5FZGdlcygpKQorICAgICAgICBRLnB1c2goQik7CisgICAgfQorICB9CisKKyAgaWYgKGRlbGV0ZWQgIT0gTm9kZXNNYXAuc2l6ZSgpKSB7CisgICAgZXJycygpIDw8ICJFcnJvcjogdGhlcmUgYXJlIGN5Y2xlcyBpbiB0aGUgY29tcGlsYXRpb24gZ3JhcGghXG4iCisgICAgICAgICAgIDw8ICJUcnkgaW5zcGVjdGluZyB0aGUgZGlhZ3JhbSBwcm9kdWNlZCBieSAiCisgICAgICAgICAgIDw8ICInbGx2bWMgLS12aWV3LWdyYXBoJy5cblxuIjsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCitpbnQgQ29tcGlsYXRpb25HcmFwaDo6Q2hlY2sgKCkgeworICAvLyBXZSB0cnkgdG8gY2F0Y2ggYXMgbWFueSBlcnJvcnMgYXMgd2UgY2FuIGluIG9uZSBnby4KKyAgaW50IGVycnMgPSAwOworICBpbnQgcmV0ID0gMDsKKworICAvLyBDaGVjayB0aGF0IG91dHB1dC9pbnB1dCBsYW5ndWFnZSBuYW1lcyBtYXRjaC4KKyAgcmV0ID0gdGhpcy0+Q2hlY2tMYW5ndWFnZU5hbWVzKCk7CisgIGlmIChyZXQgPCAwKQorICAgIHJldHVybiAxOworICBlcnJzICs9IHJldDsKKworICAvLyBDaGVjayBmb3IgbXVsdGlwbGUgZGVmYXVsdCBlZGdlcy4KKyAgcmV0ID0gdGhpcy0+Q2hlY2tNdWx0aXBsZURlZmF1bHRFZGdlcygpOworICBpZiAocmV0IDwgMCkKKyAgICByZXR1cm4gMTsKKyAgZXJycyArPSByZXQ7CisKKyAgLy8gQ2hlY2sgZm9yIGN5Y2xlcy4KKyAgcmV0ID0gdGhpcy0+Q2hlY2tDeWNsZXMoKTsKKyAgaWYgKHJldCA8IDApCisgICAgcmV0dXJuIDE7CisgIGVycnMgKz0gcmV0OworCisgIHJldHVybiBlcnJzOworfQorCisvLyBDb2RlIHJlbGF0ZWQgdG8gZ3JhcGggdmlzdWFsaXphdGlvbi4KKworbmFtZXNwYWNlIGxsdm0geworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgRE9UR3JhcGhUcmFpdHM8bGx2bWM6OkNvbXBpbGF0aW9uR3JhcGgqPgorICAgIDogcHVibGljIERlZmF1bHRET1RHcmFwaFRyYWl0cworICB7CisgICAgRE9UR3JhcGhUcmFpdHMgKGJvb2wgaXNTaW1wbGU9ZmFsc2UpIDogRGVmYXVsdERPVEdyYXBoVHJhaXRzKGlzU2ltcGxlKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgR3JhcGhUeXBlPgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXROb2RlTGFiZWwoY29uc3QgTm9kZSogTiwgY29uc3QgR3JhcGhUeXBlJikKKyAgICB7CisgICAgICBpZiAoTi0+VG9vbFB0cikKKyAgICAgICAgaWYgKE4tPlRvb2xQdHItPklzSm9pbigpKQorICAgICAgICAgIHJldHVybiBOLT5OYW1lKCkgKyAiXG4gKGpvaW4iICsKKyAgICAgICAgICAgIChOLT5IYXNDaGlsZHJlbigpID8gIikiCisgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZygiOiAiKSArIE4tPlRvb2xQdHItPk91dHB1dExhbmd1YWdlKCkgKyAnKScpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIE4tPk5hbWUoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICJyb290IjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFZGdlSXRlcj4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RWRnZVNvdXJjZUxhYmVsKGNvbnN0IE5vZGUqIE4sIEVkZ2VJdGVyIEkpIHsKKyAgICAgIGlmIChOLT5Ub29sUHRyKSB7CisgICAgICAgIHJldHVybiBOLT5Ub29sUHRyLT5PdXRwdXRMYW5ndWFnZSgpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIqKiBJbkxhbmdzID0gSS0+VG9vbFB0ci0+SW5wdXRMYW5ndWFnZXMoKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmV0OworCisgICAgICAgIGZvciAoOyAqSW5MYW5nczsgKytJbkxhbmdzKSB7CisgICAgICAgICAgaWYgKCooSW5MYW5ncyArIDEpKSB7CisgICAgICAgICAgICByZXQgKz0gKkluTGFuZ3M7CisgICAgICAgICAgICByZXQgKz0gICIsICI7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0ICs9ICpJbkxhbmdzOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgfQorICB9OworCit9CisKK2ludCBDb21waWxhdGlvbkdyYXBoOjp3cml0ZUdyYXBoKGNvbnN0IHN0ZDo6c3RyaW5nJiBPdXRwdXRGaWxlbmFtZSkgeworICBzdGQ6OnN0cmluZyBFcnJvckluZm87CisgIHJhd19mZF9vc3RyZWFtIE8oT3V0cHV0RmlsZW5hbWUuY19zdHIoKSwgRXJyb3JJbmZvKTsKKworICBpZiAoRXJyb3JJbmZvLmVtcHR5KCkpIHsKKyAgICBlcnJzKCkgPDwgIldyaXRpbmcgJyI8PCBPdXRwdXRGaWxlbmFtZSA8PCAiJyBmaWxlLi4uIjsKKyAgICBsbHZtOjpXcml0ZUdyYXBoKE8sIHRoaXMpOworICAgIGVycnMoKSA8PCAiZG9uZS5cbiI7CisgIH0KKyAgZWxzZSB7CisgICAgUHJpbnRFcnJvcigiRXJyb3Igb3BlbmluZyBmaWxlICciICsgT3V0cHV0RmlsZW5hbWUgKyAiJyBmb3Igd3JpdGluZyEiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCit2b2lkIENvbXBpbGF0aW9uR3JhcGg6OnZpZXdHcmFwaCgpIHsKKyAgbGx2bTo6Vmlld0dyYXBoKHRoaXMsICJjb21waWxhdGlvbi1ncmFwaCIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL01haW4uY3BwIGIvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL01haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGYxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29tcGlsZXJEcml2ZXIvTWFpbi5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8vPT09LS0tIE1haW4uY3BwIC0gVGhlIExMVk0gQ29tcGlsZXIgRHJpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIGxsdm1jOjpNYWluIGZ1bmN0aW9uIC0gZHJpdmVyIGVudHJ5IHBvaW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvbXBpbGVyRHJpdmVyL0J1aWx0aW5PcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Db21waWxlckRyaXZlci9Db21waWxhdGlvbkdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9Db21waWxlckRyaXZlci9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vQ29tcGlsZXJEcml2ZXIvUGx1Z2luLmgiCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9QYXRoLmgiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGNsID0gbGx2bTo6Y2w7CituYW1lc3BhY2Ugc3lzID0gbGx2bTo6c3lzOwordXNpbmcgbmFtZXNwYWNlIGxsdm1jOworCituYW1lc3BhY2UgeworCisgIHN0ZDo6c3RyaW5nc3RyZWFtKiBHbG9iYWxUaW1lTG9nOworCisgIC8vLyBHZXRUZW1wRGlyIC0gR2V0IHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGxvY2F0aW9uLiBSZXR1cm5zIG5vbi16ZXJvIHZhbHVlCisgIC8vLyBvbiBlcnJvci4KKyAgaW50IEdldFRlbXBEaXIoc3lzOjpQYXRoJiB0ZW1wRGlyKSB7CisgICAgLy8gVGhlIC0tdGVtcC1kaXIgb3B0aW9uLgorICAgIGlmICghVGVtcERpcm5hbWUuZW1wdHkoKSkgeworICAgICAgdGVtcERpciA9IFRlbXBEaXJuYW1lOworICAgIH0KKyAgICAvLyBHQ0MgNC41LXN0eWxlIC1zYXZlLXRlbXBzIGhhbmRsaW5nLgorICAgIGVsc2UgaWYgKFNhdmVUZW1wcyA9PSBTYXZlVGVtcHNFbnVtOjpVbnNldCkgeworICAgICAgdGVtcERpciA9IHN5czo6UGF0aDo6R2V0VGVtcG9yYXJ5RGlyZWN0b3J5KCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoU2F2ZVRlbXBzID09IFNhdmVUZW1wc0VudW06Ok9iaiAmJiAhT3V0cHV0RmlsZW5hbWUuZW1wdHkoKSkgeworICAgICAgdGVtcERpciA9IE91dHB1dEZpbGVuYW1lOworICAgICAgdGVtcERpciA9IHRlbXBEaXIuZ2V0RGlybmFtZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vIFNhdmVUZW1wcyA9PSBDd2QgLS0+IHVzZSBjdXJyZW50IGRpciAobGVhdmUgdGVtcERpciBlbXB0eSkuCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXRlbXBEaXIuZXhpc3RzKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIEVyck1zZzsKKyAgICAgIGlmICh0ZW1wRGlyLmNyZWF0ZURpcmVjdG9yeU9uRGlzayh0cnVlLCAmRXJyTXNnKSkgeworICAgICAgICBQcmludEVycm9yKEVyck1zZyk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIEJ1aWxkVGFyZ2V0cyAtIEEgc21hbGwgd3JhcHBlciBmb3IgQ29tcGlsYXRpb25HcmFwaDo6QnVpbGQuIFJldHVybnMgbm9uLXplcm8gdmFsdWUKKyAgaW50IEJ1aWxkVGFyZ2V0cyhDb21waWxhdGlvbkdyYXBoJiBncmFwaCwgY29uc3QgTGFuZ3VhZ2VNYXAmIGxhbmdNYXApIHsKKyAgICBpbnQgcmV0OworICAgIHN5czo6UGF0aCB0ZW1wRGlyOworICAgIGJvb2wgdG9EZWxldGUgPSAoU2F2ZVRlbXBzID09IFNhdmVUZW1wc0VudW06OlVuc2V0KTsKKworICAgIGlmIChpbnQgcmV0ID0gR2V0VGVtcERpcih0ZW1wRGlyKSkKKyAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBncmFwaC5CdWlsZCh0ZW1wRGlyLCBsYW5nTWFwKTsKKworICAgIGlmICh0b0RlbGV0ZSkKKyAgICAgIHRlbXBEaXIuZXJhc2VGcm9tRGlzayh0cnVlKTsKKworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworbmFtZXNwYWNlIGxsdm1jIHsKKworLy8gVXNlZCB0byBpbXBsZW1lbnQgLXRpbWUgb3B0aW9uLiBFeHRlcm5hbCBsaW5rYWdlIGlzIGludGVudGlvbmFsLgordm9pZCBBcHBlbmRUb0dsb2JhbFRpbWVMb2coY29uc3Qgc3RkOjpzdHJpbmcmIGNtZCwgZG91YmxlIHRpbWUpIHsKKyAgKkdsb2JhbFRpbWVMb2cgPDwgIiMgIiA8PCBjbWQgPDwgJyAnIDw8IHRpbWUgPDwgJ1xuJzsKK30KKworLy8gU29tZXRpbWVzIHBsdWdpbnMgd2FudCB0byBjb25kaXRpb24gb24gdGhlIHZhbHVlIGluIGFyZ3ZbMF0uCitjb25zdCBjaGFyKiBQcm9ncmFtTmFtZTsKKworaW50IE1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGludCByZXQgPSAwOworICBMYW5ndWFnZU1hcCBsYW5nTWFwOworICBDb21waWxhdGlvbkdyYXBoIGdyYXBoOworCisgIFByb2dyYW1OYW1lID0gYXJndlswXTsKKworICBjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMKKyAgICAoYXJnYywgYXJndiwgIkxMVk0gQ29tcGlsZXIgRHJpdmVyIChXb3JrIEluIFByb2dyZXNzKSIsCisgICAgIC8qIFJlYWRSZXNwb25zZUZpbGVzID0gKi8gZmFsc2UpOworCisgIFBsdWdpbkxvYWRlciBQbHVnaW5zOworICBpZiAoaW50IHJldCA9IFBsdWdpbnMuUnVuSW5pdGlhbGl6YXRpb24obGFuZ01hcCwgZ3JhcGgpKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYgKENoZWNrR3JhcGgpIHsKKyAgICByZXQgPSBncmFwaC5DaGVjaygpOworICAgIGlmICghcmV0KQorICAgICAgbGx2bTo6ZXJycygpIDw8ICJjaGVjay1ncmFwaDogbm8gZXJyb3JzIGZvdW5kLlxuIjsKKworICAgIHJldHVybiByZXQ7CisgIH0KKworICBpZiAoVmlld0dyYXBoKSB7CisgICAgZ3JhcGgudmlld0dyYXBoKCk7CisgICAgaWYgKCFXcml0ZUdyYXBoKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoV3JpdGVHcmFwaCkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBPdXQgPSAoT3V0cHV0RmlsZW5hbWUuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGQ6OnN0cmluZygiY29tcGlsYXRpb24tZ3JhcGguZG90IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogT3V0cHV0RmlsZW5hbWUpOworICAgIHJldHVybiBncmFwaC53cml0ZUdyYXBoKE91dCk7CisgIH0KKworICBpZiAoVGltZSkgeworICAgIEdsb2JhbFRpbWVMb2cgPSBuZXcgc3RkOjpzdHJpbmdzdHJlYW07CisgICAgR2xvYmFsVGltZUxvZy0+cHJlY2lzaW9uKDIpOworICB9CisKKyAgcmV0ID0gQnVpbGRUYXJnZXRzKGdyYXBoLCBsYW5nTWFwKTsKKworICBpZiAoVGltZSkgeworICAgIGxsdm06OmVycnMoKSA8PCBHbG9iYWxUaW1lTG9nLT5zdHIoKTsKKyAgICBkZWxldGUgR2xvYmFsVGltZUxvZzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtYwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjlmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29tcGlsZXJEcml2ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw0NSBAQAorIyM9PT0tIGxpYi9Db21waWxlckRyaXZlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorCisjIFdlIGRvbid0IHdhbnQgdGhpcyBsaWJyYXJ5IHRvIGFwcGVhciBpbiBgbGx2bS1jb25maWcgLS1saWJzYCBvdXRwdXQsIHNvIGl0cworIyBuYW1lIGRvZXNuJ3Qgc3RhcnQgd2l0aCAiTExWTSIuCisKK2lmZXEgKCQoRU5BQkxFX0xMVk1DX0RZTkFNSUMpLDEpCisgIExJQlJBUllOQU1FID0gbGliQ29tcGlsZXJEcml2ZXIKKyAgTExWTUxJQlMgPSBMTFZNU3VwcG9ydC5hIExMVk1TeXN0ZW0uYQorICBMT0FEQUJMRV9NT0RVTEUgOj0gMQorZWxzZQorICBMSUJSQVJZTkFNRSA9IENvbXBpbGVyRHJpdmVyCisgIExJTktfQ09NUE9ORU5UUyA9IHN1cHBvcnQgc3lzdGVtCitlbmRpZgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCitpZmVxICgkKEVOQUJMRV9MTFZNQ19EWU5BTUlDX1BMVUdJTlMpLCAxKQorICAgIENQUC5GbGFncyArPSAtREVOQUJMRV9MTFZNQ19EWU5BTUlDX1BMVUdJTlMKK2VuZGlmCisKKyMgQ29weSBsaWJDb21waWxlckRyaXZlciB0byB0aGUgYmluIGRpciBzbyB0aGF0IGxsdm1jIGNhbiBmaW5kIGl0LgoraWZlcSAoJChFTkFCTEVfTExWTUNfRFlOQU1JQyksMSkKKworRnVsbExpYk5hbWUgPSAkKExJQlJBUllOQU1FKSQoU0hMSUJFWFQpCisKK2FsbC1sb2NhbDo6ICQoVG9vbERpcikvJChGdWxsTGliTmFtZSkKKworJChUb29sRGlyKS8kKEZ1bGxMaWJOYW1lKTogJChMaWJEaXIpLyQoRnVsbExpYk5hbWUpICQoVG9vbERpcikvLmRpcgorCSQoRWNobykgQ29weWluZyAkKEJ1aWxkTW9kZSkgU2hhcmVkIExpYnJhcnkgJChGdWxsTGliTmFtZSkgdG8gJEAKKwktJChWZXJiKSAkKENQKSAkPCAkQAorCitjbGVhbi1sb2NhbDo6CisJJChFY2hvKSBSZW1vdmluZyAkKEJ1aWxkTW9kZSkgU2hhcmVkIExpYnJhcnkgJChGdWxsTGliTmFtZSkgXAorCWZyb20gJChUb29sRGlyKQorCS0kKFZlcmIpICQoUk0pIC1mICQoVG9vbERpcikvJChGdWxsTGliTmFtZSkKK2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvQ29tcGlsZXJEcml2ZXIvUGx1Z2luLmNwcCBiL3NyYy9MTFZNL2xpYi9Db21waWxlckRyaXZlci9QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjBkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29tcGlsZXJEcml2ZXIvUGx1Z2luLmNwcApAQCAtMCwwICsxLDgzIEBACisvLz09PS0tLSBQbHVnaW4uY3BwIC0gVGhlIExMVk0gQ29tcGlsZXIgRHJpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBQbHVnaW4gc3VwcG9ydC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db21waWxlckRyaXZlci9QbHVnaW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL011dGV4LmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHsKKworICAvLyBSZWdpc3RyeTo6QWRkPD4gZG9lcyBub3QgZG8gbGlmZXRpbWUgbWFuYWdlbWVudCAocHJvYmFibHkgaXNzdWVzCisgIC8vIHdpdGggc3RhdGljIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igb3JkZXJpbmcpLCBzbyB3ZSBoYXZlIHRvCisgIC8vIGltcGxlbWVudCBpdCBoZXJlLgorICAvLworICAvLyBBbGwgdGhpcyBzdGF0aWMgcmVnaXN0cmF0aW9uL2xpZmUtYmVmb3JlLW1haW4gbW9kZWwgc2VlbXMKKyAgLy8gdW5uZWNlc3NhcnkgY29udm9sdXRlZCB0byBtZS4KKworICBzdGF0aWMgYm9vbCBwbHVnaW5MaXN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCBsbHZtYzo6QmFzZVBsdWdpbio+IFBsdWdpbkxpc3Q7CisgIHN0YXRpYyBQbHVnaW5MaXN0IFBsdWdpbnM7CisgIHN0YXRpYyBsbHZtOjpNYW5hZ2VkU3RhdGljPGxsdm06OnN5czo6U21hcnRNdXRleDx0cnVlPiA+IFBsdWdpbk11dGV4OworCisgIHN0cnVjdCBCeVByaW9yaXR5IHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgbGx2bWM6OkJhc2VQbHVnaW4qIGxocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bWM6OkJhc2VQbHVnaW4qIHJocykgeworICAgICAgcmV0dXJuIGxocy0+UHJpb3JpdHkoKSA8IHJocy0+UHJpb3JpdHkoKTsKKyAgICB9CisgIH07Cit9CisKK25hbWVzcGFjZSBsbHZtYyB7CisKKyAgUGx1Z2luTG9hZGVyOjpQbHVnaW5Mb2FkZXIoKSB7CisgICAgbGx2bTo6c3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gTG9jaygqUGx1Z2luTXV0ZXgpOworICAgIGlmICghcGx1Z2luTGlzdEluaXRpYWxpemVkKSB7CisgICAgICBmb3IgKFBsdWdpblJlZ2lzdHJ5OjppdGVyYXRvciBCID0gUGx1Z2luUmVnaXN0cnk6OmJlZ2luKCksCisgICAgICAgICAgICAgRSA9IFBsdWdpblJlZ2lzdHJ5OjplbmQoKTsgQiAhPSBFOyArK0IpCisgICAgICAgIFBsdWdpbnMucHVzaF9iYWNrKEItPmluc3RhbnRpYXRlKCkpOworICAgICAgc3RkOjpzb3J0KFBsdWdpbnMuYmVnaW4oKSwgUGx1Z2lucy5lbmQoKSwgQnlQcmlvcml0eSgpKTsKKyAgICB9CisgICAgcGx1Z2luTGlzdEluaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorCisgIFBsdWdpbkxvYWRlcjo6flBsdWdpbkxvYWRlcigpIHsKKyAgICBsbHZtOjpzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBMb2NrKCpQbHVnaW5NdXRleCk7CisgICAgaWYgKHBsdWdpbkxpc3RJbml0aWFsaXplZCkgeworICAgICAgZm9yIChQbHVnaW5MaXN0OjppdGVyYXRvciBCID0gUGx1Z2lucy5iZWdpbigpLCBFID0gUGx1Z2lucy5lbmQoKTsKKyAgICAgICAgICAgQiAhPSBFOyArK0IpCisgICAgICAgIGRlbGV0ZSAoKkIpOworICAgIH0KKyAgICBwbHVnaW5MaXN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgfQorCisgIGludCBQbHVnaW5Mb2FkZXI6OlJ1bkluaXRpYWxpemF0aW9uKExhbmd1YWdlTWFwJiBsYW5nTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxhdGlvbkdyYXBoJiBncmFwaCkgY29uc3QKKyAgeworICAgIGxsdm06OnN5czo6U21hcnRTY29wZWRMb2NrPHRydWU+IExvY2soKlBsdWdpbk11dGV4KTsKKyAgICBmb3IgKFBsdWdpbkxpc3Q6Oml0ZXJhdG9yIEIgPSBQbHVnaW5zLmJlZ2luKCksIEUgPSBQbHVnaW5zLmVuZCgpOworICAgICAgICAgQiAhPSBFOyArK0IpIHsKKyAgICAgIGNvbnN0IEJhc2VQbHVnaW4qIEJQID0gKkI7CisgICAgICBpZiAoaW50IHJldCA9IEJQLT5QcmVwcm9jZXNzT3B0aW9ucygpKQorICAgICAgICByZXR1cm4gcmV0OworICAgICAgaWYgKGludCByZXQgPSBCUC0+UG9wdWxhdGVMYW5ndWFnZU1hcChsYW5nTWFwKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIGlmIChpbnQgcmV0ID0gQlAtPlBvcHVsYXRlQ29tcGlsYXRpb25HcmFwaChncmFwaCkpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL1Rvb2wuY3BwIGIvc3JjL0xMVk0vbGliL0NvbXBpbGVyRHJpdmVyL1Rvb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDg4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvQ29tcGlsZXJEcml2ZXIvVG9vbC5jcHAKQEAgLTAsMCArMSw5NSBAQAorLy89PT0tLS0gVG9vbC5jcHAgLSBUaGUgTExWTSBDb21waWxlciBEcml2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVG9vbCBiYXNlIGNsYXNzIC0gaW1wbGVtZW50YXRpb24gZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db21waWxlckRyaXZlci9CdWlsdGluT3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQ29tcGlsZXJEcml2ZXIvVG9vbC5oIgorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUGF0aC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIG5hbWVzcGFjZSBsbHZtYzsKKworbmFtZXNwYWNlIHsKKyAgc3lzOjpQYXRoIE1ha2VUZW1wRmlsZShjb25zdCBzeXM6OlBhdGgmIFRlbXBEaXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBCYXNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgU3VmZml4KSB7CisgICAgc3lzOjpQYXRoIE91dDsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBlbmQgdXAgd2l0aCBwYXRoIG5hbWVzIGxpa2UgJy9maWxlLm8nIGlmIHRoZQorICAgIC8vIFRlbXBEaXIgaXMgZW1wdHkuCisgICAgaWYgKFRlbXBEaXIuZW1wdHkoKSkgeworICAgICAgT3V0LnNldChCYXNlTmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgT3V0ID0gVGVtcERpcjsKKyAgICAgIE91dC5hcHBlbmRDb21wb25lbnQoQmFzZU5hbWUpOworICAgIH0KKyAgICBPdXQuYXBwZW5kU3VmZml4KFN1ZmZpeCk7CisgICAgLy8gTk9URTogbWFrZVVuaXF1ZSBhbHdheXMgKmNyZWF0ZXMqIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlLAorICAgIC8vIHdoaWNoIGlzIGdvb2QsIHNpbmNlIHRoZXJlIHdpbGwgYmUgbm8gcmFjZXMuIEhvd2V2ZXIsIHNvbWUKKyAgICAvLyB0b29scyBkbyBub3QgbGlrZSBpdCB3aGVuIHRoZSBvdXRwdXQgZmlsZSBhbHJlYWR5IGV4aXN0cywgc28KKyAgICAvLyB0aGV5IG5lZWQgdG8gYmUgcGxhY2F0ZWQgd2l0aCAtZiBvciBzb21ldGhpbmcgbGlrZSB0aGF0LgorICAgIE91dC5tYWtlVW5pcXVlKHRydWUsIE5VTEwpOworICAgIHJldHVybiBPdXQ7CisgIH0KK30KKworc3lzOjpQYXRoIFRvb2w6Ok91dEZpbGVuYW1lKGNvbnN0IHN5czo6UGF0aCYgSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3lzOjpQYXRoJiBUZW1wRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3RvcENvbXBpbGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIE91dHB1dFN1ZmZpeCkgY29uc3QgeworICBzeXM6OlBhdGggT3V0OworCisgIGlmIChTdG9wQ29tcGlsYXRpb24pIHsKKyAgICBpZiAoIU91dHB1dEZpbGVuYW1lLmVtcHR5KCkpIHsKKyAgICAgIE91dC5zZXQoT3V0cHV0RmlsZW5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmIChJc0pvaW4oKSkgeworICAgICAgT3V0LnNldCgiYSIpOworICAgICAgT3V0LmFwcGVuZFN1ZmZpeChPdXRwdXRTdWZmaXgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIE91dC5zZXQoSW4uZ2V0QmFzZW5hbWUoKSk7CisgICAgICBPdXQuYXBwZW5kU3VmZml4KE91dHB1dFN1ZmZpeCk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmIChJc0pvaW4oKSkKKyAgICAgIE91dCA9IE1ha2VUZW1wRmlsZShUZW1wRGlyLCAidG1wIiwgT3V0cHV0U3VmZml4KTsKKyAgICBlbHNlCisgICAgICBPdXQgPSBNYWtlVGVtcEZpbGUoVGVtcERpciwgSW4uZ2V0QmFzZW5hbWUoKSwgT3V0cHV0U3VmZml4KTsKKyAgfQorICByZXR1cm4gT3V0OworfQorCituYW1lc3BhY2UgeworICB0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQj4KKyAgYm9vbCBDb21wYXJlRmlyc3QgKHN0ZDo6cGFpcjxBLEI+IHAxLCBzdGQ6OnBhaXI8QSxCPiBwMikgeworICAgIHJldHVybiBzdGQ6Omxlc3M8QT4oKShwMS5maXJzdCwgcDIuZmlyc3QpOworICB9Cit9CisKK1N0clZlY3RvciBUb29sOjpTb3J0QXJncyhBcmdzVmVjdG9yJiBBcmdzKSBjb25zdCB7CisgIFN0clZlY3RvciBPdXQ7CisKKyAgLy8gSEFDSzogdGhpcyB3b24ndCBiZSBuZWVkZWQgd2hlbiB3ZSdsbCBtaWdyYXRlIGF3YXkgZnJvbSBDb21tYW5kTGluZS4KKyAgc3RkOjpzdGFibGVfc29ydChBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCksCisgICAgICAgICAgICAgICAgICAgJkNvbXBhcmVGaXJzdDx1bnNpZ25lZCwgc3RkOjpzdHJpbmc+KTsKKyAgZm9yIChBcmdzVmVjdG9yOjppdGVyYXRvciBCID0gQXJncy5iZWdpbigpLCBFID0gQXJncy5lbmQoKTsgQiAhPSBFOyArK0IpIHsKKyAgICBPdXQucHVzaF9iYWNrKEItPnNlY29uZCk7CisgIH0KKworICByZXR1cm4gT3V0OworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0RlYnVnZ2VyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL0RlYnVnZ2VyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTBlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRGVidWdnZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIyM9PT0tIGxpYi9EZWJ1Z2dlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNRGVidWdnZXIKK0VYVFJBX0RJU1QgPSBSRUFETUUudHh0CitSRVFVSVJFU19FSCA6PSAxCitCVUlMRF9BUkNISVZFID0gMQorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxMThjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1FeGVjdXRpb25FbmdpbmUKKyAgRXhlY3V0aW9uRW5naW5lLmNwcAorICBFeGVjdXRpb25FbmdpbmVCaW5kaW5ncy5jcHAKKyAgKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuY3BwIGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTY2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0V4ZWN1dGlvbkVuZ2luZS5jcHAKQEAgLTAsMCArMSwxMTI4IEBACisvLz09PS0tIEV4ZWN1dGlvbkVuZ2luZS5jcHAgLSBDb21tb24gSW1wbGVtZW50YXRpb24gc2hhcmVkIGJ5IEVFcyAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjb21tb24gaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHZhcmlvdXMgZXhlY3V0aW9uIGVuZ2luZQorLy8gc3ViY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImppdCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaCIKKworI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0dlbmVyaWNWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L011dGV4R3VhcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EeW5hbWljTGlicmFyeS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0hvc3QuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0cmluZz4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtSW5pdEJ5dGVzLCAiTnVtYmVyIG9mIGJ5dGVzIG9mIGdsb2JhbCB2YXJzIGluaXRpYWxpemVkIik7CitTVEFUSVNUSUMoTnVtR2xvYmFscyAgLCAiTnVtYmVyIG9mIGdsb2JhbCB2YXJzIGluaXRpYWxpemVkIik7CisKK0V4ZWN1dGlvbkVuZ2luZSAqKCpFeGVjdXRpb25FbmdpbmU6OkpJVEN0b3IpKAorICBNb2R1bGUgKk0sCisgIHN0ZDo6c3RyaW5nICpFcnJvclN0ciwKKyAgSklUTWVtb3J5TWFuYWdlciAqSk1NLAorICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgYm9vbCBHVnNXaXRoQ29kZSwKKyAgQ29kZU1vZGVsOjpNb2RlbCBDTU0sCisgIFN0cmluZ1JlZiBNQXJjaCwKKyAgU3RyaW5nUmVmIE1DUFUsCisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnN0cmluZz4mIE1BdHRycykgPSAwOworRXhlY3V0aW9uRW5naW5lICooKkV4ZWN1dGlvbkVuZ2luZTo6SW50ZXJwQ3RvcikoTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVycm9yU3RyKSA9IDA7CisKK0V4ZWN1dGlvbkVuZ2luZTo6RXhlY3V0aW9uRW5naW5lKE1vZHVsZSAqTSkKKyAgOiBFRVN0YXRlKCp0aGlzKSwKKyAgICBMYXp5RnVuY3Rpb25DcmVhdG9yKDApIHsKKyAgQ29tcGlsaW5nTGF6aWx5ICAgICAgICAgPSBmYWxzZTsKKyAgR1ZDb21waWxhdGlvbkRpc2FibGVkICAgPSBmYWxzZTsKKyAgU3ltYm9sU2VhcmNoaW5nRGlzYWJsZWQgPSBmYWxzZTsKKyAgTW9kdWxlcy5wdXNoX2JhY2soTSk7CisgIGFzc2VydChNICYmICJNb2R1bGUgaXMgbnVsbD8iKTsKK30KKworRXhlY3V0aW9uRW5naW5lOjp+RXhlY3V0aW9uRW5naW5lKCkgeworICBjbGVhckFsbEdsb2JhbE1hcHBpbmdzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNb2R1bGVzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgZGVsZXRlIE1vZHVsZXNbaV07Cit9CisKK25hbWVzcGFjZSB7CisvLyBUaGlzIGNsYXNzIGF1dG9tYXRpY2FsbHkgZGVsZXRlcyB0aGUgbWVtb3J5IGJsb2NrIHdoZW4gdGhlIEdsb2JhbFZhcmlhYmxlIGlzCisvLyBkZXN0cm95ZWQuCitjbGFzcyBHVk1lbW9yeUJsb2NrIDogcHVibGljIENhbGxiYWNrVkggeworICBHVk1lbW9yeUJsb2NrKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikKKyAgICA6IENhbGxiYWNrVkgoY29uc3RfY2FzdDxHbG9iYWxWYXJpYWJsZSo+KEdWKSkge30KKworcHVibGljOgorICAvLyBSZXR1cm5zIHRoZSBhZGRyZXNzIHRoZSBHbG9iYWxWYXJpYWJsZSBzaG91bGQgYmUgd3JpdHRlbiBpbnRvLiAgVGhlCisgIC8vIEdWTWVtb3J5QmxvY2sgb2JqZWN0IHByZWZpeGVzIHRoYXQuCisgIHN0YXRpYyBjaGFyICpDcmVhdGUoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWLCBjb25zdCBUYXJnZXREYXRhJiBURCkgeworICAgIGNvbnN0IFR5cGUgKkVsVHkgPSBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpOworICAgIHNpemVfdCBHVlNpemUgPSAoc2l6ZV90KVRELmdldFR5cGVBbGxvY1NpemUoRWxUeSk7CisgICAgdm9pZCAqUmF3TWVtb3J5ID0gOjpvcGVyYXRvciBuZXcoCisgICAgICBUYXJnZXREYXRhOjpSb3VuZFVwQWxpZ25tZW50KHNpemVvZihHVk1lbW9yeUJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEQuZ2V0UHJlZmVycmVkQWxpZ25tZW50KEdWKSkKKyAgICAgICsgR1ZTaXplKTsKKyAgICBuZXcoUmF3TWVtb3J5KSBHVk1lbW9yeUJsb2NrKEdWKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcio+KFJhd01lbW9yeSkgKyBzaXplb2YoR1ZNZW1vcnlCbG9jayk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZGVsZXRlZCgpIHsKKyAgICAvLyBXZSBhbGxvY2F0ZWQgd2l0aCBvcGVyYXRvciBuZXcgYW5kIHdpdGggc29tZSBleHRyYSBtZW1vcnkgaGFuZ2luZyBvZmYgdGhlCisgICAgLy8gZW5kLCBzbyBkb24ndCBqdXN0IGRlbGV0ZSB0aGlzLiAgSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgYWN0dWFsbHkKKyAgICAvLyByZXF1aXJlZC4KKyAgICB0aGlzLT5+R1ZNZW1vcnlCbG9jaygpOworICAgIDo6b3BlcmF0b3IgZGVsZXRlKHRoaXMpOworICB9Cit9OworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitjaGFyKiBFeGVjdXRpb25FbmdpbmU6OmdldE1lbW9yeUZvckdWKGNvbnN0IEdsb2JhbFZhcmlhYmxlKiBHVikgeworICByZXR1cm4gR1ZNZW1vcnlCbG9jazo6Q3JlYXRlKEdWLCAqZ2V0VGFyZ2V0RGF0YSgpKTsKK30KKworLy8vIHJlbW92ZU1vZHVsZSAtIFJlbW92ZSBhIE1vZHVsZSBmcm9tIHRoZSBsaXN0IG9mIG1vZHVsZXMuCitib29sIEV4ZWN1dGlvbkVuZ2luZTo6cmVtb3ZlTW9kdWxlKE1vZHVsZSAqTSkgeworICBmb3IoU21hbGxWZWN0b3I8TW9kdWxlICosIDE+OjppdGVyYXRvciBJID0gTW9kdWxlcy5iZWdpbigpLCAKKyAgICAgICAgRSA9IE1vZHVsZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgTW9kdWxlICpGb3VuZCA9ICpJOworICAgIGlmIChGb3VuZCA9PSBNKSB7CisgICAgICBNb2R1bGVzLmVyYXNlKEkpOworICAgICAgY2xlYXJHbG9iYWxNYXBwaW5nc0Zyb21Nb2R1bGUoTSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gRmluZEZ1bmN0aW9uTmFtZWQgLSBTZWFyY2ggYWxsIG9mIHRoZSBhY3RpdmUgbW9kdWxlcyB0byBmaW5kIHRoZSBvbmUgdGhhdAorLy8vIGRlZmluZXMgRm5OYW1lLiAgVGhpcyBpcyB2ZXJ5IHNsb3cgb3BlcmF0aW9uIGFuZCBzaG91bGRuJ3QgYmUgdXNlZCBmb3IKKy8vLyBnZW5lcmFsIGNvZGUuCitGdW5jdGlvbiAqRXhlY3V0aW9uRW5naW5lOjpGaW5kRnVuY3Rpb25OYW1lZChjb25zdCBjaGFyICpGbk5hbWUpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1vZHVsZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChGdW5jdGlvbiAqRiA9IE1vZHVsZXNbaV0tPmdldEZ1bmN0aW9uKEZuTmFtZSkpCisgICAgICByZXR1cm4gRjsKKyAgfQorICByZXR1cm4gMDsKK30KKworCit2b2lkICpFeGVjdXRpb25FbmdpbmVTdGF0ZTo6UmVtb3ZlTWFwcGluZygKKyAgY29uc3QgTXV0ZXhHdWFyZCAmLCBjb25zdCBHbG9iYWxWYWx1ZSAqVG9Vbm1hcCkgeworICBHbG9iYWxBZGRyZXNzTWFwVHk6Oml0ZXJhdG9yIEkgPSBHbG9iYWxBZGRyZXNzTWFwLmZpbmQoVG9Vbm1hcCk7CisgIHZvaWQgKk9sZFZhbDsKKyAgaWYgKEkgPT0gR2xvYmFsQWRkcmVzc01hcC5lbmQoKSkKKyAgICBPbGRWYWwgPSAwOworICBlbHNlIHsKKyAgICBPbGRWYWwgPSBJLT5zZWNvbmQ7CisgICAgR2xvYmFsQWRkcmVzc01hcC5lcmFzZShJKTsKKyAgfQorCisgIEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwLmVyYXNlKE9sZFZhbCk7CisgIHJldHVybiBPbGRWYWw7Cit9CisKKy8vLyBhZGRHbG9iYWxNYXBwaW5nIC0gVGVsbCB0aGUgZXhlY3V0aW9uIGVuZ2luZSB0aGF0IHRoZSBzcGVjaWZpZWQgZ2xvYmFsIGlzCisvLy8gYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGFzIGZ1bmN0aW9ucyBhcmUgSklUJ2QKKy8vLyBhbmQgYXMgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbGFpZCBvdXQgaW4gbWVtb3J5LiAgSXQgY2FuIGFuZCBzaG91bGQgYWxzbyBiZQorLy8vIHVzZWQgYnkgY2xpZW50cyBvZiB0aGUgRUUgdGhhdCB3YW50IHRvIGhhdmUgYW4gTExWTSBnbG9iYWwgb3ZlcmxheQorLy8vIGV4aXN0aW5nIGRhdGEgaW4gbWVtb3J5Lgordm9pZCBFeGVjdXRpb25FbmdpbmU6OmFkZEdsb2JhbE1hcHBpbmcoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCB2b2lkICpBZGRyKSB7CisgIE11dGV4R3VhcmQgbG9ja2VkKGxvY2spOworCisgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBNYXAgXCciIDw8IEdWLT5nZXROYW1lKCkgCisgICAgICAgIDw8ICJcJyB0byBbIiA8PCBBZGRyIDw8ICJdXG4iOyk7CisgIHZvaWQgKiZDdXJWYWwgPSBFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NNYXAobG9ja2VkKVtHVl07CisgIGFzc2VydCgoQ3VyVmFsID09IDAgfHwgQWRkciA9PSAwKSAmJiAiR2xvYmFsTWFwcGluZyBhbHJlYWR5IGVzdGFibGlzaGVkISIpOworICBDdXJWYWwgPSBBZGRyOworICAKKyAgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSByZXZlcnNlIG1hcHBpbmcsIGFkZCBpdCB0b28KKyAgaWYgKCFFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwKGxvY2tlZCkuZW1wdHkoKSkgeworICAgIEFzc2VydGluZ1ZIPGNvbnN0IEdsb2JhbFZhbHVlPiAmViA9CisgICAgICBFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwKGxvY2tlZClbQWRkcl07CisgICAgYXNzZXJ0KChWID09IDAgfHwgR1YgPT0gMCkgJiYgIkdsb2JhbE1hcHBpbmcgYWxyZWFkeSBlc3RhYmxpc2hlZCEiKTsKKyAgICBWID0gR1Y7CisgIH0KK30KKworLy8vIGNsZWFyQWxsR2xvYmFsTWFwcGluZ3MgLSBDbGVhciBhbGwgZ2xvYmFsIG1hcHBpbmdzIGFuZCBzdGFydCBvdmVyIGFnYWluCisvLy8gdXNlIGluIGR5bmFtaWMgY29tcGlsYXRpb24gc2NlbmFyaW9zIHdoZW4geW91IHdhbnQgdG8gbW92ZSBnbG9iYWxzCit2b2lkIEV4ZWN1dGlvbkVuZ2luZTo6Y2xlYXJBbGxHbG9iYWxNYXBwaW5ncygpIHsKKyAgTXV0ZXhHdWFyZCBsb2NrZWQobG9jayk7CisgIAorICBFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NNYXAobG9ja2VkKS5jbGVhcigpOworICBFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwKGxvY2tlZCkuY2xlYXIoKTsKK30KKworLy8vIGNsZWFyR2xvYmFsTWFwcGluZ3NGcm9tTW9kdWxlIC0gQ2xlYXIgYWxsIGdsb2JhbCBtYXBwaW5ncyB0aGF0IGNhbWUgZnJvbSBhCisvLy8gcGFydGljdWxhciBtb2R1bGUsIGJlY2F1c2UgaXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBKSVQuCit2b2lkIEV4ZWN1dGlvbkVuZ2luZTo6Y2xlYXJHbG9iYWxNYXBwaW5nc0Zyb21Nb2R1bGUoTW9kdWxlICpNKSB7CisgIE11dGV4R3VhcmQgbG9ja2VkKGxvY2spOworICAKKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEZJID0gTS0+YmVnaW4oKSwgRkUgPSBNLT5lbmQoKTsgRkkgIT0gRkU7ICsrRkkpIHsKKyAgICBFRVN0YXRlLlJlbW92ZU1hcHBpbmcobG9ja2VkLCBGSSk7CisgIH0KKyAgZm9yIChNb2R1bGU6Omdsb2JhbF9pdGVyYXRvciBHSSA9IE0tPmdsb2JhbF9iZWdpbigpLCBHRSA9IE0tPmdsb2JhbF9lbmQoKTsgCisgICAgICAgR0kgIT0gR0U7ICsrR0kpIHsKKyAgICBFRVN0YXRlLlJlbW92ZU1hcHBpbmcobG9ja2VkLCBHSSk7CisgIH0KK30KKworLy8vIHVwZGF0ZUdsb2JhbE1hcHBpbmcgLSBSZXBsYWNlIGFuIGV4aXN0aW5nIG1hcHBpbmcgZm9yIEdWIHdpdGggYSBuZXcKKy8vLyBhZGRyZXNzLiAgVGhpcyB1cGRhdGVzIGJvdGggbWFwcyBhcyByZXF1aXJlZC4gIElmICJBZGRyIiBpcyBudWxsLCB0aGUKKy8vLyBlbnRyeSBmb3IgdGhlIGdsb2JhbCBpcyByZW1vdmVkIGZyb20gdGhlIG1hcHBpbmdzLgordm9pZCAqRXhlY3V0aW9uRW5naW5lOjp1cGRhdGVHbG9iYWxNYXBwaW5nKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgdm9pZCAqQWRkcikgeworICBNdXRleEd1YXJkIGxvY2tlZChsb2NrKTsKKworICBFeGVjdXRpb25FbmdpbmVTdGF0ZTo6R2xvYmFsQWRkcmVzc01hcFR5ICZNYXAgPQorICAgIEVFU3RhdGUuZ2V0R2xvYmFsQWRkcmVzc01hcChsb2NrZWQpOworCisgIC8vIERlbGV0aW5nIGZyb20gdGhlIG1hcHBpbmc/CisgIGlmIChBZGRyID09IDApIHsKKyAgICByZXR1cm4gRUVTdGF0ZS5SZW1vdmVNYXBwaW5nKGxvY2tlZCwgR1YpOworICB9CisgIAorICB2b2lkIComQ3VyVmFsID0gTWFwW0dWXTsKKyAgdm9pZCAqT2xkVmFsID0gQ3VyVmFsOworCisgIGlmIChDdXJWYWwgJiYgIUVFU3RhdGUuZ2V0R2xvYmFsQWRkcmVzc1JldmVyc2VNYXAobG9ja2VkKS5lbXB0eSgpKQorICAgIEVFU3RhdGUuZ2V0R2xvYmFsQWRkcmVzc1JldmVyc2VNYXAobG9ja2VkKS5lcmFzZShDdXJWYWwpOworICBDdXJWYWwgPSBBZGRyOworICAKKyAgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSByZXZlcnNlIG1hcHBpbmcsIGFkZCBpdCB0b28KKyAgaWYgKCFFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwKGxvY2tlZCkuZW1wdHkoKSkgeworICAgIEFzc2VydGluZ1ZIPGNvbnN0IEdsb2JhbFZhbHVlPiAmViA9CisgICAgICBFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwKGxvY2tlZClbQWRkcl07CisgICAgYXNzZXJ0KChWID09IDAgfHwgR1YgPT0gMCkgJiYgIkdsb2JhbE1hcHBpbmcgYWxyZWFkeSBlc3RhYmxpc2hlZCEiKTsKKyAgICBWID0gR1Y7CisgIH0KKyAgcmV0dXJuIE9sZFZhbDsKK30KKworLy8vIGdldFBvaW50ZXJUb0dsb2JhbElmQXZhaWxhYmxlIC0gVGhpcyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQKKy8vLyBnbG9iYWwgdmFsdWUgaWYgaXQgaXMgaGFzIGFscmVhZHkgYmVlbiBjb2RlZ2VuJ2QsIG90aGVyd2lzZSBpdCByZXR1cm5zIG51bGwuCisvLy8KK3ZvaWQgKkV4ZWN1dGlvbkVuZ2luZTo6Z2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoY29uc3QgR2xvYmFsVmFsdWUgKkdWKSB7CisgIE11dGV4R3VhcmQgbG9ja2VkKGxvY2spOworICAKKyAgRXhlY3V0aW9uRW5naW5lU3RhdGU6Okdsb2JhbEFkZHJlc3NNYXBUeTo6aXRlcmF0b3IgSSA9CisgICAgRUVTdGF0ZS5nZXRHbG9iYWxBZGRyZXNzTWFwKGxvY2tlZCkuZmluZChHVik7CisgIHJldHVybiBJICE9IEVFU3RhdGUuZ2V0R2xvYmFsQWRkcmVzc01hcChsb2NrZWQpLmVuZCgpID8gSS0+c2Vjb25kIDogMDsKK30KKworLy8vIGdldEdsb2JhbFZhbHVlQXRBZGRyZXNzIC0gUmV0dXJuIHRoZSBMTFZNIGdsb2JhbCB2YWx1ZSBvYmplY3QgdGhhdCBzdGFydHMKKy8vLyBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisvLy8KK2NvbnN0IEdsb2JhbFZhbHVlICpFeGVjdXRpb25FbmdpbmU6OmdldEdsb2JhbFZhbHVlQXRBZGRyZXNzKHZvaWQgKkFkZHIpIHsKKyAgTXV0ZXhHdWFyZCBsb2NrZWQobG9jayk7CisKKyAgLy8gSWYgd2UgaGF2ZW4ndCBjb21wdXRlZCB0aGUgcmV2ZXJzZSBtYXBwaW5nIHlldCwgZG8gc28gZmlyc3QuCisgIGlmIChFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwKGxvY2tlZCkuZW1wdHkoKSkgeworICAgIGZvciAoRXhlY3V0aW9uRW5naW5lU3RhdGU6Okdsb2JhbEFkZHJlc3NNYXBUeTo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSBFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NNYXAobG9ja2VkKS5iZWdpbigpLAorICAgICAgICAgRSA9IEVFU3RhdGUuZ2V0R2xvYmFsQWRkcmVzc01hcChsb2NrZWQpLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIEVFU3RhdGUuZ2V0R2xvYmFsQWRkcmVzc1JldmVyc2VNYXAobG9ja2VkKS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSS0+c2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS0+Zmlyc3QpKTsKKyAgfQorCisgIHN0ZDo6bWFwPHZvaWQgKiwgQXNzZXJ0aW5nVkg8Y29uc3QgR2xvYmFsVmFsdWU+ID46Oml0ZXJhdG9yIEkgPQorICAgIEVFU3RhdGUuZ2V0R2xvYmFsQWRkcmVzc1JldmVyc2VNYXAobG9ja2VkKS5maW5kKEFkZHIpOworICByZXR1cm4gSSAhPSBFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwKGxvY2tlZCkuZW5kKCkgPyBJLT5zZWNvbmQgOiAwOworfQorCituYW1lc3BhY2UgeworY2xhc3MgQXJndkFycmF5IHsKKyAgY2hhciAqQXJyYXk7CisgIHN0ZDo6dmVjdG9yPGNoYXIqPiBWYWx1ZXM7CitwdWJsaWM6CisgIEFyZ3ZBcnJheSgpIDogQXJyYXkoTlVMTCkge30KKyAgfkFyZ3ZBcnJheSgpIHsgY2xlYXIoKTsgfQorICB2b2lkIGNsZWFyKCkgeworICAgIGRlbGV0ZVtdIEFycmF5OworICAgIEFycmF5ID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBJID0gMCwgRSA9IFZhbHVlcy5zaXplKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBkZWxldGVbXSBWYWx1ZXNbSV07CisgICAgfQorICAgIFZhbHVlcy5jbGVhcigpOworICB9CisgIC8vLyBUdXJuIGEgdmVjdG9yIG9mIHN0cmluZ3MgaW50byBhIG5pY2UgYXJndiBzdHlsZSBhcnJheSBvZiBwb2ludGVycyB0byBudWxsCisgIC8vLyB0ZXJtaW5hdGVkIHN0cmluZ3MuCisgIHZvaWQgKnJlc2V0KExMVk1Db250ZXh0ICZDLCBFeGVjdXRpb25FbmdpbmUgKkVFLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJklucHV0QXJndik7Cit9OworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQordm9pZCAqQXJndkFycmF5OjpyZXNldChMTFZNQ29udGV4dCAmQywgRXhlY3V0aW9uRW5naW5lICpFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZJbnB1dEFyZ3YpIHsKKyAgY2xlYXIoKTsgIC8vIEZyZWUgdGhlIG9sZCBjb250ZW50cy4KKyAgdW5zaWduZWQgUHRyU2l6ZSA9IEVFLT5nZXRUYXJnZXREYXRhKCktPmdldFBvaW50ZXJTaXplKCk7CisgIEFycmF5ID0gbmV3IGNoYXJbKElucHV0QXJndi5zaXplKCkrMSkqUHRyU2l6ZV07CisKKyAgREVCVUcoZGJncygpIDw8ICJKSVQ6IEFSR1YgPSAiIDw8ICh2b2lkKilBcnJheSA8PCAiXG4iKTsKKyAgY29uc3QgVHlwZSAqU0J5dGVQdHIgPSBUeXBlOjpnZXRJbnQ4UHRyVHkoQyk7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBJbnB1dEFyZ3Yuc2l6ZSgpOyArK2kpIHsKKyAgICB1bnNpZ25lZCBTaXplID0gSW5wdXRBcmd2W2ldLnNpemUoKSsxOworICAgIGNoYXIgKkRlc3QgPSBuZXcgY2hhcltTaXplXTsKKyAgICBWYWx1ZXMucHVzaF9iYWNrKERlc3QpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBBUkdWWyIgPDwgaSA8PCAiXSA9ICIgPDwgKHZvaWQqKURlc3QgPDwgIlxuIik7CisKKyAgICBzdGQ6OmNvcHkoSW5wdXRBcmd2W2ldLmJlZ2luKCksIElucHV0QXJndltpXS5lbmQoKSwgRGVzdCk7CisgICAgRGVzdFtTaXplLTFdID0gMDsKKworICAgIC8vIEVuZGlhbiBzYWZlOiBBcnJheVtpXSA9IChQb2ludGVyVHkpRGVzdDsKKyAgICBFRS0+U3RvcmVWYWx1ZVRvTWVtb3J5KFBUT0dWKERlc3QpLCAoR2VuZXJpY1ZhbHVlKikoQXJyYXkraSpQdHJTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCeXRlUHRyKTsKKyAgfQorCisgIC8vIE51bGwgdGVybWluYXRlIGl0CisgIEVFLT5TdG9yZVZhbHVlVG9NZW1vcnkoUFRPR1YoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEdlbmVyaWNWYWx1ZSopKEFycmF5K0lucHV0QXJndi5zaXplKCkqUHRyU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU0J5dGVQdHIpOworICByZXR1cm4gQXJyYXk7Cit9CisKKworLy8vIHJ1blN0YXRpY0NvbnN0cnVjdG9yc0Rlc3RydWN0b3JzIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBleGVjdXRlIGFsbCBvZgorLy8vIHRoZSBzdGF0aWMgY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzIGZvciBhIG1vZHVsZSwgZGVwZW5kaW5nIG9uIHRoZQorLy8vIHZhbHVlIG9mIGlzRHRvcnMuCit2b2lkIEV4ZWN1dGlvbkVuZ2luZTo6cnVuU3RhdGljQ29uc3RydWN0b3JzRGVzdHJ1Y3RvcnMoTW9kdWxlICptb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0R0b3JzKSB7CisgIGNvbnN0IGNoYXIgKk5hbWUgPSBpc0R0b3JzID8gImxsdm0uZ2xvYmFsX2R0b3JzIiA6ICJsbHZtLmdsb2JhbF9jdG9ycyI7CisgIAorICAvLyBFeGVjdXRlIGdsb2JhbCBjdG9ycy9kdG9ycyBmb3IgZWFjaCBtb2R1bGUgaW4gdGhlIHByb2dyYW0uCisgIAorIEdsb2JhbFZhcmlhYmxlICpHViA9IG1vZHVsZS0+Z2V0TmFtZWRHbG9iYWwoTmFtZSk7CisKKyAvLyBJZiB0aGlzIGdsb2JhbCBoYXMgaW50ZXJuYWwgbGlua2FnZSwgb3IgaWYgaXQgaGFzIGEgdXNlLCB0aGVuIGl0IG11c3QgYmUKKyAvLyBhbiBvbGQtc3R5bGUgKGxsdm1nY2MzKSBzdGF0aWMgY3RvciB3aXRoIF9fbWFpbiBsaW5rZWQgaW4gYW5kIGluIHVzZS4gIElmCisgLy8gdGhpcyBpcyB0aGUgY2FzZSwgZG9uJ3QgZXhlY3V0ZSBhbnkgb2YgdGhlIGdsb2JhbCBjdG9ycywgX19tYWluIHdpbGwgZG8KKyAvLyBpdC4KKyBpZiAoIUdWIHx8IEdWLT5pc0RlY2xhcmF0aW9uKCkgfHwgR1YtPmhhc0xvY2FsTGlua2FnZSgpKSByZXR1cm47CisgCisgLy8gU2hvdWxkIGJlIGFuIGFycmF5IG9mICd7IGludCwgdm9pZCAoKSogfScgc3RydWN0cy4gIFRoZSBmaXJzdCB2YWx1ZSBpcworIC8vIHRoZSBpbml0IHByaW9yaXR5LCB3aGljaCB3ZSBpZ25vcmUuCisgQ29uc3RhbnRBcnJheSAqSW5pdExpc3QgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihHVi0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgaWYgKCFJbml0TGlzdCkgcmV0dXJuOworIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbml0TGlzdC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICBpZiAoQ29uc3RhbnRTdHJ1Y3QgKkNTID0gCisgICAgICAgZHluX2Nhc3Q8Q29uc3RhbnRTdHJ1Y3Q+KEluaXRMaXN0LT5nZXRPcGVyYW5kKGkpKSkgeworICAgICBpZiAoQ1MtPmdldE51bU9wZXJhbmRzKCkgIT0gMikgcmV0dXJuOyAvLyBOb3QgYXJyYXkgb2YgMi1lbGVtZW50IHN0cnVjdHMuCisgICAKKyAgICAgQ29uc3RhbnQgKkZQID0gQ1MtPmdldE9wZXJhbmQoMSk7CisgICAgIGlmIChGUC0+aXNOdWxsVmFsdWUoKSkKKyAgICAgICBicmVhazsgIC8vIEZvdW5kIGEgbnVsbCB0ZXJtaW5hdG9yLCBleGl0LgorICAgCisgICAgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihGUCkpCisgICAgICAgaWYgKENFLT5pc0Nhc3QoKSkKKyAgICAgICAgIEZQID0gQ0UtPmdldE9wZXJhbmQoMCk7CisgICAgIGlmIChGdW5jdGlvbiAqRiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihGUCkpIHsKKyAgICAgICAvLyBFeGVjdXRlIHRoZSBjdG9yL2R0b3IgZnVuY3Rpb24hCisgICAgICAgcnVuRnVuY3Rpb24oRiwgc3RkOjp2ZWN0b3I8R2VuZXJpY1ZhbHVlPigpKTsKKyAgICAgfQorICAgfQorfQorCisvLy8gcnVuU3RhdGljQ29uc3RydWN0b3JzRGVzdHJ1Y3RvcnMgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGV4ZWN1dGUgYWxsIG9mCisvLy8gdGhlIHN0YXRpYyBjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMgZm9yIGEgcHJvZ3JhbSwgZGVwZW5kaW5nIG9uIHRoZQorLy8vIHZhbHVlIG9mIGlzRHRvcnMuCit2b2lkIEV4ZWN1dGlvbkVuZ2luZTo6cnVuU3RhdGljQ29uc3RydWN0b3JzRGVzdHJ1Y3RvcnMoYm9vbCBpc0R0b3JzKSB7CisgIC8vIEV4ZWN1dGUgZ2xvYmFsIGN0b3JzL2R0b3JzIGZvciBlYWNoIG1vZHVsZSBpbiB0aGUgcHJvZ3JhbS4KKyAgZm9yICh1bnNpZ25lZCBtID0gMCwgZSA9IE1vZHVsZXMuc2l6ZSgpOyBtICE9IGU7ICsrbSkKKyAgICBydW5TdGF0aWNDb25zdHJ1Y3RvcnNEZXN0cnVjdG9ycyhNb2R1bGVzW21dLCBpc0R0b3JzKTsKK30KKworI2lmbmRlZiBOREVCVUcKKy8vLyBpc1RhcmdldE51bGxQdHIgLSBSZXR1cm4gd2hldGhlciB0aGUgdGFyZ2V0IHBvaW50ZXIgc3RvcmVkIGF0IExvYyBpcyBudWxsLgorc3RhdGljIGJvb2wgaXNUYXJnZXROdWxsUHRyKEV4ZWN1dGlvbkVuZ2luZSAqRUUsIHZvaWQgKkxvYykgeworICB1bnNpZ25lZCBQdHJTaXplID0gRUUtPmdldFRhcmdldERhdGEoKS0+Z2V0UG9pbnRlclNpemUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFB0clNpemU7ICsraSkKKyAgICBpZiAoKihpICsgKHVpbnQ4X3QqKUxvYykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorI2VuZGlmCisKKy8vLyBydW5GdW5jdGlvbkFzTWFpbiAtIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggd3JhcHMgcnVuRnVuY3Rpb24gdG8KKy8vLyBoYW5kbGUgdGhlIGNvbW1vbiB0YXNrIG9mIHN0YXJ0aW5nIHVwIG1haW4gd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ2MsIGFyZ3YsCisvLy8gYW5kIGVudnAgcGFyYW1ldGVycy4KK2ludCBFeGVjdXRpb25FbmdpbmU6OnJ1bkZ1bmN0aW9uQXNNYWluKEZ1bmN0aW9uICpGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqIGVudnApIHsKKyAgc3RkOjp2ZWN0b3I8R2VuZXJpY1ZhbHVlPiBHVkFyZ3M7CisgIEdlbmVyaWNWYWx1ZSBHVkFyZ2M7CisgIEdWQXJnYy5JbnRWYWwgPSBBUEludCgzMiwgYXJndi5zaXplKCkpOworCisgIC8vIENoZWNrIG1haW4oKSB0eXBlCisgIHVuc2lnbmVkIE51bUFyZ3MgPSBGbi0+Z2V0RnVuY3Rpb25UeXBlKCktPmdldE51bVBhcmFtcygpOworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IEZuLT5nZXRGdW5jdGlvblR5cGUoKTsKKyAgY29uc3QgVHlwZSogUFBJbnQ4VHkgPSBUeXBlOjpnZXRJbnQ4UHRyVHkoRm4tPmdldENvbnRleHQoKSktPmdldFBvaW50ZXJUbygpOworICBzd2l0Y2ggKE51bUFyZ3MpIHsKKyAgY2FzZSAzOgorICAgaWYgKEZUeS0+Z2V0UGFyYW1UeXBlKDIpICE9IFBQSW50OFR5KSB7CisgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiSW52YWxpZCB0eXBlIGZvciB0aGlyZCBhcmd1bWVudCBvZiBtYWluKCkgc3VwcGxpZWQiKTsKKyAgIH0KKyAgIC8vIEZBTExTIFRIUk9VR0gKKyAgY2FzZSAyOgorICAgaWYgKEZUeS0+Z2V0UGFyYW1UeXBlKDEpICE9IFBQSW50OFR5KSB7CisgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiSW52YWxpZCB0eXBlIGZvciBzZWNvbmQgYXJndW1lbnQgb2YgbWFpbigpIHN1cHBsaWVkIik7CisgICB9CisgICAvLyBGQUxMUyBUSFJPVUdICisgIGNhc2UgMToKKyAgIGlmICghRlR5LT5nZXRQYXJhbVR5cGUoMCktPmlzSW50ZWdlclR5KDMyKSkgeworICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkludmFsaWQgdHlwZSBmb3IgZmlyc3QgYXJndW1lbnQgb2YgbWFpbigpIHN1cHBsaWVkIik7CisgICB9CisgICAvLyBGQUxMUyBUSFJPVUdICisgIGNhc2UgMDoKKyAgIGlmICghRlR5LT5nZXRSZXR1cm5UeXBlKCktPmlzSW50ZWdlclR5KCkgJiYKKyAgICAgICAhRlR5LT5nZXRSZXR1cm5UeXBlKCktPmlzVm9pZFR5KCkpIHsKKyAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJJbnZhbGlkIHJldHVybiB0eXBlIG9mIG1haW4oKSBzdXBwbGllZCIpOworICAgfQorICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICByZXBvcnRfZmF0YWxfZXJyb3IoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBvZiBtYWluKCkgc3VwcGxpZWQiKTsKKyAgfQorICAKKyAgQXJndkFycmF5IENBcmd2OworICBBcmd2QXJyYXkgQ0VudjsKKyAgaWYgKE51bUFyZ3MpIHsKKyAgICBHVkFyZ3MucHVzaF9iYWNrKEdWQXJnYyk7IC8vIEFyZyAjMCA9IGFyZ2MuCisgICAgaWYgKE51bUFyZ3MgPiAxKSB7CisgICAgICAvLyBBcmcgIzEgPSBhcmd2LgorICAgICAgR1ZBcmdzLnB1c2hfYmFjayhQVE9HVihDQXJndi5yZXNldChGbi0+Z2V0Q29udGV4dCgpLCB0aGlzLCBhcmd2KSkpOworICAgICAgYXNzZXJ0KCFpc1RhcmdldE51bGxQdHIodGhpcywgR1ZUT1AoR1ZBcmdzWzFdKSkgJiYKKyAgICAgICAgICAgICAiYXJndlswXSB3YXMgbnVsbCBhZnRlciBDcmVhdGVBcmd2Iik7CisgICAgICBpZiAoTnVtQXJncyA+IDIpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEVudlZhcnM7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGVudnBbaV07ICsraSkKKyAgICAgICAgICBFbnZWYXJzLnB1c2hfYmFjayhlbnZwW2ldKTsKKyAgICAgICAgLy8gQXJnICMyID0gZW52cC4KKyAgICAgICAgR1ZBcmdzLnB1c2hfYmFjayhQVE9HVihDRW52LnJlc2V0KEZuLT5nZXRDb250ZXh0KCksIHRoaXMsIEVudlZhcnMpKSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBydW5GdW5jdGlvbihGbiwgR1ZBcmdzKS5JbnRWYWwuZ2V0WkV4dFZhbHVlKCk7Cit9CisKKy8vLyBJZiBwb3NzaWJsZSwgY3JlYXRlIGEgSklULCB1bmxlc3MgdGhlIGNhbGxlciBzcGVjaWZpY2FsbHkgcmVxdWVzdHMgYW4KKy8vLyBJbnRlcnByZXRlciBvciB0aGVyZSdzIGFuIGVycm9yLiBJZiBldmVuIGFuIEludGVycHJldGVyIGNhbm5vdCBiZSBjcmVhdGVkLAorLy8vIE5VTEwgaXMgcmV0dXJuZWQuCisvLy8KK0V4ZWN1dGlvbkVuZ2luZSAqRXhlY3V0aW9uRW5naW5lOjpjcmVhdGUoTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvcmNlSW50ZXJwcmV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJvclN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgR1ZzV2l0aENvZGUpIHsKKyAgcmV0dXJuIEVuZ2luZUJ1aWxkZXIoTSkKKyAgICAgIC5zZXRFbmdpbmVLaW5kKEZvcmNlSW50ZXJwcmV0ZXIKKyAgICAgICAgICAgICAgICAgICAgID8gRW5naW5lS2luZDo6SW50ZXJwcmV0ZXIKKyAgICAgICAgICAgICAgICAgICAgIDogRW5naW5lS2luZDo6SklUKQorICAgICAgLnNldEVycm9yU3RyKEVycm9yU3RyKQorICAgICAgLnNldE9wdExldmVsKE9wdExldmVsKQorICAgICAgLnNldEFsbG9jYXRlR1ZzV2l0aENvZGUoR1ZzV2l0aENvZGUpCisgICAgICAuY3JlYXRlKCk7Cit9CisKK0V4ZWN1dGlvbkVuZ2luZSAqRW5naW5lQnVpbGRlcjo6Y3JlYXRlKCkgeworICAvLyBNYWtlIHN1cmUgd2UgY2FuIHJlc29sdmUgc3ltYm9scyBpbiB0aGUgcHJvZ3JhbSBhcyB3ZWxsLiBUaGUgemVybyBhcmcKKyAgLy8gdG8gdGhlIGZ1bmN0aW9uIHRlbGxzIER5bmFtaWNMaWJyYXJ5IHRvIGxvYWQgdGhlIHByb2dyYW0sIG5vdCBhIGxpYnJhcnkuCisgIGlmIChzeXM6OkR5bmFtaWNMaWJyYXJ5OjpMb2FkTGlicmFyeVBlcm1hbmVudGx5KDAsIEVycm9yU3RyKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYSBtZW1vcnkgbWFuYWdlciBidXQgZGlkbid0IHNwZWNpZnkgd2hpY2ggZW5naW5lIHRvCisgIC8vIGNyZWF0ZSwgd2UgYXNzdW1lIHRoZXkgb25seSB3YW50IHRoZSBKSVQsIGFuZCB3ZSBmYWlsIGlmIHRoZXkgb25seSB3YW50CisgIC8vIHRoZSBpbnRlcnByZXRlci4KKyAgaWYgKEpNTSkgeworICAgIGlmIChXaGljaEVuZ2luZSAmIEVuZ2luZUtpbmQ6OkpJVCkKKyAgICAgIFdoaWNoRW5naW5lID0gRW5naW5lS2luZDo6SklUOworICAgIGVsc2UgeworICAgICAgaWYgKEVycm9yU3RyKQorICAgICAgICAqRXJyb3JTdHIgPSAiQ2Fubm90IGNyZWF0ZSBhbiBpbnRlcnByZXRlciB3aXRoIGEgbWVtb3J5IG1hbmFnZXIuIjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIC8vIFVubGVzcyB0aGUgaW50ZXJwcmV0ZXIgd2FzIGV4cGxpY2l0bHkgc2VsZWN0ZWQgb3IgdGhlIEpJVCBpcyBub3QgbGlua2VkLAorICAvLyB0cnkgbWFraW5nIGEgSklULgorICBpZiAoV2hpY2hFbmdpbmUgJiBFbmdpbmVLaW5kOjpKSVQpIHsKKyAgICBpZiAoRXhlY3V0aW9uRW5naW5lOjpKSVRDdG9yKSB7CisgICAgICBFeGVjdXRpb25FbmdpbmUgKkVFID0KKyAgICAgICAgRXhlY3V0aW9uRW5naW5lOjpKSVRDdG9yKE0sIEVycm9yU3RyLCBKTU0sIE9wdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGVHVnNXaXRoQ29kZSwgQ01Nb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BcmNoLCBNQ1BVLCBNQXR0cnMpOworICAgICAgaWYgKEVFKSByZXR1cm4gRUU7CisgICAgfQorICB9CisKKyAgLy8gSWYgd2UgY2FuJ3QgbWFrZSBhIEpJVCBhbmQgd2UgZGlkbid0IHJlcXVlc3Qgb25lIHNwZWNpZmljYWxseSwgdHJ5IG1ha2luZworICAvLyBhbiBpbnRlcnByZXRlciBpbnN0ZWFkLgorICBpZiAoV2hpY2hFbmdpbmUgJiBFbmdpbmVLaW5kOjpJbnRlcnByZXRlcikgeworICAgIGlmIChFeGVjdXRpb25FbmdpbmU6OkludGVycEN0b3IpCisgICAgICByZXR1cm4gRXhlY3V0aW9uRW5naW5lOjpJbnRlcnBDdG9yKE0sIEVycm9yU3RyKTsKKyAgICBpZiAoRXJyb3JTdHIpCisgICAgICAqRXJyb3JTdHIgPSAiSW50ZXJwcmV0ZXIgaGFzIG5vdCBiZWVuIGxpbmtlZCBpbi4iOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKChXaGljaEVuZ2luZSAmIEVuZ2luZUtpbmQ6OkpJVCkgJiYgRXhlY3V0aW9uRW5naW5lOjpKSVRDdG9yID09IDApIHsKKyAgICBpZiAoRXJyb3JTdHIpCisgICAgICAqRXJyb3JTdHIgPSAiSklUIGhhcyBub3QgYmVlbiBsaW5rZWQgaW4uIjsKKyAgfSAgICAKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBnZXRQb2ludGVyVG9HbG9iYWwgLSBUaGlzIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBnbG9iYWwKKy8vLyB2YWx1ZS4gIFRoaXMgbWF5IGludm9sdmUgY29kZSBnZW5lcmF0aW9uIGlmIGl0J3MgYSBmdW5jdGlvbi4KKy8vLwordm9pZCAqRXhlY3V0aW9uRW5naW5lOjpnZXRQb2ludGVyVG9HbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWKSB7CisgIGlmIChGdW5jdGlvbiAqRiA9IGNvbnN0X2Nhc3Q8RnVuY3Rpb24qPihkeW5fY2FzdDxGdW5jdGlvbj4oR1YpKSkKKyAgICByZXR1cm4gZ2V0UG9pbnRlclRvRnVuY3Rpb24oRik7CisKKyAgTXV0ZXhHdWFyZCBsb2NrZWQobG9jayk7CisgIHZvaWQgKnAgPSBFRVN0YXRlLmdldEdsb2JhbEFkZHJlc3NNYXAobG9ja2VkKVtHVl07CisgIGlmIChwKQorICAgIHJldHVybiBwOworCisgIC8vIEdsb2JhbCB2YXJpYWJsZSBtaWdodCBoYXZlIGJlZW4gYWRkZWQgc2luY2UgaW50ZXJwcmV0ZXIgc3RhcnRlZC4KKyAgaWYgKEdsb2JhbFZhcmlhYmxlICpHVmFyID0KKyAgICAgICAgICBjb25zdF9jYXN0PEdsb2JhbFZhcmlhYmxlICo+KGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihHVikpKQorICAgIEVtaXRHbG9iYWxWYXJpYWJsZShHVmFyKTsKKyAgZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkdsb2JhbCBoYXNuJ3QgaGFkIGFuIGFkZHJlc3MgYWxsb2NhdGVkIHlldCEiKTsKKyAgcmV0dXJuIEVFU3RhdGUuZ2V0R2xvYmFsQWRkcmVzc01hcChsb2NrZWQpW0dWXTsKK30KKworLy8vIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBDb25zdGFudCogaW50byBhIEdlbmVyaWNWYWx1ZS4gVGhlIGludGVyZXN0aW5nIAorLy8vIHBhcnQgaXMgaWYgQyBpcyBhIENvbnN0YW50RXhwci4KKy8vLyBAYnJpZWYgR2V0IGEgR2VuZXJpY1ZhbHVlIGZvciBhIENvbnN0YW50KgorR2VuZXJpY1ZhbHVlIEV4ZWN1dGlvbkVuZ2luZTo6Z2V0Q29uc3RhbnRWYWx1ZShjb25zdCBDb25zdGFudCAqQykgeworICAvLyBJZiBpdHMgdW5kZWZpbmVkLCByZXR1cm4gdGhlIGdhcmJhZ2UuCisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oQykpIHsKKyAgICBHZW5lcmljVmFsdWUgUmVzdWx0OworICAgIHN3aXRjaCAoQy0+Z2V0VHlwZSgpLT5nZXRUeXBlSUQoKSkgeworICAgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6CisgICAgY2FzZSBUeXBlOjpYODZfRlA4MFR5SUQ6CisgICAgY2FzZSBUeXBlOjpGUDEyOFR5SUQ6CisgICAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOgorICAgICAgLy8gQWx0aG91Z2ggdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgd2Ugc3RpbGwgaGF2ZSB0byBjb25zdHJ1Y3QgYW4gQVBJbnQKKyAgICAgIC8vIHdpdGggdGhlIGNvcnJlY3QgYml0IHdpZHRoLgorICAgICAgUmVzdWx0LkludFZhbCA9IEFQSW50KEMtPmdldFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vIElmIHRoZSB2YWx1ZSBpcyBhIENvbnN0YW50RXhwcgorICBpZiAoY29uc3QgQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oQykpIHsKKyAgICBDb25zdGFudCAqT3AwID0gQ0UtPmdldE9wZXJhbmQoMCk7CisgICAgc3dpdGNoIChDRS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOiB7CisgICAgICAvLyBDb21wdXRlIHRoZSBpbmRleCAKKyAgICAgIEdlbmVyaWNWYWx1ZSBSZXN1bHQgPSBnZXRDb25zdGFudFZhbHVlKE9wMCk7CisgICAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IEluZGljZXMoQ0UtPm9wX2JlZ2luKCkrMSwgQ0UtPm9wX2VuZCgpKTsKKyAgICAgIHVpbnQ2NF90IE9mZnNldCA9CisgICAgICAgIFRELT5nZXRJbmRleGVkT2Zmc2V0KE9wMC0+Z2V0VHlwZSgpLCAmSW5kaWNlc1swXSwgSW5kaWNlcy5zaXplKCkpOworCisgICAgICBjaGFyKiB0bXAgPSAoY2hhciopIFJlc3VsdC5Qb2ludGVyVmFsOworICAgICAgUmVzdWx0ID0gUFRPR1YodG1wICsgT2Zmc2V0KTsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOiB7CisgICAgICBHZW5lcmljVmFsdWUgR1YgPSBnZXRDb25zdGFudFZhbHVlKE9wMCk7CisgICAgICB1aW50MzJfdCBCaXRXaWR0aCA9IGNhc3Q8SW50ZWdlclR5cGU+KENFLT5nZXRUeXBlKCkpLT5nZXRCaXRXaWR0aCgpOworICAgICAgR1YuSW50VmFsID0gR1YuSW50VmFsLnRydW5jKEJpdFdpZHRoKTsKKyAgICAgIHJldHVybiBHVjsKKyAgICB9CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDogeworICAgICAgR2VuZXJpY1ZhbHVlIEdWID0gZ2V0Q29uc3RhbnRWYWx1ZShPcDApOworICAgICAgdWludDMyX3QgQml0V2lkdGggPSBjYXN0PEludGVnZXJUeXBlPihDRS0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAgIEdWLkludFZhbCA9IEdWLkludFZhbC56ZXh0KEJpdFdpZHRoKTsKKyAgICAgIHJldHVybiBHVjsKKyAgICB9CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDogeworICAgICAgR2VuZXJpY1ZhbHVlIEdWID0gZ2V0Q29uc3RhbnRWYWx1ZShPcDApOworICAgICAgdWludDMyX3QgQml0V2lkdGggPSBjYXN0PEludGVnZXJUeXBlPihDRS0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAgIEdWLkludFZhbCA9IEdWLkludFZhbC5zZXh0KEJpdFdpZHRoKTsKKyAgICAgIHJldHVybiBHVjsKKyAgICB9CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzogeworICAgICAgLy8gRklYTUUgbG9uZyBkb3VibGUKKyAgICAgIEdlbmVyaWNWYWx1ZSBHViA9IGdldENvbnN0YW50VmFsdWUoT3AwKTsKKyAgICAgIEdWLkZsb2F0VmFsID0gZmxvYXQoR1YuRG91YmxlVmFsKTsKKyAgICAgIHJldHVybiBHVjsKKyAgICB9CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6eworICAgICAgLy8gRklYTUUgbG9uZyBkb3VibGUKKyAgICAgIEdlbmVyaWNWYWx1ZSBHViA9IGdldENvbnN0YW50VmFsdWUoT3AwKTsKKyAgICAgIEdWLkRvdWJsZVZhbCA9IGRvdWJsZShHVi5GbG9hdFZhbCk7CisgICAgICByZXR1cm4gR1Y7CisgICAgfQorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDogeworICAgICAgR2VuZXJpY1ZhbHVlIEdWID0gZ2V0Q29uc3RhbnRWYWx1ZShPcDApOworICAgICAgaWYgKENFLT5nZXRUeXBlKCktPmlzRmxvYXRUeSgpKQorICAgICAgICBHVi5GbG9hdFZhbCA9IGZsb2F0KEdWLkludFZhbC5yb3VuZFRvRG91YmxlKCkpOworICAgICAgZWxzZSBpZiAoQ0UtPmdldFR5cGUoKS0+aXNEb3VibGVUeSgpKQorICAgICAgICBHVi5Eb3VibGVWYWwgPSBHVi5JbnRWYWwucm91bmRUb0RvdWJsZSgpOworICAgICAgZWxzZSBpZiAoQ0UtPmdldFR5cGUoKS0+aXNYODZfRlA4MFR5KCkpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgemVyb1tdID0gezAsIDB9OworICAgICAgICBBUEZsb2F0IGFwZiA9IEFQRmxvYXQoQVBJbnQoODAsIDIsIHplcm8pKTsKKyAgICAgICAgKHZvaWQpYXBmLmNvbnZlcnRGcm9tQVBJbnQoR1YuSW50VmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgICAgICBHVi5JbnRWYWwgPSBhcGYuYml0Y2FzdFRvQVBJbnQoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHVjsKKyAgICB9CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOiB7CisgICAgICBHZW5lcmljVmFsdWUgR1YgPSBnZXRDb25zdGFudFZhbHVlKE9wMCk7CisgICAgICBpZiAoQ0UtPmdldFR5cGUoKS0+aXNGbG9hdFR5KCkpCisgICAgICAgIEdWLkZsb2F0VmFsID0gZmxvYXQoR1YuSW50VmFsLnNpZ25lZFJvdW5kVG9Eb3VibGUoKSk7CisgICAgICBlbHNlIGlmIChDRS0+Z2V0VHlwZSgpLT5pc0RvdWJsZVR5KCkpCisgICAgICAgIEdWLkRvdWJsZVZhbCA9IEdWLkludFZhbC5zaWduZWRSb3VuZFRvRG91YmxlKCk7CisgICAgICBlbHNlIGlmIChDRS0+Z2V0VHlwZSgpLT5pc1g4Nl9GUDgwVHkoKSkgeworICAgICAgICBjb25zdCB1aW50NjRfdCB6ZXJvW10gPSB7IDAsIDB9OworICAgICAgICBBUEZsb2F0IGFwZiA9IEFQRmxvYXQoQVBJbnQoODAsIDIsIHplcm8pKTsKKyAgICAgICAgKHZvaWQpYXBmLmNvbnZlcnRGcm9tQVBJbnQoR1YuSW50VmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgICAgIEdWLkludFZhbCA9IGFwZi5iaXRjYXN0VG9BUEludCgpOworICAgICAgfQorICAgICAgcmV0dXJuIEdWOworICAgIH0KKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUFRvVUk6IC8vIGRvdWJsZS0+QVBJbnQgY29udmVyc2lvbiBoYW5kbGVzIHNpZ24KKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUFRvU0k6IHsKKyAgICAgIEdlbmVyaWNWYWx1ZSBHViA9IGdldENvbnN0YW50VmFsdWUoT3AwKTsKKyAgICAgIHVpbnQzMl90IEJpdFdpZHRoID0gY2FzdDxJbnRlZ2VyVHlwZT4oQ0UtPmdldFR5cGUoKSktPmdldEJpdFdpZHRoKCk7CisgICAgICBpZiAoT3AwLT5nZXRUeXBlKCktPmlzRmxvYXRUeSgpKQorICAgICAgICBHVi5JbnRWYWwgPSBBUEludE9wczo6Um91bmRGbG9hdFRvQVBJbnQoR1YuRmxvYXRWYWwsIEJpdFdpZHRoKTsKKyAgICAgIGVsc2UgaWYgKE9wMC0+Z2V0VHlwZSgpLT5pc0RvdWJsZVR5KCkpCisgICAgICAgIEdWLkludFZhbCA9IEFQSW50T3BzOjpSb3VuZERvdWJsZVRvQVBJbnQoR1YuRG91YmxlVmFsLCBCaXRXaWR0aCk7CisgICAgICBlbHNlIGlmIChPcDAtPmdldFR5cGUoKS0+aXNYODZfRlA4MFR5KCkpIHsKKyAgICAgICAgQVBGbG9hdCBhcGYgPSBBUEZsb2F0KEdWLkludFZhbCk7CisgICAgICAgIHVpbnQ2NF90IHY7CisgICAgICAgIGJvb2wgaWdub3JlZDsKKyAgICAgICAgKHZvaWQpYXBmLmNvbnZlcnRUb0ludGVnZXIoJnYsIEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRS0+Z2V0T3Bjb2RlKCk9PUluc3RydWN0aW9uOjpGUFRvU0ksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEZsb2F0OjpybVRvd2FyZFplcm8sICZpZ25vcmVkKTsKKyAgICAgICAgR1YuSW50VmFsID0gdjsgLy8gZW5kaWFuPworICAgICAgfQorICAgICAgcmV0dXJuIEdWOworICAgIH0KKyAgICBjYXNlIEluc3RydWN0aW9uOjpQdHJUb0ludDogeworICAgICAgR2VuZXJpY1ZhbHVlIEdWID0gZ2V0Q29uc3RhbnRWYWx1ZShPcDApOworICAgICAgdWludDMyX3QgUHRyV2lkdGggPSBURC0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKTsKKyAgICAgIEdWLkludFZhbCA9IEFQSW50KFB0cldpZHRoLCB1aW50cHRyX3QoR1YuUG9pbnRlclZhbCkpOworICAgICAgcmV0dXJuIEdWOworICAgIH0KKyAgICBjYXNlIEluc3RydWN0aW9uOjpJbnRUb1B0cjogeworICAgICAgR2VuZXJpY1ZhbHVlIEdWID0gZ2V0Q29uc3RhbnRWYWx1ZShPcDApOworICAgICAgdWludDMyX3QgUHRyV2lkdGggPSBURC0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKTsKKyAgICAgIGlmIChQdHJXaWR0aCAhPSBHVi5JbnRWYWwuZ2V0Qml0V2lkdGgoKSkKKyAgICAgICAgR1YuSW50VmFsID0gR1YuSW50VmFsLnpleHRPclRydW5jKFB0cldpZHRoKTsKKyAgICAgIGFzc2VydChHVi5JbnRWYWwuZ2V0Qml0V2lkdGgoKSA8PSA2NCAmJiAiQmFkIHBvaW50ZXIgd2lkdGgiKTsKKyAgICAgIEdWLlBvaW50ZXJWYWwgPSBQb2ludGVyVHkodWludHB0cl90KEdWLkludFZhbC5nZXRaRXh0VmFsdWUoKSkpOworICAgICAgcmV0dXJuIEdWOworICAgIH0KKyAgICBjYXNlIEluc3RydWN0aW9uOjpCaXRDYXN0OiB7CisgICAgICBHZW5lcmljVmFsdWUgR1YgPSBnZXRDb25zdGFudFZhbHVlKE9wMCk7CisgICAgICBjb25zdCBUeXBlKiBEZXN0VHkgPSBDRS0+Z2V0VHlwZSgpOworICAgICAgc3dpdGNoIChPcDAtPmdldFR5cGUoKS0+Z2V0VHlwZUlEKCkpIHsKKyAgICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBiaXRjYXN0IG9wZXJhbmQiKTsKKyAgICAgICAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgICAgICAgICBhc3NlcnQoRGVzdFR5LT5pc0Zsb2F0aW5nUG9pbnRUeSgpICYmICJpbnZhbGlkIGJpdGNhc3QiKTsKKyAgICAgICAgICBpZiAoRGVzdFR5LT5pc0Zsb2F0VHkoKSkKKyAgICAgICAgICAgIEdWLkZsb2F0VmFsID0gR1YuSW50VmFsLmJpdHNUb0Zsb2F0KCk7CisgICAgICAgICAgZWxzZSBpZiAoRGVzdFR5LT5pc0RvdWJsZVR5KCkpCisgICAgICAgICAgICBHVi5Eb3VibGVWYWwgPSBHVi5JbnRWYWwuYml0c1RvRG91YmxlKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOiAKKyAgICAgICAgICBhc3NlcnQoRGVzdFR5LT5pc0ludGVnZXJUeSgzMikgJiYgIkludmFsaWQgYml0Y2FzdCIpOworICAgICAgICAgIEdWLkludFZhbC5mbG9hdFRvQml0cyhHVi5GbG9hdFZhbCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDoKKyAgICAgICAgICBhc3NlcnQoRGVzdFR5LT5pc0ludGVnZXJUeSg2NCkgJiYgIkludmFsaWQgYml0Y2FzdCIpOworICAgICAgICAgIEdWLkludFZhbC5kb3VibGVUb0JpdHMoR1YuRG91YmxlVmFsKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICAgICAgICBhc3NlcnQoRGVzdFR5LT5pc1BvaW50ZXJUeSgpICYmICJJbnZhbGlkIGJpdGNhc3QiKTsKKyAgICAgICAgICBicmVhazsgLy8gZ2V0Q29uc3RhbnRWYWx1ZShPcDApICBhYm92ZSBhbHJlYWR5IGNvbnZlcnRlZCBpdAorICAgICAgfQorICAgICAgcmV0dXJuIEdWOworICAgIH0KKyAgICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RkFkZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTdWI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlN1YjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6Rk11bDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNEaXY6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpPcjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpYb3I6IHsKKyAgICAgIEdlbmVyaWNWYWx1ZSBMSFMgPSBnZXRDb25zdGFudFZhbHVlKE9wMCk7CisgICAgICBHZW5lcmljVmFsdWUgUkhTID0gZ2V0Q29uc3RhbnRWYWx1ZShDRS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICBHZW5lcmljVmFsdWUgR1Y7CisgICAgICBzd2l0Y2ggKENFLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmdldFR5cGVJRCgpKSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJCYWQgYWRkIHR5cGUhIik7CisgICAgICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOgorICAgICAgICBzd2l0Y2ggKENFLT5nZXRPcGNvZGUoKSkgeworICAgICAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgaW50ZWdlciBvcGNvZGUiKTsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6IEdWLkludFZhbCA9IExIUy5JbnRWYWwgKyBSSFMuSW50VmFsOyBicmVhazsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpTdWI6IEdWLkludFZhbCA9IExIUy5JbnRWYWwgLSBSSFMuSW50VmFsOyBicmVhazsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6IEdWLkludFZhbCA9IExIUy5JbnRWYWwgKiBSSFMuSW50VmFsOyBicmVhazsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OkdWLkludFZhbCA9IExIUy5JbnRWYWwudWRpdihSSFMuSW50VmFsKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0RpdjpHVi5JbnRWYWwgPSBMSFMuSW50VmFsLnNkaXYoUkhTLkludFZhbCk7IGJyZWFrOworICAgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06R1YuSW50VmFsID0gTEhTLkludFZhbC51cmVtKFJIUy5JbnRWYWwpOyBicmVhazsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOkdWLkludFZhbCA9IExIUy5JbnRWYWwuc3JlbShSSFMuSW50VmFsKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6QW5kOiBHVi5JbnRWYWwgPSBMSFMuSW50VmFsICYgUkhTLkludFZhbDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6ICBHVi5JbnRWYWwgPSBMSFMuSW50VmFsIHwgUkhTLkludFZhbDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOiBHVi5JbnRWYWwgPSBMSFMuSW50VmFsIF4gUkhTLkludFZhbDsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFR5cGU6OkZsb2F0VHlJRDoKKyAgICAgICAgc3dpdGNoIChDRS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGZsb2F0IG9wY29kZSIpOworICAgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6CisgICAgICAgICAgICBHVi5GbG9hdFZhbCA9IExIUy5GbG9hdFZhbCArIFJIUy5GbG9hdFZhbDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlN1YjoKKyAgICAgICAgICAgIEdWLkZsb2F0VmFsID0gTEhTLkZsb2F0VmFsIC0gUkhTLkZsb2F0VmFsOyBicmVhazsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpGTXVsOgorICAgICAgICAgICAgR1YuRmxvYXRWYWwgPSBMSFMuRmxvYXRWYWwgKiBSSFMuRmxvYXRWYWw7IGJyZWFrOworICAgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZEaXY6IAorICAgICAgICAgICAgR1YuRmxvYXRWYWwgPSBMSFMuRmxvYXRWYWwgLyBSSFMuRmxvYXRWYWw7IGJyZWFrOworICAgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZSZW06IAorICAgICAgICAgICAgR1YuRmxvYXRWYWwgPSBzdGQ6OmZtb2QoTEhTLkZsb2F0VmFsLFJIUy5GbG9hdFZhbCk7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOgorICAgICAgICBzd2l0Y2ggKENFLT5nZXRPcGNvZGUoKSkgeworICAgICAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgZG91YmxlIG9wY29kZSIpOworICAgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6CisgICAgICAgICAgICBHVi5Eb3VibGVWYWwgPSBMSFMuRG91YmxlVmFsICsgUkhTLkRvdWJsZVZhbDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlN1YjoKKyAgICAgICAgICAgIEdWLkRvdWJsZVZhbCA9IExIUy5Eb3VibGVWYWwgLSBSSFMuRG91YmxlVmFsOyBicmVhazsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpGTXVsOgorICAgICAgICAgICAgR1YuRG91YmxlVmFsID0gTEhTLkRvdWJsZVZhbCAqIFJIUy5Eb3VibGVWYWw7IGJyZWFrOworICAgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZEaXY6IAorICAgICAgICAgICAgR1YuRG91YmxlVmFsID0gTEhTLkRvdWJsZVZhbCAvIFJIUy5Eb3VibGVWYWw7IGJyZWFrOworICAgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZSZW06IAorICAgICAgICAgICAgR1YuRG91YmxlVmFsID0gc3RkOjpmbW9kKExIUy5Eb3VibGVWYWwsUkhTLkRvdWJsZVZhbCk7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUeXBlOjpYODZfRlA4MFR5SUQ6CisgICAgICBjYXNlIFR5cGU6OlBQQ19GUDEyOFR5SUQ6CisgICAgICBjYXNlIFR5cGU6OkZQMTI4VHlJRDogeworICAgICAgICBBUEZsb2F0IGFwZkxIUyA9IEFQRmxvYXQoTEhTLkludFZhbCk7CisgICAgICAgIHN3aXRjaCAoQ0UtPmdldE9wY29kZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBsb25nIGRvdWJsZSBvcGNvZGUiKTtsbHZtX3VucmVhY2hhYmxlKDApOworICAgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6CisgICAgICAgICAgICBhcGZMSFMuYWRkKEFQRmxvYXQoUkhTLkludFZhbCksIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgICAgICAgICAgR1YuSW50VmFsID0gYXBmTEhTLmJpdGNhc3RUb0FQSW50KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpGU3ViOgorICAgICAgICAgICAgYXBmTEhTLnN1YnRyYWN0KEFQRmxvYXQoUkhTLkludFZhbCksIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgICAgICAgICAgR1YuSW50VmFsID0gYXBmTEhTLmJpdGNhc3RUb0FQSW50KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpGTXVsOgorICAgICAgICAgICAgYXBmTEhTLm11bHRpcGx5KEFQRmxvYXQoUkhTLkludFZhbCksIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgICAgICAgICAgR1YuSW50VmFsID0gYXBmTEhTLmJpdGNhc3RUb0FQSW50KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpGRGl2OiAKKyAgICAgICAgICAgIGFwZkxIUy5kaXZpZGUoQVBGbG9hdChSSFMuSW50VmFsKSwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgICAgICAgICBHVi5JbnRWYWwgPSBhcGZMSFMuYml0Y2FzdFRvQVBJbnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZSZW06IAorICAgICAgICAgICAgYXBmTEhTLm1vZChBUEZsb2F0KFJIUy5JbnRWYWwpLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICAgICAgICAgIEdWLkludFZhbCA9IGFwZkxIUy5iaXRjYXN0VG9BUEludCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIEdWOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIG1zZzsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gTXNnKG1zZyk7CisgICAgTXNnIDw8ICJDb25zdGFudEV4cHIgbm90IGhhbmRsZWQ6ICIgPDwgKkNFOworICAgIHJlcG9ydF9mYXRhbF9lcnJvcihNc2cuc3RyKCkpOworICB9CisKKyAgR2VuZXJpY1ZhbHVlIFJlc3VsdDsKKyAgc3dpdGNoIChDLT5nZXRUeXBlKCktPmdldFR5cGVJRCgpKSB7CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOiAKKyAgICBSZXN1bHQuRmxvYXRWYWwgPSBjYXN0PENvbnN0YW50RlA+KEMpLT5nZXRWYWx1ZUFQRigpLmNvbnZlcnRUb0Zsb2F0KCk7IAorICAgIGJyZWFrOworICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6CisgICAgUmVzdWx0LkRvdWJsZVZhbCA9IGNhc3Q8Q29uc3RhbnRGUD4oQyktPmdldFZhbHVlQVBGKCkuY29udmVydFRvRG91YmxlKCk7CisgICAgYnJlYWs7CisgIGNhc2UgVHlwZTo6WDg2X0ZQODBUeUlEOgorICBjYXNlIFR5cGU6OkZQMTI4VHlJRDoKKyAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOgorICAgIFJlc3VsdC5JbnRWYWwgPSBjYXN0IDxDb25zdGFudEZQPihDKS0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpOworICAgIGJyZWFrOworICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOgorICAgIFJlc3VsdC5JbnRWYWwgPSBjYXN0PENvbnN0YW50SW50PihDKS0+Z2V0VmFsdWUoKTsKKyAgICBicmVhazsKKyAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICBpZiAoaXNhPENvbnN0YW50UG9pbnRlck51bGw+KEMpKQorICAgICAgUmVzdWx0LlBvaW50ZXJWYWwgPSAwOworICAgIGVsc2UgaWYgKGNvbnN0IEZ1bmN0aW9uICpGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KEMpKQorICAgICAgUmVzdWx0ID0gUFRPR1YoZ2V0UG9pbnRlclRvRnVuY3Rpb25PclN0dWIoY29uc3RfY2FzdDxGdW5jdGlvbio+KEYpKSk7CisgICAgZWxzZSBpZiAoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KEMpKQorICAgICAgUmVzdWx0ID0gUFRPR1YoZ2V0T3JFbWl0R2xvYmFsVmFyaWFibGUoY29uc3RfY2FzdDxHbG9iYWxWYXJpYWJsZSo+KEdWKSkpOworICAgIGVsc2UgaWYgKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEgPSBkeW5fY2FzdDxCbG9ja0FkZHJlc3M+KEMpKQorICAgICAgUmVzdWx0ID0gUFRPR1YoZ2V0UG9pbnRlclRvQmFzaWNCbG9jayhjb25zdF9jYXN0PEJhc2ljQmxvY2sqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkEtPmdldEJhc2ljQmxvY2soKSkpKTsKKyAgICBlbHNlCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGNvbnN0YW50IHBvaW50ZXIgdHlwZSEiKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBzdGQ6OnN0cmluZyBtc2c7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIE1zZyhtc2cpOworICAgIE1zZyA8PCAiRVJST1I6IENvbnN0YW50IHVuaW1wbGVtZW50ZWQgZm9yIHR5cGU6ICIgPDwgKkMtPmdldFR5cGUoKTsKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoTXNnLnN0cigpKTsKKyAgfQorICByZXR1cm4gUmVzdWx0OworfQorCisvLy8gU3RvcmVJbnRUb01lbW9yeSAtIEZpbGxzIHRoZSBTdG9yZUJ5dGVzIGJ5dGVzIG9mIG1lbW9yeSBzdGFydGluZyBmcm9tIERzdAorLy8vIHdpdGggdGhlIGludGVnZXIgaGVsZCBpbiBJbnRWYWwuCitzdGF0aWMgdm9pZCBTdG9yZUludFRvTWVtb3J5KGNvbnN0IEFQSW50ICZJbnRWYWwsIHVpbnQ4X3QgKkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RvcmVCeXRlcykgeworICBhc3NlcnQoKEludFZhbC5nZXRCaXRXaWR0aCgpKzcpLzggPj0gU3RvcmVCeXRlcyAmJiAiSW50ZWdlciB0b28gc21hbGwhIik7CisgIHVpbnQ4X3QgKlNyYyA9ICh1aW50OF90ICopSW50VmFsLmdldFJhd0RhdGEoKTsKKworICBpZiAoc3lzOjppc0xpdHRsZUVuZGlhbkhvc3QoKSkKKyAgICAvLyBMaXR0bGUtZW5kaWFuIGhvc3QgLSB0aGUgc291cmNlIGlzIG9yZGVyZWQgZnJvbSBMU0IgdG8gTVNCLiAgT3JkZXIgdGhlCisgICAgLy8gZGVzdGluYXRpb24gZnJvbSBMU0IgdG8gTVNCOiBEbyBhIHN0cmFpZ2h0IGNvcHkuCisgICAgbWVtY3B5KERzdCwgU3JjLCBTdG9yZUJ5dGVzKTsKKyAgZWxzZSB7CisgICAgLy8gQmlnLWVuZGlhbiBob3N0IC0gdGhlIHNvdXJjZSBpcyBhbiBhcnJheSBvZiA2NCBiaXQgd29yZHMgb3JkZXJlZCBmcm9tCisgICAgLy8gTFNXIHRvIE1TVy4gIEVhY2ggd29yZCBpcyBvcmRlcmVkIGZyb20gTVNCIHRvIExTQi4gIE9yZGVyIHRoZSBkZXN0aW5hdGlvbgorICAgIC8vIGZyb20gTVNCIHRvIExTQjogUmV2ZXJzZSB0aGUgd29yZCBvcmRlciwgYnV0IG5vdCB0aGUgYnl0ZXMgaW4gYSB3b3JkLgorICAgIHdoaWxlIChTdG9yZUJ5dGVzID4gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgU3RvcmVCeXRlcyAtPSBzaXplb2YodWludDY0X3QpOworICAgICAgLy8gTWF5IG5vdCBiZSBhbGlnbmVkIHNvIHVzZSBtZW1jcHkuCisgICAgICBtZW1jcHkoRHN0ICsgU3RvcmVCeXRlcywgU3JjLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgIFNyYyArPSBzaXplb2YodWludDY0X3QpOworICAgIH0KKworICAgIG1lbWNweShEc3QsIFNyYyArIHNpemVvZih1aW50NjRfdCkgLSBTdG9yZUJ5dGVzLCBTdG9yZUJ5dGVzKTsKKyAgfQorfQorCisvLy8gU3RvcmVWYWx1ZVRvTWVtb3J5IC0gU3RvcmVzIHRoZSBkYXRhIGluIFZhbCBvZiB0eXBlIFR5IGF0IGFkZHJlc3MgUHRyLiAgUHRyCisvLy8gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBhdCB3aGljaCB0byBzdG9yZSBWYWwsIGNhc3QgdG8gR2VuZXJpY1ZhbHVlICouCisvLy8gSXQgaXMgbm90IGEgcG9pbnRlciB0byBhIEdlbmVyaWNWYWx1ZSBjb250YWluaW5nIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRvCisvLy8gc3RvcmUgVmFsLgordm9pZCBFeGVjdXRpb25FbmdpbmU6OlN0b3JlVmFsdWVUb01lbW9yeShjb25zdCBHZW5lcmljVmFsdWUgJlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpY1ZhbHVlICpQdHIsIGNvbnN0IFR5cGUgKlR5KSB7CisgIGNvbnN0IHVuc2lnbmVkIFN0b3JlQnl0ZXMgPSBnZXRUYXJnZXREYXRhKCktPmdldFR5cGVTdG9yZVNpemUoVHkpOworCisgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6CisgICAgU3RvcmVJbnRUb01lbW9yeShWYWwuSW50VmFsLCAodWludDhfdCopUHRyLCBTdG9yZUJ5dGVzKTsKKyAgICBicmVhazsKKyAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6CisgICAgKigoZmxvYXQqKVB0cikgPSBWYWwuRmxvYXRWYWw7CisgICAgYnJlYWs7CisgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDoKKyAgICAqKChkb3VibGUqKVB0cikgPSBWYWwuRG91YmxlVmFsOworICAgIGJyZWFrOworICBjYXNlIFR5cGU6Olg4Nl9GUDgwVHlJRDoKKyAgICBtZW1jcHkoUHRyLCBWYWwuSW50VmFsLmdldFJhd0RhdGEoKSwgMTApOworICAgIGJyZWFrOworICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOgorICAgIC8vIEVuc3VyZSA2NCBiaXQgdGFyZ2V0IHBvaW50ZXJzIGFyZSBmdWxseSBpbml0aWFsaXplZCBvbiAzMiBiaXQgaG9zdHMuCisgICAgaWYgKFN0b3JlQnl0ZXMgIT0gc2l6ZW9mKFBvaW50ZXJUeSkpCisgICAgICBtZW1zZXQoUHRyLCAwLCBTdG9yZUJ5dGVzKTsKKworICAgICooKFBvaW50ZXJUeSopUHRyKSA9IFZhbC5Qb2ludGVyVmFsOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiQ2Fubm90IHN0b3JlIHZhbHVlIG9mIHR5cGUgIiA8PCAqVHkgPDwgIiFcbiI7CisgIH0KKworICBpZiAoc3lzOjppc0xpdHRsZUVuZGlhbkhvc3QoKSAhPSBnZXRUYXJnZXREYXRhKCktPmlzTGl0dGxlRW5kaWFuKCkpCisgICAgLy8gSG9zdCBhbmQgdGFyZ2V0IGFyZSBkaWZmZXJlbnQgZW5kaWFuIC0gcmV2ZXJzZSB0aGUgc3RvcmVkIGJ5dGVzLgorICAgIHN0ZDo6cmV2ZXJzZSgodWludDhfdCopUHRyLCBTdG9yZUJ5dGVzICsgKHVpbnQ4X3QqKVB0cik7Cit9CisKKy8vLyBMb2FkSW50RnJvbU1lbW9yeSAtIExvYWRzIHRoZSBpbnRlZ2VyIHN0b3JlZCBpbiB0aGUgTG9hZEJ5dGVzIGJ5dGVzIHN0YXJ0aW5nCisvLy8gZnJvbSBTcmMgaW50byBJbnRWYWwsIHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgd2lkZSBlbm91Z2ggYW5kIHRvIGhvbGQgemVyby4KK3N0YXRpYyB2b2lkIExvYWRJbnRGcm9tTWVtb3J5KEFQSW50ICZJbnRWYWwsIHVpbnQ4X3QgKlNyYywgdW5zaWduZWQgTG9hZEJ5dGVzKSB7CisgIGFzc2VydCgoSW50VmFsLmdldEJpdFdpZHRoKCkrNykvOCA+PSBMb2FkQnl0ZXMgJiYgIkludGVnZXIgdG9vIHNtYWxsISIpOworICB1aW50OF90ICpEc3QgPSAodWludDhfdCAqKUludFZhbC5nZXRSYXdEYXRhKCk7CisKKyAgaWYgKHN5czo6aXNMaXR0bGVFbmRpYW5Ib3N0KCkpCisgICAgLy8gTGl0dGxlLWVuZGlhbiBob3N0IC0gdGhlIGRlc3RpbmF0aW9uIG11c3QgYmUgb3JkZXJlZCBmcm9tIExTQiB0byBNU0IuCisgICAgLy8gVGhlIHNvdXJjZSBpcyBvcmRlcmVkIGZyb20gTFNCIHRvIE1TQjogRG8gYSBzdHJhaWdodCBjb3B5LgorICAgIG1lbWNweShEc3QsIFNyYywgTG9hZEJ5dGVzKTsKKyAgZWxzZSB7CisgICAgLy8gQmlnLWVuZGlhbiAtIHRoZSBkZXN0aW5hdGlvbiBpcyBhbiBhcnJheSBvZiA2NCBiaXQgd29yZHMgb3JkZXJlZCBmcm9tCisgICAgLy8gTFNXIHRvIE1TVy4gIEVhY2ggd29yZCBtdXN0IGJlIG9yZGVyZWQgZnJvbSBNU0IgdG8gTFNCLiAgVGhlIHNvdXJjZSBpcworICAgIC8vIG9yZGVyZWQgZnJvbSBNU0IgdG8gTFNCOiBSZXZlcnNlIHRoZSB3b3JkIG9yZGVyLCBidXQgbm90IHRoZSBieXRlcyBpbgorICAgIC8vIGEgd29yZC4KKyAgICB3aGlsZSAoTG9hZEJ5dGVzID4gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgTG9hZEJ5dGVzIC09IHNpemVvZih1aW50NjRfdCk7CisgICAgICAvLyBNYXkgbm90IGJlIGFsaWduZWQgc28gdXNlIG1lbWNweS4KKyAgICAgIG1lbWNweShEc3QsIFNyYyArIExvYWRCeXRlcywgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICBEc3QgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICB9CisKKyAgICBtZW1jcHkoRHN0ICsgc2l6ZW9mKHVpbnQ2NF90KSAtIExvYWRCeXRlcywgU3JjLCBMb2FkQnl0ZXMpOworICB9Cit9CisKKy8vLyBGSVhNRTogZG9jdW1lbnQKKy8vLwordm9pZCBFeGVjdXRpb25FbmdpbmU6OkxvYWRWYWx1ZUZyb21NZW1vcnkoR2VuZXJpY1ZhbHVlICZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIGNvbnN0IHVuc2lnbmVkIExvYWRCeXRlcyA9IGdldFRhcmdldERhdGEoKS0+Z2V0VHlwZVN0b3JlU2l6ZShUeSk7CisKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgICAvLyBBbiBBUEludCB3aXRoIGFsbCB3b3JkcyBpbml0aWFsbHkgemVyby4KKyAgICBSZXN1bHQuSW50VmFsID0gQVBJbnQoY2FzdDxJbnRlZ2VyVHlwZT4oVHkpLT5nZXRCaXRXaWR0aCgpLCAwKTsKKyAgICBMb2FkSW50RnJvbU1lbW9yeShSZXN1bHQuSW50VmFsLCAodWludDhfdCopUHRyLCBMb2FkQnl0ZXMpOworICAgIGJyZWFrOworICBjYXNlIFR5cGU6OkZsb2F0VHlJRDoKKyAgICBSZXN1bHQuRmxvYXRWYWwgPSAqKChmbG9hdCopUHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOgorICAgIFJlc3VsdC5Eb3VibGVWYWwgPSAqKChkb3VibGUqKVB0cik7CisgICAgYnJlYWs7CisgIGNhc2UgVHlwZTo6UG9pbnRlclR5SUQ6CisgICAgUmVzdWx0LlBvaW50ZXJWYWwgPSAqKChQb2ludGVyVHkqKVB0cik7CisgICAgYnJlYWs7CisgIGNhc2UgVHlwZTo6WDg2X0ZQODBUeUlEOiB7CisgICAgLy8gVGhpcyBpcyBlbmRpYW4gZGVwZW5kZW50LCBidXQgaXQgd2lsbCBvbmx5IHdvcmsgb24geDg2IGFueXdheS4KKyAgICAvLyBGSVhNRTogV2lsbCBub3QgdHJhcCBpZiBsb2FkaW5nIGEgc2lnbmFsaW5nIE5hTi4KKyAgICB1aW50NjRfdCB5WzJdOworICAgIG1lbWNweSh5LCBQdHIsIDEwKTsKKyAgICBSZXN1bHQuSW50VmFsID0gQVBJbnQoODAsIDIsIHkpOworICAgIGJyZWFrOworICB9CisgIGRlZmF1bHQ6CisgICAgc3RkOjpzdHJpbmcgbXNnOworICAgIHJhd19zdHJpbmdfb3N0cmVhbSBNc2cobXNnKTsKKyAgICBNc2cgPDwgIkNhbm5vdCBsb2FkIHZhbHVlIG9mIHR5cGUgIiA8PCAqVHkgPDwgIiEiOworICAgIHJlcG9ydF9mYXRhbF9lcnJvcihNc2cuc3RyKCkpOworICB9Cit9CisKKy8vIEluaXRpYWxpemVNZW1vcnkgLSBSZWN1cnNpdmUgZnVuY3Rpb24gdG8gYXBwbHkgYSBDb25zdGFudCB2YWx1ZSBpbnRvIHRoZQorLy8gc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4uLgorLy8KK3ZvaWQgRXhlY3V0aW9uRW5naW5lOjpJbml0aWFsaXplTWVtb3J5KGNvbnN0IENvbnN0YW50ICpJbml0LCB2b2lkICpBZGRyKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBJbml0aWFsaXppbmcgIiA8PCBBZGRyIDw8ICIgIik7CisgIERFQlVHKEluaXQtPmR1bXAoKSk7CisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oSW5pdCkpIHsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoY29uc3QgQ29uc3RhbnRWZWN0b3IgKkNQID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KEluaXQpKSB7CisgICAgdW5zaWduZWQgRWxlbWVudFNpemUgPQorICAgICAgZ2V0VGFyZ2V0RGF0YSgpLT5nZXRUeXBlQWxsb2NTaXplKENQLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBJbml0aWFsaXplTWVtb3J5KENQLT5nZXRPcGVyYW5kKGkpLCAoY2hhciopQWRkcitpKkVsZW1lbnRTaXplKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oSW5pdCkpIHsKKyAgICBtZW1zZXQoQWRkciwgMCwgKHNpemVfdClnZXRUYXJnZXREYXRhKCktPmdldFR5cGVBbGxvY1NpemUoSW5pdC0+Z2V0VHlwZSgpKSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50QXJyYXkgKkNQQSA9IGR5bl9jYXN0PENvbnN0YW50QXJyYXk+KEluaXQpKSB7CisgICAgdW5zaWduZWQgRWxlbWVudFNpemUgPQorICAgICAgZ2V0VGFyZ2V0RGF0YSgpLT5nZXRUeXBlQWxsb2NTaXplKENQQS0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ1BBLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIEluaXRpYWxpemVNZW1vcnkoQ1BBLT5nZXRPcGVyYW5kKGkpLCAoY2hhciopQWRkcitpKkVsZW1lbnRTaXplKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoY29uc3QgQ29uc3RhbnRTdHJ1Y3QgKkNQUyA9IGR5bl9jYXN0PENvbnN0YW50U3RydWN0PihJbml0KSkgeworICAgIGNvbnN0IFN0cnVjdExheW91dCAqU0wgPQorICAgICAgZ2V0VGFyZ2V0RGF0YSgpLT5nZXRTdHJ1Y3RMYXlvdXQoY2FzdDxTdHJ1Y3RUeXBlPihDUFMtPmdldFR5cGUoKSkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUFMtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgSW5pdGlhbGl6ZU1lbW9yeShDUFMtPmdldE9wZXJhbmQoaSksIChjaGFyKilBZGRyK1NMLT5nZXRFbGVtZW50T2Zmc2V0KGkpKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoSW5pdC0+Z2V0VHlwZSgpLT5pc0ZpcnN0Q2xhc3NUeXBlKCkpIHsKKyAgICBHZW5lcmljVmFsdWUgVmFsID0gZ2V0Q29uc3RhbnRWYWx1ZShJbml0KTsKKyAgICBTdG9yZVZhbHVlVG9NZW1vcnkoVmFsLCAoR2VuZXJpY1ZhbHVlKilBZGRyLCBJbml0LT5nZXRUeXBlKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIGRiZ3MoKSA8PCAiQmFkIFR5cGU6ICIgPDwgKkluaXQtPmdldFR5cGUoKSA8PCAiXG4iOworICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGNvbnN0YW50IHR5cGUgdG8gaW5pdGlhbGl6ZSBtZW1vcnkgd2l0aCEiKTsKK30KKworLy8vIEVtaXRHbG9iYWxzIC0gRW1pdCBhbGwgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZXMgdG8gbWVtb3J5LCBzdG9yaW5nIHRoZWlyCisvLy8gYWRkcmVzc2VzIGludG8gR2xvYmFsQWRkcmVzcy4gIFRoaXMgbXVzdCBtYWtlIHN1cmUgdG8gY29weSB0aGUgY29udGVudHMgb2YKKy8vLyB0aGVpciBpbml0aWFsaXplcnMgaW50byB0aGUgbWVtb3J5LgorLy8vCit2b2lkIEV4ZWN1dGlvbkVuZ2luZTo6ZW1pdEdsb2JhbHMoKSB7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgcHJvZ3JhbSwgYWxsb2NhdGluZyB0aGUgbWVtb3J5CisgIC8vIHRvIGhvbGQgdGhlbS4gIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbW9kdWxlLCBkbyBhIHByZXBhc3Mgb3ZlciBnbG9iYWxzCisgIC8vIHRvIGZpZ3VyZSBvdXQgaG93IHRoZSBkaWZmZXJlbnQgbW9kdWxlcyBzaG91bGQgbGluayB0b2dldGhlci4KKyAgLy8KKyAgc3RkOjptYXA8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBjb25zdCBUeXBlKj4sCisgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlKj4gTGlua2VkR2xvYmFsc01hcDsKKworICBpZiAoTW9kdWxlcy5zaXplKCkgIT0gMSkgeworICAgIGZvciAodW5zaWduZWQgbSA9IDAsIGUgPSBNb2R1bGVzLnNpemUoKTsgbSAhPSBlOyArK20pIHsKKyAgICAgIE1vZHVsZSAmTSA9ICpNb2R1bGVzW21dOworICAgICAgZm9yIChNb2R1bGU6OmNvbnN0X2dsb2JhbF9pdGVyYXRvciBJID0gTS5nbG9iYWxfYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE0uZ2xvYmFsX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBJOworICAgICAgICBpZiAoR1YtPmhhc0xvY2FsTGlua2FnZSgpIHx8IEdWLT5pc0RlY2xhcmF0aW9uKCkgfHwKKyAgICAgICAgICAgIEdWLT5oYXNBcHBlbmRpbmdMaW5rYWdlKCkgfHwgIUdWLT5oYXNOYW1lKCkpCisgICAgICAgICAgY29udGludWU7Ly8gSWdub3JlIGV4dGVybmFsIGdsb2JhbHMgYW5kIGdsb2JhbHMgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLgorICAgICAgICAgIAorICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqJkdWRW50cnkgPSAKKyAgICAgICAgICBMaW5rZWRHbG9iYWxzTWFwW3N0ZDo6bWFrZV9wYWlyKEdWLT5nZXROYW1lKCksIEdWLT5nZXRUeXBlKCkpXTsKKworICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gdGhpcyBnbG9iYWwsIGl0IGlzIHRoZSBjYW5vbmljYWwKKyAgICAgICAgLy8gdmVyc2lvbi4KKyAgICAgICAgaWYgKCFHVkVudHJ5KSB7CisgICAgICAgICAgR1ZFbnRyeSA9IEdWOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGUgZXhpc3RpbmcgZ2xvYmFsIGlzIHN0cm9uZywgbmV2ZXIgcmVwbGFjZSBpdC4KKyAgICAgICAgaWYgKEdWRW50cnktPmhhc0V4dGVybmFsTGlua2FnZSgpIHx8CisgICAgICAgICAgICBHVkVudHJ5LT5oYXNETExJbXBvcnRMaW5rYWdlKCkgfHwKKyAgICAgICAgICAgIEdWRW50cnktPmhhc0RMTEV4cG9ydExpbmthZ2UoKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIE90aGVyd2lzZSwgd2Uga25vdyBpdCdzIGxpbmtvbmNlL3dlYWssIHJlcGxhY2UgaXQgaWYgdGhpcyBpcyBhIHN0cm9uZworICAgICAgICAvLyBzeW1ib2wuICBGSVhNRSBpcyB0aGlzIHJpZ2h0IGZvciBjb21tb24/CisgICAgICAgIGlmIChHVi0+aGFzRXh0ZXJuYWxMaW5rYWdlKCkgfHwgR1ZFbnRyeS0+aGFzRXh0ZXJuYWxXZWFrTGlua2FnZSgpKQorICAgICAgICAgIEdWRW50cnkgPSBHVjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEdsb2JhbFZhbHVlKj4gTm9uQ2Fub25pY2FsR2xvYmFsczsKKyAgZm9yICh1bnNpZ25lZCBtID0gMCwgZSA9IE1vZHVsZXMuc2l6ZSgpOyBtICE9IGU7ICsrbSkgeworICAgIE1vZHVsZSAmTSA9ICpNb2R1bGVzW21dOworICAgIGZvciAoTW9kdWxlOjpjb25zdF9nbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAvLyBJbiB0aGUgbXVsdGktbW9kdWxlIGNhc2UsIHNlZSB3aGF0IHRoaXMgZ2xvYmFsIG1hcHMgdG8uCisgICAgICBpZiAoIUxpbmtlZEdsb2JhbHNNYXAuZW1wdHkoKSkgeworICAgICAgICBpZiAoY29uc3QgR2xvYmFsVmFsdWUgKkdWRW50cnkgPSAKKyAgICAgICAgICAgICAgTGlua2VkR2xvYmFsc01hcFtzdGQ6Om1ha2VfcGFpcihJLT5nZXROYW1lKCksIEktPmdldFR5cGUoKSldKSB7CisgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIGVsc2UgaXMgdGhlIGNhbm9uaWNhbCBnbG9iYWwsIGlnbm9yZSB0aGlzIG9uZS4KKyAgICAgICAgICBpZiAoR1ZFbnRyeSAhPSAmKkkpIHsKKyAgICAgICAgICAgIE5vbkNhbm9uaWNhbEdsb2JhbHMucHVzaF9iYWNrKEkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIGlmICghSS0+aXNEZWNsYXJhdGlvbigpKSB7CisgICAgICAgIGFkZEdsb2JhbE1hcHBpbmcoSSwgZ2V0TWVtb3J5Rm9yR1YoSSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRXh0ZXJuYWwgdmFyaWFibGUgcmVmZXJlbmNlLiBUcnkgdG8gdXNlIHRoZSBkeW5hbWljIGxvYWRlciB0bworICAgICAgICAvLyBnZXQgYSBwb2ludGVyIHRvIGl0LgorICAgICAgICBpZiAodm9pZCAqU3ltQWRkciA9CisgICAgICAgICAgICBzeXM6OkR5bmFtaWNMaWJyYXJ5OjpTZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woSS0+Z2V0TmFtZSgpKSkKKyAgICAgICAgICBhZGRHbG9iYWxNYXBwaW5nKEksIFN5bUFkZHIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkNvdWxkIG5vdCByZXNvbHZlIGV4dGVybmFsIGdsb2JhbCBhZGRyZXNzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgK0ktPmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1vZHVsZXMsIG1hcCB0aGUgbm9uLWNhbm9uaWNhbCBnbG9iYWxzIHRvIHRoZWlyCisgICAgLy8gY2Fub25pY2FsIGxvY2F0aW9uLgorICAgIGlmICghTm9uQ2Fub25pY2FsR2xvYmFscy5lbXB0eSgpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTm9uQ2Fub25pY2FsR2xvYmFscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IE5vbkNhbm9uaWNhbEdsb2JhbHNbaV07CisgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpDR1YgPQorICAgICAgICAgIExpbmtlZEdsb2JhbHNNYXBbc3RkOjptYWtlX3BhaXIoR1YtPmdldE5hbWUoKSwgR1YtPmdldFR5cGUoKSldOworICAgICAgICB2b2lkICpQdHIgPSBnZXRQb2ludGVyVG9HbG9iYWxJZkF2YWlsYWJsZShDR1YpOworICAgICAgICBhc3NlcnQoUHRyICYmICJDYW5vbmljYWwgZ2xvYmFsIHdhc24ndCBjb2RlZ2VuJ2QhIik7CisgICAgICAgIGFkZEdsb2JhbE1hcHBpbmcoR1YsIFB0cik7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIE5vdyB0aGF0IGFsbCBvZiB0aGUgZ2xvYmFscyBhcmUgc2V0IHVwIGluIG1lbW9yeSwgbG9vcCB0aHJvdWdoIHRoZW0gYWxsIAorICAgIC8vIGFuZCBpbml0aWFsaXplIHRoZWlyIGNvbnRlbnRzLgorICAgIGZvciAoTW9kdWxlOjpjb25zdF9nbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIUktPmlzRGVjbGFyYXRpb24oKSkgeworICAgICAgICBpZiAoIUxpbmtlZEdsb2JhbHNNYXAuZW1wdHkoKSkgeworICAgICAgICAgIGlmIChjb25zdCBHbG9iYWxWYWx1ZSAqR1ZFbnRyeSA9IAorICAgICAgICAgICAgICAgIExpbmtlZEdsb2JhbHNNYXBbc3RkOjptYWtlX3BhaXIoSS0+Z2V0TmFtZSgpLCBJLT5nZXRUeXBlKCkpXSkKKyAgICAgICAgICAgIGlmIChHVkVudHJ5ICE9ICYqSSkgIC8vIE5vdCB0aGUgY2Fub25pY2FsIHZhcmlhYmxlLgorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBFbWl0R2xvYmFsVmFyaWFibGUoSSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIEVtaXRHbG9iYWxWYXJpYWJsZSAtIFRoaXMgbWV0aG9kIGVtaXRzIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhcmlhYmxlIHRvIHRoZQorLy8gYWRkcmVzcyBzcGVjaWZpZWQgaW4gR2xvYmFsQWRkcmVzc2VzLCBvciBhbGxvY2F0ZXMgbmV3IG1lbW9yeSBpZiBpdCdzIG5vdAorLy8gYWxyZWFkeSBpbiB0aGUgbWFwLgordm9pZCBFeGVjdXRpb25FbmdpbmU6OkVtaXRHbG9iYWxWYXJpYWJsZShjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIHsKKyAgdm9pZCAqR0EgPSBnZXRQb2ludGVyVG9HbG9iYWxJZkF2YWlsYWJsZShHVik7CisKKyAgaWYgKEdBID09IDApIHsKKyAgICAvLyBJZiBpdCdzIG5vdCBhbHJlYWR5IHNwZWNpZmllZCwgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZ2xvYmFsLgorICAgIEdBID0gZ2V0TWVtb3J5Rm9yR1YoR1YpOworICAgIGFkZEdsb2JhbE1hcHBpbmcoR1YsIEdBKTsKKyAgfQorICAKKyAgLy8gRG9uJ3QgaW5pdGlhbGl6ZSBpZiBpdCdzIHRocmVhZCBsb2NhbCwgbGV0IHRoZSBjbGllbnQgZG8gaXQuCisgIGlmICghR1YtPmlzVGhyZWFkTG9jYWwoKSkKKyAgICBJbml0aWFsaXplTWVtb3J5KEdWLT5nZXRJbml0aWFsaXplcigpLCBHQSk7CisgIAorICBjb25zdCBUeXBlICpFbFR5ID0gR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgc2l6ZV90IEdWU2l6ZSA9IChzaXplX3QpZ2V0VGFyZ2V0RGF0YSgpLT5nZXRUeXBlQWxsb2NTaXplKEVsVHkpOworICBOdW1Jbml0Qnl0ZXMgKz0gKHVuc2lnbmVkKUdWU2l6ZTsKKyAgKytOdW1HbG9iYWxzOworfQorCitFeGVjdXRpb25FbmdpbmVTdGF0ZTo6RXhlY3V0aW9uRW5naW5lU3RhdGUoRXhlY3V0aW9uRW5naW5lICZFRSkKKyAgOiBFRShFRSksIEdsb2JhbEFkZHJlc3NNYXAodGhpcykgeworfQorCitzeXM6Ok11dGV4ICpFeGVjdXRpb25FbmdpbmVTdGF0ZTo6QWRkcmVzc01hcENvbmZpZzo6Z2V0TXV0ZXgoCisgIEV4ZWN1dGlvbkVuZ2luZVN0YXRlICpFRVMpIHsKKyAgcmV0dXJuICZFRVMtPkVFLmxvY2s7Cit9Cit2b2lkIEV4ZWN1dGlvbkVuZ2luZVN0YXRlOjpBZGRyZXNzTWFwQ29uZmlnOjpvbkRlbGV0ZSgKKyAgRXhlY3V0aW9uRW5naW5lU3RhdGUgKkVFUywgY29uc3QgR2xvYmFsVmFsdWUgKk9sZCkgeworICB2b2lkICpPbGRWYWwgPSBFRVMtPkdsb2JhbEFkZHJlc3NNYXAubG9va3VwKE9sZCk7CisgIEVFUy0+R2xvYmFsQWRkcmVzc1JldmVyc2VNYXAuZXJhc2UoT2xkVmFsKTsKK30KKwordm9pZCBFeGVjdXRpb25FbmdpbmVTdGF0ZTo6QWRkcmVzc01hcENvbmZpZzo6b25SQVVXKAorICBFeGVjdXRpb25FbmdpbmVTdGF0ZSAqLCBjb25zdCBHbG9iYWxWYWx1ZSAqLCBjb25zdCBHbG9iYWxWYWx1ZSAqKSB7CisgIGFzc2VydChmYWxzZSAmJiAiVGhlIEV4ZWN1dGlvbkVuZ2luZSBkb2Vzbid0IGtub3cgaG93IHRvIGhhbmRsZSBhIgorICAgICAgICAgIiBSQVVXIG9uIGEgdmFsdWUgaXQgaGFzIGEgZ2xvYmFsIG1hcHBpbmcgZm9yLiIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmVCaW5kaW5ncy5jcHAgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0V4ZWN1dGlvbkVuZ2luZUJpbmRpbmdzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGYxZjRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmVCaW5kaW5ncy5jcHAKQEAgLTAsMCArMSwyNTQgQEAKKy8vPT09LS0gRXhlY3V0aW9uRW5naW5lQmluZGluZ3MuY3BwIC0gQyBiaW5kaW5ncyBmb3IgRUVzIC0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEMgYmluZGluZ3MgZm9yIHRoZSBFeGVjdXRpb25FbmdpbmUgbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImppdCIKKyNpbmNsdWRlICJsbHZtLWMvRXhlY3V0aW9uRW5naW5lLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvR2VuZXJpY1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLyo9PT0tLSBPcGVyYXRpb25zIG9uIGdlbmVyaWMgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworTExWTUdlbmVyaWNWYWx1ZVJlZiBMTFZNQ3JlYXRlR2VuZXJpY1ZhbHVlT2ZJbnQoTExWTVR5cGVSZWYgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Cb29sIElzU2lnbmVkKSB7CisgIEdlbmVyaWNWYWx1ZSAqR2VuVmFsID0gbmV3IEdlbmVyaWNWYWx1ZSgpOworICBHZW5WYWwtPkludFZhbCA9IEFQSW50KHVud3JhcDxJbnRlZ2VyVHlwZT4oVHkpLT5nZXRCaXRXaWR0aCgpLCBOLCBJc1NpZ25lZCk7CisgIHJldHVybiB3cmFwKEdlblZhbCk7Cit9CisKK0xMVk1HZW5lcmljVmFsdWVSZWYgTExWTUNyZWF0ZUdlbmVyaWNWYWx1ZU9mUG9pbnRlcih2b2lkICpQKSB7CisgIEdlbmVyaWNWYWx1ZSAqR2VuVmFsID0gbmV3IEdlbmVyaWNWYWx1ZSgpOworICBHZW5WYWwtPlBvaW50ZXJWYWwgPSBQOworICByZXR1cm4gd3JhcChHZW5WYWwpOworfQorCitMTFZNR2VuZXJpY1ZhbHVlUmVmIExMVk1DcmVhdGVHZW5lcmljVmFsdWVPZkZsb2F0KExMVk1UeXBlUmVmIFR5UmVmLCBkb3VibGUgTikgeworICBHZW5lcmljVmFsdWUgKkdlblZhbCA9IG5ldyBHZW5lcmljVmFsdWUoKTsKKyAgc3dpdGNoICh1bndyYXAoVHlSZWYpLT5nZXRUeXBlSUQoKSkgeworICBjYXNlIFR5cGU6OkZsb2F0VHlJRDoKKyAgICBHZW5WYWwtPkZsb2F0VmFsID0gTjsKKyAgICBicmVhazsKKyAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOgorICAgIEdlblZhbC0+RG91YmxlVmFsID0gTjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJMTFZNR2VuZXJpY1ZhbHVlVG9GbG9hdCBzdXBwb3J0cyBvbmx5IGZsb2F0IGFuZCBkb3VibGUuIik7CisgIH0KKyAgcmV0dXJuIHdyYXAoR2VuVmFsKTsKK30KKwordW5zaWduZWQgTExWTUdlbmVyaWNWYWx1ZUludFdpZHRoKExMVk1HZW5lcmljVmFsdWVSZWYgR2VuVmFsUmVmKSB7CisgIHJldHVybiB1bndyYXAoR2VuVmFsUmVmKS0+SW50VmFsLmdldEJpdFdpZHRoKCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBMTFZNR2VuZXJpY1ZhbHVlVG9JbnQoTExWTUdlbmVyaWNWYWx1ZVJlZiBHZW5WYWxSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Cb29sIElzU2lnbmVkKSB7CisgIEdlbmVyaWNWYWx1ZSAqR2VuVmFsID0gdW53cmFwKEdlblZhbFJlZik7CisgIGlmIChJc1NpZ25lZCkKKyAgICByZXR1cm4gR2VuVmFsLT5JbnRWYWwuZ2V0U0V4dFZhbHVlKCk7CisgIGVsc2UKKyAgICByZXR1cm4gR2VuVmFsLT5JbnRWYWwuZ2V0WkV4dFZhbHVlKCk7Cit9CisKK3ZvaWQgKkxMVk1HZW5lcmljVmFsdWVUb1BvaW50ZXIoTExWTUdlbmVyaWNWYWx1ZVJlZiBHZW5WYWwpIHsKKyAgcmV0dXJuIHVud3JhcChHZW5WYWwpLT5Qb2ludGVyVmFsOworfQorCitkb3VibGUgTExWTUdlbmVyaWNWYWx1ZVRvRmxvYXQoTExWTVR5cGVSZWYgVHlSZWYsIExMVk1HZW5lcmljVmFsdWVSZWYgR2VuVmFsKSB7CisgIHN3aXRjaCAodW53cmFwKFR5UmVmKS0+Z2V0VHlwZUlEKCkpIHsKKyAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6CisgICAgcmV0dXJuIHVud3JhcChHZW5WYWwpLT5GbG9hdFZhbDsKKyAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOgorICAgIHJldHVybiB1bndyYXAoR2VuVmFsKS0+RG91YmxlVmFsOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkxMVk1HZW5lcmljVmFsdWVUb0Zsb2F0IHN1cHBvcnRzIG9ubHkgZmxvYXQgYW5kIGRvdWJsZS4iKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsgLy8gTm90IHJlYWNoZWQKK30KKwordm9pZCBMTFZNRGlzcG9zZUdlbmVyaWNWYWx1ZShMTFZNR2VuZXJpY1ZhbHVlUmVmIEdlblZhbCkgeworICBkZWxldGUgdW53cmFwKEdlblZhbCk7Cit9CisKKy8qPT09LS0gT3BlcmF0aW9ucyBvbiBleGVjdXRpb24gZW5naW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK0xMVk1Cb29sIExMVk1DcmVhdGVFeGVjdXRpb25FbmdpbmVGb3JNb2R1bGUoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiAqT3V0RUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dEVycm9yKSB7CisgIHN0ZDo6c3RyaW5nIEVycm9yOworICBFbmdpbmVCdWlsZGVyIGJ1aWxkZXIodW53cmFwKE0pKTsKKyAgYnVpbGRlci5zZXRFbmdpbmVLaW5kKEVuZ2luZUtpbmQ6OkVpdGhlcikKKyAgICAgICAgIC5zZXRFcnJvclN0cigmRXJyb3IpOworICBpZiAoRXhlY3V0aW9uRW5naW5lICpFRSA9IGJ1aWxkZXIuY3JlYXRlKCkpeworICAgICpPdXRFRSA9IHdyYXAoRUUpOworICAgIHJldHVybiAwOworICB9CisgICpPdXRFcnJvciA9IHN0cmR1cChFcnJvci5jX3N0cigpKTsKKyAgcmV0dXJuIDE7Cit9CisKK0xMVk1Cb29sIExMVk1DcmVhdGVJbnRlcnByZXRlckZvck1vZHVsZShMTFZNRXhlY3V0aW9uRW5naW5lUmVmICpPdXRJbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1vZHVsZVJlZiBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipPdXRFcnJvcikgeworICBzdGQ6OnN0cmluZyBFcnJvcjsKKyAgRW5naW5lQnVpbGRlciBidWlsZGVyKHVud3JhcChNKSk7CisgIGJ1aWxkZXIuc2V0RW5naW5lS2luZChFbmdpbmVLaW5kOjpJbnRlcnByZXRlcikKKyAgICAgICAgIC5zZXRFcnJvclN0cigmRXJyb3IpOworICBpZiAoRXhlY3V0aW9uRW5naW5lICpJbnRlcnAgPSBidWlsZGVyLmNyZWF0ZSgpKSB7CisgICAgKk91dEludGVycCA9IHdyYXAoSW50ZXJwKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqT3V0RXJyb3IgPSBzdHJkdXAoRXJyb3IuY19zdHIoKSk7CisgIHJldHVybiAxOworfQorCitMTFZNQm9vbCBMTFZNQ3JlYXRlSklUQ29tcGlsZXJGb3JNb2R1bGUoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiAqT3V0SklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0RXJyb3IpIHsKKyAgc3RkOjpzdHJpbmcgRXJyb3I7CisgIEVuZ2luZUJ1aWxkZXIgYnVpbGRlcih1bndyYXAoTSkpOworICBidWlsZGVyLnNldEVuZ2luZUtpbmQoRW5naW5lS2luZDo6SklUKQorICAgICAgICAgLnNldEVycm9yU3RyKCZFcnJvcikKKyAgICAgICAgIC5zZXRPcHRMZXZlbCgoQ29kZUdlbk9wdDo6TGV2ZWwpT3B0TGV2ZWwpOworICBpZiAoRXhlY3V0aW9uRW5naW5lICpKSVQgPSBidWlsZGVyLmNyZWF0ZSgpKSB7CisgICAgKk91dEpJVCA9IHdyYXAoSklUKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqT3V0RXJyb3IgPSBzdHJkdXAoRXJyb3IuY19zdHIoKSk7CisgIHJldHVybiAxOworfQorCitMTFZNQm9vbCBMTFZNQ3JlYXRlRXhlY3V0aW9uRW5naW5lKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgKk91dEVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUHJvdmlkZXJSZWYgTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipPdXRFcnJvcikgeworICAvKiBUaGUgbW9kdWxlIHByb3ZpZGVyIGlzIG5vdyBhY3R1YWxseSBhIG1vZHVsZS4gKi8KKyAgcmV0dXJuIExMVk1DcmVhdGVFeGVjdXRpb25FbmdpbmVGb3JNb2R1bGUoT3V0RUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TExWTU1vZHVsZVJlZj4oTVApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRFcnJvcik7Cit9CisKK0xMVk1Cb29sIExMVk1DcmVhdGVJbnRlcnByZXRlcihMTFZNRXhlY3V0aW9uRW5naW5lUmVmICpPdXRJbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1vZHVsZVByb3ZpZGVyUmVmIE1QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipPdXRFcnJvcikgeworICAvKiBUaGUgbW9kdWxlIHByb3ZpZGVyIGlzIG5vdyBhY3R1YWxseSBhIG1vZHVsZS4gKi8KKyAgcmV0dXJuIExMVk1DcmVhdGVJbnRlcnByZXRlckZvck1vZHVsZShPdXRJbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxMTFZNTW9kdWxlUmVmPihNUCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0RXJyb3IpOworfQorCitMTFZNQm9vbCBMTFZNQ3JlYXRlSklUQ29tcGlsZXIoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiAqT3V0SklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVQcm92aWRlclJlZiBNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0RXJyb3IpIHsKKyAgLyogVGhlIG1vZHVsZSBwcm92aWRlciBpcyBub3cgYWN0dWFsbHkgYSBtb2R1bGUuICovCisgIHJldHVybiBMTFZNQ3JlYXRlSklUQ29tcGlsZXJGb3JNb2R1bGUoT3V0SklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TExWTU1vZHVsZVJlZj4oTVApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdExldmVsLCBPdXRFcnJvcik7Cit9CisKKwordm9pZCBMTFZNRGlzcG9zZUV4ZWN1dGlvbkVuZ2luZShMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFKSB7CisgIGRlbGV0ZSB1bndyYXAoRUUpOworfQorCit2b2lkIExMVk1SdW5TdGF0aWNDb25zdHJ1Y3RvcnMoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSkgeworICB1bndyYXAoRUUpLT5ydW5TdGF0aWNDb25zdHJ1Y3RvcnNEZXN0cnVjdG9ycyhmYWxzZSk7Cit9CisKK3ZvaWQgTExWTVJ1blN0YXRpY0Rlc3RydWN0b3JzKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUpIHsKKyAgdW53cmFwKEVFKS0+cnVuU3RhdGljQ29uc3RydWN0b3JzRGVzdHJ1Y3RvcnModHJ1ZSk7Cit9CisKK2ludCBMTFZNUnVuRnVuY3Rpb25Bc01haW4oTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwgTExWTVZhbHVlUmVmIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFyZ0MsIGNvbnN0IGNoYXIgKiBjb25zdCAqQXJnViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpFbnZQKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcmdWZWM7CisgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gQXJnQzsgKytJKQorICAgIEFyZ1ZlYy5wdXNoX2JhY2soQXJnVltJXSk7CisgIAorICByZXR1cm4gdW53cmFwKEVFKS0+cnVuRnVuY3Rpb25Bc01haW4odW53cmFwPEZ1bmN0aW9uPihGKSwgQXJnVmVjLCBFbnZQKTsKK30KKworTExWTUdlbmVyaWNWYWx1ZVJlZiBMTFZNUnVuRnVuY3Rpb24oTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwgTExWTVZhbHVlUmVmIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUdlbmVyaWNWYWx1ZVJlZiAqQXJncykgeworICBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+IEFyZ1ZlYzsKKyAgQXJnVmVjLnJlc2VydmUoTnVtQXJncyk7CisgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gTnVtQXJnczsgKytJKQorICAgIEFyZ1ZlYy5wdXNoX2JhY2soKnVud3JhcChBcmdzW0ldKSk7CisgIAorICBHZW5lcmljVmFsdWUgKlJlc3VsdCA9IG5ldyBHZW5lcmljVmFsdWUoKTsKKyAgKlJlc3VsdCA9IHVud3JhcChFRSktPnJ1bkZ1bmN0aW9uKHVud3JhcDxGdW5jdGlvbj4oRiksIEFyZ1ZlYyk7CisgIHJldHVybiB3cmFwKFJlc3VsdCk7Cit9CisKK3ZvaWQgTExWTUZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUsIExMVk1WYWx1ZVJlZiBGKSB7CisgIHVud3JhcChFRSktPmZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uKHVud3JhcDxGdW5jdGlvbj4oRikpOworfQorCit2b2lkIExMVk1BZGRNb2R1bGUoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwgTExWTU1vZHVsZVJlZiBNKXsKKyAgdW53cmFwKEVFKS0+YWRkTW9kdWxlKHVud3JhcChNKSk7Cit9CisKK3ZvaWQgTExWTUFkZE1vZHVsZVByb3ZpZGVyKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUsIExMVk1Nb2R1bGVQcm92aWRlclJlZiBNUCl7CisgIC8qIFRoZSBtb2R1bGUgcHJvdmlkZXIgaXMgbm93IGFjdHVhbGx5IGEgbW9kdWxlLiAqLworICBMTFZNQWRkTW9kdWxlKEVFLCByZWludGVycHJldF9jYXN0PExMVk1Nb2R1bGVSZWY+KE1QKSk7Cit9CisKK0xMVk1Cb29sIExMVk1SZW1vdmVNb2R1bGUoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwgTExWTU1vZHVsZVJlZiBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUmVmICpPdXRNb2QsIGNoYXIgKipPdXRFcnJvcikgeworICBNb2R1bGUgKk1vZCA9IHVud3JhcChNKTsKKyAgdW53cmFwKEVFKS0+cmVtb3ZlTW9kdWxlKE1vZCk7CisgICpPdXRNb2QgPSB3cmFwKE1vZCk7CisgIHJldHVybiAwOworfQorCitMTFZNQm9vbCBMTFZNUmVtb3ZlTW9kdWxlUHJvdmlkZXIoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUHJvdmlkZXJSZWYgTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1vZHVsZVJlZiAqT3V0TW9kLCBjaGFyICoqT3V0RXJyb3IpIHsKKyAgLyogVGhlIG1vZHVsZSBwcm92aWRlciBpcyBub3cgYWN0dWFsbHkgYSBtb2R1bGUuICovCisgIHJldHVybiBMTFZNUmVtb3ZlTW9kdWxlKEVFLCByZWludGVycHJldF9jYXN0PExMVk1Nb2R1bGVSZWY+KE1QKSwgT3V0TW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRFcnJvcik7Cit9CisKK0xMVk1Cb29sIExMVk1GaW5kRnVuY3Rpb24oTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwgY29uc3QgY2hhciAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmICpPdXRGbikgeworICBpZiAoRnVuY3Rpb24gKkYgPSB1bndyYXAoRUUpLT5GaW5kRnVuY3Rpb25OYW1lZChOYW1lKSkgeworICAgICpPdXRGbiA9IHdyYXAoRik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgKkxMVk1SZWNvbXBpbGVBbmRSZWxpbmtGdW5jdGlvbihMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNVmFsdWVSZWYgRm4pIHsKKyAgcmV0dXJuIHVud3JhcChFRSktPnJlY29tcGlsZUFuZFJlbGlua0Z1bmN0aW9uKHVud3JhcDxGdW5jdGlvbj4oRm4pKTsKK30KKworTExWTVRhcmdldERhdGFSZWYgTExWTUdldEV4ZWN1dGlvbkVuZ2luZVRhcmdldERhdGEoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSkgeworICByZXR1cm4gd3JhcCh1bndyYXAoRUUpLT5nZXRUYXJnZXREYXRhKCkpOworfQorCit2b2lkIExMVk1BZGRHbG9iYWxNYXBwaW5nKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUsIExMVk1WYWx1ZVJlZiBHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIEFkZHIpIHsKKyAgdW53cmFwKEVFKS0+YWRkR2xvYmFsTWFwcGluZyh1bndyYXA8R2xvYmFsVmFsdWU+KEdsb2JhbCksIEFkZHIpOworfQorCit2b2lkICpMTFZNR2V0UG9pbnRlclRvR2xvYmFsKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUsIExMVk1WYWx1ZVJlZiBHbG9iYWwpIHsKKyAgcmV0dXJuIHVud3JhcChFRSktPmdldFBvaW50ZXJUb0dsb2JhbCh1bndyYXA8R2xvYmFsVmFsdWU+KEdsb2JhbCkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmOTdmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1JbnRlcnByZXRlcgorICBFeGVjdXRpb24uY3BwCisgIEV4dGVybmFsRnVuY3Rpb25zLmNwcAorICBJbnRlcnByZXRlci5jcHAKKyAgKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci9FeGVjdXRpb24uY3BwIGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci9FeGVjdXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZWJlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0ludGVycHJldGVyL0V4ZWN1dGlvbi5jcHAKQEAgLTAsMCArMSwxMzUyIEBACisvLz09PS0tIEV4ZWN1dGlvbi5jcHAgLSBJbXBsZW1lbnQgY29kZSB0byBzaW11bGF0ZSB0aGUgcHJvZ3JhbSAtLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiBpbnRlcnByZXRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImludGVycHJldGVyIgorI2luY2x1ZGUgIkludGVycHJldGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0ludHJpbnNpY0xvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y21hdGg+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUR5bmFtaWNJbnN0cywgIk51bWJlciBvZiBkeW5hbWljIGluc3RydWN0aW9ucyBleGVjdXRlZCIpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBQcmludFZvbGF0aWxlKCJpbnRlcnByZXRlci1wcmludC12b2xhdGlsZSIsIGNsOjpIaWRkZW4sCisgICAgICAgICAgY2w6OmRlc2MoIm1ha2UgdGhlIGludGVycHJldGVyIHByaW50IGV2ZXJ5IHZvbGF0aWxlIGxvYWQgYW5kIHN0b3JlIikpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICBWYXJpb3VzIEhlbHBlciBGdW5jdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3N0YXRpYyB2b2lkIFNldFZhbHVlKFZhbHVlICpWLCBHZW5lcmljVmFsdWUgVmFsLCBFeGVjdXRpb25Db250ZXh0ICZTRikgeworICBTRi5WYWx1ZXNbVl0gPSBWYWw7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgQmluYXJ5IEluc3RydWN0aW9uIEltcGxlbWVudGF0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBJTVBMRU1FTlRfQklOQVJZX09QRVJBVE9SKE9QLCBUWSkgXAorICAgY2FzZSBUeXBlOjpUWSMjVHlJRDogXAorICAgICBEZXN0LlRZIyNWYWwgPSBTcmMxLlRZIyNWYWwgT1AgU3JjMi5UWSMjVmFsOyBcCisgICAgIGJyZWFrCisKK3N0YXRpYyB2b2lkIGV4ZWN1dGVGQWRkSW5zdChHZW5lcmljVmFsdWUgJkRlc3QsIEdlbmVyaWNWYWx1ZSBTcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNWYWx1ZSBTcmMyLCBjb25zdCBUeXBlICpUeSkgeworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICAgIElNUExFTUVOVF9CSU5BUllfT1BFUkFUT1IoKywgRmxvYXQpOworICAgIElNUExFTUVOVF9CSU5BUllfT1BFUkFUT1IoKywgRG91YmxlKTsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIlVuaGFuZGxlZCB0eXBlIGZvciBGQWRkIGluc3RydWN0aW9uOiAiIDw8ICpUeSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZXhlY3V0ZUZTdWJJbnN0KEdlbmVyaWNWYWx1ZSAmRGVzdCwgR2VuZXJpY1ZhbHVlIFNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpY1ZhbHVlIFNyYzIsIGNvbnN0IFR5cGUgKlR5KSB7CisgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgICAgSU1QTEVNRU5UX0JJTkFSWV9PUEVSQVRPUigtLCBGbG9hdCk7CisgICAgSU1QTEVNRU5UX0JJTkFSWV9PUEVSQVRPUigtLCBEb3VibGUpOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIHR5cGUgZm9yIEZTdWIgaW5zdHJ1Y3Rpb246ICIgPDwgKlR5IDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBleGVjdXRlRk11bEluc3QoR2VuZXJpY1ZhbHVlICZEZXN0LCBHZW5lcmljVmFsdWUgU3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVmFsdWUgU3JjMiwgY29uc3QgVHlwZSAqVHkpIHsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfQklOQVJZX09QRVJBVE9SKCosIEZsb2F0KTsKKyAgICBJTVBMRU1FTlRfQklOQVJZX09QRVJBVE9SKCosIERvdWJsZSk7CisgIGRlZmF1bHQ6CisgICAgZGJncygpIDw8ICJVbmhhbmRsZWQgdHlwZSBmb3IgRk11bCBpbnN0cnVjdGlvbjogIiA8PCAqVHkgPDwgIlxuIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGV4ZWN1dGVGRGl2SW5zdChHZW5lcmljVmFsdWUgJkRlc3QsIEdlbmVyaWNWYWx1ZSBTcmMxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVmFsdWUgU3JjMiwgY29uc3QgVHlwZSAqVHkpIHsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfQklOQVJZX09QRVJBVE9SKC8sIEZsb2F0KTsKKyAgICBJTVBMRU1FTlRfQklOQVJZX09QRVJBVE9SKC8sIERvdWJsZSk7CisgIGRlZmF1bHQ6CisgICAgZGJncygpIDw8ICJVbmhhbmRsZWQgdHlwZSBmb3IgRkRpdiBpbnN0cnVjdGlvbjogIiA8PCAqVHkgPDwgIlxuIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGV4ZWN1dGVGUmVtSW5zdChHZW5lcmljVmFsdWUgJkRlc3QsIEdlbmVyaWNWYWx1ZSBTcmMxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVmFsdWUgU3JjMiwgY29uc3QgVHlwZSAqVHkpIHsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6CisgICAgRGVzdC5GbG9hdFZhbCA9IGZtb2QoU3JjMS5GbG9hdFZhbCwgU3JjMi5GbG9hdFZhbCk7CisgICAgYnJlYWs7CisgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDoKKyAgICBEZXN0LkRvdWJsZVZhbCA9IGZtb2QoU3JjMS5Eb3VibGVWYWwsIFNyYzIuRG91YmxlVmFsKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIlVuaGFuZGxlZCB0eXBlIGZvciBSZW0gaW5zdHJ1Y3Rpb246ICIgPDwgKlR5IDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorfQorCisjZGVmaW5lIElNUExFTUVOVF9JTlRFR0VSX0lDTVAoT1AsIFRZKSBcCisgICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOiAgXAorICAgICAgRGVzdC5JbnRWYWwgPSBBUEludCgxLFNyYzEuSW50VmFsLk9QKFNyYzIuSW50VmFsKSk7IFwKKyAgICAgIGJyZWFrOworCisvLyBIYW5kbGUgcG9pbnRlcnMgc3BlY2lhbGx5IGJlY2F1c2UgdGhleSBtdXN0IGJlIGNvbXBhcmVkIHdpdGggb25seSBhcyBtdWNoCisvLyB3aWR0aCBhcyB0aGUgaG9zdCBoYXMuICBXZSBfZG8gbm90XyB3YW50IHRvIGJlIGNvbXBhcmluZyA2NCBiaXQgdmFsdWVzIHdoZW4KKy8vIHJ1bm5pbmcgb24gYSAzMi1iaXQgdGFyZ2V0LCBvdGhlcndpc2UgdGhlIHVwcGVyIDMyIGJpdHMgbWlnaHQgbWVzcyB1cAorLy8gY29tcGFyaXNvbnMgaWYgdGhleSBjb250YWluIGdhcmJhZ2UuCisjZGVmaW5lIElNUExFTUVOVF9QT0lOVEVSX0lDTVAoT1ApIFwKKyAgIGNhc2UgVHlwZTo6UG9pbnRlclR5SUQ6IFwKKyAgICAgIERlc3QuSW50VmFsID0gQVBJbnQoMSwodm9pZCopKGludHB0cl90KVNyYzEuUG9pbnRlclZhbCBPUCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShpbnRwdHJfdClTcmMyLlBvaW50ZXJWYWwpOyBcCisgICAgICBicmVhazsKKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlSUNNUF9FUShHZW5lcmljVmFsdWUgU3JjMSwgR2VuZXJpY1ZhbHVlIFNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICAgIElNUExFTUVOVF9JTlRFR0VSX0lDTVAoZXEsVHkpOworICAgIElNUExFTUVOVF9QT0lOVEVSX0lDTVAoPT0pOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIHR5cGUgZm9yIElDTVBfRVEgcHJlZGljYXRlOiAiIDw8ICpUeSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKyAgcmV0dXJuIERlc3Q7Cit9CisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZUlDTVBfTkUoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfSU5URUdFUl9JQ01QKG5lLFR5KTsKKyAgICBJTVBMRU1FTlRfUE9JTlRFUl9JQ01QKCE9KTsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIlVuaGFuZGxlZCB0eXBlIGZvciBJQ01QX05FIHByZWRpY2F0ZTogIiA8PCAqVHkgPDwgIlxuIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9CisgIHJldHVybiBEZXN0OworfQorCitzdGF0aWMgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVJQ01QX1VMVChHZW5lcmljVmFsdWUgU3JjMSwgR2VuZXJpY1ZhbHVlIFNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfSU5URUdFUl9JQ01QKHVsdCxUeSk7CisgICAgSU1QTEVNRU5UX1BPSU5URVJfSUNNUCg8KTsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIlVuaGFuZGxlZCB0eXBlIGZvciBJQ01QX1VMVCBwcmVkaWNhdGU6ICIgPDwgKlR5IDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorICByZXR1cm4gRGVzdDsKK30KKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlSUNNUF9TTFQoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3Q7CisgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgICAgSU1QTEVNRU5UX0lOVEVHRVJfSUNNUChzbHQsVHkpOworICAgIElNUExFTUVOVF9QT0lOVEVSX0lDTVAoPCk7CisgIGRlZmF1bHQ6CisgICAgZGJncygpIDw8ICJVbmhhbmRsZWQgdHlwZSBmb3IgSUNNUF9TTFQgcHJlZGljYXRlOiAiIDw8ICpUeSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKyAgcmV0dXJuIERlc3Q7Cit9CisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZUlDTVBfVUdUKEdlbmVyaWNWYWx1ZSBTcmMxLCBHZW5lcmljVmFsdWUgU3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICAgIElNUExFTUVOVF9JTlRFR0VSX0lDTVAodWd0LFR5KTsKKyAgICBJTVBMRU1FTlRfUE9JTlRFUl9JQ01QKD4pOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIHR5cGUgZm9yIElDTVBfVUdUIHByZWRpY2F0ZTogIiA8PCAqVHkgPDwgIlxuIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9CisgIHJldHVybiBEZXN0OworfQorCitzdGF0aWMgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVJQ01QX1NHVChHZW5lcmljVmFsdWUgU3JjMSwgR2VuZXJpY1ZhbHVlIFNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfSU5URUdFUl9JQ01QKHNndCxUeSk7CisgICAgSU1QTEVNRU5UX1BPSU5URVJfSUNNUCg+KTsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIlVuaGFuZGxlZCB0eXBlIGZvciBJQ01QX1NHVCBwcmVkaWNhdGU6ICIgPDwgKlR5IDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorICByZXR1cm4gRGVzdDsKK30KKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlSUNNUF9VTEUoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3Q7CisgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgICAgSU1QTEVNRU5UX0lOVEVHRVJfSUNNUCh1bGUsVHkpOworICAgIElNUExFTUVOVF9QT0lOVEVSX0lDTVAoPD0pOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIHR5cGUgZm9yIElDTVBfVUxFIHByZWRpY2F0ZTogIiA8PCAqVHkgPDwgIlxuIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9CisgIHJldHVybiBEZXN0OworfQorCitzdGF0aWMgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVJQ01QX1NMRShHZW5lcmljVmFsdWUgU3JjMSwgR2VuZXJpY1ZhbHVlIFNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfSU5URUdFUl9JQ01QKHNsZSxUeSk7CisgICAgSU1QTEVNRU5UX1BPSU5URVJfSUNNUCg8PSk7CisgIGRlZmF1bHQ6CisgICAgZGJncygpIDw8ICJVbmhhbmRsZWQgdHlwZSBmb3IgSUNNUF9TTEUgcHJlZGljYXRlOiAiIDw8ICpUeSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKyAgcmV0dXJuIERlc3Q7Cit9CisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZUlDTVBfVUdFKEdlbmVyaWNWYWx1ZSBTcmMxLCBHZW5lcmljVmFsdWUgU3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICAgIElNUExFTUVOVF9JTlRFR0VSX0lDTVAodWdlLFR5KTsKKyAgICBJTVBMRU1FTlRfUE9JTlRFUl9JQ01QKD49KTsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIlVuaGFuZGxlZCB0eXBlIGZvciBJQ01QX1VHRSBwcmVkaWNhdGU6ICIgPDwgKlR5IDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorICByZXR1cm4gRGVzdDsKK30KKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlSUNNUF9TR0UoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3Q7CisgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgICAgSU1QTEVNRU5UX0lOVEVHRVJfSUNNUChzZ2UsVHkpOworICAgIElNUExFTUVOVF9QT0lOVEVSX0lDTVAoPj0pOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIHR5cGUgZm9yIElDTVBfU0dFIHByZWRpY2F0ZTogIiA8PCAqVHkgPDwgIlxuIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9CisgIHJldHVybiBEZXN0OworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdElDbXBJbnN0KElDbXBJbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIGNvbnN0IFR5cGUgKlR5ICAgID0gSS5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgIEdlbmVyaWNWYWx1ZSBTcmMxID0gZ2V0T3BlcmFuZFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSwgU0YpOworICBHZW5lcmljVmFsdWUgU3JjMiA9IGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoMSksIFNGKTsKKyAgR2VuZXJpY1ZhbHVlIFI7ICAgLy8gUmVzdWx0CisgIAorICBzd2l0Y2ggKEkuZ2V0UHJlZGljYXRlKCkpIHsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogIFIgPSBleGVjdXRlSUNNUF9FUShTcmMxLCAgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORTogIFIgPSBleGVjdXRlSUNNUF9ORShTcmMxLCAgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6IFIgPSBleGVjdXRlSUNNUF9VTFQoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTFQ6IFIgPSBleGVjdXRlSUNNUF9TTFQoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6IFIgPSBleGVjdXRlSUNNUF9VR1QoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6IFIgPSBleGVjdXRlSUNNUF9TR1QoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTEU6IFIgPSBleGVjdXRlSUNNUF9VTEUoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6IFIgPSBleGVjdXRlSUNNUF9TTEUoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6IFIgPSBleGVjdXRlSUNNUF9VR0UoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR0U6IFIgPSBleGVjdXRlSUNNUF9TR0UoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIkRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzIElDbXAgcHJlZGljYXRlIVxuLS0+IiA8PCBJOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKyAKKyAgU2V0VmFsdWUoJkksIFIsIFNGKTsKK30KKworI2RlZmluZSBJTVBMRU1FTlRfRkNNUChPUCwgVFkpIFwKKyAgIGNhc2UgVHlwZTo6VFkjI1R5SUQ6IFwKKyAgICAgRGVzdC5JbnRWYWwgPSBBUEludCgxLFNyYzEuVFkjI1ZhbCBPUCBTcmMyLlRZIyNWYWwpOyBcCisgICAgIGJyZWFrCisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZUZDTVBfT0VRKEdlbmVyaWNWYWx1ZSBTcmMxLCBHZW5lcmljVmFsdWUgU3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3Q7CisgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgICAgSU1QTEVNRU5UX0ZDTVAoPT0sIEZsb2F0KTsKKyAgICBJTVBMRU1FTlRfRkNNUCg9PSwgRG91YmxlKTsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIlVuaGFuZGxlZCB0eXBlIGZvciBGQ21wIEVRIGluc3RydWN0aW9uOiAiIDw8ICpUeSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKyAgcmV0dXJuIERlc3Q7Cit9CisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZUZDTVBfT05FKEdlbmVyaWNWYWx1ZSBTcmMxLCBHZW5lcmljVmFsdWUgU3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3Q7CisgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgICAgSU1QTEVNRU5UX0ZDTVAoIT0sIEZsb2F0KTsKKyAgICBJTVBMRU1FTlRfRkNNUCghPSwgRG91YmxlKTsKKworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIHR5cGUgZm9yIEZDbXAgTkUgaW5zdHJ1Y3Rpb246ICIgPDwgKlR5IDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorICByZXR1cm4gRGVzdDsKK30KKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlRkNNUF9PTEUoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfRkNNUCg8PSwgRmxvYXQpOworICAgIElNUExFTUVOVF9GQ01QKDw9LCBEb3VibGUpOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIHR5cGUgZm9yIEZDbXAgTEUgaW5zdHJ1Y3Rpb246ICIgPDwgKlR5IDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorICByZXR1cm4gRGVzdDsKK30KKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlRkNNUF9PR0UoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfRkNNUCg+PSwgRmxvYXQpOworICAgIElNUExFTUVOVF9GQ01QKD49LCBEb3VibGUpOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIHR5cGUgZm9yIEZDbXAgR0UgaW5zdHJ1Y3Rpb246ICIgPDwgKlR5IDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorICByZXR1cm4gRGVzdDsKK30KKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlRkNNUF9PTFQoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfRkNNUCg8LCBGbG9hdCk7CisgICAgSU1QTEVNRU5UX0ZDTVAoPCwgRG91YmxlKTsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIlVuaGFuZGxlZCB0eXBlIGZvciBGQ21wIExUIGluc3RydWN0aW9uOiAiIDw8ICpUeSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKyAgcmV0dXJuIERlc3Q7Cit9CisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZUZDTVBfT0dUKEdlbmVyaWNWYWx1ZSBTcmMxLCBHZW5lcmljVmFsdWUgU3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBJTVBMRU1FTlRfRkNNUCg+LCBGbG9hdCk7CisgICAgSU1QTEVNRU5UX0ZDTVAoPiwgRG91YmxlKTsKKyAgZGVmYXVsdDoKKyAgICBkYmdzKCkgPDwgIlVuaGFuZGxlZCB0eXBlIGZvciBGQ21wIEdUIGluc3RydWN0aW9uOiAiIDw8ICpUeSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKyAgcmV0dXJuIERlc3Q7Cit9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1VOT1JERVJFRChUWSwgWCxZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChUWS0+aXNGbG9hdFR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChYLkZsb2F0VmFsICE9IFguRmxvYXRWYWwgfHwgWS5GbG9hdFZhbCAhPSBZLkZsb2F0VmFsKSB7ICAgICAgICAgIFwKKyAgICAgIERlc3QuSW50VmFsID0gQVBJbnQoMSx0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gRGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIGlmIChYLkRvdWJsZVZhbCAhPSBYLkRvdWJsZVZhbCB8fCBZLkRvdWJsZVZhbCAhPSBZLkRvdWJsZVZhbCkgeyBcCisgICAgRGVzdC5JbnRWYWwgPSBBUEludCgxLHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBEZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZUZDTVBfVUVRKEdlbmVyaWNWYWx1ZSBTcmMxLCBHZW5lcmljVmFsdWUgU3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3Q7CisgIElNUExFTUVOVF9VTk9SREVSRUQoVHksIFNyYzEsIFNyYzIpCisgIHJldHVybiBleGVjdXRlRkNNUF9PRVEoU3JjMSwgU3JjMiwgVHkpOworfQorCitzdGF0aWMgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVGQ01QX1VORShHZW5lcmljVmFsdWUgU3JjMSwgR2VuZXJpY1ZhbHVlIFNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBJTVBMRU1FTlRfVU5PUkRFUkVEKFR5LCBTcmMxLCBTcmMyKQorICByZXR1cm4gZXhlY3V0ZUZDTVBfT05FKFNyYzEsIFNyYzIsIFR5KTsKK30KKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlRkNNUF9VTEUoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgSU1QTEVNRU5UX1VOT1JERVJFRChUeSwgU3JjMSwgU3JjMikKKyAgcmV0dXJuIGV4ZWN1dGVGQ01QX09MRShTcmMxLCBTcmMyLCBUeSk7Cit9CisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZUZDTVBfVUdFKEdlbmVyaWNWYWx1ZSBTcmMxLCBHZW5lcmljVmFsdWUgU3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3Q7CisgIElNUExFTUVOVF9VTk9SREVSRUQoVHksIFNyYzEsIFNyYzIpCisgIHJldHVybiBleGVjdXRlRkNNUF9PR0UoU3JjMSwgU3JjMiwgVHkpOworfQorCitzdGF0aWMgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVGQ01QX1VMVChHZW5lcmljVmFsdWUgU3JjMSwgR2VuZXJpY1ZhbHVlIFNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBJTVBMRU1FTlRfVU5PUkRFUkVEKFR5LCBTcmMxLCBTcmMyKQorICByZXR1cm4gZXhlY3V0ZUZDTVBfT0xUKFNyYzEsIFNyYzIsIFR5KTsKK30KKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlRkNNUF9VR1QoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBJTVBMRU1FTlRfVU5PUkRFUkVEKFR5LCBTcmMxLCBTcmMyKQorICByZXR1cm4gZXhlY3V0ZUZDTVBfT0dUKFNyYzEsIFNyYzIsIFR5KTsKK30KKworc3RhdGljIEdlbmVyaWNWYWx1ZSBleGVjdXRlRkNNUF9PUkQoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBpZiAoVHktPmlzRmxvYXRUeSgpKQorICAgIERlc3QuSW50VmFsID0gQVBJbnQoMSwoU3JjMS5GbG9hdFZhbCA9PSBTcmMxLkZsb2F0VmFsICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjMi5GbG9hdFZhbCA9PSBTcmMyLkZsb2F0VmFsKSk7CisgIGVsc2UKKyAgICBEZXN0LkludFZhbCA9IEFQSW50KDEsKFNyYzEuRG91YmxlVmFsID09IFNyYzEuRG91YmxlVmFsICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjMi5Eb3VibGVWYWwgPT0gU3JjMi5Eb3VibGVWYWwpKTsKKyAgcmV0dXJuIERlc3Q7Cit9CisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZUZDTVBfVU5PKEdlbmVyaWNWYWx1ZSBTcmMxLCBHZW5lcmljVmFsdWUgU3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgeworICBHZW5lcmljVmFsdWUgRGVzdDsKKyAgaWYgKFR5LT5pc0Zsb2F0VHkoKSkKKyAgICBEZXN0LkludFZhbCA9IEFQSW50KDEsKFNyYzEuRmxvYXRWYWwgIT0gU3JjMS5GbG9hdFZhbCB8fCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYzIuRmxvYXRWYWwgIT0gU3JjMi5GbG9hdFZhbCkpOworICBlbHNlCisgICAgRGVzdC5JbnRWYWwgPSBBUEludCgxLChTcmMxLkRvdWJsZVZhbCAhPSBTcmMxLkRvdWJsZVZhbCB8fCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYzIuRG91YmxlVmFsICE9IFNyYzIuRG91YmxlVmFsKSk7CisgIHJldHVybiBEZXN0OworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdEZDbXBJbnN0KEZDbXBJbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIGNvbnN0IFR5cGUgKlR5ICAgID0gSS5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgIEdlbmVyaWNWYWx1ZSBTcmMxID0gZ2V0T3BlcmFuZFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSwgU0YpOworICBHZW5lcmljVmFsdWUgU3JjMiA9IGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoMSksIFNGKTsKKyAgR2VuZXJpY1ZhbHVlIFI7ICAgLy8gUmVzdWx0CisgIAorICBzd2l0Y2ggKEkuZ2V0UHJlZGljYXRlKCkpIHsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9GQUxTRTogUi5JbnRWYWwgPSBBUEludCgxLGZhbHNlKTsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVFJVRTogIFIuSW50VmFsID0gQVBJbnQoMSx0cnVlKTsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT1JEOiAgIFIgPSBleGVjdXRlRkNNUF9PUkQoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTk86ICAgUiA9IGV4ZWN1dGVGQ01QX1VOTyhTcmMxLCBTcmMyLCBUeSk7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VFUTogICBSID0gZXhlY3V0ZUZDTVBfVUVRKFNyYzEsIFNyYzIsIFR5KTsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0VROiAgIFIgPSBleGVjdXRlRkNNUF9PRVEoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTkU6ICAgUiA9IGV4ZWN1dGVGQ01QX1VORShTcmMxLCBTcmMyLCBUeSk7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09ORTogICBSID0gZXhlY3V0ZUZDTVBfT05FKFNyYzEsIFNyYzIsIFR5KTsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxUOiAgIFIgPSBleGVjdXRlRkNNUF9VTFQoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTFQ6ICAgUiA9IGV4ZWN1dGVGQ01QX09MVChTcmMxLCBTcmMyLCBUeSk7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHVDogICBSID0gZXhlY3V0ZUZDTVBfVUdUKFNyYzEsIFNyYzIsIFR5KTsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0dUOiAgIFIgPSBleGVjdXRlRkNNUF9PR1QoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTEU6ICAgUiA9IGV4ZWN1dGVGQ01QX1VMRShTcmMxLCBTcmMyLCBUeSk7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MRTogICBSID0gZXhlY3V0ZUZDTVBfT0xFKFNyYzEsIFNyYzIsIFR5KTsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdFOiAgIFIgPSBleGVjdXRlRkNNUF9VR0UoU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PR0U6ICAgUiA9IGV4ZWN1dGVGQ01QX09HRShTcmMxLCBTcmMyLCBUeSk7IGJyZWFrOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoaXMgRkNtcCBwcmVkaWNhdGUhXG4tLT4iIDw8IEk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorIAorICBTZXRWYWx1ZSgmSSwgUiwgU0YpOworfQorCitzdGF0aWMgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVDbXBJbnN0KHVuc2lnbmVkIHByZWRpY2F0ZSwgR2VuZXJpY1ZhbHVlIFNyYzEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVmFsdWUgU3JjMiwgY29uc3QgVHlwZSAqVHkpIHsKKyAgR2VuZXJpY1ZhbHVlIFJlc3VsdDsKKyAgc3dpdGNoIChwcmVkaWNhdGUpIHsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogICAgcmV0dXJuIGV4ZWN1dGVJQ01QX0VRKFNyYzEsIFNyYzIsIFR5KTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORTogICAgcmV0dXJuIGV4ZWN1dGVJQ01QX05FKFNyYzEsIFNyYzIsIFR5KTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6ICAgcmV0dXJuIGV4ZWN1dGVJQ01QX1VHVChTcmMxLCBTcmMyLCBUeSk7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiAgIHJldHVybiBleGVjdXRlSUNNUF9TR1QoU3JjMSwgU3JjMiwgVHkpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDogICByZXR1cm4gZXhlY3V0ZUlDTVBfVUxUKFNyYzEsIFNyYzIsIFR5KTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTFQ6ICAgcmV0dXJuIGV4ZWN1dGVJQ01QX1NMVChTcmMxLCBTcmMyLCBUeSk7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOiAgIHJldHVybiBleGVjdXRlSUNNUF9VR0UoU3JjMSwgU3JjMiwgVHkpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRTogICByZXR1cm4gZXhlY3V0ZUlDTVBfU0dFKFNyYzEsIFNyYzIsIFR5KTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTEU6ICAgcmV0dXJuIGV4ZWN1dGVJQ01QX1VMRShTcmMxLCBTcmMyLCBUeSk7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xFOiAgIHJldHVybiBleGVjdXRlSUNNUF9TTEUoU3JjMSwgU3JjMiwgVHkpOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09SRDogICByZXR1cm4gZXhlY3V0ZUZDTVBfT1JEKFNyYzEsIFNyYzIsIFR5KTsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTk86ICAgcmV0dXJuIGV4ZWN1dGVGQ01QX1VOTyhTcmMxLCBTcmMyLCBUeSk7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0VROiAgIHJldHVybiBleGVjdXRlRkNNUF9PRVEoU3JjMSwgU3JjMiwgVHkpOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VFUTogICByZXR1cm4gZXhlY3V0ZUZDTVBfVUVRKFNyYzEsIFNyYzIsIFR5KTsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTkU6ICAgcmV0dXJuIGV4ZWN1dGVGQ01QX09ORShTcmMxLCBTcmMyLCBUeSk7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5FOiAgIHJldHVybiBleGVjdXRlRkNNUF9VTkUoU3JjMSwgU3JjMiwgVHkpOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MVDogICByZXR1cm4gZXhlY3V0ZUZDTVBfT0xUKFNyYzEsIFNyYzIsIFR5KTsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTFQ6ICAgcmV0dXJuIGV4ZWN1dGVGQ01QX1VMVChTcmMxLCBTcmMyLCBUeSk7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0dUOiAgIHJldHVybiBleGVjdXRlRkNNUF9PR1QoU3JjMSwgU3JjMiwgVHkpOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHVDogICByZXR1cm4gZXhlY3V0ZUZDTVBfVUdUKFNyYzEsIFNyYzIsIFR5KTsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTEU6ICAgcmV0dXJuIGV4ZWN1dGVGQ01QX09MRShTcmMxLCBTcmMyLCBUeSk7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxFOiAgIHJldHVybiBleGVjdXRlRkNNUF9VTEUoU3JjMSwgU3JjMiwgVHkpOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRTogICByZXR1cm4gZXhlY3V0ZUZDTVBfT0dFKFNyYzEsIFNyYzIsIFR5KTsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VR0U6ICAgcmV0dXJuIGV4ZWN1dGVGQ01QX1VHRShTcmMxLCBTcmMyLCBUeSk7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfRkFMU0U6IHsgCisgICAgR2VuZXJpY1ZhbHVlIFJlc3VsdDsKKyAgICBSZXN1bHQuSW50VmFsID0gQVBJbnQoMSwgZmFsc2UpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9UUlVFOiB7CisgICAgR2VuZXJpY1ZhbHVlIFJlc3VsdDsKKyAgICBSZXN1bHQuSW50VmFsID0gQVBJbnQoMSwgdHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIENtcCBwcmVkaWNhdGVcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdEJpbmFyeU9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIGNvbnN0IFR5cGUgKlR5ICAgID0gSS5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgIEdlbmVyaWNWYWx1ZSBTcmMxID0gZ2V0T3BlcmFuZFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSwgU0YpOworICBHZW5lcmljVmFsdWUgU3JjMiA9IGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoMSksIFNGKTsKKyAgR2VuZXJpY1ZhbHVlIFI7ICAgLy8gUmVzdWx0CisKKyAgc3dpdGNoIChJLmdldE9wY29kZSgpKSB7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDogICBSLkludFZhbCA9IFNyYzEuSW50VmFsICsgU3JjMi5JbnRWYWw7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTdWI6ICAgUi5JbnRWYWwgPSBTcmMxLkludFZhbCAtIFNyYzIuSW50VmFsOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOiAgIFIuSW50VmFsID0gU3JjMS5JbnRWYWwgKiBTcmMyLkludFZhbDsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6ICBleGVjdXRlRkFkZEluc3QoUiwgU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlN1YjogIGV4ZWN1dGVGU3ViSW5zdChSLCBTcmMxLCBTcmMyLCBUeSk7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpGTXVsOiAgZXhlY3V0ZUZNdWxJbnN0KFIsIFNyYzEsIFNyYzIsIFR5KTsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZEaXY6ICBleGVjdXRlRkRpdkluc3QoUiwgU3JjMSwgU3JjMiwgVHkpOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlJlbTogIGV4ZWN1dGVGUmVtSW5zdChSLCBTcmMxLCBTcmMyLCBUeSk7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OiAgUi5JbnRWYWwgPSBTcmMxLkludFZhbC51ZGl2KFNyYzIuSW50VmFsKTsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNEaXY6ICBSLkludFZhbCA9IFNyYzEuSW50VmFsLnNkaXYoU3JjMi5JbnRWYWwpOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbTogIFIuSW50VmFsID0gU3JjMS5JbnRWYWwudXJlbShTcmMyLkludFZhbCk7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOiAgUi5JbnRWYWwgPSBTcmMxLkludFZhbC5zcmVtKFNyYzIuSW50VmFsKTsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDogICBSLkludFZhbCA9IFNyYzEuSW50VmFsICYgU3JjMi5JbnRWYWw7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpPcjogICAgUi5JbnRWYWwgPSBTcmMxLkludFZhbCB8IFNyYzIuSW50VmFsOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOiAgIFIuSW50VmFsID0gU3JjMS5JbnRWYWwgXiBTcmMyLkludFZhbDsgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZGJncygpIDw8ICJEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcyBiaW5hcnkgb3BlcmF0b3IhXG4tLT4iIDw8IEk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorCisgIFNldFZhbHVlKCZJLCBSLCBTRik7Cit9CisKK3N0YXRpYyBHZW5lcmljVmFsdWUgZXhlY3V0ZVNlbGVjdEluc3QoR2VuZXJpY1ZhbHVlIFNyYzEsIEdlbmVyaWNWYWx1ZSBTcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVmFsdWUgU3JjMykgeworICByZXR1cm4gU3JjMS5JbnRWYWwgPT0gMCA/IFNyYzMgOiBTcmMyOworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdFNlbGVjdEluc3QoU2VsZWN0SW5zdCAmSSkgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworICBHZW5lcmljVmFsdWUgU3JjMSA9IGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoMCksIFNGKTsKKyAgR2VuZXJpY1ZhbHVlIFNyYzIgPSBnZXRPcGVyYW5kVmFsdWUoSS5nZXRPcGVyYW5kKDEpLCBTRik7CisgIEdlbmVyaWNWYWx1ZSBTcmMzID0gZ2V0T3BlcmFuZFZhbHVlKEkuZ2V0T3BlcmFuZCgyKSwgU0YpOworICBHZW5lcmljVmFsdWUgUiA9IGV4ZWN1dGVTZWxlY3RJbnN0KFNyYzEsIFNyYzIsIFNyYzMpOworICBTZXRWYWx1ZSgmSSwgUiwgU0YpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRlcm1pbmF0b3IgSW5zdHJ1Y3Rpb24gSW1wbGVtZW50YXRpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIEludGVycHJldGVyOjpleGl0Q2FsbGVkKEdlbmVyaWNWYWx1ZSBHVikgeworICAvLyBydW5BdEV4aXRIYW5kbGVycygpIGFzc3VtZXMgdGhlcmUgYXJlIG5vIHN0YWNrIGZyYW1lcywgYnV0CisgIC8vIGlmIGV4aXQoKSB3YXMgY2FsbGVkLCB0aGVuIGl0IGhhZCBhIHN0YWNrIGZyYW1lLiBCbG93IGF3YXkKKyAgLy8gdGhlIHN0YWNrIGJlZm9yZSBpbnRlcnByZXRpbmcgYXRleGl0IGhhbmRsZXJzLgorICBFQ1N0YWNrLmNsZWFyKCk7CisgIHJ1bkF0RXhpdEhhbmRsZXJzKCk7CisgIGV4aXQoR1YuSW50VmFsLnpleHRPclRydW5jKDMyKS5nZXRaRXh0VmFsdWUoKSk7Cit9CisKKy8vLyBQb3AgdGhlIGxhc3Qgc3RhY2sgZnJhbWUgb2ZmIG9mIEVDU3RhY2sgYW5kIHRoZW4gY29weSB0aGUgcmVzdWx0CisvLy8gYmFjayBpbnRvIHRoZSByZXN1bHQgdmFyaWFibGUgaWYgd2UgYXJlIG5vdCByZXR1cm5pbmcgdm9pZC4gVGhlCisvLy8gcmVzdWx0IHZhcmlhYmxlIG1heSBiZSB0aGUgRXhpdFZhbHVlLCBvciB0aGUgVmFsdWUgb2YgdGhlIGNhbGxpbmcKKy8vLyBDYWxsSW5zdCBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBzdGFjayBmcmFtZS4gVGhpcyBtZXRob2QgbWF5CisvLy8gaW52YWxpZGF0ZSBhbnkgRUNTdGFjayBpdGVyYXRvcnMgeW91IGhhdmUuIFRoaXMgbWV0aG9kIGFsc28gdGFrZXMKKy8vLyBjYXJlIG9mIHN3aXRjaGluZyB0byB0aGUgbm9ybWFsIGRlc3RpbmF0aW9uIEJCLCBpZiB3ZSBhcmUgcmV0dXJuaW5nCisvLy8gZnJvbSBhbiBpbnZva2UuCisvLy8KK3ZvaWQgSW50ZXJwcmV0ZXI6OnBvcFN0YWNrQW5kUmV0dXJuVmFsdWVUb0NhbGxlcihjb25zdCBUeXBlICpSZXRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVmFsdWUgUmVzdWx0KSB7CisgIC8vIFBvcCB0aGUgY3VycmVudCBzdGFjayBmcmFtZS4KKyAgRUNTdGFjay5wb3BfYmFjaygpOworCisgIGlmIChFQ1N0YWNrLmVtcHR5KCkpIHsgIC8vIEZpbmlzaGVkIG1haW4uICBQdXQgcmVzdWx0IGludG8gZXhpdCBjb2RlLi4uCisgICAgaWYgKFJldFR5ICYmICFSZXRUeS0+aXNWb2lkVHkoKSkgeyAgICAgICAgICAvLyBOb252b2lkIHJldHVybiB0eXBlPworICAgICAgRXhpdFZhbHVlID0gUmVzdWx0OyAgIC8vIENhcHR1cmUgdGhlIGV4aXQgdmFsdWUgb2YgdGhlIHByb2dyYW0KKyAgICB9IGVsc2UgeworICAgICAgbWVtc2V0KCZFeGl0VmFsdWUuVW50eXBlZCwgMCwgc2l6ZW9mKEV4aXRWYWx1ZS5VbnR5cGVkKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIElmIHdlIGhhdmUgYSBwcmV2aW91cyBzdGFjayBmcmFtZSwgYW5kIHdlIGhhdmUgYSBwcmV2aW91cyBjYWxsLAorICAgIC8vIGZpbGwgaW4gdGhlIHJldHVybiB2YWx1ZS4uLgorICAgIEV4ZWN1dGlvbkNvbnRleHQgJkNhbGxpbmdTRiA9IEVDU3RhY2suYmFjaygpOworICAgIGlmIChJbnN0cnVjdGlvbiAqSSA9IENhbGxpbmdTRi5DYWxsZXIuZ2V0SW5zdHJ1Y3Rpb24oKSkgeworICAgICAgLy8gU2F2ZSByZXN1bHQuLi4KKyAgICAgIGlmICghQ2FsbGluZ1NGLkNhbGxlci5nZXRUeXBlKCktPmlzVm9pZFR5KCkpCisgICAgICAgIFNldFZhbHVlKEksIFJlc3VsdCwgQ2FsbGluZ1NGKTsKKyAgICAgIGlmIChJbnZva2VJbnN0ICpJSSA9IGR5bl9jYXN0PEludm9rZUluc3Q+IChJKSkKKyAgICAgICAgU3dpdGNoVG9OZXdCYXNpY0Jsb2NrIChJSS0+Z2V0Tm9ybWFsRGVzdCAoKSwgQ2FsbGluZ1NGKTsKKyAgICAgIENhbGxpbmdTRi5DYWxsZXIgPSBDYWxsU2l0ZSgpOyAgICAgICAgICAvLyBXZSByZXR1cm5lZCBmcm9tIHRoZSBjYWxsLi4uCisgICAgfQorICB9Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0UmV0dXJuSW5zdChSZXR1cm5JbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIGNvbnN0IFR5cGUgKlJldFR5ID0gVHlwZTo6Z2V0Vm9pZFR5KEkuZ2V0Q29udGV4dCgpKTsKKyAgR2VuZXJpY1ZhbHVlIFJlc3VsdDsKKworICAvLyBTYXZlIGF3YXkgdGhlIHJldHVybiB2YWx1ZS4uLiAoaWYgd2UgYXJlIG5vdCAncmV0IHZvaWQnKQorICBpZiAoSS5nZXROdW1PcGVyYW5kcygpKSB7CisgICAgUmV0VHkgID0gSS5nZXRSZXR1cm5WYWx1ZSgpLT5nZXRUeXBlKCk7CisgICAgUmVzdWx0ID0gZ2V0T3BlcmFuZFZhbHVlKEkuZ2V0UmV0dXJuVmFsdWUoKSwgU0YpOworICB9CisKKyAgcG9wU3RhY2tBbmRSZXR1cm5WYWx1ZVRvQ2FsbGVyKFJldFR5LCBSZXN1bHQpOworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdFVud2luZEluc3QoVW53aW5kSW5zdCAmSSkgeworICAvLyBVbndpbmQgc3RhY2sKKyAgSW5zdHJ1Y3Rpb24gKkluc3Q7CisgIGRvIHsKKyAgICBFQ1N0YWNrLnBvcF9iYWNrKCk7CisgICAgaWYgKEVDU3RhY2suZW1wdHkoKSkKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiRW1wdHkgc3RhY2sgZHVyaW5nIHVud2luZCEiKTsKKyAgICBJbnN0ID0gRUNTdGFjay5iYWNrKCkuQ2FsbGVyLmdldEluc3RydWN0aW9uKCk7CisgIH0gd2hpbGUgKCEoSW5zdCAmJiBpc2E8SW52b2tlSW5zdD4oSW5zdCkpKTsKKworICAvLyBSZXR1cm4gZnJvbSBpbnZva2UKKyAgRXhlY3V0aW9uQ29udGV4dCAmSW52b2tpbmdTRiA9IEVDU3RhY2suYmFjaygpOworICBJbnZva2luZ1NGLkNhbGxlciA9IENhbGxTaXRlKCk7CisKKyAgLy8gR28gdG8gZXhjZXB0aW9uYWwgZGVzdGluYXRpb24gQkIgb2YgaW52b2tlIGluc3RydWN0aW9uCisgIFN3aXRjaFRvTmV3QmFzaWNCbG9jayhjYXN0PEludm9rZUluc3Q+KEluc3QpLT5nZXRVbndpbmREZXN0KCksIEludm9raW5nU0YpOworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdFVucmVhY2hhYmxlSW5zdChVbnJlYWNoYWJsZUluc3QgJkkpIHsKKyAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJQcm9ncmFtIGV4ZWN1dGVkIGFuICd1bnJlYWNoYWJsZScgaW5zdHJ1Y3Rpb24hIik7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0QnJhbmNoSW5zdChCcmFuY2hJbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIEJhc2ljQmxvY2sgKkRlc3Q7CisKKyAgRGVzdCA9IEkuZ2V0U3VjY2Vzc29yKDApOyAgICAgICAgICAvLyBVbmNvbmQgYnJhbmNoZXMgaGF2ZSBhIGZpeGVkIGRlc3QuLi4KKyAgaWYgKCFJLmlzVW5jb25kaXRpb25hbCgpKSB7CisgICAgVmFsdWUgKkNvbmQgPSBJLmdldENvbmRpdGlvbigpOworICAgIGlmIChnZXRPcGVyYW5kVmFsdWUoQ29uZCwgU0YpLkludFZhbCA9PSAwKSAvLyBJZiBmYWxzZSBjb25kLi4uCisgICAgICBEZXN0ID0gSS5nZXRTdWNjZXNzb3IoMSk7CisgIH0KKyAgU3dpdGNoVG9OZXdCYXNpY0Jsb2NrKERlc3QsIFNGKTsKK30KKwordm9pZCBJbnRlcnByZXRlcjo6dmlzaXRTd2l0Y2hJbnN0KFN3aXRjaEluc3QgJkkpIHsKKyAgRXhlY3V0aW9uQ29udGV4dCAmU0YgPSBFQ1N0YWNrLmJhY2soKTsKKyAgR2VuZXJpY1ZhbHVlIENvbmRWYWwgPSBnZXRPcGVyYW5kVmFsdWUoSS5nZXRPcGVyYW5kKDApLCBTRik7CisgIGNvbnN0IFR5cGUgKkVsVHkgPSBJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZSBjYXNlcyBtYXRjaC4uLgorICBCYXNpY0Jsb2NrICpEZXN0ID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMiwgZSA9IEkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyBpICs9IDIpCisgICAgaWYgKGV4ZWN1dGVJQ01QX0VRKENvbmRWYWwsIGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoaSksIFNGKSwgRWxUeSkKKyAgICAgICAgLkludFZhbCAhPSAwKSB7CisgICAgICBEZXN0ID0gY2FzdDxCYXNpY0Jsb2NrPihJLmdldE9wZXJhbmQoaSsxKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKCFEZXN0KSBEZXN0ID0gSS5nZXREZWZhdWx0RGVzdCgpOyAgIC8vIE5vIGNhc2VzIG1hdGNoZWQ6IHVzZSBkZWZhdWx0CisgIFN3aXRjaFRvTmV3QmFzaWNCbG9jayhEZXN0LCBTRik7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0SW5kaXJlY3RCckluc3QoSW5kaXJlY3RCckluc3QgJkkpIHsKKyAgRXhlY3V0aW9uQ29udGV4dCAmU0YgPSBFQ1N0YWNrLmJhY2soKTsKKyAgdm9pZCAqRGVzdCA9IEdWVE9QKGdldE9wZXJhbmRWYWx1ZShJLmdldEFkZHJlc3MoKSwgU0YpKTsKKyAgU3dpdGNoVG9OZXdCYXNpY0Jsb2NrKChCYXNpY0Jsb2NrKilEZXN0LCBTRik7Cit9CisKKworLy8gU3dpdGNoVG9OZXdCYXNpY0Jsb2NrIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBqdW1wIHRvIGEgbmV3IGJhc2ljIGJsb2NrLgorLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBhY3R1YWwgdXBkYXRpbmcgb2YgYmxvY2sgYW5kIGluc3RydWN0aW9uIGl0ZXJhdG9ycworLy8gYXMgd2VsbCBhcyBleGVjdXRpb24gb2YgYWxsIG9mIHRoZSBQSEkgbm9kZXMgaW4gdGhlIGRlc3RpbmF0aW9uIGJsb2NrLgorLy8KKy8vIFRoaXMgbWV0aG9kIGRvZXMgdGhpcyBiZWNhdXNlIGFsbCBvZiB0aGUgUEhJIG5vZGVzIG11c3QgYmUgZXhlY3V0ZWQKKy8vIGF0b21pY2FsbHksIHJlYWRpbmcgdGhlaXIgaW5wdXRzIGJlZm9yZSBhbnkgb2YgdGhlIHJlc3VsdHMgYXJlIHVwZGF0ZWQuICBOb3QKKy8vIGRvaW5nIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGlmIHRoZSBQSEkgbm9kZXMgZGVwZW5kIG9uIG90aGVyIFBISSBub2RlcyBmb3IKKy8vIHRoZWlyIGlucHV0cy4gIElmIHRoZSBpbnB1dCBQSEkgbm9kZSBpcyB1cGRhdGVkIGJlZm9yZSBpdCBpcyByZWFkLCBpbmNvcnJlY3QKKy8vIHJlc3VsdHMgY2FuIGhhcHBlbi4gIFRodXMgd2UgdXNlIGEgdHdvIHBoYXNlIGFwcHJvYWNoLgorLy8KK3ZvaWQgSW50ZXJwcmV0ZXI6OlN3aXRjaFRvTmV3QmFzaWNCbG9jayhCYXNpY0Jsb2NrICpEZXN0LCBFeGVjdXRpb25Db250ZXh0ICZTRil7CisgIEJhc2ljQmxvY2sgKlByZXZCQiA9IFNGLkN1ckJCOyAgICAgIC8vIFJlbWVtYmVyIHdoZXJlIHdlIGNhbWUgZnJvbS4uLgorICBTRi5DdXJCQiAgID0gRGVzdDsgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgQ3VyQkIgdG8gYnJhbmNoIGRlc3RpbmF0aW9uCisgIFNGLkN1ckluc3QgPSBTRi5DdXJCQi0+YmVnaW4oKTsgICAgIC8vIFVwZGF0ZSBuZXcgaW5zdHJ1Y3Rpb24gcHRyLi4uCisKKyAgaWYgKCFpc2E8UEhJTm9kZT4oU0YuQ3VySW5zdCkpIHJldHVybjsgIC8vIE5vdGhpbmcgZmFuY3kgdG8gZG8KKworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBQSEkgbm9kZXMgaW4gdGhlIGN1cnJlbnQgYmxvY2ssIHJlYWRpbmcgdGhlaXIgaW5wdXRzLgorICBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+IFJlc3VsdFZhbHVlczsKKworICBmb3IgKDsgUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihTRi5DdXJJbnN0KTsgKytTRi5DdXJJbnN0KSB7CisgICAgLy8gU2VhcmNoIGZvciB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGlzIHByZXZpb3VzIGJiLi4uCisgICAgaW50IGkgPSBQTi0+Z2V0QmFzaWNCbG9ja0luZGV4KFByZXZCQik7CisgICAgYXNzZXJ0KGkgIT0gLTEgJiYgIlBISU5vZGUgZG9lc24ndCBjb250YWluIGVudHJ5IGZvciBwcmVkZWNlc3Nvcj8/Iik7CisgICAgVmFsdWUgKkluY29taW5nVmFsdWUgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKTsKKworICAgIC8vIFNhdmUgdGhlIGluY29taW5nIHZhbHVlIGZvciB0aGlzIFBISSBub2RlLi4uCisgICAgUmVzdWx0VmFsdWVzLnB1c2hfYmFjayhnZXRPcGVyYW5kVmFsdWUoSW5jb21pbmdWYWx1ZSwgU0YpKTsKKyAgfQorCisgIC8vIE5vdyBsb29wIG92ZXIgYWxsIG9mIHRoZSBQSEkgbm9kZXMgc2V0dGluZyB0aGVpciB2YWx1ZXMuLi4KKyAgU0YuQ3VySW5zdCA9IFNGLkN1ckJCLT5iZWdpbigpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpc2E8UEhJTm9kZT4oU0YuQ3VySW5zdCk7ICsrU0YuQ3VySW5zdCwgKytpKSB7CisgICAgUEhJTm9kZSAqUE4gPSBjYXN0PFBISU5vZGU+KFNGLkN1ckluc3QpOworICAgIFNldFZhbHVlKFBOLCBSZXN1bHRWYWx1ZXNbaV0sIFNGKTsKKyAgfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICBNZW1vcnkgSW5zdHJ1Y3Rpb24gSW1wbGVtZW50YXRpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIEludGVycHJldGVyOjp2aXNpdEFsbG9jYUluc3QoQWxsb2NhSW5zdCAmSSkgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworCisgIGNvbnN0IFR5cGUgKlR5ID0gSS5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCk7ICAvLyBUeXBlIHRvIGJlIGFsbG9jYXRlZAorCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGJlaW5nIGFsbG9jYXRlZCBieSB0aGUgYXJyYXkuLi4KKyAgdW5zaWduZWQgTnVtRWxlbWVudHMgPSAKKyAgICBnZXRPcGVyYW5kVmFsdWUoSS5nZXRPcGVyYW5kKDApLCBTRikuSW50VmFsLmdldFpFeHRWYWx1ZSgpOworCisgIHVuc2lnbmVkIFR5cGVTaXplID0gKHNpemVfdClURC5nZXRUeXBlQWxsb2NTaXplKFR5KTsKKworICAvLyBBdm9pZCBtYWxsb2MtaW5nIHplcm8gYnl0ZXMsIHVzZSBtYXgoKS4uLgorICB1bnNpZ25lZCBNZW1Ub0FsbG9jID0gc3RkOjptYXgoMVUsIE51bUVsZW1lbnRzICogVHlwZVNpemUpOworCisgIC8vIEFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgdHlwZS4uLgorICB2b2lkICpNZW1vcnkgPSBtYWxsb2MoTWVtVG9BbGxvYyk7CisKKyAgREVCVUcoZGJncygpIDw8ICJBbGxvY2F0ZWQgVHlwZTogIiA8PCAqVHkgPDwgIiAoIiA8PCBUeXBlU2l6ZSA8PCAiIGJ5dGVzKSB4ICIgCisgICAgICAgICAgICAgICA8PCBOdW1FbGVtZW50cyA8PCAiIChUb3RhbDogIiA8PCBNZW1Ub0FsbG9jIDw8ICIpIGF0ICIKKyAgICAgICAgICAgICAgIDw8IHVpbnRwdHJfdChNZW1vcnkpIDw8ICdcbicpOworCisgIEdlbmVyaWNWYWx1ZSBSZXN1bHQgPSBQVE9HVihNZW1vcnkpOworICBhc3NlcnQoUmVzdWx0LlBvaW50ZXJWYWwgIT0gMCAmJiAiTnVsbCBwb2ludGVyIHJldHVybmVkIGJ5IG1hbGxvYyEiKTsKKyAgU2V0VmFsdWUoJkksIFJlc3VsdCwgU0YpOworCisgIGlmIChJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBbGxvY2EpCisgICAgRUNTdGFjay5iYWNrKCkuQWxsb2Nhcy5hZGQoTWVtb3J5KTsKK30KKworLy8gZ2V0RWxlbWVudE9mZnNldCAtIFRoZSB3b3JraG9yc2UgZm9yIGdldGVsZW1lbnRwdHIuCisvLworR2VuZXJpY1ZhbHVlIEludGVycHJldGVyOjpleGVjdXRlR0VQT3BlcmF0aW9uKFZhbHVlICpQdHIsIGdlcF90eXBlX2l0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VwX3R5cGVfaXRlcmF0b3IgRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRpb25Db250ZXh0ICZTRikgeworICBhc3NlcnQoUHRyLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkgJiYKKyAgICAgICAgICJDYW5ub3QgZ2V0RWxlbWVudE9mZnNldCBvZiBhIG5vbnBvaW50ZXIgdHlwZSEiKTsKKworICB1aW50NjRfdCBUb3RhbCA9IDA7CisKKyAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KCpJKSkgeworICAgICAgY29uc3QgU3RydWN0TGF5b3V0ICpTTE8gPSBURC5nZXRTdHJ1Y3RMYXlvdXQoU1R5KTsKKworICAgICAgY29uc3QgQ29uc3RhbnRJbnQgKkNQVSA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEkuZ2V0T3BlcmFuZCgpKTsKKyAgICAgIHVuc2lnbmVkIEluZGV4ID0gdW5zaWduZWQoQ1BVLT5nZXRaRXh0VmFsdWUoKSk7CisKKyAgICAgIFRvdGFsICs9IFNMTy0+Z2V0RWxlbWVudE9mZnNldChJbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IFNlcXVlbnRpYWxUeXBlICpTVCA9IGNhc3Q8U2VxdWVudGlhbFR5cGU+KCpJKTsKKyAgICAgIC8vIEdldCB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgYXJyYXkuLi4gd2hpY2ggbXVzdCBiZSBsb25nIHR5cGUuLi4KKyAgICAgIEdlbmVyaWNWYWx1ZSBJZHhHViA9IGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoKSwgU0YpOworCisgICAgICBpbnQ2NF90IElkeDsKKyAgICAgIHVuc2lnbmVkIEJpdFdpZHRoID0gCisgICAgICAgIGNhc3Q8SW50ZWdlclR5cGU+KEkuZ2V0T3BlcmFuZCgpLT5nZXRUeXBlKCkpLT5nZXRCaXRXaWR0aCgpOworICAgICAgaWYgKEJpdFdpZHRoID09IDMyKQorICAgICAgICBJZHggPSAoaW50NjRfdCkoaW50MzJfdClJZHhHVi5JbnRWYWwuZ2V0WkV4dFZhbHVlKCk7CisgICAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KEJpdFdpZHRoID09IDY0ICYmICJJbnZhbGlkIGluZGV4IHR5cGUgZm9yIGdldGVsZW1lbnRwdHIiKTsKKyAgICAgICAgSWR4ID0gKGludDY0X3QpSWR4R1YuSW50VmFsLmdldFpFeHRWYWx1ZSgpOworICAgICAgfQorICAgICAgVG90YWwgKz0gVEQuZ2V0VHlwZUFsbG9jU2l6ZShTVC0+Z2V0RWxlbWVudFR5cGUoKSkqSWR4OworICAgIH0KKyAgfQorCisgIEdlbmVyaWNWYWx1ZSBSZXN1bHQ7CisgIFJlc3VsdC5Qb2ludGVyVmFsID0gKChjaGFyKilnZXRPcGVyYW5kVmFsdWUoUHRyLCBTRikuUG9pbnRlclZhbCkgKyBUb3RhbDsKKyAgREVCVUcoZGJncygpIDw8ICJHRVAgSW5kZXggIiA8PCBUb3RhbCA8PCAiIGJ5dGVzLlxuIik7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0R2V0RWxlbWVudFB0ckluc3QoR2V0RWxlbWVudFB0ckluc3QgJkkpIHsKKyAgRXhlY3V0aW9uQ29udGV4dCAmU0YgPSBFQ1N0YWNrLmJhY2soKTsKKyAgU2V0VmFsdWUoJkksIGV4ZWN1dGVHRVBPcGVyYXRpb24oSS5nZXRQb2ludGVyT3BlcmFuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXBfdHlwZV9iZWdpbihJKSwgZ2VwX3R5cGVfZW5kKEkpLCBTRiksIFNGKTsKK30KKwordm9pZCBJbnRlcnByZXRlcjo6dmlzaXRMb2FkSW5zdChMb2FkSW5zdCAmSSkgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworICBHZW5lcmljVmFsdWUgU1JDID0gZ2V0T3BlcmFuZFZhbHVlKEkuZ2V0UG9pbnRlck9wZXJhbmQoKSwgU0YpOworICBHZW5lcmljVmFsdWUgKlB0ciA9IChHZW5lcmljVmFsdWUqKUdWVE9QKFNSQyk7CisgIEdlbmVyaWNWYWx1ZSBSZXN1bHQ7CisgIExvYWRWYWx1ZUZyb21NZW1vcnkoUmVzdWx0LCBQdHIsIEkuZ2V0VHlwZSgpKTsKKyAgU2V0VmFsdWUoJkksIFJlc3VsdCwgU0YpOworICBpZiAoSS5pc1ZvbGF0aWxlKCkgJiYgUHJpbnRWb2xhdGlsZSkKKyAgICBkYmdzKCkgPDwgIlZvbGF0aWxlIGxvYWQgIiA8PCBJOworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdFN0b3JlSW5zdChTdG9yZUluc3QgJkkpIHsKKyAgRXhlY3V0aW9uQ29udGV4dCAmU0YgPSBFQ1N0YWNrLmJhY2soKTsKKyAgR2VuZXJpY1ZhbHVlIFZhbCA9IGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoMCksIFNGKTsKKyAgR2VuZXJpY1ZhbHVlIFNSQyA9IGdldE9wZXJhbmRWYWx1ZShJLmdldFBvaW50ZXJPcGVyYW5kKCksIFNGKTsKKyAgU3RvcmVWYWx1ZVRvTWVtb3J5KFZhbCwgKEdlbmVyaWNWYWx1ZSAqKUdWVE9QKFNSQyksCisgICAgICAgICAgICAgICAgICAgICBJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSk7CisgIGlmIChJLmlzVm9sYXRpbGUoKSAmJiBQcmludFZvbGF0aWxlKQorICAgIGRiZ3MoKSA8PCAiVm9sYXRpbGUgc3RvcmU6ICIgPDwgSTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICBNaXNjZWxsYW5lb3VzIEluc3RydWN0aW9uIEltcGxlbWVudGF0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBJbnRlcnByZXRlcjo6dmlzaXRDYWxsU2l0ZShDYWxsU2l0ZSBDUykgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGludHJpbnNpYyBmdW5jdGlvbiBjYWxsLi4uCisgIEZ1bmN0aW9uICpGID0gQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKTsKKyAgaWYgKEYgJiYgRi0+aXNEZWNsYXJhdGlvbigpKQorICAgIHN3aXRjaCAoRi0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgIGNhc2UgSW50cmluc2ljOjpub3RfaW50cmluc2ljOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OnZhc3RhcnQ6IHsgLy8gdmFfc3RhcnQKKyAgICAgIEdlbmVyaWNWYWx1ZSBBcmdJbmRleDsKKyAgICAgIEFyZ0luZGV4LlVJbnRQYWlyVmFsLmZpcnN0ID0gRUNTdGFjay5zaXplKCkgLSAxOworICAgICAgQXJnSW5kZXguVUludFBhaXJWYWwuc2Vjb25kID0gMDsKKyAgICAgIFNldFZhbHVlKENTLmdldEluc3RydWN0aW9uKCksIEFyZ0luZGV4LCBTRik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgSW50cmluc2ljOjp2YWVuZDogICAgLy8gdmFfZW5kIGlzIGEgbm9vcCBmb3IgdGhlIGludGVycHJldGVyCisgICAgICByZXR1cm47CisgICAgY2FzZSBJbnRyaW5zaWM6OnZhY29weTogICAvLyB2YV9jb3B5OiBkZXN0ID0gc3JjCisgICAgICBTZXRWYWx1ZShDUy5nZXRJbnN0cnVjdGlvbigpLCBnZXRPcGVyYW5kVmFsdWUoKkNTLmFyZ19iZWdpbigpLCBTRiksIFNGKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gSWYgaXQgaXMgYW4gdW5rbm93biBpbnRyaW5zaWMgZnVuY3Rpb24sIHVzZSB0aGUgaW50cmluc2ljIGxvd2VyaW5nCisgICAgICAvLyBjbGFzcyB0byB0cmFuc2Zvcm0gaXQgaW50byBob3BlZnVsbHkgdGFzdHkgTExWTSBjb2RlLgorICAgICAgLy8KKyAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIG1lKENTLmdldEluc3RydWN0aW9uKCkpOworICAgICAgQmFzaWNCbG9jayAqUGFyZW50ID0gQ1MuZ2V0SW5zdHJ1Y3Rpb24oKS0+Z2V0UGFyZW50KCk7CisgICAgICBib29sIGF0QmVnaW4oUGFyZW50LT5iZWdpbigpID09IG1lKTsKKyAgICAgIGlmICghYXRCZWdpbikKKyAgICAgICAgLS1tZTsKKyAgICAgIElMLT5Mb3dlckludHJpbnNpY0NhbGwoY2FzdDxDYWxsSW5zdD4oQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSkpOworCisgICAgICAvLyBSZXN0b3JlIHRoZSBDdXJJbnN0IHBvaW50ZXIgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIG5ld2x5IGluc2VydGVkLCBpZgorICAgICAgLy8gYW55LgorICAgICAgaWYgKGF0QmVnaW4pIHsKKyAgICAgICAgU0YuQ3VySW5zdCA9IFBhcmVudC0+YmVnaW4oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNGLkN1ckluc3QgPSBtZTsKKyAgICAgICAgKytTRi5DdXJJbnN0OworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKworCisgIFNGLkNhbGxlciA9IENTOworICBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+IEFyZ1ZhbHM7CisgIGNvbnN0IHVuc2lnbmVkIE51bUFyZ3MgPSBTRi5DYWxsZXIuYXJnX3NpemUoKTsKKyAgQXJnVmFscy5yZXNlcnZlKE51bUFyZ3MpOworICB1aW50MTZfdCBwTnVtID0gMTsKKyAgZm9yIChDYWxsU2l0ZTo6YXJnX2l0ZXJhdG9yIGkgPSBTRi5DYWxsZXIuYXJnX2JlZ2luKCksCisgICAgICAgICBlID0gU0YuQ2FsbGVyLmFyZ19lbmQoKTsgaSAhPSBlOyArK2ksICsrcE51bSkgeworICAgIFZhbHVlICpWID0gKmk7CisgICAgQXJnVmFscy5wdXNoX2JhY2soZ2V0T3BlcmFuZFZhbHVlKFYsIFNGKSk7CisgIH0KKworICAvLyBUbyBoYW5kbGUgaW5kaXJlY3QgY2FsbHMsIHdlIG11c3QgZ2V0IHRoZSBwb2ludGVyIHZhbHVlIGZyb20gdGhlIGFyZ3VtZW50CisgIC8vIGFuZCB0cmVhdCBpdCBhcyBhIGZ1bmN0aW9uIHBvaW50ZXIuCisgIEdlbmVyaWNWYWx1ZSBTUkMgPSBnZXRPcGVyYW5kVmFsdWUoU0YuQ2FsbGVyLmdldENhbGxlZFZhbHVlKCksIFNGKTsKKyAgY2FsbEZ1bmN0aW9uKChGdW5jdGlvbiopR1ZUT1AoU1JDKSwgQXJnVmFscyk7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0U2hsKEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIEdlbmVyaWNWYWx1ZSBTcmMxID0gZ2V0T3BlcmFuZFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSwgU0YpOworICBHZW5lcmljVmFsdWUgU3JjMiA9IGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoMSksIFNGKTsKKyAgR2VuZXJpY1ZhbHVlIERlc3Q7CisgIGlmIChTcmMyLkludFZhbC5nZXRaRXh0VmFsdWUoKSA8IFNyYzEuSW50VmFsLmdldEJpdFdpZHRoKCkpCisgICAgRGVzdC5JbnRWYWwgPSBTcmMxLkludFZhbC5zaGwoU3JjMi5JbnRWYWwuZ2V0WkV4dFZhbHVlKCkpOworICBlbHNlCisgICAgRGVzdC5JbnRWYWwgPSBTcmMxLkludFZhbDsKKyAgCisgIFNldFZhbHVlKCZJLCBEZXN0LCBTRik7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0TFNocihCaW5hcnlPcGVyYXRvciAmSSkgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworICBHZW5lcmljVmFsdWUgU3JjMSA9IGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoMCksIFNGKTsKKyAgR2VuZXJpY1ZhbHVlIFNyYzIgPSBnZXRPcGVyYW5kVmFsdWUoSS5nZXRPcGVyYW5kKDEpLCBTRik7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBpZiAoU3JjMi5JbnRWYWwuZ2V0WkV4dFZhbHVlKCkgPCBTcmMxLkludFZhbC5nZXRCaXRXaWR0aCgpKQorICAgIERlc3QuSW50VmFsID0gU3JjMS5JbnRWYWwubHNocihTcmMyLkludFZhbC5nZXRaRXh0VmFsdWUoKSk7CisgIGVsc2UKKyAgICBEZXN0LkludFZhbCA9IFNyYzEuSW50VmFsOworICAKKyAgU2V0VmFsdWUoJkksIERlc3QsIFNGKTsKK30KKwordm9pZCBJbnRlcnByZXRlcjo6dmlzaXRBU2hyKEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIEdlbmVyaWNWYWx1ZSBTcmMxID0gZ2V0T3BlcmFuZFZhbHVlKEkuZ2V0T3BlcmFuZCgwKSwgU0YpOworICBHZW5lcmljVmFsdWUgU3JjMiA9IGdldE9wZXJhbmRWYWx1ZShJLmdldE9wZXJhbmQoMSksIFNGKTsKKyAgR2VuZXJpY1ZhbHVlIERlc3Q7CisgIGlmIChTcmMyLkludFZhbC5nZXRaRXh0VmFsdWUoKSA8IFNyYzEuSW50VmFsLmdldEJpdFdpZHRoKCkpCisgICAgRGVzdC5JbnRWYWwgPSBTcmMxLkludFZhbC5hc2hyKFNyYzIuSW50VmFsLmdldFpFeHRWYWx1ZSgpKTsKKyAgZWxzZQorICAgIERlc3QuSW50VmFsID0gU3JjMS5JbnRWYWw7CisgIAorICBTZXRWYWx1ZSgmSSwgRGVzdCwgU0YpOworfQorCitHZW5lcmljVmFsdWUgSW50ZXJwcmV0ZXI6OmV4ZWN1dGVUcnVuY0luc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3QsIFNyYyA9IGdldE9wZXJhbmRWYWx1ZShTcmNWYWwsIFNGKTsKKyAgY29uc3QgSW50ZWdlclR5cGUgKkRJVHkgPSBjYXN0PEludGVnZXJUeXBlPihEc3RUeSk7CisgIHVuc2lnbmVkIERCaXRXaWR0aCA9IERJVHktPmdldEJpdFdpZHRoKCk7CisgIERlc3QuSW50VmFsID0gU3JjLkludFZhbC50cnVuYyhEQml0V2lkdGgpOworICByZXR1cm4gRGVzdDsKK30KKworR2VuZXJpY1ZhbHVlIEludGVycHJldGVyOjpleGVjdXRlU0V4dEluc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRpb25Db250ZXh0ICZTRikgeworICBHZW5lcmljVmFsdWUgRGVzdCwgU3JjID0gZ2V0T3BlcmFuZFZhbHVlKFNyY1ZhbCwgU0YpOworICBjb25zdCBJbnRlZ2VyVHlwZSAqRElUeSA9IGNhc3Q8SW50ZWdlclR5cGU+KERzdFR5KTsKKyAgdW5zaWduZWQgREJpdFdpZHRoID0gRElUeS0+Z2V0Qml0V2lkdGgoKTsKKyAgRGVzdC5JbnRWYWwgPSBTcmMuSW50VmFsLnNleHQoREJpdFdpZHRoKTsKKyAgcmV0dXJuIERlc3Q7Cit9CisKK0dlbmVyaWNWYWx1ZSBJbnRlcnByZXRlcjo6ZXhlY3V0ZVpFeHRJbnN0KFZhbHVlICpTcmNWYWwsIGNvbnN0IFR5cGUgKkRzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3QsIFNyYyA9IGdldE9wZXJhbmRWYWx1ZShTcmNWYWwsIFNGKTsKKyAgY29uc3QgSW50ZWdlclR5cGUgKkRJVHkgPSBjYXN0PEludGVnZXJUeXBlPihEc3RUeSk7CisgIHVuc2lnbmVkIERCaXRXaWR0aCA9IERJVHktPmdldEJpdFdpZHRoKCk7CisgIERlc3QuSW50VmFsID0gU3JjLkludFZhbC56ZXh0KERCaXRXaWR0aCk7CisgIHJldHVybiBEZXN0OworfQorCitHZW5lcmljVmFsdWUgSW50ZXJwcmV0ZXI6OmV4ZWN1dGVGUFRydW5jSW5zdChWYWx1ZSAqU3JjVmFsLCBjb25zdCBUeXBlICpEc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGKSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0LCBTcmMgPSBnZXRPcGVyYW5kVmFsdWUoU3JjVmFsLCBTRik7CisgIGFzc2VydChTcmNWYWwtPmdldFR5cGUoKS0+aXNEb3VibGVUeSgpICYmIERzdFR5LT5pc0Zsb2F0VHkoKSAmJgorICAgICAgICAgIkludmFsaWQgRlBUcnVuYyBpbnN0cnVjdGlvbiIpOworICBEZXN0LkZsb2F0VmFsID0gKGZsb2F0KSBTcmMuRG91YmxlVmFsOworICByZXR1cm4gRGVzdDsKK30KKworR2VuZXJpY1ZhbHVlIEludGVycHJldGVyOjpleGVjdXRlRlBFeHRJbnN0KFZhbHVlICpTcmNWYWwsIGNvbnN0IFR5cGUgKkRzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGKSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0LCBTcmMgPSBnZXRPcGVyYW5kVmFsdWUoU3JjVmFsLCBTRik7CisgIGFzc2VydChTcmNWYWwtPmdldFR5cGUoKS0+aXNGbG9hdFR5KCkgJiYgRHN0VHktPmlzRG91YmxlVHkoKSAmJgorICAgICAgICAgIkludmFsaWQgRlBUcnVuYyBpbnN0cnVjdGlvbiIpOworICBEZXN0LkRvdWJsZVZhbCA9IChkb3VibGUpIFNyYy5GbG9hdFZhbDsKKyAgcmV0dXJuIERlc3Q7Cit9CisKK0dlbmVyaWNWYWx1ZSBJbnRlcnByZXRlcjo6ZXhlY3V0ZUZQVG9VSUluc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGKSB7CisgIGNvbnN0IFR5cGUgKlNyY1R5ID0gU3JjVmFsLT5nZXRUeXBlKCk7CisgIHVpbnQzMl90IERCaXRXaWR0aCA9IGNhc3Q8SW50ZWdlclR5cGU+KERzdFR5KS0+Z2V0Qml0V2lkdGgoKTsKKyAgR2VuZXJpY1ZhbHVlIERlc3QsIFNyYyA9IGdldE9wZXJhbmRWYWx1ZShTcmNWYWwsIFNGKTsKKyAgYXNzZXJ0KFNyY1R5LT5pc0Zsb2F0aW5nUG9pbnRUeSgpICYmICJJbnZhbGlkIEZQVG9VSSBpbnN0cnVjdGlvbiIpOworCisgIGlmIChTcmNUeS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6RmxvYXRUeUlEKQorICAgIERlc3QuSW50VmFsID0gQVBJbnRPcHM6OlJvdW5kRmxvYXRUb0FQSW50KFNyYy5GbG9hdFZhbCwgREJpdFdpZHRoKTsKKyAgZWxzZQorICAgIERlc3QuSW50VmFsID0gQVBJbnRPcHM6OlJvdW5kRG91YmxlVG9BUEludChTcmMuRG91YmxlVmFsLCBEQml0V2lkdGgpOworICByZXR1cm4gRGVzdDsKK30KKworR2VuZXJpY1ZhbHVlIEludGVycHJldGVyOjpleGVjdXRlRlBUb1NJSW5zdChWYWx1ZSAqU3JjVmFsLCBjb25zdCBUeXBlICpEc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpIHsKKyAgY29uc3QgVHlwZSAqU3JjVHkgPSBTcmNWYWwtPmdldFR5cGUoKTsKKyAgdWludDMyX3QgREJpdFdpZHRoID0gY2FzdDxJbnRlZ2VyVHlwZT4oRHN0VHkpLT5nZXRCaXRXaWR0aCgpOworICBHZW5lcmljVmFsdWUgRGVzdCwgU3JjID0gZ2V0T3BlcmFuZFZhbHVlKFNyY1ZhbCwgU0YpOworICBhc3NlcnQoU3JjVHktPmlzRmxvYXRpbmdQb2ludFR5KCkgJiYgIkludmFsaWQgRlBUb1NJIGluc3RydWN0aW9uIik7CisKKyAgaWYgKFNyY1R5LT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpGbG9hdFR5SUQpCisgICAgRGVzdC5JbnRWYWwgPSBBUEludE9wczo6Um91bmRGbG9hdFRvQVBJbnQoU3JjLkZsb2F0VmFsLCBEQml0V2lkdGgpOworICBlbHNlCisgICAgRGVzdC5JbnRWYWwgPSBBUEludE9wczo6Um91bmREb3VibGVUb0FQSW50KFNyYy5Eb3VibGVWYWwsIERCaXRXaWR0aCk7CisgIHJldHVybiBEZXN0OworfQorCitHZW5lcmljVmFsdWUgSW50ZXJwcmV0ZXI6OmV4ZWN1dGVVSVRvRlBJbnN0KFZhbHVlICpTcmNWYWwsIGNvbnN0IFR5cGUgKkRzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRpb25Db250ZXh0ICZTRikgeworICBHZW5lcmljVmFsdWUgRGVzdCwgU3JjID0gZ2V0T3BlcmFuZFZhbHVlKFNyY1ZhbCwgU0YpOworICBhc3NlcnQoRHN0VHktPmlzRmxvYXRpbmdQb2ludFR5KCkgJiYgIkludmFsaWQgVUlUb0ZQIGluc3RydWN0aW9uIik7CisKKyAgaWYgKERzdFR5LT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpGbG9hdFR5SUQpCisgICAgRGVzdC5GbG9hdFZhbCA9IEFQSW50T3BzOjpSb3VuZEFQSW50VG9GbG9hdChTcmMuSW50VmFsKTsKKyAgZWxzZQorICAgIERlc3QuRG91YmxlVmFsID0gQVBJbnRPcHM6OlJvdW5kQVBJbnRUb0RvdWJsZShTcmMuSW50VmFsKTsKKyAgcmV0dXJuIERlc3Q7Cit9CisKK0dlbmVyaWNWYWx1ZSBJbnRlcnByZXRlcjo6ZXhlY3V0ZVNJVG9GUEluc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGKSB7CisgIEdlbmVyaWNWYWx1ZSBEZXN0LCBTcmMgPSBnZXRPcGVyYW5kVmFsdWUoU3JjVmFsLCBTRik7CisgIGFzc2VydChEc3RUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSAmJiAiSW52YWxpZCBTSVRvRlAgaW5zdHJ1Y3Rpb24iKTsKKworICBpZiAoRHN0VHktPmdldFR5cGVJRCgpID09IFR5cGU6OkZsb2F0VHlJRCkKKyAgICBEZXN0LkZsb2F0VmFsID0gQVBJbnRPcHM6OlJvdW5kU2lnbmVkQVBJbnRUb0Zsb2F0KFNyYy5JbnRWYWwpOworICBlbHNlCisgICAgRGVzdC5Eb3VibGVWYWwgPSBBUEludE9wczo6Um91bmRTaWduZWRBUEludFRvRG91YmxlKFNyYy5JbnRWYWwpOworICByZXR1cm4gRGVzdDsKKworfQorCitHZW5lcmljVmFsdWUgSW50ZXJwcmV0ZXI6OmV4ZWN1dGVQdHJUb0ludEluc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpIHsKKyAgdWludDMyX3QgREJpdFdpZHRoID0gY2FzdDxJbnRlZ2VyVHlwZT4oRHN0VHkpLT5nZXRCaXRXaWR0aCgpOworICBHZW5lcmljVmFsdWUgRGVzdCwgU3JjID0gZ2V0T3BlcmFuZFZhbHVlKFNyY1ZhbCwgU0YpOworICBhc3NlcnQoU3JjVmFsLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkgJiYgIkludmFsaWQgUHRyVG9JbnQgaW5zdHJ1Y3Rpb24iKTsKKworICBEZXN0LkludFZhbCA9IEFQSW50KERCaXRXaWR0aCwgKGludHB0cl90KSBTcmMuUG9pbnRlclZhbCk7CisgIHJldHVybiBEZXN0OworfQorCitHZW5lcmljVmFsdWUgSW50ZXJwcmV0ZXI6OmV4ZWN1dGVJbnRUb1B0ckluc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpIHsKKyAgR2VuZXJpY1ZhbHVlIERlc3QsIFNyYyA9IGdldE9wZXJhbmRWYWx1ZShTcmNWYWwsIFNGKTsKKyAgYXNzZXJ0KERzdFR5LT5pc1BvaW50ZXJUeSgpICYmICJJbnZhbGlkIFB0clRvSW50IGluc3RydWN0aW9uIik7CisKKyAgdWludDMyX3QgUHRyU2l6ZSA9IFRELmdldFBvaW50ZXJTaXplSW5CaXRzKCk7CisgIGlmIChQdHJTaXplICE9IFNyYy5JbnRWYWwuZ2V0Qml0V2lkdGgoKSkKKyAgICBTcmMuSW50VmFsID0gU3JjLkludFZhbC56ZXh0T3JUcnVuYyhQdHJTaXplKTsKKworICBEZXN0LlBvaW50ZXJWYWwgPSBQb2ludGVyVHkoaW50cHRyX3QoU3JjLkludFZhbC5nZXRaRXh0VmFsdWUoKSkpOworICByZXR1cm4gRGVzdDsKK30KKworR2VuZXJpY1ZhbHVlIEludGVycHJldGVyOjpleGVjdXRlQml0Q2FzdEluc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRpb25Db250ZXh0ICZTRikgeworICAKKyAgY29uc3QgVHlwZSAqU3JjVHkgPSBTcmNWYWwtPmdldFR5cGUoKTsKKyAgR2VuZXJpY1ZhbHVlIERlc3QsIFNyYyA9IGdldE9wZXJhbmRWYWx1ZShTcmNWYWwsIFNGKTsKKyAgaWYgKERzdFR5LT5pc1BvaW50ZXJUeSgpKSB7CisgICAgYXNzZXJ0KFNyY1R5LT5pc1BvaW50ZXJUeSgpICYmICJJbnZhbGlkIEJpdENhc3QiKTsKKyAgICBEZXN0LlBvaW50ZXJWYWwgPSBTcmMuUG9pbnRlclZhbDsKKyAgfSBlbHNlIGlmIChEc3RUeS0+aXNJbnRlZ2VyVHkoKSkgeworICAgIGlmIChTcmNUeS0+aXNGbG9hdFR5KCkpIHsKKyAgICAgIERlc3QuSW50VmFsLnpleHQoc2l6ZW9mKFNyYy5GbG9hdFZhbCkgKiBDSEFSX0JJVCk7CisgICAgICBEZXN0LkludFZhbC5mbG9hdFRvQml0cyhTcmMuRmxvYXRWYWwpOworICAgIH0gZWxzZSBpZiAoU3JjVHktPmlzRG91YmxlVHkoKSkgeworICAgICAgRGVzdC5JbnRWYWwuemV4dChzaXplb2YoU3JjLkRvdWJsZVZhbCkgKiBDSEFSX0JJVCk7CisgICAgICBEZXN0LkludFZhbC5kb3VibGVUb0JpdHMoU3JjLkRvdWJsZVZhbCk7CisgICAgfSBlbHNlIGlmIChTcmNUeS0+aXNJbnRlZ2VyVHkoKSkgeworICAgICAgRGVzdC5JbnRWYWwgPSBTcmMuSW50VmFsOworICAgIH0gZWxzZSAKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgQml0Q2FzdCIpOworICB9IGVsc2UgaWYgKERzdFR5LT5pc0Zsb2F0VHkoKSkgeworICAgIGlmIChTcmNUeS0+aXNJbnRlZ2VyVHkoKSkKKyAgICAgIERlc3QuRmxvYXRWYWwgPSBTcmMuSW50VmFsLmJpdHNUb0Zsb2F0KCk7CisgICAgZWxzZQorICAgICAgRGVzdC5GbG9hdFZhbCA9IFNyYy5GbG9hdFZhbDsKKyAgfSBlbHNlIGlmIChEc3RUeS0+aXNEb3VibGVUeSgpKSB7CisgICAgaWYgKFNyY1R5LT5pc0ludGVnZXJUeSgpKQorICAgICAgRGVzdC5Eb3VibGVWYWwgPSBTcmMuSW50VmFsLmJpdHNUb0RvdWJsZSgpOworICAgIGVsc2UKKyAgICAgIERlc3QuRG91YmxlVmFsID0gU3JjLkRvdWJsZVZhbDsKKyAgfSBlbHNlCisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBCaXRjYXN0Iik7CisKKyAgcmV0dXJuIERlc3Q7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0VHJ1bmNJbnN0KFRydW5jSW5zdCAmSSkgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworICBTZXRWYWx1ZSgmSSwgZXhlY3V0ZVRydW5jSW5zdChJLmdldE9wZXJhbmQoMCksIEkuZ2V0VHlwZSgpLCBTRiksIFNGKTsKK30KKwordm9pZCBJbnRlcnByZXRlcjo6dmlzaXRTRXh0SW5zdChTRXh0SW5zdCAmSSkgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworICBTZXRWYWx1ZSgmSSwgZXhlY3V0ZVNFeHRJbnN0KEkuZ2V0T3BlcmFuZCgwKSwgSS5nZXRUeXBlKCksIFNGKSwgU0YpOworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdFpFeHRJbnN0KFpFeHRJbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIFNldFZhbHVlKCZJLCBleGVjdXRlWkV4dEluc3QoSS5nZXRPcGVyYW5kKDApLCBJLmdldFR5cGUoKSwgU0YpLCBTRik7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0RlBUcnVuY0luc3QoRlBUcnVuY0luc3QgJkkpIHsKKyAgRXhlY3V0aW9uQ29udGV4dCAmU0YgPSBFQ1N0YWNrLmJhY2soKTsKKyAgU2V0VmFsdWUoJkksIGV4ZWN1dGVGUFRydW5jSW5zdChJLmdldE9wZXJhbmQoMCksIEkuZ2V0VHlwZSgpLCBTRiksIFNGKTsKK30KKwordm9pZCBJbnRlcnByZXRlcjo6dmlzaXRGUEV4dEluc3QoRlBFeHRJbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIFNldFZhbHVlKCZJLCBleGVjdXRlRlBFeHRJbnN0KEkuZ2V0T3BlcmFuZCgwKSwgSS5nZXRUeXBlKCksIFNGKSwgU0YpOworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdFVJVG9GUEluc3QoVUlUb0ZQSW5zdCAmSSkgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworICBTZXRWYWx1ZSgmSSwgZXhlY3V0ZVVJVG9GUEluc3QoSS5nZXRPcGVyYW5kKDApLCBJLmdldFR5cGUoKSwgU0YpLCBTRik7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0U0lUb0ZQSW5zdChTSVRvRlBJbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIFNldFZhbHVlKCZJLCBleGVjdXRlU0lUb0ZQSW5zdChJLmdldE9wZXJhbmQoMCksIEkuZ2V0VHlwZSgpLCBTRiksIFNGKTsKK30KKwordm9pZCBJbnRlcnByZXRlcjo6dmlzaXRGUFRvVUlJbnN0KEZQVG9VSUluc3QgJkkpIHsKKyAgRXhlY3V0aW9uQ29udGV4dCAmU0YgPSBFQ1N0YWNrLmJhY2soKTsKKyAgU2V0VmFsdWUoJkksIGV4ZWN1dGVGUFRvVUlJbnN0KEkuZ2V0T3BlcmFuZCgwKSwgSS5nZXRUeXBlKCksIFNGKSwgU0YpOworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdEZQVG9TSUluc3QoRlBUb1NJSW5zdCAmSSkgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworICBTZXRWYWx1ZSgmSSwgZXhlY3V0ZUZQVG9TSUluc3QoSS5nZXRPcGVyYW5kKDApLCBJLmdldFR5cGUoKSwgU0YpLCBTRik7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnZpc2l0UHRyVG9JbnRJbnN0KFB0clRvSW50SW5zdCAmSSkgeworICBFeGVjdXRpb25Db250ZXh0ICZTRiA9IEVDU3RhY2suYmFjaygpOworICBTZXRWYWx1ZSgmSSwgZXhlY3V0ZVB0clRvSW50SW5zdChJLmdldE9wZXJhbmQoMCksIEkuZ2V0VHlwZSgpLCBTRiksIFNGKTsKK30KKwordm9pZCBJbnRlcnByZXRlcjo6dmlzaXRJbnRUb1B0ckluc3QoSW50VG9QdHJJbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIFNldFZhbHVlKCZJLCBleGVjdXRlSW50VG9QdHJJbnN0KEkuZ2V0T3BlcmFuZCgwKSwgSS5nZXRUeXBlKCksIFNGKSwgU0YpOworfQorCit2b2lkIEludGVycHJldGVyOjp2aXNpdEJpdENhc3RJbnN0KEJpdENhc3RJbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisgIFNldFZhbHVlKCZJLCBleGVjdXRlQml0Q2FzdEluc3QoSS5nZXRPcGVyYW5kKDApLCBJLmdldFR5cGUoKSwgU0YpLCBTRik7Cit9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1ZBQVJHKFRZKSBcCisgICBjYXNlIFR5cGU6OlRZIyNUeUlEOiBEZXN0LlRZIyNWYWwgPSBTcmMuVFkjI1ZhbDsgYnJlYWsKKwordm9pZCBJbnRlcnByZXRlcjo6dmlzaXRWQUFyZ0luc3QoVkFBcmdJbnN0ICZJKSB7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7CisKKyAgLy8gR2V0IHRoZSBpbmNvbWluZyB2YWxpc3QgcGFyYW1ldGVyLiAgTExJIHRyZWF0cyB0aGUgdmFsaXN0IGFzIGEKKyAgLy8gKGVjLXN0YWNrLWRlcHRoIHZhci1hcmctaW5kZXgpIHBhaXIuCisgIEdlbmVyaWNWYWx1ZSBWQUxpc3QgPSBnZXRPcGVyYW5kVmFsdWUoSS5nZXRPcGVyYW5kKDApLCBTRik7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBHZW5lcmljVmFsdWUgU3JjID0gRUNTdGFja1tWQUxpc3QuVUludFBhaXJWYWwuZmlyc3RdCisgICAgICAgICAgICAgICAgICAgICAgLlZhckFyZ3NbVkFMaXN0LlVJbnRQYWlyVmFsLnNlY29uZF07CisgIGNvbnN0IFR5cGUgKlR5ID0gSS5nZXRUeXBlKCk7CisgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgICAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDogRGVzdC5JbnRWYWwgPSBTcmMuSW50VmFsOworICAgIElNUExFTUVOVF9WQUFSRyhQb2ludGVyKTsKKyAgICBJTVBMRU1FTlRfVkFBUkcoRmxvYXQpOworICAgIElNUExFTUVOVF9WQUFSRyhEb3VibGUpOworICBkZWZhdWx0OgorICAgIGRiZ3MoKSA8PCAiVW5oYW5kbGVkIGRlc3QgdHlwZSBmb3IgdmFhcmcgaW5zdHJ1Y3Rpb246ICIgPDwgKlR5IDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorCisgIC8vIFNldCB0aGUgVmFsdWUgb2YgdGhpcyBJbnN0cnVjdGlvbi4KKyAgU2V0VmFsdWUoJkksIERlc3QsIFNGKTsKKworICAvLyBNb3ZlIHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IHZhcmFyZy4KKyAgKytWQUxpc3QuVUludFBhaXJWYWwuc2Vjb25kOworfQorCitHZW5lcmljVmFsdWUgSW50ZXJwcmV0ZXI6OmdldENvbnN0YW50RXhwclZhbHVlIChDb25zdGFudEV4cHIgKkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpIHsKKyAgc3dpdGNoIChDRS0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6ICAgCisgICAgICByZXR1cm4gZXhlY3V0ZVRydW5jSW5zdChDRS0+Z2V0T3BlcmFuZCgwKSwgQ0UtPmdldFR5cGUoKSwgU0YpOworICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICAgICAgcmV0dXJuIGV4ZWN1dGVaRXh0SW5zdChDRS0+Z2V0T3BlcmFuZCgwKSwgQ0UtPmdldFR5cGUoKSwgU0YpOworICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OgorICAgICAgcmV0dXJuIGV4ZWN1dGVTRXh0SW5zdChDRS0+Z2V0T3BlcmFuZCgwKSwgQ0UtPmdldFR5cGUoKSwgU0YpOworICBjYXNlIEluc3RydWN0aW9uOjpGUFRydW5jOgorICAgICAgcmV0dXJuIGV4ZWN1dGVGUFRydW5jSW5zdChDRS0+Z2V0T3BlcmFuZCgwKSwgQ0UtPmdldFR5cGUoKSwgU0YpOworICBjYXNlIEluc3RydWN0aW9uOjpGUEV4dDoKKyAgICAgIHJldHVybiBleGVjdXRlRlBFeHRJbnN0KENFLT5nZXRPcGVyYW5kKDApLCBDRS0+Z2V0VHlwZSgpLCBTRik7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgICAgIHJldHVybiBleGVjdXRlVUlUb0ZQSW5zdChDRS0+Z2V0T3BlcmFuZCgwKSwgQ0UtPmdldFR5cGUoKSwgU0YpOworICBjYXNlIEluc3RydWN0aW9uOjpTSVRvRlA6CisgICAgICByZXR1cm4gZXhlY3V0ZVNJVG9GUEluc3QoQ0UtPmdldE9wZXJhbmQoMCksIENFLT5nZXRUeXBlKCksIFNGKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJOgorICAgICAgcmV0dXJuIGV4ZWN1dGVGUFRvVUlJbnN0KENFLT5nZXRPcGVyYW5kKDApLCBDRS0+Z2V0VHlwZSgpLCBTRik7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSToKKyAgICAgIHJldHVybiBleGVjdXRlRlBUb1NJSW5zdChDRS0+Z2V0T3BlcmFuZCgwKSwgQ0UtPmdldFR5cGUoKSwgU0YpOworICBjYXNlIEluc3RydWN0aW9uOjpQdHJUb0ludDoKKyAgICAgIHJldHVybiBleGVjdXRlUHRyVG9JbnRJbnN0KENFLT5nZXRPcGVyYW5kKDApLCBDRS0+Z2V0VHlwZSgpLCBTRik7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOgorICAgICAgcmV0dXJuIGV4ZWN1dGVJbnRUb1B0ckluc3QoQ0UtPmdldE9wZXJhbmQoMCksIENFLT5nZXRUeXBlKCksIFNGKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICAgIHJldHVybiBleGVjdXRlQml0Q2FzdEluc3QoQ0UtPmdldE9wZXJhbmQoMCksIENFLT5nZXRUeXBlKCksIFNGKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cjoKKyAgICByZXR1cm4gZXhlY3V0ZUdFUE9wZXJhdGlvbihDRS0+Z2V0T3BlcmFuZCgwKSwgZ2VwX3R5cGVfYmVnaW4oQ0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlcF90eXBlX2VuZChDRSksIFNGKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RkNtcDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6SUNtcDoKKyAgICByZXR1cm4gZXhlY3V0ZUNtcEluc3QoQ0UtPmdldFByZWRpY2F0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYW5kVmFsdWUoQ0UtPmdldE9wZXJhbmQoMCksIFNGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3BlcmFuZFZhbHVlKENFLT5nZXRPcGVyYW5kKDEpLCBTRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENFLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpOworICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6CisgICAgcmV0dXJuIGV4ZWN1dGVTZWxlY3RJbnN0KGdldE9wZXJhbmRWYWx1ZShDRS0+Z2V0T3BlcmFuZCgwKSwgU0YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYW5kVmFsdWUoQ0UtPmdldE9wZXJhbmQoMSksIFNGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3BlcmFuZFZhbHVlKENFLT5nZXRPcGVyYW5kKDIpLCBTRikpOworICBkZWZhdWx0IDoKKyAgICBicmVhazsKKyAgfQorCisgIC8vIFRoZSBjYXNlcyBiZWxvdyBoZXJlIHJlcXVpcmUgYSBHZW5lcmljVmFsdWUgcGFyYW1ldGVyIGZvciB0aGUgcmVzdWx0CisgIC8vIHNvIHdlIGluaXRpYWxpemUgb25lLCBjb21wdXRlIGl0IGFuZCB0aGVuIHJldHVybiBpdC4KKyAgR2VuZXJpY1ZhbHVlIE9wMCA9IGdldE9wZXJhbmRWYWx1ZShDRS0+Z2V0T3BlcmFuZCgwKSwgU0YpOworICBHZW5lcmljVmFsdWUgT3AxID0gZ2V0T3BlcmFuZFZhbHVlKENFLT5nZXRPcGVyYW5kKDEpLCBTRik7CisgIEdlbmVyaWNWYWx1ZSBEZXN0OworICBjb25zdCBUeXBlICogVHkgPSBDRS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpOworICBzd2l0Y2ggKENFLT5nZXRPcGNvZGUoKSkgeworICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6ICBEZXN0LkludFZhbCA9IE9wMC5JbnRWYWwgKyBPcDEuSW50VmFsOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOiAgRGVzdC5JbnRWYWwgPSBPcDAuSW50VmFsIC0gT3AxLkludFZhbDsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDogIERlc3QuSW50VmFsID0gT3AwLkludFZhbCAqIE9wMS5JbnRWYWw7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpGQWRkOiBleGVjdXRlRkFkZEluc3QoRGVzdCwgT3AwLCBPcDEsIFR5KTsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZTdWI6IGV4ZWN1dGVGU3ViSW5zdChEZXN0LCBPcDAsIE9wMSwgVHkpOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Rk11bDogZXhlY3V0ZUZNdWxJbnN0KERlc3QsIE9wMCwgT3AxLCBUeSk7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpGRGl2OiBleGVjdXRlRkRpdkluc3QoRGVzdCwgT3AwLCBPcDEsIFR5KTsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZSZW06IGV4ZWN1dGVGUmVtSW5zdChEZXN0LCBPcDAsIE9wMSwgVHkpOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0RpdjogRGVzdC5JbnRWYWwgPSBPcDAuSW50VmFsLnNkaXYoT3AxLkludFZhbCk7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OiBEZXN0LkludFZhbCA9IE9wMC5JbnRWYWwudWRpdihPcDEuSW50VmFsKTsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06IERlc3QuSW50VmFsID0gT3AwLkludFZhbC51cmVtKE9wMS5JbnRWYWwpOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbTogRGVzdC5JbnRWYWwgPSBPcDAuSW50VmFsLnNyZW0oT3AxLkludFZhbCk7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6ICBEZXN0LkludFZhbCA9IE9wMC5JbnRWYWwgJiBPcDEuSW50VmFsOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6ICAgRGVzdC5JbnRWYWwgPSBPcDAuSW50VmFsIHwgT3AxLkludFZhbDsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjogIERlc3QuSW50VmFsID0gT3AwLkludFZhbCBeIE9wMS5JbnRWYWw7IGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTaGw6ICAKKyAgICBEZXN0LkludFZhbCA9IE9wMC5JbnRWYWwuc2hsKE9wMS5JbnRWYWwuZ2V0WkV4dFZhbHVlKCkpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOiAKKyAgICBEZXN0LkludFZhbCA9IE9wMC5JbnRWYWwubHNocihPcDEuSW50VmFsLmdldFpFeHRWYWx1ZSgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjogCisgICAgRGVzdC5JbnRWYWwgPSBPcDAuSW50VmFsLmFzaHIoT3AxLkludFZhbC5nZXRaRXh0VmFsdWUoKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZGJncygpIDw8ICJVbmhhbmRsZWQgQ29uc3RhbnRFeHByOiAiIDw8ICpDRSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgICAgcmV0dXJuIEdlbmVyaWNWYWx1ZSgpOworICB9CisgIHJldHVybiBEZXN0OworfQorCitHZW5lcmljVmFsdWUgSW50ZXJwcmV0ZXI6OmdldE9wZXJhbmRWYWx1ZShWYWx1ZSAqViwgRXhlY3V0aW9uQ29udGV4dCAmU0YpIHsKKyAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKSB7CisgICAgcmV0dXJuIGdldENvbnN0YW50RXhwclZhbHVlKENFLCBTRik7CisgIH0gZWxzZSBpZiAoQ29uc3RhbnQgKkNQViA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkgeworICAgIHJldHVybiBnZXRDb25zdGFudFZhbHVlKENQVik7CisgIH0gZWxzZSBpZiAoR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KFYpKSB7CisgICAgcmV0dXJuIFBUT0dWKGdldFBvaW50ZXJUb0dsb2JhbChHVikpOworICB9IGVsc2UgeworICAgIHJldHVybiBTRi5WYWx1ZXNbVl07CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGF0Y2ggYW5kIEV4ZWN1dGlvbiBDb2RlCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gY2FsbEZ1bmN0aW9uIC0gRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLi4uCisvLwordm9pZCBJbnRlcnByZXRlcjo6Y2FsbEZ1bmN0aW9uKEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJkFyZ1ZhbHMpIHsKKyAgYXNzZXJ0KChFQ1N0YWNrLmVtcHR5KCkgfHwgRUNTdGFjay5iYWNrKCkuQ2FsbGVyLmdldEluc3RydWN0aW9uKCkgPT0gMCB8fAorICAgICAgICAgIEVDU3RhY2suYmFjaygpLkNhbGxlci5hcmdfc2l6ZSgpID09IEFyZ1ZhbHMuc2l6ZSgpKSAmJgorICAgICAgICAgIkluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCBpbnRvIGZ1bmN0aW9uIGNhbGwhIik7CisgIC8vIE1ha2UgYSBuZXcgc3RhY2sgZnJhbWUuLi4gYW5kIGZpbGwgaXQgaW4uCisgIEVDU3RhY2sucHVzaF9iYWNrKEV4ZWN1dGlvbkNvbnRleHQoKSk7CisgIEV4ZWN1dGlvbkNvbnRleHQgJlN0YWNrRnJhbWUgPSBFQ1N0YWNrLmJhY2soKTsKKyAgU3RhY2tGcmFtZS5DdXJGdW5jdGlvbiA9IEY7CisKKyAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgZXh0ZXJuYWwgZnVuY3Rpb25zLgorICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpKSB7CisgICAgR2VuZXJpY1ZhbHVlIFJlc3VsdCA9IGNhbGxFeHRlcm5hbEZ1bmN0aW9uIChGLCBBcmdWYWxzKTsKKyAgICAvLyBTaW11bGF0ZSBhICdyZXQnIGluc3RydWN0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgorICAgIHBvcFN0YWNrQW5kUmV0dXJuVmFsdWVUb0NhbGxlciAoRi0+Z2V0UmV0dXJuVHlwZSAoKSwgUmVzdWx0KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBHZXQgcG9pbnRlcnMgdG8gZmlyc3QgTExWTSBCQiAmIEluc3RydWN0aW9uIGluIGZ1bmN0aW9uLgorICBTdGFja0ZyYW1lLkN1ckJCICAgICA9IEYtPmJlZ2luKCk7CisgIFN0YWNrRnJhbWUuQ3VySW5zdCAgID0gU3RhY2tGcmFtZS5DdXJCQi0+YmVnaW4oKTsKKworICAvLyBSdW4gdGhyb3VnaCB0aGUgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCBpbml0aWFsaXplIHRoZWlyIHZhbHVlcy4uLgorICBhc3NlcnQoKEFyZ1ZhbHMuc2l6ZSgpID09IEYtPmFyZ19zaXplKCkgfHwKKyAgICAgICAgIChBcmdWYWxzLnNpemUoKSA+IEYtPmFyZ19zaXplKCkgJiYgRi0+Z2V0RnVuY3Rpb25UeXBlKCktPmlzVmFyQXJnKCkpKSYmCisgICAgICAgICAiSW52YWxpZCBudW1iZXIgb2YgdmFsdWVzIHBhc3NlZCB0byBmdW5jdGlvbiBpbnZvY2F0aW9uISIpOworCisgIC8vIEhhbmRsZSBub24tdmFyYXJncyBhcmd1bWVudHMuLi4KKyAgdW5zaWduZWQgaSA9IDA7CisgIGZvciAoRnVuY3Rpb246OmFyZ19pdGVyYXRvciBBSSA9IEYtPmFyZ19iZWdpbigpLCBFID0gRi0+YXJnX2VuZCgpOyAKKyAgICAgICBBSSAhPSBFOyArK0FJLCArK2kpCisgICAgU2V0VmFsdWUoQUksIEFyZ1ZhbHNbaV0sIFN0YWNrRnJhbWUpOworCisgIC8vIEhhbmRsZSB2YXJhcmdzIGFyZ3VtZW50cy4uLgorICBTdGFja0ZyYW1lLlZhckFyZ3MuYXNzaWduKEFyZ1ZhbHMuYmVnaW4oKStpLCBBcmdWYWxzLmVuZCgpKTsKK30KKworCit2b2lkIEludGVycHJldGVyOjpydW4oKSB7CisgIHdoaWxlICghRUNTdGFjay5lbXB0eSgpKSB7CisgICAgLy8gSW50ZXJwcmV0IGEgc2luZ2xlIGluc3RydWN0aW9uICYgaW5jcmVtZW50IHRoZSAiUEMiLgorICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGID0gRUNTdGFjay5iYWNrKCk7ICAvLyBDdXJyZW50IHN0YWNrIGZyYW1lCisgICAgSW5zdHJ1Y3Rpb24gJkkgPSAqU0YuQ3VySW5zdCsrOyAgICAgICAgIC8vIEluY3JlbWVudCBiZWZvcmUgZXhlY3V0ZQorCisgICAgLy8gVHJhY2sgdGhlIG51bWJlciBvZiBkeW5hbWljIGluc3RydWN0aW9ucyBleGVjdXRlZC4KKyAgICArK051bUR5bmFtaWNJbnN0czsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiQWJvdXQgdG8gaW50ZXJwcmV0OiAiIDw8IEkpOworICAgIHZpc2l0KEkpOyAgIC8vIERpc3BhdGNoIHRvIG9uZSBvZiB0aGUgdmlzaXQqIG1ldGhvZHMuLi4KKyNpZiAwCisgICAgLy8gVGhpcyBpcyBub3Qgc2FmZSwgYXMgdmlzaXRpbmcgdGhlIGluc3RydWN0aW9uIGNvdWxkIGxvd2VyIGl0IGFuZCBmcmVlIEkuCitERUJVRygKKyAgICBpZiAoIWlzYTxDYWxsSW5zdD4oSSkgJiYgIWlzYTxJbnZva2VJbnN0PihJKSAmJiAKKyAgICAgICAgSS5nZXRUeXBlKCkgIT0gVHlwZTo6Vm9pZFR5KSB7CisgICAgICBkYmdzKCkgPDwgIiAgLS0+ICI7CisgICAgICBjb25zdCBHZW5lcmljVmFsdWUgJlZhbCA9IFNGLlZhbHVlc1smSV07CisgICAgICBzd2l0Y2ggKEkuZ2V0VHlwZSgpLT5nZXRUeXBlSUQoKSkgeworICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBHZW5lcmljVmFsdWUgVHlwZSIpOworICAgICAgY2FzZSBUeXBlOjpWb2lkVHlJRDogICAgZGJncygpIDw8ICJ2b2lkIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGU6OkZsb2F0VHlJRDogICBkYmdzKCkgPDwgImZsb2F0ICIgPDwgVmFsLkZsb2F0VmFsOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDogIGRiZ3MoKSA8PCAiZG91YmxlICIgPDwgVmFsLkRvdWJsZVZhbDsgYnJlYWs7CisgICAgICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOiBkYmdzKCkgPDwgInZvaWQqICIgPDwgaW50cHRyX3QoVmFsLlBvaW50ZXJWYWwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6IAorICAgICAgICBkYmdzKCkgPDwgImkiIDw8IFZhbC5JbnRWYWwuZ2V0Qml0V2lkdGgoKSA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IFZhbC5JbnRWYWwudG9TdHJpbmdVbnNpZ25lZCgxMCkKKyAgICAgICAgICAgICAgIDw8ICIgKDB4IiA8PCBWYWwuSW50VmFsLnRvU3RyaW5nVW5zaWduZWQoMTYpIDw8ICIpXG4iOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9KTsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0ludGVycHJldGVyL0V4dGVybmFsRnVuY3Rpb25zLmNwcCBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIvRXh0ZXJuYWxGdW5jdGlvbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDEyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0ludGVycHJldGVyL0V4dGVybmFsRnVuY3Rpb25zLmNwcApAQCAtMCwwICsxLDQ5MiBAQAorLy89PT0tLSBFeHRlcm5hbEZ1bmN0aW9ucy5jcHAgLSBJbXBsZW1lbnQgRXh0ZXJuYWwgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGNvbnRhaW5zIGJvdGggY29kZSB0byBkZWFsIHdpdGggaW52b2tpbmcgImV4dGVybmFsIiBmdW5jdGlvbnMsIGJ1dAorLy8gIGFsc28gY29udGFpbnMgY29kZSB0aGF0IGltcGxlbWVudHMgImV4cG9ydGVkIiBleHRlcm5hbCBmdW5jdGlvbnMuCisvLworLy8gIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIG1lY2hhbmlzbXMgZm9yIGhhbmRsaW5nIGV4dGVybmFsIGZ1bmN0aW9ucyBpbiB0aGUKKy8vICBJbnRlcnByZXRlci4gIFRoZSBmaXJzdCBpcyB0byBpbXBsZW1lbnQgbGxlXyogd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBhcmUKKy8vICBzcGVjaWZpYyB0byB3ZWxsLWtub3duIGxpYnJhcnkgZnVuY3Rpb25zIHdoaWNoIG1hbnVhbGx5IHRyYW5zbGF0ZSB0aGUKKy8vICBhcmd1bWVudHMgZnJvbSBHZW5lcmljVmFsdWVzIGFuZCBtYWtlIHRoZSBjYWxsLiAgSWYgc3VjaCBhIHdyYXBwZXIgZG9lcworLy8gIG5vdCBleGlzdCwgYW5kIGxpYmZmaSBpcyBhdmFpbGFibGUsIHRoZW4gdGhlIEludGVycHJldGVyIHdpbGwgYXR0ZW1wdCB0bworLy8gIGludm9rZSB0aGUgZnVuY3Rpb24gdXNpbmcgbGliZmZpLCBhZnRlciBmaW5kaW5nIGl0cyBhZGRyZXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJJbnRlcnByZXRlci5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIgICAgIC8vIERldGVjdCBsaWJmZmkKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0R5bmFtaWNMaWJyYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTXV0ZXguaCIKKyNpbmNsdWRlIDxjc2lnbmFsPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2lmZGVmIEhBVkVfRkZJX0NBTEwKKyNpZmRlZiBIQVZFX0ZGSV9ICisjaW5jbHVkZSA8ZmZpLmg+CisjZGVmaW5lIFVTRV9MSUJGRkkKKyNlbGlmIEhBVkVfRkZJX0ZGSV9ICisjaW5jbHVkZSA8ZmZpL2ZmaS5oPgorI2RlZmluZSBVU0VfTElCRkZJCisjZW5kaWYKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIE1hbmFnZWRTdGF0aWM8c3lzOjpNdXRleD4gRnVuY3Rpb25zTG9jazsKKwordHlwZWRlZiBHZW5lcmljVmFsdWUgKCpFeEZ1bmMpKGNvbnN0IEZ1bmN0aW9uVHlwZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJik7CitzdGF0aWMgTWFuYWdlZFN0YXRpYzxzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiAqLCBFeEZ1bmM+ID4gRXhwb3J0ZWRGdW5jdGlvbnM7CitzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEV4RnVuYz4gRnVuY05hbWVzOworCisjaWZkZWYgVVNFX0xJQkZGSQordHlwZWRlZiB2b2lkICgqUmF3RnVuYykoKTsKK3N0YXRpYyBNYW5hZ2VkU3RhdGljPHN0ZDo6bWFwPGNvbnN0IEZ1bmN0aW9uICosIFJhd0Z1bmM+ID4gUmF3RnVuY3Rpb25zOworI2VuZGlmCisKK3N0YXRpYyBJbnRlcnByZXRlciAqVGhlSW50ZXJwcmV0ZXI7CisKK3N0YXRpYyBjaGFyIGdldFR5cGVJRChjb25zdCBUeXBlICpUeSkgeworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICBjYXNlIFR5cGU6OlZvaWRUeUlEOiAgICByZXR1cm4gJ1YnOworICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOgorICAgIHN3aXRjaCAoY2FzdDxJbnRlZ2VyVHlwZT4oVHkpLT5nZXRCaXRXaWR0aCgpKSB7CisgICAgICBjYXNlIDE6ICByZXR1cm4gJ28nOworICAgICAgY2FzZSA4OiAgcmV0dXJuICdCJzsKKyAgICAgIGNhc2UgMTY6IHJldHVybiAnUyc7CisgICAgICBjYXNlIDMyOiByZXR1cm4gJ0knOworICAgICAgY2FzZSA2NDogcmV0dXJuICdMJzsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAnTic7CisgICAgfQorICBjYXNlIFR5cGU6OkZsb2F0VHlJRDogICByZXR1cm4gJ0YnOworICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6ICByZXR1cm4gJ0QnOworICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOiByZXR1cm4gJ1AnOworICBjYXNlIFR5cGU6OkZ1bmN0aW9uVHlJRDpyZXR1cm4gJ00nOworICBjYXNlIFR5cGU6OlN0cnVjdFR5SUQ6ICByZXR1cm4gJ1QnOworICBjYXNlIFR5cGU6OkFycmF5VHlJRDogICByZXR1cm4gJ0EnOworICBjYXNlIFR5cGU6Ok9wYXF1ZVR5SUQ6ICByZXR1cm4gJ08nOworICBkZWZhdWx0OiByZXR1cm4gJ1UnOworICB9Cit9CisKKy8vIFRyeSB0byBmaW5kIGFkZHJlc3Mgb2YgZXh0ZXJuYWwgZnVuY3Rpb24gZ2l2ZW4gYSBGdW5jdGlvbiBvYmplY3QuCisvLyBQbGVhc2Ugbm90ZSwgdGhhdCBpbnRlcnByZXRlciBkb2Vzbid0IGtub3cgaG93IHRvIGFzc2VtYmxlIGEKKy8vIHJlYWwgY2FsbCBpbiBnZW5lcmFsIGNhc2UgKHRoaXMgaXMgSklUIGpvYiksIHRoYXQncyB3aHkgaXQgYXNzdW1lcywKKy8vIHRoYXQgYWxsIGV4dGVybmFsIGZ1bmN0aW9ucyBoYXMgdGhlIHNhbWUgKGFuZCBwcmV0dHkgImdlbmVyYWwiKSBzaWduYXR1cmUuCisvLyBUaGUgdHlwaWNhbCBleGFtcGxlIG9mIHN1Y2ggZnVuY3Rpb25zIGFyZSAibGxlX1hfIiBvbmVzLgorc3RhdGljIEV4RnVuYyBsb29rdXBGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAqRikgeworICAvLyBGdW5jdGlvbiBub3QgZm91bmQsIGxvb2sgaXQgdXAuLi4gc3RhcnQgYnkgZmlndXJpbmcgb3V0IHdoYXQgdGhlCisgIC8vIGNvbXBvc2l0ZSBmdW5jdGlvbiBuYW1lIHNob3VsZCBiZS4KKyAgc3RkOjpzdHJpbmcgRXh0TmFtZSA9ICJsbGVfIjsKKyAgY29uc3QgRnVuY3Rpb25UeXBlICpGVCA9IEYtPmdldEZ1bmN0aW9uVHlwZSgpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlQtPmdldE51bUNvbnRhaW5lZFR5cGVzKCk7IGkgIT0gZTsgKytpKQorICAgIEV4dE5hbWUgKz0gZ2V0VHlwZUlEKEZULT5nZXRDb250YWluZWRUeXBlKGkpKTsKKyAgRXh0TmFtZSArICJfIiArIEYtPmdldE5hbWVTdHIoKTsKKworICBzeXM6OlNjb3BlZExvY2sgV3JpdGVyKCpGdW5jdGlvbnNMb2NrKTsKKyAgRXhGdW5jIEZuUHRyID0gRnVuY05hbWVzW0V4dE5hbWVdOworICBpZiAoRm5QdHIgPT0gMCkKKyAgICBGblB0ciA9IEZ1bmNOYW1lc1sibGxlX1hfIiArIEYtPmdldE5hbWVTdHIoKV07CisgIGlmIChGblB0ciA9PSAwKSAgLy8gVHJ5IGNhbGxpbmcgYSBnZW5lcmljIGZ1bmN0aW9uLi4uIGlmIGl0IGV4aXN0cy4uLgorICAgIEZuUHRyID0gKEV4RnVuYykoaW50cHRyX3QpCisgICAgICBzeXM6OkR5bmFtaWNMaWJyYXJ5OjpTZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woImxsZV9YXyIrRi0+Z2V0TmFtZVN0cigpKTsKKyAgaWYgKEZuUHRyICE9IDApCisgICAgRXhwb3J0ZWRGdW5jdGlvbnMtPmluc2VydChzdGQ6Om1ha2VfcGFpcihGLCBGblB0cikpOyAgLy8gQ2FjaGUgZm9yIGxhdGVyCisgIHJldHVybiBGblB0cjsKK30KKworI2lmZGVmIFVTRV9MSUJGRkkKK3N0YXRpYyBmZmlfdHlwZSAqZmZpVHlwZUZvcihjb25zdCBUeXBlICpUeSkgeworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICAgIGNhc2UgVHlwZTo6Vm9pZFR5SUQ6IHJldHVybiAmZmZpX3R5cGVfdm9pZDsKKyAgICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOgorICAgICAgc3dpdGNoIChjYXN0PEludGVnZXJUeXBlPihUeSktPmdldEJpdFdpZHRoKCkpIHsKKyAgICAgICAgY2FzZSA4OiAgcmV0dXJuICZmZmlfdHlwZV9zaW50ODsKKyAgICAgICAgY2FzZSAxNjogcmV0dXJuICZmZmlfdHlwZV9zaW50MTY7CisgICAgICAgIGNhc2UgMzI6IHJldHVybiAmZmZpX3R5cGVfc2ludDMyOworICAgICAgICBjYXNlIDY0OiByZXR1cm4gJmZmaV90eXBlX3NpbnQ2NDsKKyAgICAgIH0KKyAgICBjYXNlIFR5cGU6OkZsb2F0VHlJRDogICByZXR1cm4gJmZmaV90eXBlX2Zsb2F0OworICAgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDogIHJldHVybiAmZmZpX3R5cGVfZG91YmxlOworICAgIGNhc2UgVHlwZTo6UG9pbnRlclR5SUQ6IHJldHVybiAmZmZpX3R5cGVfcG9pbnRlcjsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorICAvLyBUT0RPOiBTdXBwb3J0IG90aGVyIHR5cGVzIHN1Y2ggYXMgU3RydWN0VHlJRCwgQXJyYXlUeUlELCBPcGFxdWVUeUlELCBldGMuCisgIHJlcG9ydF9mYXRhbF9lcnJvcigiVHlwZSBjb3VsZCBub3QgYmUgbWFwcGVkIGZvciB1c2Ugd2l0aCBsaWJmZmkuIik7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqZmZpVmFsdWVGb3IoY29uc3QgVHlwZSAqVHksIGNvbnN0IEdlbmVyaWNWYWx1ZSAmQVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQXJnRGF0YVB0cikgeworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICAgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6CisgICAgICBzd2l0Y2ggKGNhc3Q8SW50ZWdlclR5cGU+KFR5KS0+Z2V0Qml0V2lkdGgoKSkgeworICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICBpbnQ4X3QgKkk4UHRyID0gKGludDhfdCAqKSBBcmdEYXRhUHRyOworICAgICAgICAgICpJOFB0ciA9IChpbnQ4X3QpIEFWLkludFZhbC5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICByZXR1cm4gQXJnRGF0YVB0cjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDE2OiB7CisgICAgICAgICAgaW50MTZfdCAqSTE2UHRyID0gKGludDE2X3QgKikgQXJnRGF0YVB0cjsKKyAgICAgICAgICAqSTE2UHRyID0gKGludDE2X3QpIEFWLkludFZhbC5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICByZXR1cm4gQXJnRGF0YVB0cjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDMyOiB7CisgICAgICAgICAgaW50MzJfdCAqSTMyUHRyID0gKGludDMyX3QgKikgQXJnRGF0YVB0cjsKKyAgICAgICAgICAqSTMyUHRyID0gKGludDMyX3QpIEFWLkludFZhbC5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICByZXR1cm4gQXJnRGF0YVB0cjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDY0OiB7CisgICAgICAgICAgaW50NjRfdCAqSTY0UHRyID0gKGludDY0X3QgKikgQXJnRGF0YVB0cjsKKyAgICAgICAgICAqSTY0UHRyID0gKGludDY0X3QpIEFWLkludFZhbC5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICByZXR1cm4gQXJnRGF0YVB0cjsKKyAgICAgICAgfQorICAgICAgfQorICAgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOiB7CisgICAgICBmbG9hdCAqRmxvYXRQdHIgPSAoZmxvYXQgKikgQXJnRGF0YVB0cjsKKyAgICAgICpGbG9hdFB0ciA9IEFWLkZsb2F0VmFsOworICAgICAgcmV0dXJuIEFyZ0RhdGFQdHI7CisgICAgfQorICAgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDogeworICAgICAgZG91YmxlICpEb3VibGVQdHIgPSAoZG91YmxlICopIEFyZ0RhdGFQdHI7CisgICAgICAqRG91YmxlUHRyID0gQVYuRG91YmxlVmFsOworICAgICAgcmV0dXJuIEFyZ0RhdGFQdHI7CisgICAgfQorICAgIGNhc2UgVHlwZTo6UG9pbnRlclR5SUQ6IHsKKyAgICAgIHZvaWQgKipQdHJQdHIgPSAodm9pZCAqKikgQXJnRGF0YVB0cjsKKyAgICAgICpQdHJQdHIgPSBHVlRPUChBVik7CisgICAgICByZXR1cm4gQXJnRGF0YVB0cjsKKyAgICB9CisgICAgZGVmYXVsdDogYnJlYWs7CisgIH0KKyAgLy8gVE9ETzogU3VwcG9ydCBvdGhlciB0eXBlcyBzdWNoIGFzIFN0cnVjdFR5SUQsIEFycmF5VHlJRCwgT3BhcXVlVHlJRCwgZXRjLgorICByZXBvcnRfZmF0YWxfZXJyb3IoIlR5cGUgdmFsdWUgY291bGQgbm90IGJlIG1hcHBlZCBmb3IgdXNlIHdpdGggbGliZmZpLiIpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2wgZmZpSW52b2tlKFJhd0Z1bmMgRm4sIEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJkFyZ1ZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQsIEdlbmVyaWNWYWx1ZSAmUmVzdWx0KSB7CisgIGZmaV9jaWYgY2lmOworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IEYtPmdldEZ1bmN0aW9uVHlwZSgpOworICBjb25zdCB1bnNpZ25lZCBOdW1BcmdzID0gRi0+YXJnX3NpemUoKTsKKworICAvLyBUT0RPOiBXZSBkb24ndCBoYXZlIHR5cGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMsIGJlY2F1c2UKKyAgLy8gdGhpcyBpbmZvcm1hdGlvbiBpcyBuZXZlciBwYXNzZWQgaW50byBFeGVjdXRpb25FbmdpbmU6OnJ1bkZ1bmN0aW9uKCkuCisgIGlmIChBcmdWYWxzLnNpemUoKSA+IE51bUFyZ3MgJiYgRi0+aXNWYXJBcmcoKSkgeworICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiQ2FsbGluZyBleHRlcm5hbCB2YXIgYXJnIGZ1bmN0aW9uICciICsgRi0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgKyAiJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBJbnRlcnByZXRlci4iKTsKKyAgfQorCisgIHVuc2lnbmVkIEFyZ0J5dGVzID0gMDsKKworICBzdGQ6OnZlY3RvcjxmZmlfdHlwZSo+IGFyZ3MoTnVtQXJncyk7CisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2FyZ19pdGVyYXRvciBBID0gRi0+YXJnX2JlZ2luKCksIEUgPSBGLT5hcmdfZW5kKCk7CisgICAgICAgQSAhPSBFOyArK0EpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBBcmdObyA9IEEtPmdldEFyZ05vKCk7CisgICAgY29uc3QgVHlwZSAqQXJnVHkgPSBGVHktPmdldFBhcmFtVHlwZShBcmdObyk7CisgICAgYXJnc1tBcmdOb10gPSBmZmlUeXBlRm9yKEFyZ1R5KTsKKyAgICBBcmdCeXRlcyArPSBURC0+Z2V0VHlwZVN0b3JlU2l6ZShBcmdUeSk7CisgIH0KKworICBTbWFsbFZlY3Rvcjx1aW50OF90LCAxMjg+IEFyZ0RhdGE7CisgIEFyZ0RhdGEucmVzaXplKEFyZ0J5dGVzKTsKKyAgdWludDhfdCAqQXJnRGF0YVB0ciA9IEFyZ0RhdGEuZGF0YSgpOworICBTbWFsbFZlY3Rvcjx2b2lkKiwgMTY+IHZhbHVlcyhOdW1BcmdzKTsKKyAgZm9yIChGdW5jdGlvbjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEEgPSBGLT5hcmdfYmVnaW4oKSwgRSA9IEYtPmFyZ19lbmQoKTsKKyAgICAgICBBICE9IEU7ICsrQSkgeworICAgIGNvbnN0IHVuc2lnbmVkIEFyZ05vID0gQS0+Z2V0QXJnTm8oKTsKKyAgICBjb25zdCBUeXBlICpBcmdUeSA9IEZUeS0+Z2V0UGFyYW1UeXBlKEFyZ05vKTsKKyAgICB2YWx1ZXNbQXJnTm9dID0gZmZpVmFsdWVGb3IoQXJnVHksIEFyZ1ZhbHNbQXJnTm9dLCBBcmdEYXRhUHRyKTsKKyAgICBBcmdEYXRhUHRyICs9IFRELT5nZXRUeXBlU3RvcmVTaXplKEFyZ1R5KTsKKyAgfQorCisgIGNvbnN0IFR5cGUgKlJldFR5ID0gRlR5LT5nZXRSZXR1cm5UeXBlKCk7CisgIGZmaV90eXBlICpydHlwZSA9IGZmaVR5cGVGb3IoUmV0VHkpOworCisgIGlmIChmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCBOdW1BcmdzLCBydHlwZSwgJmFyZ3NbMF0pID09IEZGSV9PSykgeworICAgIFNtYWxsVmVjdG9yPHVpbnQ4X3QsIDEyOD4gcmV0OworICAgIGlmIChSZXRUeS0+Z2V0VHlwZUlEKCkgIT0gVHlwZTo6Vm9pZFR5SUQpCisgICAgICByZXQucmVzaXplKFRELT5nZXRUeXBlU3RvcmVTaXplKFJldFR5KSk7CisgICAgZmZpX2NhbGwoJmNpZiwgRm4sIHJldC5kYXRhKCksIHZhbHVlcy5kYXRhKCkpOworICAgIHN3aXRjaCAoUmV0VHktPmdldFR5cGVJRCgpKSB7CisgICAgICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOgorICAgICAgICBzd2l0Y2ggKGNhc3Q8SW50ZWdlclR5cGU+KFJldFR5KS0+Z2V0Qml0V2lkdGgoKSkgeworICAgICAgICAgIGNhc2UgODogIFJlc3VsdC5JbnRWYWwgPSBBUEludCg4ICwgKihpbnQ4X3QgKikgcmV0LmRhdGEoKSk7IGJyZWFrOworICAgICAgICAgIGNhc2UgMTY6IFJlc3VsdC5JbnRWYWwgPSBBUEludCgxNiwgKihpbnQxNl90KikgcmV0LmRhdGEoKSk7IGJyZWFrOworICAgICAgICAgIGNhc2UgMzI6IFJlc3VsdC5JbnRWYWwgPSBBUEludCgzMiwgKihpbnQzMl90KikgcmV0LmRhdGEoKSk7IGJyZWFrOworICAgICAgICAgIGNhc2UgNjQ6IFJlc3VsdC5JbnRWYWwgPSBBUEludCg2NCwgKihpbnQ2NF90KikgcmV0LmRhdGEoKSk7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6ICAgUmVzdWx0LkZsb2F0VmFsICAgPSAqKGZsb2F0ICopIHJldC5kYXRhKCk7IGJyZWFrOworICAgICAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOiAgUmVzdWx0LkRvdWJsZVZhbCAgPSAqKGRvdWJsZSopIHJldC5kYXRhKCk7IGJyZWFrOworICAgICAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDogUmVzdWx0LlBvaW50ZXJWYWwgPSAqKHZvaWQgKiopIHJldC5kYXRhKCk7IGJyZWFrOworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmIC8vIFVTRV9MSUJGRkkKKworR2VuZXJpY1ZhbHVlIEludGVycHJldGVyOjpjYWxsRXh0ZXJuYWxGdW5jdGlvbihGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+ICZBcmdWYWxzKSB7CisgIFRoZUludGVycHJldGVyID0gdGhpczsKKworICBGdW5jdGlvbnNMb2NrLT5hY3F1aXJlKCk7CisKKyAgLy8gRG8gYSBsb29rdXAgdG8gc2VlIGlmIHRoZSBmdW5jdGlvbiBpcyBpbiBvdXIgY2FjaGUuLi4gdGhpcyBzaG91bGQganVzdCBiZSBhCisgIC8vIGRlZmVycmVkIGFubm90YXRpb24hCisgIHN0ZDo6bWFwPGNvbnN0IEZ1bmN0aW9uICosIEV4RnVuYz46Oml0ZXJhdG9yIEZJID0gRXhwb3J0ZWRGdW5jdGlvbnMtPmZpbmQoRik7CisgIGlmIChFeEZ1bmMgRm4gPSAoRkkgPT0gRXhwb3J0ZWRGdW5jdGlvbnMtPmVuZCgpKSA/IGxvb2t1cEZ1bmN0aW9uKEYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZJLT5zZWNvbmQpIHsKKyAgICBGdW5jdGlvbnNMb2NrLT5yZWxlYXNlKCk7CisgICAgcmV0dXJuIEZuKEYtPmdldEZ1bmN0aW9uVHlwZSgpLCBBcmdWYWxzKTsKKyAgfQorCisjaWZkZWYgVVNFX0xJQkZGSQorICBzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiAqLCBSYXdGdW5jPjo6aXRlcmF0b3IgUkYgPSBSYXdGdW5jdGlvbnMtPmZpbmQoRik7CisgIFJhd0Z1bmMgUmF3Rm47CisgIGlmIChSRiA9PSBSYXdGdW5jdGlvbnMtPmVuZCgpKSB7CisgICAgUmF3Rm4gPSAoUmF3RnVuYykoaW50cHRyX3QpCisgICAgICBzeXM6OkR5bmFtaWNMaWJyYXJ5OjpTZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woRi0+Z2V0TmFtZSgpKTsKKyAgICBpZiAoIVJhd0ZuKQorICAgICAgUmF3Rm4gPSAoUmF3RnVuYykoaW50cHRyX3QpZ2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoRik7CisgICAgaWYgKFJhd0ZuICE9IDApCisgICAgICBSYXdGdW5jdGlvbnMtPmluc2VydChzdGQ6Om1ha2VfcGFpcihGLCBSYXdGbikpOyAgLy8gQ2FjaGUgZm9yIGxhdGVyCisgIH0gZWxzZSB7CisgICAgUmF3Rm4gPSBSRi0+c2Vjb25kOworICB9CisKKyAgRnVuY3Rpb25zTG9jay0+cmVsZWFzZSgpOworCisgIEdlbmVyaWNWYWx1ZSBSZXN1bHQ7CisgIGlmIChSYXdGbiAhPSAwICYmIGZmaUludm9rZShSYXdGbiwgRiwgQXJnVmFscywgZ2V0VGFyZ2V0RGF0YSgpLCBSZXN1bHQpKQorICAgIHJldHVybiBSZXN1bHQ7CisjZW5kaWYgLy8gVVNFX0xJQkZGSQorCisgIGlmIChGLT5nZXROYW1lKCkgPT0gIl9fbWFpbiIpCisgICAgZXJycygpIDw8ICJUcmllZCB0byBleGVjdXRlIGFuIHVua25vd24gZXh0ZXJuYWwgZnVuY3Rpb246ICIKKyAgICAgIDw8IEYtPmdldFR5cGUoKS0+Z2V0RGVzY3JpcHRpb24oKSA8PCAiIF9fbWFpblxuIjsKKyAgZWxzZQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiVHJpZWQgdG8gZXhlY3V0ZSBhbiB1bmtub3duIGV4dGVybmFsIGZ1bmN0aW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICBGLT5nZXRUeXBlKCktPmdldERlc2NyaXB0aW9uKCkgKyAiICIgK0YtPmdldE5hbWUoKSk7CisjaWZuZGVmIFVTRV9MSUJGRkkKKyAgZXJycygpIDw8ICJSZWNvbXBpbGluZyBMTFZNIHdpdGggLS1lbmFibGUtbGliZmZpIG1pZ2h0IGhlbHAuXG4iOworI2VuZGlmCisgIHJldHVybiBHZW5lcmljVmFsdWUoKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIEZ1bmN0aW9ucyAiZXhwb3J0ZWQiIHRvIHRoZSBydW5uaW5nIGFwcGxpY2F0aW9uLi4uCisvLworCisvLyBWaXN1YWwgU3R1ZGlvIHdhcm5zIGFib3V0IHJldHVybmluZyBHZW5lcmljVmFsdWUgaW4gZXh0ZXJuICJDIiBsaW5rYWdlCisjaWZkZWYgX01TQ19WRVIKKyAgICAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQxOTApCisjZW5kaWYKKworZXh0ZXJuICJDIiB7ICAvLyBEb24ndCBhZGQgQysrIG1hbmdsaW5ncyB0byBsbHZtIG1hbmdsaW5nIDopCisKKy8vIHZvaWQgYXRleGl0KEZ1bmN0aW9uKikKK0dlbmVyaWNWYWx1ZSBsbGVfWF9hdGV4aXQoY29uc3QgRnVuY3Rpb25UeXBlICpGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8R2VuZXJpY1ZhbHVlPiAmQXJncykgeworICBhc3NlcnQoQXJncy5zaXplKCkgPT0gMSk7CisgIFRoZUludGVycHJldGVyLT5hZGRBdEV4aXRIYW5kbGVyKChGdW5jdGlvbiopR1ZUT1AoQXJnc1swXSkpOworICBHZW5lcmljVmFsdWUgR1Y7CisgIEdWLkludFZhbCA9IDA7CisgIHJldHVybiBHVjsKK30KKworLy8gdm9pZCBleGl0KGludCkKK0dlbmVyaWNWYWx1ZSBsbGVfWF9leGl0KGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+ICZBcmdzKSB7CisgIFRoZUludGVycHJldGVyLT5leGl0Q2FsbGVkKEFyZ3NbMF0pOworICByZXR1cm4gR2VuZXJpY1ZhbHVlKCk7Cit9CisKKy8vIHZvaWQgYWJvcnQodm9pZCkKK0dlbmVyaWNWYWx1ZSBsbGVfWF9hYm9ydChjb25zdCBGdW5jdGlvblR5cGUgKkZULAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJkFyZ3MpIHsKKyAgLy9GSVhNRTogc2hvdWxkIHdlIHJlcG9ydCBvciByYWlzZSBoZXJlPworICAvL3JlcG9ydF9mYXRhbF9lcnJvcigiSW50ZXJwcmV0ZWQgcHJvZ3JhbSByYWlzZWQgU0lHQUJSVCIpOworICByYWlzZSAoU0lHQUJSVCk7CisgIHJldHVybiBHZW5lcmljVmFsdWUoKTsKK30KKworLy8gaW50IHNwcmludGYoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikgLSBhIHZlcnkgcm91Z2ggaW1wbGVtZW50YXRpb24gdG8gbWFrZQorLy8gb3V0cHV0IHVzZWZ1bC4KK0dlbmVyaWNWYWx1ZSBsbGVfWF9zcHJpbnRmKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+ICZBcmdzKSB7CisgIGNoYXIgKk91dHB1dEJ1ZmZlciA9IChjaGFyICopR1ZUT1AoQXJnc1swXSk7CisgIGNvbnN0IGNoYXIgKkZtdFN0ciA9IChjb25zdCBjaGFyICopR1ZUT1AoQXJnc1sxXSk7CisgIHVuc2lnbmVkIEFyZ05vID0gMjsKKworICAvLyBwcmludGYgc2hvdWxkIHJldHVybiAjIGNoYXJzIHByaW50ZWQuICBUaGlzIGlzIGNvbXBsZXRlbHkgaW5jb3JyZWN0LCBidXQKKyAgLy8gY2xvc2UgZW5vdWdoIGZvciBub3cuCisgIEdlbmVyaWNWYWx1ZSBHVjsKKyAgR1YuSW50VmFsID0gQVBJbnQoMzIsIHN0cmxlbihGbXRTdHIpKTsKKyAgd2hpbGUgKDEpIHsKKyAgICBzd2l0Y2ggKCpGbXRTdHIpIHsKKyAgICBjYXNlIDA6IHJldHVybiBHVjsgICAgICAgICAgICAgLy8gTnVsbCB0ZXJtaW5hdG9yLi4uCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBub25zcGVjaWFsIGNoYXJhY3RlcgorICAgICAgc3ByaW50ZihPdXRwdXRCdWZmZXIrKywgIiVjIiwgKkZtdFN0cisrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xcJzogeyAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZXNjYXBlIGNvZGVzCisgICAgICBzcHJpbnRmKE91dHB1dEJ1ZmZlciwgIiVjJWMiLCAqRm10U3RyLCAqKEZtdFN0cisxKSk7CisgICAgICBGbXRTdHIgKz0gMjsgT3V0cHV0QnVmZmVyICs9IDI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnJSc6IHsgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBmb3JtYXQgc3BlY2lmaWVycworICAgICAgY2hhciBGbXRCdWZbMTAwXSA9ICIiLCBCdWZmZXJbMTAwMF0gPSAiIjsKKyAgICAgIGNoYXIgKkZCID0gRm10QnVmOworICAgICAgKkZCKysgPSAqRm10U3RyKys7CisgICAgICBjaGFyIExhc3QgPSAqRkIrKyA9ICpGbXRTdHIrKzsKKyAgICAgIHVuc2lnbmVkIEhvd0xvbmcgPSAwOworICAgICAgd2hpbGUgKExhc3QgIT0gJ2MnICYmIExhc3QgIT0gJ2QnICYmIExhc3QgIT0gJ2knICYmIExhc3QgIT0gJ3UnICYmCisgICAgICAgICAgICAgTGFzdCAhPSAnbycgJiYgTGFzdCAhPSAneCcgJiYgTGFzdCAhPSAnWCcgJiYgTGFzdCAhPSAnZScgJiYKKyAgICAgICAgICAgICBMYXN0ICE9ICdFJyAmJiBMYXN0ICE9ICdnJyAmJiBMYXN0ICE9ICdHJyAmJiBMYXN0ICE9ICdmJyAmJgorICAgICAgICAgICAgIExhc3QgIT0gJ3AnICYmIExhc3QgIT0gJ3MnICYmIExhc3QgIT0gJyUnKSB7CisgICAgICAgIGlmIChMYXN0ID09ICdsJyB8fCBMYXN0ID09ICdMJykgSG93TG9uZysrOyAgLy8gS2VlcCB0cmFjayBvZiBsJ3MKKyAgICAgICAgTGFzdCA9ICpGQisrID0gKkZtdFN0cisrOworICAgICAgfQorICAgICAgKkZCID0gMDsKKworICAgICAgc3dpdGNoIChMYXN0KSB7CisgICAgICBjYXNlICclJzoKKyAgICAgICAgbWVtY3B5KEJ1ZmZlciwgIiUiLCAyKTsgYnJlYWs7CisgICAgICBjYXNlICdjJzoKKyAgICAgICAgc3ByaW50ZihCdWZmZXIsIEZtdEJ1ZiwgdWludDMyX3QoQXJnc1tBcmdObysrXS5JbnRWYWwuZ2V0WkV4dFZhbHVlKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdkJzogY2FzZSAnaSc6CisgICAgICBjYXNlICd1JzogY2FzZSAnbyc6CisgICAgICBjYXNlICd4JzogY2FzZSAnWCc6CisgICAgICAgIGlmIChIb3dMb25nID49IDEpIHsKKyAgICAgICAgICBpZiAoSG93TG9uZyA9PSAxICYmCisgICAgICAgICAgICAgIFRoZUludGVycHJldGVyLT5nZXRUYXJnZXREYXRhKCktPmdldFBvaW50ZXJTaXplSW5CaXRzKCkgPT0gNjQgJiYKKyAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpIDwgc2l6ZW9mKGludDY0X3QpKSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgdXNlICVsbGQgd2l0aCBhIDY0IGJpdCBhcmd1bWVudCBiZWNhdXNlIHdlIG1pZ2h0IGJlCisgICAgICAgICAgICAvLyBjb21waWxpbmcgTExJIG9uIGEgMzIgYml0IGNvbXBpbGVyLgorICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSA9IHN0cmxlbihGbXRCdWYpOworICAgICAgICAgICAgRm10QnVmW1NpemVdID0gRm10QnVmW1NpemUtMV07CisgICAgICAgICAgICBGbXRCdWZbU2l6ZSsxXSA9IDA7CisgICAgICAgICAgICBGbXRCdWZbU2l6ZS0xXSA9ICdsJzsKKyAgICAgICAgICB9CisgICAgICAgICAgc3ByaW50ZihCdWZmZXIsIEZtdEJ1ZiwgQXJnc1tBcmdObysrXS5JbnRWYWwuZ2V0WkV4dFZhbHVlKCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBzcHJpbnRmKEJ1ZmZlciwgRm10QnVmLHVpbnQzMl90KEFyZ3NbQXJnTm8rK10uSW50VmFsLmdldFpFeHRWYWx1ZSgpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnZSc6IGNhc2UgJ0UnOiBjYXNlICdnJzogY2FzZSAnRyc6IGNhc2UgJ2YnOgorICAgICAgICBzcHJpbnRmKEJ1ZmZlciwgRm10QnVmLCBBcmdzW0FyZ05vKytdLkRvdWJsZVZhbCk7IGJyZWFrOworICAgICAgY2FzZSAncCc6CisgICAgICAgIHNwcmludGYoQnVmZmVyLCBGbXRCdWYsICh2b2lkKilHVlRPUChBcmdzW0FyZ05vKytdKSk7IGJyZWFrOworICAgICAgY2FzZSAncyc6CisgICAgICAgIHNwcmludGYoQnVmZmVyLCBGbXRCdWYsIChjaGFyKilHVlRPUChBcmdzW0FyZ05vKytdKSk7IGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJycygpIDw8ICI8dW5rbm93biBwcmludGYgY29kZSAnIiA8PCAqRm10U3RyIDw8ICInIT4iOworICAgICAgICBBcmdObysrOyBicmVhazsKKyAgICAgIH0KKyAgICAgIHNpemVfdCBMZW4gPSBzdHJsZW4oQnVmZmVyKTsKKyAgICAgIG1lbWNweShPdXRwdXRCdWZmZXIsIEJ1ZmZlciwgTGVuICsgMSk7CisgICAgICBPdXRwdXRCdWZmZXIgKz0gTGVuOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBHVjsKK30KKworLy8gaW50IHByaW50Zihjb25zdCBjaGFyICosIC4uLikgLSBhIHZlcnkgcm91Z2ggaW1wbGVtZW50YXRpb24gdG8gbWFrZSBvdXRwdXQKKy8vIHVzZWZ1bC4KK0dlbmVyaWNWYWx1ZSBsbGVfWF9wcmludGYoY29uc3QgRnVuY3Rpb25UeXBlICpGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8R2VuZXJpY1ZhbHVlPiAmQXJncykgeworICBjaGFyIEJ1ZmZlclsxMDAwMF07CisgIHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gTmV3QXJnczsKKyAgTmV3QXJncy5wdXNoX2JhY2soUFRPR1YoKHZvaWQqKSZCdWZmZXJbMF0pKTsKKyAgTmV3QXJncy5pbnNlcnQoTmV3QXJncy5lbmQoKSwgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpKTsKKyAgR2VuZXJpY1ZhbHVlIEdWID0gbGxlX1hfc3ByaW50ZihGVCwgTmV3QXJncyk7CisgIG91dHMoKSA8PCBCdWZmZXI7CisgIHJldHVybiBHVjsKK30KKworLy8gaW50IHNzY2FuZihjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitHZW5lcmljVmFsdWUgbGxlX1hfc3NjYW5mKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJmFyZ3MpIHsKKyAgYXNzZXJ0KGFyZ3Muc2l6ZSgpIDwgMTAgJiYgIk9ubHkgaGFuZGxlIHVwIHRvIDEwIGFyZ3MgdG8gc3NjYW5mIHJpZ2h0IG5vdyEiKTsKKworICBjaGFyICpBcmdzWzEwXTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyArK2kpCisgICAgQXJnc1tpXSA9IChjaGFyKilHVlRPUChhcmdzW2ldKTsKKworICBHZW5lcmljVmFsdWUgR1Y7CisgIEdWLkludFZhbCA9IEFQSW50KDMyLCBzc2NhbmYoQXJnc1swXSwgQXJnc1sxXSwgQXJnc1syXSwgQXJnc1szXSwgQXJnc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3NbNV0sIEFyZ3NbNl0sIEFyZ3NbN10sIEFyZ3NbOF0sIEFyZ3NbOV0pKTsKKyAgcmV0dXJuIEdWOworfQorCisvLyBpbnQgc2NhbmYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworR2VuZXJpY1ZhbHVlIGxsZV9YX3NjYW5mKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8R2VuZXJpY1ZhbHVlPiAmYXJncykgeworICBhc3NlcnQoYXJncy5zaXplKCkgPCAxMCAmJiAiT25seSBoYW5kbGUgdXAgdG8gMTAgYXJncyB0byBzY2FuZiByaWdodCBub3chIik7CisKKyAgY2hhciAqQXJnc1sxMF07CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgKytpKQorICAgIEFyZ3NbaV0gPSAoY2hhciopR1ZUT1AoYXJnc1tpXSk7CisKKyAgR2VuZXJpY1ZhbHVlIEdWOworICBHVi5JbnRWYWwgPSBBUEludCgzMiwgc2NhbmYoIEFyZ3NbMF0sIEFyZ3NbMV0sIEFyZ3NbMl0sIEFyZ3NbM10sIEFyZ3NbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBBcmdzWzVdLCBBcmdzWzZdLCBBcmdzWzddLCBBcmdzWzhdLCBBcmdzWzldKSk7CisgIHJldHVybiBHVjsKK30KKworLy8gaW50IGZwcmludGYoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLikgLSBhIHZlcnkgcm91Z2ggaW1wbGVtZW50YXRpb24gdG8gbWFrZQorLy8gb3V0cHV0IHVzZWZ1bC4KK0dlbmVyaWNWYWx1ZSBsbGVfWF9mcHJpbnRmKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+ICZBcmdzKSB7CisgIGFzc2VydChBcmdzLnNpemUoKSA+PSAyKTsKKyAgY2hhciBCdWZmZXJbMTAwMDBdOworICBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+IE5ld0FyZ3M7CisgIE5ld0FyZ3MucHVzaF9iYWNrKFBUT0dWKEJ1ZmZlcikpOworICBOZXdBcmdzLmluc2VydChOZXdBcmdzLmVuZCgpLCBBcmdzLmJlZ2luKCkrMSwgQXJncy5lbmQoKSk7CisgIEdlbmVyaWNWYWx1ZSBHViA9IGxsZV9YX3NwcmludGYoRlQsIE5ld0FyZ3MpOworCisgIGZwdXRzKEJ1ZmZlciwgKEZJTEUgKikgR1ZUT1AoQXJnc1swXSkpOworICByZXR1cm4gR1Y7Cit9CisKK30gLy8gRW5kIGV4dGVybiAiQyIKKworLy8gRG9uZSB3aXRoIGV4dGVybmFsczsgdHVybiB0aGUgd2FybmluZyBiYWNrIG9uCisjaWZkZWYgX01TQ19WRVIKKyAgICAjcHJhZ21hIHdhcm5pbmcoZGVmYXVsdDogNDE5MCkKKyNlbmRpZgorCisKK3ZvaWQgSW50ZXJwcmV0ZXI6OmluaXRpYWxpemVFeHRlcm5hbEZ1bmN0aW9ucygpIHsKKyAgc3lzOjpTY29wZWRMb2NrIFdyaXRlcigqRnVuY3Rpb25zTG9jayk7CisgIEZ1bmNOYW1lc1sibGxlX1hfYXRleGl0Il0gICAgICAgPSBsbGVfWF9hdGV4aXQ7CisgIEZ1bmNOYW1lc1sibGxlX1hfZXhpdCJdICAgICAgICAgPSBsbGVfWF9leGl0OworICBGdW5jTmFtZXNbImxsZV9YX2Fib3J0Il0gICAgICAgID0gbGxlX1hfYWJvcnQ7CisKKyAgRnVuY05hbWVzWyJsbGVfWF9wcmludGYiXSAgICAgICA9IGxsZV9YX3ByaW50ZjsKKyAgRnVuY05hbWVzWyJsbGVfWF9zcHJpbnRmIl0gICAgICA9IGxsZV9YX3NwcmludGY7CisgIEZ1bmNOYW1lc1sibGxlX1hfc3NjYW5mIl0gICAgICAgPSBsbGVfWF9zc2NhbmY7CisgIEZ1bmNOYW1lc1sibGxlX1hfc2NhbmYiXSAgICAgICAgPSBsbGVfWF9zY2FuZjsKKyAgRnVuY05hbWVzWyJsbGVfWF9mcHJpbnRmIl0gICAgICA9IGxsZV9YX2ZwcmludGY7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0ludGVycHJldGVyL0ludGVycHJldGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTM0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0ludGVycHJldGVyL0ludGVycHJldGVyLmNwcApAQCAtMCwwICsxLDk4IEBACisvLz09PS0gSW50ZXJwcmV0ZXIuY3BwIC0gVG9wLUxldmVsIExMVk0gSW50ZXJwcmV0ZXIgSW1wbGVtZW50YXRpb24gLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSB0b3AtbGV2ZWwgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIExMVk0gaW50ZXJwcmV0ZXIuCisvLyBUaGlzIGludGVycHJldGVyIGlzIGRlc2lnbmVkIHRvIGJlIGEgdmVyeSBzaW1wbGUsIHBvcnRhYmxlLCBpbmVmZmljaWVudAorLy8gaW50ZXJwcmV0ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkludGVycHJldGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0ludHJpbnNpY0xvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgPGNzdHJpbmc+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworc3RhdGljIHN0cnVjdCBSZWdpc3RlckludGVycCB7CisgIFJlZ2lzdGVySW50ZXJwKCkgeyBJbnRlcnByZXRlcjo6UmVnaXN0ZXIoKTsgfQorfSBJbnRlcnBSZWdpc3RyYXRvcjsKKworfQorCitleHRlcm4gIkMiIHZvaWQgTExWTUxpbmtJbkludGVycHJldGVyKCkgeyB9CisKKy8vLyBjcmVhdGUgLSBDcmVhdGUgYSBuZXcgaW50ZXJwcmV0ZXIgb2JqZWN0LiAgVGhpcyBjYW4gbmV2ZXIgZmFpbC4KKy8vLworRXhlY3V0aW9uRW5naW5lICpJbnRlcnByZXRlcjo6Y3JlYXRlKE1vZHVsZSAqTSwgc3RkOjpzdHJpbmcqIEVyclN0cikgeworICAvLyBUZWxsIHRoaXMgTW9kdWxlIHRvIG1hdGVyaWFsaXplIGV2ZXJ5dGhpbmcgYW5kIHJlbGVhc2UgdGhlIEdWTWF0ZXJpYWxpemVyLgorICBpZiAoTS0+TWF0ZXJpYWxpemVBbGxQZXJtYW5lbnRseShFcnJTdHIpKQorICAgIC8vIFdlIGdvdCBhbiBlcnJvciwganVzdCByZXR1cm4gMAorICAgIHJldHVybiAwOworCisgIHJldHVybiBuZXcgSW50ZXJwcmV0ZXIoTSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnRlcnByZXRlciBjdG9yIC0gSW5pdGlhbGl6ZSBzdHVmZgorLy8KK0ludGVycHJldGVyOjpJbnRlcnByZXRlcihNb2R1bGUgKk0pCisgIDogRXhlY3V0aW9uRW5naW5lKE0pLCBURChNKSB7CisgICAgICAKKyAgbWVtc2V0KCZFeGl0VmFsdWUuVW50eXBlZCwgMCwgc2l6ZW9mKEV4aXRWYWx1ZS5VbnR5cGVkKSk7CisgIHNldFRhcmdldERhdGEoJlREKTsKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgImJhY2tlbmQiCisgIGluaXRpYWxpemVFeGVjdXRpb25FbmdpbmUoKTsKKyAgaW5pdGlhbGl6ZUV4dGVybmFsRnVuY3Rpb25zKCk7CisgIGVtaXRHbG9iYWxzKCk7CisKKyAgSUwgPSBuZXcgSW50cmluc2ljTG93ZXJpbmcoVEQpOworfQorCitJbnRlcnByZXRlcjo6fkludGVycHJldGVyKCkgeworICBkZWxldGUgSUw7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OnJ1bkF0RXhpdEhhbmRsZXJzICgpIHsKKyAgd2hpbGUgKCFBdEV4aXRIYW5kbGVycy5lbXB0eSgpKSB7CisgICAgY2FsbEZ1bmN0aW9uKEF0RXhpdEhhbmRsZXJzLmJhY2soKSwgc3RkOjp2ZWN0b3I8R2VuZXJpY1ZhbHVlPigpKTsKKyAgICBBdEV4aXRIYW5kbGVycy5wb3BfYmFjaygpOworICAgIHJ1bigpOworICB9Cit9CisKKy8vLyBydW4gLSBTdGFydCBleGVjdXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMuCisvLy8KK0dlbmVyaWNWYWx1ZQorSW50ZXJwcmV0ZXI6OnJ1bkZ1bmN0aW9uKEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJkFyZ1ZhbHVlcykgeworICBhc3NlcnQgKEYgJiYgIkZ1bmN0aW9uICpGIHdhcyBudWxsIGF0IGVudHJ5IHRvIHJ1bigpIik7CisKKyAgLy8gVHJ5IGV4dHJhIGhhcmQgbm90IHRvIHBhc3MgZXh0cmEgYXJncyB0byBhIGZ1bmN0aW9uIHRoYXQgaXNuJ3QKKyAgLy8gZXhwZWN0aW5nIHRoZW0uICBDIHByb2dyYW1tZXJzIGZyZXF1ZW50bHkgYmVuZCB0aGUgcnVsZXMgYW5kCisgIC8vIGRlY2xhcmUgbWFpbigpIHdpdGggZmV3ZXIgcGFyYW1ldGVycyB0aGFuIGl0IGFjdHVhbGx5IGdldHMKKyAgLy8gcGFzc2VkLCBhbmQgdGhlIGludGVycHJldGVyIGJhcmZzIGlmIHlvdSBwYXNzIGEgZnVuY3Rpb24gbW9yZQorICAvLyBwYXJhbWV0ZXJzIHRoYW4gaXQgaXMgZGVjbGFyZWQgdG8gdGFrZS4gVGhpcyBkb2VzIG5vdCBhdHRlbXB0IHRvCisgIC8vIHRha2UgaW50byBhY2NvdW50IGdyYXR1aXRvdXMgZGlmZmVyZW5jZXMgaW4gZGVjbGFyZWQgdHlwZXMsCisgIC8vIHRob3VnaC4KKyAgc3RkOjp2ZWN0b3I8R2VuZXJpY1ZhbHVlPiBBY3R1YWxBcmdzOworICBjb25zdCB1bnNpZ25lZCBBcmdDb3VudCA9IEYtPmdldEZ1bmN0aW9uVHlwZSgpLT5nZXROdW1QYXJhbXMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFyZ0NvdW50OyArK2kpCisgICAgQWN0dWFsQXJncy5wdXNoX2JhY2soQXJnVmFsdWVzW2ldKTsKKworICAvLyBTZXQgdXAgdGhlIGZ1bmN0aW9uIGNhbGwuCisgIGNhbGxGdW5jdGlvbihGLCBBY3R1YWxBcmdzKTsKKworICAvLyBTdGFydCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uLgorICBydW4oKTsKKworICByZXR1cm4gRXhpdFZhbHVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci9JbnRlcnByZXRlci5oIGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci9JbnRlcnByZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGU5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0ludGVycHJldGVyL0ludGVycHJldGVyLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8vPT09LS0gSW50ZXJwcmV0ZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcnByZXRlciBzdHJ1Y3R1cmUKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMSV9JTlRFUlBSRVRFUl9ICisjZGVmaW5lIExMSV9JTlRFUlBSRVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvR2VuZXJpY1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0luc3RWaXNpdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEludHJpbnNpY0xvd2VyaW5nOworc3RydWN0IEZ1bmN0aW9uSW5mbzsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3I7CitjbGFzcyBDb25zdGFudEV4cHI7Cit0eXBlZGVmIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3I8VXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3I+IGdlcF90eXBlX2l0ZXJhdG9yOworCisKKy8vIEFsbG9jYUhvbGRlciAtIE9iamVjdCB0byB0cmFjayBhbGwgb2YgdGhlIGJsb2NrcyBvZiBtZW1vcnkgYWxsb2NhdGVkIGJ5CisvLyBhbGxvY2EuICBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCB0aGlzIG9iamVjdCBpcyBwb3BwZWQgb2ZmIHRoZSBleGVjdXRpb24KKy8vIHN0YWNrLCB3aGljaCBjYXVzZXMgdGhlIGR0b3IgdG8gYmUgcnVuLCB3aGljaCBmcmVlcyBhbGwgdGhlIGFsbG9jYSdkIG1lbW9yeS4KKy8vCitjbGFzcyBBbGxvY2FIb2xkZXIgeworICBmcmllbmQgY2xhc3MgQWxsb2NhSG9sZGVySGFuZGxlOworICBzdGQ6OnZlY3Rvcjx2b2lkKj4gQWxsb2NhdGlvbnM7CisgIHVuc2lnbmVkIFJlZkNudDsKK3B1YmxpYzoKKyAgQWxsb2NhSG9sZGVyKCkgOiBSZWZDbnQoMCkge30KKyAgdm9pZCBhZGQodm9pZCAqbWVtKSB7IEFsbG9jYXRpb25zLnB1c2hfYmFjayhtZW0pOyB9CisgIH5BbGxvY2FIb2xkZXIoKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFsbG9jYXRpb25zLnNpemUoKTsgKytpKQorICAgICAgZnJlZShBbGxvY2F0aW9uc1tpXSk7CisgIH0KK307CisKKy8vIEFsbG9jYUhvbGRlckhhbmRsZSBnaXZlcyBBbGxvY2FIb2xkZXIgdmFsdWUgc2VtYW50aWNzIHNvIHdlIGNhbiBzdGljayBpdCBpbnRvCisvLyBhIHZlY3Rvci4uLgorLy8KK2NsYXNzIEFsbG9jYUhvbGRlckhhbmRsZSB7CisgIEFsbG9jYUhvbGRlciAqSDsKK3B1YmxpYzoKKyAgQWxsb2NhSG9sZGVySGFuZGxlKCkgOiBIKG5ldyBBbGxvY2FIb2xkZXIoKSkgeyBILT5SZWZDbnQrKzsgfQorICBBbGxvY2FIb2xkZXJIYW5kbGUoY29uc3QgQWxsb2NhSG9sZGVySGFuZGxlICZBSCkgOiBIKEFILkgpIHsgSC0+UmVmQ250Kys7IH0KKyAgfkFsbG9jYUhvbGRlckhhbmRsZSgpIHsgaWYgKC0tSC0+UmVmQ250ID09IDApIGRlbGV0ZSBIOyB9CisKKyAgdm9pZCBhZGQodm9pZCAqbWVtKSB7IEgtPmFkZChtZW0pOyB9Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gVmFsdWVQbGFuZVR5OworCisvLyBFeGVjdXRpb25Db250ZXh0IHN0cnVjdCAtIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgb25lIHN0YWNrIGZyYW1lIGN1cnJlbnRseQorLy8gZXhlY3V0aW5nLgorLy8KK3N0cnVjdCBFeGVjdXRpb25Db250ZXh0IHsKKyAgRnVuY3Rpb24gICAgICAgICAgICAgKkN1ckZ1bmN0aW9uOy8vIFRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGZ1bmN0aW9uCisgIEJhc2ljQmxvY2sgICAgICAgICAgICpDdXJCQjsgICAgICAvLyBUaGUgY3VycmVudGx5IGV4ZWN1dGluZyBCQgorICBCYXNpY0Jsb2NrOjppdGVyYXRvciAgQ3VySW5zdDsgICAgLy8gVGhlIG5leHQgaW5zdHJ1Y3Rpb24gdG8gZXhlY3V0ZQorICBzdGQ6Om1hcDxWYWx1ZSAqLCBHZW5lcmljVmFsdWU+IFZhbHVlczsgLy8gTExWTSB2YWx1ZXMgdXNlZCBpbiB0aGlzIGludm9jYXRpb24KKyAgc3RkOjp2ZWN0b3I8R2VuZXJpY1ZhbHVlPiAgVmFyQXJnczsgLy8gVmFsdWVzIHBhc3NlZCB0aHJvdWdoIGFuIGVsbGlwc2lzCisgIENhbGxTaXRlICAgICAgICAgICAgIENhbGxlcjsgICAgIC8vIEhvbGRzIHRoZSBjYWxsIHRoYXQgY2FsbGVkIHN1YmZyYW1lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTlVMTCBpZiBtYWluIGZ1bmMgb3IgZGVidWdnZXIgaW52b2tlZCBmbgorICBBbGxvY2FIb2xkZXJIYW5kbGUgICAgQWxsb2NhczsgICAgLy8gVHJhY2sgbWVtb3J5IGFsbG9jYXRlZCBieSBhbGxvY2EKK307CisKKy8vIEludGVycHJldGVyIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBlbnRpcmV0eSBvZiB0aGUgaW50ZXJwcmV0ZXIuCisvLworY2xhc3MgSW50ZXJwcmV0ZXIgOiBwdWJsaWMgRXhlY3V0aW9uRW5naW5lLCBwdWJsaWMgSW5zdFZpc2l0b3I8SW50ZXJwcmV0ZXI+IHsKKyAgR2VuZXJpY1ZhbHVlIEV4aXRWYWx1ZTsgICAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9uCisgIFRhcmdldERhdGEgVEQ7CisgIEludHJpbnNpY0xvd2VyaW5nICpJTDsKKworICAvLyBUaGUgcnVudGltZSBzdGFjayBvZiBleGVjdXRpbmcgY29kZS4gIFRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIHRoZSBjdXJyZW50CisgIC8vIGZ1bmN0aW9uIHJlY29yZC4KKyAgc3RkOjp2ZWN0b3I8RXhlY3V0aW9uQ29udGV4dD4gRUNTdGFjazsKKworICAvLyBBdEV4aXRIYW5kbGVycyAtIExpc3Qgb2YgZnVuY3Rpb25zIHRvIGNhbGwgd2hlbiB0aGUgcHJvZ3JhbSBleGl0cywKKyAgLy8gcmVnaXN0ZXJlZCB3aXRoIHRoZSBhdGV4aXQoKSBsaWJyYXJ5IGZ1bmN0aW9uLgorICBzdGQ6OnZlY3RvcjxGdW5jdGlvbio+IEF0RXhpdEhhbmRsZXJzOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEludGVycHJldGVyKE1vZHVsZSAqTSk7CisgIH5JbnRlcnByZXRlcigpOworCisgIC8vLyBydW5BdEV4aXRIYW5kbGVycyAtIFJ1biBhbnkgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgYnkgdGhlIHByb2dyYW0ncyBjYWxscyB0bworICAvLy8gYXRleGl0KDMpLCB3aGljaCB3ZSBpbnRlcmNlcHQgYW5kIHN0b3JlIGluIEF0RXhpdEhhbmRsZXJzLgorICAvLy8KKyAgdm9pZCBydW5BdEV4aXRIYW5kbGVycygpOworCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyKCkgeworICAgIEludGVycEN0b3IgPSBjcmVhdGU7CisgIH0KKyAgCisgIC8vLyBjcmVhdGUgLSBDcmVhdGUgYW4gaW50ZXJwcmV0ZXIgRXhlY3V0aW9uRW5naW5lLiBUaGlzIGNhbiBuZXZlciBmYWlsLgorICAvLy8KKyAgc3RhdGljIEV4ZWN1dGlvbkVuZ2luZSAqY3JlYXRlKE1vZHVsZSAqTSwgc3RkOjpzdHJpbmcgKkVycm9yU3RyID0gMCk7CisKKyAgLy8vIHJ1biAtIFN0YXJ0IGV4ZWN1dGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gYW5kIGFyZ3VtZW50cy4KKyAgLy8vCisgIHZpcnR1YWwgR2VuZXJpY1ZhbHVlIHJ1bkZ1bmN0aW9uKEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+ICZBcmdWYWx1ZXMpOworCisgIC8vLyByZWNvbXBpbGVBbmRSZWxpbmtGdW5jdGlvbiAtIEZvciB0aGUgaW50ZXJwcmV0ZXIsIGZ1bmN0aW9ucyBhcmUgYWx3YXlzCisgIC8vLyB1cC10by1kYXRlLgorICAvLy8KKyAgdmlydHVhbCB2b2lkICpyZWNvbXBpbGVBbmRSZWxpbmtGdW5jdGlvbihGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBnZXRQb2ludGVyVG9GdW5jdGlvbihGKTsKKyAgfQorCisgIC8vLyBmcmVlTWFjaGluZUNvZGVGb3JGdW5jdGlvbiAtIFRoZSBpbnRlcnByZXRlciBkb2VzIG5vdCBnZW5lcmF0ZSBhbnkgY29kZS4KKyAgLy8vCisgIHZvaWQgZnJlZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24oRnVuY3Rpb24gKkYpIHsgfQorCisgIC8vIE1ldGhvZHMgdXNlZCB0byBleGVjdXRlIGNvZGU6CisgIC8vIFBsYWNlIGEgY2FsbCBvbiB0aGUgc3RhY2sKKyAgdm9pZCBjYWxsRnVuY3Rpb24oRnVuY3Rpb24gKkYsIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJkFyZ1ZhbHMpOworICB2b2lkIHJ1bigpOyAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIGluc3RydWN0aW9ucyB1bnRpbCBub3RoaW5nIGxlZnQgdG8gZG8KKworICAvLyBPcGNvZGUgSW1wbGVtZW50YXRpb25zCisgIHZvaWQgdmlzaXRSZXR1cm5JbnN0KFJldHVybkluc3QgJkkpOworICB2b2lkIHZpc2l0QnJhbmNoSW5zdChCcmFuY2hJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdFN3aXRjaEluc3QoU3dpdGNoSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRJbmRpcmVjdEJySW5zdChJbmRpcmVjdEJySW5zdCAmSSk7CisKKyAgdm9pZCB2aXNpdEJpbmFyeU9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgdm9pZCB2aXNpdElDbXBJbnN0KElDbXBJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdEZDbXBJbnN0KEZDbXBJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdEFsbG9jYUluc3QoQWxsb2NhSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRMb2FkSW5zdChMb2FkSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRTdG9yZUluc3QoU3RvcmVJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdEdldEVsZW1lbnRQdHJJbnN0KEdldEVsZW1lbnRQdHJJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdFBISU5vZGUoUEhJTm9kZSAmUE4pIHsgCisgICAgbGx2bV91bnJlYWNoYWJsZSgiUEhJIG5vZGVzIGFscmVhZHkgaGFuZGxlZCEiKTsgCisgIH0KKyAgdm9pZCB2aXNpdFRydW5jSW5zdChUcnVuY0luc3QgJkkpOworICB2b2lkIHZpc2l0WkV4dEluc3QoWkV4dEluc3QgJkkpOworICB2b2lkIHZpc2l0U0V4dEluc3QoU0V4dEluc3QgJkkpOworICB2b2lkIHZpc2l0RlBUcnVuY0luc3QoRlBUcnVuY0luc3QgJkkpOworICB2b2lkIHZpc2l0RlBFeHRJbnN0KEZQRXh0SW5zdCAmSSk7CisgIHZvaWQgdmlzaXRVSVRvRlBJbnN0KFVJVG9GUEluc3QgJkkpOworICB2b2lkIHZpc2l0U0lUb0ZQSW5zdChTSVRvRlBJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdEZQVG9VSUluc3QoRlBUb1VJSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRGUFRvU0lJbnN0KEZQVG9TSUluc3QgJkkpOworICB2b2lkIHZpc2l0UHRyVG9JbnRJbnN0KFB0clRvSW50SW5zdCAmSSk7CisgIHZvaWQgdmlzaXRJbnRUb1B0ckluc3QoSW50VG9QdHJJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdEJpdENhc3RJbnN0KEJpdENhc3RJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdFNlbGVjdEluc3QoU2VsZWN0SW5zdCAmSSk7CisKKworICB2b2lkIHZpc2l0Q2FsbFNpdGUoQ2FsbFNpdGUgQ1MpOworICB2b2lkIHZpc2l0Q2FsbEluc3QoQ2FsbEluc3QgJkkpIHsgdmlzaXRDYWxsU2l0ZSAoQ2FsbFNpdGUgKCZJKSk7IH0KKyAgdm9pZCB2aXNpdEludm9rZUluc3QoSW52b2tlSW5zdCAmSSkgeyB2aXNpdENhbGxTaXRlIChDYWxsU2l0ZSAoJkkpKTsgfQorICB2b2lkIHZpc2l0VW53aW5kSW5zdChVbndpbmRJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdFVucmVhY2hhYmxlSW5zdChVbnJlYWNoYWJsZUluc3QgJkkpOworCisgIHZvaWQgdmlzaXRTaGwoQmluYXJ5T3BlcmF0b3IgJkkpOworICB2b2lkIHZpc2l0TFNocihCaW5hcnlPcGVyYXRvciAmSSk7CisgIHZvaWQgdmlzaXRBU2hyKEJpbmFyeU9wZXJhdG9yICZJKTsKKworICB2b2lkIHZpc2l0VkFBcmdJbnN0KFZBQXJnSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAmSSkgeworICAgIGVycnMoKSA8PCBJOworICAgIGxsdm1fdW5yZWFjaGFibGUoIkluc3RydWN0aW9uIG5vdCBpbnRlcnByZXRhYmxlIHlldCEiKTsKKyAgfQorCisgIEdlbmVyaWNWYWx1ZSBjYWxsRXh0ZXJuYWxGdW5jdGlvbihGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJkFyZ1ZhbHMpOworICB2b2lkIGV4aXRDYWxsZWQoR2VuZXJpY1ZhbHVlIEdWKTsKKworICB2b2lkIGFkZEF0RXhpdEhhbmRsZXIoRnVuY3Rpb24gKkYpIHsKKyAgICBBdEV4aXRIYW5kbGVycy5wdXNoX2JhY2soRik7CisgIH0KKworICBHZW5lcmljVmFsdWUgKmdldEZpcnN0VmFyQXJnICgpIHsKKyAgICByZXR1cm4gJihFQ1N0YWNrLmJhY2sgKCkuVmFyQXJnc1swXSk7CisgIH0KKworcHJpdmF0ZTogIC8vIEhlbHBlciBmdW5jdGlvbnMKKyAgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVHRVBPcGVyYXRpb24oVmFsdWUgKlB0ciwgZ2VwX3R5cGVfaXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VwX3R5cGVfaXRlcmF0b3IgRSwgRXhlY3V0aW9uQ29udGV4dCAmU0YpOworCisgIC8vIFN3aXRjaFRvTmV3QmFzaWNCbG9jayAtIFN0YXJ0IGV4ZWN1dGlvbiBpbiBhIG5ldyBiYXNpYyBibG9jayBhbmQgcnVuIGFueQorICAvLyBQSEkgbm9kZXMgaW4gdGhlIHRvcCBvZiB0aGUgYmxvY2suICBUaGlzIGlzIHVzZWQgZm9yIGludHJhcHJvY2VkdXJhbAorICAvLyBjb250cm9sIGZsb3cuCisgIC8vCisgIHZvaWQgU3dpdGNoVG9OZXdCYXNpY0Jsb2NrKEJhc2ljQmxvY2sgKkRlc3QsIEV4ZWN1dGlvbkNvbnRleHQgJlNGKTsKKworICB2b2lkICpnZXRQb2ludGVyVG9GdW5jdGlvbihGdW5jdGlvbiAqRikgeyByZXR1cm4gKHZvaWQqKUY7IH0KKyAgdm9pZCAqZ2V0UG9pbnRlclRvQmFzaWNCbG9jayhCYXNpY0Jsb2NrICpCQikgeyByZXR1cm4gKHZvaWQqKUJCOyB9CisKKyAgdm9pZCBpbml0aWFsaXplRXhlY3V0aW9uRW5naW5lKCkgeyB9CisgIHZvaWQgaW5pdGlhbGl6ZUV4dGVybmFsRnVuY3Rpb25zKCk7CisgIEdlbmVyaWNWYWx1ZSBnZXRDb25zdGFudEV4cHJWYWx1ZShDb25zdGFudEV4cHIgKkNFLCBFeGVjdXRpb25Db250ZXh0ICZTRik7CisgIEdlbmVyaWNWYWx1ZSBnZXRPcGVyYW5kVmFsdWUoVmFsdWUgKlYsIEV4ZWN1dGlvbkNvbnRleHQgJlNGKTsKKyAgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVUcnVuY0luc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGKTsKKyAgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVTRXh0SW5zdChWYWx1ZSAqU3JjVmFsLCBjb25zdCBUeXBlICpEc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRpb25Db250ZXh0ICZTRik7CisgIEdlbmVyaWNWYWx1ZSBleGVjdXRlWkV4dEluc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpOworICBHZW5lcmljVmFsdWUgZXhlY3V0ZUZQVHJ1bmNJbnN0KFZhbHVlICpTcmNWYWwsIGNvbnN0IFR5cGUgKkRzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGKTsKKyAgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVGUEV4dEluc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGKTsKKyAgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVGUFRvVUlJbnN0KFZhbHVlICpTcmNWYWwsIGNvbnN0IFR5cGUgKkRzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpOworICBHZW5lcmljVmFsdWUgZXhlY3V0ZUZQVG9TSUluc3QoVmFsdWUgKlNyY1ZhbCwgY29uc3QgVHlwZSAqRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRpb25Db250ZXh0ICZTRik7CisgIEdlbmVyaWNWYWx1ZSBleGVjdXRlVUlUb0ZQSW5zdChWYWx1ZSAqU3JjVmFsLCBjb25zdCBUeXBlICpEc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGKTsKKyAgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVTSVRvRlBJbnN0KFZhbHVlICpTcmNWYWwsIGNvbnN0IFR5cGUgKkRzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpOworICBHZW5lcmljVmFsdWUgZXhlY3V0ZVB0clRvSW50SW5zdChWYWx1ZSAqU3JjVmFsLCBjb25zdCBUeXBlICpEc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpOworICBHZW5lcmljVmFsdWUgZXhlY3V0ZUludFRvUHRySW5zdChWYWx1ZSAqU3JjVmFsLCBjb25zdCBUeXBlICpEc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCAmU0YpOworICBHZW5lcmljVmFsdWUgZXhlY3V0ZUJpdENhc3RJbnN0KFZhbHVlICpTcmNWYWwsIGNvbnN0IFR5cGUgKkRzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgJlNGKTsKKyAgR2VuZXJpY1ZhbHVlIGV4ZWN1dGVDYXN0T3BlcmF0aW9uKEluc3RydWN0aW9uOjpDYXN0T3BzIG9wY29kZSwgVmFsdWUgKlNyY1ZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSwgRXhlY3V0aW9uQ29udGV4dCAmU0YpOworICB2b2lkIHBvcFN0YWNrQW5kUmV0dXJuVmFsdWVUb0NhbGxlcihjb25zdCBUeXBlICpSZXRUeSwgR2VuZXJpY1ZhbHVlIFJlc3VsdCk7CisKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlZjEzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIyM9PT0tIGxpYi9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIvTWFrZWZpbGUgLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNSW50ZXJwcmV0ZXIKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwMjBkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTMgQEAKKyMgVE9ETzogU3VwcG9ydCBvdGhlciBhcmNoaXRlY3R1cmVzLiBTZWUgTWFrZWZpbGUuCithZGRfZGVmaW5pdGlvbnMoLURFTkFCTEVfWDg2X0pJVCkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNSklUCisgIEludGVyY2VwdC5jcHAKKyAgSklULmNwcAorICBKSVREZWJ1Z1JlZ2lzdGVyZXIuY3BwCisgIEpJVER3YXJmRW1pdHRlci5jcHAKKyAgSklURW1pdHRlci5jcHAKKyAgSklUTWVtb3J5TWFuYWdlci5jcHAKKyAgT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyLmNwcAorICBUYXJnZXRTZWxlY3QuY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL0ludGVyY2VwdC5jcHAgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9JbnRlcmNlcHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNjcwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9JbnRlcmNlcHQuY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvLz09PS0tIEludGVyY2VwdC5jcHAgLSBTeXN0ZW0gZnVuY3Rpb24gaW50ZXJjZXB0aW9uIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIElmIGEgZnVuY3Rpb24gY2FsbCBvY2N1cnMgdG8gYW4gZXh0ZXJuYWwgZnVuY3Rpb24sIHRoZSBKSVQgaXMgZGVzaWduZWQgdG8gdXNlCisvLyB0aGUgZHluYW1pYyBsb2FkZXIgaW50ZXJmYWNlIHRvIGZpbmQgYSBmdW5jdGlvbiB0byBjYWxsLiAgVGhpcyBpcyB1c2VmdWwgZm9yCisvLyBjYWxsaW5nIHN5c3RlbSBjYWxscyBhbmQgbGlicmFyeSBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBpbiBMTFZNLgorLy8gU29tZSBzeXN0ZW0gY2FsbHMsIGhvd2V2ZXIsIG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsbHkuICBGb3IgdGhpcyByZWFzb24sCisvLyB3ZSBpbnRlcmNlcHQgc29tZSBvZiB0aGVtIGhlcmUgYW5kIHVzZSBvdXIgb3duIHN0dWJzIHRvIGhhbmRsZSB0aGVtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJKSVQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0R5bmFtaWNMaWJyYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvY29uZmlnLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gQXRFeGl0SGFuZGxlcnMgLSBMaXN0IG9mIGZ1bmN0aW9ucyB0byBjYWxsIHdoZW4gdGhlIHByb2dyYW0gZXhpdHMsCisvLyByZWdpc3RlcmVkIHdpdGggdGhlIGF0ZXhpdCgpIGxpYnJhcnkgZnVuY3Rpb24uCitzdGF0aWMgc3RkOjp2ZWN0b3I8dm9pZCAoKikoKT4gQXRFeGl0SGFuZGxlcnM7CisKKy8vLyBydW5BdEV4aXRIYW5kbGVycyAtIFJ1biBhbnkgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgYnkgdGhlIHByb2dyYW0ncworLy8vIGNhbGxzIHRvIGF0ZXhpdCgzKSwgd2hpY2ggd2UgaW50ZXJjZXB0IGFuZCBzdG9yZSBpbgorLy8vIEF0RXhpdEhhbmRsZXJzLgorLy8vCitzdGF0aWMgdm9pZCBydW5BdEV4aXRIYW5kbGVycygpIHsKKyAgd2hpbGUgKCFBdEV4aXRIYW5kbGVycy5lbXB0eSgpKSB7CisgICAgdm9pZCAoKkZuKSgpID0gQXRFeGl0SGFuZGxlcnMuYmFjaygpOworICAgIEF0RXhpdEhhbmRsZXJzLnBvcF9iYWNrKCk7CisgICAgRm4oKTsKKyAgfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRnVuY3Rpb24gc3R1YnMgdGhhdCBhcmUgaW52b2tlZCBpbnN0ZWFkIG9mIGNlcnRhaW4gbGlicmFyeSBjYWxscworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRm9yY2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdG8gYmUgbGlua2VkIGluIHRvIGFueXRoaW5nIHRoYXQgdXNlcyB0aGUKKy8vIEpJVC4gVGhpcyBpcyBhIGhhY2sgZGVzaWduZWQgdG8gd29yayBhcm91bmQgdGhlIGFsbC10b28tY2xldmVyIEdsaWJjCisvLyBzdHJhdGVneSBvZiBtYWtpbmcgdGhlc2UgZnVuY3Rpb25zIHdvcmsgZGlmZmVyZW50bHkgd2hlbiBpbmxpbmVkIHZzLiB3aGVuCisvLyBub3QgaW5saW5lZCwgYW5kIGhpZGluZyB0aGVpciByZWFsIGRlZmluaXRpb25zIGluIGEgc2VwYXJhdGUgYXJjaGl2ZSBmaWxlCisvLyB0aGF0IHRoZSBkeW5hbWljIGxpbmtlciBjYW4ndCBzZWUuIEZvciBtb3JlIGluZm8sIHNlYXJjaCBmb3IKKy8vICdsaWJjX25vbnNoYXJlZC5hJyBvbiBHb29nbGUsIG9yIHJlYWQgaHR0cDovL2xsdm0ub3JnL1BSMjc0LgorI2lmIGRlZmluZWQoX19saW51eF9fKQorI2lmIGRlZmluZWQoSEFWRV9TWVNfU1RBVF9IKQorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorLyogc3RhdCBmdW5jdGlvbnMgYXJlIHJlZGlyZWN0aW5nIHRvIF9feHN0YXQgd2l0aCBhIHZlcnNpb24gbnVtYmVyLiAgT24geDg2LTY0IAorICogbGlua2luZyB3aXRoIGxpYmNfbm9uc2hhcmVkLmEgYW5kIC1XbCwtLWV4cG9ydC1keW5hbWljIGRvZXNuJ3QgbWFrZSAnc3RhdCcgCisgKiBhdmFpbGFibGUgYXMgYW4gZXhwb3J0ZWQgc3ltYm9sLCBzbyB3ZSBoYXZlIHRvIGFkZCBpdCBleHBsaWNpdGx5LgorICovCituYW1lc3BhY2UgeworY2xhc3MgU3RhdFN5bWJvbHMgeworcHVibGljOgorICBTdGF0U3ltYm9scygpIHsKKyAgICBzeXM6OkR5bmFtaWNMaWJyYXJ5OjpBZGRTeW1ib2woInN0YXQiLCAodm9pZCopKGludHB0cl90KXN0YXQpOworICAgIHN5czo6RHluYW1pY0xpYnJhcnk6OkFkZFN5bWJvbCgiZnN0YXQiLCAodm9pZCopKGludHB0cl90KWZzdGF0KTsKKyAgICBzeXM6OkR5bmFtaWNMaWJyYXJ5OjpBZGRTeW1ib2woImxzdGF0IiwgKHZvaWQqKShpbnRwdHJfdClsc3RhdCk7CisgICAgc3lzOjpEeW5hbWljTGlicmFyeTo6QWRkU3ltYm9sKCJzdGF0NjQiLCAodm9pZCopKGludHB0cl90KXN0YXQ2NCk7CisgICAgc3lzOjpEeW5hbWljTGlicmFyeTo6QWRkU3ltYm9sKCJceDFzdGF0NjQiLCAodm9pZCopKGludHB0cl90KXN0YXQ2NCk7CisgICAgc3lzOjpEeW5hbWljTGlicmFyeTo6QWRkU3ltYm9sKCJceDFvcGVuNjQiLCAodm9pZCopKGludHB0cl90KW9wZW42NCk7CisgICAgc3lzOjpEeW5hbWljTGlicmFyeTo6QWRkU3ltYm9sKCJceDFsc2VlazY0IiwgKHZvaWQqKShpbnRwdHJfdClsc2VlazY0KTsKKyAgICBzeXM6OkR5bmFtaWNMaWJyYXJ5OjpBZGRTeW1ib2woImZzdGF0NjQiLCAodm9pZCopKGludHB0cl90KWZzdGF0NjQpOworICAgIHN5czo6RHluYW1pY0xpYnJhcnk6OkFkZFN5bWJvbCgibHN0YXQ2NCIsICh2b2lkKikoaW50cHRyX3QpbHN0YXQ2NCk7CisgICAgc3lzOjpEeW5hbWljTGlicmFyeTo6QWRkU3ltYm9sKCJhdGV4aXQiLCAodm9pZCopKGludHB0cl90KWF0ZXhpdCk7CisgICAgc3lzOjpEeW5hbWljTGlicmFyeTo6QWRkU3ltYm9sKCJta25vZCIsICh2b2lkKikoaW50cHRyX3QpbWtub2QpOworICB9Cit9OworfQorc3RhdGljIFN0YXRTeW1ib2xzIGluaXRTdGF0U3ltYm9sczsKKyNlbmRpZiAvLyBfX2xpbnV4X18KKworLy8gaml0X2V4aXQgLSBVc2VkIHRvIGludGVyY2VwdCB0aGUgImV4aXQiIGxpYnJhcnkgY2FsbC4KK3N0YXRpYyB2b2lkIGppdF9leGl0KGludCBTdGF0dXMpIHsKKyAgcnVuQXRFeGl0SGFuZGxlcnMoKTsgICAvLyBSdW4gYXRleGl0IGhhbmRsZXJzLi4uCisgIGV4aXQoU3RhdHVzKTsKK30KKworLy8gaml0X2F0ZXhpdCAtIFVzZWQgdG8gaW50ZXJjZXB0IHRoZSAiYXRleGl0IiBsaWJyYXJ5IGNhbGwuCitzdGF0aWMgaW50IGppdF9hdGV4aXQodm9pZCAoKkZuKSgpKSB7CisgIEF0RXhpdEhhbmRsZXJzLnB1c2hfYmFjayhGbik7ICAgIC8vIFRha2Ugbm90ZSBvZiBhdGV4aXQgaGFuZGxlci4uLgorICByZXR1cm4gMDsgIC8vIEFsd2F5cyBzdWNjZXNzZnVsCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIGdldFBvaW50ZXJUb05hbWVkRnVuY3Rpb24gLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQKKy8vLyBmdW5jdGlvbiBieSB1c2luZyB0aGUgZHluYW1pYyBsb2FkZXIgaW50ZXJmYWNlLiAgQXMgc3VjaCBpdCBpcyBvbmx5IHVzZWZ1bAorLy8vIGZvciByZXNvbHZpbmcgbGlicmFyeSBzeW1ib2xzLCBub3QgY29kZSBnZW5lcmF0ZWQgc3ltYm9scy4KKy8vLwordm9pZCAqSklUOjpnZXRQb2ludGVyVG9OYW1lZEZ1bmN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWJvcnRPbkZhaWx1cmUpIHsKKyAgaWYgKCFpc1N5bWJvbFNlYXJjaGluZ0Rpc2FibGVkKCkpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBvbmUgb2YgdGhlIGZ1bmN0aW9ucyB3ZSB3YW50IHRvIGludGVyY2VwdC4gIE5vdGUsCisgICAgLy8gd2UgY2FzdCB0byBpbnRwdHJfdCBoZXJlIHRvIHNpbGVuY2UgYSAtcGVkYW50aWMgd2FybmluZyB0aGF0IGNvbXBsYWlucworICAgIC8vIGFib3V0IGNhc3RpbmcgYSBmdW5jdGlvbiBwb2ludGVyIHRvIGEgbm9ybWFsIHBvaW50ZXIuCisgICAgaWYgKE5hbWUgPT0gImV4aXQiKSByZXR1cm4gKHZvaWQqKShpbnRwdHJfdCkmaml0X2V4aXQ7CisgICAgaWYgKE5hbWUgPT0gImF0ZXhpdCIpIHJldHVybiAodm9pZCopKGludHB0cl90KSZqaXRfYXRleGl0OworCisgICAgY29uc3QgY2hhciAqTmFtZVN0ciA9IE5hbWUuY19zdHIoKTsKKyAgICAvLyBJZiB0aGlzIGlzIGFuIGFzbSBzcGVjaWZpZXIsIHNraXAgdGhlIHNlbnRpbmFsLgorICAgIGlmIChOYW1lU3RyWzBdID09IDEpICsrTmFtZVN0cjsKKyAgICAKKyAgICAvLyBJZiBpdCdzIGFuIGV4dGVybmFsIGZ1bmN0aW9uLCBsb29rIGl0IHVwIGluIHRoZSBwcm9jZXNzIGltYWdlLi4uCisgICAgdm9pZCAqUHRyID0gc3lzOjpEeW5hbWljTGlicmFyeTo6U2VhcmNoRm9yQWRkcmVzc09mU3ltYm9sKE5hbWVTdHIpOworICAgIGlmIChQdHIpIHJldHVybiBQdHI7CisgICAgCisgICAgLy8gSWYgaXQgd2Fzbid0IGZvdW5kIGFuZCBpZiBpdCBzdGFydHMgd2l0aCBhbiB1bmRlcnNjb3JlICgnXycpIGNoYXJhY3RlciwKKyAgICAvLyBhbmQgaGFzIGFuIGFzbSBzcGVjaWZpZXIsIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSB1bmRlcnNjb3JlLgorICAgIGlmIChOYW1lWzBdID09IDEgJiYgTmFtZVN0clswXSA9PSAnXycpIHsKKyAgICAgIFB0ciA9IHN5czo6RHluYW1pY0xpYnJhcnk6OlNlYXJjaEZvckFkZHJlc3NPZlN5bWJvbChOYW1lU3RyKzEpOworICAgICAgaWYgKFB0cikgcmV0dXJuIFB0cjsKKyAgICB9CisgICAgCisgICAgLy8gRGFyd2luL1BQQyBhZGRzICRMREJMU3R1YiBzdWZmaXhlcyB0byB2YXJpb3VzIHN5bWJvbHMgbGlrZSBwcmludGYuICBUaGVzZQorICAgIC8vIGFyZSByZWZlcmVuY2VzIHRvIGhpZGRlbiB2aXNpYmlsaXR5IHN5bWJvbHMgdGhhdCBkbHN5bSBjYW5ub3QgcmVzb2x2ZS4KKyAgICAvLyBJZiB3ZSBoYXZlIG9uZSBvZiB0aGVzZSwgc3RyaXAgb2ZmICRMREJMU3R1YiBhbmQgdHJ5IGFnYWluLgorI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fcHBjX18pCisgICAgaWYgKE5hbWUuc2l6ZSgpID4gOSAmJiBOYW1lW05hbWUuc2l6ZSgpLTldID09ICckJyAmJgorICAgICAgICBtZW1jbXAoJk5hbWVbTmFtZS5zaXplKCktOF0sICJMREJMU3R1YiIsIDgpID09IDApIHsKKyAgICAgIC8vIEZpcnN0IHRyeSB0dXJuaW5nICRMREJMU3R1YiBpbnRvICRMREJMMTI4LiBJZiB0aGF0IGZhaWxzLCBzdHJpcCBpdCBvZmYuCisgICAgICAvLyBUaGlzIG1pcnJvcnMgbG9naWMgaW4gbGliU3lzdGVtU3R1YnMuYS4KKyAgICAgIHN0ZDo6c3RyaW5nIFByZWZpeCA9IHN0ZDo6c3RyaW5nKE5hbWUuYmVnaW4oKSwgTmFtZS5lbmQoKS05KTsKKyAgICAgIGlmICh2b2lkICpQdHIgPSBnZXRQb2ludGVyVG9OYW1lZEZ1bmN0aW9uKFByZWZpeCsiJExEQkwxMjgiLCBmYWxzZSkpCisgICAgICAgIHJldHVybiBQdHI7CisgICAgICBpZiAodm9pZCAqUHRyID0gZ2V0UG9pbnRlclRvTmFtZWRGdW5jdGlvbihQcmVmaXgsIGZhbHNlKSkKKyAgICAgICAgcmV0dXJuIFB0cjsKKyAgICB9CisjZW5kaWYKKyAgfQorICAKKyAgLy8vIElmIGEgTGF6eUZ1bmN0aW9uQ3JlYXRvciBpcyBpbnN0YWxsZWQsIHVzZSBpdCB0byBnZXQvY3JlYXRlIHRoZSBmdW5jdGlvbi4KKyAgaWYgKExhenlGdW5jdGlvbkNyZWF0b3IpCisgICAgaWYgKHZvaWQgKlJQID0gTGF6eUZ1bmN0aW9uQ3JlYXRvcihOYW1lKSkKKyAgICAgIHJldHVybiBSUDsKKworICBpZiAoQWJvcnRPbkZhaWx1cmUpIHsKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlByb2dyYW0gdXNlZCBleHRlcm5hbCBmdW5jdGlvbiAnIitOYW1lKworICAgICAgICAgICAgICAgICAgICAgICInIHdoaWNoIGNvdWxkIG5vdCBiZSByZXNvbHZlZCEiKTsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL0pJVC5jcHAgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNWUwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVQuY3BwCkBAIC0wLDAgKzEsNzUxIEBACisvLz09PS0tIEpJVC5jcHAgLSBMTFZNIEp1c3QgaW4gVGltZSBDb21waWxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgdG9vbCBpbXBsZW1lbnRzIGEganVzdC1pbi10aW1lIGNvbXBpbGVyIGZvciBMTFZNLCBhbGxvd2luZyBkaXJlY3QKKy8vIGV4ZWN1dGlvbiBvZiBMTFZNIGJpdGNvZGUgaW4gYW4gZWZmaWNpZW50IG1hbm5lci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiSklULmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9KSVRDb2RlRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29kZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9HZW5lcmljVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRFdmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRKSVRJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NdXRleEd1YXJkLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRHluYW1pY0xpYnJhcnkuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKyNpZmRlZiBfX0FQUExFX18gCisvLyBBcHBsZSBnY2MgZGVmYXVsdHMgdG8gLWZ1c2UtY3hhLWF0ZXhpdCAoaS5lLiBjYWxscyBfX2N4YV9hdGV4aXQgaW5zdGVhZAorLy8gb2YgYXRleGl0KS4gSXQgcGFzc2VzIHRoZSBhZGRyZXNzIG9mIGxpbmtlciBnZW5lcmF0ZWQgc3ltYm9sIF9fZHNvX2hhbmRsZQorLy8gdG8gdGhlIGZ1bmN0aW9uLgorLy8gVGhpcyBjb25maWd1cmF0aW9uIGNoYW5nZSBoYXBwZW5lZCBhdCB2ZXJzaW9uIDUzMzAuCisjIGluY2x1ZGUgPEF2YWlsYWJpbGl0eU1hY3Jvcy5oPgorIyBpZiBkZWZpbmVkKE1BQ19PU19YX1ZFUlNJT05fMTBfNCkgJiYgXAorICAgICAoKE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEID4gTUFDX09TX1hfVkVSU0lPTl8xMF80KSB8fCBcCisgICAgICAoTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPT0gTUFDX09TX1hfVkVSU0lPTl8xMF80ICYmIFwKKyAgICAgICBfX0FQUExFX0NDX18gPj0gNTMzMCkpCisjICBpZm5kZWYgSEFWRV9fX0RTT19IQU5ETEUKKyMgICBkZWZpbmUgSEFWRV9fX0RTT19IQU5ETEUgMQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgSEFWRV9fX0RTT19IQU5ETEUKK2V4dGVybiB2b2lkICpfX2Rzb19oYW5kbGUgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fICgiaGlkZGVuIikpKTsKKyNlbmRpZgorCituYW1lc3BhY2UgeworCitzdGF0aWMgc3RydWN0IFJlZ2lzdGVySklUIHsKKyAgUmVnaXN0ZXJKSVQoKSB7IEpJVDo6UmVnaXN0ZXIoKTsgfQorfSBKSVRSZWdpc3RyYXRvcjsKKworfQorCitleHRlcm4gIkMiIHZvaWQgTExWTUxpbmtJbkpJVCgpIHsKK30KKworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19BUk1fRUFCSV9fKSAmJiAhZGVmaW5lZChfX1VTSU5HX1NKTEpfRVhDRVBUSU9OU19fKQorIAorI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDw9IDEwNTAKKyMgZGVmaW5lIFVTRV9LRVlNR1IgMQorI2Vsc2UKKyMgZGVmaW5lIFVTRV9LRVlNR1IgMAorI2VuZGlmCisKKyNpZiBVU0VfS0VZTUdSCisKK25hbWVzcGFjZSB7CisKKy8vIExpYmdjY09iamVjdCAtIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBkZWZpbmVkIGluIGxpYmdjYy4gVGhlcmUgaXMgbm8gI2luY2x1ZGUKKy8vIHByb3ZpZGVkIGZvciB0aGlzIHN0cnVjdHVyZSwgc28gd2UgYWxzbyBkZWZpbmUgaXQgaGVyZS4gbGliZ2NjIGNhbGxzIGl0CisvLyAic3RydWN0IG9iamVjdCIuIFRoZSBzdHJ1Y3R1cmUgaXMgdW5kb2N1bWVudGVkIGluIGxpYmdjYy4KK3N0cnVjdCBMaWJnY2NPYmplY3QgeworICB2b2lkICp1bnVzZWQxOworICB2b2lkICp1bnVzZWQyOworICB2b2lkICp1bnVzZWQzOworICAKKyAgLy8vIGZyYW1lIC0gUG9pbnRlciB0byB0aGUgZXhjZXB0aW9uIHRhYmxlLgorICB2b2lkICpmcmFtZTsKKyAgCisgIC8vLyBlbmNvZGluZyAtICBUaGUgZW5jb2Rpbmcgb2YgdGhlIG9iamVjdD8KKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBsb25nIHNvcnRlZCA6IDE7CisgICAgICB1bnNpZ25lZCBsb25nIGZyb21fYXJyYXkgOiAxOworICAgICAgdW5zaWduZWQgbG9uZyBtaXhlZF9lbmNvZGluZyA6IDE7CisgICAgICB1bnNpZ25lZCBsb25nIGVuY29kaW5nIDogODsKKyAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQgOiAyMTsgCisgICAgfSBiOworICAgIHNpemVfdCBpOworICB9IGVuY29kaW5nOworICAKKyAgLy8vIGZkZV9lbmQgLSBsaWJnY2MgZGVmaW5lcyB0aGlzIGZpZWxkIG9ubHkgaWYgc29tZSBtYWNybyBpcyBkZWZpbmVkLiBXZQorICAvLy8gaW5jbHVkZSB0aGlzIGZpZWxkIGV2ZW4gaWYgaXQgbWF5IG5vdCB0aGVyZSwgdG8gbWFrZSBsaWJnY2MgaGFwcHkuCisgIGNoYXIgKmZkZV9lbmQ7CisgIAorICAvLy8gbmV4dCAtIEF0IGxlYXN0IHdlIGtub3cgaXQncyBhIGNoYWluZWQgbGlzdCEKKyAgc3RydWN0IExpYmdjY09iamVjdCAqbmV4dDsKK307CisKKy8vICJrZW1nciIgc3R1ZmYuIEFwcGFyZW50bHksIGFsbCBmcmFtZSB0YWJsZXMgYXJlIHN0b3JlZCB0aGVyZS4KK2V4dGVybiAiQyIgdm9pZCBfa2V5bWdyX3NldF9hbmRfdW5sb2NrX3Byb2Nlc3N3aWRlX3B0cihpbnQsIHZvaWQgKik7CitleHRlcm4gIkMiIHZvaWQgKl9rZXltZ3JfZ2V0X2FuZF9sb2NrX3Byb2Nlc3N3aWRlX3B0cihpbnQpOworI2RlZmluZSBLRVlNR1JfR0NDM19EVzJfT0JKX0xJU1QgICAgICAgIDMwMiAgICAgLyogRHdhcmYyIG9iamVjdCBsaXN0ICAqLworCisvLy8gTGliZ2NjT2JqZWN0SW5mbyAtIGxpYmdjYyBkZWZpbmVzIHRoaXMgc3RydWN0IGFzIGttX29iamVjdF9pbmZvLiBJdAorLy8vIHByb2JhYmx5IGNvbnRhaW5zIGFsbCBkd2FyZiB0YWJsZXMgdGhhdCBhcmUgbG9hZGVkLgorc3RydWN0IExpYmdjY09iamVjdEluZm8geworCisgIC8vLyBzZWVuT2JqZWN0cyAtIExpYmdjY09iamVjdHMgYWxyZWFkeSBwYXJzZWQgYnkgdGhlIHVud2luZGluZyBydW50aW1lLgorICAvLy8KKyAgc3RydWN0IExpYmdjY09iamVjdCogc2Vlbk9iamVjdHM7CisKKyAgLy8vIHVuc2Vlbk9iamVjdHMgLSBMaWJnY2NPYmplY3RzIG5vdCBwYXJzZWQgeWV0IGJ5IHRoZSB1bndpbmRpbmcgcnVudGltZS4KKyAgLy8vCisgIHN0cnVjdCBMaWJnY2NPYmplY3QqIHVuc2Vlbk9iamVjdHM7CisgIAorICB1bnNpZ25lZCB1bnVzZWRbMl07Cit9OworCit9CisjZW5kaWYgLy8gX19BUFBMRV9fCisjZW5kaWYgLy8gX19HTlVDX18KKworLy8vIGNyZWF0ZUpJVCAtIFRoaXMgaXMgdGhlIGZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIEpJVCBmb3IgdGhlIGN1cnJlbnQKKy8vLyBtYWNoaW5lLCBpdCBkb2VzIG5vdCBmYWxsIGJhY2sgdG8gdGhlIGludGVycHJldGVyLiAgVGhpcyB0YWtlcyBvd25lcnNoaXAKKy8vLyBvZiB0aGUgbW9kdWxlLgorRXhlY3V0aW9uRW5naW5lICpFeGVjdXRpb25FbmdpbmU6OmNyZWF0ZUpJVChNb2R1bGUgKk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJvclN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUTWVtb3J5TWFuYWdlciAqSk1NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBHVnNXaXRoQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZU1vZGVsOjpNb2RlbCBDTU0pIHsKKyAgLy8gVXNlIHRoZSBkZWZhdWx0cyBmb3IgZXh0cmEgcGFyYW1ldGVycy4gIFVzZXJzIGNhbiB1c2UgRW5naW5lQnVpbGRlciB0bworICAvLyBzZXQgdGhlbS4KKyAgU3RyaW5nUmVmIE1BcmNoID0gIiI7CisgIFN0cmluZ1JlZiBNQ1BVID0gIiI7CisgIFNtYWxsVmVjdG9yPHN0ZDo6c3RyaW5nLCAxPiBNQXR0cnM7CisgIHJldHVybiBKSVQ6OmNyZWF0ZUpJVChNLCBFcnJvclN0ciwgSk1NLCBPcHRMZXZlbCwgR1ZzV2l0aENvZGUsIENNTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1BcmNoLCBNQ1BVLCBNQXR0cnMpOworfQorCitFeGVjdXRpb25FbmdpbmUgKkpJVDo6Y3JlYXRlSklUKE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVycm9yU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRNZW1vcnlNYW5hZ2VyICpKTU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEdWc1dpdGhDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlTW9kZWw6Ok1vZGVsIENNTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1BcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTUNQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiYgTUF0dHJzKSB7CisgIC8vIFBpY2sgYSB0YXJnZXQgZWl0aGVyIHZpYSAtbWFyY2ggb3IgYnkgZ3Vlc3NpbmcgdGhlIG5hdGl2ZSBhcmNoLgorICBUYXJnZXRNYWNoaW5lICpUTSA9IEpJVDo6c2VsZWN0VGFyZ2V0KE0sIE1BcmNoLCBNQ1BVLCBNQXR0cnMsIEVycm9yU3RyKTsKKyAgaWYgKCFUTSB8fCAoRXJyb3JTdHIgJiYgRXJyb3JTdHItPmxlbmd0aCgpID4gMCkpIHJldHVybiAwOworICBUTS0+c2V0Q29kZU1vZGVsKENNTSk7CisKKyAgLy8gSWYgdGhlIHRhcmdldCBzdXBwb3J0cyBKSVQgY29kZSBnZW5lcmF0aW9uLCBjcmVhdGUgYSB0aGUgSklULgorICBpZiAoVGFyZ2V0SklUSW5mbyAqVEogPSBUTS0+Z2V0SklUSW5mbygpKSB7CisgICAgcmV0dXJuIG5ldyBKSVQoTSwgKlRNLCAqVEosIEpNTSwgT3B0TGV2ZWwsIEdWc1dpdGhDb2RlKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoRXJyb3JTdHIpCisgICAgICAqRXJyb3JTdHIgPSAidGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgSklUIGNvZGUgZ2VuZXJhdGlvbiI7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworbmFtZXNwYWNlIHsKKy8vLyBUaGlzIGNsYXNzIHN1cHBvcnRzIHRoZSBnbG9iYWwgZ2V0UG9pbnRlclRvTmFtZWRGdW5jdGlvbigpLCB3aGljaCBhbGxvd3MKKy8vLyBidWdwb2ludCBvciBnZGIgdXNlcnMgdG8gc2VhcmNoIGZvciBhIGZ1bmN0aW9uIGJ5IG5hbWUgd2l0aG91dCBhbnkgY29udGV4dC4KK2NsYXNzIEppdFBvb2wgeworICBTbWFsbFB0clNldDxKSVQqLCAxPiBKSVRzOyAgLy8gT3B0aW1pemUgZm9yIHByb2Nlc3MgY29udGFpbmluZyBqdXN0IDEgSklULgorICBtdXRhYmxlIHN5czo6TXV0ZXggTG9jazsKK3B1YmxpYzoKKyAgdm9pZCBBZGQoSklUICpqaXQpIHsKKyAgICBNdXRleEd1YXJkIGd1YXJkKExvY2spOworICAgIEpJVHMuaW5zZXJ0KGppdCk7CisgIH0KKyAgdm9pZCBSZW1vdmUoSklUICpqaXQpIHsKKyAgICBNdXRleEd1YXJkIGd1YXJkKExvY2spOworICAgIEpJVHMuZXJhc2Uoaml0KTsKKyAgfQorICB2b2lkICpnZXRQb2ludGVyVG9OYW1lZEZ1bmN0aW9uKGNvbnN0IGNoYXIgKk5hbWUpIGNvbnN0IHsKKyAgICBNdXRleEd1YXJkIGd1YXJkKExvY2spOworICAgIGFzc2VydChKSVRzLnNpemUoKSAhPSAwICYmICJObyBKaXQgcmVnaXN0ZXJlZCIpOworICAgIC8vc2VhcmNoIGZ1bmN0aW9uIGluIGV2ZXJ5IGluc3RhbmNlIG9mIEpJVAorICAgIGZvciAoU21hbGxQdHJTZXQ8SklUKiwgMT46OmNvbnN0X2l0ZXJhdG9yIEppdCA9IEpJVHMuYmVnaW4oKSwKKyAgICAgICAgICAgZW5kID0gSklUcy5lbmQoKTsKKyAgICAgICAgIEppdCAhPSBlbmQ7ICsrSml0KSB7CisgICAgICBpZiAoRnVuY3Rpb24gKkYgPSAoKkppdCktPkZpbmRGdW5jdGlvbk5hbWVkKE5hbWUpKQorICAgICAgICByZXR1cm4gKCpKaXQpLT5nZXRQb2ludGVyVG9GdW5jdGlvbihGKTsKKyAgICB9CisgICAgLy8gVGhlIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgOiBmYWxsYmFjayBvbiB0aGUgZmlyc3QgY3JlYXRlZCAod2lsbAorICAgIC8vIHNlYXJjaCBpbiBzeW1ib2wgb2YgdGhlIGN1cnJlbnQgcHJvZ3JhbS9saWJyYXJ5KQorICAgIHJldHVybiAoKkpJVHMuYmVnaW4oKSktPmdldFBvaW50ZXJUb05hbWVkRnVuY3Rpb24oTmFtZSk7CisgIH0KK307CitNYW5hZ2VkU3RhdGljPEppdFBvb2w+IEFsbEppdHM7Cit9CitleHRlcm4gIkMiIHsKKyAgLy8gZ2V0UG9pbnRlclRvTmFtZWRGdW5jdGlvbiAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGdsb2JhbCB3cmFwcGVyIHRvCisgIC8vIEpJVDo6Z2V0UG9pbnRlclRvTmFtZWRGdW5jdGlvbiBmb3IgdGhlIHB1cnBvc2Ugb2YgcmVzb2x2aW5nIHN5bWJvbHMgd2hlbgorICAvLyBidWdwb2ludCBpcyBkZWJ1Z2dpbmcgdGhlIEpJVC4gSW4gdGhhdCBzY2VuYXJpbywgd2UgYXJlIGxvYWRpbmcgYW4gLnNvIGFuZAorICAvLyBuZWVkIHRvIHJlc29sdmUgZnVuY3Rpb24ocykgdGhhdCBhcmUgYmVpbmcgbWlzLWNvZGVnZW5lcmF0ZWQsIHNvIHdlIG5lZWQgdG8KKyAgLy8gcmVzb2x2ZSB0aGVpciBhZGRyZXNzZXMgYXQgcnVudGltZSwgYW5kIHRoaXMgaXMgdGhlIHdheSB0byBkbyBpdC4KKyAgdm9pZCAqZ2V0UG9pbnRlclRvTmFtZWRGdW5jdGlvbihjb25zdCBjaGFyICpOYW1lKSB7CisgICAgcmV0dXJuIEFsbEppdHMtPmdldFBvaW50ZXJUb05hbWVkRnVuY3Rpb24oTmFtZSk7CisgIH0KK30KKworSklUOjpKSVQoTW9kdWxlICpNLCBUYXJnZXRNYWNoaW5lICZ0bSwgVGFyZ2V0SklUSW5mbyAmdGppLAorICAgICAgICAgSklUTWVtb3J5TWFuYWdlciAqSk1NLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwgYm9vbCBHVnNXaXRoQ29kZSkKKyAgOiBFeGVjdXRpb25FbmdpbmUoTSksIFRNKHRtKSwgVEpJKHRqaSksIEFsbG9jYXRlR1ZzV2l0aENvZGUoR1ZzV2l0aENvZGUpLAorICAgIGlzQWxyZWFkeUNvZGVHZW5lcmF0aW5nKGZhbHNlKSB7CisgIHNldFRhcmdldERhdGEoVE0uZ2V0VGFyZ2V0RGF0YSgpKTsKKworICBqaXRzdGF0ZSA9IG5ldyBKSVRTdGF0ZShNKTsKKworICAvLyBJbml0aWFsaXplIEpDRQorICBKQ0UgPSBjcmVhdGVFbWl0dGVyKCp0aGlzLCBKTU0sIFRNKTsKKworICAvLyBSZWdpc3RlciBpbiBnbG9iYWwgbGlzdCBvZiBhbGwgSklUcy4KKyAgQWxsSml0cy0+QWRkKHRoaXMpOworCisgIC8vIEFkZCB0YXJnZXQgZGF0YQorICBNdXRleEd1YXJkIGxvY2tlZChsb2NrKTsKKyAgRnVuY3Rpb25QYXNzTWFuYWdlciAmUE0gPSBqaXRzdGF0ZS0+Z2V0UE0obG9ja2VkKTsKKyAgUE0uYWRkKG5ldyBUYXJnZXREYXRhKCpUTS5nZXRUYXJnZXREYXRhKCkpKTsKKworICAvLyBUdXJuIHRoZSBtYWNoaW5lIGNvZGUgaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uIGludG8gYnl0ZXMgaW4gbWVtb3J5IHRoYXQKKyAgLy8gbWF5IGJlIGV4ZWN1dGVkLgorICBpZiAoVE0uYWRkUGFzc2VzVG9FbWl0TWFjaGluZUNvZGUoUE0sICpKQ0UsIE9wdExldmVsKSkgeworICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiVGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgbWFjaGluZSBjb2RlIGVtaXNzaW9uISIpOworICB9CisgIAorICAvLyBJbml0aWFsaXplIHBhc3Nlcy4KKyAgUE0uZG9Jbml0aWFsaXphdGlvbigpOworfQorCitKSVQ6On5KSVQoKSB7CisgIEFsbEppdHMtPlJlbW92ZSh0aGlzKTsKKyAgZGVsZXRlIGppdHN0YXRlOworICBkZWxldGUgSkNFOworICBkZWxldGUgJlRNOworfQorCisvLy8gYWRkTW9kdWxlIC0gQWRkIGEgbmV3IE1vZHVsZSB0byB0aGUgSklULiAgSWYgd2UgcHJldmlvdXNseSByZW1vdmVkIHRoZSBsYXN0CisvLy8gTW9kdWxlLCB3ZSBuZWVkIHJlLWluaXRpYWxpemUgaml0c3RhdGUgd2l0aCBhIHZhbGlkIE1vZHVsZS4KK3ZvaWQgSklUOjphZGRNb2R1bGUoTW9kdWxlICpNKSB7CisgIE11dGV4R3VhcmQgbG9ja2VkKGxvY2spOworCisgIGlmIChNb2R1bGVzLmVtcHR5KCkpIHsKKyAgICBhc3NlcnQoIWppdHN0YXRlICYmICJqaXRzdGF0ZSBzaG91bGQgYmUgTlVMTCBpZiBNb2R1bGVzIHZlY3RvciBpcyBlbXB0eSEiKTsKKworICAgIGppdHN0YXRlID0gbmV3IEpJVFN0YXRlKE0pOworCisgICAgRnVuY3Rpb25QYXNzTWFuYWdlciAmUE0gPSBqaXRzdGF0ZS0+Z2V0UE0obG9ja2VkKTsKKyAgICBQTS5hZGQobmV3IFRhcmdldERhdGEoKlRNLmdldFRhcmdldERhdGEoKSkpOworCisgICAgLy8gVHVybiB0aGUgbWFjaGluZSBjb2RlIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbiBpbnRvIGJ5dGVzIGluIG1lbW9yeQorICAgIC8vIHRoYXQgbWF5IGJlIGV4ZWN1dGVkLgorICAgIGlmIChUTS5hZGRQYXNzZXNUb0VtaXRNYWNoaW5lQ29kZShQTSwgKkpDRSwgQ29kZUdlbk9wdDo6RGVmYXVsdCkpIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiVGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgbWFjaGluZSBjb2RlIGVtaXNzaW9uISIpOworICAgIH0KKyAgICAKKyAgICAvLyBJbml0aWFsaXplIHBhc3Nlcy4KKyAgICBQTS5kb0luaXRpYWxpemF0aW9uKCk7CisgIH0KKyAgCisgIEV4ZWN1dGlvbkVuZ2luZTo6YWRkTW9kdWxlKE0pOworfQorCisvLy8gcmVtb3ZlTW9kdWxlIC0gSWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IE1vZHVsZSwgaW52YWxpZGF0ZSB0aGUgaml0c3RhdGUKKy8vLyBzaW5jZSB0aGUgUGFzc01hbmFnZXIgaXQgY29udGFpbnMgcmVmZXJlbmNlcyBhIHJlbGVhc2VkIE1vZHVsZS4KK2Jvb2wgSklUOjpyZW1vdmVNb2R1bGUoTW9kdWxlICpNKSB7CisgIGJvb2wgcmVzdWx0ID0gRXhlY3V0aW9uRW5naW5lOjpyZW1vdmVNb2R1bGUoTSk7CisgIAorICBNdXRleEd1YXJkIGxvY2tlZChsb2NrKTsKKyAgCisgIGlmIChqaXRzdGF0ZS0+Z2V0TW9kdWxlKCkgPT0gTSkgeworICAgIGRlbGV0ZSBqaXRzdGF0ZTsKKyAgICBqaXRzdGF0ZSA9IDA7CisgIH0KKyAgCisgIGlmICghaml0c3RhdGUgJiYgIU1vZHVsZXMuZW1wdHkoKSkgeworICAgIGppdHN0YXRlID0gbmV3IEpJVFN0YXRlKE1vZHVsZXNbMF0pOworCisgICAgRnVuY3Rpb25QYXNzTWFuYWdlciAmUE0gPSBqaXRzdGF0ZS0+Z2V0UE0obG9ja2VkKTsKKyAgICBQTS5hZGQobmV3IFRhcmdldERhdGEoKlRNLmdldFRhcmdldERhdGEoKSkpOworICAgIAorICAgIC8vIFR1cm4gdGhlIG1hY2hpbmUgY29kZSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gaW50byBieXRlcyBpbiBtZW1vcnkKKyAgICAvLyB0aGF0IG1heSBiZSBleGVjdXRlZC4KKyAgICBpZiAoVE0uYWRkUGFzc2VzVG9FbWl0TWFjaGluZUNvZGUoUE0sICpKQ0UsIENvZGVHZW5PcHQ6OkRlZmF1bHQpKSB7CisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IG1hY2hpbmUgY29kZSBlbWlzc2lvbiEiKTsKKyAgICB9CisgICAgCisgICAgLy8gSW5pdGlhbGl6ZSBwYXNzZXMuCisgICAgUE0uZG9Jbml0aWFsaXphdGlvbigpOworICB9ICAgIAorICByZXR1cm4gcmVzdWx0OworfQorCisvLy8gcnVuIC0gU3RhcnQgZXhlY3V0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzLgorLy8vCitHZW5lcmljVmFsdWUgSklUOjpydW5GdW5jdGlvbihGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJkFyZ1ZhbHVlcykgeworICBhc3NlcnQoRiAmJiAiRnVuY3Rpb24gKkYgd2FzIG51bGwgYXQgZW50cnkgdG8gcnVuKCkiKTsKKworICB2b2lkICpGUHRyID0gZ2V0UG9pbnRlclRvRnVuY3Rpb24oRik7CisgIGFzc2VydChGUHRyICYmICJQb2ludGVyIHRvIGZuJ3MgY29kZSB3YXMgbnVsbCBhZnRlciBnZXRQb2ludGVyVG9GdW5jdGlvbiIpOworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IEYtPmdldEZ1bmN0aW9uVHlwZSgpOworICBjb25zdCBUeXBlICpSZXRUeSA9IEZUeS0+Z2V0UmV0dXJuVHlwZSgpOworCisgIGFzc2VydCgoRlR5LT5nZXROdW1QYXJhbXMoKSA9PSBBcmdWYWx1ZXMuc2l6ZSgpIHx8CisgICAgICAgICAgKEZUeS0+aXNWYXJBcmcoKSAmJiBGVHktPmdldE51bVBhcmFtcygpIDw9IEFyZ1ZhbHVlcy5zaXplKCkpKSAmJgorICAgICAgICAgIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkIGludG8gZnVuY3Rpb24hIik7CisgIGFzc2VydChGVHktPmdldE51bVBhcmFtcygpID09IEFyZ1ZhbHVlcy5zaXplKCkgJiYKKyAgICAgICAgICJUaGlzIGRvZXNuJ3Qgc3VwcG9ydCBwYXNzaW5nIGFyZ3VtZW50cyB0aHJvdWdoIHZhcmFyZ3MgKHlldCkhIik7CisKKyAgLy8gSGFuZGxlIHNvbWUgY29tbW9uIGNhc2VzIGZpcnN0LiAgVGhlc2UgY2FzZXMgY29ycmVzcG9uZCB0byBjb21tb24gYG1haW4nCisgIC8vIHByb3RvdHlwZXMuCisgIGlmIChSZXRUeS0+aXNJbnRlZ2VyVHkoMzIpIHx8IFJldFR5LT5pc1ZvaWRUeSgpKSB7CisgICAgc3dpdGNoIChBcmdWYWx1ZXMuc2l6ZSgpKSB7CisgICAgY2FzZSAzOgorICAgICAgaWYgKEZUeS0+Z2V0UGFyYW1UeXBlKDApLT5pc0ludGVnZXJUeSgzMikgJiYKKyAgICAgICAgICBGVHktPmdldFBhcmFtVHlwZSgxKS0+aXNQb2ludGVyVHkoKSAmJgorICAgICAgICAgIEZUeS0+Z2V0UGFyYW1UeXBlKDIpLT5pc1BvaW50ZXJUeSgpKSB7CisgICAgICAgIGludCAoKlBGKShpbnQsIGNoYXIgKiosIGNvbnN0IGNoYXIgKiopID0KKyAgICAgICAgICAoaW50KCopKGludCwgY2hhciAqKiwgY29uc3QgY2hhciAqKikpKGludHB0cl90KUZQdHI7CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24uCisgICAgICAgIEdlbmVyaWNWYWx1ZSBydjsKKyAgICAgICAgcnYuSW50VmFsID0gQVBJbnQoMzIsIFBGKEFyZ1ZhbHVlc1swXS5JbnRWYWwuZ2V0WkV4dFZhbHVlKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopR1ZUT1AoQXJnVmFsdWVzWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKUdWVE9QKEFyZ1ZhbHVlc1syXSkpKTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKEZUeS0+Z2V0UGFyYW1UeXBlKDApLT5pc0ludGVnZXJUeSgzMikgJiYKKyAgICAgICAgICBGVHktPmdldFBhcmFtVHlwZSgxKS0+aXNQb2ludGVyVHkoKSkgeworICAgICAgICBpbnQgKCpQRikoaW50LCBjaGFyICoqKSA9IChpbnQoKikoaW50LCBjaGFyICoqKSkoaW50cHRyX3QpRlB0cjsKKworICAgICAgICAvLyBDYWxsIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgR2VuZXJpY1ZhbHVlIHJ2OworICAgICAgICBydi5JbnRWYWwgPSBBUEludCgzMiwgUEYoQXJnVmFsdWVzWzBdLkludFZhbC5nZXRaRXh0VmFsdWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKilHVlRPUChBcmdWYWx1ZXNbMV0pKSk7CisgICAgICAgIHJldHVybiBydjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGlmIChGVHktPmdldE51bVBhcmFtcygpID09IDEgJiYKKyAgICAgICAgICBGVHktPmdldFBhcmFtVHlwZSgwKS0+aXNJbnRlZ2VyVHkoMzIpKSB7CisgICAgICAgIEdlbmVyaWNWYWx1ZSBydjsKKyAgICAgICAgaW50ICgqUEYpKGludCkgPSAoaW50KCopKGludCkpKGludHB0cl90KUZQdHI7CisgICAgICAgIHJ2LkludFZhbCA9IEFQSW50KDMyLCBQRihBcmdWYWx1ZXNbMF0uSW50VmFsLmdldFpFeHRWYWx1ZSgpKSk7CisgICAgICAgIHJldHVybiBydjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIEhhbmRsZSBjYXNlcyB3aGVyZSBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCBmaXJzdC4KKyAgaWYgKEFyZ1ZhbHVlcy5lbXB0eSgpKSB7CisgICAgR2VuZXJpY1ZhbHVlIHJ2OworICAgIHN3aXRjaCAoUmV0VHktPmdldFR5cGVJRCgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biByZXR1cm4gdHlwZSBmb3IgZnVuY3Rpb24gY2FsbCEiKTsKKyAgICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOiB7CisgICAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IGNhc3Q8SW50ZWdlclR5cGU+KFJldFR5KS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAgIGlmIChCaXRXaWR0aCA9PSAxKQorICAgICAgICBydi5JbnRWYWwgPSBBUEludChCaXRXaWR0aCwgKChib29sKCopKCkpKGludHB0cl90KUZQdHIpKCkpOworICAgICAgZWxzZSBpZiAoQml0V2lkdGggPD0gOCkKKyAgICAgICAgcnYuSW50VmFsID0gQVBJbnQoQml0V2lkdGgsICgoY2hhcigqKSgpKShpbnRwdHJfdClGUHRyKSgpKTsKKyAgICAgIGVsc2UgaWYgKEJpdFdpZHRoIDw9IDE2KQorICAgICAgICBydi5JbnRWYWwgPSBBUEludChCaXRXaWR0aCwgKChzaG9ydCgqKSgpKShpbnRwdHJfdClGUHRyKSgpKTsKKyAgICAgIGVsc2UgaWYgKEJpdFdpZHRoIDw9IDMyKQorICAgICAgICBydi5JbnRWYWwgPSBBUEludChCaXRXaWR0aCwgKChpbnQoKikoKSkoaW50cHRyX3QpRlB0cikoKSk7CisgICAgICBlbHNlIGlmIChCaXRXaWR0aCA8PSA2NCkKKyAgICAgICAgcnYuSW50VmFsID0gQVBJbnQoQml0V2lkdGgsICgoaW50NjRfdCgqKSgpKShpbnRwdHJfdClGUHRyKSgpKTsKKyAgICAgIGVsc2UgCisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkludGVnZXIgdHlwZXMgPiA2NCBiaXRzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIHJldHVybiBydjsKKyAgICB9CisgICAgY2FzZSBUeXBlOjpWb2lkVHlJRDoKKyAgICAgIHJ2LkludFZhbCA9IEFQSW50KDMyLCAoKGludCgqKSgpKShpbnRwdHJfdClGUHRyKSgpKTsKKyAgICAgIHJldHVybiBydjsKKyAgICBjYXNlIFR5cGU6OkZsb2F0VHlJRDoKKyAgICAgIHJ2LkZsb2F0VmFsID0gKChmbG9hdCgqKSgpKShpbnRwdHJfdClGUHRyKSgpOworICAgICAgcmV0dXJuIHJ2OworICAgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDoKKyAgICAgIHJ2LkRvdWJsZVZhbCA9ICgoZG91YmxlKCopKCkpKGludHB0cl90KUZQdHIpKCk7CisgICAgICByZXR1cm4gcnY7CisgICAgY2FzZSBUeXBlOjpYODZfRlA4MFR5SUQ6CisgICAgY2FzZSBUeXBlOjpGUDEyOFR5SUQ6CisgICAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgibG9uZyBkb3VibGUgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICAgIHJldHVybiBydjsKKyAgICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOgorICAgICAgcmV0dXJuIFBUT0dWKCgodm9pZCooKikoKSkoaW50cHRyX3QpRlB0cikoKSk7CisgICAgfQorICB9CisKKyAgLy8gT2theSwgdGhpcyBpcyBub3Qgb25lIG9mIG91ciBxdWljayBhbmQgZWFzeSBjYXNlcy4gIEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhCisgIC8vIGZ1bGwgRkZJLCB3ZSBoYXZlIHRvIGNvZGVnZW4gYSBudWxsYXJ5IHN0dWIgZnVuY3Rpb24gdGhhdCBqdXN0IGNhbGxzIHRoZQorICAvLyBmdW5jdGlvbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiwgcGFzc2luZyBpbiBjb25zdGFudHMgZm9yIGFsbCBvZiB0aGUKKyAgLy8gYXJndW1lbnRzLiAgTWFrZSB0aGlzIGZ1bmN0aW9uIGFuZCByZXR1cm4uCisKKyAgLy8gRmlyc3QsIGNyZWF0ZSB0aGUgZnVuY3Rpb24uCisgIEZ1bmN0aW9uVHlwZSAqU1R5PUZ1bmN0aW9uVHlwZTo6Z2V0KFJldFR5LCBmYWxzZSk7CisgIEZ1bmN0aW9uICpTdHViID0gRnVuY3Rpb246OkNyZWF0ZShTVHksIEZ1bmN0aW9uOjpJbnRlcm5hbExpbmthZ2UsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi0+Z2V0UGFyZW50KCkpOworCisgIC8vIEluc2VydCBhIGJhc2ljIGJsb2NrLgorICBCYXNpY0Jsb2NrICpTdHViQkIgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoRi0+Z2V0Q29udGV4dCgpLCBTdHViKTsKKworICAvLyBDb252ZXJ0IGFsbCBvZiB0aGUgR2VuZXJpY1ZhbHVlIGFyZ3VtZW50cyBvdmVyIHRvIGNvbnN0YW50cy4gIE5vdGUgdGhhdCB3ZQorICAvLyBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCB2YXJhcmdzLgorICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IEFyZ3M7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENvbnN0YW50ICpDID0gMDsKKyAgICBjb25zdCBUeXBlICpBcmdUeSA9IEZUeS0+Z2V0UGFyYW1UeXBlKGkpOworICAgIGNvbnN0IEdlbmVyaWNWYWx1ZSAmQVYgPSBBcmdWYWx1ZXNbaV07CisgICAgc3dpdGNoIChBcmdUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGFyZ3VtZW50IHR5cGUgZm9yIGZ1bmN0aW9uIGNhbGwhIik7CisgICAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgICAgICAgQyA9IENvbnN0YW50SW50OjpnZXQoRi0+Z2V0Q29udGV4dCgpLCBBVi5JbnRWYWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGU6OkZsb2F0VHlJRDoKKyAgICAgICAgQyA9IENvbnN0YW50RlA6OmdldChGLT5nZXRDb250ZXh0KCksIEFQRmxvYXQoQVYuRmxvYXRWYWwpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOgorICAgICAgICBDID0gQ29uc3RhbnRGUDo6Z2V0KEYtPmdldENvbnRleHQoKSwgQVBGbG9hdChBVi5Eb3VibGVWYWwpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOgorICAgIGNhc2UgVHlwZTo6WDg2X0ZQODBUeUlEOgorICAgIGNhc2UgVHlwZTo6RlAxMjhUeUlEOgorICAgICAgICBDID0gQ29uc3RhbnRGUDo6Z2V0KEYtPmdldENvbnRleHQoKSwgQVBGbG9hdChBVi5JbnRWYWwpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICAgIHZvaWQgKkFyZ1B0ciA9IEdWVE9QKEFWKTsKKyAgICAgIGlmIChzaXplb2Yodm9pZCopID09IDQpCisgICAgICAgIEMgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoRi0+Z2V0Q29udGV4dCgpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGludHB0cl90KUFyZ1B0cik7CisgICAgICBlbHNlCisgICAgICAgIEMgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoRi0+Z2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KUFyZ1B0cik7CisgICAgICAvLyBDYXN0IHRoZSBpbnRlZ2VyIHRvIHBvaW50ZXIKKyAgICAgIEMgPSBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKEMsIEFyZ1R5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBBcmdzLnB1c2hfYmFjayhDKTsKKyAgfQorCisgIENhbGxJbnN0ICpUaGVDYWxsID0gQ2FsbEluc3Q6OkNyZWF0ZShGLCBBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgU3R1YkJCKTsKKyAgVGhlQ2FsbC0+c2V0Q2FsbGluZ0NvbnYoRi0+Z2V0Q2FsbGluZ0NvbnYoKSk7CisgIFRoZUNhbGwtPnNldFRhaWxDYWxsKCk7CisgIGlmICghVGhlQ2FsbC0+Z2V0VHlwZSgpLT5pc1ZvaWRUeSgpKQorICAgIC8vIFJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwuCisgICAgUmV0dXJuSW5zdDo6Q3JlYXRlKEYtPmdldENvbnRleHQoKSwgVGhlQ2FsbCwgU3R1YkJCKTsKKyAgZWxzZQorICAgIFJldHVybkluc3Q6OkNyZWF0ZShGLT5nZXRDb250ZXh0KCksIFN0dWJCQik7ICAgICAgICAgICAvLyBKdXN0IHJldHVybiB2b2lkLgorCisgIC8vIEZpbmFsbHksIGNhbGwgb3VyIG51bGxhcnkgc3R1YiBmdW5jdGlvbi4KKyAgR2VuZXJpY1ZhbHVlIFJlc3VsdCA9IHJ1bkZ1bmN0aW9uKFN0dWIsIHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4oKSk7CisgIC8vIEVyYXNlIGl0LCBzaW5jZSBubyBvdGhlciBmdW5jdGlvbiBjYW4gaGF2ZSBhIHJlZmVyZW5jZSB0byBpdC4KKyAgU3R1Yi0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIC8vIEFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAgcmV0dXJuIFJlc3VsdDsKK30KKwordm9pZCBKSVQ6OlJlZ2lzdGVySklURXZlbnRMaXN0ZW5lcihKSVRFdmVudExpc3RlbmVyICpMKSB7CisgIGlmIChMID09IE5VTEwpCisgICAgcmV0dXJuOworICBNdXRleEd1YXJkIGxvY2tlZChsb2NrKTsKKyAgRXZlbnRMaXN0ZW5lcnMucHVzaF9iYWNrKEwpOworfQordm9pZCBKSVQ6OlVucmVnaXN0ZXJKSVRFdmVudExpc3RlbmVyKEpJVEV2ZW50TGlzdGVuZXIgKkwpIHsKKyAgaWYgKEwgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIE11dGV4R3VhcmQgbG9ja2VkKGxvY2spOworICBzdGQ6OnZlY3RvcjxKSVRFdmVudExpc3RlbmVyKj46OnJldmVyc2VfaXRlcmF0b3IgST0KKyAgICAgIHN0ZDo6ZmluZChFdmVudExpc3RlbmVycy5yYmVnaW4oKSwgRXZlbnRMaXN0ZW5lcnMucmVuZCgpLCBMKTsKKyAgaWYgKEkgIT0gRXZlbnRMaXN0ZW5lcnMucmVuZCgpKSB7CisgICAgc3RkOjpzd2FwKCpJLCBFdmVudExpc3RlbmVycy5iYWNrKCkpOworICAgIEV2ZW50TGlzdGVuZXJzLnBvcF9iYWNrKCk7CisgIH0KK30KK3ZvaWQgSklUOjpOb3RpZnlGdW5jdGlvbkVtaXR0ZWQoCisgICAgY29uc3QgRnVuY3Rpb24gJkYsCisgICAgdm9pZCAqQ29kZSwgc2l6ZV90IFNpemUsCisgICAgY29uc3QgSklURXZlbnRfRW1pdHRlZEZ1bmN0aW9uRGV0YWlscyAmRGV0YWlscykgeworICBNdXRleEd1YXJkIGxvY2tlZChsb2NrKTsKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgUyA9IEV2ZW50TGlzdGVuZXJzLnNpemUoKTsgSSA8IFM7ICsrSSkgeworICAgIEV2ZW50TGlzdGVuZXJzW0ldLT5Ob3RpZnlGdW5jdGlvbkVtaXR0ZWQoRiwgQ29kZSwgU2l6ZSwgRGV0YWlscyk7CisgIH0KK30KKwordm9pZCBKSVQ6Ok5vdGlmeUZyZWVpbmdNYWNoaW5lQ29kZSh2b2lkICpPbGRQdHIpIHsKKyAgTXV0ZXhHdWFyZCBsb2NrZWQobG9jayk7CisgIGZvciAodW5zaWduZWQgSSA9IDAsIFMgPSBFdmVudExpc3RlbmVycy5zaXplKCk7IEkgPCBTOyArK0kpIHsKKyAgICBFdmVudExpc3RlbmVyc1tJXS0+Tm90aWZ5RnJlZWluZ01hY2hpbmVDb2RlKE9sZFB0cik7CisgIH0KK30KKworLy8vIHJ1bkpJVE9uRnVuY3Rpb24gLSBSdW4gdGhlIEZ1bmN0aW9uUGFzc01hbmFnZXIgZnVsbCBvZgorLy8vIGp1c3QtaW4tdGltZSBjb21waWxhdGlvbiBwYXNzZXMgb24gRiwgaG9wZWZ1bGx5IGZpbGxpbmcgaW4KKy8vLyBHbG9iYWxBZGRyZXNzW0ZdIHdpdGggdGhlIGFkZHJlc3Mgb2YgRidzIG1hY2hpbmUgY29kZS4KKy8vLwordm9pZCBKSVQ6OnJ1bkpJVE9uRnVuY3Rpb24oRnVuY3Rpb24gKkYsIE1hY2hpbmVDb2RlSW5mbyAqTUNJKSB7CisgIE11dGV4R3VhcmQgbG9ja2VkKGxvY2spOworCisgIGNsYXNzIE1DSUxpc3RlbmVyIDogcHVibGljIEpJVEV2ZW50TGlzdGVuZXIgeworICAgIE1hY2hpbmVDb2RlSW5mbyAqY29uc3QgTUNJOworICAgcHVibGljOgorICAgIE1DSUxpc3RlbmVyKE1hY2hpbmVDb2RlSW5mbyAqbWNpKSA6IE1DSShtY2kpIHt9CisgICAgdmlydHVhbCB2b2lkIE5vdGlmeUZ1bmN0aW9uRW1pdHRlZChjb25zdCBGdW5jdGlvbiAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ29kZSwgc2l6ZV90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbWl0dGVkRnVuY3Rpb25EZXRhaWxzICYpIHsKKyAgICAgIE1DSS0+c2V0QWRkcmVzcyhDb2RlKTsKKyAgICAgIE1DSS0+c2V0U2l6ZShTaXplKTsKKyAgICB9CisgIH07CisgIE1DSUxpc3RlbmVyIE1DSUwoTUNJKTsKKyAgaWYgKE1DSSkKKyAgICBSZWdpc3RlckpJVEV2ZW50TGlzdGVuZXIoJk1DSUwpOworCisgIHJ1bkpJVE9uRnVuY3Rpb25VbmxvY2tlZChGLCBsb2NrZWQpOworCisgIGlmIChNQ0kpCisgICAgVW5yZWdpc3RlckpJVEV2ZW50TGlzdGVuZXIoJk1DSUwpOworfQorCit2b2lkIEpJVDo6cnVuSklUT25GdW5jdGlvblVubG9ja2VkKEZ1bmN0aW9uICpGLCBjb25zdCBNdXRleEd1YXJkICZsb2NrZWQpIHsKKyAgYXNzZXJ0KCFpc0FscmVhZHlDb2RlR2VuZXJhdGluZyAmJiAiRXJyb3I6IFJlY3Vyc2l2ZSBjb21waWxhdGlvbiBkZXRlY3RlZCEiKTsKKworICBqaXRUaGVGdW5jdGlvbihGLCBsb2NrZWQpOworCisgIC8vIElmIHRoZSBmdW5jdGlvbiByZWZlcnJlZCB0byBhbm90aGVyIGZ1bmN0aW9uIHRoYXQgaGFkIG5vdCB5ZXQgYmVlbgorICAvLyByZWFkIGZyb20gYml0Y29kZSwgYW5kIHdlIGFyZSBqaXR0aW5nIG5vbi1sYXppbHksIGVtaXQgaXQgbm93LgorICB3aGlsZSAoIWppdHN0YXRlLT5nZXRQZW5kaW5nRnVuY3Rpb25zKGxvY2tlZCkuZW1wdHkoKSkgeworICAgIEZ1bmN0aW9uICpQRiA9IGppdHN0YXRlLT5nZXRQZW5kaW5nRnVuY3Rpb25zKGxvY2tlZCkuYmFjaygpOworICAgIGppdHN0YXRlLT5nZXRQZW5kaW5nRnVuY3Rpb25zKGxvY2tlZCkucG9wX2JhY2soKTsKKworICAgIGFzc2VydCghUEYtPmhhc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKCkgJiYKKyAgICAgICAgICAgIkV4dGVybmFsbHktZGVmaW5lZCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGluIHBlbmRpbmcgbGlzdC4iKTsKKworICAgIGppdFRoZUZ1bmN0aW9uKFBGLCBsb2NrZWQpOworICAgIAorICAgIC8vIE5vdyB0aGF0IHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBqaXR0ZWQsIGFzayB0aGUgSklURW1pdHRlciB0byByZXdyaXRlCisgICAgLy8gdGhlIHN0dWIgd2l0aCByZWFsIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLgorICAgIHVwZGF0ZUZ1bmN0aW9uU3R1YihQRik7CisgIH0KK30KKwordm9pZCBKSVQ6OmppdFRoZUZ1bmN0aW9uKEZ1bmN0aW9uICpGLCBjb25zdCBNdXRleEd1YXJkICZsb2NrZWQpIHsKKyAgaXNBbHJlYWR5Q29kZUdlbmVyYXRpbmcgPSB0cnVlOworICBqaXRzdGF0ZS0+Z2V0UE0obG9ja2VkKS5ydW4oKkYpOworICBpc0FscmVhZHlDb2RlR2VuZXJhdGluZyA9IGZhbHNlOworCisgIC8vIGNsZWFyIGJhc2ljIGJsb2NrIGFkZHJlc3NlcyBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGRvbmUKKyAgZ2V0QmFzaWNCbG9ja0FkZHJlc3NNYXAobG9ja2VkKS5jbGVhcigpOworfQorCisvLy8gZ2V0UG9pbnRlclRvRnVuY3Rpb24gLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgYWRkcmVzcyBvZiB0aGUKKy8vLyBzcGVjaWZpZWQgZnVuY3Rpb24sIGNvbXBpbGluZyBpdCBpZiBuZWNjZXNhcnkuCisvLy8KK3ZvaWQgKkpJVDo6Z2V0UG9pbnRlclRvRnVuY3Rpb24oRnVuY3Rpb24gKkYpIHsKKworICBpZiAodm9pZCAqQWRkciA9IGdldFBvaW50ZXJUb0dsb2JhbElmQXZhaWxhYmxlKEYpKQorICAgIHJldHVybiBBZGRyOyAgIC8vIENoZWNrIGlmIGZ1bmN0aW9uIGFscmVhZHkgY29kZSBnZW4nZAorCisgIE11dGV4R3VhcmQgbG9ja2VkKGxvY2spOworCisgIC8vIE5vdyB0aGF0IHRoaXMgdGhyZWFkIG93bnMgdGhlIGxvY2ssIG1ha2Ugc3VyZSB3ZSByZWFkIGluIHRoZSBmdW5jdGlvbiBpZiBpdAorICAvLyBleGlzdHMgaW4gdGhpcyBNb2R1bGUuCisgIHN0ZDo6c3RyaW5nIEVycm9yTXNnOworICBpZiAoRi0+TWF0ZXJpYWxpemUoJkVycm9yTXNnKSkgeworICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiRXJyb3IgcmVhZGluZyBmdW5jdGlvbiAnIiArIEYtPmdldE5hbWUoKSsKKyAgICAgICAgICAgICAgICAgICAgICAiJyBmcm9tIGJpdGNvZGUgZmlsZTogIiArIEVycm9yTXNnKTsKKyAgfQorCisgIC8vIC4uLiBhbmQgY2hlY2sgaWYgYW5vdGhlciB0aHJlYWQgaGFzIGFscmVhZHkgY29kZSBnZW4nZCB0aGUgZnVuY3Rpb24uCisgIGlmICh2b2lkICpBZGRyID0gZ2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoRikpCisgICAgcmV0dXJuIEFkZHI7CisKKyAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSB8fCBGLT5oYXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSgpKSB7CisgICAgYm9vbCBBYm9ydE9uRmFpbHVyZSA9ICFGLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCk7CisgICAgdm9pZCAqQWRkciA9IGdldFBvaW50ZXJUb05hbWVkRnVuY3Rpb24oRi0+Z2V0TmFtZSgpLCBBYm9ydE9uRmFpbHVyZSk7CisgICAgYWRkR2xvYmFsTWFwcGluZyhGLCBBZGRyKTsKKyAgICByZXR1cm4gQWRkcjsKKyAgfQorCisgIHJ1bkpJVE9uRnVuY3Rpb25VbmxvY2tlZChGLCBsb2NrZWQpOworCisgIHZvaWQgKkFkZHIgPSBnZXRQb2ludGVyVG9HbG9iYWxJZkF2YWlsYWJsZShGKTsKKyAgYXNzZXJ0KEFkZHIgJiYgIkNvZGUgZ2VuZXJhdGlvbiBkaWRuJ3QgYWRkIGZ1bmN0aW9uIHRvIEdsb2JhbEFkZHJlc3MgdGFibGUhIik7CisgIHJldHVybiBBZGRyOworfQorCit2b2lkIEpJVDo6YWRkUG9pbnRlclRvQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQiwgdm9pZCAqQWRkcikgeworICBNdXRleEd1YXJkIGxvY2tlZChsb2NrKTsKKyAgCisgIEJhc2ljQmxvY2tBZGRyZXNzTWFwVHk6Oml0ZXJhdG9yIEkgPQorICAgIGdldEJhc2ljQmxvY2tBZGRyZXNzTWFwKGxvY2tlZCkuZmluZChCQik7CisgIGlmIChJID09IGdldEJhc2ljQmxvY2tBZGRyZXNzTWFwKGxvY2tlZCkuZW5kKCkpIHsKKyAgICBnZXRCYXNpY0Jsb2NrQWRkcmVzc01hcChsb2NrZWQpW0JCXSA9IEFkZHI7CisgIH0gZWxzZSB7CisgICAgLy8gaWdub3JlIHJlcGVhdHM6IHNvbWUgQkJzIGNhbiBiZSBzcGxpdCBpbnRvIGZldyBNQkJzPworICB9Cit9CisKK3ZvaWQgSklUOjpjbGVhclBvaW50ZXJUb0Jhc2ljQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgTXV0ZXhHdWFyZCBsb2NrZWQobG9jayk7CisgIGdldEJhc2ljQmxvY2tBZGRyZXNzTWFwKGxvY2tlZCkuZXJhc2UoQkIpOworfQorCit2b2lkICpKSVQ6OmdldFBvaW50ZXJUb0Jhc2ljQmxvY2soQmFzaWNCbG9jayAqQkIpIHsKKyAgLy8gbWFrZSBzdXJlIGl0J3MgZnVuY3Rpb24gaXMgY29tcGlsZWQgYnkgSklUCisgICh2b2lkKWdldFBvaW50ZXJUb0Z1bmN0aW9uKEJCLT5nZXRQYXJlbnQoKSk7CisKKyAgLy8gcmVzb2x2ZSBiYXNpYyBibG9jayBhZGRyZXNzCisgIE11dGV4R3VhcmQgbG9ja2VkKGxvY2spOworICAKKyAgQmFzaWNCbG9ja0FkZHJlc3NNYXBUeTo6aXRlcmF0b3IgSSA9CisgICAgZ2V0QmFzaWNCbG9ja0FkZHJlc3NNYXAobG9ja2VkKS5maW5kKEJCKTsKKyAgaWYgKEkgIT0gZ2V0QmFzaWNCbG9ja0FkZHJlc3NNYXAobG9ja2VkKS5lbmQoKSkgeworICAgIHJldHVybiBJLT5zZWNvbmQ7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KDAgJiYgIkpJVCBkb2VzIG5vdCBoYXZlIEJCIGFkZHJlc3MgZm9yIGFkZHJlc3Mtb2YtbGFiZWwsIHdhcyIKKyAgICAgICAgICAgIiBpdCBlbGltaW5hdGVkIGJ5IG9wdGltaXplcj8iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvLy8gZ2V0T3JFbWl0R2xvYmFsVmFyaWFibGUgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBnbG9iYWwKKy8vLyB2YXJpYWJsZSwgcG9zc2libHkgZW1pdHRpbmcgaXQgdG8gbWVtb3J5IGlmIG5lZWRlZC4gIFRoaXMgaXMgdXNlZCBieSB0aGUKKy8vLyBFbWl0dGVyLgordm9pZCAqSklUOjpnZXRPckVtaXRHbG9iYWxWYXJpYWJsZShjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIHsKKyAgTXV0ZXhHdWFyZCBsb2NrZWQobG9jayk7CisKKyAgdm9pZCAqUHRyID0gZ2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoR1YpOworICBpZiAoUHRyKSByZXR1cm4gUHRyOworCisgIC8vIElmIHRoZSBnbG9iYWwgaXMgZXh0ZXJuYWwsIGp1c3QgcmVtZW1iZXIgdGhlIGFkZHJlc3MuCisgIGlmIChHVi0+aXNEZWNsYXJhdGlvbigpIHx8IEdWLT5oYXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSgpKSB7CisjaWYgSEFWRV9fX0RTT19IQU5ETEUKKyAgICBpZiAoR1YtPmdldE5hbWUoKSA9PSAiX19kc29faGFuZGxlIikKKyAgICAgIHJldHVybiAodm9pZCopJl9fZHNvX2hhbmRsZTsKKyNlbmRpZgorICAgIFB0ciA9IHN5czo6RHluYW1pY0xpYnJhcnk6OlNlYXJjaEZvckFkZHJlc3NPZlN5bWJvbChHVi0+Z2V0TmFtZSgpKTsKKyAgICBpZiAoUHRyID09IDApIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiQ291bGQgbm90IHJlc29sdmUgZXh0ZXJuYWwgZ2xvYmFsIGFkZHJlc3M6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICtHVi0+Z2V0TmFtZSgpKTsKKyAgICB9CisgICAgYWRkR2xvYmFsTWFwcGluZyhHViwgUHRyKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBJZiB0aGUgZ2xvYmFsIGhhc24ndCBiZWVuIGVtaXR0ZWQgdG8gbWVtb3J5IHlldCwgYWxsb2NhdGUgc3BhY2UgYW5kCisgICAgLy8gZW1pdCBpdCBpbnRvIG1lbW9yeS4KKyAgICBQdHIgPSBnZXRNZW1vcnlGb3JHVihHVik7CisgICAgYWRkR2xvYmFsTWFwcGluZyhHViwgUHRyKTsKKyAgICBFbWl0R2xvYmFsVmFyaWFibGUoR1YpOyAgLy8gSW5pdGlhbGl6ZSB0aGUgdmFyaWFibGUuCisgIH0KKyAgcmV0dXJuIFB0cjsKK30KKworLy8vIHJlY29tcGlsZUFuZFJlbGlua0Z1bmN0aW9uIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmb3JjZSBhIGZ1bmN0aW9uCisvLy8gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBjb21waWxlZCwgdG8gYmUgY29tcGlsZWQgYWdhaW4sIHBvc3NpYmx5CisvLy8gYWZ0ZXIgaXQgaGFzIGJlZW4gbW9kaWZpZWQuIFRoZW4gdGhlIGVudHJ5IHRvIHRoZSBvbGQgY29weSBpcyBvdmVyd3JpdHRlbgorLy8vIHdpdGggYSBicmFuY2ggdG8gdGhlIG5ldyBjb3B5LiBJZiB0aGVyZSB3YXMgbm8gb2xkIGNvcHksIHRoaXMgYWN0cworLy8vIGp1c3QgbGlrZSBKSVQ6OmdldFBvaW50ZXJUb0Z1bmN0aW9uKCkuCisvLy8KK3ZvaWQgKkpJVDo6cmVjb21waWxlQW5kUmVsaW5rRnVuY3Rpb24oRnVuY3Rpb24gKkYpIHsKKyAgdm9pZCAqT2xkQWRkciA9IGdldFBvaW50ZXJUb0dsb2JhbElmQXZhaWxhYmxlKEYpOworCisgIC8vIElmIGl0J3Mgbm90IGFscmVhZHkgY29tcGlsZWQgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHBhdGNoIGl0IHVwLgorICBpZiAoT2xkQWRkciA9PSAwKSB7IHJldHVybiBnZXRQb2ludGVyVG9GdW5jdGlvbihGKTsgfQorCisgIC8vIERlbGV0ZSB0aGUgb2xkIGZ1bmN0aW9uIG1hcHBpbmcuCisgIGFkZEdsb2JhbE1hcHBpbmcoRiwgMCk7CisKKyAgLy8gUmVjb2RlZ2VuIHRoZSBmdW5jdGlvbgorICBydW5KSVRPbkZ1bmN0aW9uKEYpOworCisgIC8vIFVwZGF0ZSBzdGF0ZSwgZm9yd2FyZCB0aGUgb2xkIGZ1bmN0aW9uIHRvIHRoZSBuZXcgZnVuY3Rpb24uCisgIHZvaWQgKkFkZHIgPSBnZXRQb2ludGVyVG9HbG9iYWxJZkF2YWlsYWJsZShGKTsKKyAgYXNzZXJ0KEFkZHIgJiYgIkNvZGUgZ2VuZXJhdGlvbiBkaWRuJ3QgYWRkIGZ1bmN0aW9uIHRvIEdsb2JhbEFkZHJlc3MgdGFibGUhIik7CisgIFRKSS5yZXBsYWNlTWFjaGluZUNvZGVGb3JGdW5jdGlvbihPbGRBZGRyLCBBZGRyKTsKKyAgcmV0dXJuIEFkZHI7Cit9CisKKy8vLyBnZXRNZW1vcnlGb3JHViAtIFRoaXMgbWV0aG9kIGFic3RyYWN0cyBtZW1vcnkgYWxsb2NhdGlvbiBvZiBnbG9iYWwKKy8vLyB2YXJpYWJsZSBzbyB0aGF0IHRoZSBKSVQgY2FuIGFsbG9jYXRlIHRocmVhZCBsb2NhbCB2YXJpYWJsZXMgZGVwZW5kaW5nCisvLy8gb24gdGhlIHRhcmdldC4KKy8vLworY2hhciogSklUOjpnZXRNZW1vcnlGb3JHVihjb25zdCBHbG9iYWxWYXJpYWJsZSogR1YpIHsKKyAgY2hhciAqUHRyOworCisgIC8vIEdsb2JhbFZhcmlhYmxlJ3Mgd2hpY2ggYXJlIG5vdCAiY29uc3RhbnQiIHdpbGwgY2F1c2UgdHJvdWJsZSBpbiBhIHNlcnZlcgorICAvLyBzaXR1YXRpb24uIEl0J3MgcmV0dXJuZWQgaW4gdGhlIHNhbWUgYmxvY2sgb2YgbWVtb3J5IGFzIGNvZGUgd2hpY2ggbWF5CisgIC8vIG5vdCBiZSB3cml0YWJsZS4KKyAgaWYgKGlzR1ZDb21waWxhdGlvbkRpc2FibGVkKCkgJiYgIUdWLT5pc0NvbnN0YW50KCkpIHsKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkNvbXBpbGF0aW9uIG9mIG5vbi1pbnRlcm5hbCBHbG9iYWxWYWx1ZSBpcyBkaXNhYmxlZCEiKTsKKyAgfQorCisgIC8vIFNvbWUgYXBwbGljYXRpb25zIHJlcXVpcmUgZ2xvYmFscyBhbmQgY29kZSB0byBsaXZlIHRvZ2V0aGVyLCBzbyB0aGV5IG1heQorICAvLyBiZSBhbGxvY2F0ZWQgaW50byB0aGUgc2FtZSBidWZmZXIsIGJ1dCBpbiBnZW5lcmFsIGdsb2JhbHMgYXJlIGFsbG9jYXRlZAorICAvLyB0aHJvdWdoIHRoZSBtZW1vcnkgbWFuYWdlciB3aGljaCBwdXRzIHRoZW0gbmVhciB0aGUgY29kZSBidXQgbm90IGluIHRoZQorICAvLyBzYW1lIGJ1ZmZlci4KKyAgY29uc3QgVHlwZSAqR2xvYmFsVHlwZSA9IEdWLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCk7CisgIHNpemVfdCBTID0gZ2V0VGFyZ2V0RGF0YSgpLT5nZXRUeXBlQWxsb2NTaXplKEdsb2JhbFR5cGUpOworICBzaXplX3QgQSA9IGdldFRhcmdldERhdGEoKS0+Z2V0UHJlZmVycmVkQWxpZ25tZW50KEdWKTsKKyAgaWYgKEdWLT5pc1RocmVhZExvY2FsKCkpIHsKKyAgICBNdXRleEd1YXJkIGxvY2tlZChsb2NrKTsKKyAgICBQdHIgPSBUSkkuYWxsb2NhdGVUaHJlYWRMb2NhbE1lbW9yeShTKTsKKyAgfSBlbHNlIGlmIChUSkkuYWxsb2NhdGVTZXBhcmF0ZUdWTWVtb3J5KCkpIHsKKyAgICBpZiAoQSA8PSA4KSB7CisgICAgICBQdHIgPSAoY2hhciopbWFsbG9jKFMpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBbGxvY2F0ZSBTK0EgYnl0ZXMgb2YgbWVtb3J5LCB0aGVuIHVzZSBhbiBhbGlnbmVkIHBvaW50ZXIgd2l0aGluIHRoYXQKKyAgICAgIC8vIHNwYWNlLgorICAgICAgUHRyID0gKGNoYXIqKW1hbGxvYyhTK0EpOworICAgICAgdW5zaWduZWQgTWlzQWxpZ25lZCA9ICgoaW50cHRyX3QpUHRyICYgKEEtMSkpOworICAgICAgUHRyID0gUHRyICsgKE1pc0FsaWduZWQgPyAoQS1NaXNBbGlnbmVkKSA6IDApOworICAgIH0KKyAgfSBlbHNlIGlmIChBbGxvY2F0ZUdWc1dpdGhDb2RlKSB7CisgICAgUHRyID0gKGNoYXIqKUpDRS0+YWxsb2NhdGVTcGFjZShTLCBBKTsKKyAgfSBlbHNlIHsKKyAgICBQdHIgPSAoY2hhciopSkNFLT5hbGxvY2F0ZUdsb2JhbChTLCBBKTsKKyAgfQorICByZXR1cm4gUHRyOworfQorCit2b2lkIEpJVDo6YWRkUGVuZGluZ0Z1bmN0aW9uKEZ1bmN0aW9uICpGKSB7CisgIE11dGV4R3VhcmQgbG9ja2VkKGxvY2spOworICBqaXRzdGF0ZS0+Z2V0UGVuZGluZ0Z1bmN0aW9ucyhsb2NrZWQpLnB1c2hfYmFjayhGKTsKK30KKworCitKSVRFdmVudExpc3RlbmVyOjp+SklURXZlbnRMaXN0ZW5lcigpIHt9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVQuaCBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL0pJVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTc2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVQuaApAQCAtMCwwICsxLDIzNyBAQAorLy89PT0tLSBKSVQuaCAtIENsYXNzIGRlZmluaXRpb24gZm9yIHRoZSBKSVQgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdG9wLWxldmVsIEpJVCBkYXRhIHN0cnVjdHVyZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEpJVF9ICisjZGVmaW5lIEpJVF9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ZhbHVlSGFuZGxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitzdHJ1Y3QgSklURXZlbnRfRW1pdHRlZEZ1bmN0aW9uRGV0YWlsczsKK2NsYXNzIE1hY2hpbmVDb2RlRW1pdHRlcjsKK2NsYXNzIE1hY2hpbmVDb2RlSW5mbzsKK2NsYXNzIFRhcmdldEpJVEluZm87CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCitjbGFzcyBKSVRTdGF0ZSB7Citwcml2YXRlOgorICBGdW5jdGlvblBhc3NNYW5hZ2VyIFBNOyAgLy8gUGFzc2VzIHRvIGNvbXBpbGUgYSBmdW5jdGlvbgorICBNb2R1bGUgKk07ICAgICAgICAgICAgICAgLy8gTW9kdWxlIHVzZWQgdG8gY3JlYXRlIHRoZSBQTQorCisgIC8vLyBQZW5kaW5nRnVuY3Rpb25zIC0gRnVuY3Rpb25zIHdoaWNoIGhhdmUgbm90IGJlZW4gY29kZSBnZW5lcmF0ZWQgeWV0LCBidXQKKyAgLy8vIHdlcmUgY2FsbGVkIGZyb20gYSBmdW5jdGlvbiBiZWluZyBjb2RlIGdlbmVyYXRlZC4KKyAgc3RkOjp2ZWN0b3I8QXNzZXJ0aW5nVkg8RnVuY3Rpb24+ID4gUGVuZGluZ0Z1bmN0aW9uczsKKworcHVibGljOgorICBleHBsaWNpdCBKSVRTdGF0ZShNb2R1bGUgKk0pIDogUE0oTSksIE0oTSkge30KKworICBGdW5jdGlvblBhc3NNYW5hZ2VyICZnZXRQTShjb25zdCBNdXRleEd1YXJkICZMKSB7CisgICAgcmV0dXJuIFBNOworICB9CisgIAorICBNb2R1bGUgKmdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIE07IH0KKyAgc3RkOjp2ZWN0b3I8QXNzZXJ0aW5nVkg8RnVuY3Rpb24+ID4gJmdldFBlbmRpbmdGdW5jdGlvbnMoY29uc3QgTXV0ZXhHdWFyZCAmTCl7CisgICAgcmV0dXJuIFBlbmRpbmdGdW5jdGlvbnM7CisgIH0KK307CisKKworY2xhc3MgSklUIDogcHVibGljIEV4ZWN1dGlvbkVuZ2luZSB7CisgIC8vLyB0eXBlcworICB0eXBlZGVmIFZhbHVlTWFwPGNvbnN0IEJhc2ljQmxvY2sgKiwgdm9pZCAqPgorICAgICAgQmFzaWNCbG9ja0FkZHJlc3NNYXBUeTsKKyAgLy8vIGRhdGEKKyAgVGFyZ2V0TWFjaGluZSAmVE07ICAgICAgIC8vIFRoZSBjdXJyZW50IHRhcmdldCB3ZSBhcmUgY29tcGlsaW5nIHRvCisgIFRhcmdldEpJVEluZm8gJlRKSTsgICAgICAvLyBUaGUgSklUSW5mbyBmb3IgdGhlIHRhcmdldCB3ZSBhcmUgY29tcGlsaW5nIHRvCisgIEpJVENvZGVFbWl0dGVyICpKQ0U7ICAgICAvLyBKQ0Ugb2JqZWN0CisgIHN0ZDo6dmVjdG9yPEpJVEV2ZW50TGlzdGVuZXIqPiBFdmVudExpc3RlbmVyczsKKworICAvLy8gQWxsb2NhdGVHVnNXaXRoQ29kZSAtIFNvbWUgYXBwbGljYXRpb25zIHJlcXVpcmUgdGhhdCBnbG9iYWwgdmFyaWFibGVzIGFuZAorICAvLy8gY29kZSBiZSBhbGxvY2F0ZWQgaW50byB0aGUgc2FtZSByZWdpb24gb2YgbWVtb3J5LCBpbiB3aGljaCBjYXNlIHRoaXMgZmxhZworICAvLy8gc2hvdWxkIGJlIHNldCB0byB0cnVlLiAgRG9pbmcgc28gYnJlYWtzIGZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uLgorICBib29sIEFsbG9jYXRlR1ZzV2l0aENvZGU7CisKKyAgLy8vIFRydWUgd2hpbGUgdGhlIEpJVCBpcyBnZW5lcmF0aW5nIGNvZGUuICBVc2VkIHRvIGFzc2VydCBhZ2FpbnN0IHJlY3Vyc2l2ZQorICAvLy8gZW50cnkuCisgIGJvb2wgaXNBbHJlYWR5Q29kZUdlbmVyYXRpbmc7CisKKyAgSklUU3RhdGUgKmppdHN0YXRlOworCisgIC8vLyBCYXNpY0Jsb2NrQWRkcmVzc01hcCAtIEEgbWFwcGluZyBiZXR3ZWVuIExMVk0gYmFzaWMgYmxvY2tzIGFuZCB0aGVpcgorICAvLy8gYWN0dWFsaXplZCB2ZXJzaW9uLCBvbmx5IGZpbGxlZCBmb3IgYmFzaWMgYmxvY2tzIHRoYXQgaGF2ZSB0aGVpciBhZGRyZXNzCisgIC8vLyB0YWtlbi4KKyAgQmFzaWNCbG9ja0FkZHJlc3NNYXBUeSBCYXNpY0Jsb2NrQWRkcmVzc01hcDsKKworCisgIEpJVChNb2R1bGUgKk0sIFRhcmdldE1hY2hpbmUgJnRtLCBUYXJnZXRKSVRJbmZvICZ0amksCisgICAgICBKSVRNZW1vcnlNYW5hZ2VyICpKTU0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgYm9vbCBBbGxvY2F0ZUdWc1dpdGhDb2RlKTsKK3B1YmxpYzoKKyAgfkpJVCgpOworCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyKCkgeworICAgIEpJVEN0b3IgPSBjcmVhdGVKSVQ7CisgIH0KKyAgCisgIC8vLyBnZXRKSVRJbmZvIC0gUmV0dXJuIHRoZSB0YXJnZXQgSklUIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKyAgLy8vCisgIFRhcmdldEpJVEluZm8gJmdldEpJVEluZm8oKSBjb25zdCB7IHJldHVybiBUSkk7IH0KKworICAvLy8gY3JlYXRlIC0gQ3JlYXRlIGFuIHJldHVybiBhIG5ldyBKSVQgY29tcGlsZXIgaWYgdGhlcmUgaXMgb25lIGF2YWlsYWJsZQorICAvLy8gZm9yIHRoZSBjdXJyZW50IHRhcmdldC4gIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuCisgIC8vLworICBzdGF0aWMgRXhlY3V0aW9uRW5naW5lICpjcmVhdGUoTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVE1lbW9yeU1hbmFnZXIgKkpNTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6RGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgR1ZzV2l0aENvZGUgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZU1vZGVsOjpNb2RlbCBDTU0gPSBDb2RlTW9kZWw6OkRlZmF1bHQpIHsKKyAgICByZXR1cm4gRXhlY3V0aW9uRW5naW5lOjpjcmVhdGVKSVQoTSwgRXJyLCBKTU0sIE9wdExldmVsLCBHVnNXaXRoQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01NKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBhZGRNb2R1bGUoTW9kdWxlICpNKTsKKyAgCisgIC8vLyByZW1vdmVNb2R1bGUgLSBSZW1vdmUgYSBNb2R1bGUgZnJvbSB0aGUgbGlzdCBvZiBtb2R1bGVzLiAgUmV0dXJucyB0cnVlIGlmCisgIC8vLyBNIGlzIGZvdW5kLgorICB2aXJ0dWFsIGJvb2wgcmVtb3ZlTW9kdWxlKE1vZHVsZSAqTSk7CisKKyAgLy8vIHJ1bkZ1bmN0aW9uIC0gU3RhcnQgZXhlY3V0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzLgorICAvLy8KKyAgdmlydHVhbCBHZW5lcmljVmFsdWUgcnVuRnVuY3Rpb24oRnVuY3Rpb24gKkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gJkFyZ1ZhbHVlcyk7CisKKyAgLy8vIGdldFBvaW50ZXJUb05hbWVkRnVuY3Rpb24gLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIGZ1bmN0aW9uIGJ5IHVzaW5nIHRoZSBkbHN5bSBmdW5jdGlvbiBjYWxsLiAgQXMgc3VjaCBpdCBpcyBvbmx5CisgIC8vLyB1c2VmdWwgZm9yIHJlc29sdmluZyBsaWJyYXJ5IHN5bWJvbHMsIG5vdCBjb2RlIGdlbmVyYXRlZCBzeW1ib2xzLgorICAvLy8KKyAgLy8vIElmIEFib3J0T25GYWlsdXJlIGlzIGZhbHNlIGFuZCBubyBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzCisgIC8vLyBmb3VuZCwgdGhpcyBmdW5jdGlvbiBzaWxlbnRseSByZXR1cm5zIGEgbnVsbCBwb2ludGVyLiBPdGhlcndpc2UsCisgIC8vLyBpdCBwcmludHMgYSBtZXNzYWdlIHRvIHN0ZGVyciBhbmQgYWJvcnRzLgorICAvLy8KKyAgdm9pZCAqZ2V0UG9pbnRlclRvTmFtZWRGdW5jdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFib3J0T25GYWlsdXJlID0gdHJ1ZSk7CisKKyAgLy8gQ29tcGlsYXRpb25DYWxsYmFjayAtIEludm9rZWQgdGhlIGZpcnN0IHRpbWUgdGhhdCBhIGNhbGwgc2l0ZSBpcyBmb3VuZCwKKyAgLy8gd2hpY2ggY2F1c2VzIGxhenkgY29tcGlsYXRpb24gb2YgdGhlIHRhcmdldCBmdW5jdGlvbi4KKyAgLy8KKyAgc3RhdGljIHZvaWQgQ29tcGlsYXRpb25DYWxsYmFjaygpOworCisgIC8vLyBnZXRQb2ludGVyVG9GdW5jdGlvbiAtIFRoaXMgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLAorICAvLy8gY29tcGlsaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgLy8vCisgIHZvaWQgKmdldFBvaW50ZXJUb0Z1bmN0aW9uKEZ1bmN0aW9uICpGKTsKKworICAvLy8gYWRkUG9pbnRlclRvQmFzaWNCbG9jayAtIEFkZHMgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWMgYmFzaWMgYmxvY2suCisgIHZvaWQgYWRkUG9pbnRlclRvQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQiwgdm9pZCAqQWRkcik7CisKKyAgLy8vIGNsZWFyUG9pbnRlclRvQmFzaWNCbG9jayAtIFJlbW92ZXMgYWRkcmVzcyBvZiBzcGVjaWZpYyBiYXNpYyBibG9jay4KKyAgdm9pZCBjbGVhclBvaW50ZXJUb0Jhc2ljQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBnZXRQb2ludGVyVG9CYXNpY0Jsb2NrIC0gVGhpcyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgYmFzaWMKKyAgLy8vIGJsb2NrLCBhc3N1bWluZyBmdW5jdGlvbiBpcyBjb21waWxlZC4KKyAgdm9pZCAqZ2V0UG9pbnRlclRvQmFzaWNCbG9jayhCYXNpY0Jsb2NrICpCQik7CisgIAorICAvLy8gZ2V0T3JFbWl0R2xvYmFsVmFyaWFibGUgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBnbG9iYWwKKyAgLy8vIHZhcmlhYmxlLCBwb3NzaWJseSBlbWl0dGluZyBpdCB0byBtZW1vcnkgaWYgbmVlZGVkLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZQorICAvLy8gRW1pdHRlci4KKyAgdm9pZCAqZ2V0T3JFbWl0R2xvYmFsVmFyaWFibGUoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKTsKKworICAvLy8gZ2V0UG9pbnRlclRvRnVuY3Rpb25PclN0dWIgLSBJZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGhhcyBiZWVuCisgIC8vLyBjb2RlLWdlbidkLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbi4gIElmIG5vdCwgY29tcGlsZSBpdCwgb3IgdXNlCisgIC8vLyBhIHN0dWIgdG8gaW1wbGVtZW50IGxhenkgY29tcGlsYXRpb24gaWYgYXZhaWxhYmxlLgorICAvLy8KKyAgdm9pZCAqZ2V0UG9pbnRlclRvRnVuY3Rpb25PclN0dWIoRnVuY3Rpb24gKkYpOworCisgIC8vLyByZWNvbXBpbGVBbmRSZWxpbmtGdW5jdGlvbiAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZm9yY2UgYSBmdW5jdGlvbgorICAvLy8gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBjb21waWxlZCwgdG8gYmUgY29tcGlsZWQgYWdhaW4sIHBvc3NpYmx5CisgIC8vLyBhZnRlciBpdCBoYXMgYmVlbiBtb2RpZmllZC4gVGhlbiB0aGUgZW50cnkgdG8gdGhlIG9sZCBjb3B5IGlzIG92ZXJ3cml0dGVuCisgIC8vLyB3aXRoIGEgYnJhbmNoIHRvIHRoZSBuZXcgY29weS4gSWYgdGhlcmUgd2FzIG5vIG9sZCBjb3B5LCB0aGlzIGFjdHMKKyAgLy8vIGp1c3QgbGlrZSBKSVQ6OmdldFBvaW50ZXJUb0Z1bmN0aW9uKCkuCisgIC8vLworICB2b2lkICpyZWNvbXBpbGVBbmRSZWxpbmtGdW5jdGlvbihGdW5jdGlvbiAqRik7CisKKyAgLy8vIGZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uIC0gZGVhbGxvY2F0ZSBtZW1vcnkgdXNlZCB0byBjb2RlLWdlbmVyYXRlIHRoaXMKKyAgLy8vIEZ1bmN0aW9uLgorICAvLy8KKyAgdm9pZCBmcmVlTWFjaGluZUNvZGVGb3JGdW5jdGlvbihGdW5jdGlvbiAqRik7CisKKyAgLy8vIGFkZFBlbmRpbmdGdW5jdGlvbiAtIHdoaWxlIGppdHRpbmcgbm9uLWxhemlseSwgYSBjYWxsZWQgYnV0IG5vbi1jb2RlZ2VuJ2QKKyAgLy8vIGZ1bmN0aW9uIHdhcyBlbmNvdW50ZXJlZC4gIEFkZCBpdCB0byBhIHBlbmRpbmcgbGlzdCB0byBiZSBwcm9jZXNzZWQgYWZ0ZXIgCisgIC8vLyB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgLy8vCisgIHZvaWQgYWRkUGVuZGluZ0Z1bmN0aW9uKEZ1bmN0aW9uICpGKTsKKworICAvLy8gZ2V0Q29kZUVtaXR0ZXIgLSBSZXR1cm4gdGhlIGNvZGUgZW1pdHRlciB0aGlzIEpJVCBpcyBlbWl0dGluZyBpbnRvLgorICAvLy8KKyAgSklUQ29kZUVtaXR0ZXIgKmdldENvZGVFbWl0dGVyKCkgY29uc3QgeyByZXR1cm4gSkNFOyB9CisKKyAgLy8vIHNlbGVjdFRhcmdldCAtIFBpY2sgYSB0YXJnZXQgZWl0aGVyIHZpYSAtbWFyY2ggb3IgYnkgZ3Vlc3NpbmcgdGhlIG5hdGl2ZQorICAvLy8gYXJjaC4gIEFkZCBhbnkgQ1BVIGZlYXR1cmVzIHNwZWNpZmllZCB2aWEgLW1jcHUgb3IgLW1hdHRyLgorICBzdGF0aWMgVGFyZ2V0TWFjaGluZSAqc2VsZWN0VGFyZ2V0KE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTUFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1DUFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiYgTUF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnIpOworCisgIHN0YXRpYyBFeGVjdXRpb25FbmdpbmUgKmNyZWF0ZUpJVChNb2R1bGUgKk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyb3JTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRNZW1vcnlNYW5hZ2VyICpKTU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgR1ZzV2l0aENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlTW9kZWw6Ok1vZGVsIENNTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNQXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNQ1BVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiYgTUF0dHJzKTsKKworICAvLyBSdW4gdGhlIEpJVCBvbiBGIGFuZCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdlbmVyYXRlZCBjb2RlCisgIHZvaWQgcnVuSklUT25GdW5jdGlvbihGdW5jdGlvbiAqRiwgTWFjaGluZUNvZGVJbmZvICpNQ0kgPSAwKTsKKworICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJKSVRFdmVudExpc3RlbmVyKEpJVEV2ZW50TGlzdGVuZXIgKkwpOworICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3RlckpJVEV2ZW50TGlzdGVuZXIoSklURXZlbnRMaXN0ZW5lciAqTCk7CisgIC8vLyBUaGVzZSBmdW5jdGlvbnMgY29ycmVzcG9uZCB0byB0aGUgbWV0aG9kcyBvbiBKSVRFdmVudExpc3RlbmVyLiAgVGhleQorICAvLy8gaXRlcmF0ZSBvdmVyIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycyBhbmQgY2FsbCB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb24KKyAgLy8vIGVhY2guCisgIHZvaWQgTm90aWZ5RnVuY3Rpb25FbWl0dGVkKAorICAgICAgY29uc3QgRnVuY3Rpb24gJkYsIHZvaWQgKkNvZGUsIHNpemVfdCBTaXplLAorICAgICAgY29uc3QgSklURXZlbnRfRW1pdHRlZEZ1bmN0aW9uRGV0YWlscyAmRGV0YWlscyk7CisgIHZvaWQgTm90aWZ5RnJlZWluZ01hY2hpbmVDb2RlKHZvaWQgKk9sZFB0cik7CisKKyAgQmFzaWNCbG9ja0FkZHJlc3NNYXBUeSAmCisgIGdldEJhc2ljQmxvY2tBZGRyZXNzTWFwKGNvbnN0IE11dGV4R3VhcmQgJikgeworICAgIHJldHVybiBCYXNpY0Jsb2NrQWRkcmVzc01hcDsKKyAgfQorCisKK3ByaXZhdGU6CisgIHN0YXRpYyBKSVRDb2RlRW1pdHRlciAqY3JlYXRlRW1pdHRlcihKSVQgJkosIEpJVE1lbW9yeU1hbmFnZXIgKkpNTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE1hY2hpbmUgJnRtKTsKKyAgdm9pZCBydW5KSVRPbkZ1bmN0aW9uVW5sb2NrZWQoRnVuY3Rpb24gKkYsIGNvbnN0IE11dGV4R3VhcmQgJmxvY2tlZCk7CisgIHZvaWQgdXBkYXRlRnVuY3Rpb25TdHViKEZ1bmN0aW9uICpGKTsKKyAgdm9pZCBqaXRUaGVGdW5jdGlvbihGdW5jdGlvbiAqRiwgY29uc3QgTXV0ZXhHdWFyZCAmbG9ja2VkKTsKKworcHJvdGVjdGVkOgorCisgIC8vLyBnZXRNZW1vcnlmb3JHViAtIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBnbG9iYWwgdmFyaWFibGUuCisgIHZpcnR1YWwgY2hhciogZ2V0TWVtb3J5Rm9yR1YoY29uc3QgR2xvYmFsVmFyaWFibGUqIEdWKTsKKworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVREZWJ1Z1JlZ2lzdGVyZXIuaCBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL0pJVERlYnVnUmVnaXN0ZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNTNkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVREZWJ1Z1JlZ2lzdGVyZXIuaApAQCAtMCwwICsxLDExNiBAQAorLy89PT0tLSBKSVREZWJ1Z1JlZ2lzdGVyZXIuaCAtIFJlZ2lzdGVyIGRlYnVnIHN5bWJvbHMgZm9yIEpJVCAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIEpJVERlYnVnUmVnaXN0ZXJlciBvYmplY3QgdGhhdCBpcyB1c2VkIGJ5IHRoZSBKSVQgdG8KKy8vIHJlZ2lzdGVyIGRlYnVnIGluZm8gd2l0aCBkZWJ1Z2dlcnMgbGlrZSBHREIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTl9FTkdJTkVfSklUX0RFQlVHUkVHSVNURVJFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9OX0VOR0lORV9KSVRfREVCVUdSRUdJU1RFUkVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBUaGlzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggZ2RiL2dkYi9qaXQuaCAuCitleHRlcm4gIkMiIHsKKworICB0eXBlZGVmIGVudW0geworICAgIEpJVF9OT0FDVElPTiA9IDAsCisgICAgSklUX1JFR0lTVEVSX0ZOLAorICAgIEpJVF9VTlJFR0lTVEVSX0ZOCisgIH0gaml0X2FjdGlvbnNfdDsKKworICBzdHJ1Y3Qgaml0X2NvZGVfZW50cnkgeworICAgIHN0cnVjdCBqaXRfY29kZV9lbnRyeSAqbmV4dF9lbnRyeTsKKyAgICBzdHJ1Y3Qgaml0X2NvZGVfZW50cnkgKnByZXZfZW50cnk7CisgICAgY29uc3QgY2hhciAqc3ltZmlsZV9hZGRyOworICAgIHVpbnQ2NF90IHN5bWZpbGVfc2l6ZTsKKyAgfTsKKworICBzdHJ1Y3Qgaml0X2Rlc2NyaXB0b3IgeworICAgIHVpbnQzMl90IHZlcnNpb247CisgICAgLy8gVGhpcyBzaG91bGQgYmUgaml0X2FjdGlvbnNfdCwgYnV0IHdlIHdhbnQgdG8gYmUgc3BlY2lmaWMgYWJvdXQgdGhlCisgICAgLy8gYml0LXdpZHRoLgorICAgIHVpbnQzMl90IGFjdGlvbl9mbGFnOworICAgIHN0cnVjdCBqaXRfY29kZV9lbnRyeSAqcmVsZXZhbnRfZW50cnk7CisgICAgc3RydWN0IGppdF9jb2RlX2VudHJ5ICpmaXJzdF9lbnRyeTsKKyAgfTsKKworfQorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEVMRlNlY3Rpb247CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKKworLy8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGluZm9ybWF0aW9uIHdlIHdhbnQgdG8gc2VuZCB0byB0aGUgZGVidWdnZXIuCisvLy8KK3N0cnVjdCBEZWJ1Z0luZm8geworICB1aW50OF90ICpGblN0YXJ0OworICB1aW50OF90ICpGbkVuZDsKKyAgdWludDhfdCAqRWhTdGFydDsKKyAgdWludDhfdCAqRWhFbmQ7CisKKyAgRGVidWdJbmZvKCkgOiBGblN0YXJ0KDApLCBGbkVuZCgwKSwgRWhTdGFydCgwKSwgRWhFbmQoMCkge30KK307CisKK3R5cGVkZWYgRGVuc2VNYXA8IGNvbnN0IEZ1bmN0aW9uKiwgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBqaXRfY29kZV9lbnRyeSo+ID4KKyAgUmVnaXN0ZXJlZEZ1bmN0aW9uc01hcDsKKworLy8vIFRoaXMgY2xhc3MgcmVnaXN0ZXJzIGRlYnVnIGluZm8gZm9yIEpJVGVkIGNvZGUgd2l0aCBhbiBhdHRhY2hlZCBkZWJ1Z2dlci4KKy8vLyBXaXRob3V0IHByb3BlciBkZWJ1ZyBpbmZvLCBHREIgY2FuJ3QgZG8gdGhpbmdzIGxpa2Ugc291cmNlIGxldmVsIGRlYnVnZ2luZworLy8vIG9yIGV2ZW4gcHJvZHVjZSBhIHByb3BlciBzdGFjayB0cmFjZSBvbiBsaW51eC14ODZfNjQuICBUbyB1c2UgdGhpcyBjbGFzcywKKy8vLyB3aGVuZXZlciBhIGZ1bmN0aW9uIGlzIEpJVGVkLCBjcmVhdGUgYSBEZWJ1Z0luZm8gc3RydWN0IGFuZCBwYXNzIGl0IHRvIHRoZQorLy8vIFJlZ2lzdGVyRnVuY3Rpb24gbWV0aG9kLiAgVGhlIG1ldGhvZCB3aWxsIHRoZW4gZG8gd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IHRvCisvLy8gaW5mb3JtIHRoZSBkZWJ1Z2dlciBhYm91dCB0aGUgSklUZWQgZnVuY3Rpb24uCitjbGFzcyBKSVREZWJ1Z1JlZ2lzdGVyZXIgeworCisgIFRhcmdldE1hY2hpbmUgJlRNOworCisgIC8vLyBGbk1hcCAtIEEgbWFwIG9mIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkIHRvIHRoZSBhc3NvY2lhdGVkCisgIC8vLyB0ZW1wb3JhcnkgZmlsZXMuICBVc2VkIGZvciBjbGVhbnVwLgorICBSZWdpc3RlcmVkRnVuY3Rpb25zTWFwIEZuTWFwOworCisgIC8vLyBNYWtlRUxGIC0gQnVpbGRzIHRoZSBFTEYgZmlsZSBpbiBtZW1vcnkgYW5kIHJldHVybnMgYSBzdGQ6OnN0cmluZyB0aGF0CisgIC8vLyBjb250YWlucyB0aGUgRUxGLgorICBzdGQ6OnN0cmluZyBNYWtlRUxGKGNvbnN0IEZ1bmN0aW9uICpGLCBEZWJ1Z0luZm8gJkkpOworCitwdWJsaWM6CisgIEpJVERlYnVnUmVnaXN0ZXJlcihUYXJnZXRNYWNoaW5lICZ0bSk7CisKKyAgLy8vIH5KSVREZWJ1Z1JlZ2lzdGVyZXIgLSBVbnJlZ2lzdGVycyBhbGwgY29kZSBhbmQgZnJlZXMgc3ltYm9sIGZpbGVzLgorICAvLy8KKyAgfkpJVERlYnVnUmVnaXN0ZXJlcigpOworCisgIC8vLyBSZWdpc3RlckZ1bmN0aW9uIC0gUmVnaXN0ZXIgZGVidWcgaW5mbyBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggYW4KKyAgLy8vIGF0dGFjaGVkIGRlYnVnZ2VyLiAgQ2xpZW50cyBtdXN0IGNhbGwgVW5yZWdpc3RlckZ1bmN0aW9uIG9uIGFsbAorICAvLy8gcmVnaXN0ZXJlZCBmdW5jdGlvbnMgYmVmb3JlIGRlbGV0aW5nIHRoZW0gdG8gZnJlZSB0aGUgYXNzb2NpYXRlZCBzeW1ib2wKKyAgLy8vIGZpbGUgYW5kIHVucmVnaXN0ZXIgaXQgZnJvbSB0aGUgZGVidWdnZXIuCisgIHZvaWQgUmVnaXN0ZXJGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAqRiwgRGVidWdJbmZvICZJKTsKKworICAvLy8gVW5yZWdpc3RlckZ1bmN0aW9uIC0gVW5yZWdpc3RlciB0aGUgZGVidWcgaW5mbyBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uCisgIC8vLyBmcm9tIHRoZSBkZWJ1Z2dlciBhbmQgZnJlZSBhc3NvY2lhdGVkIG1lbW9yeS4KKyAgdm9pZCBVbnJlZ2lzdGVyRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKkYpOworCitwcml2YXRlOgorICAvLy8gVW5yZWdpc3RlckZ1bmN0aW9uSW50ZXJuYWwgLSBVbnJlZ2lzdGVyIHRoZSBkZWJ1ZyBpbmZvIGZvciB0aGUgZ2l2ZW4KKyAgLy8vIGZ1bmN0aW9uIGZyb20gdGhlIGRlYnVnZ2VyIGFuZCBkZWxldGUgYW55IHRlbXBvcmFyeSBmaWxlcy4gIFRoZSBwcml2YXRlCisgIC8vLyB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IHJlbW92ZSB0aGUgZnVuY3Rpb24gZnJvbSBGbk1hcCBzbyB0aGF0IGl0CisgIC8vLyBjYW4gYmUgY2FsbGVkIHdoaWxlIGl0ZXJhdGluZyBvdmVyIEZuTWFwLgorICB2b2lkIFVucmVnaXN0ZXJGdW5jdGlvbkludGVybmFsKFJlZ2lzdGVyZWRGdW5jdGlvbnNNYXA6Oml0ZXJhdG9yIEkpOworCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05fRU5HSU5FX0pJVF9ERUJVR1JFR0lTVEVSRVJfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvSklURHdhcmZFbWl0dGVyLmggYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVREd2FyZkVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDk1NjgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvSklURHdhcmZFbWl0dGVyLmgKQEAgLTAsMCArMSw3MSBAQAorLy89PT0tLS0tLS0gSklURHdhcmZFbWl0dGVyLmggLSBXcml0ZSBkd2FyZiB0YWJsZXMgaW50byBtZW1vcnkgLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIEpJVER3YXJmRW1pdHRlciBvYmplY3QgdGhhdCBpcyB1c2VkIGJ5IHRoZSBKSVQgdG8KKy8vIHdyaXRlIGR3YXJmIHRhYmxlcyB0byBtZW1vcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTl9FTkdJTkVfSklUX0RXQVJGRU1JVFRFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9OX0VOR0lORV9KSVRfRFdBUkZFTUlUVEVSX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEpJVENvZGVFbWl0dGVyOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZU1vZHVsZUluZm87CitjbGFzcyBNYWNoaW5lTW92ZTsKK2NsYXNzIFRhcmdldERhdGE7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCitjbGFzcyBKSVREd2FyZkVtaXR0ZXIgeworICBjb25zdCBUYXJnZXREYXRhKiBURDsKKyAgSklUQ29kZUVtaXR0ZXIqIEpDRTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvKiBSSTsKKyAgTWFjaGluZU1vZHVsZUluZm8qIE1NSTsKKyAgSklUJiBKaXQ7CisgIGJvb2wgc3RhY2tHcm93dGhEaXJlY3Rpb247CisgIAorICB1bnNpZ25lZCBjaGFyKiBFbWl0RXhjZXB0aW9uVGFibGUoTWFjaGluZUZ1bmN0aW9uKiBNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIFN0YXJ0RnVuY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogRW5kRnVuY3Rpb24pIGNvbnN0OworCisgIHZvaWQgRW1pdEZyYW1lTW92ZXMoaW50cHRyX3QgQmFzZUxhYmVsUHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lTW92ZT4gJk1vdmVzKSBjb25zdDsKKyAgICAKKyAgdW5zaWduZWQgY2hhciogRW1pdENvbW1vbkVIRnJhbWUoY29uc3QgRnVuY3Rpb24qIFBlcnNvbmFsaXR5KSBjb25zdDsKKworICB1bnNpZ25lZCBjaGFyKiBFbWl0RUhGcmFtZShjb25zdCBGdW5jdGlvbiogUGVyc29uYWxpdHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBTdGFydEJ1ZmZlclB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogU3RhcnRGdW5jdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIEVuZEZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBFeGNlcHRpb25UYWJsZSkgY29uc3Q7CisgICAgCitwdWJsaWM6CisgIAorICBKSVREd2FyZkVtaXR0ZXIoSklUJiBqaXQpOworICAKKyAgdW5zaWduZWQgY2hhciogRW1pdER3YXJmVGFibGUoTWFjaGluZUZ1bmN0aW9uJiBGLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXImIEpDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogU3RhcnRGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogRW5kRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqICZFSEZyYW1lUHRyKTsKKyAgCisgIAorICB2b2lkIHNldE1vZHVsZUluZm8oTWFjaGluZU1vZHVsZUluZm8qIEluZm8pIHsKKyAgICBNTUkgPSBJbmZvOworICB9Cit9OworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTl9FTkdJTkVfSklUX0RXQVJGRU1JVFRFUl9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVRFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL0pJVEVtaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjc5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVRFbWl0dGVyLmNwcApAQCAtMCwwICsxLDE0OTIgQEAKKy8vPT09LS0gSklURW1pdHRlci5jcHAgLSBXcml0ZSBtYWNoaW5lIGNvZGUgdG8gZXhlY3V0YWJsZSBtZW1vcnkgLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBNYWNoaW5lQ29kZUVtaXR0ZXIgb2JqZWN0IHRoYXQgaXMgdXNlZCBieSB0aGUgSklUIHRvCisvLyB3cml0ZSBtYWNoaW5lIGNvZGUgdG8gbWVtb3J5IGFuZCByZW1lbWJlciB3aGVyZSByZWxvY2F0YWJsZSB2YWx1ZXMgYXJlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiaml0IgorI2luY2x1ZGUgIkpJVC5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRGVidWdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0pJVENvZGVFbWl0dGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29kZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVsb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0dlbmVyaWNWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVEV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRNZW1vcnlNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEpJVEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTXV0ZXhHdWFyZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0Rpc2Fzc2VtYmxlci5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL01lbW9yeS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1ZhbHVlTWFwLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxpb21hbmlwPgorI2VuZGlmCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUJ5dGVzLCAiTnVtYmVyIG9mIGJ5dGVzIG9mIG1hY2hpbmUgY29kZSBjb21waWxlZCIpOworU1RBVElTVElDKE51bVJlbG9zLCAiTnVtYmVyIG9mIHJlbG9jYXRpb25zIGFwcGxpZWQiKTsKK1NUQVRJU1RJQyhOdW1SZXRyaWVzLCAiTnVtYmVyIG9mIHJldHJpZXMgd2l0aCBtb3JlIG1lbW9yeSIpOworCisKKy8vIEEgZGVjbGFyYXRpb24gbWF5IHN0b3AgYmVpbmcgYSBkZWNsYXJhdGlvbiBvbmNlIGl0J3MgZnVsbHkgcmVhZCBmcm9tIGJpdGNvZGUuCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBGIGlzIGZ1bGx5IHJlYWQgYW5kIGlzIHN0aWxsIGEgZGVjbGFyYXRpb24uCitzdGF0aWMgYm9vbCBpc05vbkdob3N0RGVjbGFyYXRpb24oY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgcmV0dXJuIEYtPmlzRGVjbGFyYXRpb24oKSAmJiAhRi0+aXNNYXRlcmlhbGl6YWJsZSgpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSklUIGxhenkgY29tcGlsYXRpb24gY29kZS4KKy8vCituYW1lc3BhY2UgeworICBjbGFzcyBKSVRFbWl0dGVyOworICBjbGFzcyBKSVRSZXNvbHZlclN0YXRlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+CisgIHN0cnVjdCBOb1JBVVdWYWx1ZU1hcENvbmZpZyA6IHB1YmxpYyBWYWx1ZU1hcENvbmZpZzxWYWx1ZVR5PiB7CisgICAgdHlwZWRlZiBKSVRSZXNvbHZlclN0YXRlICpFeHRyYURhdGE7CisgICAgc3RhdGljIHZvaWQgb25SQVVXKEpJVFJlc29sdmVyU3RhdGUgKiwgVmFsdWUgKk9sZCwgVmFsdWUgKk5ldykgeworICAgICAgYXNzZXJ0KGZhbHNlICYmICJUaGUgSklUIGRvZXNuJ3Qga25vdyBob3cgdG8gaGFuZGxlIGEiCisgICAgICAgICAgICAgIiBSQVVXIG9uIGEgdmFsdWUgaXQgaGFzIGVtaXR0ZWQuIik7CisgICAgfQorICB9OworCisgIHN0cnVjdCBDYWxsU2l0ZVZhbHVlTWFwQ29uZmlnIDogcHVibGljIE5vUkFVV1ZhbHVlTWFwQ29uZmlnPEZ1bmN0aW9uKj4geworICAgIHR5cGVkZWYgSklUUmVzb2x2ZXJTdGF0ZSAqRXh0cmFEYXRhOworICAgIHN0YXRpYyB2b2lkIG9uRGVsZXRlKEpJVFJlc29sdmVyU3RhdGUgKkpSUywgRnVuY3Rpb24gKkYpOworICB9OworCisgIGNsYXNzIEpJVFJlc29sdmVyU3RhdGUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBWYWx1ZU1hcDxGdW5jdGlvbiosIHZvaWQqLCBOb1JBVVdWYWx1ZU1hcENvbmZpZzxGdW5jdGlvbio+ID4KKyAgICAgIEZ1bmN0aW9uVG9MYXp5U3R1Yk1hcFR5OworICAgIHR5cGVkZWYgc3RkOjptYXA8dm9pZCosIEFzc2VydGluZ1ZIPEZ1bmN0aW9uPiA+IENhbGxTaXRlVG9GdW5jdGlvbk1hcFR5OworICAgIHR5cGVkZWYgVmFsdWVNYXA8RnVuY3Rpb24gKiwgU21hbGxQdHJTZXQ8dm9pZCosIDE+LAorICAgICAgICAgICAgICAgICAgICAgQ2FsbFNpdGVWYWx1ZU1hcENvbmZpZz4gRnVuY3Rpb25Ub0NhbGxTaXRlc01hcFR5OworICAgIHR5cGVkZWYgc3RkOjptYXA8QXNzZXJ0aW5nVkg8R2xvYmFsVmFsdWU+LCB2b2lkKj4gR2xvYmFsVG9JbmRpcmVjdFN5bU1hcFR5OworICBwcml2YXRlOgorICAgIC8vLyBGdW5jdGlvblRvTGF6eVN0dWJNYXAgLSBLZWVwIHRyYWNrIG9mIHRoZSBsYXp5IHN0dWIgY3JlYXRlZCBmb3IgYQorICAgIC8vLyBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHNvIHRoYXQgd2UgY2FuIHJldXNlIHRoZW0gaWYgbmVjZXNzYXJ5LgorICAgIEZ1bmN0aW9uVG9MYXp5U3R1Yk1hcFR5IEZ1bmN0aW9uVG9MYXp5U3R1Yk1hcDsKKworICAgIC8vLyBDYWxsU2l0ZVRvRnVuY3Rpb25NYXAgLSBLZWVwIHRyYWNrIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGVhY2ggbGF6eSBjYWxsCisgICAgLy8vIHNpdGUgY29ycmVzcG9uZHMgdG8sIGFuZCB2aWNlIHZlcnNhLgorICAgIENhbGxTaXRlVG9GdW5jdGlvbk1hcFR5IENhbGxTaXRlVG9GdW5jdGlvbk1hcDsKKyAgICBGdW5jdGlvblRvQ2FsbFNpdGVzTWFwVHkgRnVuY3Rpb25Ub0NhbGxTaXRlc01hcDsKKworICAgIC8vLyBHbG9iYWxUb0luZGlyZWN0U3ltTWFwIC0gS2VlcCB0cmFjayBvZiB0aGUgaW5kaXJlY3Qgc3ltYm9sIGNyZWF0ZWQgZm9yIGEKKyAgICAvLy8gcGFydGljdWxhciBHbG9iYWxWYXJpYWJsZSBzbyB0aGF0IHdlIGNhbiByZXVzZSB0aGVtIGlmIG5lY2Vzc2FyeS4KKyAgICBHbG9iYWxUb0luZGlyZWN0U3ltTWFwVHkgR2xvYmFsVG9JbmRpcmVjdFN5bU1hcDsKKworICAgIC8vLyBJbnN0YW5jZSBvZiB0aGUgSklUIHRoaXMgUmVzb2x2ZXJTdGF0ZSBzZXJ2ZXMuCisgICAgSklUICpUaGVKSVQ7CisKKyAgcHVibGljOgorICAgIEpJVFJlc29sdmVyU3RhdGUoSklUICpqaXQpIDogRnVuY3Rpb25Ub0xhenlTdHViTWFwKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGxTaXRlc01hcCh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZUpJVChqaXQpIHt9CisKKyAgICBGdW5jdGlvblRvTGF6eVN0dWJNYXBUeSYgZ2V0RnVuY3Rpb25Ub0xhenlTdHViTWFwKAorICAgICAgY29uc3QgTXV0ZXhHdWFyZCYgbG9ja2VkKSB7CisgICAgICBhc3NlcnQobG9ja2VkLmhvbGRzKFRoZUpJVC0+bG9jaykpOworICAgICAgcmV0dXJuIEZ1bmN0aW9uVG9MYXp5U3R1Yk1hcDsKKyAgICB9CisKKyAgICBHbG9iYWxUb0luZGlyZWN0U3ltTWFwVHkmIGdldEdsb2JhbFRvSW5kaXJlY3RTeW1NYXAoY29uc3QgTXV0ZXhHdWFyZCYgbG9ja2VkKSB7CisgICAgICBhc3NlcnQobG9ja2VkLmhvbGRzKFRoZUpJVC0+bG9jaykpOworICAgICAgcmV0dXJuIEdsb2JhbFRvSW5kaXJlY3RTeW1NYXA7CisgICAgfQorCisgICAgcGFpcjx2b2lkICosIEZ1bmN0aW9uICo+IExvb2t1cEZ1bmN0aW9uRnJvbUNhbGxTaXRlKAorICAgICAgICBjb25zdCBNdXRleEd1YXJkICZsb2NrZWQsIHZvaWQgKkNhbGxTaXRlKSBjb25zdCB7CisgICAgICBhc3NlcnQobG9ja2VkLmhvbGRzKFRoZUpJVC0+bG9jaykpOworCisgICAgICAvLyBUaGUgYWRkcmVzcyBnaXZlbiB0byB1cyBmb3IgdGhlIHN0dWIgbWF5IG5vdCBiZSBleGFjdGx5IHJpZ2h0LCBpdCBtaWdodCBiZQorICAgICAgLy8gYSBsaXR0bGUgYml0IGFmdGVyIHRoZSBzdHViLiAgQXMgc3VjaCwgdXNlIHVwcGVyX2JvdW5kIHRvIGZpbmQgaXQuCisgICAgICBDYWxsU2l0ZVRvRnVuY3Rpb25NYXBUeTo6Y29uc3RfaXRlcmF0b3IgSSA9CisgICAgICAgIENhbGxTaXRlVG9GdW5jdGlvbk1hcC51cHBlcl9ib3VuZChDYWxsU2l0ZSk7CisgICAgICBhc3NlcnQoSSAhPSBDYWxsU2l0ZVRvRnVuY3Rpb25NYXAuYmVnaW4oKSAmJgorICAgICAgICAgICAgICJUaGlzIGlzIG5vdCBhIGtub3duIGNhbGwgc2l0ZSEiKTsKKyAgICAgIC0tSTsKKyAgICAgIHJldHVybiAqSTsKKyAgICB9CisKKyAgICB2b2lkIEFkZENhbGxTaXRlKGNvbnN0IE11dGV4R3VhcmQgJmxvY2tlZCwgdm9pZCAqQ2FsbFNpdGUsIEZ1bmN0aW9uICpGKSB7CisgICAgICBhc3NlcnQobG9ja2VkLmhvbGRzKFRoZUpJVC0+bG9jaykpOworCisgICAgICBib29sIEluc2VydGVkID0gQ2FsbFNpdGVUb0Z1bmN0aW9uTWFwLmluc2VydCgKKyAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDYWxsU2l0ZSwgRikpLnNlY29uZDsKKyAgICAgICh2b2lkKUluc2VydGVkOworICAgICAgYXNzZXJ0KEluc2VydGVkICYmICJQYWlyIHdhcyBhbHJlYWR5IGluIENhbGxTaXRlVG9GdW5jdGlvbk1hcCIpOworICAgICAgRnVuY3Rpb25Ub0NhbGxTaXRlc01hcFtGXS5pbnNlcnQoQ2FsbFNpdGUpOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIEZ1bmN0aW9uIG9mIHRoZSBzdHViIGlmIGEgc3R1YiB3YXMgZXJhc2VkLCBvciBOVUxMIGlmIHRoZXJlCisgICAgLy8gd2FzIG5vIHN0dWIuICBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGNhbGwtc2l0ZS0+ZnVuY3Rpb24gbWFwIHRvIGZpbmQgYQorICAgIC8vIHJlbGV2YW50IGZ1bmN0aW9uLCBidXQgYXNzZXJ0cyB0aGF0IG9ubHkgc3R1YnMgYW5kIG5vdCBvdGhlciBjYWxsIHNpdGVzCisgICAgLy8gd2lsbCBiZSBwYXNzZWQgaW4uCisgICAgRnVuY3Rpb24gKkVyYXNlU3R1Yihjb25zdCBNdXRleEd1YXJkICZsb2NrZWQsIHZvaWQgKlN0dWIpOworCisgICAgdm9pZCBFcmFzZUFsbENhbGxTaXRlc0Zvcihjb25zdCBNdXRleEd1YXJkICZsb2NrZWQsIEZ1bmN0aW9uICpGKSB7CisgICAgICBhc3NlcnQobG9ja2VkLmhvbGRzKFRoZUpJVC0+bG9jaykpOworICAgICAgRXJhc2VBbGxDYWxsU2l0ZXNGb3JQcmVsb2NrZWQoRik7CisgICAgfQorICAgIHZvaWQgRXJhc2VBbGxDYWxsU2l0ZXNGb3JQcmVsb2NrZWQoRnVuY3Rpb24gKkYpOworCisgICAgLy8gRXJhc2VzIF9hbGxfIGNhbGwgc2l0ZXMgcmVnYXJkbGVzcyBvZiB0aGVpciBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCB0bworICAgIC8vIHVucmVnaXN0ZXIgdGhlIHN0dWIgYWRkcmVzc2VzIGZyb20gdGhlIFN0dWJUb1Jlc29sdmVyTWFwIGluCisgICAgLy8gfkpJVFJlc29sdmVyKCkuCisgICAgdm9pZCBFcmFzZUFsbENhbGxTaXRlc1ByZWxvY2tlZCgpOworICB9OworCisgIC8vLyBKSVRSZXNvbHZlciAtIEtlZXAgdHJhY2sgb2YsIGFuZCByZXNvbHZlLCBjYWxsIHNpdGVzIGZvciBmdW5jdGlvbnMgdGhhdAorICAvLy8gaGF2ZSBub3QgeWV0IGJlZW4gY29tcGlsZWQuCisgIGNsYXNzIEpJVFJlc29sdmVyIHsKKyAgICB0eXBlZGVmIEpJVFJlc29sdmVyU3RhdGU6OkZ1bmN0aW9uVG9MYXp5U3R1Yk1hcFR5IEZ1bmN0aW9uVG9MYXp5U3R1Yk1hcFR5OworICAgIHR5cGVkZWYgSklUUmVzb2x2ZXJTdGF0ZTo6Q2FsbFNpdGVUb0Z1bmN0aW9uTWFwVHkgQ2FsbFNpdGVUb0Z1bmN0aW9uTWFwVHk7CisgICAgdHlwZWRlZiBKSVRSZXNvbHZlclN0YXRlOjpHbG9iYWxUb0luZGlyZWN0U3ltTWFwVHkgR2xvYmFsVG9JbmRpcmVjdFN5bU1hcFR5OworCisgICAgLy8vIExhenlSZXNvbHZlckZuIC0gVGhlIHRhcmdldCBsYXp5IHJlc29sdmVyIGZ1bmN0aW9uIHRoYXQgd2UgYWN0dWFsbHkKKyAgICAvLy8gcmV3cml0ZSBpbnN0cnVjdGlvbnMgdG8gdXNlLgorICAgIFRhcmdldEpJVEluZm86OkxhenlSZXNvbHZlckZuIExhenlSZXNvbHZlckZuOworCisgICAgSklUUmVzb2x2ZXJTdGF0ZSBzdGF0ZTsKKworICAgIC8vLyBFeHRlcm5hbEZuVG9TdHViTWFwIC0gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBGdW5jdGlvblRvTGF6eVN0dWJNYXAKKyAgICAvLy8gZm9yIGV4dGVybmFsIGZ1bmN0aW9ucy4gIFRPRE86IE9mIGNvdXJzZSwgZXh0ZXJuYWwgZnVuY3Rpb25zIGRvbid0IG5lZWQKKyAgICAvLy8gYSBsYXp5IHN0dWIuICBJdCdzIGFjdHVhbGx5IGhlcmUgdG8gbWFrZSBpdCBtb3JlIGxpa2VseSB0aGF0IGZhciBjYWxscworICAgIC8vLyBzdWNjZWVkLCBidXQgbm8gc2luZ2xlIHN0dWIgY2FuIGd1YXJhbnRlZSB0aGF0LiAgSSdsbCByZW1vdmUgdGhpcyBpbiBhCisgICAgLy8vIHN1YnNlcXVlbnQgY2hlY2tpbiB3aGVuIEkgYWN0dWFsbHkgZml4IGZhciBjYWxscy4KKyAgICBzdGQ6Om1hcDx2b2lkKiwgdm9pZCo+IEV4dGVybmFsRm5Ub1N0dWJNYXA7CisKKyAgICAvLy8gcmV2R09UTWFwIC0gbWFwIGFkZHJlc3NlcyB0byBpbmRleGVzIGluIHRoZSBHT1QKKyAgICBzdGQ6Om1hcDx2b2lkKiwgdW5zaWduZWQ+IHJldkdPVE1hcDsKKyAgICB1bnNpZ25lZCBuZXh0R09USW5kZXg7CisKKyAgICBKSVRFbWl0dGVyICZKRTsKKworICAgIC8vLyBJbnN0YW5jZSBvZiBKSVQgY29ycmVzcG9uZGluZyB0byB0aGlzIFJlc29sdmVyLgorICAgIEpJVCAqVGhlSklUOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBKSVRSZXNvbHZlcihKSVQgJmppdCwgSklURW1pdHRlciAmamUpCisgICAgICA6IHN0YXRlKCZqaXQpLCBuZXh0R09USW5kZXgoMCksIEpFKGplKSwgVGhlSklUKCZqaXQpIHsKKyAgICAgIExhenlSZXNvbHZlckZuID0gaml0LmdldEpJVEluZm8oKS5nZXRMYXp5UmVzb2x2ZXJGdW5jdGlvbihKSVRDb21waWxlckZuKTsKKyAgICB9CisKKyAgICB+SklUUmVzb2x2ZXIoKTsKKworICAgIC8vLyBnZXRMYXp5RnVuY3Rpb25TdHViSWZBdmFpbGFibGUgLSBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24ncworICAgIC8vLyBsYXp5LWNvbXBpbGF0aW9uIHN0dWIgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLgorICAgIHZvaWQgKmdldExhenlGdW5jdGlvblN0dWJJZkF2YWlsYWJsZShGdW5jdGlvbiAqRik7CisKKyAgICAvLy8gZ2V0TGF6eUZ1bmN0aW9uU3R1YiAtIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbidzCisgICAgLy8vIGxhenktY29tcGlsYXRpb24gc3R1YiwgY3JlYXRpbmcgb25lIG9uIGRlbWFuZCBhcyBuZWVkZWQuCisgICAgdm9pZCAqZ2V0TGF6eUZ1bmN0aW9uU3R1YihGdW5jdGlvbiAqRik7CisKKyAgICAvLy8gZ2V0RXh0ZXJuYWxGdW5jdGlvblN0dWIgLSBSZXR1cm4gYSBzdHViIGZvciB0aGUgZnVuY3Rpb24gYXQgdGhlCisgICAgLy8vIHNwZWNpZmllZCBhZGRyZXNzLCBjcmVhdGVkIGxhemlseSBvbiBkZW1hbmQuCisgICAgdm9pZCAqZ2V0RXh0ZXJuYWxGdW5jdGlvblN0dWIodm9pZCAqRm5BZGRyKTsKKworICAgIC8vLyBnZXRHbG9iYWxWYWx1ZUluZGlyZWN0U3ltIC0gUmV0dXJuIGFuIGluZGlyZWN0IHN5bWJvbCBjb250YWluaW5nIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgR1YgYWRkcmVzcy4KKyAgICB2b2lkICpnZXRHbG9iYWxWYWx1ZUluZGlyZWN0U3ltKEdsb2JhbFZhbHVlICpWLCB2b2lkICpHVkFkZHJlc3MpOworCisgICAgdm9pZCBnZXRSZWxvY2F0YWJsZUdWcyhTbWFsbFZlY3RvckltcGw8R2xvYmFsVmFsdWUqPiAmR1ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHZvaWQqPiAmUHRycyk7CisKKyAgICAvLy8gZ2V0R09USW5kZXhGb3JBZGRyZXNzIC0gUmV0dXJuIGEgbmV3IG9yIGV4aXN0aW5nIGluZGV4IGluIHRoZSBHT1QgZm9yCisgICAgLy8vIGFuIGFkZHJlc3MuICBUaGlzIGZ1bmN0aW9uIG9ubHkgbWFuYWdlcyBzbG90cywgaXQgZG9lcyBub3QgbWFuYWdlIHRoZQorICAgIC8vLyBjb250ZW50cyBvZiB0aGUgc2xvdHMgb3IgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEdPVC4KKyAgICB1bnNpZ25lZCBnZXRHT1RJbmRleEZvckFkZHIodm9pZCAqYWRkcik7CisKKyAgICAvLy8gSklUQ29tcGlsZXJGbiAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlc29sdmUgYSBzdHViIHRvIGEgY29tcGlsZWQKKyAgICAvLy8gYWRkcmVzcy4gIElmIHRoZSBMTFZNIEZ1bmN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0dWIgaGFzIG5vdCB5ZXQKKyAgICAvLy8gYmVlbiBjb21waWxlZCwgdGhpcyBmdW5jdGlvbiBjb21waWxlcyBpdCBmaXJzdC4KKyAgICBzdGF0aWMgdm9pZCAqSklUQ29tcGlsZXJGbih2b2lkICpTdHViKTsKKyAgfTsKKworICBjbGFzcyBTdHViVG9SZXNvbHZlck1hcFR5IHsKKyAgICAvLy8gTWFwIGEgc3R1YiBhZGRyZXNzIHRvIGEgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgYSBKSVRSZXNvbHZlciBzbyB0aGF0CisgICAgLy8vIGxhemlseS1jb21waWxlZCBmdW5jdGlvbnMgY2FuIGZpbmQgdGhlIHJpZ2h0IHJlc29sdmVyIHRvIHVzZS4KKyAgICAvLy8KKyAgICAvLy8gR3VhcmRlZCBieSBMb2NrLgorICAgIHN0ZDo6bWFwPHZvaWQqLCBKSVRSZXNvbHZlcio+IE1hcDsKKworICAgIC8vLyBHdWFyZHMgTWFwIGZyb20gY29uY3VycmVudCBhY2Nlc3Nlcy4KKyAgICBtdXRhYmxlIHN5czo6TXV0ZXggTG9jazsKKworICBwdWJsaWM6CisgICAgLy8vIFJlZ2lzdGVycyBhIFN0dWIgdG8gYmUgcmVzb2x2ZWQgYnkgUmVzb2x2ZXIuCisgICAgdm9pZCBSZWdpc3RlclN0dWJSZXNvbHZlcih2b2lkICpTdHViLCBKSVRSZXNvbHZlciAqUmVzb2x2ZXIpIHsKKyAgICAgIE11dGV4R3VhcmQgZ3VhcmQoTG9jayk7CisgICAgICBNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFN0dWIsIFJlc29sdmVyKSk7CisgICAgfQorICAgIC8vLyBVbnJlZ2lzdGVycyB0aGUgU3R1YiB3aGVuIGl0J3MgaW52YWxpZGF0ZWQuCisgICAgdm9pZCBVbnJlZ2lzdGVyU3R1YlJlc29sdmVyKHZvaWQgKlN0dWIpIHsKKyAgICAgIE11dGV4R3VhcmQgZ3VhcmQoTG9jayk7CisgICAgICBNYXAuZXJhc2UoU3R1Yik7CisgICAgfQorICAgIC8vLyBSZXR1cm5zIHRoZSBKSVRSZXNvbHZlciBpbnN0YW5jZSB0aGF0IG93bnMgdGhlIFN0dWIuCisgICAgSklUUmVzb2x2ZXIgKmdldFJlc29sdmVyRnJvbVN0dWIodm9pZCAqU3R1YikgY29uc3QgeworICAgICAgTXV0ZXhHdWFyZCBndWFyZChMb2NrKTsKKyAgICAgIC8vIFRoZSBhZGRyZXNzIGdpdmVuIHRvIHVzIGZvciB0aGUgc3R1YiBtYXkgbm90IGJlIGV4YWN0bHkgcmlnaHQsIGl0IG1pZ2h0CisgICAgICAvLyBiZSBhIGxpdHRsZSBiaXQgYWZ0ZXIgdGhlIHN0dWIuICBBcyBzdWNoLCB1c2UgdXBwZXJfYm91bmQgdG8gZmluZCBpdC4KKyAgICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgdHJpY2sgYXMgaW4gTG9va3VwRnVuY3Rpb25Gcm9tQ2FsbFNpdGUgZnJvbQorICAgICAgLy8gSklUUmVzb2x2ZXJTdGF0ZS4KKyAgICAgIHN0ZDo6bWFwPHZvaWQqLCBKSVRSZXNvbHZlcio+Ojpjb25zdF9pdGVyYXRvciBJID0gTWFwLnVwcGVyX2JvdW5kKFN0dWIpOworICAgICAgYXNzZXJ0KEkgIT0gTWFwLmJlZ2luKCkgJiYgIlRoaXMgaXMgbm90IGEga25vd24gc3R1YiEiKTsKKyAgICAgIC0tSTsKKyAgICAgIHJldHVybiBJLT5zZWNvbmQ7CisgICAgfQorICAgIC8vLyBUcnVlIGlmIGFueSBzdHVicyByZWZlciB0byB0aGUgZ2l2ZW4gcmVzb2x2ZXIuIE9ubHkgdXNlZCBpbiBhbiBhc3NlcnQoKS4KKyAgICAvLy8gTyhOKQorICAgIGJvb2wgUmVzb2x2ZXJIYXNTdHVicyhKSVRSZXNvbHZlciogUmVzb2x2ZXIpIGNvbnN0IHsKKyAgICAgIE11dGV4R3VhcmQgZ3VhcmQoTG9jayk7CisgICAgICBmb3IgKHN0ZDo6bWFwPHZvaWQqLCBKSVRSZXNvbHZlcio+Ojpjb25zdF9pdGVyYXRvciBJID0gTWFwLmJlZ2luKCksCisgICAgICAgICAgICAgRSA9IE1hcC5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgaWYgKEktPnNlY29uZCA9PSBSZXNvbHZlcikKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH07CisgIC8vLyBUaGlzIG5lZWRzIHRvIGJlIHN0YXRpYyBzbyB0aGF0IGEgbGF6eSBjYWxsIHN0dWIgY2FuIGFjY2VzcyBpdCB3aXRoIG5vCisgIC8vLyBjb250ZXh0IGV4Y2VwdCB0aGUgYWRkcmVzcyBvZiB0aGUgc3R1Yi4KKyAgTWFuYWdlZFN0YXRpYzxTdHViVG9SZXNvbHZlck1hcFR5PiBTdHViVG9SZXNvbHZlck1hcDsKKworICAvLy8gSklURW1pdHRlciAtIFRoZSBKSVQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1hY2hpbmVDb2RlRW1pdHRlciwgd2hpY2ggaXMKKyAgLy8vIHVzZWQgdG8gb3V0cHV0IGZ1bmN0aW9ucyB0byBtZW1vcnkgZm9yIGV4ZWN1dGlvbi4KKyAgY2xhc3MgSklURW1pdHRlciA6IHB1YmxpYyBKSVRDb2RlRW1pdHRlciB7CisgICAgSklUTWVtb3J5TWFuYWdlciAqTWVtTWdyOworCisgICAgLy8gV2hlbiBvdXRwdXR0aW5nIGEgZnVuY3Rpb24gc3R1YiBpbiB0aGUgY29udGV4dCBvZiBzb21lIG90aGVyIGZ1bmN0aW9uLCB3ZQorICAgIC8vIHNhdmUgQnVmZmVyQmVnaW4vQnVmZmVyRW5kL0N1ckJ1ZmZlclB0ciBoZXJlLgorICAgIHVpbnQ4X3QgKlNhdmVkQnVmZmVyQmVnaW4sICpTYXZlZEJ1ZmZlckVuZCwgKlNhdmVkQ3VyQnVmZmVyUHRyOworCisgICAgLy8gV2hlbiByZWF0dGVtcHRpbmcgdG8gSklUIGEgZnVuY3Rpb24gYWZ0ZXIgcnVubmluZyBvdXQgb2Ygc3BhY2UsIHdlIHN0b3JlCisgICAgLy8gdGhlIGVzdGltYXRlZCBzaXplIG9mIHRoZSBmdW5jdGlvbiB3ZSdyZSB0cnlpbmcgdG8gSklUIGhlcmUsIHNvIHdlIGNhbgorICAgIC8vIGFzayB0aGUgbWVtb3J5IG1hbmFnZXIgZm9yIGF0IGxlYXN0IHRoaXMgbXVjaCBzcGFjZS4gIFdoZW4gd2UKKyAgICAvLyBzdWNjZXNzZnVsbHkgZW1pdCB0aGUgZnVuY3Rpb24sIHdlIHJlc2V0IHRoaXMgYmFjayB0byB6ZXJvLgorICAgIHVpbnRwdHJfdCBTaXplRXN0aW1hdGU7CisKKyAgICAvLy8gUmVsb2NhdGlvbnMgLSBUaGVzZSBhcmUgdGhlIHJlbG9jYXRpb25zIHRoYXQgdGhlIGZ1bmN0aW9uIG5lZWRzLCBhcworICAgIC8vLyBlbWl0dGVkLgorICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVSZWxvY2F0aW9uPiBSZWxvY2F0aW9uczsKKworICAgIC8vLyBNQkJMb2NhdGlvbnMgLSBUaGlzIHZlY3RvciBpcyBhIG1hcHBpbmcgZnJvbSBNQkIgSUQncyB0byB0aGVpciBhZGRyZXNzLgorICAgIC8vLyBJdCBpcyBmaWxsZWQgaW4gYnkgdGhlIFN0YXJ0TWFjaGluZUJhc2ljQmxvY2sgY2FsbGJhY2sgYW5kIHF1ZXJpZWQgYnkKKyAgICAvLy8gdGhlIGdldE1hY2hpbmVCYXNpY0Jsb2NrQWRkcmVzcyBjYWxsYmFjay4KKyAgICBzdGQ6OnZlY3Rvcjx1aW50cHRyX3Q+IE1CQkxvY2F0aW9uczsKKworICAgIC8vLyBDb25zdGFudFBvb2wgLSBUaGUgY29uc3RhbnQgcG9vbCBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgICAgLy8vCisgICAgTWFjaGluZUNvbnN0YW50UG9vbCAqQ29uc3RhbnRQb29sOworCisgICAgLy8vIENvbnN0YW50UG9vbEJhc2UgLSBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBjb25zdGFudCBwb29sLgorICAgIC8vLworICAgIHZvaWQgKkNvbnN0YW50UG9vbEJhc2U7CisKKyAgICAvLy8gQ29uc3RQb29sQWRkcmVzc2VzIC0gQWRkcmVzc2VzIG9mIGluZGl2aWR1YWwgY29uc3RhbnQgcG9vbCBlbnRyaWVzLgorICAgIC8vLworICAgIFNtYWxsVmVjdG9yPHVpbnRwdHJfdCwgOD4gQ29uc3RQb29sQWRkcmVzc2VzOworCisgICAgLy8vIEp1bXBUYWJsZSAtIFRoZSBqdW1wIHRhYmxlcyBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgICAgLy8vCisgICAgTWFjaGluZUp1bXBUYWJsZUluZm8gKkp1bXBUYWJsZTsKKworICAgIC8vLyBKdW1wVGFibGVCYXNlIC0gQSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUganVtcCB0YWJsZS4KKyAgICAvLy8KKyAgICB2b2lkICpKdW1wVGFibGVCYXNlOworCisgICAgLy8vIFJlc29sdmVyIC0gVGhpcyBjb250YWlucyBpbmZvIGFib3V0IHRoZSBjdXJyZW50bHkgcmVzb2x2ZWQgZnVuY3Rpb25zLgorICAgIEpJVFJlc29sdmVyIFJlc29sdmVyOworCisgICAgLy8vIExhYmVsTG9jYXRpb25zIC0gVGhpcyB2ZWN0b3IgaXMgYSBtYXBwaW5nIGZyb20gTGFiZWwgSUQncyB0byB0aGVpcgorICAgIC8vLyBhZGRyZXNzLgorICAgIERlbnNlTWFwPE1DU3ltYm9sKiwgdWludHB0cl90PiBMYWJlbExvY2F0aW9uczsKKworICAgIC8vLyBNTUkgLSBNYWNoaW5lIG1vZHVsZSBpbmZvIGZvciBleGNlcHRpb24gaW5mb3JtYXRpb25zCisgICAgTWFjaGluZU1vZHVsZUluZm8qIE1NSTsKKworICAgIC8vIEN1ckZuIC0gVGhlIGxsdm0gZnVuY3Rpb24gYmVpbmcgZW1pdHRlZC4gIE9ubHkgdmFsaWQgZHVyaW5nCisgICAgLy8gZmluaXNoRnVuY3Rpb24oKS4KKyAgICBjb25zdCBGdW5jdGlvbiAqQ3VyRm47CisKKyAgICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgZW1pdHRlZCBjb2RlLCB3aGljaCBpcyBwYXNzZWQgdG8gdGhlCisgICAgLy8vIEpJVEV2ZW50TGlzdGVuZXJzLiAgVGhpcyBpcyByZXNldCBpbiBzdGFydEZ1bmN0aW9uIGFuZCB1c2VkIGluCisgICAgLy8vIGZpbmlzaEZ1bmN0aW9uLgorICAgIEpJVEV2ZW50X0VtaXR0ZWRGdW5jdGlvbkRldGFpbHMgRW1pc3Npb25EZXRhaWxzOworCisgICAgc3RydWN0IEVtaXR0ZWRDb2RlIHsKKyAgICAgIHZvaWQgKkZ1bmN0aW9uQm9keTsgIC8vIEJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24ncyBhbGxvY2F0aW9uLgorICAgICAgdm9pZCAqQ29kZTsgIC8vIFRoZSBhZGRyZXNzIHRoZSBmdW5jdGlvbidzIGNvZGUgYWN0dWFsbHkgc3RhcnRzIGF0LgorICAgICAgdm9pZCAqRXhjZXB0aW9uVGFibGU7CisgICAgICBFbWl0dGVkQ29kZSgpIDogRnVuY3Rpb25Cb2R5KDApLCBDb2RlKDApLCBFeGNlcHRpb25UYWJsZSgwKSB7fQorICAgIH07CisgICAgc3RydWN0IEVtaXR0ZWRGdW5jdGlvbkNvbmZpZyA6IHB1YmxpYyBWYWx1ZU1hcENvbmZpZzxjb25zdCBGdW5jdGlvbio+IHsKKyAgICAgIHR5cGVkZWYgSklURW1pdHRlciAqRXh0cmFEYXRhOworICAgICAgc3RhdGljIHZvaWQgb25EZWxldGUoSklURW1pdHRlciAqLCBjb25zdCBGdW5jdGlvbiopOworICAgICAgc3RhdGljIHZvaWQgb25SQVVXKEpJVEVtaXR0ZXIgKiwgY29uc3QgRnVuY3Rpb24qLCBjb25zdCBGdW5jdGlvbiopOworICAgIH07CisgICAgVmFsdWVNYXA8Y29uc3QgRnVuY3Rpb24gKiwgRW1pdHRlZENvZGUsCisgICAgICAgICAgICAgRW1pdHRlZEZ1bmN0aW9uQ29uZmlnPiBFbWl0dGVkRnVuY3Rpb25zOworCisgICAgRGVidWdMb2MgUHJldkRMOworCisgICAgLy8vIEluc3RhbmNlIG9mIHRoZSBKSVQKKyAgICBKSVQgKlRoZUpJVDsKKworICBwdWJsaWM6CisgICAgSklURW1pdHRlcihKSVQgJmppdCwgSklUTWVtb3J5TWFuYWdlciAqSk1NLCBUYXJnZXRNYWNoaW5lICZUTSkKKyAgICAgIDogU2l6ZUVzdGltYXRlKDApLCBSZXNvbHZlcihqaXQsICp0aGlzKSwgTU1JKDApLCBDdXJGbigwKSwKKyAgICAgICAgRW1pdHRlZEZ1bmN0aW9ucyh0aGlzKSwgVGhlSklUKCZqaXQpIHsKKyAgICAgIE1lbU1nciA9IEpNTSA/IEpNTSA6IEpJVE1lbW9yeU1hbmFnZXI6OkNyZWF0ZURlZmF1bHRNZW1NYW5hZ2VyKCk7CisgICAgICBpZiAoaml0LmdldEpJVEluZm8oKS5uZWVkc0dPVCgpKSB7CisgICAgICAgIE1lbU1nci0+QWxsb2NhdGVHT1QoKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJKSVQgaXMgbWFuYWdpbmcgYSBHT1RcbiIpOworICAgICAgfQorICAgIH0KKyAgICB+SklURW1pdHRlcigpIHsKKyAgICAgIGRlbGV0ZSBNZW1NZ3I7CisgICAgfQorCisgICAgLy8vIGNsYXNzb2YgLSBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kCisgICAgLy8vIGR5bl9jYXN0OgorICAgIC8vLworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IEpJVEVtaXR0ZXIqKSB7IHJldHVybiB0cnVlOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWFjaGluZUNvZGVFbWl0dGVyKikgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgSklUUmVzb2x2ZXIgJmdldEpJVFJlc29sdmVyKCkgeyByZXR1cm4gUmVzb2x2ZXI7IH0KKworICAgIHZpcnR1YWwgdm9pZCBzdGFydEZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRik7CisgICAgdmlydHVhbCBib29sIGZpbmlzaEZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRik7CisKKyAgICB2b2lkIGVtaXRDb25zdGFudFBvb2woTWFjaGluZUNvbnN0YW50UG9vbCAqTUNQKTsKKyAgICB2b2lkIGluaXRKdW1wVGFibGVJbmZvKE1hY2hpbmVKdW1wVGFibGVJbmZvICpNSlRJKTsKKyAgICB2b2lkIGVtaXRKdW1wVGFibGVJbmZvKE1hY2hpbmVKdW1wVGFibGVJbmZvICpNSlRJKTsKKworICAgIHZvaWQgc3RhcnRHVlN0dWIoY29uc3QgR2xvYmFsVmFsdWUqIEdWLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3R1YlNpemUsIHVuc2lnbmVkIEFsaWdubWVudCA9IDEpOworICAgIHZvaWQgc3RhcnRHVlN0dWIodm9pZCAqQnVmZmVyLCB1bnNpZ25lZCBTdHViU2l6ZSk7CisgICAgdm9pZCBmaW5pc2hHVlN0dWIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgKmFsbG9jSW5kaXJlY3RHVihjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqQnVmZmVyLCBzaXplX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpOworCisgICAgLy8vIGFsbG9jYXRlU3BhY2UgLSBSZXNlcnZlcyBzcGFjZSBpbiB0aGUgY3VycmVudCBibG9jayBpZiBhbnksIG9yCisgICAgLy8vIGFsbG9jYXRlIGEgbmV3IG9uZSBvZiB0aGUgZ2l2ZW4gc2l6ZS4KKyAgICB2aXJ0dWFsIHZvaWQgKmFsbG9jYXRlU3BhY2UodWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCk7CisKKyAgICAvLy8gYWxsb2NhdGVHbG9iYWwgLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgZ2xvYmFsLiAgVW5saWtlIGFsbG9jYXRlU3BhY2UsCisgICAgLy8vIHRoaXMgbWV0aG9kIGRvZXMgbm90IGFsbG9jYXRlIG1lbW9yeSBpbiB0aGUgY3VycmVudCBvdXRwdXQgYnVmZmVyLAorICAgIC8vLyBiZWNhdXNlIGEgZ2xvYmFsIG1heSBsaXZlIGxvbmdlciB0aGFuIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCAqYWxsb2NhdGVHbG9iYWwodWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRkUmVsb2NhdGlvbihjb25zdCBNYWNoaW5lUmVsb2NhdGlvbiAmTVIpIHsKKyAgICAgIFJlbG9jYXRpb25zLnB1c2hfYmFjayhNUik7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFN0YXJ0TWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICAgICAgaWYgKE1CQkxvY2F0aW9ucy5zaXplKCkgPD0gKHVuc2lnbmVkKU1CQi0+Z2V0TnVtYmVyKCkpCisgICAgICAgIE1CQkxvY2F0aW9ucy5yZXNpemUoKE1CQi0+Z2V0TnVtYmVyKCkrMSkqMik7CisgICAgICBNQkJMb2NhdGlvbnNbTUJCLT5nZXROdW1iZXIoKV0gPSBnZXRDdXJyZW50UENWYWx1ZSgpOworICAgICAgaWYgKE1CQi0+aGFzQWRkcmVzc1Rha2VuKCkpCisgICAgICAgIFRoZUpJVC0+YWRkUG9pbnRlclRvQmFzaWNCbG9jayhNQkItPmdldEJhc2ljQmxvY2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilnZXRDdXJyZW50UENWYWx1ZSgpKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBFbWl0dGluZyBCQiIgPDwgTUJCLT5nZXROdW1iZXIoKSA8PCAiIGF0IFsiCisgICAgICAgICAgICAgICAgICAgPDwgKHZvaWQqKSBnZXRDdXJyZW50UENWYWx1ZSgpIDw8ICJdXG4iKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnRwdHJfdCBnZXRDb25zdGFudFBvb2xFbnRyeUFkZHJlc3ModW5zaWduZWQgRW50cnkpIGNvbnN0OworICAgIHZpcnR1YWwgdWludHB0cl90IGdldEp1bXBUYWJsZUVudHJ5QWRkcmVzcyh1bnNpZ25lZCBFbnRyeSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHVpbnRwdHJfdCBnZXRNYWNoaW5lQmFzaWNCbG9ja0FkZHJlc3MoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3R7CisgICAgICBhc3NlcnQoTUJCTG9jYXRpb25zLnNpemUoKSA+ICh1bnNpZ25lZClNQkItPmdldE51bWJlcigpICYmCisgICAgICAgICAgICAgTUJCTG9jYXRpb25zW01CQi0+Z2V0TnVtYmVyKCldICYmICJNQkIgbm90IGVtaXR0ZWQhIik7CisgICAgICByZXR1cm4gTUJCTG9jYXRpb25zW01CQi0+Z2V0TnVtYmVyKCldOworICAgIH0KKworICAgIC8vLyByZXRyeVdpdGhNb3JlTWVtb3J5IC0gTG9nIGEgcmV0cnkgYW5kIGRlYWxsb2NhdGUgYWxsIG1lbW9yeSBmb3IgdGhlCisgICAgLy8vIGdpdmVuIGZ1bmN0aW9uLiAgSW5jcmVhc2UgdGhlIG1pbmltdW0gYWxsb2NhdGlvbiBzaXplIHNvIHRoYXQgd2UgZ2V0CisgICAgLy8vIG1vcmUgbWVtb3J5IG5leHQgdGltZS4KKyAgICB2b2lkIHJldHJ5V2l0aE1vcmVNZW1vcnkoTWFjaGluZUZ1bmN0aW9uICZGKTsKKworICAgIC8vLyBkZWFsbG9jYXRlTWVtRm9yRnVuY3Rpb24gLSBEZWFsbG9jYXRlIGFsbCBtZW1vcnkgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gZnVuY3Rpb24gYm9keS4KKyAgICB2b2lkIGRlYWxsb2NhdGVNZW1Gb3JGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAqRik7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0RlYnVnTG9jKERlYnVnTG9jIERMLCBib29sIEJlZm9yZVByaW50aW5nSW5zbik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZW1pdExhYmVsKE1DU3ltYm9sICpMYWJlbCkgeworICAgICAgTGFiZWxMb2NhdGlvbnNbTGFiZWxdID0gZ2V0Q3VycmVudFBDVmFsdWUoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIERlbnNlTWFwPE1DU3ltYm9sKiwgdWludHB0cl90PiAqZ2V0TGFiZWxMb2NhdGlvbnMoKSB7CisgICAgICByZXR1cm4gJkxhYmVsTG9jYXRpb25zOworICAgIH0KKworICAgIHZpcnR1YWwgdWludHB0cl90IGdldExhYmVsQWRkcmVzcyhNQ1N5bWJvbCAqTGFiZWwpIGNvbnN0IHsKKyAgICAgIGFzc2VydChMYWJlbExvY2F0aW9ucy5jb3VudChMYWJlbCkgJiYgIkxhYmVsIG5vdCBlbWl0dGVkISIpOworICAgICAgcmV0dXJuIExhYmVsTG9jYXRpb25zLmZpbmQoTGFiZWwpLT5zZWNvbmQ7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNldE1vZHVsZUluZm8oTWFjaGluZU1vZHVsZUluZm8qIEluZm8pIHsKKyAgICAgIE1NSSA9IEluZm87CisgICAgfQorCisgICAgdm9pZCBzZXRNZW1vcnlFeGVjdXRhYmxlKCkgeworICAgICAgTWVtTWdyLT5zZXRNZW1vcnlFeGVjdXRhYmxlKCk7CisgICAgfQorCisgICAgSklUTWVtb3J5TWFuYWdlciAqZ2V0TWVtTWdyKCkgY29uc3QgeyByZXR1cm4gTWVtTWdyOyB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkICpnZXRQb2ludGVyVG9HbG9iYWwoR2xvYmFsVmFsdWUgKkdWLCB2b2lkICpSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWF5TmVlZEZhclN0dWIpOworICAgIHZvaWQgKmdldFBvaW50ZXJUb0dWSW5kaXJlY3RTeW0oR2xvYmFsVmFsdWUgKlYsIHZvaWQgKlJlZmVyZW5jZSk7CisgICAgdW5zaWduZWQgYWRkU2l6ZU9mR2xvYmFsKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHViwgdW5zaWduZWQgU2l6ZSk7CisgICAgdW5zaWduZWQgYWRkU2l6ZU9mR2xvYmFsc0luQ29uc3RhbnRWYWwoCisgICAgICBjb25zdCBDb25zdGFudCAqQywgdW5zaWduZWQgU2l6ZSwKKyAgICAgIFNtYWxsUHRyU2V0PGNvbnN0IEdsb2JhbFZhcmlhYmxlKiwgOD4gJlNlZW5HbG9iYWxzLAorICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IEdsb2JhbFZhcmlhYmxlKj4gJldvcmtsaXN0KTsKKyAgICB1bnNpZ25lZCBhZGRTaXplT2ZHbG9iYWxzSW5Jbml0aWFsaXplcigKKyAgICAgIGNvbnN0IENvbnN0YW50ICpJbml0LCB1bnNpZ25lZCBTaXplLAorICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgR2xvYmFsVmFyaWFibGUqLCA4PiAmU2Vlbkdsb2JhbHMsCisgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgR2xvYmFsVmFyaWFibGUqPiAmV29ya2xpc3QpOworICAgIHVuc2lnbmVkIEdldFNpemVPZkdsb2JhbHNJbkJ5dGVzKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworICB9OworfQorCit2b2lkIENhbGxTaXRlVmFsdWVNYXBDb25maWc6Om9uRGVsZXRlKEpJVFJlc29sdmVyU3RhdGUgKkpSUywgRnVuY3Rpb24gKkYpIHsKKyAgSlJTLT5FcmFzZUFsbENhbGxTaXRlc0ZvclByZWxvY2tlZChGKTsKK30KKworRnVuY3Rpb24gKkpJVFJlc29sdmVyU3RhdGU6OkVyYXNlU3R1Yihjb25zdCBNdXRleEd1YXJkICZsb2NrZWQsIHZvaWQgKlN0dWIpIHsKKyAgQ2FsbFNpdGVUb0Z1bmN0aW9uTWFwVHk6Oml0ZXJhdG9yIEMyRl9JID0KKyAgICBDYWxsU2l0ZVRvRnVuY3Rpb25NYXAuZmluZChTdHViKTsKKyAgaWYgKEMyRl9JID09IENhbGxTaXRlVG9GdW5jdGlvbk1hcC5lbmQoKSkgeworICAgIC8vIE5vdCBhIHN0dWIuCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBTdHViVG9SZXNvbHZlck1hcC0+VW5yZWdpc3RlclN0dWJSZXNvbHZlcihTdHViKTsKKworICBGdW5jdGlvbiAqY29uc3QgRiA9IEMyRl9JLT5zZWNvbmQ7CisjaWZuZGVmIE5ERUJVRworICB2b2lkICpSZWFsU3R1YiA9IEZ1bmN0aW9uVG9MYXp5U3R1Yk1hcC5sb29rdXAoRik7CisgIGFzc2VydChSZWFsU3R1YiA9PSBTdHViICYmCisgICAgICAgICAiQ2FsbC1zaXRlIHRoYXQgd2Fzbid0IGEgc3R1YiBwYXNzZWQgaW4gdG8gRXJhc2VTdHViIik7CisjZW5kaWYKKyAgRnVuY3Rpb25Ub0xhenlTdHViTWFwLmVyYXNlKEYpOworICBDYWxsU2l0ZVRvRnVuY3Rpb25NYXAuZXJhc2UoQzJGX0kpOworCisgIC8vIFJlbW92ZSB0aGUgc3R1YiBmcm9tIHRoZSBmdW5jdGlvbi0+Y2FsbC1zaXRlcyBtYXAsIGFuZCByZW1vdmUgdGhlIHdob2xlCisgIC8vIGVudHJ5IGZyb20gdGhlIG1hcCBpZiB0aGF0IHdhcyB0aGUgbGFzdCBjYWxsIHNpdGUuCisgIEZ1bmN0aW9uVG9DYWxsU2l0ZXNNYXBUeTo6aXRlcmF0b3IgRjJDX0kgPSBGdW5jdGlvblRvQ2FsbFNpdGVzTWFwLmZpbmQoRik7CisgIGFzc2VydChGMkNfSSAhPSBGdW5jdGlvblRvQ2FsbFNpdGVzTWFwLmVuZCgpICYmCisgICAgICAgICAiRnVuY3Rpb25Ub0NhbGxTaXRlc01hcCBicm9rZW4iKTsKKyAgYm9vbCBFcmFzZWQgPSBGMkNfSS0+c2Vjb25kLmVyYXNlKFN0dWIpOworICAodm9pZClFcmFzZWQ7CisgIGFzc2VydChFcmFzZWQgJiYgIkZ1bmN0aW9uVG9DYWxsU2l0ZXNNYXAgYnJva2VuIik7CisgIGlmIChGMkNfSS0+c2Vjb25kLmVtcHR5KCkpCisgICAgRnVuY3Rpb25Ub0NhbGxTaXRlc01hcC5lcmFzZShGMkNfSSk7CisKKyAgcmV0dXJuIEY7Cit9CisKK3ZvaWQgSklUUmVzb2x2ZXJTdGF0ZTo6RXJhc2VBbGxDYWxsU2l0ZXNGb3JQcmVsb2NrZWQoRnVuY3Rpb24gKkYpIHsKKyAgRnVuY3Rpb25Ub0NhbGxTaXRlc01hcFR5OjppdGVyYXRvciBGMkMgPSBGdW5jdGlvblRvQ2FsbFNpdGVzTWFwLmZpbmQoRik7CisgIGlmIChGMkMgPT0gRnVuY3Rpb25Ub0NhbGxTaXRlc01hcC5lbmQoKSkKKyAgICByZXR1cm47CisgIFN0dWJUb1Jlc29sdmVyTWFwVHkgJlMyUk1hcCA9ICpTdHViVG9SZXNvbHZlck1hcDsKKyAgZm9yIChTbWFsbFB0clNldDx2b2lkKiwgMT46OmNvbnN0X2l0ZXJhdG9yIEkgPSBGMkMtPnNlY29uZC5iZWdpbigpLAorICAgICAgICAgRSA9IEYyQy0+c2Vjb25kLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIFMyUk1hcC5VbnJlZ2lzdGVyU3R1YlJlc29sdmVyKCpJKTsKKyAgICBib29sIEVyYXNlZCA9IENhbGxTaXRlVG9GdW5jdGlvbk1hcC5lcmFzZSgqSSk7CisgICAgKHZvaWQpRXJhc2VkOworICAgIGFzc2VydChFcmFzZWQgJiYgIk1pc3NpbmcgY2FsbCBzaXRlLT5mdW5jdGlvbiBtYXBwaW5nIik7CisgIH0KKyAgRnVuY3Rpb25Ub0NhbGxTaXRlc01hcC5lcmFzZShGMkMpOworfQorCit2b2lkIEpJVFJlc29sdmVyU3RhdGU6OkVyYXNlQWxsQ2FsbFNpdGVzUHJlbG9ja2VkKCkgeworICBTdHViVG9SZXNvbHZlck1hcFR5ICZTMlJNYXAgPSAqU3R1YlRvUmVzb2x2ZXJNYXA7CisgIGZvciAoQ2FsbFNpdGVUb0Z1bmN0aW9uTWFwVHk6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICBJID0gQ2FsbFNpdGVUb0Z1bmN0aW9uTWFwLmJlZ2luKCksCisgICAgICAgICBFID0gQ2FsbFNpdGVUb0Z1bmN0aW9uTWFwLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIFMyUk1hcC5VbnJlZ2lzdGVyU3R1YlJlc29sdmVyKEktPmZpcnN0KTsKKyAgfQorICBDYWxsU2l0ZVRvRnVuY3Rpb25NYXAuY2xlYXIoKTsKKyAgRnVuY3Rpb25Ub0NhbGxTaXRlc01hcC5jbGVhcigpOworfQorCitKSVRSZXNvbHZlcjo6fkpJVFJlc29sdmVyKCkgeworICAvLyBObyBuZWVkIHRvIGxvY2sgYmVjYXVzZSB3ZSdyZSBpbiB0aGUgZGVzdHJ1Y3RvciwgYW5kIHN0YXRlIGlzbid0IHNoYXJlZC4KKyAgc3RhdGUuRXJhc2VBbGxDYWxsU2l0ZXNQcmVsb2NrZWQoKTsKKyAgYXNzZXJ0KCFTdHViVG9SZXNvbHZlck1hcC0+UmVzb2x2ZXJIYXNTdHVicyh0aGlzKSAmJgorICAgICAgICAgIlJlc29sdmVyIGRlc3Ryb3llZCB3aXRoIHN0dWJzIHN0aWxsIGFsaXZlLiIpOworfQorCisvLy8gZ2V0TGF6eUZ1bmN0aW9uU3R1YklmQXZhaWxhYmxlIC0gVGhpcyByZXR1cm5zIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHN0dWIKKy8vLyBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuCit2b2lkICpKSVRSZXNvbHZlcjo6Z2V0TGF6eUZ1bmN0aW9uU3R1YklmQXZhaWxhYmxlKEZ1bmN0aW9uICpGKSB7CisgIE11dGV4R3VhcmQgbG9ja2VkKFRoZUpJVC0+bG9jayk7CisKKyAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgc3R1YiBmb3IgdGhpcyBmdW5jdGlvbiwgcmVjeWNsZSBpdC4KKyAgcmV0dXJuIHN0YXRlLmdldEZ1bmN0aW9uVG9MYXp5U3R1Yk1hcChsb2NrZWQpLmxvb2t1cChGKTsKK30KKworLy8vIGdldEZ1bmN0aW9uU3R1YiAtIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiBzdHViLCBjcmVhdGluZworLy8vIG9uZSBvbiBkZW1hbmQgYXMgbmVlZGVkLgordm9pZCAqSklUUmVzb2x2ZXI6OmdldExhenlGdW5jdGlvblN0dWIoRnVuY3Rpb24gKkYpIHsKKyAgTXV0ZXhHdWFyZCBsb2NrZWQoVGhlSklULT5sb2NrKTsKKworICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBsYXp5IHN0dWIgZm9yIHRoaXMgZnVuY3Rpb24sIHJlY3ljbGUgaXQuCisgIHZvaWQgKiZTdHViID0gc3RhdGUuZ2V0RnVuY3Rpb25Ub0xhenlTdHViTWFwKGxvY2tlZClbRl07CisgIGlmIChTdHViKSByZXR1cm4gU3R1YjsKKworICAvLyBDYWxsIHRoZSBsYXp5IHJlc29sdmVyIGZ1bmN0aW9uIGlmIHdlIGFyZSBKSVQnaW5nIGxhemlseS4gIE90aGVyd2lzZSB3ZQorICAvLyBtdXN0IHJlc29sdmUgdGhlIHN5bWJvbCBub3cuCisgIHZvaWQgKkFjdHVhbCA9IFRoZUpJVC0+aXNDb21waWxpbmdMYXppbHkoKQorICAgID8gKHZvaWQgKikoaW50cHRyX3QpTGF6eVJlc29sdmVyRm4gOiAodm9pZCAqKTA7CisKKyAgLy8gSWYgdGhpcyBpcyBhbiBleHRlcm5hbCBkZWNsYXJhdGlvbiwgYXR0ZW1wdCB0byByZXNvbHZlIHRoZSBhZGRyZXNzIG5vdworICAvLyB0byBwbGFjZSBpbiB0aGUgc3R1Yi4KKyAgaWYgKGlzTm9uR2hvc3REZWNsYXJhdGlvbihGKSB8fCBGLT5oYXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSgpKSB7CisgICAgQWN0dWFsID0gVGhlSklULT5nZXRQb2ludGVyVG9GdW5jdGlvbihGKTsKKworICAgIC8vIElmIHdlIHJlc29sdmVkIHRoZSBzeW1ib2wgdG8gYSBudWxsIGFkZHJlc3MgKGVnLiBhIHdlYWsgZXh0ZXJuYWwpCisgICAgLy8gZG9uJ3QgZW1pdCBhIHN0dWIuIFJldHVybiBhIG51bGwgcG9pbnRlciB0byB0aGUgYXBwbGljYXRpb24uCisgICAgaWYgKCFBY3R1YWwpIHJldHVybiAwOworICB9CisKKyAgVGFyZ2V0SklUSW5mbzo6U3R1YkxheW91dCBTTCA9IFRoZUpJVC0+Z2V0SklUSW5mbygpLmdldFN0dWJMYXlvdXQoKTsKKyAgSkUuc3RhcnRHVlN0dWIoRiwgU0wuU2l6ZSwgU0wuQWxpZ25tZW50KTsKKyAgLy8gQ29kZWdlbiBhIG5ldyBzdHViLCBjYWxsaW5nIHRoZSBsYXp5IHJlc29sdmVyIG9yIHRoZSBhY3R1YWwgYWRkcmVzcyBvZiB0aGUKKyAgLy8gZXh0ZXJuYWwgZnVuY3Rpb24sIGlmIGl0IHdhcyByZXNvbHZlZC4KKyAgU3R1YiA9IFRoZUpJVC0+Z2V0SklUSW5mbygpLmVtaXRGdW5jdGlvblN0dWIoRiwgQWN0dWFsLCBKRSk7CisgIEpFLmZpbmlzaEdWU3R1YigpOworCisgIGlmIChBY3R1YWwgIT0gKHZvaWQqKShpbnRwdHJfdClMYXp5UmVzb2x2ZXJGbikgeworICAgIC8vIElmIHdlIGFyZSBnZXR0aW5nIHRoZSBzdHViIGZvciBhbiBleHRlcm5hbCBmdW5jdGlvbiwgd2UgcmVhbGx5IHdhbnQgdGhlCisgICAgLy8gYWRkcmVzcyBvZiB0aGUgc3R1YiBpbiB0aGUgR2xvYmFsQWRkcmVzc01hcCBmb3IgdGhlIEpJVCwgbm90IHRoZSBhZGRyZXNzCisgICAgLy8gb2YgdGhlIGV4dGVybmFsIGZ1bmN0aW9uLgorICAgIFRoZUpJVC0+dXBkYXRlR2xvYmFsTWFwcGluZyhGLCBTdHViKTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBMYXp5IHN0dWIgZW1pdHRlZCBhdCBbIiA8PCBTdHViIDw8ICJdIGZvciBmdW5jdGlvbiAnIgorICAgICAgICA8PCBGLT5nZXROYW1lKCkgPDwgIidcbiIpOworCisgIGlmIChUaGVKSVQtPmlzQ29tcGlsaW5nTGF6aWx5KCkpIHsKKyAgICAvLyBSZWdpc3RlciB0aGlzIEpJVFJlc29sdmVyIGFzIHRoZSBvbmUgY29ycmVzcG9uZGluZyB0byB0aGlzIGNhbGwgc2l0ZSBzbworICAgIC8vIEpJVENvbXBpbGVyRm4gd2lsbCBiZSBhYmxlIHRvIGZpbmQgaXQuCisgICAgU3R1YlRvUmVzb2x2ZXJNYXAtPlJlZ2lzdGVyU3R1YlJlc29sdmVyKFN0dWIsIHRoaXMpOworCisgICAgLy8gRmluYWxseSwga2VlcCB0cmFjayBvZiB0aGUgc3R1Yi10by1GdW5jdGlvbiBtYXBwaW5nIHNvIHRoYXQgdGhlCisgICAgLy8gSklUQ29tcGlsZXJGbiBrbm93cyB3aGljaCBmdW5jdGlvbiB0byBjb21waWxlIQorICAgIHN0YXRlLkFkZENhbGxTaXRlKGxvY2tlZCwgU3R1YiwgRik7CisgIH0gZWxzZSBpZiAoIUFjdHVhbCkgeworICAgIC8vIElmIHdlIGFyZSBKSVQnaW5nIG5vbi1sYXppbHkgYnV0IG5lZWQgdG8gY2FsbCBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QKKyAgICAvLyBleGlzdCB5ZXQsIGFkZCBpdCB0byB0aGUgSklUJ3Mgd29yayBsaXN0IHNvIHRoYXQgd2UgY2FuIGZpbGwgaW4gdGhlCisgICAgLy8gc3R1YiBhZGRyZXNzIGxhdGVyLgorICAgIGFzc2VydCghaXNOb25HaG9zdERlY2xhcmF0aW9uKEYpICYmICFGLT5oYXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSgpICYmCisgICAgICAgICAgICInQWN0dWFsJyBzaG91bGQgaGF2ZSBiZWVuIHNldCBhYm92ZS4iKTsKKyAgICBUaGVKSVQtPmFkZFBlbmRpbmdGdW5jdGlvbihGKTsKKyAgfQorCisgIHJldHVybiBTdHViOworfQorCisvLy8gZ2V0R2xvYmFsVmFsdWVJbmRpcmVjdFN5bSAtIFJldHVybiBhIGxhenkgcG9pbnRlciBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQKKy8vLyBHViBhZGRyZXNzLgordm9pZCAqSklUUmVzb2x2ZXI6OmdldEdsb2JhbFZhbHVlSW5kaXJlY3RTeW0oR2xvYmFsVmFsdWUgKkdWLCB2b2lkICpHVkFkZHJlc3MpIHsKKyAgTXV0ZXhHdWFyZCBsb2NrZWQoVGhlSklULT5sb2NrKTsKKworICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdHViIGZvciB0aGlzIGdsb2JhbCB2YXJpYWJsZSwgcmVjeWNsZSBpdC4KKyAgdm9pZCAqJkluZGlyZWN0U3ltID0gc3RhdGUuZ2V0R2xvYmFsVG9JbmRpcmVjdFN5bU1hcChsb2NrZWQpW0dWXTsKKyAgaWYgKEluZGlyZWN0U3ltKSByZXR1cm4gSW5kaXJlY3RTeW07CisKKyAgLy8gT3RoZXJ3aXNlLCBjb2RlZ2VuIGEgbmV3IGluZGlyZWN0IHN5bWJvbC4KKyAgSW5kaXJlY3RTeW0gPSBUaGVKSVQtPmdldEpJVEluZm8oKS5lbWl0R2xvYmFsVmFsdWVJbmRpcmVjdFN5bShHViwgR1ZBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpFKTsKKworICBERUJVRyhkYmdzKCkgPDwgIkpJVDogSW5kaXJlY3Qgc3ltYm9sIGVtaXR0ZWQgYXQgWyIgPDwgSW5kaXJlY3RTeW0KKyAgICAgICAgPDwgIl0gZm9yIEdWICciIDw8IEdWLT5nZXROYW1lKCkgPDwgIidcbiIpOworCisgIHJldHVybiBJbmRpcmVjdFN5bTsKK30KKworLy8vIGdldEV4dGVybmFsRnVuY3Rpb25TdHViIC0gUmV0dXJuIGEgc3R1YiBmb3IgdGhlIGZ1bmN0aW9uIGF0IHRoZQorLy8vIHNwZWNpZmllZCBhZGRyZXNzLCBjcmVhdGVkIGxhemlseSBvbiBkZW1hbmQuCit2b2lkICpKSVRSZXNvbHZlcjo6Z2V0RXh0ZXJuYWxGdW5jdGlvblN0dWIodm9pZCAqRm5BZGRyKSB7CisgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhIHN0dWIgZm9yIHRoaXMgZnVuY3Rpb24sIHJlY3ljbGUgaXQuCisgIHZvaWQgKiZTdHViID0gRXh0ZXJuYWxGblRvU3R1Yk1hcFtGbkFkZHJdOworICBpZiAoU3R1YikgcmV0dXJuIFN0dWI7CisKKyAgVGFyZ2V0SklUSW5mbzo6U3R1YkxheW91dCBTTCA9IFRoZUpJVC0+Z2V0SklUSW5mbygpLmdldFN0dWJMYXlvdXQoKTsKKyAgSkUuc3RhcnRHVlN0dWIoMCwgU0wuU2l6ZSwgU0wuQWxpZ25tZW50KTsKKyAgU3R1YiA9IFRoZUpJVC0+Z2V0SklUSW5mbygpLmVtaXRGdW5jdGlvblN0dWIoMCwgRm5BZGRyLCBKRSk7CisgIEpFLmZpbmlzaEdWU3R1YigpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBTdHViIGVtaXR0ZWQgYXQgWyIgPDwgU3R1YgorICAgICAgICAgICAgICAgPDwgIl0gZm9yIGV4dGVybmFsIGZ1bmN0aW9uIGF0ICciIDw8IEZuQWRkciA8PCAiJ1xuIik7CisgIHJldHVybiBTdHViOworfQorCit1bnNpZ25lZCBKSVRSZXNvbHZlcjo6Z2V0R09USW5kZXhGb3JBZGRyKHZvaWQqIGFkZHIpIHsKKyAgdW5zaWduZWQgaWR4ID0gcmV2R09UTWFwW2FkZHJdOworICBpZiAoIWlkeCkgeworICAgIGlkeCA9ICsrbmV4dEdPVEluZGV4OworICAgIHJldkdPVE1hcFthZGRyXSA9IGlkeDsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkpJVDogQWRkaW5nIEdPVCBlbnRyeSAiIDw8IGlkeCA8PCAiIGZvciBhZGRyIFsiCisgICAgICAgICAgICAgICAgIDw8IGFkZHIgPDwgIl1cbiIpOworICB9CisgIHJldHVybiBpZHg7Cit9CisKK3ZvaWQgSklUUmVzb2x2ZXI6OmdldFJlbG9jYXRhYmxlR1ZzKFNtYWxsVmVjdG9ySW1wbDxHbG9iYWxWYWx1ZSo+ICZHVnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dm9pZCo+ICZQdHJzKSB7CisgIE11dGV4R3VhcmQgbG9ja2VkKFRoZUpJVC0+bG9jayk7CisKKyAgY29uc3QgRnVuY3Rpb25Ub0xhenlTdHViTWFwVHkgJkZNID0gc3RhdGUuZ2V0RnVuY3Rpb25Ub0xhenlTdHViTWFwKGxvY2tlZCk7CisgIEdsb2JhbFRvSW5kaXJlY3RTeW1NYXBUeSAmR00gPSBzdGF0ZS5nZXRHbG9iYWxUb0luZGlyZWN0U3ltTWFwKGxvY2tlZCk7CisKKyAgZm9yIChGdW5jdGlvblRvTGF6eVN0dWJNYXBUeTo6Y29uc3RfaXRlcmF0b3IgaSA9IEZNLmJlZ2luKCksIGUgPSBGTS5lbmQoKTsKKyAgICAgICBpICE9IGU7ICsraSl7CisgICAgRnVuY3Rpb24gKkYgPSBpLT5maXJzdDsKKyAgICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpICYmIEYtPmhhc0V4dGVybmFsTGlua2FnZSgpKSB7CisgICAgICBHVnMucHVzaF9iYWNrKGktPmZpcnN0KTsKKyAgICAgIFB0cnMucHVzaF9iYWNrKGktPnNlY29uZCk7CisgICAgfQorICB9CisgIGZvciAoR2xvYmFsVG9JbmRpcmVjdFN5bU1hcFR5OjppdGVyYXRvciBpID0gR00uYmVnaW4oKSwgZSA9IEdNLmVuZCgpOworICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgR1ZzLnB1c2hfYmFjayhpLT5maXJzdCk7CisgICAgUHRycy5wdXNoX2JhY2soaS0+c2Vjb25kKTsKKyAgfQorfQorCisvLy8gSklUQ29tcGlsZXJGbiAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBsYXp5IGNvbXBpbGF0aW9uIHN0dWIgaGFzCisvLy8gYmVlbiBlbnRlcmVkLiAgSXQgbG9va3MgdXAgd2hpY2ggZnVuY3Rpb24gdGhpcyBzdHViIGNvcnJlc3BvbmRzIHRvLCBjb21waWxlcworLy8vIGl0IGlmIG5lY2Vzc2FyeSwgdGhlbiByZXR1cm5zIHRoZSByZXN1bHRhbnQgZnVuY3Rpb24gcG9pbnRlci4KK3ZvaWQgKkpJVFJlc29sdmVyOjpKSVRDb21waWxlckZuKHZvaWQgKlN0dWIpIHsKKyAgSklUUmVzb2x2ZXIgKkpSID0gU3R1YlRvUmVzb2x2ZXJNYXAtPmdldFJlc29sdmVyRnJvbVN0dWIoU3R1Yik7CisgIGFzc2VydChKUiAmJiAiVW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgSklUUmVzb2x2ZXIgdG8gdGhlIGNhbGwgc2l0ZSIpOworCisgIEZ1bmN0aW9uKiBGID0gMDsKKyAgdm9pZCogQWN0dWFsUHRyID0gMDsKKworICB7CisgICAgLy8gT25seSBsb2NrIGZvciBnZXR0aW5nIHRoZSBGdW5jdGlvbi4gVGhlIGNhbGwgZ2V0UG9pbnRlclRvRnVuY3Rpb24gbWFkZQorICAgIC8vIGluIHRoaXMgZnVuY3Rpb24gbWlnaHQgdHJpZ2dlciBmdW5jdGlvbiBtYXRlcmlhbGl6aW5nLCB3aGljaCByZXF1aXJlcworICAgIC8vIEpJVCBsb2NrIHRvIGJlIHVubG9ja2VkLgorICAgIE11dGV4R3VhcmQgbG9ja2VkKEpSLT5UaGVKSVQtPmxvY2spOworCisgICAgLy8gVGhlIGFkZHJlc3MgZ2l2ZW4gdG8gdXMgZm9yIHRoZSBzdHViIG1heSBub3QgYmUgZXhhY3RseSByaWdodCwgaXQgbWlnaHQKKyAgICAvLyBiZSBhIGxpdHRsZSBiaXQgYWZ0ZXIgdGhlIHN0dWIuICBBcyBzdWNoLCB1c2UgdXBwZXJfYm91bmQgdG8gZmluZCBpdC4KKyAgICBwYWlyPHZvaWQqLCBGdW5jdGlvbio+IEkgPQorICAgICAgSlItPnN0YXRlLkxvb2t1cEZ1bmN0aW9uRnJvbUNhbGxTaXRlKGxvY2tlZCwgU3R1Yik7CisgICAgRiA9IEkuc2Vjb25kOworICAgIEFjdHVhbFB0ciA9IEkuZmlyc3Q7CisgIH0KKworICAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgY29kZSBnZW5lcmF0ZWQgdGhlIGZ1bmN0aW9uLCBqdXN0IHJldHVybiB0aGUgYWRkcmVzcy4KKyAgdm9pZCAqUmVzdWx0ID0gSlItPlRoZUpJVC0+Z2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoRik7CisKKyAgaWYgKCFSZXN1bHQpIHsKKyAgICAvLyBPdGhlcndpc2Ugd2UgZG9uJ3QgaGF2ZSBpdCwgZG8gbGF6eSBjb21waWxhdGlvbiBub3cuCisKKyAgICAvLyBJZiBsYXp5IGNvbXBpbGF0aW9uIGlzIGRpc2FibGVkLCBlbWl0IGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UgYW5kIGFib3J0LgorICAgIGlmICghSlItPlRoZUpJVC0+aXNDb21waWxpbmdMYXppbHkoKSkgeworICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJMTFZNIEpJVCByZXF1ZXN0ZWQgdG8gZG8gbGF6eSBjb21waWxhdGlvbiBvZiBmdW5jdGlvbiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBGLT5nZXROYW1lKCkgKyAiJyB3aGVuIGxhenkgY29tcGlsZXMgYXJlIGRpc2FibGVkISIpOworICAgIH0KKworICAgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBMYXppbHkgcmVzb2x2aW5nIGZ1bmN0aW9uICciIDw8IEYtPmdldE5hbWUoKQorICAgICAgICAgIDw8ICInIEluIHN0dWIgcHRyID0gIiA8PCBTdHViIDw8ICIgYWN0dWFsIHB0ciA9ICIKKyAgICAgICAgICA8PCBBY3R1YWxQdHIgPDwgIlxuIik7CisKKyAgICBSZXN1bHQgPSBKUi0+VGhlSklULT5nZXRQb2ludGVyVG9GdW5jdGlvbihGKTsKKyAgfQorCisgIC8vIFJlYWNxdWlyZSB0aGUgbG9jayB0byB1cGRhdGUgdGhlIEdPVCBtYXAuCisgIE11dGV4R3VhcmQgbG9ja2VkKEpSLT5UaGVKSVQtPmxvY2spOworCisgIC8vIFdlIG1pZ2h0IGxpa2UgdG8gcmVtb3ZlIHRoZSBjYWxsIHNpdGUgZnJvbSB0aGUgQ2FsbFNpdGVUb0Z1bmN0aW9uIG1hcCwgYnV0CisgIC8vIHdlIGNhbid0IGRvIHRoYXQhIE11bHRpcGxlIHRocmVhZHMgY291bGQgYmUgc3R1Y2ssIHdhaXRpbmcgdG8gYWNxdWlyZSB0aGUKKyAgLy8gbG9jayBhYm92ZS4gQXMgc29vbiBhcyB0aGUgMXN0IGZ1bmN0aW9uIGZpbmlzaGVzIGNvbXBpbGluZyB0aGUgZnVuY3Rpb24sCisgIC8vIHRoZSBuZXh0IG9uZSB3aWxsIGJlIHJlbGVhc2VkLCBhbmQgbmVlZHMgdG8gYmUgYWJsZSB0byBmaW5kIHRoZSBmdW5jdGlvbiBpdAorICAvLyBuZWVkcyB0byBjYWxsLgorCisgIC8vIEZJWE1FOiBXZSBjb3VsZCByZXdyaXRlIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgc3R1YiBpZiB3ZSBrbmV3IHRoZW0uCisKKyAgLy8gV2hhdCB3ZSB3aWxsIGRvIGlzIHNldCB0aGUgY29tcGlsZWQgZnVuY3Rpb24gYWRkcmVzcyB0byBtYXAgdG8gdGhlCisgIC8vIHNhbWUgR09UIGVudHJ5IGFzIHRoZSBzdHViIHNvIHRoYXQgbGF0ZXIgY2xpZW50cyBtYXkgdXBkYXRlIHRoZSBHT1QKKyAgLy8gaWYgdGhleSBzZWUgaXQgc3RpbGwgdXNpbmcgdGhlIHN0dWIgYWRkcmVzcy4KKyAgLy8gTm90ZTogdGhpcyBpcyBkb25lIHNvIHRoZSBSZXNvbHZlciBkb2Vzbid0IGhhdmUgdG8gbWFuYWdlIEdPVCBtZW1vcnkKKyAgLy8gRG8gdGhpcyB3aXRob3V0IGFsbG9jYXRpbmcgbWFwIHNwYWNlIGlmIHRoZSB0YXJnZXQgaXNuJ3QgdXNpbmcgYSBHT1QKKyAgaWYoSlItPnJldkdPVE1hcC5maW5kKFN0dWIpICE9IEpSLT5yZXZHT1RNYXAuZW5kKCkpCisgICAgSlItPnJldkdPVE1hcFtSZXN1bHRdID0gSlItPnJldkdPVE1hcFtTdHViXTsKKworICByZXR1cm4gUmVzdWx0OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSklURW1pdHRlciBjb2RlLgorLy8KK3ZvaWQgKkpJVEVtaXR0ZXI6OmdldFBvaW50ZXJUb0dsb2JhbChHbG9iYWxWYWx1ZSAqViwgdm9pZCAqUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWF5TmVlZEZhclN0dWIpIHsKKyAgaWYgKEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihWKSkKKyAgICByZXR1cm4gVGhlSklULT5nZXRPckVtaXRHbG9iYWxWYXJpYWJsZShHVik7CisKKyAgaWYgKEdsb2JhbEFsaWFzICpHQSA9IGR5bl9jYXN0PEdsb2JhbEFsaWFzPihWKSkKKyAgICByZXR1cm4gVGhlSklULT5nZXRQb2ludGVyVG9HbG9iYWwoR0EtPnJlc29sdmVBbGlhc2VkR2xvYmFsKGZhbHNlKSk7CisKKyAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGNvbXBpbGVkIHRoZSBmdW5jdGlvbiwgcmV0dXJuIGEgcG9pbnRlciB0byBpdHMgYm9keS4KKyAgRnVuY3Rpb24gKkYgPSBjYXN0PEZ1bmN0aW9uPihWKTsKKworICB2b2lkICpGblN0dWIgPSBSZXNvbHZlci5nZXRMYXp5RnVuY3Rpb25TdHViSWZBdmFpbGFibGUoRik7CisgIGlmIChGblN0dWIpIHsKKyAgICAvLyBSZXR1cm4gdGhlIGZ1bmN0aW9uIHN0dWIgaWYgaXQncyBhbHJlYWR5IGNyZWF0ZWQuICBXZSBkbyB0aGlzIGZpcnN0IHNvCisgICAgLy8gdGhhdCB3ZSdyZSByZXR1cm5pbmcgdGhlIHNhbWUgYWRkcmVzcyBmb3IgdGhlIGZ1bmN0aW9uIGFzIGFueSBwcmV2aW91cworICAgIC8vIGNhbGwuICBUT0RPOiBZZXMsIHRoaXMgaXMgd3JvbmcuIFRoZSBsYXp5IHN0dWIgaXNuJ3QgZ3VhcmFudGVlZCB0byBiZQorICAgIC8vIGNsb3NlIGVub3VnaCB0byBjYWxsLgorICAgIHJldHVybiBGblN0dWI7CisgIH0KKworICAvLyBJZiB3ZSBrbm93IHRoZSB0YXJnZXQgY2FuIGhhbmRsZSBhcmJpdHJhcnktZGlzdGFuY2UgY2FsbHMsIHRyeSB0bworICAvLyByZXR1cm4gYSBkaXJlY3QgcG9pbnRlci4KKyAgaWYgKCFNYXlOZWVkRmFyU3R1YikgeworICAgIC8vIElmIHdlIGhhdmUgY29kZSwgZ28gYWhlYWQgYW5kIHJldHVybiB0aGF0LgorICAgIHZvaWQgKlJlc3VsdFB0ciA9IFRoZUpJVC0+Z2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoRik7CisgICAgaWYgKFJlc3VsdFB0cikgcmV0dXJuIFJlc3VsdFB0cjsKKworICAgIC8vIElmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgZnVuY3Rpb24gcG9pbnRlciwgd2UgY2FuIGZvcmNlIHRoZSBKSVQgdG8KKyAgICAvLyAnY29tcGlsZScgaXQsIHdoaWNoIHJlYWxseSBqdXN0IGFkZHMgaXQgdG8gdGhlIG1hcC4KKyAgICBpZiAoaXNOb25HaG9zdERlY2xhcmF0aW9uKEYpIHx8IEYtPmhhc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKCkpCisgICAgICByZXR1cm4gVGhlSklULT5nZXRQb2ludGVyVG9GdW5jdGlvbihGKTsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgd2UgbWF5IG5lZWQgYSB0byBlbWl0IGEgc3R1YiwgYW5kLCBjb25zZXJ2YXRpdmVseSwgd2UgYWx3YXlzIGRvCisgIC8vIHNvLiAgTm90ZSB0aGF0IGl0J3MgcG9zc2libGUgdG8gcmV0dXJuIG51bGwgZnJvbSBnZXRMYXp5RnVuY3Rpb25TdHViIGluIHRoZQorICAvLyBjYXNlIG9mIGEgd2VhayBleHRlcm4gdGhhdCBmYWlscyB0byByZXNvbHZlLgorICByZXR1cm4gUmVzb2x2ZXIuZ2V0TGF6eUZ1bmN0aW9uU3R1YihGKTsKK30KKwordm9pZCAqSklURW1pdHRlcjo6Z2V0UG9pbnRlclRvR1ZJbmRpcmVjdFN5bShHbG9iYWxWYWx1ZSAqViwgdm9pZCAqUmVmZXJlbmNlKSB7CisgIC8vIE1ha2Ugc3VyZSBHViBpcyBlbWl0dGVkIGZpcnN0LCBhbmQgY3JlYXRlIGEgc3R1YiBjb250YWluaW5nIHRoZSBmdWxseQorICAvLyByZXNvbHZlZCBhZGRyZXNzLgorICB2b2lkICpHVkFkZHJlc3MgPSBnZXRQb2ludGVyVG9HbG9iYWwoViwgUmVmZXJlbmNlLCBmYWxzZSk7CisgIHZvaWQgKlN0dWJBZGRyID0gUmVzb2x2ZXIuZ2V0R2xvYmFsVmFsdWVJbmRpcmVjdFN5bShWLCBHVkFkZHJlc3MpOworICByZXR1cm4gU3R1YkFkZHI7Cit9CisKK3ZvaWQgSklURW1pdHRlcjo6cHJvY2Vzc0RlYnVnTG9jKERlYnVnTG9jIERMLCBib29sIEJlZm9yZVByaW50aW5nSW5zbikgeworICBpZiAoREwuaXNVbmtub3duKCkpIHJldHVybjsKKyAgaWYgKCFCZWZvcmVQcmludGluZ0luc24pIHJldHVybjsKKyAgCisgIGNvbnN0IExMVk1Db250ZXh0ICZDb250ZXh0ID0gRW1pc3Npb25EZXRhaWxzLk1GLT5nZXRGdW5jdGlvbigpLT5nZXRDb250ZXh0KCk7CisKKyAgaWYgKERMLmdldFNjb3BlKENvbnRleHQpICE9IDAgJiYgUHJldkRMICE9IERMKSB7CisgICAgSklURXZlbnRfRW1pdHRlZEZ1bmN0aW9uRGV0YWlsczo6TGluZVN0YXJ0IE5leHRMaW5lOworICAgIE5leHRMaW5lLkFkZHJlc3MgPSBnZXRDdXJyZW50UENWYWx1ZSgpOworICAgIE5leHRMaW5lLkxvYyA9IERMOworICAgIEVtaXNzaW9uRGV0YWlscy5MaW5lU3RhcnRzLnB1c2hfYmFjayhOZXh0TGluZSk7CisgIH0KKworICBQcmV2REwgPSBETDsKK30KKworc3RhdGljIHVuc2lnbmVkIEdldENvbnN0YW50UG9vbFNpemVJbkJ5dGVzKE1hY2hpbmVDb25zdGFudFBvb2wgKk1DUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICpURCkgeworICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQ29uc3RhbnRQb29sRW50cnk+ICZDb25zdGFudHMgPSBNQ1AtPmdldENvbnN0YW50cygpOworICBpZiAoQ29uc3RhbnRzLmVtcHR5KCkpIHJldHVybiAwOworCisgIHVuc2lnbmVkIFNpemUgPSAwOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ29uc3RhbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkgQ1BFID0gQ29uc3RhbnRzW2ldOworICAgIHVuc2lnbmVkIEFsaWduTWFzayA9IENQRS5nZXRBbGlnbm1lbnQoKSAtIDE7CisgICAgU2l6ZSA9IChTaXplICsgQWxpZ25NYXNrKSAmIH5BbGlnbk1hc2s7CisgICAgY29uc3QgVHlwZSAqVHkgPSBDUEUuZ2V0VHlwZSgpOworICAgIFNpemUgKz0gVEQtPmdldFR5cGVBbGxvY1NpemUoVHkpOworICB9CisgIHJldHVybiBTaXplOworfQorCisvLy8gYWRkU2l6ZU9mR2xvYmFsIC0gYWRkIHRoZSBzaXplIG9mIHRoZSBnbG9iYWwgKHBsdXMgYW55IGFsaWdubWVudCBwYWRkaW5nKQorLy8vIGludG8gdGhlIHJ1bm5pbmcgdG90YWwgU2l6ZS4KKwordW5zaWduZWQgSklURW1pdHRlcjo6YWRkU2l6ZU9mR2xvYmFsKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHViwgdW5zaWduZWQgU2l6ZSkgeworICBjb25zdCBUeXBlICpFbFR5ID0gR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgc2l6ZV90IEdWU2l6ZSA9IChzaXplX3QpVGhlSklULT5nZXRUYXJnZXREYXRhKCktPmdldFR5cGVBbGxvY1NpemUoRWxUeSk7CisgIHNpemVfdCBHVkFsaWduID0KKyAgICAgIChzaXplX3QpVGhlSklULT5nZXRUYXJnZXREYXRhKCktPmdldFByZWZlcnJlZEFsaWdubWVudChHVik7CisgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBBZGRpbmcgaW4gc2l6ZSAiIDw8IEdWU2l6ZSA8PCAiIGFsaWdubWVudCAiIDw8IEdWQWxpZ24pOworICBERUJVRyhHVi0+ZHVtcCgpKTsKKyAgLy8gQXNzdW1lIGNvZGUgc2VjdGlvbiBlbmRzIHdpdGggd29yc3QgcG9zc2libGUgYWxpZ25tZW50LCBzbyBmaXJzdAorICAvLyB2YXJpYWJsZSBuZWVkcyBtYXhpbWFsIHBhZGRpbmcuCisgIGlmIChTaXplPT0wKQorICAgIFNpemUgPSAxOworICBTaXplID0gKChTaXplK0dWQWxpZ24tMSkvR1ZBbGlnbikqR1ZBbGlnbjsKKyAgU2l6ZSArPSBHVlNpemU7CisgIHJldHVybiBTaXplOworfQorCisvLy8gYWRkU2l6ZU9mR2xvYmFsc0luQ29uc3RhbnRWYWwgLSBmaW5kIGFueSBnbG9iYWxzIHRoYXQgd2UgaGF2ZW4ndCBzZWVuIHlldAorLy8vIGJ1dCBhcmUgcmVmZXJlbmNlZCBmcm9tIHRoZSBjb25zdGFudDsgcHV0IHRoZW0gaW4gU2Vlbkdsb2JhbHMgYW5kIHRoZQorLy8vIFdvcmtsaXN0LCBhbmQgYWRkIHRoZWlyIHNpemUgaW50byB0aGUgcnVubmluZyB0b3RhbCBTaXplLgorCit1bnNpZ25lZCBKSVRFbWl0dGVyOjphZGRTaXplT2ZHbG9iYWxzSW5Db25zdGFudFZhbCgKKyAgICBjb25zdCBDb25zdGFudCAqQywKKyAgICB1bnNpZ25lZCBTaXplLAorICAgIFNtYWxsUHRyU2V0PGNvbnN0IEdsb2JhbFZhcmlhYmxlKiwgOD4gJlNlZW5HbG9iYWxzLAorICAgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBHbG9iYWxWYXJpYWJsZSo+ICZXb3JrbGlzdCkgeworICAvLyBJZiBpdHMgdW5kZWZpbmVkLCByZXR1cm4gdGhlIGdhcmJhZ2UuCisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oQykpCisgICAgcmV0dXJuIFNpemU7CisKKyAgLy8gSWYgdGhlIHZhbHVlIGlzIGEgQ29uc3RhbnRFeHByCisgIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDKSkgeworICAgIENvbnN0YW50ICpPcDAgPSBDRS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBzd2l0Y2ggKENFLT5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVHJ1bmM6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VUlUb0ZQOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNJVG9GUDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUFRvVUk6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1NJOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6IHsKKyAgICAgIFNpemUgPSBhZGRTaXplT2ZHbG9iYWxzSW5Db25zdGFudFZhbChPcDAsIFNpemUsIFNlZW5HbG9iYWxzLCBXb3JrbGlzdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZTdWI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZNdWw6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOiB7CisgICAgICBTaXplID0gYWRkU2l6ZU9mR2xvYmFsc0luQ29uc3RhbnRWYWwoT3AwLCBTaXplLCBTZWVuR2xvYmFscywgV29ya2xpc3QpOworICAgICAgU2l6ZSA9IGFkZFNpemVPZkdsb2JhbHNJbkNvbnN0YW50VmFsKENFLT5nZXRPcGVyYW5kKDEpLCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZW5HbG9iYWxzLCBXb3JrbGlzdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgIHN0ZDo6c3RyaW5nIG1zZzsKKyAgICAgICByYXdfc3RyaW5nX29zdHJlYW0gTXNnKG1zZyk7CisgICAgICAgTXNnIDw8ICJDb25zdGFudEV4cHIgbm90IGhhbmRsZWQ6ICIgPDwgKkNFOworICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcihNc2cuc3RyKCkpOworICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoQy0+Z2V0VHlwZSgpLT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpQb2ludGVyVHlJRCkKKyAgICBpZiAoY29uc3QgR2xvYmFsVmFyaWFibGUqIEdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KEMpKQorICAgICAgaWYgKFNlZW5HbG9iYWxzLmluc2VydChHVikpIHsKKyAgICAgICAgV29ya2xpc3QucHVzaF9iYWNrKEdWKTsKKyAgICAgICAgU2l6ZSA9IGFkZFNpemVPZkdsb2JhbChHViwgU2l6ZSk7CisgICAgICB9CisKKyAgcmV0dXJuIFNpemU7Cit9CisKKy8vLyBhZGRTaXplT2ZHTG9iYWxzSW5Jbml0aWFsaXplciAtIGhhbmRsZSBhbnkgZ2xvYmFscyB0aGF0IHdlIGhhdmVuJ3Qgc2VlbiB5ZXQKKy8vLyBidXQgYXJlIHJlZmVyZW5jZWQgZnJvbSB0aGUgZ2l2ZW4gaW5pdGlhbGl6ZXIuCisKK3Vuc2lnbmVkIEpJVEVtaXR0ZXI6OmFkZFNpemVPZkdsb2JhbHNJbkluaXRpYWxpemVyKAorICAgIGNvbnN0IENvbnN0YW50ICpJbml0LAorICAgIHVuc2lnbmVkIFNpemUsCisgICAgU21hbGxQdHJTZXQ8Y29uc3QgR2xvYmFsVmFyaWFibGUqLCA4PiAmU2Vlbkdsb2JhbHMsCisgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IEdsb2JhbFZhcmlhYmxlKj4gJldvcmtsaXN0KSB7CisgIGlmICghaXNhPFVuZGVmVmFsdWU+KEluaXQpICYmCisgICAgICAhaXNhPENvbnN0YW50VmVjdG9yPihJbml0KSAmJgorICAgICAgIWlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEluaXQpICYmCisgICAgICAhaXNhPENvbnN0YW50QXJyYXk+KEluaXQpICYmCisgICAgICAhaXNhPENvbnN0YW50U3RydWN0PihJbml0KSAmJgorICAgICAgSW5pdC0+Z2V0VHlwZSgpLT5pc0ZpcnN0Q2xhc3NUeXBlKCkpCisgICAgU2l6ZSA9IGFkZFNpemVPZkdsb2JhbHNJbkNvbnN0YW50VmFsKEluaXQsIFNpemUsIFNlZW5HbG9iYWxzLCBXb3JrbGlzdCk7CisgIHJldHVybiBTaXplOworfQorCisvLy8gR2V0U2l6ZU9mR2xvYmFsc0luQnl0ZXMgLSB3YWxrIHRoZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24sIGxvb2tpbmcgZm9yCisvLy8gZ2xvYmFsczsgdGhlbiB3YWxrIHRoZSBpbml0aWFsaXplcnMgb2YgdGhvc2UgZ2xvYmFscyBsb29raW5nIGZvciBtb3JlLgorLy8vIElmIHRoZWlyIHNpemUgaGFzIG5vdCBiZWVuIGNvbnNpZGVyZWQgeWV0LCBhZGQgaXQgaW50byB0aGUgcnVubmluZyB0b3RhbAorLy8vIFNpemUuCisKK3Vuc2lnbmVkIEpJVEVtaXR0ZXI6OkdldFNpemVPZkdsb2JhbHNJbkJ5dGVzKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgdW5zaWduZWQgU2l6ZSA9IDA7CisgIFNtYWxsUHRyU2V0PGNvbnN0IEdsb2JhbFZhcmlhYmxlKiwgOD4gU2Vlbkdsb2JhbHM7CisKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQiA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsKKyAgICAgICBNQkIgIT0gRTsgKytNQkIpIHsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBJID0gTUJCLT5iZWdpbigpLCBFID0gTUJCLT5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJkRlc2MgPSBJLT5nZXREZXNjKCk7CisgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJk1JID0gKkk7CisgICAgICB1bnNpZ25lZCBOdW1PcHMgPSBEZXNjLmdldE51bU9wZXJhbmRzKCk7CisgICAgICBmb3IgKHVuc2lnbmVkIEN1ck9wID0gMDsgQ3VyT3AgPCBOdW1PcHM7IEN1ck9wKyspIHsKKyAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChDdXJPcCk7CisgICAgICAgIGlmIChNTy5pc0dsb2JhbCgpKSB7CisgICAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUqIFYgPSBNTy5nZXRHbG9iYWwoKTsKKyAgICAgICAgICBjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxjb25zdCBHbG9iYWxWYXJpYWJsZT4oVik7CisgICAgICAgICAgaWYgKCFHVikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIC8vIElmIHNlZW4gaW4gcHJldmlvdXMgZnVuY3Rpb24sIGl0IHdpbGwgaGF2ZSBhbiBlbnRyeSBoZXJlLgorICAgICAgICAgIGlmIChUaGVKSVQtPmdldFBvaW50ZXJUb0dsb2JhbElmQXZhaWxhYmxlKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8R2xvYmFsVmFyaWFibGUgKj4oR1YpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIC8vIElmIHNlZW4gZWFybGllciBpbiB0aGlzIGZ1bmN0aW9uLCBpdCB3aWxsIGhhdmUgYW4gZW50cnkgaGVyZS4KKyAgICAgICAgICAvLyBGSVhNRTogaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNvbWJpbmUgdGhlc2UgdGFibGVzLCBieQorICAgICAgICAgIC8vIGFzc3VtaW5nIHRoZSBhZGRyZXNzZXMgb2YgdGhlIG5ldyBnbG9iYWxzIGluIHRoaXMgbW9kdWxlCisgICAgICAgICAgLy8gc3RhcnQgYXQgMCAob3Igc29tZXRoaW5nKSBhbmQgYWRqdXN0aW5nIHRoZW0gYWZ0ZXIgY29kZWdlbgorICAgICAgICAgIC8vIGNvbXBsZXRlLiAgQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0byBncmFiIGEgbWFya2VyIGJpdCBpbiBHVi4KKyAgICAgICAgICBpZiAoU2Vlbkdsb2JhbHMuaW5zZXJ0KEdWKSkKKyAgICAgICAgICAgIC8vIEEgdmFyaWFibGUgYXMgeWV0IHVuc2Vlbi4gIEFkZCBpbiBpdHMgc2l6ZS4KKyAgICAgICAgICAgIFNpemUgPSBhZGRTaXplT2ZHbG9iYWwoR1YsIFNpemUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBBYm91dCB0byBsb29rIHRocm91Z2ggaW5pdGlhbGl6ZXJzXG4iKTsKKyAgLy8gTG9vayBmb3IgbW9yZSBnbG9iYWxzIHRoYXQgYXJlIHJlZmVyZW5jZWQgb25seSBmcm9tIGluaXRpYWxpemVycy4KKyAgU21hbGxWZWN0b3I8Y29uc3QgR2xvYmFsVmFyaWFibGUqLCA4PiBXb3JrbGlzdCgKKyAgICBTZWVuR2xvYmFscy5iZWdpbigpLCBTZWVuR2xvYmFscy5lbmQoKSk7CisgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgIGNvbnN0IEdsb2JhbFZhcmlhYmxlKiBHViA9IFdvcmtsaXN0LmJhY2soKTsKKyAgICBXb3JrbGlzdC5wb3BfYmFjaygpOworICAgIGlmIChHVi0+aGFzSW5pdGlhbGl6ZXIoKSkKKyAgICAgIFNpemUgPSBhZGRTaXplT2ZHbG9iYWxzSW5Jbml0aWFsaXplcihHVi0+Z2V0SW5pdGlhbGl6ZXIoKSwgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWVuR2xvYmFscywgV29ya2xpc3QpOworICB9CisKKyAgcmV0dXJuIFNpemU7Cit9CisKK3ZvaWQgSklURW1pdHRlcjo6c3RhcnRGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIHsKKyAgREVCVUcoZGJncygpIDw8ICJKSVQ6IFN0YXJ0aW5nIENvZGVHZW4gb2YgRnVuY3Rpb24gIgorICAgICAgICA8PCBGLmdldEZ1bmN0aW9uKCktPmdldE5hbWUoKSA8PCAiXG4iKTsKKworICB1aW50cHRyX3QgQWN0dWFsU2l6ZSA9IDA7CisgIC8vIFNldCB0aGUgbWVtb3J5IHdyaXRhYmxlLCBpZiBpdCdzIG5vdCBhbHJlYWR5CisgIE1lbU1nci0+c2V0TWVtb3J5V3JpdGFibGUoKTsKKyAgCisgIGlmIChTaXplRXN0aW1hdGUgPiAwKSB7CisgICAgLy8gU2l6ZUVzdGltYXRlIHdpbGwgYmUgbm9uLXplcm8gb24gcmVhbGxvY2F0aW9uIGF0dGVtcHRzLgorICAgIEFjdHVhbFNpemUgPSBTaXplRXN0aW1hdGU7CisgIH0KKworICBCdWZmZXJCZWdpbiA9IEN1ckJ1ZmZlclB0ciA9IE1lbU1nci0+c3RhcnRGdW5jdGlvbkJvZHkoRi5nZXRGdW5jdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0dWFsU2l6ZSk7CisgIEJ1ZmZlckVuZCA9IEJ1ZmZlckJlZ2luK0FjdHVhbFNpemU7CisgIEVtaXR0ZWRGdW5jdGlvbnNbRi5nZXRGdW5jdGlvbigpXS5GdW5jdGlvbkJvZHkgPSBCdWZmZXJCZWdpbjsKKworICAvLyBFbnN1cmUgdGhlIGNvbnN0YW50IHBvb2wvanVtcCB0YWJsZSBpbmZvIGlzIGF0IGxlYXN0IDQtYnl0ZSBhbGlnbmVkLgorICBlbWl0QWxpZ25tZW50KDE2KTsKKworICBlbWl0Q29uc3RhbnRQb29sKEYuZ2V0Q29uc3RhbnRQb29sKCkpOworICBpZiAoTWFjaGluZUp1bXBUYWJsZUluZm8gKk1KVEkgPSBGLmdldEp1bXBUYWJsZUluZm8oKSkKKyAgICBpbml0SnVtcFRhYmxlSW5mbyhNSlRJKTsKKworICAvLyBBYm91dCB0byBzdGFydCBlbWl0dGluZyB0aGUgbWFjaGluZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24uCisgIGVtaXRBbGlnbm1lbnQoc3RkOjptYXgoRi5nZXRGdW5jdGlvbigpLT5nZXRBbGlnbm1lbnQoKSwgOFUpKTsKKyAgVGhlSklULT51cGRhdGVHbG9iYWxNYXBwaW5nKEYuZ2V0RnVuY3Rpb24oKSwgQ3VyQnVmZmVyUHRyKTsKKyAgRW1pdHRlZEZ1bmN0aW9uc1tGLmdldEZ1bmN0aW9uKCldLkNvZGUgPSBDdXJCdWZmZXJQdHI7CisKKyAgTUJCTG9jYXRpb25zLmNsZWFyKCk7CisKKyAgRW1pc3Npb25EZXRhaWxzLk1GID0gJkY7CisgIEVtaXNzaW9uRGV0YWlscy5MaW5lU3RhcnRzLmNsZWFyKCk7Cit9CisKK2Jvb2wgSklURW1pdHRlcjo6ZmluaXNoRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSB7CisgIGlmIChDdXJCdWZmZXJQdHIgPT0gQnVmZmVyRW5kKSB7CisgICAgLy8gV2UgbXVzdCBjYWxsIGVuZEZ1bmN0aW9uQm9keSBiZWZvcmUgcmV0cnlpbmcsIGJlY2F1c2UKKyAgICAvLyBkZWFsbG9jYXRlTWVtRm9yRnVuY3Rpb24gcmVxdWlyZXMgaXQuCisgICAgTWVtTWdyLT5lbmRGdW5jdGlvbkJvZHkoRi5nZXRGdW5jdGlvbigpLCBCdWZmZXJCZWdpbiwgQ3VyQnVmZmVyUHRyKTsKKyAgICByZXRyeVdpdGhNb3JlTWVtb3J5KEYpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKE1hY2hpbmVKdW1wVGFibGVJbmZvICpNSlRJID0gRi5nZXRKdW1wVGFibGVJbmZvKCkpCisgICAgZW1pdEp1bXBUYWJsZUluZm8oTUpUSSk7CisKKyAgLy8gRm5TdGFydCBpcyB0aGUgc3RhcnQgb2YgdGhlIHRleHQsIG5vdCB0aGUgc3RhcnQgb2YgdGhlIGNvbnN0YW50IHBvb2wgYW5kCisgIC8vIG90aGVyIHBlci1mdW5jdGlvbiBkYXRhLgorICB1aW50OF90ICpGblN0YXJ0ID0KKyAgICAodWludDhfdCAqKVRoZUpJVC0+Z2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoRi5nZXRGdW5jdGlvbigpKTsKKworICAvLyBGbkVuZCBpcyB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbidzIG1hY2hpbmUgY29kZS4KKyAgdWludDhfdCAqRm5FbmQgPSBDdXJCdWZmZXJQdHI7CisKKyAgaWYgKCFSZWxvY2F0aW9ucy5lbXB0eSgpKSB7CisgICAgQ3VyRm4gPSBGLmdldEZ1bmN0aW9uKCk7CisgICAgTnVtUmVsb3MgKz0gUmVsb2NhdGlvbnMuc2l6ZSgpOworCisgICAgLy8gUmVzb2x2ZSB0aGUgcmVsb2NhdGlvbnMgdG8gY29uY3JldGUgcG9pbnRlcnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlbG9jYXRpb25zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVSZWxvY2F0aW9uICZNUiA9IFJlbG9jYXRpb25zW2ldOworICAgICAgdm9pZCAqUmVzdWx0UHRyID0gMDsKKyAgICAgIGlmICghTVIubGV0VGFyZ2V0UmVzb2x2ZSgpKSB7CisgICAgICAgIGlmIChNUi5pc0V4dGVybmFsU3ltYm9sKCkpIHsKKyAgICAgICAgICBSZXN1bHRQdHIgPSBUaGVKSVQtPmdldFBvaW50ZXJUb05hbWVkRnVuY3Rpb24oTVIuZ2V0RXh0ZXJuYWxTeW1ib2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBNYXAgXCciIDw8IE1SLmdldEV4dGVybmFsU3ltYm9sKCkgPDwgIlwnIHRvIFsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IFJlc3VsdFB0ciA8PCAiXVxuIik7CisKKyAgICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IFJFQUxMWSB3YW50cyBhIHN0dWIgZm9yIHRoaXMgZnVuY3Rpb24sIGVtaXQgaXQgbm93LgorICAgICAgICAgIGlmIChNUi5tYXlOZWVkRmFyU3R1YigpKSB7CisgICAgICAgICAgICBSZXN1bHRQdHIgPSBSZXNvbHZlci5nZXRFeHRlcm5hbEZ1bmN0aW9uU3R1YihSZXN1bHRQdHIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChNUi5pc0dsb2JhbFZhbHVlKCkpIHsKKyAgICAgICAgICBSZXN1bHRQdHIgPSBnZXRQb2ludGVyVG9HbG9iYWwoTVIuZ2V0R2xvYmFsVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQmVnaW4rTVIuZ2V0TWFjaGluZUNvZGVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVIubWF5TmVlZEZhclN0dWIoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoTVIuaXNJbmRpcmVjdFN5bWJvbCgpKSB7CisgICAgICAgICAgUmVzdWx0UHRyID0gZ2V0UG9pbnRlclRvR1ZJbmRpcmVjdFN5bSgKKyAgICAgICAgICAgICAgTVIuZ2V0R2xvYmFsVmFsdWUoKSwgQnVmZmVyQmVnaW4rTVIuZ2V0TWFjaGluZUNvZGVPZmZzZXQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoTVIuaXNCYXNpY0Jsb2NrKCkpIHsKKyAgICAgICAgICBSZXN1bHRQdHIgPSAodm9pZCopZ2V0TWFjaGluZUJhc2ljQmxvY2tBZGRyZXNzKE1SLmdldEJhc2ljQmxvY2soKSk7CisgICAgICAgIH0gZWxzZSBpZiAoTVIuaXNDb25zdGFudFBvb2xJbmRleCgpKSB7CisgICAgICAgICAgUmVzdWx0UHRyID0gKHZvaWQqKWdldENvbnN0YW50UG9vbEVudHJ5QWRkcmVzcyhNUi5nZXRDb25zdGFudFBvb2xJbmRleCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhc3NlcnQoTVIuaXNKdW1wVGFibGVJbmRleCgpKTsKKyAgICAgICAgICBSZXN1bHRQdHI9KHZvaWQqKWdldEp1bXBUYWJsZUVudHJ5QWRkcmVzcyhNUi5nZXRKdW1wVGFibGVJbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIE1SLnNldFJlc3VsdFBvaW50ZXIoUmVzdWx0UHRyKTsKKyAgICAgIH0KKworICAgICAgLy8gaWYgd2UgYXJlIG1hbmFnaW5nIHRoZSBHT1QgYW5kIHRoZSByZWxvY2F0aW9uIHdhbnRzIGFuIGluZGV4LAorICAgICAgLy8gZ2l2ZSBpdCBvbmUKKyAgICAgIGlmIChNUi5pc0dPVFJlbGF0aXZlKCkgJiYgTWVtTWdyLT5pc01hbmFnaW5nR09UKCkpIHsKKyAgICAgICAgdW5zaWduZWQgaWR4ID0gUmVzb2x2ZXIuZ2V0R09USW5kZXhGb3JBZGRyKFJlc3VsdFB0cik7CisgICAgICAgIE1SLnNldEdPVEluZGV4KGlkeCk7CisgICAgICAgIGlmICgoKHZvaWQqKilNZW1NZ3ItPmdldEdPVEJhc2UoKSlbaWR4XSAhPSBSZXN1bHRQdHIpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkpJVDogR09UIHdhcyBvdXQgb2YgZGF0ZSBmb3IgIiA8PCBSZXN1bHRQdHIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBwb2ludGluZyBhdCAiIDw8ICgodm9pZCoqKU1lbU1nci0+Z2V0R09UQmFzZSgpKVtpZHhdCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIpOworICAgICAgICAgICgodm9pZCoqKU1lbU1nci0+Z2V0R09UQmFzZSgpKVtpZHhdID0gUmVzdWx0UHRyOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgQ3VyRm4gPSAwOworICAgIFRoZUpJVC0+Z2V0SklUSW5mbygpLnJlbG9jYXRlKEJ1ZmZlckJlZ2luLCAmUmVsb2NhdGlvbnNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2NhdGlvbnMuc2l6ZSgpLCBNZW1NZ3ItPmdldEdPVEJhc2UoKSk7CisgIH0KKworICAvLyBVcGRhdGUgdGhlIEdPVCBlbnRyeSBmb3IgRiB0byBwb2ludCB0byB0aGUgbmV3IGNvZGUuCisgIGlmIChNZW1NZ3ItPmlzTWFuYWdpbmdHT1QoKSkgeworICAgIHVuc2lnbmVkIGlkeCA9IFJlc29sdmVyLmdldEdPVEluZGV4Rm9yQWRkcigodm9pZCopQnVmZmVyQmVnaW4pOworICAgIGlmICgoKHZvaWQqKilNZW1NZ3ItPmdldEdPVEJhc2UoKSlbaWR4XSAhPSAodm9pZCopQnVmZmVyQmVnaW4pIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBHT1Qgd2FzIG91dCBvZiBkYXRlIGZvciAiIDw8ICh2b2lkKilCdWZmZXJCZWdpbgorICAgICAgICAgICAgICAgICAgIDw8ICIgcG9pbnRpbmcgYXQgIiA8PCAoKHZvaWQqKilNZW1NZ3ItPmdldEdPVEJhc2UoKSlbaWR4XQorICAgICAgICAgICAgICAgICAgIDw8ICJcbiIpOworICAgICAgKCh2b2lkKiopTWVtTWdyLT5nZXRHT1RCYXNlKCkpW2lkeF0gPSAodm9pZCopQnVmZmVyQmVnaW47CisgICAgfQorICB9CisKKyAgLy8gQ3VyQnVmZmVyUHRyIG1heSBoYXZlIG1vdmVkIGJleW9uZCBGbkVuZCwgZHVlIHRvIG1lbW9yeSBhbGxvY2F0aW9uIGZvcgorICAvLyBnbG9iYWwgdmFyaWFibGVzIHRoYXQgd2VyZSByZWZlcmVuY2VkIGluIHRoZSByZWxvY2F0aW9ucy4KKyAgTWVtTWdyLT5lbmRGdW5jdGlvbkJvZHkoRi5nZXRGdW5jdGlvbigpLCBCdWZmZXJCZWdpbiwgQ3VyQnVmZmVyUHRyKTsKKworICBpZiAoQ3VyQnVmZmVyUHRyID09IEJ1ZmZlckVuZCkgeworICAgIHJldHJ5V2l0aE1vcmVNZW1vcnkoRik7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gTm93IHRoYXQgd2UndmUgc3VjY2VlZGVkIGluIGVtaXR0aW5nIHRoZSBmdW5jdGlvbiwgcmVzZXQgdGhlCisgICAgLy8gU2l6ZUVzdGltYXRlIGJhY2sgZG93biB0byB6ZXJvLgorICAgIFNpemVFc3RpbWF0ZSA9IDA7CisgIH0KKworICBCdWZmZXJCZWdpbiA9IEN1ckJ1ZmZlclB0ciA9IDA7CisgIE51bUJ5dGVzICs9IEZuRW5kLUZuU3RhcnQ7CisKKyAgLy8gSW52YWxpZGF0ZSB0aGUgaWNhY2hlIGlmIG5lY2Vzc2FyeS4KKyAgc3lzOjpNZW1vcnk6OkludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKEZuU3RhcnQsIEZuRW5kLUZuU3RhcnQpOworCisgIFRoZUpJVC0+Tm90aWZ5RnVuY3Rpb25FbWl0dGVkKCpGLmdldEZ1bmN0aW9uKCksIEZuU3RhcnQsIEZuRW5kLUZuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtaXNzaW9uRGV0YWlscyk7CisKKyAgLy8gUmVzZXQgdGhlIHByZXZpb3VzIGRlYnVnIGxvY2F0aW9uLgorICBQcmV2REwgPSBEZWJ1Z0xvYygpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiSklUOiBGaW5pc2hlZCBDb2RlR2VuIG9mIFsiIDw8ICh2b2lkKilGblN0YXJ0CisgICAgICAgIDw8ICJdIEZ1bmN0aW9uOiAiIDw8IEYuZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZSgpCisgICAgICAgIDw8ICI6ICIgPDwgKEZuRW5kLUZuU3RhcnQpIDw8ICIgYnl0ZXMgb2YgdGV4dCwgIgorICAgICAgICA8PCBSZWxvY2F0aW9ucy5zaXplKCkgPDwgIiByZWxvY2F0aW9uc1xuIik7CisKKyAgUmVsb2NhdGlvbnMuY2xlYXIoKTsKKyAgQ29uc3RQb29sQWRkcmVzc2VzLmNsZWFyKCk7CisKKyAgLy8gTWFyayBjb2RlIHJlZ2lvbiByZWFkYWJsZSBhbmQgZXhlY3V0YWJsZSBpZiBpdCdzIG5vdCBzbyBhbHJlYWR5LgorICBNZW1NZ3ItPnNldE1lbW9yeUV4ZWN1dGFibGUoKTsKKworICBERUJVRyh7CisgICAgICBpZiAoc3lzOjpoYXNEaXNhc3NlbWJsZXIoKSkgeworICAgICAgICBkYmdzKCkgPDwgIkpJVDogRGlzYXNzZW1ibGVkIGNvZGU6XG4iOworICAgICAgICBkYmdzKCkgPDwgc3lzOjpkaXNhc3NlbWJsZUJ1ZmZlcihGblN0YXJ0LCBGbkVuZC1GblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KUZuU3RhcnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGJncygpIDw8ICJKSVQ6IEJpbmFyeSBjb2RlOlxuIjsKKyAgICAgICAgdWludDhfdCogcSA9IEZuU3RhcnQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBxIDwgRm5FbmQ7IHEgKz0gNCwgKytpKSB7CisgICAgICAgICAgaWYgKGkgPT0gNCkKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICBkYmdzKCkgPDwgIkpJVDogIiA8PCAobG9uZykocSAtIEZuU3RhcnQpIDw8ICI6ICI7CisgICAgICAgICAgYm9vbCBEb25lID0gZmFsc2U7CisgICAgICAgICAgZm9yIChpbnQgaiA9IDM7IGogPj0gMDsgLS1qKSB7CisgICAgICAgICAgICBpZiAocSArIGogPj0gRm5FbmQpCisgICAgICAgICAgICAgIERvbmUgPSB0cnVlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBkYmdzKCkgPDwgKHVuc2lnbmVkIHNob3J0KXFbal07CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChEb25lKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGJncygpIDw8ICcgJzsKKyAgICAgICAgICBpZiAoaSA9PSAzKQorICAgICAgICAgICAgZGJncygpIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgZGJncygpPDwgJ1xuJzsKKyAgICAgIH0KKyAgICB9KTsKKworICBpZiAoTU1JKQorICAgIE1NSS0+RW5kRnVuY3Rpb24oKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgSklURW1pdHRlcjo6cmV0cnlXaXRoTW9yZU1lbW9yeShNYWNoaW5lRnVuY3Rpb24gJkYpIHsKKyAgREVCVUcoZGJncygpIDw8ICJKSVQ6IFJhbiBvdXQgb2Ygc3BhY2UgZm9yIG5hdGl2ZSBjb2RlLiAgUmVhdHRlbXB0aW5nLlxuIik7CisgIFJlbG9jYXRpb25zLmNsZWFyKCk7ICAvLyBDbGVhciB0aGUgb2xkIHJlbG9jYXRpb25zIG9yIHdlJ2xsIHJlYXBwbHkgdGhlbS4KKyAgQ29uc3RQb29sQWRkcmVzc2VzLmNsZWFyKCk7CisgICsrTnVtUmV0cmllczsKKyAgZGVhbGxvY2F0ZU1lbUZvckZ1bmN0aW9uKEYuZ2V0RnVuY3Rpb24oKSk7CisgIC8vIFRyeSBhZ2FpbiB3aXRoIGF0IGxlYXN0IHR3aWNlIGFzIG11Y2ggZnJlZSBzcGFjZS4KKyAgU2l6ZUVzdGltYXRlID0gKHVpbnRwdHJfdCkoMiAqIChCdWZmZXJFbmQgLSBCdWZmZXJCZWdpbikpOworCisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkIgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBNQkIgIT0gRTsgKytNQkIpeworICAgIGlmIChNQkItPmhhc0FkZHJlc3NUYWtlbigpKQorICAgICAgVGhlSklULT5jbGVhclBvaW50ZXJUb0Jhc2ljQmxvY2soTUJCLT5nZXRCYXNpY0Jsb2NrKCkpOworICB9Cit9CisKKy8vLyBkZWFsbG9jYXRlTWVtRm9yRnVuY3Rpb24gLSBEZWFsbG9jYXRlIGFsbCBtZW1vcnkgZm9yIHRoZSBzcGVjaWZpZWQKKy8vLyBmdW5jdGlvbiBib2R5LiAgQWxzbyBkcm9wIGFueSByZWZlcmVuY2VzIHRoZSBmdW5jdGlvbiBoYXMgdG8gc3R1YnMuCisvLy8gTWF5IGJlIGNhbGxlZCB3aGlsZSB0aGUgRnVuY3Rpb24gaXMgYmVpbmcgZGVzdHJveWVkIGluc2lkZSB+VmFsdWUoKS4KK3ZvaWQgSklURW1pdHRlcjo6ZGVhbGxvY2F0ZU1lbUZvckZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIFZhbHVlTWFwPGNvbnN0IEZ1bmN0aW9uICosIEVtaXR0ZWRDb2RlLCBFbWl0dGVkRnVuY3Rpb25Db25maWc+OjppdGVyYXRvcgorICAgIEVtaXR0ZWQgPSBFbWl0dGVkRnVuY3Rpb25zLmZpbmQoRik7CisgIGlmIChFbWl0dGVkICE9IEVtaXR0ZWRGdW5jdGlvbnMuZW5kKCkpIHsKKyAgICBNZW1NZ3ItPmRlYWxsb2NhdGVGdW5jdGlvbkJvZHkoRW1pdHRlZC0+c2Vjb25kLkZ1bmN0aW9uQm9keSk7CisgICAgTWVtTWdyLT5kZWFsbG9jYXRlRXhjZXB0aW9uVGFibGUoRW1pdHRlZC0+c2Vjb25kLkV4Y2VwdGlvblRhYmxlKTsKKyAgICBUaGVKSVQtPk5vdGlmeUZyZWVpbmdNYWNoaW5lQ29kZShFbWl0dGVkLT5zZWNvbmQuQ29kZSk7CisKKyAgICBFbWl0dGVkRnVuY3Rpb25zLmVyYXNlKEVtaXR0ZWQpOworICB9Cit9CisKKwordm9pZCogSklURW1pdHRlcjo6YWxsb2NhdGVTcGFjZSh1aW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50KSB7CisgIGlmIChCdWZmZXJCZWdpbikKKyAgICByZXR1cm4gSklUQ29kZUVtaXR0ZXI6OmFsbG9jYXRlU3BhY2UoU2l6ZSwgQWxpZ25tZW50KTsKKworICAvLyBjcmVhdGUgYSBuZXcgbWVtb3J5IGJsb2NrIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBvbmUuCisgIC8vIGNhcmUgbXVzdCBiZSB0YWtlbiBzbyB0aGF0IEJ1ZmZlckJlZ2luIGlzIGludmFsaWRhdGVkIHdoZW4gYQorICAvLyBibG9jayBpcyB0cmltbWVkCisgIEJ1ZmZlckJlZ2luID0gQ3VyQnVmZmVyUHRyID0gTWVtTWdyLT5hbGxvY2F0ZVNwYWNlKFNpemUsIEFsaWdubWVudCk7CisgIEJ1ZmZlckVuZCA9IEJ1ZmZlckJlZ2luK1NpemU7CisgIHJldHVybiBDdXJCdWZmZXJQdHI7Cit9CisKK3ZvaWQqIEpJVEVtaXR0ZXI6OmFsbG9jYXRlR2xvYmFsKHVpbnRwdHJfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgLy8gRGVsZWdhdGUgdGhpcyBjYWxsIHRocm91Z2ggdGhlIG1lbW9yeSBtYW5hZ2VyLgorICByZXR1cm4gTWVtTWdyLT5hbGxvY2F0ZUdsb2JhbChTaXplLCBBbGlnbm1lbnQpOworfQorCit2b2lkIEpJVEVtaXR0ZXI6OmVtaXRDb25zdGFudFBvb2woTWFjaGluZUNvbnN0YW50UG9vbCAqTUNQKSB7CisgIGlmIChUaGVKSVQtPmdldEpJVEluZm8oKS5oYXNDdXN0b21Db25zdGFudFBvb2woKSkKKyAgICByZXR1cm47CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUNvbnN0YW50UG9vbEVudHJ5PiAmQ29uc3RhbnRzID0gTUNQLT5nZXRDb25zdGFudHMoKTsKKyAgaWYgKENvbnN0YW50cy5lbXB0eSgpKSByZXR1cm47CisKKyAgdW5zaWduZWQgU2l6ZSA9IEdldENvbnN0YW50UG9vbFNpemVJbkJ5dGVzKE1DUCwgVGhlSklULT5nZXRUYXJnZXREYXRhKCkpOworICB1bnNpZ25lZCBBbGlnbiA9IE1DUC0+Z2V0Q29uc3RhbnRQb29sQWxpZ25tZW50KCk7CisgIENvbnN0YW50UG9vbEJhc2UgPSBhbGxvY2F0ZVNwYWNlKFNpemUsIEFsaWduKTsKKyAgQ29uc3RhbnRQb29sID0gTUNQOworCisgIGlmIChDb25zdGFudFBvb2xCYXNlID09IDApIHJldHVybjsgIC8vIEJ1ZmZlciBvdmVyZmxvdy4KKworICBERUJVRyhkYmdzKCkgPDwgIkpJVDogRW1pdHRlZCBjb25zdGFudCBwb29sIGF0IFsiIDw8IENvbnN0YW50UG9vbEJhc2UKKyAgICAgICAgICAgICAgIDw8ICJdIChzaXplOiAiIDw8IFNpemUgPDwgIiwgYWxpZ25tZW50OiAiIDw8IEFsaWduIDw8ICIpXG4iKTsKKworICAvLyBJbml0aWFsaXplIHRoZSBtZW1vcnkgZm9yIGFsbCBvZiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyaWVzLgorICB1bnNpZ25lZCBPZmZzZXQgPSAwOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ29uc3RhbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkgQ1BFID0gQ29uc3RhbnRzW2ldOworICAgIHVuc2lnbmVkIEFsaWduTWFzayA9IENQRS5nZXRBbGlnbm1lbnQoKSAtIDE7CisgICAgT2Zmc2V0ID0gKE9mZnNldCArIEFsaWduTWFzaykgJiB+QWxpZ25NYXNrOworCisgICAgdWludHB0cl90IENBZGRyID0gKHVpbnRwdHJfdClDb25zdGFudFBvb2xCYXNlICsgT2Zmc2V0OworICAgIENvbnN0UG9vbEFkZHJlc3Nlcy5wdXNoX2JhY2soQ0FkZHIpOworICAgIGlmIChDUEUuaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSkgeworICAgICAgLy8gRklYTUU6IGFkZCBzdXBwb3J0IHRvIGxvd2VyIG1hY2hpbmUgY29uc3RhbnQgcG9vbCB2YWx1ZXMgaW50byBieXRlcyEKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiSW5pdGlhbGl6ZSBtZW1vcnkgd2l0aCBtYWNoaW5lIHNwZWNpZmljIGNvbnN0YW50IHBvb2wiCisgICAgICAgICAgICAgICAgICAgICAgICAiZW50cnkgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkISIpOworICAgIH0KKyAgICBUaGVKSVQtPkluaXRpYWxpemVNZW1vcnkoQ1BFLlZhbC5Db25zdFZhbCwgKHZvaWQqKUNBZGRyKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkpJVDogICBDUCIgPDwgaSA8PCAiIGF0IFsweCI7CisgICAgICAgICAgZGJncygpLndyaXRlX2hleChDQWRkcikgPDwgIl1cbiIpOworCisgICAgY29uc3QgVHlwZSAqVHkgPSBDUEUuVmFsLkNvbnN0VmFsLT5nZXRUeXBlKCk7CisgICAgT2Zmc2V0ICs9IFRoZUpJVC0+Z2V0VGFyZ2V0RGF0YSgpLT5nZXRUeXBlQWxsb2NTaXplKFR5KTsKKyAgfQorfQorCit2b2lkIEpJVEVtaXR0ZXI6OmluaXRKdW1wVGFibGVJbmZvKE1hY2hpbmVKdW1wVGFibGVJbmZvICpNSlRJKSB7CisgIGlmIChUaGVKSVQtPmdldEpJVEluZm8oKS5oYXNDdXN0b21KdW1wVGFibGVzKCkpCisgICAgcmV0dXJuOworICBpZiAoTUpUSS0+Z2V0RW50cnlLaW5kKCkgPT0gTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0lubGluZSkKKyAgICByZXR1cm47CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUp1bXBUYWJsZUVudHJ5PiAmSlQgPSBNSlRJLT5nZXRKdW1wVGFibGVzKCk7CisgIGlmIChKVC5lbXB0eSgpKSByZXR1cm47CisKKyAgdW5zaWduZWQgTnVtRW50cmllcyA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBKVC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE51bUVudHJpZXMgKz0gSlRbaV0uTUJCcy5zaXplKCk7CisKKyAgdW5zaWduZWQgRW50cnlTaXplID0gTUpUSS0+Z2V0RW50cnlTaXplKCpUaGVKSVQtPmdldFRhcmdldERhdGEoKSk7CisKKyAgLy8gSnVzdCBhbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIHRoZSBqdW1wIHRhYmxlcyBub3cuICBXZSB3aWxsIGZpeCB1cCB0aGUgYWN0dWFsCisgIC8vIE1CQiBlbnRyaWVzIGluIHRoZSB0YWJsZXMgYWZ0ZXIgd2UgZW1pdCB0aGUgY29kZSBmb3IgZWFjaCBibG9jaywgc2luY2UgdGhlbgorICAvLyB3ZSB3aWxsIGtub3cgdGhlIGZpbmFsIGxvY2F0aW9ucyBvZiB0aGUgTUJCcyBpbiBtZW1vcnkuCisgIEp1bXBUYWJsZSA9IE1KVEk7CisgIEp1bXBUYWJsZUJhc2UgPSBhbGxvY2F0ZVNwYWNlKE51bUVudHJpZXMgKiBFbnRyeVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1KVEktPmdldEVudHJ5QWxpZ25tZW50KCpUaGVKSVQtPmdldFRhcmdldERhdGEoKSkpOworfQorCit2b2lkIEpJVEVtaXR0ZXI6OmVtaXRKdW1wVGFibGVJbmZvKE1hY2hpbmVKdW1wVGFibGVJbmZvICpNSlRJKSB7CisgIGlmIChUaGVKSVQtPmdldEpJVEluZm8oKS5oYXNDdXN0b21KdW1wVGFibGVzKCkpCisgICAgcmV0dXJuOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gJkpUID0gTUpUSS0+Z2V0SnVtcFRhYmxlcygpOworICBpZiAoSlQuZW1wdHkoKSB8fCBKdW1wVGFibGVCYXNlID09IDApIHJldHVybjsKKworICAKKyAgc3dpdGNoIChNSlRJLT5nZXRFbnRyeUtpbmQoKSkgeworICBjYXNlIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19JbmxpbmU6CisgICAgcmV0dXJuOworICBjYXNlIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19CbG9ja0FkZHJlc3M6IHsKKyAgICAvLyBFS19CbG9ja0FkZHJlc3MgLSBFYWNoIGVudHJ5IGlzIGEgcGxhaW4gYWRkcmVzcyBvZiBibG9jaywgZS5nLjoKKyAgICAvLyAgICAgLndvcmQgTEJCMTIzCisgICAgYXNzZXJ0KE1KVEktPmdldEVudHJ5U2l6ZSgqVGhlSklULT5nZXRUYXJnZXREYXRhKCkpID09IHNpemVvZih2b2lkKikgJiYKKyAgICAgICAgICAgIkNyb3NzIEpJVCdpbmc/Iik7CisgICAgCisgICAgLy8gRm9yIGVhY2gganVtcCB0YWJsZSwgbWFwIGVhY2ggdGFyZ2V0IGluIHRoZSBqdW1wIHRhYmxlIHRvIHRoZSBhZGRyZXNzIG9mCisgICAgLy8gYW4gZW1pdHRlZCBNYWNoaW5lQmFzaWNCbG9jay4KKyAgICBpbnRwdHJfdCAqU2xvdFB0ciA9IChpbnRwdHJfdCopSnVtcFRhYmxlQmFzZTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSlQuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiAmTUJCcyA9IEpUW2ldLk1CQnM7CisgICAgICAvLyBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgYmFzaWMgYmxvY2sgZm9yIHRoaXMganVtcCB0YWJsZSBzbG90IGluIHRoZQorICAgICAgLy8gbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIGp1bXAgdGFibGUgaW4gJ2luaXRKdW1wVGFibGVJbmZvJworICAgICAgZm9yICh1bnNpZ25lZCBtaSA9IDAsIG1lID0gTUJCcy5zaXplKCk7IG1pICE9IG1lOyArK21pKQorICAgICAgICAqU2xvdFB0cisrID0gZ2V0TWFjaGluZUJhc2ljQmxvY2tBZGRyZXNzKE1CQnNbbWldKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgICAgIAorICBjYXNlIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19DdXN0b20zMjoKKyAgY2FzZSBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfR1BSZWwzMkJsb2NrQWRkcmVzczoKKyAgY2FzZSBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfTGFiZWxEaWZmZXJlbmNlMzI6IHsKKyAgICBhc3NlcnQoTUpUSS0+Z2V0RW50cnlTaXplKCpUaGVKSVQtPmdldFRhcmdldERhdGEoKSkgPT0gNCYmIkNyb3NzIEpJVCdpbmc/Iik7CisgICAgLy8gRm9yIGVhY2gganVtcCB0YWJsZSwgcGxhY2UgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhYmxlCisgICAgLy8gdG8gdGhlIHRhcmdldCBhZGRyZXNzLgorICAgIGludCAqU2xvdFB0ciA9IChpbnQqKUp1bXBUYWJsZUJhc2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSlQuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiAmTUJCcyA9IEpUW2ldLk1CQnM7CisgICAgICAvLyBTdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBiYXNpYyBibG9jayBmb3IgdGhpcyBqdW1wIHRhYmxlIHNsb3QgaW4gdGhlCisgICAgICAvLyBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUganVtcCB0YWJsZSBpbiAnaW5pdEp1bXBUYWJsZUluZm8nCisgICAgICB1aW50cHRyX3QgQmFzZSA9ICh1aW50cHRyX3QpU2xvdFB0cjsKKyAgICAgIGZvciAodW5zaWduZWQgbWkgPSAwLCBtZSA9IE1CQnMuc2l6ZSgpOyBtaSAhPSBtZTsgKyttaSkgeworICAgICAgICB1aW50cHRyX3QgTUJCQWRkciA9IGdldE1hY2hpbmVCYXNpY0Jsb2NrQWRkcmVzcyhNQkJzW21pXSk7CisgICAgICAgIC8vLyBGSVhNRTogVVNlIEVudHJ5S2luZCBpbnN0ZWFkIG9mIG1hZ2ljICJnZXRQSUNKdW1wVGFibGVFbnRyeSIgaG9vay4KKyAgICAgICAgKlNsb3RQdHIrKyA9IFRoZUpJVC0+Z2V0SklUSW5mbygpLmdldFBJQ0p1bXBUYWJsZUVudHJ5KE1CQkFkZHIsIEJhc2UpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorICB9Cit9CisKK3ZvaWQgSklURW1pdHRlcjo6c3RhcnRHVlN0dWIoY29uc3QgR2xvYmFsVmFsdWUqIEdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdHViU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50KSB7CisgIFNhdmVkQnVmZmVyQmVnaW4gPSBCdWZmZXJCZWdpbjsKKyAgU2F2ZWRCdWZmZXJFbmQgPSBCdWZmZXJFbmQ7CisgIFNhdmVkQ3VyQnVmZmVyUHRyID0gQ3VyQnVmZmVyUHRyOworCisgIEJ1ZmZlckJlZ2luID0gQ3VyQnVmZmVyUHRyID0gTWVtTWdyLT5hbGxvY2F0ZVN0dWIoR1YsIFN0dWJTaXplLCBBbGlnbm1lbnQpOworICBCdWZmZXJFbmQgPSBCdWZmZXJCZWdpbitTdHViU2l6ZSsxOworfQorCit2b2lkIEpJVEVtaXR0ZXI6OnN0YXJ0R1ZTdHViKHZvaWQgKkJ1ZmZlciwgdW5zaWduZWQgU3R1YlNpemUpIHsKKyAgU2F2ZWRCdWZmZXJCZWdpbiA9IEJ1ZmZlckJlZ2luOworICBTYXZlZEJ1ZmZlckVuZCA9IEJ1ZmZlckVuZDsKKyAgU2F2ZWRDdXJCdWZmZXJQdHIgPSBDdXJCdWZmZXJQdHI7CisKKyAgQnVmZmVyQmVnaW4gPSBDdXJCdWZmZXJQdHIgPSAodWludDhfdCAqKUJ1ZmZlcjsKKyAgQnVmZmVyRW5kID0gQnVmZmVyQmVnaW4rU3R1YlNpemUrMTsKK30KKwordm9pZCBKSVRFbWl0dGVyOjpmaW5pc2hHVlN0dWIoKSB7CisgIGFzc2VydChDdXJCdWZmZXJQdHIgIT0gQnVmZmVyRW5kICYmICJTdHViIG92ZXJmbG93ZWQgYWxsb2NhdGVkIHNwYWNlLiIpOworICBOdW1CeXRlcyArPSBnZXRDdXJyZW50UENPZmZzZXQoKTsKKyAgQnVmZmVyQmVnaW4gPSBTYXZlZEJ1ZmZlckJlZ2luOworICBCdWZmZXJFbmQgPSBTYXZlZEJ1ZmZlckVuZDsKKyAgQ3VyQnVmZmVyUHRyID0gU2F2ZWRDdXJCdWZmZXJQdHI7Cit9CisKK3ZvaWQgKkpJVEVtaXR0ZXI6OmFsbG9jSW5kaXJlY3RHVihjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqQnVmZmVyLCBzaXplX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgdWludDhfdCAqSW5kR1YgPSBNZW1NZ3ItPmFsbG9jYXRlU3R1YihHViwgU2l6ZSwgQWxpZ25tZW50KTsKKyAgbWVtY3B5KEluZEdWLCBCdWZmZXIsIFNpemUpOworICByZXR1cm4gSW5kR1Y7Cit9CisKKy8vIGdldENvbnN0YW50UG9vbEVudHJ5QWRkcmVzcyAtIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgJ0NvbnN0YW50TnVtJyBlbnRyeQorLy8gaW4gdGhlIGNvbnN0YW50IHBvb2wgdGhhdCB3YXMgbGFzdCBlbWl0dGVkIHdpdGggdGhlICdlbWl0Q29uc3RhbnRQb29sJworLy8gbWV0aG9kLgorLy8KK3VpbnRwdHJfdCBKSVRFbWl0dGVyOjpnZXRDb25zdGFudFBvb2xFbnRyeUFkZHJlc3ModW5zaWduZWQgQ29uc3RhbnROdW0pIGNvbnN0IHsKKyAgYXNzZXJ0KENvbnN0YW50TnVtIDwgQ29uc3RhbnRQb29sLT5nZXRDb25zdGFudHMoKS5zaXplKCkgJiYKKyAgICAgICAgICJJbnZhbGlkIENvbnN0YW50UG9vbEluZGV4ISIpOworICByZXR1cm4gQ29uc3RQb29sQWRkcmVzc2VzW0NvbnN0YW50TnVtXTsKK30KKworLy8gZ2V0SnVtcFRhYmxlRW50cnlBZGRyZXNzIC0gUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBKdW1wVGFibGUgd2l0aCBpbmRleAorLy8gJ0luZGV4JyBpbiB0aGUganVtcHAgdGFibGUgdGhhdCB3YXMgbGFzdCBpbml0aWFsaXplZCB3aXRoICdpbml0SnVtcFRhYmxlSW5mbycKKy8vCit1aW50cHRyX3QgSklURW1pdHRlcjo6Z2V0SnVtcFRhYmxlRW50cnlBZGRyZXNzKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gJkpUID0gSnVtcFRhYmxlLT5nZXRKdW1wVGFibGVzKCk7CisgIGFzc2VydChJbmRleCA8IEpULnNpemUoKSAmJiAiSW52YWxpZCBqdW1wIHRhYmxlIGluZGV4ISIpOworCisgIHVuc2lnbmVkIEVudHJ5U2l6ZSA9IEp1bXBUYWJsZS0+Z2V0RW50cnlTaXplKCpUaGVKSVQtPmdldFRhcmdldERhdGEoKSk7CisKKyAgdW5zaWduZWQgT2Zmc2V0ID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEluZGV4OyArK2kpCisgICAgT2Zmc2V0ICs9IEpUW2ldLk1CQnMuc2l6ZSgpOworCisgICBPZmZzZXQgKj0gRW50cnlTaXplOworCisgIHJldHVybiAodWludHB0cl90KSgoY2hhciAqKUp1bXBUYWJsZUJhc2UgKyBPZmZzZXQpOworfQorCit2b2lkIEpJVEVtaXR0ZXI6OkVtaXR0ZWRGdW5jdGlvbkNvbmZpZzo6b25EZWxldGUoCisgIEpJVEVtaXR0ZXIgKkVtaXR0ZXIsIGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIEVtaXR0ZXItPmRlYWxsb2NhdGVNZW1Gb3JGdW5jdGlvbihGKTsKK30KK3ZvaWQgSklURW1pdHRlcjo6RW1pdHRlZEZ1bmN0aW9uQ29uZmlnOjpvblJBVVcoCisgIEpJVEVtaXR0ZXIgKiwgY29uc3QgRnVuY3Rpb24qLCBjb25zdCBGdW5jdGlvbiopIHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiVGhlIEpJVCBkb2Vzbid0IGtub3cgaG93IHRvIGhhbmRsZSBhIgorICAgICAgICAgICAgICAgICAgICIgUkFVVyBvbiBhIHZhbHVlIGl0IGhhcyBlbWl0dGVkLiIpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgUHVibGljIGludGVyZmFjZSB0byB0aGlzIGZpbGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0pJVENvZGVFbWl0dGVyICpKSVQ6OmNyZWF0ZUVtaXR0ZXIoSklUICZqaXQsIEpJVE1lbW9yeU1hbmFnZXIgKkpNTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TWFjaGluZSAmdG0pIHsKKyAgcmV0dXJuIG5ldyBKSVRFbWl0dGVyKGppdCwgSk1NLCB0bSk7Cit9CisKKy8vIGdldFBvaW50ZXJUb0Z1bmN0aW9uT3JTdHViIC0gSWYgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBoYXMgYmVlbgorLy8gY29kZS1nZW4nZCwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICBJZiBub3QsIGNvbXBpbGUgaXQsIG9yIHVzZQorLy8gYSBzdHViIHRvIGltcGxlbWVudCBsYXp5IGNvbXBpbGF0aW9uIGlmIGF2YWlsYWJsZS4KKy8vCit2b2lkICpKSVQ6OmdldFBvaW50ZXJUb0Z1bmN0aW9uT3JTdHViKEZ1bmN0aW9uICpGKSB7CisgIC8vIElmIHdlIGhhdmUgYWxyZWFkeSBjb2RlIGdlbmVyYXRlZCB0aGUgZnVuY3Rpb24sIGp1c3QgcmV0dXJuIHRoZSBhZGRyZXNzLgorICBpZiAodm9pZCAqQWRkciA9IGdldFBvaW50ZXJUb0dsb2JhbElmQXZhaWxhYmxlKEYpKQorICAgIHJldHVybiBBZGRyOworCisgIC8vIEdldCBhIHN0dWIgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyBpdC4KKyAgYXNzZXJ0KGlzYTxKSVRFbWl0dGVyPihKQ0UpICYmICJVbmV4cGVjdGVkIE1DRT8iKTsKKyAgSklURW1pdHRlciAqSkUgPSBjYXN0PEpJVEVtaXR0ZXI+KGdldENvZGVFbWl0dGVyKCkpOworICByZXR1cm4gSkUtPmdldEpJVFJlc29sdmVyKCkuZ2V0TGF6eUZ1bmN0aW9uU3R1YihGKTsKK30KKwordm9pZCBKSVQ6OnVwZGF0ZUZ1bmN0aW9uU3R1YihGdW5jdGlvbiAqRikgeworICAvLyBHZXQgdGhlIGVtcHR5IHN0dWIgd2UgZ2VuZXJhdGVkIGVhcmxpZXIuCisgIGFzc2VydChpc2E8SklURW1pdHRlcj4oSkNFKSAmJiAiVW5leHBlY3RlZCBNQ0U/Iik7CisgIEpJVEVtaXR0ZXIgKkpFID0gY2FzdDxKSVRFbWl0dGVyPihnZXRDb2RlRW1pdHRlcigpKTsKKyAgdm9pZCAqU3R1YiA9IEpFLT5nZXRKSVRSZXNvbHZlcigpLmdldExhenlGdW5jdGlvblN0dWIoRik7CisgIHZvaWQgKkFkZHIgPSBnZXRQb2ludGVyVG9HbG9iYWxJZkF2YWlsYWJsZShGKTsKKyAgYXNzZXJ0KEFkZHIgIT0gU3R1YiAmJiAiRnVuY3Rpb24gbXVzdCBoYXZlIG5vbi1zdHViIGFkZHJlc3MgdG8gYmUgdXBkYXRlZC4iKTsKKworICAvLyBUZWxsIHRoZSB0YXJnZXQgaml0IGluZm8gdG8gcmV3cml0ZSB0aGUgc3R1YiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MsCisgIC8vIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4KKyAgVGFyZ2V0SklUSW5mbzo6U3R1YkxheW91dCBsYXlvdXQgPSBnZXRKSVRJbmZvKCkuZ2V0U3R1YkxheW91dCgpOworICBKRS0+c3RhcnRHVlN0dWIoU3R1YiwgbGF5b3V0LlNpemUpOworICBnZXRKSVRJbmZvKCkuZW1pdEZ1bmN0aW9uU3R1YihGLCBBZGRyLCAqZ2V0Q29kZUVtaXR0ZXIoKSk7CisgIEpFLT5maW5pc2hHVlN0dWIoKTsKK30KKworLy8vIGZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uIC0gcmVsZWFzZSBtYWNoaW5lIGNvZGUgbWVtb3J5IGZvciBnaXZlbiBGdW5jdGlvbi4KKy8vLwordm9pZCBKSVQ6OmZyZWVNYWNoaW5lQ29kZUZvckZ1bmN0aW9uKEZ1bmN0aW9uICpGKSB7CisgIC8vIERlbGV0ZSB0cmFuc2xhdGlvbiBmb3IgdGhpcyBmcm9tIHRoZSBFeGVjdXRpb25FbmdpbmUsIHNvIGl0IHdpbGwgZ2V0CisgIC8vIHJldHJhbnNsYXRlZCBuZXh0IHRpbWUgaXQgaXMgdXNlZC4KKyAgdXBkYXRlR2xvYmFsTWFwcGluZyhGLCAwKTsKKworICAvLyBGcmVlIHRoZSBhY3R1YWwgbWVtb3J5IGZvciB0aGUgZnVuY3Rpb24gYm9keSBhbmQgcmVsYXRlZCBzdHVmZi4KKyAgYXNzZXJ0KGlzYTxKSVRFbWl0dGVyPihKQ0UpICYmICJVbmV4cGVjdGVkIE1DRT8iKTsKKyAgY2FzdDxKSVRFbWl0dGVyPihKQ0UpLT5kZWFsbG9jYXRlTWVtRm9yRnVuY3Rpb24oRik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVRNZW1vcnlNYW5hZ2VyLmNwcCBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL0pJVE1lbW9yeU1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2U2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVRNZW1vcnlNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDcyNyBAQAorLy89PT0tLSBKSVRNZW1vcnlNYW5hZ2VyLmNwcCAtIE1lbW9yeSBBbGxvY2F0b3IgZm9yIEpJVCdkIGNvZGUgLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGVmYXVsdEpJVE1lbW9yeU1hbmFnZXIgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJqaXQiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUTWVtb3J5TWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTWVtb3J5LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RyaW5nPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1TbGFicywgIk51bWJlciBvZiBzbGFicyBvZiBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBKSVQiKTsKKworSklUTWVtb3J5TWFuYWdlcjo6fkpJVE1lbW9yeU1hbmFnZXIoKSB7fQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWVtb3J5IEJsb2NrIEltcGxlbWVudGF0aW9uLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbmFtZXNwYWNlIHsKKyAgLy8vIE1lbW9yeVJhbmdlSGVhZGVyIC0gRm9yIGEgcmFuZ2Ugb2YgbWVtb3J5LCB0aGlzIGlzIHRoZSBoZWFkZXIgdGhhdCB3ZSBwdXQKKyAgLy8vIG9uIHRoZSBibG9jayBvZiBtZW1vcnkuICBJdCBpcyBjYXJlZnVsbHkgY3JhZnRlZCB0byBiZSBvbmUgd29yZCBvZiBtZW1vcnkuCisgIC8vLyBBbGxvY2F0ZWQgYmxvY2tzIGhhdmUganVzdCB0aGlzIGhlYWRlciwgZnJlZSdkIGJsb2NrcyBoYXZlIEZyZWVSYW5nZUhlYWRlcgorICAvLy8gd2hpY2ggc3RhcnRzIHdpdGggdGhpcy4KKyAgc3RydWN0IEZyZWVSYW5nZUhlYWRlcjsKKyAgc3RydWN0IE1lbW9yeVJhbmdlSGVhZGVyIHsKKyAgICAvLy8gVGhpc0FsbG9jYXRlZCAtIFRoaXMgaXMgdHJ1ZSBpZiB0aGlzIGJsb2NrIGlzIGN1cnJlbnRseSBhbGxvY2F0ZWQuICBJZgorICAgIC8vLyBub3QsIHRoaXMgY2FuIGJlIGNvbnZlcnRlZCB0byBhIEZyZWVSYW5nZUhlYWRlci4KKyAgICB1bnNpZ25lZCBUaGlzQWxsb2NhdGVkIDogMTsKKworICAgIC8vLyBQcmV2QWxsb2NhdGVkIC0gS2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBibG9jayBpbW1lZGlhdGVseSBiZWZvcmUgdXMgaXMKKyAgICAvLy8gYWxsb2NhdGVkLiAgSWYgbm90LCB0aGUgd29yZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBoZWFkZXIgaXMgdGhlIHNpemUKKyAgICAvLy8gb2YgdGhlIHByZXZpb3VzIGJsb2NrLgorICAgIHVuc2lnbmVkIFByZXZBbGxvY2F0ZWQgOiAxOworCisgICAgLy8vIEJsb2NrU2l6ZSAtIFRoaXMgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhpcyBtZW1vcnkgYmxvY2ssCisgICAgLy8vIGluY2x1ZGluZyB0aGlzIGhlYWRlci4KKyAgICB1aW50cHRyX3QgQmxvY2tTaXplIDogKHNpemVvZihpbnRwdHJfdCkqQ0hBUl9CSVQgLSAyKTsKKworCisgICAgLy8vIGdldEJsb2NrQWZ0ZXIgLSBSZXR1cm4gdGhlIG1lbW9yeSBibG9jayBpbW1lZGlhdGVseSBhZnRlciB0aGlzIG9uZS4KKyAgICAvLy8KKyAgICBNZW1vcnlSYW5nZUhlYWRlciAmZ2V0QmxvY2tBZnRlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAqKE1lbW9yeVJhbmdlSGVhZGVyKikoKGNoYXIqKXRoaXMrQmxvY2tTaXplKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0RnJlZUJsb2NrQmVmb3JlIC0gSWYgdGhlIGJsb2NrIGJlZm9yZSB0aGlzIG9uZSBpcyBmcmVlLCByZXR1cm4gaXQsCisgICAgLy8vIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgICBGcmVlUmFuZ2VIZWFkZXIgKmdldEZyZWVCbG9ja0JlZm9yZSgpIGNvbnN0IHsKKyAgICAgIGlmIChQcmV2QWxsb2NhdGVkKSByZXR1cm4gMDsKKyAgICAgIGludHB0cl90IFByZXZTaXplID0gKChpbnRwdHJfdCAqKXRoaXMpWy0xXTsKKyAgICAgIHJldHVybiAoRnJlZVJhbmdlSGVhZGVyKikoKGNoYXIqKXRoaXMtUHJldlNpemUpOworICAgIH0KKworICAgIC8vLyBGcmVlQmxvY2sgLSBUdXJuIGFuIGFsbG9jYXRlZCBibG9jayBpbnRvIGEgZnJlZSBibG9jaywgYWRqdXN0aW5nCisgICAgLy8vIGJpdHMgaW4gdGhlIG9iamVjdCBoZWFkZXJzLCBhbmQgYWRkaW5nIGFuIGVuZCBvZiByZWdpb24gbWVtb3J5IGJsb2NrLgorICAgIEZyZWVSYW5nZUhlYWRlciAqRnJlZUJsb2NrKEZyZWVSYW5nZUhlYWRlciAqRnJlZUxpc3QpOworCisgICAgLy8vIFRyaW1BbGxvY2F0aW9uVG9TaXplIC0gSWYgdGhpcyBhbGxvY2F0ZWQgYmxvY2sgaXMgc2lnbmlmaWNhbnRseSBsYXJnZXIKKyAgICAvLy8gdGhhbiBOZXdTaXplLCBzcGxpdCBpdCBpbnRvIHR3byBwaWVjZXMgKHdoZXJlIHRoZSBmb3JtZXIgaXMgTmV3U2l6ZQorICAgIC8vLyBieXRlcywgaW5jbHVkaW5nIHRoZSBoZWFkZXIpLCBhbmQgYWRkIHRoZSBuZXcgYmxvY2sgdG8gdGhlIGZyZWUgbGlzdC4KKyAgICBGcmVlUmFuZ2VIZWFkZXIgKlRyaW1BbGxvY2F0aW9uVG9TaXplKEZyZWVSYW5nZUhlYWRlciAqRnJlZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBOZXdTaXplKTsKKyAgfTsKKworICAvLy8gRnJlZVJhbmdlSGVhZGVyIC0gRm9yIGEgbWVtb3J5IGJsb2NrIHRoYXQgaXNuJ3QgYWxyZWFkeSBhbGxvY2F0ZWQsIHRoaXMKKyAgLy8vIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGJsb2NrIGFuZCBoYXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGZyZWUgYmxvY2suCisgIC8vLyBGcmVlIGJsb2NrcyBhcmUga2VwdCBvbiBhIGNpcmN1bGFybHkgbGlua2VkIGxpc3QuCisgIHN0cnVjdCBGcmVlUmFuZ2VIZWFkZXIgOiBwdWJsaWMgTWVtb3J5UmFuZ2VIZWFkZXIgeworICAgIEZyZWVSYW5nZUhlYWRlciAqUHJldjsKKyAgICBGcmVlUmFuZ2VIZWFkZXIgKk5leHQ7CisKKyAgICAvLy8gZ2V0TWluQmxvY2tTaXplIC0gR2V0IHRoZSBtaW5pbXVtIHNpemUgZm9yIGEgbWVtb3J5IGJsb2NrLiAgQmxvY2tzCisgICAgLy8vIHNtYWxsZXIgdGhhbiB0aGlzIHNpemUgY2Fubm90IGJlIGNyZWF0ZWQuCisgICAgc3RhdGljIHVuc2lnbmVkIGdldE1pbkJsb2NrU2l6ZSgpIHsKKyAgICAgIHJldHVybiBzaXplb2YoRnJlZVJhbmdlSGVhZGVyKStzaXplb2YoaW50cHRyX3QpOworICAgIH0KKworICAgIC8vLyBTZXRFbmRPZkJsb2NrU2l6ZU1hcmtlciAtIFRoZSB3b3JkIGF0IHRoZSBlbmQgb2YgZXZlcnkgZnJlZSBibG9jayBpcworICAgIC8vLyBrbm93biB0byBiZSB0aGUgc2l6ZSBvZiB0aGUgZnJlZSBibG9jay4gIFNldCBpdCBmb3IgdGhpcyBibG9jay4KKyAgICB2b2lkIFNldEVuZE9mQmxvY2tTaXplTWFya2VyKCkgeworICAgICAgdm9pZCAqRW5kT2ZCbG9jayA9IChjaGFyKil0aGlzICsgQmxvY2tTaXplOworICAgICAgKChpbnRwdHJfdCAqKUVuZE9mQmxvY2spWy0xXSA9IEJsb2NrU2l6ZTsKKyAgICB9CisKKyAgICBGcmVlUmFuZ2VIZWFkZXIgKlJlbW92ZUZyb21GcmVlTGlzdCgpIHsKKyAgICAgIGFzc2VydChOZXh0LT5QcmV2ID09IHRoaXMgJiYgUHJldi0+TmV4dCA9PSB0aGlzICYmICJGcmVlbGlzdCBicm9rZW4hIik7CisgICAgICBOZXh0LT5QcmV2ID0gUHJldjsKKyAgICAgIHJldHVybiBQcmV2LT5OZXh0ID0gTmV4dDsKKyAgICB9CisKKyAgICB2b2lkIEFkZFRvRnJlZUxpc3QoRnJlZVJhbmdlSGVhZGVyICpGcmVlTGlzdCkgeworICAgICAgTmV4dCA9IEZyZWVMaXN0OworICAgICAgUHJldiA9IEZyZWVMaXN0LT5QcmV2OworICAgICAgUHJldi0+TmV4dCA9IHRoaXM7CisgICAgICBOZXh0LT5QcmV2ID0gdGhpczsKKyAgICB9CisKKyAgICAvLy8gR3Jvd0Jsb2NrIC0gVGhlIGJsb2NrIGFmdGVyIHRoaXMgYmxvY2sganVzdCBnb3QgZGVhbGxvY2F0ZWQuICBNZXJnZSBpdAorICAgIC8vLyBpbnRvIHRoZSBjdXJyZW50IGJsb2NrLgorICAgIHZvaWQgR3Jvd0Jsb2NrKHVpbnRwdHJfdCBOZXdTaXplKTsKKworICAgIC8vLyBBbGxvY2F0ZUJsb2NrIC0gTWFyayB0aGlzIGVudGlyZSBibG9jayBhbGxvY2F0ZWQsIHVwZGF0aW5nIGZyZWVsaXN0cworICAgIC8vLyBldGMuICBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjaXJjdWxhciBmcmVlLWxpc3QuCisgICAgRnJlZVJhbmdlSGVhZGVyICpBbGxvY2F0ZUJsb2NrKCk7CisgIH07Cit9CisKKworLy8vIEFsbG9jYXRlQmxvY2sgLSBNYXJrIHRoaXMgZW50aXJlIGJsb2NrIGFsbG9jYXRlZCwgdXBkYXRpbmcgZnJlZWxpc3RzCisvLy8gZXRjLiAgVGhpcyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY2lyY3VsYXIgZnJlZS1saXN0LgorRnJlZVJhbmdlSGVhZGVyICpGcmVlUmFuZ2VIZWFkZXI6OkFsbG9jYXRlQmxvY2soKSB7CisgIGFzc2VydCghVGhpc0FsbG9jYXRlZCAmJiAhZ2V0QmxvY2tBZnRlcigpLlByZXZBbGxvY2F0ZWQgJiYKKyAgICAgICAgICJDYW5ub3QgYWxsb2NhdGUgYW4gYWxsb2NhdGVkIGJsb2NrISIpOworICAvLyBNYXJrIHRoaXMgYmxvY2sgYWxsb2NhdGVkLgorICBUaGlzQWxsb2NhdGVkID0gMTsKKyAgZ2V0QmxvY2tBZnRlcigpLlByZXZBbGxvY2F0ZWQgPSAxOworCisgIC8vIFJlbW92ZSBpdCBmcm9tIHRoZSBmcmVlIGxpc3QuCisgIHJldHVybiBSZW1vdmVGcm9tRnJlZUxpc3QoKTsKK30KKworLy8vIEZyZWVCbG9jayAtIFR1cm4gYW4gYWxsb2NhdGVkIGJsb2NrIGludG8gYSBmcmVlIGJsb2NrLCBhZGp1c3RpbmcKKy8vLyBiaXRzIGluIHRoZSBvYmplY3QgaGVhZGVycywgYW5kIGFkZGluZyBhbiBlbmQgb2YgcmVnaW9uIG1lbW9yeSBibG9jay4KKy8vLyBJZiBwb3NzaWJsZSwgY29hbGVzY2UgdGhpcyBibG9jayB3aXRoIG5laWdoYm9yaW5nIGJsb2Nrcy4gIFJldHVybiB0aGUKKy8vLyBGcmVlUmFuZ2VIZWFkZXIgdG8gYWxsb2NhdGUgZnJvbS4KK0ZyZWVSYW5nZUhlYWRlciAqTWVtb3J5UmFuZ2VIZWFkZXI6OkZyZWVCbG9jayhGcmVlUmFuZ2VIZWFkZXIgKkZyZWVMaXN0KSB7CisgIE1lbW9yeVJhbmdlSGVhZGVyICpGb2xsb3dpbmdCbG9jayA9ICZnZXRCbG9ja0FmdGVyKCk7CisgIGFzc2VydChUaGlzQWxsb2NhdGVkICYmICJUaGlzIGJsb2NrIGlzIGFscmVhZHkgZnJlZSEiKTsKKyAgYXNzZXJ0KEZvbGxvd2luZ0Jsb2NrLT5QcmV2QWxsb2NhdGVkICYmICJGbGFncyBvdXQgb2Ygc3luYyEiKTsKKworICBGcmVlUmFuZ2VIZWFkZXIgKkZyZWVMaXN0VG9SZXR1cm4gPSBGcmVlTGlzdDsKKworICAvLyBJZiB0aGUgYmxvY2sgYWZ0ZXIgdGhpcyBvbmUgaXMgZnJlZSwgbWVyZ2UgaXQgaW50byB0aGlzIGJsb2NrLgorICBpZiAoIUZvbGxvd2luZ0Jsb2NrLT5UaGlzQWxsb2NhdGVkKSB7CisgICAgRnJlZVJhbmdlSGVhZGVyICZGb2xsb3dpbmdGcmVlQmxvY2sgPSAqKEZyZWVSYW5nZUhlYWRlciAqKUZvbGxvd2luZ0Jsb2NrOworICAgIC8vICJGcmVlTGlzdCIgYWx3YXlzIG5lZWRzIHRvIGJlIGEgdmFsaWQgZnJlZSBibG9jay4gIElmIHdlJ3JlIGFib3V0IHRvCisgICAgLy8gY29hbGVzY2Ugd2l0aCBpdCwgdXBkYXRlIG91ciBub3Rpb24gb2Ygd2hhdCB0aGUgZnJlZSBsaXN0IGlzLgorICAgIGlmICgmRm9sbG93aW5nRnJlZUJsb2NrID09IEZyZWVMaXN0KSB7CisgICAgICBGcmVlTGlzdCA9IEZvbGxvd2luZ0ZyZWVCbG9jay5OZXh0OworICAgICAgRnJlZUxpc3RUb1JldHVybiA9IDA7CisgICAgICBhc3NlcnQoJkZvbGxvd2luZ0ZyZWVCbG9jayAhPSBGcmVlTGlzdCAmJiAiTm8gdG9tYnN0b25lIGJsb2NrPyIpOworICAgIH0KKyAgICBGb2xsb3dpbmdGcmVlQmxvY2suUmVtb3ZlRnJvbUZyZWVMaXN0KCk7CisKKyAgICAvLyBJbmNsdWRlIHRoZSBmb2xsb3dpbmcgYmxvY2sgaW50byB0aGlzIG9uZS4KKyAgICBCbG9ja1NpemUgKz0gRm9sbG93aW5nRnJlZUJsb2NrLkJsb2NrU2l6ZTsKKyAgICBGb2xsb3dpbmdCbG9jayA9ICZGb2xsb3dpbmdGcmVlQmxvY2suZ2V0QmxvY2tBZnRlcigpOworCisgICAgLy8gVGVsbCB0aGUgYmxvY2sgYWZ0ZXIgdGhlIGJsb2NrIHdlIGFyZSBjb2FsZXNjaW5nIHRoYXQgdGhpcyBibG9jayBpcworICAgIC8vIGFsbG9jYXRlZC4KKyAgICBGb2xsb3dpbmdCbG9jay0+UHJldkFsbG9jYXRlZCA9IDE7CisgIH0KKworICBhc3NlcnQoRm9sbG93aW5nQmxvY2stPlRoaXNBbGxvY2F0ZWQgJiYgIk1pc3NlZCBjb2FsZXNjaW5nPyIpOworCisgIGlmIChGcmVlUmFuZ2VIZWFkZXIgKlByZXZGcmVlQmxvY2sgPSBnZXRGcmVlQmxvY2tCZWZvcmUoKSkgeworICAgIFByZXZGcmVlQmxvY2stPkdyb3dCbG9jayhQcmV2RnJlZUJsb2NrLT5CbG9ja1NpemUgKyBCbG9ja1NpemUpOworICAgIHJldHVybiBGcmVlTGlzdFRvUmV0dXJuID8gRnJlZUxpc3RUb1JldHVybiA6IFByZXZGcmVlQmxvY2s7CisgIH0KKworICAvLyBPdGhlcndpc2UsIG1hcmsgdGhpcyBibG9jayBmcmVlLgorICBGcmVlUmFuZ2VIZWFkZXIgJkZyZWVCbG9jayA9ICooRnJlZVJhbmdlSGVhZGVyKil0aGlzOworICBGb2xsb3dpbmdCbG9jay0+UHJldkFsbG9jYXRlZCA9IDA7CisgIEZyZWVCbG9jay5UaGlzQWxsb2NhdGVkID0gMDsKKworICAvLyBMaW5rIHRoaXMgaW50byB0aGUgbGlua2VkIGxpc3Qgb2YgZnJlZSBibG9ja3MuCisgIEZyZWVCbG9jay5BZGRUb0ZyZWVMaXN0KEZyZWVMaXN0KTsKKworICAvLyBBZGQgYSBtYXJrZXIgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGluZGljYXRpbmcgdGhlIHNpemUgb2YgdGhpcyBmcmVlCisgIC8vIGJsb2NrLgorICBGcmVlQmxvY2suU2V0RW5kT2ZCbG9ja1NpemVNYXJrZXIoKTsKKyAgcmV0dXJuIEZyZWVMaXN0VG9SZXR1cm4gPyBGcmVlTGlzdFRvUmV0dXJuIDogJkZyZWVCbG9jazsKK30KKworLy8vIEdyb3dCbG9jayAtIFRoZSBibG9jayBhZnRlciB0aGlzIGJsb2NrIGp1c3QgZ290IGRlYWxsb2NhdGVkLiAgTWVyZ2UgaXQKKy8vLyBpbnRvIHRoZSBjdXJyZW50IGJsb2NrLgordm9pZCBGcmVlUmFuZ2VIZWFkZXI6Okdyb3dCbG9jayh1aW50cHRyX3QgTmV3U2l6ZSkgeworICBhc3NlcnQoTmV3U2l6ZSA+IEJsb2NrU2l6ZSAmJiAiTm90IGdyb3dpbmcgYmxvY2s/Iik7CisgIEJsb2NrU2l6ZSA9IE5ld1NpemU7CisgIFNldEVuZE9mQmxvY2tTaXplTWFya2VyKCk7CisgIGdldEJsb2NrQWZ0ZXIoKS5QcmV2QWxsb2NhdGVkID0gMDsKK30KKworLy8vIFRyaW1BbGxvY2F0aW9uVG9TaXplIC0gSWYgdGhpcyBhbGxvY2F0ZWQgYmxvY2sgaXMgc2lnbmlmaWNhbnRseSBsYXJnZXIKKy8vLyB0aGFuIE5ld1NpemUsIHNwbGl0IGl0IGludG8gdHdvIHBpZWNlcyAod2hlcmUgdGhlIGZvcm1lciBpcyBOZXdTaXplCisvLy8gYnl0ZXMsIGluY2x1ZGluZyB0aGUgaGVhZGVyKSwgYW5kIGFkZCB0aGUgbmV3IGJsb2NrIHRvIHRoZSBmcmVlIGxpc3QuCitGcmVlUmFuZ2VIZWFkZXIgKk1lbW9yeVJhbmdlSGVhZGVyOjoKK1RyaW1BbGxvY2F0aW9uVG9TaXplKEZyZWVSYW5nZUhlYWRlciAqRnJlZUxpc3QsIHVpbnQ2NF90IE5ld1NpemUpIHsKKyAgYXNzZXJ0KFRoaXNBbGxvY2F0ZWQgJiYgZ2V0QmxvY2tBZnRlcigpLlByZXZBbGxvY2F0ZWQgJiYKKyAgICAgICAgICJDYW5ub3QgZGVhbGxvY2F0ZSBwYXJ0IG9mIGFuIGFsbG9jYXRlZCBibG9jayEiKTsKKworICAvLyBEb24ndCBhbGxvdyBibG9ja3MgdG8gYmUgdHJpbW1lZCBiZWxvdyBtaW5pbXVtIHJlcXVpcmVkIHNpemUKKyAgTmV3U2l6ZSA9IHN0ZDo6bWF4PHVpbnQ2NF90PihGcmVlUmFuZ2VIZWFkZXI6OmdldE1pbkJsb2NrU2l6ZSgpLCBOZXdTaXplKTsKKworICAvLyBSb3VuZCB1cCBzaXplIGZvciBhbGlnbm1lbnQgb2YgaGVhZGVyLgorICB1bnNpZ25lZCBIZWFkZXJBbGlnbiA9IF9fYWxpZ25vZihGcmVlUmFuZ2VIZWFkZXIpOworICBOZXdTaXplID0gKE5ld1NpemUrIChIZWFkZXJBbGlnbi0xKSkgJiB+KEhlYWRlckFsaWduLTEpOworCisgIC8vIFNpemUgaXMgbm93IHRoZSBzaXplIG9mIHRoZSBibG9jayB3ZSB3aWxsIHJlbW92ZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gY3VycmVudCBibG9jay4KKyAgYXNzZXJ0KE5ld1NpemUgPD0gQmxvY2tTaXplICYmCisgICAgICAgICAiQWxsb2NhdGluZyBtb3JlIHNwYWNlIGZyb20gdGhpcyBibG9jayB0aGFuIGV4aXN0cyEiKTsKKworICAvLyBJZiBzcGxpdHRpbmcgdGhpcyBibG9jayB3aWxsIGNhdXNlIHRoZSByZW1haW5kZXIgdG8gYmUgdG9vIHNtYWxsLCBkbyBub3QKKyAgLy8gc3BsaXQgdGhlIGJsb2NrLgorICBpZiAoQmxvY2tTaXplIDw9IE5ld1NpemUrRnJlZVJhbmdlSGVhZGVyOjpnZXRNaW5CbG9ja1NpemUoKSkKKyAgICByZXR1cm4gRnJlZUxpc3Q7CisKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBzcGxpY2UgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBieXRlcyBvdXQgb2YgdGhpcyBibG9jaywgZm9ybQorICAvLyBhIG5ldyBibG9jayBpbW1lZGlhdGVseSBhZnRlciBpdCwgdGhlbiBtYXJrIHRoaXMgYmxvY2sgYWxsb2NhdGVkLgorICBNZW1vcnlSYW5nZUhlYWRlciAmRm9ybWVyTmV4dEJsb2NrID0gZ2V0QmxvY2tBZnRlcigpOworCisgIC8vIENoYW5nZSB0aGUgc2l6ZSBvZiB0aGlzIGJsb2NrLgorICBCbG9ja1NpemUgPSBOZXdTaXplOworCisgIC8vIEdldCB0aGUgbmV3IGJsb2NrIHdlIGp1c3Qgc2xpY2VkIG91dCBhbmQgdHVybiBpdCBpbnRvIGEgZnJlZSBibG9jay4KKyAgRnJlZVJhbmdlSGVhZGVyICZOZXdOZXh0QmxvY2sgPSAoRnJlZVJhbmdlSGVhZGVyICYpZ2V0QmxvY2tBZnRlcigpOworICBOZXdOZXh0QmxvY2suQmxvY2tTaXplID0gKGNoYXIqKSZGb3JtZXJOZXh0QmxvY2sgLSAoY2hhciopJk5ld05leHRCbG9jazsKKyAgTmV3TmV4dEJsb2NrLlRoaXNBbGxvY2F0ZWQgPSAwOworICBOZXdOZXh0QmxvY2suUHJldkFsbG9jYXRlZCA9IDE7CisgIE5ld05leHRCbG9jay5TZXRFbmRPZkJsb2NrU2l6ZU1hcmtlcigpOworICBGb3JtZXJOZXh0QmxvY2suUHJldkFsbG9jYXRlZCA9IDA7CisgIE5ld05leHRCbG9jay5BZGRUb0ZyZWVMaXN0KEZyZWVMaXN0KTsKKyAgcmV0dXJuICZOZXdOZXh0QmxvY2s7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNZW1vcnkgQmxvY2sgSW1wbGVtZW50YXRpb24uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgeworCisgIGNsYXNzIERlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyOworCisgIGNsYXNzIEpJVFNsYWJBbGxvY2F0b3IgOiBwdWJsaWMgU2xhYkFsbG9jYXRvciB7CisgICAgRGVmYXVsdEpJVE1lbW9yeU1hbmFnZXIgJkpNTTsKKyAgcHVibGljOgorICAgIEpJVFNsYWJBbGxvY2F0b3IoRGVmYXVsdEpJVE1lbW9yeU1hbmFnZXIgJmptbSkgOiBKTU0oam1tKSB7IH0KKyAgICB2aXJ0dWFsIH5KSVRTbGFiQWxsb2NhdG9yKCkgeyB9CisgICAgdmlydHVhbCBNZW1TbGFiICpBbGxvY2F0ZShzaXplX3QgU2l6ZSk7CisgICAgdmlydHVhbCB2b2lkIERlYWxsb2NhdGUoTWVtU2xhYiAqU2xhYik7CisgIH07CisKKyAgLy8vIERlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyIC0gTWFuYWdlIG1lbW9yeSBmb3IgdGhlIEpJVCBjb2RlIGdlbmVyYXRpb24uCisgIC8vLyBUaGlzIHNwbGl0cyBhIGxhcmdlIGJsb2NrIG9mIE1BUF9OT1JFU0VSVkUnZCBtZW1vcnkgaW50byB0d28KKyAgLy8vIHNlY3Rpb25zLCBvbmUgZm9yIGZ1bmN0aW9uIHN0dWJzLCBvbmUgZm9yIHRoZSBmdW5jdGlvbnMgdGhlbXNlbHZlcy4gIFdlCisgIC8vLyBoYXZlIHRvIGRvIHRoaXMgYmVjYXVzZSB3ZSBtYXkgbmVlZCB0byBlbWl0IGEgZnVuY3Rpb24gc3R1YiB3aGlsZSBpbiB0aGUKKyAgLy8vIG1pZGRsZSBvZiBlbWl0dGluZyBhIGZ1bmN0aW9uLCBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbGFyZ2UgdGhlIGZ1bmN0aW9uIHdlCisgIC8vLyBhcmUgZW1pdHRpbmcgaXMuCisgIGNsYXNzIERlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyIDogcHVibGljIEpJVE1lbW9yeU1hbmFnZXIgeworCisgICAgLy8gV2hldGhlciB0byBwb2lzb24gZnJlZWQgbWVtb3J5LgorICAgIGJvb2wgUG9pc29uTWVtb3J5OworCisgICAgLy8vIExhc3RTbGFiIC0gVGhpcyBwb2ludHMgdG8gdGhlIGxhc3Qgc2xhYiBhbGxvY2F0ZWQgYW5kIGlzIHVzZWQgYXMgdGhlCisgICAgLy8vIE5lYXJCbG9jayBwYXJhbWV0ZXIgdG8gQWxsb2NhdGVSV1ggc28gdGhhdCB3ZSBjYW4gYXR0ZW1wdCB0byBsYXkgb3V0IGFsbAorICAgIC8vLyBzdHVicywgZGF0YSwgYW5kIGNvZGUgY29udGlndW91c2x5IGluIG1lbW9yeS4gIEluIGdlbmVyYWwsIGhvd2V2ZXIsIHRoaXMKKyAgICAvLy8gaXMgbm90IHBvc3NpYmxlIGJlY2F1c2UgdGhlIE5lYXJCbG9jayBwYXJhbWV0ZXIgaXMgaWdub3JlZCBvbiBXaW5kb3dzCisgICAgLy8vIHBsYXRmb3JtcyBhbmQgZXZlbiBvbiBVbml4IGl0IHdvcmtzIG9uIGEgYmVzdC1lZmZvcnQgcGFzaXMuCisgICAgc3lzOjpNZW1vcnlCbG9jayBMYXN0U2xhYjsKKworICAgIC8vIE1lbW9yeSBzbGFicyBhbGxvY2F0ZWQgYnkgdGhlIEpJVC4gIFdlIHJlZmVyIHRvIHRoZW0gYXMgc2xhYnMgc28gd2UgZG9uJ3QKKyAgICAvLyBjb25mdXNlIHRoZW0gd2l0aCB0aGUgYmxvY2tzIG9mIG1lbW9yeSBkZXNjcmliZWQgYWJvdmUuCisgICAgc3RkOjp2ZWN0b3I8c3lzOjpNZW1vcnlCbG9jaz4gQ29kZVNsYWJzOworICAgIEpJVFNsYWJBbGxvY2F0b3IgQnVtcFNsYWJBbGxvY2F0b3I7CisgICAgQnVtcFB0ckFsbG9jYXRvciBTdHViQWxsb2NhdG9yOworICAgIEJ1bXBQdHJBbGxvY2F0b3IgRGF0YUFsbG9jYXRvcjsKKworICAgIC8vIENpcmN1bGFyIGxpc3Qgb2YgZnJlZSBibG9ja3MuCisgICAgRnJlZVJhbmdlSGVhZGVyICpGcmVlTWVtb3J5TGlzdDsKKworICAgIC8vIFdoZW4gZW1pdHRpbmcgY29kZSBpbnRvIGEgbWVtb3J5IGJsb2NrLCB0aGlzIGlzIHRoZSBibG9jay4KKyAgICBNZW1vcnlSYW5nZUhlYWRlciAqQ3VyQmxvY2s7CisKKyAgICB1aW50OF90ICpHT1RCYXNlOyAgICAgLy8gVGFyZ2V0IFNwZWNpZmljIHJlc2VydmVkIG1lbW9yeQorICBwdWJsaWM6CisgICAgRGVmYXVsdEpJVE1lbW9yeU1hbmFnZXIoKTsKKyAgICB+RGVmYXVsdEpJVE1lbW9yeU1hbmFnZXIoKTsKKworICAgIC8vLyBhbGxvY2F0ZU5ld1NsYWIgLSBBbGxvY2F0ZXMgYSBuZXcgTWVtb3J5QmxvY2sgYW5kIHJlbWVtYmVycyBpdCBhcyB0aGUKKyAgICAvLy8gbGFzdCBzbGFiIGl0IGFsbG9jYXRlZCwgc28gdGhhdCBzdWJzZXF1ZW50IGFsbG9jYXRpb25zIGZvbGxvdyBpdC4KKyAgICBzeXM6Ok1lbW9yeUJsb2NrIGFsbG9jYXRlTmV3U2xhYihzaXplX3Qgc2l6ZSk7CisKKyAgICAvLy8gRGVmYXVsdENvZGVTbGFiU2l6ZSAtIFdoZW4gd2UgaGF2ZSB0byBnbyBtYXAgbW9yZSBtZW1vcnksIHdlIGFsbG9jYXRlIGF0CisgICAgLy8vIGxlYXN0IHRoaXMgbXVjaCB1bmxlc3MgbW9yZSBpcyByZXF1ZXN0ZWQuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBEZWZhdWx0Q29kZVNsYWJTaXplOworCisgICAgLy8vIERlZmF1bHRTbGFiU2l6ZSAtIEFsbG9jYXRlIGRhdGEgaW50byBzbGFicyBvZiB0aGlzIHNpemUgdW5sZXNzIHdlIGdldAorICAgIC8vLyBhbiBhbGxvY2F0aW9uIGFib3ZlIFNpemVUaHJlc2hvbGQuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBEZWZhdWx0U2xhYlNpemU7CisKKyAgICAvLy8gRGVmYXVsdFNpemVUaHJlc2hvbGQgLSBGb3IgYW55IGFsbG9jYXRpb24gbGFyZ2VyIHRoYW4gdGhpcyB0aHJlc2hvbGQsIHdlCisgICAgLy8vIHNob3VsZCBhbGxvY2F0ZSBhIHNlcGFyYXRlIHNsYWIuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBEZWZhdWx0U2l6ZVRocmVzaG9sZDsKKworICAgIHZvaWQgQWxsb2NhdGVHT1QoKTsKKworICAgIC8vIFRlc3RpbmcgbWV0aG9kcy4KKyAgICB2aXJ0dWFsIGJvb2wgQ2hlY2tJbnZhcmlhbnRzKHN0ZDo6c3RyaW5nICZFcnJvclN0cik7CisgICAgc2l6ZV90IEdldERlZmF1bHRDb2RlU2xhYlNpemUoKSB7IHJldHVybiBEZWZhdWx0Q29kZVNsYWJTaXplOyB9CisgICAgc2l6ZV90IEdldERlZmF1bHREYXRhU2xhYlNpemUoKSB7IHJldHVybiBEZWZhdWx0U2xhYlNpemU7IH0KKyAgICBzaXplX3QgR2V0RGVmYXVsdFN0dWJTbGFiU2l6ZSgpIHsgcmV0dXJuIERlZmF1bHRTbGFiU2l6ZTsgfQorICAgIHVuc2lnbmVkIEdldE51bUNvZGVTbGFicygpIHsgcmV0dXJuIENvZGVTbGFicy5zaXplKCk7IH0KKyAgICB1bnNpZ25lZCBHZXROdW1EYXRhU2xhYnMoKSB7IHJldHVybiBEYXRhQWxsb2NhdG9yLkdldE51bVNsYWJzKCk7IH0KKyAgICB1bnNpZ25lZCBHZXROdW1TdHViU2xhYnMoKSB7IHJldHVybiBTdHViQWxsb2NhdG9yLkdldE51bVNsYWJzKCk7IH0KKworICAgIC8vLyBzdGFydEZ1bmN0aW9uQm9keSAtIFdoZW4gYSBmdW5jdGlvbiBzdGFydHMsIGFsbG9jYXRlIGEgYmxvY2sgb2YgZnJlZQorICAgIC8vLyBleGVjdXRhYmxlIG1lbW9yeSwgcmV0dXJuaW5nIGEgcG9pbnRlciB0byBpdCBhbmQgaXRzIGFjdHVhbCBzaXplLgorICAgIHVpbnQ4X3QgKnN0YXJ0RnVuY3Rpb25Cb2R5KGNvbnN0IEZ1bmN0aW9uICpGLCB1aW50cHRyX3QgJkFjdHVhbFNpemUpIHsKKworICAgICAgRnJlZVJhbmdlSGVhZGVyKiBjYW5kaWRhdGVCbG9jayA9IEZyZWVNZW1vcnlMaXN0OworICAgICAgRnJlZVJhbmdlSGVhZGVyKiBoZWFkID0gRnJlZU1lbW9yeUxpc3Q7CisgICAgICBGcmVlUmFuZ2VIZWFkZXIqIGl0ZXIgPSBoZWFkLT5OZXh0OworCisgICAgICB1aW50cHRyX3QgbGFyZ2VzdCA9IGNhbmRpZGF0ZUJsb2NrLT5CbG9ja1NpemU7CisKKyAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGxhcmdlc3QgZnJlZSBibG9jaworICAgICAgd2hpbGUgKGl0ZXIgIT0gaGVhZCkgeworICAgICAgICBpZiAoaXRlci0+QmxvY2tTaXplID4gbGFyZ2VzdCkgeworICAgICAgICAgIGxhcmdlc3QgPSBpdGVyLT5CbG9ja1NpemU7CisgICAgICAgICAgY2FuZGlkYXRlQmxvY2sgPSBpdGVyOworICAgICAgICB9CisgICAgICAgIGl0ZXIgPSBpdGVyLT5OZXh0OworICAgICAgfQorCisgICAgICBsYXJnZXN0ID0gbGFyZ2VzdCAtIHNpemVvZihNZW1vcnlSYW5nZUhlYWRlcik7CisKKyAgICAgIC8vIElmIHRoaXMgYmxvY2sgaXNuJ3QgYmlnIGVub3VnaCBmb3IgdGhlIGFsbG9jYXRpb24gZGVzaXJlZCwgYWxsb2NhdGUKKyAgICAgIC8vIGFub3RoZXIgYmxvY2sgb2YgbWVtb3J5IGFuZCBhZGQgaXQgdG8gdGhlIGZyZWUgbGlzdC4KKyAgICAgIGlmIChsYXJnZXN0IDwgQWN0dWFsU2l6ZSB8fAorICAgICAgICAgIGxhcmdlc3QgPD0gRnJlZVJhbmdlSGVhZGVyOjpnZXRNaW5CbG9ja1NpemUoKSkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkpJVDogQWxsb2NhdGluZyBhbm90aGVyIHNsYWIgb2YgbWVtb3J5IGZvciBmdW5jdGlvbi4iKTsKKyAgICAgICAgY2FuZGlkYXRlQmxvY2sgPSBhbGxvY2F0ZU5ld0NvZGVTbGFiKChzaXplX3QpQWN0dWFsU2l6ZSk7CisgICAgICB9CisKKyAgICAgIC8vIFNlbGVjdCB0aGlzIGNhbmRpZGF0ZSBibG9jayBmb3IgYWxsb2NhdGlvbgorICAgICAgQ3VyQmxvY2sgPSBjYW5kaWRhdGVCbG9jazsKKworICAgICAgLy8gQWxsb2NhdGUgdGhlIGVudGlyZSBtZW1vcnkgYmxvY2suCisgICAgICBGcmVlTWVtb3J5TGlzdCA9IGNhbmRpZGF0ZUJsb2NrLT5BbGxvY2F0ZUJsb2NrKCk7CisgICAgICBBY3R1YWxTaXplID0gQ3VyQmxvY2stPkJsb2NrU2l6ZSAtIHNpemVvZihNZW1vcnlSYW5nZUhlYWRlcik7CisgICAgICByZXR1cm4gKHVpbnQ4X3QgKikoQ3VyQmxvY2sgKyAxKTsKKyAgICB9CisKKyAgICAvLy8gYWxsb2NhdGVOZXdDb2RlU2xhYiAtIEhlbHBlciBtZXRob2QgdG8gYWxsb2NhdGUgYSBuZXcgc2xhYiBvZiBjb2RlCisgICAgLy8vIG1lbW9yeSBmcm9tIHRoZSBPUyBhbmQgYWRkIGl0IHRvIHRoZSBmcmVlIGxpc3QuICBSZXR1cm5zIHRoZSBuZXcKKyAgICAvLy8gRnJlZVJhbmdlSGVhZGVyIGF0IHRoZSBiYXNlIG9mIHRoZSBzbGFiLgorICAgIEZyZWVSYW5nZUhlYWRlciAqYWxsb2NhdGVOZXdDb2RlU2xhYihzaXplX3QgTWluU2l6ZSkgeworICAgICAgLy8gSWYgdGhlIHVzZXIgbmVlZHMgYXQgbGVhc3QgTWluU2l6ZSBmcmVlIG1lbW9yeSwgdGhlbiB3ZSBhY2NvdW50IGZvcgorICAgICAgLy8gdHdvIE1lbW9yeVJhbmdlSGVhZGVyczogdGhlIG9uZSBpbiB0aGUgdXNlcidzIGJsb2NrLCBhbmQgdGhlIG9uZSBhdCB0aGUKKyAgICAgIC8vIGVuZCBvZiB0aGUgc2xhYi4KKyAgICAgIHNpemVfdCBQYWRkZWRNaW4gPSBNaW5TaXplICsgMiAqIHNpemVvZihNZW1vcnlSYW5nZUhlYWRlcik7CisgICAgICBzaXplX3QgU2xhYlNpemUgPSBzdGQ6Om1heChEZWZhdWx0Q29kZVNsYWJTaXplLCBQYWRkZWRNaW4pOworICAgICAgc3lzOjpNZW1vcnlCbG9jayBCID0gYWxsb2NhdGVOZXdTbGFiKFNsYWJTaXplKTsKKyAgICAgIENvZGVTbGFicy5wdXNoX2JhY2soQik7CisgICAgICBjaGFyICpNZW1CYXNlID0gKGNoYXIqKShCLmJhc2UoKSk7CisKKyAgICAgIC8vIFB1dCBhIHRpbnkgYWxsb2NhdGVkIGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhlIG1lbW9yeSBjaHVuaywgc28gd2hlbgorICAgICAgLy8gRnJlZUJsb2NrIGNhbGxzIGdldEJsb2NrQWZ0ZXIgaXQgZG9lc24ndCBmYWxsIG9mZiB0aGUgZW5kLgorICAgICAgTWVtb3J5UmFuZ2VIZWFkZXIgKkVuZEJsb2NrID0KKyAgICAgICAgICAoTWVtb3J5UmFuZ2VIZWFkZXIqKShNZW1CYXNlICsgQi5zaXplKCkpIC0gMTsKKyAgICAgIEVuZEJsb2NrLT5UaGlzQWxsb2NhdGVkID0gMTsKKyAgICAgIEVuZEJsb2NrLT5QcmV2QWxsb2NhdGVkID0gMDsKKyAgICAgIEVuZEJsb2NrLT5CbG9ja1NpemUgPSBzaXplb2YoTWVtb3J5UmFuZ2VIZWFkZXIpOworCisgICAgICAvLyBTdGFydCBvdXQgd2l0aCBhIHZhc3QgbmV3IGJsb2NrIG9mIGZyZWUgbWVtb3J5LgorICAgICAgRnJlZVJhbmdlSGVhZGVyICpOZXdCbG9jayA9IChGcmVlUmFuZ2VIZWFkZXIqKU1lbUJhc2U7CisgICAgICBOZXdCbG9jay0+VGhpc0FsbG9jYXRlZCA9IDA7CisgICAgICAvLyBNYWtlIHN1cmUgZ2V0RnJlZUJsb2NrQmVmb3JlIGRvZXNuJ3QgbG9vayBpbnRvIHVubWFwcGVkIG1lbW9yeS4KKyAgICAgIE5ld0Jsb2NrLT5QcmV2QWxsb2NhdGVkID0gMTsKKyAgICAgIE5ld0Jsb2NrLT5CbG9ja1NpemUgPSAodWludHB0cl90KUVuZEJsb2NrIC0gKHVpbnRwdHJfdClOZXdCbG9jazsKKyAgICAgIE5ld0Jsb2NrLT5TZXRFbmRPZkJsb2NrU2l6ZU1hcmtlcigpOworICAgICAgTmV3QmxvY2stPkFkZFRvRnJlZUxpc3QoRnJlZU1lbW9yeUxpc3QpOworCisgICAgICBhc3NlcnQoTmV3QmxvY2stPkJsb2NrU2l6ZSAtIHNpemVvZihNZW1vcnlSYW5nZUhlYWRlcikgPj0gTWluU2l6ZSAmJgorICAgICAgICAgICAgICJUaGUgYmxvY2sgd2FzIHRvbyBzbWFsbCEiKTsKKyAgICAgIHJldHVybiBOZXdCbG9jazsKKyAgICB9CisKKyAgICAvLy8gZW5kRnVuY3Rpb25Cb2R5IC0gVGhlIGZ1bmN0aW9uIEYgaXMgbm93IGFsbG9jYXRlZCwgYW5kIHRha2VzIHRoZSBtZW1vcnkKKyAgICAvLy8gaW4gdGhlIHJhbmdlIFtGdW5jdGlvblN0YXJ0LEZ1bmN0aW9uRW5kKS4KKyAgICB2b2lkIGVuZEZ1bmN0aW9uQm9keShjb25zdCBGdW5jdGlvbiAqRiwgdWludDhfdCAqRnVuY3Rpb25TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpGdW5jdGlvbkVuZCkgeworICAgICAgYXNzZXJ0KEZ1bmN0aW9uRW5kID4gRnVuY3Rpb25TdGFydCk7CisgICAgICBhc3NlcnQoRnVuY3Rpb25TdGFydCA9PSAodWludDhfdCAqKShDdXJCbG9jaysxKSAmJgorICAgICAgICAgICAgICJNaXNtYXRjaGVkIGZ1bmN0aW9uIHN0YXJ0L2VuZCEiKTsKKworICAgICAgdWludHB0cl90IEJsb2NrU2l6ZSA9IEZ1bmN0aW9uRW5kIC0gKHVpbnQ4X3QgKilDdXJCbG9jazsKKworICAgICAgLy8gUmVsZWFzZSB0aGUgbWVtb3J5IGF0IHRoZSBlbmQgb2YgdGhpcyBibG9jayB0aGF0IGlzbid0IG5lZWRlZC4KKyAgICAgIEZyZWVNZW1vcnlMaXN0ID1DdXJCbG9jay0+VHJpbUFsbG9jYXRpb25Ub1NpemUoRnJlZU1lbW9yeUxpc3QsIEJsb2NrU2l6ZSk7CisgICAgfQorCisgICAgLy8vIGFsbG9jYXRlU3BhY2UgLSBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBvZiB0aGUgZ2l2ZW4gc2l6ZS4gIFRoaXMgbWV0aG9kCisgICAgLy8vIGNhbm5vdCBiZSBjYWxsZWQgYmV0d2VlbiBjYWxscyB0byBzdGFydEZ1bmN0aW9uQm9keSBhbmQgZW5kRnVuY3Rpb25Cb2R5LgorICAgIHVpbnQ4X3QgKmFsbG9jYXRlU3BhY2UoaW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50KSB7CisgICAgICBDdXJCbG9jayA9IEZyZWVNZW1vcnlMaXN0OworICAgICAgRnJlZU1lbW9yeUxpc3QgPSBGcmVlTWVtb3J5TGlzdC0+QWxsb2NhdGVCbG9jaygpOworCisgICAgICB1aW50OF90ICpyZXN1bHQgPSAodWludDhfdCAqKShDdXJCbG9jayArIDEpOworCisgICAgICBpZiAoQWxpZ25tZW50ID09IDApIEFsaWdubWVudCA9IDE7CisgICAgICByZXN1bHQgPSAodWludDhfdCopKCgoaW50cHRyX3QpcmVzdWx0K0FsaWdubWVudC0xKSAmCisgICAgICAgICAgICAgICB+KGludHB0cl90KShBbGlnbm1lbnQtMSkpOworCisgICAgICB1aW50cHRyX3QgQmxvY2tTaXplID0gcmVzdWx0ICsgU2l6ZSAtICh1aW50OF90ICopQ3VyQmxvY2s7CisgICAgICBGcmVlTWVtb3J5TGlzdCA9Q3VyQmxvY2stPlRyaW1BbGxvY2F0aW9uVG9TaXplKEZyZWVNZW1vcnlMaXN0LCBCbG9ja1NpemUpOworCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vLyBhbGxvY2F0ZVN0dWIgLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgZnVuY3Rpb24gc3R1Yi4KKyAgICB1aW50OF90ICphbGxvY2F0ZVN0dWIoY29uc3QgR2xvYmFsVmFsdWUqIEYsIHVuc2lnbmVkIFN0dWJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgICAgIHJldHVybiAodWludDhfdCopU3R1YkFsbG9jYXRvci5BbGxvY2F0ZShTdHViU2l6ZSwgQWxpZ25tZW50KTsKKyAgICB9CisKKyAgICAvLy8gYWxsb2NhdGVHbG9iYWwgLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgZ2xvYmFsLgorICAgIHVpbnQ4X3QgKmFsbG9jYXRlR2xvYmFsKHVpbnRwdHJfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgICAgIHJldHVybiAodWludDhfdCopRGF0YUFsbG9jYXRvci5BbGxvY2F0ZShTaXplLCBBbGlnbm1lbnQpOworICAgIH0KKworICAgIC8vLyBzdGFydEV4Y2VwdGlvblRhYmxlIC0gVXNlIHN0YXJ0RnVuY3Rpb25Cb2R5IHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlCisgICAgLy8vIGZ1bmN0aW9uJ3MgZXhjZXB0aW9uIHRhYmxlLgorICAgIHVpbnQ4X3QqIHN0YXJ0RXhjZXB0aW9uVGFibGUoY29uc3QgRnVuY3Rpb24qIEYsIHVpbnRwdHJfdCAmQWN0dWFsU2l6ZSkgeworICAgICAgcmV0dXJuIHN0YXJ0RnVuY3Rpb25Cb2R5KEYsIEFjdHVhbFNpemUpOworICAgIH0KKworICAgIC8vLyBlbmRFeGNlcHRpb25UYWJsZSAtIFRoZSBleGNlcHRpb24gdGFibGUgb2YgRiBpcyBub3cgYWxsb2NhdGVkLAorICAgIC8vLyBhbmQgdGFrZXMgdGhlIG1lbW9yeSBpbiB0aGUgcmFuZ2UgW1RhYmxlU3RhcnQsVGFibGVFbmQpLgorICAgIHZvaWQgZW5kRXhjZXB0aW9uVGFibGUoY29uc3QgRnVuY3Rpb24gKkYsIHVpbnQ4X3QgKlRhYmxlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpUYWJsZUVuZCwgdWludDhfdCogRnJhbWVSZWdpc3RlcikgeworICAgICAgYXNzZXJ0KFRhYmxlRW5kID4gVGFibGVTdGFydCk7CisgICAgICBhc3NlcnQoVGFibGVTdGFydCA9PSAodWludDhfdCAqKShDdXJCbG9jaysxKSAmJgorICAgICAgICAgICAgICJNaXNtYXRjaGVkIHRhYmxlIHN0YXJ0L2VuZCEiKTsKKworICAgICAgdWludHB0cl90IEJsb2NrU2l6ZSA9IFRhYmxlRW5kIC0gKHVpbnQ4X3QgKilDdXJCbG9jazsKKworICAgICAgLy8gUmVsZWFzZSB0aGUgbWVtb3J5IGF0IHRoZSBlbmQgb2YgdGhpcyBibG9jayB0aGF0IGlzbid0IG5lZWRlZC4KKyAgICAgIEZyZWVNZW1vcnlMaXN0ID1DdXJCbG9jay0+VHJpbUFsbG9jYXRpb25Ub1NpemUoRnJlZU1lbW9yeUxpc3QsIEJsb2NrU2l6ZSk7CisgICAgfQorCisgICAgdWludDhfdCAqZ2V0R09UQmFzZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBHT1RCYXNlOworICAgIH0KKworICAgIHZvaWQgZGVhbGxvY2F0ZUJsb2NrKHZvaWQgKkJsb2NrKSB7CisgICAgICAvLyBGaW5kIHRoZSBibG9jayB0aGF0IGlzIGFsbG9jYXRlZCBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgICAgIE1lbW9yeVJhbmdlSGVhZGVyICpNZW1SYW5nZSA9IHN0YXRpY19jYXN0PE1lbW9yeVJhbmdlSGVhZGVyKj4oQmxvY2spIC0gMTsKKyAgICAgIGFzc2VydChNZW1SYW5nZS0+VGhpc0FsbG9jYXRlZCAmJiAiQmxvY2sgaXNuJ3QgYWxsb2NhdGVkISIpOworCisgICAgICAvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCBnYXJiYWdlIQorICAgICAgaWYgKFBvaXNvbk1lbW9yeSkgeworICAgICAgICBtZW1zZXQoTWVtUmFuZ2UrMSwgMHhDRCwgTWVtUmFuZ2UtPkJsb2NrU2l6ZS1zaXplb2YoKk1lbVJhbmdlKSk7CisgICAgICB9CisKKyAgICAgIC8vIEZyZWUgdGhlIG1lbW9yeS4KKyAgICAgIEZyZWVNZW1vcnlMaXN0ID0gTWVtUmFuZ2UtPkZyZWVCbG9jayhGcmVlTWVtb3J5TGlzdCk7CisgICAgfQorCisgICAgLy8vIGRlYWxsb2NhdGVGdW5jdGlvbkJvZHkgLSBEZWFsbG9jYXRlIGFsbCBtZW1vcnkgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gZnVuY3Rpb24gYm9keS4KKyAgICB2b2lkIGRlYWxsb2NhdGVGdW5jdGlvbkJvZHkodm9pZCAqQm9keSkgeworICAgICAgaWYgKEJvZHkpIGRlYWxsb2NhdGVCbG9jayhCb2R5KTsKKyAgICB9CisKKyAgICAvLy8gZGVhbGxvY2F0ZUV4Y2VwdGlvblRhYmxlIC0gRGVhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gZXhjZXB0aW9uIHRhYmxlLgorICAgIHZvaWQgZGVhbGxvY2F0ZUV4Y2VwdGlvblRhYmxlKHZvaWQgKkVUKSB7CisgICAgICBpZiAoRVQpIGRlYWxsb2NhdGVCbG9jayhFVCk7CisgICAgfQorCisgICAgLy8vIHNldE1lbW9yeVdyaXRhYmxlIC0gV2hlbiBjb2RlIGdlbmVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MsCisgICAgLy8vIHRoZSBjb2RlIHBhZ2VzIG1heSBuZWVkIHBlcm1pc3Npb25zIGNoYW5nZWQuCisgICAgdm9pZCBzZXRNZW1vcnlXcml0YWJsZSgpCisgICAgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvZGVTbGFicy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBzeXM6Ok1lbW9yeTo6c2V0V3JpdGFibGUoQ29kZVNsYWJzW2ldKTsKKyAgICB9CisgICAgLy8vIHNldE1lbW9yeUV4ZWN1dGFibGUgLSBXaGVuIGNvZGUgZ2VuZXJhdGlvbiBpcyBkb25lIGFuZCB3ZSdyZSByZWFkeSB0bworICAgIC8vLyBzdGFydCBleGVjdXRpb24sIHRoZSBjb2RlIHBhZ2VzIG1heSBuZWVkIHBlcm1pc3Npb25zIGNoYW5nZWQuCisgICAgdm9pZCBzZXRNZW1vcnlFeGVjdXRhYmxlKCkKKyAgICB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ29kZVNsYWJzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIHN5czo6TWVtb3J5OjpzZXRFeGVjdXRhYmxlKENvZGVTbGFic1tpXSk7CisgICAgfQorCisgICAgLy8vIHNldFBvaXNvbk1lbW9yeSAtIENvbnRyb2xzIHdoZXRoZXIgd2Ugd3JpdGUgZ2FyYmFnZSBvdmVyIGZyZWVkIG1lbW9yeS4KKyAgICAvLy8KKyAgICB2b2lkIHNldFBvaXNvbk1lbW9yeShib29sIHBvaXNvbikgeworICAgICAgUG9pc29uTWVtb3J5ID0gcG9pc29uOworICAgIH0KKyAgfTsKK30KKworTWVtU2xhYiAqSklUU2xhYkFsbG9jYXRvcjo6QWxsb2NhdGUoc2l6ZV90IFNpemUpIHsKKyAgc3lzOjpNZW1vcnlCbG9jayBCID0gSk1NLmFsbG9jYXRlTmV3U2xhYihTaXplKTsKKyAgTWVtU2xhYiAqU2xhYiA9IChNZW1TbGFiKilCLmJhc2UoKTsKKyAgU2xhYi0+U2l6ZSA9IEIuc2l6ZSgpOworICBTbGFiLT5OZXh0UHRyID0gMDsKKyAgcmV0dXJuIFNsYWI7Cit9CisKK3ZvaWQgSklUU2xhYkFsbG9jYXRvcjo6RGVhbGxvY2F0ZShNZW1TbGFiICpTbGFiKSB7CisgIHN5czo6TWVtb3J5QmxvY2sgQihTbGFiLCBTbGFiLT5TaXplKTsKKyAgc3lzOjpNZW1vcnk6OlJlbGVhc2VSV1goQik7Cit9CisKK0RlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyOjpEZWZhdWx0SklUTWVtb3J5TWFuYWdlcigpCisgIDoKKyNpZmRlZiBOREVCVUcKKyAgICBQb2lzb25NZW1vcnkoZmFsc2UpLAorI2Vsc2UKKyAgICBQb2lzb25NZW1vcnkodHJ1ZSksCisjZW5kaWYKKyAgICBMYXN0U2xhYigwLCAwKSwKKyAgICBCdW1wU2xhYkFsbG9jYXRvcigqdGhpcyksCisgICAgU3R1YkFsbG9jYXRvcihEZWZhdWx0U2xhYlNpemUsIERlZmF1bHRTaXplVGhyZXNob2xkLCBCdW1wU2xhYkFsbG9jYXRvciksCisgICAgRGF0YUFsbG9jYXRvcihEZWZhdWx0U2xhYlNpemUsIERlZmF1bHRTaXplVGhyZXNob2xkLCBCdW1wU2xhYkFsbG9jYXRvcikgeworCisgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBjb2RlLgorICBzeXM6Ok1lbW9yeUJsb2NrIE1lbUJsb2NrID0gYWxsb2NhdGVOZXdTbGFiKERlZmF1bHRDb2RlU2xhYlNpemUpOworICBDb2RlU2xhYnMucHVzaF9iYWNrKE1lbUJsb2NrKTsKKyAgdWludDhfdCAqTWVtQmFzZSA9ICh1aW50OF90KilNZW1CbG9jay5iYXNlKCk7CisKKyAgLy8gV2Ugc2V0IHVwIHRoZSBtZW1vcnkgY2h1bmsgd2l0aCA0IG1lbSByZWdpb25zLCBsaWtlIHRoaXM6CisgIC8vICBbIFNUQVJUCisgIC8vICAgIFsgRnJlZSAgICAgICMwIF0gLT4gTGFyZ2Ugc3BhY2UgdG8gYWxsb2NhdGUgZnVuY3Rpb25zIGZyb20uCisgIC8vICAgIFsgQWxsb2NhdGVkICMxIF0gLT4gVGlueSBzcGFjZSB0byBzZXBhcmF0ZSByZWdpb25zLgorICAvLyAgICBbIEZyZWUgICAgICAjMiBdIC0+IFRpbnkgc3BhY2Ugc28gdGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IDEgZnJlZSBibG9jay4KKyAgLy8gICAgWyBBbGxvY2F0ZWQgIzMgXSAtPiBUaW55IHNwYWNlIHRvIHByZXZlbnQgbG9va2luZyBwYXN0IGVuZCBvZiBibG9jay4KKyAgLy8gIEVORCBdCisgIC8vCisgIC8vIFRoZSBsYXN0IHRocmVlIGJsb2NrcyBhcmUgbmV2ZXIgZGVhbGxvY2F0ZWQgb3IgdG91Y2hlZC4KKworICAvLyBBZGQgTWVtb3J5UmFuZ2VIZWFkZXIgdG8gdGhlIGVuZCBvZiB0aGUgbWVtb3J5IHJlZ2lvbiwgaW5kaWNhdGluZyB0aGF0CisgIC8vIHRoZSBzcGFjZSBhZnRlciB0aGUgYmxvY2sgb2YgbWVtb3J5IGlzIGFsbG9jYXRlZC4gIFRoaXMgaXMgYmxvY2sgIzMuCisgIE1lbW9yeVJhbmdlSGVhZGVyICpNZW0zID0gKE1lbW9yeVJhbmdlSGVhZGVyKikoTWVtQmFzZStNZW1CbG9jay5zaXplKCkpLTE7CisgIE1lbTMtPlRoaXNBbGxvY2F0ZWQgPSAxOworICBNZW0zLT5QcmV2QWxsb2NhdGVkID0gMDsKKyAgTWVtMy0+QmxvY2tTaXplICAgICA9IHNpemVvZihNZW1vcnlSYW5nZUhlYWRlcik7CisKKyAgLy8vIEFkZCBhIHRpbnkgZnJlZSByZWdpb24gc28gdGhhdCB0aGUgZnJlZSBsaXN0IGFsd2F5cyBoYXMgb25lIGVudHJ5LgorICBGcmVlUmFuZ2VIZWFkZXIgKk1lbTIgPQorICAgIChGcmVlUmFuZ2VIZWFkZXIgKikoKChjaGFyKilNZW0zKS1GcmVlUmFuZ2VIZWFkZXI6OmdldE1pbkJsb2NrU2l6ZSgpKTsKKyAgTWVtMi0+VGhpc0FsbG9jYXRlZCA9IDA7CisgIE1lbTItPlByZXZBbGxvY2F0ZWQgPSAxOworICBNZW0yLT5CbG9ja1NpemUgICAgID0gRnJlZVJhbmdlSGVhZGVyOjpnZXRNaW5CbG9ja1NpemUoKTsKKyAgTWVtMi0+U2V0RW5kT2ZCbG9ja1NpemVNYXJrZXIoKTsKKyAgTWVtMi0+UHJldiA9IE1lbTI7ICAgLy8gTWVtMiAqaXMqIHRoZSBmcmVlIGxpc3QgZm9yIG5vdy4KKyAgTWVtMi0+TmV4dCA9IE1lbTI7CisKKyAgLy8vIEFkZCBhIHRpbnkgYWxsb2NhdGVkIHJlZ2lvbiBzbyB0aGF0IE1lbTIgaXMgbmV2ZXIgY29hbGVzY2VkIGF3YXkuCisgIE1lbW9yeVJhbmdlSGVhZGVyICpNZW0xID0gKE1lbW9yeVJhbmdlSGVhZGVyKilNZW0yLTE7CisgIE1lbTEtPlRoaXNBbGxvY2F0ZWQgPSAxOworICBNZW0xLT5QcmV2QWxsb2NhdGVkID0gMDsKKyAgTWVtMS0+QmxvY2tTaXplICAgICA9IHNpemVvZihNZW1vcnlSYW5nZUhlYWRlcik7CisKKyAgLy8gQWRkIGEgRnJlZVJhbmdlSGVhZGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYm9keSByZWdpb24sIGluZGljYXRpbmcKKyAgLy8gdGhhdCB0aGUgc3BhY2UgaXMgZnJlZS4gIE1hcmsgdGhlIHByZXZpb3VzIGJsb2NrIGFsbG9jYXRlZCBzbyB3ZSBuZXZlciBsb29rCisgIC8vIGF0IGl0LgorICBGcmVlUmFuZ2VIZWFkZXIgKk1lbTAgPSAoRnJlZVJhbmdlSGVhZGVyKilNZW1CYXNlOworICBNZW0wLT5UaGlzQWxsb2NhdGVkID0gMDsKKyAgTWVtMC0+UHJldkFsbG9jYXRlZCA9IDE7CisgIE1lbTAtPkJsb2NrU2l6ZSA9IChjaGFyKilNZW0xLShjaGFyKilNZW0wOworICBNZW0wLT5TZXRFbmRPZkJsb2NrU2l6ZU1hcmtlcigpOworICBNZW0wLT5BZGRUb0ZyZWVMaXN0KE1lbTIpOworCisgIC8vIFN0YXJ0IG91dCB3aXRoIHRoZSBmcmVlbGlzdCBwb2ludGluZyB0byBNZW0wLgorICBGcmVlTWVtb3J5TGlzdCA9IE1lbTA7CisKKyAgR09UQmFzZSA9IE5VTEw7Cit9CisKK3ZvaWQgRGVmYXVsdEpJVE1lbW9yeU1hbmFnZXI6OkFsbG9jYXRlR09UKCkgeworICBhc3NlcnQoR09UQmFzZSA9PSAwICYmICJDYW5ub3QgYWxsb2NhdGUgdGhlIGdvdCBtdWx0aXBsZSB0aW1lcyIpOworICBHT1RCYXNlID0gbmV3IHVpbnQ4X3Rbc2l6ZW9mKHZvaWQqKSAqIDgxOTJdOworICBIYXNHT1QgPSB0cnVlOworfQorCitEZWZhdWx0SklUTWVtb3J5TWFuYWdlcjo6fkRlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyKCkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ29kZVNsYWJzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgc3lzOjpNZW1vcnk6OlJlbGVhc2VSV1goQ29kZVNsYWJzW2ldKTsKKworICBkZWxldGVbXSBHT1RCYXNlOworfQorCitzeXM6Ok1lbW9yeUJsb2NrIERlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyOjphbGxvY2F0ZU5ld1NsYWIoc2l6ZV90IHNpemUpIHsKKyAgLy8gQWxsb2NhdGUgYSBuZXcgYmxvY2sgY2xvc2UgdG8gdGhlIGxhc3Qgb25lLgorICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgIHN5czo6TWVtb3J5QmxvY2sgKkxhc3RTbGFiUHRyID0gTGFzdFNsYWIuYmFzZSgpID8gJkxhc3RTbGFiIDogMDsKKyAgc3lzOjpNZW1vcnlCbG9jayBCID0gc3lzOjpNZW1vcnk6OkFsbG9jYXRlUldYKHNpemUsIExhc3RTbGFiUHRyLCAmRXJyTXNnKTsKKyAgaWYgKEIuYmFzZSgpID09IDApIHsKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkFsbG9jYXRpb24gZmFpbGVkIHdoZW4gYWxsb2NhdGluZyBuZXcgbWVtb3J5IGluIHRoZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBKSVRcbiIgKyBUd2luZShFcnJNc2cpKTsKKyAgfQorICBMYXN0U2xhYiA9IEI7CisgICsrTnVtU2xhYnM7CisgIC8vIEluaXRpYWxpemUgdGhlIHNsYWIgdG8gZ2FyYmFnZSB3aGVuIGRlYnVnZ2luZy4KKyAgaWYgKFBvaXNvbk1lbW9yeSkgeworICAgIG1lbXNldChCLmJhc2UoKSwgMHhDRCwgQi5zaXplKCkpOworICB9CisgIHJldHVybiBCOworfQorCisvLy8gQ2hlY2tJbnZhcmlhbnRzIC0gRm9yIHRlc3Rpbmcgb25seS4gIFJldHVybiAiIiBpZiBhbGwgaW50ZXJuYWwgaW52YXJpYW50cworLy8vIGFyZSBwcmVzZXJ2ZWQsIGFuZCBhIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuICBGb3IgZnJlZSBhbmQKKy8vLyBhbGxvY2F0ZWQgYmxvY2tzLCBtYWtlIHN1cmUgdGhhdCBhZGRpbmcgQmxvY2tTaXplIGdpdmVzIGEgdmFsaWQgYmxvY2suCisvLy8gRm9yIGZyZWUgYmxvY2tzLCBtYWtlIHN1cmUgdGhleSdyZSBpbiB0aGUgZnJlZSBsaXN0IGFuZCB0aGF0IHRoZWlyIGVuZCBvZgorLy8vIGJsb2NrIHNpemUgbWFya2VyIGlzIGNvcnJlY3QuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXJyb3IgYmVmb3JlCisvLy8gYWNjZXNzaW5nIGJhZCBtZW1vcnkuICBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaGVyZSBpbnN0ZWFkIG9mIGluCisvLy8gSklUTWVtb3J5TWFuYWdlclRlc3QuY3BwIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBleHBvc2UgYWxsIG9mIHRoZQorLy8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgRGVmYXVsdEpJVE1lbW9yeU1hbmFnZXIuCitib29sIERlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyOjpDaGVja0ludmFyaWFudHMoc3RkOjpzdHJpbmcgJkVycm9yU3RyKSB7CisgIHJhd19zdHJpbmdfb3N0cmVhbSBFcnIoRXJyb3JTdHIpOworCisgIC8vIENvbnN0cnVjdCBhIHRoZSBzZXQgb2YgRnJlZVJhbmdlSGVhZGVyIHBvaW50ZXJzIHNvIHdlIGNhbiBxdWVyeSBpdAorICAvLyBlZmZpY2llbnRseS4KKyAgbGx2bTo6U21hbGxQdHJTZXQ8TWVtb3J5UmFuZ2VIZWFkZXIqLCAxNj4gRnJlZUhkclNldDsKKyAgRnJlZVJhbmdlSGVhZGVyKiBGcmVlSGVhZCA9IEZyZWVNZW1vcnlMaXN0OworICBGcmVlUmFuZ2VIZWFkZXIqIEZyZWVSYW5nZSA9IEZyZWVIZWFkOworCisgIGRvIHsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBmcmVlIHJhbmdlIHBvaW50ZXIgaXMgaW4gdGhlIGJsb2NrcyB3ZSd2ZSBhbGxvY2F0ZWQuCisgICAgYm9vbCBGb3VuZCA9IGZhbHNlOworICAgIGZvciAoc3RkOjp2ZWN0b3I8c3lzOjpNZW1vcnlCbG9jaz46Oml0ZXJhdG9yIEkgPSBDb2RlU2xhYnMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBDb2RlU2xhYnMuZW5kKCk7IEkgIT0gRSAmJiAhRm91bmQ7ICsrSSkgeworICAgICAgY2hhciAqU3RhcnQgPSAoY2hhciopSS0+YmFzZSgpOworICAgICAgY2hhciAqRW5kID0gU3RhcnQgKyBJLT5zaXplKCk7CisgICAgICBGb3VuZCA9IChTdGFydCA8PSAoY2hhciopRnJlZVJhbmdlICYmIChjaGFyKilGcmVlUmFuZ2UgPCBFbmQpOworICAgIH0KKyAgICBpZiAoIUZvdW5kKSB7CisgICAgICBFcnIgPDwgIkNvcnJ1cHQgZnJlZSBsaXN0OyBwb2ludHMgdG8gIiA8PCBGcmVlUmFuZ2U7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKEZyZWVSYW5nZS0+TmV4dC0+UHJldiAhPSBGcmVlUmFuZ2UpIHsKKyAgICAgIEVyciA8PCAiTmV4dCBhbmQgUHJldiBwb2ludGVycyBkbyBub3QgbWF0Y2guIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGFkZCBpdCB0byB0aGUgc2V0LgorICAgIEZyZWVIZHJTZXQuaW5zZXJ0KEZyZWVSYW5nZSk7CisgICAgRnJlZVJhbmdlID0gRnJlZVJhbmdlLT5OZXh0OworICB9IHdoaWxlIChGcmVlUmFuZ2UgIT0gRnJlZUhlYWQpOworCisgIC8vIEdvIG92ZXIgZWFjaCBibG9jaywgYW5kIGxvb2sgYXQgZWFjaCBNZW1vcnlSYW5nZUhlYWRlci4KKyAgZm9yIChzdGQ6OnZlY3RvcjxzeXM6Ok1lbW9yeUJsb2NrPjo6aXRlcmF0b3IgSSA9IENvZGVTbGFicy5iZWdpbigpLAorICAgICAgIEUgPSBDb2RlU2xhYnMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY2hhciAqU3RhcnQgPSAoY2hhciopSS0+YmFzZSgpOworICAgIGNoYXIgKkVuZCA9IFN0YXJ0ICsgSS0+c2l6ZSgpOworCisgICAgLy8gQ2hlY2sgZWFjaCBtZW1vcnkgcmFuZ2UuCisgICAgZm9yIChNZW1vcnlSYW5nZUhlYWRlciAqSGRyID0gKE1lbW9yeVJhbmdlSGVhZGVyKilTdGFydCwgKkxhc3RIZHIgPSBOVUxMOworICAgICAgICAgU3RhcnQgPD0gKGNoYXIqKUhkciAmJiAoY2hhciopSGRyIDwgRW5kOworICAgICAgICAgSGRyID0gJkhkci0+Z2V0QmxvY2tBZnRlcigpKSB7CisgICAgICBpZiAoSGRyLT5UaGlzQWxsb2NhdGVkID09IDApIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGlzIHJhbmdlIGlzIGluIHRoZSBmcmVlIGxpc3QuCisgICAgICAgIGlmICghRnJlZUhkclNldC5jb3VudChIZHIpKSB7CisgICAgICAgICAgRXJyIDw8ICJGb3VuZCBmcmVlIGhlYWRlciBhdCAiIDw8IEhkciA8PCAiIHRoYXQgaXMgbm90IGluIGZyZWUgbGlzdC4iOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyBtYWtlIHN1cmUgdGhlIHNpemUgbWFya2VyIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrIGlzIGNvcnJlY3QuCisgICAgICAgIHVpbnRwdHJfdCAqTWFya2VyID0gKCh1aW50cHRyX3QqKSZIZHItPmdldEJsb2NrQWZ0ZXIoKSkgLSAxOworICAgICAgICBpZiAoIShTdGFydCA8PSAoY2hhciopTWFya2VyICYmIChjaGFyKilNYXJrZXIgPCBFbmQpKSB7CisgICAgICAgICAgRXJyIDw8ICJCbG9jayBzaXplIGluIGhlYWRlciBwb2ludHMgb3V0IG9mIGN1cnJlbnQgTWVtb3J5QmxvY2suIjsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhkci0+QmxvY2tTaXplICE9ICpNYXJrZXIpIHsKKyAgICAgICAgICBFcnIgPDwgIkVuZCBvZiBibG9jayBzaXplIG1hcmtlciAoIiA8PCAqTWFya2VyIDw8ICIpICIKKyAgICAgICAgICAgICAgPDwgImFuZCBCbG9ja1NpemUgKCIgPDwgSGRyLT5CbG9ja1NpemUgPDwgIikgZG9uJ3QgbWF0Y2guIjsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKExhc3RIZHIgJiYgTGFzdEhkci0+VGhpc0FsbG9jYXRlZCAhPSBIZHItPlByZXZBbGxvY2F0ZWQpIHsKKyAgICAgICAgRXJyIDw8ICJIZHItPlByZXZBbGxvY2F0ZWQgKCIgPDwgSGRyLT5QcmV2QWxsb2NhdGVkIDw8ICIpICE9ICIKKyAgICAgICAgICAgIDw8ICJMYXN0SGRyLT5UaGlzQWxsb2NhdGVkICgiIDw8IExhc3RIZHItPlRoaXNBbGxvY2F0ZWQgPDwgIikiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKCFMYXN0SGRyICYmICFIZHItPlByZXZBbGxvY2F0ZWQpIHsKKyAgICAgICAgRXJyIDw8ICJUaGUgZmlyc3QgaGVhZGVyIHNob3VsZCBoYXZlIFByZXZBbGxvY2F0ZWQgdHJ1ZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8vIFJlbWVtYmVyIHRoZSBsYXN0IGhlYWRlci4KKyAgICAgIExhc3RIZHIgPSBIZHI7CisgICAgfQorICB9CisKKyAgLy8gQWxsIGludmFyaWFudHMgYXJlIHByZXNlcnZlZC4KKyAgcmV0dXJuIHRydWU7Cit9CisKK0pJVE1lbW9yeU1hbmFnZXIgKkpJVE1lbW9yeU1hbmFnZXI6OkNyZWF0ZURlZmF1bHRNZW1NYW5hZ2VyKCkgeworICByZXR1cm4gbmV3IERlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyKCk7Cit9CisKKy8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgY29kZSBpbiA1MTJLIHNsYWJzLgorY29uc3Qgc2l6ZV90IERlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyOjpEZWZhdWx0Q29kZVNsYWJTaXplID0gNTEyICogMTAyNDsKKworLy8gQWxsb2NhdGUgZ2xvYmFscyBhbmQgc3R1YnMgaW4gc2xhYnMgb2YgNjRLLiAgKHByb2JhYmx5IDE2IHBhZ2VzKQorY29uc3Qgc2l6ZV90IERlZmF1bHRKSVRNZW1vcnlNYW5hZ2VyOjpEZWZhdWx0U2xhYlNpemUgPSA2NCAqIDEwMjQ7CisKKy8vIFdhc3RlIGF0IG1vc3QgMTZLIGF0IHRoZSBlbmQgb2YgZWFjaCBidW1wIHNsYWIuICAocHJvYmFibHkgNCBwYWdlcykKK2NvbnN0IHNpemVfdCBEZWZhdWx0SklUTWVtb3J5TWFuYWdlcjo6RGVmYXVsdFNpemVUaHJlc2hvbGQgPSAxNiAqIDEwMjQ7CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZmEzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9NYWtlZmlsZQpAQCAtMCwwICsxLDM4IEBACisjIz09PS0gbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1KSVQKKworIyBHZXQgdGhlICQoQVJDSCkgc2V0dGluZworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKKworIyBFbmFibGUgdGhlIFg4NiBKSVQgaWYgY29tcGlsaW5nIG9uIFg4NgoraWZlcSAoJChBUkNIKSwgeDg2KQorICBFTkFCTEVfWDg2X0pJVCA9IDEKK2VuZGlmCisKKyMgVGhpcyBmbGFnIGNhbiBhbHNvIGJlIHVzZWQgb24gdGhlIGNvbW1hbmQgbGluZSB0byBmb3JjZSBpbmNsdXNpb24KKyMgb2YgdGhlIFg4NiBKSVQgb24gbm9uLVg4NiBob3N0cworaWZkZWYgRU5BQkxFX1g4Nl9KSVQKKyAgQ1BQRkxBR1MgKz0gLURFTkFCTEVfWDg2X0pJVAorZW5kaWYKKworIyBFbmFibGUgdGhlIFNwYXJjIEpJVCBpZiBjb21waWxpbmcgb24gU3BhcmMKK2lmZXEgKCQoQVJDSCksIFNwYXJjKQorICBFTkFCTEVfU1BBUkNfSklUID0gMQorZW5kaWYKKworIyBUaGlzIGZsYWcgY2FuIGFsc28gYmUgdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIGZvcmNlIGluY2x1c2lvbgorIyBvZiB0aGUgU3BhcmMgSklUIG9uIG5vbi1TcGFyYyBob3N0cworaWZkZWYgRU5BQkxFX1NQQVJDX0pJVAorICBDUFBGTEFHUyArPSAtREVOQUJMRV9TUEFSQ19KSVQKK2VuZGlmCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9PUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIuY3BwIGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2EwODRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLy89PT0tLSBPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIuY3BwIC0gVGVsbCBPUHJvZmlsZSBhYm91dCBKSVR0ZWQgY29kZSAtLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIEpJVEV2ZW50TGlzdGVuZXIgb2JqZWN0IHRoYXQgY2FsbHMgaW50byBPUHJvZmlsZSB0byB0ZWxsCisvLyBpdCBhYm91dCBKSVR0ZWQgZnVuY3Rpb25zLiAgRm9yIG5vdywgd2Ugb25seSByZWNvcmQgZnVuY3Rpb24gbmFtZXMgYW5kIHNpemVzLAorLy8gYnV0IGV2ZW50dWFsbHkgd2UnbGwgYWxzbyByZWNvcmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCisvLworLy8gU2VlIGh0dHA6Ly9vcHJvZmlsZS5zb3VyY2Vmb3JnZS5uZXQvZG9jL2RldmVsL2ppdC1pbnRlcmZhY2UuaHRtbCBmb3IgdGhlCisvLyBkZWZpbml0aW9uIG9mIHRoZSBpbnRlcmZhY2Ugd2UncmUgdXNpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJvcHJvZmlsZS1qaXQtZXZlbnQtbGlzdGVuZXIiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRGVidWdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVEV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9FcnJuby5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGRlZi5oPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKyNpZiBVU0VfT1BST0ZJTEUKKworI2luY2x1ZGUgPG9wYWdlbnQuaD4KKworbmFtZXNwYWNlIHsKKworY2xhc3MgT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyIDogcHVibGljIEpJVEV2ZW50TGlzdGVuZXIgeworICBvcF9hZ2VudF90IEFnZW50OworcHVibGljOgorICBPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIoKTsKKyAgfk9Qcm9maWxlSklURXZlbnRMaXN0ZW5lcigpOworCisgIHZpcnR1YWwgdm9pZCBOb3RpZnlGdW5jdGlvbkVtaXR0ZWQoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqRm5TdGFydCwgc2l6ZV90IEZuU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbWl0dGVkRnVuY3Rpb25EZXRhaWxzICZEZXRhaWxzKTsKKyAgdmlydHVhbCB2b2lkIE5vdGlmeUZyZWVpbmdNYWNoaW5lQ29kZSh2b2lkICpPbGRQdHIpOworfTsKKworT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyOjpPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIoKQorICAgIDogQWdlbnQob3Bfb3Blbl9hZ2VudCgpKSB7CisgIGlmIChBZ2VudCA9PSBOVUxMKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXJyX3N0ciA9IHN5czo6U3RyRXJyb3IoKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkZhaWxlZCB0byBjb25uZWN0IHRvIE9Qcm9maWxlIGFnZW50OiAiIDw8IGVycl9zdHIgPDwgIlxuIik7CisgIH0gZWxzZSB7CisgICAgREVCVUcoZGJncygpIDw8ICJDb25uZWN0ZWQgdG8gT1Byb2ZpbGUgYWdlbnQuXG4iKTsKKyAgfQorfQorCitPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXI6On5PUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIoKSB7CisgIGlmIChBZ2VudCAhPSBOVUxMKSB7CisgICAgaWYgKG9wX2Nsb3NlX2FnZW50KEFnZW50KSA9PSAtMSkgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXJyX3N0ciA9IHN5czo6U3RyRXJyb3IoKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRmFpbGVkIHRvIGRpc2Nvbm5lY3QgZnJvbSBPUHJvZmlsZSBhZ2VudDogIgorICAgICAgICAgICAgICAgICAgIDw8IGVycl9zdHIgPDwgIlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRGlzY29ubmVjdGVkIGZyb20gT1Byb2ZpbGUgYWdlbnQuXG4iKTsKKyAgICB9CisgIH0KK30KKworY2xhc3MgRmlsZW5hbWVDYWNoZSB7CisgIC8vIEhvbGRzIHRoZSBmaWxlbmFtZSBvZiBlYWNoIFNjb3BlLCBzbyB0aGF0IHdlIGNhbiBwYXNzIGEgbnVsbC10ZXJtaW5hdGVkCisgIC8vIHN0cmluZyBpbnRvIG9wcm9maWxlLiAgVXNlIGFuIEFzc2VydGluZ1ZIIHJhdGhlciB0aGFuIGEgVmFsdWVNYXAgYmVjYXVzZSB3ZQorICAvLyBzaG91bGRuJ3QgYmUgbW9kaWZ5aW5nIGFueSBNRE5vZGVzIHdoaWxlIHRoaXMgbWFwIGlzIGFsaXZlLgorICBEZW5zZU1hcDxBc3NlcnRpbmdWSDxNRE5vZGU+LCBzdGQ6OnN0cmluZz4gRmlsZW5hbWVzOworCisgcHVibGljOgorICBjb25zdCBjaGFyICpnZXRGaWxlbmFtZShNRE5vZGUgKlNjb3BlKSB7CisgICAgc3RkOjpzdHJpbmcgJkZpbGVuYW1lID0gRmlsZW5hbWVzW1Njb3BlXTsKKyAgICBpZiAoRmlsZW5hbWUuZW1wdHkoKSkgeworICAgICAgRmlsZW5hbWUgPSBESVNjb3BlKFNjb3BlKS5nZXRGaWxlbmFtZSgpOworICAgIH0KKyAgICByZXR1cm4gRmlsZW5hbWUuY19zdHIoKTsKKyAgfQorfTsKKworc3RhdGljIGRlYnVnX2xpbmVfaW5mbyBMaW5lU3RhcnRUb09Qcm9maWxlRm9ybWF0KAorICAgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIEZpbGVuYW1lQ2FjaGUgJkZpbGVuYW1lcywKKyAgICB1aW50cHRyX3QgQWRkcmVzcywgRGVidWdMb2MgTG9jKSB7CisgIGRlYnVnX2xpbmVfaW5mbyBSZXN1bHQ7CisgIFJlc3VsdC52bWEgPSBBZGRyZXNzOworICBSZXN1bHQubGluZW5vID0gTG9jLmdldExpbmUoKTsKKyAgUmVzdWx0LmZpbGVuYW1lID0gRmlsZW5hbWVzLmdldEZpbGVuYW1lKAorICAgIExvYy5nZXRTY29wZShNRi5nZXRGdW5jdGlvbigpLT5nZXRDb250ZXh0KCkpKTsKKyAgREVCVUcoZGJncygpIDw8ICJNYXBwaW5nICIgPDwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oUmVzdWx0LnZtYSkgPDwgIiB0byAiCisgICAgICAgICAgICAgICA8PCBSZXN1bHQuZmlsZW5hbWUgPDwgIjoiIDw8IFJlc3VsdC5saW5lbm8gPDwgIlxuIik7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vIEFkZHMgdGhlIGp1c3QtZW1pdHRlZCBmdW5jdGlvbiB0byB0aGUgc3ltYm9sIHRhYmxlLgordm9pZCBPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXI6Ok5vdGlmeUZ1bmN0aW9uRW1pdHRlZCgKKyAgICBjb25zdCBGdW5jdGlvbiAmRiwgdm9pZCAqRm5TdGFydCwgc2l6ZV90IEZuU2l6ZSwKKyAgICBjb25zdCBFbWl0dGVkRnVuY3Rpb25EZXRhaWxzICZEZXRhaWxzKSB7CisgIGFzc2VydChGLmhhc05hbWUoKSAmJiBGblN0YXJ0ICE9IDAgJiYgIkJhZCBzeW1ib2wgdG8gYWRkIik7CisgIGlmIChvcF93cml0ZV9uYXRpdmVfY29kZShBZ2VudCwgRi5nZXROYW1lKCkuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdD4oRm5TdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGblN0YXJ0LCBGblNpemUpID09IC0xKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJGYWlsZWQgdG8gdGVsbCBPUHJvZmlsZSBhYm91dCBuYXRpdmUgZnVuY3Rpb24gIiAKKyAgICAgICAgICA8PCBGLmdldE5hbWUoKSA8PCAiIGF0IFsiIAorICAgICAgICAgIDw8IEZuU3RhcnQgPDwgIi0iIDw8ICgoY2hhciopRm5TdGFydCArIEZuU2l6ZSkgPDwgIl1cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghRGV0YWlscy5MaW5lU3RhcnRzLmVtcHR5KCkpIHsKKyAgICAvLyBOb3cgd2UgY29udmVydCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgYWRkcmVzcy9EZWJ1Z0xvYworICAgIC8vIGZvcm1hdCBpbiBEZXRhaWxzIHRvIHRoZSBhZGRyZXNzL2ZpbGVuYW1lL2xpbmVubyBmb3JtYXQgdGhhdCBPUHJvZmlsZQorICAgIC8vIGV4cGVjdHMuICBOb3RlIHRoYXQgT1Byb2ZpbGUgMC45LjQgaGFzIGEgYnVnIHRoYXQgY2F1c2VzIGl0IHRvIGlnbm9yZQorICAgIC8vIGxpbmUgbnVtYmVycyBmb3IgYWRkcmVzc2VzIGFib3ZlIDRHLgorICAgIEZpbGVuYW1lQ2FjaGUgRmlsZW5hbWVzOworICAgIHN0ZDo6dmVjdG9yPGRlYnVnX2xpbmVfaW5mbz4gTGluZUluZm87CisgICAgTGluZUluZm8ucmVzZXJ2ZSgxICsgRGV0YWlscy5MaW5lU3RhcnRzLnNpemUoKSk7CisKKyAgICBEZWJ1Z0xvYyBGaXJzdExvYyA9IERldGFpbHMuTGluZVN0YXJ0c1swXS5Mb2M7CisgICAgYXNzZXJ0KCFGaXJzdExvYy5pc1Vua25vd24oKQorICAgICAgICAgICAmJiAiTGluZVN0YXJ0cyBzaG91bGQgbm90IGNvbnRhaW4gdW5rbm93biBEZWJ1Z0xvY3MiKTsKKyAgICBNRE5vZGUgKkZpcnN0TG9jU2NvcGUgPSBGaXJzdExvYy5nZXRTY29wZShGLmdldENvbnRleHQoKSk7CisgICAgRElTdWJwcm9ncmFtIEZ1bmN0aW9uREkgPSBnZXRESVN1YnByb2dyYW0oRmlyc3RMb2NTY29wZSk7CisgICAgaWYgKEZ1bmN0aW9uREkuVmVyaWZ5KCkpIHsKKyAgICAgIC8vIElmIHdlIGhhdmUgZGVidWcgaW5mbyBmb3IgdGhlIGZ1bmN0aW9uIGl0c2VsZiwgdXNlIHRoYXQgYXMgdGhlIGxpbmUKKyAgICAgIC8vIG51bWJlciBvZiB0aGUgZmlyc3Qgc2V2ZXJhbCBpbnN0cnVjdGlvbnMuICBPdGhlcndpc2UsIGFmdGVyIGZpbGxpbmcKKyAgICAgIC8vIExpbmVJbmZvLCB3ZSdsbCBhZGp1c3QgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGxpbmUgbnVtYmVyIHRvIHBvaW50IGF0CisgICAgICAvLyB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLgorICAgICAgZGVidWdfbGluZV9pbmZvIGxpbmVfaW5mbzsKKyAgICAgIGxpbmVfaW5mby52bWEgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oRm5TdGFydCk7CisgICAgICBsaW5lX2luZm8ubGluZW5vID0gRnVuY3Rpb25ESS5nZXRMaW5lTnVtYmVyKCk7CisgICAgICBsaW5lX2luZm8uZmlsZW5hbWUgPSBGaWxlbmFtZXMuZ2V0RmlsZW5hbWUoRmlyc3RMb2NTY29wZSk7CisgICAgICBMaW5lSW5mby5wdXNoX2JhY2sobGluZV9pbmZvKTsKKyAgICB9CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPEVtaXR0ZWRGdW5jdGlvbkRldGFpbHM6OkxpbmVTdGFydD46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgIEkgPSBEZXRhaWxzLkxpbmVTdGFydHMuYmVnaW4oKSwgRSA9IERldGFpbHMuTGluZVN0YXJ0cy5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBMaW5lSW5mby5wdXNoX2JhY2soTGluZVN0YXJ0VG9PUHJvZmlsZUZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpEZXRhaWxzLk1GLCBGaWxlbmFtZXMsIEktPkFkZHJlc3MsIEktPkxvYykpOworICAgIH0KKworICAgIC8vIEluIGNhc2UgdGhlIGZ1bmN0aW9uIGRpZG4ndCBoYXZlIGxpbmUgaW5mbyBvZiBpdHMgb3duLCBhZGp1c3QgdGhlIGZpcnN0CisgICAgLy8gbGluZSBpbmZvJ3MgYWRkcmVzcyB0byBpbmNsdWRlIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uCisgICAgTGluZUluZm9bMF0udm1hID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KEZuU3RhcnQpOworCisgICAgaWYgKG9wX3dyaXRlX2RlYnVnX2xpbmVfaW5mbyhBZ2VudCwgRm5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVJbmZvLnNpemUoKSwgJipMaW5lSW5mby5iZWdpbigpKSA9PSAtMSkgeworICAgICAgREVCVUcoZGJncygpIAorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byB0ZWxsIE9Qcm9maWxlIGFib3V0IGxpbmUgbnVtYmVycyBmb3IgbmF0aXZlIGZ1bmN0aW9uICIKKyAgICAgICAgICAgIDw8IEYuZ2V0TmFtZSgpIDw8ICIgYXQgWyIgCisgICAgICAgICAgICA8PCBGblN0YXJ0IDw8ICItIiA8PCAoKGNoYXIqKUZuU3RhcnQgKyBGblNpemUpIDw8ICJdXG4iKTsKKyAgICB9CisgIH0KK30KKworLy8gUmVtb3ZlcyB0aGUgYmVpbmctZGVsZXRlZCBmdW5jdGlvbiBmcm9tIHRoZSBzeW1ib2wgdGFibGUuCit2b2lkIE9Qcm9maWxlSklURXZlbnRMaXN0ZW5lcjo6Tm90aWZ5RnJlZWluZ01hY2hpbmVDb2RlKHZvaWQgKkZuU3RhcnQpIHsKKyAgYXNzZXJ0KEZuU3RhcnQgJiYgIkludmFsaWQgZnVuY3Rpb24gcG9pbnRlciIpOworICBpZiAob3BfdW5sb2FkX25hdGl2ZV9jb2RlKEFnZW50LCByZWludGVycHJldF9jYXN0PHVpbnQ2NF90PihGblN0YXJ0KSkgPT0gLTEpIHsKKyAgICBERUJVRyhkYmdzKCkKKyAgICAgICAgICA8PCAiRmFpbGVkIHRvIHRlbGwgT1Byb2ZpbGUgYWJvdXQgdW5sb2FkIG9mIG5hdGl2ZSBmdW5jdGlvbiBhdCAiCisgICAgICAgICAgPDwgRm5TdGFydCA8PCAiXG4iKTsKKyAgfQorfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlLgorCituYW1lc3BhY2UgbGx2bSB7CitKSVRFdmVudExpc3RlbmVyICpjcmVhdGVPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIoKSB7CisgIHJldHVybiBuZXcgT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyOworfQorfQorCisjZWxzZSAgLy8gVVNFX09QUk9GSUxFCisKK25hbWVzcGFjZSBsbHZtIHsKKy8vIEJ5IGRlZmluaW5nIHRoaXMgdG8gcmV0dXJuIE5VTEwsIHdlIGNhbiBsZXQgY2xpZW50cyBjYWxsIGl0IHVuY29uZGl0aW9uYWxseSwKKy8vIGV2ZW4gaWYgdGhleSBoYXZlbid0IGNvbmZpZ3VyZWQgd2l0aCB0aGUgT1Byb2ZpbGUgbGlicmFyaWVzLgorSklURXZlbnRMaXN0ZW5lciAqY3JlYXRlT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyKCkgeworICByZXR1cm4gTlVMTDsKK30KK30gIC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAgLy8gVVNFX09QUk9GSUxFCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9UYXJnZXRTZWxlY3QuY3BwIGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvVGFyZ2V0U2VsZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzQ5YzMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvVGFyZ2V0U2VsZWN0LmNwcApAQCAtMCwwICsxLDkxIEBACisvLz09PS0tIFRhcmdldFNlbGVjdC5jcHAgLSBUYXJnZXQgQ2hvb3NlciBDb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMganVzdCBhc2tzIHRoZSBUYXJnZXRSZWdpc3RyeSBmb3IgdGhlIGFwcHJvcHJpYXRlIEpJVCB0byB1c2UsIGFuZCBhbGxvd3MKKy8vIHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBzcGVjaWZpYyBvbmUgb24gdGhlIGNvbW1hbmRsaW5lIHdpdGggLW1hcmNoPXguIENsaWVudHMKKy8vIHNob3VsZCBpbml0aWFsaXplIHRhcmdldHMgcHJpb3IgdG8gY2FsbGluZyBjcmVhdGVKSVQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkpJVC5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vSG9zdC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1N1YnRhcmdldEZlYXR1cmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gc2VsZWN0VGFyZ2V0IC0gUGljayBhIHRhcmdldCBlaXRoZXIgdmlhIC1tYXJjaCBvciBieSBndWVzc2luZyB0aGUgbmF0aXZlCisvLy8gYXJjaC4gIEFkZCBhbnkgQ1BVIGZlYXR1cmVzIHNwZWNpZmllZCB2aWEgLW1jcHUgb3IgLW1hdHRyLgorVGFyZ2V0TWFjaGluZSAqSklUOjpzZWxlY3RUYXJnZXQoTW9kdWxlICpNb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTUFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTUNQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnN0cmluZz4mIE1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJvclN0cikgeworICBUcmlwbGUgVGhlVHJpcGxlKE1vZC0+Z2V0VGFyZ2V0VHJpcGxlKCkpOworICBpZiAoVGhlVHJpcGxlLmdldFRyaXBsZSgpLmVtcHR5KCkpCisgICAgVGhlVHJpcGxlLnNldFRyaXBsZShzeXM6OmdldEhvc3RUcmlwbGUoKSk7CisKKyAgLy8gQWRqdXN0IHRoZSB0cmlwbGUgdG8gbWF0Y2ggd2hhdCB0aGUgdXNlciByZXF1ZXN0ZWQuCisgIGNvbnN0IFRhcmdldCAqVGhlVGFyZ2V0ID0gMDsKKyAgaWYgKCFNQXJjaC5lbXB0eSgpKSB7CisgICAgZm9yIChUYXJnZXRSZWdpc3RyeTo6aXRlcmF0b3IgaXQgPSBUYXJnZXRSZWdpc3RyeTo6YmVnaW4oKSwKKyAgICAgICAgICAgaWUgPSBUYXJnZXRSZWdpc3RyeTo6ZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgICBpZiAoTUFyY2ggPT0gaXQtPmdldE5hbWUoKSkgeworICAgICAgICBUaGVUYXJnZXQgPSAmKml0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIVRoZVRhcmdldCkgeworICAgICAgKkVycm9yU3RyID0gIk5vIGF2YWlsYWJsZSB0YXJnZXRzIGFyZSBjb21wYXRpYmxlIHdpdGggdGhpcyAtbWFyY2gsICIKKyAgICAgICAgInNlZSAtdmVyc2lvbiBmb3IgdGhlIGF2YWlsYWJsZSB0YXJnZXRzLlxuIjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEFkanVzdCB0aGUgdHJpcGxlIHRvIG1hdGNoIChpZiBrbm93biksIG90aGVyd2lzZSBzdGljayB3aXRoIHRoZQorICAgIC8vIG1vZHVsZS9ob3N0IHRyaXBsZS4KKyAgICBUcmlwbGU6OkFyY2hUeXBlIFR5cGUgPSBUcmlwbGU6OmdldEFyY2hUeXBlRm9yTExWTU5hbWUoTUFyY2gpOworICAgIGlmIChUeXBlICE9IFRyaXBsZTo6VW5rbm93bkFyY2gpCisgICAgICBUaGVUcmlwbGUuc2V0QXJjaChUeXBlKTsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnN0cmluZyBFcnJvcjsKKyAgICBUaGVUYXJnZXQgPSBUYXJnZXRSZWdpc3RyeTo6bG9va3VwVGFyZ2V0KFRoZVRyaXBsZS5nZXRUcmlwbGUoKSwgRXJyb3IpOworICAgIGlmIChUaGVUYXJnZXQgPT0gMCkgeworICAgICAgaWYgKEVycm9yU3RyKQorICAgICAgICAqRXJyb3JTdHIgPSBFcnJvcjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmICghVGhlVGFyZ2V0LT5oYXNKSVQoKSkgeworICAgIGVycnMoKSA8PCAiV0FSTklORzogVGhpcyB0YXJnZXQgSklUIGlzIG5vdCBkZXNpZ25lZCBmb3IgdGhlIGhvc3QgeW91IGFyZSIKKyAgICAgICAgICAgPDwgIiBydW5uaW5nLiAgSWYgYmFkIHRoaW5ncyBoYXBwZW4sIHBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgIgorICAgICAgICAgICA8PCAiLW1hcmNoIHN3aXRjaC5cbiI7CisgIH0KKworICAvLyBQYWNrYWdlIHVwIGZlYXR1cmVzIHRvIGJlIHBhc3NlZCB0byB0YXJnZXQvc3VidGFyZ2V0CisgIHN0ZDo6c3RyaW5nIEZlYXR1cmVzU3RyOworICBpZiAoIU1DUFUuZW1wdHkoKSB8fCAhTUF0dHJzLmVtcHR5KCkpIHsKKyAgICBTdWJ0YXJnZXRGZWF0dXJlcyBGZWF0dXJlczsKKyAgICBGZWF0dXJlcy5zZXRDUFUoTUNQVSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNQXR0cnMuc2l6ZSgpOyArK2kpCisgICAgICBGZWF0dXJlcy5BZGRGZWF0dXJlKE1BdHRyc1tpXSk7CisgICAgRmVhdHVyZXNTdHIgPSBGZWF0dXJlcy5nZXRTdHJpbmcoKTsKKyAgfQorCisgIC8vIEFsbG9jYXRlIGEgdGFyZ2V0Li4uCisgIFRhcmdldE1hY2hpbmUgKlRhcmdldCA9IAorICAgIFRoZVRhcmdldC0+Y3JlYXRlVGFyZ2V0TWFjaGluZShUaGVUcmlwbGUuZ2V0VHJpcGxlKCksIEZlYXR1cmVzU3RyKTsKKyAgYXNzZXJ0KFRhcmdldCAmJiAiQ291bGQgbm90IGFsbG9jYXRlIHRhcmdldCBtYWNoaW5lISIpOworICByZXR1cm4gVGFyZ2V0OworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0V4ZWN1dGlvbkVuZ2luZS9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlMDUwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9FeGVjdXRpb25FbmdpbmUvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIyM9PT0tIGxpYi9FeGVjdXRpb25FbmdpbmUvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUV4ZWN1dGlvbkVuZ2luZQorUEFSQUxMRUxfRElSUyA9IEludGVycHJldGVyIEpJVAorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0xpbmtlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9MaW5rZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2ZDJmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9MaW5rZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1MaW5rZXIKKyAgTGlua0FyY2hpdmVzLmNwcAorICBMaW5rSXRlbXMuY3BwCisgIExpbmtNb2R1bGVzLmNwcAorICBMaW5rZXIuY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9MaW5rZXIvTGlua0FyY2hpdmVzLmNwcCBiL3NyYy9MTFZNL2xpYi9MaW5rZXIvTGlua0FyY2hpdmVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzRlZDdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0xpbmtlci9MaW5rQXJjaGl2ZXMuY3BwCkBAIC0wLDAgKzEsMTk4IEBACisvLz09PS0gbGliL0xpbmtlci9MaW5rQXJjaGl2ZXMuY3BwIC0gTGluayBMTFZNIG9iamVjdHMgYW5kIGxpYnJhcmllcyAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byBoYW5kbGUgbGlua2luZyB0b2dldGhlciBMTFZNIGJpdGNvZGUgZmlsZXMsCisvLyBhbmQgdG8gaGFuZGxlIGFubm95aW5nIHRoaW5ncyBsaWtlIHN0YXRpYyBsaWJyYXJpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTGlua2VyLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRPcGVyYXRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0FyY2hpdmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBHZXRBbGxVbmRlZmluZWRTeW1ib2xzIC0gY2FsY3VsYXRlcyB0aGUgc2V0IG9mIHVuZGVmaW5lZCBzeW1ib2xzIHRoYXQgc3RpbGwKKy8vLyBleGlzdCBpbiBhbiBMTFZNIG1vZHVsZS4gVGhpcyBpcyBhIGJpdCB0cmlja3kgYmVjYXVzZSB0aGVyZSBtYXkgYmUgdHdvCisvLy8gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCBMTFZNIHR5cGVzIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB0bworLy8vIGVhY2ggb3RoZXIgYnV0IGFyZW4ndCBjdXJyZW50bHkgKHRodXMgd2UgbmVlZCB0byB0cmVhdCBpdCBhcyByZXNvbHZlZCkuCisvLy8KKy8vLyBJbnB1dHM6CisvLy8gIE0gLSBUaGUgbW9kdWxlIGluIHdoaWNoIHRvIGZpbmQgdW5kZWZpbmVkIHN5bWJvbHMuCisvLy8KKy8vLyBPdXRwdXRzOgorLy8vICBVbmRlZmluZWRTeW1ib2xzIC0gQSBzZXQgb2YgQysrIHN0cmluZ3MgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhbGwKKy8vLyAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCBzeW1ib2xzLgorLy8vCitzdGF0aWMgdm9pZAorR2V0QWxsVW5kZWZpbmVkU3ltYm9scyhNb2R1bGUgKk0sIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiAmVW5kZWZpbmVkU3ltYm9scykgeworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gRGVmaW5lZFN5bWJvbHM7CisgIFVuZGVmaW5lZFN5bWJvbHMuY2xlYXIoKTsKKworICAvLyBJZiB0aGUgcHJvZ3JhbSBkb2Vzbid0IGRlZmluZSBhIG1haW4sIHRyeSBwdWxsaW5nIG9uZSBpbiBmcm9tIGEgLmEgZmlsZS4KKyAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHByb2dyYW1zIHdoZXJlIHRoZSBtYWluIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gYW4KKyAgLy8gYXJjaGl2ZSwgc3VjaCBmMmMnZCBwcm9ncmFtcy4KKyAgRnVuY3Rpb24gKk1haW4gPSBNLT5nZXRGdW5jdGlvbigibWFpbiIpOworICBpZiAoTWFpbiA9PSAwIHx8IE1haW4tPmlzRGVjbGFyYXRpb24oKSkKKyAgICBVbmRlZmluZWRTeW1ib2xzLmluc2VydCgibWFpbiIpOworCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS0+YmVnaW4oKSwgRSA9IE0tPmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoSS0+aGFzTmFtZSgpKSB7CisgICAgICBpZiAoSS0+aXNEZWNsYXJhdGlvbigpKQorICAgICAgICBVbmRlZmluZWRTeW1ib2xzLmluc2VydChJLT5nZXROYW1lKCkpOworICAgICAgZWxzZSBpZiAoIUktPmhhc0xvY2FsTGlua2FnZSgpKSB7CisgICAgICAgIGFzc2VydCghSS0+aGFzRExMSW1wb3J0TGlua2FnZSgpCisgICAgICAgICAgICAgICAmJiAiRm91bmQgZGxsaW1wb3J0ZWQgbm9uLWV4dGVybmFsIHN5bWJvbCEiKTsKKyAgICAgICAgRGVmaW5lZFN5bWJvbHMuaW5zZXJ0KEktPmdldE5hbWUoKSk7CisgICAgICB9ICAgICAgCisgICAgfQorCisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0tPmdsb2JhbF9iZWdpbigpLCBFID0gTS0+Z2xvYmFsX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmIChJLT5oYXNOYW1lKCkpIHsKKyAgICAgIGlmIChJLT5pc0RlY2xhcmF0aW9uKCkpCisgICAgICAgIFVuZGVmaW5lZFN5bWJvbHMuaW5zZXJ0KEktPmdldE5hbWUoKSk7CisgICAgICBlbHNlIGlmICghSS0+aGFzTG9jYWxMaW5rYWdlKCkpIHsKKyAgICAgICAgYXNzZXJ0KCFJLT5oYXNETExJbXBvcnRMaW5rYWdlKCkKKyAgICAgICAgICAgICAgICYmICJGb3VuZCBkbGxpbXBvcnRlZCBub24tZXh0ZXJuYWwgc3ltYm9sISIpOworICAgICAgICBEZWZpbmVkU3ltYm9scy5pbnNlcnQoSS0+Z2V0TmFtZSgpKTsKKyAgICAgIH0gICAgICAKKyAgICB9CisKKyAgZm9yIChNb2R1bGU6OmFsaWFzX2l0ZXJhdG9yIEkgPSBNLT5hbGlhc19iZWdpbigpLCBFID0gTS0+YWxpYXNfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgaWYgKEktPmhhc05hbWUoKSkKKyAgICAgIERlZmluZWRTeW1ib2xzLmluc2VydChJLT5nZXROYW1lKCkpOworCisgIC8vIFBydW5lIG91dCBhbnkgZGVmaW5lZCBzeW1ib2xzIGZyb20gdGhlIHVuZGVmaW5lZCBzeW1ib2xzIHNldC4uLgorICBmb3IgKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgSSA9IFVuZGVmaW5lZFN5bWJvbHMuYmVnaW4oKTsKKyAgICAgICBJICE9IFVuZGVmaW5lZFN5bWJvbHMuZW5kKCk7ICkKKyAgICBpZiAoRGVmaW5lZFN5bWJvbHMuY291bnQoKkkpKQorICAgICAgVW5kZWZpbmVkU3ltYm9scy5lcmFzZShJKyspOyAgLy8gVGhpcyBzeW1ib2wgcmVhbGx5IGlzIGRlZmluZWQhCisgICAgZWxzZQorICAgICAgKytJOyAvLyBLZWVwIHRoaXMgc3ltYm9sIGluIHRoZSB1bmRlZmluZWQgc3ltYm9scyBsaXN0Cit9CisKKy8vLyBMaW5rSW5BcmNoaXZlIC0gb3BlbnMgYW4gYXJjaGl2ZSBsaWJyYXJ5IGFuZCBsaW5rIGluIGFsbCBvYmplY3RzIHdoaWNoCisvLy8gcHJvdmlkZSBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseSB1bmRlZmluZWQuCisvLy8KKy8vLyBJbnB1dHM6CisvLy8gIEZpbGVuYW1lIC0gVGhlIHBhdGhuYW1lIG9mIHRoZSBhcmNoaXZlLgorLy8vCisvLy8gUmV0dXJuIFZhbHVlOgorLy8vICBUUlVFICAtIEFuIGVycm9yIG9jY3VycmVkLgorLy8vICBGQUxTRSAtIE5vIGVycm9ycy4KK2Jvb2wKK0xpbmtlcjo6TGlua0luQXJjaGl2ZShjb25zdCBzeXM6OlBhdGggJkZpbGVuYW1lLCBib29sICZpc19uYXRpdmUpIHsKKyAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgYW4gYXJjaGl2ZSBmaWxlIHdlJ3JlIGRlYWxpbmcgd2l0aAorICBpZiAoIUZpbGVuYW1lLmlzQXJjaGl2ZSgpKQorICAgIHJldHVybiBlcnJvcigiRmlsZSAnIiArIEZpbGVuYW1lLnN0cigpICsgIicgaXMgbm90IGFuIGFyY2hpdmUuIik7CisKKyAgLy8gT3BlbiB0aGUgYXJjaGl2ZSBmaWxlCisgIHZlcmJvc2UoIkxpbmtpbmcgYXJjaGl2ZSBmaWxlICciICsgRmlsZW5hbWUuc3RyKCkgKyAiJyIpOworCisgIC8vIEZpbmQgYWxsIG9mIHRoZSBzeW1ib2xzIGN1cnJlbnRseSB1bmRlZmluZWQgaW4gdGhlIGJpdGNvZGUgcHJvZ3JhbS4KKyAgLy8gSWYgYWxsIHRoZSBzeW1ib2xzIGFyZSBkZWZpbmVkLCB0aGUgcHJvZ3JhbSBpcyBjb21wbGV0ZSwgYW5kIHRoZXJlIGlzCisgIC8vIG5vIHJlYXNvbiB0byBsaW5rIGluIGFueSBhcmNoaXZlIGZpbGVzLgorICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gVW5kZWZpbmVkU3ltYm9sczsKKyAgR2V0QWxsVW5kZWZpbmVkU3ltYm9scyhDb21wb3NpdGUsIFVuZGVmaW5lZFN5bWJvbHMpOworCisgIGlmIChVbmRlZmluZWRTeW1ib2xzLmVtcHR5KCkpIHsKKyAgICB2ZXJib3NlKCJObyBzeW1ib2xzIHVuZGVmaW5lZCwgc2tpcHBpbmcgbGlicmFyeSAnIiArIEZpbGVuYW1lLnN0cigpICsgIiciKTsKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBObyBuZWVkIHRvIGxpbmsgYW55dGhpbmcgaW4hCisgIH0KKworICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgIHN0ZDo6YXV0b19wdHI8QXJjaGl2ZT4gQXV0b0FyY2ggKAorICAgIEFyY2hpdmU6Ok9wZW5BbmRMb2FkU3ltYm9scyhGaWxlbmFtZSwgQ29udGV4dCwgJkVyck1zZykpOworCisgIEFyY2hpdmUqIGFyY2ggPSBBdXRvQXJjaC5nZXQoKTsKKworICBpZiAoIWFyY2gpCisgICAgcmV0dXJuIGVycm9yKCJDYW5ub3QgcmVhZCBhcmNoaXZlICciICsgRmlsZW5hbWUuc3RyKCkgKworICAgICAgICAgICAgICAgICAiJzogIiArIEVyck1zZyk7CisgIGlmICghYXJjaC0+aXNCaXRjb2RlQXJjaGl2ZSgpKSB7CisgICAgaXNfbmF0aXZlID0gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaXNfbmF0aXZlID0gZmFsc2U7CisKKyAgLy8gU2F2ZSBhIHNldCBvZiBzeW1ib2xzIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSBhcmNoaXZlLiBTaW5jZSB3ZSdyZQorICAvLyBlbnRlcmluZyBhIGxvb3AsIHRoZXJlJ3Mgbm8gcG9pbnQgc2VhcmNoaW5nIGZvciB0aGVzZSBtdWx0aXBsZSB0aW1lcy4gVGhpcworICAvLyB2YXJpYWJsZSBpcyB1c2VkIHRvICJzZXRfc3VidHJhY3QiIGZyb20gdGhlIHNldCBvZiB1bmRlZmluZWQgc3ltYm9scy4KKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IE5vdERlZmluZWRCeUFyY2hpdmU7CisKKyAgLy8gU2F2ZSB0aGUgY3VycmVudCBzZXQgb2YgdW5kZWZpbmVkIHN5bWJvbHMsIGJlY2F1c2Ugd2UgbWF5IGhhdmUgdG8gbWFrZQorICAvLyBtdWx0aXBsZSBwYXNzZXMgb3ZlciB0aGUgYXJjaGl2ZToKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEN1cnJlbnRseVVuZGVmaW5lZFN5bWJvbHM7CisKKyAgZG8geworICAgIEN1cnJlbnRseVVuZGVmaW5lZFN5bWJvbHMgPSBVbmRlZmluZWRTeW1ib2xzOworCisgICAgLy8gRmluZCB0aGUgbW9kdWxlcyB3ZSBuZWVkIHRvIGxpbmsgaW50byB0aGUgdGFyZ2V0IG1vZHVsZS4gIE5vdGUgdGhhdCBhcmNoCisgICAgLy8ga2VlcHMgb3duZXJzaGlwIG9mIHRoZXNlIG1vZHVsZXMgYW5kIG1heSByZXR1cm4gdGhlIHNhbWUgTW9kdWxlKiBmcm9tIGEKKyAgICAvLyBzdWJzZXF1ZW50IGNhbGwuCisgICAgc3RkOjpzZXQ8TW9kdWxlKj4gTW9kdWxlczsKKyAgICBpZiAoIWFyY2gtPmZpbmRNb2R1bGVzRGVmaW5pbmdTeW1ib2xzKFVuZGVmaW5lZFN5bWJvbHMsIE1vZHVsZXMsICZFcnJNc2cpKQorICAgICAgcmV0dXJuIGVycm9yKCJDYW5ub3QgZmluZCBzeW1ib2xzIGluICciICsgRmlsZW5hbWUuc3RyKCkgKyAKKyAgICAgICAgICAgICAgICAgICAiJzogIiArIEVyck1zZyk7CisKKyAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgbW9yZSBtb2R1bGVzIHRvIGxpbmsgdGhpcyB0aW1lLCB3ZSBhcmUgZG9uZQorICAgIC8vIHNlYXJjaGluZyB0aGlzIGFyY2hpdmUuCisgICAgaWYgKE1vZHVsZXMuZW1wdHkoKSkKKyAgICAgIGJyZWFrOworCisgICAgLy8gQW55IHN5bWJvbHMgcmVtYWluaW5nIGluIFVuZGVmaW5lZFN5bWJvbHMgYWZ0ZXIKKyAgICAvLyBmaW5kTW9kdWxlc0RlZmluaW5nU3ltYm9scyBhcmUgb25lcyB0aGF0IHRoZSBhcmNoaXZlIGRvZXMgbm90IGRlZmluZS4gU28KKyAgICAvLyB3ZSBhZGQgdGhlbSB0byB0aGUgTm90RGVmaW5lZEJ5QXJjaGl2ZSB2YXJpYWJsZSBub3cuCisgICAgTm90RGVmaW5lZEJ5QXJjaGl2ZS5pbnNlcnQoVW5kZWZpbmVkU3ltYm9scy5iZWdpbigpLAorICAgICAgICBVbmRlZmluZWRTeW1ib2xzLmVuZCgpKTsKKworICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIE1vZHVsZXMgdGhhdCB3ZSBnb3QgYmFjayBmcm9tIHRoZSBhcmNoaXZlCisgICAgZm9yIChzdGQ6OnNldDxNb2R1bGUqPjo6aXRlcmF0b3IgST1Nb2R1bGVzLmJlZ2luKCksIEU9TW9kdWxlcy5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisKKyAgICAgIC8vIEdldCB0aGUgbW9kdWxlIHdlIG11c3QgbGluayBpbi4KKyAgICAgIHN0ZDo6c3RyaW5nIG1vZHVsZUVycm9yTXNnOworICAgICAgTW9kdWxlKiBhTW9kdWxlID0gKkk7CisgICAgICBpZiAoYU1vZHVsZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhTW9kdWxlLT5NYXRlcmlhbGl6ZUFsbCgmbW9kdWxlRXJyb3JNc2cpKQorICAgICAgICAgIHJldHVybiBlcnJvcigiQ291bGQgbm90IGxvYWQgYSBtb2R1bGU6ICIgKyBtb2R1bGVFcnJvck1zZyk7CisKKyAgICAgICAgdmVyYm9zZSgiICBMaW5raW5nIGluIG1vZHVsZTogIiArIGFNb2R1bGUtPmdldE1vZHVsZUlkZW50aWZpZXIoKSk7CisKKyAgICAgICAgLy8gTGluayBpdCBpbgorICAgICAgICBpZiAoTGlua0luTW9kdWxlKGFNb2R1bGUsICZtb2R1bGVFcnJvck1zZykpCisgICAgICAgICAgcmV0dXJuIGVycm9yKCJDYW5ub3QgbGluayBpbiBtb2R1bGUgJyIgKworICAgICAgICAgICAgICAgICAgICAgICBhTW9kdWxlLT5nZXRNb2R1bGVJZGVudGlmaWVyKCkgKyAiJzogIiArIG1vZHVsZUVycm9yTXNnKTsKKyAgICAgIH0gCisgICAgfQorICAgIAorICAgIC8vIEdldCB0aGUgdW5kZWZpbmVkIHN5bWJvbHMgZnJvbSB0aGUgYWdncmVnYXRlIG1vZHVsZS4gVGhpcyByZWNvbXB1dGVzIHRoZQorICAgIC8vIHN5bWJvbHMgd2Ugc3RpbGwgbmVlZCBhZnRlciB0aGUgbmV3IG1vZHVsZXMgaGF2ZSBiZWVuIGxpbmtlZCBpbi4KKyAgICBHZXRBbGxVbmRlZmluZWRTeW1ib2xzKENvbXBvc2l0ZSwgVW5kZWZpbmVkU3ltYm9scyk7CisKKyAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdHdvIHNldHMgb2YgdW5kZWZpbmVkIHN5bWJvbHM6IFVuZGVmaW5lZFN5bWJvbHMKKyAgICAvLyB3aGljaCBob2xkcyB0aGUgdW5kZWZpbmVkIHN5bWJvbHMgZnJvbSBhbGwgdGhlIG1vZHVsZXMsIGFuZAorICAgIC8vIE5vdERlZmluZWRCeUFyY2hpdmUgd2hpY2ggaG9sZHMgc3ltYm9scyB3ZSBrbm93IHRoZSBhcmNoaXZlIGRvZXNuJ3QKKyAgICAvLyBkZWZpbmUuIFRoZXJlJ3Mgbm8gcG9pbnQgc2VhcmNoaW5nIGZvciBzeW1ib2xzIHRoYXQgd2Ugd29uJ3QgZmluZCBpbiB0aGUKKyAgICAvLyBhcmNoaXZlIHNvIHdlIHN1YnRyYWN0IHRoZXNlIHNldHMuCisgICAgc2V0X3N1YnRyYWN0KFVuZGVmaW5lZFN5bWJvbHMsIE5vdERlZmluZWRCeUFyY2hpdmUpOworCisgICAgLy8gSWYgdGhlcmUncyBubyBzeW1ib2xzIGxlZnQsIG5vIHBvaW50IGluIGNvbnRpbnVpbmcgdG8gc2VhcmNoIHRoZQorICAgIC8vIGFyY2hpdmUuCisgICAgaWYgKFVuZGVmaW5lZFN5bWJvbHMuZW1wdHkoKSkKKyAgICAgIGJyZWFrOworICB9IHdoaWxlIChDdXJyZW50bHlVbmRlZmluZWRTeW1ib2xzICE9IFVuZGVmaW5lZFN5bWJvbHMpOworCisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9MaW5rZXIvTGlua0l0ZW1zLmNwcCBiL3NyYy9MTFZNL2xpYi9MaW5rZXIvTGlua0l0ZW1zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmUyYmVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0xpbmtlci9MaW5rSXRlbXMuY3BwCkBAIC0wLDAgKzEsMjQwIEBACisvLz09PS0gbGliL0xpbmtlci9MaW5rSXRlbXMuY3BwIC0gTGluayBMTFZNIG9iamVjdHMgYW5kIGxpYnJhcmllcyAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byBoYW5kbGUgbGlua2luZyB0b2dldGhlciBMTFZNIGJpdGNvZGUgZmlsZXMsCisvLyBhbmQgdG8gaGFuZGxlIGFubm95aW5nIHRoaW5ncyBsaWtlIHN0YXRpYyBsaWJyYXJpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTGlua2VyLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvUmVhZGVyV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIExpbmtJdGVtcyAtIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgaW50byBsaW5raW5nLiBJdCB0YWtlcyBhCisvLyBsaXN0IG9mIExpbmtJdGVtIHdoaWNoIGluZGljYXRlcyB0aGUgb3JkZXIgdGhlIGZpbGVzIHNob3VsZCBiZSBsaW5rZWQgYW5kCisvLyBob3cgZWFjaCBmaWxlIHNob3VsZCBiZSB0cmVhdGVkIChwbGFpbiBmaWxlIG9yIHdpdGggbGlicmFyeSBzZWFyY2gpLiBUaGUKKy8vIGZ1bmN0aW9uIG9ubHkgbGlua3MgYml0Y29kZSBhbmQgcHJvZHVjZXMgYSByZXN1bHQgbGlzdCBvZiBpdGVtcyB0aGF0IGFyZQorLy8gbmF0aXZlIG9iamVjdHMuIAorYm9vbAorTGlua2VyOjpMaW5rSW5JdGVtcyhjb25zdCBJdGVtTGlzdCYgSXRlbXMsIEl0ZW1MaXN0JiBOYXRpdmVJdGVtcykgeworICAvLyBDbGVhciB0aGUgTmF0aXZlSXRlbXMganVzdCBpbiBjYXNlCisgIE5hdGl2ZUl0ZW1zLmNsZWFyKCk7CisKKyAgLy8gRm9yIGVhY2ggbGlua2FnZSBpdGVtIC4uLgorICBmb3IgKEl0ZW1MaXN0Ojpjb25zdF9pdGVyYXRvciBJID0gSXRlbXMuYmVnaW4oKSwgRSA9IEl0ZW1zLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPnNlY29uZCkgeworICAgICAgLy8gTGluayBpbiB0aGUgbGlicmFyeSBzdWdnZXN0ZWQuCisgICAgICBib29sIGlzX25hdGl2ZSA9IGZhbHNlOworICAgICAgaWYgKExpbmtJbkxpYnJhcnkoSS0+Zmlyc3QsIGlzX25hdGl2ZSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGlzX25hdGl2ZSkKKyAgICAgICAgTmF0aXZlSXRlbXMucHVzaF9iYWNrKCpJKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTGluayBpbiB0aGUgZmlsZSBzdWdnZXN0ZWQKKyAgICAgIGJvb2wgaXNfbmF0aXZlID0gZmFsc2U7CisgICAgICBpZiAoTGlua0luRmlsZShzeXM6OlBhdGgoSS0+Zmlyc3QpLCBpc19uYXRpdmUpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChpc19uYXRpdmUpCisgICAgICAgIE5hdGl2ZUl0ZW1zLnB1c2hfYmFjaygqSSk7CisgICAgfQorICB9CisKKyAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHByb2Nlc3NlZCBhbGwgdGhlIGxpbmsgaXRlbXMgcHJvdmlkZWQgdG8gdXMuIFNpbmNlCisgIC8vIHdlIGhhdmUgYW4gYWdncmVnYXRlZCBtb2R1bGUgYXQgdGhpcyBwb2ludCwgdGhlIGRlcGVuZGVudCBsaWJyYXJpZXMgaW4KKyAgLy8gdGhhdCBtb2R1bGUgc2hvdWxkIGFsc28gYmUgYWdncmVnYXRlZCB3aXRoIGR1cGxpY2F0ZXMgZWxpbWluYXRlZC4gVGhpcyBpcworICAvLyBub3cgdGhlIHRpbWUgdG8gcHJvY2VzcyB0aGUgZGVwZW5kZW50IGxpYnJhcmllcyB0byByZXNvbHZlIGFueSByZW1haW5pbmcKKyAgLy8gc3ltYm9scy4KKyAgYm9vbCBpc19uYXRpdmU7CisgIGZvciAoTW9kdWxlOjpsaWJfaXRlcmF0b3IgSSA9IENvbXBvc2l0ZS0+bGliX2JlZ2luKCksCisgICAgICAgICBFID0gQ29tcG9zaXRlLT5saWJfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYoTGlua0luTGlicmFyeSgqSSwgaXNfbmF0aXZlKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChpc19uYXRpdmUpCisgICAgICBOYXRpdmVJdGVtcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoKkksIHRydWUpKTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gTGlua0luTGlicmFyeSAtIGxpbmtzIG9uZSBsaWJyYXJ5IGludG8gdGhlIEhlYWRNb2R1bGUuCisvLy8KK2Jvb2wgTGlua2VyOjpMaW5rSW5MaWJyYXJ5KFN0cmluZ1JlZiBMaWIsIGJvb2wmIGlzX25hdGl2ZSkgeworICBpc19uYXRpdmUgPSBmYWxzZTsKKyAgLy8gRGV0ZXJtaW5lIHdoZXJlIHRoaXMgbGlicmFyeSBsaXZlcy4KKyAgc3lzOjpQYXRoIFBhdGhuYW1lID0gRmluZExpYihMaWIpOworICBpZiAoUGF0aG5hbWUuaXNFbXB0eSgpKQorICAgIHJldHVybiBlcnJvcigiQ2Fubm90IGZpbmQgbGlicmFyeSAnIiArIExpYi5zdHIoKSArICInIik7CisKKyAgLy8gSWYgaXRzIGFuIGFyY2hpdmUsIHRyeSB0byBsaW5rIGl0IGluCisgIHN0ZDo6c3RyaW5nIE1hZ2ljOworICBQYXRobmFtZS5nZXRNYWdpY051bWJlcihNYWdpYywgNjQpOworICBzd2l0Y2ggKHN5czo6SWRlbnRpZnlGaWxlVHlwZShNYWdpYy5jX3N0cigpLCA2NCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJCYWQgZmlsZSB0eXBlIGlkZW50aWZpY2F0aW9uIik7CisgICAgY2FzZSBzeXM6OlVua25vd25fRmlsZVR5cGU6CisgICAgICByZXR1cm4gd2FybmluZygiU3VwcG9zZWQgbGlicmFyeSAnIiArIExpYi5zdHIoKSArICInIGlzbid0IGEgbGlicmFyeS4iKTsKKworICAgIGNhc2Ugc3lzOjpCaXRjb2RlX0ZpbGVUeXBlOgorICAgICAgLy8gTExWTSAiLnNvIiBmaWxlLgorICAgICAgaWYgKExpbmtJbkZpbGUoUGF0aG5hbWUsIGlzX25hdGl2ZSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHN5czo6QXJjaGl2ZV9GaWxlVHlwZToKKyAgICAgIGlmIChMaW5rSW5BcmNoaXZlKFBhdGhuYW1lLCBpc19uYXRpdmUpKQorICAgICAgICByZXR1cm4gZXJyb3IoIkNhbm5vdCBsaW5rIGFyY2hpdmUgJyIgKyBQYXRobmFtZS5zdHIoKSArICInIik7CisgICAgICBicmVhazsKKworICAgIGNhc2Ugc3lzOjpFTEZfUmVsb2NhdGFibGVfRmlsZVR5cGU6CisgICAgY2FzZSBzeXM6OkVMRl9TaGFyZWRPYmplY3RfRmlsZVR5cGU6CisgICAgY2FzZSBzeXM6Ok1hY2hfT19PYmplY3RfRmlsZVR5cGU6CisgICAgY2FzZSBzeXM6Ok1hY2hfT19GaXhlZFZpcnR1YWxNZW1vcnlTaGFyZWRMaWJfRmlsZVR5cGU6CisgICAgY2FzZSBzeXM6Ok1hY2hfT19EeW5hbWljYWxseUxpbmtlZFNoYXJlZExpYl9GaWxlVHlwZToKKyAgICBjYXNlIHN5czo6TWFjaF9PX0R5bmFtaWNhbGx5TGlua2VkU2hhcmVkTGliU3R1Yl9GaWxlVHlwZToKKyAgICBjYXNlIHN5czo6Q09GRl9GaWxlVHlwZToKKyAgICAgIGlzX25hdGl2ZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBMaW5rTGlicmFyaWVzIC0gdGFrZXMgdGhlIHNwZWNpZmllZCBsaWJyYXJ5IGZpbGVzIGFuZCBsaW5rcyB0aGVtIGludG8gdGhlCisvLy8gbWFpbiBiaXRjb2RlIG9iamVjdCBmaWxlLgorLy8vCisvLy8gSW5wdXRzOgorLy8vICBMaWJyYXJpZXMgIC0gVGhlIGxpc3Qgb2YgbGlicmFyaWVzIHRvIGxpbmsgaW50byB0aGUgbW9kdWxlLgorLy8vCisvLy8gUmV0dXJuIHZhbHVlOgorLy8vICBGQUxTRSAtIE5vIGVycm9yLgorLy8vICBUUlVFICAtIEVycm9yLgorLy8vCitib29sIExpbmtlcjo6TGlua0luTGlicmFyaWVzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmTGlicmFyaWVzKSB7CisKKyAgLy8gUHJvY2VzcyB0aGUgc2V0IG9mIGxpYnJhcmllcyB3ZSd2ZSBiZWVuIHByb3ZpZGVkLgorICBib29sIGlzX25hdGl2ZSA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTGlicmFyaWVzLnNpemUoKTsgKytpKQorICAgIGlmIChMaW5rSW5MaWJyYXJ5KExpYnJhcmllc1tpXSwgaXNfbmF0aXZlKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgIC8vIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBwcm9jZXNzZWQgYWxsIHRoZSBsaWJyYXJpZXMgcHJvdmlkZWQgdG8gdXMuIFNpbmNlCisgIC8vIHdlIGhhdmUgYW4gYWdncmVnYXRlZCBtb2R1bGUgYXQgdGhpcyBwb2ludCwgdGhlIGRlcGVuZGVudCBsaWJyYXJpZXMgaW4KKyAgLy8gdGhhdCBtb2R1bGUgc2hvdWxkIGFsc28gYmUgYWdncmVnYXRlZCB3aXRoIGR1cGxpY2F0ZXMgZWxpbWluYXRlZC4gVGhpcyBpcworICAvLyBub3cgdGhlIHRpbWUgdG8gcHJvY2VzcyB0aGUgZGVwZW5kZW50IGxpYnJhcmllcyB0byByZXNvbHZlIGFueSByZW1haW5pbmcKKyAgLy8gc3ltYm9scy4KKyAgY29uc3QgTW9kdWxlOjpMaWJyYXJ5TGlzdFR5cGUmIERlcExpYnMgPSBDb21wb3NpdGUtPmdldExpYnJhcmllcygpOworICBmb3IgKE1vZHVsZTo6TGlicmFyeUxpc3RUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gRGVwTGlicy5iZWdpbigpLAorICAgICAgICAgRSA9IERlcExpYnMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChMaW5rSW5MaWJyYXJ5KCpJLCBpc19uYXRpdmUpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gTGlua0luRmlsZSAtIG9wZW5zIGEgYml0Y29kZSBmaWxlIGFuZCBsaW5rcyBpbiBhbGwgb2JqZWN0cyB3aGljaAorLy8vIHByb3ZpZGUgc3ltYm9scyB0aGF0IGFyZSBjdXJyZW50bHkgdW5kZWZpbmVkLgorLy8vCisvLy8gSW5wdXRzOgorLy8vICBGaWxlIC0gVGhlIHBhdGhuYW1lIG9mIHRoZSBiaXRjb2RlIGZpbGUuCisvLy8KKy8vLyBPdXRwdXRzOgorLy8vICBFcnJvck1lc3NhZ2UgLSBBIEMrKyBzdHJpbmcgZGV0YWlsaW5nIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KKy8vLworLy8vIFJldHVybiBWYWx1ZToKKy8vLyAgVFJVRSAgLSBBbiBlcnJvciBvY2N1cnJlZC4KKy8vLyAgRkFMU0UgLSBObyBlcnJvcnMuCisvLy8KK2Jvb2wgTGlua2VyOjpMaW5rSW5GaWxlKGNvbnN0IHN5czo6UGF0aCAmRmlsZSwgYm9vbCAmaXNfbmF0aXZlKSB7CisgIGlzX25hdGl2ZSA9IGZhbHNlOworICAKKyAgLy8gQ2hlY2sgZm9yIGEgZmlsZSBvZiBuYW1lICItIiwgd2hpY2ggbWVhbnMgInJlYWQgc3RhbmRhcmQgaW5wdXQiCisgIGlmIChGaWxlLnN0cigpID09ICItIikgeworICAgIHN0ZDo6YXV0b19wdHI8TW9kdWxlPiBNOworICAgIGlmIChNZW1vcnlCdWZmZXIgKkJ1ZmZlciA9IE1lbW9yeUJ1ZmZlcjo6Z2V0U1RESU4oJkVycm9yKSkgeworICAgICAgaWYgKCFCdWZmZXItPmdldEJ1ZmZlclNpemUoKSkgeworICAgICAgICBkZWxldGUgQnVmZmVyOworICAgICAgICBFcnJvciA9ICJzdGFuZGFyZCBpbnB1dCBpcyBlbXB0eSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBNLnJlc2V0KFBhcnNlQml0Y29kZUZpbGUoQnVmZmVyLCBDb250ZXh0LCAmRXJyb3IpKTsKKyAgICAgICAgZGVsZXRlIEJ1ZmZlcjsKKyAgICAgICAgaWYgKE0uZ2V0KCkpCisgICAgICAgICAgaWYgKCFMaW5rSW5Nb2R1bGUoTS5nZXQoKSwgJkVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycm9yKCJDYW5ub3QgbGluayBzdGRpbjogIiArIEVycm9yKTsKKyAgfQorCisgIC8vIERldGVybWluZSB3aGF0IHZhcmlldHkgb2YgZmlsZSBpdCBpcy4KKyAgc3RkOjpzdHJpbmcgTWFnaWM7CisgIGlmICghRmlsZS5nZXRNYWdpY051bWJlcihNYWdpYywgNjQpKQorICAgIHJldHVybiBlcnJvcigiQ2Fubm90IGZpbmQgbGlua2VyIGlucHV0ICciICsgRmlsZS5zdHIoKSArICInIik7CisKKyAgc3dpdGNoIChzeXM6OklkZW50aWZ5RmlsZVR5cGUoTWFnaWMuY19zdHIoKSwgNjQpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiQmFkIGZpbGUgdHlwZSBpZGVudGlmaWNhdGlvbiIpOworICAgIGNhc2Ugc3lzOjpVbmtub3duX0ZpbGVUeXBlOgorICAgICAgcmV0dXJuIHdhcm5pbmcoIklnbm9yaW5nIGZpbGUgJyIgKyBGaWxlLnN0cigpICsgCisgICAgICAgICAgICAgICAgICAgIicgYmVjYXVzZSBkb2VzIG5vdCBjb250YWluIGJpdGNvZGUuIik7CisKKyAgICBjYXNlIHN5czo6QXJjaGl2ZV9GaWxlVHlwZToKKyAgICAgIC8vIEEgdXNlciBtYXkgc3BlY2lmeSBhbiBhciBhcmNoaXZlIHdpdGhvdXQgLWwsIHBlcmhhcHMgYmVjYXVzZSBpdAorICAgICAgLy8gaXMgbm90IGluc3RhbGxlZCBhcyBhIGxpYnJhcnkuIERldGVjdCB0aGF0IGFuZCBsaW5rIHRoZSBhcmNoaXZlLgorICAgICAgaWYgKExpbmtJbkFyY2hpdmUoRmlsZSwgaXNfbmF0aXZlKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKworICAgIGNhc2Ugc3lzOjpCaXRjb2RlX0ZpbGVUeXBlOiB7CisgICAgICB2ZXJib3NlKCJMaW5raW5nIGJpdGNvZGUgZmlsZSAnIiArIEZpbGUuc3RyKCkgKyAiJyIpOworICAgICAgc3RkOjphdXRvX3B0cjxNb2R1bGU+IE0oTG9hZE9iamVjdChGaWxlKSk7CisgICAgICBpZiAoTS5nZXQoKSA9PSAwKQorICAgICAgICByZXR1cm4gZXJyb3IoIkNhbm5vdCBsb2FkIGZpbGUgJyIgKyBGaWxlLnN0cigpICsgIic6ICIgKyBFcnJvcik7CisgICAgICBpZiAoTGlua0luTW9kdWxlKE0uZ2V0KCksICZFcnJvcikpCisgICAgICAgIHJldHVybiBlcnJvcigiQ2Fubm90IGxpbmsgZmlsZSAnIiArIEZpbGUuc3RyKCkgKyAiJzogIiArIEVycm9yKTsKKworICAgICAgdmVyYm9zZSgiTGlua2VkIGluIGZpbGUgJyIgKyBGaWxlLnN0cigpICsgIiciKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2Ugc3lzOjpFTEZfUmVsb2NhdGFibGVfRmlsZVR5cGU6CisgICAgY2FzZSBzeXM6OkVMRl9TaGFyZWRPYmplY3RfRmlsZVR5cGU6CisgICAgY2FzZSBzeXM6Ok1hY2hfT19PYmplY3RfRmlsZVR5cGU6CisgICAgY2FzZSBzeXM6Ok1hY2hfT19GaXhlZFZpcnR1YWxNZW1vcnlTaGFyZWRMaWJfRmlsZVR5cGU6CisgICAgY2FzZSBzeXM6Ok1hY2hfT19EeW5hbWljYWxseUxpbmtlZFNoYXJlZExpYl9GaWxlVHlwZToKKyAgICBjYXNlIHN5czo6TWFjaF9PX0R5bmFtaWNhbGx5TGlua2VkU2hhcmVkTGliU3R1Yl9GaWxlVHlwZToKKyAgICBjYXNlIHN5czo6Q09GRl9GaWxlVHlwZToKKyAgICAgIGlzX25hdGl2ZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBMaW5rRmlsZXMgLSB0YWtlcyBhIG1vZHVsZSBhbmQgYSBsaXN0IG9mIGZpbGVzIGFuZCBsaW5rcyB0aGVtIGFsbCB0b2dldGhlci4KKy8vLyBJdCBsb2NhdGVzIHRoZSBmaWxlIGVpdGhlciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFzIGl0cyBhYnNvbHV0ZQorLy8vIG9yIHJlbGF0aXZlIHBhdGhuYW1lLCBvciBhcyBhIGZpbGUgc29tZXdoZXJlIGluIExMVk1fTElCX1NFQVJDSF9QQVRILgorLy8vCisvLy8gSW5wdXRzOgorLy8vICBGaWxlcyAgICAgIC0gQSB2ZWN0b3Igb2Ygc3lzOjpQYXRoIGluZGljYXRpbmcgdGhlIExMVk0gYml0Y29kZSBmaWxlbmFtZXMKKy8vLyAgICAgICAgICAgICAgIHRvIGJlIGxpbmtlZC4gIFRoZSBuYW1lcyBjYW4gcmVmZXIgdG8gYSBtaXh0dXJlIG9mIHB1cmUgTExWTQorLy8vICAgICAgICAgICAgICAgYml0Y29kZSBmaWxlcyBhbmQgYXJjaGl2ZSAoYXIpIGZvcm1hdHRlZCBmaWxlcy4KKy8vLworLy8vIFJldHVybiB2YWx1ZToKKy8vLyAgRkFMU0UgLSBObyBlcnJvcnMuCisvLy8gIFRSVUUgIC0gU29tZSBlcnJvciBvY2N1cnJlZC4KKy8vLworYm9vbCBMaW5rZXI6OkxpbmtJbkZpbGVzKGNvbnN0IHN0ZDo6dmVjdG9yPHN5czo6UGF0aD4gJkZpbGVzKSB7CisgIGJvb2wgaXNfbmF0aXZlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRmlsZXMuc2l6ZSgpOyArK2kpCisgICAgaWYgKExpbmtJbkZpbGUoRmlsZXNbaV0sIGlzX25hdGl2ZSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0xpbmtlci9MaW5rTW9kdWxlcy5jcHAgYi9zcmMvTExWTS9saWIvTGlua2VyL0xpbmtNb2R1bGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODkxNjMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL0xpbmtlci9MaW5rTW9kdWxlcy5jcHAKQEAgLTAsMCArMSwxMzc5IEBACisvLz09PS0gbGliL0xpbmtlci9MaW5rTW9kdWxlcy5jcHAgLSBNb2R1bGUgTGlua2VyIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBMTFZNIG1vZHVsZSBsaW5rZXIuCisvLworLy8gU3BlY2lmaWNhbGx5LCB0aGlzOgorLy8gICogTWVyZ2VzIGdsb2JhbCB2YXJpYWJsZXMgYmV0d2VlbiB0aGUgdHdvIG1vZHVsZXMKKy8vICAgICogVW5pbml0ICsgVW5pbml0ID0gSW5pdCwgSW5pdCArIFVuaW5pdCA9IEluaXQsIEluaXQgKyBJbml0ID0gRXJyb3IgaWYgIT0KKy8vICAqIE1lcmdlcyBmdW5jdGlvbnMgYmV0d2VlbiB0d28gbW9kdWxlcworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0xpbmtlci5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGVTeW1ib2xUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vVmFsdWVTeW1ib2xUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIEVycm9yIC0gU2ltcGxlIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uZGl0aW9uYWxseSBhc3NpZ24gdG8gRSBhbmQgcmV0dXJuIHRydWUuCisvLyBUaGlzIGp1c3QgbWFrZXMgZXJyb3IgcmV0dXJuIGNvbmRpdGlvbnMgYSBsaXR0bGUgYml0IHNpbXBsZXIuLi4KK3N0YXRpYyBpbmxpbmUgYm9vbCBFcnJvcihzdGQ6OnN0cmluZyAqRSwgY29uc3QgVHdpbmUgJk1lc3NhZ2UpIHsKKyAgaWYgKEUpICpFID0gTWVzc2FnZS5zdHIoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZ1bmN0aW9uOiBSZXNvbHZlVHlwZXMoKQorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gIEF0dGVtcHQgdG8gbGluayB0aGUgdHdvIHNwZWNpZmllZCB0eXBlcyB0b2dldGhlci4KKy8vCisvLyBJbnB1dHM6CisvLyAgRGVzdFR5IC0gVGhlIHR5cGUgdG8gd2hpY2ggd2Ugd2lzaCB0byByZXNvbHZlLgorLy8gIFNyY1R5ICAtIFRoZSBvcmlnaW5hbCB0eXBlIHdoaWNoIHdlIHdhbnQgdG8gcmVzb2x2ZS4KKy8vCisvLyBPdXRwdXRzOgorLy8gIERlc3RTVCAtIFRoZSBzeW1ib2wgdGFibGUgaW4gd2hpY2ggdGhlIG5ldyB0eXBlIHNob3VsZCBiZSBwbGFjZWQuCisvLworLy8gUmV0dXJuIHZhbHVlOgorLy8gIHRydWUgIC0gVGhlcmUgaXMgYW4gZXJyb3IgYW5kIHRoZSB0eXBlcyBjYW5ub3QgeWV0IGJlIGxpbmtlZC4KKy8vICBmYWxzZSAtIE5vIGVycm9ycy4KKy8vCitzdGF0aWMgYm9vbCBSZXNvbHZlVHlwZXMoY29uc3QgVHlwZSAqRGVzdFR5LCBjb25zdCBUeXBlICpTcmNUeSkgeworICBpZiAoRGVzdFR5ID09IFNyY1R5KSByZXR1cm4gZmFsc2U7ICAgICAgIC8vIElmIGFscmVhZHkgZXF1YWwsIG5vb3AKKyAgYXNzZXJ0KERlc3RUeSAmJiBTcmNUeSAmJiAiQ2FuJ3QgaGFuZGxlIG51bGwgdHlwZXMiKTsKKworICBpZiAoY29uc3QgT3BhcXVlVHlwZSAqT1QgPSBkeW5fY2FzdDxPcGFxdWVUeXBlPihEZXN0VHkpKSB7CisgICAgLy8gVHlwZSBfaXNfIGluIG1vZHVsZSwganVzdCBvcGFxdWUuLi4KKyAgICBjb25zdF9jYXN0PE9wYXF1ZVR5cGUqPihPVCktPnJlZmluZUFic3RyYWN0VHlwZVRvKFNyY1R5KTsKKyAgfSBlbHNlIGlmIChjb25zdCBPcGFxdWVUeXBlICpPVCA9IGR5bl9jYXN0PE9wYXF1ZVR5cGU+KFNyY1R5KSkgeworICAgIGNvbnN0X2Nhc3Q8T3BhcXVlVHlwZSo+KE9UKS0+cmVmaW5lQWJzdHJhY3RUeXBlVG8oRGVzdFR5KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdHJ1ZTsgIC8vIENhbm5vdCBsaW5rIHR5cGVzLi4uIG5vdC1lcXVhbCBhbmQgbmVpdGhlciBpcyBvcGFxdWUuCisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gTGlua2VyVHlwZU1hcCAtIFRoaXMgaW1wbGVtZW50cyBhIG1hcCBvZiB0eXBlcyB0aGF0IGlzIHN0YWJsZQorLy8vIGV2ZW4gaWYgdHlwZXMgYXJlIHJlc29sdmVkL3JlZmluZWQgdG8gb3RoZXIgdHlwZXMuICBUaGlzIGlzIG5vdCBhIGdlbmVyYWwKKy8vLyBwdXJwb3NlIG1hcCwgaXQgaXMgc3BlY2lmaWMgdG8gdGhlIGxpbmtlcidzIHVzZS4KK25hbWVzcGFjZSB7CitjbGFzcyBMaW5rZXJUeXBlTWFwIDogcHVibGljIEFic3RyYWN0VHlwZVVzZXIgeworICB0eXBlZGVmIERlbnNlTWFwPGNvbnN0IFR5cGUqLCBQQVR5cGVIb2xkZXI+IFRoZU1hcFR5OworICBUaGVNYXBUeSBUaGVNYXA7CisKKyAgTGlua2VyVHlwZU1hcChjb25zdCBMaW5rZXJUeXBlTWFwJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTGlua2VyVHlwZU1hcCYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCitwdWJsaWM6CisgIExpbmtlclR5cGVNYXAoKSB7fQorICB+TGlua2VyVHlwZU1hcCgpIHsKKyAgICBmb3IgKERlbnNlTWFwPGNvbnN0IFR5cGUqLCBQQVR5cGVIb2xkZXI+OjppdGVyYXRvciBJID0gVGhlTWFwLmJlZ2luKCksCisgICAgICAgICBFID0gVGhlTWFwLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIEktPmZpcnN0LT5yZW1vdmVBYnN0cmFjdFR5cGVVc2VyKHRoaXMpOworICB9CisKKyAgLy8vIGxvb2t1cCAtIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBvciBudWxsIGlmIGl0IGRvZXNuJ3QKKyAgLy8vIGV4aXN0LgorICBjb25zdCBUeXBlICpsb29rdXAoY29uc3QgVHlwZSAqVHkpIGNvbnN0IHsKKyAgICBUaGVNYXBUeTo6Y29uc3RfaXRlcmF0b3IgSSA9IFRoZU1hcC5maW5kKFR5KTsKKyAgICBpZiAoSSAhPSBUaGVNYXAuZW5kKCkpIHJldHVybiBJLT5zZWNvbmQ7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gZXJhc2UgLSBSZW1vdmUgdGhlIHNwZWNpZmllZCB0eXBlLCByZXR1cm5pbmcgdHJ1ZSBpZiBpdCB3YXMgaW4gdGhlIHNldC4KKyAgYm9vbCBlcmFzZShjb25zdCBUeXBlICpUeSkgeworICAgIGlmICghVGhlTWFwLmVyYXNlKFR5KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoVHktPmlzQWJzdHJhY3QoKSkKKyAgICAgIFR5LT5yZW1vdmVBYnN0cmFjdFR5cGVVc2VyKHRoaXMpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIGluc2VydCAtIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBwb2ludGVyIHdhcyBuZXcgdG8gdGhlIHNldCwgZmFsc2UgaWYgaXQKKyAgLy8vIHdhcyBhbHJlYWR5IGluIHRoZSBzZXQuCisgIGJvb2wgaW5zZXJ0KGNvbnN0IFR5cGUgKlNyYywgY29uc3QgVHlwZSAqRHN0KSB7CisgICAgaWYgKCFUaGVNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFNyYywgUEFUeXBlSG9sZGVyKERzdCkpKS5zZWNvbmQpCisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBBbHJlYWR5IGluIG1hcC4KKyAgICBpZiAoU3JjLT5pc0Fic3RyYWN0KCkpCisgICAgICBTcmMtPmFkZEFic3RyYWN0VHlwZVVzZXIodGhpcyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworcHJvdGVjdGVkOgorICAvLy8gcmVmaW5lQWJzdHJhY3RUeXBlIC0gVGhlIGNhbGxiYWNrIG1ldGhvZCBpbnZva2VkIHdoZW4gYW4gYWJzdHJhY3QgdHlwZSBpcworICAvLy8gcmVzb2x2ZWQgdG8gYW5vdGhlciB0eXBlLiAgQW4gb2JqZWN0IG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gdXBkYXRlCisgIC8vLyBpdHMgaW50ZXJuYWwgc3RhdGUgdG8gcmVmZXJlbmNlIE5ld1R5cGUgaW5zdGVhZCBvZiBPbGRUeXBlLgorICAvLy8KKyAgdmlydHVhbCB2b2lkIHJlZmluZUFic3RyYWN0VHlwZShjb25zdCBEZXJpdmVkVHlwZSAqT2xkVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqTmV3VHkpIHsKKyAgICBUaGVNYXBUeTo6aXRlcmF0b3IgSSA9IFRoZU1hcC5maW5kKE9sZFR5KTsKKyAgICBjb25zdCBUeXBlICpEc3RUeSA9IEktPnNlY29uZDsKKworICAgIFRoZU1hcC5lcmFzZShJKTsKKyAgICBpZiAoT2xkVHktPmlzQWJzdHJhY3QoKSkKKyAgICAgIE9sZFR5LT5yZW1vdmVBYnN0cmFjdFR5cGVVc2VyKHRoaXMpOworCisgICAgLy8gRG9uJ3QgcmVpbnNlcnQgaW50byB0aGUgbWFwIGlmIHRoZSBrZXkgaXMgY29uY3JldGUgbm93LgorICAgIGlmIChOZXdUeS0+aXNBYnN0cmFjdCgpKQorICAgICAgaW5zZXJ0KE5ld1R5LCBEc3RUeSk7CisgIH0KKworICAvLy8gVGhlIG90aGVyIGNhc2Ugd2hpY2ggQWJzdHJhY3RUeXBlVXNlcnMgbXVzdCBiZSBhd2FyZSBvZiBpcyB3aGVuIGEgdHlwZQorICAvLy8gbWFrZXMgdGhlIHRyYW5zaXRpb24gZnJvbSBiZWluZyBhYnN0cmFjdCAod2hlcmUgaXQgaGFzIGNsaWVudHMgb24gaXQncworICAvLy8gQWJzdHJhY3RUeXBlVXNlcnMgbGlzdCkgdG8gY29uY3JldGUgKHdoZXJlIGl0IGRvZXMgbm90KS4gIFRoaXMgbWV0aG9kCisgIC8vLyBub3RpZmllcyBBVFUncyB3aGVuIHRoaXMgb2NjdXJzIGZvciBhIHR5cGUuCisgIHZpcnR1YWwgdm9pZCB0eXBlQmVjYW1lQ29uY3JldGUoY29uc3QgRGVyaXZlZFR5cGUgKkFic1R5KSB7CisgICAgVGhlTWFwLmVyYXNlKEFic1R5KTsKKyAgICBBYnNUeS0+cmVtb3ZlQWJzdHJhY3RUeXBlVXNlcih0aGlzKTsKKyAgfQorCisgIC8vIGZvciBkZWJ1Z2dpbmcuLi4KKyAgdmlydHVhbCB2b2lkIGR1bXAoKSBjb25zdCB7CisgICAgZGJncygpIDw8ICJBYnN0cmFjdFR5cGVTZXQhXG4iOworICB9Cit9OworfQorCisKKy8vIFJlY3Vyc2l2ZVJlc29sdmVUeXBlcyAtIFRoaXMgaXMganVzdCBsaWtlIFJlc29sdmVUeXBlcywgZXhjZXB0IHRoYXQgaXQKKy8vIHJlY3Vyc2VzIGRvd24gaW50byBkZXJpdmVkIHR5cGVzLCBtZXJnaW5nIHRoZSB1c2VkIHR5cGVzIGlmIHRoZSBwYXJlbnQgdHlwZXMKKy8vIGFyZSBjb21wYXRpYmxlLgorc3RhdGljIGJvb2wgUmVjdXJzaXZlUmVzb2x2ZVR5cGVzSShjb25zdCBUeXBlICpEc3RUeSwgY29uc3QgVHlwZSAqU3JjVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtlclR5cGVNYXAgJlBvaW50ZXJzKSB7CisgIGlmIChEc3RUeSA9PSBTcmNUeSkgcmV0dXJuIGZhbHNlOyAgICAgICAvLyBJZiBhbHJlYWR5IGVxdWFsLCBub29wCisKKyAgLy8gSWYgd2UgZm91bmQgb3VyIG9wYXF1ZSB0eXBlLCByZXNvbHZlIGl0IG5vdyEKKyAgaWYgKERzdFR5LT5pc09wYXF1ZVR5KCkgfHwgU3JjVHktPmlzT3BhcXVlVHkoKSkKKyAgICByZXR1cm4gUmVzb2x2ZVR5cGVzKERzdFR5LCBTcmNUeSk7CisKKyAgLy8gVHdvIHR5cGVzIGNhbm5vdCBiZSByZXNvbHZlZCB0b2dldGhlciBpZiB0aGV5IGFyZSBvZiBkaWZmZXJlbnQgcHJpbWl0aXZlCisgIC8vIHR5cGUuICBGb3IgZXhhbXBsZSwgd2UgY2Fubm90IHJlc29sdmUgYW4gaW50IHRvIGEgZmxvYXQuCisgIGlmIChEc3RUeS0+Z2V0VHlwZUlEKCkgIT0gU3JjVHktPmdldFR5cGVJRCgpKSByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiBuZWl0aGVyIHR5cGUgaXMgYWJzdHJhY3QsIHRoZW4gdGhleSByZWFsbHkgYXJlIGp1c3QgZGlmZmVyZW50IHR5cGVzLgorICBpZiAoIURzdFR5LT5pc0Fic3RyYWN0KCkgJiYgIVNyY1R5LT5pc0Fic3RyYWN0KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gT3RoZXJ3aXNlLCByZXNvbHZlIHRoZSB1c2VkIHR5cGUgdXNlZCBieSB0aGlzIGRlcml2ZWQgdHlwZS4uLgorICBzd2l0Y2ggKERzdFR5LT5nZXRUeXBlSUQoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiB0cnVlOworICBjYXNlIFR5cGU6OkZ1bmN0aW9uVHlJRDogeworICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRHN0RlQgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oRHN0VHkpOworICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqU3JjRlQgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oU3JjVHkpOworICAgIGlmIChEc3RGVC0+aXNWYXJBcmcoKSAhPSBTcmNGVC0+aXNWYXJBcmcoKSB8fAorICAgICAgICBEc3RGVC0+Z2V0TnVtQ29udGFpbmVkVHlwZXMoKSAhPSBTcmNGVC0+Z2V0TnVtQ29udGFpbmVkVHlwZXMoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gVXNlIFR5cGVIb2xkZXIncyBzbyByZWN1cnNpdmUgcmVzb2x1dGlvbiB3b24ndCBicmVhayB1cy4KKyAgICBQQVR5cGVIb2xkZXIgU1QoU3JjRlQpLCBEVChEc3RGVCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IERzdEZULT5nZXROdW1Db250YWluZWRUeXBlcygpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgVHlwZSAqU0UgPSBTVC0+Z2V0Q29udGFpbmVkVHlwZShpKSwgKkRFID0gRFQtPmdldENvbnRhaW5lZFR5cGUoaSk7CisgICAgICBpZiAoU0UgIT0gREUgJiYgUmVjdXJzaXZlUmVzb2x2ZVR5cGVzSShERSwgU0UsIFBvaW50ZXJzKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjYXNlIFR5cGU6OlN0cnVjdFR5SUQ6IHsKKyAgICBjb25zdCBTdHJ1Y3RUeXBlICpEc3RTVCA9IGNhc3Q8U3RydWN0VHlwZT4oRHN0VHkpOworICAgIGNvbnN0IFN0cnVjdFR5cGUgKlNyY1NUID0gY2FzdDxTdHJ1Y3RUeXBlPihTcmNUeSk7CisgICAgaWYgKERzdFNULT5nZXROdW1Db250YWluZWRUeXBlcygpICE9IFNyY1NULT5nZXROdW1Db250YWluZWRUeXBlcygpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBQQVR5cGVIb2xkZXIgU1QoU3JjU1QpLCBEVChEc3RTVCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IERzdFNULT5nZXROdW1Db250YWluZWRUeXBlcygpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgVHlwZSAqU0UgPSBTVC0+Z2V0Q29udGFpbmVkVHlwZShpKSwgKkRFID0gRFQtPmdldENvbnRhaW5lZFR5cGUoaSk7CisgICAgICBpZiAoU0UgIT0gREUgJiYgUmVjdXJzaXZlUmVzb2x2ZVR5cGVzSShERSwgU0UsIFBvaW50ZXJzKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjYXNlIFR5cGU6OkFycmF5VHlJRDogeworICAgIGNvbnN0IEFycmF5VHlwZSAqREFUID0gY2FzdDxBcnJheVR5cGU+KERzdFR5KTsKKyAgICBjb25zdCBBcnJheVR5cGUgKlNBVCA9IGNhc3Q8QXJyYXlUeXBlPihTcmNUeSk7CisgICAgaWYgKERBVC0+Z2V0TnVtRWxlbWVudHMoKSAhPSBTQVQtPmdldE51bUVsZW1lbnRzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBSZWN1cnNpdmVSZXNvbHZlVHlwZXNJKERBVC0+Z2V0RWxlbWVudFR5cGUoKSwgU0FULT5nZXRFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJzKTsKKyAgfQorICBjYXNlIFR5cGU6OlZlY3RvclR5SUQ6IHsKKyAgICBjb25zdCBWZWN0b3JUeXBlICpEVlQgPSBjYXN0PFZlY3RvclR5cGU+KERzdFR5KTsKKyAgICBjb25zdCBWZWN0b3JUeXBlICpTVlQgPSBjYXN0PFZlY3RvclR5cGU+KFNyY1R5KTsKKyAgICBpZiAoRFZULT5nZXROdW1FbGVtZW50cygpICE9IFNWVC0+Z2V0TnVtRWxlbWVudHMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFJlY3Vyc2l2ZVJlc29sdmVUeXBlc0koRFZULT5nZXRFbGVtZW50VHlwZSgpLCBTVlQtPmdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlcnMpOworICB9CisgIGNhc2UgVHlwZTo6UG9pbnRlclR5SUQ6IHsKKyAgICBjb25zdCBQb2ludGVyVHlwZSAqRHN0UFQgPSBjYXN0PFBvaW50ZXJUeXBlPihEc3RUeSk7CisgICAgY29uc3QgUG9pbnRlclR5cGUgKlNyY1BUID0gY2FzdDxQb2ludGVyVHlwZT4oU3JjVHkpOworCisgICAgaWYgKERzdFBULT5nZXRBZGRyZXNzU3BhY2UoKSAhPSBTcmNQVC0+Z2V0QWRkcmVzc1NwYWNlKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIElmIHRoaXMgaXMgYSBwb2ludGVyIHR5cGUsIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgc2VlbiBpdC4gIElmCisgICAgLy8gc28sIHdlIGFyZSBpbiBhIHJlY3Vyc2l2ZSBicmFuY2guICBDdXQgb2ZmIHRoZSBzZWFyY2ggbm93LiAgV2UgY2Fubm90IHVzZQorICAgIC8vIGFuIGFzc29jaWF0aXZlIGNvbnRhaW5lciBmb3IgdGhpcyBzZWFyY2gsIGJlY2F1c2UgdGhlIHR5cGUgcG9pbnRlcnMgKGtleXMKKyAgICAvLyBpbiB0aGUgY29udGFpbmVyKSBjaGFuZ2Ugd2hlbmV2ZXIgdHlwZXMgZ2V0IHJlc29sdmVkLgorICAgIGlmIChTcmNQVC0+aXNBYnN0cmFjdCgpKQorICAgICAgaWYgKGNvbnN0IFR5cGUgKkV4aXN0aW5nRGVzdFR5ID0gUG9pbnRlcnMubG9va3VwKFNyY1BUKSkKKyAgICAgICAgcmV0dXJuIEV4aXN0aW5nRGVzdFR5ICE9IERzdFBUOworCisgICAgaWYgKERzdFBULT5pc0Fic3RyYWN0KCkpCisgICAgICBpZiAoY29uc3QgVHlwZSAqRXhpc3RpbmdTcmNUeSA9IFBvaW50ZXJzLmxvb2t1cChEc3RQVCkpCisgICAgICAgIHJldHVybiBFeGlzdGluZ1NyY1R5ICE9IFNyY1BUOworICAgIC8vIE90aGVyd2lzZSwgYWRkIHRoZSBjdXJyZW50IHBvaW50ZXJzIHRvIHRoZSB2ZWN0b3IgdG8gc3RvcCByZWN1cnNpb24gb24KKyAgICAvLyB0aGlzIHBhaXIuCisgICAgaWYgKERzdFBULT5pc0Fic3RyYWN0KCkpCisgICAgICBQb2ludGVycy5pbnNlcnQoRHN0UFQsIFNyY1BUKTsKKyAgICBpZiAoU3JjUFQtPmlzQWJzdHJhY3QoKSkKKyAgICAgIFBvaW50ZXJzLmluc2VydChTcmNQVCwgRHN0UFQpOworCisgICAgcmV0dXJuIFJlY3Vyc2l2ZVJlc29sdmVUeXBlc0koRHN0UFQtPmdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjUFQtPmdldEVsZW1lbnRUeXBlKCksIFBvaW50ZXJzKTsKKyAgfQorICB9Cit9CisKK3N0YXRpYyBib29sIFJlY3Vyc2l2ZVJlc29sdmVUeXBlcyhjb25zdCBUeXBlICpEZXN0VHksIGNvbnN0IFR5cGUgKlNyY1R5KSB7CisgIExpbmtlclR5cGVNYXAgUG9pbnRlclR5cGVzOworICByZXR1cm4gUmVjdXJzaXZlUmVzb2x2ZVR5cGVzSShEZXN0VHksIFNyY1R5LCBQb2ludGVyVHlwZXMpOworfQorCisKKy8vIExpbmtUeXBlcyAtIEdvIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgU3JjIG1vZHVsZSBhbmQgc2VlIGlmIGFueQorLy8gdHlwZXMgYXJlIG5hbWVkIGluIHRoZSBzcmMgbW9kdWxlIHRoYXQgYXJlIG5vdCBuYW1lZCBpbiB0aGUgRHN0IG1vZHVsZS4KKy8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gdHlwZSBuYW1lIGNvbmZsaWN0cy4KK3N0YXRpYyBib29sIExpbmtUeXBlcyhNb2R1bGUgKkRlc3QsIGNvbnN0IE1vZHVsZSAqU3JjLCBzdGQ6OnN0cmluZyAqRXJyKSB7CisgICAgICAgIFR5cGVTeW1ib2xUYWJsZSAqRGVzdFNUID0gJkRlc3QtPmdldFR5cGVTeW1ib2xUYWJsZSgpOworICBjb25zdCBUeXBlU3ltYm9sVGFibGUgKlNyY1NUICA9ICZTcmMtPmdldFR5cGVTeW1ib2xUYWJsZSgpOworCisgIC8vIExvb2sgZm9yIGEgdHlwZSBwbGFuZSBmb3IgVHlwZSdzLi4uCisgIFR5cGVTeW1ib2xUYWJsZTo6Y29uc3RfaXRlcmF0b3IgVEkgPSBTcmNTVC0+YmVnaW4oKTsKKyAgVHlwZVN5bWJvbFRhYmxlOjpjb25zdF9pdGVyYXRvciBURSA9IFNyY1NULT5lbmQoKTsKKyAgaWYgKFRJID09IFRFKSByZXR1cm4gZmFsc2U7ICAvLyBObyBuYW1lZCB0eXBlcywgZG8gbm90aGluZy4KKworICAvLyBTb21lIHR5cGVzIGNhbm5vdCBiZSByZXNvbHZlZCBpbW1lZGlhdGVseSBiZWNhdXNlIHRoZXkgZGVwZW5kIG9uIG90aGVyCisgIC8vIHR5cGVzIGJlaW5nIHJlc29sdmVkIHRvIGVhY2ggb3RoZXIgZmlyc3QuICBUaGlzIGNvbnRhaW5zIGEgbGlzdCBvZiB0eXBlcyB3ZQorICAvLyBhcmUgd2FpdGluZyB0byByZWNoZWNrLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRGVsYXllZFR5cGVzVG9SZXNvbHZlOworCisgIGZvciAoIDsgVEkgIT0gVEU7ICsrVEkgKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUgPSBUSS0+Zmlyc3Q7CisgICAgY29uc3QgVHlwZSAqUkhTID0gVEktPnNlY29uZDsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHR5cGUgbmFtZSBpcyBhbHJlYWR5IGluIHRoZSBkZXN0IG1vZHVsZS4KKyAgICBUeXBlICpFbnRyeSA9IERlc3RTVC0+bG9va3VwKE5hbWUpOworCisgICAgLy8gSWYgdGhlIG5hbWUgaXMganVzdCBpbiB0aGUgc291cmNlIG1vZHVsZSwgYnJpbmcgaXQgb3ZlciB0byB0aGUgZGVzdC4KKyAgICBpZiAoRW50cnkgPT0gMCkgeworICAgICAgaWYgKCFOYW1lLmVtcHR5KCkpCisgICAgICAgIERlc3RTVC0+aW5zZXJ0KE5hbWUsIGNvbnN0X2Nhc3Q8VHlwZSo+KFJIUykpOworICAgIH0gZWxzZSBpZiAoUmVzb2x2ZVR5cGVzKEVudHJ5LCBSSFMpKSB7CisgICAgICAvLyBUaGV5IGxvb2sgZGlmZmVyZW50LCBzYXZlIHRoZSB0eXBlcyAndGlsbCBsYXRlciB0byByZXNvbHZlLgorICAgICAgRGVsYXllZFR5cGVzVG9SZXNvbHZlLnB1c2hfYmFjayhOYW1lKTsKKyAgICB9CisgIH0KKworICAvLyBJdGVyYXRpdmVseSByZXNvbHZlIHR5cGVzIHdoaWxlIHdlIGNhbi4uLgorICB3aGlsZSAoIURlbGF5ZWRUeXBlc1RvUmVzb2x2ZS5lbXB0eSgpKSB7CisgICAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdHlwZXMsIGF0dGVtcHRpbmcgdG8gcmVzb2x2ZSB0aGVtIGlmIHBvc3NpYmxlLi4uCisgICAgdW5zaWduZWQgT2xkU2l6ZSA9IERlbGF5ZWRUeXBlc1RvUmVzb2x2ZS5zaXplKCk7CisKKyAgICAvLyBUcnkgZGlyZWN0IHJlc29sdXRpb24gYnkgbmFtZS4uLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gRGVsYXllZFR5cGVzVG9SZXNvbHZlLnNpemUoKTsgKytpKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSA9IERlbGF5ZWRUeXBlc1RvUmVzb2x2ZVtpXTsKKyAgICAgIFR5cGUgKlQxID0gU3JjU1QtPmxvb2t1cChOYW1lKTsKKyAgICAgIFR5cGUgKlQyID0gRGVzdFNULT5sb29rdXAoTmFtZSk7CisgICAgICBpZiAoIVJlc29sdmVUeXBlcyhUMiwgVDEpKSB7CisgICAgICAgIC8vIFdlIGFyZSBtYWtpbmcgcHJvZ3Jlc3MhCisgICAgICAgIERlbGF5ZWRUeXBlc1RvUmVzb2x2ZS5lcmFzZShEZWxheWVkVHlwZXNUb1Jlc29sdmUuYmVnaW4oKStpKTsKKyAgICAgICAgLS1pOworICAgICAgfQorICAgIH0KKworICAgIC8vIERpZCB3ZSBub3QgZWxpbWluYXRlIGFueSB0eXBlcz8KKyAgICBpZiAoRGVsYXllZFR5cGVzVG9SZXNvbHZlLnNpemUoKSA9PSBPbGRTaXplKSB7CisgICAgICAvLyBBdHRlbXB0IHRvIHJlc29sdmUgc3ViZWxlbWVudHMgb2YgdHlwZXMuICBUaGlzIGFsbG93cyB1cyB0byBtZXJnZSB0aGVzZQorICAgICAgLy8gdHdvIHR5cGVzOiB7IGludCogfSBhbmQgeyBvcGFxdWUqIH0KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEZWxheWVkVHlwZXNUb1Jlc29sdmUuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSA9IERlbGF5ZWRUeXBlc1RvUmVzb2x2ZVtpXTsKKyAgICAgICAgaWYgKCFSZWN1cnNpdmVSZXNvbHZlVHlwZXMoU3JjU1QtPmxvb2t1cChOYW1lKSwgRGVzdFNULT5sb29rdXAoTmFtZSkpKSB7CisgICAgICAgICAgLy8gV2UgYXJlIG1ha2luZyBwcm9ncmVzcyEKKyAgICAgICAgICBEZWxheWVkVHlwZXNUb1Jlc29sdmUuZXJhc2UoRGVsYXllZFR5cGVzVG9SZXNvbHZlLmJlZ2luKCkraSk7CisKKyAgICAgICAgICAvLyBHbyBiYWNrIHRvIHRoZSBtYWluIGxvb3AsIHBlcmhhcHMgd2UgY2FuIHJlc29sdmUgZGlyZWN0bHkgYnkgbmFtZQorICAgICAgICAgIC8vIG5vdy4uLgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIFNUSUxMIGNhbm5vdCByZXNvbHZlIHRoZSB0eXBlcywgdGhlbiB0aGVyZSBpcyBzb21ldGhpbmcgd3JvbmcuCisgICAgICBpZiAoRGVsYXllZFR5cGVzVG9SZXNvbHZlLnNpemUoKSA9PSBPbGRTaXplKSB7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgc3ltYm9sIG5hbWUgZnJvbSB0aGUgZGVzdGluYXRpb24uCisgICAgICAgIERlbGF5ZWRUeXBlc1RvUmVzb2x2ZS5wb3BfYmFjaygpOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgcmV0dXJuIGZhbHNlOworfQorCisjaWZuZGVmIE5ERUJVRworc3RhdGljIHZvaWQgUHJpbnRNYXAoY29uc3Qgc3RkOjptYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+ICZNKSB7CisgIGZvciAoc3RkOjptYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID1NLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgZGJncygpIDw8ICIgRnI6ICIgPDwgKHZvaWQqKUktPmZpcnN0IDw8ICIgIjsKKyAgICBJLT5maXJzdC0+ZHVtcCgpOworICAgIGRiZ3MoKSA8PCAiIFRvOiAiIDw8ICh2b2lkKilJLT5zZWNvbmQgPDwgIiAiOworICAgIEktPnNlY29uZC0+ZHVtcCgpOworICAgIGRiZ3MoKSA8PCAiXG4iOworICB9Cit9CisjZW5kaWYKKworCisvLyBSZW1hcE9wZXJhbmQgLSBVc2UgVmFsdWVNYXAgdG8gY29udmVydCBjb25zdGFudHMgZnJvbSBvbmUgbW9kdWxlIHRvIGFub3RoZXIuCitzdGF0aWMgVmFsdWUgKlJlbWFwT3BlcmFuZChjb25zdCBWYWx1ZSAqSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxjb25zdCBWYWx1ZSosIFZhbHVlKj4gJlZhbHVlTWFwKSB7CisgIHN0ZDo6bWFwPGNvbnN0IFZhbHVlKixWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBJID0gVmFsdWVNYXAuZmluZChJbik7CisgIGlmIChJICE9IFZhbHVlTWFwLmVuZCgpKQorICAgIHJldHVybiBJLT5zZWNvbmQ7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgYSBjb25zdGFudCB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluIHRyYW5zZm9ybWluZy4KKyAgVmFsdWUgKlJlc3VsdCA9IDA7CisgIGlmIChjb25zdCBDb25zdGFudCAqQ1BWID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEluKSkgeworICAgIGlmICgoIWlzYTxEZXJpdmVkVHlwZT4oQ1BWLT5nZXRUeXBlKCkpICYmICFpc2E8Q29uc3RhbnRFeHByPihDUFYpKSB8fAorICAgICAgICBpc2E8Q29uc3RhbnRJbnQ+KENQVikgfHwgaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oQ1BWKSkKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PENvbnN0YW50Kj4oQ1BWKTsgICAvLyBTaW1wbGUgY29uc3RhbnRzIHN0YXkgaWRlbnRpY2FsLgorCisgICAgaWYgKGNvbnN0IENvbnN0YW50QXJyYXkgKkNQQSA9IGR5bl9jYXN0PENvbnN0YW50QXJyYXk+KENQVikpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gT3BlcmFuZHMoQ1BBLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUEEtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBPcGVyYW5kc1tpXSA9Y2FzdDxDb25zdGFudD4oUmVtYXBPcGVyYW5kKENQQS0+Z2V0T3BlcmFuZChpKSwgVmFsdWVNYXApKTsKKyAgICAgIFJlc3VsdCA9IENvbnN0YW50QXJyYXk6OmdldChjYXN0PEFycmF5VHlwZT4oQ1BBLT5nZXRUeXBlKCkpLCBPcGVyYW5kcyk7CisgICAgfSBlbHNlIGlmIChjb25zdCBDb25zdGFudFN0cnVjdCAqQ1BTID0gZHluX2Nhc3Q8Q29uc3RhbnRTdHJ1Y3Q+KENQVikpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gT3BlcmFuZHMoQ1BTLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUFMtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBPcGVyYW5kc1tpXSA9Y2FzdDxDb25zdGFudD4oUmVtYXBPcGVyYW5kKENQUy0+Z2V0T3BlcmFuZChpKSwgVmFsdWVNYXApKTsKKyAgICAgIFJlc3VsdCA9IENvbnN0YW50U3RydWN0OjpnZXQoY2FzdDxTdHJ1Y3RUeXBlPihDUFMtPmdldFR5cGUoKSksIE9wZXJhbmRzKTsKKyAgICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihDUFYpIHx8IGlzYTxVbmRlZlZhbHVlPihDUFYpKSB7CisgICAgICBSZXN1bHQgPSBjb25zdF9jYXN0PENvbnN0YW50Kj4oQ1BWKTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50VmVjdG9yICpDUCA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihDUFYpKSB7CisgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IE9wZXJhbmRzKENQLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIE9wZXJhbmRzW2ldID0gY2FzdDxDb25zdGFudD4oUmVtYXBPcGVyYW5kKENQLT5nZXRPcGVyYW5kKGkpLCBWYWx1ZU1hcCkpOworICAgICAgUmVzdWx0ID0gQ29uc3RhbnRWZWN0b3I6OmdldChPcGVyYW5kcyk7CisgICAgfSBlbHNlIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDUFYpKSB7CisgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IE9wczsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDRS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIE9wcy5wdXNoX2JhY2soY2FzdDxDb25zdGFudD4oUmVtYXBPcGVyYW5kKENFLT5nZXRPcGVyYW5kKGkpLFZhbHVlTWFwKSkpOworICAgICAgUmVzdWx0ID0gQ0UtPmdldFdpdGhPcGVyYW5kcyhPcHMpOworICAgIH0gZWxzZSBpZiAoY29uc3QgQmxvY2tBZGRyZXNzICpDRSA9IGR5bl9jYXN0PEJsb2NrQWRkcmVzcz4oQ1BWKSkgeworICAgICAgUmVzdWx0ID0gQmxvY2tBZGRyZXNzOjpnZXQoCisgICAgICAgICAgICAgICAgIGNhc3Q8RnVuY3Rpb24+KFJlbWFwT3BlcmFuZChDRS0+Z2V0RnVuY3Rpb24oKSwgVmFsdWVNYXApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFLT5nZXRCYXNpY0Jsb2NrKCkpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoIWlzYTxHbG9iYWxWYWx1ZT4oQ1BWKSAmJiAiVW5tYXBwZWQgZ2xvYmFsPyIpOworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB0eXBlIG9mIGRlcml2ZWQgdHlwZSBjb25zdGFudCB2YWx1ZSEiKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoY29uc3QgTUROb2RlICpNRCA9IGR5bl9jYXN0PE1ETm9kZT4oSW4pKSB7CisgICAgaWYgKE1ELT5pc0Z1bmN0aW9uTG9jYWwoKSkgeworICAgICAgU21hbGxWZWN0b3I8VmFsdWUqLCA0PiBFbHRzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1ELT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBpZiAoTUQtPmdldE9wZXJhbmQoaSkpCisgICAgICAgICAgRWx0cy5wdXNoX2JhY2soUmVtYXBPcGVyYW5kKE1ELT5nZXRPcGVyYW5kKGkpLCBWYWx1ZU1hcCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgRWx0cy5wdXNoX2JhY2soTlVMTCk7CisgICAgICB9CisgICAgICBSZXN1bHQgPSBNRE5vZGU6OmdldChJbi0+Z2V0Q29udGV4dCgpLCBFbHRzLmRhdGEoKSwgTUQtPmdldE51bU9wZXJhbmRzKCkpOworICAgIH0gZWxzZSB7CisgICAgICBSZXN1bHQgPSBjb25zdF9jYXN0PFZhbHVlKj4oSW4pOworICAgIH0KKyAgfSBlbHNlIGlmIChpc2E8TURTdHJpbmc+KEluKSB8fCBpc2E8SW5saW5lQXNtPihJbikgfHwgaXNhPEluc3RydWN0aW9uPihJbikpIHsKKyAgICBSZXN1bHQgPSBjb25zdF9jYXN0PFZhbHVlKj4oSW4pOworICB9CisKKyAgLy8gQ2FjaGUgdGhlIG1hcHBpbmcgaW4gb3VyIGxvY2FsIG1hcCBzdHJ1Y3R1cmUKKyAgaWYgKFJlc3VsdCkgeworICAgIFZhbHVlTWFwW0luXSA9IFJlc3VsdDsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyNpZm5kZWYgTkRFQlVHCisgIGRiZ3MoKSA8PCAiTGlua01vZHVsZXMgVmFsdWVNYXA6IFxuIjsKKyAgUHJpbnRNYXAoVmFsdWVNYXApOworCisgIGRiZ3MoKSA8PCAiQ291bGRuJ3QgcmVtYXAgdmFsdWU6ICIgPDwgKHZvaWQqKUluIDw8ICIgIiA8PCAqSW4gPDwgIlxuIjsKKyAgbGx2bV91bnJlYWNoYWJsZSgiQ291bGRuJ3QgcmVtYXAgdmFsdWUhIik7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBGb3JjZVJlbmFtaW5nIC0gVGhlIExMVk0gU3ltYm9sVGFibGUgY2xhc3MgYXV0b3JlbmFtZXMgZ2xvYmFscyB0aGF0IGNvbmZsaWN0CisvLy8gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgZ29vZCBmb3IgYWxsIGNsaWVudHMgZXhjZXB0IGZvciB1cy4gIEdvCisvLy8gdGhyb3VnaCB0aGUgdHJvdWJsZSB0byBmb3JjZSB0aGlzIGJhY2suCitzdGF0aWMgdm9pZCBGb3JjZVJlbmFtaW5nKEdsb2JhbFZhbHVlICpHViwgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgYXNzZXJ0KEdWLT5nZXROYW1lKCkgIT0gTmFtZSAmJiAiQ2FuJ3QgZm9yY2UgcmVuYW1lIHRvIHNlbGYiKTsKKyAgVmFsdWVTeW1ib2xUYWJsZSAmU1QgPSBHVi0+Z2V0UGFyZW50KCktPmdldFZhbHVlU3ltYm9sVGFibGUoKTsKKworICAvLyBJZiB0aGVyZSBpcyBhIGNvbmZsaWN0LCByZW5hbWUgdGhlIGNvbmZsaWN0LgorICBpZiAoR2xvYmFsVmFsdWUgKkNvbmZsaWN0R1YgPSBjYXN0X29yX251bGw8R2xvYmFsVmFsdWU+KFNULmxvb2t1cChOYW1lKSkpIHsKKyAgICBhc3NlcnQoQ29uZmxpY3RHVi0+aGFzTG9jYWxMaW5rYWdlKCkgJiYKKyAgICAgICAgICAgIk5vdCBjb25mbGljdGluZyB3aXRoIGEgc3RhdGljIGdsb2JhbCwgc2hvdWxkIGxpbmsgaW5zdGVhZCEiKTsKKyAgICBHVi0+dGFrZU5hbWUoQ29uZmxpY3RHVik7CisgICAgQ29uZmxpY3RHVi0+c2V0TmFtZShOYW1lKTsgICAgLy8gVGhpcyB3aWxsIGNhdXNlIENvbmZsaWN0R1YgdG8gZ2V0IHJlbmFtZWQKKyAgICBhc3NlcnQoQ29uZmxpY3RHVi0+Z2V0TmFtZSgpICE9IE5hbWUgJiYgIkZvcmNlUmVuYW1pbmcgZGlkbid0IHdvcmsiKTsKKyAgfSBlbHNlIHsKKyAgICBHVi0+c2V0TmFtZShOYW1lKTsgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBuYW1lIGJhY2sKKyAgfQorfQorCisvLy8gQ29weUdWQXR0cmlidXRlcyAtIGNvcHkgYWRkaXRpb25hbCBhdHRyaWJ1dGVzICh0aG9zZSBub3QgbmVlZGVkIHRvIGNvbnN0cnVjdAorLy8vIGEgR2xvYmFsVmFsdWUpIGZyb20gdGhlIFNyY0dWIHRvIHRoZSBEZXN0R1YuCitzdGF0aWMgdm9pZCBDb3B5R1ZBdHRyaWJ1dGVzKEdsb2JhbFZhbHVlICpEZXN0R1YsIGNvbnN0IEdsb2JhbFZhbHVlICpTcmNHVikgeworICAvLyBVc2UgdGhlIG1heGltdW0gYWxpZ25tZW50LCByYXRoZXIgdGhhbiBqdXN0IGNvcHlpbmcgdGhlIGFsaWdubWVudCBvZiBTcmNHVi4KKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gc3RkOjptYXgoRGVzdEdWLT5nZXRBbGlnbm1lbnQoKSwgU3JjR1YtPmdldEFsaWdubWVudCgpKTsKKyAgRGVzdEdWLT5jb3B5QXR0cmlidXRlc0Zyb20oU3JjR1YpOworICBEZXN0R1YtPnNldEFsaWdubWVudChBbGlnbm1lbnQpOworfQorCisvLy8gR2V0TGlua2FnZVJlc3VsdCAtIFRoaXMgYW5hbHl6ZXMgdGhlIHR3byBnbG9iYWwgdmFsdWVzIGFuZCBkZXRlcm1pbmVzIHdoYXQKKy8vLyB0aGUgcmVzdWx0IHdpbGwgbG9vayBsaWtlIGluIHRoZSBkZXN0aW5hdGlvbiBtb2R1bGUuICBJbiBwYXJ0aWN1bGFyLCBpdAorLy8vIGNvbXB1dGVzIHRoZSByZXN1bHRhbnQgbGlua2FnZSB0eXBlLCBjb21wdXRlcyB3aGV0aGVyIHRoZSBnbG9iYWwgaW4gdGhlCisvLy8gc291cmNlIHNob3VsZCBiZSBjb3BpZWQgb3ZlciB0byB0aGUgZGVzdGluYXRpb24gKHJlcGxhY2luZyB0aGUgZXhpc3RpbmcKKy8vLyBvbmUpLCBhbmQgY29tcHV0ZXMgd2hldGhlciB0aGlzIGxpbmthZ2UgaXMgYW4gZXJyb3Igb3Igbm90LiBJdCBhbHNvIHBlcmZvcm1zCisvLy8gdmlzaWJpbGl0eSBjaGVja3M6IHdlIGNhbm5vdCBsaW5rIHRvZ2V0aGVyIHR3byBzeW1ib2xzIHdpdGggZGlmZmVyZW50CisvLy8gdmlzaWJpbGl0aWVzLgorc3RhdGljIGJvb2wgR2V0TGlua2FnZVJlc3VsdChHbG9iYWxWYWx1ZSAqRGVzdCwgY29uc3QgR2xvYmFsVmFsdWUgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyAmTFQsIGJvb2wgJkxpbmtGcm9tU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyKSB7CisgIGFzc2VydCgoIURlc3QgfHwgIVNyYy0+aGFzTG9jYWxMaW5rYWdlKCkpICYmCisgICAgICAgICAiSWYgU3JjIGhhcyBpbnRlcm5hbCBsaW5rYWdlLCBEZXN0IHNob3VsZG4ndCBiZSBzZXQhIik7CisgIGlmICghRGVzdCkgeworICAgIC8vIExpbmtpbmcgc29tZXRoaW5nIHRvIG5vdGhpbmcuCisgICAgTGlua0Zyb21TcmMgPSB0cnVlOworICAgIExUID0gU3JjLT5nZXRMaW5rYWdlKCk7CisgIH0gZWxzZSBpZiAoU3JjLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAvLyBJZiBTcmMgaXMgZXh0ZXJuYWwgb3IgaWYgYm90aCBTcmMgJiBEZXN0IGFyZSBleHRlcm5hbC4uICBKdXN0IGxpbmsgdGhlCisgICAgLy8gZXh0ZXJuYWwgZ2xvYmFscywgd2UgYXJlbid0IGFkZGluZyBhbnl0aGluZy4KKyAgICBpZiAoU3JjLT5oYXNETExJbXBvcnRMaW5rYWdlKCkpIHsKKyAgICAgIC8vIElmIG9uZSBvZiBHVnMgaGFzIERMTEltcG9ydCBsaW5rYWdlLCByZXN1bHQgc2hvdWxkIGJlIGRsbGltcG9ydCdlZC4KKyAgICAgIGlmIChEZXN0LT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgICAgTGlua0Zyb21TcmMgPSB0cnVlOworICAgICAgICBMVCA9IFNyYy0+Z2V0TGlua2FnZSgpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoRGVzdC0+aGFzRXh0ZXJuYWxXZWFrTGlua2FnZSgpKSB7CisgICAgICAvLyBJZiB0aGUgRGVzdCBpcyB3ZWFrLCB1c2UgdGhlIHNvdXJjZSBsaW5rYWdlLgorICAgICAgTGlua0Zyb21TcmMgPSB0cnVlOworICAgICAgTFQgPSBTcmMtPmdldExpbmthZ2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgTGlua0Zyb21TcmMgPSBmYWxzZTsKKyAgICAgIExUID0gRGVzdC0+Z2V0TGlua2FnZSgpOworICAgIH0KKyAgfSBlbHNlIGlmIChEZXN0LT5pc0RlY2xhcmF0aW9uKCkgJiYgIURlc3QtPmhhc0RMTEltcG9ydExpbmthZ2UoKSkgeworICAgIC8vIElmIERlc3QgaXMgZXh0ZXJuYWwgYnV0IFNyYyBpcyBub3Q6CisgICAgTGlua0Zyb21TcmMgPSB0cnVlOworICAgIExUID0gU3JjLT5nZXRMaW5rYWdlKCk7CisgIH0gZWxzZSBpZiAoU3JjLT5oYXNBcHBlbmRpbmdMaW5rYWdlKCkgfHwgRGVzdC0+aGFzQXBwZW5kaW5nTGlua2FnZSgpKSB7CisgICAgaWYgKFNyYy0+Z2V0TGlua2FnZSgpICE9IERlc3QtPmdldExpbmthZ2UoKSkKKyAgICAgIHJldHVybiBFcnJvcihFcnIsICJMaW5raW5nIGdsb2JhbHMgbmFtZWQgJyIgKyBTcmMtPmdldE5hbWUoKSArCisgICAgICAgICAgICAiJzogY2FuIG9ubHkgbGluayBhcHBlbmRpbmcgZ2xvYmFsIHdpdGggYW5vdGhlciBhcHBlbmRpbmcgZ2xvYmFsISIpOworICAgIExpbmtGcm9tU3JjID0gdHJ1ZTsgLy8gU3BlY2lhbCBjYXNlZC4KKyAgICBMVCA9IFNyYy0+Z2V0TGlua2FnZSgpOworICB9IGVsc2UgaWYgKFNyYy0+aXNXZWFrRm9yTGlua2VyKCkpIHsKKyAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBEZXN0IGhhcyBMaW5rT25jZSwgRXh0ZXJuYWwqLCBXZWFrLCBDb21tb24sCisgICAgLy8gb3IgRExMKiBsaW5rYWdlLgorICAgIGlmIChEZXN0LT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkgfHwKKyAgICAgICAgRGVzdC0+aGFzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoKSB8fAorICAgICAgICAoRGVzdC0+aGFzTGlua09uY2VMaW5rYWdlKCkgJiYKKyAgICAgICAgIChTcmMtPmhhc1dlYWtMaW5rYWdlKCkgfHwgU3JjLT5oYXNDb21tb25MaW5rYWdlKCkpKSkgeworICAgICAgTGlua0Zyb21TcmMgPSB0cnVlOworICAgICAgTFQgPSBTcmMtPmdldExpbmthZ2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgTGlua0Zyb21TcmMgPSBmYWxzZTsKKyAgICAgIExUID0gRGVzdC0+Z2V0TGlua2FnZSgpOworICAgIH0KKyAgfSBlbHNlIGlmIChEZXN0LT5pc1dlYWtGb3JMaW5rZXIoKSkgeworICAgIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IFNyYyBoYXMgRXh0ZXJuYWwqIG9yIERMTCogbGlua2FnZS4KKyAgICBpZiAoU3JjLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkpIHsKKyAgICAgIExpbmtGcm9tU3JjID0gZmFsc2U7CisgICAgICBMVCA9IERlc3QtPmdldExpbmthZ2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgTGlua0Zyb21TcmMgPSB0cnVlOworICAgICAgTFQgPSBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoKERlc3QtPmhhc0V4dGVybmFsTGlua2FnZSgpIHx8CisgICAgICAgICAgICBEZXN0LT5oYXNETExJbXBvcnRMaW5rYWdlKCkgfHwKKyAgICAgICAgICAgIERlc3QtPmhhc0RMTEV4cG9ydExpbmthZ2UoKSB8fAorICAgICAgICAgICAgRGVzdC0+aGFzRXh0ZXJuYWxXZWFrTGlua2FnZSgpKSAmJgorICAgICAgICAgICAoU3JjLT5oYXNFeHRlcm5hbExpbmthZ2UoKSB8fAorICAgICAgICAgICAgU3JjLT5oYXNETExJbXBvcnRMaW5rYWdlKCkgfHwKKyAgICAgICAgICAgIFNyYy0+aGFzRExMRXhwb3J0TGlua2FnZSgpIHx8CisgICAgICAgICAgICBTcmMtPmhhc0V4dGVybmFsV2Vha0xpbmthZ2UoKSkgJiYKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQgbGlua2FnZSB0eXBlISIpOworICAgIHJldHVybiBFcnJvcihFcnIsICJMaW5raW5nIGdsb2JhbHMgbmFtZWQgJyIgKyBTcmMtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICInOiBzeW1ib2wgbXVsdGlwbHkgZGVmaW5lZCEiKTsKKyAgfQorCisgIC8vIENoZWNrIHZpc2liaWxpdHkKKyAgaWYgKERlc3QgJiYgU3JjLT5nZXRWaXNpYmlsaXR5KCkgIT0gRGVzdC0+Z2V0VmlzaWJpbGl0eSgpKQorICAgIGlmICghU3JjLT5pc0RlY2xhcmF0aW9uKCkgJiYgIURlc3QtPmlzRGVjbGFyYXRpb24oKSkKKyAgICAgIHJldHVybiBFcnJvcihFcnIsICJMaW5raW5nIGdsb2JhbHMgbmFtZWQgJyIgKyBTcmMtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgIic6IHN5bWJvbHMgaGF2ZSBkaWZmZXJlbnQgdmlzaWJpbGl0aWVzISIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEluc2VydCBhbGwgb2YgdGhlIG5hbWVkIG1kbm9lcyBpbiBTcmMgaW50byB0aGUgRGVzdCBtb2R1bGUuCitzdGF0aWMgdm9pZCBMaW5rTmFtZWRNRE5vZGVzKE1vZHVsZSAqRGVzdCwgTW9kdWxlICpTcmMpIHsKKyAgZm9yIChNb2R1bGU6OmNvbnN0X25hbWVkX21ldGFkYXRhX2l0ZXJhdG9yIEkgPSBTcmMtPm5hbWVkX21ldGFkYXRhX2JlZ2luKCksCisgICAgICAgICBFID0gU3JjLT5uYW1lZF9tZXRhZGF0YV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBOYW1lZE1ETm9kZSAqU3JjTk1EID0gSTsKKyAgICBOYW1lZE1ETm9kZSAqRGVzdE5NRCA9IERlc3QtPmdldE9ySW5zZXJ0TmFtZWRNZXRhZGF0YShTcmNOTUQtPmdldE5hbWUoKSk7CisgICAgLy8gQWRkIFNyYyBlbGVtZW50cyBpbnRvIERlc3Qgbm9kZS4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3JjTk1ELT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgCisgICAgICBEZXN0Tk1ELT5hZGRPcGVyYW5kKFNyY05NRC0+Z2V0T3BlcmFuZChpKSk7CisgIH0KK30KKworLy8gTGlua0dsb2JhbHMgLSBMb29wIHRocm91Z2ggdGhlIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIHNyYyBtb2R1bGUgYW5kIG1lcmdlCisvLyB0aGVtIGludG8gdGhlIGRlc3QgbW9kdWxlLgorc3RhdGljIGJvb2wgTGlua0dsb2JhbHMoTW9kdWxlICpEZXN0LCBjb25zdCBNb2R1bGUgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGNvbnN0IFZhbHVlKiwgVmFsdWUqPiAmVmFsdWVNYXAsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bXVsdGltYXA8c3RkOjpzdHJpbmcsIEdsb2JhbFZhcmlhYmxlICo+ICZBcHBlbmRpbmdWYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVycikgeworICBWYWx1ZVN5bWJvbFRhYmxlICZEZXN0U3ltVGFiID0gRGVzdC0+Z2V0VmFsdWVTeW1ib2xUYWJsZSgpOworCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIGdsb2JhbHMgaW4gdGhlIHNyYyBtb2R1bGUsIG1hcHBpbmcgdGhlbSBvdmVyIGFzIHdlIGdvCisgIGZvciAoTW9kdWxlOjpjb25zdF9nbG9iYWxfaXRlcmF0b3IgSSA9IFNyYy0+Z2xvYmFsX2JlZ2luKCksCisgICAgICAgRSA9IFNyYy0+Z2xvYmFsX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IEdsb2JhbFZhcmlhYmxlICpTR1YgPSBJOworICAgIEdsb2JhbFZhbHVlICpER1YgPSAwOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG1heSBoYXZlIHRvIGxpbmsgdGhlIGdsb2JhbCB3aXRoIHRoZSBnbG9iYWwsIGFsaWFzIG9yCisgICAgLy8gZnVuY3Rpb24uCisgICAgaWYgKFNHVi0+aGFzTmFtZSgpICYmICFTR1YtPmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgREdWID0gY2FzdF9vcl9udWxsPEdsb2JhbFZhbHVlPihEZXN0U3ltVGFiLmxvb2t1cChTR1YtPmdldE5hbWUoKSkpOworCisgICAgLy8gSWYgd2UgZm91bmQgYSBnbG9iYWwgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSBkZXN0IG1vZHVsZSwgYnV0IGl0IGhhcworICAgIC8vIGludGVybmFsIGxpbmthZ2UsIHdlIGFyZSByZWFsbHkgbm90IGRvaW5nIGFueSBsaW5rYWdlIGhlcmUuCisgICAgaWYgKERHViAmJiBER1YtPmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgREdWID0gMDsKKworICAgIC8vIElmIHR5cGVzIGRvbid0IGFncmVlIGR1ZSB0byBvcGFxdWUgdHlwZXMsIHRyeSB0byByZXNvbHZlIHRoZW0uCisgICAgaWYgKERHViAmJiBER1YtPmdldFR5cGUoKSAhPSBTR1YtPmdldFR5cGUoKSkKKyAgICAgIFJlY3Vyc2l2ZVJlc29sdmVUeXBlcyhTR1YtPmdldFR5cGUoKSwgREdWLT5nZXRUeXBlKCkpOworCisgICAgYXNzZXJ0KChTR1YtPmhhc0luaXRpYWxpemVyKCkgfHwgU0dWLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkgfHwKKyAgICAgICAgICAgIFNHVi0+aGFzRXh0ZXJuYWxMaW5rYWdlKCkgfHwgU0dWLT5oYXNETExJbXBvcnRMaW5rYWdlKCkpICYmCisgICAgICAgICAgICJHbG9iYWwgbXVzdCBlaXRoZXIgYmUgZXh0ZXJuYWwgb3IgaGF2ZSBhbiBpbml0aWFsaXplciEiKTsKKworICAgIEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTmV3TGlua2FnZSA9IEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2U7CisgICAgYm9vbCBMaW5rRnJvbVNyYyA9IGZhbHNlOworICAgIGlmIChHZXRMaW5rYWdlUmVzdWx0KERHViwgU0dWLCBOZXdMaW5rYWdlLCBMaW5rRnJvbVNyYywgRXJyKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKERHViA9PSAwKSB7CisgICAgICAvLyBObyBsaW5raW5nIHRvIGJlIHBlcmZvcm1lZCwgc2ltcGx5IGNyZWF0ZSBhbiBpZGVudGljYWwgdmVyc2lvbiBvZiB0aGUKKyAgICAgIC8vIHN5bWJvbCBvdmVyIGluIHRoZSBkZXN0IG1vZHVsZS4uLiB0aGUgaW5pdGlhbGl6ZXIgd2lsbCBiZSBmaWxsZWQgaW4KKyAgICAgIC8vIGxhdGVyIGJ5IExpbmtHbG9iYWxJbml0cy4KKyAgICAgIEdsb2JhbFZhcmlhYmxlICpOZXdER1YgPQorICAgICAgICBuZXcgR2xvYmFsVmFyaWFibGUoKkRlc3QsIFNHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0dWLT5pc0NvbnN0YW50KCksIFNHVi0+Z2V0TGlua2FnZSgpLCAvKmluaXQqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTR1YtPmdldE5hbWUoKSwgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTR1YtPmdldFR5cGUoKS0+Z2V0QWRkcmVzc1NwYWNlKCkpOworICAgICAgLy8gUHJvcGFnYXRlIGFsaWdubWVudCwgdmlzaWJpbGl0eSBhbmQgc2VjdGlvbiBpbmZvLgorICAgICAgQ29weUdWQXR0cmlidXRlcyhOZXdER1YsIFNHVik7CisKKyAgICAgIC8vIElmIHRoZSBMTFZNIHJ1bnRpbWUgcmVuYW1lZCB0aGUgZ2xvYmFsLCBidXQgaXQgaXMgYW4gZXh0ZXJuYWxseSB2aXNpYmxlCisgICAgICAvLyBzeW1ib2wsIERHViBtdXN0IGJlIGFuIGV4aXN0aW5nIGdsb2JhbCB3aXRoIGludGVybmFsIGxpbmthZ2UuICBSZW5hbWUKKyAgICAgIC8vIGl0LgorICAgICAgaWYgKCFOZXdER1YtPmhhc0xvY2FsTGlua2FnZSgpICYmIE5ld0RHVi0+Z2V0TmFtZSgpICE9IFNHVi0+Z2V0TmFtZSgpKQorICAgICAgICBGb3JjZVJlbmFtaW5nKE5ld0RHViwgU0dWLT5nZXROYW1lKCkpOworCisgICAgICAvLyBNYWtlIHN1cmUgdG8gcmVtZW1iZXIgdGhpcyBtYXBwaW5nLgorICAgICAgVmFsdWVNYXBbU0dWXSA9IE5ld0RHVjsKKworICAgICAgLy8gS2VlcCB0cmFjayB0aGF0IHRoaXMgaXMgYW4gYXBwZW5kaW5nIHZhcmlhYmxlLgorICAgICAgaWYgKFNHVi0+aGFzQXBwZW5kaW5nTGlua2FnZSgpKQorICAgICAgICBBcHBlbmRpbmdWYXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihTR1YtPmdldE5hbWUoKSwgTmV3REdWKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgdmlzaWJpbGl0aWVzIG9mIHRoZSBzeW1ib2xzIGRpc2FncmVlIGFuZCB0aGUgZGVzdGluYXRpb24gaXMgYQorICAgIC8vIHByb3RvdHlwZSwgdGFrZSB0aGUgdmlzaWJpbGl0eSBvZiBpdHMgaW5wdXQuCisgICAgaWYgKERHVi0+aXNEZWNsYXJhdGlvbigpKQorICAgICAgREdWLT5zZXRWaXNpYmlsaXR5KFNHVi0+Z2V0VmlzaWJpbGl0eSgpKTsKKworICAgIGlmIChER1YtPmhhc0FwcGVuZGluZ0xpbmthZ2UoKSkgeworICAgICAgLy8gTm8gbGlua2luZyBpcyBwZXJmb3JtZWQgeWV0LiAgSnVzdCBpbnNlcnQgYSBuZXcgY29weSBvZiB0aGUgZ2xvYmFsLCBhbmQKKyAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIGZhY3QgdGhhdCBpdCBpcyBhbiBhcHBlbmRpbmcgdmFyaWFibGUgaW4gdGhlCisgICAgICAvLyBBcHBlbmRpbmdWYXJzIG1hcC4gIFRoZSBuYW1lIGlzIGNsZWFyZWQgb3V0IHNvIHRoYXQgbm8gbGlua2FnZSBpcworICAgICAgLy8gcGVyZm9ybWVkLgorICAgICAgR2xvYmFsVmFyaWFibGUgKk5ld0RHViA9CisgICAgICAgIG5ldyBHbG9iYWxWYXJpYWJsZSgqRGVzdCwgU0dWLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTR1YtPmlzQ29uc3RhbnQoKSwgU0dWLT5nZXRMaW5rYWdlKCksIC8qaW5pdCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNHVi0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSk7CisKKyAgICAgIC8vIFNldCBhbGlnbm1lbnQgYWxsb3dpbmcgQ29weUdWQXR0cmlidXRlcyBtZXJnZSBpdCB3aXRoIGFsaWdubWVudCBvZiBTR1YuCisgICAgICBOZXdER1YtPnNldEFsaWdubWVudChER1YtPmdldEFsaWdubWVudCgpKTsKKyAgICAgIC8vIFByb3BhZ2F0ZSBhbGlnbm1lbnQsIHNlY3Rpb24gYW5kIHZpc2liaWxpdHkgaW5mby4KKyAgICAgIENvcHlHVkF0dHJpYnV0ZXMoTmV3REdWLCBTR1YpOworCisgICAgICAvLyBNYWtlIHN1cmUgdG8gcmVtZW1iZXIgdGhpcyBtYXBwaW5nLi4uCisgICAgICBWYWx1ZU1hcFtTR1ZdID0gTmV3REdWOworCisgICAgICAvLyBLZWVwIHRyYWNrIHRoYXQgdGhpcyBpcyBhbiBhcHBlbmRpbmcgdmFyaWFibGUuLi4KKyAgICAgIEFwcGVuZGluZ1ZhcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFNHVi0+Z2V0TmFtZSgpLCBOZXdER1YpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChMaW5rRnJvbVNyYykgeworICAgICAgaWYgKGlzYTxHbG9iYWxBbGlhcz4oREdWKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKEVyciwgIkdsb2JhbC1BbGlhcyBDb2xsaXNpb24gb24gJyIgKyBTR1YtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAiJzogc3ltYm9sIG11bHRpcGxlIGRlZmluZWQiKTsKKworICAgICAgLy8gSWYgdGhlIHR5cGVzIGRvbid0IG1hdGNoLCBhbmQgaWYgd2UgYXJlIHRvIGxpbmsgZnJvbSB0aGUgc291cmNlLCBudWtlCisgICAgICAvLyBER1YgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuICBOb3RlIHRoYXQgdGhlIHRoaW5nCisgICAgICAvLyB3ZSBhcmUgcmVwbGFjaW5nIG1heSBiZSBhIGZ1bmN0aW9uIChpZiBhIHByb3RvdHlwZSwgd2VhaywgZXRjKSBvciBhCisgICAgICAvLyBnbG9iYWwgdmFyaWFibGUuCisgICAgICBHbG9iYWxWYXJpYWJsZSAqTmV3REdWID0KKyAgICAgICAgbmV3IEdsb2JhbFZhcmlhYmxlKCpEZXN0LCBTR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTR1YtPmlzQ29uc3RhbnQoKSwgTmV3TGlua2FnZSwgLyppbml0Ki8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERHVi0+Z2V0TmFtZSgpLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNHVi0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSk7CisKKyAgICAgIC8vIFByb3BhZ2F0ZSBhbGlnbm1lbnQsIHNlY3Rpb24sIGFuZCB2aXNpYmlsaXR5IGluZm8uCisgICAgICBDb3B5R1ZBdHRyaWJ1dGVzKE5ld0RHViwgU0dWKTsKKyAgICAgIERHVi0+cmVwbGFjZUFsbFVzZXNXaXRoKENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChOZXdER1YsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBER1YtPmdldFR5cGUoKSkpOworCisgICAgICAvLyBER1Ygd2lsbCBjb25mbGljdCB3aXRoIE5ld0RHViBiZWNhdXNlIHRoZXkgYm90aCBoYWQgdGhlIHNhbWUKKyAgICAgIC8vIG5hbWUuIFdlIG11c3QgZXJhc2UgdGhpcyBub3cgc28gRm9yY2VSZW5hbWluZyBkb2Vzbid0IGFzc2VydAorICAgICAgLy8gYmVjYXVzZSBER1YgbWlnaHQgbm90IGhhdmUgaW50ZXJuYWwgbGlua2FnZS4KKyAgICAgIGlmIChHbG9iYWxWYXJpYWJsZSAqVmFyID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KERHVikpCisgICAgICAgIFZhci0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBlbHNlCisgICAgICAgIGNhc3Q8RnVuY3Rpb24+KERHViktPmVyYXNlRnJvbVBhcmVudCgpOworCisgICAgICAvLyBJZiB0aGUgc3ltYm9sIHRhYmxlIHJlbmFtZWQgdGhlIGdsb2JhbCwgYnV0IGl0IGlzIGFuIGV4dGVybmFsbHkgdmlzaWJsZQorICAgICAgLy8gc3ltYm9sLCBER1YgbXVzdCBiZSBhbiBleGlzdGluZyBnbG9iYWwgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgUmVuYW1lLgorICAgICAgaWYgKE5ld0RHVi0+Z2V0TmFtZSgpICE9IFNHVi0+Z2V0TmFtZSgpICYmICFOZXdER1YtPmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgICBGb3JjZVJlbmFtaW5nKE5ld0RHViwgU0dWLT5nZXROYW1lKCkpOworCisgICAgICAvLyBJbmhlcml0IGNvbnN0IGFzIGFwcHJvcHJpYXRlLgorICAgICAgTmV3REdWLT5zZXRDb25zdGFudChTR1YtPmlzQ29uc3RhbnQoKSk7CisKKyAgICAgIC8vIE1ha2Ugc3VyZSB0byByZW1lbWJlciB0aGlzIG1hcHBpbmcuCisgICAgICBWYWx1ZU1hcFtTR1ZdID0gTmV3REdWOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gTm90ICJsaW5rIGZyb20gc291cmNlIiwga2VlcCB0aGUgb25lIGluIHRoZSBEZXN0TW9kdWxlIGFuZCByZW1hcCB0aGUKKyAgICAvLyBpbnB1dCBvbnRvIGl0LgorCisgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBjb25zdCBwcm9wYWdhdGlvbi4KKyAgICBpZiAoR2xvYmFsVmFyaWFibGUgKkRHVmFyID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KERHVikpCisgICAgICBpZiAoREdWYXItPmlzRGVjbGFyYXRpb24oKSAmJiBTR1YtPmlzQ29uc3RhbnQoKSAmJiAhREdWYXItPmlzQ29uc3RhbnQoKSkKKyAgICAgICAgREdWYXItPnNldENvbnN0YW50KHRydWUpOworCisgICAgLy8gU0dWIGlzIGdsb2JhbCwgYnV0IERHViBpcyBhbGlhcy4KKyAgICBpZiAoaXNhPEdsb2JhbEFsaWFzPihER1YpKSB7CisgICAgICAvLyBUaGUgb25seSB2YWxpZCBtYXBwaW5ncyBhcmU6CisgICAgICAvLyAtIFNHViBpcyBleHRlcm5hbCBkZWNsYXJhdGlvbiwgd2hpY2ggaXMgZWZmZWN0aXZlbHkgYSBuby1vcC4KKyAgICAgIC8vIC0gU0dWIGlzIHdlYWssIHdoZW4gd2UganVzdCBuZWVkIHRvIHRocm93IFNHViBvdXQuCisgICAgICBpZiAoIVNHVi0+aXNEZWNsYXJhdGlvbigpICYmICFTR1YtPmlzV2Vha0ZvckxpbmtlcigpKQorICAgICAgICByZXR1cm4gRXJyb3IoRXJyLCAiR2xvYmFsLUFsaWFzIENvbGxpc2lvbiBvbiAnIiArIFNHVi0+Z2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICInOiBzeW1ib2wgbXVsdGlwbGUgZGVmaW5lZCIpOworICAgIH0KKworICAgIC8vIFNldCBjYWxjdWxhdGVkIGxpbmthZ2UKKyAgICBER1YtPnNldExpbmthZ2UoTmV3TGlua2FnZSk7CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gcmVtZW1iZXIgdGhpcyBtYXBwaW5nLi4uCisgICAgVmFsdWVNYXBbU0dWXSA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChER1YsIFNHVi0+Z2V0VHlwZSgpKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzCitDYWxjdWxhdGVBbGlhc0xpbmthZ2UoY29uc3QgR2xvYmFsVmFsdWUgKlNHViwgY29uc3QgR2xvYmFsVmFsdWUgKkRHVikgeworICBHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIFNMID0gU0dWLT5nZXRMaW5rYWdlKCk7CisgIEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgREwgPSBER1YtPmdldExpbmthZ2UoKTsKKyAgaWYgKFNMID09IEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UgfHwgREwgPT0gR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSkKKyAgICByZXR1cm4gR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZTsKKyAgZWxzZSBpZiAoU0wgPT0gR2xvYmFsVmFsdWU6OldlYWtBbnlMaW5rYWdlIHx8CisgICAgICAgICAgIERMID09IEdsb2JhbFZhbHVlOjpXZWFrQW55TGlua2FnZSkKKyAgICByZXR1cm4gR2xvYmFsVmFsdWU6OldlYWtBbnlMaW5rYWdlOworICBlbHNlIGlmIChTTCA9PSBHbG9iYWxWYWx1ZTo6V2Vha09EUkxpbmthZ2UgfHwKKyAgICAgICAgICAgREwgPT0gR2xvYmFsVmFsdWU6OldlYWtPRFJMaW5rYWdlKQorICAgIHJldHVybiBHbG9iYWxWYWx1ZTo6V2Vha09EUkxpbmthZ2U7CisgIGVsc2UgaWYgKFNMID09IEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UgJiYKKyAgICAgICAgICAgREwgPT0gR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSkKKyAgICByZXR1cm4gR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZTsKKyAgZWxzZSBpZiAoU0wgPT0gR2xvYmFsVmFsdWU6OkxpbmtlclByaXZhdGVMaW5rYWdlICYmCisgICAgICAgICAgIERMID09IEdsb2JhbFZhbHVlOjpMaW5rZXJQcml2YXRlTGlua2FnZSkKKyAgICByZXR1cm4gR2xvYmFsVmFsdWU6OkxpbmtlclByaXZhdGVMaW5rYWdlOworICBlbHNlIHsKKyAgICBhc3NlcnQgKFNMID09IEdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSAmJgorICAgICAgICAgICAgREwgPT0gR2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlICYmICJVbmV4cGVjdGVkIGxpbmthZ2UgdHlwZSIpOworICAgIHJldHVybiBHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2U7CisgIH0KK30KKworLy8gTGlua0FsaWFzIC0gTG9vcCB0aHJvdWdoIHRoZSBhbGlhcyBpbiB0aGUgc3JjIG1vZHVsZSBhbmQgbGluayB0aGVtIGludG8gdGhlCisvLyBkZXN0IG1vZHVsZS4gV2UncmUgYXNzdW1pbmcsIHRoYXQgYWxsIGZ1bmN0aW9ucy9nbG9iYWwgdmFyaWFibGVzIHdlcmUgYWxyZWFkeQorLy8gbGlua2VkIGluLgorc3RhdGljIGJvb2wgTGlua0FsaWFzKE1vZHVsZSAqRGVzdCwgY29uc3QgTW9kdWxlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+ICZWYWx1ZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyKSB7CisgIC8vIExvb3Agb3ZlciBhbGwgYWxpYXMgaW4gdGhlIHNyYyBtb2R1bGUKKyAgZm9yIChNb2R1bGU6OmNvbnN0X2FsaWFzX2l0ZXJhdG9yIEkgPSBTcmMtPmFsaWFzX2JlZ2luKCksCisgICAgICAgICBFID0gU3JjLT5hbGlhc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBHbG9iYWxBbGlhcyAqU0dBID0gSTsKKyAgICBjb25zdCBHbG9iYWxWYWx1ZSAqU0FsaWFzZWUgPSBTR0EtPmdldEFsaWFzZWRHbG9iYWwoKTsKKyAgICBHbG9iYWxBbGlhcyAqTmV3R0EgPSBOVUxMOworCisgICAgLy8gR2xvYmFscyB3ZXJlIGFscmVhZHkgbGlua2VkLCB0aHVzIHdlIGNhbiBqdXN0IHF1ZXJ5IFZhbHVlTWFwIGZvciB2YXJpYW50CisgICAgLy8gb2YgU0FsaWFzZWUgaW4gRGVzdC4KKyAgICBzdGQ6Om1hcDxjb25zdCBWYWx1ZSosVmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgVk1JID0gVmFsdWVNYXAuZmluZChTQWxpYXNlZSk7CisgICAgYXNzZXJ0KFZNSSAhPSBWYWx1ZU1hcC5lbmQoKSAmJiAiQWxpYXNlZSBub3QgbGlua2VkIik7CisgICAgR2xvYmFsVmFsdWUqIERBbGlhc2VlID0gY2FzdDxHbG9iYWxWYWx1ZT4oVk1JLT5zZWNvbmQpOworICAgIEdsb2JhbFZhbHVlKiBER1YgPSBOVUxMOworCisgICAgLy8gVHJ5IHRvIGZpbmQgc29tZXRoaW5nICdzaW1pbGFyJyB0byBTR0EgaW4gZGVzdGluYXRpb24gbW9kdWxlLgorICAgIGlmICghREdWICYmICFTR0EtPmhhc0xvY2FsTGlua2FnZSgpKSB7CisgICAgICBER1YgPSBEZXN0LT5nZXROYW1lZEFsaWFzKFNHQS0+Z2V0TmFtZSgpKTsKKworICAgICAgLy8gSWYgdHlwZXMgZG9uJ3QgYWdyZWUgZHVlIHRvIG9wYXF1ZSB0eXBlcywgdHJ5IHRvIHJlc29sdmUgdGhlbS4KKyAgICAgIGlmIChER1YgJiYgREdWLT5nZXRUeXBlKCkgIT0gU0dBLT5nZXRUeXBlKCkpCisgICAgICAgIFJlY3Vyc2l2ZVJlc29sdmVUeXBlcyhTR0EtPmdldFR5cGUoKSwgREdWLT5nZXRUeXBlKCkpOworICAgIH0KKworICAgIGlmICghREdWICYmICFTR0EtPmhhc0xvY2FsTGlua2FnZSgpKSB7CisgICAgICBER1YgPSBEZXN0LT5nZXRHbG9iYWxWYXJpYWJsZShTR0EtPmdldE5hbWUoKSk7CisKKyAgICAgIC8vIElmIHR5cGVzIGRvbid0IGFncmVlIGR1ZSB0byBvcGFxdWUgdHlwZXMsIHRyeSB0byByZXNvbHZlIHRoZW0uCisgICAgICBpZiAoREdWICYmIERHVi0+Z2V0VHlwZSgpICE9IFNHQS0+Z2V0VHlwZSgpKQorICAgICAgICBSZWN1cnNpdmVSZXNvbHZlVHlwZXMoU0dBLT5nZXRUeXBlKCksIERHVi0+Z2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBpZiAoIURHViAmJiAhU0dBLT5oYXNMb2NhbExpbmthZ2UoKSkgeworICAgICAgREdWID0gRGVzdC0+Z2V0RnVuY3Rpb24oU0dBLT5nZXROYW1lKCkpOworCisgICAgICAvLyBJZiB0eXBlcyBkb24ndCBhZ3JlZSBkdWUgdG8gb3BhcXVlIHR5cGVzLCB0cnkgdG8gcmVzb2x2ZSB0aGVtLgorICAgICAgaWYgKERHViAmJiBER1YtPmdldFR5cGUoKSAhPSBTR0EtPmdldFR5cGUoKSkKKyAgICAgICAgUmVjdXJzaXZlUmVzb2x2ZVR5cGVzKFNHQS0+Z2V0VHlwZSgpLCBER1YtPmdldFR5cGUoKSk7CisgICAgfQorCisgICAgLy8gTm8gbGlua2luZyB0byBiZSBwZXJmb3JtZWQgb24gaW50ZXJuYWwgc3R1ZmYuCisgICAgaWYgKERHViAmJiBER1YtPmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgREdWID0gTlVMTDsKKworICAgIGlmIChHbG9iYWxBbGlhcyAqREdBID0gZHluX2Nhc3Rfb3JfbnVsbDxHbG9iYWxBbGlhcz4oREdWKSkgeworICAgICAgLy8gVHlwZXMgYXJlIGtub3duIHRvIGJlIHRoZSBzYW1lLCBjaGVjayB3aGV0aGVyIGFsaWFzZWVzIGVxdWFsLiBBcworICAgICAgLy8gZ2xvYmFscyBhcmUgYWxyZWFkeSBsaW5rZWQgd2UganVzdCBuZWVkIHF1ZXJ5IFZhbHVlTWFwIHRvIGZpbmQgdGhlCisgICAgICAvLyBtYXBwaW5nLgorICAgICAgaWYgKERBbGlhc2VlID09IERHQS0+Z2V0QWxpYXNlZEdsb2JhbCgpKSB7CisgICAgICAgIC8vIFRoaXMgaXMganVzdCB0d28gY29waWVzIG9mIHRoZSBzYW1lIGFsaWFzLiBQcm9wYWdhdGUgbGlua2FnZSwgaWYKKyAgICAgICAgLy8gbmVjZXNzYXJ5LgorICAgICAgICBER0EtPnNldExpbmthZ2UoQ2FsY3VsYXRlQWxpYXNMaW5rYWdlKFNHQSwgREdBKSk7CisKKyAgICAgICAgTmV3R0EgPSBER0E7CisgICAgICAgIC8vIFByb2NlZWQgdG8gJ2NvbW1vbicgc3RlcHMKKyAgICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gRXJyb3IoRXJyLCAiQWxpYXMgQ29sbGlzaW9uIG9uICciICArIFNHQS0+Z2V0TmFtZSgpKworICAgICAgICAgICAgICAgICAgICAgIic6IGFsaWFzZXMgaGF2ZSBkaWZmZXJlbnQgYWxpYXNlZXMiKTsKKyAgICB9IGVsc2UgaWYgKEdsb2JhbFZhcmlhYmxlICpER1ZhciA9IGR5bl9jYXN0X29yX251bGw8R2xvYmFsVmFyaWFibGU+KERHVikpIHsKKyAgICAgIC8vIFRoZSBvbmx5IGFsbG93ZWQgd2F5IGlzIHRvIGxpbmsgYWxpYXMgd2l0aCBleHRlcm5hbCBkZWNsYXJhdGlvbiBvciB3ZWFrCisgICAgICAvLyBzeW1ib2wuLgorICAgICAgaWYgKERHVmFyLT5pc0RlY2xhcmF0aW9uKCkgfHwgREdWYXItPmlzV2Vha0ZvckxpbmtlcigpKSB7CisgICAgICAgIC8vIEJ1dCBvbmx5IGlmIGFsaWFzZWUgaXMgZ2xvYmFsIHRvby4uLgorICAgICAgICBpZiAoIWlzYTxHbG9iYWxWYXJpYWJsZT4oREFsaWFzZWUpKQorICAgICAgICAgIHJldHVybiBFcnJvcihFcnIsICJHbG9iYWwtQWxpYXMgQ29sbGlzaW9uIG9uICciICsgU0dBLT5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAiJzogYWxpYXNlZSBpcyBub3QgZ2xvYmFsIHZhcmlhYmxlIik7CisKKyAgICAgICAgTmV3R0EgPSBuZXcgR2xvYmFsQWxpYXMoU0dBLT5nZXRUeXBlKCksIFNHQS0+Z2V0TGlua2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTR0EtPmdldE5hbWUoKSwgREFsaWFzZWUsIERlc3QpOworICAgICAgICBDb3B5R1ZBdHRyaWJ1dGVzKE5ld0dBLCBTR0EpOworCisgICAgICAgIC8vIEFueSB1c2VzIG9mIERHViBuZWVkIHRvIGNoYW5nZSB0byBOZXdHQSwgd2l0aCBjYXN0LCBpZiBuZWVkZWQuCisgICAgICAgIGlmIChTR0EtPmdldFR5cGUoKSAhPSBER1Zhci0+Z2V0VHlwZSgpKQorICAgICAgICAgIERHVmFyLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KE5ld0dBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERHVmFyLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIERHVmFyLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3R0EpOworCisgICAgICAgIC8vIERHVmFyIHdpbGwgY29uZmxpY3Qgd2l0aCBOZXdHQSBiZWNhdXNlIHRoZXkgYm90aCBoYWQgdGhlIHNhbWUKKyAgICAgICAgLy8gbmFtZS4gV2UgbXVzdCBlcmFzZSB0aGlzIG5vdyBzbyBGb3JjZVJlbmFtaW5nIGRvZXNuJ3QgYXNzZXJ0CisgICAgICAgIC8vIGJlY2F1c2UgREdWIG1pZ2h0IG5vdCBoYXZlIGludGVybmFsIGxpbmthZ2UuCisgICAgICAgIERHVmFyLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICAgICAgICAvLyBQcm9jZWVkIHRvICdjb21tb24nIHN0ZXBzCisgICAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIEVycm9yKEVyciwgIkdsb2JhbC1BbGlhcyBDb2xsaXNpb24gb24gJyIgKyBTR0EtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAiJzogc3ltYm9sIG11bHRpcGxlIGRlZmluZWQiKTsKKyAgICB9IGVsc2UgaWYgKEZ1bmN0aW9uICpERiA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb24+KERHVikpIHsKKyAgICAgIC8vIFRoZSBvbmx5IGFsbG93ZWQgd2F5IGlzIHRvIGxpbmsgYWxpYXMgd2l0aCBleHRlcm5hbCBkZWNsYXJhdGlvbiBvciB3ZWFrCisgICAgICAvLyBzeW1ib2wuLi4KKyAgICAgIGlmIChERi0+aXNEZWNsYXJhdGlvbigpIHx8IERGLT5pc1dlYWtGb3JMaW5rZXIoKSkgeworICAgICAgICAvLyBCdXQgb25seSBpZiBhbGlhc2VlIGlzIGZ1bmN0aW9uIHRvby4uLgorICAgICAgICBpZiAoIWlzYTxGdW5jdGlvbj4oREFsaWFzZWUpKQorICAgICAgICAgIHJldHVybiBFcnJvcihFcnIsICJGdW5jdGlvbi1BbGlhcyBDb2xsaXNpb24gb24gJyIgKyBTR0EtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICInOiBhbGlhc2VlIGlzIG5vdCBmdW5jdGlvbiIpOworCisgICAgICAgIE5ld0dBID0gbmV3IEdsb2JhbEFsaWFzKFNHQS0+Z2V0VHlwZSgpLCBTR0EtPmdldExpbmthZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0dBLT5nZXROYW1lKCksIERBbGlhc2VlLCBEZXN0KTsKKyAgICAgICAgQ29weUdWQXR0cmlidXRlcyhOZXdHQSwgU0dBKTsKKworICAgICAgICAvLyBBbnkgdXNlcyBvZiBERiBuZWVkIHRvIGNoYW5nZSB0byBOZXdHQSwgd2l0aCBjYXN0LCBpZiBuZWVkZWQuCisgICAgICAgIGlmIChTR0EtPmdldFR5cGUoKSAhPSBERi0+Z2V0VHlwZSgpKQorICAgICAgICAgIERGLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KE5ld0dBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERGLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIERGLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3R0EpOworCisgICAgICAgIC8vIERGIHdpbGwgY29uZmxpY3Qgd2l0aCBOZXdHQSBiZWNhdXNlIHRoZXkgYm90aCBoYWQgdGhlIHNhbWUKKyAgICAgICAgLy8gbmFtZS4gV2UgbXVzdCBlcmFzZSB0aGlzIG5vdyBzbyBGb3JjZVJlbmFtaW5nIGRvZXNuJ3QgYXNzZXJ0CisgICAgICAgIC8vIGJlY2F1c2UgREYgbWlnaHQgbm90IGhhdmUgaW50ZXJuYWwgbGlua2FnZS4KKyAgICAgICAgREYtPmVyYXNlRnJvbVBhcmVudCgpOworCisgICAgICAgIC8vIFByb2NlZWQgdG8gJ2NvbW1vbicgc3RlcHMKKyAgICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gRXJyb3IoRXJyLCAiRnVuY3Rpb24tQWxpYXMgQ29sbGlzaW9uIG9uICciICsgU0dBLT5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgIic6IHN5bWJvbCBtdWx0aXBsZSBkZWZpbmVkIik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vIGxpbmtpbmcgdG8gYmUgcGVyZm9ybWVkLCBzaW1wbHkgY3JlYXRlIGFuIGlkZW50aWNhbCB2ZXJzaW9uIG9mIHRoZQorICAgICAgLy8gYWxpYXMgb3ZlciBpbiB0aGUgZGVzdCBtb2R1bGUuLi4KKyAgICAgIENvbnN0YW50ICpBbGlhc2VlID0gREFsaWFzZWU7CisgICAgICAvLyBGaXh1cCBhbGlhc2VzIHRvIGJpdGNhc3RzLiAgTm90ZSB0aGF0IGFsaWFzZXMgdG8gR0VQcyBhcmUgc3RpbGwgYnJva2VuCisgICAgICAvLyBieSB0aGlzLCBidXQgYWxpYXNlcyB0byBHRVBzIGFyZSBicm9rZW4gdG8gYSBsb3Qgb2Ygb3RoZXIgdGhpbmdzLCBzbworICAgICAgLy8gaXQncyBsZXNzIGltcG9ydGFudC4KKyAgICAgIGlmIChTR0EtPmdldFR5cGUoKSAhPSBEQWxpYXNlZS0+Z2V0VHlwZSgpKQorICAgICAgICBBbGlhc2VlID0gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KERBbGlhc2VlLCBTR0EtPmdldFR5cGUoKSk7CisgICAgICBOZXdHQSA9IG5ldyBHbG9iYWxBbGlhcyhTR0EtPmdldFR5cGUoKSwgU0dBLT5nZXRMaW5rYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTR0EtPmdldE5hbWUoKSwgQWxpYXNlZSwgRGVzdCk7CisgICAgICBDb3B5R1ZBdHRyaWJ1dGVzKE5ld0dBLCBTR0EpOworCisgICAgICAvLyBQcm9jZWVkIHRvICdjb21tb24nIHN0ZXBzCisgICAgfQorCisgICAgYXNzZXJ0KE5ld0dBICYmICJObyBhbGlhcyB3YXMgY3JlYXRlZCBpbiBkZXN0aW5hdGlvbiBtb2R1bGUhIik7CisKKyAgICAvLyBJZiB0aGUgc3ltYm9sIHRhYmxlIHJlbmFtZWQgdGhlIGFsaWFzLCBidXQgaXQgaXMgYW4gZXh0ZXJuYWxseSB2aXNpYmxlCisgICAgLy8gc3ltYm9sLCBER0EgbXVzdCBiZSBhbiBnbG9iYWwgdmFsdWUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiBSZW5hbWUgaXQuCisgICAgaWYgKE5ld0dBLT5nZXROYW1lKCkgIT0gU0dBLT5nZXROYW1lKCkgJiYKKyAgICAgICAgIU5ld0dBLT5oYXNMb2NhbExpbmthZ2UoKSkKKyAgICAgIEZvcmNlUmVuYW1pbmcoTmV3R0EsIFNHQS0+Z2V0TmFtZSgpKTsKKworICAgIC8vIFJlbWVtYmVyIHRoaXMgbWFwcGluZyBzbyB1c2VzIGluIHRoZSBzb3VyY2UgbW9kdWxlIGdldCByZW1hcHBlZAorICAgIC8vIGxhdGVyIGJ5IFJlbWFwT3BlcmFuZC4KKyAgICBWYWx1ZU1hcFtTR0FdID0gTmV3R0E7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8gTGlua0dsb2JhbEluaXRzIC0gVXBkYXRlIHRoZSBpbml0aWFsaXplcnMgaW4gdGhlIERlc3QgbW9kdWxlIG5vdyB0aGF0IGFsbAorLy8gZ2xvYmFscyB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGFyZSBpbiBEZXN0Lgorc3RhdGljIGJvb2wgTGlua0dsb2JhbEluaXRzKE1vZHVsZSAqRGVzdCwgY29uc3QgTW9kdWxlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+ICZWYWx1ZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyKSB7CisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIGdsb2JhbHMgaW4gdGhlIHNyYyBtb2R1bGUsIG1hcHBpbmcgdGhlbSBvdmVyIGFzIHdlIGdvCisgIGZvciAoTW9kdWxlOjpjb25zdF9nbG9iYWxfaXRlcmF0b3IgSSA9IFNyYy0+Z2xvYmFsX2JlZ2luKCksCisgICAgICAgRSA9IFNyYy0+Z2xvYmFsX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IEdsb2JhbFZhcmlhYmxlICpTR1YgPSBJOworCisgICAgaWYgKFNHVi0+aGFzSW5pdGlhbGl6ZXIoKSkgeyAgICAgIC8vIE9ubHkgcHJvY2VzcyBpbml0aWFsaXplZCBHVidzCisgICAgICAvLyBGaWd1cmUgb3V0IHdoYXQgdGhlIGluaXRpYWxpemVyIGxvb2tzIGxpa2UgaW4gdGhlIGRlc3QgbW9kdWxlLi4uCisgICAgICBDb25zdGFudCAqU0luaXQgPQorICAgICAgICBjYXN0PENvbnN0YW50PihSZW1hcE9wZXJhbmQoU0dWLT5nZXRJbml0aWFsaXplcigpLCBWYWx1ZU1hcCkpOworICAgICAgLy8gR3JhYiBkZXN0aW5hdGlvbiBnbG9iYWwgdmFyaWFibGUgb3IgYWxpYXMuCisgICAgICBHbG9iYWxWYWx1ZSAqREdWID0gY2FzdDxHbG9iYWxWYWx1ZT4oVmFsdWVNYXBbU0dWXS0+c3RyaXBQb2ludGVyQ2FzdHMoKSk7CisKKyAgICAgIC8vIElmIGRlc3QgaWYgZ2xvYmFsIHZhcmlhYmxlLCBjaGVjayB0aGF0IGluaXRpYWxpemVycyBtYXRjaC4KKyAgICAgIGlmIChHbG9iYWxWYXJpYWJsZSAqREdWYXIgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oREdWKSkgeworICAgICAgICBpZiAoREdWYXItPmhhc0luaXRpYWxpemVyKCkpIHsKKyAgICAgICAgICBpZiAoU0dWLT5oYXNFeHRlcm5hbExpbmthZ2UoKSkgeworICAgICAgICAgICAgaWYgKERHVmFyLT5nZXRJbml0aWFsaXplcigpICE9IFNJbml0KQorICAgICAgICAgICAgICByZXR1cm4gRXJyb3IoRXJyLCAiR2xvYmFsIFZhcmlhYmxlIENvbGxpc2lvbiBvbiAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTR1YtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJzogZ2xvYmFsIHZhcmlhYmxlcyBoYXZlIGRpZmZlcmVudCBpbml0aWFsaXplcnMiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKERHVmFyLT5pc1dlYWtGb3JMaW5rZXIoKSkgeworICAgICAgICAgICAgLy8gTm90aGluZyBpcyByZXF1aXJlZCwgbWFwcGVkIHZhbHVlcyB3aWxsIHRha2UgdGhlIG5ldyBnbG9iYWwKKyAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkuCisgICAgICAgICAgfSBlbHNlIGlmIChTR1YtPmlzV2Vha0ZvckxpbmtlcigpKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIGlzIHJlcXVpcmVkLCBtYXBwZWQgdmFsdWVzIHdpbGwgdGFrZSB0aGUgbmV3IGdsb2JhbAorICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseS4KKyAgICAgICAgICB9IGVsc2UgaWYgKERHVmFyLT5oYXNBcHBlbmRpbmdMaW5rYWdlKCkpIHsKKyAgICAgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkFwcGVuZGluZyBsaW5rYWdlIHVuaW1wbGVtZW50ZWQhIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbGlua2FnZSEiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQ29weSB0aGUgaW5pdGlhbGl6ZXIgb3ZlciBub3cuLi4KKyAgICAgICAgICBER1Zhci0+c2V0SW5pdGlhbGl6ZXIoU0luaXQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBEZXN0aW5hdGlvbiBpcyBhbGlhcywgdGhlIG9ubHkgdmFsaWQgc2l0dWF0aW9uIGlzIHdoZW4gc291cmNlIGlzCisgICAgICAgIC8vIHdlYWsuIEFsc28sIG5vdGUsIHRoYXQgd2UgYWxyZWFkeSBjaGVja2VkIGxpbmthZ2UgaW4gTGlua0dsb2JhbHMoKSwKKyAgICAgICAgLy8gdGh1cyB3ZSBhc3NlcnQgaGVyZS4KKyAgICAgICAgLy8gRklYTUU6IFNob3VsZCB3ZSB3ZWFrZW4gdGhpcyBhc3N1bXB0aW9uLCAnZGVyZWZlcmVuY2UnIGFsaWFzIGFuZAorICAgICAgICAvLyBjaGVjayBmb3IgaW5pdGlhbGl6ZXIgb2YgYWxpYXNlZT8KKyAgICAgICAgYXNzZXJ0KFNHVi0+aXNXZWFrRm9yTGlua2VyKCkpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIExpbmtGdW5jdGlvblByb3RvcyAtIExpbmsgdGhlIGZ1bmN0aW9ucyB0b2dldGhlciBiZXR3ZWVuIHRoZSB0d28gbW9kdWxlcywKKy8vIHdpdGhvdXQgZG9pbmcgZnVuY3Rpb24gYm9kaWVzLi4uIHRoaXMganVzdCBhZGRzIGV4dGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vIHRvIHRoZSBEZXN0IGZ1bmN0aW9uLi4uCisvLworc3RhdGljIGJvb2wgTGlua0Z1bmN0aW9uUHJvdG9zKE1vZHVsZSAqRGVzdCwgY29uc3QgTW9kdWxlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+ICZWYWx1ZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyKSB7CisgIFZhbHVlU3ltYm9sVGFibGUgJkRlc3RTeW1UYWIgPSBEZXN0LT5nZXRWYWx1ZVN5bWJvbFRhYmxlKCk7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGluIHRoZSBzcmMgbW9kdWxlLCBtYXBwaW5nIHRoZW0gb3ZlcgorICBmb3IgKE1vZHVsZTo6Y29uc3RfaXRlcmF0b3IgSSA9IFNyYy0+YmVnaW4oKSwgRSA9IFNyYy0+ZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgRnVuY3Rpb24gKlNGID0gSTsgICAvLyBTcmNGdW5jdGlvbgorICAgIEdsb2JhbFZhbHVlICpER1YgPSAwOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG1heSBoYXZlIHRvIGxpbmsgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGdsb2JhbCwgYWxpYXMgb3IKKyAgICAvLyBmdW5jdGlvbi4KKyAgICBpZiAoU0YtPmhhc05hbWUoKSAmJiAhU0YtPmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgREdWID0gY2FzdF9vcl9udWxsPEdsb2JhbFZhbHVlPihEZXN0U3ltVGFiLmxvb2t1cChTRi0+Z2V0TmFtZSgpKSk7CisKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIGdsb2JhbCB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIGRlc3QgbW9kdWxlLCBidXQgaXQgaGFzCisgICAgLy8gaW50ZXJuYWwgbGlua2FnZSwgd2UgYXJlIHJlYWxseSBub3QgZG9pbmcgYW55IGxpbmthZ2UgaGVyZS4KKyAgICBpZiAoREdWICYmIERHVi0+aGFzTG9jYWxMaW5rYWdlKCkpCisgICAgICBER1YgPSAwOworCisgICAgLy8gSWYgdHlwZXMgZG9uJ3QgYWdyZWUgZHVlIHRvIG9wYXF1ZSB0eXBlcywgdHJ5IHRvIHJlc29sdmUgdGhlbS4KKyAgICBpZiAoREdWICYmIERHVi0+Z2V0VHlwZSgpICE9IFNGLT5nZXRUeXBlKCkpCisgICAgICBSZWN1cnNpdmVSZXNvbHZlVHlwZXMoU0YtPmdldFR5cGUoKSwgREdWLT5nZXRUeXBlKCkpOworCisgICAgR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBOZXdMaW5rYWdlID0gR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZTsKKyAgICBib29sIExpbmtGcm9tU3JjID0gZmFsc2U7CisgICAgaWYgKEdldExpbmthZ2VSZXN1bHQoREdWLCBTRiwgTmV3TGlua2FnZSwgTGlua0Zyb21TcmMsIEVycikpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIElmIHRoZXJlIGlzIG5vIGxpbmthZ2UgdG8gYmUgcGVyZm9ybWVkLCBqdXN0IGJyaW5nIG92ZXIgU0Ygd2l0aG91dAorICAgIC8vIG1vZGlmeWluZyBpdC4KKyAgICBpZiAoREdWID09IDApIHsKKyAgICAgIC8vIEZ1bmN0aW9uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIHNpbXBseSBpbnNlcnQgYW4gZnVuY3Rpb24gc2lnbmF0dXJlCisgICAgICAvLyBpZGVudGljYWwgdG8gU0YgaW50byB0aGUgZGVzdCBtb2R1bGUuCisgICAgICBGdW5jdGlvbiAqTmV3REYgPSBGdW5jdGlvbjo6Q3JlYXRlKFNGLT5nZXRGdW5jdGlvblR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0YtPmdldExpbmthZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0YtPmdldE5hbWUoKSwgRGVzdCk7CisgICAgICBDb3B5R1ZBdHRyaWJ1dGVzKE5ld0RGLCBTRik7CisKKyAgICAgIC8vIElmIHRoZSBMTFZNIHJ1bnRpbWUgcmVuYW1lZCB0aGUgZnVuY3Rpb24sIGJ1dCBpdCBpcyBhbiBleHRlcm5hbGx5CisgICAgICAvLyB2aXNpYmxlIHN5bWJvbCwgREYgbXVzdCBiZSBhbiBleGlzdGluZyBmdW5jdGlvbiB3aXRoIGludGVybmFsIGxpbmthZ2UuCisgICAgICAvLyBSZW5hbWUgaXQuCisgICAgICBpZiAoIU5ld0RGLT5oYXNMb2NhbExpbmthZ2UoKSAmJiBOZXdERi0+Z2V0TmFtZSgpICE9IFNGLT5nZXROYW1lKCkpCisgICAgICAgIEZvcmNlUmVuYW1pbmcoTmV3REYsIFNGLT5nZXROYW1lKCkpOworCisgICAgICAvLyAuLi4gYW5kIHJlbWVtYmVyIHRoaXMgbWFwcGluZy4uLgorICAgICAgVmFsdWVNYXBbU0ZdID0gTmV3REY7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgdmlzaWJpbGl0aWVzIG9mIHRoZSBzeW1ib2xzIGRpc2FncmVlIGFuZCB0aGUgZGVzdGluYXRpb24gaXMgYQorICAgIC8vIHByb3RvdHlwZSwgdGFrZSB0aGUgdmlzaWJpbGl0eSBvZiBpdHMgaW5wdXQuCisgICAgaWYgKERHVi0+aXNEZWNsYXJhdGlvbigpKQorICAgICAgREdWLT5zZXRWaXNpYmlsaXR5KFNGLT5nZXRWaXNpYmlsaXR5KCkpOworCisgICAgaWYgKExpbmtGcm9tU3JjKSB7CisgICAgICBpZiAoaXNhPEdsb2JhbEFsaWFzPihER1YpKQorICAgICAgICByZXR1cm4gRXJyb3IoRXJyLCAiRnVuY3Rpb24tQWxpYXMgQ29sbGlzaW9uIG9uICciICsgU0YtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAiJzogc3ltYm9sIG11bHRpcGxlIGRlZmluZWQiKTsKKworICAgICAgLy8gV2UgaGF2ZSBhIGRlZmluaXRpb24gb2YgdGhlIHNhbWUgbmFtZSBidXQgZGlmZmVyZW50IHR5cGUgaW4gdGhlCisgICAgICAvLyBzb3VyY2UgbW9kdWxlLiBDb3B5IHRoZSBwcm90b3R5cGUgdG8gdGhlIGRlc3RpbmF0aW9uIGFuZCByZXBsYWNlCisgICAgICAvLyB1c2VzIG9mIHRoZSBkZXN0aW5hdGlvbidzIHByb3RvdHlwZSB3aXRoIHRoZSBuZXcgcHJvdG90eXBlLgorICAgICAgRnVuY3Rpb24gKk5ld0RGID0gRnVuY3Rpb246OkNyZWF0ZShTRi0+Z2V0RnVuY3Rpb25UeXBlKCksIE5ld0xpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGLT5nZXROYW1lKCksIERlc3QpOworICAgICAgQ29weUdWQXR0cmlidXRlcyhOZXdERiwgU0YpOworCisgICAgICAvLyBBbnkgdXNlcyBvZiBERiBuZWVkIHRvIGNoYW5nZSB0byBOZXdERiwgd2l0aCBjYXN0CisgICAgICBER1YtPnJlcGxhY2VBbGxVc2VzV2l0aChDb25zdGFudEV4cHI6OmdldEJpdENhc3QoTmV3REYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBER1YtPmdldFR5cGUoKSkpOworCisgICAgICAvLyBERiB3aWxsIGNvbmZsaWN0IHdpdGggTmV3REYgYmVjYXVzZSB0aGV5IGJvdGggaGFkIHRoZSBzYW1lLiBXZSBtdXN0CisgICAgICAvLyBlcmFzZSB0aGlzIG5vdyBzbyBGb3JjZVJlbmFtaW5nIGRvZXNuJ3QgYXNzZXJ0IGJlY2F1c2UgREYgbWlnaHQKKyAgICAgIC8vIG5vdCBoYXZlIGludGVybmFsIGxpbmthZ2UuCisgICAgICBpZiAoR2xvYmFsVmFyaWFibGUgKlZhciA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihER1YpKQorICAgICAgICBWYXItPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgZWxzZQorICAgICAgICBjYXN0PEZ1bmN0aW9uPihER1YpLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICAgICAgLy8gSWYgdGhlIHN5bWJvbCB0YWJsZSByZW5hbWVkIHRoZSBmdW5jdGlvbiwgYnV0IGl0IGlzIGFuIGV4dGVybmFsbHkKKyAgICAgIC8vIHZpc2libGUgc3ltYm9sLCBERiBtdXN0IGJlIGFuIGV4aXN0aW5nIGZ1bmN0aW9uIHdpdGggaW50ZXJuYWwKKyAgICAgIC8vIGxpbmthZ2UuICBSZW5hbWUgaXQuCisgICAgICBpZiAoTmV3REYtPmdldE5hbWUoKSAhPSBTRi0+Z2V0TmFtZSgpICYmICFOZXdERi0+aGFzTG9jYWxMaW5rYWdlKCkpCisgICAgICAgIEZvcmNlUmVuYW1pbmcoTmV3REYsIFNGLT5nZXROYW1lKCkpOworCisgICAgICAvLyBSZW1lbWJlciB0aGlzIG1hcHBpbmcgc28gdXNlcyBpbiB0aGUgc291cmNlIG1vZHVsZSBnZXQgcmVtYXBwZWQKKyAgICAgIC8vIGxhdGVyIGJ5IFJlbWFwT3BlcmFuZC4KKyAgICAgIFZhbHVlTWFwW1NGXSA9IE5ld0RGOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gTm90ICJsaW5rIGZyb20gc291cmNlIiwga2VlcCB0aGUgb25lIGluIHRoZSBEZXN0TW9kdWxlIGFuZCByZW1hcCB0aGUKKyAgICAvLyBpbnB1dCBvbnRvIGl0LgorCisgICAgaWYgKGlzYTxHbG9iYWxBbGlhcz4oREdWKSkgeworICAgICAgLy8gVGhlIG9ubHkgdmFsaWQgbWFwcGluZ3MgYXJlOgorICAgICAgLy8gLSBTRiBpcyBleHRlcm5hbCBkZWNsYXJhdGlvbiwgd2hpY2ggaXMgZWZmZWN0aXZlbHkgYSBuby1vcC4KKyAgICAgIC8vIC0gU0YgaXMgd2Vhaywgd2hlbiB3ZSBqdXN0IG5lZWQgdG8gdGhyb3cgU0Ygb3V0LgorICAgICAgaWYgKCFTRi0+aXNEZWNsYXJhdGlvbigpICYmICFTRi0+aXNXZWFrRm9yTGlua2VyKCkpCisgICAgICAgIHJldHVybiBFcnJvcihFcnIsICJGdW5jdGlvbi1BbGlhcyBDb2xsaXNpb24gb24gJyIgKyBTRi0+Z2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICInOiBzeW1ib2wgbXVsdGlwbGUgZGVmaW5lZCIpOworICAgIH0KKworICAgIC8vIFNldCBjYWxjdWxhdGVkIGxpbmthZ2UKKyAgICBER1YtPnNldExpbmthZ2UoTmV3TGlua2FnZSk7CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gcmVtZW1iZXIgdGhpcyBtYXBwaW5nLgorICAgIFZhbHVlTWFwW1NGXSA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChER1YsIFNGLT5nZXRUeXBlKCkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gTGlua0Z1bmN0aW9uQm9keSAtIENvcHkgdGhlIHNvdXJjZSBmdW5jdGlvbiBvdmVyIGludG8gdGhlIGRlc3QgZnVuY3Rpb24gYW5kCisvLyBmaXggdXAgcmVmZXJlbmNlcyB0byB2YWx1ZXMuICBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBEZXN0IGlzIGFuIGV4dGVybmFsCisvLyBmdW5jdGlvbiwgYW5kIHRoYXQgU3JjIGlzIG5vdC4KK3N0YXRpYyBib29sIExpbmtGdW5jdGlvbkJvZHkoRnVuY3Rpb24gKkRlc3QsIEZ1bmN0aW9uICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGNvbnN0IFZhbHVlKiwgVmFsdWUqPiAmVmFsdWVNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnIpIHsKKyAgYXNzZXJ0KFNyYyAmJiBEZXN0ICYmIERlc3QtPmlzRGVjbGFyYXRpb24oKSAmJiAhU3JjLT5pc0RlY2xhcmF0aW9uKCkpOworCisgIC8vIEdvIHRocm91Z2ggYW5kIGNvbnZlcnQgZnVuY3Rpb24gYXJndW1lbnRzIG92ZXIsIHJlbWVtYmVyaW5nIHRoZSBtYXBwaW5nLgorICBGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIERJID0gRGVzdC0+YXJnX2JlZ2luKCk7CisgIGZvciAoRnVuY3Rpb246OmFyZ19pdGVyYXRvciBJID0gU3JjLT5hcmdfYmVnaW4oKSwgRSA9IFNyYy0+YXJnX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJLCArK0RJKSB7CisgICAgREktPnNldE5hbWUoSS0+Z2V0TmFtZSgpKTsgIC8vIENvcHkgdGhlIG5hbWUgaW5mb3JtYXRpb24gb3Zlci4uLgorCisgICAgLy8gQWRkIGEgbWFwcGluZyB0byBvdXIgbG9jYWwgbWFwCisgICAgVmFsdWVNYXBbSV0gPSBESTsKKyAgfQorCisgIC8vIFNwbGljZSB0aGUgYm9keSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uIGludG8gdGhlIGRlc3QgZnVuY3Rpb24uCisgIERlc3QtPmdldEJhc2ljQmxvY2tMaXN0KCkuc3BsaWNlKERlc3QtPmVuZCgpLCBTcmMtPmdldEJhc2ljQmxvY2tMaXN0KCkpOworCisgIC8vIEF0IHRoaXMgcG9pbnQsIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9uIGFyZSBub3cKKyAgLy8gY29waWVkIG92ZXIuICBUaGUgb25seSBwcm9ibGVtIGlzIHRoYXQgdGhleSBhcmUgc3RpbGwgcmVmZXJlbmNpbmcgdmFsdWVzIGluCisgIC8vIHRoZSBTb3VyY2UgZnVuY3Rpb24gYXMgb3BlcmFuZHMuICBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUKKyAgLy8gZnVuY3Rpb25zIGFuZCBwYXRjaCB0aGVtIHVwIHRvIHBvaW50IHRvIHRoZSBsb2NhbCB2ZXJzaW9ucy4uLgorICAvLworICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCQiA9IERlc3QtPmJlZ2luKCksIEJFID0gRGVzdC0+ZW5kKCk7IEJCICE9IEJFOyArK0JCKQorICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGZvciAoSW5zdHJ1Y3Rpb246Om9wX2l0ZXJhdG9yIE9JID0gSS0+b3BfYmVnaW4oKSwgT0UgPSBJLT5vcF9lbmQoKTsKKyAgICAgICAgICAgT0kgIT0gT0U7ICsrT0kpCisgICAgICAgIGlmICghaXNhPEluc3RydWN0aW9uPigqT0kpICYmICFpc2E8QmFzaWNCbG9jaz4oKk9JKSkKKyAgICAgICAgICAqT0kgPSBSZW1hcE9wZXJhbmQoKk9JLCBWYWx1ZU1hcCk7CisKKyAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBtYXAgdGhlIGFyZ3VtZW50cyBhbnltb3JlLgorICBmb3IgKEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgSSA9IFNyYy0+YXJnX2JlZ2luKCksIEUgPSBTcmMtPmFyZ19lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBWYWx1ZU1hcC5lcmFzZShJKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8gTGlua0Z1bmN0aW9uQm9kaWVzIC0gTGluayBpbiB0aGUgZnVuY3Rpb24gYm9kaWVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlCisvLyBzb3VyY2UgbW9kdWxlIGludG8gdGhlIERlc3RNb2R1bGUuICBUaGlzIGNvbnNpc3RzIGJhc2ljYWxseSBvZiBjb3B5aW5nIHRoZQorLy8gZnVuY3Rpb24gb3ZlciBhbmQgZml4aW5nIHVwIHJlZmVyZW5jZXMgdG8gdmFsdWVzLgorc3RhdGljIGJvb2wgTGlua0Z1bmN0aW9uQm9kaWVzKE1vZHVsZSAqRGVzdCwgTW9kdWxlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+ICZWYWx1ZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyKSB7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGluIHRoZSBzcmMgbW9kdWxlLCBtYXBwaW5nIHRoZW0gb3ZlciBhcyB3ZQorICAvLyBnbworICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgU0YgPSBTcmMtPmJlZ2luKCksIEUgPSBTcmMtPmVuZCgpOyBTRiAhPSBFOyArK1NGKSB7CisgICAgaWYgKCFTRi0+aXNEZWNsYXJhdGlvbigpKSB7ICAgICAgICAgICAgICAgLy8gTm8gYm9keSBpZiBmdW5jdGlvbiBpcyBleHRlcm5hbAorICAgICAgRnVuY3Rpb24gKkRGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KFZhbHVlTWFwW1NGXSk7IC8vIERlc3RpbmF0aW9uIGZ1bmN0aW9uCisKKyAgICAgIC8vIERGIG5vdCBleHRlcm5hbCBTRiBleHRlcm5hbD8KKyAgICAgIGlmIChERiAmJiBERi0+aXNEZWNsYXJhdGlvbigpKQorICAgICAgICAvLyBPbmx5IHByb3ZpZGUgdGhlIGZ1bmN0aW9uIGJvZHkgaWYgdGhlcmUgaXNuJ3Qgb25lIGFscmVhZHkuCisgICAgICAgIGlmIChMaW5rRnVuY3Rpb25Cb2R5KERGLCBTRiwgVmFsdWVNYXAsIEVycikpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gTGlua0FwcGVuZGluZ1ZhcnMgLSBJZiB0aGVyZSB3ZXJlIGFueSBhcHBlbmRpbmcgZ2xvYmFsIHZhcmlhYmxlcywgbGluayB0aGVtCisvLyB0b2dldGhlciBub3cuICBSZXR1cm4gdHJ1ZSBvbiBlcnJvci4KK3N0YXRpYyBib29sIExpbmtBcHBlbmRpbmdWYXJzKE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6bXVsdGltYXA8c3RkOjpzdHJpbmcsIEdsb2JhbFZhcmlhYmxlICo+ICZBcHBlbmRpbmdWYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVycm9yTXNnKSB7CisgIGlmIChBcHBlbmRpbmdWYXJzLmVtcHR5KCkpIHJldHVybiBmYWxzZTsgLy8gTm90aGluZyB0byBkby4KKworICAvLyBMb29wIG92ZXIgdGhlIG11bHRpbWFwIG9mIGFwcGVuZGluZyB2YXJzLCBwcm9jZXNzaW5nIGFueSB2YXJpYWJsZXMgd2l0aCB0aGUKKyAgLy8gc2FtZSBuYW1lLCBmb3JtaW5nIGEgbmV3IGFwcGVuZGluZyBnbG9iYWwgdmFyaWFibGUgd2l0aCBib3RoIG9mIHRoZQorICAvLyBpbml0aWFsaXplcnMgbWVyZ2VkIHRvZ2V0aGVyLCB0aGVuIHJld3JpdGUgcmVmZXJlbmNlcyB0byB0aGUgb2xkIHZhcmlhYmxlcworICAvLyBhbmQgZGVsZXRlIHRoZW0uCisgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gSW5pdHM7CisgIHdoaWxlIChBcHBlbmRpbmdWYXJzLnNpemUoKSA+IDEpIHsKKyAgICAvLyBHZXQgdGhlIGZpcnN0IHR3byBlbGVtZW50cyBpbiB0aGUgbWFwLi4uCisgICAgc3RkOjptdWx0aW1hcDxzdGQ6OnN0cmluZywKKyAgICAgIEdsb2JhbFZhcmlhYmxlKj46Oml0ZXJhdG9yIFNlY29uZCA9IEFwcGVuZGluZ1ZhcnMuYmVnaW4oKSwgRmlyc3Q9U2Vjb25kKys7CisKKyAgICAvLyBJZiB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzIGFyZSBmb3IgZGlmZmVyZW50IG5hbWVzLCB0aGVyZSBpcyBubyBwYWlyLi4uCisgICAgLy8gT3RoZXJ3aXNlIHRoZXJlIGlzIGEgcGFpciwgc28gbGluayB0aGVtIHRvZ2V0aGVyLi4uCisgICAgaWYgKEZpcnN0LT5maXJzdCA9PSBTZWNvbmQtPmZpcnN0KSB7CisgICAgICBHbG9iYWxWYXJpYWJsZSAqRzEgPSBGaXJzdC0+c2Vjb25kLCAqRzIgPSBTZWNvbmQtPnNlY29uZDsKKyAgICAgIGNvbnN0IEFycmF5VHlwZSAqVDEgPSBjYXN0PEFycmF5VHlwZT4oRzEtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICBjb25zdCBBcnJheVR5cGUgKlQyID0gY2FzdDxBcnJheVR5cGU+KEcyLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkpOworCisgICAgICAvLyBDaGVjayB0byBzZWUgdGhhdCB0aGV5IHR3byBhcnJheXMgYWdyZWUgb24gdHlwZS4uLgorICAgICAgaWYgKFQxLT5nZXRFbGVtZW50VHlwZSgpICE9IFQyLT5nZXRFbGVtZW50VHlwZSgpKQorICAgICAgICByZXR1cm4gRXJyb3IoRXJyb3JNc2csCisgICAgICAgICAiQXBwZW5kaW5nIHZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBlbGVtZW50IHR5cGVzIG5lZWQgdG8gYmUgbGlua2VkISIpOworICAgICAgaWYgKEcxLT5pc0NvbnN0YW50KCkgIT0gRzItPmlzQ29uc3RhbnQoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKEVycm9yTXNnLAorICAgICAgICAgICAgICAgICAgICAgIkFwcGVuZGluZyB2YXJpYWJsZXMgbGlua2VkIHdpdGggZGlmZmVyZW50IGNvbnN0J25lc3MhIik7CisKKyAgICAgIGlmIChHMS0+Z2V0QWxpZ25tZW50KCkgIT0gRzItPmdldEFsaWdubWVudCgpKQorICAgICAgICByZXR1cm4gRXJyb3IoRXJyb3JNc2csCisgICAgICAgICAiQXBwZW5kaW5nIHZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBhbGlnbm1lbnQgbmVlZCB0byBiZSBsaW5rZWQhIik7CisKKyAgICAgIGlmIChHMS0+Z2V0VmlzaWJpbGl0eSgpICE9IEcyLT5nZXRWaXNpYmlsaXR5KCkpCisgICAgICAgIHJldHVybiBFcnJvcihFcnJvck1zZywKKyAgICAgICAgICJBcHBlbmRpbmcgdmFyaWFibGVzIHdpdGggZGlmZmVyZW50IHZpc2liaWxpdHkgbmVlZCB0byBiZSBsaW5rZWQhIik7CisKKyAgICAgIGlmIChHMS0+Z2V0U2VjdGlvbigpICE9IEcyLT5nZXRTZWN0aW9uKCkpCisgICAgICAgIHJldHVybiBFcnJvcihFcnJvck1zZywKKyAgICAgICAgICJBcHBlbmRpbmcgdmFyaWFibGVzIHdpdGggZGlmZmVyZW50IHNlY3Rpb24gbmFtZSBuZWVkIHRvIGJlIGxpbmtlZCEiKTsKKworICAgICAgdW5zaWduZWQgTmV3U2l6ZSA9IFQxLT5nZXROdW1FbGVtZW50cygpICsgVDItPmdldE51bUVsZW1lbnRzKCk7CisgICAgICBBcnJheVR5cGUgKk5ld1R5cGUgPSBBcnJheVR5cGU6OmdldChUMS0+Z2V0RWxlbWVudFR5cGUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdTaXplKTsKKworICAgICAgRzEtPnNldE5hbWUoIiIpOyAgIC8vIENsZWFyIEcxJ3MgbmFtZSBpbiBjYXNlIG9mIGEgY29uZmxpY3QhCisKKyAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGdsb2JhbCB2YXJpYWJsZS4uLgorICAgICAgR2xvYmFsVmFyaWFibGUgKk5HID0KKyAgICAgICAgbmV3IEdsb2JhbFZhcmlhYmxlKCpNLCBOZXdUeXBlLCBHMS0+aXNDb25zdGFudCgpLCBHMS0+Z2V0TGlua2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppbml0Ki8wLCBGaXJzdC0+Zmlyc3QsIDAsIEcxLT5pc1RocmVhZExvY2FsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHMS0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSk7CisKKyAgICAgIC8vIFByb3BhZ2F0ZSBhbGlnbm1lbnQsIHZpc2liaWxpdHkgYW5kIHNlY3Rpb24gaW5mby4KKyAgICAgIENvcHlHVkF0dHJpYnV0ZXMoTkcsIEcxKTsKKworICAgICAgLy8gTWVyZ2UgdGhlIGluaXRpYWxpemVyLi4uCisgICAgICBJbml0cy5yZXNlcnZlKE5ld1NpemUpOworICAgICAgaWYgKENvbnN0YW50QXJyYXkgKkkgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihHMS0+Z2V0SW5pdGlhbGl6ZXIoKSkpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFQxLT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBJbml0cy5wdXNoX2JhY2soSS0+Z2V0T3BlcmFuZChpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oRzEtPmdldEluaXRpYWxpemVyKCkpKTsKKyAgICAgICAgQ29uc3RhbnQgKkNWID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUMS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUMS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgSW5pdHMucHVzaF9iYWNrKENWKTsKKyAgICAgIH0KKyAgICAgIGlmIChDb25zdGFudEFycmF5ICpJID0gZHluX2Nhc3Q8Q29uc3RhbnRBcnJheT4oRzItPmdldEluaXRpYWxpemVyKCkpKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUMi0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgSW5pdHMucHVzaF9iYWNrKEktPmdldE9wZXJhbmQoaSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEcyLT5nZXRJbml0aWFsaXplcigpKSk7CisgICAgICAgIENvbnN0YW50ICpDViA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoVDItPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVDItPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIEluaXRzLnB1c2hfYmFjayhDVik7CisgICAgICB9CisgICAgICBORy0+c2V0SW5pdGlhbGl6ZXIoQ29uc3RhbnRBcnJheTo6Z2V0KE5ld1R5cGUsIEluaXRzKSk7CisgICAgICBJbml0cy5jbGVhcigpOworCisgICAgICAvLyBSZXBsYWNlIGFueSB1c2VzIG9mIHRoZSB0d28gZ2xvYmFsIHZhcmlhYmxlcyB3aXRoIHVzZXMgb2YgdGhlIG5ldworICAgICAgLy8gZ2xvYmFsLi4uCisKKyAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCByZXdyaXRlIHNpbXBsZS9zdHJhaWdodC1mb3J3YXJkIHVzZXMgc3VjaCBhcworICAgICAgLy8gZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbnMgdG8gbm90IHVzZSB0aGUgQ2FzdCEKKyAgICAgIEcxLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KE5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHMS0+Z2V0VHlwZSgpKSk7CisgICAgICBHMi0+cmVwbGFjZUFsbFVzZXNXaXRoKENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChORywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcyLT5nZXRUeXBlKCkpKTsKKworICAgICAgLy8gUmVtb3ZlIHRoZSB0d28gZ2xvYmFscyBmcm9tIHRoZSBtb2R1bGUgbm93Li4uCisgICAgICBNLT5nZXRHbG9iYWxMaXN0KCkuZXJhc2UoRzEpOworICAgICAgTS0+Z2V0R2xvYmFsTGlzdCgpLmVyYXNlKEcyKTsKKworICAgICAgLy8gUHV0IHRoZSBuZXcgZ2xvYmFsIGludG8gdGhlIEFwcGVuZGluZ1ZhcnMgbWFwIHNvIHRoYXQgd2UgY2FuIGhhbmRsZQorICAgICAgLy8gbGlua2luZyBvZiBtb3JlIHRoYW4gdHdvIHZhcnMuLi4KKyAgICAgIFNlY29uZC0+c2Vjb25kID0gTkc7CisgICAgfQorICAgIEFwcGVuZGluZ1ZhcnMuZXJhc2UoRmlyc3QpOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBSZXNvbHZlQWxpYXNlcyhNb2R1bGUgKkRlc3QpIHsKKyAgZm9yIChNb2R1bGU6OmFsaWFzX2l0ZXJhdG9yIEkgPSBEZXN0LT5hbGlhc19iZWdpbigpLCBFID0gRGVzdC0+YWxpYXNfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgLy8gV2UgY2FuJ3Qgc3VlIHJlc29sdmVHbG9iYWxBbGlhcyBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBwcmVzZXJ2ZQorICAgIC8vIGJpdGNhc3RzIGFuZCBHRVBzLgorICAgIGlmIChjb25zdCBDb25zdGFudCAqQyA9IEktPmdldEFsaWFzZWUoKSkgeworICAgICAgd2hpbGUgKGR5bl9jYXN0PEdsb2JhbEFsaWFzPihDKSkKKyAgICAgICAgQyA9IGNhc3Q8R2xvYmFsQWxpYXM+KEMpLT5nZXRBbGlhc2VlKCk7CisgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oQyk7CisgICAgICBpZiAoQyAhPSBJICYmICEoR1YgJiYgR1YtPmlzRGVjbGFyYXRpb24oKSkpCisgICAgICAgIEktPnJlcGxhY2VBbGxVc2VzV2l0aChjb25zdF9jYXN0PENvbnN0YW50Kj4oQykpOworICAgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIExpbmtNb2R1bGVzIC0gVGhpcyBmdW5jdGlvbiBsaW5rcyB0d28gbW9kdWxlcyB0b2dldGhlciwgd2l0aCB0aGUgcmVzdWx0aW5nCisvLyBsZWZ0IG1vZHVsZSBtb2RpZmllZCB0byBiZSB0aGUgY29tcG9zaXRlIG9mIHRoZSB0d28gaW5wdXQgbW9kdWxlcy4gIElmIGFuCisvLyBlcnJvciBvY2N1cnMsIHRydWUgaXMgcmV0dXJuZWQgYW5kIEVycm9yTXNnIChpZiBub3QgbnVsbCkgaXMgc2V0IHRvIGluZGljYXRlCisvLyB0aGUgcHJvYmxlbS4gIFVwb24gZmFpbHVyZSwgdGhlIERlc3QgbW9kdWxlIGNvdWxkIGJlIGluIGEgbW9kaWZpZWQgc3RhdGUsIGFuZAorLy8gc2hvdWxkbid0IGJlIHJlbGllZCBvbiB0byBiZSBjb25zaXN0ZW50LgorYm9vbAorTGlua2VyOjpMaW5rTW9kdWxlcyhNb2R1bGUgKkRlc3QsIE1vZHVsZSAqU3JjLCBzdGQ6OnN0cmluZyAqRXJyb3JNc2cpIHsKKyAgYXNzZXJ0KERlc3QgIT0gMCAmJiAiSW52YWxpZCBEZXN0aW5hdGlvbiBtb2R1bGUiKTsKKyAgYXNzZXJ0KFNyYyAgIT0gMCAmJiAiSW52YWxpZCBTb3VyY2UgTW9kdWxlIik7CisKKyAgaWYgKERlc3QtPmdldERhdGFMYXlvdXQoKS5lbXB0eSgpKSB7CisgICAgaWYgKCFTcmMtPmdldERhdGFMYXlvdXQoKS5lbXB0eSgpKSB7CisgICAgICBEZXN0LT5zZXREYXRhTGF5b3V0KFNyYy0+Z2V0RGF0YUxheW91dCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpzdHJpbmcgRGF0YUxheW91dDsKKworICAgICAgaWYgKERlc3QtPmdldEVuZGlhbm5lc3MoKSA9PSBNb2R1bGU6OkFueUVuZGlhbm5lc3MpIHsKKyAgICAgICAgaWYgKFNyYy0+Z2V0RW5kaWFubmVzcygpID09IE1vZHVsZTo6QmlnRW5kaWFuKQorICAgICAgICAgIERhdGFMYXlvdXQuYXBwZW5kKCJFIik7CisgICAgICAgIGVsc2UgaWYgKFNyYy0+Z2V0RW5kaWFubmVzcygpID09IE1vZHVsZTo6TGl0dGxlRW5kaWFuKQorICAgICAgICAgIERhdGFMYXlvdXQuYXBwZW5kKCJlIik7CisgICAgICB9CisKKyAgICAgIGlmIChEZXN0LT5nZXRQb2ludGVyU2l6ZSgpID09IE1vZHVsZTo6QW55UG9pbnRlclNpemUpIHsKKyAgICAgICAgaWYgKFNyYy0+Z2V0UG9pbnRlclNpemUoKSA9PSBNb2R1bGU6OlBvaW50ZXI2NCkKKyAgICAgICAgICBEYXRhTGF5b3V0LmFwcGVuZChEYXRhTGF5b3V0Lmxlbmd0aCgpID09IDAgPyAicDo2NDo2NCIgOiAiLXA6NjQ6NjQiKTsKKyAgICAgICAgZWxzZSBpZiAoU3JjLT5nZXRQb2ludGVyU2l6ZSgpID09IE1vZHVsZTo6UG9pbnRlcjMyKQorICAgICAgICAgIERhdGFMYXlvdXQuYXBwZW5kKERhdGFMYXlvdXQubGVuZ3RoKCkgPT0gMCA/ICJwOjMyOjMyIiA6ICItcDozMjozMiIpOworICAgICAgfQorICAgICAgRGVzdC0+c2V0RGF0YUxheW91dChEYXRhTGF5b3V0KTsKKyAgICB9CisgIH0KKworICAvLyBDb3B5IHRoZSB0YXJnZXQgdHJpcGxlIGZyb20gdGhlIHNvdXJjZSB0byBkZXN0IGlmIHRoZSBkZXN0J3MgaXMgZW1wdHkuCisgIGlmIChEZXN0LT5nZXRUYXJnZXRUcmlwbGUoKS5lbXB0eSgpICYmICFTcmMtPmdldFRhcmdldFRyaXBsZSgpLmVtcHR5KCkpCisgICAgRGVzdC0+c2V0VGFyZ2V0VHJpcGxlKFNyYy0+Z2V0VGFyZ2V0VHJpcGxlKCkpOworCisgIGlmICghU3JjLT5nZXREYXRhTGF5b3V0KCkuZW1wdHkoKSAmJiAhRGVzdC0+Z2V0RGF0YUxheW91dCgpLmVtcHR5KCkgJiYKKyAgICAgIFNyYy0+Z2V0RGF0YUxheW91dCgpICE9IERlc3QtPmdldERhdGFMYXlvdXQoKSkKKyAgICBlcnJzKCkgPDwgIldBUk5JTkc6IExpbmtpbmcgdHdvIG1vZHVsZXMgb2YgZGlmZmVyZW50IGRhdGEgbGF5b3V0cyFcbiI7CisgIGlmICghU3JjLT5nZXRUYXJnZXRUcmlwbGUoKS5lbXB0eSgpICYmCisgICAgICBEZXN0LT5nZXRUYXJnZXRUcmlwbGUoKSAhPSBTcmMtPmdldFRhcmdldFRyaXBsZSgpKQorICAgIGVycnMoKSA8PCAiV0FSTklORzogTGlua2luZyB0d28gbW9kdWxlcyBvZiBkaWZmZXJlbnQgdGFyZ2V0IHRyaXBsZXMhXG4iOworCisgIC8vIEFwcGVuZCB0aGUgbW9kdWxlIGlubGluZSBhc20gc3RyaW5nLgorICBpZiAoIVNyYy0+Z2V0TW9kdWxlSW5saW5lQXNtKCkuZW1wdHkoKSkgeworICAgIGlmIChEZXN0LT5nZXRNb2R1bGVJbmxpbmVBc20oKS5lbXB0eSgpKQorICAgICAgRGVzdC0+c2V0TW9kdWxlSW5saW5lQXNtKFNyYy0+Z2V0TW9kdWxlSW5saW5lQXNtKCkpOworICAgIGVsc2UKKyAgICAgIERlc3QtPnNldE1vZHVsZUlubGluZUFzbShEZXN0LT5nZXRNb2R1bGVJbmxpbmVBc20oKSsiXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYy0+Z2V0TW9kdWxlSW5saW5lQXNtKCkpOworICB9CisKKyAgLy8gVXBkYXRlIHRoZSBkZXN0aW5hdGlvbiBtb2R1bGUncyBkZXBlbmRlbnQgbGlicmFyaWVzIGxpc3Qgd2l0aCB0aGUgbGlicmFyaWVzCisgIC8vIGZyb20gdGhlIHNvdXJjZSBtb2R1bGUuIFRoZXJlJ3Mgbm8gb3Bwb3J0dW5pdHkgZm9yIGR1cGxpY2F0ZXMgaGVyZSBhcyB0aGUKKyAgLy8gTW9kdWxlIGVuc3VyZXMgdGhhdCBkdXBsaWNhdGUgaW5zZXJ0aW9ucyBhcmUgZGlzY2FyZGVkLgorICBmb3IgKE1vZHVsZTo6bGliX2l0ZXJhdG9yIFNJID0gU3JjLT5saWJfYmVnaW4oKSwgU0UgPSBTcmMtPmxpYl9lbmQoKTsKKyAgICAgICBTSSAhPSBTRTsgKytTSSkKKyAgICBEZXN0LT5hZGRMaWJyYXJ5KCpTSSk7CisKKyAgLy8gTGlua1R5cGVzIC0gR28gdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZSBTcmMgbW9kdWxlIGFuZCBzZWUgaWYgYW55CisgIC8vIHR5cGVzIGFyZSBuYW1lZCBpbiB0aGUgc3JjIG1vZHVsZSB0aGF0IGFyZSBub3QgbmFtZWQgaW4gdGhlIERzdCBtb2R1bGUuCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gdHlwZSBuYW1lIGNvbmZsaWN0cy4KKyAgaWYgKExpbmtUeXBlcyhEZXN0LCBTcmMsIEVycm9yTXNnKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBWYWx1ZU1hcCAtIE1hcHBpbmcgb2YgdmFsdWVzIGZyb20gd2hhdCB0aGV5IHVzZWQgdG8gYmUgaW4gU3JjLCB0byB3aGF0IHRoZXkKKyAgLy8gYXJlIG5vdyBpbiBEZXN0LgorICBzdGQ6Om1hcDxjb25zdCBWYWx1ZSosIFZhbHVlKj4gVmFsdWVNYXA7CisKKyAgLy8gQXBwZW5kaW5nVmFycyAtIEtlZXAgdHJhY2sgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgZGVzdGluYXRpb24gbW9kdWxlCisgIC8vIHdpdGggYXBwZW5kaW5nIGxpbmthZ2UuICBBZnRlciB0aGUgbW9kdWxlIGlzIGxpbmtlZCB0b2dldGhlciwgdGhleSBhcmUKKyAgLy8gYXBwZW5kZWQgYW5kIHRoZSBtb2R1bGUgaXMgcmV3cml0dGVuLgorICBzdGQ6Om11bHRpbWFwPHN0ZDo6c3RyaW5nLCBHbG9iYWxWYXJpYWJsZSAqPiBBcHBlbmRpbmdWYXJzOworICBmb3IgKE1vZHVsZTo6Z2xvYmFsX2l0ZXJhdG9yIEkgPSBEZXN0LT5nbG9iYWxfYmVnaW4oKSwgRSA9IERlc3QtPmdsb2JhbF9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIC8vIEFkZCBhbGwgb2YgdGhlIGFwcGVuZGluZyBnbG9iYWxzIGFscmVhZHkgaW4gdGhlIERlc3QgbW9kdWxlIHRvCisgICAgLy8gQXBwZW5kaW5nVmFycy4KKyAgICBpZiAoSS0+aGFzQXBwZW5kaW5nTGlua2FnZSgpKQorICAgICAgQXBwZW5kaW5nVmFycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSS0+Z2V0TmFtZSgpLCBJKSk7CisgIH0KKworICAvLyBJbnNlcnQgYWxsIG9mIHRoZSBuYW1lZCBtZG5vZXMgaW4gU3JjIGludG8gdGhlIERlc3QgbW9kdWxlLgorICBMaW5rTmFtZWRNRE5vZGVzKERlc3QsIFNyYyk7CisKKyAgLy8gSW5zZXJ0IGFsbCBvZiB0aGUgZ2xvYmFscyBpbiBzcmMgaW50byB0aGUgRGVzdCBtb2R1bGUuLi4gd2l0aG91dCBsaW5raW5nCisgIC8vIGluaXRpYWxpemVycyAod2hpY2ggY291bGQgcmVmZXIgdG8gZnVuY3Rpb25zIG5vdCB5ZXQgbWFwcGVkIG92ZXIpLgorICBpZiAoTGlua0dsb2JhbHMoRGVzdCwgU3JjLCBWYWx1ZU1hcCwgQXBwZW5kaW5nVmFycywgRXJyb3JNc2cpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIExpbmsgdGhlIGZ1bmN0aW9ucyB0b2dldGhlciBiZXR3ZWVuIHRoZSB0d28gbW9kdWxlcywgd2l0aG91dCBkb2luZyBmdW5jdGlvbgorICAvLyBib2RpZXMuLi4gdGhpcyBqdXN0IGFkZHMgZXh0ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyB0byB0aGUgRGVzdAorICAvLyBmdW5jdGlvbi4uLiAgV2UgZG8gdGhpcyBzbyB0aGF0IHdoZW4gd2UgYmVnaW4gcHJvY2Vzc2luZyBmdW5jdGlvbiBib2RpZXMsCisgIC8vIGFsbCBvZiB0aGUgZ2xvYmFsIHZhbHVlcyB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGFyZSBhdmFpbGFibGUgaW4gb3VyCisgIC8vIFZhbHVlTWFwLgorICBpZiAoTGlua0Z1bmN0aW9uUHJvdG9zKERlc3QsIFNyYywgVmFsdWVNYXAsIEVycm9yTXNnKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiB0aGVyZSB3ZXJlIGFueSBhbGlhcywgbGluayB0aGVtIG5vdy4gV2UgcmVhbGx5IG5lZWQgdG8gZG8gdGhpcyBub3csCisgIC8vIGJlY2F1c2UgYWxsIG9mIHRoZSBhbGlhc2VzIHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgbmVlZCB0byBiZSBhdmFpbGFibGUgaW4KKyAgLy8gVmFsdWVNYXAKKyAgaWYgKExpbmtBbGlhcyhEZXN0LCBTcmMsIFZhbHVlTWFwLCBFcnJvck1zZykpIHJldHVybiB0cnVlOworCisgIC8vIFVwZGF0ZSB0aGUgaW5pdGlhbGl6ZXJzIGluIHRoZSBEZXN0IG1vZHVsZSBub3cgdGhhdCBhbGwgZ2xvYmFscyB0aGF0IG1heQorICAvLyBiZSByZWZlcmVuY2VkIGFyZSBpbiBEZXN0LgorICBpZiAoTGlua0dsb2JhbEluaXRzKERlc3QsIFNyYywgVmFsdWVNYXAsIEVycm9yTXNnKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gTGluayBpbiB0aGUgZnVuY3Rpb24gYm9kaWVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIHNvdXJjZSBtb2R1bGUgaW50byB0aGUKKyAgLy8gRGVzdE1vZHVsZS4gIFRoaXMgY29uc2lzdHMgYmFzaWNhbGx5IG9mIGNvcHlpbmcgdGhlIGZ1bmN0aW9uIG92ZXIgYW5kCisgIC8vIGZpeGluZyB1cCByZWZlcmVuY2VzIHRvIHZhbHVlcy4KKyAgaWYgKExpbmtGdW5jdGlvbkJvZGllcyhEZXN0LCBTcmMsIFZhbHVlTWFwLCBFcnJvck1zZykpIHJldHVybiB0cnVlOworCisgIC8vIElmIHRoZXJlIHdlcmUgYW55IGFwcGVuZGluZyBnbG9iYWwgdmFyaWFibGVzLCBsaW5rIHRoZW0gdG9nZXRoZXIgbm93LgorICBpZiAoTGlua0FwcGVuZGluZ1ZhcnMoRGVzdCwgQXBwZW5kaW5nVmFycywgRXJyb3JNc2cpKSByZXR1cm4gdHJ1ZTsKKworICAvLyBSZXNvbHZlIGFsbCB1c2VzIG9mIGFsaWFzZXMgd2l0aCBhbGlhc2VlcworICBpZiAoUmVzb2x2ZUFsaWFzZXMoRGVzdCkpIHJldHVybiB0cnVlOworCisgIC8vIElmIHRoZSBzb3VyY2UgbGlicmFyeSdzIG1vZHVsZSBpZCBpcyBpbiB0aGUgZGVwZW5kZW50IGxpYnJhcnkgbGlzdCBvZiB0aGUKKyAgLy8gZGVzdGluYXRpb24gbGlicmFyeSwgcmVtb3ZlIGl0IHNpbmNlIHRoYXQgbW9kdWxlIGlzIG5vdyBsaW5rZWQgaW4uCisgIHN5czo6UGF0aCBtb2RJZDsKKyAgbW9kSWQuc2V0KFNyYy0+Z2V0TW9kdWxlSWRlbnRpZmllcigpKTsKKyAgaWYgKCFtb2RJZC5pc0VtcHR5KCkpCisgICAgRGVzdC0+cmVtb3ZlTGlicmFyeShtb2RJZC5nZXRCYXNlbmFtZSgpKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHZpbTogc3c9MgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0xpbmtlci9MaW5rZXIuY3BwIGIvc3JjL0xMVk0vbGliL0xpbmtlci9MaW5rZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYWEwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTGlua2VyL0xpbmtlci5jcHAKQEAgLTAsMCArMSwxNzIgQEAKKy8vPT09LSBsaWIvTGlua2VyL0xpbmtlci5jcHAgLSBCYXNpYyBMaW5rZXIgZnVuY3Rpb25hbGl0eSAgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGJhc2ljIExpbmtlciBmdW5jdGlvbmFsaXR5IHRoYXQgYWxsIHVzYWdlcyB3aWxsIG5lZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTGlua2VyLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvUmVhZGVyV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitMaW5rZXI6OkxpbmtlcihTdHJpbmdSZWYgcHJvZ25hbWUsIFN0cmluZ1JlZiBtb2RuYW1lLAorICAgICAgICAgICAgICAgTExWTUNvbnRleHQmIEMsIHVuc2lnbmVkIGZsYWdzKToKKyAgQ29udGV4dChDKSwKKyAgQ29tcG9zaXRlKG5ldyBNb2R1bGUobW9kbmFtZSwgQykpLAorICBMaWJQYXRocygpLAorICBGbGFncyhmbGFncyksCisgIEVycm9yKCksCisgIFByb2dyYW1OYW1lKHByb2duYW1lKSB7IH0KKworTGlua2VyOjpMaW5rZXIoU3RyaW5nUmVmIHByb2duYW1lLCBNb2R1bGUqIGFNb2R1bGUsIHVuc2lnbmVkIGZsYWdzKSA6CisgIENvbnRleHQoYU1vZHVsZS0+Z2V0Q29udGV4dCgpKSwKKyAgQ29tcG9zaXRlKGFNb2R1bGUpLAorICBMaWJQYXRocygpLAorICBGbGFncyhmbGFncyksCisgIEVycm9yKCksCisgIFByb2dyYW1OYW1lKHByb2duYW1lKSB7IH0KKworTGlua2VyOjp+TGlua2VyKCkgeworICBkZWxldGUgQ29tcG9zaXRlOworfQorCitib29sCitMaW5rZXI6OmVycm9yKFN0cmluZ1JlZiBtZXNzYWdlKSB7CisgIEVycm9yID0gbWVzc2FnZTsKKyAgaWYgKCEoRmxhZ3MmUXVpZXRFcnJvcnMpKQorICAgIGVycnMoKSA8PCBQcm9ncmFtTmFtZSA8PCAiOiBlcnJvcjogIiA8PCBtZXNzYWdlIDw8ICJcbiI7CisgIHJldHVybiB0cnVlOworfQorCitib29sCitMaW5rZXI6Ondhcm5pbmcoU3RyaW5nUmVmIG1lc3NhZ2UpIHsKKyAgRXJyb3IgPSBtZXNzYWdlOworICBpZiAoIShGbGFncyZRdWlldFdhcm5pbmdzKSkKKyAgICBlcnJzKCkgPDwgUHJvZ3JhbU5hbWUgPDwgIjogd2FybmluZzogIiA8PCBtZXNzYWdlIDw8ICJcbiI7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZAorTGlua2VyOjp2ZXJib3NlKFN0cmluZ1JlZiBtZXNzYWdlKSB7CisgIGlmIChGbGFncyZWZXJib3NlKQorICAgIGVycnMoKSA8PCAiICAiIDw8IG1lc3NhZ2UgPDwgIlxuIjsKK30KKwordm9pZAorTGlua2VyOjphZGRQYXRoKGNvbnN0IHN5czo6UGF0aCYgcGF0aCkgeworICBMaWJQYXRocy5wdXNoX2JhY2socGF0aCk7Cit9CisKK3ZvaWQKK0xpbmtlcjo6YWRkUGF0aHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXRocykgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gcGF0aHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBMaWJQYXRocy5wdXNoX2JhY2soc3lzOjpQYXRoKHBhdGhzW2ldKSk7Cit9CisKK3ZvaWQKK0xpbmtlcjo6YWRkU3lzdGVtUGF0aHMoKSB7CisgIHN5czo6UGF0aDo6R2V0Qml0Y29kZUxpYnJhcnlQYXRocyhMaWJQYXRocyk7CisgIExpYlBhdGhzLmluc2VydChMaWJQYXRocy5iZWdpbigpLHN5czo6UGF0aCgiLi8iKSk7Cit9CisKK01vZHVsZSoKK0xpbmtlcjo6cmVsZWFzZU1vZHVsZSgpIHsKKyAgTW9kdWxlKiByZXN1bHQgPSBDb21wb3NpdGU7CisgIExpYlBhdGhzLmNsZWFyKCk7CisgIEVycm9yLmNsZWFyKCk7CisgIENvbXBvc2l0ZSA9IDA7CisgIEZsYWdzID0gMDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gTG9hZE9iamVjdCAtIFJlYWQgaW4gYW5kIHBhcnNlIHRoZSBiaXRjb2RlIGZpbGUgbmFtZWQgYnkgRk4gYW5kIHJldHVybiB0aGUKKy8vIG1vZHVsZSBpdCBjb250YWlucyAod3JhcHBlZCBpbiBhbiBhdXRvX3B0ciksIG9yIGF1dG9fcHRyPE1vZHVsZT4oKSBhbmQgc2V0CisvLyBFcnJvciBpZiBhbiBlcnJvciBvY2N1cnMuCitzdGQ6OmF1dG9fcHRyPE1vZHVsZT4KK0xpbmtlcjo6TG9hZE9iamVjdChjb25zdCBzeXM6OlBhdGggJkZOKSB7CisgIHN0ZDo6c3RyaW5nIFBhcnNlRXJyb3JNZXNzYWdlOworICBNb2R1bGUgKlJlc3VsdCA9IDA7CisgIAorICBzdGQ6OmF1dG9fcHRyPE1lbW9yeUJ1ZmZlcj4gQnVmZmVyKE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZU9yU1RESU4oRk4uY19zdHIoKSkpOworICBpZiAoQnVmZmVyLmdldCgpKQorICAgIFJlc3VsdCA9IFBhcnNlQml0Y29kZUZpbGUoQnVmZmVyLmdldCgpLCBDb250ZXh0LCAmUGFyc2VFcnJvck1lc3NhZ2UpOworICBlbHNlCisgICAgUGFyc2VFcnJvck1lc3NhZ2UgPSAiRXJyb3IgcmVhZGluZyBmaWxlICciICsgRk4uc3RyKCkgKyAiJyI7CisgICAgCisgIGlmIChSZXN1bHQpCisgICAgcmV0dXJuIHN0ZDo6YXV0b19wdHI8TW9kdWxlPihSZXN1bHQpOworICBFcnJvciA9ICJCaXRjb2RlIGZpbGUgJyIgKyBGTi5zdHIoKSArICInIGNvdWxkIG5vdCBiZSBsb2FkZWQiOworICBpZiAoUGFyc2VFcnJvck1lc3NhZ2Uuc2l6ZSgpKQorICAgIEVycm9yICs9ICI6ICIgKyBQYXJzZUVycm9yTWVzc2FnZTsKKyAgcmV0dXJuIHN0ZDo6YXV0b19wdHI8TW9kdWxlPigpOworfQorCisvLyBJc0xpYnJhcnkgLSBEZXRlcm1pbmUgaWYgIk5hbWUiIGlzIGEgbGlicmFyeSBpbiAiRGlyZWN0b3J5Ii4gUmV0dXJuCisvLyBhIG5vbi1lbXB0eSBzeXM6OlBhdGggaWYgaXRzIGZvdW5kLCBhbiBlbXB0eSBvbmUgb3RoZXJ3aXNlLgorc3RhdGljIGlubGluZSBzeXM6OlBhdGggSXNMaWJyYXJ5KFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5czo6UGF0aCAmRGlyZWN0b3J5KSB7CisKKyAgc3lzOjpQYXRoIEZ1bGxQYXRoKERpcmVjdG9yeSk7CisKKyAgLy8gVHJ5IHRoZSBsaWJYLmEgZm9ybQorICBGdWxsUGF0aC5hcHBlbmRDb21wb25lbnQoKCJsaWIiICsgTmFtZSkuc3RyKCkpOworICBGdWxsUGF0aC5hcHBlbmRTdWZmaXgoImEiKTsKKyAgaWYgKEZ1bGxQYXRoLmlzQXJjaGl2ZSgpKQorICAgIHJldHVybiBGdWxsUGF0aDsKKworICAvLyBUcnkgdGhlIGxpYlguYmNhIGZvcm0KKyAgRnVsbFBhdGguZXJhc2VTdWZmaXgoKTsKKyAgRnVsbFBhdGguYXBwZW5kU3VmZml4KCJiY2EiKTsKKyAgaWYgKEZ1bGxQYXRoLmlzQXJjaGl2ZSgpKQorICAgIHJldHVybiBGdWxsUGF0aDsKKworICAvLyBUcnkgdGhlIGxpYlguc28gKG9yIC5keWxpYikgZm9ybQorICBGdWxsUGF0aC5lcmFzZVN1ZmZpeCgpOworICBGdWxsUGF0aC5hcHBlbmRTdWZmaXgoJihMVERMX1NITElCX0VYVFsxXSkpOworICBpZiAoRnVsbFBhdGguaXNEeW5hbWljTGlicmFyeSgpKSAgLy8gTmF0aXZlIHNoYXJlZCBsaWJyYXJ5PworICAgIHJldHVybiBGdWxsUGF0aDsKKyAgaWYgKEZ1bGxQYXRoLmlzQml0Y29kZUZpbGUoKSkgICAgLy8gLnNvIGZpbGUgY29udGFpbmluZyBiaXRjb2RlPworICAgIHJldHVybiBGdWxsUGF0aDsKKworICAvLyBOb3QgZm91bmQgLi4gZmFsbCB0aHJvdWdoCisKKyAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgbGlicmFyeSB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuCisgIEZ1bGxQYXRoLmNsZWFyKCk7CisgIHJldHVybiBGdWxsUGF0aDsKK30KKworLy8vIEZpbmRMaWIgLSBUcnkgdG8gY29udmVydCBGaWxlbmFtZSBpbnRvIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IHdlIGNhbiBvcGVuLAorLy8vIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgbmFtZSBhIGZpbGUgd2UgY2FuIG9wZW4sIGJ5IGZpcnN0IHRyeWluZyB0byBvcGVuCisvLy8gRmlsZW5hbWUsIHRoZW4gbGliRmlsZW5hbWUuW3N1ZmZpeF0gZm9yIGVhY2ggb2YgYSBzZXQgb2Ygc2V2ZXJhbCBjb21tb24KKy8vLyBsaWJyYXJ5IHN1ZmZpeGVzLCBpbiBlYWNoIG9mIHRoZSBkaXJlY3RvcmllcyBpbiBMaWJQYXRocy4gUmV0dXJucyBhbiBlbXB0eQorLy8vIFBhdGggaWYgbm8gbWF0Y2hpbmcgZmlsZSBjYW4gYmUgZm91bmQuCisvLy8KK3N5czo6UGF0aAorTGlua2VyOjpGaW5kTGliKFN0cmluZ1JlZiBGaWxlbmFtZSkgeworICAvLyBEZXRlcm1pbmUgaWYgdGhlIHBhdGhuYW1lIGNhbiBiZSBmb3VuZCBhcyBpdCBzdGFuZHMuCisgIHN5czo6UGF0aCBGaWxlUGF0aChGaWxlbmFtZSk7CisgIGlmIChGaWxlUGF0aC5jYW5SZWFkKCkgJiYKKyAgICAgIChGaWxlUGF0aC5pc0FyY2hpdmUoKSB8fCBGaWxlUGF0aC5pc0R5bmFtaWNMaWJyYXJ5KCkpKQorICAgIHJldHVybiBGaWxlUGF0aDsKKworICAvLyBJdGVyYXRlIG92ZXIgdGhlIGRpcmVjdG9yaWVzIGluIFBhdGhzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCB0aGUgbGlicmFyeQorICAvLyB0aGVyZS4KKyAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4ICE9IExpYlBhdGhzLnNpemUoKTsgKytJbmRleCkgeworICAgIHN5czo6UGF0aCBEaXJlY3RvcnkoTGliUGF0aHNbSW5kZXhdKTsKKyAgICBzeXM6OlBhdGggRnVsbFBhdGggPSBJc0xpYnJhcnkoRmlsZW5hbWUsIERpcmVjdG9yeSk7CisgICAgaWYgKCFGdWxsUGF0aC5pc0VtcHR5KCkpCisgICAgICByZXR1cm4gRnVsbFBhdGg7CisgIH0KKyAgcmV0dXJuIHN5czo6UGF0aCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL0xpbmtlci9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9MaW5rZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllNjQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9MaW5rZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9MaW5rZXIvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNTGlua2VyCitCVUlMRF9BUkNISVZFIDo9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL01DL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWIzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMSBAQAorYWRkX2xsdm1fbGlicmFyeShMTFZNTUMKKyAgTUNBc21JbmZvLmNwcAorICBNQ0FzbUluZm9DT0ZGLmNwcAorICBNQ0FzbUluZm9EYXJ3aW4uY3BwCisgIE1DQXNtU3RyZWFtZXIuY3BwCisgIE1DQXNzZW1ibGVyLmNwcAorICBNQ0NvZGVFbWl0dGVyLmNwcAorICBNQ0NvbnRleHQuY3BwCisgIE1DRGlzYXNzZW1ibGVyLmNwcAorICBNQ0V4cHIuY3BwCisgIE1DSW5zdC5jcHAKKyAgTUNJbnN0UHJpbnRlci5jcHAKKyAgTUNMYWJlbC5jcHAKKyAgTUNEd2FyZi5jcHAKKyAgTUNMb2dnaW5nU3RyZWFtZXIuY3BwCisgIE1DTWFjaE9TdHJlYW1lci5jcHAKKyAgTUNOdWxsU3RyZWFtZXIuY3BwCisgIE1DT2JqZWN0U3RyZWFtZXIuY3BwCisgIE1DT2JqZWN0V3JpdGVyLmNwcAorICBNQ1NlY3Rpb24uY3BwCisgIE1DU2VjdGlvbkNPRkYuY3BwCisgIE1DU2VjdGlvbkVMRi5jcHAKKyAgTUNTZWN0aW9uTWFjaE8uY3BwCisgIE1DU3RyZWFtZXIuY3BwCisgIE1DU3ltYm9sLmNwcAorICBNQ1ZhbHVlLmNwcAorICBNYWNoT2JqZWN0V3JpdGVyLmNwcAorICBXaW5DT0ZGU3RyZWFtZXIuY3BwCisgIFdpbkNPRkZPYmplY3RXcml0ZXIuY3BwCisgIFRhcmdldEFzbUJhY2tlbmQuY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ0FzbUluZm8uY3BwIGIvc3JjL0xMVk0vbGliL01DL01DQXNtSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3NWJlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ0FzbUluZm8uY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0tIE1DQXNtSW5mby5jcHAgLSBBc20gSW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRhcmdldCBhc20gcHJvcGVydGllcyByZWxhdGVkIHdoYXQgZm9ybSBhc20gc3RhdGVtZW50cworLy8gc2hvdWxkIHRha2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNzdHJpbmc+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworTUNBc21JbmZvOjpNQ0FzbUluZm8oKSB7CisgIEhhc1N1YnNlY3Rpb25zVmlhU3ltYm9scyA9IGZhbHNlOworICBIYXNNYWNob1plcm9GaWxsRGlyZWN0aXZlID0gZmFsc2U7CisgIEhhc01hY2hvVEJTU0RpcmVjdGl2ZSA9IGZhbHNlOworICBIYXNTdGF0aWNDdG9yRHRvclJlZmVyZW5jZUluU3RhdGljTW9kZSA9IGZhbHNlOworICBNYXhJbnN0TGVuZ3RoID0gNDsKKyAgUENTeW1ib2wgPSAiJCI7CisgIFNlcGFyYXRvckNoYXIgPSAnOyc7CisgIENvbW1lbnRDb2x1bW4gPSA0MDsKKyAgQ29tbWVudFN0cmluZyA9ICIjIjsKKyAgR2xvYmFsUHJlZml4ID0gIiI7CisgIFByaXZhdGVHbG9iYWxQcmVmaXggPSAiLiI7CisgIExpbmtlclByaXZhdGVHbG9iYWxQcmVmaXggPSAiIjsKKyAgSW5saW5lQXNtU3RhcnQgPSAiQVBQIjsKKyAgSW5saW5lQXNtRW5kID0gIk5PX0FQUCI7CisgIEFzc2VtYmxlckRpYWxlY3QgPSAwOworICBBbGxvd1F1b3Rlc0luTmFtZSA9IGZhbHNlOworICBBbGxvd05hbWVUb1N0YXJ0V2l0aERpZ2l0ID0gZmFsc2U7CisgIEFsbG93UGVyaW9kc0luTmFtZSA9IHRydWU7CisgIFplcm9EaXJlY3RpdmUgPSAiXHQuemVyb1x0IjsKKyAgQXNjaWlEaXJlY3RpdmUgPSAiXHQuYXNjaWlcdCI7CisgIEFzY2l6RGlyZWN0aXZlID0gIlx0LmFzY2l6XHQiOworICBEYXRhOGJpdHNEaXJlY3RpdmUgPSAiXHQuYnl0ZVx0IjsKKyAgRGF0YTE2Yml0c0RpcmVjdGl2ZSA9ICJcdC5zaG9ydFx0IjsKKyAgRGF0YTMyYml0c0RpcmVjdGl2ZSA9ICJcdC5sb25nXHQiOworICBEYXRhNjRiaXRzRGlyZWN0aXZlID0gIlx0LnF1YWRcdCI7CisgIFN1blN0eWxlRUxGU2VjdGlvblN3aXRjaFN5bnRheCA9IGZhbHNlOworICBVc2VzRUxGU2VjdGlvbkRpcmVjdGl2ZUZvckJTUyA9IGZhbHNlOworICBBbGlnbkRpcmVjdGl2ZSA9ICJcdC5hbGlnblx0IjsKKyAgQWxpZ25tZW50SXNJbkJ5dGVzID0gdHJ1ZTsKKyAgVGV4dEFsaWduRmlsbFZhbHVlID0gMDsKKyAgR1BSZWwzMkRpcmVjdGl2ZSA9IDA7CisgIEdsb2JhbERpcmVjdGl2ZSA9ICJcdC5nbG9ibFx0IjsKKyAgSGFzU2V0RGlyZWN0aXZlID0gdHJ1ZTsKKyAgSGFzTENPTU1EaXJlY3RpdmUgPSBmYWxzZTsKKyAgQ09NTURpcmVjdGl2ZUFsaWdubWVudElzSW5CeXRlcyA9IHRydWU7CisgIEhhc0RvdFR5cGVEb3RTaXplRGlyZWN0aXZlID0gdHJ1ZTsKKyAgSGFzU2luZ2xlUGFyYW1ldGVyRG90RmlsZSA9IHRydWU7CisgIEhhc05vRGVhZFN0cmlwID0gZmFsc2U7CisgIFdlYWtSZWZEaXJlY3RpdmUgPSAwOworICBXZWFrRGVmRGlyZWN0aXZlID0gMDsKKyAgTGlua09uY2VEaXJlY3RpdmUgPSAwOworICBIaWRkZW5WaXNpYmlsaXR5QXR0ciA9IE1DU0FfSGlkZGVuOworICBQcm90ZWN0ZWRWaXNpYmlsaXR5QXR0ciA9IE1DU0FfUHJvdGVjdGVkOworICBIYXNMRUIxMjggPSBmYWxzZTsKKyAgSGFzRG90TG9jQW5kRG90RmlsZSA9IGZhbHNlOworICBTdXBwb3J0c0RlYnVnSW5mb3JtYXRpb24gPSBmYWxzZTsKKyAgRXhjZXB0aW9uc1R5cGUgPSBFeGNlcHRpb25IYW5kbGluZzo6Tm9uZTsKKyAgRHdhcmZSZXF1aXJlc0ZyYW1lU2VjdGlvbiA9IHRydWU7CisgIER3YXJmVXNlc0lubGluZUluZm9TZWN0aW9uID0gZmFsc2U7CisgIER3YXJmU2VjdGlvbk9mZnNldERpcmVjdGl2ZSA9IDA7CisgIEhhc01pY3Jvc29mdEZhc3RTdGRDYWxsTWFuZ2xpbmcgPSBmYWxzZTsKKworICBBc21UcmFuc0NCRSA9IDA7Cit9CisKK01DQXNtSW5mbzo6fk1DQXNtSW5mbygpIHsKK30KKworCit1bnNpZ25lZCBNQ0FzbUluZm86OmdldFVMRUIxMjhTaXplKHVuc2lnbmVkIFZhbHVlKSB7CisgIHVuc2lnbmVkIFNpemUgPSAwOworICBkbyB7CisgICAgVmFsdWUgPj49IDc7CisgICAgU2l6ZSArPSBzaXplb2YoaW50OF90KTsKKyAgfSB3aGlsZSAoVmFsdWUpOworICByZXR1cm4gU2l6ZTsKK30KKwordW5zaWduZWQgTUNBc21JbmZvOjpnZXRTTEVCMTI4U2l6ZShpbnQgVmFsdWUpIHsKKyAgdW5zaWduZWQgU2l6ZSA9IDA7CisgIGludCBTaWduID0gVmFsdWUgPj4gKDggKiBzaXplb2YoVmFsdWUpIC0gMSk7CisgIGJvb2wgSXNNb3JlOworCisgIGRvIHsKKyAgICB1bnNpZ25lZCBCeXRlID0gVmFsdWUgJiAweDdmOworICAgIFZhbHVlID4+PSA3OworICAgIElzTW9yZSA9IFZhbHVlICE9IFNpZ24gfHwgKChCeXRlIF4gU2lnbikgJiAweDQwKSAhPSAwOworICAgIFNpemUgKz0gc2l6ZW9mKGludDhfdCk7CisgIH0gd2hpbGUgKElzTW9yZSk7CisgIHJldHVybiBTaXplOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01DQXNtSW5mb0NPRkYuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DQXNtSW5mb0NPRkYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzdkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNBc21JbmZvQ09GRi5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tLSBNQ0FzbUluZm9DT0ZGLmNwcCAtIENPRkYgYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0YXJnZXQgYXNtIHByb3BlcnRpZXMgcmVsYXRlZCB3aGF0IGZvcm0gYXNtIHN0YXRlbWVudHMKKy8vIHNob3VsZCB0YWtlIGluIGdlbmVyYWwgb24gQ09GRi1iYXNlZCB0YXJnZXRzCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvQ09GRi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworTUNBc21JbmZvQ09GRjo6TUNBc21JbmZvQ09GRigpIHsKKyAgR2xvYmFsUHJlZml4ID0gIl8iOworICBDT01NRGlyZWN0aXZlQWxpZ25tZW50SXNJbkJ5dGVzID0gZmFsc2U7CisgIEhhc0xDT01NRGlyZWN0aXZlID0gdHJ1ZTsKKyAgSGFzRG90VHlwZURvdFNpemVEaXJlY3RpdmUgPSBmYWxzZTsKKyAgSGFzU2luZ2xlUGFyYW1ldGVyRG90RmlsZSA9IGZhbHNlOworICBQcml2YXRlR2xvYmFsUHJlZml4ID0gIkwiOyAgLy8gUHJlZml4IGZvciBwcml2YXRlIGdsb2JhbCBzeW1ib2xzCisgIFdlYWtSZWZEaXJlY3RpdmUgPSAiXHQud2Vha1x0IjsKKyAgTGlua09uY2VEaXJlY3RpdmUgPSAiXHQubGlua29uY2UgZGlzY2FyZFxuIjsKKyAgCisgIC8vIERvZXNuJ3Qgc3VwcG9ydCB2aXNpYmlsaXR5OgorICBIaWRkZW5WaXNpYmlsaXR5QXR0ciA9IFByb3RlY3RlZFZpc2liaWxpdHlBdHRyID0gTUNTQV9JbnZhbGlkOworCisgIC8vIFNldCB1cCBEV0FSRiBkaXJlY3RpdmVzCisgIEhhc0xFQjEyOCA9IHRydWU7ICAvLyBUYXJnZXQgYXNtIHN1cHBvcnRzIGxlYjEyOCBkaXJlY3RpdmVzIChsaXR0bGUtZW5kaWFuKQorICBTdXBwb3J0c0RlYnVnSW5mb3JtYXRpb24gPSB0cnVlOworICBEd2FyZlNlY3Rpb25PZmZzZXREaXJlY3RpdmUgPSAiXHQuc2VjcmVsMzJcdCI7CisgIEhhc01pY3Jvc29mdEZhc3RTdGRDYWxsTWFuZ2xpbmcgPSB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01DQXNtSW5mb0Rhcndpbi5jcHAgYi9zcmMvTExWTS9saWIvTUMvTUNBc21JbmZvRGFyd2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmQzYjJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DQXNtSW5mb0Rhcndpbi5jcHAKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tLSBNQ0FzbUluZm9EYXJ3aW4uY3BwIC0gRGFyd2luIGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0YXJnZXQgYXNtIHByb3BlcnRpZXMgcmVsYXRlZCB3aGF0IGZvcm0gYXNtIHN0YXRlbWVudHMKKy8vIHNob3VsZCB0YWtlIGluIGdlbmVyYWwgb24gRGFyd2luLWJhc2VkIHRhcmdldHMKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm9EYXJ3aW4uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNQ0FzbUluZm9EYXJ3aW46Ok1DQXNtSW5mb0RhcndpbigpIHsKKyAgLy8gQ29tbW9uIHNldHRpbmdzIGZvciBhbGwgRGFyd2luIHRhcmdldHMuCisgIC8vIFN5bnRheDoKKyAgR2xvYmFsUHJlZml4ID0gIl8iOworICBQcml2YXRlR2xvYmFsUHJlZml4ID0gIkwiOworICBMaW5rZXJQcml2YXRlR2xvYmFsUHJlZml4ID0gImwiOworICBBbGxvd1F1b3Rlc0luTmFtZSA9IHRydWU7CisgIEhhc1NpbmdsZVBhcmFtZXRlckRvdEZpbGUgPSBmYWxzZTsKKyAgSGFzU3Vic2VjdGlvbnNWaWFTeW1ib2xzID0gdHJ1ZTsKKworICBBbGlnbm1lbnRJc0luQnl0ZXMgPSBmYWxzZTsKKyAgQ09NTURpcmVjdGl2ZUFsaWdubWVudElzSW5CeXRlcyA9IGZhbHNlOworICBJbmxpbmVBc21TdGFydCA9ICIgSW5saW5lQXNtIFN0YXJ0IjsKKyAgSW5saW5lQXNtRW5kID0gIiBJbmxpbmVBc20gRW5kIjsKKworICAvLyBEaXJlY3RpdmVzOgorICBXZWFrRGVmRGlyZWN0aXZlID0gIlx0LndlYWtfZGVmaW5pdGlvbiAiOworICBXZWFrUmVmRGlyZWN0aXZlID0gIlx0LndlYWtfcmVmZXJlbmNlICI7CisgIFplcm9EaXJlY3RpdmUgPSAiXHQuc3BhY2VcdCI7ICAvLyAiLnNwYWNlIE4iIGVtaXRzIE4gemVyb3MuCisgIEhhc01hY2hvWmVyb0ZpbGxEaXJlY3RpdmUgPSB0cnVlOyAgLy8gVXNlcyAuemVyb2ZpbGwKKyAgSGFzTWFjaG9UQlNTRGlyZWN0aXZlID0gdHJ1ZTsgLy8gVXNlcyAudGJzcworICBIYXNTdGF0aWNDdG9yRHRvclJlZmVyZW5jZUluU3RhdGljTW9kZSA9IHRydWU7CisgIAorICBIaWRkZW5WaXNpYmlsaXR5QXR0ciA9IE1DU0FfUHJpdmF0ZUV4dGVybjsKKyAgLy8gRG9lc24ndCBzdXBwb3J0IHByb3RlY3RlZCB2aXNpYmlsaXR5LgorICBQcm90ZWN0ZWRWaXNpYmlsaXR5QXR0ciA9IE1DU0FfR2xvYmFsOworICAKKyAgSGFzRG90VHlwZURvdFNpemVEaXJlY3RpdmUgPSBmYWxzZTsKKyAgSGFzTm9EZWFkU3RyaXAgPSB0cnVlOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNBc21TdHJlYW1lci5jcHAgYi9zcmMvTExWTS9saWIvTUMvTUNBc21TdHJlYW1lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkZWRiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ0FzbVN0cmVhbWVyLmNwcApAQCAtMCwwICsxLDcwNiBAQAorLy89PT0tIGxpYi9NQy9NQ0FzbVN0cmVhbWVyLmNwcCAtIFRleHQgQXNzZW1ibHkgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTUMvTUNTdHJlYW1lci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvZGVFbWl0dGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3RQcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTUNBc21TdHJlYW1lciA6IHB1YmxpYyBNQ1N0cmVhbWVyIHsKKyAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZPUzsKKyAgY29uc3QgTUNBc21JbmZvICZNQUk7CisgIE93bmluZ1B0cjxNQ0luc3RQcmludGVyPiBJbnN0UHJpbnRlcjsKKyAgT3duaW5nUHRyPE1DQ29kZUVtaXR0ZXI+IEVtaXR0ZXI7CisgIAorICBTbWFsbFN0cmluZzwxMjg+IENvbW1lbnRUb0VtaXQ7CisgIHJhd19zdmVjdG9yX29zdHJlYW0gQ29tbWVudFN0cmVhbTsKKworICB1bnNpZ25lZCBJc0xpdHRsZUVuZGlhbiA6IDE7CisgIHVuc2lnbmVkIElzVmVyYm9zZUFzbSA6IDE7CisgIHVuc2lnbmVkIFNob3dJbnN0IDogMTsKKworcHVibGljOgorICBNQ0FzbVN0cmVhbWVyKE1DQ29udGV4dCAmQ29udGV4dCwgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZvcywKKyAgICAgICAgICAgICAgICBib29sIGlzTGl0dGxlRW5kaWFuLCBib29sIGlzVmVyYm9zZUFzbSwgTUNJbnN0UHJpbnRlciAqcHJpbnRlciwKKyAgICAgICAgICAgICAgICBNQ0NvZGVFbWl0dGVyICplbWl0dGVyLCBib29sIHNob3dJbnN0KQorICAgIDogTUNTdHJlYW1lcihDb250ZXh0KSwgT1Mob3MpLCBNQUkoQ29udGV4dC5nZXRBc21JbmZvKCkpLAorICAgICAgSW5zdFByaW50ZXIocHJpbnRlciksIEVtaXR0ZXIoZW1pdHRlciksIENvbW1lbnRTdHJlYW0oQ29tbWVudFRvRW1pdCksCisgICAgICBJc0xpdHRsZUVuZGlhbihpc0xpdHRsZUVuZGlhbiksIElzVmVyYm9zZUFzbShpc1ZlcmJvc2VBc20pLAorICAgICAgU2hvd0luc3Qoc2hvd0luc3QpIHsKKyAgICBpZiAoSW5zdFByaW50ZXIgJiYgSXNWZXJib3NlQXNtKQorICAgICAgSW5zdFByaW50ZXItPnNldENvbW1lbnRTdHJlYW0oQ29tbWVudFN0cmVhbSk7CisgIH0KKyAgfk1DQXNtU3RyZWFtZXIoKSB7fQorCisgIGJvb2wgaXNMaXR0bGVFbmRpYW4oKSBjb25zdCB7IHJldHVybiBJc0xpdHRsZUVuZGlhbjsgfQorCisgIGlubGluZSB2b2lkIEVtaXRFT0woKSB7CisgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY29tbWVudHMsIGp1c3QgZW1pdCBhIFxuLgorICAgIGlmICghSXNWZXJib3NlQXNtKSB7CisgICAgICBPUyA8PCAnXG4nOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBFbWl0Q29tbWVudHNBbmRFT0woKTsKKyAgfQorICB2b2lkIEVtaXRDb21tZW50c0FuZEVPTCgpOworCisgIC8vLyBpc1ZlcmJvc2VBc20gLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHN0cmVhbWVyIHN1cHBvcnRzIHZlcmJvc2UgYXNzZW1ibHkgYXQKKyAgLy8vIGFsbC4KKyAgdmlydHVhbCBib29sIGlzVmVyYm9zZUFzbSgpIGNvbnN0IHsgcmV0dXJuIElzVmVyYm9zZUFzbTsgfQorICAKKyAgLy8vIGhhc1Jhd1RleHRTdXBwb3J0IC0gV2Ugc3VwcG9ydCBFbWl0UmF3VGV4dC4KKyAgdmlydHVhbCBib29sIGhhc1Jhd1RleHRTdXBwb3J0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBBZGRDb21tZW50IC0gQWRkIGEgY29tbWVudCB0aGF0IGNhbiBiZSBlbWl0dGVkIHRvIHRoZSBnZW5lcmF0ZWQgLnMKKyAgLy8vIGZpbGUgaWYgYXBwbGljYWJsZSBhcyBhIFFvSSBpc3N1ZSB0byBtYWtlIHRoZSBvdXRwdXQgb2YgdGhlIGNvbXBpbGVyCisgIC8vLyBtb3JlIHJlYWRhYmxlLiAgVGhpcyBvbmx5IGFmZmVjdHMgdGhlIE1DQXNtU3RyZWFtZXIsIGFuZCBvbmx5IHdoZW4KKyAgLy8vIHZlcmJvc2UgYXNzZW1ibHkgb3V0cHV0IGlzIGVuYWJsZWQuCisgIHZpcnR1YWwgdm9pZCBBZGRDb21tZW50KGNvbnN0IFR3aW5lICZUKTsKKworICAvLy8gQWRkRW5jb2RpbmdDb21tZW50IC0gQWRkIGEgY29tbWVudCBzaG93aW5nIHRoZSBlbmNvZGluZyBvZiBhbiBpbnN0cnVjdGlvbi4KKyAgdmlydHVhbCB2b2lkIEFkZEVuY29kaW5nQ29tbWVudChjb25zdCBNQ0luc3QgJkluc3QpOworCisgIC8vLyBHZXRDb21tZW50T1MgLSBSZXR1cm4gYSByYXdfb3N0cmVhbSB0aGF0IGNvbW1lbnRzIGNhbiBiZSB3cml0dGVuIHRvLgorICAvLy8gVW5saWtlIEFkZENvbW1lbnQsIHlvdSBhcmUgcmVxdWlyZWQgdG8gdGVybWluYXRlIGNvbW1lbnRzIHdpdGggXG4gaWYgeW91CisgIC8vLyB1c2UgdGhpcyBtZXRob2QuCisgIHZpcnR1YWwgcmF3X29zdHJlYW0gJkdldENvbW1lbnRPUygpIHsKKyAgICBpZiAoIUlzVmVyYm9zZUFzbSkKKyAgICAgIHJldHVybiBudWxscygpOyAgLy8gRGlzY2FyZCBjb21tZW50cyB1bmxlc3MgaW4gdmVyYm9zZSBhc20gbW9kZS4KKyAgICByZXR1cm4gQ29tbWVudFN0cmVhbTsKKyAgfQorCisgIC8vLyBBZGRCbGFua0xpbmUgLSBFbWl0IGEgYmxhbmsgbGluZSB0byBhIC5zIGZpbGUgdG8gcHJldHR5IGl0IHVwLgorICB2aXJ0dWFsIHZvaWQgQWRkQmxhbmtMaW5lKCkgeworICAgIEVtaXRFT0woKTsKKyAgfQorCisgIC8vLyBAbmFtZSBNQ1N0cmVhbWVyIEludGVyZmFjZQorICAvLy8gQHsKKworICB2aXJ0dWFsIHZvaWQgU3dpdGNoU2VjdGlvbihjb25zdCBNQ1NlY3Rpb24gKlNlY3Rpb24pOworCisgIHZpcnR1YWwgdm9pZCBFbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRBc3NlbWJsZXJGbGFnKE1DQXNzZW1ibGVyRmxhZyBGbGFnKTsKKworICB2aXJ0dWFsIHZvaWQgRW1pdEFzc2lnbm1lbnQoTUNTeW1ib2wgKlN5bWJvbCwgY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRTeW1ib2xBdHRyaWJ1dGUoTUNTeW1ib2wgKlN5bWJvbCwgTUNTeW1ib2xBdHRyIEF0dHJpYnV0ZSk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRTeW1ib2xEZXNjKE1DU3ltYm9sICpTeW1ib2wsIHVuc2lnbmVkIERlc2NWYWx1ZSk7CisgIHZpcnR1YWwgdm9pZCBCZWdpbkNPRkZTeW1ib2xEZWYoY29uc3QgTUNTeW1ib2wgKlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q09GRlN5bWJvbFN0b3JhZ2VDbGFzcyhpbnQgU3RvcmFnZUNsYXNzKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDT0ZGU3ltYm9sVHlwZShpbnQgVHlwZSk7CisgIHZpcnR1YWwgdm9pZCBFbmRDT0ZGU3ltYm9sRGVmKCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0RUxGU2l6ZShNQ1N5bWJvbCAqU3ltYm9sLCBjb25zdCBNQ0V4cHIgKlZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnl0ZUFsaWdubWVudCk7CisKKyAgLy8vIEVtaXRMb2NhbENvbW1vblN5bWJvbCAtIEVtaXQgYSBsb2NhbCBjb21tb24gKC5sY29tbSkgc3ltYm9sLgorICAvLy8KKyAgLy8vIEBwYXJhbSBTeW1ib2wgLSBUaGUgY29tbW9uIHN5bWJvbCB0byBlbWl0LgorICAvLy8gQHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4KKyAgdmlydHVhbCB2b2lkIEVtaXRMb2NhbENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplKTsKKyAgCisgIHZpcnR1YWwgdm9pZCBFbWl0WmVyb2ZpbGwoY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplID0gMCwgdW5zaWduZWQgQnl0ZUFsaWdubWVudCA9IDApOworCisgIHZpcnR1YWwgdm9pZCBFbWl0VEJTU1N5bWJvbCAoY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdmlydHVhbCB2b2lkIEVtaXRCeXRlcyhTdHJpbmdSZWYgRGF0YSwgdW5zaWduZWQgQWRkclNwYWNlKTsKKworICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUsdW5zaWduZWQgQWRkclNwYWNlKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRJbnRWYWx1ZSh1aW50NjRfdCBWYWx1ZSwgdW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgQWRkclNwYWNlKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRHUFJlbDMyVmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisgIAorCisgIHZpcnR1YWwgdm9pZCBFbWl0RmlsbCh1aW50NjRfdCBOdW1CeXRlcywgdWludDhfdCBGaWxsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpOworCisgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWVUb0FsaWdubWVudCh1bnNpZ25lZCBCeXRlQWxpZ25tZW50LCBpbnQ2NF90IFZhbHVlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlU2l6ZSA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhCeXRlc1RvRW1pdCA9IDApOworCisgIHZpcnR1YWwgdm9pZCBFbWl0Q29kZUFsaWdubWVudCh1bnNpZ25lZCBCeXRlQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQgPSAwKTsKKworICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlVG9PZmZzZXQoY29uc3QgTUNFeHByICpPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFZhbHVlID0gMCk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRGaWxlRGlyZWN0aXZlKFN0cmluZ1JlZiBGaWxlbmFtZSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0RHdhcmZGaWxlRGlyZWN0aXZlKHVuc2lnbmVkIEZpbGVObywgU3RyaW5nUmVmIEZpbGVuYW1lKTsKKworICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAmSW5zdCk7CisgIAorICAvLy8gRW1pdFJhd1RleHQgLSBJZiB0aGlzIGZpbGUgaXMgYmFja2VkIGJ5IGEgYXNzZW1ibHkgc3RyZWFtZXIsIHRoaXMgZHVtcHMKKyAgLy8vIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGluIHRoZSBvdXRwdXQgLnMgZmlsZS4gIFRoaXMgY2FwYWJpbGl0eSBpcworICAvLy8gaW5kaWNhdGVkIGJ5IHRoZSBoYXNSYXdUZXh0U3VwcG9ydCgpIHByZWRpY2F0ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRSYXdUZXh0KFN0cmluZ1JlZiBTdHJpbmcpOworICAKKyAgdmlydHVhbCB2b2lkIEZpbmlzaCgpOworICAKKyAgLy8vIEB9Cit9OworCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlLgorCisvLy8gQWRkQ29tbWVudCAtIEFkZCBhIGNvbW1lbnQgdGhhdCBjYW4gYmUgZW1pdHRlZCB0byB0aGUgZ2VuZXJhdGVkIC5zCisvLy8gZmlsZSBpZiBhcHBsaWNhYmxlIGFzIGEgUW9JIGlzc3VlIHRvIG1ha2UgdGhlIG91dHB1dCBvZiB0aGUgY29tcGlsZXIKKy8vLyBtb3JlIHJlYWRhYmxlLiAgVGhpcyBvbmx5IGFmZmVjdHMgdGhlIE1DQXNtU3RyZWFtZXIsIGFuZCBvbmx5IHdoZW4KKy8vLyB2ZXJib3NlIGFzc2VtYmx5IG91dHB1dCBpcyBlbmFibGVkLgordm9pZCBNQ0FzbVN0cmVhbWVyOjpBZGRDb21tZW50KGNvbnN0IFR3aW5lICZUKSB7CisgIGlmICghSXNWZXJib3NlQXNtKSByZXR1cm47CisgIAorICAvLyBNYWtlIHN1cmUgdGhhdCBDb21tZW50U3RyZWFtIGlzIGZsdXNoZWQuCisgIENvbW1lbnRTdHJlYW0uZmx1c2goKTsKKyAgCisgIFQudG9WZWN0b3IoQ29tbWVudFRvRW1pdCk7CisgIC8vIEVhY2ggY29tbWVudCBnb2VzIG9uIGl0cyBvd24gbGluZS4KKyAgQ29tbWVudFRvRW1pdC5wdXNoX2JhY2soJ1xuJyk7CisgIAorICAvLyBUZWxsIHRoZSBjb21tZW50IHN0cmVhbSB0aGF0IHRoZSB2ZWN0b3IgY2hhbmdlZCB1bmRlcm5lYXRoIGl0LgorICBDb21tZW50U3RyZWFtLnJlc3luYygpOworfQorCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRDb21tZW50c0FuZEVPTCgpIHsKKyAgaWYgKENvbW1lbnRUb0VtaXQuZW1wdHkoKSAmJiBDb21tZW50U3RyZWFtLkdldE51bUJ5dGVzSW5CdWZmZXIoKSA9PSAwKSB7CisgICAgT1MgPDwgJ1xuJzsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIENvbW1lbnRTdHJlYW0uZmx1c2goKTsKKyAgU3RyaW5nUmVmIENvbW1lbnRzID0gQ29tbWVudFRvRW1pdC5zdHIoKTsKKyAgCisgIGFzc2VydChDb21tZW50cy5iYWNrKCkgPT0gJ1xuJyAmJgorICAgICAgICAgIkNvbW1lbnQgYXJyYXkgbm90IG5ld2xpbmUgdGVybWluYXRlZCIpOworICBkbyB7CisgICAgLy8gRW1pdCBhIGxpbmUgb2YgY29tbWVudHMuCisgICAgT1MuUGFkVG9Db2x1bW4oTUFJLmdldENvbW1lbnRDb2x1bW4oKSk7CisgICAgc2l6ZV90IFBvc2l0aW9uID0gQ29tbWVudHMuZmluZCgnXG4nKTsKKyAgICBPUyA8PCBNQUkuZ2V0Q29tbWVudFN0cmluZygpIDw8ICcgJyA8PCBDb21tZW50cy5zdWJzdHIoMCwgUG9zaXRpb24pIDw8ICdcbic7CisgICAgCisgICAgQ29tbWVudHMgPSBDb21tZW50cy5zdWJzdHIoUG9zaXRpb24rMSk7CisgIH0gd2hpbGUgKCFDb21tZW50cy5lbXB0eSgpKTsKKyAgCisgIENvbW1lbnRUb0VtaXQuY2xlYXIoKTsKKyAgLy8gVGVsbCB0aGUgY29tbWVudCBzdHJlYW0gdGhhdCB0aGUgdmVjdG9yIGNoYW5nZWQgdW5kZXJuZWF0aCBpdC4KKyAgQ29tbWVudFN0cmVhbS5yZXN5bmMoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQ2NF90IHRydW5jYXRlVG9TaXplKGludDY0X3QgVmFsdWUsIHVuc2lnbmVkIEJ5dGVzKSB7CisgIGFzc2VydChCeXRlcyAmJiAiSW52YWxpZCBzaXplISIpOworICByZXR1cm4gVmFsdWUgJiAoKHVpbnQ2NF90KSAoaW50NjRfdCkgLTEgPj4gKDY0IC0gQnl0ZXMgKiA4KSk7Cit9CisKK3ZvaWQgTUNBc21TdHJlYW1lcjo6U3dpdGNoU2VjdGlvbihjb25zdCBNQ1NlY3Rpb24gKlNlY3Rpb24pIHsKKyAgYXNzZXJ0KFNlY3Rpb24gJiYgIkNhbm5vdCBzd2l0Y2ggdG8gYSBudWxsIHNlY3Rpb24hIik7CisgIGlmIChTZWN0aW9uICE9IEN1clNlY3Rpb24pIHsKKyAgICBDdXJTZWN0aW9uID0gU2VjdGlvbjsKKyAgICBTZWN0aW9uLT5QcmludFN3aXRjaFRvU2VjdGlvbihNQUksIE9TKTsKKyAgfQorfQorCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRMYWJlbChNQ1N5bWJvbCAqU3ltYm9sKSB7CisgIGFzc2VydChTeW1ib2wtPmlzVW5kZWZpbmVkKCkgJiYgIkNhbm5vdCBkZWZpbmUgYSBzeW1ib2wgdHdpY2UhIik7CisgIGFzc2VydCghU3ltYm9sLT5pc1ZhcmlhYmxlKCkgJiYgIkNhbm5vdCBlbWl0IGEgdmFyaWFibGUgc3ltYm9sISIpOworICBhc3NlcnQoQ3VyU2VjdGlvbiAmJiAiQ2Fubm90IGVtaXQgYmVmb3JlIHNldHRpbmcgc2VjdGlvbiEiKTsKKworICBPUyA8PCAqU3ltYm9sIDw8ICI6IjsKKyAgRW1pdEVPTCgpOworICBTeW1ib2wtPnNldFNlY3Rpb24oKkN1clNlY3Rpb24pOworfQorCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRBc3NlbWJsZXJGbGFnKE1DQXNzZW1ibGVyRmxhZyBGbGFnKSB7CisgIHN3aXRjaCAoRmxhZykgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiSW52YWxpZCBmbGFnISIpOworICBjYXNlIE1DQUZfU3Vic2VjdGlvbnNWaWFTeW1ib2xzOiBPUyA8PCAiLnN1YnNlY3Rpb25zX3ZpYV9zeW1ib2xzIjsgYnJlYWs7CisgIH0KKyAgRW1pdEVPTCgpOworfQorCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIHsKKyAgT1MgPDwgKlN5bWJvbCA8PCAiID0gIiA8PCAqVmFsdWU7CisgIEVtaXRFT0woKTsKKworICAvLyBGSVhNRTogTGlmdCBjb250ZXh0IGNoYW5nZXMgaW50byBzdXBlciBjbGFzcy4KKyAgU3ltYm9sLT5zZXRWYXJpYWJsZVZhbHVlKFZhbHVlKTsKK30KKwordm9pZCBNQ0FzbVN0cmVhbWVyOjpFbWl0U3ltYm9sQXR0cmlidXRlKE1DU3ltYm9sICpTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTeW1ib2xBdHRyIEF0dHJpYnV0ZSkgeworICBzd2l0Y2ggKEF0dHJpYnV0ZSkgeworICBjYXNlIE1DU0FfSW52YWxpZDogYXNzZXJ0KDAgJiYgIkludmFsaWQgc3ltYm9sIGF0dHJpYnV0ZSIpOworICBjYXNlIE1DU0FfRUxGX1R5cGVGdW5jdGlvbjogICAgLy8vIC50eXBlIF9mb28sIFNUVF9GVU5DICAjIGFrYSBAZnVuY3Rpb24KKyAgY2FzZSBNQ1NBX0VMRl9UeXBlSW5kRnVuY3Rpb246IC8vLyAudHlwZSBfZm9vLCBTVFRfR05VX0lGVU5DCisgIGNhc2UgTUNTQV9FTEZfVHlwZU9iamVjdDogICAgICAvLy8gLnR5cGUgX2ZvbywgU1RUX09CSkVDVCAgIyBha2EgQG9iamVjdAorICBjYXNlIE1DU0FfRUxGX1R5cGVUTFM6ICAgICAgICAgLy8vIC50eXBlIF9mb28sIFNUVF9UTFMgICAgICMgYWthIEB0bHNfb2JqZWN0CisgIGNhc2UgTUNTQV9FTEZfVHlwZUNvbW1vbjogICAgICAvLy8gLnR5cGUgX2ZvbywgU1RUX0NPTU1PTiAgIyBha2EgQGNvbW1vbgorICBjYXNlIE1DU0FfRUxGX1R5cGVOb1R5cGU6ICAgICAgLy8vIC50eXBlIF9mb28sIFNUVF9OT1RZUEUgICMgYWthIEBub3R5cGUKKyAgICBhc3NlcnQoTUFJLmhhc0RvdFR5cGVEb3RTaXplRGlyZWN0aXZlKCkgJiYgIlN5bWJvbCBBdHRyIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBPUyA8PCAiXHQudHlwZVx0IiA8PCAqU3ltYm9sIDw8ICcsJworICAgICAgIDw8ICgoTUFJLmdldENvbW1lbnRTdHJpbmcoKVswXSAhPSAnQCcpID8gJ0AnIDogJyUnKTsKKyAgICBzd2l0Y2ggKEF0dHJpYnV0ZSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIEVMRiAudHlwZSIpOworICAgIGNhc2UgTUNTQV9FTEZfVHlwZUZ1bmN0aW9uOiAgICBPUyA8PCAiZnVuY3Rpb24iOyBicmVhazsKKyAgICBjYXNlIE1DU0FfRUxGX1R5cGVJbmRGdW5jdGlvbjogT1MgPDwgImdudV9pbmRpcmVjdF9mdW5jdGlvbiI7IGJyZWFrOworICAgIGNhc2UgTUNTQV9FTEZfVHlwZU9iamVjdDogICAgICBPUyA8PCAib2JqZWN0IjsgYnJlYWs7CisgICAgY2FzZSBNQ1NBX0VMRl9UeXBlVExTOiAgICAgICAgIE9TIDw8ICJ0bHNfb2JqZWN0IjsgYnJlYWs7CisgICAgY2FzZSBNQ1NBX0VMRl9UeXBlQ29tbW9uOiAgICAgIE9TIDw8ICJjb21tb24iOyBicmVhazsKKyAgICBjYXNlIE1DU0FfRUxGX1R5cGVOb1R5cGU6ICAgICAgT1MgPDwgIm5vX3R5cGUiOyBicmVhazsKKyAgICB9CisgICAgRW1pdEVPTCgpOworICAgIHJldHVybjsKKyAgY2FzZSBNQ1NBX0dsb2JhbDogLy8gLmdsb2JsLy5nbG9iYWwKKyAgICBPUyA8PCBNQUkuZ2V0R2xvYmFsRGlyZWN0aXZlKCk7CisgICAgYnJlYWs7CisgIGNhc2UgTUNTQV9IaWRkZW46ICAgICAgICAgT1MgPDwgIlx0LmhpZGRlblx0IjsgICAgICAgICAgYnJlYWs7CisgIGNhc2UgTUNTQV9JbmRpcmVjdFN5bWJvbDogT1MgPDwgIlx0LmluZGlyZWN0X3N5bWJvbFx0IjsgYnJlYWs7CisgIGNhc2UgTUNTQV9JbnRlcm5hbDogICAgICAgT1MgPDwgIlx0LmludGVybmFsXHQiOyAgICAgICAgYnJlYWs7CisgIGNhc2UgTUNTQV9MYXp5UmVmZXJlbmNlOiAgT1MgPDwgIlx0LmxhenlfcmVmZXJlbmNlXHQiOyAgYnJlYWs7CisgIGNhc2UgTUNTQV9Mb2NhbDogICAgICAgICAgT1MgPDwgIlx0LmxvY2FsXHQiOyAgICAgICAgICAgYnJlYWs7CisgIGNhc2UgTUNTQV9Ob0RlYWRTdHJpcDogICAgT1MgPDwgIlx0Lm5vX2RlYWRfc3RyaXBcdCI7ICAgYnJlYWs7CisgIGNhc2UgTUNTQV9Qcml2YXRlRXh0ZXJuOiAgT1MgPDwgIlx0LnByaXZhdGVfZXh0ZXJuXHQiOyAgYnJlYWs7CisgIGNhc2UgTUNTQV9Qcm90ZWN0ZWQ6ICAgICAgT1MgPDwgIlx0LnByb3RlY3RlZFx0IjsgICAgICAgYnJlYWs7CisgIGNhc2UgTUNTQV9SZWZlcmVuY2U6ICAgICAgT1MgPDwgIlx0LnJlZmVyZW5jZVx0IjsgICAgICAgYnJlYWs7CisgIGNhc2UgTUNTQV9XZWFrOiAgICAgICAgICAgT1MgPDwgIlx0LndlYWtcdCI7ICAgICAgICAgICAgYnJlYWs7CisgIGNhc2UgTUNTQV9XZWFrRGVmaW5pdGlvbjogT1MgPDwgIlx0LndlYWtfZGVmaW5pdGlvblx0IjsgYnJlYWs7CisgICAgICAvLyAud2Vha19yZWZlcmVuY2UKKyAgY2FzZSBNQ1NBX1dlYWtSZWZlcmVuY2U6ICBPUyA8PCBNQUkuZ2V0V2Vha1JlZkRpcmVjdGl2ZSgpOyBicmVhazsKKyAgY2FzZSBNQ1NBX1dlYWtEZWZBdXRvUHJpdmF0ZTogT1MgPDwgIlx0LndlYWtfZGVmX2Nhbl9iZV9oaWRkZW5cdCI7IGJyZWFrOworICB9CisKKyAgT1MgPDwgKlN5bWJvbDsKKyAgRW1pdEVPTCgpOworfQorCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRTeW1ib2xEZXNjKE1DU3ltYm9sICpTeW1ib2wsIHVuc2lnbmVkIERlc2NWYWx1ZSkgeworICBPUyA8PCAiLmRlc2MiIDw8ICcgJyA8PCAqU3ltYm9sIDw8ICcsJyA8PCBEZXNjVmFsdWU7CisgIEVtaXRFT0woKTsKK30KKwordm9pZCBNQ0FzbVN0cmVhbWVyOjpCZWdpbkNPRkZTeW1ib2xEZWYoY29uc3QgTUNTeW1ib2wgKlN5bWJvbCkgeworICBPUyA8PCAiXHQuZGVmXHQgIiA8PCAqU3ltYm9sIDw8ICc7JzsKKyAgRW1pdEVPTCgpOworfQorCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRDT0ZGU3ltYm9sU3RvcmFnZUNsYXNzIChpbnQgU3RvcmFnZUNsYXNzKSB7CisgIE9TIDw8ICJcdC5zY2xcdCIgPDwgU3RvcmFnZUNsYXNzIDw8ICc7JzsKKyAgRW1pdEVPTCgpOworfQorCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRDT0ZGU3ltYm9sVHlwZSAoaW50IFR5cGUpIHsKKyAgT1MgPDwgIlx0LnR5cGVcdCIgPDwgVHlwZSA8PCAnOyc7CisgIEVtaXRFT0woKTsKK30KKwordm9pZCBNQ0FzbVN0cmVhbWVyOjpFbmRDT0ZGU3ltYm9sRGVmKCkgeworICBPUyA8PCAiXHQuZW5kZWYiOworICBFbWl0RU9MKCk7Cit9CisKK3ZvaWQgTUNBc21TdHJlYW1lcjo6RW1pdEVMRlNpemUoTUNTeW1ib2wgKlN5bWJvbCwgY29uc3QgTUNFeHByICpWYWx1ZSkgeworICBhc3NlcnQoTUFJLmhhc0RvdFR5cGVEb3RTaXplRGlyZWN0aXZlKCkpOworICBPUyA8PCAiXHQuc2l6ZVx0IiA8PCAqU3ltYm9sIDw8ICIsICIgPDwgKlZhbHVlIDw8ICdcbic7Cit9CisKK3ZvaWQgTUNBc21TdHJlYW1lcjo6RW1pdENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIHsKKyAgT1MgPDwgIlx0LmNvbW1cdCIgPDwgKlN5bWJvbCA8PCAnLCcgPDwgU2l6ZTsKKyAgaWYgKEJ5dGVBbGlnbm1lbnQgIT0gMCkgeworICAgIGlmIChNQUkuZ2V0Q09NTURpcmVjdGl2ZUFsaWdubWVudElzSW5CeXRlcygpKQorICAgICAgT1MgPDwgJywnIDw8IEJ5dGVBbGlnbm1lbnQ7CisgICAgZWxzZQorICAgICAgT1MgPDwgJywnIDw8IExvZzJfMzIoQnl0ZUFsaWdubWVudCk7CisgIH0KKyAgRW1pdEVPTCgpOworfQorCisvLy8gRW1pdExvY2FsQ29tbW9uU3ltYm9sIC0gRW1pdCBhIGxvY2FsIGNvbW1vbiAoLmxjb21tKSBzeW1ib2wuCisvLy8KKy8vLyBAcGFyYW0gU3ltYm9sIC0gVGhlIGNvbW1vbiBzeW1ib2wgdG8gZW1pdC4KKy8vLyBAcGFyYW0gU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sLgordm9pZCBNQ0FzbVN0cmVhbWVyOjpFbWl0TG9jYWxDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSkgeworICBhc3NlcnQoTUFJLmhhc0xDT01NRGlyZWN0aXZlKCkgJiYgIkRvZXNuJ3QgaGF2ZSAubGNvbW0sIGNhbid0IGVtaXQgaXQhIik7CisgIE9TIDw8ICJcdC5sY29tbVx0IiA8PCAqU3ltYm9sIDw8ICcsJyA8PCBTaXplOworICBFbWl0RU9MKCk7Cit9CisKK3ZvaWQgTUNBc21TdHJlYW1lcjo6RW1pdFplcm9maWxsKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIHsKKyAgLy8gTm90ZTogYSAuemVyb2ZpbGwgZGlyZWN0aXZlIGRvZXMgbm90IHN3aXRjaCBzZWN0aW9ucy4KKyAgT1MgPDwgIi56ZXJvZmlsbCAiOworICAKKyAgLy8gVGhpcyBpcyBhIG1hY2gtbyBzcGVjaWZpYyBkaXJlY3RpdmUuCisgIGNvbnN0IE1DU2VjdGlvbk1hY2hPICpNT1NlY3Rpb24gPSAoKGNvbnN0IE1DU2VjdGlvbk1hY2hPKilTZWN0aW9uKTsKKyAgT1MgPDwgTU9TZWN0aW9uLT5nZXRTZWdtZW50TmFtZSgpIDw8ICIsIiA8PCBNT1NlY3Rpb24tPmdldFNlY3Rpb25OYW1lKCk7CisgIAorICBpZiAoU3ltYm9sICE9IE5VTEwpIHsKKyAgICBPUyA8PCAnLCcgPDwgKlN5bWJvbCA8PCAnLCcgPDwgU2l6ZTsKKyAgICBpZiAoQnl0ZUFsaWdubWVudCAhPSAwKQorICAgICAgT1MgPDwgJywnIDw8IExvZzJfMzIoQnl0ZUFsaWdubWVudCk7CisgIH0KKyAgRW1pdEVPTCgpOworfQorCisvLyAudGJzcyBzeW0sIHNpemUsIGFsaWduCisvLyBUaGlzIGRlcGVuZHMgdGhhdCB0aGUgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4gbWFuZ2xlZCBmcm9tIHRoZSBvcmlnaW5hbCwKKy8vIGUuZy4gX2EuCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRUQlNTU3ltYm9sKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgdW5zaWduZWQgQnl0ZUFsaWdubWVudCkgeworICBhc3NlcnQoU3ltYm9sICE9IE5VTEwgJiYgIlN5bWJvbCBzaG91bGRuJ3QgYmUgTlVMTCEiKTsKKyAgLy8gSW5zdGVhZCBvZiB1c2luZyB0aGUgU2VjdGlvbiB3ZSdsbCBqdXN0IHVzZSB0aGUgc2hvcnRjdXQuCisgIC8vIFRoaXMgaXMgYSBtYWNoLW8gc3BlY2lmaWMgZGlyZWN0aXZlIGFuZCBzZWN0aW9uLgorICBPUyA8PCAiLnRic3MgIiA8PCAqU3ltYm9sIDw8ICIsICIgPDwgU2l6ZTsKKyAgCisgIC8vIE91dHB1dCBhbGlnbiBpZiB3ZSBoYXZlIGl0LiAgV2UgZGVmYXVsdCB0byAxIHNvIGRvbid0IGJvdGhlciBwcmludGluZworICAvLyB0aGF0LgorICBpZiAoQnl0ZUFsaWdubWVudCA+IDEpIE9TIDw8ICIsICIgPDwgTG9nMl8zMihCeXRlQWxpZ25tZW50KTsKKyAgCisgIEVtaXRFT0woKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyIHRvT2N0YWwoaW50IFgpIHsgcmV0dXJuIChYJjcpKycwJzsgfQorCitzdGF0aWMgdm9pZCBQcmludFF1b3RlZFN0cmluZyhTdHJpbmdSZWYgRGF0YSwgcmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICciJzsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEYXRhLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBjaGFyIEMgPSBEYXRhW2ldOworICAgIGlmIChDID09ICciJyB8fCBDID09ICdcXCcpIHsKKyAgICAgIE9TIDw8ICdcXCcgPDwgKGNoYXIpQzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBpZiAoaXNwcmludCgodW5zaWduZWQgY2hhcilDKSkgeworICAgICAgT1MgPDwgKGNoYXIpQzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBzd2l0Y2ggKEMpIHsKKyAgICAgIGNhc2UgJ1xiJzogT1MgPDwgIlxcYiI7IGJyZWFrOworICAgICAgY2FzZSAnXGYnOiBPUyA8PCAiXFxmIjsgYnJlYWs7CisgICAgICBjYXNlICdcbic6IE9TIDw8ICJcXG4iOyBicmVhazsKKyAgICAgIGNhc2UgJ1xyJzogT1MgPDwgIlxcciI7IGJyZWFrOworICAgICAgY2FzZSAnXHQnOiBPUyA8PCAiXFx0IjsgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBPUyA8PCAnXFwnOworICAgICAgICBPUyA8PCB0b09jdGFsKEMgPj4gNik7CisgICAgICAgIE9TIDw8IHRvT2N0YWwoQyA+PiAzKTsKKyAgICAgICAgT1MgPDwgdG9PY3RhbChDID4+IDApOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgCisgIE9TIDw8ICciJzsKK30KKworCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRCeXRlcyhTdHJpbmdSZWYgRGF0YSwgdW5zaWduZWQgQWRkclNwYWNlKSB7CisgIGFzc2VydChDdXJTZWN0aW9uICYmICJDYW5ub3QgZW1pdCBjb250ZW50cyBiZWZvcmUgc2V0dGluZyBzZWN0aW9uISIpOworICBpZiAoRGF0YS5lbXB0eSgpKSByZXR1cm47CisgIAorICBpZiAoRGF0YS5zaXplKCkgPT0gMSkgeworICAgIE9TIDw8IE1BSS5nZXREYXRhOGJpdHNEaXJlY3RpdmUoQWRkclNwYWNlKTsKKyAgICBPUyA8PCAodW5zaWduZWQpKHVuc2lnbmVkIGNoYXIpRGF0YVswXTsKKyAgICBFbWl0RU9MKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSWYgdGhlIGRhdGEgZW5kcyB3aXRoIDAgYW5kIHRoZSB0YXJnZXQgc3VwcG9ydHMgLmFzY2l6LCB1c2UgaXQsIG90aGVyd2lzZQorICAvLyB1c2UgLmFzY2lpCisgIGlmIChNQUkuZ2V0QXNjaXpEaXJlY3RpdmUoKSAmJiBEYXRhLmJhY2soKSA9PSAwKSB7CisgICAgT1MgPDwgTUFJLmdldEFzY2l6RGlyZWN0aXZlKCk7CisgICAgRGF0YSA9IERhdGEuc3Vic3RyKDAsIERhdGEuc2l6ZSgpLTEpOworICB9IGVsc2UgeworICAgIE9TIDw8IE1BSS5nZXRBc2NpaURpcmVjdGl2ZSgpOworICB9CisKKyAgT1MgPDwgJyAnOworICBQcmludFF1b3RlZFN0cmluZyhEYXRhLCBPUyk7CisgIEVtaXRFT0woKTsKK30KKworLy8vIEVtaXRJbnRWYWx1ZSAtIFNwZWNpYWwgY2FzZSBvZiBFbWl0VmFsdWUgdGhhdCBhdm9pZHMgdGhlIGNsaWVudCBoYXZpbmcKKy8vLyB0byBwYXNzIGluIGEgTUNFeHByIGZvciBjb25zdGFudCBpbnRlZ2Vycy4KK3ZvaWQgTUNBc21TdHJlYW1lcjo6RW1pdEludFZhbHVlKHVpbnQ2NF90IFZhbHVlLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlKSB7CisgIGFzc2VydChDdXJTZWN0aW9uICYmICJDYW5ub3QgZW1pdCBjb250ZW50cyBiZWZvcmUgc2V0dGluZyBzZWN0aW9uISIpOworICBjb25zdCBjaGFyICpEaXJlY3RpdmUgPSAwOworICBzd2l0Y2ggKFNpemUpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgMTogRGlyZWN0aXZlID0gTUFJLmdldERhdGE4Yml0c0RpcmVjdGl2ZShBZGRyU3BhY2UpOyBicmVhazsKKyAgY2FzZSAyOiBEaXJlY3RpdmUgPSBNQUkuZ2V0RGF0YTE2Yml0c0RpcmVjdGl2ZShBZGRyU3BhY2UpOyBicmVhazsKKyAgY2FzZSA0OiBEaXJlY3RpdmUgPSBNQUkuZ2V0RGF0YTMyYml0c0RpcmVjdGl2ZShBZGRyU3BhY2UpOyBicmVhazsKKyAgY2FzZSA4OgorICAgIERpcmVjdGl2ZSA9IE1BSS5nZXREYXRhNjRiaXRzRGlyZWN0aXZlKEFkZHJTcGFjZSk7CisgICAgLy8gSWYgdGhlIHRhcmdldCBkb2Vzbid0IHN1cHBvcnQgNjQtYml0IGRhdGEsIGVtaXQgYXMgdHdvIDMyLWJpdCBoYWx2ZXMuCisgICAgaWYgKERpcmVjdGl2ZSkgYnJlYWs7CisgICAgaWYgKGlzTGl0dGxlRW5kaWFuKCkpIHsKKyAgICAgIEVtaXRJbnRWYWx1ZSgodWludDMyX3QpKFZhbHVlID4+IDAgKSwgNCwgQWRkclNwYWNlKTsKKyAgICAgIEVtaXRJbnRWYWx1ZSgodWludDMyX3QpKFZhbHVlID4+IDMyKSwgNCwgQWRkclNwYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgRW1pdEludFZhbHVlKCh1aW50MzJfdCkoVmFsdWUgPj4gMzIpLCA0LCBBZGRyU3BhY2UpOworICAgICAgRW1pdEludFZhbHVlKCh1aW50MzJfdCkoVmFsdWUgPj4gMCApLCA0LCBBZGRyU3BhY2UpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgCisgIGFzc2VydChEaXJlY3RpdmUgJiYgIkludmFsaWQgc2l6ZSBmb3IgbWFjaGluZSBjb2RlIHZhbHVlISIpOworICBPUyA8PCBEaXJlY3RpdmUgPDwgdHJ1bmNhdGVUb1NpemUoVmFsdWUsIFNpemUpOworICBFbWl0RU9MKCk7Cit9CisKK3ZvaWQgTUNBc21TdHJlYW1lcjo6RW1pdFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIHsKKyAgYXNzZXJ0KEN1clNlY3Rpb24gJiYgIkNhbm5vdCBlbWl0IGNvbnRlbnRzIGJlZm9yZSBzZXR0aW5nIHNlY3Rpb24hIik7CisgIGNvbnN0IGNoYXIgKkRpcmVjdGl2ZSA9IDA7CisgIHN3aXRjaCAoU2l6ZSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSAxOiBEaXJlY3RpdmUgPSBNQUkuZ2V0RGF0YThiaXRzRGlyZWN0aXZlKEFkZHJTcGFjZSk7IGJyZWFrOworICBjYXNlIDI6IERpcmVjdGl2ZSA9IE1BSS5nZXREYXRhMTZiaXRzRGlyZWN0aXZlKEFkZHJTcGFjZSk7IGJyZWFrOworICBjYXNlIDQ6IERpcmVjdGl2ZSA9IE1BSS5nZXREYXRhMzJiaXRzRGlyZWN0aXZlKEFkZHJTcGFjZSk7IGJyZWFrOworICBjYXNlIDg6IERpcmVjdGl2ZSA9IE1BSS5nZXREYXRhNjRiaXRzRGlyZWN0aXZlKEFkZHJTcGFjZSk7IGJyZWFrOworICB9CisgIAorICBhc3NlcnQoRGlyZWN0aXZlICYmICJJbnZhbGlkIHNpemUgZm9yIG1hY2hpbmUgY29kZSB2YWx1ZSEiKTsKKyAgT1MgPDwgRGlyZWN0aXZlIDw8ICpWYWx1ZTsKKyAgRW1pdEVPTCgpOworfQorCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRHUFJlbDMyVmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSkgeworICBhc3NlcnQoTUFJLmdldEdQUmVsMzJEaXJlY3RpdmUoKSAhPSAwKTsKKyAgT1MgPDwgTUFJLmdldEdQUmVsMzJEaXJlY3RpdmUoKSA8PCAqVmFsdWU7CisgIEVtaXRFT0woKTsKK30KKworCisvLy8gRW1pdEZpbGwgLSBFbWl0IE51bUJ5dGVzIGJ5dGVzIHdvcnRoIG9mIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkKKy8vLyBGaWxsVmFsdWUuICBUaGlzIGltcGxlbWVudHMgZGlyZWN0aXZlcyBzdWNoIGFzICcuc3BhY2UnLgordm9pZCBNQ0FzbVN0cmVhbWVyOjpFbWl0RmlsbCh1aW50NjRfdCBOdW1CeXRlcywgdWludDhfdCBGaWxsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgeworICBpZiAoTnVtQnl0ZXMgPT0gMCkgcmV0dXJuOworICAKKyAgaWYgKEFkZHJTcGFjZSA9PSAwKQorICAgIGlmIChjb25zdCBjaGFyICpaZXJvRGlyZWN0aXZlID0gTUFJLmdldFplcm9EaXJlY3RpdmUoKSkgeworICAgICAgT1MgPDwgWmVyb0RpcmVjdGl2ZSA8PCBOdW1CeXRlczsKKyAgICAgIGlmIChGaWxsVmFsdWUgIT0gMCkKKyAgICAgICAgT1MgPDwgJywnIDw8IChpbnQpRmlsbFZhbHVlOworICAgICAgRW1pdEVPTCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvLyBFbWl0IGEgYnl0ZSBhdCBhIHRpbWUuCisgIE1DU3RyZWFtZXI6OkVtaXRGaWxsKE51bUJ5dGVzLCBGaWxsVmFsdWUsIEFkZHJTcGFjZSk7Cit9CisKK3ZvaWQgTUNBc21TdHJlYW1lcjo6RW1pdFZhbHVlVG9BbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwgaW50NjRfdCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhCeXRlc1RvRW1pdCkgeworICAvLyBTb21lIGFzc2VtYmxlcnMgZG9uJ3Qgc3VwcG9ydCBub24tcG93ZXIgb2YgdHdvIGFsaWdubWVudHMsIHNvIHdlIGFsd2F5cworICAvLyBlbWl0IGFsaWdubWVudHMgYXMgYSBwb3dlciBvZiB0d28gaWYgcG9zc2libGUuCisgIGlmIChpc1Bvd2VyT2YyXzMyKEJ5dGVBbGlnbm1lbnQpKSB7CisgICAgc3dpdGNoIChWYWx1ZVNpemUpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHNpemUgZm9yIG1hY2hpbmUgY29kZSB2YWx1ZSEiKTsKKyAgICBjYXNlIDE6IE9TIDw8IE1BSS5nZXRBbGlnbkRpcmVjdGl2ZSgpOyBicmVhazsKKyAgICAvLyBGSVhNRTogdXNlIE1BSSBmb3IgdGhpcyEKKyAgICBjYXNlIDI6IE9TIDw8ICIucDJhbGlnbncgIjsgYnJlYWs7CisgICAgY2FzZSA0OiBPUyA8PCAiLnAyYWxpZ25sICI7IGJyZWFrOworICAgIGNhc2UgODogbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgYWxpZ25tZW50IHNpemUhIik7CisgICAgfQorICAgIAorICAgIGlmIChNQUkuZ2V0QWxpZ25tZW50SXNJbkJ5dGVzKCkpCisgICAgICBPUyA8PCBCeXRlQWxpZ25tZW50OworICAgIGVsc2UKKyAgICAgIE9TIDw8IExvZzJfMzIoQnl0ZUFsaWdubWVudCk7CisKKyAgICBpZiAoVmFsdWUgfHwgTWF4Qnl0ZXNUb0VtaXQpIHsKKyAgICAgIE9TIDw8ICIsIDB4IjsKKyAgICAgIE9TLndyaXRlX2hleCh0cnVuY2F0ZVRvU2l6ZShWYWx1ZSwgVmFsdWVTaXplKSk7CisKKyAgICAgIGlmIChNYXhCeXRlc1RvRW1pdCkgCisgICAgICAgIE9TIDw8ICIsICIgPDwgTWF4Qnl0ZXNUb0VtaXQ7CisgICAgfQorICAgIEVtaXRFT0woKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIE5vbi1wb3dlciBvZiB0d28gYWxpZ25tZW50LiAgVGhpcyBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCBieSBhc3NlbWJsZXJzLgorICAvLyBGSVhNRTogUGFyYW1ldGVyaXplIHRoaXMgYmFzZWQgb24gTUFJLgorICBzd2l0Y2ggKFZhbHVlU2l6ZSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHNpemUgZm9yIG1hY2hpbmUgY29kZSB2YWx1ZSEiKTsKKyAgY2FzZSAxOiBPUyA8PCAiLmJhbGlnbiI7ICBicmVhazsKKyAgY2FzZSAyOiBPUyA8PCAiLmJhbGlnbnciOyBicmVhazsKKyAgY2FzZSA0OiBPUyA8PCAiLmJhbGlnbmwiOyBicmVhazsKKyAgY2FzZSA4OiBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBhbGlnbm1lbnQgc2l6ZSEiKTsKKyAgfQorCisgIE9TIDw8ICcgJyA8PCBCeXRlQWxpZ25tZW50OworICBPUyA8PCAiLCAiIDw8IHRydW5jYXRlVG9TaXplKFZhbHVlLCBWYWx1ZVNpemUpOworICBpZiAoTWF4Qnl0ZXNUb0VtaXQpIAorICAgIE9TIDw8ICIsICIgPDwgTWF4Qnl0ZXNUb0VtaXQ7CisgIEVtaXRFT0woKTsKK30KKwordm9pZCBNQ0FzbVN0cmVhbWVyOjpFbWl0Q29kZUFsaWdubWVudCh1bnNpZ25lZCBCeXRlQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhCeXRlc1RvRW1pdCkgeworICAvLyBFbWl0IHdpdGggYSB0ZXh0IGZpbGwgdmFsdWUuCisgIEVtaXRWYWx1ZVRvQWxpZ25tZW50KEJ5dGVBbGlnbm1lbnQsIE1BSS5nZXRUZXh0QWxpZ25GaWxsVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgMSwgTWF4Qnl0ZXNUb0VtaXQpOworfQorCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRWYWx1ZVRvT2Zmc2V0KGNvbnN0IE1DRXhwciAqT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFZhbHVlKSB7CisgIC8vIEZJWE1FOiBWZXJpZnkgdGhhdCBPZmZzZXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHNlY3Rpb24uCisgIE9TIDw8ICIub3JnICIgPDwgKk9mZnNldCA8PCAiLCAiIDw8ICh1bnNpZ25lZCkgVmFsdWU7CisgIEVtaXRFT0woKTsKK30KKworCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRGaWxlRGlyZWN0aXZlKFN0cmluZ1JlZiBGaWxlbmFtZSkgeworICBhc3NlcnQoTUFJLmhhc1NpbmdsZVBhcmFtZXRlckRvdEZpbGUoKSk7CisgIE9TIDw8ICJcdC5maWxlXHQiOworICBQcmludFF1b3RlZFN0cmluZyhGaWxlbmFtZSwgT1MpOworICBFbWl0RU9MKCk7Cit9CisKK3ZvaWQgTUNBc21TdHJlYW1lcjo6RW1pdER3YXJmRmlsZURpcmVjdGl2ZSh1bnNpZ25lZCBGaWxlTm8sIFN0cmluZ1JlZiBGaWxlbmFtZSl7CisgIE9TIDw8ICJcdC5maWxlXHQiIDw8IEZpbGVObyA8PCAnICc7CisgIFByaW50UXVvdGVkU3RyaW5nKEZpbGVuYW1lLCBPUyk7CisgIEVtaXRFT0woKTsKK30KKwordm9pZCBNQ0FzbVN0cmVhbWVyOjpBZGRFbmNvZGluZ0NvbW1lbnQoY29uc3QgTUNJbnN0ICZJbnN0KSB7CisgIHJhd19vc3RyZWFtICZPUyA9IEdldENvbW1lbnRPUygpOworICBTbWFsbFN0cmluZzwyNTY+IENvZGU7CisgIFNtYWxsVmVjdG9yPE1DRml4dXAsIDQ+IEZpeHVwczsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBWZWNPUyhDb2RlKTsKKyAgRW1pdHRlci0+RW5jb2RlSW5zdHJ1Y3Rpb24oSW5zdCwgVmVjT1MsIEZpeHVwcyk7CisgIFZlY09TLmZsdXNoKCk7CisKKyAgLy8gSWYgd2UgYXJlIHNob3dpbmcgZml4dXBzLCBjcmVhdGUgc3ltYm9saWMgbWFya2VycyBpbiB0aGUgZW5jb2RlZAorICAvLyByZXByZXNlbnRhdGlvbi4gV2UgZG8gdGhpcyBieSBtYWtpbmcgYSBwZXItYml0IG1hcCB0byB0aGUgZml4dXAgaXRlbSBpbmRleCwKKyAgLy8gdGhlbiB0cnlpbmcgdG8gZGlzcGxheSBpdCBhcyBuaWNlbHkgYXMgcG9zc2libGUuCisgIFNtYWxsVmVjdG9yPHVpbnQ4X3QsIDY0PiBGaXh1cE1hcDsKKyAgRml4dXBNYXAucmVzaXplKENvZGUuc2l6ZSgpICogOCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDb2RlLnNpemUoKSAqIDg7IGkgIT0gZTsgKytpKQorICAgIEZpeHVwTWFwW2ldID0gMDsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRml4dXBzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNQ0ZpeHVwICZGID0gRml4dXBzW2ldOworICAgIGNvbnN0IE1DRml4dXBLaW5kSW5mbyAmSW5mbyA9IEVtaXR0ZXItPmdldEZpeHVwS2luZEluZm8oRi5nZXRLaW5kKCkpOworICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gSW5mby5UYXJnZXRTaXplOyArK2opIHsKKyAgICAgIHVuc2lnbmVkIEluZGV4ID0gRi5nZXRPZmZzZXQoKSAqIDggKyBJbmZvLlRhcmdldE9mZnNldCArIGo7CisgICAgICBhc3NlcnQoSW5kZXggPCBDb2RlLnNpemUoKSAqIDggJiYgIkludmFsaWQgb2Zmc2V0IGluIGZpeHVwISIpOworICAgICAgRml4dXBNYXBbSW5kZXhdID0gMSArIGk7CisgICAgfQorICB9CisKKyAgT1MgPDwgImVuY29kaW5nOiBbIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvZGUuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChpKQorICAgICAgT1MgPDwgJywnOworCisgICAgLy8gU2VlIGlmIGFsbCBiaXRzIGFyZSB0aGUgc2FtZSBtYXAgZW50cnkuCisgICAgdWludDhfdCBNYXBFbnRyeSA9IEZpeHVwTWFwW2kgKiA4ICsgMF07CisgICAgZm9yICh1bnNpZ25lZCBqID0gMTsgaiAhPSA4OyArK2opIHsKKyAgICAgIGlmIChGaXh1cE1hcFtpICogOCArIGpdID09IE1hcEVudHJ5KQorICAgICAgICBjb250aW51ZTsKKworICAgICAgTWFwRW50cnkgPSB1aW50OF90KH4wVSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoTWFwRW50cnkgIT0gdWludDhfdCh+MFUpKSB7CisgICAgICBpZiAoTWFwRW50cnkgPT0gMCkgeworICAgICAgICBPUyA8PCBmb3JtYXQoIjB4JTAyeCIsIHVpbnQ4X3QoQ29kZVtpXSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KENvZGVbaV0gPT0gMCAmJiAiRW5jb2RlciB3cm90ZSBpbnRvIGZpeGVkIHVwIGJpdCEiKTsKKyAgICAgICAgT1MgPDwgY2hhcignQScgKyBNYXBFbnRyeSAtIDEpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UsIHdyaXRlIG91dCBpbiBiaW5hcnkuCisgICAgICBPUyA8PCAiMGIiOworICAgICAgZm9yICh1bnNpZ25lZCBqID0gODsgai0tOykgeworICAgICAgICB1bnNpZ25lZCBCaXQgPSAoQ29kZVtpXSA+PiBqKSAmIDE7CisgICAgICAgIGlmICh1aW50OF90IE1hcEVudHJ5ID0gRml4dXBNYXBbaSAqIDggKyBqXSkgeworICAgICAgICAgIGFzc2VydChCaXQgPT0gMCAmJiAiRW5jb2RlciB3cm90ZSBpbnRvIGZpeGVkIHVwIGJpdCEiKTsKKyAgICAgICAgICBPUyA8PCBjaGFyKCdBJyArIE1hcEVudHJ5IC0gMSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIE9TIDw8IEJpdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgT1MgPDwgIl1cbiI7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZpeHVwcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTUNGaXh1cCAmRiA9IEZpeHVwc1tpXTsKKyAgICBjb25zdCBNQ0ZpeHVwS2luZEluZm8gJkluZm8gPSBFbWl0dGVyLT5nZXRGaXh1cEtpbmRJbmZvKEYuZ2V0S2luZCgpKTsKKyAgICBPUyA8PCAiICBmaXh1cCAiIDw8IGNoYXIoJ0EnICsgaSkgPDwgIiAtICIgPDwgIm9mZnNldDogIiA8PCBGLmdldE9mZnNldCgpCisgICAgICAgPDwgIiwgdmFsdWU6ICIgPDwgKkYuZ2V0VmFsdWUoKSA8PCAiLCBraW5kOiAiIDw8IEluZm8uTmFtZSA8PCAiXG4iOworICB9Cit9CisKK3ZvaWQgTUNBc21TdHJlYW1lcjo6RW1pdEluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAmSW5zdCkgeworICBhc3NlcnQoQ3VyU2VjdGlvbiAmJiAiQ2Fubm90IGVtaXQgY29udGVudHMgYmVmb3JlIHNldHRpbmcgc2VjdGlvbiEiKTsKKworICAvLyBTaG93IHRoZSBlbmNvZGluZyBpbiBhIGNvbW1lbnQgaWYgd2UgaGF2ZSBhIGNvZGUgZW1pdHRlci4KKyAgaWYgKEVtaXR0ZXIpCisgICAgQWRkRW5jb2RpbmdDb21tZW50KEluc3QpOworCisgIC8vIFNob3cgdGhlIE1DSW5zdCBpZiBlbmFibGVkLgorICBpZiAoU2hvd0luc3QpIHsKKyAgICBJbnN0LmR1bXBfcHJldHR5KEdldENvbW1lbnRPUygpLCAmTUFJLCBJbnN0UHJpbnRlci5nZXQoKSwgIlxuICIpOworICAgIEdldENvbW1lbnRPUygpIDw8ICJcbiI7CisgIH0KKworICAvLyBJZiB3ZSBoYXZlIGFuIEFzbVByaW50ZXIsIHVzZSB0aGF0IHRvIHByaW50LCBvdGhlcndpc2UgcHJpbnQgdGhlIE1DSW5zdC4KKyAgaWYgKEluc3RQcmludGVyKQorICAgIEluc3RQcmludGVyLT5wcmludEluc3QoJkluc3QsIE9TKTsKKyAgZWxzZQorICAgIEluc3QucHJpbnQoT1MsICZNQUkpOworICBFbWl0RU9MKCk7Cit9CisKKy8vLyBFbWl0UmF3VGV4dCAtIElmIHRoaXMgZmlsZSBpcyBiYWNrZWQgYnkgYSBhc3NlbWJseSBzdHJlYW1lciwgdGhpcyBkdW1wcworLy8vIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGluIHRoZSBvdXRwdXQgLnMgZmlsZS4gIFRoaXMgY2FwYWJpbGl0eSBpcworLy8vIGluZGljYXRlZCBieSB0aGUgaGFzUmF3VGV4dFN1cHBvcnQoKSBwcmVkaWNhdGUuCit2b2lkIE1DQXNtU3RyZWFtZXI6OkVtaXRSYXdUZXh0KFN0cmluZ1JlZiBTdHJpbmcpIHsKKyAgaWYgKCFTdHJpbmcuZW1wdHkoKSAmJiBTdHJpbmcuYmFjaygpID09ICdcbicpCisgICAgU3RyaW5nID0gU3RyaW5nLnN1YnN0cigwLCBTdHJpbmcuc2l6ZSgpLTEpOworICBPUyA8PCBTdHJpbmc7CisgIEVtaXRFT0woKTsKK30KKwordm9pZCBNQ0FzbVN0cmVhbWVyOjpGaW5pc2goKSB7Cit9CisKK01DU3RyZWFtZXIgKmxsdm06OmNyZWF0ZUFzbVN0cmVhbWVyKE1DQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTGl0dGxlRW5kaWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZlcmJvc2VBc20sIE1DSW5zdFByaW50ZXIgKklQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb2RlRW1pdHRlciAqQ0UsIGJvb2wgU2hvd0luc3QpIHsKKyAgcmV0dXJuIG5ldyBNQ0FzbVN0cmVhbWVyKENvbnRleHQsIE9TLCBpc0xpdHRsZUVuZGlhbiwgaXNWZXJib3NlQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVAsIENFLCBTaG93SW5zdCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNBc3NlbWJsZXIuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DQXNzZW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTEyYTgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DQXNzZW1ibGVyLmNwcApAQCAtMCwwICsxLDEwMzUgQEAKKy8vPT09LSBsaWIvTUMvTUNBc3NlbWJsZXIuY3BwIC0gQXNzZW1ibGVyIEJhY2tlbmQgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXNzZW1ibGVyIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvZGVFbWl0dGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DT2JqZWN0V3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEFzbUJhY2tlbmQuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworbmFtZXNwYWNlIHN0YXRzIHsKK1NUQVRJU1RJQyhFbWl0dGVkRnJhZ21lbnRzLCAiTnVtYmVyIG9mIGVtaXR0ZWQgYXNzZW1ibGVyIGZyYWdtZW50cyIpOworU1RBVElTVElDKEV2YWx1YXRlRml4dXAsICJOdW1iZXIgb2YgZXZhbHVhdGVkIGZpeHVwcyIpOworU1RBVElTVElDKEZyYWdtZW50TGF5b3V0cywgIk51bWJlciBvZiBmcmFnbWVudCBsYXlvdXRzIik7CitTVEFUSVNUSUMoT2JqZWN0Qnl0ZXMsICJOdW1iZXIgb2YgZW1pdHRlZCBvYmplY3QgZmlsZSBieXRlcyIpOworU1RBVElTVElDKFJlbGF4YXRpb25TdGVwcywgIk51bWJlciBvZiBhc3NlbWJsZXIgbGF5b3V0IGFuZCByZWxheGF0aW9uIHN0ZXBzIik7CitTVEFUSVNUSUMoUmVsYXhlZEluc3RydWN0aW9ucywgIk51bWJlciBvZiByZWxheGVkIGluc3RydWN0aW9ucyIpOworU1RBVElTVElDKFNlY3Rpb25MYXlvdXRzLCAiTnVtYmVyIG9mIHNlY3Rpb24gbGF5b3V0cyIpOworfQorfQorCisvLyBGSVhNRSBGSVhNRSBGSVhNRTogVGhlcmUgYXJlIG51bWJlciBvZiBwbGFjZXMgaW4gdGhpcyBmaWxlIHdoZXJlIHdlIGNvbnZlcnQKKy8vIHdoYXQgaXMgYSA2NC1iaXQgYXNzZW1ibGVyIHZhbHVlIHVzZWQgZm9yIGNvbXB1dGF0aW9uIGludG8gYSB2YWx1ZSBpbiB0aGUKKy8vIG9iamVjdCBmaWxlLCB3aGljaCBtYXkgdHJ1bmNhdGUgaXQuIFdlIHNob3VsZCBkZXRlY3QgdGhhdCB0cnVuY2F0aW9uIHdoZXJlCisvLyBpbnZhbGlkIGFuZCByZXBvcnQgZXJyb3JzIGJhY2suCisKKy8qICoqKiAqLworCitNQ0FzbUxheW91dDo6TUNBc21MYXlvdXQoTUNBc3NlbWJsZXIgJkFzbSkKKyAgOiBBc3NlbWJsZXIoQXNtKSwgTGFzdFZhbGlkRnJhZ21lbnQoMCkKKyB7CisgIC8vIENvbXB1dGUgdGhlIHNlY3Rpb24gbGF5b3V0IG9yZGVyLiBWaXJ0dWFsIHNlY3Rpb25zIG11c3QgZ28gbGFzdC4KKyAgZm9yIChNQ0Fzc2VtYmxlcjo6aXRlcmF0b3IgaXQgPSBBc20uYmVnaW4oKSwgaWUgPSBBc20uZW5kKCk7IGl0ICE9IGllOyArK2l0KQorICAgIGlmICghQXNtLmdldEJhY2tlbmQoKS5pc1ZpcnR1YWxTZWN0aW9uKGl0LT5nZXRTZWN0aW9uKCkpKQorICAgICAgU2VjdGlvbk9yZGVyLnB1c2hfYmFjaygmKml0KTsKKyAgZm9yIChNQ0Fzc2VtYmxlcjo6aXRlcmF0b3IgaXQgPSBBc20uYmVnaW4oKSwgaWUgPSBBc20uZW5kKCk7IGl0ICE9IGllOyArK2l0KQorICAgIGlmIChBc20uZ2V0QmFja2VuZCgpLmlzVmlydHVhbFNlY3Rpb24oaXQtPmdldFNlY3Rpb24oKSkpCisgICAgICBTZWN0aW9uT3JkZXIucHVzaF9iYWNrKCYqaXQpOworfQorCitib29sIE1DQXNtTGF5b3V0Ojppc1NlY3Rpb25VcFRvRGF0ZShjb25zdCBNQ1NlY3Rpb25EYXRhICpTRCkgY29uc3QgeworICAvLyBUaGUgZmlyc3Qgc2VjdGlvbiBpcyBhbHdheXMgdXAtdG8tZGF0ZS4KKyAgdW5zaWduZWQgSW5kZXggPSBTRC0+Z2V0TGF5b3V0T3JkZXIoKTsKKyAgaWYgKCFJbmRleCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBPdGhlcndpc2UsIHNlY3Rpb25zIGFyZSBhbHdheXMgaW1wbGljaXRseSBjb21wdXRlZCB3aGVuIHRoZSBwcmVjZWVkaW5nCisgIC8vIGZyYWdtZW50IGlzIGxheWVkIG91dC4KKyAgY29uc3QgTUNTZWN0aW9uRGF0YSAqUHJldiA9IGdldFNlY3Rpb25PcmRlcigpW0luZGV4IC0gMV07CisgIHJldHVybiBpc0ZyYWdtZW50VXBUb0RhdGUoJihQcmV2LT5nZXRGcmFnbWVudExpc3QoKS5iYWNrKCkpKTsKK30KKworYm9vbCBNQ0FzbUxheW91dDo6aXNGcmFnbWVudFVwVG9EYXRlKGNvbnN0IE1DRnJhZ21lbnQgKkYpIGNvbnN0IHsKKyAgcmV0dXJuIChMYXN0VmFsaWRGcmFnbWVudCAmJgorICAgICAgICAgIEYtPmdldExheW91dE9yZGVyKCkgPD0gTGFzdFZhbGlkRnJhZ21lbnQtPmdldExheW91dE9yZGVyKCkpOworfQorCit2b2lkIE1DQXNtTGF5b3V0OjpVcGRhdGVGb3JTbGlkZShNQ0ZyYWdtZW50ICpGLCBpbnQgU2xpZGVBbW91bnQpIHsKKyAgLy8gSWYgdGhpcyBmcmFnbWVudCB3YXNuJ3QgYWxyZWFkeSB1cC10by1kYXRlLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorICBpZiAoIWlzRnJhZ21lbnRVcFRvRGF0ZShGKSkKKyAgICByZXR1cm47CisKKyAgLy8gT3RoZXJ3aXNlLCByZXNldCB0aGUgbGFzdCB2YWxpZCBmcmFnbWVudCB0byB0aGUgcHJlZGVjZXNzb3Igb2YgdGhlCisgIC8vIGludmFsaWRhdGVkIGZyYWdtZW50LgorICBMYXN0VmFsaWRGcmFnbWVudCA9IEYtPmdldFByZXZOb2RlKCk7CisgIGlmICghTGFzdFZhbGlkRnJhZ21lbnQpIHsKKyAgICB1bnNpZ25lZCBJbmRleCA9IEYtPmdldFBhcmVudCgpLT5nZXRMYXlvdXRPcmRlcigpOworICAgIGlmIChJbmRleCAhPSAwKSB7CisgICAgICBNQ1NlY3Rpb25EYXRhICpQcmV2ID0gZ2V0U2VjdGlvbk9yZGVyKClbSW5kZXggLSAxXTsKKyAgICAgIExhc3RWYWxpZEZyYWdtZW50ID0gJihQcmV2LT5nZXRGcmFnbWVudExpc3QoKS5iYWNrKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIE1DQXNtTGF5b3V0OjpFbnN1cmVWYWxpZChjb25zdCBNQ0ZyYWdtZW50ICpGKSBjb25zdCB7CisgIC8vIEFkdmFuY2UgdGhlIGxheW91dCBwb3NpdGlvbiB1bnRpbCB0aGUgZnJhZ21lbnQgaXMgdXAtdG8tZGF0ZS4KKyAgd2hpbGUgKCFpc0ZyYWdtZW50VXBUb0RhdGUoRikpIHsKKyAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IGZyYWdtZW50LgorICAgIE1DRnJhZ21lbnQgKkN1ciA9IExhc3RWYWxpZEZyYWdtZW50OworICAgIGlmIChDdXIpCisgICAgICBDdXIgPSBDdXItPmdldE5leHROb2RlKCk7CisgICAgaWYgKCFDdXIpIHsKKyAgICAgIHVuc2lnbmVkIE5leHRJbmRleCA9IDA7CisgICAgICBpZiAoTGFzdFZhbGlkRnJhZ21lbnQpCisgICAgICAgIE5leHRJbmRleCA9IExhc3RWYWxpZEZyYWdtZW50LT5nZXRQYXJlbnQoKS0+Z2V0TGF5b3V0T3JkZXIoKSArIDE7CisgICAgICBDdXIgPSBTZWN0aW9uT3JkZXJbTmV4dEluZGV4XS0+YmVnaW4oKTsKKyAgICB9CisKKyAgICBjb25zdF9jYXN0PE1DQXNtTGF5b3V0Kj4odGhpcyktPkxheW91dEZyYWdtZW50KEN1cik7CisgIH0KK30KKwordm9pZCBNQ0FzbUxheW91dDo6RnJhZ21lbnRSZXBsYWNlZChNQ0ZyYWdtZW50ICpTcmMsIE1DRnJhZ21lbnQgKkRzdCkgeworICBpZiAoTGFzdFZhbGlkRnJhZ21lbnQgPT0gU3JjKQorICAgIExhc3RWYWxpZEZyYWdtZW50ID0gRHN0OworCisgIERzdC0+T2Zmc2V0ID0gU3JjLT5PZmZzZXQ7CisgIERzdC0+RWZmZWN0aXZlU2l6ZSA9IFNyYy0+RWZmZWN0aXZlU2l6ZTsKK30KKwordWludDY0X3QgTUNBc21MYXlvdXQ6OmdldEZyYWdtZW50QWRkcmVzcyhjb25zdCBNQ0ZyYWdtZW50ICpGKSBjb25zdCB7CisgIGFzc2VydChGLT5nZXRQYXJlbnQoKSAmJiAiTWlzc2luZyBzZWN0aW9uKCkhIik7CisgIHJldHVybiBnZXRTZWN0aW9uQWRkcmVzcyhGLT5nZXRQYXJlbnQoKSkgKyBnZXRGcmFnbWVudE9mZnNldChGKTsKK30KKwordWludDY0X3QgTUNBc21MYXlvdXQ6OmdldEZyYWdtZW50RWZmZWN0aXZlU2l6ZShjb25zdCBNQ0ZyYWdtZW50ICpGKSBjb25zdCB7CisgIEVuc3VyZVZhbGlkKEYpOworICBhc3NlcnQoRi0+RWZmZWN0aXZlU2l6ZSAhPSB+VUlOVDY0X0MoMCkgJiYgIkFkZHJlc3Mgbm90IHNldCEiKTsKKyAgcmV0dXJuIEYtPkVmZmVjdGl2ZVNpemU7Cit9CisKK3VpbnQ2NF90IE1DQXNtTGF5b3V0OjpnZXRGcmFnbWVudE9mZnNldChjb25zdCBNQ0ZyYWdtZW50ICpGKSBjb25zdCB7CisgIEVuc3VyZVZhbGlkKEYpOworICBhc3NlcnQoRi0+T2Zmc2V0ICE9IH5VSU5UNjRfQygwKSAmJiAiQWRkcmVzcyBub3Qgc2V0ISIpOworICByZXR1cm4gRi0+T2Zmc2V0OworfQorCit1aW50NjRfdCBNQ0FzbUxheW91dDo6Z2V0U3ltYm9sQWRkcmVzcyhjb25zdCBNQ1N5bWJvbERhdGEgKlNEKSBjb25zdCB7CisgIGFzc2VydChTRC0+Z2V0RnJhZ21lbnQoKSAmJiAiSW52YWxpZCBnZXRBZGRyZXNzKCkgb24gdW5kZWZpbmVkIHN5bWJvbCEiKTsKKyAgcmV0dXJuIGdldEZyYWdtZW50QWRkcmVzcyhTRC0+Z2V0RnJhZ21lbnQoKSkgKyBTRC0+Z2V0T2Zmc2V0KCk7Cit9CisKK3VpbnQ2NF90IE1DQXNtTGF5b3V0OjpnZXRTZWN0aW9uQWRkcmVzcyhjb25zdCBNQ1NlY3Rpb25EYXRhICpTRCkgY29uc3QgeworICBFbnN1cmVWYWxpZChTRC0+YmVnaW4oKSk7CisgIGFzc2VydChTRC0+QWRkcmVzcyAhPSB+VUlOVDY0X0MoMCkgJiYgIkFkZHJlc3Mgbm90IHNldCEiKTsKKyAgcmV0dXJuIFNELT5BZGRyZXNzOworfQorCit1aW50NjRfdCBNQ0FzbUxheW91dDo6Z2V0U2VjdGlvbkFkZHJlc3NTaXplKGNvbnN0IE1DU2VjdGlvbkRhdGEgKlNEKSBjb25zdCB7CisgIC8vIFRoZSBzaXplIGlzIHRoZSBsYXN0IGZyYWdtZW50J3MgZW5kIG9mZnNldC4KKyAgY29uc3QgTUNGcmFnbWVudCAmRiA9IFNELT5nZXRGcmFnbWVudExpc3QoKS5iYWNrKCk7CisgIHJldHVybiBnZXRGcmFnbWVudE9mZnNldCgmRikgKyBnZXRGcmFnbWVudEVmZmVjdGl2ZVNpemUoJkYpOworfQorCit1aW50NjRfdCBNQ0FzbUxheW91dDo6Z2V0U2VjdGlvbkZpbGVTaXplKGNvbnN0IE1DU2VjdGlvbkRhdGEgKlNEKSBjb25zdCB7CisgIC8vIFZpcnR1YWwgc2VjdGlvbnMgaGF2ZSBubyBmaWxlIHNpemUuCisgIGlmIChnZXRBc3NlbWJsZXIoKS5nZXRCYWNrZW5kKCkuaXNWaXJ0dWFsU2VjdGlvbihTRC0+Z2V0U2VjdGlvbigpKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBPdGhlcndpc2UsIHRoZSBmaWxlIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIGFkZHJlc3Mgc3BhY2Ugc2l6ZS4KKyAgcmV0dXJuIGdldFNlY3Rpb25BZGRyZXNzU2l6ZShTRCk7Cit9CisKK3VpbnQ2NF90IE1DQXNtTGF5b3V0OjpnZXRTZWN0aW9uU2l6ZShjb25zdCBNQ1NlY3Rpb25EYXRhICpTRCkgY29uc3QgeworICAvLyBUaGUgbG9naWNhbCBzaXplIGlzIHRoZSBhZGRyZXNzIHNwYWNlIHNpemUgbWludXMgYW55IHRhaWwgcGFkZGluZy4KKyAgdWludDY0X3QgU2l6ZSA9IGdldFNlY3Rpb25BZGRyZXNzU2l6ZShTRCk7CisgIGNvbnN0IE1DQWxpZ25GcmFnbWVudCAqQUYgPQorICAgIGR5bl9jYXN0PE1DQWxpZ25GcmFnbWVudD4oJihTRC0+Z2V0RnJhZ21lbnRMaXN0KCkuYmFjaygpKSk7CisgIGlmIChBRiAmJiBBRi0+aGFzT25seUFsaWduQWRkcmVzcygpKQorICAgIFNpemUgLT0gZ2V0RnJhZ21lbnRFZmZlY3RpdmVTaXplKEFGKTsKKworICByZXR1cm4gU2l6ZTsKK30KKworLyogKioqICovCisKK01DRnJhZ21lbnQ6Ok1DRnJhZ21lbnQoKSA6IEtpbmQoRnJhZ21lbnRUeXBlKH4wKSkgeworfQorCitNQ0ZyYWdtZW50Ojp+TUNGcmFnbWVudCgpIHsKK30KKworTUNGcmFnbWVudDo6TUNGcmFnbWVudChGcmFnbWVudFR5cGUgX0tpbmQsIE1DU2VjdGlvbkRhdGEgKl9QYXJlbnQpCisgIDogS2luZChfS2luZCksIFBhcmVudChfUGFyZW50KSwgQXRvbSgwKSwgT2Zmc2V0KH5VSU5UNjRfQygwKSksCisgICAgRWZmZWN0aXZlU2l6ZSh+VUlOVDY0X0MoMCkpCit7CisgIGlmIChQYXJlbnQpCisgICAgUGFyZW50LT5nZXRGcmFnbWVudExpc3QoKS5wdXNoX2JhY2sodGhpcyk7Cit9CisKKy8qICoqKiAqLworCitNQ1NlY3Rpb25EYXRhOjpNQ1NlY3Rpb25EYXRhKCkgOiBTZWN0aW9uKDApIHt9CisKK01DU2VjdGlvbkRhdGE6Ok1DU2VjdGlvbkRhdGEoY29uc3QgTUNTZWN0aW9uICZfU2VjdGlvbiwgTUNBc3NlbWJsZXIgKkEpCisgIDogU2VjdGlvbigmX1NlY3Rpb24pLAorICAgIEFsaWdubWVudCgxKSwKKyAgICBBZGRyZXNzKH5VSU5UNjRfQygwKSksCisgICAgSGFzSW5zdHJ1Y3Rpb25zKGZhbHNlKQoreworICBpZiAoQSkKKyAgICBBLT5nZXRTZWN0aW9uTGlzdCgpLnB1c2hfYmFjayh0aGlzKTsKK30KKworLyogKioqICovCisKK01DU3ltYm9sRGF0YTo6TUNTeW1ib2xEYXRhKCkgOiBTeW1ib2woMCkge30KKworTUNTeW1ib2xEYXRhOjpNQ1N5bWJvbERhdGEoY29uc3QgTUNTeW1ib2wgJl9TeW1ib2wsIE1DRnJhZ21lbnQgKl9GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IF9PZmZzZXQsIE1DQXNzZW1ibGVyICpBKQorICA6IFN5bWJvbCgmX1N5bWJvbCksIEZyYWdtZW50KF9GcmFnbWVudCksIE9mZnNldChfT2Zmc2V0KSwKKyAgICBJc0V4dGVybmFsKGZhbHNlKSwgSXNQcml2YXRlRXh0ZXJuKGZhbHNlKSwKKyAgICBDb21tb25TaXplKDApLCBDb21tb25BbGlnbigwKSwgRmxhZ3MoMCksIEluZGV4KDApCit7CisgIGlmIChBKQorICAgIEEtPmdldFN5bWJvbExpc3QoKS5wdXNoX2JhY2sodGhpcyk7Cit9CisKKy8qICoqKiAqLworCitNQ0Fzc2VtYmxlcjo6TUNBc3NlbWJsZXIoTUNDb250ZXh0ICZfQ29udGV4dCwgVGFyZ2V0QXNtQmFja2VuZCAmX0JhY2tlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb2RlRW1pdHRlciAmX0VtaXR0ZXIsIHJhd19vc3RyZWFtICZfT1MpCisgIDogQ29udGV4dChfQ29udGV4dCksIEJhY2tlbmQoX0JhY2tlbmQpLCBFbWl0dGVyKF9FbWl0dGVyKSwKKyAgICBPUyhfT1MpLCBSZWxheEFsbChmYWxzZSksIFN1YnNlY3Rpb25zVmlhU3ltYm9scyhmYWxzZSkKK3sKK30KKworTUNBc3NlbWJsZXI6On5NQ0Fzc2VtYmxlcigpIHsKK30KKworc3RhdGljIGJvb2wgaXNTY2F0dGVyZWRGaXh1cEZ1bGx5UmVzb2x2ZWRTaW1wbGUoY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNWYWx1ZSBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1NlY3Rpb24gKkJhc2VTZWN0aW9uKSB7CisgIC8vIFRoZSBlZmZlY3RpdmUgZml4dXAgYWRkcmVzcyBpcworICAvLyAgICAgYWRkcihhdG9tKEEpKSArIG9mZnNldChBKQorICAvLyAgIC0gYWRkcihhdG9tKEIpKSAtIG9mZnNldChCKQorICAvLyAgIC0gYWRkcig8YmFzZSBzeW1ib2w+KSArIDxmaXh1cCBvZmZzZXQgZnJvbSBiYXNlIHN5bWJvbD4KKyAgLy8gYW5kIHRoZSBvZmZzZXRzIGFyZSBub3QgcmVsb2NhdGFibGUsIHNvIHRoZSBmaXh1cCBpcyBmdWxseSByZXNvbHZlZCB3aGVuCisgIC8vICBhZGRyKGF0b20oQSkpIC0gYWRkcihhdG9tKEIpKSAtIGFkZHIoPGJhc2Ugc3ltYm9sPikpID09IDAuCisgIC8vCisgIC8vIFRoZSBzaW1wbGUgKERhcndpbiwgZXhjZXB0IG9uIHg4Nl82NCkgd2F5IG9mIGRlYWxpbmcgd2l0aCB0aGlzIHdhcyB0bworICAvLyBhc3N1bWUgdGhhdCBhbnkgcmVmZXJlbmNlIHRvIGEgdGVtcG9yYXJ5IHN5bWJvbCAqbXVzdCogYmUgYSB0ZW1wb3JhcnkKKyAgLy8gc3ltYm9sIGluIHRoZSBzYW1lIGF0b20sIHVubGVzcyB0aGUgc2VjdGlvbnMgZGlmZmVyLiBUaGVyZWZvcmUsIGFueSBQQ3JlbAorICAvLyByZWxvY2F0aW9uIHRvIGEgdGVtcG9yYXJ5IHN5bWJvbCAoaW4gdGhlIHNhbWUgc2VjdGlvbikgaXMgZnVsbHkKKyAgLy8gcmVzb2x2ZWQuIFRoaXMgYWxzbyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIGFic29sdXRpemVkIC5zZXQsIHdoaWNoCisgIC8vIHJlcXVpcmVzIHRoZSBjb21waWxlciB0byB1c2UgLnNldCB0byBhYnNvbHV0aXplIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisgIC8vIHN5bWJvbHMgd2hpY2ggdGhlIGNvbXBpbGVyIGtub3dzIHRvIGJlIGFzc2VtYmx5IHRpbWUgY29uc3RhbnRzLCBzbyB3ZSBkb24ndAorICAvLyBuZWVkIHRvIHdvcnJ5IGFib3V0IGNvbnNpZGVyaW5nIHN5bWJvbCBkaWZmZXJlbmNlcyBmdWxseSByZXNvbHZlZC4KKworICAvLyBOb24tcmVsYXRpdmUgZml4dXBzIGFyZSBvbmx5IHJlc29sdmVkIGlmIGNvbnN0YW50LgorICBpZiAoIUJhc2VTZWN0aW9uKQorICAgIHJldHVybiBUYXJnZXQuaXNBYnNvbHV0ZSgpOworCisgIC8vIE90aGVyd2lzZSwgcmVsYXRpdmUgZml4dXBzIGFyZSBvbmx5IHJlc29sdmVkIGlmIG5vdCBhIGRpZmZlcmVuY2UgYW5kIHRoZQorICAvLyB0YXJnZXQgaXMgYSB0ZW1wb3JhcnkgaW4gdGhlIHNhbWUgc2VjdGlvbi4KKyAgaWYgKFRhcmdldC5pc0Fic29sdXRlKCkgfHwgVGFyZ2V0LmdldFN5bUIoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgTUNTeW1ib2wgKkEgPSAmVGFyZ2V0LmdldFN5bUEoKS0+Z2V0U3ltYm9sKCk7CisgIGlmICghQS0+aXNUZW1wb3JhcnkoKSB8fCAhQS0+aXNJblNlY3Rpb24oKSB8fAorICAgICAgJkEtPmdldFNlY3Rpb24oKSAhPSBCYXNlU2VjdGlvbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGlzU2NhdHRlcmVkRml4dXBGdWxseVJlc29sdmVkKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAmRml4dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1ZhbHVlIFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sRGF0YSAqQmFzZVN5bWJvbCkgeworICAvLyBUaGUgZWZmZWN0aXZlIGZpeHVwIGFkZHJlc3MgaXMKKyAgLy8gICAgIGFkZHIoYXRvbShBKSkgKyBvZmZzZXQoQSkKKyAgLy8gICAtIGFkZHIoYXRvbShCKSkgLSBvZmZzZXQoQikKKyAgLy8gICAtIGFkZHIoQmFzZVN5bWJvbCkgKyA8Zml4dXAgb2Zmc2V0IGZyb20gYmFzZSBzeW1ib2w+CisgIC8vIGFuZCB0aGUgb2Zmc2V0cyBhcmUgbm90IHJlbG9jYXRhYmxlLCBzbyB0aGUgZml4dXAgaXMgZnVsbHkgcmVzb2x2ZWQgd2hlbgorICAvLyAgYWRkcihhdG9tKEEpKSAtIGFkZHIoYXRvbShCKSkgLSBhZGRyKEJhc2VTeW1ib2wpID09IDAuCisgIC8vCisgIC8vIE5vdGUgdGhhdCAiZmFsc2UiIGlzIGFsbW9zdCBhbHdheXMgY29uc2VydmF0aXZlbHkgY29ycmVjdCAoaXQgbWVhbnMgd2UgZW1pdAorICAvLyBhIHJlbG9jYXRpb24gd2hpY2ggaXMgdW5uZWNlc3NhcnkpLCBleGNlcHQgd2hlbiBpdCB3b3VsZCBmb3JjZSB1cyB0byBlbWl0IGEKKyAgLy8gcmVsb2NhdGlvbiB3aGljaCB0aGUgdGFyZ2V0IGNhbm5vdCBlbmNvZGUuCisKKyAgY29uc3QgTUNTeW1ib2xEYXRhICpBX0Jhc2UgPSAwLCAqQl9CYXNlID0gMDsKKyAgaWYgKGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqQSA9IFRhcmdldC5nZXRTeW1BKCkpIHsKKyAgICAvLyBNb2RpZmllZCBzeW1ib2wgcmVmZXJlbmNlcyBjYW5ub3QgYmUgcmVzb2x2ZWQuCisgICAgaWYgKEEtPmdldEtpbmQoKSAhPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX05vbmUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBBX0Jhc2UgPSBBc20uZ2V0QXRvbShMYXlvdXQsICZBc20uZ2V0U3ltYm9sRGF0YShBLT5nZXRTeW1ib2woKSkpOworICAgIGlmICghQV9CYXNlKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqQiA9IFRhcmdldC5nZXRTeW1CKCkpIHsKKyAgICAvLyBNb2RpZmllZCBzeW1ib2wgcmVmZXJlbmNlcyBjYW5ub3QgYmUgcmVzb2x2ZWQuCisgICAgaWYgKEItPmdldEtpbmQoKSAhPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX05vbmUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBCX0Jhc2UgPSBBc20uZ2V0QXRvbShMYXlvdXQsICZBc20uZ2V0U3ltYm9sRGF0YShCLT5nZXRTeW1ib2woKSkpOworICAgIGlmICghQl9CYXNlKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYgdGhlcmUgaXMgbm8gYmFzZSwgQSBhbmQgQiBoYXZlIHRvIGJlIHRoZSBzYW1lIGF0b20gZm9yIHRoaXMgZml4dXAgdG8gYmUKKyAgLy8gZnVsbHkgcmVzb2x2ZWQuCisgIGlmICghQmFzZVN5bWJvbCkKKyAgICByZXR1cm4gQV9CYXNlID09IEJfQmFzZTsKKworICAvLyBPdGhlcndpc2UsIEIgbXVzdCBiZSBtaXNzaW5nIGFuZCBBIG11c3QgYmUgdGhlIGJhc2UuCisgIHJldHVybiAhQl9CYXNlICYmIEJhc2VTeW1ib2wgPT0gQV9CYXNlOworfQorCitib29sIE1DQXNzZW1ibGVyOjppc1N5bWJvbExpbmtlclZpc2libGUoY29uc3QgTUNTeW1ib2wgJlN5bWJvbCkgY29uc3QgeworICAvLyBOb24tdGVtcG9yYXJ5IGxhYmVscyBzaG91bGQgYWx3YXlzIGJlIHZpc2libGUgdG8gdGhlIGxpbmtlci4KKyAgaWYgKCFTeW1ib2wuaXNUZW1wb3JhcnkoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBBYnNvbHV0ZSB0ZW1wb3JhcnkgbGFiZWxzIGFyZSBuZXZlciB2aXNpYmxlLgorICBpZiAoIVN5bWJvbC5pc0luU2VjdGlvbigpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBPdGhlcndpc2UsIGNoZWNrIGlmIHRoZSBzZWN0aW9uIHJlcXVpcmVzIHN5bWJvbHMgZXZlbiBmb3IgdGVtcG9yYXJ5IGxhYmVscy4KKyAgcmV0dXJuIGdldEJhY2tlbmQoKS5kb2VzU2VjdGlvblJlcXVpcmVTeW1ib2xzKFN5bWJvbC5nZXRTZWN0aW9uKCkpOworfQorCitjb25zdCBNQ1N5bWJvbERhdGEgKk1DQXNzZW1ibGVyOjpnZXRBdG9tKGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sRGF0YSAqU0QpIGNvbnN0IHsKKyAgLy8gTGlua2VyIHZpc2libGUgc3ltYm9scyBkZWZpbmUgYXRvbXMuCisgIGlmIChpc1N5bWJvbExpbmtlclZpc2libGUoU0QtPmdldFN5bWJvbCgpKSkKKyAgICByZXR1cm4gU0Q7CisKKyAgLy8gQWJzb2x1dGUgYW5kIHVuZGVmaW5lZCBzeW1ib2xzIGhhdmUgbm8gZGVmaW5pbmcgYXRvbS4KKyAgaWYgKCFTRC0+Z2V0RnJhZ21lbnQoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBOb24tbGlua2VyIHZpc2libGUgc3ltYm9scyBpbiBzZWN0aW9ucyB3aGljaCBjYW4ndCBiZSBhdG9taXplZCBoYXZlIG5vCisgIC8vIGRlZmluaW5nIGF0b20uCisgIGlmICghZ2V0QmFja2VuZCgpLmlzU2VjdGlvbkF0b21pemFibGUoCisgICAgICAgIFNELT5nZXRGcmFnbWVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0U2VjdGlvbigpKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgYXRvbSBmb3IgdGhlIGNvbnRhaW5pbmcgZnJhZ21lbnQuCisgIHJldHVybiBTRC0+Z2V0RnJhZ21lbnQoKS0+Z2V0QXRvbSgpOworfQorCitib29sIE1DQXNzZW1ibGVyOjpFdmFsdWF0ZUZpeHVwKGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwLCBjb25zdCBNQ0ZyYWdtZW50ICpERiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNWYWx1ZSAmVGFyZ2V0LCB1aW50NjRfdCAmVmFsdWUpIGNvbnN0IHsKKyAgKytzdGF0czo6RXZhbHVhdGVGaXh1cDsKKworICBpZiAoIUZpeHVwLmdldFZhbHVlKCktPkV2YWx1YXRlQXNSZWxvY2F0YWJsZShUYXJnZXQsICZMYXlvdXQpKQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiZXhwZWN0ZWQgcmVsb2NhdGFibGUgZXhwcmVzc2lvbiIpOworCisgIC8vIEZJWE1FOiBIb3cgZG8gbm9uLXNjYXR0ZXJlZCBzeW1ib2xzIHdvcmsgaW4gRUxGPyBJIHByZXN1bWUgdGhlIGxpbmtlcgorICAvLyBkb2Vzbid0IHN1cHBvcnQgc21hbGwgcmVsb2NhdGlvbnMsIGJ1dCB0aGVuIHVuZGVyIHdoYXQgY3JpdGVyaWEgZG9lcyB0aGUKKyAgLy8gYXNzZW1ibGVyIGFsbG93IHN5bWJvbCBkaWZmZXJlbmNlcz8KKworICBWYWx1ZSA9IFRhcmdldC5nZXRDb25zdGFudCgpOworCisgIGJvb2wgSXNQQ1JlbCA9IEVtaXR0ZXIuZ2V0Rml4dXBLaW5kSW5mbygKKyAgICBGaXh1cC5nZXRLaW5kKCkpLkZsYWdzICYgTUNGaXh1cEtpbmRJbmZvOjpGS0ZfSXNQQ1JlbDsKKyAgYm9vbCBJc1Jlc29sdmVkID0gdHJ1ZTsKKyAgaWYgKGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqQSA9IFRhcmdldC5nZXRTeW1BKCkpIHsKKyAgICBpZiAoQS0+Z2V0U3ltYm9sKCkuaXNEZWZpbmVkKCkpCisgICAgICBWYWx1ZSArPSBMYXlvdXQuZ2V0U3ltYm9sQWRkcmVzcygmZ2V0U3ltYm9sRGF0YShBLT5nZXRTeW1ib2woKSkpOworICAgIGVsc2UKKyAgICAgIElzUmVzb2x2ZWQgPSBmYWxzZTsKKyAgfQorICBpZiAoY29uc3QgTUNTeW1ib2xSZWZFeHByICpCID0gVGFyZ2V0LmdldFN5bUIoKSkgeworICAgIGlmIChCLT5nZXRTeW1ib2woKS5pc0RlZmluZWQoKSkKKyAgICAgIFZhbHVlIC09IExheW91dC5nZXRTeW1ib2xBZGRyZXNzKCZnZXRTeW1ib2xEYXRhKEItPmdldFN5bWJvbCgpKSk7CisgICAgZWxzZQorICAgICAgSXNSZXNvbHZlZCA9IGZhbHNlOworICB9CisKKyAgLy8gSWYgd2UgYXJlIHVzaW5nIHNjYXR0ZXJlZCBzeW1ib2xzLCBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHZhbHVlIGlzIGFjdHVhbGx5CisgIC8vIHJlc29sdmVkOyBzY2F0dGVyaW5nIG1heSBjYXVzZSBhdG9tcyB0byBtb3ZlLgorICBpZiAoSXNSZXNvbHZlZCAmJiBnZXRCYWNrZW5kKCkuaGFzU2NhdHRlcmVkU3ltYm9scygpKSB7CisgICAgaWYgKGdldEJhY2tlbmQoKS5oYXNSZWxpYWJsZVN5bWJvbERpZmZlcmVuY2UoKSkgeworICAgICAgLy8gSWYgdGhpcyBpcyBhIFBDcmVsIHJlbG9jYXRpb24sIGZpbmQgdGhlIGJhc2UgYXRvbSAoaWRlbnRpZmllZCBieSBpdHMKKyAgICAgIC8vIHN5bWJvbCkgdGhhdCB0aGUgZml4dXAgdmFsdWUgaXMgcmVsYXRpdmUgdG8uCisgICAgICBjb25zdCBNQ1N5bWJvbERhdGEgKkJhc2VTeW1ib2wgPSAwOworICAgICAgaWYgKElzUENSZWwpIHsKKyAgICAgICAgQmFzZVN5bWJvbCA9IERGLT5nZXRBdG9tKCk7CisgICAgICAgIGlmICghQmFzZVN5bWJvbCkKKyAgICAgICAgICBJc1Jlc29sdmVkID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChJc1Jlc29sdmVkKQorICAgICAgICBJc1Jlc29sdmVkID0gaXNTY2F0dGVyZWRGaXh1cEZ1bGx5UmVzb2x2ZWQoKnRoaXMsIExheW91dCwgRml4dXAsIFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VTeW1ib2wpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBNQ1NlY3Rpb24gKkJhc2VTZWN0aW9uID0gMDsKKyAgICAgIGlmIChJc1BDUmVsKQorICAgICAgICBCYXNlU2VjdGlvbiA9ICZERi0+Z2V0UGFyZW50KCktPmdldFNlY3Rpb24oKTsKKworICAgICAgSXNSZXNvbHZlZCA9IGlzU2NhdHRlcmVkRml4dXBGdWxseVJlc29sdmVkU2ltcGxlKCp0aGlzLCBGaXh1cCwgVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VTZWN0aW9uKTsKKyAgICB9CisgIH0KKworICBpZiAoSXNQQ1JlbCkKKyAgICBWYWx1ZSAtPSBMYXlvdXQuZ2V0RnJhZ21lbnRBZGRyZXNzKERGKSArIEZpeHVwLmdldE9mZnNldCgpOworCisgIHJldHVybiBJc1Jlc29sdmVkOworfQorCit1aW50NjRfdCBNQ0Fzc2VtYmxlcjo6Q29tcHV0ZUZyYWdtZW50U2l6ZShNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNlY3Rpb25BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRnJhZ21lbnRPZmZzZXQpIGNvbnN0IHsKKyAgc3dpdGNoIChGLmdldEtpbmQoKSkgeworICBjYXNlIE1DRnJhZ21lbnQ6OkZUX0RhdGE6CisgICAgcmV0dXJuIGNhc3Q8TUNEYXRhRnJhZ21lbnQ+KEYpLmdldENvbnRlbnRzKCkuc2l6ZSgpOworICBjYXNlIE1DRnJhZ21lbnQ6OkZUX0ZpbGw6CisgICAgcmV0dXJuIGNhc3Q8TUNGaWxsRnJhZ21lbnQ+KEYpLmdldFNpemUoKTsKKyAgY2FzZSBNQ0ZyYWdtZW50OjpGVF9JbnN0OgorICAgIHJldHVybiBjYXN0PE1DSW5zdEZyYWdtZW50PihGKS5nZXRJbnN0U2l6ZSgpOworCisgIGNhc2UgTUNGcmFnbWVudDo6RlRfQWxpZ246IHsKKyAgICBjb25zdCBNQ0FsaWduRnJhZ21lbnQgJkFGID0gY2FzdDxNQ0FsaWduRnJhZ21lbnQ+KEYpOworCisgICAgYXNzZXJ0KCghQUYuaGFzT25seUFsaWduQWRkcmVzcygpIHx8ICFBRi5nZXROZXh0Tm9kZSgpKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPbmx5QWxpZ25BZGRyZXNzIGJpdCwgbm90IHRoZSBsYXN0IGZyYWdtZW50ISIpOworCisgICAgdWludDY0X3QgU2l6ZSA9IE9mZnNldFRvQWxpZ25tZW50KFNlY3Rpb25BZGRyZXNzICsgRnJhZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGLmdldEFsaWdubWVudCgpKTsKKworICAgIC8vIEhvbm9yIE1heEJ5dGVzVG9FbWl0LgorICAgIGlmIChTaXplID4gQUYuZ2V0TWF4Qnl0ZXNUb0VtaXQoKSkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIFNpemU7CisgIH0KKworICBjYXNlIE1DRnJhZ21lbnQ6OkZUX09yZzogeworICAgIGNvbnN0IE1DT3JnRnJhZ21lbnQgJk9GID0gY2FzdDxNQ09yZ0ZyYWdtZW50PihGKTsKKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY29tcHV0ZSB0aGlzIHNvb25lciwgd2UgZG9uJ3Qgd2FudCB0byByZWN1cnNlIGhlcmUsIGFuZAorICAgIC8vIHdlIHdvdWxkIGxpa2UgdG8gYmUgbW9yZSBmdW5jdGlvbmFsLgorICAgIGludDY0X3QgVGFyZ2V0TG9jYXRpb247CisgICAgaWYgKCFPRi5nZXRPZmZzZXQoKS5FdmFsdWF0ZUFzQWJzb2x1dGUoVGFyZ2V0TG9jYXRpb24sICZMYXlvdXQpKQorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJleHBlY3RlZCBhc3NlbWJseS10aW1lIGFic29sdXRlIGV4cHJlc3Npb24iKTsKKworICAgIC8vIEZJWE1FOiBXZSBuZWVkIGEgd2F5IHRvIGNvbW11bmljYXRlIHRoaXMgZXJyb3IuCisgICAgaW50NjRfdCBPZmZzZXQgPSBUYXJnZXRMb2NhdGlvbiAtIEZyYWdtZW50T2Zmc2V0OworICAgIGlmIChPZmZzZXQgPCAwKQorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJpbnZhbGlkIC5vcmcgb2Zmc2V0ICciICsgVHdpbmUoVGFyZ2V0TG9jYXRpb24pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJyAoYXQgb2Zmc2V0ICciICsgVHdpbmUoRnJhZ21lbnRPZmZzZXQpICsgIiciKTsKKworICAgIHJldHVybiBPZmZzZXQ7CisgIH0KKyAgfQorCisgIGFzc2VydCgwICYmICJpbnZhbGlkIGZyYWdtZW50IGtpbmQiKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgTUNBc21MYXlvdXQ6OkxheW91dEZpbGUoKSB7CisgIC8vIEluaXRpYWxpemUgdGhlIGZpcnN0IHNlY3Rpb24gYW5kIHNldCB0aGUgdmFsaWQgZnJhZ21lbnQgbGF5b3V0IHBvaW50LiBBbGwKKyAgLy8gYWN0dWFsIGxheW91dCBjb21wdXRhdGlvbnMgYXJlIGRvbmUgbGF6aWx5LgorICBMYXN0VmFsaWRGcmFnbWVudCA9IDA7CisgIGlmICghZ2V0U2VjdGlvbk9yZGVyKCkuZW1wdHkoKSkKKyAgICBnZXRTZWN0aW9uT3JkZXIoKS5mcm9udCgpLT5BZGRyZXNzID0gMDsKK30KKwordm9pZCBNQ0FzbUxheW91dDo6TGF5b3V0RnJhZ21lbnQoTUNGcmFnbWVudCAqRikgeworICBNQ0ZyYWdtZW50ICpQcmV2ID0gRi0+Z2V0UHJldk5vZGUoKTsKKworICAvLyBXZSBzaG91bGQgbmV2ZXIgdHJ5IHRvIHJlY29tcHV0ZSBzb21ldGhpbmcgd2hpY2ggaXMgdXAtdG8tZGF0ZS4KKyAgYXNzZXJ0KCFpc0ZyYWdtZW50VXBUb0RhdGUoRikgJiYgIkF0dGVtcHQgdG8gcmVjb21wdXRlIHVwLXRvLWRhdGUgZnJhZ21lbnQhIik7CisgIC8vIFdlIHNob3VsZCBuZXZlciB0cnkgdG8gY29tcHV0ZSB0aGUgZnJhZ21lbnQgbGF5b3V0IGlmIHRoZSBzZWN0aW9uIGlzbid0CisgIC8vIHVwLXRvLWRhdGUuCisgIGFzc2VydChpc1NlY3Rpb25VcFRvRGF0ZShGLT5nZXRQYXJlbnQoKSkgJiYKKyAgICAgICAgICJBdHRlbXB0IHRvIGNvbXB1dGUgZnJhZ21lbnQgYmVmb3JlIGl0J3Mgc2VjdGlvbiEiKTsKKyAgLy8gV2Ugc2hvdWxkIG5ldmVyIHRyeSB0byBjb21wdXRlIHRoZSBmcmFnbWVudCBsYXlvdXQgaWYgaXQncyBwcmVkZWNlc3NvcgorICAvLyBpc24ndCB1cC10by1kYXRlLgorICBhc3NlcnQoKCFQcmV2IHx8IGlzRnJhZ21lbnRVcFRvRGF0ZShQcmV2KSkgJiYKKyAgICAgICAgICJBdHRlbXB0IHRvIGNvbXB1dGUgZnJhZ21lbnQgYmVmb3JlIGl0J3MgcHJlZGVjZXNzb3IhIik7CisKKyAgKytzdGF0czo6RnJhZ21lbnRMYXlvdXRzOworCisgIC8vIENvbXB1dGUgdGhlIGZyYWdtZW50IHN0YXJ0IGFkZHJlc3MuCisgIHVpbnQ2NF90IFN0YXJ0QWRkcmVzcyA9IEYtPmdldFBhcmVudCgpLT5BZGRyZXNzOworICB1aW50NjRfdCBBZGRyZXNzID0gU3RhcnRBZGRyZXNzOworICBpZiAoUHJldikKKyAgICBBZGRyZXNzICs9IFByZXYtPk9mZnNldCArIFByZXYtPkVmZmVjdGl2ZVNpemU7CisKKyAgLy8gQ29tcHV0ZSBmcmFnbWVudCBvZmZzZXQgYW5kIHNpemUuCisgIEYtPk9mZnNldCA9IEFkZHJlc3MgLSBTdGFydEFkZHJlc3M7CisgIEYtPkVmZmVjdGl2ZVNpemUgPSBnZXRBc3NlbWJsZXIoKS5Db21wdXRlRnJhZ21lbnRTaXplKCp0aGlzLCAqRiwgU3RhcnRBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGLT5PZmZzZXQpOworICBMYXN0VmFsaWRGcmFnbWVudCA9IEY7CisKKyAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudCBpbiBhIHNlY3Rpb24sIHVwZGF0ZSB0aGUgbmV4dCBzZWN0aW9uIGFkZHJlc3MuCisgIGlmICghRi0+Z2V0TmV4dE5vZGUoKSkgeworICAgIHVuc2lnbmVkIE5leHRJbmRleCA9IEYtPmdldFBhcmVudCgpLT5nZXRMYXlvdXRPcmRlcigpICsgMTsKKyAgICBpZiAoTmV4dEluZGV4ICE9IGdldFNlY3Rpb25PcmRlcigpLnNpemUoKSkKKyAgICAgIExheW91dFNlY3Rpb24oZ2V0U2VjdGlvbk9yZGVyKClbTmV4dEluZGV4XSk7CisgIH0KK30KKwordm9pZCBNQ0FzbUxheW91dDo6TGF5b3V0U2VjdGlvbihNQ1NlY3Rpb25EYXRhICpTRCkgeworICB1bnNpZ25lZCBTZWN0aW9uT3JkZXJJbmRleCA9IFNELT5nZXRMYXlvdXRPcmRlcigpOworCisgICsrc3RhdHM6OlNlY3Rpb25MYXlvdXRzOworCisgIC8vIENvbXB1dGUgdGhlIHNlY3Rpb24gc3RhcnQgYWRkcmVzcy4KKyAgdWludDY0X3QgU3RhcnRBZGRyZXNzID0gMDsKKyAgaWYgKFNlY3Rpb25PcmRlckluZGV4KSB7CisgICAgTUNTZWN0aW9uRGF0YSAqUHJldiA9IGdldFNlY3Rpb25PcmRlcigpW1NlY3Rpb25PcmRlckluZGV4IC0gMV07CisgICAgU3RhcnRBZGRyZXNzID0gZ2V0U2VjdGlvbkFkZHJlc3MoUHJldikgKyBnZXRTZWN0aW9uQWRkcmVzc1NpemUoUHJldik7CisgIH0KKworICAvLyBIb25vciB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLgorICBTdGFydEFkZHJlc3MgPSBSb3VuZFVwVG9BbGlnbm1lbnQoU3RhcnRBZGRyZXNzLCBTRC0+Z2V0QWxpZ25tZW50KCkpOworCisgIC8vIFNldCB0aGUgc2VjdGlvbiBhZGRyZXNzLgorICBTRC0+QWRkcmVzcyA9IFN0YXJ0QWRkcmVzczsKK30KKworLy8vIFdyaXRlRnJhZ21lbnREYXRhIC0gV3JpdGUgdGhlIFxhcmcgRiBkYXRhIHRvIHRoZSBvdXRwdXQgZmlsZS4KK3N0YXRpYyB2b2lkIFdyaXRlRnJhZ21lbnREYXRhKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICZGLCBNQ09iamVjdFdyaXRlciAqT1cpIHsKKyAgdWludDY0X3QgU3RhcnQgPSBPVy0+Z2V0U3RyZWFtKCkudGVsbCgpOworICAodm9pZCkgU3RhcnQ7CisKKyAgKytzdGF0czo6RW1pdHRlZEZyYWdtZW50czsKKworICAvLyBGSVhNRTogRW1iZWQgaW4gZnJhZ21lbnRzIGluc3RlYWQ/CisgIHVpbnQ2NF90IEZyYWdtZW50U2l6ZSA9IExheW91dC5nZXRGcmFnbWVudEVmZmVjdGl2ZVNpemUoJkYpOworICBzd2l0Y2ggKEYuZ2V0S2luZCgpKSB7CisgIGNhc2UgTUNGcmFnbWVudDo6RlRfQWxpZ246IHsKKyAgICBNQ0FsaWduRnJhZ21lbnQgJkFGID0gY2FzdDxNQ0FsaWduRnJhZ21lbnQ+KEYpOworICAgIHVpbnQ2NF90IENvdW50ID0gRnJhZ21lbnRTaXplIC8gQUYuZ2V0VmFsdWVTaXplKCk7CisKKyAgICBhc3NlcnQoQUYuZ2V0VmFsdWVTaXplKCkgJiYgIkludmFsaWQgdmlydHVhbCBhbGlnbiBpbiBjb25jcmV0ZSBmcmFnbWVudCEiKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIGVycm9yIHNob3VsZG4ndCBhY3R1YWxseSBvY2N1ciAodGhlIGZyb250IGVuZCBzaG91bGQgZW1pdAorICAgIC8vIG11bHRpcGxlIC5hbGlnbiBkaXJlY3RpdmVzIHRvIGVuZm9yY2UgdGhlIHNlbWFudGljcyBpdCB3YW50cyksIGJ1dCBpcworICAgIC8vIHNldmVyZSBlbm91Z2ggdGhhdCB3ZSB3YW50IHRvIHJlcG9ydCBpdC4gSG93IHRvIGhhbmRsZSB0aGlzPworICAgIGlmIChDb3VudCAqIEFGLmdldFZhbHVlU2l6ZSgpICE9IEZyYWdtZW50U2l6ZSkKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigidW5kZWZpbmVkIC5hbGlnbiBkaXJlY3RpdmUsIHZhbHVlIHNpemUgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoQUYuZ2V0VmFsdWVTaXplKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICInIGlzIG5vdCBhIGRpdmlzb3Igb2YgcGFkZGluZyBzaXplICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKEZyYWdtZW50U2l6ZSkgKyAiJyIpOworCisgICAgLy8gU2VlIGlmIHdlIGFyZSBhbGlnbmluZyB3aXRoIG5vcHMsIGFuZCBpZiBzbyBkbyB0aGF0IGZpcnN0IHRvIHRyeSB0byBmaWxsCisgICAgLy8gdGhlIENvdW50IGJ5dGVzLiAgVGhlbiBpZiB0aGF0IGRpZCBub3QgZmlsbCBhbnkgYnl0ZXMgb3IgdGhlcmUgYXJlIGFueQorICAgIC8vIGJ5dGVzIGxlZnQgdG8gZmlsbCB1c2UgdGhlIHRoZSBWYWx1ZSBhbmQgVmFsdWVTaXplIHRvIGZpbGwgdGhlIHJlc3QuCisgICAgLy8gSWYgd2UgYXJlIGFsaWduaW5nIHdpdGggbm9wcywgYXNrIHRoYXQgdGFyZ2V0IHRvIGVtaXQgdGhlIHJpZ2h0IGRhdGEuCisgICAgaWYgKEFGLmhhc0VtaXROb3BzKCkpIHsKKyAgICAgIGlmICghQXNtLmdldEJhY2tlbmQoKS5Xcml0ZU5vcERhdGEoQ291bnQsIE9XKSkKKyAgICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJ1bmFibGUgdG8gd3JpdGUgbm9wIHNlcXVlbmNlIG9mICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShDb3VudCkgKyAiIGJ5dGVzIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdyaXRlIG91dCBpbiBtdWx0aXBsZXMgb2YgdGhlIHZhbHVlIHNpemUuCisgICAgZm9yICh1aW50NjRfdCBpID0gMDsgaSAhPSBDb3VudDsgKytpKSB7CisgICAgICBzd2l0Y2ggKEFGLmdldFZhbHVlU2l6ZSgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBzaXplISIpOworICAgICAgY2FzZSAxOiBPVy0+V3JpdGU4ICh1aW50OF90IChBRi5nZXRWYWx1ZSgpKSk7IGJyZWFrOworICAgICAgY2FzZSAyOiBPVy0+V3JpdGUxNih1aW50MTZfdChBRi5nZXRWYWx1ZSgpKSk7IGJyZWFrOworICAgICAgY2FzZSA0OiBPVy0+V3JpdGUzMih1aW50MzJfdChBRi5nZXRWYWx1ZSgpKSk7IGJyZWFrOworICAgICAgY2FzZSA4OiBPVy0+V3JpdGU2NCh1aW50NjRfdChBRi5nZXRWYWx1ZSgpKSk7IGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgTUNGcmFnbWVudDo6RlRfRGF0YTogeworICAgIE1DRGF0YUZyYWdtZW50ICZERiA9IGNhc3Q8TUNEYXRhRnJhZ21lbnQ+KEYpOworICAgIGFzc2VydChGcmFnbWVudFNpemUgPT0gREYuZ2V0Q29udGVudHMoKS5zaXplKCkgJiYgIkludmFsaWQgc2l6ZSEiKTsKKyAgICBPVy0+V3JpdGVCeXRlcyhERi5nZXRDb250ZW50cygpLnN0cigpKTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgTUNGcmFnbWVudDo6RlRfRmlsbDogeworICAgIE1DRmlsbEZyYWdtZW50ICZGRiA9IGNhc3Q8TUNGaWxsRnJhZ21lbnQ+KEYpOworCisgICAgYXNzZXJ0KEZGLmdldFZhbHVlU2l6ZSgpICYmICJJbnZhbGlkIHZpcnR1YWwgYWxpZ24gaW4gY29uY3JldGUgZnJhZ21lbnQhIik7CisKKyAgICBmb3IgKHVpbnQ2NF90IGkgPSAwLCBlID0gRkYuZ2V0U2l6ZSgpIC8gRkYuZ2V0VmFsdWVTaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBzd2l0Y2ggKEZGLmdldFZhbHVlU2l6ZSgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBzaXplISIpOworICAgICAgY2FzZSAxOiBPVy0+V3JpdGU4ICh1aW50OF90IChGRi5nZXRWYWx1ZSgpKSk7IGJyZWFrOworICAgICAgY2FzZSAyOiBPVy0+V3JpdGUxNih1aW50MTZfdChGRi5nZXRWYWx1ZSgpKSk7IGJyZWFrOworICAgICAgY2FzZSA0OiBPVy0+V3JpdGUzMih1aW50MzJfdChGRi5nZXRWYWx1ZSgpKSk7IGJyZWFrOworICAgICAgY2FzZSA4OiBPVy0+V3JpdGU2NCh1aW50NjRfdChGRi5nZXRWYWx1ZSgpKSk7IGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgTUNGcmFnbWVudDo6RlRfSW5zdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmV4cGVjdGVkIGluc3QgZnJhZ21lbnQgYWZ0ZXIgbG93ZXJpbmciKTsKKyAgICBicmVhazsKKworICBjYXNlIE1DRnJhZ21lbnQ6OkZUX09yZzogeworICAgIE1DT3JnRnJhZ21lbnQgJk9GID0gY2FzdDxNQ09yZ0ZyYWdtZW50PihGKTsKKworICAgIGZvciAodWludDY0X3QgaSA9IDAsIGUgPSBGcmFnbWVudFNpemU7IGkgIT0gZTsgKytpKQorICAgICAgT1ctPldyaXRlOCh1aW50OF90KE9GLmdldFZhbHVlKCkpKTsKKworICAgIGJyZWFrOworICB9CisgIH0KKworICBhc3NlcnQoT1ctPmdldFN0cmVhbSgpLnRlbGwoKSAtIFN0YXJ0ID09IEZyYWdtZW50U2l6ZSk7Cit9CisKK3ZvaWQgTUNBc3NlbWJsZXI6OldyaXRlU2VjdGlvbkRhdGEoY29uc3QgTUNTZWN0aW9uRGF0YSAqU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DT2JqZWN0V3JpdGVyICpPVykgY29uc3QgeworICAvLyBJZ25vcmUgdmlydHVhbCBzZWN0aW9ucy4KKyAgaWYgKGdldEJhY2tlbmQoKS5pc1ZpcnR1YWxTZWN0aW9uKFNELT5nZXRTZWN0aW9uKCkpKSB7CisgICAgYXNzZXJ0KExheW91dC5nZXRTZWN0aW9uRmlsZVNpemUoU0QpID09IDAgJiYgIkludmFsaWQgc2l6ZSBmb3Igc2VjdGlvbiEiKTsKKworICAgIC8vIENoZWNrIHRoYXQgY29udGVudHMgYXJlIG9ubHkgdGhpbmdzIGxlZ2FsIGluc2lkZSBhIHZpcnR1YWwgc2VjdGlvbi4KKyAgICBmb3IgKE1DU2VjdGlvbkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gU0QtPmJlZ2luKCksCisgICAgICAgICAgIGllID0gU0QtPmVuZCgpOyBpdCAhPSBpZTsgKytpdCkgeworICAgICAgc3dpdGNoIChpdC0+Z2V0S2luZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBmcmFnbWVudCBpbiB2aXJ0dWFsIHNlY3Rpb24hIik7CisgICAgICBjYXNlIE1DRnJhZ21lbnQ6OkZUX0FsaWduOgorICAgICAgICBhc3NlcnQoIWNhc3Q8TUNBbGlnbkZyYWdtZW50PihpdCktPmdldFZhbHVlU2l6ZSgpICYmCisgICAgICAgICAgICAgICAiSW52YWxpZCBhbGlnbiBpbiB2aXJ0dWFsIHNlY3Rpb24hIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNQ0ZyYWdtZW50OjpGVF9GaWxsOgorICAgICAgICBhc3NlcnQoIWNhc3Q8TUNGaWxsRnJhZ21lbnQ+KGl0KS0+Z2V0VmFsdWVTaXplKCkgJiYKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGZpbGwgaW4gdmlydHVhbCBzZWN0aW9uISIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47CisgIH0KKworICB1aW50NjRfdCBTdGFydCA9IE9XLT5nZXRTdHJlYW0oKS50ZWxsKCk7CisgICh2b2lkKSBTdGFydDsKKworICBmb3IgKE1DU2VjdGlvbkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gU0QtPmJlZ2luKCksCisgICAgICAgICBpZSA9IFNELT5lbmQoKTsgaXQgIT0gaWU7ICsraXQpCisgICAgV3JpdGVGcmFnbWVudERhdGEoKnRoaXMsIExheW91dCwgKml0LCBPVyk7CisKKyAgYXNzZXJ0KE9XLT5nZXRTdHJlYW0oKS50ZWxsKCkgLSBTdGFydCA9PSBMYXlvdXQuZ2V0U2VjdGlvbkZpbGVTaXplKFNEKSk7Cit9CisKK3ZvaWQgTUNBc3NlbWJsZXI6OkZpbmlzaChNQ09iamVjdFdyaXRlciAqV3JpdGVyKSB7CisgIERFQlVHX1dJVEhfVFlQRSgibWMtZHVtcCIsIHsKKyAgICAgIGxsdm06OmVycnMoKSA8PCAiYXNzZW1ibGVyIGJhY2tlbmQgLSBwcmUtbGF5b3V0XG4tLVxuIjsKKyAgICAgIGR1bXAoKTsgfSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBsYXlvdXQgb2JqZWN0LgorICBNQ0FzbUxheW91dCBMYXlvdXQoKnRoaXMpOworCisgIC8vIEluc2VydCBhZGRpdGlvbmFsIGFsaWduIGZyYWdtZW50cyBmb3IgY29uY3JldGUgc2VjdGlvbnMgdG8gZXhwbGljaXRseSBwYWQKKyAgLy8gdGhlIHByZXZpb3VzIHNlY3Rpb24gdG8gbWF0Y2ggdGhlaXIgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gVGhpcyBpcyBmb3IKKyAgLy8gJ2dhcycgY29tcGF0aWJpbGl0eSwgaXQgc2hvdWxkbid0IHN0cmljdGx5IGJlIG5lY2Vzc2FyeS4KKyAgLy8KKyAgLy8gRklYTUU6IFRoaXMgbWF5IGJlIE1hY2gtTyBzcGVjaWZpYy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IExheW91dC5nZXRTZWN0aW9uT3JkZXIoKS5zaXplKCk7IGkgPCBlOyArK2kpIHsKKyAgICBNQ1NlY3Rpb25EYXRhICpTRCA9IExheW91dC5nZXRTZWN0aW9uT3JkZXIoKVtpXTsKKworICAgIC8vIElnbm9yZSBzZWN0aW9ucyB3aXRob3V0IGFsaWdubWVudCByZXF1aXJlbWVudHMuCisgICAgdW5zaWduZWQgQWxpZ24gPSBTRC0+Z2V0QWxpZ25tZW50KCk7CisgICAgaWYgKEFsaWduIDw9IDEpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIElnbm9yZSB2aXJ0dWFsIHNlY3Rpb25zLCB0aGV5IGRvbid0IGNhdXNlIGZpbGUgc2l6ZSBtb2RpZmljYXRpb25zLgorICAgIGlmIChnZXRCYWNrZW5kKCkuaXNWaXJ0dWFsU2VjdGlvbihTRC0+Z2V0U2VjdGlvbigpKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgYWxpZ24gZnJhZ21lbnQgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMKKyAgICAvLyBzZWN0aW9uLgorICAgIE1DQWxpZ25GcmFnbWVudCAqQUYgPSBuZXcgTUNBbGlnbkZyYWdtZW50KEFsaWduLCAwLCAxLCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXQuZ2V0U2VjdGlvbk9yZGVyKClbaSAtIDFdKTsKKyAgICBBRi0+c2V0T25seUFsaWduQWRkcmVzcyh0cnVlKTsKKyAgfQorCisgIC8vIENyZWF0ZSBkdW1teSBmcmFnbWVudHMgYW5kIGFzc2lnbiBzZWN0aW9uIG9yZGluYWxzLgorICB1bnNpZ25lZCBTZWN0aW9uSW5kZXggPSAwOworICBmb3IgKE1DQXNzZW1ibGVyOjppdGVyYXRvciBpdCA9IGJlZ2luKCksIGllID0gZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgLy8gQ3JlYXRlIGR1bW15IGZyYWdtZW50cyB0byBlbGltaW5hdGUgYW55IGVtcHR5IHNlY3Rpb25zLCB0aGlzIHNpbXBsaWZpZXMKKyAgICAvLyBsYXlvdXQuCisgICAgaWYgKGl0LT5nZXRGcmFnbWVudExpc3QoKS5lbXB0eSgpKQorICAgICAgbmV3IE1DRmlsbEZyYWdtZW50KDAsIDEsIDAsIGl0KTsKKworICAgIGl0LT5zZXRPcmRpbmFsKFNlY3Rpb25JbmRleCsrKTsKKyAgfQorCisgIC8vIEFzc2lnbiBsYXlvdXQgb3JkZXIgaW5kaWNlcyB0byBzZWN0aW9ucyBhbmQgZnJhZ21lbnRzLgorICB1bnNpZ25lZCBGcmFnbWVudEluZGV4ID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExheW91dC5nZXRTZWN0aW9uT3JkZXIoKS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTUNTZWN0aW9uRGF0YSAqU0QgPSBMYXlvdXQuZ2V0U2VjdGlvbk9yZGVyKClbaV07CisgICAgU0QtPnNldExheW91dE9yZGVyKGkpOworCisgICAgZm9yIChNQ1NlY3Rpb25EYXRhOjppdGVyYXRvciBpdDIgPSBTRC0+YmVnaW4oKSwKKyAgICAgICAgICAgaWUyID0gU0QtPmVuZCgpOyBpdDIgIT0gaWUyOyArK2l0MikKKyAgICAgIGl0Mi0+c2V0TGF5b3V0T3JkZXIoRnJhZ21lbnRJbmRleCsrKTsKKyAgfQorCisgIC8vIExheW91dCB1bnRpbCBldmVyeXRoaW5nIGZpdHMuCisgIHdoaWxlIChMYXlvdXRPbmNlKExheW91dCkpCisgICAgY29udGludWU7CisKKyAgREVCVUdfV0lUSF9UWVBFKCJtYy1kdW1wIiwgeworICAgICAgbGx2bTo6ZXJycygpIDw8ICJhc3NlbWJsZXIgYmFja2VuZCAtIHBvc3QtcmVsYXhhdGlvblxuLS1cbiI7CisgICAgICBkdW1wKCk7IH0pOworCisgIC8vIEZpbmFsaXplIHRoZSBsYXlvdXQsIGluY2x1ZGluZyBmcmFnbWVudCBsb3dlcmluZy4KKyAgRmluaXNoTGF5b3V0KExheW91dCk7CisKKyAgREVCVUdfV0lUSF9UWVBFKCJtYy1kdW1wIiwgeworICAgICAgbGx2bTo6ZXJycygpIDw8ICJhc3NlbWJsZXIgYmFja2VuZCAtIGZpbmFsLWxheW91dFxuLS1cbiI7CisgICAgICBkdW1wKCk7IH0pOworCisgIHVpbnQ2NF90IFN0YXJ0T2Zmc2V0ID0gT1MudGVsbCgpOworCisgIGxsdm06Ok93bmluZ1B0cjxNQ09iamVjdFdyaXRlcj4gT3duV3JpdGVyKDApOworICBpZiAoV3JpdGVyID09IDApIHsKKyAgICAvL25vIGN1c3RvbSBXcml0ZXJfIDogY3JlYXRlIHRoZSBkZWZhdWx0IG9uZSBsaWZlLW1hbmFnZWQgYnkgT3duaW5nUHRyCisgICAgT3duV3JpdGVyLnJlc2V0KGdldEJhY2tlbmQoKS5jcmVhdGVPYmplY3RXcml0ZXIoT1MpKTsKKyAgICBXcml0ZXIgPSBPd25Xcml0ZXIuZ2V0KCk7CisgICAgaWYgKCFXcml0ZXIpCisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoInVuYWJsZSB0byBjcmVhdGUgb2JqZWN0IHdyaXRlciEiKTsKKyAgfQorCisgIC8vIEFsbG93IHRoZSBvYmplY3Qgd3JpdGVyIGEgY2hhbmNlIHRvIHBlcmZvcm0gcG9zdC1sYXlvdXQgYmluZGluZyAoZm9yCisgIC8vIGV4YW1wbGUsIHRvIHNldCB0aGUgaW5kZXggZmllbGRzIGluIHRoZSBzeW1ib2wgZGF0YSkuCisgIFdyaXRlci0+RXhlY3V0ZVBvc3RMYXlvdXRCaW5kaW5nKCp0aGlzKTsKKworICAvLyBFdmFsdWF0ZSBhbmQgYXBwbHkgdGhlIGZpeHVwcywgZ2VuZXJhdGluZyByZWxvY2F0aW9uIGVudHJpZXMgYXMgbmVjZXNzYXJ5LgorICBmb3IgKE1DQXNzZW1ibGVyOjppdGVyYXRvciBpdCA9IGJlZ2luKCksIGllID0gZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgZm9yIChNQ1NlY3Rpb25EYXRhOjppdGVyYXRvciBpdDIgPSBpdC0+YmVnaW4oKSwKKyAgICAgICAgICAgaWUyID0gaXQtPmVuZCgpOyBpdDIgIT0gaWUyOyArK2l0MikgeworICAgICAgTUNEYXRhRnJhZ21lbnQgKkRGID0gZHluX2Nhc3Q8TUNEYXRhRnJhZ21lbnQ+KGl0Mik7CisgICAgICBpZiAoIURGKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgZm9yIChNQ0RhdGFGcmFnbWVudDo6Zml4dXBfaXRlcmF0b3IgaXQzID0gREYtPmZpeHVwX2JlZ2luKCksCisgICAgICAgICAgICAgaWUzID0gREYtPmZpeHVwX2VuZCgpOyBpdDMgIT0gaWUzOyArK2l0MykgeworICAgICAgICBNQ0ZpeHVwICZGaXh1cCA9ICppdDM7CisKKyAgICAgICAgLy8gRXZhbHVhdGUgdGhlIGZpeHVwLgorICAgICAgICBNQ1ZhbHVlIFRhcmdldDsKKyAgICAgICAgdWludDY0X3QgRml4ZWRWYWx1ZTsKKyAgICAgICAgaWYgKCFFdmFsdWF0ZUZpeHVwKExheW91dCwgRml4dXAsIERGLCBUYXJnZXQsIEZpeGVkVmFsdWUpKSB7CisgICAgICAgICAgLy8gVGhlIGZpeHVwIHdhcyB1bnJlc29sdmVkLCB3ZSBuZWVkIGEgcmVsb2NhdGlvbi4gSW5mb3JtIHRoZSBvYmplY3QKKyAgICAgICAgICAvLyB3cml0ZXIgb2YgdGhlIHJlbG9jYXRpb24sIGFuZCBnaXZlIGl0IGFuIG9wcG9ydHVuaXR5IHRvIGFkanVzdCB0aGUKKyAgICAgICAgICAvLyBmaXh1cCB2YWx1ZSBpZiBuZWVkIGJlLgorICAgICAgICAgIFdyaXRlci0+UmVjb3JkUmVsb2NhdGlvbigqdGhpcywgTGF5b3V0LCBERiwgRml4dXAsIFRhcmdldCxGaXhlZFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGdldEJhY2tlbmQoKS5BcHBseUZpeHVwKEZpeHVwLCAqREYsIEZpeGVkVmFsdWUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFdyaXRlIHRoZSBvYmplY3QgZmlsZS4KKyAgV3JpdGVyLT5Xcml0ZU9iamVjdCgqdGhpcywgTGF5b3V0KTsKKworICBzdGF0czo6T2JqZWN0Qnl0ZXMgKz0gT1MudGVsbCgpIC0gU3RhcnRPZmZzZXQ7Cit9CisKK2Jvb2wgTUNBc3NlbWJsZXI6OkZpeHVwTmVlZHNSZWxheGF0aW9uKGNvbnN0IE1DRml4dXAgJkZpeHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqREYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdCB7CisgIGlmIChnZXRSZWxheEFsbCgpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIElmIHdlIGNhbm5vdCByZXNvbHZlIHRoZSBmaXh1cCB2YWx1ZSwgaXQgcmVxdWlyZXMgcmVsYXhhdGlvbi4KKyAgTUNWYWx1ZSBUYXJnZXQ7CisgIHVpbnQ2NF90IFZhbHVlOworICBpZiAoIUV2YWx1YXRlRml4dXAoTGF5b3V0LCBGaXh1cCwgREYsIFRhcmdldCwgVmFsdWUpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIE90aGVyd2lzZSwgcmVsYXggaWYgdGhlIHZhbHVlIGlzIHRvbyBiaWcgZm9yIGEgKHNpZ25lZCkgaTguCisgIC8vCisgIC8vIEZJWE1FOiBUaGlzIGlzIHRhcmdldCBkZXBlbmRlbnQhCisgIHJldHVybiBpbnQ2NF90KFZhbHVlKSAhPSBpbnQ2NF90KGludDhfdChWYWx1ZSkpOworfQorCitib29sIE1DQXNzZW1ibGVyOjpGcmFnbWVudE5lZWRzUmVsYXhhdGlvbihjb25zdCBNQ0luc3RGcmFnbWVudCAqSUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdCB7CisgIC8vIElmIHRoaXMgaW5zdCBkb2Vzbid0IGV2ZXIgbmVlZCByZWxheGF0aW9uLCBpZ25vcmUgaXQuIFRoaXMgb2NjdXJzIHdoZW4gd2UKKyAgLy8gYXJlIGludGVudGlvbmFsbHkgcHVzaGluZyBvdXQgaW5zdCBmcmFnbWVudHMsIG9yIGJlY2F1c2Ugd2UgcmVsYXhlZCBhCisgIC8vIHByZXZpb3VzIGluc3RydWN0aW9uIHRvIG9uZSB0aGF0IGRvZXNuJ3QgbmVlZCByZWxheGF0aW9uLgorICBpZiAoIWdldEJhY2tlbmQoKS5NYXlOZWVkUmVsYXhhdGlvbihJRi0+Z2V0SW5zdCgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChNQ0luc3RGcmFnbWVudDo6Y29uc3RfZml4dXBfaXRlcmF0b3IgaXQgPSBJRi0+Zml4dXBfYmVnaW4oKSwKKyAgICAgICAgIGllID0gSUYtPmZpeHVwX2VuZCgpOyBpdCAhPSBpZTsgKytpdCkKKyAgICBpZiAoRml4dXBOZWVkc1JlbGF4YXRpb24oKml0LCBJRiwgTGF5b3V0KSkKKyAgICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNQ0Fzc2VtYmxlcjo6TGF5b3V0T25jZShNQ0FzbUxheW91dCAmTGF5b3V0KSB7CisgICsrc3RhdHM6OlJlbGF4YXRpb25TdGVwczsKKworICAvLyBMYXlvdXQgdGhlIHNlY3Rpb25zIGluIG9yZGVyLgorICBMYXlvdXQuTGF5b3V0RmlsZSgpOworCisgIC8vIFNjYW4gZm9yIGZyYWdtZW50cyB0aGF0IG5lZWQgcmVsYXhhdGlvbi4KKyAgYm9vbCBXYXNSZWxheGVkID0gZmFsc2U7CisgIGZvciAoaXRlcmF0b3IgaXQgPSBiZWdpbigpLCBpZSA9IGVuZCgpOyBpdCAhPSBpZTsgKytpdCkgeworICAgIE1DU2VjdGlvbkRhdGEgJlNEID0gKml0OworCisgICAgZm9yIChNQ1NlY3Rpb25EYXRhOjppdGVyYXRvciBpdDIgPSBTRC5iZWdpbigpLAorICAgICAgICAgICBpZTIgPSBTRC5lbmQoKTsgaXQyICE9IGllMjsgKytpdDIpIHsKKyAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gaW5zdHJ1Y3Rpb24gZnJhZ21lbnQgdGhhdCBuZWVkcyByZWxheGF0aW9uLgorICAgICAgTUNJbnN0RnJhZ21lbnQgKklGID0gZHluX2Nhc3Q8TUNJbnN0RnJhZ21lbnQ+KGl0Mik7CisgICAgICBpZiAoIUlGIHx8ICFGcmFnbWVudE5lZWRzUmVsYXhhdGlvbihJRiwgTGF5b3V0KSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgICsrc3RhdHM6OlJlbGF4ZWRJbnN0cnVjdGlvbnM7CisKKyAgICAgIC8vIEZJWE1FLVBFUkY6IFdlIGNvdWxkIGltbWVkaWF0ZWx5IGxvd2VyIG91dCBpbnN0cnVjdGlvbnMgaWYgd2UgY2FuIHRlbGwKKyAgICAgIC8vIHRoZXkgYXJlIGZ1bGx5IHJlc29sdmVkLCB0byBhdm9pZCByZXRlc3Rpbmcgb24gbGF0ZXIgcGFzc2VzLgorCisgICAgICAvLyBSZWxheCB0aGUgZnJhZ21lbnQuCisKKyAgICAgIE1DSW5zdCBSZWxheGVkOworICAgICAgZ2V0QmFja2VuZCgpLlJlbGF4SW5zdHJ1Y3Rpb24oSUYtPmdldEluc3QoKSwgUmVsYXhlZCk7CisKKyAgICAgIC8vIEVuY29kZSB0aGUgbmV3IGluc3RydWN0aW9uLgorICAgICAgLy8KKyAgICAgIC8vIEZJWE1FLVBFUkY6IElmIGl0IG1hdHRlcnMsIHdlIGNvdWxkIGxldCB0aGUgdGFyZ2V0IGRvIHRoaXMuIEl0IGNhbgorICAgICAgLy8gcHJvYmFibHkgZG8gc28gbW9yZSBlZmZpY2llbnRseSBpbiBtYW55IGNhc2VzLgorICAgICAgU21hbGxWZWN0b3I8TUNGaXh1cCwgND4gRml4dXBzOworICAgICAgU21hbGxTdHJpbmc8MjU2PiBDb2RlOworICAgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBWZWNPUyhDb2RlKTsKKyAgICAgIGdldEVtaXR0ZXIoKS5FbmNvZGVJbnN0cnVjdGlvbihSZWxheGVkLCBWZWNPUywgRml4dXBzKTsKKyAgICAgIFZlY09TLmZsdXNoKCk7CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gZnJhZ21lbnQuCisgICAgICBpbnQgU2xpZGVBbW91bnQgPSBDb2RlLnNpemUoKSAtIElGLT5nZXRJbnN0U2l6ZSgpOworICAgICAgSUYtPnNldEluc3QoUmVsYXhlZCk7CisgICAgICBJRi0+Z2V0Q29kZSgpID0gQ29kZTsKKyAgICAgIElGLT5nZXRGaXh1cHMoKS5jbGVhcigpOworICAgICAgLy8gRklYTUU6IEVsaW1pbmF0ZSBjb3B5LgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZpeHVwcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBJRi0+Z2V0Rml4dXBzKCkucHVzaF9iYWNrKEZpeHVwc1tpXSk7CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgbGF5b3V0LCBhbmQgcmVtZW1iZXIgdGhhdCB3ZSByZWxheGVkLgorICAgICAgTGF5b3V0LlVwZGF0ZUZvclNsaWRlKElGLCBTbGlkZUFtb3VudCk7CisgICAgICBXYXNSZWxheGVkID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gV2FzUmVsYXhlZDsKK30KKwordm9pZCBNQ0Fzc2VtYmxlcjo6RmluaXNoTGF5b3V0KE1DQXNtTGF5b3V0ICZMYXlvdXQpIHsKKyAgLy8gTG93ZXIgb3V0IGFueSBpbnN0cnVjdGlvbiBmcmFnbWVudHMsIHRvIHNpbXBsaWZ5IHRoZSBmaXh1cCBhcHBsaWNhdGlvbiBhbmQKKyAgLy8gb3V0cHV0LgorICAvLworICAvLyBGSVhNRS1QRVJGOiBXZSBkb24ndCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCB0aGUgYXNzdW1wdGlvbiBpcyB0aGF0IGl0IGlzCisgIC8vIGNoZWFwICh3ZSB3aWxsIG1vc3RseSBlbmQgdXAgZWxpbWluYXRpbmcgZnJhZ21lbnRzIGFuZCBhcHBlbmRpbmcgb24gdG8gZGF0YQorICAvLyBmcmFnbWVudHMpLCBzbyB0aGUgZXh0cmEgY29tcGxleGl0eSBkb3duc3RyZWFtIGlzbid0IHdvcnRoIGl0LiBFdmFsdWF0ZQorICAvLyB0aGlzIGFzc3VtcHRpb24uCisgIGZvciAoaXRlcmF0b3IgaXQgPSBiZWdpbigpLCBpZSA9IGVuZCgpOyBpdCAhPSBpZTsgKytpdCkgeworICAgIE1DU2VjdGlvbkRhdGEgJlNEID0gKml0OworCisgICAgZm9yIChNQ1NlY3Rpb25EYXRhOjppdGVyYXRvciBpdDIgPSBTRC5iZWdpbigpLAorICAgICAgICAgICBpZTIgPSBTRC5lbmQoKTsgaXQyICE9IGllMjsgKytpdDIpIHsKKyAgICAgIE1DSW5zdEZyYWdtZW50ICpJRiA9IGR5bl9jYXN0PE1DSW5zdEZyYWdtZW50PihpdDIpOworICAgICAgaWYgKCFJRikKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIENyZWF0ZSBhIG5ldyBkYXRhIGZyYWdtZW50IGZvciB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgICAvLworICAgICAgLy8gRklYTUUtUEVSRjogUmV1c2UgcHJldmlvdXMgZGF0YSBmcmFnbWVudCBpZiBwb3NzaWJsZS4KKyAgICAgIE1DRGF0YUZyYWdtZW50ICpERiA9IG5ldyBNQ0RhdGFGcmFnbWVudCgpOworICAgICAgU0QuZ2V0RnJhZ21lbnRMaXN0KCkuaW5zZXJ0KGl0MiwgREYpOworCisgICAgICAvLyBVcGRhdGUgdGhlIGRhdGEgZnJhZ21lbnRzIGxheW91dCBkYXRhLgorICAgICAgREYtPnNldFBhcmVudChJRi0+Z2V0UGFyZW50KCkpOworICAgICAgREYtPnNldEF0b20oSUYtPmdldEF0b20oKSk7CisgICAgICBERi0+c2V0TGF5b3V0T3JkZXIoSUYtPmdldExheW91dE9yZGVyKCkpOworICAgICAgTGF5b3V0LkZyYWdtZW50UmVwbGFjZWQoSUYsIERGKTsKKworICAgICAgLy8gQ29weSBpbiB0aGUgZGF0YSBhbmQgdGhlIGZpeHVwcy4KKyAgICAgIERGLT5nZXRDb250ZW50cygpLmFwcGVuZChJRi0+Z2V0Q29kZSgpLmJlZ2luKCksIElGLT5nZXRDb2RlKCkuZW5kKCkpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IElGLT5nZXRGaXh1cHMoKS5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBERi0+Z2V0Rml4dXBzKCkucHVzaF9iYWNrKElGLT5nZXRGaXh1cHMoKVtpXSk7CisKKyAgICAgIC8vIERlbGV0ZSB0aGUgaW5zdHJ1Y3Rpb24gZnJhZ21lbnQgYW5kIHVwZGF0ZSB0aGUgaXRlcmF0b3IuCisgICAgICBTRC5nZXRGcmFnbWVudExpc3QoKS5lcmFzZShJRik7CisgICAgICBpdDIgPSBERjsKKyAgICB9CisgIH0KK30KKworLy8gRGVidWdnaW5nIG1ldGhvZHMKKworbmFtZXNwYWNlIGxsdm0geworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DRml4dXAgJkFGKSB7CisgIE9TIDw8ICI8TUNGaXh1cCIgPDwgIiBPZmZzZXQ6IiA8PCBBRi5nZXRPZmZzZXQoKQorICAgICA8PCAiIFZhbHVlOiIgPDwgKkFGLmdldFZhbHVlKCkKKyAgICAgPDwgIiBLaW5kOiIgPDwgQUYuZ2V0S2luZCgpIDw8ICI+IjsKKyAgcmV0dXJuIE9TOworfQorCit9CisKK3ZvaWQgTUNGcmFnbWVudDo6ZHVtcCgpIHsKKyAgcmF3X29zdHJlYW0gJk9TID0gbGx2bTo6ZXJycygpOworCisgIE9TIDw8ICI8IjsKKyAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgY2FzZSBNQ0ZyYWdtZW50OjpGVF9BbGlnbjogT1MgPDwgIk1DQWxpZ25GcmFnbWVudCI7IGJyZWFrOworICBjYXNlIE1DRnJhZ21lbnQ6OkZUX0RhdGE6ICBPUyA8PCAiTUNEYXRhRnJhZ21lbnQiOyBicmVhazsKKyAgY2FzZSBNQ0ZyYWdtZW50OjpGVF9GaWxsOiAgT1MgPDwgIk1DRmlsbEZyYWdtZW50IjsgYnJlYWs7CisgIGNhc2UgTUNGcmFnbWVudDo6RlRfSW5zdDogIE9TIDw8ICJNQ0luc3RGcmFnbWVudCI7IGJyZWFrOworICBjYXNlIE1DRnJhZ21lbnQ6OkZUX09yZzogICBPUyA8PCAiTUNPcmdGcmFnbWVudCI7IGJyZWFrOworICB9CisKKyAgT1MgPDwgIjxNQ0ZyYWdtZW50ICIgPDwgKHZvaWQqKSB0aGlzIDw8ICIgTGF5b3V0T3JkZXI6IiA8PCBMYXlvdXRPcmRlcgorICAgICA8PCAiIE9mZnNldDoiIDw8IE9mZnNldCA8PCAiIEVmZmVjdGl2ZVNpemU6IiA8PCBFZmZlY3RpdmVTaXplIDw8ICI+IjsKKworICBzd2l0Y2ggKGdldEtpbmQoKSkgeworICBjYXNlIE1DRnJhZ21lbnQ6OkZUX0FsaWduOiB7CisgICAgY29uc3QgTUNBbGlnbkZyYWdtZW50ICpBRiA9IGNhc3Q8TUNBbGlnbkZyYWdtZW50Pih0aGlzKTsKKyAgICBpZiAoQUYtPmhhc0VtaXROb3BzKCkpCisgICAgICBPUyA8PCAiIChlbWl0IG5vcHMpIjsKKyAgICBpZiAoQUYtPmhhc09ubHlBbGlnbkFkZHJlc3MoKSkKKyAgICAgIE9TIDw8ICIgKG9ubHkgYWxpZ24gc2VjdGlvbikiOworICAgIE9TIDw8ICJcbiAgICAgICAiOworICAgIE9TIDw8ICIgQWxpZ25tZW50OiIgPDwgQUYtPmdldEFsaWdubWVudCgpCisgICAgICAgPDwgIiBWYWx1ZToiIDw8IEFGLT5nZXRWYWx1ZSgpIDw8ICIgVmFsdWVTaXplOiIgPDwgQUYtPmdldFZhbHVlU2l6ZSgpCisgICAgICAgPDwgIiBNYXhCeXRlc1RvRW1pdDoiIDw8IEFGLT5nZXRNYXhCeXRlc1RvRW1pdCgpIDw8ICI+IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIE1DRnJhZ21lbnQ6OkZUX0RhdGE6ICB7CisgICAgY29uc3QgTUNEYXRhRnJhZ21lbnQgKkRGID0gY2FzdDxNQ0RhdGFGcmFnbWVudD4odGhpcyk7CisgICAgT1MgPDwgIlxuICAgICAgICI7CisgICAgT1MgPDwgIiBDb250ZW50czpbIjsKKyAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkNvbnRlbnRzID0gREYtPmdldENvbnRlbnRzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvbnRlbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChpKSBPUyA8PCAiLCI7CisgICAgICBPUyA8PCBoZXhkaWdpdCgoQ29udGVudHNbaV0gPj4gNCkgJiAweEYpIDw8IGhleGRpZ2l0KENvbnRlbnRzW2ldICYgMHhGKTsKKyAgICB9CisgICAgT1MgPDwgIl0gKCIgPDwgQ29udGVudHMuc2l6ZSgpIDw8ICIgYnl0ZXMpIjsKKworICAgIGlmICghREYtPmdldEZpeHVwcygpLmVtcHR5KCkpIHsKKyAgICAgIE9TIDw8ICIsXG4gICAgICAgIjsKKyAgICAgIE9TIDw8ICIgRml4dXBzOlsiOworICAgICAgZm9yIChNQ0RhdGFGcmFnbWVudDo6Y29uc3RfZml4dXBfaXRlcmF0b3IgaXQgPSBERi0+Zml4dXBfYmVnaW4oKSwKKyAgICAgICAgICAgICBpZSA9IERGLT5maXh1cF9lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0ICE9IERGLT5maXh1cF9iZWdpbigpKSBPUyA8PCAiLFxuICAgICAgICAgICAgICAgICI7CisgICAgICAgIE9TIDw8ICppdDsKKyAgICAgIH0KKyAgICAgIE9TIDw8ICJdIjsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBNQ0ZyYWdtZW50OjpGVF9GaWxsOiAgeworICAgIGNvbnN0IE1DRmlsbEZyYWdtZW50ICpGRiA9IGNhc3Q8TUNGaWxsRnJhZ21lbnQ+KHRoaXMpOworICAgIE9TIDw8ICIgVmFsdWU6IiA8PCBGRi0+Z2V0VmFsdWUoKSA8PCAiIFZhbHVlU2l6ZToiIDw8IEZGLT5nZXRWYWx1ZVNpemUoKQorICAgICAgIDw8ICIgU2l6ZToiIDw8IEZGLT5nZXRTaXplKCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBNQ0ZyYWdtZW50OjpGVF9JbnN0OiAgeworICAgIGNvbnN0IE1DSW5zdEZyYWdtZW50ICpJRiA9IGNhc3Q8TUNJbnN0RnJhZ21lbnQ+KHRoaXMpOworICAgIE9TIDw8ICJcbiAgICAgICAiOworICAgIE9TIDw8ICIgSW5zdDoiOworICAgIElGLT5nZXRJbnN0KCkuZHVtcF9wcmV0dHkoT1MpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgTUNGcmFnbWVudDo6RlRfT3JnOiAgeworICAgIGNvbnN0IE1DT3JnRnJhZ21lbnQgKk9GID0gY2FzdDxNQ09yZ0ZyYWdtZW50Pih0aGlzKTsKKyAgICBPUyA8PCAiXG4gICAgICAgIjsKKyAgICBPUyA8PCAiIE9mZnNldDoiIDw8IE9GLT5nZXRPZmZzZXQoKSA8PCAiIFZhbHVlOiIgPDwgT0YtPmdldFZhbHVlKCk7CisgICAgYnJlYWs7CisgIH0KKyAgfQorICBPUyA8PCAiPiI7Cit9CisKK3ZvaWQgTUNTZWN0aW9uRGF0YTo6ZHVtcCgpIHsKKyAgcmF3X29zdHJlYW0gJk9TID0gbGx2bTo6ZXJycygpOworCisgIE9TIDw8ICI8TUNTZWN0aW9uRGF0YSI7CisgIE9TIDw8ICIgQWxpZ25tZW50OiIgPDwgZ2V0QWxpZ25tZW50KCkgPDwgIiBBZGRyZXNzOiIgPDwgQWRkcmVzcworICAgICA8PCAiIEZyYWdtZW50czpbXG4gICAgICAiOworICBmb3IgKGl0ZXJhdG9yIGl0ID0gYmVnaW4oKSwgaWUgPSBlbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICBpZiAoaXQgIT0gYmVnaW4oKSkgT1MgPDwgIixcbiAgICAgICI7CisgICAgaXQtPmR1bXAoKTsKKyAgfQorICBPUyA8PCAiXT4iOworfQorCit2b2lkIE1DU3ltYm9sRGF0YTo6ZHVtcCgpIHsKKyAgcmF3X29zdHJlYW0gJk9TID0gbGx2bTo6ZXJycygpOworCisgIE9TIDw8ICI8TUNTeW1ib2xEYXRhIFN5bWJvbDoiIDw8IGdldFN5bWJvbCgpCisgICAgIDw8ICIgRnJhZ21lbnQ6IiA8PCBnZXRGcmFnbWVudCgpIDw8ICIgT2Zmc2V0OiIgPDwgZ2V0T2Zmc2V0KCkKKyAgICAgPDwgIiBGbGFnczoiIDw8IGdldEZsYWdzKCkgPDwgIiBJbmRleDoiIDw8IGdldEluZGV4KCk7CisgIGlmIChpc0NvbW1vbigpKQorICAgIE9TIDw8ICIgKGNvbW1vbiwgc2l6ZToiIDw8IGdldENvbW1vblNpemUoKQorICAgICAgIDw8ICIgYWxpZ246ICIgPDwgZ2V0Q29tbW9uQWxpZ25tZW50KCkgPDwgIikiOworICBpZiAoaXNFeHRlcm5hbCgpKQorICAgIE9TIDw8ICIgKGV4dGVybmFsKSI7CisgIGlmIChpc1ByaXZhdGVFeHRlcm4oKSkKKyAgICBPUyA8PCAiIChwcml2YXRlIGV4dGVybikiOworICBPUyA8PCAiPiI7Cit9CisKK3ZvaWQgTUNBc3NlbWJsZXI6OmR1bXAoKSB7CisgIHJhd19vc3RyZWFtICZPUyA9IGxsdm06OmVycnMoKTsKKworICBPUyA8PCAiPE1DQXNzZW1ibGVyXG4iOworICBPUyA8PCAiICBTZWN0aW9uczpbXG4gICAgIjsKKyAgZm9yIChpdGVyYXRvciBpdCA9IGJlZ2luKCksIGllID0gZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgaWYgKGl0ICE9IGJlZ2luKCkpIE9TIDw8ICIsXG4gICAgIjsKKyAgICBpdC0+ZHVtcCgpOworICB9CisgIE9TIDw8ICJdLFxuIjsKKyAgT1MgPDwgIiAgU3ltYm9sczpbIjsKKworICBmb3IgKHN5bWJvbF9pdGVyYXRvciBpdCA9IHN5bWJvbF9iZWdpbigpLCBpZSA9IHN5bWJvbF9lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICBpZiAoaXQgIT0gc3ltYm9sX2JlZ2luKCkpIE9TIDw8ICIsXG4gICAgICAgICAgICI7CisgICAgaXQtPmR1bXAoKTsKKyAgfQorICBPUyA8PCAiXT5cbiI7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNDb2RlRW1pdHRlci5jcHAgYi9zcmMvTExWTS9saWIvTUMvTUNDb2RlRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxMzIzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ0NvZGVFbWl0dGVyLmNwcApAQCAtMCwwICsxLDMwIEBACisvLz09PS0tIE1DQ29kZUVtaXR0ZXIuY3BwIC0gSW5zdHJ1Y3Rpb24gRW5jb2RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvZGVFbWl0dGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNQ0NvZGVFbWl0dGVyOjpNQ0NvZGVFbWl0dGVyKCkgeworfQorCitNQ0NvZGVFbWl0dGVyOjp+TUNDb2RlRW1pdHRlcigpIHsKK30KKworY29uc3QgTUNGaXh1cEtpbmRJbmZvICZNQ0NvZGVFbWl0dGVyOjpnZXRGaXh1cEtpbmRJbmZvKE1DRml4dXBLaW5kIEtpbmQpIGNvbnN0IHsKKyAgc3RhdGljIGNvbnN0IE1DRml4dXBLaW5kSW5mbyBCdWlsdGluc1tdID0geworICAgIHsgIkZLX0RhdGFfMSIsIDAsIDgsIDAgfSwKKyAgICB7ICJGS19EYXRhXzIiLCAwLCAxNiwgMCB9LAorICAgIHsgIkZLX0RhdGFfNCIsIDAsIDMyLCAwIH0sCisgICAgeyAiRktfRGF0YV84IiwgMCwgNjQsIDAgfQorICB9OworICAKKyAgYXNzZXJ0KEtpbmQgPD0gMyAmJiAiVW5rbm93biBmaXh1cCBraW5kIik7CisgIHJldHVybiBCdWlsdGluc1tLaW5kXTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ0NvbnRleHQuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DQ29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5NjMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMjQ5IEBACisvLz09PS0gbGliL01DL01DQ29udGV4dC5jcHAgLSBNYWNoaW5lIENvZGUgQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uTWFjaE8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbkVMRi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uQ09GRi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DTGFiZWwuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKwordHlwZWRlZiBTdHJpbmdNYXA8Y29uc3QgTUNTZWN0aW9uTWFjaE8qPiBNYWNoT1VuaXF1ZU1hcFR5OwordHlwZWRlZiBTdHJpbmdNYXA8Y29uc3QgTUNTZWN0aW9uRUxGKj4gRUxGVW5pcXVlTWFwVHk7Cit0eXBlZGVmIFN0cmluZ01hcDxjb25zdCBNQ1NlY3Rpb25DT0ZGKj4gQ09GRlVuaXF1ZU1hcFR5OworCisKK01DQ29udGV4dDo6TUNDb250ZXh0KGNvbnN0IE1DQXNtSW5mbyAmbWFpKSA6IE1BSShtYWkpLCBOZXh0VW5pcXVlSUQoMCkgeworICBNYWNoT1VuaXF1aW5nTWFwID0gMDsKKyAgRUxGVW5pcXVpbmdNYXAgPSAwOworICBDT0ZGVW5pcXVpbmdNYXAgPSAwOworCisgIFNlY3VyZUxvZ0ZpbGUgPSBnZXRlbnYoIkFTX1NFQ1VSRV9MT0dfRklMRSIpOworICBTZWN1cmVMb2cgPSAwOworICBTZWN1cmVMb2dVc2VkID0gZmFsc2U7Cit9CisKK01DQ29udGV4dDo6fk1DQ29udGV4dCgpIHsKKyAgLy8gTk9URTogVGhlIHN5bWJvbHMgYXJlIGFsbCBhbGxvY2F0ZWQgb3V0IG9mIGEgYnVtcCBwb2ludGVyIGFsbG9jYXRvciwKKyAgLy8gd2UgZG9uJ3QgbmVlZCB0byBmcmVlIHRoZW0gaGVyZS4KKyAgCisgIC8vIElmIHdlIGhhdmUgdGhlIE1hY2hPIHVuaXF1aW5nIG1hcCwgZnJlZSBpdC4KKyAgZGVsZXRlIChNYWNoT1VuaXF1ZU1hcFR5KilNYWNoT1VuaXF1aW5nTWFwOworICBkZWxldGUgKEVMRlVuaXF1ZU1hcFR5KilFTEZVbmlxdWluZ01hcDsKKyAgZGVsZXRlIChDT0ZGVW5pcXVlTWFwVHkqKUNPRkZVbmlxdWluZ01hcDsKKworICAvLyBJZiB0aGUgc3RyZWFtIGZvciB0aGUgLnNlY3VyZV9sb2dfdW5pcXVlIGRpcmVjdGl2ZSB3YXMgY3JlYXRlZCBmcmVlIGl0LgorICBkZWxldGUgKHJhd19vc3RyZWFtKilTZWN1cmVMb2c7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTeW1ib2wgTWFuaXB1bGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNQ1N5bWJvbCAqTUNDb250ZXh0OjpHZXRPckNyZWF0ZVN5bWJvbChTdHJpbmdSZWYgTmFtZSkgeworICBhc3NlcnQoIU5hbWUuZW1wdHkoKSAmJiAiTm9ybWFsIHN5bWJvbHMgY2Fubm90IGJlIHVubmFtZWQhIik7CisgIAorICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGFuIGFzc2VtYmxlciB0ZW1wb3Jhcnkgb3Igbm9ybWFsIGxhYmVsLgorICBib29sIGlzVGVtcG9yYXJ5ID0gTmFtZS5zdGFydHN3aXRoKE1BSS5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCkpOworICAKKyAgLy8gRG8gdGhlIGxvb2t1cCBhbmQgZ2V0IHRoZSBlbnRpcmUgU3RyaW5nTWFwRW50cnkuICBXZSB3YW50IGFjY2VzcyB0byB0aGUKKyAgLy8ga2V5IGlmIHdlIGFyZSBjcmVhdGluZyB0aGUgZW50cnkuCisgIFN0cmluZ01hcEVudHJ5PE1DU3ltYm9sKj4gJkVudHJ5ID0gU3ltYm9scy5HZXRPckNyZWF0ZVZhbHVlKE5hbWUpOworICBpZiAoRW50cnkuZ2V0VmFsdWUoKSkgcmV0dXJuIEVudHJ5LmdldFZhbHVlKCk7CisKKyAgLy8gT2ssIHRoZSBlbnRyeSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuICBIYXZlIHRoZSBNQ1N5bWJvbCBvYmplY3QgaXRzZWxmIHJlZmVyCisgIC8vIHRvIHRoZSBjb3B5IG9mIHRoZSBzdHJpbmcgdGhhdCBpcyBlbWJlZGRlZCBpbiB0aGUgU3RyaW5nTWFwRW50cnkuCisgIE1DU3ltYm9sICpSZXN1bHQgPSBuZXcgKCp0aGlzKSBNQ1N5bWJvbChFbnRyeS5nZXRLZXkoKSwgaXNUZW1wb3JhcnkpOworICBFbnRyeS5zZXRWYWx1ZShSZXN1bHQpOworICByZXR1cm4gUmVzdWx0OyAKK30KKworTUNTeW1ib2wgKk1DQ29udGV4dDo6R2V0T3JDcmVhdGVTeW1ib2woY29uc3QgVHdpbmUgJk5hbWUpIHsKKyAgU21hbGxTdHJpbmc8MTI4PiBOYW1lU1Y7CisgIE5hbWUudG9WZWN0b3IoTmFtZVNWKTsKKyAgcmV0dXJuIEdldE9yQ3JlYXRlU3ltYm9sKE5hbWVTVi5zdHIoKSk7Cit9CisKK01DU3ltYm9sICpNQ0NvbnRleHQ6OkNyZWF0ZVRlbXBTeW1ib2woKSB7CisgIHJldHVybiBHZXRPckNyZWF0ZVN5bWJvbChUd2luZShNQUkuZ2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wIiArIFR3aW5lKE5leHRVbmlxdWVJRCsrKSk7Cit9CisKK3Vuc2lnbmVkIE1DQ29udGV4dDo6TmV4dEluc3RhbmNlKGludDY0X3QgTG9jYWxMYWJlbFZhbCkgeworICBNQ0xhYmVsIComTGFiZWwgPSBJbnN0YW5jZXNbTG9jYWxMYWJlbFZhbF07CisgIGlmICghTGFiZWwpCisgICAgTGFiZWwgPSBuZXcgKCp0aGlzKSBNQ0xhYmVsKDApOworICByZXR1cm4gTGFiZWwtPmluY0luc3RhbmNlKCk7Cit9CisKK3Vuc2lnbmVkIE1DQ29udGV4dDo6R2V0SW5zdGFuY2UoaW50NjRfdCBMb2NhbExhYmVsVmFsKSB7CisgIE1DTGFiZWwgKiZMYWJlbCA9IEluc3RhbmNlc1tMb2NhbExhYmVsVmFsXTsKKyAgaWYgKCFMYWJlbCkKKyAgICBMYWJlbCA9IG5ldyAoKnRoaXMpIE1DTGFiZWwoMCk7CisgIHJldHVybiBMYWJlbC0+Z2V0SW5zdGFuY2UoKTsKK30KKworTUNTeW1ib2wgKk1DQ29udGV4dDo6Q3JlYXRlRGlyZWN0aW9uYWxMb2NhbFN5bWJvbChpbnQ2NF90IExvY2FsTGFiZWxWYWwpIHsKKyAgcmV0dXJuIEdldE9yQ3JlYXRlU3ltYm9sKFR3aW5lKE1BSS5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKExvY2FsTGFiZWxWYWwpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoTmV4dEluc3RhbmNlKExvY2FsTGFiZWxWYWwpKSk7Cit9CitNQ1N5bWJvbCAqTUNDb250ZXh0OjpHZXREaXJlY3Rpb25hbExvY2FsU3ltYm9sKGludDY0X3QgTG9jYWxMYWJlbFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJPUmYpIHsKKyAgcmV0dXJuIEdldE9yQ3JlYXRlU3ltYm9sKFR3aW5lKE1BSS5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKExvY2FsTGFiZWxWYWwpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoR2V0SW5zdGFuY2UoTG9jYWxMYWJlbFZhbCkgKyBiT1JmKSk7Cit9CisKK01DU3ltYm9sICpNQ0NvbnRleHQ6Okxvb2t1cFN5bWJvbChTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICByZXR1cm4gU3ltYm9scy5sb29rdXAoTmFtZSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWN0aW9uIE1hbmFnZW1lbnQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NvbnN0IE1DU2VjdGlvbk1hY2hPICpNQ0NvbnRleHQ6OgorZ2V0TWFjaE9TZWN0aW9uKFN0cmluZ1JlZiBTZWdtZW50LCBTdHJpbmdSZWYgU2VjdGlvbiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBUeXBlQW5kQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZDIsIFNlY3Rpb25LaW5kIEtpbmQpIHsKKyAgCisgIC8vIFdlIHVuaXF1ZSBzZWN0aW9ucyBieSB0aGVpciBzZWdtZW50L3NlY3Rpb24gcGFpci4gIFRoZSByZXR1cm5lZCBzZWN0aW9uCisgIC8vIG1heSBub3QgaGF2ZSB0aGUgc2FtZSBmbGFncyBhcyB0aGUgcmVxdWVzdGVkIHNlY3Rpb24sIGlmIHNvIHRoaXMgc2hvdWxkIGJlCisgIC8vIGRpYWdub3NlZCBieSB0aGUgY2xpZW50IGFzIGFuIGVycm9yLgorICAKKyAgLy8gQ3JlYXRlIHRoZSBtYXAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgorICBpZiAoTWFjaE9VbmlxdWluZ01hcCA9PSAwKQorICAgIE1hY2hPVW5pcXVpbmdNYXAgPSBuZXcgTWFjaE9VbmlxdWVNYXBUeSgpOworICBNYWNoT1VuaXF1ZU1hcFR5ICZNYXAgPSAqKE1hY2hPVW5pcXVlTWFwVHkqKU1hY2hPVW5pcXVpbmdNYXA7CisgIAorICAvLyBGb3JtIHRoZSBuYW1lIHRvIGxvb2sgdXAuCisgIFNtYWxsU3RyaW5nPDY0PiBOYW1lOworICBOYW1lICs9IFNlZ21lbnQ7CisgIE5hbWUucHVzaF9iYWNrKCcsJyk7CisgIE5hbWUgKz0gU2VjdGlvbjsKKyAgCisgIC8vIERvIHRoZSBsb29rdXAsIGlmIHdlIGhhdmUgYSBoaXQsIHJldHVybiBpdC4KKyAgY29uc3QgTUNTZWN0aW9uTWFjaE8gKiZFbnRyeSA9IE1hcFtOYW1lLnN0cigpXTsKKyAgaWYgKEVudHJ5KSByZXR1cm4gRW50cnk7CisgIAorICAvLyBPdGhlcndpc2UsIHJldHVybiBhIG5ldyBzZWN0aW9uLgorICByZXR1cm4gRW50cnkgPSBuZXcgKCp0aGlzKSBNQ1NlY3Rpb25NYWNoTyhTZWdtZW50LCBTZWN0aW9uLCBUeXBlQW5kQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyLCBLaW5kKTsKK30KKworCitjb25zdCBNQ1NlY3Rpb24gKk1DQ29udGV4dDo6CitnZXRFTEZTZWN0aW9uKFN0cmluZ1JlZiBTZWN0aW9uLCB1bnNpZ25lZCBUeXBlLCB1bnNpZ25lZCBGbGFncywKKyAgICAgICAgICAgICAgU2VjdGlvbktpbmQgS2luZCwgYm9vbCBJc0V4cGxpY2l0KSB7CisgIGlmIChFTEZVbmlxdWluZ01hcCA9PSAwKQorICAgIEVMRlVuaXF1aW5nTWFwID0gbmV3IEVMRlVuaXF1ZU1hcFR5KCk7CisgIEVMRlVuaXF1ZU1hcFR5ICZNYXAgPSAqKEVMRlVuaXF1ZU1hcFR5KilFTEZVbmlxdWluZ01hcDsKKyAgCisgIC8vIERvIHRoZSBsb29rdXAsIGlmIHdlIGhhdmUgYSBoaXQsIHJldHVybiBpdC4KKyAgU3RyaW5nTWFwRW50cnk8Y29uc3QgTUNTZWN0aW9uRUxGKj4gJkVudHJ5ID0gTWFwLkdldE9yQ3JlYXRlVmFsdWUoU2VjdGlvbik7CisgIGlmIChFbnRyeS5nZXRWYWx1ZSgpKSByZXR1cm4gRW50cnkuZ2V0VmFsdWUoKTsKKyAgCisgIE1DU2VjdGlvbkVMRiAqUmVzdWx0ID0gbmV3ICgqdGhpcykgTUNTZWN0aW9uRUxGKEVudHJ5LmdldEtleSgpLCBUeXBlLCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2luZCwgSXNFeHBsaWNpdCk7CisgIEVudHJ5LnNldFZhbHVlKFJlc3VsdCk7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK2NvbnN0IE1DU2VjdGlvbiAqTUNDb250ZXh0OjpnZXRDT0ZGU2VjdGlvbihTdHJpbmdSZWYgU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDaGFyYWN0ZXJpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kKSB7CisgIGlmIChDT0ZGVW5pcXVpbmdNYXAgPT0gMCkKKyAgICBDT0ZGVW5pcXVpbmdNYXAgPSBuZXcgQ09GRlVuaXF1ZU1hcFR5KCk7CisgIENPRkZVbmlxdWVNYXBUeSAmTWFwID0gKihDT0ZGVW5pcXVlTWFwVHkqKUNPRkZVbmlxdWluZ01hcDsKKyAgCisgIC8vIERvIHRoZSBsb29rdXAsIGlmIHdlIGhhdmUgYSBoaXQsIHJldHVybiBpdC4KKyAgU3RyaW5nTWFwRW50cnk8Y29uc3QgTUNTZWN0aW9uQ09GRio+ICZFbnRyeSA9IE1hcC5HZXRPckNyZWF0ZVZhbHVlKFNlY3Rpb24pOworICBpZiAoRW50cnkuZ2V0VmFsdWUoKSkgcmV0dXJuIEVudHJ5LmdldFZhbHVlKCk7CisgIAorICBNQ1NlY3Rpb25DT0ZGICpSZXN1bHQgPSBuZXcgKCp0aGlzKSBNQ1NlY3Rpb25DT0ZGKEVudHJ5LmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlcmlzdGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24sIEtpbmQpOworICAKKyAgRW50cnkuc2V0VmFsdWUoUmVzdWx0KTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIER3YXJmIE1hbmFnZW1lbnQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBHZXREd2FyZkZpbGUgLSB0YWtlcyBhIGZpbGUgbmFtZSBhbiBudW1iZXIgdG8gcGxhY2UgaW4gdGhlIGR3YXJmIGZpbGUgYW5kCisvLy8gZGlyZWN0b3J5IHRhYmxlcy4gIElmIHRoZSBmaWxlIG51bWJlciBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBpdCBpcyBhbgorLy8vIGVycm9yIGFuZCB6ZXJvIGlzIHJldHVybmVkIGFuZCB0aGUgY2xpZW50IHJlcG9ydHMgdGhlIGVycm9yLCBlbHNlIHRoZQorLy8vIGFsbG9jYXRlZCBmaWxlIG51bWJlciBpcyByZXR1cm5lZC4gIFRoZSBmaWxlIG51bWJlcnMgbWF5IGJlIGluIGFueSBvcmRlci4KK3Vuc2lnbmVkIE1DQ29udGV4dDo6R2V0RHdhcmZGaWxlKFN0cmluZ1JlZiBGaWxlTmFtZSwgdW5zaWduZWQgRmlsZU51bWJlcikgeworICAvLyBUT0RPOiBhIEZpbGVOdW1iZXIgb2YgemVybyBzYXlzIHRvIHVzZSB0aGUgbmV4dCBhdmFpbGFibGUgZmlsZSBudW1iZXIuCisgIC8vIE5vdGU6IGluIEdlbmVyaWNBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlRmlsZSgpIEZpbGVOdW1iZXIgd2FzIGNoZWNrZWQKKyAgLy8gdG8gbm90IGJlIGxlc3MgdGhhbiBvbmUuICBUaGlzIG5lZWRzIHRvIGJlIGNoYW5nZSB0byBiZSBub3QgbGVzcyB0aGFuIHplcm8uCisKKyAgLy8gTWFrZSBzcGFjZSBmb3IgdGhpcyBGaWxlTnVtYmVyIGluIHRoZSBNQ0R3YXJmRmlsZXMgdmVjdG9yIGlmIG5lZWRlZC4KKyAgaWYgKEZpbGVOdW1iZXIgPj0gTUNEd2FyZkZpbGVzLnNpemUoKSkgeworICAgIE1DRHdhcmZGaWxlcy5yZXNpemUoRmlsZU51bWJlciArIDEpOworICB9IGVsc2UgeworICAgIE1DRHdhcmZGaWxlIComRXhpc3RpbmdGaWxlID0gTUNEd2FyZkZpbGVzW0ZpbGVOdW1iZXJdOworICAgIGlmIChFeGlzdGluZ0ZpbGUpCisgICAgICAvLyBJdCBpcyBhbiBlcnJvciB0byB1c2Ugc2VlIHRoZSBzYW1lIG51bWJlciBtb3JlIHRoYW4gb25jZS4KKyAgICAgIHJldHVybiAwOworICB9CisKKyAgLy8gR2V0IHRoZSBuZXcgTUNEd2FyZkZpbGUgc2xvdCBmb3IgdGhpcyBGaWxlTnVtYmVyLgorICBNQ0R3YXJmRmlsZSAqJkZpbGUgPSBNQ0R3YXJmRmlsZXNbRmlsZU51bWJlcl07CisKKyAgLy8gU2VwYXJhdGUgdGhlIGRpcmVjdG9yeSBwYXJ0IGZyb20gdGhlIGJhc2VuYW1lIG9mIHRoZSBGaWxlTmFtZS4KKyAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBTbGFzaCA9IEZpbGVOYW1lLnJzcGxpdCgnLycpOworCisgIC8vIEZpbmQgb3IgbWFrZSBhIGVudHJ5IGluIHRoZSBNQ0R3YXJmRGlycyB2ZWN0b3IgZm9yIHRoaXMgRGlyZWN0b3J5LgorICBTdHJpbmdSZWYgTmFtZTsKKyAgdW5zaWduZWQgRGlySW5kZXg7CisgIC8vIENhcHR1cmUgZGlyZWN0b3J5IG5hbWUuCisgIGlmIChTbGFzaC5zZWNvbmQuZW1wdHkoKSkgeworICAgIE5hbWUgPSBTbGFzaC5maXJzdDsKKyAgICBEaXJJbmRleCA9IDA7IC8vIEZvciBGaWxlTmFtZXMgd2l0aCBubyBkaXJlY3RvcmllcyBhIERpckluZGV4IG9mIDAgaXMgdXNlZC4KKyAgfSBlbHNlIHsKKyAgICBTdHJpbmdSZWYgRGlyZWN0b3J5ID0gU2xhc2guZmlyc3Q7CisgICAgTmFtZSA9IFNsYXNoLnNlY29uZDsKKyAgICBmb3IgKERpckluZGV4ID0gMDsgRGlySW5kZXggPCBNQ0R3YXJmRGlycy5zaXplKCk7IERpckluZGV4KyspIHsKKyAgICAgIGlmIChEaXJlY3RvcnkgPT0gTUNEd2FyZkRpcnNbRGlySW5kZXhdKQorCWJyZWFrOworICAgIH0KKyAgICBpZiAoRGlySW5kZXggPj0gTUNEd2FyZkRpcnMuc2l6ZSgpKSB7CisgICAgICBjaGFyICpCdWYgPSBzdGF0aWNfY2FzdDxjaGFyICo+KEFsbG9jYXRlKERpcmVjdG9yeS5zaXplKCkpKTsKKyAgICAgIG1lbWNweShCdWYsIERpcmVjdG9yeS5kYXRhKCksIERpcmVjdG9yeS5zaXplKCkpOworICAgICAgTUNEd2FyZkRpcnMucHVzaF9iYWNrKFN0cmluZ1JlZihCdWYsIERpcmVjdG9yeS5zaXplKCkpKTsKKyAgICB9CisgICAgLy8gVGhlIERpckluZGV4IGlzIG9uZSBiYXNlZCwgYXMgRGlySW5kZXggb2YgMCBpcyB1c2VkIGZvciBGaWxlTmFtZXMgd2l0aAorICAgIC8vIG5vIGRpcmVjdG9yaWVzLiAgTUNEd2FyZkRpcnNbXSBpcyB1bmxpa2UgTUNEd2FyZkZpbGVzW10gaW4gdGhhdCB0aGUKKyAgICAvLyBkaXJlY3RvcnkgbmFtZXMgYXJlIHN0b3JlZCBhdCBNQ0R3YXJmRGlyc1tEaXJJbmRleC0xXSB3aGVyZSBGaWxlTmFtZXMgYXJlCisgICAgLy8gc3RvcmVkIGF0IE1DRHdhcmZGaWxlc1tGaWxlTnVtYmVyXS5OYW1lIC4KKyAgICBEaXJJbmRleCsrOworICB9CisgIAorICAvLyBOb3cgbWFrZSB0aGUgTUNEd2FyZkZpbGUgZW50cnkgYW5kIHBsYWNlIGl0IGluIHRoZSBzbG90IGluIHRoZSBNQ0R3YXJmRmlsZXMKKyAgLy8gdmVjdG9yLgorICBjaGFyICpCdWYgPSBzdGF0aWNfY2FzdDxjaGFyICo+KEFsbG9jYXRlKE5hbWUuc2l6ZSgpKSk7CisgIG1lbWNweShCdWYsIE5hbWUuZGF0YSgpLCBOYW1lLnNpemUoKSk7CisgIEZpbGUgPSBuZXcgKCp0aGlzKSBNQ0R3YXJmRmlsZShTdHJpbmdSZWYoQnVmLCBOYW1lLnNpemUoKSksIERpckluZGV4KTsKKworICAvLyByZXR1cm4gdGhlIGFsbG9jYXRlZCBGaWxlTnVtYmVyLgorICByZXR1cm4gRmlsZU51bWJlcjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmE3YjcwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DRGlzYXNzZW1ibGVyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAorCithZGRfbGx2bV9saWJyYXJ5KExMVk1NQ0Rpc2Fzc2VtYmxlcgorICBFRERpc2Fzc2VtYmxlci5jcHAKKyAgRURPcGVyYW5kLmNwcAorICBFREluc3QuY3BwCisgIEVEVG9rZW4uY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FRERpc2Fzc2VtYmxlci5jcHAgYi9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRUREaXNhc3NlbWJsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5N2IzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRUREaXNhc3NlbWJsZXIuY3BwCkBAIC0wLDAgKzEsNDAyIEBACisvLz09PS1FRERpc2Fzc2VtYmxlci5jcHAgLSBMTFZNIEVuaGFuY2VkIERpc2Fzc2VtYmxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgRW5oYW5jZWQgRGlzYXNzZW1ibHkgbGlicmFyeSdzICBkaXNhc3NlbWJsZXIgY2xhc3MuCisvLyBUaGUgZGlzYXNzZW1ibGVyIGlzIHJlc3BvbnNpYmxlIGZvciB2ZW5kaW5nIGluZGl2aWR1YWwgaW5zdHJ1Y3Rpb25zIGFjY29yZGluZworLy8gdG8gYSBnaXZlbiBhcmNoaXRlY3R1cmUgYW5kIGRpc2Fzc2VtYmx5IHN5bnRheC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiRUREaXNhc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJFREluc3QuaCIKKyNpbmNsdWRlICJsbHZtL01DL0VESW5zdEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdFByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3RyZWFtZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL0FzbUxleGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNQYXJzZWRBc21PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlPYmplY3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRBc21QYXJzZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTZWxlY3QuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitib29sIEVERGlzYXNzZW1ibGVyOjpzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKK0VERGlzYXNzZW1ibGVyOjpEaXNhc3NlbWJsZXJNYXBfdCBFRERpc2Fzc2VtYmxlcjo6c0Rpc2Fzc2VtYmxlcnM7CisKK3N0cnVjdCBUcmlwbGVNYXAgeworICBUcmlwbGU6OkFyY2hUeXBlIEFyY2g7CisgIGNvbnN0IGNoYXIgKlN0cmluZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgVHJpcGxlTWFwIHRyaXBsZW1hcFtdID0geworICB7IFRyaXBsZTo6eDg2LCAgICAgICAgICAiaTM4Ni11bmtub3duLXVua25vd24iICAgIH0sCisgIHsgVHJpcGxlOjp4ODZfNjQsICAgICAgICJ4ODZfNjQtdW5rbm93bi11bmtub3duIiAgfSwKKyAgeyBUcmlwbGU6OmFybSwgICAgICAgICAgImFybS11bmtub3duLXVua25vd24iICAgICB9LAorICB7IFRyaXBsZTo6dGh1bWIsICAgICAgICAidGh1bWItdW5rbm93bi11bmtub3duIiAgIH0sCisgIHsgVHJpcGxlOjpJbnZhbGlkQXJjaCwgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgfQorfTsKKworLy8vIGluZm9Gcm9tQXJjaCAtIFJldHVybnMgdGhlIFRyaXBsZU1hcCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gYXJjaGl0ZWN0dXJlLAorLy8vICAgb3IgTlVMTCBpZiB0aGVyZSBpcyBhbiBlcnJvcgorLy8vCisvLy8gQGFyZyBhcmNoIC0gVGhlIFRyaXBsZTo6QXJjaFR5cGUgZm9yIHRoZSBkZXNpcmVkIGFyY2hpdGVjdHVyZQorc3RhdGljIGNvbnN0IGNoYXIgKnRyaXBsZUZyb21BcmNoKFRyaXBsZTo6QXJjaFR5cGUgYXJjaCkgeworICB1bnNpZ25lZCBpbnQgaW5mb0luZGV4OworICAKKyAgZm9yIChpbmZvSW5kZXggPSAwOyB0cmlwbGVtYXBbaW5mb0luZGV4XS5TdHJpbmcgIT0gTlVMTDsgKytpbmZvSW5kZXgpIHsKKyAgICBpZiAoYXJjaCA9PSB0cmlwbGVtYXBbaW5mb0luZGV4XS5BcmNoKQorICAgICAgcmV0dXJuIHRyaXBsZW1hcFtpbmZvSW5kZXhdLlN0cmluZzsKKyAgfQorICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vLyBnZXRMTFZNU3ludGF4VmFyaWFudCAtIGdldHMgdGhlIGNvbnN0YW50IHRvIHVzZSB0byBnZXQgYW4gYXNzZW1ibHkgcHJpbnRlcgorLy8vICAgZm9yIHRoZSBkZXNpcmVkIGFzc2VtYmx5IHN5bnRheCwgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gCisvLy8gICBUYXJnZXQ6OmNyZWF0ZU1DSW5zdFByaW50ZXIoKQorLy8vCisvLy8gQGFyZyBhcmNoICAgLSBUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQorLy8vIEBhcmcgc3ludGF4IC0gVGhlIGFzc2VtYmx5IHN5bnRheCBpbiBzZCBmb3JtCitzdGF0aWMgaW50IGdldExMVk1TeW50YXhWYXJpYW50KFRyaXBsZTo6QXJjaFR5cGUgYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUREaXNhc3NlbWJsZXI6OkFzc2VtYmx5U3ludGF4IHN5bnRheCkgeworICBzd2l0Y2ggKHN5bnRheCkgeworICBkZWZhdWx0OgorICAgIHJldHVybiAtMTsKKyAgLy8gTWFwcGluZ3MgYmVsb3cgZnJvbSBYODZBc21QcmludGVyLmNwcAorICBjYXNlIEVERGlzYXNzZW1ibGVyOjprRURBc3NlbWJseVN5bnRheFg4NkFUVDoKKyAgICBpZiAoYXJjaCA9PSBUcmlwbGU6Ong4NiB8fCBhcmNoID09IFRyaXBsZTo6eDg2XzY0KQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIC0xOworICBjYXNlIEVERGlzYXNzZW1ibGVyOjprRURBc3NlbWJseVN5bnRheFg4NkludGVsOgorICAgIGlmIChhcmNoID09IFRyaXBsZTo6eDg2IHx8IGFyY2ggPT0gVHJpcGxlOjp4ODZfNjQpCisgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gLTE7CisgIGNhc2UgRUREaXNhc3NlbWJsZXI6OmtFREFzc2VtYmx5U3ludGF4QVJNVUFMOgorICAgIGlmIChhcmNoID09IFRyaXBsZTo6YXJtIHx8IGFyY2ggPT0gVHJpcGxlOjp0aHVtYikKKyAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgIHJldHVybiAtMTsKKyAgfQorfQorCit2b2lkIEVERGlzYXNzZW1ibGVyOjppbml0aWFsaXplKCkgeworICBpZiAoc0luaXRpYWxpemVkKQorICAgIHJldHVybjsKKyAgCisgIHNJbml0aWFsaXplZCA9IHRydWU7CisgIAorICBJbml0aWFsaXplQWxsVGFyZ2V0SW5mb3MoKTsKKyAgSW5pdGlhbGl6ZUFsbFRhcmdldHMoKTsKKyAgSW5pdGlhbGl6ZUFsbEFzbVByaW50ZXJzKCk7CisgIEluaXRpYWxpemVBbGxBc21QYXJzZXJzKCk7CisgIEluaXRpYWxpemVBbGxEaXNhc3NlbWJsZXJzKCk7Cit9CisKKyN1bmRlZiBCUklOR1VQX1RBUkdFVAorCitFRERpc2Fzc2VtYmxlciAqRUREaXNhc3NlbWJsZXI6OmdldERpc2Fzc2VtYmxlcihUcmlwbGU6OkFyY2hUeXBlIGFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlbWJseVN5bnRheCBzeW50YXgpIHsKKyAgQ1BVS2V5IGtleTsKKyAga2V5LkFyY2ggPSBhcmNoOworICBrZXkuU3ludGF4ID0gc3ludGF4OworICAKKyAgRUREaXNhc3NlbWJsZXI6OkRpc2Fzc2VtYmxlck1hcF90OjppdGVyYXRvciBpID0gc0Rpc2Fzc2VtYmxlcnMuZmluZChrZXkpOworICAKKyAgaWYgKGkgIT0gc0Rpc2Fzc2VtYmxlcnMuZW5kKCkpIHsKKyAgICByZXR1cm4gaS0+c2Vjb25kOworICB9IGVsc2UgeworICAgIEVERGlzYXNzZW1ibGVyKiBzZGQgPSBuZXcgRUREaXNhc3NlbWJsZXIoa2V5KTsKKyAgICBpZiAoIXNkZC0+dmFsaWQoKSkgeworICAgICAgZGVsZXRlIHNkZDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAKKyAgICBzRGlzYXNzZW1ibGVyc1trZXldID0gc2RkOworICAgIAorICAgIHJldHVybiBzZGQ7CisgIH0KKyAgCisgIHJldHVybiBOVUxMOworfQorCitFRERpc2Fzc2VtYmxlciAqRUREaXNhc3NlbWJsZXI6OmdldERpc2Fzc2VtYmxlcihTdHJpbmdSZWYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHlTeW50YXggc3ludGF4KSB7CisgIHJldHVybiBnZXREaXNhc3NlbWJsZXIoVHJpcGxlKHN0cikuZ2V0QXJjaCgpLCBzeW50YXgpOworfQorCitFRERpc2Fzc2VtYmxlcjo6RUREaXNhc3NlbWJsZXIoQ1BVS2V5ICZrZXkpIDogCisgIFZhbGlkKGZhbHNlKSwgCisgIEhhc1NlbWFudGljcyhmYWxzZSksIAorICBFcnJvclN0cmVhbShudWxscygpKSwgCisgIEtleShrZXkpIHsKKyAgY29uc3QgY2hhciAqdHJpcGxlID0gdHJpcGxlRnJvbUFyY2goa2V5LkFyY2gpOworICAgIAorICBpZiAoIXRyaXBsZSkKKyAgICByZXR1cm47CisgIAorICBMTFZNU3ludGF4VmFyaWFudCA9IGdldExMVk1TeW50YXhWYXJpYW50KGtleS5BcmNoLCBrZXkuU3ludGF4KTsKKyAgCisgIGlmIChMTFZNU3ludGF4VmFyaWFudCA8IDApCisgICAgcmV0dXJuOworICAKKyAgc3RkOjpzdHJpbmcgdHJpcGxlU3RyaW5nKHRyaXBsZSk7CisgIHN0ZDo6c3RyaW5nIGVycm9yU3RyaW5nOworICAKKyAgVGd0ID0gVGFyZ2V0UmVnaXN0cnk6Omxvb2t1cFRhcmdldCh0cmlwbGVTdHJpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RyaW5nKTsKKyAgCisgIGlmICghVGd0KQorICAgIHJldHVybjsKKyAgCisgIHN0ZDo6c3RyaW5nIGZlYXR1cmVTdHJpbmc7CisgIAorICBUYXJnZXRNYWNoaW5lLnJlc2V0KFRndC0+Y3JlYXRlVGFyZ2V0TWFjaGluZSh0cmlwbGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdHJpbmcpKTsKKyAgCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqcmVnaXN0ZXJJbmZvID0gVGFyZ2V0TWFjaGluZS0+Z2V0UmVnaXN0ZXJJbmZvKCk7CisgIAorICBpZiAoIXJlZ2lzdGVySW5mbykKKyAgICByZXR1cm47CisgICAgCisgIGluaXRNYXBzKCpyZWdpc3RlckluZm8pOworICAKKyAgQXNtSW5mby5yZXNldChUZ3QtPmNyZWF0ZUFzbUluZm8odHJpcGxlU3RyaW5nKSk7CisgIAorICBpZiAoIUFzbUluZm8pCisgICAgcmV0dXJuOworICAKKyAgRGlzYXNzZW1ibGVyLnJlc2V0KFRndC0+Y3JlYXRlTUNEaXNhc3NlbWJsZXIoKSk7CisgIAorICBpZiAoIURpc2Fzc2VtYmxlcikKKyAgICByZXR1cm47CisgICAgCisgIEluc3RJbmZvcyA9IERpc2Fzc2VtYmxlci0+Z2V0RURJbmZvKCk7CisgIAorICBJbnN0U3RyaW5nLnJlc2V0KG5ldyBzdGQ6OnN0cmluZyk7CisgIEluc3RTdHJlYW0ucmVzZXQobmV3IHJhd19zdHJpbmdfb3N0cmVhbSgqSW5zdFN0cmluZykpOworICBJbnN0UHJpbnRlci5yZXNldChUZ3QtPmNyZWF0ZU1DSW5zdFByaW50ZXIoTExWTVN5bnRheFZhcmlhbnQsICpBc21JbmZvKSk7CisgIAorICBpZiAoIUluc3RQcmludGVyKQorICAgIHJldHVybjsKKyAgICAKKyAgR2VuZXJpY0FzbUxleGVyLnJlc2V0KG5ldyBBc21MZXhlcigqQXNtSW5mbykpOworICBTcGVjaWZpY0FzbUxleGVyLnJlc2V0KFRndC0+Y3JlYXRlQXNtTGV4ZXIoKkFzbUluZm8pKTsKKyAgU3BlY2lmaWNBc21MZXhlci0+SW5zdGFsbExleGVyKCpHZW5lcmljQXNtTGV4ZXIpOworICAKKyAgaW5pdE1hcHMoKlRhcmdldE1hY2hpbmUtPmdldFJlZ2lzdGVySW5mbygpKTsKKyAgICAKKyAgVmFsaWQgPSB0cnVlOworfQorCitFRERpc2Fzc2VtYmxlcjo6fkVERGlzYXNzZW1ibGVyKCkgeworICBpZiAoIXZhbGlkKCkpCisgICAgcmV0dXJuOworfQorCituYW1lc3BhY2UgeworICAvLy8gRURNZW1vcnlPYmplY3QgLSBhIHN1YmNsYXNzIG9mIE1lbW9yeU9iamVjdCB0aGF0IGFsbG93cyB1c2Ugb2YgYSBjYWxsYmFjaworICAvLy8gICBhcyBwcm92aWRlZCBieSB0aGUgc2QgaW50ZXJmYWNlLiAgU2VlIE1lbW9yeU9iamVjdC4KKyAgY2xhc3MgRURNZW1vcnlPYmplY3QgOiBwdWJsaWMgbGx2bTo6TWVtb3J5T2JqZWN0IHsKKyAgcHJpdmF0ZToKKyAgICBFREJ5dGVSZWFkZXJDYWxsYmFjayBDYWxsYmFjazsKKyAgICB2b2lkICpBcmc7CisgIHB1YmxpYzoKKyAgICBFRE1lbW9yeU9iamVjdChFREJ5dGVSZWFkZXJDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpIDogQ2FsbGJhY2soY2FsbGJhY2spLCBBcmcoYXJnKSB7IH0KKyAgICB+RURNZW1vcnlPYmplY3QoKSB7IH0KKyAgICB1aW50NjRfdCBnZXRCYXNlKCkgY29uc3QgeyByZXR1cm4gMHgwOyB9CisgICAgdWludDY0X3QgZ2V0RXh0ZW50KCkgY29uc3QgeyByZXR1cm4gKHVpbnQ2NF90KS0xOyB9CisgICAgaW50IHJlYWRCeXRlKHVpbnQ2NF90IGFkZHJlc3MsIHVpbnQ4X3QgKnB0cikgY29uc3QgeworICAgICAgaWYgKCFDYWxsYmFjaykKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgCisgICAgICBpZiAoQ2FsbGJhY2socHRyLCBhZGRyZXNzLCBBcmcpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICAKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfTsKK30KKworRURJbnN0ICpFRERpc2Fzc2VtYmxlcjo6Y3JlYXRlSW5zdChFREJ5dGVSZWFkZXJDYWxsYmFjayBieXRlUmVhZGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYWRkcmVzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykgeworICBFRE1lbW9yeU9iamVjdCBtZW1vcnlPYmplY3QoYnl0ZVJlYWRlciwgYXJnKTsKKyAgCisgIE1DSW5zdCogaW5zdCA9IG5ldyBNQ0luc3Q7CisgIHVpbnQ2NF90IGJ5dGVTaXplOworICAKKyAgaWYgKCFEaXNhc3NlbWJsZXItPmdldEluc3RydWN0aW9uKCppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdHJlYW0pKSB7CisgICAgZGVsZXRlIGluc3Q7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgY29uc3QgbGx2bTo6RURJbnN0SW5mbyAqdGhpc0luc3RJbmZvOworCisgICAgdGhpc0luc3RJbmZvID0gJkluc3RJbmZvc1tpbnN0LT5nZXRPcGNvZGUoKV07CisgICAgCisgICAgRURJbnN0KiBzZEluc3QgPSBuZXcgRURJbnN0KGluc3QsIGJ5dGVTaXplLCAqdGhpcywgdGhpc0luc3RJbmZvKTsKKyAgICByZXR1cm4gc2RJbnN0OworICB9Cit9CisKK3ZvaWQgRUREaXNhc3NlbWJsZXI6OmluaXRNYXBzKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmcmVnaXN0ZXJJbmZvKSB7CisgIHVuc2lnbmVkIG51bVJlZ2lzdGVycyA9IHJlZ2lzdGVySW5mby5nZXROdW1SZWdzKCk7CisgIHVuc2lnbmVkIHJlZ2lzdGVySW5kZXg7CisgIAorICBmb3IgKHJlZ2lzdGVySW5kZXggPSAwOyByZWdpc3RlckluZGV4IDwgbnVtUmVnaXN0ZXJzOyArK3JlZ2lzdGVySW5kZXgpIHsKKyAgICBjb25zdCBjaGFyKiByZWdpc3Rlck5hbWUgPSByZWdpc3RlckluZm8uZ2V0KHJlZ2lzdGVySW5kZXgpLk5hbWU7CisgICAgCisgICAgUmVnVmVjLnB1c2hfYmFjayhyZWdpc3Rlck5hbWUpOworICAgIFJlZ1JNYXBbcmVnaXN0ZXJOYW1lXSA9IHJlZ2lzdGVySW5kZXg7CisgIH0KKyAgCisgIHN3aXRjaCAoS2V5LkFyY2gpIHsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgY2FzZSBUcmlwbGU6Ong4NjoKKyAgY2FzZSBUcmlwbGU6Ong4Nl82NDoKKyAgICBzdGFja1BvaW50ZXJzLmluc2VydChyZWdpc3RlcklEV2l0aE5hbWUoIlNQIikpOworICAgIHN0YWNrUG9pbnRlcnMuaW5zZXJ0KHJlZ2lzdGVySURXaXRoTmFtZSgiRVNQIikpOworICAgIHN0YWNrUG9pbnRlcnMuaW5zZXJ0KHJlZ2lzdGVySURXaXRoTmFtZSgiUlNQIikpOworICAgIAorICAgIHByb2dyYW1Db3VudGVycy5pbnNlcnQocmVnaXN0ZXJJRFdpdGhOYW1lKCJJUCIpKTsKKyAgICBwcm9ncmFtQ291bnRlcnMuaW5zZXJ0KHJlZ2lzdGVySURXaXRoTmFtZSgiRUlQIikpOworICAgIHByb2dyYW1Db3VudGVycy5pbnNlcnQocmVnaXN0ZXJJRFdpdGhOYW1lKCJSSVAiKSk7CisgICAgYnJlYWs7CisgIGNhc2UgVHJpcGxlOjphcm06CisgIGNhc2UgVHJpcGxlOjp0aHVtYjoKKyAgICBzdGFja1BvaW50ZXJzLmluc2VydChyZWdpc3RlcklEV2l0aE5hbWUoIlNQIikpOworICAgIAorICAgIHByb2dyYW1Db3VudGVycy5pbnNlcnQocmVnaXN0ZXJJRFdpdGhOYW1lKCJQQyIpKTsKKyAgICBicmVhazsgIAorICB9Cit9CisKK2NvbnN0IGNoYXIgKkVERGlzYXNzZW1ibGVyOjpuYW1lV2l0aFJlZ2lzdGVySUQodW5zaWduZWQgcmVnaXN0ZXJJRCkgY29uc3QgeworICBpZiAocmVnaXN0ZXJJRCA+PSBSZWdWZWMuc2l6ZSgpKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuIFJlZ1ZlY1tyZWdpc3RlcklEXS5jX3N0cigpOworfQorCit1bnNpZ25lZCBFRERpc2Fzc2VtYmxlcjo6cmVnaXN0ZXJJRFdpdGhOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKKyAgcmVncm1hcF90Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gUmVnUk1hcC5maW5kKHN0ZDo6c3RyaW5nKG5hbWUpKTsKKyAgaWYgKGl0ZXIgPT0gUmVnUk1hcC5lbmQoKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiAoKml0ZXIpLnNlY29uZDsKK30KKworYm9vbCBFRERpc2Fzc2VtYmxlcjo6cmVnaXN0ZXJJc1N0YWNrUG9pbnRlcih1bnNpZ25lZCByZWdpc3RlcklEKSB7CisgIHJldHVybiAoc3RhY2tQb2ludGVycy5maW5kKHJlZ2lzdGVySUQpICE9IHN0YWNrUG9pbnRlcnMuZW5kKCkpOworfQorCitib29sIEVERGlzYXNzZW1ibGVyOjpyZWdpc3RlcklzUHJvZ3JhbUNvdW50ZXIodW5zaWduZWQgcmVnaXN0ZXJJRCkgeworICByZXR1cm4gKHByb2dyYW1Db3VudGVycy5maW5kKHJlZ2lzdGVySUQpICE9IHByb2dyYW1Db3VudGVycy5lbmQoKSk7Cit9CisKK2ludCBFRERpc2Fzc2VtYmxlcjo6cHJpbnRJbnN0KHN0ZDo6c3RyaW5nICZzdHIsIE1DSW5zdCAmaW5zdCkgeworICBQcmludGVyTXV0ZXguYWNxdWlyZSgpOworICAKKyAgSW5zdFByaW50ZXItPnByaW50SW5zdCgmaW5zdCwgKkluc3RTdHJlYW0pOworICBJbnN0U3RyZWFtLT5mbHVzaCgpOworICBzdHIgPSAqSW5zdFN0cmluZzsKKyAgSW5zdFN0cmluZy0+Y2xlYXIoKTsKKyAgCisgIFByaW50ZXJNdXRleC5yZWxlYXNlKCk7CisgIAorICByZXR1cm4gMDsKK30KKworaW50IEVERGlzYXNzZW1ibGVyOjpwYXJzZUluc3QoU21hbGxWZWN0b3JJbXBsPE1DUGFyc2VkQXNtT3BlcmFuZCo+ICZvcGVyYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxBc21Ub2tlbj4gJnRva2VucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgaW50IHJldCA9IDA7CisgIAorICBzd2l0Y2ggKEtleS5BcmNoKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIC0xOworICBjYXNlIFRyaXBsZTo6eDg2OgorICBjYXNlIFRyaXBsZTo6eDg2XzY0OgorICBjYXNlIFRyaXBsZTo6YXJtOgorICBjYXNlIFRyaXBsZTo6dGh1bWI6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIGNvbnN0IGNoYXIgKmNTdHIgPSBzdHIuY19zdHIoKTsKKyAgTWVtb3J5QnVmZmVyICpidWYgPSBNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlcihjU3RyLCBjU3RyICsgc3RybGVuKGNTdHIpKTsKKyAgCisgIFN0cmluZ1JlZiBpbnN0TmFtZTsKKyAgU01Mb2MgaW5zdExvYzsKKyAgCisgIFNvdXJjZU1nciBzb3VyY2VNZ3I7CisgIHNvdXJjZU1nci5BZGROZXdTb3VyY2VCdWZmZXIoYnVmLCBTTUxvYygpKTsgLy8gb3duZXJzaGlwIG9mIGJ1ZiBoYW5kZWQgb3ZlcgorICBNQ0NvbnRleHQgY29udGV4dCgqQXNtSW5mbyk7CisgIE93bmluZ1B0cjxNQ1N0cmVhbWVyPiBzdHJlYW1lcihjcmVhdGVOdWxsU3RyZWFtZXIoY29udGV4dCkpOworICBPd25pbmdQdHI8TUNBc21QYXJzZXI+IGdlbmVyaWNQYXJzZXIoY3JlYXRlTUNBc21QYXJzZXIoKlRndCwgc291cmNlTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgKnN0cmVhbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkFzbUluZm8pKTsKKyAgT3duaW5nUHRyPFRhcmdldEFzbVBhcnNlcj4gVGFyZ2V0UGFyc2VyKFRndC0+Y3JlYXRlQXNtUGFyc2VyKCpnZW5lcmljUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlRhcmdldE1hY2hpbmUpKTsKKyAgCisgIEFzbVRva2VuIE9wY29kZVRva2VuID0gZ2VuZXJpY1BhcnNlci0+TGV4KCk7CisgIEFzbVRva2VuIE5leHRUb2tlbiA9IGdlbmVyaWNQYXJzZXItPkxleCgpOyAgLy8gY29uc3VtZSBuZXh0IHRva2VuLCBiZWNhdXNlIHNwZWNpZmljUGFyc2VyIGV4cGVjdHMgdXMgdG8KKyAgICAKKyAgaWYgKE9wY29kZVRva2VuLmlzKEFzbVRva2VuOjpJZGVudGlmaWVyKSkgeworICAgIGluc3ROYW1lID0gT3Bjb2RlVG9rZW4uZ2V0U3RyaW5nKCk7CisgICAgaW5zdExvYyA9IE9wY29kZVRva2VuLmdldExvYygpOworICAgIAorICAgIGlmIChOZXh0VG9rZW4uaXNOb3QoQXNtVG9rZW46OkVvZikgJiYKKyAgICAgICAgVGFyZ2V0UGFyc2VyLT5QYXJzZUluc3RydWN0aW9uKGluc3ROYW1lLCBpbnN0TG9jLCBvcGVyYW5kcykpCisgICAgICByZXQgPSAtMTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSAtMTsKKyAgfQorICAKKyAgUGFyc2VyTXV0ZXguYWNxdWlyZSgpOworICAKKyAgaWYgKCFyZXQpIHsKKyAgICBHZW5lcmljQXNtTGV4ZXItPnNldEJ1ZmZlcihidWYpOworICAKKyAgICB3aGlsZSAoU3BlY2lmaWNBc21MZXhlci0+TGV4KCksCisgICAgICAgICAgIFNwZWNpZmljQXNtTGV4ZXItPmlzTm90KEFzbVRva2VuOjpFb2YpICYmCisgICAgICAgICAgIFNwZWNpZmljQXNtTGV4ZXItPmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpIHsKKyAgICAgIGlmIChTcGVjaWZpY0FzbUxleGVyLT5pcyhBc21Ub2tlbjo6RXJyb3IpKSB7CisgICAgICAgIHJldCA9IC0xOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRva2Vucy5wdXNoX2JhY2soU3BlY2lmaWNBc21MZXhlci0+Z2V0VG9rKCkpOworICAgIH0KKyAgfQorCisgIFBhcnNlck11dGV4LnJlbGVhc2UoKTsKKyAgCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFRERpc2Fzc2VtYmxlcjo6bGx2bVN5bnRheFZhcmlhbnQoKSBjb25zdCB7CisgIHJldHVybiBMTFZNU3ludGF4VmFyaWFudDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FRERpc2Fzc2VtYmxlci5oIGIvc3JjL0xMVk0vbGliL01DL01DRGlzYXNzZW1ibGVyL0VERGlzYXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmODUwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FRERpc2Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsMjcxIEBACisvLz09PS0tIEVERGlzYXNzZW1ibGVyLmggLSBMTFZNIEVuaGFuY2VkIERpc2Fzc2VtYmxlciAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgRW5oYW5jZWQgRGlzYXNzZW1ibHkgbGlicmFyeSdzCisvLyBkaXNhc3NlbWJsZXIgY2xhc3MuICBUaGUgZGlzYXNzZW1ibGVyIGlzIHJlc3BvbnNpYmxlIGZvciB2ZW5kaW5nIGluZGl2aWR1YWwKKy8vIGluc3RydWN0aW9ucyBhY2NvcmRpbmcgdG8gYSBnaXZlbiBhcmNoaXRlY3R1cmUgYW5kIGRpc2Fzc2VtYmx5IHN5bnRheC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRURESVNBU1NFTUJMRVJfSAorI2RlZmluZSBMTFZNX0VERElTQVNTRU1CTEVSX0gKKworI2luY2x1ZGUgIkVESW5mby5oIgorCisjaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTXV0ZXguaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBBc21MZXhlcjsKK2NsYXNzIEFzbVRva2VuOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgTUNBc21MZXhlcjsKK2NsYXNzIEFzbVBhcnNlcjsKK2NsYXNzIFRhcmdldEFzbUxleGVyOworY2xhc3MgVGFyZ2V0QXNtUGFyc2VyOworY2xhc3MgTUNEaXNhc3NlbWJsZXI7CitjbGFzcyBNQ0luc3RQcmludGVyOworY2xhc3MgTUNJbnN0OworY2xhc3MgTUNQYXJzZWRBc21PcGVyYW5kOworY2xhc3MgTUNTdHJlYW1lcjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CitjbGFzcyBTb3VyY2VNZ3I7CitjbGFzcyBUYXJnZXQ7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCitzdHJ1Y3QgRURJbnN0SW5mbzsKK3N0cnVjdCBFREluc3Q7CitzdHJ1Y3QgRURPcGVyYW5kOworc3RydWN0IEVEVG9rZW47CisKK3R5cGVkZWYgaW50ICgqRURCeXRlUmVhZGVyQ2FsbGJhY2spKHVpbnQ4X3QgKmJ5dGUsIHVpbnQ2NF90IGFkZHJlc3MsIHZvaWQgKmFyZyk7CisKKy8vLyBFRERpc2Fzc2VtYmxlciAtIEVuY2Fwc3VsYXRlcyBhIGRpc2Fzc2VtYmxlciBmb3IgYSBzaW5nbGUgYXJjaGl0ZWN0dXJlIGFuZAorLy8vICAgZGlzYXNzZW1ibHkgc3ludGF4LiAgQWxzbyBtYW5hZ2VzIHRoZSBzdGF0aWMgZGlzYXNzZW1ibGVyIHJlZ2lzdHJ5Lgorc3RydWN0IEVERGlzYXNzZW1ibGVyIHsKKyAgdHlwZWRlZiBlbnVtIHsKKyAgICAvKiEgQGNvbnN0YW50IGtFREFzc2VtYmx5U3ludGF4WDg2SW50ZWwgSW50ZWwgc3ludGF4IGZvciBpMzg2IGFuZCB4ODZfNjQuICovCisgICAga0VEQXNzZW1ibHlTeW50YXhYODZJbnRlbCAgPSAwLAorICAgIC8qISBAY29uc3RhbnQga0VEQXNzZW1ibHlTeW50YXhYODZBVFQgQVQmVCBzeW50YXggZm9yIGkzODYgYW5kIHg4Nl82NC4gKi8KKyAgICBrRURBc3NlbWJseVN5bnRheFg4NkFUVCAgICA9IDEsCisgICAga0VEQXNzZW1ibHlTeW50YXhBUk1VQUwgICAgPSAyCisgIH0gQXNzZW1ibHlTeW50YXg7CisgIAorICAKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gU3RhdGljIG1lbWJlcnMgLy8KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgCisgIC8vLyBDUFVLZXkgLSBFbmNhcHN1bGF0ZXMgdGhlIGRlc2NyaXB0b3Igb2YgYW4gYXJjaGl0ZWN0dXJlL2Rpc2Fzc2VtYmx5LXN5bnRheAorICAvLy8gICBwYWlyCisgIHN0cnVjdCBDUFVLZXkgeworICAgIC8vLyBUaGUgYXJjaGl0ZWN0dXJlIHR5cGUKKyAgICBsbHZtOjpUcmlwbGU6OkFyY2hUeXBlIEFyY2g7CisgICAgCisgICAgLy8vIFRoZSBhc3NlbWJseSBzeW50YXgKKyAgICBBc3NlbWJseVN5bnRheCBTeW50YXg7CisgICAgCisgICAgLy8vIG9wZXJhdG9yPT0gLSBFcXVhbGl0eSBvcGVyYXRvcgorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDUFVLZXkgJmtleSkgY29uc3QgeworICAgICAgcmV0dXJuIChBcmNoID09IGtleS5BcmNoICYmCisgICAgICAgICAgICAgIFN5bnRheCA9PSBrZXkuU3ludGF4KTsKKyAgICB9CisgICAgCisgICAgLy8vIG9wZXJhdG9yPCAtIExlc3MtdGhhbiBvcGVyYXRvcgorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENQVUtleSAma2V5KSBjb25zdCB7CisgICAgICBpZihBcmNoID4ga2V5LkFyY2gpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmKFN5bnRheCA+PSBrZXkuU3ludGF4KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH07CisgIAorICB0eXBlZGVmIHN0ZDo6bWFwPENQVUtleSwgRUREaXNhc3NlbWJsZXIqPiBEaXNhc3NlbWJsZXJNYXBfdDsKKyAgCisgIC8vLyBUcnVlIGlmIHRoZSBkaXNhc3NlbWJsZXIgcmVnaXN0cnkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQ7IGZhbHNlIGlmIG5vdAorICBzdGF0aWMgYm9vbCBzSW5pdGlhbGl6ZWQ7CisgIC8vLyBBIG1hcCBmcm9tIGRpc2Fzc2VtYmxlciBzcGVjaWZpY2F0aW9ucyB0byBkaXNhc3NlbWJsZXJzLiAgUG9wdWxhdGVkCisgIC8vLyAgIGxhemlseS4KKyAgc3RhdGljIERpc2Fzc2VtYmxlck1hcF90IHNEaXNhc3NlbWJsZXJzOworCisgIC8vLyBnZXREaXNhc3NlbWJsZXIgLSBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgZGlzYXNzZW1ibGUsIG9yIE5VTEwgb24gZmFpbHVyZQorICAvLy8KKyAgLy8vIEBhcmcgYXJjaCAgIC0gVGhlIGRlc2lyZWQgYXJjaGl0ZWN0dXJlCisgIC8vLyBAYXJnIHN5bnRheCAtIFRoZSBkZXNpcmVkIGRpc2Fzc2VtYmx5IHN5bnRheAorICBzdGF0aWMgRUREaXNhc3NlbWJsZXIgKmdldERpc2Fzc2VtYmxlcihsbHZtOjpUcmlwbGU6OkFyY2hUeXBlIGFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VtYmx5U3ludGF4IHN5bnRheCk7CisgIAorICAvLy8gZ2V0RGlzYXNzZW1ibGVyIC0gUmV0dXJucyB0aGUgZGlzYXNzZW1ibGVyIGZvciBhIGdpdmVuIGNvbWJpbmF0aW9uIG9mCisgIC8vLyAgIENQVSB0eXBlLCBDUFUgc3VidHlwZSwgYW5kIGFzc2VtYmx5IHN5bnRheCwgb3IgTlVMTCBvbiBmYWlsdXJlCisgIC8vLworICAvLy8gQGFyZyBzdHIgICAgLSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcmNoaXRlY3R1cmUgdHJpcGxlLCBlLmcuLAorICAvLy8gICAgICAgICAgICAgICAieDg2XzY0LWFwcGxlLWRhcndpbiIKKyAgLy8vIEBhcmcgc3ludGF4IC0gVGhlIGRpc2Fzc2VtYmx5IHN5bnRheCBmb3IgdGhlIHJlcXVpcmVkIGRpc2Fzc2VtYmxlcgorICBzdGF0aWMgRUREaXNhc3NlbWJsZXIgKmdldERpc2Fzc2VtYmxlcihsbHZtOjpTdHJpbmdSZWYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlbWJseVN5bnRheCBzeW50YXgpOworICAKKyAgLy8vIGluaXRpYWxpemUgLSBJbml0aWFsaXplcyB0aGUgZGlzYXNzZW1ibGVyIHJlZ2lzdHJ5IGFuZCB0aGUgTExWTSBiYWNrZW5kCisgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKTsKKyAgCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBQZXItb2JqZWN0IG1lbWJlcnMgLy8KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIAorICAvLy8gVHJ1ZSBvbmx5IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkCisgIGJvb2wgVmFsaWQ7CisgIC8vLyBUcnVlIGlmIHRoZSBkaXNhc3NlbWJsZXIgY2FuIHByb3ZpZGUgc2VtYW50aWMgaW5mb3JtYXRpb24KKyAgYm9vbCBIYXNTZW1hbnRpY3M7CisgIAorICAvLy8gVGhlIHN0cmVhbSB0byB3cml0ZSBlcnJvcnMgdG8KKyAgbGx2bTo6cmF3X29zdHJlYW0gJkVycm9yU3RyZWFtOworCisgIC8vLyBUaGUgYXJjaGl0ZWN0dXJlL3N5bnRheCBwYWlyIGZvciB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUKKyAgQ1BVS2V5IEtleTsKKyAgLy8vIFRoZSBMTFZNIHRhcmdldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaXNhc3NlbWJsZXIKKyAgY29uc3QgbGx2bTo6VGFyZ2V0ICpUZ3Q7CisgIC8vLyBUaGUgdGFyZ2V0IG1hY2hpbmUgaW5zdGFuY2UuCisgIGxsdm06Ok93bmluZ1B0cjxsbHZtOjpUYXJnZXRNYWNoaW5lPiBUYXJnZXRNYWNoaW5lOworICAvLy8gVGhlIGFzc2VtYmx5IGluZm9ybWF0aW9uIGZvciB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQorICBsbHZtOjpPd25pbmdQdHI8Y29uc3QgbGx2bTo6TUNBc21JbmZvPiBBc21JbmZvOworICAvLy8gVGhlIGRpc2Fzc2VtYmxlciBmb3IgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKKyAgbGx2bTo6T3duaW5nUHRyPGNvbnN0IGxsdm06Ok1DRGlzYXNzZW1ibGVyPiBEaXNhc3NlbWJsZXI7CisgIC8vLyBUaGUgb3V0cHV0IHN0cmluZyBmb3IgdGhlIGluc3RydWN0aW9uIHByaW50ZXI7IG11c3QgYmUgZ3VhcmRlZCB3aXRoIAorICAvLy8gICBQcmludGVyTXV0ZXgKKyAgbGx2bTo6T3duaW5nUHRyPHN0ZDo6c3RyaW5nPiBJbnN0U3RyaW5nOworICAvLy8gVGhlIG91dHB1dCBzdHJlYW0gZm9yIHRoZSBkaXNhc3NlbWJsZXI7IG11c3QgYmUgZ3VhcmRlZCB3aXRoCisgIC8vLyAgIFByaW50ZXJNdXRleAorICBsbHZtOjpPd25pbmdQdHI8bGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtPiBJbnN0U3RyZWFtOworICAvLy8gVGhlIGluc3RydWN0aW9uIHByaW50ZXIgZm9yIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlOyBtdXN0IGJlIGd1YXJkZWQgd2l0aAorICAvLy8gICBQcmludGVyTXV0ZXggd2hlbiBwcmludGluZworICBsbHZtOjpPd25pbmdQdHI8bGx2bTo6TUNJbnN0UHJpbnRlcj4gSW5zdFByaW50ZXI7CisgIC8vLyBUaGUgbXV0ZXggdGhhdCBndWFyZHMgdGhlIGluc3RydWN0aW9uIHByaW50ZXIncyBwcmludGluZyBmdW5jdGlvbnMsIHdoaWNoCisgIC8vLyAgIHVzZSBhIHNoYXJlZCBzdHJlYW0KKyAgbGx2bTo6c3lzOjpNdXRleCBQcmludGVyTXV0ZXg7CisgIC8vLyBUaGUgYXJyYXkgb2YgaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIFRhYmxlR2VuIGJhY2tlbmQgZm9yCisgIC8vLyAgIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCisgIGNvbnN0IGxsdm06OkVESW5zdEluZm8gKkluc3RJbmZvczsKKyAgLy8vIFRoZSB0YXJnZXQtc3BlY2lmaWMgbGV4ZXIgZm9yIHVzZSBpbiB0b2tlbml6aW5nIHN0cmluZ3MsIGluCisgIC8vLyAgIHRhcmdldC1pbmRlcGVuZGVudCBhbmQgdGFyZ2V0LXNwZWNpZmljIHBvcnRpb25zCisgIGxsdm06Ok93bmluZ1B0cjxsbHZtOjpBc21MZXhlcj4gR2VuZXJpY0FzbUxleGVyOworICBsbHZtOjpPd25pbmdQdHI8bGx2bTo6VGFyZ2V0QXNtTGV4ZXI+IFNwZWNpZmljQXNtTGV4ZXI7CisgIC8vLyBUaGUgZ3VhcmQgZm9yIHRoZSBhYm92ZQorICBsbHZtOjpzeXM6Ok11dGV4IFBhcnNlck11dGV4OworICAvLy8gVGhlIExMVk0gbnVtYmVyIHVzZWQgZm9yIHRoZSB0YXJnZXQgZGlzYXNzZW1ibHkgc3ludGF4IHZhcmlhbnQKKyAgaW50IExMVk1TeW50YXhWYXJpYW50OworICAgIAorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZWd2ZWNfdDsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdW5zaWduZWQ+IHJlZ3JtYXBfdDsKKyAgCisgIC8vLyBBIHZlY3RvciBvZiByZWdpc3RlcnMgZm9yIHF1aWNrIG1hcHBpbmcgZnJvbSBMTFZNIHJlZ2lzdGVyIElEcyB0byBuYW1lcworICByZWd2ZWNfdCBSZWdWZWM7CisgIC8vLyBBIG1hcCBvZiByZWdpc3RlcnMgZm9yIHF1aWNrIG1hcHBpbmcgZnJvbSByZWdpc3RlciBuYW1lcyB0byBMTFZNIElEcworICByZWdybWFwX3QgUmVnUk1hcDsKKyAgCisgIC8vLyBBIHNldCBvZiByZWdpc3RlciBJRHMgZm9yIGFsaWFzZXMgb2YgdGhlIHN0YWNrIHBvaW50ZXIgZm9yIHRoZSBjdXJyZW50CisgIC8vLyAgIGFyY2hpdGVjdHVyZQorICBzdGQ6OnNldDx1bnNpZ25lZD4gc3RhY2tQb2ludGVyczsKKyAgLy8vIEEgc2V0IG9mIHJlZ2lzdGVyIElEcyBmb3IgYWxpYXNlcyBvZiB0aGUgcHJvZ3JhbSBjb3VudGVyIGZvciB0aGUgY3VycmVudAorICAvLy8gICBhcmNoaXRlY3R1cmUKKyAgc3RkOjpzZXQ8dW5zaWduZWQ+IHByb2dyYW1Db3VudGVyczsKKyAgCisgIC8vLyBDb25zdHJ1Y3RvciAtIGluaXRpYWxpemVzIGEgZGlzYXNzZW1ibGVyIHdpdGggYWxsIHRoZSBuZWNlc3Nhcnkgb2JqZWN0cywKKyAgLy8vICAgd2hpY2ggY29tZSBwcmUtYWxsb2NhdGVkIGZyb20gdGhlIHJlZ2lzdHJ5IGFjY2Vzc29yIGZ1bmN0aW9uCisgIC8vLworICAvLy8gQGFyZyBrZXkgICAgICAgICAgICAgICAgLSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBkaXNhc3NlbWJseSBzeW50YXggZm9yIHRoZSAKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNzZW1ibGVyCisgIEVERGlzYXNzZW1ibGVyKENQVUtleSYga2V5KTsKKyAgCisgIC8vLyB2YWxpZCAtIHJlcG9ydHMgd2hldGhlciB0aGVyZSB3YXMgYSBmYWlsdXJlIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgYm9vbCB2YWxpZCgpIHsKKyAgICByZXR1cm4gVmFsaWQ7CisgIH0KKyAgCisgIC8vLyBoYXNTZW1hbnRpY3MgLSByZXBvcnRzIHdoZXRoZXIgdGhlIGRpc2Fzc2VtYmxlciBjYW4gcHJvdmlkZSBvcGVyYW5kcyBhbmQKKyAgLy8vICAgdG9rZW5zLgorICBib29sIGhhc1NlbWFudGljcygpIHsKKyAgICByZXR1cm4gSGFzU2VtYW50aWNzOworICB9CisgIAorICB+RUREaXNhc3NlbWJsZXIoKTsKKyAgCisgIC8vLyBjcmVhdGVJbnN0IC0gY3JlYXRlcyBhbmQgcmV0dXJucyBhbiBpbnN0cnVjdGlvbiBnaXZlbiBhIGNhbGxiYWNrIGFuZAorICAvLy8gICBtZW1vcnkgYWRkcmVzcywgb3IgTlVMTCBvbiBmYWlsdXJlCisgIC8vLworICAvLy8gQGFyZyBieXRlUmVhZGVyIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIG1hY2hpbmUgY29kZSBieXRlcworICAvLy8gQGFyZyBhZGRyZXNzICAgIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGluc3RydWN0aW9uLAorICAvLy8gICAgICAgICAgICAgICAgICAgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gYnl0ZVJlYWRlcgorICAvLy8gQGFyZyBhcmcgICAgICAgIC0gQW4gb3BhcXVlIGFyZ3VtZW50IGZvciBieXRlUmVhZGVyCisgIEVESW5zdCAqY3JlYXRlSW5zdChFREJ5dGVSZWFkZXJDYWxsYmFjayBieXRlUmVhZGVyLCAKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFkZHJlc3MsIAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKTsKKworICAvLy8gaW5pdE1hcHMgLSBpbml0aWFsaXplcyByZWdWZWMgYW5kIHJlZ1JNYXAgdXNpbmcgdGhlIHByb3ZpZGVkIHJlZ2lzdGVyCisgIC8vLyAgIGluZm8KKyAgLy8vCisgIC8vLyBAYXJnIHJlZ2lzdGVySW5mbyAtIHRoZSByZWdpc3RlciBpbmZvcm1hdGlvbiB0byB1c2UgYXMgYSBzb3VyY2UKKyAgdm9pZCBpbml0TWFwcyhjb25zdCBsbHZtOjpUYXJnZXRSZWdpc3RlckluZm8gJnJlZ2lzdGVySW5mbyk7CisgIC8vLyBuYW1lV2l0aFJlZ2lzdGVySUQgLSBSZXR1cm5zIHRoZSBuYW1lIChvd25lZCBieSB0aGUgRUREaXNhc3NlbWJsZXIpIG9mIGEgCisgIC8vLyAgIHJlZ2lzdGVyIGZvciBhIGdpdmVuIHJlZ2lzdGVyIElELCBvciBOVUxMIG9uIGZhaWx1cmUKKyAgLy8vCisgIC8vLyBAYXJnIHJlZ2lzdGVySUQgLSB0aGUgSUQgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlIHF1ZXJpZWQKKyAgY29uc3QgY2hhciAqbmFtZVdpdGhSZWdpc3RlcklEKHVuc2lnbmVkIHJlZ2lzdGVySUQpIGNvbnN0OworICAvLy8gcmVnaXN0ZXJJRFdpdGhOYW1lIC0gUmV0dXJucyB0aGUgSUQgb2YgYSByZWdpc3RlciBmb3IgYSBnaXZlbiByZWdpc3RlcgorICAvLy8gICBuYW1lLCBvciAodW5zaWduZWQpLTEgb24gZmFpbHVyZQorICAvLy8KKyAgLy8vIEBhcmcgbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcgorICB1bnNpZ25lZCByZWdpc3RlcklEV2l0aE5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgIAorICAvLy8gcmVnaXN0ZXJJc1N0YWNrUG9pbnRlciAtIHJlcG9ydHMgd2hldGhlciBhIHJlZ2lzdGVyIElEIGlzIGFuIGFsaWFzIGZvciB0aGUKKyAgLy8vICAgc3RhY2sgcG9pbnRlciByZWdpc3RlcgorICAvLy8KKyAgLy8vIEBhcmcgcmVnaXN0ZXJJRCAtIFRoZSBMTFZNIHJlZ2lzdGVyIElECisgIGJvb2wgcmVnaXN0ZXJJc1N0YWNrUG9pbnRlcih1bnNpZ25lZCByZWdpc3RlcklEKTsKKyAgLy8vIHJlZ2lzdGVySXNTdGFja1BvaW50ZXIgLSByZXBvcnRzIHdoZXRoZXIgYSByZWdpc3RlciBJRCBpcyBhbiBhbGlhcyBmb3IgdGhlCisgIC8vLyAgIHN0YWNrIHBvaW50ZXIgcmVnaXN0ZXIKKyAgLy8vCisgIC8vLyBAYXJnIHJlZ2lzdGVySUQgLSBUaGUgTExWTSByZWdpc3RlciBJRAorICBib29sIHJlZ2lzdGVySXNQcm9ncmFtQ291bnRlcih1bnNpZ25lZCByZWdpc3RlcklEKTsKKyAgCisgIC8vLyBwcmludEluc3QgLSBwcmludHMgYW4gTUNJbnN0IHRvIGEgc3RyaW5nLCByZXR1cm5pbmcgMCBvbiBzdWNjZXNzLCBvciAtMQorICAvLy8gICBvdGhlcndpc2UKKyAgLy8vCisgIC8vLyBAYXJnIHN0ciAgLSBBIHJlZmVyZW5jZSB0byBhIHN0cmluZyB3aGljaCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgc3RyaW5nCisgIC8vLyAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIEBhcmcgaW5zdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNQ0luc3QgdG8gYmUgcHJpbnRlZAorICBpbnQgcHJpbnRJbnN0KHN0ZDo6c3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgbGx2bTo6TUNJbnN0JiBpbnN0KTsKKyAgCisgIC8vLyBwYXJzZUluc3QgLSBleHRyYWN0cyBvcGVyYW5kcyBhbmQgdG9rZW5zIGZyb20gYSBzdHJpbmcgZm9yIHVzZSBpbgorICAvLy8gICB0b2tlbml6aW5nIHRoZSBzdHJpbmcuICBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEgb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIEBhcmcgb3BlcmFuZHMgLSBBIHJlZmVyZW5jZSB0byBhIHZlY3RvciB0aGF0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlCisgIC8vLyAgICAgICAgICAgICAgICAgcGFyc2VkIG9wZXJhbmRzCisgIC8vLyBAYXJnIHRva2VucyAgIC0gQSByZWZlcmVuY2UgdG8gYSB2ZWN0b3IgdGhhdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZQorICAvLy8gICAgICAgICAgICAgICAgIHRva2VucworICAvLy8gQGFyZyBzdHIgICAgICAtIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RydWN0aW9uCisgIGludCBwYXJzZUluc3QobGx2bTo6U21hbGxWZWN0b3JJbXBsPGxsdm06Ok1DUGFyc2VkQXNtT3BlcmFuZCo+ICZvcGVyYW5kcywKKyAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8bGx2bTo6QXNtVG9rZW4+ICZ0b2tlbnMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cik7CisgIAorICAvLy8gbGx2bVN5bnRheFZhcmlhbnQgLSByZXR1cm5zIHRoZSBMTFZNIHN5bnRheCB2YXJpYW50IGZvciB0aGlzIGRpc2Fzc2VtYmxlcgorICBpbnQgbGx2bVN5bnRheFZhcmlhbnQoKSBjb25zdDsgIAorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRURJbmZvLmggYi9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRURJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3YzA2NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FREluZm8uaApAQCAtMCwwICsxLDczIEBACisvLz09PS0tIEVESW5mby5oIC0gTExWTSBFbmhhbmNlZCBEaXNhc3NlbWJsZXIgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VESU5GT19ICisjZGVmaW5lIExMVk1fRURJTkZPX0gKKworZW51bSB7CisgIEVESVNfTUFYX09QRVJBTkRTID0gMTMsCisgIEVESVNfTUFYX1NZTlRBWEVTID0gMgorfTsKKworZW51bSBPcGVyYW5kVHlwZXMgeworICBrT3BlcmFuZFR5cGVOb25lLAorICBrT3BlcmFuZFR5cGVJbW1lZGlhdGUsCisgIGtPcGVyYW5kVHlwZVJlZ2lzdGVyLAorICBrT3BlcmFuZFR5cGVYODZNZW1vcnksCisgIGtPcGVyYW5kVHlwZVg4NkVmZmVjdGl2ZUFkZHJlc3MsCisgIGtPcGVyYW5kVHlwZVg4NlBDUmVsYXRpdmUsCisgIGtPcGVyYW5kVHlwZUFSTUJyYW5jaFRhcmdldCwKKyAga09wZXJhbmRUeXBlQVJNU29SZWcsCisgIGtPcGVyYW5kVHlwZUFSTVNvSW1tLAorICBrT3BlcmFuZFR5cGVBUk1Tb0ltbTJQYXJ0LAorICBrT3BlcmFuZFR5cGVBUk1QcmVkaWNhdGUsCisgIGtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMiwKKyAga09wZXJhbmRUeXBlQVJNQWRkck1vZGUyT2Zmc2V0LAorICBrT3BlcmFuZFR5cGVBUk1BZGRyTW9kZTMsCisgIGtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlM09mZnNldCwKKyAga09wZXJhbmRUeXBlQVJNQWRkck1vZGU0LAorICBrT3BlcmFuZFR5cGVBUk1BZGRyTW9kZTUsCisgIGtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNiwKKyAga09wZXJhbmRUeXBlQVJNQWRkck1vZGU2T2Zmc2V0LAorICBrT3BlcmFuZFR5cGVBUk1BZGRyTW9kZVBDLAorICBrT3BlcmFuZFR5cGVBUk1SZWdpc3Rlckxpc3QsCisgIGtPcGVyYW5kVHlwZUFSTVRCQWRkck1vZGUsCisgIGtPcGVyYW5kVHlwZVRodW1iSVRNYXNrLAorICBrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUzEsCisgIGtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVTMiwKKyAga09wZXJhbmRUeXBlVGh1bWJBZGRyTW9kZVM0LAorICBrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUlIsCisgIGtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVTUCwKKyAga09wZXJhbmRUeXBlVGh1bWIyU29SZWcsCisgIGtPcGVyYW5kVHlwZVRodW1iMlNvSW1tLAorICBrT3BlcmFuZFR5cGVUaHVtYjJBZGRyTW9kZUltbTgsCisgIGtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlSW1tOE9mZnNldCwKKyAga09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW0xMiwKKyAga09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVTb1JlZywKKyAga09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW04czQsCisgIGtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlSW1tOHM0T2Zmc2V0Cit9OworCitlbnVtIE9wZXJhbmRGbGFncyB7CisgIGtPcGVyYW5kRmxhZ1NvdXJjZSA9IDB4MSwKKyAga09wZXJhbmRGbGFnVGFyZ2V0ID0gMHgyCit9OworCitlbnVtIEluc3RydWN0aW9uVHlwZXMgeworICBrSW5zdHJ1Y3Rpb25UeXBlTm9uZSwKKyAga0luc3RydWN0aW9uVHlwZU1vdmUsCisgIGtJbnN0cnVjdGlvblR5cGVCcmFuY2gsCisgIGtJbnN0cnVjdGlvblR5cGVQdXNoLAorICBrSW5zdHJ1Y3Rpb25UeXBlUG9wLAorICBrSW5zdHJ1Y3Rpb25UeXBlQ2FsbCwKKyAga0luc3RydWN0aW9uVHlwZVJldHVybgorfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FREluc3QuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DRGlzYXNzZW1ibGVyL0VESW5zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyNDA4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FREluc3QuY3BwCkBAIC0wLDAgKzEsMjA3IEBACisvLz09PS1FREluc3QuY3BwIC0gTExWTSBFbmhhbmNlZCBEaXNhc3NlbWJsZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgRW5oYW5jZWQgRGlzYXNzZW1ibHkgbGlicmFyeSdzIGluc3RydWN0aW9uIGNsYXNzLgorLy8gVGhlIGluc3RydWN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciB2ZW5kaW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24sIAorLy8gaW5kaXZpZHVhbCB0b2tlbnMsIGFuZCBvcGVyYW5kcyBmb3IgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkVESW5zdC5oIgorI2luY2x1ZGUgIkVERGlzYXNzZW1ibGVyLmgiCisjaW5jbHVkZSAiRURPcGVyYW5kLmgiCisjaW5jbHVkZSAiRURUb2tlbi5oIgorCisjaW5jbHVkZSAibGx2bS9NQy9FREluc3RJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK0VESW5zdDo6RURJbnN0KGxsdm06Ok1DSW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgIHVpbnQ2NF90IGJ5dGVTaXplLCAKKyAgICAgICAgICAgICAgIEVERGlzYXNzZW1ibGVyICZkaXNhc3NlbWJsZXIsCisgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpFREluc3RJbmZvICppbmZvKSA6CisgIERpc2Fzc2VtYmxlcihkaXNhc3NlbWJsZXIpLAorICBJbnN0KGluc3QpLAorICBUaGlzSW5zdEluZm8oaW5mbyksCisgIEJ5dGVTaXplKGJ5dGVTaXplKSwKKyAgQnJhbmNoVGFyZ2V0KC0xKSwKKyAgTW92ZVNvdXJjZSgtMSksCisgIE1vdmVUYXJnZXQoLTEpIHsKKyAgT3BlcmFuZE9yZGVyID0gVGhpc0luc3RJbmZvLT5vcGVyYW5kT3JkZXJzW0Rpc2Fzc2VtYmxlci5sbHZtU3ludGF4VmFyaWFudCgpXTsKK30KKworRURJbnN0Ojp+RURJbnN0KCkgeworICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgIHVuc2lnbmVkIGludCBudW1PcGVyYW5kcyA9IE9wZXJhbmRzLnNpemUoKTsKKyAgCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bU9wZXJhbmRzOyArK2luZGV4KQorICAgIGRlbGV0ZSBPcGVyYW5kc1tpbmRleF07CisgIAorICB1bnNpZ25lZCBpbnQgbnVtVG9rZW5zID0gVG9rZW5zLnNpemUoKTsKKyAgCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bVRva2VuczsgKytpbmRleCkKKyAgICBkZWxldGUgVG9rZW5zW2luZGV4XTsKKyAgCisgIGRlbGV0ZSBJbnN0OworfQorCit1aW50NjRfdCBFREluc3Q6OmJ5dGVTaXplKCkgeworICByZXR1cm4gQnl0ZVNpemU7Cit9CisKK2ludCBFREluc3Q6OnN0cmluZ2lmeSgpIHsKKyAgaWYgKFN0cmluZ2lmeVJlc3VsdC52YWxpZCgpKQorICAgIHJldHVybiBTdHJpbmdpZnlSZXN1bHQucmVzdWx0KCk7CisgIAorICBpZiAoRGlzYXNzZW1ibGVyLnByaW50SW5zdChTdHJpbmcsICpJbnN0KSkKKyAgICByZXR1cm4gU3RyaW5naWZ5UmVzdWx0LnNldFJlc3VsdCgtMSk7CisgIAorICByZXR1cm4gU3RyaW5naWZ5UmVzdWx0LnNldFJlc3VsdCgwKTsKK30KKworaW50IEVESW5zdDo6Z2V0U3RyaW5nKGNvbnN0IGNoYXIqJiBzdHIpIHsKKyAgaWYgKHN0cmluZ2lmeSgpKQorICAgIHJldHVybiAtMTsKKyAgCisgIHN0ciA9IFN0cmluZy5jX3N0cigpOworICAKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIEVESW5zdDo6aW5zdElEKCkgeworICByZXR1cm4gSW5zdC0+Z2V0T3Bjb2RlKCk7Cit9CisKK2Jvb2wgRURJbnN0Ojppc0JyYW5jaCgpIHsKKyAgaWYgKFRoaXNJbnN0SW5mbykKKyAgICByZXR1cm4gCisgICAgICBUaGlzSW5zdEluZm8tPmluc3RydWN0aW9uVHlwZSA9PSBrSW5zdHJ1Y3Rpb25UeXBlQnJhbmNoIHx8CisgICAgICBUaGlzSW5zdEluZm8tPmluc3RydWN0aW9uVHlwZSA9PSBrSW5zdHJ1Y3Rpb25UeXBlQ2FsbDsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBFREluc3Q6OmlzTW92ZSgpIHsKKyAgaWYgKFRoaXNJbnN0SW5mbykKKyAgICByZXR1cm4gVGhpc0luc3RJbmZvLT5pbnN0cnVjdGlvblR5cGUgPT0ga0luc3RydWN0aW9uVHlwZU1vdmU7CisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludCBFREluc3Q6OnBhcnNlT3BlcmFuZHMoKSB7CisgIGlmIChQYXJzZVJlc3VsdC52YWxpZCgpKQorICAgIHJldHVybiBQYXJzZVJlc3VsdC5yZXN1bHQoKTsKKyAgCisgIGlmICghVGhpc0luc3RJbmZvKQorICAgIHJldHVybiBQYXJzZVJlc3VsdC5zZXRSZXN1bHQoLTEpOworICAKKyAgdW5zaWduZWQgaW50IG9wSW5kZXg7CisgIHVuc2lnbmVkIGludCBtY09wSW5kZXggPSAwOworICAKKyAgZm9yIChvcEluZGV4ID0gMDsgb3BJbmRleCA8IFRoaXNJbnN0SW5mby0+bnVtT3BlcmFuZHM7ICsrb3BJbmRleCkgeworICAgIGlmIChpc0JyYW5jaCgpICYmCisgICAgICAgIChUaGlzSW5zdEluZm8tPm9wZXJhbmRGbGFnc1tvcEluZGV4XSAmIGtPcGVyYW5kRmxhZ1RhcmdldCkpIHsKKyAgICAgIEJyYW5jaFRhcmdldCA9IG9wSW5kZXg7CisgICAgfQorICAgIGVsc2UgaWYgKGlzTW92ZSgpKSB7CisgICAgICBpZiAoVGhpc0luc3RJbmZvLT5vcGVyYW5kRmxhZ3Nbb3BJbmRleF0gJiBrT3BlcmFuZEZsYWdTb3VyY2UpCisgICAgICAgIE1vdmVTb3VyY2UgPSBvcEluZGV4OworICAgICAgZWxzZSBpZiAoVGhpc0luc3RJbmZvLT5vcGVyYW5kRmxhZ3Nbb3BJbmRleF0gJiBrT3BlcmFuZEZsYWdUYXJnZXQpCisgICAgICAgIE1vdmVUYXJnZXQgPSBvcEluZGV4OworICAgIH0KKyAgICAKKyAgICBFRE9wZXJhbmQgKm9wZXJhbmQgPSBuZXcgRURPcGVyYW5kKERpc2Fzc2VtYmxlciwgKnRoaXMsIG9wSW5kZXgsIG1jT3BJbmRleCk7CisgICAgCisgICAgT3BlcmFuZHMucHVzaF9iYWNrKG9wZXJhbmQpOworICB9CisgIAorICByZXR1cm4gUGFyc2VSZXN1bHQuc2V0UmVzdWx0KDApOworfQorCitpbnQgRURJbnN0OjpicmFuY2hUYXJnZXRJRCgpIHsKKyAgaWYgKHBhcnNlT3BlcmFuZHMoKSkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiBCcmFuY2hUYXJnZXQ7Cit9CisKK2ludCBFREluc3Q6Om1vdmVTb3VyY2VJRCgpIHsKKyAgaWYgKHBhcnNlT3BlcmFuZHMoKSkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiBNb3ZlU291cmNlOworfQorCitpbnQgRURJbnN0Ojptb3ZlVGFyZ2V0SUQoKSB7CisgIGlmIChwYXJzZU9wZXJhbmRzKCkpCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gTW92ZVRhcmdldDsKK30KKworaW50IEVESW5zdDo6bnVtT3BlcmFuZHMoKSB7CisgIGlmIChwYXJzZU9wZXJhbmRzKCkpCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gT3BlcmFuZHMuc2l6ZSgpOworfQorCitpbnQgRURJbnN0OjpnZXRPcGVyYW5kKEVET3BlcmFuZCAqJm9wZXJhbmQsIHVuc2lnbmVkIGludCBpbmRleCkgeworICBpZiAocGFyc2VPcGVyYW5kcygpKQorICAgIHJldHVybiAtMTsKKyAgCisgIGlmIChpbmRleCA+PSBPcGVyYW5kcy5zaXplKCkpCisgICAgcmV0dXJuIC0xOworICAKKyAgb3BlcmFuZCA9IE9wZXJhbmRzW2luZGV4XTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFREluc3Q6OnRva2VuaXplKCkgeworICBpZiAoVG9rZW5pemVSZXN1bHQudmFsaWQoKSkKKyAgICByZXR1cm4gVG9rZW5pemVSZXN1bHQucmVzdWx0KCk7CisgIAorICBpZiAoc3RyaW5naWZ5KCkpCisgICAgcmV0dXJuIFRva2VuaXplUmVzdWx0LnNldFJlc3VsdCgtMSk7CisgICAgCisgIHJldHVybiBUb2tlbml6ZVJlc3VsdC5zZXRSZXN1bHQoRURUb2tlbjo6dG9rZW5pemUoVG9rZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYXNzZW1ibGVyKSk7CisgICAgCit9CisKK2ludCBFREluc3Q6Om51bVRva2VucygpIHsKKyAgaWYgKHRva2VuaXplKCkpCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gVG9rZW5zLnNpemUoKTsKK30KKworaW50IEVESW5zdDo6Z2V0VG9rZW4oRURUb2tlbiAqJnRva2VuLCB1bnNpZ25lZCBpbnQgaW5kZXgpIHsKKyAgaWYgKHRva2VuaXplKCkpCisgICAgcmV0dXJuIC0xOworICB0b2tlbiA9IFRva2Vuc1tpbmRleF07CisgIHJldHVybiAwOworfQorCisjaWZkZWYgX19CTE9DS1NfXworaW50IEVESW5zdDo6dmlzaXRUb2tlbnMoRURUb2tlblZpc2l0b3JfdCB2aXNpdG9yKSB7CisgIGlmICh0b2tlbml6ZSgpKQorICAgIHJldHVybiAtMTsKKyAgCisgIHRva3ZlY190OjppdGVyYXRvciBpdGVyOworICAKKyAgZm9yIChpdGVyID0gVG9rZW5zLmJlZ2luKCk7IGl0ZXIgIT0gVG9rZW5zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBpbnQgcmV0ID0gdmlzaXRvcigqaXRlcik7CisgICAgaWYgKHJldCA9PSAxKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHJldCAhPSAwKQorICAgICAgcmV0dXJuIC0xOworICB9CisgIAorICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01DRGlzYXNzZW1ibGVyL0VESW5zdC5oIGIvc3JjL0xMVk0vbGliL01DL01DRGlzYXNzZW1ibGVyL0VESW5zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDI2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRURJbnN0LmgKQEAgLTAsMCArMSwxODIgQEAKKy8vPT09LS0gRURJbnN0LmggLSBMTFZNIEVuaGFuY2VkIERpc2Fzc2VtYmxlciAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBFbmhhbmNlZCBEaXNhc3NlbWJseSBsaWJyYXJ5J3MKKy8vIGluc3RydWN0aW9uIGNsYXNzLiAgVGhlIGluc3RydWN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciB2ZW5kaW5nIHRoZSBzdHJpbmcKKy8vIHJlcHJlc2VudGF0aW9uLCBpbmRpdmlkdWFsIHRva2VucyBhbmQgb3BlcmFuZHMgZm9yIGEgc2luZ2xlIGluc3RydWN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FRElOU1RfSAorI2RlZmluZSBMTFZNX0VESU5TVF9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTUNJbnN0OworICBzdHJ1Y3QgRURJbnN0SW5mbzsKKyAgc3RydWN0IEVEVG9rZW47CisgIHN0cnVjdCBFRERpc2Fzc2VtYmxlcjsKKyAgc3RydWN0IEVET3BlcmFuZDsKKworI2lmZGVmIF9fQkxPQ0tTX18KKyAgdHlwZWRlZiBpbnQgKF5FRFRva2VuVmlzaXRvcl90KShFRFRva2VuICp0b2tlbik7CisjZW5kaWYKKworLy8vIENhY2hlZFJlc3VsdCAtIEVuY2Fwc3VsYXRlcyB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gYWxvbmcgd2l0aCB0aGUgdmFsaWRpdHkKKy8vLyAgIG9mIHRoYXQgcmVzdWx0LCBzbyB0aGF0IHNsb3cgZnVuY3Rpb25zIGRvbid0IG5lZWQgdG8gcnVuIHR3aWNlCitzdHJ1Y3QgQ2FjaGVkUmVzdWx0IHsKKyAgLy8vIFRydWUgaWYgdGhlIHJlc3VsdCBoYXMgYmVlbiBvYnRhaW5lZCBieSBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uCisgIGJvb2wgVmFsaWQ7CisgIC8vLyBUaGUgcmVzdWx0IGxhc3Qgb2J0YWluZWQgZnJvbSB0aGUgZnVuY3Rpb24KKyAgaW50IFJlc3VsdDsKKyAgCisgIC8vLyBDb25zdHJ1Y3RvciAtIEluaXRpYWxpemVzIGFuIGludmFsaWQgcmVzdWx0CisgIENhY2hlZFJlc3VsdCgpIDogVmFsaWQoZmFsc2UpIHsgfQorICAvLy8gdmFsaWQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBoYXMgYmVlbiBvYnRhaW5lZCBieSBleGVjdXRpbmcgdGhlCisgIC8vLyAgIGZ1bmN0aW9uIGFuZCBmYWxzZSBvdGhlcndpc2UKKyAgYm9vbCB2YWxpZCgpIHsgcmV0dXJuIFZhbGlkOyB9CisgIC8vLyByZXN1bHQgLSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIG9yIGFuIHVuZGVmaW5lZCB2YWx1ZSBpZgorICAvLy8gICB2YWxpZCgpIGlzIGZhbHNlCisgIGludCByZXN1bHQoKSB7IHJldHVybiBSZXN1bHQ7IH0KKyAgLy8vIHNldFJlc3VsdCAtIFNldHMgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gYW5kIGRlY2xhcmVzIGl0IHZhbGlkCisgIC8vLyAgIHJldHVybmluZyB0aGUgcmVzdWx0IChzbyB0aGF0IHNldFJlc3VsdCgpIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgYQorICAvLy8gICByZXR1cm4gc3RhdGVtZW50KQorICAvLy8gQGFyZyByZXN1bHQgLSBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbgorICBpbnQgc2V0UmVzdWx0KGludCByZXN1bHQpIHsgUmVzdWx0ID0gcmVzdWx0OyBWYWxpZCA9IHRydWU7IHJldHVybiByZXN1bHQ7IH0KK307CisKKy8vLyBFREluc3QgLSBFbmNhcHN1bGF0ZXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24sIHdoaWNoIGNhbiBiZSBxdWVyaWVkIGZvciBpdHMKKy8vLyAgIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYXMgd2VsbCBhcyBpdHMgb3BlcmFuZHMgYW5kIHRva2Vucworc3RydWN0IEVESW5zdCB7CisgIC8vLyBUaGUgcGFyZW50IGRpc2Fzc2VtYmxlcgorICBFRERpc2Fzc2VtYmxlciAmRGlzYXNzZW1ibGVyOworICAvLy8gVGhlIGNvbnRhaW5pbmcgTUNJbnN0CisgIGxsdm06Ok1DSW5zdCAqSW5zdDsKKyAgLy8vIFRoZSBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBUYWJsZUdlbiBmb3IgdGhpcyBpbnN0cnVjdGlvbgorICBjb25zdCBsbHZtOjpFREluc3RJbmZvICpUaGlzSW5zdEluZm87CisgIC8vLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGZvciB0aGUgbWFjaGluZSBjb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbgorICB1aW50NjRfdCBCeXRlU2l6ZTsKKyAgCisgIC8vLyBUaGUgcmVzdWx0IG9mIHRoZSBzdHJpbmdpZnkoKSBmdW5jdGlvbgorICBDYWNoZWRSZXN1bHQgU3RyaW5naWZ5UmVzdWx0OworICAvLy8gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgc3RkOjpzdHJpbmcgU3RyaW5nOworICAvLy8gVGhlIG9yZGVyIGluIHdoaWNoIG9wZXJhbmRzIGZyb20gdGhlIEluc3RJbmZvJ3Mgb3BlcmFuZCBpbmZvcm1hdGlvbiBhcHBlYXIKKyAgLy8vIGluIFN0cmluZworICBjb25zdCBjaGFyKiBPcGVyYW5kT3JkZXI7CisgIAorICAvLy8gVGhlIHJlc3VsdCBvZiB0aGUgcGFyc2VPcGVyYW5kcygpIGZ1bmN0aW9uCisgIENhY2hlZFJlc3VsdCBQYXJzZVJlc3VsdDsKKyAgdHlwZWRlZiBsbHZtOjpTbWFsbFZlY3RvcjxFRE9wZXJhbmQqLCA1PiBvcHZlY190OworICAvLy8gVGhlIGluc3RydWN0aW9uJ3Mgb3BlcmFuZHMKKyAgb3B2ZWNfdCBPcGVyYW5kczsKKyAgLy8vIFRoZSBvcGVyYW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldCwgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgYnJhbmNoCisgIGludCBCcmFuY2hUYXJnZXQ7CisgIC8vLyBUaGUgb3BlcmFuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzb3VyY2UsIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIG1vdmUKKyAgaW50IE1vdmVTb3VyY2U7CisgIC8vLyBUaGUgb3BlcmFuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YXJnZXQsIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIG1vdmUKKyAgaW50IE1vdmVUYXJnZXQ7CisgIAorICAvLy8gVGhlIHJlc3VsdCBvZiB0aGUgdG9rZW5pemUoKSBmdW5jdGlvbgorICBDYWNoZWRSZXN1bHQgVG9rZW5pemVSZXN1bHQ7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8RURUb2tlbio+IHRva3ZlY190OworICAvLy8gVGhlIGluc3RydWN0aW9uJ3MgdG9rZW5zCisgIHRva3ZlY190IFRva2VuczsKKyAgCisgIC8vLyBDb25zdHJ1Y3RvciAtIGluaXRpYWxpemVzIGFuIGluc3RydWN0aW9uIGdpdmVuIHRoZSBvdXRwdXQgb2YgdGhlIExMVk0KKyAgLy8vICAgQysrIGRpc2Fzc2VtYmxlcgorICAvLy8KKyAgLy8vIEBhcmcgaW5zdCAgICAgICAgIC0gVGhlIE1DSW5zdCwgd2hpY2ggd2lsbCBub3cgYmUgb3duZWQgYnkgdGhpcyBvYmplY3QKKyAgLy8vIEBhcmcgYnl0ZVNpemUgICAgIC0gVGhlIHNpemUgb2YgdGhlIGNvbnN1bWVkIGluc3RydWN0aW9uLCBpbiBieXRlcworICAvLy8gQGFyZyBkaXNhc3NlbWJsZXIgLSBUaGUgcGFyZW50IGRpc2Fzc2VtYmxlcgorICAvLy8gQGFyZyBpbnN0SW5mbyAgICAgLSBUaGUgaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gcHJvZHVjZWQgYnkgdGhlIHRhYmxlCisgIC8vLyAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvciBmb3IgdGhpcyBpbnN0cnVjdGlvbgorICBFREluc3QobGx2bTo6TUNJbnN0ICppbnN0LAorICAgICAgICAgdWludDY0X3QgYnl0ZVNpemUsCisgICAgICAgICBFRERpc2Fzc2VtYmxlciAmZGlzYXNzZW1ibGVyLAorICAgICAgICAgY29uc3QgbGx2bTo6RURJbnN0SW5mbyAqaW5zdEluZm8pOworICB+RURJbnN0KCk7CisgIAorICAvLy8gYnl0ZVNpemUgLSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYnkgdGhlIG1hY2hpbmUgY29kZQorICAvLy8gICByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgdWludDY0X3QgYnl0ZVNpemUoKTsKKyAgLy8vIGluc3RJRCAtIHJldHVybnMgdGhlIExMVk0gaW5zdHJ1Y3Rpb24gSUQgb2YgdGhlIGluc3RydWN0aW9uCisgIHVuc2lnbmVkIGluc3RJRCgpOworICAKKyAgLy8vIHN0cmluZ2lmeSAtIHBvcHVsYXRlcyB0aGUgU3RyaW5nIGFuZCBBc21TdHJpbmcgbWVtYmVycyBvZiB0aGUgaW5zdHJ1Y3Rpb24sCisgIC8vLyAgIHJldHVybmluZyAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb3RoZXJ3aXNlCisgIGludCBzdHJpbmdpZnkoKTsKKyAgLy8vIGdldFN0cmluZyAtIHJldHJpZXZlcyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgLy8vICAgaW5zdHJ1Y3Rpbm9uLCByZXR1cm5pbmcgMCBvbiBzdWNjZXNzIG9yIC0xIG90aGVyd2lzZQorICAvLy8KKyAgLy8vIEBhcmcgc3RyIC0gQSByZWZlcmVuY2UgdG8gYSBwb2ludGVyIHRoYXQsIG9uIHN1Y2Nlc3MsIGlzIHNldCB0byBwb2ludCB0bworICAvLy8gICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbjsgdGhpcyBzdHJpbmcgaXMgc3RpbGwgb3duZWQKKyAgLy8vICAgYnkgdGhlIGluc3RydWN0aW9uIGFuZCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiBpdCBpcworICBpbnQgZ2V0U3RyaW5nKGNvbnN0IGNoYXIgKiZzdHIpOworICAKKyAgLy8vIGlzQnJhbmNoIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIGJyYW5jaAorICBib29sIGlzQnJhbmNoKCk7CisgIC8vLyBpc01vdmUgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgbW92ZQorICBib29sIGlzTW92ZSgpOworICAKKyAgLy8vIHBhcnNlT3BlcmFuZHMgLSBwb3B1bGF0ZXMgdGhlIE9wZXJhbmRzIG1lbWJlciBvZiB0aGUgaW5zdHJ1Y3Rpb24sCisgIC8vLyAgIHJldHVybmluZyAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb3RoZXJ3aXNlCisgIGludCBwYXJzZU9wZXJhbmRzKCk7CisgIC8vLyBicmFuY2hUYXJnZXRJRCAtIHJldHVybnMgdGhlIElEIChzdWl0YWJsZSBmb3IgdXNlIHdpdGggZ2V0T3BlcmFuZCgpKSBvZiAKKyAgLy8vICAgdGhlIHRhcmdldCBvcGVyYW5kIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIGJyYW5jaCwgb3IgLTEgb3RoZXJ3aXNlCisgIGludCBicmFuY2hUYXJnZXRJRCgpOworICAvLy8gbW92ZVNvdXJjZUlEIC0gcmV0dXJucyB0aGUgSUQgb2YgdGhlIHNvdXJjZSBvcGVyYW5kIGlmIHRoZSBpbnN0cnVjdGlvbgorICAvLy8gICBpcyBhIG1vdmUsIG9yIC0xIG90aGVyd2lzZQorICBpbnQgbW92ZVNvdXJjZUlEKCk7CisgIC8vLyBtb3ZlVGFyZ2V0SUQgLSByZXR1cm5zIHRoZSBJRCBvZiB0aGUgdGFyZ2V0IG9wZXJhbmQgaWYgdGhlIGluc3RydWN0aW9uCisgIC8vLyAgIGlzIGEgbW92ZSwgb3IgLTEgb3RoZXJ3aXNlCisgIGludCBtb3ZlVGFyZ2V0SUQoKTsKKyAgCisgIC8vLyBudW1PcGVyYW5kcyAtIHJldHVybnMgdGhlIG51bWJlciBvZiBvcGVyYW5kcyBhdmFpbGFibGUgdG8gcmV0cmlldmUsIG9yIC0xCisgIC8vLyAgIG9uIGVycm9yCisgIGludCBudW1PcGVyYW5kcygpOworICAvLy8gZ2V0T3BlcmFuZCAtIHJldHJpZXZlcyBhbiBvcGVyYW5kIGZyb20gdGhlIGluc3RydWN0aW9uJ3Mgb3BlcmFuZCBsaXN0IGJ5CisgIC8vLyAgIGluZGV4LCByZXR1cm5pbmcgMCBvbiBzdWNjZXNzIG9yIC0xIG9uIGVycm9yCisgIC8vLworICAvLy8gQGFyZyBvcGVyYW5kICAtIEEgcmVmZXJlbmNlIHdob3NlIHRhcmdldCBpcyBwb2ludGVkIGF0IHRoZSBvcGVyYW5kIG9uCisgIC8vLyAgICAgICAgICAgICAgICAgc3VjY2VzcywgYWx0aG91Z2ggdGhlIG9wZXJhbmQgaXMgc3RpbGwgb3duZWQgYnkgdGhlIEVESW5zdAorICAvLy8gQGFyZyBpbmRleCAgICAtIFRoZSBpbmRleCBvZiB0aGUgb3BlcmFuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24KKyAgaW50IGdldE9wZXJhbmQoRURPcGVyYW5kIComb3BlcmFuZCwgdW5zaWduZWQgaW50IGluZGV4KTsKKworICAvLy8gdG9rZW5pemUgLSBwb3B1bGF0ZXMgdGhlIFRva2VucyBtZW1iZXIgb2YgdGhlIGluc3RydWN0aW9uLCByZXR1cm5pbmcgMCBvbgorICAvLy8gICBzdWNjZXNzIG9yIC0xIG90aGVyd2lzZQorICBpbnQgdG9rZW5pemUoKTsKKyAgLy8vIG51bVRva2VucyAtIHJldHVybnMgdGhlIG51bWJlciBvZiB0b2tlbnMgaW4gdGhlIGluc3RydWN0aW9uLCBvciAtMSBvbgorICAvLy8gICBlcnJvcgorICBpbnQgbnVtVG9rZW5zKCk7CisgIC8vLyBnZXRUb2tlbiAtIHJldHJpZXZlcyBhIHRva2VuIGZyb20gdGhlIGluc3RydWN0aW9uJ3MgdG9rZW4gbGlzdCBieSBpbmRleCwKKyAgLy8vICAgcmV0dXJuaW5nIDAgb24gc3VjY2VzcyBvciAtMSBvbiBlcnJvcgorICAvLy8KKyAgLy8vIEBhcmcgdG9rZW4gIC0gQSByZWZlcmVuY2Ugd2hvc2UgdGFyZ2V0IGlzIHBvaW50ZWQgYXQgdGhlIHRva2VuIG9uIHN1Y2Nlc3MsCisgIC8vLyAgICAgICAgICAgICAgIGFsdGhvdWdoIHRoZSB0b2tlbiBpcyBzdGlsbCBvd25lZCBieSB0aGUgRURJbnN0CisgIC8vLyBAYXJnIGluZGV4ICAtIFRoZSBpbmRleCBvZiB0aGUgdG9rZW4gaW4gdGhlIGluc3RyY3V0aW5vCisgIGludCBnZXRUb2tlbihFRFRva2VuIComdG9rZW4sIHVuc2lnbmVkIGludCBpbmRleCk7CisKKyNpZmRlZiBfX0JMT0NLU19fCisgIC8vLyB2aXNpdFRva2VucyAtIFZpc2l0cyBlYWNoIHRva2VuIGluIHR1cm4gYW5kIGFwcGxpZXMgYSBibG9jayB0byBpdCwKKyAgLy8vICAgcmV0dXJuaW5nIDAgaWYgYWxsIGJsb2NrcyBhcmUgdmlzaXRlZCBhbmQvb3IgdGhlIGJsb2NrIHNpZ25hbHMKKyAgLy8vICAgdGVybWluYXRpb24gYnkgcmV0dXJuaW5nIDE7IHJldHVybnMgLTEgb24gZXJyb3IKKyAgLy8vCisgIC8vLyBAYXJnIHZpc2l0b3IgIC0gVGhlIHZpc2l0b3IgYmxvY2sgdG8gYXBwbHkgdG8gYWxsIHRva2Vucy4KKyAgaW50IHZpc2l0VG9rZW5zKEVEVG9rZW5WaXNpdG9yX3QgdmlzaXRvcik7CisjZW5kaWYKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01DRGlzYXNzZW1ibGVyL0VET3BlcmFuZC5jcHAgYi9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRURPcGVyYW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWVkMTIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DRGlzYXNzZW1ibGVyL0VET3BlcmFuZC5jcHAKQEAgLTAsMCArMSwyODIgQEAKKy8vPT09LS0gRURPcGVyYW5kLmNwcCAtIExMVk0gRW5oYW5jZWQgRGlzYXNzZW1ibGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBFbmhhbmNlZCBEaXNhc3NlbWJseSBsaWJyYXJ5J3Mgb3BlcmFuZCBjbGFzcy4gIFRoZQorLy8gb3BlcmFuZCBpcyByZXNwb25zaWJsZSBmb3IgYWxsb3dpbmcgZXZhbHVhdGlvbiBnaXZlbiBhIHBhcnRpY3VsYXIgcmVnaXN0ZXIgCisvLyBjb250ZXh0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJFRE9wZXJhbmQuaCIKKyNpbmNsdWRlICJFRERpc2Fzc2VtYmxlci5oIgorI2luY2x1ZGUgIkVESW5zdC5oIgorI2luY2x1ZGUgImxsdm0vTUMvRURJbnN0SW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworRURPcGVyYW5kOjpFRE9wZXJhbmQoY29uc3QgRUREaXNhc3NlbWJsZXIgJmRpc2Fzc2VtYmxlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVESW5zdCAmaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICZtY09wSW5kZXgpIDoKKyAgRGlzYXNzZW1ibGVyKGRpc2Fzc2VtYmxlciksCisgIEluc3QoaW5zdCksCisgIE9wSW5kZXgob3BJbmRleCksCisgIE1DT3BJbmRleChtY09wSW5kZXgpIHsKKyAgdW5zaWduZWQgaW50IG51bU1DT3BlcmFuZHMgPSAwOworICAgIAorICBpZiAoRGlzYXNzZW1ibGVyLktleS5BcmNoID09IFRyaXBsZTo6eDg2IHx8CisgICAgICBEaXNhc3NlbWJsZXIuS2V5LkFyY2ggPT0gVHJpcGxlOjp4ODZfNjQpIHsKKyAgICB1aW50OF90IG9wZXJhbmRUeXBlID0gaW5zdC5UaGlzSW5zdEluZm8tPm9wZXJhbmRUeXBlc1tvcEluZGV4XTsKKyAgICAKKyAgICBzd2l0Y2ggKG9wZXJhbmRUeXBlKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga09wZXJhbmRUeXBlSW1tZWRpYXRlOgorICAgICAgbnVtTUNPcGVyYW5kcyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVJlZ2lzdGVyOgorICAgICAgbnVtTUNPcGVyYW5kcyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVg4Nk1lbW9yeToKKyAgICAgIG51bU1DT3BlcmFuZHMgPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBrT3BlcmFuZFR5cGVYODZFZmZlY3RpdmVBZGRyZXNzOgorICAgICAgbnVtTUNPcGVyYW5kcyA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVg4NlBDUmVsYXRpdmU6CisgICAgICBudW1NQ09wZXJhbmRzID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChEaXNhc3NlbWJsZXIuS2V5LkFyY2ggPT0gVHJpcGxlOjphcm0gfHwKKyAgICAgICAgICAgRGlzYXNzZW1ibGVyLktleS5BcmNoID09IFRyaXBsZTo6dGh1bWIpIHsKKyAgICB1aW50OF90IG9wZXJhbmRUeXBlID0gaW5zdC5UaGlzSW5zdEluZm8tPm9wZXJhbmRUeXBlc1tvcEluZGV4XTsKKyAgICAKKyAgICBzd2l0Y2ggKG9wZXJhbmRUeXBlKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIGtPcGVyYW5kVHlwZUFSTVJlZ2lzdGVyTGlzdDoKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga09wZXJhbmRUeXBlSW1tZWRpYXRlOgorICAgIGNhc2Uga09wZXJhbmRUeXBlUmVnaXN0ZXI6CisgICAgY2FzZSBrT3BlcmFuZFR5cGVBUk1CcmFuY2hUYXJnZXQ6CisgICAgY2FzZSBrT3BlcmFuZFR5cGVBUk1Tb0ltbToKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iMlNvSW1tOgorICAgIGNhc2Uga09wZXJhbmRUeXBlQVJNU29JbW0yUGFydDoKKyAgICBjYXNlIGtPcGVyYW5kVHlwZUFSTVByZWRpY2F0ZToKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iSVRNYXNrOgorICAgIGNhc2Uga09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW04T2Zmc2V0OgorICAgIGNhc2Uga09wZXJhbmRUeXBlQVJNVEJBZGRyTW9kZToKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlSW1tOHM0T2Zmc2V0OgorICAgICAgbnVtTUNPcGVyYW5kcyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iMlNvUmVnOgorICAgIGNhc2Uga09wZXJhbmRUeXBlQVJNQWRkck1vZGUyT2Zmc2V0OgorICAgIGNhc2Uga09wZXJhbmRUeXBlQVJNQWRkck1vZGUzT2Zmc2V0OgorICAgIGNhc2Uga09wZXJhbmRUeXBlQVJNQWRkck1vZGU0OgorICAgIGNhc2Uga09wZXJhbmRUeXBlQVJNQWRkck1vZGU1OgorICAgIGNhc2Uga09wZXJhbmRUeXBlQVJNQWRkck1vZGVQQzoKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlSW1tODoKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlSW1tMTI6CisgICAgY2FzZSBrT3BlcmFuZFR5cGVUaHVtYjJBZGRyTW9kZUltbThzNDoKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVSUjoKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVTUDoKKyAgICAgIG51bU1DT3BlcmFuZHMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrT3BlcmFuZFR5cGVBUk1Tb1JlZzoKKyAgICBjYXNlIGtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMjoKKyAgICBjYXNlIGtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMzoKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlU29SZWc6CisgICAgY2FzZSBrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUzE6CisgICAgY2FzZSBrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUzI6CisgICAgY2FzZSBrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUzQ6CisgICAgY2FzZSBrT3BlcmFuZFR5cGVBUk1BZGRyTW9kZTZPZmZzZXQ6CisgICAgICBudW1NQ09wZXJhbmRzID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga09wZXJhbmRUeXBlQVJNQWRkck1vZGU2OgorICAgICAgbnVtTUNPcGVyYW5kcyA9IDQ7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgICAKKyAgbWNPcEluZGV4ICs9IG51bU1DT3BlcmFuZHM7Cit9CisKK0VET3BlcmFuZDo6fkVET3BlcmFuZCgpIHsKK30KKworaW50IEVET3BlcmFuZDo6ZXZhbHVhdGUodWludDY0X3QgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVEUmVnaXN0ZXJSZWFkZXJDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykgeworICB1aW50OF90IG9wZXJhbmRUeXBlID0gSW5zdC5UaGlzSW5zdEluZm8tPm9wZXJhbmRUeXBlc1tPcEluZGV4XTsKKyAgCisgIHN3aXRjaCAoRGlzYXNzZW1ibGVyLktleS5BcmNoKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIC0xOyAgCisgIGNhc2UgVHJpcGxlOjp4ODY6CisgIGNhc2UgVHJpcGxlOjp4ODZfNjQ6ICAgIAorICAgIHN3aXRjaCAob3BlcmFuZFR5cGUpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0xOworICAgIGNhc2Uga09wZXJhbmRUeXBlSW1tZWRpYXRlOgorICAgICAgcmVzdWx0ID0gSW5zdC5JbnN0LT5nZXRPcGVyYW5kKE1DT3BJbmRleCkuZ2V0SW1tKCk7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIGtPcGVyYW5kVHlwZVJlZ2lzdGVyOgorICAgIHsKKyAgICAgIHVuc2lnbmVkIHJlZyA9IEluc3QuSW5zdC0+Z2V0T3BlcmFuZChNQ09wSW5kZXgpLmdldFJlZygpOworICAgICAgcmV0dXJuIGNhbGxiYWNrKCZyZXN1bHQsIHJlZywgYXJnKTsKKyAgICB9CisgICAgY2FzZSBrT3BlcmFuZFR5cGVYODZQQ1JlbGF0aXZlOgorICAgIHsKKyAgICAgIGludDY0X3QgZGlzcGxhY2VtZW50ID0gSW5zdC5JbnN0LT5nZXRPcGVyYW5kKE1DT3BJbmRleCkuZ2V0SW1tKCk7CisgICAgICAgIAorICAgICAgdWludDY0X3QgcmlwVmFsOworICAgICAgICAKKyAgICAgIC8vIFRPRE8gZml4IGhvdyB3ZSBkbyB0aGlzCisgICAgICAgIAorICAgICAgaWYgKGNhbGxiYWNrKCZyaXBWYWwsIERpc2Fzc2VtYmxlci5yZWdpc3RlcklEV2l0aE5hbWUoIlJJUCIpLCBhcmcpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIAorICAgICAgcmVzdWx0ID0gcmlwVmFsICsgZGlzcGxhY2VtZW50OworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNhc2Uga09wZXJhbmRUeXBlWDg2TWVtb3J5OgorICAgIGNhc2Uga09wZXJhbmRUeXBlWDg2RWZmZWN0aXZlQWRkcmVzczogIAorICAgIHsKKyAgICAgIHVuc2lnbmVkIGJhc2VSZWcgPSBJbnN0Lkluc3QtPmdldE9wZXJhbmQoTUNPcEluZGV4KS5nZXRSZWcoKTsKKyAgICAgIHVpbnQ2NF90IHNjYWxlQW1vdW50ID0gSW5zdC5JbnN0LT5nZXRPcGVyYW5kKE1DT3BJbmRleCsxKS5nZXRJbW0oKTsKKyAgICAgIHVuc2lnbmVkIGluZGV4UmVnID0gSW5zdC5JbnN0LT5nZXRPcGVyYW5kKE1DT3BJbmRleCsyKS5nZXRSZWcoKTsKKyAgICAgIGludDY0X3QgZGlzcGxhY2VtZW50ID0gSW5zdC5JbnN0LT5nZXRPcGVyYW5kKE1DT3BJbmRleCszKS5nZXRJbW0oKTsKKyAgICAgIC8vdW5zaWduZWQgc2VnbWVudFJlZyA9IEluc3QuSW5zdC0+Z2V0T3BlcmFuZChNQ09wSW5kZXgrNCkuZ2V0UmVnKCk7CisgICAgICAKKyAgICAgIHVpbnQ2NF90IGFkZHIgPSAwOworICAgICAgICAKKyAgICAgIGlmIChiYXNlUmVnKSB7CisgICAgICAgIHVpbnQ2NF90IGJhc2VWYWw7CisgICAgICAgIGlmIChjYWxsYmFjaygmYmFzZVZhbCwgYmFzZVJlZywgYXJnKSkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGFkZHIgKz0gYmFzZVZhbDsKKyAgICAgIH0KKyAgICAgICAgCisgICAgICBpZiAoaW5kZXhSZWcpIHsKKyAgICAgICAgdWludDY0X3QgaW5kZXhWYWw7CisgICAgICAgIGlmIChjYWxsYmFjaygmaW5kZXhWYWwsIGluZGV4UmVnLCBhcmcpKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYWRkciArPSAoc2NhbGVBbW91bnQgKiBpbmRleFZhbCk7CisgICAgICB9CisgICAgICAgCisgICAgICBhZGRyICs9IGRpc3BsYWNlbWVudDsKKyAgICAgICAKKyAgICAgIHJlc3VsdCA9IGFkZHI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRyaXBsZTo6YXJtOgorICBjYXNlIFRyaXBsZTo6dGh1bWI6CisgICAgc3dpdGNoIChvcGVyYW5kVHlwZSkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLTE7CisgICAgY2FzZSBrT3BlcmFuZFR5cGVJbW1lZGlhdGU6CisgICAgICByZXN1bHQgPSBJbnN0Lkluc3QtPmdldE9wZXJhbmQoTUNPcEluZGV4KS5nZXRJbW0oKTsKKyAgICAgIHJldHVybiAwOworICAgIGNhc2Uga09wZXJhbmRUeXBlUmVnaXN0ZXI6CisgICAgeworICAgICAgdW5zaWduZWQgcmVnID0gSW5zdC5JbnN0LT5nZXRPcGVyYW5kKE1DT3BJbmRleCkuZ2V0UmVnKCk7CisgICAgICByZXR1cm4gY2FsbGJhY2soJnJlc3VsdCwgcmVnLCBhcmcpOworICAgIH0KKyAgICBjYXNlIGtPcGVyYW5kVHlwZUFSTUJyYW5jaFRhcmdldDoKKyAgICB7CisgICAgICBpbnQ2NF90IGRpc3BsYWNlbWVudCA9IEluc3QuSW5zdC0+Z2V0T3BlcmFuZChNQ09wSW5kZXgpLmdldEltbSgpOworICAgICAgCisgICAgICB1aW50NjRfdCBwY1ZhbDsKKyAgICAgIAorICAgICAgaWYgKGNhbGxiYWNrKCZwY1ZhbCwgRGlzYXNzZW1ibGVyLnJlZ2lzdGVySURXaXRoTmFtZSgiUEMiKSwgYXJnKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgCisgICAgICByZXN1bHQgPSBwY1ZhbCArIGRpc3BsYWNlbWVudDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHJldHVybiAtMTsKK30KKworaW50IEVET3BlcmFuZDo6aXNSZWdpc3RlcigpIHsKKyAgcmV0dXJuKEluc3QuVGhpc0luc3RJbmZvLT5vcGVyYW5kRmxhZ3NbT3BJbmRleF0gPT0ga09wZXJhbmRUeXBlUmVnaXN0ZXIpOworfQorCit1bnNpZ25lZCBFRE9wZXJhbmQ6OnJlZ1ZhbCgpIHsKKyAgcmV0dXJuIEluc3QuSW5zdC0+Z2V0T3BlcmFuZChNQ09wSW5kZXgpLmdldFJlZygpOyAKK30KKworaW50IEVET3BlcmFuZDo6aXNJbW1lZGlhdGUoKSB7CisgIHJldHVybihJbnN0LlRoaXNJbnN0SW5mby0+b3BlcmFuZEZsYWdzW09wSW5kZXhdID09IGtPcGVyYW5kVHlwZUltbWVkaWF0ZSk7Cit9CisKK3VpbnQ2NF90IEVET3BlcmFuZDo6aW1tZWRpYXRlVmFsKCkgeworICByZXR1cm4gSW5zdC5JbnN0LT5nZXRPcGVyYW5kKE1DT3BJbmRleCkuZ2V0SW1tKCk7Cit9CisKK2ludCBFRE9wZXJhbmQ6OmlzTWVtb3J5KCkgeworICB1aW50OF90IG9wZXJhbmRUeXBlID0gSW5zdC5UaGlzSW5zdEluZm8tPm9wZXJhbmRUeXBlc1tPcEluZGV4XTsKKyAgICAKKyAgc3dpdGNoIChvcGVyYW5kVHlwZSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiAwOworICBjYXNlIGtPcGVyYW5kVHlwZVg4Nk1lbW9yeToKKyAgY2FzZSBrT3BlcmFuZFR5cGVYODZQQ1JlbGF0aXZlOgorICBjYXNlIGtPcGVyYW5kVHlwZVg4NkVmZmVjdGl2ZUFkZHJlc3M6CisgIGNhc2Uga09wZXJhbmRUeXBlQVJNU29SZWc6CisgIGNhc2Uga09wZXJhbmRUeXBlQVJNU29JbW06CisgIGNhc2Uga09wZXJhbmRUeXBlQVJNQWRkck1vZGUyOgorICBjYXNlIGtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMk9mZnNldDoKKyAgY2FzZSBrT3BlcmFuZFR5cGVBUk1BZGRyTW9kZTM6CisgIGNhc2Uga09wZXJhbmRUeXBlQVJNQWRkck1vZGUzT2Zmc2V0OgorICBjYXNlIGtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNDoKKyAgY2FzZSBrT3BlcmFuZFR5cGVBUk1BZGRyTW9kZTU6CisgIGNhc2Uga09wZXJhbmRUeXBlQVJNQWRkck1vZGU2OgorICBjYXNlIGtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlUEM6CisgIGNhc2Uga09wZXJhbmRUeXBlQVJNQnJhbmNoVGFyZ2V0OgorICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVTMToKKyAgY2FzZSBrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUzI6CisgIGNhc2Uga09wZXJhbmRUeXBlVGh1bWJBZGRyTW9kZVM0OgorICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVSUjoKKyAgY2FzZSBrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlU1A6CisgIGNhc2Uga09wZXJhbmRUeXBlVGh1bWIyU29JbW06CisgIGNhc2Uga09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW04OgorICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlSW1tOE9mZnNldDoKKyAgY2FzZSBrT3BlcmFuZFR5cGVUaHVtYjJBZGRyTW9kZUltbTEyOgorICBjYXNlIGtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlU29SZWc6CisgIGNhc2Uga09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW04czQ6CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworI2lmZGVmIF9fQkxPQ0tTX18KK3N0cnVjdCBSZWdpc3RlclJlYWRlcldyYXBwZXIgeworICBFRE9wZXJhbmQ6OkVEUmVnaXN0ZXJCbG9ja190IHJlZ0Jsb2NrOworfTsKKworaW50IHJlYWRlcldyYXBwZXJDYWxsYmFjayh1aW50NjRfdCAqdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZWdJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykgeworICBzdHJ1Y3QgUmVnaXN0ZXJSZWFkZXJXcmFwcGVyICp3cmFwcGVyID0gKHN0cnVjdCBSZWdpc3RlclJlYWRlcldyYXBwZXIgKilhcmc7CisgIHJldHVybiB3cmFwcGVyLT5yZWdCbG9jayh2YWx1ZSwgcmVnSUQpOworfQorCitpbnQgRURPcGVyYW5kOjpldmFsdWF0ZSh1aW50NjRfdCAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgRURSZWdpc3RlckJsb2NrX3QgcmVnQmxvY2spIHsKKyAgc3RydWN0IFJlZ2lzdGVyUmVhZGVyV3JhcHBlciB3cmFwcGVyOworICB3cmFwcGVyLnJlZ0Jsb2NrID0gcmVnQmxvY2s7CisgIHJldHVybiBldmFsdWF0ZShyZXN1bHQsIAorICAgICAgICAgICAgICAgICAgcmVhZGVyV3JhcHBlckNhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICh2b2lkKikmd3JhcHBlcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FRE9wZXJhbmQuaCBiL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FRE9wZXJhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY5NTIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DRGlzYXNzZW1ibGVyL0VET3BlcmFuZC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vPT09LUVET3BlcmFuZC5oIC0gTExWTSBFbmhhbmNlZCBEaXNhc3NlbWJsZXIgLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBFbmhhbmNlZCBEaXNhc3NlbWJseSBsaWJyYXJ5J3MgCisvLyBvcGVyYW5kIGNsYXNzLiAgVGhlIG9wZXJhbmQgaXMgcmVzcG9uc2libGUgZm9yIGFsbG93aW5nIGV2YWx1YXRpb24gZ2l2ZW4gYQorLy8gcGFydGljdWxhciByZWdpc3RlciBjb250ZXh0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FRE9QRVJBTkRfSAorI2RlZmluZSBMTFZNX0VET1BFUkFORF9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgRUREaXNhc3NlbWJsZXI7CitzdHJ1Y3QgRURJbnN0OworICAKK3R5cGVkZWYgaW50ICgqRURSZWdpc3RlclJlYWRlckNhbGxiYWNrKSh1aW50NjRfdCAqdmFsdWUsIHVuc2lnbmVkIHJlZ0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcmcpOworCisKKy8vLyBFRE9wZXJhbmQgLSBFbmNhcHN1bGF0ZXMgYSBzaW5nbGUgb3BlcmFuZCwgd2hpY2ggY2FuIGJlIGV2YWx1YXRlZCBieSB0aGUKKy8vLyAgIGNsaWVudAorc3RydWN0IEVET3BlcmFuZCB7CisgIC8vLyBUaGUgcGFyZW50IGRpc2Fzc2VtYmxlcgorICBjb25zdCBFRERpc2Fzc2VtYmxlciAmRGlzYXNzZW1ibGVyOworICAvLy8gVGhlIHBhcmVudCBpbnN0cnVjdGlvbgorICBjb25zdCBFREluc3QgJkluc3Q7CisgIAorICAvLy8gVGhlIGluZGV4IG9mIHRoZSBvcGVyYW5kIGluIHRoZSBFREluc3QKKyAgdW5zaWduZWQgaW50IE9wSW5kZXg7CisgIC8vLyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgb3BlcmFuZCBpbiB0aGUgTUNJbnN0CisgIHVuc2lnbmVkIGludCBNQ09wSW5kZXg7CisgIAorICAvLy8gQ29uc3RydWN0b3IgLSBJbml0aWFsaXplcyBhbiBFRE9wZXJhbmQKKyAgLy8vCisgIC8vLyBAYXJnIGRpc2Fzc2VtYmxlciAtIFRoZSBkaXNhc3NlbWJsZXIgcmVzcG9uc2libGUgZm9yIHRoZSBvcGVyYW5kCisgIC8vLyBAYXJnIGluc3QgICAgICAgICAtIFRoZSBpbnN0cnVjdGlvbiBjb250YWluaW5nIHRoaXMgb3BlcmFuZAorICAvLy8gQGFyZyBvcEluZGV4ICAgICAgLSBUaGUgaW5kZXggb2YgdGhlIG9wZXJhbmQgaW4gaW5zdAorICAvLy8gQGFyZyBtY09wSW5kZXggICAgLSBUaGUgaW5kZXggb2YgdGhlIG9wZXJhbmQgaW4gdGhlIG9yaWdpbmFsIE1DSW5zdAorICBFRE9wZXJhbmQoY29uc3QgRUREaXNhc3NlbWJsZXIgJmRpc2Fzc2VtYmxlciwKKyAgICAgICAgICAgIGNvbnN0IEVESW5zdCAmaW5zdCwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcEluZGV4LAorICAgICAgICAgICAgdW5zaWduZWQgaW50ICZtY09wSW5kZXgpOworICB+RURPcGVyYW5kKCk7CisgIAorICAvLy8gZXZhbHVhdGUgLSBSZXR1cm5zIHRoZSBudW1lcmljIHZhbHVlIG9mIGFuIG9wZXJhbmQgdG8gdGhlIGV4dGVudCBwb3NzaWJsZSwKKyAgLy8vICAgcmV0dXJuaW5nIDAgb24gc3VjY2VzcyBvciAtMSBpZiB0aGVyZSB3YXMgc29tZSBwcm9ibGVtIChzdWNoIGFzIGEgCisgIC8vLyAgIHJlZ2lzdGVyIG5vdCBiZWluZyByZWFkYWJsZSkKKyAgLy8vCisgIC8vLyBAYXJnIHJlc3VsdCAgIC0gQSByZWZlcmVuY2Ugd2hvc2UgdGFyZ2V0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZSBvZgorICAvLy8gICAgICAgICAgICAgICAgIHRoZSBvcGVyYW5kICh0aGUgYWRkcmVzcyBpZiBpdCBpcyBhIG1lbW9yeSBvcGVyYW5kKQorICAvLy8gQGFyZyBjYWxsYmFjayAtIEEgZnVuY3Rpb24gdG8gY2FsbCB0byBvYnRhaW4gcmVnaXN0ZXIgdmFsdWVzCisgIC8vLyBAYXJnIGFyZyAgICAgIC0gQW4gb3BhcXVlIGFyZ3VtZW50IHRvIHBhc3MgdG8gY2FsbGJhY2sKKyAgaW50IGV2YWx1YXRlKHVpbnQ2NF90ICZyZXN1bHQsCisgICAgICAgICAgICAgICBFRFJlZ2lzdGVyUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICB2b2lkICphcmcpOworCisgIC8vLyBpc1JlZ2lzdGVyIC0gUmV0dXJucyAxIGlmIHRoZSBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIgb3IgMCBvdGhlcndpc2UKKyAgaW50IGlzUmVnaXN0ZXIoKTsKKyAgLy8vIHJlZ1ZhbCAtIFJldHVybnMgdGhlIHJlZ2lzdGVyIHZhbHVlLgorICB1bnNpZ25lZCByZWdWYWwoKTsKKyAgCisgIC8vLyBpc0ltbWVkaWF0ZSAtIFJldHVybnMgMSBpZiB0aGUgb3BlcmFuZCBpcyBhbiBpbW1lZGlhdGUgb3IgMCBvdGhlcndpc2UKKyAgaW50IGlzSW1tZWRpYXRlKCk7CisgIC8vLyBpbW1lZGlhdGVWYWwgLSBSZXR1cm5zIHRoZSBpbW1lZGlhdGUgdmFsdWUuCisgIHVpbnQ2NF90IGltbWVkaWF0ZVZhbCgpOworICAKKyAgLy8vIGlzTWVtb3J5IC0gUmV0dXJucyAxIGlmIHRoZSBvcGVyYW5kIGlzIGEgbWVtb3J5IGxvY2F0aW9uIG9yIDAgb3RoZXJ3aXNlCisgIGludCBpc01lbW9yeSgpOworICAKKyNpZmRlZiBfX0JMT0NLU19fCisgIHR5cGVkZWYgaW50ICheRURSZWdpc3RlckJsb2NrX3QpKHVpbnQ2NF90ICp2YWx1ZSwgdW5zaWduZWQgcmVnSUQpOworCisgIC8vLyBldmFsdWF0ZSAtIExpa2UgZXZhbHVhdGUgZm9yIGEgY2FsbGJhY2ssIGJ1dCB1c2VzIGEgYmxvY2sgaW5zdGVhZAorICBpbnQgZXZhbHVhdGUodWludDY0X3QgJnJlc3VsdCwKKyAgICAgICAgICAgICAgIEVEUmVnaXN0ZXJCbG9ja190IHJlZ0Jsb2NrKTsKKyNlbmRpZgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRURUb2tlbi5jcHAgYi9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRURUb2tlbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwZTE2NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FRFRva2VuLmNwcApAQCAtMCwwICsxLDIwNiBAQAorLy89PT0tLSBFRFRva2VuLmNwcCAtIExMVk0gRW5oYW5jZWQgRGlzYXNzZW1ibGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEVuaGFuY2VkIERpc2Fzc2VtYmxlciBsaWJyYXJ5J3MgdG9rZW4gY2xhc3MuICBUaGUKKy8vIHRva2VuIGlzIHJlc3BvbnNpYmxlIGZvciB2ZW5kaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0b2tlbiwgc3VjaCBhcyBpdHMKKy8vIHR5cGUgYW5kIGxvZ2ljYWwgdmFsdWUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkVEVG9rZW4uaCIKKyNpbmNsdWRlICJFRERpc2Fzc2VtYmxlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNBc21MZXhlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNQYXJzZWRBc21PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitFRFRva2VuOjpFRFRva2VuKFN0cmluZ1JlZiBzdHIsCisgICAgICAgICAgICAgICAgIGVudW0gdG9rZW5UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGxvY2FsVHlwZSwKKyAgICAgICAgICAgICAgICAgRUREaXNhc3NlbWJsZXIgJmRpc2Fzc2VtYmxlcikgOgorICBEaXNhc3NlbWJsZXIoZGlzYXNzZW1ibGVyKSwKKyAgU3RyKHN0ciksCisgIFR5cGUodHlwZSksCisgIExvY2FsVHlwZShsb2NhbFR5cGUpLAorICBPcGVyYW5kSUQoLTEpIHsKK30KKworRURUb2tlbjo6fkVEVG9rZW4oKSB7Cit9CisKK3ZvaWQgRURUb2tlbjo6bWFrZUxpdGVyYWwoYm9vbCBzaWduLCB1aW50NjRfdCBhYnNvbHV0ZVZhbHVlKSB7CisgIFR5cGUgPSBrVG9rZW5MaXRlcmFsOworICBMaXRlcmFsU2lnbiA9IHNpZ247CisgIExpdGVyYWxBYnNvbHV0ZVZhbHVlID0gYWJzb2x1dGVWYWx1ZTsKK30KKwordm9pZCBFRFRva2VuOjptYWtlUmVnaXN0ZXIodW5zaWduZWQgcmVnaXN0ZXJJRCkgeworICBUeXBlID0ga1Rva2VuUmVnaXN0ZXI7CisgIFJlZ2lzdGVySUQgPSByZWdpc3RlcklEOworfQorCit2b2lkIEVEVG9rZW46OnNldE9wZXJhbmRJRChpbnQgb3BlcmFuZElEKSB7CisgIE9wZXJhbmRJRCA9IG9wZXJhbmRJRDsKK30KKworZW51bSBFRFRva2VuOjp0b2tlblR5cGUgRURUb2tlbjo6dHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIFR5cGU7Cit9CisKK3VpbnQ2NF90IEVEVG9rZW46OmxvY2FsVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIExvY2FsVHlwZTsKK30KKworU3RyaW5nUmVmIEVEVG9rZW46OnN0cmluZygpIGNvbnN0IHsKKyAgcmV0dXJuIFN0cjsKK30KKworaW50IEVEVG9rZW46Om9wZXJhbmRJRCgpIGNvbnN0IHsKKyAgcmV0dXJuIE9wZXJhbmRJRDsKK30KKworaW50IEVEVG9rZW46OmxpdGVyYWxTaWduKCkgY29uc3QgeworICBpZiAoVHlwZSAhPSBrVG9rZW5MaXRlcmFsKQorICAgIHJldHVybiAtMTsKKyAgcmV0dXJuIChMaXRlcmFsU2lnbiA/IDEgOiAwKTsKK30KKworaW50IEVEVG9rZW46OmxpdGVyYWxBYnNvbHV0ZVZhbHVlKHVpbnQ2NF90ICZ2YWx1ZSkgY29uc3QgeworICBpZiAoVHlwZSAhPSBrVG9rZW5MaXRlcmFsKQorICAgIHJldHVybiAtMTsKKyAgdmFsdWUgPSBMaXRlcmFsQWJzb2x1dGVWYWx1ZTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFRFRva2VuOjpyZWdpc3RlcklEKHVuc2lnbmVkICZyZWdpc3RlcklEKSBjb25zdCB7CisgIGlmIChUeXBlICE9IGtUb2tlblJlZ2lzdGVyKQorICAgIHJldHVybiAtMTsKKyAgcmVnaXN0ZXJJRCA9IFJlZ2lzdGVySUQ7CisgIHJldHVybiAwOworfQorCitpbnQgRURUb2tlbjo6dG9rZW5pemUoc3RkOjp2ZWN0b3I8RURUb2tlbio+ICZ0b2tlbnMsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcGVyYW5kT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgRUREaXNhc3NlbWJsZXIgJmRpc2Fzc2VtYmxlcikgeworICBTbWFsbFZlY3RvcjxNQ1BhcnNlZEFzbU9wZXJhbmQqLCA1PiBwYXJzZWRPcGVyYW5kczsKKyAgU21hbGxWZWN0b3I8QXNtVG9rZW4sIDEwPiBhc21Ub2tlbnM7CisgIAorICBpZiAoZGlzYXNzZW1ibGVyLnBhcnNlSW5zdChwYXJzZWRPcGVyYW5kcywgYXNtVG9rZW5zLCBzdHIpKQorICAgIHJldHVybiAtMTsKKyAgCisgIFNtYWxsVmVjdG9ySW1wbDxNQ1BhcnNlZEFzbU9wZXJhbmQqPjo6aXRlcmF0b3Igb3BlcmFuZEl0ZXJhdG9yOworICB1bnNpZ25lZCBpbnQgb3BlcmFuZEluZGV4OworICBTbWFsbFZlY3RvckltcGw8QXNtVG9rZW4+OjppdGVyYXRvciB0b2tlbkl0ZXJhdG9yOworICAKKyAgb3BlcmFuZEl0ZXJhdG9yID0gcGFyc2VkT3BlcmFuZHMuYmVnaW4oKTsKKyAgb3BlcmFuZEluZGV4ID0gMDsKKyAgCisgIGJvb2wgcmVhZE9wY29kZSA9IGZhbHNlOworICAKKyAgY29uc3QgY2hhciAqd3NQb2ludGVyID0gYXNtVG9rZW5zLmJlZ2luKCktPmdldExvYygpLmdldFBvaW50ZXIoKTsKKyAgCisgIGZvciAodG9rZW5JdGVyYXRvciA9IGFzbVRva2Vucy5iZWdpbigpOworICAgICAgIHRva2VuSXRlcmF0b3IgIT0gYXNtVG9rZW5zLmVuZCgpOworICAgICAgICsrdG9rZW5JdGVyYXRvcikgeworICAgIFNNTG9jIHRva2VuTG9jID0gdG9rZW5JdGVyYXRvci0+Z2V0TG9jKCk7CisgICAgCisgICAgY29uc3QgY2hhciAqdG9rZW5Qb2ludGVyID0gdG9rZW5Mb2MuZ2V0UG9pbnRlcigpOworICAgIAorICAgIGlmICh0b2tlblBvaW50ZXIgPiB3c1BvaW50ZXIpIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgd3NMZW5ndGggPSB0b2tlblBvaW50ZXIgLSB3c1BvaW50ZXI7CisgICAgICAKKyAgICAgIEVEVG9rZW4gKndoaXRlc3BhY2VUb2tlbiA9IG5ldyBFRFRva2VuKFN0cmluZ1JlZih3c1BvaW50ZXIsIHdzTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEVG9rZW46OmtUb2tlbldoaXRlc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNzZW1ibGVyKTsKKyAgICAgIAorICAgICAgdG9rZW5zLnB1c2hfYmFjayh3aGl0ZXNwYWNlVG9rZW4pOworICAgIH0KKyAgICAKKyAgICB3c1BvaW50ZXIgPSB0b2tlblBvaW50ZXIgKyB0b2tlbkl0ZXJhdG9yLT5nZXRTdHJpbmcoKS5zaXplKCk7CisgICAgCisgICAgd2hpbGUgKG9wZXJhbmRJdGVyYXRvciAhPSBwYXJzZWRPcGVyYW5kcy5lbmQoKSAmJgorICAgICAgICAgICB0b2tlbkxvYy5nZXRQb2ludGVyKCkgPiAKKyAgICAgICAgICAgKCpvcGVyYW5kSXRlcmF0b3IpLT5nZXRFbmRMb2MoKS5nZXRQb2ludGVyKCkpIHsKKyAgICAgICsrb3BlcmFuZEl0ZXJhdG9yOworICAgICAgKytvcGVyYW5kSW5kZXg7CisgICAgfQorICAgIAorICAgIEVEVG9rZW4gKnRva2VuOworICAgIAorICAgIHN3aXRjaCAodG9rZW5JdGVyYXRvci0+Z2V0S2luZCgpKSB7CisgICAgY2FzZSBBc21Ub2tlbjo6SWRlbnRpZmllcjoKKyAgICAgIGlmICghcmVhZE9wY29kZSkgeworICAgICAgICB0b2tlbiA9IG5ldyBFRFRva2VuKHRva2VuSXRlcmF0b3ItPmdldFN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEVG9rZW46OmtUb2tlbk9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpdG9rZW5JdGVyYXRvci0+Z2V0S2luZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Fzc2VtYmxlcik7CisgICAgICAgIHJlYWRPcGNvZGUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIGFueSBpZGVudGlmaWVyIHRoYXQgaXNuJ3QgYW4gb3Bjb2RlIGlzIG1lcmUgcHVuY3R1YXRpb247IHNvIHdlIGZhbGwKKyAgICAgIC8vIHRocm91Z2gKKyAgICBkZWZhdWx0OgorICAgICAgdG9rZW4gPSBuZXcgRURUb2tlbih0b2tlbkl0ZXJhdG9yLT5nZXRTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRURUb2tlbjo6a1Rva2VuUHVuY3R1YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCl0b2tlbkl0ZXJhdG9yLT5nZXRLaW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Fzc2VtYmxlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFzbVRva2VuOjpJbnRlZ2VyOgorICAgIHsKKyAgICAgIHRva2VuID0gbmV3IEVEVG9rZW4odG9rZW5JdGVyYXRvci0+Z2V0U3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVEVG9rZW46OmtUb2tlbkxpdGVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCl0b2tlbkl0ZXJhdG9yLT5nZXRLaW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Fzc2VtYmxlcik7CisgICAgICAgIAorICAgICAgaW50NjRfdCBpbnRWYWwgPSB0b2tlbkl0ZXJhdG9yLT5nZXRJbnRWYWwoKTsKKyAgICAgIAorICAgICAgaWYgKGludFZhbCA8IDApICAKKyAgICAgICAgdG9rZW4tPm1ha2VMaXRlcmFsKHRydWUsIC1pbnRWYWwpOworICAgICAgZWxzZQorICAgICAgICB0b2tlbi0+bWFrZUxpdGVyYWwoZmFsc2UsIGludFZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBc21Ub2tlbjo6UmVnaXN0ZXI6CisgICAgeworICAgICAgdG9rZW4gPSBuZXcgRURUb2tlbih0b2tlbkl0ZXJhdG9yLT5nZXRTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRURUb2tlbjo6a1Rva2VuTGl0ZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KXRva2VuSXRlcmF0b3ItPmdldEtpbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNzZW1ibGVyKTsKKyAgICAgIAorICAgICAgdG9rZW4tPm1ha2VSZWdpc3RlcigodW5zaWduZWQpdG9rZW5JdGVyYXRvci0+Z2V0UmVnVmFsKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAob3BlcmFuZEl0ZXJhdG9yICE9IHBhcnNlZE9wZXJhbmRzLmVuZCgpICYmCisgICAgICAgdG9rZW5Mb2MuZ2V0UG9pbnRlcigpID49IAorICAgICAgICgqb3BlcmFuZEl0ZXJhdG9yKS0+Z2V0U3RhcnRMb2MoKS5nZXRQb2ludGVyKCkpIHsKKyAgICAgIC8vLyBvcGVyYW5kSW5kZXggPT0gMCBtZWFucyB0aGUgb3BlcmFuZCBpcyB0aGUgaW5zdHJ1Y3Rpb24gKHdoaWNoIHRoZQorICAgICAgLy8vIEFzbVBhcnNlciB0cmVhdHMgYXMgYW4gb3BlcmFuZCBidXQgZWRpcyBkb2VzIG5vdCkuICBXZSB0aGVyZWZvcmUgc2tpcAorICAgICAgLy8vIG9wZXJhbmRJbmRleCA9PSAwIGFuZCBzdWJ0cmFjdCAxIGZyb20gYWxsIG90aGVyIG9wZXJhbmQgaW5kaWNlcy4KKyAgICAgIAorICAgICAgaWYgKG9wZXJhbmRJbmRleCA+IDApCisgICAgICAgIHRva2VuLT5zZXRPcGVyYW5kSUQob3BlcmFuZE9yZGVyW29wZXJhbmRJbmRleCAtIDFdKTsKKyAgICB9CisgICAgCisgICAgdG9rZW5zLnB1c2hfYmFjayh0b2tlbik7CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCitpbnQgRURUb2tlbjo6Z2V0U3RyaW5nKGNvbnN0IGNoYXIqJiBidWYpIHsKKyAgaWYgKFBlcm1TdHIubGVuZ3RoKCkgPT0gMCkgeworICAgIFBlcm1TdHIgPSBTdHIuc3RyKCk7CisgIH0KKyAgYnVmID0gUGVybVN0ci5jX3N0cigpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ0Rpc2Fzc2VtYmxlci9FRFRva2VuLmggYi9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRURUb2tlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMmFlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNEaXNhc3NlbWJsZXIvRURUb2tlbi5oCkBAIC0wLDAgKzEsMTM5IEBACisvLz09PS1FRFRva2VuLmggLSBMTFZNIEVuaGFuY2VkIERpc2Fzc2VtYmxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgRW5oYW5jZWQgRGlzYXNzZW1ibHkgbGlicmFyeSdzIHRva2VuCisvLyBjbGFzcy4gIFRoZSB0b2tlbiBpcyByZXNwb25zaWJsZSBmb3IgdmVuZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdG9rZW4sIAorLy8gc3VjaCBhcyBpdHMgdHlwZSBhbmQgbG9naWNhbCB2YWx1ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRURUT0tFTl9ICisjZGVmaW5lIExMVk1fRURUT0tFTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisgIAorc3RydWN0IEVERGlzYXNzZW1ibGVyOworCisvLy8gRURUb2tlbiAtIEVuY2Fwc3VsYXRlcyBhIHNpbmdsZSB0b2tlbiwgd2hpY2ggY2FuIHByb3ZpZGUgYSBzdHJpbmcKKy8vLyAgIHJlcHJlc2VudGF0aW9uIG9mIGl0c2VsZiBvciBpbnRlcnByZXQgaXRzZWxmIGluIHZhcmlvdXMgd2F5cywgZGVwZW5kaW5nCisvLy8gICBvbiB0aGUgdG9rZW4gdHlwZS4KK3N0cnVjdCBFRFRva2VuIHsKKyAgZW51bSB0b2tlblR5cGUgeworICAgIGtUb2tlbldoaXRlc3BhY2UsCisgICAga1Rva2VuT3Bjb2RlLAorICAgIGtUb2tlbkxpdGVyYWwsCisgICAga1Rva2VuUmVnaXN0ZXIsCisgICAga1Rva2VuUHVuY3R1YXRpb24KKyAgfTsKKyAgCisgIC8vLyBUaGUgcGFyZW50IGRpc2Fzc2VtYmxlcgorICBFRERpc2Fzc2VtYmxlciAmRGlzYXNzZW1ibGVyOworCisgIC8vLyBUaGUgdG9rZW4ncyBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgbGx2bTo6U3RyaW5nUmVmIFN0cjsKKyAgLy8vIFRoZSB0b2tlbidzIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYnV0IGluIGEgZm9ybSBzdWl0YWJsZSBmb3IgZXhwb3J0CisgIHN0ZDo6c3RyaW5nIFBlcm1TdHI7CisgIC8vLyBUaGUgdHlwZSBvZiB0aGUgdG9rZW4sIGFzIGV4cG9zZWQgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgQVBJCisgIGVudW0gdG9rZW5UeXBlIFR5cGU7CisgIC8vLyBUaGUgdHlwZSBvZiB0aGUgdG9rZW4sIGFzIHJlY29yZGVkIGJ5IHRoZSBzeW50YXgtc3BlY2lmaWMgdG9rZW5pemVyCisgIHVpbnQ2NF90IExvY2FsVHlwZTsKKyAgLy8vIFRoZSBvcGVyYW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRva2VuLCBvciAodW5zaWduZWQgaW50KS0xIGlmIG5vdAorICAvLy8gICBwYXJ0IG9mIGFuIG9wZXJhbmQuCisgIGludCBPcGVyYW5kSUQ7CisgIAorICAvLy8gVGhlIHNpZ24gaWYgdGhlIHRva2VuIGlzIGEgbGl0ZXJhbCAoMSBpZiBuZWdhdGl2ZSwgMCBvdGhlcndpc2UpCisgIGJvb2wgTGl0ZXJhbFNpZ247CisgIC8vLyBUaGUgYWJzb2x1dGUgdmFsdWUgaWYgdGhlIHRva2VuIGlzIGEgbGl0ZXJhbAorICB1aW50NjRfdCBMaXRlcmFsQWJzb2x1dGVWYWx1ZTsKKyAgLy8vIFRoZSBMTFZNIHJlZ2lzdGVyIElEIGlmIHRoZSB0b2tlbiBpcyBhIHJlZ2lzdGVyIG5hbWUKKyAgdW5zaWduZWQgUmVnaXN0ZXJJRDsKKyAgCisgIC8vLyBDb25zdHJ1Y3RvciAtIEluaXRpYWxpemVzIGFuIEVEVG9rZW4gd2l0aCB0aGUgaW5mb3JtYXRpb24gY29tbW9uIHRvIGFsbAorICAvLy8gICB0b2tlbnMKKyAgLy8vCisgIC8vLyBAYXJnIHN0ciAgICAgICAgICAtIFRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgdG9rZW4KKyAgLy8vIEBhcmcgdHlwZSAgICAgICAgIC0gVGhlIHRva2VuJ3MgdHlwZSBhcyBleHBvc2VkIHRocm91Z2ggdGhlIHB1YmxpYyBBUEkKKyAgLy8vIEBhcmcgbG9jYWxUeXBlICAgIC0gVGhlIHRva2VuJ3MgdHlwZSBhcyByZWNvcmRlZCBieSB0aGUgdG9rZW5pemVyCisgIC8vLyBAYXJnIGRpc2Fzc2VtYmxlciAtIFRoZSBkaXNhc3NlbWJsZXIgcmVzcG9uc2libGUgZm9yIHRoZSB0b2tlbgorICBFRFRva2VuKGxsdm06OlN0cmluZ1JlZiBzdHIsCisgICAgICAgICAgZW51bSB0b2tlblR5cGUgdHlwZSwKKyAgICAgICAgICB1aW50NjRfdCBsb2NhbFR5cGUsCisgICAgICAgICAgRUREaXNhc3NlbWJsZXIgJmRpc2Fzc2VtYmxlcik7CisgIAorICAvLy8gbWFrZUxpdGVyYWwgLSBBZGRzIHRoZSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIGxpdGVyYWwKKyAgLy8vIEBhcmcgc2lnbiAgICAgICAgICAgLSBUaGUgc2lnbiBvZiB0aGUgbGl0ZXJhbCAoMSBpZiBuZWdhdGl2ZSwgMCAKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UpCisgIC8vLworICAvLy8gQGFyZyBhYnNvbHV0ZVZhbHVlICAtIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgbGl0ZXJhbAorICB2b2lkIG1ha2VMaXRlcmFsKGJvb2wgc2lnbiwgdWludDY0X3QgYWJzb2x1dGVWYWx1ZSk7CisgIC8vLyBtYWtlUmVnaXN0ZXIgLSBBZGRzIHRoZSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIHJlZ2lzdGVyCisgIC8vLworICAvLy8gQGFyZyByZWdpc3RlcklEIC0gVGhlIExMVk0gcmVnaXN0ZXIgSUQKKyAgdm9pZCBtYWtlUmVnaXN0ZXIodW5zaWduZWQgcmVnaXN0ZXJJRCk7CisgIAorICAvLy8gc2V0T3BlcmFuZElEIC0gTGlua3MgdGhlIHRva2VuIHRvIGEgbnVtYmVyZWQgb3BlcmFuZAorICAvLy8KKyAgLy8vIEBhcmcgb3BlcmFuZElEICAtIFRoZSBvcGVyYW5kIElEIHRvIGxpbmsgdG8KKyAgdm9pZCBzZXRPcGVyYW5kSUQoaW50IG9wZXJhbmRJRCk7CisgIAorICB+RURUb2tlbigpOworICAKKyAgLy8vIHR5cGUgLSBSZXR1cm5zIHRoZSBwdWJsaWMgdHlwZSBvZiB0aGUgdG9rZW4KKyAgZW51bSB0b2tlblR5cGUgdHlwZSgpIGNvbnN0OworICAvLy8gbG9jYWxUeXBlIC0gUmV0dXJucyB0aGUgdG9rZW5pemVyLXNwZWNpZmljIHR5cGUgb2YgdGhlIHRva2VuCisgIHVpbnQ2NF90IGxvY2FsVHlwZSgpIGNvbnN0OworICAvLy8gc3RyaW5nIC0gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbgorICBsbHZtOjpTdHJpbmdSZWYgc3RyaW5nKCkgY29uc3Q7CisgIC8vLyBvcGVyYW5kSUQgLSBSZXR1cm5zIHRoZSBvcGVyYW5kIElEIG9mIHRoZSB0b2tlbgorICBpbnQgb3BlcmFuZElEKCkgY29uc3Q7CisgIAorICAvLy8gbGl0ZXJhbFNpZ24gLSBSZXR1cm5zIHRoZSBzaWduIG9mIHRoZSB0b2tlbiAKKyAgLy8vICAgKDEgaWYgbmVnYXRpdmUsIDAgaWYgcG9zaXRpdmUgb3IgdW5zaWduZWQsIC0xIGlmIGl0IGlzIG5vdCBhIGxpdGVyYWwpCisgIGludCBsaXRlcmFsU2lnbigpIGNvbnN0OworICAvLy8gbGl0ZXJhbEFic29sdXRlVmFsdWUgLSBSZXRyaWV2ZXMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0b2tlbiwgYW5kCisgIC8vLyAgIHJldHVybnMgLTEgaWYgdGhlIHRva2VuIGlzIG5vdCBhIGxpdGVyYWwKKyAgLy8vIEBhcmcgdmFsdWUgIC0gQSByZWZlcmVuY2UgdG8gYSB2YWx1ZSB0aGF0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBhYnNvbHV0ZQorICAvLy8gICAgICAgICAgICAgICB2YWx1ZSwgaWYgaXQgaXMgdmFsaWQKKyAgaW50IGxpdGVyYWxBYnNvbHV0ZVZhbHVlKHVpbnQ2NF90ICZ2YWx1ZSkgY29uc3Q7CisgIC8vLyByZWdpc3RlcklEIC0gUmV0cmlldmVzIHRoZSByZWdpc3RlciBJRCBvZiB0aGUgdG9rZW4sIGFuZCByZXR1cm5zIC0xIGlmIHRoZQorICAvLy8gICB0b2tlbiBpcyBub3QgYSByZWdpc3RlcgorICAvLy8KKyAgLy8vIEBhcmcgcmVnaXN0ZXJJRCAtIEEgcmVmZXJlbmNlIHRvIGEgdmFsdWUgdGhhdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgCisgIC8vLyAgICAgICAgICAgICAgICAgICByZWdpc3RlciBJRCwgaWYgaXQgaXMgdmFsaWQKKyAgaW50IHJlZ2lzdGVySUQodW5zaWduZWQgJnJlZ2lzdGVySUQpIGNvbnN0OworICAKKyAgLy8vIHRva2VuaXplIC0gVG9rZW5pemVzIGEgc3RyaW5nIHVzaW5nIHRoZSBwbGF0Zm9ybS0gYW5kIHN5bnRheC1zcGVjaWZpYworICAvLy8gICB0b2tlbml6ZXIsIGFuZCByZXR1cm5zIDAgb24gc3VjY2VzcyAoLTEgb24gZmFpbHVyZSkKKyAgLy8vCisgIC8vLyBAYXJnIHRva2VucyAgICAgICAtIEEgdmVjdG9yIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBwb2ludGVycyB0bworICAvLy8gICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgdG9rZW5zCisgIC8vLyBAYXJnIHN0ciAgICAgICAgICAtIFRoZSBzdHJpbmcsIGFzIG91dHB1dHRlZCBieSB0aGUgQXNtUHJpbnRlcgorICAvLy8gQGFyZyBvcGVyYW5kT3JkZXIgLSBUaGUgb3JkZXIgb2YgdGhlIG9wZXJhbmRzIGZyb20gdGhlIG9wZXJhbmRGbGFncyBhcnJheQorICAvLy8gICAgICAgICAgICAgICAgICAgICBhcyB0aGV5IGFwcGVhciBpbiBzdHIKKyAgLy8vIEBhcmcgZGlzYXNzZW1ibGVyIC0gVGhlIGRpc2Fzc2VtYmxlciBmb3IgdGhlIGRlc2lyZWQgdGFyZ2V0IGFuZAorICAvLyAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJseSBzeW50YXgKKyAgc3RhdGljIGludCB0b2tlbml6ZShzdGQ6OnZlY3RvcjxFRFRva2VuKj4gJnRva2VucywKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmc3RyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wZXJhbmRPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBFRERpc2Fzc2VtYmxlciAmZGlzYXNzZW1ibGVyKTsKKyAgCisgIC8vLyBnZXRTdHJpbmcgLSBEaXJlY3RzIGEgY2hhcmFjdGVyIHBvaW50ZXIgdG8gdGhlIHN0cmluZywgcmV0dXJuaW5nIDAgb24KKyAgLy8vICAgc3VjY2VzcyAoLTEgb24gZmFpbHVyZSkKKyAgLy8vIEBhcmcgYnVmICAtIEEgcmVmZXJlbmNlIHRvIGEgcG9pbnRlciB0aGF0IGlzIHNldCB0byBwb2ludCB0byB0aGUgc3RyaW5nLgorICAvLy8gICBUaGUgc3RyaW5nIGlzIHN0aWxsIG93bmVkIGJ5IHRoZSB0b2tlbi4KKyAgaW50IGdldFN0cmluZyhjb25zdCBjaGFyKiYgYnVmKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ0V4cHIuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DRXhwci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzZjMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ0V4cHIuY3BwCkBAIC0wLDAgKzEsMzgyIEBACisvLz09PS0gTUNFeHByLmNwcCAtIEFzc2VtYmx5IExldmVsIEV4cHJlc3Npb24gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgIm1jZXhwciIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1N3aXRjaC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21MYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNzZW1ibGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtQmFja2VuZC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CituYW1lc3BhY2Ugc3RhdHMgeworU1RBVElTVElDKE1DRXhwckV2YWx1YXRlLCAiTnVtYmVyIG9mIE1DRXhwciBldmFsdWF0aW9ucyIpOworfQorfQorCit2b2lkIE1DRXhwcjo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgIGNhc2UgTUNFeHByOjpUYXJnZXQ6CisgICAgcmV0dXJuIGNhc3Q8TUNUYXJnZXRFeHByPih0aGlzKS0+UHJpbnRJbXBsKE9TKTsKKyAgY2FzZSBNQ0V4cHI6OkNvbnN0YW50OgorICAgIE9TIDw8IGNhc3Q8TUNDb25zdGFudEV4cHI+KCp0aGlzKS5nZXRWYWx1ZSgpOworICAgIHJldHVybjsKKworICBjYXNlIE1DRXhwcjo6U3ltYm9sUmVmOiB7CisgICAgY29uc3QgTUNTeW1ib2xSZWZFeHByICZTUkUgPSBjYXN0PE1DU3ltYm9sUmVmRXhwcj4oKnRoaXMpOworICAgIGNvbnN0IE1DU3ltYm9sICZTeW0gPSBTUkUuZ2V0U3ltYm9sKCk7CisKKyAgICBpZiAoU1JFLmdldEtpbmQoKSA9PSBNQ1N5bWJvbFJlZkV4cHI6OlZLX0FSTV9ISTE2IHx8CisgICAgICAgIFNSRS5nZXRLaW5kKCkgPT0gTUNTeW1ib2xSZWZFeHByOjpWS19BUk1fTE8xNikKKyAgICAgIE9TIDw8IE1DU3ltYm9sUmVmRXhwcjo6Z2V0VmFyaWFudEtpbmROYW1lKFNSRS5nZXRLaW5kKCkpOworCisgICAgLy8gUGFyZW50aGVzaXplIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCAkIHNvIHRoYXQgdGhleSBkb24ndCBsb29rIGxpa2UKKyAgICAvLyBhYnNvbHV0ZSBuYW1lcy4KKyAgICBpZiAoU3ltLmdldE5hbWUoKVswXSA9PSAnJCcpCisgICAgICBPUyA8PCAnKCcgPDwgU3ltIDw8ICcpJzsKKyAgICBlbHNlCisgICAgICBPUyA8PCBTeW07CisKKyAgICBpZiAoU1JFLmdldEtpbmQoKSAhPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX05vbmUgJiYKKyAgICAgICAgU1JFLmdldEtpbmQoKSAhPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX0FSTV9ISTE2ICYmCisgICAgICAgIFNSRS5nZXRLaW5kKCkgIT0gTUNTeW1ib2xSZWZFeHByOjpWS19BUk1fTE8xNikKKyAgICAgIE9TIDw8ICdAJyA8PCBNQ1N5bWJvbFJlZkV4cHI6OmdldFZhcmlhbnRLaW5kTmFtZShTUkUuZ2V0S2luZCgpKTsKKworICAgIHJldHVybjsKKyAgfQorCisgIGNhc2UgTUNFeHByOjpVbmFyeTogeworICAgIGNvbnN0IE1DVW5hcnlFeHByICZVRSA9IGNhc3Q8TUNVbmFyeUV4cHI+KCp0aGlzKTsKKyAgICBzd2l0Y2ggKFVFLmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIkludmFsaWQgb3Bjb2RlISIpOworICAgIGNhc2UgTUNVbmFyeUV4cHI6OkxOb3Q6ICBPUyA8PCAnISc7IGJyZWFrOworICAgIGNhc2UgTUNVbmFyeUV4cHI6Ok1pbnVzOiBPUyA8PCAnLSc7IGJyZWFrOworICAgIGNhc2UgTUNVbmFyeUV4cHI6Ok5vdDogICBPUyA8PCAnfic7IGJyZWFrOworICAgIGNhc2UgTUNVbmFyeUV4cHI6OlBsdXM6ICBPUyA8PCAnKyc7IGJyZWFrOworICAgIH0KKyAgICBPUyA8PCAqVUUuZ2V0U3ViRXhwcigpOworICAgIHJldHVybjsKKyAgfQorCisgIGNhc2UgTUNFeHByOjpCaW5hcnk6IHsKKyAgICBjb25zdCBNQ0JpbmFyeUV4cHIgJkJFID0gY2FzdDxNQ0JpbmFyeUV4cHI+KCp0aGlzKTsKKworICAgIC8vIE9ubHkgcHJpbnQgcGFyZW5zIGFyb3VuZCB0aGUgTEhTIGlmIGl0IGlzIG5vbi10cml2aWFsLgorICAgIGlmIChpc2E8TUNDb25zdGFudEV4cHI+KEJFLmdldExIUygpKSB8fCBpc2E8TUNTeW1ib2xSZWZFeHByPihCRS5nZXRMSFMoKSkpIHsKKyAgICAgIE9TIDw8ICpCRS5nZXRMSFMoKTsKKyAgICB9IGVsc2UgeworICAgICAgT1MgPDwgJygnIDw8ICpCRS5nZXRMSFMoKSA8PCAnKSc7CisgICAgfQorCisgICAgc3dpdGNoIChCRS5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJJbnZhbGlkIG9wY29kZSEiKTsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6QWRkOgorICAgICAgLy8gUHJpbnQgIlgtNDIiIGluc3RlYWQgb2YgIlgrLTQyIi4KKyAgICAgIGlmIChjb25zdCBNQ0NvbnN0YW50RXhwciAqUkhTQyA9IGR5bl9jYXN0PE1DQ29uc3RhbnRFeHByPihCRS5nZXRSSFMoKSkpIHsKKyAgICAgICAgaWYgKFJIU0MtPmdldFZhbHVlKCkgPCAwKSB7CisgICAgICAgICAgT1MgPDwgUkhTQy0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgT1MgPDwgICcrJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpBbmQ6ICBPUyA8PCAgJyYnOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6RGl2OiAgT1MgPDwgICcvJzsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OkVROiAgIE9TIDw8ICI9PSI7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpHVDogICBPUyA8PCAgJz4nOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6R1RFOiAgT1MgPDwgIj49IjsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OkxBbmQ6IE9TIDw8ICImJiI7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpMT3I6ICBPUyA8PCAifHwiOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6TFQ6ICAgT1MgPDwgICc8JzsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OkxURTogIE9TIDw8ICI8PSI7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpNb2Q6ICBPUyA8PCAgJyUnOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6TXVsOiAgT1MgPDwgICcqJzsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6Ok5FOiAgIE9TIDw8ICIhPSI7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpPcjogICBPUyA8PCAgJ3wnOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6U2hsOiAgT1MgPDwgIjw8IjsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OlNocjogIE9TIDw8ICI+PiI7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpTdWI6ICBPUyA8PCAgJy0nOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6WG9yOiAgT1MgPDwgICdeJzsgYnJlYWs7CisgICAgfQorCisgICAgLy8gT25seSBwcmludCBwYXJlbnMgYXJvdW5kIHRoZSBMSFMgaWYgaXQgaXMgbm9uLXRyaXZpYWwuCisgICAgaWYgKGlzYTxNQ0NvbnN0YW50RXhwcj4oQkUuZ2V0UkhTKCkpIHx8IGlzYTxNQ1N5bWJvbFJlZkV4cHI+KEJFLmdldFJIUygpKSkgeworICAgICAgT1MgPDwgKkJFLmdldFJIUygpOworICAgIH0gZWxzZSB7CisgICAgICBPUyA8PCAnKCcgPDwgKkJFLmdldFJIUygpIDw8ICcpJzsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIH0KKworICBhc3NlcnQoMCAmJiAiSW52YWxpZCBleHByZXNzaW9uIGtpbmQhIik7Cit9CisKK3ZvaWQgTUNFeHByOjpkdW1wKCkgY29uc3QgeworICBwcmludChkYmdzKCkpOworICBkYmdzKCkgPDwgJ1xuJzsKK30KKworLyogKioqICovCisKK2NvbnN0IE1DQmluYXJ5RXhwciAqTUNCaW5hcnlFeHByOjpDcmVhdGUoT3Bjb2RlIE9wYywgY29uc3QgTUNFeHByICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqUkhTLCBNQ0NvbnRleHQgJkN0eCkgeworICByZXR1cm4gbmV3IChDdHgpIE1DQmluYXJ5RXhwcihPcGMsIExIUywgUkhTKTsKK30KKworY29uc3QgTUNVbmFyeUV4cHIgKk1DVW5hcnlFeHByOjpDcmVhdGUoT3Bjb2RlIE9wYywgY29uc3QgTUNFeHByICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgcmV0dXJuIG5ldyAoQ3R4KSBNQ1VuYXJ5RXhwcihPcGMsIEV4cHIpOworfQorCitjb25zdCBNQ0NvbnN0YW50RXhwciAqTUNDb25zdGFudEV4cHI6OkNyZWF0ZShpbnQ2NF90IFZhbHVlLCBNQ0NvbnRleHQgJkN0eCkgeworICByZXR1cm4gbmV3IChDdHgpIE1DQ29uc3RhbnRFeHByKFZhbHVlKTsKK30KKworLyogKioqICovCisKK2NvbnN0IE1DU3ltYm9sUmVmRXhwciAqTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoY29uc3QgTUNTeW1ib2wgKlN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFudEtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgcmV0dXJuIG5ldyAoQ3R4KSBNQ1N5bWJvbFJlZkV4cHIoU3ltLCBLaW5kKTsKK30KKworY29uc3QgTUNTeW1ib2xSZWZFeHByICpNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShTdHJpbmdSZWYgTmFtZSwgVmFyaWFudEtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgcmV0dXJuIENyZWF0ZShDdHguR2V0T3JDcmVhdGVTeW1ib2woTmFtZSksIEtpbmQsIEN0eCk7Cit9CisKK1N0cmluZ1JlZiBNQ1N5bWJvbFJlZkV4cHI6OmdldFZhcmlhbnRLaW5kTmFtZShWYXJpYW50S2luZCBLaW5kKSB7CisgIHN3aXRjaCAoS2luZCkgeworICBkZWZhdWx0OgorICBjYXNlIFZLX0ludmFsaWQ6IHJldHVybiAiPDxpbnZhbGlkPj4iOworICBjYXNlIFZLX05vbmU6IHJldHVybiAiPDxub25lPj4iOworCisgIGNhc2UgVktfR09UOiByZXR1cm4gIkdPVCI7CisgIGNhc2UgVktfR09UT0ZGOiByZXR1cm4gIkdPVE9GRiI7CisgIGNhc2UgVktfR09UUENSRUw6IHJldHVybiAiR09UUENSRUwiOworICBjYXNlIFZLX0dPVFRQT0ZGOiByZXR1cm4gIkdPVFRQT0ZGIjsKKyAgY2FzZSBWS19JTkROVFBPRkY6IHJldHVybiAiSU5ETlRQT0ZGIjsKKyAgY2FzZSBWS19OVFBPRkY6IHJldHVybiAiTlRQT0ZGIjsKKyAgY2FzZSBWS19QTFQ6IHJldHVybiAiUExUIjsKKyAgY2FzZSBWS19UTFNHRDogcmV0dXJuICJUTFNHRCI7CisgIGNhc2UgVktfVFBPRkY6IHJldHVybiAiVFBPRkYiOworICBjYXNlIFZLX0FSTV9ISTE2OiByZXR1cm4gIjp1cHBlcjE2OiI7CisgIGNhc2UgVktfQVJNX0xPMTY6IHJldHVybiAiOmxvd2VyMTY6IjsKKyAgY2FzZSBWS19UTFZQOiByZXR1cm4gIlRMVlAiOworICB9Cit9CisKK01DU3ltYm9sUmVmRXhwcjo6VmFyaWFudEtpbmQKK01DU3ltYm9sUmVmRXhwcjo6Z2V0VmFyaWFudEtpbmRGb3JOYW1lKFN0cmluZ1JlZiBOYW1lKSB7CisgIHJldHVybiBTdHJpbmdTd2l0Y2g8VmFyaWFudEtpbmQ+KE5hbWUpCisgICAgLkNhc2UoIkdPVCIsIFZLX0dPVCkKKyAgICAuQ2FzZSgiR09UT0ZGIiwgVktfR09UT0ZGKQorICAgIC5DYXNlKCJHT1RQQ1JFTCIsIFZLX0dPVFBDUkVMKQorICAgIC5DYXNlKCJHT1RUUE9GRiIsIFZLX0dPVFRQT0ZGKQorICAgIC5DYXNlKCJJTkROVFBPRkYiLCBWS19JTkROVFBPRkYpCisgICAgLkNhc2UoIk5UUE9GRiIsIFZLX05UUE9GRikKKyAgICAuQ2FzZSgiUExUIiwgVktfUExUKQorICAgIC5DYXNlKCJUTFNHRCIsIFZLX1RMU0dEKQorICAgIC5DYXNlKCJUUE9GRiIsIFZLX1RQT0ZGKQorICAgIC5DYXNlKCJUTFZQIiwgVktfVExWUCkKKyAgICAuRGVmYXVsdChWS19JbnZhbGlkKTsKK30KKworLyogKioqICovCisKK3ZvaWQgTUNUYXJnZXRFeHByOjpBbmNob3IoKSB7fQorCisvKiAqKiogKi8KKworYm9vbCBNQ0V4cHI6OkV2YWx1YXRlQXNBYnNvbHV0ZShpbnQ2NF90ICZSZXMsIGNvbnN0IE1DQXNtTGF5b3V0ICpMYXlvdXQpIGNvbnN0IHsKKyAgTUNWYWx1ZSBWYWx1ZTsKKworICAvLyBGYXN0IHBhdGggY29uc3RhbnRzLgorICBpZiAoY29uc3QgTUNDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8TUNDb25zdGFudEV4cHI+KHRoaXMpKSB7CisgICAgUmVzID0gQ0UtPmdldFZhbHVlKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoIUV2YWx1YXRlQXNSZWxvY2F0YWJsZShWYWx1ZSwgTGF5b3V0KSB8fCAhVmFsdWUuaXNBYnNvbHV0ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBSZXMgPSBWYWx1ZS5nZXRDb25zdGFudCgpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgRXZhbHVhdGVTeW1ib2xpY0FkZChjb25zdCBNQ1ZhbHVlICZMSFMsY29uc3QgTUNTeW1ib2xSZWZFeHByICpSSFNfQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpSSFNfQiwgaW50NjRfdCBSSFNfQ3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1ZhbHVlICZSZXMpIHsKKyAgLy8gV2UgY2FuJ3QgYWRkIG9yIHN1YnRyYWN0IHR3byBzeW1ib2xzLgorICBpZiAoKExIUy5nZXRTeW1BKCkgJiYgUkhTX0EpIHx8CisgICAgICAoTEhTLmdldFN5bUIoKSAmJiBSSFNfQikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqQSA9IExIUy5nZXRTeW1BKCkgPyBMSFMuZ2V0U3ltQSgpIDogUkhTX0E7CisgIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqQiA9IExIUy5nZXRTeW1CKCkgPyBMSFMuZ2V0U3ltQigpIDogUkhTX0I7CisgIGlmIChCKSB7CisgICAgLy8gSWYgd2UgaGF2ZSBhIG5lZ2F0ZWQgc3ltYm9sLCB0aGVuIHdlIG11c3QgaGF2ZSBhbHNvIGhhdmUgYSBub24tbmVnYXRlZAorICAgIC8vIHN5bWJvbCBpbiBvcmRlciB0byBlbmNvZGUgdGhlIGV4cHJlc3Npb24uIFdlIGNhbiBkbyB0aGlzIGNoZWNrIGxhdGVyIHRvCisgICAgLy8gcGVybWl0IGV4cHJlc3Npb25zIHdoaWNoIGV2ZW50dWFsbHkgZm9sZCB0byBhIHJlcHJlc2VudGFibGUgZm9ybSAtLSBzdWNoCisgICAgLy8gYXMgKGEgKyAoMCAtIGIpKSAtLSBpZiBuZWNlc3NhcnkuCisgICAgaWYgKCFBKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFJlcyA9IE1DVmFsdWU6OmdldChBLCBCLCBMSFMuZ2V0Q29uc3RhbnQoKSArIFJIU19Dc3QpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNQ0V4cHI6OkV2YWx1YXRlQXNSZWxvY2F0YWJsZShNQ1ZhbHVlICZSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICpMYXlvdXQpIGNvbnN0IHsKKyAgKytzdGF0czo6TUNFeHByRXZhbHVhdGU7CisKKyAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgY2FzZSBUYXJnZXQ6CisgICAgcmV0dXJuIGNhc3Q8TUNUYXJnZXRFeHByPih0aGlzKS0+RXZhbHVhdGVBc1JlbG9jYXRhYmxlSW1wbChSZXMsIExheW91dCk7CisKKyAgY2FzZSBDb25zdGFudDoKKyAgICBSZXMgPSBNQ1ZhbHVlOjpnZXQoY2FzdDxNQ0NvbnN0YW50RXhwcj4odGhpcyktPmdldFZhbHVlKCkpOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgU3ltYm9sUmVmOiB7CisgICAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpTUkUgPSBjYXN0PE1DU3ltYm9sUmVmRXhwcj4odGhpcyk7CisgICAgY29uc3QgTUNTeW1ib2wgJlN5bSA9IFNSRS0+Z2V0U3ltYm9sKCk7CisKKyAgICAvLyBFdmFsdWF0ZSByZWN1cnNpdmVseSBpZiB0aGlzIGlzIGEgdmFyaWFibGUuCisgICAgaWYgKFN5bS5pc1ZhcmlhYmxlKCkpIHsKKyAgICAgIGlmICghU3ltLmdldFZhcmlhYmxlVmFsdWUoKS0+RXZhbHVhdGVBc1JlbG9jYXRhYmxlKFJlcywgTGF5b3V0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBBYnNvbHV0aXplIHN5bWJvbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRlZmluZWQgc3ltYm9scyB3aGVuIHdlIGhhdmUgYQorICAgICAgLy8gbGF5b3V0IG9iamVjdCBhbmQgdGhlIHRhcmdldCByZXF1ZXN0cyBpdC4KKyAgICAgIGlmIChMYXlvdXQgJiYgUmVzLmdldFN5bUIoKSAmJgorICAgICAgICAgIExheW91dC0+Z2V0QXNzZW1ibGVyKCkuZ2V0QmFja2VuZCgpLmhhc0Fic29sdXRpemVkU2V0KCkgJiYKKyAgICAgICAgICBSZXMuZ2V0U3ltQSgpLT5nZXRTeW1ib2woKS5pc0RlZmluZWQoKSAmJgorICAgICAgICAgIFJlcy5nZXRTeW1CKCktPmdldFN5bWJvbCgpLmlzRGVmaW5lZCgpKSB7CisgICAgICAgIE1DU3ltYm9sRGF0YSAmQSA9CisgICAgICAgICAgTGF5b3V0LT5nZXRBc3NlbWJsZXIoKS5nZXRTeW1ib2xEYXRhKFJlcy5nZXRTeW1BKCktPmdldFN5bWJvbCgpKTsKKyAgICAgICAgTUNTeW1ib2xEYXRhICZCID0KKyAgICAgICAgICBMYXlvdXQtPmdldEFzc2VtYmxlcigpLmdldFN5bWJvbERhdGEoUmVzLmdldFN5bUIoKS0+Z2V0U3ltYm9sKCkpOworICAgICAgICBSZXMgPSBNQ1ZhbHVlOjpnZXQoKyBMYXlvdXQtPmdldFN5bWJvbEFkZHJlc3MoJkEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtIExheW91dC0+Z2V0U3ltYm9sQWRkcmVzcygmQikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUmVzLmdldENvbnN0YW50KCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBSZXMgPSBNQ1ZhbHVlOjpnZXQoU1JFLCAwLCAwKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVW5hcnk6IHsKKyAgICBjb25zdCBNQ1VuYXJ5RXhwciAqQVVFID0gY2FzdDxNQ1VuYXJ5RXhwcj4odGhpcyk7CisgICAgTUNWYWx1ZSBWYWx1ZTsKKworICAgIGlmICghQVVFLT5nZXRTdWJFeHByKCktPkV2YWx1YXRlQXNSZWxvY2F0YWJsZShWYWx1ZSwgTGF5b3V0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAoQVVFLT5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgTUNVbmFyeUV4cHI6OkxOb3Q6CisgICAgICBpZiAoIVZhbHVlLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgUmVzID0gTUNWYWx1ZTo6Z2V0KCFWYWx1ZS5nZXRDb25zdGFudCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUNVbmFyeUV4cHI6Ok1pbnVzOgorICAgICAgLy8vIC0oYSAtIGIgKyBjb25zdCkgPT0+IChiIC0gYSAtIGNvbnN0KQorICAgICAgaWYgKFZhbHVlLmdldFN5bUEoKSAmJiAhVmFsdWUuZ2V0U3ltQigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBSZXMgPSBNQ1ZhbHVlOjpnZXQoVmFsdWUuZ2V0U3ltQigpLCBWYWx1ZS5nZXRTeW1BKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgLVZhbHVlLmdldENvbnN0YW50KCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNQ1VuYXJ5RXhwcjo6Tm90OgorICAgICAgaWYgKCFWYWx1ZS5pc0Fic29sdXRlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIFJlcyA9IE1DVmFsdWU6OmdldCh+VmFsdWUuZ2V0Q29uc3RhbnQoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1DVW5hcnlFeHByOjpQbHVzOgorICAgICAgUmVzID0gVmFsdWU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgQmluYXJ5OiB7CisgICAgY29uc3QgTUNCaW5hcnlFeHByICpBQkUgPSBjYXN0PE1DQmluYXJ5RXhwcj4odGhpcyk7CisgICAgTUNWYWx1ZSBMSFNWYWx1ZSwgUkhTVmFsdWU7CisKKyAgICBpZiAoIUFCRS0+Z2V0TEhTKCktPkV2YWx1YXRlQXNSZWxvY2F0YWJsZShMSFNWYWx1ZSwgTGF5b3V0KSB8fAorICAgICAgICAhQUJFLT5nZXRSSFMoKS0+RXZhbHVhdGVBc1JlbG9jYXRhYmxlKFJIU1ZhbHVlLCBMYXlvdXQpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gV2Ugb25seSBzdXBwb3J0IGEgZmV3IG9wZXJhdGlvbnMgb24gbm9uLWNvbnN0YW50IGV4cHJlc3Npb25zLCBoYW5kbGUKKyAgICAvLyB0aG9zZSBmaXJzdC4KKyAgICBpZiAoIUxIU1ZhbHVlLmlzQWJzb2x1dGUoKSB8fCAhUkhTVmFsdWUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICBzd2l0Y2ggKEFCRS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgTUNCaW5hcnlFeHByOjpTdWI6CisgICAgICAgIC8vIE5lZ2F0ZSBSSFMgYW5kIGFkZC4KKyAgICAgICAgcmV0dXJuIEV2YWx1YXRlU3ltYm9saWNBZGQoTEhTVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU1ZhbHVlLmdldFN5bUIoKSwgUkhTVmFsdWUuZ2V0U3ltQSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUkhTVmFsdWUuZ2V0Q29uc3RhbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzKTsKKworICAgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OkFkZDoKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRlU3ltYm9saWNBZGQoTEhTVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU1ZhbHVlLmdldFN5bUEoKSwgUkhTVmFsdWUuZ2V0U3ltQigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFNWYWx1ZS5nZXRDb25zdGFudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXMpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRhcmdldCBob29rcyBmb3IgdGhlIGV2YWx1YXRpb24uIEl0IG1heSBiZSBsaW1pdGVkIGluCisgICAgLy8gd2lkdGgsIGFuZCBnYXMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mIGNvbXBhcmlzb25zIGFuZCByaWdodCBzaGlmdHMKKyAgICAvLyBkaWZmZXJlbnRseSBmcm9tIEFwcGxlIGFzLgorICAgIGludDY0X3QgTEhTID0gTEhTVmFsdWUuZ2V0Q29uc3RhbnQoKSwgUkhTID0gUkhTVmFsdWUuZ2V0Q29uc3RhbnQoKTsKKyAgICBpbnQ2NF90IFJlc3VsdCA9IDA7CisgICAgc3dpdGNoIChBQkUtPmdldE9wY29kZSgpKSB7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OkFkZDogIFJlc3VsdCA9IExIUyArIFJIUzsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OkFuZDogIFJlc3VsdCA9IExIUyAmIFJIUzsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OkRpdjogIFJlc3VsdCA9IExIUyAvIFJIUzsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OkVROiAgIFJlc3VsdCA9IExIUyA9PSBSSFM7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpHVDogICBSZXN1bHQgPSBMSFMgPiBSSFM7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpHVEU6ICBSZXN1bHQgPSBMSFMgPj0gUkhTOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6TEFuZDogUmVzdWx0ID0gTEhTICYmIFJIUzsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OkxPcjogIFJlc3VsdCA9IExIUyB8fCBSSFM7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpMVDogICBSZXN1bHQgPSBMSFMgPCBSSFM7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpMVEU6ICBSZXN1bHQgPSBMSFMgPD0gUkhTOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6TW9kOiAgUmVzdWx0ID0gTEhTICUgUkhTOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6TXVsOiAgUmVzdWx0ID0gTEhTICogUkhTOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6TkU6ICAgUmVzdWx0ID0gTEhTICE9IFJIUzsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6Ok9yOiAgIFJlc3VsdCA9IExIUyB8IFJIUzsgYnJlYWs7CisgICAgY2FzZSBNQ0JpbmFyeUV4cHI6OlNobDogIFJlc3VsdCA9IExIUyA8PCBSSFM7IGJyZWFrOworICAgIGNhc2UgTUNCaW5hcnlFeHByOjpTaHI6ICBSZXN1bHQgPSBMSFMgPj4gUkhTOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6U3ViOiAgUmVzdWx0ID0gTEhTIC0gUkhTOyBicmVhazsKKyAgICBjYXNlIE1DQmluYXJ5RXhwcjo6WG9yOiAgUmVzdWx0ID0gTEhTIF4gUkhTOyBicmVhazsKKyAgICB9CisKKyAgICBSZXMgPSBNQ1ZhbHVlOjpnZXQoUmVzdWx0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB9CisKKyAgYXNzZXJ0KDAgJiYgIkludmFsaWQgYXNzZW1ibHkgZXhwcmVzc2lvbiBraW5kISIpOworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNJbnN0LmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ0luc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYjYyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNJbnN0LmNwcApAQCAtMCwwICsxLDY2IEBACisvLz09PS0gbGliL01DL01DSW5zdC5jcHAgLSBNQ0luc3QgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0UHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKwordm9pZCBNQ09wZXJhbmQ6OnByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNBc21JbmZvICpNQUkpIGNvbnN0IHsKKyAgT1MgPDwgIjxNQ09wZXJhbmQgIjsKKyAgaWYgKCFpc1ZhbGlkKCkpCisgICAgT1MgPDwgIklOVkFMSUQiOworICBlbHNlIGlmIChpc1JlZygpKQorICAgIE9TIDw8ICJSZWc6IiA8PCBnZXRSZWcoKTsKKyAgZWxzZSBpZiAoaXNJbW0oKSkKKyAgICBPUyA8PCAiSW1tOiIgPDwgZ2V0SW1tKCk7CisgIGVsc2UgaWYgKGlzRXhwcigpKSB7CisgICAgT1MgPDwgIkV4cHI6KCIgPDwgKmdldEV4cHIoKSA8PCAiKSI7CisgIH0gZWxzZQorICAgIE9TIDw8ICJVTkRFRklORUQiOworICBPUyA8PCAiPiI7Cit9CisKK3ZvaWQgTUNPcGVyYW5kOjpkdW1wKCkgY29uc3QgeworICBwcmludChkYmdzKCksIDApOworICBkYmdzKCkgPDwgIlxuIjsKK30KKwordm9pZCBNQ0luc3Q6OnByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNBc21JbmZvICpNQUkpIGNvbnN0IHsKKyAgT1MgPDwgIjxNQ0luc3QgIiA8PCBnZXRPcGNvZGUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgT1MgPDwgIiAiOworICAgIGdldE9wZXJhbmQoaSkucHJpbnQoT1MsIE1BSSk7CisgIH0KKyAgT1MgPDwgIj4iOworfQorCit2b2lkIE1DSW5zdDo6ZHVtcF9wcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ0FzbUluZm8gKk1BSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RQcmludGVyICpQcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZXBhcmF0b3IpIGNvbnN0IHsKKyAgT1MgPDwgIjxNQ0luc3QgIyIgPDwgZ2V0T3Bjb2RlKCk7CisKKyAgLy8gU2hvdyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlIG5hbWUgaWYgd2UgaGF2ZSBhY2Nlc3MgdG8gYSBwcmludGVyLgorICBpZiAoUHJpbnRlcikKKyAgICBPUyA8PCAnICcgPDwgUHJpbnRlci0+Z2V0T3Bjb2RlTmFtZShnZXRPcGNvZGUoKSk7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgT1MgPDwgU2VwYXJhdG9yOworICAgIGdldE9wZXJhbmQoaSkucHJpbnQoT1MsIE1BSSk7CisgIH0KKyAgT1MgPDwgIj4iOworfQorCit2b2lkIE1DSW5zdDo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpLCAwKTsKKyAgZGJncygpIDw8ICJcbiI7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNMb2dnaW5nU3RyZWFtZXIuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DTG9nZ2luZ1N0cmVhbWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTYwNDBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DTG9nZ2luZ1N0cmVhbWVyLmNwcApAQCAtMCwwICsxLDIwOCBAQAorLy89PT0tIGxpYi9NQy9NQ0xvZ2dpbmdTdHJlYW1lci5jcHAgLSBBUEkgTG9nZ2luZyBTdHJlYW1lciAtLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTUMvTUNTdHJlYW1lci5oIgorI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTUNMb2dnaW5nU3RyZWFtZXIgOiBwdWJsaWMgTUNTdHJlYW1lciB7CisgIGxsdm06Ok93bmluZ1B0cjxNQ1N0cmVhbWVyPiBDaGlsZDsKKyAgCisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBNQ0xvZ2dpbmdTdHJlYW1lcihNQ1N0cmVhbWVyICpfQ2hpbGQsIHJhd19vc3RyZWFtICZfT1MpCisgICAgOiBNQ1N0cmVhbWVyKF9DaGlsZC0+Z2V0Q29udGV4dCgpKSwgQ2hpbGQoX0NoaWxkKSwgT1MoX09TKSB7fQorCisgIHZvaWQgTG9nQ2FsbChjb25zdCBjaGFyICpGdW5jdGlvbikgeworICAgIE9TIDw8IEZ1bmN0aW9uIDw8ICJcbiI7CisgIH0KKworICB2b2lkIExvZ0NhbGwoY29uc3QgY2hhciAqRnVuY3Rpb24sIGNvbnN0IFR3aW5lICZNZXNzYWdlKSB7CisgICAgT1MgPDwgRnVuY3Rpb24gPDwgIjogIiA8PCBNZXNzYWdlIDw8ICJcbiI7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNWZXJib3NlQXNtKCkgY29uc3QgeyByZXR1cm4gQ2hpbGQtPmlzVmVyYm9zZUFzbSgpOyB9CisgIAorICB2aXJ0dWFsIGJvb2wgaGFzUmF3VGV4dFN1cHBvcnQoKSBjb25zdCB7IHJldHVybiBDaGlsZC0+aGFzUmF3VGV4dFN1cHBvcnQoKTsgfQorCisgIHZpcnR1YWwgcmF3X29zdHJlYW0gJkdldENvbW1lbnRPUygpIHsgcmV0dXJuIENoaWxkLT5HZXRDb21tZW50T1MoKTsgfQorCisgIHZpcnR1YWwgdm9pZCBBZGRDb21tZW50KGNvbnN0IFR3aW5lICZUKSB7CisgICAgTG9nQ2FsbCgiQWRkQ29tbWVudCIsIFQpOworICAgIHJldHVybiBDaGlsZC0+QWRkQ29tbWVudChUKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBBZGRCbGFua0xpbmUoKSB7CisgICAgTG9nQ2FsbCgiQWRkQmxhbmtMaW5lIik7CisgICAgcmV0dXJuIENoaWxkLT5BZGRCbGFua0xpbmUoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTd2l0Y2hTZWN0aW9uKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbikgeworICAgIEN1clNlY3Rpb24gPSBTZWN0aW9uOworICAgIExvZ0NhbGwoIlN3aXRjaFNlY3Rpb24iKTsKKyAgICByZXR1cm4gQ2hpbGQtPlN3aXRjaFNlY3Rpb24oU2VjdGlvbik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdExhYmVsKE1DU3ltYm9sICpTeW1ib2wpIHsKKyAgICBMb2dDYWxsKCJFbWl0TGFiZWwiKTsKKyAgICByZXR1cm4gQ2hpbGQtPkVtaXRMYWJlbChTeW1ib2wpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRBc3NlbWJsZXJGbGFnKE1DQXNzZW1ibGVyRmxhZyBGbGFnKSB7CisgICAgTG9nQ2FsbCgiRW1pdEFzc2VtYmxlckZsYWciKTsKKyAgICByZXR1cm4gQ2hpbGQtPkVtaXRBc3NlbWJsZXJGbGFnKEZsYWcpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIHsKKyAgICBMb2dDYWxsKCJFbWl0QXNzaWdubWVudCIpOworICAgIHJldHVybiBDaGlsZC0+RW1pdEFzc2lnbm1lbnQoU3ltYm9sLCBWYWx1ZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdFN5bWJvbEF0dHJpYnV0ZShNQ1N5bWJvbCAqU3ltYm9sLCBNQ1N5bWJvbEF0dHIgQXR0cmlidXRlKSB7CisgICAgTG9nQ2FsbCgiRW1pdFN5bWJvbEF0dHJpYnV0ZSIpOworICAgIHJldHVybiBDaGlsZC0+RW1pdFN5bWJvbEF0dHJpYnV0ZShTeW1ib2wsIEF0dHJpYnV0ZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdFN5bWJvbERlc2MoTUNTeW1ib2wgKlN5bWJvbCwgdW5zaWduZWQgRGVzY1ZhbHVlKSB7CisgICAgTG9nQ2FsbCgiRW1pdFN5bWJvbERlc2MiKTsKKyAgICByZXR1cm4gQ2hpbGQtPkVtaXRTeW1ib2xEZXNjKFN5bWJvbCwgRGVzY1ZhbHVlKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBCZWdpbkNPRkZTeW1ib2xEZWYoY29uc3QgTUNTeW1ib2wgKlN5bWJvbCkgeworICAgIExvZ0NhbGwoIkJlZ2luQ09GRlN5bWJvbERlZiIpOworICAgIHJldHVybiBDaGlsZC0+QmVnaW5DT0ZGU3ltYm9sRGVmKFN5bWJvbCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdENPRkZTeW1ib2xTdG9yYWdlQ2xhc3MoaW50IFN0b3JhZ2VDbGFzcykgeworICAgIExvZ0NhbGwoIkVtaXRDT0ZGU3ltYm9sU3RvcmFnZUNsYXNzIik7CisgICAgcmV0dXJuIENoaWxkLT5FbWl0Q09GRlN5bWJvbFN0b3JhZ2VDbGFzcyhTdG9yYWdlQ2xhc3MpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRDT0ZGU3ltYm9sVHlwZShpbnQgVHlwZSkgeworICAgIExvZ0NhbGwoIkVtaXRDT0ZGU3ltYm9sVHlwZSIpOworICAgIHJldHVybiBDaGlsZC0+RW1pdENPRkZTeW1ib2xUeXBlKFR5cGUpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVuZENPRkZTeW1ib2xEZWYoKSB7CisgICAgTG9nQ2FsbCgiRW5kQ09GRlN5bWJvbERlZiIpOworICAgIHJldHVybiBDaGlsZC0+RW5kQ09GRlN5bWJvbERlZigpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRFTEZTaXplKE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIHsKKyAgICBMb2dDYWxsKCJFbWl0RUxGU2l6ZSIpOworICAgIHJldHVybiBDaGlsZC0+RW1pdEVMRlNpemUoU3ltYm9sLCBWYWx1ZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSB7CisgICAgTG9nQ2FsbCgiRW1pdENvbW1vblN5bWJvbCIpOworICAgIHJldHVybiBDaGlsZC0+RW1pdENvbW1vblN5bWJvbChTeW1ib2wsIFNpemUsIEJ5dGVBbGlnbm1lbnQpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRMb2NhbENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplKSB7CisgICAgTG9nQ2FsbCgiRW1pdExvY2FsQ29tbW9uU3ltYm9sIik7CisgICAgcmV0dXJuIENoaWxkLT5FbWl0TG9jYWxDb21tb25TeW1ib2woU3ltYm9sLCBTaXplKTsKKyAgfQorICAKKyAgdmlydHVhbCB2b2lkIEVtaXRaZXJvZmlsbChjb25zdCBNQ1NlY3Rpb24gKlNlY3Rpb24sIE1DU3ltYm9sICpTeW1ib2wgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUgPSAwLCB1bnNpZ25lZCBCeXRlQWxpZ25tZW50ID0gMCkgeworICAgIExvZ0NhbGwoIkVtaXRaZXJvZmlsbCIpOworICAgIHJldHVybiBDaGlsZC0+RW1pdFplcm9maWxsKFNlY3Rpb24sIFN5bWJvbCwgU2l6ZSwgQnl0ZUFsaWdubWVudCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdFRCU1NTeW1ib2wgKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBCeXRlQWxpZ25tZW50ID0gMCkgeworICAgIExvZ0NhbGwoIkVtaXRUQlNTU3ltYm9sIik7CisgICAgcmV0dXJuIENoaWxkLT5FbWl0VEJTU1N5bWJvbChTZWN0aW9uLCBTeW1ib2wsIFNpemUsIEJ5dGVBbGlnbm1lbnQpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRCeXRlcyhTdHJpbmdSZWYgRGF0YSwgdW5zaWduZWQgQWRkclNwYWNlKSB7CisgICAgTG9nQ2FsbCgiRW1pdEJ5dGVzIik7CisgICAgcmV0dXJuIENoaWxkLT5FbWl0Qnl0ZXMoRGF0YSwgQWRkclNwYWNlKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSwgdW5zaWduZWQgU2l6ZSx1bnNpZ25lZCBBZGRyU3BhY2UpeworICAgIExvZ0NhbGwoIkVtaXRWYWx1ZSIpOworICAgIHJldHVybiBDaGlsZC0+RW1pdFZhbHVlKFZhbHVlLCBTaXplLCBBZGRyU3BhY2UpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRJbnRWYWx1ZSh1aW50NjRfdCBWYWx1ZSwgdW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgQWRkclNwYWNlKSB7CisgICAgTG9nQ2FsbCgiRW1pdEludFZhbHVlIik7CisgICAgcmV0dXJuIENoaWxkLT5FbWl0SW50VmFsdWUoVmFsdWUsIFNpemUsIEFkZHJTcGFjZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdEdQUmVsMzJWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKSB7CisgICAgTG9nQ2FsbCgiRW1pdEdQUmVsMzJWYWx1ZSIpOworICAgIHJldHVybiBDaGlsZC0+RW1pdEdQUmVsMzJWYWx1ZShWYWx1ZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdEZpbGwodWludDY0X3QgTnVtQnl0ZXMsIHVpbnQ4X3QgRmlsbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlKSB7CisgICAgTG9nQ2FsbCgiRW1pdEZpbGwiKTsKKyAgICByZXR1cm4gQ2hpbGQtPkVtaXRGaWxsKE51bUJ5dGVzLCBGaWxsVmFsdWUsIEFkZHJTcGFjZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlVG9BbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwgaW50NjRfdCBWYWx1ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZVNpemUgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQgPSAwKSB7CisgICAgTG9nQ2FsbCgiRW1pdFZhbHVlVG9BbGlnbm1lbnQiKTsKKyAgICByZXR1cm4gQ2hpbGQtPkVtaXRWYWx1ZVRvQWxpZ25tZW50KEJ5dGVBbGlnbm1lbnQsIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVTaXplLCBNYXhCeXRlc1RvRW1pdCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdENvZGVBbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0ID0gMCkgeworICAgIExvZ0NhbGwoIkVtaXRDb2RlQWxpZ25tZW50Iik7CisgICAgcmV0dXJuIENoaWxkLT5FbWl0Q29kZUFsaWdubWVudChCeXRlQWxpZ25tZW50LCBNYXhCeXRlc1RvRW1pdCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlVG9PZmZzZXQoY29uc3QgTUNFeHByICpPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFZhbHVlID0gMCkgeworICAgIExvZ0NhbGwoIkVtaXRWYWx1ZVRvT2Zmc2V0Iik7CisgICAgcmV0dXJuIENoaWxkLT5FbWl0VmFsdWVUb09mZnNldChPZmZzZXQsIFZhbHVlKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBFbWl0RmlsZURpcmVjdGl2ZShTdHJpbmdSZWYgRmlsZW5hbWUpIHsKKyAgICBMb2dDYWxsKCJFbWl0RmlsZURpcmVjdGl2ZSIsICJGaWxlTmFtZToiICsgRmlsZW5hbWUpOworICAgIHJldHVybiBDaGlsZC0+RW1pdEZpbGVEaXJlY3RpdmUoRmlsZW5hbWUpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXREd2FyZkZpbGVEaXJlY3RpdmUodW5zaWduZWQgRmlsZU5vLCBTdHJpbmdSZWYgRmlsZW5hbWUpIHsKKyAgICBMb2dDYWxsKCJFbWl0RHdhcmZGaWxlRGlyZWN0aXZlIiwKKyAgICAgICAgICAgICJGaWxlTm86IiArIFR3aW5lKEZpbGVObykgKyAiIEZpbGVuYW1lOiIgKyBGaWxlbmFtZSk7CisgICAgcmV0dXJuIENoaWxkLT5FbWl0RHdhcmZGaWxlRGlyZWN0aXZlKEZpbGVObywgRmlsZW5hbWUpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgJkluc3QpIHsKKyAgICBMb2dDYWxsKCJFbWl0SW5zdHJ1Y3Rpb24iKTsKKyAgICByZXR1cm4gQ2hpbGQtPkVtaXRJbnN0cnVjdGlvbihJbnN0KTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBFbWl0UmF3VGV4dChTdHJpbmdSZWYgU3RyaW5nKSB7CisgICAgTG9nQ2FsbCgiRW1pdFJhd1RleHQiLCAiXCIiICsgU3RyaW5nICsgIlwiIik7CisgICAgcmV0dXJuIENoaWxkLT5FbWl0UmF3VGV4dChTdHJpbmcpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEZpbmlzaCgpIHsKKyAgICBMb2dDYWxsKCJGaW5pc2giKTsKKyAgICByZXR1cm4gQ2hpbGQtPkZpbmlzaCgpOworICB9CisKK307CisKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKK01DU3RyZWFtZXIgKmxsdm06OmNyZWF0ZUxvZ2dpbmdTdHJlYW1lcihNQ1N0cmVhbWVyICpDaGlsZCwgcmF3X29zdHJlYW0gJk9TKSB7CisgIHJldHVybiBuZXcgTUNMb2dnaW5nU3RyZWFtZXIoQ2hpbGQsIE9TKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ01hY2hPU3RyZWFtZXIuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DTWFjaE9TdHJlYW1lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkOTk4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ01hY2hPU3RyZWFtZXIuY3BwCkBAIC0wLDAgKzEsNjIyIEBACisvLz09PS0gbGliL01DL01DTWFjaE9TdHJlYW1lci5jcHAgLSBNYWNoLU8gT2JqZWN0IE91dHB1dCAtLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisKKyNpbmNsdWRlICJsbHZtL01DL01DQXNzZW1ibGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29kZUVtaXR0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ09iamVjdFN0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ01hY2hPU3ltYm9sRmxhZ3MuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbk1hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRBc21CYWNrZW5kLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworCitjbGFzcyBNQ01hY2hPU3RyZWFtZXIgOiBwdWJsaWMgTUNPYmplY3RTdHJlYW1lciB7Citwcml2YXRlOgorICB2b2lkIEVtaXRJbnN0VG9GcmFnbWVudChjb25zdCBNQ0luc3QgJkluc3QpOworICB2b2lkIEVtaXRJbnN0VG9EYXRhKGNvbnN0IE1DSW5zdCAmSW5zdCk7CisgIC8vIEZJWE1FOiBUaGVzZSB3aWxsIGxpa2VseSBtb3ZlZCB0byBhIGJldHRlciBwbGFjZS4KKyAgY29uc3QgTUNFeHByICogTWFrZVN0YXJ0TWludXNFbmRFeHByKE1DU3ltYm9sICpTdGFydCwgTUNTeW1ib2wgKkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEludFZhbCk7CisgIHZvaWQgRW1pdER3YXJmRmlsZVRhYmxlKHZvaWQpOworCitwdWJsaWM6CisgIE1DTWFjaE9TdHJlYW1lcihNQ0NvbnRleHQgJkNvbnRleHQsIFRhcmdldEFzbUJhY2tlbmQgJlRBQiwKKyAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUywgTUNDb2RlRW1pdHRlciAqRW1pdHRlcikKKyAgICA6IE1DT2JqZWN0U3RyZWFtZXIoQ29udGV4dCwgVEFCLCBPUywgRW1pdHRlcikge30KKworICAvLy8gQG5hbWUgTUNTdHJlYW1lciBJbnRlcmZhY2UKKyAgLy8vIEB7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRMYWJlbChNQ1N5bWJvbCAqU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRBc3NlbWJsZXJGbGFnKE1DQXNzZW1ibGVyRmxhZyBGbGFnKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpOworICB2aXJ0dWFsIHZvaWQgRW1pdFN5bWJvbEF0dHJpYnV0ZShNQ1N5bWJvbCAqU3ltYm9sLCBNQ1N5bWJvbEF0dHIgQXR0cmlidXRlKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRTeW1ib2xEZXNjKE1DU3ltYm9sICpTeW1ib2wsIHVuc2lnbmVkIERlc2NWYWx1ZSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q29tbW9uU3ltYm9sKE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpOworICB2aXJ0dWFsIHZvaWQgQmVnaW5DT0ZGU3ltYm9sRGVmKGNvbnN0IE1DU3ltYm9sICpTeW1ib2wpIHsKKyAgICBhc3NlcnQoMCAmJiAibWFjaG8gZG9lc24ndCBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlIik7CisgIH0KKyAgdmlydHVhbCB2b2lkIEVtaXRDT0ZGU3ltYm9sU3RvcmFnZUNsYXNzKGludCBTdG9yYWdlQ2xhc3MpIHsKKyAgICBhc3NlcnQoMCAmJiAibWFjaG8gZG9lc24ndCBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlIik7CisgIH0KKyAgdmlydHVhbCB2b2lkIEVtaXRDT0ZGU3ltYm9sVHlwZShpbnQgVHlwZSkgeworICAgIGFzc2VydCgwICYmICJtYWNobyBkb2Vzbid0IHN1cHBvcnQgdGhpcyBkaXJlY3RpdmUiKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgRW5kQ09GRlN5bWJvbERlZigpIHsKKyAgICBhc3NlcnQoMCAmJiAibWFjaG8gZG9lc24ndCBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlIik7CisgIH0KKyAgdmlydHVhbCB2b2lkIEVtaXRFTEZTaXplKE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIHsKKyAgICBhc3NlcnQoMCAmJiAibWFjaG8gZG9lc24ndCBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlIik7CisgIH0KKyAgdmlydHVhbCB2b2lkIEVtaXRMb2NhbENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplKSB7CisgICAgYXNzZXJ0KDAgJiYgIm1hY2hvIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIGRpcmVjdGl2ZSIpOworICB9CisgIHZpcnR1YWwgdm9pZCBFbWl0WmVyb2ZpbGwoY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplID0gMCwgdW5zaWduZWQgQnl0ZUFsaWdubWVudCA9IDApOworICB2aXJ0dWFsIHZvaWQgRW1pdFRCU1NTeW1ib2woY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgdW5zaWduZWQgQnl0ZUFsaWdubWVudCA9IDApOworICB2aXJ0dWFsIHZvaWQgRW1pdEJ5dGVzKFN0cmluZ1JlZiBEYXRhLCB1bnNpZ25lZCBBZGRyU3BhY2UpOworICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUsdW5zaWduZWQgQWRkclNwYWNlKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRHUFJlbDMyVmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSkgeworICAgIGFzc2VydCgwICYmICJtYWNobyBkb2Vzbid0IHN1cHBvcnQgdGhpcyBkaXJlY3RpdmUiKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlVG9BbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwgaW50NjRfdCBWYWx1ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZVNpemUgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQgPSAwKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDb2RlQWxpZ25tZW50KHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhCeXRlc1RvRW1pdCA9IDApOworICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlVG9PZmZzZXQoY29uc3QgTUNFeHByICpPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFZhbHVlID0gMCk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRGaWxlRGlyZWN0aXZlKFN0cmluZ1JlZiBGaWxlbmFtZSkgeworICAgIC8vIEZJWE1FOiBKdXN0IGlnbm9yZSB0aGUgLmZpbGU7IGl0IGlzbid0IGltcG9ydGFudCBlbm91Z2ggdG8gZmFpbCB0aGUKKyAgICAvLyBlbnRpcmUgYXNzZW1ibHkuCisKKyAgICAvL3JlcG9ydF9mYXRhbF9lcnJvcigidW5zdXBwb3J0ZWQgZGlyZWN0aXZlOiAnLmZpbGUnIik7CisgIH0KKyAgdmlydHVhbCB2b2lkIEVtaXREd2FyZkZpbGVEaXJlY3RpdmUodW5zaWduZWQgRmlsZU5vLCBTdHJpbmdSZWYgRmlsZW5hbWUpIHsKKyAgICAvLyBGSVhNRTogSnVzdCBpZ25vcmUgdGhlIC5maWxlOyBpdCBpc24ndCBpbXBvcnRhbnQgZW5vdWdoIHRvIGZhaWwgdGhlCisgICAgLy8gZW50aXJlIGFzc2VtYmx5LgorCisgICAgLy9yZXBvcnRfZmF0YWxfZXJyb3IoInVuc3VwcG9ydGVkIGRpcmVjdGl2ZTogJy5maWxlJyIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgJkluc3QpOworCisgIHZpcnR1YWwgdm9pZCBGaW5pc2goKTsKKworICAvLy8gQH0KK307CisKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKK3ZvaWQgTUNNYWNoT1N0cmVhbWVyOjpFbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCkgeworICAvLyBUT0RPOiBUaGlzIGlzIGFsbW9zdCBleGFjdGx5IHRoZSBzYW1lIGFzIFdpbkNPRkZTdHJlYW1lci4gQ29uc2lkZXIgbWVyZ2luZworICAvLyBpbnRvIE1DT2JqZWN0U3RyZWFtZXIuCisgIGFzc2VydChTeW1ib2wtPmlzVW5kZWZpbmVkKCkgJiYgIkNhbm5vdCBkZWZpbmUgYSBzeW1ib2wgdHdpY2UhIik7CisgIGFzc2VydCghU3ltYm9sLT5pc1ZhcmlhYmxlKCkgJiYgIkNhbm5vdCBlbWl0IGEgdmFyaWFibGUgc3ltYm9sISIpOworICBhc3NlcnQoQ3VyU2VjdGlvbiAmJiAiQ2Fubm90IGVtaXQgYmVmb3JlIHNldHRpbmcgc2VjdGlvbiEiKTsKKworICBTeW1ib2wtPnNldFNlY3Rpb24oKkN1clNlY3Rpb24pOworCisgIE1DU3ltYm9sRGF0YSAmU0QgPSBnZXRBc3NlbWJsZXIoKS5nZXRPckNyZWF0ZVN5bWJvbERhdGEoKlN5bWJvbCk7CisKKyAgLy8gV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgZnJhZ21lbnQgaWYgdGhpcyBpcyBhbiBhdG9tIGRlZmluaW5nIHN5bWJvbCwKKyAgLy8gZnJhZ21lbnRzIGNhbm5vdCBzcGFuIGF0b21zLgorICBpZiAoZ2V0QXNzZW1ibGVyKCkuaXNTeW1ib2xMaW5rZXJWaXNpYmxlKFNELmdldFN5bWJvbCgpKSkKKyAgICBuZXcgTUNEYXRhRnJhZ21lbnQoZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCkpOworCisgIC8vIEZJWE1FOiBUaGlzIGlzIHdhc3RlZnVsLCB3ZSBkb24ndCBuZWNlc3NhcmlseSBuZWVkIHRvIGNyZWF0ZSBhIGRhdGEKKyAgLy8gZnJhZ21lbnQuIEluc3RlYWQsIHdlIHNob3VsZCBtYXJrIHRoZSBzeW1ib2wgYXMgcG9pbnRpbmcgaW50byB0aGUgZGF0YQorICAvLyBmcmFnbWVudCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB3ZSBzaG91bGQganVzdCBxdWV1ZSB0aGUgbGFiZWwgYW5kIHNldCBpdHMKKyAgLy8gZnJhZ21lbnQgcG9pbnRlciB3aGVuIHdlIGVtaXQgdGhlIG5leHQgZnJhZ21lbnQuCisgIE1DRGF0YUZyYWdtZW50ICpGID0gZ2V0T3JDcmVhdGVEYXRhRnJhZ21lbnQoKTsKKyAgYXNzZXJ0KCFTRC5nZXRGcmFnbWVudCgpICYmICJVbmV4cGVjdGVkIGZyYWdtZW50IG9uIHN5bWJvbCBkYXRhISIpOworICBTRC5zZXRGcmFnbWVudChGKTsKKyAgU0Quc2V0T2Zmc2V0KEYtPmdldENvbnRlbnRzKCkuc2l6ZSgpKTsKKworICAvLyBUaGlzIGNhdXNlcyB0aGUgcmVmZXJlbmNlIHR5cGUgZmxhZyB0byBiZSBjbGVhcmVkLiBEYXJ3aW4gJ2FzJyB3YXMgInRyeWluZyIKKyAgLy8gdG8gY2xlYXIgdGhlIHdlYWsgcmVmZXJlbmNlIGFuZCB3ZWFrIGRlZmluaXRpb24gYml0cyB0b28sIGJ1dCB0aGUKKyAgLy8gaW1wbGVtZW50YXRpb24gd2FzIGJ1Z2d5LiBGb3Igbm93IHdlIGp1c3QgdHJ5IHRvIG1hdGNoICdhcycsIGZvcgorICAvLyBkaWZmYWJpbGl0eS4KKyAgLy8KKyAgLy8gRklYTUU6IENsZWFudXAgdGhpcyBjb2RlLCB0aGVzZSBiaXRzIHNob3VsZCBiZSBlbWl0dGVkIGJhc2VkIG9uIHNlbWFudGljCisgIC8vIHByb3BlcnRpZXMsIG5vdCBvbiB0aGUgb3JkZXIgb2YgZGVmaW5pdGlvbiwgZXRjLgorICBTRC5zZXRGbGFncyhTRC5nZXRGbGFncygpICYgflNGX1JlZmVyZW5jZVR5cGVNYXNrKTsKK30KKwordm9pZCBNQ01hY2hPU3RyZWFtZXI6OkVtaXRBc3NlbWJsZXJGbGFnKE1DQXNzZW1ibGVyRmxhZyBGbGFnKSB7CisgIHN3aXRjaCAoRmxhZykgeworICBjYXNlIE1DQUZfU3Vic2VjdGlvbnNWaWFTeW1ib2xzOgorICAgIGdldEFzc2VtYmxlcigpLnNldFN1YnNlY3Rpb25zVmlhU3ltYm9scyh0cnVlKTsKKyAgICByZXR1cm47CisgIH0KKworICBhc3NlcnQoMCAmJiAiaW52YWxpZCBhc3NlbWJsZXIgZmxhZyEiKTsKK30KKwordm9pZCBNQ01hY2hPU3RyZWFtZXI6OkVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIHsKKyAgLy8gVE9ETzogVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIFdpbkNPRkZTdHJlYW1lci4gQ29uc2lkZXIgbWVyZ2luZyBpbnRvCisgIC8vIE1DT2JqZWN0U3RyZWFtZXIuCisgIC8vIEZJWE1FOiBMaWZ0IGNvbnRleHQgY2hhbmdlcyBpbnRvIHN1cGVyIGNsYXNzLgorICBnZXRBc3NlbWJsZXIoKS5nZXRPckNyZWF0ZVN5bWJvbERhdGEoKlN5bWJvbCk7CisgIFN5bWJvbC0+c2V0VmFyaWFibGVWYWx1ZShBZGRWYWx1ZVN5bWJvbHMoVmFsdWUpKTsKK30KKwordm9pZCBNQ01hY2hPU3RyZWFtZXI6OkVtaXRTeW1ib2xBdHRyaWJ1dGUoTUNTeW1ib2wgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3ltYm9sQXR0ciBBdHRyaWJ1dGUpIHsKKyAgLy8gSW5kaXJlY3Qgc3ltYm9scyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgdG8gbWF0Y2ggaG93ICdhcycgaGFuZGxlcworICAvLyB0aGVtLiBUaGlzIG1ha2VzIHdyaXRpbmcgbWF0Y2hpbmcgLm8gZmlsZXMgZWFzaWVyLgorICBpZiAoQXR0cmlidXRlID09IE1DU0FfSW5kaXJlY3RTeW1ib2wpIHsKKyAgICAvLyBOb3RlIHRoYXQgd2UgaW50ZW50aW9uYWxseSBjYW5ub3QgdXNlIHRoZSBzeW1ib2wgZGF0YSBoZXJlOyB0aGlzIGlzCisgICAgLy8gaW1wb3J0YW50IGZvciBtYXRjaGluZyB0aGUgc3RyaW5nIHRhYmxlIHRoYXQgJ2FzJyBnZW5lcmF0ZXMuCisgICAgSW5kaXJlY3RTeW1ib2xEYXRhIElTRDsKKyAgICBJU0QuU3ltYm9sID0gU3ltYm9sOworICAgIElTRC5TZWN0aW9uRGF0YSA9IGdldEN1cnJlbnRTZWN0aW9uRGF0YSgpOworICAgIGdldEFzc2VtYmxlcigpLmdldEluZGlyZWN0U3ltYm9scygpLnB1c2hfYmFjayhJU0QpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEFkZGluZyBhIHN5bWJvbCBhdHRyaWJ1dGUgYWx3YXlzIGludHJvZHVjZXMgdGhlIHN5bWJvbCwgbm90ZSB0aGF0IGFuCisgIC8vIGltcG9ydGFudCBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIGdldE9yQ3JlYXRlU3ltYm9sRGF0YSBoZXJlIGlzIHRvIHJlZ2lzdGVyCisgIC8vIHRoZSBzeW1ib2wgd2l0aCB0aGUgYXNzZW1ibGVyLgorICBNQ1N5bWJvbERhdGEgJlNEID0gZ2V0QXNzZW1ibGVyKCkuZ2V0T3JDcmVhdGVTeW1ib2xEYXRhKCpTeW1ib2wpOworCisgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzeW1ib2wgYXR0cmlidXRlcyBpcyBkZXNpZ25lZCB0byBtYXRjaCAnYXMnLCBidXQgaXQKKyAgLy8gbGVhdmVzIG11Y2ggdG8gZGVzaXJlZC4gSXQgZG9lc24ndCByZWFsbHkgbWFrZSBzZW5zZSB0byBhcmJpdHJhcmlseSBhZGQgYW5kCisgIC8vIHJlbW92ZSBmbGFncywgYnV0ICdhcycgYWxsb3dzIHRoaXMgKGluIHBhcnRpY3VsYXIsIHNlZSAuZGVzYykuCisgIC8vCisgIC8vIEluIHRoZSBmdXR1cmUgaXQgbWlnaHQgYmUgd29ydGggdHJ5aW5nIHRvIG1ha2UgdGhlc2Ugb3BlcmF0aW9ucyBtb3JlIHdlbGwKKyAgLy8gZGVmaW5lZC4KKyAgc3dpdGNoIChBdHRyaWJ1dGUpIHsKKyAgY2FzZSBNQ1NBX0ludmFsaWQ6CisgIGNhc2UgTUNTQV9FTEZfVHlwZUZ1bmN0aW9uOgorICBjYXNlIE1DU0FfRUxGX1R5cGVJbmRGdW5jdGlvbjoKKyAgY2FzZSBNQ1NBX0VMRl9UeXBlT2JqZWN0OgorICBjYXNlIE1DU0FfRUxGX1R5cGVUTFM6CisgIGNhc2UgTUNTQV9FTEZfVHlwZUNvbW1vbjoKKyAgY2FzZSBNQ1NBX0VMRl9UeXBlTm9UeXBlOgorICBjYXNlIE1DU0FfSW5kaXJlY3RTeW1ib2w6CisgIGNhc2UgTUNTQV9IaWRkZW46CisgIGNhc2UgTUNTQV9JbnRlcm5hbDoKKyAgY2FzZSBNQ1NBX1Byb3RlY3RlZDoKKyAgY2FzZSBNQ1NBX1dlYWs6CisgIGNhc2UgTUNTQV9Mb2NhbDoKKyAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBzeW1ib2wgYXR0cmlidXRlIGZvciBNYWNoLU8hIik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBNQ1NBX0dsb2JhbDoKKyAgICBTRC5zZXRFeHRlcm5hbCh0cnVlKTsKKyAgICAvLyBUaGlzIGVmZmVjdGl2ZWx5IGNsZWFycyB0aGUgdW5kZWZpbmVkIGxhenkgYml0LCBpbiBEYXJ3aW4gJ2FzJywgYWx0aG91Z2gKKyAgICAvLyBpdCBpc24ndCB2ZXJ5IGNvbnNpc3RlbnQgYmVjYXVzZSBpdCBpbXBsZW1lbnRzIHRoaXMgYXMgcGFydCBvZiBzeW1ib2wKKyAgICAvLyBsb29rdXAuCisgICAgLy8KKyAgICAvLyBGSVhNRTogQ2xlYW51cCB0aGlzIGNvZGUsIHRoZXNlIGJpdHMgc2hvdWxkIGJlIGVtaXR0ZWQgYmFzZWQgb24gc2VtYW50aWMKKyAgICAvLyBwcm9wZXJ0aWVzLCBub3Qgb24gdGhlIG9yZGVyIG9mIGRlZmluaXRpb24sIGV0Yy4KKyAgICBTRC5zZXRGbGFncyhTRC5nZXRGbGFncygpICYgflNGX1JlZmVyZW5jZVR5cGVVbmRlZmluZWRMYXp5KTsKKyAgICBicmVhazsKKworICBjYXNlIE1DU0FfTGF6eVJlZmVyZW5jZToKKyAgICAvLyBGSVhNRTogVGhpcyByZXF1aXJlcyAtZHluYW1pYy4KKyAgICBTRC5zZXRGbGFncyhTRC5nZXRGbGFncygpIHwgU0ZfTm9EZWFkU3RyaXApOworICAgIGlmIChTeW1ib2wtPmlzVW5kZWZpbmVkKCkpCisgICAgICBTRC5zZXRGbGFncyhTRC5nZXRGbGFncygpIHwgU0ZfUmVmZXJlbmNlVHlwZVVuZGVmaW5lZExhenkpOworICAgIGJyZWFrOworCisgICAgLy8gU2luY2UgLnJlZmVyZW5jZSBzZXRzIHRoZSBubyBkZWFkIHN0cmlwIGJpdCwgaXQgaXMgZXF1aXZhbGVudCB0bworICAgIC8vIC5ub19kZWFkX3N0cmlwIGluIHByYWN0aWNlLgorICBjYXNlIE1DU0FfUmVmZXJlbmNlOgorICBjYXNlIE1DU0FfTm9EZWFkU3RyaXA6CisgICAgU0Quc2V0RmxhZ3MoU0QuZ2V0RmxhZ3MoKSB8IFNGX05vRGVhZFN0cmlwKTsKKyAgICBicmVhazsKKworICBjYXNlIE1DU0FfUHJpdmF0ZUV4dGVybjoKKyAgICBTRC5zZXRFeHRlcm5hbCh0cnVlKTsKKyAgICBTRC5zZXRQcml2YXRlRXh0ZXJuKHRydWUpOworICAgIGJyZWFrOworCisgIGNhc2UgTUNTQV9XZWFrUmVmZXJlbmNlOgorICAgIC8vIEZJWE1FOiBUaGlzIHJlcXVpcmVzIC1keW5hbWljLgorICAgIGlmIChTeW1ib2wtPmlzVW5kZWZpbmVkKCkpCisgICAgICBTRC5zZXRGbGFncyhTRC5nZXRGbGFncygpIHwgU0ZfV2Vha1JlZmVyZW5jZSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBNQ1NBX1dlYWtEZWZpbml0aW9uOgorICAgIC8vIEZJWE1FOiAnYXMnIGVuZm9yY2VzIHRoYXQgdGhpcyBpcyBkZWZpbmVkIGFuZCBnbG9iYWwuIFRoZSBtYW51YWwgY2xhaW1zCisgICAgLy8gaXQgaGFzIHRvIGJlIGluIGEgY29hbGVzY2VkIHNlY3Rpb24sIGJ1dCB0aGlzIGlzbid0IGVuZm9yY2VkLgorICAgIFNELnNldEZsYWdzKFNELmdldEZsYWdzKCkgfCBTRl9XZWFrRGVmaW5pdGlvbik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBNQ1NBX1dlYWtEZWZBdXRvUHJpdmF0ZToKKyAgICBTRC5zZXRGbGFncyhTRC5nZXRGbGFncygpIHwgU0ZfV2Vha0RlZmluaXRpb24gfCBTRl9XZWFrUmVmZXJlbmNlKTsKKyAgICBicmVhazsKKyAgfQorfQorCit2b2lkIE1DTWFjaE9TdHJlYW1lcjo6RW1pdFN5bWJvbERlc2MoTUNTeW1ib2wgKlN5bWJvbCwgdW5zaWduZWQgRGVzY1ZhbHVlKSB7CisgIC8vIEVuY29kZSB0aGUgJ2Rlc2MnIHZhbHVlIGludG8gdGhlIGxvd2VzdCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJpdHMuCisgIGFzc2VydChEZXNjVmFsdWUgPT0gKERlc2NWYWx1ZSAmIFNGX0Rlc2NGbGFnc01hc2spICYmCisgICAgICAgICAiSW52YWxpZCAuZGVzYyB2YWx1ZSEiKTsKKyAgZ2V0QXNzZW1ibGVyKCkuZ2V0T3JDcmVhdGVTeW1ib2xEYXRhKCpTeW1ib2wpLnNldEZsYWdzKAorICAgIERlc2NWYWx1ZSAmIFNGX0Rlc2NGbGFnc01hc2spOworfQorCit2b2lkIE1DTWFjaE9TdHJlYW1lcjo6RW1pdENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnl0ZUFsaWdubWVudCkgeworICAvLyBGSVhNRTogRGFyd2luICdhcycgZG9lcyBhcHBlYXIgdG8gYWxsb3cgcmVkZWYgb2YgYSAuY29tbSBieSBpdHNlbGYuCisgIGFzc2VydChTeW1ib2wtPmlzVW5kZWZpbmVkKCkgJiYgIkNhbm5vdCBkZWZpbmUgYSBzeW1ib2wgdHdpY2UhIik7CisKKyAgTUNTeW1ib2xEYXRhICZTRCA9IGdldEFzc2VtYmxlcigpLmdldE9yQ3JlYXRlU3ltYm9sRGF0YSgqU3ltYm9sKTsKKyAgU0Quc2V0RXh0ZXJuYWwodHJ1ZSk7CisgIFNELnNldENvbW1vbihTaXplLCBCeXRlQWxpZ25tZW50KTsKK30KKwordm9pZCBNQ01hY2hPU3RyZWFtZXI6OkVtaXRaZXJvZmlsbChjb25zdCBNQ1NlY3Rpb24gKlNlY3Rpb24sIE1DU3ltYm9sICpTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIHsKKyAgTUNTZWN0aW9uRGF0YSAmU2VjdERhdGEgPSBnZXRBc3NlbWJsZXIoKS5nZXRPckNyZWF0ZVNlY3Rpb25EYXRhKCpTZWN0aW9uKTsKKworICAvLyBUaGUgc3ltYm9sIG1heSBub3QgYmUgcHJlc2VudCwgd2hpY2ggb25seSBjcmVhdGVzIHRoZSBzZWN0aW9uLgorICBpZiAoIVN5bWJvbCkKKyAgICByZXR1cm47CisKKyAgLy8gRklYTUU6IEFzc2VydCB0aGF0IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHplcm9maWxsIHR5cGUuCisKKyAgYXNzZXJ0KFN5bWJvbC0+aXNVbmRlZmluZWQoKSAmJiAiQ2Fubm90IGRlZmluZSBhIHN5bWJvbCB0d2ljZSEiKTsKKworICBNQ1N5bWJvbERhdGEgJlNEID0gZ2V0QXNzZW1ibGVyKCkuZ2V0T3JDcmVhdGVTeW1ib2xEYXRhKCpTeW1ib2wpOworCisgIC8vIEVtaXQgYW4gYWxpZ24gZnJhZ21lbnQgaWYgbmVjZXNzYXJ5LgorICBpZiAoQnl0ZUFsaWdubWVudCAhPSAxKQorICAgIG5ldyBNQ0FsaWduRnJhZ21lbnQoQnl0ZUFsaWdubWVudCwgMCwgMCwgQnl0ZUFsaWdubWVudCwgJlNlY3REYXRhKTsKKworICBNQ0ZyYWdtZW50ICpGID0gbmV3IE1DRmlsbEZyYWdtZW50KDAsIDAsIFNpemUsICZTZWN0RGF0YSk7CisgIFNELnNldEZyYWdtZW50KEYpOworCisgIFN5bWJvbC0+c2V0U2VjdGlvbigqU2VjdGlvbik7CisKKyAgLy8gVXBkYXRlIHRoZSBtYXhpbXVtIGFsaWdubWVudCBvbiB0aGUgemVybyBmaWxsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5LgorICBpZiAoQnl0ZUFsaWdubWVudCA+IFNlY3REYXRhLmdldEFsaWdubWVudCgpKQorICAgIFNlY3REYXRhLnNldEFsaWdubWVudChCeXRlQWxpZ25tZW50KTsKK30KKworLy8gVGhpcyBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSB0aHJlYWQgbG9jYWwgYnNzIHNlY3Rpb24uICBMaWtlIHRoZQorLy8gLnplcm9maWxsIGRpcmVjdGl2ZSB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgc3dpdGNoIHNlY3Rpb25zIG9uIHVzLgordm9pZCBNQ01hY2hPU3RyZWFtZXI6OkVtaXRUQlNTU3ltYm9sKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSB7CisgIEVtaXRaZXJvZmlsbChTZWN0aW9uLCBTeW1ib2wsIFNpemUsIEJ5dGVBbGlnbm1lbnQpOworICByZXR1cm47Cit9CisKK3ZvaWQgTUNNYWNoT1N0cmVhbWVyOjpFbWl0Qnl0ZXMoU3RyaW5nUmVmIERhdGEsIHVuc2lnbmVkIEFkZHJTcGFjZSkgeworICAvLyBUT0RPOiBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgV2luQ09GRlN0cmVhbWVyLiBDb25zaWRlciBtZXJnaW5nIGludG8KKyAgLy8gTUNPYmplY3RTdHJlYW1lci4KKyAgZ2V0T3JDcmVhdGVEYXRhRnJhZ21lbnQoKS0+Z2V0Q29udGVudHMoKS5hcHBlbmQoRGF0YS5iZWdpbigpLCBEYXRhLmVuZCgpKTsKK30KKwordm9pZCBNQ01hY2hPU3RyZWFtZXI6OkVtaXRWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIHsKKyAgLy8gVE9ETzogVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIFdpbkNPRkZTdHJlYW1lci4gQ29uc2lkZXIgbWVyZ2luZyBpbnRvCisgIC8vIE1DT2JqZWN0U3RyZWFtZXIuCisgIE1DRGF0YUZyYWdtZW50ICpERiA9IGdldE9yQ3JlYXRlRGF0YUZyYWdtZW50KCk7CisKKyAgLy8gQXZvaWQgZml4dXBzIHdoZW4gcG9zc2libGUuCisgIGludDY0X3QgQWJzVmFsdWU7CisgIGlmIChBZGRWYWx1ZVN5bWJvbHMoVmFsdWUpLT5FdmFsdWF0ZUFzQWJzb2x1dGUoQWJzVmFsdWUpKSB7CisgICAgLy8gRklYTUU6IEVuZGlhbm5lc3MgYXNzdW1wdGlvbi4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFNpemU7ICsraSkKKyAgICAgIERGLT5nZXRDb250ZW50cygpLnB1c2hfYmFjayh1aW50OF90KEFic1ZhbHVlID4+IChpICogOCkpKTsKKyAgfSBlbHNlIHsKKyAgICBERi0+YWRkRml4dXAoTUNGaXh1cDo6Q3JlYXRlKERGLT5nZXRDb250ZW50cygpLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFZhbHVlU3ltYm9scyhWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0ZpeHVwOjpnZXRLaW5kRm9yU2l6ZShTaXplKSkpOworICAgIERGLT5nZXRDb250ZW50cygpLnJlc2l6ZShERi0+Z2V0Q29udGVudHMoKS5zaXplKCkgKyBTaXplLCAwKTsKKyAgfQorfQorCit2b2lkIE1DTWFjaE9TdHJlYW1lcjo6RW1pdFZhbHVlVG9BbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IFZhbHVlLCB1bnNpZ25lZCBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQpIHsKKyAgLy8gVE9ETzogVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIFdpbkNPRkZTdHJlYW1lci4gQ29uc2lkZXIgbWVyZ2luZyBpbnRvCisgIC8vIE1DT2JqZWN0U3RyZWFtZXIuCisgIGlmIChNYXhCeXRlc1RvRW1pdCA9PSAwKQorICAgIE1heEJ5dGVzVG9FbWl0ID0gQnl0ZUFsaWdubWVudDsKKyAgbmV3IE1DQWxpZ25GcmFnbWVudChCeXRlQWxpZ25tZW50LCBWYWx1ZSwgVmFsdWVTaXplLCBNYXhCeXRlc1RvRW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50U2VjdGlvbkRhdGEoKSk7CisKKyAgLy8gVXBkYXRlIHRoZSBtYXhpbXVtIGFsaWdubWVudCBvbiB0aGUgY3VycmVudCBzZWN0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgaWYgKEJ5dGVBbGlnbm1lbnQgPiBnZXRDdXJyZW50U2VjdGlvbkRhdGEoKS0+Z2V0QWxpZ25tZW50KCkpCisgICAgZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCktPnNldEFsaWdubWVudChCeXRlQWxpZ25tZW50KTsKK30KKwordm9pZCBNQ01hY2hPU3RyZWFtZXI6OkVtaXRDb2RlQWxpZ25tZW50KHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQpIHsKKyAgLy8gVE9ETzogVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIFdpbkNPRkZTdHJlYW1lci4gQ29uc2lkZXIgbWVyZ2luZyBpbnRvCisgIC8vIE1DT2JqZWN0U3RyZWFtZXIuCisgIGlmIChNYXhCeXRlc1RvRW1pdCA9PSAwKQorICAgIE1heEJ5dGVzVG9FbWl0ID0gQnl0ZUFsaWdubWVudDsKKyAgTUNBbGlnbkZyYWdtZW50ICpGID0gbmV3IE1DQWxpZ25GcmFnbWVudChCeXRlQWxpZ25tZW50LCAwLCAxLCBNYXhCeXRlc1RvRW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50U2VjdGlvbkRhdGEoKSk7CisgIEYtPnNldEVtaXROb3BzKHRydWUpOworCisgIC8vIFVwZGF0ZSB0aGUgbWF4aW11bSBhbGlnbm1lbnQgb24gdGhlIGN1cnJlbnQgc2VjdGlvbiBpZiBuZWNlc3NhcnkuCisgIGlmIChCeXRlQWxpZ25tZW50ID4gZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCktPmdldEFsaWdubWVudCgpKQorICAgIGdldEN1cnJlbnRTZWN0aW9uRGF0YSgpLT5zZXRBbGlnbm1lbnQoQnl0ZUFsaWdubWVudCk7Cit9CisKK3ZvaWQgTUNNYWNoT1N0cmVhbWVyOjpFbWl0VmFsdWVUb09mZnNldChjb25zdCBNQ0V4cHIgKk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFZhbHVlKSB7CisgIG5ldyBNQ09yZ0ZyYWdtZW50KCpPZmZzZXQsIFZhbHVlLCBnZXRDdXJyZW50U2VjdGlvbkRhdGEoKSk7Cit9CisKK3ZvaWQgTUNNYWNoT1N0cmVhbWVyOjpFbWl0SW5zdFRvRnJhZ21lbnQoY29uc3QgTUNJbnN0ICZJbnN0KSB7CisgIE1DSW5zdEZyYWdtZW50ICpJRiA9IG5ldyBNQ0luc3RGcmFnbWVudChJbnN0LCBnZXRDdXJyZW50U2VjdGlvbkRhdGEoKSk7CisKKyAgLy8gQWRkIHRoZSBmaXh1cHMgYW5kIGRhdGEuCisgIC8vCisgIC8vIEZJWE1FOiBSZXZpc2l0IHRoaXMgZGVzaWduIGRlY2lzaW9uIHdoZW4gcmVsYXhhdGlvbiBpcyBkb25lLCB3ZSBtYXkgYmUKKyAgLy8gYWJsZSB0byBnZXQgYXdheSB3aXRoIG5vdCBzdG9yaW5nIGFueSBleHRyYSBkYXRhIGluIHRoZSBNQ0luc3QuCisgIFNtYWxsVmVjdG9yPE1DRml4dXAsIDQ+IEZpeHVwczsKKyAgU21hbGxTdHJpbmc8MjU2PiBDb2RlOworICByYXdfc3ZlY3Rvcl9vc3RyZWFtIFZlY09TKENvZGUpOworICBnZXRBc3NlbWJsZXIoKS5nZXRFbWl0dGVyKCkuRW5jb2RlSW5zdHJ1Y3Rpb24oSW5zdCwgVmVjT1MsIEZpeHVwcyk7CisgIFZlY09TLmZsdXNoKCk7CisKKyAgSUYtPmdldENvZGUoKSA9IENvZGU7CisgIElGLT5nZXRGaXh1cHMoKSA9IEZpeHVwczsKK30KKwordm9pZCBNQ01hY2hPU3RyZWFtZXI6OkVtaXRJbnN0VG9EYXRhKGNvbnN0IE1DSW5zdCAmSW5zdCkgeworICBNQ0RhdGFGcmFnbWVudCAqREYgPSBnZXRPckNyZWF0ZURhdGFGcmFnbWVudCgpOworCisgIFNtYWxsVmVjdG9yPE1DRml4dXAsIDQ+IEZpeHVwczsKKyAgU21hbGxTdHJpbmc8MjU2PiBDb2RlOworICByYXdfc3ZlY3Rvcl9vc3RyZWFtIFZlY09TKENvZGUpOworICBnZXRBc3NlbWJsZXIoKS5nZXRFbWl0dGVyKCkuRW5jb2RlSW5zdHJ1Y3Rpb24oSW5zdCwgVmVjT1MsIEZpeHVwcyk7CisgIFZlY09TLmZsdXNoKCk7CisKKyAgLy8gQWRkIHRoZSBmaXh1cHMgYW5kIGRhdGEuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGaXh1cHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIEZpeHVwc1tpXS5zZXRPZmZzZXQoRml4dXBzW2ldLmdldE9mZnNldCgpICsgREYtPmdldENvbnRlbnRzKCkuc2l6ZSgpKTsKKyAgICBERi0+YWRkRml4dXAoRml4dXBzW2ldKTsKKyAgfQorICBERi0+Z2V0Q29udGVudHMoKS5hcHBlbmQoQ29kZS5iZWdpbigpLCBDb2RlLmVuZCgpKTsKK30KKwordm9pZCBNQ01hY2hPU3RyZWFtZXI6OkVtaXRJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgJkluc3QpIHsKKyAgLy8gU2NhbiBmb3IgdmFsdWVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSBJbnN0LmdldE51bU9wZXJhbmRzKCk7IGktLTsgKQorICAgIGlmIChJbnN0LmdldE9wZXJhbmQoaSkuaXNFeHByKCkpCisgICAgICBBZGRWYWx1ZVN5bWJvbHMoSW5zdC5nZXRPcGVyYW5kKGkpLmdldEV4cHIoKSk7CisKKyAgZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCktPnNldEhhc0luc3RydWN0aW9ucyh0cnVlKTsKKworICAvLyBJZiB0aGlzIGluc3RydWN0aW9uIGRvZXNuJ3QgbmVlZCByZWxheGF0aW9uLCBqdXN0IGVtaXQgaXQgYXMgZGF0YS4KKyAgaWYgKCFnZXRBc3NlbWJsZXIoKS5nZXRCYWNrZW5kKCkuTWF5TmVlZFJlbGF4YXRpb24oSW5zdCkpIHsKKyAgICBFbWl0SW5zdFRvRGF0YShJbnN0KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBPdGhlcndpc2UsIGlmIHdlIGFyZSByZWxheGluZyBldmVyeXRoaW5nLCByZWxheCB0aGUgaW5zdHJ1Y3Rpb24gYXMgbXVjaCBhcworICAvLyBwb3NzaWJsZSBhbmQgZW1pdCBpdCBhcyBkYXRhLgorICBpZiAoZ2V0QXNzZW1ibGVyKCkuZ2V0UmVsYXhBbGwoKSkgeworICAgIE1DSW5zdCBSZWxheGVkOworICAgIGdldEFzc2VtYmxlcigpLmdldEJhY2tlbmQoKS5SZWxheEluc3RydWN0aW9uKEluc3QsIFJlbGF4ZWQpOworICAgIHdoaWxlIChnZXRBc3NlbWJsZXIoKS5nZXRCYWNrZW5kKCkuTWF5TmVlZFJlbGF4YXRpb24oUmVsYXhlZCkpCisgICAgICBnZXRBc3NlbWJsZXIoKS5nZXRCYWNrZW5kKCkuUmVsYXhJbnN0cnVjdGlvbihSZWxheGVkLCBSZWxheGVkKTsKKyAgICBFbWl0SW5zdFRvRGF0YShSZWxheGVkKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBPdGhlcndpc2UgZW1pdCB0byBhIHNlcGFyYXRlIGZyYWdtZW50LgorICBFbWl0SW5zdFRvRnJhZ21lbnQoSW5zdCk7Cit9CisKKy8vCisvLyBUaGlzIGhlbHBlciByb3V0aW5lIHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBFbmQgLSBTdGFydCArIEludFZhbCBmb3IgdXNlCisvLyBieSBFbWl0RHdhcmZGaWxlVGFibGUoKSBiZWxvdy4KKy8vIAorY29uc3QgTUNFeHByICogTUNNYWNoT1N0cmVhbWVyOjpNYWtlU3RhcnRNaW51c0VuZEV4cHIoTUNTeW1ib2wgKlN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTeW1ib2wgKkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBJbnRWYWwpIHsKKyAgTUNTeW1ib2xSZWZFeHByOjpWYXJpYW50S2luZCBWYXJpYW50ID0gTUNTeW1ib2xSZWZFeHByOjpWS19Ob25lOworICBjb25zdCBNQ0V4cHIgKlJlcyA9CisgICAgTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoRW5kLCBWYXJpYW50LCBnZXRDb250ZXh0KCkpOworICBjb25zdCBNQ0V4cHIgKlJIUyA9CisgICAgTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoU3RhcnQsIFZhcmlhbnQsIGdldENvbnRleHQoKSk7CisgIGNvbnN0IE1DRXhwciAqUmVzMSA9CisgICAgTUNCaW5hcnlFeHByOjpDcmVhdGUoTUNCaW5hcnlFeHByOjpTdWIsIFJlcywgUkhTLGdldENvbnRleHQoKSk7CisgIGNvbnN0IE1DRXhwciAqUmVzMiA9CisgICAgTUNDb25zdGFudEV4cHI6OkNyZWF0ZShJbnRWYWwsIGdldENvbnRleHQoKSk7CisgIGNvbnN0IE1DRXhwciAqUmVzMyA9CisgICAgTUNCaW5hcnlFeHByOjpDcmVhdGUoTUNCaW5hcnlFeHByOjpTdWIsIFJlczEsIFJlczIsIGdldENvbnRleHQoKSk7CisgIHJldHVybiBSZXMzOworfQorCisvLworLy8gVGhpcyBlbWl0cyB0aGUgRHdhcmYgZmlsZSAoYW5kIGV2ZW50dWFsbHkgdGhlIGxpbmUpIHRhYmxlLgorLy8KK3ZvaWQgTUNNYWNoT1N0cmVhbWVyOjpFbWl0RHdhcmZGaWxlVGFibGUodm9pZCkgeworICAvLyBGb3Igbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBwdXQgb3V0IHRoZSBEd2FyZiBmaWxlIHRhYmxlIGlmIG5vIC5maWxlCisgIC8vIGRpcmVjdGl2ZXMgd2VyZSBzZWVuLgorICBjb25zdCBzdGQ6OnZlY3RvcjxNQ0R3YXJmRmlsZSAqPiAmTUNEd2FyZkZpbGVzID0KKyAgICBnZXRDb250ZXh0KCkuZ2V0TUNEd2FyZkZpbGVzKCk7CisgIGlmIChNQ0R3YXJmRmlsZXMuc2l6ZSgpID09IDApCisgICAgcmV0dXJuOworCisgIC8vIFRoaXMgaXMgdGhlIE1hY2gtTyBzZWN0aW9uLCBmb3IgRUxGIGl0IGlzIHRoZSAuZGVidWdfbGluZSBzZWN0aW9uLgorICBTd2l0Y2hTZWN0aW9uKGdldENvbnRleHQoKS5nZXRNYWNoT1NlY3Rpb24oIl9fRFdBUkYiLCAiX19kZWJ1Z19saW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU2VjdGlvbktpbmQ6OmdldERhdGFSZWxMb2NhbCgpKSk7CisKKyAgLy8gQ3JlYXRlIGEgc3ltYm9sIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzZWN0aW9uLgorICBNQ1N5bWJvbCAqTGluZVN0YXJ0U3ltID0gZ2V0Q29udGV4dCgpLkNyZWF0ZVRlbXBTeW1ib2woKTsKKyAgLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCBhcyB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLgorICBFbWl0TGFiZWwoTGluZVN0YXJ0U3ltKTsKKworICAvLyBDcmVhdGUgYSBzeW1ib2wgZm9yIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gKHRvIGJlIHNldCB3aGVuIHdlIGdldCB0aGVyZSkuCisgIE1DU3ltYm9sICpMaW5lRW5kU3ltID0gZ2V0Q29udGV4dCgpLkNyZWF0ZVRlbXBTeW1ib2woKTsKKworICAvLyBUaGUgZmlyc3QgNCBieXRlcyBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhpcworICAvLyBjb21waWxhdGlvbiB1bml0IChub3QgaW5jbHVkaW5nIHRoZXNlIDQgYnl0ZXMgZm9yIHRoZSBsZW5ndGgpLgorICBFbWl0VmFsdWUoTWFrZVN0YXJ0TWludXNFbmRFeHByKExpbmVTdGFydFN5bSwgTGluZUVuZFN5bSwgNCksIDQsIDApOworCisgIC8vIE5leHQgMiBieXRlcyBpcyB0aGUgVmVyc2lvbiwgd2hpY2ggaXMgRHdhcmYgMi4KKyAgRW1pdEludFZhbHVlKDIsIDIpOworCisgIC8vIENyZWF0ZSBhIHN5bWJvbCBmb3IgdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUgKHRvIGJlIHNldCB3aGVuIHdlIGdldCB0aGVyZSkuCisgIE1DU3ltYm9sICpQcm9FbmRTeW0gPSBnZXRDb250ZXh0KCkuQ3JlYXRlVGVtcFN5bWJvbCgpOyAvLyBMcHJvbG9ndWVfZW5kCisKKyAgLy8gTGVuZ3RoIG9mIHRoZSBwcm9sb2d1ZSwgaXMgdGhlIG5leHQgNCBieXRlcy4gIFdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gc2VjdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBwcm9sb2d1ZS4gIE5vdCBpbmNsdWRpbmcgdGhlIDQgYnl0ZXMgZm9yIHRoZQorICAvLyB0b3RhbCBsZW5ndGgsIHRoZSAyIGJ5dGVzIGZvciB0aGUgdmVyc2lvbiwgYW5kIHRoZXNlIDQgYnl0ZXMgZm9yIHRoZQorICAvLyBsZW5ndGggb2YgdGhlIHByb2xvZ3VlLgorICBFbWl0VmFsdWUoTWFrZVN0YXJ0TWludXNFbmRFeHByKExpbmVTdGFydFN5bSwgUHJvRW5kU3ltLCAoNCArIDIgKyA0KSksIDQsIDApOworCisgIC8vIFBhcmFtZXRlcnMgb2YgdGhlIHN0YXRlIG1hY2hpbmUsIGFyZSBuZXh0LgorICAvLyAgRGVmaW5lIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IG1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoIChpbgorICAvLyAgYnl0ZXMpLiAgVGhpcyB2YWx1ZSBzaG91bGQgYmUgcmF0aGVyIHRvbyBzbWFsbCB0aGFuIHRvbyBiaWcuICAqLworICAvLyAgRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RICisgIEVtaXRJbnRWYWx1ZSgxLCAxKTsKKyAgLy8gIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGlzX3N0bXRfc3RhcnQgZmxhZy4KKyAgLy8gIERXQVJGMl9MSU5FX0RFRkFVTFRfSVNfU1RNVAorICBFbWl0SW50VmFsdWUoMSwgMSk7CisgIC8vICBNaW5pbXVtIGxpbmUgb2Zmc2V0IGluIGEgc3BlY2lhbCBsaW5lIGluZm8uIG9wY29kZS4gIFRoaXMgdmFsdWUKKyAgLy8gIHdhcyBjaG9zZW4gdG8gZ2l2ZSBhIHJlYXNvbmFibGUgcmFuZ2Ugb2YgdmFsdWVzLiAgKi8KKyAgLy8gIERXQVJGMl9MSU5FX0JBU0UKKyAgRW1pdEludFZhbHVlKC01LCAxKTsKKyAgLy8gIFJhbmdlIG9mIGxpbmUgb2Zmc2V0cyBpbiBhIHNwZWNpYWwgbGluZSBpbmZvLiBvcGNvZGUuCisgIC8vICBEV0FSRjJfTElORV9SQU5HRQorICBFbWl0SW50VmFsdWUoMTQsIDEpOworICAvLyAgRmlyc3Qgc3BlY2lhbCBsaW5lIG9wY29kZSAtIGxlYXZlIHJvb20gZm9yIHRoZSBzdGFuZGFyZCBvcGNvZGVzLgorICAvLyAgRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0UKKyAgRW1pdEludFZhbHVlKDEzLCAxKTsKKworICAvLyBTdGFuZGFyZCBvcGNvZGUgbGVuZ3RocworICBFbWl0SW50VmFsdWUoMCwgMSk7IC8vIGxlbmd0aCBvZiBEV19MTlNfY29weQorICBFbWl0SW50VmFsdWUoMSwgMSk7IC8vIGxlbmd0aCBvZiBEV19MTlNfYWR2YW5jZV9wYworICBFbWl0SW50VmFsdWUoMSwgMSk7IC8vIGxlbmd0aCBvZiBEV19MTlNfYWR2YW5jZV9saW5lCisgIEVtaXRJbnRWYWx1ZSgxLCAxKTsgLy8gbGVuZ3RoIG9mIERXX0xOU19zZXRfZmlsZQorICBFbWl0SW50VmFsdWUoMSwgMSk7IC8vIGxlbmd0aCBvZiBEV19MTlNfc2V0X2NvbHVtbgorICBFbWl0SW50VmFsdWUoMCwgMSk7IC8vIGxlbmd0aCBvZiBEV19MTlNfbmVnYXRlX3N0bXQKKyAgRW1pdEludFZhbHVlKDAsIDEpOyAvLyBsZW5ndGggb2YgRFdfTE5TX3NldF9iYXNpY19ibG9jaworICBFbWl0SW50VmFsdWUoMCwgMSk7IC8vIGxlbmd0aCBvZiBEV19MTlNfY29uc3RfYWRkX3BjCisgIEVtaXRJbnRWYWx1ZSgxLCAxKTsgLy8gbGVuZ3RoIG9mIERXX0xOU19maXhlZF9hZHZhbmNlX3BjCisgIEVtaXRJbnRWYWx1ZSgwLCAxKTsgLy8gbGVuZ3RoIG9mIERXX0xOU19zZXRfcHJvbG9ndWVfZW5kCisgIEVtaXRJbnRWYWx1ZSgwLCAxKTsgLy8gbGVuZ3RoIG9mIERXX0xOU19zZXRfZXBpbG9ndWVfYmVnaW4KKyAgRW1pdEludFZhbHVlKDEsIDEpOyAvLyBEV19MTlNfc2V0X2lzYQorCisgIC8vIFB1dCBvdXQgdGhlIGRpcmVjdG9yeSBhbmQgZmlsZSB0YWJsZXMuCisKKyAgLy8gRmlyc3QgdGhlIGRpcmVjdG9yeSB0YWJsZS4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmTUNEd2FyZkRpcnMgPQorICAgIGdldENvbnRleHQoKS5nZXRNQ0R3YXJmRGlycygpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTUNEd2FyZkRpcnMuc2l6ZSgpOyBpKyspIHsKKyAgICBFbWl0Qnl0ZXMoTUNEd2FyZkRpcnNbaV0sIDApOyAvLyB0aGUgRGlyZWN0b3J5TmFtZQorICAgIEVtaXRCeXRlcyhTdHJpbmdSZWYoIlwwIiwgMSksIDApOyAvLyB0aGUgbnVsbCB0ZXJtaW5hdGlvbiBvZiB0aGUgc3RyaW5nCisgIH0KKyAgRW1pdEludFZhbHVlKDAsIDEpOyAvLyBUZXJtaW5hdGUgdGhlIGRpcmVjdG9yeSBsaXN0CisKKyAgLy8gU2Vjb25kIHRoZSBmaWxlIHRhYmxlLgorICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgTUNEd2FyZkZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgRW1pdEJ5dGVzKE1DRHdhcmZGaWxlc1tpXS0+Z2V0TmFtZSgpLCAwKTsgLy8gRmlsZU5hbWUKKyAgICBFbWl0Qnl0ZXMoU3RyaW5nUmVmKCJcMCIsIDEpLCAwKTsgLy8gdGhlIG51bGwgdGVybWluYXRpb24gb2YgdGhlIHN0cmluZworICAgIC8vIEZJWE1FIHRoZSBEaXJlY3RvcnkgbnVtYmVyIHNob3VsZCBiZSBhIC51bGViMTI4IG5vdCBhIC5ieXRlCisgICAgRW1pdEludFZhbHVlKE1DRHdhcmZGaWxlc1tpXS0+Z2V0RGlySW5kZXgoKSwgMSk7CisgICAgRW1pdEludFZhbHVlKDAsIDEpOyAvLyBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgKGFsd2F5cyAwKQorICAgIEVtaXRJbnRWYWx1ZSgwLCAxKTsgLy8gZmlsZXNpemUgKGFsd2F5cyAwKQorICB9CisgIEVtaXRJbnRWYWx1ZSgwLCAxKTsgLy8gVGVybWluYXRlIHRoZSBmaWxlIGxpc3QKKworICAvLyBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIHByb2xvZ3VlLCBzbyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYXQgdGhlCisgIC8vIGVuZCBvZiB0aGUgcHJvbG9ndWUgKHRoYXQgd2FzIHVzZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uKS4KKyAgRW1pdExhYmVsKFByb0VuZFN5bSk7CisKKyAgLy8gVE9ETzogVGhpcyBpcyB0aGUgcG9pbnQgd2hlcmUgdGhlIGxpbmUgdGFibGVzIHdvdWxkIGJlIGVtaXR0ZWQuCisKKyAgLy8gSWYgdGhlcmUgYXJlIG5vIGxpbmUgdGFibGVzIGVtaXRlZCB0aGVuIHdlIGVtaXQ6CisgIC8vIFRoZSBmb2xsb3dpbmcgRFdfTE5FX3NldF9hZGRyZXNzIHNlcXVlbmNlIHRvIHNldCB0aGUgYWRkcmVzcyB0byB6ZXJvCisgIC8vICAgVE9ETyB0ZXN0IGZvciAzMi1iaXQgb3IgNjQtYml0IG91dHB1dAorICAvLyAgICAgVGhpcyBpcyB0aGUgc2VxdWVuY2UgZm9yIDMyLWJpdCBjb2RlCisgIEVtaXRJbnRWYWx1ZSgwLCAxKTsKKyAgRW1pdEludFZhbHVlKDUsIDEpOworICBFbWl0SW50VmFsdWUoMiwgMSk7CisgIEVtaXRJbnRWYWx1ZSgwLCAxKTsKKyAgRW1pdEludFZhbHVlKDAsIDEpOworICBFbWl0SW50VmFsdWUoMCwgMSk7CisgIEVtaXRJbnRWYWx1ZSgwLCAxKTsKKworICAvLyBMYXN0bHkgZW1pdCB0aGUgRFdfTE5FX2VuZF9zZXF1ZW5jZSB3aGljaCBjb25zaXN0cyBvZiAzIGJ5dGVzICcwMCAwMSAwMScKKyAgLy8gKDAwIGlzIHRoZSBjb2RlIGZvciBleHRlbmRlZCBvcGNvZGVzLCBmb2xsb3dlZCBieSBhIFVMRUIxMjggbGVuZ3RoIG9mIHRoZQorICAvLyBleHRlbmRlZCBvcGNvZGUgKDAxKSwgYW5kIHRoZSBEV19MTkVfZW5kX3NlcXVlbmNlICgwMSkuCisgIEVtaXRJbnRWYWx1ZSgwLCAxKTsgLy8gRFdfTE5TX2V4dGVuZGVkX29wCisgIEVtaXRJbnRWYWx1ZSgxLCAxKTsgLy8gVUxFQjEyOCBsZW5ndGggb2YgdGhlIGV4dGVuZGVkIG9wY29kZQorICBFbWl0SW50VmFsdWUoMSwgMSk7IC8vIERXX0xORV9lbmRfc2VxdWVuY2UKKworICAvLyBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24sIHNvIHNldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBhdCB0aGUgZW5kCisgIC8vIG9mIHRoaXMgc2VjdGlvbiAodGhhdCB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24pLgorICBFbWl0TGFiZWwoTGluZUVuZFN5bSk7Cit9CisKK3ZvaWQgTUNNYWNoT1N0cmVhbWVyOjpGaW5pc2goKSB7CisgIC8vIER1bXAgb3V0IHRoZSBkd2FyZiBmaWxlIGFuZCBkaXJlY3RvcnkgdGFibGVzIChzb29uIHRvIGluY2x1ZGUgbGluZSB0YWJsZSkKKyAgRW1pdER3YXJmRmlsZVRhYmxlKCk7CisKKyAgLy8gV2UgaGF2ZSB0byBzZXQgdGhlIGZyYWdtZW50IGF0b20gYXNzb2NpYXRpb25zIHNvIHdlIGNhbiByZWxheCBwcm9wZXJseSBmb3IKKyAgLy8gTWFjaC1PLgorCisgIC8vIEZpcnN0LCBzY2FuIHRoZSBzeW1ib2wgdGFibGUgdG8gYnVpbGQgYSBsb29rdXAgdGFibGUgZnJvbSBmcmFnbWVudHMgdG8KKyAgLy8gZGVmaW5pbmcgc3ltYm9scy4KKyAgRGVuc2VNYXA8Y29uc3QgTUNGcmFnbWVudCosIE1DU3ltYm9sRGF0YSo+IERlZmluaW5nU3ltYm9sTWFwOworICBmb3IgKE1DQXNzZW1ibGVyOjpzeW1ib2xfaXRlcmF0b3IgaXQgPSBnZXRBc3NlbWJsZXIoKS5zeW1ib2xfYmVnaW4oKSwKKyAgICAgICAgIGllID0gZ2V0QXNzZW1ibGVyKCkuc3ltYm9sX2VuZCgpOyBpdCAhPSBpZTsgKytpdCkgeworICAgIGlmIChnZXRBc3NlbWJsZXIoKS5pc1N5bWJvbExpbmtlclZpc2libGUoaXQtPmdldFN5bWJvbCgpKSAmJgorICAgICAgICBpdC0+Z2V0RnJhZ21lbnQoKSkgeworICAgICAgLy8gQW4gYXRvbSBkZWZpbmluZyBzeW1ib2wgc2hvdWxkIG5ldmVyIGJlIGludGVybmFsIHRvIGEgZnJhZ21lbnQuCisgICAgICBhc3NlcnQoaXQtPmdldE9mZnNldCgpID09IDAgJiYgIkludmFsaWQgb2Zmc2V0IGluIGF0b20gZGVmaW5pbmcgc3ltYm9sISIpOworICAgICAgRGVmaW5pbmdTeW1ib2xNYXBbaXQtPmdldEZyYWdtZW50KCldID0gaXQ7CisgICAgfQorICB9CisKKyAgLy8gU2V0IHRoZSBmcmFnbWVudCBhdG9tIGFzc29jaWF0aW9ucyBieSB0cmFja2luZyB0aGUgbGFzdCBzZWVuIGF0b20gZGVmaW5pbmcKKyAgLy8gc3ltYm9sLgorICBmb3IgKE1DQXNzZW1ibGVyOjppdGVyYXRvciBpdCA9IGdldEFzc2VtYmxlcigpLmJlZ2luKCksCisgICAgICAgICBpZSA9IGdldEFzc2VtYmxlcigpLmVuZCgpOyBpdCAhPSBpZTsgKytpdCkgeworICAgIE1DU3ltYm9sRGF0YSAqQ3VycmVudEF0b20gPSAwOworICAgIGZvciAoTUNTZWN0aW9uRGF0YTo6aXRlcmF0b3IgaXQyID0gaXQtPmJlZ2luKCksCisgICAgICAgICAgIGllMiA9IGl0LT5lbmQoKTsgaXQyICE9IGllMjsgKytpdDIpIHsKKyAgICAgIGlmIChNQ1N5bWJvbERhdGEgKlNEID0gRGVmaW5pbmdTeW1ib2xNYXAubG9va3VwKGl0MikpCisgICAgICAgIEN1cnJlbnRBdG9tID0gU0Q7CisgICAgICBpdDItPnNldEF0b20oQ3VycmVudEF0b20pOworICAgIH0KKyAgfQorCisgIHRoaXMtPk1DT2JqZWN0U3RyZWFtZXI6OkZpbmlzaCgpOworfQorCitNQ1N0cmVhbWVyICpsbHZtOjpjcmVhdGVNYWNoT1N0cmVhbWVyKE1DQ29udGV4dCAmQ29udGV4dCwgVGFyZ2V0QXNtQmFja2VuZCAmVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MsIE1DQ29kZUVtaXR0ZXIgKkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlbGF4QWxsKSB7CisgIE1DTWFjaE9TdHJlYW1lciAqUyA9IG5ldyBNQ01hY2hPU3RyZWFtZXIoQ29udGV4dCwgVEFCLCBPUywgQ0UpOworICBpZiAoUmVsYXhBbGwpCisgICAgUy0+Z2V0QXNzZW1ibGVyKCkuc2V0UmVsYXhBbGwodHJ1ZSk7CisgIHJldHVybiBTOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01DTnVsbFN0cmVhbWVyLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ051bGxTdHJlYW1lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMmFkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ051bGxTdHJlYW1lci5jcHAKQEAgLTAsMCArMSw4OCBAQAorLy89PT0tIGxpYi9NQy9NQ051bGxTdHJlYW1lci5jcHAgLSBEdW1teSBTdHJlYW1lciBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTUMvTUNTdHJlYW1lci5oIgorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uTWFjaE8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworCisgIGNsYXNzIE1DTnVsbFN0cmVhbWVyIDogcHVibGljIE1DU3RyZWFtZXIgeworICBwdWJsaWM6CisgICAgTUNOdWxsU3RyZWFtZXIoTUNDb250ZXh0ICZDb250ZXh0KSA6IE1DU3RyZWFtZXIoQ29udGV4dCkge30KKworICAgIC8vLyBAbmFtZSBNQ1N0cmVhbWVyIEludGVyZmFjZQorICAgIC8vLyBAeworCisgICAgdmlydHVhbCB2b2lkIFN3aXRjaFNlY3Rpb24oY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uKSB7CisgICAgICBDdXJTZWN0aW9uID0gU2VjdGlvbjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgRW1pdExhYmVsKE1DU3ltYm9sICpTeW1ib2wpIHsKKyAgICAgIGFzc2VydChTeW1ib2wtPmlzVW5kZWZpbmVkKCkgJiYgIkNhbm5vdCBkZWZpbmUgYSBzeW1ib2wgdHdpY2UhIik7CisgICAgICBhc3NlcnQoQ3VyU2VjdGlvbiAmJiAiQ2Fubm90IGVtaXQgYmVmb3JlIHNldHRpbmcgc2VjdGlvbiEiKTsKKyAgICAgIFN5bWJvbC0+c2V0U2VjdGlvbigqQ3VyU2VjdGlvbik7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIEVtaXRBc3NlbWJsZXJGbGFnKE1DQXNzZW1ibGVyRmxhZyBGbGFnKSB7fQorCisgICAgdmlydHVhbCB2b2lkIEVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgRW1pdFN5bWJvbEF0dHJpYnV0ZShNQ1N5bWJvbCAqU3ltYm9sLCBNQ1N5bWJvbEF0dHIgQXR0cmlidXRlKXt9CisKKyAgICB2aXJ0dWFsIHZvaWQgRW1pdFN5bWJvbERlc2MoTUNTeW1ib2wgKlN5bWJvbCwgdW5zaWduZWQgRGVzY1ZhbHVlKSB7fQorCisgICAgdmlydHVhbCB2b2lkIEJlZ2luQ09GRlN5bWJvbERlZihjb25zdCBNQ1N5bWJvbCAqU3ltYm9sKSB7fQorICAgIHZpcnR1YWwgdm9pZCBFbWl0Q09GRlN5bWJvbFN0b3JhZ2VDbGFzcyhpbnQgU3RvcmFnZUNsYXNzKSB7fQorICAgIHZpcnR1YWwgdm9pZCBFbWl0Q09GRlN5bWJvbFR5cGUoaW50IFR5cGUpIHt9CisgICAgdmlydHVhbCB2b2lkIEVuZENPRkZTeW1ib2xEZWYoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIEVtaXRFTEZTaXplKE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIHt9CisgICAgdmlydHVhbCB2b2lkIEVtaXRDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSB7fQorICAgIHZpcnR1YWwgdm9pZCBFbWl0TG9jYWxDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSkge30KKworICAgIHZpcnR1YWwgdm9pZCBFbWl0WmVyb2ZpbGwoY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUgPSAwLCB1bnNpZ25lZCBCeXRlQWxpZ25tZW50ID0gMCkge30KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdFRCU1NTeW1ib2woY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSB7fQorICAgIHZpcnR1YWwgdm9pZCBFbWl0Qnl0ZXMoU3RyaW5nUmVmIERhdGEsIHVuc2lnbmVkIEFkZHJTcGFjZSkge30KKworICAgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkge30KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEdQUmVsMzJWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKSB7fQorICAgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWVUb0FsaWdubWVudCh1bnNpZ25lZCBCeXRlQWxpZ25tZW50LCBpbnQ2NF90IFZhbHVlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWVTaXplID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQgPSAwKSB7fQorCisgICAgdmlydHVhbCB2b2lkIEVtaXRDb2RlQWxpZ25tZW50KHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0ID0gMCkge30KKworICAgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWVUb09mZnNldChjb25zdCBNQ0V4cHIgKk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBWYWx1ZSA9IDApIHt9CisgICAgCisgICAgdmlydHVhbCB2b2lkIEVtaXRGaWxlRGlyZWN0aXZlKFN0cmluZ1JlZiBGaWxlbmFtZSkge30KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdER3YXJmRmlsZURpcmVjdGl2ZSh1bnNpZ25lZCBGaWxlTm8sU3RyaW5nUmVmIEZpbGVuYW1lKSB7fQorICAgIHZpcnR1YWwgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTUNJbnN0ICZJbnN0KSB7fQorCisgICAgdmlydHVhbCB2b2lkIEZpbmlzaCgpIHt9CisgICAgCisgICAgLy8vIEB9CisgIH07CisKK30KKyAgICAKK01DU3RyZWFtZXIgKmxsdm06OmNyZWF0ZU51bGxTdHJlYW1lcihNQ0NvbnRleHQgJkNvbnRleHQpIHsKKyAgcmV0dXJuIG5ldyBNQ051bGxTdHJlYW1lcihDb250ZXh0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ09iamVjdFN0cmVhbWVyLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ09iamVjdFN0cmVhbWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQ0ZTdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DT2JqZWN0U3RyZWFtZXIuY3BwCkBAIC0wLDAgKzEsODYgQEAKKy8vPT09LSBsaWIvTUMvTUNPYmplY3RTdHJlYW1lci5jcHAgLSBPYmplY3QgRmlsZSBNQ1N0cmVhbWVyIEludGVyZmFjZSAtLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL01DL01DT2JqZWN0U3RyZWFtZXIuaCIKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb2RlRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtQmFja2VuZC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01DT2JqZWN0U3RyZWFtZXI6Ok1DT2JqZWN0U3RyZWFtZXIoTUNDb250ZXh0ICZDb250ZXh0LCBUYXJnZXRBc21CYWNrZW5kICZUQUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZfT1MsIE1DQ29kZUVtaXR0ZXIgKl9FbWl0dGVyKQorICA6IE1DU3RyZWFtZXIoQ29udGV4dCksIEFzc2VtYmxlcihuZXcgTUNBc3NlbWJsZXIoQ29udGV4dCwgVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9FbWl0dGVyLCBfT1MpKSwKKyAgICBDdXJTZWN0aW9uRGF0YSgwKQoreworfQorCitNQ09iamVjdFN0cmVhbWVyOjp+TUNPYmplY3RTdHJlYW1lcigpIHsKKyAgZGVsZXRlICZBc3NlbWJsZXItPmdldEJhY2tlbmQoKTsKKyAgZGVsZXRlICZBc3NlbWJsZXItPmdldEVtaXR0ZXIoKTsKKyAgZGVsZXRlIEFzc2VtYmxlcjsKK30KKworTUNGcmFnbWVudCAqTUNPYmplY3RTdHJlYW1lcjo6Z2V0Q3VycmVudEZyYWdtZW50KCkgY29uc3QgeworICBhc3NlcnQoZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCkgJiYgIk5vIGN1cnJlbnQgc2VjdGlvbiEiKTsKKworICBpZiAoIWdldEN1cnJlbnRTZWN0aW9uRGF0YSgpLT5lbXB0eSgpKQorICAgIHJldHVybiAmZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCktPmdldEZyYWdtZW50TGlzdCgpLmJhY2soKTsKKworICByZXR1cm4gMDsKK30KKworTUNEYXRhRnJhZ21lbnQgKk1DT2JqZWN0U3RyZWFtZXI6OmdldE9yQ3JlYXRlRGF0YUZyYWdtZW50KCkgY29uc3QgeworICBNQ0RhdGFGcmFnbWVudCAqRiA9IGR5bl9jYXN0X29yX251bGw8TUNEYXRhRnJhZ21lbnQ+KGdldEN1cnJlbnRGcmFnbWVudCgpKTsKKyAgaWYgKCFGKQorICAgIEYgPSBuZXcgTUNEYXRhRnJhZ21lbnQoZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCkpOworICByZXR1cm4gRjsKK30KKworY29uc3QgTUNFeHByICpNQ09iamVjdFN0cmVhbWVyOjpBZGRWYWx1ZVN5bWJvbHMoY29uc3QgTUNFeHByICpWYWx1ZSkgeworICBzd2l0Y2ggKFZhbHVlLT5nZXRLaW5kKCkpIHsKKyAgY2FzZSBNQ0V4cHI6OlRhcmdldDogbGx2bV91bnJlYWNoYWJsZSgiQ2FuJ3QgaGFuZGxlIHRhcmdldCBleHBycyB5ZXQhIik7CisgIGNhc2UgTUNFeHByOjpDb25zdGFudDoKKyAgICBicmVhazsKKworICBjYXNlIE1DRXhwcjo6QmluYXJ5OiB7CisgICAgY29uc3QgTUNCaW5hcnlFeHByICpCRSA9IGNhc3Q8TUNCaW5hcnlFeHByPihWYWx1ZSk7CisgICAgQWRkVmFsdWVTeW1ib2xzKEJFLT5nZXRMSFMoKSk7CisgICAgQWRkVmFsdWVTeW1ib2xzKEJFLT5nZXRSSFMoKSk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIE1DRXhwcjo6U3ltYm9sUmVmOgorICAgIEFzc2VtYmxlci0+Z2V0T3JDcmVhdGVTeW1ib2xEYXRhKGNhc3Q8TUNTeW1ib2xSZWZFeHByPihWYWx1ZSktPmdldFN5bWJvbCgpKTsKKyAgICBicmVhazsKKworICBjYXNlIE1DRXhwcjo6VW5hcnk6CisgICAgQWRkVmFsdWVTeW1ib2xzKGNhc3Q8TUNVbmFyeUV4cHI+KFZhbHVlKS0+Z2V0U3ViRXhwcigpKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBWYWx1ZTsKK30KKwordm9pZCBNQ09iamVjdFN0cmVhbWVyOjpTd2l0Y2hTZWN0aW9uKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbikgeworICBhc3NlcnQoU2VjdGlvbiAmJiAiQ2Fubm90IHN3aXRjaCB0byBhIG51bGwgc2VjdGlvbiEiKTsKKworICAvLyBJZiBhbHJlYWR5IGluIHRoaXMgc2VjdGlvbiwgdGhlbiB0aGlzIGlzIGEgbm9vcC4KKyAgaWYgKFNlY3Rpb24gPT0gQ3VyU2VjdGlvbikgcmV0dXJuOworCisgIEN1clNlY3Rpb24gPSBTZWN0aW9uOworICBDdXJTZWN0aW9uRGF0YSA9ICZnZXRBc3NlbWJsZXIoKS5nZXRPckNyZWF0ZVNlY3Rpb25EYXRhKCpTZWN0aW9uKTsKK30KKwordm9pZCBNQ09iamVjdFN0cmVhbWVyOjpGaW5pc2goKSB7CisgIGdldEFzc2VtYmxlcigpLkZpbmlzaCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01DT2JqZWN0V3JpdGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ09iamVjdFdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExN2U4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ09iamVjdFdyaXRlci5jcHAKQEAgLTAsMCArMSwxNSBAQAorLy89PT0tIGxpYi9NQy9NQ09iamVjdFdyaXRlci5jcHAgLSBNQ09iamVjdFdyaXRlciBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTUMvTUNPYmplY3RXcml0ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01DT2JqZWN0V3JpdGVyOjp+TUNPYmplY3RXcml0ZXIoKSB7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNQYXJzZXIvQXNtTGV4ZXIuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL0FzbUxleGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjVkOTgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL0FzbUxleGVyLmNwcApAQCAtMCwwICsxLDMyOCBAQAorLy89PT0tIEFzbUxleGVyLmNwcCAtIExleGVyIGZvciBBc3NlbWJseSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGxleGVyIGZvciBhc3NlbWJseSBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9Bc21MZXhlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitBc21MZXhlcjo6QXNtTGV4ZXIoY29uc3QgTUNBc21JbmZvICZfTUFJKSA6IE1BSShfTUFJKSAgeworICBDdXJCdWYgPSBOVUxMOworICBDdXJQdHIgPSBOVUxMOworfQorCitBc21MZXhlcjo6fkFzbUxleGVyKCkgeworfQorCit2b2lkIEFzbUxleGVyOjpzZXRCdWZmZXIoY29uc3QgTWVtb3J5QnVmZmVyICpidWYsIGNvbnN0IGNoYXIgKnB0cikgeworICBDdXJCdWYgPSBidWY7CisgIAorICBpZiAocHRyKQorICAgIEN1clB0ciA9IHB0cjsKKyAgZWxzZQorICAgIEN1clB0ciA9IEN1ckJ1Zi0+Z2V0QnVmZmVyU3RhcnQoKTsKKyAgCisgIFRva1N0YXJ0ID0gMDsKK30KKworLy8vIFJldHVybkVycm9yIC0gU2V0IHRoZSBlcnJvciB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBhdCB0aGUgc3BlY2lmaWVkCisvLy8gbG9jYXRpb24uICBUaGlzIGlzIGRlZmluZWQgdG8gYWx3YXlzIHJldHVybiBBc21Ub2tlbjo6RXJyb3IuCitBc21Ub2tlbiBBc21MZXhlcjo6UmV0dXJuRXJyb3IoY29uc3QgY2hhciAqTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTXNnKSB7CisgIFNldEVycm9yKFNNTG9jOjpnZXRGcm9tUG9pbnRlcihMb2MpLCBNc2cpOworICAKKyAgcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpFcnJvciwgU3RyaW5nUmVmKExvYywgMCkpOworfQorCitpbnQgQXNtTGV4ZXI6OmdldE5leHRDaGFyKCkgeworICBjaGFyIEN1ckNoYXIgPSAqQ3VyUHRyKys7CisgIHN3aXRjaCAoQ3VyQ2hhcikgeworICBkZWZhdWx0OgorICAgIHJldHVybiAodW5zaWduZWQgY2hhcilDdXJDaGFyOworICBjYXNlIDA6CisgICAgLy8gQSBudWwgY2hhcmFjdGVyIGluIHRoZSBzdHJlYW0gaXMgZWl0aGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIG9yCisgICAgLy8gYSByYW5kb20gbnVsIGluIHRoZSBmaWxlLiAgRGlzYW1iaWd1YXRlIHRoYXQgaGVyZS4KKyAgICBpZiAoQ3VyUHRyLTEgIT0gQ3VyQnVmLT5nZXRCdWZmZXJFbmQoKSkKKyAgICAgIHJldHVybiAwOyAgLy8gSnVzdCB3aGl0ZXNwYWNlLgorICAgIAorICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIGVuZCBvZiBmaWxlLgorICAgIC0tQ3VyUHRyOyAgLy8gQW5vdGhlciBjYWxsIHRvIGxleCB3aWxsIHJldHVybiBFT0YgYWdhaW4uICAKKyAgICByZXR1cm4gRU9GOworICB9Cit9CisKKy8vLyBMZXhJZGVudGlmaWVyOiBbYS16QS1aXy5dW2EtekEtWjAtOV8kLkBdKgorQXNtVG9rZW4gQXNtTGV4ZXI6OkxleElkZW50aWZpZXIoKSB7CisgIHdoaWxlIChpc2FsbnVtKCpDdXJQdHIpIHx8ICpDdXJQdHIgPT0gJ18nIHx8ICpDdXJQdHIgPT0gJyQnIHx8CisgICAgICAgICAqQ3VyUHRyID09ICcuJyB8fCAqQ3VyUHRyID09ICdAJykKKyAgICArK0N1clB0cjsKKyAgCisgIC8vIEhhbmRsZSAuIGFzIGEgc3BlY2lhbCBjYXNlLgorICBpZiAoQ3VyUHRyID09IFRva1N0YXJ0KzEgJiYgVG9rU3RhcnRbMF0gPT0gJy4nKQorICAgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6RG90LCBTdHJpbmdSZWYoVG9rU3RhcnQsIDEpKTsKKyAgCisgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6SWRlbnRpZmllciwgU3RyaW5nUmVmKFRva1N0YXJ0LCBDdXJQdHIgLSBUb2tTdGFydCkpOworfQorCisvLy8gTGV4U2xhc2g6IFNsYXNoOiAvCisvLy8gICAgICAgICAgIEMtU3R5bGUgQ29tbWVudDogLyogLi4uICovCitBc21Ub2tlbiBBc21MZXhlcjo6TGV4U2xhc2goKSB7CisgIHN3aXRjaCAoKkN1clB0cikgeworICBjYXNlICcqJzogYnJlYWs7IC8vIEMgc3R5bGUgY29tbWVudC4KKyAgY2FzZSAnLyc6IHJldHVybiArK0N1clB0ciwgTGV4TGluZUNvbW1lbnQoKTsKKyAgZGVmYXVsdDogIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6U2xhc2gsIFN0cmluZ1JlZihDdXJQdHIsIDEpKTsKKyAgfQorCisgIC8vIEMgU3R5bGUgY29tbWVudC4KKyAgKytDdXJQdHI7ICAvLyBza2lwIHRoZSBzdGFyLgorICB3aGlsZSAoMSkgeworICAgIGludCBDdXJDaGFyID0gZ2V0TmV4dENoYXIoKTsKKyAgICBzd2l0Y2ggKEN1ckNoYXIpIHsKKyAgICBjYXNlIEVPRjoKKyAgICAgIHJldHVybiBSZXR1cm5FcnJvcihUb2tTdGFydCwgInVudGVybWluYXRlZCBjb21tZW50Iik7CisgICAgY2FzZSAnKic6CisgICAgICAvLyBFbmQgb2YgdGhlIGNvbW1lbnQ/CisgICAgICBpZiAoQ3VyUHRyWzBdICE9ICcvJykgYnJlYWs7CisgICAgICAKKyAgICAgICsrQ3VyUHRyOyAgIC8vIEVuZCB0aGUgKi8uCisgICAgICByZXR1cm4gTGV4VG9rZW4oKTsKKyAgICB9CisgIH0KK30KKworLy8vIExleExpbmVDb21tZW50OiBDb21tZW50OiAjW15cbl0qCisvLy8gICAgICAgICAgICAgICAgICAgICAgICA6IC8vW15cbl0qCitBc21Ub2tlbiBBc21MZXhlcjo6TGV4TGluZUNvbW1lbnQoKSB7CisgIC8vIEZJWE1FOiBUaGlzIGlzIGJyb2tlbiBpZiB3ZSBoYXBwZW4gdG8gYSBjb21tZW50IGF0IHRoZSBlbmQgb2YgYSBmaWxlLCB3aGljaAorICAvLyB3YXMgLmluY2x1ZGVkLCBhbmQgd2hpY2ggZG9lc24ndCBlbmQgd2l0aCBhIG5ld2xpbmUuCisgIGludCBDdXJDaGFyID0gZ2V0TmV4dENoYXIoKTsKKyAgd2hpbGUgKEN1ckNoYXIgIT0gJ1xuJyAmJiBDdXJDaGFyICE9ICdcbicgJiYgQ3VyQ2hhciAhPSBFT0YpCisgICAgQ3VyQ2hhciA9IGdldE5leHRDaGFyKCk7CisgIAorICBpZiAoQ3VyQ2hhciA9PSBFT0YpCisgICAgcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpFb2YsIFN0cmluZ1JlZihDdXJQdHIsIDApKTsKKyAgcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCwgU3RyaW5nUmVmKEN1clB0ciwgMCkpOworfQorCisKKy8vLyBMZXhEaWdpdDogRmlyc3QgY2hhcmFjdGVyIGlzIFswLTldLgorLy8vICAgTG9jYWwgTGFiZWw6IFswLTldWzpdCisvLy8gICBGb3J3YXJkL0JhY2t3YXJkIExhYmVsOiBbMC05XVtmYl0KKy8vLyAgIEJpbmFyeSBpbnRlZ2VyOiAwYlswMV0rCisvLy8gICBPY3RhbCBpbnRlZ2VyOiAwWzAtN10rCisvLy8gICBIZXggaW50ZWdlcjogMHhbMC05YS1mQS1GXSsKKy8vLyAgIERlY2ltYWwgaW50ZWdlcjogWzEtOV1bMC05XSoKKy8vLyBUT0RPOiBGUCBsaXRlcmFsLgorQXNtVG9rZW4gQXNtTGV4ZXI6OkxleERpZ2l0KCkgeworICAvLyBEZWNpbWFsIGludGVnZXI6IFsxLTldWzAtOV0qCisgIGlmIChDdXJQdHJbLTFdICE9ICcwJykgeworICAgIHdoaWxlIChpc2RpZ2l0KCpDdXJQdHIpKQorICAgICAgKytDdXJQdHI7CisgICAgCisgICAgU3RyaW5nUmVmIFJlc3VsdChUb2tTdGFydCwgQ3VyUHRyIC0gVG9rU3RhcnQpOworICAgIAorICAgIGxvbmcgbG9uZyBWYWx1ZTsKKyAgICBpZiAoUmVzdWx0LmdldEFzSW50ZWdlcigxMCwgVmFsdWUpKSB7CisgICAgICAvLyBXZSBoYXZlIHRvIGhhbmRsZSBtaW5pbnRfYXNfYV9wb3NpdGl2ZV92YWx1ZSBzcGVjaWFsbHksIGJlY2F1c2UKKyAgICAgIC8vIC0gbWluaW50X2FzX2FfcG9zaXRpdmVfdmFsdWUgPSBtaW5pbnQgYW5kIGl0IGlzIHZhbGlkLgorICAgICAgaWYgKFJlc3VsdCA9PSAiOTIyMzM3MjAzNjg1NDc3NTgwOCIpCisgICAgICAgIFZhbHVlID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDhVTEw7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBSZXR1cm5FcnJvcihUb2tTdGFydCwgIkludmFsaWQgZGVjaW1hbCBudW1iZXIiKTsKKyAgICB9CisgICAgcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpJbnRlZ2VyLCBSZXN1bHQsIFZhbHVlKTsKKyAgfQorICAKKyAgaWYgKCpDdXJQdHIgPT0gJ2InKSB7CisgICAgKytDdXJQdHI7CisgICAgLy8gU2VlIGlmIHdlIGFjdHVhbGx5IGhhdmUgIjBiIiBhcyBwYXJ0IG9mIHNvbWV0aGluZyBsaWtlICJqbXAgMGJcbiIKKyAgICBpZiAoIWlzZGlnaXQoQ3VyUHRyWzBdKSkgeworICAgICAgLS1DdXJQdHI7CisgICAgICBTdHJpbmdSZWYgUmVzdWx0KFRva1N0YXJ0LCBDdXJQdHIgLSBUb2tTdGFydCk7CisgICAgICByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OkludGVnZXIsIFJlc3VsdCwgMCk7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKk51bVN0YXJ0ID0gQ3VyUHRyOworICAgIHdoaWxlIChDdXJQdHJbMF0gPT0gJzAnIHx8IEN1clB0clswXSA9PSAnMScpCisgICAgICArK0N1clB0cjsKKyAgICAKKyAgICAvLyBSZXF1aXJlcyBhdCBsZWFzdCBvbmUgYmluYXJ5IGRpZ2l0LgorICAgIGlmIChDdXJQdHIgPT0gTnVtU3RhcnQpCisgICAgICByZXR1cm4gUmV0dXJuRXJyb3IoVG9rU3RhcnQsICJJbnZhbGlkIGJpbmFyeSBudW1iZXIiKTsKKyAgICAKKyAgICBTdHJpbmdSZWYgUmVzdWx0KFRva1N0YXJ0LCBDdXJQdHIgLSBUb2tTdGFydCk7CisgICAgCisgICAgbG9uZyBsb25nIFZhbHVlOworICAgIGlmIChSZXN1bHQuZ2V0QXNJbnRlZ2VyKDIsIFZhbHVlKSkKKyAgICAgIHJldHVybiBSZXR1cm5FcnJvcihUb2tTdGFydCwgIkludmFsaWQgYmluYXJ5IG51bWJlciIpOworICAgIAorICAgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6SW50ZWdlciwgUmVzdWx0LCBWYWx1ZSk7CisgIH0KKyAKKyAgaWYgKCpDdXJQdHIgPT0gJ3gnKSB7CisgICAgKytDdXJQdHI7CisgICAgY29uc3QgY2hhciAqTnVtU3RhcnQgPSBDdXJQdHI7CisgICAgd2hpbGUgKGlzeGRpZ2l0KEN1clB0clswXSkpCisgICAgICArK0N1clB0cjsKKyAgICAKKyAgICAvLyBSZXF1aXJlcyBhdCBsZWFzdCBvbmUgaGV4IGRpZ2l0LgorICAgIGlmIChDdXJQdHIgPT0gTnVtU3RhcnQpCisgICAgICByZXR1cm4gUmV0dXJuRXJyb3IoQ3VyUHRyLTIsICJJbnZhbGlkIGhleGFkZWNpbWFsIG51bWJlciIpOworCisgICAgdW5zaWduZWQgbG9uZyBsb25nIFJlc3VsdDsKKyAgICBpZiAoU3RyaW5nUmVmKFRva1N0YXJ0LCBDdXJQdHIgLSBUb2tTdGFydCkuZ2V0QXNJbnRlZ2VyKDAsIFJlc3VsdCkpCisgICAgICByZXR1cm4gUmV0dXJuRXJyb3IoVG9rU3RhcnQsICJJbnZhbGlkIGhleGFkZWNpbWFsIG51bWJlciIpOworICAgICAgCisgICAgcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpJbnRlZ2VyLCBTdHJpbmdSZWYoVG9rU3RhcnQsIEN1clB0ciAtIFRva1N0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpUmVzdWx0KTsKKyAgfQorICAKKyAgLy8gTXVzdCBiZSBhbiBvY3RhbCBudW1iZXIsIGl0IHN0YXJ0cyB3aXRoIDAuCisgIHdoaWxlICgqQ3VyUHRyID49ICcwJyAmJiAqQ3VyUHRyIDw9ICc3JykKKyAgICArK0N1clB0cjsKKyAgCisgIFN0cmluZ1JlZiBSZXN1bHQoVG9rU3RhcnQsIEN1clB0ciAtIFRva1N0YXJ0KTsKKyAgbG9uZyBsb25nIFZhbHVlOworICBpZiAoUmVzdWx0LmdldEFzSW50ZWdlcig4LCBWYWx1ZSkpCisgICAgcmV0dXJuIFJldHVybkVycm9yKFRva1N0YXJ0LCAiSW52YWxpZCBvY3RhbCBudW1iZXIiKTsKKyAgCisgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6SW50ZWdlciwgUmVzdWx0LCBWYWx1ZSk7Cit9CisKKy8vLyBMZXhRdW90ZTogU3RyaW5nOiAiLi4uIgorQXNtVG9rZW4gQXNtTGV4ZXI6OkxleFF1b3RlKCkgeworICBpbnQgQ3VyQ2hhciA9IGdldE5leHRDaGFyKCk7CisgIC8vIFRPRE86IGRvZXMgZ2FzIGFsbG93IG11bHRpbGluZSBzdHJpbmcgY29uc3RhbnRzPworICB3aGlsZSAoQ3VyQ2hhciAhPSAnIicpIHsKKyAgICBpZiAoQ3VyQ2hhciA9PSAnXFwnKSB7CisgICAgICAvLyBBbGxvdyBcIiwgZXRjLgorICAgICAgQ3VyQ2hhciA9IGdldE5leHRDaGFyKCk7CisgICAgfQorICAgIAorICAgIGlmIChDdXJDaGFyID09IEVPRikKKyAgICAgIHJldHVybiBSZXR1cm5FcnJvcihUb2tTdGFydCwgInVudGVybWluYXRlZCBzdHJpbmcgY29uc3RhbnQiKTsKKworICAgIEN1ckNoYXIgPSBnZXROZXh0Q2hhcigpOworICB9CisgIAorICByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OlN0cmluZywgU3RyaW5nUmVmKFRva1N0YXJ0LCBDdXJQdHIgLSBUb2tTdGFydCkpOworfQorCitTdHJpbmdSZWYgQXNtTGV4ZXI6OkxleFVudGlsRW5kT2ZTdGF0ZW1lbnQoKSB7CisgIFRva1N0YXJ0ID0gQ3VyUHRyOworCisgIHdoaWxlICghaXNBdFN0YXJ0T2ZDb21tZW50KCpDdXJQdHIpICYmIC8vIFN0YXJ0IG9mIGxpbmUgY29tbWVudC4KKyAgICAgICAgICAqQ3VyUHRyICE9ICc7JyAmJiAgLy8gRW5kIG9mIHN0YXRlbWVudCBtYXJrZXIuCisgICAgICAgICAqQ3VyUHRyICE9ICdcbicgJiYKKyAgICAgICAgICpDdXJQdHIgIT0gJ1xyJyAmJgorICAgICAgICAgKCpDdXJQdHIgIT0gMCB8fCBDdXJQdHIgIT0gQ3VyQnVmLT5nZXRCdWZmZXJFbmQoKSkpIHsKKyAgICArK0N1clB0cjsKKyAgfQorICByZXR1cm4gU3RyaW5nUmVmKFRva1N0YXJ0LCBDdXJQdHItVG9rU3RhcnQpOworfQorCitib29sIEFzbUxleGVyOjppc0F0U3RhcnRPZkNvbW1lbnQoY2hhciBDaGFyKSB7CisgIC8vIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsgZm9yIG11bHRpLWNoYXJhY3RlciBjb21tZW50IGluZGljYXRvcnMgbGlrZSAiLy8iLgorICByZXR1cm4gQ2hhciA9PSAqTUFJLmdldENvbW1lbnRTdHJpbmcoKTsKK30KKworQXNtVG9rZW4gQXNtTGV4ZXI6OkxleFRva2VuKCkgeworICBUb2tTdGFydCA9IEN1clB0cjsKKyAgLy8gVGhpcyBhbHdheXMgY29uc3VtZXMgYXQgbGVhc3Qgb25lIGNoYXJhY3Rlci4KKyAgaW50IEN1ckNoYXIgPSBnZXROZXh0Q2hhcigpOworICAKKyAgaWYgKGlzQXRTdGFydE9mQ29tbWVudChDdXJDaGFyKSkKKyAgICByZXR1cm4gTGV4TGluZUNvbW1lbnQoKTsKKworICBzd2l0Y2ggKEN1ckNoYXIpIHsKKyAgZGVmYXVsdDoKKyAgICAvLyBIYW5kbGUgaWRlbnRpZmllcjogW2EtekEtWl8uXVthLXpBLVowLTlfJC5AXSoKKyAgICBpZiAoaXNhbHBoYShDdXJDaGFyKSB8fCBDdXJDaGFyID09ICdfJyB8fCBDdXJDaGFyID09ICcuJykKKyAgICAgIHJldHVybiBMZXhJZGVudGlmaWVyKCk7CisgICAgCisgICAgLy8gVW5rbm93biBjaGFyYWN0ZXIsIGVtaXQgYW4gZXJyb3IuCisgICAgcmV0dXJuIFJldHVybkVycm9yKFRva1N0YXJ0LCAiaW52YWxpZCBjaGFyYWN0ZXIgaW4gaW5wdXQiKTsKKyAgY2FzZSBFT0Y6IHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6RW9mLCBTdHJpbmdSZWYoVG9rU3RhcnQsIDApKTsKKyAgY2FzZSAwOgorICBjYXNlICcgJzoKKyAgY2FzZSAnXHQnOgorICAgIC8vIElnbm9yZSB3aGl0ZXNwYWNlLgorICAgIHJldHVybiBMZXhUb2tlbigpOworICBjYXNlICdcbic6IC8vIEZBTEwgVEhST1VHSC4KKyAgY2FzZSAnXHInOiAvLyBGQUxMIFRIUk9VR0guCisgIGNhc2UgJzsnOiByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50LCBTdHJpbmdSZWYoVG9rU3RhcnQsIDEpKTsKKyAgY2FzZSAnOic6IHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6Q29sb24sIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICBjYXNlICcrJzogcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpQbHVzLCBTdHJpbmdSZWYoVG9rU3RhcnQsIDEpKTsKKyAgY2FzZSAnLSc6IHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6TWludXMsIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICBjYXNlICd+JzogcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpUaWxkZSwgU3RyaW5nUmVmKFRva1N0YXJ0LCAxKSk7CisgIGNhc2UgJygnOiByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OkxQYXJlbiwgU3RyaW5nUmVmKFRva1N0YXJ0LCAxKSk7CisgIGNhc2UgJyknOiByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OlJQYXJlbiwgU3RyaW5nUmVmKFRva1N0YXJ0LCAxKSk7CisgIGNhc2UgJ1snOiByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OkxCcmFjLCBTdHJpbmdSZWYoVG9rU3RhcnQsIDEpKTsKKyAgY2FzZSAnXSc6IHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6UkJyYWMsIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICBjYXNlICd7JzogcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpMQ3VybHksIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICBjYXNlICd9JzogcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpSQ3VybHksIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICBjYXNlICcqJzogcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpTdGFyLCBTdHJpbmdSZWYoVG9rU3RhcnQsIDEpKTsKKyAgY2FzZSAnLCc6IHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6Q29tbWEsIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICBjYXNlICckJzogcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpEb2xsYXIsIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICBjYXNlICdAJzogcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpBdCwgU3RyaW5nUmVmKFRva1N0YXJ0LCAxKSk7CisgIGNhc2UgJz0nOiAKKyAgICBpZiAoKkN1clB0ciA9PSAnPScpCisgICAgICByZXR1cm4gKytDdXJQdHIsIEFzbVRva2VuKEFzbVRva2VuOjpFcXVhbEVxdWFsLCBTdHJpbmdSZWYoVG9rU3RhcnQsIDIpKTsKKyAgICByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OkVxdWFsLCBTdHJpbmdSZWYoVG9rU3RhcnQsIDEpKTsKKyAgY2FzZSAnfCc6IAorICAgIGlmICgqQ3VyUHRyID09ICd8JykKKyAgICAgIHJldHVybiArK0N1clB0ciwgQXNtVG9rZW4oQXNtVG9rZW46OlBpcGVQaXBlLCBTdHJpbmdSZWYoVG9rU3RhcnQsIDIpKTsKKyAgICByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OlBpcGUsIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICBjYXNlICdeJzogcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpDYXJldCwgU3RyaW5nUmVmKFRva1N0YXJ0LCAxKSk7CisgIGNhc2UgJyYnOiAKKyAgICBpZiAoKkN1clB0ciA9PSAnJicpCisgICAgICByZXR1cm4gKytDdXJQdHIsIEFzbVRva2VuKEFzbVRva2VuOjpBbXBBbXAsIFN0cmluZ1JlZihUb2tTdGFydCwgMikpOworICAgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6QW1wLCBTdHJpbmdSZWYoVG9rU3RhcnQsIDEpKTsKKyAgY2FzZSAnISc6IAorICAgIGlmICgqQ3VyUHRyID09ICc9JykKKyAgICAgIHJldHVybiArK0N1clB0ciwgQXNtVG9rZW4oQXNtVG9rZW46OkV4Y2xhaW1FcXVhbCwgU3RyaW5nUmVmKFRva1N0YXJ0LCAyKSk7CisgICAgcmV0dXJuIEFzbVRva2VuKEFzbVRva2VuOjpFeGNsYWltLCBTdHJpbmdSZWYoVG9rU3RhcnQsIDEpKTsKKyAgY2FzZSAnJSc6IHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6UGVyY2VudCwgU3RyaW5nUmVmKFRva1N0YXJ0LCAxKSk7CisgIGNhc2UgJy8nOiByZXR1cm4gTGV4U2xhc2goKTsKKyAgY2FzZSAnIyc6IHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6SGFzaCwgU3RyaW5nUmVmKFRva1N0YXJ0LCAxKSk7CisgIGNhc2UgJyInOiByZXR1cm4gTGV4UXVvdGUoKTsKKyAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgcmV0dXJuIExleERpZ2l0KCk7CisgIGNhc2UgJzwnOgorICAgIHN3aXRjaCAoKkN1clB0cikgeworICAgIGNhc2UgJzwnOiByZXR1cm4gKytDdXJQdHIsIEFzbVRva2VuKEFzbVRva2VuOjpMZXNzTGVzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmKFRva1N0YXJ0LCAyKSk7CisgICAgY2FzZSAnPSc6IHJldHVybiArK0N1clB0ciwgQXNtVG9rZW4oQXNtVG9rZW46Okxlc3NFcXVhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmKFRva1N0YXJ0LCAyKSk7CisgICAgY2FzZSAnPic6IHJldHVybiArK0N1clB0ciwgQXNtVG9rZW4oQXNtVG9rZW46Okxlc3NHcmVhdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYoVG9rU3RhcnQsIDIpKTsKKyAgICBkZWZhdWx0OiByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46Okxlc3MsIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICAgIH0KKyAgY2FzZSAnPic6CisgICAgc3dpdGNoICgqQ3VyUHRyKSB7CisgICAgY2FzZSAnPic6IHJldHVybiArK0N1clB0ciwgQXNtVG9rZW4oQXNtVG9rZW46OkdyZWF0ZXJHcmVhdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYoVG9rU3RhcnQsIDIpKTsKKyAgICBjYXNlICc9JzogcmV0dXJuICsrQ3VyUHRyLCBBc21Ub2tlbihBc21Ub2tlbjo6R3JlYXRlckVxdWFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYoVG9rU3RhcnQsIDIpKTsKKyAgICBkZWZhdWx0OiByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OkdyZWF0ZXIsIFN0cmluZ1JlZihUb2tTdGFydCwgMSkpOworICAgIH0KKyAgICAgIAorICAvLyBUT0RPOiBRdW90ZWQgaWRlbnRpZmllcnMgKG9iamMgbWV0aG9kcyBldGMpCisgIC8vIGxvY2FsIGxhYmVsczogWzAtOV1bOl0KKyAgLy8gRm9yd2FyZC9iYWNrd2FyZCBsYWJlbHM6IFswLTldW2ZiXQorICAvLyBJbnRlZ2VycywgZnAgY29uc3RhbnRzLCBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNQYXJzZXIvQXNtUGFyc2VyLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9Bc21QYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTM3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNQYXJzZXIvQXNtUGFyc2VyLmNwcApAQCAtMCwwICsxLDE5MzAgQEAKKy8vPT09LSBBc21QYXJzZXIuY3BwIC0gUGFyc2VyIGZvciBBc3NlbWJseSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBwYXJzZXIgZm9yIGFzc2VtYmx5IGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1N3aXRjaC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL0FzbUNvbmQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL0FzbUxleGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNQYXJzZWRBc21PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTdHJlYW1lci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEFzbVBhcnNlci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworCisvLy8gXGJyaWVmIEhlbHBlciBjbGFzcyBmb3IgdHJhY2tpbmcgbWFjcm8gZGVmaW5pdGlvbnMuCitzdHJ1Y3QgTWFjcm8geworICBTdHJpbmdSZWYgTmFtZTsKKyAgU3RyaW5nUmVmIEJvZHk7CisKK3B1YmxpYzoKKyAgTWFjcm8oU3RyaW5nUmVmIE4sIFN0cmluZ1JlZiBCKSA6IE5hbWUoTiksIEJvZHkoQikge30KK307CisKKy8vLyBcYnJpZWYgSGVscGVyIGNsYXNzIGZvciBzdG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IGFuIGFjdGl2ZSBtYWNybworLy8vIGluc3RhbnRpYXRpb24uCitzdHJ1Y3QgTWFjcm9JbnN0YW50aWF0aW9uIHsKKyAgLy8vIFRoZSBtYWNybyBiZWluZyBpbnN0YW50aWF0ZWQuCisgIGNvbnN0IE1hY3JvICpUaGVNYWNybzsKKworICAvLy8gVGhlIG1hY3JvIGluc3RhbnRpYXRpb24gd2l0aCBzdWJzdGl0dXRpb25zLgorICBNZW1vcnlCdWZmZXIgKkluc3RhbnRpYXRpb247CisKKyAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5zdGFudGlhdGlvbi4KKyAgU01Mb2MgSW5zdGFudGlhdGlvbkxvYzsKKworICAvLy8gVGhlIGxvY2F0aW9uIHdoZXJlIHBhcnNpbmcgc2hvdWxkIHJlc3VtZSB1cG9uIGluc3RhbnRpYXRpb24gY29tcGxldGlvbi4KKyAgU01Mb2MgRXhpdExvYzsKKworcHVibGljOgorICBNYWNyb0luc3RhbnRpYXRpb24oY29uc3QgTWFjcm8gKk0sIFNNTG9jIElMLCBTTUxvYyBFTCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEFzbVRva2VuPiA+ICZBKTsKK307CisKKy8vLyBcYnJpZWYgVGhlIGNvbmNyZXRlIGFzc2VtYmx5IHBhcnNlciBpbnN0YW5jZS4KK2NsYXNzIEFzbVBhcnNlciA6IHB1YmxpYyBNQ0FzbVBhcnNlciB7CisgIGZyaWVuZCBjbGFzcyBHZW5lcmljQXNtUGFyc2VyOworCisgIEFzbVBhcnNlcihjb25zdCBBc21QYXJzZXIgJik7ICAgLy8gRE8gTk9UIElNUExFTUVOVAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBBc21QYXJzZXIgJik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwcml2YXRlOgorICBBc21MZXhlciBMZXhlcjsKKyAgTUNDb250ZXh0ICZDdHg7CisgIE1DU3RyZWFtZXIgJk91dDsKKyAgU291cmNlTWdyICZTcmNNZ3I7CisgIE1DQXNtUGFyc2VyRXh0ZW5zaW9uICpHZW5lcmljUGFyc2VyOworICBNQ0FzbVBhcnNlckV4dGVuc2lvbiAqUGxhdGZvcm1QYXJzZXI7CisKKyAgLy8vIFRoaXMgaXMgdGhlIGN1cnJlbnQgYnVmZmVyIGluZGV4IHdlJ3JlIGxleGluZyBmcm9tIGFzIG1hbmFnZWQgYnkgdGhlCisgIC8vLyBTb3VyY2VNZ3Igb2JqZWN0LgorICBpbnQgQ3VyQnVmZmVyOworCisgIEFzbUNvbmQgVGhlQ29uZFN0YXRlOworICBzdGQ6OnZlY3RvcjxBc21Db25kPiBUaGVDb25kU3RhY2s7CisKKyAgLy8vIERpcmVjdGl2ZU1hcCAtIFRoaXMgaXMgYSB0YWJsZSBoYW5kbGVycyBmb3IgZGlyZWN0aXZlcy4gIEVhY2ggaGFuZGxlciBpcworICAvLy8gaW52b2tlZCBhZnRlciB0aGUgZGlyZWN0aXZlIGlkZW50aWZpZXIgaXMgcmVhZCBhbmQgaXMgcmVzcG9uc2libGUgZm9yCisgIC8vLyBwYXJzaW5nIGFuZCB2YWxpZGF0aW5nIHRoZSByZXN0IG9mIHRoZSBkaXJlY3RpdmUuICBUaGUgaGFuZGxlciBpcyBwYXNzZWQKKyAgLy8vIGluIHRoZSBkaXJlY3RpdmUgbmFtZSBhbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2V5d29yZC4KKyAgU3RyaW5nTWFwPHN0ZDo6cGFpcjxNQ0FzbVBhcnNlckV4dGVuc2lvbiosIERpcmVjdGl2ZUhhbmRsZXI+ID4gRGlyZWN0aXZlTWFwOworCisgIC8vLyBNYWNyb01hcCAtIE1hcCBvZiBjdXJyZW50bHkgZGVmaW5lZCBtYWNyb3MuCisgIFN0cmluZ01hcDxNYWNybyo+IE1hY3JvTWFwOworCisgIC8vLyBBY3RpdmVNYWNyb3MgLSBTdGFjayBvZiBhY3RpdmUgbWFjcm8gaW5zdGFudGlhdGlvbnMuCisgIHN0ZDo6dmVjdG9yPE1hY3JvSW5zdGFudGlhdGlvbio+IEFjdGl2ZU1hY3JvczsKKworICAvLy8gQm9vbGVhbiB0cmFja2luZyB3aGV0aGVyIG1hY3JvIHN1YnN0aXR1dGlvbiBpcyBlbmFibGVkLgorICB1bnNpZ25lZCBNYWNyb3NFbmFibGVkIDogMTsKKworcHVibGljOgorICBBc21QYXJzZXIoY29uc3QgVGFyZ2V0ICZULCBTb3VyY2VNZ3IgJlNNLCBNQ0NvbnRleHQgJkN0eCwgTUNTdHJlYW1lciAmT3V0LAorICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICZNQUkpOworICB+QXNtUGFyc2VyKCk7CisKKyAgdmlydHVhbCBib29sIFJ1bihib29sIE5vSW5pdGlhbFRleHRTZWN0aW9uLCBib29sIE5vRmluYWxpemUgPSBmYWxzZSk7CisKKyAgdm9pZCBBZGREaXJlY3RpdmVIYW5kbGVyKE1DQXNtUGFyc2VyRXh0ZW5zaW9uICpPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aXZlSGFuZGxlciBIYW5kbGVyKSB7CisgICAgRGlyZWN0aXZlTWFwW0RpcmVjdGl2ZV0gPSBzdGQ6Om1ha2VfcGFpcihPYmplY3QsIEhhbmRsZXIpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIEBuYW1lIE1DQXNtUGFyc2VyIEludGVyZmFjZQorICAvLy8geworCisgIHZpcnR1YWwgU291cmNlTWdyICZnZXRTb3VyY2VNYW5hZ2VyKCkgeyByZXR1cm4gU3JjTWdyOyB9CisgIHZpcnR1YWwgTUNBc21MZXhlciAmZ2V0TGV4ZXIoKSB7IHJldHVybiBMZXhlcjsgfQorICB2aXJ0dWFsIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIHsgcmV0dXJuIEN0eDsgfQorICB2aXJ0dWFsIE1DU3RyZWFtZXIgJmdldFN0cmVhbWVyKCkgeyByZXR1cm4gT3V0OyB9CisKKyAgdmlydHVhbCB2b2lkIFdhcm5pbmcoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1lZyk7CisgIHZpcnR1YWwgYm9vbCBFcnJvcihTTUxvYyBMLCBjb25zdCBUd2luZSAmTXNnKTsKKworICBjb25zdCBBc21Ub2tlbiAmTGV4KCk7CisKKyAgYm9vbCBQYXJzZUV4cHJlc3Npb24oY29uc3QgTUNFeHByIComUmVzKTsKKyAgdmlydHVhbCBib29sIFBhcnNlRXhwcmVzc2lvbihjb25zdCBNQ0V4cHIgKiZSZXMsIFNNTG9jICZFbmRMb2MpOworICB2aXJ0dWFsIGJvb2wgUGFyc2VQYXJlbkV4cHJlc3Npb24oY29uc3QgTUNFeHByIComUmVzLCBTTUxvYyAmRW5kTG9jKTsKKyAgdmlydHVhbCBib29sIFBhcnNlQWJzb2x1dGVFeHByZXNzaW9uKGludDY0X3QgJlJlcyk7CisKKyAgLy8vIH0KKworcHJpdmF0ZToKKyAgYm9vbCBQYXJzZVN0YXRlbWVudCgpOworCisgIGJvb2wgSGFuZGxlTWFjcm9FbnRyeShTdHJpbmdSZWYgTmFtZSwgU01Mb2MgTmFtZUxvYywgY29uc3QgTWFjcm8gKk0pOworICB2b2lkIEhhbmRsZU1hY3JvRXhpdCgpOworCisgIHZvaWQgUHJpbnRNYWNyb0luc3RhbnRpYXRpb25zKCk7CisgIHZvaWQgUHJpbnRNZXNzYWdlKFNNTG9jIExvYywgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZywgY29uc3QgY2hhciAqVHlwZSkgY29uc3Q7CisgICAgCisgIC8vLyBFbnRlckluY2x1ZGVGaWxlIC0gRW50ZXIgdGhlIHNwZWNpZmllZCBmaWxlLiBUaGlzIHJldHVybnMgdHJ1ZSBvbiBmYWlsdXJlLgorICBib29sIEVudGVySW5jbHVkZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVuYW1lKTsKKworICAvLy8gXGJyaWVmIFJlc2V0IHRoZSBjdXJyZW50IGxleGVyIHBvc2l0aW9uIHRvIHRoYXQgZ2l2ZW4gYnkgXGFyZyBMb2MuIFRoZQorICAvLy8gY3VycmVudCB0b2tlbiBpcyBub3Qgc2V0OyBjbGllbnRzIHNob3VsZCBlbnN1cmUgTGV4KCkgaXMgY2FsbGVkCisgIC8vLyBzdWJzZXF1ZW50bHkuCisgIHZvaWQgSnVtcFRvTG9jKFNNTG9jIExvYyk7CisKKyAgdm9pZCBFYXRUb0VuZE9mU3RhdGVtZW50KCk7CisKKyAgLy8vIFxicmllZiBQYXJzZSB1cCB0byB0aGUgZW5kIG9mIHN0YXRlbWVudCBhbmQgYSByZXR1cm4gdGhlIGNvbnRlbnRzIGZyb20gdGhlCisgIC8vLyBjdXJyZW50IHRva2VuIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudDsgdGhlIGN1cnJlbnQgdG9rZW4gb24gZXhpdAorICAvLy8gd2lsbCBiZSBlaXRoZXIgdGhlIEVuZE9mU3RhdGVtZW50IG9yIEVPRi4KKyAgU3RyaW5nUmVmIFBhcnNlU3RyaW5nVG9FbmRPZlN0YXRlbWVudCgpOworCisgIGJvb2wgUGFyc2VBc3NpZ25tZW50KFN0cmluZ1JlZiBOYW1lKTsKKworICBib29sIFBhcnNlUHJpbWFyeUV4cHIoY29uc3QgTUNFeHByIComUmVzLCBTTUxvYyAmRW5kTG9jKTsKKyAgYm9vbCBQYXJzZUJpbk9wUkhTKHVuc2lnbmVkIFByZWNlZGVuY2UsIGNvbnN0IE1DRXhwciAqJlJlcywgU01Mb2MgJkVuZExvYyk7CisgIGJvb2wgUGFyc2VQYXJlbkV4cHIoY29uc3QgTUNFeHByIComUmVzLCBTTUxvYyAmRW5kTG9jKTsKKworICAvLy8gUGFyc2VJZGVudGlmaWVyIC0gUGFyc2UgYW4gaWRlbnRpZmllciBvciBzdHJpbmcgKGFzIGEgcXVvdGVkIGlkZW50aWZpZXIpCisgIC8vLyBhbmQgc2V0IFxhcmcgUmVzIHRvIHRoZSBpZGVudGlmaWVyIGNvbnRlbnRzLgorICBib29sIFBhcnNlSWRlbnRpZmllcihTdHJpbmdSZWYgJlJlcyk7CisgIAorICAvLyBEaXJlY3RpdmUgUGFyc2luZy4KKyAgYm9vbCBQYXJzZURpcmVjdGl2ZUFzY2lpKGJvb2wgWmVyb1Rlcm1pbmF0ZWQpOyAvLyAiLmFzY2lpIiwgIi5hc2NpaXoiCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVWYWx1ZSh1bnNpZ25lZCBTaXplKTsgLy8gIi5ieXRlIiwgIi5sb25nIiwgLi4uCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVGaWxsKCk7IC8vICIuZmlsbCIKKyAgYm9vbCBQYXJzZURpcmVjdGl2ZVNwYWNlKCk7IC8vICIuc3BhY2UiCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVTZXQoKTsgLy8gIi5zZXQiCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVPcmcoKTsgLy8gIi5vcmciCisgIC8vICIuYWxpZ257LDMyfSIsICIucDJhbGlnbnssdyxsfSIKKyAgYm9vbCBQYXJzZURpcmVjdGl2ZUFsaWduKGJvb2wgSXNQb3cyLCB1bnNpZ25lZCBWYWx1ZVNpemUpOworCisgIC8vLyBQYXJzZURpcmVjdGl2ZVN5bWJvbEF0dHJpYnV0ZSAtIFBhcnNlIGEgZGlyZWN0aXZlIGxpa2UgIi5nbG9ibCIgd2hpY2gKKyAgLy8vIGFjY2VwdHMgYSBzaW5nbGUgc3ltYm9sICh3aGljaCBzaG91bGQgYmUgYSBsYWJlbCBvciBhbiBleHRlcm5hbCkuCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVTeW1ib2xBdHRyaWJ1dGUoTUNTeW1ib2xBdHRyIEF0dHIpOworICBib29sIFBhcnNlRGlyZWN0aXZlRUxGVHlwZSgpOyAvLyBFTEYgc3BlY2lmaWMgIi50eXBlIgorCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVDb21tKGJvb2wgSXNMb2NhbCk7IC8vICIuY29tbSIgYW5kICIubGNvbW0iCisKKyAgYm9vbCBQYXJzZURpcmVjdGl2ZUFib3J0KCk7IC8vICIuYWJvcnQiCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVJbmNsdWRlKCk7IC8vICIuaW5jbHVkZSIKKworICBib29sIFBhcnNlRGlyZWN0aXZlSWYoU01Mb2MgRGlyZWN0aXZlTG9jKTsgLy8gIi5pZiIKKyAgYm9vbCBQYXJzZURpcmVjdGl2ZUVsc2VJZihTTUxvYyBEaXJlY3RpdmVMb2MpOyAvLyAiLmVsc2VpZiIKKyAgYm9vbCBQYXJzZURpcmVjdGl2ZUVsc2UoU01Mb2MgRGlyZWN0aXZlTG9jKTsgLy8gIi5lbHNlIgorICBib29sIFBhcnNlRGlyZWN0aXZlRW5kSWYoU01Mb2MgRGlyZWN0aXZlTG9jKTsgLy8gLmVuZGlmCisKKyAgLy8vIFBhcnNlRXNjYXBlZFN0cmluZyAtIFBhcnNlIHRoZSBjdXJyZW50IHRva2VuIGFzIGEgc3RyaW5nIHdoaWNoIG1heSBpbmNsdWRlCisgIC8vLyBlc2NhcGVkIGNoYXJhY3RlcnMgYW5kIHJldHVybiB0aGUgc3RyaW5nIGNvbnRlbnRzLgorICBib29sIFBhcnNlRXNjYXBlZFN0cmluZyhzdGQ6OnN0cmluZyAmRGF0YSk7Cit9OworCisvLy8gXGJyaWVmIEdlbmVyaWMgaW1wbGVtZW50YXRpb25zIG9mIGRpcmVjdGl2ZSBoYW5kbGluZywgZXRjLiB3aGljaCBpcyBzaGFyZWQKKy8vLyAob3IgdGhlIGRlZmF1bHQsIGF0IGxlYXN0KSBmb3IgYWxsIGFzc2VtYmxlciBwYXJzZXIuCitjbGFzcyBHZW5lcmljQXNtUGFyc2VyIDogcHVibGljIE1DQXNtUGFyc2VyRXh0ZW5zaW9uIHsKKyAgdGVtcGxhdGU8Ym9vbCAoR2VuZXJpY0FzbVBhcnNlcjo6KkhhbmRsZXIpKFN0cmluZ1JlZiwgU01Mb2MpPgorICB2b2lkIEFkZERpcmVjdGl2ZUhhbmRsZXIoU3RyaW5nUmVmIERpcmVjdGl2ZSkgeworICAgIGdldFBhcnNlcigpLkFkZERpcmVjdGl2ZUhhbmRsZXIodGhpcywgRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlRGlyZWN0aXZlPEdlbmVyaWNBc21QYXJzZXIsIEhhbmRsZXI+KTsKKyAgfQorCitwdWJsaWM6CisgIEdlbmVyaWNBc21QYXJzZXIoKSB7fQorCisgIEFzbVBhcnNlciAmZ2V0UGFyc2VyKCkgeworICAgIHJldHVybiAoQXNtUGFyc2VyJikgdGhpcy0+TUNBc21QYXJzZXJFeHRlbnNpb246OmdldFBhcnNlcigpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoTUNBc21QYXJzZXIgJlBhcnNlcikgeworICAgIC8vIENhbGwgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24uCisgICAgdGhpcy0+TUNBc21QYXJzZXJFeHRlbnNpb246OkluaXRpYWxpemUoUGFyc2VyKTsKKworICAgIC8vIERlYnVnZ2luZyBkaXJlY3RpdmVzLgorICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkdlbmVyaWNBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlRmlsZT4oIi5maWxlIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmR2VuZXJpY0FzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVMaW5lPigiLmxpbmUiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZHZW5lcmljQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUxvYz4oIi5sb2MiKTsKKworICAgIC8vIE1hY3JvIGRpcmVjdGl2ZXMuCisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmR2VuZXJpY0FzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVNYWNyb3NPbk9mZj4oCisgICAgICAiLm1hY3Jvc19vbiIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkdlbmVyaWNBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlTWFjcm9zT25PZmY+KAorICAgICAgIi5tYWNyb3Nfb2ZmIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmR2VuZXJpY0FzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVNYWNybz4oIi5tYWNybyIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkdlbmVyaWNBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlRW5kTWFjcm8+KCIuZW5kbSIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkdlbmVyaWNBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlRW5kTWFjcm8+KCIuZW5kbWFjcm8iKTsKKyAgfQorCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVGaWxlKFN0cmluZ1JlZiwgU01Mb2MgRGlyZWN0aXZlTG9jKTsKKyAgYm9vbCBQYXJzZURpcmVjdGl2ZUxpbmUoU3RyaW5nUmVmLCBTTUxvYyBEaXJlY3RpdmVMb2MpOworICBib29sIFBhcnNlRGlyZWN0aXZlTG9jKFN0cmluZ1JlZiwgU01Mb2MgRGlyZWN0aXZlTG9jKTsKKworICBib29sIFBhcnNlRGlyZWN0aXZlTWFjcm9zT25PZmYoU3RyaW5nUmVmLCBTTUxvYyBEaXJlY3RpdmVMb2MpOworICBib29sIFBhcnNlRGlyZWN0aXZlTWFjcm8oU3RyaW5nUmVmLCBTTUxvYyBEaXJlY3RpdmVMb2MpOworICBib29sIFBhcnNlRGlyZWN0aXZlRW5kTWFjcm8oU3RyaW5nUmVmLCBTTUxvYyBEaXJlY3RpdmVMb2MpOworfTsKKworfQorCituYW1lc3BhY2UgbGx2bSB7CisKK2V4dGVybiBNQ0FzbVBhcnNlckV4dGVuc2lvbiAqY3JlYXRlRGFyd2luQXNtUGFyc2VyKCk7CitleHRlcm4gTUNBc21QYXJzZXJFeHRlbnNpb24gKmNyZWF0ZUVMRkFzbVBhcnNlcigpOworCit9CisKK2VudW0geyBERUZBVUxUX0FERFJTUEFDRSA9IDAgfTsKKworQXNtUGFyc2VyOjpBc21QYXJzZXIoY29uc3QgVGFyZ2V0ICZULCBTb3VyY2VNZ3IgJl9TTSwgTUNDb250ZXh0ICZfQ3R4LAorICAgICAgICAgICAgICAgICAgICAgTUNTdHJlYW1lciAmX091dCwgY29uc3QgTUNBc21JbmZvICZfTUFJKQorICA6IExleGVyKF9NQUkpLCBDdHgoX0N0eCksIE91dChfT3V0KSwgU3JjTWdyKF9TTSksCisgICAgR2VuZXJpY1BhcnNlcihuZXcgR2VuZXJpY0FzbVBhcnNlciksIFBsYXRmb3JtUGFyc2VyKDApLAorICAgIEN1ckJ1ZmZlcigwKSwgTWFjcm9zRW5hYmxlZCh0cnVlKSB7CisgIExleGVyLnNldEJ1ZmZlcihTcmNNZ3IuZ2V0TWVtb3J5QnVmZmVyKEN1ckJ1ZmZlcikpOworCisgIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyaWMgcGFyc2VyLgorICBHZW5lcmljUGFyc2VyLT5Jbml0aWFsaXplKCp0aGlzKTsKKworICAvLyBJbml0aWFsaXplIHRoZSBwbGF0Zm9ybSAvIGZpbGUgZm9ybWF0IHBhcnNlci4KKyAgLy8KKyAgLy8gRklYTUU6IFRoaXMgaXMgYSBoYWNrLCB3ZSBuZWVkIHRvIChtYWpvcmx5KSBjbGVhbnVwIGhvdyB0aGVzZSBvYmplY3RzIGFyZQorICAvLyBjcmVhdGVkLgorICBpZiAoX01BSS5oYXNTdWJzZWN0aW9uc1ZpYVN5bWJvbHMoKSkgeworICAgIFBsYXRmb3JtUGFyc2VyID0gY3JlYXRlRGFyd2luQXNtUGFyc2VyKCk7CisgICAgUGxhdGZvcm1QYXJzZXItPkluaXRpYWxpemUoKnRoaXMpOworICB9IGVsc2UgeworICAgIFBsYXRmb3JtUGFyc2VyID0gY3JlYXRlRUxGQXNtUGFyc2VyKCk7CisgICAgUGxhdGZvcm1QYXJzZXItPkluaXRpYWxpemUoKnRoaXMpOworICB9Cit9CisKK0FzbVBhcnNlcjo6fkFzbVBhcnNlcigpIHsKKyAgYXNzZXJ0KEFjdGl2ZU1hY3Jvcy5lbXB0eSgpICYmICJVbmV4cGVjdGVkIGFjdGl2ZSBtYWNybyBpbnN0YW50aWF0aW9uISIpOworCisgIC8vIERlc3Ryb3kgYW55IG1hY3Jvcy4KKyAgZm9yIChTdHJpbmdNYXA8TWFjcm8qPjo6aXRlcmF0b3IgaXQgPSBNYWNyb01hcC5iZWdpbigpLAorICAgICAgICAgaWUgPSBNYWNyb01hcC5lbmQoKTsgaXQgIT0gaWU7ICsraXQpCisgICAgZGVsZXRlIGl0LT5nZXRWYWx1ZSgpOworCisgIGRlbGV0ZSBQbGF0Zm9ybVBhcnNlcjsKKyAgZGVsZXRlIEdlbmVyaWNQYXJzZXI7Cit9CisKK3ZvaWQgQXNtUGFyc2VyOjpQcmludE1hY3JvSW5zdGFudGlhdGlvbnMoKSB7CisgIC8vIFByaW50IHRoZSBhY3RpdmUgbWFjcm8gaW5zdGFudGlhdGlvbiBzdGFjay4KKyAgZm9yIChzdGQ6OnZlY3RvcjxNYWNyb0luc3RhbnRpYXRpb24qPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgICAgaXQgPSBBY3RpdmVNYWNyb3MucmJlZ2luKCksIGllID0gQWN0aXZlTWFjcm9zLnJlbmQoKTsgaXQgIT0gaWU7ICsraXQpCisgICAgUHJpbnRNZXNzYWdlKCgqaXQpLT5JbnN0YW50aWF0aW9uTG9jLCAid2hpbGUgaW4gbWFjcm8gaW5zdGFudGlhdGlvbiIsCisgICAgICAgICAgICAgICAgICJub3RlIik7Cit9CisKK3ZvaWQgQXNtUGFyc2VyOjpXYXJuaW5nKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2cpIHsKKyAgUHJpbnRNZXNzYWdlKEwsIE1zZy5zdHIoKSwgIndhcm5pbmciKTsKKyAgUHJpbnRNYWNyb0luc3RhbnRpYXRpb25zKCk7Cit9CisKK2Jvb2wgQXNtUGFyc2VyOjpFcnJvcihTTUxvYyBMLCBjb25zdCBUd2luZSAmTXNnKSB7CisgIFByaW50TWVzc2FnZShMLCBNc2cuc3RyKCksICJlcnJvciIpOworICBQcmludE1hY3JvSW5zdGFudGlhdGlvbnMoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQXNtUGFyc2VyOjpQcmludE1lc3NhZ2UoU01Mb2MgTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqVHlwZSkgY29uc3QgeworICBTcmNNZ3IuUHJpbnRNZXNzYWdlKExvYywgTXNnLCBUeXBlKTsKK30KKyAgICAgICAgICAgICAgICAgIAorYm9vbCBBc21QYXJzZXI6OkVudGVySW5jbHVkZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVuYW1lKSB7CisgIGludCBOZXdCdWYgPSBTcmNNZ3IuQWRkSW5jbHVkZUZpbGUoRmlsZW5hbWUsIExleGVyLmdldExvYygpKTsKKyAgaWYgKE5ld0J1ZiA9PSAtMSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIEN1ckJ1ZmZlciA9IE5ld0J1ZjsKKyAgCisgIExleGVyLnNldEJ1ZmZlcihTcmNNZ3IuZ2V0TWVtb3J5QnVmZmVyKEN1ckJ1ZmZlcikpOworICAKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFzbVBhcnNlcjo6SnVtcFRvTG9jKFNNTG9jIExvYykgeworICBDdXJCdWZmZXIgPSBTcmNNZ3IuRmluZEJ1ZmZlckNvbnRhaW5pbmdMb2MoTG9jKTsKKyAgTGV4ZXIuc2V0QnVmZmVyKFNyY01nci5nZXRNZW1vcnlCdWZmZXIoQ3VyQnVmZmVyKSwgTG9jLmdldFBvaW50ZXIoKSk7Cit9CisKK2NvbnN0IEFzbVRva2VuICZBc21QYXJzZXI6OkxleCgpIHsKKyAgY29uc3QgQXNtVG9rZW4gKnRvayA9ICZMZXhlci5MZXgoKTsKKyAgCisgIGlmICh0b2stPmlzKEFzbVRva2VuOjpFb2YpKSB7CisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZW5kIG9mIGFuIGluY2x1ZGVkIGZpbGUsIHBvcCB0aGUgcGFyZW50IGZpbGUgb2ZmIHRoZQorICAgIC8vIGluY2x1ZGUgc3RhY2suCisgICAgU01Mb2MgUGFyZW50SW5jbHVkZUxvYyA9IFNyY01nci5nZXRQYXJlbnRJbmNsdWRlTG9jKEN1ckJ1ZmZlcik7CisgICAgaWYgKFBhcmVudEluY2x1ZGVMb2MgIT0gU01Mb2MoKSkgeworICAgICAgSnVtcFRvTG9jKFBhcmVudEluY2x1ZGVMb2MpOworICAgICAgdG9rID0gJkxleGVyLkxleCgpOworICAgIH0KKyAgfQorICAgIAorICBpZiAodG9rLT5pcyhBc21Ub2tlbjo6RXJyb3IpKQorICAgIEVycm9yKExleGVyLmdldEVyckxvYygpLCBMZXhlci5nZXRFcnIoKSk7CisgIAorICByZXR1cm4gKnRvazsKK30KKworYm9vbCBBc21QYXJzZXI6OlJ1bihib29sIE5vSW5pdGlhbFRleHRTZWN0aW9uLCBib29sIE5vRmluYWxpemUpIHsKKyAgLy8gQ3JlYXRlIHRoZSBpbml0aWFsIHNlY3Rpb24sIGlmIHJlcXVlc3RlZC4KKyAgLy8KKyAgLy8gRklYTUU6IFRhcmdldCBob29rICYgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgaW5pdGlhbCBzZWN0aW9uLgorICBpZiAoIU5vSW5pdGlhbFRleHRTZWN0aW9uKQorICAgIE91dC5Td2l0Y2hTZWN0aW9uKEN0eC5nZXRNYWNoT1NlY3Rpb24oIl9fVEVYVCIsICJfX3RleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX1BVUkVfSU5TVFJVQ1RJT05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTZWN0aW9uS2luZDo6Z2V0VGV4dCgpKSk7CisKKyAgLy8gUHJpbWUgdGhlIGxleGVyLgorICBMZXgoKTsKKyAgCisgIGJvb2wgSGFkRXJyb3IgPSBmYWxzZTsKKyAgCisgIEFzbUNvbmQgU3RhcnRpbmdDb25kU3RhdGUgPSBUaGVDb25kU3RhdGU7CisKKyAgLy8gV2hpbGUgd2UgaGF2ZSBpbnB1dCwgcGFyc2UgZWFjaCBzdGF0ZW1lbnQuCisgIHdoaWxlIChMZXhlci5pc05vdChBc21Ub2tlbjo6RW9mKSkgeworICAgIGlmICghUGFyc2VTdGF0ZW1lbnQoKSkgY29udGludWU7CisgIAorICAgIC8vIFdlIGhhZCBhbiBlcnJvciwgcmVtZW1iZXIgaXQgYW5kIHJlY292ZXIgYnkgc2tpcHBpbmcgdG8gdGhlIG5leHQgbGluZS4KKyAgICBIYWRFcnJvciA9IHRydWU7CisgICAgRWF0VG9FbmRPZlN0YXRlbWVudCgpOworICB9CisKKyAgaWYgKFRoZUNvbmRTdGF0ZS5UaGVDb25kICE9IFN0YXJ0aW5nQ29uZFN0YXRlLlRoZUNvbmQgfHwKKyAgICAgIFRoZUNvbmRTdGF0ZS5JZ25vcmUgIT0gU3RhcnRpbmdDb25kU3RhdGUuSWdub3JlKQorICAgIHJldHVybiBUb2tFcnJvcigidW5tYXRjaGVkIC5pZnMgb3IgLmVsc2VzIik7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIHRoZXJlIGFyZSBubyBlbXB0eSBEd2FyZkZpbGUgc2xvdHMuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1DRHdhcmZGaWxlICo+ICZNQ0R3YXJmRmlsZXMgPQorICAgIGdldENvbnRleHQoKS5nZXRNQ0R3YXJmRmlsZXMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IE1DRHdhcmZGaWxlcy5zaXplKCk7IGkrKykgeworICAgIGlmICghTUNEd2FyZkZpbGVzW2ldKXsKKyAgICAgIFRva0Vycm9yKCJ1bmFzc2lnbmVkIGZpbGUgbnVtYmVyOiAiICsgVHdpbmUoaSkgKyAiIGZvciAuZmlsZSBkaXJlY3RpdmVzIik7CisgICAgICBIYWRFcnJvciA9IHRydWU7CisgICAgfQorICB9CisgIAorICAvLyBGaW5hbGl6ZSB0aGUgb3V0cHV0IHN0cmVhbSBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzIGFuZCBpZiB0aGUgY2xpZW50IHdhbnRzCisgIC8vIHVzIHRvLgorICBpZiAoIUhhZEVycm9yICYmICFOb0ZpbmFsaXplKSAgCisgICAgT3V0LkZpbmlzaCgpOworCisgIHJldHVybiBIYWRFcnJvcjsKK30KKworLy8vIEVhdFRvRW5kT2ZTdGF0ZW1lbnQgLSBUaHJvdyBhd2F5IHRoZSByZXN0IG9mIHRoZSBsaW5lIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgordm9pZCBBc21QYXJzZXI6OkVhdFRvRW5kT2ZTdGF0ZW1lbnQoKSB7CisgIHdoaWxlIChMZXhlci5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpICYmCisgICAgICAgICBMZXhlci5pc05vdChBc21Ub2tlbjo6RW9mKSkKKyAgICBMZXgoKTsKKyAgCisgIC8vIEVhdCBFT0wuCisgIGlmIChMZXhlci5pcyhBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgIExleCgpOworfQorCitTdHJpbmdSZWYgQXNtUGFyc2VyOjpQYXJzZVN0cmluZ1RvRW5kT2ZTdGF0ZW1lbnQoKSB7CisgIGNvbnN0IGNoYXIgKlN0YXJ0ID0gZ2V0VG9rKCkuZ2V0TG9jKCkuZ2V0UG9pbnRlcigpOworCisgIHdoaWxlIChMZXhlci5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpICYmCisgICAgICAgICBMZXhlci5pc05vdChBc21Ub2tlbjo6RW9mKSkKKyAgICBMZXgoKTsKKworICBjb25zdCBjaGFyICpFbmQgPSBnZXRUb2soKS5nZXRMb2MoKS5nZXRQb2ludGVyKCk7CisgIHJldHVybiBTdHJpbmdSZWYoU3RhcnQsIEVuZCAtIFN0YXJ0KTsKK30KKworLy8vIFBhcnNlUGFyZW5FeHByIC0gUGFyc2UgYSBwYXJlbiBleHByZXNzaW9uIGFuZCByZXR1cm4gaXQuCisvLy8gTk9URTogVGhpcyBhc3N1bWVzIHRoZSBsZWFkaW5nICcoJyBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLgorLy8vCisvLy8gcGFyZW5leHByIDo6PSBleHByKQorLy8vCitib29sIEFzbVBhcnNlcjo6UGFyc2VQYXJlbkV4cHIoY29uc3QgTUNFeHByIComUmVzLCBTTUxvYyAmRW5kTG9jKSB7CisgIGlmIChQYXJzZUV4cHJlc3Npb24oUmVzKSkgcmV0dXJuIHRydWU7CisgIGlmIChMZXhlci5pc05vdChBc21Ub2tlbjo6UlBhcmVuKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkICcpJyBpbiBwYXJlbnRoZXNlcyBleHByZXNzaW9uIik7CisgIEVuZExvYyA9IExleGVyLmdldExvYygpOworICBMZXgoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VQcmltYXJ5RXhwciAtIFBhcnNlIGEgcHJpbWFyeSBleHByZXNzaW9uIGFuZCByZXR1cm4gaXQuCisvLy8gIHByaW1hcnlleHByIDo6PSAocGFyZW5leHByCisvLy8gIHByaW1hcnlleHByIDo6PSBzeW1ib2wKKy8vLyAgcHJpbWFyeWV4cHIgOjo9IG51bWJlcgorLy8vICBwcmltYXJ5ZXhwciA6Oj0gJy4nCisvLy8gIHByaW1hcnlleHByIDo6PSB+LCssLSBwcmltYXJ5ZXhwcgorYm9vbCBBc21QYXJzZXI6OlBhcnNlUHJpbWFyeUV4cHIoY29uc3QgTUNFeHByIComUmVzLCBTTUxvYyAmRW5kTG9jKSB7CisgIHN3aXRjaCAoTGV4ZXIuZ2V0S2luZCgpKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmtub3duIHRva2VuIGluIGV4cHJlc3Npb24iKTsKKyAgY2FzZSBBc21Ub2tlbjo6RXhjbGFpbToKKyAgICBMZXgoKTsgLy8gRWF0IHRoZSBvcGVyYXRvci4KKyAgICBpZiAoUGFyc2VQcmltYXJ5RXhwcihSZXMsIEVuZExvYykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBSZXMgPSBNQ1VuYXJ5RXhwcjo6Q3JlYXRlTE5vdChSZXMsIGdldENvbnRleHQoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIEFzbVRva2VuOjpTdHJpbmc6CisgIGNhc2UgQXNtVG9rZW46OklkZW50aWZpZXI6IHsKKyAgICAvLyBUaGlzIGlzIGEgc3ltYm9sIHJlZmVyZW5jZS4KKyAgICBzdGQ6OnBhaXI8U3RyaW5nUmVmLCBTdHJpbmdSZWY+IFNwbGl0ID0gZ2V0VG9rKCkuZ2V0SWRlbnRpZmllcigpLnNwbGl0KCdAJyk7CisgICAgTUNTeW1ib2wgKlN5bSA9IGdldENvbnRleHQoKS5HZXRPckNyZWF0ZVN5bWJvbChTcGxpdC5maXJzdCk7CisKKyAgICAvLyBNYXJrIHRoZSBzeW1ib2wgYXMgdXNlZCBpbiBhbiBleHByZXNzaW9uLgorICAgIFN5bS0+c2V0VXNlZEluRXhwcih0cnVlKTsKKworICAgIC8vIExvb2t1cCB0aGUgc3ltYm9sIHZhcmlhbnQgaWYgdXNlZC4KKyAgICBNQ1N5bWJvbFJlZkV4cHI6OlZhcmlhbnRLaW5kIFZhcmlhbnQgPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX05vbmU7CisgICAgaWYgKFNwbGl0LmZpcnN0LnNpemUoKSAhPSBnZXRUb2soKS5nZXRJZGVudGlmaWVyKCkuc2l6ZSgpKQorICAgICAgVmFyaWFudCA9IE1DU3ltYm9sUmVmRXhwcjo6Z2V0VmFyaWFudEtpbmRGb3JOYW1lKFNwbGl0LnNlY29uZCk7CisKKyAgICBFbmRMb2MgPSBMZXhlci5nZXRMb2MoKTsKKyAgICBMZXgoKTsgLy8gRWF0IGlkZW50aWZpZXIuCisKKyAgICAvLyBJZiB0aGlzIGlzIGFuIGFic29sdXRlIHZhcmlhYmxlIHJlZmVyZW5jZSwgc3Vic3RpdHV0ZSBpdCBub3cgdG8gcHJlc2VydmUKKyAgICAvLyBzZW1hbnRpY3MgaW4gdGhlIGZhY2Ugb2YgcmVhc3NpZ25tZW50LgorICAgIGlmIChTeW0tPmlzVmFyaWFibGUoKSAmJiBpc2E8TUNDb25zdGFudEV4cHI+KFN5bS0+Z2V0VmFyaWFibGVWYWx1ZSgpKSkgeworICAgICAgaWYgKFZhcmlhbnQpCisgICAgICAgIHJldHVybiBFcnJvcihFbmRMb2MsICJ1bmV4cGVjdGVkIG1vZGlmaWVkIG9uIHZhcmlhYmxlIHJlZmVyZW5jZSIpOworCisgICAgICBSZXMgPSBTeW0tPmdldFZhcmlhYmxlVmFsdWUoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UgY3JlYXRlIGEgc3ltYm9sIHJlZi4KKyAgICBSZXMgPSBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShTeW0sIFZhcmlhbnQsIGdldENvbnRleHQoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNhc2UgQXNtVG9rZW46OkludGVnZXI6IHsKKyAgICBTTUxvYyBMb2MgPSBnZXRUb2soKS5nZXRMb2MoKTsKKyAgICBpbnQ2NF90IEludFZhbCA9IGdldFRvaygpLmdldEludFZhbCgpOworICAgIFJlcyA9IE1DQ29uc3RhbnRFeHByOjpDcmVhdGUoSW50VmFsLCBnZXRDb250ZXh0KCkpOworICAgIEVuZExvYyA9IExleGVyLmdldExvYygpOworICAgIExleCgpOyAvLyBFYXQgdG9rZW4uCisgICAgLy8gTG9vayBmb3IgJ2InIG9yICdmJyBmb2xsb3dpbmcgYW4gSW50ZWdlciBhcyBhIGRpcmVjdGlvbmFsIGxhYmVsCisgICAgaWYgKExleGVyLmdldEtpbmQoKSA9PSBBc21Ub2tlbjo6SWRlbnRpZmllcikgeworICAgICAgU3RyaW5nUmVmIElEVmFsID0gZ2V0VG9rKCkuZ2V0U3RyaW5nKCk7CisgICAgICBpZiAoSURWYWwgPT0gImYiIHx8IElEVmFsID09ICJiIil7CisgICAgICAgIE1DU3ltYm9sICpTeW0gPSBDdHguR2V0RGlyZWN0aW9uYWxMb2NhbFN5bWJvbChJbnRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFZhbCA9PSAiZiIgPyAxIDogMCk7CisgICAgICAgIFJlcyA9IE1DU3ltYm9sUmVmRXhwcjo6Q3JlYXRlKFN5bSwgTUNTeW1ib2xSZWZFeHByOjpWS19Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkpOworICAgICAgICBpZihJRFZhbCA9PSAiYiIgJiYgU3ltLT5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgIHJldHVybiBFcnJvcihMb2MsICJpbnZhbGlkIHJlZmVyZW5jZSB0byB1bmRlZmluZWQgc3ltYm9sIik7CisgICAgICAgIEVuZExvYyA9IExleGVyLmdldExvYygpOworICAgICAgICBMZXgoKTsgLy8gRWF0IGlkZW50aWZpZXIuCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjYXNlIEFzbVRva2VuOjpEb3Q6IHsKKyAgICAvLyBUaGlzIGlzIGEgJy4nIHJlZmVyZW5jZSwgd2hpY2ggcmVmZXJlbmNlcyB0aGUgY3VycmVudCBQQy4gIEVtaXQgYQorICAgIC8vIHRlbXBvcmFyeSBsYWJlbCB0byB0aGUgc3RyZWFtZXIgYW5kIHJlZmVyIHRvIGl0LgorICAgIE1DU3ltYm9sICpTeW0gPSBDdHguQ3JlYXRlVGVtcFN5bWJvbCgpOworICAgIE91dC5FbWl0TGFiZWwoU3ltKTsKKyAgICBSZXMgPSBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShTeW0sIE1DU3ltYm9sUmVmRXhwcjo6VktfTm9uZSwgZ2V0Q29udGV4dCgpKTsKKyAgICBFbmRMb2MgPSBMZXhlci5nZXRMb2MoKTsKKyAgICBMZXgoKTsgLy8gRWF0IGlkZW50aWZpZXIuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisgICAgICAKKyAgY2FzZSBBc21Ub2tlbjo6TFBhcmVuOgorICAgIExleCgpOyAvLyBFYXQgdGhlICcoJy4KKyAgICByZXR1cm4gUGFyc2VQYXJlbkV4cHIoUmVzLCBFbmRMb2MpOworICBjYXNlIEFzbVRva2VuOjpNaW51czoKKyAgICBMZXgoKTsgLy8gRWF0IHRoZSBvcGVyYXRvci4KKyAgICBpZiAoUGFyc2VQcmltYXJ5RXhwcihSZXMsIEVuZExvYykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBSZXMgPSBNQ1VuYXJ5RXhwcjo6Q3JlYXRlTWludXMoUmVzLCBnZXRDb250ZXh0KCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBBc21Ub2tlbjo6UGx1czoKKyAgICBMZXgoKTsgLy8gRWF0IHRoZSBvcGVyYXRvci4KKyAgICBpZiAoUGFyc2VQcmltYXJ5RXhwcihSZXMsIEVuZExvYykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBSZXMgPSBNQ1VuYXJ5RXhwcjo6Q3JlYXRlUGx1cyhSZXMsIGdldENvbnRleHQoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIEFzbVRva2VuOjpUaWxkZToKKyAgICBMZXgoKTsgLy8gRWF0IHRoZSBvcGVyYXRvci4KKyAgICBpZiAoUGFyc2VQcmltYXJ5RXhwcihSZXMsIEVuZExvYykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBSZXMgPSBNQ1VuYXJ5RXhwcjo6Q3JlYXRlTm90KFJlcywgZ2V0Q29udGV4dCgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBBc21QYXJzZXI6OlBhcnNlRXhwcmVzc2lvbihjb25zdCBNQ0V4cHIgKiZSZXMpIHsKKyAgU01Mb2MgRW5kTG9jOworICByZXR1cm4gUGFyc2VFeHByZXNzaW9uKFJlcywgRW5kTG9jKTsKK30KKworLy8vIFBhcnNlRXhwcmVzc2lvbiAtIFBhcnNlIGFuIGV4cHJlc3Npb24gYW5kIHJldHVybiBpdC4KKy8vLyAKKy8vLyAgZXhwciA6Oj0gZXhwciArLC0gZXhwciAgICAgICAgICAtPiBsb3dlc3QuCisvLy8gIGV4cHIgOjo9IGV4cHIgfCxeLCYsISBleHByICAgICAgLT4gbWlkZGxlLgorLy8vICBleHByIDo6PSBleHByICosLywlLDw8LD4+IGV4cHIgIC0+IGhpZ2hlc3QuCisvLy8gIGV4cHIgOjo9IHByaW1hcnlleHByCisvLy8KK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZUV4cHJlc3Npb24oY29uc3QgTUNFeHByIComUmVzLCBTTUxvYyAmRW5kTG9jKSB7CisgIC8vIFBhcnNlIHRoZSBleHByZXNzaW9uLgorICBSZXMgPSAwOworICBpZiAoUGFyc2VQcmltYXJ5RXhwcihSZXMsIEVuZExvYykgfHwgUGFyc2VCaW5PcFJIUygxLCBSZXMsIEVuZExvYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gVHJ5IHRvIGNvbnN0YW50IGZvbGQgaXQgdXAgZnJvbnQsIGlmIHBvc3NpYmxlLgorICBpbnQ2NF90IFZhbHVlOworICBpZiAoUmVzLT5FdmFsdWF0ZUFzQWJzb2x1dGUoVmFsdWUpKQorICAgIFJlcyA9IE1DQ29uc3RhbnRFeHByOjpDcmVhdGUoVmFsdWUsIGdldENvbnRleHQoKSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFzbVBhcnNlcjo6UGFyc2VQYXJlbkV4cHJlc3Npb24oY29uc3QgTUNFeHByIComUmVzLCBTTUxvYyAmRW5kTG9jKSB7CisgIFJlcyA9IDA7CisgIHJldHVybiBQYXJzZVBhcmVuRXhwcihSZXMsIEVuZExvYykgfHwKKyAgICAgICAgIFBhcnNlQmluT3BSSFMoMSwgUmVzLCBFbmRMb2MpOworfQorCitib29sIEFzbVBhcnNlcjo6UGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oaW50NjRfdCAmUmVzKSB7CisgIGNvbnN0IE1DRXhwciAqRXhwcjsKKyAgCisgIFNNTG9jIFN0YXJ0TG9jID0gTGV4ZXIuZ2V0TG9jKCk7CisgIGlmIChQYXJzZUV4cHJlc3Npb24oRXhwcikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKCFFeHByLT5FdmFsdWF0ZUFzQWJzb2x1dGUoUmVzKSkKKyAgICByZXR1cm4gRXJyb3IoU3RhcnRMb2MsICJleHBlY3RlZCBhYnNvbHV0ZSBleHByZXNzaW9uIik7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0QmluT3BQcmVjZWRlbmNlKEFzbVRva2VuOjpUb2tlbktpbmQgSywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQmluYXJ5RXhwcjo6T3Bjb2RlICZLaW5kKSB7CisgIHN3aXRjaCAoSykgeworICBkZWZhdWx0OgorICAgIHJldHVybiAwOyAgICAvLyBub3QgYSBiaW5vcC4KKworICAgIC8vIExvd2VzdCBQcmVjZWRlbmNlOiAmJiwgfHwKKyAgY2FzZSBBc21Ub2tlbjo6QW1wQW1wOgorICAgIEtpbmQgPSBNQ0JpbmFyeUV4cHI6OkxBbmQ7CisgICAgcmV0dXJuIDE7CisgIGNhc2UgQXNtVG9rZW46OlBpcGVQaXBlOgorICAgIEtpbmQgPSBNQ0JpbmFyeUV4cHI6OkxPcjsKKyAgICByZXR1cm4gMTsKKworICAgIC8vIExvdyBQcmVjZWRlbmNlOiArLCAtLCA9PSwgIT0sIDw+LCA8LCA8PSwgPiwgPj0KKyAgY2FzZSBBc21Ub2tlbjo6UGx1czoKKyAgICBLaW5kID0gTUNCaW5hcnlFeHByOjpBZGQ7CisgICAgcmV0dXJuIDI7CisgIGNhc2UgQXNtVG9rZW46Ok1pbnVzOgorICAgIEtpbmQgPSBNQ0JpbmFyeUV4cHI6OlN1YjsKKyAgICByZXR1cm4gMjsKKyAgY2FzZSBBc21Ub2tlbjo6RXF1YWxFcXVhbDoKKyAgICBLaW5kID0gTUNCaW5hcnlFeHByOjpFUTsKKyAgICByZXR1cm4gMjsKKyAgY2FzZSBBc21Ub2tlbjo6RXhjbGFpbUVxdWFsOgorICBjYXNlIEFzbVRva2VuOjpMZXNzR3JlYXRlcjoKKyAgICBLaW5kID0gTUNCaW5hcnlFeHByOjpORTsKKyAgICByZXR1cm4gMjsKKyAgY2FzZSBBc21Ub2tlbjo6TGVzczoKKyAgICBLaW5kID0gTUNCaW5hcnlFeHByOjpMVDsKKyAgICByZXR1cm4gMjsKKyAgY2FzZSBBc21Ub2tlbjo6TGVzc0VxdWFsOgorICAgIEtpbmQgPSBNQ0JpbmFyeUV4cHI6OkxURTsKKyAgICByZXR1cm4gMjsKKyAgY2FzZSBBc21Ub2tlbjo6R3JlYXRlcjoKKyAgICBLaW5kID0gTUNCaW5hcnlFeHByOjpHVDsKKyAgICByZXR1cm4gMjsKKyAgY2FzZSBBc21Ub2tlbjo6R3JlYXRlckVxdWFsOgorICAgIEtpbmQgPSBNQ0JpbmFyeUV4cHI6OkdURTsKKyAgICByZXR1cm4gMjsKKworICAgIC8vIEludGVybWVkaWF0ZSBQcmVjZWRlbmNlOiB8LCAmLCBeCisgICAgLy8KKyAgICAvLyBGSVhNRTogZ2FzIHNlZW1zIHRvIHN1cHBvcnQgJyEnIGFzIGFuIGluZml4IG9wZXJhdG9yPworICBjYXNlIEFzbVRva2VuOjpQaXBlOgorICAgIEtpbmQgPSBNQ0JpbmFyeUV4cHI6Ok9yOworICAgIHJldHVybiAzOworICBjYXNlIEFzbVRva2VuOjpDYXJldDoKKyAgICBLaW5kID0gTUNCaW5hcnlFeHByOjpYb3I7CisgICAgcmV0dXJuIDM7CisgIGNhc2UgQXNtVG9rZW46OkFtcDoKKyAgICBLaW5kID0gTUNCaW5hcnlFeHByOjpBbmQ7CisgICAgcmV0dXJuIDM7CisKKyAgICAvLyBIaWdoZXN0IFByZWNlZGVuY2U6ICosIC8sICUsIDw8LCA+PgorICBjYXNlIEFzbVRva2VuOjpTdGFyOgorICAgIEtpbmQgPSBNQ0JpbmFyeUV4cHI6Ok11bDsKKyAgICByZXR1cm4gNDsKKyAgY2FzZSBBc21Ub2tlbjo6U2xhc2g6CisgICAgS2luZCA9IE1DQmluYXJ5RXhwcjo6RGl2OworICAgIHJldHVybiA0OworICBjYXNlIEFzbVRva2VuOjpQZXJjZW50OgorICAgIEtpbmQgPSBNQ0JpbmFyeUV4cHI6Ok1vZDsKKyAgICByZXR1cm4gNDsKKyAgY2FzZSBBc21Ub2tlbjo6TGVzc0xlc3M6CisgICAgS2luZCA9IE1DQmluYXJ5RXhwcjo6U2hsOworICAgIHJldHVybiA0OworICBjYXNlIEFzbVRva2VuOjpHcmVhdGVyR3JlYXRlcjoKKyAgICBLaW5kID0gTUNCaW5hcnlFeHByOjpTaHI7CisgICAgcmV0dXJuIDQ7CisgIH0KK30KKworCisvLy8gUGFyc2VCaW5PcFJIUyAtIFBhcnNlIGFsbCBiaW5hcnkgb3BlcmF0b3JzIHdpdGggcHJlY2VkZW5jZSA+PSAnUHJlY2VkZW5jZScuCisvLy8gUmVzIGNvbnRhaW5zIHRoZSBMSFMgb2YgdGhlIGV4cHJlc3Npb24gb24gaW5wdXQuCitib29sIEFzbVBhcnNlcjo6UGFyc2VCaW5PcFJIUyh1bnNpZ25lZCBQcmVjZWRlbmNlLCBjb25zdCBNQ0V4cHIgKiZSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyAmRW5kTG9jKSB7CisgIHdoaWxlICgxKSB7CisgICAgTUNCaW5hcnlFeHByOjpPcGNvZGUgS2luZCA9IE1DQmluYXJ5RXhwcjo6QWRkOworICAgIHVuc2lnbmVkIFRva1ByZWMgPSBnZXRCaW5PcFByZWNlZGVuY2UoTGV4ZXIuZ2V0S2luZCgpLCBLaW5kKTsKKyAgICAKKyAgICAvLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBsb3dlciBwcmVjZWRlbmNlIHRoYW4gd2UgYXJlIGFsbG93ZWQgdG8gZWF0LCByZXR1cm4KKyAgICAvLyBzdWNjZXNzZnVsbHkgd2l0aCB3aGF0IHdlIGF0ZSBhbHJlYWR5LgorICAgIGlmIChUb2tQcmVjIDwgUHJlY2VkZW5jZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBMZXgoKTsKKyAgICAKKyAgICAvLyBFYXQgdGhlIG5leHQgcHJpbWFyeSBleHByZXNzaW9uLgorICAgIGNvbnN0IE1DRXhwciAqUkhTOworICAgIGlmIChQYXJzZVByaW1hcnlFeHByKFJIUywgRW5kTG9jKSkgcmV0dXJuIHRydWU7CisgICAgCisgICAgLy8gSWYgQmluT3AgYmluZHMgbGVzcyB0aWdodGx5IHdpdGggUkhTIHRoYW4gdGhlIG9wZXJhdG9yIGFmdGVyIFJIUywgbGV0CisgICAgLy8gdGhlIHBlbmRpbmcgb3BlcmF0b3IgdGFrZSBSSFMgYXMgaXRzIExIUy4KKyAgICBNQ0JpbmFyeUV4cHI6Ok9wY29kZSBEdW1teTsKKyAgICB1bnNpZ25lZCBOZXh0VG9rUHJlYyA9IGdldEJpbk9wUHJlY2VkZW5jZShMZXhlci5nZXRLaW5kKCksIER1bW15KTsKKyAgICBpZiAoVG9rUHJlYyA8IE5leHRUb2tQcmVjKSB7CisgICAgICBpZiAoUGFyc2VCaW5PcFJIUyhQcmVjZWRlbmNlKzEsIFJIUywgRW5kTG9jKSkgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gTWVyZ2UgTEhTIGFuZCBSSFMgYWNjb3JkaW5nIHRvIG9wZXJhdG9yLgorICAgIFJlcyA9IE1DQmluYXJ5RXhwcjo6Q3JlYXRlKEtpbmQsIFJlcywgUkhTLCBnZXRDb250ZXh0KCkpOworICB9Cit9CisKKyAgCisgIAorICAKKy8vLyBQYXJzZVN0YXRlbWVudDoKKy8vLyAgIDo6PSBFbmRPZlN0YXRlbWVudAorLy8vICAgOjo9IExhYmVsKiBEaXJlY3RpdmUgLi4uT3BlcmFuZHMuLi4gRW5kT2ZTdGF0ZW1lbnQKKy8vLyAgIDo6PSBMYWJlbCogSWRlbnRpZmllciBPcGVyYW5kTGlzdCogRW5kT2ZTdGF0ZW1lbnQKK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZVN0YXRlbWVudCgpIHsKKyAgaWYgKExleGVyLmlzKEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpIHsKKyAgICBPdXQuQWRkQmxhbmtMaW5lKCk7CisgICAgTGV4KCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gU3RhdGVtZW50cyBhbHdheXMgc3RhcnQgd2l0aCBhbiBpZGVudGlmaWVyLgorICBBc21Ub2tlbiBJRCA9IGdldFRvaygpOworICBTTUxvYyBJRExvYyA9IElELmdldExvYygpOworICBTdHJpbmdSZWYgSURWYWw7CisgIGludDY0X3QgTG9jYWxMYWJlbFZhbCA9IC0xOworICAvLyBHVUVTUyBhbGxvdyBhbiBpbnRlZ2VyIGZvbGxvd2VkIGJ5IGEgJzonIGFzIGEgZGlyZWN0aW9uYWwgbG9jYWwgbGFiZWwKKyAgaWYgKExleGVyLmlzKEFzbVRva2VuOjpJbnRlZ2VyKSkgeworICAgIExvY2FsTGFiZWxWYWwgPSBnZXRUb2soKS5nZXRJbnRWYWwoKTsKKyAgICBpZiAoTG9jYWxMYWJlbFZhbCA8IDApIHsKKyAgICAgIGlmICghVGhlQ29uZFN0YXRlLklnbm9yZSkKKyAgICAgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGF0IHN0YXJ0IG9mIHN0YXRlbWVudCIpOworICAgICAgSURWYWwgPSAiIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBJRFZhbCA9IGdldFRvaygpLmdldFN0cmluZygpOworICAgICAgTGV4KCk7IC8vIENvbnN1bWUgdGhlIGludGVnZXIgdG9rZW4gdG8gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIHRva2VuLgorICAgICAgaWYgKExleGVyLmdldEtpbmQoKSAhPSBBc21Ub2tlbjo6Q29sb24pIHsKKyAgICAgICAgaWYgKCFUaGVDb25kU3RhdGUuSWdub3JlKQorICAgICAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBhdCBzdGFydCBvZiBzdGF0ZW1lbnQiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoUGFyc2VJZGVudGlmaWVyKElEVmFsKSkgeworICAgIGlmICghVGhlQ29uZFN0YXRlLklnbm9yZSkKKyAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBhdCBzdGFydCBvZiBzdGF0ZW1lbnQiKTsKKyAgICBJRFZhbCA9ICIiOworICB9CisKKyAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGFzc2VtYmx5IGhlcmUgYmVmb3JlIGNoZWNraW5nIGZvciBza2lwcGluZy4gIFdlCisgIC8vIGhhdmUgdG8gZG8gdGhpcyBzbyB0aGF0IC5lbmRpZiBpc24ndCBza2lwcGVkIGluIGEgIi5pZiAwIiBibG9jayBmb3IKKyAgLy8gZXhhbXBsZS4KKyAgaWYgKElEVmFsID09ICIuaWYiKQorICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUlmKElETG9jKTsKKyAgaWYgKElEVmFsID09ICIuZWxzZWlmIikKKyAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVFbHNlSWYoSURMb2MpOworICBpZiAoSURWYWwgPT0gIi5lbHNlIikKKyAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVFbHNlKElETG9jKTsKKyAgaWYgKElEVmFsID09ICIuZW5kaWYiKQorICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUVuZElmKElETG9jKTsKKyAgICAKKyAgLy8gSWYgd2UgYXJlIGluIGEgIi5pZiAwIiBibG9jaywgaWdub3JlIHRoaXMgc3RhdGVtZW50LgorICBpZiAoVGhlQ29uZFN0YXRlLklnbm9yZSkgeworICAgIEVhdFRvRW5kT2ZTdGF0ZW1lbnQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIEZJWE1FOiBSZWN1cnNlIG9uIGxvY2FsIGxhYmVscz8KKworICAvLyBTZWUgd2hhdCBraW5kIG9mIHN0YXRlbWVudCB3ZSBoYXZlLgorICBzd2l0Y2ggKExleGVyLmdldEtpbmQoKSkgeworICBjYXNlIEFzbVRva2VuOjpDb2xvbjogeworICAgIC8vIGlkZW50aWZpZXIgJzonICAgLT4gTGFiZWwuCisgICAgTGV4KCk7CisKKyAgICAvLyBEaWFnbm9zZSBhdHRlbXB0IHRvIHVzZSBhIHZhcmlhYmxlIGFzIGEgbGFiZWwuCisgICAgLy8KKyAgICAvLyBGSVhNRTogRGlhZ25vc3RpY3MuIE5vdGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWZpbml0aW9uIGFzIGEgbGFiZWwuCisgICAgLy8gRklYTUU6IFRoaXMgZG9lc24ndCBkaWFnbm9zZSBhc3NpZ25tZW50IHRvIGEgc3ltYm9sIHdoaWNoIGhhcyBiZWVuCisgICAgLy8gaW1wbGljaXRseSBtYXJrZWQgYXMgZXh0ZXJuYWwuCisgICAgTUNTeW1ib2wgKlN5bTsKKyAgICBpZiAoTG9jYWxMYWJlbFZhbCA9PSAtMSkKKyAgICAgIFN5bSA9IGdldENvbnRleHQoKS5HZXRPckNyZWF0ZVN5bWJvbChJRFZhbCk7CisgICAgZWxzZQorICAgICAgU3ltID0gQ3R4LkNyZWF0ZURpcmVjdGlvbmFsTG9jYWxTeW1ib2woTG9jYWxMYWJlbFZhbCk7CisgICAgaWYgKCFTeW0tPmlzVW5kZWZpbmVkKCkgfHwgU3ltLT5pc1ZhcmlhYmxlKCkpCisgICAgICByZXR1cm4gRXJyb3IoSURMb2MsICJpbnZhbGlkIHN5bWJvbCByZWRlZmluaXRpb24iKTsKKyAgICAKKyAgICAvLyBFbWl0IHRoZSBsYWJlbC4KKyAgICBPdXQuRW1pdExhYmVsKFN5bSk7CisgICAKKyAgICAvLyBDb25zdW1lIGFueSBlbmQgb2Ygc3RhdGVtZW50IHRva2VuLCBpZiBwcmVzZW50LCB0byBhdm9pZCBzcHVyaW91cworICAgIC8vIEFkZEJsYW5rTGluZSBjYWxscygpLgorICAgIGlmIChMZXhlci5pcyhBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKSB7CisgICAgICBMZXgoKTsKKyAgICAgIGlmIChMZXhlci5pcyhBc21Ub2tlbjo6RW9mKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBQYXJzZVN0YXRlbWVudCgpOworICB9CisKKyAgY2FzZSBBc21Ub2tlbjo6RXF1YWw6CisgICAgLy8gaWRlbnRpZmllciAnPScgLi4uIC0+IGFzc2lnbm1lbnQgc3RhdGVtZW50CisgICAgTGV4KCk7CisKKyAgICByZXR1cm4gUGFyc2VBc3NpZ25tZW50KElEVmFsKTsKKworICBkZWZhdWx0OiAvLyBOb3JtYWwgaW5zdHJ1Y3Rpb24gb3IgZGlyZWN0aXZlLgorICAgIGJyZWFrOworICB9CisKKyAgLy8gSWYgbWFjcm9zIGFyZSBlbmFibGVkLCBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIG1hY3JvIGluc3RhbnRpYXRpb24uCisgIGlmIChNYWNyb3NFbmFibGVkKQorICAgIGlmIChjb25zdCBNYWNybyAqTSA9IE1hY3JvTWFwLmxvb2t1cChJRFZhbCkpCisgICAgICByZXR1cm4gSGFuZGxlTWFjcm9FbnRyeShJRFZhbCwgSURMb2MsIE0pOworCisgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSBhIG5vcm1hbCBpbnN0cnVjdGlvbiBvciBkaXJlY3RpdmUuICAKKyAgaWYgKElEVmFsWzBdID09ICcuJykgeworICAgIC8vIEFzc2VtYmxlciBmZWF0dXJlcworICAgIGlmIChJRFZhbCA9PSAiLnNldCIpCisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVTZXQoKTsKKworICAgIC8vIERhdGEgZGlyZWN0aXZlcworCisgICAgaWYgKElEVmFsID09ICIuYXNjaWkiKQorICAgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlQXNjaWkoZmFsc2UpOworICAgIGlmIChJRFZhbCA9PSAiLmFzY2l6IikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUFzY2lpKHRydWUpOworCisgICAgaWYgKElEVmFsID09ICIuYnl0ZSIpCisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVWYWx1ZSgxKTsKKyAgICBpZiAoSURWYWwgPT0gIi5zaG9ydCIpCisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVWYWx1ZSgyKTsKKyAgICBpZiAoSURWYWwgPT0gIi5sb25nIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZVZhbHVlKDQpOworICAgIGlmIChJRFZhbCA9PSAiLnF1YWQiKQorICAgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlVmFsdWUoOCk7CisKKyAgICBpZiAoSURWYWwgPT0gIi5hbGlnbiIpIHsKKyAgICAgIGJvb2wgSXNQb3cyID0gIWdldENvbnRleHQoKS5nZXRBc21JbmZvKCkuZ2V0QWxpZ25tZW50SXNJbkJ5dGVzKCk7CisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVBbGlnbihJc1BvdzIsIC8qRXhwclNpemU9Ki8xKTsKKyAgICB9CisgICAgaWYgKElEVmFsID09ICIuYWxpZ24zMiIpIHsKKyAgICAgIGJvb2wgSXNQb3cyID0gIWdldENvbnRleHQoKS5nZXRBc21JbmZvKCkuZ2V0QWxpZ25tZW50SXNJbkJ5dGVzKCk7CisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVBbGlnbihJc1BvdzIsIC8qRXhwclNpemU9Ki80KTsKKyAgICB9CisgICAgaWYgKElEVmFsID09ICIuYmFsaWduIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUFsaWduKC8qSXNQb3cyPSovZmFsc2UsIC8qRXhwclNpemU9Ki8xKTsKKyAgICBpZiAoSURWYWwgPT0gIi5iYWxpZ253IikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUFsaWduKC8qSXNQb3cyPSovZmFsc2UsIC8qRXhwclNpemU9Ki8yKTsKKyAgICBpZiAoSURWYWwgPT0gIi5iYWxpZ25sIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUFsaWduKC8qSXNQb3cyPSovZmFsc2UsIC8qRXhwclNpemU9Ki80KTsKKyAgICBpZiAoSURWYWwgPT0gIi5wMmFsaWduIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUFsaWduKC8qSXNQb3cyPSovdHJ1ZSwgLypFeHByU2l6ZT0qLzEpOworICAgIGlmIChJRFZhbCA9PSAiLnAyYWxpZ253IikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUFsaWduKC8qSXNQb3cyPSovdHJ1ZSwgLypFeHByU2l6ZT0qLzIpOworICAgIGlmIChJRFZhbCA9PSAiLnAyYWxpZ25sIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUFsaWduKC8qSXNQb3cyPSovdHJ1ZSwgLypFeHByU2l6ZT0qLzQpOworCisgICAgaWYgKElEVmFsID09ICIub3JnIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZU9yZygpOworCisgICAgaWYgKElEVmFsID09ICIuZmlsbCIpCisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVGaWxsKCk7CisgICAgaWYgKElEVmFsID09ICIuc3BhY2UiKQorICAgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlU3BhY2UoKTsKKworICAgIC8vIFN5bWJvbCBhdHRyaWJ1dGUgZGlyZWN0aXZlcworCisgICAgaWYgKElEVmFsID09ICIuZ2xvYmwiIHx8IElEVmFsID09ICIuZ2xvYmFsIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZVN5bWJvbEF0dHJpYnV0ZShNQ1NBX0dsb2JhbCk7CisgICAgaWYgKElEVmFsID09ICIuaGlkZGVuIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZVN5bWJvbEF0dHJpYnV0ZShNQ1NBX0hpZGRlbik7CisgICAgaWYgKElEVmFsID09ICIuaW5kaXJlY3Rfc3ltYm9sIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZVN5bWJvbEF0dHJpYnV0ZShNQ1NBX0luZGlyZWN0U3ltYm9sKTsKKyAgICBpZiAoSURWYWwgPT0gIi5pbnRlcm5hbCIpCisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVTeW1ib2xBdHRyaWJ1dGUoTUNTQV9JbnRlcm5hbCk7CisgICAgaWYgKElEVmFsID09ICIubGF6eV9yZWZlcmVuY2UiKQorICAgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlU3ltYm9sQXR0cmlidXRlKE1DU0FfTGF6eVJlZmVyZW5jZSk7CisgICAgaWYgKElEVmFsID09ICIubm9fZGVhZF9zdHJpcCIpCisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVTeW1ib2xBdHRyaWJ1dGUoTUNTQV9Ob0RlYWRTdHJpcCk7CisgICAgaWYgKElEVmFsID09ICIucHJpdmF0ZV9leHRlcm4iKQorICAgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlU3ltYm9sQXR0cmlidXRlKE1DU0FfUHJpdmF0ZUV4dGVybik7CisgICAgaWYgKElEVmFsID09ICIucHJvdGVjdGVkIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZVN5bWJvbEF0dHJpYnV0ZShNQ1NBX1Byb3RlY3RlZCk7CisgICAgaWYgKElEVmFsID09ICIucmVmZXJlbmNlIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZVN5bWJvbEF0dHJpYnV0ZShNQ1NBX1JlZmVyZW5jZSk7CisgICAgaWYgKElEVmFsID09ICIudHlwZSIpCisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVFTEZUeXBlKCk7CisgICAgaWYgKElEVmFsID09ICIud2VhayIpCisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVTeW1ib2xBdHRyaWJ1dGUoTUNTQV9XZWFrKTsKKyAgICBpZiAoSURWYWwgPT0gIi53ZWFrX2RlZmluaXRpb24iKQorICAgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlU3ltYm9sQXR0cmlidXRlKE1DU0FfV2Vha0RlZmluaXRpb24pOworICAgIGlmIChJRFZhbCA9PSAiLndlYWtfcmVmZXJlbmNlIikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZVN5bWJvbEF0dHJpYnV0ZShNQ1NBX1dlYWtSZWZlcmVuY2UpOworICAgIGlmIChJRFZhbCA9PSAiLndlYWtfZGVmX2Nhbl9iZV9oaWRkZW4iKQorICAgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlU3ltYm9sQXR0cmlidXRlKE1DU0FfV2Vha0RlZkF1dG9Qcml2YXRlKTsKKworICAgIGlmIChJRFZhbCA9PSAiLmNvbW0iKQorICAgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlQ29tbSgvKklzTG9jYWw9Ki9mYWxzZSk7CisgICAgaWYgKElEVmFsID09ICIubGNvbW0iKQorICAgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlQ29tbSgvKklzTG9jYWw9Ki90cnVlKTsKKworICAgIGlmIChJRFZhbCA9PSAiLmFib3J0IikKKyAgICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZUFib3J0KCk7CisgICAgaWYgKElEVmFsID09ICIuaW5jbHVkZSIpCisgICAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVJbmNsdWRlKCk7CisKKyAgICAvLyBMb29rIHVwIHRoZSBoYW5kbGVyIGluIHRoZSBoYW5kbGVyIHRhYmxlLgorICAgIHN0ZDo6cGFpcjxNQ0FzbVBhcnNlckV4dGVuc2lvbiosIERpcmVjdGl2ZUhhbmRsZXI+IEhhbmRsZXIgPQorICAgICAgRGlyZWN0aXZlTWFwLmxvb2t1cChJRFZhbCk7CisgICAgaWYgKEhhbmRsZXIuZmlyc3QpCisgICAgICByZXR1cm4gKCpIYW5kbGVyLnNlY29uZCkoSGFuZGxlci5maXJzdCwgSURWYWwsIElETG9jKTsKKworICAgIC8vIFRhcmdldCBob29rIGZvciBwYXJzaW5nIHRhcmdldCBzcGVjaWZpYyBkaXJlY3RpdmVzLgorICAgIGlmICghZ2V0VGFyZ2V0UGFyc2VyKCkuUGFyc2VEaXJlY3RpdmUoSUQpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgV2FybmluZyhJRExvYywgImlnbm9yaW5nIGRpcmVjdGl2ZSBmb3Igbm93Iik7CisgICAgRWF0VG9FbmRPZlN0YXRlbWVudCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIENhbm9uaWNhbGl6ZSB0aGUgb3Bjb2RlIHRvIGxvd2VyIGNhc2UuCisgIFNtYWxsU3RyaW5nPDEyOD4gT3Bjb2RlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSURWYWwuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBPcGNvZGUucHVzaF9iYWNrKHRvbG93ZXIoSURWYWxbaV0pKTsKKyAgCisgIFNtYWxsVmVjdG9yPE1DUGFyc2VkQXNtT3BlcmFuZCosIDg+IFBhcnNlZE9wZXJhbmRzOworICBib29sIEhhZEVycm9yID0gZ2V0VGFyZ2V0UGFyc2VyKCkuUGFyc2VJbnN0cnVjdGlvbihPcGNvZGUuc3RyKCksIElETG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcGVyYW5kcyk7CisgIGlmICghSGFkRXJyb3IgJiYgTGV4ZXIuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICBIYWRFcnJvciA9IFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluIGFyZ3VtZW50IGxpc3QiKTsKKworICAvLyBJZiBwYXJzaW5nIHN1Y2NlZWRlZCwgbWF0Y2ggdGhlIGluc3RydWN0aW9uLgorICBpZiAoIUhhZEVycm9yKSB7CisgICAgTUNJbnN0IEluc3Q7CisgICAgaWYgKCFnZXRUYXJnZXRQYXJzZXIoKS5NYXRjaEluc3RydWN0aW9uKFBhcnNlZE9wZXJhbmRzLCBJbnN0KSkgeworICAgICAgLy8gRW1pdCB0aGUgaW5zdHJ1Y3Rpb24gb24gc3VjY2Vzcy4KKyAgICAgIE91dC5FbWl0SW5zdHJ1Y3Rpb24oSW5zdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE90aGVyd2lzZSBlbWl0IGEgZGlhZ25vc3RpYyBhYm91dCB0aGUgbWF0Y2ggZmFpbHVyZSBhbmQgc2V0IHRoZSBlcnJvcgorICAgICAgLy8gZmxhZy4KKyAgICAgIC8vCisgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGdpdmUgbmljZXIgZGlhZ25vc3RpY3MgYWJvdXQgdGhlIGV4YWN0IGZhaWx1cmUuCisgICAgICBFcnJvcihJRExvYywgInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOworICAgICAgSGFkRXJyb3IgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZXJlIHdhcyBubyBlcnJvciwgY29uc3VtZSB0aGUgZW5kLW9mLXN0YXRlbWVudCB0b2tlbi4gT3RoZXJ3aXNlIHRoaXMKKyAgLy8gd2lsbCBiZSBkb25lIGJ5IG91ciBjYWxsZXIuCisgIGlmICghSGFkRXJyb3IpCisgICAgTGV4KCk7CisKKyAgLy8gRnJlZSBhbnkgcGFyc2VkIG9wZXJhbmRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUGFyc2VkT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBkZWxldGUgUGFyc2VkT3BlcmFuZHNbaV07CisKKyAgcmV0dXJuIEhhZEVycm9yOworfQorCitNYWNyb0luc3RhbnRpYXRpb246Ok1hY3JvSW5zdGFudGlhdGlvbihjb25zdCBNYWNybyAqTSwgU01Mb2MgSUwsIFNNTG9jIEVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxBc21Ub2tlbj4gPiAmQSkKKyAgOiBUaGVNYWNybyhNKSwgSW5zdGFudGlhdGlvbkxvYyhJTCksIEV4aXRMb2MoRUwpCit7CisgIC8vIE1hY3JvIGluc3RhbnRpYXRpb24gaXMgbGV4aWNhbCwgdW5mb3J0dW5hdGVseS4gV2UgY29uc3RydWN0IGEgbmV3IGJ1ZmZlcgorICAvLyB0byBob2xkIHRoZSBtYWNybyBib2R5IHdpdGggc3Vic3RpdHV0aW9ucy4KKyAgU21hbGxTdHJpbmc8MjU2PiBCdWY7CisgIHJhd19zdmVjdG9yX29zdHJlYW0gT1MoQnVmKTsKKworICBTdHJpbmdSZWYgQm9keSA9IE0tPkJvZHk7CisgIHdoaWxlICghQm9keS5lbXB0eSgpKSB7CisgICAgLy8gU2NhbiBmb3IgdGhlIG5leHQgc3Vic3RpdHV0aW9uLgorICAgIHN0ZDo6c2l6ZV90IEVuZCA9IEJvZHkuc2l6ZSgpLCBQb3MgPSAwOworICAgIGZvciAoOyBQb3MgIT0gRW5kOyArK1BvcykgeworICAgICAgLy8gQ2hlY2sgZm9yIGEgc3Vic3RpdHV0aW9uIG9yIGVzY2FwZS4KKyAgICAgIGlmIChCb2R5W1Bvc10gIT0gJyQnIHx8IFBvcyArIDEgPT0gRW5kKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgY2hhciBOZXh0ID0gQm9keVtQb3MgKyAxXTsKKyAgICAgIGlmIChOZXh0ID09ICckJyB8fCBOZXh0ID09ICduJyB8fCBpc2RpZ2l0KE5leHQpKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBBZGQgdGhlIHByZWZpeC4KKyAgICBPUyA8PCBCb2R5LnNsaWNlKDAsIFBvcyk7CisKKyAgICAvLyBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQuCisgICAgaWYgKFBvcyA9PSBFbmQpCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoQm9keVtQb3MrMV0pIHsKKyAgICAgICAvLyAkJCA9PiAkCisgICAgY2FzZSAnJCc6CisgICAgICBPUyA8PCAnJCc7CisgICAgICBicmVhazsKKworICAgICAgLy8gJG4gPT4gbnVtYmVyIG9mIGFyZ3VtZW50cworICAgIGNhc2UgJ24nOgorICAgICAgT1MgPDwgQS5zaXplKCk7CisgICAgICBicmVhazsKKworICAgICAgIC8vICRbMC05XSA9PiBhcmd1bWVudAorICAgIGRlZmF1bHQ6IHsKKyAgICAgIC8vIE1pc3NpbmcgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgorICAgICAgdW5zaWduZWQgSW5kZXggPSBCb2R5W1BvcysxXSAtICcwJzsKKyAgICAgIGlmIChJbmRleCA+PSBBLnNpemUoKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8vIE90aGVyd2lzZSBzdWJzdGl0dXRlIHdpdGggdGhlIHRva2VuIHZhbHVlcywgd2l0aCBzcGFjZXMgZWxpbWluYXRlZC4KKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8QXNtVG9rZW4+Ojpjb25zdF9pdGVyYXRvciBpdCA9IEFbSW5kZXhdLmJlZ2luKCksCisgICAgICAgICAgICAgaWUgPSBBW0luZGV4XS5lbmQoKTsgaXQgIT0gaWU7ICsraXQpCisgICAgICAgIE9TIDw8IGl0LT5nZXRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIHNjYW4gcG9pbnQuCisgICAgQm9keSA9IEJvZHkuc3Vic3RyKFBvcyArIDIpOworICB9CisKKyAgLy8gV2UgaW5jbHVkZSB0aGUgLmVuZG1hY3JvIGluIHRoZSBidWZmZXIgYXMgb3VyIHF1ZXVlIHRvIGV4aXQgdGhlIG1hY3JvCisgIC8vIGluc3RhbnRpYXRpb24uCisgIE9TIDw8ICIuZW5kbWFjcm9cbiI7CisKKyAgSW5zdGFudGlhdGlvbiA9IE1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyQ29weShPUy5zdHIoKSwgIjxpbnN0YW50aWF0aW9uPiIpOworfQorCitib29sIEFzbVBhcnNlcjo6SGFuZGxlTWFjcm9FbnRyeShTdHJpbmdSZWYgTmFtZSwgU01Mb2MgTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvICpNKSB7CisgIC8vIEFyYml0cmFyaWx5IGxpbWl0IG1hY3JvIG5lc3RpbmcgZGVwdGgsIHRvIG1hdGNoICdhcycuIFdlIGNhbiBlbGltaW5hdGUKKyAgLy8gdGhpcywgYWx0aG91Z2ggd2Ugc2hvdWxkIHByb3RlY3QgYWdhaW5zdCBpbmZpbml0ZSBsb29wcy4KKyAgaWYgKEFjdGl2ZU1hY3Jvcy5zaXplKCkgPT0gMjApCisgICAgcmV0dXJuIFRva0Vycm9yKCJtYWNyb3MgY2Fubm90IGJlIG5lc3RlZCBtb3JlIHRoYW4gMjAgbGV2ZWxzIGRlZXAiKTsKKworICAvLyBQYXJzZSB0aGUgbWFjcm8gaW5zdGFudGlhdGlvbiBhcmd1bWVudHMuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEFzbVRva2VuPiA+IE1hY3JvQXJndW1lbnRzOworICBNYWNyb0FyZ3VtZW50cy5wdXNoX2JhY2soc3RkOjp2ZWN0b3I8QXNtVG9rZW4+KCkpOworICB1bnNpZ25lZCBQYXJlbkxldmVsID0gMDsKKyAgZm9yICg7OykgeworICAgIGlmIChMZXhlci5pcyhBc21Ub2tlbjo6RW9mKSkKKyAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiBtYWNybyBpbnN0YW50aWF0aW9uIik7CisgICAgaWYgKExleGVyLmlzKEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgICBicmVhazsKKworICAgIC8vIElmIHdlIGFyZW4ndCBpbnNpZGUgcGFyZW50aGVzZXMgYW5kIHRoaXMgaXMgYSBjb21tYSwgc3RhcnQgYSBuZXcgdG9rZW4KKyAgICAvLyBsaXN0LgorICAgIGlmIChQYXJlbkxldmVsID09IDAgJiYgTGV4ZXIuaXMoQXNtVG9rZW46OkNvbW1hKSkgeworICAgICAgTWFjcm9Bcmd1bWVudHMucHVzaF9iYWNrKHN0ZDo6dmVjdG9yPEFzbVRva2VuPigpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQWRqdXN0IHRoZSBjdXJyZW50IHBhcmVudGhlc2VzIGxldmVsLgorICAgICAgaWYgKExleGVyLmlzKEFzbVRva2VuOjpMUGFyZW4pKQorICAgICAgICArK1BhcmVuTGV2ZWw7CisgICAgICBlbHNlIGlmIChMZXhlci5pcyhBc21Ub2tlbjo6UlBhcmVuKSAmJiBQYXJlbkxldmVsKQorICAgICAgICAtLVBhcmVuTGV2ZWw7CisKKyAgICAgIC8vIEFwcGVuZCB0aGUgdG9rZW4gdG8gdGhlIGN1cnJlbnQgYXJndW1lbnQgbGlzdC4KKyAgICAgIE1hY3JvQXJndW1lbnRzLmJhY2soKS5wdXNoX2JhY2soZ2V0VG9rKCkpOworICAgIH0KKyAgICBMZXgoKTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgbWFjcm8gaW5zdGFudGlhdGlvbiBvYmplY3QgYW5kIGFkZCB0byB0aGUgY3VycmVudCBtYWNybworICAvLyBpbnN0YW50aWF0aW9uIHN0YWNrLgorICBNYWNyb0luc3RhbnRpYXRpb24gKk1JID0gbmV3IE1hY3JvSW5zdGFudGlhdGlvbihNLCBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUb2soKS5nZXRMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9Bcmd1bWVudHMpOworICBBY3RpdmVNYWNyb3MucHVzaF9iYWNrKE1JKTsKKworICAvLyBKdW1wIHRvIHRoZSBtYWNybyBpbnN0YW50aWF0aW9uIGFuZCBwcmltZSB0aGUgbGV4ZXIuCisgIEN1ckJ1ZmZlciA9IFNyY01nci5BZGROZXdTb3VyY2VCdWZmZXIoTUktPkluc3RhbnRpYXRpb24sIFNNTG9jKCkpOworICBMZXhlci5zZXRCdWZmZXIoU3JjTWdyLmdldE1lbW9yeUJ1ZmZlcihDdXJCdWZmZXIpKTsKKyAgTGV4KCk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFzbVBhcnNlcjo6SGFuZGxlTWFjcm9FeGl0KCkgeworICAvLyBKdW1wIHRvIHRoZSBFbmRPZlN0YXRlbWVudCB3ZSBzaG91bGQgcmV0dXJuIHRvLCBhbmQgY29uc3VtZSBpdC4KKyAgSnVtcFRvTG9jKEFjdGl2ZU1hY3Jvcy5iYWNrKCktPkV4aXRMb2MpOworICBMZXgoKTsKKworICAvLyBQb3AgdGhlIGluc3RhbnRpYXRpb24gZW50cnkuCisgIGRlbGV0ZSBBY3RpdmVNYWNyb3MuYmFjaygpOworICBBY3RpdmVNYWNyb3MucG9wX2JhY2soKTsKK30KKworYm9vbCBBc21QYXJzZXI6OlBhcnNlQXNzaWdubWVudChTdHJpbmdSZWYgTmFtZSkgeworICAvLyBGSVhNRTogVXNlIGJldHRlciBsb2NhdGlvbiwgd2Ugc2hvdWxkIHVzZSBwcm9wZXIgdG9rZW5zLgorICBTTUxvYyBFcXVhbExvYyA9IExleGVyLmdldExvYygpOworCisgIGNvbnN0IE1DRXhwciAqVmFsdWU7CisgIGlmIChQYXJzZUV4cHJlc3Npb24oVmFsdWUpKQorICAgIHJldHVybiB0cnVlOworICAKKyAgaWYgKExleGVyLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluIGFzc2lnbm1lbnQiKTsKKworICAvLyBFYXQgdGhlIGVuZCBvZiBzdGF0ZW1lbnQgbWFya2VyLgorICBMZXgoKTsKKworICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBMSFMgaXMgYWxsb3dlZCB0byBiZSBhIHZhcmlhYmxlIChlaXRoZXIgaXQgaGFzIG5vdCBiZWVuCisgIC8vIHVzZWQgYXMgYSBzeW1ib2wsIG9yIGl0IGlzIGFuIGFic29sdXRlIHN5bWJvbCkuCisgIE1DU3ltYm9sICpTeW0gPSBnZXRDb250ZXh0KCkuTG9va3VwU3ltYm9sKE5hbWUpOworICBpZiAoU3ltKSB7CisgICAgLy8gRGlhZ25vc2UgYXNzaWdubWVudCB0byBhIGxhYmVsLgorICAgIC8vCisgICAgLy8gRklYTUU6IERpYWdub3N0aWNzLiBOb3RlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVmaW5pdGlvbiBhcyBhIGxhYmVsLgorICAgIC8vIEZJWE1FOiBEaWFnbm9zZSBhc3NpZ25tZW50IHRvIHByb3RlY3RlZCBpZGVudGlmaWVyIChlLmcuLCByZWdpc3RlciBuYW1lKS4KKyAgICBpZiAoU3ltLT5pc1VuZGVmaW5lZCgpICYmICFTeW0tPmlzVXNlZEluRXhwcigpKQorICAgICAgOyAvLyBBbGxvdyByZWRlZmluaXRpb25zIG9mIHVuZGVmaW5lZCBzeW1ib2xzIG9ubHkgdXNlZCBpbiBkaXJlY3RpdmVzLgorICAgIGVsc2UgaWYgKCFTeW0tPmlzVW5kZWZpbmVkKCkgJiYgIVN5bS0+aXNBYnNvbHV0ZSgpKQorICAgICAgcmV0dXJuIEVycm9yKEVxdWFsTG9jLCAicmVkZWZpbml0aW9uIG9mICciICsgTmFtZSArICInIik7CisgICAgZWxzZSBpZiAoIVN5bS0+aXNWYXJpYWJsZSgpKQorICAgICAgcmV0dXJuIEVycm9yKEVxdWFsTG9jLCAiaW52YWxpZCBhc3NpZ25tZW50IHRvICciICsgTmFtZSArICInIik7CisgICAgZWxzZSBpZiAoIWlzYTxNQ0NvbnN0YW50RXhwcj4oU3ltLT5nZXRWYXJpYWJsZVZhbHVlKCkpKQorICAgICAgcmV0dXJuIEVycm9yKEVxdWFsTG9jLCAiaW52YWxpZCByZWFzc2lnbm1lbnQgb2Ygbm9uLWFic29sdXRlIHZhcmlhYmxlICciICsKKyAgICAgICAgICAgICAgICAgICBOYW1lICsgIiciKTsKKyAgfSBlbHNlCisgICAgU3ltID0gZ2V0Q29udGV4dCgpLkdldE9yQ3JlYXRlU3ltYm9sKE5hbWUpOworCisgIC8vIEZJWE1FOiBIYW5kbGUgJy4nLgorCisgIFN5bS0+c2V0VXNlZEluRXhwcih0cnVlKTsKKworICAvLyBEbyB0aGUgYXNzaWdubWVudC4KKyAgT3V0LkVtaXRBc3NpZ25tZW50KFN5bSwgVmFsdWUpOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlSWRlbnRpZmllcjoKKy8vLyAgIDo6PSBpZGVudGlmaWVyCisvLy8gICA6Oj0gc3RyaW5nCitib29sIEFzbVBhcnNlcjo6UGFyc2VJZGVudGlmaWVyKFN0cmluZ1JlZiAmUmVzKSB7CisgIGlmIChMZXhlci5pc05vdChBc21Ub2tlbjo6SWRlbnRpZmllcikgJiYKKyAgICAgIExleGVyLmlzTm90KEFzbVRva2VuOjpTdHJpbmcpKQorICAgIHJldHVybiB0cnVlOworCisgIFJlcyA9IGdldFRvaygpLmdldElkZW50aWZpZXIoKTsKKworICBMZXgoKTsgLy8gQ29uc3VtZSB0aGUgaWRlbnRpZmllciB0b2tlbi4KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZURpcmVjdGl2ZVNldDoKKy8vLyAgIDo6PSAuc2V0IGlkZW50aWZpZXIgJywnIGV4cHJlc3Npb24KK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZVNldCgpIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgaWYgKFBhcnNlSWRlbnRpZmllcihOYW1lKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIGlkZW50aWZpZXIgYWZ0ZXIgJy5zZXQnIGRpcmVjdGl2ZSIpOworICAKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkNvbW1hKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5zZXQnIik7CisgIExleCgpOworCisgIHJldHVybiBQYXJzZUFzc2lnbm1lbnQoTmFtZSk7Cit9CisKK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZUVzY2FwZWRTdHJpbmcoc3RkOjpzdHJpbmcgJkRhdGEpIHsKKyAgYXNzZXJ0KGdldExleGVyKCkuaXMoQXNtVG9rZW46OlN0cmluZykgJiYgIlVuZXhwZWN0ZWQgY3VycmVudCB0b2tlbiEiKTsKKworICBEYXRhID0gIiI7CisgIFN0cmluZ1JlZiBTdHIgPSBnZXRUb2soKS5nZXRTdHJpbmdDb250ZW50cygpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3RyLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoU3RyW2ldICE9ICdcXCcpIHsKKyAgICAgIERhdGEgKz0gU3RyW2ldOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gUmVjb2duaXplIGVzY2FwZWQgY2hhcmFjdGVycy4gTm90ZSB0aGF0IHRoaXMgZXNjYXBlIHNlbWFudGljcyBjdXJyZW50bHkKKyAgICAvLyBsb29zZWx5IGZvbGxvd3MgRGFyd2luICdhcycuIE5vdGFibHksIGl0IGRvZXNuJ3Qgc3VwcG9ydCBoZXggZXNjYXBlcy4KKyAgICArK2k7CisgICAgaWYgKGkgPT0gZSkKKyAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCBiYWNrc2xhc2ggYXQgZW5kIG9mIHN0cmluZyIpOworCisgICAgLy8gUmVjb2duaXplIG9jdGFsIHNlcXVlbmNlcy4KKyAgICBpZiAoKHVuc2lnbmVkKSAoU3RyW2ldIC0gJzAnKSA8PSA3KSB7CisgICAgICAvLyBDb25zdW1lIHVwIHRvIHRocmVlIG9jdGFsIGNoYXJhY3RlcnMuCisgICAgICB1bnNpZ25lZCBWYWx1ZSA9IFN0cltpXSAtICcwJzsKKworICAgICAgaWYgKGkgKyAxICE9IGUgJiYgKCh1bnNpZ25lZCkgKFN0cltpICsgMV0gLSAnMCcpKSA8PSA3KSB7CisgICAgICAgICsraTsKKyAgICAgICAgVmFsdWUgPSBWYWx1ZSAqIDggKyAoU3RyW2ldIC0gJzAnKTsKKworICAgICAgICBpZiAoaSArIDEgIT0gZSAmJiAoKHVuc2lnbmVkKSAoU3RyW2kgKyAxXSAtICcwJykpIDw9IDcpIHsKKyAgICAgICAgICArK2k7CisgICAgICAgICAgVmFsdWUgPSBWYWx1ZSAqIDggKyAoU3RyW2ldIC0gJzAnKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoVmFsdWUgPiAyNTUpCisgICAgICAgIHJldHVybiBUb2tFcnJvcigiaW52YWxpZCBvY3RhbCBlc2NhcGUgc2VxdWVuY2UgKG91dCBvZiByYW5nZSkiKTsKKworICAgICAgRGF0YSArPSAodW5zaWduZWQgY2hhcikgVmFsdWU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UgcmVjb2duaXplIGluZGl2aWR1YWwgZXNjYXBlcy4KKyAgICBzd2l0Y2ggKFN0cltpXSkgeworICAgIGRlZmF1bHQ6CisgICAgICAvLyBKdXN0IHJlamVjdCBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIG5vdy4KKyAgICAgIHJldHVybiBUb2tFcnJvcigiaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgKHVucmVjb2duaXplZCBjaGFyYWN0ZXIpIik7CisKKyAgICBjYXNlICdiJzogRGF0YSArPSAnXGInOyBicmVhazsKKyAgICBjYXNlICdmJzogRGF0YSArPSAnXGYnOyBicmVhazsKKyAgICBjYXNlICduJzogRGF0YSArPSAnXG4nOyBicmVhazsKKyAgICBjYXNlICdyJzogRGF0YSArPSAnXHInOyBicmVhazsKKyAgICBjYXNlICd0JzogRGF0YSArPSAnXHQnOyBicmVhazsKKyAgICBjYXNlICciJzogRGF0YSArPSAnIic7IGJyZWFrOworICAgIGNhc2UgJ1xcJzogRGF0YSArPSAnXFwnOyBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZURpcmVjdGl2ZUFzY2lpOgorLy8vICAgOjo9ICggLmFzY2lpIHwgLmFzY2l6ICkgWyAic3RyaW5nIiAoICwgInN0cmluZyIgKSogXQorYm9vbCBBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlQXNjaWkoYm9vbCBaZXJvVGVybWluYXRlZCkgeworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKSB7CisgICAgZm9yICg7OykgeworICAgICAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OlN0cmluZykpCisgICAgICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgc3RyaW5nIGluICcuYXNjaWknIG9yICcuYXNjaXonIGRpcmVjdGl2ZSIpOworCisgICAgICBzdGQ6OnN0cmluZyBEYXRhOworICAgICAgaWYgKFBhcnNlRXNjYXBlZFN0cmluZyhEYXRhKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGdldFN0cmVhbWVyKCkuRW1pdEJ5dGVzKERhdGEsIERFRkFVTFRfQUREUlNQQUNFKTsKKyAgICAgIGlmIChaZXJvVGVybWluYXRlZCkKKyAgICAgICAgZ2V0U3RyZWFtZXIoKS5FbWl0Qnl0ZXMoU3RyaW5nUmVmKCJcMCIsIDEpLCBERUZBVUxUX0FERFJTUEFDRSk7CisKKyAgICAgIExleCgpOworCisgICAgICBpZiAoZ2V0TGV4ZXIoKS5pcyhBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgICAgICBicmVhazsKKworICAgICAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkNvbW1hKSkKKyAgICAgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluICcuYXNjaWknIG9yICcuYXNjaXonIGRpcmVjdGl2ZSIpOworICAgICAgTGV4KCk7CisgICAgfQorICB9CisKKyAgTGV4KCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlVmFsdWUKKy8vLyAgOjo9ICguYnl0ZSB8IC5zaG9ydCB8IC4uLiApIFsgZXhwcmVzc2lvbiAoLCBleHByZXNzaW9uKSogXQorYm9vbCBBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlVmFsdWUodW5zaWduZWQgU2l6ZSkgeworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKSB7CisgICAgZm9yICg7OykgeworICAgICAgY29uc3QgTUNFeHByICpWYWx1ZTsKKyAgICAgIFNNTG9jIEFUVFJJQlVURV9VTlVTRUQgU3RhcnRMb2MgPSBnZXRMZXhlcigpLmdldExvYygpOworICAgICAgaWYgKFBhcnNlRXhwcmVzc2lvbihWYWx1ZSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAvLyBTcGVjaWFsIGNhc2UgY29uc3RhbnQgZXhwcmVzc2lvbnMgdG8gbWF0Y2ggY29kZSBnZW5lcmF0b3IuCisgICAgICBpZiAoY29uc3QgTUNDb25zdGFudEV4cHIgKk1DRSA9IGR5bl9jYXN0PE1DQ29uc3RhbnRFeHByPihWYWx1ZSkpCisgICAgICAgIGdldFN0cmVhbWVyKCkuRW1pdEludFZhbHVlKE1DRS0+Z2V0VmFsdWUoKSwgU2l6ZSwgREVGQVVMVF9BRERSU1BBQ0UpOworICAgICAgZWxzZQorICAgICAgICBnZXRTdHJlYW1lcigpLkVtaXRWYWx1ZShWYWx1ZSwgU2l6ZSwgREVGQVVMVF9BRERSU1BBQ0UpOworCisgICAgICBpZiAoZ2V0TGV4ZXIoKS5pcyhBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgLy8gRklYTUU6IEltcHJvdmUgZGlhZ25vc3RpYy4KKyAgICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpDb21tYSkpCisgICAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiBkaXJlY3RpdmUiKTsKKyAgICAgIExleCgpOworICAgIH0KKyAgfQorCisgIExleCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZURpcmVjdGl2ZVNwYWNlCisvLy8gIDo6PSAuc3BhY2UgZXhwcmVzc2lvbiBbICwgZXhwcmVzc2lvbiBdCitib29sIEFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVTcGFjZSgpIHsKKyAgaW50NjRfdCBOdW1CeXRlczsKKyAgaWYgKFBhcnNlQWJzb2x1dGVFeHByZXNzaW9uKE51bUJ5dGVzKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpbnQ2NF90IEZpbGxFeHByID0gMDsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkgeworICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpDb21tYSkpCisgICAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5zcGFjZScgZGlyZWN0aXZlIik7CisgICAgTGV4KCk7CisgICAgCisgICAgaWYgKFBhcnNlQWJzb2x1dGVFeHByZXNzaW9uKEZpbGxFeHByKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiAnLnNwYWNlJyBkaXJlY3RpdmUiKTsKKyAgfQorCisgIExleCgpOworCisgIGlmIChOdW1CeXRlcyA8PSAwKQorICAgIHJldHVybiBUb2tFcnJvcigiaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgaW4gJy5zcGFjZScgZGlyZWN0aXZlIik7CisKKyAgLy8gRklYTUU6IFNvbWV0aW1lcyB0aGUgZmlsbCBleHByIGlzICdub3AnIGlmIGl0IGlzbid0IHN1cHBsaWVkLCBpbnN0ZWFkIG9mIDAuCisgIGdldFN0cmVhbWVyKCkuRW1pdEZpbGwoTnVtQnl0ZXMsIEZpbGxFeHByLCBERUZBVUxUX0FERFJTUEFDRSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVGaWxsCisvLy8gIDo6PSAuZmlsbCBleHByZXNzaW9uICwgZXhwcmVzc2lvbiAsIGV4cHJlc3Npb24KK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUZpbGwoKSB7CisgIGludDY0X3QgTnVtVmFsdWVzOworICBpZiAoUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oTnVtVmFsdWVzKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6Q29tbWEpKQorICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiAnLmZpbGwnIGRpcmVjdGl2ZSIpOworICBMZXgoKTsKKyAgCisgIGludDY0X3QgRmlsbFNpemU7CisgIGlmIChQYXJzZUFic29sdXRlRXhwcmVzc2lvbihGaWxsU2l6ZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkNvbW1hKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5maWxsJyBkaXJlY3RpdmUiKTsKKyAgTGV4KCk7CisgIAorICBpbnQ2NF90IEZpbGxFeHByOworICBpZiAoUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oRmlsbEV4cHIpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluICcuZmlsbCcgZGlyZWN0aXZlIik7CisgIAorICBMZXgoKTsKKworICBpZiAoRmlsbFNpemUgIT0gMSAmJiBGaWxsU2l6ZSAhPSAyICYmIEZpbGxTaXplICE9IDQgJiYgRmlsbFNpemUgIT0gOCkKKyAgICByZXR1cm4gVG9rRXJyb3IoImludmFsaWQgJy5maWxsJyBzaXplLCBleHBlY3RlZCAxLCAyLCA0LCBvciA4Iik7CisKKyAgZm9yICh1aW50NjRfdCBpID0gMCwgZSA9IE51bVZhbHVlczsgaSAhPSBlOyArK2kpCisgICAgZ2V0U3RyZWFtZXIoKS5FbWl0SW50VmFsdWUoRmlsbEV4cHIsIEZpbGxTaXplLCBERUZBVUxUX0FERFJTUEFDRSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVPcmcKKy8vLyAgOjo9IC5vcmcgZXhwcmVzc2lvbiBbICwgZXhwcmVzc2lvbiBdCitib29sIEFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVPcmcoKSB7CisgIGNvbnN0IE1DRXhwciAqT2Zmc2V0OworICBpZiAoUGFyc2VFeHByZXNzaW9uKE9mZnNldCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gUGFyc2Ugb3B0aW9uYWwgZmlsbCBleHByZXNzaW9uLgorICBpbnQ2NF90IEZpbGxFeHByID0gMDsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkgeworICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpDb21tYSkpCisgICAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5vcmcnIGRpcmVjdGl2ZSIpOworICAgIExleCgpOworICAgIAorICAgIGlmIChQYXJzZUFic29sdXRlRXhwcmVzc2lvbihGaWxsRXhwcikpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5vcmcnIGRpcmVjdGl2ZSIpOworICB9CisKKyAgTGV4KCk7CisKKyAgLy8gRklYTUU6IE9ubHkgbGltaXRlZCBmb3JtcyBvZiByZWxvY2F0YWJsZSBleHByZXNzaW9ucyBhcmUgYWNjZXB0ZWQgaGVyZSwgaXQKKyAgLy8gaGFzIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNlY3Rpb24uCisgIGdldFN0cmVhbWVyKCkuRW1pdFZhbHVlVG9PZmZzZXQoT2Zmc2V0LCBGaWxsRXhwcik7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVBbGlnbgorLy8vICA6Oj0gey5hbGlnbiwgLi4ufSBleHByZXNzaW9uIFsgLCBleHByZXNzaW9uIFsgLCBleHByZXNzaW9uIF1dCitib29sIEFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVBbGlnbihib29sIElzUG93MiwgdW5zaWduZWQgVmFsdWVTaXplKSB7CisgIFNNTG9jIEFsaWdubWVudExvYyA9IGdldExleGVyKCkuZ2V0TG9jKCk7CisgIGludDY0X3QgQWxpZ25tZW50OworICBpZiAoUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oQWxpZ25tZW50KSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBTTUxvYyBNYXhCeXRlc0xvYzsKKyAgYm9vbCBIYXNGaWxsRXhwciA9IGZhbHNlOworICBpbnQ2NF90IEZpbGxFeHByID0gMDsKKyAgaW50NjRfdCBNYXhCeXRlc1RvRmlsbCA9IDA7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpIHsKKyAgICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6Q29tbWEpKQorICAgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluIGRpcmVjdGl2ZSIpOworICAgIExleCgpOworCisgICAgLy8gVGhlIGZpbGwgZXhwcmVzc2lvbiBjYW4gYmUgb21pdHRlZCB3aGlsZSBzcGVjaWZ5aW5nIGEgbWF4aW11bSBudW1iZXIgb2YKKyAgICAvLyBhbGlnbm1lbnQgYnl0ZXMsIGUuZzoKKyAgICAvLyAgLmFsaWduIDMsLDQKKyAgICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6Q29tbWEpKSB7CisgICAgICBIYXNGaWxsRXhwciA9IHRydWU7CisgICAgICBpZiAoUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oRmlsbEV4cHIpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKSB7CisgICAgICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6Q29tbWEpKQorICAgICAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gZGlyZWN0aXZlIik7CisgICAgICBMZXgoKTsKKworICAgICAgTWF4Qnl0ZXNMb2MgPSBnZXRMZXhlcigpLmdldExvYygpOworICAgICAgaWYgKFBhcnNlQWJzb2x1dGVFeHByZXNzaW9uKE1heEJ5dGVzVG9GaWxsKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAKKyAgICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiBkaXJlY3RpdmUiKTsKKyAgICB9CisgIH0KKworICBMZXgoKTsKKworICBpZiAoIUhhc0ZpbGxFeHByKQorICAgIEZpbGxFeHByID0gMDsKKworICAvLyBDb21wdXRlIGFsaWdubWVudCBpbiBieXRlcy4KKyAgaWYgKElzUG93MikgeworICAgIC8vIEZJWE1FOiBEaWFnbm9zZSBvdmVyZmxvdy4KKyAgICBpZiAoQWxpZ25tZW50ID49IDMyKSB7CisgICAgICBFcnJvcihBbGlnbm1lbnRMb2MsICJpbnZhbGlkIGFsaWdubWVudCB2YWx1ZSIpOworICAgICAgQWxpZ25tZW50ID0gMzE7CisgICAgfQorCisgICAgQWxpZ25tZW50ID0gMVVMTCA8PCBBbGlnbm1lbnQ7CisgIH0KKworICAvLyBEaWFnbm9zZSBub24tc2Vuc2ljYWwgbWF4IGJ5dGVzIHRvIGFsaWduLgorICBpZiAoTWF4Qnl0ZXNMb2MuaXNWYWxpZCgpKSB7CisgICAgaWYgKE1heEJ5dGVzVG9GaWxsIDwgMSkgeworICAgICAgRXJyb3IoTWF4Qnl0ZXNMb2MsICJhbGlnbm1lbnQgZGlyZWN0aXZlIGNhbiBuZXZlciBiZSBzYXRpc2ZpZWQgaW4gdGhpcyAiCisgICAgICAgICAgICAibWFueSBieXRlcywgaWdub3JpbmcgbWF4aW11bSBieXRlcyBleHByZXNzaW9uIik7CisgICAgICBNYXhCeXRlc1RvRmlsbCA9IDA7CisgICAgfQorCisgICAgaWYgKE1heEJ5dGVzVG9GaWxsID49IEFsaWdubWVudCkgeworICAgICAgV2FybmluZyhNYXhCeXRlc0xvYywgIm1heGltdW0gYnl0ZXMgZXhwcmVzc2lvbiBleGNlZWRzIGFsaWdubWVudCBhbmQgIgorICAgICAgICAgICAgICAiaGFzIG5vIGVmZmVjdCIpOworICAgICAgTWF4Qnl0ZXNUb0ZpbGwgPSAwOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBvcHRpbWFsIGNvZGUgYWxpZ25tZW50IGZvciB0aGlzIC5hbGlnbgorICAvLyBkaXJlY3RpdmUuCisgIC8vCisgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSB1c2luZyBhIHRhcmdldCBob29rLgorICBib29sIFVzZUNvZGVBbGlnbiA9IGZhbHNlOworICBpZiAoY29uc3QgTUNTZWN0aW9uTWFjaE8gKlMgPSBkeW5fY2FzdDxNQ1NlY3Rpb25NYWNoTz4oCisgICAgICAgIGdldFN0cmVhbWVyKCkuZ2V0Q3VycmVudFNlY3Rpb24oKSkpCisgICAgVXNlQ29kZUFsaWduID0gUy0+aGFzQXR0cmlidXRlKE1DU2VjdGlvbk1hY2hPOjpTX0FUVFJfUFVSRV9JTlNUUlVDVElPTlMpOworICBpZiAoKCFIYXNGaWxsRXhwciB8fCBMZXhlci5nZXRNQUkoKS5nZXRUZXh0QWxpZ25GaWxsVmFsdWUoKSA9PSBGaWxsRXhwcikgJiYKKyAgICAgIFZhbHVlU2l6ZSA9PSAxICYmIFVzZUNvZGVBbGlnbikgeworICAgIGdldFN0cmVhbWVyKCkuRW1pdENvZGVBbGlnbm1lbnQoQWxpZ25tZW50LCBNYXhCeXRlc1RvRmlsbCk7CisgIH0gZWxzZSB7CisgICAgLy8gRklYTUU6IFRhcmdldCBzcGVjaWZpYyBiZWhhdmlvciBhYm91dCBob3cgdGhlICJleHRyYSIgYnl0ZXMgYXJlIGZpbGxlZC4KKyAgICBnZXRTdHJlYW1lcigpLkVtaXRWYWx1ZVRvQWxpZ25tZW50KEFsaWdubWVudCwgRmlsbEV4cHIsIFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJ5dGVzVG9GaWxsKTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlU3ltYm9sQXR0cmlidXRlCisvLy8gIDo6PSB7ICIuZ2xvYmwiLCAiLndlYWsiLCAuLi4gfSBbIGlkZW50aWZpZXIgKCAsIGlkZW50aWZpZXIgKSogXQorYm9vbCBBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlU3ltYm9sQXR0cmlidXRlKE1DU3ltYm9sQXR0ciBBdHRyKSB7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICBTdHJpbmdSZWYgTmFtZTsKKworICAgICAgaWYgKFBhcnNlSWRlbnRpZmllcihOYW1lKSkKKyAgICAgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBpZGVudGlmaWVyIGluIGRpcmVjdGl2ZSIpOworICAgICAgCisgICAgICBNQ1N5bWJvbCAqU3ltID0gZ2V0Q29udGV4dCgpLkdldE9yQ3JlYXRlU3ltYm9sKE5hbWUpOworCisgICAgICBnZXRTdHJlYW1lcigpLkVtaXRTeW1ib2xBdHRyaWJ1dGUoU3ltLCBBdHRyKTsKKworICAgICAgaWYgKGdldExleGVyKCkuaXMoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpDb21tYSkpCisgICAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiBkaXJlY3RpdmUiKTsKKyAgICAgIExleCgpOworICAgIH0KKyAgfQorCisgIExleCgpOworICByZXR1cm4gZmFsc2U7ICAKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlRUxGVHlwZQorLy8vICA6Oj0gLnR5cGUgaWRlbnRpZmllciAsIEBhdHRyaWJ1dGUKK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUVMRlR5cGUoKSB7CisgIFN0cmluZ1JlZiBOYW1lOworICBpZiAoUGFyc2VJZGVudGlmaWVyKE5hbWUpKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgaWRlbnRpZmllciBpbiBkaXJlY3RpdmUiKTsKKworICAvLyBIYW5kbGUgdGhlIGlkZW50aWZpZXIgYXMgdGhlIGtleSBzeW1ib2wuCisgIE1DU3ltYm9sICpTeW0gPSBnZXRDb250ZXh0KCkuR2V0T3JDcmVhdGVTeW1ib2woTmFtZSk7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkNvbW1hKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy50eXBlJyBkaXJlY3RpdmUiKTsKKyAgTGV4KCk7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkF0KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkICdAJyBiZWZvcmUgdHlwZSIpOworICBMZXgoKTsKKworICBTdHJpbmdSZWYgVHlwZTsKKyAgU01Mb2MgVHlwZUxvYzsKKworICBUeXBlTG9jID0gZ2V0TGV4ZXIoKS5nZXRMb2MoKTsKKyAgaWYgKFBhcnNlSWRlbnRpZmllcihUeXBlKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIHN5bWJvbCB0eXBlIGluIGRpcmVjdGl2ZSIpOworCisgIE1DU3ltYm9sQXR0ciBBdHRyID0gU3RyaW5nU3dpdGNoPE1DU3ltYm9sQXR0cj4oVHlwZSkKKyAgICAuQ2FzZSgiZnVuY3Rpb24iLCBNQ1NBX0VMRl9UeXBlRnVuY3Rpb24pCisgICAgLkNhc2UoIm9iamVjdCIsIE1DU0FfRUxGX1R5cGVPYmplY3QpCisgICAgLkNhc2UoInRsc19vYmplY3QiLCBNQ1NBX0VMRl9UeXBlVExTKQorICAgIC5DYXNlKCJjb21tb24iLCBNQ1NBX0VMRl9UeXBlQ29tbW9uKQorICAgIC5DYXNlKCJub3R5cGUiLCBNQ1NBX0VMRl9UeXBlTm9UeXBlKQorICAgIC5EZWZhdWx0KE1DU0FfSW52YWxpZCk7CisKKyAgaWYgKEF0dHIgPT0gTUNTQV9JbnZhbGlkKQorICAgIHJldHVybiBFcnJvcihUeXBlTG9jLCAidW5zdXBwb3J0ZWQgYXR0cmlidXRlIGluICcudHlwZScgZGlyZWN0aXZlIik7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy50eXBlJyBkaXJlY3RpdmUiKTsKKworICBMZXgoKTsKKworICBnZXRTdHJlYW1lcigpLkVtaXRTeW1ib2xBdHRyaWJ1dGUoU3ltLCBBdHRyKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZURpcmVjdGl2ZUNvbW0KKy8vLyAgOjo9ICggLmNvbW0gfCAubGNvbW0gKSBpZGVudGlmaWVyICwgc2l6ZV9leHByZXNzaW9uIFsgLCBhbGlnbl9leHByZXNzaW9uIF0KK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUNvbW0oYm9vbCBJc0xvY2FsKSB7CisgIFNNTG9jIElETG9jID0gZ2V0TGV4ZXIoKS5nZXRMb2MoKTsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIGlmIChQYXJzZUlkZW50aWZpZXIoTmFtZSkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBpZGVudGlmaWVyIGluIGRpcmVjdGl2ZSIpOworICAKKyAgLy8gSGFuZGxlIHRoZSBpZGVudGlmaWVyIGFzIHRoZSBrZXkgc3ltYm9sLgorICBNQ1N5bWJvbCAqU3ltID0gZ2V0Q29udGV4dCgpLkdldE9yQ3JlYXRlU3ltYm9sKE5hbWUpOworCisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpDb21tYSkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluIGRpcmVjdGl2ZSIpOworICBMZXgoKTsKKworICBpbnQ2NF90IFNpemU7CisgIFNNTG9jIFNpemVMb2MgPSBnZXRMZXhlcigpLmdldExvYygpOworICBpZiAoUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oU2l6ZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW50NjRfdCBQb3cyQWxpZ25tZW50ID0gMDsKKyAgU01Mb2MgUG93MkFsaWdubWVudExvYzsKKyAgaWYgKGdldExleGVyKCkuaXMoQXNtVG9rZW46OkNvbW1hKSkgeworICAgIExleCgpOworICAgIFBvdzJBbGlnbm1lbnRMb2MgPSBnZXRMZXhlcigpLmdldExvYygpOworICAgIGlmIChQYXJzZUFic29sdXRlRXhwcmVzc2lvbihQb3cyQWxpZ25tZW50KSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIC8vIElmIHRoaXMgdGFyZ2V0IHRha2VzIGFsaWdubWVudHMgaW4gYnl0ZXMgKG5vdCBsb2cpIHZhbGlkYXRlIGFuZCBjb252ZXJ0LgorICAgIGlmIChMZXhlci5nZXRNQUkoKS5nZXRBbGlnbm1lbnRJc0luQnl0ZXMoKSkgeworICAgICAgaWYgKCFpc1Bvd2VyT2YyXzY0KFBvdzJBbGlnbm1lbnQpKQorICAgICAgICByZXR1cm4gRXJyb3IoUG93MkFsaWdubWVudExvYywgImFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgMiIpOworICAgICAgUG93MkFsaWdubWVudCA9IExvZzJfNjQoUG93MkFsaWdubWVudCk7CisgICAgfQorICB9CisgIAorICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiAnLmNvbW0nIG9yICcubGNvbW0nIGRpcmVjdGl2ZSIpOworICAKKyAgTGV4KCk7CisKKyAgLy8gTk9URTogYSBzaXplIG9mIHplcm8gZm9yIGEgLmNvbW0gc2hvdWxkIGNyZWF0ZSBhIHVuZGVmaW5lZCBzeW1ib2wKKyAgLy8gYnV0IGEgc2l6ZSBvZiAubGNvbW0gY3JlYXRlcyBhIGJzcyBzeW1ib2wgb2Ygc2l6ZSB6ZXJvLgorICBpZiAoU2l6ZSA8IDApCisgICAgcmV0dXJuIEVycm9yKFNpemVMb2MsICJpbnZhbGlkICcuY29tbScgb3IgJy5sY29tbScgZGlyZWN0aXZlIHNpemUsIGNhbid0ICIKKyAgICAgICAgICAgICAgICAgImJlIGxlc3MgdGhhbiB6ZXJvIik7CisKKyAgLy8gTk9URTogVGhlIGFsaWdubWVudCBpbiB0aGUgZGlyZWN0aXZlIGlzIGEgcG93ZXIgb2YgMiB2YWx1ZSwgdGhlIGFzc2VtYmxlcgorICAvLyBtYXkgaW50ZXJuYWxseSBlbmQgdXAgd2FudGluZyBhbiBhbGlnbm1lbnQgaW4gYnl0ZXMuCisgIC8vIEZJWE1FOiBEaWFnbm9zZSBvdmVyZmxvdy4KKyAgaWYgKFBvdzJBbGlnbm1lbnQgPCAwKQorICAgIHJldHVybiBFcnJvcihQb3cyQWxpZ25tZW50TG9jLCAiaW52YWxpZCAnLmNvbW0nIG9yICcubGNvbW0nIGRpcmVjdGl2ZSAiCisgICAgICAgICAgICAgICAgICJhbGlnbm1lbnQsIGNhbid0IGJlIGxlc3MgdGhhbiB6ZXJvIik7CisKKyAgaWYgKCFTeW0tPmlzVW5kZWZpbmVkKCkpCisgICAgcmV0dXJuIEVycm9yKElETG9jLCAiaW52YWxpZCBzeW1ib2wgcmVkZWZpbml0aW9uIik7CisKKyAgLy8gJy5sY29tbScgaXMgZXF1aXZhbGVudCB0byAnLnplcm9maWxsJy4KKyAgLy8gQ3JlYXRlIHRoZSBTeW1ib2wgYXMgYSBjb21tb24gb3IgbG9jYWwgY29tbW9uIHdpdGggU2l6ZSBhbmQgUG93MkFsaWdubWVudAorICBpZiAoSXNMb2NhbCkgeworICAgIGdldFN0cmVhbWVyKCkuRW1pdFplcm9maWxsKEN0eC5nZXRNYWNoT1NlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19EQVRBIiwgIl9fYnNzIiwgTUNTZWN0aW9uTWFjaE86OlNfWkVST0ZJTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTZWN0aW9uS2luZDo6Z2V0QlNTKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bSwgU2l6ZSwgMSA8PCBQb3cyQWxpZ25tZW50KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBnZXRTdHJlYW1lcigpLkVtaXRDb21tb25TeW1ib2woU3ltLCBTaXplLCAxIDw8IFBvdzJBbGlnbm1lbnQpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZURpcmVjdGl2ZUFib3J0CisvLy8gIDo6PSAuYWJvcnQgWy4uLiBtZXNzYWdlIC4uLl0KK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUFib3J0KCkgeworICAvLyBGSVhNRTogVXNlIGxvYyBmcm9tIGRpcmVjdGl2ZS4KKyAgU01Mb2MgTG9jID0gZ2V0TGV4ZXIoKS5nZXRMb2MoKTsKKworICBTdHJpbmdSZWYgU3RyID0gUGFyc2VTdHJpbmdUb0VuZE9mU3RhdGVtZW50KCk7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluICcuYWJvcnQnIGRpcmVjdGl2ZSIpOworCisgIExleCgpOworCisgIGlmIChTdHIuZW1wdHkoKSkKKyAgICBFcnJvcihMb2MsICIuYWJvcnQgZGV0ZWN0ZWQuIEFzc2VtYmx5IHN0b3BwaW5nLiIpOworICBlbHNlCisgICAgRXJyb3IoTG9jLCAiLmFib3J0ICciICsgU3RyICsgIicgZGV0ZWN0ZWQuIEFzc2VtYmx5IHN0b3BwaW5nLiIpOworICAvLyBGSVhNRTogQWN0dWFsbHkgYWJvcnQgYXNzZW1ibHkgaGVyZS4KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZURpcmVjdGl2ZUluY2x1ZGUKKy8vLyAgOjo9IC5pbmNsdWRlICJmaWxlbmFtZSIKK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUluY2x1ZGUoKSB7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpTdHJpbmcpKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgc3RyaW5nIGluICcuaW5jbHVkZScgZGlyZWN0aXZlIik7CisgIAorICBzdGQ6OnN0cmluZyBGaWxlbmFtZSA9IGdldFRvaygpLmdldFN0cmluZygpOworICBTTUxvYyBJbmNsdWRlTG9jID0gZ2V0TGV4ZXIoKS5nZXRMb2MoKTsKKyAgTGV4KCk7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5pbmNsdWRlJyBkaXJlY3RpdmUiKTsKKyAgCisgIC8vIFN0cmlwIHRoZSBxdW90ZXMuCisgIEZpbGVuYW1lID0gRmlsZW5hbWUuc3Vic3RyKDEsIEZpbGVuYW1lLnNpemUoKS0yKTsKKyAgCisgIC8vIEF0dGVtcHQgdG8gc3dpdGNoIHRoZSBsZXhlciB0byB0aGUgaW5jbHVkZWQgZmlsZSBiZWZvcmUgY29uc3VtaW5nIHRoZSBlbmQKKyAgLy8gb2Ygc3RhdGVtZW50IHRvIGF2b2lkIGxvc2luZyBpdCB3aGVuIHdlIHN3aXRjaC4KKyAgaWYgKEVudGVySW5jbHVkZUZpbGUoRmlsZW5hbWUpKSB7CisgICAgRXJyb3IoSW5jbHVkZUxvYywgIkNvdWxkIG5vdCBmaW5kIGluY2x1ZGUgZmlsZSAnIiArIEZpbGVuYW1lICsgIiciKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlSWYKKy8vLyA6Oj0gLmlmIGV4cHJlc3Npb24KK2Jvb2wgQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUlmKFNNTG9jIERpcmVjdGl2ZUxvYykgeworICBUaGVDb25kU3RhY2sucHVzaF9iYWNrKFRoZUNvbmRTdGF0ZSk7CisgIFRoZUNvbmRTdGF0ZS5UaGVDb25kID0gQXNtQ29uZDo6SWZDb25kOworICBpZihUaGVDb25kU3RhdGUuSWdub3JlKSB7CisgICAgRWF0VG9FbmRPZlN0YXRlbWVudCgpOworICB9CisgIGVsc2UgeworICAgIGludDY0X3QgRXhwclZhbHVlOworICAgIGlmIChQYXJzZUFic29sdXRlRXhwcmVzc2lvbihFeHByVmFsdWUpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluICcuaWYnIGRpcmVjdGl2ZSIpOworICAgIAorICAgIExleCgpOworCisgICAgVGhlQ29uZFN0YXRlLkNvbmRNZXQgPSBFeHByVmFsdWU7CisgICAgVGhlQ29uZFN0YXRlLklnbm9yZSA9ICFUaGVDb25kU3RhdGUuQ29uZE1ldDsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlRWxzZUlmCisvLy8gOjo9IC5lbHNlaWYgZXhwcmVzc2lvbgorYm9vbCBBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlRWxzZUlmKFNNTG9jIERpcmVjdGl2ZUxvYykgeworICBpZiAoVGhlQ29uZFN0YXRlLlRoZUNvbmQgIT0gQXNtQ29uZDo6SWZDb25kICYmCisgICAgICBUaGVDb25kU3RhdGUuVGhlQ29uZCAhPSBBc21Db25kOjpFbHNlSWZDb25kKQorICAgICAgRXJyb3IoRGlyZWN0aXZlTG9jLCAiRW5jb3VudGVyZWQgYSAuZWxzZWlmIHRoYXQgZG9lc24ndCBmb2xsb3cgYSAuaWYgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuIC5lbHNlaWYiKTsKKyAgVGhlQ29uZFN0YXRlLlRoZUNvbmQgPSBBc21Db25kOjpFbHNlSWZDb25kOworCisgIGJvb2wgTGFzdElnbm9yZVN0YXRlID0gZmFsc2U7CisgIGlmICghVGhlQ29uZFN0YWNrLmVtcHR5KCkpCisgICAgICBMYXN0SWdub3JlU3RhdGUgPSBUaGVDb25kU3RhY2suYmFjaygpLklnbm9yZTsKKyAgaWYgKExhc3RJZ25vcmVTdGF0ZSB8fCBUaGVDb25kU3RhdGUuQ29uZE1ldCkgeworICAgIFRoZUNvbmRTdGF0ZS5JZ25vcmUgPSB0cnVlOworICAgIEVhdFRvRW5kT2ZTdGF0ZW1lbnQoKTsKKyAgfQorICBlbHNlIHsKKyAgICBpbnQ2NF90IEV4cHJWYWx1ZTsKKyAgICBpZiAoUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oRXhwclZhbHVlKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiAnLmVsc2VpZicgZGlyZWN0aXZlIik7CisgICAgCisgICAgTGV4KCk7CisgICAgVGhlQ29uZFN0YXRlLkNvbmRNZXQgPSBFeHByVmFsdWU7CisgICAgVGhlQ29uZFN0YXRlLklnbm9yZSA9ICFUaGVDb25kU3RhdGUuQ29uZE1ldDsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlRWxzZQorLy8vIDo6PSAuZWxzZQorYm9vbCBBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlRWxzZShTTUxvYyBEaXJlY3RpdmVMb2MpIHsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5lbHNlJyBkaXJlY3RpdmUiKTsKKyAgCisgIExleCgpOworCisgIGlmIChUaGVDb25kU3RhdGUuVGhlQ29uZCAhPSBBc21Db25kOjpJZkNvbmQgJiYKKyAgICAgIFRoZUNvbmRTdGF0ZS5UaGVDb25kICE9IEFzbUNvbmQ6OkVsc2VJZkNvbmQpCisgICAgICBFcnJvcihEaXJlY3RpdmVMb2MsICJFbmNvdW50ZXJlZCBhIC5lbHNlIHRoYXQgZG9lc24ndCBmb2xsb3cgYSAuaWYgb3IgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiLmVsc2VpZiIpOworICBUaGVDb25kU3RhdGUuVGhlQ29uZCA9IEFzbUNvbmQ6OkVsc2VDb25kOworICBib29sIExhc3RJZ25vcmVTdGF0ZSA9IGZhbHNlOworICBpZiAoIVRoZUNvbmRTdGFjay5lbXB0eSgpKQorICAgIExhc3RJZ25vcmVTdGF0ZSA9IFRoZUNvbmRTdGFjay5iYWNrKCkuSWdub3JlOworICBpZiAoTGFzdElnbm9yZVN0YXRlIHx8IFRoZUNvbmRTdGF0ZS5Db25kTWV0KQorICAgIFRoZUNvbmRTdGF0ZS5JZ25vcmUgPSB0cnVlOworICBlbHNlCisgICAgVGhlQ29uZFN0YXRlLklnbm9yZSA9IGZhbHNlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlRW5kSWYKKy8vLyA6Oj0gLmVuZGlmCitib29sIEFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVFbmRJZihTTUxvYyBEaXJlY3RpdmVMb2MpIHsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5lbmRpZicgZGlyZWN0aXZlIik7CisgIAorICBMZXgoKTsKKworICBpZiAoKFRoZUNvbmRTdGF0ZS5UaGVDb25kID09IEFzbUNvbmQ6Ok5vQ29uZCkgfHwKKyAgICAgIFRoZUNvbmRTdGFjay5lbXB0eSgpKQorICAgIEVycm9yKERpcmVjdGl2ZUxvYywgIkVuY291bnRlcmVkIGEgLmVuZGlmIHRoYXQgZG9lc24ndCBmb2xsb3cgYSAuaWYgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgIi5lbHNlIik7CisgIGlmICghVGhlQ29uZFN0YWNrLmVtcHR5KCkpIHsKKyAgICBUaGVDb25kU3RhdGUgPSBUaGVDb25kU3RhY2suYmFjaygpOworICAgIFRoZUNvbmRTdGFjay5wb3BfYmFjaygpOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVGaWxlCisvLy8gOjo9IC5maWxlIFtudW1iZXJdIHN0cmluZworYm9vbCBHZW5lcmljQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUZpbGUoU3RyaW5nUmVmLCBTTUxvYyBEaXJlY3RpdmVMb2MpIHsKKyAgLy8gRklYTUU6IEknbSBub3Qgc3VyZSB3aGF0IHRoaXMgaXMuCisgIGludDY0X3QgRmlsZU51bWJlciA9IC0xOworICBTTUxvYyBGaWxlTnVtYmVyTG9jID0gZ2V0TGV4ZXIoKS5nZXRMb2MoKTsKKyAgaWYgKGdldExleGVyKCkuaXMoQXNtVG9rZW46OkludGVnZXIpKSB7CisgICAgRmlsZU51bWJlciA9IGdldFRvaygpLmdldEludFZhbCgpOworICAgIExleCgpOworCisgICAgaWYgKEZpbGVOdW1iZXIgPCAxKQorICAgICAgcmV0dXJuIFRva0Vycm9yKCJmaWxlIG51bWJlciBsZXNzIHRoYW4gb25lIik7CisgIH0KKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6U3RyaW5nKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5maWxlJyBkaXJlY3RpdmUiKTsKKworICBTdHJpbmdSZWYgRmlsZW5hbWUgPSBnZXRUb2soKS5nZXRTdHJpbmcoKTsKKyAgRmlsZW5hbWUgPSBGaWxlbmFtZS5zdWJzdHIoMSwgRmlsZW5hbWUuc2l6ZSgpLTIpOworICBMZXgoKTsKKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiAnLmZpbGUnIGRpcmVjdGl2ZSIpOworCisgIGlmIChGaWxlTnVtYmVyID09IC0xKQorICAgIGdldFN0cmVhbWVyKCkuRW1pdEZpbGVEaXJlY3RpdmUoRmlsZW5hbWUpOworICBlbHNlIHsKKyAgICAgaWYgKGdldENvbnRleHQoKS5HZXREd2FyZkZpbGUoRmlsZW5hbWUsIEZpbGVOdW1iZXIpID09IDApCisJRXJyb3IoRmlsZU51bWJlckxvYywgImZpbGUgbnVtYmVyIGFscmVhZHkgYWxsb2NhdGVkIik7CisgICAgZ2V0U3RyZWFtZXIoKS5FbWl0RHdhcmZGaWxlRGlyZWN0aXZlKEZpbGVOdW1iZXIsIEZpbGVuYW1lKTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlTGluZQorLy8vIDo6PSAubGluZSBbbnVtYmVyXQorYm9vbCBHZW5lcmljQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUxpbmUoU3RyaW5nUmVmLCBTTUxvYyBEaXJlY3RpdmVMb2MpIHsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkgeworICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpJbnRlZ2VyKSkKKyAgICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiAnLmxpbmUnIGRpcmVjdGl2ZSIpOworCisgICAgaW50NjRfdCBMaW5lTnVtYmVyID0gZ2V0VG9rKCkuZ2V0SW50VmFsKCk7CisgICAgKHZvaWQpIExpbmVOdW1iZXI7CisgICAgTGV4KCk7CisKKyAgICAvLyBGSVhNRTogRG8gc29tZXRoaW5nIHdpdGggdGhlIC5saW5lLgorICB9CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5saW5lJyBkaXJlY3RpdmUiKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIFBhcnNlRGlyZWN0aXZlTG9jCisvLy8gOjo9IC5sb2MgbnVtYmVyIFtudW1iZXIgW251bWJlcl1dCitib29sIEdlbmVyaWNBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlTG9jKFN0cmluZ1JlZiwgU01Mb2MgRGlyZWN0aXZlTG9jKSB7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpJbnRlZ2VyKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5sb2MnIGRpcmVjdGl2ZSIpOworCisgIC8vIEZJWE1FOiBXaGF0IGFyZSB0aGVzZSBmaWVsZHM/CisgIGludDY0X3QgRmlsZU51bWJlciA9IGdldFRvaygpLmdldEludFZhbCgpOworICAodm9pZCkgRmlsZU51bWJlcjsKKyAgLy8gRklYTUU6IFZhbGlkYXRlIGZpbGUuCisKKyAgTGV4KCk7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpIHsKKyAgICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6SW50ZWdlcikpCisgICAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5sb2MnIGRpcmVjdGl2ZSIpOworCisgICAgaW50NjRfdCBQYXJhbTIgPSBnZXRUb2soKS5nZXRJbnRWYWwoKTsKKyAgICAodm9pZCkgUGFyYW0yOworICAgIExleCgpOworCisgICAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkgeworICAgICAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkludGVnZXIpKQorICAgICAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5sb2MnIGRpcmVjdGl2ZSIpOworCisgICAgICBpbnQ2NF90IFBhcmFtMyA9IGdldFRvaygpLmdldEludFZhbCgpOworICAgICAgKHZvaWQpIFBhcmFtMzsKKyAgICAgIExleCgpOworCisgICAgICAvLyBGSVhNRTogRG8gc29tZXRoaW5nIHdpdGggdGhlIC5sb2MuCisgICAgfQorICB9CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5maWxlJyBkaXJlY3RpdmUiKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZURpcmVjdGl2ZU1hY3Jvc09uT2ZmCisvLy8gOjo9IC5tYWNyb3Nfb24KKy8vLyA6Oj0gLm1hY3Jvc19vZmYKK2Jvb2wgR2VuZXJpY0FzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVNYWNyb3NPbk9mZihTdHJpbmdSZWYgRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIERpcmVjdGl2ZUxvYykgeworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgIHJldHVybiBFcnJvcihnZXRMZXhlcigpLmdldExvYygpLAorICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCB0b2tlbiBpbiAnIiArIERpcmVjdGl2ZSArICInIGRpcmVjdGl2ZSIpOworCisgIGdldFBhcnNlcigpLk1hY3Jvc0VuYWJsZWQgPSBEaXJlY3RpdmUgPT0gIi5tYWNyb3Nfb24iOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlTWFjcm8KKy8vLyA6Oj0gLm1hY3JvIG5hbWUKK2Jvb2wgR2VuZXJpY0FzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVNYWNybyhTdHJpbmdSZWYgRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIERpcmVjdGl2ZUxvYykgeworICBTdHJpbmdSZWYgTmFtZTsKKyAgaWYgKGdldFBhcnNlcigpLlBhcnNlSWRlbnRpZmllcihOYW1lKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIGlkZW50aWZpZXIgaW4gZGlyZWN0aXZlIik7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5tYWNybycgZGlyZWN0aXZlIik7CisKKyAgLy8gRWF0IHRoZSBlbmQgb2Ygc3RhdGVtZW50LgorICBMZXgoKTsKKworICBBc21Ub2tlbiBFbmRUb2tlbiwgU3RhcnRUb2tlbiA9IGdldFRvaygpOworCisgIC8vIExleCB0aGUgbWFjcm8gZGVmaW5pdGlvbi4KKyAgZm9yICg7OykgeworICAgIC8vIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgICAgaWYgKGdldExleGVyKCkuaXMoQXNtVG9rZW46OkVvZikpCisgICAgICByZXR1cm4gRXJyb3IoRGlyZWN0aXZlTG9jLCAibm8gbWF0Y2hpbmcgJy5lbmRtYWNybycgaW4gZGVmaW5pdGlvbiIpOworCisgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayB3aGV0aGVyIHdlIGhhdmUgcmVhY2ggdGhlIC5lbmRtYWNyby4KKyAgICBpZiAoZ2V0TGV4ZXIoKS5pcyhBc21Ub2tlbjo6SWRlbnRpZmllcikgJiYKKyAgICAgICAgKGdldFRvaygpLmdldElkZW50aWZpZXIoKSA9PSAiLmVuZG0iIHx8CisgICAgICAgICBnZXRUb2soKS5nZXRJZGVudGlmaWVyKCkgPT0gIi5lbmRtYWNybyIpKSB7CisgICAgICBFbmRUb2tlbiA9IGdldFRvaygpOworICAgICAgTGV4KCk7CisgICAgICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgICAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJyIgKyBFbmRUb2tlbi5nZXRJZGVudGlmaWVyKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIicgZGlyZWN0aXZlIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHNjYW4gdGlsIHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudC4KKyAgICBnZXRQYXJzZXIoKS5FYXRUb0VuZE9mU3RhdGVtZW50KCk7CisgIH0KKworICBpZiAoZ2V0UGFyc2VyKCkuTWFjcm9NYXAubG9va3VwKE5hbWUpKSB7CisgICAgcmV0dXJuIEVycm9yKERpcmVjdGl2ZUxvYywgIm1hY3JvICciICsgTmFtZSArICInIGlzIGFscmVhZHkgZGVmaW5lZCIpOworICB9CisKKyAgY29uc3QgY2hhciAqQm9keVN0YXJ0ID0gU3RhcnRUb2tlbi5nZXRMb2MoKS5nZXRQb2ludGVyKCk7CisgIGNvbnN0IGNoYXIgKkJvZHlFbmQgPSBFbmRUb2tlbi5nZXRMb2MoKS5nZXRQb2ludGVyKCk7CisgIFN0cmluZ1JlZiBCb2R5ID0gU3RyaW5nUmVmKEJvZHlTdGFydCwgQm9keUVuZCAtIEJvZHlTdGFydCk7CisgIGdldFBhcnNlcigpLk1hY3JvTWFwW05hbWVdID0gbmV3IE1hY3JvKE5hbWUsIEJvZHkpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZURpcmVjdGl2ZUVuZE1hY3JvCisvLy8gOjo9IC5lbmRtCisvLy8gOjo9IC5lbmRtYWNybworYm9vbCBHZW5lcmljQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUVuZE1hY3JvKFN0cmluZ1JlZiBEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgRGlyZWN0aXZlTG9jKSB7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluICciICsgRGlyZWN0aXZlICsgIicgZGlyZWN0aXZlIik7CisKKyAgLy8gSWYgd2UgYXJlIGluc2lkZSBhIG1hY3JvIGluc3RhbnRpYXRpb24sIHRlcm1pbmF0ZSB0aGUgY3VycmVudAorICAvLyBpbnN0YW50aWF0aW9uLgorICBpZiAoIWdldFBhcnNlcigpLkFjdGl2ZU1hY3Jvcy5lbXB0eSgpKSB7CisgICAgZ2V0UGFyc2VyKCkuSGFuZGxlTWFjcm9FeGl0KCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIC5lbmRtYWNybyBpcyBhIHN0cmF5IGVudHJ5IGluIHRoZSBmaWxlOyB3ZWxsIGZvcm1lZAorICAvLyAuZW5kbWFjcm8gZGlyZWN0aXZlcyBhcmUgaGFuZGxlZCBkdXJpbmcgdGhlIG1hY3JvIGRlZmluaXRpb24gcGFyc2luZy4KKyAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkICciICsgRGlyZWN0aXZlICsgIicgaW4gZmlsZSwgIgorICAgICAgICAgICAgICAgICAgIm5vIGN1cnJlbnQgbWFjcm8gZGVmaW5pdGlvbiIpOworfQorCisvLy8gXGJyaWVmIENyZWF0ZSBhbiBNQ0FzbVBhcnNlciBpbnN0YW5jZS4KK01DQXNtUGFyc2VyICpsbHZtOjpjcmVhdGVNQ0FzbVBhcnNlcihjb25zdCBUYXJnZXQgJlQsIFNvdXJjZU1nciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDLCBNQ1N0cmVhbWVyICZPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICZNQUkpIHsKKyAgcmV0dXJuIG5ldyBBc21QYXJzZXIoVCwgU00sIEMsIE91dCwgTUFJKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWE3YmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTAgQEAKK2FkZF9sbHZtX2xpYnJhcnkoTExWTU1DUGFyc2VyCisgIEFzbUxleGVyLmNwcAorICBBc21QYXJzZXIuY3BwCisgIERhcndpbkFzbVBhcnNlci5jcHAKKyAgRUxGQXNtUGFyc2VyLmNwcAorICBNQ0FzbUxleGVyLmNwcAorICBNQ0FzbVBhcnNlci5jcHAKKyAgTUNBc21QYXJzZXJFeHRlbnNpb24uY3BwCisgIFRhcmdldEFzbVBhcnNlci5jcHAKKyAgKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL0RhcndpbkFzbVBhcnNlci5jcHAgYi9zcmMvTExWTS9saWIvTUMvTUNQYXJzZXIvRGFyd2luQXNtUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRkYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL0RhcndpbkFzbVBhcnNlci5jcHAKQEAgLTAsMCArMSw2NjEgQEAKKy8vPT09LSBEYXJ3aW5Bc21QYXJzZXIuY3BwIC0gRGFyd2luIChNYWNoLU8pIEFzc2VtYmx5IFBhcnNlciAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyRXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbk1hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNBc21MZXhlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworLy8vIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBkaXJlY3RpdmUgaGFuZGxpbmcgd2hpY2ggaXMgc2hhcmVkIGFjcm9zcyBhbGwKKy8vLyBEYXJ3aW4gdGFyZ2V0cy4KK2NsYXNzIERhcndpbkFzbVBhcnNlciA6IHB1YmxpYyBNQ0FzbVBhcnNlckV4dGVuc2lvbiB7CisgIHRlbXBsYXRlPGJvb2wgKERhcndpbkFzbVBhcnNlcjo6KkhhbmRsZXIpKFN0cmluZ1JlZiwgU01Mb2MpPgorICB2b2lkIEFkZERpcmVjdGl2ZUhhbmRsZXIoU3RyaW5nUmVmIERpcmVjdGl2ZSkgeworICAgIGdldFBhcnNlcigpLkFkZERpcmVjdGl2ZUhhbmRsZXIodGhpcywgRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlRGlyZWN0aXZlPERhcndpbkFzbVBhcnNlciwgSGFuZGxlcj4pOworICB9CisKKyAgYm9vbCBQYXJzZVNlY3Rpb25Td2l0Y2goY29uc3QgY2hhciAqU2VnbWVudCwgY29uc3QgY2hhciAqU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVEFBID0gMCwgdW5zaWduZWQgSW1wbGljaXRBbGlnbiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN0dWJTaXplID0gMCk7CisKK3B1YmxpYzoKKyAgRGFyd2luQXNtUGFyc2VyKCkge30KKworICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShNQ0FzbVBhcnNlciAmUGFyc2VyKSB7CisgICAgLy8gQ2FsbCB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB0aGlzLT5NQ0FzbVBhcnNlckV4dGVuc2lvbjo6SW5pdGlhbGl6ZShQYXJzZXIpOworCisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZURlc2M+KCIuZGVzYyIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVMc3ltPigiLmxzeW0iKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlU3Vic2VjdGlvbnNWaWFTeW1ib2xzPigKKyAgICAgICIuc3Vic2VjdGlvbnNfdmlhX3N5bWJvbHMiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlRHVtcE9yTG9hZD4oIi5kdW1wIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUR1bXBPckxvYWQ+KCIubG9hZCIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVTZWN0aW9uPigiLnNlY3Rpb24iKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlU2VjdXJlTG9nVW5pcXVlPigKKyAgICAgICIuc2VjdXJlX2xvZ191bmlxdWUiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlU2VjdXJlTG9nUmVzZXQ+KAorICAgICAgIi5zZWN1cmVfbG9nX3Jlc2V0Iik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZVRCU1M+KCIudGJzcyIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVaZXJvZmlsbD4oIi56ZXJvZmlsbCIpOworCisgICAgLy8gU3BlY2lhbCBzZWN0aW9uIGRpcmVjdGl2ZXMuCisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVDb25zdD4oIi5jb25zdCIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlQ29uc3REYXRhPigiLmNvbnN0X2RhdGEiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZUNvbnN0cnVjdG9yPigiLmNvbnN0cnVjdG9yIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVDU3RyaW5nPigiLmNzdHJpbmciKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZURhdGE+KCIuZGF0YSIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlRGVzdHJ1Y3Rvcj4oIi5kZXN0cnVjdG9yIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVEeWxkPigiLmR5bGQiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZUZWTUxpYkluaXQwPigiLmZ2bWxpYl9pbml0MCIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlRlZNTGliSW5pdDE+KCIuZnZtbGliX2luaXQxIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVMYXp5U3ltYm9sUG9pbnRlcnM+KCIubGF6eV9zeW1ib2xfcG9pbnRlciIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlTGl0ZXJhbDE2PigiLmxpdGVyYWwxNiIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlTGl0ZXJhbDQ+KCIubGl0ZXJhbDQiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZUxpdGVyYWw4PigiLmxpdGVyYWw4Iik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVNb2RJbml0RnVuYz4oIi5tb2RfaW5pdF9mdW5jIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVNb2RUZXJtRnVuYz4oIi5tb2RfdGVybV9mdW5jIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVOb25MYXp5U3ltYm9sUG9pbnRlcnM+KCIubm9uX2xhenlfc3ltYm9sX3BvaW50ZXIiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNDYXRDbHNNZXRoPigiLm9iamNfY2F0X2Nsc19tZXRoIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDQ2F0SW5zdE1ldGg+KCIub2JqY19jYXRfaW5zdF9tZXRoIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDQ2F0ZWdvcnk+KCIub2JqY19jYXRlZ29yeSIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ0NsYXNzPigiLm9iamNfY2xhc3MiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNDbGFzc05hbWVzPigiLm9iamNfY2xhc3NfbmFtZXMiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNDbGFzc1ZhcnM+KCIub2JqY19jbGFzc192YXJzIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDQ2xzTWV0aD4oIi5vYmpjX2Nsc19tZXRoIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDQ2xzUmVmcz4oIi5vYmpjX2Nsc19yZWZzIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDSW5zdE1ldGg+KCIub2JqY19pbnN0X21ldGgiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNJbnN0YW5jZVZhcnM+KCIub2JqY19pbnN0YW5jZV92YXJzIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDTWVzc2FnZVJlZnM+KCIub2JqY19tZXNzYWdlX3JlZnMiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNNZXRhQ2xhc3M+KCIub2JqY19tZXRhX2NsYXNzIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDTWV0aFZhck5hbWVzPigiLm9iamNfbWV0aF92YXJfbmFtZXMiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNNZXRoVmFyVHlwZXM+KCIub2JqY19tZXRoX3Zhcl90eXBlcyIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ01vZHVsZUluZm8+KCIub2JqY19tb2R1bGVfaW5mbyIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ1Byb3RvY29sPigiLm9iamNfcHJvdG9jb2wiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNTZWxlY3RvclN0cnM+KCIub2JqY19zZWxlY3Rvcl9zdHJzIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDU3RyaW5nT2JqZWN0PigiLm9iamNfc3RyaW5nX29iamVjdCIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkRhcndpbkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ1N5bWJvbHM+KCIub2JqY19zeW1ib2xzIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVQSUNTeW1ib2xTdHViPigiLnBpY3N5bWJvbF9zdHViIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVTdGF0aWNDb25zdD4oIi5zdGF0aWNfY29uc3QiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZVN0YXRpY0RhdGE+KCIuc3RhdGljX2RhdGEiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZVN5bWJvbFN0dWI+KCIuc3ltYm9sX3N0dWIiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZVREYXRhPigiLnRkYXRhIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVUZXh0PigiLnRleHQiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZVRocmVhZEluaXRGdW5jPigiLnRocmVhZF9pbml0X2Z1bmMiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZVRMVj4oIi50bHYiKTsKKyAgfQorCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVEZXNjKFN0cmluZ1JlZiwgU01Mb2MpOworICBib29sIFBhcnNlRGlyZWN0aXZlRHVtcE9yTG9hZChTdHJpbmdSZWYsIFNNTG9jKTsKKyAgYm9vbCBQYXJzZURpcmVjdGl2ZUxzeW0oU3RyaW5nUmVmLCBTTUxvYyk7CisgIGJvb2wgUGFyc2VEaXJlY3RpdmVTZWN0aW9uKFN0cmluZ1JlZiwgU01Mb2MpOworICBib29sIFBhcnNlRGlyZWN0aXZlU2VjdXJlTG9nUmVzZXQoU3RyaW5nUmVmLCBTTUxvYyk7CisgIGJvb2wgUGFyc2VEaXJlY3RpdmVTZWN1cmVMb2dVbmlxdWUoU3RyaW5nUmVmLCBTTUxvYyk7CisgIGJvb2wgUGFyc2VEaXJlY3RpdmVTdWJzZWN0aW9uc1ZpYVN5bWJvbHMoU3RyaW5nUmVmLCBTTUxvYyk7CisgIGJvb2wgUGFyc2VEaXJlY3RpdmVUQlNTKFN0cmluZ1JlZiwgU01Mb2MpOworICBib29sIFBhcnNlRGlyZWN0aXZlWmVyb2ZpbGwoU3RyaW5nUmVmLCBTTUxvYyk7CisKKyAgLy8gTmFtZWQgU2VjdGlvbiBEaXJlY3RpdmUKKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVDb25zdChTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19URVhUIiwgIl9fY29uc3QiKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZVN0YXRpY0NvbnN0KFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX1RFWFQiLCAiX19zdGF0aWNfY29uc3QiKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZUNTdHJpbmcoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fVEVYVCIsIl9fY3N0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19DU1RSSU5HX0xJVEVSQUxTKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZUxpdGVyYWw0KFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX1RFWFQiLCAiX19saXRlcmFsNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U180QllURV9MSVRFUkFMUywgNCk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVMaXRlcmFsOChTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19URVhUIiwgIl9fbGl0ZXJhbDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfOEJZVEVfTElURVJBTFMsIDgpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlTGl0ZXJhbDE2KFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX1RFWFQiLCJfX2xpdGVyYWwxNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U18xNkJZVEVfTElURVJBTFMsIDE2KTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZUNvbnN0cnVjdG9yKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX1RFWFQiLCJfX2NvbnN0cnVjdG9yIik7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVEZXN0cnVjdG9yKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX1RFWFQiLCJfX2Rlc3RydWN0b3IiKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZUZWTUxpYkluaXQwKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX1RFWFQiLCJfX2Z2bWxpYl9pbml0MCIpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlRlZNTGliSW5pdDEoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fVEVYVCIsIl9fZnZtbGliX2luaXQxIik7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVTeW1ib2xTdHViKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX1RFWFQiLCJfX3N5bWJvbF9zdHViIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX1NZTUJPTF9TVFVCUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX1BVUkVfSU5TVFJVQ1RJT05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IERpZmZlcmVudCBvbiBQUEMgYW5kIEFSTS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDE2KTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZVBJQ1N5bWJvbFN0dWIoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fVEVYVCIsIl9fcGljc3ltYm9sX3N0dWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfU1lNQk9MX1NUVUJTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX0FUVFJfUFVSRV9JTlNUUlVDVElPTlMsIDAsIDI2KTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZURhdGEoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fREFUQSIsICJfX2RhdGEiKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZVN0YXRpY0RhdGEoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fREFUQSIsICJfX3N0YXRpY19kYXRhIik7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVOb25MYXp5U3ltYm9sUG9pbnRlcnMoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fREFUQSIsICJfX25sX3N5bWJvbF9wdHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfTk9OX0xBWllfU1lNQk9MX1BPSU5URVJTLCA0KTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZUxhenlTeW1ib2xQb2ludGVycyhTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19EQVRBIiwgIl9fbGFfc3ltYm9sX3B0ciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19MQVpZX1NZTUJPTF9QT0lOVEVSUywgNCk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVEeWxkKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX0RBVEEiLCAiX19keWxkIik7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVNb2RJbml0RnVuYyhTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19EQVRBIiwgIl9fbW9kX2luaXRfZnVuYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19NT0RfSU5JVF9GVU5DX1BPSU5URVJTLCA0KTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZU1vZFRlcm1GdW5jKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX0RBVEEiLCAiX19tb2RfdGVybV9mdW5jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX01PRF9URVJNX0ZVTkNfUE9JTlRFUlMsIDQpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlQ29uc3REYXRhKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX0RBVEEiLCAiX19jb25zdCIpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ0NsYXNzKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX09CSkMiLCAiX19jbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX05PX0RFQURfU1RSSVApOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ01ldGFDbGFzcyhTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19PQkpDIiwgIl9fbWV0YV9jbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX05PX0RFQURfU1RSSVApOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ0NhdENsc01ldGgoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fT0JKQyIsICJfX2NhdF9jbHNfbWV0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX05PX0RFQURfU1RSSVApOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ0NhdEluc3RNZXRoKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX09CSkMiLCAiX19jYXRfaW5zdF9tZXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX0FUVFJfTk9fREVBRF9TVFJJUCk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDUHJvdG9jb2woU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fT0JKQyIsICJfX3Byb3RvY29sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX0FUVFJfTk9fREVBRF9TVFJJUCk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDU3RyaW5nT2JqZWN0KFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX09CSkMiLCAiX19zdHJpbmdfb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX0FUVFJfTk9fREVBRF9TVFJJUCk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDQ2xzTWV0aChTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19PQkpDIiwgIl9fY2xzX21ldGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9OT19ERUFEX1NUUklQKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNJbnN0TWV0aChTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19PQkpDIiwgIl9faW5zdF9tZXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX0FUVFJfTk9fREVBRF9TVFJJUCk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDQ2xzUmVmcyhTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19PQkpDIiwgIl9fY2xzX3JlZnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9OT19ERUFEX1NUUklQIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX0xJVEVSQUxfUE9JTlRFUlMsIDQpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ01lc3NhZ2VSZWZzKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX09CSkMiLCAiX19tZXNzYWdlX3JlZnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9OT19ERUFEX1NUUklQIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX0xJVEVSQUxfUE9JTlRFUlMsIDQpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ1N5bWJvbHMoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fT0JKQyIsICJfX3N5bWJvbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9OT19ERUFEX1NUUklQKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNDYXRlZ29yeShTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19PQkpDIiwgIl9fY2F0ZWdvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9OT19ERUFEX1NUUklQKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNDbGFzc1ZhcnMoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fT0JKQyIsICJfX2NsYXNzX3ZhcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9OT19ERUFEX1NUUklQKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNJbnN0YW5jZVZhcnMoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fT0JKQyIsICJfX2luc3RhbmNlX3ZhcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9OT19ERUFEX1NUUklQKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNNb2R1bGVJbmZvKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX09CSkMiLCAiX19tb2R1bGVfaW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX05PX0RFQURfU1RSSVApOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ0NsYXNzTmFtZXMoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fVEVYVCIsICJfX2NzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQ1NUUklOR19MSVRFUkFMUyk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVPYmpDTWV0aFZhclR5cGVzKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCJfX1RFWFQiLCAiX19jc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX0NTVFJJTkdfTElURVJBTFMpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlT2JqQ01ldGhWYXJOYW1lcyhTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19URVhUIiwgIl9fY3N0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19DU1RSSU5HX0xJVEVSQUxTKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZU9iakNTZWxlY3RvclN0cnMoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIl9fT0JKQyIsICJfX3NlbGVjdG9yX3N0cnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQ1NUUklOR19MSVRFUkFMUyk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVURGF0YShTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19EQVRBIiwgIl9fdGhyZWFkX2RhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfVEhSRUFEX0xPQ0FMX1JFR1VMQVIpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlVGV4dChTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19URVhUIiwgIl9fdGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX1BVUkVfSU5TVFJVQ1RJT05TKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZVRMVihTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19EQVRBIiwgIl9fdGhyZWFkX3ZhcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfVEhSRUFEX0xPQ0FMX1ZBUklBQkxFUyk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVUaHJlYWRJbml0RnVuYyhTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiX19EQVRBIiwgIl9fdGhyZWFkX2luaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX1RIUkVBRF9MT0NBTF9JTklUX0ZVTkNUSU9OX1BPSU5URVJTKTsKKyAgfQorCit9OworCit9CisKK2Jvb2wgRGFyd2luQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25Td2l0Y2goY29uc3QgY2hhciAqU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVEFBLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3R1YlNpemUpIHsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gc2VjdGlvbiBzd2l0Y2hpbmcgZGlyZWN0aXZlIik7CisgIExleCgpOworCisgIC8vIEZJWE1FOiBBcmNoIHNwZWNpZmljLgorICBib29sIGlzVGV4dCA9IFN0cmluZ1JlZihTZWdtZW50KSA9PSAiX19URVhUIjsgIC8vIEZJWE1FOiBIYWNrLgorICBnZXRTdHJlYW1lcigpLlN3aXRjaFNlY3Rpb24oZ2V0Q29udGV4dCgpLmdldE1hY2hPU2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudCwgU2VjdGlvbiwgVEFBLCBTdHViU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUZXh0ID8gU2VjdGlvbktpbmQ6OmdldFRleHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZWN0aW9uS2luZDo6Z2V0RGF0YVJlbCgpKSk7CisKKyAgLy8gU2V0IHRoZSBpbXBsaWNpdCBhbGlnbm1lbnQsIGlmIGFueS4KKyAgLy8KKyAgLy8gRklYTUU6IFRoaXMgaXNuJ3QgcmVhbGx5IHdoYXQgJ2FzJyBkb2VzOyBJIHRoaW5rIGl0IGp1c3QgdXNlcyB0aGUgaW1wbGljaXQKKyAgLy8gYWxpZ25tZW50IG9uIHRoZSBzZWN0aW9uIChlLmcuLCBpZiBvbmUgbWFudWFsbHkgaW5zZXJ0cyBieXRlcyBpbnRvIHRoZQorICAvLyBzZWN0aW9uLCB0aGVuIGp1c3QgaXNzdWVpbmcgdGhlIHNlY3Rpb24gc3dpdGNoIGRpcmVjdGl2ZSB3aWxsIG5vdCByZWFsaWduCisgIC8vIHRoZSBzZWN0aW9uLiBIb3dldmVyLCB0aGlzIGlzIGFyZ3VhYmx5IG1vcmUgcmVhc29uYWJsZSBiZWhhdmlvciwgYW5kIHRoZXJlCisgIC8vIGlzIG5vIGdvb2QgcmVhc29uIGZvciBzb21lb25lIHRvIGludGVudGlvbmFsbHkgZW1pdCBpbmNvcnJlY3RseSBzaXplZAorICAvLyB2YWx1ZXMgaW50byB0aGUgaW1wbGljaXRseSBhbGlnbmVkIHNlY3Rpb25zLgorICBpZiAoQWxpZ24pCisgICAgZ2V0U3RyZWFtZXIoKS5FbWl0VmFsdWVUb0FsaWdubWVudChBbGlnbiwgMCwgMSwgMCk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVEZXNjCisvLy8gIDo6PSAuZGVzYyBpZGVudGlmaWVyICwgZXhwcmVzc2lvbgorYm9vbCBEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlRGVzYyhTdHJpbmdSZWYsIFNNTG9jKSB7CisgIFN0cmluZ1JlZiBOYW1lOworICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VJZGVudGlmaWVyKE5hbWUpKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgaWRlbnRpZmllciBpbiBkaXJlY3RpdmUiKTsKKworICAvLyBIYW5kbGUgdGhlIGlkZW50aWZpZXIgYXMgdGhlIGtleSBzeW1ib2wuCisgIE1DU3ltYm9sICpTeW0gPSBnZXRDb250ZXh0KCkuR2V0T3JDcmVhdGVTeW1ib2woTmFtZSk7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkNvbW1hKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5kZXNjJyBkaXJlY3RpdmUiKTsKKyAgTGV4KCk7CisKKyAgaW50NjRfdCBEZXNjVmFsdWU7CisgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUFic29sdXRlRXhwcmVzc2lvbihEZXNjVmFsdWUpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluICcuZGVzYycgZGlyZWN0aXZlIik7CisKKyAgTGV4KCk7CisKKyAgLy8gU2V0IHRoZSBuX2Rlc2MgZmllbGQgb2YgdGhpcyBTeW1ib2wgdG8gdGhpcyBEZXNjVmFsdWUKKyAgZ2V0U3RyZWFtZXIoKS5FbWl0U3ltYm9sRGVzYyhTeW0sIERlc2NWYWx1ZSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVEdW1wT3JMb2FkCisvLy8gIDo6PSAoIC5kdW1wIHwgLmxvYWQgKSAiZmlsZW5hbWUiCitib29sIERhcndpbkFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVEdW1wT3JMb2FkKFN0cmluZ1JlZiBEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIElETG9jKSB7CisgIGJvb2wgSXNEdW1wID0gRGlyZWN0aXZlID09ICIuZHVtcCI7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpTdHJpbmcpKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgc3RyaW5nIGluICcuZHVtcCcgb3IgJy5sb2FkJyBkaXJlY3RpdmUiKTsKKworICBMZXgoKTsKKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiAnLmR1bXAnIG9yICcubG9hZCcgZGlyZWN0aXZlIik7CisKKyAgTGV4KCk7CisKKyAgLy8gRklYTUU6IElmL3doZW4gLmR1bXAgYW5kIC5sb2FkIGFyZSBpbXBsZW1lbnRlZCB0aGV5IHdpbGwgYmUgZG9uZSBpbiB0aGUKKyAgLy8gdGhlIGFzc2VtYmx5IHBhcnNlciBhbmQgbm90IGhhdmUgYW55IG5lZWQgZm9yIGFuIE1DU3RyZWFtZXIgQVBJLgorICBpZiAoSXNEdW1wKQorICAgIFdhcm5pbmcoSURMb2MsICJpZ25vcmluZyBkaXJlY3RpdmUgLmR1bXAgZm9yIG5vdyIpOworICBlbHNlCisgICAgV2FybmluZyhJRExvYywgImlnbm9yaW5nIGRpcmVjdGl2ZSAubG9hZCBmb3Igbm93Iik7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVMc3ltCisvLy8gIDo6PSAubHN5bSBpZGVudGlmaWVyICwgZXhwcmVzc2lvbgorYm9vbCBEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlTHN5bShTdHJpbmdSZWYsIFNNTG9jKSB7CisgIFN0cmluZ1JlZiBOYW1lOworICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VJZGVudGlmaWVyKE5hbWUpKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgaWRlbnRpZmllciBpbiBkaXJlY3RpdmUiKTsKKworICAvLyBIYW5kbGUgdGhlIGlkZW50aWZpZXIgYXMgdGhlIGtleSBzeW1ib2wuCisgIE1DU3ltYm9sICpTeW0gPSBnZXRDb250ZXh0KCkuR2V0T3JDcmVhdGVTeW1ib2woTmFtZSk7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkNvbW1hKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5sc3ltJyBkaXJlY3RpdmUiKTsKKyAgTGV4KCk7CisKKyAgY29uc3QgTUNFeHByICpWYWx1ZTsKKyAgaWYgKGdldFBhcnNlcigpLlBhcnNlRXhwcmVzc2lvbihWYWx1ZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5sc3ltJyBkaXJlY3RpdmUiKTsKKworICBMZXgoKTsKKworICAvLyBXZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGRpcmVjdGl2ZS4KKyAgLy8KKyAgLy8gRklYTUU6IERpYWdub3N0aWMgbG9jYXRpb24hCisgICh2b2lkKSBTeW07CisgIHJldHVybiBUb2tFcnJvcigiZGlyZWN0aXZlICcubHN5bScgaXMgdW5zdXBwb3J0ZWQiKTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlU2VjdGlvbjoKKy8vLyAgIDo6PSAuc2VjdGlvbiBpZGVudGlmaWVyICgnLCcgaWRlbnRpZmllcikqCitib29sIERhcndpbkFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVTZWN0aW9uKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgU01Mb2MgTG9jID0gZ2V0TGV4ZXIoKS5nZXRMb2MoKTsKKworICBTdHJpbmdSZWYgU2VjdGlvbk5hbWU7CisgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUlkZW50aWZpZXIoU2VjdGlvbk5hbWUpKQorICAgIHJldHVybiBFcnJvcihMb2MsICJleHBlY3RlZCBpZGVudGlmaWVyIGFmdGVyICcuc2VjdGlvbicgZGlyZWN0aXZlIik7CisKKyAgLy8gVmVyaWZ5IHRoZXJlIGlzIGEgZm9sbG93aW5nIGNvbW1hLgorICBpZiAoIWdldExleGVyKCkuaXMoQXNtVG9rZW46OkNvbW1hKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5zZWN0aW9uJyBkaXJlY3RpdmUiKTsKKworICBzdGQ6OnN0cmluZyBTZWN0aW9uU3BlYyA9IFNlY3Rpb25OYW1lOworICBTZWN0aW9uU3BlYyArPSAiLCI7CisKKyAgLy8gQWRkIGFsbCB0aGUgdG9rZW5zIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmUsIFBhcnNlU2VjdGlvblNwZWNpZmllciB3aWxsCisgIC8vIGhhbmRsZSB0aGlzLgorICBTdHJpbmdSZWYgRU9MID0gZ2V0TGV4ZXIoKS5MZXhVbnRpbEVuZE9mU3RhdGVtZW50KCk7CisgIFNlY3Rpb25TcGVjLmFwcGVuZChFT0wuYmVnaW4oKSwgRU9MLmVuZCgpKTsKKworICBMZXgoKTsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5zZWN0aW9uJyBkaXJlY3RpdmUiKTsKKyAgTGV4KCk7CisKKworICBTdHJpbmdSZWYgU2VnbWVudCwgU2VjdGlvbjsKKyAgdW5zaWduZWQgVEFBLCBTdHViU2l6ZTsKKyAgc3RkOjpzdHJpbmcgRXJyb3JTdHIgPQorICAgIE1DU2VjdGlvbk1hY2hPOjpQYXJzZVNlY3Rpb25TcGVjaWZpZXIoU2VjdGlvblNwZWMsIFNlZ21lbnQsIFNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUEsIFN0dWJTaXplKTsKKworICBpZiAoIUVycm9yU3RyLmVtcHR5KCkpCisgICAgcmV0dXJuIEVycm9yKExvYywgRXJyb3JTdHIuY19zdHIoKSk7CisKKyAgLy8gRklYTUU6IEFyY2ggc3BlY2lmaWMuCisgIGJvb2wgaXNUZXh0ID0gU2VnbWVudCA9PSAiX19URVhUIjsgIC8vIEZJWE1FOiBIYWNrLgorICBnZXRTdHJlYW1lcigpLlN3aXRjaFNlY3Rpb24oZ2V0Q29udGV4dCgpLmdldE1hY2hPU2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudCwgU2VjdGlvbiwgVEFBLCBTdHViU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUZXh0ID8gU2VjdGlvbktpbmQ6OmdldFRleHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNlY3Rpb25LaW5kOjpnZXREYXRhUmVsKCkpKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVTZWN1cmVMb2dVbmlxdWUKKy8vLyAgOjo9IC5zZWN1cmVfbG9nX3VuaXF1ZSAuLi4gbWVzc2FnZSAuLi4KK2Jvb2wgRGFyd2luQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZVNlY3VyZUxvZ1VuaXF1ZShTdHJpbmdSZWYsIFNNTG9jIElETG9jKSB7CisgIFN0cmluZ1JlZiBMb2dNZXNzYWdlID0gZ2V0UGFyc2VyKCkuUGFyc2VTdHJpbmdUb0VuZE9mU3RhdGVtZW50KCk7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluICcuc2VjdXJlX2xvZ191bmlxdWUnIGRpcmVjdGl2ZSIpOworCisgIGlmIChnZXRDb250ZXh0KCkuZ2V0U2VjdXJlTG9nVXNlZCgpICE9IGZhbHNlKQorICAgIHJldHVybiBFcnJvcihJRExvYywgIi5zZWN1cmVfbG9nX3VuaXF1ZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMiKTsKKworICAvLyBHZXQgdGhlIHNlY3VyZSBsb2cgcGF0aC4KKyAgY29uc3QgY2hhciAqU2VjdXJlTG9nRmlsZSA9IGdldENvbnRleHQoKS5nZXRTZWN1cmVMb2dGaWxlKCk7CisgIGlmIChTZWN1cmVMb2dGaWxlID09IE5VTEwpCisgICAgcmV0dXJuIEVycm9yKElETG9jLCAiLnNlY3VyZV9sb2dfdW5pcXVlIHVzZWQgYnV0IEFTX1NFQ1VSRV9MT0dfRklMRSAiCisgICAgICAgICAgICAgICAgICJlbnZpcm9ubWVudCB2YXJpYWJsZSB1bnNldC4iKTsKKworICAvLyBPcGVuIHRoZSBzZWN1cmUgbG9nIGZpbGUgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LgorICByYXdfb3N0cmVhbSAqT1MgPSBnZXRDb250ZXh0KCkuZ2V0U2VjdXJlTG9nKCk7CisgIGlmIChPUyA9PSBOVUxMKSB7CisgICAgc3RkOjpzdHJpbmcgRXJyOworICAgIE9TID0gbmV3IHJhd19mZF9vc3RyZWFtKFNlY3VyZUxvZ0ZpbGUsIEVyciwgcmF3X2ZkX29zdHJlYW06OkZfQXBwZW5kKTsKKyAgICBpZiAoIUVyci5lbXB0eSgpKSB7CisgICAgICAgZGVsZXRlIE9TOworICAgICAgIHJldHVybiBFcnJvcihJRExvYywgVHdpbmUoImNhbid0IG9wZW4gc2VjdXJlIGxvZyBmaWxlOiAiKSArCisgICAgICAgICAgICAgICAgICAgIFNlY3VyZUxvZ0ZpbGUgKyAiICgiICsgRXJyICsgIikiKTsKKyAgICB9CisgICAgZ2V0Q29udGV4dCgpLnNldFNlY3VyZUxvZyhPUyk7CisgIH0KKworICAvLyBXcml0ZSB0aGUgbWVzc2FnZS4KKyAgaW50IEN1ckJ1ZiA9IGdldFNvdXJjZU1hbmFnZXIoKS5GaW5kQnVmZmVyQ29udGFpbmluZ0xvYyhJRExvYyk7CisgICpPUyA8PCBnZXRTb3VyY2VNYW5hZ2VyKCkuZ2V0QnVmZmVySW5mbyhDdXJCdWYpLkJ1ZmZlci0+Z2V0QnVmZmVySWRlbnRpZmllcigpCisgICAgICA8PCAiOiIgPDwgZ2V0U291cmNlTWFuYWdlcigpLkZpbmRMaW5lTnVtYmVyKElETG9jLCBDdXJCdWYpIDw8ICI6IgorICAgICAgPDwgTG9nTWVzc2FnZSArICJcbiI7CisKKyAgZ2V0Q29udGV4dCgpLnNldFNlY3VyZUxvZ1VzZWQodHJ1ZSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVTZWN1cmVMb2dSZXNldAorLy8vICA6Oj0gLnNlY3VyZV9sb2dfcmVzZXQKK2Jvb2wgRGFyd2luQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZVNlY3VyZUxvZ1Jlc2V0KFN0cmluZ1JlZiwgU01Mb2MgSURMb2MpIHsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5zZWN1cmVfbG9nX3Jlc2V0JyBkaXJlY3RpdmUiKTsKKworICBMZXgoKTsKKworICBnZXRDb250ZXh0KCkuc2V0U2VjdXJlTG9nVXNlZChmYWxzZSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVTdWJzZWN0aW9uc1ZpYVN5bWJvbHMKKy8vLyAgOjo9IC5zdWJzZWN0aW9uc192aWFfc3ltYm9scworYm9vbCBEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlU3Vic2VjdGlvbnNWaWFTeW1ib2xzKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy5zdWJzZWN0aW9uc192aWFfc3ltYm9scycgZGlyZWN0aXZlIik7CisKKyAgTGV4KCk7CisKKyAgZ2V0U3RyZWFtZXIoKS5FbWl0QXNzZW1ibGVyRmxhZyhNQ0FGX1N1YnNlY3Rpb25zVmlhU3ltYm9scyk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVUQlNTCisvLy8gIDo6PSAudGJzcyBpZGVudGlmaWVyLCBzaXplLCBhbGlnbgorYm9vbCBEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlVEJTUyhTdHJpbmdSZWYsIFNNTG9jKSB7CisgIFNNTG9jIElETG9jID0gZ2V0TGV4ZXIoKS5nZXRMb2MoKTsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUlkZW50aWZpZXIoTmFtZSkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBpZGVudGlmaWVyIGluIGRpcmVjdGl2ZSIpOworCisgIC8vIEhhbmRsZSB0aGUgaWRlbnRpZmllciBhcyB0aGUga2V5IHN5bWJvbC4KKyAgTUNTeW1ib2wgKlN5bSA9IGdldENvbnRleHQoKS5HZXRPckNyZWF0ZVN5bWJvbChOYW1lKTsKKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6Q29tbWEpKQorICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiBkaXJlY3RpdmUiKTsKKyAgTGV4KCk7CisKKyAgaW50NjRfdCBTaXplOworICBTTUxvYyBTaXplTG9jID0gZ2V0TGV4ZXIoKS5nZXRMb2MoKTsKKyAgaWYgKGdldFBhcnNlcigpLlBhcnNlQWJzb2x1dGVFeHByZXNzaW9uKFNpemUpKQorICAgIHJldHVybiB0cnVlOworCisgIGludDY0X3QgUG93MkFsaWdubWVudCA9IDA7CisgIFNNTG9jIFBvdzJBbGlnbm1lbnRMb2M7CisgIGlmIChnZXRMZXhlcigpLmlzKEFzbVRva2VuOjpDb21tYSkpIHsKKyAgICBMZXgoKTsKKyAgICBQb3cyQWxpZ25tZW50TG9jID0gZ2V0TGV4ZXIoKS5nZXRMb2MoKTsKKyAgICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oUG93MkFsaWdubWVudCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluICcudGJzcycgZGlyZWN0aXZlIik7CisKKyAgTGV4KCk7CisKKyAgaWYgKFNpemUgPCAwKQorICAgIHJldHVybiBFcnJvcihTaXplTG9jLCAiaW52YWxpZCAnLnRic3MnIGRpcmVjdGl2ZSBzaXplLCBjYW4ndCBiZSBsZXNzIHRoYW4iCisgICAgICAgICAgICAgICAgICJ6ZXJvIik7CisKKyAgLy8gRklYTUU6IERpYWdub3NlIG92ZXJmbG93LgorICBpZiAoUG93MkFsaWdubWVudCA8IDApCisgICAgcmV0dXJuIEVycm9yKFBvdzJBbGlnbm1lbnRMb2MsICJpbnZhbGlkICcudGJzcycgYWxpZ25tZW50LCBjYW4ndCBiZSBsZXNzIgorICAgICAgICAgICAgICAgICAidGhhbiB6ZXJvIik7CisKKyAgaWYgKCFTeW0tPmlzVW5kZWZpbmVkKCkpCisgICAgcmV0dXJuIEVycm9yKElETG9jLCAiaW52YWxpZCBzeW1ib2wgcmVkZWZpbml0aW9uIik7CisKKyAgZ2V0U3RyZWFtZXIoKS5FbWl0VEJTU1N5bWJvbChnZXRDb250ZXh0KCkuZ2V0TWFjaE9TZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fREFUQSIsICJfX3RocmVhZF9ic3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfVEhSRUFEX0xPQ0FMX1pFUk9GSUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU2VjdGlvbktpbmQ6OmdldFRocmVhZEJTUygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW0sIFNpemUsIDEgPDwgUG93MkFsaWdubWVudCk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVaZXJvZmlsbAorLy8vICA6Oj0gLnplcm9maWxsIHNlZ25hbWUgLCBzZWN0bmFtZSBbLCBpZGVudGlmaWVyICwgc2l6ZV9leHByZXNzaW9uIFsKKy8vLyAgICAgICwgYWxpZ25fZXhwcmVzc2lvbiBdXQorYm9vbCBEYXJ3aW5Bc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlWmVyb2ZpbGwoU3RyaW5nUmVmLCBTTUxvYykgeworICBTdHJpbmdSZWYgU2VnbWVudDsKKyAgaWYgKGdldFBhcnNlcigpLlBhcnNlSWRlbnRpZmllcihTZWdtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIHNlZ21lbnQgbmFtZSBhZnRlciAnLnplcm9maWxsJyBkaXJlY3RpdmUiKTsKKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6Q29tbWEpKQorICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiBkaXJlY3RpdmUiKTsKKyAgTGV4KCk7CisKKyAgU3RyaW5nUmVmIFNlY3Rpb247CisgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUlkZW50aWZpZXIoU2VjdGlvbikpCisgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBzZWN0aW9uIG5hbWUgYWZ0ZXIgY29tbWEgaW4gJy56ZXJvZmlsbCcgIgorICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIik7CisKKyAgLy8gSWYgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBsaW5lIGFsbCB0aGF0IHdhcyB3YW50ZWQgd2FzIHRvIGNyZWF0ZSB0aGUKKyAgLy8gdGhlIHNlY3Rpb24gYnV0IHdpdGggbm8gc3ltYm9sLgorICBpZiAoZ2V0TGV4ZXIoKS5pcyhBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKSB7CisgICAgLy8gQ3JlYXRlIHRoZSB6ZXJvZmlsbCBzZWN0aW9uIGJ1dCBubyBzeW1ib2wKKyAgICBnZXRTdHJlYW1lcigpLkVtaXRaZXJvZmlsbChnZXRDb250ZXh0KCkuZ2V0TWFjaE9TZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudCwgU2VjdGlvbiwgTUNTZWN0aW9uTWFjaE86OlNfWkVST0ZJTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTZWN0aW9uS2luZDo6Z2V0QlNTKCkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6Q29tbWEpKQorICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiBkaXJlY3RpdmUiKTsKKyAgTGV4KCk7CisKKyAgU01Mb2MgSURMb2MgPSBnZXRMZXhlcigpLmdldExvYygpOworICBTdHJpbmdSZWYgSURTdHI7CisgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUlkZW50aWZpZXIoSURTdHIpKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgaWRlbnRpZmllciBpbiBkaXJlY3RpdmUiKTsKKworICAvLyBoYW5kbGUgdGhlIGlkZW50aWZpZXIgYXMgdGhlIGtleSBzeW1ib2wuCisgIE1DU3ltYm9sICpTeW0gPSBnZXRDb250ZXh0KCkuR2V0T3JDcmVhdGVTeW1ib2woSURTdHIpOworCisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpDb21tYSkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluIGRpcmVjdGl2ZSIpOworICBMZXgoKTsKKworICBpbnQ2NF90IFNpemU7CisgIFNNTG9jIFNpemVMb2MgPSBnZXRMZXhlcigpLmdldExvYygpOworICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oU2l6ZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW50NjRfdCBQb3cyQWxpZ25tZW50ID0gMDsKKyAgU01Mb2MgUG93MkFsaWdubWVudExvYzsKKyAgaWYgKGdldExleGVyKCkuaXMoQXNtVG9rZW46OkNvbW1hKSkgeworICAgIExleCgpOworICAgIFBvdzJBbGlnbm1lbnRMb2MgPSBnZXRMZXhlcigpLmdldExvYygpOworICAgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUFic29sdXRlRXhwcmVzc2lvbihQb3cyQWxpZ25tZW50KSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gJy56ZXJvZmlsbCcgZGlyZWN0aXZlIik7CisKKyAgTGV4KCk7CisKKyAgaWYgKFNpemUgPCAwKQorICAgIHJldHVybiBFcnJvcihTaXplTG9jLCAiaW52YWxpZCAnLnplcm9maWxsJyBkaXJlY3RpdmUgc2l6ZSwgY2FuJ3QgYmUgbGVzcyAiCisgICAgICAgICAgICAgICAgICJ0aGFuIHplcm8iKTsKKworICAvLyBOT1RFOiBUaGUgYWxpZ25tZW50IGluIHRoZSBkaXJlY3RpdmUgaXMgYSBwb3dlciBvZiAyIHZhbHVlLCB0aGUgYXNzZW1ibGVyCisgIC8vIG1heSBpbnRlcm5hbGx5IGVuZCB1cCB3YW50aW5nIGFuIGFsaWdubWVudCBpbiBieXRlcy4KKyAgLy8gRklYTUU6IERpYWdub3NlIG92ZXJmbG93LgorICBpZiAoUG93MkFsaWdubWVudCA8IDApCisgICAgcmV0dXJuIEVycm9yKFBvdzJBbGlnbm1lbnRMb2MsICJpbnZhbGlkICcuemVyb2ZpbGwnIGRpcmVjdGl2ZSBhbGlnbm1lbnQsICIKKyAgICAgICAgICAgICAgICAgImNhbid0IGJlIGxlc3MgdGhhbiB6ZXJvIik7CisKKyAgaWYgKCFTeW0tPmlzVW5kZWZpbmVkKCkpCisgICAgcmV0dXJuIEVycm9yKElETG9jLCAiaW52YWxpZCBzeW1ib2wgcmVkZWZpbml0aW9uIik7CisKKyAgLy8gQ3JlYXRlIHRoZSB6ZXJvZmlsbCBTeW1ib2wgd2l0aCBTaXplIGFuZCBQb3cyQWxpZ25tZW50CisgIC8vCisgIC8vIEZJWE1FOiBBcmNoIHNwZWNpZmljLgorICBnZXRTdHJlYW1lcigpLkVtaXRaZXJvZmlsbChnZXRDb250ZXh0KCkuZ2V0TWFjaE9TZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQsIFNlY3Rpb24sIE1DU2VjdGlvbk1hY2hPOjpTX1pFUk9GSUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFNlY3Rpb25LaW5kOjpnZXRCU1MoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bSwgU2l6ZSwgMSA8PCBQb3cyQWxpZ25tZW50KTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK25hbWVzcGFjZSBsbHZtIHsKKworTUNBc21QYXJzZXJFeHRlbnNpb24gKmNyZWF0ZURhcndpbkFzbVBhcnNlcigpIHsKKyAgcmV0dXJuIG5ldyBEYXJ3aW5Bc21QYXJzZXI7Cit9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9FTEZBc21QYXJzZXIuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL0VMRkFzbVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiYzVjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9FTEZBc21QYXJzZXIuY3BwCkBAIC0wLDAgKzEsMjgxIEBACisvLz09PS0gRUxGQXNtUGFyc2VyLmNwcCAtIEVMRiBBc3NlbWJseSBQYXJzZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlckV4dGVuc2lvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNBc21MZXhlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uRUxGLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworCitjbGFzcyBFTEZBc21QYXJzZXIgOiBwdWJsaWMgTUNBc21QYXJzZXJFeHRlbnNpb24geworICB0ZW1wbGF0ZTxib29sIChFTEZBc21QYXJzZXI6OipIYW5kbGVyKShTdHJpbmdSZWYsIFNNTG9jKT4KKyAgdm9pZCBBZGREaXJlY3RpdmVIYW5kbGVyKFN0cmluZ1JlZiBEaXJlY3RpdmUpIHsKKyAgICBnZXRQYXJzZXIoKS5BZGREaXJlY3RpdmVIYW5kbGVyKHRoaXMsIERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZURpcmVjdGl2ZTxFTEZBc21QYXJzZXIsIEhhbmRsZXI+KTsKKyAgfQorCisgIGJvb2wgUGFyc2VTZWN0aW9uU3dpdGNoKFN0cmluZ1JlZiBTZWN0aW9uLCB1bnNpZ25lZCBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncywgU2VjdGlvbktpbmQgS2luZCk7CisKK3B1YmxpYzoKKyAgRUxGQXNtUGFyc2VyKCkge30KKworICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShNQ0FzbVBhcnNlciAmUGFyc2VyKSB7CisgICAgLy8gQ2FsbCB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB0aGlzLT5NQ0FzbVBhcnNlckV4dGVuc2lvbjo6SW5pdGlhbGl6ZShQYXJzZXIpOworCisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRUxGQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVEYXRhPigiLmRhdGEiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZFTEZBc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZVRleHQ+KCIudGV4dCIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkVMRkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlQlNTPigiLmJzcyIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkVMRkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlUm9EYXRhPigiLnJvZGF0YSIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkVMRkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlVERhdGE+KCIudGRhdGEiKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZFTEZBc21QYXJzZXI6OlBhcnNlU2VjdGlvbkRpcmVjdGl2ZVRCU1M+KCIudGJzcyIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkVMRkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlRGF0YVJlbD4oIi5kYXRhLnJlbCIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkVMRkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlRGF0YVJlbFJvPigiLmRhdGEucmVsLnJvIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRUxGQXNtUGFyc2VyOjpQYXJzZVNlY3Rpb25EaXJlY3RpdmVEYXRhUmVsUm9Mb2NhbD4oIi5kYXRhLnJlbC5yby5sb2NhbCIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkVMRkFzbVBhcnNlcjo6UGFyc2VTZWN0aW9uRGlyZWN0aXZlRWhGcmFtZT4oIi5laF9mcmFtZSIpOworICAgIEFkZERpcmVjdGl2ZUhhbmRsZXI8JkVMRkFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVTZWN0aW9uPigiLnNlY3Rpb24iKTsKKyAgICBBZGREaXJlY3RpdmVIYW5kbGVyPCZFTEZBc21QYXJzZXI6OlBhcnNlRGlyZWN0aXZlU2l6ZT4oIi5zaXplIik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRUxGQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUxFQjEyOD4oIi5zbGViMTI4Iik7CisgICAgQWRkRGlyZWN0aXZlSGFuZGxlcjwmRUxGQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUxFQjEyOD4oIi51bGViMTI4Iik7CisgIH0KKworICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZURhdGEoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIi5kYXRhIiwgTUNTZWN0aW9uRUxGOjpTSFRfUFJPR0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9XUklURSB8TUNTZWN0aW9uRUxGOjpTSEZfQUxMT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZDo6Z2V0RGF0YVJlbCgpKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZVRleHQoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIi50ZXh0IiwgTUNTZWN0aW9uRUxGOjpTSFRfUFJPR0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9FWEVDSU5TVFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfQUxMT0MsIFNlY3Rpb25LaW5kOjpnZXRUZXh0KCkpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlQlNTKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCIuYnNzIiwgTUNTZWN0aW9uRUxGOjpTSFRfTk9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfV1JJVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfQUxMT0MsIFNlY3Rpb25LaW5kOjpnZXRCU1MoKSk7CisgIH0KKyAgYm9vbCBQYXJzZVNlY3Rpb25EaXJlY3RpdmVSb0RhdGEoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIi5yb2RhdGEiLCBNQ1NlY3Rpb25FTEY6OlNIVF9QUk9HQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX0FMTE9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQ6OmdldFJlYWRPbmx5KCkpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlVERhdGEoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIi50ZGF0YSIsIE1DU2VjdGlvbkVMRjo6U0hUX1BST0dCSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfQUxMT0MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfVExTIHwgTUNTZWN0aW9uRUxGOjpTSEZfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZDo6Z2V0VGhyZWFkRGF0YSgpKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZVRCU1MoU3RyaW5nUmVmLCBTTUxvYykgeworICAgIHJldHVybiBQYXJzZVNlY3Rpb25Td2l0Y2goIi50YnNzIiwgTUNTZWN0aW9uRUxGOjpTSFRfTk9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfQUxMT0MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfVExTIHwgTUNTZWN0aW9uRUxGOjpTSEZfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZDo6Z2V0VGhyZWFkQlNTKCkpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlRGF0YVJlbChTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiLmRhdGEucmVsIiwgTUNTZWN0aW9uRUxGOjpTSFRfUFJPR0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9BTExPQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kOjpnZXREYXRhUmVsKCkpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlRGF0YVJlbFJvKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCIuZGF0YS5yZWwucm8iLCBNQ1NlY3Rpb25FTEY6OlNIVF9QUk9HQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX0FMTE9DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQ6OmdldFJlYWRPbmx5V2l0aFJlbCgpKTsKKyAgfQorICBib29sIFBhcnNlU2VjdGlvbkRpcmVjdGl2ZURhdGFSZWxSb0xvY2FsKFN0cmluZ1JlZiwgU01Mb2MpIHsKKyAgICByZXR1cm4gUGFyc2VTZWN0aW9uU3dpdGNoKCIuZGF0YS5yZWwucm8ubG9jYWwiLCBNQ1NlY3Rpb25FTEY6OlNIVF9QUk9HQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX0FMTE9DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQ6OmdldFJlYWRPbmx5V2l0aFJlbExvY2FsKCkpOworICB9CisgIGJvb2wgUGFyc2VTZWN0aW9uRGlyZWN0aXZlRWhGcmFtZShTdHJpbmdSZWYsIFNNTG9jKSB7CisgICAgcmV0dXJuIFBhcnNlU2VjdGlvblN3aXRjaCgiLmVoX2ZyYW1lIiwgTUNTZWN0aW9uRUxGOjpTSFRfUFJPR0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9BTExPQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kOjpnZXREYXRhUmVsKCkpOworICB9CisgIGJvb2wgUGFyc2VEaXJlY3RpdmVMRUIxMjgoU3RyaW5nUmVmLCBTTUxvYyk7CisgIGJvb2wgUGFyc2VEaXJlY3RpdmVTZWN0aW9uKFN0cmluZ1JlZiwgU01Mb2MpOworICBib29sIFBhcnNlRGlyZWN0aXZlU2l6ZShTdHJpbmdSZWYsIFNNTG9jKTsKK307CisKK30KKworYm9vbCBFTEZBc21QYXJzZXI6OlBhcnNlU2VjdGlvblN3aXRjaChTdHJpbmdSZWYgU2VjdGlvbiwgdW5zaWduZWQgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsIFNlY3Rpb25LaW5kIEtpbmQpIHsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gc2VjdGlvbiBzd2l0Y2hpbmcgZGlyZWN0aXZlIik7CisgIExleCgpOworCisgIGdldFN0cmVhbWVyKCkuU3dpdGNoU2VjdGlvbihnZXRDb250ZXh0KCkuZ2V0RUxGU2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbiwgVHlwZSwgRmxhZ3MsIEtpbmQpKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRUxGQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZVNpemUoU3RyaW5nUmVmLCBTTUxvYykgeworICBTdHJpbmdSZWYgTmFtZTsKKyAgaWYgKGdldFBhcnNlcigpLlBhcnNlSWRlbnRpZmllcihOYW1lKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIGlkZW50aWZpZXIgaW4gZGlyZWN0aXZlIik7CisgIE1DU3ltYm9sICpTeW0gPSBnZXRDb250ZXh0KCkuR2V0T3JDcmVhdGVTeW1ib2woTmFtZSk7OworCisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpDb21tYSkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJ1bmV4cGVjdGVkIHRva2VuIGluIGRpcmVjdGl2ZSIpOworICBMZXgoKTsKKworICBjb25zdCBNQ0V4cHIgKkV4cHI7CisgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUV4cHJlc3Npb24oRXhwcikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gVG9rRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gaW4gZGlyZWN0aXZlIik7CisKKyAgZ2V0U3RyZWFtZXIoKS5FbWl0RUxGU2l6ZShTeW0sIEV4cHIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEZJWE1FOiBUaGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcy4KK2Jvb2wgRUxGQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZVNlY3Rpb24oU3RyaW5nUmVmLCBTTUxvYykgeworICBTdHJpbmdSZWYgU2VjdGlvbk5hbWU7CisgIC8vIEZJWE1FOiBUaGlzIGRvZXNuJ3QgcGFyc2Ugc2VjdGlvbiBuYW1lcyBsaWtlICIubm90ZS5HTlUtc3RhY2siIGNvcnJlY3RseS4KKyAgaWYgKGdldFBhcnNlcigpLlBhcnNlSWRlbnRpZmllcihTZWN0aW9uTmFtZSkpCisgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBpZGVudGlmaWVyIGluIGRpcmVjdGl2ZSIpOworCisgIHN0ZDo6c3RyaW5nIEZsYWdzU3RyOworICBTdHJpbmdSZWYgVHlwZU5hbWU7CisgIGludDY0X3QgU2l6ZSA9IDA7CisgIGlmIChnZXRMZXhlcigpLmlzKEFzbVRva2VuOjpDb21tYSkpIHsKKyAgICBMZXgoKTsKKworICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpTdHJpbmcpKQorICAgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBzdHJpbmcgaW4gZGlyZWN0aXZlIik7CisKKyAgICBGbGFnc1N0ciA9IGdldFRvaygpLmdldFN0cmluZ0NvbnRlbnRzKCk7CisgICAgTGV4KCk7CisKKyAgICBBc21Ub2tlbjo6VG9rZW5LaW5kIFR5cGVTdGFydFRva2VuOworICAgIGlmIChnZXRDb250ZXh0KCkuZ2V0QXNtSW5mbygpLmdldENvbW1lbnRTdHJpbmcoKVswXSA9PSAnQCcpCisgICAgICBUeXBlU3RhcnRUb2tlbiA9IEFzbVRva2VuOjpQZXJjZW50OworICAgIGVsc2UKKyAgICAgIFR5cGVTdGFydFRva2VuID0gQXNtVG9rZW46OkF0OworCisgICAgaWYgKGdldExleGVyKCkuaXMoQXNtVG9rZW46OkNvbW1hKSkgeworICAgICAgTGV4KCk7CisgICAgICBpZiAoZ2V0TGV4ZXIoKS5pcyhUeXBlU3RhcnRUb2tlbikpIHsKKyAgICAgICAgTGV4KCk7CisgICAgICAgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUlkZW50aWZpZXIoVHlwZU5hbWUpKQorICAgICAgICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgaWRlbnRpZmllciBpbiBkaXJlY3RpdmUiKTsKKworICAgICAgICBpZiAoZ2V0TGV4ZXIoKS5pcyhBc21Ub2tlbjo6Q29tbWEpKSB7CisgICAgICAgICAgTGV4KCk7CisKKyAgICAgICAgICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oU2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgIGlmIChTaXplIDw9IDApCisgICAgICAgICAgICByZXR1cm4gVG9rRXJyb3IoInNlY3Rpb24gc2l6ZSBtdXN0IGJlIHBvc2l0aXZlIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiBkaXJlY3RpdmUiKTsKKworICB1bnNpZ25lZCBGbGFncyA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBGbGFnc1N0ci5zaXplKCk7IGkrKykgeworICAgIHN3aXRjaCAoRmxhZ3NTdHJbaV0pIHsKKyAgICBjYXNlICdhJzoKKyAgICAgIEZsYWdzIHw9IE1DU2VjdGlvbkVMRjo6U0hGX0FMTE9DOworICAgICAgYnJlYWs7CisgICAgY2FzZSAneCc6CisgICAgICBGbGFncyB8PSBNQ1NlY3Rpb25FTEY6OlNIRl9FWEVDSU5TVFI7CisgICAgICBicmVhazsKKyAgICBjYXNlICd3JzoKKyAgICAgIEZsYWdzIHw9IE1DU2VjdGlvbkVMRjo6U0hGX1dSSVRFOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnTSc6CisgICAgICBGbGFncyB8PSBNQ1NlY3Rpb25FTEY6OlNIRl9NRVJHRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1MnOgorICAgICAgRmxhZ3MgfD0gTUNTZWN0aW9uRUxGOjpTSEZfU1RSSU5HUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1QnOgorICAgICAgRmxhZ3MgfD0gTUNTZWN0aW9uRUxGOjpTSEZfVExTOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnYyc6CisgICAgICBGbGFncyB8PSBNQ1NlY3Rpb25FTEY6OlhDT1JFX1NIRl9DUF9TRUNUSU9OOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6CisgICAgICBGbGFncyB8PSBNQ1NlY3Rpb25FTEY6OlhDT1JFX1NIRl9EUF9TRUNUSU9OOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBUb2tFcnJvcigidW5rbm93biBmbGFnIik7CisgICAgfQorICB9CisKKyAgdW5zaWduZWQgVHlwZSA9IE1DU2VjdGlvbkVMRjo6U0hUX05VTEw7CisgIGlmICghVHlwZU5hbWUuZW1wdHkoKSkgeworICAgIGlmIChUeXBlTmFtZSA9PSAiaW5pdF9hcnJheSIpCisgICAgICBUeXBlID0gTUNTZWN0aW9uRUxGOjpTSFRfSU5JVF9BUlJBWTsKKyAgICBlbHNlIGlmIChUeXBlTmFtZSA9PSAiZmluaV9hcnJheSIpCisgICAgICBUeXBlID0gTUNTZWN0aW9uRUxGOjpTSFRfRklOSV9BUlJBWTsKKyAgICBlbHNlIGlmIChUeXBlTmFtZSA9PSAicHJlaW5pdF9hcnJheSIpCisgICAgICBUeXBlID0gTUNTZWN0aW9uRUxGOjpTSFRfUFJFSU5JVF9BUlJBWTsKKyAgICBlbHNlIGlmIChUeXBlTmFtZSA9PSAibm9iaXRzIikKKyAgICAgIFR5cGUgPSBNQ1NlY3Rpb25FTEY6OlNIVF9OT0JJVFM7CisgICAgZWxzZSBpZiAoVHlwZU5hbWUgPT0gInByb2diaXRzIikKKyAgICAgIFR5cGUgPSBNQ1NlY3Rpb25FTEY6OlNIVF9QUk9HQklUUzsKKyAgICBlbHNlCisgICAgICByZXR1cm4gVG9rRXJyb3IoInVua25vd24gc2VjdGlvbiB0eXBlIik7CisgIH0KKworICBTZWN0aW9uS2luZCBLaW5kID0gKEZsYWdzICYgTUNTZWN0aW9uRUxGOjpTSEZfRVhFQ0lOU1RSKQorICAgICAgICAgICAgICAgICAgICAgPyBTZWN0aW9uS2luZDo6Z2V0VGV4dCgpCisgICAgICAgICAgICAgICAgICAgICA6IFNlY3Rpb25LaW5kOjpnZXREYXRhUmVsKCk7CisgIGdldFN0cmVhbWVyKCkuU3dpdGNoU2VjdGlvbihnZXRDb250ZXh0KCkuZ2V0RUxGU2VjdGlvbihTZWN0aW9uTmFtZSwgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLCBLaW5kLCBmYWxzZSkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRUxGQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZUxFQjEyOChTdHJpbmdSZWYgRGlyTmFtZSwgU01Mb2MpIHsKKyAgaW50NjRfdCBWYWx1ZTsKKyAgaWYgKGdldFBhcnNlcigpLlBhcnNlQWJzb2x1dGVFeHByZXNzaW9uKFZhbHVlKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgIHJldHVybiBUb2tFcnJvcigidW5leHBlY3RlZCB0b2tlbiBpbiBkaXJlY3RpdmUiKTsKKworICAvLyBGSVhNRTogQWRkIHByb3BlciBNQyBzdXBwb3J0LgorICBpZiAoZ2V0Q29udGV4dCgpLmdldEFzbUluZm8oKS5oYXNMRUIxMjgoKSkgeworICAgIGlmIChEaXJOYW1lWzFdID09ICdzJykKKyAgICAgIGdldFN0cmVhbWVyKCkuRW1pdFJhd1RleHQoIlx0LnNsZWIxMjhcdCIgKyBUd2luZShWYWx1ZSkpOworICAgIGVsc2UKKyAgICAgIGdldFN0cmVhbWVyKCkuRW1pdFJhd1RleHQoIlx0LnVsZWIxMjhcdCIgKyBUd2luZShWYWx1ZSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgYW4gZXJyb3IhCisgIHJldHVybiBUb2tFcnJvcigiTEVCMTI4IG5vdCBzdXBwb3J0ZWQgeWV0Iik7Cit9CisKK25hbWVzcGFjZSBsbHZtIHsKKworTUNBc21QYXJzZXJFeHRlbnNpb24gKmNyZWF0ZUVMRkFzbVBhcnNlcigpIHsKKyAgcmV0dXJuIG5ldyBFTEZBc21QYXJzZXI7Cit9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2VlY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuY3BwCkBAIC0wLDAgKzEsMjcgQEAKKy8vPT09LS0gTUNBc21MZXhlci5jcHAgLSBBYnN0cmFjdCBBc20gTGV4ZXIgSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNQ0FzbUxleGVyOjpNQ0FzbUxleGVyKCkgOiBDdXJUb2soQXNtVG9rZW46OkVycm9yLCBTdHJpbmdSZWYoKSksIFRva1N0YXJ0KDApIHsKK30KKworTUNBc21MZXhlcjo6fk1DQXNtTGV4ZXIoKSB7Cit9CisKK1NNTG9jIE1DQXNtTGV4ZXI6OmdldExvYygpIGNvbnN0IHsKKyAgcmV0dXJuIFNNTG9jOjpnZXRGcm9tUG9pbnRlcihUb2tTdGFydCk7Cit9CisKK1NNTG9jIEFzbVRva2VuOjpnZXRMb2MoKSBjb25zdCB7CisgIHJldHVybiBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoU3RyLmRhdGEoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNQYXJzZXIvTUNBc21QYXJzZXIuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQ0ZmNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmNwcApAQCAtMCwwICsxLDQ4IEBACisvLz09PS0tIE1DQXNtUGFyc2VyLmNwcCAtIEFic3RyYWN0IEFzbSBQYXJzZXIgSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ1BhcnNlZEFzbU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtUGFyc2VyLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworTUNBc21QYXJzZXI6Ok1DQXNtUGFyc2VyKCkgOiBUYXJnZXRQYXJzZXIoMCkgeworfQorCitNQ0FzbVBhcnNlcjo6fk1DQXNtUGFyc2VyKCkgeworfQorCit2b2lkIE1DQXNtUGFyc2VyOjpzZXRUYXJnZXRQYXJzZXIoVGFyZ2V0QXNtUGFyc2VyICZQKSB7CisgIGFzc2VydCghVGFyZ2V0UGFyc2VyICYmICJUYXJnZXQgcGFyc2VyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQhIik7CisgIFRhcmdldFBhcnNlciA9ICZQOworICBUYXJnZXRQYXJzZXItPkluaXRpYWxpemUoKnRoaXMpOworfQorCitjb25zdCBBc21Ub2tlbiAmTUNBc21QYXJzZXI6OmdldFRvaygpIHsKKyAgcmV0dXJuIGdldExleGVyKCkuZ2V0VG9rKCk7Cit9CisKK2Jvb2wgTUNBc21QYXJzZXI6OlRva0Vycm9yKGNvbnN0IFR3aW5lICZNc2cpIHsKKyAgRXJyb3IoZ2V0TGV4ZXIoKS5nZXRMb2MoKSwgTXNnKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTUNBc21QYXJzZXI6OlBhcnNlRXhwcmVzc2lvbihjb25zdCBNQ0V4cHIgKiZSZXMpIHsKKyAgU01Mb2MgTDsKKyAgcmV0dXJuIFBhcnNlRXhwcmVzc2lvbihSZXMsIEwpOworfQorCisvLy8gZ2V0U3RhcnRMb2MgLSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGlzIG9wZXJhbmQuCitTTUxvYyBNQ1BhcnNlZEFzbU9wZXJhbmQ6OmdldFN0YXJ0TG9jKCkgY29uc3QgeyByZXR1cm4gU01Mb2MoKTsgfQorU01Mb2MgTUNQYXJzZWRBc21PcGVyYW5kOjpnZXRFbmRMb2MoKSBjb25zdCB7IHJldHVybiBTTUxvYygpOyB9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL01DQXNtUGFyc2VyRXh0ZW5zaW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlckV4dGVuc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwZDMwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlckV4dGVuc2lvbi5jcHAKQEAgLTAsMCArMSwyMSBAQAorLy89PT0tLSBNQ0FzbVBhcnNlckV4dGVuc2lvbi5jcHAgLSBBc20gUGFyc2VyIEhvb2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXJFeHRlbnNpb24uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNQ0FzbVBhcnNlckV4dGVuc2lvbjo6TUNBc21QYXJzZXJFeHRlbnNpb24oKSB7Cit9CisKK01DQXNtUGFyc2VyRXh0ZW5zaW9uOjp+TUNBc21QYXJzZXJFeHRlbnNpb24oKSB7Cit9CisKK3ZvaWQgTUNBc21QYXJzZXJFeHRlbnNpb246OkluaXRpYWxpemUoTUNBc21QYXJzZXIgJlBhcnNlcikgeworICB0aGlzLT5QYXJzZXIgPSAmUGFyc2VyOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL01DL01DUGFyc2VyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Nzc3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNQYXJzZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9NQy9NQ1BhcnNlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNTUNQYXJzZXIKK0JVSUxEX0FSQ0hJVkUgOj0gMQorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNQYXJzZXIvVGFyZ2V0QXNtUGFyc2VyLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ1BhcnNlci9UYXJnZXRBc21QYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNDNjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNQYXJzZXIvVGFyZ2V0QXNtUGFyc2VyLmNwcApAQCAtMCwwICsxLDE5IEBACisvLz09PS0tIFRhcmdldEFzbVBhcnNlci5jcHAgLSBUYXJnZXQgQXNzZW1ibHkgUGFyc2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtUGFyc2VyLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGFyZ2V0QXNtUGFyc2VyOjpUYXJnZXRBc21QYXJzZXIoY29uc3QgVGFyZ2V0ICZUKSAKKyAgOiBUaGVUYXJnZXQoVCksIEF2YWlsYWJsZUZlYXR1cmVzKDApCit7Cit9CisKK1RhcmdldEFzbVBhcnNlcjo6flRhcmdldEFzbVBhcnNlcigpIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ1NlY3Rpb24uY3BwIGIvc3JjL0xMVk0vbGliL01DL01DU2VjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5MmQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NQ1NlY3Rpb24uY3BwCkBAIC0wLDAgKzEsMjIgQEAKKy8vPT09LSBsaWIvTUMvTUNTZWN0aW9uLmNwcCAtIE1hY2hpbmUgQ29kZSBTZWN0aW9uIFJlcHJlc2VudGF0aW9uIC0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUNTZWN0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNQ1NlY3Rpb246On5NQ1NlY3Rpb24oKSB7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ1NlY3Rpb25DT0ZGLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ1NlY3Rpb25DT0ZGLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjUzMTYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DU2VjdGlvbkNPRkYuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8vPT09LSBsaWIvTUMvTUNTZWN0aW9uQ09GRi5jcHAgLSBDT0ZGIENvZGUgU2VjdGlvbiBSZXByZXNlbnRhdGlvbiAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbkNPRkYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01DU2VjdGlvbkNPRkY6On5NQ1NlY3Rpb25DT0ZGKCkge30gLy8gYW5jaG9yLgorCisvLyBTaG91bGRPbWl0U2VjdGlvbkRpcmVjdGl2ZSAtIERlY2lkZXMgd2hldGhlciBhICcuc2VjdGlvbicgZGlyZWN0aXZlCisvLyBzaG91bGQgYmUgcHJpbnRlZCBiZWZvcmUgdGhlIHNlY3Rpb24gbmFtZQorYm9vbCBNQ1NlY3Rpb25DT0ZGOjpTaG91bGRPbWl0U2VjdGlvbkRpcmVjdGl2ZShTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICZNQUkpIGNvbnN0IHsKKyAgCisgIC8vIEZJWE1FOiBEb2VzIC5zZWN0aW9uIC5ic3MvLmRhdGEvLnRleHQgd29yayBldmVyeXdoZXJlPz8KKyAgaWYgKE5hbWUgPT0gIi50ZXh0IiB8fCBOYW1lID09ICIuZGF0YSIgfHwgTmFtZSA9PSAiLmJzcyIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE1DU2VjdGlvbkNPRkY6OlByaW50U3dpdGNoVG9TZWN0aW9uKGNvbnN0IE1DQXNtSW5mbyAmTUFJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgCisgIC8vIHN0YW5kYXJkIHNlY3Rpb25zIGRvbid0IHJlcXVpcmUgdGhlICcuc2VjdGlvbicKKyAgaWYgKFNob3VsZE9taXRTZWN0aW9uRGlyZWN0aXZlKFNlY3Rpb25OYW1lLCBNQUkpKSB7CisgICAgT1MgPDwgJ1x0JyA8PCBnZXRTZWN0aW9uTmFtZSgpIDw8ICdcbic7CisgICAgcmV0dXJuOworICB9CisKKyAgT1MgPDwgIlx0LnNlY3Rpb25cdCIgPDwgZ2V0U2VjdGlvbk5hbWUoKSA8PCAiLFwiIjsKKyAgaWYgKGdldEtpbmQoKS5pc1RleHQoKSkKKyAgICBPUyA8PCAneCc7CisgIGlmIChnZXRLaW5kKCkuaXNXcml0ZWFibGUoKSkKKyAgICBPUyA8PCAndyc7CisgIGVsc2UKKyAgICBPUyA8PCAncic7CisgIGlmIChnZXRDaGFyYWN0ZXJpc3RpY3MoKSAmIENPRkY6OklNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUpCisgICAgT1MgPDwgJ24nOworICBPUyA8PCAiXCJcbiI7CisgIAorICBpZiAoZ2V0Q2hhcmFjdGVyaXN0aWNzKCkgJiBDT0ZGOjpJTUFHRV9TQ05fTE5LX0NPTURBVCkgeworICAgIHN3aXRjaCAoU2VsZWN0aW9uKSB7CisgICAgICBjYXNlIENPRkY6OklNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTOgorICAgICAgICBPUyA8PCAiXHQubGlua29uY2Ugb25lX29ubHlcbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDT0ZGOjpJTUFHRV9DT01EQVRfU0VMRUNUX0FOWToKKyAgICAgICAgT1MgPDwgIlx0LmxpbmtvbmNlIGRpc2NhcmRcbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDT0ZGOjpJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRToKKyAgICAgICAgT1MgPDwgIlx0LmxpbmtvbmNlIHNhbWVfc2l6ZVxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENPRkY6OklNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0g6CisgICAgICAgIE9TIDw8ICJcdC5saW5rb25jZSBzYW1lX2NvbnRlbnRzXG4iOworICAgICAgICBicmVhazsKKyAgICAvL05PVEU6IGFzIG9mIGJpbnV0aWxzIDIuMjAsIHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZpeSBzZWxlY3QgbGFyZ2VzdAorICAgIC8vICAgICAgd2l0aCB0aGUgLmxpbmtvbmNlIGRpcmVjdGl2ZS4gRm9yIG5vdywgd2UgdHJlYXQgaXQgYXMgYW4gaW52YWxpZAorICAgIC8vICAgICAgY29tZGF0IHNlbGVjdGlvbiB2YWx1ZS4KKyAgICAgIGNhc2UgQ09GRjo6SU1BR0VfQ09NREFUX1NFTEVDVF9MQVJHRVNUOgorICAgIC8vICBPUyA8PCAiXHQubGlua29uY2UgbGFyZ2VzdFxuIjsKKyAgICAvLyAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQgKDAgJiYgInVuc3VwcG9ydGVkIENPRkYgc2VsZWN0aW9uIHR5cGUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNTZWN0aW9uRUxGLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ1NlY3Rpb25FTEYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTk5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNTZWN0aW9uRUxGLmNwcApAQCAtMCwwICsxLDEzNSBAQAorLy89PT0tIGxpYi9NQy9NQ1NlY3Rpb25FTEYuY3BwIC0gRUxGIENvZGUgU2VjdGlvbiBSZXByZXNlbnRhdGlvbiAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uRUxGLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNQ1NlY3Rpb25FTEY6On5NQ1NlY3Rpb25FTEYoKSB7fSAvLyBhbmNob3IuCisKKy8vIFNob3VsZE9taXRTZWN0aW9uRGlyZWN0aXZlIC0gRGVjaWRlcyB3aGV0aGVyIGEgJy5zZWN0aW9uJyBkaXJlY3RpdmUKKy8vIHNob3VsZCBiZSBwcmludGVkIGJlZm9yZSB0aGUgc2VjdGlvbiBuYW1lCitib29sIE1DU2VjdGlvbkVMRjo6U2hvdWxkT21pdFNlY3Rpb25EaXJlY3RpdmUoU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICZNQUkpIGNvbnN0IHsKKyAgCisgIC8vIEZJWE1FOiBEb2VzIC5zZWN0aW9uIC5ic3MvLmRhdGEvLnRleHQgd29yayBldmVyeXdoZXJlPz8KKyAgaWYgKE5hbWUgPT0gIi50ZXh0IiB8fCBOYW1lID09ICIuZGF0YSIgfHwKKyAgICAgIChOYW1lID09ICIuYnNzIiAmJiAhTUFJLnVzZXNFTEZTZWN0aW9uRGlyZWN0aXZlRm9yQlNTKCkpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8gU2hvdWxkUHJpbnRTZWN0aW9uVHlwZSAtIE9ubHkgcHJpbnRzIHRoZSBzZWN0aW9uIHR5cGUgaWYgc3VwcG9ydGVkCitib29sIE1DU2VjdGlvbkVMRjo6U2hvdWxkUHJpbnRTZWN0aW9uVHlwZSh1bnNpZ25lZCBUeSkgY29uc3QgeworICBpZiAoSXNFeHBsaWNpdCAmJiAhKFR5ID09IFNIVF9OT0JJVFMgfHwgVHkgPT0gU0hUX1BST0dCSVRTKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTUNTZWN0aW9uRUxGOjpQcmludFN3aXRjaFRvU2VjdGlvbihjb25zdCBNQ0FzbUluZm8gJk1BSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgIAorICBpZiAoU2hvdWxkT21pdFNlY3Rpb25EaXJlY3RpdmUoU2VjdGlvbk5hbWUsIE1BSSkpIHsKKyAgICBPUyA8PCAnXHQnIDw8IGdldFNlY3Rpb25OYW1lKCkgPDwgJ1xuJzsKKyAgICByZXR1cm47CisgIH0KKworICBPUyA8PCAiXHQuc2VjdGlvblx0IiA8PCBnZXRTZWN0aW9uTmFtZSgpOworICAKKyAgLy8gSGFuZGxlIHRoZSB3ZWlyZCBzb2xhcmlzIHN5bnRheCBpZiBkZXNpcmVkLgorICBpZiAoTUFJLnVzZXNTdW5TdHlsZUVMRlNlY3Rpb25Td2l0Y2hTeW50YXgoKSAmJiAKKyAgICAgICEoRmxhZ3MgJiBNQ1NlY3Rpb25FTEY6OlNIRl9NRVJHRSkpIHsKKyAgICBpZiAoRmxhZ3MgJiBNQ1NlY3Rpb25FTEY6OlNIRl9BTExPQykKKyAgICAgIE9TIDw8ICIsI2FsbG9jIjsKKyAgICBpZiAoRmxhZ3MgJiBNQ1NlY3Rpb25FTEY6OlNIRl9FWEVDSU5TVFIpCisgICAgICBPUyA8PCAiLCNleGVjaW5zdHIiOworICAgIGlmIChGbGFncyAmIE1DU2VjdGlvbkVMRjo6U0hGX1dSSVRFKQorICAgICAgT1MgPDwgIiwjd3JpdGUiOworICAgIGlmIChGbGFncyAmIE1DU2VjdGlvbkVMRjo6U0hGX1RMUykKKyAgICAgIE9TIDw8ICIsI3RscyI7CisgICAgT1MgPDwgJ1xuJzsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIE9TIDw8ICIsXCIiOworICBpZiAoRmxhZ3MgJiBNQ1NlY3Rpb25FTEY6OlNIRl9BTExPQykKKyAgICBPUyA8PCAnYSc7CisgIGlmIChGbGFncyAmIE1DU2VjdGlvbkVMRjo6U0hGX0VYRUNJTlNUUikKKyAgICBPUyA8PCAneCc7CisgIGlmIChGbGFncyAmIE1DU2VjdGlvbkVMRjo6U0hGX1dSSVRFKQorICAgIE9TIDw8ICd3JzsKKyAgaWYgKEZsYWdzICYgTUNTZWN0aW9uRUxGOjpTSEZfTUVSR0UpCisgICAgT1MgPDwgJ00nOworICBpZiAoRmxhZ3MgJiBNQ1NlY3Rpb25FTEY6OlNIRl9TVFJJTkdTKQorICAgIE9TIDw8ICdTJzsKKyAgaWYgKEZsYWdzICYgTUNTZWN0aW9uRUxGOjpTSEZfVExTKQorICAgIE9TIDw8ICdUJzsKKyAgCisgIC8vIElmIHRoZXJlIGFyZSB0YXJnZXQtc3BlY2lmaWMgZmxhZ3MsIHByaW50IHRoZW0uCisgIGlmIChGbGFncyAmIE1DU2VjdGlvbkVMRjo6WENPUkVfU0hGX0NQX1NFQ1RJT04pCisgICAgT1MgPDwgJ2MnOworICBpZiAoRmxhZ3MgJiBNQ1NlY3Rpb25FTEY6OlhDT1JFX1NIRl9EUF9TRUNUSU9OKQorICAgIE9TIDw8ICdkJzsKKyAgCisgIE9TIDw8ICciJzsKKworICBpZiAoU2hvdWxkUHJpbnRTZWN0aW9uVHlwZShUeXBlKSkgeworICAgIE9TIDw8ICcsJzsKKyAKKyAgICAvLyBJZiBjb21tZW50IHN0cmluZyBpcyAnQCcsIGUuZy4gYXMgb24gQVJNIC0gdXNlICclJyBpbnN0ZWFkCisgICAgaWYgKE1BSS5nZXRDb21tZW50U3RyaW5nKClbMF0gPT0gJ0AnKQorICAgICAgT1MgPDwgJyUnOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICdAJzsKKyAgCisgICAgaWYgKFR5cGUgPT0gTUNTZWN0aW9uRUxGOjpTSFRfSU5JVF9BUlJBWSkKKyAgICAgIE9TIDw8ICJpbml0X2FycmF5IjsKKyAgICBlbHNlIGlmIChUeXBlID09IE1DU2VjdGlvbkVMRjo6U0hUX0ZJTklfQVJSQVkpCisgICAgICBPUyA8PCAiZmluaV9hcnJheSI7CisgICAgZWxzZSBpZiAoVHlwZSA9PSBNQ1NlY3Rpb25FTEY6OlNIVF9QUkVJTklUX0FSUkFZKQorICAgICAgT1MgPDwgInByZWluaXRfYXJyYXkiOworICAgIGVsc2UgaWYgKFR5cGUgPT0gTUNTZWN0aW9uRUxGOjpTSFRfTk9CSVRTKQorICAgICAgT1MgPDwgIm5vYml0cyI7CisgICAgZWxzZSBpZiAoVHlwZSA9PSBNQ1NlY3Rpb25FTEY6OlNIVF9QUk9HQklUUykKKyAgICAgIE9TIDw8ICJwcm9nYml0cyI7CisgIAorICAgIGlmIChnZXRLaW5kKCkuaXNNZXJnZWFibGUxQnl0ZUNTdHJpbmcoKSkgeworICAgICAgT1MgPDwgIiwxIjsKKyAgICB9IGVsc2UgaWYgKGdldEtpbmQoKS5pc01lcmdlYWJsZTJCeXRlQ1N0cmluZygpKSB7CisgICAgICBPUyA8PCAiLDIiOworICAgIH0gZWxzZSBpZiAoZ2V0S2luZCgpLmlzTWVyZ2VhYmxlNEJ5dGVDU3RyaW5nKCkgfHwgCisgICAgICAgICAgICAgICBnZXRLaW5kKCkuaXNNZXJnZWFibGVDb25zdDQoKSkgeworICAgICAgT1MgPDwgIiw0IjsKKyAgICB9IGVsc2UgaWYgKGdldEtpbmQoKS5pc01lcmdlYWJsZUNvbnN0OCgpKSB7CisgICAgICBPUyA8PCAiLDgiOworICAgIH0gZWxzZSBpZiAoZ2V0S2luZCgpLmlzTWVyZ2VhYmxlQ29uc3QxNigpKSB7CisgICAgICBPUyA8PCAiLDE2IjsKKyAgICB9CisgIH0KKyAgCisgIE9TIDw8ICdcbic7Cit9CisKKy8vIEhhc0NvbW1vblN5bWJvbHMgLSBUcnVlIGlmIHRoaXMgc2VjdGlvbiBob2xkcyBjb21tb24gc3ltYm9scywgdGhpcyBpcworLy8gaW5kaWNhdGVkIG9uIHRoZSBFTEYgb2JqZWN0IGZpbGUgYnkgYSBzeW1ib2wgd2l0aCBTSE5fQ09NTU9OIHNlY3Rpb24gCisvLyBoZWFkZXIgaW5kZXguCitib29sIE1DU2VjdGlvbkVMRjo6SGFzQ29tbW9uU3ltYm9scygpIGNvbnN0IHsKKyAgCisgIGlmIChTdHJpbmdSZWYoU2VjdGlvbk5hbWUpLnN0YXJ0c3dpdGgoIi5nbnUubGlua29uY2UuIikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ1NlY3Rpb25NYWNoTy5jcHAgYi9zcmMvTExWTS9saWIvTUMvTUNTZWN0aW9uTWFjaE8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDNiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTUNTZWN0aW9uTWFjaE8uY3BwCkBAIC0wLDAgKzEsMjg2IEBACisvLz09PS0gbGliL01DL01DU2VjdGlvbk1hY2hPLmNwcCAtIE1hY2hPIENvZGUgU2VjdGlvbiBSZXByZXNlbnRhdGlvbiAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIFNlY3Rpb25UeXBlRGVzY3JpcHRvcnMgLSBUaGVzZSBhcmUgc3RyaW5ncyB0aGF0IGRlc2NyaWJlIHRoZSB2YXJpb3VzIHNlY3Rpb24KKy8vLyB0eXBlcy4gIFRoaXMgKm11c3QqIGJlIGtlcHQgaW4gb3JkZXIgd2l0aCBhbmQgc3RheSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUKKy8vLyBzZWN0aW9uIHR5cGUgbGlzdC4KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpBc3NlbWJsZXJOYW1lLCAqRW51bU5hbWU7Cit9IFNlY3Rpb25UeXBlRGVzY3JpcHRvcnNbTUNTZWN0aW9uTWFjaE86OkxBU1RfS05PV05fU0VDVElPTl9UWVBFKzFdID0geworICB7ICJyZWd1bGFyIiwgICAgICAgICAgICAgICAgICAiU19SRUdVTEFSIiB9LCAgICAgICAgICAgICAgICAgICAgLy8gMHgwMAorICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAiU19aRVJPRklMTCIgfSwgICAgICAgICAgICAgICAgICAgLy8gMHgwMQorICB7ICJjc3RyaW5nX2xpdGVyYWxzIiwgICAgICAgICAiU19DU1RSSU5HX0xJVEVSQUxTIiB9LCAgICAgICAgICAgLy8gMHgwMgorICB7ICI0Ynl0ZV9saXRlcmFscyIsICAgICAgICAgICAiU180QllURV9MSVRFUkFMUyIgfSwgICAgICAgICAgICAgLy8gMHgwMworICB7ICI4Ynl0ZV9saXRlcmFscyIsICAgICAgICAgICAiU184QllURV9MSVRFUkFMUyIgfSwgICAgICAgICAgICAgLy8gMHgwNAorICB7ICJsaXRlcmFsX3BvaW50ZXJzIiwgICAgICAgICAiU19MSVRFUkFMX1BPSU5URVJTIiB9LCAgICAgICAgICAgLy8gMHgwNQorICB7ICJub25fbGF6eV9zeW1ib2xfcG9pbnRlcnMiLCAiU19OT05fTEFaWV9TWU1CT0xfUE9JTlRFUlMiIH0sICAgLy8gMHgwNgorICB7ICJsYXp5X3N5bWJvbF9wb2ludGVycyIsICAgICAiU19MQVpZX1NZTUJPTF9QT0lOVEVSUyIgfSwgICAgICAgLy8gMHgwNworICB7ICJzeW1ib2xfc3R1YnMiLCAgICAgICAgICAgICAiU19TWU1CT0xfU1RVQlMiIH0sICAgICAgICAgICAgICAgLy8gMHgwOAorICB7ICJtb2RfaW5pdF9mdW5jcyIsICAgICAgICAgICAiU19NT0RfSU5JVF9GVU5DX1BPSU5URVJTIiB9LCAgICAgLy8gMHgwOQorICB7ICJtb2RfdGVybV9mdW5jcyIsICAgICAgICAgICAiU19NT0RfVEVSTV9GVU5DX1BPSU5URVJTIiB9LCAgICAgLy8gMHgwQQorICB7ICJjb2FsZXNjZWQiLCAgICAgICAgICAgICAgICAiU19DT0FMRVNDRUQiIH0sICAgICAgICAgICAgICAgICAgLy8gMHgwQgorICB7IDAsIC8qRklYTUU/PyovICAgICAgICAgICAgICAiU19HQl9aRVJPRklMTCIgfSwgICAgICAgICAgICAgICAgLy8gMHgwQworICB7ICJpbnRlcnBvc2luZyIsICAgICAgICAgICAgICAiU19JTlRFUlBPU0lORyIgfSwgICAgICAgICAgICAgICAgLy8gMHgwRAorICB7ICIxNmJ5dGVfbGl0ZXJhbHMiLCAgICAgICAgICAiU18xNkJZVEVfTElURVJBTFMiIH0sICAgICAgICAgICAgLy8gMHgwRQorICB7IDAsIC8qRklYTUU/PyovICAgICAgICAgICAgICAiU19EVFJBQ0VfRE9GIiB9LCAgICAgICAgICAgICAgICAgLy8gMHgwRgorICB7IDAsIC8qRklYTUU/PyovICAgICAgICAgICAgICAiU19MQVpZX0RZTElCX1NZTUJPTF9QT0lOVEVSUyIgfSwgLy8gMHgxMAorICB7ICJ0aHJlYWRfbG9jYWxfcmVndWxhciIsICAgICAiU19USFJFQURfTE9DQUxfUkVHVUxBUiIgfSwgICAgICAgLy8gMHgxMQorICB7ICJ0aHJlYWRfbG9jYWxfemVyb2ZpbGwiLCAgICAiU19USFJFQURfTE9DQUxfWkVST0ZJTEwiIH0sICAgICAgLy8gMHgxMgorICB7ICJ0aHJlYWRfbG9jYWxfdmFyaWFibGVzIiwgICAiU19USFJFQURfTE9DQUxfVkFSSUFCTEVTIiB9LCAgICAgLy8gMHgxMworICB7ICJ0aHJlYWRfbG9jYWxfdmFyaWFibGVfcG9pbnRlcnMiLAorICAgICJTX1RIUkVBRF9MT0NBTF9WQVJJQUJMRV9QT0lOVEVSUyIgfSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgxNAorICB7ICJ0aHJlYWRfbG9jYWxfaW5pdF9mdW5jdGlvbl9wb2ludGVycyIsCisgICAgIlNfVEhSRUFEX0xPQ0FMX0lOSVRfRlVOQ1RJT05fUE9JTlRFUlMifSwgICAgICAgICAgICAgICAgICAgICAvLyAweDE1Cit9OworCisKKy8vLyBTZWN0aW9uQXR0ckRlc2NyaXB0b3JzIC0gVGhpcyBpcyBhbiBhcnJheSBvZiBkZXNjcmlwdG9ycyBmb3Igc2VjdGlvbgorLy8vIGF0dHJpYnV0ZXMuICBVbmxpa2UgdGhlIFNlY3Rpb25UeXBlRGVzY3JpcHRvcnMsIHRoaXMgaXMgbm90IGRpcmVjdGx5IGluZGV4ZWQKKy8vLyBieSBhdHRyaWJ1dGUsIGluc3RlYWQgaXQgaXMgc2VhcmNoZWQuICBUaGUgbGFzdCBlbnRyeSBoYXMgYW4gQXR0ckZsYWdFbmQKKy8vLyBBdHRyRmxhZyB2YWx1ZS4KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICB1bnNpZ25lZCBBdHRyRmxhZzsKKyAgY29uc3QgY2hhciAqQXNzZW1ibGVyTmFtZSwgKkVudW1OYW1lOworfSBTZWN0aW9uQXR0ckRlc2NyaXB0b3JzW10gPSB7CisjZGVmaW5lIEVOVFJZKEFTTU5BTUUsIEVOVU0pIFwKKyAgeyBNQ1NlY3Rpb25NYWNoTzo6RU5VTSwgQVNNTkFNRSwgI0VOVU0gfSwKK0VOVFJZKCJwdXJlX2luc3RydWN0aW9ucyIsICAgU19BVFRSX1BVUkVfSU5TVFJVQ1RJT05TKQorRU5UUlkoIm5vX3RvYyIsICAgICAgICAgICAgICBTX0FUVFJfTk9fVE9DKQorRU5UUlkoInN0cmlwX3N0YXRpY19zeW1zIiwgICBTX0FUVFJfU1RSSVBfU1RBVElDX1NZTVMpCitFTlRSWSgibm9fZGVhZF9zdHJpcCIsICAgICAgIFNfQVRUUl9OT19ERUFEX1NUUklQKQorRU5UUlkoImxpdmVfc3VwcG9ydCIsICAgICAgICBTX0FUVFJfTElWRV9TVVBQT1JUKQorRU5UUlkoInNlbGZfbW9kaWZ5aW5nX2NvZGUiLCBTX0FUVFJfU0VMRl9NT0RJRllJTkdfQ09ERSkKK0VOVFJZKCJkZWJ1ZyIsICAgICAgICAgICAgICAgU19BVFRSX0RFQlVHKQorRU5UUlkoMCAvKkZJWE1FKi8sICAgICAgICAgICBTX0FUVFJfU09NRV9JTlNUUlVDVElPTlMpCitFTlRSWSgwIC8qRklYTUUqLywgICAgICAgICAgIFNfQVRUUl9FWFRfUkVMT0MpCitFTlRSWSgwIC8qRklYTUUqLywgICAgICAgICAgIFNfQVRUUl9MT0NfUkVMT0MpCisjdW5kZWYgRU5UUlkKKyAgeyAwLCAibm9uZSIsIDAgfSwgLy8gdXNlZCBpZiBzZWN0aW9uIGhhcyBubyBhdHRyaWJ1dGVzIGJ1dCBoYXMgYSBzdHViIHNpemUKKyNkZWZpbmUgQXR0ckZsYWdFbmQgMHhmZmZmZmZmZiAvLyBub24gbGVnYWwgdmFsdWUsIG11bHRpcGxlIGF0dHJpYnV0ZSBiaXRzIHNldAorICB7IEF0dHJGbGFnRW5kLCAwLCAwIH0KK307CisKK01DU2VjdGlvbk1hY2hPOjpNQ1NlY3Rpb25NYWNoTyhTdHJpbmdSZWYgU2VnbWVudCwgU3RyaW5nUmVmIFNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVEFBLCB1bnNpZ25lZCByZXNlcnZlZDIsIFNlY3Rpb25LaW5kIEspCisgIDogTUNTZWN0aW9uKFNWX01hY2hPLCBLKSwgVHlwZUFuZEF0dHJpYnV0ZXMoVEFBKSwgUmVzZXJ2ZWQyKHJlc2VydmVkMikgeworICBhc3NlcnQoU2VnbWVudC5zaXplKCkgPD0gMTYgJiYgU2VjdGlvbi5zaXplKCkgPD0gMTYgJiYKKyAgICAgICAgICJTZWdtZW50IG9yIHNlY3Rpb24gc3RyaW5nIHRvbyBsb25nIik7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gMTY7ICsraSkgeworICAgIGlmIChpIDwgU2VnbWVudC5zaXplKCkpCisgICAgICBTZWdtZW50TmFtZVtpXSA9IFNlZ21lbnRbaV07CisgICAgZWxzZQorICAgICAgU2VnbWVudE5hbWVbaV0gPSAwOworICAgIAorICAgIGlmIChpIDwgU2VjdGlvbi5zaXplKCkpCisgICAgICBTZWN0aW9uTmFtZVtpXSA9IFNlY3Rpb25baV07CisgICAgZWxzZQorICAgICAgU2VjdGlvbk5hbWVbaV0gPSAwOworICB9ICAgICAgICAKK30KKwordm9pZCBNQ1NlY3Rpb25NYWNoTzo6UHJpbnRTd2l0Y2hUb1NlY3Rpb24oY29uc3QgTUNBc21JbmZvICZNQUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIlx0LnNlY3Rpb25cdCIgPDwgZ2V0U2VnbWVudE5hbWUoKSA8PCAnLCcgPDwgZ2V0U2VjdGlvbk5hbWUoKTsKKyAgCisgIC8vIEdldCB0aGUgc2VjdGlvbiB0eXBlIGFuZCBhdHRyaWJ1dGVzLgorICB1bnNpZ25lZCBUQUEgPSBnZXRUeXBlQW5kQXR0cmlidXRlcygpOworICBpZiAoVEFBID09IDApIHsKKyAgICBPUyA8PCAnXG4nOworICAgIHJldHVybjsKKyAgfQorCisgIE9TIDw8ICcsJzsKKyAgCisgIHVuc2lnbmVkIFNlY3Rpb25UeXBlID0gVEFBICYgTUNTZWN0aW9uTWFjaE86OlNFQ1RJT05fVFlQRTsKKyAgYXNzZXJ0KFNlY3Rpb25UeXBlIDw9IE1DU2VjdGlvbk1hY2hPOjpMQVNUX0tOT1dOX1NFQ1RJT05fVFlQRSAmJgorICAgICAgICAgIkludmFsaWQgU2VjdGlvblR5cGUgc3BlY2lmaWVkISIpOworCisgIGlmIChTZWN0aW9uVHlwZURlc2NyaXB0b3JzW1NlY3Rpb25UeXBlXS5Bc3NlbWJsZXJOYW1lKQorICAgIE9TIDw8IFNlY3Rpb25UeXBlRGVzY3JpcHRvcnNbU2VjdGlvblR5cGVdLkFzc2VtYmxlck5hbWU7CisgIGVsc2UKKyAgICBPUyA8PCAiPDwiIDw8IFNlY3Rpb25UeXBlRGVzY3JpcHRvcnNbU2VjdGlvblR5cGVdLkVudW1OYW1lIDw8ICI+PiI7CisgIAorICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBhdHRyaWJ1dGVzLCB3ZSdyZSBkb25lLgorICB1bnNpZ25lZCBTZWN0aW9uQXR0cnMgPSBUQUEgJiBNQ1NlY3Rpb25NYWNoTzo6U0VDVElPTl9BVFRSSUJVVEVTOworICBpZiAoU2VjdGlvbkF0dHJzID09IDApIHsKKyAgICAvLyBJZiB3ZSBoYXZlIGEgU19TWU1CT0xfU1RVQlMgc2l6ZSBzcGVjaWZpZWQsIHByaW50IGl0IGFsb25nIHdpdGggJ25vbmUnIGFzCisgICAgLy8gdGhlIGF0dHJpYnV0ZSBzcGVjaWZpZXIuCisgICAgaWYgKFJlc2VydmVkMiAhPSAwKQorICAgICAgT1MgPDwgIixub25lLCIgPDwgUmVzZXJ2ZWQyOworICAgIE9TIDw8ICdcbic7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQ2hlY2sgZWFjaCBhdHRyaWJ1dGUgdG8gc2VlIGlmIHdlIGhhdmUgaXQuCisgIGNoYXIgU2VwYXJhdG9yID0gJywnOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBTZWN0aW9uQXR0ckRlc2NyaXB0b3JzW2ldLkF0dHJGbGFnOyArK2kpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICBpZiAoKFNlY3Rpb25BdHRyRGVzY3JpcHRvcnNbaV0uQXR0ckZsYWcgJiBTZWN0aW9uQXR0cnMpID09IDApCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAvLyBZZXAsIGNsZWFyIGl0IGFuZCBwcmludCBpdC4KKyAgICBTZWN0aW9uQXR0cnMgJj0gflNlY3Rpb25BdHRyRGVzY3JpcHRvcnNbaV0uQXR0ckZsYWc7CisgICAgCisgICAgT1MgPDwgU2VwYXJhdG9yOworICAgIGlmIChTZWN0aW9uQXR0ckRlc2NyaXB0b3JzW2ldLkFzc2VtYmxlck5hbWUpCisgICAgICBPUyA8PCBTZWN0aW9uQXR0ckRlc2NyaXB0b3JzW2ldLkFzc2VtYmxlck5hbWU7CisgICAgZWxzZQorICAgICAgT1MgPDwgIjw8IiA8PCBTZWN0aW9uQXR0ckRlc2NyaXB0b3JzW2ldLkVudW1OYW1lIDw8ICI+PiI7CisgICAgU2VwYXJhdG9yID0gJysnOworICB9CisgIAorICBhc3NlcnQoU2VjdGlvbkF0dHJzID09IDAgJiYgIlVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGVzISIpOworICAKKyAgLy8gSWYgd2UgaGF2ZSBhIFNfU1lNQk9MX1NUVUJTIHNpemUgc3BlY2lmaWVkLCBwcmludCBpdC4KKyAgaWYgKFJlc2VydmVkMiAhPSAwKQorICAgIE9TIDw8ICcsJyA8PCBSZXNlcnZlZDI7CisgIE9TIDw8ICdcbic7Cit9CisKKy8vLyBTdHJpcFNwYWNlcyAtIFRoaXMgcmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgZnJvbSB0aGUgU3RyaW5nUmVmLgorc3RhdGljIHZvaWQgU3RyaXBTcGFjZXMoU3RyaW5nUmVmICZTdHIpIHsKKyAgd2hpbGUgKCFTdHIuZW1wdHkoKSAmJiBpc3NwYWNlKFN0clswXSkpCisgICAgU3RyID0gU3RyLnN1YnN0cigxKTsKKyAgd2hpbGUgKCFTdHIuZW1wdHkoKSAmJiBpc3NwYWNlKFN0ci5iYWNrKCkpKQorICAgIFN0ciA9IFN0ci5zdWJzdHIoMCwgU3RyLnNpemUoKS0xKTsKK30KKworLy8vIFBhcnNlU2VjdGlvblNwZWNpZmllciAtIFBhcnNlIHRoZSBzZWN0aW9uIHNwZWNpZmllciBpbmRpY2F0ZWQgYnkgIlNwZWMiLgorLy8vIFRoaXMgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYXBwZWFyIGFmdGVyIGEgLnNlY3Rpb24gZGlyZWN0aXZlIGluIGEgbWFjaC1vCisvLy8gZmxhdm9yZWQgLnMgZmlsZS4gIElmIHN1Y2Nlc3NmdWwsIHRoaXMgZmlsbHMgaW4gdGhlIHNwZWNpZmllZCBPdXQKKy8vLyBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gIFdoZW4gYW4gaW52YWxpZCBzZWN0aW9uCisvLy8gc3BlY2lmaWVyIGlzIHByZXNlbnQsIHRoaXMgcmV0dXJucyBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBwcm9ibGVtLgorc3RkOjpzdHJpbmcgTUNTZWN0aW9uTWFjaE86OlBhcnNlU2VjdGlvblNwZWNpZmllcihTdHJpbmdSZWYgU3BlYywgICAgICAgIC8vIEluLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlNlZ21lbnQsICAgIC8vIE91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZTZWN0aW9uLCAgICAvLyBPdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAmVEFBLCAgICAgICAgLy8gT3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgJlN0dWJTaXplKSB7IC8vIE91dC4KKyAgLy8gRmluZCB0aGUgZmlyc3QgY29tbWEuCisgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gQ29tbWEgPSBTcGVjLnNwbGl0KCcsJyk7CisgIAorICAvLyBJZiB0aGVyZSBpcyBubyBjb21tYSwgd2UgZmFpbC4KKyAgaWYgKENvbW1hLnNlY29uZC5lbXB0eSgpKQorICAgIHJldHVybiAibWFjaC1vIHNlY3Rpb24gc3BlY2lmaWVyIHJlcXVpcmVzIGEgc2VnbWVudCBhbmQgc2VjdGlvbiAiCisgICAgICAgICAgICJzZXBhcmF0ZWQgYnkgYSBjb21tYSI7CisgIAorICAvLyBDYXB0dXJlIHNlZ21lbnQsIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICBTZWdtZW50ID0gQ29tbWEuZmlyc3Q7CisgIFN0cmlwU3BhY2VzKFNlZ21lbnQpOworCisgIC8vIFZlcmlmeSB0aGF0IHRoZSBzZWdtZW50IGlzIHByZXNlbnQgYW5kIG5vdCB0b28gbG9uZy4KKyAgaWYgKFNlZ21lbnQuZW1wdHkoKSB8fCBTZWdtZW50LnNpemUoKSA+IDE2KQorICAgIHJldHVybiAibWFjaC1vIHNlY3Rpb24gc3BlY2lmaWVyIHJlcXVpcmVzIGEgc2VnbWVudCB3aG9zZSBsZW5ndGggaXMgIgorICAgICAgICAgICAiYmV0d2VlbiAxIGFuZCAxNiBjaGFyYWN0ZXJzIjsKKyAgCisgIC8vIFNwbGl0IHRoZSBzZWN0aW9uIG5hbWUgb2ZmIGZyb20gYW55IGF0dHJpYnV0ZXMgaWYgcHJlc2VudC4KKyAgQ29tbWEgPSBDb21tYS5zZWNvbmQuc3BsaXQoJywnKTsKKworICAvLyBDYXB0dXJlIHNlY3Rpb24sIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICBTZWN0aW9uID0gQ29tbWEuZmlyc3Q7CisgIFN0cmlwU3BhY2VzKFNlY3Rpb24pOworICAKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlIHNlY3Rpb24gaXMgcHJlc2VudCBhbmQgbm90IHRvbyBsb25nLgorICBpZiAoU2VjdGlvbi5lbXB0eSgpIHx8IFNlY3Rpb24uc2l6ZSgpID4gMTYpCisgICAgcmV0dXJuICJtYWNoLW8gc2VjdGlvbiBzcGVjaWZpZXIgcmVxdWlyZXMgYSBzZWN0aW9uIHdob3NlIGxlbmd0aCBpcyAiCisgICAgICAgICAgICJiZXR3ZWVuIDEgYW5kIDE2IGNoYXJhY3RlcnMiOworCisgIC8vIElmIHRoZXJlIGlzIG5vIGNvbW1hIGFmdGVyIHRoZSBzZWN0aW9uLCB3ZSdyZSBkb25lLgorICBUQUEgPSAwOworICBTdHViU2l6ZSA9IDA7CisgIGlmIChDb21tYS5zZWNvbmQuZW1wdHkoKSkKKyAgICByZXR1cm4gIiI7CisgIAorICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gcGFyc2UgdGhlIHNlY3Rpb24gdHlwZSBhbmQgYXR0cmlidXRlcy4KKyAgQ29tbWEgPSBDb21tYS5zZWNvbmQuc3BsaXQoJywnKTsKKyAgCisgIC8vIEdldCB0aGUgc2VjdGlvbiB0eXBlLgorICBTdHJpbmdSZWYgU2VjdGlvblR5cGUgPSBDb21tYS5maXJzdDsKKyAgU3RyaXBTcGFjZXMoU2VjdGlvblR5cGUpOworICAKKyAgLy8gRmlndXJlIG91dCB3aGljaCBzZWN0aW9uIHR5cGUgaXQgaXMuCisgIHVuc2lnbmVkIFR5cGVJRDsKKyAgZm9yIChUeXBlSUQgPSAwOyBUeXBlSUQgIT1NQ1NlY3Rpb25NYWNoTzo6TEFTVF9LTk9XTl9TRUNUSU9OX1RZUEUrMTsgKytUeXBlSUQpCisgICAgaWYgKFNlY3Rpb25UeXBlRGVzY3JpcHRvcnNbVHlwZUlEXS5Bc3NlbWJsZXJOYW1lICYmCisgICAgICAgIFNlY3Rpb25UeXBlID09IFNlY3Rpb25UeXBlRGVzY3JpcHRvcnNbVHlwZUlEXS5Bc3NlbWJsZXJOYW1lKQorICAgICAgYnJlYWs7CisgIAorICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCB0aGUgc2VjdGlvbiB0eXBlLCByZWplY3QgaXQuCisgIGlmIChUeXBlSUQgPiBNQ1NlY3Rpb25NYWNoTzo6TEFTVF9LTk9XTl9TRUNUSU9OX1RZUEUpCisgICAgcmV0dXJuICJtYWNoLW8gc2VjdGlvbiBzcGVjaWZpZXIgdXNlcyBhbiB1bmtub3duIHNlY3Rpb24gdHlwZSI7CisgIAorICAvLyBSZW1lbWJlciB0aGUgVHlwZUlELgorICBUQUEgPSBUeXBlSUQ7CisKKyAgLy8gSWYgd2UgaGF2ZSBubyBjb21tYSBhZnRlciB0aGUgc2VjdGlvbiB0eXBlLCB0aGVyZSBhcmUgbm8gYXR0cmlidXRlcy4KKyAgaWYgKENvbW1hLnNlY29uZC5lbXB0eSgpKSB7CisgICAgLy8gU19TWU1CT0xfU1RVQlMgYWx3YXlzIHJlcXVpcmUgYSBzeW1ib2wgc3R1YiBzaXplIHNwZWNpZmllci4KKyAgICBpZiAoVEFBID09IE1DU2VjdGlvbk1hY2hPOjpTX1NZTUJPTF9TVFVCUykKKyAgICAgIHJldHVybiAibWFjaC1vIHNlY3Rpb24gc3BlY2lmaWVyIG9mIHR5cGUgJ3N5bWJvbF9zdHVicycgcmVxdWlyZXMgYSBzaXplICIKKyAgICAgICAgICAgICAic3BlY2lmaWVyIjsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLyBPdGhlcndpc2UsIHdlIGRvIGhhdmUgc29tZSBhdHRyaWJ1dGVzLiAgU3BsaXQgb2ZmIHRoZSBzaXplIHNwZWNpZmllciBpZgorICAvLyBwcmVzZW50LgorICBDb21tYSA9IENvbW1hLnNlY29uZC5zcGxpdCgnLCcpOworICBTdHJpbmdSZWYgQXR0cnMgPSBDb21tYS5maXJzdDsKKyAgCisgIC8vIFRoZSBhdHRyaWJ1dGUgbGlzdCBpcyBhICcrJyBzZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICBzdGQ6OnBhaXI8U3RyaW5nUmVmLCBTdHJpbmdSZWY+IFBsdXMgPSBBdHRycy5zcGxpdCgnKycpOworICAKKyAgd2hpbGUgKDEpIHsKKyAgICBTdHJpbmdSZWYgQXR0ciA9IFBsdXMuZmlyc3Q7CisgICAgU3RyaXBTcGFjZXMoQXR0cik7CisKKyAgICAvLyBMb29rIHVwIHRoZSBhdHRyaWJ1dGUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgOyArK2kpIHsKKyAgICAgIGlmIChTZWN0aW9uQXR0ckRlc2NyaXB0b3JzW2ldLkF0dHJGbGFnID09IEF0dHJGbGFnRW5kKQorICAgICAgICByZXR1cm4gIm1hY2gtbyBzZWN0aW9uIHNwZWNpZmllciBoYXMgaW52YWxpZCBhdHRyaWJ1dGUiOworICAgICAgCisgICAgICBpZiAoU2VjdGlvbkF0dHJEZXNjcmlwdG9yc1tpXS5Bc3NlbWJsZXJOYW1lICYmCisgICAgICAgICAgQXR0ciA9PSBTZWN0aW9uQXR0ckRlc2NyaXB0b3JzW2ldLkFzc2VtYmxlck5hbWUpIHsKKyAgICAgICAgVEFBIHw9IFNlY3Rpb25BdHRyRGVzY3JpcHRvcnNbaV0uQXR0ckZsYWc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoUGx1cy5zZWNvbmQuZW1wdHkoKSkgYnJlYWs7CisgICAgUGx1cyA9IFBsdXMuc2Vjb25kLnNwbGl0KCcrJyk7CisgIH07CisKKyAgLy8gT2theSwgd2UndmUgcGFyc2VkIHRoZSBzZWN0aW9uIGF0dHJpYnV0ZXMsIHNlZSBpZiB3ZSBoYXZlIGEgc3R1YiBzaXplIHNwZWMuCisgIGlmIChDb21tYS5zZWNvbmQuZW1wdHkoKSkgeworICAgIC8vIFNfU1lNQk9MX1NUVUJTIGFsd2F5cyByZXF1aXJlIGEgc3ltYm9sIHN0dWIgc2l6ZSBzcGVjaWZpZXIuCisgICAgaWYgKFRBQSA9PSBNQ1NlY3Rpb25NYWNoTzo6U19TWU1CT0xfU1RVQlMpCisgICAgICByZXR1cm4gIm1hY2gtbyBzZWN0aW9uIHNwZWNpZmllciBvZiB0eXBlICdzeW1ib2xfc3R1YnMnIHJlcXVpcmVzIGEgc2l6ZSAiCisgICAgICAic3BlY2lmaWVyIjsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLyBJZiB3ZSBoYXZlIGEgc3R1YiBzaXplIHNwZWMsIHdlIG11c3QgaGF2ZSBhIHNlY3Rpb250eXBlIG9mIFNfU1lNQk9MX1NUVUJTLgorICBpZiAoKFRBQSAmIE1DU2VjdGlvbk1hY2hPOjpTRUNUSU9OX1RZUEUpICE9IE1DU2VjdGlvbk1hY2hPOjpTX1NZTUJPTF9TVFVCUykKKyAgICByZXR1cm4gIm1hY2gtbyBzZWN0aW9uIHNwZWNpZmllciBjYW5ub3QgaGF2ZSBhIHN0dWIgc2l6ZSBzcGVjaWZpZWQgYmVjYXVzZSAiCisgICAgICAgICAgICJpdCBkb2VzIG5vdCBoYXZlIHR5cGUgJ3N5bWJvbF9zdHVicyciOworICAKKyAgLy8gT2theSwgaWYgd2UgZG8sIGl0IG11c3QgYmUgYSBudW1iZXIuCisgIFN0cmluZ1JlZiBTdHViU2l6ZVN0ciA9IENvbW1hLnNlY29uZDsKKyAgU3RyaXBTcGFjZXMoU3R1YlNpemVTdHIpOworICAKKyAgLy8gQ29udmVydCB0aGUgc3R1YiBzaXplIGZyb20gYSBzdHJpbmcgdG8gYW4gaW50ZWdlci4KKyAgaWYgKFN0dWJTaXplU3RyLmdldEFzSW50ZWdlcigwLCBTdHViU2l6ZSkpCisgICAgcmV0dXJuICJtYWNoLW8gc2VjdGlvbiBzcGVjaWZpZXIgaGFzIGEgbWFsZm9ybWVkIHN0dWIgc2l6ZSI7CisgIAorICByZXR1cm4gIiI7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9NQ1N0cmVhbWVyLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9NQ1N0cmVhbWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgyNzIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DU3RyZWFtZXIuY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8vPT09LSBsaWIvTUMvTUNTdHJlYW1lci5jcHAgLSBTdHJlYW1pbmcgTWFjaGluZSBDb2RlIE91dHB1dCAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL01DL01DU3RyZWFtZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01DU3RyZWFtZXI6Ok1DU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgpIDogQ29udGV4dChDdHgpLCBDdXJTZWN0aW9uKDApIHsKK30KKworTUNTdHJlYW1lcjo6fk1DU3RyZWFtZXIoKSB7Cit9CisKK3Jhd19vc3RyZWFtICZNQ1N0cmVhbWVyOjpHZXRDb21tZW50T1MoKSB7CisgIC8vIEJ5IGRlZmF1bHQsIGRpc2NhcmQgY29tbWVudHMuCisgIHJldHVybiBudWxscygpOworfQorCisKKy8vLyBFbWl0SW50VmFsdWUgLSBTcGVjaWFsIGNhc2Ugb2YgRW1pdFZhbHVlIHRoYXQgYXZvaWRzIHRoZSBjbGllbnQgaGF2aW5nIHRvCisvLy8gcGFzcyBpbiBhIE1DRXhwciBmb3IgY29uc3RhbnQgaW50ZWdlcnMuCit2b2lkIE1DU3RyZWFtZXI6OkVtaXRJbnRWYWx1ZSh1aW50NjRfdCBWYWx1ZSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgeworICBFbWl0VmFsdWUoTUNDb25zdGFudEV4cHI6OkNyZWF0ZShWYWx1ZSwgZ2V0Q29udGV4dCgpKSwgU2l6ZSwgQWRkclNwYWNlKTsKK30KKwordm9pZCBNQ1N0cmVhbWVyOjpFbWl0U3ltYm9sVmFsdWUoY29uc3QgTUNTeW1ib2wgKlN5bSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgeworICBFbWl0VmFsdWUoTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoU3ltLCBnZXRDb250ZXh0KCkpLCBTaXplLCBBZGRyU3BhY2UpOworfQorCisvLy8gRW1pdEZpbGwgLSBFbWl0IE51bUJ5dGVzIGJ5dGVzIHdvcnRoIG9mIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkKKy8vLyBGaWxsVmFsdWUuICBUaGlzIGltcGxlbWVudHMgZGlyZWN0aXZlcyBzdWNoIGFzICcuc3BhY2UnLgordm9pZCBNQ1N0cmVhbWVyOjpFbWl0RmlsbCh1aW50NjRfdCBOdW1CeXRlcywgdWludDhfdCBGaWxsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgeworICBjb25zdCBNQ0V4cHIgKkUgPSBNQ0NvbnN0YW50RXhwcjo6Q3JlYXRlKEZpbGxWYWx1ZSwgZ2V0Q29udGV4dCgpKTsKKyAgZm9yICh1aW50NjRfdCBpID0gMCwgZSA9IE51bUJ5dGVzOyBpICE9IGU7ICsraSkKKyAgICBFbWl0VmFsdWUoRSwgMSwgQWRkclNwYWNlKTsKK30KKworLy8vIEVtaXRSYXdUZXh0IC0gSWYgdGhpcyBmaWxlIGlzIGJhY2tlZCBieSBhbiBhc3NlbWJseSBzdHJlYW1lciwgdGhpcyBkdW1wcworLy8vIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGluIHRoZSBvdXRwdXQgLnMgZmlsZS4gIFRoaXMgY2FwYWJpbGl0eSBpcworLy8vIGluZGljYXRlZCBieSB0aGUgaGFzUmF3VGV4dFN1cHBvcnQoKSBwcmVkaWNhdGUuCit2b2lkIE1DU3RyZWFtZXI6OkVtaXRSYXdUZXh0KFN0cmluZ1JlZiBTdHJpbmcpIHsKKyAgZXJycygpIDw8ICJFbWl0UmF3VGV4dCBjYWxsZWQgb24gYW4gTUNTdHJlYW1lciB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBpdCwgIgorICAiIHNvbWV0aGluZyBtdXN0IG5vdCBiZSBmdWxseSBtYydpemVkXG4iOworICBhYm9ydCgpOworfQorCit2b2lkIE1DU3RyZWFtZXI6OkVtaXRSYXdUZXh0KGNvbnN0IFR3aW5lICZUKSB7CisgIFNtYWxsU3RyaW5nPDEyOD4gU3RyOworICBULnRvVmVjdG9yKFN0cik7CisgIEVtaXRSYXdUZXh0KFN0ci5zdHIoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTUNTeW1ib2wuY3BwIGIvc3JjL0xMVk0vbGliL01DL01DU3ltYm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzc1MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL01DU3ltYm9sLmNwcApAQCAtMCwwICsxLDY3IEBACisvLz09PS0gbGliL01DL01DU3ltYm9sLmNwcCAtIE1DU3ltYm9sIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gU2VudGluZWwgdmFsdWUgZm9yIHRoZSBhYnNvbHV0ZSBwc2V1ZG8gc2VjdGlvbi4KK2NvbnN0IE1DU2VjdGlvbiAqTUNTeW1ib2w6OkFic29sdXRlUHNldWRvU2VjdGlvbiA9CisgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTUNTZWN0aW9uICo+KDEpOworCitzdGF0aWMgYm9vbCBpc0FjY2VwdGFibGVDaGFyKGNoYXIgQykgeworICBpZiAoKEMgPCAnYScgfHwgQyA+ICd6JykgJiYKKyAgICAgIChDIDwgJ0EnIHx8IEMgPiAnWicpICYmCisgICAgICAoQyA8ICcwJyB8fCBDID4gJzknKSAmJgorICAgICAgQyAhPSAnXycgJiYgQyAhPSAnJCcgJiYgQyAhPSAnLicgJiYgQyAhPSAnQCcpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIE5hbWVOZWVkc1F1b3RpbmcgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaWRlbnRpZmllciBcYXJnIFN0ciBuZWVkcyBxdW90ZXMgdG8gYmUKKy8vLyBzeW50YWN0aWNhbGx5IGNvcnJlY3QuCitzdGF0aWMgYm9vbCBOYW1lTmVlZHNRdW90aW5nKFN0cmluZ1JlZiBTdHIpIHsKKyAgYXNzZXJ0KCFTdHIuZW1wdHkoKSAmJiAiQ2Fubm90IGNyZWF0ZSBhbiBlbXB0eSBNQ1N5bWJvbCIpOworICAKKyAgLy8gSWYgYW55IG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgaXMgYW4gdW5hY2NlcHRhYmxlIGNoYXJhY3RlciwgZm9yY2UKKyAgLy8gcXVvdGVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3RyLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFpc0FjY2VwdGFibGVDaGFyKFN0cltpXSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE1DU3ltYm9sOjpzZXRWYXJpYWJsZVZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpIHsKKyAgYXNzZXJ0KFZhbHVlICYmICJJbnZhbGlkIHZhcmlhYmxlIHZhbHVlISIpOworICBhc3NlcnQoKGlzVW5kZWZpbmVkKCkgfHwgKGlzQWJzb2x1dGUoKSAmJiBpc2E8TUNDb25zdGFudEV4cHI+KFZhbHVlKSkpICYmCisgICAgICAgICAiSW52YWxpZCByZWRlZmluaXRpb24hIik7CisgIHRoaXMtPlZhbHVlID0gVmFsdWU7CisKKyAgLy8gTWFyayB0aGUgdmFyaWFibGUgYXMgYWJzb2x1dGUgYXMgYXBwcm9wcmlhdGUuCisgIGlmIChpc2E8TUNDb25zdGFudEV4cHI+KFZhbHVlKSkKKyAgICBzZXRBYnNvbHV0ZSgpOworfQorCit2b2lkIE1DU3ltYm9sOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgLy8gVGhlIG5hbWUgZm9yIHRoaXMgTUNTeW1ib2wgaXMgcmVxdWlyZWQgdG8gYmUgYSB2YWxpZCB0YXJnZXQgbmFtZS4gIEhvd2V2ZXIsCisgIC8vIHNvbWUgdGFyZ2V0cyBzdXBwb3J0IHF1b3RpbmcgbmFtZXMgd2l0aCBmdW5ueSBjaGFyYWN0ZXJzLiAgSWYgdGhlIG5hbWUKKyAgLy8gY29udGFpbnMgYSBmdW5ueSBjaGFyYWN0ZXIsIHRoZW4gcHJpbnQgaXQgcXVvdGVkLgorICBpZiAoIU5hbWVOZWVkc1F1b3RpbmcoZ2V0TmFtZSgpKSkgeworICAgIE9TIDw8IGdldE5hbWUoKTsKKyAgICByZXR1cm47CisgIH0KKyAgICAKKyAgT1MgPDwgJyInIDw8IGdldE5hbWUoKSA8PCAnIic7Cit9CisKK3ZvaWQgTUNTeW1ib2w6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvTWFjaE9iamVjdFdyaXRlci5jcHAgYi9zcmMvTExWTS9saWIvTUMvTWFjaE9iamVjdFdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMDk1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9NYWNoT2JqZWN0V3JpdGVyLmNwcApAQCAtMCwwICsxLDEyMjkgQEAKKy8vPT09LSBsaWIvTUMvTWFjaE9iamVjdFdyaXRlci5jcHAgLSBNYWNoLU8gRmlsZSBXcml0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL01DL01hY2hPYmplY3RXcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DT2JqZWN0V3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DTWFjaE9TeW1ib2xGbGFncy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtQmFja2VuZC5oIgorCisvLyBGSVhNRTogR3Jvc3MuCisjaW5jbHVkZSAiLi4vVGFyZ2V0L1g4Ni9YODZGaXh1cEtpbmRzLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIHVuc2lnbmVkIGdldEZpeHVwS2luZExvZzJTaXplKHVuc2lnbmVkIEtpbmQpIHsKKyAgc3dpdGNoIChLaW5kKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoImludmFsaWQgZml4dXAga2luZCEiKTsKKyAgY2FzZSBYODY6OnJlbG9jX3BjcmVsXzFieXRlOgorICBjYXNlIEZLX0RhdGFfMTogcmV0dXJuIDA7CisgIGNhc2UgWDg2OjpyZWxvY19wY3JlbF8yYnl0ZToKKyAgY2FzZSBGS19EYXRhXzI6IHJldHVybiAxOworICBjYXNlIFg4Njo6cmVsb2NfcGNyZWxfNGJ5dGU6CisgIGNhc2UgWDg2OjpyZWxvY19yaXByZWxfNGJ5dGU6CisgIGNhc2UgWDg2OjpyZWxvY19yaXByZWxfNGJ5dGVfbW92cV9sb2FkOgorICBjYXNlIEZLX0RhdGFfNDogcmV0dXJuIDI7CisgIGNhc2UgRktfRGF0YV84OiByZXR1cm4gMzsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBpc0ZpeHVwS2luZFBDUmVsKHVuc2lnbmVkIEtpbmQpIHsKKyAgc3dpdGNoIChLaW5kKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIFg4Njo6cmVsb2NfcGNyZWxfMWJ5dGU6CisgIGNhc2UgWDg2OjpyZWxvY19wY3JlbF8yYnl0ZToKKyAgY2FzZSBYODY6OnJlbG9jX3BjcmVsXzRieXRlOgorICBjYXNlIFg4Njo6cmVsb2NfcmlwcmVsXzRieXRlOgorICBjYXNlIFg4Njo6cmVsb2NfcmlwcmVsXzRieXRlX21vdnFfbG9hZDoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBpc0ZpeHVwS2luZFJJUFJlbCh1bnNpZ25lZCBLaW5kKSB7CisgIHJldHVybiBLaW5kID09IFg4Njo6cmVsb2NfcmlwcmVsXzRieXRlIHx8CisgICAgS2luZCA9PSBYODY6OnJlbG9jX3JpcHJlbF80Ynl0ZV9tb3ZxX2xvYWQ7Cit9CisKK3N0YXRpYyBib29sIGRvZXNTeW1ib2xSZXF1aXJlRXh0ZXJuUmVsb2NhdGlvbihNQ1N5bWJvbERhdGEgKlNEKSB7CisgIC8vIFVuZGVmaW5lZCBzeW1ib2xzIGFyZSBhbHdheXMgZXh0ZXJuLgorICBpZiAoU0QtPlN5bWJvbC0+aXNVbmRlZmluZWQoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBSZWZlcmVuY2VzIHRvIHdlYWsgZGVmaW5pdGlvbnMgcmVxdWlyZSBleHRlcm5hbCByZWxvY2F0aW9uIGVudHJpZXM7IHRoZQorICAvLyBkZWZpbml0aW9uIG1heSBub3QgYWx3YXlzIGJlIHRoZSBvbmUgaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuCisgIGlmIChTRC0+Z2V0RmxhZ3MoKSAmIFNGX1dlYWtEZWZpbml0aW9uKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIE90aGVyd2lzZSwgd2UgY2FuIHVzZSBhbiBpbnRlcm5hbCByZWxvY2F0aW9uLgorICByZXR1cm4gZmFsc2U7Cit9CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1hY2hPYmplY3RXcml0ZXJJbXBsIHsKKyAgLy8gU2VlIDxtYWNoLW8vbG9hZGVyLmg+LgorICBlbnVtIHsKKyAgICBIZWFkZXJfTWFnaWMzMiA9IDB4RkVFREZBQ0UsCisgICAgSGVhZGVyX01hZ2ljNjQgPSAweEZFRURGQUNGCisgIH07CisKKyAgZW51bSB7CisgICAgSGVhZGVyMzJTaXplID0gMjgsCisgICAgSGVhZGVyNjRTaXplID0gMzIsCisgICAgU2VnbWVudExvYWRDb21tYW5kMzJTaXplID0gNTYsCisgICAgU2VnbWVudExvYWRDb21tYW5kNjRTaXplID0gNzIsCisgICAgU2VjdGlvbjMyU2l6ZSA9IDY4LAorICAgIFNlY3Rpb242NFNpemUgPSA4MCwKKyAgICBTeW10YWJMb2FkQ29tbWFuZFNpemUgPSAyNCwKKyAgICBEeXN5bXRhYkxvYWRDb21tYW5kU2l6ZSA9IDgwLAorICAgIE5saXN0MzJTaXplID0gMTIsCisgICAgTmxpc3Q2NFNpemUgPSAxNiwKKyAgICBSZWxvY2F0aW9uSW5mb1NpemUgPSA4CisgIH07CisKKyAgZW51bSBIZWFkZXJGaWxlVHlwZSB7CisgICAgSEZUX09iamVjdCA9IDB4MQorICB9OworCisgIGVudW0gSGVhZGVyRmxhZ3MgeworICAgIEhGX1N1YnNlY3Rpb25zVmlhU3ltYm9scyA9IDB4MjAwMAorICB9OworCisgIGVudW0gTG9hZENvbW1hbmRUeXBlIHsKKyAgICBMQ1RfU2VnbWVudCA9IDB4MSwKKyAgICBMQ1RfU3ltdGFiID0gMHgyLAorICAgIExDVF9EeXN5bXRhYiA9IDB4YiwKKyAgICBMQ1RfU2VnbWVudDY0ID0gMHgxOQorICB9OworCisgIC8vIFNlZSA8bWFjaC1vL25saXN0Lmg+LgorICBlbnVtIFN5bWJvbFR5cGVUeXBlIHsKKyAgICBTVFRfVW5kZWZpbmVkID0gMHgwMCwKKyAgICBTVFRfQWJzb2x1dGUgID0gMHgwMiwKKyAgICBTVFRfU2VjdGlvbiAgID0gMHgwZQorICB9OworCisgIGVudW0gU3ltYm9sVHlwZUZsYWdzIHsKKyAgICAvLyBJZiBhbnkgb2YgdGhlc2UgYml0cyBhcmUgc2V0LCB0aGVuIHRoZSBlbnRyeSBpcyBhIHN0YWIgZW50cnkgbnVtYmVyIChzZWUKKyAgICAvLyA8bWFjaC1vL3N0YWIuaD4uIE90aGVyd2lzZSB0aGUgb3RoZXIgbWFza3MgYXBwbHkuCisgICAgU1RGX1N0YWJzRW50cnlNYXNrID0gMHhlMCwKKworICAgIFNURl9UeXBlTWFzayAgICAgICA9IDB4MGUsCisgICAgU1RGX0V4dGVybmFsICAgICAgID0gMHgwMSwKKyAgICBTVEZfUHJpdmF0ZUV4dGVybiAgPSAweDEwCisgIH07CisKKyAgLy8vIEluZGlyZWN0U3ltYm9sRmxhZ3MgLSBGbGFncyBmb3IgZW5jb2Rpbmcgc3BlY2lhbCB2YWx1ZXMgaW4gdGhlIGluZGlyZWN0CisgIC8vLyBzeW1ib2wgZW50cnkuCisgIGVudW0gSW5kaXJlY3RTeW1ib2xGbGFncyB7CisgICAgSVNGX0xvY2FsICAgID0gMHg4MDAwMDAwMCwKKyAgICBJU0ZfQWJzb2x1dGUgPSAweDQwMDAwMDAwCisgIH07CisKKyAgLy8vIFJlbG9jYXRpb25GbGFncyAtIFNwZWNpYWwgZmxhZ3MgZm9yIGFkZHJlc3Nlcy4KKyAgZW51bSBSZWxvY2F0aW9uRmxhZ3MgeworICAgIFJGX1NjYXR0ZXJlZCA9IDB4ODAwMDAwMDAKKyAgfTsKKworICBlbnVtIFJlbG9jYXRpb25JbmZvVHlwZSB7CisgICAgUklUX1ZhbmlsbGEgICAgICAgICAgICAgPSAwLAorICAgIFJJVF9QYWlyICAgICAgICAgICAgICAgID0gMSwKKyAgICBSSVRfRGlmZmVyZW5jZSAgICAgICAgICA9IDIsCisgICAgUklUX1ByZWJvdW5kTGF6eVBvaW50ZXIgPSAzLAorICAgIFJJVF9Mb2NhbERpZmZlcmVuY2UgICAgID0gNCwKKyAgICBSSVRfVExWICAgICAgICAgICAgICAgICA9IDUKKyAgfTsKKworICAvLy8gWDg2XzY0IHVzZXMgaXRzIG93biByZWxvY2F0aW9uIHR5cGVzLgorICBlbnVtIFJlbG9jYXRpb25JbmZvVHlwZVg4Nl82NCB7CisgICAgUklUX1g4Nl82NF9VbnNpZ25lZCAgID0gMCwKKyAgICBSSVRfWDg2XzY0X1NpZ25lZCAgICAgPSAxLAorICAgIFJJVF9YODZfNjRfQnJhbmNoICAgICA9IDIsCisgICAgUklUX1g4Nl82NF9HT1RMb2FkICAgID0gMywKKyAgICBSSVRfWDg2XzY0X0dPVCAgICAgICAgPSA0LAorICAgIFJJVF9YODZfNjRfU3VidHJhY3RvciA9IDUsCisgICAgUklUX1g4Nl82NF9TaWduZWQxICAgID0gNiwKKyAgICBSSVRfWDg2XzY0X1NpZ25lZDIgICAgPSA3LAorICAgIFJJVF9YODZfNjRfU2lnbmVkNCAgICA9IDgsCisgICAgUklUX1g4Nl82NF9UTFYgICAgICAgID0gOQorICB9OworCisgIC8vLyBNYWNoU3ltYm9sRGF0YSAtIEhlbHBlciBzdHJ1Y3QgZm9yIGNvbnRhaW5pbmcgc29tZSBwcmVjb21wdXRlZCBpbmZvcm1hdGlvbgorICAvLy8gb24gc3ltYm9scy4KKyAgc3RydWN0IE1hY2hTeW1ib2xEYXRhIHsKKyAgICBNQ1N5bWJvbERhdGEgKlN5bWJvbERhdGE7CisgICAgdWludDY0X3QgU3RyaW5nSW5kZXg7CisgICAgdWludDhfdCBTZWN0aW9uSW5kZXg7CisKKyAgICAvLyBTdXBwb3J0IGxleGljb2dyYXBoaWMgc29ydGluZy4KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBNYWNoU3ltYm9sRGF0YSAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gU3ltYm9sRGF0YS0+Z2V0U3ltYm9sKCkuZ2V0TmFtZSgpIDwKKyAgICAgICAgICAgICBSSFMuU3ltYm9sRGF0YS0+Z2V0U3ltYm9sKCkuZ2V0TmFtZSgpOworICAgIH0KKyAgfTsKKworICAvLy8gQG5hbWUgUmVsb2NhdGlvbiBEYXRhCisgIC8vLyBAeworCisgIHN0cnVjdCBNYWNoUmVsb2NhdGlvbkVudHJ5IHsKKyAgICB1aW50MzJfdCBXb3JkMDsKKyAgICB1aW50MzJfdCBXb3JkMTsKKyAgfTsKKworICBsbHZtOjpEZW5zZU1hcDxjb25zdCBNQ1NlY3Rpb25EYXRhKiwKKyAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaFJlbG9jYXRpb25FbnRyeT4gPiBSZWxvY2F0aW9uczsKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgTUNTZWN0aW9uRGF0YSosIHVuc2lnbmVkPiBJbmRpcmVjdFN5bUJhc2U7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBTeW1ib2wgVGFibGUgRGF0YQorICAvLy8gQHsKKworICBTbWFsbFN0cmluZzwyNTY+IFN0cmluZ1RhYmxlOworICBzdGQ6OnZlY3RvcjxNYWNoU3ltYm9sRGF0YT4gTG9jYWxTeW1ib2xEYXRhOworICBzdGQ6OnZlY3RvcjxNYWNoU3ltYm9sRGF0YT4gRXh0ZXJuYWxTeW1ib2xEYXRhOworICBzdGQ6OnZlY3RvcjxNYWNoU3ltYm9sRGF0YT4gVW5kZWZpbmVkU3ltYm9sRGF0YTsKKworICAvLy8gQH0KKworICBNYWNoT2JqZWN0V3JpdGVyICpXcml0ZXI7CisKKyAgcmF3X29zdHJlYW0gJk9TOworCisgIHVuc2lnbmVkIElzNjRCaXQgOiAxOworCitwdWJsaWM6CisgIE1hY2hPYmplY3RXcml0ZXJJbXBsKE1hY2hPYmplY3RXcml0ZXIgKl9Xcml0ZXIsIGJvb2wgX0lzNjRCaXQpCisgICAgOiBXcml0ZXIoX1dyaXRlciksIE9TKFdyaXRlci0+Z2V0U3RyZWFtKCkpLCBJczY0Qml0KF9JczY0Qml0KSB7CisgIH0KKworICB2b2lkIFdyaXRlOCh1aW50OF90IFZhbHVlKSB7IFdyaXRlci0+V3JpdGU4KFZhbHVlKTsgfQorICB2b2lkIFdyaXRlMTYodWludDE2X3QgVmFsdWUpIHsgV3JpdGVyLT5Xcml0ZTE2KFZhbHVlKTsgfQorICB2b2lkIFdyaXRlMzIodWludDMyX3QgVmFsdWUpIHsgV3JpdGVyLT5Xcml0ZTMyKFZhbHVlKTsgfQorICB2b2lkIFdyaXRlNjQodWludDY0X3QgVmFsdWUpIHsgV3JpdGVyLT5Xcml0ZTY0KFZhbHVlKTsgfQorICB2b2lkIFdyaXRlWmVyb3ModW5zaWduZWQgTikgeyBXcml0ZXItPldyaXRlWmVyb3MoTik7IH0KKyAgdm9pZCBXcml0ZUJ5dGVzKFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkIFplcm9GaWxsU2l6ZSA9IDApIHsKKyAgICBXcml0ZXItPldyaXRlQnl0ZXMoU3RyLCBaZXJvRmlsbFNpemUpOworICB9CisKKyAgdm9pZCBXcml0ZUhlYWRlcih1bnNpZ25lZCBOdW1Mb2FkQ29tbWFuZHMsIHVuc2lnbmVkIExvYWRDb21tYW5kc1NpemUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBTdWJzZWN0aW9uc1ZpYVN5bWJvbHMpIHsKKyAgICB1aW50MzJfdCBGbGFncyA9IDA7CisKKyAgICBpZiAoU3Vic2VjdGlvbnNWaWFTeW1ib2xzKQorICAgICAgRmxhZ3MgfD0gSEZfU3Vic2VjdGlvbnNWaWFTeW1ib2xzOworCisgICAgLy8gc3RydWN0IG1hY2hfaGVhZGVyICgyOCBieXRlcykgb3IKKyAgICAvLyBzdHJ1Y3QgbWFjaF9oZWFkZXJfNjQgKDMyIGJ5dGVzKQorCisgICAgdWludDY0X3QgU3RhcnQgPSBPUy50ZWxsKCk7CisgICAgKHZvaWQpIFN0YXJ0OworCisgICAgV3JpdGUzMihJczY0Qml0ID8gSGVhZGVyX01hZ2ljNjQgOiBIZWFkZXJfTWFnaWMzMik7CisKKyAgICAvLyBGSVhNRTogU3VwcG9ydCBjcHV0eXBlLgorICAgIFdyaXRlMzIoSXM2NEJpdCA/IE1hY2hPOjpDUFVUeXBlWDg2XzY0IDogTWFjaE86OkNQVVR5cGVJMzg2KTsKKyAgICAvLyBGSVhNRTogU3VwcG9ydCBjcHVzdWJ0eXBlLgorICAgIFdyaXRlMzIoTWFjaE86OkNQVVN1YlR5cGVfSTM4Nl9BTEwpOworICAgIFdyaXRlMzIoSEZUX09iamVjdCk7CisgICAgV3JpdGUzMihOdW1Mb2FkQ29tbWFuZHMpOyAgICAvLyBPYmplY3QgZmlsZXMgaGF2ZSBhIHNpbmdsZSBsb2FkIGNvbW1hbmQsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VnbWVudC4KKyAgICBXcml0ZTMyKExvYWRDb21tYW5kc1NpemUpOworICAgIFdyaXRlMzIoRmxhZ3MpOworICAgIGlmIChJczY0Qml0KQorICAgICAgV3JpdGUzMigwKTsgLy8gcmVzZXJ2ZWQKKworICAgIGFzc2VydChPUy50ZWxsKCkgLSBTdGFydCA9PSBJczY0Qml0ID8gSGVhZGVyNjRTaXplIDogSGVhZGVyMzJTaXplKTsKKyAgfQorCisgIC8vLyBXcml0ZVNlZ21lbnRMb2FkQ29tbWFuZCAtIFdyaXRlIGEgc2VnbWVudCBsb2FkIGNvbW1hbmQuCisgIC8vLworICAvLy8gXGFyZyBOdW1TZWN0aW9ucyAtIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgaW4gdGhpcyBzZWdtZW50LgorICAvLy8gXGFyZyBTZWN0aW9uRGF0YVNpemUgLSBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbnMuCisgIHZvaWQgV3JpdGVTZWdtZW50TG9hZENvbW1hbmQodW5zaWduZWQgTnVtU2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVk1TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNlY3Rpb25EYXRhU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2VjdGlvbkRhdGFTaXplKSB7CisgICAgLy8gc3RydWN0IHNlZ21lbnRfY29tbWFuZCAoNTYgYnl0ZXMpIG9yCisgICAgLy8gc3RydWN0IHNlZ21lbnRfY29tbWFuZF82NCAoNzIgYnl0ZXMpCisKKyAgICB1aW50NjRfdCBTdGFydCA9IE9TLnRlbGwoKTsKKyAgICAodm9pZCkgU3RhcnQ7CisKKyAgICB1bnNpZ25lZCBTZWdtZW50TG9hZENvbW1hbmRTaXplID0gSXM2NEJpdCA/IFNlZ21lbnRMb2FkQ29tbWFuZDY0U2l6ZSA6CisgICAgICBTZWdtZW50TG9hZENvbW1hbmQzMlNpemU7CisgICAgV3JpdGUzMihJczY0Qml0ID8gTENUX1NlZ21lbnQ2NCA6IExDVF9TZWdtZW50KTsKKyAgICBXcml0ZTMyKFNlZ21lbnRMb2FkQ29tbWFuZFNpemUgKworICAgICAgICAgICAgTnVtU2VjdGlvbnMgKiAoSXM2NEJpdCA/IFNlY3Rpb242NFNpemUgOiBTZWN0aW9uMzJTaXplKSk7CisKKyAgICBXcml0ZUJ5dGVzKCIiLCAxNik7CisgICAgaWYgKElzNjRCaXQpIHsKKyAgICAgIFdyaXRlNjQoMCk7IC8vIHZtYWRkcgorICAgICAgV3JpdGU2NChWTVNpemUpOyAvLyB2bXNpemUKKyAgICAgIFdyaXRlNjQoU2VjdGlvbkRhdGFTdGFydE9mZnNldCk7IC8vIGZpbGUgb2Zmc2V0CisgICAgICBXcml0ZTY0KFNlY3Rpb25EYXRhU2l6ZSk7IC8vIGZpbGUgc2l6ZQorICAgIH0gZWxzZSB7CisgICAgICBXcml0ZTMyKDApOyAvLyB2bWFkZHIKKyAgICAgIFdyaXRlMzIoVk1TaXplKTsgLy8gdm1zaXplCisgICAgICBXcml0ZTMyKFNlY3Rpb25EYXRhU3RhcnRPZmZzZXQpOyAvLyBmaWxlIG9mZnNldAorICAgICAgV3JpdGUzMihTZWN0aW9uRGF0YVNpemUpOyAvLyBmaWxlIHNpemUKKyAgICB9CisgICAgV3JpdGUzMigweDcpOyAvLyBtYXhwcm90CisgICAgV3JpdGUzMigweDcpOyAvLyBpbml0cHJvdAorICAgIFdyaXRlMzIoTnVtU2VjdGlvbnMpOworICAgIFdyaXRlMzIoMCk7IC8vIGZsYWdzCisKKyAgICBhc3NlcnQoT1MudGVsbCgpIC0gU3RhcnQgPT0gU2VnbWVudExvYWRDb21tYW5kU2l6ZSk7CisgIH0KKworICB2b2lkIFdyaXRlU2VjdGlvbihjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1NlY3Rpb25EYXRhICZTRCwgdWludDY0X3QgRmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgUmVsb2NhdGlvbnNTdGFydCwgdW5zaWduZWQgTnVtUmVsb2NhdGlvbnMpIHsKKyAgICB1aW50NjRfdCBTZWN0aW9uU2l6ZSA9IExheW91dC5nZXRTZWN0aW9uU2l6ZSgmU0QpOworCisgICAgLy8gVGhlIG9mZnNldCBpcyB1bnVzZWQgZm9yIHZpcnR1YWwgc2VjdGlvbnMuCisgICAgaWYgKEFzbS5nZXRCYWNrZW5kKCkuaXNWaXJ0dWFsU2VjdGlvbihTRC5nZXRTZWN0aW9uKCkpKSB7CisgICAgICBhc3NlcnQoTGF5b3V0LmdldFNlY3Rpb25GaWxlU2l6ZSgmU0QpID09IDAgJiYgIkludmFsaWQgZmlsZSBzaXplISIpOworICAgICAgRmlsZU9mZnNldCA9IDA7CisgICAgfQorCisgICAgLy8gc3RydWN0IHNlY3Rpb24gKDY4IGJ5dGVzKSBvcgorICAgIC8vIHN0cnVjdCBzZWN0aW9uXzY0ICg4MCBieXRlcykKKworICAgIHVpbnQ2NF90IFN0YXJ0ID0gT1MudGVsbCgpOworICAgICh2b2lkKSBTdGFydDsKKworICAgIGNvbnN0IE1DU2VjdGlvbk1hY2hPICZTZWN0aW9uID0gY2FzdDxNQ1NlY3Rpb25NYWNoTz4oU0QuZ2V0U2VjdGlvbigpKTsKKyAgICBXcml0ZUJ5dGVzKFNlY3Rpb24uZ2V0U2VjdGlvbk5hbWUoKSwgMTYpOworICAgIFdyaXRlQnl0ZXMoU2VjdGlvbi5nZXRTZWdtZW50TmFtZSgpLCAxNik7CisgICAgaWYgKElzNjRCaXQpIHsKKyAgICAgIFdyaXRlNjQoTGF5b3V0LmdldFNlY3Rpb25BZGRyZXNzKCZTRCkpOyAvLyBhZGRyZXNzCisgICAgICBXcml0ZTY0KFNlY3Rpb25TaXplKTsgLy8gc2l6ZQorICAgIH0gZWxzZSB7CisgICAgICBXcml0ZTMyKExheW91dC5nZXRTZWN0aW9uQWRkcmVzcygmU0QpKTsgLy8gYWRkcmVzcworICAgICAgV3JpdGUzMihTZWN0aW9uU2l6ZSk7IC8vIHNpemUKKyAgICB9CisgICAgV3JpdGUzMihGaWxlT2Zmc2V0KTsKKworICAgIHVuc2lnbmVkIEZsYWdzID0gU2VjdGlvbi5nZXRUeXBlQW5kQXR0cmlidXRlcygpOworICAgIGlmIChTRC5oYXNJbnN0cnVjdGlvbnMoKSkKKyAgICAgIEZsYWdzIHw9IE1DU2VjdGlvbk1hY2hPOjpTX0FUVFJfU09NRV9JTlNUUlVDVElPTlM7CisKKyAgICBhc3NlcnQoaXNQb3dlck9mMl8zMihTRC5nZXRBbGlnbm1lbnQoKSkgJiYgIkludmFsaWQgYWxpZ25tZW50ISIpOworICAgIFdyaXRlMzIoTG9nMl8zMihTRC5nZXRBbGlnbm1lbnQoKSkpOworICAgIFdyaXRlMzIoTnVtUmVsb2NhdGlvbnMgPyBSZWxvY2F0aW9uc1N0YXJ0IDogMCk7CisgICAgV3JpdGUzMihOdW1SZWxvY2F0aW9ucyk7CisgICAgV3JpdGUzMihGbGFncyk7CisgICAgV3JpdGUzMihJbmRpcmVjdFN5bUJhc2UubG9va3VwKCZTRCkpOyAvLyByZXNlcnZlZDEKKyAgICBXcml0ZTMyKFNlY3Rpb24uZ2V0U3R1YlNpemUoKSk7IC8vIHJlc2VydmVkMgorICAgIGlmIChJczY0Qml0KQorICAgICAgV3JpdGUzMigwKTsgLy8gcmVzZXJ2ZWQzCisKKyAgICBhc3NlcnQoT1MudGVsbCgpIC0gU3RhcnQgPT0gSXM2NEJpdCA/IFNlY3Rpb242NFNpemUgOiBTZWN0aW9uMzJTaXplKTsKKyAgfQorCisgIHZvaWQgV3JpdGVTeW10YWJMb2FkQ29tbWFuZCh1aW50MzJfdCBTeW1ib2xPZmZzZXQsIHVpbnQzMl90IE51bVN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdHJpbmdUYWJsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0cmluZ1RhYmxlU2l6ZSkgeworICAgIC8vIHN0cnVjdCBzeW10YWJfY29tbWFuZCAoMjQgYnl0ZXMpCisKKyAgICB1aW50NjRfdCBTdGFydCA9IE9TLnRlbGwoKTsKKyAgICAodm9pZCkgU3RhcnQ7CisKKyAgICBXcml0ZTMyKExDVF9TeW10YWIpOworICAgIFdyaXRlMzIoU3ltdGFiTG9hZENvbW1hbmRTaXplKTsKKyAgICBXcml0ZTMyKFN5bWJvbE9mZnNldCk7CisgICAgV3JpdGUzMihOdW1TeW1ib2xzKTsKKyAgICBXcml0ZTMyKFN0cmluZ1RhYmxlT2Zmc2V0KTsKKyAgICBXcml0ZTMyKFN0cmluZ1RhYmxlU2l6ZSk7CisKKyAgICBhc3NlcnQoT1MudGVsbCgpIC0gU3RhcnQgPT0gU3ltdGFiTG9hZENvbW1hbmRTaXplKTsKKyAgfQorCisgIHZvaWQgV3JpdGVEeXN5bXRhYkxvYWRDb21tYW5kKHVpbnQzMl90IEZpcnN0TG9jYWxTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bUxvY2FsU3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRmlyc3RFeHRlcm5hbFN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtRXh0ZXJuYWxTeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBGaXJzdFVuZGVmaW5lZFN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtVW5kZWZpbmVkU3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5kaXJlY3RTeW1ib2xPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bUluZGlyZWN0U3ltYm9scykgeworICAgIC8vIHN0cnVjdCBkeXN5bXRhYl9jb21tYW5kICg4MCBieXRlcykKKworICAgIHVpbnQ2NF90IFN0YXJ0ID0gT1MudGVsbCgpOworICAgICh2b2lkKSBTdGFydDsKKworICAgIFdyaXRlMzIoTENUX0R5c3ltdGFiKTsKKyAgICBXcml0ZTMyKER5c3ltdGFiTG9hZENvbW1hbmRTaXplKTsKKyAgICBXcml0ZTMyKEZpcnN0TG9jYWxTeW1ib2wpOworICAgIFdyaXRlMzIoTnVtTG9jYWxTeW1ib2xzKTsKKyAgICBXcml0ZTMyKEZpcnN0RXh0ZXJuYWxTeW1ib2wpOworICAgIFdyaXRlMzIoTnVtRXh0ZXJuYWxTeW1ib2xzKTsKKyAgICBXcml0ZTMyKEZpcnN0VW5kZWZpbmVkU3ltYm9sKTsKKyAgICBXcml0ZTMyKE51bVVuZGVmaW5lZFN5bWJvbHMpOworICAgIFdyaXRlMzIoMCk7IC8vIHRvY29mZgorICAgIFdyaXRlMzIoMCk7IC8vIG50b2MKKyAgICBXcml0ZTMyKDApOyAvLyBtb2R0YWJvZmYKKyAgICBXcml0ZTMyKDApOyAvLyBubW9kdGFiCisgICAgV3JpdGUzMigwKTsgLy8gZXh0cmVmc3ltb2ZmCisgICAgV3JpdGUzMigwKTsgLy8gbmV4dHJlZnN5bXMKKyAgICBXcml0ZTMyKEluZGlyZWN0U3ltYm9sT2Zmc2V0KTsKKyAgICBXcml0ZTMyKE51bUluZGlyZWN0U3ltYm9scyk7CisgICAgV3JpdGUzMigwKTsgLy8gZXh0cmVsb2ZmCisgICAgV3JpdGUzMigwKTsgLy8gbmV4dHJlbAorICAgIFdyaXRlMzIoMCk7IC8vIGxvY3JlbG9mZgorICAgIFdyaXRlMzIoMCk7IC8vIG5sb2NyZWwKKworICAgIGFzc2VydChPUy50ZWxsKCkgLSBTdGFydCA9PSBEeXN5bXRhYkxvYWRDb21tYW5kU2l6ZSk7CisgIH0KKworICB2b2lkIFdyaXRlTmxpc3QoTWFjaFN5bWJvbERhdGEgJk1TRCwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgeworICAgIE1DU3ltYm9sRGF0YSAmRGF0YSA9ICpNU0QuU3ltYm9sRGF0YTsKKyAgICBjb25zdCBNQ1N5bWJvbCAmU3ltYm9sID0gRGF0YS5nZXRTeW1ib2woKTsKKyAgICB1aW50OF90IFR5cGUgPSAwOworICAgIHVpbnQxNl90IEZsYWdzID0gRGF0YS5nZXRGbGFncygpOworICAgIHVpbnQzMl90IEFkZHJlc3MgPSAwOworCisgICAgLy8gU2V0IHRoZSBOX1RZUEUgYml0cy4gU2VlIDxtYWNoLW8vbmxpc3QuaD4uCisgICAgLy8KKyAgICAvLyBGSVhNRTogQXJlIHRoZSBwcmVib3VuZCBvciBpbmRpcmVjdCBmaWVsZHMgcG9zc2libGUgaGVyZT8KKyAgICBpZiAoU3ltYm9sLmlzVW5kZWZpbmVkKCkpCisgICAgICBUeXBlID0gU1RUX1VuZGVmaW5lZDsKKyAgICBlbHNlIGlmIChTeW1ib2wuaXNBYnNvbHV0ZSgpKQorICAgICAgVHlwZSA9IFNUVF9BYnNvbHV0ZTsKKyAgICBlbHNlCisgICAgICBUeXBlID0gU1RUX1NlY3Rpb247CisKKyAgICAvLyBGSVhNRTogU2V0IFNUQUIgYml0cy4KKworICAgIGlmIChEYXRhLmlzUHJpdmF0ZUV4dGVybigpKQorICAgICAgVHlwZSB8PSBTVEZfUHJpdmF0ZUV4dGVybjsKKworICAgIC8vIFNldCBleHRlcm5hbCBiaXQuCisgICAgaWYgKERhdGEuaXNFeHRlcm5hbCgpIHx8IFN5bWJvbC5pc1VuZGVmaW5lZCgpKQorICAgICAgVHlwZSB8PSBTVEZfRXh0ZXJuYWw7CisKKyAgICAvLyBDb21wdXRlIHRoZSBzeW1ib2wgYWRkcmVzcy4KKyAgICBpZiAoU3ltYm9sLmlzRGVmaW5lZCgpKSB7CisgICAgICBpZiAoU3ltYm9sLmlzQWJzb2x1dGUoKSkgeworICAgICAgICBBZGRyZXNzID0gY2FzdDxNQ0NvbnN0YW50RXhwcj4oU3ltYm9sLmdldFZhcmlhYmxlVmFsdWUoKSktPmdldFZhbHVlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBZGRyZXNzID0gTGF5b3V0LmdldFN5bWJvbEFkZHJlc3MoJkRhdGEpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoRGF0YS5pc0NvbW1vbigpKSB7CisgICAgICAvLyBDb21tb24gc3ltYm9scyBhcmUgZW5jb2RlZCB3aXRoIHRoZSBzaXplIGluIHRoZSBhZGRyZXNzCisgICAgICAvLyBmaWVsZCwgYW5kIHRoZWlyIGFsaWdubWVudCBpbiB0aGUgZmxhZ3MuCisgICAgICBBZGRyZXNzID0gRGF0YS5nZXRDb21tb25TaXplKCk7CisKKyAgICAgIC8vIENvbW1vbiBhbGlnbm1lbnQgaXMgcGFja2VkIGludG8gdGhlICdkZXNjJyBiaXRzLgorICAgICAgaWYgKHVuc2lnbmVkIEFsaWduID0gRGF0YS5nZXRDb21tb25BbGlnbm1lbnQoKSkgeworICAgICAgICB1bnNpZ25lZCBMb2cyU2l6ZSA9IExvZzJfMzIoQWxpZ24pOworICAgICAgICBhc3NlcnQoKDFVIDw8IExvZzJTaXplKSA9PSBBbGlnbiAmJiAiSW52YWxpZCAnY29tbW9uJyBhbGlnbm1lbnQhIik7CisgICAgICAgIGlmIChMb2cyU2l6ZSA+IDE1KQorICAgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiaW52YWxpZCAnY29tbW9uJyBhbGlnbm1lbnQgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKEFsaWduKSArICInIik7CisgICAgICAgIC8vIEZJWE1FOiBLZWVwIHRoaXMgbWFzayB3aXRoIHRoZSBTeW1ib2xGbGFncyBlbnVtZXJhdGlvbi4KKyAgICAgICAgRmxhZ3MgPSAoRmxhZ3MgJiAweEYwRkYpIHwgKExvZzJTaXplIDw8IDgpOworICAgICAgfQorICAgIH0KKworICAgIC8vIHN0cnVjdCBubGlzdCAoMTIgYnl0ZXMpCisKKyAgICBXcml0ZTMyKE1TRC5TdHJpbmdJbmRleCk7CisgICAgV3JpdGU4KFR5cGUpOworICAgIFdyaXRlOChNU0QuU2VjdGlvbkluZGV4KTsKKworICAgIC8vIFRoZSBNYWNoLU8gc3RyZWFtZXIgdXNlcyB0aGUgbG93ZXN0IDE2LWJpdHMgb2YgdGhlIGZsYWdzIGZvciB0aGUgJ2Rlc2MnCisgICAgLy8gdmFsdWUuCisgICAgV3JpdGUxNihGbGFncyk7CisgICAgaWYgKElzNjRCaXQpCisgICAgICBXcml0ZTY0KEFkZHJlc3MpOworICAgIGVsc2UKKyAgICAgIFdyaXRlMzIoQWRkcmVzcyk7CisgIH0KKworICAvLyBGSVhNRTogV2UgcmVhbGx5IG5lZWQgdG8gaW1wcm92ZSB0aGUgcmVsb2NhdGlvbiB2YWxpZGF0aW9uLiBCYXNpY2FsbHksIHdlCisgIC8vIHdhbnQgdG8gaW1wbGVtZW50IGEgc2VwYXJhdGUgY29tcHV0YXRpb24gd2hpY2ggZXZhbHVhdGVzIHRoZSByZWxvY2F0aW9uCisgIC8vIGVudHJ5IGFzIHRoZSBsaW5rZXIgd291bGQsIGFuZCB2ZXJpZmllcyB0aGF0IHRoZSByZXN1bHRhbnQgZml4dXAgdmFsdWUgaXMKKyAgLy8gZXhhY3RseSB3aGF0IHRoZSBlbmNvZGVyIHdhbnRlZC4gVGhpcyB3aWxsIGNhdGNoIHNldmVyYWwgY2xhc3NlcyBvZgorICAvLyBwcm9ibGVtczoKKyAgLy8KKyAgLy8gIC0gUmVsb2NhdGlvbiBlbnRyeSBidWdzLCB0aGUgdHdvIGFsZ29yaXRobXMgYXJlIHVubGlrZWx5IHRvIGhhdmUgdGhlIHNhbWUKKyAgLy8gICAgZXhhY3QgYnVnLgorICAvLworICAvLyAgLSBSZWxheGF0aW9uIGlzc3Vlcywgd2hlcmUgd2UgZm9yZ2V0IHRvIHJlbGF4IHNvbWV0aGluZy4KKyAgLy8KKyAgLy8gIC0gSW5wdXQgZXJyb3JzLCB3aGVyZSBzb21ldGhpbmcgY2Fubm90IGJlIGNvcnJlY3RseSBlbmNvZGVkLiAnYXMnIGFsbG93cworICAvLyAgICB0aGVzZSB0aHJvdWdoIGluIG1hbnkgY2FzZXMuCisKKyAgdm9pZCBSZWNvcmRYODZfNjRSZWxvY2F0aW9uKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICpGcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwLCBNQ1ZhbHVlIFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZGaXhlZFZhbHVlKSB7CisgICAgdW5zaWduZWQgSXNQQ1JlbCA9IGlzRml4dXBLaW5kUENSZWwoRml4dXAuZ2V0S2luZCgpKTsKKyAgICB1bnNpZ25lZCBJc1JJUFJlbCA9IGlzRml4dXBLaW5kUklQUmVsKEZpeHVwLmdldEtpbmQoKSk7CisgICAgdW5zaWduZWQgTG9nMlNpemUgPSBnZXRGaXh1cEtpbmRMb2cyU2l6ZShGaXh1cC5nZXRLaW5kKCkpOworCisgICAgLy8gU2VlIDxyZWxvYy5oPi4KKyAgICB1aW50MzJfdCBGaXh1cE9mZnNldCA9CisgICAgICBMYXlvdXQuZ2V0RnJhZ21lbnRPZmZzZXQoRnJhZ21lbnQpICsgRml4dXAuZ2V0T2Zmc2V0KCk7CisgICAgdWludDMyX3QgRml4dXBBZGRyZXNzID0KKyAgICAgIExheW91dC5nZXRGcmFnbWVudEFkZHJlc3MoRnJhZ21lbnQpICsgRml4dXAuZ2V0T2Zmc2V0KCk7CisgICAgaW50NjRfdCBWYWx1ZSA9IDA7CisgICAgdW5zaWduZWQgSW5kZXggPSAwOworICAgIHVuc2lnbmVkIElzRXh0ZXJuID0gMDsKKyAgICB1bnNpZ25lZCBUeXBlID0gMDsKKworICAgIFZhbHVlID0gVGFyZ2V0LmdldENvbnN0YW50KCk7CisKKyAgICBpZiAoSXNQQ1JlbCkgeworICAgICAgLy8gQ29tcGVuc2F0ZSBmb3IgdGhlIHJlbG9jYXRpb24gb2Zmc2V0LCBEYXJ3aW4geDg2XzY0IHJlbG9jYXRpb25zIG9ubHkKKyAgICAgIC8vIGhhdmUgdGhlIGFkZGVuZCBhbmQgYXBwZWFyIHRvIGhhdmUgYXR0ZW1wdGVkIHRvIGRlZmluZSBpdCB0byBiZSB0aGUKKyAgICAgIC8vIGFjdHVhbCBleHByZXNzaW9uIGFkZGVuZCB3aXRob3V0IHRoZSBQQ3JlbCBiaWFzLiBIb3dldmVyLCBpbnN0cnVjdGlvbnMKKyAgICAgIC8vIHdpdGggZGF0YSBmb2xsb3dpbmcgdGhlIHJlbG9jYXRpb24gYXJlIG5vdCBhY2NvbW9kYXRlZCBmb3IgKHNlZSBjb21tZW50CisgICAgICAvLyBiZWxvdyByZWdhcmRpbmcgU0lHTkVEezEsMiw0fSksIHNvIGl0IGlzbid0IGV4YWN0bHkgdGhhdCBlaXRoZXIuCisgICAgICBWYWx1ZSArPSAxTEwgPDwgTG9nMlNpemU7CisgICAgfQorCisgICAgaWYgKFRhcmdldC5pc0Fic29sdXRlKCkpIHsgLy8gY29uc3RhbnQKKyAgICAgIC8vIFN5bWJvbE51bSBvZiAwIGluZGljYXRlcyB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KKyAgICAgIFR5cGUgPSBSSVRfWDg2XzY0X1Vuc2lnbmVkOworICAgICAgSW5kZXggPSAwOworCisgICAgICAvLyBGSVhNRTogSSBiZWxpZXZlIHRoaXMgaXMgYnJva2VuLCBJIGRvbid0IHRoaW5rIHRoZSBsaW5rZXIgY2FuCisgICAgICAvLyB1bmRlcnN0YW5kIGl0LiBJIHRoaW5rIGl0IHdvdWxkIHJlcXVpcmUgYSBsb2NhbCByZWxvY2F0aW9uLCBidXQgSSdtIG5vdAorICAgICAgLy8gc3VyZSBpZiB0aGF0IHdvdWxkIHdvcmsgZWl0aGVyLiBUaGUgb2ZmaWNpYWwgd2F5IHRvIGdldCBhbiBhYnNvbHV0ZQorICAgICAgLy8gUENyZWwgcmVsb2NhdGlvbiBpcyB0byB1c2UgYW4gYWJzb2x1dGUgc3ltYm9sICh3aGljaCB3ZSBkb24ndCBzdXBwb3J0CisgICAgICAvLyB5ZXQpLgorICAgICAgaWYgKElzUENSZWwpIHsKKyAgICAgICAgSXNFeHRlcm4gPSAxOworICAgICAgICBUeXBlID0gUklUX1g4Nl82NF9CcmFuY2g7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChUYXJnZXQuZ2V0U3ltQigpKSB7IC8vIEEgLSBCICsgY29uc3RhbnQKKyAgICAgIGNvbnN0IE1DU3ltYm9sICpBID0gJlRhcmdldC5nZXRTeW1BKCktPmdldFN5bWJvbCgpOworICAgICAgTUNTeW1ib2xEYXRhICZBX1NEID0gQXNtLmdldFN5bWJvbERhdGEoKkEpOworICAgICAgY29uc3QgTUNTeW1ib2xEYXRhICpBX0Jhc2UgPSBBc20uZ2V0QXRvbShMYXlvdXQsICZBX1NEKTsKKworICAgICAgY29uc3QgTUNTeW1ib2wgKkIgPSAmVGFyZ2V0LmdldFN5bUIoKS0+Z2V0U3ltYm9sKCk7CisgICAgICBNQ1N5bWJvbERhdGEgJkJfU0QgPSBBc20uZ2V0U3ltYm9sRGF0YSgqQik7CisgICAgICBjb25zdCBNQ1N5bWJvbERhdGEgKkJfQmFzZSA9IEFzbS5nZXRBdG9tKExheW91dCwgJkJfU0QpOworCisgICAgICAvLyBOZWl0aGVyIHN5bWJvbCBjYW4gYmUgbW9kaWZpZWQuCisgICAgICBpZiAoVGFyZ2V0LmdldFN5bUEoKS0+Z2V0S2luZCgpICE9IE1DU3ltYm9sUmVmRXhwcjo6VktfTm9uZSB8fAorICAgICAgICAgIFRhcmdldC5nZXRTeW1CKCktPmdldEtpbmQoKSAhPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX05vbmUpCisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBvZiBtb2RpZmllZCBzeW1ib2wiKTsKKworICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBQQ3JlbCByZWxvY2F0aW9ucyBvZiBkaWZmZXJlbmNlcy4gRGFyd2luICdhcycgZG9lc24ndAorICAgICAgLy8gaW1wbGVtZW50IG1vc3Qgb2YgdGhlc2UgY29ycmVjdGx5LgorICAgICAgaWYgKElzUENSZWwpCisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigidW5zdXBwb3J0ZWQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbiBvZiBkaWZmZXJlbmNlIik7CisKKyAgICAgIC8vIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IGFueSBzaXR1YXRpb24gd2hlcmUgb25lIG9yIGJvdGggb2YgdGhlCisgICAgICAvLyBzeW1ib2xzIHdvdWxkIHJlcXVpcmUgYSBsb2NhbCByZWxvY2F0aW9uLiBUaGlzIGlzIGFsbW9zdCBjZXJ0YWlubHkKKyAgICAgIC8vIHVudXNlZCBhbmQgbWF5IG5vdCBiZSBwb3NzaWJsZSB0byBlbmNvZGUgY29ycmVjdGx5LgorICAgICAgaWYgKCFBX0Jhc2UgfHwgIUJfQmFzZSkKKyAgICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJ1bnN1cHBvcnRlZCBsb2NhbCByZWxvY2F0aW9ucyBpbiBkaWZmZXJlbmNlIik7CisKKyAgICAgIC8vIERhcndpbiAnYXMnIGRvZXNuJ3QgZW1pdCBjb3JyZWN0IHJlbG9jYXRpb25zIGZvciB0aGlzIChpdCBlbmRzIHVwIHdpdGgKKyAgICAgIC8vIGEgc2luZ2xlIFNJR05FRCByZWxvY2F0aW9uKTsgcmVqZWN0IGl0IGZvciBub3cuCisgICAgICBpZiAoQV9CYXNlID09IEJfQmFzZSkKKyAgICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHdpdGggaWRlbnRpY2FsIGJhc2UiKTsKKworICAgICAgVmFsdWUgKz0gTGF5b3V0LmdldFN5bWJvbEFkZHJlc3MoJkFfU0QpIC0gTGF5b3V0LmdldFN5bWJvbEFkZHJlc3MoQV9CYXNlKTsKKyAgICAgIFZhbHVlIC09IExheW91dC5nZXRTeW1ib2xBZGRyZXNzKCZCX1NEKSAtIExheW91dC5nZXRTeW1ib2xBZGRyZXNzKEJfQmFzZSk7CisKKyAgICAgIEluZGV4ID0gQV9CYXNlLT5nZXRJbmRleCgpOworICAgICAgSXNFeHRlcm4gPSAxOworICAgICAgVHlwZSA9IFJJVF9YODZfNjRfVW5zaWduZWQ7CisKKyAgICAgIE1hY2hSZWxvY2F0aW9uRW50cnkgTVJFOworICAgICAgTVJFLldvcmQwID0gRml4dXBPZmZzZXQ7CisgICAgICBNUkUuV29yZDEgPSAoKEluZGV4ICAgICA8PCAgMCkgfAorICAgICAgICAgICAgICAgICAgIChJc1BDUmVsICAgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAoTG9nMlNpemUgIDw8IDI1KSB8CisgICAgICAgICAgICAgICAgICAgKElzRXh0ZXJuICA8PCAyNykgfAorICAgICAgICAgICAgICAgICAgIChUeXBlICAgICAgPDwgMjgpKTsKKyAgICAgIFJlbG9jYXRpb25zW0ZyYWdtZW50LT5nZXRQYXJlbnQoKV0ucHVzaF9iYWNrKE1SRSk7CisKKyAgICAgIEluZGV4ID0gQl9CYXNlLT5nZXRJbmRleCgpOworICAgICAgSXNFeHRlcm4gPSAxOworICAgICAgVHlwZSA9IFJJVF9YODZfNjRfU3VidHJhY3RvcjsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgTUNTeW1ib2wgKlN5bWJvbCA9ICZUYXJnZXQuZ2V0U3ltQSgpLT5nZXRTeW1ib2woKTsKKyAgICAgIE1DU3ltYm9sRGF0YSAmU0QgPSBBc20uZ2V0U3ltYm9sRGF0YSgqU3ltYm9sKTsKKyAgICAgIGNvbnN0IE1DU3ltYm9sRGF0YSAqQmFzZSA9IEFzbS5nZXRBdG9tKExheW91dCwgJlNEKTsKKworICAgICAgLy8gUmVsb2NhdGlvbnMgaW5zaWRlIGRlYnVnIHNlY3Rpb25zIGFsd2F5cyB1c2UgbG9jYWwgcmVsb2NhdGlvbnMgd2hlbgorICAgICAgLy8gcG9zc2libGUuIFRoaXMgc2VlbXMgdG8gYmUgZG9uZSBiZWNhdXNlIHRoZSBkZWJ1Z2dlciBkb2Vzbid0IGZ1bGx5CisgICAgICAvLyB1bmRlcnN0YW5kIHg4Nl82NCByZWxvY2F0aW9uIGVudHJpZXMsIGFuZCBleHBlY3RzIHRvIGZpbmQgdmFsdWVzIHRoYXQKKyAgICAgIC8vIGhhdmUgYWxyZWFkeSBiZWVuIGZpeGVkIHVwLgorICAgICAgaWYgKFN5bWJvbC0+aXNJblNlY3Rpb24oKSkgeworICAgICAgICBjb25zdCBNQ1NlY3Rpb25NYWNoTyAmU2VjdGlvbiA9IHN0YXRpY19jYXN0PGNvbnN0IE1DU2VjdGlvbk1hY2hPJj4oCisgICAgICAgICAgRnJhZ21lbnQtPmdldFBhcmVudCgpLT5nZXRTZWN0aW9uKCkpOworICAgICAgICBpZiAoU2VjdGlvbi5oYXNBdHRyaWJ1dGUoTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9ERUJVRykpCisgICAgICAgICAgQmFzZSA9IDA7CisgICAgICB9CisKKyAgICAgIC8vIHg4Nl82NCBhbG1vc3QgYWx3YXlzIHVzZXMgZXh0ZXJuYWwgcmVsb2NhdGlvbnMsIGV4Y2VwdCB3aGVuIHRoZXJlIGlzIG5vCisgICAgICAvLyBzeW1ib2wgdG8gdXNlIGFzIGEgYmFzZSBhZGRyZXNzIChhIGxvY2FsIHN5bWJvbCB3aXRoIG5vIHByZWNlZWRpbmcKKyAgICAgIC8vIG5vbi1sb2NhbCBzeW1ib2wpLgorICAgICAgaWYgKEJhc2UpIHsKKyAgICAgICAgSW5kZXggPSBCYXNlLT5nZXRJbmRleCgpOworICAgICAgICBJc0V4dGVybiA9IDE7CisKKyAgICAgICAgLy8gQWRkIHRoZSBsb2NhbCBvZmZzZXQsIGlmIG5lZWRlZC4KKyAgICAgICAgaWYgKEJhc2UgIT0gJlNEKQorICAgICAgICAgIFZhbHVlICs9IExheW91dC5nZXRTeW1ib2xBZGRyZXNzKCZTRCkgLSBMYXlvdXQuZ2V0U3ltYm9sQWRkcmVzcyhCYXNlKTsKKyAgICAgIH0gZWxzZSBpZiAoU3ltYm9sLT5pc0luU2VjdGlvbigpKSB7CisgICAgICAgIC8vIFRoZSBpbmRleCBpcyB0aGUgc2VjdGlvbiBvcmRpbmFsICgxLWJhc2VkKS4KKyAgICAgICAgSW5kZXggPSBTRC5nZXRGcmFnbWVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0T3JkaW5hbCgpICsgMTsKKyAgICAgICAgSXNFeHRlcm4gPSAwOworICAgICAgICBWYWx1ZSArPSBMYXlvdXQuZ2V0U3ltYm9sQWRkcmVzcygmU0QpOworCisgICAgICAgIGlmIChJc1BDUmVsKQorICAgICAgICAgIFZhbHVlIC09IEZpeHVwQWRkcmVzcyArICgxIDw8IExvZzJTaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBvZiB1bmRlZmluZWQgc3ltYm9sICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbC0+Z2V0TmFtZSgpICsgIiciKTsKKyAgICAgIH0KKworICAgICAgTUNTeW1ib2xSZWZFeHByOjpWYXJpYW50S2luZCBNb2RpZmllciA9IFRhcmdldC5nZXRTeW1BKCktPmdldEtpbmQoKTsKKyAgICAgIGlmIChJc1BDUmVsKSB7CisgICAgICAgIGlmIChJc1JJUFJlbCkgeworICAgICAgICAgIGlmIChNb2RpZmllciA9PSBNQ1N5bWJvbFJlZkV4cHI6OlZLX0dPVFBDUkVMKSB7CisgICAgICAgICAgICAvLyB4ODZfNjQgZGlzdGluZ3Vpc2hlcyBtb3ZxIGZvb0BHT1RQQ1JFTCBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuCisgICAgICAgICAgICAvLyByZXdyaXRlIHRoZSBtb3ZxIHRvIGFuIGxlYXEgYXQgbGluayB0aW1lIGlmIHRoZSBzeW1ib2wgZW5kcyB1cCBpbgorICAgICAgICAgICAgLy8gdGhlIHNhbWUgbGlua2FnZSB1bml0LgorICAgICAgICAgICAgaWYgKHVuc2lnbmVkKEZpeHVwLmdldEtpbmQoKSkgPT0gWDg2OjpyZWxvY19yaXByZWxfNGJ5dGVfbW92cV9sb2FkKQorICAgICAgICAgICAgICBUeXBlID0gUklUX1g4Nl82NF9HT1RMb2FkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBUeXBlID0gUklUX1g4Nl82NF9HT1Q7CisgICAgICAgICAgfSAgZWxzZSBpZiAoTW9kaWZpZXIgPT0gTUNTeW1ib2xSZWZFeHByOjpWS19UTFZQKSB7CisgICAgICAgICAgICBUeXBlID0gUklUX1g4Nl82NF9UTFY7CisgICAgICAgICAgfSAgZWxzZSBpZiAoTW9kaWZpZXIgIT0gTUNTeW1ib2xSZWZFeHByOjpWS19Ob25lKSB7CisgICAgICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoInVuc3VwcG9ydGVkIHN5bWJvbCBtb2RpZmllciBpbiByZWxvY2F0aW9uIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFR5cGUgPSBSSVRfWDg2XzY0X1NpZ25lZDsKKworICAgICAgICAgICAgLy8gVGhlIERhcndpbiB4ODZfNjQgcmVsb2NhdGlvbiBmb3JtYXQgaGFzIGEgcHJvYmxlbSB3aGVyZSBpdCBjYW5ub3QKKyAgICAgICAgICAgIC8vIGVuY29kZSBhbiBhZGRyZXNzIChMPGZvbz4gKyA8Y29uc3RhbnQ+KSB3aGljaCBpcyBvdXRzaWRlIHRoZSBhdG9tCisgICAgICAgICAgICAvLyBjb250YWluaW5nIEw8Zm9vPi4gR2VuZXJhbGx5LCB0aGlzIHNob3VsZG4ndCBvY2N1ciBidXQgaXQgZG9lcworICAgICAgICAgICAgLy8gaGFwcGVuIHdoZW4gd2UgaGF2ZSBhIFJJUHJlbCBpbnN0cnVjdGlvbiB3aXRoIGRhdGEgZm9sbG93aW5nIHRoZQorICAgICAgICAgICAgLy8gcmVsb2NhdGlvbiBlbnRyeSAoZS5nLiwgbW92YiAkMDEyLCBMMCglcmlwKSkuIEV2ZW4gd2l0aCB0aGUgUENyZWwKKyAgICAgICAgICAgIC8vIGFkanVzdG1lbnQgRGFyd2luIHg4Nl82NCB1c2VzLCB0aGUgb2Zmc2V0IGlzIHN0aWxsIG5lZ2F0aXZlIGFuZAorICAgICAgICAgICAgLy8gdGhlIGxpbmtlciBoYXMgbm8gd2F5IHRvIHJlY29nbml6ZSB0aGlzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIERhcndpbiB1c2VzIHNldmVyYWwgc3BlY2lhbCByZWxvY2F0aW9uIHR5cGVzCisgICAgICAgICAgICAvLyB0byBpbmRpY2F0ZSB0aGUgb2Zmc2V0cy4gSG93ZXZlciwgdGhlIHNwZWNpZmljYXRpb24gb3IKKyAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIHNlZW1zIHRvIGFsc28gYmUgaW5jb21wbGV0ZTsgdGhleSBzaG91bGQKKyAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWRkZW5kIGFzIHdlbGwgYmFzZWQgb24gdGhlIGFjdHVhbCBlbmNvZGVkIGluc3RydWN0aW9uCisgICAgICAgICAgICAvLyAodGhlIGFkZGl0aW9uYWwgYmlhcyksIGJ1dCBpbnN0ZWFkIGFwcGVhciB0byBqdXN0IGxvb2sgYXQgdGhlCisgICAgICAgICAgICAvLyBmaW5hbCBvZmZzZXQuCisgICAgICAgICAgICBzd2l0Y2ggKC0oVGFyZ2V0LmdldENvbnN0YW50KCkgKyAoMUxMIDw8IExvZzJTaXplKSkpIHsKKyAgICAgICAgICAgIGNhc2UgMTogVHlwZSA9IFJJVF9YODZfNjRfU2lnbmVkMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IFR5cGUgPSBSSVRfWDg2XzY0X1NpZ25lZDI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiBUeXBlID0gUklUX1g4Nl82NF9TaWduZWQ0OyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKE1vZGlmaWVyICE9IE1DU3ltYm9sUmVmRXhwcjo6VktfTm9uZSkKKyAgICAgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigidW5zdXBwb3J0ZWQgc3ltYm9sIG1vZGlmaWVyIGluIGJyYW5jaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsb2NhdGlvbiIpOworCisgICAgICAgICAgVHlwZSA9IFJJVF9YODZfNjRfQnJhbmNoOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoTW9kaWZpZXIgPT0gTUNTeW1ib2xSZWZFeHByOjpWS19HT1QpIHsKKyAgICAgICAgICBUeXBlID0gUklUX1g4Nl82NF9HT1Q7CisgICAgICAgIH0gZWxzZSBpZiAoTW9kaWZpZXIgPT0gTUNTeW1ib2xSZWZFeHByOjpWS19HT1RQQ1JFTCkgeworICAgICAgICAgIC8vIEdPVFBDUkVMIGlzIGFsbG93ZWQgYXMgYSBtb2RpZmllciBvbiBub24tUENyZWwgaW5zdHJ1Y3Rpb25zLCBpbgorICAgICAgICAgIC8vIHdoaWNoIGNhc2UgYWxsIHdlIGRvIGlzIHNldCB0aGUgUENyZWwgYml0IGluIHRoZSByZWxvY2F0aW9uIGVudHJ5OworICAgICAgICAgIC8vIHRoaXMgaXMgdXNlZCB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZywgZm9yIGV4YW1wbGUuIFRoZSBzb3VyY2UgaXMKKyAgICAgICAgICAvLyByZXF1aXJlZCB0byBpbmNsdWRlIGFueSBuZWNlc3Nhcnkgb2Zmc2V0IGRpcmVjdGx5LgorICAgICAgICAgIFR5cGUgPSBSSVRfWDg2XzY0X0dPVDsKKyAgICAgICAgICBJc1BDUmVsID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChNb2RpZmllciA9PSBNQ1N5bWJvbFJlZkV4cHI6OlZLX1RMVlApIHsKKyAgICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlRMVlAgc3ltYm9sIG1vZGlmaWVyIHNob3VsZCBoYXZlIGJlZW4gcmlwLXJlbCIpOworICAgICAgICB9IGVsc2UgaWYgKE1vZGlmaWVyICE9IE1DU3ltYm9sUmVmRXhwcjo6VktfTm9uZSkKKyAgICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoInVuc3VwcG9ydGVkIHN5bWJvbCBtb2RpZmllciBpbiByZWxvY2F0aW9uIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBUeXBlID0gUklUX1g4Nl82NF9VbnNpZ25lZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB4ODZfNjQgYWx3YXlzIHdyaXRlcyBjdXN0b20gdmFsdWVzIGludG8gdGhlIGZpeHVwcy4KKyAgICBGaXhlZFZhbHVlID0gVmFsdWU7CisKKyAgICAvLyBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICg4IGJ5dGVzKQorICAgIE1hY2hSZWxvY2F0aW9uRW50cnkgTVJFOworICAgIE1SRS5Xb3JkMCA9IEZpeHVwT2Zmc2V0OworICAgIE1SRS5Xb3JkMSA9ICgoSW5kZXggICAgIDw8ICAwKSB8CisgICAgICAgICAgICAgICAgIChJc1BDUmVsICAgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgKExvZzJTaXplICA8PCAyNSkgfAorICAgICAgICAgICAgICAgICAoSXNFeHRlcm4gIDw8IDI3KSB8CisgICAgICAgICAgICAgICAgIChUeXBlICAgICAgPDwgMjgpKTsKKyAgICBSZWxvY2F0aW9uc1tGcmFnbWVudC0+Z2V0UGFyZW50KCldLnB1c2hfYmFjayhNUkUpOworICB9CisKKyAgdm9pZCBSZWNvcmRTY2F0dGVyZWRSZWxvY2F0aW9uKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICZGaXh1cCwgTUNWYWx1ZSBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmRml4ZWRWYWx1ZSkgeworICAgIHVpbnQzMl90IEZpeHVwT2Zmc2V0ID0gTGF5b3V0LmdldEZyYWdtZW50T2Zmc2V0KEZyYWdtZW50KStGaXh1cC5nZXRPZmZzZXQoKTsKKyAgICB1bnNpZ25lZCBJc1BDUmVsID0gaXNGaXh1cEtpbmRQQ1JlbChGaXh1cC5nZXRLaW5kKCkpOworICAgIHVuc2lnbmVkIExvZzJTaXplID0gZ2V0Rml4dXBLaW5kTG9nMlNpemUoRml4dXAuZ2V0S2luZCgpKTsKKyAgICB1bnNpZ25lZCBUeXBlID0gUklUX1ZhbmlsbGE7CisKKyAgICAvLyBTZWUgPHJlbG9jLmg+LgorICAgIGNvbnN0IE1DU3ltYm9sICpBID0gJlRhcmdldC5nZXRTeW1BKCktPmdldFN5bWJvbCgpOworICAgIE1DU3ltYm9sRGF0YSAqQV9TRCA9ICZBc20uZ2V0U3ltYm9sRGF0YSgqQSk7CisKKyAgICBpZiAoIUFfU0QtPmdldEZyYWdtZW50KCkpCisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoInN5bWJvbCAnIiArIEEtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiJyBjYW4gbm90IGJlIHVuZGVmaW5lZCBpbiBhIHN1YnRyYWN0aW9uIGV4cHJlc3Npb24iKTsKKworICAgIHVpbnQzMl90IFZhbHVlID0gTGF5b3V0LmdldFN5bWJvbEFkZHJlc3MoQV9TRCk7CisgICAgdWludDMyX3QgVmFsdWUyID0gMDsKKworICAgIGlmIChjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKkIgPSBUYXJnZXQuZ2V0U3ltQigpKSB7CisgICAgICBNQ1N5bWJvbERhdGEgKkJfU0QgPSAmQXNtLmdldFN5bWJvbERhdGEoQi0+Z2V0U3ltYm9sKCkpOworCisgICAgICBpZiAoIUJfU0QtPmdldEZyYWdtZW50KCkpCisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigic3ltYm9sICciICsgQi0+Z2V0U3ltYm9sKCkuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIicgY2FuIG5vdCBiZSB1bmRlZmluZWQgaW4gYSBzdWJ0cmFjdGlvbiBleHByZXNzaW9uIik7CisKKyAgICAgIC8vIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgZGlmZmVyZW5jZSByZWxvY2F0aW9uIHR5cGUuCisgICAgICAvLworICAgICAgLy8gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgc2VtYW50aWMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIHR3bworICAgICAgLy8gcmVsb2NhdGlvbiB0eXBlcyBmcm9tIHRoZSBsaW5rZXJzIHBvaW50IG9mIHZpZXcsIHRoaXMgaXMgZG9uZSBzb2xlbHkKKyAgICAgIC8vIGZvciBwZWRhbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggJ2FzJy4KKyAgICAgIFR5cGUgPSBBX1NELT5pc0V4dGVybmFsKCkgPyBSSVRfRGlmZmVyZW5jZSA6IFJJVF9Mb2NhbERpZmZlcmVuY2U7CisgICAgICBWYWx1ZTIgPSBMYXlvdXQuZ2V0U3ltYm9sQWRkcmVzcyhCX1NEKTsKKyAgICB9CisKKyAgICAvLyBSZWxvY2F0aW9ucyBhcmUgd3JpdHRlbiBvdXQgaW4gcmV2ZXJzZSBvcmRlciwgc28gdGhlIFBBSVIgY29tZXMgZmlyc3QuCisgICAgaWYgKFR5cGUgPT0gUklUX0RpZmZlcmVuY2UgfHwgVHlwZSA9PSBSSVRfTG9jYWxEaWZmZXJlbmNlKSB7CisgICAgICBNYWNoUmVsb2NhdGlvbkVudHJ5IE1SRTsKKyAgICAgIE1SRS5Xb3JkMCA9ICgoMCAgICAgICAgIDw8ICAwKSB8CisgICAgICAgICAgICAgICAgICAgKFJJVF9QYWlyICA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgIChMb2cyU2l6ZSAgPDwgMjgpIHwKKyAgICAgICAgICAgICAgICAgICAoSXNQQ1JlbCAgIDw8IDMwKSB8CisgICAgICAgICAgICAgICAgICAgUkZfU2NhdHRlcmVkKTsKKyAgICAgIE1SRS5Xb3JkMSA9IFZhbHVlMjsKKyAgICAgIFJlbG9jYXRpb25zW0ZyYWdtZW50LT5nZXRQYXJlbnQoKV0ucHVzaF9iYWNrKE1SRSk7CisgICAgfQorCisgICAgTWFjaFJlbG9jYXRpb25FbnRyeSBNUkU7CisgICAgTVJFLldvcmQwID0gKChGaXh1cE9mZnNldCA8PCAgMCkgfAorICAgICAgICAgICAgICAgICAoVHlwZSAgICAgICAgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgKExvZzJTaXplICAgIDw8IDI4KSB8CisgICAgICAgICAgICAgICAgIChJc1BDUmVsICAgICA8PCAzMCkgfAorICAgICAgICAgICAgICAgICBSRl9TY2F0dGVyZWQpOworICAgIE1SRS5Xb3JkMSA9IFZhbHVlOworICAgIFJlbG9jYXRpb25zW0ZyYWdtZW50LT5nZXRQYXJlbnQoKV0ucHVzaF9iYWNrKE1SRSk7CisgIH0KKworICB2b2lkIFJlY29yZFRMVlBSZWxvY2F0aW9uKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICpGcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICZGaXh1cCwgTUNWYWx1ZSBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJkZpeGVkVmFsdWUpIHsKKyAgICBhc3NlcnQoVGFyZ2V0LmdldFN5bUEoKS0+Z2V0S2luZCgpID09IE1DU3ltYm9sUmVmRXhwcjo6VktfVExWUCAmJgorICAgICAgICAgICAhSXM2NEJpdCAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggYSAzMi1iaXQgVExWUCByZWxvY2F0aW9uISIpOworCisgICAgdW5zaWduZWQgTG9nMlNpemUgPSBnZXRGaXh1cEtpbmRMb2cyU2l6ZShGaXh1cC5nZXRLaW5kKCkpOworICAgIHVpbnQzMl90IFZhbHVlID0gTGF5b3V0LmdldEZyYWdtZW50T2Zmc2V0KEZyYWdtZW50KStGaXh1cC5nZXRPZmZzZXQoKTsKKyAgICB1bnNpZ25lZCBJc1BDUmVsID0gMDsKKworICAgIC8vIEdldCB0aGUgc3ltYm9sIGRhdGEuCisgICAgTUNTeW1ib2xEYXRhICpTRF9BID0gJkFzbS5nZXRTeW1ib2xEYXRhKFRhcmdldC5nZXRTeW1BKCktPmdldFN5bWJvbCgpKTsKKyAgICB1bnNpZ25lZCBJbmRleCA9IFNEX0EtPmdldEluZGV4KCk7CisKKyAgICAvLyBXZSdyZSBvbmx5IGdvaW5nIHRvIGhhdmUgYSBzZWNvbmQgc3ltYm9sIGluIHBpYyBtb2RlIGFuZCBpdCdsbCBiZSBhCisgICAgLy8gc3VidHJhY3Rpb24gZnJvbSB0aGUgcGljYmFzZS4gRm9yIDMyLWJpdCBwaWMgdGhlIGFkZGVuZCBpcyB0aGUgZGlmZmVyZW5jZQorICAgIC8vIGJldHdlZW4gdGhlIHBpY2Jhc2UgYW5kIHRoZSBuZXh0IGFkZHJlc3MuICBGb3IgMzItYml0IHN0YXRpYyB0aGUgYWRkZW5kCisgICAgLy8gaXMgemVyby4KKyAgICBpZiAoVGFyZ2V0LmdldFN5bUIoKSkgeworICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YnRyYWN0aW9uIHRoZW4gd2UncmUgcGNyZWwuCisgICAgICB1aW50MzJfdCBGaXh1cEFkZHJlc3MgPQorICAgICAgTGF5b3V0LmdldEZyYWdtZW50QWRkcmVzcyhGcmFnbWVudCkgKyBGaXh1cC5nZXRPZmZzZXQoKTsKKyAgICAgIE1DU3ltYm9sRGF0YSAqU0RfQiA9ICZBc20uZ2V0U3ltYm9sRGF0YShUYXJnZXQuZ2V0U3ltQigpLT5nZXRTeW1ib2woKSk7CisgICAgICBJc1BDUmVsID0gMTsKKyAgICAgIEZpeGVkVmFsdWUgPSAoRml4dXBBZGRyZXNzIC0gTGF5b3V0LmdldFN5bWJvbEFkZHJlc3MoU0RfQikgKworICAgICAgICAgICAgICAgICAgICBUYXJnZXQuZ2V0Q29uc3RhbnQoKSk7CisgICAgICBGaXhlZFZhbHVlICs9IDEgPDwgTG9nMlNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpeGVkVmFsdWUgPSAwOworICAgIH0KKyAgICAKKyAgICAvLyBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICg4IGJ5dGVzKQorICAgIE1hY2hSZWxvY2F0aW9uRW50cnkgTVJFOworICAgIE1SRS5Xb3JkMCA9IFZhbHVlOworICAgIE1SRS5Xb3JkMSA9ICgoSW5kZXggICAgIDw8ICAwKSB8CisgICAgICAgICAgICAgICAgIChJc1BDUmVsICAgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgKExvZzJTaXplICA8PCAyNSkgfAorICAgICAgICAgICAgICAgICAoMSAgICAgICAgIDw8IDI3KSB8IC8vIEV4dGVybgorICAgICAgICAgICAgICAgICAoUklUX1RMViAgIDw8IDI4KSk7IC8vIFR5cGUKKyAgICBSZWxvY2F0aW9uc1tGcmFnbWVudC0+Z2V0UGFyZW50KCldLnB1c2hfYmFjayhNUkUpOworICB9CisgIAorICB2b2lkIFJlY29yZFJlbG9jYXRpb24oY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRnJhZ21lbnQgKkZyYWdtZW50LCBjb25zdCBNQ0ZpeHVwICZGaXh1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1DVmFsdWUgVGFyZ2V0LCB1aW50NjRfdCAmRml4ZWRWYWx1ZSkgeworICAgIGlmIChJczY0Qml0KSB7CisgICAgICBSZWNvcmRYODZfNjRSZWxvY2F0aW9uKEFzbSwgTGF5b3V0LCBGcmFnbWVudCwgRml4dXAsIFRhcmdldCwgRml4ZWRWYWx1ZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdW5zaWduZWQgSXNQQ1JlbCA9IGlzRml4dXBLaW5kUENSZWwoRml4dXAuZ2V0S2luZCgpKTsKKyAgICB1bnNpZ25lZCBMb2cyU2l6ZSA9IGdldEZpeHVwS2luZExvZzJTaXplKEZpeHVwLmdldEtpbmQoKSk7CisKKyAgICAvLyBJZiB0aGlzIGlzIGEgMzItYml0IFRMVlAgcmVsb2MgaXQncyBoYW5kbGVkIGEgYml0IGRpZmZlcmVudGx5LgorICAgIGlmIChUYXJnZXQuZ2V0U3ltQSgpLT5nZXRLaW5kKCkgPT0gTUNTeW1ib2xSZWZFeHByOjpWS19UTFZQKSB7CisgICAgICBSZWNvcmRUTFZQUmVsb2NhdGlvbihBc20sIExheW91dCwgRnJhZ21lbnQsIEZpeHVwLCBUYXJnZXQsIEZpeGVkVmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGEgZGlmZmVyZW5jZSBvciBhIGRlZmluZWQgc3ltYm9sIHBsdXMgYW4gb2Zmc2V0LCB0aGVuIHdlIG5lZWQKKyAgICAvLyBhIHNjYXR0ZXJlZCByZWxvY2F0aW9uIGVudHJ5LgorICAgIC8vIERpZmZlcmVuY2VzIGFsd2F5cyByZXF1aXJlIHNjYXR0ZXJlZCByZWxvY2F0aW9ucy4KKyAgICBpZiAoVGFyZ2V0LmdldFN5bUIoKSkKKyAgICAgICAgcmV0dXJuIFJlY29yZFNjYXR0ZXJlZFJlbG9jYXRpb24oQXNtLCBMYXlvdXQsIEZyYWdtZW50LCBGaXh1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LCBGaXhlZFZhbHVlKTsKKworICAgIC8vIEdldCB0aGUgc3ltYm9sIGRhdGEsIGlmIGFueS4KKyAgICBNQ1N5bWJvbERhdGEgKlNEID0gMDsKKyAgICBpZiAoVGFyZ2V0LmdldFN5bUEoKSkKKyAgICAgIFNEID0gJkFzbS5nZXRTeW1ib2xEYXRhKFRhcmdldC5nZXRTeW1BKCktPmdldFN5bWJvbCgpKTsKKworICAgIC8vIElmIHRoaXMgaXMgYW4gaW50ZXJuYWwgcmVsb2NhdGlvbiB3aXRoIGFuIG9mZnNldCwgaXQgYWxzbyBuZWVkcyBhCisgICAgLy8gc2NhdHRlcmVkIHJlbG9jYXRpb24gZW50cnkuCisgICAgdWludDMyX3QgT2Zmc2V0ID0gVGFyZ2V0LmdldENvbnN0YW50KCk7CisgICAgaWYgKElzUENSZWwpCisgICAgICBPZmZzZXQgKz0gMSA8PCBMb2cyU2l6ZTsKKyAgICBpZiAoT2Zmc2V0ICYmIFNEICYmICFkb2VzU3ltYm9sUmVxdWlyZUV4dGVyblJlbG9jYXRpb24oU0QpKQorICAgICAgcmV0dXJuIFJlY29yZFNjYXR0ZXJlZFJlbG9jYXRpb24oQXNtLCBMYXlvdXQsIEZyYWdtZW50LCBGaXh1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCwgRml4ZWRWYWx1ZSk7CisKKyAgICAvLyBTZWUgPHJlbG9jLmg+LgorICAgIHVpbnQzMl90IEZpeHVwT2Zmc2V0ID0gTGF5b3V0LmdldEZyYWdtZW50T2Zmc2V0KEZyYWdtZW50KStGaXh1cC5nZXRPZmZzZXQoKTsKKyAgICB1bnNpZ25lZCBJbmRleCA9IDA7CisgICAgdW5zaWduZWQgSXNFeHRlcm4gPSAwOworICAgIHVuc2lnbmVkIFR5cGUgPSAwOworCisgICAgaWYgKFRhcmdldC5pc0Fic29sdXRlKCkpIHsgLy8gY29uc3RhbnQKKyAgICAgIC8vIFN5bWJvbE51bSBvZiAwIGluZGljYXRlcyB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KKyAgICAgIC8vCisgICAgICAvLyBGSVhNRTogQ3VycmVudGx5LCB0aGVzZSBhcmUgbmV2ZXIgZ2VuZXJhdGVkIChzZWUgY29kZSBiZWxvdykuIEkgY2Fubm90CisgICAgICAvLyBmaW5kIGEgY2FzZSB3aGVyZSB0aGV5IGFyZSBhY3R1YWxseSBlbWl0dGVkLgorICAgICAgVHlwZSA9IFJJVF9WYW5pbGxhOworICAgIH0gZWxzZSB7CisgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIG5lZWQgYW4gZXh0ZXJuYWwgb3IgaW50ZXJuYWwgcmVsb2NhdGlvbi4KKyAgICAgIGlmIChkb2VzU3ltYm9sUmVxdWlyZUV4dGVyblJlbG9jYXRpb24oU0QpKSB7CisgICAgICAgIElzRXh0ZXJuID0gMTsKKyAgICAgICAgSW5kZXggPSBTRC0+Z2V0SW5kZXgoKTsKKyAgICAgICAgLy8gRm9yIGV4dGVybmFsIHJlbG9jYXRpb25zLCBtYWtlIHN1cmUgdG8gb2Zmc2V0IHRoZSBmaXh1cCB2YWx1ZSB0bworICAgICAgICAvLyBjb21wZW5zYXRlIGZvciB0aGUgYWRkZW5kIG9mIHRoZSBzeW1ib2wgYWRkcmVzcywgaWYgaXQgd2FzCisgICAgICAgIC8vIHVuZGVmaW5lZC4gVGhpcyBvY2N1cnMgd2l0aCB3ZWFrIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZS4KKyAgICAgICAgaWYgKCFTRC0+U3ltYm9sLT5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgIEZpeGVkVmFsdWUgLT0gTGF5b3V0LmdldFN5bWJvbEFkZHJlc3MoU0QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGluZGV4IGlzIHRoZSBzZWN0aW9uIG9yZGluYWwgKDEtYmFzZWQpLgorICAgICAgICBJbmRleCA9IFNELT5nZXRGcmFnbWVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0T3JkaW5hbCgpICsgMTsKKyAgICAgIH0KKworICAgICAgVHlwZSA9IFJJVF9WYW5pbGxhOworICAgIH0KKworICAgIC8vIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKDggYnl0ZXMpCisgICAgTWFjaFJlbG9jYXRpb25FbnRyeSBNUkU7CisgICAgTVJFLldvcmQwID0gRml4dXBPZmZzZXQ7CisgICAgTVJFLldvcmQxID0gKChJbmRleCAgICAgPDwgIDApIHwKKyAgICAgICAgICAgICAgICAgKElzUENSZWwgICA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAoTG9nMlNpemUgIDw8IDI1KSB8CisgICAgICAgICAgICAgICAgIChJc0V4dGVybiAgPDwgMjcpIHwKKyAgICAgICAgICAgICAgICAgKFR5cGUgICAgICA8PCAyOCkpOworICAgIFJlbG9jYXRpb25zW0ZyYWdtZW50LT5nZXRQYXJlbnQoKV0ucHVzaF9iYWNrKE1SRSk7CisgIH0KKworICB2b2lkIEJpbmRJbmRpcmVjdFN5bWJvbHMoTUNBc3NlbWJsZXIgJkFzbSkgeworICAgIC8vIFRoaXMgaXMgdGhlIHBvaW50IHdoZXJlICdhcycgY3JlYXRlcyBhY3R1YWwgc3ltYm9scyBmb3IgaW5kaXJlY3Qgc3ltYm9scworICAgIC8vIChpbiB0aGUgZm9sbG93aW5nIHR3byBwYXNzZXMpLiBJdCB3b3VsZCBiZSBlYXNpZXIgZm9yIHVzIHRvIGRvIHRoaXMKKyAgICAvLyBzb29uZXIgd2hlbiB3ZSBzZWUgdGhlIGF0dHJpYnV0ZSwgYnV0IHRoYXQgbWFrZXMgZ2V0dGluZyB0aGUgb3JkZXIgaW4gdGhlCisgICAgLy8gc3ltYm9sIHRhYmxlIG11Y2ggbW9yZSBjb21wbGljYXRlZCB0aGFuIGl0IGlzIHdvcnRoLgorICAgIC8vCisgICAgLy8gRklYTUU6IFJldmlzaXQgdGhpcyB3aGVuIHRoZSBkdXN0IHNldHRsZXMuCisKKyAgICAvLyBCaW5kIG5vbiBsYXp5IHN5bWJvbCBwb2ludGVycyBmaXJzdC4KKyAgICB1bnNpZ25lZCBJbmRpcmVjdEluZGV4ID0gMDsKKyAgICBmb3IgKE1DQXNzZW1ibGVyOjppbmRpcmVjdF9zeW1ib2xfaXRlcmF0b3IgaXQgPSBBc20uaW5kaXJlY3Rfc3ltYm9sX2JlZ2luKCksCisgICAgICAgICAgIGllID0gQXNtLmluZGlyZWN0X3N5bWJvbF9lbmQoKTsgaXQgIT0gaWU7ICsraXQsICsrSW5kaXJlY3RJbmRleCkgeworICAgICAgY29uc3QgTUNTZWN0aW9uTWFjaE8gJlNlY3Rpb24gPQorICAgICAgICBjYXN0PE1DU2VjdGlvbk1hY2hPPihpdC0+U2VjdGlvbkRhdGEtPmdldFNlY3Rpb24oKSk7CisKKyAgICAgIGlmIChTZWN0aW9uLmdldFR5cGUoKSAhPSBNQ1NlY3Rpb25NYWNoTzo6U19OT05fTEFaWV9TWU1CT0xfUE9JTlRFUlMpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBJbml0aWFsaXplIHRoZSBzZWN0aW9uIGluZGlyZWN0IHN5bWJvbCBiYXNlLCBpZiBuZWNlc3NhcnkuCisgICAgICBpZiAoIUluZGlyZWN0U3ltQmFzZS5jb3VudChpdC0+U2VjdGlvbkRhdGEpKQorICAgICAgICBJbmRpcmVjdFN5bUJhc2VbaXQtPlNlY3Rpb25EYXRhXSA9IEluZGlyZWN0SW5kZXg7CisgICAgICAKKyAgICAgIEFzbS5nZXRPckNyZWF0ZVN5bWJvbERhdGEoKml0LT5TeW1ib2wpOworICAgIH0KKworICAgIC8vIFRoZW4gbGF6eSBzeW1ib2wgcG9pbnRlcnMgYW5kIHN5bWJvbCBzdHVicy4KKyAgICBJbmRpcmVjdEluZGV4ID0gMDsKKyAgICBmb3IgKE1DQXNzZW1ibGVyOjppbmRpcmVjdF9zeW1ib2xfaXRlcmF0b3IgaXQgPSBBc20uaW5kaXJlY3Rfc3ltYm9sX2JlZ2luKCksCisgICAgICAgICAgIGllID0gQXNtLmluZGlyZWN0X3N5bWJvbF9lbmQoKTsgaXQgIT0gaWU7ICsraXQsICsrSW5kaXJlY3RJbmRleCkgeworICAgICAgY29uc3QgTUNTZWN0aW9uTWFjaE8gJlNlY3Rpb24gPQorICAgICAgICBjYXN0PE1DU2VjdGlvbk1hY2hPPihpdC0+U2VjdGlvbkRhdGEtPmdldFNlY3Rpb24oKSk7CisKKyAgICAgIGlmIChTZWN0aW9uLmdldFR5cGUoKSAhPSBNQ1NlY3Rpb25NYWNoTzo6U19MQVpZX1NZTUJPTF9QT0lOVEVSUyAmJgorICAgICAgICAgIFNlY3Rpb24uZ2V0VHlwZSgpICE9IE1DU2VjdGlvbk1hY2hPOjpTX1NZTUJPTF9TVFVCUykKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIEluaXRpYWxpemUgdGhlIHNlY3Rpb24gaW5kaXJlY3Qgc3ltYm9sIGJhc2UsIGlmIG5lY2Vzc2FyeS4KKyAgICAgIGlmICghSW5kaXJlY3RTeW1CYXNlLmNvdW50KGl0LT5TZWN0aW9uRGF0YSkpCisgICAgICAgIEluZGlyZWN0U3ltQmFzZVtpdC0+U2VjdGlvbkRhdGFdID0gSW5kaXJlY3RJbmRleDsKKworICAgICAgLy8gU2V0IHRoZSBzeW1ib2wgdHlwZSB0byB1bmRlZmluZWQgbGF6eSwgYnV0IG9ubHkgb24gY29uc3RydWN0aW9uLgorICAgICAgLy8KKyAgICAgIC8vIEZJWE1FOiBEbyBub3QgaGFyZGNvZGUuCisgICAgICBib29sIENyZWF0ZWQ7CisgICAgICBNQ1N5bWJvbERhdGEgJkVudHJ5ID0gQXNtLmdldE9yQ3JlYXRlU3ltYm9sRGF0YSgqaXQtPlN5bWJvbCwgJkNyZWF0ZWQpOworICAgICAgaWYgKENyZWF0ZWQpCisgICAgICAgIEVudHJ5LnNldEZsYWdzKEVudHJ5LmdldEZsYWdzKCkgfCAweDAwMDEpOworICAgIH0KKyAgfQorCisgIC8vLyBDb21wdXRlU3ltYm9sVGFibGUgLSBDb21wdXRlIHRoZSBzeW1ib2wgdGFibGUgZGF0YQorICAvLy8KKyAgLy8vIFxwYXJhbSBTdHJpbmdUYWJsZSBbb3V0XSAtIFRoZSBzdHJpbmcgdGFibGUgZGF0YS4KKyAgLy8vIFxwYXJhbSBTdHJpbmdJbmRleE1hcCBbb3V0XSAtIE1hcCBmcm9tIHN5bWJvbCBuYW1lcyB0byBvZmZzZXRzIGluIHRoZQorICAvLy8gc3RyaW5nIHRhYmxlLgorICB2b2lkIENvbXB1dGVTeW1ib2xUYWJsZShNQ0Fzc2VtYmxlciAmQXNtLCBTbWFsbFN0cmluZzwyNTY+ICZTdHJpbmdUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaFN5bWJvbERhdGE+ICZMb2NhbFN5bWJvbERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hTeW1ib2xEYXRhPiAmRXh0ZXJuYWxTeW1ib2xEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoU3ltYm9sRGF0YT4gJlVuZGVmaW5lZFN5bWJvbERhdGEpIHsKKyAgICAvLyBCdWlsZCBzZWN0aW9uIGxvb2t1cCB0YWJsZS4KKyAgICBEZW5zZU1hcDxjb25zdCBNQ1NlY3Rpb24qLCB1aW50OF90PiBTZWN0aW9uSW5kZXhNYXA7CisgICAgdW5zaWduZWQgSW5kZXggPSAxOworICAgIGZvciAoTUNBc3NlbWJsZXI6Oml0ZXJhdG9yIGl0ID0gQXNtLmJlZ2luKCksCisgICAgICAgICAgIGllID0gQXNtLmVuZCgpOyBpdCAhPSBpZTsgKytpdCwgKytJbmRleCkKKyAgICAgIFNlY3Rpb25JbmRleE1hcFsmaXQtPmdldFNlY3Rpb24oKV0gPSBJbmRleDsKKyAgICBhc3NlcnQoSW5kZXggPD0gMjU2ICYmICJUb28gbWFueSBzZWN0aW9ucyEiKTsKKworICAgIC8vIEluZGV4IDAgaXMgYWx3YXlzIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgU3RyaW5nTWFwPHVpbnQ2NF90PiBTdHJpbmdJbmRleE1hcDsKKyAgICBTdHJpbmdUYWJsZSArPSAnXHgwMCc7CisKKyAgICAvLyBCdWlsZCB0aGUgc3ltYm9sIGFycmF5cyBhbmQgdGhlIHN0cmluZyB0YWJsZSwgYnV0IG9ubHkgZm9yIG5vbi1sb2NhbAorICAgIC8vIHN5bWJvbHMuCisgICAgLy8KKyAgICAvLyBUaGUgcGFydGljdWxhciBvcmRlciB0aGF0IHdlIGNvbGxlY3QgdGhlIHN5bWJvbHMgYW5kIGNyZWF0ZSB0aGUgc3RyaW5nCisgICAgLy8gdGFibGUsIHRoZW4gc29ydCB0aGUgc3ltYm9scyBpcyBjaG9zZW4gdG8gbWF0Y2ggJ2FzJy4gRXZlbiB0aG91Z2ggaXQKKyAgICAvLyBkb2Vzbid0IG1hdHRlciBmb3IgY29ycmVjdG5lc3MsIHRoaXMgaXMgaW1wb3J0YW50IGZvciBsZXR0aW5nIHVzIGRpZmYgLm8KKyAgICAvLyBmaWxlcy4KKyAgICBmb3IgKE1DQXNzZW1ibGVyOjpzeW1ib2xfaXRlcmF0b3IgaXQgPSBBc20uc3ltYm9sX2JlZ2luKCksCisgICAgICAgICAgIGllID0gQXNtLnN5bWJvbF9lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICAgIGNvbnN0IE1DU3ltYm9sICZTeW1ib2wgPSBpdC0+Z2V0U3ltYm9sKCk7CisKKyAgICAgIC8vIElnbm9yZSBub24tbGlua2VyIHZpc2libGUgc3ltYm9scy4KKyAgICAgIGlmICghQXNtLmlzU3ltYm9sTGlua2VyVmlzaWJsZShpdC0+Z2V0U3ltYm9sKCkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKCFpdC0+aXNFeHRlcm5hbCgpICYmICFTeW1ib2wuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHVpbnQ2NF90ICZFbnRyeSA9IFN0cmluZ0luZGV4TWFwW1N5bWJvbC5nZXROYW1lKCldOworICAgICAgaWYgKCFFbnRyeSkgeworICAgICAgICBFbnRyeSA9IFN0cmluZ1RhYmxlLnNpemUoKTsKKyAgICAgICAgU3RyaW5nVGFibGUgKz0gU3ltYm9sLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nVGFibGUgKz0gJ1x4MDAnOworICAgICAgfQorCisgICAgICBNYWNoU3ltYm9sRGF0YSBNU0Q7CisgICAgICBNU0QuU3ltYm9sRGF0YSA9IGl0OworICAgICAgTVNELlN0cmluZ0luZGV4ID0gRW50cnk7CisKKyAgICAgIGlmIChTeW1ib2wuaXNVbmRlZmluZWQoKSkgeworICAgICAgICBNU0QuU2VjdGlvbkluZGV4ID0gMDsKKyAgICAgICAgVW5kZWZpbmVkU3ltYm9sRGF0YS5wdXNoX2JhY2soTVNEKTsKKyAgICAgIH0gZWxzZSBpZiAoU3ltYm9sLmlzQWJzb2x1dGUoKSkgeworICAgICAgICBNU0QuU2VjdGlvbkluZGV4ID0gMDsKKyAgICAgICAgRXh0ZXJuYWxTeW1ib2xEYXRhLnB1c2hfYmFjayhNU0QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTVNELlNlY3Rpb25JbmRleCA9IFNlY3Rpb25JbmRleE1hcC5sb29rdXAoJlN5bWJvbC5nZXRTZWN0aW9uKCkpOworICAgICAgICBhc3NlcnQoTVNELlNlY3Rpb25JbmRleCAmJiAiSW52YWxpZCBzZWN0aW9uIGluZGV4ISIpOworICAgICAgICBFeHRlcm5hbFN5bWJvbERhdGEucHVzaF9iYWNrKE1TRCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gTm93IGFkZCB0aGUgZGF0YSBmb3IgbG9jYWwgc3ltYm9scy4KKyAgICBmb3IgKE1DQXNzZW1ibGVyOjpzeW1ib2xfaXRlcmF0b3IgaXQgPSBBc20uc3ltYm9sX2JlZ2luKCksCisgICAgICAgICAgIGllID0gQXNtLnN5bWJvbF9lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICAgIGNvbnN0IE1DU3ltYm9sICZTeW1ib2wgPSBpdC0+Z2V0U3ltYm9sKCk7CisKKyAgICAgIC8vIElnbm9yZSBub24tbGlua2VyIHZpc2libGUgc3ltYm9scy4KKyAgICAgIGlmICghQXNtLmlzU3ltYm9sTGlua2VyVmlzaWJsZShpdC0+Z2V0U3ltYm9sKCkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKGl0LT5pc0V4dGVybmFsKCkgfHwgU3ltYm9sLmlzVW5kZWZpbmVkKCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICB1aW50NjRfdCAmRW50cnkgPSBTdHJpbmdJbmRleE1hcFtTeW1ib2wuZ2V0TmFtZSgpXTsKKyAgICAgIGlmICghRW50cnkpIHsKKyAgICAgICAgRW50cnkgPSBTdHJpbmdUYWJsZS5zaXplKCk7CisgICAgICAgIFN0cmluZ1RhYmxlICs9IFN5bWJvbC5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZ1RhYmxlICs9ICdceDAwJzsKKyAgICAgIH0KKworICAgICAgTWFjaFN5bWJvbERhdGEgTVNEOworICAgICAgTVNELlN5bWJvbERhdGEgPSBpdDsKKyAgICAgIE1TRC5TdHJpbmdJbmRleCA9IEVudHJ5OworCisgICAgICBpZiAoU3ltYm9sLmlzQWJzb2x1dGUoKSkgeworICAgICAgICBNU0QuU2VjdGlvbkluZGV4ID0gMDsKKyAgICAgICAgTG9jYWxTeW1ib2xEYXRhLnB1c2hfYmFjayhNU0QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTVNELlNlY3Rpb25JbmRleCA9IFNlY3Rpb25JbmRleE1hcC5sb29rdXAoJlN5bWJvbC5nZXRTZWN0aW9uKCkpOworICAgICAgICBhc3NlcnQoTVNELlNlY3Rpb25JbmRleCAmJiAiSW52YWxpZCBzZWN0aW9uIGluZGV4ISIpOworICAgICAgICBMb2NhbFN5bWJvbERhdGEucHVzaF9iYWNrKE1TRCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRXh0ZXJuYWwgYW5kIHVuZGVmaW5lZCBzeW1ib2xzIGFyZSByZXF1aXJlZCB0byBiZSBpbiBsZXhpY29ncmFwaGljIG9yZGVyLgorICAgIHN0ZDo6c29ydChFeHRlcm5hbFN5bWJvbERhdGEuYmVnaW4oKSwgRXh0ZXJuYWxTeW1ib2xEYXRhLmVuZCgpKTsKKyAgICBzdGQ6OnNvcnQoVW5kZWZpbmVkU3ltYm9sRGF0YS5iZWdpbigpLCBVbmRlZmluZWRTeW1ib2xEYXRhLmVuZCgpKTsKKworICAgIC8vIFNldCB0aGUgc3ltYm9sIGluZGljZXMuCisgICAgSW5kZXggPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMb2NhbFN5bWJvbERhdGEuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIExvY2FsU3ltYm9sRGF0YVtpXS5TeW1ib2xEYXRhLT5zZXRJbmRleChJbmRleCsrKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRXh0ZXJuYWxTeW1ib2xEYXRhLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBFeHRlcm5hbFN5bWJvbERhdGFbaV0uU3ltYm9sRGF0YS0+c2V0SW5kZXgoSW5kZXgrKyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFVuZGVmaW5lZFN5bWJvbERhdGEuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIFVuZGVmaW5lZFN5bWJvbERhdGFbaV0uU3ltYm9sRGF0YS0+c2V0SW5kZXgoSW5kZXgrKyk7CisKKyAgICAvLyBUaGUgc3RyaW5nIHRhYmxlIGlzIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIDQuCisgICAgd2hpbGUgKFN0cmluZ1RhYmxlLnNpemUoKSAlIDQpCisgICAgICBTdHJpbmdUYWJsZSArPSAnXHgwMCc7CisgIH0KKworICB2b2lkIEV4ZWN1dGVQb3N0TGF5b3V0QmluZGluZyhNQ0Fzc2VtYmxlciAmQXNtKSB7CisgICAgLy8gQ3JlYXRlIHN5bWJvbCBkYXRhIGZvciBhbnkgaW5kaXJlY3Qgc3ltYm9scy4KKyAgICBCaW5kSW5kaXJlY3RTeW1ib2xzKEFzbSk7CisKKyAgICAvLyBDb21wdXRlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBhbmQgYmluZCBzeW1ib2wgaW5kaWNlcy4KKyAgICBDb21wdXRlU3ltYm9sVGFibGUoQXNtLCBTdHJpbmdUYWJsZSwgTG9jYWxTeW1ib2xEYXRhLCBFeHRlcm5hbFN5bWJvbERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIFVuZGVmaW5lZFN5bWJvbERhdGEpOworICB9CisKKyAgdm9pZCBXcml0ZU9iamVjdChjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSB7CisgICAgdW5zaWduZWQgTnVtU2VjdGlvbnMgPSBBc20uc2l6ZSgpOworCisgICAgLy8gVGhlIHNlY3Rpb24gZGF0YSBzdGFydHMgYWZ0ZXIgdGhlIGhlYWRlciwgdGhlIHNlZ21lbnQgbG9hZCBjb21tYW5kIChhbmQKKyAgICAvLyBzZWN0aW9uIGhlYWRlcnMpIGFuZCB0aGUgc3ltYm9sIHRhYmxlLgorICAgIHVuc2lnbmVkIE51bUxvYWRDb21tYW5kcyA9IDE7CisgICAgdWludDY0X3QgTG9hZENvbW1hbmRzU2l6ZSA9IElzNjRCaXQgPworICAgICAgU2VnbWVudExvYWRDb21tYW5kNjRTaXplICsgTnVtU2VjdGlvbnMgKiBTZWN0aW9uNjRTaXplIDoKKyAgICAgIFNlZ21lbnRMb2FkQ29tbWFuZDMyU2l6ZSArIE51bVNlY3Rpb25zICogU2VjdGlvbjMyU2l6ZTsKKworICAgIC8vIEFkZCB0aGUgc3ltYm9sIHRhYmxlIGxvYWQgY29tbWFuZCBzaXplcywgaWYgdXNlZC4KKyAgICB1bnNpZ25lZCBOdW1TeW1ib2xzID0gTG9jYWxTeW1ib2xEYXRhLnNpemUoKSArIEV4dGVybmFsU3ltYm9sRGF0YS5zaXplKCkgKworICAgICAgVW5kZWZpbmVkU3ltYm9sRGF0YS5zaXplKCk7CisgICAgaWYgKE51bVN5bWJvbHMpIHsKKyAgICAgIE51bUxvYWRDb21tYW5kcyArPSAyOworICAgICAgTG9hZENvbW1hbmRzU2l6ZSArPSBTeW10YWJMb2FkQ29tbWFuZFNpemUgKyBEeXN5bXRhYkxvYWRDb21tYW5kU2l6ZTsKKyAgICB9CisKKyAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBzZWN0aW9uIGRhdGEsIGFzIHdlbGwgYXMgaXRzIGZpbGUgc2l6ZSBhbmQKKyAgICAvLyB2bSBzaXplLgorICAgIHVpbnQ2NF90IFNlY3Rpb25EYXRhU3RhcnQgPSAoSXM2NEJpdCA/IEhlYWRlcjY0U2l6ZSA6IEhlYWRlcjMyU2l6ZSkKKyAgICAgICsgTG9hZENvbW1hbmRzU2l6ZTsKKyAgICB1aW50NjRfdCBTZWN0aW9uRGF0YVNpemUgPSAwOworICAgIHVpbnQ2NF90IFNlY3Rpb25EYXRhRmlsZVNpemUgPSAwOworICAgIHVpbnQ2NF90IFZNU2l6ZSA9IDA7CisgICAgZm9yIChNQ0Fzc2VtYmxlcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBBc20uYmVnaW4oKSwKKyAgICAgICAgICAgaWUgPSBBc20uZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgICBjb25zdCBNQ1NlY3Rpb25EYXRhICZTRCA9ICppdDsKKyAgICAgIHVpbnQ2NF90IEFkZHJlc3MgPSBMYXlvdXQuZ2V0U2VjdGlvbkFkZHJlc3MoJlNEKTsKKyAgICAgIHVpbnQ2NF90IFNpemUgPSBMYXlvdXQuZ2V0U2VjdGlvblNpemUoJlNEKTsKKyAgICAgIHVpbnQ2NF90IEZpbGVTaXplID0gTGF5b3V0LmdldFNlY3Rpb25GaWxlU2l6ZSgmU0QpOworCisgICAgICBWTVNpemUgPSBzdGQ6Om1heChWTVNpemUsIEFkZHJlc3MgKyBTaXplKTsKKworICAgICAgaWYgKEFzbS5nZXRCYWNrZW5kKCkuaXNWaXJ0dWFsU2VjdGlvbihTRC5nZXRTZWN0aW9uKCkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgU2VjdGlvbkRhdGFTaXplID0gc3RkOjptYXgoU2VjdGlvbkRhdGFTaXplLCBBZGRyZXNzICsgU2l6ZSk7CisgICAgICBTZWN0aW9uRGF0YUZpbGVTaXplID0gc3RkOjptYXgoU2VjdGlvbkRhdGFGaWxlU2l6ZSwgQWRkcmVzcyArIEZpbGVTaXplKTsKKyAgICB9CisKKyAgICAvLyBUaGUgc2VjdGlvbiBkYXRhIGlzIHBhZGRlZCB0byA0IGJ5dGVzLgorICAgIC8vCisgICAgLy8gRklYTUU6IElzIHRoaXMgbWFjaGluZSBkZXBlbmRlbnQ/CisgICAgdW5zaWduZWQgU2VjdGlvbkRhdGFQYWRkaW5nID0gT2Zmc2V0VG9BbGlnbm1lbnQoU2VjdGlvbkRhdGFGaWxlU2l6ZSwgNCk7CisgICAgU2VjdGlvbkRhdGFGaWxlU2l6ZSArPSBTZWN0aW9uRGF0YVBhZGRpbmc7CisKKyAgICAvLyBXcml0ZSB0aGUgcHJvbG9nLCBzdGFydGluZyB3aXRoIHRoZSBoZWFkZXIgYW5kIGxvYWQgY29tbWFuZC4uLgorICAgIFdyaXRlSGVhZGVyKE51bUxvYWRDb21tYW5kcywgTG9hZENvbW1hbmRzU2l6ZSwKKyAgICAgICAgICAgICAgICBBc20uZ2V0U3Vic2VjdGlvbnNWaWFTeW1ib2xzKCkpOworICAgIFdyaXRlU2VnbWVudExvYWRDb21tYW5kKE51bVNlY3Rpb25zLCBWTVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbkRhdGFTdGFydCwgU2VjdGlvbkRhdGFTaXplKTsKKworICAgIC8vIC4uLiBhbmQgdGhlbiB0aGUgc2VjdGlvbiBoZWFkZXJzLgorICAgIHVpbnQ2NF90IFJlbG9jVGFibGVFbmQgPSBTZWN0aW9uRGF0YVN0YXJ0ICsgU2VjdGlvbkRhdGFGaWxlU2l6ZTsKKyAgICBmb3IgKE1DQXNzZW1ibGVyOjpjb25zdF9pdGVyYXRvciBpdCA9IEFzbS5iZWdpbigpLAorICAgICAgICAgICBpZSA9IEFzbS5lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPE1hY2hSZWxvY2F0aW9uRW50cnk+ICZSZWxvY3MgPSBSZWxvY2F0aW9uc1tpdF07CisgICAgICB1bnNpZ25lZCBOdW1SZWxvY3MgPSBSZWxvY3Muc2l6ZSgpOworICAgICAgdWludDY0X3QgU2VjdGlvblN0YXJ0ID0gU2VjdGlvbkRhdGFTdGFydCArIExheW91dC5nZXRTZWN0aW9uQWRkcmVzcyhpdCk7CisgICAgICBXcml0ZVNlY3Rpb24oQXNtLCBMYXlvdXQsICppdCwgU2VjdGlvblN0YXJ0LCBSZWxvY1RhYmxlRW5kLCBOdW1SZWxvY3MpOworICAgICAgUmVsb2NUYWJsZUVuZCArPSBOdW1SZWxvY3MgKiBSZWxvY2F0aW9uSW5mb1NpemU7CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIHN5bWJvbCB0YWJsZSBsb2FkIGNvbW1hbmQsIGlmIHVzZWQuCisgICAgaWYgKE51bVN5bWJvbHMpIHsKKyAgICAgIHVuc2lnbmVkIEZpcnN0TG9jYWxTeW1ib2wgPSAwOworICAgICAgdW5zaWduZWQgTnVtTG9jYWxTeW1ib2xzID0gTG9jYWxTeW1ib2xEYXRhLnNpemUoKTsKKyAgICAgIHVuc2lnbmVkIEZpcnN0RXh0ZXJuYWxTeW1ib2wgPSBGaXJzdExvY2FsU3ltYm9sICsgTnVtTG9jYWxTeW1ib2xzOworICAgICAgdW5zaWduZWQgTnVtRXh0ZXJuYWxTeW1ib2xzID0gRXh0ZXJuYWxTeW1ib2xEYXRhLnNpemUoKTsKKyAgICAgIHVuc2lnbmVkIEZpcnN0VW5kZWZpbmVkU3ltYm9sID0gRmlyc3RFeHRlcm5hbFN5bWJvbCArIE51bUV4dGVybmFsU3ltYm9sczsKKyAgICAgIHVuc2lnbmVkIE51bVVuZGVmaW5lZFN5bWJvbHMgPSBVbmRlZmluZWRTeW1ib2xEYXRhLnNpemUoKTsKKyAgICAgIHVuc2lnbmVkIE51bUluZGlyZWN0U3ltYm9scyA9IEFzbS5pbmRpcmVjdF9zeW1ib2xfc2l6ZSgpOworICAgICAgdW5zaWduZWQgTnVtU3ltVGFiU3ltYm9scyA9CisgICAgICAgIE51bUxvY2FsU3ltYm9scyArIE51bUV4dGVybmFsU3ltYm9scyArIE51bVVuZGVmaW5lZFN5bWJvbHM7CisgICAgICB1aW50NjRfdCBJbmRpcmVjdFN5bWJvbFNpemUgPSBOdW1JbmRpcmVjdFN5bWJvbHMgKiA0OworICAgICAgdWludDY0X3QgSW5kaXJlY3RTeW1ib2xPZmZzZXQgPSAwOworCisgICAgICAvLyBJZiB1c2VkLCB0aGUgaW5kaXJlY3Qgc3ltYm9scyBhcmUgd3JpdHRlbiBhZnRlciB0aGUgc2VjdGlvbiBkYXRhLgorICAgICAgaWYgKE51bUluZGlyZWN0U3ltYm9scykKKyAgICAgICAgSW5kaXJlY3RTeW1ib2xPZmZzZXQgPSBSZWxvY1RhYmxlRW5kOworCisgICAgICAvLyBUaGUgc3ltYm9sIHRhYmxlIGlzIHdyaXR0ZW4gYWZ0ZXIgdGhlIGluZGlyZWN0IHN5bWJvbCBkYXRhLgorICAgICAgdWludDY0X3QgU3ltYm9sVGFibGVPZmZzZXQgPSBSZWxvY1RhYmxlRW5kICsgSW5kaXJlY3RTeW1ib2xTaXplOworCisgICAgICAvLyBUaGUgc3RyaW5nIHRhYmxlIGlzIHdyaXR0ZW4gYWZ0ZXIgc3ltYm9sIHRhYmxlLgorICAgICAgdWludDY0X3QgU3RyaW5nVGFibGVPZmZzZXQgPQorICAgICAgICBTeW1ib2xUYWJsZU9mZnNldCArIE51bVN5bVRhYlN5bWJvbHMgKiAoSXM2NEJpdCA/IE5saXN0NjRTaXplIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5saXN0MzJTaXplKTsKKyAgICAgIFdyaXRlU3ltdGFiTG9hZENvbW1hbmQoU3ltYm9sVGFibGVPZmZzZXQsIE51bVN5bVRhYlN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1RhYmxlT2Zmc2V0LCBTdHJpbmdUYWJsZS5zaXplKCkpOworCisgICAgICBXcml0ZUR5c3ltdGFiTG9hZENvbW1hbmQoRmlyc3RMb2NhbFN5bWJvbCwgTnVtTG9jYWxTeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0RXh0ZXJuYWxTeW1ib2wsIE51bUV4dGVybmFsU3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXJzdFVuZGVmaW5lZFN5bWJvbCwgTnVtVW5kZWZpbmVkU3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpcmVjdFN5bWJvbE9mZnNldCwgTnVtSW5kaXJlY3RTeW1ib2xzKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgYWN0dWFsIHNlY3Rpb24gZGF0YS4KKyAgICBmb3IgKE1DQXNzZW1ibGVyOjpjb25zdF9pdGVyYXRvciBpdCA9IEFzbS5iZWdpbigpLAorICAgICAgICAgICBpZSA9IEFzbS5lbmQoKTsgaXQgIT0gaWU7ICsraXQpCisgICAgICBBc20uV3JpdGVTZWN0aW9uRGF0YShpdCwgTGF5b3V0LCBXcml0ZXIpOworCisgICAgLy8gV3JpdGUgdGhlIGV4dHJhIHBhZGRpbmcuCisgICAgV3JpdGVaZXJvcyhTZWN0aW9uRGF0YVBhZGRpbmcpOworCisgICAgLy8gV3JpdGUgdGhlIHJlbG9jYXRpb24gZW50cmllcy4KKyAgICBmb3IgKE1DQXNzZW1ibGVyOjpjb25zdF9pdGVyYXRvciBpdCA9IEFzbS5iZWdpbigpLAorICAgICAgICAgICBpZSA9IEFzbS5lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICAgIC8vIFdyaXRlIHRoZSBzZWN0aW9uIHJlbG9jYXRpb24gZW50cmllcywgaW4gcmV2ZXJzZSBvcmRlciB0byBtYXRjaCAnYXMnCisgICAgICAvLyAoYXBwcm94aW1hdGVseSwgdGhlIGV4YWN0IGFsZ29yaXRobSBpcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhpcykuCisgICAgICBzdGQ6OnZlY3RvcjxNYWNoUmVsb2NhdGlvbkVudHJ5PiAmUmVsb2NzID0gUmVsb2NhdGlvbnNbaXRdOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlbG9jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFdyaXRlMzIoUmVsb2NzW2UgLSBpIC0gMV0uV29yZDApOworICAgICAgICBXcml0ZTMyKFJlbG9jc1tlIC0gaSAtIDFdLldvcmQxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgc3ltYm9sIHRhYmxlIGRhdGEsIGlmIHVzZWQuCisgICAgaWYgKE51bVN5bWJvbHMpIHsKKyAgICAgIC8vIFdyaXRlIHRoZSBpbmRpcmVjdCBzeW1ib2wgZW50cmllcy4KKyAgICAgIGZvciAoTUNBc3NlbWJsZXI6OmNvbnN0X2luZGlyZWN0X3N5bWJvbF9pdGVyYXRvcgorICAgICAgICAgICAgIGl0ID0gQXNtLmluZGlyZWN0X3N5bWJvbF9iZWdpbigpLAorICAgICAgICAgICAgIGllID0gQXNtLmluZGlyZWN0X3N5bWJvbF9lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICAgICAgLy8gSW5kaXJlY3Qgc3ltYm9scyBpbiB0aGUgbm9uIGxhenkgc3ltYm9sIHBvaW50ZXIgc2VjdGlvbiBoYXZlIHNvbWUKKyAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZy4KKyAgICAgICAgY29uc3QgTUNTZWN0aW9uTWFjaE8gJlNlY3Rpb24gPQorICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IE1DU2VjdGlvbk1hY2hPJj4oaXQtPlNlY3Rpb25EYXRhLT5nZXRTZWN0aW9uKCkpOworICAgICAgICBpZiAoU2VjdGlvbi5nZXRUeXBlKCkgPT0gTUNTZWN0aW9uTWFjaE86OlNfTk9OX0xBWllfU1lNQk9MX1BPSU5URVJTKSB7CisgICAgICAgICAgLy8gSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBhbmQgaW50ZXJuYWwsIG1hcmsgaXQgYXMgc3VjaC4KKyAgICAgICAgICBpZiAoaXQtPlN5bWJvbC0+aXNEZWZpbmVkKCkgJiYKKyAgICAgICAgICAgICAgIUFzbS5nZXRTeW1ib2xEYXRhKCppdC0+U3ltYm9sKS5pc0V4dGVybmFsKCkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IEZsYWdzID0gSVNGX0xvY2FsOworICAgICAgICAgICAgaWYgKGl0LT5TeW1ib2wtPmlzQWJzb2x1dGUoKSkKKyAgICAgICAgICAgICAgRmxhZ3MgfD0gSVNGX0Fic29sdXRlOworICAgICAgICAgICAgV3JpdGUzMihGbGFncyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBXcml0ZTMyKEFzbS5nZXRTeW1ib2xEYXRhKCppdC0+U3ltYm9sKS5nZXRJbmRleCgpKTsKKyAgICAgIH0KKworICAgICAgLy8gRklYTUU6IENoZWNrIHRoYXQgb2Zmc2V0cyBtYXRjaCBjb21wdXRlZCBvbmVzLgorCisgICAgICAvLyBXcml0ZSB0aGUgc3ltYm9sIHRhYmxlIGVudHJpZXMuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTG9jYWxTeW1ib2xEYXRhLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIFdyaXRlTmxpc3QoTG9jYWxTeW1ib2xEYXRhW2ldLCBMYXlvdXQpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEV4dGVybmFsU3ltYm9sRGF0YS5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBXcml0ZU5saXN0KEV4dGVybmFsU3ltYm9sRGF0YVtpXSwgTGF5b3V0KTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVbmRlZmluZWRTeW1ib2xEYXRhLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIFdyaXRlTmxpc3QoVW5kZWZpbmVkU3ltYm9sRGF0YVtpXSwgTGF5b3V0KTsKKworICAgICAgLy8gV3JpdGUgdGhlIHN0cmluZyB0YWJsZS4KKyAgICAgIE9TIDw8IFN0cmluZ1RhYmxlLnN0cigpOworICAgIH0KKyAgfQorfTsKKworfQorCitNYWNoT2JqZWN0V3JpdGVyOjpNYWNoT2JqZWN0V3JpdGVyKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJczY0Qml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzTGl0dGxlRW5kaWFuKQorICA6IE1DT2JqZWN0V3JpdGVyKE9TLCBJc0xpdHRsZUVuZGlhbikKK3sKKyAgSW1wbCA9IG5ldyBNYWNoT2JqZWN0V3JpdGVySW1wbCh0aGlzLCBJczY0Qml0KTsKK30KKworTWFjaE9iamVjdFdyaXRlcjo6fk1hY2hPYmplY3RXcml0ZXIoKSB7CisgIGRlbGV0ZSAoTWFjaE9iamVjdFdyaXRlckltcGwqKSBJbXBsOworfQorCit2b2lkIE1hY2hPYmplY3RXcml0ZXI6OkV4ZWN1dGVQb3N0TGF5b3V0QmluZGluZyhNQ0Fzc2VtYmxlciAmQXNtKSB7CisgICgoTWFjaE9iamVjdFdyaXRlckltcGwqKSBJbXBsKS0+RXhlY3V0ZVBvc3RMYXlvdXRCaW5kaW5nKEFzbSk7Cit9CisKK3ZvaWQgTWFjaE9iamVjdFdyaXRlcjo6UmVjb3JkUmVsb2NhdGlvbihjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAmRml4dXAsIE1DVmFsdWUgVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZGaXhlZFZhbHVlKSB7CisgICgoTWFjaE9iamVjdFdyaXRlckltcGwqKSBJbXBsKS0+UmVjb3JkUmVsb2NhdGlvbihBc20sIExheW91dCwgRnJhZ21lbnQsIEZpeHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LCBGaXhlZFZhbHVlKTsKK30KKwordm9pZCBNYWNoT2JqZWN0V3JpdGVyOjpXcml0ZU9iamVjdChjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSB7CisgICgoTWFjaE9iamVjdFdyaXRlckltcGwqKSBJbXBsKS0+V3JpdGVPYmplY3QoQXNtLCBMYXlvdXQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL01DL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOGI3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvTUMvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIyM9PT0tIGxpYi9NQy9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNTUMKK0JVSUxEX0FSQ0hJVkUgOj0gMQorUEFSQUxMRUxfRElSUyA6PSBNQ1BhcnNlciBNQ0Rpc2Fzc2VtYmxlcgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTUMvVGFyZ2V0QXNtQmFja2VuZC5jcHAgYi9zcmMvTExWTS9saWIvTUMvVGFyZ2V0QXNtQmFja2VuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmZGRiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NQy9UYXJnZXRBc21CYWNrZW5kLmNwcApAQCAtMCwwICsxLDIyIEBACisvLz09PS0tIFRhcmdldEFzbUJhY2tlbmQuY3BwIC0gVGFyZ2V0IEFzc2VtYmx5IEJhY2tlbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtQmFja2VuZC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1RhcmdldEFzbUJhY2tlbmQ6OlRhcmdldEFzbUJhY2tlbmQoY29uc3QgVGFyZ2V0ICZUKQorICA6IFRoZVRhcmdldChUKSwKKyAgICBIYXNBYnNvbHV0aXplZFNldChmYWxzZSksCisgICAgSGFzUmVsaWFibGVTeW1ib2xEaWZmZXJlbmNlKGZhbHNlKSwKKyAgICBIYXNTY2F0dGVyZWRTeW1ib2xzKGZhbHNlKQoreworfQorCitUYXJnZXRBc21CYWNrZW5kOjp+VGFyZ2V0QXNtQmFja2VuZCgpIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9NQy9XaW5DT0ZGT2JqZWN0V3JpdGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9NQy9XaW5DT0ZGT2JqZWN0V3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2E2NjkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL1dpbkNPRkZPYmplY3RXcml0ZXIuY3BwCkBAIC0wLDAgKzEsNzQ1IEBACisvLz09PS0tIGxsdm0vTUMvV2luQ09GRk9iamVjdFdyaXRlci5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFdpbjMyIENPRkYgb2JqZWN0IGZpbGUgd3JpdGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiV2luQ09GRk9iamVjdFdyaXRlciIKKworI2luY2x1ZGUgImxsdm0vTUMvTUNPYmplY3RXcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21MYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbkNPRkYuaCIKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ09GRi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaW1lVmFsdWUuaCIKKworI2luY2x1ZGUgPGNzdGRpbz4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7Cit0eXBlZGVmIGxsdm06OlNtYWxsU3RyaW5nPENPRkY6Ok5hbWVTaXplPiBuYW1lOworCitlbnVtIEF1eGlsaWFyeVR5cGUgeworICBBVEZ1bmN0aW9uRGVmaW5pdGlvbiwKKyAgQVRiZkFuZGVmU3ltYm9sLAorICBBVFdlYWtFeHRlcm5hbCwKKyAgQVRGaWxlLAorICBBVFNlY3Rpb25EZWZpbml0aW9uCit9OworCitzdHJ1Y3QgQXV4U3ltYm9sIHsKKyAgQXV4aWxpYXJ5VHlwZSAgIEF1eFR5cGU7CisgIENPRkY6OkF1eGlsaWFyeSBBdXg7Cit9OworCitjbGFzcyBDT0ZGU3ltYm9sIHsKK3B1YmxpYzoKKyAgQ09GRjo6c3ltYm9sIERhdGE7CisKKyAgdHlwZWRlZiBsbHZtOjpTbWFsbFZlY3RvcjxBdXhTeW1ib2wsIDE+IEF1eGlsaWFyeVN5bWJvbHM7CisKKyAgbmFtZSAgICAgICAgICAgICBOYW1lOworICBzaXplX3QgICAgICAgICAgIEluZGV4OworICBBdXhpbGlhcnlTeW1ib2xzIEF1eDsKKyAgQ09GRlN5bWJvbCAgICAgICpPdGhlcjsKKworICBNQ1N5bWJvbERhdGEgY29uc3QgKk1DRGF0YTsKKworICBDT0ZGU3ltYm9sKGxsdm06OlN0cmluZ1JlZiBuYW1lLCBzaXplX3QgaW5kZXgpOworICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICB2b2lkIHNldF9uYW1lX29mZnNldCh1aW50MzJfdCBPZmZzZXQpOworfTsKKworLy8gVGhpcyBjbGFzcyBjb250YWlucyBzdGFnaW5nIGRhdGEgZm9yIGEgQ09GRiByZWxvY2F0aW9uIGVudHJ5Lgorc3RydWN0IENPRkZSZWxvY2F0aW9uIHsKKyAgQ09GRjo6cmVsb2NhdGlvbiBEYXRhOworICBDT0ZGU3ltYm9sICAgICAgICAgICpTeW1iOworCisgIENPRkZSZWxvY2F0aW9uKCkgOiBTeW1iKE5VTEwpIHt9CisgIHN0YXRpYyBzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIENPRkY6OlJlbG9jYXRpb25TaXplOyB9Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPENPRkZSZWxvY2F0aW9uPiByZWxvY2F0aW9uczsKKworY2xhc3MgQ09GRlNlY3Rpb24geworcHVibGljOgorICBDT0ZGOjpzZWN0aW9uIEhlYWRlcjsKKworICBzdGQ6OnN0cmluZyAgICAgICAgICBOYW1lOworICBzaXplX3QgICAgICAgICAgICAgICBOdW1iZXI7CisgIE1DU2VjdGlvbkRhdGEgY29uc3QgKk1DRGF0YTsKKyAgQ09GRlN5bWJvbCAgICAgICAgICAgICAgKlN5bWI7CisgIHJlbG9jYXRpb25zICAgICAgICAgIFJlbG9jYXRpb25zOworCisgIENPRkZTZWN0aW9uKGxsdm06OlN0cmluZ1JlZiBuYW1lLCBzaXplX3QgSW5kZXgpOworICBzdGF0aWMgc2l6ZV90IHNpemUoKTsKK307CisKKy8vIFRoaXMgY2xhc3MgaG9sZHMgdGhlIENPRkYgc3RyaW5nIHRhYmxlLgorY2xhc3MgU3RyaW5nVGFibGUgeworICB0eXBlZGVmIGxsdm06OlN0cmluZ01hcDxzaXplX3Q+IG1hcDsKKyAgbWFwIE1hcDsKKworICB2b2lkIHVwZGF0ZV9sZW5ndGgoKTsKK3B1YmxpYzoKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gRGF0YTsKKworICBTdHJpbmdUYWJsZSgpOworICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICBzaXplX3QgaW5zZXJ0KGxsdm06OlN0cmluZ1JlZiBTdHJpbmcpOworfTsKKworY2xhc3MgV2luQ09GRk9iamVjdFdyaXRlciA6IHB1YmxpYyBNQ09iamVjdFdyaXRlciB7CitwdWJsaWM6CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDT0ZGU3ltYm9sKj4gIHN5bWJvbHM7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Q09GRlNlY3Rpb24qPiBzZWN0aW9uczsKKworICB0eXBlZGVmIFN0cmluZ01hcDxDT0ZGU3ltYm9sICo+ICBuYW1lX3N5bWJvbF9tYXA7CisgIHR5cGVkZWYgU3RyaW5nTWFwPENPRkZTZWN0aW9uICo+IG5hbWVfc2VjdGlvbl9tYXA7CisKKyAgdHlwZWRlZiBEZW5zZU1hcDxNQ1N5bWJvbERhdGEgY29uc3QgKiwgQ09GRlN5bWJvbCAqPiAgIHN5bWJvbF9tYXA7CisgIHR5cGVkZWYgRGVuc2VNYXA8TUNTZWN0aW9uRGF0YSBjb25zdCAqLCBDT0ZGU2VjdGlvbiAqPiBzZWN0aW9uX21hcDsKKworICAvLyBSb290IGxldmVsIGZpbGUgY29udGVudHMuCisgIENPRkY6OmhlYWRlciBIZWFkZXI7CisgIHNlY3Rpb25zICAgICBTZWN0aW9uczsKKyAgc3ltYm9scyAgICAgIFN5bWJvbHM7CisgIFN0cmluZ1RhYmxlICBTdHJpbmdzOworCisgIC8vIE1hcHMgdXNlZCBkdXJpbmcgb2JqZWN0IGZpbGUgY3JlYXRpb24uCisgIHNlY3Rpb25fbWFwIFNlY3Rpb25NYXA7CisgIHN5bWJvbF9tYXAgIFN5bWJvbE1hcDsKKworICBXaW5DT0ZGT2JqZWN0V3JpdGVyKHJhd19vc3RyZWFtICZPUyk7CisgIH5XaW5DT0ZGT2JqZWN0V3JpdGVyKCk7CisKKyAgQ09GRlN5bWJvbCAqY3JlYXRlU3ltYm9sKGxsdm06OlN0cmluZ1JlZiBOYW1lKTsKKyAgQ09GRlNlY3Rpb24gKmNyZWF0ZVNlY3Rpb24obGx2bTo6U3RyaW5nUmVmIE5hbWUpOworCisgIHZvaWQgSW5pdENPRkZFbnRpdHkoQ09GRlN5bWJvbCAmU3ltYm9sKTsKKyAgdm9pZCBJbml0Q09GRkVudGl0eShDT0ZGU2VjdGlvbiAmU2VjdGlvbik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIG9iamVjdF90LCB0eXBlbmFtZSBsaXN0X3Q+CisgIG9iamVjdF90ICpjcmVhdGVDT0ZGRW50aXR5KGxsdm06OlN0cmluZ1JlZiBOYW1lLCBsaXN0X3QgJkxpc3QpOworCisgIHZvaWQgRGVmaW5lU2VjdGlvbihNQ1NlY3Rpb25EYXRhIGNvbnN0ICZTZWN0aW9uRGF0YSk7CisgIHZvaWQgRGVmaW5lU3ltYm9sKE1DU3ltYm9sRGF0YSBjb25zdCAmU3ltYm9sRGF0YSwgTUNBc3NlbWJsZXIgJkFzc2VtYmxlcik7CisKKyAgYm9vbCBFeHBvcnRTZWN0aW9uKENPRkZTZWN0aW9uICpTKTsKKyAgYm9vbCBFeHBvcnRTeW1ib2woTUNTeW1ib2xEYXRhIGNvbnN0ICZTeW1ib2xEYXRhLCBNQ0Fzc2VtYmxlciAmQXNtKTsKKworICAvLyBFbnRpdHkgd3JpdGluZyBtZXRob2RzLgorCisgIHZvaWQgV3JpdGVGaWxlSGVhZGVyKGNvbnN0IENPRkY6OmhlYWRlciAmSGVhZGVyKTsKKyAgdm9pZCBXcml0ZVN5bWJvbChjb25zdCBDT0ZGU3ltYm9sICpTKTsKKyAgdm9pZCBXcml0ZUF1eGlsaWFyeVN5bWJvbHMoY29uc3QgQ09GRlN5bWJvbDo6QXV4aWxpYXJ5U3ltYm9scyAmUyk7CisgIHZvaWQgV3JpdGVTZWN0aW9uSGVhZGVyKGNvbnN0IENPRkY6OnNlY3Rpb24gJlMpOworICB2b2lkIFdyaXRlUmVsb2NhdGlvbihjb25zdCBDT0ZGOjpyZWxvY2F0aW9uICZSKTsKKworICAvLyBNQ09iamVjdFdyaXRlciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uCisKKyAgdm9pZCBFeGVjdXRlUG9zdExheW91dEJpbmRpbmcoTUNBc3NlbWJsZXIgJkFzbSk7CisKKyAgdm9pZCBSZWNvcmRSZWxvY2F0aW9uKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICZGaXh1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1DVmFsdWUgVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJkZpeGVkVmFsdWUpOworCisgIHZvaWQgV3JpdGVPYmplY3QoY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCk7Cit9OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfdWludDMyX2xlKHZvaWQgKkRhdGEsIHVpbnQzMl90IGNvbnN0ICZWYWx1ZSkgeworICB1aW50OF90ICpQdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oRGF0YSk7CisgIFB0clswXSA9IChWYWx1ZSAmIDB4MDAwMDAwRkYpID4+ICAwOworICBQdHJbMV0gPSAoVmFsdWUgJiAweDAwMDBGRjAwKSA+PiAgODsKKyAgUHRyWzJdID0gKFZhbHVlICYgMHgwMEZGMDAwMCkgPj4gMTY7CisgIFB0clszXSA9IChWYWx1ZSAmIDB4RkYwMDAwMDApID4+IDI0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfdWludDE2X2xlKHZvaWQgKkRhdGEsIHVpbnQxNl90IGNvbnN0ICZWYWx1ZSkgeworICB1aW50OF90ICpQdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oRGF0YSk7CisgIFB0clswXSA9IChWYWx1ZSAmIDB4MDBGRikgPj4gMDsKKyAgUHRyWzFdID0gKFZhbHVlICYgMHhGRjAwKSA+PiA4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfdWludDhfbGUodm9pZCAqRGF0YSwgdWludDhfdCBjb25zdCAmVmFsdWUpIHsKKyAgdWludDhfdCAqUHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KERhdGEpOworICBQdHJbMF0gPSAoVmFsdWUgJiAweEZGKSA+PiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3ltYm9sIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0NPRkZTeW1ib2w6OkNPRkZTeW1ib2wobGx2bTo6U3RyaW5nUmVmIG5hbWUsIHNpemVfdCBpbmRleCkKKyAgICAgIDogTmFtZShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCkpLCBJbmRleCgtMSkKKyAgICAgICwgT3RoZXIoTlVMTCksIE1DRGF0YShOVUxMKSB7CisgIG1lbXNldCgmRGF0YSwgMCwgc2l6ZW9mKERhdGEpKTsKK30KKworc2l6ZV90IENPRkZTeW1ib2w6OnNpemUoKSBjb25zdCB7CisgIHJldHVybiBDT0ZGOjpTeW1ib2xTaXplICsgKERhdGEuTnVtYmVyT2ZBdXhTeW1ib2xzICogQ09GRjo6U3ltYm9sU2l6ZSk7Cit9CisKKy8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIG5hbWUgZG9lcyBub3QgZml0IHdpdGhpbiA4IGJ5dGVzLCB0aGUgb2Zmc2V0CisvLyBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaXMgc3RvcmVkIGluIHRoZSBsYXN0IDQgYnl0ZXMgaW5zdGVhZCwgbGVhdmluZworLy8gdGhlIGZpcnN0IDQgYnl0ZXMgYXMgMC4KK3ZvaWQgQ09GRlN5bWJvbDo6c2V0X25hbWVfb2Zmc2V0KHVpbnQzMl90IE9mZnNldCkgeworICB3cml0ZV91aW50MzJfbGUoRGF0YS5OYW1lICsgMCwgMCk7CisgIHdyaXRlX3VpbnQzMl9sZShEYXRhLk5hbWUgKyA0LCBPZmZzZXQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2VjdGlvbiBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitDT0ZGU2VjdGlvbjo6Q09GRlNlY3Rpb24obGx2bTo6U3RyaW5nUmVmIG5hbWUsIHNpemVfdCBJbmRleCkKKyAgICAgICA6IE5hbWUobmFtZSksIE51bWJlcihJbmRleCArIDEpCisgICAgICAgLCBNQ0RhdGEoTlVMTCksIFN5bWIoTlVMTCkgeworICBtZW1zZXQoJkhlYWRlciwgMCwgc2l6ZW9mKEhlYWRlcikpOworfQorCitzaXplX3QgQ09GRlNlY3Rpb246OnNpemUoKSB7CisgIHJldHVybiBDT0ZGOjpTZWN0aW9uU2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmluZ1RhYmxlIGNsYXNzIGltcGxlbWVudGF0aW9uCisKKy8vLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUgaW50byBEYXRhLgorLy8vIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0YWJsZSBpbmNsdWRlcyB1aW50MzIgbGVuZ3RoIGhlYWRlci4KK3ZvaWQgU3RyaW5nVGFibGU6OnVwZGF0ZV9sZW5ndGgoKSB7CisgIHdyaXRlX3VpbnQzMl9sZSgmRGF0YS5mcm9udCgpLCBEYXRhLnNpemUoKSk7Cit9CisKK1N0cmluZ1RhYmxlOjpTdHJpbmdUYWJsZSgpIHsKKyAgLy8gVGhlIHN0cmluZyB0YWJsZSBkYXRhIGJlZ2lucyB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBzdHJpbmcgdGFibGUKKyAgLy8gaW5jbHVkaW5nIHRoZSBsZW5ndGggaGVhZGVyLiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBoZWFkZXIuCisgIERhdGEucmVzaXplKDQpOworfQorCitzaXplX3QgU3RyaW5nVGFibGU6OnNpemUoKSBjb25zdCB7CisgIHJldHVybiBEYXRhLnNpemUoKTsKK30KKworLy8vIEFkZCBTdHJpbmcgdG8gdGhlIHRhYmxlIGlmZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4KKy8vLyBAcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgc3RyaW5nIHRhYmxlIHdoZXJlIHRoZSBzdHJpbmcgaXMgbm93IGxvY2F0ZWQuCitzaXplX3QgU3RyaW5nVGFibGU6Omluc2VydChsbHZtOjpTdHJpbmdSZWYgU3RyaW5nKSB7CisgIG1hcDo6aXRlcmF0b3IgaSA9IE1hcC5maW5kKFN0cmluZyk7CisKKyAgaWYgKGkgIT0gTWFwLmVuZCgpKQorICAgIHJldHVybiBpLT5zZWNvbmQ7CisKKyAgc2l6ZV90IE9mZnNldCA9IERhdGEuc2l6ZSgpOworCisgIC8vIEluc2VydCBzdHJpbmcgZGF0YSBpbnRvIHN0cmluZyB0YWJsZS4KKyAgRGF0YS5pbnNlcnQoRGF0YS5lbmQoKSwgU3RyaW5nLmJlZ2luKCksIFN0cmluZy5lbmQoKSk7CisgIERhdGEucHVzaF9iYWNrKCdcMCcpOworCisgIC8vIFB1dCBhIHJlZmVyZW5jZSB0byBpdCBpbiB0aGUgbWFwLgorICBNYXBbU3RyaW5nXSA9IE9mZnNldDsKKworICAvLyBVcGRhdGUgdGhlIGludGVybmFsIGxlbmd0aCBmaWVsZC4KKyAgdXBkYXRlX2xlbmd0aCgpOworCisgIHJldHVybiBPZmZzZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXaW5DT0ZGT2JqZWN0V3JpdGVyIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK1dpbkNPRkZPYmplY3RXcml0ZXI6OldpbkNPRkZPYmplY3RXcml0ZXIocmF3X29zdHJlYW0gJk9TKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1DT2JqZWN0V3JpdGVyKE9TLCB0cnVlKSB7CisgIG1lbXNldCgmSGVhZGVyLCAwLCBzaXplb2YoSGVhZGVyKSk7CisgIC8vIFRPRE86IE1vdmUgbWFnaWMgY29uc3RhbnQgb3V0IHRvIENPRkYuaAorICBIZWFkZXIuTWFjaGluZSA9IDB4MTRDOyAvLyB4ODYKK30KKworV2luQ09GRk9iamVjdFdyaXRlcjo6fldpbkNPRkZPYmplY3RXcml0ZXIoKSB7CisgIGZvciAoc3ltYm9sczo6aXRlcmF0b3IgSSA9IFN5bWJvbHMuYmVnaW4oKSwgRSA9IFN5bWJvbHMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGRlbGV0ZSAqSTsKKyAgZm9yIChzZWN0aW9uczo6aXRlcmF0b3IgSSA9IFNlY3Rpb25zLmJlZ2luKCksIEUgPSBTZWN0aW9ucy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgZGVsZXRlICpJOworfQorCitDT0ZGU3ltYm9sICpXaW5DT0ZGT2JqZWN0V3JpdGVyOjpjcmVhdGVTeW1ib2wobGx2bTo6U3RyaW5nUmVmIE5hbWUpIHsKKyAgcmV0dXJuIGNyZWF0ZUNPRkZFbnRpdHk8Q09GRlN5bWJvbD4oTmFtZSwgU3ltYm9scyk7Cit9CisKK0NPRkZTZWN0aW9uICpXaW5DT0ZGT2JqZWN0V3JpdGVyOjpjcmVhdGVTZWN0aW9uKGxsdm06OlN0cmluZ1JlZiBOYW1lKSB7CisgIHJldHVybiBjcmVhdGVDT0ZGRW50aXR5PENPRkZTZWN0aW9uPihOYW1lLCBTZWN0aW9ucyk7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgc3ltYm9sIGJ5IGVudGVyaW5nIGl0cyBuYW1lIGludG8gdGhlIHN0cmluZworLy8vIHRhYmxlIGlmIGl0IGlzIHRvbyBsb25nIHRvIGZpdCBpbiB0aGUgc3ltYm9sIHRhYmxlIGhlYWRlci4KK3ZvaWQgV2luQ09GRk9iamVjdFdyaXRlcjo6SW5pdENPRkZFbnRpdHkoQ09GRlN5bWJvbCAmUykgeworICBpZiAoUy5OYW1lLnNpemUoKSA+IENPRkY6Ok5hbWVTaXplKSB7CisgICAgc2l6ZV90IFN0cmluZ1RhYmxlRW50cnkgPSBTdHJpbmdzLmluc2VydChTLk5hbWUuY19zdHIoKSk7CisKKyAgICBTLnNldF9uYW1lX29mZnNldChTdHJpbmdUYWJsZUVudHJ5KTsKKyAgfSBlbHNlCisgICAgbWVtY3B5KFMuRGF0YS5OYW1lLCBTLk5hbWUuY19zdHIoKSwgUy5OYW1lLnNpemUoKSk7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgc2VjdGlvbiBieSBlbnRlcmluZyBpdHMgbmFtZSBpbnRvIHRoZSBzdHJpbmcKKy8vLyB0YWJsZSBpZiBpdCBpcyB0b28gbG9uZyB0byBmaXQgaW4gdGhlIHNlY3Rpb24gdGFibGUgaGVhZGVyLgordm9pZCBXaW5DT0ZGT2JqZWN0V3JpdGVyOjpJbml0Q09GRkVudGl0eShDT0ZGU2VjdGlvbiAmUykgeworICBpZiAoUy5OYW1lLnNpemUoKSA+IENPRkY6Ok5hbWVTaXplKSB7CisgICAgc2l6ZV90IFN0cmluZ1RhYmxlRW50cnkgPSBTdHJpbmdzLmluc2VydChTLk5hbWUuY19zdHIoKSk7CisKKyAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgbnVtYmVyIDk5OTk5OT8gVGhpcyBudW1iZXIgaXMgbmV2ZXIgbWVudGlvbmVkIGluIHRoZQorICAgIC8vIHNwZWMuIEknbSBhc3N1bWluZyB0aGlzIGlzIGR1ZSB0byB0aGUgcHJpbnRlZCB2YWx1ZSBuZWVkaW5nIHRvIGZpdCBpbnRvCisgICAgLy8gdGhlIFMuSGVhZGVyLk5hbWUgZmllbGQuIEluIHdoaWNoIGNhc2Ugd2h5IG5vdCA5OTk5OTk5ICg3IDkncyBpbnN0ZWFkIG9mCisgICAgLy8gNik/IFRoZSBzcGVjIGRvZXMgbm90IHN0YXRlIGlmIHRoaXMgZW50cnkgc2hvdWxkIGJlIG51bGwgdGVybWluYXRlZCBpbgorICAgIC8vIHRoaXMgY2FzZSwgYW5kIHRodXMgdGhpcyBzZWVtcyB0byBiZSB0aGUgYmVzdCB3YXkgdG8gZG8gaXQuIEkgdGhpbmsgSQorICAgIC8vIGp1c3Qgc29sdmVkIG15IG93biBGSVhNRS4uLgorICAgIGlmIChTdHJpbmdUYWJsZUVudHJ5ID4gOTk5OTk5KQorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJDT0ZGIHN0cmluZyB0YWJsZSBpcyBncmVhdGVyIHRoYW4gOTk5OTk5IGJ5dGVzLiIpOworCisgICAgc3ByaW50ZihTLkhlYWRlci5OYW1lLCAiLyVkIiwgKHVuc2lnbmVkKVN0cmluZ1RhYmxlRW50cnkpOworICB9IGVsc2UKKyAgICBtZW1jcHkoUy5IZWFkZXIuTmFtZSwgUy5OYW1lLmNfc3RyKCksIFMuTmFtZS5zaXplKCkpOworfQorCisvLy8gQSB0ZW1wbGF0ZSB1c2VkIHRvIGxvb2t1cCBvciBjcmVhdGUgYSBzeW1ib2wvc2VjdGlvbiwgYW5kIGluaXRpYWxpemUgaXQgaWYKKy8vLyBuZWVkZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgb2JqZWN0X3QsIHR5cGVuYW1lIGxpc3RfdD4KK29iamVjdF90ICpXaW5DT0ZGT2JqZWN0V3JpdGVyOjpjcmVhdGVDT0ZGRW50aXR5KGxsdm06OlN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF90ICZMaXN0KSB7CisgIG9iamVjdF90ICpPYmplY3QgPSBuZXcgb2JqZWN0X3QoTmFtZSwgTGlzdC5zaXplKCkpOworCisgIEluaXRDT0ZGRW50aXR5KCpPYmplY3QpOworCisgIExpc3QucHVzaF9iYWNrKE9iamVjdCk7CisKKyAgcmV0dXJuIE9iamVjdDsKK30KKworLy8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzZWN0aW9uIGRhdGEgb2JqZWN0IGZyb20gdGhlIGFzc2VtYmxlcgorLy8vIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIENPRkYgc2VjdGlvbiBzdGFnaW5nIG9iamVjdC4KK3ZvaWQgV2luQ09GRk9iamVjdFdyaXRlcjo6RGVmaW5lU2VjdGlvbihNQ1NlY3Rpb25EYXRhIGNvbnN0ICZTZWN0aW9uRGF0YSkgeworICAvLyBGSVhNRTogTm90IHN1cmUgaG93IHRvIHZlcmlmeSB0aGlzIChhdCBsZWFzdCBpbiBhIGRlYnVnIGJ1aWxkKS4KKyAgTUNTZWN0aW9uQ09GRiBjb25zdCAmU2VjID0KKyAgICBzdGF0aWNfY2FzdDxNQ1NlY3Rpb25DT0ZGIGNvbnN0ICY+KFNlY3Rpb25EYXRhLmdldFNlY3Rpb24oKSk7CisKKyAgQ09GRlNlY3Rpb24gKmNvZmZfc2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24oU2VjLmdldFNlY3Rpb25OYW1lKCkpOworICBDT0ZGU3ltYm9sICAqY29mZl9zeW1ib2wgPSBjcmVhdGVTeW1ib2woU2VjLmdldFNlY3Rpb25OYW1lKCkpOworCisgIGNvZmZfc2VjdGlvbi0+U3ltYiA9IGNvZmZfc3ltYm9sOworICBjb2ZmX3N5bWJvbC0+RGF0YS5TdG9yYWdlQ2xhc3MgPSBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfU1RBVElDOworICBjb2ZmX3N5bWJvbC0+RGF0YS5TZWN0aW9uTnVtYmVyID0gY29mZl9zZWN0aW9uLT5OdW1iZXI7CisKKyAgLy8gSW4gdGhpcyBjYXNlIHRoZSBhdXhpbGlhcnkgc3ltYm9sIGlzIGEgU2VjdGlvbiBEZWZpbml0aW9uLgorICBjb2ZmX3N5bWJvbC0+QXV4LnJlc2l6ZSgxKTsKKyAgbWVtc2V0KCZjb2ZmX3N5bWJvbC0+QXV4WzBdLCAwLCBzaXplb2YoY29mZl9zeW1ib2wtPkF1eFswXSkpOworICBjb2ZmX3N5bWJvbC0+QXV4WzBdLkF1eFR5cGUgPSBBVFNlY3Rpb25EZWZpbml0aW9uOworICBjb2ZmX3N5bWJvbC0+QXV4WzBdLkF1eC5TZWN0aW9uRGVmaW5pdGlvbi5OdW1iZXIgPSBjb2ZmX3NlY3Rpb24tPk51bWJlcjsKKyAgY29mZl9zeW1ib2wtPkF1eFswXS5BdXguU2VjdGlvbkRlZmluaXRpb24uU2VsZWN0aW9uID0gU2VjLmdldFNlbGVjdGlvbigpOworCisgIGNvZmZfc2VjdGlvbi0+SGVhZGVyLkNoYXJhY3RlcmlzdGljcyA9IFNlYy5nZXRDaGFyYWN0ZXJpc3RpY3MoKTsKKworICB1aW50MzJfdCAmQ2hhcmFjdGVyaXN0aWNzID0gY29mZl9zZWN0aW9uLT5IZWFkZXIuQ2hhcmFjdGVyaXN0aWNzOworICBzd2l0Y2ggKFNlY3Rpb25EYXRhLmdldEFsaWdubWVudCgpKSB7CisgIGNhc2UgMTogICAgQ2hhcmFjdGVyaXN0aWNzIHw9IENPRkY6OklNQUdFX1NDTl9BTElHTl8xQllURVM7ICAgIGJyZWFrOworICBjYXNlIDI6ICAgIENoYXJhY3RlcmlzdGljcyB8PSBDT0ZGOjpJTUFHRV9TQ05fQUxJR05fMkJZVEVTOyAgICBicmVhazsKKyAgY2FzZSA0OiAgICBDaGFyYWN0ZXJpc3RpY3MgfD0gQ09GRjo6SU1BR0VfU0NOX0FMSUdOXzRCWVRFUzsgICAgYnJlYWs7CisgIGNhc2UgODogICAgQ2hhcmFjdGVyaXN0aWNzIHw9IENPRkY6OklNQUdFX1NDTl9BTElHTl84QllURVM7ICAgIGJyZWFrOworICBjYXNlIDE2OiAgIENoYXJhY3RlcmlzdGljcyB8PSBDT0ZGOjpJTUFHRV9TQ05fQUxJR05fMTZCWVRFUzsgICBicmVhazsKKyAgY2FzZSAzMjogICBDaGFyYWN0ZXJpc3RpY3MgfD0gQ09GRjo6SU1BR0VfU0NOX0FMSUdOXzMyQllURVM7ICAgYnJlYWs7CisgIGNhc2UgNjQ6ICAgQ2hhcmFjdGVyaXN0aWNzIHw9IENPRkY6OklNQUdFX1NDTl9BTElHTl82NEJZVEVTOyAgIGJyZWFrOworICBjYXNlIDEyODogIENoYXJhY3RlcmlzdGljcyB8PSBDT0ZGOjpJTUFHRV9TQ05fQUxJR05fMTI4QllURVM7ICBicmVhazsKKyAgY2FzZSAyNTY6ICBDaGFyYWN0ZXJpc3RpY3MgfD0gQ09GRjo6SU1BR0VfU0NOX0FMSUdOXzI1NkJZVEVTOyAgYnJlYWs7CisgIGNhc2UgNTEyOiAgQ2hhcmFjdGVyaXN0aWNzIHw9IENPRkY6OklNQUdFX1NDTl9BTElHTl81MTJCWVRFUzsgIGJyZWFrOworICBjYXNlIDEwMjQ6IENoYXJhY3RlcmlzdGljcyB8PSBDT0ZGOjpJTUFHRV9TQ05fQUxJR05fMTAyNEJZVEVTOyBicmVhazsKKyAgY2FzZSAyMDQ4OiBDaGFyYWN0ZXJpc3RpY3MgfD0gQ09GRjo6SU1BR0VfU0NOX0FMSUdOXzIwNDhCWVRFUzsgYnJlYWs7CisgIGNhc2UgNDA5NjogQ2hhcmFjdGVyaXN0aWNzIHw9IENPRkY6OklNQUdFX1NDTl9BTElHTl80MDk2QllURVM7IGJyZWFrOworICBjYXNlIDgxOTI6IENoYXJhY3RlcmlzdGljcyB8PSBDT0ZGOjpJTUFHRV9TQ05fQUxJR05fODE5MkJZVEVTOyBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bnN1cHBvcnRlZCBzZWN0aW9uIGFsaWdubWVudCIpOworICB9CisKKyAgLy8gQmluZCBpbnRlcm5hbCBDT0ZGIHNlY3Rpb24gdG8gTUMgc2VjdGlvbi4KKyAgY29mZl9zZWN0aW9uLT5NQ0RhdGEgPSAmU2VjdGlvbkRhdGE7CisgIFNlY3Rpb25NYXBbJlNlY3Rpb25EYXRhXSA9IGNvZmZfc2VjdGlvbjsKK30KKworLy8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzZWN0aW9uIGRhdGEgb2JqZWN0IGZyb20gdGhlIGFzc2VtYmxlcgorLy8vIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIENPRkYgc3ltYm9sIHN0YWdpbmcgb2JqZWN0Lgordm9pZCBXaW5DT0ZGT2JqZWN0V3JpdGVyOjpEZWZpbmVTeW1ib2woTUNTeW1ib2xEYXRhIGNvbnN0ICZTeW1ib2xEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNzZW1ibGVyICZBc3NlbWJsZXIpIHsKKyAgQ09GRlN5bWJvbCAqY29mZl9zeW1ib2wgPSBjcmVhdGVTeW1ib2woU3ltYm9sRGF0YS5nZXRTeW1ib2woKS5nZXROYW1lKCkpOworCisgIGNvZmZfc3ltYm9sLT5EYXRhLlR5cGUgICAgICAgICA9IChTeW1ib2xEYXRhLmdldEZsYWdzKCkgJiAweDAwMDBGRkZGKSA+PiAgMDsKKyAgY29mZl9zeW1ib2wtPkRhdGEuU3RvcmFnZUNsYXNzID0gKFN5bWJvbERhdGEuZ2V0RmxhZ3MoKSAmIDB4MDBGRjAwMDApID4+IDE2OworCisgIC8vIElmIG5vIHN0b3JhZ2UgY2xhc3Mgd2FzIHNwZWNpZmllZCBpbiB0aGUgc3RyZWFtZXIsIGRlZmluZSBpdCBoZXJlLgorICBpZiAoY29mZl9zeW1ib2wtPkRhdGEuU3RvcmFnZUNsYXNzID09IDApIHsKKyAgICBib29sIGV4dGVybmFsID0gU3ltYm9sRGF0YS5pc0V4dGVybmFsKCkgfHwgKFN5bWJvbERhdGEuRnJhZ21lbnQgPT0gTlVMTCk7CisKKyAgICBjb2ZmX3N5bWJvbC0+RGF0YS5TdG9yYWdlQ2xhc3MgPQorICAgICAgZXh0ZXJuYWwgPyBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUwgOiBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfU1RBVElDOworICB9CisKKyAgaWYgKFN5bWJvbERhdGEuZ2V0RmxhZ3MoKSAmIENPRkY6OlNGX1dlYWtSZWZlcmVuY2UpIHsKKyAgICBjb2ZmX3N5bWJvbC0+RGF0YS5TdG9yYWdlQ2xhc3MgPSBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfV0VBS19FWFRFUk5BTDsKKworICAgIGNvbnN0IE1DRXhwciAqVmFsdWUgPSBTeW1ib2xEYXRhLmdldFN5bWJvbCgpLmdldFZhcmlhYmxlVmFsdWUoKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIGFzc2VydCBtZXNzYWdlIGlzbid0IHZlcnkgZ29vZC4KKyAgICBhc3NlcnQoVmFsdWUtPmdldEtpbmQoKSA9PSBNQ0V4cHI6OlN5bWJvbFJlZiAmJgorICAgICAgICAgICAiVmFsdWUgbXVzdCBiZSBhIFN5bWJvbFJlZiEiKTsKKworICAgIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqU3ltYm9sUmVmID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqPihWYWx1ZSk7CisKKyAgICBjb25zdCBNQ1N5bWJvbERhdGEgJk90aGVyU3ltYm9sRGF0YSA9CisgICAgICBBc3NlbWJsZXIuZ2V0U3ltYm9sRGF0YShTeW1ib2xSZWYtPmdldFN5bWJvbCgpKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIGFzc2VydCBtZXNzYWdlIGlzbid0IHZlcnkgZ29vZC4KKyAgICBhc3NlcnQoU3ltYm9sTWFwLmZpbmQoJk90aGVyU3ltYm9sRGF0YSkgIT0gU3ltYm9sTWFwLmVuZCgpICYmCisgICAgICAgICAgICJPdGhlclN5bWJvbERhdGEgbXVzdCBiZSBpbiB0aGUgc3ltYm9sIG1hcCEiKTsKKworICAgIGNvZmZfc3ltYm9sLT5PdGhlciA9IFN5bWJvbE1hcFsmT3RoZXJTeW1ib2xEYXRhXTsKKworICAgIC8vIFNldHVwIHRoZSBXZWFrIEV4dGVybmFsIGF1eGlsaWFyeSBzeW1ib2wuCisgICAgY29mZl9zeW1ib2wtPkF1eC5yZXNpemUoMSk7CisgICAgbWVtc2V0KCZjb2ZmX3N5bWJvbC0+QXV4WzBdLCAwLCBzaXplb2YoY29mZl9zeW1ib2wtPkF1eFswXSkpOworICAgIGNvZmZfc3ltYm9sLT5BdXhbMF0uQXV4VHlwZSA9IEFUV2Vha0V4dGVybmFsOworICAgIGNvZmZfc3ltYm9sLT5BdXhbMF0uQXV4LldlYWtFeHRlcm5hbC5UYWdJbmRleCA9IDA7CisgICAgY29mZl9zeW1ib2wtPkF1eFswXS5BdXguV2Vha0V4dGVybmFsLkNoYXJhY3RlcmlzdGljcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09GRjo6SU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX0xJQlJBUlk7CisgIH0KKworICAvLyBCaW5kIGludGVybmFsIENPRkYgc3ltYm9sIHRvIE1DIHN5bWJvbC4KKyAgY29mZl9zeW1ib2wtPk1DRGF0YSA9ICZTeW1ib2xEYXRhOworICBTeW1ib2xNYXBbJlN5bWJvbERhdGFdID0gY29mZl9zeW1ib2w7Cit9CisKK2Jvb2wgV2luQ09GRk9iamVjdFdyaXRlcjo6RXhwb3J0U2VjdGlvbihDT0ZGU2VjdGlvbiAqUykgeworICByZXR1cm4gKFMtPkhlYWRlci5DaGFyYWN0ZXJpc3RpY3MKKyAgICAgICAgICYgQ09GRjo6SU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEpID09IDA7Cit9CisKK2Jvb2wgV2luQ09GRk9iamVjdFdyaXRlcjo6RXhwb3J0U3ltYm9sKE1DU3ltYm9sRGF0YSBjb25zdCAmU3ltYm9sRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNzZW1ibGVyICZBc20pIHsKKyAgLy8gVGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgcmlnaHQuIFN0cmluZ3MgcmVmZXJyZWQgdG8gZnJvbSB0aGUgLmRhdGEgc2VjdGlvbgorICAvLyBuZWVkIHN5bWJvbHMgc28gdGhleSBjYW4gYmUgbGlua2VkIHRvIGNvZGUgaW4gdGhlIC50ZXh0IHNlY3Rpb24gcmlnaHQ/CisKKyAgLy8gcmV0dXJuIEFzbS5pc1N5bWJvbExpbmtlclZpc2libGUgKCZTeW1ib2xEYXRhKTsKKworICAvLyBGb3Igbm93LCBhbGwgc3ltYm9scyBhcmUgZXhwb3J0ZWQsIHRoZSBsaW5rZXIgd2lsbCBzb3J0IGl0IG91dCBmb3IgdXMuCisgIHJldHVybiB0cnVlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZW50aXR5IHdyaXRpbmcgbWV0aG9kcworCit2b2lkIFdpbkNPRkZPYmplY3RXcml0ZXI6OldyaXRlRmlsZUhlYWRlcihjb25zdCBDT0ZGOjpoZWFkZXIgJkhlYWRlcikgeworICBXcml0ZUxFMTYoSGVhZGVyLk1hY2hpbmUpOworICBXcml0ZUxFMTYoSGVhZGVyLk51bWJlck9mU2VjdGlvbnMpOworICBXcml0ZUxFMzIoSGVhZGVyLlRpbWVEYXRlU3RhbXApOworICBXcml0ZUxFMzIoSGVhZGVyLlBvaW50ZXJUb1N5bWJvbFRhYmxlKTsKKyAgV3JpdGVMRTMyKEhlYWRlci5OdW1iZXJPZlN5bWJvbHMpOworICBXcml0ZUxFMTYoSGVhZGVyLlNpemVPZk9wdGlvbmFsSGVhZGVyKTsKKyAgV3JpdGVMRTE2KEhlYWRlci5DaGFyYWN0ZXJpc3RpY3MpOworfQorCit2b2lkIFdpbkNPRkZPYmplY3RXcml0ZXI6OldyaXRlU3ltYm9sKGNvbnN0IENPRkZTeW1ib2wgKlMpIHsKKyAgV3JpdGVCeXRlcyhTdHJpbmdSZWYoUy0+RGF0YS5OYW1lLCBDT0ZGOjpOYW1lU2l6ZSkpOworICBXcml0ZUxFMzIoUy0+RGF0YS5WYWx1ZSk7CisgIFdyaXRlTEUxNihTLT5EYXRhLlNlY3Rpb25OdW1iZXIpOworICBXcml0ZUxFMTYoUy0+RGF0YS5UeXBlKTsKKyAgV3JpdGU4KFMtPkRhdGEuU3RvcmFnZUNsYXNzKTsKKyAgV3JpdGU4KFMtPkRhdGEuTnVtYmVyT2ZBdXhTeW1ib2xzKTsKKyAgV3JpdGVBdXhpbGlhcnlTeW1ib2xzKFMtPkF1eCk7Cit9CisKK3ZvaWQgV2luQ09GRk9iamVjdFdyaXRlcjo6V3JpdGVBdXhpbGlhcnlTeW1ib2xzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPRkZTeW1ib2w6OkF1eGlsaWFyeVN5bWJvbHMgJlMpIHsKKyAgZm9yKENPRkZTeW1ib2w6OkF1eGlsaWFyeVN5bWJvbHM6OmNvbnN0X2l0ZXJhdG9yIGkgPSBTLmJlZ2luKCksIGUgPSBTLmVuZCgpOworICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBzd2l0Y2goaS0+QXV4VHlwZSkgeworICAgIGNhc2UgQVRGdW5jdGlvbkRlZmluaXRpb246CisgICAgICBXcml0ZUxFMzIoaS0+QXV4LkZ1bmN0aW9uRGVmaW5pdGlvbi5UYWdJbmRleCk7CisgICAgICBXcml0ZUxFMzIoaS0+QXV4LkZ1bmN0aW9uRGVmaW5pdGlvbi5Ub3RhbFNpemUpOworICAgICAgV3JpdGVMRTMyKGktPkF1eC5GdW5jdGlvbkRlZmluaXRpb24uUG9pbnRlclRvTGluZW51bWJlcik7CisgICAgICBXcml0ZUxFMzIoaS0+QXV4LkZ1bmN0aW9uRGVmaW5pdGlvbi5Qb2ludGVyVG9OZXh0RnVuY3Rpb24pOworICAgICAgV3JpdGVaZXJvcyhzaXplb2YoaS0+QXV4LkZ1bmN0aW9uRGVmaW5pdGlvbi51bnVzZWQpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVRiZkFuZGVmU3ltYm9sOgorICAgICAgV3JpdGVaZXJvcyhzaXplb2YoaS0+QXV4LmJmQW5kZWZTeW1ib2wudW51c2VkMSkpOworICAgICAgV3JpdGVMRTE2KGktPkF1eC5iZkFuZGVmU3ltYm9sLkxpbmVudW1iZXIpOworICAgICAgV3JpdGVaZXJvcyhzaXplb2YoaS0+QXV4LmJmQW5kZWZTeW1ib2wudW51c2VkMikpOworICAgICAgV3JpdGVMRTMyKGktPkF1eC5iZkFuZGVmU3ltYm9sLlBvaW50ZXJUb05leHRGdW5jdGlvbik7CisgICAgICBXcml0ZVplcm9zKHNpemVvZihpLT5BdXguYmZBbmRlZlN5bWJvbC51bnVzZWQzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFUV2Vha0V4dGVybmFsOgorICAgICAgV3JpdGVMRTMyKGktPkF1eC5XZWFrRXh0ZXJuYWwuVGFnSW5kZXgpOworICAgICAgV3JpdGVMRTMyKGktPkF1eC5XZWFrRXh0ZXJuYWwuQ2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgIFdyaXRlWmVyb3Moc2l6ZW9mKGktPkF1eC5XZWFrRXh0ZXJuYWwudW51c2VkKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFURmlsZToKKyAgICAgIFdyaXRlQnl0ZXMoU3RyaW5nUmVmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihpLT5BdXguRmlsZS5GaWxlTmFtZSksCisgICAgICAgICAgICAgICAgIHNpemVvZihpLT5BdXguRmlsZS5GaWxlTmFtZSkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVRTZWN0aW9uRGVmaW5pdGlvbjoKKyAgICAgIFdyaXRlTEUzMihpLT5BdXguU2VjdGlvbkRlZmluaXRpb24uTGVuZ3RoKTsKKyAgICAgIFdyaXRlTEUxNihpLT5BdXguU2VjdGlvbkRlZmluaXRpb24uTnVtYmVyT2ZSZWxvY2F0aW9ucyk7CisgICAgICBXcml0ZUxFMTYoaS0+QXV4LlNlY3Rpb25EZWZpbml0aW9uLk51bWJlck9mTGluZW51bWJlcnMpOworICAgICAgV3JpdGVMRTMyKGktPkF1eC5TZWN0aW9uRGVmaW5pdGlvbi5DaGVja1N1bSk7CisgICAgICBXcml0ZUxFMTYoaS0+QXV4LlNlY3Rpb25EZWZpbml0aW9uLk51bWJlcik7CisgICAgICBXcml0ZTgoaS0+QXV4LlNlY3Rpb25EZWZpbml0aW9uLlNlbGVjdGlvbik7CisgICAgICBXcml0ZVplcm9zKHNpemVvZihpLT5BdXguU2VjdGlvbkRlZmluaXRpb24udW51c2VkKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBXaW5DT0ZGT2JqZWN0V3JpdGVyOjpXcml0ZVNlY3Rpb25IZWFkZXIoY29uc3QgQ09GRjo6c2VjdGlvbiAmUykgeworICBXcml0ZUJ5dGVzKFN0cmluZ1JlZihTLk5hbWUsIENPRkY6Ok5hbWVTaXplKSk7CisKKyAgV3JpdGVMRTMyKFMuVmlydHVhbFNpemUpOworICBXcml0ZUxFMzIoUy5WaXJ0dWFsQWRkcmVzcyk7CisgIFdyaXRlTEUzMihTLlNpemVPZlJhd0RhdGEpOworICBXcml0ZUxFMzIoUy5Qb2ludGVyVG9SYXdEYXRhKTsKKyAgV3JpdGVMRTMyKFMuUG9pbnRlclRvUmVsb2NhdGlvbnMpOworICBXcml0ZUxFMzIoUy5Qb2ludGVyVG9MaW5lTnVtYmVycyk7CisgIFdyaXRlTEUxNihTLk51bWJlck9mUmVsb2NhdGlvbnMpOworICBXcml0ZUxFMTYoUy5OdW1iZXJPZkxpbmVOdW1iZXJzKTsKKyAgV3JpdGVMRTMyKFMuQ2hhcmFjdGVyaXN0aWNzKTsKK30KKwordm9pZCBXaW5DT0ZGT2JqZWN0V3JpdGVyOjpXcml0ZVJlbG9jYXRpb24oY29uc3QgQ09GRjo6cmVsb2NhdGlvbiAmUikgeworICBXcml0ZUxFMzIoUi5WaXJ0dWFsQWRkcmVzcyk7CisgIFdyaXRlTEUzMihSLlN5bWJvbFRhYmxlSW5kZXgpOworICBXcml0ZUxFMTYoUi5UeXBlKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1DT2JqZWN0V3JpdGVyIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMKKwordm9pZCBXaW5DT0ZGT2JqZWN0V3JpdGVyOjpFeGVjdXRlUG9zdExheW91dEJpbmRpbmcoTUNBc3NlbWJsZXIgJkFzbSkgeworICAvLyAiRGVmaW5lIiBlYWNoIHNlY3Rpb24gJiBzeW1ib2wuIFRoaXMgY3JlYXRlcyBzZWN0aW9uICYgc3ltYm9sCisgIC8vIGVudHJpZXMgaW4gdGhlIHN0YWdpbmcgYXJlYSBhbmQgZ2l2ZXMgdGhlbSB0aGVpciBmaW5hbCBpbmRleGVzLgorCisgIGZvciAoTUNBc3NlbWJsZXI6OmNvbnN0X2l0ZXJhdG9yIGkgPSBBc20uYmVnaW4oKSwgZSA9IEFzbS5lbmQoKTsgaSAhPSBlOyBpKyspCisgICAgRGVmaW5lU2VjdGlvbigqaSk7CisKKyAgZm9yIChNQ0Fzc2VtYmxlcjo6Y29uc3Rfc3ltYm9sX2l0ZXJhdG9yIGkgPSBBc20uc3ltYm9sX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gQXNtLnN5bWJvbF9lbmQoKTsgaSAhPSBlOyBpKyspIHsKKyAgICBpZiAoRXhwb3J0U3ltYm9sKCppLCBBc20pKQorICAgICAgRGVmaW5lU3ltYm9sKCppLCBBc20pOworICB9Cit9CisKK3ZvaWQgV2luQ09GRk9iamVjdFdyaXRlcjo6UmVjb3JkUmVsb2NhdGlvbihjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAmRml4dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNWYWx1ZSBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJkZpeGVkVmFsdWUpIHsKKyAgYXNzZXJ0KFRhcmdldC5nZXRTeW1BKCkgIT0gTlVMTCAmJiAiUmVsb2NhdGlvbiBtdXN0IHJlZmVyZW5jZSBhIHN5bWJvbCEiKTsKKyAgYXNzZXJ0KFRhcmdldC5nZXRTeW1CKCkgPT0gTlVMTCAmJgorICAgICAgICAgIlJlbG9jYXRpb24gbXVzdCByZWZlcmVuY2Ugb25seSBvbmUgc3ltYm9sISIpOworCisgIE1DU2VjdGlvbkRhdGEgY29uc3QgKlNlY3Rpb25EYXRhID0gRnJhZ21lbnQtPmdldFBhcmVudCgpOworICBNQ1N5bWJvbERhdGEgY29uc3QgKlN5bWJvbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFzbS5nZXRTeW1ib2xEYXRhKFRhcmdldC5nZXRTeW1BKCktPmdldFN5bWJvbCgpKTsKKworICBhc3NlcnQoU2VjdGlvbk1hcC5maW5kKFNlY3Rpb25EYXRhKSAhPSBTZWN0aW9uTWFwLmVuZCgpICYmCisgICAgICAgICAiU2VjdGlvbiBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIGRlZmluZWQgaW4gRXhlY3V0ZVBvc3RMYXlvdXRCaW5kaW5nISIpOworICBhc3NlcnQoU3ltYm9sTWFwLmZpbmQoU3ltYm9sRGF0YSkgIT0gU3ltYm9sTWFwLmVuZCgpICYmCisgICAgICAgICAiU3ltYm9sIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gZGVmaW5lZCBpbiBFeGVjdXRlUG9zdExheW91dEJpbmRpbmchIik7CisKKyAgQ09GRlNlY3Rpb24gKmNvZmZfc2VjdGlvbiA9IFNlY3Rpb25NYXBbU2VjdGlvbkRhdGFdOworICBDT0ZGU3ltYm9sICpjb2ZmX3N5bWJvbCA9IFN5bWJvbE1hcFtTeW1ib2xEYXRhXTsKKworICBGaXhlZFZhbHVlID0gVGFyZ2V0LmdldENvbnN0YW50KCk7CisKKyAgQ09GRlJlbG9jYXRpb24gUmVsb2M7CisKKyAgUmVsb2MuRGF0YS5TeW1ib2xUYWJsZUluZGV4ID0gMDsKKyAgUmVsb2MuRGF0YS5WaXJ0dWFsQWRkcmVzcyA9IExheW91dC5nZXRGcmFnbWVudE9mZnNldChGcmFnbWVudCk7CisgIFJlbG9jLlN5bWIgPSBjb2ZmX3N5bWJvbDsKKworICBSZWxvYy5EYXRhLlZpcnR1YWxBZGRyZXNzICs9IEZpeHVwLmdldE9mZnNldCgpOworCisgIHN3aXRjaCAoRml4dXAuZ2V0S2luZCgpKSB7CisgIGNhc2UgRmlyc3RUYXJnZXRGaXh1cEtpbmQ6IC8vIHJlbG9jX3BjcmVsXzRieXRlCisgICAgUmVsb2MuRGF0YS5UeXBlID0gQ09GRjo6SU1BR0VfUkVMX0kzODZfUkVMMzI7CisgICAgRml4ZWRWYWx1ZSArPSA0OworICAgIGJyZWFrOworICBjYXNlIEZLX0RhdGFfNDoKKyAgICBSZWxvYy5EYXRhLlR5cGUgPSBDT0ZGOjpJTUFHRV9SRUxfSTM4Nl9ESVIzMjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiKTsKKyAgfQorCisgIGNvZmZfc2VjdGlvbi0+UmVsb2NhdGlvbnMucHVzaF9iYWNrKFJlbG9jKTsKK30KKwordm9pZCBXaW5DT0ZGT2JqZWN0V3JpdGVyOjpXcml0ZU9iamVjdChjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSB7CisgIC8vIEFzc2lnbiBzeW1ib2wgYW5kIHNlY3Rpb24gaW5kZXhlcyBhbmQgb2Zmc2V0cy4KKworICBIZWFkZXIuTnVtYmVyT2ZTeW1ib2xzID0gMDsKKworICBmb3IgKHN5bWJvbHM6Oml0ZXJhdG9yIGkgPSBTeW1ib2xzLmJlZ2luKCksIGUgPSBTeW1ib2xzLmVuZCgpOyBpICE9IGU7IGkrKykgeworICAgIENPRkZTeW1ib2wgKmNvZmZfc3ltYm9sID0gKmk7CisgICAgTUNTeW1ib2xEYXRhIGNvbnN0ICpTeW1ib2xEYXRhID0gY29mZl9zeW1ib2wtPk1DRGF0YTsKKworICAgIGNvZmZfc3ltYm9sLT5JbmRleCA9IEhlYWRlci5OdW1iZXJPZlN5bWJvbHMrKzsKKworICAgIC8vIFVwZGF0ZSBzZWN0aW9uIG51bWJlciAmIG9mZnNldCBmb3Igc3ltYm9scyB0aGF0IGhhdmUgdGhlbS4KKyAgICBpZiAoKFN5bWJvbERhdGEgIT0gTlVMTCkgJiYgKFN5bWJvbERhdGEtPkZyYWdtZW50ICE9IE5VTEwpKSB7CisgICAgICBDT0ZGU2VjdGlvbiAqY29mZl9zZWN0aW9uID0gU2VjdGlvbk1hcFtTeW1ib2xEYXRhLT5GcmFnbWVudC0+Z2V0UGFyZW50KCldOworCisgICAgICBjb2ZmX3N5bWJvbC0+RGF0YS5TZWN0aW9uTnVtYmVyID0gY29mZl9zZWN0aW9uLT5OdW1iZXI7CisgICAgICBjb2ZmX3N5bWJvbC0+RGF0YS5WYWx1ZSA9IExheW91dC5nZXRGcmFnbWVudE9mZnNldChTeW1ib2xEYXRhLT5GcmFnbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU3ltYm9sRGF0YS0+T2Zmc2V0OworICAgIH0KKworICAgIC8vIFVwZGF0ZSBhdXhpbGlhcnkgc3ltYm9sIGluZm8uCisgICAgY29mZl9zeW1ib2wtPkRhdGEuTnVtYmVyT2ZBdXhTeW1ib2xzID0gY29mZl9zeW1ib2wtPkF1eC5zaXplKCk7CisgICAgSGVhZGVyLk51bWJlck9mU3ltYm9scyArPSBjb2ZmX3N5bWJvbC0+RGF0YS5OdW1iZXJPZkF1eFN5bWJvbHM7CisgIH0KKworICAvLyBGaXh1cCB3ZWFrIGV4dGVybmFsIHJlZmVyZW5jZXMuCisgIGZvciAoc3ltYm9sczo6aXRlcmF0b3IgaSA9IFN5bWJvbHMuYmVnaW4oKSwgZSA9IFN5bWJvbHMuZW5kKCk7IGkgIT0gZTsgaSsrKSB7CisgICAgQ09GRlN5bWJvbCAqc3ltYiA9ICppOworCisgICAgaWYgKHN5bWItPk90aGVyICE9IE5VTEwpIHsKKyAgICAgIGFzc2VydChzeW1iLT5BdXguc2l6ZSgpID09IDEgJiYKKyAgICAgICAgICAgICAiU3ltYm9sIG11c3QgY29udGFpbiBvbmUgYXV4IHN5bWJvbCEiKTsKKyAgICAgIGFzc2VydChzeW1iLT5BdXhbMF0uQXV4VHlwZSA9PSBBVFdlYWtFeHRlcm5hbCAmJgorICAgICAgICAgICAgICJTeW1ib2wncyBhdXggc3ltYm9sIG11c3QgYmUgYSBXZWFrIEV4dGVybmFsISIpOworICAgICAgc3ltYi0+QXV4WzBdLkF1eC5XZWFrRXh0ZXJuYWwuVGFnSW5kZXggPSBzeW1iLT5PdGhlci0+SW5kZXg7CisgICAgfQorICB9CisKKyAgLy8gQXNzaWduIGZpbGUgb2Zmc2V0cyB0byBDT0ZGIG9iamVjdCBmaWxlIHN0cnVjdHVyZXMuCisKKyAgdW5zaWduZWQgb2Zmc2V0ID0gMDsKKworICBvZmZzZXQgKz0gQ09GRjo6SGVhZGVyU2l6ZTsKKyAgb2Zmc2V0ICs9IENPRkY6OlNlY3Rpb25TaXplICogQXNtLnNpemUoKTsKKworICBIZWFkZXIuTnVtYmVyT2ZTZWN0aW9ucyA9IFNlY3Rpb25zLnNpemUoKTsKKworICBmb3IgKE1DQXNzZW1ibGVyOjpjb25zdF9pdGVyYXRvciBpID0gQXNtLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBBc20uZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gZTsgaSsrKSB7CisgICAgQ09GRlNlY3Rpb24gKlNlYyA9IFNlY3Rpb25NYXBbaV07CisKKyAgICBTZWMtPkhlYWRlci5TaXplT2ZSYXdEYXRhID0gTGF5b3V0LmdldFNlY3Rpb25GaWxlU2l6ZShpKTsKKworICAgIGlmIChFeHBvcnRTZWN0aW9uKFNlYykpIHsKKyAgICAgIFNlYy0+SGVhZGVyLlBvaW50ZXJUb1Jhd0RhdGEgPSBvZmZzZXQ7CisKKyAgICAgIG9mZnNldCArPSBTZWMtPkhlYWRlci5TaXplT2ZSYXdEYXRhOworICAgIH0KKworICAgIGlmIChTZWMtPlJlbG9jYXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIFNlYy0+SGVhZGVyLk51bWJlck9mUmVsb2NhdGlvbnMgPSBTZWMtPlJlbG9jYXRpb25zLnNpemUoKTsKKyAgICAgIFNlYy0+SGVhZGVyLlBvaW50ZXJUb1JlbG9jYXRpb25zID0gb2Zmc2V0OworCisgICAgICBvZmZzZXQgKz0gQ09GRjo6UmVsb2NhdGlvblNpemUgKiBTZWMtPlJlbG9jYXRpb25zLnNpemUoKTsKKworICAgICAgZm9yIChyZWxvY2F0aW9uczo6aXRlcmF0b3IgY3IgPSBTZWMtPlJlbG9jYXRpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlciA9IFNlYy0+UmVsb2NhdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjciAhPSBlcjsgY3IrKykgeworICAgICAgICAoKmNyKS5EYXRhLlN5bWJvbFRhYmxlSW5kZXggPSAoKmNyKS5TeW1iLT5JbmRleDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoU2VjLT5TeW1iLT5BdXguc2l6ZSgpID09IDEgJiYgIlNlY3Rpb24ncyBzeW1ib2wgbXVzdCBoYXZlIG9uZSBhdXghIik7CisgICAgQXV4U3ltYm9sICZBdXggPSBTZWMtPlN5bWItPkF1eFswXTsKKyAgICBhc3NlcnQoQXV4LkF1eFR5cGUgPT0gQVRTZWN0aW9uRGVmaW5pdGlvbiAmJgorICAgICAgICAgICAiU2VjdGlvbidzIHN5bWJvbCdzIGF1eCBzeW1ib2wgbXVzdCBiZSBhIFNlY3Rpb24gRGVmaW5pdGlvbiEiKTsKKyAgICBBdXguQXV4LlNlY3Rpb25EZWZpbml0aW9uLkxlbmd0aCA9IFNlYy0+SGVhZGVyLlNpemVPZlJhd0RhdGE7CisgICAgQXV4LkF1eC5TZWN0aW9uRGVmaW5pdGlvbi5OdW1iZXJPZlJlbG9jYXRpb25zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYy0+SGVhZGVyLk51bWJlck9mUmVsb2NhdGlvbnM7CisgICAgQXV4LkF1eC5TZWN0aW9uRGVmaW5pdGlvbi5OdW1iZXJPZkxpbmVudW1iZXJzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYy0+SGVhZGVyLk51bWJlck9mTGluZU51bWJlcnM7CisgIH0KKworICBIZWFkZXIuUG9pbnRlclRvU3ltYm9sVGFibGUgPSBvZmZzZXQ7CisKKyAgSGVhZGVyLlRpbWVEYXRlU3RhbXAgPSBzeXM6OlRpbWVWYWx1ZTo6bm93KCkudG9FcG9jaFRpbWUoKTsKKworICAvLyBXcml0ZSBpdCBhbGwgdG8gZGlzay4uLgorICBXcml0ZUZpbGVIZWFkZXIoSGVhZGVyKTsKKworICB7CisgICAgc2VjdGlvbnM6Oml0ZXJhdG9yIGksIGllOworICAgIE1DQXNzZW1ibGVyOjpjb25zdF9pdGVyYXRvciBqLCBqZTsKKworICAgIGZvciAoaSA9IFNlY3Rpb25zLmJlZ2luKCksIGllID0gU2VjdGlvbnMuZW5kKCk7IGkgIT0gaWU7IGkrKykKKyAgICAgIFdyaXRlU2VjdGlvbkhlYWRlcigoKmkpLT5IZWFkZXIpOworCisgICAgZm9yIChpID0gU2VjdGlvbnMuYmVnaW4oKSwgaWUgPSBTZWN0aW9ucy5lbmQoKSwKKyAgICAgICAgIGogPSBBc20uYmVnaW4oKSwgamUgPSBBc20uZW5kKCk7CisgICAgICAgICAoaSAhPSBpZSkgJiYgKGogIT0gamUpOyBpKyssIGorKykgeworICAgICAgaWYgKCgqaSktPkhlYWRlci5Qb2ludGVyVG9SYXdEYXRhICE9IDApIHsKKyAgICAgICAgYXNzZXJ0KE9TLnRlbGwoKSA9PSAoKmkpLT5IZWFkZXIuUG9pbnRlclRvUmF3RGF0YSAmJgorICAgICAgICAgICAgICAgIlNlY3Rpb246OlBvaW50ZXJUb1Jhd0RhdGEgaXMgaW5zYW5lISIpOworCisgICAgICAgIEFzbS5Xcml0ZVNlY3Rpb25EYXRhKGosIExheW91dCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGlmICgoKmkpLT5SZWxvY2F0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgIGFzc2VydChPUy50ZWxsKCkgPT0gKCppKS0+SGVhZGVyLlBvaW50ZXJUb1JlbG9jYXRpb25zICYmCisgICAgICAgICAgICAgICAiU2VjdGlvbjo6UG9pbnRlclRvUmVsb2NhdGlvbnMgaXMgaW5zYW5lISIpOworCisgICAgICAgIGZvciAocmVsb2NhdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGsgPSAoKmkpLT5SZWxvY2F0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZSA9ICgqaSktPlJlbG9jYXRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrICE9IGtlOyBrKyspIHsKKyAgICAgICAgICBXcml0ZVJlbG9jYXRpb24oay0+RGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZQorICAgICAgICBhc3NlcnQoKCppKS0+SGVhZGVyLlBvaW50ZXJUb1JlbG9jYXRpb25zID09IDAgJiYKKyAgICAgICAgICAgICAgICJTZWN0aW9uOjpQb2ludGVyVG9SZWxvY2F0aW9ucyBpcyBpbnNhbmUhIik7CisgICAgfQorICB9CisKKyAgYXNzZXJ0KE9TLnRlbGwoKSA9PSBIZWFkZXIuUG9pbnRlclRvU3ltYm9sVGFibGUgJiYKKyAgICAgICAgICJIZWFkZXI6OlBvaW50ZXJUb1N5bWJvbFRhYmxlIGlzIGluc2FuZSEiKTsKKworICBmb3IgKHN5bWJvbHM6Oml0ZXJhdG9yIGkgPSBTeW1ib2xzLmJlZ2luKCksIGUgPSBTeW1ib2xzLmVuZCgpOyBpICE9IGU7IGkrKykKKyAgICBXcml0ZVN5bWJvbCgqaSk7CisKKyAgT1Mud3JpdGUoKGNoYXIgY29uc3QgKikmU3RyaW5ncy5EYXRhLmZyb250KCksIFN0cmluZ3MuRGF0YS5zaXplKCkpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2luQ09GRk9iamVjdFdyaXRlciBmYWN0b3J5IGZ1bmN0aW9uCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgTUNPYmplY3RXcml0ZXIgKmNyZWF0ZVdpbkNPRkZPYmplY3RXcml0ZXIocmF3X29zdHJlYW0gJk9TKSB7CisgICAgcmV0dXJuIG5ldyBXaW5DT0ZGT2JqZWN0V3JpdGVyKE9TKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL01DL1dpbkNPRkZTdHJlYW1lci5jcHAgYi9zcmMvTExWTS9saWIvTUMvV2luQ09GRlN0cmVhbWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2E1OGRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL01DL1dpbkNPRkZTdHJlYW1lci5jcHAKQEAgLTAsMCArMSwzNDggQEAKKy8vPT09LS0gbGx2bS9NQy9XaW5DT0ZGU3RyZWFtZXIuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgV2luMzIgQ09GRiBvYmplY3QgZmlsZSBzdHJlYW1lci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgIldpbkNPRkZTdHJlYW1lciIKKworI2luY2x1ZGUgImxsdm0vTUMvTUNPYmplY3RTdHJlYW1lci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNzZW1ibGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb2RlRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uQ09GRi5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtQmFja2VuZC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NPRkYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CitjbGFzcyBXaW5DT0ZGU3RyZWFtZXIgOiBwdWJsaWMgTUNPYmplY3RTdHJlYW1lciB7CitwdWJsaWM6CisgIE1DU3ltYm9sIGNvbnN0ICpDdXJTeW1ib2w7CisKKyAgV2luQ09GRlN0cmVhbWVyKE1DQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgIFRhcmdldEFzbUJhY2tlbmQgJlRBQiwKKyAgICAgICAgICAgICAgICAgIE1DQ29kZUVtaXR0ZXIgJkNFLAorICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKKworICB2b2lkIEFkZENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50LCBib29sIEV4dGVybmFsKTsKKworICAvLyBNQ1N0cmVhbWVyIGludGVyZmFjZQorCisgIHZpcnR1YWwgdm9pZCBFbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0QXNzZW1ibGVyRmxhZyhNQ0Fzc2VtYmxlckZsYWcgRmxhZyk7CisgIHZpcnR1YWwgdm9pZCBFbWl0QXNzaWdubWVudChNQ1N5bWJvbCAqU3ltYm9sLCBjb25zdCBNQ0V4cHIgKlZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRTeW1ib2xBdHRyaWJ1dGUoTUNTeW1ib2wgKlN5bWJvbCwgTUNTeW1ib2xBdHRyIEF0dHJpYnV0ZSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0U3ltYm9sRGVzYyhNQ1N5bWJvbCAqU3ltYm9sLCB1bnNpZ25lZCBEZXNjVmFsdWUpOworICB2aXJ0dWFsIHZvaWQgQmVnaW5DT0ZGU3ltYm9sRGVmKE1DU3ltYm9sIGNvbnN0ICpTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgRW1pdENPRkZTeW1ib2xTdG9yYWdlQ2xhc3MoaW50IFN0b3JhZ2VDbGFzcyk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q09GRlN5bWJvbFR5cGUoaW50IFR5cGUpOworICB2aXJ0dWFsIHZvaWQgRW5kQ09GRlN5bWJvbERlZigpOworICB2aXJ0dWFsIHZvaWQgRW1pdEVMRlNpemUoTUNTeW1ib2wgKlN5bWJvbCwgY29uc3QgTUNFeHByICpWYWx1ZSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q29tbW9uU3ltYm9sKE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpOworICB2aXJ0dWFsIHZvaWQgRW1pdExvY2FsQ29tbW9uU3ltYm9sKE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUpOworICB2aXJ0dWFsIHZvaWQgRW1pdFplcm9maWxsKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplLHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpOworICB2aXJ0dWFsIHZvaWQgRW1pdFRCU1NTeW1ib2woY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgdW5zaWduZWQgQnl0ZUFsaWdubWVudCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Qnl0ZXMoU3RyaW5nUmVmIERhdGEsIHVuc2lnbmVkIEFkZHJTcGFjZSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpOworICB2aXJ0dWFsIHZvaWQgRW1pdEdQUmVsMzJWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRWYWx1ZVRvQWxpZ25tZW50KHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQsIGludDY0X3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlU2l6ZSwgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQpOworICB2aXJ0dWFsIHZvaWQgRW1pdENvZGVBbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0KTsKKyAgdmlydHVhbCB2b2lkIEVtaXRWYWx1ZVRvT2Zmc2V0KGNvbnN0IE1DRXhwciAqT2Zmc2V0LCB1bnNpZ25lZCBjaGFyIFZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRGaWxlRGlyZWN0aXZlKFN0cmluZ1JlZiBGaWxlbmFtZSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0RHdhcmZGaWxlRGlyZWN0aXZlKHVuc2lnbmVkIEZpbGVObyxTdHJpbmdSZWYgRmlsZW5hbWUpOworICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAmSW5zdHJ1Y3Rpb24pOworICB2aXJ0dWFsIHZvaWQgRmluaXNoKCk7Cit9OworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZS4KKworV2luQ09GRlN0cmVhbWVyOjpXaW5DT0ZGU3RyZWFtZXIoTUNDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNtQmFja2VuZCAmVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb2RlRW1pdHRlciAmQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpCisgICAgOiBNQ09iamVjdFN0cmVhbWVyKENvbnRleHQsIFRBQiwgT1MsICZDRSkKKyAgICAsIEN1clN5bWJvbChOVUxMKSB7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpBZGRDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnl0ZUFsaWdubWVudCwgYm9vbCBFeHRlcm5hbCkgeworICBhc3NlcnQoIVN5bWJvbC0+aXNJblNlY3Rpb24oKSAmJiAiU3ltYm9sIG11c3Qgbm90IGFscmVhZHkgaGF2ZSBhIHNlY3Rpb24hIik7CisKKyAgc3RkOjpzdHJpbmcgU2VjdGlvbk5hbWUoIi5ic3MkbGlua29uY2UiKTsKKyAgU2VjdGlvbk5hbWUuYXBwZW5kKFN5bWJvbC0+Z2V0TmFtZSgpLmJlZ2luKCksIFN5bWJvbC0+Z2V0TmFtZSgpLmVuZCgpKTsKKworICBNQ1N5bWJvbERhdGEgJlN5bWJvbERhdGEgPSBnZXRBc3NlbWJsZXIoKS5nZXRPckNyZWF0ZVN5bWJvbERhdGEoKlN5bWJvbCk7CisKKyAgdW5zaWduZWQgQ2hhcmFjdGVyaXN0aWNzID0KKyAgICBDT0ZGOjpJTUFHRV9TQ05fTE5LX0NPTURBVCB8CisgICAgQ09GRjo6SU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEgfAorICAgIENPRkY6OklNQUdFX1NDTl9NRU1fUkVBRCB8CisgICAgQ09GRjo6SU1BR0VfU0NOX01FTV9XUklURTsKKworICBpbnQgU2VsZWN0aW9uID0gQ09GRjo6SU1BR0VfQ09NREFUX1NFTEVDVF9MQVJHRVNUOworCisgIGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbiA9IE1DU3RyZWFtZXI6OmdldENvbnRleHQoKS5nZXRDT0ZGU2VjdGlvbigKKyAgICBTZWN0aW9uTmFtZSwgQ2hhcmFjdGVyaXN0aWNzLCBTZWxlY3Rpb24sIFNlY3Rpb25LaW5kOjpnZXRCU1MoKSk7CisKKyAgTUNTZWN0aW9uRGF0YSAmU2VjdGlvbkRhdGEgPSBnZXRBc3NlbWJsZXIoKS5nZXRPckNyZWF0ZVNlY3Rpb25EYXRhKCpTZWN0aW9uKTsKKworICBpZiAoU2VjdGlvbkRhdGEuZ2V0QWxpZ25tZW50KCkgPCBCeXRlQWxpZ25tZW50KQorICAgIFNlY3Rpb25EYXRhLnNldEFsaWdubWVudChCeXRlQWxpZ25tZW50KTsKKworICBTeW1ib2xEYXRhLnNldEV4dGVybmFsKEV4dGVybmFsKTsKKworICBTeW1ib2wtPnNldFNlY3Rpb24oKlNlY3Rpb24pOworCisgIGlmIChCeXRlQWxpZ25tZW50ICE9IDEpCisgICAgICBuZXcgTUNBbGlnbkZyYWdtZW50KEJ5dGVBbGlnbm1lbnQsIDAsIDAsIEJ5dGVBbGlnbm1lbnQsICZTZWN0aW9uRGF0YSk7CisKKyAgU3ltYm9sRGF0YS5zZXRGcmFnbWVudChuZXcgTUNGaWxsRnJhZ21lbnQoMCwgMCwgU2l6ZSwgJlNlY3Rpb25EYXRhKSk7Cit9CisKKy8vIE1DU3RyZWFtZXIgaW50ZXJmYWNlCisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCkgeworICAvLyBUT0RPOiBUaGlzIGlzIGNvcGllZCBhbG1vc3QgZXhhY3RseSBmcm9tIHRoZSBNYWNoT1N0cmVhbWVyLiBDb25zaWRlcgorICAvLyBtZXJnaW5nIGludG8gTUNPYmplY3RTdHJlYW1lcj8KKyAgYXNzZXJ0KFN5bWJvbC0+aXNVbmRlZmluZWQoKSAmJiAiQ2Fubm90IGRlZmluZSBhIHN5bWJvbCB0d2ljZSEiKTsKKyAgYXNzZXJ0KCFTeW1ib2wtPmlzVmFyaWFibGUoKSAmJiAiQ2Fubm90IGVtaXQgYSB2YXJpYWJsZSBzeW1ib2whIik7CisgIGFzc2VydChDdXJTZWN0aW9uICYmICJDYW5ub3QgZW1pdCBiZWZvcmUgc2V0dGluZyBzZWN0aW9uISIpOworCisgIFN5bWJvbC0+c2V0U2VjdGlvbigqQ3VyU2VjdGlvbik7CisKKyAgTUNTeW1ib2xEYXRhICZTRCA9IGdldEFzc2VtYmxlcigpLmdldE9yQ3JlYXRlU3ltYm9sRGF0YSgqU3ltYm9sKTsKKworICAvLyBGSVhNRTogVGhpcyBpcyB3YXN0ZWZ1bCwgd2UgZG9uJ3QgbmVjZXNzYXJpbHkgbmVlZCB0byBjcmVhdGUgYSBkYXRhCisgIC8vIGZyYWdtZW50LiBJbnN0ZWFkLCB3ZSBzaG91bGQgbWFyayB0aGUgc3ltYm9sIGFzIHBvaW50aW5nIGludG8gdGhlIGRhdGEKKyAgLy8gZnJhZ21lbnQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2Ugd2Ugc2hvdWxkIGp1c3QgcXVldWUgdGhlIGxhYmVsIGFuZCBzZXQgaXRzCisgIC8vIGZyYWdtZW50IHBvaW50ZXIgd2hlbiB3ZSBlbWl0IHRoZSBuZXh0IGZyYWdtZW50LgorICBNQ0RhdGFGcmFnbWVudCAqRiA9IGdldE9yQ3JlYXRlRGF0YUZyYWdtZW50KCk7CisgIGFzc2VydCghU0QuZ2V0RnJhZ21lbnQoKSAmJiAiVW5leHBlY3RlZCBmcmFnbWVudCBvbiBzeW1ib2wgZGF0YSEiKTsKKyAgU0Quc2V0RnJhZ21lbnQoRik7CisgIFNELnNldE9mZnNldChGLT5nZXRDb250ZW50cygpLnNpemUoKSk7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0QXNzZW1ibGVyRmxhZyhNQ0Fzc2VtYmxlckZsYWcgRmxhZykgeworICBsbHZtX3VucmVhY2hhYmxlKCJub3QgaW1wbGVtZW50ZWQiKTsKK30KKwordm9pZCBXaW5DT0ZGU3RyZWFtZXI6OkVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIHsKKyAgLy8gVE9ETzogVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIE1hY2hPU3RyZWFtZXIuIENvbnNpZGVyIG1lcmdpbmcgaW50bworICAvLyBNQ09iamVjdFN0cmVhbWVyLgorICBnZXRBc3NlbWJsZXIoKS5nZXRPckNyZWF0ZVN5bWJvbERhdGEoKlN5bWJvbCk7CisgIEFkZFZhbHVlU3ltYm9scyhWYWx1ZSk7CisgIFN5bWJvbC0+c2V0VmFyaWFibGVWYWx1ZShWYWx1ZSk7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0U3ltYm9sQXR0cmlidXRlKE1DU3ltYm9sICpTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbEF0dHIgQXR0cmlidXRlKSB7CisgIHN3aXRjaCAoQXR0cmlidXRlKSB7CisgIGNhc2UgTUNTQV9XZWFrUmVmZXJlbmNlOgorICAgIGdldEFzc2VtYmxlcigpLmdldE9yQ3JlYXRlU3ltYm9sRGF0YSgqU3ltYm9sKS5tb2RpZnlGbGFncygKKyAgICAgIENPRkY6OlNGX1dlYWtSZWZlcmVuY2UsCisgICAgICBDT0ZGOjpTRl9XZWFrUmVmZXJlbmNlKTsKKyAgICBicmVhazsKKworICBjYXNlIE1DU0FfR2xvYmFsOgorICAgIGdldEFzc2VtYmxlcigpLmdldE9yQ3JlYXRlU3ltYm9sRGF0YSgqU3ltYm9sKS5zZXRFeHRlcm5hbCh0cnVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoInVuc3VwcG9ydGVkIGF0dHJpYnV0ZSIpOworICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0U3ltYm9sRGVzYyhNQ1N5bWJvbCAqU3ltYm9sLCB1bnNpZ25lZCBEZXNjVmFsdWUpIHsKKyAgbGx2bV91bnJlYWNoYWJsZSgibm90IGltcGxlbWVudGVkIik7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpCZWdpbkNPRkZTeW1ib2xEZWYoTUNTeW1ib2wgY29uc3QgKlN5bWJvbCkgeworICBhc3NlcnQoQ3VyU3ltYm9sID09IE5VTEwgJiYgIkVuZENPRkZTeW1ib2xEZWYgbXVzdCBiZSBjYWxsZWQgYmV0d2VlbiBjYWxscyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gQmVnaW5DT0ZGU3ltYm9sRGVmISIpOworICBDdXJTeW1ib2wgPSBTeW1ib2w7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0Q09GRlN5bWJvbFN0b3JhZ2VDbGFzcyhpbnQgU3RvcmFnZUNsYXNzKSB7CisgIGFzc2VydChDdXJTeW1ib2wgIT0gTlVMTCAmJiAiQmVnaW5DT0ZGU3ltYm9sRGVmIG11c3QgYmUgY2FsbGVkIGZpcnN0ISIpOworICBhc3NlcnQoKFN0b3JhZ2VDbGFzcyAmIH4weEZGKSA9PSAwICYmICJTdG9yYWdlQ2xhc3MgbXVzdCBvbmx5IGhhdmUgZGF0YSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBmaXJzdCBieXRlISIpOworCisgIGdldEFzc2VtYmxlcigpLmdldE9yQ3JlYXRlU3ltYm9sRGF0YSgqQ3VyU3ltYm9sKS5tb2RpZnlGbGFncygKKyAgICBTdG9yYWdlQ2xhc3MgPDwgQ09GRjo6U0ZfQ2xhc3NTaGlmdCwKKyAgICBDT0ZGOjpTRl9DbGFzc01hc2spOworfQorCit2b2lkIFdpbkNPRkZTdHJlYW1lcjo6RW1pdENPRkZTeW1ib2xUeXBlKGludCBUeXBlKSB7CisgIGFzc2VydChDdXJTeW1ib2wgIT0gTlVMTCAmJiAiQmVnaW5DT0ZGU3ltYm9sRGVmIG11c3QgYmUgY2FsbGVkIGZpcnN0ISIpOworICBhc3NlcnQoKFR5cGUgJiB+MHhGRkZGKSA9PSAwICYmICJUeXBlIG11c3Qgb25seSBoYXZlIGRhdGEgaW4gdGhlIGZpcnN0IDIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyIpOworCisgIGdldEFzc2VtYmxlcigpLmdldE9yQ3JlYXRlU3ltYm9sRGF0YSgqQ3VyU3ltYm9sKS5tb2RpZnlGbGFncygKKyAgICBUeXBlIDw8IENPRkY6OlNGX1R5cGVTaGlmdCwKKyAgICBDT0ZGOjpTRl9UeXBlTWFzayk7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbmRDT0ZGU3ltYm9sRGVmKCkgeworICBhc3NlcnQoQ3VyU3ltYm9sICE9IE5VTEwgJiYgIkJlZ2luQ09GRlN5bWJvbERlZiBtdXN0IGJlIGNhbGxlZCBmaXJzdCEiKTsKKyAgQ3VyU3ltYm9sID0gTlVMTDsKK30KKwordm9pZCBXaW5DT0ZGU3RyZWFtZXI6OkVtaXRFTEZTaXplKE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIHsKKyAgbGx2bV91bnJlYWNoYWJsZSgibm90IGltcGxlbWVudGVkIik7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0Q29tbW9uU3ltYm9sKE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSB7CisgIEFkZENvbW1vblN5bWJvbChTeW1ib2wsIFNpemUsIEJ5dGVBbGlnbm1lbnQsIHRydWUpOworfQorCit2b2lkIFdpbkNPRkZTdHJlYW1lcjo6RW1pdExvY2FsQ29tbW9uU3ltYm9sKE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUpIHsKKyAgQWRkQ29tbW9uU3ltYm9sKFN5bWJvbCwgU2l6ZSwgMSwgZmFsc2UpOworfQorCit2b2lkIFdpbkNPRkZTdHJlYW1lcjo6RW1pdFplcm9maWxsKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSx1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSB7CisgIGxsdm1fdW5yZWFjaGFibGUoIm5vdCBpbXBsZW1lbnRlZCIpOworfQorCit2b2lkIFdpbkNPRkZTdHJlYW1lcjo6RW1pdFRCU1NTeW1ib2woY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIHsKKyAgbGx2bV91bnJlYWNoYWJsZSgibm90IGltcGxlbWVudGVkIik7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0Qnl0ZXMoU3RyaW5nUmVmIERhdGEsIHVuc2lnbmVkIEFkZHJTcGFjZSkgeworICAvLyBUT0RPOiBUaGlzIGlzIGNvcGllZCBleGFjdGx5IGZyb20gdGhlIE1hY2hPU3RyZWFtZXIuIENvbnNpZGVyIG1lcmdpbmcgaW50bworICAvLyBNQ09iamVjdFN0cmVhbWVyPworICBnZXRPckNyZWF0ZURhdGFGcmFnbWVudCgpLT5nZXRDb250ZW50cygpLmFwcGVuZChEYXRhLmJlZ2luKCksIERhdGEuZW5kKCkpOworfQorCit2b2lkIFdpbkNPRkZTdHJlYW1lcjo6RW1pdFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgeworICBhc3NlcnQoQWRkclNwYWNlID09IDAgJiYgIkFkZHJlc3Mgc3BhY2UgbXVzdCBiZSAwISIpOworCisgIC8vIFRPRE86IFRoaXMgaXMgY29waWVkIGV4YWN0bHkgZnJvbSB0aGUgTWFjaE9TdHJlYW1lci4gQ29uc2lkZXIgbWVyZ2luZyBpbnRvCisgIC8vIE1DT2JqZWN0U3RyZWFtZXI/CisgIE1DRGF0YUZyYWdtZW50ICpERiA9IGdldE9yQ3JlYXRlRGF0YUZyYWdtZW50KCk7CisKKyAgLy8gQXZvaWQgZml4dXBzIHdoZW4gcG9zc2libGUuCisgIGludDY0X3QgQWJzVmFsdWU7CisgIGlmIChBZGRWYWx1ZVN5bWJvbHMoVmFsdWUpLT5FdmFsdWF0ZUFzQWJzb2x1dGUoQWJzVmFsdWUpKSB7CisgICAgLy8gRklYTUU6IEVuZGlhbm5lc3MgYXNzdW1wdGlvbi4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFNpemU7ICsraSkKKyAgICAgIERGLT5nZXRDb250ZW50cygpLnB1c2hfYmFjayh1aW50OF90KEFic1ZhbHVlID4+IChpICogOCkpKTsKKyAgfSBlbHNlIHsKKyAgICBERi0+YWRkRml4dXAoTUNGaXh1cDo6Q3JlYXRlKERGLT5nZXRDb250ZW50cygpLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFZhbHVlU3ltYm9scyhWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0ZpeHVwOjpnZXRLaW5kRm9yU2l6ZShTaXplKSkpOworICAgIERGLT5nZXRDb250ZW50cygpLnJlc2l6ZShERi0+Z2V0Q29udGVudHMoKS5zaXplKCkgKyBTaXplLCAwKTsKKyAgfQorfQorCit2b2lkIFdpbkNPRkZTdHJlYW1lcjo6RW1pdEdQUmVsMzJWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKSB7CisgIGxsdm1fdW5yZWFjaGFibGUoIm5vdCBpbXBsZW1lbnRlZCIpOworfQorCit2b2lkIFdpbkNPRkZTdHJlYW1lcjo6RW1pdFZhbHVlVG9BbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhCeXRlc1RvRW1pdCkgeworICAvLyBUT0RPOiBUaGlzIGlzIGNvcGllZCBleGFjdGx5IGZyb20gdGhlIE1hY2hPU3RyZWFtZXIuIENvbnNpZGVyIG1lcmdpbmcgaW50bworICAvLyBNQ09iamVjdFN0cmVhbWVyPworICBpZiAoTWF4Qnl0ZXNUb0VtaXQgPT0gMCkKKyAgICBNYXhCeXRlc1RvRW1pdCA9IEJ5dGVBbGlnbm1lbnQ7CisgIG5ldyBNQ0FsaWduRnJhZ21lbnQoQnl0ZUFsaWdubWVudCwgVmFsdWUsIFZhbHVlU2l6ZSwgTWF4Qnl0ZXNUb0VtaXQsCisgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCkpOworCisgIC8vIFVwZGF0ZSB0aGUgbWF4aW11bSBhbGlnbm1lbnQgb24gdGhlIGN1cnJlbnQgc2VjdGlvbiBpZiBuZWNlc3NhcnkuCisgIGlmIChCeXRlQWxpZ25tZW50ID4gZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCktPmdldEFsaWdubWVudCgpKQorICAgIGdldEN1cnJlbnRTZWN0aW9uRGF0YSgpLT5zZXRBbGlnbm1lbnQoQnl0ZUFsaWdubWVudCk7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0Q29kZUFsaWdubWVudCh1bnNpZ25lZCBCeXRlQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0KSB7CisgIC8vIFRPRE86IFRoaXMgaXMgY29waWVkIGV4YWN0bHkgZnJvbSB0aGUgTWFjaE9TdHJlYW1lci4gQ29uc2lkZXIgbWVyZ2luZyBpbnRvCisgIC8vIE1DT2JqZWN0U3RyZWFtZXI/CisgIGlmIChNYXhCeXRlc1RvRW1pdCA9PSAwKQorICAgIE1heEJ5dGVzVG9FbWl0ID0gQnl0ZUFsaWdubWVudDsKKyAgTUNBbGlnbkZyYWdtZW50ICpGID0gbmV3IE1DQWxpZ25GcmFnbWVudChCeXRlQWxpZ25tZW50LCAwLCAxLCBNYXhCeXRlc1RvRW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50U2VjdGlvbkRhdGEoKSk7CisgIEYtPnNldEVtaXROb3BzKHRydWUpOworCisgIC8vIFVwZGF0ZSB0aGUgbWF4aW11bSBhbGlnbm1lbnQgb24gdGhlIGN1cnJlbnQgc2VjdGlvbiBpZiBuZWNlc3NhcnkuCisgIGlmIChCeXRlQWxpZ25tZW50ID4gZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCktPmdldEFsaWdubWVudCgpKQorICAgIGdldEN1cnJlbnRTZWN0aW9uRGF0YSgpLT5zZXRBbGlnbm1lbnQoQnl0ZUFsaWdubWVudCk7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0VmFsdWVUb09mZnNldChjb25zdCBNQ0V4cHIgKk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFZhbHVlKSB7CisgIGxsdm1fdW5yZWFjaGFibGUoIm5vdCBpbXBsZW1lbnRlZCIpOworfQorCit2b2lkIFdpbkNPRkZTdHJlYW1lcjo6RW1pdEZpbGVEaXJlY3RpdmUoU3RyaW5nUmVmIEZpbGVuYW1lKSB7CisgIC8vIElnbm9yZSBmb3Igbm93LCBsaW5rZXJzIGRvbid0IGNhcmUsIGFuZCBwcm9wZXIgZGVidWcKKyAgLy8gaW5mbyB3aWxsIGJlIGEgbXVjaCBsYXJnZSBlZmZvcnQuCit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpFbWl0RHdhcmZGaWxlRGlyZWN0aXZlKHVuc2lnbmVkIEZpbGVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlbmFtZSkgeworICBsbHZtX3VucmVhY2hhYmxlKCJub3QgaW1wbGVtZW50ZWQiKTsKK30KKwordm9pZCBXaW5DT0ZGU3RyZWFtZXI6OkVtaXRJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgJkluc3RydWN0aW9uKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbnN0cnVjdGlvbi5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoSW5zdHJ1Y3Rpb24uZ2V0T3BlcmFuZChpKS5pc0V4cHIoKSkKKyAgICAgIEFkZFZhbHVlU3ltYm9scyhJbnN0cnVjdGlvbi5nZXRPcGVyYW5kKGkpLmdldEV4cHIoKSk7CisKKyAgZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCktPnNldEhhc0luc3RydWN0aW9ucyh0cnVlKTsKKworICBNQ0luc3RGcmFnbWVudCAqRnJhZ21lbnQgPQorICAgIG5ldyBNQ0luc3RGcmFnbWVudChJbnN0cnVjdGlvbiwgZ2V0Q3VycmVudFNlY3Rpb25EYXRhKCkpOworCisgIHJhd19zdmVjdG9yX29zdHJlYW0gVmVjT1MoRnJhZ21lbnQtPmdldENvZGUoKSk7CisKKyAgZ2V0QXNzZW1ibGVyKCkuZ2V0RW1pdHRlcigpLkVuY29kZUluc3RydWN0aW9uKEluc3RydWN0aW9uLCBWZWNPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50LT5nZXRGaXh1cHMoKSk7Cit9CisKK3ZvaWQgV2luQ09GRlN0cmVhbWVyOjpGaW5pc2goKSB7CisgIE1DT2JqZWN0U3RyZWFtZXI6OkZpbmlzaCgpOworfQorCituYW1lc3BhY2UgbGx2bQoreworICBNQ1N0cmVhbWVyICpjcmVhdGVXaW5DT0ZGU3RyZWFtZXIoTUNDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNtQmFja2VuZCAmVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb2RlRW1pdHRlciAmQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlbGF4QWxsKSB7CisgICAgV2luQ09GRlN0cmVhbWVyICpTID0gbmV3IFdpbkNPRkZTdHJlYW1lcihDb250ZXh0LCBUQUIsIENFLCBPUyk7CisgICAgUy0+Z2V0QXNzZW1ibGVyKCkuc2V0UmVsYXhBbGwoUmVsYXhBbGwpOworICAgIHJldHVybiBTOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwN2YzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjIz09PS0gbGliL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZworCitQQVJBTExFTF9ESVJTIDo9IFZNQ29yZSBBc21QYXJzZXIgQml0Y29kZSBBcmNoaXZlIEFuYWx5c2lzIFRyYW5zZm9ybXMgQ29kZUdlbiBcCisgICAgICAgICAgICAgICAgVGFyZ2V0IEV4ZWN1dGlvbkVuZ2luZSBMaW5rZXIgTUMgQ29tcGlsZXJEcml2ZXIKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvQVBGbG9hdC5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9BUEZsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc4NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvQVBGbG9hdC5jcHAKQEAgLTAsMCArMSwzNTYyIEBACisvLz09PS0tIEFQRmxvYXQuY3BwIC0gSW1wbGVtZW50IEFQRmxvYXQgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgY2xhc3MgdG8gcmVwcmVzZW50IGFyYml0cmFyeSBwcmVjaXNpb24gZmxvYXRpbmcKKy8vIHBvaW50IHZhbHVlcyBhbmQgcHJvdmlkZSBhIHZhcmlldHkgb2YgYXJpdGhtZXRpYyBvcGVyYXRpb25zIG9uIHRoZW0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQURUL0FQRmxvYXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisjZGVmaW5lIGNvbnZvbHZlKGxocywgcmhzKSAoKGxocykgKiA0ICsgKHJocykpCisKKy8qIEFzc3VtZWQgaW4gaGV4YWRlY2ltYWwgc2lnbmlmaWNhbmQgcGFyc2luZywgYW5kIGNvbnZlcnNpb24gdG8KKyAgIGhleGFkZWNpbWFsIHN0cmluZ3MuICAqLworI2RlZmluZSBDT01QSUxFX1RJTUVfQVNTRVJUKGNvbmQpIGV4dGVybiBpbnQgQ1RBc3NlcnRbKGNvbmQpID8gMSA6IC0xXQorQ09NUElMRV9USU1FX0FTU0VSVChpbnRlZ2VyUGFydFdpZHRoICUgNCA9PSAwKTsKKworbmFtZXNwYWNlIGxsdm0geworCisgIC8qIFJlcHJlc2VudHMgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBzZW1hbnRpY3MuICAqLworICBzdHJ1Y3QgZmx0U2VtYW50aWNzIHsKKyAgICAvKiBUaGUgbGFyZ2VzdCBFIHN1Y2ggdGhhdCAyXkUgaXMgcmVwcmVzZW50YWJsZTsgdGhpcyBtYXRjaGVzIHRoZQorICAgICAgIGRlZmluaXRpb24gb2YgSUVFRSA3NTQuICAqLworICAgIGV4cG9uZW50X3QgbWF4RXhwb25lbnQ7CisKKyAgICAvKiBUaGUgc21hbGxlc3QgRSBzdWNoIHRoYXQgMl5FIGlzIGEgbm9ybWFsaXplZCBudW1iZXI7IHRoaXMKKyAgICAgICBtYXRjaGVzIHRoZSBkZWZpbml0aW9uIG9mIElFRUUgNzU0LiAgKi8KKyAgICBleHBvbmVudF90IG1pbkV4cG9uZW50OworCisgICAgLyogTnVtYmVyIG9mIGJpdHMgaW4gdGhlIHNpZ25pZmljYW5kLiAgVGhpcyBpbmNsdWRlcyB0aGUgaW50ZWdlcgorICAgICAgIGJpdC4gICovCisgICAgdW5zaWduZWQgaW50IHByZWNpc2lvbjsKKworICAgIC8qIFRydWUgaWYgYXJpdGhtZXRpYyBpcyBzdXBwb3J0ZWQuICAqLworICAgIHVuc2lnbmVkIGludCBhcml0aG1ldGljT0s7CisgIH07CisKKyAgY29uc3QgZmx0U2VtYW50aWNzIEFQRmxvYXQ6OklFRUVoYWxmID0geyAxNSwgLTE0LCAxMSwgdHJ1ZSB9OworICBjb25zdCBmbHRTZW1hbnRpY3MgQVBGbG9hdDo6SUVFRXNpbmdsZSA9IHsgMTI3LCAtMTI2LCAyNCwgdHJ1ZSB9OworICBjb25zdCBmbHRTZW1hbnRpY3MgQVBGbG9hdDo6SUVFRWRvdWJsZSA9IHsgMTAyMywgLTEwMjIsIDUzLCB0cnVlIH07CisgIGNvbnN0IGZsdFNlbWFudGljcyBBUEZsb2F0OjpJRUVFcXVhZCA9IHsgMTYzODMsIC0xNjM4MiwgMTEzLCB0cnVlIH07CisgIGNvbnN0IGZsdFNlbWFudGljcyBBUEZsb2F0Ojp4ODdEb3VibGVFeHRlbmRlZCA9IHsgMTYzODMsIC0xNjM4MiwgNjQsIHRydWUgfTsKKyAgY29uc3QgZmx0U2VtYW50aWNzIEFQRmxvYXQ6OkJvZ3VzID0geyAwLCAwLCAwLCB0cnVlIH07CisKKyAgLy8gVGhlIFBvd2VyUEMgZm9ybWF0IGNvbnNpc3RzIG9mIHR3byBkb3VibGVzLiAgSXQgZG9lcyBub3QgbWFwIGNsZWFubHkKKyAgLy8gb250byB0aGUgdXN1YWwgZm9ybWF0IGFib3ZlLiAgRm9yIG5vdyBvbmx5IHN0b3JhZ2Ugb2YgY29uc3RhbnRzIG9mCisgIC8vIHRoaXMgdHlwZSBpcyBzdXBwb3J0ZWQsIG5vIGFyaXRobWV0aWMuCisgIGNvbnN0IGZsdFNlbWFudGljcyBBUEZsb2F0OjpQUENEb3VibGVEb3VibGUgPSB7IDEwMjMsIC0xMDIyLCAxMDYsIGZhbHNlIH07CisKKyAgLyogQSB0aWdodCB1cHBlciBib3VuZCBvbiBudW1iZXIgb2YgcGFydHMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgdmFsdWUKKyAgICAgcG93KDUsIHBvd2VyKSBpcworCisgICAgICAgcG93ZXIgKiA4MTUgLyAoMzUxICogaW50ZWdlclBhcnRXaWR0aCkgKyAxCisKKyAgICAgSG93ZXZlciwgd2hpbHN0IHRoZSByZXN1bHQgbWF5IHJlcXVpcmUgb25seSB0aGlzIG1hbnkgcGFydHMsCisgICAgIGJlY2F1c2Ugd2UgYXJlIG11bHRpcGx5aW5nIHR3byB2YWx1ZXMgdG8gZ2V0IGl0LCB0aGUKKyAgICAgbXVsdGlwbGljYXRpb24gbWF5IHJlcXVpcmUgYW4gZXh0cmEgcGFydCB3aXRoIHRoZSBleGNlc3MgcGFydAorICAgICBiZWluZyB6ZXJvIChjb25zaWRlciB0aGUgdHJpdmlhbCBjYXNlIG9mIDEgKiAxLCB0Y0Z1bGxNdWx0aXBseQorICAgICByZXF1aXJlcyB0d28gcGFydHMgdG8gaG9sZCB0aGUgc2luZ2xlLXBhcnQgcmVzdWx0KS4gIFNvIHdlIGFkZCBhbgorICAgICBleHRyYSBvbmUgdG8gZ3VhcmFudGVlIGVub3VnaCBzcGFjZSB3aGlsc3QgbXVsdGlwbHlpbmcuICAqLworICBjb25zdCB1bnNpZ25lZCBpbnQgbWF4RXhwb25lbnQgPSAxNjM4MzsKKyAgY29uc3QgdW5zaWduZWQgaW50IG1heFByZWNpc2lvbiA9IDExMzsKKyAgY29uc3QgdW5zaWduZWQgaW50IG1heFBvd2VyT2ZGaXZlRXhwb25lbnQgPSBtYXhFeHBvbmVudCArIG1heFByZWNpc2lvbiAtIDE7CisgIGNvbnN0IHVuc2lnbmVkIGludCBtYXhQb3dlck9mRml2ZVBhcnRzID0gMiArICgobWF4UG93ZXJPZkZpdmVFeHBvbmVudCAqIDgxNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKDM1MSAqIGludGVnZXJQYXJ0V2lkdGgpKTsKK30KKworLyogQSBidW5jaCBvZiBwcml2YXRlLCBoYW5keSByb3V0aW5lcy4gICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitwYXJ0Q291bnRGb3JCaXRzKHVuc2lnbmVkIGludCBiaXRzKQoreworICByZXR1cm4gKChiaXRzKSArIGludGVnZXJQYXJ0V2lkdGggLSAxKSAvIGludGVnZXJQYXJ0V2lkdGg7Cit9CisKKy8qIFJldHVybnMgMFUtOVUuICBSZXR1cm4gdmFsdWVzID49IDEwVSBhcmUgbm90IGRpZ2l0cy4gICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorZGVjRGlnaXRWYWx1ZSh1bnNpZ25lZCBpbnQgYykKK3sKKyAgcmV0dXJuIGMgLSAnMCc7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2hleERpZ2l0VmFsdWUodW5zaWduZWQgaW50IGMpCit7CisgIHVuc2lnbmVkIGludCByOworCisgIHIgPSBjIC0gJzAnOworICBpZiAociA8PSA5KQorICAgIHJldHVybiByOworCisgIHIgPSBjIC0gJ0EnOworICBpZiAociA8PSA1KQorICAgIHJldHVybiByICsgMTA7CisKKyAgciA9IGMgLSAnYSc7CisgIGlmIChyIDw9IDUpCisgICAgcmV0dXJuIHIgKyAxMDsKKworICByZXR1cm4gLTFVOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2Fzc2VydEFyaXRobWV0aWNPSyhjb25zdCBsbHZtOjpmbHRTZW1hbnRpY3MgJnNlbWFudGljcykgeworICBhc3NlcnQoc2VtYW50aWNzLmFyaXRobWV0aWNPSyAmJgorICAgICAgICAgIkNvbXBpbGUtdGltZSBhcml0aG1ldGljIGRvZXMgbm90IHN1cHBvcnQgdGhlc2Ugc2VtYW50aWNzIik7Cit9CisKKy8qIFJldHVybiB0aGUgdmFsdWUgb2YgYSBkZWNpbWFsIGV4cG9uZW50IG9mIHRoZSBmb3JtCisgICBbKy1dZGRkZGRkZC4KKworICAgSWYgdGhlIGV4cG9uZW50IG92ZXJmbG93cywgcmV0dXJucyBhIGxhcmdlIGV4cG9uZW50IHdpdGggdGhlCisgICBhcHByb3ByaWF0ZSBzaWduLiAgKi8KK3N0YXRpYyBpbnQKK3JlYWRFeHBvbmVudChTdHJpbmdSZWY6Oml0ZXJhdG9yIGJlZ2luLCBTdHJpbmdSZWY6Oml0ZXJhdG9yIGVuZCkKK3sKKyAgYm9vbCBpc05lZ2F0aXZlOworICB1bnNpZ25lZCBpbnQgYWJzRXhwb25lbnQ7CisgIGNvbnN0IHVuc2lnbmVkIGludCBvdmVybGFyZ2VFeHBvbmVudCA9IDI0MDAwOyAgLyogRklYTUUuICAqLworICBTdHJpbmdSZWY6Oml0ZXJhdG9yIHAgPSBiZWdpbjsKKworICBhc3NlcnQocCAhPSBlbmQgJiYgIkV4cG9uZW50IGhhcyBubyBkaWdpdHMiKTsKKworICBpc05lZ2F0aXZlID0gKCpwID09ICctJyk7CisgIGlmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSB7CisgICAgcCsrOworICAgIGFzc2VydChwICE9IGVuZCAmJiAiRXhwb25lbnQgaGFzIG5vIGRpZ2l0cyIpOworICB9CisKKyAgYWJzRXhwb25lbnQgPSBkZWNEaWdpdFZhbHVlKCpwKyspOworICBhc3NlcnQoYWJzRXhwb25lbnQgPCAxMFUgJiYgIkludmFsaWQgY2hhcmFjdGVyIGluIGV4cG9uZW50Iik7CisKKyAgZm9yICg7IHAgIT0gZW5kOyArK3ApIHsKKyAgICB1bnNpZ25lZCBpbnQgdmFsdWU7CisKKyAgICB2YWx1ZSA9IGRlY0RpZ2l0VmFsdWUoKnApOworICAgIGFzc2VydCh2YWx1ZSA8IDEwVSAmJiAiSW52YWxpZCBjaGFyYWN0ZXIgaW4gZXhwb25lbnQiKTsKKworICAgIHZhbHVlICs9IGFic0V4cG9uZW50ICogMTA7CisgICAgaWYgKGFic0V4cG9uZW50ID49IG92ZXJsYXJnZUV4cG9uZW50KSB7CisgICAgICBhYnNFeHBvbmVudCA9IG92ZXJsYXJnZUV4cG9uZW50OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGFic0V4cG9uZW50ID0gdmFsdWU7CisgIH0KKworICBhc3NlcnQocCA9PSBlbmQgJiYgIkludmFsaWQgZXhwb25lbnQgaW4gZXhwb25lbnQiKTsKKworICBpZiAoaXNOZWdhdGl2ZSkKKyAgICByZXR1cm4gLShpbnQpIGFic0V4cG9uZW50OworICBlbHNlCisgICAgcmV0dXJuIChpbnQpIGFic0V4cG9uZW50OworfQorCisvKiBUaGlzIGlzIHVnbHkgYW5kIG5lZWRzIGNsZWFuaW5nIHVwLCBidXQgSSBkb24ndCBpbW1lZGlhdGVseSBzZWUKKyAgIGhvdyB3aGlsc3QgcmVtYWluaW5nIHNhZmUuICAqLworc3RhdGljIGludAordG90YWxFeHBvbmVudChTdHJpbmdSZWY6Oml0ZXJhdG9yIHAsIFN0cmluZ1JlZjo6aXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICBpbnQgZXhwb25lbnRBZGp1c3RtZW50KQoreworICBpbnQgdW5zaWduZWRFeHBvbmVudDsKKyAgYm9vbCBuZWdhdGl2ZSwgb3ZlcmZsb3c7CisgIGludCBleHBvbmVudDsKKworICBhc3NlcnQocCAhPSBlbmQgJiYgIkV4cG9uZW50IGhhcyBubyBkaWdpdHMiKTsKKworICBuZWdhdGl2ZSA9ICpwID09ICctJzsKKyAgaWYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpIHsKKyAgICBwKys7CisgICAgYXNzZXJ0KHAgIT0gZW5kICYmICJFeHBvbmVudCBoYXMgbm8gZGlnaXRzIik7CisgIH0KKworICB1bnNpZ25lZEV4cG9uZW50ID0gMDsKKyAgb3ZlcmZsb3cgPSBmYWxzZTsKKyAgZm9yICg7IHAgIT0gZW5kOyArK3ApIHsKKyAgICB1bnNpZ25lZCBpbnQgdmFsdWU7CisKKyAgICB2YWx1ZSA9IGRlY0RpZ2l0VmFsdWUoKnApOworICAgIGFzc2VydCh2YWx1ZSA8IDEwVSAmJiAiSW52YWxpZCBjaGFyYWN0ZXIgaW4gZXhwb25lbnQiKTsKKworICAgIHVuc2lnbmVkRXhwb25lbnQgPSB1bnNpZ25lZEV4cG9uZW50ICogMTAgKyB2YWx1ZTsKKyAgICBpZiAodW5zaWduZWRFeHBvbmVudCA+IDY1NTM1KQorICAgICAgb3ZlcmZsb3cgPSB0cnVlOworICB9CisKKyAgaWYgKGV4cG9uZW50QWRqdXN0bWVudCA+IDY1NTM1IHx8IGV4cG9uZW50QWRqdXN0bWVudCA8IC02NTUzNikKKyAgICBvdmVyZmxvdyA9IHRydWU7CisKKyAgaWYgKCFvdmVyZmxvdykgeworICAgIGV4cG9uZW50ID0gdW5zaWduZWRFeHBvbmVudDsKKyAgICBpZiAobmVnYXRpdmUpCisgICAgICBleHBvbmVudCA9IC1leHBvbmVudDsKKyAgICBleHBvbmVudCArPSBleHBvbmVudEFkanVzdG1lbnQ7CisgICAgaWYgKGV4cG9uZW50ID4gNjU1MzUgfHwgZXhwb25lbnQgPCAtNjU1MzYpCisgICAgICBvdmVyZmxvdyA9IHRydWU7CisgIH0KKworICBpZiAob3ZlcmZsb3cpCisgICAgZXhwb25lbnQgPSBuZWdhdGl2ZSA/IC02NTUzNjogNjU1MzU7CisKKyAgcmV0dXJuIGV4cG9uZW50OworfQorCitzdGF0aWMgU3RyaW5nUmVmOjppdGVyYXRvcgorc2tpcExlYWRpbmdaZXJvZXNBbmRBbnlEb3QoU3RyaW5nUmVmOjppdGVyYXRvciBiZWdpbiwgU3RyaW5nUmVmOjppdGVyYXRvciBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWY6Oml0ZXJhdG9yICpkb3QpCit7CisgIFN0cmluZ1JlZjo6aXRlcmF0b3IgcCA9IGJlZ2luOworICAqZG90ID0gZW5kOworICB3aGlsZSAoKnAgPT0gJzAnICYmIHAgIT0gZW5kKQorICAgIHArKzsKKworICBpZiAoKnAgPT0gJy4nKSB7CisgICAgKmRvdCA9IHArKzsKKworICAgIGFzc2VydChlbmQgLSBiZWdpbiAhPSAxICYmICJTaWduaWZpY2FuZCBoYXMgbm8gZGlnaXRzIik7CisKKyAgICB3aGlsZSAoKnAgPT0gJzAnICYmIHAgIT0gZW5kKQorICAgICAgcCsrOworICB9CisKKyAgcmV0dXJuIHA7Cit9CisKKy8qIEdpdmVuIGEgbm9ybWFsIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIG9mIHRoZSBmb3JtCisKKyAgICAgZGRkZC5kZGRkW2VFXVsrLV1kZGQKKworICAgd2hlcmUgdGhlIGRlY2ltYWwgcG9pbnQgYW5kIGV4cG9uZW50IGFyZSBvcHRpb25hbCwgZmlsbCBvdXQgdGhlCisgICBzdHJ1Y3R1cmUgRC4gIEV4cG9uZW50IGlzIGFwcHJvcHJpYXRlIGlmIHRoZSBzaWduaWZpY2FuZCBpcworICAgdHJlYXRlZCBhcyBhbiBpbnRlZ2VyLCBhbmQgbm9ybWFsaXplZEV4cG9uZW50IGlmIHRoZSBzaWduaWZpY2FuZAorICAgaXMgdGFrZW4gdG8gaGF2ZSB0aGUgZGVjaW1hbCBwb2ludCBhZnRlciBhIHNpbmdsZSBsZWFkaW5nCisgICBub24temVybyBkaWdpdC4KKworICAgSWYgdGhlIHZhbHVlIGlzIHplcm8sIFYtPmZpcnN0U2lnRGlnaXQgcG9pbnRzIHRvIGEgbm9uLWRpZ2l0LCBhbmQKKyAgIHRoZSByZXR1cm4gZXhwb25lbnQgaXMgemVyby4KKyovCitzdHJ1Y3QgZGVjaW1hbEluZm8geworICBjb25zdCBjaGFyICpmaXJzdFNpZ0RpZ2l0OworICBjb25zdCBjaGFyICpsYXN0U2lnRGlnaXQ7CisgIGludCBleHBvbmVudDsKKyAgaW50IG5vcm1hbGl6ZWRFeHBvbmVudDsKK307CisKK3N0YXRpYyB2b2lkCitpbnRlcnByZXREZWNpbWFsKFN0cmluZ1JlZjo6aXRlcmF0b3IgYmVnaW4sIFN0cmluZ1JlZjo6aXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgICBkZWNpbWFsSW5mbyAqRCkKK3sKKyAgU3RyaW5nUmVmOjppdGVyYXRvciBkb3QgPSBlbmQ7CisgIFN0cmluZ1JlZjo6aXRlcmF0b3IgcCA9IHNraXBMZWFkaW5nWmVyb2VzQW5kQW55RG90IChiZWdpbiwgZW5kLCAmZG90KTsKKworICBELT5maXJzdFNpZ0RpZ2l0ID0gcDsKKyAgRC0+ZXhwb25lbnQgPSAwOworICBELT5ub3JtYWxpemVkRXhwb25lbnQgPSAwOworCisgIGZvciAoOyBwICE9IGVuZDsgKytwKSB7CisgICAgaWYgKCpwID09ICcuJykgeworICAgICAgYXNzZXJ0KGRvdCA9PSBlbmQgJiYgIlN0cmluZyBjb250YWlucyBtdWx0aXBsZSBkb3RzIik7CisgICAgICBkb3QgPSBwKys7CisgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZGVjRGlnaXRWYWx1ZSgqcCkgPj0gMTBVKQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAocCAhPSBlbmQpIHsKKyAgICBhc3NlcnQoKCpwID09ICdlJyB8fCAqcCA9PSAnRScpICYmICJJbnZhbGlkIGNoYXJhY3RlciBpbiBzaWduaWZpY2FuZCIpOworICAgIGFzc2VydChwICE9IGJlZ2luICYmICJTaWduaWZpY2FuZCBoYXMgbm8gZGlnaXRzIik7CisgICAgYXNzZXJ0KChkb3QgPT0gZW5kIHx8IHAgLSBiZWdpbiAhPSAxKSAmJiAiU2lnbmlmaWNhbmQgaGFzIG5vIGRpZ2l0cyIpOworCisgICAgLyogcCBwb2ludHMgdG8gdGhlIGZpcnN0IG5vbi1kaWdpdCBpbiB0aGUgc3RyaW5nICovCisgICAgRC0+ZXhwb25lbnQgPSByZWFkRXhwb25lbnQocCArIDEsIGVuZCk7CisKKyAgICAvKiBJbXBsaWVkIGRlY2ltYWwgcG9pbnQ/ICAqLworICAgIGlmIChkb3QgPT0gZW5kKQorICAgICAgZG90ID0gcDsKKyAgfQorCisgIC8qIElmIG51bWJlciBpcyBhbGwgemVyb2VzIGFjY2VwdCBhbnkgZXhwb25lbnQuICAqLworICBpZiAocCAhPSBELT5maXJzdFNpZ0RpZ2l0KSB7CisgICAgLyogRHJvcCBpbnNpZ25pZmljYW50IHRyYWlsaW5nIHplcm9lcy4gICovCisgICAgaWYgKHAgIT0gYmVnaW4pIHsKKyAgICAgIGRvCisgICAgICAgIGRvCisgICAgICAgICAgcC0tOworICAgICAgICB3aGlsZSAocCAhPSBiZWdpbiAmJiAqcCA9PSAnMCcpOworICAgICAgd2hpbGUgKHAgIT0gYmVnaW4gJiYgKnAgPT0gJy4nKTsKKyAgICB9CisKKyAgICAvKiBBZGp1c3QgdGhlIGV4cG9uZW50cyBmb3IgYW55IGRlY2ltYWwgcG9pbnQuICAqLworICAgIEQtPmV4cG9uZW50ICs9IHN0YXRpY19jYXN0PGV4cG9uZW50X3Q+KChkb3QgLSBwKSAtIChkb3QgPiBwKSk7CisgICAgRC0+bm9ybWFsaXplZEV4cG9uZW50ID0gKEQtPmV4cG9uZW50ICsKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZXhwb25lbnRfdD4oKHAgLSBELT5maXJzdFNpZ0RpZ2l0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChkb3QgPiBELT5maXJzdFNpZ0RpZ2l0ICYmIGRvdCA8IHApKSk7CisgIH0KKworICBELT5sYXN0U2lnRGlnaXQgPSBwOworfQorCisvKiBSZXR1cm4gdGhlIHRyYWlsaW5nIGZyYWN0aW9uIG9mIGEgaGV4YWRlY2ltYWwgbnVtYmVyLgorICAgRElHSVRWQUxVRSBpcyB0aGUgZmlyc3QgaGV4IGRpZ2l0IG9mIHRoZSBmcmFjdGlvbiwgUCBwb2ludHMgdG8KKyAgIHRoZSBuZXh0IGRpZ2l0LiAgKi8KK3N0YXRpYyBsb3N0RnJhY3Rpb24KK3RyYWlsaW5nSGV4YWRlY2ltYWxGcmFjdGlvbihTdHJpbmdSZWY6Oml0ZXJhdG9yIHAsIFN0cmluZ1JlZjo6aXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkaWdpdFZhbHVlKQoreworICB1bnNpZ25lZCBpbnQgaGV4RGlnaXQ7CisKKyAgLyogSWYgdGhlIGZpcnN0IHRyYWlsaW5nIGRpZ2l0IGlzbid0IDAgb3IgOCB3ZSBjYW4gd29yayBvdXQgdGhlCisgICAgIGZyYWN0aW9uIGltbWVkaWF0ZWx5LiAgKi8KKyAgaWYgKGRpZ2l0VmFsdWUgPiA4KQorICAgIHJldHVybiBsZk1vcmVUaGFuSGFsZjsKKyAgZWxzZSBpZiAoZGlnaXRWYWx1ZSA8IDggJiYgZGlnaXRWYWx1ZSA+IDApCisgICAgcmV0dXJuIGxmTGVzc1RoYW5IYWxmOworCisgIC8qIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGZpbmQgdGhlIGZpcnN0IG5vbi16ZXJvIGRpZ2l0LiAgKi8KKyAgd2hpbGUgKCpwID09ICcwJykKKyAgICBwKys7CisKKyAgYXNzZXJ0KHAgIT0gZW5kICYmICJJbnZhbGlkIHRyYWlsaW5nIGhleGFkZWNpbWFsIGZyYWN0aW9uISIpOworCisgIGhleERpZ2l0ID0gaGV4RGlnaXRWYWx1ZSgqcCk7CisKKyAgLyogSWYgd2UgcmFuIG9mZiB0aGUgZW5kIGl0IGlzIGV4YWN0bHkgemVybyBvciBvbmUtaGFsZiwgb3RoZXJ3aXNlCisgICAgIGEgbGl0dGxlIG1vcmUuICAqLworICBpZiAoaGV4RGlnaXQgPT0gLTFVKQorICAgIHJldHVybiBkaWdpdFZhbHVlID09IDAgPyBsZkV4YWN0bHlaZXJvOiBsZkV4YWN0bHlIYWxmOworICBlbHNlCisgICAgcmV0dXJuIGRpZ2l0VmFsdWUgPT0gMCA/IGxmTGVzc1RoYW5IYWxmOiBsZk1vcmVUaGFuSGFsZjsKK30KKworLyogUmV0dXJuIHRoZSBmcmFjdGlvbiBsb3N0IHdlcmUgYSBiaWdudW0gdHJ1bmNhdGVkIGxvc2luZyB0aGUgbGVhc3QKKyAgIHNpZ25pZmljYW50IEJJVFMgYml0cy4gICovCitzdGF0aWMgbG9zdEZyYWN0aW9uCitsb3N0RnJhY3Rpb25UaHJvdWdoVHJ1bmNhdGlvbihjb25zdCBpbnRlZ2VyUGFydCAqcGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFydENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJpdHMpCit7CisgIHVuc2lnbmVkIGludCBsc2I7CisKKyAgbHNiID0gQVBJbnQ6OnRjTFNCKHBhcnRzLCBwYXJ0Q291bnQpOworCisgIC8qIE5vdGUgdGhpcyBpcyBndWFyYW50ZWVkIHRydWUgaWYgYml0cyA9PSAwLCBvciBMU0IgPT0gLTFVLiAgKi8KKyAgaWYgKGJpdHMgPD0gbHNiKQorICAgIHJldHVybiBsZkV4YWN0bHlaZXJvOworICBpZiAoYml0cyA9PSBsc2IgKyAxKQorICAgIHJldHVybiBsZkV4YWN0bHlIYWxmOworICBpZiAoYml0cyA8PSBwYXJ0Q291bnQgKiBpbnRlZ2VyUGFydFdpZHRoICYmCisgICAgICBBUEludDo6dGNFeHRyYWN0Qml0KHBhcnRzLCBiaXRzIC0gMSkpCisgICAgcmV0dXJuIGxmTW9yZVRoYW5IYWxmOworCisgIHJldHVybiBsZkxlc3NUaGFuSGFsZjsKK30KKworLyogU2hpZnQgRFNUIHJpZ2h0IEJJVFMgYml0cyBub3RpbmcgbG9zdCBmcmFjdGlvbi4gICovCitzdGF0aWMgbG9zdEZyYWN0aW9uCitzaGlmdFJpZ2h0KGludGVnZXJQYXJ0ICpkc3QsIHVuc2lnbmVkIGludCBwYXJ0cywgdW5zaWduZWQgaW50IGJpdHMpCit7CisgIGxvc3RGcmFjdGlvbiBsb3N0X2ZyYWN0aW9uOworCisgIGxvc3RfZnJhY3Rpb24gPSBsb3N0RnJhY3Rpb25UaHJvdWdoVHJ1bmNhdGlvbihkc3QsIHBhcnRzLCBiaXRzKTsKKworICBBUEludDo6dGNTaGlmdFJpZ2h0KGRzdCwgcGFydHMsIGJpdHMpOworCisgIHJldHVybiBsb3N0X2ZyYWN0aW9uOworfQorCisvKiBDb21iaW5lIHRoZSBlZmZlY3Qgb2YgdHdvIGxvc3QgZnJhY3Rpb25zLiAgKi8KK3N0YXRpYyBsb3N0RnJhY3Rpb24KK2NvbWJpbmVMb3N0RnJhY3Rpb25zKGxvc3RGcmFjdGlvbiBtb3JlU2lnbmlmaWNhbnQsCisgICAgICAgICAgICAgICAgICAgICBsb3N0RnJhY3Rpb24gbGVzc1NpZ25pZmljYW50KQoreworICBpZiAobGVzc1NpZ25pZmljYW50ICE9IGxmRXhhY3RseVplcm8pIHsKKyAgICBpZiAobW9yZVNpZ25pZmljYW50ID09IGxmRXhhY3RseVplcm8pCisgICAgICBtb3JlU2lnbmlmaWNhbnQgPSBsZkxlc3NUaGFuSGFsZjsKKyAgICBlbHNlIGlmIChtb3JlU2lnbmlmaWNhbnQgPT0gbGZFeGFjdGx5SGFsZikKKyAgICAgIG1vcmVTaWduaWZpY2FudCA9IGxmTW9yZVRoYW5IYWxmOworICB9CisKKyAgcmV0dXJuIG1vcmVTaWduaWZpY2FudDsKK30KKworLyogVGhlIGVycm9yIGZyb20gdGhlIHRydWUgdmFsdWUsIGluIGhhbGYtdWxwcywgb24gbXVsdGlwbHlpbmcgdHdvCisgICBmbG9hdGluZyBwb2ludCBudW1iZXJzLCB3aGljaCBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgdGhleQorICAgYXBwcm94aW1hdGUgYnkgYXQgbW9zdCBIVUUxIGFuZCBIVUUyIGhhbGYtdWxwcywgaXMgc3RyaWN0bHkgbGVzcworICAgdGhhbiB0aGUgcmV0dXJuZWQgdmFsdWUuCisKKyAgIFNlZSAiSG93IHRvIFJlYWQgRmxvYXRpbmcgUG9pbnQgTnVtYmVycyBBY2N1cmF0ZWx5IiBieSBXaWxsaWFtIEQKKyAgIENsaW5nZXIuICAqLworc3RhdGljIHVuc2lnbmVkIGludAorSFVlcnJCb3VuZChib29sIGluZXhhY3RNdWx0aXBseSwgdW5zaWduZWQgaW50IEhVZXJyMSwgdW5zaWduZWQgaW50IEhVZXJyMikKK3sKKyAgYXNzZXJ0KEhVZXJyMSA8IDIgfHwgSFVlcnIyIDwgMiB8fCAoSFVlcnIxICsgSFVlcnIyIDwgOCkpOworCisgIGlmIChIVWVycjEgKyBIVWVycjIgPT0gMCkKKyAgICByZXR1cm4gaW5leGFjdE11bHRpcGx5ICogMjsgIC8qIDw9IGluZXhhY3RNdWx0aXBseSBoYWxmLXVscHMuICAqLworICBlbHNlCisgICAgcmV0dXJuIGluZXhhY3RNdWx0aXBseSArIDIgKiAoSFVlcnIxICsgSFVlcnIyKTsKK30KKworLyogVGhlIG51bWJlciBvZiB1bHBzIGZyb20gdGhlIGJvdW5kYXJ5ICh6ZXJvLCBvciBoYWxmIGlmIElTTkVBUkVTVCkKKyAgIHdoZW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IEJJVFMgYXJlIHRydW5jYXRlZC4gIEJJVFMgY2Fubm90IGJlCisgICB6ZXJvLiAgKi8KK3N0YXRpYyBpbnRlZ2VyUGFydAordWxwc0Zyb21Cb3VuZGFyeShjb25zdCBpbnRlZ2VyUGFydCAqcGFydHMsIHVuc2lnbmVkIGludCBiaXRzLCBib29sIGlzTmVhcmVzdCkKK3sKKyAgdW5zaWduZWQgaW50IGNvdW50LCBwYXJ0Qml0czsKKyAgaW50ZWdlclBhcnQgcGFydCwgYm91bmRhcnk7CisKKyAgYXNzZXJ0KGJpdHMgIT0gMCk7CisKKyAgYml0cy0tOworICBjb3VudCA9IGJpdHMgLyBpbnRlZ2VyUGFydFdpZHRoOworICBwYXJ0Qml0cyA9IGJpdHMgJSBpbnRlZ2VyUGFydFdpZHRoICsgMTsKKworICBwYXJ0ID0gcGFydHNbY291bnRdICYgKH4oaW50ZWdlclBhcnQpIDAgPj4gKGludGVnZXJQYXJ0V2lkdGggLSBwYXJ0Qml0cykpOworCisgIGlmIChpc05lYXJlc3QpCisgICAgYm91bmRhcnkgPSAoaW50ZWdlclBhcnQpIDEgPDwgKHBhcnRCaXRzIC0gMSk7CisgIGVsc2UKKyAgICBib3VuZGFyeSA9IDA7CisKKyAgaWYgKGNvdW50ID09IDApIHsKKyAgICBpZiAocGFydCAtIGJvdW5kYXJ5IDw9IGJvdW5kYXJ5IC0gcGFydCkKKyAgICAgIHJldHVybiBwYXJ0IC0gYm91bmRhcnk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGJvdW5kYXJ5IC0gcGFydDsKKyAgfQorCisgIGlmIChwYXJ0ID09IGJvdW5kYXJ5KSB7CisgICAgd2hpbGUgKC0tY291bnQpCisgICAgICBpZiAocGFydHNbY291bnRdKQorICAgICAgICByZXR1cm4gfihpbnRlZ2VyUGFydCkgMDsgLyogQSBsb3QuICAqLworCisgICAgcmV0dXJuIHBhcnRzWzBdOworICB9IGVsc2UgaWYgKHBhcnQgPT0gYm91bmRhcnkgLSAxKSB7CisgICAgd2hpbGUgKC0tY291bnQpCisgICAgICBpZiAofnBhcnRzW2NvdW50XSkKKyAgICAgICAgcmV0dXJuIH4oaW50ZWdlclBhcnQpIDA7IC8qIEEgbG90LiAgKi8KKworICAgIHJldHVybiAtcGFydHNbMF07CisgIH0KKworICByZXR1cm4gfihpbnRlZ2VyUGFydCkgMDsgLyogQSBsb3QuICAqLworfQorCisvKiBQbGFjZSBwb3coNSwgcG93ZXIpIGluIERTVCwgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhcnRzIHVzZWQuCisgICBEU1QgbXVzdCBiZSBhdCBsZWFzdCBvbmUgcGFydCBsYXJnZXIgdGhhbiBzaXplIG9mIHRoZSBhbnN3ZXIuICAqLworc3RhdGljIHVuc2lnbmVkIGludAorcG93ZXJPZjUoaW50ZWdlclBhcnQgKmRzdCwgdW5zaWduZWQgaW50IHBvd2VyKQoreworICBzdGF0aWMgY29uc3QgaW50ZWdlclBhcnQgZmlyc3RFaWdodFBvd2Vyc1tdID0geyAxLCA1LCAyNSwgMTI1LCA2MjUsIDMxMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NjI1LCA3ODEyNSB9OworICBpbnRlZ2VyUGFydCBwb3c1c1ttYXhQb3dlck9mRml2ZVBhcnRzICogMiArIDVdOworICBwb3c1c1swXSA9IDc4MTI1ICogNTsKKworICB1bnNpZ25lZCBpbnQgcGFydHNDb3VudFsxNl0gPSB7IDEgfTsKKyAgaW50ZWdlclBhcnQgc2NyYXRjaFttYXhQb3dlck9mRml2ZVBhcnRzXSwgKnAxLCAqcDIsICpwb3c1OworICB1bnNpZ25lZCBpbnQgcmVzdWx0OworICBhc3NlcnQocG93ZXIgPD0gbWF4RXhwb25lbnQpOworCisgIHAxID0gZHN0OworICBwMiA9IHNjcmF0Y2g7CisKKyAgKnAxID0gZmlyc3RFaWdodFBvd2Vyc1twb3dlciAmIDddOworICBwb3dlciA+Pj0gMzsKKworICByZXN1bHQgPSAxOworICBwb3c1ID0gcG93NXM7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IHBvd2VyOyBwb3dlciA+Pj0gMSwgbisrKSB7CisgICAgdW5zaWduZWQgaW50IHBjOworCisgICAgcGMgPSBwYXJ0c0NvdW50W25dOworCisgICAgLyogQ2FsY3VsYXRlIHBvdyg1LHBvdygyLG4rMykpIGlmIHdlIGhhdmVuJ3QgeWV0LiAgKi8KKyAgICBpZiAocGMgPT0gMCkgeworICAgICAgcGMgPSBwYXJ0c0NvdW50W24gLSAxXTsKKyAgICAgIEFQSW50Ojp0Y0Z1bGxNdWx0aXBseShwb3c1LCBwb3c1IC0gcGMsIHBvdzUgLSBwYywgcGMsIHBjKTsKKyAgICAgIHBjICo9IDI7CisgICAgICBpZiAocG93NVtwYyAtIDFdID09IDApCisgICAgICAgIHBjLS07CisgICAgICBwYXJ0c0NvdW50W25dID0gcGM7CisgICAgfQorCisgICAgaWYgKHBvd2VyICYgMSkgeworICAgICAgaW50ZWdlclBhcnQgKnRtcDsKKworICAgICAgQVBJbnQ6OnRjRnVsbE11bHRpcGx5KHAyLCBwMSwgcG93NSwgcmVzdWx0LCBwYyk7CisgICAgICByZXN1bHQgKz0gcGM7CisgICAgICBpZiAocDJbcmVzdWx0IC0gMV0gPT0gMCkKKyAgICAgICAgcmVzdWx0LS07CisKKyAgICAgIC8qIE5vdyByZXN1bHQgaXMgaW4gcDEgd2l0aCBwYXJ0c0NvdW50IHBhcnRzIGFuZCBwMiBpcyBzY3JhdGNoCisgICAgICAgICBzcGFjZS4gICovCisgICAgICB0bXAgPSBwMSwgcDEgPSBwMiwgcDIgPSB0bXA7CisgICAgfQorCisgICAgcG93NSArPSBwYzsKKyAgfQorCisgIGlmIChwMSAhPSBkc3QpCisgICAgQVBJbnQ6OnRjQXNzaWduKGRzdCwgcDEsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogWmVybyBhdCB0aGUgZW5kIHRvIGF2b2lkIG1vZHVsYXIgYXJpdGhtZXRpYyB3aGVuIGFkZGluZyBvbmU7IHVzZWQKKyAgIHdoZW4gcm91bmRpbmcgdXAgZHVyaW5nIGhleGFkZWNpbWFsIG91dHB1dC4gICovCitzdGF0aWMgY29uc3QgY2hhciBoZXhEaWdpdHNMb3dlcltdID0gIjAxMjM0NTY3ODlhYmNkZWYwIjsKK3N0YXRpYyBjb25zdCBjaGFyIGhleERpZ2l0c1VwcGVyW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRjAiOworc3RhdGljIGNvbnN0IGNoYXIgaW5maW5pdHlMW10gPSAiaW5maW5pdHkiOworc3RhdGljIGNvbnN0IGNoYXIgaW5maW5pdHlVW10gPSAiSU5GSU5JVFkiOworc3RhdGljIGNvbnN0IGNoYXIgTmFOTFtdID0gIm5hbiI7CitzdGF0aWMgY29uc3QgY2hhciBOYU5VW10gPSAiTkFOIjsKKworLyogV3JpdGUgb3V0IGFuIGludGVnZXJQYXJ0IGluIGhleGFkZWNpbWFsLCBzdGFydGluZyB3aXRoIHRoZSBtb3N0CisgICBzaWduaWZpY2FudCBuaWJibGUuICBXcml0ZSBvdXQgZXhhY3RseSBDT1VOVCBoZXhkaWdpdHMsIHJldHVybgorICAgQ09VTlQuICAqLworc3RhdGljIHVuc2lnbmVkIGludAorcGFydEFzSGV4IChjaGFyICpkc3QsIGludGVnZXJQYXJ0IHBhcnQsIHVuc2lnbmVkIGludCBjb3VudCwKKyAgICAgICAgICAgY29uc3QgY2hhciAqaGV4RGlnaXRDaGFycykKK3sKKyAgdW5zaWduZWQgaW50IHJlc3VsdCA9IGNvdW50OworCisgIGFzc2VydChjb3VudCAhPSAwICYmIGNvdW50IDw9IGludGVnZXJQYXJ0V2lkdGggLyA0KTsKKworICBwYXJ0ID4+PSAoaW50ZWdlclBhcnRXaWR0aCAtIDQgKiBjb3VudCk7CisgIHdoaWxlIChjb3VudC0tKSB7CisgICAgZHN0W2NvdW50XSA9IGhleERpZ2l0Q2hhcnNbcGFydCAmIDB4Zl07CisgICAgcGFydCA+Pj0gNDsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIFdyaXRlIG91dCBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIuICAqLworc3RhdGljIGNoYXIgKgord3JpdGVVbnNpZ25lZERlY2ltYWwgKGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IG4pCit7CisgIGNoYXIgYnVmZls0MF0sICpwOworCisgIHAgPSBidWZmOworICBkbworICAgICpwKysgPSAnMCcgKyBuICUgMTA7CisgIHdoaWxlIChuIC89IDEwKTsKKworICBkbworICAgICpkc3QrKyA9ICotLXA7CisgIHdoaWxlIChwICE9IGJ1ZmYpOworCisgIHJldHVybiBkc3Q7Cit9CisKKy8qIFdyaXRlIG91dCBhIHNpZ25lZCBkZWNpbWFsIGludGVnZXIuICAqLworc3RhdGljIGNoYXIgKgord3JpdGVTaWduZWREZWNpbWFsIChjaGFyICpkc3QsIGludCB2YWx1ZSkKK3sKKyAgaWYgKHZhbHVlIDwgMCkgeworICAgICpkc3QrKyA9ICctJzsKKyAgICBkc3QgPSB3cml0ZVVuc2lnbmVkRGVjaW1hbChkc3QsIC0odW5zaWduZWQpIHZhbHVlKTsKKyAgfSBlbHNlCisgICAgZHN0ID0gd3JpdGVVbnNpZ25lZERlY2ltYWwoZHN0LCB2YWx1ZSk7CisKKyAgcmV0dXJuIGRzdDsKK30KKworLyogQ29uc3RydWN0b3JzLiAgKi8KK3ZvaWQKK0FQRmxvYXQ6OmluaXRpYWxpemUoY29uc3QgZmx0U2VtYW50aWNzICpvdXJTZW1hbnRpY3MpCit7CisgIHVuc2lnbmVkIGludCBjb3VudDsKKworICBzZW1hbnRpY3MgPSBvdXJTZW1hbnRpY3M7CisgIGNvdW50ID0gcGFydENvdW50KCk7CisgIGlmIChjb3VudCA+IDEpCisgICAgc2lnbmlmaWNhbmQucGFydHMgPSBuZXcgaW50ZWdlclBhcnRbY291bnRdOworfQorCit2b2lkCitBUEZsb2F0OjpmcmVlU2lnbmlmaWNhbmQoKQoreworICBpZiAocGFydENvdW50KCkgPiAxKQorICAgIGRlbGV0ZSBbXSBzaWduaWZpY2FuZC5wYXJ0czsKK30KKwordm9pZAorQVBGbG9hdDo6YXNzaWduKGNvbnN0IEFQRmxvYXQgJnJocykKK3sKKyAgYXNzZXJ0KHNlbWFudGljcyA9PSByaHMuc2VtYW50aWNzKTsKKworICBzaWduID0gcmhzLnNpZ247CisgIGNhdGVnb3J5ID0gcmhzLmNhdGVnb3J5OworICBleHBvbmVudCA9IHJocy5leHBvbmVudDsKKyAgc2lnbjIgPSByaHMuc2lnbjI7CisgIGV4cG9uZW50MiA9IHJocy5leHBvbmVudDI7CisgIGlmIChjYXRlZ29yeSA9PSBmY05vcm1hbCB8fCBjYXRlZ29yeSA9PSBmY05hTikKKyAgICBjb3B5U2lnbmlmaWNhbmQocmhzKTsKK30KKwordm9pZAorQVBGbG9hdDo6Y29weVNpZ25pZmljYW5kKGNvbnN0IEFQRmxvYXQgJnJocykKK3sKKyAgYXNzZXJ0KGNhdGVnb3J5ID09IGZjTm9ybWFsIHx8IGNhdGVnb3J5ID09IGZjTmFOKTsKKyAgYXNzZXJ0KHJocy5wYXJ0Q291bnQoKSA+PSBwYXJ0Q291bnQoKSk7CisKKyAgQVBJbnQ6OnRjQXNzaWduKHNpZ25pZmljYW5kUGFydHMoKSwgcmhzLnNpZ25pZmljYW5kUGFydHMoKSwKKyAgICAgICAgICAgICAgICAgIHBhcnRDb3VudCgpKTsKK30KKworLyogTWFrZSB0aGlzIG51bWJlciBhIE5hTiwgd2l0aCBhbiBhcmJpdHJhcnkgYnV0IGRldGVybWluaXN0aWMgdmFsdWUKKyAgIGZvciB0aGUgc2lnbmlmaWNhbmQuICBJZiBkb3VibGUgb3IgbG9uZ2VyLCB0aGlzIGlzIGEgc2lnbmFsbGluZyBOYU4sCisgICB3aGljaCBtYXkgbm90IGJlIGlkZWFsLiAgSWYgZmxvYXQsIHRoaXMgaXMgUU5hTigwKS4gICovCit2b2lkIEFQRmxvYXQ6Om1ha2VOYU4oYm9vbCBTTmFOLCBib29sIE5lZ2F0aXZlLCBjb25zdCBBUEludCAqZmlsbCkKK3sKKyAgY2F0ZWdvcnkgPSBmY05hTjsKKyAgc2lnbiA9IE5lZ2F0aXZlOworCisgIGludGVnZXJQYXJ0ICpzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kUGFydHMoKTsKKyAgdW5zaWduZWQgbnVtUGFydHMgPSBwYXJ0Q291bnQoKTsKKworICAvLyBTZXQgdGhlIHNpZ25pZmljYW5kIGJpdHMgdG8gdGhlIGZpbGwuCisgIGlmICghZmlsbCB8fCBmaWxsLT5nZXROdW1Xb3JkcygpIDwgbnVtUGFydHMpCisgICAgQVBJbnQ6OnRjU2V0KHNpZ25pZmljYW5kLCAwLCBudW1QYXJ0cyk7CisgIGlmIChmaWxsKSB7CisgICAgQVBJbnQ6OnRjQXNzaWduKHNpZ25pZmljYW5kLCBmaWxsLT5nZXRSYXdEYXRhKCksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGZpbGwtPmdldE51bVdvcmRzKCksIG51bVBhcnRzKSk7CisKKyAgICAvLyBaZXJvIG91dCB0aGUgZXhjZXNzIGJpdHMgb2YgdGhlIHNpZ25pZmljYW5kLgorICAgIHVuc2lnbmVkIGJpdHNUb1ByZXNlcnZlID0gc2VtYW50aWNzLT5wcmVjaXNpb24gLSAxOworICAgIHVuc2lnbmVkIHBhcnQgPSBiaXRzVG9QcmVzZXJ2ZSAvIDY0OworICAgIGJpdHNUb1ByZXNlcnZlICU9IDY0OworICAgIHNpZ25pZmljYW5kW3BhcnRdICY9ICgoMVVMTCA8PCBiaXRzVG9QcmVzZXJ2ZSkgLSAxKTsKKyAgICBmb3IgKHBhcnQrKzsgcGFydCAhPSBudW1QYXJ0czsgKytwYXJ0KQorICAgICAgc2lnbmlmaWNhbmRbcGFydF0gPSAwOworICB9CisKKyAgdW5zaWduZWQgUU5hTkJpdCA9IHNlbWFudGljcy0+cHJlY2lzaW9uIC0gMjsKKworICBpZiAoU05hTikgeworICAgIC8vIFdlIGFsd2F5cyBoYXZlIHRvIGNsZWFyIHRoZSBRTmFOIGJpdCB0byBtYWtlIGl0IGFuIFNOYU4uCisgICAgQVBJbnQ6OnRjQ2xlYXJCaXQoc2lnbmlmaWNhbmQsIFFOYU5CaXQpOworCisgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGJpdHMgc2V0IGluIHRoZSBwYXlsb2FkLCB3ZSBoYXZlIHRvIHNldAorICAgIC8vICpzb21ldGhpbmcqIHRvIG1ha2UgaXQgYSBOYU4gaW5zdGVhZCBvZiBhbiBpbmZpbml0eTsKKyAgICAvLyBjb252ZW50aW9uYWxseSwgdGhpcyBpcyB0aGUgbmV4dCBiaXQgZG93biBmcm9tIHRoZSBRTmFOIGJpdC4KKyAgICBpZiAoQVBJbnQ6OnRjSXNaZXJvKHNpZ25pZmljYW5kLCBudW1QYXJ0cykpCisgICAgICBBUEludDo6dGNTZXRCaXQoc2lnbmlmaWNhbmQsIFFOYU5CaXQgLSAxKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSBhbHdheXMgaGF2ZSB0byBzZXQgdGhlIFFOYU4gYml0IHRvIG1ha2UgaXQgYSBRTmFOLgorICAgIEFQSW50Ojp0Y1NldEJpdChzaWduaWZpY2FuZCwgUU5hTkJpdCk7CisgIH0KKworICAvLyBGb3IgeDg3IGV4dGVuZGVkIHByZWNpc2lvbiwgd2Ugd2FudCB0byBtYWtlIGEgTmFOLCBub3QgYQorICAvLyBwc2V1ZG8tTmFOLiAgTWF5YmUgd2Ugc2hvdWxkIGV4cG9zZSB0aGUgYWJpbGl0eSB0byBtYWtlCisgIC8vIHBzZXVkby1OYU5zPworICBpZiAoc2VtYW50aWNzID09ICZBUEZsb2F0Ojp4ODdEb3VibGVFeHRlbmRlZCkKKyAgICBBUEludDo6dGNTZXRCaXQoc2lnbmlmaWNhbmQsIFFOYU5CaXQgKyAxKTsKK30KKworQVBGbG9hdCBBUEZsb2F0OjptYWtlTmFOKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIFNOYU4sIGJvb2wgTmVnYXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgKmZpbGwpIHsKKyAgQVBGbG9hdCB2YWx1ZShTZW0sIHVuaW5pdGlhbGl6ZWQpOworICB2YWx1ZS5tYWtlTmFOKFNOYU4sIE5lZ2F0aXZlLCBmaWxsKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitBUEZsb2F0ICYKK0FQRmxvYXQ6Om9wZXJhdG9yPShjb25zdCBBUEZsb2F0ICZyaHMpCit7CisgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICBpZiAoc2VtYW50aWNzICE9IHJocy5zZW1hbnRpY3MpIHsKKyAgICAgIGZyZWVTaWduaWZpY2FuZCgpOworICAgICAgaW5pdGlhbGl6ZShyaHMuc2VtYW50aWNzKTsKKyAgICB9CisgICAgYXNzaWduKHJocyk7CisgIH0KKworICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wKK0FQRmxvYXQ6OmJpdHdpc2VJc0VxdWFsKGNvbnN0IEFQRmxvYXQgJnJocykgY29uc3QgeworICBpZiAodGhpcyA9PSAmcmhzKQorICAgIHJldHVybiB0cnVlOworICBpZiAoc2VtYW50aWNzICE9IHJocy5zZW1hbnRpY3MgfHwKKyAgICAgIGNhdGVnb3J5ICE9IHJocy5jYXRlZ29yeSB8fAorICAgICAgc2lnbiAhPSByaHMuc2lnbikKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChzZW1hbnRpY3M9PShjb25zdCBsbHZtOjpmbHRTZW1hbnRpY3MqKSZQUENEb3VibGVEb3VibGUgJiYKKyAgICAgIHNpZ24yICE9IHJocy5zaWduMikKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChjYXRlZ29yeT09ZmNaZXJvIHx8IGNhdGVnb3J5PT1mY0luZmluaXR5KQorICAgIHJldHVybiB0cnVlOworICBlbHNlIGlmIChjYXRlZ29yeT09ZmNOb3JtYWwgJiYgZXhwb25lbnQhPXJocy5leHBvbmVudCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGVsc2UgaWYgKHNlbWFudGljcz09KGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyopJlBQQ0RvdWJsZURvdWJsZSAmJgorICAgICAgICAgICBleHBvbmVudDIhPXJocy5leHBvbmVudDIpCisgICAgcmV0dXJuIGZhbHNlOworICBlbHNlIHsKKyAgICBpbnQgaT0gcGFydENvdW50KCk7CisgICAgY29uc3QgaW50ZWdlclBhcnQqIHA9c2lnbmlmaWNhbmRQYXJ0cygpOworICAgIGNvbnN0IGludGVnZXJQYXJ0KiBxPXJocy5zaWduaWZpY2FuZFBhcnRzKCk7CisgICAgZm9yICg7IGk+MDsgaS0tLCBwKyssIHErKykgeworICAgICAgaWYgKCpwICE9ICpxKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK0FQRmxvYXQ6OkFQRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICZvdXJTZW1hbnRpY3MsIGludGVnZXJQYXJ0IHZhbHVlKQoreworICBhc3NlcnRBcml0aG1ldGljT0sob3VyU2VtYW50aWNzKTsKKyAgaW5pdGlhbGl6ZSgmb3VyU2VtYW50aWNzKTsKKyAgc2lnbiA9IDA7CisgIHplcm9TaWduaWZpY2FuZCgpOworICBleHBvbmVudCA9IG91clNlbWFudGljcy5wcmVjaXNpb24gLSAxOworICBzaWduaWZpY2FuZFBhcnRzKClbMF0gPSB2YWx1ZTsKKyAgbm9ybWFsaXplKHJtTmVhcmVzdFRpZXNUb0V2ZW4sIGxmRXhhY3RseVplcm8pOworfQorCitBUEZsb2F0OjpBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmb3VyU2VtYW50aWNzKSB7CisgIGFzc2VydEFyaXRobWV0aWNPSyhvdXJTZW1hbnRpY3MpOworICBpbml0aWFsaXplKCZvdXJTZW1hbnRpY3MpOworICBjYXRlZ29yeSA9IGZjWmVybzsKKyAgc2lnbiA9IGZhbHNlOworfQorCitBUEZsb2F0OjpBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmb3VyU2VtYW50aWNzLCB1bmluaXRpYWxpemVkVGFnIHRhZykgeworICBhc3NlcnRBcml0aG1ldGljT0sob3VyU2VtYW50aWNzKTsKKyAgLy8gQWxsb2NhdGVzIHN0b3JhZ2UgaWYgbmVjZXNzYXJ5IGJ1dCBkb2VzIG5vdCBpbml0aWFsaXplIGl0LgorICBpbml0aWFsaXplKCZvdXJTZW1hbnRpY3MpOworfQorCitBUEZsb2F0OjpBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmb3VyU2VtYW50aWNzLAorICAgICAgICAgICAgICAgICBmbHRDYXRlZ29yeSBvdXJDYXRlZ29yeSwgYm9vbCBuZWdhdGl2ZSkKK3sKKyAgYXNzZXJ0QXJpdGhtZXRpY09LKG91clNlbWFudGljcyk7CisgIGluaXRpYWxpemUoJm91clNlbWFudGljcyk7CisgIGNhdGVnb3J5ID0gb3VyQ2F0ZWdvcnk7CisgIHNpZ24gPSBuZWdhdGl2ZTsKKyAgaWYgKGNhdGVnb3J5ID09IGZjTm9ybWFsKQorICAgIGNhdGVnb3J5ID0gZmNaZXJvOworICBlbHNlIGlmIChvdXJDYXRlZ29yeSA9PSBmY05hTikKKyAgICBtYWtlTmFOKCk7Cit9CisKK0FQRmxvYXQ6OkFQRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICZvdXJTZW1hbnRpY3MsIFN0cmluZ1JlZiB0ZXh0KQoreworICBhc3NlcnRBcml0aG1ldGljT0sob3VyU2VtYW50aWNzKTsKKyAgaW5pdGlhbGl6ZSgmb3VyU2VtYW50aWNzKTsKKyAgY29udmVydEZyb21TdHJpbmcodGV4dCwgcm1OZWFyZXN0VGllc1RvRXZlbik7Cit9CisKK0FQRmxvYXQ6OkFQRmxvYXQoY29uc3QgQVBGbG9hdCAmcmhzKQoreworICBpbml0aWFsaXplKHJocy5zZW1hbnRpY3MpOworICBhc3NpZ24ocmhzKTsKK30KKworQVBGbG9hdDo6fkFQRmxvYXQoKQoreworICBmcmVlU2lnbmlmaWNhbmQoKTsKK30KKworLy8gUHJvZmlsZSAtIFRoaXMgbWV0aG9kICdwcm9maWxlcycgYW4gQVBGbG9hdCBmb3IgdXNlIHdpdGggRm9sZGluZ1NldC4KK3ZvaWQgQVBGbG9hdDo6UHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3QgeworICBJRC5BZGQoYml0Y2FzdFRvQVBJbnQoKSk7Cit9CisKK3Vuc2lnbmVkIGludAorQVBGbG9hdDo6cGFydENvdW50KCkgY29uc3QKK3sKKyAgcmV0dXJuIHBhcnRDb3VudEZvckJpdHMoc2VtYW50aWNzLT5wcmVjaXNpb24gKyAxKTsKK30KKwordW5zaWduZWQgaW50CitBUEZsb2F0OjpzZW1hbnRpY3NQcmVjaXNpb24oY29uc3QgZmx0U2VtYW50aWNzICZzZW1hbnRpY3MpCit7CisgIHJldHVybiBzZW1hbnRpY3MucHJlY2lzaW9uOworfQorCitjb25zdCBpbnRlZ2VyUGFydCAqCitBUEZsb2F0OjpzaWduaWZpY2FuZFBhcnRzKCkgY29uc3QKK3sKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBGbG9hdCAqPih0aGlzKS0+c2lnbmlmaWNhbmRQYXJ0cygpOworfQorCitpbnRlZ2VyUGFydCAqCitBUEZsb2F0OjpzaWduaWZpY2FuZFBhcnRzKCkKK3sKKyAgYXNzZXJ0KGNhdGVnb3J5ID09IGZjTm9ybWFsIHx8IGNhdGVnb3J5ID09IGZjTmFOKTsKKworICBpZiAocGFydENvdW50KCkgPiAxKQorICAgIHJldHVybiBzaWduaWZpY2FuZC5wYXJ0czsKKyAgZWxzZQorICAgIHJldHVybiAmc2lnbmlmaWNhbmQucGFydDsKK30KKwordm9pZAorQVBGbG9hdDo6emVyb1NpZ25pZmljYW5kKCkKK3sKKyAgY2F0ZWdvcnkgPSBmY05vcm1hbDsKKyAgQVBJbnQ6OnRjU2V0KHNpZ25pZmljYW5kUGFydHMoKSwgMCwgcGFydENvdW50KCkpOworfQorCisvKiBJbmNyZW1lbnQgYW4gZmNOb3JtYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyJ3Mgc2lnbmlmaWNhbmQuICAqLwordm9pZAorQVBGbG9hdDo6aW5jcmVtZW50U2lnbmlmaWNhbmQoKQoreworICBpbnRlZ2VyUGFydCBjYXJyeTsKKworICBjYXJyeSA9IEFQSW50Ojp0Y0luY3JlbWVudChzaWduaWZpY2FuZFBhcnRzKCksIHBhcnRDb3VudCgpKTsKKworICAvKiBPdXIgY2FsbGVycyBzaG91bGQgbmV2ZXIgY2F1c2UgdXMgdG8gb3ZlcmZsb3cuICAqLworICBhc3NlcnQoY2FycnkgPT0gMCk7Cit9CisKKy8qIEFkZCB0aGUgc2lnbmlmaWNhbmQgb2YgdGhlIFJIUy4gIFJldHVybnMgdGhlIGNhcnJ5IGZsYWcuICAqLworaW50ZWdlclBhcnQKK0FQRmxvYXQ6OmFkZFNpZ25pZmljYW5kKGNvbnN0IEFQRmxvYXQgJnJocykKK3sKKyAgaW50ZWdlclBhcnQgKnBhcnRzOworCisgIHBhcnRzID0gc2lnbmlmaWNhbmRQYXJ0cygpOworCisgIGFzc2VydChzZW1hbnRpY3MgPT0gcmhzLnNlbWFudGljcyk7CisgIGFzc2VydChleHBvbmVudCA9PSByaHMuZXhwb25lbnQpOworCisgIHJldHVybiBBUEludDo6dGNBZGQocGFydHMsIHJocy5zaWduaWZpY2FuZFBhcnRzKCksIDAsIHBhcnRDb3VudCgpKTsKK30KKworLyogU3VidHJhY3QgdGhlIHNpZ25pZmljYW5kIG9mIHRoZSBSSFMgd2l0aCBhIGJvcnJvdyBmbGFnLiAgUmV0dXJucworICAgdGhlIGJvcnJvdyBmbGFnLiAgKi8KK2ludGVnZXJQYXJ0CitBUEZsb2F0OjpzdWJ0cmFjdFNpZ25pZmljYW5kKGNvbnN0IEFQRmxvYXQgJnJocywgaW50ZWdlclBhcnQgYm9ycm93KQoreworICBpbnRlZ2VyUGFydCAqcGFydHM7CisKKyAgcGFydHMgPSBzaWduaWZpY2FuZFBhcnRzKCk7CisKKyAgYXNzZXJ0KHNlbWFudGljcyA9PSByaHMuc2VtYW50aWNzKTsKKyAgYXNzZXJ0KGV4cG9uZW50ID09IHJocy5leHBvbmVudCk7CisKKyAgcmV0dXJuIEFQSW50Ojp0Y1N1YnRyYWN0KHBhcnRzLCByaHMuc2lnbmlmaWNhbmRQYXJ0cygpLCBib3Jyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0Q291bnQoKSk7Cit9CisKKy8qIE11bHRpcGx5IHRoZSBzaWduaWZpY2FuZCBvZiB0aGUgUkhTLiAgSWYgQURERU5EIGlzIG5vbi1OVUxMLCBhZGQgaXQKKyAgIG9uIHRvIHRoZSBmdWxsLXByZWNpc2lvbiByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uLiAgUmV0dXJucyB0aGUKKyAgIGxvc3QgZnJhY3Rpb24uICAqLworbG9zdEZyYWN0aW9uCitBUEZsb2F0OjptdWx0aXBseVNpZ25pZmljYW5kKGNvbnN0IEFQRmxvYXQgJnJocywgY29uc3QgQVBGbG9hdCAqYWRkZW5kKQoreworICB1bnNpZ25lZCBpbnQgb21zYjsgICAgICAgIC8vIE9uZSwgbm90IHplcm8sIGJhc2VkIE1TQi4KKyAgdW5zaWduZWQgaW50IHBhcnRzQ291bnQsIG5ld1BhcnRzQ291bnQsIHByZWNpc2lvbjsKKyAgaW50ZWdlclBhcnQgKmxoc1NpZ25pZmljYW5kOworICBpbnRlZ2VyUGFydCBzY3JhdGNoWzRdOworICBpbnRlZ2VyUGFydCAqZnVsbFNpZ25pZmljYW5kOworICBsb3N0RnJhY3Rpb24gbG9zdF9mcmFjdGlvbjsKKyAgYm9vbCBpZ25vcmVkOworCisgIGFzc2VydChzZW1hbnRpY3MgPT0gcmhzLnNlbWFudGljcyk7CisKKyAgcHJlY2lzaW9uID0gc2VtYW50aWNzLT5wcmVjaXNpb247CisgIG5ld1BhcnRzQ291bnQgPSBwYXJ0Q291bnRGb3JCaXRzKHByZWNpc2lvbiAqIDIpOworCisgIGlmIChuZXdQYXJ0c0NvdW50ID4gNCkKKyAgICBmdWxsU2lnbmlmaWNhbmQgPSBuZXcgaW50ZWdlclBhcnRbbmV3UGFydHNDb3VudF07CisgIGVsc2UKKyAgICBmdWxsU2lnbmlmaWNhbmQgPSBzY3JhdGNoOworCisgIGxoc1NpZ25pZmljYW5kID0gc2lnbmlmaWNhbmRQYXJ0cygpOworICBwYXJ0c0NvdW50ID0gcGFydENvdW50KCk7CisKKyAgQVBJbnQ6OnRjRnVsbE11bHRpcGx5KGZ1bGxTaWduaWZpY2FuZCwgbGhzU2lnbmlmaWNhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICByaHMuc2lnbmlmaWNhbmRQYXJ0cygpLCBwYXJ0c0NvdW50LCBwYXJ0c0NvdW50KTsKKworICBsb3N0X2ZyYWN0aW9uID0gbGZFeGFjdGx5WmVybzsKKyAgb21zYiA9IEFQSW50Ojp0Y01TQihmdWxsU2lnbmlmaWNhbmQsIG5ld1BhcnRzQ291bnQpICsgMTsKKyAgZXhwb25lbnQgKz0gcmhzLmV4cG9uZW50OworCisgIGlmIChhZGRlbmQpIHsKKyAgICBTaWduaWZpY2FuZCBzYXZlZFNpZ25pZmljYW5kID0gc2lnbmlmaWNhbmQ7CisgICAgY29uc3QgZmx0U2VtYW50aWNzICpzYXZlZFNlbWFudGljcyA9IHNlbWFudGljczsKKyAgICBmbHRTZW1hbnRpY3MgZXh0ZW5kZWRTZW1hbnRpY3M7CisgICAgb3BTdGF0dXMgc3RhdHVzOworICAgIHVuc2lnbmVkIGludCBleHRlbmRlZFByZWNpc2lvbjsKKworICAgIC8qIE5vcm1hbGl6ZSBvdXIgTVNCLiAgKi8KKyAgICBleHRlbmRlZFByZWNpc2lvbiA9IHByZWNpc2lvbiArIHByZWNpc2lvbiAtIDE7CisgICAgaWYgKG9tc2IgIT0gZXh0ZW5kZWRQcmVjaXNpb24pIHsKKyAgICAgIEFQSW50Ojp0Y1NoaWZ0TGVmdChmdWxsU2lnbmlmaWNhbmQsIG5ld1BhcnRzQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcmVjaXNpb24gLSBvbXNiKTsKKyAgICAgIGV4cG9uZW50IC09IGV4dGVuZGVkUHJlY2lzaW9uIC0gb21zYjsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgbmV3IHNlbWFudGljcy4gICovCisgICAgZXh0ZW5kZWRTZW1hbnRpY3MgPSAqc2VtYW50aWNzOworICAgIGV4dGVuZGVkU2VtYW50aWNzLnByZWNpc2lvbiA9IGV4dGVuZGVkUHJlY2lzaW9uOworCisgICAgaWYgKG5ld1BhcnRzQ291bnQgPT0gMSkKKyAgICAgIHNpZ25pZmljYW5kLnBhcnQgPSBmdWxsU2lnbmlmaWNhbmRbMF07CisgICAgZWxzZQorICAgICAgc2lnbmlmaWNhbmQucGFydHMgPSBmdWxsU2lnbmlmaWNhbmQ7CisgICAgc2VtYW50aWNzID0gJmV4dGVuZGVkU2VtYW50aWNzOworCisgICAgQVBGbG9hdCBleHRlbmRlZEFkZGVuZCgqYWRkZW5kKTsKKyAgICBzdGF0dXMgPSBleHRlbmRlZEFkZGVuZC5jb252ZXJ0KGV4dGVuZGVkU2VtYW50aWNzLCBybVRvd2FyZFplcm8sICZpZ25vcmVkKTsKKyAgICBhc3NlcnQoc3RhdHVzID09IG9wT0spOworICAgIGxvc3RfZnJhY3Rpb24gPSBhZGRPclN1YnRyYWN0U2lnbmlmaWNhbmQoZXh0ZW5kZWRBZGRlbmQsIGZhbHNlKTsKKworICAgIC8qIFJlc3RvcmUgb3VyIHN0YXRlLiAgKi8KKyAgICBpZiAobmV3UGFydHNDb3VudCA9PSAxKQorICAgICAgZnVsbFNpZ25pZmljYW5kWzBdID0gc2lnbmlmaWNhbmQucGFydDsKKyAgICBzaWduaWZpY2FuZCA9IHNhdmVkU2lnbmlmaWNhbmQ7CisgICAgc2VtYW50aWNzID0gc2F2ZWRTZW1hbnRpY3M7CisKKyAgICBvbXNiID0gQVBJbnQ6OnRjTVNCKGZ1bGxTaWduaWZpY2FuZCwgbmV3UGFydHNDb3VudCkgKyAxOworICB9CisKKyAgZXhwb25lbnQgLT0gKHByZWNpc2lvbiAtIDEpOworCisgIGlmIChvbXNiID4gcHJlY2lzaW9uKSB7CisgICAgdW5zaWduZWQgaW50IGJpdHMsIHNpZ25pZmljYW50UGFydHM7CisgICAgbG9zdEZyYWN0aW9uIGxmOworCisgICAgYml0cyA9IG9tc2IgLSBwcmVjaXNpb247CisgICAgc2lnbmlmaWNhbnRQYXJ0cyA9IHBhcnRDb3VudEZvckJpdHMob21zYik7CisgICAgbGYgPSBzaGlmdFJpZ2h0KGZ1bGxTaWduaWZpY2FuZCwgc2lnbmlmaWNhbnRQYXJ0cywgYml0cyk7CisgICAgbG9zdF9mcmFjdGlvbiA9IGNvbWJpbmVMb3N0RnJhY3Rpb25zKGxmLCBsb3N0X2ZyYWN0aW9uKTsKKyAgICBleHBvbmVudCArPSBiaXRzOworICB9CisKKyAgQVBJbnQ6OnRjQXNzaWduKGxoc1NpZ25pZmljYW5kLCBmdWxsU2lnbmlmaWNhbmQsIHBhcnRzQ291bnQpOworCisgIGlmIChuZXdQYXJ0c0NvdW50ID4gNCkKKyAgICBkZWxldGUgW10gZnVsbFNpZ25pZmljYW5kOworCisgIHJldHVybiBsb3N0X2ZyYWN0aW9uOworfQorCisvKiBNdWx0aXBseSB0aGUgc2lnbmlmaWNhbmRzIG9mIExIUyBhbmQgUkhTIHRvIERTVC4gICovCitsb3N0RnJhY3Rpb24KK0FQRmxvYXQ6OmRpdmlkZVNpZ25pZmljYW5kKGNvbnN0IEFQRmxvYXQgJnJocykKK3sKKyAgdW5zaWduZWQgaW50IGJpdCwgaSwgcGFydHNDb3VudDsKKyAgY29uc3QgaW50ZWdlclBhcnQgKnJoc1NpZ25pZmljYW5kOworICBpbnRlZ2VyUGFydCAqbGhzU2lnbmlmaWNhbmQsICpkaXZpZGVuZCwgKmRpdmlzb3I7CisgIGludGVnZXJQYXJ0IHNjcmF0Y2hbNF07CisgIGxvc3RGcmFjdGlvbiBsb3N0X2ZyYWN0aW9uOworCisgIGFzc2VydChzZW1hbnRpY3MgPT0gcmhzLnNlbWFudGljcyk7CisKKyAgbGhzU2lnbmlmaWNhbmQgPSBzaWduaWZpY2FuZFBhcnRzKCk7CisgIHJoc1NpZ25pZmljYW5kID0gcmhzLnNpZ25pZmljYW5kUGFydHMoKTsKKyAgcGFydHNDb3VudCA9IHBhcnRDb3VudCgpOworCisgIGlmIChwYXJ0c0NvdW50ID4gMikKKyAgICBkaXZpZGVuZCA9IG5ldyBpbnRlZ2VyUGFydFtwYXJ0c0NvdW50ICogMl07CisgIGVsc2UKKyAgICBkaXZpZGVuZCA9IHNjcmF0Y2g7CisKKyAgZGl2aXNvciA9IGRpdmlkZW5kICsgcGFydHNDb3VudDsKKworICAvKiBDb3B5IHRoZSBkaXZpZGVuZCBhbmQgZGl2aXNvciBhcyB0aGV5IHdpbGwgYmUgbW9kaWZpZWQgaW4tcGxhY2UuICAqLworICBmb3IgKGkgPSAwOyBpIDwgcGFydHNDb3VudDsgaSsrKSB7CisgICAgZGl2aWRlbmRbaV0gPSBsaHNTaWduaWZpY2FuZFtpXTsKKyAgICBkaXZpc29yW2ldID0gcmhzU2lnbmlmaWNhbmRbaV07CisgICAgbGhzU2lnbmlmaWNhbmRbaV0gPSAwOworICB9CisKKyAgZXhwb25lbnQgLT0gcmhzLmV4cG9uZW50OworCisgIHVuc2lnbmVkIGludCBwcmVjaXNpb24gPSBzZW1hbnRpY3MtPnByZWNpc2lvbjsKKworICAvKiBOb3JtYWxpemUgdGhlIGRpdmlzb3IuICAqLworICBiaXQgPSBwcmVjaXNpb24gLSBBUEludDo6dGNNU0IoZGl2aXNvciwgcGFydHNDb3VudCkgLSAxOworICBpZiAoYml0KSB7CisgICAgZXhwb25lbnQgKz0gYml0OworICAgIEFQSW50Ojp0Y1NoaWZ0TGVmdChkaXZpc29yLCBwYXJ0c0NvdW50LCBiaXQpOworICB9CisKKyAgLyogTm9ybWFsaXplIHRoZSBkaXZpZGVuZC4gICovCisgIGJpdCA9IHByZWNpc2lvbiAtIEFQSW50Ojp0Y01TQihkaXZpZGVuZCwgcGFydHNDb3VudCkgLSAxOworICBpZiAoYml0KSB7CisgICAgZXhwb25lbnQgLT0gYml0OworICAgIEFQSW50Ojp0Y1NoaWZ0TGVmdChkaXZpZGVuZCwgcGFydHNDb3VudCwgYml0KTsKKyAgfQorCisgIC8qIEVuc3VyZSB0aGUgZGl2aWRlbmQgPj0gZGl2aXNvciBpbml0aWFsbHkgZm9yIHRoZSBsb29wIGJlbG93LgorICAgICBJbmNpZGVudGFsbHksIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGl2aXNpb24gbG9vcCBiZWxvdyBpcworICAgICBndWFyYW50ZWVkIHRvIHNldCB0aGUgaW50ZWdlciBiaXQgdG8gb25lLiAgKi8KKyAgaWYgKEFQSW50Ojp0Y0NvbXBhcmUoZGl2aWRlbmQsIGRpdmlzb3IsIHBhcnRzQ291bnQpIDwgMCkgeworICAgIGV4cG9uZW50LS07CisgICAgQVBJbnQ6OnRjU2hpZnRMZWZ0KGRpdmlkZW5kLCBwYXJ0c0NvdW50LCAxKTsKKyAgICBhc3NlcnQoQVBJbnQ6OnRjQ29tcGFyZShkaXZpZGVuZCwgZGl2aXNvciwgcGFydHNDb3VudCkgPj0gMCk7CisgIH0KKworICAvKiBMb25nIGRpdmlzaW9uLiAgKi8KKyAgZm9yIChiaXQgPSBwcmVjaXNpb247IGJpdDsgYml0IC09IDEpIHsKKyAgICBpZiAoQVBJbnQ6OnRjQ29tcGFyZShkaXZpZGVuZCwgZGl2aXNvciwgcGFydHNDb3VudCkgPj0gMCkgeworICAgICAgQVBJbnQ6OnRjU3VidHJhY3QoZGl2aWRlbmQsIGRpdmlzb3IsIDAsIHBhcnRzQ291bnQpOworICAgICAgQVBJbnQ6OnRjU2V0Qml0KGxoc1NpZ25pZmljYW5kLCBiaXQgLSAxKTsKKyAgICB9CisKKyAgICBBUEludDo6dGNTaGlmdExlZnQoZGl2aWRlbmQsIHBhcnRzQ291bnQsIDEpOworICB9CisKKyAgLyogRmlndXJlIG91dCB0aGUgbG9zdCBmcmFjdGlvbi4gICovCisgIGludCBjbXAgPSBBUEludDo6dGNDb21wYXJlKGRpdmlkZW5kLCBkaXZpc29yLCBwYXJ0c0NvdW50KTsKKworICBpZiAoY21wID4gMCkKKyAgICBsb3N0X2ZyYWN0aW9uID0gbGZNb3JlVGhhbkhhbGY7CisgIGVsc2UgaWYgKGNtcCA9PSAwKQorICAgIGxvc3RfZnJhY3Rpb24gPSBsZkV4YWN0bHlIYWxmOworICBlbHNlIGlmIChBUEludDo6dGNJc1plcm8oZGl2aWRlbmQsIHBhcnRzQ291bnQpKQorICAgIGxvc3RfZnJhY3Rpb24gPSBsZkV4YWN0bHlaZXJvOworICBlbHNlCisgICAgbG9zdF9mcmFjdGlvbiA9IGxmTGVzc1RoYW5IYWxmOworCisgIGlmIChwYXJ0c0NvdW50ID4gMikKKyAgICBkZWxldGUgW10gZGl2aWRlbmQ7CisKKyAgcmV0dXJuIGxvc3RfZnJhY3Rpb247Cit9CisKK3Vuc2lnbmVkIGludAorQVBGbG9hdDo6c2lnbmlmaWNhbmRNU0IoKSBjb25zdAoreworICByZXR1cm4gQVBJbnQ6OnRjTVNCKHNpZ25pZmljYW5kUGFydHMoKSwgcGFydENvdW50KCkpOworfQorCit1bnNpZ25lZCBpbnQKK0FQRmxvYXQ6OnNpZ25pZmljYW5kTFNCKCkgY29uc3QKK3sKKyAgcmV0dXJuIEFQSW50Ojp0Y0xTQihzaWduaWZpY2FuZFBhcnRzKCksIHBhcnRDb3VudCgpKTsKK30KKworLyogTm90ZSB0aGF0IGEgemVybyByZXN1bHQgaXMgTk9UIG5vcm1hbGl6ZWQgdG8gZmNaZXJvLiAgKi8KK2xvc3RGcmFjdGlvbgorQVBGbG9hdDo6c2hpZnRTaWduaWZpY2FuZFJpZ2h0KHVuc2lnbmVkIGludCBiaXRzKQoreworICAvKiBPdXIgZXhwb25lbnQgc2hvdWxkIG5vdCBvdmVyZmxvdy4gICovCisgIGFzc2VydCgoZXhwb25lbnRfdCkgKGV4cG9uZW50ICsgYml0cykgPj0gZXhwb25lbnQpOworCisgIGV4cG9uZW50ICs9IGJpdHM7CisKKyAgcmV0dXJuIHNoaWZ0UmlnaHQoc2lnbmlmaWNhbmRQYXJ0cygpLCBwYXJ0Q291bnQoKSwgYml0cyk7Cit9CisKKy8qIFNoaWZ0IHRoZSBzaWduaWZpY2FuZCBsZWZ0IEJJVFMgYml0cywgc3VidHJhY3QgQklUUyBmcm9tIGl0cyBleHBvbmVudC4gICovCit2b2lkCitBUEZsb2F0OjpzaGlmdFNpZ25pZmljYW5kTGVmdCh1bnNpZ25lZCBpbnQgYml0cykKK3sKKyAgYXNzZXJ0KGJpdHMgPCBzZW1hbnRpY3MtPnByZWNpc2lvbik7CisKKyAgaWYgKGJpdHMpIHsKKyAgICB1bnNpZ25lZCBpbnQgcGFydHNDb3VudCA9IHBhcnRDb3VudCgpOworCisgICAgQVBJbnQ6OnRjU2hpZnRMZWZ0KHNpZ25pZmljYW5kUGFydHMoKSwgcGFydHNDb3VudCwgYml0cyk7CisgICAgZXhwb25lbnQgLT0gYml0czsKKworICAgIGFzc2VydCghQVBJbnQ6OnRjSXNaZXJvKHNpZ25pZmljYW5kUGFydHMoKSwgcGFydHNDb3VudCkpOworICB9Cit9CisKK0FQRmxvYXQ6OmNtcFJlc3VsdAorQVBGbG9hdDo6Y29tcGFyZUFic29sdXRlVmFsdWUoY29uc3QgQVBGbG9hdCAmcmhzKSBjb25zdAoreworICBpbnQgY29tcGFyZTsKKworICBhc3NlcnQoc2VtYW50aWNzID09IHJocy5zZW1hbnRpY3MpOworICBhc3NlcnQoY2F0ZWdvcnkgPT0gZmNOb3JtYWwpOworICBhc3NlcnQocmhzLmNhdGVnb3J5ID09IGZjTm9ybWFsKTsKKworICBjb21wYXJlID0gZXhwb25lbnQgLSByaHMuZXhwb25lbnQ7CisKKyAgLyogSWYgZXhwb25lbnRzIGFyZSBlcXVhbCwgZG8gYW4gdW5zaWduZWQgYmlnbnVtIGNvbXBhcmlzb24gb2YgdGhlCisgICAgIHNpZ25pZmljYW5kcy4gICovCisgIGlmIChjb21wYXJlID09IDApCisgICAgY29tcGFyZSA9IEFQSW50Ojp0Y0NvbXBhcmUoc2lnbmlmaWNhbmRQYXJ0cygpLCByaHMuc2lnbmlmaWNhbmRQYXJ0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRDb3VudCgpKTsKKworICBpZiAoY29tcGFyZSA+IDApCisgICAgcmV0dXJuIGNtcEdyZWF0ZXJUaGFuOworICBlbHNlIGlmIChjb21wYXJlIDwgMCkKKyAgICByZXR1cm4gY21wTGVzc1RoYW47CisgIGVsc2UKKyAgICByZXR1cm4gY21wRXF1YWw7Cit9CisKKy8qIEhhbmRsZSBvdmVyZmxvdy4gIFNpZ24gaXMgcHJlc2VydmVkLiAgV2UgZWl0aGVyIGJlY29tZSBpbmZpbml0eSBvcgorICAgdGhlIGxhcmdlc3QgZmluaXRlIG51bWJlci4gICovCitBUEZsb2F0OjpvcFN0YXR1cworQVBGbG9hdDo6aGFuZGxlT3ZlcmZsb3cocm91bmRpbmdNb2RlIHJvdW5kaW5nX21vZGUpCit7CisgIC8qIEluZmluaXR5PyAgKi8KKyAgaWYgKHJvdW5kaW5nX21vZGUgPT0gcm1OZWFyZXN0VGllc1RvRXZlbiB8fAorICAgICAgcm91bmRpbmdfbW9kZSA9PSBybU5lYXJlc3RUaWVzVG9Bd2F5IHx8CisgICAgICAocm91bmRpbmdfbW9kZSA9PSBybVRvd2FyZFBvc2l0aXZlICYmICFzaWduKSB8fAorICAgICAgKHJvdW5kaW5nX21vZGUgPT0gcm1Ub3dhcmROZWdhdGl2ZSAmJiBzaWduKSkgeworICAgIGNhdGVnb3J5ID0gZmNJbmZpbml0eTsKKyAgICByZXR1cm4gKG9wU3RhdHVzKSAob3BPdmVyZmxvdyB8IG9wSW5leGFjdCk7CisgIH0KKworICAvKiBPdGhlcndpc2Ugd2UgYmVjb21lIHRoZSBsYXJnZXN0IGZpbml0ZSBudW1iZXIuICAqLworICBjYXRlZ29yeSA9IGZjTm9ybWFsOworICBleHBvbmVudCA9IHNlbWFudGljcy0+bWF4RXhwb25lbnQ7CisgIEFQSW50Ojp0Y1NldExlYXN0U2lnbmlmaWNhbnRCaXRzKHNpZ25pZmljYW5kUGFydHMoKSwgcGFydENvdW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljcy0+cHJlY2lzaW9uKTsKKworICByZXR1cm4gb3BJbmV4YWN0OworfQorCisvKiBSZXR1cm5zIFRSVUUgaWYsIHdoZW4gdHJ1bmNhdGluZyB0aGUgY3VycmVudCBudW1iZXIsIHdpdGggQklUIHRoZQorICAgbmV3IExTQiwgd2l0aCB0aGUgZ2l2ZW4gbG9zdCBmcmFjdGlvbiBhbmQgcm91bmRpbmcgbW9kZSwgdGhlIHJlc3VsdAorICAgd291bGQgbmVlZCB0byBiZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvIChpLmUuLCBieSBpbmNyZWFzaW5nIHRoZQorICAgc2lnbmZpY2FuZCkuICBUaGlzIHJvdXRpbmUgbXVzdCB3b3JrIGZvciBmY1plcm8gb2YgYm90aCBzaWducywgYW5kCisgICBmY05vcm1hbCBudW1iZXJzLiAgKi8KK2Jvb2wKK0FQRmxvYXQ6OnJvdW5kQXdheUZyb21aZXJvKHJvdW5kaW5nTW9kZSByb3VuZGluZ19tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zdEZyYWN0aW9uIGxvc3RfZnJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYml0KSBjb25zdAoreworICAvKiBOYU5zIGFuZCBpbmZpbml0aWVzIHNob3VsZCBub3QgaGF2ZSBsb3N0IGZyYWN0aW9ucy4gICovCisgIGFzc2VydChjYXRlZ29yeSA9PSBmY05vcm1hbCB8fCBjYXRlZ29yeSA9PSBmY1plcm8pOworCisgIC8qIEN1cnJlbnQgY2FsbGVycyBuZXZlciBwYXNzIHRoaXMgc28gd2UgZG9uJ3QgaGFuZGxlIGl0LiAgKi8KKyAgYXNzZXJ0KGxvc3RfZnJhY3Rpb24gIT0gbGZFeGFjdGx5WmVybyk7CisKKyAgc3dpdGNoIChyb3VuZGluZ19tb2RlKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKworICBjYXNlIHJtTmVhcmVzdFRpZXNUb0F3YXk6CisgICAgcmV0dXJuIGxvc3RfZnJhY3Rpb24gPT0gbGZFeGFjdGx5SGFsZiB8fCBsb3N0X2ZyYWN0aW9uID09IGxmTW9yZVRoYW5IYWxmOworCisgIGNhc2Ugcm1OZWFyZXN0VGllc1RvRXZlbjoKKyAgICBpZiAobG9zdF9mcmFjdGlvbiA9PSBsZk1vcmVUaGFuSGFsZikKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLyogT3VyIHplcm9lcyBkb24ndCBoYXZlIGEgc2lnbmlmaWNhbmQgdG8gdGVzdC4gICovCisgICAgaWYgKGxvc3RfZnJhY3Rpb24gPT0gbGZFeGFjdGx5SGFsZiAmJiBjYXRlZ29yeSAhPSBmY1plcm8pCisgICAgICByZXR1cm4gQVBJbnQ6OnRjRXh0cmFjdEJpdChzaWduaWZpY2FuZFBhcnRzKCksIGJpdCk7CisKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY2FzZSBybVRvd2FyZFplcm86CisgICAgcmV0dXJuIGZhbHNlOworCisgIGNhc2Ugcm1Ub3dhcmRQb3NpdGl2ZToKKyAgICByZXR1cm4gc2lnbiA9PSBmYWxzZTsKKworICBjYXNlIHJtVG93YXJkTmVnYXRpdmU6CisgICAgcmV0dXJuIHNpZ24gPT0gdHJ1ZTsKKyAgfQorfQorCitBUEZsb2F0OjpvcFN0YXR1cworQVBGbG9hdDo6bm9ybWFsaXplKHJvdW5kaW5nTW9kZSByb3VuZGluZ19tb2RlLAorICAgICAgICAgICAgICAgICAgIGxvc3RGcmFjdGlvbiBsb3N0X2ZyYWN0aW9uKQoreworICB1bnNpZ25lZCBpbnQgb21zYjsgICAgICAgICAgICAgICAgLyogT25lLCBub3QgemVybywgYmFzZWQgTVNCLiAgKi8KKyAgaW50IGV4cG9uZW50Q2hhbmdlOworCisgIGlmIChjYXRlZ29yeSAhPSBmY05vcm1hbCkKKyAgICByZXR1cm4gb3BPSzsKKworICAvKiBCZWZvcmUgcm91bmRpbmcgbm9ybWFsaXplIHRoZSBleHBvbmVudCBvZiBmY05vcm1hbCBudW1iZXJzLiAgKi8KKyAgb21zYiA9IHNpZ25pZmljYW5kTVNCKCkgKyAxOworCisgIGlmIChvbXNiKSB7CisgICAgLyogT01TQiBpcyBudW1iZXJlZCBmcm9tIDEuICBXZSB3YW50IHRvIHBsYWNlIGl0IGluIHRoZSBpbnRlZ2VyCisgICAgICAgYml0IG51bWJlcmVkIFBSRUNJU09OIGlmIHBvc3NpYmxlLCB3aXRoIGEgY29tcGVuc2F0aW5nIGNoYW5nZSBpbgorICAgICAgIHRoZSBleHBvbmVudC4gICovCisgICAgZXhwb25lbnRDaGFuZ2UgPSBvbXNiIC0gc2VtYW50aWNzLT5wcmVjaXNpb247CisKKyAgICAvKiBJZiB0aGUgcmVzdWx0aW5nIGV4cG9uZW50IGlzIHRvbyBoaWdoLCBvdmVyZmxvdyBhY2NvcmRpbmcgdG8KKyAgICAgICB0aGUgcm91bmRpbmcgbW9kZS4gICovCisgICAgaWYgKGV4cG9uZW50ICsgZXhwb25lbnRDaGFuZ2UgPiBzZW1hbnRpY3MtPm1heEV4cG9uZW50KQorICAgICAgcmV0dXJuIGhhbmRsZU92ZXJmbG93KHJvdW5kaW5nX21vZGUpOworCisgICAgLyogU3Vibm9ybWFsIG51bWJlcnMgaGF2ZSBleHBvbmVudCBtaW5FeHBvbmVudCwgYW5kIHRoZWlyIE1TQgorICAgICAgIGlzIGZvcmNlZCBiYXNlZCBvbiB0aGF0LiAgKi8KKyAgICBpZiAoZXhwb25lbnQgKyBleHBvbmVudENoYW5nZSA8IHNlbWFudGljcy0+bWluRXhwb25lbnQpCisgICAgICBleHBvbmVudENoYW5nZSA9IHNlbWFudGljcy0+bWluRXhwb25lbnQgLSBleHBvbmVudDsKKworICAgIC8qIFNoaWZ0aW5nIGxlZnQgaXMgZWFzeSBhcyB3ZSBkb24ndCBsb3NlIHByZWNpc2lvbi4gICovCisgICAgaWYgKGV4cG9uZW50Q2hhbmdlIDwgMCkgeworICAgICAgYXNzZXJ0KGxvc3RfZnJhY3Rpb24gPT0gbGZFeGFjdGx5WmVybyk7CisKKyAgICAgIHNoaWZ0U2lnbmlmaWNhbmRMZWZ0KC1leHBvbmVudENoYW5nZSk7CisKKyAgICAgIHJldHVybiBvcE9LOworICAgIH0KKworICAgIGlmIChleHBvbmVudENoYW5nZSA+IDApIHsKKyAgICAgIGxvc3RGcmFjdGlvbiBsZjsKKworICAgICAgLyogU2hpZnQgcmlnaHQgYW5kIGNhcHR1cmUgYW55IG5ldyBsb3N0IGZyYWN0aW9uLiAgKi8KKyAgICAgIGxmID0gc2hpZnRTaWduaWZpY2FuZFJpZ2h0KGV4cG9uZW50Q2hhbmdlKTsKKworICAgICAgbG9zdF9mcmFjdGlvbiA9IGNvbWJpbmVMb3N0RnJhY3Rpb25zKGxmLCBsb3N0X2ZyYWN0aW9uKTsKKworICAgICAgLyogS2VlcCBPTVNCIHVwLXRvLWRhdGUuICAqLworICAgICAgaWYgKG9tc2IgPiAodW5zaWduZWQpIGV4cG9uZW50Q2hhbmdlKQorICAgICAgICBvbXNiIC09IGV4cG9uZW50Q2hhbmdlOworICAgICAgZWxzZQorICAgICAgICBvbXNiID0gMDsKKyAgICB9CisgIH0KKworICAvKiBOb3cgcm91bmQgdGhlIG51bWJlciBhY2NvcmRpbmcgdG8gcm91bmRpbmdfbW9kZSBnaXZlbiB0aGUgbG9zdAorICAgICBmcmFjdGlvbi4gICovCisKKyAgLyogQXMgc3BlY2lmaWVkIGluIElFRUUgNzU0LCBzaW5jZSB3ZSBkbyBub3QgdHJhcCB3ZSBkbyBub3QgcmVwb3J0CisgICAgIHVuZGVyZmxvdyBmb3IgZXhhY3QgcmVzdWx0cy4gICovCisgIGlmIChsb3N0X2ZyYWN0aW9uID09IGxmRXhhY3RseVplcm8pIHsKKyAgICAvKiBDYW5vbmljYWxpemUgemVyb2VzLiAgKi8KKyAgICBpZiAob21zYiA9PSAwKQorICAgICAgY2F0ZWdvcnkgPSBmY1plcm87CisKKyAgICByZXR1cm4gb3BPSzsKKyAgfQorCisgIC8qIEluY3JlbWVudCB0aGUgc2lnbmlmaWNhbmQgaWYgd2UncmUgcm91bmRpbmcgYXdheSBmcm9tIHplcm8uICAqLworICBpZiAocm91bmRBd2F5RnJvbVplcm8ocm91bmRpbmdfbW9kZSwgbG9zdF9mcmFjdGlvbiwgMCkpIHsKKyAgICBpZiAob21zYiA9PSAwKQorICAgICAgZXhwb25lbnQgPSBzZW1hbnRpY3MtPm1pbkV4cG9uZW50OworCisgICAgaW5jcmVtZW50U2lnbmlmaWNhbmQoKTsKKyAgICBvbXNiID0gc2lnbmlmaWNhbmRNU0IoKSArIDE7CisKKyAgICAvKiBEaWQgdGhlIHNpZ25pZmljYW5kIGluY3JlbWVudCBvdmVyZmxvdz8gICovCisgICAgaWYgKG9tc2IgPT0gKHVuc2lnbmVkKSBzZW1hbnRpY3MtPnByZWNpc2lvbiArIDEpIHsKKyAgICAgIC8qIFJlbm9ybWFsaXplIGJ5IGluY3JlbWVudGluZyB0aGUgZXhwb25lbnQgYW5kIHNoaWZ0aW5nIG91cgorICAgICAgICAgc2lnbmlmaWNhbmQgcmlnaHQgb25lLiAgSG93ZXZlciBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlCisgICAgICAgICBtYXhpbXVtIGV4cG9uZW50IHdlIG92ZXJmbG93IHRvIGluZmluaXR5LiAgKi8KKyAgICAgIGlmIChleHBvbmVudCA9PSBzZW1hbnRpY3MtPm1heEV4cG9uZW50KSB7CisgICAgICAgIGNhdGVnb3J5ID0gZmNJbmZpbml0eTsKKworICAgICAgICByZXR1cm4gKG9wU3RhdHVzKSAob3BPdmVyZmxvdyB8IG9wSW5leGFjdCk7CisgICAgICB9CisKKyAgICAgIHNoaWZ0U2lnbmlmaWNhbmRSaWdodCgxKTsKKworICAgICAgcmV0dXJuIG9wSW5leGFjdDsKKyAgICB9CisgIH0KKworICAvKiBUaGUgbm9ybWFsIGNhc2UgLSB3ZSB3ZXJlIGFuZCBhcmUgbm90IGRlbm9ybWFsLCBhbmQgYW55CisgICAgIHNpZ25pZmljYW5kIGluY3JlbWVudCBhYm92ZSBkaWRuJ3Qgb3ZlcmZsb3cuICAqLworICBpZiAob21zYiA9PSBzZW1hbnRpY3MtPnByZWNpc2lvbikKKyAgICByZXR1cm4gb3BJbmV4YWN0OworCisgIC8qIFdlIGhhdmUgYSBub24temVybyBkZW5vcm1hbC4gICovCisgIGFzc2VydChvbXNiIDwgc2VtYW50aWNzLT5wcmVjaXNpb24pOworCisgIC8qIENhbm9uaWNhbGl6ZSB6ZXJvZXMuICAqLworICBpZiAob21zYiA9PSAwKQorICAgIGNhdGVnb3J5ID0gZmNaZXJvOworCisgIC8qIFRoZSBmY1plcm8gY2FzZSBpcyBhIGRlbm9ybWFsIHRoYXQgdW5kZXJmbG93ZWQgdG8gemVyby4gICovCisgIHJldHVybiAob3BTdGF0dXMpIChvcFVuZGVyZmxvdyB8IG9wSW5leGFjdCk7Cit9CisKK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0OjphZGRPclN1YnRyYWN0U3BlY2lhbHMoY29uc3QgQVBGbG9hdCAmcmhzLCBib29sIHN1YnRyYWN0KQoreworICBzd2l0Y2ggKGNvbnZvbHZlKGNhdGVnb3J5LCByaHMuY2F0ZWdvcnkpKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKworICBjYXNlIGNvbnZvbHZlKGZjTmFOLCBmY1plcm8pOgorICBjYXNlIGNvbnZvbHZlKGZjTmFOLCBmY05vcm1hbCk6CisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjSW5maW5pdHkpOgorICBjYXNlIGNvbnZvbHZlKGZjTmFOLCBmY05hTik6CisgIGNhc2UgY29udm9sdmUoZmNOb3JtYWwsIGZjWmVybyk6CisgIGNhc2UgY29udm9sdmUoZmNJbmZpbml0eSwgZmNOb3JtYWwpOgorICBjYXNlIGNvbnZvbHZlKGZjSW5maW5pdHksIGZjWmVybyk6CisgICAgcmV0dXJuIG9wT0s7CisKKyAgY2FzZSBjb252b2x2ZShmY1plcm8sIGZjTmFOKToKKyAgY2FzZSBjb252b2x2ZShmY05vcm1hbCwgZmNOYU4pOgorICBjYXNlIGNvbnZvbHZlKGZjSW5maW5pdHksIGZjTmFOKToKKyAgICBjYXRlZ29yeSA9IGZjTmFOOworICAgIGNvcHlTaWduaWZpY2FuZChyaHMpOworICAgIHJldHVybiBvcE9LOworCisgIGNhc2UgY29udm9sdmUoZmNOb3JtYWwsIGZjSW5maW5pdHkpOgorICBjYXNlIGNvbnZvbHZlKGZjWmVybywgZmNJbmZpbml0eSk6CisgICAgY2F0ZWdvcnkgPSBmY0luZmluaXR5OworICAgIHNpZ24gPSByaHMuc2lnbiBeIHN1YnRyYWN0OworICAgIHJldHVybiBvcE9LOworCisgIGNhc2UgY29udm9sdmUoZmNaZXJvLCBmY05vcm1hbCk6CisgICAgYXNzaWduKHJocyk7CisgICAgc2lnbiA9IHJocy5zaWduIF4gc3VidHJhY3Q7CisgICAgcmV0dXJuIG9wT0s7CisKKyAgY2FzZSBjb252b2x2ZShmY1plcm8sIGZjWmVybyk6CisgICAgLyogU2lnbiBkZXBlbmRzIG9uIHJvdW5kaW5nIG1vZGU7IGhhbmRsZWQgYnkgY2FsbGVyLiAgKi8KKyAgICByZXR1cm4gb3BPSzsKKworICBjYXNlIGNvbnZvbHZlKGZjSW5maW5pdHksIGZjSW5maW5pdHkpOgorICAgIC8qIERpZmZlcmVudGx5IHNpZ25lZCBpbmZpbml0aWVzIGNhbiBvbmx5IGJlIHZhbGlkbHkKKyAgICAgICBzdWJ0cmFjdGVkLiAgKi8KKyAgICBpZiAoKChzaWduIF4gcmhzLnNpZ24pIT0wKSAhPSBzdWJ0cmFjdCkgeworICAgICAgbWFrZU5hTigpOworICAgICAgcmV0dXJuIG9wSW52YWxpZE9wOworICAgIH0KKworICAgIHJldHVybiBvcE9LOworCisgIGNhc2UgY29udm9sdmUoZmNOb3JtYWwsIGZjTm9ybWFsKToKKyAgICByZXR1cm4gb3BEaXZCeVplcm87CisgIH0KK30KKworLyogQWRkIG9yIHN1YnRyYWN0IHR3byBub3JtYWwgbnVtYmVycy4gICovCitsb3N0RnJhY3Rpb24KK0FQRmxvYXQ6OmFkZE9yU3VidHJhY3RTaWduaWZpY2FuZChjb25zdCBBUEZsb2F0ICZyaHMsIGJvb2wgc3VidHJhY3QpCit7CisgIGludGVnZXJQYXJ0IGNhcnJ5OworICBsb3N0RnJhY3Rpb24gbG9zdF9mcmFjdGlvbjsKKyAgaW50IGJpdHM7CisKKyAgLyogRGV0ZXJtaW5lIGlmIHRoZSBvcGVyYXRpb24gb24gdGhlIGFic29sdXRlIHZhbHVlcyBpcyBlZmZlY3RpdmVseQorICAgICBhbiBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbi4gICovCisgIHN1YnRyYWN0IF49IChzaWduIF4gcmhzLnNpZ24pID8gdHJ1ZSA6IGZhbHNlOworCisgIC8qIEFyZSB3ZSBiaWdnZXIgZXhwb25lbnQtd2lzZSB0aGFuIHRoZSBSSFM/ICAqLworICBiaXRzID0gZXhwb25lbnQgLSByaHMuZXhwb25lbnQ7CisKKyAgLyogU3VidHJhY3Rpb24gaXMgbW9yZSBzdWJ0bGUgdGhhbiBvbmUgbWlnaHQgbmFpdmVseSBleHBlY3QuICAqLworICBpZiAoc3VidHJhY3QpIHsKKyAgICBBUEZsb2F0IHRlbXBfcmhzKHJocyk7CisgICAgYm9vbCByZXZlcnNlOworCisgICAgaWYgKGJpdHMgPT0gMCkgeworICAgICAgcmV2ZXJzZSA9IGNvbXBhcmVBYnNvbHV0ZVZhbHVlKHRlbXBfcmhzKSA9PSBjbXBMZXNzVGhhbjsKKyAgICAgIGxvc3RfZnJhY3Rpb24gPSBsZkV4YWN0bHlaZXJvOworICAgIH0gZWxzZSBpZiAoYml0cyA+IDApIHsKKyAgICAgIGxvc3RfZnJhY3Rpb24gPSB0ZW1wX3Jocy5zaGlmdFNpZ25pZmljYW5kUmlnaHQoYml0cyAtIDEpOworICAgICAgc2hpZnRTaWduaWZpY2FuZExlZnQoMSk7CisgICAgICByZXZlcnNlID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGxvc3RfZnJhY3Rpb24gPSBzaGlmdFNpZ25pZmljYW5kUmlnaHQoLWJpdHMgLSAxKTsKKyAgICAgIHRlbXBfcmhzLnNoaWZ0U2lnbmlmaWNhbmRMZWZ0KDEpOworICAgICAgcmV2ZXJzZSA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHJldmVyc2UpIHsKKyAgICAgIGNhcnJ5ID0gdGVtcF9yaHMuc3VidHJhY3RTaWduaWZpY2FuZAorICAgICAgICAoKnRoaXMsIGxvc3RfZnJhY3Rpb24gIT0gbGZFeGFjdGx5WmVybyk7CisgICAgICBjb3B5U2lnbmlmaWNhbmQodGVtcF9yaHMpOworICAgICAgc2lnbiA9ICFzaWduOworICAgIH0gZWxzZSB7CisgICAgICBjYXJyeSA9IHN1YnRyYWN0U2lnbmlmaWNhbmQKKyAgICAgICAgKHRlbXBfcmhzLCBsb3N0X2ZyYWN0aW9uICE9IGxmRXhhY3RseVplcm8pOworICAgIH0KKworICAgIC8qIEludmVydCB0aGUgbG9zdCBmcmFjdGlvbiAtIGl0IHdhcyBvbiB0aGUgUkhTIGFuZAorICAgICAgIHN1YnRyYWN0ZWQuICAqLworICAgIGlmIChsb3N0X2ZyYWN0aW9uID09IGxmTGVzc1RoYW5IYWxmKQorICAgICAgbG9zdF9mcmFjdGlvbiA9IGxmTW9yZVRoYW5IYWxmOworICAgIGVsc2UgaWYgKGxvc3RfZnJhY3Rpb24gPT0gbGZNb3JlVGhhbkhhbGYpCisgICAgICBsb3N0X2ZyYWN0aW9uID0gbGZMZXNzVGhhbkhhbGY7CisKKyAgICAvKiBUaGUgY29kZSBhYm92ZSBpcyBpbnRlbmRlZCB0byBlbnN1cmUgdGhhdCBubyBib3Jyb3cgaXMKKyAgICAgICBuZWNlc3NhcnkuICAqLworICAgIGFzc2VydCghY2FycnkpOworICB9IGVsc2UgeworICAgIGlmIChiaXRzID4gMCkgeworICAgICAgQVBGbG9hdCB0ZW1wX3JocyhyaHMpOworCisgICAgICBsb3N0X2ZyYWN0aW9uID0gdGVtcF9yaHMuc2hpZnRTaWduaWZpY2FuZFJpZ2h0KGJpdHMpOworICAgICAgY2FycnkgPSBhZGRTaWduaWZpY2FuZCh0ZW1wX3Jocyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxvc3RfZnJhY3Rpb24gPSBzaGlmdFNpZ25pZmljYW5kUmlnaHQoLWJpdHMpOworICAgICAgY2FycnkgPSBhZGRTaWduaWZpY2FuZChyaHMpOworICAgIH0KKworICAgIC8qIFdlIGhhdmUgYSBndWFyZCBiaXQ7IGdlbmVyYXRpbmcgYSBjYXJyeSBjYW5ub3QgaGFwcGVuLiAgKi8KKyAgICBhc3NlcnQoIWNhcnJ5KTsKKyAgfQorCisgIHJldHVybiBsb3N0X2ZyYWN0aW9uOworfQorCitBUEZsb2F0OjpvcFN0YXR1cworQVBGbG9hdDo6bXVsdGlwbHlTcGVjaWFscyhjb25zdCBBUEZsb2F0ICZyaHMpCit7CisgIHN3aXRjaCAoY29udm9sdmUoY2F0ZWdvcnksIHJocy5jYXRlZ29yeSkpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworCisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjWmVybyk6CisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjTm9ybWFsKToKKyAgY2FzZSBjb252b2x2ZShmY05hTiwgZmNJbmZpbml0eSk6CisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjTmFOKToKKyAgICByZXR1cm4gb3BPSzsKKworICBjYXNlIGNvbnZvbHZlKGZjWmVybywgZmNOYU4pOgorICBjYXNlIGNvbnZvbHZlKGZjTm9ybWFsLCBmY05hTik6CisgIGNhc2UgY29udm9sdmUoZmNJbmZpbml0eSwgZmNOYU4pOgorICAgIGNhdGVnb3J5ID0gZmNOYU47CisgICAgY29weVNpZ25pZmljYW5kKHJocyk7CisgICAgcmV0dXJuIG9wT0s7CisKKyAgY2FzZSBjb252b2x2ZShmY05vcm1hbCwgZmNJbmZpbml0eSk6CisgIGNhc2UgY29udm9sdmUoZmNJbmZpbml0eSwgZmNOb3JtYWwpOgorICBjYXNlIGNvbnZvbHZlKGZjSW5maW5pdHksIGZjSW5maW5pdHkpOgorICAgIGNhdGVnb3J5ID0gZmNJbmZpbml0eTsKKyAgICByZXR1cm4gb3BPSzsKKworICBjYXNlIGNvbnZvbHZlKGZjWmVybywgZmNOb3JtYWwpOgorICBjYXNlIGNvbnZvbHZlKGZjTm9ybWFsLCBmY1plcm8pOgorICBjYXNlIGNvbnZvbHZlKGZjWmVybywgZmNaZXJvKToKKyAgICBjYXRlZ29yeSA9IGZjWmVybzsKKyAgICByZXR1cm4gb3BPSzsKKworICBjYXNlIGNvbnZvbHZlKGZjWmVybywgZmNJbmZpbml0eSk6CisgIGNhc2UgY29udm9sdmUoZmNJbmZpbml0eSwgZmNaZXJvKToKKyAgICBtYWtlTmFOKCk7CisgICAgcmV0dXJuIG9wSW52YWxpZE9wOworCisgIGNhc2UgY29udm9sdmUoZmNOb3JtYWwsIGZjTm9ybWFsKToKKyAgICByZXR1cm4gb3BPSzsKKyAgfQorfQorCitBUEZsb2F0OjpvcFN0YXR1cworQVBGbG9hdDo6ZGl2aWRlU3BlY2lhbHMoY29uc3QgQVBGbG9hdCAmcmhzKQoreworICBzd2l0Y2ggKGNvbnZvbHZlKGNhdGVnb3J5LCByaHMuY2F0ZWdvcnkpKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKworICBjYXNlIGNvbnZvbHZlKGZjTmFOLCBmY1plcm8pOgorICBjYXNlIGNvbnZvbHZlKGZjTmFOLCBmY05vcm1hbCk6CisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjSW5maW5pdHkpOgorICBjYXNlIGNvbnZvbHZlKGZjTmFOLCBmY05hTik6CisgIGNhc2UgY29udm9sdmUoZmNJbmZpbml0eSwgZmNaZXJvKToKKyAgY2FzZSBjb252b2x2ZShmY0luZmluaXR5LCBmY05vcm1hbCk6CisgIGNhc2UgY29udm9sdmUoZmNaZXJvLCBmY0luZmluaXR5KToKKyAgY2FzZSBjb252b2x2ZShmY1plcm8sIGZjTm9ybWFsKToKKyAgICByZXR1cm4gb3BPSzsKKworICBjYXNlIGNvbnZvbHZlKGZjWmVybywgZmNOYU4pOgorICBjYXNlIGNvbnZvbHZlKGZjTm9ybWFsLCBmY05hTik6CisgIGNhc2UgY29udm9sdmUoZmNJbmZpbml0eSwgZmNOYU4pOgorICAgIGNhdGVnb3J5ID0gZmNOYU47CisgICAgY29weVNpZ25pZmljYW5kKHJocyk7CisgICAgcmV0dXJuIG9wT0s7CisKKyAgY2FzZSBjb252b2x2ZShmY05vcm1hbCwgZmNJbmZpbml0eSk6CisgICAgY2F0ZWdvcnkgPSBmY1plcm87CisgICAgcmV0dXJuIG9wT0s7CisKKyAgY2FzZSBjb252b2x2ZShmY05vcm1hbCwgZmNaZXJvKToKKyAgICBjYXRlZ29yeSA9IGZjSW5maW5pdHk7CisgICAgcmV0dXJuIG9wRGl2QnlaZXJvOworCisgIGNhc2UgY29udm9sdmUoZmNJbmZpbml0eSwgZmNJbmZpbml0eSk6CisgIGNhc2UgY29udm9sdmUoZmNaZXJvLCBmY1plcm8pOgorICAgIG1ha2VOYU4oKTsKKyAgICByZXR1cm4gb3BJbnZhbGlkT3A7CisKKyAgY2FzZSBjb252b2x2ZShmY05vcm1hbCwgZmNOb3JtYWwpOgorICAgIHJldHVybiBvcE9LOworICB9Cit9CisKK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0Ojptb2RTcGVjaWFscyhjb25zdCBBUEZsb2F0ICZyaHMpCit7CisgIHN3aXRjaCAoY29udm9sdmUoY2F0ZWdvcnksIHJocy5jYXRlZ29yeSkpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworCisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjWmVybyk6CisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjTm9ybWFsKToKKyAgY2FzZSBjb252b2x2ZShmY05hTiwgZmNJbmZpbml0eSk6CisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjTmFOKToKKyAgY2FzZSBjb252b2x2ZShmY1plcm8sIGZjSW5maW5pdHkpOgorICBjYXNlIGNvbnZvbHZlKGZjWmVybywgZmNOb3JtYWwpOgorICBjYXNlIGNvbnZvbHZlKGZjTm9ybWFsLCBmY0luZmluaXR5KToKKyAgICByZXR1cm4gb3BPSzsKKworICBjYXNlIGNvbnZvbHZlKGZjWmVybywgZmNOYU4pOgorICBjYXNlIGNvbnZvbHZlKGZjTm9ybWFsLCBmY05hTik6CisgIGNhc2UgY29udm9sdmUoZmNJbmZpbml0eSwgZmNOYU4pOgorICAgIGNhdGVnb3J5ID0gZmNOYU47CisgICAgY29weVNpZ25pZmljYW5kKHJocyk7CisgICAgcmV0dXJuIG9wT0s7CisKKyAgY2FzZSBjb252b2x2ZShmY05vcm1hbCwgZmNaZXJvKToKKyAgY2FzZSBjb252b2x2ZShmY0luZmluaXR5LCBmY1plcm8pOgorICBjYXNlIGNvbnZvbHZlKGZjSW5maW5pdHksIGZjTm9ybWFsKToKKyAgY2FzZSBjb252b2x2ZShmY0luZmluaXR5LCBmY0luZmluaXR5KToKKyAgY2FzZSBjb252b2x2ZShmY1plcm8sIGZjWmVybyk6CisgICAgbWFrZU5hTigpOworICAgIHJldHVybiBvcEludmFsaWRPcDsKKworICBjYXNlIGNvbnZvbHZlKGZjTm9ybWFsLCBmY05vcm1hbCk6CisgICAgcmV0dXJuIG9wT0s7CisgIH0KK30KKworLyogQ2hhbmdlIHNpZ24uICAqLwordm9pZAorQVBGbG9hdDo6Y2hhbmdlU2lnbigpCit7CisgIC8qIExvb2sgbXVtbXksIHRoaXMgb25lJ3MgZWFzeS4gICovCisgIHNpZ24gPSAhc2lnbjsKK30KKwordm9pZAorQVBGbG9hdDo6Y2xlYXJTaWduKCkKK3sKKyAgLyogU28gaXMgdGhpcyBvbmUuICovCisgIHNpZ24gPSAwOworfQorCit2b2lkCitBUEZsb2F0Ojpjb3B5U2lnbihjb25zdCBBUEZsb2F0ICZyaHMpCit7CisgIC8qIEFuZCB0aGlzIG9uZS4gKi8KKyAgc2lnbiA9IHJocy5zaWduOworfQorCisvKiBOb3JtYWxpemVkIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uLiAgKi8KK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0OjphZGRPclN1YnRyYWN0KGNvbnN0IEFQRmxvYXQgJnJocywgcm91bmRpbmdNb2RlIHJvdW5kaW5nX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VidHJhY3QpCit7CisgIG9wU3RhdHVzIGZzOworCisgIGFzc2VydEFyaXRobWV0aWNPSygqc2VtYW50aWNzKTsKKworICBmcyA9IGFkZE9yU3VidHJhY3RTcGVjaWFscyhyaHMsIHN1YnRyYWN0KTsKKworICAvKiBUaGlzIHJldHVybiBjb2RlIG1lYW5zIGl0IHdhcyBub3QgYSBzaW1wbGUgY2FzZS4gICovCisgIGlmIChmcyA9PSBvcERpdkJ5WmVybykgeworICAgIGxvc3RGcmFjdGlvbiBsb3N0X2ZyYWN0aW9uOworCisgICAgbG9zdF9mcmFjdGlvbiA9IGFkZE9yU3VidHJhY3RTaWduaWZpY2FuZChyaHMsIHN1YnRyYWN0KTsKKyAgICBmcyA9IG5vcm1hbGl6ZShyb3VuZGluZ19tb2RlLCBsb3N0X2ZyYWN0aW9uKTsKKworICAgIC8qIENhbiBvbmx5IGJlIHplcm8gaWYgd2UgbG9zdCBubyBmcmFjdGlvbi4gICovCisgICAgYXNzZXJ0KGNhdGVnb3J5ICE9IGZjWmVybyB8fCBsb3N0X2ZyYWN0aW9uID09IGxmRXhhY3RseVplcm8pOworICB9CisKKyAgLyogSWYgdHdvIG51bWJlcnMgYWRkIChleGFjdGx5KSB0byB6ZXJvLCBJRUVFIDc1NCBkZWNyZWVzIGl0IGlzIGEKKyAgICAgcG9zaXRpdmUgemVybyB1bmxlc3Mgcm91bmRpbmcgdG8gbWludXMgaW5maW5pdHksIGV4Y2VwdCB0aGF0CisgICAgIGFkZGluZyB0d28gbGlrZS1zaWduZWQgemVyb2VzIGdpdmVzIHRoYXQgemVyby4gICovCisgIGlmIChjYXRlZ29yeSA9PSBmY1plcm8pIHsKKyAgICBpZiAocmhzLmNhdGVnb3J5ICE9IGZjWmVybyB8fCAoc2lnbiA9PSByaHMuc2lnbikgPT0gc3VidHJhY3QpCisgICAgICBzaWduID0gKHJvdW5kaW5nX21vZGUgPT0gcm1Ub3dhcmROZWdhdGl2ZSk7CisgIH0KKworICByZXR1cm4gZnM7Cit9CisKKy8qIE5vcm1hbGl6ZWQgYWRkaXRpb24uICAqLworQVBGbG9hdDo6b3BTdGF0dXMKK0FQRmxvYXQ6OmFkZChjb25zdCBBUEZsb2F0ICZyaHMsIHJvdW5kaW5nTW9kZSByb3VuZGluZ19tb2RlKQoreworICByZXR1cm4gYWRkT3JTdWJ0cmFjdChyaHMsIHJvdW5kaW5nX21vZGUsIGZhbHNlKTsKK30KKworLyogTm9ybWFsaXplZCBzdWJ0cmFjdGlvbi4gICovCitBUEZsb2F0OjpvcFN0YXR1cworQVBGbG9hdDo6c3VidHJhY3QoY29uc3QgQVBGbG9hdCAmcmhzLCByb3VuZGluZ01vZGUgcm91bmRpbmdfbW9kZSkKK3sKKyAgcmV0dXJuIGFkZE9yU3VidHJhY3QocmhzLCByb3VuZGluZ19tb2RlLCB0cnVlKTsKK30KKworLyogTm9ybWFsaXplZCBtdWx0aXBseS4gICovCitBUEZsb2F0OjpvcFN0YXR1cworQVBGbG9hdDo6bXVsdGlwbHkoY29uc3QgQVBGbG9hdCAmcmhzLCByb3VuZGluZ01vZGUgcm91bmRpbmdfbW9kZSkKK3sKKyAgb3BTdGF0dXMgZnM7CisKKyAgYXNzZXJ0QXJpdGhtZXRpY09LKCpzZW1hbnRpY3MpOworICBzaWduIF49IHJocy5zaWduOworICBmcyA9IG11bHRpcGx5U3BlY2lhbHMocmhzKTsKKworICBpZiAoY2F0ZWdvcnkgPT0gZmNOb3JtYWwpIHsKKyAgICBsb3N0RnJhY3Rpb24gbG9zdF9mcmFjdGlvbiA9IG11bHRpcGx5U2lnbmlmaWNhbmQocmhzLCAwKTsKKyAgICBmcyA9IG5vcm1hbGl6ZShyb3VuZGluZ19tb2RlLCBsb3N0X2ZyYWN0aW9uKTsKKyAgICBpZiAobG9zdF9mcmFjdGlvbiAhPSBsZkV4YWN0bHlaZXJvKQorICAgICAgZnMgPSAob3BTdGF0dXMpIChmcyB8IG9wSW5leGFjdCk7CisgIH0KKworICByZXR1cm4gZnM7Cit9CisKKy8qIE5vcm1hbGl6ZWQgZGl2aWRlLiAgKi8KK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0OjpkaXZpZGUoY29uc3QgQVBGbG9hdCAmcmhzLCByb3VuZGluZ01vZGUgcm91bmRpbmdfbW9kZSkKK3sKKyAgb3BTdGF0dXMgZnM7CisKKyAgYXNzZXJ0QXJpdGhtZXRpY09LKCpzZW1hbnRpY3MpOworICBzaWduIF49IHJocy5zaWduOworICBmcyA9IGRpdmlkZVNwZWNpYWxzKHJocyk7CisKKyAgaWYgKGNhdGVnb3J5ID09IGZjTm9ybWFsKSB7CisgICAgbG9zdEZyYWN0aW9uIGxvc3RfZnJhY3Rpb24gPSBkaXZpZGVTaWduaWZpY2FuZChyaHMpOworICAgIGZzID0gbm9ybWFsaXplKHJvdW5kaW5nX21vZGUsIGxvc3RfZnJhY3Rpb24pOworICAgIGlmIChsb3N0X2ZyYWN0aW9uICE9IGxmRXhhY3RseVplcm8pCisgICAgICBmcyA9IChvcFN0YXR1cykgKGZzIHwgb3BJbmV4YWN0KTsKKyAgfQorCisgIHJldHVybiBmczsKK30KKworLyogTm9ybWFsaXplZCByZW1haW5kZXIuICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgY29ycmVjdCBpbiBhbGwgY2FzZXMuICAqLworQVBGbG9hdDo6b3BTdGF0dXMKK0FQRmxvYXQ6OnJlbWFpbmRlcihjb25zdCBBUEZsb2F0ICZyaHMpCit7CisgIG9wU3RhdHVzIGZzOworICBBUEZsb2F0IFYgPSAqdGhpczsKKyAgdW5zaWduZWQgaW50IG9yaWdTaWduID0gc2lnbjsKKworICBhc3NlcnRBcml0aG1ldGljT0soKnNlbWFudGljcyk7CisgIGZzID0gVi5kaXZpZGUocmhzLCBybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgaWYgKGZzID09IG9wRGl2QnlaZXJvKQorICAgIHJldHVybiBmczsKKworICBpbnQgcGFydHMgPSBwYXJ0Q291bnQoKTsKKyAgaW50ZWdlclBhcnQgKnggPSBuZXcgaW50ZWdlclBhcnRbcGFydHNdOworICBib29sIGlnbm9yZWQ7CisgIGZzID0gVi5jb252ZXJ0VG9JbnRlZ2VyKHgsIHBhcnRzICogaW50ZWdlclBhcnRXaWR0aCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcm1OZWFyZXN0VGllc1RvRXZlbiwgJmlnbm9yZWQpOworICBpZiAoZnM9PW9wSW52YWxpZE9wKQorICAgIHJldHVybiBmczsKKworICBmcyA9IFYuY29udmVydEZyb21aZXJvRXh0ZW5kZWRJbnRlZ2VyKHgsIHBhcnRzICogaW50ZWdlclBhcnRXaWR0aCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgYXNzZXJ0KGZzPT1vcE9LKTsgICAvLyBzaG91bGQgYWx3YXlzIHdvcmsKKworICBmcyA9IFYubXVsdGlwbHkocmhzLCBybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgYXNzZXJ0KGZzPT1vcE9LIHx8IGZzPT1vcEluZXhhY3QpOyAgIC8vIHNob3VsZCBub3Qgb3ZlcmZsb3cgb3IgdW5kZXJmbG93CisKKyAgZnMgPSBzdWJ0cmFjdChWLCBybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgYXNzZXJ0KGZzPT1vcE9LIHx8IGZzPT1vcEluZXhhY3QpOyAgIC8vIGxpa2V3aXNlCisKKyAgaWYgKGlzWmVybygpKQorICAgIHNpZ24gPSBvcmlnU2lnbjsgICAgLy8gSUVFRTc1NCByZXF1aXJlcyB0aGlzCisgIGRlbGV0ZVtdIHg7CisgIHJldHVybiBmczsKK30KKworLyogTm9ybWFsaXplZCBsbHZtIGZyZW0gKEMgZm1vZCkuCisgICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgY29ycmVjdCBpbiBhbGwgY2FzZXMuICAqLworQVBGbG9hdDo6b3BTdGF0dXMKK0FQRmxvYXQ6Om1vZChjb25zdCBBUEZsb2F0ICZyaHMsIHJvdW5kaW5nTW9kZSByb3VuZGluZ19tb2RlKQoreworICBvcFN0YXR1cyBmczsKKyAgYXNzZXJ0QXJpdGhtZXRpY09LKCpzZW1hbnRpY3MpOworICBmcyA9IG1vZFNwZWNpYWxzKHJocyk7CisKKyAgaWYgKGNhdGVnb3J5ID09IGZjTm9ybWFsICYmIHJocy5jYXRlZ29yeSA9PSBmY05vcm1hbCkgeworICAgIEFQRmxvYXQgViA9ICp0aGlzOworICAgIHVuc2lnbmVkIGludCBvcmlnU2lnbiA9IHNpZ247CisKKyAgICBmcyA9IFYuZGl2aWRlKHJocywgcm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgaWYgKGZzID09IG9wRGl2QnlaZXJvKQorICAgICAgcmV0dXJuIGZzOworCisgICAgaW50IHBhcnRzID0gcGFydENvdW50KCk7CisgICAgaW50ZWdlclBhcnQgKnggPSBuZXcgaW50ZWdlclBhcnRbcGFydHNdOworICAgIGJvb2wgaWdub3JlZDsKKyAgICBmcyA9IFYuY29udmVydFRvSW50ZWdlcih4LCBwYXJ0cyAqIGludGVnZXJQYXJ0V2lkdGgsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1Ub3dhcmRaZXJvLCAmaWdub3JlZCk7CisgICAgaWYgKGZzPT1vcEludmFsaWRPcCkKKyAgICAgIHJldHVybiBmczsKKworICAgIGZzID0gVi5jb252ZXJ0RnJvbVplcm9FeHRlbmRlZEludGVnZXIoeCwgcGFydHMgKiBpbnRlZ2VyUGFydFdpZHRoLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgYXNzZXJ0KGZzPT1vcE9LKTsgICAvLyBzaG91bGQgYWx3YXlzIHdvcmsKKworICAgIGZzID0gVi5tdWx0aXBseShyaHMsIHJvdW5kaW5nX21vZGUpOworICAgIGFzc2VydChmcz09b3BPSyB8fCBmcz09b3BJbmV4YWN0KTsgICAvLyBzaG91bGQgbm90IG92ZXJmbG93IG9yIHVuZGVyZmxvdworCisgICAgZnMgPSBzdWJ0cmFjdChWLCByb3VuZGluZ19tb2RlKTsKKyAgICBhc3NlcnQoZnM9PW9wT0sgfHwgZnM9PW9wSW5leGFjdCk7ICAgLy8gbGlrZXdpc2UKKworICAgIGlmIChpc1plcm8oKSkKKyAgICAgIHNpZ24gPSBvcmlnU2lnbjsgICAgLy8gSUVFRTc1NCByZXF1aXJlcyB0aGlzCisgICAgZGVsZXRlW10geDsKKyAgfQorICByZXR1cm4gZnM7Cit9CisKKy8qIE5vcm1hbGl6ZWQgZnVzZWQtbXVsdGlwbHktYWRkLiAgKi8KK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0OjpmdXNlZE11bHRpcGx5QWRkKGNvbnN0IEFQRmxvYXQgJm11bHRpcGxpY2FuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBGbG9hdCAmYWRkZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUgcm91bmRpbmdfbW9kZSkKK3sKKyAgb3BTdGF0dXMgZnM7CisKKyAgYXNzZXJ0QXJpdGhtZXRpY09LKCpzZW1hbnRpY3MpOworCisgIC8qIFBvc3QtbXVsdGlwbGljYXRpb24gc2lnbiwgYmVmb3JlIGFkZGl0aW9uLiAgKi8KKyAgc2lnbiBePSBtdWx0aXBsaWNhbmQuc2lnbjsKKworICAvKiBJZiBhbmQgb25seSBpZiBhbGwgYXJndW1lbnRzIGFyZSBub3JtYWwgZG8gd2UgbmVlZCB0byBkbyBhbgorICAgICBleHRlbmRlZC1wcmVjaXNpb24gY2FsY3VsYXRpb24uICAqLworICBpZiAoY2F0ZWdvcnkgPT0gZmNOb3JtYWwgJiYKKyAgICAgIG11bHRpcGxpY2FuZC5jYXRlZ29yeSA9PSBmY05vcm1hbCAmJgorICAgICAgYWRkZW5kLmNhdGVnb3J5ID09IGZjTm9ybWFsKSB7CisgICAgbG9zdEZyYWN0aW9uIGxvc3RfZnJhY3Rpb247CisKKyAgICBsb3N0X2ZyYWN0aW9uID0gbXVsdGlwbHlTaWduaWZpY2FuZChtdWx0aXBsaWNhbmQsICZhZGRlbmQpOworICAgIGZzID0gbm9ybWFsaXplKHJvdW5kaW5nX21vZGUsIGxvc3RfZnJhY3Rpb24pOworICAgIGlmIChsb3N0X2ZyYWN0aW9uICE9IGxmRXhhY3RseVplcm8pCisgICAgICBmcyA9IChvcFN0YXR1cykgKGZzIHwgb3BJbmV4YWN0KTsKKworICAgIC8qIElmIHR3byBudW1iZXJzIGFkZCAoZXhhY3RseSkgdG8gemVybywgSUVFRSA3NTQgZGVjcmVlcyBpdCBpcyBhCisgICAgICAgcG9zaXRpdmUgemVybyB1bmxlc3Mgcm91bmRpbmcgdG8gbWludXMgaW5maW5pdHksIGV4Y2VwdCB0aGF0CisgICAgICAgYWRkaW5nIHR3byBsaWtlLXNpZ25lZCB6ZXJvZXMgZ2l2ZXMgdGhhdCB6ZXJvLiAgKi8KKyAgICBpZiAoY2F0ZWdvcnkgPT0gZmNaZXJvICYmIHNpZ24gIT0gYWRkZW5kLnNpZ24pCisgICAgICBzaWduID0gKHJvdW5kaW5nX21vZGUgPT0gcm1Ub3dhcmROZWdhdGl2ZSk7CisgIH0gZWxzZSB7CisgICAgZnMgPSBtdWx0aXBseVNwZWNpYWxzKG11bHRpcGxpY2FuZCk7CisKKyAgICAvKiBGUyBjYW4gb25seSBiZSBvcE9LIG9yIG9wSW52YWxpZE9wLiAgVGhlcmUgaXMgbm8gbW9yZSB3b3JrCisgICAgICAgdG8gZG8gaW4gdGhlIGxhdHRlciBjYXNlLiAgVGhlIElFRUUtNzU0UiBzdGFuZGFyZCBzYXlzIGl0IGlzCisgICAgICAgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBpbiB0aGlzIGNhc2Ugd2hldGhlciwgaWYgQURERU5EIGlzIGEKKyAgICAgICBxdWlldCBOYU4sIHdlIHJhaXNlIGludmFsaWQgb3A7IHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBzby4KKworICAgICAgIElmIHdlIG5lZWQgdG8gZG8gdGhlIGFkZGl0aW9uIHdlIGNhbiBkbyBzbyB3aXRoIG5vcm1hbAorICAgICAgIHByZWNpc2lvbi4gICovCisgICAgaWYgKGZzID09IG9wT0spCisgICAgICBmcyA9IGFkZE9yU3VidHJhY3QoYWRkZW5kLCByb3VuZGluZ19tb2RlLCBmYWxzZSk7CisgIH0KKworICByZXR1cm4gZnM7Cit9CisKKy8qIENvbXBhcmlzb24gcmVxdWlyZXMgbm9ybWFsaXplZCBudW1iZXJzLiAgKi8KK0FQRmxvYXQ6OmNtcFJlc3VsdAorQVBGbG9hdDo6Y29tcGFyZShjb25zdCBBUEZsb2F0ICZyaHMpIGNvbnN0Cit7CisgIGNtcFJlc3VsdCByZXN1bHQ7CisKKyAgYXNzZXJ0QXJpdGhtZXRpY09LKCpzZW1hbnRpY3MpOworICBhc3NlcnQoc2VtYW50aWNzID09IHJocy5zZW1hbnRpY3MpOworCisgIHN3aXRjaCAoY29udm9sdmUoY2F0ZWdvcnksIHJocy5jYXRlZ29yeSkpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworCisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjWmVybyk6CisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjTm9ybWFsKToKKyAgY2FzZSBjb252b2x2ZShmY05hTiwgZmNJbmZpbml0eSk6CisgIGNhc2UgY29udm9sdmUoZmNOYU4sIGZjTmFOKToKKyAgY2FzZSBjb252b2x2ZShmY1plcm8sIGZjTmFOKToKKyAgY2FzZSBjb252b2x2ZShmY05vcm1hbCwgZmNOYU4pOgorICBjYXNlIGNvbnZvbHZlKGZjSW5maW5pdHksIGZjTmFOKToKKyAgICByZXR1cm4gY21wVW5vcmRlcmVkOworCisgIGNhc2UgY29udm9sdmUoZmNJbmZpbml0eSwgZmNOb3JtYWwpOgorICBjYXNlIGNvbnZvbHZlKGZjSW5maW5pdHksIGZjWmVybyk6CisgIGNhc2UgY29udm9sdmUoZmNOb3JtYWwsIGZjWmVybyk6CisgICAgaWYgKHNpZ24pCisgICAgICByZXR1cm4gY21wTGVzc1RoYW47CisgICAgZWxzZQorICAgICAgcmV0dXJuIGNtcEdyZWF0ZXJUaGFuOworCisgIGNhc2UgY29udm9sdmUoZmNOb3JtYWwsIGZjSW5maW5pdHkpOgorICBjYXNlIGNvbnZvbHZlKGZjWmVybywgZmNJbmZpbml0eSk6CisgIGNhc2UgY29udm9sdmUoZmNaZXJvLCBmY05vcm1hbCk6CisgICAgaWYgKHJocy5zaWduKQorICAgICAgcmV0dXJuIGNtcEdyZWF0ZXJUaGFuOworICAgIGVsc2UKKyAgICAgIHJldHVybiBjbXBMZXNzVGhhbjsKKworICBjYXNlIGNvbnZvbHZlKGZjSW5maW5pdHksIGZjSW5maW5pdHkpOgorICAgIGlmIChzaWduID09IHJocy5zaWduKQorICAgICAgcmV0dXJuIGNtcEVxdWFsOworICAgIGVsc2UgaWYgKHNpZ24pCisgICAgICByZXR1cm4gY21wTGVzc1RoYW47CisgICAgZWxzZQorICAgICAgcmV0dXJuIGNtcEdyZWF0ZXJUaGFuOworCisgIGNhc2UgY29udm9sdmUoZmNaZXJvLCBmY1plcm8pOgorICAgIHJldHVybiBjbXBFcXVhbDsKKworICBjYXNlIGNvbnZvbHZlKGZjTm9ybWFsLCBmY05vcm1hbCk6CisgICAgYnJlYWs7CisgIH0KKworICAvKiBUd28gbm9ybWFsIG51bWJlcnMuICBEbyB0aGV5IGhhdmUgdGhlIHNhbWUgc2lnbj8gICovCisgIGlmIChzaWduICE9IHJocy5zaWduKSB7CisgICAgaWYgKHNpZ24pCisgICAgICByZXN1bHQgPSBjbXBMZXNzVGhhbjsKKyAgICBlbHNlCisgICAgICByZXN1bHQgPSBjbXBHcmVhdGVyVGhhbjsKKyAgfSBlbHNlIHsKKyAgICAvKiBDb21wYXJlIGFic29sdXRlIHZhbHVlczsgaW52ZXJ0IHJlc3VsdCBpZiBuZWdhdGl2ZS4gICovCisgICAgcmVzdWx0ID0gY29tcGFyZUFic29sdXRlVmFsdWUocmhzKTsKKworICAgIGlmIChzaWduKSB7CisgICAgICBpZiAocmVzdWx0ID09IGNtcExlc3NUaGFuKQorICAgICAgICByZXN1bHQgPSBjbXBHcmVhdGVyVGhhbjsKKyAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBjbXBHcmVhdGVyVGhhbikKKyAgICAgICAgcmVzdWx0ID0gY21wTGVzc1RoYW47CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vIEFQRmxvYXQ6OmNvbnZlcnQgLSBjb252ZXJ0IGEgdmFsdWUgb2Ygb25lIGZsb2F0aW5nIHBvaW50IHR5cGUgdG8gYW5vdGhlci4KKy8vLyBUaGUgcmV0dXJuIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBJRUVFNzU0IGV4Y2VwdGlvbnMuICAqbG9zZXNJbmZvCisvLy8gcmVjb3JkcyB3aGV0aGVyIHRoZSB0cmFuc2Zvcm1hdGlvbiBsb3N0IGluZm9ybWF0aW9uLCBpLmUuIHdoZXRoZXIKKy8vLyBjb252ZXJ0aW5nIHRoZSByZXN1bHQgYmFjayB0byB0aGUgb3JpZ2luYWwgdHlwZSB3aWxsIHByb2R1Y2UgdGhlCisvLy8gb3JpZ2luYWwgdmFsdWUgKHRoaXMgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHJldHVybiB2YWx1ZT09ZnNPSywgYnV0IHRoZXJlCisvLy8gYXJlIGVkZ2UgY2FzZXMgd2hlcmUgdGhpcyBpcyBub3Qgc28pLgorCitBUEZsb2F0OjpvcFN0YXR1cworQVBGbG9hdDo6Y29udmVydChjb25zdCBmbHRTZW1hbnRpY3MgJnRvU2VtYW50aWNzLAorICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUgcm91bmRpbmdfbW9kZSwgYm9vbCAqbG9zZXNJbmZvKQoreworICBsb3N0RnJhY3Rpb24gbG9zdEZyYWN0aW9uOworICB1bnNpZ25lZCBpbnQgbmV3UGFydENvdW50LCBvbGRQYXJ0Q291bnQ7CisgIG9wU3RhdHVzIGZzOworCisgIGFzc2VydEFyaXRobWV0aWNPSygqc2VtYW50aWNzKTsKKyAgYXNzZXJ0QXJpdGhtZXRpY09LKHRvU2VtYW50aWNzKTsKKyAgbG9zdEZyYWN0aW9uID0gbGZFeGFjdGx5WmVybzsKKyAgbmV3UGFydENvdW50ID0gcGFydENvdW50Rm9yQml0cyh0b1NlbWFudGljcy5wcmVjaXNpb24gKyAxKTsKKyAgb2xkUGFydENvdW50ID0gcGFydENvdW50KCk7CisKKyAgLyogSGFuZGxlIHN0b3JhZ2UgY29tcGxpY2F0aW9ucy4gIElmIG91ciBuZXcgZm9ybSBpcyB3aWRlciwKKyAgICAgcmUtYWxsb2NhdGUgb3VyIGJpdCBwYXR0ZXJuIGludG8gd2lkZXIgc3RvcmFnZS4gIElmIGl0IGlzCisgICAgIG5hcnJvd2VyLCB3ZSBpZ25vcmUgdGhlIGV4Y2VzcyBwYXJ0cywgYnV0IGlmIG5hcnJvd2luZyB0byBhCisgICAgIHNpbmdsZSBwYXJ0IHdlIG5lZWQgdG8gZnJlZSB0aGUgb2xkIHN0b3JhZ2UuCisgICAgIEJlIGNhcmVmdWwgbm90IHRvIHJlZmVyZW5jZSBzaWduaWZpY2FuZFBhcnRzIGZvciB6ZXJvZXMKKyAgICAgYW5kIGluZmluaXRpZXMsIHNpbmNlIGl0IGFib3J0cy4gICovCisgIGlmIChuZXdQYXJ0Q291bnQgPiBvbGRQYXJ0Q291bnQpIHsKKyAgICBpbnRlZ2VyUGFydCAqbmV3UGFydHM7CisgICAgbmV3UGFydHMgPSBuZXcgaW50ZWdlclBhcnRbbmV3UGFydENvdW50XTsKKyAgICBBUEludDo6dGNTZXQobmV3UGFydHMsIDAsIG5ld1BhcnRDb3VudCk7CisgICAgaWYgKGNhdGVnb3J5PT1mY05vcm1hbCB8fCBjYXRlZ29yeT09ZmNOYU4pCisgICAgICBBUEludDo6dGNBc3NpZ24obmV3UGFydHMsIHNpZ25pZmljYW5kUGFydHMoKSwgb2xkUGFydENvdW50KTsKKyAgICBmcmVlU2lnbmlmaWNhbmQoKTsKKyAgICBzaWduaWZpY2FuZC5wYXJ0cyA9IG5ld1BhcnRzOworICB9IGVsc2UgaWYgKG5ld1BhcnRDb3VudCA8IG9sZFBhcnRDb3VudCkgeworICAgIC8qIENhcHR1cmUgYW55IGxvc3QgZnJhY3Rpb24gdGhyb3VnaCB0cnVuY2F0aW9uIG9mIHBhcnRzIHNvIHdlIGdldAorICAgICAgIGNvcnJlY3Qgcm91bmRpbmcgd2hpbHN0IG5vcm1hbGl6aW5nLiAgKi8KKyAgICBpZiAoY2F0ZWdvcnk9PWZjTm9ybWFsKQorICAgICAgbG9zdEZyYWN0aW9uID0gbG9zdEZyYWN0aW9uVGhyb3VnaFRydW5jYXRpb24KKyAgICAgICAgKHNpZ25pZmljYW5kUGFydHMoKSwgb2xkUGFydENvdW50LCB0b1NlbWFudGljcy5wcmVjaXNpb24pOworICAgIGlmIChuZXdQYXJ0Q291bnQgPT0gMSkgeworICAgICAgICBpbnRlZ2VyUGFydCBuZXdQYXJ0ID0gMDsKKyAgICAgICAgaWYgKGNhdGVnb3J5PT1mY05vcm1hbCB8fCBjYXRlZ29yeT09ZmNOYU4pCisgICAgICAgICAgbmV3UGFydCA9IHNpZ25pZmljYW5kUGFydHMoKVswXTsKKyAgICAgICAgZnJlZVNpZ25pZmljYW5kKCk7CisgICAgICAgIHNpZ25pZmljYW5kLnBhcnQgPSBuZXdQYXJ0OworICAgIH0KKyAgfQorCisgIGlmIChjYXRlZ29yeSA9PSBmY05vcm1hbCkgeworICAgIC8qIFJlLWludGVycHJldCBvdXIgYml0LXBhdHRlcm4uICAqLworICAgIGV4cG9uZW50ICs9IHRvU2VtYW50aWNzLnByZWNpc2lvbiAtIHNlbWFudGljcy0+cHJlY2lzaW9uOworICAgIHNlbWFudGljcyA9ICZ0b1NlbWFudGljczsKKyAgICBmcyA9IG5vcm1hbGl6ZShyb3VuZGluZ19tb2RlLCBsb3N0RnJhY3Rpb24pOworICAgICpsb3Nlc0luZm8gPSAoZnMgIT0gb3BPSyk7CisgIH0gZWxzZSBpZiAoY2F0ZWdvcnkgPT0gZmNOYU4pIHsKKyAgICBpbnQgc2hpZnQgPSB0b1NlbWFudGljcy5wcmVjaXNpb24gLSBzZW1hbnRpY3MtPnByZWNpc2lvbjsKKyAgICAvLyBEbyB0aGlzIG5vdyBzbyBzaWduaWZpY2FuZFBhcnRzIGdldHMgdGhlIHJpZ2h0IGFuc3dlcgorICAgIGNvbnN0IGZsdFNlbWFudGljcyAqb2xkU2VtYW50aWNzID0gc2VtYW50aWNzOworICAgIHNlbWFudGljcyA9ICZ0b1NlbWFudGljczsKKyAgICAqbG9zZXNJbmZvID0gZmFsc2U7CisgICAgLy8gTm8gbm9ybWFsaXphdGlvbiBoZXJlLCBqdXN0IHRydW5jYXRlCisgICAgaWYgKHNoaWZ0PjApCisgICAgICBBUEludDo6dGNTaGlmdExlZnQoc2lnbmlmaWNhbmRQYXJ0cygpLCBuZXdQYXJ0Q291bnQsIHNoaWZ0KTsKKyAgICBlbHNlIGlmIChzaGlmdCA8IDApIHsKKyAgICAgIHVuc2lnbmVkIHVzaGlmdCA9IC1zaGlmdDsKKyAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgYXJlIGxvc2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaGFwcGVucworICAgICAgLy8gaWYgYXJlIHNoaWZ0aW5nIG91dCBzb21ldGhpbmcgb3RoZXIgdGhhbiAwcywgb3IgaWYgdGhlIHg4NyBsb25nCisgICAgICAvLyBkb3VibGUgaW5wdXQgZGlkIG5vdCBoYXZlIGl0cyBpbnRlZ2VyIGJpdCBzZXQgKHBzZXVkby1OYU4pLCBvciBpZiB0aGUKKyAgICAgIC8vIHg4NyBsb25nIGRvdWJsZSBpbnB1dCBkaWQgbm90IGhhdmUgaXRzIFFOYW4gYml0IHNldCAoYmVjYXVzZSB0aGUgeDg3CisgICAgICAvLyBoYXJkd2FyZSBzZXRzIHRoaXMgYml0IHdoZW4gY29udmVydGluZyBhIGxvd2VyLXByZWNpc2lvbiBOYU4gdG8KKyAgICAgIC8vIHg4NyBsb25nIGRvdWJsZSkuCisgICAgICBpZiAoQVBJbnQ6OnRjTFNCKHNpZ25pZmljYW5kUGFydHMoKSwgbmV3UGFydENvdW50KSA8IHVzaGlmdCkKKyAgICAgICAgKmxvc2VzSW5mbyA9IHRydWU7CisgICAgICBpZiAob2xkU2VtYW50aWNzID09ICZBUEZsb2F0Ojp4ODdEb3VibGVFeHRlbmRlZCAmJgorICAgICAgICAgICghKCpzaWduaWZpY2FuZFBhcnRzKCkgJiAweDgwMDAwMDAwMDAwMDAwMDBVTEwpIHx8CisgICAgICAgICAgICEoKnNpZ25pZmljYW5kUGFydHMoKSAmIDB4NDAwMDAwMDAwMDAwMDAwMFVMTCkpKQorICAgICAgICAqbG9zZXNJbmZvID0gdHJ1ZTsKKyAgICAgIEFQSW50Ojp0Y1NoaWZ0UmlnaHQoc2lnbmlmaWNhbmRQYXJ0cygpLCBuZXdQYXJ0Q291bnQsIHVzaGlmdCk7CisgICAgfQorICAgIC8vIGdjYyBmb3JjZXMgdGhlIFF1aWV0IGJpdCBvbiwgd2hpY2ggbWVhbnMgKGZsb2F0KShkb3VibGUpKGZsb2F0X3NOYW4pCisgICAgLy8gZG9lcyBub3QgZ2l2ZSB5b3UgYmFjayB0aGUgc2FtZSBiaXRzLiAgVGhpcyBpcyBkdWJpb3VzLCBhbmQgd2UKKyAgICAvLyBkb24ndCBjdXJyZW50bHkgZG8gaXQuICBZb3UncmUgcmVhbGx5IHN1cHBvc2VkIHRvIGdldAorICAgIC8vIGFuIGludmFsaWQgb3BlcmF0aW9uIHNpZ25hbCBhdCBydW50aW1lLCBidXQgbm9ib2R5IGRvZXMgdGhhdC4KKyAgICBmcyA9IG9wT0s7CisgIH0gZWxzZSB7CisgICAgc2VtYW50aWNzID0gJnRvU2VtYW50aWNzOworICAgIGZzID0gb3BPSzsKKyAgICAqbG9zZXNJbmZvID0gZmFsc2U7CisgIH0KKworICByZXR1cm4gZnM7Cit9CisKKy8qIENvbnZlcnQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gYW4gaW50ZWdlciBhY2NvcmRpbmcgdG8gdGhlCisgICByb3VuZGluZyBtb2RlLiAgSWYgdGhlIHJvdW5kZWQgaW50ZWdlciB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UgdGhpcworICAgcmV0dXJucyBhbiBpbnZhbGlkIG9wZXJhdGlvbiBleGNlcHRpb24gYW5kIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgIGRlc3RpbmF0aW9uIHBhcnRzIGFyZSB1bnNwZWNpZmllZC4gIElmIHRoZSByb3VuZGVkIHZhbHVlIGlzIGluCisgICByYW5nZSBidXQgdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciBpcyBub3QgdGhlIGV4YWN0IGludGVnZXIsIHRoZSBDCisgICBzdGFuZGFyZCBkb2Vzbid0IHJlcXVpcmUgYW4gaW5leGFjdCBleGNlcHRpb24gdG8gYmUgcmFpc2VkLiAgSUVFRQorICAgODU0IGRvZXMgcmVxdWlyZSBpdCBzbyB3ZSBkbyB0aGF0LgorCisgICBOb3RlIHRoYXQgZm9yIGNvbnZlcnNpb25zIHRvIGludGVnZXIgdHlwZSB0aGUgQyBzdGFuZGFyZCByZXF1aXJlcworICAgcm91bmQtdG8temVybyB0byBhbHdheXMgYmUgdXNlZC4gICovCitBUEZsb2F0OjpvcFN0YXR1cworQVBGbG9hdDo6Y29udmVydFRvU2lnbkV4dGVuZGVkSW50ZWdlcihpbnRlZ2VyUGFydCAqcGFydHMsIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlIHJvdW5kaW5nX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzRXhhY3QpIGNvbnN0Cit7CisgIGxvc3RGcmFjdGlvbiBsb3N0X2ZyYWN0aW9uOworICBjb25zdCBpbnRlZ2VyUGFydCAqc3JjOworICB1bnNpZ25lZCBpbnQgZHN0UGFydHNDb3VudCwgdHJ1bmNhdGVkQml0czsKKworICBhc3NlcnRBcml0aG1ldGljT0soKnNlbWFudGljcyk7CisKKyAgKmlzRXhhY3QgPSBmYWxzZTsKKworICAvKiBIYW5kbGUgdGhlIHRocmVlIHNwZWNpYWwgY2FzZXMgZmlyc3QuICAqLworICBpZiAoY2F0ZWdvcnkgPT0gZmNJbmZpbml0eSB8fCBjYXRlZ29yeSA9PSBmY05hTikKKyAgICByZXR1cm4gb3BJbnZhbGlkT3A7CisKKyAgZHN0UGFydHNDb3VudCA9IHBhcnRDb3VudEZvckJpdHMod2lkdGgpOworCisgIGlmIChjYXRlZ29yeSA9PSBmY1plcm8pIHsKKyAgICBBUEludDo6dGNTZXQocGFydHMsIDAsIGRzdFBhcnRzQ291bnQpOworICAgIC8vIE5lZ2F0aXZlIHplcm8gY2FuJ3QgYmUgcmVwcmVzZW50ZWQgYXMgYW4gaW50LgorICAgICppc0V4YWN0ID0gIXNpZ247CisgICAgcmV0dXJuIG9wT0s7CisgIH0KKworICBzcmMgPSBzaWduaWZpY2FuZFBhcnRzKCk7CisKKyAgLyogU3RlcCAxOiBwbGFjZSBvdXIgYWJzb2x1dGUgdmFsdWUsIHdpdGggYW55IGZyYWN0aW9uIHRydW5jYXRlZCwgaW4KKyAgICAgdGhlIGRlc3RpbmF0aW9uLiAgKi8KKyAgaWYgKGV4cG9uZW50IDwgMCkgeworICAgIC8qIE91ciBhYnNvbHV0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb25lOyB0cnVuY2F0ZSBldmVyeXRoaW5nLiAgKi8KKyAgICBBUEludDo6dGNTZXQocGFydHMsIDAsIGRzdFBhcnRzQ291bnQpOworICAgIC8qIEZvciBleHBvbmVudCAtMSB0aGUgaW50ZWdlciBiaXQgcmVwcmVzZW50cyAuNSwgbG9vayBhdCB0aGF0LgorICAgICAgIEZvciBzbWFsbGVyIGV4cG9uZW50cyBsZWZ0bW9zdCB0cnVuY2F0ZWQgYml0IGlzIDAuICovCisgICAgdHJ1bmNhdGVkQml0cyA9IHNlbWFudGljcy0+cHJlY2lzaW9uIC0xVSAtIGV4cG9uZW50OworICB9IGVsc2UgeworICAgIC8qIFdlIHdhbnQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgKGV4cG9uZW50ICsgMSkgYml0czsgdGhlIHJlc3QgYXJlCisgICAgICAgdHJ1bmNhdGVkLiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgYml0cyA9IGV4cG9uZW50ICsgMVU7CisKKyAgICAvKiBIb3BlbGVzc2x5IGxhcmdlIGluIG1hZ25pdHVkZT8gICovCisgICAgaWYgKGJpdHMgPiB3aWR0aCkKKyAgICAgIHJldHVybiBvcEludmFsaWRPcDsKKworICAgIGlmIChiaXRzIDwgc2VtYW50aWNzLT5wcmVjaXNpb24pIHsKKyAgICAgIC8qIFdlIHRydW5jYXRlIChzZW1hbnRpY3MtPnByZWNpc2lvbiAtIGJpdHMpIGJpdHMuICAqLworICAgICAgdHJ1bmNhdGVkQml0cyA9IHNlbWFudGljcy0+cHJlY2lzaW9uIC0gYml0czsKKyAgICAgIEFQSW50Ojp0Y0V4dHJhY3QocGFydHMsIGRzdFBhcnRzQ291bnQsIHNyYywgYml0cywgdHJ1bmNhdGVkQml0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFdlIHdhbnQgYXQgbGVhc3QgYXMgbWFueSBiaXRzIGFzIGFyZSBhdmFpbGFibGUuICAqLworICAgICAgQVBJbnQ6OnRjRXh0cmFjdChwYXJ0cywgZHN0UGFydHNDb3VudCwgc3JjLCBzZW1hbnRpY3MtPnByZWNpc2lvbiwgMCk7CisgICAgICBBUEludDo6dGNTaGlmdExlZnQocGFydHMsIGRzdFBhcnRzQ291bnQsIGJpdHMgLSBzZW1hbnRpY3MtPnByZWNpc2lvbik7CisgICAgICB0cnVuY2F0ZWRCaXRzID0gMDsKKyAgICB9CisgIH0KKworICAvKiBTdGVwIDI6IHdvcmsgb3V0IGFueSBsb3N0IGZyYWN0aW9uLCBhbmQgaW5jcmVtZW50IHRoZSBhYnNvbHV0ZQorICAgICB2YWx1ZSBpZiB3ZSB3b3VsZCByb3VuZCBhd2F5IGZyb20gemVyby4gICovCisgIGlmICh0cnVuY2F0ZWRCaXRzKSB7CisgICAgbG9zdF9mcmFjdGlvbiA9IGxvc3RGcmFjdGlvblRocm91Z2hUcnVuY2F0aW9uKHNyYywgcGFydENvdW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlZEJpdHMpOworICAgIGlmIChsb3N0X2ZyYWN0aW9uICE9IGxmRXhhY3RseVplcm8gJiYKKyAgICAgICAgcm91bmRBd2F5RnJvbVplcm8ocm91bmRpbmdfbW9kZSwgbG9zdF9mcmFjdGlvbiwgdHJ1bmNhdGVkQml0cykpIHsKKyAgICAgIGlmIChBUEludDo6dGNJbmNyZW1lbnQocGFydHMsIGRzdFBhcnRzQ291bnQpKQorICAgICAgICByZXR1cm4gb3BJbnZhbGlkT3A7ICAgICAvKiBPdmVyZmxvdy4gICovCisgICAgfQorICB9IGVsc2UgeworICAgIGxvc3RfZnJhY3Rpb24gPSBsZkV4YWN0bHlaZXJvOworICB9CisKKyAgLyogU3RlcCAzOiBjaGVjayBpZiB3ZSBmaXQgaW4gdGhlIGRlc3RpbmF0aW9uLiAgKi8KKyAgdW5zaWduZWQgaW50IG9tc2IgPSBBUEludDo6dGNNU0IocGFydHMsIGRzdFBhcnRzQ291bnQpICsgMTsKKworICBpZiAoc2lnbikgeworICAgIGlmICghaXNTaWduZWQpIHsKKyAgICAgIC8qIE5lZ2F0aXZlIG51bWJlcnMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIHVuc2lnbmVkLiAgKi8KKyAgICAgIGlmIChvbXNiICE9IDApCisgICAgICAgIHJldHVybiBvcEludmFsaWRPcDsKKyAgICB9IGVsc2UgeworICAgICAgLyogSXQgdGFrZXMgb21zYiBiaXRzIHRvIHJlcHJlc2VudCB0aGUgdW5zaWduZWQgaW50ZWdlciB2YWx1ZS4KKyAgICAgICAgIFdlIGxvc2UgYSBiaXQgZm9yIHRoZSBzaWduLCBidXQgY2FyZSBpcyBuZWVkZWQgYXMgdGhlCisgICAgICAgICBtYXhpbWFsbHkgbmVnYXRpdmUgaW50ZWdlciBpcyBhIHNwZWNpYWwgY2FzZS4gICovCisgICAgICBpZiAob21zYiA9PSB3aWR0aCAmJiBBUEludDo6dGNMU0IocGFydHMsIGRzdFBhcnRzQ291bnQpICsgMSAhPSBvbXNiKQorICAgICAgICByZXR1cm4gb3BJbnZhbGlkT3A7CisKKyAgICAgIC8qIFRoaXMgY2FzZSBjYW4gaGFwcGVuIGJlY2F1c2Ugb2Ygcm91bmRpbmcuICAqLworICAgICAgaWYgKG9tc2IgPiB3aWR0aCkKKyAgICAgICAgcmV0dXJuIG9wSW52YWxpZE9wOworICAgIH0KKworICAgIEFQSW50Ojp0Y05lZ2F0ZSAocGFydHMsIGRzdFBhcnRzQ291bnQpOworICB9IGVsc2UgeworICAgIGlmIChvbXNiID49IHdpZHRoICsgIWlzU2lnbmVkKQorICAgICAgcmV0dXJuIG9wSW52YWxpZE9wOworICB9CisKKyAgaWYgKGxvc3RfZnJhY3Rpb24gPT0gbGZFeGFjdGx5WmVybykgeworICAgICppc0V4YWN0ID0gdHJ1ZTsKKyAgICByZXR1cm4gb3BPSzsKKyAgfSBlbHNlCisgICAgcmV0dXJuIG9wSW5leGFjdDsKK30KKworLyogU2FtZSBhcyBjb252ZXJ0VG9TaWduRXh0ZW5kZWRJbnRlZ2VyLCBleGNlcHQgd2UgcHJvdmlkZQorICAgZGV0ZXJtaW5pc3RpYyB2YWx1ZXMgaW4gY2FzZSBvZiBhbiBpbnZhbGlkIG9wZXJhdGlvbiBleGNlcHRpb24sCisgICBuYW1lbHkgemVybyBmb3IgTmFOcyBhbmQgdGhlIG1pbmltYWwgb3IgbWF4aW1hbCB2YWx1ZSByZXNwZWN0aXZlbHkKKyAgIGZvciB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cuCisgICBUaGUgKmlzRXhhY3Qgb3V0cHV0IHRlbGxzIHdoZXRoZXIgdGhlIHJlc3VsdCBpcyBleGFjdCwgaW4gdGhlIHNlbnNlCisgICB0aGF0IGNvbnZlcnRpbmcgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgZmxvYXRpbmcgcG9pbnQgdHlwZSBwcm9kdWNlcworICAgdGhlIG9yaWdpbmFsIHZhbHVlLiAgVGhpcyBpcyBhbG1vc3QgZXF1aXZhbGVudCB0byByZXN1bHQ9PW9wT0ssCisgICBleGNlcHQgZm9yIG5lZ2F0aXZlIHplcm9lcy4KKyovCitBUEZsb2F0OjpvcFN0YXR1cworQVBGbG9hdDo6Y29udmVydFRvSW50ZWdlcihpbnRlZ2VyUGFydCAqcGFydHMsIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlIHJvdW5kaW5nX21vZGUsIGJvb2wgKmlzRXhhY3QpIGNvbnN0Cit7CisgIG9wU3RhdHVzIGZzOworCisgIGZzID0gY29udmVydFRvU2lnbkV4dGVuZGVkSW50ZWdlcihwYXJ0cywgd2lkdGgsIGlzU2lnbmVkLCByb3VuZGluZ19tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeGFjdCk7CisKKyAgaWYgKGZzID09IG9wSW52YWxpZE9wKSB7CisgICAgdW5zaWduZWQgaW50IGJpdHMsIGRzdFBhcnRzQ291bnQ7CisKKyAgICBkc3RQYXJ0c0NvdW50ID0gcGFydENvdW50Rm9yQml0cyh3aWR0aCk7CisKKyAgICBpZiAoY2F0ZWdvcnkgPT0gZmNOYU4pCisgICAgICBiaXRzID0gMDsKKyAgICBlbHNlIGlmIChzaWduKQorICAgICAgYml0cyA9IGlzU2lnbmVkOworICAgIGVsc2UKKyAgICAgIGJpdHMgPSB3aWR0aCAtIGlzU2lnbmVkOworCisgICAgQVBJbnQ6OnRjU2V0TGVhc3RTaWduaWZpY2FudEJpdHMocGFydHMsIGRzdFBhcnRzQ291bnQsIGJpdHMpOworICAgIGlmIChzaWduICYmIGlzU2lnbmVkKQorICAgICAgQVBJbnQ6OnRjU2hpZnRMZWZ0KHBhcnRzLCBkc3RQYXJ0c0NvdW50LCB3aWR0aCAtIDEpOworICB9CisKKyAgcmV0dXJuIGZzOworfQorCisvKiBDb252ZXJ0IGFuIHVuc2lnbmVkIGludGVnZXIgU1JDIHRvIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLAorICAgcm91bmRpbmcgYWNjb3JkaW5nIHRvIFJPVU5ESU5HX01PREUuICBUaGUgc2lnbiBvZiB0aGUgZmxvYXRpbmcKKyAgIHBvaW50IG51bWJlciBpcyBub3QgbW9kaWZpZWQuICAqLworQVBGbG9hdDo6b3BTdGF0dXMKK0FQRmxvYXQ6OmNvbnZlcnRGcm9tVW5zaWduZWRQYXJ0cyhjb25zdCBpbnRlZ2VyUGFydCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUgcm91bmRpbmdfbW9kZSkKK3sKKyAgdW5zaWduZWQgaW50IG9tc2IsIHByZWNpc2lvbiwgZHN0Q291bnQ7CisgIGludGVnZXJQYXJ0ICpkc3Q7CisgIGxvc3RGcmFjdGlvbiBsb3N0X2ZyYWN0aW9uOworCisgIGFzc2VydEFyaXRobWV0aWNPSygqc2VtYW50aWNzKTsKKyAgY2F0ZWdvcnkgPSBmY05vcm1hbDsKKyAgb21zYiA9IEFQSW50Ojp0Y01TQihzcmMsIHNyY0NvdW50KSArIDE7CisgIGRzdCA9IHNpZ25pZmljYW5kUGFydHMoKTsKKyAgZHN0Q291bnQgPSBwYXJ0Q291bnQoKTsKKyAgcHJlY2lzaW9uID0gc2VtYW50aWNzLT5wcmVjaXNpb247CisKKyAgLyogV2Ugd2FudCB0aGUgbW9zdCBzaWduaWZpY2FudCBQUkVDSVNPTiBiaXRzIG9mIFNSQy4gIFRoZXJlIG1heSBub3QKKyAgICAgYmUgdGhhdCBtYW55OyBleHRyYWN0IHdoYXQgd2UgY2FuLiAgKi8KKyAgaWYgKHByZWNpc2lvbiA8PSBvbXNiKSB7CisgICAgZXhwb25lbnQgPSBvbXNiIC0gMTsKKyAgICBsb3N0X2ZyYWN0aW9uID0gbG9zdEZyYWN0aW9uVGhyb3VnaFRydW5jYXRpb24oc3JjLCBzcmNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21zYiAtIHByZWNpc2lvbik7CisgICAgQVBJbnQ6OnRjRXh0cmFjdChkc3QsIGRzdENvdW50LCBzcmMsIHByZWNpc2lvbiwgb21zYiAtIHByZWNpc2lvbik7CisgIH0gZWxzZSB7CisgICAgZXhwb25lbnQgPSBwcmVjaXNpb24gLSAxOworICAgIGxvc3RfZnJhY3Rpb24gPSBsZkV4YWN0bHlaZXJvOworICAgIEFQSW50Ojp0Y0V4dHJhY3QoZHN0LCBkc3RDb3VudCwgc3JjLCBvbXNiLCAwKTsKKyAgfQorCisgIHJldHVybiBub3JtYWxpemUocm91bmRpbmdfbW9kZSwgbG9zdF9mcmFjdGlvbik7Cit9CisKK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0Ojpjb252ZXJ0RnJvbUFQSW50KGNvbnN0IEFQSW50ICZWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSByb3VuZGluZ19tb2RlKQoreworICB1bnNpZ25lZCBpbnQgcGFydENvdW50ID0gVmFsLmdldE51bVdvcmRzKCk7CisgIEFQSW50IGFwaSA9IFZhbDsKKworICBzaWduID0gZmFsc2U7CisgIGlmIChpc1NpZ25lZCAmJiBhcGkuaXNOZWdhdGl2ZSgpKSB7CisgICAgc2lnbiA9IHRydWU7CisgICAgYXBpID0gLWFwaTsKKyAgfQorCisgIHJldHVybiBjb252ZXJ0RnJvbVVuc2lnbmVkUGFydHMoYXBpLmdldFJhd0RhdGEoKSwgcGFydENvdW50LCByb3VuZGluZ19tb2RlKTsKK30KKworLyogQ29udmVydCBhIHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBTUkMgdG8gYSBmbG9hdGluZyBwb2ludCBudW1iZXIsCisgICByb3VuZGluZyBhY2NvcmRpbmcgdG8gUk9VTkRJTkdfTU9ERS4gIElTU0lHTkVEIGlzIHRydWUgaWYgdGhlCisgICBpbnRlZ2VyIGlzIHNpZ25lZCwgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQuICAqLworQVBGbG9hdDo6b3BTdGF0dXMKK0FQRmxvYXQ6OmNvbnZlcnRGcm9tU2lnbkV4dGVuZGVkSW50ZWdlcihjb25zdCBpbnRlZ2VyUGFydCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSByb3VuZGluZ19tb2RlKQoreworICBvcFN0YXR1cyBzdGF0dXM7CisKKyAgYXNzZXJ0QXJpdGhtZXRpY09LKCpzZW1hbnRpY3MpOworICBpZiAoaXNTaWduZWQgJiYKKyAgICAgIEFQSW50Ojp0Y0V4dHJhY3RCaXQoc3JjLCBzcmNDb3VudCAqIGludGVnZXJQYXJ0V2lkdGggLSAxKSkgeworICAgIGludGVnZXJQYXJ0ICpjb3B5OworCisgICAgLyogSWYgd2UncmUgc2lnbmVkIGFuZCBuZWdhdGl2ZSBuZWdhdGUgYSBjb3B5LiAgKi8KKyAgICBzaWduID0gdHJ1ZTsKKyAgICBjb3B5ID0gbmV3IGludGVnZXJQYXJ0W3NyY0NvdW50XTsKKyAgICBBUEludDo6dGNBc3NpZ24oY29weSwgc3JjLCBzcmNDb3VudCk7CisgICAgQVBJbnQ6OnRjTmVnYXRlKGNvcHksIHNyY0NvdW50KTsKKyAgICBzdGF0dXMgPSBjb252ZXJ0RnJvbVVuc2lnbmVkUGFydHMoY29weSwgc3JjQ291bnQsIHJvdW5kaW5nX21vZGUpOworICAgIGRlbGV0ZSBbXSBjb3B5OworICB9IGVsc2UgeworICAgIHNpZ24gPSBmYWxzZTsKKyAgICBzdGF0dXMgPSBjb252ZXJ0RnJvbVVuc2lnbmVkUGFydHMoc3JjLCBzcmNDb3VudCwgcm91bmRpbmdfbW9kZSk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKiBGSVhNRTogc2hvdWxkIHRoaXMganVzdCB0YWtlIGEgY29uc3QgQVBJbnQgcmVmZXJlbmNlPyAgKi8KK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0Ojpjb252ZXJ0RnJvbVplcm9FeHRlbmRlZEludGVnZXIoY29uc3QgaW50ZWdlclBhcnQgKnBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB3aWR0aCwgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUgcm91bmRpbmdfbW9kZSkKK3sKKyAgdW5zaWduZWQgaW50IHBhcnRDb3VudCA9IHBhcnRDb3VudEZvckJpdHMod2lkdGgpOworICBBUEludCBhcGkgPSBBUEludCh3aWR0aCwgcGFydENvdW50LCBwYXJ0cyk7CisKKyAgc2lnbiA9IGZhbHNlOworICBpZiAoaXNTaWduZWQgJiYgQVBJbnQ6OnRjRXh0cmFjdEJpdChwYXJ0cywgd2lkdGggLSAxKSkgeworICAgIHNpZ24gPSB0cnVlOworICAgIGFwaSA9IC1hcGk7CisgIH0KKworICByZXR1cm4gY29udmVydEZyb21VbnNpZ25lZFBhcnRzKGFwaS5nZXRSYXdEYXRhKCksIHBhcnRDb3VudCwgcm91bmRpbmdfbW9kZSk7Cit9CisKK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0Ojpjb252ZXJ0RnJvbUhleGFkZWNpbWFsU3RyaW5nKFN0cmluZ1JlZiBzLCByb3VuZGluZ01vZGUgcm91bmRpbmdfbW9kZSkKK3sKKyAgbG9zdEZyYWN0aW9uIGxvc3RfZnJhY3Rpb24gPSBsZkV4YWN0bHlaZXJvOworICBpbnRlZ2VyUGFydCAqc2lnbmlmaWNhbmQ7CisgIHVuc2lnbmVkIGludCBiaXRQb3MsIHBhcnRzQ291bnQ7CisgIFN0cmluZ1JlZjo6aXRlcmF0b3IgZG90LCBmaXJzdFNpZ25pZmljYW50RGlnaXQ7CisKKyAgemVyb1NpZ25pZmljYW5kKCk7CisgIGV4cG9uZW50ID0gMDsKKyAgY2F0ZWdvcnkgPSBmY05vcm1hbDsKKworICBzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kUGFydHMoKTsKKyAgcGFydHNDb3VudCA9IHBhcnRDb3VudCgpOworICBiaXRQb3MgPSBwYXJ0c0NvdW50ICogaW50ZWdlclBhcnRXaWR0aDsKKworICAvKiBTa2lwIGxlYWRpbmcgemVyb2VzIGFuZCBhbnkgKGhleGEpZGVjaW1hbCBwb2ludC4gICovCisgIFN0cmluZ1JlZjo6aXRlcmF0b3IgYmVnaW4gPSBzLmJlZ2luKCk7CisgIFN0cmluZ1JlZjo6aXRlcmF0b3IgZW5kID0gcy5lbmQoKTsKKyAgU3RyaW5nUmVmOjppdGVyYXRvciBwID0gc2tpcExlYWRpbmdaZXJvZXNBbmRBbnlEb3QoYmVnaW4sIGVuZCwgJmRvdCk7CisgIGZpcnN0U2lnbmlmaWNhbnREaWdpdCA9IHA7CisKKyAgZm9yICg7IHAgIT0gZW5kOykgeworICAgIGludGVnZXJQYXJ0IGhleF92YWx1ZTsKKworICAgIGlmICgqcCA9PSAnLicpIHsKKyAgICAgIGFzc2VydChkb3QgPT0gZW5kICYmICJTdHJpbmcgY29udGFpbnMgbXVsdGlwbGUgZG90cyIpOworICAgICAgZG90ID0gcCsrOworICAgICAgaWYgKHAgPT0gZW5kKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGhleF92YWx1ZSA9IGhleERpZ2l0VmFsdWUoKnApOworICAgIGlmIChoZXhfdmFsdWUgPT0gLTFVKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwKys7CisKKyAgICBpZiAocCA9PSBlbmQpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBTdG9yZSB0aGUgbnVtYmVyIHdoaWxzdCA0LWJpdCBuaWJibGVzIHJlbWFpbi4gICovCisgICAgICBpZiAoYml0UG9zKSB7CisgICAgICAgIGJpdFBvcyAtPSA0OworICAgICAgICBoZXhfdmFsdWUgPDw9IGJpdFBvcyAlIGludGVnZXJQYXJ0V2lkdGg7CisgICAgICAgIHNpZ25pZmljYW5kW2JpdFBvcyAvIGludGVnZXJQYXJ0V2lkdGhdIHw9IGhleF92YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvc3RfZnJhY3Rpb24gPSB0cmFpbGluZ0hleGFkZWNpbWFsRnJhY3Rpb24ocCwgZW5kLCBoZXhfdmFsdWUpOworICAgICAgICB3aGlsZSAocCAhPSBlbmQgJiYgaGV4RGlnaXRWYWx1ZSgqcCkgIT0gLTFVKQorICAgICAgICAgIHArKzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogSGV4IGZsb2F0cyByZXF1aXJlIGFuIGV4cG9uZW50IGJ1dCBub3QgYSBoZXhhZGVjaW1hbCBwb2ludC4gICovCisgIGFzc2VydChwICE9IGVuZCAmJiAiSGV4IHN0cmluZ3MgcmVxdWlyZSBhbiBleHBvbmVudCIpOworICBhc3NlcnQoKCpwID09ICdwJyB8fCAqcCA9PSAnUCcpICYmICJJbnZhbGlkIGNoYXJhY3RlciBpbiBzaWduaWZpY2FuZCIpOworICBhc3NlcnQocCAhPSBiZWdpbiAmJiAiU2lnbmlmaWNhbmQgaGFzIG5vIGRpZ2l0cyIpOworICBhc3NlcnQoKGRvdCA9PSBlbmQgfHwgcCAtIGJlZ2luICE9IDEpICYmICJTaWduaWZpY2FuZCBoYXMgbm8gZGlnaXRzIik7CisKKyAgLyogSWdub3JlIHRoZSBleHBvbmVudCBpZiB3ZSBhcmUgemVyby4gICovCisgIGlmIChwICE9IGZpcnN0U2lnbmlmaWNhbnREaWdpdCkgeworICAgIGludCBleHBBZGp1c3RtZW50OworCisgICAgLyogSW1wbGljaXQgaGV4YWRlY2ltYWwgcG9pbnQ/ICAqLworICAgIGlmIChkb3QgPT0gZW5kKQorICAgICAgZG90ID0gcDsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgZXhwb25lbnQgYWRqdXN0bWVudCBpbXBsaWNpdCBpbiB0aGUgbnVtYmVyIG9mCisgICAgICAgc2lnbmlmaWNhbnQgZGlnaXRzLiAgKi8KKyAgICBleHBBZGp1c3RtZW50ID0gc3RhdGljX2Nhc3Q8aW50Pihkb3QgLSBmaXJzdFNpZ25pZmljYW50RGlnaXQpOworICAgIGlmIChleHBBZGp1c3RtZW50IDwgMCkKKyAgICAgIGV4cEFkanVzdG1lbnQrKzsKKyAgICBleHBBZGp1c3RtZW50ID0gZXhwQWRqdXN0bWVudCAqIDQgLSAxOworCisgICAgLyogQWRqdXN0IGZvciB3cml0aW5nIHRoZSBzaWduaWZpY2FuZCBzdGFydGluZyBhdCB0aGUgbW9zdAorICAgICAgIHNpZ25pZmljYW50IG5pYmJsZS4gICovCisgICAgZXhwQWRqdXN0bWVudCArPSBzZW1hbnRpY3MtPnByZWNpc2lvbjsKKyAgICBleHBBZGp1c3RtZW50IC09IHBhcnRzQ291bnQgKiBpbnRlZ2VyUGFydFdpZHRoOworCisgICAgLyogQWRqdXN0IGZvciB0aGUgZ2l2ZW4gZXhwb25lbnQuICAqLworICAgIGV4cG9uZW50ID0gdG90YWxFeHBvbmVudChwICsgMSwgZW5kLCBleHBBZGp1c3RtZW50KTsKKyAgfQorCisgIHJldHVybiBub3JtYWxpemUocm91bmRpbmdfbW9kZSwgbG9zdF9mcmFjdGlvbik7Cit9CisKK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0Ojpyb3VuZFNpZ25pZmljYW5kV2l0aEV4cG9uZW50KGNvbnN0IGludGVnZXJQYXJ0ICpkZWNTaWdQYXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2lnUGFydENvdW50LCBpbnQgZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUgcm91bmRpbmdfbW9kZSkKK3sKKyAgdW5zaWduZWQgaW50IHBhcnRzLCBwb3c1UGFydENvdW50OworICBmbHRTZW1hbnRpY3MgY2FsY1NlbWFudGljcyA9IHsgMzI3NjcsIC0zMjc2NywgMCwgdHJ1ZSB9OworICBpbnRlZ2VyUGFydCBwb3c1UGFydHNbbWF4UG93ZXJPZkZpdmVQYXJ0c107CisgIGJvb2wgaXNOZWFyZXN0OworCisgIGlzTmVhcmVzdCA9IChyb3VuZGluZ19tb2RlID09IHJtTmVhcmVzdFRpZXNUb0V2ZW4gfHwKKyAgICAgICAgICAgICAgIHJvdW5kaW5nX21vZGUgPT0gcm1OZWFyZXN0VGllc1RvQXdheSk7CisKKyAgcGFydHMgPSBwYXJ0Q291bnRGb3JCaXRzKHNlbWFudGljcy0+cHJlY2lzaW9uICsgMTEpOworCisgIC8qIENhbGN1bGF0ZSBwb3coNSwgYWJzKGV4cCkpLiAgKi8KKyAgcG93NVBhcnRDb3VudCA9IHBvd2VyT2Y1KHBvdzVQYXJ0cywgZXhwID49IDAgPyBleHA6IC1leHApOworCisgIGZvciAoOzsgcGFydHMgKj0gMikgeworICAgIG9wU3RhdHVzIHNpZ1N0YXR1cywgcG93U3RhdHVzOworICAgIHVuc2lnbmVkIGludCBleGNlc3NQcmVjaXNpb24sIHRydW5jYXRlZEJpdHM7CisKKyAgICBjYWxjU2VtYW50aWNzLnByZWNpc2lvbiA9IHBhcnRzICogaW50ZWdlclBhcnRXaWR0aCAtIDE7CisgICAgZXhjZXNzUHJlY2lzaW9uID0gY2FsY1NlbWFudGljcy5wcmVjaXNpb24gLSBzZW1hbnRpY3MtPnByZWNpc2lvbjsKKyAgICB0cnVuY2F0ZWRCaXRzID0gZXhjZXNzUHJlY2lzaW9uOworCisgICAgQVBGbG9hdCBkZWNTaWcoY2FsY1NlbWFudGljcywgZmNaZXJvLCBzaWduKTsKKyAgICBBUEZsb2F0IHBvdzUoY2FsY1NlbWFudGljcywgZmNaZXJvLCBmYWxzZSk7CisKKyAgICBzaWdTdGF0dXMgPSBkZWNTaWcuY29udmVydEZyb21VbnNpZ25lZFBhcnRzKGRlY1NpZ1BhcnRzLCBzaWdQYXJ0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICBwb3dTdGF0dXMgPSBwb3c1LmNvbnZlcnRGcm9tVW5zaWduZWRQYXJ0cyhwb3c1UGFydHMsIHBvdzVQYXJ0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgLyogQWRkIGV4cCwgYXMgMTBebiA9IDVebiAqIDJebi4gICovCisgICAgZGVjU2lnLmV4cG9uZW50ICs9IGV4cDsKKworICAgIGxvc3RGcmFjdGlvbiBjYWxjTG9zdEZyYWN0aW9uOworICAgIGludGVnZXJQYXJ0IEhVZXJyLCBIVWRpc3RhbmNlOworICAgIHVuc2lnbmVkIGludCBwb3dIVWVycjsKKworICAgIGlmIChleHAgPj0gMCkgeworICAgICAgLyogbXVsdGlwbHlTaWduaWZpY2FuZCBsZWF2ZXMgdGhlIHByZWNpc2lvbi10aCBiaXQgc2V0IHRvIDEuICAqLworICAgICAgY2FsY0xvc3RGcmFjdGlvbiA9IGRlY1NpZy5tdWx0aXBseVNpZ25pZmljYW5kKHBvdzUsIE5VTEwpOworICAgICAgcG93SFVlcnIgPSBwb3dTdGF0dXMgIT0gb3BPSzsKKyAgICB9IGVsc2UgeworICAgICAgY2FsY0xvc3RGcmFjdGlvbiA9IGRlY1NpZy5kaXZpZGVTaWduaWZpY2FuZChwb3c1KTsKKyAgICAgIC8qIERlbm9ybWFsIG51bWJlcnMgaGF2ZSBsZXNzIHByZWNpc2lvbi4gICovCisgICAgICBpZiAoZGVjU2lnLmV4cG9uZW50IDwgc2VtYW50aWNzLT5taW5FeHBvbmVudCkgeworICAgICAgICBleGNlc3NQcmVjaXNpb24gKz0gKHNlbWFudGljcy0+bWluRXhwb25lbnQgLSBkZWNTaWcuZXhwb25lbnQpOworICAgICAgICB0cnVuY2F0ZWRCaXRzID0gZXhjZXNzUHJlY2lzaW9uOworICAgICAgICBpZiAoZXhjZXNzUHJlY2lzaW9uID4gY2FsY1NlbWFudGljcy5wcmVjaXNpb24pCisgICAgICAgICAgZXhjZXNzUHJlY2lzaW9uID0gY2FsY1NlbWFudGljcy5wcmVjaXNpb247CisgICAgICB9CisgICAgICAvKiBFeHRyYSBoYWxmLXVscCBsb3N0IGluIHJlY2lwcm9jYWwgb2YgZXhwb25lbnQuICAqLworICAgICAgcG93SFVlcnIgPSAocG93U3RhdHVzID09IG9wT0sgJiYgY2FsY0xvc3RGcmFjdGlvbiA9PSBsZkV4YWN0bHlaZXJvKSA/IDA6MjsKKyAgICB9CisKKyAgICAvKiBCb3RoIG11bHRpcGx5U2lnbmlmaWNhbmQgYW5kIGRpdmlkZVNpZ25pZmljYW5kIHJldHVybiB0aGUKKyAgICAgICByZXN1bHQgd2l0aCB0aGUgaW50ZWdlciBiaXQgc2V0LiAgKi8KKyAgICBhc3NlcnQoQVBJbnQ6OnRjRXh0cmFjdEJpdAorICAgICAgICAgICAoZGVjU2lnLnNpZ25pZmljYW5kUGFydHMoKSwgY2FsY1NlbWFudGljcy5wcmVjaXNpb24gLSAxKSA9PSAxKTsKKworICAgIEhVZXJyID0gSFVlcnJCb3VuZChjYWxjTG9zdEZyYWN0aW9uICE9IGxmRXhhY3RseVplcm8sIHNpZ1N0YXR1cyAhPSBvcE9LLAorICAgICAgICAgICAgICAgICAgICAgICBwb3dIVWVycik7CisgICAgSFVkaXN0YW5jZSA9IDIgKiB1bHBzRnJvbUJvdW5kYXJ5KGRlY1NpZy5zaWduaWZpY2FuZFBhcnRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2Vzc1ByZWNpc2lvbiwgaXNOZWFyZXN0KTsKKworICAgIC8qIEFyZSB3ZSBndWFyYW50ZWVkIHRvIHJvdW5kIGNvcnJlY3RseSBpZiB3ZSB0cnVuY2F0ZT8gICovCisgICAgaWYgKEhVZGlzdGFuY2UgPj0gSFVlcnIpIHsKKyAgICAgIEFQSW50Ojp0Y0V4dHJhY3Qoc2lnbmlmaWNhbmRQYXJ0cygpLCBwYXJ0Q291bnQoKSwgZGVjU2lnLnNpZ25pZmljYW5kUGFydHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsY1NlbWFudGljcy5wcmVjaXNpb24gLSBleGNlc3NQcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGV4Y2Vzc1ByZWNpc2lvbik7CisgICAgICAvKiBUYWtlIHRoZSBleHBvbmVudCBvZiBkZWNTaWcuICBJZiB3ZSB0Y0V4dHJhY3QtZWQgbGVzcyBiaXRzCisgICAgICAgICBhYm92ZSB3ZSBtdXN0IGFkanVzdCBvdXIgZXhwb25lbnQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlCisgICAgICAgICBpbXBsaWNpdCByaWdodCBzaGlmdC4gICovCisgICAgICBleHBvbmVudCA9IChkZWNTaWcuZXhwb25lbnQgKyBzZW1hbnRpY3MtPnByZWNpc2lvbgorICAgICAgICAgICAgICAgICAgLSAoY2FsY1NlbWFudGljcy5wcmVjaXNpb24gLSBleGNlc3NQcmVjaXNpb24pKTsKKyAgICAgIGNhbGNMb3N0RnJhY3Rpb24gPSBsb3N0RnJhY3Rpb25UaHJvdWdoVHJ1bmNhdGlvbihkZWNTaWcuc2lnbmlmaWNhbmRQYXJ0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY1NpZy5wYXJ0Q291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZWRCaXRzKTsKKyAgICAgIHJldHVybiBub3JtYWxpemUocm91bmRpbmdfbW9kZSwgY2FsY0xvc3RGcmFjdGlvbik7CisgICAgfQorICB9Cit9CisKK0FQRmxvYXQ6Om9wU3RhdHVzCitBUEZsb2F0Ojpjb252ZXJ0RnJvbURlY2ltYWxTdHJpbmcoU3RyaW5nUmVmIHN0ciwgcm91bmRpbmdNb2RlIHJvdW5kaW5nX21vZGUpCit7CisgIGRlY2ltYWxJbmZvIEQ7CisgIG9wU3RhdHVzIGZzOworCisgIC8qIFNjYW4gdGhlIHRleHQuICAqLworICBTdHJpbmdSZWY6Oml0ZXJhdG9yIHAgPSBzdHIuYmVnaW4oKTsKKyAgaW50ZXJwcmV0RGVjaW1hbChwLCBzdHIuZW5kKCksICZEKTsKKworICAvKiBIYW5kbGUgdGhlIHF1aWNrIGNhc2VzLiAgRmlyc3QgdGhlIGNhc2Ugb2Ygbm8gc2lnbmlmaWNhbnQgZGlnaXRzLAorICAgICBpLmUuIHplcm8sIGFuZCB0aGVuIGV4cG9uZW50cyB0aGF0IGFyZSBvYnZpb3VzbHkgdG9vIGxhcmdlIG9yIHRvbworICAgICBzbWFsbC4gIFdyaXRpbmcgTCBmb3IgbG9nIDEwIC8gbG9nIDIsIGEgbnVtYmVyIGQuZGRkZGQqMTBeZXhwCisgICAgIGRlZmluaXRlbHkgb3ZlcmZsb3dzIGlmCisKKyAgICAgICAgICAgKGV4cCAtIDEpICogTCA+PSBtYXhFeHBvbmVudAorCisgICAgIGFuZCBkZWZpbml0ZWx5IHVuZGVyZmxvd3MgdG8gemVybyB3aGVyZQorCisgICAgICAgICAgIChleHAgKyAxKSAqIEwgPD0gbWluRXhwb25lbnQgLSBwcmVjaXNpb24KKworICAgICBXaXRoIGludGVnZXIgYXJpdGhtZXRpYyB0aGUgdGlnaHRlc3QgYm91bmRzIGZvciBMIGFyZQorCisgICAgICAgICAgIDkzLzI4IDwgTCA8IDE5Ni81OSAgICAgICAgICAgIFsgbnVtZXJhdG9yIDw9IDI1NiBdCisgICAgICAgICAgIDQyMDM5LzEyNjU1IDwgTCA8IDI4NzM4Lzg2NTEgIFsgbnVtZXJhdG9yIDw9IDY1NTM2IF0KKyAgKi8KKworICBpZiAoZGVjRGlnaXRWYWx1ZSgqRC5maXJzdFNpZ0RpZ2l0KSA+PSAxMFUpIHsKKyAgICBjYXRlZ29yeSA9IGZjWmVybzsKKyAgICBmcyA9IG9wT0s7CisKKyAgLyogQ2hlY2sgd2hldGhlciB0aGUgbm9ybWFsaXplZCBleHBvbmVudCBpcyBoaWdoIGVub3VnaCB0byBvdmVyZmxvdworICAgICBtYXggZHVyaW5nIHRoZSBsb2ctcmViYXNpbmcgaW4gdGhlIG1heC1leHBvbmVudCBjaGVjayBiZWxvdy4gKi8KKyAgfSBlbHNlIGlmIChELm5vcm1hbGl6ZWRFeHBvbmVudCAtIDEgPiBJTlRfTUFYIC8gNDIwMzkpIHsKKyAgICBmcyA9IGhhbmRsZU92ZXJmbG93KHJvdW5kaW5nX21vZGUpOworCisgIC8qIElmIGl0IHdhc24ndCwgdGhlbiBpdCBhbHNvIHdhc24ndCBoaWdoIGVub3VnaCB0byBvdmVyZmxvdyBtYXgKKyAgICAgZHVyaW5nIHRoZSBsb2ctcmViYXNpbmcgaW4gdGhlIG1pbi1leHBvbmVudCBjaGVjay4gIENoZWNrIHRoYXQgaXQKKyAgICAgd29uJ3Qgb3ZlcmZsb3cgbWluIGluIGVpdGhlciBjaGVjaywgdGhlbiBwZXJmb3JtIHRoZSBtaW4tZXhwb25lbnQKKyAgICAgY2hlY2suICovCisgIH0gZWxzZSBpZiAoRC5ub3JtYWxpemVkRXhwb25lbnQgLSAxIDwgSU5UX01JTiAvIDQyMDM5IHx8CisgICAgICAgICAgICAgKEQubm9ybWFsaXplZEV4cG9uZW50ICsgMSkgKiAyODczOCA8PQorICAgICAgICAgICAgICAgODY1MSAqIChzZW1hbnRpY3MtPm1pbkV4cG9uZW50IC0gKGludCkgc2VtYW50aWNzLT5wcmVjaXNpb24pKSB7CisgICAgLyogVW5kZXJmbG93IHRvIHplcm8gYW5kIHJvdW5kLiAgKi8KKyAgICB6ZXJvU2lnbmlmaWNhbmQoKTsKKyAgICBmcyA9IG5vcm1hbGl6ZShyb3VuZGluZ19tb2RlLCBsZkxlc3NUaGFuSGFsZik7CisKKyAgLyogV2UgY2FuIGZpbmFsbHkgc2FmZWx5IHBlcmZvcm0gdGhlIG1heC1leHBvbmVudCBjaGVjay4gKi8KKyAgfSBlbHNlIGlmICgoRC5ub3JtYWxpemVkRXhwb25lbnQgLSAxKSAqIDQyMDM5CisgICAgICAgICAgICAgPj0gMTI2NTUgKiBzZW1hbnRpY3MtPm1heEV4cG9uZW50KSB7CisgICAgLyogT3ZlcmZsb3cgYW5kIHJvdW5kLiAgKi8KKyAgICBmcyA9IGhhbmRsZU92ZXJmbG93KHJvdW5kaW5nX21vZGUpOworICB9IGVsc2UgeworICAgIGludGVnZXJQYXJ0ICpkZWNTaWduaWZpY2FuZDsKKyAgICB1bnNpZ25lZCBpbnQgcGFydENvdW50OworCisgICAgLyogQSB0aWdodCB1cHBlciBib3VuZCBvbiBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBob2xkIGFuCisgICAgICAgTi1kaWdpdCBkZWNpbWFsIGludGVnZXIgaXMgTiAqIDE5NiAvIDU5LiAgQWxsb2NhdGUgZW5vdWdoIHNwYWNlCisgICAgICAgdG8gaG9sZCB0aGUgZnVsbCBzaWduaWZpY2FuZCwgYW5kIGFuIGV4dHJhIHBhcnQgcmVxdWlyZWQgYnkKKyAgICAgICB0Y011bHRpcGx5UGFydC4gICovCisgICAgcGFydENvdW50ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihELmxhc3RTaWdEaWdpdCAtIEQuZmlyc3RTaWdEaWdpdCkgKyAxOworICAgIHBhcnRDb3VudCA9IHBhcnRDb3VudEZvckJpdHMoMSArIDE5NiAqIHBhcnRDb3VudCAvIDU5KTsKKyAgICBkZWNTaWduaWZpY2FuZCA9IG5ldyBpbnRlZ2VyUGFydFtwYXJ0Q291bnQgKyAxXTsKKyAgICBwYXJ0Q291bnQgPSAwOworCisgICAgLyogQ29udmVydCB0byBiaW5hcnkgZWZmaWNpZW50bHkgLSB3ZSBkbyBhbG1vc3QgYWxsIG11bHRpcGxpY2F0aW9uCisgICAgICAgaW4gYW4gaW50ZWdlclBhcnQuICBXaGVuIHRoaXMgd291bGQgb3ZlcmZsb3cgZG8gd2UgZG8gYSBzaW5nbGUKKyAgICAgICBiaWdudW0gbXVsdGlwbGljYXRpb24sIGFuZCB0aGVuIHJldmVydCBhZ2FpbiB0byBtdWx0aXBsaWNhdGlvbgorICAgICAgIGluIGFuIGludGVnZXJQYXJ0LiAgKi8KKyAgICBkbyB7CisgICAgICBpbnRlZ2VyUGFydCBkZWNWYWx1ZSwgdmFsLCBtdWx0aXBsaWVyOworCisgICAgICB2YWwgPSAwOworICAgICAgbXVsdGlwbGllciA9IDE7CisKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKCpwID09ICcuJykgeworICAgICAgICAgIHArKzsKKyAgICAgICAgICBpZiAocCA9PSBzdHIuZW5kKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWNWYWx1ZSA9IGRlY0RpZ2l0VmFsdWUoKnArKyk7CisgICAgICAgIGFzc2VydChkZWNWYWx1ZSA8IDEwVSAmJiAiSW52YWxpZCBjaGFyYWN0ZXIgaW4gc2lnbmlmaWNhbmQiKTsKKyAgICAgICAgbXVsdGlwbGllciAqPSAxMDsKKyAgICAgICAgdmFsID0gdmFsICogMTAgKyBkZWNWYWx1ZTsKKyAgICAgICAgLyogVGhlIG1heGltdW0gbnVtYmVyIHRoYXQgY2FuIGJlIG11bHRpcGxpZWQgYnkgdGVuIHdpdGggYW55CisgICAgICAgICAgIGRpZ2l0IGFkZGVkIHdpdGhvdXQgb3ZlcmZsb3dpbmcgYW4gaW50ZWdlclBhcnQuICAqLworICAgICAgfSB3aGlsZSAocCA8PSBELmxhc3RTaWdEaWdpdCAmJiBtdWx0aXBsaWVyIDw9ICh+IChpbnRlZ2VyUGFydCkgMCAtIDkpIC8gMTApOworCisgICAgICAvKiBNdWx0aXBseSBvdXQgdGhlIGN1cnJlbnQgcGFydC4gICovCisgICAgICBBUEludDo6dGNNdWx0aXBseVBhcnQoZGVjU2lnbmlmaWNhbmQsIGRlY1NpZ25pZmljYW5kLCBtdWx0aXBsaWVyLCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydENvdW50LCBwYXJ0Q291bnQgKyAxLCBmYWxzZSk7CisKKyAgICAgIC8qIElmIHdlIHVzZWQgYW5vdGhlciBwYXJ0IChsaWtlbHkgYnV0IG5vdCBndWFyYW50ZWVkKSwgaW5jcmVhc2UKKyAgICAgICAgIHRoZSBjb3VudC4gICovCisgICAgICBpZiAoZGVjU2lnbmlmaWNhbmRbcGFydENvdW50XSkKKyAgICAgICAgcGFydENvdW50Kys7CisgICAgfSB3aGlsZSAocCA8PSBELmxhc3RTaWdEaWdpdCk7CisKKyAgICBjYXRlZ29yeSA9IGZjTm9ybWFsOworICAgIGZzID0gcm91bmRTaWduaWZpY2FuZFdpdGhFeHBvbmVudChkZWNTaWduaWZpY2FuZCwgcGFydENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELmV4cG9uZW50LCByb3VuZGluZ19tb2RlKTsKKworICAgIGRlbGV0ZSBbXSBkZWNTaWduaWZpY2FuZDsKKyAgfQorCisgIHJldHVybiBmczsKK30KKworQVBGbG9hdDo6b3BTdGF0dXMKK0FQRmxvYXQ6OmNvbnZlcnRGcm9tU3RyaW5nKFN0cmluZ1JlZiBzdHIsIHJvdW5kaW5nTW9kZSByb3VuZGluZ19tb2RlKQoreworICBhc3NlcnRBcml0aG1ldGljT0soKnNlbWFudGljcyk7CisgIGFzc2VydCghc3RyLmVtcHR5KCkgJiYgIkludmFsaWQgc3RyaW5nIGxlbmd0aCIpOworCisgIC8qIEhhbmRsZSBhIGxlYWRpbmcgbWludXMgc2lnbi4gICovCisgIFN0cmluZ1JlZjo6aXRlcmF0b3IgcCA9IHN0ci5iZWdpbigpOworICBzaXplX3Qgc2xlbiA9IHN0ci5zaXplKCk7CisgIHNpZ24gPSAqcCA9PSAnLScgPyAxIDogMDsKKyAgaWYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpIHsKKyAgICBwKys7CisgICAgc2xlbi0tOworICAgIGFzc2VydChzbGVuICYmICJTdHJpbmcgaGFzIG5vIGRpZ2l0cyIpOworICB9CisKKyAgaWYgKHNsZW4gPj0gMiAmJiBwWzBdID09ICcwJyAmJiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpKSB7CisgICAgYXNzZXJ0KHNsZW4gLSAyICYmICJJbnZhbGlkIHN0cmluZyIpOworICAgIHJldHVybiBjb252ZXJ0RnJvbUhleGFkZWNpbWFsU3RyaW5nKFN0cmluZ1JlZihwICsgMiwgc2xlbiAtIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nX21vZGUpOworICB9CisKKyAgcmV0dXJuIGNvbnZlcnRGcm9tRGVjaW1hbFN0cmluZyhTdHJpbmdSZWYocCwgc2xlbiksIHJvdW5kaW5nX21vZGUpOworfQorCisvKiBXcml0ZSBvdXQgYSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAgIHRvIERTVCwgd2hpY2ggbXVzdCBiZSBvZiBzdWZmaWNpZW50IHNpemUsIGluIHRoZSBDOTkgZm9ybQorICAgWy1dMHhoLmhoaGhwWystXWQuICBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sCisgICBleGNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKworICAgSWYgVVBQRVJDQVNFLCB0aGUgb3V0cHV0IGlzIGluIHVwcGVyIGNhc2UsIG90aGVyd2lzZSBpbiBsb3dlciBjYXNlLgorCisgICBIRVhESUdJVFMgZGlnaXRzIGFwcGVhciBhbHRvZ2V0aGVyLCByb3VuZGluZyB0aGUgdmFsdWUgaWYKKyAgIG5lY2Vzc2FyeS4gIElmIEhFWERJR0lUUyBpcyAwLCB0aGUgbWluaW1hbCBwcmVjaXNpb24gdG8gZGlzcGxheSB0aGUKKyAgIG51bWJlciBwcmVjaXNlbHkgaXMgdXNlZCBpbnN0ZWFkLiAgSWYgbm90aGluZyB3b3VsZCBhcHBlYXIgYWZ0ZXIKKyAgIHRoZSBkZWNpbWFsIHBvaW50IGl0IGlzIHN1cHByZXNzZWQuCisKKyAgIFRoZSBkZWNpbWFsIGV4cG9uZW50IGlzIGFsd2F5cyBwcmludGVkIGFuZCBoYXMgYXQgbGVhc3Qgb25lIGRpZ2l0LgorICAgWmVybyB2YWx1ZXMgZGlzcGxheSBhbiBleHBvbmVudCBvZiB6ZXJvLiAgSW5maW5pdGllcyBhbmQgTmFOcworICAgYXBwZWFyIGFzICJpbmZpbml0eSIgb3IgIm5hbiIgcmVzcGVjdGl2ZWx5LgorCisgICBUaGUgYWJvdmUgcnVsZXMgYXJlIGFzIHNwZWNpZmllZCBieSBDOTkuICBUaGVyZSBpcyBhbWJpZ3VpdHkgYWJvdXQKKyAgIHdoYXQgdGhlIGxlYWRpbmcgaGV4YWRlY2ltYWwgZGlnaXQgc2hvdWxkIGJlLiAgVGhpcyBpbXBsZW1lbnRhdGlvbgorICAgdXNlcyB3aGF0ZXZlciBpcyBuZWNlc3Nhcnkgc28gdGhhdCB0aGUgZXhwb25lbnQgaXMgZGlzcGxheWVkIGFzCisgICBzdG9yZWQuICBUaGlzIGltcGxpZXMgdGhlIGV4cG9uZW50IHdpbGwgZmFsbCB3aXRoaW4gdGhlIElFRUUgZm9ybWF0CisgICByYW5nZSwgYW5kIHRoZSBsZWFkaW5nIGhleGFkZWNpbWFsIGRpZ2l0IHdpbGwgYmUgMCAoZm9yIGRlbm9ybWFscyksCisgICAxIChub3JtYWwgbnVtYmVycykgb3IgMiAobm9ybWFsIG51bWJlcnMgcm91bmRlZC1hd2F5LWZyb20temVybyB3aXRoCisgICBhbnkgb3RoZXIgZGlnaXRzIHplcm8pLgorKi8KK3Vuc2lnbmVkIGludAorQVBGbG9hdDo6Y29udmVydFRvSGV4U3RyaW5nKGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGhleERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVwcGVyQ2FzZSwgcm91bmRpbmdNb2RlIHJvdW5kaW5nX21vZGUpIGNvbnN0Cit7CisgIGNoYXIgKnA7CisKKyAgYXNzZXJ0QXJpdGhtZXRpY09LKCpzZW1hbnRpY3MpOworCisgIHAgPSBkc3Q7CisgIGlmIChzaWduKQorICAgICpkc3QrKyA9ICctJzsKKworICBzd2l0Y2ggKGNhdGVnb3J5KSB7CisgIGNhc2UgZmNJbmZpbml0eToKKyAgICBtZW1jcHkgKGRzdCwgdXBwZXJDYXNlID8gaW5maW5pdHlVOiBpbmZpbml0eUwsIHNpemVvZiBpbmZpbml0eVUgLSAxKTsKKyAgICBkc3QgKz0gc2l6ZW9mIGluZmluaXR5TCAtIDE7CisgICAgYnJlYWs7CisKKyAgY2FzZSBmY05hTjoKKyAgICBtZW1jcHkgKGRzdCwgdXBwZXJDYXNlID8gTmFOVTogTmFOTCwgc2l6ZW9mIE5hTlUgLSAxKTsKKyAgICBkc3QgKz0gc2l6ZW9mIE5hTlUgLSAxOworICAgIGJyZWFrOworCisgIGNhc2UgZmNaZXJvOgorICAgICpkc3QrKyA9ICcwJzsKKyAgICAqZHN0KysgPSB1cHBlckNhc2UgPyAnWCc6ICd4JzsKKyAgICAqZHN0KysgPSAnMCc7CisgICAgaWYgKGhleERpZ2l0cyA+IDEpIHsKKyAgICAgICpkc3QrKyA9ICcuJzsKKyAgICAgIG1lbXNldCAoZHN0LCAnMCcsIGhleERpZ2l0cyAtIDEpOworICAgICAgZHN0ICs9IGhleERpZ2l0cyAtIDE7CisgICAgfQorICAgICpkc3QrKyA9IHVwcGVyQ2FzZSA/ICdQJzogJ3AnOworICAgICpkc3QrKyA9ICcwJzsKKyAgICBicmVhazsKKworICBjYXNlIGZjTm9ybWFsOgorICAgIGRzdCA9IGNvbnZlcnROb3JtYWxUb0hleFN0cmluZyAoZHN0LCBoZXhEaWdpdHMsIHVwcGVyQ2FzZSwgcm91bmRpbmdfbW9kZSk7CisgICAgYnJlYWs7CisgIH0KKworICAqZHN0ID0gMDsKKworICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pihkc3QgLSBwKTsKK30KKworLyogRG9lcyB0aGUgaGFyZCB3b3JrIG9mIG91dHB1dHRpbmcgdGhlIGNvcnJlY3RseSByb3VuZGVkIGhleGFkZWNpbWFsCisgICBmb3JtIG9mIGEgbm9ybWFsIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICBoZXhhZGVjaW1hbCBkaWdpdHMuICBJZiBIRVhESUdJVFMgaXMgemVybyB0aGUgbWluaW11bSBudW1iZXIgb2YKKyAgIGRpZ2l0cyBuZWNlc3NhcnkgdG8gcHJpbnQgdGhlIHZhbHVlIHByZWNpc2VseSBpcyBvdXRwdXQuICAqLworY2hhciAqCitBUEZsb2F0Ojpjb252ZXJ0Tm9ybWFsVG9IZXhTdHJpbmcoY2hhciAqZHN0LCB1bnNpZ25lZCBpbnQgaGV4RGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXBwZXJDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSByb3VuZGluZ19tb2RlKSBjb25zdAoreworICB1bnNpZ25lZCBpbnQgY291bnQsIHZhbHVlQml0cywgc2hpZnQsIHBhcnRzQ291bnQsIG91dHB1dERpZ2l0czsKKyAgY29uc3QgY2hhciAqaGV4RGlnaXRDaGFyczsKKyAgY29uc3QgaW50ZWdlclBhcnQgKnNpZ25pZmljYW5kOworICBjaGFyICpwOworICBib29sIHJvdW5kVXA7CisKKyAgKmRzdCsrID0gJzAnOworICAqZHN0KysgPSB1cHBlckNhc2UgPyAnWCc6ICd4JzsKKworICByb3VuZFVwID0gZmFsc2U7CisgIGhleERpZ2l0Q2hhcnMgPSB1cHBlckNhc2UgPyBoZXhEaWdpdHNVcHBlcjogaGV4RGlnaXRzTG93ZXI7CisKKyAgc2lnbmlmaWNhbmQgPSBzaWduaWZpY2FuZFBhcnRzKCk7CisgIHBhcnRzQ291bnQgPSBwYXJ0Q291bnQoKTsKKworICAvKiArMyBiZWNhdXNlIHRoZSBmaXJzdCBkaWdpdCBvbmx5IHVzZXMgdGhlIHNpbmdsZSBpbnRlZ2VyIGJpdCwgc28KKyAgICAgd2UgaGF2ZSAzIHZpcnR1YWwgemVybyBtb3N0LXNpZ25pZmljYW50LWJpdHMuICAqLworICB2YWx1ZUJpdHMgPSBzZW1hbnRpY3MtPnByZWNpc2lvbiArIDM7CisgIHNoaWZ0ID0gaW50ZWdlclBhcnRXaWR0aCAtIHZhbHVlQml0cyAlIGludGVnZXJQYXJ0V2lkdGg7CisKKyAgLyogVGhlIG5hdHVyYWwgbnVtYmVyIG9mIGRpZ2l0cyByZXF1aXJlZCBpZ25vcmluZyB0cmFpbGluZworICAgICBpbnNpZ25pZmljYW50IHplcm9lcy4gICovCisgIG91dHB1dERpZ2l0cyA9ICh2YWx1ZUJpdHMgLSBzaWduaWZpY2FuZExTQiAoKSArIDMpIC8gNDsKKworICAvKiBoZXhEaWdpdHMgb2YgemVybyBtZWFucyB1c2UgdGhlIHJlcXVpcmVkIG51bWJlciBmb3IgdGhlCisgICAgIHByZWNpc2lvbi4gIE90aGVyd2lzZSwgc2VlIGlmIHdlIGFyZSB0cnVuY2F0aW5nLiAgSWYgd2UgYXJlLAorICAgICBmaW5kIG91dCBpZiB3ZSBuZWVkIHRvIHJvdW5kIGF3YXkgZnJvbSB6ZXJvLiAgKi8KKyAgaWYgKGhleERpZ2l0cykgeworICAgIGlmIChoZXhEaWdpdHMgPCBvdXRwdXREaWdpdHMpIHsKKyAgICAgIC8qIFdlIGFyZSBkcm9wcGluZyBub24temVybyBiaXRzLCBzbyBuZWVkIHRvIGNoZWNrIGhvdyB0byByb3VuZC4KKyAgICAgICAgICJiaXRzIiBpcyB0aGUgbnVtYmVyIG9mIGRyb3BwZWQgYml0cy4gICovCisgICAgICB1bnNpZ25lZCBpbnQgYml0czsKKyAgICAgIGxvc3RGcmFjdGlvbiBmcmFjdGlvbjsKKworICAgICAgYml0cyA9IHZhbHVlQml0cyAtIGhleERpZ2l0cyAqIDQ7CisgICAgICBmcmFjdGlvbiA9IGxvc3RGcmFjdGlvblRocm91Z2hUcnVuY2F0aW9uIChzaWduaWZpY2FuZCwgcGFydHNDb3VudCwgYml0cyk7CisgICAgICByb3VuZFVwID0gcm91bmRBd2F5RnJvbVplcm8ocm91bmRpbmdfbW9kZSwgZnJhY3Rpb24sIGJpdHMpOworICAgIH0KKyAgICBvdXRwdXREaWdpdHMgPSBoZXhEaWdpdHM7CisgIH0KKworICAvKiBXcml0ZSB0aGUgZGlnaXRzIGNvbnNlY3V0aXZlbHksIGFuZCBzdGFydCB3cml0aW5nIGluIHRoZSBsb2NhdGlvbgorICAgICBvZiB0aGUgaGV4YWRlY2ltYWwgcG9pbnQuICBXZSBtb3ZlIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0CisgICAgIGxlZnQgYW5kIGFkZCB0aGUgaGV4YWRlY2ltYWwgcG9pbnQgbGF0ZXIuICAqLworICBwID0gKytkc3Q7CisKKyAgY291bnQgPSAodmFsdWVCaXRzICsgaW50ZWdlclBhcnRXaWR0aCAtIDEpIC8gaW50ZWdlclBhcnRXaWR0aDsKKworICB3aGlsZSAob3V0cHV0RGlnaXRzICYmIGNvdW50KSB7CisgICAgaW50ZWdlclBhcnQgcGFydDsKKworICAgIC8qIFB1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBpbnRlZ2VyUGFydFdpZHRoIGJpdHMgaW4gInBhcnQiLiAgKi8KKyAgICBpZiAoLS1jb3VudCA9PSBwYXJ0c0NvdW50KQorICAgICAgcGFydCA9IDA7ICAvKiBBbiBpbWFnaW5hcnkgaGlnaGVyIHplcm8gcGFydC4gICovCisgICAgZWxzZQorICAgICAgcGFydCA9IHNpZ25pZmljYW5kW2NvdW50XSA8PCBzaGlmdDsKKworICAgIGlmIChjb3VudCAmJiBzaGlmdCkKKyAgICAgIHBhcnQgfD0gc2lnbmlmaWNhbmRbY291bnQgLSAxXSA+PiAoaW50ZWdlclBhcnRXaWR0aCAtIHNoaWZ0KTsKKworICAgIC8qIENvbnZlcnQgYXMgbXVjaCBvZiAicGFydCIgdG8gaGV4ZGlnaXRzIGFzIHdlIGNhbi4gICovCisgICAgdW5zaWduZWQgaW50IGN1ckRpZ2l0cyA9IGludGVnZXJQYXJ0V2lkdGggLyA0OworCisgICAgaWYgKGN1ckRpZ2l0cyA+IG91dHB1dERpZ2l0cykKKyAgICAgIGN1ckRpZ2l0cyA9IG91dHB1dERpZ2l0czsKKyAgICBkc3QgKz0gcGFydEFzSGV4IChkc3QsIHBhcnQsIGN1ckRpZ2l0cywgaGV4RGlnaXRDaGFycyk7CisgICAgb3V0cHV0RGlnaXRzIC09IGN1ckRpZ2l0czsKKyAgfQorCisgIGlmIChyb3VuZFVwKSB7CisgICAgY2hhciAqcSA9IGRzdDsKKworICAgIC8qIE5vdGUgdGhhdCBoZXhEaWdpdENoYXJzIGhhcyBhIHRyYWlsaW5nICcwJy4gICovCisgICAgZG8geworICAgICAgcS0tOworICAgICAgKnEgPSBoZXhEaWdpdENoYXJzW2hleERpZ2l0VmFsdWUgKCpxKSArIDFdOworICAgIH0gd2hpbGUgKCpxID09ICcwJyk7CisgICAgYXNzZXJ0KHEgPj0gcCk7CisgIH0gZWxzZSB7CisgICAgLyogQWRkIHRyYWlsaW5nIHplcm9lcy4gICovCisgICAgbWVtc2V0IChkc3QsICcwJywgb3V0cHV0RGlnaXRzKTsKKyAgICBkc3QgKz0gb3V0cHV0RGlnaXRzOworICB9CisKKyAgLyogTW92ZSB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCB0byBiZWZvcmUgdGhlIHBvaW50LCBhbmQgaWYgdGhlcmUKKyAgICAgaXMgc29tZXRoaW5nIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGFkZCBpdC4gIFRoaXMgbXVzdCBjb21lCisgICAgIGFmdGVyIHJvdW5kaW5nIGFib3ZlLiAgKi8KKyAgcFstMV0gPSBwWzBdOworICBpZiAoZHN0IC0xID09IHApCisgICAgZHN0LS07CisgIGVsc2UKKyAgICBwWzBdID0gJy4nOworCisgIC8qIEZpbmFsbHkgb3V0cHV0IHRoZSBleHBvbmVudC4gICovCisgICpkc3QrKyA9IHVwcGVyQ2FzZSA/ICdQJzogJ3AnOworCisgIHJldHVybiB3cml0ZVNpZ25lZERlY2ltYWwgKGRzdCwgZXhwb25lbnQpOworfQorCisvLyBGb3IgZ29vZCBwZXJmb3JtYW5jZSBpdCBpcyBkZXNpcmFibGUgZm9yIGRpZmZlcmVudCBBUEZsb2F0cworLy8gdG8gcHJvZHVjZSBkaWZmZXJlbnQgaW50ZWdlcnMuCit1aW50MzJfdAorQVBGbG9hdDo6Z2V0SGFzaFZhbHVlKCkgY29uc3QKK3sKKyAgaWYgKGNhdGVnb3J5PT1mY1plcm8pIHJldHVybiBzaWduPDw4IHwgc2VtYW50aWNzLT5wcmVjaXNpb24gOworICBlbHNlIGlmIChjYXRlZ29yeT09ZmNJbmZpbml0eSkgcmV0dXJuIHNpZ248PDkgfCBzZW1hbnRpY3MtPnByZWNpc2lvbjsKKyAgZWxzZSBpZiAoY2F0ZWdvcnk9PWZjTmFOKSByZXR1cm4gMTw8MTAgfCBzZW1hbnRpY3MtPnByZWNpc2lvbjsKKyAgZWxzZSB7CisgICAgdWludDMyX3QgaGFzaCA9IHNpZ248PDExIHwgc2VtYW50aWNzLT5wcmVjaXNpb24gfCBleHBvbmVudDw8MTI7CisgICAgY29uc3QgaW50ZWdlclBhcnQqIHAgPSBzaWduaWZpY2FuZFBhcnRzKCk7CisgICAgZm9yIChpbnQgaT1wYXJ0Q291bnQoKTsgaT4wOyBpLS0sIHArKykKKyAgICAgIGhhc2ggXj0gKCh1aW50MzJfdCkqcCkgXiAodWludDMyX3QpKCgqcCk+PjMyKTsKKyAgICByZXR1cm4gaGFzaDsKKyAgfQorfQorCisvLyBDb252ZXJzaW9uIGZyb20gQVBGbG9hdCB0by9mcm9tIGhvc3QgZmxvYXQvZG91YmxlLiAgSXQgbWF5IGV2ZW50dWFsbHkgYmUKKy8vIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSB0aGVzZSBhbmQgaGF2ZSBldmVyeWJvZHkgZGVhbCB3aXRoIEFQRmxvYXRzLCBidXQgdGhhdAorLy8gd2lsbCB0YWtlIGEgd2hpbGUuICBUaGlzIGFwcHJvYWNoIHdpbGwgbm90IGVhc2lseSBleHRlbmQgdG8gbG9uZyBkb3VibGUuCisvLyBDdXJyZW50IGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGludGVnZXJQYXJ0V2lkdGg9PTY0LCB3aGljaCBpcyBjb3JyZWN0IGF0CisvLyB0aGUgbW9tZW50IGJ1dCBjb3VsZCBiZSBtYWRlIG1vcmUgZ2VuZXJhbC4KKworLy8gRGVub3JtYWxzIGhhdmUgZXhwb25lbnQgbWluRXhwb25lbnQgaW4gQVBGbG9hdCwgYnV0IG1pbkV4cG9uZW50LTEgaW4KKy8vIHRoZSBhY3R1YWwgSUVFRSByZXNwcmVzZW50YXRpb25zLiAgV2UgY29tcGVuc2F0ZSBmb3IgdGhhdCBoZXJlLgorCitBUEludAorQVBGbG9hdDo6Y29udmVydEY4MExvbmdEb3VibGVBUEZsb2F0VG9BUEludCgpIGNvbnN0Cit7CisgIGFzc2VydChzZW1hbnRpY3MgPT0gKGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyopJng4N0RvdWJsZUV4dGVuZGVkKTsKKyAgYXNzZXJ0KHBhcnRDb3VudCgpPT0yKTsKKworICB1aW50NjRfdCBteWV4cG9uZW50LCBteXNpZ25pZmljYW5kOworCisgIGlmIChjYXRlZ29yeT09ZmNOb3JtYWwpIHsKKyAgICBteWV4cG9uZW50ID0gZXhwb25lbnQrMTYzODM7IC8vYmlhcworICAgIG15c2lnbmlmaWNhbmQgPSBzaWduaWZpY2FuZFBhcnRzKClbMF07CisgICAgaWYgKG15ZXhwb25lbnQ9PTEgJiYgIShteXNpZ25pZmljYW5kICYgMHg4MDAwMDAwMDAwMDAwMDAwVUxMKSkKKyAgICAgIG15ZXhwb25lbnQgPSAwOyAgIC8vIGRlbm9ybWFsCisgIH0gZWxzZSBpZiAoY2F0ZWdvcnk9PWZjWmVybykgeworICAgIG15ZXhwb25lbnQgPSAwOworICAgIG15c2lnbmlmaWNhbmQgPSAwOworICB9IGVsc2UgaWYgKGNhdGVnb3J5PT1mY0luZmluaXR5KSB7CisgICAgbXlleHBvbmVudCA9IDB4N2ZmZjsKKyAgICBteXNpZ25pZmljYW5kID0gMHg4MDAwMDAwMDAwMDAwMDAwVUxMOworICB9IGVsc2UgeworICAgIGFzc2VydChjYXRlZ29yeSA9PSBmY05hTiAmJiAiVW5rbm93biBjYXRlZ29yeSIpOworICAgIG15ZXhwb25lbnQgPSAweDdmZmY7CisgICAgbXlzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kUGFydHMoKVswXTsKKyAgfQorCisgIHVpbnQ2NF90IHdvcmRzWzJdOworICB3b3Jkc1swXSA9IG15c2lnbmlmaWNhbmQ7CisgIHdvcmRzWzFdID0gICgodWludDY0X3QpKHNpZ24gJiAxKSA8PCAxNSkgfAorICAgICAgICAgICAgICAobXlleHBvbmVudCAmIDB4N2ZmZkxMKTsKKyAgcmV0dXJuIEFQSW50KDgwLCAyLCB3b3Jkcyk7Cit9CisKK0FQSW50CitBUEZsb2F0Ojpjb252ZXJ0UFBDRG91YmxlRG91YmxlQVBGbG9hdFRvQVBJbnQoKSBjb25zdAoreworICBhc3NlcnQoc2VtYW50aWNzID09IChjb25zdCBsbHZtOjpmbHRTZW1hbnRpY3MqKSZQUENEb3VibGVEb3VibGUpOworICBhc3NlcnQocGFydENvdW50KCk9PTIpOworCisgIHVpbnQ2NF90IG15ZXhwb25lbnQsIG15c2lnbmlmaWNhbmQsIG15ZXhwb25lbnQyLCBteXNpZ25pZmljYW5kMjsKKworICBpZiAoY2F0ZWdvcnk9PWZjTm9ybWFsKSB7CisgICAgbXlleHBvbmVudCA9IGV4cG9uZW50ICsgMTAyMzsgLy9iaWFzCisgICAgbXlleHBvbmVudDIgPSBleHBvbmVudDIgKyAxMDIzOworICAgIG15c2lnbmlmaWNhbmQgPSBzaWduaWZpY2FuZFBhcnRzKClbMF07CisgICAgbXlzaWduaWZpY2FuZDIgPSBzaWduaWZpY2FuZFBhcnRzKClbMV07CisgICAgaWYgKG15ZXhwb25lbnQ9PTEgJiYgIShteXNpZ25pZmljYW5kICYgMHgxMDAwMDAwMDAwMDAwMExMKSkKKyAgICAgIG15ZXhwb25lbnQgPSAwOyAgIC8vIGRlbm9ybWFsCisgICAgaWYgKG15ZXhwb25lbnQyPT0xICYmICEobXlzaWduaWZpY2FuZDIgJiAweDEwMDAwMDAwMDAwMDAwTEwpKQorICAgICAgbXlleHBvbmVudDIgPSAwOyAgIC8vIGRlbm9ybWFsCisgIH0gZWxzZSBpZiAoY2F0ZWdvcnk9PWZjWmVybykgeworICAgIG15ZXhwb25lbnQgPSAwOworICAgIG15c2lnbmlmaWNhbmQgPSAwOworICAgIG15ZXhwb25lbnQyID0gMDsKKyAgICBteXNpZ25pZmljYW5kMiA9IDA7CisgIH0gZWxzZSBpZiAoY2F0ZWdvcnk9PWZjSW5maW5pdHkpIHsKKyAgICBteWV4cG9uZW50ID0gMHg3ZmY7CisgICAgbXlleHBvbmVudDIgPSAwOworICAgIG15c2lnbmlmaWNhbmQgPSAwOworICAgIG15c2lnbmlmaWNhbmQyID0gMDsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoY2F0ZWdvcnkgPT0gZmNOYU4gJiYgIlVua25vd24gY2F0ZWdvcnkiKTsKKyAgICBteWV4cG9uZW50ID0gMHg3ZmY7CisgICAgbXlzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kUGFydHMoKVswXTsKKyAgICBteWV4cG9uZW50MiA9IGV4cG9uZW50MjsKKyAgICBteXNpZ25pZmljYW5kMiA9IHNpZ25pZmljYW5kUGFydHMoKVsxXTsKKyAgfQorCisgIHVpbnQ2NF90IHdvcmRzWzJdOworICB3b3Jkc1swXSA9ICAoKHVpbnQ2NF90KShzaWduICYgMSkgPDwgNjMpIHwKKyAgICAgICAgICAgICAgKChteWV4cG9uZW50ICYgMHg3ZmYpIDw8ICA1MikgfAorICAgICAgICAgICAgICAobXlzaWduaWZpY2FuZCAmIDB4ZmZmZmZmZmZmZmZmZkxMKTsKKyAgd29yZHNbMV0gPSAgKCh1aW50NjRfdCkoc2lnbjIgJiAxKSA8PCA2MykgfAorICAgICAgICAgICAgICAoKG15ZXhwb25lbnQyICYgMHg3ZmYpIDw8ICA1MikgfAorICAgICAgICAgICAgICAobXlzaWduaWZpY2FuZDIgJiAweGZmZmZmZmZmZmZmZmZMTCk7CisgIHJldHVybiBBUEludCgxMjgsIDIsIHdvcmRzKTsKK30KKworQVBJbnQKK0FQRmxvYXQ6OmNvbnZlcnRRdWFkcnVwbGVBUEZsb2F0VG9BUEludCgpIGNvbnN0Cit7CisgIGFzc2VydChzZW1hbnRpY3MgPT0gKGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyopJklFRUVxdWFkKTsKKyAgYXNzZXJ0KHBhcnRDb3VudCgpPT0yKTsKKworICB1aW50NjRfdCBteWV4cG9uZW50LCBteXNpZ25pZmljYW5kLCBteXNpZ25pZmljYW5kMjsKKworICBpZiAoY2F0ZWdvcnk9PWZjTm9ybWFsKSB7CisgICAgbXlleHBvbmVudCA9IGV4cG9uZW50KzE2MzgzOyAvL2JpYXMKKyAgICBteXNpZ25pZmljYW5kID0gc2lnbmlmaWNhbmRQYXJ0cygpWzBdOworICAgIG15c2lnbmlmaWNhbmQyID0gc2lnbmlmaWNhbmRQYXJ0cygpWzFdOworICAgIGlmIChteWV4cG9uZW50PT0xICYmICEobXlzaWduaWZpY2FuZDIgJiAweDEwMDAwMDAwMDAwMDBMTCkpCisgICAgICBteWV4cG9uZW50ID0gMDsgICAvLyBkZW5vcm1hbAorICB9IGVsc2UgaWYgKGNhdGVnb3J5PT1mY1plcm8pIHsKKyAgICBteWV4cG9uZW50ID0gMDsKKyAgICBteXNpZ25pZmljYW5kID0gbXlzaWduaWZpY2FuZDIgPSAwOworICB9IGVsc2UgaWYgKGNhdGVnb3J5PT1mY0luZmluaXR5KSB7CisgICAgbXlleHBvbmVudCA9IDB4N2ZmZjsKKyAgICBteXNpZ25pZmljYW5kID0gbXlzaWduaWZpY2FuZDIgPSAwOworICB9IGVsc2UgeworICAgIGFzc2VydChjYXRlZ29yeSA9PSBmY05hTiAmJiAiVW5rbm93biBjYXRlZ29yeSEiKTsKKyAgICBteWV4cG9uZW50ID0gMHg3ZmZmOworICAgIG15c2lnbmlmaWNhbmQgPSBzaWduaWZpY2FuZFBhcnRzKClbMF07CisgICAgbXlzaWduaWZpY2FuZDIgPSBzaWduaWZpY2FuZFBhcnRzKClbMV07CisgIH0KKworICB1aW50NjRfdCB3b3Jkc1syXTsKKyAgd29yZHNbMF0gPSBteXNpZ25pZmljYW5kOworICB3b3Jkc1sxXSA9ICgodWludDY0X3QpKHNpZ24gJiAxKSA8PCA2MykgfAorICAgICAgICAgICAgICgobXlleHBvbmVudCAmIDB4N2ZmZikgPDwgNDgpIHwKKyAgICAgICAgICAgICAobXlzaWduaWZpY2FuZDIgJiAweGZmZmZmZmZmZmZmZkxMKTsKKworICByZXR1cm4gQVBJbnQoMTI4LCAyLCB3b3Jkcyk7Cit9CisKK0FQSW50CitBUEZsb2F0Ojpjb252ZXJ0RG91YmxlQVBGbG9hdFRvQVBJbnQoKSBjb25zdAoreworICBhc3NlcnQoc2VtYW50aWNzID09IChjb25zdCBsbHZtOjpmbHRTZW1hbnRpY3MqKSZJRUVFZG91YmxlKTsKKyAgYXNzZXJ0KHBhcnRDb3VudCgpPT0xKTsKKworICB1aW50NjRfdCBteWV4cG9uZW50LCBteXNpZ25pZmljYW5kOworCisgIGlmIChjYXRlZ29yeT09ZmNOb3JtYWwpIHsKKyAgICBteWV4cG9uZW50ID0gZXhwb25lbnQrMTAyMzsgLy9iaWFzCisgICAgbXlzaWduaWZpY2FuZCA9ICpzaWduaWZpY2FuZFBhcnRzKCk7CisgICAgaWYgKG15ZXhwb25lbnQ9PTEgJiYgIShteXNpZ25pZmljYW5kICYgMHgxMDAwMDAwMDAwMDAwMExMKSkKKyAgICAgIG15ZXhwb25lbnQgPSAwOyAgIC8vIGRlbm9ybWFsCisgIH0gZWxzZSBpZiAoY2F0ZWdvcnk9PWZjWmVybykgeworICAgIG15ZXhwb25lbnQgPSAwOworICAgIG15c2lnbmlmaWNhbmQgPSAwOworICB9IGVsc2UgaWYgKGNhdGVnb3J5PT1mY0luZmluaXR5KSB7CisgICAgbXlleHBvbmVudCA9IDB4N2ZmOworICAgIG15c2lnbmlmaWNhbmQgPSAwOworICB9IGVsc2UgeworICAgIGFzc2VydChjYXRlZ29yeSA9PSBmY05hTiAmJiAiVW5rbm93biBjYXRlZ29yeSEiKTsKKyAgICBteWV4cG9uZW50ID0gMHg3ZmY7CisgICAgbXlzaWduaWZpY2FuZCA9ICpzaWduaWZpY2FuZFBhcnRzKCk7CisgIH0KKworICByZXR1cm4gQVBJbnQoNjQsICgoKCh1aW50NjRfdCkoc2lnbiAmIDEpIDw8IDYzKSB8CisgICAgICAgICAgICAgICAgICAgICAoKG15ZXhwb25lbnQgJiAweDdmZikgPDwgIDUyKSB8CisgICAgICAgICAgICAgICAgICAgICAobXlzaWduaWZpY2FuZCAmIDB4ZmZmZmZmZmZmZmZmZkxMKSkpKTsKK30KKworQVBJbnQKK0FQRmxvYXQ6OmNvbnZlcnRGbG9hdEFQRmxvYXRUb0FQSW50KCkgY29uc3QKK3sKKyAgYXNzZXJ0KHNlbWFudGljcyA9PSAoY29uc3QgbGx2bTo6Zmx0U2VtYW50aWNzKikmSUVFRXNpbmdsZSk7CisgIGFzc2VydChwYXJ0Q291bnQoKT09MSk7CisKKyAgdWludDMyX3QgbXlleHBvbmVudCwgbXlzaWduaWZpY2FuZDsKKworICBpZiAoY2F0ZWdvcnk9PWZjTm9ybWFsKSB7CisgICAgbXlleHBvbmVudCA9IGV4cG9uZW50KzEyNzsgLy9iaWFzCisgICAgbXlzaWduaWZpY2FuZCA9ICh1aW50MzJfdCkqc2lnbmlmaWNhbmRQYXJ0cygpOworICAgIGlmIChteWV4cG9uZW50ID09IDEgJiYgIShteXNpZ25pZmljYW5kICYgMHg4MDAwMDApKQorICAgICAgbXlleHBvbmVudCA9IDA7ICAgLy8gZGVub3JtYWwKKyAgfSBlbHNlIGlmIChjYXRlZ29yeT09ZmNaZXJvKSB7CisgICAgbXlleHBvbmVudCA9IDA7CisgICAgbXlzaWduaWZpY2FuZCA9IDA7CisgIH0gZWxzZSBpZiAoY2F0ZWdvcnk9PWZjSW5maW5pdHkpIHsKKyAgICBteWV4cG9uZW50ID0gMHhmZjsKKyAgICBteXNpZ25pZmljYW5kID0gMDsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoY2F0ZWdvcnkgPT0gZmNOYU4gJiYgIlVua25vd24gY2F0ZWdvcnkhIik7CisgICAgbXlleHBvbmVudCA9IDB4ZmY7CisgICAgbXlzaWduaWZpY2FuZCA9ICh1aW50MzJfdCkqc2lnbmlmaWNhbmRQYXJ0cygpOworICB9CisKKyAgcmV0dXJuIEFQSW50KDMyLCAoKChzaWduJjEpIDw8IDMxKSB8ICgobXlleHBvbmVudCYweGZmKSA8PCAyMykgfAorICAgICAgICAgICAgICAgICAgICAobXlzaWduaWZpY2FuZCAmIDB4N2ZmZmZmKSkpOworfQorCitBUEludAorQVBGbG9hdDo6Y29udmVydEhhbGZBUEZsb2F0VG9BUEludCgpIGNvbnN0Cit7CisgIGFzc2VydChzZW1hbnRpY3MgPT0gKGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyopJklFRUVoYWxmKTsKKyAgYXNzZXJ0KHBhcnRDb3VudCgpPT0xKTsKKworICB1aW50MzJfdCBteWV4cG9uZW50LCBteXNpZ25pZmljYW5kOworCisgIGlmIChjYXRlZ29yeT09ZmNOb3JtYWwpIHsKKyAgICBteWV4cG9uZW50ID0gZXhwb25lbnQrMTU7IC8vYmlhcworICAgIG15c2lnbmlmaWNhbmQgPSAodWludDMyX3QpKnNpZ25pZmljYW5kUGFydHMoKTsKKyAgICBpZiAobXlleHBvbmVudCA9PSAxICYmICEobXlzaWduaWZpY2FuZCAmIDB4NDAwKSkKKyAgICAgIG15ZXhwb25lbnQgPSAwOyAgIC8vIGRlbm9ybWFsCisgIH0gZWxzZSBpZiAoY2F0ZWdvcnk9PWZjWmVybykgeworICAgIG15ZXhwb25lbnQgPSAwOworICAgIG15c2lnbmlmaWNhbmQgPSAwOworICB9IGVsc2UgaWYgKGNhdGVnb3J5PT1mY0luZmluaXR5KSB7CisgICAgbXlleHBvbmVudCA9IDB4MWY7CisgICAgbXlzaWduaWZpY2FuZCA9IDA7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KGNhdGVnb3J5ID09IGZjTmFOICYmICJVbmtub3duIGNhdGVnb3J5ISIpOworICAgIG15ZXhwb25lbnQgPSAweDFmOworICAgIG15c2lnbmlmaWNhbmQgPSAodWludDMyX3QpKnNpZ25pZmljYW5kUGFydHMoKTsKKyAgfQorCisgIHJldHVybiBBUEludCgxNiwgKCgoc2lnbiYxKSA8PCAxNSkgfCAoKG15ZXhwb25lbnQmMHgxZikgPDwgMTApIHwKKyAgICAgICAgICAgICAgICAgICAgKG15c2lnbmlmaWNhbmQgJiAweDNmZikpKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuIEFQSW50IHRoYXQgaXMganVzdCBhIGJpdCBtYXAgb2YgdGhlIGZsb2F0aW5nCisvLyBwb2ludCBjb25zdGFudCBhcyBpdCB3b3VsZCBhcHBlYXIgaW4gbWVtb3J5LiAgSXQgaXMgbm90IGEgY29udmVyc2lvbiwKKy8vIGFuZCB0cmVhdGluZyB0aGUgcmVzdWx0IGFzIGEgbm9ybWFsIGludGVnZXIgaXMgdW5saWtlbHkgdG8gYmUgdXNlZnVsLgorCitBUEludAorQVBGbG9hdDo6Yml0Y2FzdFRvQVBJbnQoKSBjb25zdAoreworICBpZiAoc2VtYW50aWNzID09IChjb25zdCBsbHZtOjpmbHRTZW1hbnRpY3MqKSZJRUVFaGFsZikKKyAgICByZXR1cm4gY29udmVydEhhbGZBUEZsb2F0VG9BUEludCgpOworCisgIGlmIChzZW1hbnRpY3MgPT0gKGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyopJklFRUVzaW5nbGUpCisgICAgcmV0dXJuIGNvbnZlcnRGbG9hdEFQRmxvYXRUb0FQSW50KCk7CisKKyAgaWYgKHNlbWFudGljcyA9PSAoY29uc3QgbGx2bTo6Zmx0U2VtYW50aWNzKikmSUVFRWRvdWJsZSkKKyAgICByZXR1cm4gY29udmVydERvdWJsZUFQRmxvYXRUb0FQSW50KCk7CisKKyAgaWYgKHNlbWFudGljcyA9PSAoY29uc3QgbGx2bTo6Zmx0U2VtYW50aWNzKikmSUVFRXF1YWQpCisgICAgcmV0dXJuIGNvbnZlcnRRdWFkcnVwbGVBUEZsb2F0VG9BUEludCgpOworCisgIGlmIChzZW1hbnRpY3MgPT0gKGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyopJlBQQ0RvdWJsZURvdWJsZSkKKyAgICByZXR1cm4gY29udmVydFBQQ0RvdWJsZURvdWJsZUFQRmxvYXRUb0FQSW50KCk7CisKKyAgYXNzZXJ0KHNlbWFudGljcyA9PSAoY29uc3QgbGx2bTo6Zmx0U2VtYW50aWNzKikmeDg3RG91YmxlRXh0ZW5kZWQgJiYKKyAgICAgICAgICJ1bmtub3duIGZvcm1hdCEiKTsKKyAgcmV0dXJuIGNvbnZlcnRGODBMb25nRG91YmxlQVBGbG9hdFRvQVBJbnQoKTsKK30KKworZmxvYXQKK0FQRmxvYXQ6OmNvbnZlcnRUb0Zsb2F0KCkgY29uc3QKK3sKKyAgYXNzZXJ0KHNlbWFudGljcyA9PSAoY29uc3QgbGx2bTo6Zmx0U2VtYW50aWNzKikmSUVFRXNpbmdsZSAmJgorICAgICAgICAgIkZsb2F0IHNlbWFudGljcyBhcmUgbm90IElFRUVzaW5nbGUiKTsKKyAgQVBJbnQgYXBpID0gYml0Y2FzdFRvQVBJbnQoKTsKKyAgcmV0dXJuIGFwaS5iaXRzVG9GbG9hdCgpOworfQorCitkb3VibGUKK0FQRmxvYXQ6OmNvbnZlcnRUb0RvdWJsZSgpIGNvbnN0Cit7CisgIGFzc2VydChzZW1hbnRpY3MgPT0gKGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyopJklFRUVkb3VibGUgJiYKKyAgICAgICAgICJGbG9hdCBzZW1hbnRpY3MgYXJlIG5vdCBJRUVFZG91YmxlIik7CisgIEFQSW50IGFwaSA9IGJpdGNhc3RUb0FQSW50KCk7CisgIHJldHVybiBhcGkuYml0c1RvRG91YmxlKCk7Cit9CisKKy8vLyBJbnRlZ2VyIGJpdCBpcyBleHBsaWNpdCBpbiB0aGlzIGZvcm1hdC4gIEludGVsIGhhcmR3YXJlICgzODcgYW5kIGxhdGVyKQorLy8vIGRvZXMgbm90IHN1cHBvcnQgdGhlc2UgYml0IHBhdHRlcm5zOgorLy8vICBleHBvbmVudCA9IGFsbCAxJ3MsIGludGVnZXIgYml0IDAsIHNpZ25pZmljYW5kIDAgKCJwc2V1ZG9pbmZpbml0eSIpCisvLy8gIGV4cG9uZW50ID0gYWxsIDEncywgaW50ZWdlciBiaXQgMCwgc2lnbmlmaWNhbmQgbm9uemVybyAoInBzZXVkb05hTiIpCisvLy8gIGV4cG9uZW50ID0gMCwgaW50ZWdlciBiaXQgMSAoInBzZXVkb2Rlbm9ybWFsIikKKy8vLyAgZXhwb25lbnQhPTAgbm9yIGFsbCAxJ3MsIGludGVnZXIgYml0IDAgKCJ1bm5vcm1hbCIpCisvLy8gQXQgdGhlIG1vbWVudCwgdGhlIGZpcnN0IHR3byBhcmUgdHJlYXRlZCBhcyBOYU5zLCB0aGUgc2Vjb25kIHR3byBhcyBOb3JtYWwuCit2b2lkCitBUEZsb2F0Ojppbml0RnJvbUY4MExvbmdEb3VibGVBUEludChjb25zdCBBUEludCAmYXBpKQoreworICBhc3NlcnQoYXBpLmdldEJpdFdpZHRoKCk9PTgwKTsKKyAgdWludDY0X3QgaTEgPSBhcGkuZ2V0UmF3RGF0YSgpWzBdOworICB1aW50NjRfdCBpMiA9IGFwaS5nZXRSYXdEYXRhKClbMV07CisgIHVpbnQ2NF90IG15ZXhwb25lbnQgPSAoaTIgJiAweDdmZmYpOworICB1aW50NjRfdCBteXNpZ25pZmljYW5kID0gaTE7CisKKyAgaW5pdGlhbGl6ZSgmQVBGbG9hdDo6eDg3RG91YmxlRXh0ZW5kZWQpOworICBhc3NlcnQocGFydENvdW50KCk9PTIpOworCisgIHNpZ24gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGkyPj4xNSk7CisgIGlmIChteWV4cG9uZW50PT0wICYmIG15c2lnbmlmaWNhbmQ9PTApIHsKKyAgICAvLyBleHBvbmVudCwgc2lnbmlmaWNhbmQgbWVhbmluZ2xlc3MKKyAgICBjYXRlZ29yeSA9IGZjWmVybzsKKyAgfSBlbHNlIGlmIChteWV4cG9uZW50PT0weDdmZmYgJiYgbXlzaWduaWZpY2FuZD09MHg4MDAwMDAwMDAwMDAwMDAwVUxMKSB7CisgICAgLy8gZXhwb25lbnQsIHNpZ25pZmljYW5kIG1lYW5pbmdsZXNzCisgICAgY2F0ZWdvcnkgPSBmY0luZmluaXR5OworICB9IGVsc2UgaWYgKG15ZXhwb25lbnQ9PTB4N2ZmZiAmJiBteXNpZ25pZmljYW5kIT0weDgwMDAwMDAwMDAwMDAwMDBVTEwpIHsKKyAgICAvLyBleHBvbmVudCBtZWFuaW5nbGVzcworICAgIGNhdGVnb3J5ID0gZmNOYU47CisgICAgc2lnbmlmaWNhbmRQYXJ0cygpWzBdID0gbXlzaWduaWZpY2FuZDsKKyAgICBzaWduaWZpY2FuZFBhcnRzKClbMV0gPSAwOworICB9IGVsc2UgeworICAgIGNhdGVnb3J5ID0gZmNOb3JtYWw7CisgICAgZXhwb25lbnQgPSBteWV4cG9uZW50IC0gMTYzODM7CisgICAgc2lnbmlmaWNhbmRQYXJ0cygpWzBdID0gbXlzaWduaWZpY2FuZDsKKyAgICBzaWduaWZpY2FuZFBhcnRzKClbMV0gPSAwOworICAgIGlmIChteWV4cG9uZW50PT0wKSAgICAgICAgICAvLyBkZW5vcm1hbAorICAgICAgZXhwb25lbnQgPSAtMTYzODI7CisgIH0KK30KKwordm9pZAorQVBGbG9hdDo6aW5pdEZyb21QUENEb3VibGVEb3VibGVBUEludChjb25zdCBBUEludCAmYXBpKQoreworICBhc3NlcnQoYXBpLmdldEJpdFdpZHRoKCk9PTEyOCk7CisgIHVpbnQ2NF90IGkxID0gYXBpLmdldFJhd0RhdGEoKVswXTsKKyAgdWludDY0X3QgaTIgPSBhcGkuZ2V0UmF3RGF0YSgpWzFdOworICB1aW50NjRfdCBteWV4cG9uZW50ID0gKGkxID4+IDUyKSAmIDB4N2ZmOworICB1aW50NjRfdCBteXNpZ25pZmljYW5kID0gaTEgJiAweGZmZmZmZmZmZmZmZmZMTDsKKyAgdWludDY0X3QgbXlleHBvbmVudDIgPSAoaTIgPj4gNTIpICYgMHg3ZmY7CisgIHVpbnQ2NF90IG15c2lnbmlmaWNhbmQyID0gaTIgJiAweGZmZmZmZmZmZmZmZmZMTDsKKworICBpbml0aWFsaXplKCZBUEZsb2F0OjpQUENEb3VibGVEb3VibGUpOworICBhc3NlcnQocGFydENvdW50KCk9PTIpOworCisgIHNpZ24gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGkxPj42Myk7CisgIHNpZ24yID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpMj4+NjMpOworICBpZiAobXlleHBvbmVudD09MCAmJiBteXNpZ25pZmljYW5kPT0wKSB7CisgICAgLy8gZXhwb25lbnQsIHNpZ25pZmljYW5kIG1lYW5pbmdsZXNzCisgICAgLy8gZXhwb25lbnQyIGFuZCBzaWduaWZpY2FuZDIgYXJlIHJlcXVpcmVkIHRvIGJlIDA7IHdlIGRvbid0IGNoZWNrCisgICAgY2F0ZWdvcnkgPSBmY1plcm87CisgIH0gZWxzZSBpZiAobXlleHBvbmVudD09MHg3ZmYgJiYgbXlzaWduaWZpY2FuZD09MCkgeworICAgIC8vIGV4cG9uZW50LCBzaWduaWZpY2FuZCBtZWFuaW5nbGVzcworICAgIC8vIGV4cG9uZW50MiBhbmQgc2lnbmlmaWNhbmQyIGFyZSByZXF1aXJlZCB0byBiZSAwOyB3ZSBkb24ndCBjaGVjaworICAgIGNhdGVnb3J5ID0gZmNJbmZpbml0eTsKKyAgfSBlbHNlIGlmIChteWV4cG9uZW50PT0weDdmZiAmJiBteXNpZ25pZmljYW5kIT0wKSB7CisgICAgLy8gZXhwb25lbnQgbWVhbmluZ2xlc3MuICBTbyBpcyB0aGUgd2hvbGUgc2Vjb25kIHdvcmQsIGJ1dCBrZWVwIGl0CisgICAgLy8gZm9yIGRldGVybWluaXNtLgorICAgIGNhdGVnb3J5ID0gZmNOYU47CisgICAgZXhwb25lbnQyID0gbXlleHBvbmVudDI7CisgICAgc2lnbmlmaWNhbmRQYXJ0cygpWzBdID0gbXlzaWduaWZpY2FuZDsKKyAgICBzaWduaWZpY2FuZFBhcnRzKClbMV0gPSBteXNpZ25pZmljYW5kMjsKKyAgfSBlbHNlIHsKKyAgICBjYXRlZ29yeSA9IGZjTm9ybWFsOworICAgIC8vIE5vdGUgdGhlcmUgaXMgbm8gY2F0ZWdvcnkyOyB0aGUgc2Vjb25kIHdvcmQgaXMgdHJlYXRlZCBhcyBpZiBpdCBpcworICAgIC8vIGZjTm9ybWFsLCBhbHRob3VnaCBpdCBtaWdodCBiZSBzb21ldGhpbmcgZWxzZSBjb25zaWRlcmVkIGJ5IGl0c2VsZi4KKyAgICBleHBvbmVudCA9IG15ZXhwb25lbnQgLSAxMDIzOworICAgIGV4cG9uZW50MiA9IG15ZXhwb25lbnQyIC0gMTAyMzsKKyAgICBzaWduaWZpY2FuZFBhcnRzKClbMF0gPSBteXNpZ25pZmljYW5kOworICAgIHNpZ25pZmljYW5kUGFydHMoKVsxXSA9IG15c2lnbmlmaWNhbmQyOworICAgIGlmIChteWV4cG9uZW50PT0wKSAgICAgICAgICAvLyBkZW5vcm1hbAorICAgICAgZXhwb25lbnQgPSAtMTAyMjsKKyAgICBlbHNlCisgICAgICBzaWduaWZpY2FuZFBhcnRzKClbMF0gfD0gMHgxMDAwMDAwMDAwMDAwMExMOyAgLy8gaW50ZWdlciBiaXQKKyAgICBpZiAobXlleHBvbmVudDI9PTApCisgICAgICBleHBvbmVudDIgPSAtMTAyMjsKKyAgICBlbHNlCisgICAgICBzaWduaWZpY2FuZFBhcnRzKClbMV0gfD0gMHgxMDAwMDAwMDAwMDAwMExMOyAgLy8gaW50ZWdlciBiaXQKKyAgfQorfQorCit2b2lkCitBUEZsb2F0Ojppbml0RnJvbVF1YWRydXBsZUFQSW50KGNvbnN0IEFQSW50ICZhcGkpCit7CisgIGFzc2VydChhcGkuZ2V0Qml0V2lkdGgoKT09MTI4KTsKKyAgdWludDY0X3QgaTEgPSBhcGkuZ2V0UmF3RGF0YSgpWzBdOworICB1aW50NjRfdCBpMiA9IGFwaS5nZXRSYXdEYXRhKClbMV07CisgIHVpbnQ2NF90IG15ZXhwb25lbnQgPSAoaTIgPj4gNDgpICYgMHg3ZmZmOworICB1aW50NjRfdCBteXNpZ25pZmljYW5kICA9IGkxOworICB1aW50NjRfdCBteXNpZ25pZmljYW5kMiA9IGkyICYgMHhmZmZmZmZmZmZmZmZMTDsKKworICBpbml0aWFsaXplKCZBUEZsb2F0OjpJRUVFcXVhZCk7CisgIGFzc2VydChwYXJ0Q291bnQoKT09Mik7CisKKyAgc2lnbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oaTI+PjYzKTsKKyAgaWYgKG15ZXhwb25lbnQ9PTAgJiYKKyAgICAgIChteXNpZ25pZmljYW5kPT0wICYmIG15c2lnbmlmaWNhbmQyPT0wKSkgeworICAgIC8vIGV4cG9uZW50LCBzaWduaWZpY2FuZCBtZWFuaW5nbGVzcworICAgIGNhdGVnb3J5ID0gZmNaZXJvOworICB9IGVsc2UgaWYgKG15ZXhwb25lbnQ9PTB4N2ZmZiAmJgorICAgICAgICAgICAgIChteXNpZ25pZmljYW5kPT0wICYmIG15c2lnbmlmaWNhbmQyPT0wKSkgeworICAgIC8vIGV4cG9uZW50LCBzaWduaWZpY2FuZCBtZWFuaW5nbGVzcworICAgIGNhdGVnb3J5ID0gZmNJbmZpbml0eTsKKyAgfSBlbHNlIGlmIChteWV4cG9uZW50PT0weDdmZmYgJiYKKyAgICAgICAgICAgICAobXlzaWduaWZpY2FuZCE9MCB8fCBteXNpZ25pZmljYW5kMiAhPTApKSB7CisgICAgLy8gZXhwb25lbnQgbWVhbmluZ2xlc3MKKyAgICBjYXRlZ29yeSA9IGZjTmFOOworICAgIHNpZ25pZmljYW5kUGFydHMoKVswXSA9IG15c2lnbmlmaWNhbmQ7CisgICAgc2lnbmlmaWNhbmRQYXJ0cygpWzFdID0gbXlzaWduaWZpY2FuZDI7CisgIH0gZWxzZSB7CisgICAgY2F0ZWdvcnkgPSBmY05vcm1hbDsKKyAgICBleHBvbmVudCA9IG15ZXhwb25lbnQgLSAxNjM4MzsKKyAgICBzaWduaWZpY2FuZFBhcnRzKClbMF0gPSBteXNpZ25pZmljYW5kOworICAgIHNpZ25pZmljYW5kUGFydHMoKVsxXSA9IG15c2lnbmlmaWNhbmQyOworICAgIGlmIChteWV4cG9uZW50PT0wKSAgICAgICAgICAvLyBkZW5vcm1hbAorICAgICAgZXhwb25lbnQgPSAtMTYzODI7CisgICAgZWxzZQorICAgICAgc2lnbmlmaWNhbmRQYXJ0cygpWzFdIHw9IDB4MTAwMDAwMDAwMDAwMExMOyAgLy8gaW50ZWdlciBiaXQKKyAgfQorfQorCit2b2lkCitBUEZsb2F0Ojppbml0RnJvbURvdWJsZUFQSW50KGNvbnN0IEFQSW50ICZhcGkpCit7CisgIGFzc2VydChhcGkuZ2V0Qml0V2lkdGgoKT09NjQpOworICB1aW50NjRfdCBpID0gKmFwaS5nZXRSYXdEYXRhKCk7CisgIHVpbnQ2NF90IG15ZXhwb25lbnQgPSAoaSA+PiA1MikgJiAweDdmZjsKKyAgdWludDY0X3QgbXlzaWduaWZpY2FuZCA9IGkgJiAweGZmZmZmZmZmZmZmZmZMTDsKKworICBpbml0aWFsaXplKCZBUEZsb2F0OjpJRUVFZG91YmxlKTsKKyAgYXNzZXJ0KHBhcnRDb3VudCgpPT0xKTsKKworICBzaWduID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpPj42Myk7CisgIGlmIChteWV4cG9uZW50PT0wICYmIG15c2lnbmlmaWNhbmQ9PTApIHsKKyAgICAvLyBleHBvbmVudCwgc2lnbmlmaWNhbmQgbWVhbmluZ2xlc3MKKyAgICBjYXRlZ29yeSA9IGZjWmVybzsKKyAgfSBlbHNlIGlmIChteWV4cG9uZW50PT0weDdmZiAmJiBteXNpZ25pZmljYW5kPT0wKSB7CisgICAgLy8gZXhwb25lbnQsIHNpZ25pZmljYW5kIG1lYW5pbmdsZXNzCisgICAgY2F0ZWdvcnkgPSBmY0luZmluaXR5OworICB9IGVsc2UgaWYgKG15ZXhwb25lbnQ9PTB4N2ZmICYmIG15c2lnbmlmaWNhbmQhPTApIHsKKyAgICAvLyBleHBvbmVudCBtZWFuaW5nbGVzcworICAgIGNhdGVnb3J5ID0gZmNOYU47CisgICAgKnNpZ25pZmljYW5kUGFydHMoKSA9IG15c2lnbmlmaWNhbmQ7CisgIH0gZWxzZSB7CisgICAgY2F0ZWdvcnkgPSBmY05vcm1hbDsKKyAgICBleHBvbmVudCA9IG15ZXhwb25lbnQgLSAxMDIzOworICAgICpzaWduaWZpY2FuZFBhcnRzKCkgPSBteXNpZ25pZmljYW5kOworICAgIGlmIChteWV4cG9uZW50PT0wKSAgICAgICAgICAvLyBkZW5vcm1hbAorICAgICAgZXhwb25lbnQgPSAtMTAyMjsKKyAgICBlbHNlCisgICAgICAqc2lnbmlmaWNhbmRQYXJ0cygpIHw9IDB4MTAwMDAwMDAwMDAwMDBMTDsgIC8vIGludGVnZXIgYml0CisgIH0KK30KKwordm9pZAorQVBGbG9hdDo6aW5pdEZyb21GbG9hdEFQSW50KGNvbnN0IEFQSW50ICYgYXBpKQoreworICBhc3NlcnQoYXBpLmdldEJpdFdpZHRoKCk9PTMyKTsKKyAgdWludDMyX3QgaSA9ICh1aW50MzJfdCkqYXBpLmdldFJhd0RhdGEoKTsKKyAgdWludDMyX3QgbXlleHBvbmVudCA9IChpID4+IDIzKSAmIDB4ZmY7CisgIHVpbnQzMl90IG15c2lnbmlmaWNhbmQgPSBpICYgMHg3ZmZmZmY7CisKKyAgaW5pdGlhbGl6ZSgmQVBGbG9hdDo6SUVFRXNpbmdsZSk7CisgIGFzc2VydChwYXJ0Q291bnQoKT09MSk7CisKKyAgc2lnbiA9IGkgPj4gMzE7CisgIGlmIChteWV4cG9uZW50PT0wICYmIG15c2lnbmlmaWNhbmQ9PTApIHsKKyAgICAvLyBleHBvbmVudCwgc2lnbmlmaWNhbmQgbWVhbmluZ2xlc3MKKyAgICBjYXRlZ29yeSA9IGZjWmVybzsKKyAgfSBlbHNlIGlmIChteWV4cG9uZW50PT0weGZmICYmIG15c2lnbmlmaWNhbmQ9PTApIHsKKyAgICAvLyBleHBvbmVudCwgc2lnbmlmaWNhbmQgbWVhbmluZ2xlc3MKKyAgICBjYXRlZ29yeSA9IGZjSW5maW5pdHk7CisgIH0gZWxzZSBpZiAobXlleHBvbmVudD09MHhmZiAmJiBteXNpZ25pZmljYW5kIT0wKSB7CisgICAgLy8gc2lnbiwgZXhwb25lbnQsIHNpZ25pZmljYW5kIG1lYW5pbmdsZXNzCisgICAgY2F0ZWdvcnkgPSBmY05hTjsKKyAgICAqc2lnbmlmaWNhbmRQYXJ0cygpID0gbXlzaWduaWZpY2FuZDsKKyAgfSBlbHNlIHsKKyAgICBjYXRlZ29yeSA9IGZjTm9ybWFsOworICAgIGV4cG9uZW50ID0gbXlleHBvbmVudCAtIDEyNzsgIC8vYmlhcworICAgICpzaWduaWZpY2FuZFBhcnRzKCkgPSBteXNpZ25pZmljYW5kOworICAgIGlmIChteWV4cG9uZW50PT0wKSAgICAvLyBkZW5vcm1hbAorICAgICAgZXhwb25lbnQgPSAtMTI2OworICAgIGVsc2UKKyAgICAgICpzaWduaWZpY2FuZFBhcnRzKCkgfD0gMHg4MDAwMDA7IC8vIGludGVnZXIgYml0CisgIH0KK30KKwordm9pZAorQVBGbG9hdDo6aW5pdEZyb21IYWxmQVBJbnQoY29uc3QgQVBJbnQgJiBhcGkpCit7CisgIGFzc2VydChhcGkuZ2V0Qml0V2lkdGgoKT09MTYpOworICB1aW50MzJfdCBpID0gKHVpbnQzMl90KSphcGkuZ2V0UmF3RGF0YSgpOworICB1aW50MzJfdCBteWV4cG9uZW50ID0gKGkgPj4gMTApICYgMHgxZjsKKyAgdWludDMyX3QgbXlzaWduaWZpY2FuZCA9IGkgJiAweDNmZjsKKworICBpbml0aWFsaXplKCZBUEZsb2F0OjpJRUVFaGFsZik7CisgIGFzc2VydChwYXJ0Q291bnQoKT09MSk7CisKKyAgc2lnbiA9IGkgPj4gMTU7CisgIGlmIChteWV4cG9uZW50PT0wICYmIG15c2lnbmlmaWNhbmQ9PTApIHsKKyAgICAvLyBleHBvbmVudCwgc2lnbmlmaWNhbmQgbWVhbmluZ2xlc3MKKyAgICBjYXRlZ29yeSA9IGZjWmVybzsKKyAgfSBlbHNlIGlmIChteWV4cG9uZW50PT0weDFmICYmIG15c2lnbmlmaWNhbmQ9PTApIHsKKyAgICAvLyBleHBvbmVudCwgc2lnbmlmaWNhbmQgbWVhbmluZ2xlc3MKKyAgICBjYXRlZ29yeSA9IGZjSW5maW5pdHk7CisgIH0gZWxzZSBpZiAobXlleHBvbmVudD09MHgxZiAmJiBteXNpZ25pZmljYW5kIT0wKSB7CisgICAgLy8gc2lnbiwgZXhwb25lbnQsIHNpZ25pZmljYW5kIG1lYW5pbmdsZXNzCisgICAgY2F0ZWdvcnkgPSBmY05hTjsKKyAgICAqc2lnbmlmaWNhbmRQYXJ0cygpID0gbXlzaWduaWZpY2FuZDsKKyAgfSBlbHNlIHsKKyAgICBjYXRlZ29yeSA9IGZjTm9ybWFsOworICAgIGV4cG9uZW50ID0gbXlleHBvbmVudCAtIDE1OyAgLy9iaWFzCisgICAgKnNpZ25pZmljYW5kUGFydHMoKSA9IG15c2lnbmlmaWNhbmQ7CisgICAgaWYgKG15ZXhwb25lbnQ9PTApICAgIC8vIGRlbm9ybWFsCisgICAgICBleHBvbmVudCA9IC0xNDsKKyAgICBlbHNlCisgICAgICAqc2lnbmlmaWNhbmRQYXJ0cygpIHw9IDB4NDAwOyAvLyBpbnRlZ2VyIGJpdAorICB9Cit9CisKKy8vLyBUcmVhdCBhcGkgYXMgY29udGFpbmluZyB0aGUgYml0cyBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gIEN1cnJlbnRseQorLy8vIHdlIGluZmVyIHRoZSBmbG9hdGluZyBwb2ludCB0eXBlIGZyb20gdGhlIHNpemUgb2YgdGhlIEFQSW50LiAgVGhlCisvLy8gaXNJRUVFIGFyZ3VtZW50IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBQUEMxMjggYW5kIElFRUUxMjggKG5vdCBtZWFuaW5nZnVsCisvLy8gd2hlbiB0aGUgc2l6ZSBpcyBhbnl0aGluZyBlbHNlKS4KK3ZvaWQKK0FQRmxvYXQ6OmluaXRGcm9tQVBJbnQoY29uc3QgQVBJbnQmIGFwaSwgYm9vbCBpc0lFRUUpCit7CisgIGlmIChhcGkuZ2V0Qml0V2lkdGgoKSA9PSAxNikKKyAgICByZXR1cm4gaW5pdEZyb21IYWxmQVBJbnQoYXBpKTsKKyAgZWxzZSBpZiAoYXBpLmdldEJpdFdpZHRoKCkgPT0gMzIpCisgICAgcmV0dXJuIGluaXRGcm9tRmxvYXRBUEludChhcGkpOworICBlbHNlIGlmIChhcGkuZ2V0Qml0V2lkdGgoKT09NjQpCisgICAgcmV0dXJuIGluaXRGcm9tRG91YmxlQVBJbnQoYXBpKTsKKyAgZWxzZSBpZiAoYXBpLmdldEJpdFdpZHRoKCk9PTgwKQorICAgIHJldHVybiBpbml0RnJvbUY4MExvbmdEb3VibGVBUEludChhcGkpOworICBlbHNlIGlmIChhcGkuZ2V0Qml0V2lkdGgoKT09MTI4KQorICAgIHJldHVybiAoaXNJRUVFID8KKyAgICAgICAgICAgIGluaXRGcm9tUXVhZHJ1cGxlQVBJbnQoYXBpKSA6IGluaXRGcm9tUFBDRG91YmxlRG91YmxlQVBJbnQoYXBpKSk7CisgIGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworfQorCitBUEZsb2F0IEFQRmxvYXQ6OmdldExhcmdlc3QoY29uc3QgZmx0U2VtYW50aWNzICZTZW0sIGJvb2wgTmVnYXRpdmUpIHsKKyAgQVBGbG9hdCBWYWwoU2VtLCBmY05vcm1hbCwgTmVnYXRpdmUpOworCisgIC8vIFdlIHdhbnQgKGluIGludGVyY2hhbmdlIGZvcm1hdCk6CisgIC8vICAgc2lnbiA9IHtOZWdhdGl2ZX0KKyAgLy8gICBleHBvbmVudCA9IDEuLjEwCisgIC8vICAgc2lnbmlmaWNhbmQgPSAxLi4xCisKKyAgVmFsLmV4cG9uZW50ID0gU2VtLm1heEV4cG9uZW50OyAvLyB1bmJpYXNlZAorCisgIC8vIDEtaW5pdGlhbGl6ZSBhbGwgYml0cy4uLi4KKyAgVmFsLnplcm9TaWduaWZpY2FuZCgpOworICBpbnRlZ2VyUGFydCAqc2lnbmlmaWNhbmQgPSBWYWwuc2lnbmlmaWNhbmRQYXJ0cygpOworICB1bnNpZ25lZCBOID0gcGFydENvdW50Rm9yQml0cyhTZW0ucHJlY2lzaW9uKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOOyArK2kpCisgICAgc2lnbmlmaWNhbmRbaV0gPSB+KChpbnRlZ2VyUGFydCkgMCk7CisKKyAgLy8gLi4uYW5kIHRoZW4gY2xlYXIgdGhlIHRvcCBiaXRzIGZvciBpbnRlcm5hbCBjb25zaXN0ZW5jeS4KKyAgc2lnbmlmaWNhbmRbTi0xXSAmPQorICAgICgoKGludGVnZXJQYXJ0KSAxKSA8PCAoKFNlbS5wcmVjaXNpb24gJSBpbnRlZ2VyUGFydFdpZHRoKSAtIDEpKSAtIDE7CisKKyAgcmV0dXJuIFZhbDsKK30KKworQVBGbG9hdCBBUEZsb2F0OjpnZXRTbWFsbGVzdChjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSwgYm9vbCBOZWdhdGl2ZSkgeworICBBUEZsb2F0IFZhbChTZW0sIGZjTm9ybWFsLCBOZWdhdGl2ZSk7CisKKyAgLy8gV2Ugd2FudCAoaW4gaW50ZXJjaGFuZ2UgZm9ybWF0KToKKyAgLy8gICBzaWduID0ge05lZ2F0aXZlfQorICAvLyAgIGV4cG9uZW50ID0gMC4uMAorICAvLyAgIHNpZ25pZmljYW5kID0gMC4uMDEKKworICBWYWwuZXhwb25lbnQgPSBTZW0ubWluRXhwb25lbnQ7IC8vIHVuYmlhc2VkCisgIFZhbC56ZXJvU2lnbmlmaWNhbmQoKTsKKyAgVmFsLnNpZ25pZmljYW5kUGFydHMoKVswXSA9IDE7CisgIHJldHVybiBWYWw7Cit9CisKK0FQRmxvYXQgQVBGbG9hdDo6Z2V0U21hbGxlc3ROb3JtYWxpemVkKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIE5lZ2F0aXZlKSB7CisgIEFQRmxvYXQgVmFsKFNlbSwgZmNOb3JtYWwsIE5lZ2F0aXZlKTsKKworICAvLyBXZSB3YW50IChpbiBpbnRlcmNoYW5nZSBmb3JtYXQpOgorICAvLyAgIHNpZ24gPSB7TmVnYXRpdmV9CisgIC8vICAgZXhwb25lbnQgPSAwLi4wCisgIC8vICAgc2lnbmlmaWNhbmQgPSAxMC4uMAorCisgIFZhbC5leHBvbmVudCA9IFNlbS5taW5FeHBvbmVudDsKKyAgVmFsLnplcm9TaWduaWZpY2FuZCgpOworICBWYWwuc2lnbmlmaWNhbmRQYXJ0cygpW3BhcnRDb3VudEZvckJpdHMoU2VtLnByZWNpc2lvbiktMV0gfD0KKyAgICAoKChpbnRlZ2VyUGFydCkgMSkgPDwgKChTZW0ucHJlY2lzaW9uICUgaW50ZWdlclBhcnRXaWR0aCkgLSAxKSk7CisKKyAgcmV0dXJuIFZhbDsKK30KKworQVBGbG9hdDo6QVBGbG9hdChjb25zdCBBUEludCYgYXBpLCBib29sIGlzSUVFRSkKK3sKKyAgaW5pdEZyb21BUEludChhcGksIGlzSUVFRSk7Cit9CisKK0FQRmxvYXQ6OkFQRmxvYXQoZmxvYXQgZikKK3sKKyAgQVBJbnQgYXBpID0gQVBJbnQoMzIsIDApOworICBpbml0RnJvbUFQSW50KGFwaS5mbG9hdFRvQml0cyhmKSk7Cit9CisKK0FQRmxvYXQ6OkFQRmxvYXQoZG91YmxlIGQpCit7CisgIEFQSW50IGFwaSA9IEFQSW50KDY0LCAwKTsKKyAgaW5pdEZyb21BUEludChhcGkuZG91YmxlVG9CaXRzKGQpKTsKK30KKworbmFtZXNwYWNlIHsKKyAgc3RhdGljIHZvaWQgYXBwZW5kKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTiwgY29uc3QgY2hhciAqU3RyKSB7CisgICAgdW5zaWduZWQgU3RhcnQgPSBCdWZmZXIuc2l6ZSgpOworICAgIEJ1ZmZlci5zZXRfc2l6ZShTdGFydCArIE4pOworICAgIG1lbWNweSgmQnVmZmVyW1N0YXJ0XSwgU3RyLCBOKTsKKyAgfQorCisgIHRlbXBsYXRlIDx1bnNpZ25lZCBOPgorICB2b2lkIGFwcGVuZChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkJ1ZmZlciwgY29uc3QgY2hhciAoJlN0cilbTl0pIHsKKyAgICBhcHBlbmQoQnVmZmVyLCBOLCBTdHIpOworICB9CisKKyAgLy8vIFJlbW92ZXMgZGF0YSBmcm9tIHRoZSBnaXZlbiBzaWduaWZpY2FuZCB1bnRpbCBpdCBpcyBubyBtb3JlCisgIC8vLyBwcmVjaXNlIHRoYW4gaXMgcmVxdWlyZWQgZm9yIHRoZSBkZXNpcmVkIHByZWNpc2lvbi4KKyAgdm9pZCBBZGp1c3RUb1ByZWNpc2lvbihBUEludCAmc2lnbmlmaWNhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZleHAsIHVuc2lnbmVkIEZvcm1hdFByZWNpc2lvbikgeworICAgIHVuc2lnbmVkIGJpdHMgPSBzaWduaWZpY2FuZC5nZXRBY3RpdmVCaXRzKCk7CisKKyAgICAvLyAxOTYvNTkgaXMgYSB2ZXJ5IHNsaWdodCBvdmVyZXN0aW1hdGUgb2YgbGdfMigxMCkuCisgICAgdW5zaWduZWQgYml0c1JlcXVpcmVkID0gKEZvcm1hdFByZWNpc2lvbiAqIDE5NiArIDU4KSAvIDU5OworCisgICAgaWYgKGJpdHMgPD0gYml0c1JlcXVpcmVkKSByZXR1cm47CisKKyAgICB1bnNpZ25lZCB0ZW5zUmVtb3ZhYmxlID0gKGJpdHMgLSBiaXRzUmVxdWlyZWQpICogNTkgLyAxOTY7CisgICAgaWYgKCF0ZW5zUmVtb3ZhYmxlKSByZXR1cm47CisKKyAgICBleHAgKz0gdGVuc1JlbW92YWJsZTsKKworICAgIEFQSW50IGRpdmlzb3Ioc2lnbmlmaWNhbmQuZ2V0Qml0V2lkdGgoKSwgMSk7CisgICAgQVBJbnQgcG93dGVuKHNpZ25pZmljYW5kLmdldEJpdFdpZHRoKCksIDEwKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKHRlbnNSZW1vdmFibGUgJiAxKQorICAgICAgICBkaXZpc29yICo9IHBvd3RlbjsKKyAgICAgIHRlbnNSZW1vdmFibGUgPj49IDE7CisgICAgICBpZiAoIXRlbnNSZW1vdmFibGUpIGJyZWFrOworICAgICAgcG93dGVuICo9IHBvd3RlbjsKKyAgICB9CisKKyAgICBzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kLnVkaXYoZGl2aXNvcik7CisKKyAgICAvLyBUcnVuY2F0ZSB0aGUgc2lnbmlmaWNhbmQgZG93biB0byBpdHMgYWN0aXZlIGJpdCBjb3VudCwgYnV0CisgICAgLy8gZG9uJ3QgdHJ5IHRvIGRyb3AgYmVsb3cgMzIuCisgICAgdW5zaWduZWQgbmV3UHJlY2lzaW9uID0gc3RkOjptYXgoMzJVLCBzaWduaWZpY2FuZC5nZXRBY3RpdmVCaXRzKCkpOworICAgIHNpZ25pZmljYW5kLnRydW5jKG5ld1ByZWNpc2lvbik7CisgIH0KKworCisgIHZvaWQgQWRqdXN0VG9QcmVjaXNpb24oU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZleHAsIHVuc2lnbmVkIEZvcm1hdFByZWNpc2lvbikgeworICAgIHVuc2lnbmVkIE4gPSBidWZmZXIuc2l6ZSgpOworICAgIGlmIChOIDw9IEZvcm1hdFByZWNpc2lvbikgcmV0dXJuOworCisgICAgLy8gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgZmlndXJlcyBhcmUgdGhlIGxhc3Qgb25lcyBpbiB0aGUgYnVmZmVyLgorICAgIHVuc2lnbmVkIEZpcnN0U2lnbmlmaWNhbnQgPSBOIC0gRm9ybWF0UHJlY2lzaW9uOworCisgICAgLy8gUm91bmQuCisgICAgLy8gRklYTUU6IHRoaXMgcHJvYmFibHkgc2hvdWxkbid0IHVzZSAncm91bmQgaGFsZiB1cCcuCisKKyAgICAvLyBSb3VuZGluZyBkb3duIGlzIGp1c3QgYSB0cnVuY2F0aW9uLCBleGNlcHQgd2UgYWxzbyB3YW50IHRvIGRyb3AKKyAgICAvLyB0cmFpbGluZyB6ZXJvcyBmcm9tIHRoZSBuZXcgcmVzdWx0LgorICAgIGlmIChidWZmZXJbRmlyc3RTaWduaWZpY2FudCAtIDFdIDwgJzUnKSB7CisgICAgICB3aGlsZSAoYnVmZmVyW0ZpcnN0U2lnbmlmaWNhbnRdID09ICcwJykKKyAgICAgICAgRmlyc3RTaWduaWZpY2FudCsrOworCisgICAgICBleHAgKz0gRmlyc3RTaWduaWZpY2FudDsKKyAgICAgIGJ1ZmZlci5lcmFzZSgmYnVmZmVyWzBdLCAmYnVmZmVyW0ZpcnN0U2lnbmlmaWNhbnRdKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBSb3VuZGluZyB1cCByZXF1aXJlcyBhIGRlY2ltYWwgYWRkLXdpdGgtY2FycnkuICBJZiB3ZSBjb250aW51ZQorICAgIC8vIHRoZSBjYXJyeSwgdGhlIG5ld2x5LWludHJvZHVjZWQgemVyb3Mgd2lsbCBqdXN0IGJlIHRydW5jYXRlZC4KKyAgICBmb3IgKHVuc2lnbmVkIEkgPSBGaXJzdFNpZ25pZmljYW50OyBJICE9IE47ICsrSSkgeworICAgICAgaWYgKGJ1ZmZlcltJXSA9PSAnOScpIHsKKyAgICAgICAgRmlyc3RTaWduaWZpY2FudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyW0ldKys7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHdlIGNhcnJpZWQgdGhyb3VnaCwgd2UgaGF2ZSBleGFjdGx5IG9uZSBkaWdpdCBvZiBwcmVjaXNpb24uCisgICAgaWYgKEZpcnN0U2lnbmlmaWNhbnQgPT0gTikgeworICAgICAgZXhwICs9IEZpcnN0U2lnbmlmaWNhbnQ7CisgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICAgIGJ1ZmZlci5wdXNoX2JhY2soJzEnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBleHAgKz0gRmlyc3RTaWduaWZpY2FudDsKKyAgICBidWZmZXIuZXJhc2UoJmJ1ZmZlclswXSwgJmJ1ZmZlcltGaXJzdFNpZ25pZmljYW50XSk7CisgIH0KK30KKwordm9pZCBBUEZsb2F0Ojp0b1N0cmluZyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRm9ybWF0UHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGb3JtYXRNYXhQYWRkaW5nKSBjb25zdCB7CisgIHN3aXRjaCAoY2F0ZWdvcnkpIHsKKyAgY2FzZSBmY0luZmluaXR5OgorICAgIGlmIChpc05lZ2F0aXZlKCkpCisgICAgICByZXR1cm4gYXBwZW5kKFN0ciwgIi1JbmYiKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gYXBwZW5kKFN0ciwgIitJbmYiKTsKKworICBjYXNlIGZjTmFOOiByZXR1cm4gYXBwZW5kKFN0ciwgIk5hTiIpOworCisgIGNhc2UgZmNaZXJvOgorICAgIGlmIChpc05lZ2F0aXZlKCkpCisgICAgICBTdHIucHVzaF9iYWNrKCctJyk7CisKKyAgICBpZiAoIUZvcm1hdE1heFBhZGRpbmcpCisgICAgICBhcHBlbmQoU3RyLCAiMC4wRSswIik7CisgICAgZWxzZQorICAgICAgU3RyLnB1c2hfYmFjaygnMCcpOworICAgIHJldHVybjsKKworICBjYXNlIGZjTm9ybWFsOgorICAgIGJyZWFrOworICB9CisKKyAgaWYgKGlzTmVnYXRpdmUoKSkKKyAgICBTdHIucHVzaF9iYWNrKCctJyk7CisKKyAgLy8gRGVjb21wb3NlIHRoZSBudW1iZXIgaW50byBhbiBBUEludCBhbmQgYW4gZXhwb25lbnQuCisgIGludCBleHAgPSBleHBvbmVudCAtICgoaW50KSBzZW1hbnRpY3MtPnByZWNpc2lvbiAtIDEpOworICBBUEludCBzaWduaWZpY2FuZChzZW1hbnRpY3MtPnByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgcGFydENvdW50Rm9yQml0cyhzZW1hbnRpY3MtPnByZWNpc2lvbiksCisgICAgICAgICAgICAgICAgICAgIHNpZ25pZmljYW5kUGFydHMoKSk7CisKKyAgLy8gU2V0IEZvcm1hdFByZWNpc2lvbiBpZiB6ZXJvLiAgV2Ugd2FudCB0byBkbyB0aGlzIGJlZm9yZSB3ZQorICAvLyB0cnVuY2F0ZSB0cmFpbGluZyB6ZXJvcywgYXMgdGhvc2UgYXJlIHBhcnQgb2YgdGhlIHByZWNpc2lvbi4KKyAgaWYgKCFGb3JtYXRQcmVjaXNpb24pIHsKKyAgICAvLyBJdCdzIGFuIGludGVyZXN0aW5nIHF1ZXN0aW9uIHdoZXRoZXIgdG8gdXNlIHRoZSBub21pbmFsCisgICAgLy8gcHJlY2lzaW9uIG9yIHRoZSBhY3RpdmUgcHJlY2lzaW9uIGhlcmUgZm9yIGRlbm9ybWFscy4KKworICAgIC8vIEZvcm1hdFByZWNpc2lvbiA9IGNlaWwoc2lnbmlmaWNhbmRCaXRzIC8gbGdfMigxMCkpCisgICAgRm9ybWF0UHJlY2lzaW9uID0gKHNlbWFudGljcy0+cHJlY2lzaW9uICogNTkgKyAxOTUpIC8gMTk2OworICB9CisKKyAgLy8gSWdub3JlIHRyYWlsaW5nIGJpbmFyeSB6ZXJvcy4KKyAgaW50IHRyYWlsaW5nWmVyb3MgPSBzaWduaWZpY2FuZC5jb3VudFRyYWlsaW5nWmVyb3MoKTsKKyAgZXhwICs9IHRyYWlsaW5nWmVyb3M7CisgIHNpZ25pZmljYW5kID0gc2lnbmlmaWNhbmQubHNocih0cmFpbGluZ1plcm9zKTsKKworICAvLyBDaGFuZ2UgdGhlIGV4cG9uZW50IGZyb20gMl5lIHRvIDEwXmUuCisgIGlmIChleHAgPT0gMCkgeworICAgIC8vIE5vdGhpbmcgdG8gZG8uCisgIH0gZWxzZSBpZiAoZXhwID4gMCkgeworICAgIC8vIEp1c3Qgc2hpZnQgbGVmdC4KKyAgICBzaWduaWZpY2FuZC56ZXh0KHNlbWFudGljcy0+cHJlY2lzaW9uICsgZXhwKTsKKyAgICBzaWduaWZpY2FuZCA8PD0gZXhwOworICAgIGV4cCA9IDA7CisgIH0gZWxzZSB7IC8qIGV4cCA8IDAgKi8KKyAgICBpbnQgdGV4cCA9IC1leHA7CisKKyAgICAvLyBXZSB0cmFuc2Zvcm0gdGhpcyB1c2luZyB0aGUgaWRlbnRpdHk6CisgICAgLy8gICAoTikoMl4tZSkgPT0gKE4pKDVeZSkoMTBeLWUpCisgICAgLy8gVGhpcyBtZWFucyB3ZSBoYXZlIHRvIG11bHRpcGx5IE4gKHRoZSBzaWduaWZpY2FuZCkgYnkgNV5lLgorICAgIC8vIFRvIGF2b2lkIG92ZXJmbG93LCB3ZSBoYXZlIHRvIG9wZXJhdGUgb24gbnVtYmVycyBsYXJnZQorICAgIC8vIGVub3VnaCB0byBzdG9yZSBOICogNV5lOgorICAgIC8vICAgbG9nMihOICogNV5lKSA9PSBsb2cyKE4pICsgZSAqIGxvZzIoNSkKKyAgICAvLyAgICAgICAgICAgICAgICAgPD0gc2VtYW50aWNzLT5wcmVjaXNpb24gKyBlICogMTM3IC8gNTkKKyAgICAvLyAgIChsb2dfMig1KSB+IDIuMzIxOTI4IDwgMi4zMjIwMzQgfiAxMzcvNTkpCisKKyAgICB1bnNpZ25lZCBwcmVjaXNpb24gPSBzZW1hbnRpY3MtPnByZWNpc2lvbiArIDEzNyAqIHRleHAgLyA1OTsKKworICAgIC8vIE11bHRpcGx5IHNpZ25pZmljYW5kIGJ5IDVeZS4KKyAgICAvLyAgIE4gKiA1XjAxMDEgPT0gTiAqIDVeKDEqMSkgKiA1XigwKjIpICogNV4oMSo0KSAqIDVeKDAqOCkKKyAgICBzaWduaWZpY2FuZC56ZXh0KHByZWNpc2lvbik7CisgICAgQVBJbnQgZml2ZV90b190aGVfaShwcmVjaXNpb24sIDUpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAodGV4cCAmIDEpIHNpZ25pZmljYW5kICo9IGZpdmVfdG9fdGhlX2k7CisKKyAgICAgIHRleHAgPj49IDE7CisgICAgICBpZiAoIXRleHApIGJyZWFrOworICAgICAgZml2ZV90b190aGVfaSAqPSBmaXZlX3RvX3RoZV9pOworICAgIH0KKyAgfQorCisgIEFkanVzdFRvUHJlY2lzaW9uKHNpZ25pZmljYW5kLCBleHAsIEZvcm1hdFByZWNpc2lvbik7CisKKyAgbGx2bTo6U21hbGxWZWN0b3I8Y2hhciwgMjU2PiBidWZmZXI7CisKKyAgLy8gRmlsbCB0aGUgYnVmZmVyLgorICB1bnNpZ25lZCBwcmVjaXNpb24gPSBzaWduaWZpY2FuZC5nZXRCaXRXaWR0aCgpOworICBBUEludCB0ZW4ocHJlY2lzaW9uLCAxMCk7CisgIEFQSW50IGRpZ2l0KHByZWNpc2lvbiwgMCk7CisKKyAgYm9vbCBpblRyYWlsID0gdHJ1ZTsKKyAgd2hpbGUgKHNpZ25pZmljYW5kICE9IDApIHsKKyAgICAvLyBkaWdpdCA8LSBzaWduaWZpY2FuZCAlIDEwCisgICAgLy8gc2lnbmlmaWNhbmQgPC0gc2lnbmlmaWNhbmQgLyAxMAorICAgIEFQSW50Ojp1ZGl2cmVtKHNpZ25pZmljYW5kLCB0ZW4sIHNpZ25pZmljYW5kLCBkaWdpdCk7CisKKyAgICB1bnNpZ25lZCBkID0gZGlnaXQuZ2V0WkV4dFZhbHVlKCk7CisKKyAgICAvLyBEcm9wIHRyYWlsaW5nIHplcm9zLgorICAgIGlmIChpblRyYWlsICYmICFkKSBleHArKzsKKyAgICBlbHNlIHsKKyAgICAgIGJ1ZmZlci5wdXNoX2JhY2soKGNoYXIpICgnMCcgKyBkKSk7CisgICAgICBpblRyYWlsID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgYXNzZXJ0KCFidWZmZXIuZW1wdHkoKSAmJiAibm8gY2hhcmFjdGVycyBpbiBidWZmZXIhIik7CisKKyAgLy8gRHJvcCBkb3duIHRvIEZvcm1hdFByZWNpc2lvbi4KKyAgLy8gVE9ETzogZG9uJ3QgZG8gbW9yZSBwcmVjaXNlIGNhbGN1bGF0aW9ucyBhYm92ZSB0aGFuIGFyZSByZXF1aXJlZC4KKyAgQWRqdXN0VG9QcmVjaXNpb24oYnVmZmVyLCBleHAsIEZvcm1hdFByZWNpc2lvbik7CisKKyAgdW5zaWduZWQgTkRpZ2l0cyA9IGJ1ZmZlci5zaXplKCk7CisKKyAgLy8gQ2hlY2sgd2hldGhlciB3ZSBzaG91bGQgdXNlIHNjaWVudGlmaWMgbm90YXRpb24uCisgIGJvb2wgRm9ybWF0U2NpZW50aWZpYzsKKyAgaWYgKCFGb3JtYXRNYXhQYWRkaW5nKQorICAgIEZvcm1hdFNjaWVudGlmaWMgPSB0cnVlOworICBlbHNlIHsKKyAgICBpZiAoZXhwID49IDApIHsKKyAgICAgIC8vIDc2NWUzIC0tPiA3NjUwMDAKKyAgICAgIC8vICAgICAgICAgICAgICBeXl4KKyAgICAgIC8vIEJ1dCB3ZSBzaG91bGRuJ3QgbWFrZSB0aGUgbnVtYmVyIGxvb2sgbW9yZSBwcmVjaXNlIHRoYW4gaXQgaXMuCisgICAgICBGb3JtYXRTY2llbnRpZmljID0gKCh1bnNpZ25lZCkgZXhwID4gRm9ybWF0TWF4UGFkZGluZyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBORGlnaXRzICsgKHVuc2lnbmVkKSBleHAgPiBGb3JtYXRQcmVjaXNpb24pOworICAgIH0gZWxzZSB7CisgICAgICAvLyBQb3dlciBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdC4KKyAgICAgIGludCBNU0QgPSBleHAgKyAoaW50KSAoTkRpZ2l0cyAtIDEpOworICAgICAgaWYgKE1TRCA+PSAwKSB7CisgICAgICAgIC8vIDc2NWUtMiA9PSA3LjY1CisgICAgICAgIEZvcm1hdFNjaWVudGlmaWMgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIDc2NWUtNSA9PSAwLjAwNzY1CisgICAgICAgIC8vICAgICAgICAgICBeIF5eCisgICAgICAgIEZvcm1hdFNjaWVudGlmaWMgPSAoKHVuc2lnbmVkKSAtTVNEKSA+IEZvcm1hdE1heFBhZGRpbmc7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gU2NpZW50aWZpYyBmb3JtYXR0aW5nIGlzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuCisgIGlmIChGb3JtYXRTY2llbnRpZmljKSB7CisgICAgZXhwICs9IChORGlnaXRzIC0gMSk7CisKKyAgICBTdHIucHVzaF9iYWNrKGJ1ZmZlcltORGlnaXRzLTFdKTsKKyAgICBTdHIucHVzaF9iYWNrKCcuJyk7CisgICAgaWYgKE5EaWdpdHMgPT0gMSkKKyAgICAgIFN0ci5wdXNoX2JhY2soJzAnKTsKKyAgICBlbHNlCisgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAxOyBJICE9IE5EaWdpdHM7ICsrSSkKKyAgICAgICAgU3RyLnB1c2hfYmFjayhidWZmZXJbTkRpZ2l0cy0xLUldKTsKKyAgICBTdHIucHVzaF9iYWNrKCdFJyk7CisKKyAgICBTdHIucHVzaF9iYWNrKGV4cCA+PSAwID8gJysnIDogJy0nKTsKKyAgICBpZiAoZXhwIDwgMCkgZXhwID0gLWV4cDsKKyAgICBTbWFsbFZlY3RvcjxjaGFyLCA2PiBleHBidWY7CisgICAgZG8geworICAgICAgZXhwYnVmLnB1c2hfYmFjaygoY2hhcikgKCcwJyArIChleHAgJSAxMCkpKTsKKyAgICAgIGV4cCAvPSAxMDsKKyAgICB9IHdoaWxlIChleHApOworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBleHBidWYuc2l6ZSgpOyBJICE9IEU7ICsrSSkKKyAgICAgIFN0ci5wdXNoX2JhY2soZXhwYnVmW0UtMS1JXSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gTm9uLXNjaWVudGlmaWMsIHBvc2l0aXZlIGV4cG9uZW50cy4KKyAgaWYgKGV4cCA+PSAwKSB7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSAhPSBORGlnaXRzOyArK0kpCisgICAgICBTdHIucHVzaF9iYWNrKGJ1ZmZlcltORGlnaXRzLTEtSV0pOworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gKHVuc2lnbmVkKSBleHA7ICsrSSkKKyAgICAgIFN0ci5wdXNoX2JhY2soJzAnKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBOb24tc2NpZW50aWZpYywgbmVnYXRpdmUgZXhwb25lbnRzLgorCisgIC8vIFRoZSBudW1iZXIgb2YgZGlnaXRzIHRvIHRoZSBsZWZ0IG9mIHRoZSBkZWNpbWFsIHBvaW50LgorICBpbnQgTldob2xlRGlnaXRzID0gZXhwICsgKGludCkgTkRpZ2l0czsKKworICB1bnNpZ25lZCBJID0gMDsKKyAgaWYgKE5XaG9sZURpZ2l0cyA+IDApIHsKKyAgICBmb3IgKDsgSSAhPSAodW5zaWduZWQpIE5XaG9sZURpZ2l0czsgKytJKQorICAgICAgU3RyLnB1c2hfYmFjayhidWZmZXJbTkRpZ2l0cy1JLTFdKTsKKyAgICBTdHIucHVzaF9iYWNrKCcuJyk7CisgIH0gZWxzZSB7CisgICAgdW5zaWduZWQgTlplcm9zID0gMSArICh1bnNpZ25lZCkgLU5XaG9sZURpZ2l0czsKKworICAgIFN0ci5wdXNoX2JhY2soJzAnKTsKKyAgICBTdHIucHVzaF9iYWNrKCcuJyk7CisgICAgZm9yICh1bnNpZ25lZCBaID0gMTsgWiAhPSBOWmVyb3M7ICsrWikKKyAgICAgIFN0ci5wdXNoX2JhY2soJzAnKTsKKyAgfQorCisgIGZvciAoOyBJICE9IE5EaWdpdHM7ICsrSSkKKyAgICBTdHIucHVzaF9iYWNrKGJ1ZmZlcltORGlnaXRzLUktMV0pOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvQVBJbnQuY3BwIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvQVBJbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MmZhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9BUEludC5jcHAKQEAgLTAsMCArMSwyODU3IEBACisvLz09PS0tIEFQSW50LmNwcCAtIEltcGxlbWVudCBBUEludCBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgY2xhc3MgdG8gcmVwcmVzZW50IGFyYml0cmFyeSBwcmVjaXNpb24gaW50ZWdlcgorLy8gY29uc3RhbnQgdmFsdWVzIGFuZCBwcm92aWRlIGEgdmFyaWV0eSBvZiBhcml0aG1ldGljIG9wZXJhdGlvbnMgb24gdGhlbS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFwaW50IgorI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNzdGRsaWI+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIEEgdXRpbGl0eSBmdW5jdGlvbiBmb3IgYWxsb2NhdGluZyBtZW1vcnksIGNoZWNraW5nIGZvciBhbGxvY2F0aW9uIGZhaWx1cmVzLAorLy8vIGFuZCBlbnN1cmluZyB0aGUgY29udGVudHMgYXJlIHplcm9lZC4KK2lubGluZSBzdGF0aWMgdWludDY0X3QqIGdldENsZWFyZWRNZW1vcnkodW5zaWduZWQgbnVtV29yZHMpIHsKKyAgdWludDY0X3QgKiByZXN1bHQgPSBuZXcgdWludDY0X3RbbnVtV29yZHNdOworICBhc3NlcnQocmVzdWx0ICYmICJBUEludCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscyEiKTsKKyAgbWVtc2V0KHJlc3VsdCwgMCwgbnVtV29yZHMgKiBzaXplb2YodWludDY0X3QpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vIEEgdXRpbGl0eSBmdW5jdGlvbiBmb3IgYWxsb2NhdGluZyBtZW1vcnkgYW5kIGNoZWNraW5nIGZvciBhbGxvY2F0aW9uCisvLy8gZmFpbHVyZS4gIFRoZSBjb250ZW50IGlzIG5vdCB6ZXJvZWQuCitpbmxpbmUgc3RhdGljIHVpbnQ2NF90KiBnZXRNZW1vcnkodW5zaWduZWQgbnVtV29yZHMpIHsKKyAgdWludDY0X3QgKiByZXN1bHQgPSBuZXcgdWludDY0X3RbbnVtV29yZHNdOworICBhc3NlcnQocmVzdWx0ICYmICJBUEludCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscyEiKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vIEEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGEgY2hhcmFjdGVyIHRvIGEgZGlnaXQuCitpbmxpbmUgc3RhdGljIHVuc2lnbmVkIGdldERpZ2l0KGNoYXIgY2RpZ2l0LCB1aW50OF90IHJhZGl4KSB7CisgIHVuc2lnbmVkIHI7CisKKyAgaWYgKHJhZGl4ID09IDE2KSB7CisgICAgciA9IGNkaWdpdCAtICcwJzsKKyAgICBpZiAociA8PSA5KQorICAgICAgcmV0dXJuIHI7CisKKyAgICByID0gY2RpZ2l0IC0gJ0EnOworICAgIGlmIChyIDw9IDUpCisgICAgICByZXR1cm4gciArIDEwOworCisgICAgciA9IGNkaWdpdCAtICdhJzsKKyAgICBpZiAociA8PSA1KQorICAgICAgcmV0dXJuIHIgKyAxMDsKKyAgfQorCisgIHIgPSBjZGlnaXQgLSAnMCc7CisgIGlmIChyIDwgcmFkaXgpCisgICAgcmV0dXJuIHI7CisKKyAgcmV0dXJuIC0xVTsKK30KKworCit2b2lkIEFQSW50Ojppbml0U2xvd0Nhc2UodW5zaWduZWQgbnVtQml0cywgdWludDY0X3QgdmFsLCBib29sIGlzU2lnbmVkKSB7CisgIHBWYWwgPSBnZXRDbGVhcmVkTWVtb3J5KGdldE51bVdvcmRzKCkpOworICBwVmFsWzBdID0gdmFsOworICBpZiAoaXNTaWduZWQgJiYgaW50NjRfdCh2YWwpIDwgMCkKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgZ2V0TnVtV29yZHMoKTsgKytpKQorICAgICAgcFZhbFtpXSA9IC0xVUxMOworfQorCit2b2lkIEFQSW50Ojppbml0U2xvd0Nhc2UoY29uc3QgQVBJbnQmIHRoYXQpIHsKKyAgcFZhbCA9IGdldE1lbW9yeShnZXROdW1Xb3JkcygpKTsKKyAgbWVtY3B5KHBWYWwsIHRoYXQucFZhbCwgZ2V0TnVtV29yZHMoKSAqIEFQSU5UX1dPUkRfU0laRSk7Cit9CisKKworQVBJbnQ6OkFQSW50KHVuc2lnbmVkIG51bUJpdHMsIHVuc2lnbmVkIG51bVdvcmRzLCBjb25zdCB1aW50NjRfdCBiaWdWYWxbXSkKKyAgOiBCaXRXaWR0aChudW1CaXRzKSwgVkFMKDApIHsKKyAgYXNzZXJ0KEJpdFdpZHRoICYmICJCaXR3aWR0aCB0b28gc21hbGwiKTsKKyAgYXNzZXJ0KGJpZ1ZhbCAmJiAiTnVsbCBwb2ludGVyIGRldGVjdGVkISIpOworICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgVkFMID0gYmlnVmFsWzBdOworICBlbHNlIHsKKyAgICAvLyBHZXQgbWVtb3J5LCBjbGVhcmVkIHRvIDAKKyAgICBwVmFsID0gZ2V0Q2xlYXJlZE1lbW9yeShnZXROdW1Xb3JkcygpKTsKKyAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB3b3JkcyB0byBjb3B5CisgICAgdW5zaWduZWQgd29yZHMgPSBzdGQ6Om1pbjx1bnNpZ25lZD4obnVtV29yZHMsIGdldE51bVdvcmRzKCkpOworICAgIC8vIENvcHkgdGhlIHdvcmRzIGZyb20gYmlnVmFsIHRvIHBWYWwKKyAgICBtZW1jcHkocFZhbCwgYmlnVmFsLCB3b3JkcyAqIEFQSU5UX1dPUkRfU0laRSk7CisgIH0KKyAgLy8gTWFrZSBzdXJlIHVudXNlZCBoaWdoIGJpdHMgYXJlIGNsZWFyZWQKKyAgY2xlYXJVbnVzZWRCaXRzKCk7Cit9CisKK0FQSW50OjpBUEludCh1bnNpZ25lZCBudW1iaXRzLCBTdHJpbmdSZWYgU3RyLCB1aW50OF90IHJhZGl4KQorICA6IEJpdFdpZHRoKG51bWJpdHMpLCBWQUwoMCkgeworICBhc3NlcnQoQml0V2lkdGggJiYgIkJpdHdpZHRoIHRvbyBzbWFsbCIpOworICBmcm9tU3RyaW5nKG51bWJpdHMsIFN0ciwgcmFkaXgpOworfQorCitBUEludCYgQVBJbnQ6OkFzc2lnblNsb3dDYXNlKGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIFggPSBYCisgIGlmICh0aGlzID09ICZSSFMpCisgICAgcmV0dXJuICp0aGlzOworCisgIGlmIChCaXRXaWR0aCA9PSBSSFMuZ2V0Qml0V2lkdGgoKSkgeworICAgIC8vIGFzc3VtZSBzYW1lIGJpdC13aWR0aCBzaW5nbGUtd29yZCBjYXNlIGlzIGFscmVhZHkgaGFuZGxlZAorICAgIGFzc2VydCghaXNTaW5nbGVXb3JkKCkpOworICAgIG1lbWNweShwVmFsLCBSSFMucFZhbCwgZ2V0TnVtV29yZHMoKSAqIEFQSU5UX1dPUkRfU0laRSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgLy8gYXNzdW1lIGNhc2Ugd2hlcmUgYm90aCBhcmUgc2luZ2xlIHdvcmRzIGlzIGFscmVhZHkgaGFuZGxlZAorICAgIGFzc2VydCghUkhTLmlzU2luZ2xlV29yZCgpKTsKKyAgICBWQUwgPSAwOworICAgIHBWYWwgPSBnZXRNZW1vcnkoUkhTLmdldE51bVdvcmRzKCkpOworICAgIG1lbWNweShwVmFsLCBSSFMucFZhbCwgUkhTLmdldE51bVdvcmRzKCkgKiBBUElOVF9XT1JEX1NJWkUpOworICB9IGVsc2UgaWYgKGdldE51bVdvcmRzKCkgPT0gUkhTLmdldE51bVdvcmRzKCkpCisgICAgbWVtY3B5KHBWYWwsIFJIUy5wVmFsLCBSSFMuZ2V0TnVtV29yZHMoKSAqIEFQSU5UX1dPUkRfU0laRSk7CisgIGVsc2UgaWYgKFJIUy5pc1NpbmdsZVdvcmQoKSkgeworICAgIGRlbGV0ZSBbXSBwVmFsOworICAgIFZBTCA9IFJIUy5WQUw7CisgIH0gZWxzZSB7CisgICAgZGVsZXRlIFtdIHBWYWw7CisgICAgcFZhbCA9IGdldE1lbW9yeShSSFMuZ2V0TnVtV29yZHMoKSk7CisgICAgbWVtY3B5KHBWYWwsIFJIUy5wVmFsLCBSSFMuZ2V0TnVtV29yZHMoKSAqIEFQSU5UX1dPUkRfU0laRSk7CisgIH0KKyAgQml0V2lkdGggPSBSSFMuQml0V2lkdGg7CisgIHJldHVybiBjbGVhclVudXNlZEJpdHMoKTsKK30KKworQVBJbnQmIEFQSW50OjpvcGVyYXRvcj0odWludDY0X3QgUkhTKSB7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICBWQUwgPSBSSFM7CisgIGVsc2UgeworICAgIHBWYWxbMF0gPSBSSFM7CisgICAgbWVtc2V0KHBWYWwrMSwgMCwgKGdldE51bVdvcmRzKCkgLSAxKSAqIEFQSU5UX1dPUkRfU0laRSk7CisgIH0KKyAgcmV0dXJuIGNsZWFyVW51c2VkQml0cygpOworfQorCisvLy8gUHJvZmlsZSAtIFRoaXMgbWV0aG9kICdwcm9maWxlcycgYW4gQVBJbnQgZm9yIHVzZSB3aXRoIEZvbGRpbmdTZXQuCit2b2lkIEFQSW50OjpQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCB7CisgIElELkFkZEludGVnZXIoQml0V2lkdGgpOworCisgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgIElELkFkZEludGVnZXIoVkFMKTsKKyAgICByZXR1cm47CisgIH0KKworICB1bnNpZ25lZCBOdW1Xb3JkcyA9IGdldE51bVdvcmRzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1Xb3JkczsgKytpKQorICAgIElELkFkZEludGVnZXIocFZhbFtpXSk7Cit9CisKKy8vLyBhZGRfMSAtIFRoaXMgZnVuY3Rpb24gYWRkcyBhIHNpbmdsZSAiZGlnaXQiIGludGVnZXIsIHksIHRvIHRoZSBtdWx0aXBsZQorLy8vICJkaWdpdCIgaW50ZWdlciBhcnJheSwgIHhbXS4geFtdIGlzIG1vZGlmaWVkIHRvIHJlZmxlY3QgdGhlIGFkZGl0aW9uIGFuZAorLy8vIDEgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgYSBjYXJyeSBvdXQsIG90aGVyd2lzZSAwIGlzIHJldHVybmVkLgorLy8vIEByZXR1cm5zIHRoZSBjYXJyeSBvZiB0aGUgYWRkaXRpb24uCitzdGF0aWMgYm9vbCBhZGRfMSh1aW50NjRfdCBkZXN0W10sIHVpbnQ2NF90IHhbXSwgdW5zaWduZWQgbGVuLCB1aW50NjRfdCB5KSB7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGRlc3RbaV0gPSB5ICsgeFtpXTsKKyAgICBpZiAoZGVzdFtpXSA8IHkpCisgICAgICB5ID0gMTsgLy8gQ2Fycnkgb25lIHRvIG5leHQgZGlnaXQuCisgICAgZWxzZSB7CisgICAgICB5ID0gMDsgLy8gTm8gbmVlZCB0byBjYXJyeSBzbyBleGl0IGVhcmx5CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHk7Cit9CisKKy8vLyBAYnJpZWYgUHJlZml4IGluY3JlbWVudCBvcGVyYXRvci4gSW5jcmVtZW50cyB0aGUgQVBJbnQgYnkgb25lLgorQVBJbnQmIEFQSW50OjpvcGVyYXRvcisrKCkgeworICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgKytWQUw7CisgIGVsc2UKKyAgICBhZGRfMShwVmFsLCBwVmFsLCBnZXROdW1Xb3JkcygpLCAxKTsKKyAgcmV0dXJuIGNsZWFyVW51c2VkQml0cygpOworfQorCisvLy8gc3ViXzEgLSBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyBhIHNpbmdsZSAiZGlnaXQiICg2NC1iaXQgd29yZCksIHksIGZyb20KKy8vLyB0aGUgbXVsdGktZGlnaXQgaW50ZWdlciBhcnJheSwgeFtdLCBwcm9wYWdhdGluZyB0aGUgYm9ycm93ZWQgMSB2YWx1ZSB1bnRpbAorLy8vIG5vIGZ1cnRoZXIgYm9ycm93aW5nIGlzIG5lZWVkZWQgb3IgaXQgcnVucyBvdXQgb2YgImRpZ2l0cyIgaW4geC4gIFRoZSByZXN1bHQKKy8vLyBpcyAxIGlmICJib3Jyb3dpbmciIGV4aGF1c3RlZCB0aGUgZGlnaXRzIGluIHgsIG9yIDAgaWYgeCB3YXMgbm90IGV4aGF1c3RlZC4KKy8vLyBJbiBvdGhlciB3b3JkcywgaWYgeSA+IHggdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMSwgb3RoZXJ3aXNlIDAuCisvLy8gQHJldHVybnMgdGhlIGJvcnJvdyBvdXQgb2YgdGhlIHN1YnRyYWN0aW9uCitzdGF0aWMgYm9vbCBzdWJfMSh1aW50NjRfdCB4W10sIHVuc2lnbmVkIGxlbiwgdWludDY0X3QgeSkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICB1aW50NjRfdCBYID0geFtpXTsKKyAgICB4W2ldIC09IHk7CisgICAgaWYgKHkgPiBYKQorICAgICAgeSA9IDE7ICAvLyBXZSBoYXZlIHRvICJib3Jyb3cgMSIgZnJvbSBuZXh0ICJkaWdpdCIKKyAgICBlbHNlIHsKKyAgICAgIHkgPSAwOyAgLy8gTm8gbmVlZCB0byBib3Jyb3cKKyAgICAgIGJyZWFrOyAgLy8gUmVtYWluaW5nIGRpZ2l0cyBhcmUgdW5jaGFuZ2VkIHNvIGV4aXQgZWFybHkKKyAgICB9CisgIH0KKyAgcmV0dXJuIGJvb2woeSk7Cit9CisKKy8vLyBAYnJpZWYgUHJlZml4IGRlY3JlbWVudCBvcGVyYXRvci4gRGVjcmVtZW50cyB0aGUgQVBJbnQgYnkgb25lLgorQVBJbnQmIEFQSW50OjpvcGVyYXRvci0tKCkgeworICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgLS1WQUw7CisgIGVsc2UKKyAgICBzdWJfMShwVmFsLCBnZXROdW1Xb3JkcygpLCAxKTsKKyAgcmV0dXJuIGNsZWFyVW51c2VkQml0cygpOworfQorCisvLy8gYWRkIC0gVGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBpbnRlZ2VyIGFycmF5IHggdG8gdGhlIGludGVnZXIgYXJyYXkgWSBhbmQKKy8vLyBwbGFjZXMgdGhlIHJlc3VsdCBpbiBkZXN0LgorLy8vIEByZXR1cm5zIHRoZSBjYXJyeSBvdXQgZnJvbSB0aGUgYWRkaXRpb24KKy8vLyBAYnJpZWYgR2VuZXJhbCBhZGRpdGlvbiBvZiA2NC1iaXQgaW50ZWdlciBhcnJheXMKK3N0YXRpYyBib29sIGFkZCh1aW50NjRfdCAqZGVzdCwgY29uc3QgdWludDY0X3QgKngsIGNvbnN0IHVpbnQ2NF90ICp5LAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikgeworICBib29sIGNhcnJ5ID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGk8IGxlbjsgKytpKSB7CisgICAgdWludDY0X3QgbGltaXQgPSBzdGQ6Om1pbih4W2ldLHlbaV0pOyAvLyBtdXN0IGNvbWUgZmlyc3QgaW4gY2FzZSBkZXN0ID09IHgKKyAgICBkZXN0W2ldID0geFtpXSArIHlbaV0gKyBjYXJyeTsKKyAgICBjYXJyeSA9IGRlc3RbaV0gPCBsaW1pdCB8fCAoY2FycnkgJiYgZGVzdFtpXSA9PSBsaW1pdCk7CisgIH0KKyAgcmV0dXJuIGNhcnJ5OworfQorCisvLy8gQWRkcyB0aGUgUkhTIEFQaW50IHRvIHRoaXMgQVBJbnQuCisvLy8gQHJldHVybnMgdGhpcywgYWZ0ZXIgYWRkaXRpb24gb2YgUkhTLgorLy8vIEBicmllZiBBZGRpdGlvbiBhc3NpZ25tZW50IG9wZXJhdG9yLgorQVBJbnQmIEFQSW50OjpvcGVyYXRvcis9KGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICBWQUwgKz0gUkhTLlZBTDsKKyAgZWxzZSB7CisgICAgYWRkKHBWYWwsIHBWYWwsIFJIUy5wVmFsLCBnZXROdW1Xb3JkcygpKTsKKyAgfQorICByZXR1cm4gY2xlYXJVbnVzZWRCaXRzKCk7Cit9CisKKy8vLyBTdWJ0cmFjdHMgdGhlIGludGVnZXIgYXJyYXkgeSBmcm9tIHRoZSBpbnRlZ2VyIGFycmF5IHgKKy8vLyBAcmV0dXJucyByZXR1cm5zIHRoZSBib3Jyb3cgb3V0LgorLy8vIEBicmllZiBHZW5lcmFsaXplZCBzdWJ0cmFjdGlvbiBvZiA2NC1iaXQgaW50ZWdlciBhcnJheXMuCitzdGF0aWMgYm9vbCBzdWIodWludDY0X3QgKmRlc3QsIGNvbnN0IHVpbnQ2NF90ICp4LCBjb25zdCB1aW50NjRfdCAqeSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pIHsKKyAgYm9vbCBib3Jyb3cgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgdWludDY0X3QgeF90bXAgPSBib3Jyb3cgPyB4W2ldIC0gMSA6IHhbaV07CisgICAgYm9ycm93ID0geVtpXSA+IHhfdG1wIHx8IChib3Jyb3cgJiYgeFtpXSA9PSAwKTsKKyAgICBkZXN0W2ldID0geF90bXAgLSB5W2ldOworICB9CisgIHJldHVybiBib3Jyb3c7Cit9CisKKy8vLyBTdWJ0cmFjdHMgdGhlIFJIUyBBUEludCBmcm9tIHRoaXMgQVBJbnQKKy8vLyBAcmV0dXJucyB0aGlzLCBhZnRlciBzdWJ0cmFjdGlvbgorLy8vIEBicmllZiBTdWJ0cmFjdGlvbiBhc3NpZ25tZW50IG9wZXJhdG9yLgorQVBJbnQmIEFQSW50OjpvcGVyYXRvci09KGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICBWQUwgLT0gUkhTLlZBTDsKKyAgZWxzZQorICAgIHN1YihwVmFsLCBwVmFsLCBSSFMucFZhbCwgZ2V0TnVtV29yZHMoKSk7CisgIHJldHVybiBjbGVhclVudXNlZEJpdHMoKTsKK30KKworLy8vIE11bHRpcGxpZXMgYW4gaW50ZWdlciBhcnJheSwgeCwgYnkgYSB1aW50NjRfdCBpbnRlZ2VyIGFuZCBwbGFjZXMgdGhlIHJlc3VsdAorLy8vIGludG8gZGVzdC4KKy8vLyBAcmV0dXJucyB0aGUgY2Fycnkgb3V0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbi4KKy8vLyBAYnJpZWYgTXVsdGlwbHkgYSBtdWx0aS1kaWdpdCBBUEludCBieSBhIHNpbmdsZSBkaWdpdCAoNjQtYml0KSBpbnRlZ2VyLgorc3RhdGljIHVpbnQ2NF90IG11bF8xKHVpbnQ2NF90IGRlc3RbXSwgdWludDY0X3QgeFtdLCB1bnNpZ25lZCBsZW4sIHVpbnQ2NF90IHkpIHsKKyAgLy8gU3BsaXQgeSBpbnRvIGhpZ2ggMzItYml0IHBhcnQgKGh5KSAgYW5kIGxvdyAzMi1iaXQgcGFydCAobHkpCisgIHVpbnQ2NF90IGx5ID0geSAmIDB4ZmZmZmZmZmZVTEwsIGh5ID0geSA+PiAzMjsKKyAgdWludDY0X3QgY2FycnkgPSAwOworCisgIC8vIEZvciBlYWNoIGRpZ2l0IG9mIHguCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIC8vIFNwbGl0IHggaW50byBoaWdoIGFuZCBsb3cgd29yZHMKKyAgICB1aW50NjRfdCBseCA9IHhbaV0gJiAweGZmZmZmZmZmVUxMOworICAgIHVpbnQ2NF90IGh4ID0geFtpXSA+PiAzMjsKKyAgICAvLyBoYXNDYXJyeSAtIEEgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGVyZSBpcyBhIGNhcnJ5IHRvIHRoZSBuZXh0IGRpZ2l0LgorICAgIC8vIGhhc0NhcnJ5ID09IDAsIG5vIGNhcnJ5CisgICAgLy8gaGFzQ2FycnkgPT0gMSwgaGFzIGNhcnJ5CisgICAgLy8gaGFzQ2FycnkgPT0gMiwgbm8gY2FycnkgYW5kIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQgPT0gMC4KKyAgICB1aW50OF90IGhhc0NhcnJ5ID0gMDsKKyAgICBkZXN0W2ldID0gY2FycnkgKyBseCAqIGx5OworICAgIC8vIERldGVybWluZSBpZiB0aGUgYWRkIGFib3ZlIGludHJvZHVjZXMgY2FycnkuCisgICAgaGFzQ2FycnkgPSAoZGVzdFtpXSA8IGNhcnJ5KSA/IDEgOiAwOworICAgIGNhcnJ5ID0gaHggKiBseSArIChkZXN0W2ldID4+IDMyKSArIChoYXNDYXJyeSA/ICgxVUxMIDw8IDMyKSA6IDApOworICAgIC8vIFRoZSB1cHBlciBsaW1pdCBvZiBjYXJyeSBjYW4gYmUgKDJeMzIgLSAxKSgyXjMyIC0gMSkgKworICAgIC8vICgyXjMyIC0gMSkgKyAyXjMyID0gMl42NC4KKyAgICBoYXNDYXJyeSA9ICghY2FycnkgJiYgaGFzQ2FycnkpID8gMSA6ICghY2FycnkgPyAyIDogMCk7CisKKyAgICBjYXJyeSArPSAobHggKiBoeSkgJiAweGZmZmZmZmZmVUxMOworICAgIGRlc3RbaV0gPSAoY2FycnkgPDwgMzIpIHwgKGRlc3RbaV0gJiAweGZmZmZmZmZmVUxMKTsKKyAgICBjYXJyeSA9ICgoKCFjYXJyeSAmJiBoYXNDYXJyeSAhPSAyKSB8fCBoYXNDYXJyeSA9PSAxKSA/ICgxVUxMIDw8IDMyKSA6IDApICsKKyAgICAgICAgICAgIChjYXJyeSA+PiAzMikgKyAoKGx4ICogaHkpID4+IDMyKSArIGh4ICogaHk7CisgIH0KKyAgcmV0dXJuIGNhcnJ5OworfQorCisvLy8gTXVsdGlwbGllcyBpbnRlZ2VyIGFycmF5IHggYnkgaW50ZWdlciBhcnJheSB5IGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvCisvLy8gdGhlIGludGVnZXIgYXJyYXkgZGVzdC4gTm90ZSB0aGF0IGRlc3QncyBzaXplIG11c3QgYmUgPj0geGxlbiArIHlsZW4uCisvLy8gQGJyaWVmIEdlbmVyYWxpemVkIG11bHRpcGxpY2F0ZSBvZiBpbnRlZ2VyIGFycmF5cy4KK3N0YXRpYyB2b2lkIG11bCh1aW50NjRfdCBkZXN0W10sIHVpbnQ2NF90IHhbXSwgdW5zaWduZWQgeGxlbiwgdWludDY0X3QgeVtdLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIHlsZW4pIHsKKyAgZGVzdFt4bGVuXSA9IG11bF8xKGRlc3QsIHgsIHhsZW4sIHlbMF0pOworICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgeWxlbjsgKytpKSB7CisgICAgdWludDY0X3QgbHkgPSB5W2ldICYgMHhmZmZmZmZmZlVMTCwgaHkgPSB5W2ldID4+IDMyOworICAgIHVpbnQ2NF90IGNhcnJ5ID0gMCwgbHggPSAwLCBoeCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHhsZW47ICsraikgeworICAgICAgbHggPSB4W2pdICYgMHhmZmZmZmZmZlVMTDsKKyAgICAgIGh4ID0geFtqXSA+PiAzMjsKKyAgICAgIC8vIGhhc0NhcnJ5IC0gQSBmbGFnIHRvIGluZGljYXRlIGlmIGhhcyBjYXJyeS4KKyAgICAgIC8vIGhhc0NhcnJ5ID09IDAsIG5vIGNhcnJ5CisgICAgICAvLyBoYXNDYXJyeSA9PSAxLCBoYXMgY2FycnkKKyAgICAgIC8vIGhhc0NhcnJ5ID09IDIsIG5vIGNhcnJ5IGFuZCB0aGUgY2FsY3VsYXRpb24gcmVzdWx0ID09IDAuCisgICAgICB1aW50OF90IGhhc0NhcnJ5ID0gMDsKKyAgICAgIHVpbnQ2NF90IHJlc3VsID0gY2FycnkgKyBseCAqIGx5OworICAgICAgaGFzQ2FycnkgPSAocmVzdWwgPCBjYXJyeSkgPyAxIDogMDsKKyAgICAgIGNhcnJ5ID0gKGhhc0NhcnJ5ID8gKDFVTEwgPDwgMzIpIDogMCkgKyBoeCAqIGx5ICsgKHJlc3VsID4+IDMyKTsKKyAgICAgIGhhc0NhcnJ5ID0gKCFjYXJyeSAmJiBoYXNDYXJyeSkgPyAxIDogKCFjYXJyeSA/IDIgOiAwKTsKKworICAgICAgY2FycnkgKz0gKGx4ICogaHkpICYgMHhmZmZmZmZmZlVMTDsKKyAgICAgIHJlc3VsID0gKGNhcnJ5IDw8IDMyKSB8IChyZXN1bCAmIDB4ZmZmZmZmZmZVTEwpOworICAgICAgZGVzdFtpK2pdICs9IHJlc3VsOworICAgICAgY2FycnkgPSAoKCghY2FycnkgJiYgaGFzQ2FycnkgIT0gMikgfHwgaGFzQ2FycnkgPT0gMSkgPyAoMVVMTCA8PCAzMikgOiAwKSsKKyAgICAgICAgICAgICAgKGNhcnJ5ID4+IDMyKSArIChkZXN0W2kral0gPCByZXN1bCA/IDEgOiAwKSArCisgICAgICAgICAgICAgICgobHggKiBoeSkgPj4gMzIpICsgaHggKiBoeTsKKyAgICB9CisgICAgZGVzdFtpK3hsZW5dID0gY2Fycnk7CisgIH0KK30KKworQVBJbnQmIEFQSW50OjpvcGVyYXRvcio9KGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgIFZBTCAqPSBSSFMuVkFMOworICAgIGNsZWFyVW51c2VkQml0cygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEdldCBzb21lIGJpdCBmYWN0cyBhYm91dCBMSFMgYW5kIGNoZWNrIGZvciB6ZXJvCisgIHVuc2lnbmVkIGxoc0JpdHMgPSBnZXRBY3RpdmVCaXRzKCk7CisgIHVuc2lnbmVkIGxoc1dvcmRzID0gIWxoc0JpdHMgPyAwIDogd2hpY2hXb3JkKGxoc0JpdHMgLSAxKSArIDE7CisgIGlmICghbGhzV29yZHMpCisgICAgLy8gMCAqIFggPT09PiAwCisgICAgcmV0dXJuICp0aGlzOworCisgIC8vIEdldCBzb21lIGJpdCBmYWN0cyBhYm91dCBSSFMgYW5kIGNoZWNrIGZvciB6ZXJvCisgIHVuc2lnbmVkIHJoc0JpdHMgPSBSSFMuZ2V0QWN0aXZlQml0cygpOworICB1bnNpZ25lZCByaHNXb3JkcyA9ICFyaHNCaXRzID8gMCA6IHdoaWNoV29yZChyaHNCaXRzIC0gMSkgKyAxOworICBpZiAoIXJoc1dvcmRzKSB7CisgICAgLy8gWCAqIDAgPT09PiAwCisgICAgY2xlYXIoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJlc3VsdAorICB1bnNpZ25lZCBkZXN0V29yZHMgPSByaHNXb3JkcyArIGxoc1dvcmRzOworICB1aW50NjRfdCAqZGVzdCA9IGdldE1lbW9yeShkZXN0V29yZHMpOworCisgIC8vIFBlcmZvcm0gdGhlIGxvbmcgbXVsdGlwbHkKKyAgbXVsKGRlc3QsIHBWYWwsIGxoc1dvcmRzLCBSSFMucFZhbCwgcmhzV29yZHMpOworCisgIC8vIENvcHkgcmVzdWx0IGJhY2sgaW50byAqdGhpcworICBjbGVhcigpOworICB1bnNpZ25lZCB3b3Jkc1RvQ29weSA9IGRlc3RXb3JkcyA+PSBnZXROdW1Xb3JkcygpID8gZ2V0TnVtV29yZHMoKSA6IGRlc3RXb3JkczsKKyAgbWVtY3B5KHBWYWwsIGRlc3QsIHdvcmRzVG9Db3B5ICogQVBJTlRfV09SRF9TSVpFKTsKKworICAvLyBkZWxldGUgZGVzdCBhcnJheSBhbmQgcmV0dXJuCisgIGRlbGV0ZVtdIGRlc3Q7CisgIHJldHVybiAqdGhpczsKK30KKworQVBJbnQmIEFQSW50OjpvcGVyYXRvciY9KGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgIFZBTCAmPSBSSFMuVkFMOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB1bnNpZ25lZCBudW1Xb3JkcyA9IGdldE51bVdvcmRzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1Xb3JkczsgKytpKQorICAgIHBWYWxbaV0gJj0gUkhTLnBWYWxbaV07CisgIHJldHVybiAqdGhpczsKK30KKworQVBJbnQmIEFQSW50OjpvcGVyYXRvcnw9KGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgIFZBTCB8PSBSSFMuVkFMOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB1bnNpZ25lZCBudW1Xb3JkcyA9IGdldE51bVdvcmRzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1Xb3JkczsgKytpKQorICAgIHBWYWxbaV0gfD0gUkhTLnBWYWxbaV07CisgIHJldHVybiAqdGhpczsKK30KKworQVBJbnQmIEFQSW50OjpvcGVyYXRvcl49KGNvbnN0IEFQSW50JiBSSFMpIHsKKyAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgIFZBTCBePSBSSFMuVkFMOworICAgIHRoaXMtPmNsZWFyVW51c2VkQml0cygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB1bnNpZ25lZCBudW1Xb3JkcyA9IGdldE51bVdvcmRzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1Xb3JkczsgKytpKQorICAgIHBWYWxbaV0gXj0gUkhTLnBWYWxbaV07CisgIHJldHVybiBjbGVhclVudXNlZEJpdHMoKTsKK30KKworQVBJbnQgQVBJbnQ6OkFuZFNsb3dDYXNlKGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0IHsKKyAgdW5zaWduZWQgbnVtV29yZHMgPSBnZXROdW1Xb3JkcygpOworICB1aW50NjRfdCogdmFsID0gZ2V0TWVtb3J5KG51bVdvcmRzKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bVdvcmRzOyArK2kpCisgICAgdmFsW2ldID0gcFZhbFtpXSAmIFJIUy5wVmFsW2ldOworICByZXR1cm4gQVBJbnQodmFsLCBnZXRCaXRXaWR0aCgpKTsKK30KKworQVBJbnQgQVBJbnQ6Ok9yU2xvd0Nhc2UoY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICB1bnNpZ25lZCBudW1Xb3JkcyA9IGdldE51bVdvcmRzKCk7CisgIHVpbnQ2NF90ICp2YWwgPSBnZXRNZW1vcnkobnVtV29yZHMpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtV29yZHM7ICsraSkKKyAgICB2YWxbaV0gPSBwVmFsW2ldIHwgUkhTLnBWYWxbaV07CisgIHJldHVybiBBUEludCh2YWwsIGdldEJpdFdpZHRoKCkpOworfQorCitBUEludCBBUEludDo6WG9yU2xvd0Nhc2UoY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICB1bnNpZ25lZCBudW1Xb3JkcyA9IGdldE51bVdvcmRzKCk7CisgIHVpbnQ2NF90ICp2YWwgPSBnZXRNZW1vcnkobnVtV29yZHMpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtV29yZHM7ICsraSkKKyAgICB2YWxbaV0gPSBwVmFsW2ldIF4gUkhTLnBWYWxbaV07CisKKyAgLy8gMF4wPT0xIHNvIGNsZWFyIHRoZSBoaWdoIGJpdHMgaW4gY2FzZSB0aGV5IGdvdCBzZXQuCisgIHJldHVybiBBUEludCh2YWwsIGdldEJpdFdpZHRoKCkpLmNsZWFyVW51c2VkQml0cygpOworfQorCitib29sIEFQSW50OjpvcGVyYXRvciAhKCkgY29uc3QgeworICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgcmV0dXJuICFWQUw7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGdldE51bVdvcmRzKCk7ICsraSkKKyAgICBpZiAocFZhbFtpXSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0FQSW50IEFQSW50OjpvcGVyYXRvciooY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICBhc3NlcnQoQml0V2lkdGggPT0gUkhTLkJpdFdpZHRoICYmICJCaXQgd2lkdGhzIG11c3QgYmUgdGhlIHNhbWUiKTsKKyAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgIHJldHVybiBBUEludChCaXRXaWR0aCwgVkFMICogUkhTLlZBTCk7CisgIEFQSW50IFJlc3VsdCgqdGhpcyk7CisgIFJlc3VsdCAqPSBSSFM7CisgIHJldHVybiBSZXN1bHQuY2xlYXJVbnVzZWRCaXRzKCk7Cit9CisKK0FQSW50IEFQSW50OjpvcGVyYXRvcisoY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICBhc3NlcnQoQml0V2lkdGggPT0gUkhTLkJpdFdpZHRoICYmICJCaXQgd2lkdGhzIG11c3QgYmUgdGhlIHNhbWUiKTsKKyAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgIHJldHVybiBBUEludChCaXRXaWR0aCwgVkFMICsgUkhTLlZBTCk7CisgIEFQSW50IFJlc3VsdChCaXRXaWR0aCwgMCk7CisgIGFkZChSZXN1bHQucFZhbCwgdGhpcy0+cFZhbCwgUkhTLnBWYWwsIGdldE51bVdvcmRzKCkpOworICByZXR1cm4gUmVzdWx0LmNsZWFyVW51c2VkQml0cygpOworfQorCitBUEludCBBUEludDo6b3BlcmF0b3ItKGNvbnN0IEFQSW50JiBSSFMpIGNvbnN0IHsKKyAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIFZBTCAtIFJIUy5WQUwpOworICBBUEludCBSZXN1bHQoQml0V2lkdGgsIDApOworICBzdWIoUmVzdWx0LnBWYWwsIHRoaXMtPnBWYWwsIFJIUy5wVmFsLCBnZXROdW1Xb3JkcygpKTsKKyAgcmV0dXJuIFJlc3VsdC5jbGVhclVudXNlZEJpdHMoKTsKK30KKworYm9vbCBBUEludDo6b3BlcmF0b3JbXSh1bnNpZ25lZCBiaXRQb3NpdGlvbikgY29uc3QgeworICByZXR1cm4gKG1hc2tCaXQoYml0UG9zaXRpb24pICYKKyAgICAgICAgICAoaXNTaW5nbGVXb3JkKCkgPyAgVkFMIDogcFZhbFt3aGljaFdvcmQoYml0UG9zaXRpb24pXSkpICE9IDA7Cit9CisKK2Jvb2wgQVBJbnQ6OkVxdWFsU2xvd0Nhc2UoY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICAvLyBHZXQgc29tZSBmYWN0cyBhYm91dCB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgdHdvIG9wZXJhbmRzLgorICB1bnNpZ25lZCBuMSA9IGdldEFjdGl2ZUJpdHMoKTsKKyAgdW5zaWduZWQgbjIgPSBSSFMuZ2V0QWN0aXZlQml0cygpOworCisgIC8vIElmIHRoZSBudW1iZXIgb2YgYml0cyBpc24ndCB0aGUgc2FtZSwgdGhleSBhcmVuJ3QgZXF1YWwKKyAgaWYgKG4xICE9IG4yKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGUgbnVtYmVyIG9mIGJpdHMgZml0cyBpbiBhIHdvcmQsIHdlIG9ubHkgbmVlZCB0byBjb21wYXJlIHRoZSBsb3cgd29yZC4KKyAgaWYgKG4xIDw9IEFQSU5UX0JJVFNfUEVSX1dPUkQpCisgICAgcmV0dXJuIHBWYWxbMF0gPT0gUkhTLnBWYWxbMF07CisKKyAgLy8gT3RoZXJ3aXNlLCBjb21wYXJlIGV2ZXJ5dGhpbmcKKyAgZm9yIChpbnQgaSA9IHdoaWNoV29yZChuMSAtIDEpOyBpID49IDA7IC0taSkKKyAgICBpZiAocFZhbFtpXSAhPSBSSFMucFZhbFtpXSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQVBJbnQ6OkVxdWFsU2xvd0Nhc2UodWludDY0X3QgVmFsKSBjb25zdCB7CisgIHVuc2lnbmVkIG4gPSBnZXRBY3RpdmVCaXRzKCk7CisgIGlmIChuIDw9IEFQSU5UX0JJVFNfUEVSX1dPUkQpCisgICAgcmV0dXJuIHBWYWxbMF0gPT0gVmFsOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFQSW50Ojp1bHQoY29uc3QgQVBJbnQmIFJIUykgY29uc3QgeworICBhc3NlcnQoQml0V2lkdGggPT0gUkhTLkJpdFdpZHRoICYmICJCaXQgd2lkdGhzIG11c3QgYmUgc2FtZSBmb3IgY29tcGFyaXNvbiIpOworICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgcmV0dXJuIFZBTCA8IFJIUy5WQUw7CisKKyAgLy8gR2V0IGFjdGl2ZSBiaXQgbGVuZ3RoIG9mIGJvdGggb3BlcmFuZHMKKyAgdW5zaWduZWQgbjEgPSBnZXRBY3RpdmVCaXRzKCk7CisgIHVuc2lnbmVkIG4yID0gUkhTLmdldEFjdGl2ZUJpdHMoKTsKKworICAvLyBJZiBtYWduaXR1ZGUgb2YgTEhTIGlzIGxlc3MgdGhhbiBSSFMsIHJldHVybiB0cnVlLgorICBpZiAobjEgPCBuMikKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiBtYWduaXR1ZGUgb2YgUkhTIGlzIGdyZWF0aGVyIHRoYW4gTEhTLCByZXR1cm4gZmFsc2UuCisgIGlmIChuMiA8IG4xKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGV5IGJvdCBmaXQgaW4gYSB3b3JkLCBqdXN0IGNvbXBhcmUgdGhlIGxvdyBvcmRlciB3b3JkCisgIGlmIChuMSA8PSBBUElOVF9CSVRTX1BFUl9XT1JEICYmIG4yIDw9IEFQSU5UX0JJVFNfUEVSX1dPUkQpCisgICAgcmV0dXJuIHBWYWxbMF0gPCBSSFMucFZhbFswXTsKKworICAvLyBPdGhlcndpc2UsIGNvbXBhcmUgYWxsIHdvcmRzCisgIHVuc2lnbmVkIHRvcFdvcmQgPSB3aGljaFdvcmQoc3RkOjptYXgobjEsbjIpLTEpOworICBmb3IgKGludCBpID0gdG9wV29yZDsgaSA+PSAwOyAtLWkpIHsKKyAgICBpZiAocFZhbFtpXSA+IFJIUy5wVmFsW2ldKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChwVmFsW2ldIDwgUkhTLnBWYWxbaV0pCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQVBJbnQ6OnNsdChjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgIGFzc2VydChCaXRXaWR0aCA9PSBSSFMuQml0V2lkdGggJiYgIkJpdCB3aWR0aHMgbXVzdCBiZSBzYW1lIGZvciBjb21wYXJpc29uIik7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgIGludDY0X3QgbGhzU2V4dCA9IChpbnQ2NF90KFZBTCkgPDwgKDY0LUJpdFdpZHRoKSkgPj4gKDY0LUJpdFdpZHRoKTsKKyAgICBpbnQ2NF90IHJoc1NleHQgPSAoaW50NjRfdChSSFMuVkFMKSA8PCAoNjQtQml0V2lkdGgpKSA+PiAoNjQtQml0V2lkdGgpOworICAgIHJldHVybiBsaHNTZXh0IDwgcmhzU2V4dDsKKyAgfQorCisgIEFQSW50IGxocygqdGhpcyk7CisgIEFQSW50IHJocyhSSFMpOworICBib29sIGxoc05lZyA9IGlzTmVnYXRpdmUoKTsKKyAgYm9vbCByaHNOZWcgPSByaHMuaXNOZWdhdGl2ZSgpOworICBpZiAobGhzTmVnKSB7CisgICAgLy8gU2lnbiBiaXQgaXMgc2V0IHNvIHBlcmZvcm0gdHdvJ3MgY29tcGxlbWVudCB0byBtYWtlIGl0IHBvc2l0aXZlCisgICAgbGhzLmZsaXAoKTsKKyAgICBsaHMrKzsKKyAgfQorICBpZiAocmhzTmVnKSB7CisgICAgLy8gU2lnbiBiaXQgaXMgc2V0IHNvIHBlcmZvcm0gdHdvJ3MgY29tcGxlbWVudCB0byBtYWtlIGl0IHBvc2l0aXZlCisgICAgcmhzLmZsaXAoKTsKKyAgICByaHMrKzsKKyAgfQorCisgIC8vIE5vdyB3ZSBoYXZlIHVuc2lnbmVkIHZhbHVlcyB0byBjb21wYXJlIHNvIGRvIHRoZSBjb21wYXJpc29uIGlmIG5lY2Vzc2FyeQorICAvLyBiYXNlZCBvbiB0aGUgbmVnYXRpdmVuZXNzIG9mIHRoZSB2YWx1ZXMuCisgIGlmIChsaHNOZWcpCisgICAgaWYgKHJoc05lZykKKyAgICAgIHJldHVybiBsaHMudWd0KHJocyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRydWU7CisgIGVsc2UgaWYgKHJoc05lZykKKyAgICByZXR1cm4gZmFsc2U7CisgIGVsc2UKKyAgICByZXR1cm4gbGhzLnVsdChyaHMpOworfQorCitBUEludCYgQVBJbnQ6OnNldCh1bnNpZ25lZCBiaXRQb3NpdGlvbikgeworICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgVkFMIHw9IG1hc2tCaXQoYml0UG9zaXRpb24pOworICBlbHNlCisgICAgcFZhbFt3aGljaFdvcmQoYml0UG9zaXRpb24pXSB8PSBtYXNrQml0KGJpdFBvc2l0aW9uKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvLy8gU2V0IHRoZSBnaXZlbiBiaXQgdG8gMCB3aG9zZSBwb3NpdGlvbiBpcyBnaXZlbiBhcyAiYml0UG9zaXRpb24iLgorLy8vIEBicmllZiBTZXQgYSBnaXZlbiBiaXQgdG8gMC4KK0FQSW50JiBBUEludDo6Y2xlYXIodW5zaWduZWQgYml0UG9zaXRpb24pIHsKKyAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgIFZBTCAmPSB+bWFza0JpdChiaXRQb3NpdGlvbik7CisgIGVsc2UKKyAgICBwVmFsW3doaWNoV29yZChiaXRQb3NpdGlvbildICY9IH5tYXNrQml0KGJpdFBvc2l0aW9uKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvLy8gQGJyaWVmIFRvZ2dsZSBldmVyeSBiaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlLgorCisvLy8gVG9nZ2xlIGEgZ2l2ZW4gYml0IHRvIGl0cyBvcHBvc2l0ZSB2YWx1ZSB3aG9zZSBwb3NpdGlvbiBpcyBnaXZlbgorLy8vIGFzICJiaXRQb3NpdGlvbiIuCisvLy8gQGJyaWVmIFRvZ2dsZXMgYSBnaXZlbiBiaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlLgorQVBJbnQmIEFQSW50OjpmbGlwKHVuc2lnbmVkIGJpdFBvc2l0aW9uKSB7CisgIGFzc2VydChiaXRQb3NpdGlvbiA8IEJpdFdpZHRoICYmICJPdXQgb2YgdGhlIGJpdC13aWR0aCByYW5nZSEiKTsKKyAgaWYgKCgqdGhpcylbYml0UG9zaXRpb25dKSBjbGVhcihiaXRQb3NpdGlvbik7CisgIGVsc2Ugc2V0KGJpdFBvc2l0aW9uKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit1bnNpZ25lZCBBUEludDo6Z2V0Qml0c05lZWRlZChTdHJpbmdSZWYgc3RyLCB1aW50OF90IHJhZGl4KSB7CisgIGFzc2VydCghc3RyLmVtcHR5KCkgJiYgIkludmFsaWQgc3RyaW5nIGxlbmd0aCIpOworICBhc3NlcnQoKHJhZGl4ID09IDEwIHx8IHJhZGl4ID09IDggfHwgcmFkaXggPT0gMTYgfHwgcmFkaXggPT0gMikgJiYKKyAgICAgICAgICJSYWRpeCBzaG91bGQgYmUgMiwgOCwgMTAsIG9yIDE2ISIpOworCisgIHNpemVfdCBzbGVuID0gc3RyLnNpemUoKTsKKworICAvLyBFYWNoIGNvbXB1dGF0aW9uIGJlbG93IG5lZWRzIHRvIGtub3cgaWYgaXQncyBuZWdhdGl2ZS4KKyAgU3RyaW5nUmVmOjppdGVyYXRvciBwID0gc3RyLmJlZ2luKCk7CisgIHVuc2lnbmVkIGlzTmVnYXRpdmUgPSAqcCA9PSAnLSc7CisgIGlmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSB7CisgICAgcCsrOworICAgIHNsZW4tLTsKKyAgICBhc3NlcnQoc2xlbiAmJiAiU3RyaW5nIGlzIG9ubHkgYSBzaWduLCBuZWVkcyBhIHZhbHVlLiIpOworICB9CisKKyAgLy8gRm9yIHJhZGl4ZXMgb2YgcG93ZXItb2YtdHdvIHZhbHVlcywgdGhlIGJpdHMgcmVxdWlyZWQgaXMgYWNjdXJhdGVseSBhbmQKKyAgLy8gZWFzaWx5IGNvbXB1dGVkCisgIGlmIChyYWRpeCA9PSAyKQorICAgIHJldHVybiBzbGVuICsgaXNOZWdhdGl2ZTsKKyAgaWYgKHJhZGl4ID09IDgpCisgICAgcmV0dXJuIHNsZW4gKiAzICsgaXNOZWdhdGl2ZTsKKyAgaWYgKHJhZGl4ID09IDE2KQorICAgIHJldHVybiBzbGVuICogNCArIGlzTmVnYXRpdmU7CisKKyAgLy8gVGhpcyBpcyBncm9zc2x5IGluZWZmaWNpZW50IGJ1dCBhY2N1cmF0ZS4gV2UgY291bGQgcHJvYmFibHkgZG8gc29tZXRoaW5nCisgIC8vIHdpdGggYSBjb21wdXRhdGlvbiBvZiByb3VnaGx5IHNsZW4qNjQvMjAgYW5kIHRoZW4gYWRqdXN0IGJ5IHRoZSB2YWx1ZSBvZgorICAvLyB0aGUgZmlyc3QgZmV3IGRpZ2l0cy4gQnV0LCBJJ20gbm90IHN1cmUgaG93IGFjY3VyYXRlIHRoYXQgY291bGQgYmUuCisKKyAgLy8gQ29tcHV0ZSBhIHN1ZmZpY2llbnQgbnVtYmVyIG9mIGJpdHMgdGhhdCBpcyBhbHdheXMgbGFyZ2UgZW5vdWdoIGJ1dCBtaWdodAorICAvLyBiZSB0b28gbGFyZ2UuIFRoaXMgYXZvaWRzIHRoZSBhc3NlcnRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLiBUaGlzCisgIC8vIGNhbGN1bGF0aW9uIGRvZXNuJ3Qgd29yayBhcHByb3ByaWF0ZWx5IGZvciB0aGUgbnVtYmVycyAwLTksIHNvIGp1c3QgdXNlIDQKKyAgLy8gYml0cyBpbiB0aGF0IGNhc2UuCisgIHVuc2lnbmVkIHN1ZmZpY2llbnQgPSBzbGVuID09IDEgPyA0IDogc2xlbiAqIDY0LzE4OworCisgIC8vIENvbnZlcnQgdG8gdGhlIGFjdHVhbCBiaW5hcnkgdmFsdWUuCisgIEFQSW50IHRtcChzdWZmaWNpZW50LCBTdHJpbmdSZWYocCwgc2xlbiksIHJhZGl4KTsKKworICAvLyBDb21wdXRlIGhvdyBtYW55IGJpdHMgYXJlIHJlcXVpcmVkLiBJZiB0aGUgbG9nIGlzIGluZmluaXRlLCBhc3N1bWUgd2UgbmVlZAorICAvLyBqdXN0IGJpdC4KKyAgdW5zaWduZWQgbG9nID0gdG1wLmxvZ0Jhc2UyKCk7CisgIGlmIChsb2cgPT0gKHVuc2lnbmVkKS0xKSB7CisgICAgcmV0dXJuIGlzTmVnYXRpdmUgKyAxOworICB9IGVsc2UgeworICAgIHJldHVybiBpc05lZ2F0aXZlICsgbG9nICsgMTsKKyAgfQorfQorCisvLyBGcm9tIGh0dHA6Ly93d3cuYnVydGxlYnVydGxlLm5ldCwgYnlCb2IgSmVua2lucy4KKy8vIFdoZW4gdGFyZ2V0aW5nIHg4NiwgYm90aCBHQ0MgYW5kIExMVk0gc2VlbSB0byByZWNvZ25pemUgdGhpcyBhcyBhCisvLyByb3RhdGUgaW5zdHJ1Y3Rpb24uCisjZGVmaW5lIHJvdCh4LGspICgoKHgpPDwoaykpIHwgKCh4KT4+KDMyLShrKSkpKQorCisvLyBGcm9tIGh0dHA6Ly93d3cuYnVydGxlYnVydGxlLm5ldCwgYnkgQm9iIEplbmtpbnMuCisjZGVmaW5lIG1peChhLGIsYykgXAorICB7IFwKKyAgICBhIC09IGM7ICBhIF49IHJvdChjLCA0KTsgIGMgKz0gYjsgXAorICAgIGIgLT0gYTsgIGIgXj0gcm90KGEsIDYpOyAgYSArPSBjOyBcCisgICAgYyAtPSBiOyAgYyBePSByb3QoYiwgOCk7ICBiICs9IGE7IFwKKyAgICBhIC09IGM7ICBhIF49IHJvdChjLDE2KTsgIGMgKz0gYjsgXAorICAgIGIgLT0gYTsgIGIgXj0gcm90KGEsMTkpOyAgYSArPSBjOyBcCisgICAgYyAtPSBiOyAgYyBePSByb3QoYiwgNCk7ICBiICs9IGE7IFwKKyAgfQorCisvLyBGcm9tIGh0dHA6Ly93d3cuYnVydGxlYnVydGxlLm5ldCwgYnkgQm9iIEplbmtpbnMuCisjZGVmaW5lIGZpbmFsKGEsYixjKSBcCisgIHsgXAorICAgIGMgXj0gYjsgYyAtPSByb3QoYiwxNCk7IFwKKyAgICBhIF49IGM7IGEgLT0gcm90KGMsMTEpOyBcCisgICAgYiBePSBhOyBiIC09IHJvdChhLDI1KTsgXAorICAgIGMgXj0gYjsgYyAtPSByb3QoYiwxNik7IFwKKyAgICBhIF49IGM7IGEgLT0gcm90KGMsNCk7ICBcCisgICAgYiBePSBhOyBiIC09IHJvdChhLDE0KTsgXAorICAgIGMgXj0gYjsgYyAtPSByb3QoYiwyNCk7IFwKKyAgfQorCisvLyBoYXNod29yZCgpIHdhcyBhZGFwdGVkIGZyb20gaHR0cDovL3d3dy5idXJ0bGVidXJ0bGUubmV0LCBieSBCb2IKKy8vIEplbmtpbnMuICBrIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB1aW50MzJfdCB2YWx1ZXM7IGxlbmd0aCBpcworLy8gdGhlIGxlbmd0aCBvZiB0aGUga2V5LCBpbiAzMi1iaXQgY2h1bmtzLiAgVGhpcyB2ZXJzaW9uIG9ubHkgaGFuZGxlcworLy8ga2V5cyB0aGF0IGFyZSBhIG11bHRpcGxlIG9mIDMyIGJpdHMgaW4gc2l6ZS4KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaGFzaHdvcmQoY29uc3QgdWludDY0X3QgKms2NCwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgY29uc3QgdWludDMyX3QgKmsgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGs2NCk7CisgIHVpbnQzMl90IGEsYixjOworCisgIC8qIFNldCB1cCB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKyAgYSA9IGIgPSBjID0gMHhkZWFkYmVlZiArICgoKHVpbnQzMl90KWxlbmd0aCk8PDIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoYW5kbGUgbW9zdCBvZiB0aGUga2V5ICovCisgIHdoaWxlIChsZW5ndGggPiAzKSB7CisgICAgYSArPSBrWzBdOworICAgIGIgKz0ga1sxXTsKKyAgICBjICs9IGtbMl07CisgICAgbWl4KGEsYixjKTsKKyAgICBsZW5ndGggLT0gMzsKKyAgICBrICs9IDM7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGFuZGxlIHRoZSBsYXN0IDMgdWludDMyX3QncyAqLworICBzd2l0Y2ggKGxlbmd0aCkgeyAgICAgICAgICAgICAgICAgIC8qIGFsbCB0aGUgY2FzZSBzdGF0ZW1lbnRzIGZhbGwgdGhyb3VnaCAqLworICBjYXNlIDMgOiBjKz1rWzJdOworICBjYXNlIDIgOiBiKz1rWzFdOworICBjYXNlIDEgOiBhKz1rWzBdOworICAgIGZpbmFsKGEsYixjKTsKKyAgICBjYXNlIDA6ICAgICAvKiBjYXNlIDA6IG5vdGhpbmcgbGVmdCB0byBhZGQgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVwb3J0IHRoZSByZXN1bHQgKi8KKyAgcmV0dXJuIGM7Cit9CisKKy8vIGhhc2h3b3JkOCgpIHdhcyBhZGFwdGVkIGZyb20gaHR0cDovL3d3dy5idXJ0bGVidXJ0bGUubmV0LCBieSBCb2IKKy8vIEplbmtpbnMuICBUaGlzIGNvbXB1dGVzIGEgMzItYml0IGhhc2ggZnJvbSBvbmUgNjQtYml0IHdvcmQuICBXaGVuCisvLyB0YXJnZXRpbmcgeDg2ICgzMiBvciA2NCBiaXQpLCBib3RoIExMVk0gYW5kIEdDQyBjb21waWxlIHRoaXMKKy8vIGZ1bmN0aW9uIGludG8gYWJvdXQgMzUgaW5zdHJ1Y3Rpb25zIHdoZW4gaW5saW5lZC4KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaGFzaHdvcmQ4KGNvbnN0IHVpbnQ2NF90IGs2NCkKK3sKKyAgdWludDMyX3QgYSxiLGM7CisgIGEgPSBiID0gYyA9IDB4ZGVhZGJlZWYgKyA0OworICBiICs9IGs2NCA+PiAzMjsKKyAgYSArPSBrNjQgJiAweGZmZmZmZmZmOworICBmaW5hbChhLGIsYyk7CisgIHJldHVybiBjOworfQorI3VuZGVmIGZpbmFsCisjdW5kZWYgbWl4CisjdW5kZWYgcm90CisKK3VpbnQ2NF90IEFQSW50OjpnZXRIYXNoVmFsdWUoKSBjb25zdCB7CisgIHVpbnQ2NF90IGhhc2g7CisgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICBoYXNoID0gaGFzaHdvcmQ4KFZBTCk7CisgIGVsc2UKKyAgICBoYXNoID0gaGFzaHdvcmQocFZhbCwgZ2V0TnVtV29yZHMoKSoyKTsKKyAgcmV0dXJuIGhhc2g7Cit9CisKKy8vLyBIaUJpdHMgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGhpZ2ggIm51bUJpdHMiIGJpdHMgb2YgdGhpcyBBUEludC4KK0FQSW50IEFQSW50OjpnZXRIaUJpdHModW5zaWduZWQgbnVtQml0cykgY29uc3QgeworICByZXR1cm4gQVBJbnRPcHM6OmxzaHIoKnRoaXMsIEJpdFdpZHRoIC0gbnVtQml0cyk7Cit9CisKKy8vLyBMb0JpdHMgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxvdyAibnVtQml0cyIgYml0cyBvZiB0aGlzIEFQSW50LgorQVBJbnQgQVBJbnQ6OmdldExvQml0cyh1bnNpZ25lZCBudW1CaXRzKSBjb25zdCB7CisgIHJldHVybiBBUEludE9wczo6bHNocihBUEludE9wczo6c2hsKCp0aGlzLCBCaXRXaWR0aCAtIG51bUJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgQml0V2lkdGggLSBudW1CaXRzKTsKK30KKworYm9vbCBBUEludDo6aXNQb3dlck9mMigpIGNvbnN0IHsKKyAgcmV0dXJuICghISp0aGlzKSAmJiAhKCp0aGlzICYgKCp0aGlzIC0gQVBJbnQoQml0V2lkdGgsMSkpKTsKK30KKwordW5zaWduZWQgQVBJbnQ6OmNvdW50TGVhZGluZ1plcm9zU2xvd0Nhc2UoKSBjb25zdCB7CisgIC8vIFRyZWF0IHRoZSBtb3N0IHNpZ25pZmljYW5kIHdvcmQgZGlmZmVyZW50bHkgYmVjYXVzZSBpdCBtaWdodCBoYXZlCisgIC8vIG1lYW5pbmdsZXNzIGJpdHMgc2V0IGJleW9uZCB0aGUgcHJlY2lzaW9uLgorICB1bnNpZ25lZCBCaXRzSW5NU1cgPSBCaXRXaWR0aCAlIEFQSU5UX0JJVFNfUEVSX1dPUkQ7CisgIGludGVnZXJQYXJ0IE1TV01hc2s7CisgIGlmIChCaXRzSW5NU1cpIE1TV01hc2sgPSAoaW50ZWdlclBhcnQoMSkgPDwgQml0c0luTVNXKSAtIDE7CisgIGVsc2UgeworICAgIE1TV01hc2sgPSB+aW50ZWdlclBhcnQoMCk7CisgICAgQml0c0luTVNXID0gQVBJTlRfQklUU19QRVJfV09SRDsKKyAgfQorCisgIHVuc2lnbmVkIGkgPSBnZXROdW1Xb3JkcygpOworICBpbnRlZ2VyUGFydCBNU1cgPSBwVmFsW2ktMV0gJiBNU1dNYXNrOworICBpZiAoTVNXKQorICAgIHJldHVybiBDb3VudExlYWRpbmdaZXJvc182NChNU1cpIC0gKEFQSU5UX0JJVFNfUEVSX1dPUkQgLSBCaXRzSW5NU1cpOworCisgIHVuc2lnbmVkIENvdW50ID0gQml0c0luTVNXOworICBmb3IgKC0taTsgaSA+IDB1OyAtLWkpIHsKKyAgICBpZiAocFZhbFtpLTFdID09IDApCisgICAgICBDb3VudCArPSBBUElOVF9CSVRTX1BFUl9XT1JEOworICAgIGVsc2UgeworICAgICAgQ291bnQgKz0gQ291bnRMZWFkaW5nWmVyb3NfNjQocFZhbFtpLTFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gQ291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjb3VudExlYWRpbmdPbmVzXzY0KHVpbnQ2NF90IFYsIHVuc2lnbmVkIHNraXApIHsKKyAgdW5zaWduZWQgQ291bnQgPSAwOworICBpZiAoc2tpcCkKKyAgICBWIDw8PSBza2lwOworICB3aGlsZSAoViAmJiAoViAmICgxVUxMIDw8IDYzKSkpIHsKKyAgICBDb3VudCsrOworICAgIFYgPDw9IDE7CisgIH0KKyAgcmV0dXJuIENvdW50OworfQorCit1bnNpZ25lZCBBUEludDo6Y291bnRMZWFkaW5nT25lcygpIGNvbnN0IHsKKyAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgIHJldHVybiBjb3VudExlYWRpbmdPbmVzXzY0KFZBTCwgQVBJTlRfQklUU19QRVJfV09SRCAtIEJpdFdpZHRoKTsKKworICB1bnNpZ25lZCBoaWdoV29yZEJpdHMgPSBCaXRXaWR0aCAlIEFQSU5UX0JJVFNfUEVSX1dPUkQ7CisgIHVuc2lnbmVkIHNoaWZ0OworICBpZiAoIWhpZ2hXb3JkQml0cykgeworICAgIGhpZ2hXb3JkQml0cyA9IEFQSU5UX0JJVFNfUEVSX1dPUkQ7CisgICAgc2hpZnQgPSAwOworICB9IGVsc2UgeworICAgIHNoaWZ0ID0gQVBJTlRfQklUU19QRVJfV09SRCAtIGhpZ2hXb3JkQml0czsKKyAgfQorICBpbnQgaSA9IGdldE51bVdvcmRzKCkgLSAxOworICB1bnNpZ25lZCBDb3VudCA9IGNvdW50TGVhZGluZ09uZXNfNjQocFZhbFtpXSwgc2hpZnQpOworICBpZiAoQ291bnQgPT0gaGlnaFdvcmRCaXRzKSB7CisgICAgZm9yIChpLS07IGkgPj0gMDsgLS1pKSB7CisgICAgICBpZiAocFZhbFtpXSA9PSAtMVVMTCkKKyAgICAgICAgQ291bnQgKz0gQVBJTlRfQklUU19QRVJfV09SRDsKKyAgICAgIGVsc2UgeworICAgICAgICBDb3VudCArPSBjb3VudExlYWRpbmdPbmVzXzY0KHBWYWxbaV0sIDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIENvdW50OworfQorCit1bnNpZ25lZCBBUEludDo6Y291bnRUcmFpbGluZ1plcm9zKCkgY29uc3QgeworICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgcmV0dXJuIHN0ZDo6bWluKHVuc2lnbmVkKENvdW50VHJhaWxpbmdaZXJvc182NChWQUwpKSwgQml0V2lkdGgpOworICB1bnNpZ25lZCBDb3VudCA9IDA7CisgIHVuc2lnbmVkIGkgPSAwOworICBmb3IgKDsgaSA8IGdldE51bVdvcmRzKCkgJiYgcFZhbFtpXSA9PSAwOyArK2kpCisgICAgQ291bnQgKz0gQVBJTlRfQklUU19QRVJfV09SRDsKKyAgaWYgKGkgPCBnZXROdW1Xb3JkcygpKQorICAgIENvdW50ICs9IENvdW50VHJhaWxpbmdaZXJvc182NChwVmFsW2ldKTsKKyAgcmV0dXJuIHN0ZDo6bWluKENvdW50LCBCaXRXaWR0aCk7Cit9CisKK3Vuc2lnbmVkIEFQSW50Ojpjb3VudFRyYWlsaW5nT25lc1Nsb3dDYXNlKCkgY29uc3QgeworICB1bnNpZ25lZCBDb3VudCA9IDA7CisgIHVuc2lnbmVkIGkgPSAwOworICBmb3IgKDsgaSA8IGdldE51bVdvcmRzKCkgJiYgcFZhbFtpXSA9PSAtMVVMTDsgKytpKQorICAgIENvdW50ICs9IEFQSU5UX0JJVFNfUEVSX1dPUkQ7CisgIGlmIChpIDwgZ2V0TnVtV29yZHMoKSkKKyAgICBDb3VudCArPSBDb3VudFRyYWlsaW5nT25lc182NChwVmFsW2ldKTsKKyAgcmV0dXJuIHN0ZDo6bWluKENvdW50LCBCaXRXaWR0aCk7Cit9CisKK3Vuc2lnbmVkIEFQSW50Ojpjb3VudFBvcHVsYXRpb25TbG93Q2FzZSgpIGNvbnN0IHsKKyAgdW5zaWduZWQgQ291bnQgPSAwOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZ2V0TnVtV29yZHMoKTsgKytpKQorICAgIENvdW50ICs9IENvdW50UG9wdWxhdGlvbl82NChwVmFsW2ldKTsKKyAgcmV0dXJuIENvdW50OworfQorCitBUEludCBBUEludDo6Ynl0ZVN3YXAoKSBjb25zdCB7CisgIGFzc2VydChCaXRXaWR0aCA+PSAxNiAmJiBCaXRXaWR0aCAlIDE2ID09IDAgJiYgIkNhbm5vdCBieXRlc3dhcCEiKTsKKyAgaWYgKEJpdFdpZHRoID09IDE2KQorICAgIHJldHVybiBBUEludChCaXRXaWR0aCwgQnl0ZVN3YXBfMTYodWludDE2X3QoVkFMKSkpOworICBlbHNlIGlmIChCaXRXaWR0aCA9PSAzMikKKyAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIEJ5dGVTd2FwXzMyKHVuc2lnbmVkKFZBTCkpKTsKKyAgZWxzZSBpZiAoQml0V2lkdGggPT0gNDgpIHsKKyAgICB1bnNpZ25lZCBUbXAxID0gdW5zaWduZWQoVkFMID4+IDE2KTsKKyAgICBUbXAxID0gQnl0ZVN3YXBfMzIoVG1wMSk7CisgICAgdWludDE2X3QgVG1wMiA9IHVpbnQxNl90KFZBTCk7CisgICAgVG1wMiA9IEJ5dGVTd2FwXzE2KFRtcDIpOworICAgIHJldHVybiBBUEludChCaXRXaWR0aCwgKHVpbnQ2NF90KFRtcDIpIDw8IDMyKSB8IFRtcDEpOworICB9IGVsc2UgaWYgKEJpdFdpZHRoID09IDY0KQorICAgIHJldHVybiBBUEludChCaXRXaWR0aCwgQnl0ZVN3YXBfNjQoVkFMKSk7CisgIGVsc2UgeworICAgIEFQSW50IFJlc3VsdChCaXRXaWR0aCwgMCk7CisgICAgY2hhciAqcEJ5dGUgPSAoY2hhciopUmVzdWx0LnBWYWw7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJpdFdpZHRoIC8gQVBJTlRfV09SRF9TSVpFIC8gMjsgKytpKSB7CisgICAgICBjaGFyIFRtcCA9IHBCeXRlW2ldOworICAgICAgcEJ5dGVbaV0gPSBwQnl0ZVtCaXRXaWR0aCAvIEFQSU5UX1dPUkRfU0laRSAtIDEgLSBpXTsKKyAgICAgIHBCeXRlW0JpdFdpZHRoIC8gQVBJTlRfV09SRF9TSVpFIC0gaSAtIDFdID0gVG1wOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9Cit9CisKK0FQSW50IGxsdm06OkFQSW50T3BzOjpHcmVhdGVzdENvbW1vbkRpdmlzb3IoY29uc3QgQVBJbnQmIEFQSTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50JiBBUEkyKSB7CisgIEFQSW50IEEgPSBBUEkxLCBCID0gQVBJMjsKKyAgd2hpbGUgKCEhQikgeworICAgIEFQSW50IFQgPSBCOworICAgIEIgPSBBUEludE9wczo6dXJlbShBLCBCKTsKKyAgICBBID0gVDsKKyAgfQorICByZXR1cm4gQTsKK30KKworQVBJbnQgbGx2bTo6QVBJbnRPcHM6OlJvdW5kRG91YmxlVG9BUEludChkb3VibGUgRG91YmxlLCB1bnNpZ25lZCB3aWR0aCkgeworICB1bmlvbiB7CisgICAgZG91YmxlIEQ7CisgICAgdWludDY0X3QgSTsKKyAgfSBUOworICBULkQgPSBEb3VibGU7CisKKyAgLy8gR2V0IHRoZSBzaWduIGJpdCBmcm9tIHRoZSBoaWdoZXN0IG9yZGVyIGJpdAorICBib29sIGlzTmVnID0gVC5JID4+IDYzOworCisgIC8vIEdldCB0aGUgMTEtYml0IGV4cG9uZW50IGFuZCBhZGp1c3QgZm9yIHRoZSAxMDIzIGJpdCBiaWFzCisgIGludDY0X3QgZXhwID0gKChULkkgPj4gNTIpICYgMHg3ZmYpIC0gMTAyMzsKKworICAvLyBJZiB0aGUgZXhwb25lbnQgaXMgbmVnYXRpdmUsIHRoZSB2YWx1ZSBpcyA8IDAgc28ganVzdCByZXR1cm4gMC4KKyAgaWYgKGV4cCA8IDApCisgICAgcmV0dXJuIEFQSW50KHdpZHRoLCAwdSk7CisKKyAgLy8gRXh0cmFjdCB0aGUgbWFudGlzc2EgYnkgY2xlYXJpbmcgdGhlIHRvcCAxMiBiaXRzIChzaWduICsgZXhwb25lbnQpLgorICB1aW50NjRfdCBtYW50aXNzYSA9IChULkkgJiAofjBVTEwgPj4gMTIpKSB8IDFVTEwgPDwgNTI7CisKKyAgLy8gSWYgdGhlIGV4cG9uZW50IGRvZXNuJ3Qgc2hpZnQgYWxsIGJpdHMgb3V0IG9mIHRoZSBtYW50aXNzYQorICBpZiAoZXhwIDwgNTIpCisgICAgcmV0dXJuIGlzTmVnID8gLUFQSW50KHdpZHRoLCBtYW50aXNzYSA+PiAoNTIgLSBleHApKSA6CisgICAgICAgICAgICAgICAgICAgIEFQSW50KHdpZHRoLCBtYW50aXNzYSA+PiAoNTIgLSBleHApKTsKKworICAvLyBJZiB0aGUgY2xpZW50IGRpZG4ndCBwcm92aWRlIGVub3VnaCBiaXRzIGZvciB1cyB0byBzaGlmdCB0aGUgbWFudGlzc2EgaW50bworICAvLyB0aGVuIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLCBqdXN0IHJldHVybiAwCisgIGlmICh3aWR0aCA8PSBleHAgLSA1MikKKyAgICByZXR1cm4gQVBJbnQod2lkdGgsIDApOworCisgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBzaGlmdCB0aGUgbWFudGlzc2EgYml0cyB1cCB0byB0aGUgcmlnaHQgbG9jYXRpb24KKyAgQVBJbnQgVG1wKHdpZHRoLCBtYW50aXNzYSk7CisgIFRtcCA9IFRtcC5zaGwoKHVuc2lnbmVkKWV4cCAtIDUyKTsKKyAgcmV0dXJuIGlzTmVnID8gLVRtcCA6IFRtcDsKK30KKworLy8vIFJvdW5kVG9Eb3VibGUgLSBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoaXMgQVBJbnQgdG8gYSBkb3VibGUuCisvLy8gVGhlIGxheW91dCBmb3IgZG91YmxlIGlzIGFzIGZvbGxvd2luZyAoSUVFRSBTdGFuZGFyZCA3NTQpOgorLy8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIHwgIFNpZ24gICAgRXhwb25lbnQgICAgRnJhY3Rpb24gICAgQmlhcyB8CisvLy8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKy8vLyB8ICAxWzYzXSAgIDExWzYyLTUyXSAgIDUyWzUxLTAwXSAgIDEwMjMgfAorLy8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZG91YmxlIEFQSW50Ojpyb3VuZFRvRG91YmxlKGJvb2wgaXNTaWduZWQpIGNvbnN0IHsKKworICAvLyBIYW5kbGUgdGhlIHNpbXBsZSBjYXNlIHdoZXJlIHRoZSB2YWx1ZSBpcyBjb250YWluZWQgaW4gb25lIHVpbnQ2NF90LgorICAvLyBJdCBpcyB3cm9uZyB0byBvcHRpbWl6ZSBnZXRXb3JkKDApIHRvIFZBTDsgdGhlcmUgbWlnaHQgYmUgbW9yZSB0aGFuIG9uZSB3b3JkLgorICBpZiAoaXNTaW5nbGVXb3JkKCkgfHwgZ2V0QWN0aXZlQml0cygpIDw9IEFQSU5UX0JJVFNfUEVSX1dPUkQpIHsKKyAgICBpZiAoaXNTaWduZWQpIHsKKyAgICAgIGludDY0X3Qgc2V4dCA9IChpbnQ2NF90KGdldFdvcmQoMCkpIDw8ICg2NC1CaXRXaWR0aCkpID4+ICg2NC1CaXRXaWR0aCk7CisgICAgICByZXR1cm4gZG91YmxlKHNleHQpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIGRvdWJsZShnZXRXb3JkKDApKTsKKyAgfQorCisgIC8vIERldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuCisgIGJvb2wgaXNOZWcgPSBpc1NpZ25lZCA/ICgqdGhpcylbQml0V2lkdGgtMV0gOiBmYWxzZTsKKworICAvLyBDb25zdHJ1Y3QgdGhlIGFic29sdXRlIHZhbHVlIGlmIHdlJ3JlIG5lZ2F0aXZlLgorICBBUEludCBUbXAoaXNOZWcgPyAtKCp0aGlzKSA6ICgqdGhpcykpOworCisgIC8vIEZpZ3VyZSBvdXQgaG93IG1hbnkgYml0cyB3ZSdyZSB1c2luZy4KKyAgdW5zaWduZWQgbiA9IFRtcC5nZXRBY3RpdmVCaXRzKCk7CisKKyAgLy8gVGhlIGV4cG9uZW50ICh3aXRob3V0IGJpYXMgbm9ybWFsaXphdGlvbikgaXMganVzdCB0aGUgbnVtYmVyIG9mIGJpdHMKKyAgLy8gd2UgYXJlIHVzaW5nLiBOb3RlIHRoYXQgdGhlIHNpZ24gYml0IGlzIGdvbmUgc2luY2Ugd2UgY29uc3RydWN0ZWQgdGhlCisgIC8vIGFic29sdXRlIHZhbHVlLgorICB1aW50NjRfdCBleHAgPSBuOworCisgIC8vIFJldHVybiBpbmZpbml0eSBmb3IgZXhwb25lbnQgb3ZlcmZsb3cKKyAgaWYgKGV4cCA+IDEwMjMpIHsKKyAgICBpZiAoIWlzU2lnbmVkIHx8ICFpc05lZykKKyAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgIH0KKyAgZXhwICs9IDEwMjM7IC8vIEluY3JlbWVudCBmb3IgMTAyMyBiaWFzCisKKyAgLy8gTnVtYmVyIG9mIGJpdHMgaW4gbWFudGlzc2EgaXMgNTIuIFRvIG9idGFpbiB0aGUgbWFudGlzc2EgdmFsdWUsIHdlIG11c3QKKyAgLy8gZXh0cmFjdCB0aGUgaGlnaCA1MiBiaXRzIGZyb20gdGhlIGNvcnJlY3Qgd29yZHMgaW4gcFZhbC4KKyAgdWludDY0X3QgbWFudGlzc2E7CisgIHVuc2lnbmVkIGhpV29yZCA9IHdoaWNoV29yZChuLTEpOworICBpZiAoaGlXb3JkID09IDApIHsKKyAgICBtYW50aXNzYSA9IFRtcC5wVmFsWzBdOworICAgIGlmIChuID4gNTIpCisgICAgICBtYW50aXNzYSA+Pj0gbiAtIDUyOyAvLyBzaGlmdCBkb3duLCB3ZSB3YW50IHRoZSB0b3AgNTIgYml0cy4KKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoaGlXb3JkID4gMCAmJiAiaHVoPyIpOworICAgIHVpbnQ2NF90IGhpYml0cyA9IFRtcC5wVmFsW2hpV29yZF0gPDwgKDUyIC0gbiAlIEFQSU5UX0JJVFNfUEVSX1dPUkQpOworICAgIHVpbnQ2NF90IGxvYml0cyA9IFRtcC5wVmFsW2hpV29yZC0xXSA+PiAoMTEgKyBuICUgQVBJTlRfQklUU19QRVJfV09SRCk7CisgICAgbWFudGlzc2EgPSBoaWJpdHMgfCBsb2JpdHM7CisgIH0KKworICAvLyBUaGUgbGVhZGluZyBiaXQgb2YgbWFudGlzc2EgaXMgaW1wbGljaXQsIHNvIGdldCByaWQgb2YgaXQuCisgIHVpbnQ2NF90IHNpZ24gPSBpc05lZyA/ICgxVUxMIDw8IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gMSkpIDogMDsKKyAgdW5pb24geworICAgIGRvdWJsZSBEOworICAgIHVpbnQ2NF90IEk7CisgIH0gVDsKKyAgVC5JID0gc2lnbiB8IChleHAgPDwgNTIpIHwgbWFudGlzc2E7CisgIHJldHVybiBULkQ7Cit9CisKKy8vIFRydW5jYXRlIHRvIG5ldyB3aWR0aC4KK0FQSW50ICZBUEludDo6dHJ1bmModW5zaWduZWQgd2lkdGgpIHsKKyAgYXNzZXJ0KHdpZHRoIDwgQml0V2lkdGggJiYgIkludmFsaWQgQVBJbnQgVHJ1bmNhdGUgcmVxdWVzdCIpOworICBhc3NlcnQod2lkdGggJiYgIkNhbid0IHRydW5jYXRlIHRvIDAgYml0cyIpOworICB1bnNpZ25lZCB3b3Jkc0JlZm9yZSA9IGdldE51bVdvcmRzKCk7CisgIEJpdFdpZHRoID0gd2lkdGg7CisgIHVuc2lnbmVkIHdvcmRzQWZ0ZXIgPSBnZXROdW1Xb3JkcygpOworICBpZiAod29yZHNCZWZvcmUgIT0gd29yZHNBZnRlcikgeworICAgIGlmICh3b3Jkc0FmdGVyID09IDEpIHsKKyAgICAgIHVpbnQ2NF90ICp0bXAgPSBwVmFsOworICAgICAgVkFMID0gcFZhbFswXTsKKyAgICAgIGRlbGV0ZSBbXSB0bXA7CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQ2NF90ICpuZXdWYWwgPSBnZXRDbGVhcmVkTWVtb3J5KHdvcmRzQWZ0ZXIpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHdvcmRzQWZ0ZXI7ICsraSkKKyAgICAgICAgbmV3VmFsW2ldID0gcFZhbFtpXTsKKyAgICAgIGRlbGV0ZSBbXSBwVmFsOworICAgICAgcFZhbCA9IG5ld1ZhbDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNsZWFyVW51c2VkQml0cygpOworfQorCisvLyBTaWduIGV4dGVuZCB0byBhIG5ldyB3aWR0aC4KK0FQSW50ICZBUEludDo6c2V4dCh1bnNpZ25lZCB3aWR0aCkgeworICBhc3NlcnQod2lkdGggPiBCaXRXaWR0aCAmJiAiSW52YWxpZCBBUEludCBTaWduRXh0ZW5kIHJlcXVlc3QiKTsKKyAgLy8gSWYgdGhlIHNpZ24gYml0IGlzbid0IHNldCwgdGhpcyBpcyB0aGUgc2FtZSBhcyB6ZXh0LgorICBpZiAoIWlzTmVnYXRpdmUoKSkgeworICAgIHpleHQod2lkdGgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFRoZSBzaWduIGJpdCBpcyBzZXQuIEZpcnN0LCBnZXQgc29tZSBmYWN0cworICB1bnNpZ25lZCB3b3Jkc0JlZm9yZSA9IGdldE51bVdvcmRzKCk7CisgIHVuc2lnbmVkIHdvcmRCaXRzID0gQml0V2lkdGggJSBBUElOVF9CSVRTX1BFUl9XT1JEOworICBCaXRXaWR0aCA9IHdpZHRoOworICB1bnNpZ25lZCB3b3Jkc0FmdGVyID0gZ2V0TnVtV29yZHMoKTsKKworICAvLyBNYXNrIHRoZSBoaWdoIG9yZGVyIHdvcmQgYXBwcm9wcmlhdGVseQorICBpZiAod29yZHNCZWZvcmUgPT0gd29yZHNBZnRlcikgeworICAgIHVuc2lnbmVkIG5ld1dvcmRCaXRzID0gd2lkdGggJSBBUElOVF9CSVRTX1BFUl9XT1JEOworICAgIC8vIFRoZSBleHRlbnNpb24gaXMgY29udGFpbmVkIHRvIHRoZSB3b3Jkc0JlZm9yZS0xdGggd29yZC4KKyAgICB1aW50NjRfdCBtYXNrID0gfjBVTEw7CisgICAgaWYgKG5ld1dvcmRCaXRzKQorICAgICAgbWFzayA+Pj0gQVBJTlRfQklUU19QRVJfV09SRCAtIG5ld1dvcmRCaXRzOworICAgIG1hc2sgPDw9IHdvcmRCaXRzOworICAgIGlmICh3b3Jkc0JlZm9yZSA9PSAxKQorICAgICAgVkFMIHw9IG1hc2s7CisgICAgZWxzZQorICAgICAgcFZhbFt3b3Jkc0JlZm9yZS0xXSB8PSBtYXNrOworICAgIHJldHVybiBjbGVhclVudXNlZEJpdHMoKTsKKyAgfQorCisgIHVpbnQ2NF90IG1hc2sgPSB3b3JkQml0cyA9PSAwID8gMCA6IH4wVUxMIDw8IHdvcmRCaXRzOworICB1aW50NjRfdCAqbmV3VmFsID0gZ2V0TWVtb3J5KHdvcmRzQWZ0ZXIpOworICBpZiAod29yZHNCZWZvcmUgPT0gMSkKKyAgICBuZXdWYWxbMF0gPSBWQUwgfCBtYXNrOworICBlbHNlIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgd29yZHNCZWZvcmU7ICsraSkKKyAgICAgIG5ld1ZhbFtpXSA9IHBWYWxbaV07CisgICAgbmV3VmFsW3dvcmRzQmVmb3JlLTFdIHw9IG1hc2s7CisgIH0KKyAgZm9yICh1bnNpZ25lZCBpID0gd29yZHNCZWZvcmU7IGkgPCB3b3Jkc0FmdGVyOyBpKyspCisgICAgbmV3VmFsW2ldID0gLTFVTEw7CisgIGlmICh3b3Jkc0JlZm9yZSAhPSAxKQorICAgIGRlbGV0ZSBbXSBwVmFsOworICBwVmFsID0gbmV3VmFsOworICByZXR1cm4gY2xlYXJVbnVzZWRCaXRzKCk7Cit9CisKKy8vICBaZXJvIGV4dGVuZCB0byBhIG5ldyB3aWR0aC4KK0FQSW50ICZBUEludDo6emV4dCh1bnNpZ25lZCB3aWR0aCkgeworICBhc3NlcnQod2lkdGggPiBCaXRXaWR0aCAmJiAiSW52YWxpZCBBUEludCBaZXJvRXh0ZW5kIHJlcXVlc3QiKTsKKyAgdW5zaWduZWQgd29yZHNCZWZvcmUgPSBnZXROdW1Xb3JkcygpOworICBCaXRXaWR0aCA9IHdpZHRoOworICB1bnNpZ25lZCB3b3Jkc0FmdGVyID0gZ2V0TnVtV29yZHMoKTsKKyAgaWYgKHdvcmRzQmVmb3JlICE9IHdvcmRzQWZ0ZXIpIHsKKyAgICB1aW50NjRfdCAqbmV3VmFsID0gZ2V0Q2xlYXJlZE1lbW9yeSh3b3Jkc0FmdGVyKTsKKyAgICBpZiAod29yZHNCZWZvcmUgPT0gMSkKKyAgICAgIG5ld1ZhbFswXSA9IFZBTDsKKyAgICBlbHNlCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgd29yZHNCZWZvcmU7ICsraSkKKyAgICAgICAgbmV3VmFsW2ldID0gcFZhbFtpXTsKKyAgICBpZiAod29yZHNCZWZvcmUgIT0gMSkKKyAgICAgIGRlbGV0ZSBbXSBwVmFsOworICAgIHBWYWwgPSBuZXdWYWw7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCitBUEludCAmQVBJbnQ6OnpleHRPclRydW5jKHVuc2lnbmVkIHdpZHRoKSB7CisgIGlmIChCaXRXaWR0aCA8IHdpZHRoKQorICAgIHJldHVybiB6ZXh0KHdpZHRoKTsKKyAgaWYgKEJpdFdpZHRoID4gd2lkdGgpCisgICAgcmV0dXJuIHRydW5jKHdpZHRoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitBUEludCAmQVBJbnQ6OnNleHRPclRydW5jKHVuc2lnbmVkIHdpZHRoKSB7CisgIGlmIChCaXRXaWR0aCA8IHdpZHRoKQorICAgIHJldHVybiBzZXh0KHdpZHRoKTsKKyAgaWYgKEJpdFdpZHRoID4gd2lkdGgpCisgICAgcmV0dXJuIHRydW5jKHdpZHRoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvLy8gQXJpdGhtZXRpYyByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorLy8vIEBicmllZiBBcml0aG1ldGljIHJpZ2h0LXNoaWZ0IGZ1bmN0aW9uLgorQVBJbnQgQVBJbnQ6OmFzaHIoY29uc3QgQVBJbnQgJnNoaWZ0QW10KSBjb25zdCB7CisgIHJldHVybiBhc2hyKCh1bnNpZ25lZClzaGlmdEFtdC5nZXRMaW1pdGVkVmFsdWUoQml0V2lkdGgpKTsKK30KKworLy8vIEFyaXRobWV0aWMgcmlnaHQtc2hpZnQgdGhpcyBBUEludCBieSBzaGlmdEFtdC4KKy8vLyBAYnJpZWYgQXJpdGhtZXRpYyByaWdodC1zaGlmdCBmdW5jdGlvbi4KK0FQSW50IEFQSW50Ojphc2hyKHVuc2lnbmVkIHNoaWZ0QW10KSBjb25zdCB7CisgIGFzc2VydChzaGlmdEFtdCA8PSBCaXRXaWR0aCAmJiAiSW52YWxpZCBzaGlmdCBhbW91bnQiKTsKKyAgLy8gSGFuZGxlIGEgZGVnZW5lcmF0ZSBjYXNlCisgIGlmIChzaGlmdEFtdCA9PSAwKQorICAgIHJldHVybiAqdGhpczsKKworICAvLyBIYW5kbGUgc2luZ2xlIHdvcmQgc2hpZnRzIHdpdGggYnVpbHQtaW4gYXNocgorICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICBpZiAoc2hpZnRBbXQgPT0gQml0V2lkdGgpCisgICAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIDApOyAvLyB1bmRlZmluZWQKKyAgICBlbHNlIHsKKyAgICAgIHVuc2lnbmVkIFNpZ25CaXQgPSBBUElOVF9CSVRTX1BFUl9XT1JEIC0gQml0V2lkdGg7CisgICAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsCisgICAgICAgICgoKGludDY0X3QoVkFMKSA8PCBTaWduQml0KSA+PiBTaWduQml0KSA+PiBzaGlmdEFtdCkpOworICAgIH0KKyAgfQorCisgIC8vIElmIGFsbCB0aGUgYml0cyB3ZXJlIHNoaWZ0ZWQgb3V0LCB0aGUgcmVzdWx0IGlzLCB0ZWNobmljYWxseSwgdW5kZWZpbmVkLgorICAvLyBXZSByZXR1cm4gLTEgaWYgaXQgd2FzIG5lZ2F0aXZlLCAwIG90aGVyd2lzZS4gV2UgY2hlY2sgdGhpcyBlYXJseSB0byBhdm9pZAorICAvLyBpc3N1ZXMgaW4gdGhlIGFsZ29yaXRobSBiZWxvdy4KKyAgaWYgKHNoaWZ0QW10ID09IEJpdFdpZHRoKSB7CisgICAgaWYgKGlzTmVnYXRpdmUoKSkKKyAgICAgIHJldHVybiBBUEludChCaXRXaWR0aCwgLTFVTEwsIHRydWUpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBBUEludChCaXRXaWR0aCwgMCk7CisgIH0KKworICAvLyBDcmVhdGUgc29tZSBzcGFjZSBmb3IgdGhlIHJlc3VsdC4KKyAgdWludDY0X3QgKiB2YWwgPSBuZXcgdWludDY0X3RbZ2V0TnVtV29yZHMoKV07CisKKyAgLy8gQ29tcHV0ZSBzb21lIHZhbHVlcyBuZWVkZWQgYnkgdGhlIGZvbGxvd2luZyBzaGlmdCBhbGdvcml0aG1zCisgIHVuc2lnbmVkIHdvcmRTaGlmdCA9IHNoaWZ0QW10ICUgQVBJTlRfQklUU19QRVJfV09SRDsgLy8gYml0cyB0byBzaGlmdCBwZXIgd29yZAorICB1bnNpZ25lZCBvZmZzZXQgPSBzaGlmdEFtdCAvIEFQSU5UX0JJVFNfUEVSX1dPUkQ7IC8vIHdvcmQgb2Zmc2V0IGZvciBzaGlmdAorICB1bnNpZ25lZCBicmVha1dvcmQgPSBnZXROdW1Xb3JkcygpIC0gMSAtIG9mZnNldDsgLy8gbGFzdCB3b3JkIGFmZmVjdGVkCisgIHVuc2lnbmVkIGJpdHNJbldvcmQgPSB3aGljaEJpdChCaXRXaWR0aCk7IC8vIGhvdyBtYW55IGJpdHMgaW4gbGFzdCB3b3JkPworICBpZiAoYml0c0luV29yZCA9PSAwKQorICAgIGJpdHNJbldvcmQgPSBBUElOVF9CSVRTX1BFUl9XT1JEOworCisgIC8vIElmIHdlIGFyZSBzaGlmdGluZyB3aG9sZSB3b3JkcywganVzdCBtb3ZlIHdob2xlIHdvcmRzCisgIGlmICh3b3JkU2hpZnQgPT0gMCkgeworICAgIC8vIE1vdmUgdGhlIHdvcmRzIGNvbnRhaW5pbmcgc2lnbmlmaWNhbnQgYml0cworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPD0gYnJlYWtXb3JkOyArK2kpCisgICAgICB2YWxbaV0gPSBwVmFsW2krb2Zmc2V0XTsgLy8gbW92ZSB3aG9sZSB3b3JkCisKKyAgICAvLyBBZGp1c3QgdGhlIHRvcCBzaWduaWZpY2FudCB3b3JkIGZvciBzaWduIGJpdCBmaWxsLCBpZiBuZWdhdGl2ZQorICAgIGlmIChpc05lZ2F0aXZlKCkpCisgICAgICBpZiAoYml0c0luV29yZCA8IEFQSU5UX0JJVFNfUEVSX1dPUkQpCisgICAgICAgIHZhbFticmVha1dvcmRdIHw9IH4wVUxMIDw8IGJpdHNJbldvcmQ7IC8vIHNldCBoaWdoIGJpdHMKKyAgfSBlbHNlIHsKKyAgICAvLyBTaGlmdCB0aGUgbG93IG9yZGVyIHdvcmRzCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGJyZWFrV29yZDsgKytpKSB7CisgICAgICAvLyBUaGlzIGNvbWJpbmVzIHRoZSBzaGlmdGVkIGNvcnJlc3BvbmRpbmcgd29yZCB3aXRoIHRoZSBsb3cgYml0cyBmcm9tCisgICAgICAvLyB0aGUgbmV4dCB3b3JkIChzaGlmdGVkIGludG8gdGhpcyB3b3JkJ3MgaGlnaCBiaXRzKS4KKyAgICAgIHZhbFtpXSA9IChwVmFsW2krb2Zmc2V0XSA+PiB3b3JkU2hpZnQpIHwKKyAgICAgICAgICAgICAgIChwVmFsW2krb2Zmc2V0KzFdIDw8IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gd29yZFNoaWZ0KSk7CisgICAgfQorCisgICAgLy8gU2hpZnQgdGhlIGJyZWFrIHdvcmQuIEluIHRoaXMgY2FzZSB0aGVyZSBhcmUgbm8gYml0cyBmcm9tIHRoZSBuZXh0IHdvcmQKKyAgICAvLyB0byBpbmNsdWRlIGluIHRoaXMgd29yZC4KKyAgICB2YWxbYnJlYWtXb3JkXSA9IHBWYWxbYnJlYWtXb3JkK29mZnNldF0gPj4gd29yZFNoaWZ0OworCisgICAgLy8gRGVhbCB3aXRoIHNpZ24gZXh0ZW5zdGlvbiBpbiB0aGUgYnJlYWsgd29yZCwgYW5kIHBvc3NpYmx5IHRoZSB3b3JkIGJlZm9yZQorICAgIC8vIGl0LgorICAgIGlmIChpc05lZ2F0aXZlKCkpIHsKKyAgICAgIGlmICh3b3JkU2hpZnQgPiBiaXRzSW5Xb3JkKSB7CisgICAgICAgIGlmIChicmVha1dvcmQgPiAwKQorICAgICAgICAgIHZhbFticmVha1dvcmQtMV0gfD0KKyAgICAgICAgICAgIH4wVUxMIDw8IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gKHdvcmRTaGlmdCAtIGJpdHNJbldvcmQpKTsKKyAgICAgICAgdmFsW2JyZWFrV29yZF0gfD0gfjBVTEw7CisgICAgICB9IGVsc2UKKyAgICAgICAgdmFsW2JyZWFrV29yZF0gfD0gKH4wVUxMIDw8IChiaXRzSW5Xb3JkIC0gd29yZFNoaWZ0KSk7CisgICAgfQorICB9CisKKyAgLy8gUmVtYWluaW5nIHdvcmRzIGFyZSAwIG9yIC0xLCBqdXN0IGFzc2lnbiB0aGVtLgorICB1aW50NjRfdCBmaWxsVmFsdWUgPSAoaXNOZWdhdGl2ZSgpID8gLTFVTEwgOiAwKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gYnJlYWtXb3JkKzE7IGkgPCBnZXROdW1Xb3JkcygpOyArK2kpCisgICAgdmFsW2ldID0gZmlsbFZhbHVlOworICByZXR1cm4gQVBJbnQodmFsLCBCaXRXaWR0aCkuY2xlYXJVbnVzZWRCaXRzKCk7Cit9CisKKy8vLyBMb2dpY2FsIHJpZ2h0LXNoaWZ0IHRoaXMgQVBJbnQgYnkgc2hpZnRBbXQuCisvLy8gQGJyaWVmIExvZ2ljYWwgcmlnaHQtc2hpZnQgZnVuY3Rpb24uCitBUEludCBBUEludDo6bHNocihjb25zdCBBUEludCAmc2hpZnRBbXQpIGNvbnN0IHsKKyAgcmV0dXJuIGxzaHIoKHVuc2lnbmVkKXNoaWZ0QW10LmdldExpbWl0ZWRWYWx1ZShCaXRXaWR0aCkpOworfQorCisvLy8gTG9naWNhbCByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorLy8vIEBicmllZiBMb2dpY2FsIHJpZ2h0LXNoaWZ0IGZ1bmN0aW9uLgorQVBJbnQgQVBJbnQ6OmxzaHIodW5zaWduZWQgc2hpZnRBbXQpIGNvbnN0IHsKKyAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgaWYgKHNoaWZ0QW10ID09IEJpdFdpZHRoKQorICAgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLCAwKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIHRoaXMtPlZBTCA+PiBzaGlmdEFtdCk7CisgIH0KKworICAvLyBJZiBhbGwgdGhlIGJpdHMgd2VyZSBzaGlmdGVkIG91dCwgdGhlIHJlc3VsdCBpcyAwLiBUaGlzIGF2b2lkcyBpc3N1ZXMKKyAgLy8gd2l0aCBzaGlmdGluZyBieSB0aGUgc2l6ZSBvZiB0aGUgaW50ZWdlciB0eXBlLCB3aGljaCBwcm9kdWNlcyB1bmRlZmluZWQKKyAgLy8gcmVzdWx0cy4gV2UgZGVmaW5lIHRoZXNlICJ1bmRlZmluZWQgcmVzdWx0cyIgdG8gYWx3YXlzIGJlIDAuCisgIGlmIChzaGlmdEFtdCA9PSBCaXRXaWR0aCkKKyAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIDApOworCisgIC8vIElmIG5vbmUgb2YgdGhlIGJpdHMgYXJlIHNoaWZ0ZWQgb3V0LCB0aGUgcmVzdWx0IGlzICp0aGlzLiBUaGlzIGF2b2lkcworICAvLyBpc3N1ZXMgd2l0aCBzaGlmdGluZyBieSB0aGUgc2l6ZSBvZiB0aGUgaW50ZWdlciB0eXBlLCB3aGljaCBwcm9kdWNlcworICAvLyB1bmRlZmluZWQgcmVzdWx0cyBpbiB0aGUgY29kZSBiZWxvdy4gVGhpcyBpcyBhbHNvIGFuIG9wdGltaXphdGlvbi4KKyAgaWYgKHNoaWZ0QW10ID09IDApCisgICAgcmV0dXJuICp0aGlzOworCisgIC8vIENyZWF0ZSBzb21lIHNwYWNlIGZvciB0aGUgcmVzdWx0LgorICB1aW50NjRfdCAqIHZhbCA9IG5ldyB1aW50NjRfdFtnZXROdW1Xb3JkcygpXTsKKworICAvLyBJZiB3ZSBhcmUgc2hpZnRpbmcgbGVzcyB0aGFuIGEgd29yZCwgY29tcHV0ZSB0aGUgc2hpZnQgd2l0aCBhIHNpbXBsZSBjYXJyeQorICBpZiAoc2hpZnRBbXQgPCBBUElOVF9CSVRTX1BFUl9XT1JEKSB7CisgICAgdWludDY0X3QgY2FycnkgPSAwOworICAgIGZvciAoaW50IGkgPSBnZXROdW1Xb3JkcygpLTE7IGkgPj0gMDsgLS1pKSB7CisgICAgICB2YWxbaV0gPSAocFZhbFtpXSA+PiBzaGlmdEFtdCkgfCBjYXJyeTsKKyAgICAgIGNhcnJ5ID0gcFZhbFtpXSA8PCAoQVBJTlRfQklUU19QRVJfV09SRCAtIHNoaWZ0QW10KTsKKyAgICB9CisgICAgcmV0dXJuIEFQSW50KHZhbCwgQml0V2lkdGgpLmNsZWFyVW51c2VkQml0cygpOworICB9CisKKyAgLy8gQ29tcHV0ZSBzb21lIHZhbHVlcyBuZWVkZWQgYnkgdGhlIHJlbWFpbmluZyBzaGlmdCBhbGdvcml0aG1zCisgIHVuc2lnbmVkIHdvcmRTaGlmdCA9IHNoaWZ0QW10ICUgQVBJTlRfQklUU19QRVJfV09SRDsKKyAgdW5zaWduZWQgb2Zmc2V0ID0gc2hpZnRBbXQgLyBBUElOVF9CSVRTX1BFUl9XT1JEOworCisgIC8vIElmIHdlIGFyZSBzaGlmdGluZyB3aG9sZSB3b3JkcywganVzdCBtb3ZlIHdob2xlIHdvcmRzCisgIGlmICh3b3JkU2hpZnQgPT0gMCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBnZXROdW1Xb3JkcygpIC0gb2Zmc2V0OyArK2kpCisgICAgICB2YWxbaV0gPSBwVmFsW2krb2Zmc2V0XTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBnZXROdW1Xb3JkcygpLW9mZnNldDsgaSA8IGdldE51bVdvcmRzKCk7IGkrKykKKyAgICAgIHZhbFtpXSA9IDA7CisgICAgcmV0dXJuIEFQSW50KHZhbCxCaXRXaWR0aCkuY2xlYXJVbnVzZWRCaXRzKCk7CisgIH0KKworICAvLyBTaGlmdCB0aGUgbG93IG9yZGVyIHdvcmRzCisgIHVuc2lnbmVkIGJyZWFrV29yZCA9IGdldE51bVdvcmRzKCkgLSBvZmZzZXQgLTE7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBicmVha1dvcmQ7ICsraSkKKyAgICB2YWxbaV0gPSAocFZhbFtpK29mZnNldF0gPj4gd29yZFNoaWZ0KSB8CisgICAgICAgICAgICAgKHBWYWxbaStvZmZzZXQrMV0gPDwgKEFQSU5UX0JJVFNfUEVSX1dPUkQgLSB3b3JkU2hpZnQpKTsKKyAgLy8gU2hpZnQgdGhlIGJyZWFrIHdvcmQuCisgIHZhbFticmVha1dvcmRdID0gcFZhbFticmVha1dvcmQrb2Zmc2V0XSA+PiB3b3JkU2hpZnQ7CisKKyAgLy8gUmVtYWluaW5nIHdvcmRzIGFyZSAwCisgIGZvciAodW5zaWduZWQgaSA9IGJyZWFrV29yZCsxOyBpIDwgZ2V0TnVtV29yZHMoKTsgKytpKQorICAgIHZhbFtpXSA9IDA7CisgIHJldHVybiBBUEludCh2YWwsIEJpdFdpZHRoKS5jbGVhclVudXNlZEJpdHMoKTsKK30KKworLy8vIExlZnQtc2hpZnQgdGhpcyBBUEludCBieSBzaGlmdEFtdC4KKy8vLyBAYnJpZWYgTGVmdC1zaGlmdCBmdW5jdGlvbi4KK0FQSW50IEFQSW50OjpzaGwoY29uc3QgQVBJbnQgJnNoaWZ0QW10KSBjb25zdCB7CisgIC8vIEl0J3MgdW5kZWZpbmVkIGJlaGF2aW9yIGluIEMgdG8gc2hpZnQgYnkgQml0V2lkdGggb3IgZ3JlYXRlci4KKyAgcmV0dXJuIHNobCgodW5zaWduZWQpc2hpZnRBbXQuZ2V0TGltaXRlZFZhbHVlKEJpdFdpZHRoKSk7Cit9CisKK0FQSW50IEFQSW50OjpzaGxTbG93Q2FzZSh1bnNpZ25lZCBzaGlmdEFtdCkgY29uc3QgeworICAvLyBJZiBhbGwgdGhlIGJpdHMgd2VyZSBzaGlmdGVkIG91dCwgdGhlIHJlc3VsdCBpcyAwLiBUaGlzIGF2b2lkcyBpc3N1ZXMKKyAgLy8gd2l0aCBzaGlmdGluZyBieSB0aGUgc2l6ZSBvZiB0aGUgaW50ZWdlciB0eXBlLCB3aGljaCBwcm9kdWNlcyB1bmRlZmluZWQKKyAgLy8gcmVzdWx0cy4gV2UgZGVmaW5lIHRoZXNlICJ1bmRlZmluZWQgcmVzdWx0cyIgdG8gYWx3YXlzIGJlIDAuCisgIGlmIChzaGlmdEFtdCA9PSBCaXRXaWR0aCkKKyAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIDApOworCisgIC8vIElmIG5vbmUgb2YgdGhlIGJpdHMgYXJlIHNoaWZ0ZWQgb3V0LCB0aGUgcmVzdWx0IGlzICp0aGlzLiBUaGlzIGF2b2lkcyBhCisgIC8vIGxzaHIgYnkgdGhlIHdvcmRzIHNpemUgaW4gdGhlIGxvb3AgYmVsb3cgd2hpY2ggY2FuIHByb2R1Y2UgaW5jb3JyZWN0CisgIC8vIHJlc3VsdHMuIEl0IGFsc28gYXZvaWRzIHRoZSBleHBlbnNpdmUgY29tcHV0YXRpb24gYmVsb3cgZm9yIGEgY29tbW9uIGNhc2UuCisgIGlmIChzaGlmdEFtdCA9PSAwKQorICAgIHJldHVybiAqdGhpczsKKworICAvLyBDcmVhdGUgc29tZSBzcGFjZSBmb3IgdGhlIHJlc3VsdC4KKyAgdWludDY0X3QgKiB2YWwgPSBuZXcgdWludDY0X3RbZ2V0TnVtV29yZHMoKV07CisKKyAgLy8gSWYgd2UgYXJlIHNoaWZ0aW5nIGxlc3MgdGhhbiBhIHdvcmQsIGRvIGl0IHRoZSBlYXN5IHdheQorICBpZiAoc2hpZnRBbXQgPCBBUElOVF9CSVRTX1BFUl9XT1JEKSB7CisgICAgdWludDY0X3QgY2FycnkgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBnZXROdW1Xb3JkcygpOyBpKyspIHsKKyAgICAgIHZhbFtpXSA9IHBWYWxbaV0gPDwgc2hpZnRBbXQgfCBjYXJyeTsKKyAgICAgIGNhcnJ5ID0gcFZhbFtpXSA+PiAoQVBJTlRfQklUU19QRVJfV09SRCAtIHNoaWZ0QW10KTsKKyAgICB9CisgICAgcmV0dXJuIEFQSW50KHZhbCwgQml0V2lkdGgpLmNsZWFyVW51c2VkQml0cygpOworICB9CisKKyAgLy8gQ29tcHV0ZSBzb21lIHZhbHVlcyBuZWVkZWQgYnkgdGhlIHJlbWFpbmluZyBzaGlmdCBhbGdvcml0aG1zCisgIHVuc2lnbmVkIHdvcmRTaGlmdCA9IHNoaWZ0QW10ICUgQVBJTlRfQklUU19QRVJfV09SRDsKKyAgdW5zaWduZWQgb2Zmc2V0ID0gc2hpZnRBbXQgLyBBUElOVF9CSVRTX1BFUl9XT1JEOworCisgIC8vIElmIHdlIGFyZSBzaGlmdGluZyB3aG9sZSB3b3JkcywganVzdCBtb3ZlIHdob2xlIHdvcmRzCisgIGlmICh3b3JkU2hpZnQgPT0gMCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykKKyAgICAgIHZhbFtpXSA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gb2Zmc2V0OyBpIDwgZ2V0TnVtV29yZHMoKTsgaSsrKQorICAgICAgdmFsW2ldID0gcFZhbFtpLW9mZnNldF07CisgICAgcmV0dXJuIEFQSW50KHZhbCxCaXRXaWR0aCkuY2xlYXJVbnVzZWRCaXRzKCk7CisgIH0KKworICAvLyBDb3B5IHdob2xlIHdvcmRzIGZyb20gdGhpcyB0byBSZXN1bHQuCisgIHVuc2lnbmVkIGkgPSBnZXROdW1Xb3JkcygpIC0gMTsKKyAgZm9yICg7IGkgPiBvZmZzZXQ7IC0taSkKKyAgICB2YWxbaV0gPSBwVmFsW2ktb2Zmc2V0XSA8PCB3b3JkU2hpZnQgfAorICAgICAgICAgICAgIHBWYWxbaS1vZmZzZXQtMV0gPj4gKEFQSU5UX0JJVFNfUEVSX1dPUkQgLSB3b3JkU2hpZnQpOworICB2YWxbb2Zmc2V0XSA9IHBWYWxbMF0gPDwgd29yZFNoaWZ0OworICBmb3IgKGkgPSAwOyBpIDwgb2Zmc2V0OyArK2kpCisgICAgdmFsW2ldID0gMDsKKyAgcmV0dXJuIEFQSW50KHZhbCwgQml0V2lkdGgpLmNsZWFyVW51c2VkQml0cygpOworfQorCitBUEludCBBUEludDo6cm90bChjb25zdCBBUEludCAmcm90YXRlQW10KSBjb25zdCB7CisgIHJldHVybiByb3RsKCh1bnNpZ25lZClyb3RhdGVBbXQuZ2V0TGltaXRlZFZhbHVlKEJpdFdpZHRoKSk7Cit9CisKK0FQSW50IEFQSW50Ojpyb3RsKHVuc2lnbmVkIHJvdGF0ZUFtdCkgY29uc3QgeworICBpZiAocm90YXRlQW10ID09IDApCisgICAgcmV0dXJuICp0aGlzOworICAvLyBEb24ndCBnZXQgdG9vIGZhbmN5LCBqdXN0IHVzZSBleGlzdGluZyBzaGlmdC9vciBmYWNpbGl0aWVzCisgIEFQSW50IGhpKCp0aGlzKTsKKyAgQVBJbnQgbG8oKnRoaXMpOworICBoaS5zaGwocm90YXRlQW10KTsKKyAgbG8ubHNocihCaXRXaWR0aCAtIHJvdGF0ZUFtdCk7CisgIHJldHVybiBoaSB8IGxvOworfQorCitBUEludCBBUEludDo6cm90cihjb25zdCBBUEludCAmcm90YXRlQW10KSBjb25zdCB7CisgIHJldHVybiByb3RyKCh1bnNpZ25lZClyb3RhdGVBbXQuZ2V0TGltaXRlZFZhbHVlKEJpdFdpZHRoKSk7Cit9CisKK0FQSW50IEFQSW50Ojpyb3RyKHVuc2lnbmVkIHJvdGF0ZUFtdCkgY29uc3QgeworICBpZiAocm90YXRlQW10ID09IDApCisgICAgcmV0dXJuICp0aGlzOworICAvLyBEb24ndCBnZXQgdG9vIGZhbmN5LCBqdXN0IHVzZSBleGlzdGluZyBzaGlmdC9vciBmYWNpbGl0aWVzCisgIEFQSW50IGhpKCp0aGlzKTsKKyAgQVBJbnQgbG8oKnRoaXMpOworICBsby5sc2hyKHJvdGF0ZUFtdCk7CisgIGhpLnNobChCaXRXaWR0aCAtIHJvdGF0ZUFtdCk7CisgIHJldHVybiBoaSB8IGxvOworfQorCisvLyBTcXVhcmUgUm9vdCAtIHRoaXMgbWV0aG9kIGNvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiAidGhpcyIuCisvLyBUaHJlZSBtZWNoYW5pc21zIGFyZSB1c2VkIGZvciBjb21wdXRhdGlvbi4gRm9yIHNtYWxsIHZhbHVlcyAoPD0gNSBiaXRzKSwKKy8vIGEgdGFibGUgbG9va3VwIGlzIGRvbmUuIFRoaXMgZ2V0cyBzb21lIHBlcmZvcm1hbmNlIGZvciBjb21tb24gY2FzZXMuIEZvcgorLy8gdmFsdWVzIHVzaW5nIGxlc3MgdGhhbiA1MiBiaXRzLCB0aGUgdmFsdWUgaXMgY29udmVydGVkIHRvIGRvdWJsZSBhbmQgdGhlbgorLy8gdGhlIGxpYmMgc3FydCBmdW5jdGlvbiBpcyBjYWxsZWQuIFRoZSByZXN1bHQgaXMgcm91bmRlZCBhbmQgdGhlbiBjb252ZXJ0ZWQKKy8vIGJhY2sgdG8gYSB1aW50NjRfdCB3aGljaCBpcyB0aGVuIHVzZWQgdG8gY29uc3RydWN0IHRoZSByZXN1bHQuIEZpbmFsbHksCisvLyB0aGUgQmFieWxvbmlhbiBtZXRob2QgZm9yIGNvbXB1dGluZyBzcXVhcmUgcm9vdHMgaXMgdXNlZC4KK0FQSW50IEFQSW50OjpzcXJ0KCkgY29uc3QgeworCisgIC8vIERldGVybWluZSB0aGUgbWFnbml0dWRlIG9mIHRoZSB2YWx1ZS4KKyAgdW5zaWduZWQgbWFnbml0dWRlID0gZ2V0QWN0aXZlQml0cygpOworCisgIC8vIFVzZSBhIGZhc3QgdGFibGUgZm9yIHNvbWUgc21hbGwgdmFsdWVzLiBUaGlzIGFsc28gZ2V0cyByaWQgb2Ygc29tZQorICAvLyByb3VuZGluZyBlcnJvcnMgaW4gbGliYyBzcXJ0IGZvciBzbWFsbCB2YWx1ZXMuCisgIGlmIChtYWduaXR1ZGUgPD0gNSkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHJlc3VsdHNbMzJdID0geworICAgICAgLyogICAgIDAgKi8gMCwKKyAgICAgIC8qICAxLSAyICovIDEsIDEsCisgICAgICAvKiAgMy0gNiAqLyAyLCAyLCAyLCAyLAorICAgICAgLyogIDctMTIgKi8gMywgMywgMywgMywgMywgMywKKyAgICAgIC8qIDEzLTIwICovIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgICAvKiAyMS0zMCAqLyA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICAgICAgLyogICAgMzEgKi8gNgorICAgIH07CisgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLCByZXN1bHRzWyAoaXNTaW5nbGVXb3JkKCkgPyBWQUwgOiBwVmFsWzBdKSBdKTsKKyAgfQorCisgIC8vIElmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZhbHVlIGZpdHMgaW4gbGVzcyB0aGFuIDUyIGJpdHMgKHRoZSBwcmVjaXNpb24gb2YKKyAgLy8gYW4gSUVFRSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlKSwgdGhlbiB3ZSBjYW4gdXNlIHRoZQorICAvLyBsaWJjIHNxcnQgZnVuY3Rpb24gd2hpY2ggd2lsbCBwcm9iYWJseSB1c2UgYSBoYXJkd2FyZSBzcXJ0IGNvbXB1dGF0aW9uLgorICAvLyBUaGlzIHNob3VsZCBiZSBmYXN0ZXIgdGhhbiB0aGUgYWxnb3JpdGhtIGJlbG93LgorICBpZiAobWFnbml0dWRlIDwgNTIpIHsKKyNpZiBIQVZFX1JPVU5ECisgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICB1aW50NjRfdCg6OnJvdW5kKDo6c3FydChkb3VibGUoaXNTaW5nbGVXb3JkKCk/VkFMOnBWYWxbMF0pKSkpKTsKKyNlbHNlCisgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICB1aW50NjRfdCg6OnNxcnQoZG91YmxlKGlzU2luZ2xlV29yZCgpP1ZBTDpwVmFsWzBdKSkpICsgMC41KTsKKyNlbmRpZgorICB9CisKKyAgLy8gT2theSwgYWxsIHRoZSBzaG9ydCBjdXRzIGFyZSBleGhhdXN0ZWQuIFdlIG11c3QgY29tcHV0ZSBpdC4gVGhlIGZvbGxvd2luZworICAvLyBpcyBhIGNsYXNzaWNhbCBCYWJ5bG9uaWFuIG1ldGhvZCBmb3IgY29tcHV0aW5nIHRoZSBzcXVhcmUgcm9vdC4gVGhpcyBjb2RlCisgIC8vIHdhcyBhZGFwdGVkIHRvIEFQSU50IGZyb20gYSB3aWtpcGVkaWEgYXJ0aWNsZSBvbiBzdWNoIGNvbXB1dGF0aW9ucy4KKyAgLy8gU2VlIGh0dHA6Ly93d3cud2lraXBlZGlhLm9yZy8gYW5kIGdvIHRvIHRoZSBwYWdlIG5hbWVkCisgIC8vIENhbGN1bGF0ZV9hbl9pbnRlZ2VyX3NxdWFyZV9yb290LgorICB1bnNpZ25lZCBuYml0cyA9IEJpdFdpZHRoLCBpID0gNDsKKyAgQVBJbnQgdGVzdHkoQml0V2lkdGgsIDE2KTsKKyAgQVBJbnQgeF9vbGQoQml0V2lkdGgsIDEpOworICBBUEludCB4X25ldyhCaXRXaWR0aCwgMCk7CisgIEFQSW50IHR3byhCaXRXaWR0aCwgMik7CisKKyAgLy8gU2VsZWN0IGEgZ29vZCBzdGFydGluZyB2YWx1ZSB1c2luZyBiaW5hcnkgbG9nYXJpdGhtcy4KKyAgZm9yICg7OyBpICs9IDIsIHRlc3R5ID0gdGVzdHkuc2hsKDIpKQorICAgIGlmIChpID49IG5iaXRzIHx8IHRoaXMtPnVsZSh0ZXN0eSkpIHsKKyAgICAgIHhfb2xkID0geF9vbGQuc2hsKGkgLyAyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvLyBVc2UgdGhlIEJhYnlsb25pYW4gbWV0aG9kIHRvIGFycml2ZSBhdCB0aGUgaW50ZWdlciBzcXVhcmUgcm9vdDoKKyAgZm9yICg7OykgeworICAgIHhfbmV3ID0gKHRoaXMtPnVkaXYoeF9vbGQpICsgeF9vbGQpLnVkaXYodHdvKTsKKyAgICBpZiAoeF9vbGQudWxlKHhfbmV3KSkKKyAgICAgIGJyZWFrOworICAgIHhfb2xkID0geF9uZXc7CisgIH0KKworICAvLyBNYWtlIHN1cmUgd2UgcmV0dXJuIHRoZSBjbG9zZXN0IGFwcHJveGltYXRpb24KKyAgLy8gTk9URTogVGhlIHJvdW5kaW5nIGNhbGN1bGF0aW9uIGJlbG93IGlzIGNvcnJlY3QuIEl0IHdpbGwgcHJvZHVjZSBhbgorICAvLyBvZmYtYnktb25lIGRpc2NyZXBhbmN5IHdpdGggcmVzdWx0cyBmcm9tIHBhcmkvZ3AuIFRoYXQgZGlzY3JlcGFuY3kgaGFzIGJlZW4KKyAgLy8gZGV0ZXJtaW5lZCB0byBiZSBhIHJvdW5kaW5nIGlzc3VlIHdpdGggcGFyaS9ncCBhcyBpdCBiZWdpbnMgdG8gdXNlIGEKKyAgLy8gZmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb24gYWZ0ZXIgMTkyIGJpdHMuIFRoZXJlIGFyZSBubyBkaXNjcmVwYW5jaWVzCisgIC8vIGJldHdlZW4gdGhpcyBhbGdvcml0aG0gYW5kIHBhcmkvZ3AgZm9yIGJpdCB3aWR0aHMgPCAxOTIgYml0cy4KKyAgQVBJbnQgc3F1YXJlKHhfb2xkICogeF9vbGQpOworICBBUEludCBuZXh0U3F1YXJlKCh4X29sZCArIDEpICogKHhfb2xkICsxKSk7CisgIGlmICh0aGlzLT51bHQoc3F1YXJlKSkKKyAgICByZXR1cm4geF9vbGQ7CisgIGVsc2UgaWYgKHRoaXMtPnVsZShuZXh0U3F1YXJlKSkgeworICAgIEFQSW50IG1pZHBvaW50KChuZXh0U3F1YXJlIC0gc3F1YXJlKS51ZGl2KHR3bykpOworICAgIEFQSW50IG9mZnNldCgqdGhpcyAtIHNxdWFyZSk7CisgICAgaWYgKG9mZnNldC51bHQobWlkcG9pbnQpKQorICAgICAgcmV0dXJuIHhfb2xkOworICAgIGVsc2UKKyAgICAgIHJldHVybiB4X29sZCArIDE7CisgIH0gZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkVycm9yIGluIEFQSW50OjpzcXJ0IGNvbXB1dGF0aW9uIik7CisgIHJldHVybiB4X29sZCArIDE7Cit9CisKKy8vLyBDb21wdXRlcyB0aGUgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBvZiB0aGlzIEFQSW50IGZvciBhIGdpdmVuIG1vZHVsby4gVGhlCisvLy8gaXRlcmF0aXZlIGV4dGVuZGVkIEV1Y2xpZGVhbiBhbGdvcml0aG0gaXMgdXNlZCB0byBzb2x2ZSBmb3IgdGhpcyB2YWx1ZSwKKy8vLyBob3dldmVyIHdlIHNpbXBsaWZ5IGl0IHRvIHNwZWVkIHVwIGNhbGN1bGF0aW5nIG9ubHkgdGhlIGludmVyc2UsIGFuZCB0YWtlCisvLy8gYWR2YW50YWdlIG9mIGRpdityZW0gY2FsY3VsYXRpb25zLiBXZSBhbHNvIHVzZSBzb21lIHRyaWNrcyB0byBhdm9pZCBjb3B5aW5nCisvLy8gKHBvdGVudGlhbGx5IGxhcmdlKSBBUEludHMgYXJvdW5kLgorQVBJbnQgQVBJbnQ6Om11bHRpcGxpY2F0aXZlSW52ZXJzZShjb25zdCBBUEludCYgbW9kdWxvKSBjb25zdCB7CisgIGFzc2VydCh1bHQobW9kdWxvKSAmJiAiVGhpcyBBUEludCBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aGUgbW9kdWxvIik7CisKKyAgLy8gVXNpbmcgdGhlIHByb3BlcnRpZXMgbGlzdGVkIGF0IHRoZSBmb2xsb3dpbmcgd2ViIHBhZ2UgKGFjY2Vzc2VkIDA2LzIxLzA4KToKKyAgLy8gICBodHRwOi8vd3d3Lm51bWJlcnRoZW9yeS5vcmcvcGhwL2V1Y2xpZC5odG1sCisgIC8vIChlc3BlY2lhbGx5IHRoZSBwcm9wZXJ0aWVzIG51bWJlcmVkIDMsIDQgYW5kIDkpIGl0IGNhbiBiZSBwcm92ZWQgdGhhdAorICAvLyBCaXRXaWR0aCBiaXRzIHN1ZmZpY2UgZm9yIGFsbCB0aGUgY29tcHV0YXRpb25zIGluIHRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQKKyAgLy8gYmVsb3cuIE1vcmUgcHJlY2lzZWx5LCB0aGlzIG51bWJlciBvZiBiaXRzIHN1ZmZpY2UgaWYgdGhlIG11bHRpcGxpY2F0aXZlCisgIC8vIGludmVyc2UgZXhpc3RzLCBidXQgbWF5IG5vdCBzdWZmaWNlIGZvciB0aGUgZ2VuZXJhbCBleHRlbmRlZCBFdWNsaWRlYW4KKyAgLy8gYWxnb3JpdGhtLgorCisgIEFQSW50IHJbMl0gPSB7IG1vZHVsbywgKnRoaXMgfTsKKyAgQVBJbnQgdFsyXSA9IHsgQVBJbnQoQml0V2lkdGgsIDApLCBBUEludChCaXRXaWR0aCwgMSkgfTsKKyAgQVBJbnQgcShCaXRXaWR0aCwgMCk7CisKKyAgdW5zaWduZWQgaTsKKyAgZm9yIChpID0gMDsgcltpXjFdICE9IDA7IGkgXj0gMSkgeworICAgIC8vIEFuIG92ZXJ2aWV3IG9mIHRoZSBtYXRoIHdpdGhvdXQgdGhlIGNvbmZ1c2luZyBiaXQtZmxpcHBpbmc6CisgICAgLy8gcSA9IHJbaS0yXSAvIHJbaS0xXQorICAgIC8vIHJbaV0gPSByW2ktMl0gJSByW2ktMV0KKyAgICAvLyB0W2ldID0gdFtpLTJdIC0gdFtpLTFdICogcQorICAgIHVkaXZyZW0ocltpXSwgcltpXjFdLCBxLCByW2ldKTsKKyAgICB0W2ldIC09IHRbaV4xXSAqIHE7CisgIH0KKworICAvLyBJZiB0aGlzIEFQSW50IGFuZCB0aGUgbW9kdWxvIGFyZSBub3QgY29wcmltZSwgdGhlcmUgaXMgbm8gbXVsdGlwbGljYXRpdmUKKyAgLy8gaW52ZXJzZSwgc28gcmV0dXJuIDAuIFdlIGNoZWNrIHRoaXMgYnkgbG9va2luZyBhdCB0aGUgbmV4dC10by1sYXN0CisgIC8vIHJlbWFpbmRlciwgd2hpY2ggaXMgdGhlIGdjZCgqdGhpcyxtb2R1bG8pIGFzIGNhbGN1bGF0ZWQgYnkgdGhlIEV1Y2xpZGVhbgorICAvLyBhbGdvcml0aG0uCisgIGlmIChyW2ldICE9IDEpCisgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLCAwKTsKKworICAvLyBUaGUgbmV4dC10by1sYXN0IHQgaXMgdGhlIG11bHRpcGxpY2F0aXZlIGludmVyc2UuICBIb3dldmVyLCB3ZSBhcmUKKyAgLy8gaW50ZXJlc3RlZCBpbiBhIHBvc2l0aXZlIGludmVyc2UuIENhbGN1YXRlIGEgcG9zaXRpdmUgb25lIGZyb20gYSBuZWdhdGl2ZQorICAvLyBvbmUgaWYgbmVjZXNzYXJ5LiBBIHNpbXBsZSBhZGRpdGlvbiBvZiB0aGUgbW9kdWxvIHN1ZmZpY2VzIGJlY2F1c2UKKyAgLy8gYWJzKHRbaV0pIGlzIGtub3duIHRvIGJlIGxlc3MgdGhhbiAqdGhpcy8yIChzZWUgdGhlIGxpbmsgYWJvdmUpLgorICByZXR1cm4gdFtpXS5pc05lZ2F0aXZlKCkgPyB0W2ldICsgbW9kdWxvIDogdFtpXTsKK30KKworLy8vIENhbGN1bGF0ZSB0aGUgbWFnaWMgbnVtYmVycyByZXF1aXJlZCB0byBpbXBsZW1lbnQgYSBzaWduZWQgaW50ZWdlciBkaXZpc2lvbgorLy8vIGJ5IGEgY29uc3RhbnQgYXMgYSBzZXF1ZW5jZSBvZiBtdWx0aXBsaWVzLCBhZGRzIGFuZCBzaGlmdHMuICBSZXF1aXJlcyB0aGF0CisvLy8gdGhlIGRpdmlzb3Igbm90IGJlIDAsIDEsIG9yIC0xLiAgVGFrZW4gZnJvbSAiSGFja2VyJ3MgRGVsaWdodCIsIEhlbnJ5IFMuCisvLy8gV2FycmVuLCBKci4sIGNoYXB0ZXIgMTAuCitBUEludDo6bXMgQVBJbnQ6Om1hZ2ljKCkgY29uc3QgeworICBjb25zdCBBUEludCYgZCA9ICp0aGlzOworICB1bnNpZ25lZCBwOworICBBUEludCBhZCwgYW5jLCBkZWx0YSwgcTEsIHIxLCBxMiwgcjIsIHQ7CisgIEFQSW50IHNpZ25lZE1pbiA9IEFQSW50OjpnZXRTaWduZWRNaW5WYWx1ZShkLmdldEJpdFdpZHRoKCkpOworICBzdHJ1Y3QgbXMgbWFnOworCisgIGFkID0gZC5hYnMoKTsKKyAgdCA9IHNpZ25lZE1pbiArIChkLmxzaHIoZC5nZXRCaXRXaWR0aCgpIC0gMSkpOworICBhbmMgPSB0IC0gMSAtIHQudXJlbShhZCk7ICAgLy8gYWJzb2x1dGUgdmFsdWUgb2YgbmMKKyAgcCA9IGQuZ2V0Qml0V2lkdGgoKSAtIDE7ICAgIC8vIGluaXRpYWxpemUgcAorICBxMSA9IHNpZ25lZE1pbi51ZGl2KGFuYyk7ICAgLy8gaW5pdGlhbGl6ZSBxMSA9IDJwL2FicyhuYykKKyAgcjEgPSBzaWduZWRNaW4gLSBxMSphbmM7ICAgIC8vIGluaXRpYWxpemUgcjEgPSByZW0oMnAsYWJzKG5jKSkKKyAgcTIgPSBzaWduZWRNaW4udWRpdihhZCk7ICAgIC8vIGluaXRpYWxpemUgcTIgPSAycC9hYnMoZCkKKyAgcjIgPSBzaWduZWRNaW4gLSBxMiphZDsgICAgIC8vIGluaXRpYWxpemUgcjIgPSByZW0oMnAsYWJzKGQpKQorICBkbyB7CisgICAgcCA9IHAgKyAxOworICAgIHExID0gcTE8PDE7ICAgICAgICAgIC8vIHVwZGF0ZSBxMSA9IDJwL2FicyhuYykKKyAgICByMSA9IHIxPDwxOyAgICAgICAgICAvLyB1cGRhdGUgcjEgPSByZW0oMnAvYWJzKG5jKSkKKyAgICBpZiAocjEudWdlKGFuYykpIHsgIC8vIG11c3QgYmUgdW5zaWduZWQgY29tcGFyaXNvbgorICAgICAgcTEgPSBxMSArIDE7CisgICAgICByMSA9IHIxIC0gYW5jOworICAgIH0KKyAgICBxMiA9IHEyPDwxOyAgICAgICAgICAvLyB1cGRhdGUgcTIgPSAycC9hYnMoZCkKKyAgICByMiA9IHIyPDwxOyAgICAgICAgICAvLyB1cGRhdGUgcjIgPSByZW0oMnAvYWJzKGQpKQorICAgIGlmIChyMi51Z2UoYWQpKSB7ICAgLy8gbXVzdCBiZSB1bnNpZ25lZCBjb21wYXJpc29uCisgICAgICBxMiA9IHEyICsgMTsKKyAgICAgIHIyID0gcjIgLSBhZDsKKyAgICB9CisgICAgZGVsdGEgPSBhZCAtIHIyOworICB9IHdoaWxlIChxMS51bGUoZGVsdGEpIHx8IChxMSA9PSBkZWx0YSAmJiByMSA9PSAwKSk7CisKKyAgbWFnLm0gPSBxMiArIDE7CisgIGlmIChkLmlzTmVnYXRpdmUoKSkgbWFnLm0gPSAtbWFnLm07ICAgLy8gcmVzdWx0aW5nIG1hZ2ljIG51bWJlcgorICBtYWcucyA9IHAgLSBkLmdldEJpdFdpZHRoKCk7ICAgICAgICAgIC8vIHJlc3VsdGluZyBzaGlmdAorICByZXR1cm4gbWFnOworfQorCisvLy8gQ2FsY3VsYXRlIHRoZSBtYWdpYyBudW1iZXJzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBhbiB1bnNpZ25lZCBpbnRlZ2VyCisvLy8gZGl2aXNpb24gYnkgYSBjb25zdGFudCBhcyBhIHNlcXVlbmNlIG9mIG11bHRpcGxpZXMsIGFkZHMgYW5kIHNoaWZ0cy4KKy8vLyBSZXF1aXJlcyB0aGF0IHRoZSBkaXZpc29yIG5vdCBiZSAwLiAgVGFrZW4gZnJvbSAiSGFja2VyJ3MgRGVsaWdodCIsIEhlbnJ5CisvLy8gUy4gV2FycmVuLCBKci4sIGNoYXB0ZXIgMTAuCitBUEludDo6bXUgQVBJbnQ6Om1hZ2ljdSgpIGNvbnN0IHsKKyAgY29uc3QgQVBJbnQmIGQgPSAqdGhpczsKKyAgdW5zaWduZWQgcDsKKyAgQVBJbnQgbmMsIGRlbHRhLCBxMSwgcjEsIHEyLCByMjsKKyAgc3RydWN0IG11IG1hZ3U7CisgIG1hZ3UuYSA9IDA7ICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSAiYWRkIiBpbmRpY2F0b3IKKyAgQVBJbnQgYWxsT25lcyA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoZC5nZXRCaXRXaWR0aCgpKTsKKyAgQVBJbnQgc2lnbmVkTWluID0gQVBJbnQ6OmdldFNpZ25lZE1pblZhbHVlKGQuZ2V0Qml0V2lkdGgoKSk7CisgIEFQSW50IHNpZ25lZE1heCA9IEFQSW50OjpnZXRTaWduZWRNYXhWYWx1ZShkLmdldEJpdFdpZHRoKCkpOworCisgIG5jID0gYWxsT25lcyAtICgtZCkudXJlbShkKTsKKyAgcCA9IGQuZ2V0Qml0V2lkdGgoKSAtIDE7ICAvLyBpbml0aWFsaXplIHAKKyAgcTEgPSBzaWduZWRNaW4udWRpdihuYyk7ICAvLyBpbml0aWFsaXplIHExID0gMnAvbmMKKyAgcjEgPSBzaWduZWRNaW4gLSBxMSpuYzsgICAvLyBpbml0aWFsaXplIHIxID0gcmVtKDJwLG5jKQorICBxMiA9IHNpZ25lZE1heC51ZGl2KGQpOyAgIC8vIGluaXRpYWxpemUgcTIgPSAoMnAtMSkvZAorICByMiA9IHNpZ25lZE1heCAtIHEyKmQ7ICAgIC8vIGluaXRpYWxpemUgcjIgPSByZW0oKDJwLTEpLGQpCisgIGRvIHsKKyAgICBwID0gcCArIDE7CisgICAgaWYgKHIxLnVnZShuYyAtIHIxKSkgeworICAgICAgcTEgPSBxMSArIHExICsgMTsgIC8vIHVwZGF0ZSBxMQorICAgICAgcjEgPSByMSArIHIxIC0gbmM7IC8vIHVwZGF0ZSByMQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHExID0gcTErcTE7IC8vIHVwZGF0ZSBxMQorICAgICAgcjEgPSByMStyMTsgLy8gdXBkYXRlIHIxCisgICAgfQorICAgIGlmICgocjIgKyAxKS51Z2UoZCAtIHIyKSkgeworICAgICAgaWYgKHEyLnVnZShzaWduZWRNYXgpKSBtYWd1LmEgPSAxOworICAgICAgcTIgPSBxMitxMiArIDE7ICAgICAvLyB1cGRhdGUgcTIKKyAgICAgIHIyID0gcjIrcjIgKyAxIC0gZDsgLy8gdXBkYXRlIHIyCisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKHEyLnVnZShzaWduZWRNaW4pKSBtYWd1LmEgPSAxOworICAgICAgcTIgPSBxMitxMjsgICAgIC8vIHVwZGF0ZSBxMgorICAgICAgcjIgPSByMityMiArIDE7IC8vIHVwZGF0ZSByMgorICAgIH0KKyAgICBkZWx0YSA9IGQgLSAxIC0gcjI7CisgIH0gd2hpbGUgKHAgPCBkLmdldEJpdFdpZHRoKCkqMiAmJgorICAgICAgICAgICAocTEudWx0KGRlbHRhKSB8fCAocTEgPT0gZGVsdGEgJiYgcjEgPT0gMCkpKTsKKyAgbWFndS5tID0gcTIgKyAxOyAvLyByZXN1bHRpbmcgbWFnaWMgbnVtYmVyCisgIG1hZ3UucyA9IHAgLSBkLmdldEJpdFdpZHRoKCk7ICAvLyByZXN1bHRpbmcgc2hpZnQKKyAgcmV0dXJuIG1hZ3U7Cit9CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBLbnV0aCdzIEFsZ29yaXRobSBEIChEaXZpc2lvbiBvZiBub25uZWdhdGl2ZSBpbnRlZ2VycykKKy8vLyBmcm9tICJBcnQgb2YgQ29tcHV0ZXIgUHJvZ3JhbW1pbmcsIFZvbHVtZSAyIiwgc2VjdGlvbiA0LjMuMSwgcC4gMjcyLiBUaGUKKy8vLyB2YXJpYWJsZXMgaGVyZSBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIGluIHRoZSBhbGdvcml0aG0uIENvbW1lbnRzIGV4cGxhaW4KKy8vLyB0aGUgYWxnb3JpdGhtIGFuZCBhbnkgZGV2aWF0aW9uIGZyb20gaXQuCitzdGF0aWMgdm9pZCBLbnV0aERpdih1bnNpZ25lZCAqdSwgdW5zaWduZWQgKnYsIHVuc2lnbmVkICpxLCB1bnNpZ25lZCogciwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG0sIHVuc2lnbmVkIG4pIHsKKyAgYXNzZXJ0KHUgJiYgIk11c3QgcHJvdmlkZSBkaXZpZGVuZCIpOworICBhc3NlcnQodiAmJiAiTXVzdCBwcm92aWRlIGRpdmlzb3IiKTsKKyAgYXNzZXJ0KHEgJiYgIk11c3QgcHJvdmlkZSBxdW90aWVudCIpOworICBhc3NlcnQodSAhPSB2ICYmIHUgIT0gcSAmJiB2ICE9IHEgJiYgIk11c3QgdXMgZGlmZmVyZW50IG1lbW9yeSIpOworICBhc3NlcnQobj4xICYmICJuIG11c3QgYmUgPiAxIik7CisKKyAgLy8gS251dGggdXNlcyB0aGUgdmFsdWUgYiBhcyB0aGUgYmFzZSBvZiB0aGUgbnVtYmVyIHN5c3RlbS4gSW4gb3VyIGNhc2UgYgorICAvLyBpcyAyXjMxIHNvIHdlIGp1c3Qgc2V0IGl0IHRvIC0xdS4KKyAgdWludDY0X3QgYiA9IHVpbnQ2NF90KDEpIDw8IDMyOworCisjaWYgMAorICBERUJVRyhkYmdzKCkgPDwgIktudXRoRGl2OiBtPSIgPDwgbSA8PCAiIG49IiA8PCBuIDw8ICdcbicpOworICBERUJVRyhkYmdzKCkgPDwgIktudXRoRGl2OiBvcmlnaW5hbDoiKTsKKyAgREVCVUcoZm9yIChpbnQgaSA9IG0rbjsgaSA+PTA7IGktLSkgZGJncygpIDw8ICIgIiA8PCB1W2ldKTsKKyAgREVCVUcoZGJncygpIDw8ICIgYnkiKTsKKyAgREVCVUcoZm9yIChpbnQgaSA9IG47IGkgPjA7IGktLSkgZGJncygpIDw8ICIgIiA8PCB2W2ktMV0pOworICBERUJVRyhkYmdzKCkgPDwgJ1xuJyk7CisjZW5kaWYKKyAgLy8gRDEuIFtOb3JtYWxpemUuXSBTZXQgZCA9IGIgLyAodltuLTFdICsgMSkgYW5kIG11bHRpcGx5IGFsbCB0aGUgZGlnaXRzIG9mCisgIC8vIHUgYW5kIHYgYnkgZC4gTm90ZSB0aGF0IHdlIGhhdmUgdGFrZW4gS251dGgncyBhZHZpY2UgaGVyZSB0byB1c2UgYSBwb3dlcgorICAvLyBvZiAyIHZhbHVlIGZvciBkIHN1Y2ggdGhhdCBkICogdltuLTFdID49IGIvMiAoYiBpcyB0aGUgYmFzZSkuIEEgcG93ZXIgb2YKKyAgLy8gMiBhbGxvd3MgdXMgdG8gc2hpZnQgaW5zdGVhZCBvZiBtdWx0aXBseSBhbmQgaXQgaXMgZWFzeSB0byBkZXRlcm1pbmUgdGhlCisgIC8vIHNoaWZ0IGFtb3VudCBmcm9tIHRoZSBsZWFkaW5nIHplcm9zLiAgV2UgYXJlIGJhc2ljYWxseSBub3JtYWxpemluZyB0aGUgdQorICAvLyBhbmQgdiBzbyB0aGF0IGl0cyBoaWdoIGJpdHMgYXJlIHNoaWZ0ZWQgdG8gdGhlIHRvcCBvZiB2J3MgcmFuZ2Ugd2l0aG91dAorICAvLyBvdmVyZmxvdy4gTm90ZSB0aGF0IHRoaXMgY2FuIHJlcXVpcmUgYW4gZXh0cmEgd29yZCBpbiB1IHNvIHRoYXQgdSBtdXN0CisgIC8vIGJlIG9mIGxlbmd0aCBtK24rMS4KKyAgdW5zaWduZWQgc2hpZnQgPSBDb3VudExlYWRpbmdaZXJvc18zMih2W24tMV0pOworICB1bnNpZ25lZCB2X2NhcnJ5ID0gMDsKKyAgdW5zaWduZWQgdV9jYXJyeSA9IDA7CisgIGlmIChzaGlmdCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtK247ICsraSkgeworICAgICAgdW5zaWduZWQgdV90bXAgPSB1W2ldID4+ICgzMiAtIHNoaWZ0KTsKKyAgICAgIHVbaV0gPSAodVtpXSA8PCBzaGlmdCkgfCB1X2NhcnJ5OworICAgICAgdV9jYXJyeSA9IHVfdG1wOworICAgIH0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICB1bnNpZ25lZCB2X3RtcCA9IHZbaV0gPj4gKDMyIC0gc2hpZnQpOworICAgICAgdltpXSA9ICh2W2ldIDw8IHNoaWZ0KSB8IHZfY2Fycnk7CisgICAgICB2X2NhcnJ5ID0gdl90bXA7CisgICAgfQorICB9CisgIHVbbStuXSA9IHVfY2Fycnk7CisjaWYgMAorICBERUJVRyhkYmdzKCkgPDwgIktudXRoRGl2OiAgIG5vcm1hbDoiKTsKKyAgREVCVUcoZm9yIChpbnQgaSA9IG0rbjsgaSA+PTA7IGktLSkgZGJncygpIDw8ICIgIiA8PCB1W2ldKTsKKyAgREVCVUcoZGJncygpIDw8ICIgYnkiKTsKKyAgREVCVUcoZm9yIChpbnQgaSA9IG47IGkgPjA7IGktLSkgZGJncygpIDw8ICIgIiA8PCB2W2ktMV0pOworICBERUJVRyhkYmdzKCkgPDwgJ1xuJyk7CisjZW5kaWYKKworICAvLyBEMi4gW0luaXRpYWxpemUgai5dICBTZXQgaiB0byBtLiBUaGlzIGlzIHRoZSBsb29wIGNvdW50ZXIgb3ZlciB0aGUgcGxhY2VzLgorICBpbnQgaiA9IG07CisgIGRvIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIktudXRoRGl2OiBxdW90aWVudCBkaWdpdCAjIiA8PCBqIDw8ICdcbicpOworICAgIC8vIEQzLiBbQ2FsY3VsYXRlIHEnLl0uCisgICAgLy8gICAgIFNldCBxcCA9ICh1W2orbl0qYiArIHVbaituLTFdKSAvIHZbbi0xXS4gKHFwPXFwcmltZT1xJykKKyAgICAvLyAgICAgU2V0IHJwID0gKHVbaituXSpiICsgdVtqK24tMV0pICUgdltuLTFdLiAocnA9cnByaW1lPXInKQorICAgIC8vIE5vdyB0ZXN0IGlmIHFwID09IGIgb3IgcXAqdltuLTJdID4gYipycCArIHVbaituLTJdOyBpZiBzbywgZGVjcmVhc2UKKyAgICAvLyBxcCBieSAxLCBpbnJlYXNlIHJwIGJ5IHZbbi0xXSwgYW5kIHJlcGVhdCB0aGlzIHRlc3QgaWYgcnAgPCBiLiBUaGUgdGVzdAorICAgIC8vIG9uIHZbbi0yXSBkZXRlcm1pbmVzIGF0IGhpZ2ggc3BlZWQgbW9zdCBvZiB0aGUgY2FzZXMgaW4gd2hpY2ggdGhlIHRyaWFsCisgICAgLy8gdmFsdWUgcXAgaXMgb25lIHRvbyBsYXJnZSwgYW5kIGl0IGVsaW1pbmF0ZXMgYWxsIGNhc2VzIHdoZXJlIHFwIGlzIHR3bworICAgIC8vIHRvbyBsYXJnZS4KKyAgICB1aW50NjRfdCBkaXZpZGVuZCA9ICgodWludDY0X3QodVtqK25dKSA8PCAzMikgKyB1W2orbi0xXSk7CisgICAgREVCVUcoZGJncygpIDw8ICJLbnV0aERpdjogZGl2aWRlbmQgPT0gIiA8PCBkaXZpZGVuZCA8PCAnXG4nKTsKKyAgICB1aW50NjRfdCBxcCA9IGRpdmlkZW5kIC8gdltuLTFdOworICAgIHVpbnQ2NF90IHJwID0gZGl2aWRlbmQgJSB2W24tMV07CisgICAgaWYgKHFwID09IGIgfHwgcXAqdltuLTJdID4gYipycCArIHVbaituLTJdKSB7CisgICAgICBxcC0tOworICAgICAgcnAgKz0gdltuLTFdOworICAgICAgaWYgKHJwIDwgYiAmJiAocXAgPT0gYiB8fCBxcCp2W24tMl0gPiBiKnJwICsgdVtqK24tMl0pKQorICAgICAgICBxcC0tOworICAgIH0KKyAgICBERUJVRyhkYmdzKCkgPDwgIktudXRoRGl2OiBxcCA9PSAiIDw8IHFwIDw8ICIsIHJwID09ICIgPDwgcnAgPDwgJ1xuJyk7CisKKyAgICAvLyBENC4gW011bHRpcGx5IGFuZCBzdWJ0cmFjdC5dIFJlcGxhY2UgKHVbaituXXVbaituLTFdLi4udVtqXSkgd2l0aAorICAgIC8vICh1W2orbl11W2orbi0xXS4udVtqXSkgLSBxcCAqICh2W24tMV0uLi52WzFddlswXSkuIFRoaXMgY29tcHV0YXRpb24KKyAgICAvLyBjb25zaXN0cyBvZiBhIHNpbXBsZSBtdWx0aXBsaWNhdGlvbiBieSBhIG9uZS1wbGFjZSBudW1iZXIsIGNvbWJpbmVkIHdpdGgKKyAgICAvLyBhIHN1YnRyYWN0aW9uLgorICAgIGJvb2wgaXNOZWcgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICB1aW50NjRfdCB1X3RtcCA9IHVpbnQ2NF90KHVbaitpXSkgfCAodWludDY0X3QodVtqK2krMV0pIDw8IDMyKTsKKyAgICAgIHVpbnQ2NF90IHN1YnRyYWhlbmQgPSB1aW50NjRfdChxcCkgKiB1aW50NjRfdCh2W2ldKTsKKyAgICAgIGJvb2wgYm9ycm93ID0gc3VidHJhaGVuZCA+IHVfdG1wOworICAgICAgREVCVUcoZGJncygpIDw8ICJLbnV0aERpdjogdV90bXAgPT0gIiA8PCB1X3RtcAorICAgICAgICAgICAgICAgICAgIDw8ICIsIHN1YnRyYWhlbmQgPT0gIiA8PCBzdWJ0cmFoZW5kCisgICAgICAgICAgICAgICAgICAgPDwgIiwgYm9ycm93ID0gIiA8PCBib3Jyb3cgPDwgJ1xuJyk7CisKKyAgICAgIHVpbnQ2NF90IHJlc3VsdCA9IHVfdG1wIC0gc3VidHJhaGVuZDsKKyAgICAgIHVuc2lnbmVkIGsgPSBqICsgaTsKKyAgICAgIHVbaysrXSA9ICh1bnNpZ25lZCkocmVzdWx0ICYgKGItMSkpOyAvLyBzdWJ0cmFjdCBsb3cgd29yZAorICAgICAgdVtrKytdID0gKHVuc2lnbmVkKShyZXN1bHQgPj4gMzIpOyAgIC8vIHN1YnRyYWN0IGhpZ2ggd29yZAorICAgICAgd2hpbGUgKGJvcnJvdyAmJiBrIDw9IG0rbikgeyAvLyBkZWFsIHdpdGggYm9ycm93IHRvIHRoZSBsZWZ0CisgICAgICAgIGJvcnJvdyA9IHVba10gPT0gMDsKKyAgICAgICAgdVtrXS0tOworICAgICAgICBrKys7CisgICAgICB9CisgICAgICBpc05lZyB8PSBib3Jyb3c7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIktudXRoRGl2OiB1W2oraV0gPT0gIiA8PCB1W2oraV0gPDwgIiwgIHVbaitpKzFdID09ICIgPDwKKyAgICAgICAgICAgICAgICAgICAgdVtqK2krMV0gPDwgJ1xuJyk7CisgICAgfQorICAgIERFQlVHKGRiZ3MoKSA8PCAiS251dGhEaXY6IGFmdGVyIHN1YnRyYWN0aW9uOiIpOworICAgIERFQlVHKGZvciAoaW50IGkgPSBtK247IGkgPj0wOyBpLS0pIGRiZ3MoKSA8PCAiICIgPDwgdVtpXSk7CisgICAgREVCVUcoZGJncygpIDw8ICdcbicpOworICAgIC8vIFRoZSBkaWdpdHMgKHVbaituXS4uLnVbal0pIHNob3VsZCBiZSBrZXB0IHBvc2l0aXZlOyBpZiB0aGUgcmVzdWx0IG9mCisgICAgLy8gdGhpcyBzdGVwIGlzIGFjdHVhbGx5IG5lZ2F0aXZlLCAodVtqK25dLi4udVtqXSkgc2hvdWxkIGJlIGxlZnQgYXMgdGhlCisgICAgLy8gdHJ1ZSB2YWx1ZSBwbHVzIGIqKihuKzEpLCBuYW1lbHkgYXMgdGhlIGIncyBjb21wbGVtZW50IG9mCisgICAgLy8gdGhlIHRydWUgdmFsdWUsIGFuZCBhICJib3Jyb3ciIHRvIHRoZSBsZWZ0IHNob3VsZCBiZSByZW1lbWJlcmVkLgorICAgIC8vCisgICAgaWYgKGlzTmVnKSB7CisgICAgICBib29sIGNhcnJ5ID0gdHJ1ZTsgIC8vIHRydWUgYmVjYXVzZSBiJ3MgY29tcGxlbWVudCBpcyAiY29tcGxlbWVudCArIDEiCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDw9IG0rbjsgKytpKSB7CisgICAgICAgIHVbaV0gPSB+dVtpXSArIGNhcnJ5OyAvLyBiJ3MgY29tcGxlbWVudAorICAgICAgICBjYXJyeSA9IGNhcnJ5ICYmIHVbaV0gPT0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgREVCVUcoZGJncygpIDw8ICJLbnV0aERpdjogYWZ0ZXIgY29tcGxlbWVudDoiKTsKKyAgICBERUJVRyhmb3IgKGludCBpID0gbStuOyBpID49MDsgaS0tKSBkYmdzKCkgPDwgIiAiIDw8IHVbaV0pOworICAgIERFQlVHKGRiZ3MoKSA8PCAnXG4nKTsKKworICAgIC8vIEQ1LiBbVGVzdCByZW1haW5kZXIuXSBTZXQgcVtqXSA9IHFwLiBJZiB0aGUgcmVzdWx0IG9mIHN0ZXAgRDQgd2FzCisgICAgLy8gbmVnYXRpdmUsIGdvIHRvIHN0ZXAgRDY7IG90aGVyd2lzZSBnbyBvbiB0byBzdGVwIEQ3LgorICAgIHFbal0gPSAodW5zaWduZWQpcXA7CisgICAgaWYgKGlzTmVnKSB7CisgICAgICAvLyBENi4gW0FkZCBiYWNrXS4gVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhpcyBzdGVwIGlzIG5lY2Vzc2FyeSBpcyB2ZXJ5CisgICAgICAvLyBzbWFsbCwgb24gdGhlIG9yZGVyIG9mIG9ubHkgMi9iLiBNYWtlIHN1cmUgdGhhdCB0ZXN0IGRhdGEgYWNjb3VudHMgZm9yCisgICAgICAvLyB0aGlzIHBvc3NpYmlsaXR5LiBEZWNyZWFzZSBxW2pdIGJ5IDEKKyAgICAgIHFbal0tLTsKKyAgICAgIC8vIGFuZCBhZGQgKDB2W24tMV0uLi52WzFddlswXSkgdG8gKHVbaituXXVbaituLTFdLi4udVtqKzFddVtqXSkuCisgICAgICAvLyBBIGNhcnJ5IHdpbGwgb2NjdXIgdG8gdGhlIGxlZnQgb2YgdVtqK25dLCBhbmQgaXQgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgIC8vIHNpbmNlIGl0IGNhbmNlbHMgd2l0aCB0aGUgYm9ycm93IHRoYXQgb2NjdXJyZWQgaW4gRDQuCisgICAgICBib29sIGNhcnJ5ID0gZmFsc2U7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGxpbWl0ID0gc3RkOjptaW4odVtqK2ldLHZbaV0pOworICAgICAgICB1W2oraV0gKz0gdltpXSArIGNhcnJ5OworICAgICAgICBjYXJyeSA9IHVbaitpXSA8IGxpbWl0IHx8IChjYXJyeSAmJiB1W2oraV0gPT0gbGltaXQpOworICAgICAgfQorICAgICAgdVtqK25dICs9IGNhcnJ5OworICAgIH0KKyAgICBERUJVRyhkYmdzKCkgPDwgIktudXRoRGl2OiBhZnRlciBjb3JyZWN0aW9uOiIpOworICAgIERFQlVHKGZvciAoaW50IGkgPSBtK247IGkgPj0wOyBpLS0pIGRiZ3MoKSA8PCIgIiA8PCB1W2ldKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuS251dGhEaXY6IGRpZ2l0IHJlc3VsdCA9ICIgPDwgcVtqXSA8PCAnXG4nKTsKKworICAvLyBENy4gW0xvb3Agb24gai5dICBEZWNyZWFzZSBqIGJ5IG9uZS4gTm93IGlmIGogPj0gMCwgZ28gYmFjayB0byBEMy4KKyAgfSB3aGlsZSAoLS1qID49IDApOworCisgIERFQlVHKGRiZ3MoKSA8PCAiS251dGhEaXY6IHF1b3RpZW50OiIpOworICBERUJVRyhmb3IgKGludCBpID0gbTsgaSA+PTA7IGktLSkgZGJncygpIDw8IiAiIDw8IHFbaV0pOworICBERUJVRyhkYmdzKCkgPDwgJ1xuJyk7CisKKyAgLy8gRDguIFtVbm5vcm1hbGl6ZV0uIE5vdyBxWy4uLl0gaXMgdGhlIGRlc2lyZWQgcXVvdGllbnQsIGFuZCB0aGUgZGVzaXJlZAorICAvLyByZW1haW5kZXIgbWF5IGJlIG9idGFpbmVkIGJ5IGRpdmlkaW5nIHVbLi4uXSBieSBkLiBJZiByIGlzIG5vbi1udWxsIHdlCisgIC8vIGNvbXB1dGUgdGhlIHJlbWFpbmRlciAodXJlbSB1c2VzIHRoaXMpLgorICBpZiAocikgeworICAgIC8vIFRoZSB2YWx1ZSBkIGlzIGV4cHJlc3NlZCBieSB0aGUgInNoaWZ0IiB2YWx1ZSBhYm92ZSBzaW5jZSB3ZSBhdm9pZGVkCisgICAgLy8gbXVsdGlwbGljYXRpb24gYnkgZCBieSB1c2luZyBhIHNoaWZ0IGxlZnQuIFNvLCBhbGwgd2UgaGF2ZSB0byBkbyBpcworICAgIC8vIHNoaWZ0IHJpZ2h0IGhlcmUuIEluIG9yZGVyIHRvIG1haworICAgIGlmIChzaGlmdCkgeworICAgICAgdW5zaWduZWQgY2FycnkgPSAwOworICAgICAgREVCVUcoZGJncygpIDw8ICJLbnV0aERpdjogcmVtYWluZGVyOiIpOworICAgICAgZm9yIChpbnQgaSA9IG4tMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgcltpXSA9ICh1W2ldID4+IHNoaWZ0KSB8IGNhcnJ5OworICAgICAgICBjYXJyeSA9IHVbaV0gPDwgKDMyIC0gc2hpZnQpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAiIDw8IHJbaV0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gbi0xOyBpID49IDA7IGktLSkgeworICAgICAgICByW2ldID0gdVtpXTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIiA8PCByW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgREVCVUcoZGJncygpIDw8ICdcbicpOworICB9CisjaWYgMAorICBERUJVRyhkYmdzKCkgPDwgJ1xuJyk7CisjZW5kaWYKK30KKwordm9pZCBBUEludDo6ZGl2aWRlKGNvbnN0IEFQSW50IExIUywgdW5zaWduZWQgbGhzV29yZHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJlJIUywgdW5zaWduZWQgcmhzV29yZHMsCisgICAgICAgICAgICAgICAgICAgQVBJbnQgKlF1b3RpZW50LCBBUEludCAqUmVtYWluZGVyKQoreworICBhc3NlcnQobGhzV29yZHMgPj0gcmhzV29yZHMgJiYgIkZyYWN0aW9uYWwgcmVzdWx0Iik7CisKKyAgLy8gRmlyc3QsIGNvbXBvc2UgdGhlIHZhbHVlcyBpbnRvIGFuIGFycmF5IG9mIDMyLWJpdCB3b3JkcyBpbnN0ZWFkIG9mCisgIC8vIDY0LWJpdCB3b3Jkcy4gVGhpcyBpcyBhIG5lY2Vzc2l0eSBvZiBib3RoIHRoZSAic2hvcnQgZGl2aXNpb24iIGFsZ29yaXRobQorICAvLyBhbmQgdGhlIEtudXRoICJjbGFzc2ljYWwgYWxnb3JpdGhtIiB3aGljaCByZXF1aXJlcyB0aGVyZSB0byBiZSBuYXRpdmUKKyAgLy8gb3BlcmF0aW9ucyBmb3IgKywgLSwgYW5kICogb24gYW4gbSBiaXQgdmFsdWUgd2l0aCBhbiBtKjIgYml0IHJlc3VsdC4gV2UKKyAgLy8gY2FuJ3QgdXNlIDY0LWJpdCBvcGVyYW5kcyBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBuYXRpdmUgcmVzdWx0cyBvZgorICAvLyAxMjgtYml0cy4gRnVydGhlcm1vcmUsIGNhc3RpbmcgdGhlIDY0LWJpdCB2YWx1ZXMgdG8gMzItYml0IHZhbHVlcyB3b24ndAorICAvLyB3b3JrIG9uIGxhcmdlLWVuZGlhbiBtYWNoaW5lcy4KKyAgdWludDY0X3QgbWFzayA9IH4wdWxsID4+IChzaXplb2YodW5zaWduZWQpKkNIQVJfQklUKTsKKyAgdW5zaWduZWQgbiA9IHJoc1dvcmRzICogMjsKKyAgdW5zaWduZWQgbSA9IChsaHNXb3JkcyAqIDIpIC0gbjsKKworICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHRlbXBvcmFyeSB2YWx1ZXMgd2UgbmVlZCBlaXRoZXIgb24gdGhlIHN0YWNrLCBpZgorICAvLyBpdCB3aWxsIGZpdCwgb3Igb24gdGhlIGhlYXAgaWYgaXQgd29uJ3QuCisgIHVuc2lnbmVkIFNQQUNFWzEyOF07CisgIHVuc2lnbmVkICpVID0gMDsKKyAgdW5zaWduZWQgKlYgPSAwOworICB1bnNpZ25lZCAqUSA9IDA7CisgIHVuc2lnbmVkICpSID0gMDsKKyAgaWYgKChSZW1haW5kZXI/NDozKSpuKzIqbSsxIDw9IDEyOCkgeworICAgIFUgPSAmU1BBQ0VbMF07CisgICAgViA9ICZTUEFDRVttK24rMV07CisgICAgUSA9ICZTUEFDRVsobStuKzEpICsgbl07CisgICAgaWYgKFJlbWFpbmRlcikKKyAgICAgIFIgPSAmU1BBQ0VbKG0rbisxKSArIG4gKyAobStuKV07CisgIH0gZWxzZSB7CisgICAgVSA9IG5ldyB1bnNpZ25lZFttICsgbiArIDFdOworICAgIFYgPSBuZXcgdW5zaWduZWRbbl07CisgICAgUSA9IG5ldyB1bnNpZ25lZFttK25dOworICAgIGlmIChSZW1haW5kZXIpCisgICAgICBSID0gbmV3IHVuc2lnbmVkW25dOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgZGl2aWRlbmQKKyAgbWVtc2V0KFUsIDAsIChtK24rMSkqc2l6ZW9mKHVuc2lnbmVkKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsaHNXb3JkczsgKytpKSB7CisgICAgdWludDY0X3QgdG1wID0gKExIUy5nZXROdW1Xb3JkcygpID09IDEgPyBMSFMuVkFMIDogTEhTLnBWYWxbaV0pOworICAgIFVbaSAqIDJdID0gKHVuc2lnbmVkKSh0bXAgJiBtYXNrKTsKKyAgICBVW2kgKiAyICsgMV0gPSAodW5zaWduZWQpKHRtcCA+PiAoc2l6ZW9mKHVuc2lnbmVkKSpDSEFSX0JJVCkpOworICB9CisgIFVbbStuXSA9IDA7IC8vIHRoaXMgZXh0cmEgd29yZCBpcyBmb3IgInNwaWxsIiBpbiB0aGUgS251dGggYWxnb3JpdGhtLgorCisgIC8vIEluaXRpYWxpemUgdGhlIGRpdmlzb3IKKyAgbWVtc2V0KFYsIDAsIChuKSpzaXplb2YodW5zaWduZWQpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJoc1dvcmRzOyArK2kpIHsKKyAgICB1aW50NjRfdCB0bXAgPSAoUkhTLmdldE51bVdvcmRzKCkgPT0gMSA/IFJIUy5WQUwgOiBSSFMucFZhbFtpXSk7CisgICAgVltpICogMl0gPSAodW5zaWduZWQpKHRtcCAmIG1hc2spOworICAgIFZbaSAqIDIgKyAxXSA9ICh1bnNpZ25lZCkodG1wID4+IChzaXplb2YodW5zaWduZWQpKkNIQVJfQklUKSk7CisgIH0KKworICAvLyBpbml0aWFsaXplIHRoZSBxdW90aWVudCBhbmQgcmVtYWluZGVyCisgIG1lbXNldChRLCAwLCAobStuKSAqIHNpemVvZih1bnNpZ25lZCkpOworICBpZiAoUmVtYWluZGVyKQorICAgIG1lbXNldChSLCAwLCBuICogc2l6ZW9mKHVuc2lnbmVkKSk7CisKKyAgLy8gTm93LCBhZGp1c3QgbSBhbmQgbiBmb3IgdGhlIEtudXRoIGRpdmlzaW9uLiBuIGlzIHRoZSBudW1iZXIgb2Ygd29yZHMgaW4KKyAgLy8gdGhlIGRpdmlzb3IuIG0gaXMgdGhlIG51bWJlciBvZiB3b3JkcyBieSB3aGljaCB0aGUgZGl2aWRlbmQgZXhjZWVkcyB0aGUKKyAgLy8gZGl2aXNvciAoaS5lLiBtK24gaXMgdGhlIGxlbmd0aCBvZiB0aGUgZGl2aWRlbmQpLiBUaGVzZSBzaXplcyBtdXN0IG5vdAorICAvLyBjb250YWluIGFueSB6ZXJvIHdvcmRzIG9yIHRoZSBLbnV0aCBhbGdvcml0aG0gZmFpbHMuCisgIGZvciAodW5zaWduZWQgaSA9IG47IGkgPiAwICYmIFZbaS0xXSA9PSAwOyBpLS0pIHsKKyAgICBuLS07CisgICAgbSsrOworICB9CisgIGZvciAodW5zaWduZWQgaSA9IG0rbjsgaSA+IDAgJiYgVVtpLTFdID09IDA7IGktLSkKKyAgICBtLS07CisKKyAgLy8gSWYgd2UncmUgbGVmdCB3aXRoIG9ubHkgYSBzaW5nbGUgd29yZCBmb3IgdGhlIGRpdmlzb3IsIEtudXRoIGRvZXNuJ3Qgd29yaworICAvLyBzbyB3ZSBpbXBsZW1lbnQgdGhlIHNob3J0IGRpdmlzaW9uIGFsZ29yaXRobSBoZXJlLiBUaGlzIGlzIG11Y2ggc2ltcGxlcgorICAvLyBhbmQgZmFzdGVyIGJlY2F1c2Ugd2UgYXJlIGNlcnRhaW4gdGhhdCB3ZSBjYW4gZGl2aWRlIGEgNjQtYml0IHF1YW50aXR5CisgIC8vIGJ5IGEgMzItYml0IHF1YW50aXR5IGF0IGhhcmR3YXJlIHNwZWVkIGFuZCBzaG9ydCBkaXZpc2lvbiBpcyBzaW1wbHkgYQorICAvLyBzZXJpZXMgb2Ygc3VjaCBvcGVyYXRpb25zLiBUaGlzIGlzIGp1c3QgbGlrZSBkb2luZyBzaG9ydCBkaXZpc2lvbiBidXQgd2UKKyAgLy8gYXJlIHVzaW5nIGJhc2UgMl4zMiBpbnN0ZWFkIG9mIGJhc2UgMTAuCisgIGFzc2VydChuICE9IDAgJiYgIkRpdmlkZSBieSB6ZXJvPyIpOworICBpZiAobiA9PSAxKSB7CisgICAgdW5zaWduZWQgZGl2aXNvciA9IFZbMF07CisgICAgdW5zaWduZWQgcmVtYWluZGVyID0gMDsKKyAgICBmb3IgKGludCBpID0gbStuLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICB1aW50NjRfdCBwYXJ0aWFsX2RpdmlkZW5kID0gdWludDY0X3QocmVtYWluZGVyKSA8PCAzMiB8IFVbaV07CisgICAgICBpZiAocGFydGlhbF9kaXZpZGVuZCA9PSAwKSB7CisgICAgICAgIFFbaV0gPSAwOworICAgICAgICByZW1haW5kZXIgPSAwOworICAgICAgfSBlbHNlIGlmIChwYXJ0aWFsX2RpdmlkZW5kIDwgZGl2aXNvcikgeworICAgICAgICBRW2ldID0gMDsKKyAgICAgICAgcmVtYWluZGVyID0gKHVuc2lnbmVkKXBhcnRpYWxfZGl2aWRlbmQ7CisgICAgICB9IGVsc2UgaWYgKHBhcnRpYWxfZGl2aWRlbmQgPT0gZGl2aXNvcikgeworICAgICAgICBRW2ldID0gMTsKKyAgICAgICAgcmVtYWluZGVyID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFFbaV0gPSAodW5zaWduZWQpKHBhcnRpYWxfZGl2aWRlbmQgLyBkaXZpc29yKTsKKyAgICAgICAgcmVtYWluZGVyID0gKHVuc2lnbmVkKShwYXJ0aWFsX2RpdmlkZW5kIC0gKFFbaV0gKiBkaXZpc29yKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChSKQorICAgICAgUlswXSA9IHJlbWFpbmRlcjsKKyAgfSBlbHNlIHsKKyAgICAvLyBOb3cgd2UncmUgcmVhZHkgdG8gaW52b2tlIHRoZSBLbnV0aCBjbGFzc2ljYWwgZGl2aWRlIGFsZ29yaXRobS4gSW4gdGhpcworICAgIC8vIGNhc2UgbiA+IDEuCisgICAgS251dGhEaXYoVSwgViwgUSwgUiwgbSwgbik7CisgIH0KKworICAvLyBJZiB0aGUgY2FsbGVyIHdhbnRzIHRoZSBxdW90aWVudAorICBpZiAoUXVvdGllbnQpIHsKKyAgICAvLyBTZXQgdXAgdGhlIFF1b3RpZW50IHZhbHVlJ3MgbWVtb3J5LgorICAgIGlmIChRdW90aWVudC0+Qml0V2lkdGggIT0gTEhTLkJpdFdpZHRoKSB7CisgICAgICBpZiAoUXVvdGllbnQtPmlzU2luZ2xlV29yZCgpKQorICAgICAgICBRdW90aWVudC0+VkFMID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgZGVsZXRlIFtdIFF1b3RpZW50LT5wVmFsOworICAgICAgUXVvdGllbnQtPkJpdFdpZHRoID0gTEhTLkJpdFdpZHRoOworICAgICAgaWYgKCFRdW90aWVudC0+aXNTaW5nbGVXb3JkKCkpCisgICAgICAgIFF1b3RpZW50LT5wVmFsID0gZ2V0Q2xlYXJlZE1lbW9yeShRdW90aWVudC0+Z2V0TnVtV29yZHMoKSk7CisgICAgfSBlbHNlCisgICAgICBRdW90aWVudC0+Y2xlYXIoKTsKKworICAgIC8vIFRoZSBxdW90aWVudCBpcyBpbiBRLiBSZWNvbnN0aXR1dGUgdGhlIHF1b3RpZW50IGludG8gUXVvdGllbnQncyBsb3cKKyAgICAvLyBvcmRlciB3b3Jkcy4KKyAgICBpZiAobGhzV29yZHMgPT0gMSkgeworICAgICAgdWludDY0X3QgdG1wID0KKyAgICAgICAgdWludDY0X3QoUVswXSkgfCAodWludDY0X3QoUVsxXSkgPDwgKEFQSU5UX0JJVFNfUEVSX1dPUkQgLyAyKSk7CisgICAgICBpZiAoUXVvdGllbnQtPmlzU2luZ2xlV29yZCgpKQorICAgICAgICBRdW90aWVudC0+VkFMID0gdG1wOworICAgICAgZWxzZQorICAgICAgICBRdW90aWVudC0+cFZhbFswXSA9IHRtcDsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KCFRdW90aWVudC0+aXNTaW5nbGVXb3JkKCkgJiYgIlF1b3RpZW50IEFQSW50IG5vdCBsYXJnZSBlbm91Z2giKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsaHNXb3JkczsgKytpKQorICAgICAgICBRdW90aWVudC0+cFZhbFtpXSA9CisgICAgICAgICAgdWludDY0X3QoUVtpKjJdKSB8ICh1aW50NjRfdChRW2kqMisxXSkgPDwgKEFQSU5UX0JJVFNfUEVSX1dPUkQgLyAyKSk7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGNhbGxlciB3YW50cyB0aGUgcmVtYWluZGVyCisgIGlmIChSZW1haW5kZXIpIHsKKyAgICAvLyBTZXQgdXAgdGhlIFJlbWFpbmRlciB2YWx1ZSdzIG1lbW9yeS4KKyAgICBpZiAoUmVtYWluZGVyLT5CaXRXaWR0aCAhPSBSSFMuQml0V2lkdGgpIHsKKyAgICAgIGlmIChSZW1haW5kZXItPmlzU2luZ2xlV29yZCgpKQorICAgICAgICBSZW1haW5kZXItPlZBTCA9IDA7CisgICAgICBlbHNlCisgICAgICAgIGRlbGV0ZSBbXSBSZW1haW5kZXItPnBWYWw7CisgICAgICBSZW1haW5kZXItPkJpdFdpZHRoID0gUkhTLkJpdFdpZHRoOworICAgICAgaWYgKCFSZW1haW5kZXItPmlzU2luZ2xlV29yZCgpKQorICAgICAgICBSZW1haW5kZXItPnBWYWwgPSBnZXRDbGVhcmVkTWVtb3J5KFJlbWFpbmRlci0+Z2V0TnVtV29yZHMoKSk7CisgICAgfSBlbHNlCisgICAgICBSZW1haW5kZXItPmNsZWFyKCk7CisKKyAgICAvLyBUaGUgcmVtYWluZGVyIGlzIGluIFIuIFJlY29uc3RpdHV0ZSB0aGUgcmVtYWluZGVyIGludG8gUmVtYWluZGVyJ3MgbG93CisgICAgLy8gb3JkZXIgd29yZHMuCisgICAgaWYgKHJoc1dvcmRzID09IDEpIHsKKyAgICAgIHVpbnQ2NF90IHRtcCA9CisgICAgICAgIHVpbnQ2NF90KFJbMF0pIHwgKHVpbnQ2NF90KFJbMV0pIDw8IChBUElOVF9CSVRTX1BFUl9XT1JEIC8gMikpOworICAgICAgaWYgKFJlbWFpbmRlci0+aXNTaW5nbGVXb3JkKCkpCisgICAgICAgIFJlbWFpbmRlci0+VkFMID0gdG1wOworICAgICAgZWxzZQorICAgICAgICBSZW1haW5kZXItPnBWYWxbMF0gPSB0bXA7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydCghUmVtYWluZGVyLT5pc1NpbmdsZVdvcmQoKSAmJiAiUmVtYWluZGVyIEFQSW50IG5vdCBsYXJnZSBlbm91Z2giKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByaHNXb3JkczsgKytpKQorICAgICAgICBSZW1haW5kZXItPnBWYWxbaV0gPQorICAgICAgICAgIHVpbnQ2NF90KFJbaSoyXSkgfCAodWludDY0X3QoUltpKjIrMV0pIDw8IChBUElOVF9CSVRTX1BFUl9XT1JEIC8gMikpOworICAgIH0KKyAgfQorCisgIC8vIENsZWFuIHVwIHRoZSBtZW1vcnkgd2UgYWxsb2NhdGVkLgorICBpZiAoVSAhPSAmU1BBQ0VbMF0pIHsKKyAgICBkZWxldGUgW10gVTsKKyAgICBkZWxldGUgW10gVjsKKyAgICBkZWxldGUgW10gUTsKKyAgICBkZWxldGUgW10gUjsKKyAgfQorfQorCitBUEludCBBUEludDo6dWRpdihjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgIGFzc2VydChCaXRXaWR0aCA9PSBSSFMuQml0V2lkdGggJiYgIkJpdCB3aWR0aHMgbXVzdCBiZSB0aGUgc2FtZSIpOworCisgIC8vIEZpcnN0LCBkZWFsIHdpdGggdGhlIGVhc3kgY2FzZQorICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICBhc3NlcnQoUkhTLlZBTCAhPSAwICYmICJEaXZpZGUgYnkgemVybz8iKTsKKyAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIFZBTCAvIFJIUy5WQUwpOworICB9CisKKyAgLy8gR2V0IHNvbWUgZmFjdHMgYWJvdXQgdGhlIExIUyBhbmQgUkhTIG51bWJlciBvZiBiaXRzIGFuZCB3b3JkcworICB1bnNpZ25lZCByaHNCaXRzID0gUkhTLmdldEFjdGl2ZUJpdHMoKTsKKyAgdW5zaWduZWQgcmhzV29yZHMgPSAhcmhzQml0cyA/IDAgOiAoQVBJbnQ6OndoaWNoV29yZChyaHNCaXRzIC0gMSkgKyAxKTsKKyAgYXNzZXJ0KHJoc1dvcmRzICYmICJEaXZpZGVkIGJ5IHplcm8/Pz8iKTsKKyAgdW5zaWduZWQgbGhzQml0cyA9IHRoaXMtPmdldEFjdGl2ZUJpdHMoKTsKKyAgdW5zaWduZWQgbGhzV29yZHMgPSAhbGhzQml0cyA/IDAgOiAoQVBJbnQ6OndoaWNoV29yZChsaHNCaXRzIC0gMSkgKyAxKTsKKworICAvLyBEZWFsIHdpdGggc29tZSBkZWdlbmVyYXRlIGNhc2VzCisgIGlmICghbGhzV29yZHMpCisgICAgLy8gMCAvIFggPT09PiAwCisgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLCAwKTsKKyAgZWxzZSBpZiAobGhzV29yZHMgPCByaHNXb3JkcyB8fCB0aGlzLT51bHQoUkhTKSkgeworICAgIC8vIFggLyBZID09PT4gMCwgaWZmIFggPCBZCisgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLCAwKTsKKyAgfSBlbHNlIGlmICgqdGhpcyA9PSBSSFMpIHsKKyAgICAvLyBYIC8gWCA9PT0+IDEKKyAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIDEpOworICB9IGVsc2UgaWYgKGxoc1dvcmRzID09IDEgJiYgcmhzV29yZHMgPT0gMSkgeworICAgIC8vIEFsbCBoaWdoIHdvcmRzIGFyZSB6ZXJvLCBqdXN0IHVzZSBuYXRpdmUgZGl2aWRlCisgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLCB0aGlzLT5wVmFsWzBdIC8gUkhTLnBWYWxbMF0pOworICB9CisKKyAgLy8gV2UgaGF2ZSB0byBjb21wdXRlIGl0IHRoZSBoYXJkIHdheS4gSW52b2tlIHRoZSBLbnV0aCBkaXZpZGUgYWxnb3JpdGhtLgorICBBUEludCBRdW90aWVudCgxLDApOyAvLyB0byBob2xkIHJlc3VsdC4KKyAgZGl2aWRlKCp0aGlzLCBsaHNXb3JkcywgUkhTLCByaHNXb3JkcywgJlF1b3RpZW50LCAwKTsKKyAgcmV0dXJuIFF1b3RpZW50OworfQorCitBUEludCBBUEludDo6dXJlbShjb25zdCBBUEludCYgUkhTKSBjb25zdCB7CisgIGFzc2VydChCaXRXaWR0aCA9PSBSSFMuQml0V2lkdGggJiYgIkJpdCB3aWR0aHMgbXVzdCBiZSB0aGUgc2FtZSIpOworICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICBhc3NlcnQoUkhTLlZBTCAhPSAwICYmICJSZW1haW5kZXIgYnkgemVybz8iKTsKKyAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIFZBTCAlIFJIUy5WQUwpOworICB9CisKKyAgLy8gR2V0IHNvbWUgZmFjdHMgYWJvdXQgdGhlIExIUworICB1bnNpZ25lZCBsaHNCaXRzID0gZ2V0QWN0aXZlQml0cygpOworICB1bnNpZ25lZCBsaHNXb3JkcyA9ICFsaHNCaXRzID8gMCA6ICh3aGljaFdvcmQobGhzQml0cyAtIDEpICsgMSk7CisKKyAgLy8gR2V0IHNvbWUgZmFjdHMgYWJvdXQgdGhlIFJIUworICB1bnNpZ25lZCByaHNCaXRzID0gUkhTLmdldEFjdGl2ZUJpdHMoKTsKKyAgdW5zaWduZWQgcmhzV29yZHMgPSAhcmhzQml0cyA/IDAgOiAoQVBJbnQ6OndoaWNoV29yZChyaHNCaXRzIC0gMSkgKyAxKTsKKyAgYXNzZXJ0KHJoc1dvcmRzICYmICJQZXJmb3JtaW5nIHJlbWFpbmRlciBvcGVyYXRpb24gYnkgemVybyA/Pz8iKTsKKworICAvLyBDaGVjayB0aGUgZGVnZW5lcmF0ZSBjYXNlcworICBpZiAobGhzV29yZHMgPT0gMCkgeworICAgIC8vIDAgJSBZID09PT4gMAorICAgIHJldHVybiBBUEludChCaXRXaWR0aCwgMCk7CisgIH0gZWxzZSBpZiAobGhzV29yZHMgPCByaHNXb3JkcyB8fCB0aGlzLT51bHQoUkhTKSkgeworICAgIC8vIFggJSBZID09PT4gWCwgaWZmIFggPCBZCisgICAgcmV0dXJuICp0aGlzOworICB9IGVsc2UgaWYgKCp0aGlzID09IFJIUykgeworICAgIC8vIFggJSBYID09IDA7CisgICAgcmV0dXJuIEFQSW50KEJpdFdpZHRoLCAwKTsKKyAgfSBlbHNlIGlmIChsaHNXb3JkcyA9PSAxKSB7CisgICAgLy8gQWxsIGhpZ2ggd29yZHMgYXJlIHplcm8sIGp1c3QgdXNlIG5hdGl2ZSByZW1haW5kZXIKKyAgICByZXR1cm4gQVBJbnQoQml0V2lkdGgsIHBWYWxbMF0gJSBSSFMucFZhbFswXSk7CisgIH0KKworICAvLyBXZSBoYXZlIHRvIGNvbXB1dGUgaXQgdGhlIGhhcmQgd2F5LiBJbnZva2UgdGhlIEtudXRoIGRpdmlkZSBhbGdvcml0aG0uCisgIEFQSW50IFJlbWFpbmRlcigxLDApOworICBkaXZpZGUoKnRoaXMsIGxoc1dvcmRzLCBSSFMsIHJoc1dvcmRzLCAwLCAmUmVtYWluZGVyKTsKKyAgcmV0dXJuIFJlbWFpbmRlcjsKK30KKwordm9pZCBBUEludDo6dWRpdnJlbShjb25zdCBBUEludCAmTEhTLCBjb25zdCBBUEludCAmUkhTLAorICAgICAgICAgICAgICAgICAgICBBUEludCAmUXVvdGllbnQsIEFQSW50ICZSZW1haW5kZXIpIHsKKyAgLy8gR2V0IHNvbWUgc2l6ZSBmYWN0cyBhYm91dCB0aGUgZGl2aWRlbmQgYW5kIGRpdmlzb3IKKyAgdW5zaWduZWQgbGhzQml0cyAgPSBMSFMuZ2V0QWN0aXZlQml0cygpOworICB1bnNpZ25lZCBsaHNXb3JkcyA9ICFsaHNCaXRzID8gMCA6IChBUEludDo6d2hpY2hXb3JkKGxoc0JpdHMgLSAxKSArIDEpOworICB1bnNpZ25lZCByaHNCaXRzICA9IFJIUy5nZXRBY3RpdmVCaXRzKCk7CisgIHVuc2lnbmVkIHJoc1dvcmRzID0gIXJoc0JpdHMgPyAwIDogKEFQSW50Ojp3aGljaFdvcmQocmhzQml0cyAtIDEpICsgMSk7CisKKyAgLy8gQ2hlY2sgdGhlIGRlZ2VuZXJhdGUgY2FzZXMKKyAgaWYgKGxoc1dvcmRzID09IDApIHsKKyAgICBRdW90aWVudCA9IDA7ICAgICAgICAgICAgICAgIC8vIDAgLyBZID09PT4gMAorICAgIFJlbWFpbmRlciA9IDA7ICAgICAgICAgICAgICAgLy8gMCAlIFkgPT09PiAwCisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGxoc1dvcmRzIDwgcmhzV29yZHMgfHwgTEhTLnVsdChSSFMpKSB7CisgICAgUmVtYWluZGVyID0gTEhTOyAgICAgICAgICAgIC8vIFggJSBZID09PT4gWCwgaWZmIFggPCBZCisgICAgUXVvdGllbnQgPSAwOyAgICAgICAgICAgICAgIC8vIFggLyBZID09PT4gMCwgaWZmIFggPCBZCisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKExIUyA9PSBSSFMpIHsKKyAgICBRdW90aWVudCAgPSAxOyAgICAgICAgICAgICAgLy8gWCAvIFggPT09PiAxCisgICAgUmVtYWluZGVyID0gMDsgICAgICAgICAgICAgIC8vIFggJSBYID09PT4gMDsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAobGhzV29yZHMgPT0gMSAmJiByaHNXb3JkcyA9PSAxKSB7CisgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgd29yZCB0byBjb25zaWRlciBzbyB1c2UgdGhlIG5hdGl2ZSB2ZXJzaW9ucy4KKyAgICB1aW50NjRfdCBsaHNWYWx1ZSA9IExIUy5pc1NpbmdsZVdvcmQoKSA/IExIUy5WQUwgOiBMSFMucFZhbFswXTsKKyAgICB1aW50NjRfdCByaHNWYWx1ZSA9IFJIUy5pc1NpbmdsZVdvcmQoKSA/IFJIUy5WQUwgOiBSSFMucFZhbFswXTsKKyAgICBRdW90aWVudCA9IEFQSW50KExIUy5nZXRCaXRXaWR0aCgpLCBsaHNWYWx1ZSAvIHJoc1ZhbHVlKTsKKyAgICBSZW1haW5kZXIgPSBBUEludChMSFMuZ2V0Qml0V2lkdGgoKSwgbGhzVmFsdWUgJSByaHNWYWx1ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gT2theSwgbGV0cyBkbyBpdCB0aGUgbG9uZyB3YXkKKyAgZGl2aWRlKExIUywgbGhzV29yZHMsIFJIUywgcmhzV29yZHMsICZRdW90aWVudCwgJlJlbWFpbmRlcik7Cit9CisKK3ZvaWQgQVBJbnQ6OmZyb21TdHJpbmcodW5zaWduZWQgbnVtYml0cywgU3RyaW5nUmVmIHN0ciwgdWludDhfdCByYWRpeCkgeworICAvLyBDaGVjayBvdXIgYXNzdW1wdGlvbnMgaGVyZQorICBhc3NlcnQoIXN0ci5lbXB0eSgpICYmICJJbnZhbGlkIHN0cmluZyBsZW5ndGgiKTsKKyAgYXNzZXJ0KChyYWRpeCA9PSAxMCB8fCByYWRpeCA9PSA4IHx8IHJhZGl4ID09IDE2IHx8IHJhZGl4ID09IDIpICYmCisgICAgICAgICAiUmFkaXggc2hvdWxkIGJlIDIsIDgsIDEwLCBvciAxNiEiKTsKKworICBTdHJpbmdSZWY6Oml0ZXJhdG9yIHAgPSBzdHIuYmVnaW4oKTsKKyAgc2l6ZV90IHNsZW4gPSBzdHIuc2l6ZSgpOworICBib29sIGlzTmVnID0gKnAgPT0gJy0nOworICBpZiAoKnAgPT0gJy0nIHx8ICpwID09ICcrJykgeworICAgIHArKzsKKyAgICBzbGVuLS07CisgICAgYXNzZXJ0KHNsZW4gJiYgIlN0cmluZyBpcyBvbmx5IGEgc2lnbiwgbmVlZHMgYSB2YWx1ZS4iKTsKKyAgfQorICBhc3NlcnQoKHNsZW4gPD0gbnVtYml0cyB8fCByYWRpeCAhPSAyKSAmJiAiSW5zdWZmaWNpZW50IGJpdCB3aWR0aCIpOworICBhc3NlcnQoKChzbGVuLTEpKjMgPD0gbnVtYml0cyB8fCByYWRpeCAhPSA4KSAmJiAiSW5zdWZmaWNpZW50IGJpdCB3aWR0aCIpOworICBhc3NlcnQoKChzbGVuLTEpKjQgPD0gbnVtYml0cyB8fCByYWRpeCAhPSAxNikgJiYgIkluc3VmZmljaWVudCBiaXQgd2lkdGgiKTsKKyAgYXNzZXJ0KCgoKHNsZW4tMSkqNjQpLzIyIDw9IG51bWJpdHMgfHwgcmFkaXggIT0gMTApICYmCisgICAgICAgICAiSW5zdWZmaWNpZW50IGJpdCB3aWR0aCIpOworCisgIC8vIEFsbG9jYXRlIG1lbW9yeQorICBpZiAoIWlzU2luZ2xlV29yZCgpKQorICAgIHBWYWwgPSBnZXRDbGVhcmVkTWVtb3J5KGdldE51bVdvcmRzKCkpOworCisgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgY2FuIHNoaWZ0IGluc3RlYWQgb2YgbXVsdGlwbHkKKyAgdW5zaWduZWQgc2hpZnQgPSAocmFkaXggPT0gMTYgPyA0IDogcmFkaXggPT0gOCA/IDMgOiByYWRpeCA9PSAyID8gMSA6IDApOworCisgIC8vIFNldCB1cCBhbiBBUEludCBmb3IgdGhlIGRpZ2l0IHRvIGFkZCBvdXRzaWRlIHRoZSBsb29wIHNvIHdlIGRvbid0CisgIC8vIGNvbnN0YW50bHkgY29uc3RydWN0L2Rlc3RydWN0IGl0LgorICBBUEludCBhcGRpZ2l0KGdldEJpdFdpZHRoKCksIDApOworICBBUEludCBhcHJhZGl4KGdldEJpdFdpZHRoKCksIHJhZGl4KTsKKworICAvLyBFbnRlciBkaWdpdCB0cmF2ZXJzYWwgbG9vcAorICBmb3IgKFN0cmluZ1JlZjo6aXRlcmF0b3IgZSA9IHN0ci5lbmQoKTsgcCAhPSBlOyArK3ApIHsKKyAgICB1bnNpZ25lZCBkaWdpdCA9IGdldERpZ2l0KCpwLCByYWRpeCk7CisgICAgYXNzZXJ0KGRpZ2l0IDwgcmFkaXggJiYgIkludmFsaWQgY2hhcmFjdGVyIGluIGRpZ2l0IHN0cmluZyIpOworCisgICAgLy8gU2hpZnQgb3IgbXVsdGlwbHkgdGhlIHZhbHVlIGJ5IHRoZSByYWRpeAorICAgIGlmIChzbGVuID4gMSkgeworICAgICAgaWYgKHNoaWZ0KQorICAgICAgICAqdGhpcyA8PD0gc2hpZnQ7CisgICAgICBlbHNlCisgICAgICAgICp0aGlzICo9IGFwcmFkaXg7CisgICAgfQorCisgICAgLy8gQWRkIGluIHRoZSBkaWdpdCB3ZSBqdXN0IGludGVycHJldGVkCisgICAgaWYgKGFwZGlnaXQuaXNTaW5nbGVXb3JkKCkpCisgICAgICBhcGRpZ2l0LlZBTCA9IGRpZ2l0OworICAgIGVsc2UKKyAgICAgIGFwZGlnaXQucFZhbFswXSA9IGRpZ2l0OworICAgICp0aGlzICs9IGFwZGlnaXQ7CisgIH0KKyAgLy8gSWYgaXRzIG5lZ2F0aXZlLCBwdXQgaXQgaW4gdHdvJ3MgY29tcGxlbWVudCBmb3JtCisgIGlmIChpc05lZykgeworICAgICgqdGhpcyktLTsKKyAgICB0aGlzLT5mbGlwKCk7CisgIH0KK30KKwordm9pZCBBUEludDo6dG9TdHJpbmcoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIsIHVuc2lnbmVkIFJhZGl4LAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaWduZWQpIGNvbnN0IHsKKyAgYXNzZXJ0KChSYWRpeCA9PSAxMCB8fCBSYWRpeCA9PSA4IHx8IFJhZGl4ID09IDE2IHx8IFJhZGl4ID09IDIpICYmCisgICAgICAgICAiUmFkaXggc2hvdWxkIGJlIDIsIDgsIDEwLCBvciAxNiEiKTsKKworICAvLyBGaXJzdCwgY2hlY2sgZm9yIGEgemVybyB2YWx1ZSBhbmQganVzdCBzaG9ydCBjaXJjdWl0IHRoZSBsb2dpYyBiZWxvdy4KKyAgaWYgKCp0aGlzID09IDApIHsKKyAgICBTdHIucHVzaF9iYWNrKCcwJyk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgRGlnaXRzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKKyAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgY2hhciBCdWZmZXJbNjVdOworICAgIGNoYXIgKkJ1ZlB0ciA9IEJ1ZmZlcis2NTsKKworICAgIHVpbnQ2NF90IE47CisgICAgaWYgKFNpZ25lZCkgeworICAgICAgaW50NjRfdCBJID0gZ2V0U0V4dFZhbHVlKCk7CisgICAgICBpZiAoSSA8IDApIHsKKyAgICAgICAgU3RyLnB1c2hfYmFjaygnLScpOworICAgICAgICBJID0gLUk7CisgICAgICB9CisgICAgICBOID0gSTsKKyAgICB9IGVsc2UgeworICAgICAgTiA9IGdldFpFeHRWYWx1ZSgpOworICAgIH0KKworICAgIHdoaWxlIChOKSB7CisgICAgICAqLS1CdWZQdHIgPSBEaWdpdHNbTiAlIFJhZGl4XTsKKyAgICAgIE4gLz0gUmFkaXg7CisgICAgfQorICAgIFN0ci5hcHBlbmQoQnVmUHRyLCBCdWZmZXIrNjUpOworICAgIHJldHVybjsKKyAgfQorCisgIEFQSW50IFRtcCgqdGhpcyk7CisKKyAgaWYgKFNpZ25lZCAmJiBpc05lZ2F0aXZlKCkpIHsKKyAgICAvLyBUaGV5IHdhbnQgdG8gcHJpbnQgdGhlIHNpZ25lZCB2ZXJzaW9uIGFuZCBpdCBpcyBhIG5lZ2F0aXZlIHZhbHVlCisgICAgLy8gRmxpcCB0aGUgYml0cyBhbmQgYWRkIG9uZSB0byB0dXJuIGl0IGludG8gdGhlIGVxdWl2YWxlbnQgcG9zaXRpdmUKKyAgICAvLyB2YWx1ZSBhbmQgcHV0IGEgJy0nIGluIHRoZSByZXN1bHQuCisgICAgVG1wLmZsaXAoKTsKKyAgICBUbXArKzsKKyAgICBTdHIucHVzaF9iYWNrKCctJyk7CisgIH0KKworICAvLyBXZSBpbnNlcnQgdGhlIGRpZ2l0cyBiYWNrd2FyZCwgdGhlbiByZXZlcnNlIHRoZW0gdG8gZ2V0IHRoZSByaWdodCBvcmRlci4KKyAgdW5zaWduZWQgU3RhcnREaWcgPSBTdHIuc2l6ZSgpOworCisgIC8vIEZvciB0aGUgMiwgOCBhbmQgMTYgYml0IGNhc2VzLCB3ZSBjYW4ganVzdCBzaGlmdCBpbnN0ZWFkIG9mIGRpdmlkZQorICAvLyBiZWNhdXNlIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgZGlnaXQgKDEsIDMgYW5kIDQgcmVzcGVjdGl2ZWx5KSBkaXZpZGVzCisgIC8vIGVxdWFseS4gIFdlIGp1c3Qgc2hpZnQgdW50aWwgdGhlIHZhbHVlIGlzIHplcm8uCisgIGlmIChSYWRpeCAhPSAxMCkgeworICAgIC8vIEp1c3Qgc2hpZnQgdG1wIHJpZ2h0IGZvciBlYWNoIGRpZ2l0IHdpZHRoIHVudGlsIGl0IGJlY29tZXMgemVybworICAgIHVuc2lnbmVkIFNoaWZ0QW10ID0gKFJhZGl4ID09IDE2ID8gNCA6IChSYWRpeCA9PSA4ID8gMyA6IDEpKTsKKyAgICB1bnNpZ25lZCBNYXNrQW10ID0gUmFkaXggLSAxOworCisgICAgd2hpbGUgKFRtcCAhPSAwKSB7CisgICAgICB1bnNpZ25lZCBEaWdpdCA9IHVuc2lnbmVkKFRtcC5nZXRSYXdEYXRhKClbMF0pICYgTWFza0FtdDsKKyAgICAgIFN0ci5wdXNoX2JhY2soRGlnaXRzW0RpZ2l0XSk7CisgICAgICBUbXAgPSBUbXAubHNocihTaGlmdEFtdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIEFQSW50IGRpdmlzb3IoNCwgMTApOworICAgIHdoaWxlIChUbXAgIT0gMCkgeworICAgICAgQVBJbnQgQVBkaWdpdCgxLCAwKTsKKyAgICAgIEFQSW50IHRtcDIoVG1wLmdldEJpdFdpZHRoKCksIDApOworICAgICAgZGl2aWRlKFRtcCwgVG1wLmdldE51bVdvcmRzKCksIGRpdmlzb3IsIGRpdmlzb3IuZ2V0TnVtV29yZHMoKSwgJnRtcDIsCisgICAgICAgICAgICAgJkFQZGlnaXQpOworICAgICAgdW5zaWduZWQgRGlnaXQgPSAodW5zaWduZWQpQVBkaWdpdC5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIGFzc2VydChEaWdpdCA8IFJhZGl4ICYmICJkaXZpZGUgZmFpbGVkIik7CisgICAgICBTdHIucHVzaF9iYWNrKERpZ2l0c1tEaWdpdF0pOworICAgICAgVG1wID0gdG1wMjsKKyAgICB9CisgIH0KKworICAvLyBSZXZlcnNlIHRoZSBkaWdpdHMgYmVmb3JlIHJldHVybmluZy4KKyAgc3RkOjpyZXZlcnNlKFN0ci5iZWdpbigpK1N0YXJ0RGlnLCBTdHIuZW5kKCkpOworfQorCisvLy8gdG9TdHJpbmcgLSBUaGlzIHJldHVybnMgdGhlIEFQSW50IGFzIGEgc3RkOjpzdHJpbmcuICBOb3RlIHRoYXQgdGhpcyBpcyBhbgorLy8vIGluZWZmaWNpZW50IG1ldGhvZC4gIEl0IGlzIGJldHRlciB0byBwYXNzIGluIGEgU21hbGxWZWN0b3IvU21hbGxTdHJpbmcKKy8vLyB0byB0aGUgbWV0aG9kcyBhYm92ZS4KK3N0ZDo6c3RyaW5nIEFQSW50Ojp0b1N0cmluZyh1bnNpZ25lZCBSYWRpeCA9IDEwLCBib29sIFNpZ25lZCA9IHRydWUpIGNvbnN0IHsKKyAgU21hbGxTdHJpbmc8NDA+IFM7CisgIHRvU3RyaW5nKFMsIFJhZGl4LCBTaWduZWQpOworICByZXR1cm4gUy5zdHIoKTsKK30KKworCit2b2lkIEFQSW50OjpkdW1wKCkgY29uc3QgeworICBTbWFsbFN0cmluZzw0MD4gUywgVTsKKyAgdGhpcy0+dG9TdHJpbmdVbnNpZ25lZChVKTsKKyAgdGhpcy0+dG9TdHJpbmdTaWduZWQoUyk7CisgIGRiZ3MoKSA8PCAiQVBJbnQoIiA8PCBCaXRXaWR0aCA8PCAiYiwgIgorICAgICAgICAgPDwgVS5zdHIoKSA8PCAidSAiIDw8IFMuc3RyKCkgPDwgInMpIjsKK30KKwordm9pZCBBUEludDo6cHJpbnQocmF3X29zdHJlYW0gJk9TLCBib29sIGlzU2lnbmVkKSBjb25zdCB7CisgIFNtYWxsU3RyaW5nPDQwPiBTOworICB0aGlzLT50b1N0cmluZyhTLCAxMCwgaXNTaWduZWQpOworICBPUyA8PCBTLnN0cigpOworfQorCisvLyBUaGlzIGltcGxlbWVudHMgYSB2YXJpZXR5IG9mIG9wZXJhdGlvbnMgb24gYSByZXByZXNlbnRhdGlvbiBvZgorLy8gYXJiaXRyYXJ5IHByZWNpc2lvbiwgdHdvJ3MtY29tcGxlbWVudCwgYmlnbnVtIGludGVnZXIgdmFsdWVzLgorCisvLyBBc3N1bWVkIGJ5IGxvd0hhbGYsIGhpZ2hIYWxmLCBwYXJ0TVNCIGFuZCBwYXJ0TFNCLiAgQSBmYWlybHkgc2FmZQorLy8gYW5kIHVucmVzdHJpY3RpbmcgYXNzdW1wdGlvbi4KKyNkZWZpbmUgQ09NUElMRV9USU1FX0FTU0VSVChjb25kKSBleHRlcm4gaW50IENUQXNzZXJ0Wyhjb25kKSA/IDEgOiAtMV0KK0NPTVBJTEVfVElNRV9BU1NFUlQoaW50ZWdlclBhcnRXaWR0aCAlIDIgPT0gMCk7CisKKy8qIFNvbWUgaGFuZHkgZnVuY3Rpb25zIGxvY2FsIHRvIHRoaXMgZmlsZS4gICovCituYW1lc3BhY2UgeworCisgIC8qIFJldHVybnMgdGhlIGludGVnZXIgcGFydCB3aXRoIHRoZSBsZWFzdCBzaWduaWZpY2FudCBCSVRTIHNldC4KKyAgICAgQklUUyBjYW5ub3QgYmUgemVyby4gICovCisgIHN0YXRpYyBpbmxpbmUgaW50ZWdlclBhcnQKKyAgbG93Qml0TWFzayh1bnNpZ25lZCBpbnQgYml0cykKKyAgeworICAgIGFzc2VydChiaXRzICE9IDAgJiYgYml0cyA8PSBpbnRlZ2VyUGFydFdpZHRoKTsKKworICAgIHJldHVybiB+KGludGVnZXJQYXJ0KSAwID4+IChpbnRlZ2VyUGFydFdpZHRoIC0gYml0cyk7CisgIH0KKworICAvKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbG93ZXIgaGFsZiBvZiBQQVJULiAgKi8KKyAgc3RhdGljIGlubGluZSBpbnRlZ2VyUGFydAorICBsb3dIYWxmKGludGVnZXJQYXJ0IHBhcnQpCisgIHsKKyAgICByZXR1cm4gcGFydCAmIGxvd0JpdE1hc2soaW50ZWdlclBhcnRXaWR0aCAvIDIpOworICB9CisKKyAgLyogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHVwcGVyIGhhbGYgb2YgUEFSVC4gICovCisgIHN0YXRpYyBpbmxpbmUgaW50ZWdlclBhcnQKKyAgaGlnaEhhbGYoaW50ZWdlclBhcnQgcGFydCkKKyAgeworICAgIHJldHVybiBwYXJ0ID4+IChpbnRlZ2VyUGFydFdpZHRoIC8gMik7CisgIH0KKworICAvKiBSZXR1cm5zIHRoZSBiaXQgbnVtYmVyIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IHNldCBiaXQgb2YgYSBwYXJ0LgorICAgICBJZiB0aGUgaW5wdXQgbnVtYmVyIGhhcyBubyBiaXRzIHNldCAtMVUgaXMgcmV0dXJuZWQuICAqLworICBzdGF0aWMgdW5zaWduZWQgaW50CisgIHBhcnRNU0IoaW50ZWdlclBhcnQgdmFsdWUpCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgbiwgbXNiOworCisgICAgaWYgKHZhbHVlID09IDApCisgICAgICByZXR1cm4gLTFVOworCisgICAgbiA9IGludGVnZXJQYXJ0V2lkdGggLyAyOworCisgICAgbXNiID0gMDsKKyAgICBkbyB7CisgICAgICBpZiAodmFsdWUgPj4gbikgeworICAgICAgICB2YWx1ZSA+Pj0gbjsKKyAgICAgICAgbXNiICs9IG47CisgICAgICB9CisKKyAgICAgIG4gPj49IDE7CisgICAgfSB3aGlsZSAobik7CisKKyAgICByZXR1cm4gbXNiOworICB9CisKKyAgLyogUmV0dXJucyB0aGUgYml0IG51bWJlciBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgc2V0IGJpdCBvZiBhCisgICAgIHBhcnQuICBJZiB0aGUgaW5wdXQgbnVtYmVyIGhhcyBubyBiaXRzIHNldCAtMVUgaXMgcmV0dXJuZWQuICAqLworICBzdGF0aWMgdW5zaWduZWQgaW50CisgIHBhcnRMU0IoaW50ZWdlclBhcnQgdmFsdWUpCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgbiwgbHNiOworCisgICAgaWYgKHZhbHVlID09IDApCisgICAgICByZXR1cm4gLTFVOworCisgICAgbHNiID0gaW50ZWdlclBhcnRXaWR0aCAtIDE7CisgICAgbiA9IGludGVnZXJQYXJ0V2lkdGggLyAyOworCisgICAgZG8geworICAgICAgaWYgKHZhbHVlIDw8IG4pIHsKKyAgICAgICAgdmFsdWUgPDw9IG47CisgICAgICAgIGxzYiAtPSBuOworICAgICAgfQorCisgICAgICBuID4+PSAxOworICAgIH0gd2hpbGUgKG4pOworCisgICAgcmV0dXJuIGxzYjsKKyAgfQorfQorCisvKiBTZXRzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIGEgYmlnbnVtIHRvIHRoZSBpbnB1dCB2YWx1ZSwgYW5kCisgICB6ZXJvZXMgb3V0IGhpZ2hlciBwYXJ0cy4gICovCit2b2lkCitBUEludDo6dGNTZXQoaW50ZWdlclBhcnQgKmRzdCwgaW50ZWdlclBhcnQgcGFydCwgdW5zaWduZWQgaW50IHBhcnRzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICBhc3NlcnQocGFydHMgPiAwKTsKKworICBkc3RbMF0gPSBwYXJ0OworICBmb3IgKGkgPSAxOyBpIDwgcGFydHM7IGkrKykKKyAgICBkc3RbaV0gPSAwOworfQorCisvKiBBc3NpZ24gb25lIGJpZ251bSB0byBhbm90aGVyLiAgKi8KK3ZvaWQKK0FQSW50Ojp0Y0Fzc2lnbihpbnRlZ2VyUGFydCAqZHN0LCBjb25zdCBpbnRlZ2VyUGFydCAqc3JjLCB1bnNpZ25lZCBpbnQgcGFydHMpCit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBwYXJ0czsgaSsrKQorICAgIGRzdFtpXSA9IHNyY1tpXTsKK30KKworLyogUmV0dXJucyB0cnVlIGlmIGEgYmlnbnVtIGlzIHplcm8sIGZhbHNlIG90aGVyd2lzZS4gICovCitib29sCitBUEludDo6dGNJc1plcm8oY29uc3QgaW50ZWdlclBhcnQgKnNyYywgdW5zaWduZWQgaW50IHBhcnRzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgcGFydHM7IGkrKykKKyAgICBpZiAoc3JjW2ldKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBFeHRyYWN0IHRoZSBnaXZlbiBiaXQgb2YgYSBiaWdudW07IHJldHVybnMgMCBvciAxLiAgKi8KK2ludAorQVBJbnQ6OnRjRXh0cmFjdEJpdChjb25zdCBpbnRlZ2VyUGFydCAqcGFydHMsIHVuc2lnbmVkIGludCBiaXQpCit7CisgIHJldHVybiAocGFydHNbYml0IC8gaW50ZWdlclBhcnRXaWR0aF0gJgorICAgICAgICAgICgoaW50ZWdlclBhcnQpIDEgPDwgYml0ICUgaW50ZWdlclBhcnRXaWR0aCkpICE9IDA7Cit9CisKKy8qIFNldCB0aGUgZ2l2ZW4gYml0IG9mIGEgYmlnbnVtLiAqLwordm9pZAorQVBJbnQ6OnRjU2V0Qml0KGludGVnZXJQYXJ0ICpwYXJ0cywgdW5zaWduZWQgaW50IGJpdCkKK3sKKyAgcGFydHNbYml0IC8gaW50ZWdlclBhcnRXaWR0aF0gfD0gKGludGVnZXJQYXJ0KSAxIDw8IChiaXQgJSBpbnRlZ2VyUGFydFdpZHRoKTsKK30KKworLyogQ2xlYXJzIHRoZSBnaXZlbiBiaXQgb2YgYSBiaWdudW0uICovCit2b2lkCitBUEludDo6dGNDbGVhckJpdChpbnRlZ2VyUGFydCAqcGFydHMsIHVuc2lnbmVkIGludCBiaXQpCit7CisgIHBhcnRzW2JpdCAvIGludGVnZXJQYXJ0V2lkdGhdICY9CisgICAgfigoaW50ZWdlclBhcnQpIDEgPDwgKGJpdCAlIGludGVnZXJQYXJ0V2lkdGgpKTsKK30KKworLyogUmV0dXJucyB0aGUgYml0IG51bWJlciBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgc2V0IGJpdCBvZiBhCisgICBudW1iZXIuICBJZiB0aGUgaW5wdXQgbnVtYmVyIGhhcyBubyBiaXRzIHNldCAtMVUgaXMgcmV0dXJuZWQuICAqLwordW5zaWduZWQgaW50CitBUEludDo6dGNMU0IoY29uc3QgaW50ZWdlclBhcnQgKnBhcnRzLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgdW5zaWduZWQgaW50IGksIGxzYjsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBpZiAocGFydHNbaV0gIT0gMCkgeworICAgICAgICAgIGxzYiA9IHBhcnRMU0IocGFydHNbaV0pOworCisgICAgICAgICAgcmV0dXJuIGxzYiArIGkgKiBpbnRlZ2VyUGFydFdpZHRoOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIC0xVTsKK30KKworLyogUmV0dXJucyB0aGUgYml0IG51bWJlciBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBzZXQgYml0IG9mIGEgbnVtYmVyLgorICAgSWYgdGhlIGlucHV0IG51bWJlciBoYXMgbm8gYml0cyBzZXQgLTFVIGlzIHJldHVybmVkLiAgKi8KK3Vuc2lnbmVkIGludAorQVBJbnQ6OnRjTVNCKGNvbnN0IGludGVnZXJQYXJ0ICpwYXJ0cywgdW5zaWduZWQgaW50IG4pCit7CisgIHVuc2lnbmVkIGludCBtc2I7CisKKyAgZG8geworICAgIC0tbjsKKworICAgIGlmIChwYXJ0c1tuXSAhPSAwKSB7CisgICAgICBtc2IgPSBwYXJ0TVNCKHBhcnRzW25dKTsKKworICAgICAgcmV0dXJuIG1zYiArIG4gKiBpbnRlZ2VyUGFydFdpZHRoOworICAgIH0KKyAgfSB3aGlsZSAobik7CisKKyAgcmV0dXJuIC0xVTsKK30KKworLyogQ29weSB0aGUgYml0IHZlY3RvciBvZiB3aWR0aCBzcmNCSVRTIGZyb20gU1JDLCBzdGFydGluZyBhdCBiaXQKKyAgIHNyY0xTQiwgdG8gRFNULCBvZiBkc3RDT1VOVCBwYXJ0cywgc3VjaCB0aGF0IHRoZSBiaXQgc3JjTFNCIGJlY29tZXMKKyAgIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgRFNULiAgQWxsIGhpZ2ggYml0cyBhYm92ZSBzcmNCSVRTIGluCisgICBEU1QgYXJlIHplcm8tZmlsbGVkLiAgKi8KK3ZvaWQKK0FQSW50Ojp0Y0V4dHJhY3QoaW50ZWdlclBhcnQgKmRzdCwgdW5zaWduZWQgaW50IGRzdENvdW50LGNvbnN0IGludGVnZXJQYXJ0ICpzcmMsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNCaXRzLCB1bnNpZ25lZCBpbnQgc3JjTFNCKQoreworICB1bnNpZ25lZCBpbnQgZmlyc3RTcmNQYXJ0LCBkc3RQYXJ0cywgc2hpZnQsIG47CisKKyAgZHN0UGFydHMgPSAoc3JjQml0cyArIGludGVnZXJQYXJ0V2lkdGggLSAxKSAvIGludGVnZXJQYXJ0V2lkdGg7CisgIGFzc2VydChkc3RQYXJ0cyA8PSBkc3RDb3VudCk7CisKKyAgZmlyc3RTcmNQYXJ0ID0gc3JjTFNCIC8gaW50ZWdlclBhcnRXaWR0aDsKKyAgdGNBc3NpZ24gKGRzdCwgc3JjICsgZmlyc3RTcmNQYXJ0LCBkc3RQYXJ0cyk7CisKKyAgc2hpZnQgPSBzcmNMU0IgJSBpbnRlZ2VyUGFydFdpZHRoOworICB0Y1NoaWZ0UmlnaHQgKGRzdCwgZHN0UGFydHMsIHNoaWZ0KTsKKworICAvKiBXZSBub3cgaGF2ZSAoZHN0UGFydHMgKiBpbnRlZ2VyUGFydFdpZHRoIC0gc2hpZnQpIGJpdHMgZnJvbSBTUkMKKyAgICAgaW4gRFNULiAgSWYgdGhpcyBpcyBsZXNzIHRoYXQgc3JjQml0cywgYXBwZW5kIHRoZSByZXN0LCBlbHNlCisgICAgIGNsZWFyIHRoZSBoaWdoIGJpdHMuICAqLworICBuID0gZHN0UGFydHMgKiBpbnRlZ2VyUGFydFdpZHRoIC0gc2hpZnQ7CisgIGlmIChuIDwgc3JjQml0cykgeworICAgIGludGVnZXJQYXJ0IG1hc2sgPSBsb3dCaXRNYXNrIChzcmNCaXRzIC0gbik7CisgICAgZHN0W2RzdFBhcnRzIC0gMV0gfD0gKChzcmNbZmlyc3RTcmNQYXJ0ICsgZHN0UGFydHNdICYgbWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbiAlIGludGVnZXJQYXJ0V2lkdGgpOworICB9IGVsc2UgaWYgKG4gPiBzcmNCaXRzKSB7CisgICAgaWYgKHNyY0JpdHMgJSBpbnRlZ2VyUGFydFdpZHRoKQorICAgICAgZHN0W2RzdFBhcnRzIC0gMV0gJj0gbG93Qml0TWFzayAoc3JjQml0cyAlIGludGVnZXJQYXJ0V2lkdGgpOworICB9CisKKyAgLyogQ2xlYXIgaGlnaCBwYXJ0cy4gICovCisgIHdoaWxlIChkc3RQYXJ0cyA8IGRzdENvdW50KQorICAgIGRzdFtkc3RQYXJ0cysrXSA9IDA7Cit9CisKKy8qIERTVCArPSBSSFMgKyBDIHdoZXJlIEMgaXMgemVybyBvciBvbmUuICBSZXR1cm5zIHRoZSBjYXJyeSBmbGFnLiAgKi8KK2ludGVnZXJQYXJ0CitBUEludDo6dGNBZGQoaW50ZWdlclBhcnQgKmRzdCwgY29uc3QgaW50ZWdlclBhcnQgKnJocywKKyAgICAgICAgICAgICBpbnRlZ2VyUGFydCBjLCB1bnNpZ25lZCBpbnQgcGFydHMpCit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGFzc2VydChjIDw9IDEpOworCisgIGZvciAoaSA9IDA7IGkgPCBwYXJ0czsgaSsrKSB7CisgICAgaW50ZWdlclBhcnQgbDsKKworICAgIGwgPSBkc3RbaV07CisgICAgaWYgKGMpIHsKKyAgICAgIGRzdFtpXSArPSByaHNbaV0gKyAxOworICAgICAgYyA9IChkc3RbaV0gPD0gbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRzdFtpXSArPSByaHNbaV07CisgICAgICBjID0gKGRzdFtpXSA8IGwpOworICAgIH0KKyAgfQorCisgIHJldHVybiBjOworfQorCisvKiBEU1QgLT0gUkhTICsgQyB3aGVyZSBDIGlzIHplcm8gb3Igb25lLiAgUmV0dXJucyB0aGUgY2FycnkgZmxhZy4gICovCitpbnRlZ2VyUGFydAorQVBJbnQ6OnRjU3VidHJhY3QoaW50ZWdlclBhcnQgKmRzdCwgY29uc3QgaW50ZWdlclBhcnQgKnJocywKKyAgICAgICAgICAgICAgICAgIGludGVnZXJQYXJ0IGMsIHVuc2lnbmVkIGludCBwYXJ0cykKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgYXNzZXJ0KGMgPD0gMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHBhcnRzOyBpKyspIHsKKyAgICBpbnRlZ2VyUGFydCBsOworCisgICAgbCA9IGRzdFtpXTsKKyAgICBpZiAoYykgeworICAgICAgZHN0W2ldIC09IHJoc1tpXSArIDE7CisgICAgICBjID0gKGRzdFtpXSA+PSBsKTsKKyAgICB9IGVsc2UgeworICAgICAgZHN0W2ldIC09IHJoc1tpXTsKKyAgICAgIGMgPSAoZHN0W2ldID4gbCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGM7Cit9CisKKy8qIE5lZ2F0ZSBhIGJpZ251bSBpbi1wbGFjZS4gICovCit2b2lkCitBUEludDo6dGNOZWdhdGUoaW50ZWdlclBhcnQgKmRzdCwgdW5zaWduZWQgaW50IHBhcnRzKQoreworICB0Y0NvbXBsZW1lbnQoZHN0LCBwYXJ0cyk7CisgIHRjSW5jcmVtZW50KGRzdCwgcGFydHMpOworfQorCisvKiAgRFNUICs9IFNSQyAqIE1VTFRJUExJRVIgKyBDQVJSWSAgIGlmIGFkZCBpcyB0cnVlCisgICAgRFNUICA9IFNSQyAqIE1VTFRJUExJRVIgKyBDQVJSWSAgIGlmIGFkZCBpcyBmYWxzZQorCisgICAgUmVxdWlyZXMgMCA8PSBEU1RQQVJUUyA8PSBTUkNQQVJUUyArIDEuICBJZiBEU1Qgb3ZlcmxhcHMgU1JDCisgICAgdGhleSBtdXN0IHN0YXJ0IGF0IHRoZSBzYW1lIHBvaW50LCBpLmUuIERTVCA9PSBTUkMuCisKKyAgICBJZiBEU1RQQVJUUyA9PSBTUkNQQVJUUyArIDEgbm8gb3ZlcmZsb3cgb2NjdXJzIGFuZCB6ZXJvIGlzCisgICAgcmV0dXJuZWQuICBPdGhlcndpc2UgRFNUIGlzIGZpbGxlZCB3aXRoIHRoZSBsZWFzdCBzaWduaWZpY2FudAorICAgIERTVFBBUlRTIHBhcnRzIG9mIHRoZSByZXN1bHQsIGFuZCBpZiBhbGwgb2YgdGhlIG9taXR0ZWQgaGlnaGVyCisgICAgcGFydHMgd2VyZSB6ZXJvIHJldHVybiB6ZXJvLCBvdGhlcndpc2Ugb3ZlcmZsb3cgb2NjdXJyZWQgYW5kCisgICAgcmV0dXJuIG9uZS4gICovCitpbnQKK0FQSW50Ojp0Y011bHRpcGx5UGFydChpbnRlZ2VyUGFydCAqZHN0LCBjb25zdCBpbnRlZ2VyUGFydCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgIGludGVnZXJQYXJ0IG11bHRpcGxpZXIsIGludGVnZXJQYXJ0IGNhcnJ5LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNQYXJ0cywgdW5zaWduZWQgaW50IGRzdFBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkKQoreworICB1bnNpZ25lZCBpbnQgaSwgbjsKKworICAvKiBPdGhlcndpc2Ugb3VyIHdyaXRlcyBvZiBEU1Qga2lsbCBvdXIgbGF0ZXIgcmVhZHMgb2YgU1JDLiAgKi8KKyAgYXNzZXJ0KGRzdCA8PSBzcmMgfHwgZHN0ID49IHNyYyArIHNyY1BhcnRzKTsKKyAgYXNzZXJ0KGRzdFBhcnRzIDw9IHNyY1BhcnRzICsgMSk7CisKKyAgLyogTiBsb29wczsgbWluaW11bSBvZiBkc3RQYXJ0cyBhbmQgc3JjUGFydHMuICAqLworICBuID0gZHN0UGFydHMgPCBzcmNQYXJ0cyA/IGRzdFBhcnRzOiBzcmNQYXJ0czsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgaW50ZWdlclBhcnQgbG93LCBtaWQsIGhpZ2gsIHNyY1BhcnQ7CisKKyAgICAgIC8qIFsgTE9XLCBISUdIIF0gPSBNVUxUSVBMSUVSICogU1JDW2ldICsgRFNUW2ldICsgQ0FSUlkuCisKKyAgICAgICAgIFRoaXMgY2Fubm90IG92ZXJmbG93LCBiZWNhdXNlCisKKyAgICAgICAgIChuIC0gMSkgKiAobiAtIDEpICsgMiAobiAtIDEpID0gKG4gLSAxKSAqIChuICsgMSkKKworICAgICAgICAgd2hpY2ggaXMgbGVzcyB0aGFuIG5eMi4gICovCisKKyAgICBzcmNQYXJ0ID0gc3JjW2ldOworCisgICAgaWYgKG11bHRpcGxpZXIgPT0gMCB8fCBzcmNQYXJ0ID09IDApICAgICAgICB7CisgICAgICBsb3cgPSBjYXJyeTsKKyAgICAgIGhpZ2ggPSAwOworICAgIH0gZWxzZSB7CisgICAgICBsb3cgPSBsb3dIYWxmKHNyY1BhcnQpICogbG93SGFsZihtdWx0aXBsaWVyKTsKKyAgICAgIGhpZ2ggPSBoaWdoSGFsZihzcmNQYXJ0KSAqIGhpZ2hIYWxmKG11bHRpcGxpZXIpOworCisgICAgICBtaWQgPSBsb3dIYWxmKHNyY1BhcnQpICogaGlnaEhhbGYobXVsdGlwbGllcik7CisgICAgICBoaWdoICs9IGhpZ2hIYWxmKG1pZCk7CisgICAgICBtaWQgPDw9IGludGVnZXJQYXJ0V2lkdGggLyAyOworICAgICAgaWYgKGxvdyArIG1pZCA8IGxvdykKKyAgICAgICAgaGlnaCsrOworICAgICAgbG93ICs9IG1pZDsKKworICAgICAgbWlkID0gaGlnaEhhbGYoc3JjUGFydCkgKiBsb3dIYWxmKG11bHRpcGxpZXIpOworICAgICAgaGlnaCArPSBoaWdoSGFsZihtaWQpOworICAgICAgbWlkIDw8PSBpbnRlZ2VyUGFydFdpZHRoIC8gMjsKKyAgICAgIGlmIChsb3cgKyBtaWQgPCBsb3cpCisgICAgICAgIGhpZ2grKzsKKyAgICAgIGxvdyArPSBtaWQ7CisKKyAgICAgIC8qIE5vdyBhZGQgY2FycnkuICAqLworICAgICAgaWYgKGxvdyArIGNhcnJ5IDwgbG93KQorICAgICAgICBoaWdoKys7CisgICAgICBsb3cgKz0gY2Fycnk7CisgICAgfQorCisgICAgaWYgKGFkZCkgeworICAgICAgLyogQW5kIG5vdyBEU1RbaV0sIGFuZCBzdG9yZSB0aGUgbmV3IGxvdyBwYXJ0IHRoZXJlLiAgKi8KKyAgICAgIGlmIChsb3cgKyBkc3RbaV0gPCBsb3cpCisgICAgICAgIGhpZ2grKzsKKyAgICAgIGRzdFtpXSArPSBsb3c7CisgICAgfSBlbHNlCisgICAgICBkc3RbaV0gPSBsb3c7CisKKyAgICBjYXJyeSA9IGhpZ2g7CisgIH0KKworICBpZiAoaSA8IGRzdFBhcnRzKSB7CisgICAgLyogRnVsbCBtdWx0aXBsaWNhdGlvbiwgdGhlcmUgaXMgbm8gb3ZlcmZsb3cuICAqLworICAgIGFzc2VydChpICsgMSA9PSBkc3RQYXJ0cyk7CisgICAgZHN0W2ldID0gY2Fycnk7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgLyogV2Ugb3ZlcmZsb3dlZCBpZiB0aGVyZSBpcyBjYXJyeS4gICovCisgICAgaWYgKGNhcnJ5KQorICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBXZSB3b3VsZCBvdmVyZmxvdyBpZiBhbnkgc2lnbmlmaWNhbnQgdW53cml0dGVuIHBhcnRzIHdvdWxkIGJlCisgICAgICAgbm9uLXplcm8uICBUaGlzIGlzIHRydWUgaWYgYW55IHJlbWFpbmluZyBzcmMgcGFydHMgYXJlIG5vbi16ZXJvCisgICAgICAgYW5kIHRoZSBtdWx0aXBsaWVyIGlzIG5vbi16ZXJvLiAgKi8KKyAgICBpZiAobXVsdGlwbGllcikKKyAgICAgIGZvciAoOyBpIDwgc3JjUGFydHM7IGkrKykKKyAgICAgICAgaWYgKHNyY1tpXSkKKyAgICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIFdlIGZpdHRlZCBpbiB0aGUgbmFycm93IGRlc3RpbmF0aW9uLiAgKi8KKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiBEU1QgPSBMSFMgKiBSSFMsIHdoZXJlIERTVCBoYXMgdGhlIHNhbWUgd2lkdGggYXMgdGhlIG9wZXJhbmRzIGFuZAorICAgaXMgZmlsbGVkIHdpdGggdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnRzIG9mIHRoZSByZXN1bHQuICBSZXR1cm5zCisgICBvbmUgaWYgb3ZlcmZsb3cgb2NjdXJyZWQsIG90aGVyd2lzZSB6ZXJvLiAgRFNUIG11c3QgYmUgZGlzam9pbnQKKyAgIGZyb20gYm90aCBvcGVyYW5kcy4gICovCitpbnQKK0FQSW50Ojp0Y011bHRpcGx5KGludGVnZXJQYXJ0ICpkc3QsIGNvbnN0IGludGVnZXJQYXJ0ICpsaHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlZ2VyUGFydCAqcmhzLCB1bnNpZ25lZCBpbnQgcGFydHMpCit7CisgIHVuc2lnbmVkIGludCBpOworICBpbnQgb3ZlcmZsb3c7CisKKyAgYXNzZXJ0KGRzdCAhPSBsaHMgJiYgZHN0ICE9IHJocyk7CisKKyAgb3ZlcmZsb3cgPSAwOworICB0Y1NldChkc3QsIDAsIHBhcnRzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcGFydHM7IGkrKykKKyAgICBvdmVyZmxvdyB8PSB0Y011bHRpcGx5UGFydCgmZHN0W2ldLCBsaHMsIHJoc1tpXSwgMCwgcGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgLSBpLCB0cnVlKTsKKworICByZXR1cm4gb3ZlcmZsb3c7Cit9CisKKy8qIERTVCA9IExIUyAqIFJIUywgd2hlcmUgRFNUIGhhcyB3aWR0aCB0aGUgc3VtIG9mIHRoZSB3aWR0aHMgb2YgdGhlCisgICBvcGVyYW5kcy4gIE5vIG92ZXJmbG93IG9jY3Vycy4gIERTVCBtdXN0IGJlIGRpc2pvaW50IGZyb20gYm90aAorICAgb3BlcmFuZHMuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFydHMgcmVxdWlyZWQgdG8gaG9sZCB0aGUKKyAgIHJlc3VsdC4gICovCit1bnNpZ25lZCBpbnQKK0FQSW50Ojp0Y0Z1bGxNdWx0aXBseShpbnRlZ2VyUGFydCAqZHN0LCBjb25zdCBpbnRlZ2VyUGFydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVnZXJQYXJ0ICpyaHMsIHVuc2lnbmVkIGludCBsaHNQYXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmhzUGFydHMpCit7CisgIC8qIFB1dCB0aGUgbmFycm93ZXIgbnVtYmVyIG9uIHRoZSBMSFMgZm9yIGxlc3MgbG9vcHMgYmVsb3cuICAqLworICBpZiAobGhzUGFydHMgPiByaHNQYXJ0cykgeworICAgIHJldHVybiB0Y0Z1bGxNdWx0aXBseSAoZHN0LCByaHMsIGxocywgcmhzUGFydHMsIGxoc1BhcnRzKTsKKyAgfSBlbHNlIHsKKyAgICB1bnNpZ25lZCBpbnQgbjsKKworICAgIGFzc2VydChkc3QgIT0gbGhzICYmIGRzdCAhPSByaHMpOworCisgICAgdGNTZXQoZHN0LCAwLCByaHNQYXJ0cyk7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbGhzUGFydHM7IG4rKykKKyAgICAgIHRjTXVsdGlwbHlQYXJ0KCZkc3Rbbl0sIHJocywgbGhzW25dLCAwLCByaHNQYXJ0cywgcmhzUGFydHMgKyAxLCB0cnVlKTsKKworICAgIG4gPSBsaHNQYXJ0cyArIHJoc1BhcnRzOworCisgICAgcmV0dXJuIG4gLSAoZHN0W24gLSAxXSA9PSAwKTsKKyAgfQorfQorCisvKiBJZiBSSFMgaXMgemVybyBMSFMgYW5kIFJFTUFJTkRFUiBhcmUgbGVmdCB1bmNoYW5nZWQsIHJldHVybiBvbmUuCisgICBPdGhlcndpc2Ugc2V0IExIUyB0byBMSFMgLyBSSFMgd2l0aCB0aGUgZnJhY3Rpb25hbCBwYXJ0IGRpc2NhcmRlZCwKKyAgIHNldCBSRU1BSU5ERVIgdG8gdGhlIHJlbWFpbmRlciwgcmV0dXJuIHplcm8uICBpLmUuCisKKyAgIE9MRF9MSFMgPSBSSFMgKiBMSFMgKyBSRU1BSU5ERVIKKworICAgU0NSQVRDSCBpcyBhIGJpZ251bSBvZiB0aGUgc2FtZSBzaXplIGFzIHRoZSBvcGVyYW5kcyBhbmQgcmVzdWx0IGZvcgorICAgdXNlIGJ5IHRoZSByb3V0aW5lOyBpdHMgY29udGVudHMgbmVlZCBub3QgYmUgaW5pdGlhbGl6ZWQgYW5kIGFyZQorICAgZGVzdHJveWVkLiAgTEhTLCBSRU1BSU5ERVIgYW5kIFNDUkFUQ0ggbXVzdCBiZSBkaXN0aW5jdC4KKyovCitpbnQKK0FQSW50Ojp0Y0RpdmlkZShpbnRlZ2VyUGFydCAqbGhzLCBjb25zdCBpbnRlZ2VyUGFydCAqcmhzLAorICAgICAgICAgICAgICAgIGludGVnZXJQYXJ0ICpyZW1haW5kZXIsIGludGVnZXJQYXJ0ICpzcmhzLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYXJ0cykKK3sKKyAgdW5zaWduZWQgaW50IG4sIHNoaWZ0Q291bnQ7CisgIGludGVnZXJQYXJ0IG1hc2s7CisKKyAgYXNzZXJ0KGxocyAhPSByZW1haW5kZXIgJiYgbGhzICE9IHNyaHMgJiYgcmVtYWluZGVyICE9IHNyaHMpOworCisgIHNoaWZ0Q291bnQgPSB0Y01TQihyaHMsIHBhcnRzKSArIDE7CisgIGlmIChzaGlmdENvdW50ID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgc2hpZnRDb3VudCA9IHBhcnRzICogaW50ZWdlclBhcnRXaWR0aCAtIHNoaWZ0Q291bnQ7CisgIG4gPSBzaGlmdENvdW50IC8gaW50ZWdlclBhcnRXaWR0aDsKKyAgbWFzayA9IChpbnRlZ2VyUGFydCkgMSA8PCAoc2hpZnRDb3VudCAlIGludGVnZXJQYXJ0V2lkdGgpOworCisgIHRjQXNzaWduKHNyaHMsIHJocywgcGFydHMpOworICB0Y1NoaWZ0TGVmdChzcmhzLCBwYXJ0cywgc2hpZnRDb3VudCk7CisgIHRjQXNzaWduKHJlbWFpbmRlciwgbGhzLCBwYXJ0cyk7CisgIHRjU2V0KGxocywgMCwgcGFydHMpOworCisgIC8qIExvb3AsIHN1YnRyYWN0aW5nIFNSSFMgaWYgUkVNQUlOREVSIGlzIGdyZWF0ZXIgYW5kIGFkZGluZyB0aGF0IHRvCisgICAgIHRoZSB0b3RhbC4gICovCisgIGZvciAoOzspIHsKKyAgICAgIGludCBjb21wYXJlOworCisgICAgICBjb21wYXJlID0gdGNDb21wYXJlKHJlbWFpbmRlciwgc3JocywgcGFydHMpOworICAgICAgaWYgKGNvbXBhcmUgPj0gMCkgeworICAgICAgICB0Y1N1YnRyYWN0KHJlbWFpbmRlciwgc3JocywgMCwgcGFydHMpOworICAgICAgICBsaHNbbl0gfD0gbWFzazsKKyAgICAgIH0KKworICAgICAgaWYgKHNoaWZ0Q291bnQgPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzaGlmdENvdW50LS07CisgICAgICB0Y1NoaWZ0UmlnaHQoc3JocywgcGFydHMsIDEpOworICAgICAgaWYgKChtYXNrID4+PSAxKSA9PSAwKQorICAgICAgICBtYXNrID0gKGludGVnZXJQYXJ0KSAxIDw8IChpbnRlZ2VyUGFydFdpZHRoIC0gMSksIG4tLTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLyogU2hpZnQgYSBiaWdudW0gbGVmdCBDT1VOVCBiaXRzIGluLXBsYWNlLiAgU2hpZnRlZCBpbiBiaXRzIGFyZSB6ZXJvLgorICAgVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiBDT1VOVC4gICovCit2b2lkCitBUEludDo6dGNTaGlmdExlZnQoaW50ZWdlclBhcnQgKmRzdCwgdW5zaWduZWQgaW50IHBhcnRzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisgIGlmIChjb3VudCkgeworICAgIHVuc2lnbmVkIGludCBqdW1wLCBzaGlmdDsKKworICAgIC8qIEp1bXAgaXMgdGhlIGludGVyLXBhcnQganVtcDsgc2hpZnQgaXMgaXMgaW50cmEtcGFydCBzaGlmdC4gICovCisgICAganVtcCA9IGNvdW50IC8gaW50ZWdlclBhcnRXaWR0aDsKKyAgICBzaGlmdCA9IGNvdW50ICUgaW50ZWdlclBhcnRXaWR0aDsKKworICAgIHdoaWxlIChwYXJ0cyA+IGp1bXApIHsKKyAgICAgIGludGVnZXJQYXJ0IHBhcnQ7CisKKyAgICAgIHBhcnRzLS07CisKKyAgICAgIC8qIGRzdFtpXSBjb21lcyBmcm9tIHRoZSB0d28gcGFydHMgc3JjW2kgLSBqdW1wXSBhbmQsIGlmIHdlIGhhdmUKKyAgICAgICAgIGFuIGludHJhLXBhcnQgc2hpZnQsIHNyY1tpIC0ganVtcCAtIDFdLiAgKi8KKyAgICAgIHBhcnQgPSBkc3RbcGFydHMgLSBqdW1wXTsKKyAgICAgIGlmIChzaGlmdCkgeworICAgICAgICBwYXJ0IDw8PSBzaGlmdDsKKyAgICAgICAgaWYgKHBhcnRzID49IGp1bXAgKyAxKQorICAgICAgICAgIHBhcnQgfD0gZHN0W3BhcnRzIC0ganVtcCAtIDFdID4+IChpbnRlZ2VyUGFydFdpZHRoIC0gc2hpZnQpOworICAgICAgfQorCisgICAgICBkc3RbcGFydHNdID0gcGFydDsKKyAgICB9CisKKyAgICB3aGlsZSAocGFydHMgPiAwKQorICAgICAgZHN0Wy0tcGFydHNdID0gMDsKKyAgfQorfQorCisvKiBTaGlmdCBhIGJpZ251bSByaWdodCBDT1VOVCBiaXRzIGluLXBsYWNlLiAgU2hpZnRlZCBpbiBiaXRzIGFyZQorICAgemVyby4gIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gQ09VTlQuICAqLwordm9pZAorQVBJbnQ6OnRjU2hpZnRSaWdodChpbnRlZ2VyUGFydCAqZHN0LCB1bnNpZ25lZCBpbnQgcGFydHMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKyAgaWYgKGNvdW50KSB7CisgICAgdW5zaWduZWQgaW50IGksIGp1bXAsIHNoaWZ0OworCisgICAgLyogSnVtcCBpcyB0aGUgaW50ZXItcGFydCBqdW1wOyBzaGlmdCBpcyBpcyBpbnRyYS1wYXJ0IHNoaWZ0LiAgKi8KKyAgICBqdW1wID0gY291bnQgLyBpbnRlZ2VyUGFydFdpZHRoOworICAgIHNoaWZ0ID0gY291bnQgJSBpbnRlZ2VyUGFydFdpZHRoOworCisgICAgLyogUGVyZm9ybSB0aGUgc2hpZnQuICBUaGlzIGxlYXZlcyB0aGUgbW9zdCBzaWduaWZpY2FudCBDT1VOVCBiaXRzCisgICAgICAgb2YgdGhlIHJlc3VsdCBhdCB6ZXJvLiAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHM7IGkrKykgeworICAgICAgaW50ZWdlclBhcnQgcGFydDsKKworICAgICAgaWYgKGkgKyBqdW1wID49IHBhcnRzKSB7CisgICAgICAgIHBhcnQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFydCA9IGRzdFtpICsganVtcF07CisgICAgICAgIGlmIChzaGlmdCkgeworICAgICAgICAgIHBhcnQgPj49IHNoaWZ0OworICAgICAgICAgIGlmIChpICsganVtcCArIDEgPCBwYXJ0cykKKyAgICAgICAgICAgIHBhcnQgfD0gZHN0W2kgKyBqdW1wICsgMV0gPDwgKGludGVnZXJQYXJ0V2lkdGggLSBzaGlmdCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZHN0W2ldID0gcGFydDsKKyAgICB9CisgIH0KK30KKworLyogQml0d2lzZSBhbmQgb2YgdHdvIGJpZ251bXMuICAqLwordm9pZAorQVBJbnQ6OnRjQW5kKGludGVnZXJQYXJ0ICpkc3QsIGNvbnN0IGludGVnZXJQYXJ0ICpyaHMsIHVuc2lnbmVkIGludCBwYXJ0cykKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHBhcnRzOyBpKyspCisgICAgZHN0W2ldICY9IHJoc1tpXTsKK30KKworLyogQml0d2lzZSBpbmNsdXNpdmUgb3Igb2YgdHdvIGJpZ251bXMuICAqLwordm9pZAorQVBJbnQ6OnRjT3IoaW50ZWdlclBhcnQgKmRzdCwgY29uc3QgaW50ZWdlclBhcnQgKnJocywgdW5zaWduZWQgaW50IHBhcnRzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgcGFydHM7IGkrKykKKyAgICBkc3RbaV0gfD0gcmhzW2ldOworfQorCisvKiBCaXR3aXNlIGV4Y2x1c2l2ZSBvciBvZiB0d28gYmlnbnVtcy4gICovCit2b2lkCitBUEludDo6dGNYb3IoaW50ZWdlclBhcnQgKmRzdCwgY29uc3QgaW50ZWdlclBhcnQgKnJocywgdW5zaWduZWQgaW50IHBhcnRzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgcGFydHM7IGkrKykKKyAgICBkc3RbaV0gXj0gcmhzW2ldOworfQorCisvKiBDb21wbGVtZW50IGEgYmlnbnVtIGluLXBsYWNlLiAgKi8KK3ZvaWQKK0FQSW50Ojp0Y0NvbXBsZW1lbnQoaW50ZWdlclBhcnQgKmRzdCwgdW5zaWduZWQgaW50IHBhcnRzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgcGFydHM7IGkrKykKKyAgICBkc3RbaV0gPSB+ZHN0W2ldOworfQorCisvKiBDb21wYXJpc29uICh1bnNpZ25lZCkgb2YgdHdvIGJpZ251bXMuICAqLworaW50CitBUEludDo6dGNDb21wYXJlKGNvbnN0IGludGVnZXJQYXJ0ICpsaHMsIGNvbnN0IGludGVnZXJQYXJ0ICpyaHMsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYXJ0cykKK3sKKyAgd2hpbGUgKHBhcnRzKSB7CisgICAgICBwYXJ0cy0tOworICAgICAgaWYgKGxoc1twYXJ0c10gPT0gcmhzW3BhcnRzXSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChsaHNbcGFydHNdID4gcmhzW3BhcnRzXSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEluY3JlbWVudCBhIGJpZ251bSBpbi1wbGFjZSwgcmV0dXJuIHRoZSBjYXJyeSBmbGFnLiAgKi8KK2ludGVnZXJQYXJ0CitBUEludDo6dGNJbmNyZW1lbnQoaW50ZWdlclBhcnQgKmRzdCwgdW5zaWduZWQgaW50IHBhcnRzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgcGFydHM7IGkrKykKKyAgICBpZiAoKytkc3RbaV0gIT0gMCkKKyAgICAgIGJyZWFrOworCisgIHJldHVybiBpID09IHBhcnRzOworfQorCisvKiBTZXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IEJJVFMgYml0cyBvZiBhIGJpZ251bSwgY2xlYXIgdGhlCisgICByZXN0LiAgKi8KK3ZvaWQKK0FQSW50Ojp0Y1NldExlYXN0U2lnbmlmaWNhbnRCaXRzKGludGVnZXJQYXJ0ICpkc3QsIHVuc2lnbmVkIGludCBwYXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiaXRzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGJpdHMgPiBpbnRlZ2VyUGFydFdpZHRoKSB7CisgICAgZHN0W2krK10gPSB+KGludGVnZXJQYXJ0KSAwOworICAgIGJpdHMgLT0gaW50ZWdlclBhcnRXaWR0aDsKKyAgfQorCisgIGlmIChiaXRzKQorICAgIGRzdFtpKytdID0gfihpbnRlZ2VyUGFydCkgMCA+PiAoaW50ZWdlclBhcnRXaWR0aCAtIGJpdHMpOworCisgIHdoaWxlIChpIDwgcGFydHMpCisgICAgZHN0W2krK10gPSAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvQWxsb2NhdG9yLmNwcCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0FsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkZjI2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0FsbG9jYXRvci5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8vPT09LS0tIEFsbG9jYXRvci5jcHAgLSBTaW1wbGUgbWVtb3J5IGFsbG9jYXRpb24gYWJzdHJhY3Rpb24gLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEJ1bXBQdHJBbGxvY2F0b3IgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlY3ljbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTWVtb3J5LmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitCdW1wUHRyQWxsb2NhdG9yOjpCdW1wUHRyQWxsb2NhdG9yKHNpemVfdCBzaXplLCBzaXplX3QgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGFiQWxsb2NhdG9yICZhbGxvY2F0b3IpCisgICAgOiBTbGFiU2l6ZShzaXplKSwgU2l6ZVRocmVzaG9sZCh0aHJlc2hvbGQpLCBBbGxvY2F0b3IoYWxsb2NhdG9yKSwKKyAgICAgIEN1clNsYWIoMCksIEJ5dGVzQWxsb2NhdGVkKDApIHsgfQorCitCdW1wUHRyQWxsb2NhdG9yOjp+QnVtcFB0ckFsbG9jYXRvcigpIHsKKyAgRGVhbGxvY2F0ZVNsYWJzKEN1clNsYWIpOworfQorCisvLy8gQWxpZ25QdHIgLSBBbGlnbiBQdHIgdG8gQWxpZ25tZW50IGJ5dGVzLCByb3VuZGluZyB1cC4gIEFsaWdubWVudCBzaG91bGQKKy8vLyBiZSBhIHBvd2VyIG9mIHR3by4gIFRoaXMgbWV0aG9kIHJvdW5kcyB1cCwgc28gQWxpZ25QdHIoNywgNCkgPT0gOCBhbmQKKy8vLyBBbGlnblB0cig4LCA0KSA9PSA4LgorY2hhciAqQnVtcFB0ckFsbG9jYXRvcjo6QWxpZ25QdHIoY2hhciAqUHRyLCBzaXplX3QgQWxpZ25tZW50KSB7CisgIGFzc2VydChBbGlnbm1lbnQgJiYgKEFsaWdubWVudCAmIChBbGlnbm1lbnQgLSAxKSkgPT0gMCAmJgorICAgICAgICAgIkFsaWdubWVudCBpcyBub3QgYSBwb3dlciBvZiB0d28hIik7CisKKyAgLy8gRG8gdGhlIGFsaWdubWVudC4KKyAgcmV0dXJuIChjaGFyKikoKCh1aW50cHRyX3QpUHRyICsgQWxpZ25tZW50IC0gMSkgJgorICAgICAgICAgICAgICAgICB+KHVpbnRwdHJfdCkoQWxpZ25tZW50IC0gMSkpOworfQorCisvLy8gU3RhcnROZXdTbGFiIC0gQWxsb2NhdGUgYSBuZXcgc2xhYiBhbmQgbW92ZSB0aGUgYnVtcCBwb2ludGVycyBvdmVyIGludG8KKy8vLyB0aGUgbmV3IHNsYWIuICBNb2RpZmllcyBDdXJQdHIgYW5kIEVuZC4KK3ZvaWQgQnVtcFB0ckFsbG9jYXRvcjo6U3RhcnROZXdTbGFiKCkgeworICBNZW1TbGFiICpOZXdTbGFiID0gQWxsb2NhdG9yLkFsbG9jYXRlKFNsYWJTaXplKTsKKyAgTmV3U2xhYi0+TmV4dFB0ciA9IEN1clNsYWI7CisgIEN1clNsYWIgPSBOZXdTbGFiOworICBDdXJQdHIgPSAoY2hhciopKEN1clNsYWIgKyAxKTsKKyAgRW5kID0gKChjaGFyKilDdXJTbGFiKSArIEN1clNsYWItPlNpemU7Cit9CisKKy8vLyBEZWFsbG9jYXRlU2xhYnMgLSBEZWFsbG9jYXRlIGFsbCBtZW1vcnkgc2xhYnMgYWZ0ZXIgYW5kIGluY2x1ZGluZyB0aGlzCisvLy8gb25lLgordm9pZCBCdW1wUHRyQWxsb2NhdG9yOjpEZWFsbG9jYXRlU2xhYnMoTWVtU2xhYiAqU2xhYikgeworICB3aGlsZSAoU2xhYikgeworICAgIE1lbVNsYWIgKk5leHRTbGFiID0gU2xhYi0+TmV4dFB0cjsKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8gUG9pc29uIHRoZSBtZW1vcnkgc28gc3RhbGUgcG9pbnRlcnMgY3Jhc2ggc29vbmVyLiAgTm90ZSB3ZSBtdXN0CisgICAgLy8gcHJlc2VydmUgdGhlIFNpemUgYW5kIE5leHRQdHIgZmllbGRzIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgc3lzOjpNZW1vcnk6OnNldFJhbmdlV3JpdGFibGUoU2xhYiArIDEsIFNsYWItPlNpemUgLSBzaXplb2YoTWVtU2xhYikpOworICAgIG1lbXNldChTbGFiICsgMSwgMHhDRCwgU2xhYi0+U2l6ZSAtIHNpemVvZihNZW1TbGFiKSk7CisjZW5kaWYKKyAgICBBbGxvY2F0b3IuRGVhbGxvY2F0ZShTbGFiKTsKKyAgICBTbGFiID0gTmV4dFNsYWI7CisgIH0KK30KKworLy8vIFJlc2V0IC0gRGVhbGxvY2F0ZSBhbGwgYnV0IHRoZSBjdXJyZW50IHNsYWIgYW5kIHJlc2V0IHRoZSBjdXJyZW50IHBvaW50ZXIKKy8vLyB0byB0aGUgYmVnaW5uaW5nIG9mIGl0LCBmcmVlaW5nIGFsbCBtZW1vcnkgYWxsb2NhdGVkIHNvIGZhci4KK3ZvaWQgQnVtcFB0ckFsbG9jYXRvcjo6UmVzZXQoKSB7CisgIGlmICghQ3VyU2xhYikKKyAgICByZXR1cm47CisgIERlYWxsb2NhdGVTbGFicyhDdXJTbGFiLT5OZXh0UHRyKTsKKyAgQ3VyU2xhYi0+TmV4dFB0ciA9IDA7CisgIEN1clB0ciA9IChjaGFyKikoQ3VyU2xhYiArIDEpOworICBFbmQgPSAoKGNoYXIqKUN1clNsYWIpICsgQ3VyU2xhYi0+U2l6ZTsKK30KKworLy8vIEFsbG9jYXRlIC0gQWxsb2NhdGUgc3BhY2UgYXQgdGhlIHNwZWNpZmllZCBhbGlnbm1lbnQuCisvLy8KK3ZvaWQgKkJ1bXBQdHJBbGxvY2F0b3I6OkFsbG9jYXRlKHNpemVfdCBTaXplLCBzaXplX3QgQWxpZ25tZW50KSB7CisgIGlmICghQ3VyU2xhYikgLy8gU3RhcnQgYSBuZXcgc2xhYiBpZiB3ZSBoYXZlbid0IGFsbG9jYXRlZCBvbmUgYWxyZWFkeS4KKyAgICBTdGFydE5ld1NsYWIoKTsKKworICAvLyBLZWVwIHRyYWNrIG9mIGhvdyBtYW55IGJ5dGVzIHdlJ3ZlIGFsbG9jYXRlZC4KKyAgQnl0ZXNBbGxvY2F0ZWQgKz0gU2l6ZTsKKworICAvLyAwLWJ5dGUgYWxpZ25tZW50IG1lYW5zIDEtYnl0ZSBhbGlnbm1lbnQuCisgIGlmIChBbGlnbm1lbnQgPT0gMCkgQWxpZ25tZW50ID0gMTsKKworICAvLyBBbGxvY2F0ZSB0aGUgYWxpZ25lZCBzcGFjZSwgZ29pbmcgZm9yd2FyZHMgZnJvbSBDdXJQdHIuCisgIGNoYXIgKlB0ciA9IEFsaWduUHRyKEN1clB0ciwgQWxpZ25tZW50KTsKKworICAvLyBDaGVjayBpZiB3ZSBjYW4gaG9sZCBpdC4KKyAgaWYgKFB0ciArIFNpemUgPD0gRW5kKSB7CisgICAgQ3VyUHRyID0gUHRyICsgU2l6ZTsKKyAgICByZXR1cm4gUHRyOworICB9CisKKyAgLy8gSWYgU2l6ZSBpcyByZWFsbHkgYmlnLCBhbGxvY2F0ZSBhIHNlcGFyYXRlIHNsYWIgZm9yIGl0LgorICBzaXplX3QgUGFkZGVkU2l6ZSA9IFNpemUgKyBzaXplb2YoTWVtU2xhYikgKyBBbGlnbm1lbnQgLSAxOworICBpZiAoUGFkZGVkU2l6ZSA+IFNpemVUaHJlc2hvbGQpIHsKKyAgICBNZW1TbGFiICpOZXdTbGFiID0gQWxsb2NhdG9yLkFsbG9jYXRlKFBhZGRlZFNpemUpOworCisgICAgLy8gUHV0IHRoZSBuZXcgc2xhYiBhZnRlciB0aGUgY3VycmVudCBzbGFiLCBzaW5jZSB3ZSBhcmUgbm90IGFsbG9jYXRpbmcKKyAgICAvLyBpbnRvIGl0LgorICAgIE5ld1NsYWItPk5leHRQdHIgPSBDdXJTbGFiLT5OZXh0UHRyOworICAgIEN1clNsYWItPk5leHRQdHIgPSBOZXdTbGFiOworCisgICAgUHRyID0gQWxpZ25QdHIoKGNoYXIqKShOZXdTbGFiICsgMSksIEFsaWdubWVudCk7CisgICAgYXNzZXJ0KCh1aW50cHRyX3QpUHRyICsgU2l6ZSA8PSAodWludHB0cl90KU5ld1NsYWIgKyBOZXdTbGFiLT5TaXplKTsKKyAgICByZXR1cm4gUHRyOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBzdGFydCBhIG5ldyBzbGFiIGFuZCB0cnkgYWdhaW4uCisgIFN0YXJ0TmV3U2xhYigpOworICBQdHIgPSBBbGlnblB0cihDdXJQdHIsIEFsaWdubWVudCk7CisgIEN1clB0ciA9IFB0ciArIFNpemU7CisgIGFzc2VydChDdXJQdHIgPD0gRW5kICYmICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ISIpOworICByZXR1cm4gUHRyOworfQorCit1bnNpZ25lZCBCdW1wUHRyQWxsb2NhdG9yOjpHZXROdW1TbGFicygpIGNvbnN0IHsKKyAgdW5zaWduZWQgTnVtU2xhYnMgPSAwOworICBmb3IgKE1lbVNsYWIgKlNsYWIgPSBDdXJTbGFiOyBTbGFiICE9IDA7IFNsYWIgPSBTbGFiLT5OZXh0UHRyKSB7CisgICAgKytOdW1TbGFiczsKKyAgfQorICByZXR1cm4gTnVtU2xhYnM7Cit9CisKK3ZvaWQgQnVtcFB0ckFsbG9jYXRvcjo6UHJpbnRTdGF0cygpIGNvbnN0IHsKKyAgdW5zaWduZWQgTnVtU2xhYnMgPSAwOworICBzaXplX3QgVG90YWxNZW1vcnkgPSAwOworICBmb3IgKE1lbVNsYWIgKlNsYWIgPSBDdXJTbGFiOyBTbGFiICE9IDA7IFNsYWIgPSBTbGFiLT5OZXh0UHRyKSB7CisgICAgVG90YWxNZW1vcnkgKz0gU2xhYi0+U2l6ZTsKKyAgICArK051bVNsYWJzOworICB9CisKKyAgZXJycygpIDw8ICJcbk51bWJlciBvZiBtZW1vcnkgcmVnaW9uczogIiA8PCBOdW1TbGFicyA8PCAnXG4nCisgICAgICAgICA8PCAiQnl0ZXMgdXNlZDogIiA8PCBCeXRlc0FsbG9jYXRlZCA8PCAnXG4nCisgICAgICAgICA8PCAiQnl0ZXMgYWxsb2NhdGVkOiAiIDw8IFRvdGFsTWVtb3J5IDw8ICdcbicKKyAgICAgICAgIDw8ICJCeXRlcyB3YXN0ZWQ6ICIgPDwgKFRvdGFsTWVtb3J5IC0gQnl0ZXNBbGxvY2F0ZWQpCisgICAgICAgICA8PCAiIChpbmNsdWRlcyBhbGlnbm1lbnQsIGV0YylcbiI7Cit9CisKK01hbGxvY1NsYWJBbGxvY2F0b3IgQnVtcFB0ckFsbG9jYXRvcjo6RGVmYXVsdFNsYWJBbGxvY2F0b3IgPQorICBNYWxsb2NTbGFiQWxsb2NhdG9yKCk7CisKK1NsYWJBbGxvY2F0b3I6On5TbGFiQWxsb2NhdG9yKCkgeyB9CisKK01hbGxvY1NsYWJBbGxvY2F0b3I6On5NYWxsb2NTbGFiQWxsb2NhdG9yKCkgeyB9CisKK01lbVNsYWIgKk1hbGxvY1NsYWJBbGxvY2F0b3I6OkFsbG9jYXRlKHNpemVfdCBTaXplKSB7CisgIE1lbVNsYWIgKlNsYWIgPSAoTWVtU2xhYiopQWxsb2NhdG9yLkFsbG9jYXRlKFNpemUsIDApOworICBTbGFiLT5TaXplID0gU2l6ZTsKKyAgU2xhYi0+TmV4dFB0ciA9IDA7CisgIHJldHVybiBTbGFiOworfQorCit2b2lkIE1hbGxvY1NsYWJBbGxvY2F0b3I6OkRlYWxsb2NhdGUoTWVtU2xhYiAqU2xhYikgeworICBBbGxvY2F0b3IuRGVhbGxvY2F0ZShTbGFiKTsKK30KKwordm9pZCBQcmludFJlY3ljbGVyU3RhdHMoc2l6ZV90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgRnJlZUxpc3RTaXplKSB7CisgIGVycnMoKSA8PCAiUmVjeWNsZXIgZWxlbWVudCBzaXplOiAiIDw8IFNpemUgPDwgJ1xuJworICAgICAgICAgPDwgIlJlY3ljbGVyIGVsZW1lbnQgYWxpZ25tZW50OiAiIDw8IEFsaWduIDw8ICdcbicKKyAgICAgICAgIDw8ICJOdW1iZXIgb2YgZWxlbWVudHMgZnJlZSBmb3IgcmVjeWNsaW5nOiAiIDw8IEZyZWVMaXN0U2l6ZSA8PCAnXG4nOworfQorCit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZGYxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDUwIEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1TdXBwb3J0CisgIEFQRmxvYXQuY3BwCisgIEFQSW50LmNwcAorICBBUFNJbnQuY3BwCisgIEFsbG9jYXRvci5jcHAKKyAgY2lyY3VsYXJfcmF3X29zdHJlYW0uY3BwCisgIENvbW1hbmRMaW5lLmNwcAorICBDb25zdGFudFJhbmdlLmNwcAorICBDcmFzaFJlY292ZXJ5Q29udGV4dC5jcHAKKyAgRGVidWcuY3BwCisgIERlbHRhQWxnb3JpdGhtLmNwcAorICBEQUdEZWx0YUFsZ29yaXRobS5jcHAKKyAgRHdhcmYuY3BwCisgIEVycm9ySGFuZGxpbmcuY3BwCisgIEZpbGVVdGlsaXRpZXMuY3BwCisgIEZvbGRpbmdTZXQuY3BwCisgIEZvcm1hdHRlZFN0cmVhbS5jcHAKKyAgR3JhcGhXcml0ZXIuY3BwCisgIElzSW5mLmNwcAorICBJc05BTi5jcHAKKyAgTWFuYWdlZFN0YXRpYy5jcHAKKyAgTWVtb3J5QnVmZmVyLmNwcAorICBNZW1vcnlPYmplY3QuY3BwCisgIFBsdWdpbkxvYWRlci5jcHAKKyAgUHJldHR5U3RhY2tUcmFjZS5jcHAKKyAgUmVnZXguY3BwCisgIFNsb3dPcGVyYXRpb25JbmZvcm1lci5jcHAKKyAgU21hbGxQdHJTZXQuY3BwCisgIFNtYWxsVmVjdG9yLmNwcAorICBTb3VyY2VNZ3IuY3BwCisgIFN0YXRpc3RpYy5jcHAKKyAgU3RyaW5nRXh0cmFzLmNwcAorICBTdHJpbmdNYXAuY3BwCisgIFN0cmluZ1Bvb2wuY3BwCisgIFN0cmluZ1JlZi5jcHAKKyAgU3lzdGVtVXRpbHMuY3BwCisgIFRhcmdldFJlZ2lzdHJ5LmNwcAorICBUaW1lci5jcHAKKyAgVHJpcGxlLmNwcAorICBUd2luZS5jcHAKKyAgcmF3X29zX29zdHJlYW0uY3BwCisgIHJhd19vc3RyZWFtLmNwcAorICByZWdjb21wLmMKKyAgcmVnZXJyb3IuYworICByZWdleGVjLmMKKyAgcmVnZnJlZS5jCisgIHJlZ3N0cmxjcHkuYworICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoTExWTVN1cHBvcnQgTExWTVN5c3RlbSkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0NPUFlSSUdIVC5yZWdleCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0NPUFlSSUdIVC5yZWdleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjM5MmZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvQ09QWVJJR0hULnJlZ2V4CkBAIC0wLDAgKzEsNTQgQEAKKyRPcGVuQlNEOiBDT1BZUklHSFQsdiAxLjMgMjAwMy8wNi8wMiAyMDoxODozNiBtaWxsZXJ0IEV4cCAkCisKK0NvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0IEhlbnJ5IFNwZW5jZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyBub3Qgc3ViamVjdCB0byBhbnkgbGljZW5zZSBvZiB0aGUgQW1lcmljYW4gVGVsZXBob25lCithbmQgVGVsZWdyYXBoIENvbXBhbnkgb3Igb2YgdGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugb24KK2FueSBjb21wdXRlciBzeXN0ZW0sIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0LCBzdWJqZWN0Cit0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworMS4gVGhlIGF1dGhvciBpcyBub3QgcmVzcG9uc2libGUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNlIG9mIHRoaXMKKyAgIHNvZnR3YXJlLCBubyBtYXR0ZXIgaG93IGF3ZnVsLCBldmVuIGlmIHRoZXkgYXJpc2UgZnJvbSBmbGF3cyBpbiBpdC4KKworMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkLCBlaXRoZXIgYnkKKyAgIGV4cGxpY2l0IGNsYWltIG9yIGJ5IG9taXNzaW9uLiAgU2luY2UgZmV3IHVzZXJzIGV2ZXIgcmVhZCBzb3VyY2VzLAorICAgY3JlZGl0cyBtdXN0IGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworMy4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgU2luY2UgZmV3IHVzZXJzCisgICBldmVyIHJlYWQgc291cmNlcywgY3JlZGl0cyBtdXN0IGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworNC4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQuCisKKz0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0KKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKUNPUFlSSUdIVAk4LjEgKEJlcmtlbGV5KSAzLzE2Lzk0CisgKi8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0NvbW1hbmRMaW5lLmNwcCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0NvbW1hbmRMaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTY2MTEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvQ29tbWFuZExpbmUuY3BwCkBAIC0wLDAgKzEsMTIzOSBAQAorLy89PT0tLSBDb21tYW5kTGluZS5jcHAgLSBDb21tYW5kIGxpbmUgcGFyc2VyIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcHJvY2Vzc29yIHRoYXQgaXMgdXNlZnVsIHdoZW4KKy8vIGNyZWF0aW5nIGEgdG9vbC4gIEl0IHByb3ZpZGVzIGEgc2ltcGxlLCBtaW5pbWFsaXN0aWMgaW50ZXJmYWNlIHRoYXQgaXMgZWFzaWx5CisvLyBleHRlbnNpYmxlIGFuZCBzdXBwb3J0cyBub25sb2NhbCAobGlicmFyeSkgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisvLworLy8gTm90ZSB0aGF0IHJhdGhlciB0aGFuIHRyeWluZyB0byBmaWd1cmUgb3V0IHdoYXQgdGhpcyBjb2RlIGRvZXMsIHlvdSBjb3VsZCB0cnkKKy8vIHJlYWRpbmcgdGhlIGxpYnJhcnkgZG9jdW1lbnRhdGlvbiBsb2NhdGVkIGluIGRvY3MvQ29tbWFuZExpbmUuaHRtbAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vSG9zdC5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIGNsOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGVtcGxhdGUgaW5zdGFudGlhdGlvbnMgYW5kIGFuY2hvcnMuCisvLworbmFtZXNwYWNlIGxsdm0geyBuYW1lc3BhY2UgY2wgeworVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBiYXNpY19wYXJzZXI8Ym9vbD4pOworVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBiYXNpY19wYXJzZXI8Ym9vbE9yRGVmYXVsdD4pOworVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBiYXNpY19wYXJzZXI8aW50Pik7CitURU1QTEFURV9JTlNUQU5USUFUSU9OKGNsYXNzIGJhc2ljX3BhcnNlcjx1bnNpZ25lZD4pOworVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBiYXNpY19wYXJzZXI8ZG91YmxlPik7CitURU1QTEFURV9JTlNUQU5USUFUSU9OKGNsYXNzIGJhc2ljX3BhcnNlcjxmbG9hdD4pOworVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBiYXNpY19wYXJzZXI8c3RkOjpzdHJpbmc+KTsKK1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgYmFzaWNfcGFyc2VyPGNoYXI+KTsKKworVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBvcHQ8dW5zaWduZWQ+KTsKK1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3Mgb3B0PGludD4pOworVEVNUExBVEVfSU5TVEFOVElBVElPTihjbGFzcyBvcHQ8c3RkOjpzdHJpbmc+KTsKK1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3Mgb3B0PGNoYXI+KTsKK1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3Mgb3B0PGJvb2w+KTsKK30gfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm06OmNsCisKK3ZvaWQgT3B0aW9uOjphbmNob3IoKSB7fQordm9pZCBiYXNpY19wYXJzZXJfaW1wbDo6YW5jaG9yKCkge30KK3ZvaWQgcGFyc2VyPGJvb2w+OjphbmNob3IoKSB7fQordm9pZCBwYXJzZXI8Ym9vbE9yRGVmYXVsdD46OmFuY2hvcigpIHt9Cit2b2lkIHBhcnNlcjxpbnQ+OjphbmNob3IoKSB7fQordm9pZCBwYXJzZXI8dW5zaWduZWQ+OjphbmNob3IoKSB7fQordm9pZCBwYXJzZXI8ZG91YmxlPjo6YW5jaG9yKCkge30KK3ZvaWQgcGFyc2VyPGZsb2F0Pjo6YW5jaG9yKCkge30KK3ZvaWQgcGFyc2VyPHN0ZDo6c3RyaW5nPjo6YW5jaG9yKCkge30KK3ZvaWQgcGFyc2VyPGNoYXI+OjphbmNob3IoKSB7fQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBHbG9iYWxzIGZvciBuYW1lIGFuZCBvdmVydmlldyBvZiBwcm9ncmFtLiAgUHJvZ3JhbSBuYW1lIGlzIG5vdCBhIHN0cmluZyB0bworLy8gYXZvaWQgc3RhdGljIGN0b3IvZHRvciBpc3N1ZXMuCitzdGF0aWMgY2hhciBQcm9ncmFtTmFtZVs4MF0gPSAiPHByZW1haW4+IjsKK3N0YXRpYyBjb25zdCBjaGFyICpQcm9ncmFtT3ZlcnZpZXcgPSAwOworCisvLyBUaGlzIGNvbGxlY3RzIGFkZGl0aW9uYWwgaGVscCB0byBiZSBwcmludGVkLgorc3RhdGljIE1hbmFnZWRTdGF0aWM8c3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+ID4gTW9yZUhlbHA7CisKK2V4dHJhaGVscDo6ZXh0cmFoZWxwKGNvbnN0IGNoYXIgKkhlbHApCisgIDogbW9yZWhlbHAoSGVscCkgeworICBNb3JlSGVscC0+cHVzaF9iYWNrKEhlbHApOworfQorCitzdGF0aWMgYm9vbCBPcHRpb25MaXN0Q2hhbmdlZCA9IGZhbHNlOworCisvLyBNYXJrT3B0aW9uc0NoYW5nZWQgLSBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24uCit2b2lkIGNsOjpNYXJrT3B0aW9uc0NoYW5nZWQoKSB7CisgIE9wdGlvbkxpc3RDaGFuZ2VkID0gdHJ1ZTsKK30KKworLy8vIFJlZ2lzdGVyZWRPcHRpb25MaXN0IC0gVGhpcyBpcyB0aGUgbGlzdCBvZiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgdGhhdAorLy8vIGhhdmUgc3RhdGljYWxseSBjb25zdHJ1Y3RlZCB0aGVtc2VsdmVzLgorc3RhdGljIE9wdGlvbiAqUmVnaXN0ZXJlZE9wdGlvbkxpc3QgPSAwOworCit2b2lkIE9wdGlvbjo6YWRkQXJndW1lbnQoKSB7CisgIGFzc2VydChOZXh0UmVnaXN0ZXJlZCA9PSAwICYmICJhcmd1bWVudCBtdWx0aXBseSByZWdpc3RlcmVkISIpOworCisgIE5leHRSZWdpc3RlcmVkID0gUmVnaXN0ZXJlZE9wdGlvbkxpc3Q7CisgIFJlZ2lzdGVyZWRPcHRpb25MaXN0ID0gdGhpczsKKyAgTWFya09wdGlvbnNDaGFuZ2VkKCk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJhc2ljLCBzaGFyZWQgY29tbWFuZCBsaW5lIG9wdGlvbiBwcm9jZXNzaW5nIG1hY2hpbmVyeS4KKy8vCisKKy8vLyBHZXRPcHRpb25JbmZvIC0gU2NhbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIG9wdGlvbnMsIHR1cm5pbmcgdGhlbSBpbnRvIGRhdGEKKy8vLyBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGVhc2llciB0byBoYW5kbGUuCitzdGF0aWMgdm9pZCBHZXRPcHRpb25JbmZvKFNtYWxsVmVjdG9ySW1wbDxPcHRpb24qPiAmUG9zaXRpb25hbE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxPcHRpb24qPiAmU2lua09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ01hcDxPcHRpb24qPiAmT3B0aW9uc01hcCkgeworICBTbWFsbFZlY3Rvcjxjb25zdCBjaGFyKiwgMTY+IE9wdGlvbk5hbWVzOworICBPcHRpb24gKkNBT3B0ID0gMDsgIC8vIFRoZSBDb25zdW1lQWZ0ZXIgb3B0aW9uIGlmIGl0IGV4aXN0cy4KKyAgZm9yIChPcHRpb24gKk8gPSBSZWdpc3RlcmVkT3B0aW9uTGlzdDsgTzsgTyA9IE8tPmdldE5leHRSZWdpc3RlcmVkT3B0aW9uKCkpIHsKKyAgICAvLyBJZiB0aGlzIG9wdGlvbiB3YW50cyB0byBoYW5kbGUgbXVsdGlwbGUgb3B0aW9uIG5hbWVzLCBnZXQgdGhlIGZ1bGwgc2V0LgorICAgIC8vIFRoaXMgaGFuZGxlcyBlbnVtIG9wdGlvbnMgbGlrZSAiLU8xIC1PMiIgZXRjLgorICAgIE8tPmdldEV4dHJhT3B0aW9uTmFtZXMoT3B0aW9uTmFtZXMpOworICAgIGlmIChPLT5BcmdTdHJbMF0pCisgICAgICBPcHRpb25OYW1lcy5wdXNoX2JhY2soTy0+QXJnU3RyKTsKKworICAgIC8vIEhhbmRsZSBuYW1lZCBvcHRpb25zLgorICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gT3B0aW9uTmFtZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgLy8gQWRkIGFyZ3VtZW50IHRvIHRoZSBhcmd1bWVudCBtYXAhCisgICAgICBpZiAoT3B0aW9uc01hcC5HZXRPckNyZWF0ZVZhbHVlKE9wdGlvbk5hbWVzW2ldLCBPKS5zZWNvbmQgIT0gTykgeworICAgICAgICBlcnJzKCkgPDwgUHJvZ3JhbU5hbWUgPDwgIjogQ29tbWFuZExpbmUgRXJyb3I6IEFyZ3VtZW50ICciCisgICAgICAgICAgICAgPDwgT3B0aW9uTmFtZXNbaV0gPDwgIicgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSFcbiI7CisgICAgICB9CisgICAgfQorCisgICAgT3B0aW9uTmFtZXMuY2xlYXIoKTsKKworICAgIC8vIFJlbWVtYmVyIGluZm9ybWF0aW9uIGFib3V0IHBvc2l0aW9uYWwgb3B0aW9ucy4KKyAgICBpZiAoTy0+Z2V0Rm9ybWF0dGluZ0ZsYWcoKSA9PSBjbDo6UG9zaXRpb25hbCkKKyAgICAgIFBvc2l0aW9uYWxPcHRzLnB1c2hfYmFjayhPKTsKKyAgICBlbHNlIGlmIChPLT5nZXRNaXNjRmxhZ3MoKSAmIGNsOjpTaW5rKSAvLyBSZW1lbWJlciBzaW5rIG9wdGlvbnMKKyAgICAgIFNpbmtPcHRzLnB1c2hfYmFjayhPKTsKKyAgICBlbHNlIGlmIChPLT5nZXROdW1PY2N1cnJlbmNlc0ZsYWcoKSA9PSBjbDo6Q29uc3VtZUFmdGVyKSB7CisgICAgICBpZiAoQ0FPcHQpCisgICAgICAgIE8tPmVycm9yKCJDYW5ub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIG9wdGlvbiB3aXRoIGNsOjpDb25zdW1lQWZ0ZXIhIik7CisgICAgICBDQU9wdCA9IE87CisgICAgfQorICB9CisKKyAgaWYgKENBT3B0KQorICAgIFBvc2l0aW9uYWxPcHRzLnB1c2hfYmFjayhDQU9wdCk7CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgdGhleSBhcmUgaW4gb3JkZXIgb2YgcmVnaXN0cmF0aW9uIG5vdCBiYWNrd2FyZHMuCisgIHN0ZDo6cmV2ZXJzZShQb3NpdGlvbmFsT3B0cy5iZWdpbigpLCBQb3NpdGlvbmFsT3B0cy5lbmQoKSk7Cit9CisKKworLy8vIExvb2t1cE9wdGlvbiAtIExvb2t1cCB0aGUgb3B0aW9uIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWVkIG9wdGlvbiBvbiB0aGUKKy8vLyBjb21tYW5kIGxpbmUuICBJZiB0aGVyZSBpcyBhIHZhbHVlIHNwZWNpZmllZCAoYWZ0ZXIgYW4gZXF1YWwgc2lnbikgcmV0dXJuCisvLy8gdGhhdCBhcyB3ZWxsLiAgVGhpcyBhc3N1bWVzIHRoYXQgbGVhZGluZyBkYXNoZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RyaXBwZWQuCitzdGF0aWMgT3B0aW9uICpMb29rdXBPcHRpb24oU3RyaW5nUmVmICZBcmcsIFN0cmluZ1JlZiAmVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nTWFwPE9wdGlvbio+ICZPcHRpb25zTWFwKSB7CisgIC8vIFJlamVjdCBhbGwgZGFzaGVzLgorICBpZiAoQXJnLmVtcHR5KCkpIHJldHVybiAwOworCisgIHNpemVfdCBFcXVhbFBvcyA9IEFyZy5maW5kKCc9Jyk7CisKKyAgLy8gSWYgd2UgaGF2ZSBhbiBlcXVhbHMgc2lnbiwgcmVtZW1iZXIgdGhlIHZhbHVlLgorICBpZiAoRXF1YWxQb3MgPT0gU3RyaW5nUmVmOjpucG9zKSB7CisgICAgLy8gTG9vayB1cCB0aGUgb3B0aW9uLgorICAgIFN0cmluZ01hcDxPcHRpb24qPjo6Y29uc3RfaXRlcmF0b3IgSSA9IE9wdGlvbnNNYXAuZmluZChBcmcpOworICAgIHJldHVybiBJICE9IE9wdGlvbnNNYXAuZW5kKCkgPyBJLT5zZWNvbmQgOiAwOworICB9CisKKyAgLy8gSWYgdGhlIGFyZ3VtZW50IGJlZm9yZSB0aGUgPSBpcyBhIHZhbGlkIG9wdGlvbiBuYW1lLCB3ZSBtYXRjaC4gIElmIG5vdCwKKyAgLy8gcmV0dXJuIEFyZyB1bm1vbGVzdGVkLgorICBTdHJpbmdNYXA8T3B0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIEkgPQorICAgIE9wdGlvbnNNYXAuZmluZChBcmcuc3Vic3RyKDAsIEVxdWFsUG9zKSk7CisgIGlmIChJID09IE9wdGlvbnNNYXAuZW5kKCkpIHJldHVybiAwOworCisgIFZhbHVlID0gQXJnLnN1YnN0cihFcXVhbFBvcysxKTsKKyAgQXJnID0gQXJnLnN1YnN0cigwLCBFcXVhbFBvcyk7CisgIHJldHVybiBJLT5zZWNvbmQ7Cit9CisKKy8vLyBDb21tYVNlcGFyYXRlQW5kQWRkT2NjdXJlbmNlIC0gQSB3cmFwcGVyIGFyb3VuZCBIYW5kbGVyLT5hZGRPY2N1cmVuY2UoKSB0aGF0CisvLy8gZG9lcyBzcGVjaWFsIGhhbmRsaW5nIG9mIGNsOjpDb21tYVNlcGFyYXRlZCBvcHRpb25zLgorc3RhdGljIGJvb2wgQ29tbWFTZXBhcmF0ZUFuZEFkZE9jY3VyZW5jZShPcHRpb24gKkhhbmRsZXIsIHVuc2lnbmVkIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSwgYm9vbCBNdWx0aUFyZyA9IGZhbHNlKQoreworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBvcHRpb24gYWNjZXB0cyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcy4gIElmCisgIC8vIGl0IGRvZXMsIHdlIGhhdmUgdG8gc3BsaXQgdXAgdGhlIHZhbHVlIGludG8gbXVsdGlwbGUgdmFsdWVzLgorICBpZiAoSGFuZGxlci0+Z2V0TWlzY0ZsYWdzKCkgJiBDb21tYVNlcGFyYXRlZCkgeworICAgIFN0cmluZ1JlZiBWYWwoVmFsdWUpOworICAgIFN0cmluZ1JlZjo6c2l6ZV90eXBlIFBvcyA9IFZhbC5maW5kKCcsJyk7CisKKyAgICB3aGlsZSAoUG9zICE9IFN0cmluZ1JlZjo6bnBvcykgeworICAgICAgLy8gUHJvY2VzcyB0aGUgcG9ydGlvbiBiZWZvcmUgdGhlIGNvbW1hLgorICAgICAgaWYgKEhhbmRsZXItPmFkZE9jY3VycmVuY2UocG9zLCBBcmdOYW1lLCBWYWwuc3Vic3RyKDAsIFBvcyksIE11bHRpQXJnKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAvLyBFcmFzZSB0aGUgcG9ydGlvbiBiZWZvcmUgdGhlIGNvbW1hLCBBTkQgdGhlIGNvbW1hLgorICAgICAgVmFsID0gVmFsLnN1YnN0cihQb3MrMSk7CisgICAgICBWYWx1ZS5zdWJzdHIoUG9zKzEpOyAgLy8gSW5jcmVtZW50IHRoZSBvcmlnaW5hbCB2YWx1ZSBwb2ludGVyIGFzIHdlbGwuCisgICAgICAvLyBDaGVjayBmb3IgYW5vdGhlciBjb21tYS4KKyAgICAgIFBvcyA9IFZhbC5maW5kKCcsJyk7CisgICAgfQorCisgICAgVmFsdWUgPSBWYWw7CisgIH0KKworICBpZiAoSGFuZGxlci0+YWRkT2NjdXJyZW5jZShwb3MsIEFyZ05hbWUsIFZhbHVlLCBNdWx0aUFyZykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUHJvdmlkZU9wdGlvbiAtIEZvciBWYWx1ZSwgdGhpcyBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGFuIGVtcHR5IHZhbHVlICgiIikKKy8vLyBhbmQgYSBudWxsIHZhbHVlIChTdHJpbmdSZWYoKSkuICBUaGUgbGF0ZXIgaXMgYWNjZXB0ZWQgZm9yIGFyZ3VtZW50cyB0aGF0CisvLy8gZG9uJ3QgYWxsb3cgYSB2YWx1ZSAoLWZvbykgdGhlIGZvcm1lciBpcyByZWplY3RlZCAoLWZvbz0pLgorc3RhdGljIGlubGluZSBib29sIFByb3ZpZGVPcHRpb24oT3B0aW9uICpIYW5kbGVyLCBTdHJpbmdSZWYgQXJnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpKSB7CisgIC8vIElzIHRoaXMgYSBtdWx0aS1hcmd1bWVudCBvcHRpb24/CisgIHVuc2lnbmVkIE51bUFkZGl0aW9uYWxWYWxzID0gSGFuZGxlci0+Z2V0TnVtQWRkaXRpb25hbFZhbHMoKTsKKworICAvLyBFbmZvcmNlIHZhbHVlIHJlcXVpcmVtZW50cworICBzd2l0Y2ggKEhhbmRsZXItPmdldFZhbHVlRXhwZWN0ZWRGbGFnKCkpIHsKKyAgY2FzZSBWYWx1ZVJlcXVpcmVkOgorICAgIGlmIChWYWx1ZS5kYXRhKCkgPT0gMCkgeyAgICAgICAvLyBObyB2YWx1ZSBzcGVjaWZpZWQ/CisgICAgICBpZiAoaSsxID49IGFyZ2MpCisgICAgICAgIHJldHVybiBIYW5kbGVyLT5lcnJvcigicmVxdWlyZXMgYSB2YWx1ZSEiKTsKKyAgICAgIC8vIFN0ZWFsIHRoZSBuZXh0IGFyZ3VtZW50LCBsaWtlIGZvciAnLW8gZmlsZW5hbWUnCisgICAgICBWYWx1ZSA9IGFyZ3ZbKytpXTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVmFsdWVEaXNhbGxvd2VkOgorICAgIGlmIChOdW1BZGRpdGlvbmFsVmFscyA+IDApCisgICAgICByZXR1cm4gSGFuZGxlci0+ZXJyb3IoIm11bHRpLXZhbHVlZCBvcHRpb24gc3BlY2lmaWVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBWYWx1ZURpc2FsbG93ZWQgbW9kaWZpZXIhIik7CisKKyAgICBpZiAoVmFsdWUuZGF0YSgpKQorICAgICAgcmV0dXJuIEhhbmRsZXItPmVycm9yKCJkb2VzIG5vdCBhbGxvdyBhIHZhbHVlISAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoVmFsdWUpICsgIicgc3BlY2lmaWVkLiIpOworICAgIGJyZWFrOworICBjYXNlIFZhbHVlT3B0aW9uYWw6CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBlcnJzKCkgPDwgUHJvZ3JhbU5hbWUKKyAgICAgICAgIDw8ICI6IEJhZCBWYWx1ZU1hc2sgZmxhZyEgQ29tbWFuZExpbmUgdXNhZ2UgZXJyb3I6IgorICAgICAgICAgPDwgSGFuZGxlci0+Z2V0VmFsdWVFeHBlY3RlZEZsYWcoKSA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKworICAvLyBJZiB0aGlzIGlzbid0IGEgbXVsdGktYXJnIG9wdGlvbiwganVzdCBydW4gdGhlIGhhbmRsZXIuCisgIGlmIChOdW1BZGRpdGlvbmFsVmFscyA9PSAwKQorICAgIHJldHVybiBDb21tYVNlcGFyYXRlQW5kQWRkT2NjdXJlbmNlKEhhbmRsZXIsIGksIEFyZ05hbWUsIFZhbHVlKTsKKworICAvLyBJZiBpdCBpcywgcnVuIHRoZSBoYW5kbGUgc2V2ZXJhbCB0aW1lcy4KKyAgYm9vbCBNdWx0aUFyZyA9IGZhbHNlOworCisgIGlmIChWYWx1ZS5kYXRhKCkpIHsKKyAgICBpZiAoQ29tbWFTZXBhcmF0ZUFuZEFkZE9jY3VyZW5jZShIYW5kbGVyLCBpLCBBcmdOYW1lLCBWYWx1ZSwgTXVsdGlBcmcpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLS1OdW1BZGRpdGlvbmFsVmFsczsKKyAgICBNdWx0aUFyZyA9IHRydWU7CisgIH0KKworICB3aGlsZSAoTnVtQWRkaXRpb25hbFZhbHMgPiAwKSB7CisgICAgaWYgKGkrMSA+PSBhcmdjKQorICAgICAgcmV0dXJuIEhhbmRsZXItPmVycm9yKCJub3QgZW5vdWdoIHZhbHVlcyEiKTsKKyAgICBWYWx1ZSA9IGFyZ3ZbKytpXTsKKworICAgIGlmIChDb21tYVNlcGFyYXRlQW5kQWRkT2NjdXJlbmNlKEhhbmRsZXIsIGksIEFyZ05hbWUsIFZhbHVlLCBNdWx0aUFyZykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBNdWx0aUFyZyA9IHRydWU7CisgICAgLS1OdW1BZGRpdGlvbmFsVmFsczsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIFByb3ZpZGVQb3NpdGlvbmFsT3B0aW9uKE9wdGlvbiAqSGFuZGxlciwgU3RyaW5nUmVmIEFyZywgaW50IGkpIHsKKyAgaW50IER1bW15ID0gaTsKKyAgcmV0dXJuIFByb3ZpZGVPcHRpb24oSGFuZGxlciwgSGFuZGxlci0+QXJnU3RyLCBBcmcsIDAsIDAsIER1bW15KTsKK30KKworCisvLyBPcHRpb24gcHJlZGljYXRlcy4uLgorc3RhdGljIGlubGluZSBib29sIGlzR3JvdXBpbmcoY29uc3QgT3B0aW9uICpPKSB7CisgIHJldHVybiBPLT5nZXRGb3JtYXR0aW5nRmxhZygpID09IGNsOjpHcm91cGluZzsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1ByZWZpeGVkT3JHcm91cGluZyhjb25zdCBPcHRpb24gKk8pIHsKKyAgcmV0dXJuIGlzR3JvdXBpbmcoTykgfHwgTy0+Z2V0Rm9ybWF0dGluZ0ZsYWcoKSA9PSBjbDo6UHJlZml4OworfQorCisvLyBnZXRPcHRpb25QcmVkIC0gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgb3B0aW9ucyB0aGF0IHNhdGlzZnkgdGhlCisvLyBzcGVjaWZpZWQgcHJlZGljYXRlIHdpdGggbmFtZXMgdGhhdCBhcmUgdGhlIHByZWZpeGVzIGluIE5hbWUuICBUaGlzIGlzCisvLyBjaGVja2VkIGJ5IHByb2dyZXNzaXZlbHkgc3RyaXBwaW5nIGNoYXJhY3RlcnMgb2ZmIG9mIHRoZSBuYW1lLCBjaGVja2luZyB0bworLy8gc2VlIGlmIHRoZXJlIG9wdGlvbnMgdGhhdCBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUuICBJZiB3ZSBmaW5kIG9uZSwgcmV0dXJuIGl0LAorLy8gb3RoZXJ3aXNlIHJldHVybiBudWxsLgorLy8KK3N0YXRpYyBPcHRpb24gKmdldE9wdGlvblByZWQoU3RyaW5nUmVmIE5hbWUsIHNpemVfdCAmTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqUHJlZCkoY29uc3QgT3B0aW9uKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ01hcDxPcHRpb24qPiAmT3B0aW9uc01hcCkgeworCisgIFN0cmluZ01hcDxPcHRpb24qPjo6Y29uc3RfaXRlcmF0b3IgT01JID0gT3B0aW9uc01hcC5maW5kKE5hbWUpOworCisgIC8vIExvb3Agd2hpbGUgd2UgaGF2ZW4ndCBmb3VuZCBhbiBvcHRpb24gYW5kIE5hbWUgc3RpbGwgaGFzIGF0IGxlYXN0IHR3bworICAvLyBjaGFyYWN0ZXJzIGluIGl0IChzbyB0aGF0IHRoZSBuZXh0IGl0ZXJhdGlvbiB3aWxsIG5vdCBiZSB0aGUgZW1wdHkKKyAgLy8gc3RyaW5nLgorICB3aGlsZSAoT01JID09IE9wdGlvbnNNYXAuZW5kKCkgJiYgTmFtZS5zaXplKCkgPiAxKSB7CisgICAgTmFtZSA9IE5hbWUuc3Vic3RyKDAsIE5hbWUuc2l6ZSgpLTEpOyAgIC8vIENob3Agb2ZmIHRoZSBsYXN0IGNoYXJhY3Rlci4KKyAgICBPTUkgPSBPcHRpb25zTWFwLmZpbmQoTmFtZSk7CisgIH0KKworICBpZiAoT01JICE9IE9wdGlvbnNNYXAuZW5kKCkgJiYgUHJlZChPTUktPnNlY29uZCkpIHsKKyAgICBMZW5ndGggPSBOYW1lLnNpemUoKTsKKyAgICByZXR1cm4gT01JLT5zZWNvbmQ7ICAgIC8vIEZvdW5kIG9uZSEKKyAgfQorICByZXR1cm4gMDsgICAgICAgICAgICAgICAgLy8gTm8gb3B0aW9uIGZvdW5kIQorfQorCisvLy8gSGFuZGxlUHJlZml4ZWRPckdyb3VwZWRPcHRpb24gLSBUaGUgc3BlY2lmaWVkIGFyZ3VtZW50IHN0cmluZyAod2hpY2ggc3RhcnRlZAorLy8vIHdpdGggYXQgbGVhc3Qgb25lICctJykgZG9lcyBub3QgZnVsbHkgbWF0Y2ggYW4gYXZhaWxhYmxlIG9wdGlvbi4gIENoZWNrIHRvCisvLy8gc2VlIGlmIHRoaXMgaXMgYSBwcmVmaXggb3IgZ3JvdXBlZCBvcHRpb24uICBJZiBzbywgc3BsaXQgYXJnIGludG8gb3V0cHV0IGFuCisvLy8gQXJnL1ZhbHVlIHBhaXIgYW5kIHJldHVybiB0aGUgT3B0aW9uIHRvIHBhcnNlIGl0IHdpdGguCitzdGF0aWMgT3B0aW9uICpIYW5kbGVQcmVmaXhlZE9yR3JvdXBlZE9wdGlvbihTdHJpbmdSZWYgJkFyZywgU3RyaW5nUmVmICZWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkVycm9yUGFyc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nTWFwPE9wdGlvbio+ICZPcHRpb25zTWFwKSB7CisgIGlmIChBcmcuc2l6ZSgpID09IDEpIHJldHVybiAwOworCisgIC8vIERvIHRoZSBsb29rdXAhCisgIHNpemVfdCBMZW5ndGggPSAwOworICBPcHRpb24gKlBHT3B0ID0gZ2V0T3B0aW9uUHJlZChBcmcsIExlbmd0aCwgaXNQcmVmaXhlZE9yR3JvdXBpbmcsIE9wdGlvbnNNYXApOworICBpZiAoUEdPcHQgPT0gMCkgcmV0dXJuIDA7CisKKyAgLy8gSWYgdGhlIG9wdGlvbiBpcyBhIHByZWZpeGVkIG9wdGlvbiwgdGhlbiB0aGUgdmFsdWUgaXMgc2ltcGx5IHRoZQorICAvLyByZXN0IG9mIHRoZSBuYW1lLi4uICBzbyBmYWxsIHRocm91Z2ggdG8gbGF0ZXIgcHJvY2Vzc2luZywgYnkKKyAgLy8gc2V0dGluZyB1cCB0aGUgYXJndW1lbnQgbmFtZSBmbGFncyBhbmQgdmFsdWUgZmllbGRzLgorICBpZiAoUEdPcHQtPmdldEZvcm1hdHRpbmdGbGFnKCkgPT0gY2w6OlByZWZpeCkgeworICAgIFZhbHVlID0gQXJnLnN1YnN0cihMZW5ndGgpOworICAgIEFyZyA9IEFyZy5zdWJzdHIoMCwgTGVuZ3RoKTsKKyAgICBhc3NlcnQoT3B0aW9uc01hcC5jb3VudChBcmcpICYmIE9wdGlvbnNNYXAuZmluZChBcmcpLT5zZWNvbmQgPT0gUEdPcHQpOworICAgIHJldHVybiBQR09wdDsKKyAgfQorCisgIC8vIFRoaXMgbXVzdCBiZSBhIGdyb3VwZWQgb3B0aW9uLi4uIGhhbmRsZSB0aGVtIG5vdy4gIEdyb3VwaW5nIG9wdGlvbnMgY2FuJ3QKKyAgLy8gaGF2ZSB2YWx1ZXMuCisgIGFzc2VydChpc0dyb3VwaW5nKFBHT3B0KSAmJiAiQnJva2VuIGdldE9wdGlvblByZWQhIik7CisKKyAgZG8geworICAgIC8vIE1vdmUgY3VycmVudCBhcmcgbmFtZSBvdXQgb2YgQXJnIGludG8gT25lQXJnTmFtZS4KKyAgICBTdHJpbmdSZWYgT25lQXJnTmFtZSA9IEFyZy5zdWJzdHIoMCwgTGVuZ3RoKTsKKyAgICBBcmcgPSBBcmcuc3Vic3RyKExlbmd0aCk7CisKKyAgICAvLyBCZWNhdXNlIFZhbHVlUmVxdWlyZWQgaXMgYW4gaW52YWxpZCBmbGFnIGZvciBncm91cGVkIGFyZ3VtZW50cywKKyAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHBhc3MgYXJnYy9hcmd2IGluLgorICAgIGFzc2VydChQR09wdC0+Z2V0VmFsdWVFeHBlY3RlZEZsYWcoKSAhPSBjbDo6VmFsdWVSZXF1aXJlZCAmJgorICAgICAgICAgICAiT3B0aW9uIGNhbiBub3QgYmUgY2w6Okdyb3VwaW5nIEFORCBjbDo6VmFsdWVSZXF1aXJlZCEiKTsKKyAgICBpbnQgRHVtbXkgPSAwOworICAgIEVycm9yUGFyc2luZyB8PSBQcm92aWRlT3B0aW9uKFBHT3B0LCBPbmVBcmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZigpLCAwLCAwLCBEdW1teSk7CisKKyAgICAvLyBHZXQgdGhlIG5leHQgZ3JvdXBpbmcgb3B0aW9uLgorICAgIFBHT3B0ID0gZ2V0T3B0aW9uUHJlZChBcmcsIExlbmd0aCwgaXNHcm91cGluZywgT3B0aW9uc01hcCk7CisgIH0gd2hpbGUgKFBHT3B0ICYmIExlbmd0aCAhPSBBcmcuc2l6ZSgpKTsKKworICAvLyBSZXR1cm4gdGhlIGxhc3Qgb3B0aW9uIHdpdGggQXJnIGN1dCBkb3duIHRvIGp1c3QgdGhlIGxhc3Qgb25lLgorICByZXR1cm4gUEdPcHQ7Cit9CisKKworCitzdGF0aWMgYm9vbCBSZXF1aXJlc1ZhbHVlKGNvbnN0IE9wdGlvbiAqTykgeworICByZXR1cm4gTy0+Z2V0TnVtT2NjdXJyZW5jZXNGbGFnKCkgPT0gY2w6OlJlcXVpcmVkIHx8CisgICAgICAgICBPLT5nZXROdW1PY2N1cnJlbmNlc0ZsYWcoKSA9PSBjbDo6T25lT3JNb3JlOworfQorCitzdGF0aWMgYm9vbCBFYXRzVW5ib3VuZGVkTnVtYmVyT2ZWYWx1ZXMoY29uc3QgT3B0aW9uICpPKSB7CisgIHJldHVybiBPLT5nZXROdW1PY2N1cnJlbmNlc0ZsYWcoKSA9PSBjbDo6WmVyb09yTW9yZSB8fAorICAgICAgICAgTy0+Z2V0TnVtT2NjdXJyZW5jZXNGbGFnKCkgPT0gY2w6Ok9uZU9yTW9yZTsKK30KKworLy8vIFBhcnNlQ1N0cmluZ1ZlY3RvciAtIEJyZWFrIElOUFVUIHVwIHdoZXJldmVyIG9uZSBvciBtb3JlCisvLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSBmb3VuZCwgYW5kIHN0b3JlIHRoZSByZXN1bHRpbmcgdG9rZW5zIGluCisvLy8gT1VUUFVULiBUaGUgdG9rZW5zIHN0b3JlZCBpbiBPVVRQVVQgYXJlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAorLy8vIHVzaW5nIHN0cmR1cCgpLCBzbyBpdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSgpCisvLy8gdGhlbSBsYXRlci4KKy8vLworc3RhdGljIHZvaWQgUGFyc2VDU3RyaW5nVmVjdG9yKHN0ZDo6dmVjdG9yPGNoYXIgKj4gJk91dHB1dFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpJbnB1dCkgeworICAvLyBDaGFyYWN0ZXJzIHdoaWNoIHdpbGwgYmUgdHJlYXRlZCBhcyB0b2tlbiBzZXBhcmF0b3JzOgorICBTdHJpbmdSZWYgRGVsaW1zID0gIiBcdlxmXHRcclxuIjsKKworICBTdHJpbmdSZWYgV29ya1N0cihJbnB1dCk7CisgIHdoaWxlICghV29ya1N0ci5lbXB0eSgpKSB7CisgICAgLy8gSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIGRlbGltaXRlciwgc3RyaXAgdGhlbSBvZmYuCisgICAgaWYgKERlbGltcy5maW5kKFdvcmtTdHJbMF0pICE9IFN0cmluZ1JlZjo6bnBvcykgeworICAgICAgc2l6ZV90IFBvcyA9IFdvcmtTdHIuZmluZF9maXJzdF9ub3Rfb2YoRGVsaW1zKTsKKyAgICAgIGlmIChQb3MgPT0gU3RyaW5nUmVmOjpucG9zKSBQb3MgPSBXb3JrU3RyLnNpemUoKTsKKyAgICAgIFdvcmtTdHIgPSBXb3JrU3RyLnN1YnN0cihQb3MpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gRmluZCBwb3NpdGlvbiBvZiBmaXJzdCBkZWxpbWl0ZXIuCisgICAgc2l6ZV90IFBvcyA9IFdvcmtTdHIuZmluZF9maXJzdF9vZihEZWxpbXMpOworICAgIGlmIChQb3MgPT0gU3RyaW5nUmVmOjpucG9zKSBQb3MgPSBXb3JrU3RyLnNpemUoKTsKKworICAgIC8vIEV2ZXJ5dGhpbmcgZnJvbSAwIHRvIFBvcyBpcyB0aGUgbmV4dCB3b3JkIHRvIGNvcHkuCisgICAgY2hhciAqTmV3U3RyID0gKGNoYXIqKW1hbGxvYyhQb3MrMSk7CisgICAgbWVtY3B5KE5ld1N0ciwgV29ya1N0ci5kYXRhKCksIFBvcyk7CisgICAgTmV3U3RyW1Bvc10gPSAwOworICAgIE91dHB1dFZlY3Rvci5wdXNoX2JhY2soTmV3U3RyKTsKKworICAgIFdvcmtTdHIgPSBXb3JrU3RyLnN1YnN0cihQb3MpOworICB9Cit9CisKKy8vLyBQYXJzZUVudmlyb25tZW50T3B0aW9ucyAtIEFuIGFsdGVybmF0aXZlIGVudHJ5IHBvaW50IHRvIHRoZQorLy8vIENvbW1hbmRMaW5lIGxpYnJhcnksIHdoaWNoIGFsbG93cyB5b3UgdG8gcmVhZCB0aGUgcHJvZ3JhbSdzIG5hbWUKKy8vLyBmcm9tIHRoZSBjYWxsZXIgKGFzIFBST0dOQU1FKSBhbmQgaXRzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZnJvbQorLy8vIGFuIGVudmlyb25tZW50IHZhcmlhYmxlICh3aG9zZSBuYW1lIGlzIGdpdmVuIGluIEVOVlZBUikuCisvLy8KK3ZvaWQgY2w6OlBhcnNlRW52aXJvbm1lbnRPcHRpb25zKGNvbnN0IGNoYXIgKnByb2dOYW1lLCBjb25zdCBjaGFyICplbnZWYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpPdmVydmlldywgYm9vbCBSZWFkUmVzcG9uc2VGaWxlcykgeworICAvLyBDaGVjayBhcmdzLgorICBhc3NlcnQocHJvZ05hbWUgJiYgIlByb2dyYW0gbmFtZSBub3Qgc3BlY2lmaWVkIik7CisgIGFzc2VydChlbnZWYXIgJiYgIkVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgbWlzc2luZyIpOworCisgIC8vIEdldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdGhleSB3YW50IHVzIHRvIHBhcnNlIG9wdGlvbnMgb3V0IG9mLgorICBjb25zdCBjaGFyICplbnZWYWx1ZSA9IGdldGVudihlbnZWYXIpOworICBpZiAoIWVudlZhbHVlKQorICAgIHJldHVybjsKKworICAvLyBHZXQgcHJvZ3JhbSdzICJuYW1lIiwgd2hpY2ggd2Ugd291bGRuJ3Qga25vdyB3aXRob3V0IHRoZSBjYWxsZXIKKyAgLy8gdGVsbGluZyB1cy4KKyAgc3RkOjp2ZWN0b3I8Y2hhcio+IG5ld0FyZ3Y7CisgIG5ld0FyZ3YucHVzaF9iYWNrKHN0cmR1cChwcm9nTmFtZSkpOworCisgIC8vIFBhcnNlIHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaW50byBhICJjb21tYW5kIGxpbmUiCisgIC8vIGFuZCBoYW5kIGl0IG9mZiB0byBQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucygpLgorICBQYXJzZUNTdHJpbmdWZWN0b3IobmV3QXJndiwgZW52VmFsdWUpOworICBpbnQgbmV3QXJnYyA9IHN0YXRpY19jYXN0PGludD4obmV3QXJndi5zaXplKCkpOworICBQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhuZXdBcmdjLCAmbmV3QXJndlswXSwgT3ZlcnZpZXcsIFJlYWRSZXNwb25zZUZpbGVzKTsKKworICAvLyBGcmVlIGFsbCB0aGUgc3RyZHVwKCllZCBzdHJpbmdzLgorICBmb3IgKHN0ZDo6dmVjdG9yPGNoYXIqPjo6aXRlcmF0b3IgaSA9IG5ld0FyZ3YuYmVnaW4oKSwgZSA9IG5ld0FyZ3YuZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpCisgICAgZnJlZSgqaSk7Cit9CisKKworLy8vIEV4cGFuZFJlc3BvbnNlRmlsZXMgLSBDb3B5IHRoZSBjb250ZW50cyBvZiBhcmd2IGludG8gbmV3QXJndiwKKy8vLyBzdWJzdGl0dXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNwb25zZSBmaWxlcyBmb3IgdGhlIGFyZ3VtZW50cworLy8vIG9mIHR5cGUgQGZpbGUuCitzdGF0aWMgdm9pZCBFeHBhbmRSZXNwb25zZUZpbGVzKHVuc2lnbmVkIGFyZ2MsIGNoYXIqKiBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyKj4mIG5ld0FyZ3YpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBhcmdjOyArK2kpIHsKKyAgICBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgaWYgKGFyZ1swXSA9PSAnQCcpIHsKKyAgICAgIHN5czo6UGF0aFdpdGhTdGF0dXMgcmVzcEZpbGUoKythcmcpOworCisgICAgICAvLyBDaGVjayB0aGF0IHRoZSByZXNwb25zZSBmaWxlIGlzIG5vdCBlbXB0eSAobW1hcCdpbmcgZW1wdHkKKyAgICAgIC8vIGZpbGVzIGNhbiBiZSBwcm9ibGVtYXRpYykuCisgICAgICBjb25zdCBzeXM6OkZpbGVTdGF0dXMgKkZpbGVTdGF0ID0gcmVzcEZpbGUuZ2V0RmlsZVN0YXR1cygpOworICAgICAgaWYgKEZpbGVTdGF0ICYmIEZpbGVTdGF0LT5nZXRTaXplKCkgIT0gMCkgeworCisgICAgICAgIC8vIE1tYXAgdGhlIHJlc3BvbnNlIGZpbGUgaW50byBtZW1vcnkuCisgICAgICAgIE93bmluZ1B0cjxNZW1vcnlCdWZmZXI+CisgICAgICAgICAgcmVzcEZpbGVQdHIoTWVtb3J5QnVmZmVyOjpnZXRGaWxlKHJlc3BGaWxlLmNfc3RyKCkpKTsKKworICAgICAgICAvLyBJZiB3ZSBjb3VsZCBvcGVuIHRoZSBmaWxlLCBwYXJzZSBpdHMgY29udGVudHMsIG90aGVyd2lzZQorICAgICAgICAvLyBwYXNzIHRoZSBAZmlsZSBvcHRpb24gdmVyYmF0aW0uCisKKyAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGFsc28gc3VwcG9ydCByZWN1cnNpdmUgbG9hZGluZyBvZiByZXNwb25zZSBmaWxlcywKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBob3cgZ2NjIGJlaGF2ZXMuIChGcm9tIHRoZWlyIG1hbiBwYWdlOiAiVGhlIGZpbGUgbWF5CisgICAgICAgIC8vIGl0c2VsZiBjb250YWluIGFkZGl0aW9uYWwgQGZpbGUgb3B0aW9uczsgYW55IHN1Y2ggb3B0aW9ucyB3aWxsIGJlCisgICAgICAgIC8vIHByb2Nlc3NlZCByZWN1cnNpdmVseS4iKQorCisgICAgICAgIGlmIChyZXNwRmlsZVB0ciAhPSAwKSB7CisgICAgICAgICAgUGFyc2VDU3RyaW5nVmVjdG9yKG5ld0FyZ3YsIHJlc3BGaWxlUHRyLT5nZXRCdWZmZXJTdGFydCgpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBuZXdBcmd2LnB1c2hfYmFjayhzdHJkdXAoYXJnKSk7CisgIH0KK30KKwordm9pZCBjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqT3ZlcnZpZXcsIGJvb2wgUmVhZFJlc3BvbnNlRmlsZXMpIHsKKyAgLy8gUHJvY2VzcyBhbGwgcmVnaXN0ZXJlZCBvcHRpb25zLgorICBTbWFsbFZlY3RvcjxPcHRpb24qLCA0PiBQb3NpdGlvbmFsT3B0czsKKyAgU21hbGxWZWN0b3I8T3B0aW9uKiwgND4gU2lua09wdHM7CisgIFN0cmluZ01hcDxPcHRpb24qPiBPcHRzOworICBHZXRPcHRpb25JbmZvKFBvc2l0aW9uYWxPcHRzLCBTaW5rT3B0cywgT3B0cyk7CisKKyAgYXNzZXJ0KCghT3B0cy5lbXB0eSgpIHx8ICFQb3NpdGlvbmFsT3B0cy5lbXB0eSgpKSAmJgorICAgICAgICAgIk5vIG9wdGlvbnMgc3BlY2lmaWVkISIpOworCisgIC8vIEV4cGFuZCByZXNwb25zZSBmaWxlcy4KKyAgc3RkOjp2ZWN0b3I8Y2hhcio+IG5ld0FyZ3Y7CisgIGlmIChSZWFkUmVzcG9uc2VGaWxlcykgeworICAgIG5ld0FyZ3YucHVzaF9iYWNrKHN0cmR1cChhcmd2WzBdKSk7CisgICAgRXhwYW5kUmVzcG9uc2VGaWxlcyhhcmdjLCBhcmd2LCBuZXdBcmd2KTsKKyAgICBhcmd2ID0gJm5ld0FyZ3ZbMF07CisgICAgYXJnYyA9IHN0YXRpY19jYXN0PGludD4obmV3QXJndi5zaXplKCkpOworICB9CisKKyAgLy8gQ29weSB0aGUgcHJvZ3JhbSBuYW1lIGludG8gUHJvZ05hbWUsIG1ha2luZyBzdXJlIG5vdCB0byBvdmVyZmxvdyBpdC4KKyAgc3RkOjpzdHJpbmcgUHJvZ05hbWUgPSBzeXM6OlBhdGgoYXJndlswXSkuZ2V0TGFzdCgpOworICBzaXplX3QgTGVuID0gc3RkOjptaW4oUHJvZ05hbWUuc2l6ZSgpLCBzaXplX3QoNzkpKTsKKyAgbWVtY3B5KFByb2dyYW1OYW1lLCBQcm9nTmFtZS5kYXRhKCksIExlbik7CisgIFByb2dyYW1OYW1lW0xlbl0gPSAnXDAnOworCisgIFByb2dyYW1PdmVydmlldyA9IE92ZXJ2aWV3OworICBib29sIEVycm9yUGFyc2luZyA9IGZhbHNlOworCisgIC8vIENoZWNrIG91dCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGVtLgorICB1bnNpZ25lZCBOdW1Qb3NpdGlvbmFsUmVxdWlyZWQgPSAwOworCisgIC8vIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgYW4gdW5saW1pdGVkIG51bWJlciBvZiBwb3NpdGlvbmFscworICBib29sIEhhc1VubGltaXRlZFBvc2l0aW9uYWxzID0gZmFsc2U7CisKKyAgT3B0aW9uICpDb25zdW1lQWZ0ZXJPcHQgPSAwOworICBpZiAoIVBvc2l0aW9uYWxPcHRzLmVtcHR5KCkpIHsKKyAgICBpZiAoUG9zaXRpb25hbE9wdHNbMF0tPmdldE51bU9jY3VycmVuY2VzRmxhZygpID09IGNsOjpDb25zdW1lQWZ0ZXIpIHsKKyAgICAgIGFzc2VydChQb3NpdGlvbmFsT3B0cy5zaXplKCkgPiAxICYmCisgICAgICAgICAgICAgIkNhbm5vdCBzcGVjaWZ5IGNsOjpDb25zdW1lQWZ0ZXIgd2l0aG91dCBhIHBvc2l0aW9uYWwgYXJndW1lbnQhIik7CisgICAgICBDb25zdW1lQWZ0ZXJPcHQgPSBQb3NpdGlvbmFsT3B0c1swXTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgcG9zaXRpb25hbCB2YWx1ZXMgYXJlIF9yZXF1aXJlZF8uCisgICAgYm9vbCBVbmJvdW5kZWRGb3VuZCA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSBDb25zdW1lQWZ0ZXJPcHQgIT0gMCwgZSA9IFBvc2l0aW9uYWxPcHRzLnNpemUoKTsKKyAgICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgICBPcHRpb24gKk9wdCA9IFBvc2l0aW9uYWxPcHRzW2ldOworICAgICAgaWYgKFJlcXVpcmVzVmFsdWUoT3B0KSkKKyAgICAgICAgKytOdW1Qb3NpdGlvbmFsUmVxdWlyZWQ7CisgICAgICBlbHNlIGlmIChDb25zdW1lQWZ0ZXJPcHQpIHsKKyAgICAgICAgLy8gQ29uc3VtZUFmdGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoICJvcHRpb25hbCIgcG9zaXRpb25hbCBvcHRpb25zCisgICAgICAgIC8vIHVubGVzcyB0aGVyZSBpcyBvbmx5IG9uZSBwb3NpdGlvbmFsIGFyZ3VtZW50Li4uCisgICAgICAgIGlmIChQb3NpdGlvbmFsT3B0cy5zaXplKCkgPiAyKQorICAgICAgICAgIEVycm9yUGFyc2luZyB8PQorICAgICAgICAgICAgT3B0LT5lcnJvcigiZXJyb3IgLSB0aGlzIHBvc2l0aW9uYWwgb3B0aW9uIHdpbGwgbmV2ZXIgYmUgbWF0Y2hlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAiYmVjYXVzZSBpdCBkb2VzIG5vdCBSZXF1aXJlIGEgdmFsdWUsIGFuZCBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgImNsOjpDb25zdW1lQWZ0ZXIgb3B0aW9uIGlzIGFjdGl2ZSEiKTsKKyAgICAgIH0gZWxzZSBpZiAoVW5ib3VuZGVkRm91bmQgJiYgIU9wdC0+QXJnU3RyWzBdKSB7CisgICAgICAgIC8vIFRoaXMgb3B0aW9uIGRvZXMgbm90ICJyZXF1aXJlIiBhIHZhbHVlLi4uICBNYWtlIHN1cmUgdGhpcyBvcHRpb24gaXMKKyAgICAgICAgLy8gbm90IHNwZWNpZmllZCBhZnRlciBhbiBvcHRpb24gdGhhdCBlYXRzIGFsbCBleHRyYSBhcmd1bWVudHMsIG9yIHRoaXMKKyAgICAgICAgLy8gb25lIHdpbGwgbmV2ZXIgZ2V0IGFueSEKKyAgICAgICAgLy8KKyAgICAgICAgRXJyb3JQYXJzaW5nIHw9IE9wdC0+ZXJyb3IoImVycm9yIC0gb3B0aW9uIGNhbiBuZXZlciBtYXRjaCwgYmVjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbm90aGVyIHBvc2l0aW9uYWwgYXJndW1lbnQgd2lsbCBtYXRjaCBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmJvdW5kZWQgbnVtYmVyIG9mIHZhbHVlcywgYW5kIHRoaXMgb3B0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IHJlcXVpcmUgYSB2YWx1ZSEiKTsKKyAgICAgIH0KKyAgICAgIFVuYm91bmRlZEZvdW5kIHw9IEVhdHNVbmJvdW5kZWROdW1iZXJPZlZhbHVlcyhPcHQpOworICAgIH0KKyAgICBIYXNVbmxpbWl0ZWRQb3NpdGlvbmFscyA9IFVuYm91bmRlZEZvdW5kIHx8IENvbnN1bWVBZnRlck9wdDsKKyAgfQorCisgIC8vIFBvc2l0aW9uYWxWYWxzIC0gQSB2ZWN0b3Igb2YgInBvc2l0aW9uYWwiIGFyZ3VtZW50cyB3ZSBhY2N1bXVsYXRlIGludG8KKyAgLy8gdGhlIHByb2Nlc3MgYXQgdGhlIGVuZC4KKyAgLy8KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPFN0cmluZ1JlZix1bnNpZ25lZD4sIDQ+IFBvc2l0aW9uYWxWYWxzOworCisgIC8vIElmIHRoZSBwcm9ncmFtIGhhcyBuYW1lZCBwb3NpdGlvbmFsIGFyZ3VtZW50cywgYW5kIHRoZSBuYW1lIGhhcyBiZWVuIHJ1bgorICAvLyBhY3Jvc3MsIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9zaXRpb25hbCBhcmd1bWVudCB3YXMgbmFtZWQuICBPdGhlcndpc2UgcHV0CisgIC8vIHRoZSBwb3NpdGlvbmFsIGFyZ3MgaW50byB0aGUgUG9zaXRpb25hbFZhbHMgbGlzdC4uLgorICBPcHRpb24gKkFjdGl2ZVBvc2l0aW9uYWxBcmcgPSAwOworCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIGFyZ3VtZW50cy4uLiBwcm9jZXNzaW5nIHRoZW0uCisgIGJvb2wgRGFzaERhc2hGb3VuZCA9IGZhbHNlOyAgLy8gSGF2ZSB3ZSByZWFkICctLSc/CisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisgICAgT3B0aW9uICpIYW5kbGVyID0gMDsKKyAgICBTdHJpbmdSZWYgVmFsdWU7CisgICAgU3RyaW5nUmVmIEFyZ05hbWUgPSAiIjsKKworICAgIC8vIElmIHRoZSBvcHRpb24gbGlzdCBjaGFuZ2VkLCB0aGlzIG1lYW5zIHRoYXQgc29tZSBjb21tYW5kIGxpbmUKKyAgICAvLyBvcHRpb24gaGFzIGp1c3QgYmVlbiByZWdpc3RlcmVkIG9yIGRlcmVnaXN0ZXJlZC4gIFRoaXMgY2FuIG9jY3VyIGluCisgICAgLy8gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgLWxvYWQsIGV0Yy4gIElmIHRoaXMgaGFwcGVucywgcmVzY2FuIHRoZSBvcHRpb25zLgorICAgIGlmIChPcHRpb25MaXN0Q2hhbmdlZCkgeworICAgICAgUG9zaXRpb25hbE9wdHMuY2xlYXIoKTsKKyAgICAgIFNpbmtPcHRzLmNsZWFyKCk7CisgICAgICBPcHRzLmNsZWFyKCk7CisgICAgICBHZXRPcHRpb25JbmZvKFBvc2l0aW9uYWxPcHRzLCBTaW5rT3B0cywgT3B0cyk7CisgICAgICBPcHRpb25MaXN0Q2hhbmdlZCA9IGZhbHNlOworICAgIH0KKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgcG9zaXRpb25hbCBhcmd1bWVudC4gIFRoaXMgYXJndW1lbnQgaXMKKyAgICAvLyBjb25zaWRlcmVkIHRvIGJlIHBvc2l0aW9uYWwgaWYgaXQgZG9lc24ndCBzdGFydCB3aXRoICctJywgaWYgaXQgaXMgIi0iCisgICAgLy8gaXRzZWxmLCBvciBpZiB3ZSBoYXZlIHNlZW4gIi0tIiBhbHJlYWR5LgorICAgIC8vCisgICAgaWYgKGFyZ3ZbaV1bMF0gIT0gJy0nIHx8IGFyZ3ZbaV1bMV0gPT0gMCB8fCBEYXNoRGFzaEZvdW5kKSB7CisgICAgICAvLyBQb3NpdGlvbmFsIGFyZ3VtZW50IQorICAgICAgaWYgKEFjdGl2ZVBvc2l0aW9uYWxBcmcpIHsKKyAgICAgICAgUHJvdmlkZVBvc2l0aW9uYWxPcHRpb24oQWN0aXZlUG9zaXRpb25hbEFyZywgYXJndltpXSwgaSk7CisgICAgICAgIGNvbnRpbnVlOyAgLy8gV2UgYXJlIGRvbmUhCisgICAgICB9CisKKyAgICAgIGlmICghUG9zaXRpb25hbE9wdHMuZW1wdHkoKSkgeworICAgICAgICBQb3NpdGlvbmFsVmFscy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXJndltpXSxpKSk7CisKKyAgICAgICAgLy8gQWxsIG9mIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBoYXZlIGJlZW4gZnVsZnVsbGVkLCBnaXZlIHRoZSByZXN0IHRvCisgICAgICAgIC8vIHRoZSBjb25zdW1lIGFmdGVyIG9wdGlvbi4uLiBpZiBpdCdzIHNwZWNpZmllZC4uLgorICAgICAgICAvLworICAgICAgICBpZiAoUG9zaXRpb25hbFZhbHMuc2l6ZSgpID49IE51bVBvc2l0aW9uYWxSZXF1aXJlZCAmJgorICAgICAgICAgICAgQ29uc3VtZUFmdGVyT3B0ICE9IDApIHsKKyAgICAgICAgICBmb3IgKCsraTsgaSA8IGFyZ2M7ICsraSkKKyAgICAgICAgICAgIFBvc2l0aW9uYWxWYWxzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhcmd2W2ldLGkpKTsKKyAgICAgICAgICBicmVhazsgICAvLyBIYW5kbGUgb3V0c2lkZSBvZiB0aGUgYXJndW1lbnQgcHJvY2Vzc2luZyBsb29wLi4uCisgICAgICAgIH0KKworICAgICAgICAvLyBEZWxheSBwcm9jZXNzaW5nIHBvc2l0aW9uYWwgYXJndW1lbnRzIHVudGlsIHRoZSBlbmQuLi4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChhcmd2W2ldWzBdID09ICctJyAmJiBhcmd2W2ldWzFdID09ICctJyAmJiBhcmd2W2ldWzJdID09IDAgJiYKKyAgICAgICAgICAgICAgICFEYXNoRGFzaEZvdW5kKSB7CisgICAgICBEYXNoRGFzaEZvdW5kID0gdHJ1ZTsgIC8vIFRoaXMgaXMgdGhlIG15dGhpY2FsICItLSI/CisgICAgICBjb250aW51ZTsgICAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byBwcm9jZXNzIGl0IGFzIGFuIGFyZ3VtZW50IGl0c2VsZi4KKyAgICB9IGVsc2UgaWYgKEFjdGl2ZVBvc2l0aW9uYWxBcmcgJiYKKyAgICAgICAgICAgICAgIChBY3RpdmVQb3NpdGlvbmFsQXJnLT5nZXRNaXNjRmxhZ3MoKSAmIFBvc2l0aW9uYWxFYXRzQXJncykpIHsKKyAgICAgIC8vIElmIHRoZXJlIGlzIGEgcG9zaXRpb25hbCBhcmd1bWVudCBlYXRpbmcgb3B0aW9ucywgY2hlY2sgdG8gc2VlIGlmIHRoaXMKKyAgICAgIC8vIG9wdGlvbiBpcyBhbm90aGVyIHBvc2l0aW9uYWwgYXJndW1lbnQuICBJZiBzbywgdHJlYXQgaXQgYXMgYW4gYXJndW1lbnQsCisgICAgICAvLyBvdGhlcndpc2UgZmVlZCBpdCB0byB0aGUgZWF0aW5nIHBvc2l0aW9uYWwuCisgICAgICBBcmdOYW1lID0gYXJndltpXSsxOworICAgICAgLy8gRWF0IGxlYWRpbmcgZGFzaGVzLgorICAgICAgd2hpbGUgKCFBcmdOYW1lLmVtcHR5KCkgJiYgQXJnTmFtZVswXSA9PSAnLScpCisgICAgICAgIEFyZ05hbWUgPSBBcmdOYW1lLnN1YnN0cigxKTsKKworICAgICAgSGFuZGxlciA9IExvb2t1cE9wdGlvbihBcmdOYW1lLCBWYWx1ZSwgT3B0cyk7CisgICAgICBpZiAoIUhhbmRsZXIgfHwgSGFuZGxlci0+Z2V0Rm9ybWF0dGluZ0ZsYWcoKSAhPSBjbDo6UG9zaXRpb25hbCkgeworICAgICAgICBQcm92aWRlUG9zaXRpb25hbE9wdGlvbihBY3RpdmVQb3NpdGlvbmFsQXJnLCBhcmd2W2ldLCBpKTsKKyAgICAgICAgY29udGludWU7ICAvLyBXZSBhcmUgZG9uZSEKKyAgICAgIH0KKworICAgIH0gZWxzZSB7ICAgICAvLyBXZSBzdGFydCB3aXRoIGEgJy0nLCBtdXN0IGJlIGFuIGFyZ3VtZW50LgorICAgICAgQXJnTmFtZSA9IGFyZ3ZbaV0rMTsKKyAgICAgIC8vIEVhdCBsZWFkaW5nIGRhc2hlcy4KKyAgICAgIHdoaWxlICghQXJnTmFtZS5lbXB0eSgpICYmIEFyZ05hbWVbMF0gPT0gJy0nKQorICAgICAgICBBcmdOYW1lID0gQXJnTmFtZS5zdWJzdHIoMSk7CisKKyAgICAgIEhhbmRsZXIgPSBMb29rdXBPcHRpb24oQXJnTmFtZSwgVmFsdWUsIE9wdHMpOworCisgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyAib3B0aW9uIiBpcyByZWFsbHkgYSBwcmVmaXhlZCBvciBncm91cGVkIGFyZ3VtZW50LgorICAgICAgaWYgKEhhbmRsZXIgPT0gMCkKKyAgICAgICAgSGFuZGxlciA9IEhhbmRsZVByZWZpeGVkT3JHcm91cGVkT3B0aW9uKEFyZ05hbWUsIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JQYXJzaW5nLCBPcHRzKTsKKyAgICB9CisKKyAgICBpZiAoSGFuZGxlciA9PSAwKSB7CisgICAgICBpZiAoU2lua09wdHMuZW1wdHkoKSkgeworICAgICAgICBlcnJzKCkgPDwgUHJvZ3JhbU5hbWUgPDwgIjogVW5rbm93biBjb21tYW5kIGxpbmUgYXJndW1lbnQgJyIKKyAgICAgICAgICAgICA8PCBhcmd2W2ldIDw8ICInLiAgVHJ5OiAnIiA8PCBhcmd2WzBdIDw8ICIgLWhlbHAnXG4iOworICAgICAgICBFcnJvclBhcnNpbmcgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8T3B0aW9uKj46Oml0ZXJhdG9yIEkgPSBTaW5rT3B0cy5iZWdpbigpLAorICAgICAgICAgICAgICAgRSA9IFNpbmtPcHRzLmVuZCgpOyBJICE9IEUgOyArK0kpCisgICAgICAgICAgKCpJKS0+YWRkT2NjdXJyZW5jZShpLCAiIiwgYXJndltpXSk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGlzIGEgbmFtZWQgcG9zaXRpb25hbCBhcmd1bWVudCwganVzdCByZW1lbWJlciB0aGF0IGl0IGlzIHRoZQorICAgIC8vIGFjdGl2ZSBvbmUuLi4KKyAgICBpZiAoSGFuZGxlci0+Z2V0Rm9ybWF0dGluZ0ZsYWcoKSA9PSBjbDo6UG9zaXRpb25hbCkKKyAgICAgIEFjdGl2ZVBvc2l0aW9uYWxBcmcgPSBIYW5kbGVyOworICAgIGVsc2UKKyAgICAgIEVycm9yUGFyc2luZyB8PSBQcm92aWRlT3B0aW9uKEhhbmRsZXIsIEFyZ05hbWUsIFZhbHVlLCBhcmdjLCBhcmd2LCBpKTsKKyAgfQorCisgIC8vIENoZWNrIGFuZCBoYW5kbGUgcG9zaXRpb25hbCBhcmd1bWVudHMgbm93Li4uCisgIGlmIChOdW1Qb3NpdGlvbmFsUmVxdWlyZWQgPiBQb3NpdGlvbmFsVmFscy5zaXplKCkpIHsKKyAgICBlcnJzKCkgPDwgUHJvZ3JhbU5hbWUKKyAgICAgICAgIDw8ICI6IE5vdCBlbm91Z2ggcG9zaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHNwZWNpZmllZCFcbiIKKyAgICAgICAgIDw8ICJNdXN0IHNwZWNpZnkgYXQgbGVhc3QgIiA8PCBOdW1Qb3NpdGlvbmFsUmVxdWlyZWQKKyAgICAgICAgIDw8ICIgcG9zaXRpb25hbCBhcmd1bWVudHM6IFNlZTogIiA8PCBhcmd2WzBdIDw8ICIgLWhlbHBcbiI7CisKKyAgICBFcnJvclBhcnNpbmcgPSB0cnVlOworICB9IGVsc2UgaWYgKCFIYXNVbmxpbWl0ZWRQb3NpdGlvbmFscyAmJgorICAgICAgICAgICAgIFBvc2l0aW9uYWxWYWxzLnNpemUoKSA+IFBvc2l0aW9uYWxPcHRzLnNpemUoKSkgeworICAgIGVycnMoKSA8PCBQcm9ncmFtTmFtZQorICAgICAgICAgPDwgIjogVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWVkIVxuIgorICAgICAgICAgPDwgIkNhbiBzcGVjaWZ5IGF0IG1vc3QgIiA8PCBQb3NpdGlvbmFsT3B0cy5zaXplKCkKKyAgICAgICAgIDw8ICIgcG9zaXRpb25hbCBhcmd1bWVudHM6IFNlZTogIiA8PCBhcmd2WzBdIDw8ICIgLWhlbHBcbiI7CisgICAgRXJyb3JQYXJzaW5nID0gdHJ1ZTsKKworICB9IGVsc2UgaWYgKENvbnN1bWVBZnRlck9wdCA9PSAwKSB7CisgICAgLy8gUG9zaXRpb25hbCBhcmdzIGhhdmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQgaWYgQ29uc3VtZUFmdGVyIGlzIHNwZWNpZmllZC4KKyAgICB1bnNpZ25lZCBWYWxObyA9IDAsIE51bVZhbHMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oUG9zaXRpb25hbFZhbHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IFBvc2l0aW9uYWxPcHRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChSZXF1aXJlc1ZhbHVlKFBvc2l0aW9uYWxPcHRzW2ldKSkgeworICAgICAgICBQcm92aWRlUG9zaXRpb25hbE9wdGlvbihQb3NpdGlvbmFsT3B0c1tpXSwgUG9zaXRpb25hbFZhbHNbVmFsTm9dLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbmFsVmFsc1tWYWxOb10uc2Vjb25kKTsKKyAgICAgICAgVmFsTm8rKzsKKyAgICAgICAgLS1OdW1Qb3NpdGlvbmFsUmVxdWlyZWQ7ICAvLyBXZSBmdWxmaWxsZWQgb3VyIGR1dHkuLi4KKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgX2Nhbl8gZ2l2ZSB0aGlzIG9wdGlvbiBtb3JlIGFyZ3VtZW50cywgZG8gc28gbm93LCBhcyBsb25nIGFzIHdlCisgICAgICAvLyBkbyBub3QgZ2l2ZSBpdCB2YWx1ZXMgdGhhdCBvdGhlcnMgbmVlZC4gICdEb25lJyBjb250cm9scyB3aGV0aGVyIHRoZQorICAgICAgLy8gb3B0aW9uIGV2ZW4gX1dBTlRTXyBhbnkgbW9yZS4KKyAgICAgIC8vCisgICAgICBib29sIERvbmUgPSBQb3NpdGlvbmFsT3B0c1tpXS0+Z2V0TnVtT2NjdXJyZW5jZXNGbGFnKCkgPT0gY2w6OlJlcXVpcmVkOworICAgICAgd2hpbGUgKE51bVZhbHMtVmFsTm8gPiBOdW1Qb3NpdGlvbmFsUmVxdWlyZWQgJiYgIURvbmUpIHsKKyAgICAgICAgc3dpdGNoIChQb3NpdGlvbmFsT3B0c1tpXS0+Z2V0TnVtT2NjdXJyZW5jZXNGbGFnKCkpIHsKKyAgICAgICAgY2FzZSBjbDo6T3B0aW9uYWw6CisgICAgICAgICAgRG9uZSA9IHRydWU7ICAgICAgICAgIC8vIE9wdGlvbmFsIGFyZ3VtZW50cyB3YW50IF9hdCBtb3N0XyBvbmUgdmFsdWUKKyAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKyAgICAgICAgY2FzZSBjbDo6WmVyb09yTW9yZTogICAgLy8gWmVybyBvciBtb3JlIHdpbGwgdGFrZSBhbGwgdGhleSBjYW4gZ2V0Li4uCisgICAgICAgIGNhc2UgY2w6Ok9uZU9yTW9yZTogICAgIC8vIE9uZSBvciBtb3JlIHdpbGwgdGFrZSBhbGwgdGhleSBjYW4gZ2V0Li4uCisgICAgICAgICAgUHJvdmlkZVBvc2l0aW9uYWxPcHRpb24oUG9zaXRpb25hbE9wdHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb25hbFZhbHNbVmFsTm9dLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uYWxWYWxzW1ZhbE5vXS5zZWNvbmQpOworICAgICAgICAgIFZhbE5vKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW50ZXJuYWwgZXJyb3IsIHVuZXhwZWN0ZWQgTnVtT2NjdXJyZW5jZXMgZmxhZyBpbiAiCisgICAgICAgICAgICAgICAgICJwb3NpdGlvbmFsIGFyZ3VtZW50IHByb2Nlc3NpbmchIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KENvbnN1bWVBZnRlck9wdCAmJiBOdW1Qb3NpdGlvbmFsUmVxdWlyZWQgPD0gUG9zaXRpb25hbFZhbHMuc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBWYWxObyA9IDA7CisgICAgZm9yIChzaXplX3QgaiA9IDEsIGUgPSBQb3NpdGlvbmFsT3B0cy5zaXplKCk7IGogIT0gZTsgKytqKQorICAgICAgaWYgKFJlcXVpcmVzVmFsdWUoUG9zaXRpb25hbE9wdHNbal0pKSB7CisgICAgICAgIEVycm9yUGFyc2luZyB8PSBQcm92aWRlUG9zaXRpb25hbE9wdGlvbihQb3NpdGlvbmFsT3B0c1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uYWxWYWxzW1ZhbE5vXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uYWxWYWxzW1ZhbE5vXS5zZWNvbmQpOworICAgICAgICBWYWxObysrOworICAgICAgfQorCisgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIGp1c3Qgb25lIHBvc2l0aW9uYWwgb3B0aW9uLCBhbmQgaXQncworICAgIC8vIG9wdGlvbmFsLiAgSW4gdGhpcyBjYXNlLCB3ZSB3YW50IHRvIGdpdmUgSlVTVCBUSEUgRklSU1Qgb3B0aW9uIHRvIHRoZQorICAgIC8vIHBvc2l0aW9uYWwgb3B0aW9uIGFuZCBrZWVwIHRoZSByZXN0IGZvciB0aGUgY29uc3VtZSBhZnRlci4gIFRoZSBhYm92ZQorICAgIC8vIGxvb3Agd291bGQgaGF2ZSBhc3NpZ25lZCBubyB2YWx1ZXMgdG8gcG9zaXRpb25hbCBvcHRpb25zIGluIHRoaXMgY2FzZS4KKyAgICAvLworICAgIGlmIChQb3NpdGlvbmFsT3B0cy5zaXplKCkgPT0gMiAmJiBWYWxObyA9PSAwICYmICFQb3NpdGlvbmFsVmFscy5lbXB0eSgpKSB7CisgICAgICBFcnJvclBhcnNpbmcgfD0gUHJvdmlkZVBvc2l0aW9uYWxPcHRpb24oUG9zaXRpb25hbE9wdHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb25hbFZhbHNbVmFsTm9dLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uYWxWYWxzW1ZhbE5vXS5zZWNvbmQpOworICAgICAgVmFsTm8rKzsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgb3ZlciBhbGwgb2YgdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUKKyAgICAvLyBjbDo6Q29uc3VtZUFmdGVyIGNvbW1hbmQgbGluZSBvcHRpb24uLi4KKyAgICBmb3IgKDsgVmFsTm8gIT0gUG9zaXRpb25hbFZhbHMuc2l6ZSgpOyArK1ZhbE5vKQorICAgICAgRXJyb3JQYXJzaW5nIHw9IFByb3ZpZGVQb3NpdGlvbmFsT3B0aW9uKENvbnN1bWVBZnRlck9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbmFsVmFsc1tWYWxOb10uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb25hbFZhbHNbVmFsTm9dLnNlY29uZCk7CisgIH0KKworICAvLyBMb29wIG92ZXIgYXJncyBhbmQgbWFrZSBzdXJlIGFsbCByZXF1aXJlZCBhcmdzIGFyZSBzcGVjaWZpZWQhCisgIGZvciAoU3RyaW5nTWFwPE9wdGlvbio+OjppdGVyYXRvciBJID0gT3B0cy5iZWdpbigpLAorICAgICAgICAgRSA9IE9wdHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgc3dpdGNoIChJLT5zZWNvbmQtPmdldE51bU9jY3VycmVuY2VzRmxhZygpKSB7CisgICAgY2FzZSBSZXF1aXJlZDoKKyAgICBjYXNlIE9uZU9yTW9yZToKKyAgICAgIGlmIChJLT5zZWNvbmQtPmdldE51bU9jY3VycmVuY2VzKCkgPT0gMCkgeworICAgICAgICBJLT5zZWNvbmQtPmVycm9yKCJtdXN0IGJlIHNwZWNpZmllZCBhdCBsZWFzdCBvbmNlISIpOworICAgICAgICBFcnJvclBhcnNpbmcgPSB0cnVlOworICAgICAgfQorICAgICAgLy8gRmFsbCB0aHJvdWdoCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIEZyZWUgYWxsIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGVkIHRvIHRoZSBtYXAuICBDb21tYW5kIGxpbmUgb3B0aW9ucyBtYXkgb25seQorICAvLyBiZSBwcm9jZXNzZWQgb25jZSEKKyAgT3B0cy5jbGVhcigpOworICBQb3NpdGlvbmFsT3B0cy5jbGVhcigpOworICBNb3JlSGVscC0+Y2xlYXIoKTsKKworICAvLyBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IEV4cGFuZFJlc3BvbnNlRmlsZXMuCisgIGlmIChSZWFkUmVzcG9uc2VGaWxlcykgeworICAgIC8vIEZyZWUgYWxsIHRoZSBzdHJkdXAoKWVkIHN0cmluZ3MuCisgICAgZm9yIChzdGQ6OnZlY3RvcjxjaGFyKj46Oml0ZXJhdG9yIGkgPSBuZXdBcmd2LmJlZ2luKCksIGUgPSBuZXdBcmd2LmVuZCgpOworICAgICAgICAgaSAhPSBlOyArK2kpCisgICAgICBmcmVlKCppKTsKKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiQXJnczogIjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kpCisgICAgICAgICAgZGJncygpIDw8IGFyZ3ZbaV0gPDwgJyAnOworICAgICAgICBkYmdzKCkgPDwgJ1xuJzsKKyAgICAgICApOworCisgIC8vIElmIHdlIGhhZCBhbiBlcnJvciBwcm9jZXNzaW5nIG91ciBhcmd1bWVudHMsIGRvbid0IGxldCB0aGUgcHJvZ3JhbSBleGVjdXRlCisgIGlmIChFcnJvclBhcnNpbmcpIGV4aXQoMSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPcHRpb24gQmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8KKworYm9vbCBPcHRpb246OmVycm9yKGNvbnN0IFR3aW5lICZNZXNzYWdlLCBTdHJpbmdSZWYgQXJnTmFtZSkgeworICBpZiAoQXJnTmFtZS5kYXRhKCkgPT0gMCkgQXJnTmFtZSA9IEFyZ1N0cjsKKyAgaWYgKEFyZ05hbWUuZW1wdHkoKSkKKyAgICBlcnJzKCkgPDwgSGVscFN0cjsgIC8vIEJlIG5pY2UgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnRzCisgIGVsc2UKKyAgICBlcnJzKCkgPDwgUHJvZ3JhbU5hbWUgPDwgIjogZm9yIHRoZSAtIiA8PCBBcmdOYW1lOworCisgIGVycnMoKSA8PCAiIG9wdGlvbjogIiA8PCBNZXNzYWdlIDw8ICJcbiI7CisgIHJldHVybiB0cnVlOworfQorCitib29sIE9wdGlvbjo6YWRkT2NjdXJyZW5jZSh1bnNpZ25lZCBwb3MsIFN0cmluZ1JlZiBBcmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlLCBib29sIE11bHRpQXJnKSB7CisgIGlmICghTXVsdGlBcmcpCisgICAgTnVtT2NjdXJyZW5jZXMrKzsgICAvLyBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBoYXZlIGJlZW4gc2VlbgorCisgIHN3aXRjaCAoZ2V0TnVtT2NjdXJyZW5jZXNGbGFnKCkpIHsKKyAgY2FzZSBPcHRpb25hbDoKKyAgICBpZiAoTnVtT2NjdXJyZW5jZXMgPiAxKQorICAgICAgcmV0dXJuIGVycm9yKCJtYXkgb25seSBvY2N1ciB6ZXJvIG9yIG9uZSB0aW1lcyEiLCBBcmdOYW1lKTsKKyAgICBicmVhazsKKyAgY2FzZSBSZXF1aXJlZDoKKyAgICBpZiAoTnVtT2NjdXJyZW5jZXMgPiAxKQorICAgICAgcmV0dXJuIGVycm9yKCJtdXN0IG9jY3VyIGV4YWN0bHkgb25lIHRpbWUhIiwgQXJnTmFtZSk7CisgICAgLy8gRmFsbCB0aHJvdWdoCisgIGNhc2UgT25lT3JNb3JlOgorICBjYXNlIFplcm9Pck1vcmU6CisgIGNhc2UgQ29uc3VtZUFmdGVyOiBicmVhazsKKyAgZGVmYXVsdDogcmV0dXJuIGVycm9yKCJiYWQgbnVtIG9jY3VycmVuY2VzIGZsYWcgdmFsdWUhIik7CisgIH0KKworICByZXR1cm4gaGFuZGxlT2NjdXJyZW5jZShwb3MsIEFyZ05hbWUsIFZhbHVlKTsKK30KKworCisvLyBnZXRWYWx1ZVN0ciAtIEdldCB0aGUgdmFsdWUgZGVzY3JpcHRpb24gc3RyaW5nLCB1c2luZyAiRGVmYXVsdE1zZyIgaWYgbm90aGluZworLy8gaGFzIGJlZW4gc3BlY2lmaWVkIHlldC4KKy8vCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0VmFsdWVTdHIoY29uc3QgT3B0aW9uICZPLCBjb25zdCBjaGFyICpEZWZhdWx0TXNnKSB7CisgIGlmIChPLlZhbHVlU3RyWzBdID09IDApIHJldHVybiBEZWZhdWx0TXNnOworICByZXR1cm4gTy5WYWx1ZVN0cjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIGNsOjphbGlhcyBjbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8KKworLy8gUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgb3B0aW9uIHRhZyBmb3IgcHJpbnRpbmcuLi4KK3NpemVfdCBhbGlhczo6Z2V0T3B0aW9uV2lkdGgoKSBjb25zdCB7CisgIHJldHVybiBzdGQ6OnN0cmxlbihBcmdTdHIpKzY7Cit9CisKKy8vIFByaW50IG91dCB0aGUgb3B0aW9uIGZvciB0aGUgYWxpYXMuCit2b2lkIGFsaWFzOjpwcmludE9wdGlvbkluZm8oc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdCB7CisgIHNpemVfdCBMID0gc3RkOjpzdHJsZW4oQXJnU3RyKTsKKyAgZXJycygpIDw8ICIgIC0iIDw8IEFyZ1N0cjsKKyAgZXJycygpLmluZGVudChHbG9iYWxXaWR0aC1MLTYpIDw8ICIgLSAiIDw8IEhlbHBTdHIgPDwgIlxuIjsKK30KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXJzZXIgSW1wbGVtZW50YXRpb24gY29kZS4uLgorLy8KKworLy8gYmFzaWNfcGFyc2VyIGltcGxlbWVudGF0aW9uCisvLworCisvLyBSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBvcHRpb24gdGFnIGZvciBwcmludGluZy4uLgorc2l6ZV90IGJhc2ljX3BhcnNlcl9pbXBsOjpnZXRPcHRpb25XaWR0aChjb25zdCBPcHRpb24gJk8pIGNvbnN0IHsKKyAgc2l6ZV90IExlbiA9IHN0ZDo6c3RybGVuKE8uQXJnU3RyKTsKKyAgaWYgKGNvbnN0IGNoYXIgKlZhbE5hbWUgPSBnZXRWYWx1ZU5hbWUoKSkKKyAgICBMZW4gKz0gc3RkOjpzdHJsZW4oZ2V0VmFsdWVTdHIoTywgVmFsTmFtZSkpKzM7CisKKyAgcmV0dXJuIExlbiArIDY7Cit9CisKKy8vIHByaW50T3B0aW9uSW5mbyAtIFByaW50IG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG9wdGlvbi4gIFRoZQorLy8gdG8tYmUtbWFpbnRhaW5lZCB3aWR0aCBpcyBzcGVjaWZpZWQuCisvLwordm9pZCBiYXNpY19wYXJzZXJfaW1wbDo6cHJpbnRPcHRpb25JbmZvKGNvbnN0IE9wdGlvbiAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0IHsKKyAgb3V0cygpIDw8ICIgIC0iIDw8IE8uQXJnU3RyOworCisgIGlmIChjb25zdCBjaGFyICpWYWxOYW1lID0gZ2V0VmFsdWVOYW1lKCkpCisgICAgb3V0cygpIDw8ICI9PCIgPDwgZ2V0VmFsdWVTdHIoTywgVmFsTmFtZSkgPDwgJz4nOworCisgIG91dHMoKS5pbmRlbnQoR2xvYmFsV2lkdGgtZ2V0T3B0aW9uV2lkdGgoTykpIDw8ICIgLSAiIDw8IE8uSGVscFN0ciA8PCAnXG4nOworfQorCisKKworCisvLyBwYXJzZXI8Ym9vbD4gaW1wbGVtZW50YXRpb24KKy8vCitib29sIHBhcnNlcjxib29sPjo6cGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnLCBib29sICZWYWx1ZSkgeworICBpZiAoQXJnID09ICIiIHx8IEFyZyA9PSAidHJ1ZSIgfHwgQXJnID09ICJUUlVFIiB8fCBBcmcgPT0gIlRydWUiIHx8CisgICAgICBBcmcgPT0gIjEiKSB7CisgICAgVmFsdWUgPSB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChBcmcgPT0gImZhbHNlIiB8fCBBcmcgPT0gIkZBTFNFIiB8fCBBcmcgPT0gIkZhbHNlIiB8fCBBcmcgPT0gIjAiKSB7CisgICAgVmFsdWUgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIE8uZXJyb3IoIiciICsgQXJnICsKKyAgICAgICAgICAgICAgICAgIicgaXMgaW52YWxpZCB2YWx1ZSBmb3IgYm9vbGVhbiBhcmd1bWVudCEgVHJ5IDAgb3IgMSIpOworfQorCisvLyBwYXJzZXI8Ym9vbE9yRGVmYXVsdD4gaW1wbGVtZW50YXRpb24KKy8vCitib29sIHBhcnNlcjxib29sT3JEZWZhdWx0Pjo6cGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnLCBib29sT3JEZWZhdWx0ICZWYWx1ZSkgeworICBpZiAoQXJnID09ICIiIHx8IEFyZyA9PSAidHJ1ZSIgfHwgQXJnID09ICJUUlVFIiB8fCBBcmcgPT0gIlRydWUiIHx8CisgICAgICBBcmcgPT0gIjEiKSB7CisgICAgVmFsdWUgPSBCT1VfVFJVRTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKEFyZyA9PSAiZmFsc2UiIHx8IEFyZyA9PSAiRkFMU0UiIHx8IEFyZyA9PSAiRmFsc2UiIHx8IEFyZyA9PSAiMCIpIHsKKyAgICBWYWx1ZSA9IEJPVV9GQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gTy5lcnJvcigiJyIgKyBBcmcgKworICAgICAgICAgICAgICAgICAiJyBpcyBpbnZhbGlkIHZhbHVlIGZvciBib29sZWFuIGFyZ3VtZW50ISBUcnkgMCBvciAxIik7Cit9CisKKy8vIHBhcnNlcjxpbnQ+IGltcGxlbWVudGF0aW9uCisvLworYm9vbCBwYXJzZXI8aW50Pjo6cGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBBcmcsIGludCAmVmFsdWUpIHsKKyAgaWYgKEFyZy5nZXRBc0ludGVnZXIoMCwgVmFsdWUpKQorICAgIHJldHVybiBPLmVycm9yKCInIiArIEFyZyArICInIHZhbHVlIGludmFsaWQgZm9yIGludGVnZXIgYXJndW1lbnQhIik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gcGFyc2VyPHVuc2lnbmVkPiBpbXBsZW1lbnRhdGlvbgorLy8KK2Jvb2wgcGFyc2VyPHVuc2lnbmVkPjo6cGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZywgdW5zaWduZWQgJlZhbHVlKSB7CisKKyAgaWYgKEFyZy5nZXRBc0ludGVnZXIoMCwgVmFsdWUpKQorICAgIHJldHVybiBPLmVycm9yKCInIiArIEFyZyArICInIHZhbHVlIGludmFsaWQgZm9yIHVpbnQgYXJndW1lbnQhIik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gcGFyc2VyPGRvdWJsZT4vcGFyc2VyPGZsb2F0PiBpbXBsZW1lbnRhdGlvbgorLy8KK3N0YXRpYyBib29sIHBhcnNlRG91YmxlKE9wdGlvbiAmTywgU3RyaW5nUmVmIEFyZywgZG91YmxlICZWYWx1ZSkgeworICBTbWFsbFN0cmluZzwzMj4gVG1wU3RyKEFyZy5iZWdpbigpLCBBcmcuZW5kKCkpOworICBjb25zdCBjaGFyICpBcmdTdGFydCA9IFRtcFN0ci5jX3N0cigpOworICBjaGFyICpFbmQ7CisgIFZhbHVlID0gc3RydG9kKEFyZ1N0YXJ0LCAmRW5kKTsKKyAgaWYgKCpFbmQgIT0gMCkKKyAgICByZXR1cm4gTy5lcnJvcigiJyIgKyBBcmcgKyAiJyB2YWx1ZSBpbnZhbGlkIGZvciBmbG9hdGluZyBwb2ludCBhcmd1bWVudCEiKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIHBhcnNlcjxkb3VibGU+OjpwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZywgZG91YmxlICZWYWwpIHsKKyAgcmV0dXJuIHBhcnNlRG91YmxlKE8sIEFyZywgVmFsKTsKK30KKworYm9vbCBwYXJzZXI8ZmxvYXQ+OjpwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnLCBmbG9hdCAmVmFsKSB7CisgIGRvdWJsZSBkVmFsOworICBpZiAocGFyc2VEb3VibGUoTywgQXJnLCBkVmFsKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgVmFsID0gKGZsb2F0KWRWYWw7CisgIHJldHVybiBmYWxzZTsKK30KKworCisKKy8vIGdlbmVyaWNfcGFyc2VyX2Jhc2UgaW1wbGVtZW50YXRpb24KKy8vCisKKy8vIGZpbmRPcHRpb24gLSBSZXR1cm4gdGhlIG9wdGlvbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCisvLyBhcmd1bWVudCBzdHJpbmcuICBJZiB0aGUgb3B0aW9uIGlzIG5vdCBmb3VuZCwgZ2V0TnVtT3B0aW9ucygpIGlzIHJldHVybmVkLgorLy8KK3Vuc2lnbmVkIGdlbmVyaWNfcGFyc2VyX2Jhc2U6OmZpbmRPcHRpb24oY29uc3QgY2hhciAqTmFtZSkgeworICB1bnNpZ25lZCBlID0gZ2V0TnVtT3B0aW9ucygpOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKHN0cmNtcChnZXRPcHRpb24oaSksIE5hbWUpID09IDApCisgICAgICByZXR1cm4gaTsKKyAgfQorICByZXR1cm4gZTsKK30KKworCisvLyBSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBvcHRpb24gdGFnIGZvciBwcmludGluZy4uLgorc2l6ZV90IGdlbmVyaWNfcGFyc2VyX2Jhc2U6OmdldE9wdGlvbldpZHRoKGNvbnN0IE9wdGlvbiAmTykgY29uc3QgeworICBpZiAoTy5oYXNBcmdTdHIoKSkgeworICAgIHNpemVfdCBTaXplID0gc3RkOjpzdHJsZW4oTy5BcmdTdHIpKzY7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wdGlvbnMoKTsgaSAhPSBlOyArK2kpCisgICAgICBTaXplID0gc3RkOjptYXgoU2l6ZSwgc3RkOjpzdHJsZW4oZ2V0T3B0aW9uKGkpKSs4KTsKKyAgICByZXR1cm4gU2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBzaXplX3QgQmFzZVNpemUgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcHRpb25zKCk7IGkgIT0gZTsgKytpKQorICAgICAgQmFzZVNpemUgPSBzdGQ6Om1heChCYXNlU2l6ZSwgc3RkOjpzdHJsZW4oZ2V0T3B0aW9uKGkpKSs4KTsKKyAgICByZXR1cm4gQmFzZVNpemU7CisgIH0KK30KKworLy8gcHJpbnRPcHRpb25JbmZvIC0gUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3B0aW9uLiAgVGhlCisvLyB0by1iZS1tYWludGFpbmVkIHdpZHRoIGlzIHNwZWNpZmllZC4KKy8vCit2b2lkIGdlbmVyaWNfcGFyc2VyX2Jhc2U6OnByaW50T3B0aW9uSW5mbyhjb25zdCBPcHRpb24gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0IHsKKyAgaWYgKE8uaGFzQXJnU3RyKCkpIHsKKyAgICBzaXplX3QgTCA9IHN0ZDo6c3RybGVuKE8uQXJnU3RyKTsKKyAgICBvdXRzKCkgPDwgIiAgLSIgPDwgTy5BcmdTdHI7CisgICAgb3V0cygpLmluZGVudChHbG9iYWxXaWR0aC1MLTYpIDw8ICIgLSAiIDw8IE8uSGVscFN0ciA8PCAnXG4nOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wdGlvbnMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIHNpemVfdCBOdW1TcGFjZXMgPSBHbG9iYWxXaWR0aC1zdHJsZW4oZ2V0T3B0aW9uKGkpKS04OworICAgICAgb3V0cygpIDw8ICIgICAgPSIgPDwgZ2V0T3B0aW9uKGkpOworICAgICAgb3V0cygpLmluZGVudChOdW1TcGFjZXMpIDw8ICIgLSAgICIgPDwgZ2V0RGVzY3JpcHRpb24oaSkgPDwgJ1xuJzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKE8uSGVscFN0clswXSkKKyAgICAgIG91dHMoKSA8PCAiICAiIDw8IE8uSGVscFN0ciA8PCAnXG4nOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcHRpb25zKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBzaXplX3QgTCA9IHN0ZDo6c3RybGVuKGdldE9wdGlvbihpKSk7CisgICAgICBvdXRzKCkgPDwgIiAgICAtIiA8PCBnZXRPcHRpb24oaSk7CisgICAgICBvdXRzKCkuaW5kZW50KEdsb2JhbFdpZHRoLUwtOCkgPDwgIiAtICIgPDwgZ2V0RGVzY3JpcHRpb24oaSkgPDwgJ1xuJzsKKyAgICB9CisgIH0KK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gLWhlbHAgYW5kIC1oZWxwLWhpZGRlbiBvcHRpb24gaW1wbGVtZW50YXRpb24KKy8vCisKK3N0YXRpYyBpbnQgT3B0TmFtZUNvbXBhcmUoY29uc3Qgdm9pZCAqTEhTLCBjb25zdCB2b2lkICpSSFMpIHsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCBPcHRpb24qPiBwYWlyX3R5OworCisgIHJldHVybiBzdHJjbXAoKChwYWlyX3R5KilMSFMpLT5maXJzdCwgKChwYWlyX3R5KilSSFMpLT5maXJzdCk7Cit9CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEhlbHBQcmludGVyIHsKKyAgc2l6ZV90IE1heEFyZ0xlbjsKKyAgY29uc3QgT3B0aW9uICpFbXB0eUFyZzsKKyAgY29uc3QgYm9vbCBTaG93SGlkZGVuOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEhlbHBQcmludGVyKGJvb2wgc2hvd0hpZGRlbikgOiBTaG93SGlkZGVuKHNob3dIaWRkZW4pIHsKKyAgICBFbXB0eUFyZyA9IDA7CisgIH0KKworICB2b2lkIG9wZXJhdG9yPShib29sIFZhbHVlKSB7CisgICAgaWYgKFZhbHVlID09IGZhbHNlKSByZXR1cm47CisKKyAgICAvLyBHZXQgYWxsIHRoZSBvcHRpb25zLgorICAgIFNtYWxsVmVjdG9yPE9wdGlvbiosIDQ+IFBvc2l0aW9uYWxPcHRzOworICAgIFNtYWxsVmVjdG9yPE9wdGlvbiosIDQ+IFNpbmtPcHRzOworICAgIFN0cmluZ01hcDxPcHRpb24qPiBPcHRNYXA7CisgICAgR2V0T3B0aW9uSW5mbyhQb3NpdGlvbmFsT3B0cywgU2lua09wdHMsIE9wdE1hcCk7CisKKyAgICAvLyBDb3B5IE9wdGlvbnMgaW50byBhIHZlY3RvciBzbyB3ZSBjYW4gc29ydCB0aGVtIGFzIHdlIGxpa2UuCisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgT3B0aW9uKj4sIDEyOD4gT3B0czsKKyAgICBTbWFsbFB0clNldDxPcHRpb24qLCAxMjg+IE9wdGlvblNldDsgIC8vIER1cGxpY2F0ZSBvcHRpb24gZGV0ZWN0aW9uLgorCisgICAgZm9yIChTdHJpbmdNYXA8T3B0aW9uKj46Oml0ZXJhdG9yIEkgPSBPcHRNYXAuYmVnaW4oKSwgRSA9IE9wdE1hcC5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAvLyBJZ25vcmUgcmVhbGx5LWhpZGRlbiBvcHRpb25zLgorICAgICAgaWYgKEktPnNlY29uZC0+Z2V0T3B0aW9uSGlkZGVuRmxhZygpID09IFJlYWxseUhpZGRlbikKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFVubGVzcyBzaG93aGlkZGVuIGlzIHNldCwgaWdub3JlIGhpZGRlbiBmbGFncy4KKyAgICAgIGlmIChJLT5zZWNvbmQtPmdldE9wdGlvbkhpZGRlbkZsYWcoKSA9PSBIaWRkZW4gJiYgIVNob3dIaWRkZW4pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBvcHRpb24sIGRvbid0IGFkZCBpdCB0byB0aGUgbGlzdCBhZ2Fpbi4KKyAgICAgIGlmICghT3B0aW9uU2V0Lmluc2VydChJLT5zZWNvbmQpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgT3B0cy5wdXNoX2JhY2soc3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgT3B0aW9uKj4oSS0+Z2V0S2V5KCkuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS0+c2Vjb25kKSk7CisgICAgfQorCisgICAgLy8gU29ydCB0aGUgb3B0aW9ucyBsaXN0IGFscGhhYmV0aWNhbGx5LgorICAgIHFzb3J0KE9wdHMuZGF0YSgpLCBPcHRzLnNpemUoKSwgc2l6ZW9mKE9wdHNbMF0pLCBPcHROYW1lQ29tcGFyZSk7CisKKyAgICBpZiAoUHJvZ3JhbU92ZXJ2aWV3KQorICAgICAgb3V0cygpIDw8ICJPVkVSVklFVzogIiA8PCBQcm9ncmFtT3ZlcnZpZXcgPDwgIlxuIjsKKworICAgIG91dHMoKSA8PCAiVVNBR0U6ICIgPDwgUHJvZ3JhbU5hbWUgPDwgIiBbb3B0aW9uc10iOworCisgICAgLy8gUHJpbnQgb3V0IHRoZSBwb3NpdGlvbmFsIG9wdGlvbnMuCisgICAgT3B0aW9uICpDQU9wdCA9IDA7ICAgLy8gVGhlIGNsOjpDb25zdW1lQWZ0ZXIgb3B0aW9uLCBpZiBpdCBleGlzdHMuLi4KKyAgICBpZiAoIVBvc2l0aW9uYWxPcHRzLmVtcHR5KCkgJiYKKyAgICAgICAgUG9zaXRpb25hbE9wdHNbMF0tPmdldE51bU9jY3VycmVuY2VzRmxhZygpID09IENvbnN1bWVBZnRlcikKKyAgICAgIENBT3B0ID0gUG9zaXRpb25hbE9wdHNbMF07CisKKyAgICBmb3IgKHNpemVfdCBpID0gQ0FPcHQgIT0gMCwgZSA9IFBvc2l0aW9uYWxPcHRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChQb3NpdGlvbmFsT3B0c1tpXS0+QXJnU3RyWzBdKQorICAgICAgICBvdXRzKCkgPDwgIiAtLSIgPDwgUG9zaXRpb25hbE9wdHNbaV0tPkFyZ1N0cjsKKyAgICAgIG91dHMoKSA8PCAiICIgPDwgUG9zaXRpb25hbE9wdHNbaV0tPkhlbHBTdHI7CisgICAgfQorCisgICAgLy8gUHJpbnQgdGhlIGNvbnN1bWUgYWZ0ZXIgb3B0aW9uIGluZm8gaWYgaXQgZXhpc3RzLi4uCisgICAgaWYgKENBT3B0KSBvdXRzKCkgPDwgIiAiIDw8IENBT3B0LT5IZWxwU3RyOworCisgICAgb3V0cygpIDw8ICJcblxuIjsKKworICAgIC8vIENvbXB1dGUgdGhlIG1heGltdW0gYXJndW1lbnQgbGVuZ3RoLi4uCisgICAgTWF4QXJnTGVuID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IE9wdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIE1heEFyZ0xlbiA9IHN0ZDo6bWF4KE1heEFyZ0xlbiwgT3B0c1tpXS5zZWNvbmQtPmdldE9wdGlvbldpZHRoKCkpOworCisgICAgb3V0cygpIDw8ICJPUFRJT05TOlxuIjsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IE9wdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIE9wdHNbaV0uc2Vjb25kLT5wcmludE9wdGlvbkluZm8oTWF4QXJnTGVuKTsKKworICAgIC8vIFByaW50IGFueSBleHRyYSBoZWxwIHRoZSB1c2VyIGhhcyBkZWNsYXJlZC4KKyAgICBmb3IgKHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj46Oml0ZXJhdG9yIEkgPSBNb3JlSGVscC0+YmVnaW4oKSwKKyAgICAgICAgICBFID0gTW9yZUhlbHAtPmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIG91dHMoKSA8PCAqSTsKKyAgICBNb3JlSGVscC0+Y2xlYXIoKTsKKworICAgIC8vIEhhbHQgdGhlIHByb2dyYW0gc2luY2UgaGVscCBpbmZvcm1hdGlvbiB3YXMgcHJpbnRlZAorICAgIGV4aXQoMSk7CisgIH0KK307Cit9IC8vIEVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIERlZmluZSB0aGUgdHdvIEhlbHBQcmludGVyIGluc3RhbmNlcyB0aGF0IGFyZSB1c2VkIHRvIHByaW50IG91dCBoZWxwLCBvcgorLy8gaGVscC1oaWRkZW4uLi4KKy8vCitzdGF0aWMgSGVscFByaW50ZXIgTm9ybWFsUHJpbnRlcihmYWxzZSk7CitzdGF0aWMgSGVscFByaW50ZXIgSGlkZGVuUHJpbnRlcih0cnVlKTsKKworc3RhdGljIGNsOjpvcHQ8SGVscFByaW50ZXIsIHRydWUsIHBhcnNlcjxib29sPiA+CitIT3AoImhlbHAiLCBjbDo6ZGVzYygiRGlzcGxheSBhdmFpbGFibGUgb3B0aW9ucyAoLWhlbHAtaGlkZGVuIGZvciBtb3JlKSIpLAorICAgIGNsOjpsb2NhdGlvbihOb3JtYWxQcmludGVyKSwgY2w6OlZhbHVlRGlzYWxsb3dlZCk7CisKK3N0YXRpYyBjbDo6b3B0PEhlbHBQcmludGVyLCB0cnVlLCBwYXJzZXI8Ym9vbD4gPgorSEhPcCgiaGVscC1oaWRkZW4iLCBjbDo6ZGVzYygiRGlzcGxheSBhbGwgYXZhaWxhYmxlIG9wdGlvbnMiKSwKKyAgICAgY2w6OmxvY2F0aW9uKEhpZGRlblByaW50ZXIpLCBjbDo6SGlkZGVuLCBjbDo6VmFsdWVEaXNhbGxvd2VkKTsKKworc3RhdGljIHZvaWQgKCpPdmVycmlkZVZlcnNpb25QcmludGVyKSgpID0gMDsKKworc3RhdGljIGludCBUYXJnZXRBcnJheVNvcnRGbihjb25zdCB2b2lkICpMSFMsIGNvbnN0IHZvaWQgKlJIUykgeworICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIGNvbnN0IFRhcmdldCo+IHBhaXJfdHk7CisgIHJldHVybiBzdHJjbXAoKChjb25zdCBwYWlyX3R5KilMSFMpLT5maXJzdCwgKChjb25zdCBwYWlyX3R5KilSSFMpLT5maXJzdCk7Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBWZXJzaW9uUHJpbnRlciB7CitwdWJsaWM6CisgIHZvaWQgcHJpbnQoKSB7CisgICAgcmF3X29zdHJlYW0gJk9TID0gb3V0cygpOworICAgIE9TIDw8ICJMb3cgTGV2ZWwgVmlydHVhbCBNYWNoaW5lIChodHRwOi8vbGx2bS5vcmcvKTpcbiIKKyAgICAgICA8PCAiICAiIDw8IFBBQ0tBR0VfTkFNRSA8PCAiIHZlcnNpb24gIiA8PCBQQUNLQUdFX1ZFUlNJT047CisjaWZkZWYgTExWTV9WRVJTSU9OX0lORk8KKyAgICBPUyA8PCBMTFZNX1ZFUlNJT05fSU5GTzsKKyNlbmRpZgorICAgIE9TIDw8ICJcbiAgIjsKKyNpZm5kZWYgX19PUFRJTUlaRV9fCisgICAgT1MgPDwgIkRFQlVHIGJ1aWxkIjsKKyNlbHNlCisgICAgT1MgPDwgIk9wdGltaXplZCBidWlsZCI7CisjZW5kaWYKKyNpZm5kZWYgTkRFQlVHCisgICAgT1MgPDwgIiB3aXRoIGFzc2VydGlvbnMiOworI2VuZGlmCisgICAgc3RkOjpzdHJpbmcgQ1BVID0gc3lzOjpnZXRIb3N0Q1BVTmFtZSgpOworICAgIGlmIChDUFUgPT0gImdlbmVyaWMiKSBDUFUgPSAiKHVua25vd24pIjsKKyAgICBPUyA8PCAiLlxuIgorI2lmIChFTkFCTEVfVElNRVNUQU1QUyA9PSAxKQorICAgICAgIDw8ICIgIEJ1aWx0ICIgPDwgX19EQVRFX18gPDwgIiAoIiA8PCBfX1RJTUVfXyA8PCAiKS5cbiIKKyNlbmRpZgorICAgICAgIDw8ICIgIEhvc3Q6ICIgPDwgc3lzOjpnZXRIb3N0VHJpcGxlKCkgPDwgJ1xuJworICAgICAgIDw8ICIgIEhvc3QgQ1BVOiAiIDw8IENQVSA8PCAnXG4nCisgICAgICAgPDwgJ1xuJworICAgICAgIDw8ICIgIFJlZ2lzdGVyZWQgVGFyZ2V0czpcbiI7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCBjb25zdCBUYXJnZXQqPiA+IFRhcmdldHM7CisgICAgc2l6ZV90IFdpZHRoID0gMDsKKyAgICBmb3IgKFRhcmdldFJlZ2lzdHJ5OjppdGVyYXRvciBpdCA9IFRhcmdldFJlZ2lzdHJ5OjpiZWdpbigpLAorICAgICAgICAgICBpZSA9IFRhcmdldFJlZ2lzdHJ5OjplbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICAgIFRhcmdldHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGl0LT5nZXROYW1lKCksICYqaXQpKTsKKyAgICAgIFdpZHRoID0gc3RkOjptYXgoV2lkdGgsIHN0cmxlbihUYXJnZXRzLmJhY2soKS5maXJzdCkpOworICAgIH0KKyAgICBpZiAoIVRhcmdldHMuZW1wdHkoKSkKKyAgICAgIHFzb3J0KCZUYXJnZXRzWzBdLCBUYXJnZXRzLnNpemUoKSwgc2l6ZW9mKFRhcmdldHNbMF0pLAorICAgICAgICAgICAgVGFyZ2V0QXJyYXlTb3J0Rm4pOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRhcmdldHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgT1MgPDwgIiAgICAiIDw8IFRhcmdldHNbaV0uZmlyc3Q7CisgICAgICBPUy5pbmRlbnQoV2lkdGggLSBzdHJsZW4oVGFyZ2V0c1tpXS5maXJzdCkpIDw8ICIgLSAiCisgICAgICAgICAgICAgPDwgVGFyZ2V0c1tpXS5zZWNvbmQtPmdldFNob3J0RGVzY3JpcHRpb24oKSA8PCAnXG4nOworICAgIH0KKyAgICBpZiAoVGFyZ2V0cy5lbXB0eSgpKQorICAgICAgT1MgPDwgIiAgICAobm9uZSlcbiI7CisgIH0KKyAgdm9pZCBvcGVyYXRvcj0oYm9vbCBPcHRpb25XYXNTcGVjaWZpZWQpIHsKKyAgICBpZiAoIU9wdGlvbldhc1NwZWNpZmllZCkgcmV0dXJuOworCisgICAgaWYgKE92ZXJyaWRlVmVyc2lvblByaW50ZXIgPT0gMCkgeworICAgICAgcHJpbnQoKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgICgqT3ZlcnJpZGVWZXJzaW9uUHJpbnRlcikoKTsKKyAgICBleGl0KDEpOworICB9Cit9OworfSAvLyBFbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCisKKy8vIERlZmluZSB0aGUgLS12ZXJzaW9uIG9wdGlvbiB0aGF0IHByaW50cyBvdXQgdGhlIExMVk0gdmVyc2lvbiBmb3IgdGhlIHRvb2wKK3N0YXRpYyBWZXJzaW9uUHJpbnRlciBWZXJzaW9uUHJpbnRlckluc3RhbmNlOworCitzdGF0aWMgY2w6Om9wdDxWZXJzaW9uUHJpbnRlciwgdHJ1ZSwgcGFyc2VyPGJvb2w+ID4KK1ZlcnNPcCgidmVyc2lvbiIsIGNsOjpkZXNjKCJEaXNwbGF5IHRoZSB2ZXJzaW9uIG9mIHRoaXMgcHJvZ3JhbSIpLAorICAgIGNsOjpsb2NhdGlvbihWZXJzaW9uUHJpbnRlckluc3RhbmNlKSwgY2w6OlZhbHVlRGlzYWxsb3dlZCk7CisKKy8vIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHByaW50aW5nIHRoZSBoZWxwIG1lc3NhZ2UuCit2b2lkIGNsOjpQcmludEhlbHBNZXNzYWdlKCkgeworICAvLyBUaGlzIGxvb2tzIHdlaXJkLCBidXQgaXQgYWN0dWFsbHkgcHJpbnRzIHRoZSBoZWxwIG1lc3NhZ2UuIFRoZQorICAvLyBOb3JtYWxQcmludGVyIHZhcmlhYmxlIGlzIGEgSGVscFByaW50ZXIgYW5kIHRoZSBoZWxwIGdldHMgcHJpbnRlZCB3aGVuCisgIC8vIGl0cyBvcGVyYXRvcj0gaXMgaW52b2tlZC4gVGhhdCdzIGJlY2F1c2UgdGhlICJub3JtYWwiIHVzYWdlcyBvZiB0aGUKKyAgLy8gaGVscCBwcmludGVyIGlzIHRvIGJlIGFzc2lnbmVkIHRydWUvZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCisgIC8vIC1oZWxwIG9wdGlvbiB3YXMgZ2l2ZW4gb3Igbm90LiBTaW5jZSB3ZSdyZSBjaXJjdW12ZW50aW5nIHRoYXQgd2UgaGF2ZQorICAvLyB0byBtYWtlIGl0IGxvb2sgbGlrZSAtaGVscCB3YXMgZ2l2ZW4sIHNvIHdlIGFzc2lnbiB0cnVlLgorICBOb3JtYWxQcmludGVyID0gdHJ1ZTsKK30KKworLy8vIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHByaW50aW5nIHZlcnNpb24gbnVtYmVyLgordm9pZCBjbDo6UHJpbnRWZXJzaW9uTWVzc2FnZSgpIHsKKyAgVmVyc2lvblByaW50ZXJJbnN0YW5jZS5wcmludCgpOworfQorCit2b2lkIGNsOjpTZXRWZXJzaW9uUHJpbnRlcih2b2lkICgqZnVuYykoKSkgeworICBPdmVycmlkZVZlcnNpb25QcmludGVyID0gZnVuYzsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0NvbnN0YW50UmFuZ2UuY3BwIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvQ29uc3RhbnRSYW5nZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlOTFhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0NvbnN0YW50UmFuZ2UuY3BwCkBAIC0wLDAgKzEsNjg0IEBACisvLz09PS0tIENvbnN0YW50UmFuZ2UuY3BwIC0gQ29uc3RhbnRSYW5nZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFJlcHJlc2VudCBhIHJhbmdlIG9mIHBvc3NpYmxlIHZhbHVlcyB0aGF0IG1heSBvY2N1ciB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bgorLy8gZm9yIGFuIGludGVncmFsIHZhbHVlLiAgVGhpcyBrZWVwcyB0cmFjayBvZiBhIGxvd2VyIGFuZCB1cHBlciBib3VuZCBmb3IgdGhlCisvLyBjb25zdGFudCwgd2hpY2ggTUFZIHdyYXAgYXJvdW5kIHRoZSBlbmQgb2YgdGhlIG51bWVyaWMgcmFuZ2UuICBUbyBkbyB0aGlzLCBpdAorLy8ga2VlcHMgdHJhY2sgb2YgYSBbbG93ZXIsIHVwcGVyKSBib3VuZCwgd2hpY2ggc3BlY2lmaWVzIGFuIGludGVydmFsIGp1c3QgbGlrZQorLy8gU1RMIGl0ZXJhdG9ycy4gIFdoZW4gdXNlZCB3aXRoIGJvb2xlYW4gdmFsdWVzLCB0aGUgZm9sbG93aW5nIGFyZSBpbXBvcnRhbnQKKy8vIHJhbmdlcyAob3RoZXIgaW50ZWdyYWwgcmFuZ2VzIHVzZSBtaW4vbWF4IHZhbHVlcyBmb3Igc3BlY2lhbCByYW5nZSB2YWx1ZXMpOgorLy8KKy8vICBbRiwgRikgPSB7fSAgICAgPSBFbXB0eSBzZXQKKy8vICBbVCwgRikgPSB7VH0KKy8vICBbRiwgVCkgPSB7Rn0KKy8vICBbVCwgVCkgPSB7RiwgVH0gPSBGdWxsIHNldAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db25zdGFudFJhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gSW5pdGlhbGl6ZSBhIGZ1bGwgKHRoZSBkZWZhdWx0KSBvciBlbXB0eSBzZXQgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KKy8vLworQ29uc3RhbnRSYW5nZTo6Q29uc3RhbnRSYW5nZSh1aW50MzJfdCBCaXRXaWR0aCwgYm9vbCBGdWxsKSB7CisgIGlmIChGdWxsKQorICAgIExvd2VyID0gVXBwZXIgPSBBUEludDo6Z2V0TWF4VmFsdWUoQml0V2lkdGgpOworICBlbHNlCisgICAgTG93ZXIgPSBVcHBlciA9IEFQSW50OjpnZXRNaW5WYWx1ZShCaXRXaWR0aCk7Cit9CisKKy8vLyBJbml0aWFsaXplIGEgcmFuZ2UgdG8gaG9sZCB0aGUgc2luZ2xlIHNwZWNpZmllZCB2YWx1ZS4KKy8vLworQ29uc3RhbnRSYW5nZTo6Q29uc3RhbnRSYW5nZShjb25zdCBBUEludCAmIFYpIDogTG93ZXIoViksIFVwcGVyKFYgKyAxKSB7fQorCitDb25zdGFudFJhbmdlOjpDb25zdGFudFJhbmdlKGNvbnN0IEFQSW50ICZMLCBjb25zdCBBUEludCAmVSkgOgorICBMb3dlcihMKSwgVXBwZXIoVSkgeworICBhc3NlcnQoTC5nZXRCaXRXaWR0aCgpID09IFUuZ2V0Qml0V2lkdGgoKSAmJgorICAgICAgICAgIkNvbnN0YW50UmFuZ2Ugd2l0aCB1bmVxdWFsIGJpdCB3aWR0aHMiKTsKKyAgYXNzZXJ0KChMICE9IFUgfHwgKEwuaXNNYXhWYWx1ZSgpIHx8IEwuaXNNaW5WYWx1ZSgpKSkgJiYKKyAgICAgICAgICJMb3dlciA9PSBVcHBlciwgYnV0IHRoZXkgYXJlbid0IG1pbiBvciBtYXggdmFsdWUhIik7Cit9CisKK0NvbnN0YW50UmFuZ2UgQ29uc3RhbnRSYW5nZTo6bWFrZUlDbXBSZWdpb24odW5zaWduZWQgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RhbnRSYW5nZSAmQ1IpIHsKKyAgdWludDMyX3QgVyA9IENSLmdldEJpdFdpZHRoKCk7CisgIHN3aXRjaCAoUHJlZCkgeworICAgIGRlZmF1bHQ6IGFzc2VydCghIkludmFsaWQgSUNtcCBwcmVkaWNhdGUgdG8gbWFrZUlDbXBSZWdpb24oKSIpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6CisgICAgICByZXR1cm4gQ1I7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORToKKyAgICAgIGlmIChDUi5pc1NpbmdsZUVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoQ1IuZ2V0VXBwZXIoKSwgQ1IuZ2V0TG93ZXIoKSk7CisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShXKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDoKKyAgICAgIHJldHVybiBDb25zdGFudFJhbmdlKEFQSW50OjpnZXRNaW5WYWx1ZShXKSwgQ1IuZ2V0VW5zaWduZWRNYXgoKSk7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTFQ6CisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShBUEludDo6Z2V0U2lnbmVkTWluVmFsdWUoVyksIENSLmdldFNpZ25lZE1heCgpKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRTogeworICAgICAgQVBJbnQgVU1heChDUi5nZXRVbnNpZ25lZE1heCgpKTsKKyAgICAgIGlmIChVTWF4LmlzTWF4VmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoVyk7CisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShBUEludDo6Z2V0TWluVmFsdWUoVyksIFVNYXggKyAxKTsKKyAgICB9CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6IHsKKyAgICAgIEFQSW50IFNNYXgoQ1IuZ2V0U2lnbmVkTWF4KCkpOworICAgICAgaWYgKFNNYXguaXNNYXhTaWduZWRWYWx1ZSgpIHx8IChTTWF4KzEpLmlzTWF4U2lnbmVkVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoVyk7CisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShBUEludDo6Z2V0U2lnbmVkTWluVmFsdWUoVyksIFNNYXggKyAxKTsKKyAgICB9CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6CisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShDUi5nZXRVbnNpZ25lZE1pbigpICsgMSwgQVBJbnQ6OmdldE51bGxWYWx1ZShXKSk7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6CisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShDUi5nZXRTaWduZWRNaW4oKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludDo6Z2V0U2lnbmVkTWluVmFsdWUoVykpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOiB7CisgICAgICBBUEludCBVTWluKENSLmdldFVuc2lnbmVkTWluKCkpOworICAgICAgaWYgKFVNaW4uaXNNaW5WYWx1ZSgpKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShXKTsKKyAgICAgIHJldHVybiBDb25zdGFudFJhbmdlKFVNaW4sIEFQSW50OjpnZXROdWxsVmFsdWUoVykpOworICAgIH0KKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRTogeworICAgICAgQVBJbnQgU01pbihDUi5nZXRTaWduZWRNaW4oKSk7CisgICAgICBpZiAoU01pbi5pc01pblNpZ25lZFZhbHVlKCkpCisgICAgICAgIHJldHVybiBDb25zdGFudFJhbmdlKFcpOworICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoU01pbiwgQVBJbnQ6OmdldFNpZ25lZE1pblZhbHVlKFcpKTsKKyAgICB9CisgIH0KK30KKworLy8vIGlzRnVsbFNldCAtIFJldHVybiB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZWxlbWVudHMgcG9zc2libGUKKy8vLyBmb3IgdGhpcyBkYXRhLXR5cGUKK2Jvb2wgQ29uc3RhbnRSYW5nZTo6aXNGdWxsU2V0KCkgY29uc3QgeworICByZXR1cm4gTG93ZXIgPT0gVXBwZXIgJiYgTG93ZXIuaXNNYXhWYWx1ZSgpOworfQorCisvLy8gaXNFbXB0eVNldCAtIFJldHVybiB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5zIG5vIG1lbWJlcnMuCisvLy8KK2Jvb2wgQ29uc3RhbnRSYW5nZTo6aXNFbXB0eVNldCgpIGNvbnN0IHsKKyAgcmV0dXJuIExvd2VyID09IFVwcGVyICYmIExvd2VyLmlzTWluVmFsdWUoKTsKK30KKworLy8vIGlzV3JhcHBlZFNldCAtIFJldHVybiB0cnVlIGlmIHRoaXMgc2V0IHdyYXBzIGFyb3VuZCB0aGUgdG9wIG9mIHRoZSByYW5nZSwKKy8vLyBmb3IgZXhhbXBsZTogWzEwMCwgOCkKKy8vLworYm9vbCBDb25zdGFudFJhbmdlOjppc1dyYXBwZWRTZXQoKSBjb25zdCB7CisgIHJldHVybiBMb3dlci51Z3QoVXBwZXIpOworfQorCisvLy8gZ2V0U2V0U2l6ZSAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgc2V0LgorLy8vCitBUEludCBDb25zdGFudFJhbmdlOjpnZXRTZXRTaXplKCkgY29uc3QgeworICBpZiAoaXNFbXB0eVNldCgpKSAKKyAgICByZXR1cm4gQVBJbnQoZ2V0Qml0V2lkdGgoKSwgMCk7CisgIGlmIChnZXRCaXRXaWR0aCgpID09IDEpIHsKKyAgICBpZiAoTG93ZXIgIT0gVXBwZXIpICAvLyBPbmUgb2YgVCBvciBGIGluIHRoZSBzZXQuLi4KKyAgICAgIHJldHVybiBBUEludCgyLCAxKTsKKyAgICByZXR1cm4gQVBJbnQoMiwgMik7ICAgICAgLy8gTXVzdCBiZSBmdWxsIHNldC4uLgorICB9CisKKyAgLy8gU2ltcGx5IHN1YnRyYWN0IHRoZSBib3VuZHMuLi4KKyAgcmV0dXJuIFVwcGVyIC0gTG93ZXI7Cit9CisKKy8vLyBnZXRVbnNpZ25lZE1heCAtIFJldHVybiB0aGUgbGFyZ2VzdCB1bnNpZ25lZCB2YWx1ZSBjb250YWluZWQgaW4gdGhlCisvLy8gQ29uc3RhbnRSYW5nZS4KKy8vLworQVBJbnQgQ29uc3RhbnRSYW5nZTo6Z2V0VW5zaWduZWRNYXgoKSBjb25zdCB7CisgIGlmIChpc0Z1bGxTZXQoKSB8fCBpc1dyYXBwZWRTZXQoKSkKKyAgICByZXR1cm4gQVBJbnQ6OmdldE1heFZhbHVlKGdldEJpdFdpZHRoKCkpOworICBlbHNlCisgICAgcmV0dXJuIGdldFVwcGVyKCkgLSAxOworfQorCisvLy8gZ2V0VW5zaWduZWRNaW4gLSBSZXR1cm4gdGhlIHNtYWxsZXN0IHVuc2lnbmVkIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUKKy8vLyBDb25zdGFudFJhbmdlLgorLy8vCitBUEludCBDb25zdGFudFJhbmdlOjpnZXRVbnNpZ25lZE1pbigpIGNvbnN0IHsKKyAgaWYgKGlzRnVsbFNldCgpIHx8IChpc1dyYXBwZWRTZXQoKSAmJiBnZXRVcHBlcigpICE9IDApKQorICAgIHJldHVybiBBUEludDo6Z2V0TWluVmFsdWUoZ2V0Qml0V2lkdGgoKSk7CisgIGVsc2UKKyAgICByZXR1cm4gZ2V0TG93ZXIoKTsKK30KKworLy8vIGdldFNpZ25lZE1heCAtIFJldHVybiB0aGUgbGFyZ2VzdCBzaWduZWQgdmFsdWUgY29udGFpbmVkIGluIHRoZQorLy8vIENvbnN0YW50UmFuZ2UuCisvLy8KK0FQSW50IENvbnN0YW50UmFuZ2U6OmdldFNpZ25lZE1heCgpIGNvbnN0IHsKKyAgQVBJbnQgU2lnbmVkTWF4KEFQSW50OjpnZXRTaWduZWRNYXhWYWx1ZShnZXRCaXRXaWR0aCgpKSk7CisgIGlmICghaXNXcmFwcGVkU2V0KCkpIHsKKyAgICBpZiAoZ2V0TG93ZXIoKS5zbGUoZ2V0VXBwZXIoKSAtIDEpKQorICAgICAgcmV0dXJuIGdldFVwcGVyKCkgLSAxOworICAgIGVsc2UKKyAgICAgIHJldHVybiBTaWduZWRNYXg7CisgIH0gZWxzZSB7CisgICAgaWYgKGdldExvd2VyKCkuaXNOZWdhdGl2ZSgpID09IGdldFVwcGVyKCkuaXNOZWdhdGl2ZSgpKQorICAgICAgcmV0dXJuIFNpZ25lZE1heDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZ2V0VXBwZXIoKSAtIDE7CisgIH0KK30KKworLy8vIGdldFNpZ25lZE1pbiAtIFJldHVybiB0aGUgc21hbGxlc3Qgc2lnbmVkIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUKKy8vLyBDb25zdGFudFJhbmdlLgorLy8vCitBUEludCBDb25zdGFudFJhbmdlOjpnZXRTaWduZWRNaW4oKSBjb25zdCB7CisgIEFQSW50IFNpZ25lZE1pbihBUEludDo6Z2V0U2lnbmVkTWluVmFsdWUoZ2V0Qml0V2lkdGgoKSkpOworICBpZiAoIWlzV3JhcHBlZFNldCgpKSB7CisgICAgaWYgKGdldExvd2VyKCkuc2xlKGdldFVwcGVyKCkgLSAxKSkKKyAgICAgIHJldHVybiBnZXRMb3dlcigpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBTaWduZWRNaW47CisgIH0gZWxzZSB7CisgICAgaWYgKChnZXRVcHBlcigpIC0gMSkuc2x0KGdldExvd2VyKCkpKSB7CisgICAgICBpZiAoZ2V0VXBwZXIoKSAhPSBTaWduZWRNaW4pCisgICAgICAgIHJldHVybiBTaWduZWRNaW47CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBnZXRMb3dlcigpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZ2V0TG93ZXIoKTsKKyAgICB9CisgIH0KK30KKworLy8vIGNvbnRhaW5zIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBpbiB0aGUgc2V0LgorLy8vCitib29sIENvbnN0YW50UmFuZ2U6OmNvbnRhaW5zKGNvbnN0IEFQSW50ICZWKSBjb25zdCB7CisgIGlmIChMb3dlciA9PSBVcHBlcikKKyAgICByZXR1cm4gaXNGdWxsU2V0KCk7CisKKyAgaWYgKCFpc1dyYXBwZWRTZXQoKSkKKyAgICByZXR1cm4gTG93ZXIudWxlKFYpICYmIFYudWx0KFVwcGVyKTsKKyAgZWxzZQorICAgIHJldHVybiBMb3dlci51bGUoVikgfHwgVi51bHQoVXBwZXIpOworfQorCisvLy8gY29udGFpbnMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBzdWJzZXQgb2YgdGhpcyByYW5nZS4KKy8vLyBUd28gZXF1YWwgc2V0IGNvbnRhaW4gZWFjaCBvdGhlci4gVGhlIGVtcHR5IHNldCBpcyBjb25zaWRlcmVkIHRvIGJlCisvLy8gY29udGFpbmVkIGJ5IGFsbCBvdGhlciBzZXRzLgorLy8vCitib29sIENvbnN0YW50UmFuZ2U6OmNvbnRhaW5zKGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdCB7CisgIGlmIChpc0Z1bGxTZXQoKSkgcmV0dXJuIHRydWU7CisgIGlmIChPdGhlci5pc0Z1bGxTZXQoKSkgcmV0dXJuIGZhbHNlOworICBpZiAoT3RoZXIuaXNFbXB0eVNldCgpKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKGlzRW1wdHlTZXQoKSkgcmV0dXJuIGZhbHNlOworCisgIGlmICghaXNXcmFwcGVkU2V0KCkpIHsKKyAgICBpZiAoT3RoZXIuaXNXcmFwcGVkU2V0KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gTG93ZXIudWxlKE90aGVyLmdldExvd2VyKCkpICYmIE90aGVyLmdldFVwcGVyKCkudWxlKFVwcGVyKTsKKyAgfQorCisgIGlmICghT3RoZXIuaXNXcmFwcGVkU2V0KCkpCisgICAgcmV0dXJuIE90aGVyLmdldFVwcGVyKCkudWxlKFVwcGVyKSB8fAorICAgICAgICAgICBMb3dlci51bGUoT3RoZXIuZ2V0TG93ZXIoKSk7CisKKyAgcmV0dXJuIE90aGVyLmdldFVwcGVyKCkudWxlKFVwcGVyKSAmJiBMb3dlci51bGUoT3RoZXIuZ2V0TG93ZXIoKSk7Cit9CisKKy8vLyBzdWJ0cmFjdCAtIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgZnJvbSB0aGUgZW5kcG9pbnRzIG9mIHRoaXMKKy8vLyBjb25zdGFudCByYW5nZS4KK0NvbnN0YW50UmFuZ2UgQ29uc3RhbnRSYW5nZTo6c3VidHJhY3QoY29uc3QgQVBJbnQgJlZhbCkgY29uc3QgeworICBhc3NlcnQoVmFsLmdldEJpdFdpZHRoKCkgPT0gZ2V0Qml0V2lkdGgoKSAmJiAiV3JvbmcgYml0IHdpZHRoIik7CisgIC8vIElmIHRoZSBzZXQgaXMgZW1wdHkgb3IgZnVsbCwgZG9uJ3QgbW9kaWZ5IHRoZSBlbmRwb2ludHMuCisgIGlmIChMb3dlciA9PSBVcHBlcikgCisgICAgcmV0dXJuICp0aGlzOworICByZXR1cm4gQ29uc3RhbnRSYW5nZShMb3dlciAtIFZhbCwgVXBwZXIgLSBWYWwpOworfQorCisKKy8vIGludGVyc2VjdDFXcmFwcGVkIC0gVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBpbnRlcnNlY3QgdHdvIHJhbmdlcyB3aGVuCisvLyBpdCBpcyBrbm93biB0aGF0IExIUyBpcyB3cmFwcGVkIGFuZCBSSFMgaXNuJ3QuCisvLworQ29uc3RhbnRSYW5nZSAKK0NvbnN0YW50UmFuZ2U6OmludGVyc2VjdDFXcmFwcGVkKGNvbnN0IENvbnN0YW50UmFuZ2UgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50UmFuZ2UgJlJIUykgeworICBhc3NlcnQoTEhTLmlzV3JhcHBlZFNldCgpICYmICFSSFMuaXNXcmFwcGVkU2V0KCkpOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBvdmVybGFwIG9uIHRoZSBMZWZ0IHNpZGUgb2YgUkhTLi4uCisgIC8vCisgIGlmIChSSFMuTG93ZXIudWx0KExIUy5VcHBlcikpIHsKKyAgICAvLyBXZSBkbyBvdmVybGFwIG9uIHRoZSBsZWZ0IHNpZGUgb2YgUkhTLCBzZWUgaWYgd2Ugb3ZlcmxhcCBvbiB0aGUgcmlnaHQgb2YKKyAgICAvLyBSSFMuLi4KKyAgICBpZiAoUkhTLlVwcGVyLnVndChMSFMuTG93ZXIpKSB7CisgICAgICAvLyBPaywgdGhlIHJlc3VsdCBvdmVybGFwcyBvbiBib3RoIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcy4gIFNlZSBpZiB0aGUKKyAgICAgIC8vIHJlc3VsdGFudCBpbnRlcnZhbCB3aWxsIGJlIHNtYWxsZXIgaWYgd2Ugd3JhcCBvciBub3QuLi4KKyAgICAgIC8vCisgICAgICBpZiAoTEhTLmdldFNldFNpemUoKS51bHQoUkhTLmdldFNldFNpemUoKSkpCisgICAgICAgIHJldHVybiBMSFM7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBSSFM7CisKKyAgICB9IGVsc2UgeworICAgICAgLy8gTm8gb3ZlcmxhcCBvbiB0aGUgcmlnaHQsIGp1c3Qgb24gdGhlIGxlZnQuCisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShSSFMuTG93ZXIsIExIUy5VcHBlcik7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFdlIGRvbid0IG92ZXJsYXAgb24gdGhlIGxlZnQgc2lkZSBvZiBSSFMsIHNlZSBpZiB3ZSBvdmVybGFwIG9uIHRoZSByaWdodAorICAgIC8vIG9mIFJIUy4uLgorICAgIGlmIChSSFMuVXBwZXIudWd0KExIUy5Mb3dlcikpIHsKKyAgICAgIC8vIFNpbXBsZSBvdmVybGFwLi4uCisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShMSFMuTG93ZXIsIFJIUy5VcHBlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vIG92ZXJsYXAuLi4KKyAgICAgIHJldHVybiBDb25zdGFudFJhbmdlKExIUy5nZXRCaXRXaWR0aCgpLCBmYWxzZSk7CisgICAgfQorICB9Cit9CisKKy8vLyBpbnRlcnNlY3RXaXRoIC0gUmV0dXJuIHRoZSByYW5nZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMKKy8vLyByYW5nZSB3aXRoIGFub3RoZXIgcmFuZ2UuICBUaGUgcmVzdWx0YW50IHJhbmdlIGlzIGd1YXJhbnRlZWQgdG8gaW5jbHVkZSBhbGwKKy8vLyBlbGVtZW50cyBjb250YWluZWQgaW4gYm90aCBpbnB1dCByYW5nZXMsIGFuZCB0byBoYXZlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZQorLy8vIHNldCBzaXplIHRoYXQgZG9lcyBzby4gIEJlY2F1c2UgdGhlcmUgbWF5IGJlIHR3byBpbnRlcnNlY3Rpb25zIHdpdGggdGhlCisvLy8gc2FtZSBzZXQgc2l6ZSwgQS5pbnRlcnNlY3RXaXRoKEIpIG1pZ2h0IG5vdCBiZSBlcXVhbCB0byBCLmludGVyc2VjdFdpdGgoQSkuCitDb25zdGFudFJhbmdlIENvbnN0YW50UmFuZ2U6OmludGVyc2VjdFdpdGgoY29uc3QgQ29uc3RhbnRSYW5nZSAmQ1IpIGNvbnN0IHsKKyAgYXNzZXJ0KGdldEJpdFdpZHRoKCkgPT0gQ1IuZ2V0Qml0V2lkdGgoKSAmJiAKKyAgICAgICAgICJDb25zdGFudFJhbmdlIHR5cGVzIGRvbid0IGFncmVlISIpOworCisgIC8vIEhhbmRsZSBjb21tb24gY2FzZXMuCisgIGlmICggICBpc0VtcHR5U2V0KCkgfHwgQ1IuaXNGdWxsU2V0KCkpIHJldHVybiAqdGhpczsKKyAgaWYgKENSLmlzRW1wdHlTZXQoKSB8fCAgICBpc0Z1bGxTZXQoKSkgcmV0dXJuIENSOworCisgIGlmICghaXNXcmFwcGVkU2V0KCkgJiYgQ1IuaXNXcmFwcGVkU2V0KCkpCisgICAgcmV0dXJuIENSLmludGVyc2VjdFdpdGgoKnRoaXMpOworCisgIGlmICghaXNXcmFwcGVkU2V0KCkgJiYgIUNSLmlzV3JhcHBlZFNldCgpKSB7CisgICAgaWYgKExvd2VyLnVsdChDUi5Mb3dlcikpIHsKKyAgICAgIGlmIChVcHBlci51bGUoQ1IuTG93ZXIpKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShnZXRCaXRXaWR0aCgpLCBmYWxzZSk7CisKKyAgICAgIGlmIChVcHBlci51bHQoQ1IuVXBwZXIpKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShDUi5Mb3dlciwgVXBwZXIpOworCisgICAgICByZXR1cm4gQ1I7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChVcHBlci51bHQoQ1IuVXBwZXIpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICAgIGlmIChMb3dlci51bHQoQ1IuVXBwZXIpKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShMb3dlciwgQ1IuVXBwZXIpOworCisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShnZXRCaXRXaWR0aCgpLCBmYWxzZSk7CisgICAgfQorICB9CisKKyAgaWYgKGlzV3JhcHBlZFNldCgpICYmICFDUi5pc1dyYXBwZWRTZXQoKSkgeworICAgIGlmIChDUi5Mb3dlci51bHQoVXBwZXIpKSB7CisgICAgICBpZiAoQ1IuVXBwZXIudWx0KFVwcGVyKSkKKyAgICAgICAgcmV0dXJuIENSOworCisgICAgICBpZiAoQ1IuVXBwZXIudWx0KExvd2VyKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoQ1IuTG93ZXIsIFVwcGVyKTsKKworICAgICAgaWYgKGdldFNldFNpemUoKS51bHQoQ1IuZ2V0U2V0U2l6ZSgpKSkKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gQ1I7CisgICAgfSBlbHNlIGlmIChDUi5Mb3dlci51bHQoTG93ZXIpKSB7CisgICAgICBpZiAoQ1IuVXBwZXIudWxlKExvd2VyKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoZ2V0Qml0V2lkdGgoKSwgZmFsc2UpOworCisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShMb3dlciwgQ1IuVXBwZXIpOworICAgIH0KKyAgICByZXR1cm4gQ1I7CisgIH0KKworICBpZiAoQ1IuVXBwZXIudWx0KFVwcGVyKSkgeworICAgIGlmIChDUi5Mb3dlci51bHQoVXBwZXIpKSB7CisgICAgICBpZiAoZ2V0U2V0U2l6ZSgpLnVsdChDUi5nZXRTZXRTaXplKCkpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBDUjsKKyAgICB9CisKKyAgICBpZiAoQ1IuTG93ZXIudWx0KExvd2VyKSkKKyAgICAgIHJldHVybiBDb25zdGFudFJhbmdlKExvd2VyLCBDUi5VcHBlcik7CisKKyAgICByZXR1cm4gQ1I7CisgIH0gZWxzZSBpZiAoQ1IuVXBwZXIudWx0KExvd2VyKSkgeworICAgIGlmIChDUi5Mb3dlci51bHQoTG93ZXIpKQorICAgICAgcmV0dXJuICp0aGlzOworCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoQ1IuTG93ZXIsIFVwcGVyKTsKKyAgfQorICBpZiAoZ2V0U2V0U2l6ZSgpLnVsdChDUi5nZXRTZXRTaXplKCkpKQorICAgIHJldHVybiAqdGhpczsKKyAgZWxzZQorICAgIHJldHVybiBDUjsKK30KKworCisvLy8gdW5pb25XaXRoIC0gUmV0dXJuIHRoZSByYW5nZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgdW5pb24gb2YgdGhpcyByYW5nZSB3aXRoCisvLy8gYW5vdGhlciByYW5nZS4gIFRoZSByZXN1bHRhbnQgcmFuZ2UgaXMgZ3VhcmFudGVlZCB0byBpbmNsdWRlIHRoZSBlbGVtZW50cyBvZgorLy8vIGJvdGggc2V0cywgYnV0IG1heSBjb250YWluIG1vcmUuICBGb3IgZXhhbXBsZSwgWzMsIDkpIHVuaW9uIFsxMiwxNSkgaXMKKy8vLyBbMywgMTUpLCB3aGljaCBpbmNsdWRlcyA5LCAxMCwgYW5kIDExLCB3aGljaCB3ZXJlIG5vdCBpbmNsdWRlZCBpbiBlaXRoZXIKKy8vLyBzZXQgYmVmb3JlLgorLy8vCitDb25zdGFudFJhbmdlIENvbnN0YW50UmFuZ2U6OnVuaW9uV2l0aChjb25zdCBDb25zdGFudFJhbmdlICZDUikgY29uc3QgeworICBhc3NlcnQoZ2V0Qml0V2lkdGgoKSA9PSBDUi5nZXRCaXRXaWR0aCgpICYmIAorICAgICAgICAgIkNvbnN0YW50UmFuZ2UgdHlwZXMgZG9uJ3QgYWdyZWUhIik7CisKKyAgaWYgKCAgIGlzRnVsbFNldCgpIHx8IENSLmlzRW1wdHlTZXQoKSkgcmV0dXJuICp0aGlzOworICBpZiAoQ1IuaXNGdWxsU2V0KCkgfHwgICAgaXNFbXB0eVNldCgpKSByZXR1cm4gQ1I7CisKKyAgaWYgKCFpc1dyYXBwZWRTZXQoKSAmJiBDUi5pc1dyYXBwZWRTZXQoKSkgcmV0dXJuIENSLnVuaW9uV2l0aCgqdGhpcyk7CisKKyAgaWYgKCFpc1dyYXBwZWRTZXQoKSAmJiAhQ1IuaXNXcmFwcGVkU2V0KCkpIHsKKyAgICBpZiAoQ1IuVXBwZXIudWx0KExvd2VyKSB8fCBVcHBlci51bHQoQ1IuTG93ZXIpKSB7CisgICAgICAvLyBJZiB0aGUgdHdvIHJhbmdlcyBhcmUgZGlzam9pbnQsIGZpbmQgdGhlIHNtYWxsZXIgZ2FwIGFuZCBicmlkZ2UgaXQuCisgICAgICBBUEludCBkMSA9IENSLkxvd2VyIC0gVXBwZXIsIGQyID0gTG93ZXIgLSBDUi5VcHBlcjsKKyAgICAgIGlmIChkMS51bHQoZDIpKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShMb3dlciwgQ1IuVXBwZXIpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShDUi5Mb3dlciwgVXBwZXIpOworICAgIH0KKworICAgIEFQSW50IEwgPSBMb3dlciwgVSA9IFVwcGVyOworICAgIGlmIChDUi5Mb3dlci51bHQoTCkpCisgICAgICBMID0gQ1IuTG93ZXI7CisgICAgaWYgKChDUi5VcHBlciAtIDEpLnVndChVIC0gMSkpCisgICAgICBVID0gQ1IuVXBwZXI7CisKKyAgICBpZiAoTCA9PSAwICYmIFUgPT0gMCkKKyAgICAgIHJldHVybiBDb25zdGFudFJhbmdlKGdldEJpdFdpZHRoKCkpOworCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoTCwgVSk7CisgIH0KKworICBpZiAoIUNSLmlzV3JhcHBlZFNldCgpKSB7CisgICAgLy8gLS0tLS0tVSAgIEwtLS0tLSAgYW5kICAtLS0tLS1VICAgTC0tLS0tIDogdGhpcworICAgIC8vICAgTC0tVSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMLS1VICA6IENSCisgICAgaWYgKENSLlVwcGVyLnVsZShVcHBlcikgfHwgQ1IuTG93ZXIudWdlKExvd2VyKSkKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIC8vIC0tLS0tLVUgICBMLS0tLS0gOiB0aGlzCisgICAgLy8gICAgTC0tLS0tLS0tLVUgICA6IENSCisgICAgaWYgKENSLkxvd2VyLnVsZShVcHBlcikgJiYgTG93ZXIudWxlKENSLlVwcGVyKSkKKyAgICAgIHJldHVybiBDb25zdGFudFJhbmdlKGdldEJpdFdpZHRoKCkpOworCisgICAgLy8gLS0tLVUgICAgICAgTC0tLS0gOiB0aGlzCisgICAgLy8gICAgICAgTC0tLVUgICAgICAgOiBDUgorICAgIC8vICAgIDxkMT4gIDxkMj4KKyAgICBpZiAoVXBwZXIudWxlKENSLkxvd2VyKSAmJiBDUi5VcHBlci51bGUoTG93ZXIpKSB7CisgICAgICBBUEludCBkMSA9IENSLkxvd2VyIC0gVXBwZXIsIGQyID0gTG93ZXIgLSBDUi5VcHBlcjsKKyAgICAgIGlmIChkMS51bHQoZDIpKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShMb3dlciwgQ1IuVXBwZXIpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShDUi5Mb3dlciwgVXBwZXIpOworICAgIH0KKworICAgIC8vIC0tLS1VICAgICBMLS0tLS0gOiB0aGlzCisgICAgLy8gICAgICAgIEwtLS0tVSAgICA6IENSCisgICAgaWYgKFVwcGVyLnVsdChDUi5Mb3dlcikgJiYgTG93ZXIudWx0KENSLlVwcGVyKSkKKyAgICAgIHJldHVybiBDb25zdGFudFJhbmdlKENSLkxvd2VyLCBVcHBlcik7CisKKyAgICAvLyAtLS0tLS1VICAgIEwtLS0tIDogdGhpcworICAgIC8vICAgIEwtLS0tLVUgICAgICAgOiBDUgorICAgIGlmIChDUi5Mb3dlci51bHQoVXBwZXIpICYmIENSLlVwcGVyLnVsdChMb3dlcikpCisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShMb3dlciwgQ1IuVXBwZXIpOworICB9CisKKyAgYXNzZXJ0KGlzV3JhcHBlZFNldCgpICYmIENSLmlzV3JhcHBlZFNldCgpICYmCisgICAgICAgICAiQ29uc3RhbnRSYW5nZTo6dW5pb25XaXRoIG1pc3NlZCB3cmFwcGVkIHVuaW9uIHVud3JhcHBlZCBjYXNlIik7CisKKyAgLy8gLS0tLS0tVSAgICBMLS0tLSAgYW5kICAtLS0tLS1VICAgIEwtLS0tIDogdGhpcworICAvLyAtVSAgTC0tLS0tLS0tLS0tICBhbmQgIC0tLS0tLS0tLS0tLVUgIEwgOiBDUgorICBpZiAoQ1IuTG93ZXIudWxlKFVwcGVyKSB8fCBMb3dlci51bGUoQ1IuVXBwZXIpKQorICAgIHJldHVybiBDb25zdGFudFJhbmdlKGdldEJpdFdpZHRoKCkpOworCisgIEFQSW50IEwgPSBMb3dlciwgVSA9IFVwcGVyOworICBpZiAoQ1IuVXBwZXIudWd0KFUpKQorICAgIFUgPSBDUi5VcHBlcjsKKyAgaWYgKENSLkxvd2VyLnVsdChMKSkKKyAgICBMID0gQ1IuTG93ZXI7CisKKyAgcmV0dXJuIENvbnN0YW50UmFuZ2UoTCwgVSk7Cit9CisKKy8vLyB6ZXJvRXh0ZW5kIC0gUmV0dXJuIGEgbmV3IHJhbmdlIGluIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB0eXBlLCB3aGljaCBtdXN0CisvLy8gYmUgc3RyaWN0bHkgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgdHlwZS4gIFRoZSByZXR1cm5lZCByYW5nZSB3aWxsCisvLy8gY29ycmVzcG9uZCB0byB0aGUgcG9zc2libGUgcmFuZ2Ugb2YgdmFsdWVzIGFzIGlmIHRoZSBzb3VyY2UgcmFuZ2UgaGFkIGJlZW4KKy8vLyB6ZXJvIGV4dGVuZGVkLgorQ29uc3RhbnRSYW5nZSBDb25zdGFudFJhbmdlOjp6ZXJvRXh0ZW5kKHVpbnQzMl90IERzdFR5U2l6ZSkgY29uc3QgeworICB1bnNpZ25lZCBTcmNUeVNpemUgPSBnZXRCaXRXaWR0aCgpOworICBhc3NlcnQoU3JjVHlTaXplIDwgRHN0VHlTaXplICYmICJOb3QgYSB2YWx1ZSBleHRlbnNpb24iKTsKKyAgaWYgKGlzRnVsbFNldCgpKQorICAgIC8vIENoYW5nZSBhIHNvdXJjZSBmdWxsIHNldCBpbnRvIFswLCAxIDw8IDgqbnVtYnl0ZXMpCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoQVBJbnQoRHN0VHlTaXplLDApLCBBUEludChEc3RUeVNpemUsMSkuc2hsKFNyY1R5U2l6ZSkpOworCisgIEFQSW50IEwgPSBMb3dlcjsgTC56ZXh0KERzdFR5U2l6ZSk7CisgIEFQSW50IFUgPSBVcHBlcjsgVS56ZXh0KERzdFR5U2l6ZSk7CisgIHJldHVybiBDb25zdGFudFJhbmdlKEwsIFUpOworfQorCisvLy8gc2lnbkV4dGVuZCAtIFJldHVybiBhIG5ldyByYW5nZSBpbiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdHlwZSwgd2hpY2ggbXVzdAorLy8vIGJlIHN0cmljdGx5IGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHR5cGUuICBUaGUgcmV0dXJuZWQgcmFuZ2Ugd2lsbAorLy8vIGNvcnJlc3BvbmQgdG8gdGhlIHBvc3NpYmxlIHJhbmdlIG9mIHZhbHVlcyBhcyBpZiB0aGUgc291cmNlIHJhbmdlIGhhZCBiZWVuCisvLy8gc2lnbiBleHRlbmRlZC4KK0NvbnN0YW50UmFuZ2UgQ29uc3RhbnRSYW5nZTo6c2lnbkV4dGVuZCh1aW50MzJfdCBEc3RUeVNpemUpIGNvbnN0IHsKKyAgdW5zaWduZWQgU3JjVHlTaXplID0gZ2V0Qml0V2lkdGgoKTsKKyAgYXNzZXJ0KFNyY1R5U2l6ZSA8IERzdFR5U2l6ZSAmJiAiTm90IGEgdmFsdWUgZXh0ZW5zaW9uIik7CisgIGlmIChpc0Z1bGxTZXQoKSkgeworICAgIHJldHVybiBDb25zdGFudFJhbmdlKEFQSW50OjpnZXRIaWdoQml0c1NldChEc3RUeVNpemUsRHN0VHlTaXplLVNyY1R5U2l6ZSsxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBUEludDo6Z2V0TG93Qml0c1NldChEc3RUeVNpemUsIFNyY1R5U2l6ZS0xKSArIDEpOworICB9CisKKyAgQVBJbnQgTCA9IExvd2VyOyBMLnNleHQoRHN0VHlTaXplKTsKKyAgQVBJbnQgVSA9IFVwcGVyOyBVLnNleHQoRHN0VHlTaXplKTsKKyAgcmV0dXJuIENvbnN0YW50UmFuZ2UoTCwgVSk7Cit9CisKKy8vLyB0cnVuY2F0ZSAtIFJldHVybiBhIG5ldyByYW5nZSBpbiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdHlwZSwgd2hpY2ggbXVzdCBiZQorLy8vIHN0cmljdGx5IHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCB0eXBlLiAgVGhlIHJldHVybmVkIHJhbmdlIHdpbGwKKy8vLyBjb3JyZXNwb25kIHRvIHRoZSBwb3NzaWJsZSByYW5nZSBvZiB2YWx1ZXMgYXMgaWYgdGhlIHNvdXJjZSByYW5nZSBoYWQgYmVlbgorLy8vIHRydW5jYXRlZCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCitDb25zdGFudFJhbmdlIENvbnN0YW50UmFuZ2U6OnRydW5jYXRlKHVpbnQzMl90IERzdFR5U2l6ZSkgY29uc3QgeworICB1bnNpZ25lZCBTcmNUeVNpemUgPSBnZXRCaXRXaWR0aCgpOworICBhc3NlcnQoU3JjVHlTaXplID4gRHN0VHlTaXplICYmICJOb3QgYSB2YWx1ZSB0cnVuY2F0aW9uIik7CisgIEFQSW50IFNpemUoQVBJbnQ6OmdldExvd0JpdHNTZXQoU3JjVHlTaXplLCBEc3RUeVNpemUpKTsKKyAgaWYgKGlzRnVsbFNldCgpIHx8IGdldFNldFNpemUoKS51Z3QoU2l6ZSkpCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoRHN0VHlTaXplKTsKKworICBBUEludCBMID0gTG93ZXI7IEwudHJ1bmMoRHN0VHlTaXplKTsKKyAgQVBJbnQgVSA9IFVwcGVyOyBVLnRydW5jKERzdFR5U2l6ZSk7CisgIHJldHVybiBDb25zdGFudFJhbmdlKEwsIFUpOworfQorCisvLy8gemV4dE9yVHJ1bmMgLSBtYWtlIHRoaXMgcmFuZ2UgaGF2ZSB0aGUgYml0IHdpZHRoIGdpdmVuIGJ5IFxwIERzdFR5U2l6ZS4gVGhlCisvLy8gdmFsdWUgaXMgemVybyBleHRlbmRlZCwgdHJ1bmNhdGVkLCBvciBsZWZ0IGFsb25lIHRvIG1ha2UgaXQgdGhhdCB3aWR0aC4KK0NvbnN0YW50UmFuZ2UgQ29uc3RhbnRSYW5nZTo6emV4dE9yVHJ1bmModWludDMyX3QgRHN0VHlTaXplKSBjb25zdCB7CisgIHVuc2lnbmVkIFNyY1R5U2l6ZSA9IGdldEJpdFdpZHRoKCk7CisgIGlmIChTcmNUeVNpemUgPiBEc3RUeVNpemUpCisgICAgcmV0dXJuIHRydW5jYXRlKERzdFR5U2l6ZSk7CisgIGVsc2UgaWYgKFNyY1R5U2l6ZSA8IERzdFR5U2l6ZSkKKyAgICByZXR1cm4gemVyb0V4dGVuZChEc3RUeVNpemUpOworICBlbHNlCisgICAgcmV0dXJuICp0aGlzOworfQorCisvLy8gc2V4dE9yVHJ1bmMgLSBtYWtlIHRoaXMgcmFuZ2UgaGF2ZSB0aGUgYml0IHdpZHRoIGdpdmVuIGJ5IFxwIERzdFR5U2l6ZS4gVGhlCisvLy8gdmFsdWUgaXMgc2lnbiBleHRlbmRlZCwgdHJ1bmNhdGVkLCBvciBsZWZ0IGFsb25lIHRvIG1ha2UgaXQgdGhhdCB3aWR0aC4KK0NvbnN0YW50UmFuZ2UgQ29uc3RhbnRSYW5nZTo6c2V4dE9yVHJ1bmModWludDMyX3QgRHN0VHlTaXplKSBjb25zdCB7CisgIHVuc2lnbmVkIFNyY1R5U2l6ZSA9IGdldEJpdFdpZHRoKCk7CisgIGlmIChTcmNUeVNpemUgPiBEc3RUeVNpemUpCisgICAgcmV0dXJuIHRydW5jYXRlKERzdFR5U2l6ZSk7CisgIGVsc2UgaWYgKFNyY1R5U2l6ZSA8IERzdFR5U2l6ZSkKKyAgICByZXR1cm4gc2lnbkV4dGVuZChEc3RUeVNpemUpOworICBlbHNlCisgICAgcmV0dXJuICp0aGlzOworfQorCitDb25zdGFudFJhbmdlCitDb25zdGFudFJhbmdlOjphZGQoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0IHsKKyAgaWYgKGlzRW1wdHlTZXQoKSB8fCBPdGhlci5pc0VtcHR5U2V0KCkpCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoZ2V0Qml0V2lkdGgoKSwgLyppc0Z1bGxTZXQ9Ki9mYWxzZSk7CisgIGlmIChpc0Z1bGxTZXQoKSB8fCBPdGhlci5pc0Z1bGxTZXQoKSkKKyAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShnZXRCaXRXaWR0aCgpLCAvKmlzRnVsbFNldD0qL3RydWUpOworCisgIEFQSW50IFNwcmVhZF9YID0gZ2V0U2V0U2l6ZSgpLCBTcHJlYWRfWSA9IE90aGVyLmdldFNldFNpemUoKTsKKyAgQVBJbnQgTmV3TG93ZXIgPSBnZXRMb3dlcigpICsgT3RoZXIuZ2V0TG93ZXIoKTsKKyAgQVBJbnQgTmV3VXBwZXIgPSBnZXRVcHBlcigpICsgT3RoZXIuZ2V0VXBwZXIoKSAtIDE7CisgIGlmIChOZXdMb3dlciA9PSBOZXdVcHBlcikKKyAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShnZXRCaXRXaWR0aCgpLCAvKmlzRnVsbFNldD0qL3RydWUpOworCisgIENvbnN0YW50UmFuZ2UgWCA9IENvbnN0YW50UmFuZ2UoTmV3TG93ZXIsIE5ld1VwcGVyKTsKKyAgaWYgKFguZ2V0U2V0U2l6ZSgpLnVsdChTcHJlYWRfWCkgfHwgWC5nZXRTZXRTaXplKCkudWx0KFNwcmVhZF9ZKSkKKyAgICAvLyBXZSd2ZSB3cmFwcGVkLCB0aGVyZWZvcmUsIGZ1bGwgc2V0LgorICAgIHJldHVybiBDb25zdGFudFJhbmdlKGdldEJpdFdpZHRoKCksIC8qaXNGdWxsU2V0PSovdHJ1ZSk7CisKKyAgcmV0dXJuIFg7Cit9CisKK0NvbnN0YW50UmFuZ2UKK0NvbnN0YW50UmFuZ2U6Om11bHRpcGx5KGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdCB7CisgIC8vIFRPRE86IElmIGVpdGhlciBvcGVyYW5kIGlzIGEgc2luZ2xlIGVsZW1lbnQgYW5kIHRoZSBtdWx0aXBseSBpcyBrbm93biB0bworICAvLyBiZSBub24td3JhcHBpbmcsIHJvdW5kIHRoZSByZXN1bHQgbWluIGFuZCBtYXggdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlCisgIC8vIG11bHRpcGxlIG9mIHRoYXQgZWxlbWVudC4gSWYgd3JhcHBpbmcgaXMgcG9zc2libGUsIGF0IGxlYXN0IGFkanVzdCB0aGUKKyAgLy8gcmFuZ2UgYWNjb3JkaW5nIHRvIHRoZSBncmVhdGVzdCBwb3dlci1vZi10d28gZmFjdG9yIG9mIHRoZSBzaW5nbGUgZWxlbWVudC4KKworICBpZiAoaXNFbXB0eVNldCgpIHx8IE90aGVyLmlzRW1wdHlTZXQoKSkKKyAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShnZXRCaXRXaWR0aCgpLCAvKmlzRnVsbFNldD0qL2ZhbHNlKTsKKyAgaWYgKGlzRnVsbFNldCgpIHx8IE90aGVyLmlzRnVsbFNldCgpKQorICAgIHJldHVybiBDb25zdGFudFJhbmdlKGdldEJpdFdpZHRoKCksIC8qaXNGdWxsU2V0PSovdHJ1ZSk7CisKKyAgQVBJbnQgdGhpc19taW4gPSBnZXRVbnNpZ25lZE1pbigpLnpleHQoZ2V0Qml0V2lkdGgoKSAqIDIpOworICBBUEludCB0aGlzX21heCA9IGdldFVuc2lnbmVkTWF4KCkuemV4dChnZXRCaXRXaWR0aCgpICogMik7CisgIEFQSW50IE90aGVyX21pbiA9IE90aGVyLmdldFVuc2lnbmVkTWluKCkuemV4dChnZXRCaXRXaWR0aCgpICogMik7CisgIEFQSW50IE90aGVyX21heCA9IE90aGVyLmdldFVuc2lnbmVkTWF4KCkuemV4dChnZXRCaXRXaWR0aCgpICogMik7CisKKyAgQ29uc3RhbnRSYW5nZSBSZXN1bHRfemV4dCA9IENvbnN0YW50UmFuZ2UodGhpc19taW4gKiBPdGhlcl9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfbWF4ICogT3RoZXJfbWF4ICsgMSk7CisgIHJldHVybiBSZXN1bHRfemV4dC50cnVuY2F0ZShnZXRCaXRXaWR0aCgpKTsKK30KKworQ29uc3RhbnRSYW5nZQorQ29uc3RhbnRSYW5nZTo6c21heChjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcikgY29uc3QgeworICAvLyBYIHNtYXggWSBpczogcmFuZ2Uoc21heChYX3NtaW4sIFlfc21pbiksCisgIC8vICAgICAgICAgICAgICAgICAgICBzbWF4KFhfc21heCwgWV9zbWF4KSkKKyAgaWYgKGlzRW1wdHlTZXQoKSB8fCBPdGhlci5pc0VtcHR5U2V0KCkpCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoZ2V0Qml0V2lkdGgoKSwgLyppc0Z1bGxTZXQ9Ki9mYWxzZSk7CisgIEFQSW50IE5ld0wgPSBBUEludE9wczo6c21heChnZXRTaWduZWRNaW4oKSwgT3RoZXIuZ2V0U2lnbmVkTWluKCkpOworICBBUEludCBOZXdVID0gQVBJbnRPcHM6OnNtYXgoZ2V0U2lnbmVkTWF4KCksIE90aGVyLmdldFNpZ25lZE1heCgpKSArIDE7CisgIGlmIChOZXdVID09IE5ld0wpCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoZ2V0Qml0V2lkdGgoKSwgLyppc0Z1bGxTZXQ9Ki90cnVlKTsKKyAgcmV0dXJuIENvbnN0YW50UmFuZ2UoTmV3TCwgTmV3VSk7Cit9CisKK0NvbnN0YW50UmFuZ2UKK0NvbnN0YW50UmFuZ2U6OnVtYXgoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0IHsKKyAgLy8gWCB1bWF4IFkgaXM6IHJhbmdlKHVtYXgoWF91bWluLCBZX3VtaW4pLAorICAvLyAgICAgICAgICAgICAgICAgICAgdW1heChYX3VtYXgsIFlfdW1heCkpCisgIGlmIChpc0VtcHR5U2V0KCkgfHwgT3RoZXIuaXNFbXB0eVNldCgpKQorICAgIHJldHVybiBDb25zdGFudFJhbmdlKGdldEJpdFdpZHRoKCksIC8qaXNGdWxsU2V0PSovZmFsc2UpOworICBBUEludCBOZXdMID0gQVBJbnRPcHM6OnVtYXgoZ2V0VW5zaWduZWRNaW4oKSwgT3RoZXIuZ2V0VW5zaWduZWRNaW4oKSk7CisgIEFQSW50IE5ld1UgPSBBUEludE9wczo6dW1heChnZXRVbnNpZ25lZE1heCgpLCBPdGhlci5nZXRVbnNpZ25lZE1heCgpKSArIDE7CisgIGlmIChOZXdVID09IE5ld0wpCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoZ2V0Qml0V2lkdGgoKSwgLyppc0Z1bGxTZXQ9Ki90cnVlKTsKKyAgcmV0dXJuIENvbnN0YW50UmFuZ2UoTmV3TCwgTmV3VSk7Cit9CisKK0NvbnN0YW50UmFuZ2UKK0NvbnN0YW50UmFuZ2U6OnVkaXYoY29uc3QgQ29uc3RhbnRSYW5nZSAmUkhTKSBjb25zdCB7CisgIGlmIChpc0VtcHR5U2V0KCkgfHwgUkhTLmlzRW1wdHlTZXQoKSB8fCBSSFMuZ2V0VW5zaWduZWRNYXgoKSA9PSAwKQorICAgIHJldHVybiBDb25zdGFudFJhbmdlKGdldEJpdFdpZHRoKCksIC8qaXNGdWxsU2V0PSovZmFsc2UpOworICBpZiAoUkhTLmlzRnVsbFNldCgpKQorICAgIHJldHVybiBDb25zdGFudFJhbmdlKGdldEJpdFdpZHRoKCksIC8qaXNGdWxsU2V0PSovdHJ1ZSk7CisKKyAgQVBJbnQgTG93ZXIgPSBnZXRVbnNpZ25lZE1pbigpLnVkaXYoUkhTLmdldFVuc2lnbmVkTWF4KCkpOworCisgIEFQSW50IFJIU191bWluID0gUkhTLmdldFVuc2lnbmVkTWluKCk7CisgIGlmIChSSFNfdW1pbiA9PSAwKSB7CisgICAgLy8gV2Ugd2FudCB0aGUgbG93ZXN0IHZhbHVlIGluIFJIUyBleGNsdWRpbmcgemVyby4gVXN1YWxseSB0aGF0IHdvdWxkIGJlIDEKKyAgICAvLyBleGNlcHQgZm9yIGEgcmFuZ2UgaW4gdGhlIGZvcm0gb2YgW1gsIDEpIGluIHdoaWNoIGNhc2UgaXQgd291bGQgYmUgWC4KKyAgICBpZiAoUkhTLmdldFVwcGVyKCkgPT0gMSkKKyAgICAgIFJIU191bWluID0gUkhTLmdldExvd2VyKCk7CisgICAgZWxzZQorICAgICAgUkhTX3VtaW4gPSBBUEludChnZXRCaXRXaWR0aCgpLCAxKTsKKyAgfQorCisgIEFQSW50IFVwcGVyID0gZ2V0VW5zaWduZWRNYXgoKS51ZGl2KFJIU191bWluKSArIDE7CisKKyAgLy8gSWYgdGhlIExIUyBpcyBGdWxsIGFuZCB0aGUgUkhTIGlzIGEgd3JhcHBlZCBpbnRlcnZhbCBjb250YWluaW5nIDEgdGhlbgorICAvLyB0aGlzIGNvdWxkIG9jY3VyLgorICBpZiAoTG93ZXIgPT0gVXBwZXIpCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoZ2V0Qml0V2lkdGgoKSwgLyppc0Z1bGxTZXQ9Ki90cnVlKTsKKworICByZXR1cm4gQ29uc3RhbnRSYW5nZShMb3dlciwgVXBwZXIpOworfQorCitDb25zdGFudFJhbmdlCitDb25zdGFudFJhbmdlOjpzaGwoY29uc3QgQ29uc3RhbnRSYW5nZSAmQW1vdW50KSBjb25zdCB7CisgIGlmIChpc0VtcHR5U2V0KCkpCisgICAgcmV0dXJuICp0aGlzOworCisgIEFQSW50IG1pbiA9IGdldFVuc2lnbmVkTWluKCkgPDwgQW1vdW50LmdldFVuc2lnbmVkTWluKCk7CisgIEFQSW50IG1heCA9IGdldFVuc2lnbmVkTWF4KCkgPDwgQW1vdW50LmdldFVuc2lnbmVkTWF4KCk7CisKKyAgLy8gdGhlcmUncyBubyBvdmVyZmxvdyEKKyAgQVBJbnQgWmVyb3MoZ2V0Qml0V2lkdGgoKSwgZ2V0VW5zaWduZWRNYXgoKS5jb3VudExlYWRpbmdaZXJvcygpKTsKKyAgaWYgKFplcm9zLnVnZShBbW91bnQuZ2V0VW5zaWduZWRNYXgoKSkpCisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UobWluLCBtYXgpOworCisgIC8vIEZJWE1FOiBpbXBsZW1lbnQgdGhlIG90aGVyIHRyaWNreSBjYXNlcworICByZXR1cm4gQ29uc3RhbnRSYW5nZShnZXRCaXRXaWR0aCgpKTsKK30KKworQ29uc3RhbnRSYW5nZQorQ29uc3RhbnRSYW5nZTo6YXNocihjb25zdCBDb25zdGFudFJhbmdlICZBbW91bnQpIGNvbnN0IHsKKyAgaWYgKGlzRW1wdHlTZXQoKSkKKyAgICByZXR1cm4gKnRoaXM7CisKKyAgQVBJbnQgbWluID0gZ2V0VW5zaWduZWRNYXgoKS5hc2hyKEFtb3VudC5nZXRVbnNpZ25lZE1pbigpKTsKKyAgQVBJbnQgbWF4ID0gZ2V0VW5zaWduZWRNaW4oKS5hc2hyKEFtb3VudC5nZXRVbnNpZ25lZE1heCgpKTsKKyAgcmV0dXJuIENvbnN0YW50UmFuZ2UobWluLCBtYXgpOworfQorCitDb25zdGFudFJhbmdlCitDb25zdGFudFJhbmdlOjpsc2hyKGNvbnN0IENvbnN0YW50UmFuZ2UgJkFtb3VudCkgY29uc3QgeworICBpZiAoaXNFbXB0eVNldCgpKQorICAgIHJldHVybiAqdGhpczsKKyAgCisgIEFQSW50IG1pbiA9IGdldFVuc2lnbmVkTWF4KCkubHNocihBbW91bnQuZ2V0VW5zaWduZWRNaW4oKSk7CisgIEFQSW50IG1heCA9IGdldFVuc2lnbmVkTWluKCkubHNocihBbW91bnQuZ2V0VW5zaWduZWRNYXgoKSk7CisgIHJldHVybiBDb25zdGFudFJhbmdlKG1pbiwgbWF4KTsKK30KKworQ29uc3RhbnRSYW5nZSBDb25zdGFudFJhbmdlOjppbnZlcnNlKCkgY29uc3QgeworICBpZiAoaXNGdWxsU2V0KCkpIHsKKyAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShBUEludDo6Z2V0TnVsbFZhbHVlKExvd2VyLmdldEJpdFdpZHRoKCkpLAorICAgICAgQVBJbnQ6OmdldE51bGxWYWx1ZShMb3dlci5nZXRCaXRXaWR0aCgpKSk7CisgIH0gZWxzZSBpZiAoaXNFbXB0eVNldCgpKSB7CisgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShMb3dlci5nZXRCaXRXaWR0aCgpKSwKKyAgICAgIEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoTG93ZXIuZ2V0Qml0V2lkdGgoKSkpOworICB9CisgIHJldHVybiBDb25zdGFudFJhbmdlKFVwcGVyLCBMb3dlcik7Cit9CisKKy8vLyBwcmludCAtIFByaW50IG91dCB0aGUgYm91bmRzIHRvIGEgc3RyZWFtLi4uCisvLy8KK3ZvaWQgQ29uc3RhbnRSYW5nZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmIChpc0Z1bGxTZXQoKSkKKyAgICBPUyA8PCAiZnVsbC1zZXQiOworICBlbHNlIGlmIChpc0VtcHR5U2V0KCkpCisgICAgT1MgPDwgImVtcHR5LXNldCI7CisgIGVsc2UKKyAgICBPUyA8PCAiWyIgPDwgTG93ZXIgPDwgIiwiIDw8IFVwcGVyIDw8ICIpIjsKK30KKworLy8vIGR1bXAgLSBBbGxvdyBwcmludGluZyBmcm9tIGEgZGVidWdnZXIgZWFzaWx5Li4uCisvLy8KK3ZvaWQgQ29uc3RhbnRSYW5nZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsKK30KKworCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9EZWJ1Zy5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9EZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0OGY4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0RlYnVnLmNwcApAQCAtMCwwICsxLDEzNCBAQAorLy89PT0tLSBEZWJ1Zy5jcHAgLSBBbiBlYXN5IHdheSB0byBhZGQgZGVidWcgb3V0cHV0IHRvIHlvdXIgY29kZSAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGhhbmRsZSB3YXkgb2YgYWRkaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB5b3VyCisvLyBjb2RlLCB3aXRob3V0IGl0IGJlaW5nIGVuYWJsZWQgYWxsIG9mIHRoZSB0aW1lLCBhbmQgd2l0aG91dCBoYXZpbmcgdG8gYWRkCisvLyBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBlbmFibGUgaXQuCisvLworLy8gSW4gcGFydGljdWxhciwganVzdCB3cmFwIHlvdXIgY29kZSB3aXRoIHRoZSBERUJVRygpIG1hY3JvLCBhbmQgaXQgd2lsbCBiZQorLy8gZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGlmIHlvdSBzcGVjaWZ5ICctZGVidWcnIG9uIHRoZSBjb21tYW5kLWxpbmUuCisvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gdXNlIHRoZSBTRVRfREVCVUdfVFlQRSgiZm9vIikgbWFjcm8gdG8gc3BlY2lmeQorLy8gdGhhdCB5b3VyIGRlYnVnIGNvZGUgYmVsb25ncyB0byBjbGFzcyAiZm9vIi4gIFRoZW4sIG9uIHRoZSBjb21tYW5kIGxpbmUsIHlvdQorLy8gY2FuIHNwZWNpZnkgJy1kZWJ1Zy1vbmx5PWZvbycgdG8gZW5hYmxlIEpVU1QgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGZvciB0aGUKKy8vIGZvbyBjbGFzcy4KKy8vCisvLyBXaGVuIGNvbXBpbGluZyBpbiByZWxlYXNlIG1vZGUsIHRoZSAtZGVidWctKiBvcHRpb25zIGFuZCBhbGwgY29kZSBpbiBERUJVRygpCisvLyBzdGF0ZW1lbnRzIGRpc2FwcGVhcnMsIHNvIGl0IGRvZXMgbm90IGVmZmVjdCB0aGUgcnVudGltZSBvZiB0aGUgY29kZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L2NpcmN1bGFyX3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vU2lnbmFscy5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gQWxsIERlYnVnLmggZnVuY3Rpb25hbGl0eSBpcyBhIG5vLW9wIGluIE5ERUJVRyBtb2RlLgorI2lmbmRlZiBOREVCVUcKK2Jvb2wgbGx2bTo6RGVidWdGbGFnOyAgLy8gRGVidWdGbGFnIC0gRXhwb3J0ZWQgYm9vbGVhbiBzZXQgYnkgdGhlIC1kZWJ1ZyBvcHRpb24KKworLy8gLWRlYnVnIC0gQ29tbWFuZCBsaW5lIG9wdGlvbiB0byBlbmFibGUgdGhlIERFQlVHIHN0YXRlbWVudHMgaW4gdGhlIHBhc3Nlcy4KKy8vIFRoaXMgZmxhZyBtYXkgb25seSBiZSBlbmFibGVkIGluIGRlYnVnIGJ1aWxkcy4KK3N0YXRpYyBjbDo6b3B0PGJvb2wsIHRydWU+CitEZWJ1ZygiZGVidWciLCBjbDo6ZGVzYygiRW5hYmxlIGRlYnVnIG91dHB1dCIpLCBjbDo6SGlkZGVuLAorICAgICAgY2w6OmxvY2F0aW9uKERlYnVnRmxhZykpOworCisvLyAtZGVidWctYnVmZmVyLXNpemUgLSBCdWZmZXIgdGhlIGxhc3QgTiBjaGFyYWN0ZXJzIG9mIGRlYnVnIG91dHB1dAorLy91bnRpbCBwcm9ncmFtIHRlcm1pbmF0aW9uLgorc3RhdGljIGNsOjpvcHQ8dW5zaWduZWQ+CitEZWJ1Z0J1ZmZlclNpemUoImRlYnVnLWJ1ZmZlci1zaXplIiwKKyAgICAgICAgICAgICAgICBjbDo6ZGVzYygiQnVmZmVyIHRoZSBsYXN0IE4gY2hhcmFjdGVycyBvZiBkZWJ1ZyBvdXRwdXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgInVudGlsIHByb2dyYW0gdGVybWluYXRpb24uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiW2RlZmF1bHQgMCAtLSBpbW1lZGlhdGUgcHJpbnQtb3V0XSIpLAorICAgICAgICAgICAgICAgIGNsOjpIaWRkZW4sCisgICAgICAgICAgICAgICAgY2w6OmluaXQoMCkpOworCitzdGF0aWMgc3RkOjpzdHJpbmcgQ3VycmVudERlYnVnVHlwZTsKKworbmFtZXNwYWNlIHsKKworc3RydWN0IERlYnVnT25seU9wdCB7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICZWYWwpIGNvbnN0IHsKKyAgICBEZWJ1Z0ZsYWcgfD0gIVZhbC5lbXB0eSgpOworICAgIEN1cnJlbnREZWJ1Z1R5cGUgPSBWYWw7CisgIH0KK307CisKK30KKworc3RhdGljIERlYnVnT25seU9wdCBEZWJ1Z09ubHlPcHRMb2M7CisKK3N0YXRpYyBjbDo6b3B0PERlYnVnT25seU9wdCwgdHJ1ZSwgY2w6OnBhcnNlcjxzdGQ6OnN0cmluZz4gPgorRGVidWdPbmx5KCJkZWJ1Zy1vbmx5IiwgY2w6OmRlc2MoIkVuYWJsZSBhIHNwZWNpZmljIHR5cGUgb2YgZGVidWcgb3V0cHV0IiksCisgICAgICAgICAgY2w6OkhpZGRlbiwgY2w6OnZhbHVlX2Rlc2MoImRlYnVnIHN0cmluZyIpLAorICAgICAgICAgIGNsOjpsb2NhdGlvbihEZWJ1Z09ubHlPcHRMb2MpLCBjbDo6VmFsdWVSZXF1aXJlZCk7CisKKy8vIFNpZ25hbCBoYW5kbGVycyAtIGR1bXAgZGVidWcgb3V0cHV0IG9uIHRlcm1pbmF0aW9uLgorc3RhdGljIHZvaWQgZGVidWdfdXNlcl9zaWdfaGFuZGxlcih2b2lkICpDb29raWUpIHsKKyAgLy8gVGhpcyBpcyBhIGJpdCBzbmVha3kuICBTaW5jZSB0aGlzIGlzIHVuZGVyICNpZm5kZWYgTkRFQlVHLCB3ZQorICAvLyBrbm93IHRoYXQgZGVidWcgbW9kZSBpcyBlbmFibGVkIGFuZCBkYmdzKCkgcmVhbGx5IGlzIGEKKyAgLy8gY2lyY3VsYXJfcmF3X29zdHJlYW0uICBJZiBOREVCVUcgaXMgZGVmaW5lZCwgdGhlbiBkYmdzKCkgPT0KKyAgLy8gZXJycygpIGJ1dCB0aGlzIHdpbGwgbmV2ZXIgYmUgaW52b2tlZC4KKyAgbGx2bTo6Y2lyY3VsYXJfcmF3X29zdHJlYW0gKmRiZ291dCA9CisgICAgc3RhdGljX2Nhc3Q8bGx2bTo6Y2lyY3VsYXJfcmF3X29zdHJlYW0gKj4oJmxsdm06OmRiZ3MoKSk7CisgIGRiZ291dC0+Zmx1c2hCdWZmZXJXaXRoQmFubmVyKCk7Cit9CisKKy8vIGlzQ3VycmVudERlYnVnVHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHRoZSBkZWJ1ZyB0eXBlCisvLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgb3IgaWYgbm9uZSB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKKy8vIHdpdGggdGhlIC1kZWJ1Zy1vbmx5PVggb3B0aW9uLgorLy8KK2Jvb2wgbGx2bTo6aXNDdXJyZW50RGVidWdUeXBlKGNvbnN0IGNoYXIgKkRlYnVnVHlwZSkgeworICByZXR1cm4gQ3VycmVudERlYnVnVHlwZS5lbXB0eSgpIHx8IERlYnVnVHlwZSA9PSBDdXJyZW50RGVidWdUeXBlOworfQorCisvLy8gU2V0Q3VycmVudERlYnVnVHlwZSAtIFNldCB0aGUgY3VycmVudCBkZWJ1ZyB0eXBlLCBhcyBpZiB0aGUgLWRlYnVnLW9ubHk9WAorLy8vIG9wdGlvbiB3ZXJlIHNwZWNpZmllZC4gIE5vdGUgdGhhdCBEZWJ1Z0ZsYWcgYWxzbyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZSBmb3IKKy8vLyBkZWJ1ZyBvdXRwdXQgdG8gYmUgcHJvZHVjZWQuCisvLy8KK3ZvaWQgbGx2bTo6U2V0Q3VycmVudERlYnVnVHlwZShjb25zdCBjaGFyICpUeXBlKSB7CisgIEN1cnJlbnREZWJ1Z1R5cGUgPSBUeXBlOworfQorCisvLy8gZGJncyAtIFJldHVybiBhIGNpcmN1bGFyLWJ1ZmZlcmVkIGRlYnVnIHN0cmVhbS4KK3Jhd19vc3RyZWFtICZsbHZtOjpkYmdzKCkgeworICAvLyBEbyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiBpbiBhIHRocmVhZC1zYWZlIHdheS4KKyAgc3RhdGljIHN0cnVjdCBkYmdzdHJlYW0geworICAgIGNpcmN1bGFyX3Jhd19vc3RyZWFtIHN0cm07CisKKyAgICBkYmdzdHJlYW0oKSA6CisgICAgICAgIHN0cm0oZXJycygpLCAiKioqIERlYnVnIExvZyBPdXRwdXQgKioqXG4iLAorICAgICAgICAgICAgICghRW5hYmxlRGVidWdCdWZmZXJpbmcgfHwgIURlYnVnRmxhZykgPyAwIDogRGVidWdCdWZmZXJTaXplKSB7CisgICAgICBpZiAoRW5hYmxlRGVidWdCdWZmZXJpbmcgJiYgRGVidWdGbGFnICYmIERlYnVnQnVmZmVyU2l6ZSAhPSAwKQorICAgICAgICAvLyBUT0RPOiBBZGQgYSBoYW5kbGVyIGZvciBTSUdVU0VSMS10eXBlIHNpZ25hbHMgc28gdGhlIHVzZXIgY2FuCisgICAgICAgIC8vIGZvcmNlIGEgZGVidWcgZHVtcC4KKyAgICAgICAgc3lzOjpBZGRTaWduYWxIYW5kbGVyKCZkZWJ1Z191c2VyX3NpZ19oYW5kbGVyLCAwKTsKKyAgICAgIC8vIE90aGVyd2lzZSB3ZSd2ZSBhbHJlYWR5IHNldCB0aGUgZGVidWcgc3RyZWFtIGJ1ZmZlciBzaXplIHRvCisgICAgICAvLyB6ZXJvLCBkaXNhYmxpbmcgYnVmZmVyaW5nIHNvIGl0IHdpbGwgb3V0cHV0IGRpcmVjdGx5IHRvIGVycnMoKS4KKyAgICB9CisgIH0gdGhlc3RybTsKKworICByZXR1cm4gdGhlc3RybS5zdHJtOworfQorCisjZWxzZQorLy8gQXZvaWQgImhhcyBubyBzeW1ib2xzIiB3YXJuaW5nLgorbmFtZXNwYWNlIGxsdm0geworICAvLy8gZGJncyAtIFJldHVybiBlcnJzKCkuCisgIHJhd19vc3RyZWFtICZkYmdzKCkgeworICAgIHJldHVybiBlcnJzKCk7CisgIH0KK30KKworI2VuZGlmCisKKy8vLyBFbmFibGVEZWJ1Z0J1ZmZlcmluZyAtIFR1cm4gb24gc2lnbmFsIGhhbmRsZXIgaW5zdGFsbGF0aW9uLgorLy8vCitib29sIGxsdm06OkVuYWJsZURlYnVnQnVmZmVyaW5nID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9Ed2FyZi5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9Ed2FyZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjZTlkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0R3YXJmLmNwcApAQCAtMCwwICsxLDY0OCBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvRHdhcmYuY3BwIC0gRHdhcmYgRnJhbWV3b3JrIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBmb3IgZ2VuZXJpYyBkd2FyZiBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0R3YXJmLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIG5hbWVzcGFjZSBkd2FyZjsKKworLy8vIFRhZ1N0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIHRhZy4KKy8vLworY29uc3QgY2hhciAqbGx2bTo6ZHdhcmY6OlRhZ1N0cmluZyh1bnNpZ25lZCBUYWcpIHsKKyAgc3dpdGNoIChUYWcpIHsKKyAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZTogICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfYXJyYXlfdHlwZSI7CisgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6ICAgICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX2NsYXNzX3R5cGUiOworICBjYXNlIERXX1RBR19lbnRyeV9wb2ludDogICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19lbnRyeV9wb2ludCI7CisgIGNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6ICAgICAgICAgIHJldHVybiAiRFdfVEFHX2VudW1lcmF0aW9uX3R5cGUiOworICBjYXNlIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyOiAgICAgICAgICByZXR1cm4gIkRXX1RBR19mb3JtYWxfcGFyYW1ldGVyIjsKKyAgY2FzZSBEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb246ICAgICAgcmV0dXJuICJEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24iOworICBjYXNlIERXX1RBR19sYWJlbDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19sYWJlbCI7CisgIGNhc2UgRFdfVEFHX2xleGljYWxfYmxvY2s6ICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX2xleGljYWxfYmxvY2siOworICBjYXNlIERXX1RBR19tZW1iZXI6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19tZW1iZXIiOworICBjYXNlIERXX1RBR19wb2ludGVyX3R5cGU6ICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19wb2ludGVyX3R5cGUiOworICBjYXNlIERXX1RBR19yZWZlcmVuY2VfdHlwZTogICAgICAgICAgICByZXR1cm4gIkRXX1RBR19yZWZlcmVuY2VfdHlwZSI7CisgIGNhc2UgRFdfVEFHX2NvbXBpbGVfdW5pdDogICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX2NvbXBpbGVfdW5pdCI7CisgIGNhc2UgRFdfVEFHX3N0cmluZ190eXBlOiAgICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX3N0cmluZ190eXBlIjsKKyAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6ICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfc3RydWN0dXJlX3R5cGUiOworICBjYXNlIERXX1RBR19zdWJyb3V0aW5lX3R5cGU6ICAgICAgICAgICByZXR1cm4gIkRXX1RBR19zdWJyb3V0aW5lX3R5cGUiOworICBjYXNlIERXX1RBR190eXBlZGVmOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR190eXBlZGVmIjsKKyAgY2FzZSBEV19UQUdfdW5pb25fdHlwZTogICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfdW5pb25fdHlwZSI7CisgIGNhc2UgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnM6ICAgIHJldHVybiAiRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMiOworICBjYXNlIERXX1RBR192YXJpYW50OiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR192YXJpYW50IjsKKyAgY2FzZSBEV19UQUdfY29tbW9uX2Jsb2NrOiAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfY29tbW9uX2Jsb2NrIjsKKyAgY2FzZSBEV19UQUdfY29tbW9uX2luY2x1c2lvbjogICAgICAgICAgcmV0dXJuICJEV19UQUdfY29tbW9uX2luY2x1c2lvbiI7CisgIGNhc2UgRFdfVEFHX2luaGVyaXRhbmNlOiAgICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX2luaGVyaXRhbmNlIjsKKyAgY2FzZSBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lOiAgICAgICAgcmV0dXJuICJEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lIjsKKyAgY2FzZSBEV19UQUdfbW9kdWxlOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfbW9kdWxlIjsKKyAgY2FzZSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlOiAgICAgICAgcmV0dXJuICJEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlIjsKKyAgY2FzZSBEV19UQUdfc2V0X3R5cGU6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfc2V0X3R5cGUiOworICBjYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOiAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19zdWJyYW5nZV90eXBlIjsKKyAgY2FzZSBEV19UQUdfd2l0aF9zdG10OiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfd2l0aF9zdG10IjsKKyAgY2FzZSBEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uOiAgICAgICAgcmV0dXJuICJEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uIjsKKyAgY2FzZSBEV19UQUdfYmFzZV90eXBlOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfYmFzZV90eXBlIjsKKyAgY2FzZSBEV19UQUdfY2F0Y2hfYmxvY2s6ICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfY2F0Y2hfYmxvY2siOworICBjYXNlIERXX1RBR19jb25zdF90eXBlOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19jb25zdF90eXBlIjsKKyAgY2FzZSBEV19UQUdfY29uc3RhbnQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfY29uc3RhbnQiOworICBjYXNlIERXX1RBR19lbnVtZXJhdG9yOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19lbnVtZXJhdG9yIjsKKyAgY2FzZSBEV19UQUdfZmlsZV90eXBlOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfZmlsZV90eXBlIjsKKyAgY2FzZSBEV19UQUdfZnJpZW5kOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfZnJpZW5kIjsKKyAgY2FzZSBEV19UQUdfbmFtZWxpc3Q6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfbmFtZWxpc3QiOworICBjYXNlIERXX1RBR19uYW1lbGlzdF9pdGVtOiAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19uYW1lbGlzdF9pdGVtIjsKKyAgY2FzZSBEV19UQUdfcGFja2VkX3R5cGU6ICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfcGFja2VkX3R5cGUiOworICBjYXNlIERXX1RBR19zdWJwcm9ncmFtOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19zdWJwcm9ncmFtIjsKKyAgY2FzZSBEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbWV0ZXI6ICByZXR1cm4gIkRXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtZXRlciI7CisgIGNhc2UgRFdfVEFHX3RlbXBsYXRlX3ZhbHVlX3BhcmFtZXRlcjpyZXR1cm4gIkRXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbWV0ZXIiOworICBjYXNlIERXX1RBR190aHJvd25fdHlwZTogICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR190aHJvd25fdHlwZSI7CisgIGNhc2UgRFdfVEFHX3RyeV9ibG9jazogICAgICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX3RyeV9ibG9jayI7CisgIGNhc2UgRFdfVEFHX3ZhcmlhbnRfcGFydDogICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX3ZhcmlhbnRfcGFydCI7CisgIGNhc2UgRFdfVEFHX3ZhcmlhYmxlOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX3ZhcmlhYmxlIjsKKyAgY2FzZSBEV19UQUdfdm9sYXRpbGVfdHlwZTogICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfdm9sYXRpbGVfdHlwZSI7CisgIGNhc2UgRFdfVEFHX2R3YXJmX3Byb2NlZHVyZTogICAgICAgICAgIHJldHVybiAiRFdfVEFHX2R3YXJmX3Byb2NlZHVyZSI7CisgIGNhc2UgRFdfVEFHX3Jlc3RyaWN0X3R5cGU6ICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX3Jlc3RyaWN0X3R5cGUiOworICBjYXNlIERXX1RBR19pbnRlcmZhY2VfdHlwZTogICAgICAgICAgICByZXR1cm4gIkRXX1RBR19pbnRlcmZhY2VfdHlwZSI7CisgIGNhc2UgRFdfVEFHX25hbWVzcGFjZTogICAgICAgICAgICAgICAgIHJldHVybiAiRFdfVEFHX25hbWVzcGFjZSI7CisgIGNhc2UgRFdfVEFHX2ltcG9ydGVkX21vZHVsZTogICAgICAgICAgIHJldHVybiAiRFdfVEFHX2ltcG9ydGVkX21vZHVsZSI7CisgIGNhc2UgRFdfVEFHX3Vuc3BlY2lmaWVkX3R5cGU6ICAgICAgICAgIHJldHVybiAiRFdfVEFHX3Vuc3BlY2lmaWVkX3R5cGUiOworICBjYXNlIERXX1RBR19wYXJ0aWFsX3VuaXQ6ICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19wYXJ0aWFsX3VuaXQiOworICBjYXNlIERXX1RBR19pbXBvcnRlZF91bml0OiAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19pbXBvcnRlZF91bml0IjsKKyAgY2FzZSBEV19UQUdfY29uZGl0aW9uOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfY29uZGl0aW9uIjsKKyAgY2FzZSBEV19UQUdfc2hhcmVkX3R5cGU6ICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfc2hhcmVkX3R5cGUiOworICBjYXNlIERXX1RBR19sb191c2VyOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX1RBR19sb191c2VyIjsKKyAgY2FzZSBEV19UQUdfaGlfdXNlcjogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19UQUdfaGlfdXNlciI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBDaGlsZHJlblN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGNoaWxkcmVuIGZsYWcuCisvLy8KK2NvbnN0IGNoYXIgKmxsdm06OmR3YXJmOjpDaGlsZHJlblN0cmluZyh1bnNpZ25lZCBDaGlsZHJlbikgeworICBzd2l0Y2ggKENoaWxkcmVuKSB7CisgIGNhc2UgRFdfQ0hJTERSRU5fbm86ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQ0hJTERSRU5fbm8iOworICBjYXNlIERXX0NISUxEUkVOX3llczogICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0NISUxEUkVOX3llcyI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBBdHRyaWJ1dGVTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisvLy8KK2NvbnN0IGNoYXIgKmxsdm06OmR3YXJmOjpBdHRyaWJ1dGVTdHJpbmcodW5zaWduZWQgQXR0cmlidXRlKSB7CisgIHN3aXRjaCAoQXR0cmlidXRlKSB7CisgIGNhc2UgRFdfQVRfc2libGluZzogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfc2libGluZyI7CisgIGNhc2UgRFdfQVRfbG9jYXRpb246ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfbG9jYXRpb24iOworICBjYXNlIERXX0FUX25hbWU6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX25hbWUiOworICBjYXNlIERXX0FUX29yZGVyaW5nOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX29yZGVyaW5nIjsKKyAgY2FzZSBEV19BVF9ieXRlX3NpemU6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9ieXRlX3NpemUiOworICBjYXNlIERXX0FUX2JpdF9vZmZzZXQ6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2JpdF9vZmZzZXQiOworICBjYXNlIERXX0FUX2JpdF9zaXplOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2JpdF9zaXplIjsKKyAgY2FzZSBEV19BVF9zdG10X2xpc3Q6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9zdG10X2xpc3QiOworICBjYXNlIERXX0FUX2xvd19wYzogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2xvd19wYyI7CisgIGNhc2UgRFdfQVRfaGlnaF9wYzogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfaGlnaF9wYyI7CisgIGNhc2UgRFdfQVRfbGFuZ3VhZ2U6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfbGFuZ3VhZ2UiOworICBjYXNlIERXX0FUX2Rpc2NyOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2Rpc2NyIjsKKyAgY2FzZSBEV19BVF9kaXNjcl92YWx1ZTogICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9kaXNjcl92YWx1ZSI7CisgIGNhc2UgRFdfQVRfdmlzaWJpbGl0eTogICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfdmlzaWJpbGl0eSI7CisgIGNhc2UgRFdfQVRfaW1wb3J0OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfaW1wb3J0IjsKKyAgY2FzZSBEV19BVF9zdHJpbmdfbGVuZ3RoOiAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9zdHJpbmdfbGVuZ3RoIjsKKyAgY2FzZSBEV19BVF9jb21tb25fcmVmZXJlbmNlOiAgICAgICAgICAgcmV0dXJuICJEV19BVF9jb21tb25fcmVmZXJlbmNlIjsKKyAgY2FzZSBEV19BVF9jb21wX2RpcjogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9jb21wX2RpciI7CisgIGNhc2UgRFdfQVRfY29uc3RfdmFsdWU6ICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfY29uc3RfdmFsdWUiOworICBjYXNlIERXX0FUX2NvbnRhaW5pbmdfdHlwZTogICAgICAgICAgICByZXR1cm4gIkRXX0FUX2NvbnRhaW5pbmdfdHlwZSI7CisgIGNhc2UgRFdfQVRfZGVmYXVsdF92YWx1ZTogICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfZGVmYXVsdF92YWx1ZSI7CisgIGNhc2UgRFdfQVRfaW5saW5lOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfaW5saW5lIjsKKyAgY2FzZSBEV19BVF9pc19vcHRpb25hbDogICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9pc19vcHRpb25hbCI7CisgIGNhc2UgRFdfQVRfbG93ZXJfYm91bmQ6ICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfbG93ZXJfYm91bmQiOworICBjYXNlIERXX0FUX3Byb2R1Y2VyOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX3Byb2R1Y2VyIjsKKyAgY2FzZSBEV19BVF9wcm90b3R5cGVkOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9wcm90b3R5cGVkIjsKKyAgY2FzZSBEV19BVF9yZXR1cm5fYWRkcjogICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9yZXR1cm5fYWRkciI7CisgIGNhc2UgRFdfQVRfc3RhcnRfc2NvcGU6ICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfc3RhcnRfc2NvcGUiOworICBjYXNlIERXX0FUX2JpdF9zdHJpZGU6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2JpdF9zdHJpZGUiOworICBjYXNlIERXX0FUX3VwcGVyX2JvdW5kOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX3VwcGVyX2JvdW5kIjsKKyAgY2FzZSBEV19BVF9hYnN0cmFjdF9vcmlnaW46ICAgICAgICAgICAgcmV0dXJuICJEV19BVF9hYnN0cmFjdF9vcmlnaW4iOworICBjYXNlIERXX0FUX2FjY2Vzc2liaWxpdHk6ICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2FjY2Vzc2liaWxpdHkiOworICBjYXNlIERXX0FUX2FkZHJlc3NfY2xhc3M6ICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2FkZHJlc3NfY2xhc3MiOworICBjYXNlIERXX0FUX2FydGlmaWNpYWw6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2FydGlmaWNpYWwiOworICBjYXNlIERXX0FUX2Jhc2VfdHlwZXM6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2Jhc2VfdHlwZXMiOworICBjYXNlIERXX0FUX2NhbGxpbmdfY29udmVudGlvbjogICAgICAgICByZXR1cm4gIkRXX0FUX2NhbGxpbmdfY29udmVudGlvbiI7CisgIGNhc2UgRFdfQVRfY291bnQ6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfY291bnQiOworICBjYXNlIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uOiAgICAgICByZXR1cm4gIkRXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uIjsKKyAgY2FzZSBEV19BVF9kZWNsX2NvbHVtbjogICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9kZWNsX2NvbHVtbiI7CisgIGNhc2UgRFdfQVRfZGVjbF9maWxlOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfZGVjbF9maWxlIjsKKyAgY2FzZSBEV19BVF9kZWNsX2xpbmU6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9kZWNsX2xpbmUiOworICBjYXNlIERXX0FUX2RlY2xhcmF0aW9uOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2RlY2xhcmF0aW9uIjsKKyAgY2FzZSBEV19BVF9kaXNjcl9saXN0OiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9kaXNjcl9saXN0IjsKKyAgY2FzZSBEV19BVF9lbmNvZGluZzogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9lbmNvZGluZyI7CisgIGNhc2UgRFdfQVRfZXh0ZXJuYWw6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfZXh0ZXJuYWwiOworICBjYXNlIERXX0FUX2ZyYW1lX2Jhc2U6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2ZyYW1lX2Jhc2UiOworICBjYXNlIERXX0FUX2ZyaWVuZDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2ZyaWVuZCI7CisgIGNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOiAgICAgICAgICAgIHJldHVybiAiRFdfQVRfaWRlbnRpZmllcl9jYXNlIjsKKyAgY2FzZSBEV19BVF9tYWNyb19pbmZvOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9tYWNyb19pbmZvIjsKKyAgY2FzZSBEV19BVF9uYW1lbGlzdF9pdGVtOiAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9uYW1lbGlzdF9pdGVtIjsKKyAgY2FzZSBEV19BVF9wcmlvcml0eTogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9wcmlvcml0eSI7CisgIGNhc2UgRFdfQVRfc2VnbWVudDogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfc2VnbWVudCI7CisgIGNhc2UgRFdfQVRfc3BlY2lmaWNhdGlvbjogICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfc3BlY2lmaWNhdGlvbiI7CisgIGNhc2UgRFdfQVRfc3RhdGljX2xpbms6ICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfc3RhdGljX2xpbmsiOworICBjYXNlIERXX0FUX3R5cGU6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX3R5cGUiOworICBjYXNlIERXX0FUX3VzZV9sb2NhdGlvbjogICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX3VzZV9sb2NhdGlvbiI7CisgIGNhc2UgRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyOiAgICAgICAgIHJldHVybiAiRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyIjsKKyAgY2FzZSBEV19BVF92aXJ0dWFsaXR5OiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF92aXJ0dWFsaXR5IjsKKyAgY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjogICAgICAgcmV0dXJuICJEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbiI7CisgIGNhc2UgRFdfQVRfYWxsb2NhdGVkOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfYWxsb2NhdGVkIjsKKyAgY2FzZSBEV19BVF9hc3NvY2lhdGVkOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9hc3NvY2lhdGVkIjsKKyAgY2FzZSBEV19BVF9kYXRhX2xvY2F0aW9uOiAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9kYXRhX2xvY2F0aW9uIjsKKyAgY2FzZSBEV19BVF9ieXRlX3N0cmlkZTogICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9ieXRlX3N0cmlkZSI7CisgIGNhc2UgRFdfQVRfZW50cnlfcGM6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfZW50cnlfcGMiOworICBjYXNlIERXX0FUX3VzZV9VVEY4OiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX3VzZV9VVEY4IjsKKyAgY2FzZSBEV19BVF9leHRlbnNpb246ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9leHRlbnNpb24iOworICBjYXNlIERXX0FUX3JhbmdlczogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX3JhbmdlcyI7CisgIGNhc2UgRFdfQVRfdHJhbXBvbGluZTogICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfdHJhbXBvbGluZSI7CisgIGNhc2UgRFdfQVRfY2FsbF9jb2x1bW46ICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfY2FsbF9jb2x1bW4iOworICBjYXNlIERXX0FUX2NhbGxfZmlsZTogICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2NhbGxfZmlsZSI7CisgIGNhc2UgRFdfQVRfY2FsbF9saW5lOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfY2FsbF9saW5lIjsKKyAgY2FzZSBEV19BVF9kZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9kZXNjcmlwdGlvbiI7CisgIGNhc2UgRFdfQVRfYmluYXJ5X3NjYWxlOiAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfYmluYXJ5X3NjYWxlIjsKKyAgY2FzZSBEV19BVF9kZWNpbWFsX3NjYWxlOiAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9kZWNpbWFsX3NjYWxlIjsKKyAgY2FzZSBEV19BVF9zbWFsbDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9zbWFsbCI7CisgIGNhc2UgRFdfQVRfZGVjaW1hbF9zaWduOiAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfZGVjaW1hbF9zaWduIjsKKyAgY2FzZSBEV19BVF9kaWdpdF9jb3VudDogICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9kaWdpdF9jb3VudCI7CisgIGNhc2UgRFdfQVRfcGljdHVyZV9zdHJpbmc6ICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfcGljdHVyZV9zdHJpbmciOworICBjYXNlIERXX0FUX211dGFibGU6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX211dGFibGUiOworICBjYXNlIERXX0FUX3RocmVhZHNfc2NhbGVkOiAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX3RocmVhZHNfc2NhbGVkIjsKKyAgY2FzZSBEV19BVF9leHBsaWNpdDogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9leHBsaWNpdCI7CisgIGNhc2UgRFdfQVRfb2JqZWN0X3BvaW50ZXI6ICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfb2JqZWN0X3BvaW50ZXIiOworICBjYXNlIERXX0FUX2VuZGlhbml0eTogICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX2VuZGlhbml0eSI7CisgIGNhc2UgRFdfQVRfZWxlbWVudGFsOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfZWxlbWVudGFsIjsKKyAgY2FzZSBEV19BVF9wdXJlOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9wdXJlIjsKKyAgY2FzZSBEV19BVF9yZWN1cnNpdmU6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9yZWN1cnNpdmUiOworICBjYXNlIERXX0FUX01JUFNfbGlua2FnZV9uYW1lOiAgICAgICAgICByZXR1cm4gIkRXX0FUX01JUFNfbGlua2FnZV9uYW1lIjsKKyAgY2FzZSBEV19BVF9zZl9uYW1lczogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9zZl9uYW1lcyI7CisgIGNhc2UgRFdfQVRfc3JjX2luZm86ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfc3JjX2luZm8iOworICBjYXNlIERXX0FUX21hY19pbmZvOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FUX21hY19pbmZvIjsKKyAgY2FzZSBEV19BVF9zcmNfY29vcmRzOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9zcmNfY29vcmRzIjsKKyAgY2FzZSBEV19BVF9ib2R5X2JlZ2luOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9ib2R5X2JlZ2luIjsKKyAgY2FzZSBEV19BVF9ib2R5X2VuZDogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9ib2R5X2VuZCI7CisgIGNhc2UgRFdfQVRfR05VX3ZlY3RvcjogICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfR05VX3ZlY3RvciI7CisgIGNhc2UgRFdfQVRfbG9fdXNlcjogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfbG9fdXNlciI7CisgIGNhc2UgRFdfQVRfaGlfdXNlcjogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfaGlfdXNlciI7CisgIGNhc2UgRFdfQVRfQVBQTEVfb3B0aW1pemVkOiAgICAgICAgICAgIHJldHVybiAiRFdfQVRfQVBQTEVfb3B0aW1pemVkIjsKKyAgY2FzZSBEV19BVF9BUFBMRV9mbGFnczogICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9BUFBMRV9mbGFncyI7CisgIGNhc2UgRFdfQVRfQVBQTEVfaXNhOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRfQVBQTEVfaXNhIjsKKyAgY2FzZSBEV19BVF9BUFBMRV9ibG9jazogICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVF9BUFBMRV9ibG9jayI7CisgIGNhc2UgRFdfQVRfQVBQTEVfbWFqb3JfcnVudGltZV92ZXJzOiAgIHJldHVybiAiRFdfQVRfQVBQTEVfbWFqb3JfcnVudGltZV92ZXJzIjsKKyAgY2FzZSBEV19BVF9BUFBMRV9ydW50aW1lX2NsYXNzOiAgICAgICAgcmV0dXJuICJEV19BVF9BUFBMRV9ydW50aW1lX2NsYXNzIjsKKyAgY2FzZSBEV19BVF9BUFBMRV9vbWl0X2ZyYW1lX3B0cjogICAgICAgcmV0dXJuICJEV19BVF9BUFBMRV9vbWl0X2ZyYW1lX3B0ciI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBGb3JtRW5jb2RpbmdTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBmb3JtIGVuY29kaW5nLgorLy8vCitjb25zdCBjaGFyICpsbHZtOjpkd2FyZjo6Rm9ybUVuY29kaW5nU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKSB7CisgIHN3aXRjaCAoRW5jb2RpbmcpIHsKKyAgY2FzZSBEV19GT1JNX2FkZHI6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19GT1JNX2FkZHIiOworICBjYXNlIERXX0ZPUk1fYmxvY2syOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0ZPUk1fYmxvY2syIjsKKyAgY2FzZSBEV19GT1JNX2Jsb2NrNDogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19GT1JNX2Jsb2NrNCI7CisgIGNhc2UgRFdfRk9STV9kYXRhMjogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRk9STV9kYXRhMiI7CisgIGNhc2UgRFdfRk9STV9kYXRhNDogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRk9STV9kYXRhNCI7CisgIGNhc2UgRFdfRk9STV9kYXRhODogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRk9STV9kYXRhOCI7CisgIGNhc2UgRFdfRk9STV9zdHJpbmc6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRk9STV9zdHJpbmciOworICBjYXNlIERXX0ZPUk1fYmxvY2s6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0ZPUk1fYmxvY2siOworICBjYXNlIERXX0ZPUk1fYmxvY2sxOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0ZPUk1fYmxvY2sxIjsKKyAgY2FzZSBEV19GT1JNX2RhdGExOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19GT1JNX2RhdGExIjsKKyAgY2FzZSBEV19GT1JNX2ZsYWc6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19GT1JNX2ZsYWciOworICBjYXNlIERXX0ZPUk1fc2RhdGE6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0ZPUk1fc2RhdGEiOworICBjYXNlIERXX0ZPUk1fc3RycDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0ZPUk1fc3RycCI7CisgIGNhc2UgRFdfRk9STV91ZGF0YTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRk9STV91ZGF0YSI7CisgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjogICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRk9STV9yZWZfYWRkciI7CisgIGNhc2UgRFdfRk9STV9yZWYxOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRk9STV9yZWYxIjsKKyAgY2FzZSBEV19GT1JNX3JlZjI6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19GT1JNX3JlZjIiOworICBjYXNlIERXX0ZPUk1fcmVmNDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0ZPUk1fcmVmNCI7CisgIGNhc2UgRFdfRk9STV9yZWY4OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRk9STV9yZWY4IjsKKyAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YTogICAgICAgICAgICAgICAgcmV0dXJuICJEV19GT1JNX3JlZl91ZGF0YSI7CisgIGNhc2UgRFdfRk9STV9pbmRpcmVjdDogICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRk9STV9pbmRpcmVjdCI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBPcGVyYXRpb25FbmNvZGluZ1N0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbgorLy8vIGVuY29kaW5nLgorY29uc3QgY2hhciAqbGx2bTo6ZHdhcmY6Ok9wZXJhdGlvbkVuY29kaW5nU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKSB7CisgIHN3aXRjaCAoRW5jb2RpbmcpIHsKKyAgY2FzZSBEV19PUF9hZGRyOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9hZGRyIjsKKyAgY2FzZSBEV19PUF9kZXJlZjogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9kZXJlZiI7CisgIGNhc2UgRFdfT1BfY29uc3QxdTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY29uc3QxdSI7CisgIGNhc2UgRFdfT1BfY29uc3QxczogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY29uc3QxcyI7CisgIGNhc2UgRFdfT1BfY29uc3QydTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY29uc3QydSI7CisgIGNhc2UgRFdfT1BfY29uc3QyczogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY29uc3QycyI7CisgIGNhc2UgRFdfT1BfY29uc3Q0dTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY29uc3Q0dSI7CisgIGNhc2UgRFdfT1BfY29uc3Q0czogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY29uc3Q0cyI7CisgIGNhc2UgRFdfT1BfY29uc3Q4dTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY29uc3Q4dSI7CisgIGNhc2UgRFdfT1BfY29uc3Q4czogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY29uc3Q4cyI7CisgIGNhc2UgRFdfT1BfY29uc3R1OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY29uc3R1IjsKKyAgY2FzZSBEV19PUF9jb25zdHM6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9jb25zdHMiOworICBjYXNlIERXX09QX2R1cDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2R1cCI7CisgIGNhc2UgRFdfT1BfZHJvcDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfZHJvcCI7CisgIGNhc2UgRFdfT1Bfb3ZlcjogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1Bfb3ZlciI7CisgIGNhc2UgRFdfT1BfcGljazogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcGljayI7CisgIGNhc2UgRFdfT1Bfc3dhcDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1Bfc3dhcCI7CisgIGNhc2UgRFdfT1Bfcm90OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1Bfcm90IjsKKyAgY2FzZSBEV19PUF94ZGVyZWY6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF94ZGVyZWYiOworICBjYXNlIERXX09QX2FiczogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2FicyI7CisgIGNhc2UgRFdfT1BfYW5kOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYW5kIjsKKyAgY2FzZSBEV19PUF9kaXY6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9kaXYiOworICBjYXNlIERXX09QX21pbnVzOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX21pbnVzIjsKKyAgY2FzZSBEV19PUF9tb2Q6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9tb2QiOworICBjYXNlIERXX09QX211bDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX211bCI7CisgIGNhc2UgRFdfT1BfbmVnOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfbmVnIjsKKyAgY2FzZSBEV19PUF9ub3Q6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9ub3QiOworICBjYXNlIERXX09QX29yOiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX29yIjsKKyAgY2FzZSBEV19PUF9wbHVzOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9wbHVzIjsKKyAgY2FzZSBEV19PUF9wbHVzX3Vjb25zdDogICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9wbHVzX3Vjb25zdCI7CisgIGNhc2UgRFdfT1Bfc2hsOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1Bfc2hsIjsKKyAgY2FzZSBEV19PUF9zaHI6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9zaHIiOworICBjYXNlIERXX09QX3NocmE6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3NocmEiOworICBjYXNlIERXX09QX3hvcjogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3hvciI7CisgIGNhc2UgRFdfT1Bfc2tpcDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1Bfc2tpcCI7CisgIGNhc2UgRFdfT1BfYnJhOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJhIjsKKyAgY2FzZSBEV19PUF9lcTogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9lcSI7CisgIGNhc2UgRFdfT1BfZ2U6ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfZ2UiOworICBjYXNlIERXX09QX2d0OiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2d0IjsKKyAgY2FzZSBEV19PUF9sZTogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9sZSI7CisgIGNhc2UgRFdfT1BfbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfbHQiOworICBjYXNlIERXX09QX25lOiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX25lIjsKKyAgY2FzZSBEV19PUF9saXQwOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQwIjsKKyAgY2FzZSBEV19PUF9saXQxOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQxIjsKKyAgY2FzZSBEV19PUF9saXQyOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQyIjsKKyAgY2FzZSBEV19PUF9saXQzOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQzIjsKKyAgY2FzZSBEV19PUF9saXQ0OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQ0IjsKKyAgY2FzZSBEV19PUF9saXQ1OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQ1IjsKKyAgY2FzZSBEV19PUF9saXQ2OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQ2IjsKKyAgY2FzZSBEV19PUF9saXQ3OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQ3IjsKKyAgY2FzZSBEV19PUF9saXQ4OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQ4IjsKKyAgY2FzZSBEV19PUF9saXQ5OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQ5IjsKKyAgY2FzZSBEV19PUF9saXQxMDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQxMCI7CisgIGNhc2UgRFdfT1BfbGl0MTE6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfbGl0MTEiOworICBjYXNlIERXX09QX2xpdDEyOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2xpdDEyIjsKKyAgY2FzZSBEV19PUF9saXQxMzogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQxMyI7CisgIGNhc2UgRFdfT1BfbGl0MTQ6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfbGl0MTQiOworICBjYXNlIERXX09QX2xpdDE1OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2xpdDE1IjsKKyAgY2FzZSBEV19PUF9saXQxNjogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQxNiI7CisgIGNhc2UgRFdfT1BfbGl0MTc6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfbGl0MTciOworICBjYXNlIERXX09QX2xpdDE4OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2xpdDE4IjsKKyAgY2FzZSBEV19PUF9saXQxOTogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQxOSI7CisgIGNhc2UgRFdfT1BfbGl0MjA6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfbGl0MjAiOworICBjYXNlIERXX09QX2xpdDIxOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2xpdDIxIjsKKyAgY2FzZSBEV19PUF9saXQyMjogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQyMiI7CisgIGNhc2UgRFdfT1BfbGl0MjM6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfbGl0MjMiOworICBjYXNlIERXX09QX2xpdDI0OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2xpdDI0IjsKKyAgY2FzZSBEV19PUF9saXQyNTogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQyNSI7CisgIGNhc2UgRFdfT1BfbGl0MjY6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfbGl0MjYiOworICBjYXNlIERXX09QX2xpdDI3OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2xpdDI3IjsKKyAgY2FzZSBEV19PUF9saXQyODogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQyOCI7CisgIGNhc2UgRFdfT1BfbGl0Mjk6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfbGl0MjkiOworICBjYXNlIERXX09QX2xpdDMwOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2xpdDMwIjsKKyAgY2FzZSBEV19PUF9saXQzMTogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9saXQzMSI7CisgIGNhc2UgRFdfT1BfcmVnMDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMCI7CisgIGNhc2UgRFdfT1BfcmVnMTogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMSI7CisgIGNhc2UgRFdfT1BfcmVnMjogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMiI7CisgIGNhc2UgRFdfT1BfcmVnMzogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMyI7CisgIGNhc2UgRFdfT1BfcmVnNDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnNCI7CisgIGNhc2UgRFdfT1BfcmVnNTogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnNSI7CisgIGNhc2UgRFdfT1BfcmVnNjogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnNiI7CisgIGNhc2UgRFdfT1BfcmVnNzogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnNyI7CisgIGNhc2UgRFdfT1BfcmVnODogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnOCI7CisgIGNhc2UgRFdfT1BfcmVnOTogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnOSI7CisgIGNhc2UgRFdfT1BfcmVnMTA6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMTAiOworICBjYXNlIERXX09QX3JlZzExOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3JlZzExIjsKKyAgY2FzZSBEV19PUF9yZWcxMjogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9yZWcxMiI7CisgIGNhc2UgRFdfT1BfcmVnMTM6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMTMiOworICBjYXNlIERXX09QX3JlZzE0OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3JlZzE0IjsKKyAgY2FzZSBEV19PUF9yZWcxNTogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9yZWcxNSI7CisgIGNhc2UgRFdfT1BfcmVnMTY6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMTYiOworICBjYXNlIERXX09QX3JlZzE3OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3JlZzE3IjsKKyAgY2FzZSBEV19PUF9yZWcxODogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9yZWcxOCI7CisgIGNhc2UgRFdfT1BfcmVnMTk6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMTkiOworICBjYXNlIERXX09QX3JlZzIwOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3JlZzIwIjsKKyAgY2FzZSBEV19PUF9yZWcyMTogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9yZWcyMSI7CisgIGNhc2UgRFdfT1BfcmVnMjI6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMjIiOworICBjYXNlIERXX09QX3JlZzIzOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3JlZzIzIjsKKyAgY2FzZSBEV19PUF9yZWcyNDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9yZWcyNCI7CisgIGNhc2UgRFdfT1BfcmVnMjU6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMjUiOworICBjYXNlIERXX09QX3JlZzI2OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3JlZzI2IjsKKyAgY2FzZSBEV19PUF9yZWcyNzogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9yZWcyNyI7CisgIGNhc2UgRFdfT1BfcmVnMjg6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMjgiOworICBjYXNlIERXX09QX3JlZzI5OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3JlZzI5IjsKKyAgY2FzZSBEV19PUF9yZWczMDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9yZWczMCI7CisgIGNhc2UgRFdfT1BfcmVnMzE6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcmVnMzEiOworICBjYXNlIERXX09QX2JyZWcwOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWcwIjsKKyAgY2FzZSBEV19PUF9icmVnMTogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnMSI7CisgIGNhc2UgRFdfT1BfYnJlZzI6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzIiOworICBjYXNlIERXX09QX2JyZWczOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWczIjsKKyAgY2FzZSBEV19PUF9icmVnNDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnNCI7CisgIGNhc2UgRFdfT1BfYnJlZzU6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzUiOworICBjYXNlIERXX09QX2JyZWc2OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWc2IjsKKyAgY2FzZSBEV19PUF9icmVnNzogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnNyI7CisgIGNhc2UgRFdfT1BfYnJlZzg6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzgiOworICBjYXNlIERXX09QX2JyZWc5OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWc5IjsKKyAgY2FzZSBEV19PUF9icmVnMTA6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnMTAiOworICBjYXNlIERXX09QX2JyZWcxMTogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWcxMSI7CisgIGNhc2UgRFdfT1BfYnJlZzEyOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzEyIjsKKyAgY2FzZSBEV19PUF9icmVnMTM6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnMTMiOworICBjYXNlIERXX09QX2JyZWcxNDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWcxNCI7CisgIGNhc2UgRFdfT1BfYnJlZzE1OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzE1IjsKKyAgY2FzZSBEV19PUF9icmVnMTY6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnMTYiOworICBjYXNlIERXX09QX2JyZWcxNzogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWcxNyI7CisgIGNhc2UgRFdfT1BfYnJlZzE4OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzE4IjsKKyAgY2FzZSBEV19PUF9icmVnMTk6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnMTkiOworICBjYXNlIERXX09QX2JyZWcyMDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWcyMCI7CisgIGNhc2UgRFdfT1BfYnJlZzIxOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzIxIjsKKyAgY2FzZSBEV19PUF9icmVnMjI6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnMjIiOworICBjYXNlIERXX09QX2JyZWcyMzogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWcyMyI7CisgIGNhc2UgRFdfT1BfYnJlZzI0OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzI0IjsKKyAgY2FzZSBEV19PUF9icmVnMjU6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnMjUiOworICBjYXNlIERXX09QX2JyZWcyNjogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWcyNiI7CisgIGNhc2UgRFdfT1BfYnJlZzI3OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzI3IjsKKyAgY2FzZSBEV19PUF9icmVnMjg6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnMjgiOworICBjYXNlIERXX09QX2JyZWcyOTogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2JyZWcyOSI7CisgIGNhc2UgRFdfT1BfYnJlZzMwOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfYnJlZzMwIjsKKyAgY2FzZSBEV19PUF9icmVnMzE6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVnMzEiOworICBjYXNlIERXX09QX3JlZ3g6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3JlZ3giOworICBjYXNlIERXX09QX2ZicmVnOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2ZicmVnIjsKKyAgY2FzZSBEV19PUF9icmVneDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9icmVneCI7CisgIGNhc2UgRFdfT1BfcGllY2U6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfcGllY2UiOworICBjYXNlIERXX09QX2RlcmVmX3NpemU6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2RlcmVmX3NpemUiOworICBjYXNlIERXX09QX3hkZXJlZl9zaXplOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX3hkZXJlZl9zaXplIjsKKyAgY2FzZSBEV19PUF9ub3A6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9ub3AiOworICBjYXNlIERXX09QX3B1c2hfb2JqZWN0X2FkZHJlc3M6ICAgICAgICByZXR1cm4gIkRXX09QX3B1c2hfb2JqZWN0X2FkZHJlc3MiOworICBjYXNlIERXX09QX2NhbGwyOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2NhbGwyIjsKKyAgY2FzZSBEV19PUF9jYWxsNDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9jYWxsNCI7CisgIGNhc2UgRFdfT1BfY2FsbF9yZWY6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfT1BfY2FsbF9yZWYiOworICBjYXNlIERXX09QX2Zvcm1fdGxzX2FkZHJlc3M6ICAgICAgICAgICByZXR1cm4gIkRXX09QX2Zvcm1fdGxzX2FkZHJlc3MiOworICBjYXNlIERXX09QX2NhbGxfZnJhbWVfY2ZhOiAgICAgICAgICAgICByZXR1cm4gIkRXX09QX2NhbGxfZnJhbWVfY2ZhIjsKKyAgY2FzZSBEV19PUF9sb191c2VyOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9sb191c2VyIjsKKyAgY2FzZSBEV19PUF9oaV91c2VyOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19PUF9oaV91c2VyIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIEF0dHJpYnV0ZUVuY29kaW5nU3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCisvLy8gZW5jb2RpbmcuCitjb25zdCBjaGFyICpsbHZtOjpkd2FyZjo6QXR0cmlidXRlRW5jb2RpbmdTdHJpbmcodW5zaWduZWQgRW5jb2RpbmcpIHsKKyAgc3dpdGNoIChFbmNvZGluZykgeworICBjYXNlIERXX0FURV9hZGRyZXNzOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FURV9hZGRyZXNzIjsKKyAgY2FzZSBEV19BVEVfYm9vbGVhbjogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVEVfYm9vbGVhbiI7CisgIGNhc2UgRFdfQVRFX2NvbXBsZXhfZmxvYXQ6ICAgICAgICAgICAgIHJldHVybiAiRFdfQVRFX2NvbXBsZXhfZmxvYXQiOworICBjYXNlIERXX0FURV9mbG9hdDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FURV9mbG9hdCI7CisgIGNhc2UgRFdfQVRFX3NpZ25lZDogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRFX3NpZ25lZCI7CisgIGNhc2UgRFdfQVRFX3NpZ25lZF9jaGFyOiAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRFX3NpZ25lZF9jaGFyIjsKKyAgY2FzZSBEV19BVEVfdW5zaWduZWQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19BVEVfdW5zaWduZWQiOworICBjYXNlIERXX0FURV91bnNpZ25lZF9jaGFyOiAgICAgICAgICAgICByZXR1cm4gIkRXX0FURV91bnNpZ25lZF9jaGFyIjsKKyAgY2FzZSBEV19BVEVfaW1hZ2luYXJ5X2Zsb2F0OiAgICAgICAgICAgcmV0dXJuICJEV19BVEVfaW1hZ2luYXJ5X2Zsb2F0IjsKKyAgY2FzZSBEV19BVEVfcGFja2VkX2RlY2ltYWw6ICAgICAgICAgICAgcmV0dXJuICJEV19BVEVfcGFja2VkX2RlY2ltYWwiOworICBjYXNlIERXX0FURV9udW1lcmljX3N0cmluZzogICAgICAgICAgICByZXR1cm4gIkRXX0FURV9udW1lcmljX3N0cmluZyI7CisgIGNhc2UgRFdfQVRFX2VkaXRlZDogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRFX2VkaXRlZCI7CisgIGNhc2UgRFdfQVRFX3NpZ25lZF9maXhlZDogICAgICAgICAgICAgIHJldHVybiAiRFdfQVRFX3NpZ25lZF9maXhlZCI7CisgIGNhc2UgRFdfQVRFX3Vuc2lnbmVkX2ZpeGVkOiAgICAgICAgICAgIHJldHVybiAiRFdfQVRFX3Vuc2lnbmVkX2ZpeGVkIjsKKyAgY2FzZSBEV19BVEVfZGVjaW1hbF9mbG9hdDogICAgICAgICAgICAgcmV0dXJuICJEV19BVEVfZGVjaW1hbF9mbG9hdCI7CisgIGNhc2UgRFdfQVRFX2xvX3VzZXI6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQVRFX2xvX3VzZXIiOworICBjYXNlIERXX0FURV9oaV91c2VyOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FURV9oaV91c2VyIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIERlY2ltYWxTaWduU3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgZGVjaW1hbCBzaWduCisvLy8gYXR0cmlidXRlLgorY29uc3QgY2hhciAqbGx2bTo6ZHdhcmY6OkRlY2ltYWxTaWduU3RyaW5nKHVuc2lnbmVkIFNpZ24pIHsKKyAgc3dpdGNoIChTaWduKSB7CisgIGNhc2UgRFdfRFNfdW5zaWduZWQ6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRFNfdW5zaWduZWQiOworICBjYXNlIERXX0RTX2xlYWRpbmdfb3ZlcnB1bmNoOiAgICAgICAgICByZXR1cm4gIkRXX0RTX2xlYWRpbmdfb3ZlcnB1bmNoIjsKKyAgY2FzZSBEV19EU190cmFpbGluZ19vdmVycHVuY2g6ICAgICAgICAgcmV0dXJuICJEV19EU190cmFpbGluZ19vdmVycHVuY2giOworICBjYXNlIERXX0RTX2xlYWRpbmdfc2VwYXJhdGU6ICAgICAgICAgICByZXR1cm4gIkRXX0RTX2xlYWRpbmdfc2VwYXJhdGUiOworICBjYXNlIERXX0RTX3RyYWlsaW5nX3NlcGFyYXRlOiAgICAgICAgICByZXR1cm4gIkRXX0RTX3RyYWlsaW5nX3NlcGFyYXRlIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIEVuZGlhbml0eVN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGVuZGlhbml0eS4KKy8vLworY29uc3QgY2hhciAqbGx2bTo6ZHdhcmY6OkVuZGlhbml0eVN0cmluZyh1bnNpZ25lZCBFbmRpYW4pIHsKKyAgc3dpdGNoIChFbmRpYW4pIHsKKyAgY2FzZSBEV19FTkRfZGVmYXVsdDogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19FTkRfZGVmYXVsdCI7CisgIGNhc2UgRFdfRU5EX2JpZzogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRU5EX2JpZyI7CisgIGNhc2UgRFdfRU5EX2xpdHRsZTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRU5EX2xpdHRsZSI7CisgIGNhc2UgRFdfRU5EX2xvX3VzZXI6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRU5EX2xvX3VzZXIiOworICBjYXNlIERXX0VORF9oaV91c2VyOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0VORF9oaV91c2VyIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIEFjY2Vzc2liaWxpdHlTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBhY2Nlc3NpYmlsaXR5LgorLy8vCitjb25zdCBjaGFyICpsbHZtOjpkd2FyZjo6QWNjZXNzaWJpbGl0eVN0cmluZyh1bnNpZ25lZCBBY2Nlc3MpIHsKKyAgc3dpdGNoIChBY2Nlc3MpIHsKKyAgLy8gQWNjZXNzaWJpbGl0eSBjb2RlcworICBjYXNlIERXX0FDQ0VTU19wdWJsaWM6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FDQ0VTU19wdWJsaWMiOworICBjYXNlIERXX0FDQ0VTU19wcm90ZWN0ZWQ6ICAgICAgICAgICAgICByZXR1cm4gIkRXX0FDQ0VTU19wcm90ZWN0ZWQiOworICBjYXNlIERXX0FDQ0VTU19wcml2YXRlOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0FDQ0VTU19wcml2YXRlIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIFZpc2liaWxpdHlTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCB2aXNpYmlsaXR5LgorLy8vCitjb25zdCBjaGFyICpsbHZtOjpkd2FyZjo6VmlzaWJpbGl0eVN0cmluZyh1bnNpZ25lZCBWaXNpYmlsaXR5KSB7CisgIHN3aXRjaCAoVmlzaWJpbGl0eSkgeworICBjYXNlIERXX1ZJU19sb2NhbDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX1ZJU19sb2NhbCI7CisgIGNhc2UgRFdfVklTX2V4cG9ydGVkOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfVklTX2V4cG9ydGVkIjsKKyAgY2FzZSBEV19WSVNfcXVhbGlmaWVkOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19WSVNfcXVhbGlmaWVkIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIFZpcnR1YWxpdHlTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCB2aXJ0dWFsaXR5LgorLy8vCitjb25zdCBjaGFyICpsbHZtOjpkd2FyZjo6VmlydHVhbGl0eVN0cmluZyh1bnNpZ25lZCBWaXJ0dWFsaXR5KSB7CisgIHN3aXRjaCAoVmlydHVhbGl0eSkgeworICBjYXNlIERXX1ZJUlRVQUxJVFlfbm9uZTogICAgICAgICAgICAgICByZXR1cm4gIkRXX1ZJUlRVQUxJVFlfbm9uZSI7CisgIGNhc2UgRFdfVklSVFVBTElUWV92aXJ0dWFsOiAgICAgICAgICAgIHJldHVybiAiRFdfVklSVFVBTElUWV92aXJ0dWFsIjsKKyAgY2FzZSBEV19WSVJUVUFMSVRZX3B1cmVfdmlydHVhbDogICAgICAgcmV0dXJuICJEV19WSVJUVUFMSVRZX3B1cmVfdmlydHVhbCI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBMYW5ndWFnZVN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLgorLy8vCitjb25zdCBjaGFyICpsbHZtOjpkd2FyZjo6TGFuZ3VhZ2VTdHJpbmcodW5zaWduZWQgTGFuZ3VhZ2UpIHsKKyAgc3dpdGNoIChMYW5ndWFnZSkgeworICBjYXNlIERXX0xBTkdfQzg5OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfQzg5IjsKKyAgY2FzZSBEV19MQU5HX0M6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19MQU5HX0MiOworICBjYXNlIERXX0xBTkdfQWRhODM6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfQWRhODMiOworICBjYXNlIERXX0xBTkdfQ19wbHVzX3BsdXM6ICAgICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfQ19wbHVzX3BsdXMiOworICBjYXNlIERXX0xBTkdfQ29ib2w3NDogICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfQ29ib2w3NCI7CisgIGNhc2UgRFdfTEFOR19Db2JvbDg1OiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfTEFOR19Db2JvbDg1IjsKKyAgY2FzZSBEV19MQU5HX0ZvcnRyYW43NzogICAgICAgICAgICAgICAgcmV0dXJuICJEV19MQU5HX0ZvcnRyYW43NyI7CisgIGNhc2UgRFdfTEFOR19Gb3J0cmFuOTA6ICAgICAgICAgICAgICAgIHJldHVybiAiRFdfTEFOR19Gb3J0cmFuOTAiOworICBjYXNlIERXX0xBTkdfUGFzY2FsODM6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfUGFzY2FsODMiOworICBjYXNlIERXX0xBTkdfTW9kdWxhMjogICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfTW9kdWxhMiI7CisgIGNhc2UgRFdfTEFOR19KYXZhOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfTEFOR19KYXZhIjsKKyAgY2FzZSBEV19MQU5HX0M5OTogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19MQU5HX0M5OSI7CisgIGNhc2UgRFdfTEFOR19BZGE5NTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfTEFOR19BZGE5NSI7CisgIGNhc2UgRFdfTEFOR19Gb3J0cmFuOTU6ICAgICAgICAgICAgICAgIHJldHVybiAiRFdfTEFOR19Gb3J0cmFuOTUiOworICBjYXNlIERXX0xBTkdfUExJOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfUExJIjsKKyAgY2FzZSBEV19MQU5HX09iakM6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19MQU5HX09iakMiOworICBjYXNlIERXX0xBTkdfT2JqQ19wbHVzX3BsdXM6ICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfT2JqQ19wbHVzX3BsdXMiOworICBjYXNlIERXX0xBTkdfVVBDOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfVVBDIjsKKyAgY2FzZSBEV19MQU5HX0Q6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19MQU5HX0QiOworICBjYXNlIERXX0xBTkdfbG9fdXNlcjogICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xBTkdfbG9fdXNlciI7CisgIGNhc2UgRFdfTEFOR19oaV91c2VyOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfTEFOR19oaV91c2VyIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIENhc2VTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyIGNhc2UuCisvLy8KK2NvbnN0IGNoYXIgKmxsdm06OmR3YXJmOjpDYXNlU3RyaW5nKHVuc2lnbmVkIENhc2UpIHsKKyAgc3dpdGNoIChDYXNlKSB7CisgIGNhc2UgRFdfSURfY2FzZV9zZW5zaXRpdmU6ICAgICAgICAgICAgIHJldHVybiAiRFdfSURfY2FzZV9zZW5zaXRpdmUiOworICBjYXNlIERXX0lEX3VwX2Nhc2U6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0lEX3VwX2Nhc2UiOworICBjYXNlIERXX0lEX2Rvd25fY2FzZTogICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0lEX2Rvd25fY2FzZSI7CisgIGNhc2UgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZTogICAgICAgICAgIHJldHVybiAiRFdfSURfY2FzZV9pbnNlbnNpdGl2ZSI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBDb252ZW50aW9uU3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgY2FsbGluZyBjb252ZW50aW9uLgorLy8vCitjb25zdCBjaGFyICpsbHZtOjpkd2FyZjo6Q29udmVudGlvblN0cmluZyh1bnNpZ25lZCBDb252ZW50aW9uKSB7CisgICBzd2l0Y2ggKENvbnZlbnRpb24pIHsKKyAgIGNhc2UgRFdfQ0Nfbm9ybWFsOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQ0Nfbm9ybWFsIjsKKyAgIGNhc2UgRFdfQ0NfcHJvZ3JhbTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQ0NfcHJvZ3JhbSI7CisgICBjYXNlIERXX0NDX25vY2FsbDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0NDX25vY2FsbCI7CisgICBjYXNlIERXX0NDX2xvX3VzZXI6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0NDX2xvX3VzZXIiOworICAgY2FzZSBEV19DQ19oaV91c2VyOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19DQ19oaV91c2VyIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIElubGluZUNvZGVTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBpbmxpbmUgY29kZS4KKy8vLworY29uc3QgY2hhciAqbGx2bTo6ZHdhcmY6OklubGluZUNvZGVTdHJpbmcodW5zaWduZWQgQ29kZSkgeworICBzd2l0Y2ggKENvZGUpIHsKKyAgY2FzZSBEV19JTkxfbm90X2lubGluZWQ6ICAgICAgICAgICAgICAgcmV0dXJuICJEV19JTkxfbm90X2lubGluZWQiOworICBjYXNlIERXX0lOTF9pbmxpbmVkOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0lOTF9pbmxpbmVkIjsKKyAgY2FzZSBEV19JTkxfZGVjbGFyZWRfbm90X2lubGluZWQ6ICAgICAgcmV0dXJuICJEV19JTkxfZGVjbGFyZWRfbm90X2lubGluZWQiOworICBjYXNlIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkOiAgICAgICAgICByZXR1cm4gIkRXX0lOTF9kZWNsYXJlZF9pbmxpbmVkIjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIEFycmF5T3JkZXJTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSBvcmRlci4KKy8vLworY29uc3QgY2hhciAqbGx2bTo6ZHdhcmY6OkFycmF5T3JkZXJTdHJpbmcodW5zaWduZWQgT3JkZXIpIHsKKyAgc3dpdGNoIChPcmRlcikgeworICBjYXNlIERXX09SRF9yb3dfbWFqb3I6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09SRF9yb3dfbWFqb3IiOworICBjYXNlIERXX09SRF9jb2xfbWFqb3I6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRXX09SRF9jb2xfbWFqb3IiOworICB9CisgIHJldHVybiAwOworfQorCisvLy8gRGlzY3JpbWluYW50U3RyaW5nIC0gUmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgZGlzY3JpbWluYW50CisvLy8gZGVzY3JpcHRvci4KK2NvbnN0IGNoYXIgKmxsdm06OmR3YXJmOjpEaXNjcmltaW5hbnRTdHJpbmcodW5zaWduZWQgRGlzY3JpbWluYW50KSB7CisgIHN3aXRjaCAoRGlzY3JpbWluYW50KSB7CisgIGNhc2UgRFdfRFNDX2xhYmVsOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfRFNDX2xhYmVsIjsKKyAgY2FzZSBEV19EU0NfcmFuZ2U6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19EU0NfcmFuZ2UiOworICB9CisgIHJldHVybiAwOworfQorCisvLy8gTE5TdGFuZGFyZFN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGxpbmUgbnVtYmVyIHN0YW5kYXJkLgorLy8vCitjb25zdCBjaGFyICpsbHZtOjpkd2FyZjo6TE5TdGFuZGFyZFN0cmluZyh1bnNpZ25lZCBTdGFuZGFyZCkgeworICBzd2l0Y2ggKFN0YW5kYXJkKSB7CisgIGNhc2UgRFdfTE5TX2NvcHk6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfTE5TX2NvcHkiOworICBjYXNlIERXX0xOU19hZHZhbmNlX3BjOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xOU19hZHZhbmNlX3BjIjsKKyAgY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOiAgICAgICAgICAgICAgcmV0dXJuICJEV19MTlNfYWR2YW5jZV9saW5lIjsKKyAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19MTlNfc2V0X2ZpbGUiOworICBjYXNlIERXX0xOU19zZXRfY29sdW1uOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0xOU19zZXRfY29sdW1uIjsKKyAgY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6ICAgICAgICAgICAgICAgcmV0dXJuICJEV19MTlNfbmVnYXRlX3N0bXQiOworICBjYXNlIERXX0xOU19zZXRfYmFzaWNfYmxvY2s6ICAgICAgICAgICByZXR1cm4gIkRXX0xOU19zZXRfYmFzaWNfYmxvY2siOworICBjYXNlIERXX0xOU19jb25zdF9hZGRfcGM6ICAgICAgICAgICAgICByZXR1cm4gIkRXX0xOU19jb25zdF9hZGRfcGMiOworICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOiAgICAgICAgICByZXR1cm4gIkRXX0xOU19maXhlZF9hZHZhbmNlX3BjIjsKKyAgY2FzZSBEV19MTlNfc2V0X3Byb2xvZ3VlX2VuZDogICAgICAgICAgcmV0dXJuICJEV19MTlNfc2V0X3Byb2xvZ3VlX2VuZCI7CisgIGNhc2UgRFdfTE5TX3NldF9lcGlsb2d1ZV9iZWdpbjogICAgICAgIHJldHVybiAiRFdfTE5TX3NldF9lcGlsb2d1ZV9iZWdpbiI7CisgIGNhc2UgRFdfTE5TX3NldF9pc2E6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfTE5TX3NldF9pc2EiOworICB9CisgIHJldHVybiAwOworfQorCisvLy8gTE5FeHRlbmRlZFN0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGxpbmUgbnVtYmVyIGV4dGVuZGVkCisvLy8gb3Bjb2RlIGVuY29kaW5ncy4KK2NvbnN0IGNoYXIgKmxsdm06OmR3YXJmOjpMTkV4dGVuZGVkU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKSB7CisgIHN3aXRjaCAoRW5jb2RpbmcpIHsKKyAgLy8gTGluZSBOdW1iZXIgRXh0ZW5kZWQgT3Bjb2RlIEVuY29kaW5ncworICBjYXNlIERXX0xORV9lbmRfc2VxdWVuY2U6ICAgICAgICAgICAgICByZXR1cm4gIkRXX0xORV9lbmRfc2VxdWVuY2UiOworICBjYXNlIERXX0xORV9zZXRfYWRkcmVzczogICAgICAgICAgICAgICByZXR1cm4gIkRXX0xORV9zZXRfYWRkcmVzcyI7CisgIGNhc2UgRFdfTE5FX2RlZmluZV9maWxlOiAgICAgICAgICAgICAgIHJldHVybiAiRFdfTE5FX2RlZmluZV9maWxlIjsKKyAgY2FzZSBEV19MTkVfbG9fdXNlcjogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19MTkVfbG9fdXNlciI7CisgIGNhc2UgRFdfTE5FX2hpX3VzZXI6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfTE5FX2hpX3VzZXIiOworICB9CisgIHJldHVybiAwOworfQorCisvLy8gTWFjaW5mb1N0cmluZyAtIFJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIG1hY2luZm8gdHlwZSBlbmNvZGluZ3MuCisvLy8KK2NvbnN0IGNoYXIgKmxsdm06OmR3YXJmOjpNYWNpbmZvU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKSB7CisgIHN3aXRjaCAoRW5jb2RpbmcpIHsKKyAgLy8gTWFjaW5mbyBUeXBlIEVuY29kaW5ncworICBjYXNlIERXX01BQ0lORk9fZGVmaW5lOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX01BQ0lORk9fZGVmaW5lIjsKKyAgY2FzZSBEV19NQUNJTkZPX3VuZGVmOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19NQUNJTkZPX3VuZGVmIjsKKyAgY2FzZSBEV19NQUNJTkZPX3N0YXJ0X2ZpbGU6ICAgICAgICAgICAgcmV0dXJuICJEV19NQUNJTkZPX3N0YXJ0X2ZpbGUiOworICBjYXNlIERXX01BQ0lORk9fZW5kX2ZpbGU6ICAgICAgICAgICAgICByZXR1cm4gIkRXX01BQ0lORk9fZW5kX2ZpbGUiOworICBjYXNlIERXX01BQ0lORk9fdmVuZG9yX2V4dDogICAgICAgICAgICByZXR1cm4gIkRXX01BQ0lORk9fdmVuZG9yX2V4dCI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBDYWxsRnJhbWVTdHJpbmcgLSBSZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBjYWxsIGZyYW1lIGluc3RydWN0aW9uCisvLy8gZW5jb2RpbmdzLgorY29uc3QgY2hhciAqbGx2bTo6ZHdhcmY6OkNhbGxGcmFtZVN0cmluZyh1bnNpZ25lZCBFbmNvZGluZykgeworICBzd2l0Y2ggKEVuY29kaW5nKSB7CisgIGNhc2UgRFdfQ0ZBX2FkdmFuY2VfbG9jOiAgICAgICAgICAgICAgIHJldHVybiAiRFdfQ0ZBX2FkdmFuY2VfbG9jIjsKKyAgY2FzZSBEV19DRkFfb2Zmc2V0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19DRkFfb2Zmc2V0IjsKKyAgY2FzZSBEV19DRkFfcmVzdG9yZTogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19DRkFfcmVzdG9yZSI7CisgIGNhc2UgRFdfQ0ZBX3NldF9sb2M6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQ0ZBX3NldF9sb2MiOworICBjYXNlIERXX0NGQV9hZHZhbmNlX2xvYzE6ICAgICAgICAgICAgICByZXR1cm4gIkRXX0NGQV9hZHZhbmNlX2xvYzEiOworICBjYXNlIERXX0NGQV9hZHZhbmNlX2xvYzI6ICAgICAgICAgICAgICByZXR1cm4gIkRXX0NGQV9hZHZhbmNlX2xvYzIiOworICBjYXNlIERXX0NGQV9hZHZhbmNlX2xvYzQ6ICAgICAgICAgICAgICByZXR1cm4gIkRXX0NGQV9hZHZhbmNlX2xvYzQiOworICBjYXNlIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQ6ICAgICAgICAgICByZXR1cm4gIkRXX0NGQV9vZmZzZXRfZXh0ZW5kZWQiOworICBjYXNlIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkOiAgICAgICAgICByZXR1cm4gIkRXX0NGQV9yZXN0b3JlX2V4dGVuZGVkIjsKKyAgY2FzZSBEV19DRkFfdW5kZWZpbmVkOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19DRkFfdW5kZWZpbmVkIjsKKyAgY2FzZSBEV19DRkFfc2FtZV92YWx1ZTogICAgICAgICAgICAgICAgcmV0dXJuICJEV19DRkFfc2FtZV92YWx1ZSI7CisgIGNhc2UgRFdfQ0ZBX3JlZ2lzdGVyOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQ0ZBX3JlZ2lzdGVyIjsKKyAgY2FzZSBEV19DRkFfcmVtZW1iZXJfc3RhdGU6ICAgICAgICAgICAgcmV0dXJuICJEV19DRkFfcmVtZW1iZXJfc3RhdGUiOworICBjYXNlIERXX0NGQV9yZXN0b3JlX3N0YXRlOiAgICAgICAgICAgICByZXR1cm4gIkRXX0NGQV9yZXN0b3JlX3N0YXRlIjsKKyAgY2FzZSBEV19DRkFfZGVmX2NmYTogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19DRkFfZGVmX2NmYSI7CisgIGNhc2UgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXI6ICAgICAgICAgIHJldHVybiAiRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIiOworICBjYXNlIERXX0NGQV9kZWZfY2ZhX29mZnNldDogICAgICAgICAgICByZXR1cm4gIkRXX0NGQV9kZWZfY2ZhX29mZnNldCI7CisgIGNhc2UgRFdfQ0ZBX2RlZl9jZmFfZXhwcmVzc2lvbjogICAgICAgIHJldHVybiAiRFdfQ0ZBX2RlZl9jZmFfZXhwcmVzc2lvbiI7CisgIGNhc2UgRFdfQ0ZBX2V4cHJlc3Npb246ICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQ0ZBX2V4cHJlc3Npb24iOworICBjYXNlIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2Y6ICAgICAgICByZXR1cm4gIkRXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YiOworICBjYXNlIERXX0NGQV9kZWZfY2ZhX3NmOiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0NGQV9kZWZfY2ZhX3NmIjsKKyAgY2FzZSBEV19DRkFfZGVmX2NmYV9vZmZzZXRfc2Y6ICAgICAgICAgcmV0dXJuICJEV19DRkFfZGVmX2NmYV9vZmZzZXRfc2YiOworICBjYXNlIERXX0NGQV92YWxfb2Zmc2V0OiAgICAgICAgICAgICAgICByZXR1cm4gIkRXX0NGQV92YWxfb2Zmc2V0IjsKKyAgY2FzZSBEV19DRkFfdmFsX29mZnNldF9zZjogICAgICAgICAgICAgcmV0dXJuICJEV19DRkFfdmFsX29mZnNldF9zZiI7CisgIGNhc2UgRFdfQ0ZBX3ZhbF9leHByZXNzaW9uOiAgICAgICAgICAgIHJldHVybiAiRFdfQ0ZBX3ZhbF9leHByZXNzaW9uIjsKKyAgY2FzZSBEV19DRkFfbG9fdXNlcjogICAgICAgICAgICAgICAgICAgcmV0dXJuICJEV19DRkFfbG9fdXNlciI7CisgIGNhc2UgRFdfQ0ZBX2hpX3VzZXI6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiRFdfQ0ZBX2hpX3VzZXIiOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9FcnJvckhhbmRsaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTdjYTlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5jcHAKQEAgLTAsMCArMSw3NyBAQAorLy89PT0tIGxpYi9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuY3BwIC0gQ2FsbGJhY2tzIGZvciBlcnJvcnMgLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBBUEkgdXNlZCB0byBpbmRpY2F0ZSBmYXRhbCBlcnJvciBjb25kaXRpb25zLiAgTm9uLWZhdGFsCisvLyBlcnJvcnMgKG1vc3Qgb2YgdGhlbSkgc2hvdWxkIGJlIGhhbmRsZWQgdGhyb3VnaCBMTFZNQ29udGV4dC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1NpZ25hbHMuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaHJlYWRpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRsaWI+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3N0YXRpYyBmYXRhbF9lcnJvcl9oYW5kbGVyX3QgRXJyb3JIYW5kbGVyID0gMDsKK3N0YXRpYyB2b2lkICpFcnJvckhhbmRsZXJVc2VyRGF0YSA9IDA7CisKK3ZvaWQgbGx2bTo6aW5zdGFsbF9mYXRhbF9lcnJvcl9oYW5kbGVyKGZhdGFsX2Vycm9yX2hhbmRsZXJfdCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGFzc2VydCghbGx2bV9pc19tdWx0aXRocmVhZGVkKCkgJiYKKyAgICAgICAgICJDYW5ub3QgcmVnaXN0ZXIgZXJyb3IgaGFuZGxlcnMgYWZ0ZXIgc3RhcnRpbmcgbXVsdGl0aHJlYWRlZCBtb2RlIVxuIik7CisgIGFzc2VydCghRXJyb3JIYW5kbGVyICYmICJFcnJvciBoYW5kbGVyIGFscmVhZHkgcmVnaXN0ZXJlZCFcbiIpOworICBFcnJvckhhbmRsZXIgPSBoYW5kbGVyOworICBFcnJvckhhbmRsZXJVc2VyRGF0YSA9IHVzZXJfZGF0YTsKK30KKwordm9pZCBsbHZtOjpyZW1vdmVfZmF0YWxfZXJyb3JfaGFuZGxlcigpIHsKKyAgRXJyb3JIYW5kbGVyID0gMDsKK30KKwordm9pZCBsbHZtOjpyZXBvcnRfZmF0YWxfZXJyb3IoY29uc3QgY2hhciAqcmVhc29uKSB7CisgIHJlcG9ydF9mYXRhbF9lcnJvcihUd2luZShyZWFzb24pKTsKK30KKwordm9pZCBsbHZtOjpyZXBvcnRfZmF0YWxfZXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbikgeworICByZXBvcnRfZmF0YWxfZXJyb3IoVHdpbmUocmVhc29uKSk7Cit9CisKK3ZvaWQgbGx2bTo6cmVwb3J0X2ZhdGFsX2Vycm9yKGNvbnN0IFR3aW5lICZyZWFzb24pIHsKKyAgaWYgKCFFcnJvckhhbmRsZXIpIHsKKyAgICBlcnJzKCkgPDwgIkxMVk0gRVJST1I6ICIgPDwgcmVhc29uIDw8ICJcbiI7CisgIH0gZWxzZSB7CisgICAgRXJyb3JIYW5kbGVyKEVycm9ySGFuZGxlclVzZXJEYXRhLCByZWFzb24uc3RyKCkpOworICB9CisKKyAgLy8gSWYgd2UgcmVhY2hlZCBoZXJlLCB3ZSBhcmUgZmFpbGluZyB1bmdyYWNlZnVsbHkuIFJ1biB0aGUgaW50ZXJydXB0IGhhbmRsZXJzCisgIC8vIHRvIG1ha2Ugc3VyZSBhbnkgc3BlY2lhbCBjbGVhbnVwcyBnZXQgZG9uZSwgaW4gcGFydGljdWxhciB0aGF0IHdlIHJlbW92ZQorICAvLyBmaWxlcyByZWdpc3RlcmVkIHdpdGggUmVtb3ZlRmlsZU9uU2lnbmFsLgorICBzeXM6OlJ1bkludGVycnVwdEhhbmRsZXJzKCk7CisKKyAgZXhpdCgxKTsKK30KKwordm9pZCBsbHZtOjpsbHZtX3VucmVhY2hhYmxlX2ludGVybmFsKGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5lKSB7CisgIC8vIFRoaXMgY29kZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2FsbCB0aGUgRXJyb3JIYW5kbGVyIGNhbGxiYWNrLCBiZWNhdXNlCisgIC8vIGxsdm1fdW5yZWFjaGFibGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBpbmRpY2F0ZSAiaW1wb3NzaWJsZSIKKyAgLy8gc2l0dWF0aW9ucywgYW5kIG5vdCBsZWdpdGltYXRlIHJ1bnRpbWUgZXJyb3JzLgorICBpZiAobXNnKQorICAgIGRiZ3MoKSA8PCBtc2cgPDwgIlxuIjsKKyAgZGJncygpIDw8ICJVTlJFQUNIQUJMRSBleGVjdXRlZCI7CisgIGlmIChmaWxlKQorICAgIGRiZ3MoKSA8PCAiIGF0ICIgPDwgZmlsZSA8PCAiOiIgPDwgbGluZTsKKyAgZGJncygpIDw8ICIhXG4iOworICBhYm9ydCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvRm9sZGluZ1NldC5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9Gb2xkaW5nU2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGRjYTMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvRm9sZGluZ1NldC5jcHAKQEAgLTAsMCArMSwzODkgQEAKKy8vPT09LS0gU3VwcG9ydC9Gb2xkaW5nU2V0LmNwcCAtIFVuaXF1aW5nIEhhc2ggU2V0IC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBoYXNoIHNldCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBkdXBsaWNhdGlvbiBvZgorLy8gbm9kZXMgaW4gYSBncmFwaC4gIFRoaXMgY29kZSB3YXMgb3JpZ2luYWxseSBjcmVhdGVkIGJ5IENocmlzIExhdHRuZXIgZm9yIHVzZQorLy8gd2l0aCBTZWxlY3Rpb25EQUdDU0VNYXAsIGJ1dCB3YXMgaXNvbGF0ZWQgdG8gcHJvdmlkZSB1c2UgYWNyb3NzIHRoZSBsbHZtIGNvZGUKKy8vIHNldC4gCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRm9sZGluZ1NldE5vZGVJRCBJbXBsZW1lbnRhdGlvbgorCisvLy8gQWRkKiAtIEFkZCB2YXJpb3VzIGRhdGEgdHlwZXMgdG8gQml0IGRhdGEuCisvLy8KK3ZvaWQgRm9sZGluZ1NldE5vZGVJRDo6QWRkUG9pbnRlcihjb25zdCB2b2lkICpQdHIpIHsKKyAgLy8gTm90ZTogdGhpcyBhZGRzIHBvaW50ZXJzIHRvIHRoZSBoYXNoIHVzaW5nIHNpemVzIGFuZCBlbmRpYW5uZXNzIHRoYXQKKyAgLy8gZGVwZW5kIG9uIHRoZSBob3N0LiAgSXQgZG9lc24ndCBtYXR0ZXIgaG93ZXZlciwgYmVjYXVzZSBoYXNoaW5nIG9uCisgIC8vIHBvaW50ZXIgdmFsdWVzIGluIGluaGVyZW50bHkgdW5zdGFibGUuICBOb3RoaW5nICBzaG91bGQgZGVwZW5kIG9uIHRoZSAKKyAgLy8gb3JkZXJpbmcgb2Ygbm9kZXMgaW4gdGhlIGZvbGRpbmcgc2V0LgorICBpbnRwdHJfdCBQdHJJID0gKGludHB0cl90KVB0cjsKKyAgQml0cy5wdXNoX2JhY2sodW5zaWduZWQoUHRySSkpOworICBpZiAoc2l6ZW9mKGludHB0cl90KSA+IHNpemVvZih1bnNpZ25lZCkpCisgICAgQml0cy5wdXNoX2JhY2sodW5zaWduZWQodWludDY0X3QoUHRySSkgPj4gMzIpKTsKK30KK3ZvaWQgRm9sZGluZ1NldE5vZGVJRDo6QWRkSW50ZWdlcihzaWduZWQgSSkgeworICBCaXRzLnB1c2hfYmFjayhJKTsKK30KK3ZvaWQgRm9sZGluZ1NldE5vZGVJRDo6QWRkSW50ZWdlcih1bnNpZ25lZCBJKSB7CisgIEJpdHMucHVzaF9iYWNrKEkpOworfQordm9pZCBGb2xkaW5nU2V0Tm9kZUlEOjpBZGRJbnRlZ2VyKGxvbmcgSSkgeworICBBZGRJbnRlZ2VyKCh1bnNpZ25lZCBsb25nKUkpOworfQordm9pZCBGb2xkaW5nU2V0Tm9kZUlEOjpBZGRJbnRlZ2VyKHVuc2lnbmVkIGxvbmcgSSkgeworICBpZiAoc2l6ZW9mKGxvbmcpID09IHNpemVvZihpbnQpKQorICAgIEFkZEludGVnZXIodW5zaWduZWQoSSkpOworICBlbHNlIGlmIChzaXplb2YobG9uZykgPT0gc2l6ZW9mKGxvbmcgbG9uZykpIHsKKyAgICBBZGRJbnRlZ2VyKCh1bnNpZ25lZCBsb25nIGxvbmcpSSk7CisgIH0gZWxzZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgidW5leHBlY3RlZCBzaXplb2YobG9uZykiKTsKKyAgfQorfQordm9pZCBGb2xkaW5nU2V0Tm9kZUlEOjpBZGRJbnRlZ2VyKGxvbmcgbG9uZyBJKSB7CisgIEFkZEludGVnZXIoKHVuc2lnbmVkIGxvbmcgbG9uZylJKTsKK30KK3ZvaWQgRm9sZGluZ1NldE5vZGVJRDo6QWRkSW50ZWdlcih1bnNpZ25lZCBsb25nIGxvbmcgSSkgeworICBBZGRJbnRlZ2VyKHVuc2lnbmVkKEkpKTsKKyAgaWYgKCh1aW50NjRfdCkoaW50KUkgIT0gSSkKKyAgICBCaXRzLnB1c2hfYmFjayh1bnNpZ25lZChJID4+IDMyKSk7Cit9CisKK3ZvaWQgRm9sZGluZ1NldE5vZGVJRDo6QWRkU3RyaW5nKFN0cmluZ1JlZiBTdHJpbmcpIHsKKyAgdW5zaWduZWQgU2l6ZSA9ICBTdHJpbmcuc2l6ZSgpOworICBCaXRzLnB1c2hfYmFjayhTaXplKTsKKyAgaWYgKCFTaXplKSByZXR1cm47CisKKyAgdW5zaWduZWQgVW5pdHMgPSBTaXplIC8gNDsKKyAgdW5zaWduZWQgUG9zID0gMDsKKyAgY29uc3QgdW5zaWduZWQgKkJhc2UgPSAoY29uc3QgdW5zaWduZWQqKSBTdHJpbmcuZGF0YSgpOworICAKKyAgLy8gSWYgdGhlIHN0cmluZyBpcyBhbGlnbmVkIGRvIGEgYnVsayB0cmFuc2Zlci4KKyAgaWYgKCEoKGludHB0cl90KUJhc2UgJiAzKSkgeworICAgIEJpdHMuYXBwZW5kKEJhc2UsIEJhc2UgKyBVbml0cyk7CisgICAgUG9zID0gKFVuaXRzICsgMSkgKiA0OworICB9IGVsc2UgeworICAgIC8vIE90aGVyd2lzZSBkbyBpdCB0aGUgaGFyZCB3YXkuCisgICAgZm9yIChQb3MgKz0gNDsgUG9zIDw9IFNpemU7IFBvcyArPSA0KSB7CisgICAgICB1bnNpZ25lZCBWID0gKCh1bnNpZ25lZCBjaGFyKVN0cmluZ1tQb3MgLSA0XSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgY2hhcilTdHJpbmdbUG9zIC0gM10gPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIpU3RyaW5nW1BvcyAtIDJdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpU3RyaW5nW1BvcyAtIDFdOworICAgICAgQml0cy5wdXNoX2JhY2soVik7CisgICAgfQorICB9CisgIAorICAvLyBXaXRoIHRoZSBsZWZ0b3ZlciBiaXRzLgorICB1bnNpZ25lZCBWID0gMDsKKyAgLy8gUG9zIHdpbGwgaGF2ZSBvdmVyc2hvdCBzaXplIGJ5IDQgLSAjYnl0ZXMgbGVmdCBvdmVyLiAKKyAgc3dpdGNoIChQb3MgLSBTaXplKSB7CisgIGNhc2UgMTogViA9IChWIDw8IDgpIHwgKHVuc2lnbmVkIGNoYXIpU3RyaW5nW1NpemUgLSAzXTsgLy8gRmFsbCB0aHJ1LgorICBjYXNlIDI6IFYgPSAoViA8PCA4KSB8ICh1bnNpZ25lZCBjaGFyKVN0cmluZ1tTaXplIC0gMl07IC8vIEZhbGwgdGhydS4KKyAgY2FzZSAzOiBWID0gKFYgPDwgOCkgfCAodW5zaWduZWQgY2hhcilTdHJpbmdbU2l6ZSAtIDFdOyBicmVhazsKKyAgZGVmYXVsdDogcmV0dXJuOyAvLyBOb3RoaW5nIGxlZnQuCisgIH0KKworICBCaXRzLnB1c2hfYmFjayhWKTsKK30KKworLy8vIENvbXB1dGVIYXNoIC0gQ29tcHV0ZSBhIHN0cm9uZyBoYXNoIHZhbHVlIGZvciB0aGlzIEZvbGRpbmdTZXROb2RlSUQsIHVzZWQgdG8gCisvLy8gbG9va3VwIHRoZSBub2RlIGluIHRoZSBGb2xkaW5nU2V0SW1wbC4KK3Vuc2lnbmVkIEZvbGRpbmdTZXROb2RlSUQ6OkNvbXB1dGVIYXNoKCkgY29uc3QgeworICAvLyBUaGlzIGlzIGFkYXB0ZWQgZnJvbSBTdXBlckZhc3RIYXNoIGJ5IFBhdWwgSHNpZWguCisgIHVuc2lnbmVkIEhhc2ggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQml0cy5zaXplKCkpOworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpCUCA9ICZCaXRzWzBdLCAqRSA9IEJQK0JpdHMuc2l6ZSgpOyBCUCAhPSBFOyArK0JQKSB7CisgICAgdW5zaWduZWQgRGF0YSA9ICpCUDsKKyAgICBIYXNoICAgICAgICAgKz0gRGF0YSAmIDB4RkZGRjsKKyAgICB1bnNpZ25lZCBUbXAgID0gKChEYXRhID4+IDE2KSA8PCAxMSkgXiBIYXNoOworICAgIEhhc2ggICAgICAgICAgPSAoSGFzaCA8PCAxNikgXiBUbXA7CisgICAgSGFzaCAgICAgICAgICs9IEhhc2ggPj4gMTE7CisgIH0KKyAgCisgIC8vIEZvcmNlICJhdmFsYW5jaGluZyIgb2YgZmluYWwgMTI3IGJpdHMuCisgIEhhc2ggXj0gSGFzaCA8PCAzOworICBIYXNoICs9IEhhc2ggPj4gNTsKKyAgSGFzaCBePSBIYXNoIDw8IDQ7CisgIEhhc2ggKz0gSGFzaCA+PiAxNzsKKyAgSGFzaCBePSBIYXNoIDw8IDI1OworICBIYXNoICs9IEhhc2ggPj4gNjsKKyAgcmV0dXJuIEhhc2g7Cit9CisKKy8vLyBvcGVyYXRvcj09IC0gVXNlZCB0byBjb21wYXJlIHR3byBub2RlcyB0byBlYWNoIG90aGVyLgorLy8vCitib29sIEZvbGRpbmdTZXROb2RlSUQ6Om9wZXJhdG9yPT0oY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmUkhTKWNvbnN0eworICBpZiAoQml0cy5zaXplKCkgIT0gUkhTLkJpdHMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBtZW1jbXAoJkJpdHNbMF0sICZSSFMuQml0c1swXSwgQml0cy5zaXplKCkqc2l6ZW9mKEJpdHNbMF0pKSA9PSAwOworfQorCisvLy8gSW50ZXJuIC0gQ29weSB0aGlzIG5vZGUncyBkYXRhIHRvIGEgbWVtb3J5IHJlZ2lvbiBhbGxvY2F0ZWQgZnJvbSB0aGUKKy8vLyBnaXZlbiBhbGxvY2F0b3IgYW5kIHJldHVybiBhIEZvbGRpbmdTZXROb2RlSURSZWYgZGVzY3JpYmluZyB0aGUKKy8vLyBpbnRlcm5lZCBkYXRhLgorRm9sZGluZ1NldE5vZGVJRFJlZgorRm9sZGluZ1NldE5vZGVJRDo6SW50ZXJuKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcikgY29uc3QgeworICB1bnNpZ25lZCAqTmV3ID0gQWxsb2NhdG9yLkFsbG9jYXRlPHVuc2lnbmVkPihCaXRzLnNpemUoKSk7CisgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KEJpdHMuYmVnaW4oKSwgQml0cy5lbmQoKSwgTmV3KTsKKyAgcmV0dXJuIEZvbGRpbmdTZXROb2RlSURSZWYoTmV3LCBCaXRzLnNpemUoKSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgRm9sZGluZ1NldEltcGwuCisKKy8vLyBHZXROZXh0UHRyIC0gSW4gb3JkZXIgdG8gc2F2ZSBzcGFjZSwgZWFjaCBidWNrZXQgaXMgYQorLy8vIHNpbmdseS1saW5rZWQtbGlzdC4gSW4gb3JkZXIgdG8gbWFrZSBkZWxldGlvbiBtb3JlIGVmZmljaWVudCwgd2UgbWFrZQorLy8vIHRoZSBsaXN0IGNpcmN1bGFyLCBzbyB3ZSBjYW4gZGVsZXRlIGEgbm9kZSB3aXRob3V0IGNvbXB1dGluZyBpdHMgaGFzaC4KKy8vLyBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0aGUgc3RhcnQgb2YgdGhlIGhhc2ggYnVja2V0cyBhcmUgbm90CisvLy8gTm9kZXMuICBJZiBOZXh0SW5CdWNrZXRQdHIgaXMgYSBidWNrZXQgcG9pbnRlciwgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsOgorLy8vIHVzZSBHZXRCdWNrZXRQdHIgd2hlbiB0aGlzIGhhcHBlbnMuCitzdGF0aWMgRm9sZGluZ1NldEltcGw6Ok5vZGUgKkdldE5leHRQdHIodm9pZCAqTmV4dEluQnVja2V0UHRyKSB7CisgIC8vIFRoZSBsb3cgYml0IGlzIHNldCBpZiB0aGlzIGlzIHRoZSBwb2ludGVyIGJhY2sgdG8gdGhlIGJ1Y2tldC4KKyAgaWYgKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KE5leHRJbkJ1Y2tldFB0cikgJiAxKQorICAgIHJldHVybiAwOworICAKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEZvbGRpbmdTZXRJbXBsOjpOb2RlKj4oTmV4dEluQnVja2V0UHRyKTsKK30KKworCisvLy8gdGVzdGluZy4KK3N0YXRpYyB2b2lkICoqR2V0QnVja2V0UHRyKHZvaWQgKk5leHRJbkJ1Y2tldFB0cikgeworICBpbnRwdHJfdCBQdHIgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihOZXh0SW5CdWNrZXRQdHIpOworICBhc3NlcnQoKFB0ciAmIDEpICYmICJOb3QgYSBidWNrZXQgcG9pbnRlciIpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KFB0ciAmIH5pbnRwdHJfdCgxKSk7Cit9CisKKy8vLyBHZXRCdWNrZXRGb3IgLSBIYXNoIHRoZSBzcGVjaWZpZWQgbm9kZSBJRCBhbmQgcmV0dXJuIHRoZSBoYXNoIGJ1Y2tldCBmb3IKKy8vLyB0aGUgc3BlY2lmaWVkIElELgorc3RhdGljIHZvaWQgKipHZXRCdWNrZXRGb3IoY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqQnVja2V0cywgdW5zaWduZWQgTnVtQnVja2V0cykgeworICAvLyBOdW1CdWNrZXRzIGlzIGFsd2F5cyBhIHBvd2VyIG9mIDIuCisgIHVuc2lnbmVkIEJ1Y2tldE51bSA9IElELkNvbXB1dGVIYXNoKCkgJiAoTnVtQnVja2V0cy0xKTsKKyAgcmV0dXJuIEJ1Y2tldHMgKyBCdWNrZXROdW07Cit9CisKKy8vLyBBbGxvY2F0ZUJ1Y2tldHMgLSBBbGxvY2F0ZWQgaW5pdGlhbGl6ZWQgYnVja2V0IG1lbW9yeS4KK3N0YXRpYyB2b2lkICoqQWxsb2NhdGVCdWNrZXRzKHVuc2lnbmVkIE51bUJ1Y2tldHMpIHsKKyAgdm9pZCAqKkJ1Y2tldHMgPSBzdGF0aWNfY2FzdDx2b2lkKio+KGNhbGxvYyhOdW1CdWNrZXRzKzEsIHNpemVvZih2b2lkKikpKTsKKyAgLy8gU2V0IHRoZSB2ZXJ5IGxhc3QgYnVja2V0IHRvIGJlIGEgbm9uLW51bGwgInBvaW50ZXIiLgorICBCdWNrZXRzW051bUJ1Y2tldHNdID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oLTEpOworICByZXR1cm4gQnVja2V0czsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZvbGRpbmdTZXRJbXBsIEltcGxlbWVudGF0aW9uCisKK0ZvbGRpbmdTZXRJbXBsOjpGb2xkaW5nU2V0SW1wbCh1bnNpZ25lZCBMb2cySW5pdFNpemUpIHsKKyAgYXNzZXJ0KDUgPCBMb2cySW5pdFNpemUgJiYgTG9nMkluaXRTaXplIDwgMzIgJiYKKyAgICAgICAgICJJbml0aWFsIGhhc2ggdGFibGUgc2l6ZSBvdXQgb2YgcmFuZ2UiKTsKKyAgTnVtQnVja2V0cyA9IDEgPDwgTG9nMkluaXRTaXplOworICBCdWNrZXRzID0gQWxsb2NhdGVCdWNrZXRzKE51bUJ1Y2tldHMpOworICBOdW1Ob2RlcyA9IDA7Cit9CitGb2xkaW5nU2V0SW1wbDo6fkZvbGRpbmdTZXRJbXBsKCkgeworICBmcmVlKEJ1Y2tldHMpOworfQordm9pZCBGb2xkaW5nU2V0SW1wbDo6Y2xlYXIoKSB7CisgIC8vIFNldCBhbGwgYnV0IHRoZSBsYXN0IGJ1Y2tldCB0byBudWxsIHBvaW50ZXJzLgorICBtZW1zZXQoQnVja2V0cywgMCwgTnVtQnVja2V0cypzaXplb2Yodm9pZCopKTsKKworICAvLyBTZXQgdGhlIHZlcnkgbGFzdCBidWNrZXQgdG8gYmUgYSBub24tbnVsbCAicG9pbnRlciIuCisgIEJ1Y2tldHNbTnVtQnVja2V0c10gPSByZWludGVycHJldF9jYXN0PHZvaWQqPigtMSk7CisKKyAgLy8gUmVzZXQgdGhlIG5vZGUgY291bnQgdG8gemVyby4KKyAgTnVtTm9kZXMgPSAwOworfQorCisvLy8gR3Jvd0hhc2hUYWJsZSAtIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBhbmQgcmVoYXNoIGV2ZXJ5dGhpbmcuCisvLy8KK3ZvaWQgRm9sZGluZ1NldEltcGw6Okdyb3dIYXNoVGFibGUoKSB7CisgIHZvaWQgKipPbGRCdWNrZXRzID0gQnVja2V0czsKKyAgdW5zaWduZWQgT2xkTnVtQnVja2V0cyA9IE51bUJ1Y2tldHM7CisgIE51bUJ1Y2tldHMgPDw9IDE7CisgIAorICAvLyBDbGVhciBvdXQgbmV3IGJ1Y2tldHMuCisgIEJ1Y2tldHMgPSBBbGxvY2F0ZUJ1Y2tldHMoTnVtQnVja2V0cyk7CisgIE51bU5vZGVzID0gMDsKKworICAvLyBXYWxrIHRoZSBvbGQgYnVja2V0cywgcmVoYXNoaW5nIG5vZGVzIGludG8gdGhlaXIgbmV3IHBsYWNlLgorICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE9sZE51bUJ1Y2tldHM7ICsraSkgeworICAgIHZvaWQgKlByb2JlID0gT2xkQnVja2V0c1tpXTsKKyAgICBpZiAoIVByb2JlKSBjb250aW51ZTsKKyAgICB3aGlsZSAoTm9kZSAqTm9kZUluQnVja2V0ID0gR2V0TmV4dFB0cihQcm9iZSkpIHsKKyAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIG5leHQgbGluaywgcmVtb3ZlIE5vZGVJbkJ1Y2tldCBmcm9tIHRoZSBvbGQgbGluay4KKyAgICAgIFByb2JlID0gTm9kZUluQnVja2V0LT5nZXROZXh0SW5CdWNrZXQoKTsKKyAgICAgIE5vZGVJbkJ1Y2tldC0+U2V0TmV4dEluQnVja2V0KDApOworCisgICAgICAvLyBJbnNlcnQgdGhlIG5vZGUgaW50byB0aGUgbmV3IGJ1Y2tldCwgYWZ0ZXIgcmVjb21wdXRpbmcgdGhlIGhhc2guCisgICAgICBHZXROb2RlUHJvZmlsZShJRCwgTm9kZUluQnVja2V0KTsKKyAgICAgIEluc2VydE5vZGUoTm9kZUluQnVja2V0LCBHZXRCdWNrZXRGb3IoSUQsIEJ1Y2tldHMsIE51bUJ1Y2tldHMpKTsKKyAgICAgIElELmNsZWFyKCk7CisgICAgfQorICB9CisgIAorICBmcmVlKE9sZEJ1Y2tldHMpOworfQorCisvLy8gRmluZE5vZGVPckluc2VydFBvcyAtIExvb2sgdXAgdGhlIG5vZGUgc3BlY2lmaWVkIGJ5IElELiAgSWYgaXQgZXhpc3RzLAorLy8vIHJldHVybiBpdC4gIElmIG5vdCwgcmV0dXJuIHRoZSBpbnNlcnRpb24gdG9rZW4gdGhhdCB3aWxsIG1ha2UgaW5zZXJ0aW9uCisvLy8gZmFzdGVyLgorRm9sZGluZ1NldEltcGw6Ok5vZGUKKypGb2xkaW5nU2V0SW1wbDo6RmluZE5vZGVPckluc2VydFBvcyhjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIComSW5zZXJ0UG9zKSB7CisgIAorICB2b2lkICoqQnVja2V0ID0gR2V0QnVja2V0Rm9yKElELCBCdWNrZXRzLCBOdW1CdWNrZXRzKTsKKyAgdm9pZCAqUHJvYmUgPSAqQnVja2V0OworICAKKyAgSW5zZXJ0UG9zID0gMDsKKyAgCisgIEZvbGRpbmdTZXROb2RlSUQgT3RoZXJJRDsKKyAgd2hpbGUgKE5vZGUgKk5vZGVJbkJ1Y2tldCA9IEdldE5leHRQdHIoUHJvYmUpKSB7CisgICAgR2V0Tm9kZVByb2ZpbGUoT3RoZXJJRCwgTm9kZUluQnVja2V0KTsKKyAgICBpZiAoT3RoZXJJRCA9PSBJRCkKKyAgICAgIHJldHVybiBOb2RlSW5CdWNrZXQ7CisKKyAgICBQcm9iZSA9IE5vZGVJbkJ1Y2tldC0+Z2V0TmV4dEluQnVja2V0KCk7CisgICAgT3RoZXJJRC5jbGVhcigpOworICB9CisgIAorICAvLyBEaWRuJ3QgZmluZCB0aGUgbm9kZSwgcmV0dXJuIG51bGwgd2l0aCB0aGUgYnVja2V0IGFzIHRoZSBJbnNlcnRQb3MuCisgIEluc2VydFBvcyA9IEJ1Y2tldDsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBJbnNlcnROb2RlIC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbm9kZSBpbnRvIHRoZSBmb2xkaW5nIHNldCwga25vd2luZyB0aGF0IGl0CisvLy8gaXMgbm90IGFscmVhZHkgaW4gdGhlIG1hcC4gIEluc2VydFBvcyBtdXN0IGJlIG9idGFpbmVkIGZyb20gCisvLy8gRmluZE5vZGVPckluc2VydFBvcy4KK3ZvaWQgRm9sZGluZ1NldEltcGw6Okluc2VydE5vZGUoTm9kZSAqTiwgdm9pZCAqSW5zZXJ0UG9zKSB7CisgIGFzc2VydChOLT5nZXROZXh0SW5CdWNrZXQoKSA9PSAwKTsKKyAgLy8gRG8gd2UgbmVlZCB0byBncm93IHRoZSBoYXNodGFibGU/CisgIGlmIChOdW1Ob2RlcysxID4gTnVtQnVja2V0cyoyKSB7CisgICAgR3Jvd0hhc2hUYWJsZSgpOworICAgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgICAgR2V0Tm9kZVByb2ZpbGUoSUQsIE4pOworICAgIEluc2VydFBvcyA9IEdldEJ1Y2tldEZvcihJRCwgQnVja2V0cywgTnVtQnVja2V0cyk7CisgIH0KKworICArK051bU5vZGVzOworICAKKyAgLy8vIFRoZSBpbnNlcnQgcG9zaXRpb24gaXMgYWN0dWFsbHkgYSBidWNrZXQgcG9pbnRlci4KKyAgdm9pZCAqKkJ1Y2tldCA9IHN0YXRpY19jYXN0PHZvaWQqKj4oSW5zZXJ0UG9zKTsKKyAgCisgIHZvaWQgKk5leHQgPSAqQnVja2V0OworICAKKyAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5zZXJ0aW9uIGludG8gdGhpcyBidWNrZXQsIGl0cyBuZXh0IHBvaW50ZXIgd2lsbCBiZQorICAvLyBudWxsLiAgUHJldGVuZCBhcyBpZiBpdCBwb2ludGVkIHRvIGl0c2VsZiwgc2V0dGluZyB0aGUgbG93IGJpdCB0byBpbmRpY2F0ZQorICAvLyB0aGF0IGl0IGlzIGEgcG9pbnRlciB0byB0aGUgYnVja2V0LgorICBpZiAoTmV4dCA9PSAwKQorICAgIE5leHQgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PGludHB0cl90PihCdWNrZXQpfDEpOworCisgIC8vIFNldCB0aGUgbm9kZSdzIG5leHQgcG9pbnRlciwgYW5kIG1ha2UgdGhlIGJ1Y2tldCBwb2ludCB0byB0aGUgbm9kZS4KKyAgTi0+U2V0TmV4dEluQnVja2V0KE5leHQpOworICAqQnVja2V0ID0gTjsKK30KKworLy8vIFJlbW92ZU5vZGUgLSBSZW1vdmUgYSBub2RlIGZyb20gdGhlIGZvbGRpbmcgc2V0LCByZXR1cm5pbmcgdHJ1ZSBpZiBvbmUgd2FzCisvLy8gcmVtb3ZlZCBvciBmYWxzZSBpZiB0aGUgbm9kZSB3YXMgbm90IGluIHRoZSBmb2xkaW5nIHNldC4KK2Jvb2wgRm9sZGluZ1NldEltcGw6OlJlbW92ZU5vZGUoTm9kZSAqTikgeworICAvLyBCZWNhdXNlIGVhY2ggYnVja2V0IGlzIGEgY2lyY3VsYXIgbGlzdCwgd2UgZG9uJ3QgbmVlZCB0byBjb21wdXRlIE4ncyBoYXNoCisgIC8vIHRvIHJlbW92ZSBpdC4KKyAgdm9pZCAqUHRyID0gTi0+Z2V0TmV4dEluQnVja2V0KCk7CisgIGlmIChQdHIgPT0gMCkgcmV0dXJuIGZhbHNlOyAgLy8gTm90IGluIGZvbGRpbmcgc2V0LgorCisgIC0tTnVtTm9kZXM7CisgIE4tPlNldE5leHRJbkJ1Y2tldCgwKTsKKworICAvLyBSZW1lbWJlciB3aGF0IE4gb3JpZ2luYWxseSBwb2ludGVkIHRvLCBlaXRoZXIgYSBidWNrZXQgb3IgYW5vdGhlciBub2RlLgorICB2b2lkICpOb2RlTmV4dFB0ciA9IFB0cjsKKyAgCisgIC8vIENoYXNlIGFyb3VuZCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIHRoZSBub2RlIChvciBidWNrZXQpIHdoaWNoIHBvaW50cyB0byBOLgorICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChOb2RlICpOb2RlSW5CdWNrZXQgPSBHZXROZXh0UHRyKFB0cikpIHsKKyAgICAgIC8vIEFkdmFuY2UgcG9pbnRlci4KKyAgICAgIFB0ciA9IE5vZGVJbkJ1Y2tldC0+Z2V0TmV4dEluQnVja2V0KCk7CisgICAgICAKKyAgICAgIC8vIFdlIGZvdW5kIGEgbm9kZSB0aGF0IHBvaW50cyB0byBOLCBjaGFuZ2UgaXQgdG8gcG9pbnQgdG8gTidzIG5leHQgbm9kZSwKKyAgICAgIC8vIHJlbW92aW5nIE4gZnJvbSB0aGUgbGlzdC4KKyAgICAgIGlmIChQdHIgPT0gTikgeworICAgICAgICBOb2RlSW5CdWNrZXQtPlNldE5leHRJbkJ1Y2tldChOb2RlTmV4dFB0cik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2b2lkICoqQnVja2V0ID0gR2V0QnVja2V0UHRyKFB0cik7CisgICAgICBQdHIgPSAqQnVja2V0OworICAgICAgCisgICAgICAvLyBJZiB3ZSBmb3VuZCB0aGF0IHRoZSBidWNrZXQgcG9pbnRzIHRvIE4sIHVwZGF0ZSB0aGUgYnVja2V0IHRvIHBvaW50IHRvCisgICAgICAvLyB3aGF0ZXZlciBpcyBuZXh0LgorICAgICAgaWYgKFB0ciA9PSBOKSB7CisgICAgICAgICpCdWNrZXQgPSBOb2RlTmV4dFB0cjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLyBHZXRPckluc2VydE5vZGUgLSBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBzaW1wbGUgTm9kZSBleGFjdGx5CisvLy8gZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBub2RlLCByZXR1cm4gaXQuICBPdGhlcndpc2UsIGluc2VydCAnTicgYW5kIGl0CisvLy8gaW5zdGVhZC4KK0ZvbGRpbmdTZXRJbXBsOjpOb2RlICpGb2xkaW5nU2V0SW1wbDo6R2V0T3JJbnNlcnROb2RlKEZvbGRpbmdTZXRJbXBsOjpOb2RlICpOKSB7CisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIEdldE5vZGVQcm9maWxlKElELCBOKTsKKyAgdm9pZCAqSVA7CisgIGlmIChOb2RlICpFID0gRmluZE5vZGVPckluc2VydFBvcyhJRCwgSVApKQorICAgIHJldHVybiBFOworICBJbnNlcnROb2RlKE4sIElQKTsKKyAgcmV0dXJuIE47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsIEltcGxlbWVudGF0aW9uCisKK0ZvbGRpbmdTZXRJdGVyYXRvckltcGw6OkZvbGRpbmdTZXRJdGVyYXRvckltcGwodm9pZCAqKkJ1Y2tldCkgeworICAvLyBTa2lwIHRvIHRoZSBmaXJzdCBub24tbnVsbCBub24tc2VsZi1jeWNsZSBidWNrZXQuCisgIHdoaWxlICgqQnVja2V0ICE9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KC0xKSAmJgorICAgICAgICAgKCpCdWNrZXQgPT0gMCB8fCBHZXROZXh0UHRyKCpCdWNrZXQpID09IDApKQorICAgICsrQnVja2V0OworICAKKyAgTm9kZVB0ciA9IHN0YXRpY19jYXN0PEZvbGRpbmdTZXROb2RlKj4oKkJ1Y2tldCk7Cit9CisKK3ZvaWQgRm9sZGluZ1NldEl0ZXJhdG9ySW1wbDo6YWR2YW5jZSgpIHsKKyAgLy8gSWYgdGhlcmUgaXMgYW5vdGhlciBsaW5rIHdpdGhpbiB0aGlzIGJ1Y2tldCwgZ28gdG8gaXQuCisgIHZvaWQgKlByb2JlID0gTm9kZVB0ci0+Z2V0TmV4dEluQnVja2V0KCk7CisKKyAgaWYgKEZvbGRpbmdTZXROb2RlICpOZXh0Tm9kZUluQnVja2V0ID0gR2V0TmV4dFB0cihQcm9iZSkpCisgICAgTm9kZVB0ciA9IE5leHROb2RlSW5CdWNrZXQ7CisgIGVsc2UgeworICAgIC8vIE90aGVyd2lzZSwgdGhpcyBpcyB0aGUgbGFzdCBsaW5rIGluIHRoaXMgYnVja2V0LiAgCisgICAgdm9pZCAqKkJ1Y2tldCA9IEdldEJ1Y2tldFB0cihQcm9iZSk7CisKKyAgICAvLyBTa2lwIHRvIHRoZSBuZXh0IG5vbi1udWxsIG5vbi1zZWxmLWN5Y2xlIGJ1Y2tldC4KKyAgICBkbyB7CisgICAgICArK0J1Y2tldDsKKyAgICB9IHdoaWxlICgqQnVja2V0ICE9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KC0xKSAmJgorICAgICAgICAgICAgICgqQnVja2V0ID09IDAgfHwgR2V0TmV4dFB0cigqQnVja2V0KSA9PSAwKSk7CisgICAgCisgICAgTm9kZVB0ciA9IHN0YXRpY19jYXN0PEZvbGRpbmdTZXROb2RlKj4oKkJ1Y2tldCk7CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwgSW1wbGVtZW50YXRpb24KKworRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbDo6Rm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbCh2b2lkICoqQnVja2V0KSB7CisgIFB0ciA9ICgqQnVja2V0ID09IDAgfHwgR2V0TmV4dFB0cigqQnVja2V0KSA9PSAwKSA/ICh2b2lkKikgQnVja2V0IDogKkJ1Y2tldDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MmI1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uY3BwIC0gRm9ybWF0dGVkIHN0cmVhbXMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgZm9ybWF0dGVkX3Jhd19vc3RyZWFtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gQ291bnRDb2x1bW5zIC0gRXhhbWluZSB0aGUgZ2l2ZW4gY2hhciBzZXF1ZW5jZSBhbmQgZmlndXJlIG91dCB3aGljaAorLy8vIGNvbHVtbiB3ZSBlbmQgdXAgaW4gYWZ0ZXIgb3V0cHV0LgorLy8vCitzdGF0aWMgdW5zaWduZWQgQ291bnRDb2x1bW5zKHVuc2lnbmVkIENvbHVtbiwgY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgeworICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGNvbHVtbiBieSBzY2FubmluZyB0aGUgc3RyaW5nIGZvcgorICAvLyBzcGVjaWFsIGNoYXJhY3RlcnMKKworICBmb3IgKGNvbnN0IGNoYXIgKkVuZCA9IFB0ciArIFNpemU7IFB0ciAhPSBFbmQ7ICsrUHRyKSB7CisgICAgKytDb2x1bW47CisgICAgaWYgKCpQdHIgPT0gJ1xuJyB8fCAqUHRyID09ICdccicpCisgICAgICBDb2x1bW4gPSAwOworICAgIGVsc2UgaWYgKCpQdHIgPT0gJ1x0JykKKyAgICAgIC8vIEFzc3VtZXMgdGFiIHN0b3AgPSA4IGNoYXJhY3RlcnMuCisgICAgICBDb2x1bW4gKz0gKDggLSAoQ29sdW1uICYgMHg3KSkgJiAweDc7CisgIH0KKworICByZXR1cm4gQ29sdW1uOworfQorCisvLy8gQ29tcHV0ZUNvbHVtbiAtIEV4YW1pbmUgdGhlIGN1cnJlbnQgb3V0cHV0IGFuZCBmaWd1cmUgb3V0IHdoaWNoCisvLy8gY29sdW1uIHdlIGVuZCB1cCBpbiBhZnRlciBvdXRwdXQuCit2b2lkIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTo6Q29tcHV0ZUNvbHVtbihjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSB7CisgIC8vIElmIG91ciBwcmV2aW91cyBzY2FuIHBvaW50ZXIgaXMgaW5zaWRlIHRoZSBidWZmZXIsIGFzc3VtZSB3ZSBhbHJlYWR5CisgIC8vIHNjYW5uZWQgdGhvc2UgYnl0ZXMuIFRoaXMgZGVwZW5kcyBvbiByYXdfb3N0cmVhbSB0byBub3QgY2hhbmdlIG91ciBidWZmZXIKKyAgLy8gaW4gdW5leHBlY3RlZCB3YXlzLgorICBpZiAoUHRyIDw9IFNjYW5uZWQgJiYgU2Nhbm5lZCA8PSBQdHIgKyBTaXplKSB7CisgICAgLy8gU2NhbiBhbGwgY2hhcmFjdGVycyBhZGRlZCBzaW5jZSBvdXIgbGFzdCBzY2FuIHRvIGRldGVybWluZSB0aGUgbmV3CisgICAgLy8gY29sdW1uLgorICAgIENvbHVtblNjYW5uZWQgPSBDb3VudENvbHVtbnMoQ29sdW1uU2Nhbm5lZCwgU2Nhbm5lZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplIC0gKFNjYW5uZWQgLSBQdHIpKTsKKyAgfSBlbHNlCisgICAgQ29sdW1uU2Nhbm5lZCA9IENvdW50Q29sdW1ucyhDb2x1bW5TY2FubmVkLCBQdHIsIFNpemUpOworCisgIC8vIFVwZGF0ZSB0aGUgc2Nhbm5pbmcgcG9pbnRlci4KKyAgU2Nhbm5lZCA9IFB0ciArIFNpemU7Cit9CisKKy8vLyBQYWRUb0NvbHVtbiAtIEFsaWduIHRoZSBvdXRwdXQgdG8gc29tZSBjb2x1bW4gbnVtYmVyLgorLy8vCisvLy8gXHBhcmFtIE5ld0NvbCAtIFRoZSBjb2x1bW4gdG8gbW92ZSB0by4KKy8vLworZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZmb3JtYXR0ZWRfcmF3X29zdHJlYW06OlBhZFRvQ29sdW1uKHVuc2lnbmVkIE5ld0NvbCkgeyAKKyAgLy8gRmlndXJlIG91dCB3aGF0J3MgaW4gdGhlIGJ1ZmZlciBhbmQgYWRkIGl0IHRvIHRoZSBjb2x1bW4gY291bnQuCisgIENvbXB1dGVDb2x1bW4oZ2V0QnVmZmVyU3RhcnQoKSwgR2V0TnVtQnl0ZXNJbkJ1ZmZlcigpKTsKKworICAvLyBPdXRwdXQgc3BhY2VzIHVudGlsIHdlIHJlYWNoIHRoZSBkZXNpcmVkIGNvbHVtbi4KKyAgaW5kZW50KHN0ZDo6bWF4KGludChOZXdDb2wgLSBDb2x1bW5TY2FubmVkKSwgMSkpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3ZvaWQgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOjp3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIHsKKyAgLy8gRmlndXJlIG91dCB3aGF0J3MgaW4gdGhlIGJ1ZmZlciBhbmQgYWRkIGl0IHRvIHRoZSBjb2x1bW4gY291bnQuCisgIENvbXB1dGVDb2x1bW4oUHRyLCBTaXplKTsKKworICAvLyBXcml0ZSB0aGUgZGF0YSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0gKHdoaWNoIGlzIHVuYnVmZmVyZWQsIHNvCisgIC8vIHRoZSBkYXRhIHdpbGwgYmUgaW1tZWRpYXRlbHkgd3JpdHRlbiBvdXQpLgorICBUaGVTdHJlYW0tPndyaXRlKFB0ciwgU2l6ZSk7CisKKyAgLy8gUmVzZXQgdGhlIHNjYW5uaW5nIHBvaW50ZXIuCisgIFNjYW5uZWQgPSAwOworfQorCisvLy8gZm91dHMoKSAtIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSBmb3IKKy8vLyBzdGFuZGFyZCBvdXRwdXQuICBVc2UgaXQgbGlrZTogZm91dHMoKSA8PCAiZm9vIiA8PCAiYmFyIjsKK2Zvcm1hdHRlZF9yYXdfb3N0cmVhbSAmbGx2bTo6Zm91dHMoKSB7CisgIHN0YXRpYyBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gUyhvdXRzKCkpOworICByZXR1cm4gUzsKK30KKworLy8vIGZlcnJzKCkgLSBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gZm9yCisvLy8gc3RhbmRhcmQgZXJyb3IuICBVc2UgaXQgbGlrZTogZmVycnMoKSA8PCAiZm9vIiA8PCAiYmFyIjsKK2Zvcm1hdHRlZF9yYXdfb3N0cmVhbSAmbGx2bTo6ZmVycnMoKSB7CisgIHN0YXRpYyBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gUyhlcnJzKCkpOworICByZXR1cm4gUzsKK30KKworLy8vIGZkYmdzKCkgLSBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gZm9yCisvLy8gdGhlIGRlYnVnIHN0cmVhbS4gIFVzZSBpdCBsaWtlOiBmZGJncygpIDw8ICJmb28iIDw8ICJiYXIiOworZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZsbHZtOjpmZGJncygpIHsKKyAgc3RhdGljIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSBTKGRiZ3MoKSk7CisgIHJldHVybiBTOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvR3JhcGhXcml0ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvR3JhcGhXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDYyODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9HcmFwaFdyaXRlci5jcHAKQEAgLTAsMCArMSwxNzYgQEAKKy8vPT09LS0gR3JhcGhXcml0ZXIuY3BwIC0gSW1wbGVtZW50cyBHcmFwaFdyaXRlciBzdXBwb3J0IHJvdXRpbmVzIC0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgbWlzYy4gR3JhcGhXcml0ZXIgc3VwcG9ydCByb3V0aW5lcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dyYXBoV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1Byb2dyYW0uaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGQ6OnN0cmluZyBsbHZtOjpET1Q6OkVzY2FwZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmTGFiZWwpIHsKKyAgc3RkOjpzdHJpbmcgU3RyKExhYmVsKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBTdHIubGVuZ3RoKCk7ICsraSkKKyAgc3dpdGNoIChTdHJbaV0pIHsKKyAgICBjYXNlICdcbic6CisgICAgICBTdHIuaW5zZXJ0KFN0ci5iZWdpbigpK2ksICdcXCcpOyAgLy8gRXNjYXBlIGNoYXJhY3Rlci4uLgorICAgICAgKytpOworICAgICAgU3RyW2ldID0gJ24nOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHQnOgorICAgICAgU3RyLmluc2VydChTdHIuYmVnaW4oKStpLCAnICcpOyAgLy8gQ29udmVydCB0byB0d28gc3BhY2VzCisgICAgICArK2k7CisgICAgICBTdHJbaV0gPSAnICc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcXCc6CisgICAgICBpZiAoaSsxICE9IFN0ci5sZW5ndGgoKSkKKyAgICAgICAgc3dpdGNoIChTdHJbaSsxXSkgeworICAgICAgICAgIGNhc2UgJ2wnOiBjb250aW51ZTsgLy8gZG9uJ3QgZGlzdHVyYiBcbAorICAgICAgICAgIGNhc2UgJ3wnOiBjYXNlICd7JzogY2FzZSAnfSc6CisgICAgICAgICAgICBTdHIuZXJhc2UoU3RyLmJlZ2luKCkraSk7IGNvbnRpbnVlOworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSAneyc6IGNhc2UgJ30nOgorICAgIGNhc2UgJzwnOiBjYXNlICc+JzoKKyAgICBjYXNlICd8JzogY2FzZSAnIic6CisgICAgICBTdHIuaW5zZXJ0KFN0ci5iZWdpbigpK2ksICdcXCcpOyAgLy8gRXNjYXBlIGNoYXJhY3Rlci4uLgorICAgICAgKytpOyAgLy8gZG9uJ3QgaW5maW5pdGUgbG9vcAorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFN0cjsKK30KKworCisKK3ZvaWQgbGx2bTo6RGlzcGxheUdyYXBoKGNvbnN0IHN5czo6UGF0aCAmRmlsZW5hbWUsIGJvb2wgd2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoUHJvZ3JhbTo6TmFtZSBwcm9ncmFtKSB7CisgIHN0ZDo6c3RyaW5nIEVyck1zZzsKKyNpZiBIQVZFX0dSQVBIVklaCisgIHN5czo6UGF0aCBHcmFwaHZpeihMTFZNX1BBVEhfR1JBUEhWSVopOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBhcmdzOworICBhcmdzLnB1c2hfYmFjayhHcmFwaHZpei5jX3N0cigpKTsKKyAgYXJncy5wdXNoX2JhY2soRmlsZW5hbWUuY19zdHIoKSk7CisgIGFyZ3MucHVzaF9iYWNrKDApOworICAKKyAgZXJycygpIDw8ICJSdW5uaW5nICdHcmFwaHZpeicgcHJvZ3JhbS4uLiAiOworICBpZiAoc3lzOjpQcm9ncmFtOjpFeGVjdXRlQW5kV2FpdChHcmFwaHZpeiwgJmFyZ3NbMF0sMCwwLDAsMCwmRXJyTXNnKSkKKyAgICBlcnJzKCkgPDwgIkVycm9yIHZpZXdpbmcgZ3JhcGggIiA8PCBGaWxlbmFtZS5zdHIoKSA8PCAiOiAiIDw8IEVyck1zZworICAgICAgICAgICA8PCAiXG4iOworICBlbHNlCisgICAgRmlsZW5hbWUuZXJhc2VGcm9tRGlzaygpOworCisjZWxpZiAoSEFWRV9HViAmJiAoSEFWRV9ET1QgfHwgSEFWRV9GRFAgfHwgSEFWRV9ORUFUTyB8fCBcCisgICAgICAgICAgICAgICAgICAgSEFWRV9UV09QSSB8fCBIQVZFX0NJUkNPKSkKKyAgc3lzOjpQYXRoIFBTRmlsZW5hbWUgPSBGaWxlbmFtZTsKKyAgUFNGaWxlbmFtZS5hcHBlbmRTdWZmaXgoInBzIik7CisKKyAgc3lzOjpQYXRoIHByb2c7CisKKyAgLy8gU2V0IGRlZmF1bHQgZ3JhcGhlcgorI2lmIEhBVkVfQ0lSQ08KKyAgcHJvZyA9IHN5czo6UGF0aChMTFZNX1BBVEhfQ0lSQ08pOworI2VuZGlmCisjaWYgSEFWRV9UV09QSQorICBwcm9nID0gc3lzOjpQYXRoKExMVk1fUEFUSF9UV09QSSk7CisjZW5kaWYKKyNpZiBIQVZFX05FQVRPCisgIHByb2cgPSBzeXM6OlBhdGgoTExWTV9QQVRIX05FQVRPKTsKKyNlbmRpZgorI2lmIEhBVkVfRkRQCisgIHByb2cgPSBzeXM6OlBhdGgoTExWTV9QQVRIX0ZEUCk7CisjZW5kaWYKKyNpZiBIQVZFX0RPVAorICBwcm9nID0gc3lzOjpQYXRoKExMVk1fUEFUSF9ET1QpOworI2VuZGlmCisKKyAgLy8gRmluZCB3aGljaCBwcm9ncmFtIHRoZSB1c2VyIHdhbnRzCisjaWYgSEFWRV9ET1QKKyAgaWYgKHByb2dyYW0gPT0gR3JhcGhQcm9ncmFtOjpET1QpCisgICAgcHJvZyA9IHN5czo6UGF0aChMTFZNX1BBVEhfRE9UKTsKKyNlbmRpZgorI2lmIChIQVZFX0ZEUCkKKyAgaWYgKHByb2dyYW0gPT0gR3JhcGhQcm9ncmFtOjpGRFApCisgICAgcHJvZyA9IHN5czo6UGF0aChMTFZNX1BBVEhfRkRQKTsKKyNlbmRpZgorI2lmIChIQVZFX05FQVRPKQorICBpZiAocHJvZ3JhbSA9PSBHcmFwaFByb2dyYW06Ok5FQVRPKQorICAgIHByb2cgPSBzeXM6OlBhdGgoTExWTV9QQVRIX05FQVRPKTsKKyNlbmRpZgorI2lmIChIQVZFX1RXT1BJKQorICBpZiAocHJvZ3JhbSA9PSBHcmFwaFByb2dyYW06OlRXT1BJKQorICAgIHByb2cgPSBzeXM6OlBhdGgoTExWTV9QQVRIX1RXT1BJKTsKKyNlbmRpZgorI2lmIChIQVZFX0NJUkNPKQorICBpZiAocHJvZ3JhbSA9PSBHcmFwaFByb2dyYW06OkNJUkNPKQorICAgIHByb2cgPSBzeXM6OlBhdGgoTExWTV9QQVRIX0NJUkNPKTsKKyNlbmRpZgorCisgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBhcmdzOworICBhcmdzLnB1c2hfYmFjayhwcm9nLmNfc3RyKCkpOworICBhcmdzLnB1c2hfYmFjaygiLVRwcyIpOworICBhcmdzLnB1c2hfYmFjaygiLU5mb250bmFtZT1Db3VyaWVyIik7CisgIGFyZ3MucHVzaF9iYWNrKCItR3NpemU9Ny41LDEwIik7CisgIGFyZ3MucHVzaF9iYWNrKEZpbGVuYW1lLmNfc3RyKCkpOworICBhcmdzLnB1c2hfYmFjaygiLW8iKTsKKyAgYXJncy5wdXNoX2JhY2soUFNGaWxlbmFtZS5jX3N0cigpKTsKKyAgYXJncy5wdXNoX2JhY2soMCk7CisgIAorICBlcnJzKCkgPDwgIlJ1bm5pbmcgJyIgPDwgcHJvZy5zdHIoKSA8PCAiJyBwcm9ncmFtLi4uICI7CisKKyAgaWYgKHN5czo6UHJvZ3JhbTo6RXhlY3V0ZUFuZFdhaXQocHJvZywgJmFyZ3NbMF0sIDAsIDAsIDAsIDAsICZFcnJNc2cpKSB7CisgICAgIGVycnMoKSA8PCAiRXJyb3Igdmlld2luZyBncmFwaCAiIDw8IEZpbGVuYW1lLnN0cigpIDw8ICI6ICciCisgICAgICAgICAgICA8PCBFcnJNc2cgPDwgIlxuIjsKKyAgICByZXR1cm47CisgIH0KKyAgZXJycygpIDw8ICIgZG9uZS4gXG4iOworCisgIHN5czo6UGF0aCBndihMTFZNX1BBVEhfR1YpOworICBhcmdzLmNsZWFyKCk7CisgIGFyZ3MucHVzaF9iYWNrKGd2LmNfc3RyKCkpOworICBhcmdzLnB1c2hfYmFjayhQU0ZpbGVuYW1lLmNfc3RyKCkpOworICBhcmdzLnB1c2hfYmFjaygiLS1zcGFydGFuIik7CisgIGFyZ3MucHVzaF9iYWNrKDApOworICAKKyAgRXJyTXNnLmNsZWFyKCk7CisgIGlmICh3YWl0KSB7CisgICAgIGlmIChzeXM6OlByb2dyYW06OkV4ZWN1dGVBbmRXYWl0KGd2LCAmYXJnc1swXSwwLDAsMCwwLCZFcnJNc2cpKQorICAgICAgICBlcnJzKCkgPDwgIkVycm9yIHZpZXdpbmcgZ3JhcGg6ICIgPDwgRXJyTXNnIDw8ICJcbiI7CisgICAgIEZpbGVuYW1lLmVyYXNlRnJvbURpc2soKTsKKyAgICAgUFNGaWxlbmFtZS5lcmFzZUZyb21EaXNrKCk7CisgIH0KKyAgZWxzZSB7CisgICAgIHN5czo6UHJvZ3JhbTo6RXhlY3V0ZU5vV2FpdChndiwgJmFyZ3NbMF0sMCwwLDAsJkVyck1zZyk7CisgICAgIGVycnMoKSA8PCAiUmVtZW1iZXIgdG8gZXJhc2UgZ3JhcGggZmlsZXM6ICIgPDwgRmlsZW5hbWUuc3RyKCkgPDwgIiAiCisgICAgICAgICAgICA8PCBQU0ZpbGVuYW1lLnN0cigpIDw8ICJcbiI7CisgIH0KKyNlbGlmIEhBVkVfRE9UVFkKKyAgc3lzOjpQYXRoIGRvdHR5KExMVk1fUEFUSF9ET1RUWSk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IGFyZ3M7CisgIGFyZ3MucHVzaF9iYWNrKGRvdHR5LmNfc3RyKCkpOworICBhcmdzLnB1c2hfYmFjayhGaWxlbmFtZS5jX3N0cigpKTsKKyAgYXJncy5wdXNoX2JhY2soMCk7CisgIAorICBlcnJzKCkgPDwgIlJ1bm5pbmcgJ2RvdHR5JyBwcm9ncmFtLi4uICI7CisgIGlmIChzeXM6OlByb2dyYW06OkV4ZWN1dGVBbmRXYWl0KGRvdHR5LCAmYXJnc1swXSwwLDAsMCwwLCZFcnJNc2cpKSB7CisgICAgIGVycnMoKSA8PCAiRXJyb3Igdmlld2luZyBncmFwaCAiIDw8IEZpbGVuYW1lLnN0cigpIDw8ICI6ICIKKyAgICAgICAgICAgIDw8IEVyck1zZyA8PCAiXG4iOworICB9IGVsc2UgeworLy8gRG90dHkgc3Bhd25zIGFub3RoZXIgYXBwIGFuZCBkb2Vzbid0IHdhaXQgdW50aWwgaXQgcmV0dXJucworI2lmIGRlZmluZWQgKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkIChfV0lORE9XUykKKyAgICByZXR1cm47CisjZW5kaWYKKyAgICBGaWxlbmFtZS5lcmFzZUZyb21EaXNrKCk7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGMyMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIyM9PT0tIGxpYi9TdXBwb3J0L01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNU3VwcG9ydAorQlVJTERfQVJDSElWRSA9IDEKKworIyMgRklYTUU6IFRoaXMgb25seSByZXF1aXJlcyBSVFRJIGJlY2F1c2UgdGJsZ2VuIHVzZXMgaXQuICBGaXggdGhhdC4KK1JFUVVJUkVTX1JUVEkgPSAxCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmNwcCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L01hbmFnZWRTdGF0aWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjU1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmNwcApAQCAtMCwwICsxLDc1IEBACisvLz09PS0tIE1hbmFnZWRTdGF0aWMuY3BwIC0gU3RhdGljIEdsb2JhbCB3cmFwcGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBNYW5hZ2VkU3RhdGljIGNsYXNzIGFuZCBsbHZtX3NodXRkb3duKCkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvY29uZmlnLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vQXRvbWljLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgY29uc3QgTWFuYWdlZFN0YXRpY0Jhc2UgKlN0YXRpY0xpc3QgPSAwOworCit2b2lkIE1hbmFnZWRTdGF0aWNCYXNlOjpSZWdpc3Rlck1hbmFnZWRTdGF0aWModm9pZCAqKCpDcmVhdG9yKSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpEZWxldGVyKSh2b2lkKikpIGNvbnN0IHsKKyAgaWYgKGxsdm1faXNfbXVsdGl0aHJlYWRlZCgpKSB7CisgICAgbGx2bV9hY3F1aXJlX2dsb2JhbF9sb2NrKCk7CisKKyAgICBpZiAoUHRyID09IDApIHsKKyAgICAgIHZvaWQqIHRtcCA9IENyZWF0b3IgPyBDcmVhdG9yKCkgOiAwOworCisgICAgICBzeXM6Ok1lbW9yeUZlbmNlKCk7CisgICAgICBQdHIgPSB0bXA7CisgICAgICBEZWxldGVyRm4gPSBEZWxldGVyOworICAgICAgCisgICAgICAvLyBBZGQgdG8gbGlzdCBvZiBtYW5hZ2VkIHN0YXRpY3MuCisgICAgICBOZXh0ID0gU3RhdGljTGlzdDsKKyAgICAgIFN0YXRpY0xpc3QgPSB0aGlzOworICAgIH0KKworICAgIGxsdm1fcmVsZWFzZV9nbG9iYWxfbG9jaygpOworICB9IGVsc2UgeworICAgIGFzc2VydChQdHIgPT0gMCAmJiBEZWxldGVyRm4gPT0gMCAmJiBOZXh0ID09IDAgJiYKKyAgICAgICAgICAgIlBhcnRpYWxseSBpbml0aWFsaXplZCBNYW5hZ2VkU3RhdGljIT8iKTsKKyAgICBQdHIgPSBDcmVhdG9yID8gQ3JlYXRvcigpIDogMDsKKyAgICBEZWxldGVyRm4gPSBEZWxldGVyOworICAKKyAgICAvLyBBZGQgdG8gbGlzdCBvZiBtYW5hZ2VkIHN0YXRpY3MuCisgICAgTmV4dCA9IFN0YXRpY0xpc3Q7CisgICAgU3RhdGljTGlzdCA9IHRoaXM7CisgIH0KK30KKwordm9pZCBNYW5hZ2VkU3RhdGljQmFzZTo6ZGVzdHJveSgpIGNvbnN0IHsKKyAgYXNzZXJ0KERlbGV0ZXJGbiAmJiAiTWFuYWdlZFN0YXRpYyBub3QgaW5pdGlhbGl6ZWQgY29ycmVjdGx5ISIpOworICBhc3NlcnQoU3RhdGljTGlzdCA9PSB0aGlzICYmCisgICAgICAgICAiTm90IGRlc3Ryb3llZCBpbiByZXZlcnNlIG9yZGVyIG9mIGNvbnN0cnVjdGlvbj8iKTsKKyAgLy8gVW5saW5rIGZyb20gbGlzdC4KKyAgU3RhdGljTGlzdCA9IE5leHQ7CisgIE5leHQgPSAwOworCisgIC8vIERlc3Ryb3kgbWVtb3J5LgorICBEZWxldGVyRm4oUHRyKTsKKyAgCisgIC8vIENsZWFudXAuCisgIFB0ciA9IDA7CisgIERlbGV0ZXJGbiA9IDA7Cit9CisKKy8vLyBsbHZtX3NodXRkb3duIC0gRGVhbGxvY2F0ZSBhbmQgZGVzdHJveSBhbGwgTWFuYWdlZFN0YXRpYyB2YXJpYWJsZXMuCit2b2lkIGxsdm06Omxsdm1fc2h1dGRvd24oKSB7CisgIHdoaWxlIChTdGF0aWNMaXN0KQorICAgIFN0YXRpY0xpc3QtPmRlc3Ryb3koKTsKKworICBpZiAobGx2bV9pc19tdWx0aXRocmVhZGVkKCkpIGxsdm1fc3RvcF9tdWx0aXRocmVhZGVkKCk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L01lbW9yeUJ1ZmZlci5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9NZW1vcnlCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjE2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9NZW1vcnlCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMjk3IEBACisvLz09PS0tLSBNZW1vcnlCdWZmZXIuY3BwIC0gTWVtb3J5IEJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTWVtb3J5QnVmZmVyIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9FcnJuby5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9Qcm9jZXNzLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUHJvZ3JhbS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1lbW9yeUJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBpdHNlbGYuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNZW1vcnlCdWZmZXI6On5NZW1vcnlCdWZmZXIoKSB7IH0KKworLy8vIGluaXQgLSBJbml0aWFsaXplIHRoaXMgTWVtb3J5QnVmZmVyIGFzIGEgcmVmZXJlbmNlIHRvIGV4dGVybmFsbHkgYWxsb2NhdGVkCisvLy8gbWVtb3J5LCBtZW1vcnkgdGhhdCB3ZSBrbm93IGlzIGFscmVhZHkgbnVsbCB0ZXJtaW5hdGVkLgordm9pZCBNZW1vcnlCdWZmZXI6OmluaXQoY29uc3QgY2hhciAqQnVmU3RhcnQsIGNvbnN0IGNoYXIgKkJ1ZkVuZCkgeworICBhc3NlcnQoQnVmRW5kWzBdID09IDAgJiYgIkJ1ZmZlciBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkISIpOworICBCdWZmZXJTdGFydCA9IEJ1ZlN0YXJ0OworICBCdWZmZXJFbmQgPSBCdWZFbmQ7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNZW1vcnlCdWZmZXJNZW0gaW1wbGVtZW50YXRpb24uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQ29weVN0cmluZ1JlZiAtIENvcGllcyBjb250ZW50cyBvZiBhIFN0cmluZ1JlZiBpbnRvIGEgYmxvY2sgb2YgbWVtb3J5IGFuZAorLy8vIG51bGwtdGVybWluYXRlcyBpdC4KK3N0YXRpYyB2b2lkIENvcHlTdHJpbmdSZWYoY2hhciAqTWVtb3J5LCBTdHJpbmdSZWYgRGF0YSkgeworICBtZW1jcHkoTWVtb3J5LCBEYXRhLmRhdGEoKSwgRGF0YS5zaXplKCkpOworICBNZW1vcnlbRGF0YS5zaXplKCldID0gMDsgLy8gTnVsbCB0ZXJtaW5hdGUgc3RyaW5nLgorfQorCisvLy8gR2V0TmFtZWRCdWZmZXIgLSBBbGxvY2F0ZXMgYSBuZXcgTWVtb3J5QnVmZmVyIHdpdGggTmFtZSBjb3BpZWQgYWZ0ZXIgaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBUKiBHZXROYW1lZEJ1ZmZlcihTdHJpbmdSZWYgQnVmZmVyLCBTdHJpbmdSZWYgTmFtZSkgeworICBjaGFyICpNZW0gPSBzdGF0aWNfY2FzdDxjaGFyKj4ob3BlcmF0b3IgbmV3KHNpemVvZihUKSArIE5hbWUuc2l6ZSgpICsgMSkpOworICBDb3B5U3RyaW5nUmVmKE1lbSArIHNpemVvZihUKSwgTmFtZSk7CisgIHJldHVybiBuZXcgKE1lbSkgVChCdWZmZXIpOworfQorCituYW1lc3BhY2UgeworLy8vIE1lbW9yeUJ1ZmZlck1lbSAtIE5hbWVkIE1lbW9yeUJ1ZmZlciBwb2ludGluZyB0byBhIGJsb2NrIG9mIG1lbW9yeS4KK2NsYXNzIE1lbW9yeUJ1ZmZlck1lbSA6IHB1YmxpYyBNZW1vcnlCdWZmZXIgeworcHVibGljOgorICBNZW1vcnlCdWZmZXJNZW0oU3RyaW5nUmVmIElucHV0RGF0YSkgeworICAgIGluaXQoSW5wdXREYXRhLmJlZ2luKCksIElucHV0RGF0YS5lbmQoKSk7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldEJ1ZmZlcklkZW50aWZpZXIoKSBjb25zdCB7CisgICAgIC8vIFRoZSBuYW1lIGlzIHN0b3JlZCBhZnRlciB0aGUgY2xhc3MgaXRzZWxmLgorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih0aGlzICsgMSk7CisgIH0KK307Cit9CisKKy8vLyBnZXRNZW1CdWZmZXIgLSBPcGVuIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlIGFzIGEgTWVtb3J5QnVmZmVyLiAgTm90ZQorLy8vIHRoYXQgRW5kUHRyWzBdIG11c3QgYmUgYSBudWxsIGJ5dGUgYW5kIGJlIGFjY2Vzc2libGUhCitNZW1vcnlCdWZmZXIgKk1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyKFN0cmluZ1JlZiBJbnB1dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCdWZmZXJOYW1lKSB7CisgIHJldHVybiBHZXROYW1lZEJ1ZmZlcjxNZW1vcnlCdWZmZXJNZW0+KElucHV0RGF0YSwgQnVmZmVyTmFtZSk7Cit9CisKKy8vLyBnZXRNZW1CdWZmZXJDb3B5IC0gT3BlbiB0aGUgc3BlY2lmaWVkIG1lbW9yeSByYW5nZSBhcyBhIE1lbW9yeUJ1ZmZlciwKKy8vLyBjb3B5aW5nIHRoZSBjb250ZW50cyBhbmQgdGFraW5nIG93bmVyc2hpcCBvZiBpdC4gIFRoaXMgaGFzIG5vIHJlcXVpcmVtZW50cworLy8vIG9uIEVuZFB0clswXS4KK01lbW9yeUJ1ZmZlciAqTWVtb3J5QnVmZmVyOjpnZXRNZW1CdWZmZXJDb3B5KFN0cmluZ1JlZiBJbnB1dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQnVmZmVyTmFtZSkgeworICBNZW1vcnlCdWZmZXIgKkJ1ZiA9IGdldE5ld1VuaW5pdE1lbUJ1ZmZlcihJbnB1dERhdGEuc2l6ZSgpLCBCdWZmZXJOYW1lKTsKKyAgaWYgKCFCdWYpIHJldHVybiAwOworICBtZW1jcHkoY29uc3RfY2FzdDxjaGFyKj4oQnVmLT5nZXRCdWZmZXJTdGFydCgpKSwgSW5wdXREYXRhLmRhdGEoKSwKKyAgICAgICAgIElucHV0RGF0YS5zaXplKCkpOworICByZXR1cm4gQnVmOworfQorCisvLy8gZ2V0TmV3VW5pbml0TWVtQnVmZmVyIC0gQWxsb2NhdGUgYSBuZXcgTWVtb3J5QnVmZmVyIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZQorLy8vIHRoYXQgaXMgbm90IGluaXRpYWxpemVkLiAgTm90ZSB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGluaXRpYWxpemUgdGhlCisvLy8gbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIG1ldGhvZC4gIFRoZSBtZW1vcnkgaXMgb3duZWQgYnkgdGhlIE1lbW9yeUJ1ZmZlcgorLy8vIG9iamVjdC4KK01lbW9yeUJ1ZmZlciAqTWVtb3J5QnVmZmVyOjpnZXROZXdVbmluaXRNZW1CdWZmZXIoc2l6ZV90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCdWZmZXJOYW1lKSB7CisgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgTWVtb3J5QnVmZmVyLCB0aGUgZGF0YSBhbmQgdGhlIG5hbWUuIEl0IGlzIGltcG9ydGFudAorICAvLyB0aGF0IE1lbW9yeUJ1ZmZlciBhbmQgZGF0YSBhcmUgYWxpZ25lZCBzbyBQb2ludGVySW50UGFpciB3b3JrcyB3aXRoIHRoZW0uCisgIHNpemVfdCBBbGlnbmVkU3RyaW5nTGVuID0KKyAgICBSb3VuZFVwVG9BbGlnbm1lbnQoc2l6ZW9mKE1lbW9yeUJ1ZmZlck1lbSkgKyBCdWZmZXJOYW1lLnNpemUoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2b2lkKikpOyAvLyBUT0RPOiBJcyBzaXplb2Yodm9pZCopIGVub3VnaD8KKyAgc2l6ZV90IFJlYWxMZW4gPSBBbGlnbmVkU3RyaW5nTGVuICsgU2l6ZSArIDE7CisgIGNoYXIgKk1lbSA9IHN0YXRpY19jYXN0PGNoYXIqPihvcGVyYXRvciBuZXcoUmVhbExlbiwgc3RkOjpub3Rocm93KSk7CisgIGlmICghTWVtKSByZXR1cm4gMDsKKworICAvLyBUaGUgbmFtZSBpcyBzdG9yZWQgYWZ0ZXIgdGhlIGNsYXNzIGl0c2VsZi4KKyAgQ29weVN0cmluZ1JlZihNZW0gKyBzaXplb2YoTWVtb3J5QnVmZmVyTWVtKSwgQnVmZmVyTmFtZSk7CisKKyAgLy8gVGhlIGJ1ZmZlciBiZWdpbnMgYWZ0ZXIgdGhlIG5hbWUgYW5kIG11c3QgYmUgYWxpZ25lZC4KKyAgY2hhciAqQnVmID0gTWVtICsgQWxpZ25lZFN0cmluZ0xlbjsKKyAgQnVmW1NpemVdID0gMDsgLy8gTnVsbCB0ZXJtaW5hdGUgYnVmZmVyLgorCisgIHJldHVybiBuZXcgKE1lbSkgTWVtb3J5QnVmZmVyTWVtKFN0cmluZ1JlZihCdWYsIFNpemUpKTsKK30KKworLy8vIGdldE5ld01lbUJ1ZmZlciAtIEFsbG9jYXRlIGEgbmV3IE1lbW9yeUJ1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIHNpemUgdGhhdAorLy8vIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgdG8gemVyb3MuICBOb3RlIHRoYXQgdGhlIGNhbGxlciBzaG91bGQKKy8vLyBpbml0aWFsaXplIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgbWV0aG9kLiAgVGhlIG1lbW9yeSBpcyBvd25lZCBieQorLy8vIHRoZSBNZW1vcnlCdWZmZXIgb2JqZWN0LgorTWVtb3J5QnVmZmVyICpNZW1vcnlCdWZmZXI6OmdldE5ld01lbUJ1ZmZlcihzaXplX3QgU2l6ZSwgU3RyaW5nUmVmIEJ1ZmZlck5hbWUpIHsKKyAgTWVtb3J5QnVmZmVyICpTQiA9IGdldE5ld1VuaW5pdE1lbUJ1ZmZlcihTaXplLCBCdWZmZXJOYW1lKTsKKyAgaWYgKCFTQikgcmV0dXJuIDA7CisgIG1lbXNldChjb25zdF9jYXN0PGNoYXIqPihTQi0+Z2V0QnVmZmVyU3RhcnQoKSksIDAsIFNpemUpOworICByZXR1cm4gU0I7Cit9CisKKworLy8vIGdldEZpbGVPclNURElOIC0gT3BlbiB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSBNZW1vcnlCdWZmZXIsIG9yIG9wZW4gc3RkaW4KKy8vLyBpZiB0aGUgRmlsZW5hbWUgaXMgIi0iLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGlzIHJldHVybnMgbnVsbCBhbmQgZmlsbHMKKy8vLyBpbiAqRXJyU3RyIHdpdGggYSByZWFzb24uICBJZiBzdGRpbiBpcyBlbXB0eSwgdGhpcyBBUEkgKHVubGlrZSBnZXRTVERJTikKKy8vLyByZXR1cm5zIGFuIGVtcHR5IGJ1ZmZlci4KK01lbW9yeUJ1ZmZlciAqTWVtb3J5QnVmZmVyOjpnZXRGaWxlT3JTVERJTihTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyclN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IEZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0ICpGaWxlSW5mbykgeworICBpZiAoRmlsZW5hbWUgPT0gIi0iKQorICAgIHJldHVybiBnZXRTVERJTihFcnJTdHIpOworICByZXR1cm4gZ2V0RmlsZShGaWxlbmFtZSwgRXJyU3RyLCBGaWxlU2l6ZSwgRmlsZUluZm8pOworfQorCitNZW1vcnlCdWZmZXIgKk1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZU9yU1RESU4oY29uc3QgY2hhciAqRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyclN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IEZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0ICpGaWxlSW5mbykgeworICBpZiAoc3RyY21wKEZpbGVuYW1lLCAiLSIpID09IDApCisgICAgcmV0dXJuIGdldFNURElOKEVyclN0cik7CisgIHJldHVybiBnZXRGaWxlKEZpbGVuYW1lLCBFcnJTdHIsIEZpbGVTaXplLCBGaWxlSW5mbyk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNZW1vcnlCdWZmZXI6OmdldEZpbGUgaW1wbGVtZW50YXRpb24uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgeworLy8vIE1lbW9yeUJ1ZmZlck1NYXBGaWxlIC0gVGhpcyByZXByZXNlbnRzIGEgZmlsZSB0aGF0IHdhcyBtYXBwZWQgaW4gd2l0aCB0aGUKKy8vLyBzeXM6OlBhdGg6Ok1hcEluRmlsZVBhZ2VzIG1ldGhvZC4gIFdoZW4gZGVzdHJveWVkLCBpdCBjYWxscyB0aGUKKy8vLyBzeXM6OlBhdGg6OlVuTWFwRmlsZVBhZ2VzIG1ldGhvZC4KK2NsYXNzIE1lbW9yeUJ1ZmZlck1NYXBGaWxlIDogcHVibGljIE1lbW9yeUJ1ZmZlck1lbSB7CitwdWJsaWM6CisgIE1lbW9yeUJ1ZmZlck1NYXBGaWxlKFN0cmluZ1JlZiBCdWZmZXIpCisgICAgOiBNZW1vcnlCdWZmZXJNZW0oQnVmZmVyKSB7IH0KKworICB+TWVtb3J5QnVmZmVyTU1hcEZpbGUoKSB7CisgICAgc3lzOjpQYXRoOjpVbk1hcEZpbGVQYWdlcyhnZXRCdWZmZXJTdGFydCgpLCBnZXRCdWZmZXJTaXplKCkpOworICB9Cit9OworCisvLy8gRmlsZUNsb3NlciAtIFJBSUkgb2JqZWN0IHRvIG1ha2Ugc3VyZSBhbiBGRCBnZXRzIGNsb3NlZCBwcm9wZXJseS4KK2NsYXNzIEZpbGVDbG9zZXIgeworICBpbnQgRkQ7CitwdWJsaWM6CisgIGV4cGxpY2l0IEZpbGVDbG9zZXIoaW50IEZEKSA6IEZEKEZEKSB7fQorICB+RmlsZUNsb3NlcigpIHsgOjpjbG9zZShGRCk7IH0KK307Cit9CisKK01lbW9yeUJ1ZmZlciAqTWVtb3J5QnVmZmVyOjpnZXRGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwgc3RkOjpzdHJpbmcgKkVyclN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgRmlsZVNpemUsIHN0cnVjdCBzdGF0ICpGaWxlSW5mbykgeworICBTbWFsbFN0cmluZzwyNTY+IFBhdGhCdWYoRmlsZW5hbWUuYmVnaW4oKSwgRmlsZW5hbWUuZW5kKCkpOworICByZXR1cm4gTWVtb3J5QnVmZmVyOjpnZXRGaWxlKFBhdGhCdWYuY19zdHIoKSwgRXJyU3RyLCBGaWxlU2l6ZSwgRmlsZUluZm8pOworfQorCitNZW1vcnlCdWZmZXIgKk1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShjb25zdCBjaGFyICpGaWxlbmFtZSwgc3RkOjpzdHJpbmcgKkVyclN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgRmlsZVNpemUsIHN0cnVjdCBzdGF0ICpGaWxlSW5mbykgeworICBpbnQgT3BlbkZsYWdzID0gT19SRE9OTFk7CisjaWZkZWYgT19CSU5BUlkKKyAgT3BlbkZsYWdzIHw9IE9fQklOQVJZOyAgLy8gT3BlbiBpbnB1dCBmaWxlIGluIGJpbmFyeSBtb2RlIG9uIHdpbjMyLgorI2VuZGlmCisgIGludCBGRCA9IDo6b3BlbihGaWxlbmFtZSwgT3BlbkZsYWdzKTsKKyAgaWYgKEZEID09IC0xKSB7CisgICAgaWYgKEVyclN0cikgKkVyclN0ciA9IHN5czo6U3RyRXJyb3IoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGaWxlQ2xvc2VyIEZDKEZEKTsgLy8gQ2xvc2UgRkQgb24gcmV0dXJuLgorICAKKyAgLy8gSWYgd2UgZG9uJ3Qga25vdyB0aGUgZmlsZSBzaXplLCB1c2UgZnN0YXQgdG8gZmluZCBvdXQuICBmc3RhdCBvbiBhbiBvcGVuCisgIC8vIGZpbGUgZGVzY3JpcHRvciBpcyBjaGVhcGVyIHRoYW4gc3RhdCBvbiBhIHJhbmRvbSBwYXRoLgorICBpZiAoRmlsZVNpemUgPT0gLTEgfHwgRmlsZUluZm8pIHsKKyAgICBzdHJ1Y3Qgc3RhdCBNeUZpbGVJbmZvOworICAgIHN0cnVjdCBzdGF0ICpGaWxlSW5mb1B0ciA9IEZpbGVJbmZvPyBGaWxlSW5mbyA6ICZNeUZpbGVJbmZvOworICAgIAorICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIHVzZSBmc3RhdDY0IHdoZW4gYXZhaWxhYmxlLgorICAgIGlmIChmc3RhdChGRCwgRmlsZUluZm9QdHIpID09IC0xKSB7CisgICAgICBpZiAoRXJyU3RyKSAqRXJyU3RyID0gc3lzOjpTdHJFcnJvcigpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEZpbGVTaXplID0gRmlsZUluZm9QdHItPnN0X3NpemU7CisgIH0KKyAgCisgIAorICAvLyBJZiB0aGUgZmlsZSBpcyBsYXJnZSwgdHJ5IHRvIHVzZSBtbWFwIHRvIHJlYWQgaXQgaW4uICBXZSBkb24ndCB1c2UgbW1hcAorICAvLyBmb3Igc21hbGwgZmlsZXMsIGJlY2F1c2UgdGhpcyBjYW4gc2V2ZXJlbHkgZnJhZ21lbnQgb3VyIGFkZHJlc3Mgc3BhY2UuIEFsc28KKyAgLy8gZG9uJ3QgdHJ5IHRvIG1hcCBmaWxlcyB0aGF0IGFyZSBleGFjdGx5IGEgbXVsdGlwbGUgb2YgdGhlIHN5c3RlbSBwYWdlIHNpemUsCisgIC8vIGFzIHRoZSBmaWxlIHdvdWxkIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBudWxsIHRlcm1pbmF0b3IuCisgIC8vCisgIC8vIEZJWE1FOiBDYW4gd2UganVzdCBtbWFwIGFuIGV4dHJhIHBhZ2UgaW4gdGhlIGxhdHRlciBjYXNlPworICBpZiAoRmlsZVNpemUgPj0gNDA5Nio0ICYmCisgICAgICAoRmlsZVNpemUgJiAoc3lzOjpQcm9jZXNzOjpHZXRQYWdlU2l6ZSgpLTEpKSAhPSAwKSB7CisgICAgaWYgKGNvbnN0IGNoYXIgKlBhZ2VzID0gc3lzOjpQYXRoOjpNYXBJbkZpbGVQYWdlcyhGRCwgRmlsZVNpemUpKSB7CisgICAgICByZXR1cm4gR2V0TmFtZWRCdWZmZXI8TWVtb3J5QnVmZmVyTU1hcEZpbGU+KFN0cmluZ1JlZihQYWdlcywgRmlsZVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSk7CisgICAgfQorICB9CisKKyAgTWVtb3J5QnVmZmVyICpCdWYgPSBNZW1vcnlCdWZmZXI6OmdldE5ld1VuaW5pdE1lbUJ1ZmZlcihGaWxlU2l6ZSwgRmlsZW5hbWUpOworICBpZiAoIUJ1ZikgeworICAgIC8vIEZhaWxlZCB0byBjcmVhdGUgYSBidWZmZXIuCisgICAgaWYgKEVyclN0cikgKkVyclN0ciA9ICJjb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyIjsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIE93bmluZ1B0cjxNZW1vcnlCdWZmZXI+IFNCKEJ1Zik7CisgIGNoYXIgKkJ1ZlB0ciA9IGNvbnN0X2Nhc3Q8Y2hhcio+KFNCLT5nZXRCdWZmZXJTdGFydCgpKTsKKworICBzaXplX3QgQnl0ZXNMZWZ0ID0gRmlsZVNpemU7CisgIHdoaWxlIChCeXRlc0xlZnQpIHsKKyAgICBzc2l6ZV90IE51bVJlYWQgPSA6OnJlYWQoRkQsIEJ1ZlB0ciwgQnl0ZXNMZWZ0KTsKKyAgICBpZiAoTnVtUmVhZCA9PSAtMSkgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIEVycm9yIHdoaWxlIHJlYWRpbmcuCisgICAgICBpZiAoRXJyU3RyKSAqRXJyU3RyID0gc3lzOjpTdHJFcnJvcigpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChOdW1SZWFkID09IDApIHsKKyAgICAgIC8vIFdlIGhpdCBFT0YgZWFybHksIHRydW5jYXRlIGFuZCB0ZXJtaW5hdGUgYnVmZmVyLgorICAgICAgQnVmLT5CdWZmZXJFbmQgPSBCdWZQdHI7CisgICAgICAqQnVmUHRyID0gMDsKKyAgICAgIHJldHVybiBTQi50YWtlKCk7CisgICAgfQorICAgIEJ5dGVzTGVmdCAtPSBOdW1SZWFkOworICAgIEJ1ZlB0ciArPSBOdW1SZWFkOworICB9CisKKyAgcmV0dXJuIFNCLnRha2UoKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1lbW9yeUJ1ZmZlcjo6Z2V0U1RESU4gaW1wbGVtZW50YXRpb24uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNZW1vcnlCdWZmZXIgKk1lbW9yeUJ1ZmZlcjo6Z2V0U1RESU4oc3RkOjpzdHJpbmcgKkVyclN0cikgeworICAvLyBSZWFkIGluIGFsbCBvZiB0aGUgZGF0YSBmcm9tIHN0ZGluLCB3ZSBjYW5ub3QgbW1hcCBzdGRpbi4KKyAgLy8KKyAgLy8gRklYTUU6IFRoYXQgaXNuJ3QgbmVjZXNzYXJpbHkgdHJ1ZSwgd2Ugc2hvdWxkIHRyeSB0byBtbWFwIHN0ZGluIGFuZAorICAvLyBmYWxsYmFjayBpZiBpdCBmYWlscy4KKyAgc3lzOjpQcm9ncmFtOjpDaGFuZ2VTdGRpblRvQmluYXJ5KCk7CisKKyAgY29uc3Qgc3NpemVfdCBDaHVua1NpemUgPSA0MDk2KjQ7CisgIFNtYWxsU3RyaW5nPENodW5rU2l6ZT4gQnVmZmVyOworICBzc2l6ZV90IFJlYWRCeXRlczsKKyAgLy8gUmVhZCBpbnRvIEJ1ZmZlciB1bnRpbCB3ZSBoaXQgRU9GLgorICBkbyB7CisgICAgQnVmZmVyLnJlc2VydmUoQnVmZmVyLnNpemUoKSArIENodW5rU2l6ZSk7CisgICAgUmVhZEJ5dGVzID0gcmVhZCgwLCBCdWZmZXIuZW5kKCksIENodW5rU2l6ZSk7CisgICAgaWYgKFJlYWRCeXRlcyA9PSAtMSkgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKSBjb250aW51ZTsKKyAgICAgIGlmIChFcnJTdHIpICpFcnJTdHIgPSBzeXM6OlN0ckVycm9yKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQnVmZmVyLnNldF9zaXplKEJ1ZmZlci5zaXplKCkgKyBSZWFkQnl0ZXMpOworICB9IHdoaWxlIChSZWFkQnl0ZXMgIT0gMCk7CisKKyAgcmV0dXJuIGdldE1lbUJ1ZmZlckNvcHkoQnVmZmVyLCAiPHN0ZGluPiIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzhhMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5jcHAKQEAgLTAsMCArMSwxMzQgQEAKKy8vPT09LSBQcmV0dHlTdGFja1RyYWNlLmNwcCAtIFByZXR0eSBDcmFzaCBIYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIGhlbHBmdWwgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mCisvLyBVbml4IHNpZ25hbHMgb2NjdXJpbmcgd2hpbGUgeW91ciBwcm9ncmFtIGlzIHJ1bm5pbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIiAgICAgLy8gR2V0IGF1dG9jb25mIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1NpZ25hbHMuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaHJlYWRMb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisKKyNpZmRlZiBIQVZFX0NSQVNIUkVQT1JURVJDTElFTlRfSAorI2luY2x1ZGUgPENyYXNoUmVwb3J0ZXJDbGllbnQuaD4KKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIGxsdm0geworICBib29sIERpc2FibGVQcmV0dHlTdGFja1RyYWNlID0gZmFsc2U7Cit9CisKKy8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSB0aHJlYWQgbG9jYWwgd2hlbiBsbHZtIHN1cHBvcnRzIHRocmVhZHMuCitzdGF0aWMgc3lzOjpUaHJlYWRMb2NhbDxjb25zdCBQcmV0dHlTdGFja1RyYWNlRW50cnk+IFByZXR0eVN0YWNrVHJhY2VIZWFkOworCitzdGF0aWMgdW5zaWduZWQgUHJpbnRTdGFjayhjb25zdCBQcmV0dHlTdGFja1RyYWNlRW50cnkgKkVudHJ5LCByYXdfb3N0cmVhbSAmT1MpeworICB1bnNpZ25lZCBOZXh0SUQgPSAwOworICBpZiAoRW50cnktPmdldE5leHRFbnRyeSgpKQorICAgIE5leHRJRCA9IFByaW50U3RhY2soRW50cnktPmdldE5leHRFbnRyeSgpLCBPUyk7CisgIE9TIDw8IE5leHRJRCA8PCAiLlx0IjsKKyAgRW50cnktPnByaW50KE9TKTsKKyAgCisgIHJldHVybiBOZXh0SUQrMTsKK30KKworLy8vIFByaW50Q3VyU3RhY2tUcmFjZSAtIFByaW50IHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgorc3RhdGljIHZvaWQgUHJpbnRDdXJTdGFja1RyYWNlKHJhd19vc3RyZWFtICZPUykgeworICAvLyBEb24ndCBwcmludCBhbiBlbXB0eSB0cmFjZS4KKyAgaWYgKFByZXR0eVN0YWNrVHJhY2VIZWFkLmdldCgpID09IDApIHJldHVybjsKKyAgCisgIC8vIElmIHRoZXJlIGFyZSBwcmV0dHkgc3RhY2sgZnJhbWVzIHJlZ2lzdGVyZWQsIHdhbGsgYW5kIGVtaXQgdGhlbS4KKyAgT1MgPDwgIlN0YWNrIGR1bXA6XG4iOworICAKKyAgUHJpbnRTdGFjayhQcmV0dHlTdGFja1RyYWNlSGVhZC5nZXQoKSwgT1MpOworICBPUy5mbHVzaCgpOworfQorCisvLyBJbnRlZ3JhdGUgd2l0aCBjcmFzaCByZXBvcnRlciBsaWJyYXJpZXMuCisjaWYgZGVmaW5lZCAoX19BUFBMRV9fKSAmJiBkZWZpbmVkIChIQVZFX0NSQVNIUkVQT1JURVJDTElFTlRfSCkKKy8vICBJZiBhbnkgY2xpZW50cyBvZiBsbHZtIHRyeSB0byBsaW5rIHRvIGxpYkNyYXNoUmVwb3J0ZXJDbGllbnQuYSB0aGVtc2VsdmVzLAorLy8gIG9ubHkgb25lIGNyYXNoIGluZm8gc3RydWN0IHdpbGwgYmUgdXNlZC4KK2V4dGVybiAiQyIgeworQ1JBU0hfUkVQT1JURVJfQ0xJRU5UX0hJRERFTiAKK3N0cnVjdCBjcmFzaHJlcG9ydGVyX2Fubm90YXRpb25zX3QgZ0NSQW5ub3RhdGlvbnMgCisgICAgICAgIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fREFUQSwiIENSQVNIUkVQT1JURVJfQU5OT1RBVElPTlNfU0VDVElPTikpKSAKKyAgICAgICAgPSB7IENSQVNIUkVQT1JURVJfQU5OT1RBVElPTlNfVkVSU0lPTiwgMCwgMCwgMCwgMCB9OworfQorI2VsaWYgZGVmaW5lZCAoX19BUFBMRV9fKQorc3RhdGljIGNvbnN0IGNoYXIgKl9fY3Jhc2hyZXBvcnRlcl9pbmZvX18gPSAwOworYXNtKCIuZGVzYyBfX19jcmFzaHJlcG9ydGVyX2luZm9fXywgMHgxMCIpOworI2VuZGlmCisKKworLy8vIENyYXNoSGFuZGxlciAtIFRoaXMgY2FsbGJhY2sgaXMgcnVuIGlmIGEgZmF0YWwgc2lnbmFsIGlzIGRlbGl2ZXJlZCB0byB0aGUKKy8vLyBwcm9jZXNzLCBpdCBwcmludHMgdGhlIHByZXR0eSBzdGFjayB0cmFjZS4KK3N0YXRpYyB2b2lkIENyYXNoSGFuZGxlcih2b2lkICopIHsKKyNpZm5kZWYgX19BUFBMRV9fCisgIC8vIE9uIG5vbi1hcHBsZSBzeXN0ZW1zLCBqdXN0IGVtaXQgdGhlIGNyYXNoIHN0YWNrIHRyYWNlIHRvIHN0ZGVyci4KKyAgUHJpbnRDdXJTdGFja1RyYWNlKGVycnMoKSk7CisjZWxzZQorICAvLyBPdGhlcndpc2UsIGVtaXQgdG8gYSBzbWFsbHZlY3RvciBvZiBjaGFycywgc2VuZCAqdGhhdCogdG8gc3RkZXJyLCBidXQgYWxzbworICAvLyBwdXQgaXQgaW50byBfX2NyYXNocmVwb3J0ZXJfaW5mb19fLgorICBTbWFsbFN0cmluZzwyMDQ4PiBUbXBTdHI7CisgIHsKKyAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtIFN0cmVhbShUbXBTdHIpOworICAgIFByaW50Q3VyU3RhY2tUcmFjZShTdHJlYW0pOworICB9CisgIAorICBpZiAoIVRtcFN0ci5lbXB0eSgpKSB7CisjaWZuZGVmIEhBVkVfQ1JBU0hSRVBPUlRFUkNMSUVOVF9ICisgICAgX19jcmFzaHJlcG9ydGVyX2luZm9fXyA9IHN0cmR1cChzdGQ6OnN0cmluZyhUbXBTdHIuc3RyKCkpLmNfc3RyKCkpOworI2Vsc2UKKyAgICAvLyBDYXN0IHRvIHZvaWQgdG8gYXZvaWQgd2FybmluZy4KKyAgICAodm9pZClDUlNldENyYXNoTG9nTWVzc2FnZShzdGQ6OnN0cmluZyhUbXBTdHIuc3RyKCkpLmNfc3RyKCkpOworI2VuZGlmCisgICAgZXJycygpIDw8IFRtcFN0ci5zdHIoKTsKKyAgfQorICAKKyNlbmRpZgorfQorCitzdGF0aWMgYm9vbCBSZWdpc3RlckNyYXNoUHJpbnRlcigpIHsKKyAgaWYgKCFEaXNhYmxlUHJldHR5U3RhY2tUcmFjZSkKKyAgICBzeXM6OkFkZFNpZ25hbEhhbmRsZXIoQ3Jhc2hIYW5kbGVyLCAwKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitQcmV0dHlTdGFja1RyYWNlRW50cnk6OlByZXR0eVN0YWNrVHJhY2VFbnRyeSgpIHsKKyAgLy8gVGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQsIHdlIHJlZ2lzdGVyIHRoZSBjcmFzaCBwcmludGVyLgorICBzdGF0aWMgYm9vbCBIYW5kbGVyUmVnaXN0ZXJlZCA9IFJlZ2lzdGVyQ3Jhc2hQcmludGVyKCk7CisgIEhhbmRsZXJSZWdpc3RlcmVkID0gSGFuZGxlclJlZ2lzdGVyZWQ7CisgICAgCisgIC8vIExpbmsgb3Vyc2VsdmVzLgorICBOZXh0RW50cnkgPSBQcmV0dHlTdGFja1RyYWNlSGVhZC5nZXQoKTsKKyAgUHJldHR5U3RhY2tUcmFjZUhlYWQuc2V0KHRoaXMpOworfQorCitQcmV0dHlTdGFja1RyYWNlRW50cnk6On5QcmV0dHlTdGFja1RyYWNlRW50cnkoKSB7CisgIGFzc2VydChQcmV0dHlTdGFja1RyYWNlSGVhZC5nZXQoKSA9PSB0aGlzICYmCisgICAgICAgICAiUHJldHR5IHN0YWNrIHRyYWNlIGVudHJ5IGRlc3RydWN0aW9uIGlzIG91dCBvZiBvcmRlciIpOworICBQcmV0dHlTdGFja1RyYWNlSGVhZC5zZXQoZ2V0TmV4dEVudHJ5KCkpOworfQorCit2b2lkIFByZXR0eVN0YWNrVHJhY2VTdHJpbmc6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBPUyA8PCBTdHIgPDwgIlxuIjsKK30KKwordm9pZCBQcmV0dHlTdGFja1RyYWNlUHJvZ3JhbTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICJQcm9ncmFtIGFyZ3VtZW50czogIjsKKyAgLy8gUHJpbnQgdGhlIGFyZ3VtZW50IGxpc3QuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdDOyBpICE9IGU7ICsraSkKKyAgICBPUyA8PCBBcmdWW2ldIDw8ICcgJzsKKyAgT1MgPDwgJ1xuJzsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvU21hbGxQdHJTZXQuY3BwIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvU21hbGxQdHJTZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNGU2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9TbWFsbFB0clNldC5jcHAKQEAgLTAsMCArMSwyMjYgQEAKKy8vPT09LSBsbHZtL0FEVC9TbWFsbFB0clNldC5jcHAgLSAnTm9ybWFsbHkgc21hbGwnIHBvaW50ZXIgc2V0IC0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNtYWxsUHRyU2V0IGNsYXNzLiAgU2VlIFNtYWxsUHRyU2V0LmggZm9yIGFuCisvLyBvdmVydmlldyBvZiB0aGUgYWxnb3JpdGhtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3ZvaWQgU21hbGxQdHJTZXRJbXBsOjpzaHJpbmtfYW5kX2NsZWFyKCkgeworICBhc3NlcnQoIWlzU21hbGwoKSAmJiAiQ2FuJ3Qgc2hyaW5rIGEgc21hbGwgc2V0ISIpOworICBmcmVlKEN1ckFycmF5KTsKKworICAvLyBSZWR1Y2UgdGhlIG51bWJlciBvZiBidWNrZXRzLgorICBDdXJBcnJheVNpemUgPSBOdW1FbGVtZW50cyA+IDE2ID8gMSA8PCAoTG9nMl8zMl9DZWlsKE51bUVsZW1lbnRzKSArIDEpIDogMzI7CisgIE51bUVsZW1lbnRzID0gTnVtVG9tYnN0b25lcyA9IDA7CisKKyAgLy8gSW5zdGFsbCB0aGUgbmV3IGFycmF5LiAgQ2xlYXIgYWxsIHRoZSBidWNrZXRzIHRvIGVtcHR5LgorICBDdXJBcnJheSA9IChjb25zdCB2b2lkKiopbWFsbG9jKHNpemVvZih2b2lkKikgKiAoQ3VyQXJyYXlTaXplKzEpKTsKKyAgYXNzZXJ0KEN1ckFycmF5ICYmICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5PyIpOworICBtZW1zZXQoQ3VyQXJyYXksIC0xLCBDdXJBcnJheVNpemUqc2l6ZW9mKHZvaWQqKSk7CisgIAorICAvLyBUaGUgZW5kIHBvaW50ZXIsIGFsd2F5cyB2YWxpZCwgaXMgc2V0IHRvIGEgdmFsaWQgZWxlbWVudCB0byBoZWxwIHRoZQorICAvLyBpdGVyYXRvci4KKyAgQ3VyQXJyYXlbQ3VyQXJyYXlTaXplXSA9IDA7Cit9CisKK2Jvb2wgU21hbGxQdHJTZXRJbXBsOjppbnNlcnRfaW1wKGNvbnN0IHZvaWQgKiBQdHIpIHsKKyAgaWYgKGlzU21hbGwoKSkgeworICAgIC8vIENoZWNrIHRvIHNlZSBpZiBpdCBpcyBhbHJlYWR5IGluIHRoZSBzZXQuCisgICAgZm9yIChjb25zdCB2b2lkICoqQVB0ciA9IFNtYWxsQXJyYXksICoqRSA9IFNtYWxsQXJyYXkrTnVtRWxlbWVudHM7CisgICAgICAgICBBUHRyICE9IEU7ICsrQVB0cikKKyAgICAgIGlmICgqQVB0ciA9PSBQdHIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAvLyBOb3BlLCB0aGVyZSBpc24ndC4gIElmIHdlIHN0YXkgc21hbGwsIGp1c3QgJ3B1c2hiYWNrJyBub3cuCisgICAgaWYgKE51bUVsZW1lbnRzIDwgQ3VyQXJyYXlTaXplLTEpIHsKKyAgICAgIFNtYWxsQXJyYXlbTnVtRWxlbWVudHMrK10gPSBQdHI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gT3RoZXJ3aXNlLCBoaXQgdGhlIGJpZyBzZXQgY2FzZSwgd2hpY2ggd2lsbCBjYWxsIGdyb3cuCisgIH0KKyAgCisgIC8vIElmIG1vcmUgdGhhbiAzLzQgb2YgdGhlIGFycmF5IGlzIGZ1bGwsIGdyb3cuCisgIGlmIChOdW1FbGVtZW50cyo0ID49IEN1ckFycmF5U2l6ZSozIHx8CisgICAgICBDdXJBcnJheVNpemUtKE51bUVsZW1lbnRzK051bVRvbWJzdG9uZXMpIDwgQ3VyQXJyYXlTaXplLzgpCisgICAgR3JvdygpOworICAKKyAgLy8gT2theSwgd2Uga25vdyB3ZSBoYXZlIHNwYWNlLiAgRmluZCBhIGhhc2ggYnVja2V0LgorICBjb25zdCB2b2lkICoqQnVja2V0ID0gY29uc3RfY2FzdDxjb25zdCB2b2lkKio+KEZpbmRCdWNrZXRGb3IoUHRyKSk7CisgIGlmICgqQnVja2V0ID09IFB0cikgcmV0dXJuIGZhbHNlOyAvLyBBbHJlYWR5IGluc2VydGVkLCBnb29kLgorICAKKyAgLy8gT3RoZXJ3aXNlLCBpbnNlcnQgaXQhCisgIGlmICgqQnVja2V0ID09IGdldFRvbWJzdG9uZU1hcmtlcigpKQorICAgIC0tTnVtVG9tYnN0b25lczsKKyAgKkJ1Y2tldCA9IFB0cjsKKyAgKytOdW1FbGVtZW50czsgIC8vIFRyYWNrIGRlbnNpdHkuCisgIHJldHVybiB0cnVlOworfQorCitib29sIFNtYWxsUHRyU2V0SW1wbDo6ZXJhc2VfaW1wKGNvbnN0IHZvaWQgKiBQdHIpIHsKKyAgaWYgKGlzU21hbGwoKSkgeworICAgIC8vIENoZWNrIHRvIHNlZSBpZiBpdCBpcyBpbiB0aGUgc2V0LgorICAgIGZvciAoY29uc3Qgdm9pZCAqKkFQdHIgPSBTbWFsbEFycmF5LCAqKkUgPSBTbWFsbEFycmF5K051bUVsZW1lbnRzOworICAgICAgICAgQVB0ciAhPSBFOyArK0FQdHIpCisgICAgICBpZiAoKkFQdHIgPT0gUHRyKSB7CisgICAgICAgIC8vIElmIGl0IGlzIGluIHRoZSBzZXQsIHJlcGxhY2UgdGhpcyBlbGVtZW50LgorICAgICAgICAqQVB0ciA9IEVbLTFdOworICAgICAgICBFWy0xXSA9IGdldEVtcHR5TWFya2VyKCk7CisgICAgICAgIC0tTnVtRWxlbWVudHM7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIAorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgLy8gT2theSwgd2Uga25vdyB3ZSBoYXZlIHNwYWNlLiAgRmluZCBhIGhhc2ggYnVja2V0LgorICB2b2lkICoqQnVja2V0ID0gY29uc3RfY2FzdDx2b2lkKio+KEZpbmRCdWNrZXRGb3IoUHRyKSk7CisgIGlmICgqQnVja2V0ICE9IFB0cikgcmV0dXJuIGZhbHNlOyAgLy8gTm90IGluIHRoZSBzZXQ/CisKKyAgLy8gU2V0IHRoaXMgYXMgYSB0b21ic3RvbmUuCisgICpCdWNrZXQgPSBnZXRUb21ic3RvbmVNYXJrZXIoKTsKKyAgLS1OdW1FbGVtZW50czsKKyAgKytOdW1Ub21ic3RvbmVzOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3Qgdm9pZCAqIGNvbnN0ICpTbWFsbFB0clNldEltcGw6OkZpbmRCdWNrZXRGb3IoY29uc3Qgdm9pZCAqUHRyKSBjb25zdCB7CisgIHVuc2lnbmVkIEJ1Y2tldCA9IEhhc2goUHRyKTsKKyAgdW5zaWduZWQgQXJyYXlTaXplID0gQ3VyQXJyYXlTaXplOworICB1bnNpZ25lZCBQcm9iZUFtdCA9IDE7CisgIGNvbnN0IHZvaWQgKmNvbnN0ICpBcnJheSA9IEN1ckFycmF5OworICBjb25zdCB2b2lkICpjb25zdCAqVG9tYnN0b25lID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICAvLyBGb3VuZCBQdHIncyBidWNrZXQ/CisgICAgaWYgKEFycmF5W0J1Y2tldF0gPT0gUHRyKQorICAgICAgcmV0dXJuIEFycmF5K0J1Y2tldDsKKyAgICAKKyAgICAvLyBJZiB3ZSBmb3VuZCBhbiBlbXB0eSBidWNrZXQsIHRoZSBwb2ludGVyIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHNldC4KKyAgICAvLyBSZXR1cm4gYSB0b21ic3RvbmUgaWYgd2UndmUgc2VlbiBvbmUgc28gZmFyLCBvciB0aGUgZW1wdHkgYnVja2V0IGlmCisgICAgLy8gbm90LgorICAgIGlmIChBcnJheVtCdWNrZXRdID09IGdldEVtcHR5TWFya2VyKCkpCisgICAgICByZXR1cm4gVG9tYnN0b25lID8gVG9tYnN0b25lIDogQXJyYXkrQnVja2V0OworICAgIAorICAgIC8vIElmIHRoaXMgaXMgYSB0b21ic3RvbmUsIHJlbWVtYmVyIGl0LiAgSWYgUHRyIGVuZHMgdXAgbm90IGluIHRoZSBzZXQsIHdlCisgICAgLy8gcHJlZmVyIHRvIHJldHVybiBpdCB0aGFuIHNvbWV0aGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgbW9yZSBwcm9iaW5nLgorICAgIGlmIChBcnJheVtCdWNrZXRdID09IGdldFRvbWJzdG9uZU1hcmtlcigpICYmICFUb21ic3RvbmUpCisgICAgICBUb21ic3RvbmUgPSBBcnJheStCdWNrZXQ7ICAvLyBSZW1lbWJlciB0aGUgZmlyc3QgdG9tYnN0b25lIGZvdW5kLgorICAgIAorICAgIC8vIEl0J3MgYSBoYXNoIGNvbGxpc2lvbiBvciBhIHRvbWJzdG9uZS4gUmVwcm9iZS4KKyAgICBCdWNrZXQgPSAoQnVja2V0ICsgUHJvYmVBbXQrKykgJiAoQXJyYXlTaXplLTEpOworICB9Cit9CisKKy8vLyBHcm93IC0gQWxsb2NhdGUgYSBsYXJnZXIgYmFja2luZyBzdG9yZSBmb3IgdGhlIGJ1Y2tldHMgYW5kIG1vdmUgaXQgb3Zlci4KKy8vLwordm9pZCBTbWFsbFB0clNldEltcGw6Okdyb3coKSB7CisgIC8vIEFsbG9jYXRlIGF0IHR3aWNlIGFzIG1hbnkgYnVja2V0cywgYnV0IGF0IGxlYXN0IDEyOC4KKyAgdW5zaWduZWQgT2xkU2l6ZSA9IEN1ckFycmF5U2l6ZTsKKyAgdW5zaWduZWQgTmV3U2l6ZSA9IE9sZFNpemUgPCA2NCA/IDEyOCA6IE9sZFNpemUqMjsKKyAgCisgIGNvbnN0IHZvaWQgKipPbGRCdWNrZXRzID0gQ3VyQXJyYXk7CisgIGJvb2wgV2FzU21hbGwgPSBpc1NtYWxsKCk7CisgIAorICAvLyBJbnN0YWxsIHRoZSBuZXcgYXJyYXkuICBDbGVhciBhbGwgdGhlIGJ1Y2tldHMgdG8gZW1wdHkuCisgIEN1ckFycmF5ID0gKGNvbnN0IHZvaWQqKiltYWxsb2Moc2l6ZW9mKHZvaWQqKSAqIChOZXdTaXplKzEpKTsKKyAgYXNzZXJ0KEN1ckFycmF5ICYmICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5PyIpOworICBDdXJBcnJheVNpemUgPSBOZXdTaXplOworICBtZW1zZXQoQ3VyQXJyYXksIC0xLCBOZXdTaXplKnNpemVvZih2b2lkKikpOworICAKKyAgLy8gVGhlIGVuZCBwb2ludGVyLCBhbHdheXMgdmFsaWQsIGlzIHNldCB0byBhIHZhbGlkIGVsZW1lbnQgdG8gaGVscCB0aGUKKyAgLy8gaXRlcmF0b3IuCisgIEN1ckFycmF5W05ld1NpemVdID0gMDsKKyAgCisgIC8vIENvcHkgb3ZlciBhbGwgdGhlIGVsZW1lbnRzLgorICBpZiAoV2FzU21hbGwpIHsKKyAgICAvLyBTbWFsbCBzZXRzIHN0b3JlIHRoZWlyIGVsZW1lbnRzIGluIG9yZGVyLgorICAgIGZvciAoY29uc3Qgdm9pZCAqKkJ1Y2tldFB0ciA9IE9sZEJ1Y2tldHMsICoqRSA9IE9sZEJ1Y2tldHMrTnVtRWxlbWVudHM7CisgICAgICAgICBCdWNrZXRQdHIgIT0gRTsgKytCdWNrZXRQdHIpIHsKKyAgICAgIGNvbnN0IHZvaWQgKkVsdCA9ICpCdWNrZXRQdHI7CisgICAgICAqY29uc3RfY2FzdDx2b2lkKio+KEZpbmRCdWNrZXRGb3IoRWx0KSkgPSBjb25zdF9jYXN0PHZvaWQqPihFbHQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBDb3B5IG92ZXIgYWxsIHZhbGlkIGVudHJpZXMuCisgICAgZm9yIChjb25zdCB2b2lkICoqQnVja2V0UHRyID0gT2xkQnVja2V0cywgKipFID0gT2xkQnVja2V0cytPbGRTaXplOworICAgICAgICAgQnVja2V0UHRyICE9IEU7ICsrQnVja2V0UHRyKSB7CisgICAgICAvLyBDb3B5IG92ZXIgdGhlIGVsZW1lbnQgaWYgaXQgaXMgdmFsaWQuCisgICAgICBjb25zdCB2b2lkICpFbHQgPSAqQnVja2V0UHRyOworICAgICAgaWYgKEVsdCAhPSBnZXRUb21ic3RvbmVNYXJrZXIoKSAmJiBFbHQgIT0gZ2V0RW1wdHlNYXJrZXIoKSkKKyAgICAgICAgKmNvbnN0X2Nhc3Q8dm9pZCoqPihGaW5kQnVja2V0Rm9yKEVsdCkpID0gY29uc3RfY2FzdDx2b2lkKj4oRWx0KTsKKyAgICB9CisgICAgCisgICAgZnJlZShPbGRCdWNrZXRzKTsKKyAgICBOdW1Ub21ic3RvbmVzID0gMDsKKyAgfQorfQorCitTbWFsbFB0clNldEltcGw6OlNtYWxsUHRyU2V0SW1wbChjb25zdCB2b2lkICoqU21hbGxTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxQdHJTZXRJbXBsJiB0aGF0KSB7CisgIFNtYWxsQXJyYXkgPSBTbWFsbFN0b3JhZ2U7CisKKyAgLy8gSWYgd2UncmUgYmVjb21pbmcgc21hbGwsIHByZXBhcmUgdG8gaW5zZXJ0IGludG8gb3VyIHN0YWNrIHNwYWNlCisgIGlmICh0aGF0LmlzU21hbGwoKSkgeworICAgIEN1ckFycmF5ID0gU21hbGxBcnJheTsKKyAgLy8gT3RoZXJ3aXNlLCBhbGxvY2F0ZSBuZXcgaGVhcCBzcGFjZSAodW5sZXNzIHdlIHdlcmUgdGhlIHNhbWUgc2l6ZSkKKyAgfSBlbHNlIHsKKyAgICBDdXJBcnJheSA9IChjb25zdCB2b2lkKiopbWFsbG9jKHNpemVvZih2b2lkKikgKiAodGhhdC5DdXJBcnJheVNpemUrMSkpOworICAgIGFzc2VydChDdXJBcnJheSAmJiAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeT8iKTsKKyAgfQorICAKKyAgLy8gQ29weSBvdmVyIHRoZSBuZXcgYXJyYXkgc2l6ZQorICBDdXJBcnJheVNpemUgPSB0aGF0LkN1ckFycmF5U2l6ZTsKKworICAvLyBDb3B5IG92ZXIgdGhlIGNvbnRlbnRzIGZyb20gdGhlIG90aGVyIHNldAorICBtZW1jcHkoQ3VyQXJyYXksIHRoYXQuQ3VyQXJyYXksIHNpemVvZih2b2lkKikqKEN1ckFycmF5U2l6ZSsxKSk7CisgIAorICBOdW1FbGVtZW50cyA9IHRoYXQuTnVtRWxlbWVudHM7CisgIE51bVRvbWJzdG9uZXMgPSB0aGF0Lk51bVRvbWJzdG9uZXM7Cit9CisKKy8vLyBDb3B5RnJvbSAtIGltcGxlbWVudCBvcGVyYXRvcj0gZnJvbSBhIHNtYWxscHRyc2V0IHRoYXQgaGFzIHRoZSBzYW1lIHBvaW50ZXIKKy8vLyB0eXBlLCBidXQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgc21hbGwgc2l6ZS4KK3ZvaWQgU21hbGxQdHJTZXRJbXBsOjpDb3B5RnJvbShjb25zdCBTbWFsbFB0clNldEltcGwgJlJIUykgeworICBpZiAoaXNTbWFsbCgpICYmIFJIUy5pc1NtYWxsKCkpCisgICAgYXNzZXJ0KEN1ckFycmF5U2l6ZSA9PSBSSFMuQ3VyQXJyYXlTaXplICYmCisgICAgICAgICAgICJDYW5ub3QgYXNzaWduIHNldHMgd2l0aCBkaWZmZXJlbnQgc21hbGwgc2l6ZXMiKTsKKyAgICAgICAgICAgCisgIC8vIElmIHdlJ3JlIGJlY29taW5nIHNtYWxsLCBwcmVwYXJlIHRvIGluc2VydCBpbnRvIG91ciBzdGFjayBzcGFjZQorICBpZiAoUkhTLmlzU21hbGwoKSkgeworICAgIGlmICghaXNTbWFsbCgpKQorICAgICAgZnJlZShDdXJBcnJheSk7CisgICAgQ3VyQXJyYXkgPSBTbWFsbEFycmF5OworICAvLyBPdGhlcndpc2UsIGFsbG9jYXRlIG5ldyBoZWFwIHNwYWNlICh1bmxlc3Mgd2Ugd2VyZSB0aGUgc2FtZSBzaXplKQorICB9IGVsc2UgaWYgKEN1ckFycmF5U2l6ZSAhPSBSSFMuQ3VyQXJyYXlTaXplKSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIEN1ckFycmF5ID0gKGNvbnN0IHZvaWQqKiltYWxsb2Moc2l6ZW9mKHZvaWQqKSAqIChSSFMuQ3VyQXJyYXlTaXplKzEpKTsKKyAgICBlbHNlCisgICAgICBDdXJBcnJheSA9IChjb25zdCB2b2lkKiopcmVhbGxvYyhDdXJBcnJheSwgc2l6ZW9mKHZvaWQqKSooUkhTLkN1ckFycmF5U2l6ZSsxKSk7CisgICAgYXNzZXJ0KEN1ckFycmF5ICYmICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5PyIpOworICB9CisgIAorICAvLyBDb3B5IG92ZXIgdGhlIG5ldyBhcnJheSBzaXplCisgIEN1ckFycmF5U2l6ZSA9IFJIUy5DdXJBcnJheVNpemU7CisKKyAgLy8gQ29weSBvdmVyIHRoZSBjb250ZW50cyBmcm9tIHRoZSBvdGhlciBzZXQKKyAgbWVtY3B5KEN1ckFycmF5LCBSSFMuQ3VyQXJyYXksIHNpemVvZih2b2lkKikqKEN1ckFycmF5U2l6ZSsxKSk7CisgIAorICBOdW1FbGVtZW50cyA9IFJIUy5OdW1FbGVtZW50czsKKyAgTnVtVG9tYnN0b25lcyA9IFJIUy5OdW1Ub21ic3RvbmVzOworfQorCitTbWFsbFB0clNldEltcGw6On5TbWFsbFB0clNldEltcGwoKSB7CisgIGlmICghaXNTbWFsbCgpKQorICAgIGZyZWUoQ3VyQXJyYXkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvU21hbGxWZWN0b3IuY3BwIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvU21hbGxWZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTdhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9TbWFsbFZlY3Rvci5jcHAKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tIGxsdm0vQURUL1NtYWxsVmVjdG9yLmNwcCAtICdOb3JtYWxseSBzbWFsbCcgdmVjdG9ycyAtLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU21hbGxWZWN0b3IgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIGdyb3dfcG9kIC0gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ3JvdygpIG1ldGhvZCB3aGljaCBvbmx5IHdvcmtzCisvLy8gb24gUE9ELWxpa2UgZGF0YXR5cGVzIGFuZCBpcyBvdXQgb2YgbGluZSB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbi4KK3ZvaWQgU21hbGxWZWN0b3JCYXNlOjpncm93X3BvZChzaXplX3QgTWluU2l6ZUluQnl0ZXMsIHNpemVfdCBUU2l6ZSkgeworICBzaXplX3QgQ3VyU2l6ZUJ5dGVzID0gc2l6ZV9pbl9ieXRlcygpOworICBzaXplX3QgTmV3Q2FwYWNpdHlJbkJ5dGVzID0gMiAqIGNhcGFjaXR5X2luX2J5dGVzKCk7CisgIGlmIChOZXdDYXBhY2l0eUluQnl0ZXMgPCBNaW5TaXplSW5CeXRlcykKKyAgICBOZXdDYXBhY2l0eUluQnl0ZXMgPSBNaW5TaXplSW5CeXRlczsKKworICB2b2lkICpOZXdFbHRzOworICBpZiAodGhpcy0+aXNTbWFsbCgpKSB7CisgICAgTmV3RWx0cyA9IG1hbGxvYyhOZXdDYXBhY2l0eUluQnl0ZXMpOworCisgICAgLy8gQ29weSB0aGUgZWxlbWVudHMgb3Zlci4gIE5vIG5lZWQgdG8gcnVuIGR0b3JzIG9uIFBPRHMuCisgICAgbWVtY3B5KE5ld0VsdHMsIHRoaXMtPkJlZ2luWCwgQ3VyU2l6ZUJ5dGVzKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBJZiB0aGlzIHdhc24ndCBncm93biBmcm9tIHRoZSBpbmxpbmUgY29weSwgZ3JvdyB0aGUgYWxsb2NhdGVkIHNwYWNlLgorICAgIE5ld0VsdHMgPSByZWFsbG9jKHRoaXMtPkJlZ2luWCwgTmV3Q2FwYWNpdHlJbkJ5dGVzKTsKKyAgfQorCisgIHRoaXMtPkVuZFggPSAoY2hhciopTmV3RWx0cytDdXJTaXplQnl0ZXM7CisgIHRoaXMtPkJlZ2luWCA9IE5ld0VsdHM7CisgIHRoaXMtPkNhcGFjaXR5WCA9IChjaGFyKil0aGlzLT5CZWdpblggKyBOZXdDYXBhY2l0eUluQnl0ZXM7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1NvdXJjZU1nci5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9Tb3VyY2VNZ3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNTY4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9Tb3VyY2VNZ3IuY3BwCkBAIC0wLDAgKzEsMjI5IEBACisvLz09PS0gU291cmNlTWdyLmNwcCAtIE1hbmFnZXIgZm9yIFNpbXBsZSBTb3VyY2UgQnVmZmVycyAmIERpYWdub3N0aWNzIC0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTb3VyY2VNZ3IgY2xhc3MuICBUaGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBzaW1wbGUKKy8vIHN1YnN0cmF0ZSBmb3IgZGlhZ25vc3RpY3MsICNpbmNsdWRlIGhhbmRsaW5nLCBhbmQgb3RoZXIgbG93IGxldmVsIHRoaW5ncyBmb3IKKy8vIHNpbXBsZSBwYXJzZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBMaW5lTm9DYWNoZVR5IHsKKyAgICBpbnQgTGFzdFF1ZXJ5QnVmZmVySUQ7CisgICAgY29uc3QgY2hhciAqTGFzdFF1ZXJ5OworICAgIHVuc2lnbmVkIExpbmVOb09mUXVlcnk7CisgIH07Cit9CisKK3N0YXRpYyBMaW5lTm9DYWNoZVR5ICpnZXRDYWNoZSh2b2lkICpQdHIpIHsKKyAgcmV0dXJuIChMaW5lTm9DYWNoZVR5KilQdHI7Cit9CisKKworU291cmNlTWdyOjp+U291cmNlTWdyKCkgeworICAvLyBEZWxldGUgdGhlIGxpbmUgIyBjYWNoZSBpZiBhbGxvY2F0ZWQuCisgIGlmIChMaW5lTm9DYWNoZVR5ICpDYWNoZSA9IGdldENhY2hlKExpbmVOb0NhY2hlKSkKKyAgICBkZWxldGUgQ2FjaGU7CisKKyAgd2hpbGUgKCFCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICBkZWxldGUgQnVmZmVycy5iYWNrKCkuQnVmZmVyOworICAgIEJ1ZmZlcnMucG9wX2JhY2soKTsKKyAgfQorfQorCisvLy8gQWRkSW5jbHVkZUZpbGUgLSBTZWFyY2ggZm9yIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgY3VycmVudAorLy8vIGRpcmVjdG9yeSBvciBpbiBvbmUgb2YgdGhlIEluY2x1ZGVEaXJzLiAgSWYgbm8gZmlsZSBpcyBmb3VuZCwgdGhpcyByZXR1cm5zCisvLy8gfjAsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBidWZmZXIgSUQgb2YgdGhlIHN0YWNrZWQgZmlsZS4KK3Vuc2lnbmVkIFNvdXJjZU1ncjo6QWRkSW5jbHVkZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBJbmNsdWRlTG9jKSB7CisKKyAgTWVtb3J5QnVmZmVyICpOZXdCdWYgPSBNZW1vcnlCdWZmZXI6OmdldEZpbGUoRmlsZW5hbWUuY19zdHIoKSk7CisKKyAgLy8gSWYgdGhlIGZpbGUgZGlkbid0IGV4aXN0IGRpcmVjdGx5LCBzZWUgaWYgaXQncyBpbiBhbiBpbmNsdWRlIHBhdGguCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbmNsdWRlRGlyZWN0b3JpZXMuc2l6ZSgpOyBpICE9IGUgJiYgIU5ld0J1ZjsgKytpKSB7CisgICAgc3RkOjpzdHJpbmcgSW5jRmlsZSA9IEluY2x1ZGVEaXJlY3Rvcmllc1tpXSArICIvIiArIEZpbGVuYW1lOworICAgIE5ld0J1ZiA9IE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShJbmNGaWxlLmNfc3RyKCkpOworICB9CisKKyAgaWYgKE5ld0J1ZiA9PSAwKSByZXR1cm4gfjBVOworCisgIHJldHVybiBBZGROZXdTb3VyY2VCdWZmZXIoTmV3QnVmLCBJbmNsdWRlTG9jKTsKK30KKworCisvLy8gRmluZEJ1ZmZlckNvbnRhaW5pbmdMb2MgLSBSZXR1cm4gdGhlIElEIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUKKy8vLyBzcGVjaWZpZWQgbG9jYXRpb24sIHJldHVybmluZyAtMSBpZiBub3QgZm91bmQuCitpbnQgU291cmNlTWdyOjpGaW5kQnVmZmVyQ29udGFpbmluZ0xvYyhTTUxvYyBMb2MpIGNvbnN0IHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEJ1ZmZlcnMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoTG9jLmdldFBvaW50ZXIoKSA+PSBCdWZmZXJzW2ldLkJ1ZmZlci0+Z2V0QnVmZmVyU3RhcnQoKSAmJgorICAgICAgICAvLyBVc2UgPD0gaGVyZSBzbyB0aGF0IGEgcG9pbnRlciB0byB0aGUgbnVsbCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgICAgLy8gaXMgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgYnVmZmVyLgorICAgICAgICBMb2MuZ2V0UG9pbnRlcigpIDw9IEJ1ZmZlcnNbaV0uQnVmZmVyLT5nZXRCdWZmZXJFbmQoKSkKKyAgICAgIHJldHVybiBpOworICByZXR1cm4gLTE7Cit9CisKKy8vLyBGaW5kTGluZU51bWJlciAtIEZpbmQgdGhlIGxpbmUgbnVtYmVyIGZvciB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoZQorLy8vIHNwZWNpZmllZCBmaWxlLiAgVGhpcyBpcyBub3QgYSBmYXN0IG1ldGhvZC4KK3Vuc2lnbmVkIFNvdXJjZU1ncjo6RmluZExpbmVOdW1iZXIoU01Mb2MgTG9jLCBpbnQgQnVmZmVySUQpIGNvbnN0IHsKKyAgaWYgKEJ1ZmZlcklEID09IC0xKSBCdWZmZXJJRCA9IEZpbmRCdWZmZXJDb250YWluaW5nTG9jKExvYyk7CisgIGFzc2VydChCdWZmZXJJRCAhPSAtMSAmJiAiSW52YWxpZCBMb2NhdGlvbiEiKTsKKworICBNZW1vcnlCdWZmZXIgKkJ1ZmYgPSBnZXRCdWZmZXJJbmZvKEJ1ZmZlcklEKS5CdWZmZXI7CisKKyAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBcbidzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlIGFuZCB0aGUgc3BlY2lmaWVkCisgIC8vIGxvY2F0aW9uLgorICB1bnNpZ25lZCBMaW5lTm8gPSAxOworCisgIGNvbnN0IGNoYXIgKlB0ciA9IEJ1ZmYtPmdldEJ1ZmZlclN0YXJ0KCk7CisKKyAgLy8gSWYgd2UgaGF2ZSBhIGxpbmUgbnVtYmVyIGNhY2hlLCBhbmQgaWYgdGhlIHF1ZXJ5IGlzIHRvIGEgbGF0ZXIgcG9pbnQgaW4gdGhlCisgIC8vIHNhbWUgZmlsZSwgc3RhcnQgc2VhcmNoaW5nIGZyb20gdGhlIGxhc3QgcXVlcnkgbG9jYXRpb24uICBUaGlzIG9wdGltaXplcworICAvLyBmb3IgdGhlIGNhc2Ugd2hlbiBtdWx0aXBsZSBkaWFnbm9zdGljcyBjb21lIG91dCBvZiBvbmUgZmlsZSBpbiBvcmRlci4KKyAgaWYgKExpbmVOb0NhY2hlVHkgKkNhY2hlID0gZ2V0Q2FjaGUoTGluZU5vQ2FjaGUpKQorICAgIGlmIChDYWNoZS0+TGFzdFF1ZXJ5QnVmZmVySUQgPT0gQnVmZmVySUQgJiYKKyAgICAgICAgQ2FjaGUtPkxhc3RRdWVyeSA8PSBMb2MuZ2V0UG9pbnRlcigpKSB7CisgICAgICBQdHIgPSBDYWNoZS0+TGFzdFF1ZXJ5OworICAgICAgTGluZU5vID0gQ2FjaGUtPkxpbmVOb09mUXVlcnk7CisgICAgfQorCisgIC8vIFNjYW4gZm9yIHRoZSBsb2NhdGlvbiBiZWluZyBxdWVyaWVkLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgbGluZXMKKyAgLy8gd2Ugc2VlLgorICBmb3IgKDsgU01Mb2M6OmdldEZyb21Qb2ludGVyKFB0cikgIT0gTG9jOyArK1B0cikKKyAgICBpZiAoKlB0ciA9PSAnXG4nKSArK0xpbmVObzsKKworCisgIC8vIEFsbG9jYXRlIHRoZSBsaW5lIG51bWJlciBjYWNoZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICBpZiAoTGluZU5vQ2FjaGUgPT0gMCkKKyAgICBMaW5lTm9DYWNoZSA9IG5ldyBMaW5lTm9DYWNoZVR5KCk7CisKKyAgLy8gVXBkYXRlIHRoZSBsaW5lICMgY2FjaGUuCisgIExpbmVOb0NhY2hlVHkgJkNhY2hlID0gKmdldENhY2hlKExpbmVOb0NhY2hlKTsKKyAgQ2FjaGUuTGFzdFF1ZXJ5QnVmZmVySUQgPSBCdWZmZXJJRDsKKyAgQ2FjaGUuTGFzdFF1ZXJ5ID0gUHRyOworICBDYWNoZS5MaW5lTm9PZlF1ZXJ5ID0gTGluZU5vOworICByZXR1cm4gTGluZU5vOworfQorCit2b2lkIFNvdXJjZU1ncjo6UHJpbnRJbmNsdWRlU3RhY2soU01Mb2MgSW5jbHVkZUxvYywgcmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmIChJbmNsdWRlTG9jID09IFNNTG9jKCkpIHJldHVybjsgIC8vIFRvcCBvZiBzdGFjay4KKworICBpbnQgQ3VyQnVmID0gRmluZEJ1ZmZlckNvbnRhaW5pbmdMb2MoSW5jbHVkZUxvYyk7CisgIGFzc2VydChDdXJCdWYgIT0gLTEgJiYgIkludmFsaWQgb3IgdW5zcGVjaWZpZWQgbG9jYXRpb24hIik7CisKKyAgUHJpbnRJbmNsdWRlU3RhY2soZ2V0QnVmZmVySW5mbyhDdXJCdWYpLkluY2x1ZGVMb2MsIE9TKTsKKworICBPUyA8PCAiSW5jbHVkZWQgZnJvbSAiCisgICAgIDw8IGdldEJ1ZmZlckluZm8oQ3VyQnVmKS5CdWZmZXItPmdldEJ1ZmZlcklkZW50aWZpZXIoKQorICAgICA8PCAiOiIgPDwgRmluZExpbmVOdW1iZXIoSW5jbHVkZUxvYywgQ3VyQnVmKSA8PCAiOlxuIjsKK30KKworCisvLy8gR2V0TWVzc2FnZSAtIFJldHVybiBhbiBTTURpYWdub3N0aWMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aXRoIHRoZQorLy8vIHNwZWNpZmllZCBzdHJpbmcuCisvLy8KKy8vLyBAcGFyYW0gVHlwZSAtIElmIG5vbi1udWxsLCB0aGUga2luZCBvZiBtZXNzYWdlIChlLmcuLCAiZXJyb3IiKSB3aGljaCBpcworLy8vIHByZWZpeGVkIHRvIHRoZSBtZXNzYWdlLgorU01EaWFnbm9zdGljIFNvdXJjZU1ncjo6R2V0TWVzc2FnZShTTUxvYyBMb2MsIGNvbnN0IHN0ZDo6c3RyaW5nICZNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlR5cGUsIGJvb2wgU2hvd0xpbmUpIGNvbnN0IHsKKworICAvLyBGaXJzdCB0aGluZyB0byBkbzogZmluZCB0aGUgY3VycmVudCBidWZmZXIgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkCisgIC8vIGxvY2F0aW9uLgorICBpbnQgQ3VyQnVmID0gRmluZEJ1ZmZlckNvbnRhaW5pbmdMb2MoTG9jKTsKKyAgYXNzZXJ0KEN1ckJ1ZiAhPSAtMSAmJiAiSW52YWxpZCBvciB1bnNwZWNpZmllZCBsb2NhdGlvbiEiKTsKKworICBNZW1vcnlCdWZmZXIgKkN1ck1CID0gZ2V0QnVmZmVySW5mbyhDdXJCdWYpLkJ1ZmZlcjsKKworICAvLyBTY2FuIGJhY2t3YXJkIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgorICBjb25zdCBjaGFyICpMaW5lU3RhcnQgPSBMb2MuZ2V0UG9pbnRlcigpOworICB3aGlsZSAoTGluZVN0YXJ0ICE9IEN1ck1CLT5nZXRCdWZmZXJTdGFydCgpICYmCisgICAgICAgICBMaW5lU3RhcnRbLTFdICE9ICdcbicgJiYgTGluZVN0YXJ0Wy0xXSAhPSAnXHInKQorICAgIC0tTGluZVN0YXJ0OworCisgIHN0ZDo6c3RyaW5nIExpbmVTdHI7CisgIGlmIChTaG93TGluZSkgeworICAgIC8vIEdldCB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICAgIGNvbnN0IGNoYXIgKkxpbmVFbmQgPSBMb2MuZ2V0UG9pbnRlcigpOworICAgIHdoaWxlIChMaW5lRW5kICE9IEN1ck1CLT5nZXRCdWZmZXJFbmQoKSAmJgorICAgICAgICAgICBMaW5lRW5kWzBdICE9ICdcbicgJiYgTGluZUVuZFswXSAhPSAnXHInKQorICAgICAgKytMaW5lRW5kOworICAgIExpbmVTdHIgPSBzdGQ6OnN0cmluZyhMaW5lU3RhcnQsIExpbmVFbmQpOworICB9CisKKyAgc3RkOjpzdHJpbmcgUHJpbnRlZE1zZzsKKyAgaWYgKFR5cGUpIHsKKyAgICBQcmludGVkTXNnID0gVHlwZTsKKyAgICBQcmludGVkTXNnICs9ICI6ICI7CisgIH0KKyAgUHJpbnRlZE1zZyArPSBNc2c7CisKKyAgcmV0dXJuIFNNRGlhZ25vc3RpYygqdGhpcywgTG9jLAorICAgICAgICAgICAgICAgICAgICAgIEN1ck1CLT5nZXRCdWZmZXJJZGVudGlmaWVyKCksIEZpbmRMaW5lTnVtYmVyKExvYywgQ3VyQnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICBMb2MuZ2V0UG9pbnRlcigpLUxpbmVTdGFydCwgUHJpbnRlZE1zZywKKyAgICAgICAgICAgICAgICAgICAgICBMaW5lU3RyLCBTaG93TGluZSk7Cit9CisKK3ZvaWQgU291cmNlTWdyOjpQcmludE1lc3NhZ2UoU01Mb2MgTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpUeXBlLCBib29sIFNob3dMaW5lKSBjb25zdCB7CisgIC8vIFJlcG9ydCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBkaWFnbm9zdGljIGhhbmRsZXIgaWYgcHJlc2VudC4KKyAgaWYgKERpYWdIYW5kbGVyKSB7CisgICAgRGlhZ0hhbmRsZXIoR2V0TWVzc2FnZShMb2MsIE1zZywgVHlwZSwgU2hvd0xpbmUpLAorICAgICAgICAgICAgICAgIERpYWdDb250ZXh0LCBEaWFnTG9jQ29va2llKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIHJhd19vc3RyZWFtICZPUyA9IGVycnMoKTsKKworICBpbnQgQ3VyQnVmID0gRmluZEJ1ZmZlckNvbnRhaW5pbmdMb2MoTG9jKTsKKyAgYXNzZXJ0KEN1ckJ1ZiAhPSAtMSAmJiAiSW52YWxpZCBvciB1bnNwZWNpZmllZCBsb2NhdGlvbiEiKTsKKyAgUHJpbnRJbmNsdWRlU3RhY2soZ2V0QnVmZmVySW5mbyhDdXJCdWYpLkluY2x1ZGVMb2MsIE9TKTsKKworICBHZXRNZXNzYWdlKExvYywgTXNnLCBUeXBlLCBTaG93TGluZSkuUHJpbnQoMCwgT1MpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU01EaWFnbm9zdGljIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIFNNRGlhZ25vc3RpYzo6UHJpbnQoY29uc3QgY2hhciAqUHJvZ05hbWUsIHJhd19vc3RyZWFtICZTKSBjb25zdCB7CisgIGlmIChQcm9nTmFtZSAmJiBQcm9nTmFtZVswXSkKKyAgICBTIDw8IFByb2dOYW1lIDw8ICI6ICI7CisKKyAgaWYgKCFGaWxlbmFtZS5lbXB0eSgpKSB7CisgICAgaWYgKEZpbGVuYW1lID09ICItIikKKyAgICAgIFMgPDwgIjxzdGRpbj4iOworICAgIGVsc2UKKyAgICAgIFMgPDwgRmlsZW5hbWU7CisKKyAgICBpZiAoTGluZU5vICE9IC0xKSB7CisgICAgICBTIDw8ICc6JyA8PCBMaW5lTm87CisgICAgICBpZiAoQ29sdW1uTm8gIT0gLTEpCisgICAgICAgIFMgPDwgJzonIDw8IChDb2x1bW5ObysxKTsKKyAgICB9CisgICAgUyA8PCAiOiAiOworICB9CisKKyAgUyA8PCBNZXNzYWdlIDw8ICdcbic7CisKKyAgaWYgKExpbmVObyAhPSAtMSAmJiBDb2x1bW5ObyAhPSAtMSAmJiBTaG93TGluZSkgeworICAgIFMgPDwgTGluZUNvbnRlbnRzIDw8ICdcbic7CisKKyAgICAvLyBQcmludCBvdXQgc3BhY2VzL3RhYnMgYmVmb3JlIHRoZSBjYXJldC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHVuc2lnbmVkKENvbHVtbk5vKTsgKytpKQorICAgICAgUyA8PCAoTGluZUNvbnRlbnRzW2ldID09ICdcdCcgPyAnXHQnIDogJyAnKTsKKyAgICBTIDw8ICJeXG4iOworICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvU3RhdGlzdGljLmNwcCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1N0YXRpc3RpYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1ZjY1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1N0YXRpc3RpYy5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8vPT09LS0gU3RhdGlzdGljLmNwcCAtIEVhc3kgd2F5IHRvIGV4cG9zZSBzdGF0cyBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlICdTdGF0aXN0aWMnIGNsYXNzLCB3aGljaCBpcyBkZXNpZ25lZCB0byBiZSBhbiBlYXN5CisvLyB3YXkgdG8gZXhwb3NlIHZhcmlvdXMgc3VjY2VzcyBtZXRyaWNzIGZyb20gcGFzc2VzLiAgVGhlc2Ugc3RhdGlzdGljcyBhcmUKKy8vIHByaW50ZWQgYXQgdGhlIGVuZCBvZiBhIHJ1biwgd2hlbiB0aGUgLXN0YXRzIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZW5hYmxlZAorLy8gb24gdGhlIGNvbW1hbmQgbGluZS4KKy8vCisvLyBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVwb3J0aW5nIGluZm9ybWF0aW9uIGxpa2UgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMKKy8vIHNpbXBsaWZpZWQsIG9wdGltaXplZCBvciByZW1vdmVkIGJ5IHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zLCBsaWtlIHRoaXM6CisvLworLy8gc3RhdGljIFN0YXRpc3RpYyBOdW1JbnN0RWxpbWluYXRlZCgiR0NTRSIsICJOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGtpbGxlZCIpOworLy8KKy8vIExhdGVyLCBpbiB0aGUgY29kZTogKytOdW1JbnN0RWxpbWluYXRlZDsKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NdXRleC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RyaW5nPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIENyZWF0ZUluZm9PdXRwdXRGaWxlIC0gUmV0dXJuIGEgZmlsZSBzdHJlYW0gdG8gcHJpbnQgb3VyIG91dHB1dCBvbi4KK25hbWVzcGFjZSBsbHZtIHsgZXh0ZXJuIHJhd19vc3RyZWFtICpDcmVhdGVJbmZvT3V0cHV0RmlsZSgpOyB9CisKKy8vLyAtc3RhdHMgLSBDb21tYW5kIGxpbmUgb3B0aW9uIHRvIGNhdXNlIHRyYW5zZm9ybWF0aW9ucyB0byBlbWl0IHN0YXRzIGFib3V0CisvLy8gd2hhdCB0aGV5IGRpZC4KKy8vLworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0VuYWJsZWQoInN0YXRzIiwgY2w6OmRlc2MoIkVuYWJsZSBzdGF0aXN0aWNzIG91dHB1dCBmcm9tIHByb2dyYW0iKSk7CisKKworbmFtZXNwYWNlIHsKKy8vLyBTdGF0aXN0aWNJbmZvIC0gVGhpcyBjbGFzcyBpcyB1c2VkIGluIGEgTWFuYWdlZFN0YXRpYyBzbyB0aGF0IGl0IGlzIGNyZWF0ZWQKKy8vLyBvbiBkZW1hbmQgKHdoZW4gdGhlIGZpcnN0IHN0YXRpc3RpYyBpcyBidW1wZWQpIGFuZCBkZXN0cm95ZWQgb25seSB3aGVuIAorLy8vIGxsdm1fc2h1dGRvd24gaXMgY2FsbGVkLiAgV2UgcHJpbnQgc3RhdGlzdGljcyBmcm9tIHRoZSBkZXN0cnVjdG9yLgorY2xhc3MgU3RhdGlzdGljSW5mbyB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IFN0YXRpc3RpYyo+IFN0YXRzOworICBmcmllbmQgdm9pZCBsbHZtOjpQcmludFN0YXRpc3RpY3MoKTsKKyAgZnJpZW5kIHZvaWQgbGx2bTo6UHJpbnRTdGF0aXN0aWNzKHJhd19vc3RyZWFtICZPUyk7CitwdWJsaWM6CisgIH5TdGF0aXN0aWNJbmZvKCk7CisgIAorICB2b2lkIGFkZFN0YXRpc3RpYyhjb25zdCBTdGF0aXN0aWMgKlMpIHsKKyAgICBTdGF0cy5wdXNoX2JhY2soUyk7CisgIH0KK307Cit9CisKK3N0YXRpYyBNYW5hZ2VkU3RhdGljPFN0YXRpc3RpY0luZm8+IFN0YXRJbmZvOworc3RhdGljIE1hbmFnZWRTdGF0aWM8c3lzOjpTbWFydE11dGV4PHRydWU+ID4gU3RhdExvY2s7CisKKy8vLyBSZWdpc3RlclN0YXRpc3RpYyAtIFRoZSBmaXJzdCB0aW1lIGEgc3RhdGlzdGljIGlzIGJ1bXBlZCwgdGhpcyBtZXRob2QgaXMKKy8vLyBjYWxsZWQuCit2b2lkIFN0YXRpc3RpYzo6UmVnaXN0ZXJTdGF0aXN0aWMoKSB7CisgIC8vIElmIHN0YXRzIGFyZSBlbmFibGVkLCBpbmZvcm0gU3RhdEluZm8gdGhhdCB0aGlzIHN0YXRpc3RpYyBzaG91bGQgYmUKKyAgLy8gcHJpbnRlZC4KKyAgc3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gV3JpdGVyKCpTdGF0TG9jayk7CisgIGlmICghSW5pdGlhbGl6ZWQpIHsKKyAgICBpZiAoRW5hYmxlZCkKKyAgICAgIFN0YXRJbmZvLT5hZGRTdGF0aXN0aWModGhpcyk7CisgICAgCisgICAgc3lzOjpNZW1vcnlGZW5jZSgpOworICAgIC8vIFJlbWVtYmVyIHdlIGhhdmUgYmVlbiByZWdpc3RlcmVkLgorICAgIEluaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorfQorCituYW1lc3BhY2UgeworCitzdHJ1Y3QgTmFtZUNvbXBhcmUgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgU3RhdGlzdGljICpMSFMsIGNvbnN0IFN0YXRpc3RpYyAqUkhTKSBjb25zdCB7CisgICAgaW50IENtcCA9IHN0ZDo6c3RyY21wKExIUy0+Z2V0TmFtZSgpLCBSSFMtPmdldE5hbWUoKSk7CisgICAgaWYgKENtcCAhPSAwKSByZXR1cm4gQ21wIDwgMDsKKyAgICAKKyAgICAvLyBTZWNvbmRhcnkga2V5IGlzIHRoZSBkZXNjcmlwdGlvbi4KKyAgICByZXR1cm4gc3RkOjpzdHJjbXAoTEhTLT5nZXREZXNjKCksIFJIUy0+Z2V0RGVzYygpKSA8IDA7CisgIH0KK307CisKK30KKworLy8gUHJpbnQgaW5mb3JtYXRpb24gd2hlbiBkZXN0cm95ZWQsIGlmZiBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIHNwZWNpZmllZC4KK1N0YXRpc3RpY0luZm86On5TdGF0aXN0aWNJbmZvKCkgeworICBsbHZtOjpQcmludFN0YXRpc3RpY3MoKTsKK30KKwordm9pZCBsbHZtOjpFbmFibGVTdGF0aXN0aWNzKCkgeworICBFbmFibGVkLnNldFZhbHVlKHRydWUpOworfQorCit2b2lkIGxsdm06OlByaW50U3RhdGlzdGljcyhyYXdfb3N0cmVhbSAmT1MpIHsKKyAgU3RhdGlzdGljSW5mbyAmU3RhdHMgPSAqU3RhdEluZm87CisKKyAgLy8gRmlndXJlIG91dCBob3cgbG9uZyB0aGUgYmlnZ2VzdCBWYWx1ZSBhbmQgTmFtZSBmaWVsZHMgYXJlLgorICB1bnNpZ25lZCBNYXhOYW1lTGVuID0gMCwgTWF4VmFsTGVuID0gMDsKKyAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBTdGF0cy5TdGF0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWF4VmFsTGVuID0gc3RkOjptYXgoTWF4VmFsTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCl1dG9zdHIoU3RhdHMuU3RhdHNbaV0tPmdldFZhbHVlKCkpLnNpemUoKSk7CisgICAgTWF4TmFtZUxlbiA9IHN0ZDo6bWF4KE1heE5hbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClzdGQ6OnN0cmxlbihTdGF0cy5TdGF0c1tpXS0+Z2V0TmFtZSgpKSk7CisgIH0KKyAgCisgIC8vIFNvcnQgdGhlIGZpZWxkcyBieSBuYW1lLgorICBzdGQ6OnN0YWJsZV9zb3J0KFN0YXRzLlN0YXRzLmJlZ2luKCksIFN0YXRzLlN0YXRzLmVuZCgpLCBOYW1lQ29tcGFyZSgpKTsKKworICAvLyBQcmludCBvdXQgdGhlIHN0YXRpc3RpY3MgaGVhZGVyLi4uCisgIE9TIDw8ICI9PT0iIDw8IHN0ZDo6c3RyaW5nKDczLCAnLScpIDw8ICI9PT1cbiIKKyAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uIFN0YXRpc3RpY3MgQ29sbGVjdGVkIC4uLlxuIgorICAgICA8PCAiPT09IiA8PCBzdGQ6OnN0cmluZyg3MywgJy0nKSA8PCAiPT09XG5cbiI7CisgIAorICAvLyBQcmludCBhbGwgb2YgdGhlIHN0YXRpc3RpY3MuCisgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gU3RhdHMuU3RhdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHN0ZDo6c3RyaW5nIENvdW50U3RyID0gdXRvc3RyKFN0YXRzLlN0YXRzW2ldLT5nZXRWYWx1ZSgpKTsKKyAgICBPUyA8PCBzdGQ6OnN0cmluZyhNYXhWYWxMZW4tQ291bnRTdHIuc2l6ZSgpLCAnICcpCisgICAgICAgPDwgQ291bnRTdHIgPDwgIiAiIDw8IFN0YXRzLlN0YXRzW2ldLT5nZXROYW1lKCkKKyAgICAgICA8PCBzdGQ6OnN0cmluZyhNYXhOYW1lTGVuLXN0ZDo6c3RybGVuKFN0YXRzLlN0YXRzW2ldLT5nZXROYW1lKCkpLCAnICcpCisgICAgICAgPDwgIiAtICIgPDwgU3RhdHMuU3RhdHNbaV0tPmdldERlc2MoKSA8PCAiXG4iOworICB9CisgIAorICBPUyA8PCAnXG4nOyAgLy8gRmx1c2ggdGhlIG91dHB1dCBzdHJlYW0uCisgIE9TLmZsdXNoKCk7CisKK30KKwordm9pZCBsbHZtOjpQcmludFN0YXRpc3RpY3MoKSB7CisgIFN0YXRpc3RpY0luZm8gJlN0YXRzID0gKlN0YXRJbmZvOworCisgIC8vIFN0YXRpc3RpY3Mgbm90IGVuYWJsZWQ/CisgIGlmIChTdGF0cy5TdGF0cy5lbXB0eSgpKSByZXR1cm47CisKKyAgLy8gR2V0IHRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgIHJhd19vc3RyZWFtICZPdXRTdHJlYW0gPSAqQ3JlYXRlSW5mb091dHB1dEZpbGUoKTsKKyAgUHJpbnRTdGF0aXN0aWNzKE91dFN0cmVhbSk7CisgIGRlbGV0ZSAmT3V0U3RyZWFtOyAgIC8vIENsb3NlIHRoZSBmaWxlLgorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvU3RyaW5nRXh0cmFzLmNwcCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1N0cmluZ0V4dHJhcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyZmEwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1N0cmluZ0V4dHJhcy5jcHAKQEAgLTAsMCArMSw4MSBAQAorLy89PT0tLSBTdHJpbmdFeHRyYXMuY3BwIC0gSW1wbGVtZW50IHRoZSBTdHJpbmdFeHRyYXMgaGVhZGVyIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU3RyaW5nRXh0cmFzLmggaGVhZGVyCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIFN0ckluU3RyTm9DYXNlIC0gUG9ydGFibGUgdmVyc2lvbiBvZiBzdHJjYXNlc3RyLiAgTG9jYXRlcyB0aGUgZmlyc3QKKy8vLyBvY2N1cnJlbmNlIG9mIHN0cmluZyAnczEnIGluIHN0cmluZyAnczInLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucworLy8vIHRoZSBvZmZzZXQgb2YgczIgaW4gczEgb3IgbnBvcyBpZiBzMiBjYW5ub3QgYmUgZm91bmQuCitTdHJpbmdSZWY6OnNpemVfdHlwZSBsbHZtOjpTdHJJblN0ck5vQ2FzZShTdHJpbmdSZWYgczEsIFN0cmluZ1JlZiBzMikgeworICBzaXplX3QgTiA9IHMyLnNpemUoKSwgTSA9IHMxLnNpemUoKTsKKyAgaWYgKE4gPiBNKQorICAgIHJldHVybiBTdHJpbmdSZWY6Om5wb3M7CisgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTSAtIE4gKyAxOyBpICE9IGU7ICsraSkKKyAgICBpZiAoczEuc3Vic3RyKGksIE4pLmVxdWFsc19sb3dlcihzMikpCisgICAgICByZXR1cm4gaTsKKyAgcmV0dXJuIFN0cmluZ1JlZjo6bnBvczsKK30KKworLy8vIGdldFRva2VuIC0gVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBvbmUgdG9rZW4gZnJvbSBzb3VyY2UsIGlnbm9yaW5nIGFueQorLy8vIGxlYWRpbmcgY2hhcmFjdGVycyB0aGF0IGFwcGVhciBpbiB0aGUgRGVsaW1pdGVycyBzdHJpbmcsIGFuZCBlbmRpbmcgdGhlCisvLy8gdG9rZW4gYXQgYW55IG9mIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBEZWxpbWl0ZXJzIHN0cmluZy4gIElmCisvLy8gdGhlcmUgYXJlIG5vIHRva2VucyBpbiB0aGUgc291cmNlIHN0cmluZywgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorLy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcGFpciBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgdG9rZW4gYW5kIHRoZQorLy8vIHJlbWFpbmluZyB0YWlsIHN0cmluZy4KK3N0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gbGx2bTo6Z2V0VG9rZW4oU3RyaW5nUmVmIFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERlbGltaXRlcnMpIHsKKyAgLy8gRmlndXJlIG91dCB3aGVyZSB0aGUgdG9rZW4gc3RhcnRzLgorICBTdHJpbmdSZWY6OnNpemVfdHlwZSBTdGFydCA9IFNvdXJjZS5maW5kX2ZpcnN0X25vdF9vZihEZWxpbWl0ZXJzKTsKKworICAvLyBGaW5kIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhlIGRlbGltaXRlci4KKyAgU3RyaW5nUmVmOjpzaXplX3R5cGUgRW5kID0gU291cmNlLmZpbmRfZmlyc3Rfb2YoRGVsaW1pdGVycywgU3RhcnQpOworCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTb3VyY2Uuc2xpY2UoU3RhcnQsIEVuZCksIFNvdXJjZS5zdWJzdHIoRW5kKSk7Cit9CisKKy8vLyBTcGxpdFN0cmluZyAtIFNwbGl0IHVwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisvLy8gZGVsaW1pdGVycywgYXBwZW5kaW5nIHRoZSByZXN1bHQgZnJhZ21lbnRzIHRvIHRoZSBvdXRwdXQgbGlzdC4KK3ZvaWQgbGx2bTo6U3BsaXRTdHJpbmcoU3RyaW5nUmVmIFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJk91dEZyYWdtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERlbGltaXRlcnMpIHsKKyAgU3RyaW5nUmVmIFMyLCBTOworICB0aWUoUzIsIFMpID0gZ2V0VG9rZW4oU291cmNlLCBEZWxpbWl0ZXJzKTsKKyAgd2hpbGUgKCFTMi5lbXB0eSgpKSB7CisgICAgT3V0RnJhZ21lbnRzLnB1c2hfYmFjayhTMik7CisgICAgdGllKFMyLCBTKSA9IGdldFRva2VuKFMsIERlbGltaXRlcnMpOworICB9Cit9CisKK3ZvaWQgbGx2bTo6U3RyaW5nUmVmOjpzcGxpdChTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VwYXJhdG9ycywgaW50IE1heFNwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgS2VlcEVtcHR5KSBjb25zdCB7CisgIFN0cmluZ1JlZiByZXN0ID0gKnRoaXM7CisKKyAgLy8gcmVzdC5kYXRhKCkgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBjYXNlcyBsaWtlICJhLCIgdGhhdCBzcGxpdHMgaW50bworICAvLyAiYSIgKyAiIiBhbmQgImEiIHRoYXQgc3BsaXRzIGludG8gImEiICsgMC4KKyAgZm9yIChpbnQgc3BsaXRzID0gMDsKKyAgICAgICByZXN0LmRhdGEoKSAhPSBOVUxMICYmIChNYXhTcGxpdCA8IDAgfHwgc3BsaXRzIDwgTWF4U3BsaXQpOworICAgICAgICsrc3BsaXRzKSB7CisgICAgc3RkOjpwYWlyPGxsdm06OlN0cmluZ1JlZiwgbGx2bTo6U3RyaW5nUmVmPiBwID0gcmVzdC5zcGxpdChTZXBhcmF0b3JzKTsKKworICAgIGlmIChwLmZpcnN0LnNpemUoKSAhPSAwIHx8IEtlZXBFbXB0eSkKKyAgICAgIEEucHVzaF9iYWNrKHAuZmlyc3QpOworICAgIHJlc3QgPSBwLnNlY29uZDsKKyAgfQorICAvLyBJZiB3ZSBoYXZlIGEgdGFpbCBsZWZ0LCBhZGQgaXQuCisgIGlmIChyZXN0LmRhdGEoKSAhPSBOVUxMICYmIChyZXN0LnNpemUoKSAhPSAwIHx8IEtlZXBFbXB0eSkpCisgICAgQS5wdXNoX2JhY2socmVzdCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9TdHJpbmdNYXAuY3BwIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvU3RyaW5nTWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjI4Mjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvU3RyaW5nTWFwLmNwcApAQCAtMCwwICsxLDIxNSBAQAorLy89PT0tLS0gU3RyaW5nTWFwLmNwcCAtIFN0cmluZyBIYXNoIHRhYmxlIG1hcCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU3RyaW5nTWFwIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1N0cmluZ01hcEltcGw6OlN0cmluZ01hcEltcGwodW5zaWduZWQgSW5pdFNpemUsIHVuc2lnbmVkIGl0ZW1TaXplKSB7CisgIEl0ZW1TaXplID0gaXRlbVNpemU7CisgIAorICAvLyBJZiBhIHNpemUgaXMgc3BlY2lmaWVkLCBpbml0aWFsaXplIHRoZSB0YWJsZSB3aXRoIHRoYXQgbWFueSBidWNrZXRzLgorICBpZiAoSW5pdFNpemUpIHsKKyAgICBpbml0KEluaXRTaXplKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIE90aGVyd2lzZSwgaW5pdGlhbGl6ZSBpdCB3aXRoIHplcm8gYnVja2V0cyB0byBhdm9pZCB0aGUgYWxsb2NhdGlvbi4KKyAgVGhlVGFibGUgPSAwOworICBOdW1CdWNrZXRzID0gMDsKKyAgTnVtSXRlbXMgPSAwOworICBOdW1Ub21ic3RvbmVzID0gMDsKK30KKwordm9pZCBTdHJpbmdNYXBJbXBsOjppbml0KHVuc2lnbmVkIEluaXRTaXplKSB7CisgIGFzc2VydCgoSW5pdFNpemUgJiAoSW5pdFNpemUtMSkpID09IDAgJiYKKyAgICAgICAgICJJbml0IFNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgb3IgemVybyEiKTsKKyAgTnVtQnVja2V0cyA9IEluaXRTaXplID8gSW5pdFNpemUgOiAxNjsKKyAgTnVtSXRlbXMgPSAwOworICBOdW1Ub21ic3RvbmVzID0gMDsKKyAgCisgIFRoZVRhYmxlID0gKEl0ZW1CdWNrZXQqKWNhbGxvYyhOdW1CdWNrZXRzKzEsIHNpemVvZihJdGVtQnVja2V0KSk7CisgIAorICAvLyBBbGxvY2F0ZSBvbmUgZXh0cmEgYnVja2V0LCBzZXQgaXQgdG8gbG9vayBmaWxsZWQgc28gdGhlIGl0ZXJhdG9ycyBzdG9wIGF0CisgIC8vIGVuZC4KKyAgVGhlVGFibGVbTnVtQnVja2V0c10uSXRlbSA9IChTdHJpbmdNYXBFbnRyeUJhc2UqKTI7Cit9CisKKworLy8vIExvb2t1cEJ1Y2tldEZvciAtIExvb2sgdXAgdGhlIGJ1Y2tldCB0aGF0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHNob3VsZCBlbmQKKy8vLyB1cCBpbi4gIElmIGl0IGFscmVhZHkgZXhpc3RzIGFzIGEga2V5IGluIHRoZSBtYXAsIHRoZSBJdGVtIHBvaW50ZXIgZm9yIHRoZQorLy8vIHNwZWNpZmllZCBidWNrZXQgd2lsbCBiZSBub24tbnVsbC4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBudWxsLiAgSW4gZWl0aGVyCisvLy8gY2FzZSwgdGhlIEZ1bGxIYXNoVmFsdWUgZmllbGQgb2YgdGhlIGJ1Y2tldCB3aWxsIGJlIHNldCB0byB0aGUgaGFzaCB2YWx1ZQorLy8vIG9mIHRoZSBzdHJpbmcuCit1bnNpZ25lZCBTdHJpbmdNYXBJbXBsOjpMb29rdXBCdWNrZXRGb3IoU3RyaW5nUmVmIE5hbWUpIHsKKyAgdW5zaWduZWQgSFRTaXplID0gTnVtQnVja2V0czsKKyAgaWYgKEhUU2l6ZSA9PSAwKSB7ICAvLyBIYXNoIHRhYmxlIHVuYWxsb2NhdGVkIHNvIGZhcj8KKyAgICBpbml0KDE2KTsKKyAgICBIVFNpemUgPSBOdW1CdWNrZXRzOworICB9CisgIHVuc2lnbmVkIEZ1bGxIYXNoVmFsdWUgPSBIYXNoU3RyaW5nKE5hbWUpOworICB1bnNpZ25lZCBCdWNrZXRObyA9IEZ1bGxIYXNoVmFsdWUgJiAoSFRTaXplLTEpOworICAKKyAgdW5zaWduZWQgUHJvYmVBbXQgPSAxOworICBpbnQgRmlyc3RUb21ic3RvbmUgPSAtMTsKKyAgd2hpbGUgKDEpIHsKKyAgICBJdGVtQnVja2V0ICZCdWNrZXQgPSBUaGVUYWJsZVtCdWNrZXROb107CisgICAgU3RyaW5nTWFwRW50cnlCYXNlICpCdWNrZXRJdGVtID0gQnVja2V0Lkl0ZW07CisgICAgLy8gSWYgd2UgZm91bmQgYW4gZW1wdHkgYnVja2V0LCB0aGlzIGtleSBpc24ndCBpbiB0aGUgdGFibGUgeWV0LCByZXR1cm4gaXQuCisgICAgaWYgKEJ1Y2tldEl0ZW0gPT0gMCkgeworICAgICAgLy8gSWYgd2UgZm91bmQgYSB0b21ic3RvbmUsIHdlIHdhbnQgdG8gcmV1c2UgdGhlIHRvbWJzdG9uZSBpbnN0ZWFkIG9mIGFuCisgICAgICAvLyBlbXB0eSBidWNrZXQuICBUaGlzIHJlZHVjZXMgcHJvYmluZy4KKyAgICAgIGlmIChGaXJzdFRvbWJzdG9uZSAhPSAtMSkgeworICAgICAgICBUaGVUYWJsZVtGaXJzdFRvbWJzdG9uZV0uRnVsbEhhc2hWYWx1ZSA9IEZ1bGxIYXNoVmFsdWU7CisgICAgICAgIHJldHVybiBGaXJzdFRvbWJzdG9uZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgQnVja2V0LkZ1bGxIYXNoVmFsdWUgPSBGdWxsSGFzaFZhbHVlOworICAgICAgcmV0dXJuIEJ1Y2tldE5vOworICAgIH0KKyAgICAKKyAgICBpZiAoQnVja2V0SXRlbSA9PSBnZXRUb21ic3RvbmVWYWwoKSkgeworICAgICAgLy8gU2tpcCBvdmVyIHRvbWJzdG9uZXMuICBIb3dldmVyLCByZW1lbWJlciB0aGUgZmlyc3Qgb25lIHdlIHNlZS4KKyAgICAgIGlmIChGaXJzdFRvbWJzdG9uZSA9PSAtMSkgRmlyc3RUb21ic3RvbmUgPSBCdWNrZXRObzsKKyAgICB9IGVsc2UgaWYgKEJ1Y2tldC5GdWxsSGFzaFZhbHVlID09IEZ1bGxIYXNoVmFsdWUpIHsKKyAgICAgIC8vIElmIHRoZSBmdWxsIGhhc2ggdmFsdWUgbWF0Y2hlcywgY2hlY2sgZGVlcGx5IGZvciBhIG1hdGNoLiAgVGhlIGNvbW1vbgorICAgICAgLy8gY2FzZSBoZXJlIGlzIHRoYXQgd2UgYXJlIG9ubHkgbG9va2luZyBhdCB0aGUgYnVja2V0cyAoZm9yIGl0ZW0gaW5mbworICAgICAgLy8gYmVpbmcgbm9uLW51bGwgYW5kIGZvciB0aGUgZnVsbCBoYXNoIHZhbHVlKSBub3QgYXQgdGhlIGl0ZW1zLiAgVGhpcworICAgICAgLy8gaXMgaW1wb3J0YW50IGZvciBjYWNoZSBsb2NhbGl0eS4KKyAgICAgIAorICAgICAgLy8gRG8gdGhlIGNvbXBhcmlzb24gbGlrZSB0aGlzIGJlY2F1c2UgTmFtZSBpc24ndCBuZWNlc3NhcmlseQorICAgICAgLy8gbnVsbC10ZXJtaW5hdGVkIQorICAgICAgY2hhciAqSXRlbVN0ciA9IChjaGFyKilCdWNrZXRJdGVtK0l0ZW1TaXplOworICAgICAgaWYgKE5hbWUgPT0gU3RyaW5nUmVmKEl0ZW1TdHIsIEJ1Y2tldEl0ZW0tPmdldEtleUxlbmd0aCgpKSkgeworICAgICAgICAvLyBXZSBmb3VuZCBhIG1hdGNoIQorICAgICAgICByZXR1cm4gQnVja2V0Tm87CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIE9rYXksIHdlIGRpZG4ndCBmaW5kIHRoZSBpdGVtLiAgUHJvYmUgdG8gdGhlIG5leHQgYnVja2V0LgorICAgIEJ1Y2tldE5vID0gKEJ1Y2tldE5vK1Byb2JlQW10KSAmIChIVFNpemUtMSk7CisgICAgCisgICAgLy8gVXNlIHF1YWRyYXRpYyBwcm9iaW5nLCBpdCBoYXMgZmV3ZXIgY2x1bXBpbmcgYXJ0aWZhY3RzIHRoYW4gbGluZWFyCisgICAgLy8gcHJvYmluZyBhbmQgaGFzIGdvb2QgY2FjaGUgYmVoYXZpb3IgaW4gdGhlIGNvbW1vbiBjYXNlLgorICAgICsrUHJvYmVBbXQ7CisgIH0KK30KKworCisvLy8gRmluZEtleSAtIExvb2sgdXAgdGhlIGJ1Y2tldCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQga2V5LiBJZiBpdCBleGlzdHMKKy8vLyBpbiB0aGUgbWFwLCByZXR1cm4gdGhlIGJ1Y2tldCBudW1iZXIgb2YgdGhlIGtleS4gIE90aGVyd2lzZSByZXR1cm4gLTEuCisvLy8gVGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIG1hcC4KK2ludCBTdHJpbmdNYXBJbXBsOjpGaW5kS2V5KFN0cmluZ1JlZiBLZXkpIGNvbnN0IHsKKyAgdW5zaWduZWQgSFRTaXplID0gTnVtQnVja2V0czsKKyAgaWYgKEhUU2l6ZSA9PSAwKSByZXR1cm4gLTE7ICAvLyBSZWFsbHkgZW1wdHkgdGFibGU/CisgIHVuc2lnbmVkIEZ1bGxIYXNoVmFsdWUgPSBIYXNoU3RyaW5nKEtleSk7CisgIHVuc2lnbmVkIEJ1Y2tldE5vID0gRnVsbEhhc2hWYWx1ZSAmIChIVFNpemUtMSk7CisgIAorICB1bnNpZ25lZCBQcm9iZUFtdCA9IDE7CisgIHdoaWxlICgxKSB7CisgICAgSXRlbUJ1Y2tldCAmQnVja2V0ID0gVGhlVGFibGVbQnVja2V0Tm9dOworICAgIFN0cmluZ01hcEVudHJ5QmFzZSAqQnVja2V0SXRlbSA9IEJ1Y2tldC5JdGVtOworICAgIC8vIElmIHdlIGZvdW5kIGFuIGVtcHR5IGJ1Y2tldCwgdGhpcyBrZXkgaXNuJ3QgaW4gdGhlIHRhYmxlIHlldCwgcmV0dXJuLgorICAgIGlmIChCdWNrZXRJdGVtID09IDApCisgICAgICByZXR1cm4gLTE7CisgICAgCisgICAgaWYgKEJ1Y2tldEl0ZW0gPT0gZ2V0VG9tYnN0b25lVmFsKCkpIHsKKyAgICAgIC8vIElnbm9yZSB0b21ic3RvbmVzLgorICAgIH0gZWxzZSBpZiAoQnVja2V0LkZ1bGxIYXNoVmFsdWUgPT0gRnVsbEhhc2hWYWx1ZSkgeworICAgICAgLy8gSWYgdGhlIGZ1bGwgaGFzaCB2YWx1ZSBtYXRjaGVzLCBjaGVjayBkZWVwbHkgZm9yIGEgbWF0Y2guICBUaGUgY29tbW9uCisgICAgICAvLyBjYXNlIGhlcmUgaXMgdGhhdCB3ZSBhcmUgb25seSBsb29raW5nIGF0IHRoZSBidWNrZXRzIChmb3IgaXRlbSBpbmZvCisgICAgICAvLyBiZWluZyBub24tbnVsbCBhbmQgZm9yIHRoZSBmdWxsIGhhc2ggdmFsdWUpIG5vdCBhdCB0aGUgaXRlbXMuICBUaGlzCisgICAgICAvLyBpcyBpbXBvcnRhbnQgZm9yIGNhY2hlIGxvY2FsaXR5LgorICAgICAgCisgICAgICAvLyBEbyB0aGUgY29tcGFyaXNvbiBsaWtlIHRoaXMgYmVjYXVzZSBOYW1lU3RhcnQgaXNuJ3QgbmVjZXNzYXJpbHkKKyAgICAgIC8vIG51bGwtdGVybWluYXRlZCEKKyAgICAgIGNoYXIgKkl0ZW1TdHIgPSAoY2hhciopQnVja2V0SXRlbStJdGVtU2l6ZTsKKyAgICAgIGlmIChLZXkgPT0gU3RyaW5nUmVmKEl0ZW1TdHIsIEJ1Y2tldEl0ZW0tPmdldEtleUxlbmd0aCgpKSkgeworICAgICAgICAvLyBXZSBmb3VuZCBhIG1hdGNoIQorICAgICAgICByZXR1cm4gQnVja2V0Tm87CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIE9rYXksIHdlIGRpZG4ndCBmaW5kIHRoZSBpdGVtLiAgUHJvYmUgdG8gdGhlIG5leHQgYnVja2V0LgorICAgIEJ1Y2tldE5vID0gKEJ1Y2tldE5vK1Byb2JlQW10KSAmIChIVFNpemUtMSk7CisgICAgCisgICAgLy8gVXNlIHF1YWRyYXRpYyBwcm9iaW5nLCBpdCBoYXMgZmV3ZXIgY2x1bXBpbmcgYXJ0aWZhY3RzIHRoYW4gbGluZWFyCisgICAgLy8gcHJvYmluZyBhbmQgaGFzIGdvb2QgY2FjaGUgYmVoYXZpb3IgaW4gdGhlIGNvbW1vbiBjYXNlLgorICAgICsrUHJvYmVBbXQ7CisgIH0KK30KKworLy8vIFJlbW92ZUtleSAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIFN0cmluZ01hcEVudHJ5IGZyb20gdGhlIHRhYmxlLCBidXQgZG8gbm90CisvLy8gZGVsZXRlIGl0LiAgVGhpcyBhYm9ydHMgaWYgdGhlIHZhbHVlIGlzbid0IGluIHRoZSB0YWJsZS4KK3ZvaWQgU3RyaW5nTWFwSW1wbDo6UmVtb3ZlS2V5KFN0cmluZ01hcEVudHJ5QmFzZSAqVikgeworICBjb25zdCBjaGFyICpWU3RyID0gKGNoYXIqKVYgKyBJdGVtU2l6ZTsKKyAgU3RyaW5nTWFwRW50cnlCYXNlICpWMiA9IFJlbW92ZUtleShTdHJpbmdSZWYoVlN0ciwgVi0+Z2V0S2V5TGVuZ3RoKCkpKTsKKyAgVjIgPSBWMjsKKyAgYXNzZXJ0KFYgPT0gVjIgJiYgIkRpZG4ndCBmaW5kIGtleT8iKTsKK30KKworLy8vIFJlbW92ZUtleSAtIFJlbW92ZSB0aGUgU3RyaW5nTWFwRW50cnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlCisvLy8gdGFibGUsIHJldHVybmluZyBpdC4gIElmIHRoZSBrZXkgaXMgbm90IGluIHRoZSB0YWJsZSwgdGhpcyByZXR1cm5zIG51bGwuCitTdHJpbmdNYXBFbnRyeUJhc2UgKlN0cmluZ01hcEltcGw6OlJlbW92ZUtleShTdHJpbmdSZWYgS2V5KSB7CisgIGludCBCdWNrZXQgPSBGaW5kS2V5KEtleSk7CisgIGlmIChCdWNrZXQgPT0gLTEpIHJldHVybiAwOworICAKKyAgU3RyaW5nTWFwRW50cnlCYXNlICpSZXN1bHQgPSBUaGVUYWJsZVtCdWNrZXRdLkl0ZW07CisgIFRoZVRhYmxlW0J1Y2tldF0uSXRlbSA9IGdldFRvbWJzdG9uZVZhbCgpOworICAtLU51bUl0ZW1zOworICArK051bVRvbWJzdG9uZXM7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKworCisvLy8gUmVoYXNoVGFibGUgLSBHcm93IHRoZSB0YWJsZSwgcmVkaXN0cmlidXRpbmcgdmFsdWVzIGludG8gdGhlIGJ1Y2tldHMgd2l0aAorLy8vIHRoZSBhcHByb3ByaWF0ZSBtb2Qtb2YtaGFzaHRhYmxlLXNpemUuCit2b2lkIFN0cmluZ01hcEltcGw6OlJlaGFzaFRhYmxlKCkgeworICB1bnNpZ25lZCBOZXdTaXplID0gTnVtQnVja2V0cyoyOworICAvLyBBbGxvY2F0ZSBvbmUgZXh0cmEgYnVja2V0IHdoaWNoIHdpbGwgYWx3YXlzIGJlIG5vbi1lbXB0eS4gIFRoaXMgYWxsb3dzIHRoZQorICAvLyBpdGVyYXRvcnMgdG8gc3RvcCBhdCBlbmQuCisgIEl0ZW1CdWNrZXQgKk5ld1RhYmxlQXJyYXkgPShJdGVtQnVja2V0KiljYWxsb2MoTmV3U2l6ZSsxLCBzaXplb2YoSXRlbUJ1Y2tldCkpOworICBOZXdUYWJsZUFycmF5W05ld1NpemVdLkl0ZW0gPSAoU3RyaW5nTWFwRW50cnlCYXNlKikyOworICAKKyAgLy8gUmVoYXNoIGFsbCB0aGUgaXRlbXMgaW50byB0aGVpciBuZXcgYnVja2V0cy4gIEx1Y2tpbHkgOikgd2UgYWxyZWFkeSBoYXZlCisgIC8vIHRoZSBoYXNoIHZhbHVlcyBhdmFpbGFibGUsIHNvIHdlIGRvbid0IGhhdmUgdG8gcmVoYXNoIGFueSBzdHJpbmdzLgorICBmb3IgKEl0ZW1CdWNrZXQgKklCID0gVGhlVGFibGUsICpFID0gVGhlVGFibGUrTnVtQnVja2V0czsgSUIgIT0gRTsgKytJQikgeworICAgIGlmIChJQi0+SXRlbSAmJiBJQi0+SXRlbSAhPSBnZXRUb21ic3RvbmVWYWwoKSkgeworICAgICAgLy8gRmFzdCBjYXNlLCBidWNrZXQgYXZhaWxhYmxlLgorICAgICAgdW5zaWduZWQgRnVsbEhhc2ggPSBJQi0+RnVsbEhhc2hWYWx1ZTsKKyAgICAgIHVuc2lnbmVkIE5ld0J1Y2tldCA9IEZ1bGxIYXNoICYgKE5ld1NpemUtMSk7CisgICAgICBpZiAoTmV3VGFibGVBcnJheVtOZXdCdWNrZXRdLkl0ZW0gPT0gMCkgeworICAgICAgICBOZXdUYWJsZUFycmF5W0Z1bGxIYXNoICYgKE5ld1NpemUtMSldLkl0ZW0gPSBJQi0+SXRlbTsKKyAgICAgICAgTmV3VGFibGVBcnJheVtGdWxsSGFzaCAmIChOZXdTaXplLTEpXS5GdWxsSGFzaFZhbHVlID0gRnVsbEhhc2g7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICAvLyBPdGhlcndpc2UgcHJvYmUgZm9yIGEgc3BvdC4KKyAgICAgIHVuc2lnbmVkIFByb2JlU2l6ZSA9IDE7CisgICAgICBkbyB7CisgICAgICAgIE5ld0J1Y2tldCA9IChOZXdCdWNrZXQgKyBQcm9iZVNpemUrKykgJiAoTmV3U2l6ZS0xKTsKKyAgICAgIH0gd2hpbGUgKE5ld1RhYmxlQXJyYXlbTmV3QnVja2V0XS5JdGVtKTsKKyAgICAgIAorICAgICAgLy8gRmluYWxseSBmb3VuZCBhIHNsb3QuICBGaWxsIGl0IGluLgorICAgICAgTmV3VGFibGVBcnJheVtOZXdCdWNrZXRdLkl0ZW0gPSBJQi0+SXRlbTsKKyAgICAgIE5ld1RhYmxlQXJyYXlbTmV3QnVja2V0XS5GdWxsSGFzaFZhbHVlID0gRnVsbEhhc2g7CisgICAgfQorICB9CisgIAorICBmcmVlKFRoZVRhYmxlKTsKKyAgCisgIFRoZVRhYmxlID0gTmV3VGFibGVBcnJheTsKKyAgTnVtQnVja2V0cyA9IE5ld1NpemU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9TdHJpbmdQb29sLmNwcCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1N0cmluZ1Bvb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjA3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9TdHJpbmdQb29sLmNwcApAQCAtMCwwICsxLDM1IEBACisvLz09PS0tIFN0cmluZ1Bvb2wuY3BwIC0gSW50ZXJuZWQgc3RyaW5nIHBvb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTdHJpbmdQb29sIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU3RyaW5nUG9vbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU3RyaW5nUG9vbDo6U3RyaW5nUG9vbCgpIHt9CisKK1N0cmluZ1Bvb2w6On5TdHJpbmdQb29sKCkgeworICBhc3NlcnQoSW50ZXJuVGFibGUuZW1wdHkoKSAmJiAiUG9vbGVkU3RyaW5nUHRyIGxlYWtlZCEiKTsKK30KKworUG9vbGVkU3RyaW5nUHRyIFN0cmluZ1Bvb2w6OmludGVybihTdHJpbmdSZWYgS2V5KSB7CisgIHRhYmxlX3Q6Oml0ZXJhdG9yIEkgPSBJbnRlcm5UYWJsZS5maW5kKEtleSk7CisgIGlmIChJICE9IEludGVyblRhYmxlLmVuZCgpKQorICAgIHJldHVybiBQb29sZWRTdHJpbmdQdHIoJipJKTsKKyAgCisgIGVudHJ5X3QgKlMgPSBlbnRyeV90OjpDcmVhdGUoS2V5LmJlZ2luKCksIEtleS5lbmQoKSk7CisgIFMtPmdldFZhbHVlKCkuUG9vbCA9IHRoaXM7CisgIEludGVyblRhYmxlLmluc2VydChTKTsKKyAgCisgIHJldHVybiBQb29sZWRTdHJpbmdQdHIoUyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9TdHJpbmdSZWYuY3BwIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvU3RyaW5nUmVmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTBmNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvU3RyaW5nUmVmLmNwcApAQCAtMCwwICsxLDM4MyBAQAorLy89PT0tLSBTdHJpbmdSZWYuY3BwIC0gTGlnaHR3ZWlnaHQgU3RyaW5nIFJlZmVyZW5jZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBNU1ZDIGVtaXRzIHJlZmVyZW5jZXMgdG8gdGhpcyBpbnRvIHRoZSB0cmFuc2xhdGlvbiB1bml0cyB3aGljaCByZWZlcmVuY2UgaXQuCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBzaXplX3QgU3RyaW5nUmVmOjpucG9zOworI2VuZGlmCisKK3N0YXRpYyBjaGFyIGFzY2lpX3RvbG93ZXIoY2hhciB4KSB7CisgIGlmICh4ID49ICdBJyAmJiB4IDw9ICdaJykKKyAgICByZXR1cm4geCAtICdBJyArICdhJzsKKyAgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBib29sIGFzY2lpX2lzZGlnaXQoY2hhciB4KSB7CisgIHJldHVybiB4ID49ICcwJyAmJiB4IDw9ICc5JzsKK30KKworLy8vIGNvbXBhcmVfbG93ZXIgLSBDb21wYXJlIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuCitpbnQgU3RyaW5nUmVmOjpjb21wYXJlX2xvd2VyKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKKyAgZm9yIChzaXplX3QgSSA9IDAsIEUgPSBtaW4oTGVuZ3RoLCBSSFMuTGVuZ3RoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjaGFyIExIQyA9IGFzY2lpX3RvbG93ZXIoRGF0YVtJXSk7CisgICAgY2hhciBSSEMgPSBhc2NpaV90b2xvd2VyKFJIUy5EYXRhW0ldKTsKKyAgICBpZiAoTEhDICE9IFJIQykKKyAgICAgIHJldHVybiBMSEMgPCBSSEMgPyAtMSA6IDE7CisgIH0KKworICBpZiAoTGVuZ3RoID09IFJIUy5MZW5ndGgpCisgICAgICAgIHJldHVybiAwOworICByZXR1cm4gTGVuZ3RoIDwgUkhTLkxlbmd0aCA/IC0xIDogMTsKK30KKworLy8vIGNvbXBhcmVfbnVtZXJpYyAtIENvbXBhcmUgc3RyaW5ncywgaGFuZGxlIGVtYmVkZGVkIG51bWJlcnMuCitpbnQgU3RyaW5nUmVmOjpjb21wYXJlX251bWVyaWMoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICBmb3IgKHNpemVfdCBJID0gMCwgRSA9IG1pbihMZW5ndGgsIFJIUy5MZW5ndGgpOyBJICE9IEU7ICsrSSkgeworICAgIGlmIChEYXRhW0ldID09IFJIUy5EYXRhW0ldKQorICAgICAgY29udGludWU7CisgICAgaWYgKGFzY2lpX2lzZGlnaXQoRGF0YVtJXSkgJiYgYXNjaWlfaXNkaWdpdChSSFMuRGF0YVtJXSkpIHsKKyAgICAgIC8vIFRoZSBsb25nZXIgc2VxdWVuY2Ugb2YgbnVtYmVycyBpcyBsYXJnZXIuIFRoaXMgZG9lc24ndCByZWFsbHkgaGFuZGxlCisgICAgICAvLyBwcmVmaXhlZCB6ZXJvcyB3ZWxsLgorICAgICAgZm9yIChzaXplX3QgSiA9IEkrMTsgSiAhPSBFKzE7ICsrSikgeworICAgICAgICBib29sIGxkID0gSiA8IExlbmd0aCAmJiBhc2NpaV9pc2RpZ2l0KERhdGFbSl0pOworICAgICAgICBib29sIHJkID0gSiA8IFJIUy5MZW5ndGggJiYgYXNjaWlfaXNkaWdpdChSSFMuRGF0YVtKXSk7CisgICAgICAgIGlmIChsZCAhPSByZCkKKyAgICAgICAgICByZXR1cm4gcmQgPyAtMSA6IDE7CisgICAgICAgIGlmICghcmQpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBEYXRhW0ldIDwgUkhTLkRhdGFbSV0gPyAtMSA6IDE7CisgIH0KKyAgaWYgKExlbmd0aCA9PSBSSFMuTGVuZ3RoKQorICAgICAgICByZXR1cm4gMDsKKyAgcmV0dXJuIExlbmd0aCA8IFJIUy5MZW5ndGggPyAtMSA6IDE7Cit9CisKKy8vIENvbXB1dGUgdGhlIGVkaXQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHN0cmluZ3MuCit1bnNpZ25lZCBTdHJpbmdSZWY6OmVkaXRfZGlzdGFuY2UobGx2bTo6U3RyaW5nUmVmIE90aGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93UmVwbGFjZW1lbnRzKSB7CisgIC8vIFRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgYmVsb3cgaXMgdGhlICJjbGFzc2ljIgorICAvLyBkeW5hbWljLXByb2dyYW1taW5nIGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIHRoZSBMZXZlbnNodGVpbgorICAvLyBkaXN0YW5jZSwgd2hpY2ggaXMgZGVzY3JpYmVkIGhlcmU6CisgIC8vCisgIC8vICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXZlbnNodGVpbl9kaXN0YW5jZQorICAvLworICAvLyBBbHRob3VnaCB0aGUgYWxnb3JpdGhtIGlzIHR5cGljYWxseSBkZXNjcmliZWQgdXNpbmcgYW4gbSB4IG4KKyAgLy8gYXJyYXksIG9ubHkgdHdvIHJvd3MgYXJlIHVzZWQgYXQgYSB0aW1lLCBzbyB0aGlzIGltcGxlbWVuYXRpb24KKyAgLy8ganVzdCBrZWVwcyB0d28gc2VwYXJhdGUgdmVjdG9ycyBmb3IgdGhvc2UgdHdvIHJvd3MuCisgIHNpemVfdHlwZSBtID0gc2l6ZSgpOworICBzaXplX3R5cGUgbiA9IE90aGVyLnNpemUoKTsKKworICBjb25zdCB1bnNpZ25lZCBTbWFsbEJ1ZmZlclNpemUgPSA2NDsKKyAgdW5zaWduZWQgU21hbGxCdWZmZXJbU21hbGxCdWZmZXJTaXplXTsKKyAgdW5zaWduZWQgKkFsbG9jYXRlZCA9IDA7CisgIHVuc2lnbmVkICpwcmV2aW91cyA9IFNtYWxsQnVmZmVyOworICBpZiAoMioobiArIDEpID4gU21hbGxCdWZmZXJTaXplKQorICAgIEFsbG9jYXRlZCA9IHByZXZpb3VzID0gbmV3IHVuc2lnbmVkIFsyKihuKzEpXTsKKyAgdW5zaWduZWQgKmN1cnJlbnQgPSBwcmV2aW91cyArIChuICsgMSk7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDw9IG47ICsraSkgCisgICAgcHJldmlvdXNbaV0gPSBpOworCisgIGZvciAoc2l6ZV90eXBlIHkgPSAxOyB5IDw9IG07ICsreSkgeworICAgIGN1cnJlbnRbMF0gPSB5OworICAgIGZvciAoc2l6ZV90eXBlIHggPSAxOyB4IDw9IG47ICsreCkgeworICAgICAgaWYgKEFsbG93UmVwbGFjZW1lbnRzKSB7CisgICAgICAgIGN1cnJlbnRbeF0gPSBtaW4ocHJldmlvdXNbeC0xXSArICgoKnRoaXMpW3ktMV0gPT0gT3RoZXJbeC0xXT8gMHU6MXUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbihjdXJyZW50W3gtMV0sIHByZXZpb3VzW3hdKSsxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoKCp0aGlzKVt5LTFdID09IE90aGVyW3gtMV0pIGN1cnJlbnRbeF0gPSBwcmV2aW91c1t4LTFdOworICAgICAgICBlbHNlIGN1cnJlbnRbeF0gPSBtaW4oY3VycmVudFt4LTFdLCBwcmV2aW91c1t4XSkgKyAxOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCAqdG1wID0gY3VycmVudDsKKyAgICBjdXJyZW50ID0gcHJldmlvdXM7CisgICAgcHJldmlvdXMgPSB0bXA7CisgIH0KKworICB1bnNpZ25lZCBSZXN1bHQgPSBwcmV2aW91c1tuXTsKKyAgZGVsZXRlIFtdIEFsbG9jYXRlZDsKKyAgCisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTdHJpbmcgU2VhcmNoaW5nCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vLyBmaW5kIC0gU2VhcmNoIGZvciB0aGUgZmlyc3Qgc3RyaW5nIFxhcmcgU3RyIGluIHRoZSBzdHJpbmcuCisvLy8KKy8vLyBccmV0dXJuIC0gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgXGFyZyBTdHIsIG9yIG5wb3MgaWYgbm90CisvLy8gZm91bmQuCitzaXplX3QgU3RyaW5nUmVmOjpmaW5kKFN0cmluZ1JlZiBTdHIsIHNpemVfdCBGcm9tKSBjb25zdCB7CisgIHNpemVfdCBOID0gU3RyLnNpemUoKTsKKyAgaWYgKE4gPiBMZW5ndGgpCisgICAgcmV0dXJuIG5wb3M7CisgIGZvciAoc2l6ZV90IGUgPSBMZW5ndGggLSBOICsgMSwgaSA9IG1pbihGcm9tLCBlKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKHN1YnN0cihpLCBOKS5lcXVhbHMoU3RyKSkKKyAgICAgIHJldHVybiBpOworICByZXR1cm4gbnBvczsKK30KKworLy8vIHJmaW5kIC0gU2VhcmNoIGZvciB0aGUgbGFzdCBzdHJpbmcgXGFyZyBTdHIgaW4gdGhlIHN0cmluZy4KKy8vLworLy8vIFxyZXR1cm4gLSBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIFxhcmcgU3RyLCBvciBucG9zIGlmIG5vdAorLy8vIGZvdW5kLgorc2l6ZV90IFN0cmluZ1JlZjo6cmZpbmQoU3RyaW5nUmVmIFN0cikgY29uc3QgeworICBzaXplX3QgTiA9IFN0ci5zaXplKCk7CisgIGlmIChOID4gTGVuZ3RoKQorICAgIHJldHVybiBucG9zOworICBmb3IgKHNpemVfdCBpID0gTGVuZ3RoIC0gTiArIDEsIGUgPSAwOyBpICE9IGU7KSB7CisgICAgLS1pOworICAgIGlmIChzdWJzdHIoaSwgTikuZXF1YWxzKFN0cikpCisgICAgICByZXR1cm4gaTsKKyAgfQorICByZXR1cm4gbnBvczsKK30KKworLy8vIGZpbmRfZmlyc3Rfb2YgLSBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIGluIFxhcmcKKy8vLyBDaGFycywgb3IgbnBvcyBpZiBub3QgZm91bmQuCisvLy8KKy8vLyBOb3RlOiBPKHNpemUoKSAqIENoYXJzLnNpemUoKSkKK1N0cmluZ1JlZjo6c2l6ZV90eXBlIFN0cmluZ1JlZjo6ZmluZF9maXJzdF9vZihTdHJpbmdSZWYgQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEZyb20pIGNvbnN0IHsKKyAgZm9yIChzaXplX3R5cGUgaSA9IG1pbihGcm9tLCBMZW5ndGgpLCBlID0gTGVuZ3RoOyBpICE9IGU7ICsraSkKKyAgICBpZiAoQ2hhcnMuZmluZChEYXRhW2ldKSAhPSBucG9zKQorICAgICAgcmV0dXJuIGk7CisgIHJldHVybiBucG9zOworfQorCisvLy8gZmluZF9maXJzdF9ub3Rfb2YgLSBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIG5vdAorLy8vIFxhcmcgQyBvciBucG9zIGlmIG5vdCBmb3VuZC4KK1N0cmluZ1JlZjo6c2l6ZV90eXBlIFN0cmluZ1JlZjo6ZmluZF9maXJzdF9ub3Rfb2YoY2hhciBDLCBzaXplX3QgRnJvbSkgY29uc3QgeworICBmb3IgKHNpemVfdHlwZSBpID0gbWluKEZyb20sIExlbmd0aCksIGUgPSBMZW5ndGg7IGkgIT0gZTsgKytpKQorICAgIGlmIChEYXRhW2ldICE9IEMpCisgICAgICByZXR1cm4gaTsKKyAgcmV0dXJuIG5wb3M7Cit9CisKKy8vLyBmaW5kX2ZpcnN0X25vdF9vZiAtIEZpbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90CisvLy8gaW4gdGhlIHN0cmluZyBcYXJnIENoYXJzLCBvciBucG9zIGlmIG5vdCBmb3VuZC4KKy8vLworLy8vIE5vdGU6IE8oc2l6ZSgpICogQ2hhcnMuc2l6ZSgpKQorU3RyaW5nUmVmOjpzaXplX3R5cGUgU3RyaW5nUmVmOjpmaW5kX2ZpcnN0X25vdF9vZihTdHJpbmdSZWYgQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBGcm9tKSBjb25zdCB7CisgIGZvciAoc2l6ZV90eXBlIGkgPSBtaW4oRnJvbSwgTGVuZ3RoKSwgZSA9IExlbmd0aDsgaSAhPSBlOyArK2kpCisgICAgaWYgKENoYXJzLmZpbmQoRGF0YVtpXSkgPT0gbnBvcykKKyAgICAgIHJldHVybiBpOworICByZXR1cm4gbnBvczsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSGVscGZ1bCBBbGdvcml0aG1zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gY291bnQgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBlZCBvY2N1cnJlbmNlcyBvZiBcYXJnIFN0ciBpbgorLy8vIHRoZSBzdHJpbmcuCitzaXplX3QgU3RyaW5nUmVmOjpjb3VudChTdHJpbmdSZWYgU3RyKSBjb25zdCB7CisgIHNpemVfdCBDb3VudCA9IDA7CisgIHNpemVfdCBOID0gU3RyLnNpemUoKTsKKyAgaWYgKE4gPiBMZW5ndGgpCisgICAgcmV0dXJuIDA7CisgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTGVuZ3RoIC0gTiArIDE7IGkgIT0gZTsgKytpKQorICAgIGlmIChzdWJzdHIoaSwgTikuZXF1YWxzKFN0cikpCisgICAgICArK0NvdW50OworICByZXR1cm4gQ291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBHZXRBdXRvU2Vuc2VSYWRpeChTdHJpbmdSZWYgJlN0cikgeworICBpZiAoU3RyLnN0YXJ0c3dpdGgoIjB4IikpIHsKKyAgICBTdHIgPSBTdHIuc3Vic3RyKDIpOworICAgIHJldHVybiAxNjsKKyAgfSBlbHNlIGlmIChTdHIuc3RhcnRzd2l0aCgiMGIiKSkgeworICAgIFN0ciA9IFN0ci5zdWJzdHIoMik7CisgICAgcmV0dXJuIDI7CisgIH0gZWxzZSBpZiAoU3RyLnN0YXJ0c3dpdGgoIjAiKSkgeworICAgIHJldHVybiA4OworICB9IGVsc2UgeworICAgIHJldHVybiAxMDsKKyAgfQorfQorCisKKy8vLyBHZXRBc1Vuc2lnbmVkSW50ZWdlciAtIFdvcmtob3JzZSBtZXRob2QgdGhhdCBjb252ZXJ0cyBhIGludGVnZXIgY2hhcmFjdGVyCisvLy8gc2VxdWVuY2Ugb2YgcmFkaXggdXAgdG8gMzYgdG8gYW4gdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlLgorc3RhdGljIGJvb2wgR2V0QXNVbnNpZ25lZEludGVnZXIoU3RyaW5nUmVmIFN0ciwgdW5zaWduZWQgUmFkaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgJlJlc3VsdCkgeworICAvLyBBdXRvc2Vuc2UgcmFkaXggaWYgbm90IHNwZWNpZmllZC4KKyAgaWYgKFJhZGl4ID09IDApCisgICAgUmFkaXggPSBHZXRBdXRvU2Vuc2VSYWRpeChTdHIpOworICAKKyAgLy8gRW1wdHkgc3RyaW5ncyAoYWZ0ZXIgdGhlIHJhZGl4IGF1dG9zZW5zZSkgYXJlIGludmFsaWQuCisgIGlmIChTdHIuZW1wdHkoKSkgcmV0dXJuIHRydWU7CisgIAorICAvLyBQYXJzZSBhbGwgdGhlIGJ5dGVzIG9mIHRoZSBzdHJpbmcgZ2l2ZW4gdGhpcyByYWRpeC4gIFdhdGNoIGZvciBvdmVyZmxvdy4KKyAgUmVzdWx0ID0gMDsKKyAgd2hpbGUgKCFTdHIuZW1wdHkoKSkgeworICAgIHVuc2lnbmVkIENoYXJWYWw7CisgICAgaWYgKFN0clswXSA+PSAnMCcgJiYgU3RyWzBdIDw9ICc5JykKKyAgICAgIENoYXJWYWwgPSBTdHJbMF0tJzAnOworICAgIGVsc2UgaWYgKFN0clswXSA+PSAnYScgJiYgU3RyWzBdIDw9ICd6JykKKyAgICAgIENoYXJWYWwgPSBTdHJbMF0tJ2EnKzEwOworICAgIGVsc2UgaWYgKFN0clswXSA+PSAnQScgJiYgU3RyWzBdIDw9ICdaJykKKyAgICAgIENoYXJWYWwgPSBTdHJbMF0tJ0EnKzEwOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIC8vIElmIHRoZSBwYXJzZWQgdmFsdWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGludGVnZXIgcmFkaXgsIHRoZSBzdHJpbmcgaXMKKyAgICAvLyBpbnZhbGlkLgorICAgIGlmIChDaGFyVmFsID49IFJhZGl4KQorICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgLy8gQWRkIGluIHRoaXMgY2hhcmFjdGVyLgorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBQcmV2UmVzdWx0ID0gUmVzdWx0OworICAgIFJlc3VsdCA9IFJlc3VsdCpSYWRpeCtDaGFyVmFsOworICAgIAorICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdy4KKyAgICBpZiAoUmVzdWx0IDwgUHJldlJlc3VsdCkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgU3RyID0gU3RyLnN1YnN0cigxKTsKKyAgfQorICAKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFN0cmluZ1JlZjo6Z2V0QXNJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCB1bnNpZ25lZCBsb25nIGxvbmcgJlJlc3VsdCkgY29uc3QgeworICByZXR1cm4gR2V0QXNVbnNpZ25lZEludGVnZXIoKnRoaXMsIFJhZGl4LCBSZXN1bHQpOworfQorCisKK2Jvb2wgU3RyaW5nUmVmOjpnZXRBc0ludGVnZXIodW5zaWduZWQgUmFkaXgsIGxvbmcgbG9uZyAmUmVzdWx0KSBjb25zdCB7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBVTExWYWw7CisgIAorICAvLyBIYW5kbGUgcG9zaXRpdmUgc3RyaW5ncyBmaXJzdC4KKyAgaWYgKGVtcHR5KCkgfHwgZnJvbnQoKSAhPSAnLScpIHsKKyAgICBpZiAoR2V0QXNVbnNpZ25lZEludGVnZXIoKnRoaXMsIFJhZGl4LCBVTExWYWwpIHx8CisgICAgICAgIC8vIENoZWNrIGZvciB2YWx1ZSBzbyBsYXJnZSBpdCBvdmVyZmxvd3MgYSBzaWduZWQgdmFsdWUuCisgICAgICAgIChsb25nIGxvbmcpVUxMVmFsIDwgMCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIFJlc3VsdCA9IFVMTFZhbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIEdldCB0aGUgcG9zaXRpdmUgcGFydCBvZiB0aGUgdmFsdWUuCisgIGlmIChHZXRBc1Vuc2lnbmVkSW50ZWdlcihzdWJzdHIoMSksIFJhZGl4LCBVTExWYWwpIHx8CisgICAgICAvLyBSZWplY3QgdmFsdWVzIHNvIGxhcmdlIHRoZXknZCBvdmVyZmxvdyBhcyBuZWdhdGl2ZSBzaWduZWQsIGJ1dCBhbGxvdworICAgICAgLy8gIi0wIi4gIFRoaXMgbmVnYXRlcyB0aGUgdW5zaWduZWQgc28gdGhhdCB0aGUgbmVnYXRpdmUgaXNuJ3QgdW5kZWZpbmVkCisgICAgICAvLyBvbiBzaWduZWQgb3ZlcmZsb3cuCisgICAgICAobG9uZyBsb25nKS1VTExWYWwgPiAwKQorICAgIHJldHVybiB0cnVlOworICAKKyAgUmVzdWx0ID0gLVVMTFZhbDsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFN0cmluZ1JlZjo6Z2V0QXNJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCBpbnQgJlJlc3VsdCkgY29uc3QgeworICBsb25nIGxvbmcgVmFsOworICBpZiAoZ2V0QXNJbnRlZ2VyKFJhZGl4LCBWYWwpIHx8CisgICAgICAoaW50KVZhbCAhPSBWYWwpCisgICAgcmV0dXJuIHRydWU7CisgIFJlc3VsdCA9IFZhbDsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFN0cmluZ1JlZjo6Z2V0QXNJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCB1bnNpZ25lZCAmUmVzdWx0KSBjb25zdCB7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBWYWw7CisgIGlmIChnZXRBc0ludGVnZXIoUmFkaXgsIFZhbCkgfHwKKyAgICAgICh1bnNpZ25lZClWYWwgIT0gVmFsKQorICAgIHJldHVybiB0cnVlOworICBSZXN1bHQgPSBWYWw7CisgIHJldHVybiBmYWxzZTsKK30gIAorCitib29sIFN0cmluZ1JlZjo6Z2V0QXNJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCBBUEludCAmUmVzdWx0KSBjb25zdCB7CisgIFN0cmluZ1JlZiBTdHIgPSAqdGhpczsKKworICAvLyBBdXRvc2Vuc2UgcmFkaXggaWYgbm90IHNwZWNpZmllZC4KKyAgaWYgKFJhZGl4ID09IDApCisgICAgUmFkaXggPSBHZXRBdXRvU2Vuc2VSYWRpeChTdHIpOworCisgIGFzc2VydChSYWRpeCA+IDEgJiYgUmFkaXggPD0gMzYpOworICAKKyAgLy8gRW1wdHkgc3RyaW5ncyAoYWZ0ZXIgdGhlIHJhZGl4IGF1dG9zZW5zZSkgYXJlIGludmFsaWQuCisgIGlmIChTdHIuZW1wdHkoKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gU2tpcCBsZWFkaW5nIHplcm9lcy4gIFRoaXMgY2FuIGJlIGEgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnQgaWYKKyAgLy8gaXQgbWVhbnMgd2UgZG9uJ3QgbmVlZCA+IDY0IGJpdHMuCisgIHdoaWxlICghU3RyLmVtcHR5KCkgJiYgU3RyLmZyb250KCkgPT0gJzAnKQorICAgIFN0ciA9IFN0ci5zdWJzdHIoMSk7CisKKyAgLy8gSWYgaXQgd2FzIG5vdGhpbmcgYnV0IHplcm9lcy4uLi4KKyAgaWYgKFN0ci5lbXB0eSgpKSB7CisgICAgUmVzdWx0ID0gQVBJbnQoNjQsIDApOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIChPdmVyLSllc3RpbWF0ZSB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJpdHMuCisgIHVuc2lnbmVkIExvZzJSYWRpeCA9IDA7CisgIHdoaWxlICgoMVUgPDwgTG9nMlJhZGl4KSA8IFJhZGl4KSBMb2cyUmFkaXgrKzsKKyAgYm9vbCBJc1Bvd2VyT2YyUmFkaXggPSAoKDFVIDw8IExvZzJSYWRpeCkgPT0gUmFkaXgpOworCisgIHVuc2lnbmVkIEJpdFdpZHRoID0gTG9nMlJhZGl4ICogU3RyLnNpemUoKTsKKyAgaWYgKEJpdFdpZHRoIDwgUmVzdWx0LmdldEJpdFdpZHRoKCkpCisgICAgQml0V2lkdGggPSBSZXN1bHQuZ2V0Qml0V2lkdGgoKTsgLy8gZG9uJ3Qgc2hyaW5rIHRoZSByZXN1bHQKKyAgZWxzZQorICAgIFJlc3VsdC56ZXh0KEJpdFdpZHRoKTsKKworICBBUEludCBSYWRpeEFQLCBDaGFyQVA7IC8vIHVudXNlZCB1bmxlc3MgIUlzUG93ZXJPZjJSYWRpeAorICBpZiAoIUlzUG93ZXJPZjJSYWRpeCkgeworICAgIC8vIFRoZXNlIG11c3QgaGF2ZSB0aGUgc2FtZSBiaXQtd2lkdGggYXMgUmVzdWx0LgorICAgIFJhZGl4QVAgPSBBUEludChCaXRXaWR0aCwgUmFkaXgpOworICAgIENoYXJBUCA9IEFQSW50KEJpdFdpZHRoLCAwKTsKKyAgfQorCisgIC8vIFBhcnNlIGFsbCB0aGUgYnl0ZXMgb2YgdGhlIHN0cmluZyBnaXZlbiB0aGlzIHJhZGl4LgorICBSZXN1bHQgPSAwOworICB3aGlsZSAoIVN0ci5lbXB0eSgpKSB7CisgICAgdW5zaWduZWQgQ2hhclZhbDsKKyAgICBpZiAoU3RyWzBdID49ICcwJyAmJiBTdHJbMF0gPD0gJzknKQorICAgICAgQ2hhclZhbCA9IFN0clswXS0nMCc7CisgICAgZWxzZSBpZiAoU3RyWzBdID49ICdhJyAmJiBTdHJbMF0gPD0gJ3onKQorICAgICAgQ2hhclZhbCA9IFN0clswXS0nYScrMTA7CisgICAgZWxzZSBpZiAoU3RyWzBdID49ICdBJyAmJiBTdHJbMF0gPD0gJ1onKQorICAgICAgQ2hhclZhbCA9IFN0clswXS0nQScrMTA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgLy8gSWYgdGhlIHBhcnNlZCB2YWx1ZSBpcyBsYXJnZXIgdGhhbiB0aGUgaW50ZWdlciByYWRpeCwgdGhlIHN0cmluZyBpcworICAgIC8vIGludmFsaWQuCisgICAgaWYgKENoYXJWYWwgPj0gUmFkaXgpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICAvLyBBZGQgaW4gdGhpcyBjaGFyYWN0ZXIuCisgICAgaWYgKElzUG93ZXJPZjJSYWRpeCkgeworICAgICAgUmVzdWx0IDw8PSBMb2cyUmFkaXg7CisgICAgICBSZXN1bHQgfD0gQ2hhclZhbDsKKyAgICB9IGVsc2UgeworICAgICAgUmVzdWx0ICo9IFJhZGl4QVA7CisgICAgICBDaGFyQVAgPSBDaGFyVmFsOworICAgICAgUmVzdWx0ICs9IENoYXJBUDsKKyAgICB9CisKKyAgICBTdHIgPSBTdHIuc3Vic3RyKDEpOworICB9CisgIAorICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9UYXJnZXRSZWdpc3RyeS5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9UYXJnZXRSZWdpc3RyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5NjQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1RhcmdldFJlZ2lzdHJ5LmNwcApAQCAtMCwwICsxLDkyIEBACisvLz09PS0tLSBUYXJnZXRSZWdpc3RyeS5jcHAgLSBUYXJnZXQgcmVnaXN0cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9Ib3N0LmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgYXZvaWQgcmFjZSBjb25kaXRpb25zIGluIHJlZ2lzdHJhdGlvbi4KK3N0YXRpYyBUYXJnZXQgKkZpcnN0VGFyZ2V0ID0gMDsKKworVGFyZ2V0UmVnaXN0cnk6Oml0ZXJhdG9yIFRhcmdldFJlZ2lzdHJ5OjpiZWdpbigpIHsKKyAgcmV0dXJuIGl0ZXJhdG9yKEZpcnN0VGFyZ2V0KTsKK30KKworY29uc3QgVGFyZ2V0ICpUYXJnZXRSZWdpc3RyeTo6bG9va3VwVGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRXJyb3IpIHsKKyAgLy8gUHJvdmlkZSBzcGVjaWFsIHdhcm5pbmcgd2hlbiBubyB0YXJnZXRzIGFyZSBpbml0aWFsaXplZC4KKyAgaWYgKGJlZ2luKCkgPT0gZW5kKCkpIHsKKyAgICBFcnJvciA9ICJVbmFibGUgdG8gZmluZCB0YXJnZXQgZm9yIHRoaXMgdHJpcGxlIChubyB0YXJnZXRzIGFyZSByZWdpc3RlcmVkKSI7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY29uc3QgVGFyZ2V0ICpCZXN0ID0gMCwgKkVxdWFsbHlCZXN0ID0gMDsKKyAgdW5zaWduZWQgQmVzdFF1YWxpdHkgPSAwOworICBmb3IgKGl0ZXJhdG9yIGl0ID0gYmVnaW4oKSwgaWUgPSBlbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICBpZiAodW5zaWduZWQgUXVhbCA9IGl0LT5UcmlwbGVNYXRjaFF1YWxpdHlGbihUVCkpIHsKKyAgICAgIGlmICghQmVzdCB8fCBRdWFsID4gQmVzdFF1YWxpdHkpIHsKKyAgICAgICAgQmVzdCA9ICYqaXQ7CisgICAgICAgIEVxdWFsbHlCZXN0ID0gMDsKKyAgICAgICAgQmVzdFF1YWxpdHkgPSBRdWFsOworICAgICAgfSBlbHNlIGlmIChRdWFsID09IEJlc3RRdWFsaXR5KQorICAgICAgICBFcXVhbGx5QmVzdCA9ICYqaXQ7CisgICAgfQorICB9CisKKyAgaWYgKCFCZXN0KSB7CisgICAgRXJyb3IgPSAiTm8gYXZhaWxhYmxlIHRhcmdldHMgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIHRyaXBsZSwgIgorICAgICAgInNlZSAtdmVyc2lvbiBmb3IgdGhlIGF2YWlsYWJsZSB0YXJnZXRzLiI7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBPdGhlcndpc2UsIHRha2UgdGhlIGJlc3QgdGFyZ2V0LCBidXQgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgdHdvIGVxdWFsbHkKKyAgLy8gZ29vZCBiZXN0IHRhcmdldHMuCisgIGlmIChFcXVhbGx5QmVzdCkgeworICAgIEVycm9yID0gc3RkOjpzdHJpbmcoIkNhbm5vdCBjaG9vc2UgYmV0d2VlbiB0YXJnZXRzIFwiIikgKworICAgICAgQmVzdC0+TmFtZSAgKyAiXCIgYW5kIFwiIiArIEVxdWFsbHlCZXN0LT5OYW1lICsgIlwiIjsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBCZXN0OworfQorCit2b2lkIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3RlclRhcmdldChUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU2hvcnREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OjpUcmlwbGVNYXRjaFF1YWxpdHlGblR5IFRRdWFsaXR5Rm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0pJVCkgeworICBhc3NlcnQoTmFtZSAmJiBTaG9ydERlc2MgJiYgVFF1YWxpdHlGbiAmJgorICAgICAgICAgIk1pc3NpbmcgcmVxdWlyZWQgdGFyZ2V0IGluZm9ybWF0aW9uISIpOworCisgIC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQsIHdlIGFsbG93IHRoaXMgYXMgYQorICAvLyBjb252ZW5pZW5jZSB0byBzb21lIGNsaWVudHMuCisgIGlmIChULk5hbWUpCisgICAgcmV0dXJuOworICAgICAgICAgCisgIC8vIEFkZCB0byB0aGUgbGlzdCBvZiB0YXJnZXRzLgorICBULk5leHQgPSBGaXJzdFRhcmdldDsKKyAgRmlyc3RUYXJnZXQgPSAmVDsKKworICBULk5hbWUgPSBOYW1lOworICBULlNob3J0RGVzYyA9IFNob3J0RGVzYzsKKyAgVC5UcmlwbGVNYXRjaFF1YWxpdHlGbiA9IFRRdWFsaXR5Rm47CisgIFQuSGFzSklUID0gSGFzSklUOworfQorCitjb25zdCBUYXJnZXQgKlRhcmdldFJlZ2lzdHJ5OjpnZXRDbG9zZXN0VGFyZ2V0Rm9ySklUKHN0ZDo6c3RyaW5nICZFcnJvcikgeworICBjb25zdCBUYXJnZXQgKlRoZVRhcmdldCA9IGxvb2t1cFRhcmdldChzeXM6OmdldEhvc3RUcmlwbGUoKSwgRXJyb3IpOworCisgIGlmIChUaGVUYXJnZXQgJiYgIVRoZVRhcmdldC0+aGFzSklUKCkpIHsKKyAgICBFcnJvciA9ICJObyBKSVQgY29tcGF0aWJsZSB0YXJnZXQgYXZhaWxhYmxlIGZvciB0aGlzIGhvc3QiOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIFRoZVRhcmdldDsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvVGltZXIuY3BwIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvVGltZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWUxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9UaW1lci5jcHAKQEAgLTAsMCArMSwzOTMgQEAKKy8vPT09LS0gVGltZXIuY3BwIC0gSW50ZXJ2YWwgVGltaW5nIFN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW50ZXJ2YWwgVGltaW5nIGltcGxlbWVudGF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGltZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NdXRleC5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1Byb2Nlc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBDcmVhdGVJbmZvT3V0cHV0RmlsZSAtIFJldHVybiBhIGZpbGUgc3RyZWFtIHRvIHByaW50IG91ciBvdXRwdXQgb24uCituYW1lc3BhY2UgbGx2bSB7IGV4dGVybiByYXdfb3N0cmVhbSAqQ3JlYXRlSW5mb091dHB1dEZpbGUoKTsgfQorCisvLyBnZXRMaWJTdXBwb3J0SW5mb091dHB1dEZpbGVuYW1lIC0gVGhpcyB1Z2x5IGhhY2sgaXMgYnJvdWdodCB0byB5b3UgY291cnRlc3kKKy8vIG9mIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igb3JkZXJpbmcgYmVpbmcgdW5zcGVjaWZpZWQgYnkgQysrLiAgQmFzaWNhbGx5IHRoZQorLy8gcHJvYmxlbSBpcyB0aGF0IGEgU3RhdGlzdGljIG9iamVjdCBnZXRzIGRlc3Ryb3llZCwgd2hpY2ggZW5kcyB1cCBjYWxsaW5nCisvLyAnR2V0TGliU3VwcG9ydEluZm9PdXRwdXRGaWxlKCknIChiZWxvdyksIHdoaWNoIGNhbGxzIHRoaXMgZnVuY3Rpb24uCisvLyBMaWJTdXBwb3J0SW5mb091dHB1dEZpbGVuYW1lIHVzZWQgdG8gYmUgYSBnbG9iYWwgdmFyaWFibGUsIGJ1dCBzb21ldGltZXMgaXQKKy8vIHdvdWxkIGdldCBkZXN0cm95ZWQgYmVmb3JlIHRoZSBTdGF0aXN0aWMsIGNhdXNpbmcgaGF2b2MgdG8gZW5zdWUuICBXZSAiZml4IgorLy8gdGhpcyBieSBjcmVhdGluZyB0aGUgc3RyaW5nIHRoZSBmaXJzdCB0aW1lIGl0IGlzIG5lZWRlZCBhbmQgbmV2ZXIgZGVzdHJveWluZworLy8gaXQuCitzdGF0aWMgTWFuYWdlZFN0YXRpYzxzdGQ6OnN0cmluZz4gTGliU3VwcG9ydEluZm9PdXRwdXRGaWxlbmFtZTsKK3N0YXRpYyBzdGQ6OnN0cmluZyAmZ2V0TGliU3VwcG9ydEluZm9PdXRwdXRGaWxlbmFtZSgpIHsKKyAgcmV0dXJuICpMaWJTdXBwb3J0SW5mb091dHB1dEZpbGVuYW1lOworfQorCitzdGF0aWMgTWFuYWdlZFN0YXRpYzxzeXM6OlNtYXJ0TXV0ZXg8dHJ1ZT4gPiBUaW1lckxvY2s7CisKK25hbWVzcGFjZSB7CisgIHN0YXRpYyBjbDo6b3B0PGJvb2w+CisgIFRyYWNrU3BhY2UoInRyYWNrLW1lbW9yeSIsIGNsOjpkZXNjKCJFbmFibGUgLXRpbWUtcGFzc2VzIG1lbW9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFja2luZyAodGhpcyBtYXkgYmUgc2xvdykiKSwKKyAgICAgICAgICAgICBjbDo6SGlkZGVuKTsKKworICBzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZywgdHJ1ZT4KKyAgSW5mb091dHB1dEZpbGVuYW1lKCJpbmZvLW91dHB1dC1maWxlIiwgY2w6OnZhbHVlX2Rlc2MoImZpbGVuYW1lIiksCisgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiRmlsZSB0byBhcHBlbmQgLXN0YXRzIGFuZCAtdGltZXIgb3V0cHV0IHRvIiksCisgICAgICAgICAgICAgICAgICAgY2w6OkhpZGRlbiwgY2w6OmxvY2F0aW9uKGdldExpYlN1cHBvcnRJbmZvT3V0cHV0RmlsZW5hbWUoKSkpOworfQorCisvLyBDcmVhdGVJbmZvT3V0cHV0RmlsZSAtIFJldHVybiBhIGZpbGUgc3RyZWFtIHRvIHByaW50IG91ciBvdXRwdXQgb24uCityYXdfb3N0cmVhbSAqbGx2bTo6Q3JlYXRlSW5mb091dHB1dEZpbGUoKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZPdXRwdXRGaWxlbmFtZSA9IGdldExpYlN1cHBvcnRJbmZvT3V0cHV0RmlsZW5hbWUoKTsKKyAgaWYgKE91dHB1dEZpbGVuYW1lLmVtcHR5KCkpCisgICAgcmV0dXJuIG5ldyByYXdfZmRfb3N0cmVhbSgyLCBmYWxzZSk7IC8vIHN0ZGVyci4KKyAgaWYgKE91dHB1dEZpbGVuYW1lID09ICItIikKKyAgICByZXR1cm4gbmV3IHJhd19mZF9vc3RyZWFtKDEsIGZhbHNlKTsgLy8gc3Rkb3V0LgorICAKKyAgLy8gQXBwZW5kIG1vZGUgaXMgdXNlZCBiZWNhdXNlIHRoZSBpbmZvIG91dHB1dCBmaWxlIGlzIG9wZW5lZCBhbmQgY2xvc2VkCisgIC8vIGVhY2ggdGltZSAtc3RhdHMgb3IgLXRpbWUtcGFzc2VzIHdhbnRzIHRvIHByaW50IG91dHB1dCB0byBpdC4gVG8KKyAgLy8gY29tcGVuc2F0ZSBmb3IgdGhpcywgdGhlIHRlc3Qtc3VpdGUgTWFrZWZpbGVzIGhhdmUgY29kZSB0byBkZWxldGUgdGhlCisgIC8vIGluZm8gb3V0cHV0IGZpbGUgYmVmb3JlIHJ1bm5pbmcgY29tbWFuZHMgd2hpY2ggd3JpdGUgdG8gaXQuCisgIHN0ZDo6c3RyaW5nIEVycm9yOworICByYXdfb3N0cmVhbSAqUmVzdWx0ID0gbmV3IHJhd19mZF9vc3RyZWFtKE91dHB1dEZpbGVuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IsIHJhd19mZF9vc3RyZWFtOjpGX0FwcGVuZCk7CisgIGlmIChFcnJvci5lbXB0eSgpKQorICAgIHJldHVybiBSZXN1bHQ7CisgIAorICBlcnJzKCkgPDwgIkVycm9yIG9wZW5pbmcgaW5mby1vdXRwdXQtZmlsZSAnIgorICAgIDw8IE91dHB1dEZpbGVuYW1lIDw8ICIgZm9yIGFwcGVuZGluZyFcbiI7CisgIGRlbGV0ZSBSZXN1bHQ7CisgIHJldHVybiBuZXcgcmF3X2ZkX29zdHJlYW0oMiwgZmFsc2UpOyAvLyBzdGRlcnIuCit9CisKKworc3RhdGljIFRpbWVyR3JvdXAgKkRlZmF1bHRUaW1lckdyb3VwID0gMDsKK3N0YXRpYyBUaW1lckdyb3VwICpnZXREZWZhdWx0VGltZXJHcm91cCgpIHsKKyAgVGltZXJHcm91cCAqdG1wID0gRGVmYXVsdFRpbWVyR3JvdXA7CisgIHN5czo6TWVtb3J5RmVuY2UoKTsKKyAgaWYgKHRtcCkgcmV0dXJuIHRtcDsKKyAgCisgIGxsdm1fYWNxdWlyZV9nbG9iYWxfbG9jaygpOworICB0bXAgPSBEZWZhdWx0VGltZXJHcm91cDsKKyAgaWYgKCF0bXApIHsKKyAgICB0bXAgPSBuZXcgVGltZXJHcm91cCgiTWlzY2VsbGFuZW91cyBVbmdyb3VwZWQgVGltZXJzIik7CisgICAgc3lzOjpNZW1vcnlGZW5jZSgpOworICAgIERlZmF1bHRUaW1lckdyb3VwID0gdG1wOworICB9CisgIGxsdm1fcmVsZWFzZV9nbG9iYWxfbG9jaygpOworCisgIHJldHVybiB0bXA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUaW1lciBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBUaW1lcjo6aW5pdChTdHJpbmdSZWYgTikgeworICBhc3NlcnQoVEcgPT0gMCAmJiAiVGltZXIgYWxyZWFkeSBpbml0aWFsaXplZCIpOworICBOYW1lLmFzc2lnbihOLmJlZ2luKCksIE4uZW5kKCkpOworICBTdGFydGVkID0gZmFsc2U7CisgIFRHID0gZ2V0RGVmYXVsdFRpbWVyR3JvdXAoKTsKKyAgVEctPmFkZFRpbWVyKCp0aGlzKTsKK30KKwordm9pZCBUaW1lcjo6aW5pdChTdHJpbmdSZWYgTiwgVGltZXJHcm91cCAmdGcpIHsKKyAgYXNzZXJ0KFRHID09IDAgJiYgIlRpbWVyIGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgTmFtZS5hc3NpZ24oTi5iZWdpbigpLCBOLmVuZCgpKTsKKyAgU3RhcnRlZCA9IGZhbHNlOworICBURyA9ICZ0ZzsKKyAgVEctPmFkZFRpbWVyKCp0aGlzKTsKK30KKworVGltZXI6On5UaW1lcigpIHsKKyAgaWYgKCFURykgcmV0dXJuOyAgLy8gTmV2ZXIgaW5pdGlhbGl6ZWQsIG9yIGFscmVhZHkgY2xlYXJlZC4KKyAgVEctPnJlbW92ZVRpbWVyKCp0aGlzKTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QgZ2V0TWVtVXNhZ2UoKSB7CisgIGlmICghVHJhY2tTcGFjZSkgcmV0dXJuIDA7CisgIHJldHVybiBzeXM6OlByb2Nlc3M6OkdldE1hbGxvY1VzYWdlKCk7Cit9CisKK1RpbWVSZWNvcmQgVGltZVJlY29yZDo6Z2V0Q3VycmVudFRpbWUoYm9vbCBTdGFydCkgeworICBUaW1lUmVjb3JkIFJlc3VsdDsKKyAgc3lzOjpUaW1lVmFsdWUgbm93KDAsMCksIHVzZXIoMCwwKSwgc3lzKDAsMCk7CisgIAorICBpZiAoU3RhcnQpIHsKKyAgICBSZXN1bHQuTWVtVXNlZCA9IGdldE1lbVVzYWdlKCk7CisgICAgc3lzOjpQcm9jZXNzOjpHZXRUaW1lVXNhZ2Uobm93LCB1c2VyLCBzeXMpOworICB9IGVsc2UgeworICAgIHN5czo6UHJvY2Vzczo6R2V0VGltZVVzYWdlKG5vdywgdXNlciwgc3lzKTsKKyAgICBSZXN1bHQuTWVtVXNlZCA9IGdldE1lbVVzYWdlKCk7CisgIH0KKworICBSZXN1bHQuV2FsbFRpbWUgICA9ICBub3cuc2Vjb25kcygpICsgIG5vdy5taWNyb3NlY29uZHMoKSAvIDEwMDAwMDAuMDsKKyAgUmVzdWx0LlVzZXJUaW1lICAgPSB1c2VyLnNlY29uZHMoKSArIHVzZXIubWljcm9zZWNvbmRzKCkgLyAxMDAwMDAwLjA7CisgIFJlc3VsdC5TeXN0ZW1UaW1lID0gIHN5cy5zZWNvbmRzKCkgKyAgc3lzLm1pY3Jvc2Vjb25kcygpIC8gMTAwMDAwMC4wOworICByZXR1cm4gUmVzdWx0OworfQorCitzdGF0aWMgTWFuYWdlZFN0YXRpYzxzdGQ6OnZlY3RvcjxUaW1lcio+ID4gQWN0aXZlVGltZXJzOworCit2b2lkIFRpbWVyOjpzdGFydFRpbWVyKCkgeworICBTdGFydGVkID0gdHJ1ZTsKKyAgQWN0aXZlVGltZXJzLT5wdXNoX2JhY2sodGhpcyk7CisgIFRpbWUgLT0gVGltZVJlY29yZDo6Z2V0Q3VycmVudFRpbWUodHJ1ZSk7Cit9CisKK3ZvaWQgVGltZXI6OnN0b3BUaW1lcigpIHsKKyAgVGltZSArPSBUaW1lUmVjb3JkOjpnZXRDdXJyZW50VGltZShmYWxzZSk7CisKKyAgaWYgKEFjdGl2ZVRpbWVycy0+YmFjaygpID09IHRoaXMpIHsKKyAgICBBY3RpdmVUaW1lcnMtPnBvcF9iYWNrKCk7CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8VGltZXIqPjo6aXRlcmF0b3IgSSA9CisgICAgICBzdGQ6OmZpbmQoQWN0aXZlVGltZXJzLT5iZWdpbigpLCBBY3RpdmVUaW1lcnMtPmVuZCgpLCB0aGlzKTsKKyAgICBhc3NlcnQoSSAhPSBBY3RpdmVUaW1lcnMtPmVuZCgpICYmICJzdG9wIGJ1dCBubyBzdGFydFRpbWVyPyIpOworICAgIEFjdGl2ZVRpbWVycy0+ZXJhc2UoSSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgcHJpbnRWYWwoZG91YmxlIFZhbCwgZG91YmxlIFRvdGFsLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgaWYgKFRvdGFsIDwgMWUtNykgICAvLyBBdm9pZCBkaXZpZGluZyBieSB6ZXJvLgorICAgIE9TIDw8ICIgICAgICAgIC0tLS0tICAgICAiOworICBlbHNlIHsKKyAgICBPUyA8PCAiICAiIDw8IGZvcm1hdCgiJTcuNGYiLCBWYWwpIDw8ICIgKCI7CisgICAgT1MgPDwgZm9ybWF0KCIlNS4xZiIsIFZhbCoxMDAvVG90YWwpIDw8ICIlKSI7CisgIH0KK30KKwordm9pZCBUaW1lUmVjb3JkOjpwcmludChjb25zdCBUaW1lUmVjb3JkICZUb3RhbCwgcmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmIChUb3RhbC5nZXRVc2VyVGltZSgpKQorICAgIHByaW50VmFsKGdldFVzZXJUaW1lKCksIFRvdGFsLmdldFVzZXJUaW1lKCksIE9TKTsKKyAgaWYgKFRvdGFsLmdldFN5c3RlbVRpbWUoKSkKKyAgICBwcmludFZhbChnZXRTeXN0ZW1UaW1lKCksIFRvdGFsLmdldFN5c3RlbVRpbWUoKSwgT1MpOworICBpZiAoVG90YWwuZ2V0UHJvY2Vzc1RpbWUoKSkKKyAgICBwcmludFZhbChnZXRQcm9jZXNzVGltZSgpLCBUb3RhbC5nZXRQcm9jZXNzVGltZSgpLCBPUyk7CisgIHByaW50VmFsKGdldFdhbGxUaW1lKCksIFRvdGFsLmdldFdhbGxUaW1lKCksIE9TKTsKKyAgCisgIE9TIDw8ICIgICI7CisgIAorICBpZiAoVG90YWwuZ2V0TWVtVXNlZCgpKQorICAgIE9TIDw8IGZvcm1hdCgiJTlsbGQiLCAobG9uZyBsb25nKWdldE1lbVVzZWQoKSkgPDwgIiAgIjsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICBOYW1lZFJlZ2lvblRpbWVyIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgeworCit0eXBlZGVmIFN0cmluZ01hcDxUaW1lcj4gTmFtZTJUaW1lck1hcDsKKworY2xhc3MgTmFtZTJQYWlyTWFwIHsKKyAgU3RyaW5nTWFwPHN0ZDo6cGFpcjxUaW1lckdyb3VwKiwgTmFtZTJUaW1lck1hcD4gPiBNYXA7CitwdWJsaWM6CisgIH5OYW1lMlBhaXJNYXAoKSB7CisgICAgZm9yIChTdHJpbmdNYXA8c3RkOjpwYWlyPFRpbWVyR3JvdXAqLCBOYW1lMlRpbWVyTWFwPiA+OjppdGVyYXRvcgorICAgICAgICAgSSA9IE1hcC5iZWdpbigpLCBFID0gTWFwLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGRlbGV0ZSBJLT5zZWNvbmQuZmlyc3Q7CisgIH0KKyAgCisgIFRpbWVyICZnZXQoU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBHcm91cE5hbWUpIHsKKyAgICBzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBMKCpUaW1lckxvY2spOworICAgIAorICAgIHN0ZDo6cGFpcjxUaW1lckdyb3VwKiwgTmFtZTJUaW1lck1hcD4gJkdyb3VwRW50cnkgPSBNYXBbR3JvdXBOYW1lXTsKKyAgICAKKyAgICBpZiAoIUdyb3VwRW50cnkuZmlyc3QpCisgICAgICBHcm91cEVudHJ5LmZpcnN0ID0gbmV3IFRpbWVyR3JvdXAoR3JvdXBOYW1lKTsKKyAgICAKKyAgICBUaW1lciAmVCA9IEdyb3VwRW50cnkuc2Vjb25kW05hbWVdOworICAgIGlmICghVC5pc0luaXRpYWxpemVkKCkpCisgICAgICBULmluaXQoTmFtZSwgKkdyb3VwRW50cnkuZmlyc3QpOworICAgIHJldHVybiBUOworICB9Cit9OworCit9CisKK3N0YXRpYyBNYW5hZ2VkU3RhdGljPE5hbWUyVGltZXJNYXA+IE5hbWVkVGltZXJzOworc3RhdGljIE1hbmFnZWRTdGF0aWM8TmFtZTJQYWlyTWFwPiBOYW1lZEdyb3VwZWRUaW1lcnM7CisKK3N0YXRpYyBUaW1lciAmZ2V0TmFtZWRSZWdpb25UaW1lcihTdHJpbmdSZWYgTmFtZSkgeworICBzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBMKCpUaW1lckxvY2spOworICAKKyAgVGltZXIgJlQgPSAoKk5hbWVkVGltZXJzKVtOYW1lXTsKKyAgaWYgKCFULmlzSW5pdGlhbGl6ZWQoKSkKKyAgICBULmluaXQoTmFtZSk7CisgIHJldHVybiBUOworfQorCitOYW1lZFJlZ2lvblRpbWVyOjpOYW1lZFJlZ2lvblRpbWVyKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVuYWJsZWQpCisgIDogVGltZVJlZ2lvbighRW5hYmxlZCA/IDAgOiAmZ2V0TmFtZWRSZWdpb25UaW1lcihOYW1lKSkge30KKworTmFtZWRSZWdpb25UaW1lcjo6TmFtZWRSZWdpb25UaW1lcihTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIEdyb3VwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbmFibGVkKQorICA6IFRpbWVSZWdpb24oIUVuYWJsZWQgPyAwIDogJk5hbWVkR3JvdXBlZFRpbWVycy0+Z2V0KE5hbWUsIEdyb3VwTmFtZSkpIHt9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgIFRpbWVyR3JvdXAgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaW1lckdyb3VwTGlzdCAtIFRoaXMgaXMgdGhlIGdsb2JhbCBsaXN0IG9mIFRpbWVyR3JvdXBzLCBtYWludGFpbmVkIGJ5IHRoZQorLy8vIFRpbWVyR3JvdXAgY3Rvci9kdG9yIGFuZCBpcyBwcm90ZWN0ZWQgYnkgdGhlIFRpbWVyTG9jayBsb2NrLgorc3RhdGljIFRpbWVyR3JvdXAgKlRpbWVyR3JvdXBMaXN0ID0gMDsKKworVGltZXJHcm91cDo6VGltZXJHcm91cChTdHJpbmdSZWYgbmFtZSkKKyAgOiBOYW1lKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSksIEZpcnN0VGltZXIoMCkgeworICAgIAorICAvLyBBZGQgdGhlIGdyb3VwIHRvIFRpbWVyR3JvdXBMaXN0LgorICBzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBMKCpUaW1lckxvY2spOworICBpZiAoVGltZXJHcm91cExpc3QpCisgICAgVGltZXJHcm91cExpc3QtPlByZXYgPSAmTmV4dDsKKyAgTmV4dCA9IFRpbWVyR3JvdXBMaXN0OworICBQcmV2ID0gJlRpbWVyR3JvdXBMaXN0OworICBUaW1lckdyb3VwTGlzdCA9IHRoaXM7Cit9CisKK1RpbWVyR3JvdXA6On5UaW1lckdyb3VwKCkgeworICAvLyBJZiB0aGUgdGltZXIgZ3JvdXAgaXMgZGVzdHJveWVkIGJlZm9yZSB0aGUgdGltZXJzIGl0IG93bnMsIGFjY3VtdWxhdGUgYW5kCisgIC8vIHByaW50IHRoZSB0aW1pbmcgZGF0YS4KKyAgd2hpbGUgKEZpcnN0VGltZXIgIT0gMCkKKyAgICByZW1vdmVUaW1lcigqRmlyc3RUaW1lcik7CisgIAorICAvLyBSZW1vdmUgdGhlIGdyb3VwIGZyb20gdGhlIFRpbWVyR3JvdXBMaXN0LgorICBzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBMKCpUaW1lckxvY2spOworICAqUHJldiA9IE5leHQ7CisgIGlmIChOZXh0KQorICAgIE5leHQtPlByZXYgPSBQcmV2OworfQorCisKK3ZvaWQgVGltZXJHcm91cDo6cmVtb3ZlVGltZXIoVGltZXIgJlQpIHsKKyAgc3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gTCgqVGltZXJMb2NrKTsKKyAgCisgIC8vIElmIHRoZSB0aW1lciB3YXMgc3RhcnRlZCwgbW92ZSBpdHMgZGF0YSB0byBUaW1lcnNUb1ByaW50LgorICBpZiAoVC5TdGFydGVkKQorICAgIFRpbWVyc1RvUHJpbnQucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFQuVGltZSwgVC5OYW1lKSk7CisKKyAgVC5URyA9IDA7CisgIAorICAvLyBVbmxpbmsgdGhlIHRpbWVyIGZyb20gb3VyIGxpc3QuCisgICpULlByZXYgPSBULk5leHQ7CisgIGlmIChULk5leHQpCisgICAgVC5OZXh0LT5QcmV2ID0gVC5QcmV2OworICAKKyAgLy8gUHJpbnQgdGhlIHJlcG9ydCB3aGVuIGFsbCB0aW1lcnMgaW4gdGhpcyBncm91cCBhcmUgZGVzdHJveWVkIGlmIHNvbWUgb2YKKyAgLy8gdGhlbSB3ZXJlIHN0YXJ0ZWQuCisgIGlmIChGaXJzdFRpbWVyICE9IDAgfHwgVGltZXJzVG9QcmludC5lbXB0eSgpKQorICAgIHJldHVybjsKKyAgCisgIHJhd19vc3RyZWFtICpPdXRTdHJlYW0gPSBDcmVhdGVJbmZvT3V0cHV0RmlsZSgpOworICBQcmludFF1ZXVlZFRpbWVycygqT3V0U3RyZWFtKTsKKyAgZGVsZXRlIE91dFN0cmVhbTsgICAvLyBDbG9zZSB0aGUgZmlsZS4KK30KKwordm9pZCBUaW1lckdyb3VwOjphZGRUaW1lcihUaW1lciAmVCkgeworICBzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBMKCpUaW1lckxvY2spOworICAKKyAgLy8gQWRkIHRoZSB0aW1lciB0byBvdXIgbGlzdC4KKyAgaWYgKEZpcnN0VGltZXIpCisgICAgRmlyc3RUaW1lci0+UHJldiA9ICZULk5leHQ7CisgIFQuTmV4dCA9IEZpcnN0VGltZXI7CisgIFQuUHJldiA9ICZGaXJzdFRpbWVyOworICBGaXJzdFRpbWVyID0gJlQ7Cit9CisKK3ZvaWQgVGltZXJHcm91cDo6UHJpbnRRdWV1ZWRUaW1lcnMocmF3X29zdHJlYW0gJk9TKSB7CisgIC8vIFNvcnQgdGhlIHRpbWVycyBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IGFtb3VudCBvZiB0aW1lIHRha2VuLgorICBzdGQ6OnNvcnQoVGltZXJzVG9QcmludC5iZWdpbigpLCBUaW1lcnNUb1ByaW50LmVuZCgpKTsKKyAgCisgIFRpbWVSZWNvcmQgVG90YWw7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUaW1lcnNUb1ByaW50LnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgVG90YWwgKz0gVGltZXJzVG9QcmludFtpXS5maXJzdDsKKyAgCisgIC8vIFByaW50IG91dCB0aW1pbmcgaGVhZGVyLgorICBPUyA8PCAiPT09IiA8PCBzdGQ6OnN0cmluZyg3MywgJy0nKSA8PCAiPT09XG4iOworICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IHNwYWNlcyB0byBpbmRlbnQgVGltZXJHcm91cCBuYW1lLgorICB1bnNpZ25lZCBQYWRkaW5nID0gKDgwLU5hbWUubGVuZ3RoKCkpLzI7CisgIGlmIChQYWRkaW5nID4gODApIFBhZGRpbmcgPSAwOyAgICAgICAgIC8vIERvbid0IGFsbG93ICJuZWdhdGl2ZSIgbnVtYmVycworICBPUy5pbmRlbnQoUGFkZGluZykgPDwgTmFtZSA8PCAnXG4nOworICBPUyA8PCAiPT09IiA8PCBzdGQ6OnN0cmluZyg3MywgJy0nKSA8PCAiPT09XG4iOworICAKKyAgLy8gSWYgdGhpcyBpcyBub3QgYW4gY29sbGVjdGlvbiBvZiB1bmdyb3VwZWQgdGltZXMsIHByaW50IHRoZSB0b3RhbCB0aW1lLgorICAvLyBVbmdyb3VwZWQgdGltZXJzIGRvbid0IHJlYWxseSBtYWtlIHNlbnNlIHRvIGFkZCB1cC4gIFdlIHN0aWxsIHByaW50IHRoZQorICAvLyBUT1RBTCBsaW5lIHRvIG1ha2UgdGhlIHBlcmNlbnRhZ2VzIG1ha2Ugc2Vuc2UuCisgIGlmICh0aGlzICE9IERlZmF1bHRUaW1lckdyb3VwKSB7CisgICAgT1MgPDwgIiAgVG90YWwgRXhlY3V0aW9uIFRpbWU6ICI7CisgICAgT1MgPDwgZm9ybWF0KCIlNS40ZiIsIFRvdGFsLmdldFByb2Nlc3NUaW1lKCkpIDw8ICIgc2Vjb25kcyAoIjsKKyAgICBPUyA8PCBmb3JtYXQoIiU1LjRmIiwgVG90YWwuZ2V0V2FsbFRpbWUoKSkgPDwgIiB3YWxsIGNsb2NrKVxuIjsKKyAgfQorICBPUyA8PCAnXG4nOworICAKKyAgaWYgKFRvdGFsLmdldFVzZXJUaW1lKCkpCisgICAgT1MgPDwgIiAgIC0tLVVzZXIgVGltZS0tLSI7CisgIGlmIChUb3RhbC5nZXRTeXN0ZW1UaW1lKCkpCisgICAgT1MgPDwgIiAgIC0tU3lzdGVtIFRpbWUtLSI7CisgIGlmIChUb3RhbC5nZXRQcm9jZXNzVGltZSgpKQorICAgIE9TIDw8ICIgICAtLVVzZXIrU3lzdGVtLS0iOworICBPUyA8PCAiICAgLS0tV2FsbCBUaW1lLS0tIjsKKyAgaWYgKFRvdGFsLmdldE1lbVVzZWQoKSkKKyAgICBPUyA8PCAiICAtLS1NZW0tLS0iOworICBPUyA8PCAiICAtLS0gTmFtZSAtLS1cbiI7CisgIAorICAvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSB0aW1pbmcgZGF0YSwgcHJpbnRpbmcgaXQgb3V0LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVGltZXJzVG9QcmludC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3Qgc3RkOjpwYWlyPFRpbWVSZWNvcmQsIHN0ZDo6c3RyaW5nPiAmRW50cnkgPSBUaW1lcnNUb1ByaW50W2UtaS0xXTsKKyAgICBFbnRyeS5maXJzdC5wcmludChUb3RhbCwgT1MpOworICAgIE9TIDw8IEVudHJ5LnNlY29uZCA8PCAnXG4nOworICB9CisgIAorICBUb3RhbC5wcmludChUb3RhbCwgT1MpOworICBPUyA8PCAiVG90YWxcblxuIjsKKyAgT1MuZmx1c2goKTsKKyAgCisgIFRpbWVyc1RvUHJpbnQuY2xlYXIoKTsKK30KKworLy8vIHByaW50IC0gUHJpbnQgYW55IHN0YXJ0ZWQgdGltZXJzIGluIHRoaXMgZ3JvdXAgYW5kIHplcm8gdGhlbS4KK3ZvaWQgVGltZXJHcm91cDo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSB7CisgIHN5czo6U21hcnRTY29wZWRMb2NrPHRydWU+IEwoKlRpbWVyTG9jayk7CisKKyAgLy8gU2VlIGlmIGFueSBvZiBvdXIgdGltZXJzIHdlcmUgc3RhcnRlZCwgaWYgc28gYWRkIHRoZW0gdG8gVGltZXJzVG9QcmludCBhbmQKKyAgLy8gcmVzZXQgdGhlbS4KKyAgZm9yIChUaW1lciAqVCA9IEZpcnN0VGltZXI7IFQ7IFQgPSBULT5OZXh0KSB7CisgICAgaWYgKCFULT5TdGFydGVkKSBjb250aW51ZTsKKyAgICBUaW1lcnNUb1ByaW50LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihULT5UaW1lLCBULT5OYW1lKSk7CisgICAgCisgICAgLy8gQ2xlYXIgb3V0IHRoZSB0aW1lLgorICAgIFQtPlN0YXJ0ZWQgPSAwOworICAgIFQtPlRpbWUgPSBUaW1lUmVjb3JkKCk7CisgIH0KKworICAvLyBJZiBhbnkgdGltZXJzIHdlcmUgc3RhcnRlZCwgcHJpbnQgdGhlIGdyb3VwLgorICBpZiAoIVRpbWVyc1RvUHJpbnQuZW1wdHkoKSkKKyAgICBQcmludFF1ZXVlZFRpbWVycyhPUyk7Cit9CisKKy8vLyBwcmludEFsbCAtIFRoaXMgc3RhdGljIG1ldGhvZCBwcmludHMgYWxsIHRpbWVycyBhbmQgY2xlYXJzIHRoZW0gYWxsIG91dC4KK3ZvaWQgVGltZXJHcm91cDo6cHJpbnRBbGwocmF3X29zdHJlYW0gJk9TKSB7CisgIHN5czo6U21hcnRTY29wZWRMb2NrPHRydWU+IEwoKlRpbWVyTG9jayk7CisKKyAgZm9yIChUaW1lckdyb3VwICpURyA9IFRpbWVyR3JvdXBMaXN0OyBURzsgVEcgPSBURy0+TmV4dCkKKyAgICBURy0+cHJpbnQoT1MpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvVHJpcGxlLmNwcCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1RyaXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MDQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1RyaXBsZS5jcHAKQEAgLTAsMCArMSw0NzcgQEAKKy8vPT09LS0tIFRyaXBsZS5jcHAgLSBUYXJnZXQgdHJpcGxlIGhlbHBlciBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8KKworY29uc3QgY2hhciAqVHJpcGxlOjpnZXRBcmNoVHlwZU5hbWUoQXJjaFR5cGUgS2luZCkgeworICBzd2l0Y2ggKEtpbmQpIHsKKyAgY2FzZSBJbnZhbGlkQXJjaDogcmV0dXJuICI8aW52YWxpZD4iOworICBjYXNlIFVua25vd25BcmNoOiByZXR1cm4gInVua25vd24iOworICAgIAorICBjYXNlIGFscGhhOiAgIHJldHVybiAiYWxwaGEiOworICBjYXNlIGFybTogICAgIHJldHVybiAiYXJtIjsKKyAgY2FzZSBiZmluOiAgICByZXR1cm4gImJmaW4iOworICBjYXNlIGNlbGxzcHU6IHJldHVybiAiY2VsbHNwdSI7CisgIGNhc2UgbWlwczogICAgcmV0dXJuICJtaXBzIjsKKyAgY2FzZSBtaXBzZWw6ICByZXR1cm4gIm1pcHNlbCI7CisgIGNhc2UgbXNwNDMwOiAgcmV0dXJuICJtc3A0MzAiOworICBjYXNlIHBpYzE2OiAgIHJldHVybiAicGljMTYiOworICBjYXNlIHBwYzY0OiAgIHJldHVybiAicG93ZXJwYzY0IjsKKyAgY2FzZSBwcGM6ICAgICByZXR1cm4gInBvd2VycGMiOworICBjYXNlIHNwYXJjOiAgIHJldHVybiAic3BhcmMiOworICBjYXNlIHNwYXJjdjk6IHJldHVybiAic3BhcmN2OSI7CisgIGNhc2Ugc3lzdGVtejogcmV0dXJuICJzMzkweCI7CisgIGNhc2UgdGNlOiAgICAgcmV0dXJuICJ0Y2UiOworICBjYXNlIHRodW1iOiAgIHJldHVybiAidGh1bWIiOworICBjYXNlIHg4NjogICAgIHJldHVybiAiaTM4NiI7CisgIGNhc2UgeDg2XzY0OiAgcmV0dXJuICJ4ODZfNjQiOworICBjYXNlIHhjb3JlOiAgIHJldHVybiAieGNvcmUiOworICBjYXNlIG1ibGF6ZTogIHJldHVybiAibWJsYXplIjsKKyAgfQorCisgIHJldHVybiAiPGludmFsaWQ+IjsKK30KKworY29uc3QgY2hhciAqVHJpcGxlOjpnZXRBcmNoVHlwZVByZWZpeChBcmNoVHlwZSBLaW5kKSB7CisgIHN3aXRjaCAoS2luZCkgeworICBkZWZhdWx0OgorICAgIHJldHVybiAwOworCisgIGNhc2UgYWxwaGE6ICAgcmV0dXJuICJhbHBoYSI7CisKKyAgY2FzZSBhcm06CisgIGNhc2UgdGh1bWI6ICAgcmV0dXJuICJhcm0iOworCisgIGNhc2UgYmZpbjogICAgcmV0dXJuICJiZmluIjsKKworICBjYXNlIGNlbGxzcHU6IHJldHVybiAic3B1IjsKKworICBjYXNlIHBwYzY0OgorICBjYXNlIHBwYzogICAgIHJldHVybiAicHBjIjsKKworICBjYXNlIG1ibGF6ZTogIHJldHVybiAibWJsYXplIjsKKworICBjYXNlIHNwYXJjdjk6CisgIGNhc2Ugc3BhcmM6ICAgcmV0dXJuICJzcGFyYyI7CisKKyAgY2FzZSB4ODY6CisgIGNhc2UgeDg2XzY0OiAgcmV0dXJuICJ4ODYiOworICBjYXNlIHhjb3JlOiAgIHJldHVybiAieGNvcmUiOworICB9Cit9CisKK2NvbnN0IGNoYXIgKlRyaXBsZTo6Z2V0VmVuZG9yVHlwZU5hbWUoVmVuZG9yVHlwZSBLaW5kKSB7CisgIHN3aXRjaCAoS2luZCkgeworICBjYXNlIFVua25vd25WZW5kb3I6IHJldHVybiAidW5rbm93biI7CisKKyAgY2FzZSBBcHBsZTogcmV0dXJuICJhcHBsZSI7CisgIGNhc2UgUEM6IHJldHVybiAicGMiOworICB9CisKKyAgcmV0dXJuICI8aW52YWxpZD4iOworfQorCitjb25zdCBjaGFyICpUcmlwbGU6OmdldE9TVHlwZU5hbWUoT1NUeXBlIEtpbmQpIHsKKyAgc3dpdGNoIChLaW5kKSB7CisgIGNhc2UgVW5rbm93bk9TOiByZXR1cm4gInVua25vd24iOworCisgIGNhc2UgQXVyb3JhVVg6IHJldHVybiAiYXVyb3JhdXgiOworICBjYXNlIEN5Z3dpbjogcmV0dXJuICJjeWd3aW4iOworICBjYXNlIERhcndpbjogcmV0dXJuICJkYXJ3aW4iOworICBjYXNlIERyYWdvbkZseTogcmV0dXJuICJkcmFnb25mbHkiOworICBjYXNlIEZyZWVCU0Q6IHJldHVybiAiZnJlZWJzZCI7CisgIGNhc2UgTGludXg6IHJldHVybiAibGludXgiOworICBjYXNlIEx2MjogcmV0dXJuICJsdjIiOworICBjYXNlIE1pbkdXMzI6IHJldHVybiAibWluZ3czMiI7CisgIGNhc2UgTWluR1c2NDogcmV0dXJuICJtaW5ndzY0IjsKKyAgY2FzZSBOZXRCU0Q6IHJldHVybiAibmV0YnNkIjsKKyAgY2FzZSBPcGVuQlNEOiByZXR1cm4gIm9wZW5ic2QiOworICBjYXNlIFBzcDogcmV0dXJuICJwc3AiOworICBjYXNlIFNvbGFyaXM6IHJldHVybiAic29sYXJpcyI7CisgIGNhc2UgV2luMzI6IHJldHVybiAid2luMzIiOworICBjYXNlIEhhaWt1OiByZXR1cm4gImhhaWt1IjsKKyAgY2FzZSBNaW5peDogcmV0dXJuICJtaW5peCI7CisgIH0KKworICByZXR1cm4gIjxpbnZhbGlkPiI7Cit9CisKK1RyaXBsZTo6QXJjaFR5cGUgVHJpcGxlOjpnZXRBcmNoVHlwZUZvckxMVk1OYW1lKFN0cmluZ1JlZiBOYW1lKSB7CisgIGlmIChOYW1lID09ICJhbHBoYSIpCisgICAgcmV0dXJuIGFscGhhOworICBpZiAoTmFtZSA9PSAiYXJtIikKKyAgICByZXR1cm4gYXJtOworICBpZiAoTmFtZSA9PSAiYmZpbiIpCisgICAgcmV0dXJuIGJmaW47CisgIGlmIChOYW1lID09ICJjZWxsc3B1IikKKyAgICByZXR1cm4gY2VsbHNwdTsKKyAgaWYgKE5hbWUgPT0gIm1pcHMiKQorICAgIHJldHVybiBtaXBzOworICBpZiAoTmFtZSA9PSAibWlwc2VsIikKKyAgICByZXR1cm4gbWlwc2VsOworICBpZiAoTmFtZSA9PSAibXNwNDMwIikKKyAgICByZXR1cm4gbXNwNDMwOworICBpZiAoTmFtZSA9PSAicGljMTYiKQorICAgIHJldHVybiBwaWMxNjsKKyAgaWYgKE5hbWUgPT0gInBwYzY0IikKKyAgICByZXR1cm4gcHBjNjQ7CisgIGlmIChOYW1lID09ICJwcGMiKQorICAgIHJldHVybiBwcGM7CisgIGlmIChOYW1lID09ICJtYmxhemUiKQorICAgIHJldHVybiBtYmxhemU7CisgIGlmIChOYW1lID09ICJzcGFyYyIpCisgICAgcmV0dXJuIHNwYXJjOworICBpZiAoTmFtZSA9PSAic3BhcmN2OSIpCisgICAgcmV0dXJuIHNwYXJjdjk7CisgIGlmIChOYW1lID09ICJzeXN0ZW16IikKKyAgICByZXR1cm4gc3lzdGVtejsKKyAgaWYgKE5hbWUgPT0gInRjZSIpCisgICAgcmV0dXJuIHRjZTsKKyAgaWYgKE5hbWUgPT0gInRodW1iIikKKyAgICByZXR1cm4gdGh1bWI7CisgIGlmIChOYW1lID09ICJ4ODYiKQorICAgIHJldHVybiB4ODY7CisgIGlmIChOYW1lID09ICJ4ODYtNjQiKQorICAgIHJldHVybiB4ODZfNjQ7CisgIGlmIChOYW1lID09ICJ4Y29yZSIpCisgICAgcmV0dXJuIHhjb3JlOworCisgIHJldHVybiBVbmtub3duQXJjaDsKK30KKworVHJpcGxlOjpBcmNoVHlwZSBUcmlwbGU6OmdldEFyY2hUeXBlRm9yRGFyd2luQXJjaE5hbWUoU3RyaW5nUmVmIFN0cikgeworICAvLyBTZWUgYXJjaCgzKSBhbmQgbGx2bS1nY2MncyBkcml2ZXItZHJpdmVyLmMuIFdlIGRvbid0IGltcGxlbWVudCBzdXBwb3J0IGZvcgorICAvLyBhcmNocyB3aGljaCBEYXJ3aW4gZG9lc24ndCB1c2UuCisKKyAgLy8gVGhlIG1hdGNoaW5nIHRoaXMgcm91dGluZSBkb2VzIGlzIGZhaXJseSBwb2ludGxlc3MsIHNpbmNlIGl0IGlzIG5laXRoZXIgdGhlCisgIC8vIGNvbXBsZXRlIGFyY2hpdGVjdHVyZSBsaXN0LCBub3IgYSByZWFzb25hYmxlIHN1YnNldC4gVGhlIHByb2JsZW0gaXMgdGhhdAorICAvLyBoaXN0b3JpY2FsbHkgdGhlIGRyaXZlciBkcml2ZXIgYWNjZXB0cyB0aGlzIGFuZCBhbHNvIHRpZXMgaXRzIC1tYXJjaD0KKyAgLy8gaGFuZGxpbmcgdG8gdGhlIGFyY2hpdGVjdHVyZSBuYW1lLCBzbyB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgYmVmb3JlIHJlbW92aW5nCisgIC8vIHN1cHBvcnQgZm9yIGl0LgorCisgIC8vIFRoaXMgY29kZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIENsYW5nJ3MgRGFyd2luIHNwZWNpZmljIGFyZ3VtZW50CisgIC8vIHRyYW5zbGF0aW9uLgorCisgIGlmIChTdHIgPT0gInBwYyIgfHwgU3RyID09ICJwcGM2MDEiIHx8IFN0ciA9PSAicHBjNjAzIiB8fCBTdHIgPT0gInBwYzYwNCIgfHwKKyAgICAgIFN0ciA9PSAicHBjNjA0ZSIgfHwgU3RyID09ICJwcGM3NTAiIHx8IFN0ciA9PSAicHBjNzQwMCIgfHwKKyAgICAgIFN0ciA9PSAicHBjNzQ1MCIgfHwgU3RyID09ICJwcGM5NzAiKQorICAgIHJldHVybiBUcmlwbGU6OnBwYzsKKworICBpZiAoU3RyID09ICJwcGM2NCIpCisgICAgcmV0dXJuIFRyaXBsZTo6cHBjNjQ7CisKKyAgaWYgKFN0ciA9PSAiaTM4NiIgfHwgU3RyID09ICJpNDg2IiB8fCBTdHIgPT0gImk0ODZTWCIgfHwgU3RyID09ICJwZW50aXVtIiB8fAorICAgICAgU3RyID09ICJpNTg2IiB8fCBTdHIgPT0gInBlbnRwcm8iIHx8IFN0ciA9PSAiaTY4NiIgfHwgU3RyID09ICJwZW50SUltMyIgfHwKKyAgICAgIFN0ciA9PSAicGVudElJbTUiIHx8IFN0ciA9PSAicGVudGl1bTQiKQorICAgIHJldHVybiBUcmlwbGU6Ong4NjsKKworICBpZiAoU3RyID09ICJ4ODZfNjQiKQorICAgIHJldHVybiBUcmlwbGU6Ong4Nl82NDsKKworICAvLyBUaGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgZHJpdmVyIGRyaXZlci4KKyAgaWYgKFN0ciA9PSAiYXJtIiB8fCBTdHIgPT0gImFybXY0dCIgfHwgU3RyID09ICJhcm12NSIgfHwgU3RyID09ICJ4c2NhbGUiIHx8CisgICAgICBTdHIgPT0gImFybXY2IiB8fCBTdHIgPT0gImFybXY3IikKKyAgICByZXR1cm4gVHJpcGxlOjphcm07CisKKyAgcmV0dXJuIFRyaXBsZTo6VW5rbm93bkFyY2g7Cit9CisKKy8vIFJldHVybnMgYXJjaGl0ZWN0dXJlIG5hbWUgdGhhdCBpcyB1bmRlcnN0b29kIGJ5IHRoZSB0YXJnZXQgYXNzZW1ibGVyLgorY29uc3QgY2hhciAqVHJpcGxlOjpnZXRBcmNoTmFtZUZvckFzc2VtYmxlcigpIHsKKyAgaWYgKGdldE9TKCkgIT0gVHJpcGxlOjpEYXJ3aW4gJiYgZ2V0VmVuZG9yKCkgIT0gVHJpcGxlOjpBcHBsZSkKKyAgICByZXR1cm4gTlVMTDsKKworICBTdHJpbmdSZWYgU3RyID0gZ2V0QXJjaE5hbWUoKTsKKyAgaWYgKFN0ciA9PSAiaTM4NiIpCisgICAgcmV0dXJuICJpMzg2IjsKKyAgaWYgKFN0ciA9PSAieDg2XzY0IikKKyAgICByZXR1cm4gIng4Nl82NCI7CisgIGlmIChTdHIgPT0gInBvd2VycGMiKQorICAgIHJldHVybiAicHBjIjsKKyAgaWYgKFN0ciA9PSAicG93ZXJwYzY0IikKKyAgICByZXR1cm4gInBwYzY0IjsKKyAgaWYgKFN0ciA9PSAibWJsYXplIiB8fCBTdHIgPT0gIm1pY3JvYmxhemUiKQorICAgIHJldHVybiAibWJsYXplIjsKKyAgaWYgKFN0ciA9PSAiYXJtIikKKyAgICByZXR1cm4gImFybSI7CisgIGlmIChTdHIgPT0gImFybXY0dCIgfHwgU3RyID09ICJ0aHVtYnY0dCIpCisgICAgcmV0dXJuICJhcm12NHQiOworICBpZiAoU3RyID09ICJhcm12NSIgfHwgU3RyID09ICJhcm12NWUiIHx8IFN0ciA9PSAidGh1bWJ2NSIgfHwgU3RyID09ICJ0aHVtYnY1ZSIpCisgICAgcmV0dXJuICJhcm12NSI7CisgIGlmIChTdHIgPT0gImFybXY2IiB8fCBTdHIgPT0gInRodW1idjYiKQorICAgIHJldHVybiAiYXJtdjYiOworICBpZiAoU3RyID09ICJhcm12NyIgfHwgU3RyID09ICJ0aHVtYnY3IikKKyAgICByZXR1cm4gImFybXY3IjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vCisKK3ZvaWQgVHJpcGxlOjpQYXJzZSgpIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc0luaXRpYWxpemVkKCkgJiYgIkludmFsaWQgcGFyc2UgY2FsbC4iKTsKKworICBTdHJpbmdSZWYgQXJjaE5hbWUgPSBnZXRBcmNoTmFtZSgpOworICBTdHJpbmdSZWYgVmVuZG9yTmFtZSA9IGdldFZlbmRvck5hbWUoKTsKKyAgU3RyaW5nUmVmIE9TTmFtZSA9IGdldE9TTmFtZSgpOworCisgIGlmIChBcmNoTmFtZS5zaXplKCkgPT0gNCAmJiBBcmNoTmFtZVswXSA9PSAnaScgJiYgCisgICAgICBBcmNoTmFtZVsyXSA9PSAnOCcgJiYgQXJjaE5hbWVbM10gPT0gJzYnICYmIAorICAgICAgQXJjaE5hbWVbMV0gLSAnMycgPCA2KSAvLyBpWzMtOV04NgorICAgIEFyY2ggPSB4ODY7CisgIGVsc2UgaWYgKEFyY2hOYW1lID09ICJhbWQ2NCIgfHwgQXJjaE5hbWUgPT0gIng4Nl82NCIpCisgICAgQXJjaCA9IHg4Nl82NDsKKyAgZWxzZSBpZiAoQXJjaE5hbWUgPT0gImJmaW4iKQorICAgIEFyY2ggPSBiZmluOworICBlbHNlIGlmIChBcmNoTmFtZSA9PSAicGljMTYiKQorICAgIEFyY2ggPSBwaWMxNjsKKyAgZWxzZSBpZiAoQXJjaE5hbWUgPT0gInBvd2VycGMiKQorICAgIEFyY2ggPSBwcGM7CisgIGVsc2UgaWYgKChBcmNoTmFtZSA9PSAicG93ZXJwYzY0IikgfHwgKEFyY2hOYW1lID09ICJwcHUiKSkKKyAgICBBcmNoID0gcHBjNjQ7CisgIGVsc2UgaWYgKEFyY2hOYW1lID09ICJtYmxhemUiKQorICAgIEFyY2ggPSBtYmxhemU7CisgIGVsc2UgaWYgKEFyY2hOYW1lID09ICJhcm0iIHx8CisgICAgICAgICAgIEFyY2hOYW1lLnN0YXJ0c3dpdGgoImFybXYiKSB8fAorICAgICAgICAgICBBcmNoTmFtZSA9PSAieHNjYWxlIikKKyAgICBBcmNoID0gYXJtOworICBlbHNlIGlmIChBcmNoTmFtZSA9PSAidGh1bWIiIHx8CisgICAgICAgICAgIEFyY2hOYW1lLnN0YXJ0c3dpdGgoInRodW1idiIpKQorICAgIEFyY2ggPSB0aHVtYjsKKyAgZWxzZSBpZiAoQXJjaE5hbWUuc3RhcnRzd2l0aCgiYWxwaGEiKSkKKyAgICBBcmNoID0gYWxwaGE7CisgIGVsc2UgaWYgKEFyY2hOYW1lID09ICJzcHUiIHx8IEFyY2hOYW1lID09ICJjZWxsc3B1IikKKyAgICBBcmNoID0gY2VsbHNwdTsKKyAgZWxzZSBpZiAoQXJjaE5hbWUgPT0gIm1zcDQzMCIpCisgICAgQXJjaCA9IG1zcDQzMDsKKyAgZWxzZSBpZiAoQXJjaE5hbWUgPT0gIm1pcHMiIHx8IEFyY2hOYW1lID09ICJtaXBzYWxsZWdyZXgiKQorICAgIEFyY2ggPSBtaXBzOworICBlbHNlIGlmIChBcmNoTmFtZSA9PSAibWlwc2VsIiB8fCBBcmNoTmFtZSA9PSAibWlwc2FsbGVncmV4ZWwiIHx8CisgICAgICAgICAgIEFyY2hOYW1lID09ICJwc3AiKQorICAgIEFyY2ggPSBtaXBzZWw7CisgIGVsc2UgaWYgKEFyY2hOYW1lID09ICJzcGFyYyIpCisgICAgQXJjaCA9IHNwYXJjOworICBlbHNlIGlmIChBcmNoTmFtZSA9PSAic3BhcmN2OSIpCisgICAgQXJjaCA9IHNwYXJjdjk7CisgIGVsc2UgaWYgKEFyY2hOYW1lID09ICJzMzkweCIpCisgICAgQXJjaCA9IHN5c3RlbXo7CisgIGVsc2UgaWYgKEFyY2hOYW1lID09ICJ0Y2UiKQorICAgIEFyY2ggPSB0Y2U7CisgIGVsc2UgaWYgKEFyY2hOYW1lID09ICJ4Y29yZSIpCisgICAgQXJjaCA9IHhjb3JlOworICBlbHNlCisgICAgQXJjaCA9IFVua25vd25BcmNoOworCisKKyAgLy8gSGFuZGxlIHNvbWUgZXhjZXB0aW9uYWwgY2FzZXMgd2hlcmUgdGhlIE9TIC8gZW52aXJvbm1lbnQgY29tcG9uZW50cyBhcmUKKyAgLy8gc3R1Y2sgaW50byB0aGUgdmVuZG9yIGZpZWxkLgorICBpZiAoU3RyaW5nUmVmKGdldFRyaXBsZSgpKS5jb3VudCgnLScpID09IDEpIHsKKyAgICBTdHJpbmdSZWYgVmVuZG9yTmFtZSA9IGdldFZlbmRvck5hbWUoKTsKKworICAgIGlmIChWZW5kb3JOYW1lLnN0YXJ0c3dpdGgoIm1pbmd3MzIiKSkgeyAvLyAnaTM4Ni1taW5ndzMyJywgZXRjLgorICAgICAgVmVuZG9yID0gUEM7CisgICAgICBPUyA9IE1pbkdXMzI7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gYXJtLWVsZiBpcyBhbm90aGVyIGV4YW1wbGUsIGJ1dCB3ZSBkb24ndCBjdXJyZW50bHkgcGFyc2UgYW55dGhpbmcgYWJvdXQKKyAgICAvLyB0aGUgZW52aXJvbm1lbnQuCisgIH0KKworICBpZiAoVmVuZG9yTmFtZSA9PSAiYXBwbGUiKQorICAgIFZlbmRvciA9IEFwcGxlOworICBlbHNlIGlmIChWZW5kb3JOYW1lID09ICJwYyIpCisgICAgVmVuZG9yID0gUEM7CisgIGVsc2UKKyAgICBWZW5kb3IgPSBVbmtub3duVmVuZG9yOworCisgIGlmIChPU05hbWUuc3RhcnRzd2l0aCgiYXVyb3JhdXgiKSkKKyAgICBPUyA9IEF1cm9yYVVYOworICBlbHNlIGlmIChPU05hbWUuc3RhcnRzd2l0aCgiY3lnd2luIikpCisgICAgT1MgPSBDeWd3aW47CisgIGVsc2UgaWYgKE9TTmFtZS5zdGFydHN3aXRoKCJkYXJ3aW4iKSkKKyAgICBPUyA9IERhcndpbjsKKyAgZWxzZSBpZiAoT1NOYW1lLnN0YXJ0c3dpdGgoImRyYWdvbmZseSIpKQorICAgIE9TID0gRHJhZ29uRmx5OworICBlbHNlIGlmIChPU05hbWUuc3RhcnRzd2l0aCgiZnJlZWJzZCIpKQorICAgIE9TID0gRnJlZUJTRDsKKyAgZWxzZSBpZiAoT1NOYW1lLnN0YXJ0c3dpdGgoImxpbnV4IikpCisgICAgT1MgPSBMaW51eDsKKyAgZWxzZSBpZiAoT1NOYW1lLnN0YXJ0c3dpdGgoImx2MiIpKQorICAgIE9TID0gTHYyOworICBlbHNlIGlmIChPU05hbWUuc3RhcnRzd2l0aCgibWluZ3czMiIpKQorICAgIE9TID0gTWluR1czMjsKKyAgZWxzZSBpZiAoT1NOYW1lLnN0YXJ0c3dpdGgoIm1pbmd3NjQiKSkKKyAgICBPUyA9IE1pbkdXNjQ7CisgIGVsc2UgaWYgKE9TTmFtZS5zdGFydHN3aXRoKCJuZXRic2QiKSkKKyAgICBPUyA9IE5ldEJTRDsKKyAgZWxzZSBpZiAoT1NOYW1lLnN0YXJ0c3dpdGgoIm9wZW5ic2QiKSkKKyAgICBPUyA9IE9wZW5CU0Q7CisgIGVsc2UgaWYgKE9TTmFtZS5zdGFydHN3aXRoKCJwc3AiKSkKKyAgICBPUyA9IFBzcDsKKyAgZWxzZSBpZiAoT1NOYW1lLnN0YXJ0c3dpdGgoInNvbGFyaXMiKSkKKyAgICBPUyA9IFNvbGFyaXM7CisgIGVsc2UgaWYgKE9TTmFtZS5zdGFydHN3aXRoKCJ3aW4zMiIpKQorICAgIE9TID0gV2luMzI7CisgIGVsc2UgaWYgKE9TTmFtZS5zdGFydHN3aXRoKCJoYWlrdSIpKQorICAgIE9TID0gSGFpa3U7CisgIGVsc2UgaWYgKE9TTmFtZS5zdGFydHN3aXRoKCJtaW5peCIpKQorICAgIE9TID0gTWluaXg7CisgIGVsc2UKKyAgICBPUyA9IFVua25vd25PUzsKKworICBhc3NlcnQoaXNJbml0aWFsaXplZCgpICYmICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSEiKTsKK30KKworU3RyaW5nUmVmIFRyaXBsZTo6Z2V0QXJjaE5hbWUoKSBjb25zdCB7CisgIHJldHVybiBTdHJpbmdSZWYoRGF0YSkuc3BsaXQoJy0nKS5maXJzdDsgICAgICAgICAgIC8vIElzb2xhdGUgZmlyc3QgY29tcG9uZW50Cit9CisKK1N0cmluZ1JlZiBUcmlwbGU6OmdldFZlbmRvck5hbWUoKSBjb25zdCB7CisgIFN0cmluZ1JlZiBUbXAgPSBTdHJpbmdSZWYoRGF0YSkuc3BsaXQoJy0nKS5zZWNvbmQ7IC8vIFN0cmlwIGZpcnN0IGNvbXBvbmVudAorICByZXR1cm4gVG1wLnNwbGl0KCctJykuZmlyc3Q7ICAgICAgICAgICAgICAgICAgICAgICAvLyBJc29sYXRlIHNlY29uZCBjb21wb25lbnQKK30KKworU3RyaW5nUmVmIFRyaXBsZTo6Z2V0T1NOYW1lKCkgY29uc3QgeworICBTdHJpbmdSZWYgVG1wID0gU3RyaW5nUmVmKERhdGEpLnNwbGl0KCctJykuc2Vjb25kOyAvLyBTdHJpcCBmaXJzdCBjb21wb25lbnQKKyAgVG1wID0gVG1wLnNwbGl0KCctJykuc2Vjb25kOyAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaXAgc2Vjb25kIGNvbXBvbmVudAorICByZXR1cm4gVG1wLnNwbGl0KCctJykuZmlyc3Q7ICAgICAgICAgICAgICAgICAgICAgICAvLyBJc29sYXRlIHRoaXJkIGNvbXBvbmVudAorfQorCitTdHJpbmdSZWYgVHJpcGxlOjpnZXRFbnZpcm9ubWVudE5hbWUoKSBjb25zdCB7CisgIFN0cmluZ1JlZiBUbXAgPSBTdHJpbmdSZWYoRGF0YSkuc3BsaXQoJy0nKS5zZWNvbmQ7IC8vIFN0cmlwIGZpcnN0IGNvbXBvbmVudAorICBUbXAgPSBUbXAuc3BsaXQoJy0nKS5zZWNvbmQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCBzZWNvbmQgY29tcG9uZW50CisgIHJldHVybiBUbXAuc3BsaXQoJy0nKS5zZWNvbmQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIHRoaXJkIGNvbXBvbmVudAorfQorCitTdHJpbmdSZWYgVHJpcGxlOjpnZXRPU0FuZEVudmlyb25tZW50TmFtZSgpIGNvbnN0IHsKKyAgU3RyaW5nUmVmIFRtcCA9IFN0cmluZ1JlZihEYXRhKS5zcGxpdCgnLScpLnNlY29uZDsgLy8gU3RyaXAgZmlyc3QgY29tcG9uZW50CisgIHJldHVybiBUbXAuc3BsaXQoJy0nKS5zZWNvbmQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIHNlY29uZCBjb21wb25lbnQKK30KKworc3RhdGljIHVuc2lnbmVkIEVhdE51bWJlcihTdHJpbmdSZWYgJlN0cikgeworICBhc3NlcnQoIVN0ci5lbXB0eSgpICYmIFN0clswXSA+PSAnMCcgJiYgU3RyWzBdIDw9ICc5JyAmJiAiTm90IGEgbnVtYmVyIik7CisgIHVuc2lnbmVkIFJlc3VsdCA9IFN0clswXS0nMCc7CisgIAorICAvLyBFYXQgdGhlIGRpZ2l0LgorICBTdHIgPSBTdHIuc3Vic3RyKDEpOworICAKKyAgLy8gSGFuZGxlICJkYXJ3aW4xMSIuCisgIGlmIChSZXN1bHQgPT0gMSAmJiAhU3RyLmVtcHR5KCkgJiYgU3RyWzBdID49ICcwJyAmJiBTdHJbMF0gPD0gJzknKSB7CisgICAgUmVzdWx0ID0gUmVzdWx0KjEwICsgKFN0clswXSAtICcwJyk7CisgICAgLy8gRWF0IHRoZSBkaWdpdC4KKyAgICBTdHIgPSBTdHIuc3Vic3RyKDEpOworICB9CisgIAorICByZXR1cm4gUmVzdWx0OworfQorCisvLy8gZ2V0RGFyd2luTnVtYmVyIC0gUGFyc2UgdGhlICdkYXJ3aW4gbnVtYmVyJyBvdXQgb2YgdGhlIHNwZWNpZmljIHRhcmdldAorLy8vIHRyaXBsZS4gIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGRhcndpbjguNSByZXR1cm4gOCw1LDAuICBJZiBhbnkgZW50cnkgaXMKKy8vLyBub3QgZGVmaW5lZCwgcmV0dXJuIDAncy4gIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgdHJpcGxlIGhhdmUgYW4gT1NUeXBlIG9mCisvLy8gZGFyd2luIGJlZm9yZSBpdCBpcyBjYWxsZWQuCit2b2lkIFRyaXBsZTo6Z2V0RGFyd2luTnVtYmVyKHVuc2lnbmVkICZNYWosIHVuc2lnbmVkICZNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZSZXZpc2lvbikgY29uc3QgeworICBhc3NlcnQoZ2V0T1MoKSA9PSBEYXJ3aW4gJiYgIk5vdCBhIGRhcndpbiB0YXJnZXQgdHJpcGxlISIpOworICBTdHJpbmdSZWYgT1NOYW1lID0gZ2V0T1NOYW1lKCk7CisgIGFzc2VydChPU05hbWUuc3RhcnRzd2l0aCgiZGFyd2luIikgJiYgIlVua25vd24gZGFyd2luIHRhcmdldCB0cmlwbGUhIik7CisgIAorICAvLyBTdHJpcCBvZmYgImRhcndpbiIuCisgIE9TTmFtZSA9IE9TTmFtZS5zdWJzdHIoNik7CisgIAorICBNYWogPSBNaW4gPSBSZXZpc2lvbiA9IDA7CisKKyAgaWYgKE9TTmFtZS5lbXB0eSgpIHx8IE9TTmFtZVswXSA8ICcwJyB8fCBPU05hbWVbMF0gPiAnOScpCisgICAgcmV0dXJuOworCisgIC8vIFRoZSBtYWpvciB2ZXJzaW9uIGlzIHRoZSBmaXJzdCBkaWdpdC4KKyAgTWFqID0gRWF0TnVtYmVyKE9TTmFtZSk7CisgIGlmIChPU05hbWUuZW1wdHkoKSkgcmV0dXJuOworICAKKyAgLy8gSGFuZGxlIG1pbm9yIHZlcnNpb246IDEwLjQuOSAtPiBkYXJ3aW44LjkuCisgIGlmIChPU05hbWVbMF0gIT0gJy4nKQorICAgIHJldHVybjsKKyAgCisgIC8vIEVhdCB0aGUgJy4nLgorICBPU05hbWUgPSBPU05hbWUuc3Vic3RyKDEpOworCisgIGlmIChPU05hbWUuZW1wdHkoKSB8fCBPU05hbWVbMF0gPCAnMCcgfHwgT1NOYW1lWzBdID4gJzknKQorICAgIHJldHVybjsKKyAgCisgIE1pbiA9IEVhdE51bWJlcihPU05hbWUpOworICBpZiAoT1NOYW1lLmVtcHR5KCkpIHJldHVybjsKKworICAvLyBIYW5kbGUgcmV2aXNpb24gZGFyd2luOC45LjEKKyAgaWYgKE9TTmFtZVswXSAhPSAnLicpCisgICAgcmV0dXJuOworICAKKyAgLy8gRWF0IHRoZSAnLicuCisgIE9TTmFtZSA9IE9TTmFtZS5zdWJzdHIoMSk7CisgIAorICBpZiAoT1NOYW1lLmVtcHR5KCkgfHwgT1NOYW1lWzBdIDwgJzAnIHx8IE9TTmFtZVswXSA+ICc5JykKKyAgICByZXR1cm47CisKKyAgUmV2aXNpb24gPSBFYXROdW1iZXIoT1NOYW1lKTsKK30KKwordm9pZCBUcmlwbGU6OnNldFRyaXBsZShjb25zdCBUd2luZSAmU3RyKSB7CisgIERhdGEgPSBTdHIuc3RyKCk7CisgIEFyY2ggPSBJbnZhbGlkQXJjaDsKK30KKwordm9pZCBUcmlwbGU6OnNldEFyY2goQXJjaFR5cGUgS2luZCkgeworICBzZXRBcmNoTmFtZShnZXRBcmNoVHlwZU5hbWUoS2luZCkpOworfQorCit2b2lkIFRyaXBsZTo6c2V0VmVuZG9yKFZlbmRvclR5cGUgS2luZCkgeworICBzZXRWZW5kb3JOYW1lKGdldFZlbmRvclR5cGVOYW1lKEtpbmQpKTsKK30KKwordm9pZCBUcmlwbGU6OnNldE9TKE9TVHlwZSBLaW5kKSB7CisgIHNldE9TTmFtZShnZXRPU1R5cGVOYW1lKEtpbmQpKTsKK30KKwordm9pZCBUcmlwbGU6OnNldEFyY2hOYW1lKFN0cmluZ1JlZiBTdHIpIHsKKyAgLy8gV29yayBhcm91bmQgYSBtaXNjb21waWxhdGlvbiBidWcgZm9yIFR3aW5lcyBpbiBnY2MgNC4wLjMuCisgIFNtYWxsU3RyaW5nPDY0PiBUcmlwbGU7CisgIFRyaXBsZSArPSBTdHI7CisgIFRyaXBsZSArPSAiLSI7CisgIFRyaXBsZSArPSBnZXRWZW5kb3JOYW1lKCk7CisgIFRyaXBsZSArPSAiLSI7CisgIFRyaXBsZSArPSBnZXRPU0FuZEVudmlyb25tZW50TmFtZSgpOworICBzZXRUcmlwbGUoVHJpcGxlLnN0cigpKTsKK30KKwordm9pZCBUcmlwbGU6OnNldFZlbmRvck5hbWUoU3RyaW5nUmVmIFN0cikgeworICBzZXRUcmlwbGUoZ2V0QXJjaE5hbWUoKSArICItIiArIFN0ciArICItIiArIGdldE9TQW5kRW52aXJvbm1lbnROYW1lKCkpOworfQorCit2b2lkIFRyaXBsZTo6c2V0T1NOYW1lKFN0cmluZ1JlZiBTdHIpIHsKKyAgaWYgKGhhc0Vudmlyb25tZW50KCkpCisgICAgc2V0VHJpcGxlKGdldEFyY2hOYW1lKCkgKyAiLSIgKyBnZXRWZW5kb3JOYW1lKCkgKyAiLSIgKyBTdHIgKworICAgICAgICAgICAgICAiLSIgKyBnZXRFbnZpcm9ubWVudE5hbWUoKSk7CisgIGVsc2UKKyAgICBzZXRUcmlwbGUoZ2V0QXJjaE5hbWUoKSArICItIiArIGdldFZlbmRvck5hbWUoKSArICItIiArIFN0cik7Cit9CisKK3ZvaWQgVHJpcGxlOjpzZXRFbnZpcm9ubWVudE5hbWUoU3RyaW5nUmVmIFN0cikgeworICBzZXRUcmlwbGUoZ2V0QXJjaE5hbWUoKSArICItIiArIGdldFZlbmRvck5hbWUoKSArICItIiArIGdldE9TTmFtZSgpICsKKyAgICAgICAgICAgICItIiArIFN0cik7Cit9CisKK3ZvaWQgVHJpcGxlOjpzZXRPU0FuZEVudmlyb25tZW50TmFtZShTdHJpbmdSZWYgU3RyKSB7CisgIHNldFRyaXBsZShnZXRBcmNoTmFtZSgpICsgIi0iICsgZ2V0VmVuZG9yTmFtZSgpICsgIi0iICsgU3RyKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1R3aW5lLmNwcCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L1R3aW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2VhMDEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvVHdpbmUuY3BwCkBAIC0wLDAgKzEsMTQwIEBACisvLz09PS0tIFR3aW5lLmNwcCAtIEZhc3QgVGVtcG9yYXJ5IFN0cmluZyBDb25jYXRlbmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0ZDo6c3RyaW5nIFR3aW5lOjpzdHIoKSBjb25zdCB7CisgIFNtYWxsU3RyaW5nPDI1Nj4gVmVjOworICByZXR1cm4gdG9TdHJpbmdSZWYoVmVjKS5zdHIoKTsKK30KKwordm9pZCBUd2luZTo6dG9WZWN0b3IoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXQpIGNvbnN0IHsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhPdXQpOworICBwcmludChPUyk7Cit9CisKK1N0cmluZ1JlZiBUd2luZTo6dG9TdHJpbmdSZWYoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXQpIGNvbnN0IHsKKyAgaWYgKGlzU2luZ2xlU3RyaW5nUmVmKCkpCisgICAgcmV0dXJuIGdldFNpbmdsZVN0cmluZ1JlZigpOworICB0b1ZlY3RvcihPdXQpOworICByZXR1cm4gU3RyaW5nUmVmKE91dC5kYXRhKCksIE91dC5zaXplKCkpOworfQorCit2b2lkIFR3aW5lOjpwcmludE9uZUNoaWxkKHJhd19vc3RyZWFtICZPUywgY29uc3Qgdm9pZCAqUHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUtpbmQgS2luZCkgY29uc3QgeworICBzd2l0Y2ggKEtpbmQpIHsKKyAgY2FzZSBUd2luZTo6TnVsbEtpbmQ6IGJyZWFrOworICBjYXNlIFR3aW5lOjpFbXB0eUtpbmQ6IGJyZWFrOworICBjYXNlIFR3aW5lOjpUd2luZUtpbmQ6CisgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVHdpbmUqPihQdHIpLT5wcmludChPUyk7IAorICAgIGJyZWFrOworICBjYXNlIFR3aW5lOjpDU3RyaW5nS2luZDogCisgICAgT1MgPDwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KFB0cik7IAorICAgIGJyZWFrOworICBjYXNlIFR3aW5lOjpTdGRTdHJpbmdLaW5kOgorICAgIE9TIDw8ICpzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnN0cmluZyo+KFB0cik7IAorICAgIGJyZWFrOworICBjYXNlIFR3aW5lOjpTdHJpbmdSZWZLaW5kOgorICAgIE9TIDw8ICpzdGF0aWNfY2FzdDxjb25zdCBTdHJpbmdSZWYqPihQdHIpOyAKKyAgICBicmVhazsKKyAgY2FzZSBUd2luZTo6RGVjVUlLaW5kOgorICAgIE9TIDw8ICh1bnNpZ25lZCkodWludHB0cl90KVB0cjsKKyAgICBicmVhazsKKyAgY2FzZSBUd2luZTo6RGVjSUtpbmQ6CisgICAgT1MgPDwgKGludCkoaW50cHRyX3QpUHRyOworICAgIGJyZWFrOworICBjYXNlIFR3aW5lOjpEZWNVTEtpbmQ6CisgICAgT1MgPDwgKnN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGxvbmcqPihQdHIpOworICAgIGJyZWFrOworICBjYXNlIFR3aW5lOjpEZWNMS2luZDoKKyAgICBPUyA8PCAqc3RhdGljX2Nhc3Q8Y29uc3QgbG9uZyo+KFB0cik7CisgICAgYnJlYWs7CisgIGNhc2UgVHdpbmU6OkRlY1VMTEtpbmQ6CisgICAgT1MgPDwgKnN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyo+KFB0cik7CisgICAgYnJlYWs7CisgIGNhc2UgVHdpbmU6OkRlY0xMS2luZDoKKyAgICBPUyA8PCAqc3RhdGljX2Nhc3Q8Y29uc3QgbG9uZyBsb25nKj4oUHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBUd2luZTo6VUhleEtpbmQ6CisgICAgT1Mud3JpdGVfaGV4KCpzdGF0aWNfY2FzdDxjb25zdCB1aW50NjRfdCo+KFB0cikpOworICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgVHdpbmU6OnByaW50T25lQ2hpbGRSZXByKHJhd19vc3RyZWFtICZPUywgY29uc3Qgdm9pZCAqUHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVLaW5kIEtpbmQpIGNvbnN0IHsKKyAgc3dpdGNoIChLaW5kKSB7CisgIGNhc2UgVHdpbmU6Ok51bGxLaW5kOgorICAgIE9TIDw8ICJudWxsIjsgYnJlYWs7CisgIGNhc2UgVHdpbmU6OkVtcHR5S2luZDoKKyAgICBPUyA8PCAiZW1wdHkiOyBicmVhazsKKyAgY2FzZSBUd2luZTo6VHdpbmVLaW5kOgorICAgIE9TIDw8ICJyb3BlOiI7CisgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVHdpbmUqPihQdHIpLT5wcmludFJlcHIoT1MpOworICAgIGJyZWFrOworICBjYXNlIFR3aW5lOjpDU3RyaW5nS2luZDoKKyAgICBPUyA8PCAiY3N0cmluZzpcIiIKKyAgICAgICA8PCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oUHRyKSA8PCAiXCIiOworICAgIGJyZWFrOworICBjYXNlIFR3aW5lOjpTdGRTdHJpbmdLaW5kOgorICAgIE9TIDw8ICJzdGQ6OnN0cmluZzpcIiIKKyAgICAgICA8PCBzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnN0cmluZyo+KFB0cikgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgY2FzZSBUd2luZTo6U3RyaW5nUmVmS2luZDoKKyAgICBPUyA8PCAic3RyaW5ncmVmOlwiIgorICAgICAgIDw8IHN0YXRpY19jYXN0PGNvbnN0IFN0cmluZ1JlZio+KFB0cikgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgY2FzZSBUd2luZTo6RGVjVUlLaW5kOgorICAgIE9TIDw8ICJkZWNVSTpcIiIgPDwgKHVuc2lnbmVkKSh1aW50cHRyX3QpUHRyIDw8ICJcIiI7CisgICAgYnJlYWs7CisgIGNhc2UgVHdpbmU6OkRlY0lLaW5kOgorICAgIE9TIDw8ICJkZWNJOlwiIiA8PCAoaW50KShpbnRwdHJfdClQdHIgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgY2FzZSBUd2luZTo6RGVjVUxLaW5kOgorICAgIE9TIDw8ICJkZWNVTDpcIiIgPDwgKnN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGxvbmcqPihQdHIpIDw8ICJcIiI7CisgICAgYnJlYWs7CisgIGNhc2UgVHdpbmU6OkRlY0xLaW5kOgorICAgIE9TIDw8ICJkZWNMOlwiIiA8PCAqc3RhdGljX2Nhc3Q8Y29uc3QgbG9uZyo+KFB0cikgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgY2FzZSBUd2luZTo6RGVjVUxMS2luZDoKKyAgICBPUyA8PCAiZGVjVUxMOlwiIiA8PCAqc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgbG9uZyBsb25nKj4oUHRyKSA8PCAiXCIiOworICAgIGJyZWFrOworICBjYXNlIFR3aW5lOjpEZWNMTEtpbmQ6CisgICAgT1MgPDwgImRlY0xMOlwiIiA8PCAqc3RhdGljX2Nhc3Q8Y29uc3QgbG9uZyBsb25nKj4oUHRyKSA8PCAiXCIiOworICAgIGJyZWFrOworICBjYXNlIFR3aW5lOjpVSGV4S2luZDoKKyAgICBPUyA8PCAidWhleDpcIiIgPDwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDY0X3QqPihQdHIpIDw8ICJcIiI7CisgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBUd2luZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIHByaW50T25lQ2hpbGQoT1MsIExIUywgZ2V0TEhTS2luZCgpKTsKKyAgcHJpbnRPbmVDaGlsZChPUywgUkhTLCBnZXRSSFNLaW5kKCkpOworfQorCit2b2lkIFR3aW5lOjpwcmludFJlcHIocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICIoVHdpbmUgIjsKKyAgcHJpbnRPbmVDaGlsZFJlcHIoT1MsIExIUywgZ2V0TEhTS2luZCgpKTsKKyAgT1MgPDwgIiAiOworICBwcmludE9uZUNoaWxkUmVwcihPUywgUkhTLCBnZXRSSFNLaW5kKCkpOworICBPUyA8PCAiKSI7Cit9CisKK3ZvaWQgVHdpbmU6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGxsdm06OmRiZ3MoKSk7Cit9CisKK3ZvaWQgVHdpbmU6OmR1bXBSZXByKCkgY29uc3QgeworICBwcmludFJlcHIobGx2bTo6ZGJncygpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L2NpcmN1bGFyX3Jhd19vc3RyZWFtLmNwcCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L2NpcmN1bGFyX3Jhd19vc3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTBkMzBkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvY2lyY3VsYXJfcmF3X29zdHJlYW0uY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LSBjaXJjdWxhcl9yYXdfb3N0cmVhbS5jcHAgLSBJbXBsZW1lbnQgY2lyY3VsYXJfcmF3X29zdHJlYW0gLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGNpcmN1bGFyIGJ1ZmZlcmVkIHN0cmVhbXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9jaXJjdWxhcl9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCit2b2lkIGNpcmN1bGFyX3Jhd19vc3RyZWFtOjp3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIHsKKyAgaWYgKEJ1ZmZlclNpemUgPT0gMCkgeworICAgIFRoZVN0cmVhbS0+d3JpdGUoUHRyLCBTaXplKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBXcml0ZSBpbnRvIHRoZSBidWZmZXIsIHdyYXBwaW5nIGlmIG5lY2Vzc2FyeS4KKyAgd2hpbGUgKFNpemUgIT0gMCkgeworICAgIHVuc2lnbmVkIEJ5dGVzID0KKyAgICAgIHN0ZDo6bWluKHVuc2lnbmVkKFNpemUpLCB1bnNpZ25lZChCdWZmZXJTaXplIC0gKEN1ciAtIEJ1ZmZlckFycmF5KSkpOworICAgIG1lbWNweShDdXIsIFB0ciwgQnl0ZXMpOworICAgIFNpemUgLT0gQnl0ZXM7CisgICAgQ3VyICs9IEJ5dGVzOworICAgIGlmIChDdXIgPT0gQnVmZmVyQXJyYXkgKyBCdWZmZXJTaXplKSB7CisgICAgICAvLyBSZXNldCB0aGUgb3V0cHV0IHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuCisgICAgICBDdXIgPSBCdWZmZXJBcnJheTsKKyAgICAgIEZpbGxlZCA9IHRydWU7CisgICAgfQorICB9ICAgIAorfQorCit2b2lkIGNpcmN1bGFyX3Jhd19vc3RyZWFtOjpmbHVzaEJ1ZmZlcldpdGhCYW5uZXIoKSB7CisgIGlmIChCdWZmZXJTaXplICE9IDApIHsKKyAgICAvLyBXcml0ZSBvdXQgdGhlIGJ1ZmZlcgorICAgIFRoZVN0cmVhbS0+d3JpdGUoQmFubmVyLCBzdGQ6OnN0cmxlbihCYW5uZXIpKTsKKyAgICBmbHVzaEJ1ZmZlcigpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9yYXdfb3N0cmVhbS5jcHAgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9yYXdfb3N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMThhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L3Jhd19vc3RyZWFtLmNwcApAQCAtMCwwICsxLDY2OCBAQAorLy89PT0tLS0gcmF3X29zdHJlYW0uY3BwIC0gSW1wbGVtZW50IHRoZSByYXdfb3N0cmVhbSBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgYnVsayBidWZmZXJlZCBzdHJlYW0gb3V0cHV0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUHJvZ3JhbS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1Byb2Nlc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWYgZGVmaW5lZChIQVZFX1VOSVNURF9IKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9GQ05UTF9IKQorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZm5kZWYgU1RESU5fRklMRU5PCisjIGRlZmluZSBTVERJTl9GSUxFTk8gMAorI2VuZGlmCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyMgZGVmaW5lIFNURE9VVF9GSUxFTk8gMQorI2VuZGlmCisjaWZuZGVmIFNUREVSUl9GSUxFTk8KKyMgZGVmaW5lIFNUREVSUl9GSUxFTk8gMgorI2VuZGlmCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3Jhd19vc3RyZWFtOjp+cmF3X29zdHJlYW0oKSB7CisgIC8vIHJhd19vc3RyZWFtJ3Mgc3ViY2xhc3NlcyBzaG91bGQgdGFrZSBjYXJlIHRvIGZsdXNoIHRoZSBidWZmZXIKKyAgLy8gaW4gdGhlaXIgZGVzdHJ1Y3RvcnMuCisgIGFzc2VydChPdXRCdWZDdXIgPT0gT3V0QnVmU3RhcnQgJiYKKyAgICAgICAgICJyYXdfb3N0cmVhbSBkZXN0cnVjdG9yIGNhbGxlZCB3aXRoIG5vbi1lbXB0eSBidWZmZXIhIik7CisKKyAgaWYgKEJ1ZmZlck1vZGUgPT0gSW50ZXJuYWxCdWZmZXIpCisgICAgZGVsZXRlIFtdIE91dEJ1ZlN0YXJ0OworCisgIC8vIElmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyBlcnJvcnMsIHJlcG9ydCB0aGVtIG5vdy4gQ2xpZW50cyB3aXNoaW5nCisgIC8vIHRvIGF2b2lkIHJlcG9ydF9mYXRhbF9lcnJvciBjYWxscyBzaG91bGQgY2hlY2sgZm9yIGVycm9ycyB3aXRoCisgIC8vIGhhc19lcnJvcigpIGFuZCBjbGVhciB0aGUgZXJyb3IgZmxhZyB3aXRoIGNsZWFyX2Vycm9yKCkgYmVmb3JlCisgIC8vIGRlc3RydWN0aW5nIHJhd19vc3RyZWFtIG9iamVjdHMgd2hpY2ggbWF5IGhhdmUgZXJyb3JzLgorICBpZiAoRXJyb3IpCisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJJTyBmYWlsdXJlIG9uIG91dHB1dCBzdHJlYW0uIik7Cit9CisKKy8vIEFuIG91dCBvZiBsaW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSBob21lIGZvciB0aGUgY2xhc3MgdnRhYmxlLgordm9pZCByYXdfb3N0cmVhbTo6aGFuZGxlKCkge30KKworc2l6ZV90IHJhd19vc3RyZWFtOjpwcmVmZXJyZWRfYnVmZmVyX3NpemUoKSBjb25zdCB7CisgIC8vIEJVRlNJWiBpcyBpbnRlbmRlZCB0byBiZSBhIHJlYXNvbmFibGUgZGVmYXVsdC4KKyAgcmV0dXJuIEJVRlNJWjsKK30KKwordm9pZCByYXdfb3N0cmVhbTo6U2V0QnVmZmVyZWQoKSB7CisgIC8vIEFzayB0aGUgc3ViY2xhc3MgdG8gZGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIGJ1ZmZlciBzaXplLgorICBpZiAoc2l6ZV90IFNpemUgPSBwcmVmZXJyZWRfYnVmZmVyX3NpemUoKSkKKyAgICBTZXRCdWZmZXJTaXplKFNpemUpOworICBlbHNlCisgICAgLy8gSXQgbWF5IHJldHVybiAwLCBtZWFuaW5nIHRoaXMgc3RyZWFtIHNob3VsZCBiZSB1bmJ1ZmZlcmVkLgorICAgIFNldFVuYnVmZmVyZWQoKTsKK30KKwordm9pZCByYXdfb3N0cmVhbTo6U2V0QnVmZmVyQW5kTW9kZShjaGFyICpCdWZmZXJTdGFydCwgc2l6ZV90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJLaW5kIE1vZGUpIHsKKyAgYXNzZXJ0KCgoTW9kZSA9PSBVbmJ1ZmZlcmVkICYmIEJ1ZmZlclN0YXJ0ID09IDAgJiYgU2l6ZSA9PSAwKSB8fAorICAgICAgICAgIChNb2RlICE9IFVuYnVmZmVyZWQgJiYgQnVmZmVyU3RhcnQgJiYgU2l6ZSkpICYmCisgICAgICAgICAic3RyZWFtIG11c3QgYmUgdW5idWZmZXJlZCBvciBoYXZlIGF0IGxlYXN0IG9uZSBieXRlIik7CisgIC8vIE1ha2Ugc3VyZSB0aGUgY3VycmVudCBidWZmZXIgaXMgZnJlZSBvZiBjb250ZW50ICh3ZSBjYW4ndCBmbHVzaCBoZXJlOyB0aGUKKyAgLy8gY2hpbGQgYnVmZmVyIG1hbmFnZW1lbnQgbG9naWMgd2lsbCBiZSBpbiB3cml0ZV9pbXBsKS4KKyAgYXNzZXJ0KEdldE51bUJ5dGVzSW5CdWZmZXIoKSA9PSAwICYmICJDdXJyZW50IGJ1ZmZlciBpcyBub24tZW1wdHkhIik7CisKKyAgaWYgKEJ1ZmZlck1vZGUgPT0gSW50ZXJuYWxCdWZmZXIpCisgICAgZGVsZXRlIFtdIE91dEJ1ZlN0YXJ0OworICBPdXRCdWZTdGFydCA9IEJ1ZmZlclN0YXJ0OworICBPdXRCdWZFbmQgPSBPdXRCdWZTdGFydCtTaXplOworICBPdXRCdWZDdXIgPSBPdXRCdWZTdGFydDsKKyAgQnVmZmVyTW9kZSA9IE1vZGU7CisKKyAgYXNzZXJ0KE91dEJ1ZlN0YXJ0IDw9IE91dEJ1ZkVuZCAmJiAiSW52YWxpZCBzaXplISIpOworfQorCityYXdfb3N0cmVhbSAmcmF3X29zdHJlYW06Om9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBOKSB7CisgIC8vIFplcm8gaXMgYSBzcGVjaWFsIGNhc2UuCisgIGlmIChOID09IDApCisgICAgcmV0dXJuICp0aGlzIDw8ICcwJzsKKworICBjaGFyIE51bWJlckJ1ZmZlclsyMF07CisgIGNoYXIgKkVuZFB0ciA9IE51bWJlckJ1ZmZlcitzaXplb2YoTnVtYmVyQnVmZmVyKTsKKyAgY2hhciAqQ3VyUHRyID0gRW5kUHRyOworCisgIHdoaWxlIChOKSB7CisgICAgKi0tQ3VyUHRyID0gJzAnICsgY2hhcihOICUgMTApOworICAgIE4gLz0gMTA7CisgIH0KKyAgcmV0dXJuIHdyaXRlKEN1clB0ciwgRW5kUHRyLUN1clB0cik7Cit9CisKK3Jhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PChsb25nIE4pIHsKKyAgaWYgKE4gPCAgMCkgeworICAgICp0aGlzIDw8ICctJzsKKyAgICBOID0gLU47CisgIH0KKworICByZXR1cm4gdGhpcy0+b3BlcmF0b3I8PChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihOKSk7Cit9CisKK3Jhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIGxvbmcgTikgeworICAvLyBPdXRwdXQgdXNpbmcgMzItYml0IGRpdi9tb2Qgd2hlbiBwb3NzaWJsZS4KKyAgaWYgKE4gPT0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oTikpCisgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oTikpOworCisgIGNoYXIgTnVtYmVyQnVmZmVyWzIwXTsKKyAgY2hhciAqRW5kUHRyID0gTnVtYmVyQnVmZmVyK3NpemVvZihOdW1iZXJCdWZmZXIpOworICBjaGFyICpDdXJQdHIgPSBFbmRQdHI7CisKKyAgd2hpbGUgKE4pIHsKKyAgICAqLS1DdXJQdHIgPSAnMCcgKyBjaGFyKE4gJSAxMCk7CisgICAgTiAvPSAxMDsKKyAgfQorICByZXR1cm4gd3JpdGUoQ3VyUHRyLCBFbmRQdHItQ3VyUHRyKTsKK30KKworcmF3X29zdHJlYW0gJnJhd19vc3RyZWFtOjpvcGVyYXRvcjw8KGxvbmcgbG9uZyBOKSB7CisgIGlmIChOIDwgMCkgeworICAgICp0aGlzIDw8ICctJzsKKyAgICAvLyBBdm9pZCB1bmRlZmluZWQgYmVoYXZpb3Igb24gSU5UNjRfTUlOIHdpdGggYSBjYXN0LgorICAgIE4gPSAtKHVuc2lnbmVkIGxvbmcgbG9uZylOOworICB9CisKKyAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihOKSk7Cit9CisKK3Jhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6d3JpdGVfaGV4KHVuc2lnbmVkIGxvbmcgbG9uZyBOKSB7CisgIC8vIFplcm8gaXMgYSBzcGVjaWFsIGNhc2UuCisgIGlmIChOID09IDApCisgICAgcmV0dXJuICp0aGlzIDw8ICcwJzsKKworICBjaGFyIE51bWJlckJ1ZmZlclsyMF07CisgIGNoYXIgKkVuZFB0ciA9IE51bWJlckJ1ZmZlcitzaXplb2YoTnVtYmVyQnVmZmVyKTsKKyAgY2hhciAqQ3VyUHRyID0gRW5kUHRyOworCisgIHdoaWxlIChOKSB7CisgICAgdWludHB0cl90IHggPSBOICUgMTY7CisgICAgKi0tQ3VyUHRyID0gKHggPCAxMCA/ICcwJyArIHggOiAnYScgKyB4IC0gMTApOworICAgIE4gLz0gMTY7CisgIH0KKworICByZXR1cm4gd3JpdGUoQ3VyUHRyLCBFbmRQdHItQ3VyUHRyKTsKK30KKworcmF3X29zdHJlYW0gJnJhd19vc3RyZWFtOjp3cml0ZV9lc2NhcGVkKFN0cmluZ1JlZiBTdHIpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN0ci5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgY2hhciBjID0gU3RyW2ldOworCisgICAgc3dpdGNoIChjKSB7CisgICAgY2FzZSAnXFwnOgorICAgICAgKnRoaXMgPDwgJ1xcJyA8PCAnXFwnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHQnOgorICAgICAgKnRoaXMgPDwgJ1xcJyA8PCAndCc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcbic6CisgICAgICAqdGhpcyA8PCAnXFwnIDw8ICduJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgKnRoaXMgPDwgJ1xcJyA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHN0ZDo6aXNwcmludChjKSkgeworICAgICAgICAqdGhpcyA8PCBjOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gQWx3YXlzIGV4cGFuZCB0byBhIDMtY2hhcmFjdGVyIG9jdGFsIGVzY2FwZS4KKyAgICAgICp0aGlzIDw8ICdcXCc7CisgICAgICAqdGhpcyA8PCBjaGFyKCcwJyArICgoYyA+PiA2KSAmIDcpKTsKKyAgICAgICp0aGlzIDw8IGNoYXIoJzAnICsgKChjID4+IDMpICYgNykpOworICAgICAgKnRoaXMgPDwgY2hhcignMCcgKyAoKGMgPj4gMCkgJiA3KSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuICp0aGlzOworfQorCityYXdfb3N0cmVhbSAmcmF3X29zdHJlYW06Om9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqUCkgeworICAqdGhpcyA8PCAnMCcgPDwgJ3gnOworCisgIHJldHVybiB3cml0ZV9oZXgoKHVpbnRwdHJfdCkgUCk7Cit9CisKK3Jhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PChkb3VibGUgTikgeworICByZXR1cm4gdGhpcy0+b3BlcmF0b3I8PChmb3JtYXQoIiVlIiwgTikpOworfQorCisKKwordm9pZCByYXdfb3N0cmVhbTo6Zmx1c2hfbm9uZW1wdHkoKSB7CisgIGFzc2VydChPdXRCdWZDdXIgPiBPdXRCdWZTdGFydCAmJiAiSW52YWxpZCBjYWxsIHRvIGZsdXNoX25vbmVtcHR5LiIpOworICBzaXplX3QgTGVuZ3RoID0gT3V0QnVmQ3VyIC0gT3V0QnVmU3RhcnQ7CisgIE91dEJ1ZkN1ciA9IE91dEJ1ZlN0YXJ0OworICB3cml0ZV9pbXBsKE91dEJ1ZlN0YXJ0LCBMZW5ndGgpOworfQorCityYXdfb3N0cmVhbSAmcmF3X29zdHJlYW06OndyaXRlKHVuc2lnbmVkIGNoYXIgQykgeworICAvLyBHcm91cCBleGNlcHRpb25hbCBjYXNlcyBpbnRvIGEgc2luZ2xlIGJyYW5jaC4KKyAgaWYgKEJVSUxUSU5fRVhQRUNUKE91dEJ1ZkN1ciA+PSBPdXRCdWZFbmQsIGZhbHNlKSkgeworICAgIGlmIChCVUlMVElOX0VYUEVDVCghT3V0QnVmU3RhcnQsIGZhbHNlKSkgeworICAgICAgaWYgKEJ1ZmZlck1vZGUgPT0gVW5idWZmZXJlZCkgeworICAgICAgICB3cml0ZV9pbXBsKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZDKSwgMSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIC8vIFNldCB1cCBhIGJ1ZmZlciBhbmQgc3RhcnQgb3Zlci4KKyAgICAgIFNldEJ1ZmZlcmVkKCk7CisgICAgICByZXR1cm4gd3JpdGUoQyk7CisgICAgfQorCisgICAgZmx1c2hfbm9uZW1wdHkoKTsKKyAgfQorCisgICpPdXRCdWZDdXIrKyA9IEM7CisgIHJldHVybiAqdGhpczsKK30KKworcmF3X29zdHJlYW0gJnJhd19vc3RyZWFtOjp3cml0ZShjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSB7CisgIC8vIEdyb3VwIGV4Y2VwdGlvbmFsIGNhc2VzIGludG8gYSBzaW5nbGUgYnJhbmNoLgorICBpZiAoQlVJTFRJTl9FWFBFQ1QoT3V0QnVmQ3VyK1NpemUgPiBPdXRCdWZFbmQsIGZhbHNlKSkgeworICAgIGlmIChCVUlMVElOX0VYUEVDVCghT3V0QnVmU3RhcnQsIGZhbHNlKSkgeworICAgICAgaWYgKEJ1ZmZlck1vZGUgPT0gVW5idWZmZXJlZCkgeworICAgICAgICB3cml0ZV9pbXBsKFB0ciwgU2l6ZSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIC8vIFNldCB1cCBhIGJ1ZmZlciBhbmQgc3RhcnQgb3Zlci4KKyAgICAgIFNldEJ1ZmZlcmVkKCk7CisgICAgICByZXR1cm4gd3JpdGUoUHRyLCBTaXplKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBvdXQgdGhlIGRhdGEgaW4gYnVmZmVyLXNpemVkIGJsb2NrcyB1bnRpbCB0aGUgcmVtYWluZGVyCisgICAgLy8gZml0cyB3aXRoaW4gdGhlIGJ1ZmZlci4KKyAgICBkbyB7CisgICAgICBzaXplX3QgTnVtQnl0ZXMgPSBPdXRCdWZFbmQgLSBPdXRCdWZDdXI7CisgICAgICBjb3B5X3RvX2J1ZmZlcihQdHIsIE51bUJ5dGVzKTsKKyAgICAgIGZsdXNoX25vbmVtcHR5KCk7CisgICAgICBQdHIgKz0gTnVtQnl0ZXM7CisgICAgICBTaXplIC09IE51bUJ5dGVzOworICAgIH0gd2hpbGUgKE91dEJ1ZkN1citTaXplID4gT3V0QnVmRW5kKTsKKyAgfQorCisgIGNvcHlfdG9fYnVmZmVyKFB0ciwgU2l6ZSk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIHJhd19vc3RyZWFtOjpjb3B5X3RvX2J1ZmZlcihjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSB7CisgIGFzc2VydChTaXplIDw9IHNpemVfdChPdXRCdWZFbmQgLSBPdXRCdWZDdXIpICYmICJCdWZmZXIgb3ZlcnJ1biEiKTsKKworICAvLyBIYW5kbGUgc2hvcnQgc3RyaW5ncyBzcGVjaWFsbHksIG1lbWNweSBpc24ndCB2ZXJ5IGdvb2QgYXQgdmVyeSBzaG9ydAorICAvLyBzdHJpbmdzLgorICBzd2l0Y2ggKFNpemUpIHsKKyAgY2FzZSA0OiBPdXRCdWZDdXJbM10gPSBQdHJbM107IC8vIEZBTEwgVEhST1VHSAorICBjYXNlIDM6IE91dEJ1ZkN1clsyXSA9IFB0clsyXTsgLy8gRkFMTCBUSFJPVUdICisgIGNhc2UgMjogT3V0QnVmQ3VyWzFdID0gUHRyWzFdOyAvLyBGQUxMIFRIUk9VR0gKKyAgY2FzZSAxOiBPdXRCdWZDdXJbMF0gPSBQdHJbMF07IC8vIEZBTEwgVEhST1VHSAorICBjYXNlIDA6IGJyZWFrOworICBkZWZhdWx0OgorICAgIG1lbWNweShPdXRCdWZDdXIsIFB0ciwgU2l6ZSk7CisgICAgYnJlYWs7CisgIH0KKworICBPdXRCdWZDdXIgKz0gU2l6ZTsKK30KKworLy8gRm9ybWF0dGVkIG91dHB1dC4KK3Jhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PChjb25zdCBmb3JtYXRfb2JqZWN0X2Jhc2UgJkZtdCkgeworICAvLyBJZiB3ZSBoYXZlIG1vcmUgdGhhbiBhIGZldyBieXRlcyBsZWZ0IGluIG91ciBvdXRwdXQgYnVmZmVyLCB0cnkKKyAgLy8gZm9ybWF0dGluZyBkaXJlY3RseSBvbnRvIGl0cyBlbmQuCisgIHNpemVfdCBOZXh0QnVmZmVyU2l6ZSA9IDEyNzsKKyAgc2l6ZV90IEJ1ZmZlckJ5dGVzTGVmdCA9IE91dEJ1ZkVuZCAtIE91dEJ1ZkN1cjsKKyAgaWYgKEJ1ZmZlckJ5dGVzTGVmdCA+IDMpIHsKKyAgICBzaXplX3QgQnl0ZXNVc2VkID0gRm10LnByaW50KE91dEJ1ZkN1ciwgQnVmZmVyQnl0ZXNMZWZ0KTsKKworICAgIC8vIENvbW1vbiBjYXNlIGlzIHRoYXQgd2UgaGF2ZSBwbGVudHkgb2Ygc3BhY2UuCisgICAgaWYgKEJ5dGVzVXNlZCA8PSBCdWZmZXJCeXRlc0xlZnQpIHsKKyAgICAgIE91dEJ1ZkN1ciArPSBCeXRlc1VzZWQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSBvdmVyZmxvd2VkIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHRlbGxzIHVzIHRoZSBzaXplIHRvIHRyeQorICAgIC8vIGFnYWluIHdpdGguCisgICAgTmV4dEJ1ZmZlclNpemUgPSBCeXRlc1VzZWQ7CisgIH0KKworICAvLyBJZiB3ZSBnb3QgaGVyZSwgd2UgZGlkbid0IGhhdmUgZW5vdWdoIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUKKyAgLy8gc3RyaW5nLiAgVHJ5IHByaW50aW5nIGludG8gYSBTbWFsbFZlY3RvciB0aGF0IGlzIHJlc2l6ZWQgdG8gaGF2ZSBlbm91Z2gKKyAgLy8gc3BhY2UuICBJdGVyYXRlIHVudGlsIHdlIHdpbi4KKyAgU21hbGxWZWN0b3I8Y2hhciwgMTI4PiBWOworCisgIHdoaWxlICgxKSB7CisgICAgVi5yZXNpemUoTmV4dEJ1ZmZlclNpemUpOworCisgICAgLy8gVHJ5IGZvcm1hdHRpbmcgaW50byB0aGUgU21hbGxWZWN0b3IuCisgICAgc2l6ZV90IEJ5dGVzVXNlZCA9IEZtdC5wcmludChWLmRhdGEoKSwgTmV4dEJ1ZmZlclNpemUpOworCisgICAgLy8gSWYgQnl0ZXNVc2VkIGZpdCBpbnRvIHRoZSB2ZWN0b3IsIHdlIHdpbi4KKyAgICBpZiAoQnl0ZXNVc2VkIDw9IE5leHRCdWZmZXJTaXplKQorICAgICAgcmV0dXJuIHdyaXRlKFYuZGF0YSgpLCBCeXRlc1VzZWQpOworCisgICAgLy8gT3RoZXJ3aXNlLCB0cnkgYWdhaW4gd2l0aCBhIG5ldyBzaXplLgorICAgIGFzc2VydChCeXRlc1VzZWQgPiBOZXh0QnVmZmVyU2l6ZSAmJiAiRGlkbid0IGdyb3cgYnVmZmVyIT8iKTsKKyAgICBOZXh0QnVmZmVyU2l6ZSA9IEJ5dGVzVXNlZDsKKyAgfQorfQorCisvLy8gaW5kZW50IC0gSW5zZXJ0ICdOdW1TcGFjZXMnIHNwYWNlcy4KK3Jhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6aW5kZW50KHVuc2lnbmVkIE51bVNwYWNlcykgeworICBzdGF0aWMgY29uc3QgY2hhciBTcGFjZXNbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAiOworCisgIC8vIFVzdWFsbHkgdGhlIGluZGVudGF0aW9uIGlzIHNtYWxsLCBoYW5kbGUgaXQgd2l0aCBhIGZhc3RwYXRoLgorICBpZiAoTnVtU3BhY2VzIDwgYXJyYXlfbGVuZ3Rob2YoU3BhY2VzKSkKKyAgICByZXR1cm4gd3JpdGUoU3BhY2VzLCBOdW1TcGFjZXMpOworCisgIHdoaWxlIChOdW1TcGFjZXMpIHsKKyAgICB1bnNpZ25lZCBOdW1Ub1dyaXRlID0gc3RkOjptaW4oTnVtU3BhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpYXJyYXlfbGVuZ3Rob2YoU3BhY2VzKS0xKTsKKyAgICB3cml0ZShTcGFjZXMsIE51bVRvV3JpdGUpOworICAgIE51bVNwYWNlcyAtPSBOdW1Ub1dyaXRlOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIEZvcm1hdHRlZCBPdXRwdXQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE91dCBvZiBsaW5lIHZpcnR1YWwgbWV0aG9kLgordm9pZCBmb3JtYXRfb2JqZWN0X2Jhc2U6OmhvbWUoKSB7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgcmF3X2ZkX29zdHJlYW0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyByYXdfZmRfb3N0cmVhbSAtIE9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIGZvciB3cml0aW5nLiBJZiBhbiBlcnJvcgorLy8vIG9jY3VycywgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIGlzIHB1dCBpbnRvIEVycm9ySW5mbywgYW5kIHRoZQorLy8vIHN0cmVhbSBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZGVzdHJveWVkOyB0aGUgc3RyaW5nIHdpbGwgYmUgZW1wdHkKKy8vLyBpZiBubyBlcnJvciBvY2N1cnJlZC4KK3Jhd19mZF9vc3RyZWFtOjpyYXdfZmRfb3N0cmVhbShjb25zdCBjaGFyICpGaWxlbmFtZSwgc3RkOjpzdHJpbmcgJkVycm9ySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncykgOiBwb3MoMCkgeworICBhc3NlcnQoRmlsZW5hbWUgIT0gMCAmJiAiRmlsZW5hbWUgaXMgbnVsbCIpOworICAvLyBWZXJpZnkgdGhhdCB3ZSBkb24ndCBoYXZlIGJvdGggImFwcGVuZCIgYW5kICJleGNsIi4KKyAgYXNzZXJ0KCghKEZsYWdzICYgRl9FeGNsKSB8fCAhKEZsYWdzICYgRl9BcHBlbmQpKSAmJgorICAgICAgICAgIkNhbm5vdCBzcGVjaWZ5IGJvdGggJ2V4Y2wnIGFuZCAnYXBwZW5kJyBmaWxlIGNyZWF0aW9uIGZsYWdzISIpOworCisgIEVycm9ySW5mby5jbGVhcigpOworCisgIC8vIEhhbmRsZSAiLSIgYXMgc3Rkb3V0LgorICBpZiAoRmlsZW5hbWVbMF0gPT0gJy0nICYmIEZpbGVuYW1lWzFdID09IDApIHsKKyAgICBGRCA9IFNURE9VVF9GSUxFTk87CisgICAgLy8gSWYgdXNlciByZXF1ZXN0ZWQgYmluYXJ5IHRoZW4gcHV0IHN0ZG91dCBpbnRvIGJpbmFyeSBtb2RlIGlmCisgICAgLy8gcG9zc2libGUuCisgICAgaWYgKEZsYWdzICYgRl9CaW5hcnkpCisgICAgICBzeXM6OlByb2dyYW06OkNoYW5nZVN0ZG91dFRvQmluYXJ5KCk7CisgICAgU2hvdWxkQ2xvc2UgPSBmYWxzZTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQgT3BlbkZsYWdzID0gT19XUk9OTFl8T19DUkVBVDsKKyNpZmRlZiBPX0JJTkFSWQorICBpZiAoRmxhZ3MgJiBGX0JpbmFyeSkKKyAgICBPcGVuRmxhZ3MgfD0gT19CSU5BUlk7CisjZW5kaWYKKworICBpZiAoRmxhZ3MgJiBGX0FwcGVuZCkKKyAgICBPcGVuRmxhZ3MgfD0gT19BUFBFTkQ7CisgIGVsc2UKKyAgICBPcGVuRmxhZ3MgfD0gT19UUlVOQzsKKyAgaWYgKEZsYWdzICYgRl9FeGNsKQorICAgIE9wZW5GbGFncyB8PSBPX0VYQ0w7CisKKyAgd2hpbGUgKChGRCA9IG9wZW4oRmlsZW5hbWUsIE9wZW5GbGFncywgMDY2NCkpIDwgMCkgeworICAgIGlmIChlcnJubyAhPSBFSU5UUikgeworICAgICAgRXJyb3JJbmZvID0gIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgJyIgKyBzdGQ6OnN0cmluZyhGaWxlbmFtZSkgKyAiJyI7CisgICAgICBTaG91bGRDbG9zZSA9IGZhbHNlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIE9rLCB3ZSBzdWNjZXNzZnVsbHkgb3BlbmVkIHRoZSBmaWxlLCBzbyBpdCdsbCBuZWVkIHRvIGJlIGNsb3NlZC4KKyAgU2hvdWxkQ2xvc2UgPSB0cnVlOworfQorCityYXdfZmRfb3N0cmVhbTo6fnJhd19mZF9vc3RyZWFtKCkgeworICBpZiAoRkQgPCAwKSByZXR1cm47CisgIGZsdXNoKCk7CisgIGlmIChTaG91bGRDbG9zZSkKKyAgICB3aGlsZSAoOjpjbG9zZShGRCkgIT0gMCkKKyAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgeworICAgICAgICBlcnJvcl9kZXRlY3RlZCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KK30KKworCit2b2lkIHJhd19mZF9vc3RyZWFtOjp3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIHsKKyAgYXNzZXJ0KEZEID49IDAgJiYgIkZpbGUgYWxyZWFkeSBjbG9zZWQuIik7CisgIHBvcyArPSBTaXplOworCisgIGRvIHsKKyAgICBzc2l6ZV90IHJldCA9IDo6d3JpdGUoRkQsIFB0ciwgU2l6ZSk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgLy8gSWYgaXQncyBhIHJlY292ZXJhYmxlIGVycm9yLCBzd2FsbG93IGl0IGFuZCByZXRyeSB0aGUgd3JpdGUuCisgICAgICAvLworICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZG4ndCBldmVyIHNlZSBFQUdBSU4gb3IgRVdPVUxEQkxPQ0sgaGVyZSwgc2luY2UKKyAgICAgIC8vIHJhd19vc3RyZWFtIGlzbid0IGRlc2lnbmVkIHRvIGRvIG5vbi1ibG9ja2luZyBJL08uIEhvd2V2ZXIsIHNvbWUKKyAgICAgIC8vIHByb2dyYW1zLCBzdWNoIGFzIG9sZCB2ZXJzaW9ucyBvZiBiamFtLCBoYXZlIG1pc3Rha2VubHkgdXNlZAorICAgICAgLy8gT19OT05CTE9DSy4gRm9yIGNvbXBhdGliaWxpdHksIGVtdWxhdGUgYmxvY2tpbmcgc2VtYW50aWNzIGJ5CisgICAgICAvLyBzcGlubmluZyB1bnRpbCB0aGUgd3JpdGUgc3VjY2VlZHMuIElmIHlvdSBkb24ndCB3YW50IHNwaW5uaW5nLAorICAgICAgLy8gZG9uJ3QgdXNlIE9fTk9OQkxPQ0sgZmlsZSBkZXNjcmlwdG9ycyB3aXRoIHJhd19vc3RyZWFtLgorICAgICAgaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTgorI2lmZGVmIEVXT1VMREJMT0NLCisgICAgICAgICAgfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0sKKyNlbmRpZgorICAgICAgICAgICkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGEgbm9uLXJlY292ZXJhYmxlIGVycm9yLiBOb3RlIGl0IGFuZCBxdWl0LgorICAgICAgZXJyb3JfZGV0ZWN0ZWQoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFRoZSB3cml0ZSBtYXkgaGF2ZSB3cml0dGVuIHNvbWUgb3IgYWxsIG9mIHRoZSBkYXRhLiBVcGRhdGUgdGhlCisgICAgLy8gc2l6ZSBhbmQgYnVmZmVyIHBvaW50ZXIgdG8gcmVmbGVjdCB0aGUgcmVtYWluZGVyIHRoYXQgbmVlZHMKKyAgICAvLyB0byBiZSB3cml0dGVuLiBJZiB0aGVyZSBhcmUgbm8gYnl0ZXMgbGVmdCwgd2UncmUgZG9uZS4KKyAgICBQdHIgKz0gcmV0OworICAgIFNpemUgLT0gcmV0OworICB9IHdoaWxlIChTaXplID4gMCk7Cit9CisKK3ZvaWQgcmF3X2ZkX29zdHJlYW06OmNsb3NlKCkgeworICBhc3NlcnQoU2hvdWxkQ2xvc2UpOworICBTaG91bGRDbG9zZSA9IGZhbHNlOworICBmbHVzaCgpOworICB3aGlsZSAoOjpjbG9zZShGRCkgIT0gMCkKKyAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKKyAgICAgIGVycm9yX2RldGVjdGVkKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIEZEID0gLTE7Cit9CisKK3VpbnQ2NF90IHJhd19mZF9vc3RyZWFtOjpzZWVrKHVpbnQ2NF90IG9mZikgeworICBmbHVzaCgpOworICBwb3MgPSA6OmxzZWVrKEZELCBvZmYsIFNFRUtfU0VUKTsKKyAgaWYgKHBvcyAhPSBvZmYpCisgICAgZXJyb3JfZGV0ZWN0ZWQoKTsKKyAgcmV0dXJuIHBvczsKK30KKworc2l6ZV90IHJhd19mZF9vc3RyZWFtOjpwcmVmZXJyZWRfYnVmZmVyX3NpemUoKSBjb25zdCB7CisjaWYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfX21pbml4KQorICAvLyBXaW5kb3dzIGFuZCBNaW5peCBoYXZlIG5vIHN0X2Jsa3NpemUuCisgIGFzc2VydChGRCA+PSAwICYmICJGaWxlIG5vdCB5ZXQgb3BlbiEiKTsKKyAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgaWYgKGZzdGF0KEZELCAmc3RhdGJ1ZikgIT0gMCkKKyAgICByZXR1cm4gMDsKKworICAvLyBJZiB0aGlzIGlzIGEgdGVybWluYWwsIGRvbid0IHVzZSBidWZmZXJpbmcuIExpbmUgYnVmZmVyaW5nCisgIC8vIHdvdWxkIGJlIGEgbW9yZSB0cmFkaXRpb25hbCB0aGluZyB0byBkbywgYnV0IGl0J3Mgbm90IHdvcnRoCisgIC8vIHRoZSBjb21wbGV4aXR5LgorICBpZiAoU19JU0NIUihzdGF0YnVmLnN0X21vZGUpICYmIGlzYXR0eShGRCkpCisgICAgcmV0dXJuIDA7CisgIC8vIFJldHVybiB0aGUgcHJlZmVycmVkIGJsb2NrIHNpemUuCisgIHJldHVybiBzdGF0YnVmLnN0X2Jsa3NpemU7CisjZWxzZQorICByZXR1cm4gcmF3X29zdHJlYW06OnByZWZlcnJlZF9idWZmZXJfc2l6ZSgpOworI2VuZGlmCit9CisKK3Jhd19vc3RyZWFtICZyYXdfZmRfb3N0cmVhbTo6Y2hhbmdlQ29sb3IoZW51bSBDb2xvcnMgY29sb3JzLCBib29sIGJvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmcpIHsKKyAgaWYgKHN5czo6UHJvY2Vzczo6Q29sb3JOZWVkc0ZsdXNoKCkpCisgICAgZmx1c2goKTsKKyAgY29uc3QgY2hhciAqY29sb3Jjb2RlID0KKyAgICAoY29sb3JzID09IFNBVkVEQ09MT1IpID8gc3lzOjpQcm9jZXNzOjpPdXRwdXRCb2xkKGJnKQorICAgIDogc3lzOjpQcm9jZXNzOjpPdXRwdXRDb2xvcihjb2xvcnMsIGJvbGQsIGJnKTsKKyAgaWYgKGNvbG9yY29kZSkgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oY29sb3Jjb2RlKTsKKyAgICB3cml0ZShjb2xvcmNvZGUsIGxlbik7CisgICAgLy8gZG9uJ3QgYWNjb3VudCBjb2xvcnMgdG93YXJkcyBvdXRwdXQgY2hhcmFjdGVycworICAgIHBvcyAtPSBsZW47CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCityYXdfb3N0cmVhbSAmcmF3X2ZkX29zdHJlYW06OnJlc2V0Q29sb3IoKSB7CisgIGlmIChzeXM6OlByb2Nlc3M6OkNvbG9yTmVlZHNGbHVzaCgpKQorICAgIGZsdXNoKCk7CisgIGNvbnN0IGNoYXIgKmNvbG9yY29kZSA9IHN5czo6UHJvY2Vzczo6UmVzZXRDb2xvcigpOworICBpZiAoY29sb3Jjb2RlKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihjb2xvcmNvZGUpOworICAgIHdyaXRlKGNvbG9yY29kZSwgbGVuKTsKKyAgICAvLyBkb24ndCBhY2NvdW50IGNvbG9ycyB0b3dhcmRzIG91dHB1dCBjaGFyYWN0ZXJzCisgICAgcG9zIC09IGxlbjsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgcmF3X2ZkX29zdHJlYW06OmlzX2Rpc3BsYXllZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN5czo6UHJvY2Vzczo6RmlsZURlc2NyaXB0b3JJc0Rpc3BsYXllZChGRCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgcmF3X3N0ZG91dC9lcnJfb3N0cmVhbQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gU2V0IGJ1ZmZlciBzZXR0aW5ncyB0byBtb2RlbCBzdGRvdXQgYW5kIHN0ZGVyciBiZWhhdmlvci4KKy8vIFNldCBzdGFuZGFyZCBlcnJvciB0byBiZSB1bmJ1ZmZlcmVkIGJ5IGRlZmF1bHQuCityYXdfc3Rkb3V0X29zdHJlYW06OnJhd19zdGRvdXRfb3N0cmVhbSgpOnJhd19mZF9vc3RyZWFtKFNURE9VVF9GSUxFTk8sIGZhbHNlKSB7fQorcmF3X3N0ZGVycl9vc3RyZWFtOjpyYXdfc3RkZXJyX29zdHJlYW0oKTpyYXdfZmRfb3N0cmVhbShTVERFUlJfRklMRU5PLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkge30KKworLy8gQW4gb3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhIGhvbWUgZm9yIHRoZSBjbGFzcyB2dGFibGUuCit2b2lkIHJhd19zdGRvdXRfb3N0cmVhbTo6aGFuZGxlKCkge30KK3ZvaWQgcmF3X3N0ZGVycl9vc3RyZWFtOjpoYW5kbGUoKSB7fQorCisvLy8gb3V0cygpIC0gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgcmF3X29zdHJlYW0gZm9yIHN0YW5kYXJkIG91dHB1dC4KKy8vLyBVc2UgaXQgbGlrZTogb3V0cygpIDw8ICJmb28iIDw8ICJiYXIiOworcmF3X29zdHJlYW0gJmxsdm06Om91dHMoKSB7CisgIHN0YXRpYyByYXdfc3Rkb3V0X29zdHJlYW0gUzsKKyAgcmV0dXJuIFM7Cit9CisKKy8vLyBlcnJzKCkgLSBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSByYXdfb3N0cmVhbSBmb3Igc3RhbmRhcmQgZXJyb3IuCisvLy8gVXNlIGl0IGxpa2U6IGVycnMoKSA8PCAiZm9vIiA8PCAiYmFyIjsKK3Jhd19vc3RyZWFtICZsbHZtOjplcnJzKCkgeworICBzdGF0aWMgcmF3X3N0ZGVycl9vc3RyZWFtIFM7CisgIHJldHVybiBTOworfQorCisvLy8gbnVsbHMoKSAtIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHJhd19vc3RyZWFtIHdoaWNoIGRpc2NhcmRzIG91dHB1dC4KK3Jhd19vc3RyZWFtICZsbHZtOjpudWxscygpIHsKKyAgc3RhdGljIHJhd19udWxsX29zdHJlYW0gUzsKKyAgcmV0dXJuIFM7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICByYXdfc3RyaW5nX29zdHJlYW0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3Jhd19zdHJpbmdfb3N0cmVhbTo6fnJhd19zdHJpbmdfb3N0cmVhbSgpIHsKKyAgZmx1c2goKTsKK30KKwordm9pZCByYXdfc3RyaW5nX29zdHJlYW06OndyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgeworICBPUy5hcHBlbmQoUHRyLCBTaXplKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICByYXdfc3ZlY3Rvcl9vc3RyZWFtCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGUgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBTbWFsbFZlY3RvciBpdHNlbGYgYXMgdGhlCisvLyBidWZmZXIgZm9yIHRoZSByYXdfb3N0cmVhbS4gV2UgZ3VhcmFudGVlIHRoYXQgdGhlIHJhd19vc3RyZWFtIGJ1ZmZlciBpcworLy8gYWx3YXlzIHBvaW50aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgdmVjdG9yLCBidXQgd2l0aGluIHRoZSB2ZWN0b3IKKy8vIGNhcGFjaXR5LiBUaGlzIGFsbG93cyByYXdfb3N0cmVhbSB0byB3cml0ZSBkaXJlY3RseSBpbnRvIHRoZSBjb3JyZWN0IHBsYWNlLAorLy8gYW5kIHdlIG9ubHkgbmVlZCB0byBzZXQgdGhlIHZlY3RvciBzaXplIHdoZW4gdGhlIGRhdGEgaXMgZmx1c2hlZC4KKworcmF3X3N2ZWN0b3Jfb3N0cmVhbTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk8pIDogT1MoTykgeworICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgZXh0ZXJuYWwgYnVmZmVyLiBXZSBtYWtlIHN1cmUgdGhhdCB0aGUgYnVmZmVyIGhhcyBhdAorICAvLyBsZWFzdCAxMjggYnl0ZXMgZnJlZTsgcmF3X29zdHJlYW0gaXRzZWxmIG9ubHkgcmVxdWlyZXMgNjQsIGJ1dCB3ZSB3YW50IHRvCisgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGdyb3cgdGhlIGJ1ZmZlciB1bm5lY2Vzc2FyaWx5IG9uIGRlc3RydWN0aW9uICh3aGVuCisgIC8vIHRoZSBkYXRhIGlzIGZsdXNoZWQpLiBTZWUgdGhlIEZJWE1FIGJlbG93LgorICBPUy5yZXNlcnZlKE9TLnNpemUoKSArIDEyOCk7CisgIFNldEJ1ZmZlcihPUy5lbmQoKSwgT1MuY2FwYWNpdHkoKSAtIE9TLnNpemUoKSk7Cit9CisKK3Jhd19zdmVjdG9yX29zdHJlYW06On5yYXdfc3ZlY3Rvcl9vc3RyZWFtKCkgeworICAvLyBGSVhNRTogUHJldmVudCByZXNpemluZyBkdXJpbmcgdGhpcyBmbHVzaCgpLgorICBmbHVzaCgpOworfQorCisvLy8gcmVzeW5jIC0gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgU21hbGxWZWN0b3Igd2UncmUgYXBwZW5kaW5nIHRvIGlzIGNoYW5nZWQKKy8vLyBvdXRzaWRlIG9mIHRoZSByYXdfc3ZlY3Rvcl9vc3RyZWFtJ3MgY29udHJvbC4gIEl0IGlzIG9ubHkgc2FmZSB0byBkbyB0aGlzCisvLy8gaWYgdGhlIHJhd19zdmVjdG9yX29zdHJlYW0gaGFzIHByZXZpb3VzbHkgYmVlbiBmbHVzaGVkLgordm9pZCByYXdfc3ZlY3Rvcl9vc3RyZWFtOjpyZXN5bmMoKSB7CisgIGFzc2VydChHZXROdW1CeXRlc0luQnVmZmVyKCkgPT0gMCAmJiAiRGlkbid0IGZsdXNoIGJlZm9yZSBtdXRhdGluZyB2ZWN0b3IiKTsKKworICBpZiAoT1MuY2FwYWNpdHkoKSAtIE9TLnNpemUoKSA8IDY0KQorICAgIE9TLnJlc2VydmUoT1MuY2FwYWNpdHkoKSAqIDIpOworICBTZXRCdWZmZXIoT1MuZW5kKCksIE9TLmNhcGFjaXR5KCkgLSBPUy5zaXplKCkpOworfQorCit2b2lkIHJhd19zdmVjdG9yX29zdHJlYW06OndyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgeworICAvLyBJZiB3ZSdyZSB3cml0aW5nIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGludG8gdGhlIHNtYWxsdmVjdG9yLCB3ZQorICAvLyBkb24ndCBuZWVkIHRvIGNvcHkgdGhlIGJ5dGVzLCBqdXN0IGNvbW1pdCB0aGUgYnl0ZXMgYmVjYXVzZSB0aGV5IGFyZQorICAvLyBhbHJlYWR5IGluIHRoZSByaWdodCBwbGFjZS4KKyAgaWYgKFB0ciA9PSBPUy5lbmQoKSkgeworICAgIGFzc2VydChPUy5zaXplKCkgKyBTaXplIDw9IE9TLmNhcGFjaXR5KCkgJiYgIkludmFsaWQgd3JpdGVfaW1wbCgpIGNhbGwhIik7CisgICAgT1Muc2V0X3NpemUoT1Muc2l6ZSgpICsgU2l6ZSk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KEdldE51bUJ5dGVzSW5CdWZmZXIoKSA9PSAwICYmCisgICAgICAgICAgICJTaG91bGQgYmUgd3JpdGluZyBmcm9tIGJ1ZmZlciBpZiBzb21lIGJ5dGVzIGluIGl0Iik7CisgICAgLy8gT3RoZXJ3aXNlLCBkbyBjb3B5IHRoZSBieXRlcy4KKyAgICBPUy5hcHBlbmQoUHRyLCBQdHIrU2l6ZSk7CisgIH0KKworICAvLyBHcm93IHRoZSB2ZWN0b3IgaWYgbmVjZXNzYXJ5LgorICBpZiAoT1MuY2FwYWNpdHkoKSAtIE9TLnNpemUoKSA8IDY0KQorICAgIE9TLnJlc2VydmUoT1MuY2FwYWNpdHkoKSAqIDIpOworCisgIC8vIFVwZGF0ZSB0aGUgYnVmZmVyIHBvc2l0aW9uLgorICBTZXRCdWZmZXIoT1MuZW5kKCksIE9TLmNhcGFjaXR5KCkgLSBPUy5zaXplKCkpOworfQorCit1aW50NjRfdCByYXdfc3ZlY3Rvcl9vc3RyZWFtOjpjdXJyZW50X3BvcygpIGNvbnN0IHsKKyAgIHJldHVybiBPUy5zaXplKCk7Cit9CisKK1N0cmluZ1JlZiByYXdfc3ZlY3Rvcl9vc3RyZWFtOjpzdHIoKSB7CisgIGZsdXNoKCk7CisgIHJldHVybiBTdHJpbmdSZWYoT1MuYmVnaW4oKSwgT1Muc2l6ZSgpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICByYXdfbnVsbF9vc3RyZWFtCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCityYXdfbnVsbF9vc3RyZWFtOjp+cmF3X251bGxfb3N0cmVhbSgpIHsKKyNpZm5kZWYgTkRFQlVHCisgIC8vIH5yYXdfb3N0cmVhbSBhc3NlcnRzIHRoYXQgdGhlIGJ1ZmZlciBpcyBlbXB0eS4gVGhpcyBpc24ndCBuZWNlc3NhcnkKKyAgLy8gd2l0aCByYXdfbnVsbF9vc3RyZWFtLCBidXQgaXQncyBiZXR0ZXIgdG8gaGF2ZSByYXdfbnVsbF9vc3RyZWFtIGZvbGxvdworICAvLyB0aGUgcnVsZXMgdGhhbiB0byBjaGFuZ2UgdGhlIHJ1bGVzIGp1c3QgZm9yIHJhd19udWxsX29zdHJlYW0uCisgIGZsdXNoKCk7CisjZW5kaWYKK30KKwordm9pZCByYXdfbnVsbF9vc3RyZWFtOjp3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIHsKK30KKwordWludDY0X3QgcmF3X251bGxfb3N0cmVhbTo6Y3VycmVudF9wb3MoKSBjb25zdCB7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvcmVnY2NsYXNzLmggYi9zcmMvTExWTS9saWIvU3VwcG9ydC9yZWdjY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2VhM2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvcmVnY2NsYXNzLmgKQEAgLTAsMCArMSw3MCBAQAorLyotCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIE9wZW5CU0QncyBsaWJjL3JlZ2V4LCBvcmlnaW5hbCBsaWNlbnNlIGZvbGxvd3M6CisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBPcGVuQlNEJ3MgbGliYy9yZWdleCwgb3JpZ2luYWwgbGljZW5zZSBmb2xsb3dzOgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCBIZW5yeSBTcGVuY2VyLgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpY2NsYXNzLmgJOC4zIChCZXJrZWxleSkgMy8yMC85NAorICovCisKKy8qIGNoYXJhY3Rlci1jbGFzcyB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBjY2xhc3MgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqY2hhcnM7CisJY29uc3QgY2hhciAqbXVsdGlzOworfSBjY2xhc3Nlc1tdID0geworCXsgImFsbnVtIiwJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcCiswMTIzNDU2Nzg5IiwJCQkJIiJ9ICwKKwl7ICJhbHBoYSIsCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKwkJCQkJIiJ9ICwKKwl7ICJibGFuayIsCSIgXHQiLAkJIiJ9ICwKKwl7ICJjbnRybCIsCSJcMDA3XGJcdFxuXHZcZlxyXDFcMlwzXDRcNVw2XDE2XDE3XDIwXDIxXDIyXDIzXDI0XAorXDI1XDI2XDI3XDMwXDMxXDMyXDMzXDM0XDM1XDM2XDM3XDE3NyIsCSIifSAsCisJeyAiZGlnaXQiLAkiMDEyMzQ1Njc4OSIsCSIifSAsCisJeyAiZ3JhcGgiLAkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwKKzAxMjM0NTY3ODkhXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXF1eX2B7fH1+IiwKKwkJCQkJIiJ9ICwKKwl7ICJsb3dlciIsCSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCisJCQkJCSIifSAsCisJeyAicHJpbnQiLAkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwKKzAxMjM0NTY3ODkhXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXF1eX2B7fH1+ICIsCisJCQkJCSIifSAsCisJeyAicHVuY3QiLAkiIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxdXl9ge3x9fiIsCisJCQkJCSIifSAsCisJeyAic3BhY2UiLAkiXHRcblx2XGZcciAiLAkiIn0gLAorCXsgInVwcGVyIiwJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIiwKKwkJCQkJIiJ9ICwKKwl7ICJ4ZGlnaXQiLAkiMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZiIsCisJCQkJCSIifSAsCisJeyBOVUxMLAkJMCwJCSIiIH0KK307CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3VwcG9ydC9yZWdjbmFtZS5oIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvcmVnY25hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzBiYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvcmVnY25hbWUuaApAQCAtMCwwICsxLDEzOSBAQAorLyotCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIE9wZW5CU0QncyBsaWJjL3JlZ2V4LCBvcmlnaW5hbCBsaWNlbnNlIGZvbGxvd3M6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0IEhlbnJ5IFNwZW5jZXIuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEhlbnJ5IFNwZW5jZXIuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyljbmFtZS5oCTguMyAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisvKiBjaGFyYWN0ZXItbmFtZSB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBjbmFtZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyIGNvZGU7Cit9IGNuYW1lc1tdID0geworCXsgIk5VTCIsCQkJJ1wwJyB9LAorCXsgIlNPSCIsCQkJJ1wwMDEnIH0sCisJeyAiU1RYIiwJCQknXDAwMicgfSwKKwl7ICJFVFgiLAkJCSdcMDAzJyB9LAorCXsgIkVPVCIsCQkJJ1wwMDQnIH0sCisJeyAiRU5RIiwJCQknXDAwNScgfSwKKwl7ICJBQ0siLAkJCSdcMDA2JyB9LAorCXsgIkJFTCIsCQkJJ1wwMDcnIH0sCisJeyAiYWxlcnQiLAkJCSdcMDA3JyB9LAorCXsgIkJTIiwJCQkJJ1wwMTAnIH0sCisJeyAiYmFja3NwYWNlIiwJCQknXGInIH0sCisJeyAiSFQiLAkJCQknXDAxMScgfSwKKwl7ICJ0YWIiLAkJCSdcdCcgfSwKKwl7ICJMRiIsCQkJCSdcMDEyJyB9LAorCXsgIm5ld2xpbmUiLAkJCSdcbicgfSwKKwl7ICJWVCIsCQkJCSdcMDEzJyB9LAorCXsgInZlcnRpY2FsLXRhYiIsCQknXHYnIH0sCisJeyAiRkYiLAkJCQknXDAxNCcgfSwKKwl7ICJmb3JtLWZlZWQiLAkJCSdcZicgfSwKKwl7ICJDUiIsCQkJCSdcMDE1JyB9LAorCXsgImNhcnJpYWdlLXJldHVybiIsCQknXHInIH0sCisJeyAiU08iLAkJCQknXDAxNicgfSwKKwl7ICJTSSIsCQkJCSdcMDE3JyB9LAorCXsgIkRMRSIsCQkJJ1wwMjAnIH0sCisJeyAiREMxIiwJCQknXDAyMScgfSwKKwl7ICJEQzIiLAkJCSdcMDIyJyB9LAorCXsgIkRDMyIsCQkJJ1wwMjMnIH0sCisJeyAiREM0IiwJCQknXDAyNCcgfSwKKwl7ICJOQUsiLAkJCSdcMDI1JyB9LAorCXsgIlNZTiIsCQkJJ1wwMjYnIH0sCisJeyAiRVRCIiwJCQknXDAyNycgfSwKKwl7ICJDQU4iLAkJCSdcMDMwJyB9LAorCXsgIkVNIiwJCQkJJ1wwMzEnIH0sCisJeyAiU1VCIiwJCQknXDAzMicgfSwKKwl7ICJFU0MiLAkJCSdcMDMzJyB9LAorCXsgIklTNCIsCQkJJ1wwMzQnIH0sCisJeyAiRlMiLAkJCQknXDAzNCcgfSwKKwl7ICJJUzMiLAkJCSdcMDM1JyB9LAorCXsgIkdTIiwJCQkJJ1wwMzUnIH0sCisJeyAiSVMyIiwJCQknXDAzNicgfSwKKwl7ICJSUyIsCQkJCSdcMDM2JyB9LAorCXsgIklTMSIsCQkJJ1wwMzcnIH0sCisJeyAiVVMiLAkJCQknXDAzNycgfSwKKwl7ICJzcGFjZSIsCQkJJyAnIH0sCisJeyAiZXhjbGFtYXRpb24tbWFyayIsCQknIScgfSwKKwl7ICJxdW90YXRpb24tbWFyayIsCQknIicgfSwKKwl7ICJudW1iZXItc2lnbiIsCQknIycgfSwKKwl7ICJkb2xsYXItc2lnbiIsCQknJCcgfSwKKwl7ICJwZXJjZW50LXNpZ24iLAkJJyUnIH0sCisJeyAiYW1wZXJzYW5kIiwJCQknJicgfSwKKwl7ICJhcG9zdHJvcGhlIiwJCQknXCcnIH0sCisJeyAibGVmdC1wYXJlbnRoZXNpcyIsCQknKCcgfSwKKwl7ICJyaWdodC1wYXJlbnRoZXNpcyIsCQknKScgfSwKKwl7ICJhc3RlcmlzayIsCQkJJyonIH0sCisJeyAicGx1cy1zaWduIiwJCQknKycgfSwKKwl7ICJjb21tYSIsCQkJJywnIH0sCisJeyAiaHlwaGVuIiwJCQknLScgfSwKKwl7ICJoeXBoZW4tbWludXMiLAkJJy0nIH0sCisJeyAicGVyaW9kIiwJCQknLicgfSwKKwl7ICJmdWxsLXN0b3AiLAkJCScuJyB9LAorCXsgInNsYXNoIiwJCQknLycgfSwKKwl7ICJzb2xpZHVzIiwJCQknLycgfSwKKwl7ICJ6ZXJvIiwJCQknMCcgfSwKKwl7ICJvbmUiLAkJCScxJyB9LAorCXsgInR3byIsCQkJJzInIH0sCisJeyAidGhyZWUiLAkJCSczJyB9LAorCXsgImZvdXIiLAkJCSc0JyB9LAorCXsgImZpdmUiLAkJCSc1JyB9LAorCXsgInNpeCIsCQkJJzYnIH0sCisJeyAic2V2ZW4iLAkJCSc3JyB9LAorCXsgImVpZ2h0IiwJCQknOCcgfSwKKwl7ICJuaW5lIiwJCQknOScgfSwKKwl7ICJjb2xvbiIsCQkJJzonIH0sCisJeyAic2VtaWNvbG9uIiwJCQknOycgfSwKKwl7ICJsZXNzLXRoYW4tc2lnbiIsCQknPCcgfSwKKwl7ICJlcXVhbHMtc2lnbiIsCQknPScgfSwKKwl7ICJncmVhdGVyLXRoYW4tc2lnbiIsCQknPicgfSwKKwl7ICJxdWVzdGlvbi1tYXJrIiwJCSc/JyB9LAorCXsgImNvbW1lcmNpYWwtYXQiLAkJJ0AnIH0sCisJeyAibGVmdC1zcXVhcmUtYnJhY2tldCIsCSdbJyB9LAorCXsgImJhY2tzbGFzaCIsCQkJJ1xcJyB9LAorCXsgInJldmVyc2Utc29saWR1cyIsCQknXFwnIH0sCisJeyAicmlnaHQtc3F1YXJlLWJyYWNrZXQiLAknXScgfSwKKwl7ICJjaXJjdW1mbGV4IiwJCQknXicgfSwKKwl7ICJjaXJjdW1mbGV4LWFjY2VudCIsCQknXicgfSwKKwl7ICJ1bmRlcnNjb3JlIiwJCQknXycgfSwKKwl7ICJsb3ctbGluZSIsCQkJJ18nIH0sCisJeyAiZ3JhdmUtYWNjZW50IiwJCSdgJyB9LAorCXsgImxlZnQtYnJhY2UiLAkJCSd7JyB9LAorCXsgImxlZnQtY3VybHktYnJhY2tldCIsCQkneycgfSwKKwl7ICJ2ZXJ0aWNhbC1saW5lIiwJCSd8JyB9LAorCXsgInJpZ2h0LWJyYWNlIiwJCSd9JyB9LAorCXsgInJpZ2h0LWN1cmx5LWJyYWNrZXQiLAknfScgfSwKKwl7ICJ0aWxkZSIsCQkJJ34nIH0sCisJeyAiREVMIiwJCQknXDE3NycgfSwKKwl7IE5VTEwsCQkJCTAgfQorfTsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L3JlZ2VuZ2luZS5pbmMgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9yZWdlbmdpbmUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9yZWdlbmdpbmUuaW5jCkBAIC0wLDAgKzEsMTAzNCBAQAorLyotCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIE9wZW5CU0QncyBsaWJjL3JlZ2V4LCBvcmlnaW5hbCBsaWNlbnNlIGZvbGxvd3M6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0IEhlbnJ5IFNwZW5jZXIuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEhlbnJ5IFNwZW5jZXIuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyllbmdpbmUuYwk4LjUgKEJlcmtlbGV5KSAzLzIwLzk0CisgKi8KKworLyoKKyAqIFRoZSBtYXRjaGluZyBlbmdpbmUgYW5kIGZyaWVuZHMuICBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGJ5IHJlZ2V4ZWMuYworICogYWZ0ZXIgc3VpdGFibGUgI2RlZmluZXMgb2YgYSB2YXJpZXR5IG9mIG1hY3JvcyB1c2VkIGhlcmVpbiwgc28gdGhhdAorICogZGlmZmVyZW50IHN0YXRlIHJlcHJlc2VudGF0aW9ucyBjYW4gYmUgdXNlZCB3aXRob3V0IGR1cGxpY2F0aW5nIG1hc3NlcworICogb2YgY29kZS4KKyAqLworCisjaWZkZWYgU05BTUVTCisjZGVmaW5lCW1hdGNoZXIJc21hdGNoZXIKKyNkZWZpbmUJZmFzdAlzZmFzdAorI2RlZmluZQlzbG93CXNzbG93CisjZGVmaW5lCWRpc3NlY3QJc2Rpc3NlY3QKKyNkZWZpbmUJYmFja3JlZglzYmFja3JlZgorI2RlZmluZQlzdGVwCXNzdGVwCisjZGVmaW5lCXByaW50CXNwcmludAorI2RlZmluZQlhdAlzYXQKKyNkZWZpbmUJbWF0Y2gJc21hdAorI2RlZmluZQlub3BlCXNub3BlCisjZW5kaWYKKyNpZmRlZiBMTkFNRVMKKyNkZWZpbmUJbWF0Y2hlcglsbWF0Y2hlcgorI2RlZmluZQlmYXN0CWxmYXN0CisjZGVmaW5lCXNsb3cJbHNsb3cKKyNkZWZpbmUJZGlzc2VjdAlsZGlzc2VjdAorI2RlZmluZQliYWNrcmVmCWxiYWNrcmVmCisjZGVmaW5lCXN0ZXAJbHN0ZXAKKyNkZWZpbmUJcHJpbnQJbHByaW50CisjZGVmaW5lCWF0CWxhdAorI2RlZmluZQltYXRjaAlsbWF0CisjZGVmaW5lCW5vcGUJbG5vcGUKKyNlbmRpZgorCisvKiBhbm90aGVyIHN0cnVjdHVyZSBwYXNzZWQgdXAgYW5kIGRvd24gdG8gYXZvaWQgemlsbGlvbnMgb2YgcGFyYW1ldGVycyAqLworc3RydWN0IG1hdGNoIHsKKwlzdHJ1Y3QgcmVfZ3V0cyAqZzsKKwlpbnQgZWZsYWdzOworCWxsdm1fcmVnbWF0Y2hfdCAqcG1hdGNoOwkvKiBbbnN1YisxXSAoMCBlbGVtZW50IHVudXNlZCkgKi8KKwljb25zdCBjaGFyICpvZmZwOwkJLyogb2Zmc2V0cyB3b3JrIGZyb20gaGVyZSAqLworCWNvbnN0IGNoYXIgKmJlZ2lucDsJCS8qIHN0YXJ0IG9mIHN0cmluZyAtLSB2aXJ0dWFsIE5VTCBwcmVjZWRlcyAqLworCWNvbnN0IGNoYXIgKmVuZHA7CQkvKiBlbmQgb2Ygc3RyaW5nIC0tIHZpcnR1YWwgTlVMIGhlcmUgKi8KKwljb25zdCBjaGFyICpjb2xkcDsJCS8qIGNhbiBiZSBubyBtYXRjaCBzdGFydGluZyBiZWZvcmUgaGVyZSAqLworCWNvbnN0IGNoYXIgKipsYXN0cG9zOwkJLyogW25wbHVzKzFdICovCisJU1RBVEVWQVJTOworCXN0YXRlcyBzdDsJCS8qIGN1cnJlbnQgc3RhdGVzICovCisJc3RhdGVzIGZyZXNoOwkJLyogc3RhdGVzIGZvciBhIGZyZXNoIHN0YXJ0ICovCisJc3RhdGVzIHRtcDsJCS8qIHRlbXBvcmFyeSAqLworCXN0YXRlcyBlbXB0eTsJCS8qIGVtcHR5IHNldCBvZiBzdGF0ZXMgKi8KK307CisKK3N0YXRpYyBpbnQgbWF0Y2hlcihzdHJ1Y3QgcmVfZ3V0cyAqLCBjb25zdCBjaGFyICosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3JlZ21hdGNoX3RbXSwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpkaXNzZWN0KHN0cnVjdCBtYXRjaCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgc29wbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3Bubyk7CitzdGF0aWMgY29uc3QgY2hhciAqYmFja3JlZihzdHJ1Y3QgbWF0Y2ggKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHNvcG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc29wbm8sIHNvcG5vLCBpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKmZhc3Qoc3RydWN0IG1hdGNoICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBzb3Bubywgc29wbm8pOworc3RhdGljIGNvbnN0IGNoYXIgKnNsb3coc3RydWN0IG1hdGNoICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBzb3Bubywgc29wbm8pOworc3RhdGljIHN0YXRlcyBzdGVwKHN0cnVjdCByZV9ndXRzICosIHNvcG5vLCBzb3Bubywgc3RhdGVzLCBpbnQsIHN0YXRlcyk7CisjZGVmaW5lIE1BWF9SRUNVUlNJT04JMTAwCisjZGVmaW5lCUJPTAkoT1VUKzEpCisjZGVmaW5lCUVPTAkoQk9MKzEpCisjZGVmaW5lCUJPTEVPTAkoQk9MKzIpCisjZGVmaW5lCU5PVEhJTkcJKEJPTCszKQorI2RlZmluZQlCT1cJKEJPTCs0KQorI2RlZmluZQlFT1cJKEJPTCs1KQorI2RlZmluZQlDT0RFTUFYCShCT0wrNSkJCS8qIGhpZ2hlc3QgY29kZSB1c2VkICovCisjZGVmaW5lCU5PTkNIQVIoYykJKChjKSA+IENIQVJfTUFYKQorI2RlZmluZQlOTk9OQ0hBUgkoQ09ERU1BWC1DSEFSX01BWCkKKyNpZmRlZiBSRURFQlVHCitzdGF0aWMgdm9pZCBwcmludChzdHJ1Y3QgbWF0Y2ggKiwgY2hhciAqLCBzdGF0ZXMsIGludCwgRklMRSAqKTsKKyNlbmRpZgorI2lmZGVmIFJFREVCVUcKK3N0YXRpYyB2b2lkIGF0KHN0cnVjdCBtYXRjaCAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBzb3Bubywgc29wbm8pOworI2VuZGlmCisjaWZkZWYgUkVERUJVRworc3RhdGljIGNoYXIgKnBjaGFyKGludCk7CisjZW5kaWYKKworI2lmZGVmIFJFREVCVUcKKyNkZWZpbmUJU1AodCwgcywgYykJcHJpbnQobSwgdCwgcywgYywgc3Rkb3V0KQorI2RlZmluZQlBVCh0LCBwMSwgcDIsIHMxLCBzMikJYXQobSwgdCwgcDEsIHAyLCBzMSwgczIpCisjZGVmaW5lCU5PVEUoc3RyKQl7IGlmIChtLT5lZmxhZ3MmUkVHX1RSQUNFKSAodm9pZClwcmludGYoIj0lc1xuIiwgKHN0cikpOyB9CitzdGF0aWMgaW50IG5vcGUgPSAwOworI2Vsc2UKKyNkZWZpbmUJU1AodCwgcywgYykJLyogbm90aGluZyAqLworI2RlZmluZQlBVCh0LCBwMSwgcDIsIHMxLCBzMikJLyogbm90aGluZyAqLworI2RlZmluZQlOT1RFKHMpCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisvKgorIC0gbWF0Y2hlciAtIHRoZSBhY3R1YWwgbWF0Y2hpbmcgZW5naW5lCisgKi8KK3N0YXRpYyBpbnQJCQkvKiAwIHN1Y2Nlc3MsIFJFR19OT01BVENIIGZhaWx1cmUgKi8KK21hdGNoZXIoc3RydWN0IHJlX2d1dHMgKmcsIGNvbnN0IGNoYXIgKnN0cmluZywgc2l6ZV90IG5tYXRjaCwKKyAgICAgICAgbGx2bV9yZWdtYXRjaF90IHBtYXRjaFtdLAorICAgIGludCBlZmxhZ3MpCit7CisJY29uc3QgY2hhciAqZW5kcDsKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgbWF0Y2ggbXY7CisJc3RydWN0IG1hdGNoICptID0gJm12OworCWNvbnN0IGNoYXIgKmRwOworCWNvbnN0IHNvcG5vIGdmID0gZy0+Zmlyc3RzdGF0ZSsxOwkvKiArMSBmb3IgT0VORCAqLworCWNvbnN0IHNvcG5vIGdsID0gZy0+bGFzdHN0YXRlOworCWNvbnN0IGNoYXIgKnN0YXJ0OworCWNvbnN0IGNoYXIgKnN0b3A7CisKKwkvKiBzaW1wbGlmeSB0aGUgc2l0dWF0aW9uIHdoZXJlIHBvc3NpYmxlICovCisJaWYgKGctPmNmbGFncyZSRUdfTk9TVUIpCisJCW5tYXRjaCA9IDA7CisJaWYgKGVmbGFncyZSRUdfU1RBUlRFTkQpIHsKKwkJc3RhcnQgPSBzdHJpbmcgKyBwbWF0Y2hbMF0ucm1fc287CisJCXN0b3AgPSBzdHJpbmcgKyBwbWF0Y2hbMF0ucm1fZW87CisJfSBlbHNlIHsKKwkJc3RhcnQgPSBzdHJpbmc7CisJCXN0b3AgPSBzdGFydCArIHN0cmxlbihzdGFydCk7CisJfQorCWlmIChzdG9wIDwgc3RhcnQpCisJCXJldHVybihSRUdfSU5WQVJHKTsKKworCS8qIHByZXNjcmVlbmluZzsgdGhpcyBkb2VzIHdvbmRlcnMgZm9yIHRoaXMgcmF0aGVyIHNsb3cgY29kZSAqLworCWlmIChnLT5tdXN0ICE9IE5VTEwpIHsKKwkJZm9yIChkcCA9IHN0YXJ0OyBkcCA8IHN0b3A7IGRwKyspCisJCQlpZiAoKmRwID09IGctPm11c3RbMF0gJiYgc3RvcCAtIGRwID49IGctPm1sZW4gJiYKKwkJCQltZW1jbXAoZHAsIGctPm11c3QsIChzaXplX3QpZy0+bWxlbikgPT0gMCkKKwkJCQlicmVhazsKKwkJaWYgKGRwID09IHN0b3ApCQkvKiB3ZSBkaWRuJ3QgZmluZCBnLT5tdXN0ICovCisJCQlyZXR1cm4oUkVHX05PTUFUQ0gpOworCX0KKworCS8qIG1hdGNoIHN0cnVjdCBzZXR1cCAqLworCW0tPmcgPSBnOworCW0tPmVmbGFncyA9IGVmbGFnczsKKwltLT5wbWF0Y2ggPSBOVUxMOworCW0tPmxhc3Rwb3MgPSBOVUxMOworCW0tPm9mZnAgPSBzdHJpbmc7CisJbS0+YmVnaW5wID0gc3RhcnQ7CisJbS0+ZW5kcCA9IHN0b3A7CisJU1RBVEVTRVRVUChtLCA0KTsKKwlTRVRVUChtLT5zdCk7CisJU0VUVVAobS0+ZnJlc2gpOworCVNFVFVQKG0tPnRtcCk7CisJU0VUVVAobS0+ZW1wdHkpOworCUNMRUFSKG0tPmVtcHR5KTsKKworCS8qIHRoaXMgbG9vcCBkb2VzIG9ubHkgb25lIHJlcGV0aXRpb24gZXhjZXB0IGZvciBiYWNrcmVmcyAqLworCWZvciAoOzspIHsKKwkJZW5kcCA9IGZhc3QobSwgc3RhcnQsIHN0b3AsIGdmLCBnbCk7CisJCWlmIChlbmRwID09IE5VTEwpIHsJCS8qIGEgbWlzcyAqLworCQkJZnJlZShtLT5wbWF0Y2gpOworCQkJZnJlZSgodm9pZCopbS0+bGFzdHBvcyk7CisJCQlTVEFURVRFQVJET1dOKG0pOworCQkJcmV0dXJuKFJFR19OT01BVENIKTsKKwkJfQorCQlpZiAobm1hdGNoID09IDAgJiYgIWctPmJhY2tyZWZzKQorCQkJYnJlYWs7CQkvKiBubyBmdXJ0aGVyIGluZm8gbmVlZGVkICovCisKKwkJLyogd2hlcmU/ICovCisJCWFzc2VydChtLT5jb2xkcCAhPSBOVUxMKTsKKwkJZm9yICg7OykgeworCQkJTk9URSgiZmluZGluZyBzdGFydCIpOworCQkJZW5kcCA9IHNsb3cobSwgbS0+Y29sZHAsIHN0b3AsIGdmLCBnbCk7CisJCQlpZiAoZW5kcCAhPSBOVUxMKQorCQkJCWJyZWFrOworCQkJYXNzZXJ0KG0tPmNvbGRwIDwgbS0+ZW5kcCk7CisJCQltLT5jb2xkcCsrOworCQl9CisJCWlmIChubWF0Y2ggPT0gMSAmJiAhZy0+YmFja3JlZnMpCisJCQlicmVhazsJCS8qIG5vIGZ1cnRoZXIgaW5mbyBuZWVkZWQgKi8KKworCQkvKiBvaCBteSwgaGUgd2FudHMgdGhlIHN1YmV4cHJlc3Npb25zLi4uICovCisJCWlmIChtLT5wbWF0Y2ggPT0gTlVMTCkKKwkJCW0tPnBtYXRjaCA9IChsbHZtX3JlZ21hdGNoX3QgKiltYWxsb2MoKG0tPmctPm5zdWIgKyAxKSAqCisJCQkJCQkJc2l6ZW9mKGxsdm1fcmVnbWF0Y2hfdCkpOworCQlpZiAobS0+cG1hdGNoID09IE5VTEwpIHsKKwkJCVNUQVRFVEVBUkRPV04obSk7CisJCQlyZXR1cm4oUkVHX0VTUEFDRSk7CisJCX0KKwkJZm9yIChpID0gMTsgaSA8PSBtLT5nLT5uc3ViOyBpKyspCisJCQltLT5wbWF0Y2hbaV0ucm1fc28gPSBtLT5wbWF0Y2hbaV0ucm1fZW8gPSAtMTsKKwkJaWYgKCFnLT5iYWNrcmVmcyAmJiAhKG0tPmVmbGFncyZSRUdfQkFDS1IpKSB7CisJCQlOT1RFKCJkaXNzZWN0aW5nIik7CisJCQlkcCA9IGRpc3NlY3QobSwgbS0+Y29sZHAsIGVuZHAsIGdmLCBnbCk7CisJCX0gZWxzZSB7CisJCQlpZiAoZy0+bnBsdXMgPiAwICYmIG0tPmxhc3Rwb3MgPT0gTlVMTCkKKwkJCQltLT5sYXN0cG9zID0gKGNvbnN0IGNoYXIgKiopbWFsbG9jKChnLT5ucGx1cysxKSAqCisJCQkJCQkJc2l6ZW9mKGNoYXIgKikpOworCQkJaWYgKGctPm5wbHVzID4gMCAmJiBtLT5sYXN0cG9zID09IE5VTEwpIHsKKwkJCQlmcmVlKG0tPnBtYXRjaCk7CisJCQkJU1RBVEVURUFSRE9XTihtKTsKKwkJCQlyZXR1cm4oUkVHX0VTUEFDRSk7CisJCQl9CisJCQlOT1RFKCJiYWNrcmVmIGRpc3NlY3QiKTsKKwkJCWRwID0gYmFja3JlZihtLCBtLT5jb2xkcCwgZW5kcCwgZ2YsIGdsLCAoc29wbm8pMCwgMCk7CisJCX0KKwkJaWYgKGRwICE9IE5VTEwpCisJCQlicmVhazsKKworCQkvKiB1aC1vaC4uLiB3ZSBjb3VsZG4ndCBmaW5kIGEgc3ViZXhwcmVzc2lvbi1sZXZlbCBtYXRjaCAqLworCQlhc3NlcnQoZy0+YmFja3JlZnMpOwkvKiBtdXN0IGJlIGJhY2sgcmVmZXJlbmNlcyBkb2luZyBpdCAqLworCQlhc3NlcnQoZy0+bnBsdXMgPT0gMCB8fCBtLT5sYXN0cG9zICE9IE5VTEwpOworCQlmb3IgKDs7KSB7CisJCQlpZiAoZHAgIT0gTlVMTCB8fCBlbmRwIDw9IG0tPmNvbGRwKQorCQkJCWJyZWFrOwkJLyogZGVmZWF0ICovCisJCQlOT1RFKCJiYWNrb2ZmIik7CisJCQllbmRwID0gc2xvdyhtLCBtLT5jb2xkcCwgZW5kcC0xLCBnZiwgZ2wpOworCQkJaWYgKGVuZHAgPT0gTlVMTCkKKwkJCQlicmVhazsJCS8qIGRlZmVhdCAqLworCQkJLyogdHJ5IGl0IG9uIGEgc2hvcnRlciBwb3NzaWJpbGl0eSAqLworI2lmbmRlZiBOREVCVUcKKwkJCWZvciAoaSA9IDE7IGkgPD0gbS0+Zy0+bnN1YjsgaSsrKSB7CisJCQkJYXNzZXJ0KG0tPnBtYXRjaFtpXS5ybV9zbyA9PSAtMSk7CisJCQkJYXNzZXJ0KG0tPnBtYXRjaFtpXS5ybV9lbyA9PSAtMSk7CisJCQl9CisjZW5kaWYKKwkJCU5PVEUoImJhY2tvZmYgZGlzc2VjdCIpOworCQkJZHAgPSBiYWNrcmVmKG0sIG0tPmNvbGRwLCBlbmRwLCBnZiwgZ2wsIChzb3BubykwLCAwKTsKKwkJfQorCQlhc3NlcnQoZHAgPT0gTlVMTCB8fCBkcCA9PSBlbmRwKTsKKwkJaWYgKGRwICE9IE5VTEwpCQkvKiBmb3VuZCBhIHNob3J0ZXIgb25lICovCisJCQlicmVhazsKKworCQkvKiBkZXNwaXRlIGluaXRpYWwgYXBwZWFyYW5jZXMsIHRoZXJlIGlzIG5vIG1hdGNoIGhlcmUgKi8KKwkJTk9URSgiZmFsc2UgYWxhcm0iKTsKKwkJaWYgKG0tPmNvbGRwID09IHN0b3ApCisJCQlicmVhazsKKwkJc3RhcnQgPSBtLT5jb2xkcCArIDE7CS8qIHJlY3ljbGUgc3RhcnRpbmcgbGF0ZXIgKi8KKwl9CisKKwkvKiBmaWxsIGluIHRoZSBkZXRhaWxzIGlmIHJlcXVlc3RlZCAqLworCWlmIChubWF0Y2ggPiAwKSB7CisJCXBtYXRjaFswXS5ybV9zbyA9IG0tPmNvbGRwIC0gbS0+b2ZmcDsKKwkJcG1hdGNoWzBdLnJtX2VvID0gZW5kcCAtIG0tPm9mZnA7CisJfQorCWlmIChubWF0Y2ggPiAxKSB7CisJCWFzc2VydChtLT5wbWF0Y2ggIT0gTlVMTCk7CisJCWZvciAoaSA9IDE7IGkgPCBubWF0Y2g7IGkrKykKKwkJCWlmIChpIDw9IG0tPmctPm5zdWIpCisJCQkJcG1hdGNoW2ldID0gbS0+cG1hdGNoW2ldOworCQkJZWxzZSB7CisJCQkJcG1hdGNoW2ldLnJtX3NvID0gLTE7CisJCQkJcG1hdGNoW2ldLnJtX2VvID0gLTE7CisJCQl9CisJfQorCisJaWYgKG0tPnBtYXRjaCAhPSBOVUxMKQorCQlmcmVlKChjaGFyICopbS0+cG1hdGNoKTsKKwlpZiAobS0+bGFzdHBvcyAhPSBOVUxMKQorCQlmcmVlKChjaGFyICopbS0+bGFzdHBvcyk7CisJU1RBVEVURUFSRE9XTihtKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgLSBkaXNzZWN0IC0gZmlndXJlIG91dCB3aGF0IG1hdGNoZWQgd2hhdCwgbm8gYmFjayByZWZlcmVuY2VzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoJCQkvKiA9PSBzdG9wIChzdWNjZXNzKSBhbHdheXMgKi8KK2Rpc3NlY3Qoc3RydWN0IG1hdGNoICptLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqc3RvcCwgc29wbm8gc3RhcnRzdCwKKyAgICAgICAgc29wbm8gc3RvcHN0KQoreworCWludCBpOworCXNvcG5vIHNzOwkvKiBzdGFydCBzb3Agb2YgY3VycmVudCBzdWJSRSAqLworCXNvcG5vIGVzOwkvKiBlbmQgc29wIG9mIGN1cnJlbnQgc3ViUkUgKi8KKwljb25zdCBjaGFyICpzcDsJLyogc3RhcnQgb2Ygc3RyaW5nIG1hdGNoZWQgYnkgaXQgKi8KKwljb25zdCBjaGFyICpzdHA7CS8qIHN0cmluZyBtYXRjaGVkIGJ5IGl0IGNhbm5vdCBwYXNzIGhlcmUgKi8KKwljb25zdCBjaGFyICpyZXN0OwkvKiBzdGFydCBvZiByZXN0IG9mIHN0cmluZyAqLworCWNvbnN0IGNoYXIgKnRhaWw7CS8qIHN0cmluZyB1bm1hdGNoZWQgYnkgcmVzdCBvZiBSRSAqLworCXNvcG5vIHNzdWI7CS8qIHN0YXJ0IHNvcCBvZiBzdWJzdWJSRSAqLworCXNvcG5vIGVzdWI7CS8qIGVuZCBzb3Agb2Ygc3Vic3ViUkUgKi8KKwljb25zdCBjaGFyICpzc3A7CS8qIHN0YXJ0IG9mIHN0cmluZyBtYXRjaGVkIGJ5IHN1YnN1YlJFICovCisJY29uc3QgY2hhciAqc2VwOwkvKiBlbmQgb2Ygc3RyaW5nIG1hdGNoZWQgYnkgc3Vic3ViUkUgKi8KKwljb25zdCBjaGFyICpvbGRzc3A7CS8qIHByZXZpb3VzIHNzcCAqLworCisJQVQoImRpc3MiLCBzdGFydCwgc3RvcCwgc3RhcnRzdCwgc3RvcHN0KTsKKwlzcCA9IHN0YXJ0OworCWZvciAoc3MgPSBzdGFydHN0OyBzcyA8IHN0b3BzdDsgc3MgPSBlcykgeworCQkvKiBpZGVudGlmeSBlbmQgb2Ygc3ViUkUgKi8KKwkJZXMgPSBzczsKKwkJc3dpdGNoIChPUChtLT5nLT5zdHJpcFtlc10pKSB7CisJCWNhc2UgT1BMVVNfOgorCQljYXNlIE9RVUVTVF86CisJCQllcyArPSBPUE5EKG0tPmctPnN0cmlwW2VzXSk7CisJCQlicmVhazsKKwkJY2FzZSBPQ0hfOgorCQkJd2hpbGUgKE9QKG0tPmctPnN0cmlwW2VzXSkgIT0gT19DSCkKKwkJCQllcyArPSBPUE5EKG0tPmctPnN0cmlwW2VzXSk7CisJCQlicmVhazsKKwkJfQorCQllcysrOworCisJCS8qIGZpZ3VyZSBvdXQgd2hhdCBpdCBtYXRjaGVkICovCisJCXN3aXRjaCAoT1AobS0+Zy0+c3RyaXBbc3NdKSkgeworCQljYXNlIE9FTkQ6CisJCQlhc3NlcnQobm9wZSk7CisJCQlicmVhazsKKwkJY2FzZSBPQ0hBUjoKKwkJCXNwKys7CisJCQlicmVhazsKKwkJY2FzZSBPQk9MOgorCQljYXNlIE9FT0w6CisJCWNhc2UgT0JPVzoKKwkJY2FzZSBPRU9XOgorCQkJYnJlYWs7CisJCWNhc2UgT0FOWToKKwkJY2FzZSBPQU5ZT0Y6CisJCQlzcCsrOworCQkJYnJlYWs7CisJCWNhc2UgT0JBQ0tfOgorCQljYXNlIE9fQkFDSzoKKwkJCWFzc2VydChub3BlKTsKKwkJCWJyZWFrOworCQkvKiBjYXNlcyB3aGVyZSBsZW5ndGggb2YgbWF0Y2ggaXMgaGFyZCB0byBmaW5kICovCisJCWNhc2UgT1FVRVNUXzoKKwkJCXN0cCA9IHN0b3A7CisJCQlmb3IgKDs7KSB7CisJCQkJLyogaG93IGxvbmcgY291bGQgdGhpcyBvbmUgYmU/ICovCisJCQkJcmVzdCA9IHNsb3cobSwgc3AsIHN0cCwgc3MsIGVzKTsKKwkJCQlhc3NlcnQocmVzdCAhPSBOVUxMKTsJLyogaXQgZGlkIG1hdGNoICovCisJCQkJLyogY291bGQgdGhlIHJlc3QgbWF0Y2ggdGhlIHJlc3Q/ICovCisJCQkJdGFpbCA9IHNsb3cobSwgcmVzdCwgc3RvcCwgZXMsIHN0b3BzdCk7CisJCQkJaWYgKHRhaWwgPT0gc3RvcCkKKwkJCQkJYnJlYWs7CQkvKiB5ZXMhICovCisJCQkJLyogbm8gLS0gdHJ5IGEgc2hvcnRlciBtYXRjaCBmb3IgdGhpcyBvbmUgKi8KKwkJCQlzdHAgPSByZXN0IC0gMTsKKwkJCQlhc3NlcnQoc3RwID49IHNwKTsJLyogaXQgZGlkIHdvcmsgKi8KKwkJCX0KKwkJCXNzdWIgPSBzcyArIDE7CisJCQllc3ViID0gZXMgLSAxOworCQkJLyogZGlkIGlubmFyZHMgbWF0Y2g/ICovCisJCQlpZiAoc2xvdyhtLCBzcCwgcmVzdCwgc3N1YiwgZXN1YikgIT0gTlVMTCkgeworCQkJCWNvbnN0IGNoYXIgKmRwID0gZGlzc2VjdChtLCBzcCwgcmVzdCwgc3N1YiwgZXN1Yik7CisJCQkJKHZvaWQpZHA7IC8qIGF2b2lkIHdhcm5pbmcgaWYgYXNzZXJ0aW9ucyBvZmYgKi8KKwkJCQlhc3NlcnQoZHAgPT0gcmVzdCk7CisJCQl9IGVsc2UJCS8qIG5vICovCisJCQkJYXNzZXJ0KHNwID09IHJlc3QpOworCQkJc3AgPSByZXN0OworCQkJYnJlYWs7CisJCWNhc2UgT1BMVVNfOgorCQkJc3RwID0gc3RvcDsKKwkJCWZvciAoOzspIHsKKwkJCQkvKiBob3cgbG9uZyBjb3VsZCB0aGlzIG9uZSBiZT8gKi8KKwkJCQlyZXN0ID0gc2xvdyhtLCBzcCwgc3RwLCBzcywgZXMpOworCQkJCWFzc2VydChyZXN0ICE9IE5VTEwpOwkvKiBpdCBkaWQgbWF0Y2ggKi8KKwkJCQkvKiBjb3VsZCB0aGUgcmVzdCBtYXRjaCB0aGUgcmVzdD8gKi8KKwkJCQl0YWlsID0gc2xvdyhtLCByZXN0LCBzdG9wLCBlcywgc3RvcHN0KTsKKwkJCQlpZiAodGFpbCA9PSBzdG9wKQorCQkJCQlicmVhazsJCS8qIHllcyEgKi8KKwkJCQkvKiBubyAtLSB0cnkgYSBzaG9ydGVyIG1hdGNoIGZvciB0aGlzIG9uZSAqLworCQkJCXN0cCA9IHJlc3QgLSAxOworCQkJCWFzc2VydChzdHAgPj0gc3ApOwkvKiBpdCBkaWQgd29yayAqLworCQkJfQorCQkJc3N1YiA9IHNzICsgMTsKKwkJCWVzdWIgPSBlcyAtIDE7CisJCQlzc3AgPSBzcDsKKwkJCW9sZHNzcCA9IHNzcDsKKwkJCWZvciAoOzspIHsJLyogZmluZCBsYXN0IG1hdGNoIG9mIGlubmFyZHMgKi8KKwkJCQlzZXAgPSBzbG93KG0sIHNzcCwgcmVzdCwgc3N1YiwgZXN1Yik7CisJCQkJaWYgKHNlcCA9PSBOVUxMIHx8IHNlcCA9PSBzc3ApCisJCQkJCWJyZWFrOwkvKiBmYWlsZWQgb3IgbWF0Y2hlZCBudWxsICovCisJCQkJb2xkc3NwID0gc3NwOwkvKiBvbiB0byBuZXh0IHRyeSAqLworCQkJCXNzcCA9IHNlcDsKKwkJCX0KKwkJCWlmIChzZXAgPT0gTlVMTCkgeworCQkJCS8qIGxhc3Qgc3VjY2Vzc2Z1bCBtYXRjaCAqLworCQkJCXNlcCA9IHNzcDsKKwkJCQlzc3AgPSBvbGRzc3A7CisJCQl9CisJCQlhc3NlcnQoc2VwID09IHJlc3QpOwkvKiBtdXN0IGV4aGF1c3Qgc3Vic3RyaW5nICovCisJCQlhc3NlcnQoc2xvdyhtLCBzc3AsIHNlcCwgc3N1YiwgZXN1YikgPT0gcmVzdCk7CisJCQl7CisJCQkJY29uc3QgY2hhciAqZHAgPSBkaXNzZWN0KG0sIHNzcCwgc2VwLCBzc3ViLCBlc3ViKTsKKwkJCQkodm9pZClkcDsgLyogYXZvaWQgd2FybmluZyBpZiBhc3NlcnRpb25zIG9mZiAqLworCQkJCWFzc2VydChkcCA9PSBzZXApOworCQkJfQorCQkJc3AgPSByZXN0OworCQkJYnJlYWs7CisJCWNhc2UgT0NIXzoKKwkJCXN0cCA9IHN0b3A7CisJCQlmb3IgKDs7KSB7CisJCQkJLyogaG93IGxvbmcgY291bGQgdGhpcyBvbmUgYmU/ICovCisJCQkJcmVzdCA9IHNsb3cobSwgc3AsIHN0cCwgc3MsIGVzKTsKKwkJCQlhc3NlcnQocmVzdCAhPSBOVUxMKTsJLyogaXQgZGlkIG1hdGNoICovCisJCQkJLyogY291bGQgdGhlIHJlc3QgbWF0Y2ggdGhlIHJlc3Q/ICovCisJCQkJdGFpbCA9IHNsb3cobSwgcmVzdCwgc3RvcCwgZXMsIHN0b3BzdCk7CisJCQkJaWYgKHRhaWwgPT0gc3RvcCkKKwkJCQkJYnJlYWs7CQkvKiB5ZXMhICovCisJCQkJLyogbm8gLS0gdHJ5IGEgc2hvcnRlciBtYXRjaCBmb3IgdGhpcyBvbmUgKi8KKwkJCQlzdHAgPSByZXN0IC0gMTsKKwkJCQlhc3NlcnQoc3RwID49IHNwKTsJLyogaXQgZGlkIHdvcmsgKi8KKwkJCX0KKwkJCXNzdWIgPSBzcyArIDE7CisJCQllc3ViID0gc3MgKyBPUE5EKG0tPmctPnN0cmlwW3NzXSkgLSAxOworCQkJYXNzZXJ0KE9QKG0tPmctPnN0cmlwW2VzdWJdKSA9PSBPT1IxKTsKKwkJCWZvciAoOzspIHsJLyogZmluZCBmaXJzdCBtYXRjaGluZyBicmFuY2ggKi8KKwkJCQlpZiAoc2xvdyhtLCBzcCwgcmVzdCwgc3N1YiwgZXN1YikgPT0gcmVzdCkKKwkJCQkJYnJlYWs7CS8qIGl0IG1hdGNoZWQgYWxsIG9mIGl0ICovCisJCQkJLyogdGhhdCBvbmUgbWlzc2VkLCB0cnkgbmV4dCBvbmUgKi8KKwkJCQlhc3NlcnQoT1AobS0+Zy0+c3RyaXBbZXN1Yl0pID09IE9PUjEpOworCQkJCWVzdWIrKzsKKwkJCQlhc3NlcnQoT1AobS0+Zy0+c3RyaXBbZXN1Yl0pID09IE9PUjIpOworCQkJCXNzdWIgPSBlc3ViICsgMTsKKwkJCQllc3ViICs9IE9QTkQobS0+Zy0+c3RyaXBbZXN1Yl0pOworCQkJCWlmIChPUChtLT5nLT5zdHJpcFtlc3ViXSkgPT0gT09SMikKKwkJCQkJZXN1Yi0tOworCQkJCWVsc2UKKwkJCQkJYXNzZXJ0KE9QKG0tPmctPnN0cmlwW2VzdWJdKSA9PSBPX0NIKTsKKwkJCX0KKwkJCXsKKwkJCQljb25zdCBjaGFyICpkcCA9IGRpc3NlY3QobSwgc3AsIHJlc3QsIHNzdWIsIGVzdWIpOworCQkJCSh2b2lkKWRwOyAvKiBhdm9pZCB3YXJuaW5nIGlmIGFzc2VydGlvbnMgb2ZmICovCisJCQkJYXNzZXJ0KGRwID09IHJlc3QpOworCQkJfQorCQkJc3AgPSByZXN0OworCQkJYnJlYWs7CisJCWNhc2UgT19QTFVTOgorCQljYXNlIE9fUVVFU1Q6CisJCWNhc2UgT09SMToKKwkJY2FzZSBPT1IyOgorCQljYXNlIE9fQ0g6CisJCQlhc3NlcnQobm9wZSk7CisJCQlicmVhazsKKwkJY2FzZSBPTFBBUkVOOgorCQkJaSA9IE9QTkQobS0+Zy0+c3RyaXBbc3NdKTsKKwkJCWFzc2VydCgwIDwgaSAmJiBpIDw9IG0tPmctPm5zdWIpOworCQkJbS0+cG1hdGNoW2ldLnJtX3NvID0gc3AgLSBtLT5vZmZwOworCQkJYnJlYWs7CisJCWNhc2UgT1JQQVJFTjoKKwkJCWkgPSBPUE5EKG0tPmctPnN0cmlwW3NzXSk7CisJCQlhc3NlcnQoMCA8IGkgJiYgaSA8PSBtLT5nLT5uc3ViKTsKKwkJCW0tPnBtYXRjaFtpXS5ybV9lbyA9IHNwIC0gbS0+b2ZmcDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkJLyogdWggb2ggKi8KKwkJCWFzc2VydChub3BlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYXNzZXJ0KHNwID09IHN0b3ApOworCXJldHVybihzcCk7Cit9CisKKy8qCisgLSBiYWNrcmVmIC0gZmlndXJlIG91dCB3aGF0IG1hdGNoZWQgd2hhdCwgZmlndXJpbmcgaW4gYmFjayByZWZlcmVuY2VzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoJCQkvKiA9PSBzdG9wIChzdWNjZXNzKSBvciBOVUxMIChmYWlsdXJlKSAqLworYmFja3JlZihzdHJ1Y3QgbWF0Y2ggKm0sIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICpzdG9wLCBzb3BubyBzdGFydHN0LAorICAgICAgICBzb3BubyBzdG9wc3QsIHNvcG5vIGxldiwgaW50IHJlYykJCQkvKiBQTFVTIG5lc3RpbmcgbGV2ZWwgKi8KK3sKKwlpbnQgaTsKKwlzb3BubyBzczsJLyogc3RhcnQgc29wIG9mIGN1cnJlbnQgc3ViUkUgKi8KKwljb25zdCBjaGFyICpzcDsJLyogc3RhcnQgb2Ygc3RyaW5nIG1hdGNoZWQgYnkgaXQgKi8KKwlzb3BubyBzc3ViOwkvKiBzdGFydCBzb3Agb2Ygc3Vic3ViUkUgKi8KKwlzb3BubyBlc3ViOwkvKiBlbmQgc29wIG9mIHN1YnN1YlJFICovCisJY29uc3QgY2hhciAqc3NwOwkvKiBzdGFydCBvZiBzdHJpbmcgbWF0Y2hlZCBieSBzdWJzdWJSRSAqLworCWNvbnN0IGNoYXIgKmRwOworCXNpemVfdCBsZW47CisJaW50IGhhcmQ7CisJc29wIHM7CisJbGx2bV9yZWdvZmZfdCBvZmZzYXZlOworCWNzZXQgKmNzOworCisJQVQoImJhY2siLCBzdGFydCwgc3RvcCwgc3RhcnRzdCwgc3RvcHN0KTsKKwlzcCA9IHN0YXJ0OworCisJLyogZ2V0IGFzIGZhciBhcyB3ZSBjYW4gd2l0aCBlYXN5IHN0dWZmICovCisJaGFyZCA9IDA7CisJZm9yIChzcyA9IHN0YXJ0c3Q7ICFoYXJkICYmIHNzIDwgc3RvcHN0OyBzcysrKQorCQlzd2l0Y2ggKE9QKHMgPSBtLT5nLT5zdHJpcFtzc10pKSB7CisJCWNhc2UgT0NIQVI6CisJCQlpZiAoc3AgPT0gc3RvcCB8fCAqc3ArKyAhPSAoY2hhcilPUE5EKHMpKQorCQkJCXJldHVybihOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIE9BTlk6CisJCQlpZiAoc3AgPT0gc3RvcCkKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQlzcCsrOworCQkJYnJlYWs7CisJCWNhc2UgT0FOWU9GOgorCQkJY3MgPSAmbS0+Zy0+c2V0c1tPUE5EKHMpXTsKKwkJCWlmIChzcCA9PSBzdG9wIHx8ICFDSElOKGNzLCAqc3ArKykpCisJCQkJcmV0dXJuKE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgT0JPTDoKKwkJCWlmICggKHNwID09IG0tPmJlZ2lucCAmJiAhKG0tPmVmbGFncyZSRUdfTk9UQk9MKSkgfHwKKwkJCQkJKHNwIDwgbS0+ZW5kcCAmJiAqKHNwLTEpID09ICdcbicgJiYKKwkJCQkJCShtLT5nLT5jZmxhZ3MmUkVHX05FV0xJTkUpKSApCisJCQkJeyAvKiB5ZXMgKi8gfQorCQkJZWxzZQorCQkJCXJldHVybihOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIE9FT0w6CisJCQlpZiAoIChzcCA9PSBtLT5lbmRwICYmICEobS0+ZWZsYWdzJlJFR19OT1RFT0wpKSB8fAorCQkJCQkoc3AgPCBtLT5lbmRwICYmICpzcCA9PSAnXG4nICYmCisJCQkJCQkobS0+Zy0+Y2ZsYWdzJlJFR19ORVdMSU5FKSkgKQorCQkJCXsgLyogeWVzICovIH0KKwkJCWVsc2UKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSBPQk9XOgorCQkJaWYgKCggKHNwID09IG0tPmJlZ2lucCAmJiAhKG0tPmVmbGFncyZSRUdfTk9UQk9MKSkgfHwKKwkJCQkJKHNwIDwgbS0+ZW5kcCAmJiAqKHNwLTEpID09ICdcbicgJiYKKwkJCQkJCShtLT5nLT5jZmxhZ3MmUkVHX05FV0xJTkUpKSB8fAorCQkJCQkoc3AgPiBtLT5iZWdpbnAgJiYKKwkJCQkJCQkhSVNXT1JEKCooc3AtMSkpKSApICYmCisJCQkJCShzcCA8IG0tPmVuZHAgJiYgSVNXT1JEKCpzcCkpICkKKwkJCQl7IC8qIHllcyAqLyB9CisJCQllbHNlCisJCQkJcmV0dXJuKE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgT0VPVzoKKwkJCWlmICgoIChzcCA9PSBtLT5lbmRwICYmICEobS0+ZWZsYWdzJlJFR19OT1RFT0wpKSB8fAorCQkJCQkoc3AgPCBtLT5lbmRwICYmICpzcCA9PSAnXG4nICYmCisJCQkJCQkobS0+Zy0+Y2ZsYWdzJlJFR19ORVdMSU5FKSkgfHwKKwkJCQkJKHNwIDwgbS0+ZW5kcCAmJiAhSVNXT1JEKCpzcCkpICkgJiYKKwkJCQkJKHNwID4gbS0+YmVnaW5wICYmIElTV09SRCgqKHNwLTEpKSkgKQorCQkJCXsgLyogeWVzICovIH0KKwkJCWVsc2UKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSBPX1FVRVNUOgorCQkJYnJlYWs7CisJCWNhc2UgT09SMToJLyogbWF0Y2hlcyBudWxsIGJ1dCBuZWVkcyB0byBza2lwICovCisJCQlzcysrOworCQkJcyA9IG0tPmctPnN0cmlwW3NzXTsKKwkJCWRvIHsKKwkJCQlhc3NlcnQoT1AocykgPT0gT09SMik7CisJCQkJc3MgKz0gT1BORChzKTsKKwkJCX0gd2hpbGUgKE9QKHMgPSBtLT5nLT5zdHJpcFtzc10pICE9IE9fQ0gpOworCQkJLyogbm90ZSB0aGF0IHRoZSBzcysrIGdldHMgdXMgcGFzdCB0aGUgT19DSCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIGhhdmUgdG8gbWFrZSBhIGNob2ljZSAqLworCQkJaGFyZCA9IDE7CisJCQlicmVhazsKKwkJfQorCWlmICghaGFyZCkgewkJLyogdGhhdCB3YXMgaXQhICovCisJCWlmIChzcCAhPSBzdG9wKQorCQkJcmV0dXJuKE5VTEwpOworCQlyZXR1cm4oc3ApOworCX0KKwlzcy0tOwkJCS8qIGFkanVzdCBmb3IgdGhlIGZvcidzIGZpbmFsIGluY3JlbWVudCAqLworCisJLyogdGhlIGhhcmQgc3R1ZmYgKi8KKwlBVCgiaGFyZCIsIHNwLCBzdG9wLCBzcywgc3RvcHN0KTsKKwlzID0gbS0+Zy0+c3RyaXBbc3NdOworCXN3aXRjaCAoT1AocykpIHsKKwljYXNlIE9CQUNLXzoJCS8qIHRoZSB2aWxlc3QgZGVwdGhzICovCisJCWkgPSBPUE5EKHMpOworCQlhc3NlcnQoMCA8IGkgJiYgaSA8PSBtLT5nLT5uc3ViKTsKKwkJaWYgKG0tPnBtYXRjaFtpXS5ybV9lbyA9PSAtMSkKKwkJCXJldHVybihOVUxMKTsKKwkJYXNzZXJ0KG0tPnBtYXRjaFtpXS5ybV9zbyAhPSAtMSk7CisJCWxlbiA9IG0tPnBtYXRjaFtpXS5ybV9lbyAtIG0tPnBtYXRjaFtpXS5ybV9zbzsKKwkJaWYgKGxlbiA9PSAwICYmIHJlYysrID4gTUFYX1JFQ1VSU0lPTikKKwkJCXJldHVybihOVUxMKTsKKwkJYXNzZXJ0KHN0b3AgLSBtLT5iZWdpbnAgPj0gbGVuKTsKKwkJaWYgKHNwID4gc3RvcCAtIGxlbikKKwkJCXJldHVybihOVUxMKTsJLyogbm90IGVub3VnaCBsZWZ0IHRvIG1hdGNoICovCisJCXNzcCA9IG0tPm9mZnAgKyBtLT5wbWF0Y2hbaV0ucm1fc287CisJCWlmIChtZW1jbXAoc3AsIHNzcCwgbGVuKSAhPSAwKQorCQkJcmV0dXJuKE5VTEwpOworCQl3aGlsZSAobS0+Zy0+c3RyaXBbc3NdICE9IFNPUChPX0JBQ0ssIGkpKQorCQkJc3MrKzsKKwkJcmV0dXJuKGJhY2tyZWYobSwgc3ArbGVuLCBzdG9wLCBzcysxLCBzdG9wc3QsIGxldiwgcmVjKSk7CisJCWJyZWFrOworCWNhc2UgT1FVRVNUXzoJCS8qIHRvIG51bGwgb3Igbm90ICovCisJCWRwID0gYmFja3JlZihtLCBzcCwgc3RvcCwgc3MrMSwgc3RvcHN0LCBsZXYsIHJlYyk7CisJCWlmIChkcCAhPSBOVUxMKQorCQkJcmV0dXJuKGRwKTsJLyogbm90ICovCisJCXJldHVybihiYWNrcmVmKG0sIHNwLCBzdG9wLCBzcytPUE5EKHMpKzEsIHN0b3BzdCwgbGV2LCByZWMpKTsKKwkJYnJlYWs7CisJY2FzZSBPUExVU186CisJCWFzc2VydChtLT5sYXN0cG9zICE9IE5VTEwpOworCQlhc3NlcnQobGV2KzEgPD0gbS0+Zy0+bnBsdXMpOworCQltLT5sYXN0cG9zW2xldisxXSA9IHNwOworCQlyZXR1cm4oYmFja3JlZihtLCBzcCwgc3RvcCwgc3MrMSwgc3RvcHN0LCBsZXYrMSwgcmVjKSk7CisJCWJyZWFrOworCWNhc2UgT19QTFVTOgorCQlpZiAoc3AgPT0gbS0+bGFzdHBvc1tsZXZdKQkvKiBsYXN0IHBhc3MgbWF0Y2hlZCBudWxsICovCisJCQlyZXR1cm4oYmFja3JlZihtLCBzcCwgc3RvcCwgc3MrMSwgc3RvcHN0LCBsZXYtMSwgcmVjKSk7CisJCS8qIHRyeSBhbm90aGVyIHBhc3MgKi8KKwkJbS0+bGFzdHBvc1tsZXZdID0gc3A7CisJCWRwID0gYmFja3JlZihtLCBzcCwgc3RvcCwgc3MtT1BORChzKSsxLCBzdG9wc3QsIGxldiwgcmVjKTsKKwkJaWYgKGRwID09IE5VTEwpCisJCQlyZXR1cm4oYmFja3JlZihtLCBzcCwgc3RvcCwgc3MrMSwgc3RvcHN0LCBsZXYtMSwgcmVjKSk7CisJCWVsc2UKKwkJCXJldHVybihkcCk7CisJCWJyZWFrOworCWNhc2UgT0NIXzoJCS8qIGZpbmQgdGhlIHJpZ2h0IG9uZSwgaWYgYW55ICovCisJCXNzdWIgPSBzcyArIDE7CisJCWVzdWIgPSBzcyArIE9QTkQocykgLSAxOworCQlhc3NlcnQoT1AobS0+Zy0+c3RyaXBbZXN1Yl0pID09IE9PUjEpOworCQlmb3IgKDs7KSB7CS8qIGZpbmQgZmlyc3QgbWF0Y2hpbmcgYnJhbmNoICovCisJCQlkcCA9IGJhY2tyZWYobSwgc3AsIHN0b3AsIHNzdWIsIGVzdWIsIGxldiwgcmVjKTsKKwkJCWlmIChkcCAhPSBOVUxMKQorCQkJCXJldHVybihkcCk7CisJCQkvKiB0aGF0IG9uZSBtaXNzZWQsIHRyeSBuZXh0IG9uZSAqLworCQkJaWYgKE9QKG0tPmctPnN0cmlwW2VzdWJdKSA9PSBPX0NIKQorCQkJCXJldHVybihOVUxMKTsJLyogdGhlcmUgaXMgbm9uZSAqLworCQkJZXN1YisrOworCQkJYXNzZXJ0KE9QKG0tPmctPnN0cmlwW2VzdWJdKSA9PSBPT1IyKTsKKwkJCXNzdWIgPSBlc3ViICsgMTsKKwkJCWVzdWIgKz0gT1BORChtLT5nLT5zdHJpcFtlc3ViXSk7CisJCQlpZiAoT1AobS0+Zy0+c3RyaXBbZXN1Yl0pID09IE9PUjIpCisJCQkJZXN1Yi0tOworCQkJZWxzZQorCQkJCWFzc2VydChPUChtLT5nLT5zdHJpcFtlc3ViXSkgPT0gT19DSCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPTFBBUkVOOgkJLyogbXVzdCB1bmRvIGFzc2lnbm1lbnQgaWYgcmVzdCBmYWlscyAqLworCQlpID0gT1BORChzKTsKKwkJYXNzZXJ0KDAgPCBpICYmIGkgPD0gbS0+Zy0+bnN1Yik7CisJCW9mZnNhdmUgPSBtLT5wbWF0Y2hbaV0ucm1fc287CisJCW0tPnBtYXRjaFtpXS5ybV9zbyA9IHNwIC0gbS0+b2ZmcDsKKwkJZHAgPSBiYWNrcmVmKG0sIHNwLCBzdG9wLCBzcysxLCBzdG9wc3QsIGxldiwgcmVjKTsKKwkJaWYgKGRwICE9IE5VTEwpCisJCQlyZXR1cm4oZHApOworCQltLT5wbWF0Y2hbaV0ucm1fc28gPSBvZmZzYXZlOworCQlyZXR1cm4oTlVMTCk7CisJCWJyZWFrOworCWNhc2UgT1JQQVJFTjoJCS8qIG11c3QgdW5kbyBhc3NpZ25tZW50IGlmIHJlc3QgZmFpbHMgKi8KKwkJaSA9IE9QTkQocyk7CisJCWFzc2VydCgwIDwgaSAmJiBpIDw9IG0tPmctPm5zdWIpOworCQlvZmZzYXZlID0gbS0+cG1hdGNoW2ldLnJtX2VvOworCQltLT5wbWF0Y2hbaV0ucm1fZW8gPSBzcCAtIG0tPm9mZnA7CisJCWRwID0gYmFja3JlZihtLCBzcCwgc3RvcCwgc3MrMSwgc3RvcHN0LCBsZXYsIHJlYyk7CisJCWlmIChkcCAhPSBOVUxMKQorCQkJcmV0dXJuKGRwKTsKKwkJbS0+cG1hdGNoW2ldLnJtX2VvID0gb2Zmc2F2ZTsKKwkJcmV0dXJuKE5VTEwpOworCQlicmVhazsKKwlkZWZhdWx0OgkJLyogdWggb2ggKi8KKwkJYXNzZXJ0KG5vcGUpOworCQlicmVhazsKKwl9CisKKwkvKiAiY2FuJ3QgaGFwcGVuIiAqLworCWFzc2VydChub3BlKTsKKwkvKiBOT1RSRUFDSEVEICovCisgICAgICAgIHJldHVybiBOVUxMOworfQorCisvKgorIC0gZmFzdCAtIHN0ZXAgdGhyb3VnaCB0aGUgc3RyaW5nIGF0IHRvcCBzcGVlZAorICovCitzdGF0aWMgY29uc3QgY2hhciAqCQkJLyogd2hlcmUgdGVudGF0aXZlIG1hdGNoIGVuZGVkLCBvciBOVUxMICovCitmYXN0KHN0cnVjdCBtYXRjaCAqbSwgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKnN0b3AsIHNvcG5vIHN0YXJ0c3QsCisgICAgIHNvcG5vIHN0b3BzdCkKK3sKKwlzdGF0ZXMgc3QgPSBtLT5zdDsKKwlzdGF0ZXMgZnJlc2ggPSBtLT5mcmVzaDsKKwlzdGF0ZXMgdG1wID0gbS0+dG1wOworCWNvbnN0IGNoYXIgKnAgPSBzdGFydDsKKwlpbnQgYyA9IChzdGFydCA9PSBtLT5iZWdpbnApID8gT1VUIDogKihzdGFydC0xKTsKKwlpbnQgbGFzdGM7CS8qIHByZXZpb3VzIGMgKi8KKwlpbnQgZmxhZ2NoOworCWludCBpOworCWNvbnN0IGNoYXIgKmNvbGRwOwkvKiBsYXN0IHAgYWZ0ZXIgd2hpY2ggbm8gbWF0Y2ggd2FzIHVuZGVyd2F5ICovCisKKwlDTEVBUihzdCk7CisJU0VUMShzdCwgc3RhcnRzdCk7CisJc3QgPSBzdGVwKG0tPmcsIHN0YXJ0c3QsIHN0b3BzdCwgc3QsIE5PVEhJTkcsIHN0KTsKKwlBU1NJR04oZnJlc2gsIHN0KTsKKwlTUCgic3RhcnQiLCBzdCwgKnApOworCWNvbGRwID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCS8qIG5leHQgY2hhcmFjdGVyICovCisJCWxhc3RjID0gYzsKKwkJYyA9IChwID09IG0tPmVuZHApID8gT1VUIDogKnA7CisJCWlmIChFUShzdCwgZnJlc2gpKQorCQkJY29sZHAgPSBwOworCisJCS8qIGlzIHRoZXJlIGFuIEVPTCBhbmQvb3IgQk9MIGJldHdlZW4gbGFzdGMgYW5kIGM/ICovCisJCWZsYWdjaCA9ICdcMCc7CisJCWkgPSAwOworCQlpZiAoIChsYXN0YyA9PSAnXG4nICYmIG0tPmctPmNmbGFncyZSRUdfTkVXTElORSkgfHwKKwkJCQkobGFzdGMgPT0gT1VUICYmICEobS0+ZWZsYWdzJlJFR19OT1RCT0wpKSApIHsKKwkJCWZsYWdjaCA9IEJPTDsKKwkJCWkgPSBtLT5nLT5uYm9sOworCQl9CisJCWlmICggKGMgPT0gJ1xuJyAmJiBtLT5nLT5jZmxhZ3MmUkVHX05FV0xJTkUpIHx8CisJCQkJKGMgPT0gT1VUICYmICEobS0+ZWZsYWdzJlJFR19OT1RFT0wpKSApIHsKKwkJCWZsYWdjaCA9IChmbGFnY2ggPT0gQk9MKSA/IEJPTEVPTCA6IEVPTDsKKwkJCWkgKz0gbS0+Zy0+bmVvbDsKKwkJfQorCQlpZiAoaSAhPSAwKSB7CisJCQlmb3IgKDsgaSA+IDA7IGktLSkKKwkJCQlzdCA9IHN0ZXAobS0+Zywgc3RhcnRzdCwgc3RvcHN0LCBzdCwgZmxhZ2NoLCBzdCk7CisJCQlTUCgiYm9sZW9sIiwgc3QsIGMpOworCQl9CisKKwkJLyogaG93IGFib3V0IGEgd29yZCBib3VuZGFyeT8gKi8KKwkJaWYgKCAoZmxhZ2NoID09IEJPTCB8fCAobGFzdGMgIT0gT1VUICYmICFJU1dPUkQobGFzdGMpKSkgJiYKKwkJCQkJKGMgIT0gT1VUICYmIElTV09SRChjKSkgKSB7CisJCQlmbGFnY2ggPSBCT1c7CisJCX0KKwkJaWYgKCAobGFzdGMgIT0gT1VUICYmIElTV09SRChsYXN0YykpICYmCisJCQkJKGZsYWdjaCA9PSBFT0wgfHwgKGMgIT0gT1VUICYmICFJU1dPUkQoYykpKSApIHsKKwkJCWZsYWdjaCA9IEVPVzsKKwkJfQorCQlpZiAoZmxhZ2NoID09IEJPVyB8fCBmbGFnY2ggPT0gRU9XKSB7CisJCQlzdCA9IHN0ZXAobS0+Zywgc3RhcnRzdCwgc3RvcHN0LCBzdCwgZmxhZ2NoLCBzdCk7CisJCQlTUCgiYm93ZW93Iiwgc3QsIGMpOworCQl9CisKKwkJLyogYXJlIHdlIGRvbmU/ICovCisJCWlmIChJU1NFVChzdCwgc3RvcHN0KSB8fCBwID09IHN0b3ApCisJCQlicmVhazsJCS8qIE5PVEUgQlJFQUsgT1VUICovCisKKwkJLyogbm8sIHdlIG11c3QgZGVhbCB3aXRoIHRoaXMgY2hhcmFjdGVyICovCisJCUFTU0lHTih0bXAsIHN0KTsKKwkJQVNTSUdOKHN0LCBmcmVzaCk7CisJCWFzc2VydChjICE9IE9VVCk7CisJCXN0ID0gc3RlcChtLT5nLCBzdGFydHN0LCBzdG9wc3QsIHRtcCwgYywgc3QpOworCQlTUCgiYWZ0Iiwgc3QsIGMpOworCQlhc3NlcnQoRVEoc3RlcChtLT5nLCBzdGFydHN0LCBzdG9wc3QsIHN0LCBOT1RISU5HLCBzdCksIHN0KSk7CisJCXArKzsKKwl9CisKKwlhc3NlcnQoY29sZHAgIT0gTlVMTCk7CisJbS0+Y29sZHAgPSBjb2xkcDsKKwlpZiAoSVNTRVQoc3QsIHN0b3BzdCkpCisJCXJldHVybihwKzEpOworCWVsc2UKKwkJcmV0dXJuKE5VTEwpOworfQorCisvKgorIC0gc2xvdyAtIHN0ZXAgdGhyb3VnaCB0aGUgc3RyaW5nIG1vcmUgZGVsaWJlcmF0ZWx5CisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoJCQkvKiB3aGVyZSBpdCBlbmRlZCAqLworc2xvdyhzdHJ1Y3QgbWF0Y2ggKm0sIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICpzdG9wLCBzb3BubyBzdGFydHN0LAorICAgICBzb3BubyBzdG9wc3QpCit7CisJc3RhdGVzIHN0ID0gbS0+c3Q7CisJc3RhdGVzIGVtcHR5ID0gbS0+ZW1wdHk7CisJc3RhdGVzIHRtcCA9IG0tPnRtcDsKKwljb25zdCBjaGFyICpwID0gc3RhcnQ7CisJaW50IGMgPSAoc3RhcnQgPT0gbS0+YmVnaW5wKSA/IE9VVCA6ICooc3RhcnQtMSk7CisJaW50IGxhc3RjOwkvKiBwcmV2aW91cyBjICovCisJaW50IGZsYWdjaDsKKwlpbnQgaTsKKwljb25zdCBjaGFyICptYXRjaHA7CS8qIGxhc3QgcCBhdCB3aGljaCBhIG1hdGNoIGVuZGVkICovCisKKwlBVCgic2xvdyIsIHN0YXJ0LCBzdG9wLCBzdGFydHN0LCBzdG9wc3QpOworCUNMRUFSKHN0KTsKKwlTRVQxKHN0LCBzdGFydHN0KTsKKwlTUCgic3N0YXJ0Iiwgc3QsICpwKTsKKwlzdCA9IHN0ZXAobS0+Zywgc3RhcnRzdCwgc3RvcHN0LCBzdCwgTk9USElORywgc3QpOworCW1hdGNocCA9IE5VTEw7CisJZm9yICg7OykgeworCQkvKiBuZXh0IGNoYXJhY3RlciAqLworCQlsYXN0YyA9IGM7CisJCWMgPSAocCA9PSBtLT5lbmRwKSA/IE9VVCA6ICpwOworCisJCS8qIGlzIHRoZXJlIGFuIEVPTCBhbmQvb3IgQk9MIGJldHdlZW4gbGFzdGMgYW5kIGM/ICovCisJCWZsYWdjaCA9ICdcMCc7CisJCWkgPSAwOworCQlpZiAoIChsYXN0YyA9PSAnXG4nICYmIG0tPmctPmNmbGFncyZSRUdfTkVXTElORSkgfHwKKwkJCQkobGFzdGMgPT0gT1VUICYmICEobS0+ZWZsYWdzJlJFR19OT1RCT0wpKSApIHsKKwkJCWZsYWdjaCA9IEJPTDsKKwkJCWkgPSBtLT5nLT5uYm9sOworCQl9CisJCWlmICggKGMgPT0gJ1xuJyAmJiBtLT5nLT5jZmxhZ3MmUkVHX05FV0xJTkUpIHx8CisJCQkJKGMgPT0gT1VUICYmICEobS0+ZWZsYWdzJlJFR19OT1RFT0wpKSApIHsKKwkJCWZsYWdjaCA9IChmbGFnY2ggPT0gQk9MKSA/IEJPTEVPTCA6IEVPTDsKKwkJCWkgKz0gbS0+Zy0+bmVvbDsKKwkJfQorCQlpZiAoaSAhPSAwKSB7CisJCQlmb3IgKDsgaSA+IDA7IGktLSkKKwkJCQlzdCA9IHN0ZXAobS0+Zywgc3RhcnRzdCwgc3RvcHN0LCBzdCwgZmxhZ2NoLCBzdCk7CisJCQlTUCgic2JvbGVvbCIsIHN0LCBjKTsKKwkJfQorCisJCS8qIGhvdyBhYm91dCBhIHdvcmQgYm91bmRhcnk/ICovCisJCWlmICggKGZsYWdjaCA9PSBCT0wgfHwgKGxhc3RjICE9IE9VVCAmJiAhSVNXT1JEKGxhc3RjKSkpICYmCisJCQkJCShjICE9IE9VVCAmJiBJU1dPUkQoYykpICkgeworCQkJZmxhZ2NoID0gQk9XOworCQl9CisJCWlmICggKGxhc3RjICE9IE9VVCAmJiBJU1dPUkQobGFzdGMpKSAmJgorCQkJCShmbGFnY2ggPT0gRU9MIHx8IChjICE9IE9VVCAmJiAhSVNXT1JEKGMpKSkgKSB7CisJCQlmbGFnY2ggPSBFT1c7CisJCX0KKwkJaWYgKGZsYWdjaCA9PSBCT1cgfHwgZmxhZ2NoID09IEVPVykgeworCQkJc3QgPSBzdGVwKG0tPmcsIHN0YXJ0c3QsIHN0b3BzdCwgc3QsIGZsYWdjaCwgc3QpOworCQkJU1AoInNib3dlb3ciLCBzdCwgYyk7CisJCX0KKworCQkvKiBhcmUgd2UgZG9uZT8gKi8KKwkJaWYgKElTU0VUKHN0LCBzdG9wc3QpKQorCQkJbWF0Y2hwID0gcDsKKwkJaWYgKEVRKHN0LCBlbXB0eSkgfHwgcCA9PSBzdG9wKQorCQkJYnJlYWs7CQkvKiBOT1RFIEJSRUFLIE9VVCAqLworCisJCS8qIG5vLCB3ZSBtdXN0IGRlYWwgd2l0aCB0aGlzIGNoYXJhY3RlciAqLworCQlBU1NJR04odG1wLCBzdCk7CisJCUFTU0lHTihzdCwgZW1wdHkpOworCQlhc3NlcnQoYyAhPSBPVVQpOworCQlzdCA9IHN0ZXAobS0+Zywgc3RhcnRzdCwgc3RvcHN0LCB0bXAsIGMsIHN0KTsKKwkJU1AoInNhZnQiLCBzdCwgYyk7CisJCWFzc2VydChFUShzdGVwKG0tPmcsIHN0YXJ0c3QsIHN0b3BzdCwgc3QsIE5PVEhJTkcsIHN0KSwgc3QpKTsKKwkJcCsrOworCX0KKworCXJldHVybihtYXRjaHApOworfQorCisKKy8qCisgLSBzdGVwIC0gbWFwIHNldCBvZiBzdGF0ZXMgcmVhY2hhYmxlIGJlZm9yZSBjaGFyIHRvIHNldCByZWFjaGFibGUgYWZ0ZXIKKyAqLworc3RhdGljIHN0YXRlcworc3RlcChzdHJ1Y3QgcmVfZ3V0cyAqZywKKyAgICBzb3BubyBzdGFydCwJCS8qIHN0YXJ0IHN0YXRlIHdpdGhpbiBzdHJpcCAqLworICAgIHNvcG5vIHN0b3AsCQkJLyogc3RhdGUgYWZ0ZXIgc3RvcCBzdGF0ZSB3aXRoaW4gc3RyaXAgKi8KKyAgICBzdGF0ZXMgYmVmLAkJCS8qIHN0YXRlcyByZWFjaGFibGUgYmVmb3JlICovCisgICAgaW50IGNoLAkJCS8qIGNoYXJhY3RlciBvciBOT05DSEFSIGNvZGUgKi8KKyAgICBzdGF0ZXMgYWZ0KQkJCS8qIHN0YXRlcyBhbHJlYWR5IGtub3duIHJlYWNoYWJsZSBhZnRlciAqLworeworCWNzZXQgKmNzOworCXNvcCBzOworCXNvcG5vIHBjOworCW9uZXN0YXRlIGhlcmU7CQkvKiBub3RlLCBtYWNyb3Mga25vdyB0aGlzIG5hbWUgKi8KKwlzb3BubyBsb29rOworCWludCBpOworCisJZm9yIChwYyA9IHN0YXJ0LCBJTklUKGhlcmUsIHBjKTsgcGMgIT0gc3RvcDsgcGMrKywgSU5DKGhlcmUpKSB7CisJCXMgPSBnLT5zdHJpcFtwY107CisJCXN3aXRjaCAoT1AocykpIHsKKwkJY2FzZSBPRU5EOgorCQkJYXNzZXJ0KHBjID09IHN0b3AtMSk7CisJCQlicmVhazsKKwkJY2FzZSBPQ0hBUjoKKwkJCS8qIG9ubHkgY2hhcmFjdGVycyBjYW4gbWF0Y2ggKi8KKwkJCWFzc2VydCghTk9OQ0hBUihjaCkgfHwgY2ggIT0gKGNoYXIpT1BORChzKSk7CisJCQlpZiAoY2ggPT0gKGNoYXIpT1BORChzKSkKKwkJCQlGV0QoYWZ0LCBiZWYsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgT0JPTDoKKwkJCWlmIChjaCA9PSBCT0wgfHwgY2ggPT0gQk9MRU9MKQorCQkJCUZXRChhZnQsIGJlZiwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBPRU9MOgorCQkJaWYgKGNoID09IEVPTCB8fCBjaCA9PSBCT0xFT0wpCisJCQkJRldEKGFmdCwgYmVmLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIE9CT1c6CisJCQlpZiAoY2ggPT0gQk9XKQorCQkJCUZXRChhZnQsIGJlZiwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBPRU9XOgorCQkJaWYgKGNoID09IEVPVykKKwkJCQlGV0QoYWZ0LCBiZWYsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgT0FOWToKKwkJCWlmICghTk9OQ0hBUihjaCkpCisJCQkJRldEKGFmdCwgYmVmLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIE9BTllPRjoKKwkJCWNzID0gJmctPnNldHNbT1BORChzKV07CisJCQlpZiAoIU5PTkNIQVIoY2gpICYmIENISU4oY3MsIGNoKSkKKwkJCQlGV0QoYWZ0LCBiZWYsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgT0JBQ0tfOgkJLyogaWdub3JlZCBoZXJlICovCisJCWNhc2UgT19CQUNLOgorCQkJRldEKGFmdCwgYWZ0LCAxKTsKKwkJCWJyZWFrOworCQljYXNlIE9QTFVTXzoJCS8qIGZvcndhcmQsIHRoaXMgaXMganVzdCBhbiBlbXB0eSAqLworCQkJRldEKGFmdCwgYWZ0LCAxKTsKKwkJCWJyZWFrOworCQljYXNlIE9fUExVUzoJCS8qIGJvdGggZm9yd2FyZCBhbmQgYmFjayAqLworCQkJRldEKGFmdCwgYWZ0LCAxKTsKKwkJCWkgPSBJU1NFVEJBQ0soYWZ0LCBPUE5EKHMpKTsKKwkJCUJBQ0soYWZ0LCBhZnQsIE9QTkQocykpOworCQkJaWYgKCFpICYmIElTU0VUQkFDSyhhZnQsIE9QTkQocykpKSB7CisJCQkJLyogb2hvLCBtdXN0IHJlY29uc2lkZXIgbG9vcCBib2R5ICovCisJCQkJcGMgLT0gT1BORChzKSArIDE7CisJCQkJSU5JVChoZXJlLCBwYyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUVVFU1RfOgkJLyogdHdvIGJyYW5jaGVzLCBib3RoIGZvcndhcmQgKi8KKwkJCUZXRChhZnQsIGFmdCwgMSk7CisJCQlGV0QoYWZ0LCBhZnQsIE9QTkQocykpOworCQkJYnJlYWs7CisJCWNhc2UgT19RVUVTVDoJCS8qIGp1c3QgYW4gZW1wdHkgKi8KKwkJCUZXRChhZnQsIGFmdCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBPTFBBUkVOOgkJLyogbm90IHNpZ25pZmljYW50IGhlcmUgKi8KKwkJY2FzZSBPUlBBUkVOOgorCQkJRldEKGFmdCwgYWZ0LCAxKTsKKwkJCWJyZWFrOworCQljYXNlIE9DSF86CQkvKiBtYXJrIHRoZSBmaXJzdCB0d28gYnJhbmNoZXMgKi8KKwkJCUZXRChhZnQsIGFmdCwgMSk7CisJCQlhc3NlcnQoT1AoZy0+c3RyaXBbcGMrT1BORChzKV0pID09IE9PUjIpOworCQkJRldEKGFmdCwgYWZ0LCBPUE5EKHMpKTsKKwkJCWJyZWFrOworCQljYXNlIE9PUjE6CQkvKiBkb25lIGEgYnJhbmNoLCBmaW5kIHRoZSBPX0NIICovCisJCQlpZiAoSVNTVEFURUlOKGFmdCwgaGVyZSkpIHsKKwkJCQlmb3IgKGxvb2sgPSAxOworCQkJCQkJT1AocyA9IGctPnN0cmlwW3BjK2xvb2tdKSAhPSBPX0NIOworCQkJCQkJbG9vayArPSBPUE5EKHMpKQorCQkJCQlhc3NlcnQoT1AocykgPT0gT09SMik7CisJCQkJRldEKGFmdCwgYWZ0LCBsb29rKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9PUjI6CQkvKiBwcm9wYWdhdGUgT0NIXydzIG1hcmtpbmcgKi8KKwkJCUZXRChhZnQsIGFmdCwgMSk7CisJCQlpZiAoT1AoZy0+c3RyaXBbcGMrT1BORChzKV0pICE9IE9fQ0gpIHsKKwkJCQlhc3NlcnQoT1AoZy0+c3RyaXBbcGMrT1BORChzKV0pID09IE9PUjIpOworCQkJCUZXRChhZnQsIGFmdCwgT1BORChzKSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPX0NIOgkJLyoganVzdCBlbXB0eSAqLworCQkJRldEKGFmdCwgYWZ0LCAxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkJLyogb29vb29wcy4uLiAqLworCQkJYXNzZXJ0KG5vcGUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4oYWZ0KTsKK30KKworI2lmZGVmIFJFREVCVUcKKy8qCisgLSBwcmludCAtIHByaW50IGEgc2V0IG9mIHN0YXRlcworICovCitzdGF0aWMgdm9pZAorcHJpbnQoc3RydWN0IG1hdGNoICptLCBjaGFyICpjYXB0aW9uLCBzdGF0ZXMgc3QsIGludCBjaCwgRklMRSAqZCkKK3sKKwlzdHJ1Y3QgcmVfZ3V0cyAqZyA9IG0tPmc7CisJaW50IGk7CisJaW50IGZpcnN0ID0gMTsKKworCWlmICghKG0tPmVmbGFncyZSRUdfVFJBQ0UpKQorCQlyZXR1cm47CisKKwkodm9pZClmcHJpbnRmKGQsICIlcyIsIGNhcHRpb24pOworCWlmIChjaCAhPSAnXDAnKQorCQkodm9pZClmcHJpbnRmKGQsICIgJXMiLCBwY2hhcihjaCkpOworCWZvciAoaSA9IDA7IGkgPCBnLT5uc3RhdGVzOyBpKyspCisJCWlmIChJU1NFVChzdCwgaSkpIHsKKwkJCSh2b2lkKWZwcmludGYoZCwgIiVzJWQiLCAoZmlyc3QpID8gIlx0IiA6ICIsICIsIGkpOworCQkJZmlyc3QgPSAwOworCQl9CisJKHZvaWQpZnByaW50ZihkLCAiXG4iKTsKK30KKworLyogCisgLSBhdCAtIHByaW50IGN1cnJlbnQgc2l0dWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkCithdChzdHJ1Y3QgbWF0Y2ggKm0sIGNoYXIgKnRpdGxlLCBjaGFyICpzdGFydCwgY2hhciAqc3RvcCwgc29wbm8gc3RhcnRzdCwKKyAgICBzb3BubyBzdG9wc3QpCit7CisJaWYgKCEobS0+ZWZsYWdzJlJFR19UUkFDRSkpCisJCXJldHVybjsKKworCSh2b2lkKXByaW50ZigiJXMgJXMtIiwgdGl0bGUsIHBjaGFyKCpzdGFydCkpOworCSh2b2lkKXByaW50ZigiJXMgIiwgcGNoYXIoKnN0b3ApKTsKKwkodm9pZClwcmludGYoIiVsZC0lbGRcbiIsIChsb25nKXN0YXJ0c3QsIChsb25nKXN0b3BzdCk7Cit9CisKKyNpZm5kZWYgUENIQVJET05FCisjZGVmaW5lCVBDSEFSRE9ORQkvKiBuZXZlciBhZ2FpbiAqLworLyoKKyAtIHBjaGFyIC0gbWFrZSBhIGNoYXJhY3RlciBwcmludGFibGUKKyAqCisgKiBJcyB0aGlzIGlkZW50aWNhbCB0byByZWdjaGFyKCkgb3ZlciBpbiBkZWJ1Zy5jPyAgV2VsbCwgeWVzLiAgQnV0IGEKKyAqIGR1cGxpY2F0ZSBoZXJlIGF2b2lkcyBoYXZpbmcgYSBkZWJ1Z2dpbmctY2FwYWJsZSByZWdleGVjLm8gdGllZCB0bworICogYSBtYXRjaGluZyBkZWJ1Zy5vLCBhbmQgdGhpcyBpcyBjb252ZW5pZW50LiAgSXQgYWxsIGRpc2FwcGVhcnMgaW4KKyAqIHRoZSBub24tZGVidWcgY29tcGlsYXRpb24gYW55d2F5LCBzbyBpdCBkb2Vzbid0IG1hdHRlciBtdWNoLgorICovCitzdGF0aWMgY2hhciAqCQkJLyogLT4gcmVwcmVzZW50YXRpb24gKi8KK3BjaGFyKGludCBjaCkKK3sKKwlzdGF0aWMgY2hhciBwYnVmWzEwXTsKKworCWlmIChpc3ByaW50KGNoKSB8fCBjaCA9PSAnICcpCisJCSh2b2lkKXNucHJpbnRmKHBidWYsIHNpemVvZiBwYnVmLCAiJWMiLCBjaCk7CisJZWxzZQorCQkodm9pZClzbnByaW50ZihwYnVmLCBzaXplb2YgcGJ1ZiwgIlxcJW8iLCBjaCk7CisJcmV0dXJuKHBidWYpOworfQorI2VuZGlmCisjZW5kaWYKKworI3VuZGVmCW1hdGNoZXIKKyN1bmRlZglmYXN0CisjdW5kZWYJc2xvdworI3VuZGVmCWRpc3NlY3QKKyN1bmRlZgliYWNrcmVmCisjdW5kZWYJc3RlcAorI3VuZGVmCXByaW50CisjdW5kZWYJYXQKKyN1bmRlZgltYXRjaAorI3VuZGVmCW5vcGUKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TdXBwb3J0L3JlZ2V4Mi5oIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvcmVnZXgyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NTljMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L3JlZ2V4Mi5oCkBAIC0wLDAgKzEsMTU3IEBACisvKi0KKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gT3BlbkJTRCdzIGxpYmMvcmVnZXgsIG9yaWdpbmFsIGxpY2Vuc2UgZm9sbG93czoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQgSGVucnkgU3BlbmNlci4KKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogSGVucnkgU3BlbmNlci4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXJlZ2V4Mi5oCTguNCAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisvKgorICogaW50ZXJuYWxzIG9mIHJlZ2V4X3QKKyAqLworI2RlZmluZQlNQUdJQzEJKCgoJ3InXjAyMDApPDw4KSB8ICdlJykKKworLyoKKyAqIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBpcyBhICpzdHJpcCosIGEgc2VxdWVuY2Ugb2YKKyAqIG9wZXJhdG9ycyBlbmRpbmcgd2l0aCBhbiBlbmRtYXJrZXIuICAoU29tZSB0ZXJtaW5vbG9neSBldGMuIGlzIGEKKyAqIGhpc3RvcmljYWwgcmVsaWMgb2YgZWFybGllciB2ZXJzaW9ucyB3aGljaCB1c2VkIG11bHRpcGxlIHN0cmlwcy4pCisgKiBDZXJ0YWluIG9kZGl0aWVzIGluIHRoZSByZXByZXNlbnRhdGlvbiBhcmUgdGhlcmUgdG8gcGVybWl0IHJ1bm5pbmcKKyAqIHRoZSBtYWNoaW5lcnkgYmFja3dhcmRzOyBpbiBwYXJ0aWN1bGFyLCBhbnkgZGV2aWF0aW9uIGZyb20gc2VxdWVudGlhbAorICogZmxvdyBtdXN0IGJlIG1hcmtlZCBhdCBib3RoIGl0cyBzb3VyY2UgYW5kIGl0cyBkZXN0aW5hdGlvbi4gIFNvbWUKKyAqIGZpbmUgcG9pbnRzOgorICoKKyAqIC0gT1BMVVNfIGFuZCBPX1BMVVMgYXJlICppbnNpZGUqIHRoZSBsb29wIHRoZXkgY3JlYXRlLgorICogLSBPUVVFU1RfIGFuZCBPX1FVRVNUIGFyZSAqb3V0c2lkZSogdGhlIGJ5cGFzcyB0aGV5IGNyZWF0ZS4KKyAqIC0gT0NIXyBhbmQgT19DSCBhcmUgKm91dHNpZGUqIHRoZSBtdWx0aS13YXkgYnJhbmNoIHRoZXkgY3JlYXRlLCB3aGlsZQorICogICBPT1IxIGFuZCBPT1IyIGFyZSByZXNwZWN0aXZlbHkgdGhlIGVuZCBhbmQgdGhlIGJlZ2lubmluZyBvZiBvbmUgb2YKKyAqICAgdGhlIGJyYW5jaGVzLiAgTm90ZSB0aGF0IHRoZXJlIGlzIGFuIGltcGxpY2l0IE9PUjIgZm9sbG93aW5nIE9DSF8KKyAqICAgYW5kIGFuIGltcGxpY2l0IE9PUjEgcHJlY2VkaW5nIE9fQ0guCisgKgorICogSW4gc3RhdGUgcmVwcmVzZW50YXRpb25zLCBhbiBvcGVyYXRvcidzIGJpdCBpcyBvbiB0byBzaWduaWZ5IGEgc3RhdGUKKyAqIGltbWVkaWF0ZWx5ICpwcmVjZWRpbmcqICJleGVjdXRpb24iIG9mIHRoYXQgb3BlcmF0b3IuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzb3A7CS8qIHN0cmlwIG9wZXJhdG9yICovCit0eXBlZGVmIGxvbmcgc29wbm87CisjZGVmaW5lCU9QUk1BU0sJMHhmODAwMDAwMExVCisjZGVmaW5lCU9QRE1BU0sJMHgwN2ZmZmZmZkxVCisjZGVmaW5lCU9QU0hJRlQJKCh1bnNpZ25lZCkyNykKKyNkZWZpbmUJT1AobikJKChuKSZPUFJNQVNLKQorI2RlZmluZQlPUE5EKG4pCSgobikmT1BETUFTSykKKyNkZWZpbmUJU09QKG9wLCBvcG5kKQkoKG9wKXwob3BuZCkpCisvKiBvcGVyYXRvcnMJCQkgICBtZWFuaW5nCW9wZXJhbmQJCQkqLworLyoJCQkJCQkoYmFjaywgZndkIGFyZSBvZmZzZXRzKQkqLworI2RlZmluZQlPRU5ECSgxTFU8PE9QU0hJRlQpCS8qIGVuZG1hcmtlcgktCQkJKi8KKyNkZWZpbmUJT0NIQVIJKDJMVTw8T1BTSElGVCkJLyogY2hhcmFjdGVyCXVuc2lnbmVkIGNoYXIJCSovCisjZGVmaW5lCU9CT0wJKDNMVTw8T1BTSElGVCkJLyogbGVmdCBhbmNob3IJLQkJCSovCisjZGVmaW5lCU9FT0wJKDRMVTw8T1BTSElGVCkJLyogcmlnaHQgYW5jaG9yCS0JCQkqLworI2RlZmluZQlPQU5ZCSg1TFU8PE9QU0hJRlQpCS8qIC4JCS0JCQkqLworI2RlZmluZQlPQU5ZT0YJKDZMVTw8T1BTSElGVCkJLyogWy4uLl0Jc2V0IG51bWJlcgkJKi8KKyNkZWZpbmUJT0JBQ0tfCSg3TFU8PE9QU0hJRlQpCS8qIGJlZ2luIFxkCXBhcmVuIG51bWJlcgkJKi8KKyNkZWZpbmUJT19CQUNLCSg4TFU8PE9QU0hJRlQpCS8qIGVuZCBcZAlwYXJlbiBudW1iZXIJCSovCisjZGVmaW5lCU9QTFVTXwkoOUxVPDxPUFNISUZUKQkvKiArIHByZWZpeAlmd2QgdG8gc3VmZml4CQkqLworI2RlZmluZQlPX1BMVVMJKDEwTFU8PE9QU0hJRlQpCS8qICsgc3VmZml4CWJhY2sgdG8gcHJlZml4CQkqLworI2RlZmluZQlPUVVFU1RfCSgxMUxVPDxPUFNISUZUKQkvKiA/IHByZWZpeAlmd2QgdG8gc3VmZml4CQkqLworI2RlZmluZQlPX1FVRVNUCSgxMkxVPDxPUFNISUZUKQkvKiA/IHN1ZmZpeAliYWNrIHRvIHByZWZpeAkJKi8KKyNkZWZpbmUJT0xQQVJFTgkoMTNMVTw8T1BTSElGVCkJLyogKAkJZndkIHRvICkJCSovCisjZGVmaW5lCU9SUEFSRU4JKDE0TFU8PE9QU0hJRlQpCS8qICkJCWJhY2sgdG8gKAkJKi8KKyNkZWZpbmUJT0NIXwkoMTVMVTw8T1BTSElGVCkJLyogYmVnaW4gY2hvaWNlCWZ3ZCB0byBPT1IyCQkqLworI2RlZmluZQlPT1IxCSgxNkxVPDxPUFNISUZUKQkvKiB8IHB0LiAxCWJhY2sgdG8gT09SMSBvciBPQ0hfCSovCisjZGVmaW5lCU9PUjIJKDE3TFU8PE9QU0hJRlQpCS8qIHwgcHQuIDIJZndkIHRvIE9PUjIgb3IgT19DSAkqLworI2RlZmluZQlPX0NICSgxOExVPDxPUFNISUZUKQkvKiBlbmQgY2hvaWNlCWJhY2sgdG8gT09SMQkJKi8KKyNkZWZpbmUJT0JPVwkoMTlMVTw8T1BTSElGVCkJLyogYmVnaW4gd29yZAktCQkJKi8KKyNkZWZpbmUJT0VPVwkoMjBMVTw8T1BTSElGVCkJLyogZW5kIHdvcmQJLQkJCSovCisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIFtdIGNoYXJhY3Rlci1zZXQgcmVwcmVzZW50YXRpb24uICBDaGFyYWN0ZXIgc2V0cyBhcmUKKyAqIGRvbmUgYXMgYml0IHZlY3RvcnMsIGdyb3VwZWQgOCB0byBhIGJ5dGUgdmVjdG9yIGZvciBjb21wYWN0bmVzcy4KKyAqIFRoZSBpbmRpdmlkdWFsIHNldCB0aGVyZWZvcmUgaGFzIGJvdGggYSBwb2ludGVyIHRvIHRoZSBieXRlIHZlY3RvcgorICogYW5kIGEgbWFzayB0byBwaWNrIG91dCB0aGUgcmVsZXZhbnQgYml0IG9mIGVhY2ggYnl0ZS4gIEEgaGFzaCBjb2RlCisgKiBzaW1wbGlmaWVzIHRlc3Rpbmcgd2hldGhlciB0d28gc2V0cyBjb3VsZCBiZSBpZGVudGljYWwuCisgKgorICogVGhpcyB3aWxsIGdldCB0cmlja2llciBmb3IgbXVsdGljaGFyYWN0ZXIgY29sbGF0aW5nIGVsZW1lbnRzLiAgQXMKKyAqIHByZWxpbWluYXJ5IGhvb2tzIGZvciBkZWFsaW5nIHdpdGggc3VjaCB0aGluZ3MsIHdlIGFsc28gY2FycnkgYWxvbmcKKyAqIGEgc3RyaW5nIG9mIG11bHRpLWNoYXJhY3RlciBlbGVtZW50cywgYW5kIGRlY2lkZSB0aGUgc2l6ZSBvZiB0aGUKKyAqIHZlY3RvcnMgYXQgcnVuIHRpbWUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1Y2ggKnB0cjsJCS8qIC0+IHVjaCBbY3NldHNpemVdICovCisJdWNoIG1hc2s7CQkvKiBiaXQgd2l0aGluIGFycmF5ICovCisJdWNoIGhhc2g7CQkvKiBoYXNoIGNvZGUgKi8KKwlzaXplX3Qgc211bHRpczsKKwljaGFyICptdWx0aXM7CQkvKiAtPiBjaGFyW3NtdWx0aV0gIGFiXDBjZFwwZWZcMFwwICovCit9IGNzZXQ7CisvKiBub3RlIHRoYXQgQ0hhZGQgYW5kIENIc3ViIGFyZSB1bnNhZmUsIGFuZCBDSElOIGRvZXNuJ3QgeWllbGQgMC8xICovCisjZGVmaW5lCUNIYWRkKGNzLCBjKQkoKGNzKS0+cHRyWyh1Y2gpKGMpXSB8PSAoY3MpLT5tYXNrLCAoY3MpLT5oYXNoICs9IChjKSkKKyNkZWZpbmUJQ0hzdWIoY3MsIGMpCSgoY3MpLT5wdHJbKHVjaCkoYyldICY9IH4oY3MpLT5tYXNrLCAoY3MpLT5oYXNoIC09IChjKSkKKyNkZWZpbmUJQ0hJTihjcywgYykJKChjcyktPnB0clsodWNoKShjKV0gJiAoY3MpLT5tYXNrKQorI2RlZmluZQlNQ2FkZChwLCBjcywgY3ApCW1jYWRkKHAsIGNzLCBjcCkJLyogbGx2bV9yZWdjb21wKCkgaW50ZXJuYWwgZm5zICovCisjZGVmaW5lCU1Dc3ViKHAsIGNzLCBjcCkJbWNzdWIocCwgY3MsIGNwKQorI2RlZmluZQlNQ2luKHAsIGNzLCBjcCkJbWNpbihwLCBjcywgY3ApCisKKy8qIHN0dWZmIGZvciBjaGFyYWN0ZXIgY2F0ZWdvcmllcyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGNhdF90OworCisvKgorICogbWFpbiBjb21waWxlZC1leHByZXNzaW9uIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgcmVfZ3V0cyB7CisJaW50IG1hZ2ljOworIwkJZGVmaW5lCU1BR0lDMgkoKCgnUideMDIwMCk8PDgpfCdFJykKKwlzb3AgKnN0cmlwOwkJLyogbWFsbG9jZWQgYXJlYSBmb3Igc3RyaXAgKi8KKwlpbnQgY3NldHNpemU7CQkvKiBudW1iZXIgb2YgYml0cyBpbiBhIGNzZXQgdmVjdG9yICovCisJaW50IG5jc2V0czsJCS8qIG51bWJlciBvZiBjc2V0cyBpbiB1c2UgKi8KKwljc2V0ICpzZXRzOwkJLyogLT4gY3NldCBbbmNzZXRzXSAqLworCXVjaCAqc2V0Yml0czsJCS8qIC0+IHVjaFtjc2V0c2l6ZV1bbmNzZXRzL0NIQVJfQklUXSAqLworCWludCBjZmxhZ3M7CQkvKiBjb3B5IG9mIGxsdm1fcmVnY29tcCgpIGNmbGFncyBhcmd1bWVudCAqLworCXNvcG5vIG5zdGF0ZXM7CQkvKiA9IG51bWJlciBvZiBzb3BzICovCisJc29wbm8gZmlyc3RzdGF0ZTsJLyogdGhlIGluaXRpYWwgT0VORCAobm9ybWFsbHkgMCkgKi8KKwlzb3BubyBsYXN0c3RhdGU7CS8qIHRoZSBmaW5hbCBPRU5EICovCisJaW50IGlmbGFnczsJCS8qIGludGVybmFsIGZsYWdzICovCisjCQlkZWZpbmUJVVNFQk9MCTAxCS8qIHVzZWQgXiAqLworIwkJZGVmaW5lCVVTRUVPTAkwMgkvKiB1c2VkICQgKi8KKyMJCWRlZmluZQlSRUdFWF9CQUQJMDQJLyogc29tZXRoaW5nIHdyb25nICovCisJaW50IG5ib2w7CQkvKiBudW1iZXIgb2YgXiB1c2VkICovCisJaW50IG5lb2w7CQkvKiBudW1iZXIgb2YgJCB1c2VkICovCisJaW50IG5jYXRlZ29yaWVzOwkvKiBob3cgbWFueSBjaGFyYWN0ZXIgY2F0ZWdvcmllcyAqLworCWNhdF90ICpjYXRlZ29yaWVzOwkvKiAtPmNhdHNwYWNlWy1DSEFSX01JTl0gKi8KKwljaGFyICptdXN0OwkJLyogbWF0Y2ggbXVzdCBjb250YWluIHRoaXMgc3RyaW5nICovCisJaW50IG1sZW47CQkvKiBsZW5ndGggb2YgbXVzdCAqLworCXNpemVfdCBuc3ViOwkJLyogY29weSBvZiByZV9uc3ViICovCisJaW50IGJhY2tyZWZzOwkJLyogZG9lcyBpdCB1c2UgYmFjayByZWZlcmVuY2VzPyAqLworCXNvcG5vIG5wbHVzOwkJLyogaG93IGRlZXAgZG9lcyBpdCBuZXN0ICtzPyAqLworCS8qIGNhdHNwYWNlIG11c3QgYmUgbGFzdCAqLworCWNhdF90IGNhdHNwYWNlWzFdOwkvKiBhY3R1YWxseSBbTkNdICovCit9OworCisvKiBtaXNjIHV0aWxpdGllcyAqLworI2RlZmluZQlPVVQJKENIQVJfTUFYKzEpCS8qIGEgbm9uLWNoYXJhY3RlciB2YWx1ZSAqLworI2RlZmluZQlJU1dPUkQoYykJKGlzYWxudW0oYyYweGZmKSB8fCAoYykgPT0gJ18nKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvcmVnZXhfaW1wbC5oIGIvc3JjL0xMVk0vbGliL1N1cHBvcnQvcmVnZXhfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4Mjk2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3VwcG9ydC9yZWdleF9pbXBsLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qLQorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBPcGVuQlNEJ3MgbGliYy9yZWdleCwgb3JpZ2luYWwgbGljZW5zZSBmb2xsb3dzOgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MiBIZW5yeSBTcGVuY2VyLgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyIG9mIHRoZSBVbml2ZXJzaXR5IG9mIFRvcm9udG8uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylyZWdleC5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX1JFR0VYX0hfCisjZGVmaW5lCV9SRUdFWF9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cit0eXBlZGVmIG9mZl90IGxsdm1fcmVnb2ZmX3Q7Cit0eXBlZGVmIHN0cnVjdCB7CisgIGxsdm1fcmVnb2ZmX3Qgcm1fc287CQkvKiBzdGFydCBvZiBtYXRjaCAqLworICBsbHZtX3JlZ29mZl90IHJtX2VvOwkJLyogZW5kIG9mIG1hdGNoICovCit9IGxsdm1fcmVnbWF0Y2hfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbGx2bV9yZWdleCB7CisgIGludCByZV9tYWdpYzsKKyAgc2l6ZV90IHJlX25zdWI7CQkvKiBudW1iZXIgb2YgcGFyZW50aGVzaXplZCBzdWJleHByZXNzaW9ucyAqLworICBjb25zdCBjaGFyICpyZV9lbmRwOwkvKiBlbmQgcG9pbnRlciBmb3IgUkVHX1BFTkQgKi8KKyAgc3RydWN0IHJlX2d1dHMgKnJlX2c7CS8qIG5vbmUgb2YgeW91ciBidXNpbmVzcyA6LSkgKi8KK30gbGx2bV9yZWdleF90OworCisvKiBsbHZtX3JlZ2NvbXAoKSBmbGFncyAqLworI2RlZmluZQlSRUdfQkFTSUMJMDAwMAorI2RlZmluZQlSRUdfRVhURU5ERUQJMDAwMQorI2RlZmluZQlSRUdfSUNBU0UJMDAwMgorI2RlZmluZQlSRUdfTk9TVUIJMDAwNAorI2RlZmluZQlSRUdfTkVXTElORQkwMDEwCisjZGVmaW5lCVJFR19OT1NQRUMJMDAyMAorI2RlZmluZQlSRUdfUEVORAkwMDQwCisjZGVmaW5lCVJFR19EVU1QCTAyMDAKKworLyogbGx2bV9yZWdlcnJvcigpIGZsYWdzICovCisjZGVmaW5lCVJFR19OT01BVENICSAxCisjZGVmaW5lCVJFR19CQURQQVQJIDIKKyNkZWZpbmUJUkVHX0VDT0xMQVRFCSAzCisjZGVmaW5lCVJFR19FQ1RZUEUJIDQKKyNkZWZpbmUJUkVHX0VFU0NBUEUJIDUKKyNkZWZpbmUJUkVHX0VTVUJSRUcJIDYKKyNkZWZpbmUJUkVHX0VCUkFDSwkgNworI2RlZmluZQlSRUdfRVBBUkVOCSA4CisjZGVmaW5lCVJFR19FQlJBQ0UJIDkKKyNkZWZpbmUJUkVHX0JBREJSCTEwCisjZGVmaW5lCVJFR19FUkFOR0UJMTEKKyNkZWZpbmUJUkVHX0VTUEFDRQkxMgorI2RlZmluZQlSRUdfQkFEUlBUCTEzCisjZGVmaW5lCVJFR19FTVBUWQkxNAorI2RlZmluZQlSRUdfQVNTRVJUCTE1CisjZGVmaW5lCVJFR19JTlZBUkcJMTYKKyNkZWZpbmUJUkVHX0FUT0kJMjU1CS8qIGNvbnZlcnQgbmFtZSB0byBudW1iZXIgKCEpICovCisjZGVmaW5lCVJFR19JVE9BCTA0MDAJLyogY29udmVydCBudW1iZXIgdG8gbmFtZSAoISkgKi8KKworLyogbGx2bV9yZWdleGVjKCkgZmxhZ3MgKi8KKyNkZWZpbmUJUkVHX05PVEJPTAkwMDAwMQorI2RlZmluZQlSRUdfTk9URU9MCTAwMDAyCisjZGVmaW5lCVJFR19TVEFSVEVORAkwMDAwNAorI2RlZmluZQlSRUdfVFJBQ0UJMDA0MDAJLyogdHJhY2luZyBvZiBleGVjdXRpb24gKi8KKyNkZWZpbmUJUkVHX0xBUkdFCTAxMDAwCS8qIGZvcmNlIGxhcmdlIHJlcHJlc2VudGF0aW9uICovCisjZGVmaW5lCVJFR19CQUNLUgkwMjAwMAkvKiBmb3JjZSB1c2Ugb2YgYmFja3JlZiBjb2RlICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW50CWxsdm1fcmVnY29tcChsbHZtX3JlZ2V4X3QgKiwgY29uc3QgY2hhciAqLCBpbnQpOworc2l6ZV90CWxsdm1fcmVnZXJyb3IoaW50LCBjb25zdCBsbHZtX3JlZ2V4X3QgKiwgY2hhciAqLCBzaXplX3QpOworaW50CWxsdm1fcmVnZXhlYyhjb25zdCBsbHZtX3JlZ2V4X3QgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9yZWdtYXRjaF90IFtdLCBpbnQpOwordm9pZAlsbHZtX3JlZ2ZyZWUobGx2bV9yZWdleF90ICopOworc2l6ZV90ICBsbHZtX3N0cmxjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9SRUdFWF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N1cHBvcnQvcmVndXRpbHMuaCBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L3JlZ3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlZTEwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TdXBwb3J0L3JlZ3V0aWxzLmgKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIE9wZW5CU0QncyBsaWJjL3JlZ2V4LCBvcmlnaW5hbCBsaWNlbnNlIGZvbGxvd3M6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0IEhlbnJ5IFNwZW5jZXIuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEhlbnJ5IFNwZW5jZXIuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl1dGlscy5oCTguMyAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisvKiB1dGlsaXR5IGRlZmluaXRpb25zICovCisjZGVmaW5lCU5DCQkoQ0hBUl9NQVggLSBDSEFSX01JTiArIDEpCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoOworCisvKiBzd2l0Y2ggb2ZmIGFzc2VydGlvbnMgKGlmIG5vdCBhbHJlYWR5IG9mZikgaWYgbm8gUkVERUJVRyAqLworI2lmbmRlZiBSRURFQlVHCisjaWZuZGVmIE5ERUJVRworI2RlZmluZQlOREVCVUcJLyogbm8gYXNzZXJ0aW9ucyBwbGVhc2UgKi8KKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8qIGZvciBvbGQgc3lzdGVtcyB3aXRoIGJjb3B5KCkgYnV0IG5vIG1lbW1vdmUoKSAqLworI2lmZGVmIFVTRUJDT1BZCisjZGVmaW5lCW1lbW1vdmUoZCwgcywgYykJYmNvcHkocywgZCwgYykKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9BdG9taWMuY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9BdG9taWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYThiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL0F0b21pYy5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vPT09LS0gQXRvbWljLmNwcCAtIEF0b21pYyBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgaGVhZGVyIGZpbGUgaW1wbGVtZW50cyBhdG9taWMgb3BlcmF0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vQXRvbWljLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvY29uZmlnLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjdW5kZWYgTWVtb3J5RmVuY2UKKyNlbmRpZgorCit2b2lkIHN5czo6TWVtb3J5RmVuY2UoKSB7CisjaWYgTExWTV9NVUxUSVRIUkVBREVEPT0wCisgIHJldHVybjsKKyNlbHNlCisjICBpZiBkZWZpbmVkKF9fR05VQ19fKQorICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyMgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgTWVtb3J5QmFycmllcigpOworIyAgZWxzZQorIyBlcnJvciBObyBtZW1vcnkgZmVuY2UgaW1wbGVtZW50YXRpb24gZm9yIHlvdXIgcGxhdGZvcm0hCisjICBlbmRpZgorI2VuZGlmCit9CisKK3N5czo6Y2FzX2ZsYWcgc3lzOjpDb21wYXJlQW5kU3dhcCh2b2xhdGlsZSBzeXM6OmNhc19mbGFnKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzOjpjYXNfZmxhZyBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzOjpjYXNfZmxhZyBvbGRfdmFsdWUpIHsKKyNpZiBMTFZNX01VTFRJVEhSRUFERUQ9PTAKKyAgc3lzOjpjYXNfZmxhZyByZXN1bHQgPSAqcHRyOworICBpZiAocmVzdWx0ID09IG9sZF92YWx1ZSkKKyAgICAqcHRyID0gbmV3X3ZhbHVlOworICByZXR1cm4gcmVzdWx0OworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgcmV0dXJuIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgIHJldHVybiBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZShwdHIsIG5ld192YWx1ZSwgb2xkX3ZhbHVlKTsKKyNlbHNlCisjICBlcnJvciBObyBjb21wYXJlLWFuZC1zd2FwIGltcGxlbWVudGF0aW9uIGZvciB5b3VyIHBsYXRmb3JtIQorI2VuZGlmCit9CisKK3N5czo6Y2FzX2ZsYWcgc3lzOjpBdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgc3lzOjpjYXNfZmxhZyogcHRyKSB7CisjaWYgTExWTV9NVUxUSVRIUkVBREVEPT0wCisgICsrKCpwdHIpOworICByZXR1cm4gKnB0cjsKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisgIHJldHVybiBfX3N5bmNfYWRkX2FuZF9mZXRjaChwdHIsIDEpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgcmV0dXJuIEludGVybG9ja2VkSW5jcmVtZW50KHB0cik7CisjZWxzZQorIyAgZXJyb3IgTm8gYXRvbWljIGluY3JlbWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgeW91ciBwbGF0Zm9ybSEKKyNlbmRpZgorfQorCitzeXM6OmNhc19mbGFnIHN5czo6QXRvbWljRGVjcmVtZW50KHZvbGF0aWxlIHN5czo6Y2FzX2ZsYWcqIHB0cikgeworI2lmIExMVk1fTVVMVElUSFJFQURFRD09MAorICAtLSgqcHRyKTsKKyAgcmV0dXJuICpwdHI7CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorICByZXR1cm4gX19zeW5jX3N1Yl9hbmRfZmV0Y2gocHRyLCAxKTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgIHJldHVybiBJbnRlcmxvY2tlZERlY3JlbWVudChwdHIpOworI2Vsc2UKKyMgIGVycm9yIE5vIGF0b21pYyBkZWNyZW1lbnQgaW1wbGVtZW50YXRpb24gZm9yIHlvdXIgcGxhdGZvcm0hCisjZW5kaWYKK30KKworc3lzOjpjYXNfZmxhZyBzeXM6OkF0b21pY0FkZCh2b2xhdGlsZSBzeXM6OmNhc19mbGFnKiBwdHIsIHN5czo6Y2FzX2ZsYWcgdmFsKSB7CisjaWYgTExWTV9NVUxUSVRIUkVBREVEPT0wCisgICpwdHIgKz0gdmFsOworICByZXR1cm4gKnB0cjsKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisgIHJldHVybiBfX3N5bmNfYWRkX2FuZF9mZXRjaChwdHIsIHZhbCk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICByZXR1cm4gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZChwdHIsIHZhbCkgKyB2YWw7CisjZWxzZQorIyAgZXJyb3IgTm8gYXRvbWljIGFkZCBpbXBsZW1lbnRhdGlvbiBmb3IgeW91ciBwbGF0Zm9ybSEKKyNlbmRpZgorfQorCitzeXM6OmNhc19mbGFnIHN5czo6QXRvbWljTXVsKHZvbGF0aWxlIHN5czo6Y2FzX2ZsYWcqIHB0ciwgc3lzOjpjYXNfZmxhZyB2YWwpIHsKKyAgc3lzOjpjYXNfZmxhZyBvcmlnaW5hbCwgcmVzdWx0OworICBkbyB7CisgICAgb3JpZ2luYWwgPSAqcHRyOworICAgIHJlc3VsdCA9IG9yaWdpbmFsICogdmFsOworICB9IHdoaWxlIChzeXM6OkNvbXBhcmVBbmRTd2FwKHB0ciwgcmVzdWx0LCBvcmlnaW5hbCkgIT0gb3JpZ2luYWwpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N5czo6Y2FzX2ZsYWcgc3lzOjpBdG9taWNEaXYodm9sYXRpbGUgc3lzOjpjYXNfZmxhZyogcHRyLCBzeXM6OmNhc19mbGFnIHZhbCkgeworICBzeXM6OmNhc19mbGFnIG9yaWdpbmFsLCByZXN1bHQ7CisgIGRvIHsKKyAgICBvcmlnaW5hbCA9ICpwdHI7CisgICAgcmVzdWx0ID0gb3JpZ2luYWwgLyB2YWw7CisgIH0gd2hpbGUgKHN5czo6Q29tcGFyZUFuZFN3YXAocHRyLCByZXN1bHQsIG9yaWdpbmFsKSAhPSBvcmlnaW5hbCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvU3lzdGVtL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0M2MzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDggQEAKK2FkZF9sbHZtX2xpYnJhcnkoTExWTVN5c3RlbQorICBBbGFybS5jcHAKKyAgQXRvbWljLmNwcAorICBEaXNhc3NlbWJsZXIuY3BwCisgIER5bmFtaWNMaWJyYXJ5LmNwcAorICBFcnJuby5jcHAKKyAgSG9zdC5jcHAKKyAgSW5jbHVkZUZpbGUuY3BwCisgIE1lbW9yeS5jcHAKKyAgTXV0ZXguY3BwCisgIFBhdGguY3BwCisgIFByb2Nlc3MuY3BwCisgIFByb2dyYW0uY3BwCisgIFJXTXV0ZXguY3BwCisgIFNlYXJjaEZvckFkZHJlc3NPZlNwZWNpYWxTeW1ib2wuY3BwCisgIFNpZ25hbHMuY3BwCisgIFRocmVhZExvY2FsLmNwcAorICBUaHJlYWRpbmcuY3BwCisgIFRpbWVWYWx1ZS5jcHAKKyAgVmFsZ3JpbmQuY3BwCisgIFVuaXgvQWxhcm0uaW5jCisgIFVuaXgvSG9zdC5pbmMKKyAgVW5peC9NZW1vcnkuaW5jCisgIFVuaXgvTXV0ZXguaW5jCisgIFVuaXgvUGF0aC5pbmMKKyAgVW5peC9Qcm9jZXNzLmluYworICBVbml4L1Byb2dyYW0uaW5jCisgIFVuaXgvUldNdXRleC5pbmMKKyAgVW5peC9TaWduYWxzLmluYworICBVbml4L1RocmVhZExvY2FsLmluYworICBVbml4L1RpbWVWYWx1ZS5pbmMKKyAgV2luMzIvQWxhcm0uaW5jCisgIFdpbjMyL0R5bmFtaWNMaWJyYXJ5LmluYworICBXaW4zMi9Ib3N0LmluYworICBXaW4zMi9NZW1vcnkuaW5jCisgIFdpbjMyL011dGV4LmluYworICBXaW4zMi9QYXRoLmluYworICBXaW4zMi9Qcm9jZXNzLmluYworICBXaW4zMi9Qcm9ncmFtLmluYworICBXaW4zMi9SV011dGV4LmluYworICBXaW4zMi9TaWduYWxzLmluYworICBXaW4zMi9UaHJlYWRMb2NhbC5pbmMKKyAgV2luMzIvVGltZVZhbHVlLmluYworICApCisKK2lmKCBCVUlMRF9TSEFSRURfTElCUyBBTkQgTk9UIFdJTjMyICkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKExMVk1TeXN0ZW0gJHtDTUFLRV9ETF9MSUJTfSkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vRGlzYXNzZW1ibGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vRGlzYXNzZW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzllM2JlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9EaXNhc3NlbWJsZXIuY3BwCkBAIC0wLDAgKzEsNzUgQEAKKy8vPT09LSBsaWIvU3lzdGVtL0Rpc2Fzc2VtYmxlci5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIG5lY2Vzc2FyeSBnbHVlIHRvIGNhbGwgZXh0ZXJuYWwgZGlzYXNzZW1ibGVyCisvLyBsaWJyYXJpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0Rpc2Fzc2VtYmxlci5oIgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaWYgVVNFX1VESVM4NgorI2luY2x1ZGUgPHVkaXM4Ni5oPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitib29sIGxsdm06OnN5czo6aGFzRGlzYXNzZW1ibGVyKCkKK3sKKyNpZiBkZWZpbmVkIChfX2kzODZfXykgfHwgZGVmaW5lZCAoX19hbWQ2NF9fKSB8fCBkZWZpbmVkIChfX3g4Nl82NF9fKQorICAvLyBXZSBoYXZlIG9wdGlvbiB0byBlbmFibGUgdWRpczg2IGxpYnJhcnkuCisjIGlmIFVTRV9VRElTODYKKyAgcmV0dXJuIHRydWU7CisjZWxzZQorICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyNlbHNlCisgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitzdGQ6OnN0cmluZyBsbHZtOjpzeXM6OmRpc2Fzc2VtYmxlQnVmZmVyKHVpbnQ4X3QqIHN0YXJ0LCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwYykgeworICBzdGQ6OnN0cmluZ3N0cmVhbSByZXM7CisKKyNpZiAoZGVmaW5lZCAoX19pMzg2X18pIHx8IGRlZmluZWQgKF9fYW1kNjRfXykgfHwgZGVmaW5lZCAoX194ODZfNjRfXykpIFwKKyAgJiYgVVNFX1VESVM4NgorICB1bnNpZ25lZCBiaXRzOworIyBpZiBkZWZpbmVkKF9faTM4Nl9fKQorICBiaXRzID0gMzI7CisjIGVsc2UKKyAgYml0cyA9IDY0OworIyBlbmRpZgorCisgIHVkX3QgdWRfb2JqOworCisgIHVkX2luaXQoJnVkX29iaik7CisgIHVkX3NldF9pbnB1dF9idWZmZXIoJnVkX29iaiwgc3RhcnQsIGxlbmd0aCk7CisgIHVkX3NldF9tb2RlKCZ1ZF9vYmosIGJpdHMpOworICB1ZF9zZXRfcGMoJnVkX29iaiwgcGMpOworICB1ZF9zZXRfc3ludGF4KCZ1ZF9vYmosIFVEX1NZTl9BVFQpOworCisgIHJlcyA8PCBzdGQ6OnNldGJhc2UoMTYpCisgICAgICA8PCBzdGQ6OnNldHcoYml0cy80KTsKKworICB3aGlsZSAodWRfZGlzYXNzZW1ibGUoJnVkX29iaikpIHsKKyAgICByZXMgPDwgdWRfaW5zbl9vZmYoJnVkX29iaikgPDwgIjpcdCIgPDwgdWRfaW5zbl9hc20oJnVkX29iaikgPDwgIlxuIjsKKyAgfQorI2Vsc2UKKyAgcmVzIDw8ICJObyBkaXNhc3NlbWJsZXIgYXZhaWxhYmxlLiBTZWUgY29uZmlndXJlIGhlbHAgZm9yIG9wdGlvbnMuXG4iOworI2VuZGlmCisKKyAgcmV0dXJuIHJlcy5zdHIoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vRHluYW1pY0xpYnJhcnkuY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9EeW5hbWljTGlicmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2ODkwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vRHluYW1pY0xpYnJhcnkuY3BwCkBAIC0wLDAgKzEsMTU1IEBACisvLz09PS0tIER5bmFtaWNMaWJyYXJ5LmNwcCAtIFJ1bnRpbWUgbGluay9sb2FkIGxpYnJhcmllcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGhlYWRlciBmaWxlIGltcGxlbWVudHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gRHluYW1pY0xpYnJhcnkgY29uY2VwdC4KKy8vCisvLyBGSVhNRTogVGhpcyBmaWxlIGxlYWtzIHRoZSBFeHBsaWNpdFN5bWJvbHMgYW5kIE9wZW5lZEhhbmRsZXMgdmVjdG9yLCBhbmQgaXMKKy8vIG5vdCB0aHJlYWQgc2FmZSEKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRHluYW1pY0xpYnJhcnkuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBDb2xsZWN0aW9uIG9mIHN5bWJvbCBuYW1lL3ZhbHVlIHBhaXJzIHRvIGJlIHNlYXJjaGVkIHByaW9yIHRvIGFueSBsaWJyYXJpZXMuCitzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHZvaWQqPiAqRXhwbGljaXRTeW1ib2xzID0gMDsKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEV4cGxpY2l0U3ltYm9sc0RlbGV0ZXIgeworICB+RXhwbGljaXRTeW1ib2xzRGVsZXRlcigpIHsKKyAgICBpZiAoRXhwbGljaXRTeW1ib2xzKQorICAgICAgZGVsZXRlIEV4cGxpY2l0U3ltYm9sczsKKyAgfQorfTsKKworfQorCitzdGF0aWMgRXhwbGljaXRTeW1ib2xzRGVsZXRlciBEdW1teTsKKwordm9pZCBsbHZtOjpzeXM6OkR5bmFtaWNMaWJyYXJ5OjpBZGRTeW1ib2woY29uc3QgY2hhciogc3ltYm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnN5bWJvbFZhbHVlKSB7CisgIGlmIChFeHBsaWNpdFN5bWJvbHMgPT0gMCkKKyAgICBFeHBsaWNpdFN5bWJvbHMgPSBuZXcgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHZvaWQqPigpOworICAoKkV4cGxpY2l0U3ltYm9scylbc3ltYm9sTmFtZV0gPSBzeW1ib2xWYWx1ZTsKK30KKworI2lmZGVmIExMVk1fT05fV0lOMzIKKworI2luY2x1ZGUgIldpbjMyL0R5bmFtaWNMaWJyYXJ5LmluYyIKKworI2Vsc2UKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOjpzeXM7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLz09PSBXQVJOSU5HOiBJbXBsZW1lbnRhdGlvbiBoZXJlIG11c3QgY29udGFpbiBvbmx5IFRSVUxZIG9wZXJhdGluZyBzeXN0ZW0KKy8vPT09ICAgICAgICAgIGluZGVwZW5kZW50IGNvZGUuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitzdGF0aWMgc3RkOjp2ZWN0b3I8dm9pZCAqPiAqT3BlbmVkSGFuZGxlcyA9IDA7CisKKworYm9vbCBEeW5hbWljTGlicmFyeTo6TG9hZExpYnJhcnlQZXJtYW5lbnRseShjb25zdCBjaGFyICpGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZykgeworICB2b2lkICpIID0gZGxvcGVuKEZpbGVuYW1lLCBSVExEX0xBWll8UlRMRF9HTE9CQUwpOworICBpZiAoSCA9PSAwKSB7CisgICAgaWYgKEVyck1zZykgKkVyck1zZyA9IGRsZXJyb3IoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoT3BlbmVkSGFuZGxlcyA9PSAwKQorICAgIE9wZW5lZEhhbmRsZXMgPSBuZXcgc3RkOjp2ZWN0b3I8dm9pZCAqPigpOworICBPcGVuZWRIYW5kbGVzLT5wdXNoX2JhY2soSCk7CisgIHJldHVybiBmYWxzZTsKK30KKyNlbHNlCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIGxsdm06OnN5czsKKworYm9vbCBEeW5hbWljTGlicmFyeTo6TG9hZExpYnJhcnlQZXJtYW5lbnRseShjb25zdCBjaGFyICpGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZykgeworICBpZiAoRXJyTXNnKSAqRXJyTXNnID0gImRsb3BlbigpIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSI7CisgIHJldHVybiB0cnVlOworfQorI2VuZGlmCisKK25hbWVzcGFjZSBsbHZtIHsKK3ZvaWQgKlNlYXJjaEZvckFkZHJlc3NPZlNwZWNpYWxTeW1ib2woY29uc3QgY2hhciogc3ltYm9sTmFtZSk7Cit9CisKK3ZvaWQqIER5bmFtaWNMaWJyYXJ5OjpTZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woY29uc3QgY2hhciogc3ltYm9sTmFtZSkgeworICAvLyBGaXJzdCBjaGVjayBzeW1ib2xzIGFkZGVkIHZpYSBBZGRTeW1ib2woKS4KKyAgaWYgKEV4cGxpY2l0U3ltYm9scykgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB2b2lkICo+OjppdGVyYXRvciBJID0KKyAgICAgIEV4cGxpY2l0U3ltYm9scy0+ZmluZChzeW1ib2xOYW1lKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdm9pZCAqPjo6aXRlcmF0b3IgRSA9IEV4cGxpY2l0U3ltYm9scy0+ZW5kKCk7CisgIAorICAgIGlmIChJICE9IEUpCisgICAgICByZXR1cm4gSS0+c2Vjb25kOworICB9CisKKyNpZiBIQVZFX0RMRkNOX0gKKyAgLy8gTm93IHNlYXJjaCB0aGUgbGlicmFyaWVzLgorICBpZiAoT3BlbmVkSGFuZGxlcykgeworICAgIGZvciAoc3RkOjp2ZWN0b3I8dm9pZCAqPjo6aXRlcmF0b3IgSSA9IE9wZW5lZEhhbmRsZXMtPmJlZ2luKCksCisgICAgICAgICBFID0gT3BlbmVkSGFuZGxlcy0+ZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAvL2x0X3B0ciBwdHIgPSBsdF9kbHN5bSgqSSwgc3ltYm9sTmFtZSk7CisgICAgICB2b2lkICpwdHIgPSBkbHN5bSgqSSwgc3ltYm9sTmFtZSk7CisgICAgICBpZiAocHRyKSB7CisgICAgICAgIHJldHVybiBwdHI7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKworICBpZiAodm9pZCAqUmVzdWx0ID0gbGx2bTo6U2VhcmNoRm9yQWRkcmVzc09mU3BlY2lhbFN5bWJvbChzeW1ib2xOYW1lKSkKKyAgICByZXR1cm4gUmVzdWx0OworCisvLyBUaGlzIG1hY3JvIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgYSB3ZWxsLWtub3duLCBleHBsaWNpdCBzeW1ib2wKKyNkZWZpbmUgRVhQTElDSVRfU1lNQk9MKFNZTSkgXAorICAgaWYgKCFzdHJjbXAoc3ltYm9sTmFtZSwgI1NZTSkpIHJldHVybiAmU1lNCisKKy8vIE9uIGxpbnV4IHdlIGhhdmUgYSB3ZWlyZCBzaXR1YXRpb24uIFRoZSBzdGRlcnIvb3V0L2luIHN5bWJvbHMgYXJlIGJvdGgKKy8vIG1hY3JvcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBiZWNhdXNlIG9mIHN0YW5kYXJkcyByZXF1aXJlbWVudHMuIFNvLCB3ZSAKKy8vIGJvbGRseSB1c2UgdGhlIEVYUExJQ0lUX1NZTUJPTCBtYWNybyB3aXRob3V0IGNoZWNraW5nIGZvciBhICNkZWZpbmUgZmlyc3QuCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgIHsKKyAgICBFWFBMSUNJVF9TWU1CT0woc3RkZXJyKTsKKyAgICBFWFBMSUNJVF9TWU1CT0woc3Rkb3V0KTsKKyAgICBFWFBMSUNJVF9TWU1CT0woc3RkaW4pOworICB9CisjZWxzZQorICAvLyBGb3IgZXZlcnl0aGluZyBlbHNlLCB3ZSB3YW50IHRvIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3ltYm9sIGlzbid0IGRlZmluZWQKKyAgLy8gYXMgYSBtYWNybyBiZWZvcmUgdXNpbmcgRVhQTElDSVRfU1lNQk9MLgorICB7CisjaWZuZGVmIHN0ZGluCisgICAgRVhQTElDSVRfU1lNQk9MKHN0ZGluKTsKKyNlbmRpZgorI2lmbmRlZiBzdGRvdXQKKyAgICBFWFBMSUNJVF9TWU1CT0woc3Rkb3V0KTsKKyNlbmRpZgorI2lmbmRlZiBzdGRlcnIKKyAgICBFWFBMSUNJVF9TWU1CT0woc3RkZXJyKTsKKyNlbmRpZgorICB9CisjZW5kaWYKKyN1bmRlZiBFWFBMSUNJVF9TWU1CT0wKKworICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8vIExMVk1fT05fV0lOMzIKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vRXJybm8uY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9FcnJuby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmNjZmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vRXJybm8uY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LSBFcnJuby5jcHAgLSBlcnJubyBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGVycm5vIHdyYXBwZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9FcnJuby5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIiAgICAgLy8gR2V0IGF1dG9jb25mIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKKworI2lmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgVFJVTFkgb3BlcmF0aW5nIHN5c3RlbQorLy89PT0gICAgICAgICAgaW5kZXBlbmRlbnQgY29kZS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisjaWYgSEFWRV9FUlJOT19ICitzdGQ6OnN0cmluZyBTdHJFcnJvcigpIHsKKyAgcmV0dXJuIFN0ckVycm9yKGVycm5vKTsKK30KKyNlbmRpZiAgLy8gSEFWRV9FUlJOT19ICisKK3N0ZDo6c3RyaW5nIFN0ckVycm9yKGludCBlcnJudW0pIHsKKyAgY29uc3QgaW50IE1heEVyclN0ckxlbiA9IDIwMDA7CisgIGNoYXIgYnVmZmVyW01heEVyclN0ckxlbl07CisgIGJ1ZmZlclswXSA9ICdcMCc7CisgIGNoYXIqIHN0ciA9IGJ1ZmZlcjsKKyNpZmRlZiBIQVZFX1NUUkVSUk9SX1IKKyAgLy8gc3RyZXJyb3JfciBpcyB0aHJlYWQtc2FmZS4KKyAgaWYgKGVycm51bSkKKyMgaWYgZGVmaW5lZChfX0dMSUJDX18pICYmIGRlZmluZWQoX0dOVV9TT1VSQ0UpCisgICAgLy8gZ2xpYmMgZGVmaW5lcyBpdHMgb3duIGluY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IKKyAgICAvLyB3aGljaCBtYXkgbm90IHVzZSB0aGUgYnVmZmVyIHN1cHBsaWVkLgorICAgIHN0ciA9IHN0cmVycm9yX3IoZXJybnVtLGJ1ZmZlcixNYXhFcnJTdHJMZW4tMSk7CisjIGVsc2UKKyAgICBzdHJlcnJvcl9yKGVycm51bSxidWZmZXIsTWF4RXJyU3RyTGVuLTEpOworIyBlbmRpZgorI2VsaWYgZGVmaW5lZChIQVZFX1NUUkVSUk9SX1MpICAvLyBXaW5kb3dzLgorICAgIGlmIChlcnJudW0pCisgICAgICBzdHJlcnJvcl9zKGJ1ZmZlciwgZXJybnVtKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9TVFJFUlJPUikKKyAgLy8gQ29weSB0aGUgdGhyZWFkIHVuLXNhZmUgcmVzdWx0IG9mIHN0cmVycm9yIGludG8KKyAgLy8gdGhlIGJ1ZmZlciBhcyBmYXN0IGFzIHBvc3NpYmxlIHRvIG1pbmltaXplIGltcGFjdAorICAvLyBvZiBjb2xsaXNpb24gb2Ygc3RyZXJyb3IgaW4gbXVsdGlwbGUgdGhyZWFkcy4KKyAgaWYgKGVycm51bSkKKyAgICBzdHJuY3B5KGJ1ZmZlcixzdHJlcnJvcihlcnJudW0pLE1heEVyclN0ckxlbi0xKTsKKyAgYnVmZmVyW01heEVyclN0ckxlbi0xXSA9ICdcMCc7CisjZWxzZQorICAvLyBTdHJhbmdlIHRoYXQgdGhpcyBzeXN0ZW0gZG9lc24ndCBldmVuIGhhdmUgc3RyZXJyb3IKKyAgLy8gYnV0LCBvaCB3ZWxsLCBqdXN0IHVzZSBhIGdlbmVyaWMgbWVzc2FnZQorICBzcHJpbnRmKGJ1ZmZlciwgIkVycm9yICMlZCIsIGVycm51bSk7CisjZW5kaWYKKyAgcmV0dXJuIHN0cjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN5cworfSAgLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmICAvLyBIQVZFX1NUUklOR19ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL0hvc3QuY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9Ib3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzE5M2RiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9Ib3N0LmNwcApAQCAtMCwwICsxLDMwNSBAQAorLy89PT0tLSBIb3N0LmNwcCAtIEltcGxlbWVudCBPUyBIb3N0IENvbmNlcHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBoZWFkZXIgZmlsZSBpbXBsZW1lbnRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIEhvc3QgY29uY2VwdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vSG9zdC5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBJbmNsdWRlIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXJ0cyBvZiB0aGlzIGNsYXNzLgorI2lmZGVmIExMVk1fT05fVU5JWAorI2luY2x1ZGUgIlVuaXgvSG9zdC5pbmMiCisjZW5kaWYKKyNpZmRlZiBMTFZNX09OX1dJTjMyCisjaW5jbHVkZSAiV2luMzIvSG9zdC5pbmMiCisjZW5kaWYKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGludHJpbi5oPgorI2VuZGlmCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgQ1BVIGRldGVjdGlvbiByb3V0aW5lcworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisjaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2X18pIHx8IGRlZmluZWQoX01fSVg4NilcCisgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9NX0FNRDY0KSB8fCBkZWZpbmVkIChfTV9YNjQpCisKKy8vLyBHZXRYODZDcHVJREFuZEluZm8gLSBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY3B1aWQgYW5kIHJldHVybiB0aGUgNCB2YWx1ZXMgaW4gdGhlCisvLy8gc3BlY2lmaWVkIGFyZ3VtZW50cy4gIElmIHdlIGNhbid0IHJ1biBjcHVpZCBvbiB0aGUgaG9zdCwgcmV0dXJuIHRydWUuCitzdGF0aWMgYm9vbCBHZXRYODZDcHVJREFuZEluZm8odW5zaWduZWQgdmFsdWUsIHVuc2lnbmVkICpyRUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpyRUJYLCB1bnNpZ25lZCAqckVDWCwgdW5zaWduZWQgKnJFRFgpIHsKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQgKF9NX1g2NCkKKyAgI2lmIGRlZmluZWQoX19HTlVDX18pCisgICAgLy8gZ2NjIGRvZXNuJ3Qga25vdyBjcHVpZCB3b3VsZCBjbG9iYmVyIGVieC9yYnguIFByZXNldmUgaXQgbWFudWFsbHkuCisgICAgYXNtICgibW92cVx0JSVyYngsICUlcnNpXG5cdCIKKyAgICAgICAgICJjcHVpZFxuXHQiCisgICAgICAgICAieGNoZ3FcdCUlcmJ4LCAlJXJzaVxuXHQiCisgICAgICAgICA6ICI9YSIgKCpyRUFYKSwKKyAgICAgICAgICAgIj1TIiAoKnJFQlgpLAorICAgICAgICAgICAiPWMiICgqckVDWCksCisgICAgICAgICAgICI9ZCIgKCpyRURYKQorICAgICAgICAgOiAgImEiICh2YWx1ZSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBpbnQgcmVnaXN0ZXJzWzRdOworICAgIF9fY3B1aWQocmVnaXN0ZXJzLCB2YWx1ZSk7CisgICAgKnJFQVggPSByZWdpc3RlcnNbMF07CisgICAgKnJFQlggPSByZWdpc3RlcnNbMV07CisgICAgKnJFQ1ggPSByZWdpc3RlcnNbMl07CisgICAgKnJFRFggPSByZWdpc3RlcnNbM107CisgICAgcmV0dXJuIGZhbHNlOworICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpCisgICNpZiBkZWZpbmVkKF9fR05VQ19fKQorICAgIGFzbSAoIm1vdmxcdCUlZWJ4LCAlJWVzaVxuXHQiCisgICAgICAgICAiY3B1aWRcblx0IgorICAgICAgICAgInhjaGdsXHQlJWVieCwgJSVlc2lcblx0IgorICAgICAgICAgOiAiPWEiICgqckVBWCksCisgICAgICAgICAgICI9UyIgKCpyRUJYKSwKKyAgICAgICAgICAgIj1jIiAoKnJFQ1gpLAorICAgICAgICAgICAiPWQiICgqckVEWCkKKyAgICAgICAgIDogICJhIiAodmFsdWUpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgX19hc20geworICAgICAgbW92ICAgZWF4LHZhbHVlCisgICAgICBjcHVpZAorICAgICAgbW92ICAgZXNpLHJFQVgKKyAgICAgIG1vdiAgIGR3b3JkIHB0ciBbZXNpXSxlYXgKKyAgICAgIG1vdiAgIGVzaSxyRUJYCisgICAgICBtb3YgICBkd29yZCBwdHIgW2VzaV0sZWJ4CisgICAgICBtb3YgICBlc2ksckVDWAorICAgICAgbW92ICAgZHdvcmQgcHRyIFtlc2ldLGVjeAorICAgICAgbW92ICAgZXNpLHJFRFgKKyAgICAgIG1vdiAgIGR3b3JkIHB0ciBbZXNpXSxlZHgKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICAjZW5kaWYKKyNlbmRpZgorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgRGV0ZWN0WDg2RmFtaWx5TW9kZWwodW5zaWduZWQgRUFYLCB1bnNpZ25lZCAmRmFtaWx5LCB1bnNpZ25lZCAmTW9kZWwpIHsKKyAgRmFtaWx5ID0gKEVBWCA+PiA4KSAmIDB4ZjsgLy8gQml0cyA4IC0gMTEKKyAgTW9kZWwgID0gKEVBWCA+PiA0KSAmIDB4ZjsgLy8gQml0cyA0IC0gNworICBpZiAoRmFtaWx5ID09IDYgfHwgRmFtaWx5ID09IDB4ZikgeworICAgIGlmIChGYW1pbHkgPT0gMHhmKQorICAgICAgLy8gRXhhbWluZSBleHRlbmRlZCBmYW1pbHkgSUQgaWYgZmFtaWx5IElEIGlzIEYuCisgICAgICBGYW1pbHkgKz0gKEVBWCA+PiAyMCkgJiAweGZmOyAgICAvLyBCaXRzIDIwIC0gMjcKKyAgICAvLyBFeGFtaW5lIGV4dGVuZGVkIG1vZGVsIElEIGlmIGZhbWlseSBJRCBpcyA2IG9yIEYuCisgICAgTW9kZWwgKz0gKChFQVggPj4gMTYpICYgMHhmKSA8PCA0OyAvLyBCaXRzIDE2IC0gMTkKKyAgfQorfQorCitzdGQ6OnN0cmluZyBzeXM6OmdldEhvc3RDUFVOYW1lKCkgeworICB1bnNpZ25lZCBFQVggPSAwLCBFQlggPSAwLCBFQ1ggPSAwLCBFRFggPSAwOworICBpZiAoR2V0WDg2Q3B1SURBbmRJbmZvKDB4MSwgJkVBWCwgJkVCWCwgJkVDWCwgJkVEWCkpCisgICAgcmV0dXJuICJnZW5lcmljIjsKKyAgdW5zaWduZWQgRmFtaWx5ID0gMDsKKyAgdW5zaWduZWQgTW9kZWwgID0gMDsKKyAgRGV0ZWN0WDg2RmFtaWx5TW9kZWwoRUFYLCBGYW1pbHksIE1vZGVsKTsKKworICBHZXRYODZDcHVJREFuZEluZm8oMHg4MDAwMDAwMSwgJkVBWCwgJkVCWCwgJkVDWCwgJkVEWCk7CisgIGJvb2wgRW02NFQgPSAoRURYID4+IDI5KSAmIDB4MTsKKyAgYm9vbCBIYXNTU0UzID0gKEVDWCAmIDB4MSk7CisKKyAgdW5pb24geworICAgIHVuc2lnbmVkIHVbM107CisgICAgY2hhciAgICAgY1sxMl07CisgIH0gdGV4dDsKKworICBHZXRYODZDcHVJREFuZEluZm8oMCwgJkVBWCwgdGV4dC51KzAsIHRleHQudSsyLCB0ZXh0LnUrMSk7CisgIGlmIChtZW1jbXAodGV4dC5jLCAiR2VudWluZUludGVsIiwgMTIpID09IDApIHsKKyAgICBzd2l0Y2ggKEZhbWlseSkgeworICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiAiaTM4NiI7CisgICAgY2FzZSA0OgorICAgICAgc3dpdGNoIChNb2RlbCkgeworICAgICAgY2FzZSAwOiAvLyBJbnRlbDQ4NlRNIERYIHByb2Nlc3NvcnMKKyAgICAgIGNhc2UgMTogLy8gSW50ZWw0ODZUTSBEWCBwcm9jZXNzb3JzCisgICAgICBjYXNlIDI6IC8vIEludGVsNDg2IFNYIHByb2Nlc3NvcnMKKyAgICAgIGNhc2UgMzogLy8gSW50ZWw0ODdUTSBwcm9jZXNzb3JzLCBJbnRlbERYMiBPdmVyRHJpdmXCriBwcm9jZXNzb3JzLAorICAgICAgICAgICAgICAvLyBJbnRlbERYMlRNIHByb2Nlc3NvcnMKKyAgICAgIGNhc2UgNDogLy8gSW50ZWw0ODYgU0wgcHJvY2Vzc29yCisgICAgICBjYXNlIDU6IC8vIEludGVsU1gyVE0gcHJvY2Vzc29ycworICAgICAgY2FzZSA3OiAvLyBXcml0ZS1CYWNrIEVuaGFuY2VkIEludGVsRFgyIHByb2Nlc3NvcnMKKyAgICAgIGNhc2UgODogLy8gSW50ZWxEWDQgT3ZlckRyaXZlIHByb2Nlc3NvcnMsIEludGVsRFg0VE0gcHJvY2Vzc29ycworICAgICAgZGVmYXVsdDogcmV0dXJuICJpNDg2IjsKKyAgICAgIH0KKyAgICBjYXNlIDU6CisgICAgICBzd2l0Y2ggKE1vZGVsKSB7CisgICAgICBjYXNlICAxOiAvLyBQZW50aXVtIE92ZXJEcml2ZSBwcm9jZXNzb3IgZm9yIFBlbnRpdW0gcHJvY2Vzc29yICg2MCwgNjYpLAorICAgICAgICAgICAgICAgLy8gUGVudGl1bcKuIHByb2Nlc3NvcnMgKDYwLCA2NikKKyAgICAgIGNhc2UgIDI6IC8vIFBlbnRpdW0gT3ZlckRyaXZlIHByb2Nlc3NvciBmb3IgUGVudGl1bSBwcm9jZXNzb3IgKDc1LCA5MCwKKyAgICAgICAgICAgICAgIC8vIDEwMCwgMTIwLCAxMzMpLCBQZW50aXVtIHByb2Nlc3NvcnMgKDc1LCA5MCwgMTAwLCAxMjAsIDEzMywKKyAgICAgICAgICAgICAgIC8vIDE1MCwgMTY2LCAyMDApCisgICAgICBjYXNlICAzOiAvLyBQZW50aXVtIE92ZXJEcml2ZSBwcm9jZXNzb3JzIGZvciBJbnRlbDQ4NiBwcm9jZXNzb3ItYmFzZWQKKyAgICAgICAgICAgICAgIC8vIHN5c3RlbXMKKyAgICAgICAgcmV0dXJuICJwZW50aXVtIjsKKworICAgICAgY2FzZSAgNDogLy8gUGVudGl1bSBPdmVyRHJpdmUgcHJvY2Vzc29yIHdpdGggTU1YVE0gdGVjaG5vbG9neSBmb3IgUGVudGl1bQorICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yICg3NSwgOTAsIDEwMCwgMTIwLCAxMzMpLCBQZW50aXVtIHByb2Nlc3NvciB3aXRoCisgICAgICAgICAgICAgICAvLyBNTVhUTSB0ZWNobm9sb2d5ICgxNjYsIDIwMCkKKyAgICAgICAgcmV0dXJuICJwZW50aXVtLW1teCI7CisKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAicGVudGl1bSI7CisgICAgICB9CisgICAgY2FzZSA2OgorICAgICAgc3dpdGNoIChNb2RlbCkgeworICAgICAgY2FzZSAgMTogLy8gUGVudGl1bSBQcm8gcHJvY2Vzc29yCisgICAgICAgIHJldHVybiAicGVudGl1bXBybyI7CisKKyAgICAgIGNhc2UgIDM6IC8vIEludGVsIFBlbnRpdW0gSUkgT3ZlckRyaXZlIHByb2Nlc3NvciwgUGVudGl1bSBJSSBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAvLyBtb2RlbCAwMworICAgICAgY2FzZSAgNTogLy8gUGVudGl1bSBJSSBwcm9jZXNzb3IsIG1vZGVsIDA1LCBQZW50aXVtIElJIFhlb24gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgLy8gbW9kZWwgMDUsIGFuZCBJbnRlbMKuIENlbGVyb27CriBwcm9jZXNzb3IsIG1vZGVsIDA1CisgICAgICBjYXNlICA2OiAvLyBDZWxlcm9uIHByb2Nlc3NvciwgbW9kZWwgMDYKKyAgICAgICAgcmV0dXJuICJwZW50aXVtMiI7CisKKyAgICAgIGNhc2UgIDc6IC8vIFBlbnRpdW0gSUlJIHByb2Nlc3NvciwgbW9kZWwgMDcsIGFuZCBQZW50aXVtIElJSSBYZW9uCisgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3IsIG1vZGVsIDA3CisgICAgICBjYXNlICA4OiAvLyBQZW50aXVtIElJSSBwcm9jZXNzb3IsIG1vZGVsIDA4LCBQZW50aXVtIElJSSBYZW9uIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgIC8vIG1vZGVsIDA4LCBhbmQgQ2VsZXJvbiBwcm9jZXNzb3IsIG1vZGVsIDA4CisgICAgICBjYXNlIDEwOiAvLyBQZW50aXVtIElJSSBYZW9uIHByb2Nlc3NvciwgbW9kZWwgMEFoCisgICAgICBjYXNlIDExOiAvLyBQZW50aXVtIElJSSBwcm9jZXNzb3IsIG1vZGVsIDBCaAorICAgICAgICByZXR1cm4gInBlbnRpdW0zIjsKKworICAgICAgY2FzZSAgOTogLy8gSW50ZWwgUGVudGl1bSBNIHByb2Nlc3NvciwgSW50ZWwgQ2VsZXJvbiBNIHByb2Nlc3NvciBtb2RlbCAwOS4KKyAgICAgIGNhc2UgMTM6IC8vIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3IsIEludGVsIENlbGVyb24gTSBwcm9jZXNzb3IsIG1vZGVsCisgICAgICAgICAgICAgICAvLyAwRGguIEFsbCBwcm9jZXNzb3JzIGFyZSBtYW51ZmFjdHVyZWQgdXNpbmcgdGhlIDkwIG5tIHByb2Nlc3MuCisgICAgICAgIHJldHVybiAicGVudGl1bS1tIjsKKworICAgICAgY2FzZSAxNDogLy8gSW50ZWwgQ29yZVRNIER1byBwcm9jZXNzb3IsIEludGVsIENvcmVUTSBTb2xvIHByb2Nlc3NvciwgbW9kZWwKKyAgICAgICAgICAgICAgIC8vIDBFaC4gQWxsIHByb2Nlc3NvcnMgYXJlIG1hbnVmYWN0dXJlZCB1c2luZyB0aGUgNjUgbm0gcHJvY2Vzcy4KKyAgICAgICAgcmV0dXJuICJ5b25haCI7CisKKyAgICAgIGNhc2UgMTU6IC8vIEludGVsIENvcmVUTTIgRHVvIHByb2Nlc3NvciwgSW50ZWwgQ29yZVRNMiBEdW8gbW9iaWxlCisgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3IsIEludGVsIENvcmVUTTIgUXVhZCBwcm9jZXNzb3IsIEludGVsIENvcmVUTTIgUXVhZAorICAgICAgICAgICAgICAgLy8gbW9iaWxlIHByb2Nlc3NvciwgSW50ZWwgQ29yZVRNMiBFeHRyZW1lIHByb2Nlc3NvciwgSW50ZWwKKyAgICAgICAgICAgICAgIC8vIFBlbnRpdW0gRHVhbC1Db3JlIHByb2Nlc3NvciwgSW50ZWwgWGVvbiBwcm9jZXNzb3IsIG1vZGVsCisgICAgICAgICAgICAgICAvLyAwRmguIEFsbCBwcm9jZXNzb3JzIGFyZSBtYW51ZmFjdHVyZWQgdXNpbmcgdGhlIDY1IG5tIHByb2Nlc3MuCisgICAgICBjYXNlIDIyOiAvLyBJbnRlbCBDZWxlcm9uIHByb2Nlc3NvciBtb2RlbCAxNmguIEFsbCBwcm9jZXNzb3JzIGFyZQorICAgICAgICAgICAgICAgLy8gbWFudWZhY3R1cmVkIHVzaW5nIHRoZSA2NSBubSBwcm9jZXNzCisgICAgICAgIHJldHVybiAiY29yZTIiOworCisgICAgICBjYXNlIDIxOiAvLyBJbnRlbCBFUDgwNTc5IEludGVncmF0ZWQgUHJvY2Vzc29yIGFuZCBJbnRlbCBFUDgwNTc5CisgICAgICAgICAgICAgICAvLyBJbnRlZ3JhdGVkIFByb2Nlc3NvciB3aXRoIEludGVsIFF1aWNrQXNzaXN0IFRlY2hub2xvZ3kKKyAgICAgICAgcmV0dXJuICJpNjg2IjsgLy8gRklYTUU6ID8/PworCisgICAgICBjYXNlIDIzOiAvLyBJbnRlbCBDb3JlVE0yIEV4dHJlbWUgcHJvY2Vzc29yLCBJbnRlbCBYZW9uIHByb2Nlc3NvciwgbW9kZWwKKyAgICAgICAgICAgICAgIC8vIDE3aC4gQWxsIHByb2Nlc3NvcnMgYXJlIG1hbnVmYWN0dXJlZCB1c2luZyB0aGUgNDUgbm0gcHJvY2Vzcy4KKyAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAvLyA0NW5tOiBQZW5yeW4gLCBXb2xmZGFsZSwgWW9ya2ZpZWxkIChYRSkKKyAgICAgICAgcmV0dXJuICJwZW5yeW4iOworCisgICAgICBjYXNlIDI2OiAvLyBJbnRlbCBDb3JlIGk3IHByb2Nlc3NvciBhbmQgSW50ZWwgWGVvbiBwcm9jZXNzb3IuIEFsbAorICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29ycyBhcmUgbWFudWZhY3R1cmVkIHVzaW5nIHRoZSA0NSBubSBwcm9jZXNzLgorICAgICAgY2FzZSAyOTogLy8gSW50ZWwgWGVvbiBwcm9jZXNzb3IgTVAuIEFsbCBwcm9jZXNzb3JzIGFyZSBtYW51ZmFjdHVyZWQgdXNpbmcKKyAgICAgICAgICAgICAgIC8vIHRoZSA0NSBubSBwcm9jZXNzLgorICAgICAgICByZXR1cm4gImNvcmVpNyI7CisKKyAgICAgIGNhc2UgMjg6IC8vIEludGVsIEF0b20gcHJvY2Vzc29yLiBBbGwgcHJvY2Vzc29ycyBhcmUgbWFudWZhY3R1cmVkIHVzaW5nCisgICAgICAgICAgICAgICAvLyB0aGUgNDUgbm0gcHJvY2VzcworICAgICAgICByZXR1cm4gImF0b20iOworCisgICAgICBkZWZhdWx0OiByZXR1cm4gImk2ODYiOworICAgICAgfQorICAgIGNhc2UgMTU6IHsKKyAgICAgIHN3aXRjaCAoTW9kZWwpIHsKKyAgICAgIGNhc2UgIDA6IC8vIFBlbnRpdW0gNCBwcm9jZXNzb3IsIEludGVsIFhlb24gcHJvY2Vzc29yLiBBbGwgcHJvY2Vzc29ycyBhcmUKKyAgICAgICAgICAgICAgIC8vIG1vZGVsIDAwaCBhbmQgbWFudWZhY3R1cmVkIHVzaW5nIHRoZSAwLjE4IG1pY3JvbiBwcm9jZXNzLgorICAgICAgY2FzZSAgMTogLy8gUGVudGl1bSA0IHByb2Nlc3NvciwgSW50ZWwgWGVvbiBwcm9jZXNzb3IsIEludGVsIFhlb24KKyAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciBNUCwgYW5kIEludGVsIENlbGVyb24gcHJvY2Vzc29yLiBBbGwgcHJvY2Vzc29ycyBhcmUKKyAgICAgICAgICAgICAgIC8vIG1vZGVsIDAxaCBhbmQgbWFudWZhY3R1cmVkIHVzaW5nIHRoZSAwLjE4IG1pY3JvbiBwcm9jZXNzLgorICAgICAgY2FzZSAgMjogLy8gUGVudGl1bSA0IHByb2Nlc3NvciwgTW9iaWxlIEludGVsIFBlbnRpdW0gNCBwcm9jZXNzb3Ig4oCTIE0sCisgICAgICAgICAgICAgICAvLyBJbnRlbCBYZW9uIHByb2Nlc3NvciwgSW50ZWwgWGVvbiBwcm9jZXNzb3IgTVAsIEludGVsIENlbGVyb24KKyAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciwgYW5kIE1vYmlsZSBJbnRlbCBDZWxlcm9uIHByb2Nlc3Nvci4gQWxsIHByb2Nlc3NvcnMKKyAgICAgICAgICAgICAgIC8vIGFyZSBtb2RlbCAwMmggYW5kIG1hbnVmYWN0dXJlZCB1c2luZyB0aGUgMC4xMyBtaWNyb24gcHJvY2Vzcy4KKyAgICAgICAgcmV0dXJuIChFbTY0VCkgPyAieDg2LTY0IiA6ICJwZW50aXVtNCI7CisKKyAgICAgIGNhc2UgIDM6IC8vIFBlbnRpdW0gNCBwcm9jZXNzb3IsIEludGVsIFhlb24gcHJvY2Vzc29yLCBJbnRlbCBDZWxlcm9uIEQKKyAgICAgICAgICAgICAgIC8vIHByb2Nlc3Nvci4gQWxsIHByb2Nlc3NvcnMgYXJlIG1vZGVsIDAzaCBhbmQgbWFudWZhY3R1cmVkIHVzaW5nCisgICAgICAgICAgICAgICAvLyB0aGUgOTAgbm0gcHJvY2Vzcy4KKyAgICAgIGNhc2UgIDQ6IC8vIFBlbnRpdW0gNCBwcm9jZXNzb3IsIFBlbnRpdW0gNCBwcm9jZXNzb3IgRXh0cmVtZSBFZGl0aW9uLAorICAgICAgICAgICAgICAgLy8gUGVudGl1bSBEIHByb2Nlc3NvciwgSW50ZWwgWGVvbiBwcm9jZXNzb3IsIEludGVsIFhlb24KKyAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciBNUCwgSW50ZWwgQ2VsZXJvbiBEIHByb2Nlc3Nvci4gQWxsIHByb2Nlc3NvcnMgYXJlCisgICAgICAgICAgICAgICAvLyBtb2RlbCAwNGggYW5kIG1hbnVmYWN0dXJlZCB1c2luZyB0aGUgOTAgbm0gcHJvY2Vzcy4KKyAgICAgIGNhc2UgIDY6IC8vIFBlbnRpdW0gNCBwcm9jZXNzb3IsIFBlbnRpdW0gRCBwcm9jZXNzb3IsIFBlbnRpdW0gcHJvY2Vzc29yCisgICAgICAgICAgICAgICAvLyBFeHRyZW1lIEVkaXRpb24sIEludGVsIFhlb24gcHJvY2Vzc29yLCBJbnRlbCBYZW9uIHByb2Nlc3NvcgorICAgICAgICAgICAgICAgLy8gTVAsIEludGVsIENlbGVyb24gRCBwcm9jZXNzb3IuIEFsbCBwcm9jZXNzb3JzIGFyZSBtb2RlbCAwNmgKKyAgICAgICAgICAgICAgIC8vIGFuZCBtYW51ZmFjdHVyZWQgdXNpbmcgdGhlIDY1IG5tIHByb2Nlc3MuCisgICAgICAgIHJldHVybiAoRW02NFQpID8gIm5vY29uYSIgOiAicHJlc2NvdHQiOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gKEVtNjRUKSA/ICJ4ODYtNjQiIDogInBlbnRpdW00IjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJnZW5lcmljIjsKKyAgICB9CisgIH0gZWxzZSBpZiAobWVtY21wKHRleHQuYywgIkF1dGhlbnRpY0FNRCIsIDEyKSA9PSAwKSB7CisgICAgLy8gRklYTUU6IHRoaXMgcG9vcmx5IG1hdGNoZXMgdGhlIGdlbmVyYXRlZCBTdWJ0YXJnZXRGZWF0dXJlS1YgdGFibGUuICBUaGVyZQorICAgIC8vIGFwcGVhcnMgdG8gYmUgbm8gd2F5IHRvIGdlbmVyYXRlIHRoZSB3aWRlIHZhcmlldHkgb2YgQU1ELXNwZWNpZmljIHRhcmdldHMKKyAgICAvLyBmcm9tIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIENQVUlELgorICAgIHN3aXRjaCAoRmFtaWx5KSB7CisgICAgICBjYXNlIDQ6CisgICAgICAgIHJldHVybiAiaTQ4NiI7CisgICAgICBjYXNlIDU6CisgICAgICAgIHN3aXRjaCAoTW9kZWwpIHsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICBjYXNlIDc6ICByZXR1cm4gIms2IjsKKyAgICAgICAgY2FzZSA4OiAgcmV0dXJuICJrNi0yIjsKKyAgICAgICAgY2FzZSA5OgorICAgICAgICBjYXNlIDEzOiByZXR1cm4gIms2LTMiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gInBlbnRpdW0iOworICAgICAgICB9CisgICAgICBjYXNlIDY6CisgICAgICAgIHN3aXRjaCAoTW9kZWwpIHsKKyAgICAgICAgY2FzZSA0OiAgcmV0dXJuICJhdGhsb24tdGJpcmQiOworICAgICAgICBjYXNlIDY6CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgY2FzZSA4OiAgcmV0dXJuICJhdGhsb24tbXAiOworICAgICAgICBjYXNlIDEwOiByZXR1cm4gImF0aGxvbi14cCI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiYXRobG9uIjsKKyAgICAgICAgfQorICAgICAgY2FzZSAxNToKKyAgICAgICAgaWYgKEhhc1NTRTMpIHsKKyAgICAgICAgICByZXR1cm4gIms4LXNzZTMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN3aXRjaCAoTW9kZWwpIHsKKyAgICAgICAgICBjYXNlIDE6ICByZXR1cm4gIm9wdGVyb24iOworICAgICAgICAgIGNhc2UgNTogIHJldHVybiAiYXRobG9uLWZ4IjsgLy8gYWxzbyBvcHRlcm9uCisgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICJhdGhsb242NCI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBjYXNlIDE2OgorICAgICAgICByZXR1cm4gImFtZGZhbTEwIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJnZW5lcmljIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuICJnZW5lcmljIjsKK30KKyNlbHNlCitzdGQ6OnN0cmluZyBzeXM6OmdldEhvc3RDUFVOYW1lKCkgeworICByZXR1cm4gImdlbmVyaWMiOworfQorI2VuZGlmCisKK2Jvb2wgc3lzOjpnZXRIb3N0Q1BVRmVhdHVyZXMoU3RyaW5nTWFwPGJvb2w+ICZGZWF0dXJlcyl7CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vSW5jbHVkZUZpbGUuY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9JbmNsdWRlRmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1OGQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vSW5jbHVkZUZpbGUuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vPT09LSBsaWIvU3lzdGVtL0luY2x1ZGVGaWxlLmNwcCAtIEVuc3VyZSBMaW5raW5nIE9mIEltcGxlbWVudGF0aW9uIC0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgSW5jbHVkZUZpbGUgY29uc3RydWN0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0luY2x1ZGVGaWxlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gZW5zdXJlIGxpbmtpbmcgb2Ygb3RoZXIgbW9kdWxlcy4gU2VlIHRoZQorLy8gbGx2bS9TeXN0ZW0vSW5jbHVkZUZpbGUuaCBoZWFkZXIgZm9yIGRldGFpbHMuIAorSW5jbHVkZUZpbGU6OkluY2x1ZGVGaWxlKGNvbnN0IHZvaWQqKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwMTNiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorIyM9PT0tIGxpYi9TeXN0ZW0vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNU3lzdGVtCitCVUlMRF9BUkNISVZFID0gMQorUkVRVUlSRVNfUlRUSSA9IDEKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCisKK2lmZXEgKCQoSE9TVF9PUyksTWluZ1cpCisgIFJFUVVJUkVTX0VIIDo9IDEKK2VuZGlmCisKK0VYVFJBX0RJU1QgPSBVbml4IFdpbjMyIFJFQURNRS50eHQKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKworQ29tcGlsZUNvbW1vbk9wdHMgOj0gJChmaWx0ZXItb3V0IC1wZWRhbnRpYywkKENvbXBpbGVDb21tb25PcHRzKSkKK0NvbXBpbGVDb21tb25PcHRzIDo9ICQoZmlsdGVyLW91dCAtV25vLWxvbmctbG9uZywkKENvbXBpbGVDb21tb25PcHRzKSkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vTWVtb3J5LmNwcCBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vTWVtb3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjIzYjhkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9NZW1vcnkuY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LSBNZW1vcnkuY3BwIC0gTWVtb3J5IEhhbmRsaW5nIFN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgc29tZSBoZWxwZnVsIGZ1bmN0aW9ucyBmb3IgYWxsb2NhdGluZyBtZW1vcnkgYW5kIGRlYWxpbmcKKy8vIHdpdGggbWVtb3J5IG1hcHBlZCBmaWxlcworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NZW1vcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9WYWxncmluZC5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorCituYW1lc3BhY2UgbGx2bSB7Cit1c2luZyBuYW1lc3BhY2Ugc3lzOworfQorCisvLyBJbmNsdWRlIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXJ0cyBvZiB0aGlzIGNsYXNzLgorI2lmZGVmIExMVk1fT05fVU5JWAorI2luY2x1ZGUgIlVuaXgvTWVtb3J5LmluYyIKKyNlbmRpZgorI2lmZGVmIExMVk1fT05fV0lOMzIKKyNpbmNsdWRlICJXaW4zMi9NZW1vcnkuaW5jIgorI2VuZGlmCisKK2V4dGVybiAiQyIgdm9pZCBzeXNfaWNhY2hlX2ludmFsaWRhdGUoY29uc3Qgdm9pZCAqQWRkciwgc2l6ZV90IGxlbik7CisKKy8vLyBJbnZhbGlkYXRlSW5zdHJ1Y3Rpb25DYWNoZSAtIEJlZm9yZSB0aGUgSklUIGNhbiBydW4gYSBibG9jayBvZiBjb2RlCisvLy8gdGhhdCBoYXMgYmVlbiBlbWl0dGVkIGl0IG11c3QgaW52YWxpZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgb24gc29tZQorLy8vIHBsYXRmb3Jtcy4KK3ZvaWQgbGx2bTo6c3lzOjpNZW1vcnk6OkludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKGNvbnN0IHZvaWQgKkFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgTGVuKSB7CisgIAorLy8gaWNhY2hlIGludmFsaWRhdGlvbiBmb3IgUFBDIGFuZCBBUk0uCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyMgIGlmIChkZWZpbmVkKF9fUE9XRVJQQ19fKSB8fCBkZWZpbmVkIChfX3BwY19fKSB8fCBcCisgICAgIGRlZmluZWQoX1BPV0VSKSB8fCBkZWZpbmVkKF9BUkNIX1BQQykpIHx8IGRlZmluZWQoX19hcm1fXykKKyAgc3lzX2ljYWNoZV9pbnZhbGlkYXRlKEFkZHIsIExlbik7CisjICBlbmRpZgorCisjZWxzZQorCisjICBpZiAoZGVmaW5lZChfX1BPV0VSUENfXykgfHwgZGVmaW5lZCAoX19wcGNfXykgfHwgXAorICAgICAgIGRlZmluZWQoX1BPV0VSKSB8fCBkZWZpbmVkKF9BUkNIX1BQQykpICYmIGRlZmluZWQoX19HTlVDX18pCisgIGNvbnN0IHNpemVfdCBMaW5lU2l6ZSA9IDMyOworCisgIGNvbnN0IGludHB0cl90IE1hc2sgPSB+KExpbmVTaXplIC0gMSk7CisgIGNvbnN0IGludHB0cl90IFN0YXJ0TGluZSA9ICgoaW50cHRyX3QpIEFkZHIpICYgTWFzazsKKyAgY29uc3QgaW50cHRyX3QgRW5kTGluZSA9ICgoaW50cHRyX3QpIEFkZHIgKyBMZW4gKyBMaW5lU2l6ZSAtIDEpICYgTWFzazsKKworICBmb3IgKGludHB0cl90IExpbmUgPSBTdGFydExpbmU7IExpbmUgPCBFbmRMaW5lOyBMaW5lICs9IExpbmVTaXplKQorICAgIGFzbSB2b2xhdGlsZSgiZGNiZiAwLCAlMCIgOiA6ICJyIihMaW5lKSk7CisgIGFzbSB2b2xhdGlsZSgic3luYyIpOworCisgIGZvciAoaW50cHRyX3QgTGluZSA9IFN0YXJ0TGluZTsgTGluZSA8IEVuZExpbmU7IExpbmUgKz0gTGluZVNpemUpCisgICAgYXNtIHZvbGF0aWxlKCJpY2JpIDAsICUwIiA6IDogInIiKExpbmUpKTsKKyAgYXNtIHZvbGF0aWxlKCJpc3luYyIpOworIyAgZWxpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX19HTlVDX18pCisgIC8vIEZJWE1FOiBDYW4gd2Ugc2FmZWx5IGFsd2F5cyBjYWxsIHRoaXMgZm9yIF9fR05VQ19fIGV2ZXJ5d2hlcmU/CisgIGNoYXIgKlN0YXJ0ID0gKGNoYXIqKSBBZGRyOworICBjaGFyICpFbmQgPSBTdGFydCArIExlbjsKKyAgX19jbGVhcl9jYWNoZShTdGFydCwgRW5kKTsKKyMgIGVuZGlmCisKKyNlbmRpZiAgLy8gZW5kIGFwcGxlCisKKyAgVmFsZ3JpbmREaXNjYXJkVHJhbnNsYXRpb25zKEFkZHIsIExlbik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL011dGV4LmNwcCBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vTXV0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2Q2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL011dGV4LmNwcApAQCAtMCwwICsxLDE1NyBAQAorLy89PT0tIE11dGV4LmNwcCAtIE11dHVhbCBFeGNsdXNpb24gTG9jayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbGx2bTo6c3lzOjpNdXRleCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db25maWcvY29uZmlnLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTXV0ZXguaCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgVFJVTFkgb3BlcmF0aW5nIHN5c3RlbQorLy89PT0gICAgICAgICAgaW5kZXBlbmRlbnQgY29kZS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZiAhZGVmaW5lZChFTkFCTEVfVEhSRUFEUykgfHwgRU5BQkxFX1RIUkVBRFMgPT0gMAorLy8gRGVmaW5lIGFsbCBtZXRob2RzIGFzIG5vLW9wcyBpZiB0aHJlYWRpbmcgaXMgZXhwbGljaXRseSBkaXNhYmxlZAorbmFtZXNwYWNlIGxsdm0gewordXNpbmcgbmFtZXNwYWNlIHN5czsKK011dGV4SW1wbDo6TXV0ZXhJbXBsKCBib29sIHJlY3Vyc2l2ZSkgeyB9CitNdXRleEltcGw6On5NdXRleEltcGwoKSB7IH0KK2Jvb2wgTXV0ZXhJbXBsOjphY3F1aXJlKCkgeyByZXR1cm4gdHJ1ZTsgfQorYm9vbCBNdXRleEltcGw6OnJlbGVhc2UoKSB7IHJldHVybiB0cnVlOyB9Citib29sIE11dGV4SW1wbDo6dHJ5YWNxdWlyZSgpIHsgcmV0dXJuIHRydWU7IH0KK30KKyNlbHNlCisKKyNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9IKSAmJiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9NVVRFWF9MT0NLKQorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBsbHZtIHsKK3VzaW5nIG5hbWVzcGFjZSBzeXM7CisKKworLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VmdWwgZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHB0aHJlYWQgbGlicmFyeSBoYXMgYmVlbgorLy8gY29tcGlsZWQgd2l0aCB3ZWFrIGxpbmthZ2UgZm9yIGl0cyBpbnRlcmZhY2Ugc3ltYm9scy4gVGhpcyBhbGxvd3MgdGhlCisvLyB0aHJlYWRpbmcgc3VwcG9ydCB0byBiZSB0dXJuZWQgb2ZmIGJ5IHNpbXBseSBub3QgbGlua2luZyBhZ2FpbnN0IC1scHRocmVhZC4KKy8vIEluIHRoYXQgc2l0dWF0aW9uLCB0aGUgdmFsdWUgb2YgcHRocmVhZF9tdXRleF9pbml0IHdpbGwgYmUgMCBhbmQKKy8vIGNvbnNlcXVlbnRseSBwdGhyZWFkX2VuYWJsZWQgd2lsbCBiZSBmYWxzZS4gSW4gc3VjaCBzaXR1YXRpb25zLCBhbGwgdGhlCisvLyBwdGhyZWFkIG9wZXJhdGlvbnMgYmVjb21lIG5vLW9wcyBhbmQgdGhlIGZ1bmN0aW9ucyBhbGwgcmV0dXJuIGZhbHNlLiBJZgorLy8gcHRocmVhZF9tdXRleF9pbml0IGRvZXMgaGF2ZSBhbiBhZGRyZXNzLCB0aGVuIG11dGV4IHN1cHBvcnQgaXMgZW5hYmxlZC4KKy8vIE5vdGU6IGFsbCBMTFZNIHRvb2xzIHdpbGwgbGluayBhZ2FpbnN0IC1scHRocmVhZCBpZiBpdHMgYXZhaWxhYmxlIHNpbmNlIGl0CisvLyAgICAgICBpcyBjb25maWd1cmVkIGludG8gdGhlIExJQlMgdmFyaWFibGUuCisvLyBOb3RlOiB0aGlzIGxpbmUgb2YgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGlmIHB0aHJlYWRfbXV0ZXhfaW5pdCBpcyBub3QKKy8vICAgICAgIGRlY2xhcmVkIHdpdGggd2VhayBsaW5rYWdlLiBJdCdzIHNhZmUgdG8gaWdub3JlIHRoZSB3YXJuaW5nLgorc3RhdGljIGNvbnN0IGJvb2wgcHRocmVhZF9lbmFibGVkID0gdHJ1ZTsKKworLy8gQ29uc3RydWN0IGEgTXV0ZXggdXNpbmcgcHRocmVhZCBjYWxscworTXV0ZXhJbXBsOjpNdXRleEltcGwoIGJvb2wgcmVjdXJzaXZlKQorICA6IGRhdGFfKDApCit7CisgIGlmIChwdGhyZWFkX2VuYWJsZWQpCisgIHsKKyAgICAvLyBEZWNsYXJlIHRoZSBwdGhyZWFkX211dGV4IGRhdGEgc3RydWN0dXJlcworICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPQorICAgICAgc3RhdGljX2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obWFsbG9jKHNpemVvZihwdGhyZWFkX211dGV4X3QpKSk7CisgICAgcHRocmVhZF9tdXRleGF0dHJfdCBhdHRyOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbXV0ZXggYXR0cmlidXRlcworICAgIGludCBlcnJvcmNvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZhdHRyKTsKKyAgICBhc3NlcnQoZXJyb3Jjb2RlID09IDApOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbXV0ZXggYXMgYSByZWN1cnNpdmUgbXV0ZXgsIGlmIHJlcXVlc3RlZCwgb3Igbm9ybWFsCisgICAgLy8gb3RoZXJ3aXNlLgorICAgIGludCBraW5kID0gKCByZWN1cnNpdmUgID8gUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgOiBQVEhSRUFEX01VVEVYX05PUk1BTCApOworICAgIGVycm9yY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJmF0dHIsIGtpbmQpOworICAgIGFzc2VydChlcnJvcmNvZGUgPT0gMCk7CisKKyNpZiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgIWRlZmluZWQoX19PcGVuQlNEX18pICYmICFkZWZpbmVkKF9fTmV0QlNEX18pICYmICFkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisgICAgLy8gTWFrZSBpdCBhIHByb2Nlc3MgbG9jYWwgbXV0ZXgKKyAgICBlcnJvcmNvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9zZXRwc2hhcmVkKCZhdHRyLCBQVEhSRUFEX1BST0NFU1NfUFJJVkFURSk7CisjZW5kaWYKKworICAgIC8vIEluaXRpYWxpemUgdGhlIG11dGV4CisgICAgZXJyb3Jjb2RlID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmYXR0cik7CisgICAgYXNzZXJ0KGVycm9yY29kZSA9PSAwKTsKKworICAgIC8vIERlc3Ryb3kgdGhlIGF0dHJpYnV0ZXMKKyAgICBlcnJvcmNvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgICBhc3NlcnQoZXJyb3Jjb2RlID09IDApOworCisgICAgLy8gQXNzaWduIHRoZSBkYXRhIG1lbWJlcgorICAgIGRhdGFfID0gbXV0ZXg7CisgIH0KK30KKworLy8gRGVzdHJ1Y3QgYSBNdXRleAorTXV0ZXhJbXBsOjp+TXV0ZXhJbXBsKCkKK3sKKyAgaWYgKHB0aHJlYWRfZW5hYmxlZCkKKyAgeworICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPSBzdGF0aWNfY2FzdDxwdGhyZWFkX211dGV4X3QqPihkYXRhXyk7CisgICAgYXNzZXJ0KG11dGV4ICE9IDApOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveShtdXRleCk7CisgICAgZnJlZShtdXRleCk7CisgIH0KK30KKworYm9vbAorTXV0ZXhJbXBsOjphY3F1aXJlKCkKK3sKKyAgaWYgKHB0aHJlYWRfZW5hYmxlZCkKKyAgeworICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPSBzdGF0aWNfY2FzdDxwdGhyZWFkX211dGV4X3QqPihkYXRhXyk7CisgICAgYXNzZXJ0KG11dGV4ICE9IDApOworCisgICAgaW50IGVycm9yY29kZSA9IHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCk7CisgICAgcmV0dXJuIGVycm9yY29kZSA9PSAwOworICB9IGVsc2UgcmV0dXJuIGZhbHNlOworfQorCitib29sCitNdXRleEltcGw6OnJlbGVhc2UoKQoreworICBpZiAocHRocmVhZF9lbmFibGVkKQorICB7CisgICAgcHRocmVhZF9tdXRleF90KiBtdXRleCA9IHN0YXRpY19jYXN0PHB0aHJlYWRfbXV0ZXhfdCo+KGRhdGFfKTsKKyAgICBhc3NlcnQobXV0ZXggIT0gMCk7CisKKyAgICBpbnQgZXJyb3Jjb2RlID0gcHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpOworICAgIHJldHVybiBlcnJvcmNvZGUgPT0gMDsKKyAgfSBlbHNlIHJldHVybiBmYWxzZTsKK30KKworYm9vbAorTXV0ZXhJbXBsOjp0cnlhY3F1aXJlKCkKK3sKKyAgaWYgKHB0aHJlYWRfZW5hYmxlZCkKKyAgeworICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPSBzdGF0aWNfY2FzdDxwdGhyZWFkX211dGV4X3QqPihkYXRhXyk7CisgICAgYXNzZXJ0KG11dGV4ICE9IDApOworCisgICAgaW50IGVycm9yY29kZSA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayhtdXRleCk7CisgICAgcmV0dXJuIGVycm9yY29kZSA9PSAwOworICB9IGVsc2UgcmV0dXJuIGZhbHNlOworfQorCit9CisKKyNlbGlmIGRlZmluZWQoTExWTV9PTl9VTklYKQorI2luY2x1ZGUgIlVuaXgvTXV0ZXguaW5jIgorI2VsaWYgZGVmaW5lZCggTExWTV9PTl9XSU4zMikKKyNpbmNsdWRlICJXaW4zMi9NdXRleC5pbmMiCisjZWxzZQorI3dhcm5pbmcgTmVpdGhlciBMTFZNX09OX1VOSVggbm9yIExMVk1fT05fV0lOMzIgd2FzIHNldCBpbiBTeXN0ZW0vTXV0ZXguY3BwCisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1BhdGguY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9QYXRoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM1MjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9QYXRoLmNwcApAQCAtMCwwICsxLDI2NCBAQAorLy89PT0tLSBQYXRoLmNwcCAtIEltcGxlbWVudCBPUyBQYXRoIENvbmNlcHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBoZWFkZXIgZmlsZSBpbXBsZW1lbnRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIFBhdGggY29uY2VwdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxvc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBuYW1lc3BhY2Ugc3lzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy89PT0gV0FSTklORzogSW1wbGVtZW50YXRpb24gaGVyZSBtdXN0IGNvbnRhaW4gb25seSBUUlVMWSBvcGVyYXRpbmcgc3lzdGVtCisvLz09PSAgICAgICAgICBpbmRlcGVuZGVudCBjb2RlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworYm9vbCBQYXRoOjpvcGVyYXRvcj09KGNvbnN0IFBhdGggJnRoYXQpIGNvbnN0IHsKKyAgcmV0dXJuIHBhdGggPT0gdGhhdC5wYXRoOworfQorCitib29sIFBhdGg6Om9wZXJhdG9yPChjb25zdCBQYXRoJiB0aGF0KSBjb25zdCB7CisgIHJldHVybiBwYXRoIDwgdGhhdC5wYXRoOworfQorCitQYXRoCitQYXRoOjpHZXRMTFZNQ29uZmlnRGlyKCkgeworICBQYXRoIHJlc3VsdDsKKyNpZmRlZiBMTFZNX0VUQ0RJUgorICBpZiAocmVzdWx0LnNldChMTFZNX0VUQ0RJUikpCisgICAgcmV0dXJuIHJlc3VsdDsKKyNlbmRpZgorICByZXR1cm4gR2V0TExWTURlZmF1bHRDb25maWdEaXIoKTsKK30KKworTExWTUZpbGVUeXBlCitzeXM6OklkZW50aWZ5RmlsZVR5cGUoY29uc3QgY2hhciAqbWFnaWMsIHVuc2lnbmVkIGxlbmd0aCkgeworICBhc3NlcnQobWFnaWMgJiYgIkludmFsaWQgbWFnaWMgbnVtYmVyIHN0cmluZyIpOworICBhc3NlcnQobGVuZ3RoID49NCAmJiAiSW52YWxpZCBtYWdpYyBudW1iZXIgbGVuZ3RoIik7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpbWFnaWNbMF0pIHsKKyAgICBjYXNlIDB4REU6ICAvLyAweDBCMTdDMERFID0gQkMgd3JhcGVyCisgICAgICBpZiAobWFnaWNbMV0gPT0gKGNoYXIpMHhDMCAmJiBtYWdpY1syXSA9PSAoY2hhcikweDE3ICYmCisgICAgICAgICAgbWFnaWNbM10gPT0gKGNoYXIpMHgwQikKKyAgICAgICAgcmV0dXJuIEJpdGNvZGVfRmlsZVR5cGU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdCJzoKKyAgICAgIGlmIChtYWdpY1sxXSA9PSAnQycgJiYgbWFnaWNbMl0gPT0gKGNoYXIpMHhDMCAmJiBtYWdpY1szXSA9PSAoY2hhcikweERFKQorICAgICAgICByZXR1cm4gQml0Y29kZV9GaWxlVHlwZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyEnOgorICAgICAgaWYgKGxlbmd0aCA+PSA4KQorICAgICAgICBpZiAobWVtY21wKG1hZ2ljLCIhPGFyY2g+XG4iLDgpID09IDApCisgICAgICAgICAgcmV0dXJuIEFyY2hpdmVfRmlsZVR5cGU7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgJ1wxNzcnOgorICAgICAgaWYgKG1hZ2ljWzFdID09ICdFJyAmJiBtYWdpY1syXSA9PSAnTCcgJiYgbWFnaWNbM10gPT0gJ0YnKSB7CisgICAgICAgIGlmIChsZW5ndGggPj0gMTggJiYgbWFnaWNbMTddID09IDApCisgICAgICAgICAgc3dpdGNoIChtYWdpY1sxNl0pIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gRUxGX1JlbG9jYXRhYmxlX0ZpbGVUeXBlOworICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gRUxGX0V4ZWN1dGFibGVfRmlsZVR5cGU7CisgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBFTEZfU2hhcmVkT2JqZWN0X0ZpbGVUeXBlOworICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gRUxGX0NvcmVfRmlsZVR5cGU7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4Q0E6CisgICAgICBpZiAobWFnaWNbMV0gPT0gY2hhcigweEZFKSAmJiBtYWdpY1syXSA9PSBjaGFyKDB4QkEpICYmIAorICAgICAgICAgIG1hZ2ljWzNdID09IGNoYXIoMHhCRSkpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBjb21wbGljYXRlZCBieSBhbiBvdmVybGFwIHdpdGggSmF2YSBjbGFzcyBmaWxlcy4gCisgICAgICAgIC8vIFNlZSB0aGUgTWFjaC1PIHNlY3Rpb24gaW4gL3Vzci9zaGFyZS9maWxlL21hZ2ljIGZvciBkZXRhaWxzLgorICAgICAgICBpZiAobGVuZ3RoID49IDggJiYgbWFnaWNbN10gPCA0MykgCisgICAgICAgICAgLy8gRklYTUU6IFVuaXZlcnNhbCBCaW5hcnkgb2YgYW55IHR5cGUuCisgICAgICAgICAgcmV0dXJuIE1hY2hfT19EeW5hbWljYWxseUxpbmtlZFNoYXJlZExpYl9GaWxlVHlwZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweEZFOgorICAgIGNhc2UgMHhDRTogeworICAgICAgdWludDE2X3QgdHlwZSA9IDA7CisgICAgICBpZiAobWFnaWNbMF0gPT0gY2hhcigweEZFKSAmJiBtYWdpY1sxXSA9PSBjaGFyKDB4RUQpICYmIAorICAgICAgICAgIG1hZ2ljWzJdID09IGNoYXIoMHhGQSkgJiYgbWFnaWNbM10gPT0gY2hhcigweENFKSkgeworICAgICAgICAvKiBOYXRpdmUgZW5kaWFuICovCisgICAgICAgIGlmIChsZW5ndGggPj0gMTYpIHR5cGUgPSBtYWdpY1sxNF0gPDwgOCB8IG1hZ2ljWzE1XTsKKyAgICAgIH0gZWxzZSBpZiAobWFnaWNbMF0gPT0gY2hhcigweENFKSAmJiBtYWdpY1sxXSA9PSBjaGFyKDB4RkEpICYmIAorICAgICAgICAgICAgICAgICBtYWdpY1syXSA9PSBjaGFyKDB4RUQpICYmIG1hZ2ljWzNdID09IGNoYXIoMHhGRSkpIHsKKyAgICAgICAgLyogUmV2ZXJzZSBlbmRpYW4gKi8KKyAgICAgICAgaWYgKGxlbmd0aCA+PSAxNCkgdHlwZSA9IG1hZ2ljWzEzXSA8PCA4IHwgbWFnaWNbMTJdOworICAgICAgfQorICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOyAgICAgIAorICAgICAgICBjYXNlIDE6IHJldHVybiBNYWNoX09fT2JqZWN0X0ZpbGVUeXBlOyAKKyAgICAgICAgY2FzZSAyOiByZXR1cm4gTWFjaF9PX0V4ZWN1dGFibGVfRmlsZVR5cGU7CisgICAgICAgIGNhc2UgMzogcmV0dXJuIE1hY2hfT19GaXhlZFZpcnR1YWxNZW1vcnlTaGFyZWRMaWJfRmlsZVR5cGU7CisgICAgICAgIGNhc2UgNDogcmV0dXJuIE1hY2hfT19Db3JlX0ZpbGVUeXBlOworICAgICAgICBjYXNlIDU6IHJldHVybiBNYWNoX09fUHJlbG9hZEV4ZWN0dWFibGVfRmlsZVR5cGU7CisgICAgICAgIGNhc2UgNjogcmV0dXJuIE1hY2hfT19EeW5hbWljYWxseUxpbmtlZFNoYXJlZExpYl9GaWxlVHlwZTsKKyAgICAgICAgY2FzZSA3OiByZXR1cm4gTWFjaF9PX0R5bmFtaWNMaW5rZXJfRmlsZVR5cGU7CisgICAgICAgIGNhc2UgODogcmV0dXJuIE1hY2hfT19CdW5kbGVfRmlsZVR5cGU7CisgICAgICAgIGNhc2UgOTogcmV0dXJuIE1hY2hfT19EeW5hbWljYWxseUxpbmtlZFNoYXJlZExpYlN0dWJfRmlsZVR5cGU7CisgICAgICAgIGNhc2UgMTA6IGJyZWFrOyAvLyBGSVhNRTogTUhfRFNZTSBjb21wYW5pb24gZmlsZSB3aXRoIG9ubHkgZGVidWcuCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAweEYwOiAvLyBQb3dlclBDIFdpbmRvd3MKKyAgICBjYXNlIDB4ODM6IC8vIEFscGhhIDMyLWJpdAorICAgIGNhc2UgMHg4NDogLy8gQWxwaGEgNjQtYml0CisgICAgY2FzZSAweDY2OiAvLyBNUFMgUjQwMDAgV2luZG93cworICAgIGNhc2UgMHg1MDogLy8gbWM2OEsKKyAgICBjYXNlIDB4NGM6IC8vIDgwMzg2IFdpbmRvd3MKKyAgICAgIGlmIChtYWdpY1sxXSA9PSAweDAxKQorICAgICAgICByZXR1cm4gQ09GRl9GaWxlVHlwZTsKKworICAgIGNhc2UgMHg5MDogLy8gUEEtUklTQyBXaW5kb3dzCisgICAgY2FzZSAweDY4OiAvLyBtYzY4SyBXaW5kb3dzCisgICAgICBpZiAobWFnaWNbMV0gPT0gMHgwMikKKyAgICAgICAgcmV0dXJuIENPRkZfRmlsZVR5cGU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gVW5rbm93bl9GaWxlVHlwZTsKK30KKworYm9vbAorUGF0aDo6aXNBcmNoaXZlKCkgY29uc3QgeworICByZXR1cm4gaGFzTWFnaWNOdW1iZXIoIiE8YXJjaD5cMDEyIik7Cit9CisKK2Jvb2wKK1BhdGg6OmlzRHluYW1pY0xpYnJhcnkoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIE1hZ2ljOworICBpZiAoZ2V0TWFnaWNOdW1iZXIoTWFnaWMsIDY0KSkKKyAgICBzd2l0Y2ggKElkZW50aWZ5RmlsZVR5cGUoTWFnaWMuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KE1hZ2ljLmxlbmd0aCgpKSkpIHsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgTWFjaF9PX0ZpeGVkVmlydHVhbE1lbW9yeVNoYXJlZExpYl9GaWxlVHlwZToKKyAgICAgIGNhc2UgTWFjaF9PX0R5bmFtaWNhbGx5TGlua2VkU2hhcmVkTGliX0ZpbGVUeXBlOgorICAgICAgY2FzZSBNYWNoX09fRHluYW1pY2FsbHlMaW5rZWRTaGFyZWRMaWJTdHViX0ZpbGVUeXBlOgorICAgICAgY2FzZSBFTEZfU2hhcmVkT2JqZWN0X0ZpbGVUeXBlOgorICAgICAgY2FzZSBDT0ZGX0ZpbGVUeXBlOiAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworUGF0aAorUGF0aDo6RmluZExpYnJhcnkoc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgc3RkOjp2ZWN0b3I8c3lzOjpQYXRoPiBMaWJQYXRoczsKKyAgR2V0U3lzdGVtTGlicmFyeVBhdGhzKExpYlBhdGhzKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IExpYlBhdGhzLnNpemUoKTsgKytpKSB7CisgICAgc3lzOjpQYXRoIEZ1bGxQYXRoKExpYlBhdGhzW2ldKTsKKyAgICBGdWxsUGF0aC5hcHBlbmRDb21wb25lbnQoImxpYiIgKyBuYW1lICsgTFRETF9TSExJQl9FWFQpOworICAgIGlmIChGdWxsUGF0aC5pc0R5bmFtaWNMaWJyYXJ5KCkpCisgICAgICByZXR1cm4gRnVsbFBhdGg7CisgICAgRnVsbFBhdGguZXJhc2VTdWZmaXgoKTsKKyAgICBGdWxsUGF0aC5hcHBlbmRTdWZmaXgoImEiKTsKKyAgICBpZiAoRnVsbFBhdGguaXNBcmNoaXZlKCkpCisgICAgICByZXR1cm4gRnVsbFBhdGg7CisgIH0KKyAgcmV0dXJuIHN5czo6UGF0aCgpOworfQorCitTdHJpbmdSZWYgUGF0aDo6R2V0RExMU3VmZml4KCkgeworICByZXR1cm4gTFRETF9TSExJQl9FWFQ7Cit9CisKK2Jvb2wKK1BhdGg6OmlzQml0Y29kZUZpbGUoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGFjdHVhbE1hZ2ljOworICBpZiAoIWdldE1hZ2ljTnVtYmVyKGFjdHVhbE1hZ2ljLCA0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIExMVk1GaWxlVHlwZSBGVCA9CisgICAgSWRlbnRpZnlGaWxlVHlwZShhY3R1YWxNYWdpYy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGFjdHVhbE1hZ2ljLmxlbmd0aCgpKSk7CisgIHJldHVybiBGVCA9PSBCaXRjb2RlX0ZpbGVUeXBlOworfQorCitib29sIFBhdGg6Omhhc01hZ2ljTnVtYmVyKFN0cmluZ1JlZiBNYWdpYykgY29uc3QgeworICBzdGQ6OnN0cmluZyBhY3R1YWxNYWdpYzsKKyAgaWYgKGdldE1hZ2ljTnVtYmVyKGFjdHVhbE1hZ2ljLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oTWFnaWMuc2l6ZSgpKSkpCisgICAgcmV0dXJuIE1hZ2ljID09IGFjdHVhbE1hZ2ljOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGdldFBhdGhMaXN0KGNvbnN0IGNoYXIqcGF0aCwgc3RkOjp2ZWN0b3I8UGF0aD4mIFBhdGhzKSB7CisgIGNvbnN0IGNoYXIqIGF0ID0gcGF0aDsKKyAgY29uc3QgY2hhciogZGVsaW0gPSBzdHJjaHIoYXQsIFBhdGhTZXBhcmF0b3IpOworICBQYXRoIHRtcFBhdGg7CisgIHdoaWxlIChkZWxpbSAhPSAwKSB7CisgICAgc3RkOjpzdHJpbmcgdG1wKGF0LCBzaXplX3QoZGVsaW0tYXQpKTsKKyAgICBpZiAodG1wUGF0aC5zZXQodG1wKSkKKyAgICAgIGlmICh0bXBQYXRoLmNhblJlYWQoKSkKKyAgICAgICAgUGF0aHMucHVzaF9iYWNrKHRtcFBhdGgpOworICAgIGF0ID0gZGVsaW0gKyAxOworICAgIGRlbGltID0gc3RyY2hyKGF0LCBQYXRoU2VwYXJhdG9yKTsKKyAgfQorCisgIGlmICgqYXQgIT0gMCkKKyAgICBpZiAodG1wUGF0aC5zZXQoc3RkOjpzdHJpbmcoYXQpKSkKKyAgICAgIGlmICh0bXBQYXRoLmNhblJlYWQoKSkKKyAgICAgICAgUGF0aHMucHVzaF9iYWNrKHRtcFBhdGgpOworfQorCitzdGF0aWMgU3RyaW5nUmVmIGdldERpcm5hbWVDaGFyU2VwKFN0cmluZ1JlZiBwYXRoLCBjb25zdCBjaGFyICpTZXApIHsKKyAgYXNzZXJ0KFNlcFswXSAhPSAnXDAnICYmIFNlcFsxXSA9PSAnXDAnICYmCisgICAgICAgICAiU2VwIG11c3QgYmUgYSAxLWNoYXJhY3RlciBzdHJpbmcgbGl0ZXJhbC4iKTsKKyAgaWYgKHBhdGguZW1wdHkoKSkKKyAgICByZXR1cm4gIi4iOworICAKKyAgLy8gSWYgdGhlIHBhdGggaXMgYWxsIHNsYXNoZXMsIHJldHVybiBhIHNpbmdsZSBzbGFzaC4KKyAgLy8gT3RoZXJ3aXNlLCByZW1vdmUgYWxsIHRyYWlsaW5nIHNsYXNoZXMuCisgIAorICBzaWduZWQgcG9zID0gc3RhdGljX2Nhc3Q8c2lnbmVkPihwYXRoLnNpemUoKSkgLSAxOworICAKKyAgd2hpbGUgKHBvcyA+PSAwICYmIHBhdGhbcG9zXSA9PSBTZXBbMF0pCisgICAgLS1wb3M7CisgIAorICBpZiAocG9zIDwgMCkKKyAgICByZXR1cm4gcGF0aFswXSA9PSBTZXBbMF0gPyBTZXAgOiAiLiI7CisgIAorICAvLyBBbnkgc2xhc2hlcyBsZWZ0PworICBzaWduZWQgaSA9IDA7CisgIAorICB3aGlsZSAoaSA8IHBvcyAmJiBwYXRoW2ldICE9IFNlcFswXSkKKyAgICArK2k7CisgIAorICBpZiAoaSA9PSBwb3MpIC8vIE5vIHNsYXNoZXM/ICBSZXR1cm4gIi4iCisgICAgcmV0dXJuICIuIjsKKyAgCisgIC8vIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBzbGFzaCBsZWZ0LiAgUmVtb3ZlIGFsbCB0cmFpbGluZyBub24tc2xhc2hlcy4gIAorICB3aGlsZSAocG9zID49IDAgJiYgcGF0aFtwb3NdICE9IFNlcFswXSkKKyAgICAtLXBvczsKKyAgCisgIC8vIFJlbW92ZSBhbnkgdHJhaWxpbmcgc2xhc2hlcy4KKyAgd2hpbGUgKHBvcyA+PSAwICYmIHBhdGhbcG9zXSA9PSBTZXBbMF0pCisgICAgLS1wb3M7CisgIAorICBpZiAocG9zIDwgMCkKKyAgICByZXR1cm4gcGF0aFswXSA9PSBTZXBbMF0gPyBTZXAgOiAiLiI7CisgIAorICByZXR1cm4gcGF0aC5zdWJzdHIoMCwgcG9zKzEpOworfQorCisvLyBJbmNsdWRlIHRoZSB0cnVseSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXJ0cyBvZiB0aGlzIGNsYXNzLgorI2lmIGRlZmluZWQoTExWTV9PTl9VTklYKQorI2luY2x1ZGUgIlVuaXgvUGF0aC5pbmMiCisjZW5kaWYKKyNpZiBkZWZpbmVkKExMVk1fT05fV0lOMzIpCisjaW5jbHVkZSAiV2luMzIvUGF0aC5pbmMiCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9Qcm9jZXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vUHJvY2Vzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzYjJhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vUHJvY2Vzcy5jcHAKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tLSBQcm9jZXNzLmNwcCAtIEltcGxlbWVudCBPUyBQcm9jZXNzIENvbmNlcHQgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBoZWFkZXIgZmlsZSBpbXBsZW1lbnRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIFByb2Nlc3MgY29uY2VwdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vUHJvY2Vzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorCituYW1lc3BhY2UgbGx2bSB7Cit1c2luZyBuYW1lc3BhY2Ugc3lzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy89PT0gV0FSTklORzogSW1wbGVtZW50YXRpb24gaGVyZSBtdXN0IGNvbnRhaW4gb25seSBUUlVMWSBvcGVyYXRpbmcgc3lzdGVtCisvLz09PSAgICAgICAgICBpbmRlcGVuZGVudCBjb2RlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworfQorCisvLyBJbmNsdWRlIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXJ0cyBvZiB0aGlzIGNsYXNzLgorI2lmZGVmIExMVk1fT05fVU5JWAorI2luY2x1ZGUgIlVuaXgvUHJvY2Vzcy5pbmMiCisjZW5kaWYKKyNpZmRlZiBMTFZNX09OX1dJTjMyCisjaW5jbHVkZSAiV2luMzIvUHJvY2Vzcy5pbmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vUHJvZ3JhbS5jcHAgYi9zcmMvTExWTS9saWIvU3lzdGVtL1Byb2dyYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNThjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1Byb2dyYW0uY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT09LS0gUHJvZ3JhbS5jcHAgLSBJbXBsZW1lbnQgT1MgUHJvZ3JhbSBDb25jZXB0IC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgaGVhZGVyIGZpbGUgaW1wbGVtZW50cyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBQcm9ncmFtIGNvbmNlcHQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL1Byb2dyYW0uaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIHN5czsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgVFJVTFkgb3BlcmF0aW5nIHN5c3RlbQorLy89PT0gICAgICAgICAgaW5kZXBlbmRlbnQgY29kZS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2ludAorUHJvZ3JhbTo6RXhlY3V0ZUFuZFdhaXQoY29uc3QgUGF0aCYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIGVudnAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXRoKiogcmVkaXJlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2Vjb25kc1RvV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1lbW9yeUxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIEVyck1zZykgeworICBQcm9ncmFtIHByZzsKKyAgaWYgKHByZy5FeGVjdXRlKHBhdGgsIGFyZ3MsIGVudnAsIHJlZGlyZWN0cywgbWVtb3J5TGltaXQsIEVyck1zZykpCisgICAgcmV0dXJuIHByZy5XYWl0KHNlY29uZHNUb1dhaXQsIEVyck1zZyk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQKK1Byb2dyYW06OkV4ZWN1dGVOb1dhaXQoY29uc3QgUGF0aCYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBlbnZwLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXRoKiogcmVkaXJlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtZW1vcnlMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIEVyck1zZykgeworICBQcm9ncmFtIHByZzsKKyAgcHJnLkV4ZWN1dGUocGF0aCwgYXJncywgZW52cCwgcmVkaXJlY3RzLCBtZW1vcnlMaW1pdCwgRXJyTXNnKTsKK30KKworLy8gSW5jbHVkZSB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgcGFydHMgb2YgdGhpcyBjbGFzcy4KKyNpZmRlZiBMTFZNX09OX1VOSVgKKyNpbmNsdWRlICJVbml4L1Byb2dyYW0uaW5jIgorI2VuZGlmCisjaWZkZWYgTExWTV9PTl9XSU4zMgorI2luY2x1ZGUgIldpbjMyL1Byb2dyYW0uaW5jIgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1JFQURNRS50eHQgYi9zcmMvTExWTS9saWIvU3lzdGVtL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjYjIwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vUkVBRE1FLnR4dApAQCAtMCwwICsxLDQzIEBACitEZXNpZ24gT2YgbGliL1N5c3RlbQorPT09PT09PT09PT09PT09PT09PT0KKworVGhlIHNvZnR3YXJlIGluIHRoaXMgZGlyZWN0b3J5IGlzIGRlc2lnbmVkIHRvIGNvbXBsZXRlbHkgc2hpZWxkIExMVk0gZnJvbSBhbnkKK2FuZCBhbGwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5LiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYQorY29tcGxldGUgb3BlcmF0aW5nIHN5c3RlbSB3cmFwcGVyIChzdWNoIGFzIEFDRSksIGJ1dCBvbmx5IHRvIHByb3ZpZGUgdGhlCitmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeSB0byBzdXBwb3J0IExMVk0uCisKK1RoZSBzb2Z0d2FyZSBsb2NhdGVkIGhlcmUsIG9mIG5lY2Vzc2l0eSwgaGFzIHZlcnkgc3BlY2lmaWMgYW5kIHN0cmluZ2VudCBkZXNpZ24KK3J1bGVzLiBWaW9sYXRpb24gb2YgdGhlc2UgcnVsZXMgbWVhbnMgdGhhdCBjcmFja3MgaW4gdGhlIHNoaWVsZCBjb3VsZCBmb3JtIGFuZAordGhlIHByaW1hcnkgZ29hbCBvZiB0aGUgbGlicmFyeSBpcyBkZWZlYXRlZC4gQnkgY29uc2lzdGVudGx5IHVzaW5nIHRoaXMgbGlicmFyeSwKK0xMVk0gYmVjb21lcyBtb3JlIGVhc2lseSBwb3J0ZWQgdG8gbmV3IHBsYXRmb3JtcyBzaW5jZSB0aGUgb25seSB0aGluZyByZXF1aXJpbmcgCitwb3J0aW5nIGlzIHRoaXMgbGlicmFyeS4KKworQ29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGxpYnJhcnkgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlOgorICBsbHZtL2RvY3MvU3lzdGVtTGlicmFyeS5odG1sIAorb3IgYXQgdGhpcyBVUkw6CisgIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL1N5c3RlbUxpYnJhcnkuaHRtbAorCitXaGlsZSB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgcmVhZCB0aGUgbW9yZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLCBmb3IgdGhlIAoraW1wYXRpZW50LCBoZXJlJ3MgYSBoaWdoIGxldmVsIHN1bW1hcnkgb2YgdGhlIGxpYnJhcnkncyByZXF1aXJlbWVudHMuCisKKyAxLiBObyBzeXN0ZW0gaGVhZGVyIGZpbGVzIGFyZSB0byBiZSBleHBvc2VkIHRocm91Z2ggdGhlIGludGVyZmFjZS4KKyAyLiBTdGQgQysrIGFuZCBTdGQgQyBoZWFkZXIgZmlsZXMgYXJlIG9rYXkgdG8gYmUgZXhwb3NlZCB0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCisgMy4gTm8gZXhwb3NlZCBzeXN0ZW0tc3BlY2lmaWMgZnVuY3Rpb25zLgorIDQuIE5vIGV4cG9zZWQgc3lzdGVtLXNwZWNpZmljIGRhdGEuCisgNS4gRGF0YSBpbiBsaWIvU3lzdGVtIGNsYXNzZXMgbXVzdCB1c2Ugb25seSBzaW1wbGUgQysrIGludHJpbnNpYyB0eXBlcy4KKyA2LiBFcnJvcnMgYXJlIGhhbmRsZWQgYnkgcmV0dXJuaW5nICJ0cnVlIiBhbmQgc2V0dGluZyBhbiBvcHRpb25hbCBzdGQ6OnN0cmluZworIDcuIExpYnJhcnkgbXVzdCBub3QgdGhyb3cgYW55IGV4Y2VwdGlvbnMsIHBlcmlvZC4KKyA4LiBJbnRlcmZhY2UgZnVuY3Rpb25zIG11c3Qgbm90IGhhdmUgdGhyb3coKSBzcGVjaWZpY2F0aW9ucy4KKyA5LiBObyBkdXBsaWNhdGUgZnVuY3Rpb24gaW1wZW1lbnRhdGlvbnMgYXJlIHBlcm1pdHRlZCB3aXRoaW4gYW4gb3BlcmF0aW5nCisgICAgc3lzdGVtIGNsYXNzLgorCitUbyBhY2NvbXBsaXNoIHRoZXNlIHJlcXVpcmVtZW50cywgdGhlIGxpYnJhcnkgaGFzIG51bWVyb3VzIGRlc2lnbiBjcml0ZXJpYSB0aGF0IAorbXVzdCBiZSBzYXRpc2ZpZWQuIEhlcmUncyBhIGhpZ2ggbGV2ZWwgc3VtbWFyeSBvZiB0aGUgbGlicmFyeSdzIGRlc2lnbiBjcml0ZXJpYToKKworIDEuIE5vIHVudXNlZCBmdW5jdGlvbmFsaXR5IChvbmx5IHdoYXQgTExWTSBuZWVkcykKKyAyLiBIaWdoLUxldmVsIEludGVyZmFjZXMKKyAzLiBVc2UgT3BhcXVlIENsYXNzZXMKKyA0LiBDb21tb24gSW1wbGVtZW50YXRpb25zPC9hPjwvbGk+CisgNS4gTXVsdGlwbGUgSW1wbGVtZW50YXRpb25zPC9hPjwvbGk+CisgNi4gTWluaW1pemUgTWVtb3J5IEFsbG9jYXRpb248L2E+PC9saT4KKyA3LiBObyBWaXJ0dWFsIE1ldGhvZHMKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vUldNdXRleC5jcHAgYi9zcmMvTExWTS9saWIvU3lzdGVtL1JXTXV0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjA0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1JXTXV0ZXguY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvLz09PS0gUldNdXRleC5jcHAgLSBSZWFkZXIvV3JpdGVyIE11dHVhbCBFeGNsdXNpb24gTG9jayAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBsbHZtOjpzeXM6OlJXTXV0ZXggY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1JXTXV0ZXguaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy89PT0gV0FSTklORzogSW1wbGVtZW50YXRpb24gaGVyZSBtdXN0IGNvbnRhaW4gb25seSBUUlVMWSBvcGVyYXRpbmcgc3lzdGVtCisvLz09PSAgICAgICAgICBpbmRlcGVuZGVudCBjb2RlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmICFkZWZpbmVkKEVOQUJMRV9USFJFQURTKSB8fCBFTkFCTEVfVEhSRUFEUyA9PSAwCisvLyBEZWZpbmUgYWxsIG1ldGhvZHMgYXMgbm8tb3BzIGlmIHRocmVhZGluZyBpcyBleHBsaWNpdGx5IGRpc2FibGVkCituYW1lc3BhY2UgbGx2bSB7Cit1c2luZyBuYW1lc3BhY2Ugc3lzOworUldNdXRleEltcGw6OlJXTXV0ZXhJbXBsKCkgeyB9CitSV011dGV4SW1wbDo6flJXTXV0ZXhJbXBsKCkgeyB9Citib29sIFJXTXV0ZXhJbXBsOjpyZWFkZXJfYWNxdWlyZSgpIHsgcmV0dXJuIHRydWU7IH0KK2Jvb2wgUldNdXRleEltcGw6OnJlYWRlcl9yZWxlYXNlKCkgeyByZXR1cm4gdHJ1ZTsgfQorYm9vbCBSV011dGV4SW1wbDo6d3JpdGVyX2FjcXVpcmUoKSB7IHJldHVybiB0cnVlOyB9Citib29sIFJXTXV0ZXhJbXBsOjp3cml0ZXJfcmVsZWFzZSgpIHsgcmV0dXJuIHRydWU7IH0KK30KKyNlbHNlCisKKyNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9IKSAmJiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9SV0xPQ0tfSU5JVCkKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgbGx2bSB7Cit1c2luZyBuYW1lc3BhY2Ugc3lzOworCisKKy8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZnVsIGZvciBzaXR1YXRpb25zIHdoZXJlIHRoZSBwdGhyZWFkIGxpYnJhcnkgaGFzIGJlZW4KKy8vIGNvbXBpbGVkIHdpdGggd2VhayBsaW5rYWdlIGZvciBpdHMgaW50ZXJmYWNlIHN5bWJvbHMuIFRoaXMgYWxsb3dzIHRoZQorLy8gdGhyZWFkaW5nIHN1cHBvcnQgdG8gYmUgdHVybmVkIG9mZiBieSBzaW1wbHkgbm90IGxpbmtpbmcgYWdhaW5zdCAtbHB0aHJlYWQuCisvLyBJbiB0aGF0IHNpdHVhdGlvbiwgdGhlIHZhbHVlIG9mIHB0aHJlYWRfbXV0ZXhfaW5pdCB3aWxsIGJlIDAgYW5kCisvLyBjb25zZXF1ZW50bHkgcHRocmVhZF9lbmFibGVkIHdpbGwgYmUgZmFsc2UuIEluIHN1Y2ggc2l0dWF0aW9ucywgYWxsIHRoZQorLy8gcHRocmVhZCBvcGVyYXRpb25zIGJlY29tZSBuby1vcHMgYW5kIHRoZSBmdW5jdGlvbnMgYWxsIHJldHVybiBmYWxzZS4gSWYKKy8vIHB0aHJlYWRfcndsb2NrX2luaXQgZG9lcyBoYXZlIGFuIGFkZHJlc3MsIHRoZW4gcndsb2NrIHN1cHBvcnQgaXMgZW5hYmxlZC4KKy8vIE5vdGU6IGFsbCBMTFZNIHRvb2xzIHdpbGwgbGluayBhZ2FpbnN0IC1scHRocmVhZCBpZiBpdHMgYXZhaWxhYmxlIHNpbmNlIGl0CisvLyAgICAgICBpcyBjb25maWd1cmVkIGludG8gdGhlIExJQlMgdmFyaWFibGUuCisvLyBOb3RlOiB0aGlzIGxpbmUgb2YgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGlmIHB0aHJlYWRfcndsb2NrX2luaXQgaXMgbm90CisvLyAgICAgICBkZWNsYXJlZCB3aXRoIHdlYWsgbGlua2FnZS4gSXQncyBzYWZlIHRvIGlnbm9yZSB0aGUgd2FybmluZy4KK3N0YXRpYyBjb25zdCBib29sIHB0aHJlYWRfZW5hYmxlZCA9IHRydWU7CisKKy8vIENvbnN0cnVjdCBhIFJXTXV0ZXggdXNpbmcgcHRocmVhZCBjYWxscworUldNdXRleEltcGw6OlJXTXV0ZXhJbXBsKCkKKyAgOiBkYXRhXygwKQoreworICBpZiAocHRocmVhZF9lbmFibGVkKQorICB7CisgICAgLy8gRGVjbGFyZSB0aGUgcHRocmVhZF9yd2xvY2sgZGF0YSBzdHJ1Y3R1cmVzCisgICAgcHRocmVhZF9yd2xvY2tfdCogcndsb2NrID0KKyAgICAgIHN0YXRpY19jYXN0PHB0aHJlYWRfcndsb2NrX3QqPihtYWxsb2Moc2l6ZW9mKHB0aHJlYWRfcndsb2NrX3QpKSk7CisKKyNpZmRlZiBfX0FQUExFX18KKyAgICAvLyBXb3JrYXJvdW5kIGEgYnVnL21pcy1mZWF0dXJlIGluIERhcndpbidzIHB0aHJlYWRfcndsb2NrX2luaXQuCisgICAgYnplcm8ocndsb2NrLCBzaXplb2YocHRocmVhZF9yd2xvY2tfdCkpOworI2VuZGlmCisKKyAgICAvLyBJbml0aWFsaXplIHRoZSByd2xvY2sKKyAgICBpbnQgZXJyb3Jjb2RlID0gcHRocmVhZF9yd2xvY2tfaW5pdChyd2xvY2ssIE5VTEwpOworICAgICh2b2lkKWVycm9yY29kZTsKKyAgICBhc3NlcnQoZXJyb3Jjb2RlID09IDApOworCisgICAgLy8gQXNzaWduIHRoZSBkYXRhIG1lbWJlcgorICAgIGRhdGFfID0gcndsb2NrOworICB9Cit9CisKKy8vIERlc3RydWN0IGEgUldNdXRleAorUldNdXRleEltcGw6On5SV011dGV4SW1wbCgpCit7CisgIGlmIChwdGhyZWFkX2VuYWJsZWQpCisgIHsKKyAgICBwdGhyZWFkX3J3bG9ja190KiByd2xvY2sgPSBzdGF0aWNfY2FzdDxwdGhyZWFkX3J3bG9ja190Kj4oZGF0YV8pOworICAgIGFzc2VydChyd2xvY2sgIT0gMCk7CisgICAgcHRocmVhZF9yd2xvY2tfZGVzdHJveShyd2xvY2spOworICAgIGZyZWUocndsb2NrKTsKKyAgfQorfQorCitib29sCitSV011dGV4SW1wbDo6cmVhZGVyX2FjcXVpcmUoKQoreworICBpZiAocHRocmVhZF9lbmFibGVkKQorICB7CisgICAgcHRocmVhZF9yd2xvY2tfdCogcndsb2NrID0gc3RhdGljX2Nhc3Q8cHRocmVhZF9yd2xvY2tfdCo+KGRhdGFfKTsKKyAgICBhc3NlcnQocndsb2NrICE9IDApOworCisgICAgaW50IGVycm9yY29kZSA9IHB0aHJlYWRfcndsb2NrX3JkbG9jayhyd2xvY2spOworICAgIHJldHVybiBlcnJvcmNvZGUgPT0gMDsKKyAgfSBlbHNlIHJldHVybiBmYWxzZTsKK30KKworYm9vbAorUldNdXRleEltcGw6OnJlYWRlcl9yZWxlYXNlKCkKK3sKKyAgaWYgKHB0aHJlYWRfZW5hYmxlZCkKKyAgeworICAgIHB0aHJlYWRfcndsb2NrX3QqIHJ3bG9jayA9IHN0YXRpY19jYXN0PHB0aHJlYWRfcndsb2NrX3QqPihkYXRhXyk7CisgICAgYXNzZXJ0KHJ3bG9jayAhPSAwKTsKKworICAgIGludCBlcnJvcmNvZGUgPSBwdGhyZWFkX3J3bG9ja191bmxvY2socndsb2NrKTsKKyAgICByZXR1cm4gZXJyb3Jjb2RlID09IDA7CisgIH0gZWxzZSByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wKK1JXTXV0ZXhJbXBsOjp3cml0ZXJfYWNxdWlyZSgpCit7CisgIGlmIChwdGhyZWFkX2VuYWJsZWQpCisgIHsKKyAgICBwdGhyZWFkX3J3bG9ja190KiByd2xvY2sgPSBzdGF0aWNfY2FzdDxwdGhyZWFkX3J3bG9ja190Kj4oZGF0YV8pOworICAgIGFzc2VydChyd2xvY2sgIT0gMCk7CisKKyAgICBpbnQgZXJyb3Jjb2RlID0gcHRocmVhZF9yd2xvY2tfd3Jsb2NrKHJ3bG9jayk7CisgICAgcmV0dXJuIGVycm9yY29kZSA9PSAwOworICB9IGVsc2UgcmV0dXJuIGZhbHNlOworfQorCitib29sCitSV011dGV4SW1wbDo6d3JpdGVyX3JlbGVhc2UoKQoreworICBpZiAocHRocmVhZF9lbmFibGVkKQorICB7CisgICAgcHRocmVhZF9yd2xvY2tfdCogcndsb2NrID0gc3RhdGljX2Nhc3Q8cHRocmVhZF9yd2xvY2tfdCo+KGRhdGFfKTsKKyAgICBhc3NlcnQocndsb2NrICE9IDApOworCisgICAgaW50IGVycm9yY29kZSA9IHB0aHJlYWRfcndsb2NrX3VubG9jayhyd2xvY2spOworICAgIHJldHVybiBlcnJvcmNvZGUgPT0gMDsKKyAgfSBlbHNlIHJldHVybiBmYWxzZTsKK30KKworfQorCisjZWxpZiBkZWZpbmVkKExMVk1fT05fVU5JWCkKKyNpbmNsdWRlICJVbml4L1JXTXV0ZXguaW5jIgorI2VsaWYgZGVmaW5lZCggTExWTV9PTl9XSU4zMikKKyNpbmNsdWRlICJXaW4zMi9SV011dGV4LmluYyIKKyNlbHNlCisjd2FybmluZyBOZWl0aGVyIExMVk1fT05fVU5JWCBub3IgTExWTV9PTl9XSU4zMiB3YXMgc2V0IGluIFN5c3RlbS9NdXRleC5jcHAKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1NpZ25hbHMuY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9TaWduYWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQ1YjBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9TaWduYWxzLmNwcApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gU2lnbmFscy5jcHAgLSBTaWduYWwgSGFuZGxpbmcgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgaGVscGZ1bCBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YKKy8vIFVuaXggc2lnbmFscyBvY2N1cmluZyB3aGlsZSB5b3VyIHByb2dyYW0gaXMgcnVubmluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vU2lnbmFscy5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorCituYW1lc3BhY2UgbGx2bSB7Cit1c2luZyBuYW1lc3BhY2Ugc3lzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy89PT0gV0FSTklORzogSW1wbGVtZW50YXRpb24gaGVyZSBtdXN0IGNvbnRhaW4gb25seSBUUlVMWSBvcGVyYXRpbmcgc3lzdGVtCisvLz09PSAgICAgICAgICBpbmRlcGVuZGVudCBjb2RlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworfQorCisvLyBJbmNsdWRlIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXJ0cyBvZiB0aGlzIGNsYXNzLgorI2lmZGVmIExMVk1fT05fVU5JWAorI2luY2x1ZGUgIlVuaXgvU2lnbmFscy5pbmMiCisjZW5kaWYKKyNpZmRlZiBMTFZNX09OX1dJTjMyCisjaW5jbHVkZSAiV2luMzIvU2lnbmFscy5pbmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVGhyZWFkTG9jYWwuY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9UaHJlYWRMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0YThlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVGhyZWFkTG9jYWwuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8vPT09LSBUaHJlYWRMb2NhbC5jcHAgLSBUaHJlYWQgTG9jYWwgRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGxsdm06OnN5czo6VGhyZWFkTG9jYWwgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1RocmVhZExvY2FsLmgiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLz09PSBXQVJOSU5HOiBJbXBsZW1lbnRhdGlvbiBoZXJlIG11c3QgY29udGFpbiBvbmx5IFRSVUxZIG9wZXJhdGluZyBzeXN0ZW0KKy8vPT09ICAgICAgICAgIGluZGVwZW5kZW50IGNvZGUuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWYgIWRlZmluZWQoRU5BQkxFX1RIUkVBRFMpIHx8IEVOQUJMRV9USFJFQURTID09IDAKKy8vIERlZmluZSBhbGwgbWV0aG9kcyBhcyBuby1vcHMgaWYgdGhyZWFkaW5nIGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQKK25hbWVzcGFjZSBsbHZtIHsKK3VzaW5nIG5hbWVzcGFjZSBzeXM7CitUaHJlYWRMb2NhbEltcGw6OlRocmVhZExvY2FsSW1wbCgpIHsgfQorVGhyZWFkTG9jYWxJbXBsOjp+VGhyZWFkTG9jYWxJbXBsKCkgeyB9Cit2b2lkIFRocmVhZExvY2FsSW1wbDo6c2V0SW5zdGFuY2UoY29uc3Qgdm9pZCogZCkgeyBkYXRhID0gY29uc3RfY2FzdDx2b2lkKj4oZCk7fQorY29uc3Qgdm9pZCogVGhyZWFkTG9jYWxJbXBsOjpnZXRJbnN0YW5jZSgpIHsgcmV0dXJuIGRhdGE7IH0KK30KKyNlbHNlCisKKyNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9IKSAmJiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9HRVRTUEVDSUZJQykKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgbGx2bSB7Cit1c2luZyBuYW1lc3BhY2Ugc3lzOworCitUaHJlYWRMb2NhbEltcGw6OlRocmVhZExvY2FsSW1wbCgpIDogZGF0YSgwKSB7CisgIHB0aHJlYWRfa2V5X3QqIGtleSA9IG5ldyBwdGhyZWFkX2tleV90OworICBpbnQgZXJyb3Jjb2RlID0gcHRocmVhZF9rZXlfY3JlYXRlKGtleSwgTlVMTCk7CisgIGFzc2VydChlcnJvcmNvZGUgPT0gMCk7CisgICh2b2lkKSBlcnJvcmNvZGU7CisgIGRhdGEgPSAodm9pZCopa2V5OworfQorCitUaHJlYWRMb2NhbEltcGw6On5UaHJlYWRMb2NhbEltcGwoKSB7CisgIHB0aHJlYWRfa2V5X3QqIGtleSA9IHN0YXRpY19jYXN0PHB0aHJlYWRfa2V5X3QqPihkYXRhKTsKKyAgaW50IGVycm9yY29kZSA9IHB0aHJlYWRfa2V5X2RlbGV0ZSgqa2V5KTsKKyAgYXNzZXJ0KGVycm9yY29kZSA9PSAwKTsKKyAgKHZvaWQpIGVycm9yY29kZTsKKyAgZGVsZXRlIGtleTsKK30KKwordm9pZCBUaHJlYWRMb2NhbEltcGw6OnNldEluc3RhbmNlKGNvbnN0IHZvaWQqIGQpIHsKKyAgcHRocmVhZF9rZXlfdCoga2V5ID0gc3RhdGljX2Nhc3Q8cHRocmVhZF9rZXlfdCo+KGRhdGEpOworICBpbnQgZXJyb3Jjb2RlID0gcHRocmVhZF9zZXRzcGVjaWZpYygqa2V5LCBkKTsKKyAgYXNzZXJ0KGVycm9yY29kZSA9PSAwKTsKKyAgKHZvaWQpIGVycm9yY29kZTsKK30KKworY29uc3Qgdm9pZCogVGhyZWFkTG9jYWxJbXBsOjpnZXRJbnN0YW5jZSgpIHsKKyAgcHRocmVhZF9rZXlfdCoga2V5ID0gc3RhdGljX2Nhc3Q8cHRocmVhZF9rZXlfdCo+KGRhdGEpOworICByZXR1cm4gcHRocmVhZF9nZXRzcGVjaWZpYygqa2V5KTsKK30KKwordm9pZCBUaHJlYWRMb2NhbEltcGw6OnJlbW92ZUluc3RhbmNlKCkgeworICBzZXRJbnN0YW5jZSgwKTsKK30KKworfQorCisjZWxpZiBkZWZpbmVkKExMVk1fT05fVU5JWCkKKyNpbmNsdWRlICJVbml4L1RocmVhZExvY2FsLmluYyIKKyNlbGlmIGRlZmluZWQoIExMVk1fT05fV0lOMzIpCisjaW5jbHVkZSAiV2luMzIvVGhyZWFkTG9jYWwuaW5jIgorI2Vsc2UKKyN3YXJuaW5nIE5laXRoZXIgTExWTV9PTl9VTklYIG5vciBMTFZNX09OX1dJTjMyIHdhcyBzZXQgaW4gU3lzdGVtL1RocmVhZExvY2FsLmNwcAorI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9UaHJlYWRpbmcuY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9UaHJlYWRpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmM0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1RocmVhZGluZy5jcHAKQEAgLTAsMCArMSw2NCBAQAorLy89PT0tLSBsbHZtL1N5c3RlbS9UaHJlYWRpbmcuY3BwLSBDb250cm9sIG11bHRpdGhyZWFkaW5nIG1vZGUgLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGxsdm1fc3RhcnRfbXVsdGl0aHJlYWRlZCgpIGFuZCBmcmllbmRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaHJlYWRpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9BdG9taWMuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NdXRleC5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgYm9vbCBtdWx0aXRocmVhZGVkX21vZGUgPSBmYWxzZTsKKworc3RhdGljIHN5czo6TXV0ZXgqIGdsb2JhbF9sb2NrID0gMDsKKworYm9vbCBsbHZtOjpsbHZtX3N0YXJ0X211bHRpdGhyZWFkZWQoKSB7CisjaWZkZWYgTExWTV9NVUxUSVRIUkVBREVECisgIGFzc2VydCghbXVsdGl0aHJlYWRlZF9tb2RlICYmICJBbHJlYWR5IG11bHRpdGhyZWFkZWQhIik7CisgIG11bHRpdGhyZWFkZWRfbW9kZSA9IHRydWU7CisgIGdsb2JhbF9sb2NrID0gbmV3IHN5czo6TXV0ZXgodHJ1ZSk7CisgIAorICAvLyBXZSBmZW5jZSBoZXJlIHRvIGVuc3VyZSB0aGF0IGFsbCBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZSBCRUZPUkUgd2UKKyAgLy8gcmV0dXJuIGZyb20gbGx2bV9zdGFydF9tdWx0aXRocmVhZGVkKCkuCisgIHN5czo6TWVtb3J5RmVuY2UoKTsKKyAgcmV0dXJuIHRydWU7CisjZWxzZQorICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBsbHZtOjpsbHZtX3N0b3BfbXVsdGl0aHJlYWRlZCgpIHsKKyNpZmRlZiBMTFZNX01VTFRJVEhSRUFERUQKKyAgYXNzZXJ0KG11bHRpdGhyZWFkZWRfbW9kZSAmJiAiTm90IGN1cnJlbnRseSBtdWx0aXRocmVhZGVkISIpOworICAKKyAgLy8gV2UgZmVuY2UgaGVyZSB0byBpbnN1cmUgdGhhdCBhbGwgdGhyZWFkZWQgb3BlcmF0aW9ucyBhcmUgY29tcGxldGUgQkVGT1JFIHdlCisgIC8vIHJldHVybiBmcm9tIGxsdm1fc3RvcF9tdWx0aXRocmVhZGVkKCkuCisgIHN5czo6TWVtb3J5RmVuY2UoKTsKKyAgCisgIG11bHRpdGhyZWFkZWRfbW9kZSA9IGZhbHNlOworICBkZWxldGUgZ2xvYmFsX2xvY2s7CisjZW5kaWYKK30KKworYm9vbCBsbHZtOjpsbHZtX2lzX211bHRpdGhyZWFkZWQoKSB7CisgIHJldHVybiBtdWx0aXRocmVhZGVkX21vZGU7Cit9CisKK3ZvaWQgbGx2bTo6bGx2bV9hY3F1aXJlX2dsb2JhbF9sb2NrKCkgeworICBpZiAobXVsdGl0aHJlYWRlZF9tb2RlKSBnbG9iYWxfbG9jay0+YWNxdWlyZSgpOworfQorCit2b2lkIGxsdm06Omxsdm1fcmVsZWFzZV9nbG9iYWxfbG9jaygpIHsKKyAgaWYgKG11bHRpdGhyZWFkZWRfbW9kZSkgZ2xvYmFsX2xvY2stPnJlbGVhc2UoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVGltZVZhbHVlLmNwcCBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVGltZVZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQ5ODRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9UaW1lVmFsdWUuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8vPT09LS0gVGltZVZhbHVlLmNwcCAtIEltcGxlbWVudCBPUyBUaW1lVmFsdWUgQ29uY2VwdCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIFRpbWVWYWx1ZSBjb25jZXB0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaW1lVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKworbmFtZXNwYWNlIGxsdm0gewordXNpbmcgbmFtZXNwYWNlIHN5czsKKworY29uc3QgVGltZVZhbHVlIFRpbWVWYWx1ZTo6TWluVGltZSAgICAgICA9IFRpbWVWYWx1ZSAoIElOVDY0X01JTiwwICk7Citjb25zdCBUaW1lVmFsdWUgVGltZVZhbHVlOjpNYXhUaW1lICAgICAgID0gVGltZVZhbHVlICggSU5UNjRfTUFYLDAgKTsKK2NvbnN0IFRpbWVWYWx1ZSBUaW1lVmFsdWU6Olplcm9UaW1lICAgICAgPSBUaW1lVmFsdWUgKCAwLDAgKTsKK2NvbnN0IFRpbWVWYWx1ZSBUaW1lVmFsdWU6OlBvc2l4WmVyb1RpbWUgPSBUaW1lVmFsdWUgKCAtOTQ2Njg0ODAwLDAgKTsKK2NvbnN0IFRpbWVWYWx1ZSBUaW1lVmFsdWU6OldpbjMyWmVyb1RpbWUgPSBUaW1lVmFsdWUgKCAtMTI1OTExNTg0MDBVTEwsMCApOworCit2b2lkCitUaW1lVmFsdWU6Om5vcm1hbGl6ZSggdm9pZCApIHsKKyAgaWYgKCBuYW5vc18gPj0gTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCApIHsKKyAgICBkbyB7CisgICAgICBzZWNvbmRzXysrOworICAgICAgbmFub3NfIC09IE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQ7CisgICAgfSB3aGlsZSAoIG5hbm9zXyA+PSBOQU5PU0VDT05EU19QRVJfU0VDT05EICk7CisgIH0gZWxzZSBpZiAobmFub3NfIDw9IC1OQU5PU0VDT05EU19QRVJfU0VDT05EICkgeworICAgIGRvIHsKKyAgICAgIHNlY29uZHNfLS07CisgICAgICBuYW5vc18gKz0gTkFOT1NFQ09ORFNfUEVSX1NFQ09ORDsKKyAgICB9IHdoaWxlIChuYW5vc18gPD0gLU5BTk9TRUNPTkRTX1BFUl9TRUNPTkQpOworICB9CisKKyAgaWYgKHNlY29uZHNfID49IDEgJiYgbmFub3NfIDwgMCkgeworICAgIHNlY29uZHNfLS07CisgICAgbmFub3NfICs9IE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQ7CisgIH0gZWxzZSBpZiAoc2Vjb25kc18gPCAwICYmIG5hbm9zXyA+IDApIHsKKyAgICBzZWNvbmRzXysrOworICAgIG5hbm9zXyAtPSBOQU5PU0VDT05EU19QRVJfU0VDT05EOworICB9Cit9CisKK30KKworLy8vIEluY2x1ZGUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHBvcnRpb24gb2YgVGltZVZhbHVlIGNsYXNzCisjaWZkZWYgTExWTV9PTl9VTklYCisjaW5jbHVkZSAiVW5peC9UaW1lVmFsdWUuaW5jIgorI2VuZGlmCisjaWZkZWYgTExWTV9PTl9XSU4zMgorI2luY2x1ZGUgIldpbjMyL1RpbWVWYWx1ZS5pbmMiCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L0FsYXJtLmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9BbGFybS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwYzk2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9BbGFybS5pbmMKQEAgLTAsMCArMSw3MiBAQAorLy89PT0tLSBBbGFybS5pbmMgLSBJbXBsZW1lbnQgVW5peCBBbGFybSBTdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8NCisvLw0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgVU5JWCBBbGFybSBzdXBwb3J0Lg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisjaW5jbHVkZSA8c2lnbmFsLmg+DQorI2luY2x1ZGUgPHVuaXN0ZC5oPg0KKyNpbmNsdWRlIDxjYXNzZXJ0Pg0KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOw0KKw0KKy8vLyBBbGFybUNhbmNlbGxlZCAtIFRoaXMgZmxhZyBpcyBzZXQgYnkgdGhlIFNJR0lOVCBzaWduYWwgaGFuZGxlciBpZiB0aGUNCisvLy8gdXNlciBwcmVzc2VzIENUUkwtQy4NCitzdGF0aWMgdm9sYXRpbGUgYm9vbCBBbGFybUNhbmNlbGxlZCA9IGZhbHNlOw0KKw0KKy8vLyBBbGFybVRyaWdnZXJlZCAtIFRoaXMgZmxhZyBpcyBzZXQgYnkgdGhlIFNJR0FMUk0gc2lnbmFsIGhhbmRsZXIgaWYgdGhlDQorLy8vIGFsYXJtIHdhcyB0cmlnZ2VyZWQuDQorc3RhdGljIHZvbGF0aWxlIGJvb2wgQWxhcm1UcmlnZ2VyZWQgPSBmYWxzZTsNCisNCisvLy8gTmVzdGVkU09JIC0gU2FuaXR5IGNoZWNrLiAgQWxhcm1zIGNhbm5vdCBiZSBuZXN0ZWQgb3IgcnVuIGluIHBhcmFsbGVsLg0KKy8vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGV5IG5ldmVyIGRvLg0KK3N0YXRpYyBib29sIE5lc3RlZFNPSSA9IGZhbHNlOw0KKw0KK3N0YXRpYyBSRVRTSUdUWVBFIFNpZ0ludEhhbmRsZXIoaW50IFNpZykgew0KKyAgQWxhcm1DYW5jZWxsZWQgPSB0cnVlOw0KKyAgc2lnbmFsKFNJR0lOVCwgU2lnSW50SGFuZGxlcik7DQorfQ0KKw0KK3N0YXRpYyBSRVRTSUdUWVBFIFNpZ0FsYXJtSGFuZGxlcihpbnQgU2lnKSB7DQorICBBbGFybVRyaWdnZXJlZCA9IHRydWU7DQorfQ0KKw0KK3N0YXRpYyB2b2lkICgqT2xkU2lnSW50SGFuZGxlcikgKGludCk7DQorDQordm9pZCBzeXM6OlNldHVwQWxhcm0odW5zaWduZWQgc2Vjb25kcykgew0KKyAgYXNzZXJ0KCFOZXN0ZWRTT0kgJiYgInN5czo6U2V0dXBBbGFybSBjYWxscyBjYW5ub3QgYmUgbmVzdGVkISIpOw0KKyAgTmVzdGVkU09JID0gdHJ1ZTsNCisgIEFsYXJtQ2FuY2VsbGVkID0gZmFsc2U7DQorICBBbGFybVRyaWdnZXJlZCA9IGZhbHNlOw0KKyAgOjpzaWduYWwoU0lHQUxSTSwgU2lnQWxhcm1IYW5kbGVyKTsNCisgIE9sZFNpZ0ludEhhbmRsZXIgPSA6OnNpZ25hbChTSUdJTlQsIFNpZ0ludEhhbmRsZXIpOw0KKyAgOjphbGFybShzZWNvbmRzKTsNCit9DQorDQordm9pZCBzeXM6OlRlcm1pbmF0ZUFsYXJtKCkgew0KKyAgYXNzZXJ0KE5lc3RlZFNPSSAmJiAic3lzOjpUZXJtaW5hdGVBbGFybSBjYWxsZWQgd2l0aG91dCBzeXM6OlNldHVwQWxhcm0hIik7DQorICA6OmFsYXJtKDApOw0KKyAgOjpzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7DQorICA6OnNpZ25hbChTSUdJTlQsIE9sZFNpZ0ludEhhbmRsZXIpOw0KKyAgQWxhcm1DYW5jZWxsZWQgPSBmYWxzZTsNCisgIEFsYXJtVHJpZ2dlcmVkID0gZmFsc2U7DQorICBOZXN0ZWRTT0kgPSBmYWxzZTsNCit9DQorDQoraW50IHN5czo6QWxhcm1TdGF0dXMoKSB7DQorICBpZiAoQWxhcm1DYW5jZWxsZWQpDQorICAgIHJldHVybiAtMTsNCisgIGlmIChBbGFybVRyaWdnZXJlZCkNCisgICAgcmV0dXJuIDE7DQorICByZXR1cm4gMDsNCit9DQorDQordm9pZCBzeXM6OlNsZWVwKHVuc2lnbmVkIG4pIHsNCisgIDo6c2xlZXAobik7DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9Ib3N0LmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9Ib3N0LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzZkNmE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L0hvc3QuaW5jCkBAIC0wLDAgKzEsOTYgQEAKKyAvLz09PS0gbGx2bS9TeXN0ZW0vVW5peC9Ib3N0LmluYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFVOSVggSG9zdCBzdXBwb3J0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLz09PSBXQVJOSU5HOiBJbXBsZW1lbnRhdGlvbiBoZXJlIG11c3QgY29udGFpbiBvbmx5IGdlbmVyaWMgVU5JWCBjb2RlIHRoYXQKKy8vPT09ICAgICAgICAgIGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiAqYWxsKiBVTklYIHZhcmlhbnRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgIlVuaXguaCIKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBnZXRPU1ZlcnNpb24oKSB7CisgIHN0cnVjdCB1dHNuYW1lIGluZm87CisKKyAgaWYgKHVuYW1lKCZpbmZvKSkKKyAgICByZXR1cm4gIiI7CisKKyAgcmV0dXJuIGluZm8ucmVsZWFzZTsKK30KKworc3RkOjpzdHJpbmcgc3lzOjpnZXRIb3N0VHJpcGxlKCkgeworICAvLyBGSVhNRTogRGVyaXZlIGRpcmVjdGx5IGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGUgYXV0b2NvbmYgZ2VuZXJhdGVkCisgIC8vIHZhcmlhYmxlLgorCisgIFN0cmluZ1JlZiBIb3N0VHJpcGxlU3RyaW5nKExMVk1fSE9TVFRSSVBMRSk7CisgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gQXJjaFNwbGl0ID0gSG9zdFRyaXBsZVN0cmluZy5zcGxpdCgnLScpOworICAKKyAgLy8gTm9ybWFsaXplIHRoZSBhcmNoLCBzaW5jZSB0aGUgaG9zdCB0cmlwbGUgbWF5IG5vdCBhY3R1YWxseSBtYXRjaCB0aGUgaG9zdC4KKyAgc3RkOjpzdHJpbmcgQXJjaCA9IEFyY2hTcGxpdC5maXJzdDsKKworICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIGRvIHRoaXMgaW4gdGVybXMgb2YgbGx2bTo6VHJpcGxlLCBidXQgdGhhdCBpcyBpbgorICAvLyBTdXBwb3J0IHdoaWNoIGlzIGxheWVyZWQgYWJvdmUgdXMuCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorICBBcmNoID0gIng4Nl82NCI7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorICBBcmNoID0gImkzODYiOworI2VsaWYgZGVmaW5lZChfX3BwYzY0X18pCisgIEFyY2ggPSAicG93ZXJwYzY0IjsKKyNlbGlmIGRlZmluZWQoX19wcGNfXykKKyAgQXJjaCA9ICJwb3dlcnBjIjsKKyNlbGlmIGRlZmluZWQoX19hcm1fXykKKworICAvLyBGSVhNRTogV2UgbmVlZCB0byBwaWNrIHRoZSByaWdodCBBUk0gdHJpcGxlICh3aGljaCBpbnZvbHZlcyBxdWVyeWluZyB0aGUKKyAgLy8gY2hpcCkuIEhvd2V2ZXIsIGZvciBub3cgdGhpcyBpcyBtb3N0IGltcG9ydGFudCBmb3IgTExWTSBhcmNoIHNlbGVjdGlvbiwgc28KKyAgLy8gd2Ugb25seSBuZWVkIHRvIG1ha2Ugc3VyZSB0byBkaXN0aW5ndWlzaCBBUk0gYW5kIFRodW1iLgorIyAgaWYgZGVmaW5lZChfX3RodW1iX18pCisgIEFyY2ggPSAidGh1bWIiOworIyAgZWxzZQorICBBcmNoID0gImFybSI7CisjICBlbmRpZgorCisjZWxzZQorCisgIC8vIEZJWE1FOiBXaGVuIGVub3VnaCBhdXRvLWRldGVjdGlvbiBpcyBpbiBwbGFjZSwgdGhpcyBzaG91bGQganVzdAorICAvLyAjZXJyb3IuIFRoZW4gYXQgbGVhc3QgdGhlIGFyY2ggc2VsZWN0aW9uIGlzIGRvbmUsIGFuZCB3ZSBvbmx5IG5lZWQgdGhlIE9TCisgIC8vIGV0YyBzZWxlY3Rpb24gdG8ga2lsbCBvZmYgdGhlIHVzZSBvZiBMTFZNX0hPU1RUUklQTEUuCisKKyNlbmRpZgorCisgIHN0ZDo6c3RyaW5nIFRyaXBsZShBcmNoKTsKKyAgVHJpcGxlICs9ICctJzsKKyAgVHJpcGxlICs9IEFyY2hTcGxpdC5zZWNvbmQ7CisKKyAgLy8gRm9yY2UgaTxOPjg2IHRvIGkzODYuCisgIGlmIChUcmlwbGVbMF0gPT0gJ2knICYmIGlzZGlnaXQoVHJpcGxlWzFdKSAmJiAKKyAgICAgIFRyaXBsZVsyXSA9PSAnOCcgJiYgVHJpcGxlWzNdID09ICc2JykKKyAgICBUcmlwbGVbMV0gPSAnMyc7CisKKyAgLy8gT24gZGFyd2luLCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgdmVyc2lvbiB0byBtYXRjaCB0aGF0IG9mIHRoZQorICAvLyBob3N0LiAgICAKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBEYXJ3aW5EYXNoSWR4ID0gVHJpcGxlLmZpbmQoIi1kYXJ3aW4iKTsKKyAgaWYgKERhcndpbkRhc2hJZHggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBUcmlwbGUucmVzaXplKERhcndpbkRhc2hJZHggKyBzdHJsZW4oIi1kYXJ3aW4iKSk7CisgICAgCisgICAgLy8gT25seSBhZGQgdGhlIG1ham9yIHBhcnQgb2YgdGhlIG9zIHZlcnNpb24uCisgICAgc3RkOjpzdHJpbmcgVmVyc2lvbiA9IGdldE9TVmVyc2lvbigpOworICAgIFRyaXBsZSArPSBWZXJzaW9uLnN1YnN0cigwLCBWZXJzaW9uLmZpbmQoJy4nKSk7CisgIH0KKworICByZXR1cm4gVHJpcGxlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L01lbW9yeS5pbmMgYi9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvTWVtb3J5LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTQ1ZWIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L01lbW9yeS5pbmMKQEAgLTAsMCArMSwxNTEgQEAKKy8vPT09LSBVbml4L01lbW9yeS5jcHAgLSBHZW5lcmljIFVOSVggU3lzdGVtIENvbmZpZ3VyYXRpb24gLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIGZ1bmN0aW9ucyBmb3IgdmFyaW91cyBtZW1vcnkgbWFuYWdlbWVudCB1dGlsaXRpZXMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKyNpbmNsdWRlICJVbml4LmgiDQorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIg0KKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9Qcm9jZXNzLmgiDQorDQorI2lmZGVmIEhBVkVfU1lTX01NQU5fSA0KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfX0FQUExFX18NCisjaW5jbHVkZSA8bWFjaC9tYWNoLmg+DQorI2VuZGlmDQorDQorLy8vIEFsbG9jYXRlUldYIC0gQWxsb2NhdGUgYSBzbGFiIG9mIG1lbW9yeSB3aXRoIHJlYWQvd3JpdGUvZXhlY3V0ZQ0KKy8vLyBwZXJtaXNzaW9ucy4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIEpJVCBhcHBsaWNhdGlvbnMgd2hlcmUgd2Ugd2FudA0KKy8vLyB0byBlbWl0IGNvZGUgdG8gdGhlIG1lbW9yeSB0aGVuIGp1bXAgdG8gaXQuICBHZXR0aW5nIHRoaXMgdHlwZSBvZiBtZW1vcnkNCisvLy8gaXMgdmVyeSBPUyBzcGVjaWZpYy4NCisvLy8NCitsbHZtOjpzeXM6Ok1lbW9yeUJsb2NrIA0KK2xsdm06OnN5czo6TWVtb3J5OjpBbGxvY2F0ZVJXWChzaXplX3QgTnVtQnl0ZXMsIGNvbnN0IE1lbW9yeUJsb2NrKiBOZWFyQmxvY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJNc2cpIHsNCisgIGlmIChOdW1CeXRlcyA9PSAwKSByZXR1cm4gTWVtb3J5QmxvY2soKTsNCisNCisgIHNpemVfdCBwYWdlU2l6ZSA9IFByb2Nlc3M6OkdldFBhZ2VTaXplKCk7DQorICBzaXplX3QgTnVtUGFnZXMgPSAoTnVtQnl0ZXMrcGFnZVNpemUtMSkvcGFnZVNpemU7DQorDQorICBpbnQgZmQgPSAtMTsNCisjaWZkZWYgTkVFRF9ERVZfWkVST19GT1JfTU1BUA0KKyAgc3RhdGljIGludCB6ZXJvX2ZkID0gb3BlbigiL2Rldi96ZXJvIiwgT19SRFdSKTsNCisgIGlmICh6ZXJvX2ZkID09IC0xKSB7DQorICAgIE1ha2VFcnJNc2coRXJyTXNnLCAiQ2FuJ3Qgb3BlbiAvZGV2L3plcm8gZGV2aWNlIik7DQorICAgIHJldHVybiBNZW1vcnlCbG9jaygpOw0KKyAgfQ0KKyAgZmQgPSB6ZXJvX2ZkOw0KKyNlbmRpZg0KKw0KKyAgaW50IGZsYWdzID0gTUFQX1BSSVZBVEUgfA0KKyNpZmRlZiBIQVZFX01NQVBfQU5PTllNT1VTDQorICBNQVBfQU5PTllNT1VTDQorI2Vsc2UNCisgIE1BUF9BTk9ODQorI2VuZGlmDQorICA7DQorDQorICB2b2lkKiBzdGFydCA9IE5lYXJCbG9jayA/ICh1bnNpZ25lZCBjaGFyKilOZWFyQmxvY2stPmJhc2UoKSArIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZWFyQmxvY2stPnNpemUoKSA6IDA7DQorDQorI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fYXJtX18pDQorICB2b2lkICpwYSA9IDo6bW1hcChzdGFydCwgcGFnZVNpemUqTnVtUGFnZXMsIFBST1RfUkVBRHxQUk9UX0VYRUMsDQorICAgICAgICAgICAgICAgICAgICBmbGFncywgZmQsIDApOw0KKyNlbHNlDQorICB2b2lkICpwYSA9IDo6bW1hcChzdGFydCwgcGFnZVNpemUqTnVtUGFnZXMsIFBST1RfUkVBRHxQUk9UX1dSSVRFfFBST1RfRVhFQywNCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBmZCwgMCk7DQorI2VuZGlmDQorICBpZiAocGEgPT0gTUFQX0ZBSUxFRCkgew0KKyAgICBpZiAoTmVhckJsb2NrKSAvL1RyeSBhZ2FpbiB3aXRob3V0IGEgbmVhciBoaW50DQorICAgICAgcmV0dXJuIEFsbG9jYXRlUldYKE51bUJ5dGVzLCAwKTsNCisNCisgICAgTWFrZUVyck1zZyhFcnJNc2csICJDYW4ndCBhbGxvY2F0ZSBSV1ggTWVtb3J5Iik7DQorICAgIHJldHVybiBNZW1vcnlCbG9jaygpOw0KKyAgfQ0KKw0KKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX2FybV9fKQ0KKyAga2Vybl9yZXR1cm5fdCBrciA9IHZtX3Byb3RlY3QobWFjaF90YXNrX3NlbGYoKSwgKHZtX2FkZHJlc3NfdClwYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2bV9zaXplX3QpKHBhZ2VTaXplKk51bVBhZ2VzKSwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZNX1BST1RfUkVBRCB8IFZNX1BST1RfRVhFQ1VURSB8IFZNX1BST1RfQ09QWSk7DQorICBpZiAoS0VSTl9TVUNDRVNTICE9IGtyKSB7DQorICAgIE1ha2VFcnJNc2coRXJyTXNnLCAidm1fcHJvdGVjdCBtYXggUlggZmFpbGVkIik7DQorICAgIHJldHVybiBzeXM6Ok1lbW9yeUJsb2NrKCk7DQorICB9DQorDQorICBrciA9IHZtX3Byb3RlY3QobWFjaF90YXNrX3NlbGYoKSwgKHZtX2FkZHJlc3NfdClwYSwNCisgICAgICAgICAgICAgICAgICAodm1fc2l6ZV90KShwYWdlU2l6ZSpOdW1QYWdlcyksIDAsDQorICAgICAgICAgICAgICAgICAgVk1fUFJPVF9SRUFEIHwgVk1fUFJPVF9XUklURSk7DQorICBpZiAoS0VSTl9TVUNDRVNTICE9IGtyKSB7DQorICAgIE1ha2VFcnJNc2coRXJyTXNnLCAidm1fcHJvdGVjdCBSVyBmYWlsZWQiKTsNCisgICAgcmV0dXJuIHN5czo6TWVtb3J5QmxvY2soKTsNCisgIH0NCisjZW5kaWYNCisNCisgIE1lbW9yeUJsb2NrIHJlc3VsdDsNCisgIHJlc3VsdC5BZGRyZXNzID0gcGE7DQorICByZXN1bHQuU2l6ZSA9IE51bVBhZ2VzKnBhZ2VTaXplOw0KKw0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorDQorYm9vbCBsbHZtOjpzeXM6Ok1lbW9yeTo6UmVsZWFzZVJXWChNZW1vcnlCbG9jayAmTSwgc3RkOjpzdHJpbmcgKkVyck1zZykgew0KKyAgaWYgKE0uQWRkcmVzcyA9PSAwIHx8IE0uU2l6ZSA9PSAwKSByZXR1cm4gZmFsc2U7DQorICBpZiAoMCAhPSA6Om11bm1hcChNLkFkZHJlc3MsIE0uU2l6ZSkpDQorICAgIHJldHVybiBNYWtlRXJyTXNnKEVyck1zZywgIkNhbid0IHJlbGVhc2UgUldYIE1lbW9yeSIpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIGxsdm06OnN5czo6TWVtb3J5OjpzZXRXcml0YWJsZSAoTWVtb3J5QmxvY2sgJk0sIHN0ZDo6c3RyaW5nICpFcnJNc2cpIHsNCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19hcm1fXykNCisgIGlmIChNLkFkZHJlc3MgPT0gMCB8fCBNLlNpemUgPT0gMCkgcmV0dXJuIGZhbHNlOw0KKyAgc3lzOjpNZW1vcnk6OkludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKE0uQWRkcmVzcywgTS5TaXplKTsNCisgIGtlcm5fcmV0dXJuX3Qga3IgPSB2bV9wcm90ZWN0KG1hY2hfdGFza19zZWxmKCksICh2bV9hZGRyZXNzX3QpTS5BZGRyZXNzLA0KKyAgICAodm1fc2l6ZV90KU0uU2l6ZSwgMCwgVk1fUFJPVF9SRUFEIHwgVk1fUFJPVF9XUklURSk7DQorICByZXR1cm4gS0VSTl9TVUNDRVNTID09IGtyOw0KKyNlbHNlDQorICByZXR1cm4gdHJ1ZTsNCisjZW5kaWYNCit9DQorDQorYm9vbCBsbHZtOjpzeXM6Ok1lbW9yeTo6c2V0RXhlY3V0YWJsZSAoTWVtb3J5QmxvY2sgJk0sIHN0ZDo6c3RyaW5nICpFcnJNc2cpIHsNCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19hcm1fXykNCisgIGlmIChNLkFkZHJlc3MgPT0gMCB8fCBNLlNpemUgPT0gMCkgcmV0dXJuIGZhbHNlOw0KKyAgc3lzOjpNZW1vcnk6OkludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKE0uQWRkcmVzcywgTS5TaXplKTsNCisgIGtlcm5fcmV0dXJuX3Qga3IgPSB2bV9wcm90ZWN0KG1hY2hfdGFza19zZWxmKCksICh2bV9hZGRyZXNzX3QpTS5BZGRyZXNzLA0KKyAgICAodm1fc2l6ZV90KU0uU2l6ZSwgMCwgVk1fUFJPVF9SRUFEIHwgVk1fUFJPVF9FWEVDVVRFIHwgVk1fUFJPVF9DT1BZKTsNCisgIHJldHVybiBLRVJOX1NVQ0NFU1MgPT0ga3I7DQorI2Vsc2UNCisgIHJldHVybiBmYWxzZTsNCisjZW5kaWYNCit9DQorDQorYm9vbCBsbHZtOjpzeXM6Ok1lbW9yeTo6c2V0UmFuZ2VXcml0YWJsZShjb25zdCB2b2lkICpBZGRyLCBzaXplX3QgU2l6ZSkgew0KKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX2FybV9fKQ0KKyAga2Vybl9yZXR1cm5fdCBrciA9IHZtX3Byb3RlY3QobWFjaF90YXNrX3NlbGYoKSwgKHZtX2FkZHJlc3NfdClBZGRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZtX3NpemVfdClTaXplLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk1fUFJPVF9SRUFEIHwgVk1fUFJPVF9XUklURSk7DQorICByZXR1cm4gS0VSTl9TVUNDRVNTID09IGtyOw0KKyNlbHNlDQorICByZXR1cm4gdHJ1ZTsNCisjZW5kaWYNCit9DQorDQorYm9vbCBsbHZtOjpzeXM6Ok1lbW9yeTo6c2V0UmFuZ2VFeGVjdXRhYmxlKGNvbnN0IHZvaWQgKkFkZHIsIHNpemVfdCBTaXplKSB7DQorI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fYXJtX18pDQorICBrZXJuX3JldHVybl90IGtyID0gdm1fcHJvdGVjdChtYWNoX3Rhc2tfc2VsZigpLCAodm1fYWRkcmVzc190KUFkZHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm1fc2l6ZV90KVNpemUsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTV9QUk9UX1JFQUQgfCBWTV9QUk9UX0VYRUNVVEUgfCBWTV9QUk9UX0NPUFkpOw0KKyAgcmV0dXJuIEtFUk5fU1VDQ0VTUyA9PSBrcjsNCisjZWxzZQ0KKyAgcmV0dXJuIHRydWU7DQorI2VuZGlmDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9NdXRleC5pbmMgYi9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvTXV0ZXguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZjhlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvTXV0ZXguaW5jCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LSBsbHZtL1N5c3RlbS9Vbml4L011dGV4LmluYyAtIFVuaXggTXV0ZXggSW1wbGVtZW50YXRpb24gLS0tKi0gQysrIC0qLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgVW5peCBzcGVjaWZpYyAobm9uLXB0aHJlYWQpIE11dGV4IGNsYXNzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBVTklYIGNvZGUgdGhhdA0KKy8vPT09ICAgICAgICAgIGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiAqYWxsKiBVTklYIHZhcmlhbnRzLg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorbmFtZXNwYWNlIGxsdm0NCit7DQordXNpbmcgbmFtZXNwYWNlIHN5czsNCisNCitNdXRleEltcGw6Ok11dGV4SW1wbCggYm9vbCByZWN1cnNpdmUpDQorew0KK30NCisNCitNdXRleEltcGw6On5NdXRleEltcGwoKQ0KK3sNCit9DQorDQorYm9vbCANCitNdXRleEltcGw6OnJlbGVhc2UoKQ0KK3sNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIA0KK011dGV4SW1wbDo6dHJ5YWNxdWlyZSggdm9pZCApDQorew0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvUGF0aC5pbmMgYi9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvUGF0aC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmNWI3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9QYXRoLmluYwpAQCAtMCwwICsxLDkyMyBAQAorLy89PT0tIGxsdm0vU3lzdGVtL1VuaXgvUGF0aC5jcHAgLSBVbml4IFBhdGggSW1wbGVtZW50YXRpb24gLS0tLS0qLSBDKysgLSotPT09Ly8NCisvLw0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgVW5peCBzcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBQYXRoIGNsYXNzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBVTklYIGNvZGUgdGhhdA0KKy8vPT09ICAgICAgICAgIGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiAqYWxsKiBVTklYIHZhcmlhbnRzLg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorI2luY2x1ZGUgIlVuaXguaCINCisjaWYgSEFWRV9TWVNfU1RBVF9IDQorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+DQorI2VuZGlmDQorI2lmIEhBVkVfRkNOVExfSA0KKyNpbmNsdWRlIDxmY250bC5oPg0KKyNlbmRpZg0KKyNpZmRlZiBIQVZFX1NZU19NTUFOX0gNCisjaW5jbHVkZSA8c3lzL21tYW4uaD4NCisjZW5kaWYNCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9IDQorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+DQorI2VuZGlmDQorI2lmIEhBVkVfVVRJTUVfSA0KKyNpbmNsdWRlIDx1dGltZS5oPg0KKyNlbmRpZg0KKyNpZiBIQVZFX1RJTUVfSA0KKyNpbmNsdWRlIDx0aW1lLmg+DQorI2VuZGlmDQorI2lmIEhBVkVfRElSRU5UX0gNCisjIGluY2x1ZGUgPGRpcmVudC5oPg0KKyMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIHN0cmxlbigoZGlyZW50KS0+ZF9uYW1lKQ0KKyNlbHNlDQorIyBkZWZpbmUgZGlyZW50IGRpcmVjdA0KKyMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIChkaXJlbnQpLT5kX25hbWxlbg0KKyMgaWYgSEFWRV9TWVNfTkRJUl9IDQorIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4NCisjIGVuZGlmDQorIyBpZiBIQVZFX1NZU19ESVJfSA0KKyMgIGluY2x1ZGUgPHN5cy9kaXIuaD4NCisjIGVuZGlmDQorIyBpZiBIQVZFX05ESVJfSA0KKyMgIGluY2x1ZGUgPG5kaXIuaD4NCisjIGVuZGlmDQorI2VuZGlmDQorDQorI2lmIEhBVkVfRExGQ05fSA0KKyNpbmNsdWRlIDxkbGZjbi5oPg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfX0FQUExFX18NCisjaW5jbHVkZSA8bWFjaC1vL2R5bGQuaD4NCisjZW5kaWYNCisNCisvLyBQdXQgaW4gYSBoYWNrIGZvciBDeWd3aW4gd2hpY2ggZmFsc2VseSByZXBvcnRzIHRoYXQgdGhlIG1rZHRlbXAgZnVuY3Rpb24NCisvLyBpcyBhdmFpbGFibGUgd2hlbiBpdCBpcyBub3QuDQorI2lmZGVmIF9fQ1lHV0lOX18NCisjIHVuZGVmIEhBVkVfTUtEVEVNUA0KKyNlbmRpZg0KKw0KK25hbWVzcGFjZSB7DQoraW5saW5lIGJvb2wgbGFzdElzU2xhc2goY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsNCisgIHJldHVybiAhcGF0aC5lbXB0eSgpICYmIHBhdGhbcGF0aC5sZW5ndGgoKSAtIDFdID09ICcvJzsNCit9DQorDQorfQ0KKw0KK25hbWVzcGFjZSBsbHZtIHsNCit1c2luZyBuYW1lc3BhY2Ugc3lzOw0KKw0KK2NvbnN0IGNoYXIgc3lzOjpQYXRoU2VwYXJhdG9yID0gJzonOw0KKw0KK1BhdGg6OlBhdGgoU3RyaW5nUmVmIHApDQorICA6IHBhdGgocCkge30NCisNCitQYXRoOjpQYXRoKGNvbnN0IGNoYXIgKlN0clN0YXJ0LCB1bnNpZ25lZCBTdHJMZW4pDQorICA6IHBhdGgoU3RyU3RhcnQsIFN0ckxlbikge30NCisNCitQYXRoJg0KK1BhdGg6Om9wZXJhdG9yPShTdHJpbmdSZWYgdGhhdCkgew0KKyAgcGF0aC5hc3NpZ24odGhhdC5kYXRhKCksIHRoYXQuc2l6ZSgpKTsNCisgIHJldHVybiAqdGhpczsNCit9DQorDQorYm9vbA0KK1BhdGg6OmlzVmFsaWQoKSBjb25zdCB7DQorICAvLyBDaGVjayBzb21lIG9idmlvdXMgdGhpbmdzDQorICBpZiAocGF0aC5lbXB0eSgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICByZXR1cm4gcGF0aC5sZW5ndGgoKSA8IE1BWFBBVEhMRU47DQorfQ0KKw0KK2Jvb2wNCitQYXRoOjppc0Fic29sdXRlKGNvbnN0IGNoYXIgKk5hbWVTdGFydCwgdW5zaWduZWQgTmFtZUxlbikgew0KKyAgYXNzZXJ0KE5hbWVTdGFydCk7DQorICBpZiAoTmFtZUxlbiA9PSAwKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICByZXR1cm4gTmFtZVN0YXJ0WzBdID09ICcvJzsNCit9DQorDQorYm9vbA0KK1BhdGg6OmlzQWJzb2x1dGUoKSBjb25zdCB7DQorICBpZiAocGF0aC5lbXB0eSgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICByZXR1cm4gcGF0aFswXSA9PSAnLyc7DQorfQ0KKw0KK3ZvaWQgUGF0aDo6bWFrZUFic29sdXRlKCkgew0KKyAgaWYgKGlzQWJzb2x1dGUoKSkNCisgICAgcmV0dXJuOw0KKw0KKyAgUGF0aCBDV0QgPSBQYXRoOjpHZXRDdXJyZW50RGlyZWN0b3J5KCk7DQorICBhc3NlcnQoQ1dELmlzQWJzb2x1dGUoKSAmJiAiR2V0Q3VycmVudERpcmVjdG9yeSByZXR1cm5lZCByZWxhdGl2ZSBwYXRoISIpOw0KKw0KKyAgQ1dELmFwcGVuZENvbXBvbmVudChwYXRoKTsNCisNCisgIHBhdGggPSBDV0Quc3RyKCk7DQorfQ0KKw0KK1BhdGgNCitQYXRoOjpHZXRSb290RGlyZWN0b3J5KCkgew0KKyAgUGF0aCByZXN1bHQ7DQorICByZXN1bHQuc2V0KCIvIik7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCitQYXRoDQorUGF0aDo6R2V0VGVtcG9yYXJ5RGlyZWN0b3J5KHN0ZDo6c3RyaW5nICpFcnJNc2cpIHsNCisjaWYgZGVmaW5lZChIQVZFX01LRFRFTVApDQorICAvLyBUaGUgYmVzdCB3YXkgaXMgd2l0aCBta2R0ZW1wIGJ1dCB0aGF0J3Mgbm90IGF2YWlsYWJsZSBvbiBtYW55IHN5c3RlbXMsDQorICAvLyBMaW51eCBhbmQgRnJlZUJTRCBoYXZlIGl0LiBPdGhlcnMgcHJvYmFibHkgd29uJ3QuDQorICBjaGFyIHBhdGhuYW1lW01BWFBBVEhMRU5dOw0KKyAgc3RyY3B5KHBhdGhuYW1lLCIvdG1wL2xsdm1fWFhYWFhYIik7DQorICBpZiAoMCA9PSBta2R0ZW1wKHBhdGhuYW1lKSkgew0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywNCisgICAgICBzdGQ6OnN0cmluZyhwYXRobmFtZSkgKyAiOiBjYW4ndCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSIpOw0KKyAgICByZXR1cm4gUGF0aCgpOw0KKyAgfQ0KKyAgUGF0aCByZXN1bHQ7DQorICByZXN1bHQuc2V0KHBhdGhuYW1lKTsNCisgIGFzc2VydChyZXN1bHQuaXNWYWxpZCgpICYmICJta2R0ZW1wIGRpZG4ndCBjcmVhdGUgYSB2YWxpZCBwYXRobmFtZSEiKTsNCisgIHJldHVybiByZXN1bHQ7DQorI2VsaWYgZGVmaW5lZChIQVZFX01LU1RFTVApDQorICAvLyBJZiBubyBta2R0ZW1wIGlzIGF2YWlsYWJsZSwgbWtzdGVtcCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZQ0KKyAgLy8gd2hpY2ggaXMgdGhlbiByZW1vdmVkIGFuZCBjcmVhdGVkIGFzIGEgZGlyZWN0b3J5LiBXZSBwcmVmZXIgdGhpcyBvdmVyDQorICAvLyBta3RlbXAgYmVjYXVzZSBvZiBta3RlbXAncyBpbmhlcmVudCBzZWN1cml0eSBhbmQgdGhyZWFkaW5nIHJpc2tzLiBXZSBzdGlsbA0KKyAgLy8gaGF2ZSBhIHNsaWdodCByYWNlIGNvbmRpdGlvbiBmcm9tIHRoZSB0aW1lIHRoZSB0ZW1wb3JhcnkgZmlsZSBpcyBjcmVhdGVkIHRvDQorICAvLyB0aGUgdGltZSBpdCBpcyByZS1jcmVhdGVkIGFzIGEgZGlyZWN0b3kuDQorICBjaGFyIHBhdGhuYW1lW01BWFBBVEhMRU5dOw0KKyAgc3RyY3B5KHBhdGhuYW1lLCAiL3RtcC9sbHZtX1hYWFhYWCIpOw0KKyAgaW50IGZkID0gMDsNCisgIGlmICgtMSA9PSAoZmQgPSBta3N0ZW1wKHBhdGhuYW1lKSkpIHsNCisgICAgTWFrZUVyck1zZyhFcnJNc2csDQorICAgICAgc3RkOjpzdHJpbmcocGF0aG5hbWUpICsgIjogY2FuJ3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkiKTsNCisgICAgcmV0dXJuIFBhdGgoKTsNCisgIH0NCisgIDo6Y2xvc2UoZmQpOw0KKyAgOjp1bmxpbmsocGF0aG5hbWUpOyAvLyBzdGFydCByYWNlIGNvbmRpdGlvbiwgaWdub3JlIGVycm9ycw0KKyAgaWYgKC0xID09IDo6bWtkaXIocGF0aG5hbWUsIFNfSVJXWFUpKSB7IC8vIGVuZCByYWNlIGNvbmRpdGlvbg0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywNCisgICAgICBzdGQ6OnN0cmluZyhwYXRobmFtZSkgKyAiOiBjYW4ndCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSIpOw0KKyAgICByZXR1cm4gUGF0aCgpOw0KKyAgfQ0KKyAgUGF0aCByZXN1bHQ7DQorICByZXN1bHQuc2V0KHBhdGhuYW1lKTsNCisgIGFzc2VydChyZXN1bHQuaXNWYWxpZCgpICYmICJta3N0ZW1wIGRpZG4ndCBjcmVhdGUgYSB2YWxpZCBwYXRobmFtZSEiKTsNCisgIHJldHVybiByZXN1bHQ7DQorI2VsaWYgZGVmaW5lZChIQVZFX01LVEVNUCkNCisgIC8vIElmIGEgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBta2R0ZW1wKDMpIG9yIG1rc3RlbXAoMykgYnV0IGl0IGRvZXMgaGF2ZQ0KKyAgLy8gbWt0ZW1wKDMpIHRoZW4gd2UnbGwgYXNzdW1lIHRoYXQgc3lzdGVtIChlLmcuIEFJWCkgaGFzIGEgcmVhc29uYWJsZQ0KKyAgLy8gaW1wbGVtZW50YXRpb24gb2YgbWt0ZW1wKDMpIGFuZCBkb2Vzbid0IGZvbGxvdyBCU0QgNC4zJ3MgbGVhZCBvZiByZXBsYWNpbmcNCisgIC8vIHRoZSBYWFhYWFggd2l0aCB0aGUgcGlkIG9mIHRoZSBwcm9jZXNzIGFuZCBhIGxldHRlci4gVGhhdCBsZWFkcyB0byBvbmx5DQorICAvLyB0d2VudHkgc2l4IHRlbXBvcmFyeSBmaWxlcyB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQuDQorICBjaGFyIHBhdGhuYW1lW01BWFBBVEhMRU5dOw0KKyAgc3RyY3B5KHBhdGhuYW1lLCAiL3RtcC9sbHZtX1hYWFhYWCIpOw0KKyAgY2hhciAqVG1wTmFtZSA9IDo6bWt0ZW1wKHBhdGhuYW1lKTsNCisgIGlmIChUbXBOYW1lID09IDApIHsNCisgICAgTWFrZUVyck1zZyhFcnJNc2csDQorICAgICAgc3RkOjpzdHJpbmcoVG1wTmFtZSkgKyAiOiBjYW4ndCBjcmVhdGUgdW5pcXVlIGRpcmVjdG9yeSBuYW1lIik7DQorICAgIHJldHVybiBQYXRoKCk7DQorICB9DQorICBpZiAoLTEgPT0gOjpta2RpcihUbXBOYW1lLCBTX0lSV1hVKSkgew0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywNCisgICAgICAgIHN0ZDo6c3RyaW5nKFRtcE5hbWUpICsgIjogY2FuJ3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkiKTsNCisgICAgcmV0dXJuIFBhdGgoKTsNCisgIH0NCisgIFBhdGggcmVzdWx0Ow0KKyAgcmVzdWx0LnNldChUbXBOYW1lKTsNCisgIGFzc2VydChyZXN1bHQuaXNWYWxpZCgpICYmICJta3RlbXAgZGlkbid0IGNyZWF0ZSBhIHZhbGlkIHBhdGhuYW1lISIpOw0KKyAgcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgLy8gVGhpcyBpcyB0aGUgd29yc3QgY2FzZSBpbXBsZW1lbnRhdGlvbi4gdGVtcG5hbSgzKSBsZWFrcyBtZW1vcnkgdW5sZXNzIGl0cw0KKyAgLy8gb24gYW4gU1ZJRDIgKG9yIGxhdGVyKSBzeXN0ZW0uIE9uIEJTRCA0LjMgaXQgbGVha3MuIHRtcG5hbSgzKSBoYXMgdGhyZWFkDQorICAvLyBpc3N1ZXMuIFRoZSBta3RlbXAoMykgZnVuY3Rpb24gZG9lc24ndCBoYXZlIGVub3VnaCB2YXJpYWJpbGl0eSBpbiB0aGUNCisgIC8vIHRlbXBvcmFyeSBuYW1lIGdlbmVyYXRlZC4gU28sIHdlIHByb3ZpZGUgb3VyIG93biBpbXBsZW1lbnRhdGlvbiB0aGF0DQorICAvLyBpbmNyZW1lbnRzIGFuIGludGVnZXIgZnJvbSBhIHJhbmRvbSBudW1iZXIgc2VlZGVkIGJ5IHRoZSBjdXJyZW50IHRpbWUuIFRoaXMNCisgIC8vIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgdW5pcXVlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBtYW55IGNvbGxpc2lvbnMgYmV0d2Vlbg0KKyAgLy8gcHJvY2Vzc2VzLiBHZW5lcmFsbHkgTExWTSBwcm9jZXNzZXMgZG9uJ3QgcnVuIHZlcnkgbG9uZyBhbmQgZG9uJ3QgdXNlIHZlcnkNCisgIC8vIG1hbnkgdGVtcG9yYXJ5IGZpbGVzIHNvIHRoaXMgc2hvdWxkbid0IGJlIGEgYmlnIGlzc3VlIGZvciBMTFZNLg0KKyAgc3RhdGljIHRpbWVfdCBudW0gPSA6OnRpbWUoMCk7DQorICBjaGFyIHBhdGhuYW1lW01BWFBBVEhMRU5dOw0KKyAgZG8gew0KKyAgICBudW0rKzsNCisgICAgc3ByaW50ZihwYXRobmFtZSwgIi90bXAvbGx2bV8lMDEwdSIsIHVuc2lnbmVkKG51bSkpOw0KKyAgfSB3aGlsZSAoIDAgPT0gYWNjZXNzKHBhdGhuYW1lLCBGX09LICkgKTsNCisgIGlmICgtMSA9PSA6Om1rZGlyKHBhdGhuYW1lLCBTX0lSV1hVKSkgew0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywNCisgICAgICBzdGQ6OnN0cmluZyhwYXRobmFtZSkgKyAiOiBjYW4ndCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSIpOw0KKyAgICByZXR1cm4gUGF0aCgpOw0KKyAgfQ0KKyAgUGF0aCByZXN1bHQ7DQorICByZXN1bHQuc2V0KHBhdGhuYW1lKTsNCisgIGFzc2VydChyZXN1bHQuaXNWYWxpZCgpICYmICJta3N0ZW1wIGRpZG4ndCBjcmVhdGUgYSB2YWxpZCBwYXRobmFtZSEiKTsNCisgIHJldHVybiByZXN1bHQ7DQorI2VuZGlmDQorfQ0KKw0KK3ZvaWQNCitQYXRoOjpHZXRTeXN0ZW1MaWJyYXJ5UGF0aHMoc3RkOjp2ZWN0b3I8c3lzOjpQYXRoPiYgUGF0aHMpIHsNCisjaWZkZWYgTFRETF9TSExJQlBBVEhfVkFSDQorICBjaGFyKiBlbnZfdmFyID0gZ2V0ZW52KExURExfU0hMSUJQQVRIX1ZBUik7DQorICBpZiAoZW52X3ZhciAhPSAwKSB7DQorICAgIGdldFBhdGhMaXN0KGVudl92YXIsUGF0aHMpOw0KKyAgfQ0KKyNlbmRpZg0KKyAgLy8gRklYTUU6IFNob3VsZCB0aGlzIGxvb2sgYXQgTERfTElCUkFSWV9QQVRIIHRvbz8NCisgIFBhdGhzLnB1c2hfYmFjayhzeXM6OlBhdGgoIi91c3IvbG9jYWwvbGliLyIpKTsNCisgIFBhdGhzLnB1c2hfYmFjayhzeXM6OlBhdGgoIi91c3IvWDExUjYvbGliLyIpKTsNCisgIFBhdGhzLnB1c2hfYmFjayhzeXM6OlBhdGgoIi91c3IvbGliLyIpKTsNCisgIFBhdGhzLnB1c2hfYmFjayhzeXM6OlBhdGgoIi9saWIvIikpOw0KK30NCisNCit2b2lkDQorUGF0aDo6R2V0Qml0Y29kZUxpYnJhcnlQYXRocyhzdGQ6OnZlY3RvcjxzeXM6OlBhdGg+JiBQYXRocykgew0KKyAgY2hhciAqIGVudl92YXIgPSBnZXRlbnYoIkxMVk1fTElCX1NFQVJDSF9QQVRIIik7DQorICBpZiAoZW52X3ZhciAhPSAwKSB7DQorICAgIGdldFBhdGhMaXN0KGVudl92YXIsUGF0aHMpOw0KKyAgfQ0KKyNpZmRlZiBMTFZNX0xJQkRJUg0KKyAgew0KKyAgICBQYXRoIHRtcFBhdGg7DQorICAgIGlmICh0bXBQYXRoLnNldChMTFZNX0xJQkRJUikpDQorICAgICAgaWYgKHRtcFBhdGguY2FuUmVhZCgpKQ0KKyAgICAgICAgUGF0aHMucHVzaF9iYWNrKHRtcFBhdGgpOw0KKyAgfQ0KKyNlbmRpZg0KKyAgR2V0U3lzdGVtTGlicmFyeVBhdGhzKFBhdGhzKTsNCit9DQorDQorUGF0aA0KK1BhdGg6OkdldExMVk1EZWZhdWx0Q29uZmlnRGlyKCkgew0KKyAgcmV0dXJuIFBhdGgoIi9ldGMvbGx2bS8iKTsNCit9DQorDQorUGF0aA0KK1BhdGg6OkdldFVzZXJIb21lRGlyZWN0b3J5KCkgew0KKyAgY29uc3QgY2hhciogaG9tZSA9IGdldGVudigiSE9NRSIpOw0KKyAgaWYgKGhvbWUpIHsNCisgICAgUGF0aCByZXN1bHQ7DQorICAgIGlmIChyZXN1bHQuc2V0KGhvbWUpKQ0KKyAgICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorICByZXR1cm4gR2V0Um9vdERpcmVjdG9yeSgpOw0KK30NCisNCitQYXRoDQorUGF0aDo6R2V0Q3VycmVudERpcmVjdG9yeSgpIHsNCisgIGNoYXIgcGF0aG5hbWVbTUFYUEFUSExFTl07DQorICBpZiAoIWdldGN3ZChwYXRobmFtZSxNQVhQQVRITEVOKSkgew0KKyAgICBhc3NlcnQgKGZhbHNlICYmICJDb3VsZCBub3QgcXVlcnkgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4iKTsNCisgICAgcmV0dXJuIFBhdGgoKTsNCisgIH0NCisNCisgIHJldHVybiBQYXRoKHBhdGhuYW1lKTsNCit9DQorDQorI2lmZGVmIF9fRnJlZUJTRF9fDQorc3RhdGljIGludA0KK3Rlc3RfZGlyKGNoYXIgYnVmW1BBVEhfTUFYXSwgY2hhciByZXRbUEFUSF9NQVhdLA0KKyAgICBjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKmJpbikNCit7DQorICBzdHJ1Y3Qgc3RhdCBzYjsNCisNCisgIHNucHJpbnRmKGJ1ZiwgUEFUSF9NQVgsICIlcy8vJXMiLCBkaXIsIGJpbik7DQorICBpZiAocmVhbHBhdGgoYnVmLCByZXQpID09IE5VTEwpDQorICAgIHJldHVybiAoMSk7DQorICBpZiAoc3RhdChidWYsICZzYikgIT0gMCkNCisgICAgcmV0dXJuICgxKTsNCisNCisgIHJldHVybiAoMCk7DQorfQ0KKw0KK3N0YXRpYyBjaGFyICoNCitnZXRwcm9ncGF0aChjaGFyIHJldFtQQVRIX01BWF0sIGNvbnN0IGNoYXIgKmJpbikNCit7DQorICBjaGFyICpwdiwgKnMsICp0LCBidWZbUEFUSF9NQVhdOw0KKw0KKyAgLyogRmlyc3QgYXBwcm9hY2g6IGFic29sdXRlIHBhdGguICovDQorICBpZiAoYmluWzBdID09ICcvJykgew0KKyAgICBpZiAodGVzdF9kaXIoYnVmLCByZXQsICIvIiwgYmluKSA9PSAwKQ0KKyAgICAgIHJldHVybiAocmV0KTsNCisgICAgcmV0dXJuIChOVUxMKTsNCisgIH0NCisNCisgIC8qIFNlY29uZCBhcHByb2FjaDogcmVsYXRpdmUgcGF0aC4gKi8NCisgIGlmIChzdHJjaHIoYmluLCAnLycpICE9IE5VTEwpIHsNCisgICAgaWYgKGdldGN3ZChidWYsIFBBVEhfTUFYKSA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiAoTlVMTCk7DQorICAgIGlmICh0ZXN0X2RpcihidWYsIHJldCwgYnVmLCBiaW4pID09IDApDQorICAgICAgcmV0dXJuIChyZXQpOw0KKyAgICByZXR1cm4gKE5VTEwpOw0KKyAgfQ0KKw0KKyAgLyogVGhpcmQgYXBwcm9hY2g6ICRQQVRIICovDQorICBpZiAoKHB2ID0gZ2V0ZW52KCJQQVRIIikpID09IE5VTEwpDQorICAgIHJldHVybiAoTlVMTCk7DQorICBzID0gcHYgPSBzdHJkdXAocHYpOw0KKyAgaWYgKHB2ID09IE5VTEwpDQorICAgIHJldHVybiAoTlVMTCk7DQorICB3aGlsZSAoKHQgPSBzdHJzZXAoJnMsICI6IikpICE9IE5VTEwpIHsNCisgICAgaWYgKHRlc3RfZGlyKGJ1ZiwgcmV0LCB0LCBiaW4pID09IDApIHsNCisgICAgICBmcmVlKHB2KTsNCisgICAgICByZXR1cm4gKHJldCk7DQorICAgIH0NCisgIH0NCisgIGZyZWUocHYpOw0KKyAgcmV0dXJuIChOVUxMKTsNCit9DQorI2VuZGlmIC8vIF9fRnJlZUJTRF9fDQorDQorLy8vIEdldE1haW5FeGVjdXRhYmxlIC0gUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBtYWluIGV4ZWN1dGFibGUsIGdpdmVuIHRoZQ0KKy8vLyB2YWx1ZSBvZiBhcmd2WzBdIGZyb20gcHJvZ3JhbSBzdGFydHVwLg0KK1BhdGggUGF0aDo6R2V0TWFpbkV4ZWN1dGFibGUoY29uc3QgY2hhciAqYXJndjAsIHZvaWQgKk1haW5BZGRyKSB7DQorI2lmIGRlZmluZWQoX19BUFBMRV9fKQ0KKyAgLy8gT24gT1MgWCB0aGUgZXhlY3V0YWJsZSBwYXRoIGlzIHNhdmVkIHRvIHRoZSBzdGFjayBieSBkeWxkLiBSZWFkaW5nIGl0DQorICAvLyBmcm9tIHRoZXJlIGlzIG11Y2ggZmFzdGVyIHRoYW4gY2FsbGluZyBkbGFkZHIsIGVzcGVjaWFsbHkgZm9yIGxhcmdlDQorICAvLyBiaW5hcmllcyB3aXRoIHN5bWJvbHMuDQorICBjaGFyIGV4ZV9wYXRoW01BWFBBVEhMRU5dOw0KKyAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihleGVfcGF0aCk7DQorICBpZiAoX05TR2V0RXhlY3V0YWJsZVBhdGgoZXhlX3BhdGgsICZzaXplKSA9PSAwKSB7DQorICAgIGNoYXIgbGlua19wYXRoW01BWFBBVEhMRU5dOw0KKyAgICBpZiAocmVhbHBhdGgoZXhlX3BhdGgsIGxpbmtfcGF0aCkpDQorICAgICAgcmV0dXJuIFBhdGgoc3RkOjpzdHJpbmcobGlua19wYXRoKSk7DQorICB9DQorI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykNCisgIGNoYXIgZXhlX3BhdGhbUEFUSF9NQVhdOw0KKw0KKyAgaWYgKGdldHByb2dwYXRoKGV4ZV9wYXRoLCBhcmd2MCkgIT0gTlVMTCkNCisgICAgcmV0dXJuIFBhdGgoc3RkOjpzdHJpbmcoZXhlX3BhdGgpKTsNCisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQ0KKyAgY2hhciBleGVfcGF0aFtNQVhQQVRITEVOXTsNCisgIHNzaXplX3QgbGVuID0gcmVhZGxpbmsoIi9wcm9jL3NlbGYvZXhlIiwgZXhlX3BhdGgsIHNpemVvZihleGVfcGF0aCkpOw0KKyAgaWYgKGxlbiA+PSAwKQ0KKyAgICByZXR1cm4gUGF0aChzdGQ6OnN0cmluZyhleGVfcGF0aCwgbGVuKSk7DQorI2VsaWYgZGVmaW5lZChIQVZFX0RMRkNOX0gpDQorICAvLyBVc2UgZGxhZGRyIHRvIGdldCBleGVjdXRhYmxlIHBhdGggaWYgYXZhaWxhYmxlLg0KKyAgRGxfaW5mbyBETEluZm87DQorICBpbnQgZXJyID0gZGxhZGRyKE1haW5BZGRyLCAmRExJbmZvKTsNCisgIGlmIChlcnIgPT0gMCkNCisgICAgcmV0dXJuIFBhdGgoKTsNCisNCisgIC8vIElmIHRoZSBmaWxlbmFtZSBpcyBhIHN5bWxpbmssIHdlIG5lZWQgdG8gcmVzb2x2ZSBhbmQgcmV0dXJuIHRoZSBsb2NhdGlvbiBvZg0KKyAgLy8gdGhlIGFjdHVhbCBleGVjdXRhYmxlLg0KKyAgY2hhciBsaW5rX3BhdGhbTUFYUEFUSExFTl07DQorICBpZiAocmVhbHBhdGgoRExJbmZvLmRsaV9mbmFtZSwgbGlua19wYXRoKSkNCisgICAgcmV0dXJuIFBhdGgoc3RkOjpzdHJpbmcobGlua19wYXRoKSk7DQorI2VuZGlmDQorICByZXR1cm4gUGF0aCgpOw0KK30NCisNCisNCitTdHJpbmdSZWYgUGF0aDo6Z2V0RGlybmFtZSgpIGNvbnN0IHsNCisgIHJldHVybiBnZXREaXJuYW1lQ2hhclNlcChwYXRoLCAiLyIpOw0KK30NCisNCitTdHJpbmdSZWYNCitQYXRoOjpnZXRCYXNlbmFtZSgpIGNvbnN0IHsNCisgIC8vIEZpbmQgdGhlIGxhc3Qgc2xhc2gNCisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBwYXRoLnJmaW5kKCcvJyk7DQorICBpZiAoc2xhc2ggPT0gc3RkOjpzdHJpbmc6Om5wb3MpDQorICAgIHNsYXNoID0gMDsNCisgIGVsc2UNCisgICAgc2xhc2grKzsNCisNCisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZG90ID0gcGF0aC5yZmluZCgnLicpOw0KKyAgaWYgKGRvdCA9PSBzdGQ6OnN0cmluZzo6bnBvcyB8fCBkb3QgPCBzbGFzaCkNCisgICAgcmV0dXJuIFN0cmluZ1JlZihwYXRoKS5zdWJzdHIoc2xhc2gpOw0KKyAgZWxzZQ0KKyAgICByZXR1cm4gU3RyaW5nUmVmKHBhdGgpLnN1YnN0cihzbGFzaCwgZG90IC0gc2xhc2gpOw0KK30NCisNCitTdHJpbmdSZWYNCitQYXRoOjpnZXRTdWZmaXgoKSBjb25zdCB7DQorICAvLyBGaW5kIHRoZSBsYXN0IHNsYXNoDQorICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHNsYXNoID0gcGF0aC5yZmluZCgnLycpOw0KKyAgaWYgKHNsYXNoID09IHN0ZDo6c3RyaW5nOjpucG9zKQ0KKyAgICBzbGFzaCA9IDA7DQorICBlbHNlDQorICAgIHNsYXNoKys7DQorDQorICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGRvdCA9IHBhdGgucmZpbmQoJy4nKTsNCisgIGlmIChkb3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwgZG90IDwgc2xhc2gpDQorICAgIHJldHVybiBTdHJpbmdSZWYoKTsNCisgIGVsc2UNCisgICAgcmV0dXJuIFN0cmluZ1JlZihwYXRoKS5zdWJzdHIoZG90ICsgMSk7DQorfQ0KKw0KK2Jvb2wgUGF0aDo6Z2V0TWFnaWNOdW1iZXIoc3RkOjpzdHJpbmcgJk1hZ2ljLCB1bnNpZ25lZCBsZW4pIGNvbnN0IHsNCisgIGFzc2VydChsZW4gPCAxMDI0ICYmICJSZXF1ZXN0IGZvciBtYWdpYyBzdHJpbmcgdG9vIGxvbmciKTsNCisgIGNoYXIgQnVmWzEwMjVdOw0KKyAgaW50IGZkID0gOjpvcGVuKHBhdGguY19zdHIoKSwgT19SRE9OTFkpOw0KKyAgaWYgKGZkIDwgMCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgc3NpemVfdCBieXRlc19yZWFkID0gOjpyZWFkKGZkLCBCdWYsIGxlbik7DQorICA6OmNsb3NlKGZkKTsNCisgIGlmIChzc2l6ZV90KGxlbikgIT0gYnl0ZXNfcmVhZCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgTWFnaWMuYXNzaWduKEJ1ZiwgbGVuKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sDQorUGF0aDo6ZXhpc3RzKCkgY29uc3Qgew0KKyAgcmV0dXJuIDAgPT0gYWNjZXNzKHBhdGguY19zdHIoKSwgRl9PSyApOw0KK30NCisNCitib29sDQorUGF0aDo6aXNEaXJlY3RvcnkoKSBjb25zdCB7DQorICBzdHJ1Y3Qgc3RhdCBidWY7DQorICBpZiAoMCAhPSBzdGF0KHBhdGguY19zdHIoKSwgJmJ1ZikpDQorICAgIHJldHVybiBmYWxzZTsNCisgIHJldHVybiBidWYuc3RfbW9kZSAmIFNfSUZESVIgPyB0cnVlIDogZmFsc2U7DQorfQ0KKw0KK2Jvb2wNCitQYXRoOjpjYW5SZWFkKCkgY29uc3Qgew0KKyAgcmV0dXJuIDAgPT0gYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSyk7DQorfQ0KKw0KK2Jvb2wNCitQYXRoOjpjYW5Xcml0ZSgpIGNvbnN0IHsNCisgIHJldHVybiAwID09IGFjY2VzcyhwYXRoLmNfc3RyKCksIFdfT0spOw0KK30NCisNCitib29sDQorUGF0aDo6aXNSZWd1bGFyRmlsZSgpIGNvbnN0IHsNCisgIC8vIEdldCB0aGUgc3RhdHVzIHNvIHdlIGNhbiBkZXRlcm1pbmUgaWYgaXQncyBhIGZpbGUgb3IgZGlyZWN0b3J5DQorICBzdHJ1Y3Qgc3RhdCBidWY7DQorDQorICBpZiAoMCAhPSBzdGF0KHBhdGguY19zdHIoKSwgJmJ1ZikpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIGlmIChTX0lTUkVHKGJ1Zi5zdF9tb2RlKSkNCisgICAgcmV0dXJuIHRydWU7DQorDQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wNCitQYXRoOjpjYW5FeGVjdXRlKCkgY29uc3Qgew0KKyAgaWYgKDAgIT0gYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSyB8IFhfT0sgKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgc3RydWN0IHN0YXQgYnVmOw0KKyAgaWYgKDAgIT0gc3RhdChwYXRoLmNfc3RyKCksICZidWYpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpZiAoIVNfSVNSRUcoYnVmLnN0X21vZGUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorU3RyaW5nUmVmDQorUGF0aDo6Z2V0TGFzdCgpIGNvbnN0IHsNCisgIC8vIEZpbmQgdGhlIGxhc3Qgc2xhc2gNCisgIHNpemVfdCBwb3MgPSBwYXRoLnJmaW5kKCcvJyk7DQorDQorICAvLyBIYW5kbGUgdGhlIGNvcm5lciBjYXNlcw0KKyAgaWYgKHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykNCisgICAgcmV0dXJuIHBhdGg7DQorDQorICAvLyBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBzbGFzaA0KKyAgaWYgKHBvcyA9PSBwYXRoLmxlbmd0aCgpLTEpIHsNCisgICAgLy8gRmluZCB0aGUgc2Vjb25kIHRvIGxhc3Qgc2xhc2gNCisgICAgc2l6ZV90IHBvczIgPSBwYXRoLnJmaW5kKCcvJywgcG9zLTEpOw0KKyAgICBpZiAocG9zMiA9PSBzdGQ6OnN0cmluZzo6bnBvcykNCisgICAgICByZXR1cm4gU3RyaW5nUmVmKHBhdGgpLnN1YnN0cigwLHBvcyk7DQorICAgIGVsc2UNCisgICAgICByZXR1cm4gU3RyaW5nUmVmKHBhdGgpLnN1YnN0cihwb3MyKzEscG9zLXBvczItMSk7DQorICB9DQorICAvLyBSZXR1cm4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdCBzbGFzaA0KKyAgcmV0dXJuIFN0cmluZ1JlZihwYXRoKS5zdWJzdHIocG9zKzEpOw0KK30NCisNCitjb25zdCBGaWxlU3RhdHVzICoNCitQYXRoV2l0aFN0YXR1czo6Z2V0RmlsZVN0YXR1cyhib29sIHVwZGF0ZSwgc3RkOjpzdHJpbmcgKkVyclN0cikgY29uc3Qgew0KKyAgaWYgKCFmc0lzVmFsaWQgfHwgdXBkYXRlKSB7DQorICAgIHN0cnVjdCBzdGF0IGJ1ZjsNCisgICAgaWYgKDAgIT0gc3RhdChwYXRoLmNfc3RyKCksICZidWYpKSB7DQorICAgICAgTWFrZUVyck1zZyhFcnJTdHIsIHBhdGggKyAiOiBjYW4ndCBnZXQgc3RhdHVzIG9mIGZpbGUiKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBzdGF0dXMuZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsNCisgICAgc3RhdHVzLm1vZFRpbWUuZnJvbUVwb2NoVGltZShidWYuc3RfbXRpbWUpOw0KKyAgICBzdGF0dXMubW9kZSA9IGJ1Zi5zdF9tb2RlOw0KKyAgICBzdGF0dXMudXNlciA9IGJ1Zi5zdF91aWQ7DQorICAgIHN0YXR1cy5ncm91cCA9IGJ1Zi5zdF9naWQ7DQorICAgIHN0YXR1cy51bmlxdWVJRCA9IHVpbnQ2NF90KGJ1Zi5zdF9pbm8pOw0KKyAgICBzdGF0dXMuaXNEaXIgID0gU19JU0RJUihidWYuc3RfbW9kZSk7DQorICAgIHN0YXR1cy5pc0ZpbGUgPSBTX0lTUkVHKGJ1Zi5zdF9tb2RlKTsNCisgICAgZnNJc1ZhbGlkID0gdHJ1ZTsNCisgIH0NCisgIHJldHVybiAmc3RhdHVzOw0KK30NCisNCitzdGF0aWMgYm9vbCBBZGRQZXJtaXNzaW9uQml0cyhjb25zdCBQYXRoICZGaWxlLCBpbnQgYml0cykgew0KKyAgLy8gR2V0IHRoZSB1bWFzayB2YWx1ZSBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgV2Ugd2FudCB0byB1c2UgaXQNCisgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGZpbGUncyBwZXJtaXNzaW9ucy4gU2luY2UgY2FsbGluZyB1bWFzaygpIHNldHMNCisgIC8vIHRoZSB1bWFzayBhbmQgcmV0dXJucyBpdHMgb2xkIHZhbHVlLCB3ZSBtdXN0IGNhbGwgaXQgYSBzZWNvbmQNCisgIC8vIHRpbWUgdG8gcmVzZXQgaXQgdG8gdGhlIHVzZXIncyBwcmVmZXJlbmNlLg0KKyAgaW50IG1hc2sgPSB1bWFzaygwNzc3KTsgLy8gVGhlIGFyZy4gdG8gdW1hc2sgaXMgYXJiaXRyYXJ5Lg0KKyAgdW1hc2sobWFzayk7ICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgdW1hc2suDQorDQorICAvLyBHZXQgdGhlIGZpbGUncyBjdXJyZW50IG1vZGUuDQorICBzdHJ1Y3Qgc3RhdCBidWY7DQorICBpZiAoMCAhPSBzdGF0KEZpbGUuY19zdHIoKSwgJmJ1ZikpDQorICAgIHJldHVybiBmYWxzZTsNCisgIC8vIENoYW5nZSB0aGUgZmlsZSB0byBoYXZlIHdoaWNoZXZlciBwZXJtaXNzaW9ucyBiaXRzIGZyb20gJ2JpdHMnDQorICAvLyB0aGF0IHRoZSB1bWFzayB3b3VsZCBub3QgZGlzYWJsZS4NCisgIGlmICgoY2htb2QoRmlsZS5jX3N0cigpLCAoYnVmLnN0X21vZGUgfCAoYml0cyAmIH5tYXNrKSkpKSA9PSAtMSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBQYXRoOjptYWtlUmVhZGFibGVPbkRpc2soc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgaWYgKCFBZGRQZXJtaXNzaW9uQml0cygqdGhpcywgMDQ0NCkpDQorICAgIHJldHVybiBNYWtlRXJyTXNnKEVyck1zZywgcGF0aCArICI6IGNhbid0IG1ha2UgZmlsZSByZWFkYWJsZSIpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIFBhdGg6Om1ha2VXcml0ZWFibGVPbkRpc2soc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgaWYgKCFBZGRQZXJtaXNzaW9uQml0cygqdGhpcywgMDIyMikpDQorICAgIHJldHVybiBNYWtlRXJyTXNnKEVyck1zZywgcGF0aCArICI6IGNhbid0IG1ha2UgZmlsZSB3cml0YWJsZSIpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIFBhdGg6Om1ha2VFeGVjdXRhYmxlT25EaXNrKHN0ZDo6c3RyaW5nKiBFcnJNc2cpIHsNCisgIGlmICghQWRkUGVybWlzc2lvbkJpdHMoKnRoaXMsIDAxMTEpKQ0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIHBhdGggKyAiOiBjYW4ndCBtYWtlIGZpbGUgZXhlY3V0YWJsZSIpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorUGF0aDo6Z2V0RGlyZWN0b3J5Q29udGVudHMoc3RkOjpzZXQ8UGF0aD4mIHJlc3VsdCwgc3RkOjpzdHJpbmcqIEVyck1zZykgY29uc3Qgew0KKyAgRElSKiBkaXJlbnRyaWVzID0gOjpvcGVuZGlyKHBhdGguY19zdHIoKSk7DQorICBpZiAoZGlyZW50cmllcyA9PSAwKQ0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIHBhdGggKyAiOiBjYW4ndCBvcGVuIGRpcmVjdG9yeSIpOw0KKw0KKyAgc3RkOjpzdHJpbmcgZGlyUGF0aCA9IHBhdGg7DQorICBpZiAoIWxhc3RJc1NsYXNoKGRpclBhdGgpKQ0KKyAgICBkaXJQYXRoICs9ICcvJzsNCisNCisgIHJlc3VsdC5jbGVhcigpOw0KKyAgc3RydWN0IGRpcmVudCogZGUgPSA6OnJlYWRkaXIoZGlyZW50cmllcyk7DQorICBmb3IgKCA7IGRlICE9IDA7IGRlID0gOjpyZWFkZGlyKGRpcmVudHJpZXMpKSB7DQorICAgIGlmIChkZS0+ZF9uYW1lWzBdICE9ICcuJykgew0KKyAgICAgIFBhdGggYVBhdGgoZGlyUGF0aCArIChjb25zdCBjaGFyKilkZS0+ZF9uYW1lKTsNCisgICAgICBzdHJ1Y3Qgc3RhdCBzdDsNCisgICAgICBpZiAoMCAhPSBsc3RhdChhUGF0aC5wYXRoLmNfc3RyKCksICZzdCkpIHsNCisgICAgICAgIGlmIChTX0lTTE5LKHN0LnN0X21vZGUpKQ0KKyAgICAgICAgICBjb250aW51ZTsgLy8gZGFuZ2xpbmcgc3ltbGluayAtLSBpZ25vcmUNCisgICAgICAgIHJldHVybiBNYWtlRXJyTXNnKEVyck1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFQYXRoLnBhdGggKyAgIjogY2FuJ3QgZGV0ZXJtaW5lIGZpbGUgb2JqZWN0IHR5cGUiKTsNCisgICAgICB9DQorICAgICAgcmVzdWx0Lmluc2VydChhUGF0aCk7DQorICAgIH0NCisgIH0NCisNCisgIGNsb3NlZGlyKGRpcmVudHJpZXMpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorUGF0aDo6c2V0KFN0cmluZ1JlZiBhX3BhdGgpIHsNCisgIGlmIChhX3BhdGguZW1wdHkoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgc3RkOjpzdHJpbmcgc2F2ZShwYXRoKTsNCisgIHBhdGggPSBhX3BhdGg7DQorICBpZiAoIWlzVmFsaWQoKSkgew0KKyAgICBwYXRoID0gc2F2ZTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wNCitQYXRoOjphcHBlbmRDb21wb25lbnQoU3RyaW5nUmVmIG5hbWUpIHsNCisgIGlmIChuYW1lLmVtcHR5KCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIHN0ZDo6c3RyaW5nIHNhdmUocGF0aCk7DQorICBpZiAoIWxhc3RJc1NsYXNoKHBhdGgpKQ0KKyAgICBwYXRoICs9ICcvJzsNCisgIHBhdGggKz0gbmFtZTsNCisgIGlmICghaXNWYWxpZCgpKSB7DQorICAgIHBhdGggPSBzYXZlOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbA0KK1BhdGg6OmVyYXNlQ29tcG9uZW50KCkgew0KKyAgc2l6ZV90IHNsYXNocG9zID0gcGF0aC5yZmluZCgnLycscGF0aC5zaXplKCkpOw0KKyAgaWYgKHNsYXNocG9zID09IDAgfHwgc2xhc2hwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsNCisgICAgcGF0aC5lcmFzZSgpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGlmIChzbGFzaHBvcyA9PSBwYXRoLnNpemUoKSAtIDEpDQorICAgIHNsYXNocG9zID0gcGF0aC5yZmluZCgnLycsc2xhc2hwb3MtMSk7DQorICBpZiAoc2xhc2hwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsNCisgICAgcGF0aC5lcmFzZSgpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIHBhdGguZXJhc2Uoc2xhc2hwb3MpOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wNCitQYXRoOjphcHBlbmRTdWZmaXgoU3RyaW5nUmVmIHN1ZmZpeCkgew0KKyAgc3RkOjpzdHJpbmcgc2F2ZShwYXRoKTsNCisgIHBhdGguYXBwZW5kKCIuIik7DQorICBwYXRoLmFwcGVuZChzdWZmaXgpOw0KKyAgaWYgKCFpc1ZhbGlkKCkpIHsNCisgICAgcGF0aCA9IHNhdmU7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sDQorUGF0aDo6ZXJhc2VTdWZmaXgoKSB7DQorICBzdGQ6OnN0cmluZyBzYXZlID0gcGF0aDsNCisgIHNpemVfdCBkb3Rwb3MgPSBwYXRoLnJmaW5kKCcuJyxwYXRoLnNpemUoKSk7DQorICBzaXplX3Qgc2xhc2hwb3MgPSBwYXRoLnJmaW5kKCcvJyxwYXRoLnNpemUoKSk7DQorICBpZiAoZG90cG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7DQorICAgIGlmIChzbGFzaHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcyB8fCBkb3Rwb3MgPiBzbGFzaHBvcysxKSB7DQorICAgICAgcGF0aC5lcmFzZShkb3Rwb3MsIHBhdGguc2l6ZSgpLWRvdHBvcyk7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgIH0NCisgIGlmICghaXNWYWxpZCgpKQ0KKyAgICBwYXRoID0gc2F2ZTsNCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorc3RhdGljIGJvb2wgY3JlYXRlRGlyZWN0b3J5SGVscGVyKGNoYXIqIGJlZywgY2hhciogZW5kLCBib29sIGNyZWF0ZV9wYXJlbnRzKSB7DQorDQorICBpZiAoYWNjZXNzKGJlZywgUl9PSyB8IFdfT0spID09IDApDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIGlmIChjcmVhdGVfcGFyZW50cykgew0KKw0KKyAgICBjaGFyKiBjID0gZW5kOw0KKw0KKyAgICBmb3IgKDsgYyAhPSBiZWc7IC0tYykNCisgICAgICBpZiAoKmMgPT0gJy8nKSB7DQorDQorICAgICAgICAvLyBSZWN1cnNlIHRvIGhhbmRsaW5nIHRoZSBwYXJlbnQgZGlyZWN0b3J5Lg0KKyAgICAgICAgKmMgPSAnXDAnOw0KKyAgICAgICAgYm9vbCB4ID0gY3JlYXRlRGlyZWN0b3J5SGVscGVyKGJlZywgYywgY3JlYXRlX3BhcmVudHMpOw0KKyAgICAgICAgKmMgPSAnLyc7DQorDQorICAgICAgICAvLyBSZXR1cm4gaWYgd2UgZW5jb3VudGVyZWQgYW4gZXJyb3IuDQorICAgICAgICBpZiAoeCkNCisgICAgICAgICAgcmV0dXJuIHRydWU7DQorDQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICB9DQorDQorICByZXR1cm4gbWtkaXIoYmVnLCBTX0lSV1hVIHwgU19JUldYRykgIT0gMDsNCit9DQorDQorYm9vbA0KK1BhdGg6OmNyZWF0ZURpcmVjdG9yeU9uRGlzayggYm9vbCBjcmVhdGVfcGFyZW50cywgc3RkOjpzdHJpbmcqIEVyck1zZyApIHsNCisgIC8vIEdldCBhIHdyaXRlYWJsZSBjb3B5IG9mIHRoZSBwYXRoIG5hbWUNCisgIGNoYXIgcGF0aG5hbWVbTUFYUEFUSExFTl07DQorICBwYXRoLmNvcHkocGF0aG5hbWUsTUFYUEFUSExFTik7DQorDQorICAvLyBOdWxsLXRlcm1pbmF0ZSB0aGUgbGFzdCBjb21wb25lbnQNCisgIHNpemVfdCBsYXN0Y2hhciA9IHBhdGgubGVuZ3RoKCkgLSAxIDsNCisNCisgIGlmIChwYXRobmFtZVtsYXN0Y2hhcl0gIT0gJy8nKQ0KKyAgICArK2xhc3RjaGFyOw0KKw0KKyAgcGF0aG5hbWVbbGFzdGNoYXJdID0gMDsNCisNCisgIGlmIChjcmVhdGVEaXJlY3RvcnlIZWxwZXIocGF0aG5hbWUsIHBhdGhuYW1lK2xhc3RjaGFyLCBjcmVhdGVfcGFyZW50cykpDQorICAgIHJldHVybiBNYWtlRXJyTXNnKEVyck1zZywNCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocGF0aG5hbWUpICsgIjogY2FuJ3QgY3JlYXRlIGRpcmVjdG9yeSIpOw0KKw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorUGF0aDo6Y3JlYXRlRmlsZU9uRGlzayhzdGQ6OnN0cmluZyogRXJyTXNnKSB7DQorICAvLyBDcmVhdGUgdGhlIGZpbGUNCisgIGludCBmZCA9IDo6Y3JlYXQocGF0aC5jX3N0cigpLCBTX0lSVVNSIHwgU19JV1VTUik7DQorICBpZiAoZmQgPCAwKQ0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIHBhdGggKyAiOiBjYW4ndCBjcmVhdGUgZmlsZSIpOw0KKyAgOjpjbG9zZShmZCk7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wNCitQYXRoOjpjcmVhdGVUZW1wb3JhcnlGaWxlT25EaXNrKGJvb2wgcmV1c2VfY3VycmVudCwgc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgLy8gTWFrZSB0aGlzIGludG8gYSB1bmlxdWUgZmlsZSBuYW1lDQorICBpZiAobWFrZVVuaXF1ZSggcmV1c2VfY3VycmVudCwgRXJyTXNnICkpDQorICAgIHJldHVybiB0cnVlOw0KKw0KKyAgLy8gY3JlYXRlIHRoZSBmaWxlDQorICBpbnQgZmQgPSA6Om9wZW4ocGF0aC5jX3N0cigpLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMsIDA2NjYpOw0KKyAgaWYgKGZkIDwgMCkNCisgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCBwYXRoICsgIjogY2FuJ3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIik7DQorICA6OmNsb3NlKGZkKTsNCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbA0KK1BhdGg6OmVyYXNlRnJvbURpc2soYm9vbCByZW1vdmVfY29udGVudHMsIHN0ZDo6c3RyaW5nICpFcnJTdHIpIGNvbnN0IHsNCisgIC8vIEdldCB0aGUgc3RhdHVzIHNvIHdlIGNhbiBkZXRlcm1pbmUgaWYgaXQncyBhIGZpbGUgb3IgZGlyZWN0b3J5Lg0KKyAgc3RydWN0IHN0YXQgYnVmOw0KKyAgaWYgKDAgIT0gc3RhdChwYXRoLmNfc3RyKCksICZidWYpKSB7DQorICAgIE1ha2VFcnJNc2coRXJyU3RyLCBwYXRoICsgIjogY2FuJ3QgZ2V0IHN0YXR1cyBvZiBmaWxlIik7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKw0KKyAgLy8gTm90ZTogdGhpcyBjaGVjayBjYXRjaGVzIHN0cmFuZ2Ugc2l0dWF0aW9ucy4gSW4gYWxsIGNhc2VzLCBMTFZNIHNob3VsZA0KKyAgLy8gb25seSBiZSBpbnZvbHZlZCBpbiB0aGUgY3JlYXRpb24gYW5kIGRlbGV0aW9uIG9mIHJlZ3VsYXIgZmlsZXMuICBUaGlzDQorICAvLyBjaGVjayBlbnN1cmVzIHRoYXQgd2hhdCB3ZSdyZSB0cnlpbmcgdG8gZXJhc2UgaXMgYSByZWd1bGFyIGZpbGUuIEl0DQorICAvLyBlZmZlY3RpdmVseSBwcmV2ZW50cyBMTFZNIGZyb20gZXJhc2luZyB0aGluZ3MgbGlrZSAvZGV2L251bGwsIGFueSBibG9jaw0KKyAgLy8gc3BlY2lhbCBmaWxlLCBvciBvdGhlciB0aGluZ3MgdGhhdCBhcmVuJ3QgInJlZ3VsYXIiIGZpbGVzLg0KKyAgaWYgKFNfSVNSRUcoYnVmLnN0X21vZGUpKSB7DQorICAgIGlmICh1bmxpbmsocGF0aC5jX3N0cigpKSAhPSAwKQ0KKyAgICAgIHJldHVybiBNYWtlRXJyTXNnKEVyclN0ciwgcGF0aCArICI6IGNhbid0IGRlc3Ryb3kgZmlsZSIpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoIVNfSVNESVIoYnVmLnN0X21vZGUpKSB7DQorICAgIGlmIChFcnJTdHIpICpFcnJTdHIgPSAibm90IGEgZmlsZSBvciBkaXJlY3RvcnkiOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisNCisgIGlmIChyZW1vdmVfY29udGVudHMpIHsNCisgICAgLy8gUmVjdXJzaXZlbHkgZGVzY2VuZCB0aGUgZGlyZWN0b3J5IHRvIHJlbW92ZSBpdHMgY29udGVudHMuDQorICAgIHN0ZDo6c3RyaW5nIGNtZCA9ICIvYmluL3JtIC1yZiAiICsgcGF0aDsNCisgICAgaWYgKHN5c3RlbShjbWQuY19zdHIoKSkgIT0gMCkgew0KKyAgICAgIE1ha2VFcnJNc2coRXJyU3RyLCBwYXRoICsgIjogZmFpbGVkIHRvIHJlY3Vyc2l2ZWx5IHJlbW92ZSBkaXJlY3RvcnkuIik7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgLy8gT3RoZXJ3aXNlLCB0cnkgdG8ganVzdCByZW1vdmUgdGhlIG9uZSBkaXJlY3RvcnkuDQorICBjaGFyIHBhdGhuYW1lW01BWFBBVEhMRU5dOw0KKyAgcGF0aC5jb3B5KHBhdGhuYW1lLCBNQVhQQVRITEVOKTsNCisgIHNpemVfdCBsYXN0Y2hhciA9IHBhdGgubGVuZ3RoKCkgLSAxOw0KKyAgaWYgKHBhdGhuYW1lW2xhc3RjaGFyXSA9PSAnLycpDQorICAgIHBhdGhuYW1lW2xhc3RjaGFyXSA9IDA7DQorICBlbHNlDQorICAgIHBhdGhuYW1lW2xhc3RjaGFyKzFdID0gMDsNCisNCisgIGlmIChybWRpcihwYXRobmFtZSkgIT0gMCkNCisgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyU3RyLA0KKyAgICAgIHN0ZDo6c3RyaW5nKHBhdGhuYW1lKSArICI6IGNhbid0IGVyYXNlIGRpcmVjdG9yeSIpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorUGF0aDo6cmVuYW1lUGF0aE9uRGlzayhjb25zdCBQYXRoJiBuZXdOYW1lLCBzdGQ6OnN0cmluZyogRXJyTXNnKSB7DQorICBpZiAoMCAhPSA6OnJlbmFtZShwYXRoLmNfc3RyKCksIG5ld05hbWUuY19zdHIoKSkpDQorICAgIHJldHVybiBNYWtlRXJyTXNnKEVyck1zZywgc3RkOjpzdHJpbmcoImNhbid0IHJlbmFtZSAnIikgKyBwYXRoICsgIicgYXMgJyIgKw0KKyAgICAgICAgICAgICAgIG5ld05hbWUuc3RyKCkgKyAiJyIpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorUGF0aDo6c2V0U3RhdHVzSW5mb09uRGlzayhjb25zdCBGaWxlU3RhdHVzICZzaSwgc3RkOjpzdHJpbmcgKkVyclN0cikgY29uc3Qgew0KKyAgc3RydWN0IHV0aW1idWYgdXRiOw0KKyAgdXRiLmFjdGltZSA9IHNpLm1vZFRpbWUudG9Qb3NpeFRpbWUoKTsNCisgIHV0Yi5tb2R0aW1lID0gdXRiLmFjdGltZTsNCisgIGlmICgwICE9IDo6dXRpbWUocGF0aC5jX3N0cigpLCZ1dGIpKQ0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJTdHIsIHBhdGggKyAiOiBjYW4ndCBzZXQgZmlsZSBtb2RpZmljYXRpb24gdGltZSIpOw0KKyAgaWYgKDAgIT0gOjpjaG1vZChwYXRoLmNfc3RyKCksc2kubW9kZSkpDQorICAgIHJldHVybiBNYWtlRXJyTXNnKEVyclN0ciwgcGF0aCArICI6IGNhbid0IHNldCBtb2RlIik7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wNCitzeXM6OkNvcHlGaWxlKGNvbnN0IHN5czo6UGF0aCAmRGVzdCwgY29uc3Qgc3lzOjpQYXRoICZTcmMsIHN0ZDo6c3RyaW5nKiBFcnJNc2cpew0KKyAgaW50IGluRmlsZSA9IC0xOw0KKyAgaW50IG91dEZpbGUgPSAtMTsNCisgIGluRmlsZSA9IDo6b3BlbihTcmMuY19zdHIoKSwgT19SRE9OTFkpOw0KKyAgaWYgKGluRmlsZSA9PSAtMSkNCisgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCBTcmMuc3RyKCkgKw0KKyAgICAgICI6IGNhbid0IG9wZW4gc291cmNlIGZpbGUgdG8gY29weSIpOw0KKw0KKyAgb3V0RmlsZSA9IDo6b3BlbihEZXN0LmNfc3RyKCksIE9fV1JPTkxZfE9fQ1JFQVQsIDA2NjYpOw0KKyAgaWYgKG91dEZpbGUgPT0gLTEpIHsNCisgICAgOjpjbG9zZShpbkZpbGUpOw0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIERlc3Quc3RyKCkgKw0KKyAgICAgICI6IGNhbid0IGNyZWF0ZSBkZXN0aW5hdGlvbiBmaWxlIGZvciBjb3B5Iik7DQorICB9DQorDQorICBjaGFyIEJ1ZmZlclsxNioxMDI0XTsNCisgIHdoaWxlIChzc2l6ZV90IEFtdCA9IDo6cmVhZChpbkZpbGUsIEJ1ZmZlciwgMTYqMTAyNCkpIHsNCisgICAgaWYgKEFtdCA9PSAtMSkgew0KKyAgICAgIGlmIChlcnJubyAhPSBFSU5UUiAmJiBlcnJubyAhPSBFQUdBSU4pIHsNCisgICAgICAgIDo6Y2xvc2UoaW5GaWxlKTsNCisgICAgICAgIDo6Y2xvc2Uob3V0RmlsZSk7DQorICAgICAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIFNyYy5zdHIoKSsiOiBjYW4ndCByZWFkIHNvdXJjZSBmaWxlIik7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNoYXIgKkJ1ZlB0ciA9IEJ1ZmZlcjsNCisgICAgICB3aGlsZSAoQW10KSB7DQorICAgICAgICBzc2l6ZV90IEFtdFdyaXR0ZW4gPSA6OndyaXRlKG91dEZpbGUsIEJ1ZlB0ciwgQW10KTsNCisgICAgICAgIGlmIChBbXRXcml0dGVuID09IC0xKSB7DQorICAgICAgICAgIGlmIChlcnJubyAhPSBFSU5UUiAmJiBlcnJubyAhPSBFQUdBSU4pIHsNCisgICAgICAgICAgICA6OmNsb3NlKGluRmlsZSk7DQorICAgICAgICAgICAgOjpjbG9zZShvdXRGaWxlKTsNCisgICAgICAgICAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIERlc3Quc3RyKCkgKw0KKyAgICAgICAgICAgICAgIjogY2FuJ3Qgd3JpdGUgZGVzdGluYXRpb24gZmlsZSIpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBBbXQgLT0gQW10V3JpdHRlbjsNCisgICAgICAgICAgQnVmUHRyICs9IEFtdFdyaXR0ZW47DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICA6OmNsb3NlKGluRmlsZSk7DQorICA6OmNsb3NlKG91dEZpbGUpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorUGF0aDo6bWFrZVVuaXF1ZShib29sIHJldXNlX2N1cnJlbnQsIHN0ZDo6c3RyaW5nKiBFcnJNc2cpIHsNCisgIGlmIChyZXVzZV9jdXJyZW50ICYmICFleGlzdHMoKSkNCisgICAgcmV0dXJuIGZhbHNlOyAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QgYWxyZWFkeSwganVzdCB1c2UgaXQhDQorDQorICAvLyBBcHBlbmQgYW4gWFhYWFhYIHBhdHRlcm4gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBmb3IgdXNlIHdpdGggbWtzdGVtcCwNCisgIC8vIG1rdGVtcCBvciBvdXIgb3duIGltcGxlbWVudGF0aW9uLg0KKyAgLy8gVGhpcyB1c2VzIHN0ZDo6dmVjdG9yIGluc3RlYWQgb2YgU21hbGxWZWN0b3IgdG8gYXZvaWQgYSBkZXBlbmRlbmNlIG9uDQorICAvLyBsaWJTdXBwb3J0LiBBbmQgcGVyZm9ybWFuY2UgaXNuJ3QgY3JpdGljYWwgaGVyZS4NCisgIHN0ZDo6dmVjdG9yPGNoYXI+IEJ1ZjsNCisgIEJ1Zi5yZXNpemUocGF0aC5zaXplKCkrOCk7DQorICBjaGFyICpGTkJ1ZmZlciA9ICZCdWZbMF07DQorICAgIHBhdGguY29weShGTkJ1ZmZlcixwYXRoLnNpemUoKSk7DQorICBpZiAoaXNEaXJlY3RvcnkoKSkNCisgICAgc3RyY3B5KEZOQnVmZmVyK3BhdGguc2l6ZSgpLCAiL1hYWFhYWCIpOw0KKyAgZWxzZQ0KKyAgICBzdHJjcHkoRk5CdWZmZXIrcGF0aC5zaXplKCksICItWFhYWFhYIik7DQorDQorI2lmIGRlZmluZWQoSEFWRV9NS1NURU1QKQ0KKyAgaW50IFRlbXBGRDsNCisgIGlmICgoVGVtcEZEID0gbWtzdGVtcChGTkJ1ZmZlcikpID09IC0xKQ0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIHBhdGggKyAiOiBjYW4ndCBtYWtlIHVuaXF1ZSBmaWxlbmFtZSIpOw0KKw0KKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byBob2xkIHRoZSB0ZW1wIGZpbGUgZGVzY3JpcHRvci4uLiB3ZSB3aWxsIHRydXN0IHRoYXQgbm8gb25lDQorICAvLyB3aWxsIG92ZXJ3cml0ZS9kZWxldGUgdGhlIGZpbGUgYmVmb3JlIHdlIGNhbiBvcGVuIGl0IGFnYWluLg0KKyAgY2xvc2UoVGVtcEZEKTsNCisNCisgIC8vIFNhdmUgdGhlIG5hbWUNCisgIHBhdGggPSBGTkJ1ZmZlcjsNCisjZWxpZiBkZWZpbmVkKEhBVkVfTUtURU1QKQ0KKyAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBta3N0ZW1wLCB1c2UgdGhlIG9sZCBhbmQgb2Jzb2xldGUgbWt0ZW1wIGZ1bmN0aW9uLg0KKyAgaWYgKG1rdGVtcChGTkJ1ZmZlcikgPT0gMCkNCisgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCBwYXRoICsgIjogY2FuJ3QgbWFrZSB1bmlxdWUgZmlsZW5hbWUiKTsNCisNCisgIC8vIFNhdmUgdGhlIG5hbWUNCisgIHBhdGggPSBGTkJ1ZmZlcjsNCisjZWxzZQ0KKyAgLy8gT2theSwgbG9va3MgbGlrZSB3ZSBoYXZlIHRvIGRvIGl0IGFsbCBieSBvdXIgbG9uZXNvbWUuDQorICBzdGF0aWMgdW5zaWduZWQgRkNvdW50ZXIgPSAwOw0KKyAgLy8gVHJ5IHRvIGluaXRpYWxpemUgd2l0aCB1bmlxdWUgdmFsdWUuDQorICBpZiAoRkNvdW50ZXIgPT0gMCkgRkNvdW50ZXIgPSAoKHVuc2lnbmVkKWdldHBpZCgpICYgMHhGRkZGKSA8PCA4Ow0KKyAgY2hhciogcG9zID0gc3Ryc3RyKEZOQnVmZmVyLCAiWFhYWFhYIik7DQorICBkbyB7DQorICAgIGlmICgrK0ZDb3VudGVyID4gMHhGRkZGRkYpIHsNCisgICAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csDQorICAgICAgICBwYXRoICsgIjogY2FuJ3QgbWFrZSB1bmlxdWUgZmlsZW5hbWU6IHRvbyBtYW55IGZpbGVzIik7DQorICAgIH0NCisgICAgc3ByaW50Zihwb3MsICIlMDZYIiwgRkNvdW50ZXIpOw0KKyAgICBwYXRoID0gRk5CdWZmZXI7DQorICB9IHdoaWxlIChleGlzdHMoKSk7DQorICAvLyBQT1NTSUJMRSBTRUNVUklUWSBCVUc6IEFuIGF0dGFja2VyIGNhbiBlYXNpbHkgZ3Vlc3MgdGhlIG5hbWUgYW5kIGV4cGxvaXQNCisgIC8vIExMVk0uDQorI2VuZGlmDQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2NvbnN0IGNoYXIgKlBhdGg6Ok1hcEluRmlsZVBhZ2VzKGludCBGRCwgdWludDY0X3QgRmlsZVNpemUpIHsNCisgIGludCBGbGFncyA9IE1BUF9QUklWQVRFOw0KKyNpZmRlZiBNQVBfRklMRQ0KKyAgRmxhZ3MgfD0gTUFQX0ZJTEU7DQorI2VuZGlmDQorICB2b2lkICpCYXNlUHRyID0gOjptbWFwKDAsIEZpbGVTaXplLCBQUk9UX1JFQUQsIEZsYWdzLCBGRCwgMCk7DQorICBpZiAoQmFzZVB0ciA9PSBNQVBfRkFJTEVEKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiAoY29uc3QgY2hhciopQmFzZVB0cjsNCit9DQorDQordm9pZCBQYXRoOjpVbk1hcEZpbGVQYWdlcyhjb25zdCBjaGFyICpCYXNlUHRyLCB1aW50NjRfdCBGaWxlU2l6ZSkgew0KKyAgOjptdW5tYXAoKHZvaWQqKUJhc2VQdHIsIEZpbGVTaXplKTsNCit9DQorDQorfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UNCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvUHJvY2Vzcy5pbmMgYi9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvUHJvY2Vzcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzOWE4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9Qcm9jZXNzLmluYwpAQCAtMCwwICsxLDI5NSBAQAorLy89PT0tIFVuaXgvUHJvY2Vzcy5jcHAgLSBVbml4IFByb2Nlc3MgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tIC0qLSBDKysgLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgZ2VuZXJpYyBVbml4IGltcGxlbWVudGF0aW9uIG9mIHRoZSBQcm9jZXNzIGNsYXNzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisjaW5jbHVkZSAiVW5peC5oIg0KKyNpZmRlZiBIQVZFX1NZU19USU1FX0gNCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4NCisjZW5kaWYNCisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSA0KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4NCisjZW5kaWYNCisvLyBEcmFnb25GbHkgQlNEIGhhcyBkZXByZWNhdGVkIDxtYWxsb2MuaD4gZm9yIDxzdGRsaWIuaD4gaW5zdGVhZCwNCisvLyAgVW5peC5oIGluY2x1ZGVzIHRoaXMgZm9yIHVzIGFscmVhZHkuDQorI2lmIGRlZmluZWQoSEFWRV9NQUxMT0NfSCkgJiYgIWRlZmluZWQoX19EcmFnb25GbHlfXykNCisjaW5jbHVkZSA8bWFsbG9jLmg+DQorI2VuZGlmDQorI2lmZGVmIEhBVkVfTUFMTE9DX01BTExPQ19IDQorI2luY2x1ZGUgPG1hbGxvYy9tYWxsb2MuaD4NCisjZW5kaWYNCisjaWZkZWYgSEFWRV9TWVNfSU9DVExfSA0KKyMgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPg0KKyNlbmRpZg0KKyNpZmRlZiBIQVZFX1RFUk1JT1NfSA0KKyMgIGluY2x1ZGUgPHRlcm1pb3MuaD4NCisjZW5kaWYNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBVTklYIGNvZGUgdGhhdA0KKy8vPT09ICAgICAgICAgIGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiAqYWxsKiBVTklYIHZhcmlhbnRzLg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQordXNpbmcgbmFtZXNwYWNlIGxsdm07DQordXNpbmcgbmFtZXNwYWNlIHN5czsNCisNCit1bnNpZ25lZCANCitQcm9jZXNzOjpHZXRQYWdlU2l6ZSgpIA0KK3sNCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKQ0KKyAgLy8gT24gQ3lnd2luLCBnZXRwYWdlc2l6ZSgpIHJldHVybnMgNjRrIGJ1dCB0aGUgcGFnZSBzaXplIGZvciB0aGUgcHVycG9zZXMgb2YNCisgIC8vIG1lbW9yeSBwcm90ZWN0aW9uIGFuZCBtbWFwKCkgaXMgNGsuDQorICAvLyBTZWUgaHR0cDovL3d3dy5jeWd3aW4uY29tL21sL2N5Z3dpbi8yMDA5LTAxL3RocmVhZHMuaHRtbCMwMDQ5Mg0KKyAgY29uc3QgaW50IHBhZ2Vfc2l6ZSA9IDB4MTAwMDsNCisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUUEFHRVNJWkUpDQorICBjb25zdCBpbnQgcGFnZV9zaXplID0gOjpnZXRwYWdlc2l6ZSgpOw0KKyNlbGlmIGRlZmluZWQoSEFWRV9TWVNDT05GKQ0KKyAgbG9uZyBwYWdlX3NpemUgPSA6OnN5c2NvbmYoX1NDX1BBR0VfU0laRSk7DQorI2Vsc2UNCisjd2FybmluZyBDYW5ub3QgZ2V0IHRoZSBwYWdlIHNpemUgb24gdGhpcyBtYWNoaW5lDQorI2VuZGlmDQorICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHBhZ2Vfc2l6ZSk7DQorfQ0KKw0KK3NpemVfdCBQcm9jZXNzOjpHZXRNYWxsb2NVc2FnZSgpIHsNCisjaWYgZGVmaW5lZChIQVZFX01BTExJTkZPKQ0KKyAgc3RydWN0IG1hbGxpbmZvIG1pOw0KKyAgbWkgPSA6Om1hbGxpbmZvKCk7DQorICByZXR1cm4gbWkudW9yZGJsa3M7DQorI2VsaWYgZGVmaW5lZChIQVZFX01BTExPQ19aT05FX1NUQVRJU1RJQ1MpICYmIGRlZmluZWQoSEFWRV9NQUxMT0NfTUFMTE9DX0gpDQorICBtYWxsb2Nfc3RhdGlzdGljc190IFN0YXRzOw0KKyAgbWFsbG9jX3pvbmVfc3RhdGlzdGljcyhtYWxsb2NfZGVmYXVsdF96b25lKCksICZTdGF0cyk7DQorICByZXR1cm4gU3RhdHMuc2l6ZV9pbl91c2U7ICAgLy8gZGFyd2luDQorI2VsaWYgZGVmaW5lZChIQVZFX1NCUkspDQorICAvLyBOb3RlIHRoaXMgaXMgb25seSBhbiBhcHByb3hpbWF0aW9uIGFuZCBtb3JlIGNsb3NlbHkgcmVzZW1ibGVzDQorICAvLyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgbWFsbGluZm8gaW4gdGhlIGFyZW5hIGZpZWxkLg0KKyAgc3RhdGljIGNoYXIgKlN0YXJ0T2ZNZW1vcnkgPSByZWludGVycHJldF9jYXN0PGNoYXIqPig6OnNicmsoMCkpOw0KKyAgY2hhciAqRW5kT2ZNZW1vcnkgPSAoY2hhciopc2JyaygwKTsNCisgIGlmIChFbmRPZk1lbW9yeSAhPSAoKGNoYXIqKS0xKSAmJiBTdGFydE9mTWVtb3J5ICE9ICgoY2hhciopLTEpKQ0KKyAgICByZXR1cm4gRW5kT2ZNZW1vcnkgLSBTdGFydE9mTWVtb3J5Ow0KKyAgZWxzZQ0KKyAgICByZXR1cm4gMDsNCisjZWxzZQ0KKyN3YXJuaW5nIENhbm5vdCBnZXQgbWFsbG9jIGluZm8gb24gdGhpcyBwbGF0Zm9ybQ0KKyAgcmV0dXJuIDA7DQorI2VuZGlmDQorfQ0KKw0KK3NpemVfdA0KK1Byb2Nlc3M6OkdldFRvdGFsTWVtb3J5VXNhZ2UoKQ0KK3sNCisjaWYgZGVmaW5lZChIQVZFX01BTExJTkZPKQ0KKyAgc3RydWN0IG1hbGxpbmZvIG1pID0gOjptYWxsaW5mbygpOw0KKyAgcmV0dXJuIG1pLnVvcmRibGtzICsgbWkuaGJsa2hkOw0KKyNlbGlmIGRlZmluZWQoSEFWRV9NQUxMT0NfWk9ORV9TVEFUSVNUSUNTKSAmJiBkZWZpbmVkKEhBVkVfTUFMTE9DX01BTExPQ19IKQ0KKyAgbWFsbG9jX3N0YXRpc3RpY3NfdCBTdGF0czsNCisgIG1hbGxvY196b25lX3N0YXRpc3RpY3MobWFsbG9jX2RlZmF1bHRfem9uZSgpLCAmU3RhdHMpOw0KKyAgcmV0dXJuIFN0YXRzLnNpemVfYWxsb2NhdGVkOyAgIC8vIGRhcndpbg0KKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRSVVNBR0UpICYmICFkZWZpbmVkKF9fSEFJS1VfXykNCisgIHN0cnVjdCBydXNhZ2UgdXNhZ2U7DQorICA6OmdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnVzYWdlKTsNCisgIHJldHVybiB1c2FnZS5ydV9tYXhyc3M7DQorI2Vsc2UNCisjd2FybmluZyBDYW5ub3QgZ2V0IHRvdGFsIG1lbW9yeSBzaXplIG9uIHRoaXMgcGxhdGZvcm0NCisgIHJldHVybiAwOw0KKyNlbmRpZg0KK30NCisNCit2b2lkDQorUHJvY2Vzczo6R2V0VGltZVVzYWdlKFRpbWVWYWx1ZSYgZWxhcHNlZCwgVGltZVZhbHVlJiB1c2VyX3RpbWUsIA0KKyAgICAgICAgICAgICAgICAgICAgICBUaW1lVmFsdWUmIHN5c190aW1lKQ0KK3sNCisgIGVsYXBzZWQgPSBUaW1lVmFsdWU6Om5vdygpOw0KKyNpZiBkZWZpbmVkKEhBVkVfR0VUUlVTQUdFKQ0KKyAgc3RydWN0IHJ1c2FnZSB1c2FnZTsNCisgIDo6Z2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmdXNhZ2UpOw0KKyAgdXNlcl90aW1lID0gVGltZVZhbHVlKCANCisgICAgc3RhdGljX2Nhc3Q8VGltZVZhbHVlOjpTZWNvbmRzVHlwZT4oIHVzYWdlLnJ1X3V0aW1lLnR2X3NlYyApLCANCisgICAgc3RhdGljX2Nhc3Q8VGltZVZhbHVlOjpOYW5vU2Vjb25kc1R5cGU+KCB1c2FnZS5ydV91dGltZS50dl91c2VjICogDQorICAgICAgVGltZVZhbHVlOjpOQU5PU0VDT05EU19QRVJfTUlDUk9TRUNPTkQgKSApOw0KKyAgc3lzX3RpbWUgPSBUaW1lVmFsdWUoIA0KKyAgICBzdGF0aWNfY2FzdDxUaW1lVmFsdWU6OlNlY29uZHNUeXBlPiggdXNhZ2UucnVfc3RpbWUudHZfc2VjICksIA0KKyAgICBzdGF0aWNfY2FzdDxUaW1lVmFsdWU6Ok5hbm9TZWNvbmRzVHlwZT4oIHVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMgKiANCisgICAgICBUaW1lVmFsdWU6Ok5BTk9TRUNPTkRTX1BFUl9NSUNST1NFQ09ORCApICk7DQorI2Vsc2UNCisjd2FybmluZyBDYW5ub3QgZ2V0IHVzYWdlIHRpbWVzIG9uIHRoaXMgcGxhdGZvcm0NCisgIHVzZXJfdGltZS5zZWNvbmRzKDApOw0KKyAgdXNlcl90aW1lLm1pY3Jvc2Vjb25kcygwKTsNCisgIHN5c190aW1lLnNlY29uZHMoMCk7DQorICBzeXNfdGltZS5taWNyb3NlY29uZHMoMCk7DQorI2VuZGlmDQorfQ0KKw0KK2ludCBQcm9jZXNzOjpHZXRDdXJyZW50VXNlcklkKCkgew0KKyAgcmV0dXJuIGdldHVpZCgpOw0KK30NCisNCitpbnQgUHJvY2Vzczo6R2V0Q3VycmVudEdyb3VwSWQoKSB7DQorICByZXR1cm4gZ2V0Z2lkKCk7DQorfQ0KKw0KKyNpZmRlZiBIQVZFX01BQ0hfTUFDSF9IDQorI2luY2x1ZGUgPG1hY2gvbWFjaC5oPg0KKyNlbmRpZg0KKw0KKy8vIFNvbWUgTExWTSBwcm9ncmFtcyBzdWNoIGFzIGJ1Z3BvaW50IHByb2R1Y2UgY29yZSBmaWxlcyBhcyBhIG5vcm1hbCBwYXJ0IG9mDQorLy8gdGhlaXIgb3BlcmF0aW9uLiBUbyBwcmV2ZW50IHRoZSBkaXNrIGZyb20gZmlsbGluZyB1cCwgdGhpcyBmdW5jdGlvbg0KKy8vIGRvZXMgd2hhdCdzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IHRoZWlyIGdlbmVyYXRpb24uDQordm9pZCBQcm9jZXNzOjpQcmV2ZW50Q29yZUZpbGVzKCkgew0KKyNpZiBIQVZFX1NFVFJMSU1JVA0KKyAgc3RydWN0IHJsaW1pdCBybGltOw0KKyAgcmxpbS5ybGltX2N1ciA9IHJsaW0ucmxpbV9tYXggPSAwOw0KKyAgc2V0cmxpbWl0KFJMSU1JVF9DT1JFLCAmcmxpbSk7DQorI2VuZGlmDQorDQorI2lmZGVmIEhBVkVfTUFDSF9NQUNIX0gNCisgIC8vIERpc2FibGUgY3Jhc2ggcmVwb3J0aW5nIG9uIE1hYyBPUyBYIDEwLjAtMTAuNA0KKw0KKyAgLy8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzZXQgb2YgZXhjZXB0aW9uIHBvcnRzIGZvciB0aGUgdGFzaw0KKyAgbWFjaF9tc2dfdHlwZV9udW1iZXJfdCBDb3VudCA9IDA7DQorICBleGNlcHRpb25fbWFza190IE9yaWdpbmFsTWFza3NbRVhDX1RZUEVTX0NPVU5UXTsNCisgIGV4Y2VwdGlvbl9wb3J0X3QgT3JpZ2luYWxQb3J0c1tFWENfVFlQRVNfQ09VTlRdOw0KKyAgZXhjZXB0aW9uX2JlaGF2aW9yX3QgT3JpZ2luYWxCZWhhdmlvcnNbRVhDX1RZUEVTX0NPVU5UXTsNCisgIHRocmVhZF9zdGF0ZV9mbGF2b3JfdCBPcmlnaW5hbEZsYXZvcnNbRVhDX1RZUEVTX0NPVU5UXTsNCisgIGtlcm5fcmV0dXJuX3QgZXJyID0gDQorICAgIHRhc2tfZ2V0X2V4Y2VwdGlvbl9wb3J0cyhtYWNoX3Rhc2tfc2VsZigpLCBFWENfTUFTS19BTEwsIE9yaWdpbmFsTWFza3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ291bnQsIE9yaWdpbmFsUG9ydHMsIE9yaWdpbmFsQmVoYXZpb3JzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZ2luYWxGbGF2b3JzKTsNCisgIGlmIChlcnIgPT0gS0VSTl9TVUNDRVNTKSB7DQorICAgIC8vIHJlcGxhY2UgZWFjaCB3aXRoIE1BQ0hfUE9SVF9OVUxMLg0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IENvdW50OyArK2kpDQorICAgICAgdGFza19zZXRfZXhjZXB0aW9uX3BvcnRzKG1hY2hfdGFza19zZWxmKCksIE9yaWdpbmFsTWFza3NbaV0sIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNIX1BPUlRfTlVMTCwgT3JpZ2luYWxCZWhhdmlvcnNbaV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdpbmFsRmxhdm9yc1tpXSk7DQorICB9DQorDQorICAvLyBEaXNhYmxlIGNyYXNoIHJlcG9ydGluZyBvbiBNYWMgT1MgWCAxMC41DQorICBzaWduYWwoU0lHQUJSVCwgX2V4aXQpOw0KKyAgc2lnbmFsKFNJR0lMTCwgIF9leGl0KTsNCisgIHNpZ25hbChTSUdGUEUsICBfZXhpdCk7DQorICBzaWduYWwoU0lHU0VHViwgX2V4aXQpOw0KKyAgc2lnbmFsKFNJR0JVUywgIF9leGl0KTsNCisjZW5kaWYNCit9DQorDQorYm9vbCBQcm9jZXNzOjpTdGFuZGFyZEluSXNVc2VySW5wdXQoKSB7DQorICByZXR1cm4gRmlsZURlc2NyaXB0b3JJc0Rpc3BsYXllZChTVERJTl9GSUxFTk8pOw0KK30NCisNCitib29sIFByb2Nlc3M6OlN0YW5kYXJkT3V0SXNEaXNwbGF5ZWQoKSB7DQorICByZXR1cm4gRmlsZURlc2NyaXB0b3JJc0Rpc3BsYXllZChTVERPVVRfRklMRU5PKTsNCit9DQorDQorYm9vbCBQcm9jZXNzOjpTdGFuZGFyZEVycklzRGlzcGxheWVkKCkgew0KKyAgcmV0dXJuIEZpbGVEZXNjcmlwdG9ySXNEaXNwbGF5ZWQoU1RERVJSX0ZJTEVOTyk7DQorfQ0KKw0KK2Jvb2wgUHJvY2Vzczo6RmlsZURlc2NyaXB0b3JJc0Rpc3BsYXllZChpbnQgZmQpIHsNCisjaWYgSEFWRV9JU0FUVFkNCisgIHJldHVybiBpc2F0dHkoZmQpOw0KKyNlbHNlDQorICAvLyBJZiB3ZSBkb24ndCBoYXZlIGlzYXR0eSwganVzdCByZXR1cm4gZmFsc2UuDQorICByZXR1cm4gZmFsc2U7DQorI2VuZGlmDQorfQ0KKw0KK3N0YXRpYyB1bnNpZ25lZCBnZXRDb2x1bW5zKGludCBGaWxlSUQpIHsNCisgIC8vIElmIENPTFVNTlMgaXMgZGVmaW5lZCBpbiB0aGUgZW52aXJvbm1lbnQsIHdyYXAgdG8gdGhhdCBtYW55IGNvbHVtbnMuDQorICBpZiAoY29uc3QgY2hhciAqQ29sdW1uc1N0ciA9IHN0ZDo6Z2V0ZW52KCJDT0xVTU5TIikpIHsNCisgICAgaW50IENvbHVtbnMgPSBzdGQ6OmF0b2koQ29sdW1uc1N0cik7DQorICAgIGlmIChDb2x1bW5zID4gMCkNCisgICAgICByZXR1cm4gQ29sdW1uczsNCisgIH0NCisNCisgIHVuc2lnbmVkIENvbHVtbnMgPSAwOw0KKw0KKyNpZiBkZWZpbmVkKEhBVkVfU1lTX0lPQ1RMX0gpICYmIGRlZmluZWQoSEFWRV9URVJNSU9TX0gpDQorICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSB3aWR0aCBvZiB0aGUgdGVybWluYWwuDQorICBzdHJ1Y3Qgd2luc2l6ZSB3czsNCisgIGlmIChpb2N0bChGaWxlSUQsIFRJT0NHV0lOU1osICZ3cykgPT0gMCkNCisgICAgQ29sdW1ucyA9IHdzLndzX2NvbDsNCisjZW5kaWYNCisNCisgIHJldHVybiBDb2x1bW5zOw0KK30NCisNCit1bnNpZ25lZCBQcm9jZXNzOjpTdGFuZGFyZE91dENvbHVtbnMoKSB7DQorICBpZiAoIVN0YW5kYXJkT3V0SXNEaXNwbGF5ZWQoKSkNCisgICAgcmV0dXJuIDA7DQorDQorICByZXR1cm4gZ2V0Q29sdW1ucygxKTsNCit9DQorDQordW5zaWduZWQgUHJvY2Vzczo6U3RhbmRhcmRFcnJDb2x1bW5zKCkgew0KKyAgaWYgKCFTdGFuZGFyZEVycklzRGlzcGxheWVkKCkpDQorICAgIHJldHVybiAwOw0KKw0KKyAgcmV0dXJuIGdldENvbHVtbnMoMik7DQorfQ0KKw0KK3N0YXRpYyBib29sIHRlcm1pbmFsSGFzQ29sb3JzKCkgew0KKyAgaWYgKGNvbnN0IGNoYXIgKnRlcm0gPSBzdGQ6OmdldGVudigiVEVSTSIpKSB7DQorICAgIC8vIE1vc3QgbW9kZXJuIHRlcm1pbmFscyBzdXBwb3J0IEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBmb3IgY29sb3JzLg0KKyAgICAvLyBXZSBjb3VsZCBjaGVjayB0ZXJtaW5mbywgb3IgaGF2ZSBhIGxpc3Qgb2Yga25vd24gdGVybXMgdGhhdCBzdXBwb3J0DQorICAgIC8vIGNvbG9ycywgYnV0IHRoYXQgd291bGQgYmUgb3ZlcmtpbGwuDQorICAgIC8vIFRoZSB1c2VyIGNhbiBhbHdheXMgYXNrIGZvciBubyBjb2xvcnMgYnkgc2V0dGluZyBURVJNIHRvIGR1bWIsIG9yDQorICAgIC8vIHVzaW5nIGEgY29tbWFuZGxpbmUgZmxhZy4NCisgICAgcmV0dXJuIHN0cmNtcCh0ZXJtLCAiZHVtYiIpICE9IDA7DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgUHJvY2Vzczo6U3RhbmRhcmRPdXRIYXNDb2xvcnMoKSB7DQorICBpZiAoIVN0YW5kYXJkT3V0SXNEaXNwbGF5ZWQoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIHRlcm1pbmFsSGFzQ29sb3JzKCk7DQorfQ0KKw0KK2Jvb2wgUHJvY2Vzczo6U3RhbmRhcmRFcnJIYXNDb2xvcnMoKSB7DQorICBpZiAoIVN0YW5kYXJkRXJySXNEaXNwbGF5ZWQoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIHRlcm1pbmFsSGFzQ29sb3JzKCk7DQorfQ0KKw0KK2Jvb2wgUHJvY2Vzczo6Q29sb3JOZWVkc0ZsdXNoKCkgew0KKyAgLy8gTm8sIHdlIHVzZSBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMuDQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KKyNkZWZpbmUgQ09MT1IoRkdCRywgQ09ERSwgQk9MRCkgIlwwMzNbMDsiIEJPTEQgRkdCRyBDT0RFICJtIg0KKw0KKyNkZWZpbmUgQUxMQ09MT1JTKEZHQkcsQk9MRCkge1wNCisgICAgQ09MT1IoRkdCRywgIjAiLCBCT0xEKSxcDQorICAgIENPTE9SKEZHQkcsICIxIiwgQk9MRCksXA0KKyAgICBDT0xPUihGR0JHLCAiMiIsIEJPTEQpLFwNCisgICAgQ09MT1IoRkdCRywgIjMiLCBCT0xEKSxcDQorICAgIENPTE9SKEZHQkcsICI0IiwgQk9MRCksXA0KKyAgICBDT0xPUihGR0JHLCAiNSIsIEJPTEQpLFwNCisgICAgQ09MT1IoRkdCRywgIjYiLCBCT0xEKSxcDQorICAgIENPTE9SKEZHQkcsICI3IiwgQk9MRClcDQorICB9DQorDQorc3RhdGljIGNvbnN0IGNoYXIgY29sb3Jjb2Rlc1syXVsyXVs4XVsxMF0gPSB7DQorIHsgQUxMQ09MT1JTKCIzIiwiIiksIEFMTENPTE9SUygiMyIsIjE7IikgfSwNCisgeyBBTExDT0xPUlMoIjQiLCIiKSwgQUxMQ09MT1JTKCI0IiwiMTsiKSB9DQorfTsNCisNCitjb25zdCBjaGFyICpQcm9jZXNzOjpPdXRwdXRDb2xvcihjaGFyIGNvZGUsIGJvb2wgYm9sZCwgYm9vbCBiZykgew0KKyAgcmV0dXJuIGNvbG9yY29kZXNbYmc/MTowXVtib2xkPzE6MF1bY29kZSY3XTsNCit9DQorDQorY29uc3QgY2hhciAqUHJvY2Vzczo6T3V0cHV0Qm9sZChib29sIGJnKSB7DQorICByZXR1cm4gIlwwMzNbMW0iOw0KK30NCisNCitjb25zdCBjaGFyICpQcm9jZXNzOjpSZXNldENvbG9yKCkgew0KKyAgcmV0dXJuICJcMDMzWzBtIjsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L1Byb2dyYW0uaW5jIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L1Byb2dyYW0uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTkyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvUHJvZ3JhbS5pbmMKQEAgLTAsMCArMSw0MDIgQEAKKy8vPT09LSBsbHZtL1N5c3RlbS9Vbml4L1Byb2dyYW0uY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8NCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFVuaXggc3BlY2lmaWMgcG9ydGlvbiBvZiB0aGUgUHJvZ3JhbSBjbGFzcy4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLz09PSBXQVJOSU5HOiBJbXBsZW1lbnRhdGlvbiBoZXJlIG11c3QgY29udGFpbiBvbmx5IGdlbmVyaWMgVU5JWCBjb2RlIHRoYXQNCisvLz09PSAgICAgICAgICBpcyBndWFyYW50ZWVkIHRvIHdvcmsgb24gKmFsbCogVU5JWCB2YXJpYW50cy4NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKyNpbmNsdWRlIDxsbHZtL0NvbmZpZy9jb25maWcuaD4NCisjaW5jbHVkZSAiVW5peC5oIg0KKyNpZiBIQVZFX1NZU19TVEFUX0gNCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4NCisjZW5kaWYNCisjaWYgSEFWRV9TWVNfUkVTT1VSQ0VfSA0KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4NCisjZW5kaWYNCisjaWYgSEFWRV9TSUdOQUxfSA0KKyNpbmNsdWRlIDxzaWduYWwuaD4NCisjZW5kaWYNCisjaWYgSEFWRV9GQ05UTF9IDQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2VuZGlmDQorI2lmZGVmIEhBVkVfUE9TSVhfU1BBV04NCisjaW5jbHVkZSA8c3Bhd24uaD4NCisjaWYgIWRlZmluZWQoX19BUFBMRV9fKQ0KKyAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOw0KKyNlbHNlDQorI2luY2x1ZGUgPGNydF9leHRlcm5zLmg+IC8vIF9OU0dldEVudmlyb24NCisjZW5kaWYNCisjZW5kaWYNCisNCituYW1lc3BhY2UgbGx2bSB7DQordXNpbmcgbmFtZXNwYWNlIHN5czsNCisNCitQcm9ncmFtOjpQcm9ncmFtKCkgOiBEYXRhXygwKSB7fQ0KKw0KK1Byb2dyYW06On5Qcm9ncmFtKCkge30NCisNCit1bnNpZ25lZCBQcm9ncmFtOjpHZXRQaWQoKSBjb25zdCB7DQorICB1aW50NjRfdCBwaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90PihEYXRhXyk7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHBpZCk7DQorfQ0KKw0KKy8vIFRoaXMgZnVuY3Rpb24ganVzdCB1c2VzIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGZpbmQgdGhlIHByb2dyYW0uDQorUGF0aA0KK1Byb2dyYW06OkZpbmRQcm9ncmFtQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9nTmFtZSkgew0KKw0KKyAgLy8gQ2hlY2sgc29tZSBkZWdlbmVyYXRlIGNhc2VzDQorICBpZiAocHJvZ05hbWUubGVuZ3RoKCkgPT0gMCkgLy8gbm8gcHJvZ3JhbQ0KKyAgICByZXR1cm4gUGF0aCgpOw0KKyAgUGF0aCB0ZW1wOw0KKyAgaWYgKCF0ZW1wLnNldChwcm9nTmFtZSkpIC8vIGludmFsaWQgbmFtZQ0KKyAgICByZXR1cm4gUGF0aCgpOw0KKyAgLy8gVXNlIHRoZSBnaXZlbiBwYXRoIHZlcmJhdGltIGlmIGl0IGNvbnRhaW5zIGFueSBzbGFzaGVzOyB0aGlzIG1hdGNoZXMNCisgIC8vIHRoZSBiZWhhdmlvciBvZiBzaCgxKSBhbmQgZnJpZW5kcy4NCisgIGlmIChwcm9nTmFtZS5maW5kKCcvJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpDQorICAgIHJldHVybiB0ZW1wOw0KKw0KKyAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGZpbGUgbmFtZSBkb2VzIG5vdCBjb250YWluIHNsYXNoZXMuIFNlYXJjaCBmb3IgaXQNCisgIC8vIHRocm91Z2ggdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4NCisNCisgIC8vIEdldCB0aGUgcGF0aC4gSWYgaXRzIGVtcHR5LCB3ZSBjYW4ndCBkbyBhbnl0aGluZyB0byBmaW5kIGl0Lg0KKyAgY29uc3QgY2hhciAqUGF0aFN0ciA9IGdldGVudigiUEFUSCIpOw0KKyAgaWYgKFBhdGhTdHIgPT0gMCkNCisgICAgcmV0dXJuIFBhdGgoKTsNCisNCisgIC8vIE5vdyB3ZSBoYXZlIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoOyB0cnkgdGhlbS4NCisgIHNpemVfdCBQYXRoTGVuID0gc3RybGVuKFBhdGhTdHIpOw0KKyAgd2hpbGUgKFBhdGhMZW4pIHsNCisgICAgLy8gRmluZCB0aGUgZmlyc3QgY29sb24uLi4NCisgICAgY29uc3QgY2hhciAqQ29sb24gPSBzdGQ6OmZpbmQoUGF0aFN0ciwgUGF0aFN0citQYXRoTGVuLCAnOicpOw0KKw0KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmaXJzdCBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGV4ZWN1dGFibGUuLi4NCisgICAgUGF0aCBGaWxlUGF0aDsNCisgICAgaWYgKEZpbGVQYXRoLnNldChzdGQ6OnN0cmluZyhQYXRoU3RyLENvbG9uKSkpIHsNCisgICAgICBGaWxlUGF0aC5hcHBlbmRDb21wb25lbnQocHJvZ05hbWUpOw0KKyAgICAgIGlmIChGaWxlUGF0aC5jYW5FeGVjdXRlKCkpDQorICAgICAgICByZXR1cm4gRmlsZVBhdGg7ICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCB0aGUgZXhlY3V0YWJsZSENCisgICAgfQ0KKw0KKyAgICAvLyBOb3BlIGl0IHdhc24ndCBpbiB0aGlzIGRpcmVjdG9yeSwgY2hlY2sgdGhlIG5leHQgcGF0aCBpbiB0aGUgbGlzdCENCisgICAgUGF0aExlbiAtPSBDb2xvbi1QYXRoU3RyOw0KKyAgICBQYXRoU3RyID0gQ29sb247DQorDQorICAgIC8vIEFkdmFuY2UgcGFzdCBkdXBsaWNhdGUgY29sb25zDQorICAgIHdoaWxlICgqUGF0aFN0ciA9PSAnOicpIHsNCisgICAgICBQYXRoU3RyKys7DQorICAgICAgUGF0aExlbi0tOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gUGF0aCgpOw0KK30NCisNCitzdGF0aWMgYm9vbCBSZWRpcmVjdElPKGNvbnN0IFBhdGggKlBhdGgsIGludCBGRCwgc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgaWYgKFBhdGggPT0gMCkgLy8gTm9vcA0KKyAgICByZXR1cm4gZmFsc2U7DQorICBjb25zdCBjaGFyICpGaWxlOw0KKyAgaWYgKFBhdGgtPmlzRW1wdHkoKSkNCisgICAgLy8gUmVkaXJlY3QgZW1wdHkgcGF0aHMgdG8gL2Rldi9udWxsDQorICAgIEZpbGUgPSAiL2Rldi9udWxsIjsNCisgIGVsc2UNCisgICAgRmlsZSA9IFBhdGgtPmNfc3RyKCk7DQorDQorICAvLyBPcGVuIHRoZSBmaWxlDQorICBpbnQgSW5GRCA9IG9wZW4oRmlsZSwgRkQgPT0gMCA/IE9fUkRPTkxZIDogT19XUk9OTFl8T19DUkVBVCwgMDY2Nik7DQorICBpZiAoSW5GRCA9PSAtMSkgew0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywgIkNhbm5vdCBvcGVuIGZpbGUgJyIgKyBzdGQ6OnN0cmluZyhGaWxlKSArICInIGZvciAiDQorICAgICAgICAgICAgICArIChGRCA9PSAwID8gImlucHV0IiA6ICJvdXRwdXQiKSk7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKw0KKyAgLy8gSW5zdGFsbCBpdCBhcyB0aGUgcmVxdWVzdGVkIEZEDQorICBpZiAoZHVwMihJbkZELCBGRCkgPT0gLTEpIHsNCisgICAgTWFrZUVyck1zZyhFcnJNc2csICJDYW5ub3QgZHVwMiIpOw0KKyAgICBjbG9zZShJbkZEKTsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorICBjbG9zZShJbkZEKTsgICAgICAvLyBDbG9zZSB0aGUgb3JpZ2luYWwgRkQNCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorI2lmZGVmIEhBVkVfUE9TSVhfU1BBV04NCitzdGF0aWMgYm9vbCBSZWRpcmVjdElPX1BTKGNvbnN0IFBhdGggKlBhdGgsIGludCBGRCwgc3RkOjpzdHJpbmcgKkVyck1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190ICZGaWxlQWN0aW9ucykgew0KKyAgaWYgKFBhdGggPT0gMCkgLy8gTm9vcA0KKyAgICByZXR1cm4gZmFsc2U7DQorICBjb25zdCBjaGFyICpGaWxlOw0KKyAgaWYgKFBhdGgtPmlzRW1wdHkoKSkNCisgICAgLy8gUmVkaXJlY3QgZW1wdHkgcGF0aHMgdG8gL2Rldi9udWxsDQorICAgIEZpbGUgPSAiL2Rldi9udWxsIjsNCisgIGVsc2UNCisgICAgRmlsZSA9IFBhdGgtPmNfc3RyKCk7DQorDQorICBpZiAoaW50IEVyciA9IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc19hZGRvcGVuKCZGaWxlQWN0aW9ucywgRkQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUsIEZEID09IDAgPyBPX1JET05MWSA6IE9fV1JPTkxZfE9fQ1JFQVQsIDA2NjYpKQ0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csICJDYW5ub3QgZHVwMiIsIEVycik7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKyNlbmRpZg0KKw0KK3N0YXRpYyB2b2lkIFRpbWVPdXRIYW5kbGVyKGludCBTaWcpIHsNCit9DQorDQorc3RhdGljIHZvaWQgU2V0TWVtb3J5TGltaXRzICh1bnNpZ25lZCBzaXplKQ0KK3sNCisjaWYgSEFWRV9TWVNfUkVTT1VSQ0VfSCAmJiBIQVZFX0dFVFJMSU1JVCAmJiBIQVZFX1NFVFJMSU1JVA0KKyAgc3RydWN0IHJsaW1pdCByOw0KKyAgX190eXBlb2ZfXyAoci5ybGltX2N1cikgbGltaXQgPSAoX190eXBlb2ZfXyAoci5ybGltX2N1cikpIChzaXplKSAqIDEwNDg1NzY7DQorDQorICAvLyBIZWFwIHNpemUNCisgIGdldHJsaW1pdCAoUkxJTUlUX0RBVEEsICZyKTsNCisgIHIucmxpbV9jdXIgPSBsaW1pdDsNCisgIHNldHJsaW1pdCAoUkxJTUlUX0RBVEEsICZyKTsNCisjaWZkZWYgUkxJTUlUX1JTUw0KKyAgLy8gUmVzaWRlbnQgc2V0IHNpemUuDQorICBnZXRybGltaXQgKFJMSU1JVF9SU1MsICZyKTsNCisgIHIucmxpbV9jdXIgPSBsaW1pdDsNCisgIHNldHJsaW1pdCAoUkxJTUlUX1JTUywgJnIpOw0KKyNlbmRpZg0KKyNpZmRlZiBSTElNSVRfQVMgIC8vIGUuZy4gTmV0QlNEIGRvZXNuJ3QgaGF2ZSBpdC4NCisgIC8vIFZpcnR1YWwgbWVtb3J5Lg0KKyAgZ2V0cmxpbWl0IChSTElNSVRfQVMsICZyKTsNCisgIHIucmxpbV9jdXIgPSBsaW1pdDsNCisgIHNldHJsaW1pdCAoUkxJTUlUX0FTLCAmcik7DQorI2VuZGlmDQorI2VuZGlmDQorfQ0KKw0KK2Jvb2wNCitQcm9ncmFtOjpFeGVjdXRlKGNvbnN0IFBhdGggJnBhdGgsIGNvbnN0IGNoYXIgKiphcmdzLCBjb25zdCBjaGFyICoqZW52cCwNCisgICAgICAgICAgICAgICAgIGNvbnN0IFBhdGggKipyZWRpcmVjdHMsIHVuc2lnbmVkIG1lbW9yeUxpbWl0LA0KKyAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJNc2cpIHsNCisgIC8vIElmIHRoaXMgT1MgaGFzIHBvc2l4X3NwYXduIGFuZCB0aGVyZSBpcyBubyBtZW1vcnkgbGltaXQgYmVpbmcgaW1wbGllZCwgdXNlDQorICAvLyBwb3NpeF9zcGF3bi4gIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gZm9yay9leGVjLg0KKyNpZmRlZiBIQVZFX1BPU0lYX1NQQVdODQorICBpZiAobWVtb3J5TGltaXQgPT0gMCkgew0KKyAgICBwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfdCBGaWxlQWN0aW9uczsNCisgICAgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2luaXQoJkZpbGVBY3Rpb25zKTsNCisNCisgICAgaWYgKHJlZGlyZWN0cykgew0KKyAgICAgIC8vIFJlZGlyZWN0IHN0ZGluL3N0ZG91dC4NCisgICAgICBpZiAoUmVkaXJlY3RJT19QUyhyZWRpcmVjdHNbMF0sIDAsIEVyck1zZywgRmlsZUFjdGlvbnMpIHx8DQorICAgICAgICAgIFJlZGlyZWN0SU9fUFMocmVkaXJlY3RzWzFdLCAxLCBFcnJNc2csIEZpbGVBY3Rpb25zKSkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAocmVkaXJlY3RzWzFdID09IDAgfHwgcmVkaXJlY3RzWzJdID09IDAgfHwNCisgICAgICAgICAgKnJlZGlyZWN0c1sxXSAhPSAqcmVkaXJlY3RzWzJdKSB7DQorICAgICAgICAvLyBKdXN0IHJlZGlyZWN0IHN0ZGVycg0KKyAgICAgICAgaWYgKFJlZGlyZWN0SU9fUFMocmVkaXJlY3RzWzJdLCAyLCBFcnJNc2csIEZpbGVBY3Rpb25zKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIH0gZWxzZSB7ICAgICAgIA0KKyAgICAgICAgLy8gSWYgc3Rkb3V0IGFuZCBzdGRlcnIgc2hvdWxkIGdvIHRvIHRoZSBzYW1lIHBsYWNlLCByZWRpcmVjdCBzdGRlcnINCisgICAgICAgIC8vIHRvIHRoZSBGRCBhbHJlYWR5IG9wZW4gZm9yIHN0ZG91dC4NCisgICAgICAgIGlmIChpbnQgRXJyID0gcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2FkZGR1cDIoJkZpbGVBY3Rpb25zLCAxLCAyKSkNCisgICAgICAgICAgcmV0dXJuICFNYWtlRXJyTXNnKEVyck1zZywgIkNhbid0IHJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQiLCBFcnIpOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAoIWVudnApDQorI2lmICFkZWZpbmVkKF9fQVBQTEVfXykNCisgICAgICBlbnZwID0gY29uc3RfY2FzdDxjb25zdCBjaGFyICoqPihlbnZpcm9uKTsNCisjZWxzZQ0KKyAgICAgIC8vIGVudmlyb24gaXMgbWlzc2luZyBpbiBkeWxpYnMuDQorICAgICAgZW52cCA9IGNvbnN0X2Nhc3Q8Y29uc3QgY2hhciAqKj4oKl9OU0dldEVudmlyb24oKSk7DQorI2VuZGlmDQorDQorICAgIHBpZF90IFBJRDsNCisgICAgaW50IEVyciA9IHBvc2l4X3NwYXduKCZQSUQsIHBhdGguY19zdHIoKSwgJkZpbGVBY3Rpb25zLCAvKmF0dHJwKi8wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyICoqPihhcmdzKSwgY29uc3RfY2FzdDxjaGFyICoqPihlbnZwKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2Rlc3Ryb3koJkZpbGVBY3Rpb25zKTsNCisNCisgICAgaWYgKEVycikNCisgICAgIHJldHVybiAhTWFrZUVyck1zZyhFcnJNc2csICJwb3NpeF9zcGF3biBmYWlsZWQiLCBFcnIpOw0KKyAgICAgIA0KKyAgICBEYXRhXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KFBJRCk7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyNlbmRpZg0KKyAgDQorICBpZiAoIXBhdGguY2FuRXhlY3V0ZSgpKSB7DQorICAgIGlmIChFcnJNc2cpDQorICAgICAgKkVyck1zZyA9IHBhdGguc3RyKCkgKyAiIGlzIG5vdCBleGVjdXRhYmxlIjsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgLy8gQ3JlYXRlIGEgY2hpbGQgcHJvY2Vzcy4NCisgIGludCBjaGlsZCA9IGZvcmsoKTsNCisgIHN3aXRjaCAoY2hpbGQpIHsNCisgICAgLy8gQW4gZXJyb3Igb2NjdXJlZDogIFJldHVybiB0byB0aGUgY2FsbGVyLg0KKyAgICBjYXNlIC0xOg0KKyAgICAgIE1ha2VFcnJNc2coRXJyTXNnLCAiQ291bGRuJ3QgZm9yayIpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisNCisgICAgLy8gQ2hpbGQgcHJvY2VzczogRXhlY3V0ZSB0aGUgcHJvZ3JhbS4NCisgICAgY2FzZSAwOiB7DQorICAgICAgLy8gUmVkaXJlY3QgZmlsZSBkZXNjcmlwdG9ycy4uLg0KKyAgICAgIGlmIChyZWRpcmVjdHMpIHsNCisgICAgICAgIC8vIFJlZGlyZWN0IHN0ZGluDQorICAgICAgICBpZiAoUmVkaXJlY3RJTyhyZWRpcmVjdHNbMF0sIDAsIEVyck1zZykpIHsgcmV0dXJuIGZhbHNlOyB9DQorICAgICAgICAvLyBSZWRpcmVjdCBzdGRvdXQNCisgICAgICAgIGlmIChSZWRpcmVjdElPKHJlZGlyZWN0c1sxXSwgMSwgRXJyTXNnKSkgeyByZXR1cm4gZmFsc2U7IH0NCisgICAgICAgIGlmIChyZWRpcmVjdHNbMV0gJiYgcmVkaXJlY3RzWzJdICYmDQorICAgICAgICAgICAgKihyZWRpcmVjdHNbMV0pID09ICoocmVkaXJlY3RzWzJdKSkgew0KKyAgICAgICAgICAvLyBJZiBzdGRvdXQgYW5kIHN0ZGVyciBzaG91bGQgZ28gdG8gdGhlIHNhbWUgcGxhY2UsIHJlZGlyZWN0IHN0ZGVycg0KKyAgICAgICAgICAvLyB0byB0aGUgRkQgYWxyZWFkeSBvcGVuIGZvciBzdGRvdXQuDQorICAgICAgICAgIGlmICgtMSA9PSBkdXAyKDEsMikpIHsNCisgICAgICAgICAgICBNYWtlRXJyTXNnKEVyck1zZywgIkNhbid0IHJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQiKTsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIC8vIEp1c3QgcmVkaXJlY3Qgc3RkZXJyDQorICAgICAgICAgIGlmIChSZWRpcmVjdElPKHJlZGlyZWN0c1syXSwgMiwgRXJyTXNnKSkgeyByZXR1cm4gZmFsc2U7IH0NCisgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgLy8gU2V0IG1lbW9yeSBsaW1pdHMNCisgICAgICBpZiAobWVtb3J5TGltaXQhPTApIHsNCisgICAgICAgIFNldE1lbW9yeUxpbWl0cyhtZW1vcnlMaW1pdCk7DQorICAgICAgfQ0KKw0KKyAgICAgIC8vIEV4ZWN1dGUhDQorICAgICAgaWYgKGVudnAgIT0gMCkNCisgICAgICAgIGV4ZWN2ZShwYXRoLmNfc3RyKCksDQorICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyICoqPihhcmdzKSwNCisgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIgKio+KGVudnApKTsNCisgICAgICBlbHNlDQorICAgICAgICBleGVjdihwYXRoLmNfc3RyKCksDQorICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIgKio+KGFyZ3MpKTsNCisgICAgICAvLyBJZiB0aGUgZXhlY3ZlKCkgZmFpbGVkLCB3ZSBzaG91bGQgZXhpdC4gRm9sbG93IFVuaXggcHJvdG9jb2wgYW5kDQorICAgICAgLy8gcmV0dXJuIDEyNyBpZiB0aGUgZXhlY3V0YWJsZSB3YXMgbm90IGZvdW5kLCBhbmQgMTI2IG90aGVyd2lzZS4NCisgICAgICAvLyBVc2UgX2V4aXQgcmF0aGVyIHRoYW4gZXhpdCBzbyB0aGF0IGF0ZXhpdCBmdW5jdGlvbnMgYW5kIHN0YXRpYw0KKyAgICAgIC8vIG9iamVjdCBkZXN0cnVjdG9ycyBjbG9uZWQgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgYXJlbid0DQorICAgICAgLy8gcmVkdW5kYW50bHkgcnVuLCBhbmQgc28gdGhhdCBhbnkgZGF0YSBidWZmZXJlZCBpbiBzdGRpbyBidWZmZXJzDQorICAgICAgLy8gY2xvbmVkIGZyb20gdGhlIHBhcmVudCBhcmVuJ3QgcmVkdW5kYW50bHkgd3JpdHRlbiBvdXQuDQorICAgICAgX2V4aXQoZXJybm8gPT0gRU5PRU5UID8gMTI3IDogMTI2KTsNCisgICAgfQ0KKw0KKyAgICAvLyBQYXJlbnQgcHJvY2VzczogQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggdG8gZG8gb3VyIHByb2Nlc3NpbmcuDQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorDQorICBEYXRhXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGNoaWxkKTsNCisNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitpbnQNCitQcm9ncmFtOjpXYWl0KHVuc2lnbmVkIHNlY29uZHNUb1dhaXQsDQorICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogRXJyTXNnKQ0KK3sNCisjaWZkZWYgSEFWRV9TWVNfV0FJVF9IDQorICBzdHJ1Y3Qgc2lnYWN0aW9uIEFjdCwgT2xkOw0KKw0KKyAgaWYgKERhdGFfID09IDApIHsNCisgICAgTWFrZUVyck1zZyhFcnJNc2csICJQcm9jZXNzIG5vdCBzdGFydGVkISIpOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorDQorICAvLyBJbnN0YWxsIGEgdGltZW91dCBoYW5kbGVyLiAgVGhlIGhhbmRsZXIgaXRzZWxmIGRvZXMgbm90aGluZywgYnV0IHRoZSBzaW1wbGUNCisgIC8vIGZhY3Qgb2YgaGF2aW5nIGEgaGFuZGxlciBhdCBhbGwgY2F1c2VzIHRoZSB3YWl0IGJlbG93IHRvIHJldHVybiB3aXRoIEVJTlRSLA0KKyAgLy8gdW5saWtlIGlmIHdlIHVzZWQgU0lHX0lHTi4NCisgIGlmIChzZWNvbmRzVG9XYWl0KSB7DQorICAgIG1lbXNldCgmQWN0LCAwLCBzaXplb2YoQWN0KSk7DQorICAgIEFjdC5zYV9oYW5kbGVyID0gVGltZU91dEhhbmRsZXI7DQorICAgIHNpZ2VtcHR5c2V0KCZBY3Quc2FfbWFzayk7DQorICAgIHNpZ2FjdGlvbihTSUdBTFJNLCAmQWN0LCAmT2xkKTsNCisgICAgYWxhcm0oc2Vjb25kc1RvV2FpdCk7DQorICB9DQorDQorICAvLyBQYXJlbnQgcHJvY2VzczogV2FpdCBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gdGVybWluYXRlLg0KKyAgaW50IHN0YXR1czsNCisgIHVpbnQ2NF90IHBpZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KERhdGFfKTsNCisgIHBpZF90IGNoaWxkID0gc3RhdGljX2Nhc3Q8cGlkX3Q+KHBpZCk7DQorICB3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApICE9IGNoaWxkKQ0KKyAgICBpZiAoc2Vjb25kc1RvV2FpdCAmJiBlcnJubyA9PSBFSU5UUikgew0KKyAgICAgIC8vIEtpbGwgdGhlIGNoaWxkLg0KKyAgICAgIGtpbGwoY2hpbGQsIFNJR0tJTEwpOw0KKw0KKyAgICAgIC8vIFR1cm4gb2ZmIHRoZSBhbGFybSBhbmQgcmVzdG9yZSB0aGUgc2lnbmFsIGhhbmRsZXINCisgICAgICBhbGFybSgwKTsNCisgICAgICBzaWdhY3Rpb24oU0lHQUxSTSwgJk9sZCwgMCk7DQorDQorICAgICAgLy8gV2FpdCBmb3IgY2hpbGQgdG8gZGllDQorICAgICAgaWYgKHdhaXQoJnN0YXR1cykgIT0gY2hpbGQpDQorICAgICAgICBNYWtlRXJyTXNnKEVyck1zZywgIkNoaWxkIHRpbWVkIG91dCBidXQgd291bGRuJ3QgZGllIik7DQorICAgICAgZWxzZQ0KKyAgICAgICAgTWFrZUVyck1zZyhFcnJNc2csICJDaGlsZCB0aW1lZCBvdXQiLCAwKTsNCisNCisgICAgICByZXR1cm4gLTE7ICAgLy8gVGltZW91dCBkZXRlY3RlZA0KKyAgICB9IGVsc2UgaWYgKGVycm5vICE9IEVJTlRSKSB7DQorICAgICAgTWFrZUVyck1zZyhFcnJNc2csICJFcnJvciB3YWl0aW5nIGZvciBjaGlsZCBwcm9jZXNzIik7DQorICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAvLyBXZSBleGl0ZWQgbm9ybWFsbHkgd2l0aG91dCB0aW1lb3V0LCBzbyB0dXJuIG9mZiB0aGUgdGltZXIuDQorICBpZiAoc2Vjb25kc1RvV2FpdCkgew0KKyAgICBhbGFybSgwKTsNCisgICAgc2lnYWN0aW9uKFNJR0FMUk0sICZPbGQsIDApOw0KKyAgfQ0KKw0KKyAgLy8gUmV0dXJuIHRoZSBwcm9wZXIgZXhpdCBzdGF0dXMuIDA9c3VjY2VzcywgPjAgaXMgcHJvZ3JhbXMnIGV4aXQgc3RhdHVzLA0KKyAgLy8gPDAgbWVhbnMgYSBzaWduYWwgd2FzIHJldHVybmVkLCAtOTk5OTk5OSBtZWFucyB0aGUgcHJvZ3JhbSBkdW1wZWQgY29yZS4NCisgIGludCByZXN1bHQgPSAwOw0KKyAgaWYgKFdJRkVYSVRFRChzdGF0dXMpKQ0KKyAgICByZXN1bHQgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOw0KKyAgZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkNCisgICAgcmVzdWx0ID0gMCAtIFdURVJNU0lHKHN0YXR1cyk7DQorI2lmZGVmIFdDT1JFRFVNUA0KKyAgZWxzZSBpZiAoV0NPUkVEVU1QKHN0YXR1cykpDQorICAgIHJlc3VsdCB8PSAweDAxMDAwMDAwOw0KKyNlbmRpZg0KKyAgcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgcmV0dXJuIC05OTsNCisjZW5kaWYNCisNCit9DQorDQorYm9vbA0KK1Byb2dyYW06OktpbGwoc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgaWYgKERhdGFfID09IDApIHsNCisgICAgTWFrZUVyck1zZyhFcnJNc2csICJQcm9jZXNzIG5vdCBzdGFydGVkISIpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisNCisgIHVpbnQ2NF90IHBpZDY0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdD4oRGF0YV8pOw0KKyAgcGlkX3QgcGlkID0gc3RhdGljX2Nhc3Q8cGlkX3Q+KHBpZDY0KTsNCisNCisgIGlmIChraWxsKHBpZCwgU0lHS0lMTCkgIT0gMCkgew0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywgIlRoZSBwcm9jZXNzIGNvdWxkbid0IGJlIGtpbGxlZCEiKTsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorDQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgUHJvZ3JhbTo6Q2hhbmdlU3RkaW5Ub0JpbmFyeSgpew0KKyAgLy8gRG8gbm90aGluZywgYXMgVW5peCBkb2Vzbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkuDQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgUHJvZ3JhbTo6Q2hhbmdlU3Rkb3V0VG9CaW5hcnkoKXsNCisgIC8vIERvIG5vdGhpbmcsIGFzIFVuaXggZG9lc24ndCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGV4dCBhbmQgYmluYXJ5Lg0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIFByb2dyYW06OkNoYW5nZVN0ZGVyclRvQmluYXJ5KCl7DQorICAvLyBEbyBub3RoaW5nLCBhcyBVbml4IGRvZXNuJ3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRleHQgYW5kIGJpbmFyeS4NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9SRUFETUUudHh0IGIvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiYWNlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTYgQEAKK2xsdm0vbGliL1N5c3RlbS9Vbml4IFJFQURNRQorPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZGlyZWN0b3J5IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbGliL1N5c3RlbSBjbGFzc2VzIHRoYXQKK2FyZSBjb21tb24gdG8gdHdvIG9yIG1vcmUgdmFyaWFudHMgb2YgVU5JWC4gRm9yIGV4YW1wbGUsIHRoZSBkaXJlY3RvcnkgCitzdHJ1Y3R1cmUgdW5kZXJuZWF0aCB0aGlzIGRpcmVjdG9yeSBjb3VsZCBsb29rIGxpa2UgdGhpczoKKworVW5peCAgICAgICAgICAgLSBvbmx5IGNvZGUgdGhhdCBpcyB0cnVseSBnZW5lcmljIHRvIGFsbCBVTklYIHBsYXRmb3JtcworICBQb3NpeCAgICAgICAgLSBjb2RlIHRoYXQgaXMgc3BlY2lmaWMgdG8gUG9zaXggdmFyaWFudHMgb2YgVU5JWAorICBTVVMgICAgICAgICAgLSBjb2RlIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIFNpbmdsZSBVbml4IFNwZWNpZmljYXRpb24gCisgIFN5c1YgICAgICAgICAtIGNvZGUgdGhhdCBpcyBzcGVjaWZpYyB0byBTeXN0ZW0gViB2YXJpYW50cyBvZiBVTklYCisKK0FzIGEgcnVsZSwgb25seSB0aG9zZSBkaXJlY3RvcmllcyBhY3R1YWxseSBuZWVkaW5nIHRvIGJlIGNyZWF0ZWQgc2hvdWxkIGJlCitjcmVhdGVkLiBBbHNvLCBmdXJ0aGVyIHN1YmRpcmVjdG9yaWVzIGNvdWxkIGJlIGNyZWF0ZWQgdG8gcmVmbGVjdCB2ZXJzaW9ucyBvZgordGhlIHZhcmlvdXMgc3RhbmRhcmRzLiBGb3IgZXhhbXBsZSwgdW5kZXIgU1VTIHRoZXJlIGNvdWxkIGJlIHYxLCB2MiwgYW5kIHYzCitzdWJkaXJlY3RvcmllcyB0byByZWZsZWN0IHRoZSB0aHJlZSBtYWpvciB2ZXJzaW9ucyBvZiBTVVMuCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvUldNdXRleC5pbmMgYi9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvUldNdXRleC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzZDQxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9SV011dGV4LmluYwpAQCAtMCwwICsxLDQzIEBACisvLz0gbGx2bS9TeXN0ZW0vVW5peC9SV011dGV4LmluYyAtIFVuaXggUmVhZGVyL1dyaXRlciBNdXR1YWwgRXhjbHVzaW9uIExvY2sgID0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFVuaXggc3BlY2lmaWMgKG5vbi1wdGhyZWFkKSBSV011dGV4IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLz09PSBXQVJOSU5HOiBJbXBsZW1lbnRhdGlvbiBoZXJlIG11c3QgY29udGFpbiBvbmx5IGdlbmVyaWMgVU5JWCBjb2RlIHRoYXQKKy8vPT09ICAgICAgICAgIGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiAqYWxsKiBVTklYIHZhcmlhbnRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbmFtZXNwYWNlIGxsdm0geworCit1c2luZyBuYW1lc3BhY2Ugc3lzOworCitSV011dGV4SW1wbDo6UldNdXRleEltcGwoKSB7IH0KKworUldNdXRleEltcGw6On5SV011dGV4SW1wbCgpIHsgfQorCitib29sIFJXTXV0ZXhJbXBsOjpyZWFkZXJfYWNxdWlyZSgpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUldNdXRleEltcGw6OnJlYWRlcl9yZWxlYXNlKCkgeworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSV011dGV4SW1wbDo6d3JpdGVyX2FjcXVpcmUoKSB7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFJXTXV0ZXhJbXBsOjp3cml0ZXJfcmVsZWFzZSgpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9TaWduYWxzLmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9TaWduYWxzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzAxMmMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L1NpZ25hbHMuaW5jCkBAIC0wLDAgKzEsMjU1IEBACisvLz09PS0gU2lnbmFscy5jcHAgLSBHZW5lcmljIFVuaXggU2lnbmFscyBJbXBsZW1lbnRhdGlvbiAtLS0tLSotIEMrKyAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGRlZmluZXMgc29tZSBoZWxwZnVsIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZg0KKy8vIFVuaXggc2lnbmFscyBvY2N1cmluZyB3aGlsZSB5b3VyIHByb2dyYW0gaXMgcnVubmluZy4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorI2luY2x1ZGUgIlVuaXguaCINCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiDQorI2luY2x1ZGUgImxsdm0vU3lzdGVtL011dGV4LmgiDQorI2luY2x1ZGUgPHZlY3Rvcj4NCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKyNpZiBIQVZFX0VYRUNJTkZPX0gNCisjIGluY2x1ZGUgPGV4ZWNpbmZvLmg+ICAgICAgICAgLy8gRm9yIGJhY2t0cmFjZSgpLg0KKyNlbmRpZg0KKyNpZiBIQVZFX1NJR05BTF9IDQorI2luY2x1ZGUgPHNpZ25hbC5oPg0KKyNlbmRpZg0KKyNpZiBIQVZFX1NZU19TVEFUX0gNCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4NCisjZW5kaWYNCisjaWYgSEFWRV9ETEZDTl9IICYmIF9fR05VR19fDQorI2luY2x1ZGUgPGRsZmNuLmg+DQorI2luY2x1ZGUgPGN4eGFiaS5oPiANCisjZW5kaWYNCit1c2luZyBuYW1lc3BhY2UgbGx2bTsNCisNCitzdGF0aWMgUkVUU0lHVFlQRSBTaWduYWxIYW5kbGVyKGludCBTaWcpOyAgLy8gZGVmaW5lZCBiZWxvdy4NCisNCitzdGF0aWMgU21hcnRNdXRleDx0cnVlPiBTaWduYWxzTXV0ZXg7DQorDQorLy8vIEludGVycnVwdEZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaWYgY3RybC1jIGlzIHByZXNzZWQuDQorc3RhdGljIHZvaWQgKCpJbnRlcnJ1cHRGdW5jdGlvbikoKSA9IDA7DQorDQorc3RhdGljIHN0ZDo6dmVjdG9yPHN5czo6UGF0aD4gRmlsZXNUb1JlbW92ZTsNCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHZvaWQoKikodm9pZCopLCB2b2lkKj4gPiBDYWxsQmFja3NUb1J1bjsNCisNCisvLyBJbnRTaWdzIC0gU2lnbmFscyB0aGF0IG1heSBpbnRlcnJ1cHQgdGhlIHByb2dyYW0gYXQgYW55IHRpbWUuDQorc3RhdGljIGNvbnN0IGludCBJbnRTaWdzW10gPSB7DQorICBTSUdIVVAsIFNJR0lOVCwgU0lHUVVJVCwgU0lHUElQRSwgU0lHVEVSTSwgU0lHVVNSMSwgU0lHVVNSMg0KK307DQorc3RhdGljIGNvbnN0IGludCAqY29uc3QgSW50U2lnc0VuZCA9DQorICBJbnRTaWdzICsgc2l6ZW9mKEludFNpZ3MpIC8gc2l6ZW9mKEludFNpZ3NbMF0pOw0KKw0KKy8vIEtpbGxTaWdzIC0gU2lnbmFscyB0aGF0IGFyZSBzeW5jaHJvbm91cyB3aXRoIHRoZSBwcm9ncmFtIHRoYXQgd2lsbCBjYXVzZSBpdA0KKy8vIHRvIGRpZS4NCitzdGF0aWMgY29uc3QgaW50IEtpbGxTaWdzW10gPSB7DQorICBTSUdJTEwsIFNJR1RSQVAsIFNJR0FCUlQsIFNJR0ZQRSwgU0lHQlVTLCBTSUdTRUdWDQorI2lmZGVmIFNJR1NZUw0KKyAgLCBTSUdTWVMNCisjZW5kaWYNCisjaWZkZWYgU0lHWENQVQ0KKyAgLCBTSUdYQ1BVDQorI2VuZGlmDQorI2lmZGVmIFNJR1hGU1oNCisgICwgU0lHWEZTWg0KKyNlbmRpZg0KKyNpZmRlZiBTSUdFTVQNCisgICwgU0lHRU1UDQorI2VuZGlmDQorfTsNCitzdGF0aWMgY29uc3QgaW50ICpjb25zdCBLaWxsU2lnc0VuZCA9DQorICBLaWxsU2lncyArIHNpemVvZihLaWxsU2lncykgLyBzaXplb2YoS2lsbFNpZ3NbMF0pOw0KKw0KK3N0YXRpYyB1bnNpZ25lZCBOdW1SZWdpc3RlcmVkU2lnbmFscyA9IDA7DQorc3RhdGljIHN0cnVjdCB7DQorICBzdHJ1Y3Qgc2lnYWN0aW9uIFNBOw0KKyAgaW50IFNpZ05vOw0KK30gUmVnaXN0ZXJlZFNpZ25hbEluZm9bKHNpemVvZihJbnRTaWdzKStzaXplb2YoS2lsbFNpZ3MpKS9zaXplb2YoS2lsbFNpZ3NbMF0pXTsNCisNCisNCitzdGF0aWMgdm9pZCBSZWdpc3RlckhhbmRsZXIoaW50IFNpZ25hbCkgew0KKyAgYXNzZXJ0KE51bVJlZ2lzdGVyZWRTaWduYWxzIDwNCisgICAgICAgICBzaXplb2YoUmVnaXN0ZXJlZFNpZ25hbEluZm8pL3NpemVvZihSZWdpc3RlcmVkU2lnbmFsSW5mb1swXSkgJiYNCisgICAgICAgICAiT3V0IG9mIHNwYWNlIGZvciBzaWduYWwgaGFuZGxlcnMhIik7DQorDQorICBzdHJ1Y3Qgc2lnYWN0aW9uIE5ld0hhbmRsZXI7DQorICANCisgIE5ld0hhbmRsZXIuc2FfaGFuZGxlciA9IFNpZ25hbEhhbmRsZXI7DQorICBOZXdIYW5kbGVyLnNhX2ZsYWdzID0gU0FfTk9ERUZFUnxTQV9SRVNFVEhBTkQ7DQorICBzaWdlbXB0eXNldCgmTmV3SGFuZGxlci5zYV9tYXNrKTsgDQorICANCisgIC8vIEluc3RhbGwgdGhlIG5ldyBoYW5kbGVyLCBzYXZlIHRoZSBvbGQgb25lIGluIFJlZ2lzdGVyZWRTaWduYWxJbmZvLg0KKyAgc2lnYWN0aW9uKFNpZ25hbCwgJk5ld0hhbmRsZXIsDQorICAgICAgICAgICAgJlJlZ2lzdGVyZWRTaWduYWxJbmZvW051bVJlZ2lzdGVyZWRTaWduYWxzXS5TQSk7DQorICBSZWdpc3RlcmVkU2lnbmFsSW5mb1tOdW1SZWdpc3RlcmVkU2lnbmFsc10uU2lnTm8gPSBTaWduYWw7DQorICArK051bVJlZ2lzdGVyZWRTaWduYWxzOw0KK30NCisNCitzdGF0aWMgdm9pZCBSZWdpc3RlckhhbmRsZXJzKCkgew0KKyAgLy8gSWYgdGhlIGhhbmRsZXJzIGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQsIHdlJ3JlIGRvbmUuDQorICBpZiAoTnVtUmVnaXN0ZXJlZFNpZ25hbHMgIT0gMCkgcmV0dXJuOw0KKw0KKyAgc3RkOjpmb3JfZWFjaChJbnRTaWdzLCBJbnRTaWdzRW5kLCBSZWdpc3RlckhhbmRsZXIpOw0KKyAgc3RkOjpmb3JfZWFjaChLaWxsU2lncywgS2lsbFNpZ3NFbmQsIFJlZ2lzdGVySGFuZGxlcik7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFVucmVnaXN0ZXJIYW5kbGVycygpIHsNCisgIC8vIFJlc3RvcmUgYWxsIG9mIHRoZSBzaWduYWwgaGFuZGxlcnMgdG8gaG93IHRoZXkgd2VyZSBiZWZvcmUgd2Ugc2hvd2VkIHVwLg0KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE51bVJlZ2lzdGVyZWRTaWduYWxzOyBpICE9IGU7ICsraSkNCisgICAgc2lnYWN0aW9uKFJlZ2lzdGVyZWRTaWduYWxJbmZvW2ldLlNpZ05vLA0KKyAgICAgICAgICAgICAgJlJlZ2lzdGVyZWRTaWduYWxJbmZvW2ldLlNBLCAwKTsNCisgIE51bVJlZ2lzdGVyZWRTaWduYWxzID0gMDsNCit9DQorDQorDQorLy8vIFJlbW92ZUZpbGVzVG9SZW1vdmUgLSBQcm9jZXNzIHRoZSBGaWxlc1RvUmVtb3ZlIGxpc3QuIFRoaXMgZnVuY3Rpb24NCisvLy8gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBTaWduYWxzTXV0ZXggbG9jayBoZWxkLg0KK3N0YXRpYyB2b2lkIFJlbW92ZUZpbGVzVG9SZW1vdmUoKSB7DQorICB3aGlsZSAoIUZpbGVzVG9SZW1vdmUuZW1wdHkoKSkgew0KKyAgICBGaWxlc1RvUmVtb3ZlLmJhY2soKS5lcmFzZUZyb21EaXNrKHRydWUpOw0KKyAgICBGaWxlc1RvUmVtb3ZlLnBvcF9iYWNrKCk7DQorICB9DQorfQ0KKw0KKy8vIFNpZ25hbEhhbmRsZXIgLSBUaGUgc2lnbmFsIGhhbmRsZXIgdGhhdCBydW5zLg0KK3N0YXRpYyBSRVRTSUdUWVBFIFNpZ25hbEhhbmRsZXIoaW50IFNpZykgew0KKyAgLy8gUmVzdG9yZSB0aGUgc2lnbmFsIGJlaGF2aW9yIHRvIGRlZmF1bHQsIHNvIHRoYXQgdGhlIHByb2dyYW0gYWN0dWFsbHkNCisgIC8vIGNyYXNoZXMgd2hlbiB3ZSByZXR1cm4gYW5kIHRoZSBzaWduYWwgcmVpc3N1ZXMuICBUaGlzIGFsc28gZW5zdXJlcyB0aGF0IGlmDQorICAvLyB3ZSBjcmFzaCBpbiBvdXIgc2lnbmFsIGhhbmRsZXIgdGhhdCB0aGUgcHJvZ3JhbSB3aWxsIHRlcm1pbmF0ZSBpbW1lZGlhdGVseQ0KKyAgLy8gaW5zdGVhZCBvZiByZWN1cnNpbmcgaW4gdGhlIHNpZ25hbCBoYW5kbGVyLg0KKyAgVW5yZWdpc3RlckhhbmRsZXJzKCk7DQorDQorICAvLyBVbm1hc2sgYWxsIHBvdGVudGlhbGx5IGJsb2NrZWQga2lsbCBzaWduYWxzLg0KKyAgc2lnc2V0X3QgU2lnTWFzazsNCisgIHNpZ2ZpbGxzZXQoJlNpZ01hc2spOw0KKyAgc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZTaWdNYXNrLCAwKTsNCisNCisgIFNpZ25hbHNNdXRleC5hY3F1aXJlKCk7DQorICBSZW1vdmVGaWxlc1RvUmVtb3ZlKCk7DQorDQorICBpZiAoc3RkOjpmaW5kKEludFNpZ3MsIEludFNpZ3NFbmQsIFNpZykgIT0gSW50U2lnc0VuZCkgew0KKyAgICBpZiAoSW50ZXJydXB0RnVuY3Rpb24pIHsNCisgICAgICB2b2lkICgqSUYpKCkgPSBJbnRlcnJ1cHRGdW5jdGlvbjsNCisgICAgICBTaWduYWxzTXV0ZXgucmVsZWFzZSgpOw0KKyAgICAgIEludGVycnVwdEZ1bmN0aW9uID0gMDsNCisgICAgICBJRigpOyAgICAgICAgLy8gcnVuIHRoZSBpbnRlcnJ1cHQgZnVuY3Rpb24uDQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIA0KKyAgICBTaWduYWxzTXV0ZXgucmVsZWFzZSgpOw0KKyAgICByYWlzZShTaWcpOyAgIC8vIEV4ZWN1dGUgdGhlIGRlZmF1bHQgaGFuZGxlci4NCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgU2lnbmFsc011dGV4LnJlbGVhc2UoKTsNCisNCisgIC8vIE90aGVyd2lzZSBpZiBpdCBpcyBhIGZhdWx0IChsaWtlIFNFR1YpIHJ1biBhbnkgaGFuZGxlci4NCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDYWxsQmFja3NUb1J1bi5zaXplKCk7IGkgIT0gZTsgKytpKQ0KKyAgICBDYWxsQmFja3NUb1J1bltpXS5maXJzdChDYWxsQmFja3NUb1J1bltpXS5zZWNvbmQpOw0KK30NCisNCit2b2lkIGxsdm06OnN5czo6UnVuSW50ZXJydXB0SGFuZGxlcnMoKSB7DQorICBTaWduYWxzTXV0ZXguYWNxdWlyZSgpOw0KKyAgUmVtb3ZlRmlsZXNUb1JlbW92ZSgpOw0KKyAgU2lnbmFsc011dGV4LnJlbGVhc2UoKTsNCit9DQorDQordm9pZCBsbHZtOjpzeXM6OlNldEludGVycnVwdEZ1bmN0aW9uKHZvaWQgKCpJRikoKSkgew0KKyAgU2lnbmFsc011dGV4LmFjcXVpcmUoKTsNCisgIEludGVycnVwdEZ1bmN0aW9uID0gSUY7DQorICBTaWduYWxzTXV0ZXgucmVsZWFzZSgpOw0KKyAgUmVnaXN0ZXJIYW5kbGVycygpOw0KK30NCisNCisvLyBSZW1vdmVGaWxlT25TaWduYWwgLSBUaGUgcHVibGljIEFQSQ0KK2Jvb2wgbGx2bTo6c3lzOjpSZW1vdmVGaWxlT25TaWduYWwoY29uc3Qgc3lzOjpQYXRoICZGaWxlbmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBFcnJNc2cpIHsNCisgIFNpZ25hbHNNdXRleC5hY3F1aXJlKCk7DQorICBGaWxlc1RvUmVtb3ZlLnB1c2hfYmFjayhGaWxlbmFtZSk7DQorDQorICBTaWduYWxzTXV0ZXgucmVsZWFzZSgpOw0KKw0KKyAgUmVnaXN0ZXJIYW5kbGVycygpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCisvLy8gQWRkU2lnbmFsSGFuZGxlciAtIEFkZCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGEgc2lnbmFsIGlzIGRlbGl2ZXJlZA0KKy8vLyB0byB0aGUgcHJvY2Vzcy4gIFRoZSBoYW5kbGVyIGNhbiBoYXZlIGEgY29va2llIHBhc3NlZCB0byBpdCB0byBpZGVudGlmeQ0KKy8vLyB3aGF0IGluc3RhbmNlIG9mIHRoZSBoYW5kbGVyIGl0IGlzLg0KK3ZvaWQgbGx2bTo6c3lzOjpBZGRTaWduYWxIYW5kbGVyKHZvaWQgKCpGblB0cikodm9pZCAqKSwgdm9pZCAqQ29va2llKSB7DQorICBDYWxsQmFja3NUb1J1bi5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoRm5QdHIsIENvb2tpZSkpOw0KKyAgUmVnaXN0ZXJIYW5kbGVycygpOw0KK30NCisNCisNCisvLyBQcmludFN0YWNrVHJhY2UgLSBJbiB0aGUgY2FzZSBvZiBhIHByb2dyYW0gY3Jhc2ggb3IgZmF1bHQsIHByaW50IG91dCBhIHN0YWNrDQorLy8gdHJhY2Ugc28gdGhhdCB0aGUgdXNlciBoYXMgYW4gaW5kaWNhdGlvbiBvZiB3aHkgYW5kIHdoZXJlIHdlIGRpZWQuDQorLy8NCisvLyBPbiBnbGliYyBzeXN0ZW1zIHdlIGhhdmUgdGhlICdiYWNrdHJhY2UnIGZ1bmN0aW9uLCB3aGljaCB3b3JrcyBuaWNlbHksIGJ1dA0KKy8vIGRvZXNuJ3QgZGVtYW5nbGUgc3ltYm9scy4gIA0KK3N0YXRpYyB2b2lkIFByaW50U3RhY2tUcmFjZSh2b2lkICopIHsNCisjaWZkZWYgSEFWRV9CQUNLVFJBQ0UNCisgIHN0YXRpYyB2b2lkKiBTdGFja1RyYWNlWzI1Nl07DQorICAvLyBVc2UgYmFja3RyYWNlKCkgdG8gb3V0cHV0IGEgYmFja3RyYWNlIG9uIExpbnV4IHN5c3RlbXMgd2l0aCBnbGliYy4NCisgIGludCBkZXB0aCA9IGJhY2t0cmFjZShTdGFja1RyYWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYXJyYXlfbGVuZ3Rob2YoU3RhY2tUcmFjZSkpKTsNCisjaWYgSEFWRV9ETEZDTl9IICYmIF9fR05VR19fDQorICBpbnQgd2lkdGggPSAwOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXB0aDsgKytpKSB7DQorICAgIERsX2luZm8gZGxpbmZvOw0KKyAgICBkbGFkZHIoU3RhY2tUcmFjZVtpXSwgJmRsaW5mbyk7DQorICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBzdHJyY2hyKGRsaW5mby5kbGlfZm5hbWUsICcvJyk7DQorDQorICAgIGludCBud2lkdGg7DQorICAgIGlmIChuYW1lID09IE5VTEwpIG53aWR0aCA9IHN0cmxlbihkbGluZm8uZGxpX2ZuYW1lKTsNCisgICAgZWxzZSAgICAgICAgICAgICAgbndpZHRoID0gc3RybGVuKG5hbWUpIC0gMTsNCisNCisgICAgaWYgKG53aWR0aCA+IHdpZHRoKSB3aWR0aCA9IG53aWR0aDsNCisgIH0NCisNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7ICsraSkgew0KKyAgICBEbF9pbmZvIGRsaW5mbzsNCisgICAgZGxhZGRyKFN0YWNrVHJhY2VbaV0sICZkbGluZm8pOw0KKw0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMmQiLCBpKTsNCisNCisgICAgY29uc3QgY2hhciogbmFtZSA9IHN0cnJjaHIoZGxpbmZvLmRsaV9mbmFtZSwgJy8nKTsNCisgICAgaWYgKG5hbWUgPT0gTlVMTCkgZnByaW50ZihzdGRlcnIsICIgJS0qcyIsIHdpZHRoLCBkbGluZm8uZGxpX2ZuYW1lKTsNCisgICAgZWxzZSAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgJS0qcyIsIHdpZHRoLCBuYW1lKzEpOw0KKw0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAlIzAqbHgiLA0KKyAgICAgICAgICAgIChpbnQpKHNpemVvZih2b2lkKikgKiAyKSArIDIsICh1bnNpZ25lZCBsb25nKVN0YWNrVHJhY2VbaV0pOw0KKw0KKyAgICBpZiAoZGxpbmZvLmRsaV9zbmFtZSAhPSBOVUxMKSB7DQorICAgICAgaW50IHJlczsNCisgICAgICBmcHV0YygnICcsIHN0ZGVycik7DQorICAgICAgY2hhciogZCA9IGFiaTo6X19jeGFfZGVtYW5nbGUoZGxpbmZvLmRsaV9zbmFtZSwgTlVMTCwgTlVMTCwgJnJlcyk7DQorICAgICAgaWYgKGQgPT0gTlVMTCkgZnB1dHMoZGxpbmZvLmRsaV9zbmFtZSwgc3RkZXJyKTsNCisgICAgICBlbHNlICAgICAgICAgICBmcHV0cyhkLCBzdGRlcnIpOw0KKyAgICAgIGZyZWUoZCk7DQorDQorICAgICAgZnByaW50ZihzdGRlcnIsICIgKyAldHUiLChjaGFyKilTdGFja1RyYWNlW2ldLShjaGFyKilkbGluZm8uZGxpX3NhZGRyKTsNCisgICAgfQ0KKyAgICBmcHV0YygnXG4nLCBzdGRlcnIpOw0KKyAgfQ0KKyNlbHNlDQorICBiYWNrdHJhY2Vfc3ltYm9sc19mZChTdGFja1RyYWNlLCBkZXB0aCwgU1RERVJSX0ZJTEVOTyk7DQorI2VuZGlmDQorI2VuZGlmDQorfQ0KKw0KKy8vLyBQcmludFN0YWNrVHJhY2VPbkVycm9yU2lnbmFsIC0gV2hlbiBhbiBlcnJvciBzaWduYWwgKHN1Y2ggYXMgU0lCQUJSVCBvcg0KKy8vLyBTSUdTRUdWKSBpcyBkZWxpdmVyZWQgdG8gdGhlIHByb2Nlc3MsIHByaW50IGEgc3RhY2sgdHJhY2UgYW5kIHRoZW4gZXhpdC4NCit2b2lkIGxsdm06OnN5czo6UHJpbnRTdGFja1RyYWNlT25FcnJvclNpZ25hbCgpIHsNCisgIEFkZFNpZ25hbEhhbmRsZXIoUHJpbnRTdGFja1RyYWNlLCAwKTsNCit9DQorDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L1RocmVhZExvY2FsLmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9UaHJlYWRMb2NhbC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2OTUyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9UaHJlYWRMb2NhbC5pbmMKQEAgLTAsMCArMSwyNiBAQAorLy89PT0gbGx2bS9TeXN0ZW0vVW5peC9UaHJlYWRMb2NhbC5pbmMgLSBVbml4IFRocmVhZCBMb2NhbCBEYXRhIC0qLSBDKysgLSotPT09Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBVbml4IHNwZWNpZmljIChub24tcHRocmVhZCkgVGhyZWFkTG9jYWwgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBVTklYIGNvZGUgdGhhdAorLy89PT0gICAgICAgICAgaXMgZ3VhcmFudGVlZCB0byB3b3JrIG9uICphbGwqIFVOSVggdmFyaWFudHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgbGx2bSB7Cit1c2luZyBuYW1lc3BhY2Ugc3lzOworVGhyZWFkTG9jYWxJbXBsOjpUaHJlYWRMb2NhbEltcGwoKSB7IH0KK1RocmVhZExvY2FsSW1wbDo6flRocmVhZExvY2FsSW1wbCgpIHsgfQordm9pZCBUaHJlYWRMb2NhbEltcGw6OnNldEluc3RhbmNlKGNvbnN0IHZvaWQqIGQpIHsgZGF0YSA9IGNvbnN0X2Nhc3Q8dm9pZCo+KGQpO30KK2NvbnN0IHZvaWQqIFRocmVhZExvY2FsSW1wbDo6Z2V0SW5zdGFuY2UoKSB7IHJldHVybiBkYXRhOyB9Cit2b2lkIFRocmVhZExvY2FsSW1wbDo6cmVtb3ZlSW5zdGFuY2UoKSB7IHNldEluc3RhbmNlKDApOyB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvVGltZVZhbHVlLmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9UaW1lVmFsdWUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTM1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1VuaXgvVGltZVZhbHVlLmluYwpAQCAtMCwwICsxLDU2IEBACisvLz09PS0gVW5peC9UaW1lVmFsdWUuY3BwIC0gVW5peCBUaW1lVmFsdWUgSW1wbGVtZW50YXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFVuaXggc3BlY2lmaWMgcG9ydGlvbiBvZiB0aGUgVGltZVZhbHVlIGNsYXNzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBVTklYIGNvZGUgdGhhdA0KKy8vPT09ICAgICAgICAgIGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiAqYWxsKiBVTklYIHZhcmlhbnRzLg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorI2luY2x1ZGUgIlVuaXguaCINCisNCituYW1lc3BhY2UgbGx2bSB7DQorICB1c2luZyBuYW1lc3BhY2Ugc3lzOw0KKw0KK3N0ZDo6c3RyaW5nIFRpbWVWYWx1ZTo6c3RyKCkgY29uc3Qgew0KKyAgY2hhciBidWZmZXJbMzJdOw0KKw0KKyAgdGltZV90IG91clRpbWUgPSB0aW1lX3QodGhpcy0+dG9FcG9jaFRpbWUoKSk7DQorI2lmZGVmIF9faHB1eA0KKy8vIG5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGxpbmUgbmVlZHMgLURfUkVFTlRSQU5UIG9uIEhQLVVYIHRvIGJlIHBpY2tlZCB1cCANCisgIGFzY3RpbWVfcihsb2NhbHRpbWUoJm91clRpbWUpLCBidWZmZXIpOw0KKyNlbHNlDQorICA6OmFzY3RpbWVfcig6OmxvY2FsdGltZSgmb3VyVGltZSksIGJ1ZmZlcik7DQorI2VuZGlmDQorDQorICBzdGQ6OnN0cmluZyByZXN1bHQoYnVmZmVyKTsNCisgIHJldHVybiByZXN1bHQuc3Vic3RyKDAsMjQpOw0KK30NCisNCitUaW1lVmFsdWUgVGltZVZhbHVlOjpub3coKSB7DQorICBzdHJ1Y3QgdGltZXZhbCB0aGVfdGltZTsNCisgIHRpbWVyY2xlYXIoJnRoZV90aW1lKTsNCisgIGlmICgwICE9IDo6Z2V0dGltZW9mZGF5KCZ0aGVfdGltZSwwKSkgew0KKyAgICAvLyBUaGlzIGlzICpyZWFsbHkqIHVubGlrZWx5IHRvIG9jY3VyIGJlY2F1c2UgdGhlIG9ubHkgZ2V0dGltZW9mZGF5DQorICAgIC8vIGVycm9ycyBjb25jZXJuIHRoZSB0aW1lem9uZSBwYXJhbWV0ZXIgd2hpY2ggd2UncmUgcGFzc2luZyBpbiBhcyAwLg0KKyAgICAvLyBJbiB0aGUgdW5saWtlbHkgY2FzZSBpdCBkb2VzIGhhcHBlbiwganVzdCByZXR1cm4gTWluVGltZSwgbm8gZXJyb3INCisgICAgLy8gbWVzc2FnZSBuZWVkZWQuIA0KKyAgICByZXR1cm4gTWluVGltZTsNCisgIH0NCisNCisgIHJldHVybiBUaW1lVmFsdWUoDQorICAgIHN0YXRpY19jYXN0PFRpbWVWYWx1ZTo6U2Vjb25kc1R5cGU+KCB0aGVfdGltZS50dl9zZWMgKyBQb3NpeFplcm9UaW1lLnNlY29uZHNfICksIA0KKyAgICBzdGF0aWNfY2FzdDxUaW1lVmFsdWU6Ok5hbm9TZWNvbmRzVHlwZT4oIHRoZV90aW1lLnR2X3VzZWMgKiANCisgICAgICBOQU5PU0VDT05EU19QRVJfTUlDUk9TRUNPTkQgKSApOw0KK30NCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9Vbml4L1VuaXguaCBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9Vbml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1ODY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVW5peC9Vbml4LmgKQEAgLTAsMCArMSw4NyBAQAorLy89PT0tIGxsdm0vU3lzdGVtL1VuaXgvVW5peC5oIC0gQ29tbW9uIFVuaXggSW5jbHVkZSBGaWxlIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGluZ3Mgc3BlY2lmaWMgdG8gVW5peCBpbXBsZW1lbnRhdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NZU1RFTV9VTklYX1VOSVhfSAorI2RlZmluZSBMTFZNX1NZU1RFTV9VTklYX1VOSVhfSAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy89PT0gV0FSTklORzogSW1wbGVtZW50YXRpb24gaGVyZSBtdXN0IGNvbnRhaW4gb25seSBnZW5lcmljIFVOSVggY29kZSB0aGF0CisvLz09PSAgICAgICAgICBpcyBndWFyYW50ZWVkIHRvIHdvcmsgb24gYWxsIFVOSVggdmFyaWFudHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db25maWcvY29uZmlnLmgiICAgICAvLyBHZXQgYXV0b2NvbmYgY29uZmlndXJhdGlvbiBzZXR0aW5ncworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0Vycm5vLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQVNTRVJUX0gKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8dGltZS5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19XQUlUX0gKKyMgaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNlbmRpZgorCisjaWZuZGVmIFdFWElUU1RBVFVTCisjIGRlZmluZSBXRVhJVFNUQVRVUyhzdGF0X3ZhbCkgKCh1bnNpZ25lZCkoc3RhdF92YWwpID4+IDgpCisjZW5kaWYKKworI2lmbmRlZiBXSUZFWElURUQKKyMgZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQorI2VuZGlmCisKKy8vLyBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyBhbiBlcnJvciBtZXNzYWdlIGludG8gXHAgRXJyTXNnIHVzaW5nIHRoZSBccCBwcmVmaXgKKy8vLyBzdHJpbmcgYW5kIHRoZSBVbml4IGVycm9yIG51bWJlciBnaXZlbiBieSBccCBlcnJudW0uIElmIGVycm51bSBpcyAtMSwgdGhlCisvLy8gZGVmYXVsdCB0aGVuIHRoZSB2YWx1ZSBvZiBlcnJubyBpcyB1c2VkLgorLy8vIEBicmllZiBNYWtlIGFuIGVycm9yIG1lc3NhZ2UKKy8vLworLy8vIElmIHRoZSBlcnJvciBudW1iZXIgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZywgaXQgd2lsbCBiZQorLy8vIHNlcGFyYXRlZCBmcm9tIHByZWZpeCBieSAiOiAiLgorc3RhdGljIGlubGluZSBib29sIE1ha2VFcnJNc2coCisgIHN0ZDo6c3RyaW5nKiBFcnJNc2csIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsIGludCBlcnJudW0gPSAtMSkgeworICBpZiAoIUVyck1zZykKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKGVycm51bSA9PSAtMSkKKyAgICBlcnJudW0gPSBlcnJubzsKKyAgKkVyck1zZyA9IHByZWZpeCArICI6ICIgKyBsbHZtOjpzeXM6OlN0ckVycm9yKGVycm51bSk7CisgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVmFsZ3JpbmQuY3BwIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9WYWxncmluZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2Y2ZlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vVmFsZ3JpbmQuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LS0gVmFsZ3JpbmQuY3BwIC0gSW1wbGVtZW50IFZhbGdyaW5kIGNvbW11bmljYXRpb24gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIERlZmluZXMgVmFsZ3JpbmQgY29tbXVuaWNhdGlvbiBtZXRob2RzLCBpZiBIQVZFX1ZBTEdSSU5EX1ZBTEdSSU5EX0ggaXMKKy8vICBkZWZpbmVkLiAgSWYgd2UgaGF2ZSB2YWxncmluZC5oIGJ1dCB2YWxncmluZCBpc24ndCBydW5uaW5nLCBpdHMgbWFjcm9zIGFyZQorLy8gIG5vLW9wcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vVmFsZ3JpbmQuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKworI2lmIEhBVkVfVkFMR1JJTkRfVkFMR1JJTkRfSAorI2luY2x1ZGUgPHZhbGdyaW5kL3ZhbGdyaW5kLmg+CisKK3N0YXRpYyBib29sIEluaXROb3RVbmRlclZhbGdyaW5kKCkgeworICByZXR1cm4gIVJVTk5JTkdfT05fVkFMR1JJTkQ7Cit9CisKKy8vIFRoaXMgYm9vbCBpcyBuZWdhdGVkIGZyb20gd2hhdCB3ZSdkIGV4cGVjdCBiZWNhdXNlIGNvZGUgbWF5IHJ1biBiZWZvcmUgaXQKKy8vIGdldHMgaW5pdGlhbGl6ZWQuICBJZiB0aGF0IGhhcHBlbnMsIGl0IHdpbGwgYXBwZWFyIHRvIGJlIDAgKGZhbHNlKSwgYW5kIHdlCisvLyB3YW50IHRoYXQgdG8gY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgaW4gdGhpcyBmaWxlIHRvIHJ1biB0aGUKKy8vIFZhbGdyaW5kLXByb3ZpZGVkIG1hY3Jvcy4KK3N0YXRpYyBjb25zdCBib29sIE5vdFVuZGVyVmFsZ3JpbmQgPSBJbml0Tm90VW5kZXJWYWxncmluZCgpOworCitib29sIGxsdm06OnN5czo6UnVubmluZ09uVmFsZ3JpbmQoKSB7CisgIGlmIChOb3RVbmRlclZhbGdyaW5kKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIFJVTk5JTkdfT05fVkFMR1JJTkQ7Cit9CisKK3ZvaWQgbGx2bTo6c3lzOjpWYWxncmluZERpc2NhcmRUcmFuc2xhdGlvbnMoY29uc3Qgdm9pZCAqQWRkciwgc2l6ZV90IExlbikgeworICBpZiAoTm90VW5kZXJWYWxncmluZCkKKyAgICByZXR1cm47CisKKyAgVkFMR1JJTkRfRElTQ0FSRF9UUkFOU0xBVElPTlMoQWRkciwgTGVuKTsKK30KKworI2Vsc2UgIC8vICFIQVZFX1ZBTEdSSU5EX1ZBTEdSSU5EX0gKKworYm9vbCBsbHZtOjpzeXM6OlJ1bm5pbmdPblZhbGdyaW5kKCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgbGx2bTo6c3lzOjpWYWxncmluZERpc2NhcmRUcmFuc2xhdGlvbnMoY29uc3Qgdm9pZCAqQWRkciwgc2l6ZV90IExlbikgeworfQorCisjZW5kaWYgIC8vICFIQVZFX1ZBTEdSSU5EX1ZBTEdSSU5EX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvQWxhcm0uaW5jIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9BbGFybS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyY2M0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvQWxhcm0uaW5jCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LS0gQWxhcm0uaW5jIC0gSW1wbGVtZW50IFdpbjMyIEFsYXJtIFN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8NCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFdpbjMyIEFsYXJtIHN1cHBvcnQuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKyNpbmNsdWRlIDxjYXNzZXJ0Pg0KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOw0KKw0KKy8vLyBOZXN0ZWRTT0kgLSBTYW5pdHkgY2hlY2suICBBbGFybXMgY2Fubm90IGJlIG5lc3RlZCBvciBydW4gaW4gcGFyYWxsZWwuDQorLy8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZXkgbmV2ZXIgZG8uDQorc3RhdGljIGJvb2wgTmVzdGVkU09JID0gZmFsc2U7DQorDQordm9pZCBzeXM6OlNldHVwQWxhcm0odW5zaWduZWQgc2Vjb25kcykgew0KKyAgYXNzZXJ0KCFOZXN0ZWRTT0kgJiYgInN5czo6U2V0dXBBbGFybSBjYWxscyBjYW5ub3QgYmUgbmVzdGVkISIpOw0KKyAgTmVzdGVkU09JID0gdHJ1ZTsNCisgIC8vIEZJWE1FOiBJbXBsZW1lbnQgZm9yIFdpbjMyDQorfQ0KKw0KK3ZvaWQgc3lzOjpUZXJtaW5hdGVBbGFybSgpIHsNCisgIGFzc2VydChOZXN0ZWRTT0kgJiYgInN5czo6VGVybWluYXRlQWxhcm0gY2FsbGVkIHdpdGhvdXQgc3lzOjpTZXR1cEFsYXJtISIpOw0KKyAgLy8gRklYTUU6IEltcGxlbWVudCBmb3IgV2luMzINCisgIE5lc3RlZFNPSSA9IGZhbHNlOw0KK30NCisNCitpbnQgc3lzOjpBbGFybVN0YXR1cygpIHsNCisgIC8vIEZJWE1FOiBJbXBsZW1lbnQgZm9yIFdpbjMyDQorICByZXR1cm4gMDsNCit9DQorDQorLy8gRG9uJ3QgcHVsbCBpbiBhbGwgb2YgdGhlIFdpbmRvd3MgaGVhZGVycy4NCitleHRlcm4gIkMiICB2b2lkIF9fc3RkY2FsbCBTbGVlcCh1bnNpZ25lZCBsb25nKTsNCisNCit2b2lkIHN5czo6U2xlZXAodW5zaWduZWQgbikgew0KKyAgOjpTbGVlcChuKjEwMDApOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL0R5bmFtaWNMaWJyYXJ5LmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvRHluYW1pY0xpYnJhcnkuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWRiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL0R5bmFtaWNMaWJyYXJ5LmluYwpAQCAtMCwwICsxLDIwMCBAQAorLy89PT0tIFdpbjMyL0R5bmFtaWNMaWJyYXJ5LmNwcCAtIFdpbjMyIERMIEltcGxlbWVudGF0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgV2luMzIgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgRHluYW1pY0xpYnJhcnkuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKyNpbmNsdWRlICJXaW4zMi5oIg0KKw0KKyNpZmRlZiBfX01JTkdXMzJfXw0KKyAjaW5jbHVkZSA8aW1hZ2VobHAuaD4NCisjZWxzZQ0KKyAjaW5jbHVkZSA8ZGJnaGVscC5oPg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfTVNDX1ZFUg0KKyAjaW5jbHVkZSA8bnR2ZXJwLmg+DQorI2VuZGlmDQorDQorI2lmZGVmIF9fTUlOR1czMl9fDQorICNpZiAoSEFWRV9MSUJJTUFHRUhMUCAhPSAxKQ0KKyAgI2Vycm9yICJsaWJpbWFnZWhscC5hIHNob3VsZCBiZSBwcmVzZW50Ig0KKyAjZW5kaWYNCisjZWxzZQ0KKyAjcHJhZ21hIGNvbW1lbnQobGliLCAiZGJnaGVscC5saWIiKQ0KKyNlbmRpZg0KKw0KK25hbWVzcGFjZSBsbHZtIHsNCit1c2luZyBuYW1lc3BhY2Ugc3lzOw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy89PT0gV0FSTklORzogSW1wbGVtZW50YXRpb24gaGVyZSBtdXN0IGNvbnRhaW4gb25seSBXaW4zMiBzcGVjaWZpYyBjb2RlIA0KKy8vPT09ICAgICAgICAgIGFuZCBtdXN0IG5vdCBiZSBVTklYIGNvZGUuDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitzdGF0aWMgc3RkOjp2ZWN0b3I8SE1PRFVMRT4gT3BlbmVkSGFuZGxlczsNCisNCisjaWZkZWYgX1dJTjY0DQorICB0eXBlZGVmIERXT1JENjQgTW9kdWxlQmFzZVR5cGU7DQorI2Vsc2UNCisgIHR5cGVkZWYgVUxPTkcgTW9kdWxlQmFzZVR5cGU7DQorI2VuZGlmDQorDQorZXh0ZXJuICJDIiB7DQorLy8gVXNlIG9sZCBjYWxsYmFjayBpZjoNCisvLyAgLSBOb3QgdXNpbmcgVmlzdWFsIFN0dWRpbw0KKy8vICAtIFZpc3VhbCBTdHVkaW8gMjAwNSBvciBlYXJsaWVyIGJ1dCBvbmx5IGlmIHdlIGFyZSBub3QgdXNpbmcgdGhlIFdpbmRvd3MgU0RLIA0KKy8vICAgIG9yIFdpbmRvd3MgU0RLIHZlcnNpb24gaXMgb2xkZXIgdGhhbiA2LjANCisvLyBVc2UgbmV3IGNhbGxiYWNrIGlmOg0KKy8vICAtIE5ld2VyIFZpc3VhbCBTdHVkaW8gKGNvbWVzIHdpdGggbmV3ZXIgU0RLKS4NCisvLyAgLSBWaXN1YWwgU3R1ZGlvIDIwMDUgd2l0aCBXaW5kb3dzIFNESyA2LjArDQorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA8IDE1MDAgJiYgKCFkZWZpbmVkKFZFUl9QUk9EVUNUQlVJTEQpIHx8IFZFUl9QUk9EVUNUQlVJTEQgPCA2MDAwKQ0KKyAgc3RhdGljIEJPT0wgQ0FMTEJBQ0sgRUxNX0NhbGxiYWNrKFBTVFIgIE1vZHVsZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlQmFzZVR5cGUgTW9kdWxlQmFzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBNb2R1bGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBWT0lEIFVzZXJDb250ZXh0KQ0KKyNlbHNlDQorICBzdGF0aWMgQk9PTCBDQUxMQkFDSyBFTE1fQ2FsbGJhY2soUENTVFIgIE1vZHVsZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlQmFzZVR5cGUgTW9kdWxlQmFzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBNb2R1bGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBWT0lEIFVzZXJDb250ZXh0KQ0KKyNlbmRpZg0KKyAgew0KKyAgICAvLyBJZ25vcmUgVkMrKyBydW50aW1lcyBwcmlvciB0byA3LjEuICBTb21laG93IHNvbWUgb2YgdGhlbSBnZXQgbG9hZGVkDQorICAgIC8vIGludG8gdGhlIHByb2Nlc3MuDQorICAgIGlmIChzdHJpY21wKE1vZHVsZU5hbWUsICJtc3ZjaTcwIikgIT0gMCAmJg0KKyAgICAgICAgc3RyaWNtcChNb2R1bGVOYW1lLCAibXN2Y2lydCIpICE9IDAgJiYNCisgICAgICAgIHN0cmljbXAoTW9kdWxlTmFtZSwgIm1zdmNwNTAiKSAhPSAwICYmDQorICAgICAgICBzdHJpY21wKE1vZHVsZU5hbWUsICJtc3ZjcDYwIikgIT0gMCAmJg0KKyAgICAgICAgc3RyaWNtcChNb2R1bGVOYW1lLCAibXN2Y3A3MCIpICE9IDAgJiYNCisgICAgICAgIHN0cmljbXAoTW9kdWxlTmFtZSwgIm1zdmNyNzAiKSAhPSAwICYmDQorI2lmbmRlZiBfX01JTkdXMzJfXw0KKyAgICAgICAgLy8gTWluZ3czMiB1c2VzIG1zdmNydC5kbGwgYnkgZGVmYXVsdC4gRG9uJ3QgaWdub3JlIGl0Lg0KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB1c2VyIHNob3VsZCBiZSBhd2FyZSwgd2hhdCBoZSdzIGRvaW5nIDopDQorICAgICAgICBzdHJpY21wKE1vZHVsZU5hbWUsICJtc3ZjcnQiKSAhPSAwICYmDQorI2VuZGlmDQorICAgICAgICBzdHJpY21wKE1vZHVsZU5hbWUsICJtc3ZjcnQyMCIpICE9IDAgJiYNCisgICAgICAgIHN0cmljbXAoTW9kdWxlTmFtZSwgIm1zdmNydDQwIikgIT0gMCkgew0KKyAgICAgIE9wZW5lZEhhbmRsZXMucHVzaF9iYWNrKChITU9EVUxFKU1vZHVsZUJhc2UpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KK30NCisNCitib29sIER5bmFtaWNMaWJyYXJ5OjpMb2FkTGlicmFyeVBlcm1hbmVudGx5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBpZiAoZmlsZW5hbWUpIHsNCisgICAgSE1PRFVMRSBhX2hhbmRsZSA9IExvYWRMaWJyYXJ5KGZpbGVuYW1lKTsNCisNCisgICAgaWYgKGFfaGFuZGxlID09IDApDQorICAgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCBzdGQ6OnN0cmluZyhmaWxlbmFtZSkgKyAiOiBDYW4ndCBvcGVuIDogIik7DQorDQorICAgIE9wZW5lZEhhbmRsZXMucHVzaF9iYWNrKGFfaGFuZGxlKTsNCisgIH0gZWxzZSB7DQorICAgIC8vIFdoZW4gbm8gZmlsZSBpcyBzcGVjaWZpZWQsIGVudW1lcmF0ZSBhbGwgRExMcyBhbmQgRVhFcyBpbiB0aGUNCisgICAgLy8gcHJvY2Vzcy4NCisgICAgRW51bWVyYXRlTG9hZGVkTW9kdWxlcyhHZXRDdXJyZW50UHJvY2VzcygpLCBFTE1fQ2FsbGJhY2ssIDApOw0KKyAgfQ0KKw0KKyAgLy8gQmVjYXVzZSB3ZSBkb24ndCByZW1lbWJlciB0aGUgaGFuZGxlLCB3ZSB3aWxsIG5ldmVyIGZyZWUgaXQ7IGhlbmNlLA0KKyAgLy8gaXQgaXMgbG9hZGVkIHBlcm1hbmVudGx5Lg0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCisvLyBTdGFjayBwcm9iaW5nIHJvdXRpbmVzIGFyZSBpbiB0aGUgc3VwcG9ydCBsaWJyYXJ5IChlLmcuIGxpYmdjYyksIGJ1dCB3ZSBkb24ndA0KKy8vIGhhdmUgZHluYW1pYyBsaW5raW5nIG9uIHdpbmRvd3MuIFByb3ZpZGUgYSBob29rLg0KKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkIChfTVNDX1ZFUikNCisgICNkZWZpbmUgRVhQTElDSVRfU1lNQk9MKFNZTSkgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKCFzdHJjbXAoc3ltYm9sTmFtZSwgI1NZTSkpIHJldHVybiAodm9pZCopJlNZTQ0KKyAgI2RlZmluZSBFWFBMSUNJVF9TWU1CT0wyKFNZTUZST00sIFNZTVRPKSAgICAgICAgXA0KKyAgICBpZiAoIXN0cmNtcChzeW1ib2xOYW1lLCAjU1lNRlJPTSkpIHJldHVybiAodm9pZCopJlNZTVRPDQorICAjZGVmaW5lIEVYUExJQ0lUX1NZTUJPTF9ERUYoU1lNKSAgICAgICAgICAgICAgICBcDQorICAgIGV4dGVybiAiQyIgeyBleHRlcm4gdm9pZCAqU1lNOyB9DQorDQorICAjaWYgZGVmaW5lZChfX01JTkdXMzJfXykNCisgICAgRVhQTElDSVRfU1lNQk9MX0RFRihfYWxsb2NhKQ0KKyAgICBFWFBMSUNJVF9TWU1CT0xfREVGKF9fbWFpbikNCisgICAgRVhQTElDSVRfU1lNQk9MX0RFRihfX2FzaGxkaTMpDQorICAgIEVYUExJQ0lUX1NZTUJPTF9ERUYoX19hc2hyZGkzKQ0KKyAgICBFWFBMSUNJVF9TWU1CT0xfREVGKF9fY21wZGkyKQ0KKyAgICBFWFBMSUNJVF9TWU1CT0xfREVGKF9fZGl2ZGkzKQ0KKyAgICBFWFBMSUNJVF9TWU1CT0xfREVGKF9fZml4ZGZkaSkNCisgICAgRVhQTElDSVRfU1lNQk9MX0RFRihfX2ZpeHNmZGkpDQorICAgIEVYUExJQ0lUX1NZTUJPTF9ERUYoX19maXh1bnNkZmRpKQ0KKyAgICBFWFBMSUNJVF9TWU1CT0xfREVGKF9fZml4dW5zc2ZkaSkNCisgICAgRVhQTElDSVRfU1lNQk9MX0RFRihfX2Zsb2F0ZGlkZikNCisgICAgRVhQTElDSVRfU1lNQk9MX0RFRihfX2Zsb2F0ZGlzZikNCisgICAgRVhQTElDSVRfU1lNQk9MX0RFRihfX2xzaHJkaTMpDQorICAgIEVYUExJQ0lUX1NZTUJPTF9ERUYoX19tb2RkaTMpDQorICAgIEVYUExJQ0lUX1NZTUJPTF9ERUYoX191ZGl2ZGkzKQ0KKyAgICBFWFBMSUNJVF9TWU1CT0xfREVGKF9fdW1vZGRpMykNCisgICNlbGlmIGRlZmluZWQoX01TQ19WRVIpDQorICAgIEVYUExJQ0lUX1NZTUJPTF9ERUYoX2FsbG9jYV9wcm9iZSkNCisgICNlbmRpZg0KKyNlbmRpZg0KKw0KK3ZvaWQqIER5bmFtaWNMaWJyYXJ5OjpTZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woY29uc3QgY2hhciogc3ltYm9sTmFtZSkgew0KKyAgLy8gRmlyc3QgY2hlY2sgc3ltYm9scyBhZGRlZCB2aWEgQWRkU3ltYm9sKCkuDQorICBpZiAoRXhwbGljaXRTeW1ib2xzKSB7DQorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB2b2lkICo+OjppdGVyYXRvciBJID0gDQorICAgICAgRXhwbGljaXRTeW1ib2xzLT5maW5kKHN5bWJvbE5hbWUpOw0KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdm9pZCAqPjo6aXRlcmF0b3IgRSA9IEV4cGxpY2l0U3ltYm9scy0+ZW5kKCk7DQorICAgIGlmIChJICE9IEUpDQorICAgICAgcmV0dXJuIEktPnNlY29uZDsNCisgIH0NCisNCisgIC8vIE5vdyBzZWFyY2ggdGhlIGxpYnJhcmllcy4NCisgIGZvciAoc3RkOjp2ZWN0b3I8SE1PRFVMRT46Oml0ZXJhdG9yIEkgPSBPcGVuZWRIYW5kbGVzLmJlZ2luKCksDQorICAgICAgIEUgPSBPcGVuZWRIYW5kbGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgew0KKyAgICBGQVJQUk9DIHB0ciA9IEdldFByb2NBZGRyZXNzKChITU9EVUxFKSpJLCBzeW1ib2xOYW1lKTsNCisgICAgaWYgKHB0cikgew0KKyAgICAgIHJldHVybiAodm9pZCAqKSBwdHI7DQorICAgIH0NCisgIH0NCisNCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykNCisgIHsNCisgICAgRVhQTElDSVRfU1lNQk9MKF9hbGxvY2EpOw0KKyAgICBFWFBMSUNJVF9TWU1CT0woX19tYWluKTsNCisgICAgRVhQTElDSVRfU1lNQk9MKF9fYXNobGRpMyk7DQorICAgIEVYUExJQ0lUX1NZTUJPTChfX2FzaHJkaTMpOw0KKyAgICBFWFBMSUNJVF9TWU1CT0woX19jbXBkaTIpOw0KKyAgICBFWFBMSUNJVF9TWU1CT0woX19kaXZkaTMpOw0KKyAgICBFWFBMSUNJVF9TWU1CT0woX19maXhkZmRpKTsNCisgICAgRVhQTElDSVRfU1lNQk9MKF9fZml4c2ZkaSk7DQorICAgIEVYUExJQ0lUX1NZTUJPTChfX2ZpeHVuc2RmZGkpOw0KKyAgICBFWFBMSUNJVF9TWU1CT0woX19maXh1bnNzZmRpKTsNCisgICAgRVhQTElDSVRfU1lNQk9MKF9fZmxvYXRkaWRmKTsNCisgICAgRVhQTElDSVRfU1lNQk9MKF9fZmxvYXRkaXNmKTsNCisgICAgRVhQTElDSVRfU1lNQk9MKF9fbHNocmRpMyk7DQorICAgIEVYUExJQ0lUX1NZTUJPTChfX21vZGRpMyk7DQorICAgIEVYUExJQ0lUX1NZTUJPTChfX3VkaXZkaTMpOw0KKyAgICBFWFBMSUNJVF9TWU1CT0woX191bW9kZGkzKTsNCisNCisgICAgRVhQTElDSVRfU1lNQk9MMihhbGxvY2EsIF9hbGxvY2EpOw0KKyN1bmRlZiBFWFBMSUNJVF9TWU1CT0wNCisjdW5kZWYgRVhQTElDSVRfU1lNQk9MMg0KKyN1bmRlZiBFWFBMSUNJVF9TWU1CT0xfREVGDQorICB9DQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikNCisgIHsNCisgICAgRVhQTElDSVRfU1lNQk9MMihhbGxvY2EsIF9hbGxvY2FfcHJvYmUpOw0KKyAgICBFWFBMSUNJVF9TWU1CT0wyKF9hbGxvY2EsIF9hbGxvY2FfcHJvYmUpOw0KKyN1bmRlZiBFWFBMSUNJVF9TWU1CT0wNCisjdW5kZWYgRVhQTElDSVRfU1lNQk9MMg0KKyN1bmRlZiBFWFBMSUNJVF9TWU1CT0xfREVGDQorICB9DQorI2VuZGlmDQorDQorICByZXR1cm4gMDsNCit9DQorDQorfQ0KKw0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvSG9zdC5pbmMgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL0hvc3QuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjAwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL0hvc3QuaW5jCkBAIC0wLDAgKzEsMjMgQEAKKy8vPT09LSBsbHZtL1N5c3RlbS9XaW4zMi9Ib3N0LmluYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFdpbjMyIEhvc3Qgc3VwcG9ydC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiV2luMzIuaCIKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RkOjpzdHJpbmcgc3lzOjpnZXRIb3N0VHJpcGxlKCkgeworICAvLyBGSVhNRTogQWRhcHQgdG8gcnVubmluZyB2ZXJzaW9uLgorICByZXR1cm4gTExWTV9IT1NUVFJJUExFOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9NZW1vcnkuaW5jIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9NZW1vcnkuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NzRlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL01lbW9yeS5pbmMKQEAgLTAsMCArMSw3MyBAQAorLy89PT0tIFdpbjMyL01lbW9yeS5jcHAgLSBXaW4zMiBNZW1vcnkgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgV2luMzIgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdmFyaW91cyBNZW1vcnkNCisvLyBtYW5hZ2VtZW50IHV0aWxpdGllcw0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisjaW5jbHVkZSAiV2luMzIuaCINCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiDQorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1Byb2Nlc3MuaCINCisNCituYW1lc3BhY2UgbGx2bSB7DQordXNpbmcgbmFtZXNwYWNlIHN5czsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgV2luMzIgc3BlY2lmaWMgY29kZSANCisvLz09PSAgICAgICAgICBhbmQgbXVzdCBub3QgYmUgVU5JWCBjb2RlDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitNZW1vcnlCbG9jayBNZW1vcnk6OkFsbG9jYXRlUldYKHNpemVfdCBOdW1CeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUJsb2NrICpOZWFyQmxvY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyTXNnKSB7DQorICBpZiAoTnVtQnl0ZXMgPT0gMCkgcmV0dXJuIE1lbW9yeUJsb2NrKCk7DQorDQorICBzdGF0aWMgY29uc3Qgc2l6ZV90IHBhZ2VTaXplID0gUHJvY2Vzczo6R2V0UGFnZVNpemUoKTsNCisgIHNpemVfdCBOdW1QYWdlcyA9IChOdW1CeXRlcytwYWdlU2l6ZS0xKS9wYWdlU2l6ZTsNCisNCisgIC8vRklYTUU6IHN1cHBvcnQgTmVhckJsb2NrIGlmIGV2ZXIgbmVlZGVkIG9uIFdpbjY0Lg0KKw0KKyAgdm9pZCAqcGEgPSBWaXJ0dWFsQWxsb2MoTlVMTCwgTnVtUGFnZXMqcGFnZVNpemUsIE1FTV9DT01NSVQsDQorICAgICAgICAgICAgICAgICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSk7DQorICBpZiAocGEgPT0gTlVMTCkgew0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywgIkNhbid0IGFsbG9jYXRlIFJXWCBNZW1vcnk6ICIpOw0KKyAgICByZXR1cm4gTWVtb3J5QmxvY2soKTsNCisgIH0NCisNCisgIE1lbW9yeUJsb2NrIHJlc3VsdDsNCisgIHJlc3VsdC5BZGRyZXNzID0gcGE7DQorICByZXN1bHQuU2l6ZSA9IE51bVBhZ2VzKnBhZ2VTaXplOw0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorDQorYm9vbCBNZW1vcnk6OlJlbGVhc2VSV1goTWVtb3J5QmxvY2sgJk0sIHN0ZDo6c3RyaW5nICpFcnJNc2cpIHsNCisgIGlmIChNLkFkZHJlc3MgPT0gMCB8fCBNLlNpemUgPT0gMCkgcmV0dXJuIGZhbHNlOw0KKyAgaWYgKCFWaXJ0dWFsRnJlZShNLkFkZHJlc3MsIDAsIE1FTV9SRUxFQVNFKSkNCisgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCAiQ2FuJ3QgcmVsZWFzZSBSV1ggTWVtb3J5OiAiKTsNCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBNZW1vcnk6OnNldFdyaXRhYmxlKE1lbW9yeUJsb2NrICZNLCBzdGQ6OnN0cmluZyAqRXJyTXNnKSB7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBNZW1vcnk6OnNldEV4ZWN1dGFibGUoTWVtb3J5QmxvY2sgJk0sIHN0ZDo6c3RyaW5nICpFcnJNc2cpIHsNCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBNZW1vcnk6OnNldFJhbmdlV3JpdGFibGUoY29uc3Qgdm9pZCAqQWRkciwgc2l6ZV90IFNpemUpIHsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIE1lbW9yeTo6c2V0UmFuZ2VFeGVjdXRhYmxlKGNvbnN0IHZvaWQgKkFkZHIsIHNpemVfdCBTaXplKSB7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL011dGV4LmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvTXV0ZXguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2Y2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL011dGV4LmluYwpAQCAtMCwwICsxLDU4IEBACisvLz09PS0gbGx2bS9TeXN0ZW0vV2luMzIvTXV0ZXguaW5jIC0gV2luMzIgTXV0ZXggSW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFdpbjMyIHNwZWNpZmljIChub24tcHRocmVhZCkgTXV0ZXggY2xhc3MuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy89PT0gV0FSTklORzogSW1wbGVtZW50YXRpb24gaGVyZSBtdXN0IGNvbnRhaW4gb25seSBnZW5lcmljIFdpbjMyIGNvZGUgdGhhdA0KKy8vPT09ICAgICAgICAgIGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiAqYWxsKiBXaW4zMiB2YXJpYW50cy4NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKyNpbmNsdWRlICJXaW4zMi5oIg0KKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NdXRleC5oIg0KKw0KK25hbWVzcGFjZSBsbHZtIHsNCit1c2luZyBuYW1lc3BhY2Ugc3lzOw0KKw0KK011dGV4SW1wbDo6TXV0ZXhJbXBsKGJvb2wgLypyZWN1cnNpdmUqLykNCit7DQorICBkYXRhXyA9IG5ldyBDUklUSUNBTF9TRUNUSU9OOw0KKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigoTFBDUklUSUNBTF9TRUNUSU9OKWRhdGFfKTsNCit9DQorDQorTXV0ZXhJbXBsOjp+TXV0ZXhJbXBsKCkNCit7DQorICBEZWxldGVDcml0aWNhbFNlY3Rpb24oKExQQ1JJVElDQUxfU0VDVElPTilkYXRhXyk7DQorICBkZWxldGUgKExQQ1JJVElDQUxfU0VDVElPTilkYXRhXzsNCisgIGRhdGFfID0gMDsNCit9DQorDQorYm9vbCANCitNdXRleEltcGw6OmFjcXVpcmUoKQ0KK3sNCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uKChMUENSSVRJQ0FMX1NFQ1RJT04pZGF0YV8pOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgDQorTXV0ZXhJbXBsOjpyZWxlYXNlKCkNCit7DQorICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigoTFBDUklUSUNBTF9TRUNUSU9OKWRhdGFfKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIA0KK011dGV4SW1wbDo6dHJ5YWNxdWlyZSgpDQorew0KKyAgcmV0dXJuIFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uKChMUENSSVRJQ0FMX1NFQ1RJT04pZGF0YV8pOw0KK30NCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9QYXRoLmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvUGF0aC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliYmQzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvUGF0aC5pbmMKQEAgLTAsMCArMSw4NjggQEAKKy8vPT09LSBsbHZtL1N5c3RlbS9XaW4zMi9QYXRoLmNwcCAtIFdpbjMyIFBhdGggSW1wbGVtZW50YXRpb24gLS0tKi0gQysrIC0qLT09PS8vDQorLy8NCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8NCisvLyBNb2RpZmllZCBieSBIZW5yaWsgQmFjaCB0byBjb21wbHkgd2l0aCBhdCBsZWFzdCBNaW5HVy4NCisvLyBQb3J0ZWQgdG8gV2luMzIgYnkgSmVmZiBDb2hlbi4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIFdpbjMyIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXRoIGNsYXNzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBXaW4zMiBjb2RlIHRoYXQNCisvLz09PSAgICAgICAgICBpcyBndWFyYW50ZWVkIHRvIHdvcmsgb24gKmFsbCogV2luMzIgdmFyaWFudHMuDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisjaW5jbHVkZSAiV2luMzIuaCINCisjaW5jbHVkZSA8bWFsbG9jLmg+DQorI2luY2x1ZGUgPGNzdGRpbz4NCisNCisvLyBXZSBuZWVkIHRvIHVuZG8gYSBtYWNybyBkZWZpbmVkIGluIFdpbmRvd3MuaCwgb3RoZXJ3aXNlIHdlIHdvbid0IGNvbXBpbGU6DQorI3VuZGVmIENvcHlGaWxlDQorI3VuZGVmIEdldEN1cnJlbnREaXJlY3RvcnkNCisNCisvLyBXaW5kb3dzIGhhcHBpbHkgYWNjZXB0cyBlaXRoZXIgZm9yd2FyZCBvciBiYWNrd2FyZCBzbGFzaGVzLCB0aG91Z2ggYW55IHBhdGgNCisvLyByZXR1cm5lZCBieSBhIFdpbjMyIEFQSSB3aWxsIGhhdmUgYmFja3dhcmQgc2xhc2hlcy4gIEFzIExMVk0gY29kZSBiYXNpY2FsbHkNCisvLyBhc3N1bWVzIGZvcndhcmQgc2xhc2hlcyBhcmUgdXNlZCwgYmFja3dhcmQgc2xhc2hzIGFyZSBjb252ZXJ0ZWQgd2hlcmUgdGhleQ0KKy8vIGNhbiBiZSBpbnRyb2R1Y2VkIGludG8gYSBwYXRoLg0KKy8vDQorLy8gQW5vdGhlciBpbnZhcmlhbnQgaXMgdGhhdCBhIHBhdGggZW5kcyB3aXRoIGEgc2xhc2ggaWYgYW5kIG9ubHkgaWYgdGhlIHBhdGgNCisvLyBpcyBhIHJvb3QgZGlyZWN0b3J5LiAgQW55IG90aGVyIHVzZSBvZiBhIHRyYWlsaW5nIHNsYXNoIGlzIHN0cmlwcGVkLiAgVW5saWtlDQorLy8gaW4gVW5peCwgV2luZG93cyBoYXMgYSByYXRoZXIgY29tcGxpY2F0ZWQgbm90aW9uIG9mIGEgcm9vdCBwYXRoIGFuZCB0aGlzDQorLy8gaW52YXJpYW50IGhlbHBzIHNpbXBseSB0aGUgY29kZS4NCisNCitzdGF0aWMgdm9pZCBGbGlwQmFja1NsYXNoZXMoc3RkOjpzdHJpbmcmIHMpIHsNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcy5zaXplKCk7IGkrKykNCisgICAgaWYgKHNbaV0gPT0gJ1xcJykNCisgICAgICBzW2ldID0gJy8nOw0KK30NCisNCituYW1lc3BhY2UgbGx2bSB7DQorbmFtZXNwYWNlIHN5cyB7DQorY29uc3QgY2hhciBQYXRoU2VwYXJhdG9yID0gJzsnOw0KKw0KK1BhdGg6OlBhdGgobGx2bTo6U3RyaW5nUmVmIHApDQorICA6IHBhdGgocCkgew0KKyAgRmxpcEJhY2tTbGFzaGVzKHBhdGgpOw0KK30NCisNCitQYXRoOjpQYXRoKGNvbnN0IGNoYXIgKlN0clN0YXJ0LCB1bnNpZ25lZCBTdHJMZW4pDQorICA6IHBhdGgoU3RyU3RhcnQsIFN0ckxlbikgew0KKyAgRmxpcEJhY2tTbGFzaGVzKHBhdGgpOw0KK30NCisNCitQYXRoJg0KK1BhdGg6Om9wZXJhdG9yPShTdHJpbmdSZWYgdGhhdCkgew0KKyAgcGF0aC5hc3NpZ24odGhhdC5kYXRhKCksIHRoYXQuc2l6ZSgpKTsNCisgIEZsaXBCYWNrU2xhc2hlcyhwYXRoKTsNCisgIHJldHVybiAqdGhpczsNCit9DQorDQorYm9vbA0KK1BhdGg6OmlzVmFsaWQoKSBjb25zdCB7DQorICBpZiAocGF0aC5lbXB0eSgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICAvLyBJZiB0aGVyZSBpcyBhIGNvbG9uLCBpdCBtdXN0IGJlIHRoZSBzZWNvbmQgY2hhcmFjdGVyLCBwcmVjZWRlZCBieSBhIGxldHRlcg0KKyAgLy8gYW5kIGZvbGxvd2VkIGJ5IHNvbWV0aGluZy4NCisgIHNpemVfdCBsZW4gPSBwYXRoLnNpemUoKTsNCisgIHNpemVfdCBwb3MgPSBwYXRoLnJmaW5kKCc6JyxsZW4pOw0KKyAgc2l6ZV90IHJvb3RzbGFzaCA9IDA7DQorICBpZiAocG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7DQorICAgIGlmIChwb3MgIT0gMSB8fCAhaXNhbHBoYShwYXRoWzBdKSB8fCBsZW4gPCAzKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICByb290c2xhc2ggPSAyOw0KKyAgfQ0KKw0KKyAgLy8gTG9vayBmb3IgYSBVTkMgcGF0aCwgYW5kIGlmIGZvdW5kIGFkanVzdCBvdXIgbm90aW9uIG9mIHRoZSByb290IHNsYXNoLg0KKyAgaWYgKGxlbiA+IDMgJiYgcGF0aFswXSA9PSAnLycgJiYgcGF0aFsxXSA9PSAnLycpIHsNCisgICAgcm9vdHNsYXNoID0gcGF0aC5maW5kKCcvJywgMik7DQorICAgIGlmIChyb290c2xhc2ggPT0gc3RkOjpzdHJpbmc6Om5wb3MpDQorICAgICAgcm9vdHNsYXNoID0gMDsNCisgIH0NCisNCisgIC8vIENoZWNrIGZvciBpbGxlZ2FsIGNoYXJhY3RlcnMuDQorICBpZiAocGF0aC5maW5kX2ZpcnN0X29mKCJcXDw+XCJ8XDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMiINCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNiINCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyIpDQorICAgICAgIT0gc3RkOjpzdHJpbmc6Om5wb3MpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGl0J3MgYSByb290IHNsYXNoLg0KKyAgaWYgKGxlbiA+IHJvb3RzbGFzaCsxICYmIHBhdGhbbGVuLTFdID09ICcvJykNCisgICAgcGF0aC5lcmFzZSgtLWxlbik7DQorDQorICAvLyBDaGVjayBlYWNoIGNvbXBvbmVudCBmb3IgbGVnYWxpdHkuDQorICBmb3IgKHBvcyA9IDA7IHBvcyA8IGxlbjsgKytwb3MpIHsNCisgICAgLy8gQSBjb21wb25lbnQgbWF5IG5vdCBlbmQgaW4gYSBzcGFjZS4NCisgICAgaWYgKHBhdGhbcG9zXSA9PSAnICcpIHsNCisgICAgICBpZiAocGF0aFtwb3MrMV0gPT0gJy8nIHx8IHBhdGhbcG9zKzFdID09ICdcMCcpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgLy8gQSBjb21wb25lbnQgbWF5IG5vdCBlbmQgaW4gYSBwZXJpb2QuDQorICAgIGlmIChwYXRoW3Bvc10gPT0gJy4nKSB7DQorICAgICAgaWYgKHBhdGhbcG9zKzFdID09ICcvJyB8fCBwYXRoW3BvcysxXSA9PSAnXDAnKSB7DQorICAgICAgICAvLyBVbmxlc3MgaXQgaXMgdGhlIHBzZXVkby1kaXJlY3RvcnkgIi4iLi4uDQorICAgICAgICBpZiAocG9zID09IDAgfHwgcGF0aFtwb3MtMV0gPT0gJy8nIHx8IHBhdGhbcG9zLTFdID09ICc6JykNCisgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAvLyBvciAiLi4iLg0KKyAgICAgICAgaWYgKHBvcyA+IDAgJiYgcGF0aFtwb3MtMV0gPT0gJy4nKSB7DQorICAgICAgICAgIGlmIChwb3MgPT0gMSB8fCBwYXRoW3Bvcy0yXSA9PSAnLycgfHwgcGF0aFtwb3MtMl0gPT0gJzonKQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK3ZvaWQgUGF0aDo6bWFrZUFic29sdXRlKCkgew0KKyAgVENIQVIgIEZ1bGxQYXRoW01BWF9QQVRIICsgMV0gPSB7MH07DQorICBMUFRTVFIgRmlsZVBhcnQgPSBOVUxMOw0KKw0KKyAgRFdPUkQgUmV0TGVuZ3RoID0gOjpHZXRGdWxsUGF0aE5hbWVBKHBhdGguY19zdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRnVsbFBhdGgpL3NpemVvZihGdWxsUGF0aFswXSksDQorICAgICAgICAgICAgICAgICAgICAgICAgRnVsbFBhdGgsICZGaWxlUGFydCk7DQorDQorICBpZiAoMCA9PSBSZXRMZW5ndGgpIHsNCisgICAgLy8gRklYTUU6IFJlcG9ydCB0aGUgZXJyb3IgR2V0TGFzdEVycm9yKCkNCisgICAgYXNzZXJ0KDAgJiYgIlVuYWJsZSB0byBtYWtlIGFic29sdXRlIHBhdGghIik7DQorICB9IGVsc2UgaWYgKFJldExlbmd0aCA+IE1BWF9QQVRIKSB7DQorICAgIC8vIEZJWE1FOiBSZXBvcnQgdG9vIHNtYWxsIGJ1ZmZlciAobmVlZGVkIFJldExlbmd0aCBieXRlcykuDQorICAgIGFzc2VydCgwICYmICJVbmFibGUgdG8gbWFrZSBhYnNvbHV0ZSBwYXRoISIpOw0KKyAgfSBlbHNlIHsNCisgICAgcGF0aCA9IEZ1bGxQYXRoOw0KKyAgfQ0KK30NCisNCitib29sDQorUGF0aDo6aXNBYnNvbHV0ZShjb25zdCBjaGFyICpOYW1lU3RhcnQsIHVuc2lnbmVkIE5hbWVMZW4pIHsNCisgIGFzc2VydChOYW1lU3RhcnQpOw0KKyAgLy8gRklYTUU6IFRoaXMgZG9lcyBub3QgaGFuZGxlIGNvcnJlY3RseSBhbiBhYnNvbHV0ZSBwYXRoIHN0YXJ0aW5nIGZyb20NCisgIC8vIGEgZHJpdmUgbGV0dGVyIG9yIGluIFVOQyBmb3JtYXQuDQorICBzd2l0Y2ggKE5hbWVMZW4pIHsNCisgIGNhc2UgMDoNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgY2FzZSAxOg0KKyAgY2FzZSAyOg0KKyAgICByZXR1cm4gTmFtZVN0YXJ0WzBdID09ICcvJzsNCisgIGRlZmF1bHQ6DQorICAgIHJldHVybiAoTmFtZVN0YXJ0WzBdID09ICcvJyB8fCAoTmFtZVN0YXJ0WzFdID09ICc6JyAmJiBOYW1lU3RhcnRbMl0gPT0gJy8nKSkgfHwNCisgICAgICAgICAgIChOYW1lU3RhcnRbMF0gPT0gJ1xcJyB8fCAoTmFtZVN0YXJ0WzFdID09ICc6JyAmJiBOYW1lU3RhcnRbMl0gPT0gJ1xcJykpOw0KKyAgfQ0KK30NCisNCitib29sDQorUGF0aDo6aXNBYnNvbHV0ZSgpIGNvbnN0IHsNCisgIC8vIEZJWE1FOiBUaGlzIGRvZXMgbm90IGhhbmRsZSBjb3JyZWN0bHkgYW4gYWJzb2x1dGUgcGF0aCBzdGFydGluZyBmcm9tDQorICAvLyBhIGRyaXZlIGxldHRlciBvciBpbiBVTkMgZm9ybWF0Lg0KKyAgc3dpdGNoIChwYXRoLmxlbmd0aCgpKSB7DQorICAgIGNhc2UgMDoNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGNhc2UgMToNCisgICAgY2FzZSAyOg0KKyAgICAgIHJldHVybiBwYXRoWzBdID09ICcvJzsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gcGF0aFswXSA9PSAnLycgfHwgKHBhdGhbMV0gPT0gJzonICYmIHBhdGhbMl0gPT0gJy8nKTsNCisgIH0NCit9DQorDQorc3RhdGljIFBhdGggKlRlbXBEaXJlY3Rvcnk7DQorDQorUGF0aA0KK1BhdGg6OkdldFRlbXBvcmFyeURpcmVjdG9yeShzdGQ6OnN0cmluZyogRXJyTXNnKSB7DQorICBpZiAoVGVtcERpcmVjdG9yeSkNCisgICAgcmV0dXJuICpUZW1wRGlyZWN0b3J5Ow0KKw0KKyAgY2hhciBwYXRobmFtZVtNQVhfUEFUSF07DQorICBpZiAoIUdldFRlbXBQYXRoKE1BWF9QQVRILCBwYXRobmFtZSkpIHsNCisgICAgaWYgKEVyck1zZykNCisgICAgICAqRXJyTXNnID0gIkNhbid0IGRldGVybWluZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IjsNCisgICAgcmV0dXJuIFBhdGgoKTsNCisgIH0NCisNCisgIFBhdGggcmVzdWx0Ow0KKyAgcmVzdWx0LnNldChwYXRobmFtZSk7DQorDQorICAvLyBBcHBlbmQgYSBzdWJkaXJlY3RvcnkgcGFzc2VkIG9uIG91ciBwcm9jZXNzIGlkIHNvIG11bHRpcGxlIExMVk1zIGRvbid0DQorICAvLyBzdGVwIG9uIGVhY2ggb3RoZXIncyB0b2VzLg0KKyNpZmRlZiBfX01JTkdXMzJfXw0KKyAgLy8gTWluZ3cncyBXaW4zMiBoZWFkZXIgZmlsZXMgYXJlIGJyb2tlbi4NCisgIHNwcmludGYocGF0aG5hbWUsICJMTFZNXyV1IiwgdW5zaWduZWQoR2V0Q3VycmVudFByb2Nlc3NJZCgpKSk7DQorI2Vsc2UNCisgIHNwcmludGYocGF0aG5hbWUsICJMTFZNXyV1IiwgR2V0Q3VycmVudFByb2Nlc3NJZCgpKTsNCisjZW5kaWYNCisgIHJlc3VsdC5hcHBlbmRDb21wb25lbnQocGF0aG5hbWUpOw0KKw0KKyAgLy8gSWYgdGhlcmUncyBhIGRpcmVjdG9yeSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIExMVk0gZXhlY3V0aW9uIHRoYXQNCisgIC8vIGhhcHBlbmVkIHRvIGhhdmUgdGhlIHNhbWUgcHJvY2VzcyBpZCwgZ2V0IHJpZCBvZiBpdC4NCisgIHJlc3VsdC5lcmFzZUZyb21EaXNrKHRydWUpOw0KKw0KKyAgLy8gQW5kIGZpbmFsbHkgKHJlLSljcmVhdGUgdGhlIGVtcHR5IGRpcmVjdG9yeS4NCisgIHJlc3VsdC5jcmVhdGVEaXJlY3RvcnlPbkRpc2soZmFsc2UpOw0KKyAgVGVtcERpcmVjdG9yeSA9IG5ldyBQYXRoKHJlc3VsdCk7DQorICByZXR1cm4gKlRlbXBEaXJlY3Rvcnk7DQorfQ0KKw0KKy8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIHNldCBvZiBmdW5jdGlvbnMgZG9uJ3QgbWFwIHRvIFdpbmRvd3MgdmVyeSB3ZWxsLg0KK1BhdGgNCitQYXRoOjpHZXRSb290RGlyZWN0b3J5KCkgew0KKyAgUGF0aCByZXN1bHQ7DQorICByZXN1bHQuc2V0KCJDOi8iKTsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KK3ZvaWQNCitQYXRoOjpHZXRTeXN0ZW1MaWJyYXJ5UGF0aHMoc3RkOjp2ZWN0b3I8c3lzOjpQYXRoPiYgUGF0aHMpIHsNCisgIFBhdGhzLnB1c2hfYmFjayhzeXM6OlBhdGgoIkM6L1dJTkRPV1MvU1lTVEVNMzIiKSk7DQorICBQYXRocy5wdXNoX2JhY2soc3lzOjpQYXRoKCJDOi9XSU5ET1dTIikpOw0KK30NCisNCit2b2lkDQorUGF0aDo6R2V0Qml0Y29kZUxpYnJhcnlQYXRocyhzdGQ6OnZlY3RvcjxzeXM6OlBhdGg+JiBQYXRocykgew0KKyAgY2hhciAqIGVudl92YXIgPSBnZXRlbnYoIkxMVk1fTElCX1NFQVJDSF9QQVRIIik7DQorICBpZiAoZW52X3ZhciAhPSAwKSB7DQorICAgIGdldFBhdGhMaXN0KGVudl92YXIsUGF0aHMpOw0KKyAgfQ0KKyNpZmRlZiBMTFZNX0xJQkRJUg0KKyAgew0KKyAgICBQYXRoIHRtcFBhdGg7DQorICAgIGlmICh0bXBQYXRoLnNldChMTFZNX0xJQkRJUikpDQorICAgICAgaWYgKHRtcFBhdGguY2FuUmVhZCgpKQ0KKyAgICAgICAgUGF0aHMucHVzaF9iYWNrKHRtcFBhdGgpOw0KKyAgfQ0KKyNlbmRpZg0KKyAgR2V0U3lzdGVtTGlicmFyeVBhdGhzKFBhdGhzKTsNCit9DQorDQorUGF0aA0KK1BhdGg6OkdldExMVk1EZWZhdWx0Q29uZmlnRGlyKCkgew0KKyAgLy8gVE9ETzogdGhpcyBpc24ndCBnb2luZyB0byBmbHkgb24gV2luZG93cw0KKyAgcmV0dXJuIFBhdGgoIi9ldGMvbGx2bSIpOw0KK30NCisNCitQYXRoDQorUGF0aDo6R2V0VXNlckhvbWVEaXJlY3RvcnkoKSB7DQorICAvLyBUT0RPOiBUeXBpY2FsIFdpbmRvd3Mgc2V0dXAgZG9lc24ndCBkZWZpbmUgSE9NRS4NCisgIGNvbnN0IGNoYXIqIGhvbWUgPSBnZXRlbnYoIkhPTUUiKTsNCisgIGlmIChob21lKSB7DQorICAgIFBhdGggcmVzdWx0Ow0KKyAgICBpZiAocmVzdWx0LnNldChob21lKSkNCisgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKyAgcmV0dXJuIEdldFJvb3REaXJlY3RvcnkoKTsNCit9DQorDQorUGF0aA0KK1BhdGg6OkdldEN1cnJlbnREaXJlY3RvcnkoKSB7DQorICBjaGFyIHBhdGhuYW1lW01BWF9QQVRIXTsNCisgIDo6R2V0Q3VycmVudERpcmVjdG9yeUEoTUFYX1BBVEgscGF0aG5hbWUpOw0KKyAgcmV0dXJuIFBhdGgocGF0aG5hbWUpOw0KK30NCisNCisvLy8gR2V0TWFpbkV4ZWN1dGFibGUgLSBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIG1haW4gZXhlY3V0YWJsZSwgZ2l2ZW4gdGhlDQorLy8vIHZhbHVlIG9mIGFyZ3ZbMF0gZnJvbSBwcm9ncmFtIHN0YXJ0dXAuDQorUGF0aCBQYXRoOjpHZXRNYWluRXhlY3V0YWJsZShjb25zdCBjaGFyICphcmd2MCwgdm9pZCAqTWFpbkFkZHIpIHsNCisgIGNoYXIgcGF0aG5hbWVbTUFYX1BBVEhdOw0KKyAgRFdPUkQgcmV0ID0gOjpHZXRNb2R1bGVGaWxlTmFtZUEoTlVMTCwgcGF0aG5hbWUsIE1BWF9QQVRIKTsNCisgIHJldHVybiByZXQgIT0gTUFYX1BBVEggPyBQYXRoKHBhdGhuYW1lKSA6IFBhdGgoKTsNCit9DQorDQorDQorLy8gRklYTUU6IHRoZSBhYm92ZSBzZXQgb2YgZnVuY3Rpb25zIGRvbid0IG1hcCB0byBXaW5kb3dzIHZlcnkgd2VsbC4NCisNCisNCitTdHJpbmdSZWYgUGF0aDo6Z2V0RGlybmFtZSgpIGNvbnN0IHsNCisgIHJldHVybiBnZXREaXJuYW1lQ2hhclNlcChwYXRoLCAiLyIpOw0KK30NCisNCitTdHJpbmdSZWYNCitQYXRoOjpnZXRCYXNlbmFtZSgpIGNvbnN0IHsNCisgIC8vIEZpbmQgdGhlIGxhc3Qgc2xhc2gNCisgIHNpemVfdCBzbGFzaCA9IHBhdGgucmZpbmQoJy8nKTsNCisgIGlmIChzbGFzaCA9PSBzdGQ6OnN0cmluZzo6bnBvcykNCisgICAgc2xhc2ggPSAwOw0KKyAgZWxzZQ0KKyAgICBzbGFzaCsrOw0KKw0KKyAgc2l6ZV90IGRvdCA9IHBhdGgucmZpbmQoJy4nKTsNCisgIGlmIChkb3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwgZG90IDwgc2xhc2gpDQorICAgIHJldHVybiBTdHJpbmdSZWYocGF0aCkuc3Vic3RyKHNsYXNoKTsNCisgIGVsc2UNCisgICAgcmV0dXJuIFN0cmluZ1JlZihwYXRoKS5zdWJzdHIoc2xhc2gsIGRvdCAtIHNsYXNoKTsNCit9DQorDQorU3RyaW5nUmVmDQorUGF0aDo6Z2V0U3VmZml4KCkgY29uc3Qgew0KKyAgLy8gRmluZCB0aGUgbGFzdCBzbGFzaA0KKyAgc2l6ZV90IHNsYXNoID0gcGF0aC5yZmluZCgnLycpOw0KKyAgaWYgKHNsYXNoID09IHN0ZDo6c3RyaW5nOjpucG9zKQ0KKyAgICBzbGFzaCA9IDA7DQorICBlbHNlDQorICAgIHNsYXNoKys7DQorDQorICBzaXplX3QgZG90ID0gcGF0aC5yZmluZCgnLicpOw0KKyAgaWYgKGRvdCA9PSBzdGQ6OnN0cmluZzo6bnBvcyB8fCBkb3QgPCBzbGFzaCkNCisgICAgcmV0dXJuIFN0cmluZ1JlZigiIik7DQorICBlbHNlDQorICAgIHJldHVybiBTdHJpbmdSZWYocGF0aCkuc3Vic3RyKGRvdCArIDEpOw0KK30NCisNCitib29sDQorUGF0aDo6ZXhpc3RzKCkgY29uc3Qgew0KKyAgRFdPUkQgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKHBhdGguY19zdHIoKSk7DQorICByZXR1cm4gYXR0ciAhPSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUzsNCit9DQorDQorYm9vbA0KK1BhdGg6OmlzRGlyZWN0b3J5KCkgY29uc3Qgew0KKyAgRFdPUkQgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKHBhdGguY19zdHIoKSk7DQorICByZXR1cm4gKGF0dHIgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpICYmDQorICAgICAgICAgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpOw0KK30NCisNCitib29sDQorUGF0aDo6Y2FuUmVhZCgpIGNvbnN0IHsNCisgIC8vIEZJWE1FOiB0YWtlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgaW50byBhY2NvdW50Lg0KKyAgRFdPUkQgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKHBhdGguY19zdHIoKSk7DQorICByZXR1cm4gYXR0ciAhPSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUzsNCit9DQorDQorYm9vbA0KK1BhdGg6OmNhbldyaXRlKCkgY29uc3Qgew0KKyAgLy8gRklYTUU6IHRha2Ugc2VjdXJpdHkgYXR0cmlidXRlcyBpbnRvIGFjY291bnQuDQorICBEV09SRCBhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMocGF0aC5jX3N0cigpKTsNCisgIHJldHVybiAoYXR0ciAhPSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUykgJiYgIShhdHRyICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpOw0KK30NCisNCitib29sDQorUGF0aDo6Y2FuRXhlY3V0ZSgpIGNvbnN0IHsNCisgIC8vIEZJWE1FOiB0YWtlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgaW50byBhY2NvdW50Lg0KKyAgRFdPUkQgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKHBhdGguY19zdHIoKSk7DQorICByZXR1cm4gYXR0ciAhPSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUzsNCit9DQorDQorYm9vbA0KK1BhdGg6OmlzUmVndWxhckZpbGUoKSBjb25zdCB7DQorICBpZiAoaXNEaXJlY3RvcnkoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK1N0cmluZ1JlZg0KK1BhdGg6OmdldExhc3QoKSBjb25zdCB7DQorICAvLyBGaW5kIHRoZSBsYXN0IHNsYXNoDQorICBzaXplX3QgcG9zID0gcGF0aC5yZmluZCgnLycpOw0KKw0KKyAgLy8gSGFuZGxlIHRoZSBjb3JuZXIgY2FzZXMNCisgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpDQorICAgIHJldHVybiBwYXRoOw0KKw0KKyAgLy8gSWYgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgc2xhc2gsIHdlIGhhdmUgYSByb290IGRpcmVjdG9yeQ0KKyAgaWYgKHBvcyA9PSBwYXRoLmxlbmd0aCgpLTEpDQorICAgIHJldHVybiBwYXRoOw0KKw0KKyAgLy8gUmV0dXJuIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3Qgc2xhc2gNCisgIHJldHVybiBTdHJpbmdSZWYocGF0aCkuc3Vic3RyKHBvcysxKTsNCit9DQorDQorY29uc3QgRmlsZVN0YXR1cyAqDQorUGF0aFdpdGhTdGF0dXM6OmdldEZpbGVTdGF0dXMoYm9vbCB1cGRhdGUsIHN0ZDo6c3RyaW5nICpFcnJTdHIpIGNvbnN0IHsNCisgIGlmICghZnNJc1ZhbGlkIHx8IHVwZGF0ZSkgew0KKyAgICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIGZpOw0KKyAgICBpZiAoIUdldEZpbGVBdHRyaWJ1dGVzRXgocGF0aC5jX3N0cigpLCBHZXRGaWxlRXhJbmZvU3RhbmRhcmQsICZmaSkpIHsNCisgICAgICBNYWtlRXJyTXNnKEVyclN0ciwgImdldFN0YXR1c0luZm8oKToiICsgc3RkOjpzdHJpbmcocGF0aCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAiOiBDYW4ndCBnZXQgc3RhdHVzOiAiKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBzdGF0dXMuZmlsZVNpemUgPSBmaS5uRmlsZVNpemVIaWdoOw0KKyAgICBzdGF0dXMuZmlsZVNpemUgPDw9IHNpemVvZihmaS5uRmlsZVNpemVIaWdoKSo4Ow0KKyAgICBzdGF0dXMuZmlsZVNpemUgKz0gZmkubkZpbGVTaXplTG93Ow0KKw0KKyAgICBzdGF0dXMubW9kZSA9IGZpLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSA/IDA1NTUgOiAwNzc3Ow0KKyAgICBzdGF0dXMudXNlciA9IDk5OTk7ICAgIC8vIE5vdCBhcHBsaWNhYmxlIHRvIFdpbmRvd3MsIHNvLi4uDQorICAgIHN0YXR1cy5ncm91cCA9IDk5OTk7ICAgLy8gTm90IGFwcGxpY2FibGUgdG8gV2luZG93cywgc28uLi4NCisNCisgICAgLy8gRklYTUU6IHRoaXMgaXMgb25seSB1bmlxdWUgaWYgdGhlIGZpbGUgaXMgYWNjZXNzZWQgYnkgdGhlIHNhbWUgZmlsZSBwYXRoLg0KKyAgICAvLyBIb3cgZG8gd2UgZG8gdGhpcyBmb3IgQzpcZGlyXGZpbGUgYW5kIC4uXGRpclxmaWxlID8gVW5peCBoYXMgaW5vZGUNCisgICAgLy8gbnVtYmVycywgYnV0IHRoZSBjb25jZXB0IGRvZXNuJ3QgZXhpc3QgaW4gV2luZG93cy4NCisgICAgc3RhdHVzLnVuaXF1ZUlEID0gMDsNCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoKCk7ICsraSkNCisgICAgICBzdGF0dXMudW5pcXVlSUQgKz0gcGF0aFtpXTsNCisNCisgICAgX19pbnQ2NCBmdCA9ICpyZWludGVycHJldF9jYXN0PF9faW50NjQqPigmZmkuZnRMYXN0V3JpdGVUaW1lKTsNCisgICAgc3RhdHVzLm1vZFRpbWUuZnJvbVdpbjMyVGltZShmdCk7DQorDQorICAgIHN0YXR1cy5pc0RpciA9IGZpLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7DQorICAgIGZzSXNWYWxpZCA9IHRydWU7DQorICB9DQorICByZXR1cm4gJnN0YXR1czsNCit9DQorDQorYm9vbCBQYXRoOjptYWtlUmVhZGFibGVPbkRpc2soc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgLy8gQWxsIGZpbGVzIGFyZSByZWFkYWJsZSBvbiBXaW5kb3dzIChpZ25vcmluZyBzZWN1cml0eSBhdHRyaWJ1dGVzKS4NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBQYXRoOjptYWtlV3JpdGVhYmxlT25EaXNrKHN0ZDo6c3RyaW5nKiBFcnJNc2cpIHsNCisgIERXT1JEIGF0dHIgPSBHZXRGaWxlQXR0cmlidXRlcyhwYXRoLmNfc3RyKCkpOw0KKw0KKyAgLy8gSWYgaXQgZG9lc24ndCBleGlzdCwgd2UncmUgZG9uZS4NCisgIGlmIChhdHRyID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICBpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSB7DQorICAgIGlmICghU2V0RmlsZUF0dHJpYnV0ZXMocGF0aC5jX3N0cigpLCBhdHRyICYgfkZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSkgew0KKyAgICAgIE1ha2VFcnJNc2coRXJyTXNnLCBzdGQ6OnN0cmluZyhwYXRoKSArICI6IENhbid0IG1ha2UgZmlsZSB3cml0YWJsZTogIik7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBQYXRoOjptYWtlRXhlY3V0YWJsZU9uRGlzayhzdGQ6OnN0cmluZyogRXJyTXNnKSB7DQorICAvLyBBbGwgZmlsZXMgYXJlIGV4ZWN1dGFibGUgb24gV2luZG93cyAoaWdub3Jpbmcgc2VjdXJpdHkgYXR0cmlidXRlcykuDQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wNCitQYXRoOjpnZXREaXJlY3RvcnlDb250ZW50cyhzdGQ6OnNldDxQYXRoPiYgcmVzdWx0LCBzdGQ6OnN0cmluZyogRXJyTXNnKSBjb25zdCB7DQorICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIGZpOw0KKyAgaWYgKCFHZXRGaWxlQXR0cmlidXRlc0V4KHBhdGguY19zdHIoKSwgR2V0RmlsZUV4SW5mb1N0YW5kYXJkLCAmZmkpKSB7DQorICAgIE1ha2VFcnJNc2coRXJyTXNnLCBwYXRoICsgIjogY2FuJ3QgZ2V0IHN0YXR1cyBvZiBmaWxlIik7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKw0KKyAgaWYgKCEoZmkuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpIHsNCisgICAgaWYgKEVyck1zZykNCisgICAgICAqRXJyTXNnID0gcGF0aCArICI6IG5vdCBhIGRpcmVjdG9yeSI7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKw0KKyAgcmVzdWx0LmNsZWFyKCk7DQorICBXSU4zMl9GSU5EX0RBVEEgZmQ7DQorICBzdGQ6OnN0cmluZyBzZWFyY2hwYXRoID0gcGF0aDsNCisgIGlmIChwYXRoLnNpemUoKSA9PSAwIHx8IHNlYXJjaHBhdGhbcGF0aC5zaXplKCktMV0gPT0gJy8nKQ0KKyAgICBzZWFyY2hwYXRoICs9ICIqIjsNCisgIGVsc2UNCisgICAgc2VhcmNocGF0aCArPSAiLyoiOw0KKw0KKyAgSEFORExFIGggPSBGaW5kRmlyc3RGaWxlKHNlYXJjaHBhdGguY19zdHIoKSwgJmZkKTsNCisgIGlmIChoID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7DQorICAgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9GSUxFX05PVF9GT1VORCkNCisgICAgICByZXR1cm4gdHJ1ZTsgLy8gbm90IHJlYWxseSBhbiBlcnJvciwgbm93IGlzIGl0Pw0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywgcGF0aCArICI6IENhbid0IHJlYWQgZGlyZWN0b3J5OiAiKTsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorDQorICBkbyB7DQorICAgIGlmIChmZC5jRmlsZU5hbWVbMF0gPT0gJy4nKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBQYXRoIGFQYXRoKHBhdGgpOw0KKyAgICBhUGF0aC5hcHBlbmRDb21wb25lbnQoJmZkLmNGaWxlTmFtZVswXSk7DQorICAgIHJlc3VsdC5pbnNlcnQoYVBhdGgpOw0KKyAgfSB3aGlsZSAoRmluZE5leHRGaWxlKGgsICZmZCkpOw0KKw0KKyAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7DQorICBGaW5kQ2xvc2UoaCk7DQorICBpZiAoZXJyICE9IEVSUk9SX05PX01PUkVfRklMRVMpIHsNCisgICAgU2V0TGFzdEVycm9yKGVycik7DQorICAgIE1ha2VFcnJNc2coRXJyTXNnLCBwYXRoICsgIjogQ2FuJ3QgcmVhZCBkaXJlY3Rvcnk6ICIpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbA0KK1BhdGg6OnNldChTdHJpbmdSZWYgYV9wYXRoKSB7DQorICBpZiAoYV9wYXRoLmVtcHR5KCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIHN0ZDo6c3RyaW5nIHNhdmUocGF0aCk7DQorICBwYXRoID0gYV9wYXRoOw0KKyAgRmxpcEJhY2tTbGFzaGVzKHBhdGgpOw0KKyAgaWYgKCFpc1ZhbGlkKCkpIHsNCisgICAgcGF0aCA9IHNhdmU7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sDQorUGF0aDo6YXBwZW5kQ29tcG9uZW50KFN0cmluZ1JlZiBuYW1lKSB7DQorICBpZiAobmFtZS5lbXB0eSgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBzdGQ6OnN0cmluZyBzYXZlKHBhdGgpOw0KKyAgaWYgKCFwYXRoLmVtcHR5KCkpIHsNCisgICAgc2l6ZV90IGxhc3QgPSBwYXRoLnNpemUoKSAtIDE7DQorICAgIGlmIChwYXRoW2xhc3RdICE9ICcvJykNCisgICAgICBwYXRoICs9ICcvJzsNCisgIH0NCisgIHBhdGggKz0gbmFtZTsNCisgIGlmICghaXNWYWxpZCgpKSB7DQorICAgIHBhdGggPSBzYXZlOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbA0KK1BhdGg6OmVyYXNlQ29tcG9uZW50KCkgew0KKyAgc2l6ZV90IHNsYXNocG9zID0gcGF0aC5yZmluZCgnLycscGF0aC5zaXplKCkpOw0KKyAgaWYgKHNsYXNocG9zID09IHBhdGguc2l6ZSgpIC0gMSB8fCBzbGFzaHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgc3RkOjpzdHJpbmcgc2F2ZShwYXRoKTsNCisgIHBhdGguZXJhc2Uoc2xhc2hwb3MpOw0KKyAgaWYgKCFpc1ZhbGlkKCkpIHsNCisgICAgcGF0aCA9IHNhdmU7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sDQorUGF0aDo6YXBwZW5kU3VmZml4KFN0cmluZ1JlZiBzdWZmaXgpIHsNCisgIHN0ZDo6c3RyaW5nIHNhdmUocGF0aCk7DQorICBwYXRoLmFwcGVuZCgiLiIpOw0KKyAgcGF0aC5hcHBlbmQoc3VmZml4KTsNCisgIGlmICghaXNWYWxpZCgpKSB7DQorICAgIHBhdGggPSBzYXZlOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbA0KK1BhdGg6OmVyYXNlU3VmZml4KCkgew0KKyAgc2l6ZV90IGRvdHBvcyA9IHBhdGgucmZpbmQoJy4nLHBhdGguc2l6ZSgpKTsNCisgIHNpemVfdCBzbGFzaHBvcyA9IHBhdGgucmZpbmQoJy8nLHBhdGguc2l6ZSgpKTsNCisgIGlmIChkb3Rwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsNCisgICAgaWYgKHNsYXNocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zIHx8IGRvdHBvcyA+IHNsYXNocG9zKzEpIHsNCisgICAgICBzdGQ6OnN0cmluZyBzYXZlKHBhdGgpOw0KKyAgICAgIHBhdGguZXJhc2UoZG90cG9zLCBwYXRoLnNpemUoKS1kb3Rwb3MpOw0KKyAgICAgIGlmICghaXNWYWxpZCgpKSB7DQorICAgICAgICBwYXRoID0gc2F2ZTsNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQoraW5saW5lIGJvb2wgUGF0aE1zZyhzdGQ6OnN0cmluZyogRXJyTXNnLCBjb25zdCBjaGFyKiBwYXRobmFtZSwgY29uc3QgY2hhciptc2cpIHsNCisgIGlmIChFcnJNc2cpDQorICAgICpFcnJNc2cgPSBzdGQ6OnN0cmluZyhwYXRobmFtZSkgKyAiOiAiICsgc3RkOjpzdHJpbmcobXNnKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sDQorUGF0aDo6Y3JlYXRlRGlyZWN0b3J5T25EaXNrKGJvb2wgY3JlYXRlX3BhcmVudHMsIHN0ZDo6c3RyaW5nKiBFcnJNc2cpIHsNCisgIC8vIEdldCBhIHdyaXRlYWJsZSBjb3B5IG9mIHRoZSBwYXRoIG5hbWUNCisgIHNpemVfdCBsZW4gPSBwYXRoLmxlbmd0aCgpOw0KKyAgY2hhciAqcGF0aG5hbWUgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4oX2FsbG9jYShsZW4rMikpOw0KKyAgcGF0aC5jb3B5KHBhdGhuYW1lLCBsZW4pOw0KKyAgcGF0aG5hbWVbbGVuXSA9IDA7DQorDQorICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgc2xhc2guDQorICBpZiAobGVuID09IDAgfHwgcGF0aG5hbWVbbGVuIC0gMV0gIT0gJy8nKSB7DQorICAgIHBhdGhuYW1lW2xlbl0gPSAnLyc7DQorICAgIHBhdGhuYW1lWysrbGVuXSA9IDA7DQorICB9DQorDQorICAvLyBEZXRlcm1pbmUgc3RhcnRpbmcgcG9pbnQgZm9yIGluaXRpYWwgLyBzZWFyY2guDQorICBjaGFyICpuZXh0ID0gcGF0aG5hbWU7DQorICBpZiAocGF0aG5hbWVbMF0gPT0gJy8nICYmIHBhdGhuYW1lWzFdID09ICcvJykgew0KKyAgICAvLyBTa2lwIGhvc3QgbmFtZS4NCisgICAgbmV4dCA9IHN0cmNocihwYXRobmFtZSsyLCAnLycpOw0KKyAgICBpZiAobmV4dCA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBQYXRoTXNnKEVyck1zZywgcGF0aG5hbWUsICJiYWRseSBmb3JtZWQgcmVtb3RlIGRpcmVjdG9yeSIpOw0KKw0KKyAgICAvLyBTa2lwIHNoYXJlIG5hbWUuDQorICAgIG5leHQgPSBzdHJjaHIobmV4dCsxLCAnLycpOw0KKyAgICBpZiAobmV4dCA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBQYXRoTXNnKEVyck1zZywgcGF0aG5hbWUsImJhZGx5IGZvcm1lZCByZW1vdGUgZGlyZWN0b3J5Iik7DQorDQorICAgIG5leHQrKzsNCisgICAgaWYgKCpuZXh0ID09IDApDQorICAgICAgcmV0dXJuIFBhdGhNc2coRXJyTXNnLCBwYXRobmFtZSwgImJhZGx5IGZvcm1lZCByZW1vdGUgZGlyZWN0b3J5Iik7DQorDQorICB9IGVsc2Ugew0KKyAgICBpZiAocGF0aG5hbWVbMV0gPT0gJzonKQ0KKyAgICAgIG5leHQgKz0gMjsgICAgLy8gc2tpcCBkcml2ZSBsZXR0ZXINCisgICAgaWYgKCpuZXh0ID09ICcvJykNCisgICAgICBuZXh0Kys7ICAgICAgIC8vIHNraXAgcm9vdCBkaXJlY3RvcnkNCisgIH0NCisNCisgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGNyZWF0ZSBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMNCisgIGlmIChjcmVhdGVfcGFyZW50cykgew0KKyAgICAvLyBMb29wIHRocm91Z2ggdGhlIGRpcmVjdG9yeSBjb21wb25lbnRzIHVudGlsIHdlJ3JlIGRvbmUNCisgICAgd2hpbGUgKCpuZXh0KSB7DQorICAgICAgbmV4dCA9IHN0cmNocihuZXh0LCAnLycpOw0KKyAgICAgICpuZXh0ID0gMDsNCisgICAgICBpZiAoIUNyZWF0ZURpcmVjdG9yeShwYXRobmFtZSwgTlVMTCkgJiYNCisgICAgICAgICAgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfQUxSRUFEWV9FWElTVFMpDQorICAgICAgICAgIHJldHVybiBNYWtlRXJyTXNnKEVyck1zZywNCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhwYXRobmFtZSkgKyAiOiBDYW4ndCBjcmVhdGUgZGlyZWN0b3J5OiAiKTsNCisgICAgICAqbmV4dCsrID0gJy8nOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICAvLyBEcm9wIHRyYWlsaW5nIHNsYXNoLg0KKyAgICBwYXRobmFtZVtsZW4tMV0gPSAwOw0KKyAgICBpZiAoIUNyZWF0ZURpcmVjdG9yeShwYXRobmFtZSwgTlVMTCkgJiYNCisgICAgICAgIEdldExhc3RFcnJvcigpICE9IEVSUk9SX0FMUkVBRFlfRVhJU1RTKSB7DQorICAgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCBzdGQ6OnN0cmluZyhwYXRobmFtZSkgKyAiOiBDYW4ndCBjcmVhdGUgZGlyZWN0b3J5OiAiKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorUGF0aDo6Y3JlYXRlRmlsZU9uRGlzayhzdGQ6OnN0cmluZyogRXJyTXNnKSB7DQorICAvLyBDcmVhdGUgdGhlIGZpbGUNCisgIEhBTkRMRSBoID0gQ3JlYXRlRmlsZShwYXRoLmNfc3RyKCksIEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsIENSRUFURV9ORVcsDQorICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsNCisgIGlmIChoID09IElOVkFMSURfSEFORExFX1ZBTFVFKQ0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIHBhdGggKyAiOiBDYW4ndCBjcmVhdGUgZmlsZTogIik7DQorDQorICBDbG9zZUhhbmRsZShoKTsNCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbA0KK1BhdGg6OmVyYXNlRnJvbURpc2soYm9vbCByZW1vdmVfY29udGVudHMsIHN0ZDo6c3RyaW5nICpFcnJTdHIpIGNvbnN0IHsNCisgIFdJTjMyX0ZJTEVfQVRUUklCVVRFX0RBVEEgZmk7DQorICBpZiAoIUdldEZpbGVBdHRyaWJ1dGVzRXgocGF0aC5jX3N0cigpLCBHZXRGaWxlRXhJbmZvU3RhbmRhcmQsICZmaSkpDQorICAgIHJldHVybiB0cnVlOw0KKw0KKyAgaWYgKGZpLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsNCisgICAgLy8gSWYgaXQgZG9lc24ndCBleGlzdCwgd2UncmUgZG9uZS4NCisgICAgaWYgKCFleGlzdHMoKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorDQorICAgIGNoYXIgKnBhdGhuYW1lID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KF9hbGxvY2EocGF0aC5sZW5ndGgoKSszKSk7DQorICAgIGludCBsYXN0Y2hhciA9IHBhdGgubGVuZ3RoKCkgLSAxIDsNCisgICAgcGF0aC5jb3B5KHBhdGhuYW1lLCBsYXN0Y2hhcisxKTsNCisNCisgICAgLy8gTWFrZSBwYXRoIGVuZCB3aXRoICcvKicuDQorICAgIGlmIChwYXRobmFtZVtsYXN0Y2hhcl0gIT0gJy8nKQ0KKyAgICAgIHBhdGhuYW1lWysrbGFzdGNoYXJdID0gJy8nOw0KKyAgICBwYXRobmFtZVtsYXN0Y2hhcisxXSA9ICcqJzsNCisgICAgcGF0aG5hbWVbbGFzdGNoYXIrMl0gPSAwOw0KKw0KKyAgICBpZiAocmVtb3ZlX2NvbnRlbnRzKSB7DQorICAgICAgV0lOMzJfRklORF9EQVRBIGZkOw0KKyAgICAgIEhBTkRMRSBoID0gRmluZEZpcnN0RmlsZShwYXRobmFtZSwgJmZkKTsNCisNCisgICAgICAvLyBJdCdzIGEgYmFkIGlkZWEgdG8gYWx0ZXIgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IHdoaWxlIGVudW1lcmF0aW5nDQorICAgICAgLy8gaXRzIGNvbnRlbnRzLiBTbyBidWlsZCBhIGxpc3Qgb2YgaXRzIGNvbnRlbnRzIGZpcnN0LCB0aGVuIGRlc3Ryb3kgdGhlbS4NCisNCisgICAgICBpZiAoaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgew0KKyAgICAgICAgc3RkOjp2ZWN0b3I8UGF0aD4gbGlzdDsNCisNCisgICAgICAgIGRvIHsNCisgICAgICAgICAgaWYgKHN0cmNtcChmZC5jRmlsZU5hbWUsICIuIikgPT0gMCkNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgaWYgKHN0cmNtcChmZC5jRmlsZU5hbWUsICIuLiIpID09IDApDQorICAgICAgICAgICAgY29udGludWU7DQorDQorICAgICAgICAgIFBhdGggYVBhdGgocGF0aCk7DQorICAgICAgICAgIGFQYXRoLmFwcGVuZENvbXBvbmVudCgmZmQuY0ZpbGVOYW1lWzBdKTsNCisgICAgICAgICAgbGlzdC5wdXNoX2JhY2soYVBhdGgpOw0KKyAgICAgICAgfSB3aGlsZSAoRmluZE5leHRGaWxlKGgsICZmZCkpOw0KKw0KKyAgICAgICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7DQorICAgICAgICBGaW5kQ2xvc2UoaCk7DQorICAgICAgICBpZiAoZXJyICE9IEVSUk9SX05PX01PUkVfRklMRVMpIHsNCisgICAgICAgICAgU2V0TGFzdEVycm9yKGVycik7DQorICAgICAgICAgIHJldHVybiBNYWtlRXJyTXNnKEVyclN0ciwgcGF0aCArICI6IENhbid0IHJlYWQgZGlyZWN0b3J5OiAiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoc3RkOjp2ZWN0b3I8UGF0aD46Oml0ZXJhdG9yIEkgPSBsaXN0LmJlZ2luKCk7IEkgIT0gbGlzdC5lbmQoKTsNCisgICAgICAgICAgICAgKytJKSB7DQorICAgICAgICAgIFBhdGggJmFQYXRoID0gKkk7DQorICAgICAgICAgIGFQYXRoLmVyYXNlRnJvbURpc2sodHJ1ZSk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkNCisgICAgICAgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyU3RyLCBwYXRoICsgIjogQ2FuJ3QgcmVhZCBkaXJlY3Rvcnk6ICIpOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwYXRobmFtZVtsYXN0Y2hhcl0gPSAwOw0KKyAgICBpZiAoIVJlbW92ZURpcmVjdG9yeShwYXRobmFtZSkpDQorICAgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyU3RyLA0KKyAgICAgICAgc3RkOjpzdHJpbmcocGF0aG5hbWUpICsgIjogQ2FuJ3QgZGVzdHJveSBkaXJlY3Rvcnk6ICIpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9IGVsc2Ugew0KKyAgICAvLyBSZWFkLW9ubHkgZmlsZXMgY2Fubm90IGJlIGRlbGV0ZWQgb24gV2luZG93cy4gIE11c3QgcmVtb3ZlIHRoZSByZWFkLW9ubHkNCisgICAgLy8gYXR0cmlidXRlIGZpcnN0Lg0KKyAgICBpZiAoZmkuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSB7DQorICAgICAgaWYgKCFTZXRGaWxlQXR0cmlidXRlcyhwYXRoLmNfc3RyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaS5kd0ZpbGVBdHRyaWJ1dGVzICYgfkZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSkNCisgICAgICAgIHJldHVybiBNYWtlRXJyTXNnKEVyclN0ciwgcGF0aCArICI6IENhbid0IGRlc3Ryb3kgZmlsZTogIik7DQorICAgIH0NCisNCisgICAgaWYgKCFEZWxldGVGaWxlKHBhdGguY19zdHIoKSkpDQorICAgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyU3RyLCBwYXRoICsgIjogQ2FuJ3QgZGVzdHJveSBmaWxlOiAiKTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KK30NCisNCitib29sIFBhdGg6OmdldE1hZ2ljTnVtYmVyKHN0ZDo6c3RyaW5nJiBNYWdpYywgdW5zaWduZWQgbGVuKSBjb25zdCB7DQorICBhc3NlcnQobGVuIDwgMTAyNCAmJiAiUmVxdWVzdCBmb3IgbWFnaWMgc3RyaW5nIHRvbyBsb25nIik7DQorICBjaGFyKiBidWYgPSAoY2hhciopIGFsbG9jYSgxICsgbGVuKTsNCisNCisgIEhBTkRMRSBoID0gQ3JlYXRlRmlsZShwYXRoLmNfc3RyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFELA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCwNCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsDQorICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOw0KKyAgaWYgKGggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIERXT1JEIG5SZWFkID0gMDsNCisgIEJPT0wgcmV0ID0gUmVhZEZpbGUoaCwgYnVmLCBsZW4sICZuUmVhZCwgTlVMTCk7DQorICBDbG9zZUhhbmRsZShoKTsNCisNCisgIGlmICghcmV0IHx8IG5SZWFkICE9IGxlbikNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgYnVmW2xlbl0gPSAnXDAnOw0KKyAgTWFnaWMgPSBidWY7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbA0KK1BhdGg6OnJlbmFtZVBhdGhPbkRpc2soY29uc3QgUGF0aCYgbmV3TmFtZSwgc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgaWYgKCFNb3ZlRmlsZUV4KHBhdGguY19zdHIoKSwgbmV3TmFtZS5jX3N0cigpLCBNT1ZFRklMRV9SRVBMQUNFX0VYSVNUSU5HKSkNCisgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCAiQ2FuJ3QgbW92ZSAnIiArIHBhdGggKyAiJyB0byAnIiArIG5ld05hbWUucGF0aA0KKyAgICAgICAgKyAiJzogIik7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wNCitQYXRoOjpzZXRTdGF0dXNJbmZvT25EaXNrKGNvbnN0IEZpbGVTdGF0dXMgJnNpLCBzdGQ6OnN0cmluZyAqRXJyTXNnKSBjb25zdCB7DQorICAvLyBGSVhNRTogc2hvdWxkIHdvcmsgb24gZGlyZWN0b3JpZXMgYWxzby4NCisgIGlmICghc2kuaXNGaWxlKSB7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKw0KKyAgSEFORExFIGggPSBDcmVhdGVGaWxlKHBhdGguY19zdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1JFQURfQVRUUklCVVRFUyB8IEZJTEVfV1JJVEVfQVRUUklCVVRFUywNCisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFIHwgRklMRV9TSEFSRV9ERUxFVEUsDQorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwNCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsNCisgIGlmIChoID09IElOVkFMSURfSEFORExFX1ZBTFVFKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisNCisgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGJoZmk7DQorICBpZiAoIUdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGgsICZiaGZpKSkgew0KKyAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsNCisgICAgQ2xvc2VIYW5kbGUoaCk7DQorICAgIFNldExhc3RFcnJvcihlcnIpOw0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIHBhdGggKyAiOiBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZTogIik7DQorICB9DQorDQorICBGSUxFVElNRSBmdDsNCisgICh1aW50NjRfdCYpZnQgPSBzaS5tb2RUaW1lLnRvV2luMzJUaW1lKCk7DQorICBCT09MIHJldCA9IFNldEZpbGVUaW1lKGgsIE5VTEwsICZmdCwgJmZ0KTsNCisgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOw0KKyAgQ2xvc2VIYW5kbGUoaCk7DQorICBpZiAoIXJldCkgew0KKyAgICBTZXRMYXN0RXJyb3IoZXJyKTsNCisgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCBwYXRoICsgIjogU2V0RmlsZVRpbWU6ICIpOw0KKyAgfQ0KKw0KKyAgLy8gQmVzdCB3ZSBjYW4gZG8gd2l0aCBVbml4IHBlcm1pc3Npb24gYml0cyBpcyB0byBpbnRlcnByZXQgdGhlIG93bmVyDQorICAvLyB3cml0YWJsZSBiaXQuDQorICBpZiAoc2kubW9kZSAmIDAyMDApIHsNCisgICAgaWYgKGJoZmkuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSB7DQorICAgICAgaWYgKCFTZXRGaWxlQXR0cmlidXRlcyhwYXRoLmNfc3RyKCksDQorICAgICAgICAgICAgICBiaGZpLmR3RmlsZUF0dHJpYnV0ZXMgJiB+RklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpKQ0KKyAgICAgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCBwYXRoICsgIjogU2V0RmlsZUF0dHJpYnV0ZXM6ICIpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAoIShiaGZpLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkpIHsNCisgICAgICBpZiAoIVNldEZpbGVBdHRyaWJ1dGVzKHBhdGguY19zdHIoKSwNCisgICAgICAgICAgICAgIGJoZmkuZHdGaWxlQXR0cmlidXRlcyB8IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSkNCisgICAgICAgIHJldHVybiBNYWtlRXJyTXNnKEVyck1zZywgcGF0aCArICI6IFNldEZpbGVBdHRyaWJ1dGVzOiAiKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorQ29weUZpbGUoY29uc3Qgc3lzOjpQYXRoICZEZXN0LCBjb25zdCBzeXM6OlBhdGggJlNyYywgc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgLy8gQ2FuJ3QgdXNlIENvcHlGaWxlIG1hY3JvIGRlZmluZWQgaW4gV2luZG93cy5oIGJlY2F1c2UgaXQgd291bGQgbWVzcyB1cCB0aGUNCisgIC8vIGFib3ZlIGxpbmUuICBXZSB1c2UgdGhlIGV4cGFuc2lvbiBpdCB3b3VsZCBoYXZlIGluIGEgbm9uLVVOSUNPREUgYnVpbGQuDQorICBpZiAoITo6Q29weUZpbGVBKFNyYy5jX3N0cigpLCBEZXN0LmNfc3RyKCksIGZhbHNlKSkNCisgICAgcmV0dXJuIE1ha2VFcnJNc2coRXJyTXNnLCAiQ2FuJ3QgY29weSAnIiArIFNyYy5zdHIoKSArDQorICAgICAgICAgICAgICAgIicgdG8gJyIgKyBEZXN0LnN0cigpICsgIic6ICIpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorUGF0aDo6bWFrZVVuaXF1ZShib29sIHJldXNlX2N1cnJlbnQsIHN0ZDo6c3RyaW5nKiBFcnJNc2cpIHsNCisgIGlmIChyZXVzZV9jdXJyZW50ICYmICFleGlzdHMoKSkNCisgICAgcmV0dXJuIGZhbHNlOyAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QgYWxyZWFkeSwganVzdCB1c2UgaXQhDQorDQorICAvLyBSZXNlcnZlIHNwYWNlIGZvciAtWFhYWFhYIGF0IHRoZSBlbmQuDQorICBjaGFyICpGTkJ1ZmZlciA9IChjaGFyKikgYWxsb2NhKHBhdGguc2l6ZSgpKzgpOw0KKyAgdW5zaWduZWQgb2Zmc2V0ID0gcGF0aC5zaXplKCk7DQorICBwYXRoLmNvcHkoRk5CdWZmZXIsIG9mZnNldCk7DQorDQorICAvLyBGaW5kIGEgbnVtZXJpYyBzdWZmaXggdGhhdCBpc24ndCB1c2VkIGJ5IGFuIGV4aXN0aW5nIGZpbGUuICBBc3N1bWUgdGhlcmUNCisgIC8vIHdvbid0IGJlIG1vcmUgdGhhbiAxIG1pbGxpb24gZmlsZXMgd2l0aCB0aGUgc2FtZSBwcmVmaXguICBQcm9iYWJseSBhIHNhZmUNCisgIC8vIGJldC4NCisgIHN0YXRpYyB1bnNpZ25lZCBGQ291bnRlciA9IDA7DQorICBkbyB7DQorICAgIHNwcmludGYoRk5CdWZmZXIrb2Zmc2V0LCAiLSUwNnUiLCBGQ291bnRlcik7DQorICAgIGlmICgrK0ZDb3VudGVyID4gOTk5OTk5KQ0KKyAgICAgIEZDb3VudGVyID0gMDsNCisgICAgcGF0aCA9IEZOQnVmZmVyOw0KKyAgfSB3aGlsZSAoZXhpc3RzKCkpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sDQorUGF0aDo6Y3JlYXRlVGVtcG9yYXJ5RmlsZU9uRGlzayhib29sIHJldXNlX2N1cnJlbnQsIHN0ZDo6c3RyaW5nKiBFcnJNc2cpIHsNCisgIC8vIE1ha2UgdGhpcyBpbnRvIGEgdW5pcXVlIGZpbGUgbmFtZQ0KKyAgbWFrZVVuaXF1ZShyZXVzZV9jdXJyZW50LCBFcnJNc2cpOw0KKw0KKyAgLy8gTm93IGdvIGFuZCBjcmVhdGUgaXQNCisgIEhBTkRMRSBoID0gQ3JlYXRlRmlsZShwYXRoLmNfc3RyKCksIEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsIENSRUFURV9ORVcsDQorICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsNCisgIGlmIChoID09IElOVkFMSURfSEFORExFX1ZBTFVFKQ0KKyAgICByZXR1cm4gTWFrZUVyck1zZyhFcnJNc2csIHBhdGggKyAiOiBjYW4ndCBjcmVhdGUgZmlsZSIpOw0KKw0KKyAgQ2xvc2VIYW5kbGUoaCk7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KKy8vLyBNYXBJbkZpbGVQYWdlcyAtIE5vdCB5ZXQgaW1wbGVtZW50ZWQgb24gd2luMzIuDQorY29uc3QgY2hhciAqUGF0aDo6TWFwSW5GaWxlUGFnZXMoaW50IEZELCB1aW50NjRfdCBGaWxlU2l6ZSkgew0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKy8vLyBNYXBJbkZpbGVQYWdlcyAtIE5vdCB5ZXQgaW1wbGVtZW50ZWQgb24gd2luMzIuDQordm9pZCBQYXRoOjpVbk1hcEZpbGVQYWdlcyhjb25zdCBjaGFyICpCYXNlLCB1aW50NjRfdCBGaWxlU2l6ZSkgew0KKyAgYXNzZXJ0KDAgJiYgIk5PVCBJTVBMRU1FTlRFRCIpOw0KK30NCisNCit9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvUHJvY2Vzcy5pbmMgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL1Byb2Nlc3MuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmMyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL1Byb2Nlc3MuaW5jCkBAIC0wLDAgKzEsMjIxIEBACisvLz09PS0gV2luMzIvUHJvY2Vzcy5jcHAgLSBXaW4zMiBQcm9jZXNzIEltcGxlbWVudGF0aW9uIC0tLS0tLS0gLSotIEMrKyAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBXaW4zMiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJvY2VzcyBjbGFzcy4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorI2luY2x1ZGUgIldpbjMyLmgiDQorI2luY2x1ZGUgPHBzYXBpLmg+DQorI2luY2x1ZGUgPG1hbGxvYy5oPg0KKyNpbmNsdWRlIDxpby5oPg0KKw0KKyNpZmRlZiBfX01JTkdXMzJfXw0KKyAjaWYgKEhBVkVfTElCUFNBUEkgIT0gMSkNCisgICNlcnJvciAibGlicHNhcGkuYSBzaG91bGQgYmUgcHJlc2VudCINCisgI2VuZGlmDQorI2Vsc2UNCisgI3ByYWdtYSBjb21tZW50KGxpYiwgInBzYXBpLmxpYiIpDQorI2VuZGlmDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLz09PSBXQVJOSU5HOiBJbXBsZW1lbnRhdGlvbiBoZXJlIG11c3QgY29udGFpbiBvbmx5IFdpbjMyIHNwZWNpZmljIGNvZGUgDQorLy89PT0gICAgICAgICAgYW5kIG11c3Qgbm90IGJlIFVOSVggY29kZQ0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorI2lmZGVmIF9fTUlOR1czMl9fDQorLy8gVGhpcyBiYW4gc2hvdWxkIGJlIGxpZnRlZCB3aGVuIE1pbkdXIDEuMCsgaGFzIGRlZmluZWQgdGhpcyB2YWx1ZS4NCisjICBkZWZpbmUgX0hFQVBPSyAoLTIpDQorI2VuZGlmDQorDQorbmFtZXNwYWNlIGxsdm0gew0KK3VzaW5nIG5hbWVzcGFjZSBzeXM7DQorDQorLy8gVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHBhZ2Ugc2l6ZSB1c2luZyBHZXRTeXN0ZW1JbmZvIGFuZCBpcyBwcmVzZW50DQorLy8gc29sZWx5IHNvIGl0IGNhbiBiZSBjYWxsZWQgb25jZSBpbiBQcm9jZXNzOjpHZXRQYWdlU2l6ZSB0byBpbml0aWFsaXplIHRoZQ0KKy8vIHN0YXRpYyB2YXJpYWJsZSBQYWdlU2l6ZS4NCitpbmxpbmUgdW5zaWduZWQgR2V0UGFnZVNpemVPbmNlKCkgew0KKyAgLy8gTk9URTogQSAzMi1iaXQgYXBwbGljYXRpb24gcnVubmluZyB1bmRlciBXT1c2NCBpcyBzdXBwb3NlZCB0byB1c2UNCisgIC8vIEdldE5hdGl2ZVN5c3RlbUluZm8uICBIb3dldmVyLCB0aGlzIGludGVyZmFjZSBpcyBub3QgcHJlc2VudCBwcmlvcg0KKyAgLy8gdG8gV2luZG93cyBYUCBzbyB0byB1c2UgaXQgcmVxdWlyZXMgZHluYW1pYyBsaW5raW5nLiAgSXQgaXMgbm90IGNsZWFyDQorICAvLyBob3cgdGhpcyBhZmZlY3RzIHRoZSByZXBvcnRlZCBwYWdlIHNpemUsIGlmIGF0IGFsbC4gIE9uZSBjb3VsZCBhcmd1ZQ0KKyAgLy8gdGhhdCBMTFZNIG91Z2h0IHRvIHJ1biBhcyA2NC1iaXRzIG9uIGEgNjQtYml0IHN5c3RlbSwgYW55d2F5Lg0KKyAgU1lTVEVNX0lORk8gaW5mbzsNCisgIEdldFN5c3RlbUluZm8oJmluZm8pOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihpbmZvLmR3UGFnZVNpemUpOw0KK30NCisNCit1bnNpZ25lZCANCitQcm9jZXNzOjpHZXRQYWdlU2l6ZSgpIHsNCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBQYWdlU2l6ZSA9IEdldFBhZ2VTaXplT25jZSgpOw0KKyAgcmV0dXJuIFBhZ2VTaXplOw0KK30NCisNCitzaXplX3QgDQorUHJvY2Vzczo6R2V0TWFsbG9jVXNhZ2UoKQ0KK3sNCisgIF9IRUFQSU5GTyBoaW5mbzsNCisgIGhpbmZvLl9wZW50cnkgPSBOVUxMOw0KKw0KKyAgc2l6ZV90IHNpemUgPSAwOw0KKw0KKyAgd2hpbGUgKF9oZWFwd2FsaygmaGluZm8pID09IF9IRUFQT0spDQorICAgIHNpemUgKz0gaGluZm8uX3NpemU7DQorDQorICByZXR1cm4gc2l6ZTsNCit9DQorDQorc2l6ZV90DQorUHJvY2Vzczo6R2V0VG90YWxNZW1vcnlVc2FnZSgpDQorew0KKyAgUFJPQ0VTU19NRU1PUllfQ09VTlRFUlMgcG1jOw0KKyAgR2V0UHJvY2Vzc01lbW9yeUluZm8oR2V0Q3VycmVudFByb2Nlc3MoKSwgJnBtYywgc2l6ZW9mKHBtYykpOw0KKyAgcmV0dXJuIHBtYy5QYWdlZmlsZVVzYWdlOw0KK30NCisNCit2b2lkDQorUHJvY2Vzczo6R2V0VGltZVVzYWdlKA0KKyAgVGltZVZhbHVlJiBlbGFwc2VkLCBUaW1lVmFsdWUmIHVzZXJfdGltZSwgVGltZVZhbHVlJiBzeXNfdGltZSkNCit7DQorICBlbGFwc2VkID0gVGltZVZhbHVlOjpub3coKTsNCisNCisgIHVpbnQ2NF90IFByb2NDcmVhdGUsIFByb2NFeGl0LCBLZXJuZWxUaW1lLCBVc2VyVGltZTsNCisgIEdldFByb2Nlc3NUaW1lcyhHZXRDdXJyZW50UHJvY2VzcygpLCAoRklMRVRJTUUqKSZQcm9jQ3JlYXRlLCANCisgICAgICAgICAgICAgICAgICAoRklMRVRJTUUqKSZQcm9jRXhpdCwgKEZJTEVUSU1FKikmS2VybmVsVGltZSwNCisgICAgICAgICAgICAgICAgICAoRklMRVRJTUUqKSZVc2VyVGltZSk7DQorDQorICAvLyBGSUxFVElNRSdzIGFyZSAjIG9mIDEwMCBuYW5vc2Vjb25kIHRpY2tzICgxLzEwdGggb2YgYSBtaWNyb3NlY29uZCkNCisgIHVzZXJfdGltZS5zZWNvbmRzKCBVc2VyVGltZSAvIDEwMDAwMDAwICk7DQorICB1c2VyX3RpbWUubmFub3NlY29uZHMoIHVuc2lnbmVkKFVzZXJUaW1lICUgMTAwMDAwMDApICogMTAwICk7DQorICBzeXNfdGltZS5zZWNvbmRzKCBLZXJuZWxUaW1lIC8gMTAwMDAwMDAgKTsNCisgIHN5c190aW1lLm5hbm9zZWNvbmRzKCB1bnNpZ25lZChLZXJuZWxUaW1lICUgMTAwMDAwMDApICogMTAwICk7DQorfQ0KKw0KK2ludCBQcm9jZXNzOjpHZXRDdXJyZW50VXNlcklkKCkNCit7DQorICByZXR1cm4gNjU1MzY7DQorfQ0KKw0KK2ludCBQcm9jZXNzOjpHZXRDdXJyZW50R3JvdXBJZCgpDQorew0KKyAgcmV0dXJuIDY1NTM2Ow0KK30NCisNCisvLyBTb21lIExMVk0gcHJvZ3JhbXMgc3VjaCBhcyBidWdwb2ludCBwcm9kdWNlIGNvcmUgZmlsZXMgYXMgYSBub3JtYWwgcGFydCBvZg0KKy8vIHRoZWlyIG9wZXJhdGlvbi4gVG8gcHJldmVudCB0aGUgZGlzayBmcm9tIGZpbGxpbmcgdXAsIHRoaXMgY29uZmlndXJhdGlvbiBpdGVtDQorLy8gZG9lcyB3aGF0J3MgbmVjZXNzYXJ5IHRvIHByZXZlbnQgdGhlaXIgZ2VuZXJhdGlvbi4NCit2b2lkIFByb2Nlc3M6OlByZXZlbnRDb3JlRmlsZXMoKSB7DQorICAvLyBXaW5kb3dzIGRvZXNuJ3QgZG8gY29yZSBmaWxlcywgYnV0IGl0IGRvZXMgZG8gbW9kYWwgcG9wLXVwIG1lc3NhZ2UNCisgIC8vIGJveGVzLiAgQXMgdGhpcyBtZXRob2QgaXMgdXNlZCBieSBidWdwb2ludCwgcHJldmVudGluZyB0aGVzZSBwb3AtdXBzDQorICAvLyBpcyB0aGUgbW9yYWwgZXF1aXZhbGVudCBvZiBzdXBwcmVzc2luZyBjb3JlIGZpbGVzLg0KKyAgU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMgfA0KKyAgICAgICAgICAgICAgIFNFTV9OT0dQRkFVTFRFUlJPUkJPWCB8DQorICAgICAgICAgICAgICAgU0VNX05PT1BFTkZJTEVFUlJPUkJPWCk7DQorfQ0KKw0KK2Jvb2wgUHJvY2Vzczo6U3RhbmRhcmRJbklzVXNlcklucHV0KCkgew0KKyAgcmV0dXJuIEZpbGVEZXNjcmlwdG9ySXNEaXNwbGF5ZWQoMCk7DQorfQ0KKw0KK2Jvb2wgUHJvY2Vzczo6U3RhbmRhcmRPdXRJc0Rpc3BsYXllZCgpIHsNCisgIHJldHVybiBGaWxlRGVzY3JpcHRvcklzRGlzcGxheWVkKDEpOw0KK30NCisNCitib29sIFByb2Nlc3M6OlN0YW5kYXJkRXJySXNEaXNwbGF5ZWQoKSB7DQorICByZXR1cm4gRmlsZURlc2NyaXB0b3JJc0Rpc3BsYXllZCgyKTsNCit9DQorDQorYm9vbCBQcm9jZXNzOjpGaWxlRGVzY3JpcHRvcklzRGlzcGxheWVkKGludCBmZCkgew0KKyAgcmV0dXJuIEdldEZpbGVUeXBlKChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoZmQpKSA9PSBGSUxFX1RZUEVfQ0hBUjsNCit9DQorDQordW5zaWduZWQgUHJvY2Vzczo6U3RhbmRhcmRPdXRDb2x1bW5zKCkgew0KKyAgdW5zaWduZWQgQ29sdW1ucyA9IDA7DQorICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBjc2JpOw0KKyAgaWYgKEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSksICZjc2JpKSkNCisgICAgQ29sdW1ucyA9IGNzYmkuZHdTaXplLlg7DQorICByZXR1cm4gQ29sdW1uczsNCit9DQorDQordW5zaWduZWQgUHJvY2Vzczo6U3RhbmRhcmRFcnJDb2x1bW5zKCkgew0KKyAgdW5zaWduZWQgQ29sdW1ucyA9IDA7DQorICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBjc2JpOw0KKyAgaWYgKEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKSwgJmNzYmkpKQ0KKyAgICBDb2x1bW5zID0gY3NiaS5kd1NpemUuWDsNCisgIHJldHVybiBDb2x1bW5zOw0KK30NCisNCisvLyBJdCBhbHdheXMgaGFzIGNvbG9ycy4NCitib29sIFByb2Nlc3M6OlN0YW5kYXJkRXJySGFzQ29sb3JzKCkgew0KKyAgcmV0dXJuIFN0YW5kYXJkRXJySXNEaXNwbGF5ZWQoKTsNCit9DQorDQorYm9vbCBQcm9jZXNzOjpTdGFuZGFyZE91dEhhc0NvbG9ycygpIHsNCisgIHJldHVybiBTdGFuZGFyZE91dElzRGlzcGxheWVkKCk7DQorfQ0KKw0KK25hbWVzcGFjZSB7DQorY2xhc3MgRGVmYXVsdENvbG9ycw0KK3sNCisgIHByaXZhdGU6DQorICAgIFdPUkQgZGVmYXVsdENvbG9yOw0KKyAgcHVibGljOg0KKyAgICBEZWZhdWx0Q29sb3JzKCkNCisgICAgIDpkZWZhdWx0Q29sb3IoR2V0Q3VycmVudENvbG9yKCkpIHt9DQorICAgIHN0YXRpYyB1bnNpZ25lZCBHZXRDdXJyZW50Q29sb3IoKSB7DQorICAgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY3NiaTsNCisgICAgICBpZiAoR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSwgJmNzYmkpKQ0KKyAgICAgICAgcmV0dXJuIGNzYmkud0F0dHJpYnV0ZXM7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgV09SRCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gZGVmYXVsdENvbG9yOyB9DQorfTsNCisNCitEZWZhdWx0Q29sb3JzIGRlZmF1bHRDb2xvcnM7DQorfQ0KKw0KK2Jvb2wgUHJvY2Vzczo6Q29sb3JOZWVkc0ZsdXNoKCkgew0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2NvbnN0IGNoYXIgKlByb2Nlc3M6Ok91dHB1dEJvbGQoYm9vbCBiZykgew0KKyAgV09SRCBjb2xvcnMgPSBEZWZhdWx0Q29sb3JzOjpHZXRDdXJyZW50Q29sb3IoKTsNCisgIGlmIChiZykNCisgICAgY29sb3JzIHw9IEJBQ0tHUk9VTkRfSU5URU5TSVRZOw0KKyAgZWxzZQ0KKyAgICBjb2xvcnMgfD0gRk9SRUdST1VORF9JTlRFTlNJVFk7DQorICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpLCBjb2xvcnMpOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK2NvbnN0IGNoYXIgKlByb2Nlc3M6Ok91dHB1dENvbG9yKGNoYXIgY29kZSwgYm9vbCBib2xkLCBib29sIGJnKSB7DQorICBXT1JEIGNvbG9yczsNCisgIGlmIChiZykgew0KKyAgICBjb2xvcnMgPSAoKGNvZGUmMSkgPyBCQUNLR1JPVU5EX1JFRCA6IDApIHwNCisgICAgICAoKGNvZGUmMikgPyBCQUNLR1JPVU5EX0dSRUVOIDogMCApIHwNCisgICAgICAoKGNvZGUmNCkgPyBCQUNLR1JPVU5EX0JMVUUgOiAwKTsNCisgICAgaWYgKGJvbGQpDQorICAgICAgY29sb3JzIHw9IEJBQ0tHUk9VTkRfSU5URU5TSVRZOw0KKyAgfSBlbHNlIHsNCisgICAgY29sb3JzID0gKChjb2RlJjEpID8gRk9SRUdST1VORF9SRUQgOiAwKSB8DQorICAgICAgKChjb2RlJjIpID8gRk9SRUdST1VORF9HUkVFTiA6IDAgKSB8DQorICAgICAgKChjb2RlJjQpID8gRk9SRUdST1VORF9CTFVFIDogMCk7DQorICAgIGlmIChib2xkKQ0KKyAgICAgIGNvbG9ycyB8PSBGT1JFR1JPVU5EX0lOVEVOU0lUWTsNCisgIH0NCisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSksIGNvbG9ycyk7DQorICByZXR1cm4gMDsNCit9DQorDQorY29uc3QgY2hhciAqUHJvY2Vzczo6UmVzZXRDb2xvcigpIHsNCisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSksIGRlZmF1bHRDb2xvcnMoKSk7DQorICByZXR1cm4gMDsNCit9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvUHJvZ3JhbS5pbmMgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL1Byb2dyYW0uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzg0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL1Byb2dyYW0uaW5jCkBAIC0wLDAgKzEsNDA5IEBACisvLz09PS0gV2luMzIvUHJvZ3JhbS5jcHAgLSBXaW4zMiBQcm9ncmFtIEltcGxlbWVudGF0aW9uIC0tLS0tLS0gLSotIEMrKyAtKi09PT0vLw0KKy8vDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgV2luMzIgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFByb2dyYW0gY2xhc3MuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKyNpbmNsdWRlICJXaW4zMi5oIg0KKyNpbmNsdWRlIDxjc3RkaW8+DQorI2luY2x1ZGUgPG1hbGxvYy5oPg0KKyNpbmNsdWRlIDxpby5oPg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy89PT0gV0FSTklORzogSW1wbGVtZW50YXRpb24gaGVyZSBtdXN0IGNvbnRhaW4gb25seSBXaW4zMiBzcGVjaWZpYyBjb2RlDQorLy89PT0gICAgICAgICAgYW5kIG11c3Qgbm90IGJlIFVOSVggY29kZQ0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorbmFtZXNwYWNlIHsNCisgIHN0cnVjdCBXaW4zMlByb2Nlc3NJbmZvIHsNCisgICAgSEFORExFIGhQcm9jZXNzOw0KKyAgICBEV09SRCAgZHdQcm9jZXNzSWQ7DQorICB9Ow0KK30NCisNCituYW1lc3BhY2UgbGx2bSB7DQordXNpbmcgbmFtZXNwYWNlIHN5czsNCisNCitQcm9ncmFtOjpQcm9ncmFtKCkgOiBEYXRhXygwKSB7fQ0KKw0KK1Byb2dyYW06On5Qcm9ncmFtKCkgew0KKyAgaWYgKERhdGFfKSB7DQorICAgIFdpbjMyUHJvY2Vzc0luZm8qIHdwaSA9IHJlaW50ZXJwcmV0X2Nhc3Q8V2luMzJQcm9jZXNzSW5mbyo+KERhdGFfKTsNCisgICAgQ2xvc2VIYW5kbGUod3BpLT5oUHJvY2Vzcyk7DQorICAgIGRlbGV0ZSB3cGk7DQorICAgIERhdGFfID0gMDsNCisgIH0NCit9DQorDQordW5zaWduZWQgUHJvZ3JhbTo6R2V0UGlkKCkgY29uc3Qgew0KKyAgV2luMzJQcm9jZXNzSW5mbyogd3BpID0gcmVpbnRlcnByZXRfY2FzdDxXaW4zMlByb2Nlc3NJbmZvKj4oRGF0YV8pOw0KKyAgcmV0dXJuIHdwaS0+ZHdQcm9jZXNzSWQ7DQorfQ0KKw0KKy8vIFRoaXMgZnVuY3Rpb24ganVzdCB1c2VzIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGZpbmQgdGhlIHByb2dyYW0uDQorUGF0aA0KK1Byb2dyYW06OkZpbmRQcm9ncmFtQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9nTmFtZSkgew0KKw0KKyAgLy8gQ2hlY2sgc29tZSBkZWdlbmVyYXRlIGNhc2VzDQorICBpZiAocHJvZ05hbWUubGVuZ3RoKCkgPT0gMCkgLy8gbm8gcHJvZ3JhbQ0KKyAgICByZXR1cm4gUGF0aCgpOw0KKyAgUGF0aCB0ZW1wOw0KKyAgaWYgKCF0ZW1wLnNldChwcm9nTmFtZSkpIC8vIGludmFsaWQgbmFtZQ0KKyAgICByZXR1cm4gUGF0aCgpOw0KKyAgaWYgKHRlbXAuY2FuRXhlY3V0ZSgpKSAvLyBhbHJlYWR5IGV4ZWN1dGFibGUgYXMgaXMNCisgICAgcmV0dXJuIHRlbXA7DQorDQorICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgZmlsZSBuYW1lIGlzIHZhbGlkIGFuZCBpdHMgbm90IGV4ZWN1dGFibGUuDQorICAvLyBMZXQgV2luZG93cyBzZWFyY2ggZm9yIGl0Lg0KKyAgY2hhciBidWZmZXJbTUFYX1BBVEhdOw0KKyAgY2hhciAqZHVtbXkgPSBOVUxMOw0KKyAgRFdPUkQgbGVuID0gU2VhcmNoUGF0aChOVUxMLCBwcm9nTmFtZS5jX3N0cigpLCAiLmV4ZSIsIE1BWF9QQVRILA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsICZkdW1teSk7DQorDQorICAvLyBTZWUgaWYgaXQgd2Fzbid0IGZvdW5kLg0KKyAgaWYgKGxlbiA9PSAwKQ0KKyAgICByZXR1cm4gUGF0aCgpOw0KKw0KKyAgLy8gU2VlIGlmIHdlIGdvdCB0aGUgZW50aXJlIHBhdGguDQorICBpZiAobGVuIDwgTUFYX1BBVEgpDQorICAgIHJldHVybiBQYXRoKGJ1ZmZlcik7DQorDQorICAvLyBCdWZmZXIgd2FzIHRvbyBzbWFsbDsgZ3JvdyBhbmQgcmV0cnkuDQorICB3aGlsZSAodHJ1ZSkgew0KKyAgICBjaGFyICpiID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KF9hbGxvY2EobGVuKzEpKTsNCisgICAgRFdPUkQgbGVuMiA9IFNlYXJjaFBhdGgoTlVMTCwgcHJvZ05hbWUuY19zdHIoKSwgIi5leGUiLCBsZW4rMSwgYiwgJmR1bW15KTsNCisNCisgICAgLy8gSXQgaXMgdW5saWtlbHkgdGhlIHNlYXJjaCBmYWlsZWQsIGJ1dCBpdCdzIGFsd2F5cyBwb3NzaWJsZSBzb21lIGZpbGUNCisgICAgLy8gd2FzIGFkZGVkIG9yIHJlbW92ZWQgc2luY2UgdGhlIGxhc3Qgc2VhcmNoLCBzbyBiZSBwYXJhbm9pZC4uLg0KKyAgICBpZiAobGVuMiA9PSAwKQ0KKyAgICAgIHJldHVybiBQYXRoKCk7DQorICAgIGVsc2UgaWYgKGxlbjIgPD0gbGVuKQ0KKyAgICAgIHJldHVybiBQYXRoKGIpOw0KKw0KKyAgICBsZW4gPSBsZW4yOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgSEFORExFIFJlZGlyZWN0SU8oY29uc3QgUGF0aCAqcGF0aCwgaW50IGZkLCBzdGQ6OnN0cmluZyogRXJyTXNnKSB7DQorICBIQU5ETEUgaDsNCisgIGlmIChwYXRoID09IDApIHsNCisgICAgRHVwbGljYXRlSGFuZGxlKEdldEN1cnJlbnRQcm9jZXNzKCksIChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoZmQpLA0KKyAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoKSwgJmgsDQorICAgICAgICAgICAgICAgICAgICAwLCBUUlVFLCBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpOw0KKyAgICByZXR1cm4gaDsNCisgIH0NCisNCisgIGNvbnN0IGNoYXIgKmZuYW1lOw0KKyAgaWYgKHBhdGgtPmlzRW1wdHkoKSkNCisgICAgZm5hbWUgPSAiTlVMIjsNCisgIGVsc2UNCisgICAgZm5hbWUgPSBwYXRoLT5jX3N0cigpOw0KKw0KKyAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYTsNCisgIHNhLm5MZW5ndGggPSBzaXplb2Yoc2EpOw0KKyAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgPSAwOw0KKyAgc2EuYkluaGVyaXRIYW5kbGUgPSBUUlVFOw0KKw0KKyAgaCA9IENyZWF0ZUZpbGUoZm5hbWUsIGZkID8gR0VORVJJQ19XUklURSA6IEdFTkVSSUNfUkVBRCwgRklMRV9TSEFSRV9SRUFELA0KKyAgICAgICAgICAgICAgICAgJnNhLCBmZCA9PSAwID8gT1BFTl9FWElTVElORyA6IENSRUFURV9BTFdBWVMsDQorICAgICAgICAgICAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOw0KKyAgaWYgKGggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsNCisgICAgTWFrZUVyck1zZyhFcnJNc2csIHN0ZDo6c3RyaW5nKGZuYW1lKSArICI6IENhbid0IG9wZW4gZmlsZSBmb3IgIiArDQorICAgICAgICAoZmQgPyAiaW5wdXQ6ICIgOiAib3V0cHV0OiAiKSk7DQorICB9DQorDQorICByZXR1cm4gaDsNCit9DQorDQorI2lmZGVmIF9fTUlOR1czMl9fDQorICAvLyBEdWUgdG8gdW5rbm93biByZWFzb24sIG1pbmd3MzIncyB3MzJhcGkgZG9lc24ndCBoYXZlIHRoaXMgZGVjbGFyYXRpb24uDQorICBleHRlcm4gIkMiDQorICBCT09MIFdJTkFQSSBTZXRJbmZvcm1hdGlvbkpvYk9iamVjdChIQU5ETEUgaEpvYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPQk9CSkVDVElORk9DTEFTUyBKb2JPYmplY3RJbmZvQ2xhc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBKb2JPYmplY3RJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY2JKb2JPYmplY3RJbmZvTGVuZ3RoKTsNCisjZW5kaWYNCisNCisvLy8gQXJnTmVlZHNRdW90ZXMgLSBDaGVjayB3aGV0aGVyIGFyZ3VtZW50IG5lZWRzIHRvIGJlIHF1b3RlZCB3aGVuIGNhbGxpbmcNCisvLy8gQ3JlYXRlUHJvY2Vzcy4NCitzdGF0aWMgYm9vbCBBcmdOZWVkc1F1b3Rlcyhjb25zdCBjaGFyICpTdHIpIHsNCisgIHJldHVybiBTdHJbMF0gPT0gJ1wwJyB8fCBzdHJjaHIoU3RyLCAnICcpICE9IDA7DQorfQ0KKw0KKw0KKy8vLyBBcmdMZW5XaXRoUXVvdGVzIC0gQ2hlY2sgd2hldGhlciBhcmd1bWVudCBuZWVkcyB0byBiZSBxdW90ZWQgd2hlbiBjYWxsaW5nDQorLy8vIENyZWF0ZVByb2Nlc3MgYW5kIHJldHVybnMgbGVuZ3RoIG9mIHF1b3RlZCBhcmcgd2l0aCBlc2NhcGVkIHF1b3Rlcw0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgQXJnTGVuV2l0aFF1b3Rlcyhjb25zdCBjaGFyICpTdHIpIHsNCisgIHVuc2lnbmVkIGludCBsZW4gPSBBcmdOZWVkc1F1b3RlcyhTdHIpID8gMiA6IDA7DQorDQorICB3aGlsZSAoKlN0ciAhPSAnXDAnKSB7DQorICAgIGlmICgqU3RyID09ICdcIicpDQorICAgICAgKytsZW47DQorDQorICAgICsrbGVuOw0KKyAgICArK1N0cjsNCisgIH0NCisNCisgIHJldHVybiBsZW47DQorfQ0KKw0KKw0KK2Jvb2wNCitQcm9ncmFtOjpFeGVjdXRlKGNvbnN0IFBhdGgmIHBhdGgsDQorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogYXJncywNCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBlbnZwLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgUGF0aCoqIHJlZGlyZWN0cywNCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1lbW9yeUxpbWl0LA0KKyAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgaWYgKERhdGFfKSB7DQorICAgIFdpbjMyUHJvY2Vzc0luZm8qIHdwaSA9IHJlaW50ZXJwcmV0X2Nhc3Q8V2luMzJQcm9jZXNzSW5mbyo+KERhdGFfKTsNCisgICAgQ2xvc2VIYW5kbGUod3BpLT5oUHJvY2Vzcyk7DQorICAgIGRlbGV0ZSB3cGk7DQorICAgIERhdGFfID0gMDsNCisgIH0NCisNCisgIGlmICghcGF0aC5jYW5FeGVjdXRlKCkpIHsNCisgICAgaWYgKEVyck1zZykNCisgICAgICAqRXJyTXNnID0gInByb2dyYW0gbm90IGV4ZWN1dGFibGUiOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvLyBXaW5kb3dzIHdhbnRzIGEgY29tbWFuZCBsaW5lLCBub3QgYW4gYXJyYXkgb2YgYXJncywgdG8gcGFzcyB0byB0aGUgbmV3DQorICAvLyBwcm9jZXNzLiAgV2UgaGF2ZSB0byBjb25jYXRlbmF0ZSB0aGVtIGFsbCwgd2hpbGUgcXVvdGluZyB0aGUgYXJncyB0aGF0DQorICAvLyBoYXZlIGVtYmVkZGVkIHNwYWNlcyAob3IgYXJlIGVtcHR5KS4NCisNCisgIC8vIEZpcnN0LCBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBsaW5lLg0KKyAgdW5zaWduZWQgbGVuID0gMDsNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGFyZ3NbaV07IGkrKykgew0KKyAgICBsZW4gKz0gQXJnTGVuV2l0aFF1b3RlcyhhcmdzW2ldKSArIDE7DQorICB9DQorDQorICAvLyBOb3cgYnVpbGQgdGhlIGNvbW1hbmQgbGluZS4NCisgIGNoYXIgKmNvbW1hbmQgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4oX2FsbG9jYShsZW4rMSkpOw0KKyAgY2hhciAqcCA9IGNvbW1hbmQ7DQorDQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBhcmdzW2ldOyBpKyspIHsNCisgICAgY29uc3QgY2hhciAqYXJnID0gYXJnc1tpXTsNCisNCisgICAgYm9vbCBuZWVkc1F1b3RpbmcgPSBBcmdOZWVkc1F1b3RlcyhhcmcpOw0KKyAgICBpZiAobmVlZHNRdW90aW5nKQ0KKyAgICAgICpwKysgPSAnIic7DQorDQorICAgIHdoaWxlICgqYXJnICE9ICdcMCcpIHsNCisgICAgICBpZiAoKmFyZyA9PSAnXCInKQ0KKyAgICAgICAgKnArKyA9ICdcXCc7DQorDQorICAgICAgKnArKyA9ICphcmcrKzsNCisgICAgfQ0KKw0KKyAgICBpZiAobmVlZHNRdW90aW5nKQ0KKyAgICAgICpwKysgPSAnIic7DQorICAgICpwKysgPSAnICc7DQorICB9DQorDQorICAqcCA9IDA7DQorDQorICAvLyBUaGUgcG9pbnRlciB0byB0aGUgZW52aXJvbm1lbnQgYmxvY2sgZm9yIHRoZSBuZXcgcHJvY2Vzcy4NCisgIGNoYXIgKmVudmJsb2NrID0gMDsNCisNCisgIGlmIChlbnZwKSB7DQorICAgIC8vIEFuIGVudmlyb25tZW50IGJsb2NrIGNvbnNpc3RzIG9mIGEgbnVsbC10ZXJtaW5hdGVkIGJsb2NrIG9mDQorICAgIC8vIG51bGwtdGVybWluYXRlZCBzdHJpbmdzLiBDb252ZXJ0IHRoZSBhcnJheSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8NCisgICAgLy8gYW4gZW52aXJvbm1lbnQgYmxvY2sgYnkgY29uY2F0ZW5hdGluZyB0aGVtLg0KKw0KKyAgICAvLyBGaXJzdCwgZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIGVudmlyb25tZW50IGJsb2NrLg0KKyAgICBsZW4gPSAwOw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBlbnZwW2ldOyBpKyspDQorICAgICAgbGVuICs9IHN0cmxlbihlbnZwW2ldKSArIDE7DQorDQorICAgIC8vIE5vdyBidWlsZCB0aGUgZW52aXJvbm1lbnQgYmxvY2suDQorICAgIGVudmJsb2NrID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KF9hbGxvY2EobGVuKzEpKTsNCisgICAgcCA9IGVudmJsb2NrOw0KKw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBlbnZwW2ldOyBpKyspIHsNCisgICAgICBjb25zdCBjaGFyICpldiA9IGVudnBbaV07DQorICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihldikgKyAxOw0KKyAgICAgIG1lbWNweShwLCBldiwgbGVuKTsNCisgICAgICBwICs9IGxlbjsNCisgICAgfQ0KKw0KKyAgICAqcCA9IDA7DQorICB9DQorDQorICAvLyBDcmVhdGUgYSBjaGlsZCBwcm9jZXNzLg0KKyAgU1RBUlRVUElORk8gc2k7DQorICBtZW1zZXQoJnNpLCAwLCBzaXplb2Yoc2kpKTsNCisgIHNpLmNiID0gc2l6ZW9mKHNpKTsNCisgIHNpLmhTdGRJbnB1dCA9IElOVkFMSURfSEFORExFX1ZBTFVFOw0KKyAgc2kuaFN0ZE91dHB1dCA9IElOVkFMSURfSEFORExFX1ZBTFVFOw0KKyAgc2kuaFN0ZEVycm9yID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7DQorDQorICBpZiAocmVkaXJlY3RzKSB7DQorICAgIHNpLmR3RmxhZ3MgPSBTVEFSVEZfVVNFU1RESEFORExFUzsNCisNCisgICAgc2kuaFN0ZElucHV0ID0gUmVkaXJlY3RJTyhyZWRpcmVjdHNbMF0sIDAsIEVyck1zZyk7DQorICAgIGlmIChzaS5oU3RkSW5wdXQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsNCisgICAgICBNYWtlRXJyTXNnKEVyck1zZywgImNhbid0IHJlZGlyZWN0IHN0ZGluIik7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICAgIHNpLmhTdGRPdXRwdXQgPSBSZWRpcmVjdElPKHJlZGlyZWN0c1sxXSwgMSwgRXJyTXNnKTsNCisgICAgaWYgKHNpLmhTdGRPdXRwdXQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsNCisgICAgICBDbG9zZUhhbmRsZShzaS5oU3RkSW5wdXQpOw0KKyAgICAgIE1ha2VFcnJNc2coRXJyTXNnLCAiY2FuJ3QgcmVkaXJlY3Qgc3Rkb3V0Iik7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICAgIGlmIChyZWRpcmVjdHNbMV0gJiYgcmVkaXJlY3RzWzJdICYmICoocmVkaXJlY3RzWzFdKSA9PSAqKHJlZGlyZWN0c1syXSkpIHsNCisgICAgICAvLyBJZiBzdGRvdXQgYW5kIHN0ZGVyciBzaG91bGQgZ28gdG8gdGhlIHNhbWUgcGxhY2UsIHJlZGlyZWN0IHN0ZGVycg0KKyAgICAgIC8vIHRvIHRoZSBoYW5kbGUgYWxyZWFkeSBvcGVuIGZvciBzdGRvdXQuDQorICAgICAgRHVwbGljYXRlSGFuZGxlKEdldEN1cnJlbnRQcm9jZXNzKCksIHNpLmhTdGRPdXRwdXQsDQorICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksICZzaS5oU3RkRXJyb3IsDQorICAgICAgICAgICAgICAgICAgICAgIDAsIFRSVUUsIERVUExJQ0FURV9TQU1FX0FDQ0VTUyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgLy8gSnVzdCByZWRpcmVjdCBzdGRlcnINCisgICAgICBzaS5oU3RkRXJyb3IgPSBSZWRpcmVjdElPKHJlZGlyZWN0c1syXSwgMiwgRXJyTXNnKTsNCisgICAgICBpZiAoc2kuaFN0ZEVycm9yID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7DQorICAgICAgICBDbG9zZUhhbmRsZShzaS5oU3RkSW5wdXQpOw0KKyAgICAgICAgQ2xvc2VIYW5kbGUoc2kuaFN0ZE91dHB1dCk7DQorICAgICAgICBNYWtlRXJyTXNnKEVyck1zZywgImNhbid0IHJlZGlyZWN0IHN0ZGVyciIpOw0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsNCisgIG1lbXNldCgmcGksIDAsIHNpemVvZihwaSkpOw0KKw0KKyAgZmZsdXNoKHN0ZG91dCk7DQorICBmZmx1c2goc3RkZXJyKTsNCisgIEJPT0wgcmMgPSBDcmVhdGVQcm9jZXNzKHBhdGguY19zdHIoKSwgY29tbWFuZCwgTlVMTCwgTlVMTCwgVFJVRSwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmJsb2NrLCBOVUxMLCAmc2ksICZwaSk7DQorICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsNCisNCisgIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJvY2VzcyBnb3QgY3JlYXRlZCBvciBub3QsIHdlIGFyZSBkb25lIHdpdGgNCisgIC8vIHRoZSBoYW5kbGVzIHdlIGNyZWF0ZWQgZm9yIGl0IHRvIGluaGVyaXQuDQorICBDbG9zZUhhbmRsZShzaS5oU3RkSW5wdXQpOw0KKyAgQ2xvc2VIYW5kbGUoc2kuaFN0ZE91dHB1dCk7DQorICBDbG9zZUhhbmRsZShzaS5oU3RkRXJyb3IpOw0KKw0KKyAgLy8gTm93IHJldHVybiBhbiBlcnJvciBpZiB0aGUgcHJvY2VzcyBkaWRuJ3QgZ2V0IGNyZWF0ZWQuDQorICBpZiAoIXJjKSB7DQorICAgIFNldExhc3RFcnJvcihlcnIpOw0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywgc3RkOjpzdHJpbmcoIkNvdWxkbid0IGV4ZWN1dGUgcHJvZ3JhbSAnIikgKw0KKyAgICAgICAgICAgICAgIHBhdGguc3RyKCkgKyAiJyIpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICBXaW4zMlByb2Nlc3NJbmZvKiB3cGkgPSBuZXcgV2luMzJQcm9jZXNzSW5mbzsNCisgIHdwaS0+aFByb2Nlc3MgPSBwaS5oUHJvY2VzczsNCisgIHdwaS0+ZHdQcm9jZXNzSWQgPSBwaS5kd1Byb2Nlc3NJZDsNCisgIERhdGFfID0gd3BpOw0KKw0KKyAgLy8gTWFrZSBzdXJlIHRoZXNlIGdldCBjbG9zZWQgbm8gbWF0dGVyIHdoYXQuDQorICBBdXRvSGFuZGxlIGhUaHJlYWQocGkuaFRocmVhZCk7DQorDQorICAvLyBBc3NpZ24gdGhlIHByb2Nlc3MgdG8gYSBqb2IgaWYgYSBtZW1vcnkgbGltaXQgaXMgZGVmaW5lZC4NCisgIEF1dG9IYW5kbGUgaEpvYigwKTsNCisgIGlmIChtZW1vcnlMaW1pdCAhPSAwKSB7DQorICAgIGhKb2IgPSBDcmVhdGVKb2JPYmplY3QoMCwgMCk7DQorICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOw0KKyAgICBpZiAoaEpvYiAhPSAwKSB7DQorICAgICAgSk9CT0JKRUNUX0VYVEVOREVEX0xJTUlUX0lORk9STUFUSU9OIGplbGk7DQorICAgICAgbWVtc2V0KCZqZWxpLCAwLCBzaXplb2YoamVsaSkpOw0KKyAgICAgIGplbGkuQmFzaWNMaW1pdEluZm9ybWF0aW9uLkxpbWl0RmxhZ3MgPSBKT0JfT0JKRUNUX0xJTUlUX1BST0NFU1NfTUVNT1JZOw0KKyAgICAgIGplbGkuUHJvY2Vzc01lbW9yeUxpbWl0ID0gdWludHB0cl90KG1lbW9yeUxpbWl0KSAqIDEwNDg1NzY7DQorICAgICAgaWYgKFNldEluZm9ybWF0aW9uSm9iT2JqZWN0KGhKb2IsIEpvYk9iamVjdEV4dGVuZGVkTGltaXRJbmZvcm1hdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplbGksIHNpemVvZihqZWxpKSkpIHsNCisgICAgICAgIGlmIChBc3NpZ25Qcm9jZXNzVG9Kb2JPYmplY3QoaEpvYiwgcGkuaFByb2Nlc3MpKQ0KKyAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFzdWNjZXNzKSB7DQorICAgICAgU2V0TGFzdEVycm9yKEdldExhc3RFcnJvcigpKTsNCisgICAgICBNYWtlRXJyTXNnKEVyck1zZywgc3RkOjpzdHJpbmcoIlVuYWJsZSB0byBzZXQgbWVtb3J5IGxpbWl0IikpOw0KKyAgICAgIFRlcm1pbmF0ZVByb2Nlc3MocGkuaFByb2Nlc3MsIDEpOw0KKyAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QocGkuaFByb2Nlc3MsIElORklOSVRFKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitpbnQNCitQcm9ncmFtOjpXYWl0KHVuc2lnbmVkIHNlY29uZHNUb1dhaXQsDQorICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogRXJyTXNnKSB7DQorICBpZiAoRGF0YV8gPT0gMCkgew0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywgIlByb2Nlc3Mgbm90IHN0YXJ0ZWQhIik7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisNCisgIFdpbjMyUHJvY2Vzc0luZm8qIHdwaSA9IHJlaW50ZXJwcmV0X2Nhc3Q8V2luMzJQcm9jZXNzSW5mbyo+KERhdGFfKTsNCisgIEhBTkRMRSBoUHJvY2VzcyA9IHdwaS0+aFByb2Nlc3M7DQorDQorICAvLyBXYWl0IGZvciB0aGUgcHJvY2VzcyB0byB0ZXJtaW5hdGUuDQorICBEV09SRCBtaWxsaXNlY29uZHNUb1dhaXQgPSBJTkZJTklURTsNCisgIGlmIChzZWNvbmRzVG9XYWl0ID4gMCkNCisgICAgbWlsbGlzZWNvbmRzVG9XYWl0ID0gc2Vjb25kc1RvV2FpdCAqIDEwMDA7DQorDQorICBpZiAoV2FpdEZvclNpbmdsZU9iamVjdChoUHJvY2VzcywgbWlsbGlzZWNvbmRzVG9XYWl0KSA9PSBXQUlUX1RJTUVPVVQpIHsNCisgICAgaWYgKCFUZXJtaW5hdGVQcm9jZXNzKGhQcm9jZXNzLCAxKSkgew0KKyAgICAgIE1ha2VFcnJNc2coRXJyTXNnLCAiRmFpbGVkIHRvIHRlcm1pbmF0ZSB0aW1lZC1vdXQgcHJvZ3JhbS4iKTsNCisgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgV2FpdEZvclNpbmdsZU9iamVjdChoUHJvY2VzcywgSU5GSU5JVEUpOw0KKyAgfQ0KKw0KKyAgLy8gR2V0IGl0cyBleGl0IHN0YXR1cy4NCisgIERXT1JEIHN0YXR1czsNCisgIEJPT0wgcmMgPSBHZXRFeGl0Q29kZVByb2Nlc3MoaFByb2Nlc3MsICZzdGF0dXMpOw0KKyAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7DQorDQorICBpZiAoIXJjKSB7DQorICAgIFNldExhc3RFcnJvcihlcnIpOw0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywgIkZhaWxlZCBnZXR0aW5nIHN0YXR1cyBmb3IgcHJvZ3JhbS4iKTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIHN0YXR1czsNCit9DQorDQorYm9vbA0KK1Byb2dyYW06OktpbGwoc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgaWYgKERhdGFfID09IDApIHsNCisgICAgTWFrZUVyck1zZyhFcnJNc2csICJQcm9jZXNzIG5vdCBzdGFydGVkISIpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisNCisgIFdpbjMyUHJvY2Vzc0luZm8qIHdwaSA9IHJlaW50ZXJwcmV0X2Nhc3Q8V2luMzJQcm9jZXNzSW5mbyo+KERhdGFfKTsNCisgIEhBTkRMRSBoUHJvY2VzcyA9IHdwaS0+aFByb2Nlc3M7DQorICBpZiAoVGVybWluYXRlUHJvY2VzcyhoUHJvY2VzcywgMSkgPT0gMCkgew0KKyAgICBNYWtlRXJyTXNnKEVyck1zZywgIlRoZSBwcm9jZXNzIGNvdWxkbid0IGJlIGtpbGxlZCEiKTsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorDQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgUHJvZ3JhbTo6Q2hhbmdlU3RkaW5Ub0JpbmFyeSgpew0KKyAgaW50IHJlc3VsdCA9IF9zZXRtb2RlKCBfZmlsZW5vKHN0ZGluKSwgX09fQklOQVJZICk7DQorICByZXR1cm4gcmVzdWx0ID09IC0xOw0KK30NCisNCitib29sIFByb2dyYW06OkNoYW5nZVN0ZG91dFRvQmluYXJ5KCl7DQorICBpbnQgcmVzdWx0ID0gX3NldG1vZGUoIF9maWxlbm8oc3Rkb3V0KSwgX09fQklOQVJZICk7DQorICByZXR1cm4gcmVzdWx0ID09IC0xOw0KK30NCisNCitib29sIFByb2dyYW06OkNoYW5nZVN0ZGVyclRvQmluYXJ5KCl7DQorICBpbnQgcmVzdWx0ID0gX3NldG1vZGUoIF9maWxlbm8oc3RkZXJyKSwgX09fQklOQVJZICk7DQorICByZXR1cm4gcmVzdWx0ID09IC0xOw0KK30NCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9SV011dGV4LmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvUldNdXRleC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI2OTIyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvUldNdXRleC5pbmMKQEAgLTAsMCArMSw1OCBAQAorLy89IGxsdm0vU3lzdGVtL1dpbjMyL011dGV4LmluYyAtIFdpbjMyIFJlYWRlci9Xcml0ZXIgTXV0dWFsIEV4Y2x1c2lvbiBMb2NrICA9Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBXaW4zMiBzcGVjaWZpYyAobm9uLXB0aHJlYWQpIFJXTXV0ZXggY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBXaW4zMiBjb2RlIHRoYXQKKy8vPT09ICAgICAgICAgIGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiAqYWxsKiBXaW4zMiB2YXJpYW50cy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJXaW4zMi5oIgorCisvLyBGSVhNRTogV2luZG93cyBkb2VzIG5vdCBoYXZlIHJlYWRlci13cml0ZXIgbG9ja3MgcHJlLVZpc3RhLiAgSWYgeW91IHdhbnQKKy8vIHJlYWwgcmVhZGVyLXdyaXRlciBsb2NrcywgeW91IGEgcHRocmVhZHMgaW1wbGVtZW50YXRpb24gZm9yIFdpbmRvd3MuCisKK25hbWVzcGFjZSBsbHZtIHsKK3VzaW5nIG5hbWVzcGFjZSBzeXM7CisKK1JXTXV0ZXhJbXBsOjpSV011dGV4SW1wbCgpIHsKKyAgZGF0YV8gPSBjYWxsb2MoMSwgc2l6ZW9mKENSSVRJQ0FMX1NFQ1RJT04pKTsKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihzdGF0aWNfY2FzdDxMUENSSVRJQ0FMX1NFQ1RJT04+KGRhdGFfKSk7Cit9CisKK1JXTXV0ZXhJbXBsOjp+UldNdXRleEltcGwoKSB7CisgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbihzdGF0aWNfY2FzdDxMUENSSVRJQ0FMX1NFQ1RJT04+KGRhdGFfKSk7CisgIGZyZWUoZGF0YV8pOworfQorCitib29sIFJXTXV0ZXhJbXBsOjpyZWFkZXJfYWNxdWlyZSgpIHsKKyAgRW50ZXJDcml0aWNhbFNlY3Rpb24oc3RhdGljX2Nhc3Q8TFBDUklUSUNBTF9TRUNUSU9OPihkYXRhXykpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSV011dGV4SW1wbDo6cmVhZGVyX3JlbGVhc2UoKSB7CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKHN0YXRpY19jYXN0PExQQ1JJVElDQUxfU0VDVElPTj4oZGF0YV8pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUldNdXRleEltcGw6OndyaXRlcl9hY3F1aXJlKCkgeworICBFbnRlckNyaXRpY2FsU2VjdGlvbihzdGF0aWNfY2FzdDxMUENSSVRJQ0FMX1NFQ1RJT04+KGRhdGFfKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFJXTXV0ZXhJbXBsOjp3cml0ZXJfcmVsZWFzZSgpIHsKKyAgTGVhdmVDcml0aWNhbFNlY3Rpb24oc3RhdGljX2Nhc3Q8TFBDUklUSUNBTF9TRUNUSU9OPihkYXRhXykpOworICByZXR1cm4gdHJ1ZTsKK30KKworCit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL1NpZ25hbHMuaW5jIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9TaWduYWxzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzc0OTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9TaWduYWxzLmluYwpAQCAtMCwwICsxLDMxOCBAQAorLy89PT0tIFdpbjMyL1NpZ25hbHMuY3BwIC0gV2luMzIgU2lnbmFscyBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgV2luMzIgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNpZ25hbHMgY2xhc3MuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKyNpbmNsdWRlICJXaW4zMi5oIg0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDx2ZWN0b3I+DQorI2luY2x1ZGUgPGFsZ29yaXRobT4NCisNCisjaWZkZWYgX19NSU5HVzMyX18NCisgI2luY2x1ZGUgPGltYWdlaGxwLmg+DQorI2Vsc2UNCisgI2luY2x1ZGUgPGRiZ2hlbHAuaD4NCisjZW5kaWYNCisjaW5jbHVkZSA8cHNhcGkuaD4NCisNCisjaWZkZWYgX19NSU5HVzMyX18NCisgI2lmICgoSEFWRV9MSUJJTUFHRUhMUCAhPSAxKSB8fCAoSEFWRV9MSUJQU0FQSSAhPSAxKSkNCisgICNlcnJvciAibGliaW1hZ2VobHAuYSAmIGxpYnBzYXBpLmEgc2hvdWxkIGJlIHByZXNlbnQiDQorICNlbmRpZg0KKyNlbHNlDQorICNwcmFnbWEgY29tbWVudChsaWIsICJwc2FwaS5saWIiKQ0KKyAjcHJhZ21hIGNvbW1lbnQobGliLCAiZGJnaGVscC5saWIiKQ0KKyNlbmRpZg0KKw0KKy8vIEZvcndhcmQgZGVjbGFyZS4NCitzdGF0aWMgTE9ORyBXSU5BUEkgTExWTVVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcihMUEVYQ0VQVElPTl9QT0lOVEVSUyBlcCk7DQorc3RhdGljIEJPT0wgV0lOQVBJIExMVk1Db25zb2xlQ3RybEhhbmRsZXIoRFdPUkQgZHdDdHJsVHlwZSk7DQorDQorLy8gSW50ZXJydXB0RnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpZiBjdHJsLWMgaXMgcHJlc3NlZC4NCitzdGF0aWMgdm9pZCAoKkludGVycnVwdEZ1bmN0aW9uKSgpID0gMDsNCisNCitzdGF0aWMgc3RkOjp2ZWN0b3I8bGx2bTo6c3lzOjpQYXRoPiAqRmlsZXNUb1JlbW92ZSA9IE5VTEw7DQorc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx2b2lkKCopKHZvaWQqKSwgdm9pZCo+ID4gKkNhbGxCYWNrc1RvUnVuID0gMDsNCitzdGF0aWMgYm9vbCBSZWdpc3RlcmVkVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyID0gZmFsc2U7DQorc3RhdGljIGJvb2wgQ2xlYW51cEV4ZWN1dGVkID0gZmFsc2U7DQorI2lmZGVmIF9NU0NfVkVSDQorc3RhdGljIGJvb2wgRXhpdE9uVW5oYW5kbGVkRXhjZXB0aW9ucyA9IGZhbHNlOw0KKyNlbmRpZg0KK3N0YXRpYyBQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIgT2xkRmlsdGVyID0gTlVMTDsNCisNCisvLyBXaW5kb3dzIGNyZWF0ZXMgYSBuZXcgdGhyZWFkIHRvIGV4ZWN1dGUgdGhlIGNvbnNvbGUgaGFuZGxlciB3aGVuIGFuIGV2ZW50DQorLy8gKHN1Y2ggYXMgQ1RSTC9DKSBvY2N1cnMuICBUaGlzIGNhdXNlcyBjb25jdXJyZW5jeSBpc3N1ZXMgd2l0aCB0aGUgYWJvdmUNCisvLyBnbG9iYWxzIHdoaWNoIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBhZGRyZXNzZXMuDQorc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gQ3JpdGljYWxTZWN0aW9uOw0KKw0KK25hbWVzcGFjZSBsbHZtIHsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgV2luMzIgc3BlY2lmaWMgY29kZSANCisvLz09PSAgICAgICAgICBhbmQgbXVzdCBub3QgYmUgVU5JWCBjb2RlDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisjaWZkZWYgX01TQ19WRVINCisvLy8gQ1JUUmVwb3J0SG9vayAtIEZ1bmN0aW9uIGNhbGxlZCBvbiBhIENSVCBkZWJ1Z2dpbmcgZXZlbnQuDQorc3RhdGljIGludCBDUlRSZXBvcnRIb29rKGludCBSZXBvcnRUeXBlLCBjaGFyICpNZXNzYWdlLCBpbnQgKlJldHVybikgew0KKyAgLy8gRG9uJ3QgY2F1c2UgYSBEZWJ1Z0JyZWFrKCkgb24gcmV0dXJuLg0KKyAgaWYgKFJldHVybikNCisgICAgKlJldHVybiA9IDA7DQorDQorICBzd2l0Y2ggKFJlcG9ydFR5cGUpIHsNCisgIGRlZmF1bHQ6DQorICBjYXNlIF9DUlRfQVNTRVJUOg0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNSVCBhc3NlcnQ6ICVzXG4iLCBNZXNzYWdlKTsNCisgICAgLy8gRklYTUU6IElzIHRoZXJlIGEgd2F5IHRvIGp1c3QgY3Jhc2g/IFBlcmhhcHMgdGhyb3cgdG8gdGhlIHVuaGFuZGxlZA0KKyAgICAvLyBleGNlcHRpb24gY29kZT8gUGVyaGFwcyBTZXRFcnJvck1vZGUoKSBoYW5kbGVzIHRoaXMuDQorICAgIF9leGl0KDMpOw0KKyAgICBicmVhazsNCisgIGNhc2UgX0NSVF9FUlJPUjoNCisgICAgZnByaW50ZihzdGRlcnIsICJDUlQgZXJyb3I6ICVzXG4iLCBNZXNzYWdlKTsNCisgICAgLy8gRklYTUU6IElzIHRoZXJlIGEgd2F5IHRvIGp1c3QgY3Jhc2g/IFBlcmhhcHMgdGhyb3cgdG8gdGhlIHVuaGFuZGxlZA0KKyAgICAvLyBleGNlcHRpb24gY29kZT8gUGVyaGFwcyBTZXRFcnJvck1vZGUoKSBoYW5kbGVzIHRoaXMuDQorICAgIF9leGl0KDMpOw0KKyAgICBicmVhazsNCisgIGNhc2UgX0NSVF9XQVJOOg0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNSVCB3YXJuOiAlc1xuIiwgTWVzc2FnZSk7DQorICAgIGJyZWFrOw0KKyAgfQ0KKw0KKyAgLy8gRG9uJ3QgY2FsbCBfQ3J0RGJnUmVwb3J0Lg0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKyNlbmRpZg0KKw0KK3N0YXRpYyB2b2lkIFJlZ2lzdGVySGFuZGxlcigpIHsNCisgIGlmIChSZWdpc3RlcmVkVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKSB7DQorICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZDcml0aWNhbFNlY3Rpb24pOw0KKyAgICByZXR1cm47DQorICB9DQorDQorICAvLyBOb3cncyB0aGUgdGltZSB0byBjcmVhdGUgdGhlIGNyaXRpY2FsIHNlY3Rpb24uICBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lDQorICAvLyB0aHJvdWdoIGhlcmUsIGFuZCB0aGVyZSdzIG9ubHkgb25lIHRocmVhZC4NCisgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJkNyaXRpY2FsU2VjdGlvbik7DQorDQorICAvLyBFbnRlciBpdCBpbW1lZGlhdGVseS4gIE5vdyBpZiBzb21lb25lIGhpdHMgQ1RSTC9DLCB0aGUgY29uc29sZSBoYW5kbGVyDQorICAvLyBjYW4ndCBwcm9jZWVkIHVudGlsIHRoZSBnbG9iYWxzIGFyZSB1cGRhdGVkLg0KKyAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJkNyaXRpY2FsU2VjdGlvbik7DQorDQorICBSZWdpc3RlcmVkVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyID0gdHJ1ZTsNCisgIE9sZEZpbHRlciA9IFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcihMTFZNVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKTsNCisgIFNldENvbnNvbGVDdHJsSGFuZGxlcihMTFZNQ29uc29sZUN0cmxIYW5kbGVyLCBUUlVFKTsNCisNCisgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRpc2FibGUgYW55IGtpbmQgb2YgY3Jhc2ggZGlhbG9nLg0KKyNpZmRlZiBfTVNDX1ZFUg0KKyAgaWYgKGdldGVudigiTExWTV9ESVNBQkxFX0NSVF9ERUJVRyIpKSB7DQorICAgIF9DcnRTZXRSZXBvcnRIb29rKENSVFJlcG9ydEhvb2spOw0KKyAgICBFeGl0T25VbmhhbmRsZWRFeGNlcHRpb25zID0gdHJ1ZTsNCisgIH0NCisjZW5kaWYNCisNCisgIC8vIElNUE9SVEFOVCBOT1RFOiBDYWxsZXIgbXVzdCBjYWxsIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZDcml0aWNhbFNlY3Rpb24pIG9yDQorICAvLyBlbHNlIG11bHRpLXRocmVhZGluZyBwcm9ibGVtcyB3aWxsIGVuc3VlLg0KK30NCisNCisvLyBSZW1vdmVGaWxlT25TaWduYWwgLSBUaGUgcHVibGljIEFQSQ0KK2Jvb2wgc3lzOjpSZW1vdmVGaWxlT25TaWduYWwoY29uc3Qgc3lzOjpQYXRoICZGaWxlbmFtZSwgc3RkOjpzdHJpbmcqIEVyck1zZykgew0KKyAgUmVnaXN0ZXJIYW5kbGVyKCk7DQorDQorICBpZiAoQ2xlYW51cEV4ZWN1dGVkKSB7DQorICAgIGlmIChFcnJNc2cpDQorICAgICAgKkVyck1zZyA9ICJQcm9jZXNzIHRlcm1pbmF0aW5nIC0tIGNhbm5vdCByZWdpc3RlciBmb3IgcmVtb3ZhbCI7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKw0KKyAgaWYgKEZpbGVzVG9SZW1vdmUgPT0gTlVMTCkNCisgICAgRmlsZXNUb1JlbW92ZSA9IG5ldyBzdGQ6OnZlY3RvcjxzeXM6OlBhdGg+Ow0KKw0KKyAgRmlsZXNUb1JlbW92ZS0+cHVzaF9iYWNrKEZpbGVuYW1lKTsNCisNCisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZDcml0aWNhbFNlY3Rpb24pOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCisvLy8gUHJpbnRTdGFja1RyYWNlT25FcnJvclNpZ25hbCAtIFdoZW4gYW4gZXJyb3Igc2lnbmFsIChzdWNoIGFzIFNJQkFCUlQgb3INCisvLy8gU0lHU0VHVikgaXMgZGVsaXZlcmVkIHRvIHRoZSBwcm9jZXNzLCBwcmludCBhIHN0YWNrIHRyYWNlIGFuZCB0aGVuIGV4aXQuDQordm9pZCBzeXM6OlByaW50U3RhY2tUcmFjZU9uRXJyb3JTaWduYWwoKSB7DQorICBSZWdpc3RlckhhbmRsZXIoKTsNCisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZDcml0aWNhbFNlY3Rpb24pOw0KK30NCisNCisNCit2b2lkIHN5czo6U2V0SW50ZXJydXB0RnVuY3Rpb24odm9pZCAoKklGKSgpKSB7DQorICBSZWdpc3RlckhhbmRsZXIoKTsNCisgIEludGVycnVwdEZ1bmN0aW9uID0gSUY7DQorICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmQ3JpdGljYWxTZWN0aW9uKTsNCit9DQorDQorDQorLy8vIEFkZFNpZ25hbEhhbmRsZXIgLSBBZGQgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBhIHNpZ25hbCBpcyBkZWxpdmVyZWQNCisvLy8gdG8gdGhlIHByb2Nlc3MuICBUaGUgaGFuZGxlciBjYW4gaGF2ZSBhIGNvb2tpZSBwYXNzZWQgdG8gaXQgdG8gaWRlbnRpZnkNCisvLy8gd2hhdCBpbnN0YW5jZSBvZiB0aGUgaGFuZGxlciBpdCBpcy4NCit2b2lkIHN5czo6QWRkU2lnbmFsSGFuZGxlcih2b2lkICgqRm5QdHIpKHZvaWQgKiksIHZvaWQgKkNvb2tpZSkgew0KKyAgaWYgKENhbGxCYWNrc1RvUnVuID09IDApDQorICAgIENhbGxCYWNrc1RvUnVuID0gbmV3IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx2b2lkKCopKHZvaWQqKSwgdm9pZCo+ID4oKTsNCisgIENhbGxCYWNrc1RvUnVuLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoRm5QdHIsIENvb2tpZSkpOw0KKyAgUmVnaXN0ZXJIYW5kbGVyKCk7DQorICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmQ3JpdGljYWxTZWN0aW9uKTsNCit9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIENsZWFudXAoKSB7DQorICBFbnRlckNyaXRpY2FsU2VjdGlvbigmQ3JpdGljYWxTZWN0aW9uKTsNCisNCisgIC8vIFByZXZlbnQgb3RoZXIgdGhyZWFkIGZyb20gcmVnaXN0ZXJpbmcgbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcyBmb3INCisgIC8vIHJlbW92YWwsIHNob3VsZCB3ZSBiZSBleGVjdXRpbmcgYmVjYXVzZSBvZiB0aGUgY29uc29sZSBoYW5kbGVyIGNhbGxiYWNrLg0KKyAgQ2xlYW51cEV4ZWN1dGVkID0gdHJ1ZTsNCisNCisgIC8vIEZJWE1FOiBvcGVuIGZpbGVzIGNhbm5vdCBiZSBkZWxldGVkLg0KKw0KKyAgaWYgKEZpbGVzVG9SZW1vdmUgIT0gTlVMTCkNCisgICAgd2hpbGUgKCFGaWxlc1RvUmVtb3ZlLT5lbXB0eSgpKSB7DQorICAgICAgRmlsZXNUb1JlbW92ZS0+YmFjaygpLmVyYXNlRnJvbURpc2soKTsNCisgICAgICBGaWxlc1RvUmVtb3ZlLT5wb3BfYmFjaygpOw0KKyAgICB9DQorDQorICBpZiAoQ2FsbEJhY2tzVG9SdW4pDQorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDYWxsQmFja3NUb1J1bi0+c2l6ZSgpOyBpICE9IGU7ICsraSkNCisgICAgICAoKkNhbGxCYWNrc1RvUnVuKVtpXS5maXJzdCgoKkNhbGxCYWNrc1RvUnVuKVtpXS5zZWNvbmQpOw0KKw0KKyAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJkNyaXRpY2FsU2VjdGlvbik7DQorfQ0KKw0KK3ZvaWQgbGx2bTo6c3lzOjpSdW5JbnRlcnJ1cHRIYW5kbGVycygpIHsNCisgIENsZWFudXAoKTsNCit9DQorDQorc3RhdGljIExPTkcgV0lOQVBJIExMVk1VbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIoTFBFWENFUFRJT05fUE9JTlRFUlMgZXApIHsNCisgIHRyeSB7DQorICAgIENsZWFudXAoKTsNCisgICAgDQorI2lmZGVmIF9XSU42NA0KKyAgLy8gVE9ETzogcHJvdmlkZSBhIHg2NCBmcmllbmRseSB2ZXJzaW9uIG9mIHRoZSBmb2xsb3dpbmcNCisjZWxzZQ0KKyAgICANCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgU1RBQ0tGUkFNRSBzdHJ1Y3R1cmUuDQorICAgIFNUQUNLRlJBTUUgU3RhY2tGcmFtZTsNCisgICAgbWVtc2V0KCZTdGFja0ZyYW1lLCAwLCBzaXplb2YoU3RhY2tGcmFtZSkpOw0KKw0KKyAgICBTdGFja0ZyYW1lLkFkZHJQQy5PZmZzZXQgPSBlcC0+Q29udGV4dFJlY29yZC0+RWlwOw0KKyAgICBTdGFja0ZyYW1lLkFkZHJQQy5Nb2RlID0gQWRkck1vZGVGbGF0Ow0KKyAgICBTdGFja0ZyYW1lLkFkZHJTdGFjay5PZmZzZXQgPSBlcC0+Q29udGV4dFJlY29yZC0+RXNwOw0KKyAgICBTdGFja0ZyYW1lLkFkZHJTdGFjay5Nb2RlID0gQWRkck1vZGVGbGF0Ow0KKyAgICBTdGFja0ZyYW1lLkFkZHJGcmFtZS5PZmZzZXQgPSBlcC0+Q29udGV4dFJlY29yZC0+RWJwOw0KKyAgICBTdGFja0ZyYW1lLkFkZHJGcmFtZS5Nb2RlID0gQWRkck1vZGVGbGF0Ow0KKw0KKyAgICBIQU5ETEUgaFByb2Nlc3MgPSBHZXRDdXJyZW50UHJvY2VzcygpOw0KKyAgICBIQU5ETEUgaFRocmVhZCA9IEdldEN1cnJlbnRUaHJlYWQoKTsNCisNCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc3ltYm9sIGhhbmRsZXIuDQorICAgIFN5bVNldE9wdGlvbnMoU1lNT1BUX0RFRkVSUkVEX0xPQURTfFNZTU9QVF9MT0FEX0xJTkVTKTsNCisgICAgU3ltSW5pdGlhbGl6ZShoUHJvY2VzcywgTlVMTCwgVFJVRSk7DQorDQorICAgIHdoaWxlICh0cnVlKSB7DQorICAgICAgaWYgKCFTdGFja1dhbGsoSU1BR0VfRklMRV9NQUNISU5FX0kzODYsIGhQcm9jZXNzLCBoVGhyZWFkLCAmU3RhY2tGcmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBlcC0+Q29udGV4dFJlY29yZCwgTlVMTCwgU3ltRnVuY3Rpb25UYWJsZUFjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICBTeW1HZXRNb2R1bGVCYXNlLCBOVUxMKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmIChTdGFja0ZyYW1lLkFkZHJGcmFtZS5PZmZzZXQgPT0gMCkNCisgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIC8vIFByaW50IHRoZSBQQyBpbiBoZXhhZGVjaW1hbC4NCisgICAgICBEV09SRCBQQyA9IFN0YWNrRnJhbWUuQWRkclBDLk9mZnNldDsNCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUwOGxYIiwgUEMpOw0KKw0KKyAgICAgIC8vIFByaW50IHRoZSBwYXJhbWV0ZXJzLiAgQXNzdW1lIHRoZXJlIGFyZSBmb3VyLg0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiICgweCUwOGxYIDB4JTA4bFggMHglMDhsWCAweCUwOGxYKSIsIFN0YWNrRnJhbWUuUGFyYW1zWzBdLA0KKyAgICAgICAgICAgICAgU3RhY2tGcmFtZS5QYXJhbXNbMV0sIFN0YWNrRnJhbWUuUGFyYW1zWzJdLCBTdGFja0ZyYW1lLlBhcmFtc1szXSk7DQorDQorICAgICAgLy8gVmVyaWZ5IHRoZSBQQyBiZWxvbmdzIHRvIGEgbW9kdWxlIGluIHRoaXMgcHJvY2Vzcy4NCisgICAgICBpZiAoIVN5bUdldE1vZHVsZUJhc2UoaFByb2Nlc3MsIFBDKSkgew0KKyAgICAgICAgZnB1dHMoIiA8dW5rbm93biBtb2R1bGU+XG4iLCBzdGRlcnIpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKw0KKyAgICAgIC8vIFByaW50IHRoZSBzeW1ib2wgbmFtZS4NCisgICAgICBjaGFyIGJ1ZmZlcls1MTJdOw0KKyAgICAgIElNQUdFSExQX1NZTUJPTCAqc3ltYm9sID0gcmVpbnRlcnByZXRfY2FzdDxJTUFHRUhMUF9TWU1CT0wgKj4oYnVmZmVyKTsNCisgICAgICBtZW1zZXQoc3ltYm9sLCAwLCBzaXplb2YoSU1BR0VITFBfU1lNQk9MKSk7DQorICAgICAgc3ltYm9sLT5TaXplT2ZTdHJ1Y3QgPSBzaXplb2YoSU1BR0VITFBfU1lNQk9MKTsNCisgICAgICBzeW1ib2wtPk1heE5hbWVMZW5ndGggPSA1MTIgLSBzaXplb2YoSU1BR0VITFBfU1lNQk9MKTsNCisNCisgICAgICBEV09SRCBkd0Rpc3A7DQorICAgICAgaWYgKCFTeW1HZXRTeW1Gcm9tQWRkcihoUHJvY2VzcywgUEMsICZkd0Rpc3AsIHN5bWJvbCkpIHsNCisgICAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorDQorICAgICAgYnVmZmVyWzUxMV0gPSAwOw0KKyAgICAgIGlmIChkd0Rpc3AgPiAwKQ0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIsICVzKCkrJTA0bHUgYnl0ZXMocykiLCBzeW1ib2wtPk5hbWUsIGR3RGlzcCk7DQorICAgICAgZWxzZQ0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIsICVzIiwgc3ltYm9sLT5OYW1lKTsNCisNCisgICAgICAvLyBQcmludCB0aGUgc291cmNlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLg0KKyAgICAgIElNQUdFSExQX0xJTkUgbGluZTsNCisgICAgICBtZW1zZXQoJmxpbmUsIDAsIHNpemVvZihsaW5lKSk7DQorICAgICAgbGluZS5TaXplT2ZTdHJ1Y3QgPSBzaXplb2YobGluZSk7DQorICAgICAgaWYgKFN5bUdldExpbmVGcm9tQWRkcihoUHJvY2VzcywgUEMsICZkd0Rpc3AsICZsaW5lKSkgew0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIsICVzLCBsaW5lICVsdSIsIGxpbmUuRmlsZU5hbWUsIGxpbmUuTGluZU51bWJlcik7DQorICAgICAgICBpZiAoZHdEaXNwID4gMCkNCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIrJTA0bHUgYnl0ZShzKSIsIGR3RGlzcCk7DQorICAgICAgfQ0KKw0KKyAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7DQorICAgIH0NCisNCisjZW5kaWYNCisNCisgIH0gY2F0Y2ggKC4uLikgew0KKyAgICAgIGFzc2VydCgwICYmICJDcmFzaGVkIGluIExMVk1VbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIiKTsNCisgIH0NCisNCisjaWZkZWYgX01TQ19WRVINCisgIGlmIChFeGl0T25VbmhhbmRsZWRFeGNlcHRpb25zKQ0KKyAgICBfZXhpdCgtMyk7DQorI2VuZGlmDQorDQorICAvLyBBbGxvdyBkaWFsb2cgYm94IHRvIHBvcCB1cCBhbGxvd2luZyBjaG9pY2UgdG8gc3RhcnQgZGVidWdnZXIuDQorICBpZiAoT2xkRmlsdGVyKQ0KKyAgICByZXR1cm4gKCpPbGRGaWx0ZXIpKGVwKTsNCisgIGVsc2UNCisgICAgcmV0dXJuIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7DQorfQ0KKw0KK3N0YXRpYyBCT09MIFdJTkFQSSBMTFZNQ29uc29sZUN0cmxIYW5kbGVyKERXT1JEIGR3Q3RybFR5cGUpIHsNCisgIC8vIFdlIGFyZSBydW5uaW5nIGluIG91ciB2ZXJ5IG93biB0aHJlYWQsIGNvdXJ0ZXN5IG9mIFdpbmRvd3MuDQorICBFbnRlckNyaXRpY2FsU2VjdGlvbigmQ3JpdGljYWxTZWN0aW9uKTsNCisgIENsZWFudXAoKTsNCisNCisgIC8vIElmIGFuIGludGVycnVwdCBmdW5jdGlvbiBoYXMgYmVlbiBzZXQsIGdvIGFuZCBydW4gb25lIGl0OyBvdGhlcndpc2UsDQorICAvLyB0aGUgcHJvY2VzcyBkaWVzLg0KKyAgdm9pZCAoKklGKSgpID0gSW50ZXJydXB0RnVuY3Rpb247DQorICBJbnRlcnJ1cHRGdW5jdGlvbiA9IDA7ICAgICAgLy8gRG9uJ3QgcnVuIGl0IG9uIGFub3RoZXIgQ1RSTC1DLg0KKw0KKyAgaWYgKElGKSB7DQorICAgIC8vIE5vdGU6IGlmIHRoZSBpbnRlcnJ1cHQgZnVuY3Rpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlcmUgaXMgbm90aGluZw0KKyAgICAvLyB0byBjYXRjaCBpdCBpbiB0aGlzIHRocmVhZCBzbyBpdCB3aWxsIGtpbGwgdGhlIHByb2Nlc3MuDQorICAgIElGKCk7ICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIGl0IG5vdy4NCisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJkNyaXRpY2FsU2VjdGlvbik7DQorICAgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgLy8gRG9uJ3Qga2lsbCB0aGUgcHJvY2Vzcy4NCisgIH0NCisNCisgIC8vIEFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIHRvIHRha2UgcGxhY2U7IGkuZS4sIHRoZSBwcm9jZXNzIGRpZXMuDQorICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmQ3JpdGljYWxTZWN0aW9uKTsNCisgIHJldHVybiBGQUxTRTsNCit9DQorDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9UaHJlYWRMb2NhbC5pbmMgYi9zcmMvTExWTS9saWIvU3lzdGVtL1dpbjMyL1RocmVhZExvY2FsLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI5MzNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9UaHJlYWRMb2NhbC5pbmMKQEAgLTAsMCArMSw1MyBAQAorLy89IGxsdm0vU3lzdGVtL1dpbjMyL1RocmVhZExvY2FsLmluYyAtIFdpbjMyIFRocmVhZCBMb2NhbCBEYXRhIC0qLSBDKysgLSotPT09Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBXaW4zMiBzcGVjaWZpYyAobm9uLXB0aHJlYWQpIFRocmVhZExvY2FsIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLz09PSBXQVJOSU5HOiBJbXBsZW1lbnRhdGlvbiBoZXJlIG11c3QgY29udGFpbiBvbmx5IGdlbmVyaWMgV2luMzIgY29kZSB0aGF0CisvLz09PSAgICAgICAgICBpcyBndWFyYW50ZWVkIHRvIHdvcmsgb24gKmFsbCogV2luMzIgdmFyaWFudHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiV2luMzIuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaHJlYWRMb2NhbC5oIgorCituYW1lc3BhY2UgbGx2bSB7Cit1c2luZyBuYW1lc3BhY2Ugc3lzOworCitUaHJlYWRMb2NhbEltcGw6OlRocmVhZExvY2FsSW1wbCgpIHsKKyAgRFdPUkQqIHRscyA9IG5ldyBEV09SRDsKKyAgKnRscyA9IFRsc0FsbG9jKCk7CisgIGFzc2VydCgqdGxzICE9IFRMU19PVVRfT0ZfSU5ERVhFUyk7CisgIGRhdGEgPSB0bHM7Cit9CisKK1RocmVhZExvY2FsSW1wbDo6flRocmVhZExvY2FsSW1wbCgpIHsKKyAgRFdPUkQqIHRscyA9IHN0YXRpY19jYXN0PERXT1JEKj4oZGF0YSk7CisgIFRsc0ZyZWUoKnRscyk7CisgIGRlbGV0ZSB0bHM7Cit9CisKK2NvbnN0IHZvaWQqIFRocmVhZExvY2FsSW1wbDo6Z2V0SW5zdGFuY2UoKSB7CisgIERXT1JEKiB0bHMgPSBzdGF0aWNfY2FzdDxEV09SRCo+KGRhdGEpOworICByZXR1cm4gVGxzR2V0VmFsdWUoKnRscyk7Cit9CisKK3ZvaWQgVGhyZWFkTG9jYWxJbXBsOjpzZXRJbnN0YW5jZShjb25zdCB2b2lkKiBkKXsKKyAgRFdPUkQqIHRscyA9IHN0YXRpY19jYXN0PERXT1JEKj4oZGF0YSk7CisgIGludCBlcnJvcmNvZGUgPSBUbHNTZXRWYWx1ZSgqdGxzLCBjb25zdF9jYXN0PHZvaWQqPihkKSk7CisgIGFzc2VydChlcnJvcmNvZGUgIT0gMCk7Cit9CisKK3ZvaWQgVGhyZWFkTG9jYWxJbXBsOjpyZW1vdmVJbnN0YW5jZSgpIHsKKyAgc2V0SW5zdGFuY2UoMCk7Cit9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvVGltZVZhbHVlLmluYyBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvVGltZVZhbHVlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzI3MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9UaW1lVmFsdWUuaW5jCkBAIC0wLDAgKzEsNTEgQEAKKy8vPT09LSBXaW4zMi9UaW1lVmFsdWUuY3BwIC0gV2luMzIgVGltZVZhbHVlIEltcGxlbWVudGF0aW9uIC0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIFdpbjMyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaW1lVmFsdWUgY2xhc3MuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKyNpbmNsdWRlICJXaW4zMi5oIg0KKyNpbmNsdWRlIDx0aW1lLmg+DQorDQorbmFtZXNwYWNlIGxsdm0gew0KK3VzaW5nIG5hbWVzcGFjZSBzeXM7DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLz09PSBXQVJOSU5HOiBJbXBsZW1lbnRhdGlvbiBoZXJlIG11c3QgY29udGFpbiBvbmx5IFdpbjMyIHNwZWNpZmljIGNvZGUuDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitUaW1lVmFsdWUgVGltZVZhbHVlOjpub3coKSB7DQorICB1aW50NjRfdCBmdDsNCisgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKHJlaW50ZXJwcmV0X2Nhc3Q8RklMRVRJTUUgKj4oJmZ0KSk7DQorDQorICBUaW1lVmFsdWUgdCgwLCAwKTsNCisgIHQuZnJvbVdpbjMyVGltZShmdCk7DQorICByZXR1cm4gdDsNCit9DQorDQorc3RkOjpzdHJpbmcgVGltZVZhbHVlOjpzdHIoKSBjb25zdCB7DQorI2lmZGVmIF9fTUlOR1czMl9fDQorICAvLyBUaGlzIGJhbiBtYXkgYmUgbGlmdGVkIGJ5IGVpdGhlcjoNCisgIC8vIChpKSBhIGZ1dHVyZSBNaW5HVyB2ZXJzaW9uIG90aGVyIHRoYW4gMS4wIGluaGVyZW50cyB0aGUgX190aW1lNjRfdCB0eXBlLCBvcg0KKyAgLy8gKGlpKSBjb25maWd1cmUgdGVzdHMgZm9yIGVpdGhlciB0aGUgdGltZV90IG9yIF9fdGltZTY0X3QgdHlwZS4NCisgIHRpbWVfdCBvdXJUaW1lID0gdGltZV90KHRoaXMtPnRvRXBvY2hUaW1lKCkpOw0KKyAgc3RydWN0IHRtICpsdCA9IDo6bG9jYWx0aW1lKCZvdXJUaW1lKTsNCisjZWxzZQ0KKyAgX190aW1lNjRfdCBvdXJUaW1lID0gdGhpcy0+dG9FcG9jaFRpbWUoKTsNCisgIHN0cnVjdCB0bSAqbHQgPSA6Ol9sb2NhbHRpbWU2NCgmb3VyVGltZSk7DQorI2VuZGlmDQorDQorICBjaGFyIGJ1ZmZlclsyNV07DQorICBzdHJmdGltZShidWZmZXIsIDI1LCAiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCBsdCk7DQorICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZmVyKTsNCit9DQorDQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvV2luMzIuaCBiL3NyYy9MTFZNL2xpYi9TeXN0ZW0vV2luMzIvV2luMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjUwNWIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1N5c3RlbS9XaW4zMi9XaW4zMi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vPT09LSBXaW4zMi9XaW4zMi5oIC0gQ29tbW9uIFdpbjMyIEluY2x1ZGUgRmlsZSAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhpbmdzIHNwZWNpZmljIHRvIFdpbjMyIGltcGxlbWVudGF0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy89PT0gV0FSTklORzogSW1wbGVtZW50YXRpb24gaGVyZSBtdXN0IGNvbnRhaW4gb25seSBnZW5lcmljIFdpbjMyIGNvZGUgdGhhdAorLy89PT0gICAgICAgICAgaXMgZ3VhcmFudGVlZCB0byB3b3JrIG9uICphbGwqIFdpbjMyIHZhcmlhbnRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUmVxdWlyZSBhdCBsZWFzdCBXaW5kb3dzIDIwMDAgQVBJLgorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAwCisKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIgICAgIC8vIEdldCBhdXRvY29uZiBjb25maWd1cmF0aW9uIHNldHRpbmdzCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCitpbmxpbmUgYm9vbCBNYWtlRXJyTXNnKHN0ZDo6c3RyaW5nKiBFcnJNc2csIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgpIHsKKyAgaWYgKCFFcnJNc2cpCisgICAgcmV0dXJuIHRydWU7CisgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSfEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgTlVMTCwgR2V0TGFzdEVycm9yKCksIDAsIChMUFNUUikmYnVmZmVyLCAxLCBOVUxMKTsKKyAgKkVyck1zZyA9IHByZWZpeCArIGJ1ZmZlcjsKKyAgTG9jYWxGcmVlKGJ1ZmZlcik7CisgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBBdXRvSGFuZGxlIHsKKyAgSEFORExFIGhhbmRsZTsKKworcHVibGljOgorICBBdXRvSGFuZGxlKEhBTkRMRSBoKSA6IGhhbmRsZShoKSB7fQorCisgIH5BdXRvSGFuZGxlKCkgeworICAgIGlmIChoYW5kbGUpCisgICAgICBDbG9zZUhhbmRsZShoYW5kbGUpOworICB9CisKKyAgb3BlcmF0b3IgSEFORExFKCkgeworICAgIHJldHVybiBoYW5kbGU7CisgIH0KKworICBBdXRvSGFuZGxlICZvcGVyYXRvcj0oSEFORExFIGgpIHsKKyAgICBoYW5kbGUgPSBoOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzNzA2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTS5oCkBAIC0wLDAgKzEsMTIyIEBACisvLz09PS0tIEFSTS5oIC0gVG9wLWxldmVsIGludGVyZmFjZSBmb3IgQVJNIHJlcHJlc2VudGF0aW9uLS0tLSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZW50cnkgcG9pbnRzIGZvciBnbG9iYWwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIExMVk0KKy8vIEFSTSBiYWNrLWVuZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFRBUkdFVF9BUk1fSAorI2RlZmluZSBUQVJHRVRfQVJNX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVJNQmFzZVRhcmdldE1hY2hpbmU7CitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBKSVRDb2RlRW1pdHRlcjsKK2NsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKworLy8gRW51bXMgY29ycmVzcG9uZGluZyB0byBBUk0gY29uZGl0aW9uIGNvZGVzCituYW1lc3BhY2UgQVJNQ0MgeworICAvLyBUaGUgQ29uZENvZGVzIGNvbnN0YW50cyBtYXAgZGlyZWN0bHkgdG8gdGhlIDQtYml0IGVuY29kaW5nIG9mIHRoZQorICAvLyBjb25kaXRpb24gZmllbGQgZm9yIHByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb25zLgorICBlbnVtIENvbmRDb2RlcyB7CisgICAgRVEsCisgICAgTkUsCisgICAgSFMsCisgICAgTE8sCisgICAgTUksCisgICAgUEwsCisgICAgVlMsCisgICAgVkMsCisgICAgSEksCisgICAgTFMsCisgICAgR0UsCisgICAgTFQsCisgICAgR1QsCisgICAgTEUsCisgICAgQUwKKyAgfTsKKworICBpbmxpbmUgc3RhdGljIENvbmRDb2RlcyBnZXRPcHBvc2l0ZUNvbmRpdGlvbihDb25kQ29kZXMgQ0MpIHsKKyAgICBzd2l0Y2ggKENDKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBjb25kaXRpb24gY29kZSIpOworICAgIGNhc2UgRVE6IHJldHVybiBORTsKKyAgICBjYXNlIE5FOiByZXR1cm4gRVE7CisgICAgY2FzZSBIUzogcmV0dXJuIExPOworICAgIGNhc2UgTE86IHJldHVybiBIUzsKKyAgICBjYXNlIE1JOiByZXR1cm4gUEw7CisgICAgY2FzZSBQTDogcmV0dXJuIE1JOworICAgIGNhc2UgVlM6IHJldHVybiBWQzsKKyAgICBjYXNlIFZDOiByZXR1cm4gVlM7CisgICAgY2FzZSBISTogcmV0dXJuIExTOworICAgIGNhc2UgTFM6IHJldHVybiBISTsKKyAgICBjYXNlIEdFOiByZXR1cm4gTFQ7CisgICAgY2FzZSBMVDogcmV0dXJuIEdFOworICAgIGNhc2UgR1Q6IHJldHVybiBMRTsKKyAgICBjYXNlIExFOiByZXR1cm4gR1Q7CisgICAgfQorICB9Cit9IC8vIG5hbWVzcGFjZSBBUk1DQworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKkFSTUNvbmRDb2RlVG9TdHJpbmcoQVJNQ0M6OkNvbmRDb2RlcyBDQykgeworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29uZGl0aW9uIGNvZGUiKTsKKyAgY2FzZSBBUk1DQzo6RVE6ICByZXR1cm4gImVxIjsKKyAgY2FzZSBBUk1DQzo6TkU6ICByZXR1cm4gIm5lIjsKKyAgY2FzZSBBUk1DQzo6SFM6ICByZXR1cm4gImhzIjsKKyAgY2FzZSBBUk1DQzo6TE86ICByZXR1cm4gImxvIjsKKyAgY2FzZSBBUk1DQzo6TUk6ICByZXR1cm4gIm1pIjsKKyAgY2FzZSBBUk1DQzo6UEw6ICByZXR1cm4gInBsIjsKKyAgY2FzZSBBUk1DQzo6VlM6ICByZXR1cm4gInZzIjsKKyAgY2FzZSBBUk1DQzo6VkM6ICByZXR1cm4gInZjIjsKKyAgY2FzZSBBUk1DQzo6SEk6ICByZXR1cm4gImhpIjsKKyAgY2FzZSBBUk1DQzo6TFM6ICByZXR1cm4gImxzIjsKKyAgY2FzZSBBUk1DQzo6R0U6ICByZXR1cm4gImdlIjsKKyAgY2FzZSBBUk1DQzo6TFQ6ICByZXR1cm4gImx0IjsKKyAgY2FzZSBBUk1DQzo6R1Q6ICByZXR1cm4gImd0IjsKKyAgY2FzZSBBUk1DQzo6TEU6ICByZXR1cm4gImxlIjsKKyAgY2FzZSBBUk1DQzo6QUw6ICByZXR1cm4gImFsIjsKKyAgfQorfQorCitGdW5jdGlvblBhc3MgKmNyZWF0ZUFSTUlTZWxEYWcoQVJNQmFzZVRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKworRnVuY3Rpb25QYXNzICpjcmVhdGVBUk1KSVRDb2RlRW1pdHRlclBhc3MoQVJNQmFzZVRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJkpDRSk7CisKK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQVJNTG9hZFN0b3JlT3B0aW1pemF0aW9uUGFzcyhib29sIFByZUFsbG9jID0gZmFsc2UpOworRnVuY3Rpb25QYXNzICpjcmVhdGVBUk1FeHBhbmRQc2V1ZG9QYXNzKCk7CitGdW5jdGlvblBhc3MgKmNyZWF0ZUFSTUdsb2JhbE1lcmdlUGFzcyhjb25zdCBUYXJnZXRMb3dlcmluZyogdGxpKTsKK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQVJNQ29uc3RhbnRJc2xhbmRQYXNzKCk7CitGdW5jdGlvblBhc3MgKmNyZWF0ZU5FT05QcmVBbGxvY1Bhc3MoKTsKK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTkVPTk1vdmVGaXhQYXNzKCk7CitGdW5jdGlvblBhc3MgKmNyZWF0ZVRodW1iMklUQmxvY2tQYXNzKCk7CitGdW5jdGlvblBhc3MgKmNyZWF0ZVRodW1iMlNpemVSZWR1Y3Rpb25QYXNzKCk7CisKK2V4dGVybiBUYXJnZXQgVGhlQVJNVGFyZ2V0LCBUaGVUaHVtYlRhcmdldDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm07CisKKy8vIERlZmluZXMgc3ltYm9saWMgbmFtZXMgZm9yIEFSTSByZWdpc3RlcnMuICBUaGlzIGRlZmluZXMgYSBtYXBwaW5nIGZyb20KKy8vIHJlZ2lzdGVyIG5hbWUgdG8gcmVnaXN0ZXIgbnVtYmVyLgorLy8KKyNpbmNsdWRlICJBUk1HZW5SZWdpc3Rlck5hbWVzLmluYyIKKworLy8gRGVmaW5lcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIEFSTSBpbnN0cnVjdGlvbnMuCisvLworI2luY2x1ZGUgIkFSTUdlbkluc3RyTmFtZXMuaW5jIgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmEyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk0udGQKQEAgLTAsMCArMSwxNjYgQEAKKy8vPT09LSBBUk0udGQgLSBEZXNjcmliZSB0aGUgQVJNIFRhcmdldCBNYWNoaW5lIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8NCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gVGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMgd2hpY2ggd2UgYXJlIGltcGxlbWVudGluZw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQoraW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0LnRkIg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQVJNIFN1YnRhcmdldCBmZWF0dXJlcy4NCisvLw0KKw0KK2RlZiBBcmNoVjRUICAgICA6IFN1YnRhcmdldEZlYXR1cmU8InY0dCIsICJBUk1BcmNoVmVyc2lvbiIsICJWNFQiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFSTSB2NFQiPjsNCitkZWYgQXJjaFY1VCAgICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJ2NXQiLCAiQVJNQXJjaFZlcnNpb24iLCAiVjVUIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUk0gdjVUIj47DQorZGVmIEFyY2hWNVRFICAgIDogU3VidGFyZ2V0RmVhdHVyZTwidjV0ZSIsICJBUk1BcmNoVmVyc2lvbiIsICJWNVRFIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUk0gdjVURSwgdjVURWosIHY1VEV4cCI+Ow0KK2RlZiBBcmNoVjYgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8InY2IiwgIkFSTUFyY2hWZXJzaW9uIiwgIlY2IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUk0gdjYiPjsNCitkZWYgQXJjaFY2VDIgICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJ2NnQyIiwgIkFSTUFyY2hWZXJzaW9uIiwgIlY2VDIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFSTSB2NnQyIj47DQorZGVmIEFyY2hWN0EgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwidjdhIiwgIkFSTUFyY2hWZXJzaW9uIiwgIlY3QSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVJNIHY3QSI+Ow0KK2RlZiBBcmNoVjdNICAgICA6IFN1YnRhcmdldEZlYXR1cmU8InY3bSIsICJBUk1BcmNoVmVyc2lvbiIsICJWN00iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFSTSB2N00iPjsNCitkZWYgRmVhdHVyZVZGUDIgOiBTdWJ0YXJnZXRGZWF0dXJlPCJ2ZnAyIiwgIkFSTUZQVVR5cGUiLCAiVkZQdjIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBWRlAyIGluc3RydWN0aW9ucyI+Ow0KK2RlZiBGZWF0dXJlVkZQMyA6IFN1YnRhcmdldEZlYXR1cmU8InZmcDMiLCAiQVJNRlBVVHlwZSIsICJWRlB2MyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlIFZGUDMgaW5zdHJ1Y3Rpb25zIj47DQorZGVmIEZlYXR1cmVORU9OIDogU3VidGFyZ2V0RmVhdHVyZTwibmVvbiIsICJBUk1GUFVUeXBlIiwgIk5FT04iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBORU9OIGluc3RydWN0aW9ucyI+Ow0KK2RlZiBGZWF0dXJlVGh1bWIyIDogU3VidGFyZ2V0RmVhdHVyZTwidGh1bWIyIiwgIlRodW1iTW9kZSIsICJUaHVtYjIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlIFRodW1iMiBpbnN0cnVjdGlvbnMiPjsNCitkZWYgRmVhdHVyZUZQMTYgICA6IFN1YnRhcmdldEZlYXR1cmU8ImZwMTYiLCAiSGFzRlAxNiIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBoYWxmLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCI+Ow0KK2RlZiBGZWF0dXJlSFdEaXYgIDogU3VidGFyZ2V0RmVhdHVyZTwiaHdkaXYiLCAiSGFzSGFyZHdhcmVEaXZpZGUiLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgZGl2aWRlIGluc3RydWN0aW9ucyI+Ow0KK2RlZiBGZWF0dXJlVDJFeHRyYWN0UGFjazogU3VidGFyZ2V0RmVhdHVyZTwidDJ4dHBrIiwgIkhhc1QyRXh0cmFjdFBhY2siLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBUaHVtYjIgZXh0cmFjdCBhbmQgcGFjayBpbnN0cnVjdGlvbnMiPjsNCitkZWYgRmVhdHVyZVNsb3dGUEJyY2MgOiBTdWJ0YXJnZXRGZWF0dXJlPCJzbG93LWZwLWJyY2MiLCAiU2xvd0ZQQnJjYyIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGUCBjb21wYXJlICsgYnJhbmNoIGlzIHNsb3ciPjsNCisNCisvLyBTb21lIHByb2Nlc3NvcnMgaGF2ZSBtdWx0aXBseS1hY2N1bXVsYXRlIGluc3RydWN0aW9ucyB0aGF0IGRvbid0DQorLy8gcGxheSBuaWNlbHkgd2l0aCBvdGhlciBWRlAgaW5zdHJ1Y3Rpb25zLCBhbmQgaXQncyBnZW5lcmFsbHkgYmV0dGVyDQorLy8gdG8ganVzdCBub3QgdXNlIHRoZW0uDQorLy8gRklYTUU6IEN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IGZsYWdnZWQgZm9yIENvcnRleC1BOC4gSXQgbWF5IGJlIHRydWUgZm9yDQorLy8gb3RoZXJzIGFzIHdlbGwuIFdlIHNob3VsZCBkbyBtb3JlIGJlbmNobWFya2luZyBhbmQgY29uZmlybSBvbmUgd2F5IG9yDQorLy8gdGhlIG90aGVyLg0KK2RlZiBGZWF0dXJlSGFzU2xvd1ZNTHggICA6IFN1YnRhcmdldEZlYXR1cmU8InZtbHgiLCAiU2xvd1ZNTHgiLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzYWJsZSBWRlAgTUFDIGluc3RydWN0aW9ucyI+Ow0KKy8vIFNvbWUgcHJvY2Vzc29ycyBiZW5lZml0IGZyb20gdXNpbmcgTkVPTiBpbnN0cnVjdGlvbnMgZm9yIHNjYWxhcg0KKy8vIHNpbmdsZS1wcmVjaXNpb24gRlAgb3BlcmF0aW9ucy4NCitkZWYgRmVhdHVyZU5FT05Gb3JGUCA6IFN1YnRhcmdldEZlYXR1cmU8Im5lb25mcCIsICJVc2VORU9ORm9yU2luZ2xlUHJlY2lzaW9uRlAiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgTkVPTiBmb3Igc2luZ2xlIHByZWNpc2lvbiBGUCI+Ow0KKw0KKy8vIERpc2FibGUgMzItYml0IHRvIDE2LWJpdCBuYXJyb3dpbmcgZm9yIGV4cGVyaW1lbnRhdGlvbi4NCitkZWYgRmVhdHVyZVByZWYzMkJpdFRodW1iIDogU3VidGFyZ2V0RmVhdHVyZTwiMzJiaXQiLCAiUHJlZjMyQml0VGh1bWIiLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZlciAzMi1iaXQgVGh1bWIgaW5zdHJzIj47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBBUk0gUHJvY2Vzc29ycyBzdXBwb3J0ZWQuDQorLy8NCisNCitpbmNsdWRlICJBUk1TY2hlZHVsZS50ZCINCisNCitjbGFzcyBQcm9jTm9JdGluPHN0cmluZyBOYW1lLCBsaXN0PFN1YnRhcmdldEZlYXR1cmU+IEZlYXR1cmVzPg0KKyA6IFByb2Nlc3NvcjxOYW1lLCBHZW5lcmljSXRpbmVyYXJpZXMsIEZlYXR1cmVzPjsNCisNCisvLyBWNCBQcm9jZXNzb3JzLg0KK2RlZiA6IFByb2NOb0l0aW48ImdlbmVyaWMiLCAgICAgICAgIFtdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm04IiwgICAgICAgICAgICBbXT47DQorZGVmIDogUHJvY05vSXRpbjwiYXJtODEwIiwgICAgICAgICAgW10+Ow0KK2RlZiA6IFByb2NOb0l0aW48InN0cm9uZ2FybSIsICAgICAgIFtdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJzdHJvbmdhcm0xMTAiLCAgICBbXT47DQorZGVmIDogUHJvY05vSXRpbjwic3Ryb25nYXJtMTEwMCIsICAgW10+Ow0KK2RlZiA6IFByb2NOb0l0aW48InN0cm9uZ2FybTExMTAiLCAgIFtdPjsNCisNCisvLyBWNFQgUHJvY2Vzc29ycy4NCitkZWYgOiBQcm9jTm9JdGluPCJhcm03dGRtaSIsICAgICAgICBbQXJjaFY0VF0+Ow0KK2RlZiA6IFByb2NOb0l0aW48ImFybTd0ZG1pLXMiLCAgICAgIFtBcmNoVjRUXT47DQorZGVmIDogUHJvY05vSXRpbjwiYXJtNzEwdCIsICAgICAgICAgW0FyY2hWNFRdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm03MjB0IiwgICAgICAgICBbQXJjaFY0VF0+Ow0KK2RlZiA6IFByb2NOb0l0aW48ImFybTkiLCAgICAgICAgICAgIFtBcmNoVjRUXT47DQorZGVmIDogUHJvY05vSXRpbjwiYXJtOXRkbWkiLCAgICAgICAgW0FyY2hWNFRdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm05MjAiLCAgICAgICAgICBbQXJjaFY0VF0+Ow0KK2RlZiA6IFByb2NOb0l0aW48ImFybTkyMHQiLCAgICAgICAgIFtBcmNoVjRUXT47DQorZGVmIDogUHJvY05vSXRpbjwiYXJtOTIydCIsICAgICAgICAgW0FyY2hWNFRdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm05NDB0IiwgICAgICAgICBbQXJjaFY0VF0+Ow0KK2RlZiA6IFByb2NOb0l0aW48ImVwOTMxMiIsICAgICAgICAgIFtBcmNoVjRUXT47DQorDQorLy8gVjVUIFByb2Nlc3NvcnMuDQorZGVmIDogUHJvY05vSXRpbjwiYXJtMTB0ZG1pIiwgICAgICAgW0FyY2hWNVRdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm0xMDIwdCIsICAgICAgICBbQXJjaFY1VF0+Ow0KKw0KKy8vIFY1VEUgUHJvY2Vzc29ycy4NCitkZWYgOiBQcm9jTm9JdGluPCJhcm05ZSIsICAgICAgICAgICBbQXJjaFY1VEVdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm05MjZlai1zIiwgICAgICBbQXJjaFY1VEVdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm05NDZlLXMiLCAgICAgICBbQXJjaFY1VEVdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm05NjZlLXMiLCAgICAgICBbQXJjaFY1VEVdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm05NjhlLXMiLCAgICAgICBbQXJjaFY1VEVdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm0xMGUiLCAgICAgICAgICBbQXJjaFY1VEVdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm0xMDIwZSIsICAgICAgICBbQXJjaFY1VEVdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJhcm0xMDIyZSIsICAgICAgICBbQXJjaFY1VEVdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJ4c2NhbGUiLCAgICAgICAgICBbQXJjaFY1VEVdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJpd21teHQiLCAgICAgICAgICBbQXJjaFY1VEVdPjsNCisNCisvLyBWNiBQcm9jZXNzb3JzLg0KK2RlZiA6IFByb2Nlc3NvcjwiYXJtMTEzNmotcyIsICAgICAgIEFSTVY2SXRpbmVyYXJpZXMsIFtBcmNoVjZdPjsNCitkZWYgOiBQcm9jZXNzb3I8ImFybTExMzZqZi1zIiwgICAgICBBUk1WNkl0aW5lcmFyaWVzLCBbQXJjaFY2LCBGZWF0dXJlVkZQMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUhhc1Nsb3dWTUx4XT47DQorZGVmIDogUHJvY2Vzc29yPCJhcm0xMTc2anotcyIsICAgICAgQVJNVjZJdGluZXJhcmllcywgW0FyY2hWNl0+Ow0KK2RlZiA6IFByb2Nlc3NvcjwiYXJtMTE3Nmp6Zi1zIiwgICAgIEFSTVY2SXRpbmVyYXJpZXMsIFtBcmNoVjYsIEZlYXR1cmVWRlAyXT47DQorZGVmIDogUHJvY2Vzc29yPCJtcGNvcmVub3ZmcCIsICAgICAgQVJNVjZJdGluZXJhcmllcywgW0FyY2hWNl0+Ow0KK2RlZiA6IFByb2Nlc3NvcjwibXBjb3JlIiwgICAgICAgICAgIEFSTVY2SXRpbmVyYXJpZXMsIFtBcmNoVjYsIEZlYXR1cmVWRlAyXT47DQorDQorLy8gVjZUMiBQcm9jZXNzb3JzLg0KK2RlZiA6IFByb2Nlc3NvcjwiYXJtMTE1NnQyLXMiLCAgICAgQVJNVjZJdGluZXJhcmllcywNCisgICAgICAgICAgICAgICAgIFtBcmNoVjZUMiwgRmVhdHVyZVRodW1iMl0+Ow0KK2RlZiA6IFByb2Nlc3NvcjwiYXJtMTE1NnQyZi1zIiwgICAgQVJNVjZJdGluZXJhcmllcywNCisgICAgICAgICAgICAgICAgIFtBcmNoVjZUMiwgRmVhdHVyZVRodW1iMiwgRmVhdHVyZVZGUDJdPjsNCisNCisvLyBWNyBQcm9jZXNzb3JzLg0KK2RlZiA6IFByb2Nlc3NvcjwiY29ydGV4LWE4IiwgICAgICAgIENvcnRleEE4SXRpbmVyYXJpZXMsDQorICAgICAgICAgICAgICAgIFtBcmNoVjdBLCBGZWF0dXJlVGh1bWIyLCBGZWF0dXJlTkVPTiwgRmVhdHVyZUhhc1Nsb3dWTUx4LA0KKyAgICAgICAgICAgICAgICAgRmVhdHVyZVNsb3dGUEJyY2MsIEZlYXR1cmVORU9ORm9yRlAsIEZlYXR1cmVUMkV4dHJhY3RQYWNrXT47DQorZGVmIDogUHJvY2Vzc29yPCJjb3J0ZXgtYTkiLCAgICAgICAgQ29ydGV4QTlJdGluZXJhcmllcywNCisgICAgICAgICAgICAgICAgW0FyY2hWN0EsIEZlYXR1cmVUaHVtYjIsIEZlYXR1cmVORU9OLCBGZWF0dXJlVDJFeHRyYWN0UGFja10+Ow0KK2RlZiA6IFByb2NOb0l0aW48ImNvcnRleC1tMyIsICAgICAgIFtBcmNoVjdNLCBGZWF0dXJlVGh1bWIyLCBGZWF0dXJlSFdEaXZdPjsNCitkZWYgOiBQcm9jTm9JdGluPCJjb3J0ZXgtbTQiLCAgICAgICBbQXJjaFY3TSwgRmVhdHVyZVRodW1iMiwgRmVhdHVyZUhXRGl2XT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBSZWdpc3RlciBGaWxlIERlc2NyaXB0aW9uDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitpbmNsdWRlICJBUk1SZWdpc3RlckluZm8udGQiDQorDQoraW5jbHVkZSAiQVJNQ2FsbGluZ0NvbnYudGQiDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBJbnN0cnVjdGlvbiBEZXNjcmlwdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIkFSTUluc3RySW5mby50ZCINCisNCitkZWYgQVJNSW5zdHJJbmZvIDogSW5zdHJJbmZvOw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRGVjbGFyZSB0aGUgdGFyZ2V0IHdoaWNoIHdlIGFyZSBpbXBsZW1lbnRpbmcNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2RlZiBBUk0gOiBUYXJnZXQgew0KKyAgLy8gUHVsbCBpbiBJbnN0cnVjdGlvbiBJbmZvOg0KKyAgbGV0IEluc3RydWN0aW9uU2V0ID0gQVJNSW5zdHJJbmZvOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1BZGRyZXNzaW5nTW9kZXMuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUFkZHJlc3NpbmdNb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTEzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1BZGRyZXNzaW5nTW9kZXMuaApAQCAtMCwwICsxLDU5MSBAQAorLy89PT0tIEFSTUFkZHJlc3NpbmdNb2Rlcy5oIC0gQVJNIEFkZHJlc3NpbmcgTW9kZXMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFSTSBhZGRyZXNzaW5nIG1vZGUgaW1wbGVtZW50YXRpb24gc3R1ZmYuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9BUk1fQVJNQUREUkVTU0lOR01PREVTX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfQVJNX0FSTUFERFJFU1NJTkdNT0RFU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHTm9kZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEFSTV9BTSAtIEFSTSBBZGRyZXNzaW5nIE1vZGUgU3R1ZmYKK25hbWVzcGFjZSBBUk1fQU0geworICBlbnVtIFNoaWZ0T3BjIHsKKyAgICBub19zaGlmdCA9IDAsCisgICAgYXNyLAorICAgIGxzbCwKKyAgICBsc3IsCisgICAgcm9yLAorICAgIHJyeAorICB9OworCisgIGVudW0gQWRkck9wYyB7CisgICAgYWRkID0gJysnLCBzdWIgPSAnLScKKyAgfTsKKworICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmdldEFkZHJPcGNTdHIoQWRkck9wYyBPcCkgeworICAgIHJldHVybiBPcCA9PSBzdWIgPyAiLSIgOiAiIjsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZ2V0U2hpZnRPcGNTdHIoU2hpZnRPcGMgT3ApIHsKKyAgICBzd2l0Y2ggKE9wKSB7CisgICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gc2hpZnQgb3BjISIpOworICAgIGNhc2UgQVJNX0FNOjphc3I6IHJldHVybiAiYXNyIjsKKyAgICBjYXNlIEFSTV9BTTo6bHNsOiByZXR1cm4gImxzbCI7CisgICAgY2FzZSBBUk1fQU06OmxzcjogcmV0dXJuICJsc3IiOworICAgIGNhc2UgQVJNX0FNOjpyb3I6IHJldHVybiAicm9yIjsKKyAgICBjYXNlIEFSTV9BTTo6cnJ4OiByZXR1cm4gInJyeCI7CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSBTaGlmdE9wYyBnZXRTaGlmdE9wY0Zvck5vZGUoU0RWYWx1ZSBOKSB7CisgICAgc3dpdGNoIChOLmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogICAgICAgICAgcmV0dXJuIEFSTV9BTTo6bm9fc2hpZnQ7CisgICAgY2FzZSBJU0Q6OlNITDogICAgcmV0dXJuIEFSTV9BTTo6bHNsOworICAgIGNhc2UgSVNEOjpTUkw6ICAgIHJldHVybiBBUk1fQU06OmxzcjsKKyAgICBjYXNlIElTRDo6U1JBOiAgICByZXR1cm4gQVJNX0FNOjphc3I7CisgICAgY2FzZSBJU0Q6OlJPVFI6ICAgcmV0dXJuIEFSTV9BTTo6cm9yOworICAgIC8vY2FzZSBJU0Q6OlJPVEw6ICAvLyBPbmx5IGlmIGltbSAtPiB0dXJuIGludG8gUk9UUi4KKyAgICAvLyBDYW4ndCBoYW5kbGUgUlJYIGhlcmUsIGJlY2F1c2UgaXQgd291bGQgcmVxdWlyZSBmb2xkaW5nIGEgZmxhZyBpbnRvCisgICAgLy8gdGhlIGFkZHJlc3NpbmcgbW9kZS4gIDooICBUaGlzIGNhdXNlcyB1cyB0byBtaXNzIGNlcnRhaW4gdGhpbmdzLgorICAgIC8vY2FzZSBBUk1JU0Q6OlJSWDogcmV0dXJuIEFSTV9BTTo6cnJ4OworICAgIH0KKyAgfQorCisgIGVudW0gQU1TdWJNb2RlIHsKKyAgICBiYWRfYW1fc3VibW9kZSA9IDAsCisgICAgaWEsCisgICAgaWIsCisgICAgZGEsCisgICAgZGIKKyAgfTsKKworICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmdldEFNU3ViTW9kZVN0cihBTVN1Yk1vZGUgTW9kZSkgeworICAgIHN3aXRjaCAoTW9kZSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIGFkZHJlc3Npbmcgc3ViLW1vZGUhIik7CisgICAgY2FzZSBBUk1fQU06OmlhOiByZXR1cm4gImlhIjsKKyAgICBjYXNlIEFSTV9BTTo6aWI6IHJldHVybiAiaWIiOworICAgIGNhc2UgQVJNX0FNOjpkYTogcmV0dXJuICJkYSI7CisgICAgY2FzZSBBUk1fQU06OmRiOiByZXR1cm4gImRiIjsKKyAgICB9CisgIH0KKworICAvLy8gcm90cjMyIC0gUm90YXRlIGEgMzItYml0IHVuc2lnbmVkIHZhbHVlIHJpZ2h0IGJ5IGEgc3BlY2lmaWVkICMgYml0cy4KKyAgLy8vCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgcm90cjMyKHVuc2lnbmVkIFZhbCwgdW5zaWduZWQgQW10KSB7CisgICAgYXNzZXJ0KEFtdCA8IDMyICYmICJJbnZhbGlkIHJvdGF0ZSBhbW91bnQiKTsKKyAgICByZXR1cm4gKFZhbCA+PiBBbXQpIHwgKFZhbCA8PCAoKDMyLUFtdCkmMzEpKTsKKyAgfQorCisgIC8vLyByb3RsMzIgLSBSb3RhdGUgYSAzMi1iaXQgdW5zaWduZWQgdmFsdWUgbGVmdCBieSBhIHNwZWNpZmllZCAjIGJpdHMuCisgIC8vLworICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHJvdGwzMih1bnNpZ25lZCBWYWwsIHVuc2lnbmVkIEFtdCkgeworICAgIGFzc2VydChBbXQgPCAzMiAmJiAiSW52YWxpZCByb3RhdGUgYW1vdW50Iik7CisgICAgcmV0dXJuIChWYWwgPDwgQW10KSB8IChWYWwgPj4gKCgzMi1BbXQpJjMxKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQWRkcmVzc2luZyBNb2RlICMxOiBzaGlmdF9vcGVyYW5kIHdpdGggcmVnaXN0ZXJzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBUaGlzICdhZGRyZXNzaW5nIG1vZGUnIGlzIHVzZWQgZm9yIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zLiAgSXQgY2FuCisgIC8vIHJlcHJlc2VudCB0aGluZ3MgbGlrZToKKyAgLy8gICByZWcKKyAgLy8gICByZWcgW2Fzcnxsc2x8bHNyfHJvcnxycnhdIHJlZworICAvLyAgIHJlZyBbYXNyfGxzbHxsc3J8cm9yfHJyeF0gaW1tCisgIC8vCisgIC8vIFRoaXMgaXMgc3RvcmVkIHRocmVlIG9wZXJhbmRzIFtyZWdhLCByZWdiLCBvcGNdLiAgVGhlIGZpcnN0IGlzIHRoZSBiYXNlCisgIC8vIHJlZywgdGhlIHNlY29uZCBpcyB0aGUgc2hpZnQgYW1vdW50IChvciByZWcwIGlmIG5vdCBwcmVzZW50IG9yIGltbSkuICBUaGUKKyAgLy8gdGhpcmQgb3BlcmFuZCBlbmNvZGVzIHRoZSBzaGlmdCBvcGNvZGUgYW5kIHRoZSBpbW0gaWYgYSByZWcgaXNuJ3QgcHJlc2VudC4KKyAgLy8KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRTT1JlZ09wYyhTaGlmdE9wYyBTaE9wLCB1bnNpZ25lZCBJbW0pIHsKKyAgICByZXR1cm4gU2hPcCB8IChJbW0gPDwgMyk7CisgIH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRTT1JlZ09mZnNldCh1bnNpZ25lZCBPcCkgeworICAgIHJldHVybiBPcCA+PiAzOworICB9CisgIHN0YXRpYyBpbmxpbmUgU2hpZnRPcGMgZ2V0U09SZWdTaE9wKHVuc2lnbmVkIE9wKSB7CisgICAgcmV0dXJuIChTaGlmdE9wYykoT3AgJiA3KTsKKyAgfQorCisgIC8vLyBnZXRTT0ltbVZhbEltbSAtIEdpdmVuIGFuIGVuY29kZWQgaW1tIGZpZWxkIGZvciB0aGUgcmVnL2ltbSBmb3JtLCByZXR1cm4KKyAgLy8vIHRoZSA4LWJpdCBpbW0gdmFsdWUuCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0U09JbW1WYWxJbW0odW5zaWduZWQgSW1tKSB7CisgICAgcmV0dXJuIEltbSAmIDB4RkY7CisgIH0KKyAgLy8vIGdldFNPSW1tVmFsUm90IC0gR2l2ZW4gYW4gZW5jb2RlZCBpbW0gZmllbGQgZm9yIHRoZSByZWcvaW1tIGZvcm0sIHJldHVybgorICAvLy8gdGhlIHJvdGF0ZSBhbW91bnQuCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0U09JbW1WYWxSb3QodW5zaWduZWQgSW1tKSB7CisgICAgcmV0dXJuIChJbW0gPj4gOCkgKiAyOworICB9CisKKyAgLy8vIGdldFNPSW1tVmFsUm90YXRlIC0gVHJ5IHRvIGhhbmRsZSBJbW0gd2l0aCBhbiBpbW1lZGlhdGUgc2hpZnRlciBvcGVyYW5kLAorICAvLy8gY29tcHV0aW5nIHRoZSByb3RhdGUgYW1vdW50IHRvIHVzZS4gIElmIHRoaXMgaW1tZWRpYXRlIHZhbHVlIGNhbm5vdCBiZQorICAvLy8gaGFuZGxlZCB3aXRoIGEgc2luZ2xlIHNoaWZ0ZXItb3AsIGRldGVybWluZSBhIGdvb2Qgcm90YXRlIGFtb3VudCB0aGF0IHdpbGwKKyAgLy8vIHRha2UgYSBtYXhpbWFsIGNodW5rIG9mIGJpdHMgb3V0IG9mIHRoZSBpbW1lZGlhdGUuCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0U09JbW1WYWxSb3RhdGUodW5zaWduZWQgSW1tKSB7CisgICAgLy8gOC1iaXQgKG9yIGxlc3MpIGltbWVkaWF0ZXMgYXJlIHRyaXZpYWxseSBzaGlmdGVyX29wZXJhbmRzIHdpdGggYSByb3RhdGUKKyAgICAvLyBvZiB6ZXJvLgorICAgIGlmICgoSW1tICYgfjI1NVUpID09IDApIHJldHVybiAwOworCisgICAgLy8gVXNlIENUWiB0byBjb21wdXRlIHRoZSByb3RhdGUgYW1vdW50LgorICAgIHVuc2lnbmVkIFRaID0gQ291bnRUcmFpbGluZ1plcm9zXzMyKEltbSk7CisKKyAgICAvLyBSb3RhdGUgYW1vdW50IG11c3QgYmUgZXZlbi4gIFNvbWV0aGluZyBsaWtlIDB4MjAwIG11c3QgYmUgcm90YXRlZCA4IGJpdHMsCisgICAgLy8gbm90IDkuCisgICAgdW5zaWduZWQgUm90QW10ID0gVFogJiB+MTsKKworICAgIC8vIElmIHdlIGNhbiBoYW5kbGUgdGhpcyBzcHJlYWQsIHJldHVybiBpdC4KKyAgICBpZiAoKHJvdHIzMihJbW0sIFJvdEFtdCkgJiB+MjU1VSkgPT0gMCkKKyAgICAgIHJldHVybiAoMzItUm90QW10KSYzMTsgIC8vIEhXIHJvdGF0ZXMgcmlnaHQsIG5vdCBsZWZ0LgorCisgICAgLy8gRm9yIHZhbHVlcyBsaWtlIDB4RjAwMDAwMEYsIHdlIHNob3VsZCBpZ25vcmUgdGhlIGxvdyA2IGJpdHMsIHRoZW4KKyAgICAvLyByZXRyeSB0aGUgaHVudC4KKyAgICBpZiAoSW1tICYgNjNVKSB7CisgICAgICB1bnNpZ25lZCBUWjIgPSBDb3VudFRyYWlsaW5nWmVyb3NfMzIoSW1tICYgfjYzVSk7CisgICAgICB1bnNpZ25lZCBSb3RBbXQyID0gVFoyICYgfjE7CisgICAgICBpZiAoKHJvdHIzMihJbW0sIFJvdEFtdDIpICYgfjI1NVUpID09IDApCisgICAgICAgIHJldHVybiAoMzItUm90QW10MikmMzE7ICAvLyBIVyByb3RhdGVzIHJpZ2h0LCBub3QgbGVmdC4KKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgbm8gd2F5IHRvIGNvdmVyIHRoaXMgc3BhbiBvZiBiaXRzIHdpdGggYSBzaW5nbGUKKyAgICAvLyBzaGlmdGVyX29wIGltbWVkaWF0ZS4gIFJldHVybiBhIGNodW5rIG9mIGJpdHMgdGhhdCB3aWxsIGJlIHVzZWZ1bCB0bworICAgIC8vIGhhbmRsZS4KKyAgICByZXR1cm4gKDMyLVJvdEFtdCkmMzE7ICAvLyBIVyByb3RhdGVzIHJpZ2h0LCBub3QgbGVmdC4KKyAgfQorCisgIC8vLyBnZXRTT0ltbVZhbCAtIEdpdmVuIGEgMzItYml0IGltbWVkaWF0ZSwgaWYgaXQgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGZpdAorICAvLy8gaW50byBhbiBzaGlmdGVyX29wZXJhbmQgaW1tZWRpYXRlIG9wZXJhbmQsIHJldHVybiB0aGUgMTItYml0IGVuY29kaW5nIGZvcgorICAvLy8gaXQuICBJZiBub3QsIHJldHVybiAtMS4KKyAgc3RhdGljIGlubGluZSBpbnQgZ2V0U09JbW1WYWwodW5zaWduZWQgQXJnKSB7CisgICAgLy8gOC1iaXQgKG9yIGxlc3MpIGltbWVkaWF0ZXMgYXJlIHRyaXZpYWxseSBzaGlmdGVyX29wZXJhbmRzIHdpdGggYSByb3RhdGUKKyAgICAvLyBvZiB6ZXJvLgorICAgIGlmICgoQXJnICYgfjI1NVUpID09IDApIHJldHVybiBBcmc7CisKKyAgICB1bnNpZ25lZCBSb3RBbXQgPSBnZXRTT0ltbVZhbFJvdGF0ZShBcmcpOworCisgICAgLy8gSWYgdGhpcyBjYW5ub3QgYmUgaGFuZGxlZCB3aXRoIGEgc2luZ2xlIHNoaWZ0ZXJfb3AsIGJhaWwgb3V0LgorICAgIGlmIChyb3RyMzIofjI1NVUsIFJvdEFtdCkgJiBBcmcpCisgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBFbmNvZGUgdGhpcyBjb3JyZWN0bHkuCisgICAgcmV0dXJuIHJvdGwzMihBcmcsIFJvdEFtdCkgfCAoKFJvdEFtdD4+MSkgPDwgOCk7CisgIH0KKworICAvLy8gaXNTT0ltbVR3b1BhcnRWYWwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieQorICAvLy8gb3InaW5nIHRvZ2V0aGVyIHR3byBTT0ltbVZhbCdzLgorICBzdGF0aWMgaW5saW5lIGJvb2wgaXNTT0ltbVR3b1BhcnRWYWwodW5zaWduZWQgVikgeworICAgIC8vIElmIHRoaXMgY2FuIGJlIGhhbmRsZWQgd2l0aCBhIHNpbmdsZSBzaGlmdGVyX29wLCBiYWlsIG91dC4KKyAgICBWID0gcm90cjMyKH4yNTVVLCBnZXRTT0ltbVZhbFJvdGF0ZShWKSkgJiBWOworICAgIGlmIChWID09IDApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB0aGlzIGNhbiBiZSBoYW5kbGVkIHdpdGggdHdvIHNoaWZ0ZXJfb3AncywgYWNjZXB0LgorICAgIFYgPSByb3RyMzIofjI1NVUsIGdldFNPSW1tVmFsUm90YXRlKFYpKSAmIFY7CisgICAgcmV0dXJuIFYgPT0gMDsKKyAgfQorCisgIC8vLyBnZXRTT0ltbVR3b1BhcnRGaXJzdCAtIElmIFYgaXMgYSB2YWx1ZSB0aGF0IHNhdGlzZmllcyBpc1NPSW1tVHdvUGFydFZhbCwKKyAgLy8vIHJldHVybiB0aGUgZmlyc3QgY2h1bmsgb2YgaXQuCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0U09JbW1Ud29QYXJ0Rmlyc3QodW5zaWduZWQgVikgeworICAgIHJldHVybiByb3RyMzIoMjU1VSwgZ2V0U09JbW1WYWxSb3RhdGUoVikpICYgVjsKKyAgfQorCisgIC8vLyBnZXRTT0ltbVR3b1BhcnRTZWNvbmQgLSBJZiBWIGlzIGEgdmFsdWUgdGhhdCBzYXRpc2ZpZXMgaXNTT0ltbVR3b1BhcnRWYWwsCisgIC8vLyByZXR1cm4gdGhlIHNlY29uZCBjaHVuayBvZiBpdC4KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRTT0ltbVR3b1BhcnRTZWNvbmQodW5zaWduZWQgVikgeworICAgIC8vIE1hc2sgb3V0IHRoZSBmaXJzdCBodW5rLgorICAgIFYgPSByb3RyMzIofjI1NVUsIGdldFNPSW1tVmFsUm90YXRlKFYpKSAmIFY7CisKKyAgICAvLyBUYWtlIHdoYXQncyBsZWZ0LgorICAgIGFzc2VydChWID09IChyb3RyMzIoMjU1VSwgZ2V0U09JbW1WYWxSb3RhdGUoVikpICYgVikpOworICAgIHJldHVybiBWOworICB9CisKKyAgLy8vIGdldFRodW1iSW1tVmFsU2hpZnQgLSBUcnkgdG8gaGFuZGxlIEltbSB3aXRoIGEgOC1iaXQgaW1tZWRpYXRlIGZvbGxvd2VkCisgIC8vLyBieSBhIGxlZnQgc2hpZnQuIFJldHVybnMgdGhlIHNoaWZ0IGFtb3VudCB0byB1c2UuCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0VGh1bWJJbW1WYWxTaGlmdCh1bnNpZ25lZCBJbW0pIHsKKyAgICAvLyA4LWJpdCAob3IgbGVzcykgaW1tZWRpYXRlcyBhcmUgdHJpdmlhbGx5IGltbWVkaWF0ZSBvcGVyYW5kIHdpdGggYSBzaGlmdAorICAgIC8vIG9mIHplcm8uCisgICAgaWYgKChJbW0gJiB+MjU1VSkgPT0gMCkgcmV0dXJuIDA7CisKKyAgICAvLyBVc2UgQ1RaIHRvIGNvbXB1dGUgdGhlIHNoaWZ0IGFtb3VudC4KKyAgICByZXR1cm4gQ291bnRUcmFpbGluZ1plcm9zXzMyKEltbSk7CisgIH0KKworICAvLy8gaXNUaHVtYkltbVNoaWZ0ZWRWYWwgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGNhbiBiZSBvYnRhaW5lZAorICAvLy8gYnkgbGVmdCBzaGlmdGluZyBhIDgtYml0IGltbWVkaWF0ZS4KKyAgc3RhdGljIGlubGluZSBib29sIGlzVGh1bWJJbW1TaGlmdGVkVmFsKHVuc2lnbmVkIFYpIHsKKyAgICAvLyBJZiB0aGlzIGNhbiBiZSBoYW5kbGVkIHdpdGgKKyAgICBWID0gKH4yNTVVIDw8IGdldFRodW1iSW1tVmFsU2hpZnQoVikpICYgVjsKKyAgICByZXR1cm4gViA9PSAwOworICB9CisKKyAgLy8vIGdldFRodW1iSW1tMTZWYWxTaGlmdCAtIFRyeSB0byBoYW5kbGUgSW1tIHdpdGggYSAxNi1iaXQgaW1tZWRpYXRlIGZvbGxvd2VkCisgIC8vLyBieSBhIGxlZnQgc2hpZnQuIFJldHVybnMgdGhlIHNoaWZ0IGFtb3VudCB0byB1c2UuCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0VGh1bWJJbW0xNlZhbFNoaWZ0KHVuc2lnbmVkIEltbSkgeworICAgIC8vIDE2LWJpdCAob3IgbGVzcykgaW1tZWRpYXRlcyBhcmUgdHJpdmlhbGx5IGltbWVkaWF0ZSBvcGVyYW5kIHdpdGggYSBzaGlmdAorICAgIC8vIG9mIHplcm8uCisgICAgaWYgKChJbW0gJiB+NjU1MzVVKSA9PSAwKSByZXR1cm4gMDsKKworICAgIC8vIFVzZSBDVFogdG8gY29tcHV0ZSB0aGUgc2hpZnQgYW1vdW50LgorICAgIHJldHVybiBDb3VudFRyYWlsaW5nWmVyb3NfMzIoSW1tKTsKKyAgfQorCisgIC8vLyBpc1RodW1iSW1tMTZTaGlmdGVkVmFsIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBjYW4gYmUKKyAgLy8vIG9idGFpbmVkIGJ5IGxlZnQgc2hpZnRpbmcgYSAxNi1iaXQgaW1tZWRpYXRlLgorICBzdGF0aWMgaW5saW5lIGJvb2wgaXNUaHVtYkltbTE2U2hpZnRlZFZhbCh1bnNpZ25lZCBWKSB7CisgICAgLy8gSWYgdGhpcyBjYW4gYmUgaGFuZGxlZCB3aXRoCisgICAgViA9ICh+NjU1MzVVIDw8IGdldFRodW1iSW1tMTZWYWxTaGlmdChWKSkgJiBWOworICAgIHJldHVybiBWID09IDA7CisgIH0KKworICAvLy8gZ2V0VGh1bWJJbW1Ob25TaGlmdGVkVmFsIC0gSWYgViBpcyBhIHZhbHVlIHRoYXQgc2F0aXNmaWVzCisgIC8vLyBpc1RodW1iSW1tU2hpZnRlZFZhbCwgcmV0dXJuIHRoZSBub24tc2hpZnRkIHZhbHVlLgorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFRodW1iSW1tTm9uU2hpZnRlZFZhbCh1bnNpZ25lZCBWKSB7CisgICAgcmV0dXJuIFYgPj4gZ2V0VGh1bWJJbW1WYWxTaGlmdChWKTsKKyAgfQorCisKKyAgLy8vIGdldFQyU09JbW1WYWxTcGxhdCAtIFJldHVybiB0aGUgMTItYml0IGVuY29kZWQgcmVwcmVzZW50YXRpb24KKyAgLy8vIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHNwbGF0dGluZyB0aGUgbG93IDggYml0cworICAvLy8gaW50byBldmVyeSBvdGhlciBieXRlIG9yIGV2ZXJ5IGJ5dGUgb2YgYSAzMi1iaXQgdmFsdWUuIGkuZS4sCisgIC8vLyAgICAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgYWJjZGVmZ2ggICAgY29udHJvbCA9IDAKKyAgLy8vICAgICAwMDAwMDAwMCBhYmNkZWZnaCAwMDAwMDAwMCBhYmNkZWZnaCAgICBjb250cm9sID0gMQorICAvLy8gICAgIGFiY2RlZmdoIDAwMDAwMDAwIGFiY2RlZmdoIDAwMDAwMDAwICAgIGNvbnRyb2wgPSAyCisgIC8vLyAgICAgYWJjZGVmZ2ggYWJjZGVmZ2ggYWJjZGVmZ2ggYWJjZGVmZ2ggICAgY29udHJvbCA9IDMKKyAgLy8vIFJldHVybiAtMSBpZiBub25lIG9mIHRoZSBhYm92ZSBhcHBseS4KKyAgLy8vIFNlZSBBUk0gUmVmZXJlbmNlIE1hbnVhbCBBNi4zLjIuCisgIHN0YXRpYyBpbmxpbmUgaW50IGdldFQyU09JbW1WYWxTcGxhdFZhbCh1bnNpZ25lZCBWKSB7CisgICAgdW5zaWduZWQgdSwgVnMsIEltbTsKKyAgICAvLyBjb250cm9sID0gMAorICAgIGlmICgoViAmIDB4ZmZmZmZmMDApID09IDApCisgICAgICByZXR1cm4gVjsKKworICAgIC8vIElmIHRoZSB2YWx1ZSBpcyB6ZXJvZXMgaW4gdGhlIGZpcnN0IGJ5dGUsIGp1c3Qgc2hpZnQgdGhvc2Ugb2ZmCisgICAgVnMgPSAoKFYgJiAweGZmKSA9PSAwKSA/IFYgPj4gOCA6IFY7CisgICAgLy8gQW55IHBhc3NpbmcgdmFsdWUgb25seSBoYXMgOCBiaXRzIG9mIHBheWxvYWQsIHNwbGF0dGVkIGFjcm9zcyB0aGUgd29yZAorICAgIEltbSA9IFZzICYgMHhmZjsKKyAgICAvLyBMaWtld2lzZSwgYW55IHBhc3NpbmcgdmFsdWVzIGhhdmUgdGhlIHBheWxvYWQgc3BsYXR0ZWQgaW50byB0aGUgM3JkIGJ5dGUKKyAgICB1ID0gSW1tIHwgKEltbSA8PCAxNik7CisKKyAgICAvLyBjb250cm9sID0gMSBvciAyCisgICAgaWYgKFZzID09IHUpCisgICAgICByZXR1cm4gKCgoVnMgPT0gVikgPyAxIDogMikgPDwgOCkgfCBJbW07CisKKyAgICAvLyBjb250cm9sID0gMworICAgIGlmIChWcyA9PSAodSB8ICh1IDw8IDgpKSkKKyAgICAgIHJldHVybiAoMyA8PCA4KSB8IEltbTsKKworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBnZXRUMlNPSW1tVmFsUm90YXRlVmFsIC0gUmV0dXJuIHRoZSAxMi1iaXQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBpZiB0aGUKKyAgLy8vIHNwZWNpZmllZCB2YWx1ZSBpcyBhIHJvdGF0ZWQgOC1iaXQgdmFsdWUuIFJldHVybiAtMSBpZiBubyByb3RhdGlvbgorICAvLy8gZW5jb2RpbmcgaXMgcG9zc2libGUuCisgIC8vLyBTZWUgQVJNIFJlZmVyZW5jZSBNYW51YWwgQTYuMy4yLgorICBzdGF0aWMgaW5saW5lIGludCBnZXRUMlNPSW1tVmFsUm90YXRlVmFsKHVuc2lnbmVkIFYpIHsKKyAgICB1bnNpZ25lZCBSb3RBbXQgPSBDb3VudExlYWRpbmdaZXJvc18zMihWKTsKKyAgICBpZiAoUm90QW10ID49IDI0KQorICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gSWYgJ0FyZycgY2FuIGJlIGhhbmRsZWQgd2l0aCBhIHNpbmdsZSBzaGlmdGVyX29wIHJldHVybiB0aGUgdmFsdWUuCisgICAgaWYgKChyb3RyMzIoMHhmZjAwMDAwMFUsIFJvdEFtdCkgJiBWKSA9PSBWKQorICAgICAgcmV0dXJuIChyb3RyMzIoViwgMjQgLSBSb3RBbXQpICYgMHg3ZikgfCAoKFJvdEFtdCArIDgpIDw8IDcpOworCisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8vIGdldFQyU09JbW1WYWwgLSBHaXZlbiBhIDMyLWJpdCBpbW1lZGlhdGUsIGlmIGl0IGlzIHNvbWV0aGluZyB0aGF0IGNhbiBmaXQKKyAgLy8vIGludG8gYSBUaHVtYi0yIHNoaWZ0ZXJfb3BlcmFuZCBpbW1lZGlhdGUgb3BlcmFuZCwgcmV0dXJuIHRoZSAxMi1iaXQKKyAgLy8vIGVuY29kaW5nIGZvciBpdC4gIElmIG5vdCwgcmV0dXJuIC0xLgorICAvLy8gU2VlIEFSTSBSZWZlcmVuY2UgTWFudWFsIEE2LjMuMi4KKyAgc3RhdGljIGlubGluZSBpbnQgZ2V0VDJTT0ltbVZhbCh1bnNpZ25lZCBBcmcpIHsKKyAgICAvLyBJZiAnQXJnJyBpcyBhbiA4LWJpdCBzcGxhdCwgdGhlbiBnZXQgdGhlIGVuY29kZWQgdmFsdWUuCisgICAgaW50IFNwbGF0ID0gZ2V0VDJTT0ltbVZhbFNwbGF0VmFsKEFyZyk7CisgICAgaWYgKFNwbGF0ICE9IC0xKQorICAgICAgcmV0dXJuIFNwbGF0OworCisgICAgLy8gSWYgJ0FyZycgY2FuIGJlIGhhbmRsZWQgd2l0aCBhIHNpbmdsZSBzaGlmdGVyX29wIHJldHVybiB0aGUgdmFsdWUuCisgICAgaW50IFJvdCA9IGdldFQyU09JbW1WYWxSb3RhdGVWYWwoQXJnKTsKKyAgICBpZiAoUm90ICE9IC0xKQorICAgICAgcmV0dXJuIFJvdDsKKworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0VDJTT0ltbVZhbFJvdGF0ZSh1bnNpZ25lZCBWKSB7CisgICAgaWYgKChWICYgfjI1NVUpID09IDApIHJldHVybiAwOworICAgIC8vIFVzZSBDVFogdG8gY29tcHV0ZSB0aGUgcm90YXRlIGFtb3VudC4KKyAgICB1bnNpZ25lZCBSb3RBbXQgPSBDb3VudFRyYWlsaW5nWmVyb3NfMzIoVik7CisgICAgcmV0dXJuICgzMiAtIFJvdEFtdCkgJiAzMTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1QyU09JbW1Ud29QYXJ0VmFsICh1bnNpZ25lZCBJbW0pIHsKKyAgICB1bnNpZ25lZCBWID0gSW1tOworICAgIC8vIFBhc3NpbmcgdmFsdWVzIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2Ygc3BsYXQgdmFsdWVzIGFuZCBzaGlmdGVyCisgICAgLy8gdmFsdWVzLiBJZiB0aGlzIGNhbiBiZSBoYW5kbGVkIHdpdGggYSBzaW5nbGUgc2hpZnRlciBvciBzcGxhdCwgYmFpbAorICAgIC8vIG91dC4gVGhvc2Ugc2hvdWxkIGJlIGhhbmRsZWQgZGlyZWN0bHksIG5vdCB3aXRoIGEgdHdvLXBhcnQgdmFsLgorICAgIGlmIChnZXRUMlNPSW1tVmFsU3BsYXRWYWwoVikgIT0gLTEpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgViA9IHJvdHIzMiAofjI1NVUsIGdldFQyU09JbW1WYWxSb3RhdGUoVikpICYgVjsKKyAgICBpZiAoViA9PSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhpcyBjYW4gYmUgaGFuZGxlZCBhcyBhbiBpbW1lZGlhdGUsIGFjY2VwdC4KKyAgICBpZiAoZ2V0VDJTT0ltbVZhbChWKSAhPSAtMSkgcmV0dXJuIHRydWU7CisKKyAgICAvLyBMaWtld2lzZSwgdHJ5IG1hc2tpbmcgb3V0IGEgc3BsYXQgdmFsdWUgZmlyc3QuCisgICAgViA9IEltbTsKKyAgICBpZiAoZ2V0VDJTT0ltbVZhbFNwbGF0VmFsKFYgJiAweGZmMDBmZjAwVSkgIT0gLTEpCisgICAgICBWICY9IH4weGZmMDBmZjAwVTsKKyAgICBlbHNlIGlmIChnZXRUMlNPSW1tVmFsU3BsYXRWYWwoViAmIDB4MDBmZjAwZmZVKSAhPSAtMSkKKyAgICAgIFYgJj0gfjB4MDBmZjAwZmZVOworICAgIC8vIElmIHdoYXQncyBsZWZ0IGNhbiBiZSBoYW5kbGVkIGFzIGFuIGltbWVkaWF0ZSwgYWNjZXB0LgorICAgIGlmIChnZXRUMlNPSW1tVmFsKFYpICE9IC0xKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE90aGVyd2lzZSwgZG8gbm90IGFjY2VwdC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFQyU09JbW1Ud29QYXJ0Rmlyc3QodW5zaWduZWQgSW1tKSB7CisgICAgYXNzZXJ0IChpc1QyU09JbW1Ud29QYXJ0VmFsKEltbSkgJiYKKyAgICAgICAgICAgICJJbW1lZGF0ZSBjYW5ub3QgYmUgZW5jb2RlZCBhcyB0d28gcGFydCBpbW1lZGlhdGUhIik7CisgICAgLy8gVHJ5IGEgc2hpZnRlciBvcGVyYW5kIGFzIG9uZSBwYXJ0CisgICAgdW5zaWduZWQgViA9IHJvdHIzMiAofjI1NSwgZ2V0VDJTT0ltbVZhbFJvdGF0ZShJbW0pKSAmIEltbTsKKyAgICAvLyBJZiB0aGUgcmVzdCBpcyBlbmNvZGFibGUgYXMgYW4gaW1tZWRpYXRlLCB0aGVuIHJldHVybiBpdC4KKyAgICBpZiAoZ2V0VDJTT0ltbVZhbChWKSAhPSAtMSkgcmV0dXJuIFY7CisKKyAgICAvLyBUcnkgbWFza2luZyBvdXQgYSBzcGxhdCB2YWx1ZSBmaXJzdC4KKyAgICBpZiAoZ2V0VDJTT0ltbVZhbFNwbGF0VmFsKEltbSAmIDB4ZmYwMGZmMDBVKSAhPSAtMSkKKyAgICAgIHJldHVybiBJbW0gJiAweGZmMDBmZjAwVTsKKworICAgIC8vIFRoZSBvdGhlciBzcGxhdCBpcyBhbGwgdGhhdCdzIGxlZnQgYXMgYW4gb3B0aW9uLgorICAgIGFzc2VydCAoZ2V0VDJTT0ltbVZhbFNwbGF0VmFsKEltbSAmIDB4MDBmZjAwZmZVKSAhPSAtMSk7CisgICAgcmV0dXJuIEltbSAmIDB4MDBmZjAwZmZVOworICB9CisKKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRUMlNPSW1tVHdvUGFydFNlY29uZCh1bnNpZ25lZCBJbW0pIHsKKyAgICAvLyBNYXNrIG91dCB0aGUgZmlyc3QgaHVuaworICAgIEltbSBePSBnZXRUMlNPSW1tVHdvUGFydEZpcnN0KEltbSk7CisgICAgLy8gUmV0dXJuIHdoYXQncyBsZWZ0CisgICAgYXNzZXJ0IChnZXRUMlNPSW1tVmFsKEltbSkgIT0gLTEgJiYKKyAgICAgICAgICAgICJVbmFibGUgdG8gZW5jb2RlIHNlY29uZCBwYXJ0IG9mIFQyIHR3byBwYXJ0IFNPIGltbWVkaWF0ZSIpOworICAgIHJldHVybiBJbW07CisgIH0KKworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBZGRyZXNzaW5nIE1vZGUgIzIKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIFRoaXMgaXMgdXNlZCBmb3IgbW9zdCBzaW1wbGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMuCisgIC8vCisgIC8vIGFkZHJtb2RlMiA6PSByZWcgKy8tIHJlZyBzaG9wIGltbQorICAvLyBhZGRybW9kZTIgOj0gcmVnICsvLSBpbW0xMgorICAvLworICAvLyBUaGUgZmlyc3Qgb3BlcmFuZCBpcyBhbHdheXMgYSBSZWcuICBUaGUgc2Vjb25kIG9wZXJhbmQgaXMgYSByZWcgaWYgaW4KKyAgLy8gcmVnL3JlZyBmb3JtLCBvdGhlcndpc2UgaXQncyByZWcjMC4gIFRoZSB0aGlyZCBmaWVsZCBlbmNvZGVzIHRoZSBvcGVyYXRpb24KKyAgLy8gaW4gYml0IDEyLCB0aGUgaW1tZWRpYXRlIGluIGJpdHMgMC0xMSwgYW5kIHRoZSBzaGlmdCBvcCBpbiAxMy0xNS4KKyAgLy8KKyAgLy8gSWYgdGhpcyBhZGRyZXNzaW5nIG1vZGUgaXMgYSBmcmFtZSBpbmRleCAoYmVmb3JlIHByb2xvZy9lcGlsb2cgaW5zZXJ0aW9uCisgIC8vIGFuZCBjb2RlIHJld3JpdGluZyksIHRoaXMgb3BlcmFuZCB3aWxsIGhhdmUgdGhlIGZvcm06ICBGSSMsIHJlZzAsIDxvZmZzPgorICAvLyB3aXRoIG5vIHNoaWZ0IGFtb3VudCBmb3IgdGhlIGZyYW1lIG9mZnNldC4KKyAgLy8KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRBTTJPcGMoQWRkck9wYyBPcGMsIHVuc2lnbmVkIEltbTEyLCBTaGlmdE9wYyBTTykgeworICAgIGFzc2VydChJbW0xMiA8ICgxIDw8IDEyKSAmJiAiSW1tIHRvbyBsYXJnZSEiKTsKKyAgICBib29sIGlzU3ViID0gT3BjID09IHN1YjsKKyAgICByZXR1cm4gSW1tMTIgfCAoKGludClpc1N1YiA8PCAxMikgfCAoU08gPDwgMTMpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0QU0yT2Zmc2V0KHVuc2lnbmVkIEFNMk9wYykgeworICAgIHJldHVybiBBTTJPcGMgJiAoKDEgPDwgMTIpLTEpOworICB9CisgIHN0YXRpYyBpbmxpbmUgQWRkck9wYyBnZXRBTTJPcCh1bnNpZ25lZCBBTTJPcGMpIHsKKyAgICByZXR1cm4gKChBTTJPcGMgPj4gMTIpICYgMSkgPyBzdWIgOiBhZGQ7CisgIH0KKyAgc3RhdGljIGlubGluZSBTaGlmdE9wYyBnZXRBTTJTaGlmdE9wYyh1bnNpZ25lZCBBTTJPcGMpIHsKKyAgICByZXR1cm4gKFNoaWZ0T3BjKShBTTJPcGMgPj4gMTMpOworICB9CisKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQWRkcmVzc2luZyBNb2RlICMzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBUaGlzIGlzIHVzZWQgZm9yIHNpZ24tZXh0ZW5kaW5nIGxvYWRzLCBhbmQgbG9hZC9zdG9yZS1wYWlyIGluc3RydWN0aW9ucy4KKyAgLy8KKyAgLy8gYWRkcm1vZGUzIDo9IHJlZyArLy0gcmVnCisgIC8vIGFkZHJtb2RlMyA6PSByZWcgKy8tIGltbTgKKyAgLy8KKyAgLy8gVGhlIGZpcnN0IG9wZXJhbmQgaXMgYWx3YXlzIGEgUmVnLiAgVGhlIHNlY29uZCBvcGVyYW5kIGlzIGEgcmVnIGlmIGluCisgIC8vIHJlZy9yZWcgZm9ybSwgb3RoZXJ3aXNlIGl0J3MgcmVnIzAuICBUaGUgdGhpcmQgZmllbGQgZW5jb2RlcyB0aGUgb3BlcmF0aW9uCisgIC8vIGluIGJpdCA4LCB0aGUgaW1tZWRpYXRlIGluIGJpdHMgMC03LgorCisgIC8vLyBnZXRBTTNPcGMgLSBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdGhlIGFkZHJtb2RlMyBvcGMgZmllbGQuCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0QU0zT3BjKEFkZHJPcGMgT3BjLCB1bnNpZ25lZCBjaGFyIE9mZnNldCkgeworICAgIGJvb2wgaXNTdWIgPSBPcGMgPT0gc3ViOworICAgIHJldHVybiAoKGludClpc1N1YiA8PCA4KSB8IE9mZnNldDsKKyAgfQorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0QU0zT2Zmc2V0KHVuc2lnbmVkIEFNM09wYykgeworICAgIHJldHVybiBBTTNPcGMgJiAweEZGOworICB9CisgIHN0YXRpYyBpbmxpbmUgQWRkck9wYyBnZXRBTTNPcCh1bnNpZ25lZCBBTTNPcGMpIHsKKyAgICByZXR1cm4gKChBTTNPcGMgPj4gOCkgJiAxKSA/IHN1YiA6IGFkZDsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBZGRyZXNzaW5nIE1vZGUgIzQKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIFRoaXMgaXMgdXNlZCBmb3IgbG9hZCAvIHN0b3JlIG11bHRpcGxlIGluc3RydWN0aW9ucy4KKyAgLy8KKyAgLy8gYWRkcm1vZGU0IDo9IHJlZywgPG1vZGU+CisgIC8vCisgIC8vIFRoZSBmb3VyIG1vZGVzIGFyZToKKyAgLy8gICAgSUEgLSBJbmNyZW1lbnQgYWZ0ZXIKKyAgLy8gICAgSUIgLSBJbmNyZW1lbnQgYmVmb3JlCisgIC8vICAgIERBIC0gRGVjcmVtZW50IGFmdGVyCisgIC8vICAgIERCIC0gRGVjcmVtZW50IGJlZm9yZQorCisgIHN0YXRpYyBpbmxpbmUgQU1TdWJNb2RlIGdldEFNNFN1Yk1vZGUodW5zaWduZWQgTW9kZSkgeworICAgIHJldHVybiAoQU1TdWJNb2RlKShNb2RlICYgMHg3KTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0QU00TW9kZUltbShBTVN1Yk1vZGUgU3ViTW9kZSkgeworICAgIHJldHVybiAoaW50KVN1Yk1vZGU7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQWRkcmVzc2luZyBNb2RlICM1CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBUaGlzIGlzIHVzZWQgZm9yIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucywgc3VjaCBhcyBGUCBsb2FkL3N0b3Jlcy4KKyAgLy8KKyAgLy8gYWRkcm1vZGU1IDo9IHJlZyArLy0gaW1tOCo0CisgIC8vCisgIC8vIFRoZSBmaXJzdCBvcGVyYW5kIGlzIGFsd2F5cyBhIFJlZy4gIFRoZSBzZWNvbmQgb3BlcmFuZCBlbmNvZGVzIHRoZQorICAvLyBvcGVyYXRpb24gaW4gYml0IDggYW5kIHRoZSBpbW1lZGlhdGUgaW4gYml0cyAwLTcuCisgIC8vCisgIC8vIFRoaXMgaXMgYWxzbyB1c2VkIGZvciBGUCBsb2FkL3N0b3JlIG11bHRpcGxlIG9wcy4gVGhlIHNlY29uZCBvcGVyYW5kCisgIC8vIGVuY29kZXMgdGhlIG51bWJlciBvZiByZWdpc3RlcnMgKG9yIDIgdGltZXMgdGhlIG51bWJlciBvZiByZWdpc3RlcnMKKyAgLy8gZm9yIERQUiBvcHMpIGluIGJpdHMgMC03LiBJbiBhZGRpdGlvbiwgYml0cyA4LTEwIGVuY29kZSBvbmUgb2YgdGhlCisgIC8vIGZvbGxvd2luZyB0d28gc3ViLW1vZGVzOgorICAvLworICAvLyAgICBJQSAtIEluY3JlbWVudCBhZnRlcgorICAvLyAgICBEQiAtIERlY3JlbWVudCBiZWZvcmUKKworICAvLy8gZ2V0QU01T3BjIC0gVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBhZGRybW9kZTUgb3BjIGZpZWxkLgorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldEFNNU9wYyhBZGRyT3BjIE9wYywgdW5zaWduZWQgY2hhciBPZmZzZXQpIHsKKyAgICBib29sIGlzU3ViID0gT3BjID09IHN1YjsKKyAgICByZXR1cm4gKChpbnQpaXNTdWIgPDwgOCkgfCBPZmZzZXQ7CisgIH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGdldEFNNU9mZnNldCh1bnNpZ25lZCBBTTVPcGMpIHsKKyAgICByZXR1cm4gQU01T3BjICYgMHhGRjsKKyAgfQorICBzdGF0aWMgaW5saW5lIEFkZHJPcGMgZ2V0QU01T3AodW5zaWduZWQgQU01T3BjKSB7CisgICAgcmV0dXJuICgoQU01T3BjID4+IDgpICYgMSkgPyBzdWIgOiBhZGQ7CisgIH0KKworICAvLy8gZ2V0QU01T3BjIC0gVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBhZGRybW9kZTUgb3BjIGZpZWxkIGZvciBWTERNIGFuZAorICAvLy8gVlNUTSBpbnN0cnVjdGlvbnMuCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0QU01T3BjKEFNU3ViTW9kZSBTdWJNb2RlLCB1bnNpZ25lZCBjaGFyIE9mZnNldCkgeworICAgIGFzc2VydCgoU3ViTW9kZSA9PSBpYSB8fCBTdWJNb2RlID09IGRiKSAmJgorICAgICAgICAgICAiSWxsZWdhbCBhZGRyZXNzaW5nIG1vZGUgNSBzdWItbW9kZSEiKTsKKyAgICByZXR1cm4gKChpbnQpU3ViTW9kZSA8PCA4KSB8IE9mZnNldDsKKyAgfQorICBzdGF0aWMgaW5saW5lIEFNU3ViTW9kZSBnZXRBTTVTdWJNb2RlKHVuc2lnbmVkIEFNNU9wYykgeworICAgIHJldHVybiAoQU1TdWJNb2RlKSgoQU01T3BjID4+IDgpICYgMHg3KTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBZGRyZXNzaW5nIE1vZGUgIzYKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIFRoaXMgaXMgdXNlZCBmb3IgTkVPTiBsb2FkIC8gc3RvcmUgaW5zdHJ1Y3Rpb25zLgorICAvLworICAvLyBhZGRybW9kZTYgOj0gcmVnIHdpdGggb3B0aW9uYWwgYWxpZ25tZW50CisgIC8vCisgIC8vIFRoaXMgaXMgc3RvcmVkIGluIHR3byBvcGVyYW5kcyBbcmVnYWRkciwgYWxpZ25dLiAgVGhlIGZpcnN0IGlzIHRoZQorICAvLyBhZGRyZXNzIHJlZ2lzdGVyLiAgVGhlIHNlY29uZCBvcGVyYW5kIGlzIHRoZSB2YWx1ZSBvZiB0aGUgYWxpZ25tZW50CisgIC8vIHNwZWNpZmllciBpbiBieXRlcyBvciB6ZXJvIGlmIG5vIGV4cGxpY2l0IGFsaWdubWVudC4KKyAgLy8gVmFsaWQgYWxpZ25tZW50cyBkZXBlbmQgb24gdGhlIHNwZWNpZmljIGluc3RydWN0aW9uLgorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBORU9OIE1vZGlmaWVkIEltbWVkaWF0ZXMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIFNldmVyYWwgTkVPTiBpbnN0cnVjdGlvbnMgKGUuZy4sIFZNT1YpIHRha2UgYSAibW9kaWZpZWQgaW1tZWRpYXRlIgorICAvLyB2ZWN0b3Igb3BlcmFuZCwgd2hlcmUgYSBzbWFsbCBpbW1lZGlhdGUgZW5jb2RlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8gc3BlY2lmaWVzIGEgZnVsbCBORU9OIHZlY3RvciB2YWx1ZS4gIFRoZXNlIG1vZGlmaWVkIGltbWVkaWF0ZXMgYXJlCisgIC8vIHJlcHJlc2VudGVkIGhlcmUgYXMgZW5jb2RlZCBpbnRlZ2Vycy4gIFRoZSBsb3cgOCBiaXRzIGhvbGQgdGhlIGltbWVkaWF0ZQorICAvLyB2YWx1ZTsgYml0IDEyIGhvbGRzIHRoZSAiT3AiIGZpZWxkIG9mIHRoZSBpbnN0cnVjdGlvbiwgYW5kIGJpdHMgMTEtOCBob2xkCisgIC8vIHRoZSAiQ21vZGUiIGZpZWxkIG9mIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBpbnRlcmZhY2VzIGJlbG93IHRyZWF0IHRoZQorICAvLyBPcCBhbmQgQ21vZGUgdmFsdWVzIGFzIGEgc2luZ2xlIDUtYml0IHZhbHVlLgorCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY3JlYXRlTkVPTk1vZEltbSh1bnNpZ25lZCBPcENtb2RlLCB1bnNpZ25lZCBWYWwpIHsKKyAgICByZXR1cm4gKE9wQ21vZGUgPDwgOCkgfCBWYWw7CisgIH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRORU9OTW9kSW1tT3BDbW9kZSh1bnNpZ25lZCBNb2RJbW0pIHsKKyAgICByZXR1cm4gKE1vZEltbSA+PiA4KSAmIDB4MWY7CisgIH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRORU9OTW9kSW1tVmFsKHVuc2lnbmVkIE1vZEltbSkgeworICAgIHJldHVybiBNb2RJbW0gJiAweGZmOworICB9CisKKyAgLy8vIGRlY29kZU5FT05Nb2RJbW0gLSBEZWNvZGUgYSBORU9OIG1vZGlmaWVkIGltbWVkaWF0ZSB2YWx1ZSBpbnRvIHRoZQorICAvLy8gZWxlbWVudCB2YWx1ZSBhbmQgdGhlIGVsZW1lbnQgc2l6ZSBpbiBiaXRzLiAgKElmIHRoZSBlbGVtZW50IHNpemUgaXMKKyAgLy8vIHNtYWxsZXIgdGhhbiB0aGUgdmVjdG9yLCBpdCBpcyBzcGxhdHRlZCBpbnRvIGFsbCB0aGUgZWxlbWVudHMuKQorICBzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGRlY29kZU5FT05Nb2RJbW0odW5zaWduZWQgTW9kSW1tLCB1bnNpZ25lZCAmRWx0Qml0cykgeworICAgIHVuc2lnbmVkIE9wQ21vZGUgPSBnZXRORU9OTW9kSW1tT3BDbW9kZShNb2RJbW0pOworICAgIHVuc2lnbmVkIEltbTggPSBnZXRORU9OTW9kSW1tVmFsKE1vZEltbSk7CisgICAgdWludDY0X3QgVmFsID0gMDsKKworICAgIGlmIChPcENtb2RlID09IDB4ZSkgeworICAgICAgLy8gOC1iaXQgdmVjdG9yIGVsZW1lbnRzCisgICAgICBWYWwgPSBJbW04OworICAgICAgRWx0Qml0cyA9IDg7CisgICAgfSBlbHNlIGlmICgoT3BDbW9kZSAmIDB4YykgPT0gMHg4KSB7CisgICAgICAvLyAxNi1iaXQgdmVjdG9yIGVsZW1lbnRzCisgICAgICB1bnNpZ25lZCBCeXRlTnVtID0gKE9wQ21vZGUgJiAweDYpID4+IDE7CisgICAgICBWYWwgPSBJbW04IDw8ICg4ICogQnl0ZU51bSk7CisgICAgICBFbHRCaXRzID0gMTY7CisgICAgfSBlbHNlIGlmICgoT3BDbW9kZSAmIDB4OCkgPT0gMCkgeworICAgICAgLy8gMzItYml0IHZlY3RvciBlbGVtZW50cywgemVybyB3aXRoIG9uZSBieXRlIHNldAorICAgICAgdW5zaWduZWQgQnl0ZU51bSA9IChPcENtb2RlICYgMHg2KSA+PiAxOworICAgICAgVmFsID0gSW1tOCA8PCAoOCAqIEJ5dGVOdW0pOworICAgICAgRWx0Qml0cyA9IDMyOworICAgIH0gZWxzZSBpZiAoKE9wQ21vZGUgJiAweGUpID09IDB4YykgeworICAgICAgLy8gMzItYml0IHZlY3RvciBlbGVtZW50cywgb25lIGJ5dGUgd2l0aCBsb3cgYml0cyBzZXQKKyAgICAgIHVuc2lnbmVkIEJ5dGVOdW0gPSAxICsgKE9wQ21vZGUgJiAweDEpOworICAgICAgVmFsID0gKEltbTggPDwgKDggKiBCeXRlTnVtKSkgfCAoMHhmZmZmID4+ICg4ICogKDIgLSBCeXRlTnVtKSkpOworICAgICAgRWx0Qml0cyA9IDMyOworICAgIH0gZWxzZSBpZiAoT3BDbW9kZSA9PSAweDFlKSB7CisgICAgICAvLyA2NC1iaXQgdmVjdG9yIGVsZW1lbnRzCisgICAgICBmb3IgKHVuc2lnbmVkIEJ5dGVOdW0gPSAwOyBCeXRlTnVtIDwgODsgKytCeXRlTnVtKSB7CisgICAgICAgIGlmICgoTW9kSW1tID4+IEJ5dGVOdW0pICYgMSkKKyAgICAgICAgICBWYWwgfD0gKHVpbnQ2NF90KTB4ZmYgPDwgKDggKiBCeXRlTnVtKTsKKyAgICAgIH0KKyAgICAgIEVsdEJpdHMgPSA2NDsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbnN1cHBvcnRlZCBORU9OIGltbWVkaWF0ZSIpOworICAgIH0KKyAgICByZXR1cm4gVmFsOworICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBBUk1fQU0KK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1Bc21QcmludGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUFzbVByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYmFjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1Bc21QcmludGVyLmNwcApAQCAtMCwwICsxLDE0NzEgQEAKKy8vPT09LS0gQVJNQXNtUHJpbnRlci5jcHAgLSBQcmludCBtYWNoaW5lIGNvZGUgdG8gYW4gQVJNIC5zIGZpbGUgLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgcHJpbnRlciB0aGF0IGNvbnZlcnRzIGZyb20gb3VyIGludGVybmFsIHJlcHJlc2VudGF0aW9uCisvLyBvZiBtYWNoaW5lLWRlcGVuZGVudCBMTFZNIGNvZGUgdG8gR0FTLWZvcm1hdCBBUk0gYXNzZW1ibHkgbGFuZ3VhZ2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJhc20tcHJpbnRlciIKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1CdWlsZEF0dHJzLmgiCisjaW5jbHVkZSAiQVJNQWRkcmVzc2luZ01vZGVzLmgiCisjaW5jbHVkZSAiQVJNQ29uc3RhbnRQb29sVmFsdWUuaCIKKyNpbmNsdWRlICJBc21QcmludGVyL0FSTUluc3RQcmludGVyLmgiCisjaW5jbHVkZSAiQVJNTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIkFSTU1DSW5zdExvd2VyLmgiCisjaW5jbHVkZSAiQVJNVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRGVidWdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZUltcGwuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uTWFjaE8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3RyZWFtZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2N0eXBlPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitFbmFibGVNQ0luc3QoImVuYWJsZS1hcm0tbWNpbnN0LXByaW50ZXIiLCBjbDo6SGlkZGVuLAorICAgICAgICAgICAgY2w6OmRlc2MoImVuYWJsZSBleHBlcmltZW50YWwgYXNtcHJpbnRlciBndW5rIGluIHRoZSBhcm0gYmFja2VuZCIpKTsKKworbmFtZXNwYWNlIGxsdm0geworICBuYW1lc3BhY2UgQVJNIHsKKyAgICBlbnVtIERXX0lTQSB7CisgICAgICBEV19JU0FfQVJNX3RodW1iID0gMSwKKyAgICAgIERXX0lTQV9BUk1fYXJtID0gMgorICAgIH07CisgIH0KK30KKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgQVJNQXNtUHJpbnRlciA6IHB1YmxpYyBBc21QcmludGVyIHsKKworICAgIC8vLyBTdWJ0YXJnZXQgLSBLZWVwIGEgcG9pbnRlciB0byB0aGUgQVJNU3VidGFyZ2V0IGFyb3VuZCBzbyB0aGF0IHdlIGNhbgorICAgIC8vLyBtYWtlIHRoZSByaWdodCBkZWNpc2lvbiB3aGVuIHByaW50aW5nIGFzbSBjb2RlIGZvciBkaWZmZXJlbnQgdGFyZ2V0cy4KKyAgICBjb25zdCBBUk1TdWJ0YXJnZXQgKlN1YnRhcmdldDsKKworICAgIC8vLyBBRkkgLSBLZWVwIGEgcG9pbnRlciB0byBBUk1GdW5jdGlvbkluZm8gZm9yIHRoZSBjdXJyZW50CisgICAgLy8vIE1hY2hpbmVGdW5jdGlvbi4KKyAgICBBUk1GdW5jdGlvbkluZm8gKkFGSTsKKworICAgIC8vLyBNQ1AgLSBLZWVwIGEgcG9pbnRlciB0byBjb25zdGFudHBvb2wgZW50cmllcyBvZiB0aGUgY3VycmVudAorICAgIC8vLyBNYWNoaW5lRnVuY3Rpb24uCisgICAgY29uc3QgTWFjaGluZUNvbnN0YW50UG9vbCAqTUNQOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBUk1Bc21QcmludGVyKFRhcmdldE1hY2hpbmUgJlRNLCBNQ1N0cmVhbWVyICZTdHJlYW1lcikKKyAgICAgIDogQXNtUHJpbnRlcihUTSwgU3RyZWFtZXIpLCBBRkkoTlVMTCksIE1DUChOVUxMKSB7CisgICAgICBTdWJ0YXJnZXQgPSAmVE0uZ2V0U3VidGFyZ2V0PEFSTVN1YnRhcmdldD4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJBUk0gQXNzZW1ibHkgUHJpbnRlciI7CisgICAgfQorICAgIAorICAgIHZvaWQgcHJpbnRJbnN0cnVjdGlvblRocm91Z2hNQ1N0cmVhbWVyKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworICAgIAorCisgICAgdm9pZCBwcmludE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLCByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllciA9IDApOworICAgIHZvaWQgcHJpbnRTT0ltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludFNPSW1tMlBhcnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRTT1JlZ09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRBZGRyTW9kZTJPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludEFkZHJNb2RlMk9mZnNldE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50QWRkck1vZGUzT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRBZGRyTW9kZTNPZmZzZXRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludEFkZHJNb2RlNE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyID0gMCk7CisgICAgdm9pZCBwcmludEFkZHJNb2RlNU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyID0gMCk7CisgICAgdm9pZCBwcmludEFkZHJNb2RlNk9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50QWRkck1vZGU2T2Zmc2V0T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRBZGRyTW9kZVBDT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllciA9IDApOworICAgIHZvaWQgcHJpbnRCaXRmaWVsZEludk1hc2tJbW1PcGVyYW5kIChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKworICAgIHZvaWQgcHJpbnRUaHVtYlM0SW1tT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50VGh1bWJJVE1hc2soY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludFRodW1iQWRkck1vZGVSUk9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50VGh1bWJBZGRyTW9kZVJJNU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2NhbGUpOworICAgIHZvaWQgcHJpbnRUaHVtYkFkZHJNb2RlUzFPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludFRodW1iQWRkck1vZGVTMk9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50VGh1bWJBZGRyTW9kZVM0T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRUaHVtYkFkZHJNb2RlU1BPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisKKyAgICB2b2lkIHByaW50VDJTT09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludFQyQWRkck1vZGVJbW0xMk9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50VDJBZGRyTW9kZUltbThPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50VDJBZGRyTW9kZUltbThzNE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludFQyQWRkck1vZGVJbW04T2Zmc2V0T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludFQyQWRkck1vZGVJbW04czRPZmZzZXRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHt9CisgICAgdm9pZCBwcmludFQyQWRkck1vZGVTb1JlZ09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKworICAgIHZvaWQgcHJpbnRDUFNPcHRpb25PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykge30KKyAgICB2b2lkIHByaW50TVNSTWFza09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykge30KKyAgICB2b2lkIHByaW50TmVnWmVyb09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykge30KKyAgICB2b2lkIHByaW50UHJlZGljYXRlT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRNYW5kYXRvcnlQcmVkaWNhdGVPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludFNCaXRNb2RpZmllck9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50UENMYWJlbChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRSZWdpc3Rlckxpc3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRDUEluc3RPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllcik7CisgICAgdm9pZCBwcmludEpUQmxvY2tPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRKVDJCbG9ja09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRUQkFkZHJNb2RlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludE5vSGFzaEltbWVkaWF0ZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludFZGUGYzMkltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50VkZQZjY0SW1tT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRORU9OTW9kSW1tT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKworICAgIHZpcnR1YWwgYm9vbCBQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgdmlydHVhbCBib29sIFByaW50QXNtTWVtb3J5T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpFeHRyYUNvZGUsIHJhd19vc3RyZWFtICZPKTsKKworICAgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmTyk7IC8vIGF1dG9nZW4KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0UmVnaXN0ZXJOYW1lKHVuc2lnbmVkIFJlZ05vKTsKKworICAgIHZpcnR1YWwgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSk7CisgICAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpOworICAgIAorICAgIHZpcnR1YWwgdm9pZCBFbWl0Q29uc3RhbnRQb29sKCkge30gLy8gd2UgZW1pdCBjb25zdGFudCBwb29scyBjdXN0b21seSEKKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uRW50cnlMYWJlbCgpOworICAgIHZvaWQgRW1pdFN0YXJ0T2ZBc21GaWxlKE1vZHVsZSAmTSk7CisgICAgdm9pZCBFbWl0RW5kT2ZBc21GaWxlKE1vZHVsZSAmTSk7CisKKyAgICBNYWNoaW5lTG9jYXRpb24gZ2V0RGVidWdWYWx1ZUxvY2F0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0IHsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBMb2NhdGlvbjsKKyAgICAgIGFzc2VydCAoTUktPmdldE51bU9wZXJhbmRzKCkgPT0gNCAmJiAiSW52YWxpZCBuby4gb2YgbWFjaGluZSBvcGVyYW5kcyEiKTsKKyAgICAgIC8vIEZyYW1lIGFkZHJlc3MuICBDdXJyZW50bHkgaGFuZGxlcyByZWdpc3RlciArLSBvZmZzZXQgb25seS4KKyAgICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgwKS5pc1JlZygpICYmIE1JLT5nZXRPcGVyYW5kKDEpLmlzSW1tKCkpCisgICAgICAgIExvY2F0aW9uLnNldChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSwgTUktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkpOworICAgICAgZWxzZSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiREJHX1ZBTFVFIGluc3RydWN0aW9uIGlnbm9yZWQhICIgPDwgKk1JIDw8ICJcbiIpOworICAgICAgfQorICAgICAgcmV0dXJuIExvY2F0aW9uOworICAgIH0KKworICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SVNBRW5jb2RpbmcoKSB7CisgICAgICAvLyBBUk0vRGFyd2luIGFkZHMgSVNBIHRvIHRoZSBEV0FSRiBpbmZvIGZvciBlYWNoIGZ1bmN0aW9uLgorICAgICAgaWYgKCFTdWJ0YXJnZXQtPmlzVGFyZ2V0RGFyd2luKCkpCisgICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIFN1YnRhcmdldC0+aXNUaHVtYigpID8KKyAgICAgICAgbGx2bTo6QVJNOjpEV19JU0FfQVJNX3RodW1iIDogbGx2bTo6QVJNOjpEV19JU0FfQVJNX2FybTsKKyAgICB9CisKKyAgICBNQ1N5bWJvbCAqR2V0QVJNU2V0UElDSnVtcFRhYmxlTGFiZWwyKHVuc2lnbmVkIHVpZCwgdW5zaWduZWQgdWlkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworICAgIE1DU3ltYm9sICpHZXRBUk1KVElQSUNKdW1wVGFibGVMYWJlbDIodW5zaWduZWQgdWlkLCB1bnNpZ25lZCB1aWQyKSBjb25zdDsKKworICAgIC8vLyBFbWl0TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlIC0gUHJpbnQgYSBtYWNoaW5lIGNvbnN0YW50cG9vbCB2YWx1ZSB0bworICAgIC8vLyB0aGUgLnMgZmlsZS4KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZShNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgKk1DUFYpIHsKKyAgICAgIFNtYWxsU3RyaW5nPDEyOD4gU3RyOworICAgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhTdHIpOworICAgICAgRW1pdE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZShNQ1BWLCBPUyk7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChPUy5zdHIoKSk7CisgICAgfQorICAgIAorICAgIHZvaWQgRW1pdE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZShNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgKk1DUFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgICAgICBzd2l0Y2ggKFRNLmdldFRhcmdldERhdGEoKS0+Z2V0VHlwZUFsbG9jU2l6ZShNQ1BWLT5nZXRUeXBlKCkpKSB7CisgICAgICBjYXNlIDE6IE8gPDwgTUFJLT5nZXREYXRhOGJpdHNEaXJlY3RpdmUoMCk7IGJyZWFrOworICAgICAgY2FzZSAyOiBPIDw8IE1BSS0+Z2V0RGF0YTE2Yml0c0RpcmVjdGl2ZSgwKTsgYnJlYWs7CisgICAgICBjYXNlIDQ6IE8gPDwgTUFJLT5nZXREYXRhMzJiaXRzRGlyZWN0aXZlKDApOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIENQViBzaXplIik7CisgICAgICB9CisKKyAgICAgIEFSTUNvbnN0YW50UG9vbFZhbHVlICpBQ1BWID0gc3RhdGljX2Nhc3Q8QVJNQ29uc3RhbnRQb29sVmFsdWUqPihNQ1BWKTsKKworICAgICAgaWYgKEFDUFYtPmlzTFNEQSgpKSB7CisgICAgICAgIE8gPDwgTUFJLT5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCkgPDwgIl9MU0RBXyIgPDwgZ2V0RnVuY3Rpb25OdW1iZXIoKTsKKyAgICAgIH0gZWxzZSBpZiAoQUNQVi0+aXNCbG9ja0FkZHJlc3MoKSkgeworICAgICAgICBPIDw8ICpHZXRCbG9ja0FkZHJlc3NTeW1ib2woQUNQVi0+Z2V0QmxvY2tBZGRyZXNzKCkpOworICAgICAgfSBlbHNlIGlmIChBQ1BWLT5pc0dsb2JhbFZhbHVlKCkpIHsKKyAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gQUNQVi0+Z2V0R1YoKTsKKyAgICAgICAgYm9vbCBpc0luZGlyZWN0ID0gU3VidGFyZ2V0LT5pc1RhcmdldERhcndpbigpICYmCisgICAgICAgICAgU3VidGFyZ2V0LT5HVklzSW5kaXJlY3RTeW1ib2woR1YsIFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpKTsKKyAgICAgICAgaWYgKCFpc0luZGlyZWN0KQorICAgICAgICAgIE8gPDwgKk1hbmctPmdldFN5bWJvbChHVik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhpcyB3aGVuIERhcndpbiB0cmFuc2l0aW9uIHRvIEBHT1QgbGlrZSBzeW50YXguCisgICAgICAgICAgTUNTeW1ib2wgKlN5bSA9IEdldFN5bWJvbFdpdGhHbG9iYWxWYWx1ZUJhc2UoR1YsICIkbm9uX2xhenlfcHRyIik7CisgICAgICAgICAgTyA8PCAqU3ltOworICAgICAgICAgIAorICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvTWFjaE8gJk1NSU1hY2hPID0KKyAgICAgICAgICAgIE1NSS0+Z2V0T2JqRmlsZUluZm88TWFjaGluZU1vZHVsZUluZm9NYWNoTz4oKTsKKyAgICAgICAgICBNYWNoaW5lTW9kdWxlSW5mb0ltcGw6OlN0dWJWYWx1ZVR5ICZTdHViU3ltID0KKyAgICAgICAgICAgIEdWLT5oYXNIaWRkZW5WaXNpYmlsaXR5KCkgPyBNTUlNYWNoTy5nZXRIaWRkZW5HVlN0dWJFbnRyeShTeW0pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTUlNYWNoTy5nZXRHVlN0dWJFbnRyeShTeW0pOworICAgICAgICAgIGlmIChTdHViU3ltLmdldFBvaW50ZXIoKSA9PSAwKQorICAgICAgICAgICAgU3R1YlN5bSA9IE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6CisgICAgICAgICAgICAgIFN0dWJWYWx1ZVR5KE1hbmctPmdldFN5bWJvbChHViksICFHVi0+aGFzSW50ZXJuYWxMaW5rYWdlKCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoQUNQVi0+aXNFeHRTeW1ib2woKSAmJiAidW5yZWNvZ25pemVkIGNvbnN0YW50IHBvb2wgdmFsdWUiKTsKKyAgICAgICAgTyA8PCAqR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woQUNQVi0+Z2V0U3ltYm9sKCkpOworICAgICAgfQorCisgICAgICBpZiAoQUNQVi0+aGFzTW9kaWZpZXIoKSkgTyA8PCAiKCIgPDwgQUNQVi0+Z2V0TW9kaWZpZXIoKSA8PCAiKSI7CisgICAgICBpZiAoQUNQVi0+Z2V0UENBZGp1c3RtZW50KCkgIT0gMCkgeworICAgICAgICBPIDw8ICItKCIgPDwgTUFJLT5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCkgPDwgIlBDIgorICAgICAgICAgIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkgPDwgIl8iICA8PCBBQ1BWLT5nZXRMYWJlbElkKCkKKyAgICAgICAgICA8PCAiKyIgPDwgKHVuc2lnbmVkKUFDUFYtPmdldFBDQWRqdXN0bWVudCgpOworICAgICAgICAgaWYgKEFDUFYtPm11c3RBZGRDdXJyZW50QWRkcmVzcygpKQorICAgICAgICAgICBPIDw8ICItLiI7CisgICAgICAgICBPIDw8ICcpJzsKKyAgICAgIH0KKyAgICB9CisgIH07Cit9IC8vIGVuZCBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKyNpbmNsdWRlICJBUk1HZW5Bc21Xcml0ZXIuaW5jIgorCit2b2lkIEFSTUFzbVByaW50ZXI6OkVtaXRGdW5jdGlvbkVudHJ5TGFiZWwoKSB7CisgIGlmIChBRkktPmlzVGh1bWJGdW5jdGlvbigpKSB7CisgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5jb2RlXHQxNiIpKTsKKyAgICBpZiAoIVN1YnRhcmdldC0+aXNUYXJnZXREYXJ3aW4oKSkKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXHQudGh1bWJfZnVuYyIpKTsKKyAgICBlbHNlIHsKKyAgICAgIC8vIFRoaXMgbmVlZHMgdG8gZW1pdCB0byBhIHRlbXBvcmFyeSBzdHJpbmcgdG8gZ2V0IHByb3Blcmx5IHF1b3RlZAorICAgICAgLy8gTUNTeW1ib2xzIHdoZW4gdGhleSBoYXZlIHNwYWNlcyBpbiB0aGVtLgorICAgICAgU21hbGxTdHJpbmc8MTI4PiBUbXA7CisgICAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtIE9TKFRtcCk7CisgICAgICBPUyA8PCAiXHQudGh1bWJfZnVuY1x0IiA8PCAqQ3VycmVudEZuU3ltOworICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoT1Muc3RyKCkpOworICAgIH0KKyAgfQorICAKKyAgT3V0U3RyZWFtZXIuRW1pdExhYmVsKEN1cnJlbnRGblN5bSk7Cit9CisKKy8vLyBydW5Pbk1hY2hpbmVGdW5jdGlvbiAtIFRoaXMgdXNlcyB0aGUgcHJpbnRJbnN0cnVjdGlvbigpCisvLy8gbWV0aG9kIHRvIHByaW50IGFzc2VtYmx5IGZvciBlYWNoIGluc3RydWN0aW9uLgorLy8vCitib29sIEFSTUFzbVByaW50ZXI6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgQUZJID0gTUYuZ2V0SW5mbzxBUk1GdW5jdGlvbkluZm8+KCk7CisgIE1DUCA9IE1GLmdldENvbnN0YW50UG9vbCgpOworCisgIHJldHVybiBBc21QcmludGVyOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNRik7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPLCBjb25zdCBjaGFyICpNb2RpZmllcikgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIHVuc2lnbmVkIFRGID0gTU8uZ2V0VGFyZ2V0RmxhZ3MoKTsKKworICBzd2l0Y2ggKE1PLmdldFR5cGUoKSkgeworICBkZWZhdWx0OgorICAgIGFzc2VydCgwICYmICI8dW5rbm93biBvcGVyYW5kIHR5cGU+Iik7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyOiB7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpOworICAgIGlmIChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJkcmVncGFpciIpID09IDApIHsKKyAgICAgIHVuc2lnbmVkIERSZWdMbyA9IFRNLmdldFJlZ2lzdGVySW5mbygpLT5nZXRTdWJSZWcoUmVnLCBBUk06OmRzdWJfMCk7CisgICAgICB1bnNpZ25lZCBEUmVnSGkgPSBUTS5nZXRSZWdpc3RlckluZm8oKS0+Z2V0U3ViUmVnKFJlZywgQVJNOjpkc3ViXzEpOworICAgICAgTyA8PCAneycKKyAgICAgICAgPDwgZ2V0UmVnaXN0ZXJOYW1lKERSZWdMbykgPDwgIiwgIiA8PCBnZXRSZWdpc3Rlck5hbWUoRFJlZ0hpKQorICAgICAgICA8PCAnfSc7CisgICAgfSBlbHNlIGlmIChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJsYW5lIikgPT0gMCkgeworICAgICAgdW5zaWduZWQgUmVnTnVtID0gQVJNUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhSZWcpOworICAgICAgdW5zaWduZWQgRFJlZyA9CisgICAgICAgIFRNLmdldFJlZ2lzdGVySW5mbygpLT5nZXRNYXRjaGluZ1N1cGVyUmVnKFJlZywKKyAgICAgICAgICBSZWdOdW0gJiAxID8gQVJNOjpzc3ViXzEgOiBBUk06OnNzdWJfMCwgJkFSTTo6RFBSX1ZGUDJSZWdDbGFzcyk7CisgICAgICBPIDw8IGdldFJlZ2lzdGVyTmFtZShEUmVnKSA8PCAnWycgPDwgKFJlZ051bSAmIDEpIDw8ICddJzsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KCFNTy5nZXRTdWJSZWcoKSAmJiAiU3VicmVncyBzaG91bGQgYmUgZWxpbWluYXRlZCEiKTsKKyAgICAgIE8gPDwgZ2V0UmVnaXN0ZXJOYW1lKFJlZyk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ltbWVkaWF0ZTogeworICAgIGludDY0X3QgSW1tID0gTU8uZ2V0SW1tKCk7CisgICAgTyA8PCAnIyc7CisgICAgaWYgKChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJsbzE2IikgPT0gMCkgfHwKKyAgICAgICAgKFRGICYgQVJNSUk6Ok1PX0xPMTYpKQorICAgICAgTyA8PCAiOmxvd2VyMTY6IjsKKyAgICBlbHNlIGlmICgoTW9kaWZpZXIgJiYgc3RyY21wKE1vZGlmaWVyLCAiaGkxNiIpID09IDApIHx8CisgICAgICAgICAgICAgKFRGICYgQVJNSUk6Ok1PX0hJMTYpKQorICAgICAgTyA8PCAiOnVwcGVyMTY6IjsKKyAgICBPIDw8IEltbTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19NYWNoaW5lQmFzaWNCbG9jazoKKyAgICBPIDw8ICpNTy5nZXRNQkIoKS0+Z2V0U3ltYm9sKCk7CisgICAgcmV0dXJuOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOiB7CisgICAgYm9vbCBpc0NhbGxPcCA9IE1vZGlmaWVyICYmICFzdHJjbXAoTW9kaWZpZXIsICJjYWxsIik7CisgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gTU8uZ2V0R2xvYmFsKCk7CisKKyAgICBpZiAoKE1vZGlmaWVyICYmIHN0cmNtcChNb2RpZmllciwgImxvMTYiKSA9PSAwKSB8fAorICAgICAgICAoVEYgJiBBUk1JSTo6TU9fTE8xNikpCisgICAgICBPIDw8ICI6bG93ZXIxNjoiOworICAgIGVsc2UgaWYgKChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJoaTE2IikgPT0gMCkgfHwKKyAgICAgICAgICAgICAoVEYgJiBBUk1JSTo6TU9fSEkxNikpCisgICAgICBPIDw8ICI6dXBwZXIxNjoiOworICAgIE8gPDwgKk1hbmctPmdldFN5bWJvbChHVik7CisKKyAgICBwcmludE9mZnNldChNTy5nZXRPZmZzZXQoKSwgTyk7CisKKyAgICBpZiAoaXNDYWxsT3AgJiYgU3VidGFyZ2V0LT5pc1RhcmdldEVMRigpICYmCisgICAgICAgIFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKQorICAgICAgTyA8PCAiKFBMVCkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOiB7CisgICAgYm9vbCBpc0NhbGxPcCA9IE1vZGlmaWVyICYmICFzdHJjbXAoTW9kaWZpZXIsICJjYWxsIik7CisgICAgTyA8PCAqR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woTU8uZ2V0U3ltYm9sTmFtZSgpKTsKKyAgICAKKyAgICBpZiAoaXNDYWxsT3AgJiYgU3VidGFyZ2V0LT5pc1RhcmdldEVMRigpICYmCisgICAgICAgIFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKQorICAgICAgTyA8PCAiKFBMVCkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0NvbnN0YW50UG9vbEluZGV4OgorICAgIE8gPDwgKkdldENQSVN5bWJvbChNTy5nZXRJbmRleCgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgTyA8PCAqR2V0SlRJU3ltYm9sKE1PLmdldEluZGV4KCkpOworICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50U09JbW0ocmF3X29zdHJlYW0gJk8sIGludDY0X3QgViwgYm9vbCBWZXJib3NlQXNtLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUluZm8gKk1BSSkgeworICAvLyBCcmVhayBpdCB1cCBpbnRvIHR3byBwYXJ0cyB0aGF0IG1ha2UgdXAgYSBzaGlmdGVyIGltbWVkaWF0ZS4KKyAgViA9IEFSTV9BTTo6Z2V0U09JbW1WYWwoVik7CisgIGFzc2VydChWICE9IC0xICYmICJOb3QgYSB2YWxpZCBzb19pbW0gdmFsdWUhIik7CisKKyAgdW5zaWduZWQgSW1tID0gQVJNX0FNOjpnZXRTT0ltbVZhbEltbShWKTsKKyAgdW5zaWduZWQgUm90ID0gQVJNX0FNOjpnZXRTT0ltbVZhbFJvdChWKTsKKworICAvLyBQcmludCBsb3ctbGV2ZWwgaW1tZWRpYXRlIGZvcm1hdGlvbiBpbmZvLCBwZXIKKyAgLy8gQTUuMS4zOiAiRGF0YS1wcm9jZXNzaW5nIG9wZXJhbmRzIC0gSW1tZWRpYXRlIi4KKyAgaWYgKFJvdCkgeworICAgIE8gPDwgIiMiIDw8IEltbSA8PCAiLCAiIDw8IFJvdDsKKyAgICAvLyBQcmV0dHkgcHJpbnRlZCB2ZXJzaW9uLgorICAgIGlmIChWZXJib3NlQXNtKSB7CisgICAgICBPIDw8ICJcdCIgPDwgTUFJLT5nZXRDb21tZW50U3RyaW5nKCkgPDwgJyAnOworICAgICAgTyA8PCAoaW50KUFSTV9BTTo6cm90cjMyKEltbSwgUm90KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgTyA8PCAiIyIgPDwgSW1tOworICB9Cit9CisKKy8vLyBwcmludFNPSW1tT3BlcmFuZCAtIFNPSW1tIGlzIDQtYml0IHJvdGF0ZSBhbW91bnQgaW4gYml0cyA4LTExIHdpdGggOC1iaXQKKy8vLyBpbW1lZGlhdGUgaW4gYml0cyAwLTcuCit2b2lkIEFSTUFzbVByaW50ZXI6OnByaW50U09JbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBhc3NlcnQoTU8uaXNJbW0oKSAmJiAiTm90IGEgdmFsaWQgc29faW1tIHZhbHVlISIpOworICBwcmludFNPSW1tKE8sIE1PLmdldEltbSgpLCBpc1ZlcmJvc2UoKSwgTUFJKTsKK30KKworLy8vIHByaW50U09JbW0yUGFydE9wZXJhbmQgLSBTT0ltbSBpcyBicm9rZW4gaW50byB0d28gcGllY2VzIHVzaW5nIGEgJ21vdicKKy8vLyBmb2xsb3dlZCBieSBhbiAnb3JyJyB0byBtYXRlcmlhbGl6ZS4KK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRTT0ltbTJQYXJ0T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBhc3NlcnQoTU8uaXNJbW0oKSAmJiAiTm90IGEgdmFsaWQgc29faW1tIHZhbHVlISIpOworICB1bnNpZ25lZCBWMSA9IEFSTV9BTTo6Z2V0U09JbW1Ud29QYXJ0Rmlyc3QoTU8uZ2V0SW1tKCkpOworICB1bnNpZ25lZCBWMiA9IEFSTV9BTTo6Z2V0U09JbW1Ud29QYXJ0U2Vjb25kKE1PLmdldEltbSgpKTsKKyAgcHJpbnRTT0ltbShPLCBWMSwgaXNWZXJib3NlKCksIE1BSSk7CisgIE8gPDwgIlxuXHRvcnIiOworICBwcmludFByZWRpY2F0ZU9wZXJhbmQoTUksIDIsIE8pOworICBPIDw8ICJcdCI7CisgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7CisgIE8gPDwgIiwgIjsKKyAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsKKyAgTyA8PCAiLCAiOworICBwcmludFNPSW1tKE8sIFYyLCBpc1ZlcmJvc2UoKSwgTUFJKTsKK30KKworLy8gc29fcmVnIGlzIGEgNC1vcGVyYW5kIHVuaXQgY29ycmVzcG9uZGluZyB0byByZWdpc3RlciBmb3JtcyBvZiB0aGUgQTUuMQorLy8gIkFkZHJlc3NpbmcgTW9kZSAxIC0gRGF0YS1wcm9jZXNzaW5nIG9wZXJhbmRzIiBmb3Jtcy4gIFRoaXMgaW5jbHVkZXM6CisvLyAgICBSRUcgMCAgIDAgICAgICAgICAgIC0gZS5nLiBSNQorLy8gICAgUkVHIFJFRyAwLFNIX09QQyAgICAtIGUuZy4gUjUsIFJPUiBSMworLy8gICAgUkVHIDAgICBJTU0sU0hfT1BDICAtIGUuZy4gUjUsIExTTCAjMwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludFNPUmVnT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcCk7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcCsxKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMyA9IE1JLT5nZXRPcGVyYW5kKE9wKzIpOworCisgIE8gPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisKKyAgLy8gUHJpbnQgdGhlIHNoaWZ0IG9wYy4KKyAgQVJNX0FNOjpTaGlmdE9wYyBTaE9wYyA9IEFSTV9BTTo6Z2V0U09SZWdTaE9wKE1PMy5nZXRJbW0oKSk7CisgIE8gPDwgIiwgIiA8PCBBUk1fQU06OmdldFNoaWZ0T3BjU3RyKFNoT3BjKTsKKyAgaWYgKE1PMi5nZXRSZWcoKSkgeworICAgIE8gPDwgJyAnIDw8IGdldFJlZ2lzdGVyTmFtZShNTzIuZ2V0UmVnKCkpOworICAgIGFzc2VydChBUk1fQU06OmdldFNPUmVnT2Zmc2V0KE1PMy5nZXRJbW0oKSkgPT0gMCk7CisgIH0gZWxzZSBpZiAoU2hPcGMgIT0gQVJNX0FNOjpycngpIHsKKyAgICBPIDw8ICIgIyIgPDwgQVJNX0FNOjpnZXRTT1JlZ09mZnNldChNTzMuZ2V0SW1tKCkpOworICB9Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRBZGRyTW9kZTJPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcCk7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcCsxKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMyA9IE1JLT5nZXRPcGVyYW5kKE9wKzIpOworCisgIGlmICghTU8xLmlzUmVnKCkpIHsgICAvLyBGSVhNRTogVGhpcyBpcyBmb3IgQ1AgZW50cmllcywgYnV0IGlzbid0IHJpZ2h0LgorICAgIHByaW50T3BlcmFuZChNSSwgT3AsIE8pOworICAgIHJldHVybjsKKyAgfQorCisgIE8gPDwgIlsiIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpOworCisgIGlmICghTU8yLmdldFJlZygpKSB7CisgICAgaWYgKEFSTV9BTTo6Z2V0QU0yT2Zmc2V0KE1PMy5nZXRJbW0oKSkpIC8vIERvbid0IHByaW50ICswLgorICAgICAgTyA8PCAiLCAjIgorICAgICAgICA8PCBBUk1fQU06OmdldEFkZHJPcGNTdHIoQVJNX0FNOjpnZXRBTTJPcChNTzMuZ2V0SW1tKCkpKQorICAgICAgICA8PCBBUk1fQU06OmdldEFNMk9mZnNldChNTzMuZ2V0SW1tKCkpOworICAgIE8gPDwgIl0iOworICAgIHJldHVybjsKKyAgfQorCisgIE8gPDwgIiwgIgorICAgIDw8IEFSTV9BTTo6Z2V0QWRkck9wY1N0cihBUk1fQU06OmdldEFNMk9wKE1PMy5nZXRJbW0oKSkpCisgICAgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMi5nZXRSZWcoKSk7CisKKyAgaWYgKHVuc2lnbmVkIFNoSW1tID0gQVJNX0FNOjpnZXRBTTJPZmZzZXQoTU8zLmdldEltbSgpKSkKKyAgICBPIDw8ICIsICIKKyAgICAgIDw8IEFSTV9BTTo6Z2V0U2hpZnRPcGNTdHIoQVJNX0FNOjpnZXRBTTJTaGlmdE9wYyhNTzMuZ2V0SW1tKCkpKQorICAgICAgPDwgIiAjIiA8PCBTaEltbTsKKyAgTyA8PCAiXSI7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRBZGRyTW9kZTJPZmZzZXRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcCk7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcCsxKTsKKworICBpZiAoIU1PMS5nZXRSZWcoKSkgeworICAgIHVuc2lnbmVkIEltbU9mZnMgPSBBUk1fQU06OmdldEFNMk9mZnNldChNTzIuZ2V0SW1tKCkpOworICAgIE8gPDwgIiMiCisgICAgICA8PCBBUk1fQU06OmdldEFkZHJPcGNTdHIoQVJNX0FNOjpnZXRBTTJPcChNTzIuZ2V0SW1tKCkpKQorICAgICAgPDwgSW1tT2ZmczsKKyAgICByZXR1cm47CisgIH0KKworICBPIDw8IEFSTV9BTTo6Z2V0QWRkck9wY1N0cihBUk1fQU06OmdldEFNMk9wKE1PMi5nZXRJbW0oKSkpCisgICAgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisKKyAgaWYgKHVuc2lnbmVkIFNoSW1tID0gQVJNX0FNOjpnZXRBTTJPZmZzZXQoTU8yLmdldEltbSgpKSkKKyAgICBPIDw8ICIsICIKKyAgICAgIDw8IEFSTV9BTTo6Z2V0U2hpZnRPcGNTdHIoQVJNX0FNOjpnZXRBTTJTaGlmdE9wYyhNTzIuZ2V0SW1tKCkpKQorICAgICAgPDwgIiAjIiA8PCBTaEltbTsKK30KKwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludEFkZHJNb2RlM09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wKzEpOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8zID0gTUktPmdldE9wZXJhbmQoT3ArMik7CisKKyAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKE1PMS5nZXRSZWcoKSkpOworICBPIDw8ICJbIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKworICBpZiAoTU8yLmdldFJlZygpKSB7CisgICAgTyA8PCAiLCAiCisgICAgICA8PCAoY2hhcilBUk1fQU06OmdldEFNM09wKE1PMy5nZXRJbW0oKSkKKyAgICAgIDw8IGdldFJlZ2lzdGVyTmFtZShNTzIuZ2V0UmVnKCkpCisgICAgICA8PCAiXSI7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHVuc2lnbmVkIEltbU9mZnMgPSBBUk1fQU06OmdldEFNM09mZnNldChNTzMuZ2V0SW1tKCkpKQorICAgIE8gPDwgIiwgIyIKKyAgICAgIDw8IEFSTV9BTTo6Z2V0QWRkck9wY1N0cihBUk1fQU06OmdldEFNM09wKE1PMy5nZXRJbW0oKSkpCisgICAgICA8PCBJbW1PZmZzOworICBPIDw8ICJdIjsKK30KKwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludEFkZHJNb2RlM09mZnNldE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8peworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3ApOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3ArMSk7CisKKyAgaWYgKE1PMS5nZXRSZWcoKSkgeworICAgIE8gPDwgKGNoYXIpQVJNX0FNOjpnZXRBTTNPcChNTzIuZ2V0SW1tKCkpCisgICAgICA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKyAgICByZXR1cm47CisgIH0KKworICB1bnNpZ25lZCBJbW1PZmZzID0gQVJNX0FNOjpnZXRBTTNPZmZzZXQoTU8yLmdldEltbSgpKTsKKyAgTyA8PCAiIyIKKyAgICA8PCBBUk1fQU06OmdldEFkZHJPcGNTdHIoQVJNX0FNOjpnZXRBTTNPcChNTzIuZ2V0SW1tKCkpKQorICAgIDw8IEltbU9mZnM7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRBZGRyTW9kZTRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXIpIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wKzEpOworICBBUk1fQU06OkFNU3ViTW9kZSBNb2RlID0gQVJNX0FNOjpnZXRBTTRTdWJNb2RlKE1PMi5nZXRJbW0oKSk7CisgIGlmIChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJzdWJtb2RlIikgPT0gMCkgeworICAgIE8gPDwgQVJNX0FNOjpnZXRBTVN1Yk1vZGVTdHIoTW9kZSk7CisgIH0gZWxzZSBpZiAoTW9kaWZpZXIgJiYgc3RyY21wKE1vZGlmaWVyLCAid2lkZSIpID09IDApIHsKKyAgICBBUk1fQU06OkFNU3ViTW9kZSBNb2RlID0gQVJNX0FNOjpnZXRBTTRTdWJNb2RlKE1PMi5nZXRJbW0oKSk7CisgICAgaWYgKE1vZGUgPT0gQVJNX0FNOjppYSkKKyAgICAgIE8gPDwgIi53IjsKKyAgfSBlbHNlIHsKKyAgICBwcmludE9wZXJhbmQoTUksIE9wLCBPKTsKKyAgfQorfQorCit2b2lkIEFSTUFzbVByaW50ZXI6OnByaW50QWRkck1vZGU1T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcCk7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcCsxKTsKKworICBpZiAoIU1PMS5pc1JlZygpKSB7ICAgLy8gRklYTUU6IFRoaXMgaXMgZm9yIENQIGVudHJpZXMsIGJ1dCBpc24ndCByaWdodC4KKyAgICBwcmludE9wZXJhbmQoTUksIE9wLCBPKTsKKyAgICByZXR1cm47CisgIH0KKworICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoTU8xLmdldFJlZygpKSk7CisKKyAgaWYgKE1vZGlmaWVyICYmIHN0cmNtcChNb2RpZmllciwgInN1Ym1vZGUiKSA9PSAwKSB7CisgICAgQVJNX0FNOjpBTVN1Yk1vZGUgTW9kZSA9IEFSTV9BTTo6Z2V0QU01U3ViTW9kZShNTzIuZ2V0SW1tKCkpOworICAgIE8gPDwgQVJNX0FNOjpnZXRBTVN1Yk1vZGVTdHIoTW9kZSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKE1vZGlmaWVyICYmIHN0cmNtcChNb2RpZmllciwgImJhc2UiKSA9PSAwKSB7CisgICAgLy8gVXNlZCBmb3IgRlNUTXtEfFN9IGFuZCBMU1RNe0R8U30gb3BlcmF0aW9ucy4KKyAgICBPIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIE8gPDwgIlsiIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpOworCisgIGlmICh1bnNpZ25lZCBJbW1PZmZzID0gQVJNX0FNOjpnZXRBTTVPZmZzZXQoTU8yLmdldEltbSgpKSkgeworICAgIE8gPDwgIiwgIyIKKyAgICAgIDw8IEFSTV9BTTo6Z2V0QWRkck9wY1N0cihBUk1fQU06OmdldEFNNU9wKE1PMi5nZXRJbW0oKSkpCisgICAgICA8PCBJbW1PZmZzKjQ7CisgIH0KKyAgTyA8PCAiXSI7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRBZGRyTW9kZTZPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcCk7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcCsxKTsKKworICBPIDw8ICJbIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKyAgaWYgKE1PMi5nZXRJbW0oKSkgeworICAgIC8vIEZJWE1FOiBCb3RoIGRhcndpbiBhcyBhbmQgR05VIGFzIHZpb2xhdGUgQVJNIGRvY3MgaGVyZS4KKyAgICBPIDw8ICIsIDoiIDw8IChNTzIuZ2V0SW1tKCkgPDwgMyk7CisgIH0KKyAgTyA8PCAiXSI7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRBZGRyTW9kZTZPZmZzZXRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKXsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3ApOworICBpZiAoTU8uZ2V0UmVnKCkgPT0gMCkKKyAgICBPIDw8ICIhIjsKKyAgZWxzZQorICAgIE8gPDwgIiwgIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8uZ2V0UmVnKCkpOworfQorCit2b2lkIEFSTUFzbVByaW50ZXI6OnByaW50QWRkck1vZGVQQ09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyKSB7CisgIGlmIChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJsYWJlbCIpID09IDApIHsKKyAgICBwcmludFBDTGFiZWwoTUksIE9wKzEsIE8pOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcCk7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihNTzEuZ2V0UmVnKCkpKTsKKyAgTyA8PCAiW3BjLCAiIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpIDw8ICJdIjsKK30KKwordm9pZAorQVJNQXNtUHJpbnRlcjo6cHJpbnRCaXRmaWVsZEludk1hc2tJbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChPcCk7CisgIHVpbnQzMl90IHYgPSB+TU8uZ2V0SW1tKCk7CisgIGludDMyX3QgbHNiID0gQ291bnRUcmFpbGluZ1plcm9zXzMyKHYpOworICBpbnQzMl90IHdpZHRoID0gKDMyIC0gQ291bnRMZWFkaW5nWmVyb3NfMzIgKHYpKSAtIGxzYjsKKyAgYXNzZXJ0KE1PLmlzSW1tKCkgJiYgIk5vdCBhIHZhbGlkIGJmX2ludl9tYXNrX2ltbSB2YWx1ZSEiKTsKKyAgTyA8PCAiIyIgPDwgbHNiIDw8ICIsICMiIDw8IHdpZHRoOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludFRodW1iUzRJbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBPIDw8ICIjIiA8PCAgTUktPmdldE9wZXJhbmQoT3ApLmdldEltbSgpICogNDsKK30KKwordm9pZAorQVJNQXNtUHJpbnRlcjo6cHJpbnRUaHVtYklUTWFzayhjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIC8vICgzIC0gdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvcykgaXMgdGhlIG51bWJlciBvZiB0aGVuIC8gZWxzZS4KKyAgdW5zaWduZWQgTWFzayA9IE1JLT5nZXRPcGVyYW5kKE9wKS5nZXRJbW0oKTsKKyAgdW5zaWduZWQgQ29uZEJpdDAgPSBNYXNrID4+IDQgJiAxOworICB1bnNpZ25lZCBOdW1UWiA9IENvdW50VHJhaWxpbmdaZXJvc18zMihNYXNrKTsKKyAgYXNzZXJ0KE51bVRaIDw9IDMgJiYgIkludmFsaWQgSVQgbWFzayEiKTsKKyAgZm9yICh1bnNpZ25lZCBQb3MgPSAzLCBlID0gTnVtVFo7IFBvcyA+IGU7IC0tUG9zKSB7CisgICAgYm9vbCBUID0gKChNYXNrID4+IFBvcykgJiAxKSA9PSBDb25kQml0MDsKKyAgICBpZiAoVCkKKyAgICAgIE8gPDwgJ3QnOworICAgIGVsc2UKKyAgICAgIE8gPDwgJ2UnOworICB9Cit9CisKK3ZvaWQKK0FSTUFzbVByaW50ZXI6OnByaW50VGh1bWJBZGRyTW9kZVJST3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wKzEpOworICBPIDw8ICJbIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKyAgTyA8PCAiLCAiIDw8IGdldFJlZ2lzdGVyTmFtZShNTzIuZ2V0UmVnKCkpIDw8ICJdIjsKK30KKwordm9pZAorQVJNQXNtUHJpbnRlcjo6cHJpbnRUaHVtYkFkZHJNb2RlUkk1T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTY2FsZSkgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3ApOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3ArMSk7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzMgPSBNSS0+Z2V0T3BlcmFuZChPcCsyKTsKKworICBpZiAoIU1PMS5pc1JlZygpKSB7ICAgLy8gRklYTUU6IFRoaXMgaXMgZm9yIENQIGVudHJpZXMsIGJ1dCBpc24ndCByaWdodC4KKyAgICBwcmludE9wZXJhbmQoTUksIE9wLCBPKTsKKyAgICByZXR1cm47CisgIH0KKworICBPIDw8ICJbIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKyAgaWYgKE1PMy5nZXRSZWcoKSkKKyAgICBPIDw8ICIsICIgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMy5nZXRSZWcoKSk7CisgIGVsc2UgaWYgKHVuc2lnbmVkIEltbU9mZnMgPSBNTzIuZ2V0SW1tKCkpCisgICAgTyA8PCAiLCAjIiA8PCBJbW1PZmZzICogU2NhbGU7CisgIE8gPDwgIl0iOworfQorCit2b2lkCitBUk1Bc21QcmludGVyOjpwcmludFRodW1iQWRkck1vZGVTMU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIHByaW50VGh1bWJBZGRyTW9kZVJJNU9wZXJhbmQoTUksIE9wLCBPLCAxKTsKK30KK3ZvaWQKK0FSTUFzbVByaW50ZXI6OnByaW50VGh1bWJBZGRyTW9kZVMyT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgcHJpbnRUaHVtYkFkZHJNb2RlUkk1T3BlcmFuZChNSSwgT3AsIE8sIDIpOworfQordm9pZAorQVJNQXNtUHJpbnRlcjo6cHJpbnRUaHVtYkFkZHJNb2RlUzRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBwcmludFRodW1iQWRkck1vZGVSSTVPcGVyYW5kKE1JLCBPcCwgTywgNCk7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRUaHVtYkFkZHJNb2RlU1BPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksaW50IE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wKzEpOworICBPIDw8ICJbIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKyAgaWYgKHVuc2lnbmVkIEltbU9mZnMgPSBNTzIuZ2V0SW1tKCkpCisgICAgTyA8PCAiLCAjIiA8PCBJbW1PZmZzKjQ7CisgIE8gPDwgIl0iOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gQ29uc3RhbnQgc2hpZnRzIHQyX3NvX3JlZyBpcyBhIDItb3BlcmFuZCB1bml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFRodW1iMgorLy8gcmVnaXN0ZXIgd2l0aCBzaGlmdCBmb3Jtcy4KKy8vIFJFRyAwICAgMCAgICAgICAgICAgLSBlLmcuIFI1CisvLyBSRUcgSU1NLCBTSF9PUEMgICAgIC0gZS5nLiBSNSwgTFNMICMzCit2b2lkIEFSTUFzbVByaW50ZXI6OnByaW50VDJTT09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSsxKTsKKworICB1bnNpZ25lZCBSZWcgPSBNTzEuZ2V0UmVnKCk7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpKTsKKyAgTyA8PCBnZXRSZWdpc3Rlck5hbWUoUmVnKTsKKworICAvLyBQcmludCB0aGUgc2hpZnQgb3BjLgorICBhc3NlcnQoTU8yLmlzSW1tKCkgJiYgIk5vdCBhIHZhbGlkIHQyX3NvX3JlZyB2YWx1ZSEiKTsKKyAgQVJNX0FNOjpTaGlmdE9wYyBTaE9wYyA9IEFSTV9BTTo6Z2V0U09SZWdTaE9wKE1PMi5nZXRJbW0oKSk7CisgIE8gPDwgIiwgIiA8PCBBUk1fQU06OmdldFNoaWZ0T3BjU3RyKFNoT3BjKTsKKyAgaWYgKFNoT3BjICE9IEFSTV9BTTo6cnJ4KQorICAgIE8gPDwgIiAjIiA8PCBBUk1fQU06OmdldFNPUmVnT2Zmc2V0KE1PMi5nZXRJbW0oKSk7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRUMkFkZHJNb2RlSW1tMTJPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7CisKKyAgTyA8PCAiWyIgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisKKyAgdW5zaWduZWQgT2ZmSW1tID0gTU8yLmdldEltbSgpOworICBpZiAoT2ZmSW1tKSAgLy8gRG9uJ3QgcHJpbnQgKzAuCisgICAgTyA8PCAiLCAjIiA8PCBPZmZJbW07CisgIE8gPDwgIl0iOworfQorCit2b2lkIEFSTUFzbVByaW50ZXI6OnByaW50VDJBZGRyTW9kZUltbThPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKzEpOworCisgIE8gPDwgIlsiIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpOworCisgIGludDMyX3QgT2ZmSW1tID0gKGludDMyX3QpTU8yLmdldEltbSgpOworICAvLyBEb24ndCBwcmludCArMC4KKyAgaWYgKE9mZkltbSA8IDApCisgICAgTyA8PCAiLCAjLSIgPDwgLU9mZkltbTsKKyAgZWxzZSBpZiAoT2ZmSW1tID4gMCkKKyAgICBPIDw8ICIsICMiIDw8IE9mZkltbTsKKyAgTyA8PCAiXSI7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRUMkFkZHJNb2RlSW1tOHM0T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7CisKKyAgTyA8PCAiWyIgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisKKyAgaW50MzJfdCBPZmZJbW0gPSAoaW50MzJfdClNTzIuZ2V0SW1tKCkgLyA0OworICAvLyBEb24ndCBwcmludCArMC4KKyAgaWYgKE9mZkltbSA8IDApCisgICAgTyA8PCAiLCAjLSIgPDwgLU9mZkltbSAqIDQ7CisgIGVsc2UgaWYgKE9mZkltbSA+IDApCisgICAgTyA8PCAiLCAjIiA8PCBPZmZJbW0gKiA0OworICBPIDw8ICJdIjsKK30KKwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludFQyQWRkck1vZGVJbW04T2Zmc2V0T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIGludDMyX3QgT2ZmSW1tID0gKGludDMyX3QpTU8xLmdldEltbSgpOworICAvLyBEb24ndCBwcmludCArMC4KKyAgaWYgKE9mZkltbSA8IDApCisgICAgTyA8PCAiIy0iIDw8IC1PZmZJbW07CisgIGVsc2UgaWYgKE9mZkltbSA+IDApCisgICAgTyA8PCAiIyIgPDwgT2ZmSW1tOworfQorCit2b2lkIEFSTUFzbVByaW50ZXI6OnByaW50VDJBZGRyTW9kZVNvUmVnT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKzEpOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8zID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMik7CisKKyAgTyA8PCAiWyIgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisKKyAgYXNzZXJ0KE1PMi5nZXRSZWcoKSAmJiAiSW52YWxpZCBzb19yZWcgbG9hZCAvIHN0b3JlIGFkZHJlc3MhIik7CisgIE8gPDwgIiwgIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8yLmdldFJlZygpKTsKKworICB1bnNpZ25lZCBTaEFtdCA9IE1PMy5nZXRJbW0oKTsKKyAgaWYgKFNoQW10KSB7CisgICAgYXNzZXJ0KFNoQW10IDw9IDMgJiYgIk5vdCBhIHZhbGlkIFRodW1iMiBhZGRyZXNzaW5nIG1vZGUhIik7CisgICAgTyA8PCAiLCBsc2wgIyIgPDwgU2hBbXQ7CisgIH0KKyAgTyA8PCAiXSI7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRQcmVkaWNhdGVPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIEFSTUNDOjpDb25kQ29kZXMgQ0MgPSAoQVJNQ0M6OkNvbmRDb2RlcylNSS0+Z2V0T3BlcmFuZChPcE51bSkuZ2V0SW1tKCk7CisgIGlmIChDQyAhPSBBUk1DQzo6QUwpCisgICAgTyA8PCBBUk1Db25kQ29kZVRvU3RyaW5nKENDKTsKK30KKwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludE1hbmRhdG9yeVByZWRpY2F0ZU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIEFSTUNDOjpDb25kQ29kZXMgQ0MgPSAoQVJNQ0M6OkNvbmRDb2RlcylNSS0+Z2V0T3BlcmFuZChPcE51bSkuZ2V0SW1tKCk7CisgIE8gPDwgQVJNQ29uZENvZGVUb1N0cmluZyhDQyk7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRTQml0TW9kaWZpZXJPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKXsKKyAgdW5zaWduZWQgUmVnID0gTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldFJlZygpOworICBpZiAoUmVnKSB7CisgICAgYXNzZXJ0KFJlZyA9PSBBUk06OkNQU1IgJiYgIkV4cGVjdCBBUk0gQ1BTUiByZWdpc3RlciEiKTsKKyAgICBPIDw8ICdzJzsKKyAgfQorfQorCit2b2lkIEFSTUFzbVByaW50ZXI6OnByaW50UENMYWJlbChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBpbnQgSWQgPSAoaW50KU1JLT5nZXRPcGVyYW5kKE9wTnVtKS5nZXRJbW0oKTsKKyAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKQorICAgIDw8ICJQQyIgPDwgZ2V0RnVuY3Rpb25OdW1iZXIoKSA8PCAiXyIgPDwgSWQ7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRSZWdpc3Rlckxpc3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBPIDw8ICJ7IjsKKyAgZm9yICh1bnNpZ25lZCBpID0gT3BOdW0sIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoTUktPmdldE9wZXJhbmQoaSkuaXNJbXBsaWNpdCgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKChpbnQpaSAhPSBPcE51bSkgTyA8PCAiLCAiOworICAgIHByaW50T3BlcmFuZChNSSwgaSwgTyk7CisgIH0KKyAgTyA8PCAifSI7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRDUEluc3RPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPLCBjb25zdCBjaGFyICpNb2RpZmllcikgeworICBhc3NlcnQoTW9kaWZpZXIgJiYgIlRoaXMgb3BlcmFuZCBvbmx5IHdvcmtzIHdpdGggYSBtb2RpZmllciEiKTsKKyAgLy8gVGhlcmUgYXJlIHR3byBhc3BlY3RzIHRvIGEgQ09OU1RBTlRQT09MX0VOVFJZIG9wZXJhbmQsIHRoZSBsYWJlbCBhbmQgdGhlCisgIC8vIGRhdGEgaXRzZWxmLgorICBpZiAoIXN0cmNtcChNb2RpZmllciwgImxhYmVsIikpIHsKKyAgICB1bnNpZ25lZCBJRCA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKS5nZXRJbW0oKTsKKyAgICBPdXRTdHJlYW1lci5FbWl0TGFiZWwoR2V0Q1BJU3ltYm9sKElEKSk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KCFzdHJjbXAoTW9kaWZpZXIsICJjcGVudHJ5IikgJiYgIlVua25vd24gbW9kaWZpZXIgZm9yIENQRSIpOworICAgIHVuc2lnbmVkIENQSSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKS5nZXRJbmRleCgpOworCisgICAgY29uc3QgTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5ICZNQ1BFID0gTUNQLT5nZXRDb25zdGFudHMoKVtDUEldOworCisgICAgaWYgKE1DUEUuaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSkgeworICAgICAgRW1pdE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZShNQ1BFLlZhbC5NYWNoaW5lQ1BWYWwpOworICAgIH0gZWxzZSB7CisgICAgICBFbWl0R2xvYmFsQ29uc3RhbnQoTUNQRS5WYWwuQ29uc3RWYWwpOworICAgIH0KKyAgfQorfQorCitNQ1N5bWJvbCAqQVJNQXNtUHJpbnRlcjo6CitHZXRBUk1TZXRQSUNKdW1wVGFibGVMYWJlbDIodW5zaWduZWQgdWlkLCB1bnNpZ25lZCB1aWQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0IHsKKyAgU21hbGxTdHJpbmc8NjA+IE5hbWU7CisgIHJhd19zdmVjdG9yX29zdHJlYW0oTmFtZSkgPDwgTUFJLT5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCkKKyAgICA8PCBnZXRGdW5jdGlvbk51bWJlcigpIDw8ICdfJyA8PCB1aWQgPDwgJ18nIDw8IHVpZDIKKyAgICA8PCAiX3NldF8iIDw8IE1CQi0+Z2V0TnVtYmVyKCk7CisgIHJldHVybiBPdXRDb250ZXh0LkdldE9yQ3JlYXRlU3ltYm9sKE5hbWUuc3RyKCkpOworfQorCitNQ1N5bWJvbCAqQVJNQXNtUHJpbnRlcjo6CitHZXRBUk1KVElQSUNKdW1wVGFibGVMYWJlbDIodW5zaWduZWQgdWlkLCB1bnNpZ25lZCB1aWQyKSBjb25zdCB7CisgIFNtYWxsU3RyaW5nPDYwPiBOYW1lOworICByYXdfc3ZlY3Rvcl9vc3RyZWFtKE5hbWUpIDw8IE1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJKVEkiCisgICAgPDwgZ2V0RnVuY3Rpb25OdW1iZXIoKSA8PCAnXycgPDwgdWlkIDw8ICdfJyA8PCB1aWQyOworICByZXR1cm4gT3V0Q29udGV4dC5HZXRPckNyZWF0ZVN5bWJvbChOYW1lLnN0cigpKTsKK30KKwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludEpUQmxvY2tPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBhc3NlcnQoIVN1YnRhcmdldC0+aXNUaHVtYjIoKSAmJiAiVGh1bWIyIHNob3VsZCB1c2UgZG91YmxlLWp1bXAganVtcHRhYmxlcyEiKTsKKworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7IC8vIFVuaXF1ZSBJZAorICAKKyAgdW5zaWduZWQgSlRJID0gTU8xLmdldEluZGV4KCk7CisgIE1DU3ltYm9sICpKVElTeW1ib2wgPSBHZXRBUk1KVElQSUNKdW1wVGFibGVMYWJlbDIoSlRJLCBNTzIuZ2V0SW1tKCkpOworICAvLyBDYW4ndCB1c2UgRW1pdExhYmVsIHVudGlsIGluc3RwcmludGVyIGhhcHBlbnMsIGxhYmVsIGNvbWVzIG91dCBpbiB0aGUgd3JvbmcKKyAgLy8gb3JkZXIuCisgIE8gPDwgIlxuIiA8PCAqSlRJU3ltYm9sIDw8ICI6XG4iOworCisgIGNvbnN0IGNoYXIgKkpURW50cnlEaXJlY3RpdmUgPSBNQUktPmdldERhdGEzMmJpdHNEaXJlY3RpdmUoKTsKKworICBjb25zdCBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqTUpUSSA9IE1GLT5nZXRKdW1wVGFibGVJbmZvKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gJkpUID0gTUpUSS0+Z2V0SnVtcFRhYmxlcygpOworICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+ICZKVEJCcyA9IEpUW0pUSV0uTUJCczsKKyAgYm9vbCBVc2VTZXQ9IE1BSS0+aGFzU2V0RGlyZWN0aXZlKCkgJiYgVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ187CisgIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwgOD4gSlRTZXRzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSlRCQnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBKVEJCc1tpXTsKKyAgICBib29sIGlzTmV3ID0gSlRTZXRzLmluc2VydChNQkIpOworCisgICAgaWYgKFVzZVNldCAmJiBpc05ldykgeworICAgICAgTyA8PCAiXHQuc2V0XHQiCisgICAgICAgIDw8ICpHZXRBUk1TZXRQSUNKdW1wVGFibGVMYWJlbDIoSlRJLCBNTzIuZ2V0SW1tKCksIE1CQikgPDwgJywnCisgICAgICAgIDw8ICpNQkItPmdldFN5bWJvbCgpIDw8ICctJyA8PCAqSlRJU3ltYm9sIDw8ICdcbic7CisgICAgfQorCisgICAgTyA8PCBKVEVudHJ5RGlyZWN0aXZlIDw8ICcgJzsKKyAgICBpZiAoVXNlU2V0KQorICAgICAgTyA8PCAqR2V0QVJNU2V0UElDSnVtcFRhYmxlTGFiZWwyKEpUSSwgTU8yLmdldEltbSgpLCBNQkIpOworICAgIGVsc2UgaWYgKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKQorICAgICAgTyA8PCAqTUJCLT5nZXRTeW1ib2woKSA8PCAnLScgPDwgKkpUSVN5bWJvbDsKKyAgICBlbHNlCisgICAgICBPIDw8ICpNQkItPmdldFN5bWJvbCgpOworCisgICAgaWYgKGkgIT0gZS0xKQorICAgICAgTyA8PCAnXG4nOworICB9Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRKVDJCbG9ja09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7IC8vIFVuaXF1ZSBJZAorICB1bnNpZ25lZCBKVEkgPSBNTzEuZ2V0SW5kZXgoKTsKKyAgCisgIE1DU3ltYm9sICpKVElTeW1ib2wgPSBHZXRBUk1KVElQSUNKdW1wVGFibGVMYWJlbDIoSlRJLCBNTzIuZ2V0SW1tKCkpOworICAKKyAgLy8gQ2FuJ3QgdXNlIEVtaXRMYWJlbCB1bnRpbCBpbnN0cHJpbnRlciBoYXBwZW5zLCBsYWJlbCBjb21lcyBvdXQgaW4gdGhlIHdyb25nCisgIC8vIG9yZGVyLgorICBPIDw8ICJcbiIgPDwgKkpUSVN5bWJvbCA8PCAiOlxuIjsKKworICBjb25zdCBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqTUpUSSA9IE1GLT5nZXRKdW1wVGFibGVJbmZvKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gJkpUID0gTUpUSS0+Z2V0SnVtcFRhYmxlcygpOworICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+ICZKVEJCcyA9IEpUW0pUSV0uTUJCczsKKyAgYm9vbCBCeXRlT2Zmc2V0ID0gZmFsc2UsIEhhbGZXb3JkT2Zmc2V0ID0gZmFsc2U7CisgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0MlRCQikKKyAgICBCeXRlT2Zmc2V0ID0gdHJ1ZTsKKyAgZWxzZSBpZiAoTUktPmdldE9wY29kZSgpID09IEFSTTo6dDJUQkgpCisgICAgSGFsZldvcmRPZmZzZXQgPSB0cnVlOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBKVEJCcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IEpUQkJzW2ldOworICAgIGlmIChCeXRlT2Zmc2V0KQorICAgICAgTyA8PCBNQUktPmdldERhdGE4Yml0c0RpcmVjdGl2ZSgpOworICAgIGVsc2UgaWYgKEhhbGZXb3JkT2Zmc2V0KQorICAgICAgTyA8PCBNQUktPmdldERhdGExNmJpdHNEaXJlY3RpdmUoKTsKKyAgICAKKyAgICBpZiAoQnl0ZU9mZnNldCB8fCBIYWxmV29yZE9mZnNldCkKKyAgICAgIE8gPDwgJygnIDw8ICpNQkItPmdldFN5bWJvbCgpIDw8ICItIiA8PCAqSlRJU3ltYm9sIDw8ICIpLzIiOworICAgIGVsc2UKKyAgICAgIE8gPDwgIlx0Yi53ICIgPDwgKk1CQi0+Z2V0U3ltYm9sKCk7CisKKyAgICBpZiAoaSAhPSBlLTEpCisgICAgICBPIDw8ICdcbic7CisgIH0KK30KKwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludFRCQWRkck1vZGUoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgTyA8PCAiW3BjLCAiIDw8IGdldFJlZ2lzdGVyTmFtZShNSS0+Z2V0T3BlcmFuZChPcE51bSkuZ2V0UmVnKCkpOworICBpZiAoTUktPmdldE9wY29kZSgpID09IEFSTTo6dDJUQkgpCisgICAgTyA8PCAiLCBsc2wgIzEiOworICBPIDw8ICddJzsKK30KKwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludE5vSGFzaEltbWVkaWF0ZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIE8gPDwgTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldEltbSgpOworfQorCit2b2lkIEFSTUFzbVByaW50ZXI6OnByaW50VkZQZjMySW1tT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBDb25zdGFudEZQICpGUCA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKS5nZXRGUEltbSgpOworICBPIDw8ICcjJyA8PCBGUC0+Z2V0VmFsdWVBUEYoKS5jb252ZXJ0VG9GbG9hdCgpOworICBpZiAoaXNWZXJib3NlKCkpIHsKKyAgICBPIDw8ICJcdFx0IiA8PCBNQUktPmdldENvbW1lbnRTdHJpbmcoKSA8PCAnICc7CisgICAgV3JpdGVBc09wZXJhbmQoTywgRlAsIC8qUHJpbnRUeXBlPSovZmFsc2UpOworICB9Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRWRlBmNjRJbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IENvbnN0YW50RlAgKkZQID0gTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldEZQSW1tKCk7CisgIE8gPDwgJyMnIDw8IEZQLT5nZXRWYWx1ZUFQRigpLmNvbnZlcnRUb0RvdWJsZSgpOworICBpZiAoaXNWZXJib3NlKCkpIHsKKyAgICBPIDw8ICJcdFx0IiA8PCBNQUktPmdldENvbW1lbnRTdHJpbmcoKSA8PCAnICc7CisgICAgV3JpdGVBc09wZXJhbmQoTywgRlAsIC8qUHJpbnRUeXBlPSovZmFsc2UpOworICB9Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6cHJpbnRORU9OTW9kSW1tT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgdW5zaWduZWQgRW5jb2RlZEltbSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKS5nZXRJbW0oKTsKKyAgdW5zaWduZWQgRWx0Qml0czsKKyAgdWludDY0X3QgVmFsID0gQVJNX0FNOjpkZWNvZGVORU9OTW9kSW1tKEVuY29kZWRJbW0sIEVsdEJpdHMpOworICBPIDw8ICIjMHgiIDw8IHV0b2hleHN0cihWYWwpOworfQorCitib29sIEFSTUFzbVByaW50ZXI6OlByaW50QXNtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIC8vIERvZXMgdGhpcyBhc20gb3BlcmFuZCBoYXZlIGEgc2luZ2xlIGxldHRlciBvcGVyYW5kIG1vZGlmaWVyPworICBpZiAoRXh0cmFDb2RlICYmIEV4dHJhQ29kZVswXSkgeworICAgIGlmIChFeHRyYUNvZGVbMV0gIT0gMCkgcmV0dXJuIHRydWU7IC8vIFVua25vd24gbW9kaWZpZXIuCisKKyAgICBzd2l0Y2ggKEV4dHJhQ29kZVswXSkgeworICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlOyAgLy8gVW5rbm93biBtb2RpZmllci4KKyAgICBjYXNlICdhJzogLy8gUHJpbnQgYXMgYSBtZW1vcnkgYWRkcmVzcy4KKyAgICAgIGlmIChNSS0+Z2V0T3BlcmFuZChPcE51bSkuaXNSZWcoKSkgeworICAgICAgICBPIDw8ICJbIiA8PCBnZXRSZWdpc3Rlck5hbWUoTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldFJlZygpKSA8PCAiXSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIEZhbGx0aHJvdWdoCisgICAgY2FzZSAnYyc6IC8vIERvbid0IHByaW50ICIjIiBiZWZvcmUgYW4gaW1tZWRpYXRlIG9wZXJhbmQuCisgICAgICBpZiAoIU1JLT5nZXRPcGVyYW5kKE9wTnVtKS5pc0ltbSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHByaW50Tm9IYXNoSW1tZWRpYXRlKE1JLCBPcE51bSwgTyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSAnUCc6IC8vIFByaW50IGEgVkZQIGRvdWJsZSBwcmVjaXNpb24gcmVnaXN0ZXIuCisgICAgY2FzZSAncSc6IC8vIFByaW50IGEgTkVPTiBxdWFkIHByZWNpc2lvbiByZWdpc3Rlci4KKyAgICAgIHByaW50T3BlcmFuZChNSSwgT3BOdW0sIE8pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgJ1EnOgorICAgIGNhc2UgJ1InOgorICAgIGNhc2UgJ0gnOgorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJsbHZtIGRvZXMgbm90IHN1cHBvcnQgJ1EnLCAnUicsIGFuZCAnSCcgbW9kaWZpZXJzISIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcHJpbnRPcGVyYW5kKE1JLCBPcE51bSwgTyk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBUk1Bc21QcmludGVyOjpQcmludEFzbU1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wTnVtLCB1bnNpZ25lZCBBc21WYXJpYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRXh0cmFDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgaWYgKEV4dHJhQ29kZSAmJiBFeHRyYUNvZGVbMF0pCisgICAgcmV0dXJuIHRydWU7IC8vIFVua25vd24gbW9kaWZpZXIuCisKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBhc3NlcnQoTU8uaXNSZWcoKSAmJiAidW5leHBlY3RlZCBpbmxpbmUgYXNtIG1lbW9yeSBvcGVyYW5kIik7CisgIE8gPDwgIlsiIDw8IGdldFJlZ2lzdGVyTmFtZShNTy5nZXRSZWcoKSkgPDwgIl0iOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6RW1pdEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgaWYgKEVuYWJsZU1DSW5zdCkgeworICAgIHByaW50SW5zdHJ1Y3Rpb25UaHJvdWdoTUNTdHJlYW1lcihNSSk7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZiAoTUktPmdldE9wY29kZSgpID09IEFSTTo6Q09OU1RQT09MX0VOVFJZKQorICAgIEVtaXRBbGlnbm1lbnQoMik7CisgIAorICBTbWFsbFN0cmluZzwxMjg+IFN0cjsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhTdHIpOworICBpZiAoTUktPmdldE9wY29kZSgpID09IEFSTTo6REJHX1ZBTFVFKSB7CisgICAgdW5zaWduZWQgTk9wcyA9IE1JLT5nZXROdW1PcGVyYW5kcygpOworICAgIGFzc2VydChOT3BzPT00KTsKKyAgICBPUyA8PCAnXHQnIDw8IE1BSS0+Z2V0Q29tbWVudFN0cmluZygpIDw8ICJERUJVR19WQUxVRTogIjsKKyAgICAvLyBjYXN0IGF3YXkgY29uc3Q7IERJZXRjIGRvIG5vdCB0YWtlIGNvbnN0IG9wZXJhbmRzIGZvciBzb21lIHJlYXNvbi4KKyAgICBESVZhcmlhYmxlIFYoY29uc3RfY2FzdDxNRE5vZGUgKj4oTUktPmdldE9wZXJhbmQoTk9wcy0xKS5nZXRNZXRhZGF0YSgpKSk7CisgICAgT1MgPDwgVi5nZXROYW1lKCk7CisgICAgT1MgPDwgIiA8LSAiOworICAgIC8vIEZyYW1lIGFkZHJlc3MuICBDdXJyZW50bHkgaGFuZGxlcyByZWdpc3RlciArLSBvZmZzZXQgb25seS4KKyAgICBhc3NlcnQoTUktPmdldE9wZXJhbmQoMCkuaXNSZWcoKSAmJiBNSS0+Z2V0T3BlcmFuZCgxKS5pc0ltbSgpKTsKKyAgICBPUyA8PCAnWyc7IHByaW50T3BlcmFuZChNSSwgMCwgT1MpOyBPUyA8PCAnKyc7IHByaW50T3BlcmFuZChNSSwgMSwgT1MpOworICAgIE9TIDw8ICddJzsKKyAgICBPUyA8PCAiKyI7CisgICAgcHJpbnRPcGVyYW5kKE1JLCBOT3BzLTIsIE9TKTsKKyAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChPUy5zdHIoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJpbnRJbnN0cnVjdGlvbihNSSwgT1MpOworICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChPUy5zdHIoKSk7CisgIAorICAvLyBNYWtlIHN1cmUgdGhlIGluc3RydWN0aW9uIHRoYXQgZm9sbG93cyBUQkIgaXMgMi1ieXRlIGFsaWduZWQuCisgIC8vIEZJWE1FOiBDb25zdGFudCBpc2xhbmQgcGFzcyBzaG91bGQgaW5zZXJ0IGFuICJBTElHTiIgaW5zdHJ1Y3Rpb24gaW5zdGVhZC4KKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBBUk06OnQyVEJCKQorICAgIEVtaXRBbGlnbm1lbnQoMSk7Cit9CisKK3ZvaWQgQVJNQXNtUHJpbnRlcjo6RW1pdFN0YXJ0T2ZBc21GaWxlKE1vZHVsZSAmTSkgeworICBpZiAoU3VidGFyZ2V0LT5pc1RhcmdldERhcndpbigpKSB7CisgICAgUmVsb2M6Ok1vZGVsIFJlbG9jTSA9IFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpOworICAgIGlmIChSZWxvY00gPT0gUmVsb2M6OlBJQ18gfHwgUmVsb2NNID09IFJlbG9jOjpEeW5hbWljTm9QSUMpIHsKKyAgICAgIC8vIERlY2xhcmUgYWxsIHRoZSB0ZXh0IHNlY3Rpb25zIHVwIGZyb250IChiZWZvcmUgdGhlIERXQVJGIHNlY3Rpb25zCisgICAgICAvLyBlbWl0dGVkIGJ5IEFzbVByaW50ZXI6OmRvSW5pdGlhbGl6YXRpb24pIHNvIHRoZSBhc3NlbWJsZXIgd2lsbCBrZWVwCisgICAgICAvLyB0aGVtIHRvZ2V0aGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBoZWxwcworICAgICAgLy8gYXZvaWQgb3V0LW9mLXJhbmdlIGJyYW5jaGVzIHRoYXQgYXJlIGR1ZSBhIGZ1bmRhbWVudGFsIGxpbWl0YXRpb24gb2YKKyAgICAgIC8vIHRoZSB3YXkgc3ltYm9sIG9mZnNldHMgYXJlIGVuY29kZWQgd2l0aCB0aGUgY3VycmVudCBEYXJ3aW4gQVJNCisgICAgICAvLyByZWxvY2F0aW9ucy4KKyAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZU1hY2hPICZUTE9GTWFjaG8gPSAKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlTWFjaE8gJj4oCisgICAgICAgICAgZ2V0T2JqRmlsZUxvd2VyaW5nKCkpOworICAgICAgT3V0U3RyZWFtZXIuU3dpdGNoU2VjdGlvbihUTE9GTWFjaG8uZ2V0VGV4dFNlY3Rpb24oKSk7CisgICAgICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKFRMT0ZNYWNoby5nZXRUZXh0Q29hbFNlY3Rpb24oKSk7CisgICAgICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKFRMT0ZNYWNoby5nZXRDb25zdFRleHRDb2FsU2VjdGlvbigpKTsKKyAgICAgIGlmIChSZWxvY00gPT0gUmVsb2M6OkR5bmFtaWNOb1BJQykgeworICAgICAgICBjb25zdCBNQ1NlY3Rpb24gKnNlY3QgPQorICAgICAgICAgIE91dENvbnRleHQuZ2V0TWFjaE9TZWN0aW9uKCJfX1RFWFQiLCAiX19zeW1ib2xfc3R1YjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX1NZTUJPTF9TVFVCUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgU2VjdGlvbktpbmQ6OmdldFRleHQoKSk7CisgICAgICAgIE91dFN0cmVhbWVyLlN3aXRjaFNlY3Rpb24oc2VjdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBNQ1NlY3Rpb24gKnNlY3QgPQorICAgICAgICAgIE91dENvbnRleHQuZ2V0TWFjaE9TZWN0aW9uKCJfX1RFWFQiLCAiX19waWNzeW1ib2xzdHViNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfU1lNQk9MX1NUVUJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCBTZWN0aW9uS2luZDo6Z2V0VGV4dCgpKTsKKyAgICAgICAgT3V0U3RyZWFtZXIuU3dpdGNoU2VjdGlvbihzZWN0KTsKKyAgICAgIH0KKyAgICAgIGNvbnN0IE1DU2VjdGlvbiAqU3RhdGljSW5pdFNlY3QgPQorICAgICAgICBPdXRDb250ZXh0LmdldE1hY2hPU2VjdGlvbigiX19URVhUIiwgIl9fU3RhdGljSW5pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX1JFR1VMQVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX1BVUkVfSU5TVFJVQ1RJT05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZDo6Z2V0VGV4dCgpKTsKKyAgICAgIE91dFN0cmVhbWVyLlN3aXRjaFNlY3Rpb24oU3RhdGljSW5pdFNlY3QpOworICAgIH0KKyAgfQorCisgIC8vIFVzZSB1bmlmaWVkIGFzc2VtYmxlciBzeW50YXguCisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXHQuc3ludGF4IHVuaWZpZWQiKSk7CisKKyAgLy8gRW1pdCBBUk0gQnVpbGQgQXR0cmlidXRlcworICBpZiAoU3VidGFyZ2V0LT5pc1RhcmdldEVMRigpKSB7CisgICAgLy8gQ1BVIFR5cGUKKyAgICBzdGQ6OnN0cmluZyBDUFVTdHJpbmcgPSBTdWJ0YXJnZXQtPmdldENQVVN0cmluZygpOworICAgIGlmIChDUFVTdHJpbmcgIT0gImdlbmVyaWMiKQorICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LmNwdSAiICsgVHdpbmUoQ1BVU3RyaW5nKSk7CisKKyAgICAvLyBGSVhNRTogRW1pdCBGUFUgdHlwZQorICAgIGlmIChTdWJ0YXJnZXQtPmhhc1ZGUDIoKSkKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5lYWJpX2F0dHJpYnV0ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKEFSTUJ1aWxkQXR0cnM6OlZGUF9hcmNoKSArICIsIDIiKTsKKworICAgIC8vIFNpZ25hbCB2YXJpb3VzIEZQIG1vZGVzLgorICAgIGlmICghVW5zYWZlRlBNYXRoKSB7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHQuZWFiaV9hdHRyaWJ1dGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShBUk1CdWlsZEF0dHJzOjpBQklfRlBfZGVub3JtYWwpICsgIiwgMSIpOworICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LmVhYmlfYXR0cmlidXRlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoQVJNQnVpbGRBdHRyczo6QUJJX0ZQX2V4Y2VwdGlvbnMpICsgIiwgMSIpOworICAgIH0KKyAgICAKKyAgICBpZiAoTm9JbmZzRlBNYXRoICYmIE5vTmFOc0ZQTWF0aCkKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5lYWJpX2F0dHJpYnV0ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKEFSTUJ1aWxkQXR0cnM6OkFCSV9GUF9udW1iZXJfbW9kZWwpKyAiLCAxIik7CisgICAgZWxzZQorICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LmVhYmlfYXR0cmlidXRlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoQVJNQnVpbGRBdHRyczo6QUJJX0ZQX251bWJlcl9tb2RlbCkrICIsIDMiKTsKKworICAgIC8vIDgtYnl0ZXMgYWxpZ25tZW50IHN0dWZmLgorICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5lYWJpX2F0dHJpYnV0ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShBUk1CdWlsZEF0dHJzOjpBQklfYWxpZ244X25lZWRlZCkgKyAiLCAxIik7CisgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LmVhYmlfYXR0cmlidXRlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKEFSTUJ1aWxkQXR0cnM6OkFCSV9hbGlnbjhfcHJlc2VydmVkKSArICIsIDEiKTsKKworICAgIC8vIEhhcmQgZmxvYXQuICBVc2UgYm90aCBTIGFuZCBEIHJlZ2lzdGVycyBhbmQgY29uZm9ybSB0byBBQVBDUy1WRlAuCisgICAgaWYgKFN1YnRhcmdldC0+aXNBQVBDU19BQkkoKSAmJiBGbG9hdEFCSVR5cGUgPT0gRmxvYXRBQkk6OkhhcmQpIHsKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5lYWJpX2F0dHJpYnV0ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKEFSTUJ1aWxkQXR0cnM6OkFCSV9IYXJkRlBfdXNlKSArICIsIDMiKTsKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5lYWJpX2F0dHJpYnV0ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKEFSTUJ1aWxkQXR0cnM6OkFCSV9WRlBfYXJncykgKyAiLCAxIik7CisgICAgfQorICAgIC8vIEZJWE1FOiBTaG91bGQgd2Ugc2lnbmFsIFI5IHVzYWdlPworICB9Cit9CisKKwordm9pZCBBUk1Bc21QcmludGVyOjpFbWl0RW5kT2ZBc21GaWxlKE1vZHVsZSAmTSkgeworICBpZiAoU3VidGFyZ2V0LT5pc1RhcmdldERhcndpbigpKSB7CisgICAgLy8gQWxsIGRhcndpbiB0YXJnZXRzIHVzZSBtYWNoLW8uCisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlTWFjaE8gJlRMT0ZNYWNobyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVNYWNoTyAmPihnZXRPYmpGaWxlTG93ZXJpbmcoKSk7CisgICAgTWFjaGluZU1vZHVsZUluZm9NYWNoTyAmTU1JTWFjaG8gPQorICAgICAgTU1JLT5nZXRPYmpGaWxlSW5mbzxNYWNoaW5lTW9kdWxlSW5mb01hY2hPPigpOworCisgICAgLy8gT3V0cHV0IG5vbi1sYXp5LXBvaW50ZXJzIGZvciBleHRlcm5hbCBhbmQgY29tbW9uIGdsb2JhbCB2YXJpYWJsZXMuCisgICAgTWFjaGluZU1vZHVsZUluZm9NYWNoTzo6U3ltYm9sTGlzdFR5IFN0dWJzID0gTU1JTWFjaG8uR2V0R1ZTdHViTGlzdCgpOworCisgICAgaWYgKCFTdHVicy5lbXB0eSgpKSB7CisgICAgICAvLyBTd2l0Y2ggd2l0aCAiLm5vbl9sYXp5X3N5bWJvbF9wb2ludGVyIiBkaXJlY3RpdmUuCisgICAgICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKFRMT0ZNYWNoby5nZXROb25MYXp5U3ltYm9sUG9pbnRlclNlY3Rpb24oKSk7CisgICAgICBFbWl0QWxpZ25tZW50KDIpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN0dWJzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgLy8gTF9mb28kc3R1YjoKKyAgICAgICAgT3V0U3RyZWFtZXIuRW1pdExhYmVsKFN0dWJzW2ldLmZpcnN0KTsKKyAgICAgICAgLy8gICAuaW5kaXJlY3Rfc3ltYm9sIF9mb28KKyAgICAgICAgTWFjaGluZU1vZHVsZUluZm9JbXBsOjpTdHViVmFsdWVUeSAmTUNTeW0gPSBTdHVic1tpXS5zZWNvbmQ7CisgICAgICAgIE91dFN0cmVhbWVyLkVtaXRTeW1ib2xBdHRyaWJ1dGUoTUNTeW0uZ2V0UG9pbnRlcigpLE1DU0FfSW5kaXJlY3RTeW1ib2wpOworCisgICAgICAgIGlmIChNQ1N5bS5nZXRJbnQoKSkKKyAgICAgICAgICAvLyBFeHRlcm5hbCB0byBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQuCisgICAgICAgICAgT3V0U3RyZWFtZXIuRW1pdEludFZhbHVlKDAsIDQvKnNpemUqLywgMC8qYWRkcnNwYWNlKi8pOworICAgICAgICBlbHNlCisgICAgICAgICAgLy8gSW50ZXJuYWwgdG8gY3VycmVudCB0cmFuc2xhdGlvbiB1bml0LgorICAgICAgICAgIC8vCisgICAgICAgICAgLy8gV2hlbiB3ZSBwbGFjZSB0aGUgTFNEQSBpbnRvIHRoZSBURVhUIHNlY3Rpb24sIHRoZSB0eXBlIGluZm8gcG9pbnRlcnMKKyAgICAgICAgICAvLyBuZWVkIHRvIGJlIGluZGlyZWN0IGFuZCBwYy1yZWwuIFdlIGFjY29tcGxpc2ggdGhpcyBieSB1c2luZyBOTFBzLgorICAgICAgICAgIC8vIEhvd2V2ZXIsIHNvbWV0aW1lcyB0aGUgdHlwZXMgYXJlIGxvY2FsIHRvIHRoZSBmaWxlLiBTbyB3ZSBuZWVkIHRvCisgICAgICAgICAgLy8gZmlsbCBpbiB0aGUgdmFsdWUgZm9yIHRoZSBOTFAgaW4gdGhvc2UgY2FzZXMuCisgICAgICAgICAgT3V0U3RyZWFtZXIuRW1pdFZhbHVlKE1DU3ltYm9sUmVmRXhwcjo6Q3JlYXRlKE1DU3ltLmdldFBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0Q29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQvKnNpemUqLywgMC8qYWRkcnNwYWNlKi8pOworICAgICAgfQorCisgICAgICBTdHVicy5jbGVhcigpOworICAgICAgT3V0U3RyZWFtZXIuQWRkQmxhbmtMaW5lKCk7CisgICAgfQorCisgICAgU3R1YnMgPSBNTUlNYWNoby5HZXRIaWRkZW5HVlN0dWJMaXN0KCk7CisgICAgaWYgKCFTdHVicy5lbXB0eSgpKSB7CisgICAgICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKGdldE9iakZpbGVMb3dlcmluZygpLmdldERhdGFTZWN0aW9uKCkpOworICAgICAgRW1pdEFsaWdubWVudCgyKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdHVicy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIC8vIExfZm9vJHN0dWI6CisgICAgICAgIE91dFN0cmVhbWVyLkVtaXRMYWJlbChTdHVic1tpXS5maXJzdCk7CisgICAgICAgIC8vICAgLmxvbmcgX2ZvbworICAgICAgICBPdXRTdHJlYW1lci5FbWl0VmFsdWUoTUNTeW1ib2xSZWZFeHByOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZShTdHVic1tpXS5zZWNvbmQuZ2V0UG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC8qc2l6ZSovLCAwLyphZGRyc3BhY2UqLyk7CisgICAgICB9CisKKyAgICAgIFN0dWJzLmNsZWFyKCk7CisgICAgICBPdXRTdHJlYW1lci5BZGRCbGFua0xpbmUoKTsKKyAgICB9CisKKyAgICAvLyBGdW5ueSBEYXJ3aW4gaGFjazogVGhpcyBmbGFnIHRlbGxzIHRoZSBsaW5rZXIgdGhhdCBubyBnbG9iYWwgc3ltYm9scworICAgIC8vIGNvbnRhaW4gY29kZSB0aGF0IGZhbGxzIHRocm91Z2ggdG8gb3RoZXIgZ2xvYmFsIHN5bWJvbHMgKGUuZy4gdGhlIG9idmlvdXMKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBtdWx0aXBsZSBlbnRyeSBwb2ludHMpLiAgSWYgdGhpcyBkb2Vzbid0IG9jY3VyLCB0aGUKKyAgICAvLyBsaW5rZXIgY2FuIHNhZmVseSBwZXJmb3JtIGRlYWQgY29kZSBzdHJpcHBpbmcuICBTaW5jZSBMTFZNIG5ldmVyCisgICAgLy8gZ2VuZXJhdGVzIGNvZGUgdGhhdCBkb2VzIHRoaXMsIGl0IGlzIGFsd2F5cyBzYWZlIHRvIHNldC4KKyAgICBPdXRTdHJlYW1lci5FbWl0QXNzZW1ibGVyRmxhZyhNQ0FGX1N1YnNlY3Rpb25zVmlhU3ltYm9scyk7CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBBUk1Bc21QcmludGVyOjpwcmludEluc3RydWN0aW9uVGhyb3VnaE1DU3RyZWFtZXIoY29uc3QgTWFjaGluZUluc3RyICpNSSkgeworICBBUk1NQ0luc3RMb3dlciBNQ0luc3RMb3dlcmluZyhPdXRDb250ZXh0LCAqTWFuZywgKnRoaXMpOworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBjYXNlIEFSTTo6dDJNT1ZpMzJpbW06CisgICAgYXNzZXJ0KDAgJiYgIlNob3VsZCBiZSBsb3dlcmVkIGJ5IHRodW1iMml0IHBhc3MiKTsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgQVJNOjpQSUNBREQ6IHsgLy8gRklYTUU6IFJlbW92ZSBhc20gc3RyaW5nIGZyb20gdGQgZmlsZS4KKyAgICAvLyBUaGlzIGlzIGEgcHNldWRvIG9wIGZvciBhIGxhYmVsICsgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UsIHdoaWNoIGxvb2tzIGxpa2U6CisgICAgLy8gTFBDMDoKKyAgICAvLyAgICAgYWRkIHIwLCBwYywgcjAKKyAgICAvLyBUaGlzIGFkZHMgdGhlIGFkZHJlc3Mgb2YgTFBDMCB0byByMC4KKyAgICAKKyAgICAvLyBFbWl0IHRoZSBsYWJlbC4KKyAgICAvLyBGSVhNRTogTU9WRSBUTyBTSEFSRUQgUExBQ0UuCisgICAgdW5zaWduZWQgSWQgPSAodW5zaWduZWQpTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCk7CisgICAgY29uc3QgY2hhciAqUHJlZml4ID0gTUFJLT5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCk7CisgICAgTUNTeW1ib2wgKkxhYmVsID1PdXRDb250ZXh0LkdldE9yQ3JlYXRlU3ltYm9sKFR3aW5lKFByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJQQyIgKyBUd2luZShnZXRGdW5jdGlvbk51bWJlcigpKSArICJfIiArIFR3aW5lKElkKSk7CisgICAgT3V0U3RyZWFtZXIuRW1pdExhYmVsKExhYmVsKTsKKyAgICAKKyAgICAKKyAgICAvLyBGb3JtIGFuZCBlbWl0IHRoYSBkZC4KKyAgICBNQ0luc3QgQWRkSW5zdDsKKyAgICBBZGRJbnN0LnNldE9wY29kZShBUk06OkFERHJyKTsKKyAgICBBZGRJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpKTsKKyAgICBBZGRJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoQVJNOjpQQykpOworICAgIEFkZEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkpOworICAgIE91dFN0cmVhbWVyLkVtaXRJbnN0cnVjdGlvbihBZGRJbnN0KTsKKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBBUk06OkNPTlNUUE9PTF9FTlRSWTogeyAvLyBGSVhNRTogUmVtb3ZlIGFzbSBzdHJpbmcgZnJvbSB0ZCBmaWxlLgorICAgIC8vLyBDT05TVFBPT0xfRU5UUlkgLSBUaGlzIGluc3RydWN0aW9uIHJlcHJlc2VudHMgYSBmbG9hdGluZyBjb25zdGFudCBwb29sCisgICAgLy8vIGluIHRoZSBmdW5jdGlvbi4gIFRoZSBmaXJzdCBvcGVyYW5kIGlzIHRoZSBJRCMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24sIHRoZQorICAgIC8vLyBzZWNvbmQgaXMgdGhlIGluZGV4IGludG8gdGhlIE1hY2hpbmVDb25zdGFudFBvb2wgdGhhdCB0aGlzIGlzLCB0aGUgdGhpcmQKKyAgICAvLy8gaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgorICAgIHVuc2lnbmVkIExhYmVsSWQgPSAodW5zaWduZWQpTUktPmdldE9wZXJhbmQoMCkuZ2V0SW1tKCk7CisgICAgdW5zaWduZWQgQ1BJZHggICA9ICh1bnNpZ25lZClNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOworCisgICAgRW1pdEFsaWdubWVudCgyKTsKKyAgICBPdXRTdHJlYW1lci5FbWl0TGFiZWwoR2V0Q1BJU3ltYm9sKExhYmVsSWQpKTsKKworICAgIGNvbnN0IE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeSAmTUNQRSA9IE1DUC0+Z2V0Q29uc3RhbnRzKClbQ1BJZHhdOworICAgIGlmIChNQ1BFLmlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkpCisgICAgICBFbWl0TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlKE1DUEUuVmFsLk1hY2hpbmVDUFZhbCk7CisgICAgZWxzZQorICAgICAgRW1pdEdsb2JhbENvbnN0YW50KE1DUEUuVmFsLkNvbnN0VmFsKTsKKyAgICAKKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBBUk06Ok1PVmkycGllY2VzOiB7IC8vIEZJWE1FOiBSZW1vdmUgYXNtc3RyaW5nIGZyb20gdGQgZmlsZS4KKyAgICAvLyBUaGlzIGlzIGEgaGFjayB0aGF0IGxvd2VycyBhcyBhIHR3byBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4KKyAgICB1bnNpZ25lZCBEc3RSZWcgPSBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBJbW1WYWwgPSAodW5zaWduZWQpTUktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCk7CisKKyAgICB1bnNpZ25lZCBTT0ltbVZhbFYxID0gQVJNX0FNOjpnZXRTT0ltbVR3b1BhcnRGaXJzdChJbW1WYWwpOworICAgIHVuc2lnbmVkIFNPSW1tVmFsVjIgPSBBUk1fQU06OmdldFNPSW1tVHdvUGFydFNlY29uZChJbW1WYWwpOworICAgIAorICAgIHsKKyAgICAgIE1DSW5zdCBUbXBJbnN0OworICAgICAgVG1wSW5zdC5zZXRPcGNvZGUoQVJNOjpNT1ZpKTsKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhEc3RSZWcpKTsKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShTT0ltbVZhbFYxKSk7CisgICAgICAKKyAgICAgIC8vIFByZWRpY2F0ZS4KKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSkpOworICAgICAgVG1wSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKE1JLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpKSk7CisKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKSk7ICAgICAgICAgIC8vIGNjX291dAorICAgICAgT3V0U3RyZWFtZXIuRW1pdEluc3RydWN0aW9uKFRtcEluc3QpOworICAgIH0KKworICAgIHsKKyAgICAgIE1DSW5zdCBUbXBJbnN0OworICAgICAgVG1wSW5zdC5zZXRPcGNvZGUoQVJNOjpPUlJyaSk7CisgICAgICBUbXBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoRHN0UmVnKSk7ICAgICAvLyBkc3RyZWcKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhEc3RSZWcpKTsgICAgIC8vIGlucmVnCisgICAgICBUbXBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oU09JbW1WYWxWMikpOyAvLyBzb19pbW0KKyAgICAgIC8vIFByZWRpY2F0ZS4KKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSkpOworICAgICAgVG1wSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKE1JLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpKSk7CisgICAgICAKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKSk7ICAgICAgICAgIC8vIGNjX291dAorICAgICAgT3V0U3RyZWFtZXIuRW1pdEluc3RydWN0aW9uKFRtcEluc3QpOworICAgIH0KKyAgICByZXR1cm47IAorICB9CisgIGNhc2UgQVJNOjpNT1ZpMzJpbW06IHsgLy8gRklYTUU6IFJlbW92ZSBhc21zdHJpbmcgZnJvbSB0ZCBmaWxlLgorICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRoYXQgbG93ZXJzIGFzIGEgdHdvIGluc3RydWN0aW9uIHNlcXVlbmNlLgorICAgIHVuc2lnbmVkIERzdFJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKDEpOworICAgIE1DT3BlcmFuZCBWMSwgVjI7CisgICAgaWYgKE1PLmlzSW1tKCkpIHsKKyAgICAgIHVuc2lnbmVkIEltbVZhbCA9ICh1bnNpZ25lZClNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKTsKKyAgICAgIFYxID0gTUNPcGVyYW5kOjpDcmVhdGVJbW0oSW1tVmFsICYgNjU1MzUpOworICAgICAgVjIgPSBNQ09wZXJhbmQ6OkNyZWF0ZUltbShJbW1WYWwgPj4gMTYpOworICAgIH0gZWxzZSBpZiAoTU8uaXNHbG9iYWwoKSkgeworICAgICAgTUNTeW1ib2wgKlN5bWJvbCA9IE1DSW5zdExvd2VyaW5nLkdldEdsb2JhbEFkZHJlc3NTeW1ib2woTU8pOworICAgICAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpTeW1SZWYxID0KKyAgICAgICAgTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbFJlZkV4cHI6OlZLX0FSTV9MTzE2LCBPdXRDb250ZXh0KTsKKyAgICAgIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqU3ltUmVmMiA9CisgICAgICAgIE1DU3ltYm9sUmVmRXhwcjo6Q3JlYXRlKFN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTeW1ib2xSZWZFeHByOjpWS19BUk1fSEkxNiwgT3V0Q29udGV4dCk7CisgICAgICBWMSA9IE1DT3BlcmFuZDo6Q3JlYXRlRXhwcihTeW1SZWYxKTsKKyAgICAgIFYyID0gTUNPcGVyYW5kOjpDcmVhdGVFeHByKFN5bVJlZjIpOworICAgIH0gZWxzZSB7CisgICAgICBNSS0+ZHVtcCgpOworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiY2Fubm90IGhhbmRsZSB0aGlzIG9wZXJhbmQiKTsKKyAgICB9CisKKyAgICB7CisgICAgICBNQ0luc3QgVG1wSW5zdDsKKyAgICAgIFRtcEluc3Quc2V0T3Bjb2RlKEFSTTo6TU9WaTE2KTsKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhEc3RSZWcpKTsgICAgICAgICAvLyBkc3RyZWcKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChWMSk7IC8vIGxvd2VyMTYoaW1tKQorICAgICAgCisgICAgICAvLyBQcmVkaWNhdGUuCisgICAgICBUbXBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCkpKTsKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhNSS0+Z2V0T3BlcmFuZCgzKS5nZXRSZWcoKSkpOworICAgICAgCisgICAgICBPdXRTdHJlYW1lci5FbWl0SW5zdHJ1Y3Rpb24oVG1wSW5zdCk7CisgICAgfQorICAgIAorICAgIHsKKyAgICAgIE1DSW5zdCBUbXBJbnN0OworICAgICAgVG1wSW5zdC5zZXRPcGNvZGUoQVJNOjpNT1ZUaTE2KTsKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhEc3RSZWcpKTsgICAgICAgICAvLyBkc3RyZWcKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhEc3RSZWcpKTsgICAgICAgICAvLyBzcmNyZWcKKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChWMik7ICAgLy8gdXBwZXIxNihpbW0pCisgICAgICAKKyAgICAgIC8vIFByZWRpY2F0ZS4KKyAgICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSkpOworICAgICAgVG1wSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKE1JLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpKSk7CisgICAgICAKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRJbnN0cnVjdGlvbihUbXBJbnN0KTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworICB9CisgIH0KKyAgICAgIAorICBNQ0luc3QgVG1wSW5zdDsKKyAgTUNJbnN0TG93ZXJpbmcuTG93ZXIoTUksIFRtcEluc3QpOworICBPdXRTdHJlYW1lci5FbWl0SW5zdHJ1Y3Rpb24oVG1wSW5zdCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYXJnZXQgUmVnaXN0cnkgU3R1ZmYKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3N0YXRpYyBNQ0luc3RQcmludGVyICpjcmVhdGVBUk1NQ0luc3RQcmludGVyKGNvbnN0IFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN5bnRheFZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUluZm8gJk1BSSkgeworICBpZiAoU3ludGF4VmFyaWFudCA9PSAwKQorICAgIHJldHVybiBuZXcgQVJNSW5zdFByaW50ZXIoTUFJLCBmYWxzZSk7CisgIHJldHVybiAwOworfQorCisvLyBGb3JjZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVBUk1Bc21QcmludGVyKCkgeworICBSZWdpc3RlckFzbVByaW50ZXI8QVJNQXNtUHJpbnRlcj4gWChUaGVBUk1UYXJnZXQpOworICBSZWdpc3RlckFzbVByaW50ZXI8QVJNQXNtUHJpbnRlcj4gWShUaGVUaHVtYlRhcmdldCk7CisKKyAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNJbnN0UHJpbnRlcihUaGVBUk1UYXJnZXQsIGNyZWF0ZUFSTU1DSW5zdFByaW50ZXIpOworICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0luc3RQcmludGVyKFRoZVRodW1iVGFyZ2V0LCBjcmVhdGVBUk1NQ0luc3RQcmludGVyKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQmFzZUluc3RySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1CYXNlSW5zdHJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE2NmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQmFzZUluc3RySW5mby5jcHAKQEAgLTAsMCArMSwxNDE2IEBACisvLz09PS0gQVJNQmFzZUluc3RySW5mby5jcHAgLSBBUk0gSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQmFzZSBBUk0gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNQmFzZUluc3RySW5mby5oIgorI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTUFkZHJlc3NpbmdNb2Rlcy5oIgorI2luY2x1ZGUgIkFSTUNvbnN0YW50UG9vbFZhbHVlLmgiCisjaW5jbHVkZSAiQVJNTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIkFSTVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgIkFSTUdlbkluc3RySW5mby5pbmMiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlVmFyaWFibGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0VuYWJsZUFSTTNBZGRyKCJlbmFibGUtYXJtLTMtYWRkci1jb252IiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICAgICAgIGNsOjpkZXNjKCJFbmFibGUgQVJNIDItYWRkciB0byAzLWFkZHIgY29udiIpKTsKKworQVJNQmFzZUluc3RySW5mbzo6QVJNQmFzZUluc3RySW5mbyhjb25zdCBBUk1TdWJ0YXJnZXQmIFNUSSkKKyAgOiBUYXJnZXRJbnN0ckluZm9JbXBsKEFSTUluc3RzLCBhcnJheV9sZW5ndGhvZihBUk1JbnN0cykpLAorICAgIFN1YnRhcmdldChTVEkpIHsKK30KKworTWFjaGluZUluc3RyICoKK0FSTUJhc2VJbnN0ckluZm86OmNvbnZlcnRUb1RocmVlQWRkcmVzcyhNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yICZNRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVWYXJpYWJsZXMgKkxWKSBjb25zdCB7CisgIC8vIEZJWE1FOiBUaHVtYjIgc3VwcG9ydC4KKworICBpZiAoIUVuYWJsZUFSTTNBZGRyKQorICAgIHJldHVybiBOVUxMOworCisgIE1hY2hpbmVJbnN0ciAqTUkgPSBNQkJJOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1JLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgIHVpbnQ2NF90IFRTRmxhZ3MgPSBNSS0+Z2V0RGVzYygpLlRTRmxhZ3M7CisgIGJvb2wgaXNQcmUgPSBmYWxzZTsKKyAgc3dpdGNoICgoVFNGbGFncyAmIEFSTUlJOjpJbmRleE1vZGVNYXNrKSA+PiBBUk1JSTo6SW5kZXhNb2RlU2hpZnQpIHsKKyAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CisgIGNhc2UgQVJNSUk6OkluZGV4TW9kZVByZToKKyAgICBpc1ByZSA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6OkluZGV4TW9kZVBvc3Q6CisgICAgYnJlYWs7CisgIH0KKworICAvLyBUcnkgc3BsaXR0aW5nIGFuIGluZGV4ZWQgbG9hZC9zdG9yZSB0byBhbiB1bi1pbmRleGVkIG9uZSBwbHVzIGFuIGFkZC9zdWIKKyAgLy8gb3BlcmF0aW9uLgorICB1bnNpZ25lZCBNZW1PcGMgPSBnZXRVbmluZGV4ZWRPcGNvZGUoTUktPmdldE9wY29kZSgpKTsKKyAgaWYgKE1lbU9wYyA9PSAwKQorICAgIHJldHVybiBOVUxMOworCisgIE1hY2hpbmVJbnN0ciAqVXBkYXRlTUkgPSBOVUxMOworICBNYWNoaW5lSW5zdHIgKk1lbU1JID0gTlVMTDsKKyAgdW5zaWduZWQgQWRkck1vZGUgPSAoVFNGbGFncyAmIEFSTUlJOjpBZGRyTW9kZU1hc2spOworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgIHVuc2lnbmVkIE51bU9wcyA9IFRJRC5nZXROdW1PcGVyYW5kcygpOworICBib29sIGlzTG9hZCA9ICFUSUQubWF5U3RvcmUoKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJldCID0gaXNMb2FkID8gTUktPmdldE9wZXJhbmQoMSkgOiBNSS0+Z2V0T3BlcmFuZCgwKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJkJhc2UgPSBNSS0+Z2V0T3BlcmFuZCgyKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk9mZnNldCA9IE1JLT5nZXRPcGVyYW5kKE51bU9wcy0zKTsKKyAgdW5zaWduZWQgV0JSZWcgPSBXQi5nZXRSZWcoKTsKKyAgdW5zaWduZWQgQmFzZVJlZyA9IEJhc2UuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIE9mZlJlZyA9IE9mZnNldC5nZXRSZWcoKTsKKyAgdW5zaWduZWQgT2ZmSW1tID0gTUktPmdldE9wZXJhbmQoTnVtT3BzLTIpLmdldEltbSgpOworICBBUk1DQzo6Q29uZENvZGVzIFByZWQgPSAoQVJNQ0M6OkNvbmRDb2RlcylNSS0+Z2V0T3BlcmFuZChOdW1PcHMtMSkuZ2V0SW1tKCk7CisgIHN3aXRjaCAoQWRkck1vZGUpIHsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoZmFsc2UgJiYgIlVua25vd24gaW5kZXhlZCBvcCEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgY2FzZSBBUk1JSTo6QWRkck1vZGUyOiB7CisgICAgYm9vbCBpc1N1YiA9IEFSTV9BTTo6Z2V0QU0yT3AoT2ZmSW1tKSA9PSBBUk1fQU06OnN1YjsKKyAgICB1bnNpZ25lZCBBbXQgPSBBUk1fQU06OmdldEFNMk9mZnNldChPZmZJbW0pOworICAgIGlmIChPZmZSZWcgPT0gMCkgeworICAgICAgaWYgKEFSTV9BTTo6Z2V0U09JbW1WYWwoQW10KSA9PSAtMSkKKyAgICAgICAgLy8gQ2FuJ3QgZW5jb2RlIGl0IGluIGEgc29faW1tIG9wZXJhbmQuIFRoaXMgdHJhbnNmb3JtYXRpb24gd2lsbAorICAgICAgICAvLyBhZGQgbW9yZSB0aGFuIDEgaW5zdHJ1Y3Rpb24uIEFiYW5kb24hCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgVXBkYXRlTUkgPSBCdWlsZE1JKE1GLCBNSS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoaXNTdWIgPyBBUk06OlNVQnJpIDogQVJNOjpBRERyaSksIFdCUmVnKQorICAgICAgICAuYWRkUmVnKEJhc2VSZWcpLmFkZEltbShBbXQpCisgICAgICAgIC5hZGRJbW0oUHJlZCkuYWRkUmVnKDApLmFkZFJlZygwKTsKKyAgICB9IGVsc2UgaWYgKEFtdCAhPSAwKSB7CisgICAgICBBUk1fQU06OlNoaWZ0T3BjIFNoT3BjID0gQVJNX0FNOjpnZXRBTTJTaGlmdE9wYyhPZmZJbW0pOworICAgICAgdW5zaWduZWQgU09PcGMgPSBBUk1fQU06OmdldFNPUmVnT3BjKFNoT3BjLCBBbXQpOworICAgICAgVXBkYXRlTUkgPSBCdWlsZE1JKE1GLCBNSS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoaXNTdWIgPyBBUk06OlNVQnJzIDogQVJNOjpBRERycyksIFdCUmVnKQorICAgICAgICAuYWRkUmVnKEJhc2VSZWcpLmFkZFJlZyhPZmZSZWcpLmFkZFJlZygwKS5hZGRJbW0oU09PcGMpCisgICAgICAgIC5hZGRJbW0oUHJlZCkuYWRkUmVnKDApLmFkZFJlZygwKTsKKyAgICB9IGVsc2UKKyAgICAgIFVwZGF0ZU1JID0gQnVpbGRNSShNRiwgTUktPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KGlzU3ViID8gQVJNOjpTVUJyciA6IEFSTTo6QUREcnIpLCBXQlJlZykKKyAgICAgICAgLmFkZFJlZyhCYXNlUmVnKS5hZGRSZWcoT2ZmUmVnKQorICAgICAgICAuYWRkSW1tKFByZWQpLmFkZFJlZygwKS5hZGRSZWcoMCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBUk1JSTo6QWRkck1vZGUzIDogeworICAgIGJvb2wgaXNTdWIgPSBBUk1fQU06OmdldEFNM09wKE9mZkltbSkgPT0gQVJNX0FNOjpzdWI7CisgICAgdW5zaWduZWQgQW10ID0gQVJNX0FNOjpnZXRBTTNPZmZzZXQoT2ZmSW1tKTsKKyAgICBpZiAoT2ZmUmVnID09IDApCisgICAgICAvLyBJbW1lZGlhdGUgaXMgOC1iaXRzLiBJdCdzIGd1YXJhbnRlZWQgdG8gZml0IGluIGEgc29faW1tIG9wZXJhbmQuCisgICAgICBVcGRhdGVNSSA9IEJ1aWxkTUkoTUYsIE1JLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldChpc1N1YiA/IEFSTTo6U1VCcmkgOiBBUk06OkFERHJpKSwgV0JSZWcpCisgICAgICAgIC5hZGRSZWcoQmFzZVJlZykuYWRkSW1tKEFtdCkKKyAgICAgICAgLmFkZEltbShQcmVkKS5hZGRSZWcoMCkuYWRkUmVnKDApOworICAgIGVsc2UKKyAgICAgIFVwZGF0ZU1JID0gQnVpbGRNSShNRiwgTUktPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KGlzU3ViID8gQVJNOjpTVUJyciA6IEFSTTo6QUREcnIpLCBXQlJlZykKKyAgICAgICAgLmFkZFJlZyhCYXNlUmVnKS5hZGRSZWcoT2ZmUmVnKQorICAgICAgICAuYWRkSW1tKFByZWQpLmFkZFJlZygwKS5hZGRSZWcoMCk7CisgICAgYnJlYWs7CisgIH0KKyAgfQorCisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVJbnN0cio+IE5ld01JczsKKyAgaWYgKGlzUHJlKSB7CisgICAgaWYgKGlzTG9hZCkKKyAgICAgIE1lbU1JID0gQnVpbGRNSShNRiwgTUktPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgZ2V0KE1lbU9wYyksIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKQorICAgICAgICAuYWRkUmVnKFdCUmVnKS5hZGRSZWcoMCkuYWRkSW1tKDApLmFkZEltbShQcmVkKTsKKyAgICBlbHNlCisgICAgICBNZW1NSSA9IEJ1aWxkTUkoTUYsIE1JLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgIGdldChNZW1PcGMpKS5hZGRSZWcoTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpCisgICAgICAgIC5hZGRSZWcoV0JSZWcpLmFkZFJlZygwKS5hZGRJbW0oMCkuYWRkSW1tKFByZWQpOworICAgIE5ld01Jcy5wdXNoX2JhY2soTWVtTUkpOworICAgIE5ld01Jcy5wdXNoX2JhY2soVXBkYXRlTUkpOworICB9IGVsc2UgeworICAgIGlmIChpc0xvYWQpCisgICAgICBNZW1NSSA9IEJ1aWxkTUkoTUYsIE1JLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgIGdldChNZW1PcGMpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAgICAgLmFkZFJlZyhCYXNlUmVnKS5hZGRSZWcoMCkuYWRkSW1tKDApLmFkZEltbShQcmVkKTsKKyAgICBlbHNlCisgICAgICBNZW1NSSA9IEJ1aWxkTUkoTUYsIE1JLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgIGdldChNZW1PcGMpKS5hZGRSZWcoTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpCisgICAgICAgIC5hZGRSZWcoQmFzZVJlZykuYWRkUmVnKDApLmFkZEltbSgwKS5hZGRJbW0oUHJlZCk7CisgICAgaWYgKFdCLmlzRGVhZCgpKQorICAgICAgVXBkYXRlTUktPmdldE9wZXJhbmQoMCkuc2V0SXNEZWFkKCk7CisgICAgTmV3TUlzLnB1c2hfYmFjayhVcGRhdGVNSSk7CisgICAgTmV3TUlzLnB1c2hfYmFjayhNZW1NSSk7CisgIH0KKworICAvLyBUcmFuc2ZlciBMaXZlVmFyaWFibGVzIHN0YXRlcywga2lsbCAvIGRlYWQgaW5mby4KKyAgaWYgKExWKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5nZXRSZWcoKSAmJgorICAgICAgICAgIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoTU8uZ2V0UmVnKCkpKSB7CisgICAgICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworCisgICAgICAgIExpdmVWYXJpYWJsZXM6OlZhckluZm8gJlZJID0gTFYtPmdldFZhckluZm8oUmVnKTsKKyAgICAgICAgaWYgKE1PLmlzRGVmKCkpIHsKKyAgICAgICAgICBNYWNoaW5lSW5zdHIgKk5ld01JID0gKFJlZyA9PSBXQlJlZykgPyBVcGRhdGVNSSA6IE1lbU1JOworICAgICAgICAgIGlmIChNTy5pc0RlYWQoKSkKKyAgICAgICAgICAgIExWLT5hZGRWaXJ0dWFsUmVnaXN0ZXJEZWFkKFJlZywgTmV3TUkpOworICAgICAgICB9CisgICAgICAgIGlmIChNTy5pc1VzZSgpICYmIE1PLmlzS2lsbCgpKSB7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IDI7ICsraikgeworICAgICAgICAgICAgLy8gTG9vayBhdCB0aGUgdHdvIG5ldyBNSSdzIGluIHJldmVyc2Ugb3JkZXIuCisgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk5ld01JID0gTmV3TUlzW2pdOworICAgICAgICAgICAgaWYgKCFOZXdNSS0+cmVhZHNSZWdpc3RlcihSZWcpKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIExWLT5hZGRWaXJ0dWFsUmVnaXN0ZXJLaWxsZWQoUmVnLCBOZXdNSSk7CisgICAgICAgICAgICBpZiAoVkkucmVtb3ZlS2lsbChNSSkpCisgICAgICAgICAgICAgIFZJLktpbGxzLnB1c2hfYmFjayhOZXdNSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBNRkktPmluc2VydChNQkJJLCBOZXdNSXNbMV0pOworICBNRkktPmluc2VydChNQkJJLCBOZXdNSXNbMF0pOworICByZXR1cm4gTmV3TUlzWzBdOworfQorCitib29sCitBUk1CYXNlSW5zdHJJbmZvOjpzcGlsbENhbGxlZVNhdmVkUmVnaXN0ZXJzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICBpZiAoQ1NJLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIERlYnVnTG9jIERMOworICBpZiAoTUkgIT0gTUJCLmVuZCgpKSBETCA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDU0kuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIFJlZyA9IENTSVtpXS5nZXRSZWcoKTsKKyAgICBib29sIGlzS2lsbCA9IHRydWU7CisKKyAgICAvLyBBZGQgdGhlIGNhbGxlZS1zYXZlZCByZWdpc3RlciBhcyBsaXZlLWluIHVubGVzcyBpdCdzIExSIGFuZAorICAgIC8vIEBsbHZtLnJldHVybmFkZHJlc3MgaXMgY2FsbGVkLiBJZiBMUiBpcyByZXR1cm5lZCBmb3IgQGxsdm0ucmV0dXJuYWRkcmVzcworICAgIC8vIHRoZW4gaXQncyBhbHJlYWR5IGFkZGVkIHRvIHRoZSBmdW5jdGlvbiBhbmQgZW50cnkgYmxvY2sgbGl2ZS1pbiBzZXRzLgorICAgIGlmIChSZWcgPT0gQVJNOjpMUikgeworICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgICAgICBpZiAoTUYuZ2V0RnJhbWVJbmZvKCktPmlzUmV0dXJuQWRkcmVzc1Rha2VuKCkgJiYKKyAgICAgICAgICBNRi5nZXRSZWdJbmZvKCkuaXNMaXZlSW4oUmVnKSkKKyAgICAgICAgaXNLaWxsID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlzS2lsbCkKKyAgICAgIE1CQi5hZGRMaXZlSW4oUmVnKTsKKworICAgIC8vIEluc2VydCB0aGUgc3BpbGwgdG8gdGhlIHN0YWNrIGZyYW1lLiBUaGUgcmVnaXN0ZXIgaXMga2lsbGVkIGF0IHRoZSBzcGlsbAorICAgIC8vIAorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gVFJJLT5nZXRNaW5pbWFsUGh5c1JlZ0NsYXNzKFJlZyk7CisgICAgc3RvcmVSZWdUb1N0YWNrU2xvdChNQkIsIE1JLCBSZWcsIGlzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENTSVtpXS5nZXRGcmFtZUlkeCgpLCBSQywgVFJJKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQnJhbmNoIGFuYWx5c2lzLgorYm9vbAorQVJNQmFzZUluc3RySW5mbzo6QW5hbHl6ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqJkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSkgY29uc3QgeworICAvLyBJZiB0aGUgYmxvY2sgaGFzIG5vIHRlcm1pbmF0b3JzLCBpdCBqdXN0IGZhbGxzIGludG8gdGhlIGJsb2NrIGFmdGVyIGl0LgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5lbmQoKTsKKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAtLUk7CisgIHdoaWxlIChJLT5pc0RlYnVnVmFsdWUoKSkgeworICAgIGlmIChJID09IE1CQi5iZWdpbigpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC0tSTsKKyAgfQorICBpZiAoIWlzVW5wcmVkaWNhdGVkVGVybWluYXRvcihJKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gR2V0IHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBibG9jay4KKyAgTWFjaGluZUluc3RyICpMYXN0SW5zdCA9IEk7CisKKyAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgdGVybWluYXRvciBpbnN0cnVjdGlvbiwgcHJvY2VzcyBpdC4KKyAgdW5zaWduZWQgTGFzdE9wYyA9IExhc3RJbnN0LT5nZXRPcGNvZGUoKTsKKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkgfHwgIWlzVW5wcmVkaWNhdGVkVGVybWluYXRvcigtLUkpKSB7CisgICAgaWYgKGlzVW5jb25kQnJhbmNoT3Bjb2RlKExhc3RPcGMpKSB7CisgICAgICBUQkIgPSBMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzQ29uZEJyYW5jaE9wY29kZShMYXN0T3BjKSkgeworICAgICAgLy8gQmxvY2sgZW5kcyB3aXRoIGZhbGwtdGhyb3VnaCBjb25kYnJhbmNoLgorICAgICAgVEJCID0gTGFzdEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgICBDb25kLnB1c2hfYmFjayhMYXN0SW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICBDb25kLnB1c2hfYmFjayhMYXN0SW5zdC0+Z2V0T3BlcmFuZCgyKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOyAgLy8gQ2FuJ3QgaGFuZGxlIGluZGlyZWN0IGJyYW5jaC4KKyAgfQorCisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIGl0IGlmIGl0IGlzIGEgdGVybWluYXRvci4KKyAgTWFjaGluZUluc3RyICpTZWNvbmRMYXN0SW5zdCA9IEk7CisKKyAgLy8gSWYgdGhlcmUgYXJlIHRocmVlIHRlcm1pbmF0b3JzLCB3ZSBkb24ndCBrbm93IHdoYXQgc29ydCBvZiBibG9jayB0aGlzIGlzLgorICBpZiAoU2Vjb25kTGFzdEluc3QgJiYgSSAhPSBNQkIuYmVnaW4oKSAmJiBpc1VucHJlZGljYXRlZFRlcm1pbmF0b3IoLS1JKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiB0aGUgYmxvY2sgZW5kcyB3aXRoIGEgQiBhbmQgYSBCY2MsIGhhbmRsZSBpdC4KKyAgdW5zaWduZWQgU2Vjb25kTGFzdE9wYyA9IFNlY29uZExhc3RJbnN0LT5nZXRPcGNvZGUoKTsKKyAgaWYgKGlzQ29uZEJyYW5jaE9wY29kZShTZWNvbmRMYXN0T3BjKSAmJiBpc1VuY29uZEJyYW5jaE9wY29kZShMYXN0T3BjKSkgeworICAgIFRCQiA9ICBTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICBDb25kLnB1c2hfYmFjayhTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgQ29uZC5wdXNoX2JhY2soU2Vjb25kTGFzdEluc3QtPmdldE9wZXJhbmQoMikpOworICAgIEZCQiA9IExhc3RJbnN0LT5nZXRPcGVyYW5kKDApLmdldE1CQigpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElmIHRoZSBibG9jayBlbmRzIHdpdGggdHdvIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMsIGhhbmRsZSBpdC4gIFRoZSBzZWNvbmQKKyAgLy8gb25lIGlzIG5vdCBleGVjdXRlZCwgc28gcmVtb3ZlIGl0LgorICBpZiAoaXNVbmNvbmRCcmFuY2hPcGNvZGUoU2Vjb25kTGFzdE9wYykgJiYgaXNVbmNvbmRCcmFuY2hPcGNvZGUoTGFzdE9wYykpIHsKKyAgICBUQkIgPSBTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICBJID0gTGFzdEluc3Q7CisgICAgaWYgKEFsbG93TW9kaWZ5KQorICAgICAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gLi4ubGlrZXdpc2UgaWYgaXQgZW5kcyB3aXRoIGEgYnJhbmNoIHRhYmxlIGZvbGxvd2VkIGJ5IGFuIHVuY29uZGl0aW9uYWwKKyAgLy8gYnJhbmNoLiBUaGUgYnJhbmNoIGZvbGRlciBjYW4gY3JlYXRlIHRoZXNlLCBhbmQgd2UgbXVzdCBnZXQgcmlkIG9mIHRoZW0gZm9yCisgIC8vIGNvcnJlY3RuZXNzIG9mIFRodW1iIGNvbnN0YW50IGlzbGFuZHMuCisgIGlmICgoaXNKdW1wVGFibGVCcmFuY2hPcGNvZGUoU2Vjb25kTGFzdE9wYykgfHwKKyAgICAgICBpc0luZGlyZWN0QnJhbmNoT3Bjb2RlKFNlY29uZExhc3RPcGMpKSAmJgorICAgICAgaXNVbmNvbmRCcmFuY2hPcGNvZGUoTGFzdE9wYykpIHsKKyAgICBJID0gTGFzdEluc3Q7CisgICAgaWYgKEFsbG93TW9kaWZ5KQorICAgICAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBPdGhlcndpc2UsIGNhbid0IGhhbmRsZSB0aGlzLgorICByZXR1cm4gdHJ1ZTsKK30KKworCit1bnNpZ25lZCBBUk1CYXNlSW5zdHJJbmZvOjpSZW1vdmVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgeworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5lbmQoKTsKKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkpIHJldHVybiAwOworICAtLUk7CisgIHdoaWxlIChJLT5pc0RlYnVnVmFsdWUoKSkgeworICAgIGlmIChJID09IE1CQi5iZWdpbigpKQorICAgICAgcmV0dXJuIDA7CisgICAgLS1JOworICB9CisgIGlmICghaXNVbmNvbmRCcmFuY2hPcGNvZGUoSS0+Z2V0T3Bjb2RlKCkpICYmCisgICAgICAhaXNDb25kQnJhbmNoT3Bjb2RlKEktPmdldE9wY29kZSgpKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBSZW1vdmUgdGhlIGJyYW5jaC4KKyAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgSSA9IE1CQi5lbmQoKTsKKworICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkgcmV0dXJuIDE7CisgIC0tSTsKKyAgaWYgKCFpc0NvbmRCcmFuY2hPcGNvZGUoSS0+Z2V0T3Bjb2RlKCkpKQorICAgIHJldHVybiAxOworCisgIC8vIFJlbW92ZSB0aGUgYnJhbmNoLgorICBJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgcmV0dXJuIDI7Cit9CisKK3Vuc2lnbmVkCitBUk1CYXNlSW5zdHJJbmZvOjpJbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0IHsKKyAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNQkIuZ2V0UGFyZW50KCktPmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICBpbnQgQk9wYyAgID0gIUFGSS0+aXNUaHVtYkZ1bmN0aW9uKCkKKyAgICA/IEFSTTo6QiA6IChBRkktPmlzVGh1bWIyRnVuY3Rpb24oKSA/IEFSTTo6dDJCIDogQVJNOjp0Qik7CisgIGludCBCY2NPcGMgPSAhQUZJLT5pc1RodW1iRnVuY3Rpb24oKQorICAgID8gQVJNOjpCY2MgOiAoQUZJLT5pc1RodW1iMkZ1bmN0aW9uKCkgPyBBUk06OnQyQmNjIDogQVJNOjp0QmNjKTsKKworICAvLyBTaG91bGRuJ3QgYmUgYSBmYWxsIHRocm91Z2guCisgIGFzc2VydChUQkIgJiYgIkluc2VydEJyYW5jaCBtdXN0IG5vdCBiZSB0b2xkIHRvIGluc2VydCBhIGZhbGx0aHJvdWdoIik7CisgIGFzc2VydCgoQ29uZC5zaXplKCkgPT0gMiB8fCBDb25kLnNpemUoKSA9PSAwKSAmJgorICAgICAgICAgIkFSTSBicmFuY2ggY29uZGl0aW9ucyBoYXZlIHR3byBjb21wb25lbnRzISIpOworCisgIGlmIChGQkIgPT0gMCkgeworICAgIGlmIChDb25kLmVtcHR5KCkpIC8vIFVuY29uZGl0aW9uYWwgYnJhbmNoPworICAgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KEJPcGMpKS5hZGRNQkIoVEJCKTsKKyAgICBlbHNlCisgICAgICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoQmNjT3BjKSkuYWRkTUJCKFRCQikKKyAgICAgICAgLmFkZEltbShDb25kWzBdLmdldEltbSgpKS5hZGRSZWcoQ29uZFsxXS5nZXRSZWcoKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBUd28td2F5IGNvbmRpdGlvbmFsIGJyYW5jaC4KKyAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KEJjY09wYykpLmFkZE1CQihUQkIpCisgICAgLmFkZEltbShDb25kWzBdLmdldEltbSgpKS5hZGRSZWcoQ29uZFsxXS5nZXRSZWcoKSk7CisgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChCT3BjKSkuYWRkTUJCKEZCQik7CisgIHJldHVybiAyOworfQorCitib29sIEFSTUJhc2VJbnN0ckluZm86OgorUmV2ZXJzZUJyYW5jaENvbmRpdGlvbihTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kKSBjb25zdCB7CisgIEFSTUNDOjpDb25kQ29kZXMgQ0MgPSAoQVJNQ0M6OkNvbmRDb2RlcykoaW50KUNvbmRbMF0uZ2V0SW1tKCk7CisgIENvbmRbMF0uc2V0SW1tKEFSTUNDOjpnZXRPcHBvc2l0ZUNvbmRpdGlvbihDQykpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQVJNQmFzZUluc3RySW5mbzo6CitQcmVkaWNhdGVJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmUHJlZCkgY29uc3QgeworICB1bnNpZ25lZCBPcGMgPSBNSS0+Z2V0T3Bjb2RlKCk7CisgIGlmIChpc1VuY29uZEJyYW5jaE9wY29kZShPcGMpKSB7CisgICAgTUktPnNldERlc2MoZ2V0KGdldE1hdGNoaW5nQ29uZEJyYW5jaE9wY29kZShPcGMpKSk7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbShQcmVkWzBdLmdldEltbSgpKSk7CisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhQcmVkWzFdLmdldFJlZygpLCBmYWxzZSkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaW50IFBJZHggPSBNSS0+ZmluZEZpcnN0UHJlZE9wZXJhbmRJZHgoKTsKKyAgaWYgKFBJZHggIT0gLTEpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmUE1PID0gTUktPmdldE9wZXJhbmQoUElkeCk7CisgICAgUE1PLnNldEltbShQcmVkWzBdLmdldEltbSgpKTsKKyAgICBNSS0+Z2V0T3BlcmFuZChQSWR4KzEpLnNldFJlZyhQcmVkWzFdLmdldFJlZygpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQVJNQmFzZUluc3RySW5mbzo6CitTdWJzdW1lc1ByZWRpY2F0ZShjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZQcmVkMSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJlByZWQyKSBjb25zdCB7CisgIGlmIChQcmVkMS5zaXplKCkgPiAyIHx8IFByZWQyLnNpemUoKSA+IDIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEFSTUNDOjpDb25kQ29kZXMgQ0MxID0gKEFSTUNDOjpDb25kQ29kZXMpUHJlZDFbMF0uZ2V0SW1tKCk7CisgIEFSTUNDOjpDb25kQ29kZXMgQ0MyID0gKEFSTUNDOjpDb25kQ29kZXMpUHJlZDJbMF0uZ2V0SW1tKCk7CisgIGlmIChDQzEgPT0gQ0MyKQorICAgIHJldHVybiB0cnVlOworCisgIHN3aXRjaCAoQ0MxKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIEFSTUNDOjpBTDoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBBUk1DQzo6SFM6CisgICAgcmV0dXJuIENDMiA9PSBBUk1DQzo6SEk7CisgIGNhc2UgQVJNQ0M6OkxTOgorICAgIHJldHVybiBDQzIgPT0gQVJNQ0M6OkxPIHx8IENDMiA9PSBBUk1DQzo6RVE7CisgIGNhc2UgQVJNQ0M6OkdFOgorICAgIHJldHVybiBDQzIgPT0gQVJNQ0M6OkdUOworICBjYXNlIEFSTUNDOjpMRToKKyAgICByZXR1cm4gQ0MyID09IEFSTUNDOjpMVDsKKyAgfQorfQorCitib29sIEFSTUJhc2VJbnN0ckluZm86OkRlZmluZXNQcmVkaWNhdGUoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kPiAmUHJlZCkgY29uc3QgeworICAvLyBGSVhNRTogVGhpcyBjb25mdXNlcyBpbXBsaWNpdF9kZWYgd2l0aCBvcHRpb25hbCBDUFNSIGRlZi4KKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS0+Z2V0RGVzYygpOworICBpZiAoIVRJRC5nZXRJbXBsaWNpdERlZnMoKSAmJiAhVElELmhhc09wdGlvbmFsRGVmKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgRm91bmQgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmdldFJlZygpID09IEFSTTo6Q1BTUikgeworICAgICAgUHJlZC5wdXNoX2JhY2soTU8pOworICAgICAgRm91bmQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBGb3VuZDsKK30KKworLy8vIGlzUHJlZGljYWJsZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gY2FuIGJlIHByZWRpY2F0ZWQuCisvLy8gQnkgZGVmYXVsdCwgdGhpcyByZXR1cm5zIHRydWUgZm9yIGV2ZXJ5IGluc3RydWN0aW9uIHdpdGggYQorLy8vIFByZWRpY2F0ZU9wZXJhbmQuCitib29sIEFSTUJhc2VJbnN0ckluZm86OmlzUHJlZGljYWJsZShNYWNoaW5lSW5zdHIgKk1JKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUktPmdldERlc2MoKTsKKyAgaWYgKCFUSUQuaXNQcmVkaWNhYmxlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgoVElELlRTRmxhZ3MgJiBBUk1JSTo6RG9tYWluTWFzaykgPT0gQVJNSUk6OkRvbWFpbk5FT04pIHsKKyAgICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9CisgICAgICBNSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgICByZXR1cm4gQUZJLT5pc1RodW1iMkZ1bmN0aW9uKCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBGSVhNRTogV29ya3MgYXJvdW5kIGEgZ2NjIG1pc2NvbXBpbGF0aW9uIHdpdGggLWZzdHJpY3QtYWxpYXNpbmcuCitESVNBQkxFX0lOTElORQorc3RhdGljIHVuc2lnbmVkIGdldE51bUpURW50cmllcyhjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lSnVtcFRhYmxlRW50cnk+ICZKVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSlRJKTsKK3N0YXRpYyB1bnNpZ25lZCBnZXROdW1KVEVudHJpZXMoY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUp1bXBUYWJsZUVudHJ5PiAmSlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEpUSSkgeworICBhc3NlcnQoSlRJIDwgSlQuc2l6ZSgpKTsKKyAgcmV0dXJuIEpUW0pUSV0uTUJCcy5zaXplKCk7Cit9CisKKy8vLyBHZXRJbnN0U2l6ZSAtIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIE1hY2hpbmVJbnN0ci4KKy8vLwordW5zaWduZWQgQVJNQmFzZUluc3RySW5mbzo6R2V0SW5zdFNpemVJbkJ5dGVzKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0IHsKKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9ICpNSS0+Z2V0UGFyZW50KCk7CisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBNQkIuZ2V0UGFyZW50KCk7CisgIGNvbnN0IE1DQXNtSW5mbyAqTUFJID0gTUYtPmdldFRhcmdldCgpLmdldE1DQXNtSW5mbygpOworCisgIC8vIEJhc2ljIHNpemUgaW5mbyBjb21lcyBmcm9tIHRoZSBUU0ZsYWdzIGZpZWxkLgorICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgIHVpbnQ2NF90IFRTRmxhZ3MgPSBUSUQuVFNGbGFnczsKKworICB1bnNpZ25lZCBPcGMgPSBNSS0+Z2V0T3Bjb2RlKCk7CisgIHN3aXRjaCAoKFRTRmxhZ3MgJiBBUk1JSTo6U2l6ZU1hc2spID4+IEFSTUlJOjpTaXplU2hpZnQpIHsKKyAgZGVmYXVsdDogeworICAgIC8vIElmIHRoaXMgbWFjaGluZSBpbnN0ciBpcyBhbiBpbmxpbmUgYXNtLCBtZWFzdXJlIGl0LgorICAgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpJTkxJTkVBU00pCisgICAgICByZXR1cm4gZ2V0SW5saW5lQXNtTGVuZ3RoKE1JLT5nZXRPcGVyYW5kKDApLmdldFN5bWJvbE5hbWUoKSwgKk1BSSk7CisgICAgaWYgKE1JLT5pc0xhYmVsKCkpCisgICAgICByZXR1cm4gMDsKKyAgICBzd2l0Y2ggKE9wYykgeworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIG9yIHVuc2V0IHNpemUgZmllbGQgZm9yIGluc3RyISIpOworICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUY6CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OktJTEw6CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OlBST0xPR19MQUJFTDoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6RUhfTEFCRUw6CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OkRCR19WQUxVRToKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFSTUlJOjpTaXplOEJ5dGVzOiByZXR1cm4gODsgICAgICAgICAgLy8gQVJNIGluc3RydWN0aW9uIHggMi4KKyAgY2FzZSBBUk1JSTo6U2l6ZTRCeXRlczogcmV0dXJuIDQ7ICAgICAgICAgIC8vIEFSTSAvIFRodW1iMiBpbnN0cnVjdGlvbi4KKyAgY2FzZSBBUk1JSTo6U2l6ZTJCeXRlczogcmV0dXJuIDI7ICAgICAgICAgIC8vIFRodW1iMSBpbnN0cnVjdGlvbi4KKyAgY2FzZSBBUk1JSTo6U2l6ZVNwZWNpYWw6IHsKKyAgICBzd2l0Y2ggKE9wYykgeworICAgIGNhc2UgQVJNOjpDT05TVFBPT0xfRU5UUlk6CisgICAgICAvLyBJZiB0aGlzIG1hY2hpbmUgaW5zdHIgaXMgYSBjb25zdGFudCBwb29sIGVudHJ5LCBpdHMgc2l6ZSBpcyByZWNvcmRlZCBhcworICAgICAgLy8gb3BlcmFuZCAjMi4KKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKTsKKyAgICBjYXNlIEFSTTo6SW50X2VoX3NqbGpfbG9uZ2ptcDoKKyAgICAgIHJldHVybiAxNjsKKyAgICBjYXNlIEFSTTo6dEludF9laF9zamxqX2xvbmdqbXA6CisgICAgICByZXR1cm4gMTA7CisgICAgY2FzZSBBUk06OkludF9laF9zamxqX3NldGptcDoKKyAgICBjYXNlIEFSTTo6SW50X2VoX3NqbGpfc2V0am1wX25vZnA6CisgICAgICByZXR1cm4gMjA7CisgICAgY2FzZSBBUk06OnRJbnRfZWhfc2psal9zZXRqbXA6CisgICAgY2FzZSBBUk06OnQySW50X2VoX3NqbGpfc2V0am1wOgorICAgIGNhc2UgQVJNOjp0MkludF9laF9zamxqX3NldGptcF9ub2ZwOgorICAgICAgcmV0dXJuIDEyOworICAgIGNhc2UgQVJNOjpCUl9KVHI6CisgICAgY2FzZSBBUk06OkJSX0pUbToKKyAgICBjYXNlIEFSTTo6QlJfSlRhZGQ6CisgICAgY2FzZSBBUk06OnRCUl9KVHI6CisgICAgY2FzZSBBUk06OnQyQlJfSlQ6CisgICAgY2FzZSBBUk06OnQyVEJCOgorICAgIGNhc2UgQVJNOjp0MlRCSDogeworICAgICAgLy8gVGhlc2UgYXJlIGp1bXB0YWJsZSBicmFuY2hlcywgaS5lLiBhIGJyYW5jaCBmb2xsb3dlZCBieSBhbiBpbmxpbmVkCisgICAgICAvLyBqdW1wdGFibGUuIFRoZSBzaXplIGlzIDQgKyA0ICogbnVtYmVyIG9mIGVudHJpZXMuIEZvciBUQkIsIGVhY2gKKyAgICAgIC8vIGVudHJ5IGlzIG9uZSBieXRlOyBUQkggdHdvIGJ5dGUgZWFjaC4KKyAgICAgIHVuc2lnbmVkIEVudHJ5U2l6ZSA9IChPcGMgPT0gQVJNOjp0MlRCQikKKyAgICAgICAgPyAxIDogKChPcGMgPT0gQVJNOjp0MlRCSCkgPyAyIDogNCk7CisgICAgICB1bnNpZ25lZCBOdW1PcHMgPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgIE1hY2hpbmVPcGVyYW5kIEpUT1AgPQorICAgICAgICBNSS0+Z2V0T3BlcmFuZChOdW1PcHMgLSAoVElELmlzUHJlZGljYWJsZSgpID8gMyA6IDIpKTsKKyAgICAgIHVuc2lnbmVkIEpUSSA9IEpUT1AuZ2V0SW5kZXgoKTsKKyAgICAgIGNvbnN0IE1hY2hpbmVKdW1wVGFibGVJbmZvICpNSlRJID0gTUYtPmdldEp1bXBUYWJsZUluZm8oKTsKKyAgICAgIGFzc2VydChNSlRJICE9IDApOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUp1bXBUYWJsZUVudHJ5PiAmSlQgPSBNSlRJLT5nZXRKdW1wVGFibGVzKCk7CisgICAgICBhc3NlcnQoSlRJIDwgSlQuc2l6ZSgpKTsKKyAgICAgIC8vIFRodW1iIGluc3RydWN0aW9ucyBhcmUgMiBieXRlIGFsaWduZWQsIGJ1dCBKVCBlbnRyaWVzIGFyZSA0IGJ5dGUKKyAgICAgIC8vIDQgYWxpZ25lZC4gVGhlIGFzc2VtYmxlciAvIGxpbmtlciBtYXkgYWRkIDIgYnl0ZSBwYWRkaW5nIGp1c3QgYmVmb3JlCisgICAgICAvLyB0aGUgSlQgZW50cmllcy4gIFRoZSBzaXplIGRvZXMgbm90IGluY2x1ZGUgdGhpcyBwYWRkaW5nOyB0aGUKKyAgICAgIC8vIGNvbnN0YW50IGlzbGFuZHMgcGFzcyBkb2VzIHNlcGFyYXRlIGJvb2trZWVwaW5nIGZvciBpdC4KKyAgICAgIC8vIEZJWE1FOiBJZiB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbiBpcyBsZXNzIHRoYW4gKDEgPDwgMTYpICoyCisgICAgICAvLyBieXRlcywgd2UgY2FuIHVzZSAxNi1iaXQgZW50cmllcyBpbnN0ZWFkLiBUaGVuIHRoZXJlIHdvbid0IGJlIGFuCisgICAgICAvLyBhbGlnbm1lbnQgaXNzdWUuCisgICAgICB1bnNpZ25lZCBJbnN0U2l6ZSA9IChPcGMgPT0gQVJNOjp0QlJfSlRyIHx8IE9wYyA9PSBBUk06OnQyQlJfSlQpID8gMiA6IDQ7CisgICAgICB1bnNpZ25lZCBOdW1FbnRyaWVzID0gZ2V0TnVtSlRFbnRyaWVzKEpULCBKVEkpOworICAgICAgaWYgKE9wYyA9PSBBUk06OnQyVEJCICYmIChOdW1FbnRyaWVzICYgMSkpCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBmb2xsb3dzIFRCQiBpcyAyLWJ5dGUgYWxpZ25lZC4KKyAgICAgICAgLy8gRklYTUU6IENvbnN0YW50IGlzbGFuZCBwYXNzIHNob3VsZCBpbnNlcnQgYW4gIkFMSUdOIiBpbnN0cnVjdGlvbgorICAgICAgICAvLyBpbnN0ZWFkLgorICAgICAgICArK051bUVudHJpZXM7CisgICAgICByZXR1cm4gTnVtRW50cmllcyAqIEVudHJ5U2l6ZSArIEluc3RTaXplOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgLy8gT3RoZXJ3aXNlLCBwc2V1ZG8taW5zdHJ1Y3Rpb24gc2l6ZXMgYXJlIHplcm8uCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgfQorICByZXR1cm4gMDsgLy8gTm90IHJlYWNoZWQKK30KKwordW5zaWduZWQKK0FSTUJhc2VJbnN0ckluZm86OmlzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIEFSTTo6TERSOgorICBjYXNlIEFSTTo6dDJMRFJzOiAgLy8gRklYTUU6IGRvbid0IHVzZSB0MkxEUnMgdG8gYWNjZXNzIGZyYW1lLgorICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgxKS5pc0ZJKCkgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMikuaXNSZWcoKSAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgzKS5pc0ltbSgpICYmCisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpID09IDAgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMykuZ2V0SW1tKCkgPT0gMCkgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEFSTTo6dDJMRFJpMTI6CisgIGNhc2UgQVJNOjp0UmVzdG9yZToKKyAgICBpZiAoTUktPmdldE9wZXJhbmQoMSkuaXNGSSgpICYmCisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDIpLmlzSW1tKCkgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCkgPT0gMCkgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEFSTTo6VkxEUkQ6CisgIGNhc2UgQVJNOjpWTERSUzoKKyAgICBpZiAoTUktPmdldE9wZXJhbmQoMSkuaXNGSSgpICYmCisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDIpLmlzSW1tKCkgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCkgPT0gMCkgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkCitBUk1CYXNlSW5zdHJJbmZvOjppc1N0b3JlVG9TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgQVJNOjpTVFI6CisgIGNhc2UgQVJNOjp0MlNUUnM6IC8vIEZJWE1FOiBkb24ndCB1c2UgdDJTVFJzIHRvIGFjY2VzcyBmcmFtZS4KKyAgICBpZiAoTUktPmdldE9wZXJhbmQoMSkuaXNGSSgpICYmCisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDIpLmlzUmVnKCkgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMykuaXNJbW0oKSAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSA9PSAwICYmCisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDMpLmdldEltbSgpID09IDApIHsKKyAgICAgIEZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOworICAgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBBUk06OnQyU1RSaTEyOgorICBjYXNlIEFSTTo6dFNwaWxsOgorICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgxKS5pc0ZJKCkgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMikuaXNJbW0oKSAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSA9PSAwKSB7CisgICAgICBGcmFtZUluZGV4ID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0SW5kZXgoKTsKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpWU1RSRDoKKyAgY2FzZSBBUk06OlZTVFJTOgorICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgxKS5pc0ZJKCkgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMikuaXNJbW0oKSAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSA9PSAwKSB7CisgICAgICBGcmFtZUluZGV4ID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0SW5kZXgoKTsKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gMDsKK30KKwordm9pZCBBUk1CYXNlSW5zdHJJbmZvOjpjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdCB7CisgIGJvb2wgR1BSRGVzdCA9IEFSTTo6R1BSUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZyk7CisgIGJvb2wgR1BSU3JjICA9IEFSTTo6R1BSUmVnQ2xhc3MuY29udGFpbnMoU3JjUmVnKTsKKworICBpZiAoR1BSRGVzdCAmJiBHUFJTcmMpIHsKKyAgICBBZGREZWZhdWx0Q0MoQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjpNT1ZyKSwgRGVzdFJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKSkpOworICAgIHJldHVybjsKKyAgfQorCisgIGJvb2wgU1BSRGVzdCA9IEFSTTo6U1BSUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZyk7CisgIGJvb2wgU1BSU3JjICA9IEFSTTo6U1BSUmVnQ2xhc3MuY29udGFpbnMoU3JjUmVnKTsKKworICB1bnNpZ25lZCBPcGM7CisgIGlmIChTUFJEZXN0ICYmIFNQUlNyYykKKyAgICBPcGMgPSBBUk06OlZNT1ZTOworICBlbHNlIGlmIChHUFJEZXN0ICYmIFNQUlNyYykKKyAgICBPcGMgPSBBUk06OlZNT1ZSUzsKKyAgZWxzZSBpZiAoU1BSRGVzdCAmJiBHUFJTcmMpCisgICAgT3BjID0gQVJNOjpWTU9WU1I7CisgIGVsc2UgaWYgKEFSTTo6RFBSUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBPcGMgPSBBUk06OlZNT1ZEOworICBlbHNlIGlmIChBUk06OlFQUlJlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpCisgICAgT3BjID0gQVJNOjpWTU9WUTsKKyAgZWxzZSBpZiAoQVJNOjpRUVBSUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBPcGMgPSBBUk06OlZNT1ZRUTsKKyAgZWxzZSBpZiAoQVJNOjpRUVFRUFJSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIE9wYyA9IEFSTTo6Vk1PVlFRUVE7CisgIGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbXBvc3NpYmxlIHJlZy10by1yZWcgY29weSIpOworCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSShNQkIsIEksIERMLCBnZXQoT3BjKSwgRGVzdFJlZyk7CisgIE1JQi5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICBpZiAoT3BjICE9IEFSTTo6Vk1PVlFRICYmIE9wYyAhPSBBUk06OlZNT1ZRUVFRKQorICAgIEFkZERlZmF1bHRQcmVkKE1JQik7Cit9CisKK3N0YXRpYyBjb25zdAorTWFjaGluZUluc3RyQnVpbGRlciAmQWRkRFJlZyhNYWNoaW5lSW5zdHJCdWlsZGVyICZNSUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywgdW5zaWduZWQgU3ViSWR4LCB1bnNpZ25lZCBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIHsKKyAgaWYgKCFTdWJJZHgpCisgICAgcmV0dXJuIE1JQi5hZGRSZWcoUmVnLCBTdGF0ZSk7CisKKyAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpCisgICAgcmV0dXJuIE1JQi5hZGRSZWcoVFJJLT5nZXRTdWJSZWcoUmVnLCBTdWJJZHgpLCBTdGF0ZSk7CisgIHJldHVybiBNSUIuYWRkUmVnKFJlZywgU3RhdGUsIFN1YklkeCk7Cit9CisKK3ZvaWQgQVJNQmFzZUluc3RySW5mbzo6CitzdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLCBpbnQgRkksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICBEZWJ1Z0xvYyBETDsKKyAgaWYgKEkgIT0gTUJCLmVuZCgpKSBETCA9IEktPmdldERlYnVnTG9jKCk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICBNYWNoaW5lRnJhbWVJbmZvICZNRkkgPSAqTUYuZ2V0RnJhbWVJbmZvKCk7CisgIHVuc2lnbmVkIEFsaWduID0gTUZJLmdldE9iamVjdEFsaWdubWVudChGSSk7CisKKyAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgTUYuZ2V0TWFjaGluZU1lbU9wZXJhbmQoUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kOjpNT1N0b3JlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RTaXplKEZJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbik7CisKKyAgLy8gdEdQUiBpcyB1c2VkIHNvbWV0aW1lcyBpbiBBUk0gaW5zdHJ1Y3Rpb25zIHRoYXQgbmVlZCB0byBhdm9pZCB1c2luZworICAvLyBjZXJ0YWluIHJlZ2lzdGVycy4gIEp1c3QgdHJlYXQgaXQgYXMgR1BSIGhlcmUuIExpa2V3aXNlLCByR1BSLgorICBpZiAoUkMgPT0gQVJNOjp0R1BSUmVnaXN0ZXJDbGFzcyB8fCBSQyA9PSBBUk06OnRjR1BSUmVnaXN0ZXJDbGFzcworICAgICAgfHwgUkMgPT0gQVJNOjpyR1BSUmVnaXN0ZXJDbGFzcykKKyAgICBSQyA9IEFSTTo6R1BSUmVnaXN0ZXJDbGFzczsKKworICBzd2l0Y2ggKFJDLT5nZXRJRCgpKSB7CisgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOgorICAgIEFkZERlZmF1bHRQcmVkKEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEFSTTo6U1RSKSkKKyAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpCisgICAgICAgICAgICAgICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpLmFkZFJlZygwKS5hZGRJbW0oMCkuYWRkTWVtT3BlcmFuZChNTU8pKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6CisgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjpWU1RSUykpCisgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKQorICAgICAgICAgICAgICAgICAgIC5hZGRGcmFtZUluZGV4KEZJKS5hZGRJbW0oMCkuYWRkTWVtT3BlcmFuZChNTU8pKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6CisgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgIGNhc2UgQVJNOjpEUFJfOFJlZ0NsYXNzSUQ6CisgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjpWU1RSRCkpCisgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKQorICAgICAgICAgICAgICAgICAgIC5hZGRGcmFtZUluZGV4KEZJKS5hZGRJbW0oMCkuYWRkTWVtT3BlcmFuZChNTU8pKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk06OlFQUlJlZ0NsYXNzSUQ6CisgIGNhc2UgQVJNOjpRUFJfVkZQMlJlZ0NsYXNzSUQ6CisgIGNhc2UgQVJNOjpRUFJfOFJlZ0NsYXNzSUQ6CisgICAgLy8gRklYTUU6IE5lb24gaW5zdHJ1Y3Rpb25zIHNob3VsZCBzdXBwb3J0IHByZWRpY2F0ZXMKKyAgICBpZiAoQWxpZ24gPj0gMTYgJiYgZ2V0UmVnaXN0ZXJJbmZvKCkuY2FuUmVhbGlnblN0YWNrKE1GKSkgeworICAgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjpWU1QxcSkpCisgICAgICAgICAgICAgICAgICAgICAuYWRkRnJhbWVJbmRleChGSSkuYWRkSW1tKDE2KQorICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKQorICAgICAgICAgICAgICAgICAgICAgLmFkZE1lbU9wZXJhbmQoTU1PKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZERlZmF1bHRQcmVkKEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEFSTTo6VlNUTVEpKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKQorICAgICAgICAgICAgICAgICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpCisgICAgICAgICAgICAgICAgICAgICAuYWRkSW1tKEFSTV9BTTo6Z2V0QU01T3BjKEFSTV9BTTo6aWEsIDQpKQorICAgICAgICAgICAgICAgICAgICAgLmFkZE1lbU9wZXJhbmQoTU1PKSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEFSTTo6UVFQUlJlZ0NsYXNzSUQ6CisgIGNhc2UgQVJNOjpRUVBSX1ZGUDJSZWdDbGFzc0lEOgorICAgIGlmIChBbGlnbiA+PSAxNiAmJiBnZXRSZWdpc3RlckluZm8oKS5jYW5SZWFsaWduU3RhY2soTUYpKSB7CisgICAgICAvLyBGSVhNRTogSXQncyBwb3NzaWJsZSB0byBvbmx5IHN0b3JlIHBhcnQgb2YgdGhlIFFRIHJlZ2lzdGVyIGlmIHRoZQorICAgICAgLy8gc3BpbGxlZCBkZWYgaGFzIGEgc3ViLXJlZ2lzdGVyIGluZGV4LgorICAgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChBUk06OlZTVDFkNjRRKSkKKyAgICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpLmFkZEltbSgxNik7CisgICAgICBNSUIgPSBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfMCwgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCksIFRSSSk7CisgICAgICBNSUIgPSBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfMSwgMCwgVFJJKTsKKyAgICAgIE1JQiA9IEFkZERSZWcoTUlCLCBTcmNSZWcsIEFSTTo6ZHN1Yl8yLCAwLCBUUkkpOworICAgICAgTUlCID0gQWRkRFJlZyhNSUIsIFNyY1JlZywgQVJNOjpkc3ViXzMsIDAsIFRSSSk7CisgICAgICBBZGREZWZhdWx0UHJlZChNSUIuYWRkTWVtT3BlcmFuZChNTU8pKTsKKyAgICB9IGVsc2UgeworICAgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPQorICAgICAgICBBZGREZWZhdWx0UHJlZChCdWlsZE1JKE1CQiwgSSwgREwsIGdldChBUk06OlZTVE1EKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpCisgICAgICAgICAgICAgICAgICAgICAgIC5hZGRJbW0oQVJNX0FNOjpnZXRBTTVPcGMoQVJNX0FNOjppYSwgNCkpKQorICAgICAgICAuYWRkTWVtT3BlcmFuZChNTU8pOworICAgICAgTUlCID0gQWRkRFJlZyhNSUIsIFNyY1JlZywgQVJNOjpkc3ViXzAsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpLCBUUkkpOworICAgICAgTUlCID0gQWRkRFJlZyhNSUIsIFNyY1JlZywgQVJNOjpkc3ViXzEsIDAsIFRSSSk7CisgICAgICBNSUIgPSBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfMiwgMCwgVFJJKTsKKyAgICAgICAgICAgIEFkZERSZWcoTUlCLCBTcmNSZWcsIEFSTTo6ZHN1Yl8zLCAwLCBUUkkpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBBUk06OlFRUVFQUlJlZ0NsYXNzSUQ6IHsKKyAgICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQiA9CisgICAgICBBZGREZWZhdWx0UHJlZChCdWlsZE1JKE1CQiwgSSwgREwsIGdldChBUk06OlZTVE1EKSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRGcmFtZUluZGV4KEZJKQorICAgICAgICAgICAgICAgICAgICAgLmFkZEltbShBUk1fQU06OmdldEFNNU9wYyhBUk1fQU06OmlhLCA0KSkpCisgICAgICAuYWRkTWVtT3BlcmFuZChNTU8pOworICAgIE1JQiA9IEFkZERSZWcoTUlCLCBTcmNSZWcsIEFSTTo6ZHN1Yl8wLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSwgVFJJKTsKKyAgICBNSUIgPSBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfMSwgMCwgVFJJKTsKKyAgICBNSUIgPSBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfMiwgMCwgVFJJKTsKKyAgICBNSUIgPSBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfMywgMCwgVFJJKTsKKyAgICBNSUIgPSBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfNCwgMCwgVFJJKTsKKyAgICBNSUIgPSBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfNSwgMCwgVFJJKTsKKyAgICBNSUIgPSBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfNiwgMCwgVFJJKTsKKyAgICAgICAgICBBZGREUmVnKE1JQiwgU3JjUmVnLCBBUk06OmRzdWJfNywgMCwgVFJJKTsKKyAgICBicmVhazsKKyAgfQorICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gcmVnY2xhc3MhIik7CisgIH0KK30KKwordm9pZCBBUk1CYXNlSW5zdHJJbmZvOjoKK2xvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZJLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICBEZWJ1Z0xvYyBETDsKKyAgaWYgKEkgIT0gTUJCLmVuZCgpKSBETCA9IEktPmdldERlYnVnTG9jKCk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICBNYWNoaW5lRnJhbWVJbmZvICZNRkkgPSAqTUYuZ2V0RnJhbWVJbmZvKCk7CisgIHVuc2lnbmVkIEFsaWduID0gTUZJLmdldE9iamVjdEFsaWdubWVudChGSSk7CisgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8gPQorICAgIE1GLmdldE1hY2hpbmVNZW1PcGVyYW5kKFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKEZJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Mb2FkLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RTaXplKEZJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbik7CisKKyAgLy8gdEdQUiBpcyB1c2VkIHNvbWV0aW1lcyBpbiBBUk0gaW5zdHJ1Y3Rpb25zIHRoYXQgbmVlZCB0byBhdm9pZCB1c2luZworICAvLyBjZXJ0YWluIHJlZ2lzdGVycy4gIEp1c3QgdHJlYXQgaXQgYXMgR1BSIGhlcmUuCisgIGlmIChSQyA9PSBBUk06OnRHUFJSZWdpc3RlckNsYXNzIHx8IFJDID09IEFSTTo6dGNHUFJSZWdpc3RlckNsYXNzCisgICAgICB8fCBSQyA9PSBBUk06OnJHUFJSZWdpc3RlckNsYXNzKQorICAgIFJDID0gQVJNOjpHUFJSZWdpc3RlckNsYXNzOworCisgIHN3aXRjaCAoUkMtPmdldElEKCkpIHsKKyAgY2FzZSBBUk06OkdQUlJlZ0NsYXNzSUQ6CisgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjpMRFIpLCBEZXN0UmVnKQorICAgICAgICAgICAgICAgICAgIC5hZGRGcmFtZUluZGV4KEZJKS5hZGRSZWcoMCkuYWRkSW1tKDApLmFkZE1lbU9wZXJhbmQoTU1PKSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOgorICAgIEFkZERlZmF1bHRQcmVkKEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEFSTTo6VkxEUlMpLCBEZXN0UmVnKQorICAgICAgICAgICAgICAgICAgIC5hZGRGcmFtZUluZGV4KEZJKS5hZGRJbW0oMCkuYWRkTWVtT3BlcmFuZChNTU8pKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6CisgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgIGNhc2UgQVJNOjpEUFJfOFJlZ0NsYXNzSUQ6CisgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjpWTERSRCksIERlc3RSZWcpCisgICAgICAgICAgICAgICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpLmFkZEltbSgwKS5hZGRNZW1PcGVyYW5kKE1NTykpOworICAgIGJyZWFrOworICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDoKKyAgY2FzZSBBUk06OlFQUl9WRlAyUmVnQ2xhc3NJRDoKKyAgY2FzZSBBUk06OlFQUl84UmVnQ2xhc3NJRDoKKyAgICBpZiAoQWxpZ24gPj0gMTYgJiYgZ2V0UmVnaXN0ZXJJbmZvKCkuY2FuUmVhbGlnblN0YWNrKE1GKSkgeworICAgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjpWTEQxcSksIERlc3RSZWcpCisgICAgICAgICAgICAgICAgICAgICAuYWRkRnJhbWVJbmRleChGSSkuYWRkSW1tKDE2KQorICAgICAgICAgICAgICAgICAgICAgLmFkZE1lbU9wZXJhbmQoTU1PKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZERlZmF1bHRQcmVkKEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEFSTTo6VkxETVEpLCBEZXN0UmVnKQorICAgICAgICAgICAgICAgICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpCisgICAgICAgICAgICAgICAgICAgICAuYWRkSW1tKEFSTV9BTTo6Z2V0QU01T3BjKEFSTV9BTTo6aWEsIDQpKQorICAgICAgICAgICAgICAgICAgICAgLmFkZE1lbU9wZXJhbmQoTU1PKSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEFSTTo6UVFQUlJlZ0NsYXNzSUQ6CisgIGNhc2UgQVJNOjpRUVBSX1ZGUDJSZWdDbGFzc0lEOgorICAgIGlmIChBbGlnbiA+PSAxNiAmJiBnZXRSZWdpc3RlckluZm8oKS5jYW5SZWFsaWduU3RhY2soTUYpKSB7CisgICAgICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQiA9IEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEFSTTo6VkxEMWQ2NFEpKTsKKyAgICAgIE1JQiA9IEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfMCwgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICAgIE1JQiA9IEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfMSwgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICAgIE1JQiA9IEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfMiwgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICAgIE1JQiA9IEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfMywgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICAgIEFkZERlZmF1bHRQcmVkKE1JQi5hZGRGcmFtZUluZGV4KEZJKS5hZGRJbW0oMTYpLmFkZE1lbU9wZXJhbmQoTU1PKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0KKyAgICAgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjpWTERNRCkpCisgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGcmFtZUluZGV4KEZJKQorICAgICAgICAgICAgICAgICAgICAgICAuYWRkSW1tKEFSTV9BTTo6Z2V0QU01T3BjKEFSTV9BTTo6aWEsIDQpKSkKKyAgICAgICAgLmFkZE1lbU9wZXJhbmQoTU1PKTsKKyAgICAgIE1JQiA9IEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfMCwgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICAgIE1JQiA9IEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfMSwgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICAgIE1JQiA9IEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfMiwgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICAgICAgICAgIEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfMywgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpRUVFRUFJSZWdDbGFzc0lEOiB7CisgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPQorICAgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjpWTERNRCkpCisgICAgICAgICAgICAgICAgICAgICAuYWRkRnJhbWVJbmRleChGSSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRJbW0oQVJNX0FNOjpnZXRBTTVPcGMoQVJNX0FNOjppYSwgNCkpKQorICAgICAgLmFkZE1lbU9wZXJhbmQoTU1PKTsKKyAgICBNSUIgPSBBZGREUmVnKE1JQiwgRGVzdFJlZywgQVJNOjpkc3ViXzAsIFJlZ1N0YXRlOjpEZWZpbmUsIFRSSSk7CisgICAgTUlCID0gQWRkRFJlZyhNSUIsIERlc3RSZWcsIEFSTTo6ZHN1Yl8xLCBSZWdTdGF0ZTo6RGVmaW5lLCBUUkkpOworICAgIE1JQiA9IEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfMiwgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICBNSUIgPSBBZGREUmVnKE1JQiwgRGVzdFJlZywgQVJNOjpkc3ViXzMsIFJlZ1N0YXRlOjpEZWZpbmUsIFRSSSk7CisgICAgTUlCID0gQWRkRFJlZyhNSUIsIERlc3RSZWcsIEFSTTo6ZHN1Yl80LCBSZWdTdGF0ZTo6RGVmaW5lLCBUUkkpOworICAgIE1JQiA9IEFkZERSZWcoTUlCLCBEZXN0UmVnLCBBUk06OmRzdWJfNSwgUmVnU3RhdGU6OkRlZmluZSwgVFJJKTsKKyAgICBNSUIgPSBBZGREUmVnKE1JQiwgRGVzdFJlZywgQVJNOjpkc3ViXzYsIFJlZ1N0YXRlOjpEZWZpbmUsIFRSSSk7CisgICAgQWRkRFJlZyhNSUIsIERlc3RSZWcsIEFSTTo6ZHN1Yl83LCBSZWdTdGF0ZTo6RGVmaW5lLCBUUkkpOworICAgIGJyZWFrOworICB9CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biByZWdjbGFzcyEiKTsKKyAgfQorfQorCitNYWNoaW5lSW5zdHIqCitBUk1CYXNlSW5zdHJJbmZvOjplbWl0RnJhbWVJbmRleERlYnVnVmFsdWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRnJhbWVJeCwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqTURQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0IHsKKyAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKE1GLCBETCwgZ2V0KEFSTTo6REJHX1ZBTFVFKSkKKyAgICAuYWRkRnJhbWVJbmRleChGcmFtZUl4KS5hZGRJbW0oMCkuYWRkSW1tKE9mZnNldCkuYWRkTWV0YWRhdGEoTURQdHIpOworICByZXR1cm4gJipNSUI7Cit9CisKKy8vLyBDcmVhdGUgYSBjb3B5IG9mIGEgY29uc3QgcG9vbCB2YWx1ZS4gVXBkYXRlIENQSSB0byB0aGUgbmV3IGluZGV4IGFuZCByZXR1cm4KKy8vLyB0aGUgbGFiZWwgVUlELgorc3RhdGljIHVuc2lnbmVkIGR1cGxpY2F0ZUNQVihNYWNoaW5lRnVuY3Rpb24gJk1GLCB1bnNpZ25lZCAmQ1BJKSB7CisgIE1hY2hpbmVDb25zdGFudFBvb2wgKk1DUCA9IE1GLmdldENvbnN0YW50UG9vbCgpOworICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworCisgIGNvbnN0IE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeSAmTUNQRSA9IE1DUC0+Z2V0Q29uc3RhbnRzKClbQ1BJXTsKKyAgYXNzZXJ0KE1DUEUuaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSAmJgorICAgICAgICAgIkV4cGVjdGluZyBhIG1hY2hpbmUgY29uc3RhbnRwb29sIGVudHJ5ISIpOworICBBUk1Db25zdGFudFBvb2xWYWx1ZSAqQUNQViA9CisgICAgc3RhdGljX2Nhc3Q8QVJNQ29uc3RhbnRQb29sVmFsdWUqPihNQ1BFLlZhbC5NYWNoaW5lQ1BWYWwpOworCisgIHVuc2lnbmVkIFBDTGFiZWxJZCA9IEFGSS0+Y3JlYXRlQ29uc3RQb29sRW50cnlVSWQoKTsKKyAgQVJNQ29uc3RhbnRQb29sVmFsdWUgKk5ld0NQViA9IDA7CisgIGlmIChBQ1BWLT5pc0dsb2JhbFZhbHVlKCkpCisgICAgTmV3Q1BWID0gbmV3IEFSTUNvbnN0YW50UG9vbFZhbHVlKEFDUFYtPmdldEdWKCksIFBDTGFiZWxJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ1A6OkNQVmFsdWUsIDQpOworICBlbHNlIGlmIChBQ1BWLT5pc0V4dFN5bWJvbCgpKQorICAgIE5ld0NQViA9IG5ldyBBUk1Db25zdGFudFBvb2xWYWx1ZShNRi5nZXRGdW5jdGlvbigpLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUFYtPmdldFN5bWJvbCgpLCBQQ0xhYmVsSWQsIDQpOworICBlbHNlIGlmIChBQ1BWLT5pc0Jsb2NrQWRkcmVzcygpKQorICAgIE5ld0NQViA9IG5ldyBBUk1Db25zdGFudFBvb2xWYWx1ZShBQ1BWLT5nZXRCbG9ja0FkZHJlc3MoKSwgUENMYWJlbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DUDo6Q1BCbG9ja0FkZHJlc3MsIDQpOworICBlbHNlCisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBBUk0gY29uc3RhbnRwb29sIHZhbHVlIHR5cGUhISIpOworICBDUEkgPSBNQ1AtPmdldENvbnN0YW50UG9vbEluZGV4KE5ld0NQViwgTUNQRS5nZXRBbGlnbm1lbnQoKSk7CisgIHJldHVybiBQQ0xhYmVsSWQ7Cit9CisKK3ZvaWQgQVJNQmFzZUluc3RySW5mbzo6CityZU1hdGVyaWFsaXplKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTdWJJZHgsCisgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAqT3JpZywKKyAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIGNvbnN0IHsKKyAgdW5zaWduZWQgT3Bjb2RlID0gT3JpZy0+Z2V0T3Bjb2RlKCk7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGRlZmF1bHQ6IHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gTUJCLmdldFBhcmVudCgpLT5DbG9uZU1hY2hpbmVJbnN0cihPcmlnKTsKKyAgICBNSS0+c3Vic3RpdHV0ZVJlZ2lzdGVyKE9yaWctPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCksIERlc3RSZWcsIFN1YklkeCwgVFJJKTsKKyAgICBNQkIuaW5zZXJ0KEksIE1JKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFSTTo6dExEUnBjaV9waWM6CisgIGNhc2UgQVJNOjp0MkxEUnBjaV9waWM6IHsKKyAgICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgICB1bnNpZ25lZCBDUEkgPSBPcmlnLT5nZXRPcGVyYW5kKDEpLmdldEluZGV4KCk7CisgICAgdW5zaWduZWQgUENMYWJlbElkID0gZHVwbGljYXRlQ1BWKE1GLCBDUEkpOworICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSShNQkIsIEksIE9yaWctPmdldERlYnVnTG9jKCksIGdldChPcGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0UmVnKQorICAgICAgLmFkZENvbnN0YW50UG9vbEluZGV4KENQSSkuYWRkSW1tKFBDTGFiZWxJZCk7CisgICAgKCpNSUIpLnNldE1lbVJlZnMoT3JpZy0+bWVtb3BlcmFuZHNfYmVnaW4oKSwgT3JpZy0+bWVtb3BlcmFuZHNfZW5kKCkpOworICAgIGJyZWFrOworICB9CisgIH0KK30KKworTWFjaGluZUluc3RyICoKK0FSTUJhc2VJbnN0ckluZm86OmR1cGxpY2F0ZShNYWNoaW5lSW5zdHIgKk9yaWcsIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgTWFjaGluZUluc3RyICpNSSA9IFRhcmdldEluc3RySW5mb0ltcGw6OmR1cGxpY2F0ZShPcmlnLCBNRik7CisgIHN3aXRjaChPcmlnLT5nZXRPcGNvZGUoKSkgeworICBjYXNlIEFSTTo6dExEUnBjaV9waWM6CisgIGNhc2UgQVJNOjp0MkxEUnBjaV9waWM6IHsKKyAgICB1bnNpZ25lZCBDUEkgPSBPcmlnLT5nZXRPcGVyYW5kKDEpLmdldEluZGV4KCk7CisgICAgdW5zaWduZWQgUENMYWJlbElkID0gZHVwbGljYXRlQ1BWKE1GLCBDUEkpOworICAgIE9yaWctPmdldE9wZXJhbmQoMSkuc2V0SW5kZXgoQ1BJKTsKKyAgICBPcmlnLT5nZXRPcGVyYW5kKDIpLnNldEltbShQQ0xhYmVsSWQpOworICAgIGJyZWFrOworICB9CisgIH0KKyAgcmV0dXJuIE1JOworfQorCitib29sIEFSTUJhc2VJbnN0ckluZm86OnByb2R1Y2VTYW1lVmFsdWUoY29uc3QgTWFjaGluZUluc3RyICpNSTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpNSTEpIGNvbnN0IHsKKyAgaW50IE9wY29kZSA9IE1JMC0+Z2V0T3Bjb2RlKCk7CisgIGlmIChPcGNvZGUgPT0gQVJNOjp0MkxEUnBjaSB8fAorICAgICAgT3Bjb2RlID09IEFSTTo6dDJMRFJwY2lfcGljIHx8CisgICAgICBPcGNvZGUgPT0gQVJNOjp0TERScGNpIHx8CisgICAgICBPcGNvZGUgPT0gQVJNOjp0TERScGNpX3BpYykgeworICAgIGlmIChNSTEtPmdldE9wY29kZSgpICE9IE9wY29kZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoTUkwLT5nZXROdW1PcGVyYW5kcygpICE9IE1JMS0+Z2V0TnVtT3BlcmFuZHMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzAgPSBNSTAtPmdldE9wZXJhbmQoMSk7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMSA9IE1JMS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBpZiAoTU8wLmdldE9mZnNldCgpICE9IE1PMS5nZXRPZmZzZXQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBNSTAtPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICBjb25zdCBNYWNoaW5lQ29uc3RhbnRQb29sICpNQ1AgPSBNRi0+Z2V0Q29uc3RhbnRQb29sKCk7CisgICAgaW50IENQSTAgPSBNTzAuZ2V0SW5kZXgoKTsKKyAgICBpbnQgQ1BJMSA9IE1PMS5nZXRJbmRleCgpOworICAgIGNvbnN0IE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeSAmTUNQRTAgPSBNQ1AtPmdldENvbnN0YW50cygpW0NQSTBdOworICAgIGNvbnN0IE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeSAmTUNQRTEgPSBNQ1AtPmdldENvbnN0YW50cygpW0NQSTFdOworICAgIEFSTUNvbnN0YW50UG9vbFZhbHVlICpBQ1BWMCA9CisgICAgICBzdGF0aWNfY2FzdDxBUk1Db25zdGFudFBvb2xWYWx1ZSo+KE1DUEUwLlZhbC5NYWNoaW5lQ1BWYWwpOworICAgIEFSTUNvbnN0YW50UG9vbFZhbHVlICpBQ1BWMSA9CisgICAgICBzdGF0aWNfY2FzdDxBUk1Db25zdGFudFBvb2xWYWx1ZSo+KE1DUEUxLlZhbC5NYWNoaW5lQ1BWYWwpOworICAgIHJldHVybiBBQ1BWMC0+aGFzU2FtZVZhbHVlKEFDUFYxKTsKKyAgfQorCisgIHJldHVybiBNSTAtPmlzSWRlbnRpY2FsVG8oTUkxLCBNYWNoaW5lSW5zdHI6Oklnbm9yZVZSZWdEZWZzKTsKK30KKworLy8vIGFyZUxvYWRzRnJvbVNhbWVCYXNlUHRyIC0gVGhpcyBpcyB1c2VkIGJ5IHRoZSBwcmUtcmVnYWxsb2Mgc2NoZWR1bGVyIHRvCisvLy8gZGV0ZXJtaW5lIGlmIHR3byBsb2FkcyBhcmUgbG9hZGluZyBmcm9tIHRoZSBzYW1lIGJhc2UgYWRkcmVzcy4gSXQgc2hvdWxkCisvLy8gb25seSByZXR1cm4gdHJ1ZSBpZiB0aGUgYmFzZSBwb2ludGVycyBhcmUgdGhlIHNhbWUgYW5kIHRoZSBvbmx5IGRpZmZlcmVuY2VzCisvLy8gYmV0d2VlbiB0aGUgdHdvIGFkZHJlc3NlcyBpcyB0aGUgb2Zmc2V0LiBJdCBhbHNvIHJldHVybnMgdGhlIG9mZnNldHMgYnkKKy8vLyByZWZlcmVuY2UuCitib29sIEFSTUJhc2VJbnN0ckluZm86OmFyZUxvYWRzRnJvbVNhbWVCYXNlUHRyKFNETm9kZSAqTG9hZDEsIFNETm9kZSAqTG9hZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJk9mZnNldDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJk9mZnNldDIpIGNvbnN0IHsKKyAgLy8gRG9uJ3Qgd29ycnkgYWJvdXQgVGh1bWI6IGp1c3QgQVJNIGFuZCBUaHVtYjIuCisgIGlmIChTdWJ0YXJnZXQuaXNUaHVtYjFPbmx5KCkpIHJldHVybiBmYWxzZTsKKworICBpZiAoIUxvYWQxLT5pc01hY2hpbmVPcGNvZGUoKSB8fCAhTG9hZDItPmlzTWFjaGluZU9wY29kZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBzd2l0Y2ggKExvYWQxLT5nZXRNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgQVJNOjpMRFI6CisgIGNhc2UgQVJNOjpMRFJCOgorICBjYXNlIEFSTTo6TERSRDoKKyAgY2FzZSBBUk06OkxEUkg6CisgIGNhc2UgQVJNOjpMRFJTQjoKKyAgY2FzZSBBUk06OkxEUlNIOgorICBjYXNlIEFSTTo6VkxEUkQ6CisgIGNhc2UgQVJNOjpWTERSUzoKKyAgY2FzZSBBUk06OnQyTERSaTg6CisgIGNhc2UgQVJNOjp0MkxEUkRpODoKKyAgY2FzZSBBUk06OnQyTERSU0hpODoKKyAgY2FzZSBBUk06OnQyTERSaTEyOgorICBjYXNlIEFSTTo6dDJMRFJTSGkxMjoKKyAgICBicmVhazsKKyAgfQorCisgIHN3aXRjaCAoTG9hZDItPmdldE1hY2hpbmVPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBBUk06OkxEUjoKKyAgY2FzZSBBUk06OkxEUkI6CisgIGNhc2UgQVJNOjpMRFJEOgorICBjYXNlIEFSTTo6TERSSDoKKyAgY2FzZSBBUk06OkxEUlNCOgorICBjYXNlIEFSTTo6TERSU0g6CisgIGNhc2UgQVJNOjpWTERSRDoKKyAgY2FzZSBBUk06OlZMRFJTOgorICBjYXNlIEFSTTo6dDJMRFJpODoKKyAgY2FzZSBBUk06OnQyTERSRGk4OgorICBjYXNlIEFSTTo6dDJMRFJTSGk4OgorICBjYXNlIEFSTTo6dDJMRFJpMTI6CisgIGNhc2UgQVJNOjp0MkxEUlNIaTEyOgorICAgIGJyZWFrOworICB9CisKKyAgLy8gQ2hlY2sgaWYgYmFzZSBhZGRyZXNzZXMgYW5kIGNoYWluIG9wZXJhbmRzIG1hdGNoLgorICBpZiAoTG9hZDEtPmdldE9wZXJhbmQoMCkgIT0gTG9hZDItPmdldE9wZXJhbmQoMCkgfHwKKyAgICAgIExvYWQxLT5nZXRPcGVyYW5kKDQpICE9IExvYWQyLT5nZXRPcGVyYW5kKDQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJbmRleCBzaG91bGQgYmUgUmVnMC4KKyAgaWYgKExvYWQxLT5nZXRPcGVyYW5kKDMpICE9IExvYWQyLT5nZXRPcGVyYW5kKDMpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBEZXRlcm1pbmUgdGhlIG9mZnNldHMuCisgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KExvYWQxLT5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihMb2FkMi0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICBPZmZzZXQxID0gY2FzdDxDb25zdGFudFNETm9kZT4oTG9hZDEtPmdldE9wZXJhbmQoMSkpLT5nZXRTRXh0VmFsdWUoKTsKKyAgICBPZmZzZXQyID0gY2FzdDxDb25zdGFudFNETm9kZT4oTG9hZDItPmdldE9wZXJhbmQoMSkpLT5nZXRTRXh0VmFsdWUoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIHNob3VsZFNjaGVkdWxlTG9hZHNOZWFyIC0gVGhpcyBpcyBhIHVzZWQgYnkgdGhlIHByZS1yZWdhbGxvYyBzY2hlZHVsZXIgdG8KKy8vLyBkZXRlcm1pbmUgKGluIGNvbmp1Y3Rpb24gd2l0aCBhcmVMb2Fkc0Zyb21TYW1lQmFzZVB0cikgaWYgdHdvIGxvYWRzIHNob3VsZAorLy8vIGJlIHNjaGVkdWxlZCB0b2d0aGVyLiBPbiBzb21lIHRhcmdldHMgaWYgdHdvIGxvYWRzIGFyZSBsb2FkaW5nIGZyb20KKy8vLyBhZGRyZXNzZXMgaW4gdGhlIHNhbWUgY2FjaGUgbGluZSwgaXQncyBiZXR0ZXIgaWYgdGhleSBhcmUgc2NoZWR1bGVkCisvLy8gdG9nZXRoZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgdHdvIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBsb2FkIG9mZnNldHMKKy8vLyBmcm9tIHRoZSBjb21tb24gYmFzZSBhZGRyZXNzLiBJdCByZXR1cm5zIHRydWUgaWYgaXQgZGVjaWRlcyBpdCdzIGRlc2lyYWJsZQorLy8vIHRvIHNjaGVkdWxlIHRoZSB0d28gbG9hZHMgdG9nZXRoZXIuICJOdW1Mb2FkcyIgaXMgdGhlIG51bWJlciBvZiBsb2FkcyB0aGF0CisvLy8gaGF2ZSBhbHJlYWR5IGJlZW4gc2NoZWR1bGVkIGFmdGVyIExvYWQxLgorYm9vbCBBUk1CYXNlSW5zdHJJbmZvOjpzaG91bGRTY2hlZHVsZUxvYWRzTmVhcihTRE5vZGUgKkxvYWQxLCBTRE5vZGUgKkxvYWQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldDEsIGludDY0X3QgT2Zmc2V0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtTG9hZHMpIGNvbnN0IHsKKyAgLy8gRG9uJ3Qgd29ycnkgYWJvdXQgVGh1bWI6IGp1c3QgQVJNIGFuZCBUaHVtYjIuCisgIGlmIChTdWJ0YXJnZXQuaXNUaHVtYjFPbmx5KCkpIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoT2Zmc2V0MiA+IE9mZnNldDEpOworCisgIGlmICgoT2Zmc2V0MiAtIE9mZnNldDEpIC8gOCA+IDY0KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoTG9hZDEtPmdldE1hY2hpbmVPcGNvZGUoKSAhPSBMb2FkMi0+Z2V0TWFjaGluZU9wY29kZSgpKQorICAgIHJldHVybiBmYWxzZTsgIC8vIEZJWE1FOiBvdmVybHkgY29uc2VydmF0aXZlPworCisgIC8vIEZvdXIgbG9hZHMgaW4gYSByb3cgc2hvdWxkIGJlIHN1ZmZpY2llbnQuCisgIGlmIChOdW1Mb2FkcyA+PSAzKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBUk1CYXNlSW5zdHJJbmZvOjppc1NjaGVkdWxpbmdCb3VuZGFyeShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIC8vIERlYnVnIGluZm8gaXMgbmV2ZXIgYSBzY2hlZHVsaW5nIGJvdW5kYXJ5LiBJdCdzIG5lY2Vzc2FyeSB0byBiZSBleHBsaWNpdAorICAvLyBkdWUgdG8gdGhlIHNwZWNpYWwgdHJlYXRtZW50IG9mIElUIGluc3RydWN0aW9ucyBiZWxvdywgb3RoZXJ3aXNlIGEKKyAgLy8gZGJnX3ZhbHVlIGZvbGxvd2VkIGJ5IGFuIElUIHdpbGwgcmVzdWx0IGluIHRoZSBJVCBpbnN0cnVjdGlvbiBiZWluZworICAvLyBjb25zaWRlcmVkIGEgc2NoZWR1bGluZyBoYXphcmQsIHdoaWNoIGlzIHdyb25nLiBJdCBzaG91bGQgYmUgdGhlIGFjdHVhbAorICAvLyBpbnN0cnVjdGlvbiBwcmVjZWRpbmcgdGhlIGRiZ192YWx1ZSBpbnN0cnVjdGlvbihzKSwganVzdCBsaWtlIGl0IGlzCisgIC8vIHdoZW4gZGVidWcgaW5mbyBpcyBub3QgcHJlc2VudC4KKyAgaWYgKE1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVGVybWluYXRvcnMgYW5kIGxhYmVscyBjYW4ndCBiZSBzY2hlZHVsZWQgYXJvdW5kLgorICBpZiAoTUktPmdldERlc2MoKS5pc1Rlcm1pbmF0b3IoKSB8fCBNSS0+aXNMYWJlbCgpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFRyZWF0IHRoZSBzdGFydCBvZiB0aGUgSVQgYmxvY2sgYXMgYSBzY2hlZHVsaW5nIGJvdW5kYXJ5LCBidXQgc2NoZWR1bGUKKyAgLy8gdDJJVCBhbG9uZyB3aXRoIGFsbCBpbnN0cnVjdGlvbnMgZm9sbG93aW5nIGl0LgorICAvLyBGSVhNRTogVGhpcyBpcyBhIGJpZyBoYW1tZXIuIEJ1dCB0aGUgYWx0ZXJuYXRpdmUgaXMgdG8gYWRkIGFsbCBwb3RlbnRpYWwKKyAgLy8gdHJ1ZSBhbmQgYW50aSBkZXBlbmRlbmNpZXMgdG8gSVQgYmxvY2sgaW5zdHJ1Y3Rpb25zIGFzIGltcGxpY2l0IG9wZXJhbmRzCisgIC8vIHRvIHRoZSB0MklUIGluc3RydWN0aW9uLiBUaGUgYWRkZWQgY29tcGlsZSB0aW1lIGFuZCBjb21wbGV4aXR5IGRvZXMgbm90CisgIC8vIHNlZW0gd29ydGggaXQuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBJID0gTUk7CisgIC8vIE1ha2Ugc3VyZSB0byBza2lwIGFueSBkYmdfdmFsdWUgaW5zdHJ1Y3Rpb25zCisgIHdoaWxlICgrK0kgIT0gTUJCLT5lbmQoKSAmJiBJLT5pc0RlYnVnVmFsdWUoKSkKKyAgICA7CisgIGlmIChJICE9IE1CQi0+ZW5kKCkgJiYgSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0MklUKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIERvbid0IGF0dGVtcHQgdG8gc2NoZWR1bGUgYXJvdW5kIGFueSBpbnN0cnVjdGlvbiB0aGF0IGRlZmluZXMKKyAgLy8gYSBzdGFjay1vcmllbnRlZCBwb2ludGVyLCBhcyBpdCdzIHVubGlrZWx5IHRvIGJlIHByb2ZpdGFibGUuIFRoaXMKKyAgLy8gc2F2ZXMgY29tcGlsZSB0aW1lLCBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVxdWlyZSBldmVyeSBzaW5nbGUKKyAgLy8gc3RhY2sgc2xvdCByZWZlcmVuY2UgdG8gZGVwZW5kIG9uIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGRvZXMgdGhlCisgIC8vIG1vZGlmaWNhdGlvbi4KKyAgaWYgKE1JLT5kZWZpbmVzUmVnaXN0ZXIoQVJNOjpTUCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFSTUJhc2VJbnN0ckluZm86OgoraXNQcm9maXRhYmxlVG9JZkN2dChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCB1bnNpZ25lZCBOdW1JbnN0cnMpIGNvbnN0IHsKKyAgaWYgKCFOdW1JbnN0cnMpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoU3VidGFyZ2V0LmdldENQVVN0cmluZygpID09ICJnZW5lcmljIikKKyAgICAvLyBHZW5lcmljIChhbmQgb3Zlcmx5IGFnZ3Jlc3NpdmUpIGlmLWNvbnZlcnNpb24gbGltaXRzIGZvciB0ZXN0aW5nLgorICAgIHJldHVybiBOdW1JbnN0cnMgPD0gMTA7CisgIGVsc2UgaWYgKFN1YnRhcmdldC5oYXNWN09wcygpKQorICAgIHJldHVybiBOdW1JbnN0cnMgPD0gMzsKKyAgcmV0dXJuIE51bUluc3RycyA8PSAyOworfQorICAKK2Jvb2wgQVJNQmFzZUluc3RySW5mbzo6Citpc1Byb2ZpdGFibGVUb0lmQ3Z0KE1hY2hpbmVCYXNpY0Jsb2NrICZUTUJCLCB1bnNpZ25lZCBOdW1ULAorICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmRk1CQiwgdW5zaWduZWQgTnVtRikgY29uc3QgeworICByZXR1cm4gTnVtVCAmJiBOdW1GICYmIE51bVQgPD0gMiAmJiBOdW1GIDw9IDI7Cit9CisKKy8vLyBnZXRJbnN0clByZWRpY2F0ZSAtIElmIGluc3RydWN0aW9uIGlzIHByZWRpY2F0ZWQsIHJldHVybnMgaXRzIHByZWRpY2F0ZQorLy8vIGNvbmRpdGlvbiwgb3RoZXJ3aXNlIHJldHVybnMgQUwuIEl0IGFsc28gcmV0dXJucyB0aGUgY29uZGl0aW9uIGNvZGUKKy8vLyByZWdpc3RlciBieSByZWZlcmVuY2UuCitBUk1DQzo6Q29uZENvZGVzCitsbHZtOjpnZXRJbnN0clByZWRpY2F0ZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCAmUHJlZFJlZykgeworICBpbnQgUElkeCA9IE1JLT5maW5kRmlyc3RQcmVkT3BlcmFuZElkeCgpOworICBpZiAoUElkeCA9PSAtMSkgeworICAgIFByZWRSZWcgPSAwOworICAgIHJldHVybiBBUk1DQzo6QUw7CisgIH0KKworICBQcmVkUmVnID0gTUktPmdldE9wZXJhbmQoUElkeCsxKS5nZXRSZWcoKTsKKyAgcmV0dXJuIChBUk1DQzo6Q29uZENvZGVzKU1JLT5nZXRPcGVyYW5kKFBJZHgpLmdldEltbSgpOworfQorCisKK2ludCBsbHZtOjpnZXRNYXRjaGluZ0NvbmRCcmFuY2hPcGNvZGUoaW50IE9wYykgeworICBpZiAoT3BjID09IEFSTTo6QikKKyAgICByZXR1cm4gQVJNOjpCY2M7CisgIGVsc2UgaWYgKE9wYyA9PSBBUk06OnRCKQorICAgIHJldHVybiBBUk06OnRCY2M7CisgIGVsc2UgaWYgKE9wYyA9PSBBUk06OnQyQikKKyAgICAgIHJldHVybiBBUk06OnQyQmNjOworCisgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdW5jb25kaXRpb25hbCBicmFuY2ggb3Bjb2RlISIpOworICByZXR1cm4gMDsKK30KKworCit2b2lkIGxsdm06OmVtaXRBUk1SZWdQbHVzSW1tZWRpYXRlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBCYXNlUmVnLCBpbnQgTnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBQcmVkLCB1bnNpZ25lZCBQcmVkUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTUJhc2VJbnN0ckluZm8gJlRJSSkgeworICBib29sIGlzU3ViID0gTnVtQnl0ZXMgPCAwOworICBpZiAoaXNTdWIpIE51bUJ5dGVzID0gLU51bUJ5dGVzOworCisgIHdoaWxlIChOdW1CeXRlcykgeworICAgIHVuc2lnbmVkIFJvdEFtdCA9IEFSTV9BTTo6Z2V0U09JbW1WYWxSb3RhdGUoTnVtQnl0ZXMpOworICAgIHVuc2lnbmVkIFRoaXNWYWwgPSBOdW1CeXRlcyAmIEFSTV9BTTo6cm90cjMyKDB4RkYsIFJvdEFtdCk7CisgICAgYXNzZXJ0KFRoaXNWYWwgJiYgIkRpZG4ndCBleHRyYWN0IGZpZWxkIGNvcnJlY3RseSIpOworCisgICAgLy8gV2Ugd2lsbCBoYW5kbGUgdGhlc2UgYml0cyBmcm9tIG9mZnNldCwgY2xlYXIgdGhlbS4KKyAgICBOdW1CeXRlcyAmPSB+VGhpc1ZhbDsKKworICAgIGFzc2VydChBUk1fQU06OmdldFNPSW1tVmFsKFRoaXNWYWwpICE9IC0xICYmICJCaXQgZXh0cmFjdGlvbiBkaWRuJ3Qgd29yaz8iKTsKKworICAgIC8vIEJ1aWxkIHRoZSBuZXcgQUREIC8gU1VCLgorICAgIHVuc2lnbmVkIE9wYyA9IGlzU3ViID8gQVJNOjpTVUJyaSA6IEFSTTo6QUREcmk7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KE9wYyksIERlc3RSZWcpCisgICAgICAuYWRkUmVnKEJhc2VSZWcsIFJlZ1N0YXRlOjpLaWxsKS5hZGRJbW0oVGhpc1ZhbCkKKyAgICAgIC5hZGRJbW0oKHVuc2lnbmVkKVByZWQpLmFkZFJlZyhQcmVkUmVnKS5hZGRSZWcoMCk7CisgICAgQmFzZVJlZyA9IERlc3RSZWc7CisgIH0KK30KKworYm9vbCBsbHZtOjpyZXdyaXRlQVJNRnJhbWVJbmRleChNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBGcmFtZVJlZ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRnJhbWVSZWcsIGludCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZUSUkpIHsKKyAgdW5zaWduZWQgT3Bjb2RlID0gTUkuZ2V0T3Bjb2RlKCk7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmRGVzYyA9IE1JLmdldERlc2MoKTsKKyAgdW5zaWduZWQgQWRkck1vZGUgPSAoRGVzYy5UU0ZsYWdzICYgQVJNSUk6OkFkZHJNb2RlTWFzayk7CisgIGJvb2wgaXNTdWIgPSBmYWxzZTsKKworICAvLyBNZW1vcnkgb3BlcmFuZHMgaW4gaW5saW5lIGFzc2VtYmx5IGFsd2F5cyB1c2UgQWRkck1vZGUyLgorICBpZiAoT3Bjb2RlID09IEFSTTo6SU5MSU5FQVNNKQorICAgIEFkZHJNb2RlID0gQVJNSUk6OkFkZHJNb2RlMjsKKworICBpZiAoT3Bjb2RlID09IEFSTTo6QUREcmkpIHsKKyAgICBPZmZzZXQgKz0gTUkuZ2V0T3BlcmFuZChGcmFtZVJlZ0lkeCsxKS5nZXRJbW0oKTsKKyAgICBpZiAoT2Zmc2V0ID09IDApIHsKKyAgICAgIC8vIFR1cm4gaXQgaW50byBhIG1vdmUuCisgICAgICBNSS5zZXREZXNjKFRJSS5nZXQoQVJNOjpNT1ZyKSk7CisgICAgICBNSS5nZXRPcGVyYW5kKEZyYW1lUmVnSWR4KS5DaGFuZ2VUb1JlZ2lzdGVyKEZyYW1lUmVnLCBmYWxzZSk7CisgICAgICBNSS5SZW1vdmVPcGVyYW5kKEZyYW1lUmVnSWR4KzEpOworICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoT2Zmc2V0IDwgMCkgeworICAgICAgT2Zmc2V0ID0gLU9mZnNldDsKKyAgICAgIGlzU3ViID0gdHJ1ZTsKKyAgICAgIE1JLnNldERlc2MoVElJLmdldChBUk06OlNVQnJpKSk7CisgICAgfQorCisgICAgLy8gQ29tbW9uIGNhc2U6IHNtYWxsIG9mZnNldCwgZml0cyBpbnRvIGluc3RydWN0aW9uLgorICAgIGlmIChBUk1fQU06OmdldFNPSW1tVmFsKE9mZnNldCkgIT0gLTEpIHsKKyAgICAgIC8vIFJlcGxhY2UgdGhlIEZyYW1lSW5kZXggd2l0aCBzcCAvIGZwCisgICAgICBNSS5nZXRPcGVyYW5kKEZyYW1lUmVnSWR4KS5DaGFuZ2VUb1JlZ2lzdGVyKEZyYW1lUmVnLCBmYWxzZSk7CisgICAgICBNSS5nZXRPcGVyYW5kKEZyYW1lUmVnSWR4KzEpLkNoYW5nZVRvSW1tZWRpYXRlKE9mZnNldCk7CisgICAgICBPZmZzZXQgPSAwOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBwdWxsIGFzIG11Y2ggb2YgdGhlIGltbWVkaWRhdGUgaW50byB0aGlzIEFERHJpL1NVQnJpCisgICAgLy8gYXMgcG9zc2libGUuCisgICAgdW5zaWduZWQgUm90QW10ID0gQVJNX0FNOjpnZXRTT0ltbVZhbFJvdGF0ZShPZmZzZXQpOworICAgIHVuc2lnbmVkIFRoaXNJbW1WYWwgPSBPZmZzZXQgJiBBUk1fQU06OnJvdHIzMigweEZGLCBSb3RBbXQpOworCisgICAgLy8gV2Ugd2lsbCBoYW5kbGUgdGhlc2UgYml0cyBmcm9tIG9mZnNldCwgY2xlYXIgdGhlbS4KKyAgICBPZmZzZXQgJj0gflRoaXNJbW1WYWw7CisKKyAgICAvLyBHZXQgdGhlIHByb3Blcmx5IGVuY29kZWQgU09JbW1WYWwgZmllbGQuCisgICAgYXNzZXJ0KEFSTV9BTTo6Z2V0U09JbW1WYWwoVGhpc0ltbVZhbCkgIT0gLTEgJiYKKyAgICAgICAgICAgIkJpdCBleHRyYWN0aW9uIGRpZG4ndCB3b3JrPyIpOworICAgIE1JLmdldE9wZXJhbmQoRnJhbWVSZWdJZHgrMSkuQ2hhbmdlVG9JbW1lZGlhdGUoVGhpc0ltbVZhbCk7CisgfSBlbHNlIHsKKyAgICB1bnNpZ25lZCBJbW1JZHggPSAwOworICAgIGludCBJbnN0ck9mZnMgPSAwOworICAgIHVuc2lnbmVkIE51bUJpdHMgPSAwOworICAgIHVuc2lnbmVkIFNjYWxlID0gMTsKKyAgICBzd2l0Y2ggKEFkZHJNb2RlKSB7CisgICAgY2FzZSBBUk1JSTo6QWRkck1vZGUyOiB7CisgICAgICBJbW1JZHggPSBGcmFtZVJlZ0lkeCsyOworICAgICAgSW5zdHJPZmZzID0gQVJNX0FNOjpnZXRBTTJPZmZzZXQoTUkuZ2V0T3BlcmFuZChJbW1JZHgpLmdldEltbSgpKTsKKyAgICAgIGlmIChBUk1fQU06OmdldEFNMk9wKE1JLmdldE9wZXJhbmQoSW1tSWR4KS5nZXRJbW0oKSkgPT0gQVJNX0FNOjpzdWIpCisgICAgICAgIEluc3RyT2ZmcyAqPSAtMTsKKyAgICAgIE51bUJpdHMgPSAxMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFSTUlJOjpBZGRyTW9kZTM6IHsKKyAgICAgIEltbUlkeCA9IEZyYW1lUmVnSWR4KzI7CisgICAgICBJbnN0ck9mZnMgPSBBUk1fQU06OmdldEFNM09mZnNldChNSS5nZXRPcGVyYW5kKEltbUlkeCkuZ2V0SW1tKCkpOworICAgICAgaWYgKEFSTV9BTTo6Z2V0QU0zT3AoTUkuZ2V0T3BlcmFuZChJbW1JZHgpLmdldEltbSgpKSA9PSBBUk1fQU06OnN1YikKKyAgICAgICAgSW5zdHJPZmZzICo9IC0xOworICAgICAgTnVtQml0cyA9IDg7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBUk1JSTo6QWRkck1vZGU0OgorICAgIGNhc2UgQVJNSUk6OkFkZHJNb2RlNjoKKyAgICAgIC8vIENhbid0IGZvbGQgYW55IG9mZnNldCBldmVuIGlmIGl0J3MgemVyby4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEFSTUlJOjpBZGRyTW9kZTU6IHsKKyAgICAgIEltbUlkeCA9IEZyYW1lUmVnSWR4KzE7CisgICAgICBJbnN0ck9mZnMgPSBBUk1fQU06OmdldEFNNU9mZnNldChNSS5nZXRPcGVyYW5kKEltbUlkeCkuZ2V0SW1tKCkpOworICAgICAgaWYgKEFSTV9BTTo6Z2V0QU01T3AoTUkuZ2V0T3BlcmFuZChJbW1JZHgpLmdldEltbSgpKSA9PSBBUk1fQU06OnN1YikKKyAgICAgICAgSW5zdHJPZmZzICo9IC0xOworICAgICAgTnVtQml0cyA9IDg7CisgICAgICBTY2FsZSA9IDQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIGFkZHJlc3NpbmcgbW9kZSEiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIE9mZnNldCArPSBJbnN0ck9mZnMgKiBTY2FsZTsKKyAgICBhc3NlcnQoKE9mZnNldCAmIChTY2FsZS0xKSkgPT0gMCAmJiAiQ2FuJ3QgZW5jb2RlIHRoaXMgb2Zmc2V0ISIpOworICAgIGlmIChPZmZzZXQgPCAwKSB7CisgICAgICBPZmZzZXQgPSAtT2Zmc2V0OworICAgICAgaXNTdWIgPSB0cnVlOworICAgIH0KKworICAgIC8vIEF0dGVtcHQgdG8gZm9sZCBhZGRyZXNzIGNvbXAuIGlmIG9wY29kZSBoYXMgb2Zmc2V0IGJpdHMKKyAgICBpZiAoTnVtQml0cyA+IDApIHsKKyAgICAgIC8vIENvbW1vbiBjYXNlOiBzbWFsbCBvZmZzZXQsIGZpdHMgaW50byBpbnN0cnVjdGlvbi4KKyAgICAgIE1hY2hpbmVPcGVyYW5kICZJbW1PcCA9IE1JLmdldE9wZXJhbmQoSW1tSWR4KTsKKyAgICAgIGludCBJbW1lZE9mZnNldCA9IE9mZnNldCAvIFNjYWxlOworICAgICAgdW5zaWduZWQgTWFzayA9ICgxIDw8IE51bUJpdHMpIC0gMTsKKyAgICAgIGlmICgodW5zaWduZWQpT2Zmc2V0IDw9IE1hc2sgKiBTY2FsZSkgeworICAgICAgICAvLyBSZXBsYWNlIHRoZSBGcmFtZUluZGV4IHdpdGggc3AKKyAgICAgICAgTUkuZ2V0T3BlcmFuZChGcmFtZVJlZ0lkeCkuQ2hhbmdlVG9SZWdpc3RlcihGcmFtZVJlZywgZmFsc2UpOworICAgICAgICBpZiAoaXNTdWIpCisgICAgICAgICAgSW1tZWRPZmZzZXQgfD0gMSA8PCBOdW1CaXRzOworICAgICAgICBJbW1PcC5DaGFuZ2VUb0ltbWVkaWF0ZShJbW1lZE9mZnNldCk7CisgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICAvLyBPdGhlcndpc2UsIGl0IGRpZG4ndCBmaXQuIFB1bGwgaW4gd2hhdCB3ZSBjYW4gdG8gc2ltcGxpZnkgdGhlIGltbWVkLgorICAgICAgSW1tZWRPZmZzZXQgPSBJbW1lZE9mZnNldCAmIE1hc2s7CisgICAgICBpZiAoaXNTdWIpCisgICAgICAgIEltbWVkT2Zmc2V0IHw9IDEgPDwgTnVtQml0czsKKyAgICAgIEltbU9wLkNoYW5nZVRvSW1tZWRpYXRlKEltbWVkT2Zmc2V0KTsKKyAgICAgIE9mZnNldCAmPSB+KE1hc2sqU2NhbGUpOworICAgIH0KKyAgfQorCisgIE9mZnNldCA9IChpc1N1YikgPyAtT2Zmc2V0IDogT2Zmc2V0OworICByZXR1cm4gT2Zmc2V0ID09IDA7Cit9CisKK2Jvb2wgQVJNQmFzZUluc3RySW5mbzo6CitBbmFseXplQ29tcGFyZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCAmU3JjUmVnLCBpbnQgJkNtcFZhbHVlKSBjb25zdCB7CisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIEFSTTo6Q01Qcmk6CisgIGNhc2UgQVJNOjpDTVB6cmk6CisgIGNhc2UgQVJNOjp0MkNNUHJpOgorICBjYXNlIEFSTTo6dDJDTVB6cmk6CisgICAgU3JjUmVnID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgQ21wVmFsdWUgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIENvbnZlcnRUb1NldFplcm9GbGFnIC0gQ29udmVydCB0aGUgaW5zdHJ1Y3Rpb24gdG8gc2V0IHRoZSAiemVybyIgZmxhZyBzbworLy8vIHRoYXQgd2UgY2FuIHJlbW92ZSBhICJjb21wYXJpc29uIHdpdGggemVybyIuCitib29sIEFSTUJhc2VJbnN0ckluZm86OgorQ29udmVydFRvU2V0WmVyb0ZsYWcoTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUluc3RyICpDbXBJbnN0cikgY29uc3QgeworICAvLyBDb25zZXJ2YXRpdmVseSByZWZ1c2UgdG8gY29udmVydCBhbiBpbnN0cnVjdGlvbiB3aGljaCBpc24ndCBpbiB0aGUgc2FtZSBCQgorICAvLyBhcyB0aGUgY29tcGFyaXNvbi4KKyAgaWYgKE1JLT5nZXRQYXJlbnQoKSAhPSBDbXBJbnN0ci0+Z2V0UGFyZW50KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIENoZWNrIHRoYXQgQ1BTUiBpc24ndCBzZXQgYmV0d2VlbiB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbiBhbmQgdGhlIG9uZSB3ZQorICAvLyB3YW50IHRvIGNoYW5nZS4KKyAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBDbXBJbnN0ciwgRSA9IE1JOworICAtLUk7CisgIGZvciAoOyBJICE9IEU7IC0tSSkgeworICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmSW5zdHIgPSAqSTsKKworICAgIGZvciAodW5zaWduZWQgSU8gPSAwLCBFTyA9IEluc3RyLmdldE51bU9wZXJhbmRzKCk7IElPICE9IEVPOyArK0lPKSB7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJbnN0ci5nZXRPcGVyYW5kKElPKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNEZWYoKSkgY29udGludWU7CisKKyAgICAgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gbW9kaWZpZXMgQ1BTUiBiZWZvcmUgdGhlIG9uZSB3ZSB3YW50IHRvIGNoYW5nZS4gV2UKKyAgICAgIC8vIGNhbid0IGRvIHRoaXMgdHJhbnNmb3JtYXRpb24uCisgICAgICBpZiAoTU8uZ2V0UmVnKCkgPT0gQVJNOjpDUFNSKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gU2V0IHRoZSAiemVybyIgYml0IGluIENQU1IuCisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIEFSTTo6QUREcmk6CisgIGNhc2UgQVJNOjpTVUJyaToKKyAgY2FzZSBBUk06OnQyQUREcmk6CisgIGNhc2UgQVJNOjp0MlNVQnJpOiB7CisgICAgTUktPlJlbW92ZU9wZXJhbmQoNSk7CisgICAgTWFjaGluZUluc3RyQnVpbGRlciBNQihNSSk7CisgICAgTUIuYWRkUmVnKEFSTTo6Q1BTUiwgUmVnU3RhdGU6OkRlZmluZSB8IFJlZ1N0YXRlOjpJbXBsaWNpdCk7CisgICAgQ21wSW5zdHItPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1CYXNlSW5zdHJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1CYXNlSW5zdHJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmNGEzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUJhc2VJbnN0ckluZm8uaApAQCAtMCwwICsxLDQzMiBAQAorLy89PT0tIEFSTUJhc2VJbnN0ckluZm8uaCAtIEFSTSBCYXNlIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEJhc2UgQVJNIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBUk1CQVNFSU5TVFJVQ1RJT05JTkZPX0gKKyNkZWZpbmUgQVJNQkFTRUlOU1RSVUNUSU9OSU5GT19ICisKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEFSTVN1YnRhcmdldDsKKyAgY2xhc3MgQVJNQmFzZVJlZ2lzdGVySW5mbzsKKworLy8vIEFSTUlJIC0gVGhpcyBuYW1lc3BhY2UgaG9sZHMgYWxsIG9mIHRoZSB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgdGhhdAorLy8vIGluc3RydWN0aW9uIGluZm8gdHJhY2tzLgorLy8vCituYW1lc3BhY2UgQVJNSUkgeworICBlbnVtIHsKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gSW5zdHJ1Y3Rpb24gRmxhZ3MuCisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gVGhpcyBmb3VyLWJpdCBmaWVsZCBkZXNjcmliZXMgdGhlIGFkZHJlc3NpbmcgbW9kZSB1c2VkLgorCisgICAgQWRkck1vZGVNYXNrICA9IDB4ZiwKKyAgICBBZGRyTW9kZU5vbmUgICAgPSAwLAorICAgIEFkZHJNb2RlMSAgICAgICA9IDEsCisgICAgQWRkck1vZGUyICAgICAgID0gMiwKKyAgICBBZGRyTW9kZTMgICAgICAgPSAzLAorICAgIEFkZHJNb2RlNCAgICAgICA9IDQsCisgICAgQWRkck1vZGU1ICAgICAgID0gNSwKKyAgICBBZGRyTW9kZTYgICAgICAgPSA2LAorICAgIEFkZHJNb2RlVDFfMSAgICA9IDcsCisgICAgQWRkck1vZGVUMV8yICAgID0gOCwKKyAgICBBZGRyTW9kZVQxXzQgICAgPSA5LAorICAgIEFkZHJNb2RlVDFfcyAgICA9IDEwLCAvLyBpOCAqIDQgZm9yIHBjIGFuZCBzcCByZWxhdGl2ZSBkYXRhCisgICAgQWRkck1vZGVUMl9pMTIgID0gMTEsCisgICAgQWRkck1vZGVUMl9pOCAgID0gMTIsCisgICAgQWRkck1vZGVUMl9zbyAgID0gMTMsCisgICAgQWRkck1vZGVUMl9wYyAgID0gMTQsIC8vICsvLSBpMTIgZm9yIHBjIHJlbGF0aXZlIGRhdGEKKyAgICBBZGRyTW9kZVQyX2k4czQgPSAxNSwgLy8gaTggKiA0CisKKyAgICAvLyBTaXplKiAtIEZsYWdzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHNpemUgb2YgYW4gaW5zdHJ1Y3Rpb24uCisgICAgU2l6ZVNoaWZ0ICAgICA9IDQsCisgICAgU2l6ZU1hc2sgICAgICA9IDcgPDwgU2l6ZVNoaWZ0LAorICAgIFNpemVTcGVjaWFsICAgPSAxLCAgIC8vIDAgYnl0ZSBwc2V1ZG8gb3Igc3BlY2lhbCBjYXNlLgorICAgIFNpemU4Qnl0ZXMgICAgPSAyLAorICAgIFNpemU0Qnl0ZXMgICAgPSAzLAorICAgIFNpemUyQnl0ZXMgICAgPSA0LAorCisgICAgLy8gSW5kZXhNb2RlIC0gVW5pbmRleCwgcHJlLWluZGV4ZWQsIG9yIHBvc3QtaW5kZXhlZCBhcmUgdmFsaWQgZm9yIGxvYWQKKyAgICAvLyBhbmQgc3RvcmUgb3BzIG9ubHkuICBHZW5lcmljICJ1cGRhdGluZyIgZmxhZyBpcyB1c2VkIGZvciBsZC9zdCBtdWx0aXBsZS4KKyAgICBJbmRleE1vZGVTaGlmdCA9IDcsCisgICAgSW5kZXhNb2RlTWFzayAgPSAzIDw8IEluZGV4TW9kZVNoaWZ0LAorICAgIEluZGV4TW9kZVByZSAgID0gMSwKKyAgICBJbmRleE1vZGVQb3N0ICA9IDIsCisgICAgSW5kZXhNb2RlVXBkICAgPSAzLAorCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vIEluc3RydWN0aW9uIGVuY29kaW5nIGZvcm1hdHMuCisgICAgLy8KKyAgICBGb3JtU2hpZnQgICAgID0gOSwKKyAgICBGb3JtTWFzayAgICAgID0gMHgzZiA8PCBGb3JtU2hpZnQsCisKKyAgICAvLyBQc2V1ZG8gaW5zdHJ1Y3Rpb25zCisgICAgUHNldWRvICAgICAgICA9IDAgIDw8IEZvcm1TaGlmdCwKKworICAgIC8vIE11bHRpcGx5IGluc3RydWN0aW9ucworICAgIE11bEZybSAgICAgICAgPSAxICA8PCBGb3JtU2hpZnQsCisKKyAgICAvLyBCcmFuY2ggaW5zdHJ1Y3Rpb25zCisgICAgQnJGcm0gICAgICAgICA9IDIgIDw8IEZvcm1TaGlmdCwKKyAgICBCck1pc2NGcm0gICAgID0gMyAgPDwgRm9ybVNoaWZ0LAorCisgICAgLy8gRGF0YSBQcm9jZXNzaW5nIGluc3RydWN0aW9ucworICAgIERQRnJtICAgICAgICAgPSA0ICA8PCBGb3JtU2hpZnQsCisgICAgRFBTb1JlZ0ZybSAgICA9IDUgIDw8IEZvcm1TaGlmdCwKKworICAgIC8vIExvYWQgYW5kIFN0b3JlCisgICAgTGRGcm0gICAgICAgICA9IDYgIDw8IEZvcm1TaGlmdCwKKyAgICBTdEZybSAgICAgICAgID0gNyAgPDwgRm9ybVNoaWZ0LAorICAgIExkTWlzY0ZybSAgICAgPSA4ICA8PCBGb3JtU2hpZnQsCisgICAgU3RNaXNjRnJtICAgICA9IDkgIDw8IEZvcm1TaGlmdCwKKyAgICBMZFN0TXVsRnJtICAgID0gMTAgPDwgRm9ybVNoaWZ0LAorCisgICAgTGRTdEV4RnJtICAgICA9IDExIDw8IEZvcm1TaGlmdCwKKworICAgIC8vIE1pc2NlbGxhbmVvdXMgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMKKyAgICBBcml0aE1pc2NGcm0gID0gMTIgPDwgRm9ybVNoaWZ0LAorICAgIFNhdEZybSAgICAgICAgPSAxMyA8PCBGb3JtU2hpZnQsCisKKyAgICAvLyBFeHRlbmQgaW5zdHJ1Y3Rpb25zCisgICAgRXh0RnJtICAgICAgICA9IDE0IDw8IEZvcm1TaGlmdCwKKworICAgIC8vIFZGUCBmb3JtYXRzCisgICAgVkZQVW5hcnlGcm0gICA9IDE1IDw8IEZvcm1TaGlmdCwKKyAgICBWRlBCaW5hcnlGcm0gID0gMTYgPDwgRm9ybVNoaWZ0LAorICAgIFZGUENvbnYxRnJtICAgPSAxNyA8PCBGb3JtU2hpZnQsCisgICAgVkZQQ29udjJGcm0gICA9IDE4IDw8IEZvcm1TaGlmdCwKKyAgICBWRlBDb252M0ZybSAgID0gMTkgPDwgRm9ybVNoaWZ0LAorICAgIFZGUENvbnY0RnJtICAgPSAyMCA8PCBGb3JtU2hpZnQsCisgICAgVkZQQ29udjVGcm0gICA9IDIxIDw8IEZvcm1TaGlmdCwKKyAgICBWRlBMZFN0RnJtICAgID0gMjIgPDwgRm9ybVNoaWZ0LAorICAgIFZGUExkU3RNdWxGcm0gPSAyMyA8PCBGb3JtU2hpZnQsCisgICAgVkZQTWlzY0ZybSAgICA9IDI0IDw8IEZvcm1TaGlmdCwKKworICAgIC8vIFRodW1iIGZvcm1hdAorICAgIFRodW1iRnJtICAgICAgPSAyNSA8PCBGb3JtU2hpZnQsCisKKyAgICAvLyBNaXNjZWxsZWFuZW91cyBmb3JtYXQKKyAgICBNaXNjRnJtICAgICAgID0gMjYgPDwgRm9ybVNoaWZ0LAorCisgICAgLy8gTkVPTiBmb3JtYXRzCisgICAgTkdldExuRnJtICAgICA9IDI3IDw8IEZvcm1TaGlmdCwKKyAgICBOU2V0TG5Gcm0gICAgID0gMjggPDwgRm9ybVNoaWZ0LAorICAgIE5EdXBGcm0gICAgICAgPSAyOSA8PCBGb3JtU2hpZnQsCisgICAgTkxkU3RGcm0gICAgICA9IDMwIDw8IEZvcm1TaGlmdCwKKyAgICBOMVJlZ01vZEltbUZybT0gMzEgPDwgRm9ybVNoaWZ0LAorICAgIE4yUmVnRnJtICAgICAgPSAzMiA8PCBGb3JtU2hpZnQsCisgICAgTlZDVlRGcm0gICAgICA9IDMzIDw8IEZvcm1TaGlmdCwKKyAgICBOVkR1cExuRnJtICAgID0gMzQgPDwgRm9ybVNoaWZ0LAorICAgIE4yUmVnVlNoTEZybSAgPSAzNSA8PCBGb3JtU2hpZnQsCisgICAgTjJSZWdWU2hSRnJtICA9IDM2IDw8IEZvcm1TaGlmdCwKKyAgICBOM1JlZ0ZybSAgICAgID0gMzcgPDwgRm9ybVNoaWZ0LAorICAgIE4zUmVnVlNoRnJtICAgPSAzOCA8PCBGb3JtU2hpZnQsCisgICAgTlZFeHRGcm0gICAgICA9IDM5IDw8IEZvcm1TaGlmdCwKKyAgICBOVk11bFNMRnJtICAgID0gNDAgPDwgRm9ybVNoaWZ0LAorICAgIE5WVEJMRnJtICAgICAgPSA0MSA8PCBGb3JtU2hpZnQsCisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gTWlzYyBmbGFncy4KKworICAgIC8vIFVuYXJ5RFAgLSBJbmRpY2F0ZXMgdGhpcyBpcyBhIHVuYXJ5IGRhdGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgaS5lLgorICAgIC8vIGl0IGRvZXNuJ3QgaGF2ZSBhIFJuIG9wZXJhbmQuCisgICAgVW5hcnlEUCAgICAgICA9IDEgPDwgMTUsCisKKyAgICAvLyBYZm9ybTE2Qml0IC0gSW5kaWNhdGVzIHRoaXMgVGh1bWIyIGluc3RydWN0aW9uIG1heSBiZSB0cmFuc2Zvcm1lZCBpbnRvCisgICAgLy8gYSAxNi1iaXQgVGh1bWIgaW5zdHJ1Y3Rpb24gaWYgY2VydGFpbiBjb25kaXRpb25zIGFyZSBtZXQuCisgICAgWGZvcm0xNkJpdCAgICA9IDEgPDwgMTYsCisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gQ29kZSBkb21haW4uCisgICAgRG9tYWluU2hpZnQgICA9IDE3LAorICAgIERvbWFpbk1hc2sgICAgPSAzIDw8IERvbWFpblNoaWZ0LAorICAgIERvbWFpbkdlbmVyYWwgPSAwIDw8IERvbWFpblNoaWZ0LAorICAgIERvbWFpblZGUCAgICAgPSAxIDw8IERvbWFpblNoaWZ0LAorICAgIERvbWFpbk5FT04gICAgPSAyIDw8IERvbWFpblNoaWZ0LAorCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vIEZpZWxkIHNoaWZ0cyAtIHN1Y2ggc2hpZnRzIGFyZSB1c2VkIHRvIHNldCBmaWVsZCB3aGlsZSBnZW5lcmF0aW5nCisgICAgLy8gbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgICAgTV9CaXRTaGlmdCAgICAgPSA1LAorICAgIFNoaWZ0SW1tU2hpZnQgID0gNSwKKyAgICBTaGlmdFNoaWZ0ICAgICA9IDcsCisgICAgTl9CaXRTaGlmdCAgICAgPSA3LAorICAgIEltbUhpU2hpZnQgICAgID0gOCwKKyAgICBTb1JvdEltbVNoaWZ0ICA9IDgsCisgICAgUmVnUnNTaGlmdCAgICAgPSA4LAorICAgIEV4dFJvdEltbVNoaWZ0ID0gMTAsCisgICAgUmVnUmRMb1NoaWZ0ICAgPSAxMiwKKyAgICBSZWdSZFNoaWZ0ICAgICA9IDEyLAorICAgIFJlZ1JkSGlTaGlmdCAgID0gMTYsCisgICAgUmVnUm5TaGlmdCAgICAgPSAxNiwKKyAgICBTX0JpdFNoaWZ0ICAgICA9IDIwLAorICAgIFdfQml0U2hpZnQgICAgID0gMjEsCisgICAgQU0zX0lfQml0U2hpZnQgPSAyMiwKKyAgICBEX0JpdFNoaWZ0ICAgICA9IDIyLAorICAgIFVfQml0U2hpZnQgICAgID0gMjMsCisgICAgUF9CaXRTaGlmdCAgICAgPSAyNCwKKyAgICBJX0JpdFNoaWZ0ICAgICA9IDI1LAorICAgIENvbmRTaGlmdCAgICAgID0gMjgKKyAgfTsKKworICAvLy8gVGFyZ2V0IE9wZXJhbmQgRmxhZyBlbnVtLgorICBlbnVtIFRPRiB7CisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vIEFSTSBTcGVjaWZpYyBNYWNoaW5lT3BlcmFuZCBmbGFncy4KKworICAgIE1PX05PX0ZMQUcsCisKKyAgICAvLy8gTU9fTE8xNiAtIE9uIGEgc3ltYm9sIG9wZXJhbmQsIHRoaXMgcmVwcmVzZW50cyBhIHJlbG9jYXRpb24gY29udGFpbmluZworICAgIC8vLyBsb3dlciAxNiBiaXQgb2YgdGhlIGFkZHJlc3MuIFVzZWQgb25seSB2aWEgbW92dyBpbnN0cnVjdGlvbi4KKyAgICBNT19MTzE2LAorCisgICAgLy8vIE1PX0hJMTYgLSBPbiBhIHN5bWJvbCBvcGVyYW5kLCB0aGlzIHJlcHJlc2VudHMgYSByZWxvY2F0aW9uIGNvbnRhaW5pbmcKKyAgICAvLy8gaGlnaGVyIDE2IGJpdCBvZiB0aGUgYWRkcmVzcy4gVXNlZCBvbmx5IHZpYSBtb3Z0IGluc3RydWN0aW9uLgorICAgIE1PX0hJMTYKKyAgfTsKK30KKworY2xhc3MgQVJNQmFzZUluc3RySW5mbyA6IHB1YmxpYyBUYXJnZXRJbnN0ckluZm9JbXBsIHsKKyAgY29uc3QgQVJNU3VidGFyZ2V0ICZTdWJ0YXJnZXQ7Citwcm90ZWN0ZWQ6CisgIC8vIENhbiBiZSBvbmx5IHN1YmNsYXNzZWQuCisgIGV4cGxpY2l0IEFSTUJhc2VJbnN0ckluZm8oY29uc3QgQVJNU3VidGFyZ2V0ICZTVEkpOworcHVibGljOgorICAvLyBSZXR1cm4gdGhlIG5vbi1wcmUvcG9zdCBpbmNyZW1lbnRpbmcgdmVyc2lvbiBvZiAnT3BjJy4gUmV0dXJuIDAKKyAgLy8gaWYgdGhlcmUgaXMgbm90IHN1Y2ggYW4gb3Bjb2RlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFVuaW5kZXhlZE9wY29kZSh1bnNpZ25lZCBPcGMpIGNvbnN0ID0wOworCisgIHZpcnR1YWwgTWFjaGluZUluc3RyICpjb252ZXJ0VG9UaHJlZUFkZHJlc3MoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciAmTUZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXZlVmFyaWFibGVzICpMVikgY29uc3Q7CisKKyAgdmlydHVhbCBjb25zdCBBUk1CYXNlUmVnaXN0ZXJJbmZvICZnZXRSZWdpc3RlckluZm8oKSBjb25zdCA9MDsKKyAgY29uc3QgQVJNU3VidGFyZ2V0ICZnZXRTdWJ0YXJnZXQoKSBjb25zdCB7IHJldHVybiBTdWJ0YXJnZXQ7IH0KKworICBib29sIHNwaWxsQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICAvLyBCcmFuY2ggYW5hbHlzaXMuCisgIHZpcnR1YWwgYm9vbCBBbmFseXplQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqJkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSA9IGZhbHNlKSBjb25zdDsKKyAgdmlydHVhbCB1bnNpZ25lZCBSZW1vdmVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdDsKKworICB2aXJ0dWFsCisgIGJvb2wgUmV2ZXJzZUJyYW5jaENvbmRpdGlvbihTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kKSBjb25zdDsKKworICAvLyBQcmVkaWNhdGlvbiBzdXBwb3J0LgorICBib29sIGlzUHJlZGljYXRlZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdCB7CisgICAgaW50IFBJZHggPSBNSS0+ZmluZEZpcnN0UHJlZE9wZXJhbmRJZHgoKTsKKyAgICByZXR1cm4gUElkeCAhPSAtMSAmJiBNSS0+Z2V0T3BlcmFuZChQSWR4KS5nZXRJbW0oKSAhPSBBUk1DQzo6QUw7CisgIH0KKworICBBUk1DQzo6Q29uZENvZGVzIGdldFByZWRpY2F0ZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdCB7CisgICAgaW50IFBJZHggPSBNSS0+ZmluZEZpcnN0UHJlZE9wZXJhbmRJZHgoKTsKKyAgICByZXR1cm4gUElkeCAhPSAtMSA/IChBUk1DQzo6Q29uZENvZGVzKU1JLT5nZXRPcGVyYW5kKFBJZHgpLmdldEltbSgpCisgICAgICAgICAgICAgICAgICAgICAgOiBBUk1DQzo6QUw7CisgIH0KKworICB2aXJ0dWFsCisgIGJvb2wgUHJlZGljYXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZQcmVkKSBjb25zdDsKKworICB2aXJ0dWFsCisgIGJvb2wgU3Vic3VtZXNQcmVkaWNhdGUoY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmUHJlZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmUHJlZDIpIGNvbnN0OworCisgIHZpcnR1YWwgYm9vbCBEZWZpbmVzUHJlZGljYXRlKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kPiAmUHJlZCkgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIGlzUHJlZGljYWJsZShNYWNoaW5lSW5zdHIgKk1JKSBjb25zdDsKKworICAvLy8gR2V0SW5zdFNpemUgLSBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgTWFjaGluZUluc3RyLgorICAvLy8KKyAgdmlydHVhbCB1bnNpZ25lZCBHZXRJbnN0U2l6ZUluQnl0ZXMoY29uc3QgTWFjaGluZUluc3RyKiBNSSkgY29uc3Q7CisKKyAgdmlydHVhbCB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworICB2aXJ0dWFsIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgKmVtaXRGcmFtZUluZGV4RGVidWdWYWx1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGcmFtZUl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKk1EUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgcmVNYXRlcmlhbGl6ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpPcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3Q7CisKKyAgTWFjaGluZUluc3RyICpkdXBsaWNhdGUoTWFjaGluZUluc3RyICpPcmlnLCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgcHJvZHVjZVNhbWVWYWx1ZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpNSTEpIGNvbnN0OworCisgIC8vLyBhcmVMb2Fkc0Zyb21TYW1lQmFzZVB0ciAtIFRoaXMgaXMgdXNlZCBieSB0aGUgcHJlLXJlZ2FsbG9jIHNjaGVkdWxlciB0bworICAvLy8gZGV0ZXJtaW5lIGlmIHR3byBsb2FkcyBhcmUgbG9hZGluZyBmcm9tIHRoZSBzYW1lIGJhc2UgYWRkcmVzcy4gSXQgc2hvdWxkCisgIC8vLyBvbmx5IHJldHVybiB0cnVlIGlmIHRoZSBiYXNlIHBvaW50ZXJzIGFyZSB0aGUgc2FtZSBhbmQgdGhlIG9ubHkKKyAgLy8vIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBhZGRyZXNzZXMgaXMgdGhlIG9mZnNldC4gSXQgYWxzbyByZXR1cm5zIHRoZQorICAvLy8gb2Zmc2V0cyBieSByZWZlcmVuY2UuCisgIHZpcnR1YWwgYm9vbCBhcmVMb2Fkc0Zyb21TYW1lQmFzZVB0cihTRE5vZGUgKkxvYWQxLCBTRE5vZGUgKkxvYWQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmT2Zmc2V0MSwgaW50NjRfdCAmT2Zmc2V0Miljb25zdDsKKworICAvLy8gc2hvdWxkU2NoZWR1bGVMb2Fkc05lYXIgLSBUaGlzIGlzIGEgdXNlZCBieSB0aGUgcHJlLXJlZ2FsbG9jIHNjaGVkdWxlciB0bworICAvLy8gZGV0ZXJtaW5lIChpbiBjb25qdWN0aW9uIHdpdGggYXJlTG9hZHNGcm9tU2FtZUJhc2VQdHIpIGlmIHR3byBsb2FkcyBzaG91bGQKKyAgLy8vIGJlIHNjaGVkdWxlZCB0b2d0aGVyLiBPbiBzb21lIHRhcmdldHMgaWYgdHdvIGxvYWRzIGFyZSBsb2FkaW5nIGZyb20KKyAgLy8vIGFkZHJlc3NlcyBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLCBpdCdzIGJldHRlciBpZiB0aGV5IGFyZSBzY2hlZHVsZWQKKyAgLy8vIHRvZ2V0aGVyLiBUaGlzIGZ1bmN0aW9uIHRha2VzIHR3byBpbnRlZ2VycyB0aGF0IHJlcHJlc2VudCB0aGUgbG9hZCBvZmZzZXRzCisgIC8vLyBmcm9tIHRoZSBjb21tb24gYmFzZSBhZGRyZXNzLiBJdCByZXR1cm5zIHRydWUgaWYgaXQgZGVjaWRlcyBpdCdzIGRlc2lyYWJsZQorICAvLy8gdG8gc2NoZWR1bGUgdGhlIHR3byBsb2FkcyB0b2dldGhlci4gIk51bUxvYWRzIiBpcyB0aGUgbnVtYmVyIG9mIGxvYWRzIHRoYXQKKyAgLy8vIGhhdmUgYWxyZWFkeSBiZWVuIHNjaGVkdWxlZCBhZnRlciBMb2FkMS4KKyAgdmlydHVhbCBib29sIHNob3VsZFNjaGVkdWxlTG9hZHNOZWFyKFNETm9kZSAqTG9hZDEsIFNETm9kZSAqTG9hZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldDEsIGludDY0X3QgT2Zmc2V0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUxvYWRzKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgaXNTY2hlZHVsaW5nQm91bmRhcnkoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgaXNQcm9maXRhYmxlVG9JZkN2dChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JbnN0cnMpIGNvbnN0OworCisgIHZpcnR1YWwgYm9vbCBpc1Byb2ZpdGFibGVUb0lmQ3Z0KE1hY2hpbmVCYXNpY0Jsb2NrICZUTUJCLHVuc2lnbmVkIE51bVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZGTUJCLHVuc2lnbmVkIE51bUYpIGNvbnN0OworCisgIHZpcnR1YWwgYm9vbCBpc1Byb2ZpdGFibGVUb0R1cEZvcklmQ3Z0KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUluc3RycykgY29uc3QgeworICAgIHJldHVybiBOdW1JbnN0cnMgJiYgTnVtSW5zdHJzID09IDE7CisgIH0KKworICAvLy8gQW5hbHl6ZUNvbXBhcmUgLSBGb3IgYSBjb21wYXJpc29uIGluc3RydWN0aW9uLCByZXR1cm4gdGhlIHNvdXJjZSByZWdpc3RlcgorICAvLy8gaW4gU3JjUmVnIGFuZCB0aGUgdmFsdWUgaXQgY29tcGFyZXMgYWdhaW5zdCBpbiBDbXBWYWx1ZS4gUmV0dXJuIHRydWUgaWYKKyAgLy8vIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9uIGNhbiBiZSBhbmFseXplZC4KKyAgdmlydHVhbCBib29sIEFuYWx5emVDb21wYXJlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkICZTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkNtcFZhbHVlKSBjb25zdDsKKworICAvLy8gQ29udmVydFRvU2V0WmVyb0ZsYWcgLSBDb252ZXJ0IHRoZSBpbnN0cnVjdGlvbiB0byBzZXQgdGhlIHplcm8gZmxhZyBzbworICAvLy8gdGhhdCB3ZSBjYW4gcmVtb3ZlIGEgImNvbXBhcmlzb24gd2l0aCB6ZXJvIi4KKyAgdmlydHVhbCBib29sIENvbnZlcnRUb1NldFplcm9GbGFnKE1hY2hpbmVJbnN0ciAqSW5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKkNtcEluc3RyKSBjb25zdDsKK307CisKK3N0YXRpYyBpbmxpbmUKK2NvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJkFkZERlZmF1bHRQcmVkKGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQikgeworICByZXR1cm4gTUlCLmFkZEltbSgoaW50NjRfdClBUk1DQzo6QUwpLmFkZFJlZygwKTsKK30KKworc3RhdGljIGlubGluZQorY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmQWRkRGVmYXVsdENDKGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQikgeworICByZXR1cm4gTUlCLmFkZFJlZygwKTsKK30KKworc3RhdGljIGlubGluZQorY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmQWRkRGVmYXVsdFQxQ0MoY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmTUlCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RlYWQgPSBmYWxzZSkgeworICByZXR1cm4gTUlCLmFkZFJlZyhBUk06OkNQU1IsIGdldERlZlJlZ1N0YXRlKHRydWUpIHwgZ2V0RGVhZFJlZ1N0YXRlKGlzRGVhZCkpOworfQorCitzdGF0aWMgaW5saW5lCitjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZBZGROb1QxQ0MoY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmTUlCKSB7CisgIHJldHVybiBNSUIuYWRkUmVnKDApOworfQorCitzdGF0aWMgaW5saW5lCitib29sIGlzVW5jb25kQnJhbmNoT3Bjb2RlKGludCBPcGMpIHsKKyAgcmV0dXJuIE9wYyA9PSBBUk06OkIgfHwgT3BjID09IEFSTTo6dEIgfHwgT3BjID09IEFSTTo6dDJCOworfQorCitzdGF0aWMgaW5saW5lCitib29sIGlzQ29uZEJyYW5jaE9wY29kZShpbnQgT3BjKSB7CisgIHJldHVybiBPcGMgPT0gQVJNOjpCY2MgfHwgT3BjID09IEFSTTo6dEJjYyB8fCBPcGMgPT0gQVJNOjp0MkJjYzsKK30KKworc3RhdGljIGlubGluZQorYm9vbCBpc0p1bXBUYWJsZUJyYW5jaE9wY29kZShpbnQgT3BjKSB7CisgIHJldHVybiBPcGMgPT0gQVJNOjpCUl9KVHIgfHwgT3BjID09IEFSTTo6QlJfSlRtIHx8IE9wYyA9PSBBUk06OkJSX0pUYWRkIHx8CisgICAgT3BjID09IEFSTTo6dEJSX0pUciB8fCBPcGMgPT0gQVJNOjp0MkJSX0pUOworfQorCitzdGF0aWMgaW5saW5lCitib29sIGlzSW5kaXJlY3RCcmFuY2hPcGNvZGUoaW50IE9wYykgeworICByZXR1cm4gT3BjID09IEFSTTo6QlJJTkQgfHwgT3BjID09IEFSTTo6TU9WUENSWCB8fCBPcGMgPT0gQVJNOjp0QlJJTkQ7Cit9CisKKy8vLyBnZXRJbnN0clByZWRpY2F0ZSAtIElmIGluc3RydWN0aW9uIGlzIHByZWRpY2F0ZWQsIHJldHVybnMgaXRzIHByZWRpY2F0ZQorLy8vIGNvbmRpdGlvbiwgb3RoZXJ3aXNlIHJldHVybnMgQUwuIEl0IGFsc28gcmV0dXJucyB0aGUgY29uZGl0aW9uIGNvZGUKKy8vLyByZWdpc3RlciBieSByZWZlcmVuY2UuCitBUk1DQzo6Q29uZENvZGVzIGdldEluc3RyUHJlZGljYXRlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkICZQcmVkUmVnKTsKKworaW50IGdldE1hdGNoaW5nQ29uZEJyYW5jaE9wY29kZShpbnQgT3BjKTsKKworLy8vIGVtaXRBUk1SZWdQbHVzSW1tZWRpYXRlIC8gZW1pdFQyUmVnUGx1c0ltbWVkaWF0ZSAtIEVtaXRzIGEgc2VyaWVzIG9mCisvLy8gaW5zdHJ1Y3Rpb25zIHRvIG1hdGVyaWFsaXplYSBkZXN0cmVnID0gYmFzZXJlZyArIGltbWVkaWF0ZSBpbiBBUk0gLyBUaHVtYjIKKy8vLyBjb2RlLgordm9pZCBlbWl0QVJNUmVnUGx1c0ltbWVkaWF0ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBCYXNlUmVnLCBpbnQgTnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCwgdW5zaWduZWQgUHJlZFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVJNQmFzZUluc3RySW5mbyAmVElJKTsKKwordm9pZCBlbWl0VDJSZWdQbHVzSW1tZWRpYXRlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBCYXNlUmVnLCBpbnQgTnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBQcmVkLCB1bnNpZ25lZCBQcmVkUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTUJhc2VJbnN0ckluZm8gJlRJSSk7CisKKworLy8vIHJld3JpdGVBUk1GcmFtZUluZGV4IC8gcmV3cml0ZVQyRnJhbWVJbmRleCAtCisvLy8gUmV3cml0ZSBNSSB0byBhY2Nlc3MgJ09mZnNldCcgYnl0ZXMgZnJvbSB0aGUgRlAuIFJldHVybiBmYWxzZSBpZiB0aGUKKy8vLyBvZmZzZXQgY291bGQgbm90IGJlIGhhbmRsZWQgZGlyZWN0bHkgaW4gTUksIGFuZCByZXR1cm4gdGhlIGxlZnQtb3ZlcgorLy8vIHBvcnRpb24gYnkgcmVmZXJlbmNlLgorYm9vbCByZXdyaXRlQVJNRnJhbWVJbmRleChNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBGcmFtZVJlZ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRnJhbWVSZWcsIGludCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZUSUkpOworCitib29sIHJld3JpdGVUMkZyYW1lSW5kZXgoTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgRnJhbWVSZWdJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRnJhbWVSZWcsIGludCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTUJhc2VJbnN0ckluZm8gJlRJSSk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQmFzZVJlZ2lzdGVySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1CYXNlUmVnaXN0ZXJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjMwOGM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQmFzZVJlZ2lzdGVySW5mby5jcHAKQEAgLTAsMCArMSwxNzYzIEBACisvLz09PS0gQVJNQmFzZVJlZ2lzdGVySW5mby5jcHAgLSBBUk0gUmVnaXN0ZXIgSW5mb3JtYXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYmFzZSBBUk0gaW1wbGVtZW50YXRpb24gb2YgVGFyZ2V0UmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1BZGRyZXNzaW5nTW9kZXMuaCIKKyNpbmNsdWRlICJBUk1CYXNlSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiQVJNQmFzZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgIkFSTUluc3RySW5mby5oIgorI2luY2x1ZGUgIkFSTU1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJBUk1TdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1JlZ2lzdGVyU2NhdmVuZ2luZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbDo6b3B0PGJvb2w+CitSZXVzZUZyYW1lSW5kZXhWYWxzKCJhcm0tcmV1c2UtZnJhbWUtaW5kZXgtdmFscyIsIGNsOjpIaWRkZW4sIGNsOjppbml0KHRydWUpLAorICAgICAgICAgIGNsOjpkZXNjKCJSZXVzZSByZXBlYXRlZCBmcmFtZSBpbmRleCB2YWx1ZXMiKSk7Cit9CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCit1bnNpZ25lZCBBUk1CYXNlUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyh1bnNpZ25lZCBSZWdFbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTUFZGUCkgeworICBpZiAoaXNTUFZGUCkKKyAgICAqaXNTUFZGUCA9IGZhbHNlOworCisgIHVzaW5nIG5hbWVzcGFjZSBBUk07CisgIHN3aXRjaCAoUmVnRW51bSkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gQVJNIHJlZ2lzdGVyISIpOworICBjYXNlIFIwOiAgY2FzZSBEMDogIGNhc2UgUTA6ICByZXR1cm4gMDsKKyAgY2FzZSBSMTogIGNhc2UgRDE6ICBjYXNlIFExOiAgcmV0dXJuIDE7CisgIGNhc2UgUjI6ICBjYXNlIEQyOiAgY2FzZSBRMjogIHJldHVybiAyOworICBjYXNlIFIzOiAgY2FzZSBEMzogIGNhc2UgUTM6ICByZXR1cm4gMzsKKyAgY2FzZSBSNDogIGNhc2UgRDQ6ICBjYXNlIFE0OiAgcmV0dXJuIDQ7CisgIGNhc2UgUjU6ICBjYXNlIEQ1OiAgY2FzZSBRNTogIHJldHVybiA1OworICBjYXNlIFI2OiAgY2FzZSBENjogIGNhc2UgUTY6ICByZXR1cm4gNjsKKyAgY2FzZSBSNzogIGNhc2UgRDc6ICBjYXNlIFE3OiAgcmV0dXJuIDc7CisgIGNhc2UgUjg6ICBjYXNlIEQ4OiAgY2FzZSBRODogIHJldHVybiA4OworICBjYXNlIFI5OiAgY2FzZSBEOTogIGNhc2UgUTk6ICByZXR1cm4gOTsKKyAgY2FzZSBSMTA6IGNhc2UgRDEwOiBjYXNlIFExMDogcmV0dXJuIDEwOworICBjYXNlIFIxMTogY2FzZSBEMTE6IGNhc2UgUTExOiByZXR1cm4gMTE7CisgIGNhc2UgUjEyOiBjYXNlIEQxMjogY2FzZSBRMTI6IHJldHVybiAxMjsKKyAgY2FzZSBTUDogIGNhc2UgRDEzOiBjYXNlIFExMzogcmV0dXJuIDEzOworICBjYXNlIExSOiAgY2FzZSBEMTQ6IGNhc2UgUTE0OiByZXR1cm4gMTQ7CisgIGNhc2UgUEM6ICBjYXNlIEQxNTogY2FzZSBRMTU6IHJldHVybiAxNTsKKworICBjYXNlIEQxNjogcmV0dXJuIDE2OworICBjYXNlIEQxNzogcmV0dXJuIDE3OworICBjYXNlIEQxODogcmV0dXJuIDE4OworICBjYXNlIEQxOTogcmV0dXJuIDE5OworICBjYXNlIEQyMDogcmV0dXJuIDIwOworICBjYXNlIEQyMTogcmV0dXJuIDIxOworICBjYXNlIEQyMjogcmV0dXJuIDIyOworICBjYXNlIEQyMzogcmV0dXJuIDIzOworICBjYXNlIEQyNDogcmV0dXJuIDI0OworICBjYXNlIEQyNTogcmV0dXJuIDI1OworICBjYXNlIEQyNjogcmV0dXJuIDI2OworICBjYXNlIEQyNzogcmV0dXJuIDI3OworICBjYXNlIEQyODogcmV0dXJuIDI4OworICBjYXNlIEQyOTogcmV0dXJuIDI5OworICBjYXNlIEQzMDogcmV0dXJuIDMwOworICBjYXNlIEQzMTogcmV0dXJuIDMxOworCisgIGNhc2UgUzA6IGNhc2UgUzE6IGNhc2UgUzI6IGNhc2UgUzM6CisgIGNhc2UgUzQ6IGNhc2UgUzU6IGNhc2UgUzY6IGNhc2UgUzc6CisgIGNhc2UgUzg6IGNhc2UgUzk6IGNhc2UgUzEwOiBjYXNlIFMxMToKKyAgY2FzZSBTMTI6IGNhc2UgUzEzOiBjYXNlIFMxNDogY2FzZSBTMTU6CisgIGNhc2UgUzE2OiBjYXNlIFMxNzogY2FzZSBTMTg6IGNhc2UgUzE5OgorICBjYXNlIFMyMDogY2FzZSBTMjE6IGNhc2UgUzIyOiBjYXNlIFMyMzoKKyAgY2FzZSBTMjQ6IGNhc2UgUzI1OiBjYXNlIFMyNjogY2FzZSBTMjc6CisgIGNhc2UgUzI4OiBjYXNlIFMyOTogY2FzZSBTMzA6IGNhc2UgUzMxOiB7CisgICAgaWYgKGlzU1BWRlApCisgICAgICAqaXNTUFZGUCA9IHRydWU7CisgICAgc3dpdGNoIChSZWdFbnVtKSB7CisgICAgZGVmYXVsdDogcmV0dXJuIDA7IC8vIEF2b2lkIGNvbXBpbGUgdGltZSB3YXJuaW5nLgorICAgIGNhc2UgUzA6IHJldHVybiAwOworICAgIGNhc2UgUzE6IHJldHVybiAxOworICAgIGNhc2UgUzI6IHJldHVybiAyOworICAgIGNhc2UgUzM6IHJldHVybiAzOworICAgIGNhc2UgUzQ6IHJldHVybiA0OworICAgIGNhc2UgUzU6IHJldHVybiA1OworICAgIGNhc2UgUzY6IHJldHVybiA2OworICAgIGNhc2UgUzc6IHJldHVybiA3OworICAgIGNhc2UgUzg6IHJldHVybiA4OworICAgIGNhc2UgUzk6IHJldHVybiA5OworICAgIGNhc2UgUzEwOiByZXR1cm4gMTA7CisgICAgY2FzZSBTMTE6IHJldHVybiAxMTsKKyAgICBjYXNlIFMxMjogcmV0dXJuIDEyOworICAgIGNhc2UgUzEzOiByZXR1cm4gMTM7CisgICAgY2FzZSBTMTQ6IHJldHVybiAxNDsKKyAgICBjYXNlIFMxNTogcmV0dXJuIDE1OworICAgIGNhc2UgUzE2OiByZXR1cm4gMTY7CisgICAgY2FzZSBTMTc6IHJldHVybiAxNzsKKyAgICBjYXNlIFMxODogcmV0dXJuIDE4OworICAgIGNhc2UgUzE5OiByZXR1cm4gMTk7CisgICAgY2FzZSBTMjA6IHJldHVybiAyMDsKKyAgICBjYXNlIFMyMTogcmV0dXJuIDIxOworICAgIGNhc2UgUzIyOiByZXR1cm4gMjI7CisgICAgY2FzZSBTMjM6IHJldHVybiAyMzsKKyAgICBjYXNlIFMyNDogcmV0dXJuIDI0OworICAgIGNhc2UgUzI1OiByZXR1cm4gMjU7CisgICAgY2FzZSBTMjY6IHJldHVybiAyNjsKKyAgICBjYXNlIFMyNzogcmV0dXJuIDI3OworICAgIGNhc2UgUzI4OiByZXR1cm4gMjg7CisgICAgY2FzZSBTMjk6IHJldHVybiAyOTsKKyAgICBjYXNlIFMzMDogcmV0dXJuIDMwOworICAgIGNhc2UgUzMxOiByZXR1cm4gMzE7CisgICAgfQorICB9CisgIH0KK30KKworQVJNQmFzZVJlZ2lzdGVySW5mbzo6QVJNQmFzZVJlZ2lzdGVySW5mbyhjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZ0aWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAmc3RpKQorICA6IEFSTUdlblJlZ2lzdGVySW5mbyhBUk06OkFESkNBTExTVEFDS0RPV04sIEFSTTo6QURKQ0FMTFNUQUNLVVApLAorICAgIFRJSSh0aWkpLCBTVEkoc3RpKSwKKyAgICBGcmFtZVB0cigoU1RJLmlzVGFyZ2V0RGFyd2luKCkgfHwgU1RJLmlzVGh1bWIoKSkgPyBBUk06OlI3IDogQVJNOjpSMTEpIHsKK30KKworY29uc3QgdW5zaWduZWQqCitBUk1CYXNlUmVnaXN0ZXJJbmZvOjpnZXRDYWxsZWVTYXZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRikgY29uc3QgeworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ2FsbGVlU2F2ZWRSZWdzW10gPSB7CisgICAgQVJNOjpMUiwgQVJNOjpSMTEsIEFSTTo6UjEwLCBBUk06OlI5LCBBUk06OlI4LAorICAgIEFSTTo6UjcsIEFSTTo6UjYsICBBUk06OlI1LCAgQVJNOjpSNCwKKworICAgIEFSTTo6RDE1LCBBUk06OkQxNCwgQVJNOjpEMTMsIEFSTTo6RDEyLAorICAgIEFSTTo6RDExLCBBUk06OkQxMCwgQVJNOjpEOSwgIEFSTTo6RDgsCisgICAgMAorICB9OworCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBEYXJ3aW5DYWxsZWVTYXZlZFJlZ3NbXSA9IHsKKyAgICAvLyBEYXJ3aW4gQUJJIGRldmlhdGVzIGZyb20gQVJNIHN0YW5kYXJkIEFCSS4gUjkgaXMgbm90IGEgY2FsbGVlLXNhdmVkCisgICAgLy8gcmVnaXN0ZXIuCisgICAgQVJNOjpMUiwgIEFSTTo6UjcsICBBUk06OlI2LCBBUk06OlI1LCBBUk06OlI0LAorICAgIEFSTTo6UjExLCBBUk06OlIxMCwgQVJNOjpSOCwKKworICAgIEFSTTo6RDE1LCBBUk06OkQxNCwgQVJNOjpEMTMsIEFSTTo6RDEyLAorICAgIEFSTTo6RDExLCBBUk06OkQxMCwgQVJNOjpEOSwgIEFSTTo6RDgsCisgICAgMAorICB9OworICByZXR1cm4gU1RJLmlzVGFyZ2V0RGFyd2luKCkgPyBEYXJ3aW5DYWxsZWVTYXZlZFJlZ3MgOiBDYWxsZWVTYXZlZFJlZ3M7Cit9CisKK0JpdFZlY3RvciBBUk1CYXNlUmVnaXN0ZXJJbmZvOjoKK2dldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIC8vIEZJWE1FOiBhdm9pZCByZS1jYWxjdWxhdGluZyB0aGlzIGV2ZXJ5dGltZS4KKyAgQml0VmVjdG9yIFJlc2VydmVkKGdldE51bVJlZ3MoKSk7CisgIFJlc2VydmVkLnNldChBUk06OlNQKTsKKyAgUmVzZXJ2ZWQuc2V0KEFSTTo6UEMpOworICBSZXNlcnZlZC5zZXQoQVJNOjpGUFNDUik7CisgIGlmIChoYXNGUChNRikpCisgICAgUmVzZXJ2ZWQuc2V0KEZyYW1lUHRyKTsKKyAgLy8gU29tZSB0YXJnZXRzIHJlc2VydmUgUjkuCisgIGlmIChTVEkuaXNSOVJlc2VydmVkKCkpCisgICAgUmVzZXJ2ZWQuc2V0KEFSTTo6UjkpOworICByZXR1cm4gUmVzZXJ2ZWQ7Cit9CisKK2Jvb2wgQVJNQmFzZVJlZ2lzdGVySW5mbzo6aXNSZXNlcnZlZFJlZyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZykgY29uc3QgeworICBzd2l0Y2ggKFJlZykgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBBUk06OlNQOgorICBjYXNlIEFSTTo6UEM6CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgQVJNOjpSNzoKKyAgY2FzZSBBUk06OlIxMToKKyAgICBpZiAoRnJhbWVQdHIgPT0gUmVnICYmIGhhc0ZQKE1GKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGJyZWFrOworICBjYXNlIEFSTTo6Ujk6CisgICAgcmV0dXJuIFNUSS5pc1I5UmVzZXJ2ZWQoKTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCitBUk1CYXNlUmVnaXN0ZXJJbmZvOjpnZXRNYXRjaGluZ1N1cGVyUmVnQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YklkeCkgY29uc3QgeworICBzd2l0Y2ggKFN1YklkeCkgeworICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgY2FzZSBBUk06OnNzdWJfMDoKKyAgY2FzZSBBUk06OnNzdWJfMToKKyAgY2FzZSBBUk06OnNzdWJfMjoKKyAgY2FzZSBBUk06OnNzdWJfMzogeworICAgIC8vIFMgc3ViLXJlZ2lzdGVycy4KKyAgICBpZiAoQS0+Z2V0U2l6ZSgpID09IDgpIHsKKyAgICAgIGlmIChCID09ICZBUk06OlNQUl84UmVnQ2xhc3MpCisgICAgICAgIHJldHVybiAmQVJNOjpEUFJfOFJlZ0NsYXNzOworICAgICAgYXNzZXJ0KEIgPT0gJkFSTTo6U1BSUmVnQ2xhc3MgJiYgIkV4cGVjdGluZyBTUFIgcmVnaXN0ZXIgY2xhc3MhIik7CisgICAgICBpZiAoQSA9PSAmQVJNOjpEUFJfOFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gQTsKKyAgICAgIHJldHVybiAmQVJNOjpEUFJfVkZQMlJlZ0NsYXNzOworICAgIH0KKworICAgIGlmIChBLT5nZXRTaXplKCkgPT0gMTYpIHsKKyAgICAgIGlmIChCID09ICZBUk06OlNQUl84UmVnQ2xhc3MpCisgICAgICAgIHJldHVybiAmQVJNOjpRUFJfOFJlZ0NsYXNzOworICAgICAgcmV0dXJuICZBUk06OlFQUl9WRlAyUmVnQ2xhc3M7CisgICAgfQorCisgICAgaWYgKEEtPmdldFNpemUoKSA9PSAzMikgeworICAgICAgaWYgKEIgPT0gJkFSTTo6U1BSXzhSZWdDbGFzcykKKyAgICAgICAgcmV0dXJuIDA7ICAvLyBEbyBub3QgYWxsb3cgY29hbGVzY2luZyEKKyAgICAgIHJldHVybiAmQVJNOjpRUVBSX1ZGUDJSZWdDbGFzczsKKyAgICB9CisKKyAgICBhc3NlcnQoQS0+Z2V0U2l6ZSgpID09IDY0ICYmICJFeHBlY3RpbmcgYSBRUVFRIHJlZ2lzdGVyIGNsYXNzISIpOworICAgIHJldHVybiAwOyAgLy8gRG8gbm90IGFsbG93IGNvYWxlc2NpbmchCisgIH0KKyAgY2FzZSBBUk06OmRzdWJfMDoKKyAgY2FzZSBBUk06OmRzdWJfMToKKyAgY2FzZSBBUk06OmRzdWJfMjoKKyAgY2FzZSBBUk06OmRzdWJfMzogeworICAgIC8vIEQgc3ViLXJlZ2lzdGVycy4KKyAgICBpZiAoQS0+Z2V0U2l6ZSgpID09IDE2KSB7CisgICAgICBpZiAoQiA9PSAmQVJNOjpEUFJfVkZQMlJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJkFSTTo6UVBSX1ZGUDJSZWdDbGFzczsKKyAgICAgIGlmIChCID09ICZBUk06OkRQUl84UmVnQ2xhc3MpCisgICAgICAgIHJldHVybiAwOyAgLy8gRG8gbm90IGFsbG93IGNvYWxlc2NpbmchCisgICAgICByZXR1cm4gQTsKKyAgICB9CisKKyAgICBpZiAoQS0+Z2V0U2l6ZSgpID09IDMyKSB7CisgICAgICBpZiAoQiA9PSAmQVJNOjpEUFJfVkZQMlJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJkFSTTo6UVFQUl9WRlAyUmVnQ2xhc3M7CisgICAgICBpZiAoQiA9PSAmQVJNOjpEUFJfOFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gMDsgIC8vIERvIG5vdCBhbGxvdyBjb2FsZXNjaW5nIQorICAgICAgcmV0dXJuIEE7CisgICAgfQorCisgICAgYXNzZXJ0KEEtPmdldFNpemUoKSA9PSA2NCAmJiAiRXhwZWN0aW5nIGEgUVFRUSByZWdpc3RlciBjbGFzcyEiKTsKKyAgICBpZiAoQiAhPSAmQVJNOjpEUFJSZWdDbGFzcykKKyAgICAgIHJldHVybiAwOyAgLy8gRG8gbm90IGFsbG93IGNvYWxlc2NpbmchCisgICAgcmV0dXJuIEE7CisgIH0KKyAgY2FzZSBBUk06OmRzdWJfNDoKKyAgY2FzZSBBUk06OmRzdWJfNToKKyAgY2FzZSBBUk06OmRzdWJfNjoKKyAgY2FzZSBBUk06OmRzdWJfNzogeworICAgIC8vIEQgc3ViLXJlZ2lzdGVycyBvZiBRUVFRIHJlZ2lzdGVycy4KKyAgICBpZiAoQS0+Z2V0U2l6ZSgpID09IDY0ICYmIEIgPT0gJkFSTTo6RFBSUmVnQ2xhc3MpCisgICAgICByZXR1cm4gQTsKKyAgICByZXR1cm4gMDsgIC8vIERvIG5vdCBhbGxvdyBjb2FsZXNjaW5nIQorICB9CisKKyAgY2FzZSBBUk06OnFzdWJfMDoKKyAgY2FzZSBBUk06OnFzdWJfMTogeworICAgIC8vIFEgc3ViLXJlZ2lzdGVycy4KKyAgICBpZiAoQS0+Z2V0U2l6ZSgpID09IDMyKSB7CisgICAgICBpZiAoQiA9PSAmQVJNOjpRUFJfVkZQMlJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJkFSTTo6UVFQUl9WRlAyUmVnQ2xhc3M7CisgICAgICBpZiAoQiA9PSAmQVJNOjpRUFJfOFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gMDsgIC8vIERvIG5vdCBhbGxvdyBjb2FsZXNjaW5nIQorICAgICAgcmV0dXJuIEE7CisgICAgfQorCisgICAgYXNzZXJ0KEEtPmdldFNpemUoKSA9PSA2NCAmJiAiRXhwZWN0aW5nIGEgUVFRUSByZWdpc3RlciBjbGFzcyEiKTsKKyAgICBpZiAoQiA9PSAmQVJNOjpRUFJSZWdDbGFzcykKKyAgICAgIHJldHVybiBBOworICAgIHJldHVybiAwOyAgLy8gRG8gbm90IGFsbG93IGNvYWxlc2NpbmchCisgIH0KKyAgY2FzZSBBUk06OnFzdWJfMjoKKyAgY2FzZSBBUk06OnFzdWJfMzogeworICAgIC8vIFEgc3ViLXJlZ2lzdGVycyBvZiBRUVFRIHJlZ2lzdGVycy4KKyAgICBpZiAoQS0+Z2V0U2l6ZSgpID09IDY0ICYmIEIgPT0gJkFSTTo6UVBSUmVnQ2xhc3MpCisgICAgICByZXR1cm4gQTsKKyAgICByZXR1cm4gMDsgIC8vIERvIG5vdCBhbGxvdyBjb2FsZXNjaW5nIQorICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wKK0FSTUJhc2VSZWdpc3RlckluZm86OmNhbkNvbWJpbmVTdWJSZWdJbmRpY2VzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmU3ViSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOZXdTdWJJZHgpIGNvbnN0IHsKKworICB1bnNpZ25lZCBTaXplID0gUkMtPmdldFNpemUoKSAqIDg7CisgIGlmIChTaXplIDwgNikKKyAgICByZXR1cm4gMDsKKworICBOZXdTdWJJZHggPSAwOyAgLy8gV2hvbGUgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIE51bVJlZ3MgPSBTdWJJbmRpY2VzLnNpemUoKTsKKyAgaWYgKE51bVJlZ3MgPT0gOCkgeworICAgIC8vIDggRCByZWdpc3RlcnMgLT4gMSBRUVFRIHJlZ2lzdGVyLgorICAgIHJldHVybiAoU2l6ZSA9PSA1MTIgJiYKKyAgICAgICAgICAgIFN1YkluZGljZXNbMF0gPT0gQVJNOjpkc3ViXzAgJiYKKyAgICAgICAgICAgIFN1YkluZGljZXNbMV0gPT0gQVJNOjpkc3ViXzEgJiYKKyAgICAgICAgICAgIFN1YkluZGljZXNbMl0gPT0gQVJNOjpkc3ViXzIgJiYKKyAgICAgICAgICAgIFN1YkluZGljZXNbM10gPT0gQVJNOjpkc3ViXzMgJiYKKyAgICAgICAgICAgIFN1YkluZGljZXNbNF0gPT0gQVJNOjpkc3ViXzQgJiYKKyAgICAgICAgICAgIFN1YkluZGljZXNbNV0gPT0gQVJNOjpkc3ViXzUgJiYKKyAgICAgICAgICAgIFN1YkluZGljZXNbNl0gPT0gQVJNOjpkc3ViXzYgJiYKKyAgICAgICAgICAgIFN1YkluZGljZXNbN10gPT0gQVJNOjpkc3ViXzcpOworICB9IGVsc2UgaWYgKE51bVJlZ3MgPT0gNCkgeworICAgIGlmIChTdWJJbmRpY2VzWzBdID09IEFSTTo6cXN1Yl8wKSB7CisgICAgICAvLyA0IFEgcmVnaXN0ZXJzIC0+IDEgUVFRUSByZWdpc3Rlci4KKyAgICAgIHJldHVybiAoU2l6ZSA9PSA1MTIgJiYKKyAgICAgICAgICAgICAgU3ViSW5kaWNlc1sxXSA9PSBBUk06OnFzdWJfMSAmJgorICAgICAgICAgICAgICBTdWJJbmRpY2VzWzJdID09IEFSTTo6cXN1Yl8yICYmCisgICAgICAgICAgICAgIFN1YkluZGljZXNbM10gPT0gQVJNOjpxc3ViXzMpOworICAgIH0gZWxzZSBpZiAoU3ViSW5kaWNlc1swXSA9PSBBUk06OmRzdWJfMCkgeworICAgICAgLy8gNCBEIHJlZ2lzdGVycyAtPiAxIFFRIHJlZ2lzdGVyLgorICAgICAgaWYgKFNpemUgPj0gMjU2ICYmCisgICAgICAgICAgU3ViSW5kaWNlc1sxXSA9PSBBUk06OmRzdWJfMSAmJgorICAgICAgICAgIFN1YkluZGljZXNbMl0gPT0gQVJNOjpkc3ViXzIgJiYKKyAgICAgICAgICBTdWJJbmRpY2VzWzNdID09IEFSTTo6ZHN1Yl8zKSB7CisgICAgICAgIGlmIChTaXplID09IDUxMikKKyAgICAgICAgICBOZXdTdWJJZHggPSBBUk06OnFxc3ViXzA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoU3ViSW5kaWNlc1swXSA9PSBBUk06OmRzdWJfNCkgeworICAgICAgLy8gNCBEIHJlZ2lzdGVycyAtPiAxIFFRIHJlZ2lzdGVyICgybmQpLgorICAgICAgaWYgKFNpemUgPT0gNTEyICYmCisgICAgICAgICAgU3ViSW5kaWNlc1sxXSA9PSBBUk06OmRzdWJfNSAmJgorICAgICAgICAgIFN1YkluZGljZXNbMl0gPT0gQVJNOjpkc3ViXzYgJiYKKyAgICAgICAgICBTdWJJbmRpY2VzWzNdID09IEFSTTo6ZHN1Yl83KSB7CisgICAgICAgIE5ld1N1YklkeCA9IEFSTTo6cXFzdWJfMTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChTdWJJbmRpY2VzWzBdID09IEFSTTo6c3N1Yl8wKSB7CisgICAgICAvLyA0IFMgcmVnaXN0ZXJzIC0+IDEgUSByZWdpc3Rlci4KKyAgICAgIGlmIChTaXplID49IDEyOCAmJgorICAgICAgICAgIFN1YkluZGljZXNbMV0gPT0gQVJNOjpzc3ViXzEgJiYKKyAgICAgICAgICBTdWJJbmRpY2VzWzJdID09IEFSTTo6c3N1Yl8yICYmCisgICAgICAgICAgU3ViSW5kaWNlc1szXSA9PSBBUk06OnNzdWJfMykgeworICAgICAgICBpZiAoU2l6ZSA+PSAyNTYpCisgICAgICAgICAgTmV3U3ViSWR4ID0gQVJNOjpxc3ViXzA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChOdW1SZWdzID09IDIpIHsKKyAgICBpZiAoU3ViSW5kaWNlc1swXSA9PSBBUk06OnFzdWJfMCkgeworICAgICAgLy8gMiBRIHJlZ2lzdGVycyAtPiAxIFFRIHJlZ2lzdGVyLgorICAgICAgaWYgKFNpemUgPj0gMjU2ICYmIFN1YkluZGljZXNbMV0gPT0gQVJNOjpxc3ViXzEpIHsKKyAgICAgICAgaWYgKFNpemUgPT0gNTEyKQorICAgICAgICAgIE5ld1N1YklkeCA9IEFSTTo6cXFzdWJfMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChTdWJJbmRpY2VzWzBdID09IEFSTTo6cXN1Yl8yKSB7CisgICAgICAvLyAyIFEgcmVnaXN0ZXJzIC0+IDEgUVEgcmVnaXN0ZXIgKDJuZCkuCisgICAgICBpZiAoU2l6ZSA9PSA1MTIgJiYgU3ViSW5kaWNlc1sxXSA9PSBBUk06OnFzdWJfMykgeworICAgICAgICBOZXdTdWJJZHggPSBBUk06OnFxc3ViXzE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoU3ViSW5kaWNlc1swXSA9PSBBUk06OmRzdWJfMCkgeworICAgICAgLy8gMiBEIHJlZ2lzdGVycyAtPiAxIFEgcmVnaXN0ZXIuCisgICAgICBpZiAoU2l6ZSA+PSAxMjggJiYgU3ViSW5kaWNlc1sxXSA9PSBBUk06OmRzdWJfMSkgeworICAgICAgICBpZiAoU2l6ZSA+PSAyNTYpCisgICAgICAgICAgTmV3U3ViSWR4ID0gQVJNOjpxc3ViXzA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoU3ViSW5kaWNlc1swXSA9PSBBUk06OmRzdWJfMikgeworICAgICAgLy8gMiBEIHJlZ2lzdGVycyAtPiAxIFEgcmVnaXN0ZXIgKDJuZCkuCisgICAgICBpZiAoU2l6ZSA+PSAyNTYgJiYgU3ViSW5kaWNlc1sxXSA9PSBBUk06OmRzdWJfMykgeworICAgICAgICBOZXdTdWJJZHggPSBBUk06OnFzdWJfMTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChTdWJJbmRpY2VzWzBdID09IEFSTTo6ZHN1Yl80KSB7CisgICAgICAvLyAyIEQgcmVnaXN0ZXJzIC0+IDEgUSByZWdpc3RlciAoM3JkKS4KKyAgICAgIGlmIChTaXplID09IDUxMiAmJiBTdWJJbmRpY2VzWzFdID09IEFSTTo6ZHN1Yl81KSB7CisgICAgICAgIE5ld1N1YklkeCA9IEFSTTo6cXN1Yl8yOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFN1YkluZGljZXNbMF0gPT0gQVJNOjpkc3ViXzYpIHsKKyAgICAgIC8vIDIgRCByZWdpc3RlcnMgLT4gMSBRIHJlZ2lzdGVyICgzcmQpLgorICAgICAgaWYgKFNpemUgPT0gNTEyICYmIFN1YkluZGljZXNbMV0gPT0gQVJNOjpkc3ViXzcpIHsKKyAgICAgICAgTmV3U3ViSWR4ID0gQVJNOjpxc3ViXzM7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoU3ViSW5kaWNlc1swXSA9PSBBUk06OnNzdWJfMCkgeworICAgICAgLy8gMiBTIHJlZ2lzdGVycyAtPiAxIEQgcmVnaXN0ZXIuCisgICAgICBpZiAoU3ViSW5kaWNlc1sxXSA9PSBBUk06OnNzdWJfMSkgeworICAgICAgICBpZiAoU2l6ZSA+PSAxMjgpCisgICAgICAgICAgTmV3U3ViSWR4ID0gQVJNOjpkc3ViXzA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoU3ViSW5kaWNlc1swXSA9PSBBUk06OnNzdWJfMikgeworICAgICAgLy8gMiBTIHJlZ2lzdGVycyAtPiAxIEQgcmVnaXN0ZXIgKDJuZCkuCisgICAgICBpZiAoU2l6ZSA+PSAxMjggJiYgU3ViSW5kaWNlc1sxXSA9PSBBUk06OnNzdWJfMykgeworICAgICAgICBOZXdTdWJJZHggPSBBUk06OmRzdWJfMTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworCitjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKK0FSTUJhc2VSZWdpc3RlckluZm86OmdldFBvaW50ZXJSZWdDbGFzcyh1bnNpZ25lZCBLaW5kKSBjb25zdCB7CisgIHJldHVybiBBUk06OkdQUlJlZ2lzdGVyQ2xhc3M7Cit9CisKKy8vLyBnZXRBbGxvY2F0aW9uT3JkZXIgLSBSZXR1cm5zIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uIG9yZGVyIGZvciBhIHNwZWNpZmllZAorLy8vIHJlZ2lzdGVyIGNsYXNzIGluIHRoZSBmb3JtIG9mIGEgcGFpciBvZiBUYXJnZXRSZWdpc3RlckNsYXNzIGl0ZXJhdG9ycy4KK3N0ZDo6cGFpcjxUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvcixUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvcj4KK0FSTUJhc2VSZWdpc3RlckluZm86OmdldEFsbG9jYXRpb25PcmRlcihjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBIaW50VHlwZSwgdW5zaWduZWQgSGludFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIC8vIEFsdGVybmF0aXZlIHJlZ2lzdGVyIGFsbG9jYXRpb24gb3JkZXJzIHdoZW4gZmF2b3JpbmcgZXZlbiAvIG9kZCByZWdpc3RlcnMKKyAgLy8gb2YgcmVnaXN0ZXIgcGFpcnMuCisKKyAgLy8gTm8gRlAsIFI5IGlzIGF2YWlsYWJsZS4KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdQUkV2ZW4xW10gPSB7CisgICAgQVJNOjpSMCwgQVJNOjpSMiwgQVJNOjpSNCwgQVJNOjpSNiwgQVJNOjpSOCwgQVJNOjpSMTAsCisgICAgQVJNOjpSMSwgQVJNOjpSMywgQVJNOjpSMTIsQVJNOjpMUiwgQVJNOjpSNSwgQVJNOjpSNywKKyAgICBBUk06OlI5LCBBUk06OlIxMQorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR1BST2RkMVtdID0geworICAgIEFSTTo6UjEsIEFSTTo6UjMsIEFSTTo6UjUsIEFSTTo6UjcsIEFSTTo6UjksIEFSTTo6UjExLAorICAgIEFSTTo6UjAsIEFSTTo6UjIsIEFSTTo6UjEyLEFSTTo6TFIsIEFSTTo6UjQsIEFSTTo6UjYsCisgICAgQVJNOjpSOCwgQVJNOjpSMTAKKyAgfTsKKworICAvLyBGUCBpcyBSNywgUjkgaXMgYXZhaWxhYmxlLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR1BSRXZlbjJbXSA9IHsKKyAgICBBUk06OlIwLCBBUk06OlIyLCBBUk06OlI0LCAgICAgICAgICBBUk06OlI4LCBBUk06OlIxMCwKKyAgICBBUk06OlIxLCBBUk06OlIzLCBBUk06OlIxMixBUk06OkxSLCBBUk06OlI1LCBBUk06OlI2LAorICAgIEFSTTo6UjksIEFSTTo6UjExCisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBHUFJPZGQyW10gPSB7CisgICAgQVJNOjpSMSwgQVJNOjpSMywgQVJNOjpSNSwgICAgICAgICAgQVJNOjpSOSwgQVJNOjpSMTEsCisgICAgQVJNOjpSMCwgQVJNOjpSMiwgQVJNOjpSMTIsQVJNOjpMUiwgQVJNOjpSNCwgQVJNOjpSNiwKKyAgICBBUk06OlI4LCBBUk06OlIxMAorICB9OworCisgIC8vIEZQIGlzIFIxMSwgUjkgaXMgYXZhaWxhYmxlLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR1BSRXZlbjNbXSA9IHsKKyAgICBBUk06OlIwLCBBUk06OlIyLCBBUk06OlI0LCBBUk06OlI2LCBBUk06OlI4LAorICAgIEFSTTo6UjEsIEFSTTo6UjMsIEFSTTo6UjEwLEFSTTo6UjEyLEFSTTo6TFIsIEFSTTo6UjUsIEFSTTo6UjcsCisgICAgQVJNOjpSOQorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR1BST2RkM1tdID0geworICAgIEFSTTo6UjEsIEFSTTo6UjMsIEFSTTo6UjUsIEFSTTo6UjYsIEFSTTo6UjksCisgICAgQVJNOjpSMCwgQVJNOjpSMiwgQVJNOjpSMTAsQVJNOjpSMTIsQVJNOjpMUiwgQVJNOjpSNCwgQVJNOjpSNywKKyAgICBBUk06OlI4CisgIH07CisKKyAgLy8gTm8gRlAsIFI5IGlzIG5vdCBhdmFpbGFibGUuCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBHUFJFdmVuNFtdID0geworICAgIEFSTTo6UjAsIEFSTTo6UjIsIEFSTTo6UjQsIEFSTTo6UjYsICAgICAgICAgIEFSTTo6UjEwLAorICAgIEFSTTo6UjEsIEFSTTo6UjMsIEFSTTo6UjEyLEFSTTo6TFIsIEFSTTo6UjUsIEFSTTo6UjcsIEFSTTo6UjgsCisgICAgQVJNOjpSMTEKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdQUk9kZDRbXSA9IHsKKyAgICBBUk06OlIxLCBBUk06OlIzLCBBUk06OlI1LCBBUk06OlI3LCAgICAgICAgICBBUk06OlIxMSwKKyAgICBBUk06OlIwLCBBUk06OlIyLCBBUk06OlIxMixBUk06OkxSLCBBUk06OlI0LCBBUk06OlI2LCBBUk06OlI4LAorICAgIEFSTTo6UjEwCisgIH07CisKKyAgLy8gRlAgaXMgUjcsIFI5IGlzIG5vdCBhdmFpbGFibGUuCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBHUFJFdmVuNVtdID0geworICAgIEFSTTo6UjAsIEFSTTo6UjIsIEFSTTo6UjQsICAgICAgICAgICAgICAgICAgIEFSTTo6UjEwLAorICAgIEFSTTo6UjEsIEFSTTo6UjMsIEFSTTo6UjEyLEFSTTo6TFIsIEFSTTo6UjUsIEFSTTo6UjYsIEFSTTo6UjgsCisgICAgQVJNOjpSMTEKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdQUk9kZDVbXSA9IHsKKyAgICBBUk06OlIxLCBBUk06OlIzLCBBUk06OlI1LCAgICAgICAgICAgICAgICAgICBBUk06OlIxMSwKKyAgICBBUk06OlIwLCBBUk06OlIyLCBBUk06OlIxMixBUk06OkxSLCBBUk06OlI0LCBBUk06OlI2LCBBUk06OlI4LAorICAgIEFSTTo6UjEwCisgIH07CisKKyAgLy8gRlAgaXMgUjExLCBSOSBpcyBub3QgYXZhaWxhYmxlLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR1BSRXZlbjZbXSA9IHsKKyAgICBBUk06OlIwLCBBUk06OlIyLCBBUk06OlI0LCBBUk06OlI2LAorICAgIEFSTTo6UjEsIEFSTTo6UjMsIEFSTTo6UjEwLEFSTTo6UjEyLEFSTTo6TFIsIEFSTTo6UjUsIEFSTTo6UjcsIEFSTTo6UjgKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdQUk9kZDZbXSA9IHsKKyAgICBBUk06OlIxLCBBUk06OlIzLCBBUk06OlI1LCBBUk06OlI3LAorICAgIEFSTTo6UjAsIEFSTTo6UjIsIEFSTTo6UjEwLEFSTTo6UjEyLEFSTTo6TFIsIEFSTTo6UjQsIEFSTTo6UjYsIEFSTTo6UjgKKyAgfTsKKworCisgIGlmIChIaW50VHlwZSA9PSBBUk1SSTo6UmVnUGFpckV2ZW4pIHsKKyAgICBpZiAoaXNQaHlzaWNhbFJlZ2lzdGVyKEhpbnRSZWcpICYmIGdldFJlZ2lzdGVyUGFpckV2ZW4oSGludFJlZywgTUYpID09IDApCisgICAgICAvLyBJdCdzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBmdWxmaWxsIHRoaXMgaGludC4gUmV0dXJuIHRoZSBkZWZhdWx0CisgICAgICAvLyBhbGxvY2F0aW9uIG9yZGVyLgorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFJDLT5hbGxvY2F0aW9uX29yZGVyX2JlZ2luKE1GKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQy0+YWxsb2NhdGlvbl9vcmRlcl9lbmQoTUYpKTsKKworICAgIGlmICghaGFzRlAoTUYpKSB7CisgICAgICBpZiAoIVNUSS5pc1I5UmVzZXJ2ZWQoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEdQUkV2ZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSRXZlbjEgKyAoc2l6ZW9mKEdQUkV2ZW4xKS9zaXplb2YodW5zaWduZWQpKSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihHUFJFdmVuNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUkV2ZW40ICsgKHNpemVvZihHUFJFdmVuNCkvc2l6ZW9mKHVuc2lnbmVkKSkpOworICAgIH0gZWxzZSBpZiAoRnJhbWVQdHIgPT0gQVJNOjpSNykgeworICAgICAgaWYgKCFTVEkuaXNSOVJlc2VydmVkKCkpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihHUFJFdmVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUkV2ZW4yICsgKHNpemVvZihHUFJFdmVuMikvc2l6ZW9mKHVuc2lnbmVkKSkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoR1BSRXZlbjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJFdmVuNSArIChzaXplb2YoR1BSRXZlbjUpL3NpemVvZih1bnNpZ25lZCkpKTsKKyAgICB9IGVsc2UgeyAvLyBGcmFtZVB0ciA9PSBBUk06OlIxMQorICAgICAgaWYgKCFTVEkuaXNSOVJlc2VydmVkKCkpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihHUFJFdmVuMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUkV2ZW4zICsgKHNpemVvZihHUFJFdmVuMykvc2l6ZW9mKHVuc2lnbmVkKSkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoR1BSRXZlbjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJFdmVuNiArIChzaXplb2YoR1BSRXZlbjYpL3NpemVvZih1bnNpZ25lZCkpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoSGludFR5cGUgPT0gQVJNUkk6OlJlZ1BhaXJPZGQpIHsKKyAgICBpZiAoaXNQaHlzaWNhbFJlZ2lzdGVyKEhpbnRSZWcpICYmIGdldFJlZ2lzdGVyUGFpck9kZChIaW50UmVnLCBNRikgPT0gMCkKKyAgICAgIC8vIEl0J3Mgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvIGZ1bGZpbGwgdGhpcyBoaW50LiBSZXR1cm4gdGhlIGRlZmF1bHQKKyAgICAgIC8vIGFsbG9jYXRpb24gb3JkZXIuCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoUkMtPmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oTUYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDLT5hbGxvY2F0aW9uX29yZGVyX2VuZChNRikpOworCisgICAgaWYgKCFoYXNGUChNRikpIHsKKyAgICAgIGlmICghU1RJLmlzUjlSZXNlcnZlZCgpKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoR1BST2RkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUk9kZDEgKyAoc2l6ZW9mKEdQUk9kZDEpL3NpemVvZih1bnNpZ25lZCkpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEdQUk9kZDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJPZGQ0ICsgKHNpemVvZihHUFJPZGQ0KS9zaXplb2YodW5zaWduZWQpKSk7CisgICAgfSBlbHNlIGlmIChGcmFtZVB0ciA9PSBBUk06OlI3KSB7CisgICAgICBpZiAoIVNUSS5pc1I5UmVzZXJ2ZWQoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEdQUk9kZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJPZGQyICsgKHNpemVvZihHUFJPZGQyKS9zaXplb2YodW5zaWduZWQpKSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihHUFJPZGQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BST2RkNSArIChzaXplb2YoR1BST2RkNSkvc2l6ZW9mKHVuc2lnbmVkKSkpOworICAgIH0gZWxzZSB7IC8vIEZyYW1lUHRyID09IEFSTTo6UjExCisgICAgICBpZiAoIVNUSS5pc1I5UmVzZXJ2ZWQoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEdQUk9kZDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJPZGQzICsgKHNpemVvZihHUFJPZGQzKS9zaXplb2YodW5zaWduZWQpKSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihHUFJPZGQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BST2RkNiArIChzaXplb2YoR1BST2RkNikvc2l6ZW9mKHVuc2lnbmVkKSkpOworICAgIH0KKyAgfQorICByZXR1cm4gc3RkOjptYWtlX3BhaXIoUkMtPmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oTUYpLAorICAgICAgICAgICAgICAgICAgICAgICAgUkMtPmFsbG9jYXRpb25fb3JkZXJfZW5kKE1GKSk7Cit9CisKKy8vLyBSZXNvbHZlUmVnQWxsb2NIaW50IC0gUmVzb2x2ZXMgdGhlIHNwZWNpZmllZCByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnQKKy8vLyB0byBhIHBoeXNpY2FsIHJlZ2lzdGVyLiBSZXR1cm5zIHRoZSBwaHlzaWNhbCByZWdpc3RlciBpZiBpdCBpcyBzdWNjZXNzZnVsLgordW5zaWduZWQKK0FSTUJhc2VSZWdpc3RlckluZm86OlJlc29sdmVSZWdBbGxvY0hpbnQodW5zaWduZWQgVHlwZSwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIGlmIChSZWcgPT0gMCB8fCAhaXNQaHlzaWNhbFJlZ2lzdGVyKFJlZykpCisgICAgcmV0dXJuIDA7CisgIGlmIChUeXBlID09IDApCisgICAgcmV0dXJuIFJlZzsKKyAgZWxzZSBpZiAoVHlwZSA9PSAodW5zaWduZWQpQVJNUkk6OlJlZ1BhaXJPZGQpCisgICAgLy8gT2RkIHJlZ2lzdGVyLgorICAgIHJldHVybiBnZXRSZWdpc3RlclBhaXJPZGQoUmVnLCBNRik7CisgIGVsc2UgaWYgKFR5cGUgPT0gKHVuc2lnbmVkKUFSTVJJOjpSZWdQYWlyRXZlbikKKyAgICAvLyBFdmVuIHJlZ2lzdGVyLgorICAgIHJldHVybiBnZXRSZWdpc3RlclBhaXJFdmVuKFJlZywgTUYpOworICByZXR1cm4gMDsKK30KKwordm9pZAorQVJNQmFzZVJlZ2lzdGVySW5mbzo6VXBkYXRlUmVnQWxsb2NIaW50KHVuc2lnbmVkIFJlZywgdW5zaWduZWQgTmV3UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJID0gJk1GLmdldFJlZ0luZm8oKTsKKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gSGludCA9IE1SSS0+Z2V0UmVnQWxsb2NhdGlvbkhpbnQoUmVnKTsKKyAgaWYgKChIaW50LmZpcnN0ID09ICh1bnNpZ25lZClBUk1SSTo6UmVnUGFpck9kZCB8fAorICAgICAgIEhpbnQuZmlyc3QgPT0gKHVuc2lnbmVkKUFSTVJJOjpSZWdQYWlyRXZlbikgJiYKKyAgICAgIEhpbnQuc2Vjb25kICYmIFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoSGludC5zZWNvbmQpKSB7CisgICAgLy8gSWYgJ1JlZycgaXMgb25lIG9mIHRoZSBldmVuIC8gb2RkIHJlZ2lzdGVyIHBhaXIgYW5kIGl0J3Mgbm93IGNoYW5nZWQKKyAgICAvLyAoZS5nLiBjb2FsZXNjZWQpIGludG8gYSBkaWZmZXJlbnQgcmVnaXN0ZXIuIFRoZSBvdGhlciByZWdpc3RlciBvZiB0aGUKKyAgICAvLyBwYWlyIGFsbG9jYXRpb24gaGludCBtdXN0IGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgcmVsYXRpb25zaGlwCisgICAgLy8gY2hhbmdlLgorICAgIHVuc2lnbmVkIE90aGVyUmVnID0gSGludC5zZWNvbmQ7CisgICAgSGludCA9IE1SSS0+Z2V0UmVnQWxsb2NhdGlvbkhpbnQoT3RoZXJSZWcpOworICAgIGlmIChIaW50LnNlY29uZCA9PSBSZWcpCisgICAgICAvLyBNYWtlIHN1cmUgdGhlIHBhaXIgaGFzIG5vdCBhbHJlYWR5IGRpdm9yY2VkLgorICAgICAgTVJJLT5zZXRSZWdBbGxvY2F0aW9uSGludChPdGhlclJlZywgSGludC5maXJzdCwgTmV3UmVnKTsKKyAgfQorfQorCisvLy8gaGFzRlAgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGEgZGVkaWNhdGVkIGZyYW1lCisvLy8gcG9pbnRlciByZWdpc3Rlci4gIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaGFzIHZhcmlhYmxlIHNpemVkIGFsbG9jYXMKKy8vLyBvciBpZiBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uIGlzIGRpc2FibGVkLgorLy8vCitib29sIEFSTUJhc2VSZWdpc3RlckluZm86Omhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgLy8gTWFjIE9TIFggcmVxdWlyZXMgRlAgbm90IHRvIGJlIGNsb2JiZXJlZCBmb3IgYmFja3RyYWNpbmcgcHVycG9zZS4KKyAgaWYgKFNUSS5pc1RhcmdldERhcndpbigpKQorICAgIHJldHVybiB0cnVlOworCisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICAvLyBBbHdheXMgZWxpbWluYXRlIG5vbi1sZWFmIGZyYW1lIHBvaW50ZXJzLgorICByZXR1cm4gKChEaXNhYmxlRnJhbWVQb2ludGVyRWxpbShNRikgJiYgTUZJLT5oYXNDYWxscygpKSB8fAorICAgICAgICAgIG5lZWRzU3RhY2tSZWFsaWdubWVudChNRikgfHwKKyAgICAgICAgICBNRkktPmhhc1ZhclNpemVkT2JqZWN0cygpIHx8CisgICAgICAgICAgTUZJLT5pc0ZyYW1lQWRkcmVzc1Rha2VuKCkpOworfQorCitib29sIEFSTUJhc2VSZWdpc3RlckluZm86OmNhblJlYWxpZ25TdGFjayhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBjb25zdCBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICByZXR1cm4gKFJlYWxpZ25TdGFjayAmJgorICAgICAgICAgICFBRkktPmlzVGh1bWIxT25seUZ1bmN0aW9uKCkgJiYKKyAgICAgICAgICAhTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKSk7Cit9CisKK2Jvb2wgQVJNQmFzZVJlZ2lzdGVySW5mbzo6CituZWVkc1N0YWNrUmVhbGlnbm1lbnQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgY29uc3QgRnVuY3Rpb24gKkYgPSBNRi5nZXRGdW5jdGlvbigpOworICBjb25zdCBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICB1bnNpZ25lZCBTdGFja0FsaWduID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrQWxpZ25tZW50KCk7CisgIGJvb2wgcmVxdWlyZXNSZWFsaWdubWVudCA9ICgoTUZJLT5nZXRNYXhBbGlnbm1lbnQoKSA+IFN0YWNrQWxpZ24pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6U3RhY2tBbGlnbm1lbnQpKTsKKyAgICAKKyAgLy8gRklYTUU6IEN1cnJlbnRseSB3ZSBkb24ndCBzdXBwb3J0IHN0YWNrIHJlYWxpZ25tZW50IGZvciBmdW5jdGlvbnMgd2l0aAorICAvLyAgICAgICAgdmFyaWFibGUtc2l6ZWQgYWxsb2Nhcy4KKyAgLy8gRklYTUU6IEl0J3MgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoaXMuLi4KKyAgaWYgKDAgJiYgcmVxdWlyZXNSZWFsaWdubWVudCAmJiBNRkktPmhhc1ZhclNpemVkT2JqZWN0cygpKQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigKKyAgICAgICJTdGFjayByZWFsaWdubWVudCBpbiBwcmVzZW5zZSBvZiBkeW5hbWljIGFsbG9jYXMgaXMgbm90IHN1cHBvcnRlZCIpOworICAKKyAgLy8gRklYTUU6IFRoaXMgcHJvYmFibHkgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzLgorICBpZiAoMCAmJiByZXF1aXJlc1JlYWxpZ25tZW50ICYmIEFGSS0+aXNUaHVtYjFPbmx5RnVuY3Rpb24oKSkKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoCisgICAgICAiU3RhY2sgcmVhbGlnbm1lbnQgaW4gdGh1bWIxIGZ1bmN0aW9ucyBpcyBub3Qgc3VwcG9ydGVkIik7CisgIAorICByZXR1cm4gcmVxdWlyZXNSZWFsaWdubWVudCAmJiBjYW5SZWFsaWduU3RhY2soTUYpOworfQorCitib29sIEFSTUJhc2VSZWdpc3RlckluZm86OgorY2Fubm90RWxpbWluYXRlRnJhbWUoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgaWYgKERpc2FibGVGcmFtZVBvaW50ZXJFbGltKE1GKSAmJiBNRkktPmFkanVzdHNTdGFjaygpKQorICAgIHJldHVybiB0cnVlOworICByZXR1cm4gTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKSB8fCBNRkktPmlzRnJhbWVBZGRyZXNzVGFrZW4oKQorICAgIHx8IG5lZWRzU3RhY2tSZWFsaWdubWVudChNRik7Cit9CisKKy8vLyBlc3RpbWF0ZVN0YWNrU2l6ZSAtIEVzdGltYXRlIGFuZCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZyYW1lLgorc3RhdGljIHVuc2lnbmVkIGVzdGltYXRlU3RhY2tTaXplKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqRkZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIGludCBPZmZzZXQgPSAwOworICBmb3IgKGludCBpID0gRkZJLT5nZXRPYmplY3RJbmRleEJlZ2luKCk7IGkgIT0gMDsgKytpKSB7CisgICAgaW50IEZpeGVkT2ZmID0gLUZGSS0+Z2V0T2JqZWN0T2Zmc2V0KGkpOworICAgIGlmIChGaXhlZE9mZiA+IE9mZnNldCkgT2Zmc2V0ID0gRml4ZWRPZmY7CisgIH0KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZGSS0+Z2V0T2JqZWN0SW5kZXhFbmQoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoRkZJLT5pc0RlYWRPYmplY3RJbmRleChpKSkKKyAgICAgIGNvbnRpbnVlOworICAgIE9mZnNldCArPSBGRkktPmdldE9iamVjdFNpemUoaSk7CisgICAgdW5zaWduZWQgQWxpZ24gPSBGRkktPmdldE9iamVjdEFsaWdubWVudChpKTsKKyAgICAvLyBBZGp1c3QgdG8gYWxpZ25tZW50IGJvdW5kYXJ5CisgICAgT2Zmc2V0ID0gKE9mZnNldCtBbGlnbi0xKS9BbGlnbipBbGlnbjsKKyAgfQorICByZXR1cm4gKHVuc2lnbmVkKU9mZnNldDsKK30KKworLy8vIGVzdGltYXRlUlNTdGFja1NpemVMaW1pdCAtIExvb2sgYXQgZWFjaCBpbnN0cnVjdGlvbiB0aGF0IHJlZmVyZW5jZXMgc3RhY2sKKy8vLyBmcmFtZXMgYW5kIHJldHVybiB0aGUgc3RhY2sgc2l6ZSBsaW1pdCBiZXlvbmQgd2hpY2ggc29tZSBvZiB0aGVzZQorLy8vIGluc3RydWN0aW9ucyB3aWxsIHJlcXVpcmUgYSBzY3JhdGNoIHJlZ2lzdGVyIGR1cmluZyB0aGVpciBleHBhbnNpb24gbGF0ZXIuCit1bnNpZ25lZAorQVJNQmFzZVJlZ2lzdGVySW5mbzo6ZXN0aW1hdGVSU1N0YWNrU2l6ZUxpbWl0KE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgY29uc3QgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgdW5zaWduZWQgTGltaXQgPSAoMSA8PCAxMikgLSAxOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBNRi5iZWdpbigpLEUgPSBNRi5lbmQoKTsgQkIgIT0gRTsgKytCQikgeworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgaWYgKCFJLT5nZXRPcGVyYW5kKGkpLmlzRkkoKSkgY29udGludWU7CisKKyAgICAgICAgLy8gV2hlbiB1c2luZyBBRERyaSB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgYSBzdGFjayBvYmplY3QsIDI1NSBpcyB0aGUKKyAgICAgICAgLy8gbGFyZ2VzdCBvZmZzZXQgZ3VhcmFudGVlZCB0byBmaXQgaW4gdGhlIGltbWVkaWF0ZSBvZmZzZXQuCisgICAgICAgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBBUk06OkFERHJpKSB7CisgICAgICAgICAgTGltaXQgPSBzdGQ6Om1pbihMaW1pdCwgKDFVIDw8IDgpIC0gMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgdGhlIGFkZHJlc3NpbmcgbW9kZS4KKyAgICAgICAgc3dpdGNoIChJLT5nZXREZXNjKCkuVFNGbGFncyAmIEFSTUlJOjpBZGRyTW9kZU1hc2spIHsKKyAgICAgICAgY2FzZSBBUk1JSTo6QWRkck1vZGUzOgorICAgICAgICBjYXNlIEFSTUlJOjpBZGRyTW9kZVQyX2k4OgorICAgICAgICAgIExpbWl0ID0gc3RkOjptaW4oTGltaXQsICgxVSA8PCA4KSAtIDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFSTUlJOjpBZGRyTW9kZTU6CisgICAgICAgIGNhc2UgQVJNSUk6OkFkZHJNb2RlVDJfaThzNDoKKyAgICAgICAgICBMaW1pdCA9IHN0ZDo6bWluKExpbWl0LCAoKDFVIDw8IDgpIC0gMSkgKiA0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBUk1JSTo6QWRkck1vZGVUMl9pMTI6CisgICAgICAgICAgLy8gaTEyIHN1cHBvcnRzIG9ubHkgcG9zaXRpdmUgb2Zmc2V0IHNvIHRoZXNlIHdpbGwgYmUgY29udmVydGVkIHRvCisgICAgICAgICAgLy8gaTggb3Bjb2Rlcy4gU2VlIGxsdm06OnJld3JpdGVUMkZyYW1lSW5kZXguCisgICAgICAgICAgaWYgKGhhc0ZQKE1GKSAmJiBBRkktPmhhc1N0YWNrRnJhbWUoKSkKKyAgICAgICAgICAgIExpbWl0ID0gc3RkOjptaW4oTGltaXQsICgxVSA8PCA4KSAtIDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFSTUlJOjpBZGRyTW9kZTY6CisgICAgICAgICAgLy8gQWRkcmVzc2luZyBtb2RlIDYgKGxvYWQvc3RvcmUpIGluc3RydWN0aW9ucyBjYW4ndCBlbmNvZGUgYW4KKyAgICAgICAgICAvLyBpbW1lZGlhdGUgb2Zmc2V0IGZvciBzdGFjayByZWZlcmVuY2VzLgorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAvLyBBdCBtb3N0IG9uZSBGSSBwZXIgaW5zdHJ1Y3Rpb24KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gTGltaXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBHZXRGdW5jdGlvblNpemVJbkJ5dGVzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZUSUkpIHsKKyAgdW5zaWduZWQgRm5TaXplID0gMDsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIE1CQkkgPSBNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7CisgICAgICAgTUJCSSAhPSBFOyArK01CQkkpIHsKKyAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1CQkk7CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IE1CQi5iZWdpbigpLEUgPSBNQkIuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIEZuU2l6ZSArPSBUSUkuR2V0SW5zdFNpemVJbkJ5dGVzKEkpOworICB9CisgIHJldHVybiBGblNpemU7Cit9CisKK3ZvaWQKK0FSTUJhc2VSZWdpc3RlckluZm86OnByb2Nlc3NGdW5jdGlvbkJlZm9yZUNhbGxlZVNhdmVkU2NhbihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMpIGNvbnN0IHsKKyAgLy8gVGhpcyB0ZWxscyBQRUkgdG8gc3BpbGwgdGhlIEZQIGFzIGlmIGl0IGlzIGFueSBvdGhlciBjYWxsZWUtc2F2ZSByZWdpc3RlcgorICAvLyB0byB0YWtlIGFkdmFudGFnZSB0aGUgZWxpbWluYXRlRnJhbWVJbmRleCBtYWNoaW5lcnkuIFRoaXMgYWxzbyBlbnN1cmVzIGl0CisgIC8vIGlzIHNwaWxsZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBieSBnZXRDYWxsZWVTYXZlZFJlZ3MoKSB0byBtYWtlIGl0IGVhc2llcgorICAvLyB0byBjb21iaW5lIG11bHRpcGxlIGxvYWRzIC8gc3RvcmVzLgorICBib29sIENhbkVsaW1pbmF0ZUZyYW1lID0gdHJ1ZTsKKyAgYm9vbCBDUzFTcGlsbGVkID0gZmFsc2U7CisgIGJvb2wgTFJTcGlsbGVkID0gZmFsc2U7CisgIHVuc2lnbmVkIE51bUdQUlNwaWxscyA9IDA7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBVbnNwaWxsZWRDUzFHUFJzOworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gVW5zcGlsbGVkQ1MyR1BSczsKKyAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisKKyAgLy8gU3BpbGwgUjQgaWYgVGh1bWIyIGZ1bmN0aW9uIHJlcXVpcmVzIHN0YWNrIHJlYWxpZ25tZW50IC0gaXQgd2lsbCBiZSB1c2VkIGFzCisgIC8vIHNjcmF0Y2ggcmVnaXN0ZXIuCisgIC8vIEZJWE1FOiBJdCB3aWxsIGJlIGJldHRlciBqdXN0IHRvIGZpbmQgc3BhcmUgcmVnaXN0ZXIgaGVyZS4KKyAgaWYgKG5lZWRzU3RhY2tSZWFsaWdubWVudChNRikgJiYKKyAgICAgIEFGSS0+aXNUaHVtYjJGdW5jdGlvbigpKQorICAgIE1GLmdldFJlZ0luZm8oKS5zZXRQaHlzUmVnVXNlZChBUk06OlI0KTsKKworICAvLyBTcGlsbCBMUiBpZiBUaHVtYjEgZnVuY3Rpb24gdXNlcyB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnQgbGlzdHMuCisgIGlmIChBRkktPmlzVGh1bWIxT25seUZ1bmN0aW9uKCkgJiYgQUZJLT5nZXRWYXJBcmdzUmVnU2F2ZVNpemUoKSA+IDApCisgICAgTUYuZ2V0UmVnSW5mbygpLnNldFBoeXNSZWdVc2VkKEFSTTo6TFIpOworCisgIC8vIERvbid0IHNwaWxsIEZQIGlmIHRoZSBmcmFtZSBjYW4gYmUgZWxpbWluYXRlZC4gVGhpcyBpcyBkZXRlcm1pbmVkCisgIC8vIGJ5IHNjYW5uaW5nIHRoZSBjYWxsZWUtc2F2ZSByZWdpc3RlcnMgdG8gc2VlIGlmIGFueSBpcyB1c2VkLgorICBjb25zdCB1bnNpZ25lZCAqQ1NSZWdzID0gZ2V0Q2FsbGVlU2F2ZWRSZWdzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IENTUmVnc1tpXTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gQ1NSZWdzW2ldOworICAgIGJvb2wgU3BpbGxlZCA9IGZhbHNlOworICAgIGlmIChNRi5nZXRSZWdJbmZvKCkuaXNQaHlzUmVnVXNlZChSZWcpKSB7CisgICAgICBBRkktPnNldENTUmVnaXN0ZXJJc1NwaWxsZWQoUmVnKTsKKyAgICAgIFNwaWxsZWQgPSB0cnVlOworICAgICAgQ2FuRWxpbWluYXRlRnJhbWUgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ2hlY2sgYWxpYXMgcmVnaXN0ZXJzIHRvby4KKyAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgKkFsaWFzZXMgPSBnZXRBbGlhc1NldChSZWcpOyAqQWxpYXNlczsgKytBbGlhc2VzKSB7CisgICAgICAgIGlmIChNRi5nZXRSZWdJbmZvKCkuaXNQaHlzUmVnVXNlZCgqQWxpYXNlcykpIHsKKyAgICAgICAgICBTcGlsbGVkID0gdHJ1ZTsKKyAgICAgICAgICBDYW5FbGltaW5hdGVGcmFtZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFBUk06OkdQUlJlZ2lzdGVyQ2xhc3MtPmNvbnRhaW5zKFJlZykpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChTcGlsbGVkKSB7CisgICAgICBOdW1HUFJTcGlsbHMrKzsKKworICAgICAgaWYgKCFTVEkuaXNUYXJnZXREYXJ3aW4oKSkgeworICAgICAgICBpZiAoUmVnID09IEFSTTo6TFIpCisgICAgICAgICAgTFJTcGlsbGVkID0gdHJ1ZTsKKyAgICAgICAgQ1MxU3BpbGxlZCA9IHRydWU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBLZWVwIHRyYWNrIGlmIExSIGFuZCBhbnkgb2YgUjQsIFI1LCBSNiwgYW5kIFI3IGlzIHNwaWxsZWQuCisgICAgICBzd2l0Y2ggKFJlZykgeworICAgICAgY2FzZSBBUk06OkxSOgorICAgICAgICBMUlNwaWxsZWQgPSB0cnVlOworICAgICAgICAvLyBGYWxsdGhyb3VnaAorICAgICAgY2FzZSBBUk06OlI0OgorICAgICAgY2FzZSBBUk06OlI1OgorICAgICAgY2FzZSBBUk06OlI2OgorICAgICAgY2FzZSBBUk06OlI3OgorICAgICAgICBDUzFTcGlsbGVkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFTVEkuaXNUYXJnZXREYXJ3aW4oKSkgeworICAgICAgICBVbnNwaWxsZWRDUzFHUFJzLnB1c2hfYmFjayhSZWcpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChSZWcpIHsKKyAgICAgIGNhc2UgQVJNOjpSNDoKKyAgICAgIGNhc2UgQVJNOjpSNToKKyAgICAgIGNhc2UgQVJNOjpSNjoKKyAgICAgIGNhc2UgQVJNOjpSNzoKKyAgICAgIGNhc2UgQVJNOjpMUjoKKyAgICAgICAgVW5zcGlsbGVkQ1MxR1BScy5wdXNoX2JhY2soUmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBVbnNwaWxsZWRDUzJHUFJzLnB1c2hfYmFjayhSZWcpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBib29sIEZvcmNlTFJTcGlsbCA9IGZhbHNlOworICBpZiAoIUxSU3BpbGxlZCAmJiBBRkktPmlzVGh1bWIxT25seUZ1bmN0aW9uKCkpIHsKKyAgICB1bnNpZ25lZCBGblNpemUgPSBHZXRGdW5jdGlvblNpemVJbkJ5dGVzKE1GLCBUSUkpOworICAgIC8vIEZvcmNlIExSIHRvIGJlIHNwaWxsZWQgaWYgdGhlIFRodW1iIGZ1bmN0aW9uIHNpemUgaXMgPiAyMDQ4LiBUaGlzIGVuYWJsZXMKKyAgICAvLyB1c2Ugb2YgQkwgdG8gaW1wbGVtZW50IGZhciBqdW1wLiBJZiBpdCB0dXJucyBvdXQgdGhhdCBpdCdzIG5vdCBuZWVkZWQKKyAgICAvLyB0aGVuIHRoZSBicmFuY2ggZml4IHVwIHBhdGggd2lsbCB1bmRvIGl0LgorICAgIGlmIChGblNpemUgPj0gKDEgPDwgMTEpKSB7CisgICAgICBDYW5FbGltaW5hdGVGcmFtZSA9IGZhbHNlOworICAgICAgRm9yY2VMUlNwaWxsID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBJZiBhbnkgb2YgdGhlIHN0YWNrIHNsb3QgcmVmZXJlbmNlcyBtYXkgYmUgb3V0IG9mIHJhbmdlIG9mIGFuIGltbWVkaWF0ZQorICAvLyBvZmZzZXQsIG1ha2Ugc3VyZSBhIHJlZ2lzdGVyIChvciBhIHNwaWxsIHNsb3QpIGlzIGF2YWlsYWJsZSBmb3IgdGhlCisgIC8vIHJlZ2lzdGVyIHNjYXZlbmdlci4gTm90ZSB0aGF0IGlmIHdlJ3JlIGluZGV4aW5nIG9mZiB0aGUgZnJhbWUgcG9pbnRlciwgdGhlCisgIC8vIGVmZmVjdGl2ZSBzdGFjayBzaXplIGlzIDQgYnl0ZXMgbGFyZ2VyIHNpbmNlIHRoZSBGUCBwb2ludHMgdG8gdGhlIHN0YWNrCisgIC8vIHNsb3Qgb2YgdGhlIHByZXZpb3VzIEZQLiBBbHNvLCBpZiB3ZSBoYXZlIHZhcmlhYmxlIHNpemVkIG9iamVjdHMgaW4gdGhlCisgIC8vIGZ1bmN0aW9uLCBzdGFjayBzbG90IHJlZmVyZW5jZXMgd2lsbCBvZnRlbiBiZSBuZWdhdGl2ZSwgYW5kIHNvbWUgb2YKKyAgLy8gb3VyIGluc3RydWN0aW9ucyBhcmUgcG9zaXRpdmUtb2Zmc2V0IG9ubHksIHNvIGNvbnNlcnZhdGl2ZWx5IGNvbnNpZGVyCisgIC8vIHRoYXQgY2FzZSB0byB3YW50IGEgc3BpbGwgc2xvdCAob3IgcmVnaXN0ZXIpIGFzIHdlbGwuIFNpbWlsYXJseSwgaWYKKyAgLy8gdGhlIGZ1bmN0aW9uIGFkanVzdHMgdGhlIHN0YWNrIHBvaW50ZXIgZHVyaW5nIGV4ZWN1dGlvbiBhbmQgdGhlCisgIC8vIGFkanVzdG1lbnRzIGFyZW4ndCBhbHJlYWR5IHBhcnQgb2Ygb3VyIHN0YWNrIHNpemUgZXN0aW1hdGUsIG91ciBvZmZzZXQKKyAgLy8gY2FsY3VsYXRpb25zIG1heSBiZSBvZmYsIHNvIGJlIGNvbnNlcnZhdGl2ZS4KKyAgLy8gRklYTUU6IFdlIGNvdWxkIGFkZCBsb2dpYyB0byBiZSBtb3JlIHByZWNpc2UgYWJvdXQgbmVnYXRpdmUgb2Zmc2V0cworICAvLyAgICAgICAgYW5kIHdoaWNoIGluc3RydWN0aW9ucyB3aWxsIG5lZWQgYSBzY3JhdGNoIHJlZ2lzdGVyIGZvciB0aGVtLiBJcyBpdAorICAvLyAgICAgICAgd29ydGggdGhlIGVmZm9ydCBhbmQgYWRkZWQgZnJhZ2lsaXR5PworICBib29sIEJpZ1N0YWNrID0KKyAgICAoUlMgJiYKKyAgICAgKGVzdGltYXRlU3RhY2tTaXplKE1GKSArICgoaGFzRlAoTUYpICYmIEFGSS0+aGFzU3RhY2tGcmFtZSgpKSA/IDQ6MCkgPj0KKyAgICAgIGVzdGltYXRlUlNTdGFja1NpemVMaW1pdChNRikpKQorICAgIHx8IE1GSS0+aGFzVmFyU2l6ZWRPYmplY3RzKCkKKyAgICB8fCAoTUZJLT5hZGp1c3RzU3RhY2soKSAmJiAhY2FuU2ltcGxpZnlDYWxsRnJhbWVQc2V1ZG9zKE1GKSk7CisKKyAgYm9vbCBFeHRyYUNTU3BpbGwgPSBmYWxzZTsKKyAgaWYgKEJpZ1N0YWNrIHx8ICFDYW5FbGltaW5hdGVGcmFtZSB8fCBjYW5ub3RFbGltaW5hdGVGcmFtZShNRikpIHsKKyAgICBBRkktPnNldEhhc1N0YWNrRnJhbWUodHJ1ZSk7CisKKyAgICAvLyBJZiBMUiBpcyBub3Qgc3BpbGxlZCwgYnV0IGF0IGxlYXN0IG9uZSBvZiBSNCwgUjUsIFI2LCBhbmQgUjcgaXMgc3BpbGxlZC4KKyAgICAvLyBTcGlsbCBMUiBhcyB3ZWxsIHNvIHdlIGNhbiBmb2xkIEJYX1JFVCB0byB0aGUgcmVnaXN0ZXJzIHJlc3RvcmUgKExETSkuCisgICAgaWYgKCFMUlNwaWxsZWQgJiYgQ1MxU3BpbGxlZCkgeworICAgICAgTUYuZ2V0UmVnSW5mbygpLnNldFBoeXNSZWdVc2VkKEFSTTo6TFIpOworICAgICAgQUZJLT5zZXRDU1JlZ2lzdGVySXNTcGlsbGVkKEFSTTo6TFIpOworICAgICAgTnVtR1BSU3BpbGxzKys7CisgICAgICBVbnNwaWxsZWRDUzFHUFJzLmVyYXNlKHN0ZDo6ZmluZChVbnNwaWxsZWRDUzFHUFJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnNwaWxsZWRDUzFHUFJzLmVuZCgpLCAodW5zaWduZWQpQVJNOjpMUikpOworICAgICAgRm9yY2VMUlNwaWxsID0gZmFsc2U7CisgICAgICBFeHRyYUNTU3BpbGwgPSB0cnVlOworICAgIH0KKworICAgIGlmIChoYXNGUChNRikpIHsKKyAgICAgIE1GLmdldFJlZ0luZm8oKS5zZXRQaHlzUmVnVXNlZChGcmFtZVB0cik7CisgICAgICBOdW1HUFJTcGlsbHMrKzsKKyAgICB9CisKKyAgICAvLyBJZiBzdGFjayBhbmQgZG91YmxlIGFyZSA4LWJ5dGUgYWxpZ25lZCBhbmQgd2UgYXJlIHNwaWxsaW5nIGFuIG9kZCBudW1iZXIKKyAgICAvLyBvZiBHUFJzLiBTcGlsbCBvbmUgZXh0cmEgY2FsbGVlIHNhdmUgR1BSIHNvIHdlIHdvbid0IGhhdmUgdG8gcGFkIGJldHdlZW4KKyAgICAvLyB0aGUgaW50ZWdlciBhbmQgZG91YmxlIGNhbGxlZSBzYXZlIGFyZWFzLgorICAgIHVuc2lnbmVkIFRhcmdldEFsaWduID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrQWxpZ25tZW50KCk7CisgICAgaWYgKFRhcmdldEFsaWduID09IDggJiYgKE51bUdQUlNwaWxscyAmIDEpKSB7CisgICAgICBpZiAoQ1MxU3BpbGxlZCAmJiAhVW5zcGlsbGVkQ1MxR1BScy5lbXB0eSgpKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVbnNwaWxsZWRDUzFHUFJzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICB1bnNpZ25lZCBSZWcgPSBVbnNwaWxsZWRDUzFHUFJzW2ldOworICAgICAgICAgIC8vIERvbid0IHNwaWxsIGhpZ2ggcmVnaXN0ZXIgaWYgdGhlIGZ1bmN0aW9uIGlzIHRodW1iMQorICAgICAgICAgIGlmICghQUZJLT5pc1RodW1iMU9ubHlGdW5jdGlvbigpIHx8CisgICAgICAgICAgICAgIGlzQVJNTG93UmVnaXN0ZXIoUmVnKSB8fCBSZWcgPT0gQVJNOjpMUikgeworICAgICAgICAgICAgTUYuZ2V0UmVnSW5mbygpLnNldFBoeXNSZWdVc2VkKFJlZyk7CisgICAgICAgICAgICBBRkktPnNldENTUmVnaXN0ZXJJc1NwaWxsZWQoUmVnKTsKKyAgICAgICAgICAgIGlmICghaXNSZXNlcnZlZFJlZyhNRiwgUmVnKSkKKyAgICAgICAgICAgICAgRXh0cmFDU1NwaWxsID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghVW5zcGlsbGVkQ1MyR1BScy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgICFBRkktPmlzVGh1bWIxT25seUZ1bmN0aW9uKCkpIHsKKyAgICAgICAgdW5zaWduZWQgUmVnID0gVW5zcGlsbGVkQ1MyR1BScy5mcm9udCgpOworICAgICAgICBNRi5nZXRSZWdJbmZvKCkuc2V0UGh5c1JlZ1VzZWQoUmVnKTsKKyAgICAgICAgQUZJLT5zZXRDU1JlZ2lzdGVySXNTcGlsbGVkKFJlZyk7CisgICAgICAgIGlmICghaXNSZXNlcnZlZFJlZyhNRiwgUmVnKSkKKyAgICAgICAgICBFeHRyYUNTU3BpbGwgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIC8vIEVzdGltYXRlIGlmIHdlIG1pZ2h0IG5lZWQgdG8gc2NhdmVuZ2UgYSByZWdpc3RlciBhdCBzb21lIHBvaW50IGluIG9yZGVyCisgICAgLy8gdG8gbWF0ZXJpYWxpemUgYSBzdGFjayBvZmZzZXQuIElmIHNvLCBlaXRoZXIgc3BpbGwgb25lIGFkZGl0aW9uYWwKKyAgICAvLyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIgb3IgcmVzZXJ2ZSBhIHNwZWNpYWwgc3BpbGwgc2xvdCB0byBmYWNpbGl0YXRlCisgICAgLy8gcmVnaXN0ZXIgc2NhdmVuZ2luZy4gVGh1bWIxIG5lZWRzIGEgc3BpbGwgc2xvdCBmb3Igc3RhY2sgcG9pbnRlcgorICAgIC8vIGFkanVzdG1lbnRzIGFsc28sIGV2ZW4gd2hlbiB0aGUgZnJhbWUgaXRzZWxmIGlzIHNtYWxsLgorICAgIGlmIChCaWdTdGFjayAmJiAhRXh0cmFDU1NwaWxsKSB7CisgICAgICAvLyBJZiBhbnkgbm9uLXJlc2VydmVkIENTIHJlZ2lzdGVyIGlzbid0IHNwaWxsZWQsIGp1c3Qgc3BpbGwgb25lIG9yIHR3bworICAgICAgLy8gZXh0cmEuIFRoYXQgc2hvdWxkIHRha2UgY2FyZSBvZiBpdCEKKyAgICAgIHVuc2lnbmVkIE51bUV4dHJhcyA9IFRhcmdldEFsaWduIC8gNDsKKyAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiBFeHRyYXM7CisgICAgICB3aGlsZSAoTnVtRXh0cmFzICYmICFVbnNwaWxsZWRDUzFHUFJzLmVtcHR5KCkpIHsKKyAgICAgICAgdW5zaWduZWQgUmVnID0gVW5zcGlsbGVkQ1MxR1BScy5iYWNrKCk7CisgICAgICAgIFVuc3BpbGxlZENTMUdQUnMucG9wX2JhY2soKTsKKyAgICAgICAgaWYgKCFpc1Jlc2VydmVkUmVnKE1GLCBSZWcpICYmCisgICAgICAgICAgICAoIUFGSS0+aXNUaHVtYjFPbmx5RnVuY3Rpb24oKSB8fCBpc0FSTUxvd1JlZ2lzdGVyKFJlZykgfHwKKyAgICAgICAgICAgICBSZWcgPT0gQVJNOjpMUikpIHsKKyAgICAgICAgICBFeHRyYXMucHVzaF9iYWNrKFJlZyk7CisgICAgICAgICAgTnVtRXh0cmFzLS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEZvciBub24tVGh1bWIxIGZ1bmN0aW9ucywgYWxzbyBjaGVjayBmb3IgaGktcmVnIENTIHJlZ2lzdGVycworICAgICAgaWYgKCFBRkktPmlzVGh1bWIxT25seUZ1bmN0aW9uKCkpIHsKKyAgICAgICAgd2hpbGUgKE51bUV4dHJhcyAmJiAhVW5zcGlsbGVkQ1MyR1BScy5lbXB0eSgpKSB7CisgICAgICAgICAgdW5zaWduZWQgUmVnID0gVW5zcGlsbGVkQ1MyR1BScy5iYWNrKCk7CisgICAgICAgICAgVW5zcGlsbGVkQ1MyR1BScy5wb3BfYmFjaygpOworICAgICAgICAgIGlmICghaXNSZXNlcnZlZFJlZyhNRiwgUmVnKSkgeworICAgICAgICAgICAgRXh0cmFzLnB1c2hfYmFjayhSZWcpOworICAgICAgICAgICAgTnVtRXh0cmFzLS07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoRXh0cmFzLnNpemUoKSAmJiBOdW1FeHRyYXMgPT0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRXh0cmFzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBNRi5nZXRSZWdJbmZvKCkuc2V0UGh5c1JlZ1VzZWQoRXh0cmFzW2ldKTsKKyAgICAgICAgICBBRkktPnNldENTUmVnaXN0ZXJJc1NwaWxsZWQoRXh0cmFzW2ldKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghQUZJLT5pc1RodW1iMU9ubHlGdW5jdGlvbigpKSB7CisgICAgICAgIC8vIG5vdGU6IFRodW1iMSBmdW5jdGlvbnMgc3BpbGwgdG8gUjEyLCBub3QgdGhlIHN0YWNrLiAgUmVzZXJ2ZSBhIHNsb3QKKyAgICAgICAgLy8gY2xvc2VzdCB0byBTUCBvciBmcmFtZSBwb2ludGVyLgorICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IEFSTTo6R1BSUmVnaXN0ZXJDbGFzczsKKyAgICAgICAgUlMtPnNldFNjYXZlbmdpbmdGcmFtZUluZGV4KE1GSS0+Q3JlYXRlU3RhY2tPYmplY3QoUkMtPmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkMtPmdldEFsaWdubWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChGb3JjZUxSU3BpbGwpIHsKKyAgICBNRi5nZXRSZWdJbmZvKCkuc2V0UGh5c1JlZ1VzZWQoQVJNOjpMUik7CisgICAgQUZJLT5zZXRDU1JlZ2lzdGVySXNTcGlsbGVkKEFSTTo6TFIpOworICAgIEFGSS0+c2V0TFJJc1NwaWxsZWRGb3JGYXJKdW1wKHRydWUpOworICB9Cit9CisKK3Vuc2lnbmVkIEFSTUJhc2VSZWdpc3RlckluZm86OmdldFJBUmVnaXN0ZXIoKSBjb25zdCB7CisgIHJldHVybiBBUk06OkxSOworfQorCit1bnNpZ25lZCAKK0FSTUJhc2VSZWdpc3RlckluZm86OmdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBpZiAoaGFzRlAoTUYpKQorICAgIHJldHVybiBGcmFtZVB0cjsKKyAgcmV0dXJuIEFSTTo6U1A7Cit9CisKKy8vIFByb3ZpZGUgYSBiYXNlK29mZnNldCByZWZlcmVuY2UgdG8gYW4gRkkgc2xvdCBmb3IgZGVidWcgaW5mby4gSXQncyB0aGUKKy8vIHNhbWUgYXMgd2hhdCB3ZSB1c2UgZm9yIHJlc29sdmluZyB0aGUgY29kZS1nZW4gcmVmZXJlbmNlcyBmb3Igbm93LgorLy8gRklYTUU6IFRoaXMgY2FuIGdvIHdyb25nIHdoZW4gcmVmZXJlbmNlcyBhcmUgU1AtcmVsYXRpdmUgYW5kIHNpbXBsZSBjYWxsCisvLyAgICAgICAgZnJhbWVzIGFyZW4ndCB1c2VkLgoraW50CitBUk1CYXNlUmVnaXN0ZXJJbmZvOjpnZXRGcmFtZUluZGV4UmVmZXJlbmNlKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkZyYW1lUmVnKSBjb25zdCB7CisgIHJldHVybiBSZXNvbHZlRnJhbWVJbmRleFJlZmVyZW5jZShNRiwgRkksIEZyYW1lUmVnLCAwKTsKK30KKworaW50CitBUk1CYXNlUmVnaXN0ZXJJbmZvOjpSZXNvbHZlRnJhbWVJbmRleFJlZmVyZW5jZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkZyYW1lUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBjb25zdCBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICBpbnQgT2Zmc2V0ID0gTUZJLT5nZXRPYmplY3RPZmZzZXQoRkkpICsgTUZJLT5nZXRTdGFja1NpemUoKTsKKyAgaW50IEZQT2Zmc2V0ID0gT2Zmc2V0IC0gQUZJLT5nZXRGcmFtZVB0clNwaWxsT2Zmc2V0KCk7CisgIGJvb2wgaXNGaXhlZCA9IE1GSS0+aXNGaXhlZE9iamVjdEluZGV4KEZJKTsKKworICBGcmFtZVJlZyA9IEFSTTo6U1A7CisgIE9mZnNldCArPSBTUEFkajsKKyAgaWYgKEFGSS0+aXNHUFJDYWxsZWVTYXZlZEFyZWExRnJhbWUoRkkpKQorICAgIHJldHVybiBPZmZzZXQgLSBBRkktPmdldEdQUkNhbGxlZVNhdmVkQXJlYTFPZmZzZXQoKTsKKyAgZWxzZSBpZiAoQUZJLT5pc0dQUkNhbGxlZVNhdmVkQXJlYTJGcmFtZShGSSkpCisgICAgcmV0dXJuIE9mZnNldCAtIEFGSS0+Z2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMk9mZnNldCgpOworICBlbHNlIGlmIChBRkktPmlzRFBSQ2FsbGVlU2F2ZWRBcmVhRnJhbWUoRkkpKQorICAgIHJldHVybiBPZmZzZXQgLSBBRkktPmdldERQUkNhbGxlZVNhdmVkQXJlYU9mZnNldCgpOworCisgIC8vIFdoZW4gZHluYW1pY2FsbHkgcmVhbGlnbmluZyB0aGUgc3RhY2ssIHVzZSB0aGUgZnJhbWUgcG9pbnRlciBmb3IKKyAgLy8gcGFyYW1ldGVycywgYW5kIHRoZSBzdGFjayBwb2ludGVyIGZvciBsb2NhbHMuCisgIGlmIChuZWVkc1N0YWNrUmVhbGlnbm1lbnQoTUYpKSB7CisgICAgYXNzZXJ0IChoYXNGUChNRikgJiYgImR5bmFtaWMgc3RhY2sgcmVhbGlnbm1lbnQgd2l0aG91dCBhIEZQISIpOworICAgIGlmIChpc0ZpeGVkKSB7CisgICAgICBGcmFtZVJlZyA9IGdldEZyYW1lUmVnaXN0ZXIoTUYpOworICAgICAgT2Zmc2V0ID0gRlBPZmZzZXQ7CisgICAgfQorICAgIHJldHVybiBPZmZzZXQ7CisgIH0KKworICAvLyBJZiB0aGVyZSBpcyBhIGZyYW1lIHBvaW50ZXIsIHVzZSBpdCB3aGVuIHdlIGNhbi4KKyAgaWYgKGhhc0ZQKE1GKSAmJiBBRkktPmhhc1N0YWNrRnJhbWUoKSkgeworICAgIC8vIFVzZSBmcmFtZSBwb2ludGVyIHRvIHJlZmVyZW5jZSBmaXhlZCBvYmplY3RzLiBVc2UgaXQgZm9yIGxvY2FscyBpZgorICAgIC8vIHRoZXJlIGFyZSBWTEFzIChhbmQgdGh1cyB0aGUgU1AgaXNuJ3QgcmVsaWFibGUgYXMgYSBiYXNlKS4KKyAgICBpZiAoaXNGaXhlZCB8fCBNRkktPmhhc1ZhclNpemVkT2JqZWN0cygpKSB7CisgICAgICBGcmFtZVJlZyA9IGdldEZyYW1lUmVnaXN0ZXIoTUYpOworICAgICAgT2Zmc2V0ID0gRlBPZmZzZXQ7CisgICAgfSBlbHNlIGlmIChBRkktPmlzVGh1bWIyRnVuY3Rpb24oKSkgeworICAgICAgLy8gSW4gVGh1bWIyIG1vZGUsIHRoZSBuZWdhdGl2ZSBvZmZzZXQgaXMgdmVyeSBsaW1pdGVkLiBUcnkgdG8gYXZvaWQKKyAgICAgIC8vIG91dCBvZiByYW5nZSByZWZlcmVuY2VzLgorICAgICAgaWYgKEZQT2Zmc2V0ID49IC0yNTUgJiYgRlBPZmZzZXQgPCAwKSB7CisgICAgICAgIEZyYW1lUmVnID0gZ2V0RnJhbWVSZWdpc3RlcihNRik7CisgICAgICAgIE9mZnNldCA9IEZQT2Zmc2V0OworICAgICAgfQorICAgIH0gZWxzZSBpZiAoT2Zmc2V0ID4gKEZQT2Zmc2V0IDwgMCA/IC1GUE9mZnNldCA6IEZQT2Zmc2V0KSkgeworICAgICAgLy8gT3RoZXJ3aXNlLCB1c2UgU1Agb3IgRlAsIHdoaWNoZXZlciBpcyBjbG9zZXIgdG8gdGhlIHN0YWNrIHNsb3QuCisgICAgICBGcmFtZVJlZyA9IGdldEZyYW1lUmVnaXN0ZXIoTUYpOworICAgICAgT2Zmc2V0ID0gRlBPZmZzZXQ7CisgICAgfQorICB9CisgIHJldHVybiBPZmZzZXQ7Cit9CisKK2ludAorQVJNQmFzZVJlZ2lzdGVySW5mbzo6Z2V0RnJhbWVJbmRleE9mZnNldChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRkkpIGNvbnN0IHsKKyAgdW5zaWduZWQgRnJhbWVSZWc7CisgIHJldHVybiBnZXRGcmFtZUluZGV4UmVmZXJlbmNlKE1GLCBGSSwgRnJhbWVSZWcpOworfQorCit1bnNpZ25lZCBBUk1CYXNlUmVnaXN0ZXJJbmZvOjpnZXRFSEV4Y2VwdGlvblJlZ2lzdGVyKCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJXaGF0IGlzIHRoZSBleGNlcHRpb24gcmVnaXN0ZXIiKTsKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIEFSTUJhc2VSZWdpc3RlckluZm86OmdldEVISGFuZGxlclJlZ2lzdGVyKCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJXaGF0IGlzIHRoZSBleGNlcHRpb24gaGFuZGxlciByZWdpc3RlciIpOworICByZXR1cm4gMDsKK30KKworaW50IEFSTUJhc2VSZWdpc3RlckluZm86OmdldER3YXJmUmVnTnVtKHVuc2lnbmVkIFJlZ051bSwgYm9vbCBpc0VIKSBjb25zdCB7CisgIHJldHVybiBBUk1HZW5SZWdpc3RlckluZm86OmdldER3YXJmUmVnTnVtRnVsbChSZWdOdW0sIDApOworfQorCit1bnNpZ25lZCBBUk1CYXNlUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3RlclBhaXJFdmVuKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIHN3aXRjaCAoUmVnKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICAvLyBSZXR1cm4gMCBpZiBlaXRoZXIgcmVnaXN0ZXIgb2YgdGhlIHBhaXIgaXMgYSBzcGVjaWFsIHJlZ2lzdGVyLgorICAvLyBTbyBubyBSMTIsIGV0Yy4KKyAgY2FzZSBBUk06OlIxOgorICAgIHJldHVybiBBUk06OlIwOworICBjYXNlIEFSTTo6UjM6CisgICAgcmV0dXJuIEFSTTo6UjI7CisgIGNhc2UgQVJNOjpSNToKKyAgICByZXR1cm4gQVJNOjpSNDsKKyAgY2FzZSBBUk06OlI3OgorICAgIHJldHVybiBpc1Jlc2VydmVkUmVnKE1GLCBBUk06OlI3KSAgPyAwIDogQVJNOjpSNjsKKyAgY2FzZSBBUk06OlI5OgorICAgIHJldHVybiBpc1Jlc2VydmVkUmVnKE1GLCBBUk06OlI5KSAgPyAwIDpBUk06OlI4OworICBjYXNlIEFSTTo6UjExOgorICAgIHJldHVybiBpc1Jlc2VydmVkUmVnKE1GLCBBUk06OlIxMSkgPyAwIDogQVJNOjpSMTA7CisKKyAgY2FzZSBBUk06OlMxOgorICAgIHJldHVybiBBUk06OlMwOworICBjYXNlIEFSTTo6UzM6CisgICAgcmV0dXJuIEFSTTo6UzI7CisgIGNhc2UgQVJNOjpTNToKKyAgICByZXR1cm4gQVJNOjpTNDsKKyAgY2FzZSBBUk06OlM3OgorICAgIHJldHVybiBBUk06OlM2OworICBjYXNlIEFSTTo6Uzk6CisgICAgcmV0dXJuIEFSTTo6Uzg7CisgIGNhc2UgQVJNOjpTMTE6CisgICAgcmV0dXJuIEFSTTo6UzEwOworICBjYXNlIEFSTTo6UzEzOgorICAgIHJldHVybiBBUk06OlMxMjsKKyAgY2FzZSBBUk06OlMxNToKKyAgICByZXR1cm4gQVJNOjpTMTQ7CisgIGNhc2UgQVJNOjpTMTc6CisgICAgcmV0dXJuIEFSTTo6UzE2OworICBjYXNlIEFSTTo6UzE5OgorICAgIHJldHVybiBBUk06OlMxODsKKyAgY2FzZSBBUk06OlMyMToKKyAgICByZXR1cm4gQVJNOjpTMjA7CisgIGNhc2UgQVJNOjpTMjM6CisgICAgcmV0dXJuIEFSTTo6UzIyOworICBjYXNlIEFSTTo6UzI1OgorICAgIHJldHVybiBBUk06OlMyNDsKKyAgY2FzZSBBUk06OlMyNzoKKyAgICByZXR1cm4gQVJNOjpTMjY7CisgIGNhc2UgQVJNOjpTMjk6CisgICAgcmV0dXJuIEFSTTo6UzI4OworICBjYXNlIEFSTTo6UzMxOgorICAgIHJldHVybiBBUk06OlMzMDsKKworICBjYXNlIEFSTTo6RDE6CisgICAgcmV0dXJuIEFSTTo6RDA7CisgIGNhc2UgQVJNOjpEMzoKKyAgICByZXR1cm4gQVJNOjpEMjsKKyAgY2FzZSBBUk06OkQ1OgorICAgIHJldHVybiBBUk06OkQ0OworICBjYXNlIEFSTTo6RDc6CisgICAgcmV0dXJuIEFSTTo6RDY7CisgIGNhc2UgQVJNOjpEOToKKyAgICByZXR1cm4gQVJNOjpEODsKKyAgY2FzZSBBUk06OkQxMToKKyAgICByZXR1cm4gQVJNOjpEMTA7CisgIGNhc2UgQVJNOjpEMTM6CisgICAgcmV0dXJuIEFSTTo6RDEyOworICBjYXNlIEFSTTo6RDE1OgorICAgIHJldHVybiBBUk06OkQxNDsKKyAgY2FzZSBBUk06OkQxNzoKKyAgICByZXR1cm4gQVJNOjpEMTY7CisgIGNhc2UgQVJNOjpEMTk6CisgICAgcmV0dXJuIEFSTTo6RDE4OworICBjYXNlIEFSTTo6RDIxOgorICAgIHJldHVybiBBUk06OkQyMDsKKyAgY2FzZSBBUk06OkQyMzoKKyAgICByZXR1cm4gQVJNOjpEMjI7CisgIGNhc2UgQVJNOjpEMjU6CisgICAgcmV0dXJuIEFSTTo6RDI0OworICBjYXNlIEFSTTo6RDI3OgorICAgIHJldHVybiBBUk06OkQyNjsKKyAgY2FzZSBBUk06OkQyOToKKyAgICByZXR1cm4gQVJNOjpEMjg7CisgIGNhc2UgQVJNOjpEMzE6CisgICAgcmV0dXJuIEFSTTo6RDMwOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIEFSTUJhc2VSZWdpc3RlckluZm86OmdldFJlZ2lzdGVyUGFpck9kZCh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIHN3aXRjaCAoUmVnKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICAvLyBSZXR1cm4gMCBpZiBlaXRoZXIgcmVnaXN0ZXIgb2YgdGhlIHBhaXIgaXMgYSBzcGVjaWFsIHJlZ2lzdGVyLgorICAvLyBTbyBubyBSMTIsIGV0Yy4KKyAgY2FzZSBBUk06OlIwOgorICAgIHJldHVybiBBUk06OlIxOworICBjYXNlIEFSTTo6UjI6CisgICAgcmV0dXJuIEFSTTo6UjM7CisgIGNhc2UgQVJNOjpSNDoKKyAgICByZXR1cm4gQVJNOjpSNTsKKyAgY2FzZSBBUk06OlI2OgorICAgIHJldHVybiBpc1Jlc2VydmVkUmVnKE1GLCBBUk06OlI3KSAgPyAwIDogQVJNOjpSNzsKKyAgY2FzZSBBUk06OlI4OgorICAgIHJldHVybiBpc1Jlc2VydmVkUmVnKE1GLCBBUk06OlI5KSAgPyAwIDpBUk06OlI5OworICBjYXNlIEFSTTo6UjEwOgorICAgIHJldHVybiBpc1Jlc2VydmVkUmVnKE1GLCBBUk06OlIxMSkgPyAwIDogQVJNOjpSMTE7CisKKyAgY2FzZSBBUk06OlMwOgorICAgIHJldHVybiBBUk06OlMxOworICBjYXNlIEFSTTo6UzI6CisgICAgcmV0dXJuIEFSTTo6UzM7CisgIGNhc2UgQVJNOjpTNDoKKyAgICByZXR1cm4gQVJNOjpTNTsKKyAgY2FzZSBBUk06OlM2OgorICAgIHJldHVybiBBUk06OlM3OworICBjYXNlIEFSTTo6Uzg6CisgICAgcmV0dXJuIEFSTTo6Uzk7CisgIGNhc2UgQVJNOjpTMTA6CisgICAgcmV0dXJuIEFSTTo6UzExOworICBjYXNlIEFSTTo6UzEyOgorICAgIHJldHVybiBBUk06OlMxMzsKKyAgY2FzZSBBUk06OlMxNDoKKyAgICByZXR1cm4gQVJNOjpTMTU7CisgIGNhc2UgQVJNOjpTMTY6CisgICAgcmV0dXJuIEFSTTo6UzE3OworICBjYXNlIEFSTTo6UzE4OgorICAgIHJldHVybiBBUk06OlMxOTsKKyAgY2FzZSBBUk06OlMyMDoKKyAgICByZXR1cm4gQVJNOjpTMjE7CisgIGNhc2UgQVJNOjpTMjI6CisgICAgcmV0dXJuIEFSTTo6UzIzOworICBjYXNlIEFSTTo6UzI0OgorICAgIHJldHVybiBBUk06OlMyNTsKKyAgY2FzZSBBUk06OlMyNjoKKyAgICByZXR1cm4gQVJNOjpTMjc7CisgIGNhc2UgQVJNOjpTMjg6CisgICAgcmV0dXJuIEFSTTo6UzI5OworICBjYXNlIEFSTTo6UzMwOgorICAgIHJldHVybiBBUk06OlMzMTsKKworICBjYXNlIEFSTTo6RDA6CisgICAgcmV0dXJuIEFSTTo6RDE7CisgIGNhc2UgQVJNOjpEMjoKKyAgICByZXR1cm4gQVJNOjpEMzsKKyAgY2FzZSBBUk06OkQ0OgorICAgIHJldHVybiBBUk06OkQ1OworICBjYXNlIEFSTTo6RDY6CisgICAgcmV0dXJuIEFSTTo6RDc7CisgIGNhc2UgQVJNOjpEODoKKyAgICByZXR1cm4gQVJNOjpEOTsKKyAgY2FzZSBBUk06OkQxMDoKKyAgICByZXR1cm4gQVJNOjpEMTE7CisgIGNhc2UgQVJNOjpEMTI6CisgICAgcmV0dXJuIEFSTTo6RDEzOworICBjYXNlIEFSTTo6RDE0OgorICAgIHJldHVybiBBUk06OkQxNTsKKyAgY2FzZSBBUk06OkQxNjoKKyAgICByZXR1cm4gQVJNOjpEMTc7CisgIGNhc2UgQVJNOjpEMTg6CisgICAgcmV0dXJuIEFSTTo6RDE5OworICBjYXNlIEFSTTo6RDIwOgorICAgIHJldHVybiBBUk06OkQyMTsKKyAgY2FzZSBBUk06OkQyMjoKKyAgICByZXR1cm4gQVJNOjpEMjM7CisgIGNhc2UgQVJNOjpEMjQ6CisgICAgcmV0dXJuIEFSTTo6RDI1OworICBjYXNlIEFSTTo6RDI2OgorICAgIHJldHVybiBBUk06OkQyNzsKKyAgY2FzZSBBUk06OkQyODoKKyAgICByZXR1cm4gQVJNOjpEMjk7CisgIGNhc2UgQVJNOjpEMzA6CisgICAgcmV0dXJuIEFSTTo6RDMxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBlbWl0TG9hZENvbnN0UG9vbCAtIEVtaXRzIGEgbG9hZCBmcm9tIGNvbnN0cG9vbCB0byBtYXRlcmlhbGl6ZSB0aGUKKy8vLyBzcGVjaWZpZWQgaW1tZWRpYXRlLgordm9pZCBBUk1CYXNlUmVnaXN0ZXJJbmZvOjoKK2VtaXRMb2FkQ29uc3RQb29sKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFN1YklkeCwgaW50IFZhbCwKKyAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByZWRSZWcpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgIE1hY2hpbmVDb25zdGFudFBvb2wgKkNvbnN0YW50UG9vbCA9IE1GLmdldENvbnN0YW50UG9vbCgpOworICBjb25zdCBDb25zdGFudCAqQyA9CisgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShNRi5nZXRGdW5jdGlvbigpLT5nZXRDb250ZXh0KCkpLCBWYWwpOworICB1bnNpZ25lZCBJZHggPSBDb25zdGFudFBvb2wtPmdldENvbnN0YW50UG9vbEluZGV4KEMsIDQpOworCisgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBUk06OkxEUmNwKSkKKyAgICAuYWRkUmVnKERlc3RSZWcsIGdldERlZlJlZ1N0YXRlKHRydWUpLCBTdWJJZHgpCisgICAgLmFkZENvbnN0YW50UG9vbEluZGV4KElkeCkKKyAgICAuYWRkUmVnKDApLmFkZEltbSgwKS5hZGRJbW0oUHJlZCkuYWRkUmVnKFByZWRSZWcpOworfQorCitib29sIEFSTUJhc2VSZWdpc3RlckluZm86OgorcmVxdWlyZXNSZWdpc3RlclNjYXZlbmdpbmcoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBUk1CYXNlUmVnaXN0ZXJJbmZvOjoKK3JlcXVpcmVzRnJhbWVJbmRleFNjYXZlbmdpbmcoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gaGFzUmVzZXJ2ZWRDYWxsRnJhbWUgLSBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgd2hlbiBhIGZyYW1lIHBvaW50ZXIgaXMKKy8vIG5vdCByZXF1aXJlZCwgd2UgcmVzZXJ2ZSBhcmd1bWVudCBzcGFjZSBmb3IgY2FsbCBzaXRlcyBpbiB0aGUgZnVuY3Rpb24KKy8vIGltbWVkaWF0ZWx5IG9uIGVudHJ5IHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiBUaGlzIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yCisvLyBhZGQvc3ViIHNwIGJyYWNrZXRzIGFyb3VuZCBjYWxsIHNpdGVzLiBSZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgZnJhbWUgaXMKKy8vIGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIHN0YWNrIGZyYW1lLgorYm9vbCBBUk1CYXNlUmVnaXN0ZXJJbmZvOjoKK2hhc1Jlc2VydmVkQ2FsbEZyYW1lKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqRkZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIHVuc2lnbmVkIENGU2l6ZSA9IEZGSS0+Z2V0TWF4Q2FsbEZyYW1lU2l6ZSgpOworICAvLyBJdCdzIG5vdCBhbHdheXMgYSBnb29kIGlkZWEgdG8gaW5jbHVkZSB0aGUgY2FsbCBmcmFtZSBhcyBwYXJ0IG9mIHRoZQorICAvLyBzdGFjayBmcmFtZS4gQVJNIChlc3BlY2lhbGx5IFRodW1iKSBoYXMgc21hbGwgaW1tZWRpYXRlIG9mZnNldCB0bworICAvLyBhZGRyZXNzIHRoZSBzdGFjayBmcmFtZS4gU28gYSBsYXJnZSBjYWxsIGZyYW1lIGNhbiBjYXVzZSBwb29yIGNvZGVnZW4KKyAgLy8gYW5kIG1heSBldmVuIG1ha2VzIGl0IGltcG9zc2libGUgdG8gc2NhdmVuZ2UgYSByZWdpc3Rlci4KKyAgaWYgKENGU2l6ZSA+PSAoKDEgPDwgMTIpIC0gMSkgLyAyKSAgLy8gSGFsZiBvZiBpbW0xMgorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gIU1GLmdldEZyYW1lSW5mbygpLT5oYXNWYXJTaXplZE9iamVjdHMoKTsKK30KKworLy8gY2FuU2ltcGxpZnlDYWxsRnJhbWVQc2V1ZG9zIC0gSWYgdGhlcmUgaXMgYSByZXNlcnZlZCBjYWxsIGZyYW1lLCB0aGUKKy8vIGNhbGwgZnJhbWUgcHNldWRvcyBjYW4gYmUgc2ltcGxpZmllZC4gVW5saWtlIG1vc3QgdGFyZ2V0cywgaGF2aW5nIGEgRlAKKy8vIGlzIG5vdCBzdWZmaWNpZW50IGhlcmUgc2luY2Ugd2Ugc3RpbGwgbWF5IHJlZmVyZW5jZSBzb21lIG9iamVjdHMgdmlhIFNQCisvLyBldmVuIHdoZW4gRlAgaXMgYXZhaWxhYmxlIGluIFRodW1iMiBtb2RlLgorYm9vbCBBUk1CYXNlUmVnaXN0ZXJJbmZvOjoKK2NhblNpbXBsaWZ5Q2FsbEZyYW1lUHNldWRvcyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIHJldHVybiBoYXNSZXNlcnZlZENhbGxGcmFtZShNRikgfHwgTUYuZ2V0RnJhbWVJbmZvKCktPmhhc1ZhclNpemVkT2JqZWN0cygpOworfQorCitzdGF0aWMgdm9pZAorZW1pdFNQVXBkYXRlKGJvb2wgaXNBUk0sCisgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLAorICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZUSUksCisgICAgICAgICAgICAgaW50IE51bUJ5dGVzLAorICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCA9IEFSTUNDOjpBTCwgdW5zaWduZWQgUHJlZFJlZyA9IDApIHsKKyAgaWYgKGlzQVJNKQorICAgIGVtaXRBUk1SZWdQbHVzSW1tZWRpYXRlKE1CQiwgTUJCSSwgZGwsIEFSTTo6U1AsIEFSTTo6U1AsIE51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQsIFByZWRSZWcsIFRJSSk7CisgIGVsc2UKKyAgICBlbWl0VDJSZWdQbHVzSW1tZWRpYXRlKE1CQiwgTUJCSSwgZGwsIEFSTTo6U1AsIEFSTTo6U1AsIE51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCwgUHJlZFJlZywgVElJKTsKK30KKworCit2b2lkIEFSTUJhc2VSZWdpc3RlckluZm86OgorZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdCB7CisgIGlmICghaGFzUmVzZXJ2ZWRDYWxsRnJhbWUoTUYpKSB7CisgICAgLy8gSWYgd2UgaGF2ZSBhbGxvY2EsIGNvbnZlcnQgYXMgZm9sbG93czoKKyAgICAvLyBBREpDQUxMU1RBQ0tET1dOIC0+IHN1Yiwgc3AsIHNwLCBhbW91bnQKKyAgICAvLyBBREpDQUxMU1RBQ0tVUCAgIC0+IGFkZCwgc3AsIHNwLCBhbW91bnQKKyAgICBNYWNoaW5lSW5zdHIgKk9sZCA9IEk7CisgICAgRGVidWdMb2MgZGwgPSBPbGQtPmdldERlYnVnTG9jKCk7CisgICAgdW5zaWduZWQgQW1vdW50ID0gT2xkLT5nZXRPcGVyYW5kKDApLmdldEltbSgpOworICAgIGlmIChBbW91bnQgIT0gMCkgeworICAgICAgLy8gV2UgbmVlZCB0byBrZWVwIHRoZSBzdGFjayBhbGlnbmVkIHByb3Blcmx5LiAgVG8gZG8gdGhpcywgd2Ugcm91bmQgdGhlCisgICAgICAvLyBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGZvciB0aGUgb3V0Z29pbmcgYXJndW1lbnRzIHVwIHRvIHRoZSBuZXh0CisgICAgICAvLyBhbGlnbm1lbnQgYm91bmRhcnkuCisgICAgICB1bnNpZ25lZCBBbGlnbiA9IE1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja0FsaWdubWVudCgpOworICAgICAgQW1vdW50ID0gKEFtb3VudCtBbGlnbi0xKS9BbGlnbipBbGlnbjsKKworICAgICAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgICAgIGFzc2VydCghQUZJLT5pc1RodW1iMU9ubHlGdW5jdGlvbigpICYmCisgICAgICAgICAgICAgIlRoaXMgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIgZG9lcyBub3Qgc3VwcG9ydCBUaHVtYjEhIik7CisgICAgICBib29sIGlzQVJNID0gIUFGSS0+aXNUaHVtYkZ1bmN0aW9uKCk7CisKKyAgICAgIC8vIFJlcGxhY2UgdGhlIHBzZXVkbyBpbnN0cnVjdGlvbiB3aXRoIGEgbmV3IGluc3RydWN0aW9uLi4uCisgICAgICB1bnNpZ25lZCBPcGMgPSBPbGQtPmdldE9wY29kZSgpOworICAgICAgaW50IFBJZHggPSBPbGQtPmZpbmRGaXJzdFByZWRPcGVyYW5kSWR4KCk7CisgICAgICBBUk1DQzo6Q29uZENvZGVzIFByZWQgPSAoUElkeCA9PSAtMSkKKyAgICAgICAgPyBBUk1DQzo6QUwgOiAoQVJNQ0M6OkNvbmRDb2RlcylPbGQtPmdldE9wZXJhbmQoUElkeCkuZ2V0SW1tKCk7CisgICAgICBpZiAoT3BjID09IEFSTTo6QURKQ0FMTFNUQUNLRE9XTiB8fCBPcGMgPT0gQVJNOjp0QURKQ0FMTFNUQUNLRE9XTikgeworICAgICAgICAvLyBOb3RlOiBQcmVkUmVnIGlzIG9wZXJhbmQgMiBmb3IgQURKQ0FMTFNUQUNLRE9XTi4KKyAgICAgICAgdW5zaWduZWQgUHJlZFJlZyA9IE9sZC0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKTsKKyAgICAgICAgZW1pdFNQVXBkYXRlKGlzQVJNLCBNQkIsIEksIGRsLCBUSUksIC1BbW91bnQsIFByZWQsIFByZWRSZWcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm90ZTogUHJlZFJlZyBpcyBvcGVyYW5kIDMgZm9yIEFESkNBTExTVEFDS1VQLgorICAgICAgICB1bnNpZ25lZCBQcmVkUmVnID0gT2xkLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpOworICAgICAgICBhc3NlcnQoT3BjID09IEFSTTo6QURKQ0FMTFNUQUNLVVAgfHwgT3BjID09IEFSTTo6dEFESkNBTExTVEFDS1VQKTsKKyAgICAgICAgZW1pdFNQVXBkYXRlKGlzQVJNLCBNQkIsIEksIGRsLCBUSUksIEFtb3VudCwgUHJlZCwgUHJlZFJlZyk7CisgICAgICB9CisgICAgfQorICB9CisgIE1CQi5lcmFzZShJKTsKK30KKwordW5zaWduZWQKK0FSTUJhc2VSZWdpc3RlckluZm86OmVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGosIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMpIGNvbnN0IHsKKyAgdW5zaWduZWQgaSA9IDA7CisgIE1hY2hpbmVJbnN0ciAmTUkgPSAqSUk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIgPSAqTUkuZ2V0UGFyZW50KCk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICBhc3NlcnQoIUFGSS0+aXNUaHVtYjFPbmx5RnVuY3Rpb24oKSAmJgorICAgICAgICAgIlRoaXMgZWxpbWluYXRlRnJhbWVJbmRleCBkb2VzIG5vdCBzdXBwb3J0IFRodW1iMSEiKTsKKworICB3aGlsZSAoIU1JLmdldE9wZXJhbmQoaSkuaXNGSSgpKSB7CisgICAgKytpOworICAgIGFzc2VydChpIDwgTUkuZ2V0TnVtT3BlcmFuZHMoKSAmJiAiSW5zdHIgZG9lc24ndCBoYXZlIEZyYW1lSW5kZXggb3BlcmFuZCEiKTsKKyAgfQorCisgIGludCBGcmFtZUluZGV4ID0gTUkuZ2V0T3BlcmFuZChpKS5nZXRJbmRleCgpOworICB1bnNpZ25lZCBGcmFtZVJlZzsKKworICBpbnQgT2Zmc2V0ID0gUmVzb2x2ZUZyYW1lSW5kZXhSZWZlcmVuY2UoTUYsIEZyYW1lSW5kZXgsIEZyYW1lUmVnLCBTUEFkaik7CisKKyAgLy8gU3BlY2lhbCBoYW5kbGluZyBvZiBkYmdfdmFsdWUgaW5zdHJ1Y3Rpb25zLgorICBpZiAoTUkuaXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICBNSS5nZXRPcGVyYW5kKGkpLiAgQ2hhbmdlVG9SZWdpc3RlcihGcmFtZVJlZywgZmFsc2UgLyppc0RlZiovKTsKKyAgICBNSS5nZXRPcGVyYW5kKGkrMSkuQ2hhbmdlVG9JbW1lZGlhdGUoT2Zmc2V0KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIE1vZGlmeSBNSSBhcyBuZWNlc3NhcnkgdG8gaGFuZGxlIGFzIG11Y2ggb2YgJ09mZnNldCcgYXMgcG9zc2libGUKKyAgYm9vbCBEb25lID0gZmFsc2U7CisgIGlmICghQUZJLT5pc1RodW1iRnVuY3Rpb24oKSkKKyAgICBEb25lID0gcmV3cml0ZUFSTUZyYW1lSW5kZXgoTUksIGksIEZyYW1lUmVnLCBPZmZzZXQsIFRJSSk7CisgIGVsc2UgeworICAgIGFzc2VydChBRkktPmlzVGh1bWIyRnVuY3Rpb24oKSk7CisgICAgRG9uZSA9IHJld3JpdGVUMkZyYW1lSW5kZXgoTUksIGksIEZyYW1lUmVnLCBPZmZzZXQsIFRJSSk7CisgIH0KKyAgaWYgKERvbmUpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gSWYgd2UgZ2V0IGhlcmUsIHRoZSBpbW1lZGlhdGUgZG9lc24ndCBmaXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICBXZSBmb2xkZWQKKyAgLy8gYXMgbXVjaCBhcyBwb3NzaWJsZSBhYm92ZSwgaGFuZGxlIHRoZSByZXN0LCBwcm92aWRpbmcgYSByZWdpc3RlciB0aGF0IGlzCisgIC8vIFNQK0xhcmdlSW1tLgorICBhc3NlcnQoKE9mZnNldCB8fAorICAgICAgICAgIChNSS5nZXREZXNjKCkuVFNGbGFncyAmIEFSTUlJOjpBZGRyTW9kZU1hc2spID09IEFSTUlJOjpBZGRyTW9kZTQgfHwKKyAgICAgICAgICAoTUkuZ2V0RGVzYygpLlRTRmxhZ3MgJiBBUk1JSTo6QWRkck1vZGVNYXNrKSA9PSBBUk1JSTo6QWRkck1vZGU2KSAmJgorICAgICAgICAgIlRoaXMgY29kZSBpc24ndCBuZWVkZWQgaWYgb2Zmc2V0IGFscmVhZHkgaGFuZGxlZCEiKTsKKworICB1bnNpZ25lZCBTY3JhdGNoUmVnID0gMDsKKyAgaW50IFBJZHggPSBNSS5maW5kRmlyc3RQcmVkT3BlcmFuZElkeCgpOworICBBUk1DQzo6Q29uZENvZGVzIFByZWQgPSAoUElkeCA9PSAtMSkKKyAgICA/IEFSTUNDOjpBTCA6IChBUk1DQzo6Q29uZENvZGVzKU1JLmdldE9wZXJhbmQoUElkeCkuZ2V0SW1tKCk7CisgIHVuc2lnbmVkIFByZWRSZWcgPSAoUElkeCA9PSAtMSkgPyAwIDogTUkuZ2V0T3BlcmFuZChQSWR4KzEpLmdldFJlZygpOworICBpZiAoT2Zmc2V0ID09IDApCisgICAgLy8gTXVzdCBiZSBhZGRybW9kZTQvNi4KKyAgICBNSS5nZXRPcGVyYW5kKGkpLkNoYW5nZVRvUmVnaXN0ZXIoRnJhbWVSZWcsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICBlbHNlIHsKKyAgICBTY3JhdGNoUmVnID0gTUYuZ2V0UmVnSW5mbygpLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihBUk06OkdQUlJlZ2lzdGVyQ2xhc3MpOworICAgIGlmIChWYWx1ZSkgeworICAgICAgVmFsdWUtPmZpcnN0ID0gRnJhbWVSZWc7IC8vIHVzZSB0aGUgZnJhbWUgcmVnaXN0ZXIgYXMgYSBraW5kIGluZGljYXRvcgorICAgICAgVmFsdWUtPnNlY29uZCA9IE9mZnNldDsKKyAgICB9CisgICAgaWYgKCFBRkktPmlzVGh1bWJGdW5jdGlvbigpKQorICAgICAgZW1pdEFSTVJlZ1BsdXNJbW1lZGlhdGUoTUJCLCBJSSwgTUkuZ2V0RGVidWdMb2MoKSwgU2NyYXRjaFJlZywgRnJhbWVSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsIFByZWQsIFByZWRSZWcsIFRJSSk7CisgICAgZWxzZSB7CisgICAgICBhc3NlcnQoQUZJLT5pc1RodW1iMkZ1bmN0aW9uKCkpOworICAgICAgZW1pdFQyUmVnUGx1c0ltbWVkaWF0ZShNQkIsIElJLCBNSS5nZXREZWJ1Z0xvYygpLCBTY3JhdGNoUmVnLCBGcmFtZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LCBQcmVkLCBQcmVkUmVnLCBUSUkpOworICAgIH0KKyAgICBNSS5nZXRPcGVyYW5kKGkpLkNoYW5nZVRvUmVnaXN0ZXIoU2NyYXRjaFJlZywgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICBpZiAoIVJldXNlRnJhbWVJbmRleFZhbHMpCisgICAgICBTY3JhdGNoUmVnID0gMDsKKyAgfQorICByZXR1cm4gU2NyYXRjaFJlZzsKK30KKworLy8vIE1vdmUgaXRlcmF0b3IgcGFzdCB0aGUgbmV4dCBidW5jaCBvZiBjYWxsZWUgc2F2ZSBsb2FkIC8gc3RvcmUgb3BzIGZvcgorLy8vIHRoZSBwYXJ0aWN1bGFyIHNwaWxsIGFyZWEgKDE6IGludGVnZXIgYXJlYSAxLCAyOiBpbnRlZ2VyIGFyZWEgMiwKKy8vLyAzOiBmcCBhcmVhLCAwOiBkb24ndCBjYXJlKS4KK3N0YXRpYyB2b2lkIG1vdmVQYXN0Q1NMb2FkU3RvcmVPcHMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT3BjMSwgaW50IE9wYzIsIHVuc2lnbmVkIEFyZWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAmU1RJKSB7CisgIHdoaWxlIChNQkJJICE9IE1CQi5lbmQoKSAmJgorICAgICAgICAgKChNQkJJLT5nZXRPcGNvZGUoKSA9PSBPcGMxKSB8fCAoTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gT3BjMikpICYmCisgICAgICAgICBNQkJJLT5nZXRPcGVyYW5kKDEpLmlzRkkoKSkgeworICAgIGlmIChBcmVhICE9IDApIHsKKyAgICAgIGJvb2wgRG9uZSA9IGZhbHNlOworICAgICAgdW5zaWduZWQgQ2F0ZWdvcnkgPSAwOworICAgICAgc3dpdGNoIChNQkJJLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKSB7CisgICAgICBjYXNlIEFSTTo6UjQ6ICBjYXNlIEFSTTo6UjU6ICBjYXNlIEFSTTo6UjY6IGNhc2UgQVJNOjpSNzoKKyAgICAgIGNhc2UgQVJNOjpMUjoKKyAgICAgICAgQ2F0ZWdvcnkgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVJNOjpSODogIGNhc2UgQVJNOjpSOTogIGNhc2UgQVJNOjpSMTA6IGNhc2UgQVJNOjpSMTE6CisgICAgICAgIENhdGVnb3J5ID0gU1RJLmlzVGFyZ2V0RGFyd2luKCkgPyAyIDogMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFSTTo6RDg6ICBjYXNlIEFSTTo6RDk6ICBjYXNlIEFSTTo6RDEwOiBjYXNlIEFSTTo6RDExOgorICAgICAgY2FzZSBBUk06OkQxMjogY2FzZSBBUk06OkQxMzogY2FzZSBBUk06OkQxNDogY2FzZSBBUk06OkQxNToKKyAgICAgICAgQ2F0ZWdvcnkgPSAzOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIERvbmUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChEb25lIHx8IENhdGVnb3J5ICE9IEFyZWEpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgICsrTUJCSTsKKyAgfQorfQorCit2b2lkIEFSTUJhc2VSZWdpc3RlckluZm86OgorZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9IE1GLmZyb250KCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gTUJCLmJlZ2luKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgYXNzZXJ0KCFBRkktPmlzVGh1bWIxT25seUZ1bmN0aW9uKCkgJiYKKyAgICAgICAgICJUaGlzIGVtaXRQcm9sb2d1ZSBkb2VzIG5vdCBzdXBwb3J0IFRodW1iMSEiKTsKKyAgYm9vbCBpc0FSTSA9ICFBRkktPmlzVGh1bWJGdW5jdGlvbigpOworICB1bnNpZ25lZCBWQVJlZ1NhdmVTaXplID0gQUZJLT5nZXRWYXJBcmdzUmVnU2F2ZVNpemUoKTsKKyAgdW5zaWduZWQgTnVtQnl0ZXMgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworICBjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZDU0kgPSBNRkktPmdldENhbGxlZVNhdmVkSW5mbygpOworICBEZWJ1Z0xvYyBkbCA9IE1CQkkgIT0gTUJCLmVuZCgpID8gTUJCSS0+Z2V0RGVidWdMb2MoKSA6IERlYnVnTG9jKCk7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBzaXplcyBvZiBlYWNoIGNhbGxlZS1zYXZlIHNwaWxsIGFyZWFzIGFuZCByZWNvcmQgd2hpY2ggZnJhbWUKKyAgLy8gYmVsb25ncyB0byB3aGljaCBjYWxsZWUtc2F2ZSBzcGlsbCBhcmVhcy4KKyAgdW5zaWduZWQgR1BSQ1MxU2l6ZSA9IDAsIEdQUkNTMlNpemUgPSAwLCBEUFJDU1NpemUgPSAwOworICBpbnQgRnJhbWVQdHJTcGlsbEZJID0gMDsKKworICAvLyBBbGxvY2F0ZSB0aGUgdmFyYXJnIHJlZ2lzdGVyIHNhdmUgYXJlYS4gVGhpcyBpcyBub3QgY291bnRlZCBpbiBOdW1CeXRlcy4KKyAgaWYgKFZBUmVnU2F2ZVNpemUpCisgICAgZW1pdFNQVXBkYXRlKGlzQVJNLCBNQkIsIE1CQkksIGRsLCBUSUksIC1WQVJlZ1NhdmVTaXplKTsKKworICBpZiAoIUFGSS0+aGFzU3RhY2tGcmFtZSgpKSB7CisgICAgaWYgKE51bUJ5dGVzICE9IDApCisgICAgICBlbWl0U1BVcGRhdGUoaXNBUk0sIE1CQiwgTUJCSSwgZGwsIFRJSSwgLU51bUJ5dGVzKTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ1NJLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaV0uZ2V0UmVnKCk7CisgICAgaW50IEZJID0gQ1NJW2ldLmdldEZyYW1lSWR4KCk7CisgICAgc3dpdGNoIChSZWcpIHsKKyAgICBjYXNlIEFSTTo6UjQ6CisgICAgY2FzZSBBUk06OlI1OgorICAgIGNhc2UgQVJNOjpSNjoKKyAgICBjYXNlIEFSTTo6Ujc6CisgICAgY2FzZSBBUk06OkxSOgorICAgICAgaWYgKFJlZyA9PSBGcmFtZVB0cikKKyAgICAgICAgRnJhbWVQdHJTcGlsbEZJID0gRkk7CisgICAgICBBRkktPmFkZEdQUkNhbGxlZVNhdmVkQXJlYTFGcmFtZShGSSk7CisgICAgICBHUFJDUzFTaXplICs9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSTTo6Ujg6CisgICAgY2FzZSBBUk06OlI5OgorICAgIGNhc2UgQVJNOjpSMTA6CisgICAgY2FzZSBBUk06OlIxMToKKyAgICAgIGlmIChSZWcgPT0gRnJhbWVQdHIpCisgICAgICAgIEZyYW1lUHRyU3BpbGxGSSA9IEZJOworICAgICAgaWYgKFNUSS5pc1RhcmdldERhcndpbigpKSB7CisgICAgICAgIEFGSS0+YWRkR1BSQ2FsbGVlU2F2ZWRBcmVhMkZyYW1lKEZJKTsKKyAgICAgICAgR1BSQ1MyU2l6ZSArPSA0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUZJLT5hZGRHUFJDYWxsZWVTYXZlZEFyZWExRnJhbWUoRkkpOworICAgICAgICBHUFJDUzFTaXplICs9IDQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgQUZJLT5hZGREUFJDYWxsZWVTYXZlZEFyZWFGcmFtZShGSSk7CisgICAgICBEUFJDU1NpemUgKz0gODsKKyAgICB9CisgIH0KKworICAvLyBCdWlsZCB0aGUgbmV3IFNVQnJpIHRvIGFkanVzdCBTUCBmb3IgaW50ZWdlciBjYWxsZWUtc2F2ZSBzcGlsbCBhcmVhIDEuCisgIGVtaXRTUFVwZGF0ZShpc0FSTSwgTUJCLCBNQkJJLCBkbCwgVElJLCAtR1BSQ1MxU2l6ZSk7CisgIG1vdmVQYXN0Q1NMb2FkU3RvcmVPcHMoTUJCLCBNQkJJLCBBUk06OlNUUiwgQVJNOjp0MlNUUmkxMiwgMSwgU1RJKTsKKworICAvLyBTZXQgRlAgdG8gcG9pbnQgdG8gdGhlIHN0YWNrIHNsb3QgdGhhdCBjb250YWlucyB0aGUgcHJldmlvdXMgRlAuCisgIC8vIEZvciBEYXJ3aW4sIEZQIGlzIFI3LCB3aGljaCBoYXMgbm93IGJlZW4gc3RvcmVkIGluIHNwaWxsIGFyZWEgMS4KKyAgLy8gT3RoZXJ3aXNlLCBpZiB0aGlzIGlzIG5vdCBEYXJ3aW4sIGFsbCB0aGUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyBnbworICAvLyBpbnRvIHNwaWxsIGFyZWEgMSwgaW5jbHVkaW5nIHRoZSBGUCBpbiBSMTEuICBJbiBlaXRoZXIgY2FzZSwgaXQgaXMKKyAgLy8gbm93IHNhZmUgdG8gZW1pdCB0aGlzIGFzc2lnbm1lbnQuCisgIGJvb2wgSGFzRlAgPSBoYXNGUChNRik7CisgIGlmIChIYXNGUCkgeworICAgIHVuc2lnbmVkIEFERHJpT3BjID0gIUFGSS0+aXNUaHVtYkZ1bmN0aW9uKCkgPyBBUk06OkFERHJpIDogQVJNOjp0MkFERHJpOworICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0KKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBRERyaU9wYyksIEZyYW1lUHRyKQorICAgICAgLmFkZEZyYW1lSW5kZXgoRnJhbWVQdHJTcGlsbEZJKS5hZGRJbW0oMCk7CisgICAgQWRkRGVmYXVsdENDKEFkZERlZmF1bHRQcmVkKE1JQikpOworICB9CisKKyAgLy8gQnVpbGQgdGhlIG5ldyBTVUJyaSB0byBhZGp1c3QgU1AgZm9yIGludGVnZXIgY2FsbGVlLXNhdmUgc3BpbGwgYXJlYSAyLgorICBlbWl0U1BVcGRhdGUoaXNBUk0sIE1CQiwgTUJCSSwgZGwsIFRJSSwgLUdQUkNTMlNpemUpOworCisgIC8vIEJ1aWxkIHRoZSBuZXcgU1VCcmkgdG8gYWRqdXN0IFNQIGZvciBGUCBjYWxsZWUtc2F2ZSBzcGlsbCBhcmVhLgorICBtb3ZlUGFzdENTTG9hZFN0b3JlT3BzKE1CQiwgTUJCSSwgQVJNOjpTVFIsIEFSTTo6dDJTVFJpMTIsIDIsIFNUSSk7CisgIGVtaXRTUFVwZGF0ZShpc0FSTSwgTUJCLCBNQkJJLCBkbCwgVElJLCAtRFBSQ1NTaXplKTsKKworICAvLyBEZXRlcm1pbmUgc3RhcnRpbmcgb2Zmc2V0cyBvZiBzcGlsbCBhcmVhcy4KKyAgdW5zaWduZWQgRFBSQ1NPZmZzZXQgID0gTnVtQnl0ZXMgLSAoR1BSQ1MxU2l6ZSArIEdQUkNTMlNpemUgKyBEUFJDU1NpemUpOworICB1bnNpZ25lZCBHUFJDUzJPZmZzZXQgPSBEUFJDU09mZnNldCArIERQUkNTU2l6ZTsKKyAgdW5zaWduZWQgR1BSQ1MxT2Zmc2V0ID0gR1BSQ1MyT2Zmc2V0ICsgR1BSQ1MyU2l6ZTsKKyAgaWYgKEhhc0ZQKQorICAgIEFGSS0+c2V0RnJhbWVQdHJTcGlsbE9mZnNldChNRkktPmdldE9iamVjdE9mZnNldChGcmFtZVB0clNwaWxsRkkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQnl0ZXMpOworICBBRkktPnNldEdQUkNhbGxlZVNhdmVkQXJlYTFPZmZzZXQoR1BSQ1MxT2Zmc2V0KTsKKyAgQUZJLT5zZXRHUFJDYWxsZWVTYXZlZEFyZWEyT2Zmc2V0KEdQUkNTMk9mZnNldCk7CisgIEFGSS0+c2V0RFBSQ2FsbGVlU2F2ZWRBcmVhT2Zmc2V0KERQUkNTT2Zmc2V0KTsKKworICBtb3ZlUGFzdENTTG9hZFN0b3JlT3BzKE1CQiwgTUJCSSwgQVJNOjpWU1RSRCwgMCwgMywgU1RJKTsKKyAgTnVtQnl0ZXMgPSBEUFJDU09mZnNldDsKKyAgaWYgKE51bUJ5dGVzKSB7CisgICAgLy8gQWRqdXN0IFNQIGFmdGVyIGFsbCB0aGUgY2FsbGVlLXNhdmUgc3BpbGxzLgorICAgIGVtaXRTUFVwZGF0ZShpc0FSTSwgTUJCLCBNQkJJLCBkbCwgVElJLCAtTnVtQnl0ZXMpOworICAgIGlmIChIYXNGUCkKKyAgICAgIEFGSS0+c2V0U2hvdWxkUmVzdG9yZVNQRnJvbUZQKHRydWUpOworICB9CisKKyAgaWYgKFNUSS5pc1RhcmdldEVMRigpICYmIGhhc0ZQKE1GKSkgeworICAgIE1GSS0+c2V0T2Zmc2V0QWRqdXN0bWVudChNRkktPmdldE9mZnNldEFkanVzdG1lbnQoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGSS0+Z2V0RnJhbWVQdHJTcGlsbE9mZnNldCgpKTsKKyAgICBBRkktPnNldFNob3VsZFJlc3RvcmVTUEZyb21GUCh0cnVlKTsKKyAgfQorCisgIEFGSS0+c2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMVNpemUoR1BSQ1MxU2l6ZSk7CisgIEFGSS0+c2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMlNpemUoR1BSQ1MyU2l6ZSk7CisgIEFGSS0+c2V0RFBSQ2FsbGVlU2F2ZWRBcmVhU2l6ZShEUFJDU1NpemUpOworCisgIC8vIElmIHdlIG5lZWQgZHluYW1pYyBzdGFjayByZWFsaWdubWVudCwgZG8gaXQgaGVyZS4KKyAgaWYgKG5lZWRzU3RhY2tSZWFsaWdubWVudChNRikpIHsKKyAgICB1bnNpZ25lZCBNYXhBbGlnbiA9IE1GSS0+Z2V0TWF4QWxpZ25tZW50KCk7CisgICAgYXNzZXJ0ICghQUZJLT5pc1RodW1iMU9ubHlGdW5jdGlvbigpKTsKKyAgICBpZiAoIUFGSS0+aXNUaHVtYkZ1bmN0aW9uKCkpIHsKKyAgICAgIC8vIEVtaXQgYmljIHNwLCBzcCwgTWF4QWxpZ24KKyAgICAgIEFkZERlZmF1bHRDQyhBZGREZWZhdWx0UHJlZChCdWlsZE1JKE1CQiwgTUJCSSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUkuZ2V0KEFSTTo6QklDcmkpLCBBUk06OlNQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoQVJNOjpTUCwgUmVnU3RhdGU6OktpbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEltbShNYXhBbGlnbi0xKSkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBjYW5ub3QgdXNlIHNwIGFzIHNvdXJjZS9kZXN0IHJlZ2lzdGVyIGhlcmUsIHRodXMgd2UncmUgZW1pdHRpbmcgdGhlCisgICAgICAvLyBmb2xsb3dpbmcgc2VxdWVuY2U6CisgICAgICAvLyBtb3YgcjQsIHNwCisgICAgICAvLyBiaWMgcjQsIHI0LCBNYXhBbGlnbgorICAgICAgLy8gbW92IHNwLCByNAorICAgICAgLy8gRklYTUU6IEl0IHdpbGwgYmUgYmV0dGVyIGp1c3QgdG8gZmluZCBzcGFyZSByZWdpc3RlciBoZXJlLgorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dE1PVmdwcjJ0Z3ByKSwgQVJNOjpSNCkKKyAgICAgICAgLmFkZFJlZyhBUk06OlNQLCBSZWdTdGF0ZTo6S2lsbCk7CisgICAgICBBZGREZWZhdWx0Q0MoQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIE1CQkksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLmdldChBUk06OnQyQklDcmkpLCBBUk06OlI0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoQVJNOjpSNCwgUmVnU3RhdGU6OktpbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEltbShNYXhBbGlnbi0xKSkpOworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dE1PVnRncHIyZ3ByKSwgQVJNOjpTUCkKKyAgICAgICAgLmFkZFJlZyhBUk06OlI0LCBSZWdTdGF0ZTo6S2lsbCk7CisgICAgfQorCisgICAgQUZJLT5zZXRTaG91bGRSZXN0b3JlU1BGcm9tRlAodHJ1ZSk7CisgIH0KKworICAvLyBJZiB0aGUgZnJhbWUgaGFzIHZhcmlhYmxlIHNpemVkIG9iamVjdHMgdGhlbiB0aGUgZXBpbG9ndWUgbXVzdCByZXN0b3JlCisgIC8vIHRoZSBzcCBmcm9tIGZwLgorICBpZiAoIUFGSS0+c2hvdWxkUmVzdG9yZVNQRnJvbUZQKCkgJiYgTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKSkKKyAgICBBRkktPnNldFNob3VsZFJlc3RvcmVTUEZyb21GUCh0cnVlKTsKK30KKworc3RhdGljIGJvb2wgaXNDYWxsZWVTYXZlZFJlZ2lzdGVyKHVuc2lnbmVkIFJlZywgY29uc3QgdW5zaWduZWQgKkNTUmVncykgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBDU1JlZ3NbaV07ICsraSkKKyAgICBpZiAoUmVnID09IENTUmVnc1tpXSkKKyAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzQ1NSZXN0b3JlKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZUSUksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqQ1NSZWdzKSB7CisgIHJldHVybiAoKE1JLT5nZXRPcGNvZGUoKSA9PSAoaW50KUFSTTo6VkxEUkQgfHwKKyAgICAgICAgICAgTUktPmdldE9wY29kZSgpID09IChpbnQpQVJNOjpMRFIgfHwKKyAgICAgICAgICAgTUktPmdldE9wY29kZSgpID09IChpbnQpQVJNOjp0MkxEUmkxMikgJiYKKyAgICAgICAgICBNSS0+Z2V0T3BlcmFuZCgxKS5pc0ZJKCkgJiYKKyAgICAgICAgICBpc0NhbGxlZVNhdmVkUmVnaXN0ZXIoTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCksIENTUmVncykpOworfQorCit2b2lkIEFSTUJhc2VSZWdpc3RlckluZm86OgorZW1pdEVwaWxvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBwcmlvcihNQkIuZW5kKCkpOworICBhc3NlcnQoTUJCSS0+Z2V0RGVzYygpLmlzUmV0dXJuKCkgJiYKKyAgICAgICAgICJDYW4gb25seSBpbnNlcnQgZXBpbG9nIGludG8gcmV0dXJuaW5nIGJsb2NrcyIpOworICB1bnNpZ25lZCBSZXRPcGNvZGUgPSBNQkJJLT5nZXRPcGNvZGUoKTsKKyAgRGVidWdMb2MgZGwgPSBNQkJJLT5nZXREZWJ1Z0xvYygpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgYXNzZXJ0KCFBRkktPmlzVGh1bWIxT25seUZ1bmN0aW9uKCkgJiYKKyAgICAgICAgICJUaGlzIGVtaXRFcGlsb2d1ZSBkb2VzIG5vdCBzdXBwb3J0IFRodW1iMSEiKTsKKyAgYm9vbCBpc0FSTSA9ICFBRkktPmlzVGh1bWJGdW5jdGlvbigpOworCisgIHVuc2lnbmVkIFZBUmVnU2F2ZVNpemUgPSBBRkktPmdldFZhckFyZ3NSZWdTYXZlU2l6ZSgpOworICBpbnQgTnVtQnl0ZXMgPSAoaW50KU1GSS0+Z2V0U3RhY2tTaXplKCk7CisKKyAgaWYgKCFBRkktPmhhc1N0YWNrRnJhbWUoKSkgeworICAgIGlmIChOdW1CeXRlcyAhPSAwKQorICAgICAgZW1pdFNQVXBkYXRlKGlzQVJNLCBNQkIsIE1CQkksIGRsLCBUSUksIE51bUJ5dGVzKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBVbndpbmQgTUJCSSB0byBwb2ludCB0byBmaXJzdCBMRFIgLyBWTERSRC4KKyAgICBjb25zdCB1bnNpZ25lZCAqQ1NSZWdzID0gZ2V0Q2FsbGVlU2F2ZWRSZWdzKCk7CisgICAgaWYgKE1CQkkgIT0gTUJCLmJlZ2luKCkpIHsKKyAgICAgIGRvCisgICAgICAgIC0tTUJCSTsKKyAgICAgIHdoaWxlIChNQkJJICE9IE1CQi5iZWdpbigpICYmIGlzQ1NSZXN0b3JlKE1CQkksIFRJSSwgQ1NSZWdzKSk7CisgICAgICBpZiAoIWlzQ1NSZXN0b3JlKE1CQkksIFRJSSwgQ1NSZWdzKSkKKyAgICAgICAgKytNQkJJOworICAgIH0KKworICAgIC8vIE1vdmUgU1AgdG8gc3RhcnQgb2YgRlAgY2FsbGVlIHNhdmUgc3BpbGwgYXJlYS4KKyAgICBOdW1CeXRlcyAtPSAoQUZJLT5nZXRHUFJDYWxsZWVTYXZlZEFyZWExU2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgQUZJLT5nZXRHUFJDYWxsZWVTYXZlZEFyZWEyU2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgQUZJLT5nZXREUFJDYWxsZWVTYXZlZEFyZWFTaXplKCkpOworCisgICAgLy8gUmVzZXQgU1AgYmFzZWQgb24gZnJhbWUgcG9pbnRlciBvbmx5IGlmIHRoZSBzdGFjayBmcmFtZSBleHRlbmRzIGJleW9uZAorICAgIC8vIGZyYW1lIHBvaW50ZXIgc3RhY2sgc2xvdCBvciB0YXJnZXQgaXMgRUxGIGFuZCB0aGUgZnVuY3Rpb24gaGFzIEZQLgorICAgIGlmIChBRkktPnNob3VsZFJlc3RvcmVTUEZyb21GUCgpKSB7CisgICAgICBOdW1CeXRlcyA9IEFGSS0+Z2V0RnJhbWVQdHJTcGlsbE9mZnNldCgpIC0gTnVtQnl0ZXM7CisgICAgICBpZiAoTnVtQnl0ZXMpIHsKKyAgICAgICAgaWYgKGlzQVJNKQorICAgICAgICAgIGVtaXRBUk1SZWdQbHVzSW1tZWRpYXRlKE1CQiwgTUJCSSwgZGwsIEFSTTo6U1AsIEZyYW1lUHRyLCAtTnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkFMLCAwLCBUSUkpOworICAgICAgICBlbHNlCisgICAgICAgICAgZW1pdFQyUmVnUGx1c0ltbWVkaWF0ZShNQkIsIE1CQkksIGRsLCBBUk06OlNQLCBGcmFtZVB0ciwgLU51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkFMLCAwLCBUSUkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGh1bWIyIG9yIEFSTS4KKyAgICAgICAgaWYgKGlzQVJNKQorICAgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBUk06Ok1PVnIpLCBBUk06OlNQKQorICAgICAgICAgICAgLmFkZFJlZyhGcmFtZVB0cikuYWRkSW1tKCh1bnNpZ25lZClBUk1DQzo6QUwpLmFkZFJlZygwKS5hZGRSZWcoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQVJNOjp0TU9WZ3ByMmdwciksIEFSTTo6U1ApCisgICAgICAgICAgICAuYWRkUmVnKEZyYW1lUHRyKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKE51bUJ5dGVzKQorICAgICAgZW1pdFNQVXBkYXRlKGlzQVJNLCBNQkIsIE1CQkksIGRsLCBUSUksIE51bUJ5dGVzKTsKKworICAgIC8vIE1vdmUgU1AgdG8gc3RhcnQgb2YgaW50ZWdlciBjYWxsZWUgc2F2ZSBzcGlsbCBhcmVhIDIuCisgICAgbW92ZVBhc3RDU0xvYWRTdG9yZU9wcyhNQkIsIE1CQkksIEFSTTo6VkxEUkQsIDAsIDMsIFNUSSk7CisgICAgZW1pdFNQVXBkYXRlKGlzQVJNLCBNQkIsIE1CQkksIGRsLCBUSUksIEFGSS0+Z2V0RFBSQ2FsbGVlU2F2ZWRBcmVhU2l6ZSgpKTsKKworICAgIC8vIE1vdmUgU1AgdG8gc3RhcnQgb2YgaW50ZWdlciBjYWxsZWUgc2F2ZSBzcGlsbCBhcmVhIDEuCisgICAgbW92ZVBhc3RDU0xvYWRTdG9yZU9wcyhNQkIsIE1CQkksIEFSTTo6TERSLCBBUk06OnQyTERSaTEyLCAyLCBTVEkpOworICAgIGVtaXRTUFVwZGF0ZShpc0FSTSwgTUJCLCBNQkJJLCBkbCwgVElJLCBBRkktPmdldEdQUkNhbGxlZVNhdmVkQXJlYTJTaXplKCkpOworCisgICAgLy8gTW92ZSBTUCB0byBTUCB1cG9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbi4KKyAgICBtb3ZlUGFzdENTTG9hZFN0b3JlT3BzKE1CQiwgTUJCSSwgQVJNOjpMRFIsIEFSTTo6dDJMRFJpMTIsIDEsIFNUSSk7CisgICAgZW1pdFNQVXBkYXRlKGlzQVJNLCBNQkIsIE1CQkksIGRsLCBUSUksIEFGSS0+Z2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMVNpemUoKSk7CisgIH0KKworICBpZiAoUmV0T3Bjb2RlID09IEFSTTo6VENSRVRVUk5kaSB8fCBSZXRPcGNvZGUgPT0gQVJNOjpUQ1JFVFVSTmRpTkQgfHwKKyAgICAgIFJldE9wY29kZSA9PSBBUk06OlRDUkVUVVJOcmkgfHwgUmV0T3Bjb2RlID09IEFSTTo6VENSRVRVUk5yaU5EKSB7CisgICAgLy8gVGFpbCBjYWxsIHJldHVybjogYWRqdXN0IHRoZSBzdGFjayBwb2ludGVyIGFuZCBqdW1wIHRvIGNhbGxlZS4KKyAgICBNQkJJID0gcHJpb3IoTUJCLmVuZCgpKTsKKyAgICBNYWNoaW5lT3BlcmFuZCAmSnVtcFRhcmdldCA9IE1CQkktPmdldE9wZXJhbmQoMCk7CisKKyAgICAvLyBKdW1wIHRvIGxhYmVsIG9yIHZhbHVlIGluIHJlZ2lzdGVyLgorICAgIGlmIChSZXRPcGNvZGUgPT0gQVJNOjpUQ1JFVFVSTmRpKSB7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIAorICAgICAgICAgICAgVElJLmdldChTVEkuaXNUaHVtYigpID8gQVJNOjpUQUlMSk1QZHQgOiBBUk06OlRBSUxKTVBkKSkuCisgICAgICAgIGFkZEdsb2JhbEFkZHJlc3MoSnVtcFRhcmdldC5nZXRHbG9iYWwoKSwgSnVtcFRhcmdldC5nZXRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBKdW1wVGFyZ2V0LmdldFRhcmdldEZsYWdzKCkpOworICAgIH0gZWxzZSBpZiAoUmV0T3Bjb2RlID09IEFSTTo6VENSRVRVUk5kaU5EKSB7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsCisgICAgICAgICAgICBUSUkuZ2V0KFNUSS5pc1RodW1iKCkgPyBBUk06OlRBSUxKTVBkTkR0IDogQVJNOjpUQUlMSk1QZE5EKSkuCisgICAgICAgIGFkZEdsb2JhbEFkZHJlc3MoSnVtcFRhcmdldC5nZXRHbG9iYWwoKSwgSnVtcFRhcmdldC5nZXRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBKdW1wVGFyZ2V0LmdldFRhcmdldEZsYWdzKCkpOworICAgIH0gZWxzZSBpZiAoUmV0T3Bjb2RlID09IEFSTTo6VENSRVRVUk5yaSkgeworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6VEFJTEpNUHIpKS4KKyAgICAgICAgYWRkUmVnKEp1bXBUYXJnZXQuZ2V0UmVnKCksIFJlZ1N0YXRlOjpLaWxsKTsKKyAgICB9IGVsc2UgaWYgKFJldE9wY29kZSA9PSBBUk06OlRDUkVUVVJOcmlORCkgeworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6VEFJTEpNUHJORCkpLgorICAgICAgICBhZGRSZWcoSnVtcFRhcmdldC5nZXRSZWcoKSwgUmVnU3RhdGU6OktpbGwpOworICAgIH0gCisKKyAgICBNYWNoaW5lSW5zdHIgKk5ld01JID0gcHJpb3IoTUJCSSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE1CQkktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgTmV3TUktPmFkZE9wZXJhbmQoTUJCSS0+Z2V0T3BlcmFuZChpKSk7CisKKyAgICAvLyBEZWxldGUgdGhlIHBzZXVkbyBpbnN0cnVjdGlvbiBUQ1JFVFVSTi4KKyAgICBNQkIuZXJhc2UoTUJCSSk7CisgIH0KKworICBpZiAoVkFSZWdTYXZlU2l6ZSkKKyAgICBlbWl0U1BVcGRhdGUoaXNBUk0sIE1CQiwgTUJCSSwgZGwsIFRJSSwgVkFSZWdTYXZlU2l6ZSk7Cit9CisKKyNpbmNsdWRlICJBUk1HZW5SZWdpc3RlckluZm8uaW5jIgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQmFzZVJlZ2lzdGVySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQmFzZVJlZ2lzdGVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDRlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1CYXNlUmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8vPT09LSBBUk1CYXNlUmVnaXN0ZXJJbmZvLmggLSBBUk0gUmVnaXN0ZXIgSW5mb3JtYXRpb24gSW1wbCAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBiYXNlIEFSTSBpbXBsZW1lbnRhdGlvbiBvZiBUYXJnZXRSZWdpc3RlckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBUk1CQVNFUkVHSVNURVJJTkZPX0gKKyNkZWZpbmUgQVJNQkFTRVJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJBUk1HZW5SZWdpc3RlckluZm8uaC5pbmMiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQVJNU3VidGFyZ2V0OworICBjbGFzcyBBUk1CYXNlSW5zdHJJbmZvOworICBjbGFzcyBUeXBlOworCisvLy8gUmVnaXN0ZXIgYWxsb2NhdGlvbiBoaW50cy4KK25hbWVzcGFjZSBBUk1SSSB7CisgIGVudW0geworICAgIFJlZ1BhaXJPZGQgID0gMSwKKyAgICBSZWdQYWlyRXZlbiA9IDIKKyAgfTsKK30KKworLy8vIGlzQVJNTG93UmVnaXN0ZXIgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHJlZ2lzdGVyIGlzIGxvdyByZWdpc3RlciByMC1yNy4KKy8vLworc3RhdGljIGlubGluZSBib29sIGlzQVJNTG93UmVnaXN0ZXIodW5zaWduZWQgUmVnKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBBUk07CisgIHN3aXRjaCAoUmVnKSB7CisgIGNhc2UgUjA6ICBjYXNlIFIxOiAgY2FzZSBSMjogIGNhc2UgUjM6CisgIGNhc2UgUjQ6ICBjYXNlIFI1OiAgY2FzZSBSNjogIGNhc2UgUjc6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2NsYXNzIEFSTUJhc2VSZWdpc3RlckluZm8gOiBwdWJsaWMgQVJNR2VuUmVnaXN0ZXJJbmZvIHsKK3Byb3RlY3RlZDoKKyAgY29uc3QgQVJNQmFzZUluc3RySW5mbyAmVElJOworICBjb25zdCBBUk1TdWJ0YXJnZXQgJlNUSTsKKworICAvLy8gRnJhbWVQdHIgLSBBUk0gcGh5c2ljYWwgcmVnaXN0ZXIgdXNlZCBhcyBmcmFtZSBwdHIuCisgIHVuc2lnbmVkIEZyYW1lUHRyOworCisgIC8vIENhbiBiZSBvbmx5IHN1YmNsYXNzZWQuCisgIGV4cGxpY2l0IEFSTUJhc2VSZWdpc3RlckluZm8oY29uc3QgQVJNQmFzZUluc3RySW5mbyAmdGlpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAmU1RJKTsKKworICAvLyBSZXR1cm4gdGhlIG9wY29kZSB0aGF0IGltcGxlbWVudHMgJ09wJywgb3IgMCBpZiBubyBvcGNvZGUKKyAgdW5zaWduZWQgZ2V0T3Bjb2RlKGludCBPcCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIGdldFJlZ2lzdGVyTnVtYmVyaW5nIC0gR2l2ZW4gdGhlIGVudW0gdmFsdWUgZm9yIHNvbWUgcmVnaXN0ZXIsIGUuZy4KKyAgLy8vIEFSTTo6TFIsIHJldHVybiB0aGUgbnVtYmVyIHRoYXQgaXQgY29ycmVzcG9uZHMgdG8gKGUuZy4gMTQpLiBJdAorICAvLy8gYWxzbyByZXR1cm5zIHRydWUgaW4gaXNTUFZGUCBpZiB0aGUgcmVnaXN0ZXIgaXMgYSBzaW5nbGUgcHJlY2lzaW9uCisgIC8vLyBWRlAgcmVnaXN0ZXIuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRSZWdpc3Rlck51bWJlcmluZyh1bnNpZ25lZCBSZWdFbnVtLCBib29sICppc1NQVkZQID0gMCk7CisKKyAgLy8vIENvZGUgR2VuZXJhdGlvbiB2aXJ0dWFsIG1ldGhvZHMuLi4KKyAgY29uc3QgdW5zaWduZWQgKmdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gMCkgY29uc3Q7CisKKyAgQml0VmVjdG9yIGdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gZ2V0TWF0Y2hpbmdTdXBlclJlZ0NsYXNzIC0gUmV0dXJuIGEgc3ViY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCByZWdpc3RlcgorICAvLy8gY2xhc3MgQSBzbyB0aGF0IGVhY2ggcmVnaXN0ZXIgaW4gaXQgaGFzIGEgc3ViLXJlZ2lzdGVyIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIHN1Yi1yZWdpc3RlciBpbmRleCB3aGljaCBpcyBpbiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGNsYXNzIEIuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgIGdldE1hdGNoaW5nU3VwZXJSZWdDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQiwgdW5zaWduZWQgSWR4KSBjb25zdDsKKworICAvLy8gY2FuQ29tYmluZVN1YlJlZ0luZGljZXMgLSBHaXZlbiBhIHJlZ2lzdGVyIGNsYXNzIGFuZCBhIGxpc3Qgb2YKKyAgLy8vIHN1YnJlZ2lzdGVyIGluZGljZXMsIHJldHVybiB0cnVlIGlmIGl0J3MgcG9zc2libGUgdG8gY29tYmluZSB0aGUKKyAgLy8vIHN1YnJlZ2lzdGVyIGluZGljZXMgaW50byBvbmUgdGhhdCBjb3JyZXNwb25kcyB0byBhIGxhcmdlcgorICAvLy8gc3VicmVnaXN0ZXIuIFJldHVybiB0aGUgbmV3IHN1YnJlZ2lzdGVyIGluZGV4IGJ5IHJlZmVyZW5jZS4gTm90ZSB0aGUKKyAgLy8vIG5ldyBpbmRleCBtYXkgYmUgemVybyBpZiB0aGUgZ2l2ZW4gc3VicmVnaXN0ZXJzIGNhbiBiZSBjb21iaW5lZCB0bworICAvLy8gZm9ybSB0aGUgd2hvbGUgcmVnaXN0ZXIuCisgIHZpcnR1YWwgYm9vbCBjYW5Db21iaW5lU3ViUmVnSW5kaWNlcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJlN1YkluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTmV3U3ViSWR4KSBjb25zdDsKKworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpnZXRQb2ludGVyUmVnQ2xhc3ModW5zaWduZWQgS2luZCA9IDApIGNvbnN0OworCisgIHN0ZDo6cGFpcjxUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvcixUYXJnZXRSZWdpc3RlckNsYXNzOjppdGVyYXRvcj4KKyAgZ2V0QWxsb2NhdGlvbk9yZGVyKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSGludFR5cGUsIHVuc2lnbmVkIEhpbnRSZWcsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB1bnNpZ25lZCBSZXNvbHZlUmVnQWxsb2NIaW50KHVuc2lnbmVkIFR5cGUsIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2b2lkIFVwZGF0ZVJlZ0FsbG9jSGludCh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIE5ld1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgYm9vbCBoYXNGUChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICBib29sIGNhblJlYWxpZ25TdGFjayhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgYm9vbCBuZWVkc1N0YWNrUmVhbGlnbm1lbnQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgYm9vbCBjYW5ub3RFbGltaW5hdGVGcmFtZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2b2lkIHByb2Nlc3NGdW5jdGlvbkJlZm9yZUNhbGxlZVNhdmVkU2NhbihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gTlVMTCkgY29uc3Q7CisKKyAgLy8gRGVidWcgaW5mb3JtYXRpb24gcXVlcmllcy4KKyAgdW5zaWduZWQgZ2V0UkFSZWdpc3RlcigpIGNvbnN0OworICB1bnNpZ25lZCBnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICBpbnQgZ2V0RnJhbWVJbmRleFJlZmVyZW5jZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLCBpbnQgRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZGcmFtZVJlZykgY29uc3Q7CisgIGludCBSZXNvbHZlRnJhbWVJbmRleFJlZmVyZW5jZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLCBpbnQgRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRnJhbWVSZWcsIGludCBTUEFkaikgY29uc3Q7CisgIGludCBnZXRGcmFtZUluZGV4T2Zmc2V0KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludCBGSSkgY29uc3Q7CisKKyAgLy8gRXhjZXB0aW9uIGhhbmRsaW5nIHF1ZXJpZXMuCisgIHVuc2lnbmVkIGdldEVIRXhjZXB0aW9uUmVnaXN0ZXIoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0RUhIYW5kbGVyUmVnaXN0ZXIoKSBjb25zdDsKKworICBpbnQgZ2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0OworCisgIGJvb2wgaXNMb3dSZWdpc3Rlcih1bnNpZ25lZCBSZWcpIGNvbnN0OworCisKKyAgLy8vIGVtaXRMb2FkQ29uc3RQb29sIC0gRW1pdHMgYSBsb2FkIGZyb20gY29uc3Rwb29sIHRvIG1hdGVyaWFsaXplIHRoZQorICAvLy8gc3BlY2lmaWVkIGltbWVkaWF0ZS4KKyAgdmlydHVhbCB2b2lkIGVtaXRMb2FkQ29uc3RQb29sKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Q29uZENvZGVzIFByZWQgPSBBUk1DQzo6QUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQcmVkUmVnID0gMCkgY29uc3Q7CisKKyAgLy8vIENvZGUgR2VuZXJhdGlvbiB2aXJ0dWFsIG1ldGhvZHMuLi4KKyAgdmlydHVhbCBib29sIGlzUmVzZXJ2ZWRSZWcoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwgdW5zaWduZWQgUmVnKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNSZWdpc3RlclNjYXZlbmdpbmcoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIHJlcXVpcmVzRnJhbWVJbmRleFNjYXZlbmdpbmcoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIGhhc1Jlc2VydmVkQ2FsbEZyYW1lKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgY2FuU2ltcGxpZnlDYWxsRnJhbWVQc2V1ZG9zKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIGNvbnN0OworCisgIHZpcnR1YWwgdW5zaWduZWQgZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGosIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IE5VTEwpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBlbWl0UHJvbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIGVzdGltYXRlUlNTdGFja1NpemVMaW1pdChNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRSZWdpc3RlclBhaXJFdmVuKHVuc2lnbmVkIFJlZywgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0UmVnaXN0ZXJQYWlyT2RkKHVuc2lnbmVkIFJlZywgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUJ1aWxkQXR0cnMuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUJ1aWxkQXR0cnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM4Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQnVpbGRBdHRycy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vPT09LS0tLS0tLS0gQVJNQnVpbGRBdHRycy5oIC0gQVJNIEJ1aWxkIEF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGVudW1lcmF0aW9ucyBhbmQgc3VwcG9ydCByb3V0aW5lcyBmb3IgQVJNIGJ1aWxkIGF0dHJpYnV0ZXMKKy8vIGFzIGRlZmluZWQgaW4gQVJNIEFCSSBhZGRlbmRhIGRvY3VtZW50IChBQkkgcmVsZWFzZSAyLjA3KS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9fVEFSR0VUX0FSTUJVSUxEQVRUUlNfSF9fCisjZGVmaW5lIF9fVEFSR0VUX0FSTUJVSUxEQVRUUlNfSF9fCisKK25hbWVzcGFjZSBBUk1CdWlsZEF0dHJzIHsKKyAgZW51bSB7CisgICAgRmlsZSAgICAgICAgICAgICAgICAgICAgICA9IDEsCisgICAgU2VjdGlvbiAgICAgICAgICAgICAgICAgICA9IDIsCisgICAgU3ltYm9sICAgICAgICAgICAgICAgICAgICA9IDMsCisgICAgQ1BVX3Jhd19uYW1lICAgICAgICAgICAgICA9IDQsCisgICAgQ1BVX25hbWUgICAgICAgICAgICAgICAgICA9IDUsCisgICAgQ1BVX2FyY2ggICAgICAgICAgICAgICAgICA9IDYsCisgICAgQ1BVX2FyY2hfcHJvZmlsZSAgICAgICAgICA9IDcsCisgICAgQVJNX0lTQV91c2UgICAgICAgICAgICAgICA9IDgsCisgICAgVEhVTUJfSVNBX3VzZSAgICAgICAgICAgICA9IDksCisgICAgVkZQX2FyY2ggICAgICAgICAgICAgICAgICA9IDEwLAorICAgIFdNTVhfYXJjaCAgICAgICAgICAgICAgICAgPSAxMSwKKyAgICBBZHZhbmNlZF9TSU1EX2FyY2ggICAgICAgID0gMTIsCisgICAgUENTX2NvbmZpZyAgICAgICAgICAgICAgICA9IDEzLAorICAgIEFCSV9QQ1NfUjlfdXNlICAgICAgICAgICAgPSAxNCwKKyAgICBBQklfUENTX1JXX2RhdGEgICAgICAgICAgID0gMTUsCisgICAgQUJJX1BDU19ST19kYXRhICAgICAgICAgICA9IDE2LAorICAgIEFCSV9QQ1NfR09UX3VzZSAgICAgICAgICAgPSAxNywKKyAgICBBQklfUENTX3djaGFyX3QgICAgICAgICAgID0gMTgsCisgICAgQUJJX0ZQX3JvdW5kaW5nICAgICAgICAgICA9IDE5LAorICAgIEFCSV9GUF9kZW5vcm1hbCAgICAgICAgICAgPSAyMCwKKyAgICBBQklfRlBfZXhjZXB0aW9ucyAgICAgICAgID0gMjEsCisgICAgQUJJX0ZQX3VzZXJfZXhjZXB0aW9ucyAgICA9IDIyLAorICAgIEFCSV9GUF9udW1iZXJfbW9kZWwgICAgICAgPSAyMywKKyAgICBBQklfYWxpZ244X25lZWRlZCAgICAgICAgID0gMjQsCisgICAgQUJJX2FsaWduOF9wcmVzZXJ2ZWQgICAgICA9IDI1LAorICAgIEFCSV9lbnVtX3NpemUgICAgICAgICAgICAgPSAyNiwKKyAgICBBQklfSGFyZEZQX3VzZSAgICAgICAgICAgID0gMjcsCisgICAgQUJJX1ZGUF9hcmdzICAgICAgICAgICAgICA9IDI4LAorICAgIEFCSV9XTU1YX2FyZ3MgICAgICAgICAgICAgPSAyOSwKKyAgICBBQklfb3B0aW1pemF0aW9uX2dvYWxzICAgID0gMzAsCisgICAgQUJJX0ZQX29wdGltaXphdGlvbl9nb2FscyA9IDMxLAorICAgIGNvbXBhdGliaWxpdHkgICAgICAgICAgICAgPSAzMiwKKyAgICBDUFVfdW5hbGlnbmVkX2FjY2VzcyAgICAgID0gMzQsCisgICAgVkZQX0hQX2V4dGVuc2lvbiAgICAgICAgICA9IDM2LAorICAgIEFCSV9GUF8xNmJpdF9mb3JtYXQgICAgICAgPSAzOCwKKyAgICBub2RlZmF1bHRzICAgICAgICAgICAgICAgID0gNjQsCisgICAgYWxzb19jb21wYXRpYmxlX3dpdGggICAgICA9IDY1LAorICAgIFQyRUVfdXNlICAgICAgICAgICAgICAgICAgPSA2NiwKKyAgICBjb25mb3JtYW5jZSAgICAgICAgICAgICAgID0gNjcsCisgICAgVmlydHVhbGl6YXRpb25fdXNlICAgICAgICA9IDY4LAorICAgIE1QZXh0ZW5zaW9uX3VzZSAgICAgICAgICAgPSA3MAorICB9OworfQorCisjZW5kaWYgLy8gX19UQVJHRVRfQVJNQlVJTERBVFRSU19IX18KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUNhbGxpbmdDb252LnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQ2FsbGluZ0NvbnYudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1MTAwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUNhbGxpbmdDb252LnRkCkBAIC0wLDAgKzEsMTMyIEBACisvLz09PS0gQVJNQ2FsbGluZ0NvbnYudGQgLSBDYWxsaW5nIENvbnZlbnRpb25zIGZvciBBUk0gLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBkZXNjcmliZXMgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIEFSTSBhcmNoaXRlY3R1cmUuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQ0NJZlN1YnRhcmdldCAtIE1hdGNoIGlmIHRoZSBjdXJyZW50IHN1YnRhcmdldCBoYXMgYSBmZWF0dXJlIEYuCitjbGFzcyBDQ0lmU3VidGFyZ2V0PHN0cmluZyBGLCBDQ0FjdGlvbiBBPjoKKyAgQ0NJZjwhc3RyY29uY2F0KCJTdGF0ZS5nZXRUYXJnZXQoKS5nZXRTdWJ0YXJnZXQ8QVJNU3VidGFyZ2V0PigpLiIsIEYpLCBBPjsKKworLy8vIENDSWZBbGlnbiAtIE1hdGNoIG9mIHRoZSBvcmlnaW5hbCBhbGlnbm1lbnQgb2YgdGhlIGFyZworY2xhc3MgQ0NJZkFsaWduPHN0cmluZyBBbGlnbiwgQ0NBY3Rpb24gQT46CisgIENDSWY8IXN0cmNvbmNhdCgiQXJnRmxhZ3MuZ2V0T3JpZ0FsaWduKCkgPT0gIiwgQWxpZ24pLCBBPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFSTSBBUENTIENhbGxpbmcgQ29udmVudGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2RlZiBDQ19BUk1fQVBDUyA6IENhbGxpbmdDb252PFsKKworICBDQ0lmVHlwZTxbaTgsIGkxNl0sIENDUHJvbW90ZVRvVHlwZTxpMzI+PiwKKworICAvLyBIYW5kbGUgYWxsIHZlY3RvciB0eXBlcyBhcyBlaXRoZXIgZjY0IG9yIHYyZjY0LgorICBDQ0lmVHlwZTxbdjFpNjQsIHYyaTMyLCB2NGkxNiwgdjhpOCwgdjJmMzJdLCBDQ0JpdENvbnZlcnRUb1R5cGU8ZjY0Pj4sCisgIENDSWZUeXBlPFt2Mmk2NCwgdjRpMzIsIHY4aTE2LCB2MTZpOCwgdjRmMzJdLCBDQ0JpdENvbnZlcnRUb1R5cGU8djJmNjQ+PiwKKworICAvLyBmNjQgYW5kIHYyZjY0IGFyZSBwYXNzZWQgaW4gYWRqYWNlbnQgR1BScywgcG9zc2libHkgc3BsaXQgb250byB0aGUgc3RhY2sKKyAgQ0NJZlR5cGU8W2Y2NCwgdjJmNjRdLCBDQ0N1c3RvbTwiQ0NfQVJNX0FQQ1NfQ3VzdG9tX2Y2NCI+PiwKKworICBDQ0lmVHlwZTxbZjMyXSwgQ0NCaXRDb252ZXJ0VG9UeXBlPGkzMj4+LAorICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbUjAsIFIxLCBSMiwgUjNdPj4sCisKKyAgQ0NJZlR5cGU8W2kzMl0sIENDQXNzaWduVG9TdGFjazw0LCA0Pj4sCisgIENDSWZUeXBlPFtmNjRdLCBDQ0Fzc2lnblRvU3RhY2s8OCwgND4+LAorICBDQ0lmVHlwZTxbdjJmNjRdLCBDQ0Fzc2lnblRvU3RhY2s8MTYsIDQ+PgorXT47CisKK2RlZiBSZXRDQ19BUk1fQVBDUyA6IENhbGxpbmdDb252PFsKKyAgQ0NJZlR5cGU8W2YzMl0sIENDQml0Q29udmVydFRvVHlwZTxpMzI+PiwKKworICAvLyBIYW5kbGUgYWxsIHZlY3RvciB0eXBlcyBhcyBlaXRoZXIgZjY0IG9yIHYyZjY0LgorICBDQ0lmVHlwZTxbdjFpNjQsIHYyaTMyLCB2NGkxNiwgdjhpOCwgdjJmMzJdLCBDQ0JpdENvbnZlcnRUb1R5cGU8ZjY0Pj4sCisgIENDSWZUeXBlPFt2Mmk2NCwgdjRpMzIsIHY4aTE2LCB2MTZpOCwgdjRmMzJdLCBDQ0JpdENvbnZlcnRUb1R5cGU8djJmNjQ+PiwKKworICBDQ0lmVHlwZTxbZjY0LCB2MmY2NF0sIENDQ3VzdG9tPCJSZXRDQ19BUk1fQVBDU19DdXN0b21fZjY0Ij4+LAorCisgIENDSWZUeXBlPFtpMzJdLCBDQ0Fzc2lnblRvUmVnPFtSMCwgUjEsIFIyLCBSM10+PiwKKyAgQ0NJZlR5cGU8W2k2NF0sIENDQXNzaWduVG9SZWdXaXRoU2hhZG93PFtSMCwgUjJdLCBbUjEsIFIzXT4+CitdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFSTSBBQVBDUyAoRUFCSSkgQ2FsbGluZyBDb252ZW50aW9uLCBjb21tb24gcGFydHMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiBDQ19BUk1fQUFQQ1NfQ29tbW9uIDogQ2FsbGluZ0NvbnY8WworCisgIENDSWZUeXBlPFtpOCwgaTE2XSwgQ0NQcm9tb3RlVG9UeXBlPGkzMj4+LAorCisgIC8vIGk2NC9mNjQgaXMgcGFzc2VkIGluIGV2ZW4gcGFpcnMgb2YgR1BScworICAvLyBpNjQgaXMgOC1hbGlnbmVkIGkzMiBoZXJlLCBzbyB3ZSBtYXkgbmVlZCB0byBlYXQgUjEgYXMgYSBwYWQgcmVnaXN0ZXIKKyAgLy8gKGFuZCB0aGUgc2FtZSBpcyB0cnVlIGZvciBmNjQgaWYgVkZQIGlzIG5vdCBlbmFibGVkKQorICBDQ0lmVHlwZTxbaTMyXSwgQ0NJZkFsaWduPCI4IiwgQ0NBc3NpZ25Ub1JlZ1dpdGhTaGFkb3c8W1IwLCBSMl0sIFtSMCwgUjFdPj4+LAorICBDQ0lmVHlwZTxbaTMyXSwgQ0NJZjwiU3RhdGUuZ2V0TmV4dFN0YWNrT2Zmc2V0KCkgPT0gMCAmJiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkFyZ0ZsYWdzLmdldE9yaWdBbGlnbigpICE9IDgiLAorICAgICAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnblRvUmVnPFtSMCwgUjEsIFIyLCBSM10+Pj4sCisKKyAgQ0NJZlR5cGU8W2kzMl0sIENDSWZBbGlnbjwiOCIsIENDQXNzaWduVG9TdGFja1dpdGhTaGFkb3c8NCwgOCwgUjM+Pj4sCisgIENDSWZUeXBlPFtpMzIsIGYzMl0sIENDQXNzaWduVG9TdGFjazw0LCA0Pj4sCisgIENDSWZUeXBlPFtmNjRdLCBDQ0Fzc2lnblRvU3RhY2s8OCwgOD4+LAorICBDQ0lmVHlwZTxbdjJmNjRdLCBDQ0Fzc2lnblRvU3RhY2s8MTYsIDg+PgorXT47CisKK2RlZiBSZXRDQ19BUk1fQUFQQ1NfQ29tbW9uIDogQ2FsbGluZ0NvbnY8WworICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbUjAsIFIxLCBSMiwgUjNdPj4sCisgIENDSWZUeXBlPFtpNjRdLCBDQ0Fzc2lnblRvUmVnV2l0aFNoYWRvdzxbUjAsIFIyXSwgW1IxLCBSM10+PgorXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBUk0gQUFQQ1MgKEVBQkkpIENhbGxpbmcgQ29udmVudGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIENDX0FSTV9BQVBDUyA6IENhbGxpbmdDb252PFsKKyAgLy8gSGFuZGxlIGFsbCB2ZWN0b3IgdHlwZXMgYXMgZWl0aGVyIGY2NCBvciB2MmY2NC4KKyAgQ0NJZlR5cGU8W3YxaTY0LCB2MmkzMiwgdjRpMTYsIHY4aTgsIHYyZjMyXSwgQ0NCaXRDb252ZXJ0VG9UeXBlPGY2ND4+LAorICBDQ0lmVHlwZTxbdjJpNjQsIHY0aTMyLCB2OGkxNiwgdjE2aTgsIHY0ZjMyXSwgQ0NCaXRDb252ZXJ0VG9UeXBlPHYyZjY0Pj4sCisKKyAgQ0NJZlR5cGU8W2Y2NCwgdjJmNjRdLCBDQ0N1c3RvbTwiQ0NfQVJNX0FBUENTX0N1c3RvbV9mNjQiPj4sCisgIENDSWZUeXBlPFtmMzJdLCBDQ0JpdENvbnZlcnRUb1R5cGU8aTMyPj4sCisgIENDRGVsZWdhdGVUbzxDQ19BUk1fQUFQQ1NfQ29tbW9uPgorXT47CisKK2RlZiBSZXRDQ19BUk1fQUFQQ1MgOiBDYWxsaW5nQ29udjxbCisgIC8vIEhhbmRsZSBhbGwgdmVjdG9yIHR5cGVzIGFzIGVpdGhlciBmNjQgb3IgdjJmNjQuCisgIENDSWZUeXBlPFt2MWk2NCwgdjJpMzIsIHY0aTE2LCB2OGk4LCB2MmYzMl0sIENDQml0Q29udmVydFRvVHlwZTxmNjQ+PiwKKyAgQ0NJZlR5cGU8W3YyaTY0LCB2NGkzMiwgdjhpMTYsIHYxNmk4LCB2NGYzMl0sIENDQml0Q29udmVydFRvVHlwZTx2MmY2ND4+LAorCisgIENDSWZUeXBlPFtmNjQsIHYyZjY0XSwgQ0NDdXN0b208IlJldENDX0FSTV9BQVBDU19DdXN0b21fZjY0Ij4+LAorICBDQ0lmVHlwZTxbZjMyXSwgQ0NCaXRDb252ZXJ0VG9UeXBlPGkzMj4+LAorICBDQ0RlbGVnYXRlVG88UmV0Q0NfQVJNX0FBUENTX0NvbW1vbj4KK10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVJNIEFBUENTLVZGUCAoRUFCSSkgQ2FsbGluZyBDb252ZW50aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgQ0NfQVJNX0FBUENTX1ZGUCA6IENhbGxpbmdDb252PFsKKyAgLy8gSGFuZGxlIGFsbCB2ZWN0b3IgdHlwZXMgYXMgZWl0aGVyIGY2NCBvciB2MmY2NC4KKyAgQ0NJZlR5cGU8W3YxaTY0LCB2MmkzMiwgdjRpMTYsIHY4aTgsIHYyZjMyXSwgQ0NCaXRDb252ZXJ0VG9UeXBlPGY2ND4+LAorICBDQ0lmVHlwZTxbdjJpNjQsIHY0aTMyLCB2OGkxNiwgdjE2aTgsIHY0ZjMyXSwgQ0NCaXRDb252ZXJ0VG9UeXBlPHYyZjY0Pj4sCisKKyAgQ0NJZlR5cGU8W3YyZjY0XSwgQ0NBc3NpZ25Ub1JlZzxbUTAsIFExLCBRMiwgUTNdPj4sCisgIENDSWZUeXBlPFtmNjRdLCBDQ0Fzc2lnblRvUmVnPFtEMCwgRDEsIEQyLCBEMywgRDQsIEQ1LCBENiwgRDddPj4sCisgIENDSWZUeXBlPFtmMzJdLCBDQ0Fzc2lnblRvUmVnPFtTMCwgUzEsIFMyLCBTMywgUzQsIFM1LCBTNiwgUzcsIFM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzksIFMxMCwgUzExLCBTMTIsIFMxMywgUzE0LCBTMTVdPj4sCisgIENDRGVsZWdhdGVUbzxDQ19BUk1fQUFQQ1NfQ29tbW9uPgorXT47CisKK2RlZiBSZXRDQ19BUk1fQUFQQ1NfVkZQIDogQ2FsbGluZ0NvbnY8WworICAvLyBIYW5kbGUgYWxsIHZlY3RvciB0eXBlcyBhcyBlaXRoZXIgZjY0IG9yIHYyZjY0LgorICBDQ0lmVHlwZTxbdjFpNjQsIHYyaTMyLCB2NGkxNiwgdjhpOCwgdjJmMzJdLCBDQ0JpdENvbnZlcnRUb1R5cGU8ZjY0Pj4sCisgIENDSWZUeXBlPFt2Mmk2NCwgdjRpMzIsIHY4aTE2LCB2MTZpOCwgdjRmMzJdLCBDQ0JpdENvbnZlcnRUb1R5cGU8djJmNjQ+PiwKKworICBDQ0lmVHlwZTxbdjJmNjRdLCBDQ0Fzc2lnblRvUmVnPFtRMCwgUTEsIFEyLCBRM10+PiwKKyAgQ0NJZlR5cGU8W2Y2NF0sIENDQXNzaWduVG9SZWc8W0QwLCBEMSwgRDIsIEQzLCBENCwgRDUsIEQ2LCBEN10+PiwKKyAgQ0NJZlR5cGU8W2YzMl0sIENDQXNzaWduVG9SZWc8W1MwLCBTMSwgUzIsIFMzLCBTNCwgUzUsIFM2LCBTNywgUzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTOSwgUzEwLCBTMTEsIFMxMiwgUzEzLCBTMTQsIFMxNV0+PiwKKyAgQ0NEZWxlZ2F0ZVRvPFJldENDX0FSTV9BQVBDU19Db21tb24+CitdPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUNvZGVFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUNvZGVFbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzIzYTMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQ29kZUVtaXR0ZXIuY3BwCkBAIC0wLDAgKzEsMTc2NiBAQAorLy89PT0tLSBBUk0vQVJNQ29kZUVtaXR0ZXIuY3BwIC0gQ29udmVydCBBUk0gY29kZSB0byBtYWNoaW5lIGNvZGUgLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBhc3MgdGhhdCB0cmFuc2Zvcm1zIHRoZSBBUk0gbWFjaGluZSBpbnN0cnVjdGlvbnMgaW50bworLy8gcmVsb2NhdGFibGUgbWFjaGluZSBjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiaml0IgorI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTUFkZHJlc3NpbmdNb2Rlcy5oIgorI2luY2x1ZGUgIkFSTUNvbnN0YW50UG9vbFZhbHVlLmgiCisjaW5jbHVkZSAiQVJNSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiQVJNUmVsb2NhdGlvbnMuaCIKKyNpbmNsdWRlICJBUk1TdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJBUk1UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0pJVENvZGVFbWl0dGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUp1bXBUYWJsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNlbmRpZgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1FbWl0dGVkLCAiTnVtYmVyIG9mIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGVtaXR0ZWQiKTsKKworbmFtZXNwYWNlIHsKKworICBjbGFzcyBBUk1Db2RlRW1pdHRlciA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBBUk1KSVRJbmZvICAgICAgICAgICAgICAgICpKVEk7CisgICAgY29uc3QgQVJNSW5zdHJJbmZvICAgICAgICAqSUk7CisgICAgY29uc3QgVGFyZ2V0RGF0YSAgICAgICAgICAqVEQ7CisgICAgY29uc3QgQVJNU3VidGFyZ2V0ICAgICAgICAqU3VidGFyZ2V0OworICAgIFRhcmdldE1hY2hpbmUgICAgICAgICAgICAgJlRNOworICAgIEpJVENvZGVFbWl0dGVyICAgICAgICAgICAgJk1DRTsKKyAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeT4gKk1DUEVzOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gKk1KVEVzOworICAgIGJvb2wgSXNQSUM7CisgICAgYm9vbCBJc1RodW1iOworCisgICAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lTW9kdWxlSW5mbz4oKTsKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICAgIH0KKworICAgIHN0YXRpYyBjaGFyIElEOworICBwdWJsaWM6CisgICAgQVJNQ29kZUVtaXR0ZXIoVGFyZ2V0TWFjaGluZSAmdG0sIEpJVENvZGVFbWl0dGVyICZtY2UpCisgICAgICA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpLCBKVEkoMCksCisgICAgICAgIElJKChjb25zdCBBUk1JbnN0ckluZm8gKil0bS5nZXRJbnN0ckluZm8oKSksCisgICAgICAgIFREKHRtLmdldFRhcmdldERhdGEoKSksIFRNKHRtKSwKKyAgICAgICAgTUNFKG1jZSksIE1DUEVzKDApLCBNSlRFcygwKSwKKyAgICAgICAgSXNQSUMoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pLCBJc1RodW1iKGZhbHNlKSB7fQorCisgICAgLy8vIGdldEJpbmFyeUNvZGVGb3JJbnN0ciAtIFRoaXMgZnVuY3Rpb24sIGdlbmVyYXRlZCBieSB0aGUKKyAgICAvLy8gQ29kZUVtaXR0ZXJHZW5lcmF0b3IgdXNpbmcgVGFibGVHZW4sIHByb2R1Y2VzIHRoZSBiaW5hcnkgZW5jb2RpbmcgZm9yCisgICAgLy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorICAgIHVuc2lnbmVkIGdldEJpbmFyeUNvZGVGb3JJbnN0cihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJBUk0gTWFjaGluZSBDb2RlIEVtaXR0ZXIiOworICAgIH0KKworICAgIHZvaWQgZW1pdEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIHByaXZhdGU6CisKKyAgICB2b2lkIGVtaXRXb3JkTEUodW5zaWduZWQgQmluYXJ5KTsKKyAgICB2b2lkIGVtaXREV29yZExFKHVpbnQ2NF90IEJpbmFyeSk7CisgICAgdm9pZCBlbWl0Q29uc3RQb29sSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisgICAgdm9pZCBlbWl0TU9WaTMyaW1tSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisgICAgdm9pZCBlbWl0TU9WaTJwaWVjZXNJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKyAgICB2b2lkIGVtaXRMRUFwY3JlbEpUSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisgICAgdm9pZCBlbWl0UHNldWRvTW92ZUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworICAgIHZvaWQgYWRkUENMYWJlbCh1bnNpZ25lZCBMYWJlbElEKTsKKyAgICB2b2lkIGVtaXRQc2V1ZG9JbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKyAgICB1bnNpZ25lZCBnZXRNYWNoaW5lU29SZWdPcFZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wSWR4KTsKKworICAgIHVuc2lnbmVkIGdldE1hY2hpbmVTb0ltbU9wVmFsdWUodW5zaWduZWQgU29JbW0pOworCisgICAgdW5zaWduZWQgZ2V0QWRkck1vZGVTQml0KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEKSBjb25zdDsKKworICAgIHZvaWQgZW1pdERhdGFQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEltcGxpY2l0UmQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW1wbGljaXRSbiA9IDApOworCisgICAgdm9pZCBlbWl0TG9hZFN0b3JlSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbXBsaWNpdFJkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbXBsaWNpdFJuID0gMCk7CisKKyAgICB2b2lkIGVtaXRNaXNjTG9hZFN0b3JlSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW1wbGljaXRSbiA9IDApOworCisgICAgdm9pZCBlbWl0TG9hZFN0b3JlTXVsdGlwbGVJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAgIHZvaWQgZW1pdE11bEZybUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgICAgdm9pZCBlbWl0RXh0ZW5kSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgICB2b2lkIGVtaXRNaXNjQXJpdGhJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAgIHZvaWQgZW1pdFNhdHVyYXRlSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgICB2b2lkIGVtaXRCcmFuY2hJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAgIHZvaWQgZW1pdElubGluZUp1bXBUYWJsZSh1bnNpZ25lZCBKVEluZGV4KTsKKworICAgIHZvaWQgZW1pdE1pc2NCcmFuY2hJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAgIHZvaWQgZW1pdFZGUEFyaXRoSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgICB2b2lkIGVtaXRWRlBDb252ZXJzaW9uSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgICB2b2lkIGVtaXRWRlBMb2FkU3RvcmVJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAgIHZvaWQgZW1pdFZGUExvYWRTdG9yZU11bHRpcGxlSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgICB2b2lkIGVtaXRNaXNjSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgICB2b2lkIGVtaXRORU9OTGFuZUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworICAgIHZvaWQgZW1pdE5FT05EdXBJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKyAgICB2b2lkIGVtaXRORU9OMVJlZ01vZEltbUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworICAgIHZvaWQgZW1pdE5FT04yUmVnSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisgICAgdm9pZCBlbWl0TkVPTjNSZWdJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAgIC8vLyBnZXRNYWNoaW5lT3BWYWx1ZSAtIFJldHVybiBiaW5hcnkgZW5jb2Rpbmcgb2Ygb3BlcmFuZC4gSWYgdGhlIG1hY2hpbmUKKyAgICAvLy8gb3BlcmFuZCByZXF1aXJlcyByZWxvY2F0aW9uLCByZWNvcmQgdGhlIHJlbG9jYXRpb24gYW5kIHJldHVybiB6ZXJvLgorICAgIHVuc2lnbmVkIGdldE1hY2hpbmVPcFZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKTsKKyAgICB1bnNpZ25lZCBnZXRNYWNoaW5lT3BWYWx1ZShjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBPcElkeCkgeworICAgICAgcmV0dXJuIGdldE1hY2hpbmVPcFZhbHVlKE1JLCBNSS5nZXRPcGVyYW5kKE9wSWR4KSk7CisgICAgfQorCisgICAgLy8vIGdldE1vdmkzMlZhbHVlIC0gUmV0dXJuIGJpbmFyeSBlbmNvZGluZyBvZiBvcGVyYW5kIGZvciBtb3Z3L21vdnQuIElmIHRoZQorICAgIC8vLyBtYWNoaW5lIG9wZXJhbmQgcmVxdWlyZXMgcmVsb2NhdGlvbiwgcmVjb3JkIHRoZSByZWxvY2F0aW9uIGFuZCByZXR1cm4KKyAgICAvLy8gemVyby4KKyAgICB1bnNpZ25lZCBnZXRNb3ZpMzJWYWx1ZShjb25zdCBNYWNoaW5lSW5zdHIgJk1JLGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWxvYyk7CisgICAgdW5zaWduZWQgZ2V0TW92aTMyVmFsdWUoY29uc3QgTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgT3BJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVsb2MpIHsKKyAgICAgIHJldHVybiBnZXRNb3ZpMzJWYWx1ZShNSSwgTUkuZ2V0T3BlcmFuZChPcElkeCksIFJlbG9jKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0U2hpZnRPcCAtIFJldHVybiB0aGUgc2hpZnQgb3Bjb2RlIChiaXRbNjo1XSkgb2YgdGhlIGltbWVkaWF0ZSB2YWx1ZS4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBnZXRTaGlmdE9wKHVuc2lnbmVkIEltbSkgY29uc3QgOworCisgICAgLy8vIFJvdXRpbmVzIHRoYXQgaGFuZGxlIG9wZXJhbmRzIHdoaWNoIGFkZCBtYWNoaW5lIHJlbG9jYXRpb25zIHdoaWNoIGFyZQorICAgIC8vLyBmaXhlZCB1cCBieSB0aGUgcmVsb2NhdGlvbiBzdGFnZS4KKyAgICB2b2lkIGVtaXRHbG9iYWxBZGRyZXNzKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgdW5zaWduZWQgUmVsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1heU5lZWRGYXJTdHViLCAgYm9vbCBJbmRpcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IEFDUFYgPSAwKTsKKyAgICB2b2lkIGVtaXRFeHRlcm5hbFN5bWJvbEFkZHJlc3MoY29uc3QgY2hhciAqRVMsIHVuc2lnbmVkIFJlbG9jKTsKKyAgICB2b2lkIGVtaXRDb25zdFBvb2xBZGRyZXNzKHVuc2lnbmVkIENQSSwgdW5zaWduZWQgUmVsb2MpOworICAgIHZvaWQgZW1pdEp1bXBUYWJsZUFkZHJlc3ModW5zaWduZWQgSlRJbmRleCwgdW5zaWduZWQgUmVsb2MpOworICAgIHZvaWQgZW1pdE1hY2hpbmVCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwgdW5zaWduZWQgUmVsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgSlRCYXNlID0gMCk7CisgIH07Cit9CisKK2NoYXIgQVJNQ29kZUVtaXR0ZXI6OklEID0gMDsKKworLy8vIGNyZWF0ZUFSTUpJVENvZGVFbWl0dGVyUGFzcyAtIFJldHVybiBhIHBhc3MgdGhhdCBlbWl0cyB0aGUgY29sbGVjdGVkIEFSTQorLy8vIGNvZGUgdG8gdGhlIHNwZWNpZmllZCBNQ0Ugb2JqZWN0LgorRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVBUk1KSVRDb2RlRW1pdHRlclBhc3MoQVJNQmFzZVRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJkpDRSkgeworICByZXR1cm4gbmV3IEFSTUNvZGVFbWl0dGVyKFRNLCBKQ0UpOworfQorCitib29sIEFSTUNvZGVFbWl0dGVyOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIGFzc2VydCgoTUYuZ2V0VGFyZ2V0KCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgIT0gUmVsb2M6OkRlZmF1bHQgfHwKKyAgICAgICAgICBNRi5nZXRUYXJnZXQoKS5nZXRSZWxvY2F0aW9uTW9kZWwoKSAhPSBSZWxvYzo6U3RhdGljKSAmJgorICAgICAgICAgIkpJVCByZWxvY2F0aW9uIG1vZGVsIG11c3QgYmUgc2V0IHRvIHN0YXRpYyBvciBkZWZhdWx0ISIpOworICBKVEkgPSAoKEFSTVRhcmdldE1hY2hpbmUgJilNRi5nZXRUYXJnZXQoKSkuZ2V0SklUSW5mbygpOworICBJSSA9ICgoY29uc3QgQVJNVGFyZ2V0TWFjaGluZSAmKU1GLmdldFRhcmdldCgpKS5nZXRJbnN0ckluZm8oKTsKKyAgVEQgPSAoKGNvbnN0IEFSTVRhcmdldE1hY2hpbmUgJilNRi5nZXRUYXJnZXQoKSkuZ2V0VGFyZ2V0RGF0YSgpOworICBTdWJ0YXJnZXQgPSAmVE0uZ2V0U3VidGFyZ2V0PEFSTVN1YnRhcmdldD4oKTsKKyAgTUNQRXMgPSAmTUYuZ2V0Q29uc3RhbnRQb29sKCktPmdldENvbnN0YW50cygpOworICBNSlRFcyA9IDA7CisgIGlmIChNRi5nZXRKdW1wVGFibGVJbmZvKCkpIE1KVEVzID0gJk1GLmdldEp1bXBUYWJsZUluZm8oKS0+Z2V0SnVtcFRhYmxlcygpOworICBJc1BJQyA9IFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfOworICBJc1RodW1iID0gTUYuZ2V0SW5mbzxBUk1GdW5jdGlvbkluZm8+KCktPmlzVGh1bWJGdW5jdGlvbigpOworICBKVEktPkluaXRpYWxpemUoTUYsIElzUElDKTsKKyAgTU1JID0gJmdldEFuYWx5c2lzPE1hY2hpbmVNb2R1bGVJbmZvPigpOworICBNQ0Uuc2V0TW9kdWxlSW5mbyhNTUkpOworCisgIGRvIHsKKyAgICBERUJVRyhlcnJzKCkgPDwgIkpJVFRpbmcgZnVuY3Rpb24gJyIKKyAgICAgICAgICA8PCBNRi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkgPDwgIidcbiIpOworICAgIE1DRS5zdGFydEZ1bmN0aW9uKE1GKTsKKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUJCID0gTUYuYmVnaW4oKSwgRSA9IE1GLmVuZCgpOworICAgICAgICAgTUJCICE9IEU7ICsrTUJCKSB7CisgICAgICBNQ0UuU3RhcnRNYWNoaW5lQmFzaWNCbG9jayhNQkIpOworICAgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IE1CQi0+YmVnaW4oKSwgRSA9IE1CQi0+ZW5kKCk7CisgICAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgICBlbWl0SW5zdHJ1Y3Rpb24oKkkpOworICAgIH0KKyAgfSB3aGlsZSAoTUNFLmZpbmlzaEZ1bmN0aW9uKE1GKSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gZ2V0U2hpZnRPcCAtIFJldHVybiB0aGUgc2hpZnQgb3Bjb2RlIChiaXRbNjo1XSkgb2YgdGhlIGltbWVkaWF0ZSB2YWx1ZS4KKy8vLwordW5zaWduZWQgQVJNQ29kZUVtaXR0ZXI6OmdldFNoaWZ0T3AodW5zaWduZWQgSW1tKSBjb25zdCB7CisgIHN3aXRjaCAoQVJNX0FNOjpnZXRBTTJTaGlmdE9wYyhJbW0pKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc2hpZnQgb3BjISIpOworICBjYXNlIEFSTV9BTTo6YXNyOiByZXR1cm4gMjsKKyAgY2FzZSBBUk1fQU06OmxzbDogcmV0dXJuIDA7CisgIGNhc2UgQVJNX0FNOjpsc3I6IHJldHVybiAxOworICBjYXNlIEFSTV9BTTo6cm9yOgorICBjYXNlIEFSTV9BTTo6cnJ4OiByZXR1cm4gMzsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGdldE1vdmkzMlZhbHVlIC0gUmV0dXJuIGJpbmFyeSBlbmNvZGluZyBvZiBvcGVyYW5kIGZvciBtb3Z3L21vdnQuIElmIHRoZQorLy8vIG1hY2hpbmUgb3BlcmFuZCByZXF1aXJlcyByZWxvY2F0aW9uLCByZWNvcmQgdGhlIHJlbG9jYXRpb24gYW5kIHJldHVybiB6ZXJvLgordW5zaWduZWQgQVJNQ29kZUVtaXR0ZXI6OmdldE1vdmkzMlZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlbG9jKSB7CisgIGFzc2VydCgoKFJlbG9jID09IEFSTTo6cmVsb2NfYXJtX21vdnQpIHx8IChSZWxvYyA9PSBBUk06OnJlbG9jX2FybV9tb3Z3KSkKKyAgICAgICYmICJSZWxvY2F0aW9uIHRvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGZvciBtb3Z0IG9yIG1vdnciKTsKKworICBpZiAoTU8uaXNJbW0oKSkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KE1PLmdldEltbSgpKTsKKyAgZWxzZSBpZiAoTU8uaXNHbG9iYWwoKSkKKyAgICBlbWl0R2xvYmFsQWRkcmVzcyhNTy5nZXRHbG9iYWwoKSwgUmVsb2MsIHRydWUsIGZhbHNlKTsKKyAgZWxzZSBpZiAoTU8uaXNTeW1ib2woKSkKKyAgICBlbWl0RXh0ZXJuYWxTeW1ib2xBZGRyZXNzKE1PLmdldFN5bWJvbE5hbWUoKSwgUmVsb2MpOworICBlbHNlIGlmIChNTy5pc01CQigpKQorICAgIGVtaXRNYWNoaW5lQmFzaWNCbG9jayhNTy5nZXRNQkIoKSwgUmVsb2MpOworICBlbHNlIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgZXJycygpIDw8IE1POworI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlIGZvciBtb3Z3L21vdnQiKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGdldE1hY2hpbmVPcFZhbHVlIC0gUmV0dXJuIGJpbmFyeSBlbmNvZGluZyBvZiBvcGVyYW5kLiBJZiB0aGUgbWFjaGluZQorLy8vIG9wZXJhbmQgcmVxdWlyZXMgcmVsb2NhdGlvbiwgcmVjb3JkIHRoZSByZWxvY2F0aW9uIGFuZCByZXR1cm4gemVyby4KK3Vuc2lnbmVkIEFSTUNvZGVFbWl0dGVyOjpnZXRNYWNoaW5lT3BWYWx1ZShjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgeworICBpZiAoTU8uaXNSZWcoKSkKKyAgICByZXR1cm4gQVJNUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhNTy5nZXRSZWcoKSk7CisgIGVsc2UgaWYgKE1PLmlzSW1tKCkpCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihNTy5nZXRJbW0oKSk7CisgIGVsc2UgaWYgKE1PLmlzR2xvYmFsKCkpCisgICAgZW1pdEdsb2JhbEFkZHJlc3MoTU8uZ2V0R2xvYmFsKCksIEFSTTo6cmVsb2NfYXJtX2JyYW5jaCwgdHJ1ZSwgZmFsc2UpOworICBlbHNlIGlmIChNTy5pc1N5bWJvbCgpKQorICAgIGVtaXRFeHRlcm5hbFN5bWJvbEFkZHJlc3MoTU8uZ2V0U3ltYm9sTmFtZSgpLCBBUk06OnJlbG9jX2FybV9icmFuY2gpOworICBlbHNlIGlmIChNTy5pc0NQSSgpKSB7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS5nZXREZXNjKCk7CisgICAgLy8gRm9yIFZGUCBsb2FkLCB0aGUgaW1tZWRpYXRlIG9mZnNldCBpcyBtdWx0aXBsaWVkIGJ5IDQuCisgICAgdW5zaWduZWQgUmVsb2MgPSAgKChUSUQuVFNGbGFncyAmIEFSTUlJOjpGb3JtTWFzaykgPT0gQVJNSUk6OlZGUExkU3RGcm0pCisgICAgICA/IEFSTTo6cmVsb2NfYXJtX3ZmcF9jcF9lbnRyeSA6IEFSTTo6cmVsb2NfYXJtX2NwX2VudHJ5OworICAgIGVtaXRDb25zdFBvb2xBZGRyZXNzKE1PLmdldEluZGV4KCksIFJlbG9jKTsKKyAgfSBlbHNlIGlmIChNTy5pc0pUSSgpKQorICAgIGVtaXRKdW1wVGFibGVBZGRyZXNzKE1PLmdldEluZGV4KCksIEFSTTo6cmVsb2NfYXJtX3JlbGF0aXZlKTsKKyAgZWxzZSBpZiAoTU8uaXNNQkIoKSkKKyAgICBlbWl0TWFjaGluZUJhc2ljQmxvY2soTU8uZ2V0TUJCKCksIEFSTTo6cmVsb2NfYXJtX2JyYW5jaCk7CisgIGVsc2UgeworI2lmbmRlZiBOREVCVUcKKyAgICBlcnJzKCkgPDwgTU87CisjZW5kaWYKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9CisgIHJldHVybiAwOworfQorCisvLy8gZW1pdEdsb2JhbEFkZHJlc3MgLSBFbWl0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB0byB0aGUgY29kZSBzdHJlYW0uCisvLy8KK3ZvaWQgQVJNQ29kZUVtaXR0ZXI6OmVtaXRHbG9iYWxBZGRyZXNzKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgdW5zaWduZWQgUmVsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1heU5lZWRGYXJTdHViLCBib29sIEluZGlyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgQUNQVikgeworICBNYWNoaW5lUmVsb2NhdGlvbiBNUiA9IEluZGlyZWN0CisgICAgPyBNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0SW5kaXJlY3RTeW1ib2woTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLCBSZWxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEdsb2JhbFZhbHVlICo+KEdWKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BWLCBNYXlOZWVkRmFyU3R1YikKKyAgICA6IE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRHVihNQ0UuZ2V0Q3VycmVudFBDT2Zmc2V0KCksIFJlbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8R2xvYmFsVmFsdWUgKj4oR1YpLCBBQ1BWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heU5lZWRGYXJTdHViKTsKKyAgTUNFLmFkZFJlbG9jYXRpb24oTVIpOworfQorCisvLy8gZW1pdEV4dGVybmFsU3ltYm9sQWRkcmVzcyAtIEFycmFuZ2UgZm9yIHRoZSBhZGRyZXNzIG9mIGFuIGV4dGVybmFsIHN5bWJvbCB0bworLy8vIGJlIGVtaXR0ZWQgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGZ1bmN0aW9uLCBhbmQgYWxsb3cgaXQgdG8gYmUgUEMKKy8vLyByZWxhdGl2ZS4KK3ZvaWQgQVJNQ29kZUVtaXR0ZXI6OmVtaXRFeHRlcm5hbFN5bWJvbEFkZHJlc3MoY29uc3QgY2hhciAqRVMsIHVuc2lnbmVkIFJlbG9jKSB7CisgIE1DRS5hZGRSZWxvY2F0aW9uKE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRFeHRTeW0oTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbG9jLCBFUykpOworfQorCisvLy8gZW1pdENvbnN0UG9vbEFkZHJlc3MgLSBBcnJhbmdlIGZvciB0aGUgYWRkcmVzcyBvZiBhbiBjb25zdGFudCBwb29sCisvLy8gdG8gYmUgZW1pdHRlZCB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgZnVuY3Rpb24sIGFuZCBhbGxvdyBpdCB0byBiZSBQQworLy8vIHJlbGF0aXZlLgordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdENvbnN0UG9vbEFkZHJlc3ModW5zaWduZWQgQ1BJLCB1bnNpZ25lZCBSZWxvYykgeworICAvLyBUZWxsIEpJVCBlbWl0dGVyIHdlJ2xsIHJlc29sdmUgdGhlIGFkZHJlc3MuCisgIE1DRS5hZGRSZWxvY2F0aW9uKE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRDb25zdFBvb2woTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbG9jLCBDUEksIDAsIHRydWUpKTsKK30KKworLy8vIGVtaXRKdW1wVGFibGVBZGRyZXNzIC0gQXJyYW5nZSBmb3IgdGhlIGFkZHJlc3Mgb2YgYSBqdW1wIHRhYmxlIHRvCisvLy8gYmUgZW1pdHRlZCB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgZnVuY3Rpb24sIGFuZCBhbGxvdyBpdCB0byBiZSBQQworLy8vIHJlbGF0aXZlLgordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdEp1bXBUYWJsZUFkZHJlc3ModW5zaWduZWQgSlRJbmRleCwgdW5zaWduZWQgUmVsb2MpIHsKKyAgTUNFLmFkZFJlbG9jYXRpb24oTWFjaGluZVJlbG9jYXRpb246OmdldEp1bXBUYWJsZShNQ0UuZ2V0Q3VycmVudFBDT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2MsIEpUSW5kZXgsIDAsIHRydWUpKTsKK30KKworLy8vIGVtaXRNYWNoaW5lQmFzaWNCbG9jayAtIEVtaXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGJhc2ljIGJsb2NrLgordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdE1hY2hpbmVCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWxvYywgaW50cHRyX3QgSlRCYXNlKSB7CisgIE1DRS5hZGRSZWxvY2F0aW9uKE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRCQihNQ0UuZ2V0Q3VycmVudFBDT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxvYywgQkIsIEpUQmFzZSkpOworfQorCit2b2lkIEFSTUNvZGVFbWl0dGVyOjplbWl0V29yZExFKHVuc2lnbmVkIEJpbmFyeSkgeworICBERUJVRyhlcnJzKCkgPDwgIiAgMHgiOworICAgICAgICBlcnJzKCkud3JpdGVfaGV4KEJpbmFyeSkgPDwgIlxuIik7CisgIE1DRS5lbWl0V29yZExFKEJpbmFyeSk7Cit9CisKK3ZvaWQgQVJNQ29kZUVtaXR0ZXI6OmVtaXREV29yZExFKHVpbnQ2NF90IEJpbmFyeSkgeworICBERUJVRyhlcnJzKCkgPDwgIiAgMHgiOworICAgICAgICBlcnJzKCkud3JpdGVfaGV4KEJpbmFyeSkgPDwgIlxuIik7CisgIE1DRS5lbWl0RFdvcmRMRShCaW5hcnkpOworfQorCit2b2lkIEFSTUNvZGVFbWl0dGVyOjplbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSkgeworICBERUJVRyhlcnJzKCkgPDwgIkpJVDogIiA8PCAodm9pZCopTUNFLmdldEN1cnJlbnRQQ1ZhbHVlKCkgPDwgIjpcdCIgPDwgTUkpOworCisgIE1DRS5wcm9jZXNzRGVidWdMb2MoTUkuZ2V0RGVidWdMb2MoKSwgdHJ1ZSk7CisKKyAgKytOdW1FbWl0dGVkOyAgLy8gS2VlcCB0cmFjayBvZiB0aGUgIyBvZiBtaSdzIGVtaXR0ZWQKKyAgc3dpdGNoIChNSS5nZXREZXNjKCkuVFNGbGFncyAmIEFSTUlJOjpGb3JtTWFzaykgeworICBkZWZhdWx0OiB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIGluc3RydWN0aW9uIGVuY29kaW5nIGZvcm1hdCEiKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFSTUlJOjpQc2V1ZG86CisgICAgZW1pdFBzZXVkb0luc3RydWN0aW9uKE1JKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk1JSTo6RFBGcm06CisgIGNhc2UgQVJNSUk6OkRQU29SZWdGcm06CisgICAgZW1pdERhdGFQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICBjYXNlIEFSTUlJOjpMZEZybToKKyAgY2FzZSBBUk1JSTo6U3RGcm06CisgICAgZW1pdExvYWRTdG9yZUluc3RydWN0aW9uKE1JKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk1JSTo6TGRNaXNjRnJtOgorICBjYXNlIEFSTUlJOjpTdE1pc2NGcm06CisgICAgZW1pdE1pc2NMb2FkU3RvcmVJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6OkxkU3RNdWxGcm06CisgICAgZW1pdExvYWRTdG9yZU11bHRpcGxlSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICBjYXNlIEFSTUlJOjpNdWxGcm06CisgICAgZW1pdE11bEZybUluc3RydWN0aW9uKE1JKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk1JSTo6RXh0RnJtOgorICAgIGVtaXRFeHRlbmRJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6OkFyaXRoTWlzY0ZybToKKyAgICBlbWl0TWlzY0FyaXRoSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICBjYXNlIEFSTUlJOjpTYXRGcm06CisgICAgZW1pdFNhdHVyYXRlSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICBjYXNlIEFSTUlJOjpCckZybToKKyAgICBlbWl0QnJhbmNoSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICBjYXNlIEFSTUlJOjpCck1pc2NGcm06CisgICAgZW1pdE1pc2NCcmFuY2hJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIC8vIFZGUCBpbnN0cnVjdGlvbnMuCisgIGNhc2UgQVJNSUk6OlZGUFVuYXJ5RnJtOgorICBjYXNlIEFSTUlJOjpWRlBCaW5hcnlGcm06CisgICAgZW1pdFZGUEFyaXRoSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICBjYXNlIEFSTUlJOjpWRlBDb252MUZybToKKyAgY2FzZSBBUk1JSTo6VkZQQ29udjJGcm06CisgIGNhc2UgQVJNSUk6OlZGUENvbnYzRnJtOgorICBjYXNlIEFSTUlJOjpWRlBDb252NEZybToKKyAgY2FzZSBBUk1JSTo6VkZQQ29udjVGcm06CisgICAgZW1pdFZGUENvbnZlcnNpb25JbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6OlZGUExkU3RGcm06CisgICAgZW1pdFZGUExvYWRTdG9yZUluc3RydWN0aW9uKE1JKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk1JSTo6VkZQTGRTdE11bEZybToKKyAgICBlbWl0VkZQTG9hZFN0b3JlTXVsdGlwbGVJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6OlZGUE1pc2NGcm06CisgICAgZW1pdE1pc2NJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIC8vIE5FT04gaW5zdHJ1Y3Rpb25zLgorICBjYXNlIEFSTUlJOjpOR2V0TG5Gcm06CisgIGNhc2UgQVJNSUk6Ok5TZXRMbkZybToKKyAgICBlbWl0TkVPTkxhbmVJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6Ok5EdXBGcm06CisgICAgZW1pdE5FT05EdXBJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6Ok4xUmVnTW9kSW1tRnJtOgorICAgIGVtaXRORU9OMVJlZ01vZEltbUluc3RydWN0aW9uKE1JKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk1JSTo6TjJSZWdGcm06CisgICAgZW1pdE5FT04yUmVnSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICBjYXNlIEFSTUlJOjpOM1JlZ0ZybToKKyAgICBlbWl0TkVPTjNSZWdJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIH0KKyAgTUNFLnByb2Nlc3NEZWJ1Z0xvYyhNSS5nZXREZWJ1Z0xvYygpLCBmYWxzZSk7Cit9CisKK3ZvaWQgQVJNQ29kZUVtaXR0ZXI6OmVtaXRDb25zdFBvb2xJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIHVuc2lnbmVkIENQSSA9IE1JLmdldE9wZXJhbmQoMCkuZ2V0SW1tKCk7ICAgICAgIC8vIENQIGluc3RydWN0aW9uIGluZGV4LgorICB1bnNpZ25lZCBDUEluZGV4ID0gTUkuZ2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOyAvLyBBY3R1YWwgY3AgZW50cnkgaW5kZXguCisgIGNvbnN0IE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeSAmTUNQRSA9ICgqTUNQRXMpW0NQSW5kZXhdOworCisgIC8vIFJlbWVtYmVyIHRoZSBDT05TVFBPT0xfRU5UUlkgYWRkcmVzcyBmb3IgbGF0ZXIgcmVsb2NhdGlvbi4KKyAgSlRJLT5hZGRDb25zdGFudFBvb2xFbnRyeUFkZHIoQ1BJLCBNQ0UuZ2V0Q3VycmVudFBDVmFsdWUoKSk7CisKKyAgLy8gRW1pdCBjb25zdHBvb2wgaXNsYW5kIGVudHJ5LiBJbiBtb3N0IGNhc2VzLCB0aGUgYWN0dWFsIHZhbHVlcyB3aWxsIGJlCisgIC8vIHJlc29sdmVkIGFuZCByZWxvY2F0ZWQgYWZ0ZXIgY29kZSBlbWlzc2lvbi4KKyAgaWYgKE1DUEUuaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSkgeworICAgIEFSTUNvbnN0YW50UG9vbFZhbHVlICpBQ1BWID0KKyAgICAgIHN0YXRpY19jYXN0PEFSTUNvbnN0YW50UG9vbFZhbHVlKj4oTUNQRS5WYWwuTWFjaGluZUNQVmFsKTsKKworICAgIERFQlVHKGVycnMoKSA8PCAiICAqKiBBUk0gY29uc3RhbnQgcG9vbCAjIiA8PCBDUEkgPDwgIiBAICIKKyAgICAgICAgICA8PCAodm9pZCopTUNFLmdldEN1cnJlbnRQQ1ZhbHVlKCkgPDwgIiAiIDw8ICpBQ1BWIDw8ICdcbicpOworCisgICAgYXNzZXJ0KEFDUFYtPmlzR2xvYmFsVmFsdWUoKSAmJiAidW5zdXBwb3J0ZWQgY29uc3RhbnQgcG9vbCB2YWx1ZSIpOworICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IEFDUFYtPmdldEdWKCk7CisgICAgaWYgKEdWKSB7CisgICAgICBSZWxvYzo6TW9kZWwgUmVsb2NNID0gVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCk7CisgICAgICBlbWl0R2xvYmFsQWRkcmVzcyhHViwgQVJNOjpyZWxvY19hcm1fbWFjaGluZV9jcF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzYTxGdW5jdGlvbj4oR1YpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3VidGFyZ2V0LT5HVklzSW5kaXJlY3RTeW1ib2woR1YsIFJlbG9jTSksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpQUNQVik7CisgICAgIH0gZWxzZSAgeworICAgICAgZW1pdEV4dGVybmFsU3ltYm9sQWRkcmVzcyhBQ1BWLT5nZXRTeW1ib2woKSwgQVJNOjpyZWxvY19hcm1fYWJzb2x1dGUpOworICAgIH0KKyAgICBlbWl0V29yZExFKDApOworICB9IGVsc2UgeworICAgIGNvbnN0IENvbnN0YW50ICpDViA9IE1DUEUuVmFsLkNvbnN0VmFsOworCisgICAgREVCVUcoeworICAgICAgICBlcnJzKCkgPDwgIiAgKiogQ29uc3RhbnQgcG9vbCAjIiA8PCBDUEkgPDwgIiBAICIKKyAgICAgICAgICAgICAgIDw8ICh2b2lkKilNQ0UuZ2V0Q3VycmVudFBDVmFsdWUoKSA8PCAiICI7CisgICAgICAgIGlmIChjb25zdCBGdW5jdGlvbiAqRiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihDVikpCisgICAgICAgICAgZXJycygpIDw8IEYtPmdldE5hbWUoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVycnMoKSA8PCAqQ1Y7CisgICAgICAgIGVycnMoKSA8PCAnXG4nOworICAgICAgfSk7CisKKyAgICBpZiAoY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KENWKSkgeworICAgICAgZW1pdEdsb2JhbEFkZHJlc3MoR1YsIEFSTTo6cmVsb2NfYXJtX2Fic29sdXRlLCBpc2E8RnVuY3Rpb24+KEdWKSwgZmFsc2UpOworICAgICAgZW1pdFdvcmRMRSgwKTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDVikpIHsKKyAgICAgIHVpbnQzMl90IFZhbCA9ICoodWludDMyX3QqKUNJLT5nZXRWYWx1ZSgpLmdldFJhd0RhdGEoKTsKKyAgICAgIGVtaXRXb3JkTEUoVmFsKTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50RlAgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlA+KENWKSkgeworICAgICAgaWYgKENGUC0+Z2V0VHlwZSgpLT5pc0Zsb2F0VHkoKSkKKyAgICAgICAgZW1pdFdvcmRMRShDRlAtPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKS5nZXRaRXh0VmFsdWUoKSk7CisgICAgICBlbHNlIGlmIChDRlAtPmdldFR5cGUoKS0+aXNEb3VibGVUeSgpKQorICAgICAgICBlbWl0RFdvcmRMRShDRlAtPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKS5nZXRaRXh0VmFsdWUoKSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5hYmxlIHRvIGhhbmRsZSB0aGlzIGNvbnN0YW50cG9vbCBlbnRyeSEiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5hYmxlIHRvIGhhbmRsZSB0aGlzIGNvbnN0YW50cG9vbCBlbnRyeSEiKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdE1PVmkzMmltbUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMCA9IE1JLmdldE9wZXJhbmQoMCk7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS5nZXRPcGVyYW5kKDEpOworCisgIC8vIEVtaXQgdGhlICdtb3Z3JyBpbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgQmluYXJ5ID0gMHgzMCA8PCAyMDsgIC8vIG1vdjogSW5zdHN7MjctMjB9ID0gMGIwMDExMDAwMAorCisgIHVuc2lnbmVkIExvMTYgPSBnZXRNb3ZpMzJWYWx1ZShNSSwgTU8xLCBBUk06OnJlbG9jX2FybV9tb3Z3KSAmIDB4RkZGRjsKKworICAvLyBTZXQgdGhlIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBwcmVkaWNhdGUuCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICAvLyBFbmNvZGUgUmQuCisgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgTU8wKSA8PCBBUk1JSTo6UmVnUmRTaGlmdDsKKworICAvLyBFbmNvZGUgaW1tMTYgYXMgaW1tNDppbW0xMgorICBCaW5hcnkgfD0gTG8xNiAmIDB4RkZGOyAvLyBJbnN0c3sxMS0wfSA9IGltbTEyCisgIEJpbmFyeSB8PSAoKExvMTYgPj4gMTIpICYgMHhGKSA8PCAxNjsgLy8gSW5zdHN7MTktMTZ9ID0gaW1tNAorICBlbWl0V29yZExFKEJpbmFyeSk7CisKKyAgdW5zaWduZWQgSGkxNiA9IGdldE1vdmkzMlZhbHVlKE1JLCBNTzEsIEFSTTo6cmVsb2NfYXJtX21vdnQpID4+IDE2OworICAvLyBFbWl0IHRoZSAnbW92dCcgaW5zdHJ1Y3Rpb24uCisgIEJpbmFyeSA9IDB4MzQgPDwgMjA7IC8vIG1vdnQ6IEluc3RzezI3LTIwfSA9IDBiMDAxMTAxMDAKKworICAvLyBTZXQgdGhlIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBwcmVkaWNhdGUuCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICAvLyBFbmNvZGUgUmQuCisgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgTU8wKSA8PCBBUk1JSTo6UmVnUmRTaGlmdDsKKworICAvLyBFbmNvZGUgaW1tMTYgYXMgaW1tNDppbW0xLCBzYW1lIGFzIG1vdncgYWJvdmUuCisgIEJpbmFyeSB8PSBIaTE2ICYgMHhGRkY7CisgIEJpbmFyeSB8PSAoKEhpMTYgPj4gMTIpICYgMHhGKSA8PCAxNjsKKyAgZW1pdFdvcmRMRShCaW5hcnkpOworfQorCit2b2lkIEFSTUNvZGVFbWl0dGVyOjplbWl0TU9WaTJwaWVjZXNJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzAgPSBNSS5nZXRPcGVyYW5kKDApOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUkuZ2V0T3BlcmFuZCgxKTsKKyAgYXNzZXJ0KE1PMS5pc0ltbSgpICYmIEFSTV9BTTo6aXNTT0ltbVR3b1BhcnRWYWwoTU8xLmdldEltbSgpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGEgdmFsaWQgc29faW1tIHZhbHVlISIpOworICB1bnNpZ25lZCBWMSA9IEFSTV9BTTo6Z2V0U09JbW1Ud29QYXJ0Rmlyc3QoTU8xLmdldEltbSgpKTsKKyAgdW5zaWduZWQgVjIgPSBBUk1fQU06OmdldFNPSW1tVHdvUGFydFNlY29uZChNTzEuZ2V0SW1tKCkpOworCisgIC8vIEVtaXQgdGhlICdtb3YnIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBCaW5hcnkgPSAweGQgPDwgMjE7ICAvLyBtb3Y6IEluc3RzezI0LTIxfSA9IDBiMTEwMQorCisgIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZWRpY2F0ZS4KKyAgQmluYXJ5IHw9IElJLT5nZXRQcmVkaWNhdGUoJk1JKSA8PCBBUk1JSTo6Q29uZFNoaWZ0OworCisgIC8vIEVuY29kZSBSZC4KKyAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBNTzApIDw8IEFSTUlJOjpSZWdSZFNoaWZ0OworCisgIC8vIEVuY29kZSBzb19pbW0uCisgIC8vIFNldCBiaXQgSSgyNSkgdG8gaWRlbnRpZnkgdGhpcyBpcyB0aGUgaW1tZWRpYXRlIGZvcm0gb2YgPHNoaWZ0ZXJfb3A+CisgIEJpbmFyeSB8PSAxIDw8IEFSTUlJOjpJX0JpdFNoaWZ0OworICBCaW5hcnkgfD0gZ2V0TWFjaGluZVNvSW1tT3BWYWx1ZShWMSk7CisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKKworICAvLyBOb3cgdGhlICdvcnInIGluc3RydWN0aW9uLgorICBCaW5hcnkgPSAweGMgPDwgMjE7ICAvLyBvcnI6IEluc3RzezI0LTIxfSA9IDBiMTEwMAorCisgIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZWRpY2F0ZS4KKyAgQmluYXJ5IHw9IElJLT5nZXRQcmVkaWNhdGUoJk1JKSA8PCBBUk1JSTo6Q29uZFNoaWZ0OworCisgIC8vIEVuY29kZSBSZC4KKyAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBNTzApIDw8IEFSTUlJOjpSZWdSZFNoaWZ0OworCisgIC8vIEVuY29kZSBSbi4KKyAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBNTzApIDw8IEFSTUlJOjpSZWdSblNoaWZ0OworCisgIC8vIEVuY29kZSBzb19pbW0uCisgIC8vIFNldCBiaXQgSSgyNSkgdG8gaWRlbnRpZnkgdGhpcyBpcyB0aGUgaW1tZWRpYXRlIGZvcm0gb2YgPHNoaWZ0ZXJfb3A+CisgIEJpbmFyeSB8PSAxIDw8IEFSTUlJOjpJX0JpdFNoaWZ0OworICBCaW5hcnkgfD0gZ2V0TWFjaGluZVNvSW1tT3BWYWx1ZShWMik7CisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdExFQXBjcmVsSlRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIC8vIEl0J3MgYmFzaWNhbGx5IGFkZCByLCBwYywgKExKVEkgLSAkKzgpCisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS5nZXREZXNjKCk7CisKKyAgLy8gRW1pdCB0aGUgJ2FkZCcgaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIEJpbmFyeSA9IDB4NCA8PCAyMTsgIC8vIGFkZDogSW5zdHN7MjQtMzF9ID0gMGIwMTAwCisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICAvLyBFbmNvZGUgUyBiaXQgaWYgTUkgbW9kaWZpZXMgQ1BTUi4KKyAgQmluYXJ5IHw9IGdldEFkZHJNb2RlU0JpdChNSSwgVElEKTsKKworICAvLyBFbmNvZGUgUmQuCisgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgMCkgPDwgQVJNSUk6OlJlZ1JkU2hpZnQ7CisKKyAgLy8gRW5jb2RlIFJuIHdoaWNoIGlzIFBDLgorICBCaW5hcnkgfD0gQVJNUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhBUk06OlBDKSA8PCBBUk1JSTo6UmVnUm5TaGlmdDsKKworICAvLyBFbmNvZGUgdGhlIGRpc3BsYWNlbWVudC4KKyAgQmluYXJ5IHw9IDEgPDwgQVJNSUk6OklfQml0U2hpZnQ7CisgIGVtaXRKdW1wVGFibGVBZGRyZXNzKE1JLmdldE9wZXJhbmQoMSkuZ2V0SW5kZXgoKSwgQVJNOjpyZWxvY19hcm1fanRfYmFzZSk7CisKKyAgZW1pdFdvcmRMRShCaW5hcnkpOworfQorCit2b2lkIEFSTUNvZGVFbWl0dGVyOjplbWl0UHNldWRvTW92ZUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgdW5zaWduZWQgT3Bjb2RlID0gTUkuZ2V0RGVzYygpLk9wY29kZTsKKworICAvLyBQYXJ0IG9mIGJpbmFyeSBpcyBkZXRlcm1pbmVkIGJ5IFRhYmxlR24uCisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICAvLyBFbmNvZGUgUyBiaXQgaWYgTUkgbW9kaWZpZXMgQ1BTUi4KKyAgaWYgKE9wY29kZSA9PSBBUk06Ok1PVnNybF9mbGFnIHx8IE9wY29kZSA9PSBBUk06Ok1PVnNyYV9mbGFnKQorICAgIEJpbmFyeSB8PSAxIDw8IEFSTUlJOjpTX0JpdFNoaWZ0OworCisgIC8vIEVuY29kZSByZWdpc3RlciBkZWYgaWYgdGhlcmUgaXMgb25lLgorICBCaW5hcnkgfD0gZ2V0TWFjaGluZU9wVmFsdWUoTUksIDApIDw8IEFSTUlJOjpSZWdSZFNoaWZ0OworCisgIC8vIEVuY29kZSB0aGUgc2hpZnQgb3BlcmF0aW9uLgorICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBBUk06Ok1PVnJ4OgorICAgIC8vIHJyeAorICAgIEJpbmFyeSB8PSAweDYgPDwgNDsKKyAgICBicmVhazsKKyAgY2FzZSBBUk06Ok1PVnNybF9mbGFnOgorICAgIC8vIGxzciAjMQorICAgIEJpbmFyeSB8PSAoMHgyIDw8IDQpIHwgKDEgPDwgNyk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpNT1ZzcmFfZmxhZzoKKyAgICAvLyBhc3IgIzEKKyAgICBCaW5hcnkgfD0gKDB4NCA8PCA0KSB8ICgxIDw8IDcpOworICAgIGJyZWFrOworICB9CisKKyAgLy8gRW5jb2RlIHJlZ2lzdGVyIFJtLgorICBCaW5hcnkgfD0gZ2V0TWFjaGluZU9wVmFsdWUoTUksIDEpOworCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6YWRkUENMYWJlbCh1bnNpZ25lZCBMYWJlbElEKSB7CisgIERFQlVHKGVycnMoKSA8PCAiICAqKiBMUEMiIDw8IExhYmVsSUQgPDwgIiBAICIKKyAgICAgICAgPDwgKHZvaWQqKU1DRS5nZXRDdXJyZW50UENWYWx1ZSgpIDw8ICdcbicpOworICBKVEktPmFkZFBDTGFiZWxBZGRyKExhYmVsSUQsIE1DRS5nZXRDdXJyZW50UENWYWx1ZSgpKTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdFBzZXVkb0luc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgdW5zaWduZWQgT3Bjb2RlID0gTUkuZ2V0RGVzYygpLk9wY29kZTsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJBUk1Db2RlRW1pdHRlcjo6ZW1pdFBzZXVkb0luc3RydWN0aW9uIik7CisgIGNhc2UgQVJNOjpCWDoKKyAgY2FzZSBBUk06OkJNT1ZQQ1JYOgorICBjYXNlIEFSTTo6QlhyOToKKyAgY2FzZSBBUk06OkJNT1ZQQ1JYcjk6IHsKKyAgICAvLyBGaXJzdCBlbWl0IG1vdiBsciwgcGMKKyAgICB1bnNpZ25lZCBCaW5hcnkgPSAweDAxYTBlMDBmOworICAgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKyAgICBlbWl0V29yZExFKEJpbmFyeSk7CisKKyAgICAvLyBhbmQgdGhlbiBlbWl0IHRoZSBicmFuY2guCisgICAgZW1pdE1pc2NCcmFuY2hJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBUYXJnZXRPcGNvZGU6OklOTElORUFTTTogeworICAgIC8vIFdlIGFsbG93IGlubGluZSBhc3NlbWJsZXIgbm9kZXMgd2l0aCBlbXB0eSBib2RpZXMgLSB0aGV5IGNhbgorICAgIC8vIGltcGxpY2l0bHkgZGVmaW5lIHJlZ2lzdGVycywgd2hpY2ggaXMgb2sgZm9yIEpJVC4KKyAgICBpZiAoTUkuZ2V0T3BlcmFuZCgwKS5nZXRTeW1ib2xOYW1lKClbMF0pIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiSklUIGRvZXMgbm90IHN1cHBvcnQgaW5saW5lIGFzbSEiKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBUYXJnZXRPcGNvZGU6OlBST0xPR19MQUJFTDoKKyAgY2FzZSBUYXJnZXRPcGNvZGU6OkVIX0xBQkVMOgorICAgIE1DRS5lbWl0TGFiZWwoTUkuZ2V0T3BlcmFuZCgwKS5nZXRNQ1N5bWJvbCgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRjoKKyAgY2FzZSBUYXJnZXRPcGNvZGU6OktJTEw6CisgICAgLy8gRG8gbm90aGluZy4KKyAgICBicmVhazsKKyAgY2FzZSBBUk06OkNPTlNUUE9PTF9FTlRSWToKKyAgICBlbWl0Q29uc3RQb29sSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICBjYXNlIEFSTTo6UElDQUREOiB7CisgICAgLy8gUmVtZW1iZXIgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlIFBDIGxhYmVsIGZvciByZWxvY2F0aW9uIGxhdGVyLgorICAgIGFkZFBDTGFiZWwoTUkuZ2V0T3BlcmFuZCgyKS5nZXRJbW0oKSk7CisgICAgLy8gUElDQUREIGlzIGp1c3QgYW4gYWRkIGluc3RydWN0aW9uIHRoYXQgaW1wbGljaXRseSByZWFkIHBjLgorICAgIGVtaXREYXRhUHJvY2Vzc2luZ0luc3RydWN0aW9uKE1JLCAwLCBBUk06OlBDKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFSTTo6UElDTERSOgorICBjYXNlIEFSTTo6UElDTERSQjoKKyAgY2FzZSBBUk06OlBJQ1NUUjoKKyAgY2FzZSBBUk06OlBJQ1NUUkI6IHsKKyAgICAvLyBSZW1lbWJlciBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgUEMgbGFiZWwgZm9yIHJlbG9jYXRpb24gbGF0ZXIuCisgICAgYWRkUENMYWJlbChNSS5nZXRPcGVyYW5kKDIpLmdldEltbSgpKTsKKyAgICAvLyBUaGVzZSBhcmUganVzdCBsb2FkIC8gc3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgaW1wbGljaXRseSByZWFkIHBjLgorICAgIGVtaXRMb2FkU3RvcmVJbnN0cnVjdGlvbihNSSwgMCwgQVJNOjpQQyk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBUk06OlBJQ0xEUkg6CisgIGNhc2UgQVJNOjpQSUNMRFJTSDoKKyAgY2FzZSBBUk06OlBJQ0xEUlNCOgorICBjYXNlIEFSTTo6UElDU1RSSDogeworICAgIC8vIFJlbWVtYmVyIG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBQQyBsYWJlbCBmb3IgcmVsb2NhdGlvbiBsYXRlci4KKyAgICBhZGRQQ0xhYmVsKE1JLmdldE9wZXJhbmQoMikuZ2V0SW1tKCkpOworICAgIC8vIFRoZXNlIGFyZSBqdXN0IGxvYWQgLyBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCBpbXBsaWNpdGx5IHJlYWQgcGMuCisgICAgZW1pdE1pc2NMb2FkU3RvcmVJbnN0cnVjdGlvbihNSSwgQVJNOjpQQyk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIEFSTTo6TU9WaTMyaW1tOgorICAgIGVtaXRNT1ZpMzJpbW1JbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBBUk06Ok1PVmkycGllY2VzOgorICAgIC8vIFR3byBpbnN0cnVjdGlvbnMgdG8gbWF0ZXJpYWxpemUgYSBjb25zdGFudC4KKyAgICBlbWl0TU9WaTJwaWVjZXNJbnN0cnVjdGlvbihNSSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpMRUFwY3JlbEpUOgorICAgIC8vIE1hdGVyaWFsaXplIGp1bXB0YWJsZSBhZGRyZXNzLgorICAgIGVtaXRMRUFwY3JlbEpUSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICBjYXNlIEFSTTo6TU9Wcng6CisgIGNhc2UgQVJNOjpNT1ZzcmxfZmxhZzoKKyAgY2FzZSBBUk06Ok1PVnNyYV9mbGFnOgorICAgIGVtaXRQc2V1ZG9Nb3ZlSW5zdHJ1Y3Rpb24oTUkpOworICAgIGJyZWFrOworICB9Cit9CisKK3Vuc2lnbmVkIEFSTUNvZGVFbWl0dGVyOjpnZXRNYWNoaW5lU29SZWdPcFZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wSWR4KSB7CisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBNTyk7CisKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMSA9IE1JLmdldE9wZXJhbmQoT3BJZHggKyAxKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMiA9IE1JLmdldE9wZXJhbmQoT3BJZHggKyAyKTsKKyAgQVJNX0FNOjpTaGlmdE9wYyBTT3BjID0gQVJNX0FNOjpnZXRTT1JlZ1NoT3AoTU8yLmdldEltbSgpKTsKKworICAvLyBFbmNvZGUgdGhlIHNoaWZ0IG9wY29kZS4KKyAgdW5zaWduZWQgU0JpdHMgPSAwOworICB1bnNpZ25lZCBScyA9IE1PMS5nZXRSZWcoKTsKKyAgaWYgKFJzKSB7CisgICAgLy8gU2V0IHNoaWZ0IG9wZXJhbmQgKGJpdFs3OjRdKS4KKyAgICAvLyBMU0wgLSAwMDAxCisgICAgLy8gTFNSIC0gMDAxMQorICAgIC8vIEFTUiAtIDAxMDEKKyAgICAvLyBST1IgLSAwMTExCisgICAgLy8gUlJYIC0gMDExMCBhbmQgYml0WzExOjhdIGNsZWFyLgorICAgIHN3aXRjaCAoU09wYykgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc2hpZnQgb3BjISIpOworICAgIGNhc2UgQVJNX0FNOjpsc2w6IFNCaXRzID0gMHgxOyBicmVhazsKKyAgICBjYXNlIEFSTV9BTTo6bHNyOiBTQml0cyA9IDB4MzsgYnJlYWs7CisgICAgY2FzZSBBUk1fQU06OmFzcjogU0JpdHMgPSAweDU7IGJyZWFrOworICAgIGNhc2UgQVJNX0FNOjpyb3I6IFNCaXRzID0gMHg3OyBicmVhazsKKyAgICBjYXNlIEFSTV9BTTo6cnJ4OiBTQml0cyA9IDB4NjsgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFNldCBzaGlmdCBvcGVyYW5kIChiaXRbNjo0XSkuCisgICAgLy8gTFNMIC0gMDAwCisgICAgLy8gTFNSIC0gMDEwCisgICAgLy8gQVNSIC0gMTAwCisgICAgLy8gUk9SIC0gMTEwCisgICAgc3dpdGNoIChTT3BjKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzaGlmdCBvcGMhIik7CisgICAgY2FzZSBBUk1fQU06OmxzbDogU0JpdHMgPSAweDA7IGJyZWFrOworICAgIGNhc2UgQVJNX0FNOjpsc3I6IFNCaXRzID0gMHgyOyBicmVhazsKKyAgICBjYXNlIEFSTV9BTTo6YXNyOiBTQml0cyA9IDB4NDsgYnJlYWs7CisgICAgY2FzZSBBUk1fQU06OnJvcjogU0JpdHMgPSAweDY7IGJyZWFrOworICAgIH0KKyAgfQorICBCaW5hcnkgfD0gU0JpdHMgPDwgNDsKKyAgaWYgKFNPcGMgPT0gQVJNX0FNOjpycngpCisgICAgcmV0dXJuIEJpbmFyeTsKKworICAvLyBFbmNvZGUgdGhlIHNoaWZ0IG9wZXJhdGlvbiBScyBvciBzaGlmdF9pbW0gKGV4Y2VwdCBycngpLgorICBpZiAoUnMpIHsKKyAgICAvLyBFbmNvZGUgUnMgYml0WzExOjhdLgorICAgIGFzc2VydChBUk1fQU06OmdldFNPUmVnT2Zmc2V0KE1PMi5nZXRJbW0oKSkgPT0gMCk7CisgICAgcmV0dXJuIEJpbmFyeSB8CisgICAgICAoQVJNUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhScykgPDwgQVJNSUk6OlJlZ1JzU2hpZnQpOworICB9CisKKyAgLy8gRW5jb2RlIHNoaWZ0X2ltbSBiaXRbMTE6N10uCisgIHJldHVybiBCaW5hcnkgfCBBUk1fQU06OmdldFNPUmVnT2Zmc2V0KE1PMi5nZXRJbW0oKSkgPDwgNzsKK30KKwordW5zaWduZWQgQVJNQ29kZUVtaXR0ZXI6OmdldE1hY2hpbmVTb0ltbU9wVmFsdWUodW5zaWduZWQgU29JbW0pIHsKKyAgaW50IFNvSW1tVmFsID0gQVJNX0FNOjpnZXRTT0ltbVZhbChTb0ltbSk7CisgIGFzc2VydChTb0ltbVZhbCAhPSAtMSAmJiAiTm90IGEgdmFsaWQgc29faW1tIHZhbHVlISIpOworCisgIC8vIEVuY29kZSByb3RhdGVfaW1tLgorICB1bnNpZ25lZCBCaW5hcnkgPSAoQVJNX0FNOjpnZXRTT0ltbVZhbFJvdCgodW5zaWduZWQpU29JbW1WYWwpID4+IDEpCisgICAgPDwgQVJNSUk6OlNvUm90SW1tU2hpZnQ7CisKKyAgLy8gRW5jb2RlIGltbWVkXzguCisgIEJpbmFyeSB8PSBBUk1fQU06OmdldFNPSW1tVmFsSW1tKCh1bnNpZ25lZClTb0ltbVZhbCk7CisgIHJldHVybiBCaW5hcnk7Cit9CisKK3Vuc2lnbmVkIEFSTUNvZGVFbWl0dGVyOjpnZXRBZGRyTW9kZVNCaXQoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQpIGNvbnN0IHsKKyAgZm9yICh1bnNpZ25lZCBpID0gTUkuZ2V0TnVtT3BlcmFuZHMoKSwgZSA9IFRJRC5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7IC0taSl7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpLTEpOworICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmlzRGVmKCkgJiYgTU8uZ2V0UmVnKCkgPT0gQVJNOjpDUFNSKQorICAgICAgcmV0dXJuIDEgPDwgQVJNSUk6OlNfQml0U2hpZnQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQVJNQ29kZUVtaXR0ZXI6OmVtaXREYXRhUHJvY2Vzc2luZ0luc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbXBsaWNpdFJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW1wbGljaXRSbikgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLmdldERlc2MoKTsKKworICAvLyBQYXJ0IG9mIGJpbmFyeSBpcyBkZXRlcm1pbmVkIGJ5IFRhYmxlR24uCisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICAvLyBFbmNvZGUgUyBiaXQgaWYgTUkgbW9kaWZpZXMgQ1BTUi4KKyAgQmluYXJ5IHw9IGdldEFkZHJNb2RlU0JpdChNSSwgVElEKTsKKworICAvLyBFbmNvZGUgcmVnaXN0ZXIgZGVmIGlmIHRoZXJlIGlzIG9uZS4KKyAgdW5zaWduZWQgTnVtRGVmcyA9IFRJRC5nZXROdW1EZWZzKCk7CisgIHVuc2lnbmVkIE9wSWR4ID0gMDsKKyAgaWYgKE51bURlZnMpCisgICAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBPcElkeCsrKSA8PCBBUk1JSTo6UmVnUmRTaGlmdDsKKyAgZWxzZSBpZiAoSW1wbGljaXRSZCkKKyAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBpbXBsaWNpdCB1c2UgKGUuZy4gUEMpLgorICAgIEJpbmFyeSB8PSAoQVJNUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhJbXBsaWNpdFJkKQorICAgICAgICAgICAgICAgPDwgQVJNSUk6OlJlZ1JkU2hpZnQpOworCisgIGlmIChUSUQuT3Bjb2RlID09IEFSTTo6TU9WaTE2KSB7CisgICAgICAvLyBHZXQgaW1tZWRpYXRlIGZyb20gTUkuCisgICAgICB1bnNpZ25lZCBMbzE2ID0gZ2V0TW92aTMyVmFsdWUoTUksIE1JLmdldE9wZXJhbmQoT3BJZHgpLAorICAgICAgICAgICAgICAgICAgICAgIEFSTTo6cmVsb2NfYXJtX21vdncpOworICAgICAgLy8gRW5jb2RlIGltbSB3aGljaCBpcyB0aGUgc2FtZSBhcyBpbiBlbWl0TU9WaTMyaW1tSW5zdHJ1Y3Rpb24oKS4KKyAgICAgIEJpbmFyeSB8PSBMbzE2ICYgMHhGRkY7CisgICAgICBCaW5hcnkgfD0gKChMbzE2ID4+IDEyKSAmIDB4RikgPDwgMTY7CisgICAgICBlbWl0V29yZExFKEJpbmFyeSk7CisgICAgICByZXR1cm47CisgIH0gZWxzZSBpZihUSUQuT3Bjb2RlID09IEFSTTo6TU9WVGkxNikgeworICAgICAgdW5zaWduZWQgSGkxNiA9IChnZXRNb3ZpMzJWYWx1ZShNSSwgTUkuZ2V0T3BlcmFuZChPcElkeCksCisgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6cmVsb2NfYXJtX21vdnQpID4+IDE2KTsKKyAgICAgIEJpbmFyeSB8PSBIaTE2ICYgMHhGRkY7CisgICAgICBCaW5hcnkgfD0gKChIaTE2ID4+IDEyKSAmIDB4RikgPDwgMTY7CisgICAgICBlbWl0V29yZExFKEJpbmFyeSk7CisgICAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoKFRJRC5PcGNvZGUgPT0gQVJNOjpCRkMpIHx8IChUSUQuT3Bjb2RlID09IEFSTTo6QkZJKSkgeworICAgICAgdWludDMyX3QgdiA9IH5NSS5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgICAgaW50MzJfdCBsc2IgPSBDb3VudFRyYWlsaW5nWmVyb3NfMzIodik7CisgICAgICBpbnQzMl90IG1zYiA9ICgzMiAtIENvdW50TGVhZGluZ1plcm9zXzMyKHYpKSAtIDE7CisgICAgICAvLyBJbnN0cnsyMC0xNn0gPSBtc2IsIEluc3RyezExLTd9ID0gbHNiCisgICAgICBCaW5hcnkgfD0gKG1zYiAmIDB4MUYpIDw8IDE2OworICAgICAgQmluYXJ5IHw9IChsc2IgJiAweDFGKSA8PCA3OworICAgICAgZW1pdFdvcmRMRShCaW5hcnkpOworICAgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKChUSUQuT3Bjb2RlID09IEFSTTo6VUJGWCkgfHwgKFRJRC5PcGNvZGUgPT0gQVJNOjpTQkZYKSkgeworICAgICAgLy8gRW5jb2RlIFJuIGluIEluc3RyezAtM30KKyAgICAgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgT3BJZHgrKyk7CisKKyAgICAgIHVpbnQzMl90IGxzYiA9IE1JLmdldE9wZXJhbmQoT3BJZHgrKykuZ2V0SW1tKCk7CisgICAgICB1aW50MzJfdCB3aWR0aG0xID0gTUkuZ2V0T3BlcmFuZChPcElkeCsrKS5nZXRJbW0oKSAtIDE7CisKKyAgICAgIC8vIEluc3RyezIwLTE2fSA9IHdpZHRobTEsIEluc3RyezExLTd9ID0gbHNiCisgICAgICBCaW5hcnkgfD0gKHdpZHRobTEgJiAweDFGKSA8PCAxNjsKKyAgICAgIEJpbmFyeSB8PSAobHNiICYgMHgxRikgPDwgNzsKKyAgICAgIGVtaXRXb3JkTEUoQmluYXJ5KTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmIHRoaXMgaXMgYSB0d28tYWRkcmVzcyBvcGVyYW5kLCBza2lwIGl0LiBlLmcuIE1PVkNDciBvcGVyYW5kIDEuCisgIGlmIChUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoT3BJZHgsIFRPSTo6VElFRF9UTykgIT0gLTEpCisgICAgKytPcElkeDsKKworICAvLyBFbmNvZGUgZmlyc3Qgbm9uLXNoaWZ0ZXIgcmVnaXN0ZXIgb3BlcmFuZCBpZiB0aGVyZSBpcyBvbmUuCisgIGJvb2wgaXNVbmFyeSA9IFRJRC5UU0ZsYWdzICYgQVJNSUk6OlVuYXJ5RFA7CisgIGlmICghaXNVbmFyeSkgeworICAgIGlmIChJbXBsaWNpdFJuKQorICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgaW1wbGljaXQgdXNlIChlLmcuIFBDKS4KKyAgICAgIEJpbmFyeSB8PSAoQVJNUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhJbXBsaWNpdFJuKQorICAgICAgICAgICAgICAgICA8PCBBUk1JSTo6UmVnUm5TaGlmdCk7CisgICAgZWxzZSB7CisgICAgICBCaW5hcnkgfD0gZ2V0TWFjaGluZU9wVmFsdWUoTUksIE9wSWR4KSA8PCBBUk1JSTo6UmVnUm5TaGlmdDsKKyAgICAgICsrT3BJZHg7CisgICAgfQorICB9CisKKyAgLy8gRW5jb2RlIHNoaWZ0ZXIgb3BlcmFuZC4KKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChPcElkeCk7CisgIGlmICgoVElELlRTRmxhZ3MgJiBBUk1JSTo6Rm9ybU1hc2spID09IEFSTUlJOjpEUFNvUmVnRnJtKSB7CisgICAgLy8gRW5jb2RlIFNvUmVnLgorICAgIGVtaXRXb3JkTEUoQmluYXJ5IHwgZ2V0TWFjaGluZVNvUmVnT3BWYWx1ZShNSSwgVElELCBNTywgT3BJZHgpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoTU8uaXNSZWcoKSkgeworICAgIC8vIEVuY29kZSByZWdpc3RlciBSbS4KKyAgICBlbWl0V29yZExFKEJpbmFyeSB8IEFSTVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoTU8uZ2V0UmVnKCkpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBFbmNvZGUgc29faW1tLgorICBCaW5hcnkgfD0gZ2V0TWFjaGluZVNvSW1tT3BWYWx1ZSgodW5zaWduZWQpTU8uZ2V0SW1tKCkpOworCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdExvYWRTdG9yZUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW1wbGljaXRSZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbXBsaWNpdFJuKSB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUkuZ2V0RGVzYygpOworICB1bnNpZ25lZCBGb3JtID0gVElELlRTRmxhZ3MgJiBBUk1JSTo6Rm9ybU1hc2s7CisgIGJvb2wgSXNQcmVQb3N0ID0gKFRJRC5UU0ZsYWdzICYgQVJNSUk6OkluZGV4TW9kZU1hc2spICE9IDA7CisKKyAgLy8gUGFydCBvZiBiaW5hcnkgaXMgZGV0ZXJtaW5lZCBieSBUYWJsZUduLgorICB1bnNpZ25lZCBCaW5hcnkgPSBnZXRCaW5hcnlDb2RlRm9ySW5zdHIoTUkpOworCisgIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZWRpY2F0ZQorICBCaW5hcnkgfD0gSUktPmdldFByZWRpY2F0ZSgmTUkpIDw8IEFSTUlJOjpDb25kU2hpZnQ7CisKKyAgdW5zaWduZWQgT3BJZHggPSAwOworCisgIC8vIE9wZXJhbmQgMCBvZiBhIHByZS0gYW5kIHBvc3QtaW5kZXhlZCBzdG9yZSBpcyB0aGUgYWRkcmVzcyBiYXNlCisgIC8vIHdyaXRlYmFjay4gU2tpcCBpdC4KKyAgYm9vbCBTa2lwcGVkID0gZmFsc2U7CisgIGlmIChJc1ByZVBvc3QgJiYgRm9ybSA9PSBBUk1JSTo6U3RGcm0pIHsKKyAgICArK09wSWR4OworICAgIFNraXBwZWQgPSB0cnVlOworICB9CisKKyAgLy8gU2V0IGZpcnN0IG9wZXJhbmQKKyAgaWYgKEltcGxpY2l0UmQpCisgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgaW1wbGljaXQgdXNlIChlLmcuIFBDKS4KKyAgICBCaW5hcnkgfD0gKEFSTVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoSW1wbGljaXRSZCkKKyAgICAgICAgICAgICAgIDw8IEFSTUlJOjpSZWdSZFNoaWZ0KTsKKyAgZWxzZQorICAgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgT3BJZHgrKykgPDwgQVJNSUk6OlJlZ1JkU2hpZnQ7CisKKyAgLy8gU2V0IHNlY29uZCBvcGVyYW5kCisgIGlmIChJbXBsaWNpdFJuKQorICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGltcGxpY2l0IHVzZSAoZS5nLiBQQykuCisgICAgQmluYXJ5IHw9IChBUk1SZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKEltcGxpY2l0Um4pCisgICAgICAgICAgICAgICA8PCBBUk1JSTo6UmVnUm5TaGlmdCk7CisgIGVsc2UKKyAgICBCaW5hcnkgfD0gZ2V0TWFjaGluZU9wVmFsdWUoTUksIE9wSWR4KyspIDw8IEFSTUlJOjpSZWdSblNoaWZ0OworCisgIC8vIElmIHRoaXMgaXMgYSB0d28tYWRkcmVzcyBvcGVyYW5kLCBza2lwIGl0LiBlLmcuIExEUl9QUkUuCisgIGlmICghU2tpcHBlZCAmJiBUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoT3BJZHgsIFRPSTo6VElFRF9UTykgIT0gLTEpCisgICAgKytPcElkeDsKKworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8yID0gTUkuZ2V0T3BlcmFuZChPcElkeCk7CisgIHVuc2lnbmVkIEFNMk9wYyA9IChJbXBsaWNpdFJuID09IEFSTTo6UEMpCisgICAgPyAwIDogTUkuZ2V0T3BlcmFuZChPcElkeCsxKS5nZXRJbW0oKTsKKworICAvLyBTZXQgYml0IFUoMjMpIGFjY29yZGluZyB0byBzaWduIG9mIGltbWVkIHZhbHVlIChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkuCisgIEJpbmFyeSB8PSAoKEFSTV9BTTo6Z2V0QU0yT3AoQU0yT3BjKSA9PSBBUk1fQU06OmFkZCA/IDEgOiAwKSA8PAorICAgICAgICAgICAgIEFSTUlJOjpVX0JpdFNoaWZ0KTsKKyAgaWYgKCFNTzIuZ2V0UmVnKCkpIHsgLy8gaXMgaW1tZWRpYXRlCisgICAgaWYgKEFSTV9BTTo6Z2V0QU0yT2Zmc2V0KEFNMk9wYykpCisgICAgICAvLyBTZXQgdGhlIHZhbHVlIG9mIG9mZnNldF8xMiBmaWVsZAorICAgICAgQmluYXJ5IHw9IEFSTV9BTTo6Z2V0QU0yT2Zmc2V0KEFNMk9wYyk7CisgICAgZW1pdFdvcmRMRShCaW5hcnkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNldCBiaXQgSSgyNSksIGJlY2F1c2UgdGhpcyBpcyBub3QgaW4gaW1tZWRpYXRlIGVuY29uZGluZy4KKyAgQmluYXJ5IHw9IDEgPDwgQVJNSUk6OklfQml0U2hpZnQ7CisgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihNTzIuZ2V0UmVnKCkpKTsKKyAgLy8gU2V0IGJpdFszOjBdIHRvIHRoZSBjb3JyZXNwb25kaW5nIFJtIHJlZ2lzdGVyCisgIEJpbmFyeSB8PSBBUk1SZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKE1PMi5nZXRSZWcoKSk7CisKKyAgLy8gSWYgdGhpcyBpbnN0ciBpcyBpbiBzY2FsZWQgcmVnaXN0ZXIgb2Zmc2V0L2luZGV4IGluc3RydWN0aW9uLCBzZXQKKyAgLy8gc2hpZnRfaW1tZWQoYml0WzExOjddKSBhbmQgc2hpZnQoYml0WzY6NV0pIGZpZWxkcy4KKyAgaWYgKHVuc2lnbmVkIFNoSW1tID0gQVJNX0FNOjpnZXRBTTJPZmZzZXQoQU0yT3BjKSkgeworICAgIEJpbmFyeSB8PSBnZXRTaGlmdE9wKEFNMk9wYykgPDwgQVJNSUk6OlNoaWZ0SW1tU2hpZnQ7ICAvLyBzaGlmdAorICAgIEJpbmFyeSB8PSBTaEltbSAgICAgICAgICAgICAgPDwgQVJNSUk6OlNoaWZ0U2hpZnQ7ICAgICAvLyBzaGlmdF9pbW1lZAorICB9CisKKyAgZW1pdFdvcmRMRShCaW5hcnkpOworfQorCit2b2lkIEFSTUNvZGVFbWl0dGVyOjplbWl0TWlzY0xvYWRTdG9yZUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEltcGxpY2l0Um4pIHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS5nZXREZXNjKCk7CisgIHVuc2lnbmVkIEZvcm0gPSBUSUQuVFNGbGFncyAmIEFSTUlJOjpGb3JtTWFzazsKKyAgYm9vbCBJc1ByZVBvc3QgPSAoVElELlRTRmxhZ3MgJiBBUk1JSTo6SW5kZXhNb2RlTWFzaykgIT0gMDsKKworICAvLyBQYXJ0IG9mIGJpbmFyeSBpcyBkZXRlcm1pbmVkIGJ5IFRhYmxlR24uCisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICB1bnNpZ25lZCBPcElkeCA9IDA7CisKKyAgLy8gT3BlcmFuZCAwIG9mIGEgcHJlLSBhbmQgcG9zdC1pbmRleGVkIHN0b3JlIGlzIHRoZSBhZGRyZXNzIGJhc2UKKyAgLy8gd3JpdGViYWNrLiBTa2lwIGl0LgorICBib29sIFNraXBwZWQgPSBmYWxzZTsKKyAgaWYgKElzUHJlUG9zdCAmJiBGb3JtID09IEFSTUlJOjpTdE1pc2NGcm0pIHsKKyAgICArK09wSWR4OworICAgIFNraXBwZWQgPSB0cnVlOworICB9CisKKyAgLy8gU2V0IGZpcnN0IG9wZXJhbmQKKyAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBPcElkeCsrKSA8PCBBUk1JSTo6UmVnUmRTaGlmdDsKKworICAvLyBTa2lwIExEUkQgYW5kIFNUUkQncyBzZWNvbmQgb3BlcmFuZC4KKyAgaWYgKFRJRC5PcGNvZGUgPT0gQVJNOjpMRFJEIHx8IFRJRC5PcGNvZGUgPT0gQVJNOjpTVFJEKQorICAgICsrT3BJZHg7CisKKyAgLy8gU2V0IHNlY29uZCBvcGVyYW5kCisgIGlmIChJbXBsaWNpdFJuKQorICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGltcGxpY2l0IHVzZSAoZS5nLiBQQykuCisgICAgQmluYXJ5IHw9IChBUk1SZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKEltcGxpY2l0Um4pCisgICAgICAgICAgICAgICA8PCBBUk1JSTo6UmVnUm5TaGlmdCk7CisgIGVsc2UKKyAgICBCaW5hcnkgfD0gZ2V0TWFjaGluZU9wVmFsdWUoTUksIE9wSWR4KyspIDw8IEFSTUlJOjpSZWdSblNoaWZ0OworCisgIC8vIElmIHRoaXMgaXMgYSB0d28tYWRkcmVzcyBvcGVyYW5kLCBza2lwIGl0LiBlLmcuIExEUkhfUE9TVC4KKyAgaWYgKCFTa2lwcGVkICYmIFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChPcElkeCwgVE9JOjpUSUVEX1RPKSAhPSAtMSkKKyAgICArK09wSWR4OworCisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzIgPSBNSS5nZXRPcGVyYW5kKE9wSWR4KTsKKyAgdW5zaWduZWQgQU0zT3BjID0gKEltcGxpY2l0Um4gPT0gQVJNOjpQQykKKyAgICA/IDAgOiBNSS5nZXRPcGVyYW5kKE9wSWR4KzEpLmdldEltbSgpOworCisgIC8vIFNldCBiaXQgVSgyMykgYWNjb3JkaW5nIHRvIHNpZ24gb2YgaW1tZWQgdmFsdWUgKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKQorICBCaW5hcnkgfD0gKChBUk1fQU06OmdldEFNM09wKEFNM09wYykgPT0gQVJNX0FNOjphZGQgPyAxIDogMCkgPDwKKyAgICAgICAgICAgICBBUk1JSTo6VV9CaXRTaGlmdCk7CisKKyAgLy8gSWYgdGhpcyBpbnN0ciBpcyBpbiByZWdpc3RlciBvZmZzZXQvaW5kZXggZW5jb2RpbmcsIHNldCBiaXRbMzowXQorICAvLyB0byB0aGUgY29ycmVzcG9uZGluZyBSbSByZWdpc3Rlci4KKyAgaWYgKE1PMi5nZXRSZWcoKSkgeworICAgIEJpbmFyeSB8PSBBUk1SZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKE1PMi5nZXRSZWcoKSk7CisgICAgZW1pdFdvcmRMRShCaW5hcnkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRoaXMgaW5zdHIgaXMgaW4gaW1tZWRpYXRlIG9mZnNldC9pbmRleCBlbmNvZGluZywgc2V0IGJpdCAyMiB0byAxLgorICBCaW5hcnkgfD0gMSA8PCBBUk1JSTo6QU0zX0lfQml0U2hpZnQ7CisgIGlmICh1bnNpZ25lZCBJbW1PZmZzID0gQVJNX0FNOjpnZXRBTTNPZmZzZXQoQU0zT3BjKSkgeworICAgIC8vIFNldCBvcGVyYW5kcworICAgIEJpbmFyeSB8PSAoSW1tT2ZmcyA+PiA0KSA8PCBBUk1JSTo6SW1tSGlTaGlmdDsgIC8vIGltbWVkSAorICAgIEJpbmFyeSB8PSAoSW1tT2ZmcyAmIDB4Rik7ICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkTAorICB9CisKKyAgZW1pdFdvcmRMRShCaW5hcnkpOworfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0QWRkck1vZGVVUEJpdHModW5zaWduZWQgTW9kZSkgeworICB1bnNpZ25lZCBCaW5hcnkgPSAwOworCisgIC8vIFNldCBhZGRyZXNzaW5nIG1vZGUgYnkgbW9kaWZ5aW5nIGJpdHMgVSgyMykgYW5kIFAoMjQpCisgIC8vIElBIC0gSW5jcmVtZW50IGFmdGVyICAtIGJpdCBVID0gMSBhbmQgYml0IFAgPSAwCisgIC8vIElCIC0gSW5jcmVtZW50IGJlZm9yZSAtIGJpdCBVID0gMSBhbmQgYml0IFAgPSAxCisgIC8vIERBIC0gRGVjcmVtZW50IGFmdGVyICAtIGJpdCBVID0gMCBhbmQgYml0IFAgPSAwCisgIC8vIERCIC0gRGVjcmVtZW50IGJlZm9yZSAtIGJpdCBVID0gMCBhbmQgYml0IFAgPSAxCisgIHN3aXRjaCAoTW9kZSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGFkZHJlc3Npbmcgc3ViLW1vZGUhIik7CisgIGNhc2UgQVJNX0FNOjpkYTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgIGNhc2UgQVJNX0FNOjpkYjogQmluYXJ5IHw9IDB4MSA8PCBBUk1JSTo6UF9CaXRTaGlmdDsgYnJlYWs7CisgIGNhc2UgQVJNX0FNOjppYTogQmluYXJ5IHw9IDB4MSA8PCBBUk1JSTo6VV9CaXRTaGlmdDsgYnJlYWs7CisgIGNhc2UgQVJNX0FNOjppYjogQmluYXJ5IHw9IDB4MyA8PCBBUk1JSTo6VV9CaXRTaGlmdDsgYnJlYWs7CisgIH0KKworICByZXR1cm4gQmluYXJ5OworfQorCit2b2lkIEFSTUNvZGVFbWl0dGVyOjplbWl0TG9hZFN0b3JlTXVsdGlwbGVJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUkuZ2V0RGVzYygpOworICBib29sIElzVXBkYXRpbmcgPSAoVElELlRTRmxhZ3MgJiBBUk1JSTo6SW5kZXhNb2RlTWFzaykgIT0gMDsKKworICAvLyBQYXJ0IG9mIGJpbmFyeSBpcyBkZXRlcm1pbmVkIGJ5IFRhYmxlR24uCisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICAvLyBTa2lwIG9wZXJhbmQgMCBvZiBhbiBpbnN0cnVjdGlvbiB3aXRoIGJhc2UgcmVnaXN0ZXIgdXBkYXRlLgorICB1bnNpZ25lZCBPcElkeCA9IDA7CisgIGlmIChJc1VwZGF0aW5nKQorICAgICsrT3BJZHg7CisKKyAgLy8gU2V0IGJhc2UgYWRkcmVzcyBvcGVyYW5kCisgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgT3BJZHgrKykgPDwgQVJNSUk6OlJlZ1JuU2hpZnQ7CisKKyAgLy8gU2V0IGFkZHJlc3NpbmcgbW9kZSBieSBtb2RpZnlpbmcgYml0cyBVKDIzKSBhbmQgUCgyNCkKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChPcElkeCsrKTsKKyAgQmluYXJ5IHw9IGdldEFkZHJNb2RlVVBCaXRzKEFSTV9BTTo6Z2V0QU00U3ViTW9kZShNTy5nZXRJbW0oKSkpOworCisgIC8vIFNldCBiaXQgVygyMSkKKyAgaWYgKElzVXBkYXRpbmcpCisgICAgQmluYXJ5IHw9IDB4MSA8PCBBUk1JSTo6V19CaXRTaGlmdDsKKworICAvLyBTZXQgcmVnaXN0ZXJzCisgIGZvciAodW5zaWduZWQgaSA9IE9wSWR4KzIsIGUgPSBNSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmlzSW1wbGljaXQoKSkKKyAgICAgIGJyZWFrOworICAgIHVuc2lnbmVkIFJlZ051bSA9IEFSTVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoTU8uZ2V0UmVnKCkpOworICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihNTy5nZXRSZWcoKSkgJiYKKyAgICAgICAgICAgUmVnTnVtIDwgMTYpOworICAgIEJpbmFyeSB8PSAweDEgPDwgUmVnTnVtOworICB9CisKKyAgZW1pdFdvcmRMRShCaW5hcnkpOworfQorCit2b2lkIEFSTUNvZGVFbWl0dGVyOjplbWl0TXVsRnJtSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSkgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLmdldERlc2MoKTsKKworICAvLyBQYXJ0IG9mIGJpbmFyeSBpcyBkZXRlcm1pbmVkIGJ5IFRhYmxlR24uCisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICAvLyBFbmNvZGUgUyBiaXQgaWYgTUkgbW9kaWZpZXMgQ1BTUi4KKyAgQmluYXJ5IHw9IGdldEFkZHJNb2RlU0JpdChNSSwgVElEKTsKKworICAvLyAzMngzMi0+NjRiaXQgb3BlcmF0aW9ucyBoYXZlIHR3byBkZXN0aW5hdGlvbiByZWdpc3RlcnMuIFRoZSBudW1iZXIKKyAgLy8gb2YgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgd2lsbCB0ZWxsIHVzIGlmIHRoYXQncyB3aGF0IHdlJ3JlIGRlYWxpbmcgd2l0aC4KKyAgdW5zaWduZWQgT3BJZHggPSAwOworICBpZiAoVElELmdldE51bURlZnMoKSA9PSAyKQorICAgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZSAoTUksIE9wSWR4KyspIDw8IEFSTUlJOjpSZWdSZExvU2hpZnQ7CisKKyAgLy8gRW5jb2RlIFJkCisgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgT3BJZHgrKykgPDwgQVJNSUk6OlJlZ1JkSGlTaGlmdDsKKworICAvLyBFbmNvZGUgUm0KKyAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBPcElkeCsrKTsKKworICAvLyBFbmNvZGUgUnMKKyAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBPcElkeCsrKSA8PCBBUk1JSTo6UmVnUnNTaGlmdDsKKworICAvLyBNYW55IG11bHRpcGxlIGluc3RydWN0aW9ucyAoZS5nLiBNTEEpIGhhdmUgdGhyZWUgc3JjIG9wZXJhbmRzLiBFbmNvZGUKKyAgLy8gaXQgYXMgUm4gKGZvciBtdWx0aXBseSwgdGhhdCdzIGluIHRoZSBzYW1lIG9mZnNldCBhcyBSZExvLgorICBpZiAoVElELmdldE51bU9wZXJhbmRzKCkgPiBPcElkeCAmJgorICAgICAgIVRJRC5PcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkgJiYKKyAgICAgICFUSUQuT3BJbmZvW09wSWR4XS5pc09wdGlvbmFsRGVmKCkpCisgICAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBPcElkeCkgPDwgQVJNSUk6OlJlZ1JkTG9TaGlmdDsKKworICBlbWl0V29yZExFKEJpbmFyeSk7Cit9CisKK3ZvaWQgQVJNQ29kZUVtaXR0ZXI6OmVtaXRFeHRlbmRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUkuZ2V0RGVzYygpOworCisgIC8vIFBhcnQgb2YgYmluYXJ5IGlzIGRldGVybWluZWQgYnkgVGFibGVHbi4KKyAgdW5zaWduZWQgQmluYXJ5ID0gZ2V0QmluYXJ5Q29kZUZvckluc3RyKE1JKTsKKworICAvLyBTZXQgdGhlIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBwcmVkaWNhdGUKKyAgQmluYXJ5IHw9IElJLT5nZXRQcmVkaWNhdGUoJk1JKSA8PCBBUk1JSTo6Q29uZFNoaWZ0OworCisgIHVuc2lnbmVkIE9wSWR4ID0gMDsKKworICAvLyBFbmNvZGUgUmQKKyAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBPcElkeCsrKSA8PCBBUk1JSTo6UmVnUmRTaGlmdDsKKworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUkuZ2V0T3BlcmFuZChPcElkeCsrKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMiA9IE1JLmdldE9wZXJhbmQoT3BJZHgpOworICBpZiAoTU8yLmlzUmVnKCkpIHsKKyAgICAvLyBUd28gcmVnaXN0ZXIgb3BlcmFuZCBmb3JtLgorICAgIC8vIEVuY29kZSBSbi4KKyAgICBCaW5hcnkgfD0gZ2V0TWFjaGluZU9wVmFsdWUoTUksIE1PMSkgPDwgQVJNSUk6OlJlZ1JuU2hpZnQ7CisKKyAgICAvLyBFbmNvZGUgUm0uCisgICAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBNTzIpOworICAgICsrT3BJZHg7CisgIH0gZWxzZSB7CisgICAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBNTzEpOworICB9CisKKyAgLy8gRW5jb2RlIHJvdCBpbW0gKDAsIDgsIDE2LCBvciAyNCkgaWYgaXQgaGFzIGEgcm90YXRlIGltbWVkaWF0ZSBvcGVyYW5kLgorICBpZiAoTUkuZ2V0T3BlcmFuZChPcElkeCkuaXNJbW0oKSAmJgorICAgICAgIVRJRC5PcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkgJiYKKyAgICAgICFUSUQuT3BJbmZvW09wSWR4XS5pc09wdGlvbmFsRGVmKCkpCisgICAgQmluYXJ5IHw9IChnZXRNYWNoaW5lT3BWYWx1ZShNSSwgT3BJZHgpIC8gOCkgPDwgQVJNSUk6OkV4dFJvdEltbVNoaWZ0OworCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdE1pc2NBcml0aEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS5nZXREZXNjKCk7CisKKyAgLy8gUGFydCBvZiBiaW5hcnkgaXMgZGV0ZXJtaW5lZCBieSBUYWJsZUduLgorICB1bnNpZ25lZCBCaW5hcnkgPSBnZXRCaW5hcnlDb2RlRm9ySW5zdHIoTUkpOworCisgIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZWRpY2F0ZQorICBCaW5hcnkgfD0gSUktPmdldFByZWRpY2F0ZSgmTUkpIDw8IEFSTUlJOjpDb25kU2hpZnQ7CisKKyAgdW5zaWduZWQgT3BJZHggPSAwOworCisgIC8vIEVuY29kZSBSZAorICBCaW5hcnkgfD0gZ2V0TWFjaGluZU9wVmFsdWUoTUksIE9wSWR4KyspIDw8IEFSTUlJOjpSZWdSZFNoaWZ0OworCisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoT3BJZHgrKyk7CisgIGlmIChPcElkeCA9PSBUSUQuZ2V0TnVtT3BlcmFuZHMoKSB8fAorICAgICAgVElELk9wSW5mb1tPcElkeF0uaXNQcmVkaWNhdGUoKSB8fAorICAgICAgVElELk9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpKSB7CisgICAgLy8gRW5jb2RlIFJtIGFuZCBpdCdzIGRvbmUuCisgICAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBNTyk7CisgICAgZW1pdFdvcmRMRShCaW5hcnkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEVuY29kZSBSbi4KKyAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBNTykgPDwgQVJNSUk6OlJlZ1JuU2hpZnQ7CisKKyAgLy8gRW5jb2RlIFJtLgorICBCaW5hcnkgfD0gZ2V0TWFjaGluZU9wVmFsdWUoTUksIE9wSWR4KyspOworCisgIC8vIEVuY29kZSBzaGlmdF9pbW0uCisgIHVuc2lnbmVkIFNoaWZ0QW10ID0gTUkuZ2V0T3BlcmFuZChPcElkeCkuZ2V0SW1tKCk7CisgIGFzc2VydChTaGlmdEFtdCA8IDMyICYmICJzaGlmdF9pbW0gcmFuZ2UgaXMgMCB0byAzMSEiKTsKKyAgQmluYXJ5IHw9IFNoaWZ0QW10IDw8IEFSTUlJOjpTaGlmdFNoaWZ0OworCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdFNhdHVyYXRlSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSkgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLmdldERlc2MoKTsKKworICAvLyBQYXJ0IG9mIGJpbmFyeSBpcyBkZXRlcm1pbmVkIGJ5IFRhYmxlR2VuLgorICB1bnNpZ25lZCBCaW5hcnkgPSBnZXRCaW5hcnlDb2RlRm9ySW5zdHIoTUkpOworCisgIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZWRpY2F0ZQorICBCaW5hcnkgfD0gSUktPmdldFByZWRpY2F0ZSgmTUkpIDw8IEFSTUlJOjpDb25kU2hpZnQ7CisKKyAgLy8gRW5jb2RlIFJkCisgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgMCkgPDwgQVJNSUk6OlJlZ1JkU2hpZnQ7CisKKyAgLy8gRW5jb2RlIHNhdHVyYXRlIGJpdCBwb3NpdGlvbi4KKyAgdW5zaWduZWQgUG9zID0gTUkuZ2V0T3BlcmFuZCgxKS5nZXRJbW0oKTsKKyAgaWYgKFRJRC5PcGNvZGUgPT0gQVJNOjpTU0FUbHNsIHx8CisgICAgICBUSUQuT3Bjb2RlID09IEFSTTo6U1NBVGFzciB8fAorICAgICAgVElELk9wY29kZSA9PSBBUk06OlNTQVQxNikKKyAgICBQb3MgLT0gMTsKKyAgYXNzZXJ0KChQb3MgPCAxNiB8fCAoUG9zIDwgMzIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgVElELk9wY29kZSAhPSBBUk06OlNTQVQxNiAmJgorICAgICAgICAgICAgICAgICAgICAgICBUSUQuT3Bjb2RlICE9IEFSTTo6VVNBVDE2KSkgJiYKKyAgICAgICAgICJzYXR1cmF0ZSBiaXQgcG9zaXRpb24gb3V0IG9mIHJhbmdlIik7CisgIEJpbmFyeSB8PSBQb3MgPDwgMTY7CisKKyAgLy8gRW5jb2RlIFJtCisgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgMik7CisKKyAgLy8gRW5jb2RlIHNoaWZ0X2ltbS4KKyAgaWYgKFRJRC5nZXROdW1PcGVyYW5kcygpID09IDQpIHsKKyAgICB1bnNpZ25lZCBTaGlmdEFtdCA9IE1JLmdldE9wZXJhbmQoMykuZ2V0SW1tKCk7CisgICAgaWYgKFNoaWZ0QW10ID09IDMyICYmCisgICAgICAgIChUSUQuT3Bjb2RlID09IEFSTTo6U1NBVGFzciB8fCBUSUQuT3Bjb2RlID09IEFSTTo6VVNBVGFzcikpCisgICAgICBTaGlmdEFtdCA9IDA7CisgICAgYXNzZXJ0KFNoaWZ0QW10IDwgMzIgJiYgInNoaWZ0X2ltbSByYW5nZSBpcyAwIHRvIDMxISIpOworICAgIEJpbmFyeSB8PSBTaGlmdEFtdCA8PCBBUk1JSTo6U2hpZnRTaGlmdDsKKyAgfQorCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdEJyYW5jaEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS5nZXREZXNjKCk7CisKKyAgaWYgKFRJRC5PcGNvZGUgPT0gQVJNOjpUUHNvZnQpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJBUk06OlRQc29mdCBGSVhNRSIpOyAvLyBGSVhNRQorICB9CisKKyAgLy8gUGFydCBvZiBiaW5hcnkgaXMgZGV0ZXJtaW5lZCBieSBUYWJsZUduLgorICB1bnNpZ25lZCBCaW5hcnkgPSBnZXRCaW5hcnlDb2RlRm9ySW5zdHIoTUkpOworCisgIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZWRpY2F0ZQorICBCaW5hcnkgfD0gSUktPmdldFByZWRpY2F0ZSgmTUkpIDw8IEFSTUlJOjpDb25kU2hpZnQ7CisKKyAgLy8gU2V0IHNpZ25lZF9pbW1lZF8yNCBmaWVsZAorICBCaW5hcnkgfD0gZ2V0TWFjaGluZU9wVmFsdWUoTUksIDApOworCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdElubGluZUp1bXBUYWJsZSh1bnNpZ25lZCBKVEluZGV4KSB7CisgIC8vIFJlbWVtYmVyIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGlubGluZSBqdW1wIHRhYmxlLgorICB1aW50cHRyX3QgSlRCYXNlID0gTUNFLmdldEN1cnJlbnRQQ1ZhbHVlKCk7CisgIEpUSS0+YWRkSnVtcFRhYmxlQmFzZUFkZHIoSlRJbmRleCwgSlRCYXNlKTsKKyAgREVCVUcoZXJycygpIDw8ICIgICoqIEp1bXAgVGFibGUgIyIgPDwgSlRJbmRleCA8PCAiIEAgIiA8PCAodm9pZCopSlRCYXNlCisgICAgICAgICAgICAgICA8PCAnXG4nKTsKKworICAvLyBOb3cgZW1pdCB0aGUganVtcCB0YWJsZSBlbnRyaWVzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+ICZNQkJzID0gKCpNSlRFcylbSlRJbmRleF0uTUJCczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1CQnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChJc1BJQykKKyAgICAgIC8vIERlc3RCQiBhZGRyZXNzIC0gSlQgYmFzZS4KKyAgICAgIGVtaXRNYWNoaW5lQmFzaWNCbG9jayhNQkJzW2ldLCBBUk06OnJlbG9jX2FybV9waWNfanQsIEpUQmFzZSk7CisgICAgZWxzZQorICAgICAgLy8gQWJzb2x1dGUgRGVzdEJCIGFkZHJlc3MuCisgICAgICBlbWl0TWFjaGluZUJhc2ljQmxvY2soTUJCc1tpXSwgQVJNOjpyZWxvY19hcm1fYWJzb2x1dGUpOworICAgIGVtaXRXb3JkTEUoMCk7CisgIH0KK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdE1pc2NCcmFuY2hJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUkuZ2V0RGVzYygpOworCisgIC8vIEhhbmRsZSBqdW1wIHRhYmxlcy4KKyAgaWYgKFRJRC5PcGNvZGUgPT0gQVJNOjpCUl9KVHIgfHwgVElELk9wY29kZSA9PSBBUk06OkJSX0pUYWRkKSB7CisgICAgLy8gRmlyc3QgZW1pdCBhIGxkciBwYywgW10gaW5zdHJ1Y3Rpb24uCisgICAgZW1pdERhdGFQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oTUksIEFSTTo6UEMpOworCisgICAgLy8gVGhlbiBlbWl0IHRoZSBpbmxpbmUganVtcCB0YWJsZS4KKyAgICB1bnNpZ25lZCBKVEluZGV4ID0KKyAgICAgIChUSUQuT3Bjb2RlID09IEFSTTo6QlJfSlRyKQorICAgICAgPyBNSS5nZXRPcGVyYW5kKDEpLmdldEluZGV4KCkgOiBNSS5nZXRPcGVyYW5kKDIpLmdldEluZGV4KCk7CisgICAgZW1pdElubGluZUp1bXBUYWJsZShKVEluZGV4KTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoVElELk9wY29kZSA9PSBBUk06OkJSX0pUbSkgeworICAgIC8vIEZpcnN0IGVtaXQgYSBsZHIgcGMsIFtdIGluc3RydWN0aW9uLgorICAgIGVtaXRMb2FkU3RvcmVJbnN0cnVjdGlvbihNSSwgQVJNOjpQQyk7CisKKyAgICAvLyBUaGVuIGVtaXQgdGhlIGlubGluZSBqdW1wIHRhYmxlLgorICAgIGVtaXRJbmxpbmVKdW1wVGFibGUoTUkuZ2V0T3BlcmFuZCgzKS5nZXRJbmRleCgpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBQYXJ0IG9mIGJpbmFyeSBpcyBkZXRlcm1pbmVkIGJ5IFRhYmxlR24uCisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICBpZiAoVElELk9wY29kZSA9PSBBUk06OkJYX1JFVCB8fCBUSUQuT3Bjb2RlID09IEFSTTo6TU9WUENMUikKKyAgICAvLyBUaGUgcmV0dXJuIHJlZ2lzdGVyIGlzIExSLgorICAgIEJpbmFyeSB8PSBBUk1SZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKEFSTTo6TFIpOworICBlbHNlCisgICAgLy8gb3RoZXJ3aXNlLCBzZXQgdGhlIHJldHVybiByZWdpc3RlcgorICAgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgMCk7CisKKyAgZW1pdFdvcmRMRShCaW5hcnkpOworfQorCitzdGF0aWMgdW5zaWduZWQgZW5jb2RlVkZQUmQoY29uc3QgTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgT3BJZHgpIHsKKyAgdW5zaWduZWQgUmVnRCA9IE1JLmdldE9wZXJhbmQoT3BJZHgpLmdldFJlZygpOworICB1bnNpZ25lZCBCaW5hcnkgPSAwOworICBib29sIGlzU1BWRlAgPSBmYWxzZTsKKyAgUmVnRCA9IEFSTVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoUmVnRCwgJmlzU1BWRlApOworICBpZiAoIWlzU1BWRlApCisgICAgQmluYXJ5IHw9ICAgUmVnRCAgICAgICAgICAgICAgIDw8IEFSTUlJOjpSZWdSZFNoaWZ0OworICBlbHNlIHsKKyAgICBCaW5hcnkgfD0gKChSZWdEICYgMHgxRSkgPj4gMSkgPDwgQVJNSUk6OlJlZ1JkU2hpZnQ7CisgICAgQmluYXJ5IHw9ICAoUmVnRCAmIDB4MDEpICAgICAgIDw8IEFSTUlJOjpEX0JpdFNoaWZ0OworICB9CisgIHJldHVybiBCaW5hcnk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBlbmNvZGVWRlBSbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBPcElkeCkgeworICB1bnNpZ25lZCBSZWdOID0gTUkuZ2V0T3BlcmFuZChPcElkeCkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIEJpbmFyeSA9IDA7CisgIGJvb2wgaXNTUFZGUCA9IGZhbHNlOworICBSZWdOID0gQVJNUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhSZWdOLCAmaXNTUFZGUCk7CisgIGlmICghaXNTUFZGUCkKKyAgICBCaW5hcnkgfD0gICBSZWdOICAgICAgICAgICAgICAgPDwgQVJNSUk6OlJlZ1JuU2hpZnQ7CisgIGVsc2UgeworICAgIEJpbmFyeSB8PSAoKFJlZ04gJiAweDFFKSA+PiAxKSA8PCBBUk1JSTo6UmVnUm5TaGlmdDsKKyAgICBCaW5hcnkgfD0gIChSZWdOICYgMHgwMSkgICAgICAgPDwgQVJNSUk6Ok5fQml0U2hpZnQ7CisgIH0KKyAgcmV0dXJuIEJpbmFyeTsKK30KKworc3RhdGljIHVuc2lnbmVkIGVuY29kZVZGUFJtKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIE9wSWR4KSB7CisgIHVuc2lnbmVkIFJlZ00gPSBNSS5nZXRPcGVyYW5kKE9wSWR4KS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgQmluYXJ5ID0gMDsKKyAgYm9vbCBpc1NQVkZQID0gZmFsc2U7CisgIFJlZ00gPSBBUk1SZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKFJlZ00sICZpc1NQVkZQKTsKKyAgaWYgKCFpc1NQVkZQKQorICAgIEJpbmFyeSB8PSAgIFJlZ007CisgIGVsc2UgeworICAgIEJpbmFyeSB8PSAoKFJlZ00gJiAweDFFKSA+PiAxKTsKKyAgICBCaW5hcnkgfD0gIChSZWdNICYgMHgwMSkgICAgICAgPDwgQVJNSUk6Ok1fQml0U2hpZnQ7CisgIH0KKyAgcmV0dXJuIEJpbmFyeTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdFZGUEFyaXRoSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSkgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLmdldERlc2MoKTsKKworICAvLyBQYXJ0IG9mIGJpbmFyeSBpcyBkZXRlcm1pbmVkIGJ5IFRhYmxlR24uCisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICB1bnNpZ25lZCBPcElkeCA9IDA7CisgIGFzc2VydCgoQmluYXJ5ICYgQVJNSUk6OkRfQml0U2hpZnQpID09IDAgJiYKKyAgICAgICAgIChCaW5hcnkgJiBBUk1JSTo6Tl9CaXRTaGlmdCkgPT0gMCAmJgorICAgICAgICAgKEJpbmFyeSAmIEFSTUlJOjpNX0JpdFNoaWZ0KSA9PSAwICYmICJWRlAgZW5jb2RpbmcgYnVnISIpOworCisgIC8vIEVuY29kZSBEZCAvIFNkLgorICBCaW5hcnkgfD0gZW5jb2RlVkZQUmQoTUksIE9wSWR4KyspOworCisgIC8vIElmIHRoaXMgaXMgYSB0d28tYWRkcmVzcyBvcGVyYW5kLCBza2lwIGl0LCBlLmcuIEZNQUNELgorICBpZiAoVElELmdldE9wZXJhbmRDb25zdHJhaW50KE9wSWR4LCBUT0k6OlRJRURfVE8pICE9IC0xKQorICAgICsrT3BJZHg7CisKKyAgLy8gRW5jb2RlIERuIC8gU24uCisgIGlmICgoVElELlRTRmxhZ3MgJiBBUk1JSTo6Rm9ybU1hc2spID09IEFSTUlJOjpWRlBCaW5hcnlGcm0pCisgICAgQmluYXJ5IHw9IGVuY29kZVZGUFJuKE1JLCBPcElkeCsrKTsKKworICBpZiAoT3BJZHggPT0gVElELmdldE51bU9wZXJhbmRzKCkgfHwKKyAgICAgIFRJRC5PcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkgfHwKKyAgICAgIFRJRC5PcEluZm9bT3BJZHhdLmlzT3B0aW9uYWxEZWYoKSkgeworICAgIC8vIEZDTVBFWkQgZXRjLiBoYXMgb25seSBvbmUgb3BlcmFuZC4KKyAgICBlbWl0V29yZExFKEJpbmFyeSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRW5jb2RlIERtIC8gU20uCisgIEJpbmFyeSB8PSBlbmNvZGVWRlBSbShNSSwgT3BJZHgpOworCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdFZGUENvbnZlcnNpb25JbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUkuZ2V0RGVzYygpOworICB1bnNpZ25lZCBGb3JtID0gVElELlRTRmxhZ3MgJiBBUk1JSTo6Rm9ybU1hc2s7CisKKyAgLy8gUGFydCBvZiBiaW5hcnkgaXMgZGV0ZXJtaW5lZCBieSBUYWJsZUduLgorICB1bnNpZ25lZCBCaW5hcnkgPSBnZXRCaW5hcnlDb2RlRm9ySW5zdHIoTUkpOworCisgIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZWRpY2F0ZQorICBCaW5hcnkgfD0gSUktPmdldFByZWRpY2F0ZSgmTUkpIDw8IEFSTUlJOjpDb25kU2hpZnQ7CisKKyAgc3dpdGNoIChGb3JtKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIEFSTUlJOjpWRlBDb252MUZybToKKyAgY2FzZSBBUk1JSTo6VkZQQ29udjJGcm06CisgIGNhc2UgQVJNSUk6OlZGUENvbnYzRnJtOgorICAgIC8vIEVuY29kZSBEZCAvIFNkLgorICAgIEJpbmFyeSB8PSBlbmNvZGVWRlBSZChNSSwgMCk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6OlZGUENvbnY0RnJtOgorICAgIC8vIEVuY29kZSBEbiAvIFNuLgorICAgIEJpbmFyeSB8PSBlbmNvZGVWRlBSbihNSSwgMCk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6OlZGUENvbnY1RnJtOgorICAgIC8vIEVuY29kZSBEbSAvIFNtLgorICAgIEJpbmFyeSB8PSBlbmNvZGVWRlBSbShNSSwgMCk7CisgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKEZvcm0pIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgQVJNSUk6OlZGUENvbnYxRnJtOgorICAgIC8vIEVuY29kZSBEbSAvIFNtLgorICAgIEJpbmFyeSB8PSBlbmNvZGVWRlBSbShNSSwgMSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNSUk6OlZGUENvbnYyRnJtOgorICBjYXNlIEFSTUlJOjpWRlBDb252M0ZybToKKyAgICAvLyBFbmNvZGUgRG4gLyBTbi4KKyAgICBCaW5hcnkgfD0gZW5jb2RlVkZQUm4oTUksIDEpOworICAgIGJyZWFrOworICBjYXNlIEFSTUlJOjpWRlBDb252NEZybToKKyAgY2FzZSBBUk1JSTo6VkZQQ29udjVGcm06CisgICAgLy8gRW5jb2RlIERkIC8gU2QuCisgICAgQmluYXJ5IHw9IGVuY29kZVZGUFJkKE1JLCAxKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChGb3JtID09IEFSTUlJOjpWRlBDb252NUZybSkKKyAgICAvLyBFbmNvZGUgRG4gLyBTbi4KKyAgICBCaW5hcnkgfD0gZW5jb2RlVkZQUm4oTUksIDIpOworICBlbHNlIGlmIChGb3JtID09IEFSTUlJOjpWRlBDb252M0ZybSkKKyAgICAvLyBFbmNvZGUgRG0gLyBTbS4KKyAgICBCaW5hcnkgfD0gZW5jb2RlVkZQUm0oTUksIDIpOworCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdFZGUExvYWRTdG9yZUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgLy8gUGFydCBvZiBiaW5hcnkgaXMgZGV0ZXJtaW5lZCBieSBUYWJsZUduLgorICB1bnNpZ25lZCBCaW5hcnkgPSBnZXRCaW5hcnlDb2RlRm9ySW5zdHIoTUkpOworCisgIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZWRpY2F0ZQorICBCaW5hcnkgfD0gSUktPmdldFByZWRpY2F0ZSgmTUkpIDw8IEFSTUlJOjpDb25kU2hpZnQ7CisKKyAgdW5zaWduZWQgT3BJZHggPSAwOworCisgIC8vIEVuY29kZSBEZCAvIFNkLgorICBCaW5hcnkgfD0gZW5jb2RlVkZQUmQoTUksIE9wSWR4KyspOworCisgIC8vIEVuY29kZSBhZGRyZXNzIGJhc2UuCisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZCYXNlID0gTUkuZ2V0T3BlcmFuZChPcElkeCsrKTsKKyAgQmluYXJ5IHw9IGdldE1hY2hpbmVPcFZhbHVlKE1JLCBCYXNlKSA8PCBBUk1JSTo6UmVnUm5TaGlmdDsKKworICAvLyBJZiB0aGVyZSBpcyBhIG5vbi16ZXJvIGltbWVkaWF0ZSBvZmZzZXQsIGVuY29kZSBpdC4KKyAgaWYgKEJhc2UuaXNSZWcoKSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZPZmZzZXQgPSBNSS5nZXRPcGVyYW5kKE9wSWR4KTsKKyAgICBpZiAodW5zaWduZWQgSW1tT2ZmcyA9IEFSTV9BTTo6Z2V0QU01T2Zmc2V0KE9mZnNldC5nZXRJbW0oKSkpIHsKKyAgICAgIGlmIChBUk1fQU06OmdldEFNNU9wKE9mZnNldC5nZXRJbW0oKSkgPT0gQVJNX0FNOjphZGQpCisgICAgICAgIEJpbmFyeSB8PSAxIDw8IEFSTUlJOjpVX0JpdFNoaWZ0OworICAgICAgQmluYXJ5IHw9IEltbU9mZnM7CisgICAgICBlbWl0V29yZExFKEJpbmFyeSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gSWYgaW1tZWRpYXRlIG9mZnNldCBpcyBvbWl0dGVkLCBkZWZhdWx0IHRvICswLgorICBCaW5hcnkgfD0gMSA8PCBBUk1JSTo6VV9CaXRTaGlmdDsKKworICBlbWl0V29yZExFKEJpbmFyeSk7Cit9CisKK3ZvaWQKK0FSTUNvZGVFbWl0dGVyOjplbWl0VkZQTG9hZFN0b3JlTXVsdGlwbGVJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUkuZ2V0RGVzYygpOworICBib29sIElzVXBkYXRpbmcgPSAoVElELlRTRmxhZ3MgJiBBUk1JSTo6SW5kZXhNb2RlTWFzaykgIT0gMDsKKworICAvLyBQYXJ0IG9mIGJpbmFyeSBpcyBkZXRlcm1pbmVkIGJ5IFRhYmxlR24uCisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSBJSS0+Z2V0UHJlZGljYXRlKCZNSSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICAvLyBTa2lwIG9wZXJhbmQgMCBvZiBhbiBpbnN0cnVjdGlvbiB3aXRoIGJhc2UgcmVnaXN0ZXIgdXBkYXRlLgorICB1bnNpZ25lZCBPcElkeCA9IDA7CisgIGlmIChJc1VwZGF0aW5nKQorICAgICsrT3BJZHg7CisKKyAgLy8gU2V0IGJhc2UgYWRkcmVzcyBvcGVyYW5kCisgIEJpbmFyeSB8PSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgT3BJZHgrKykgPDwgQVJNSUk6OlJlZ1JuU2hpZnQ7CisKKyAgLy8gU2V0IGFkZHJlc3NpbmcgbW9kZSBieSBtb2RpZnlpbmcgYml0cyBVKDIzKSBhbmQgUCgyNCkKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChPcElkeCsrKTsKKyAgQmluYXJ5IHw9IGdldEFkZHJNb2RlVVBCaXRzKEFSTV9BTTo6Z2V0QU01U3ViTW9kZShNTy5nZXRJbW0oKSkpOworCisgIC8vIFNldCBiaXQgVygyMSkKKyAgaWYgKElzVXBkYXRpbmcpCisgICAgQmluYXJ5IHw9IDB4MSA8PCBBUk1JSTo6V19CaXRTaGlmdDsKKworICAvLyBGaXJzdCByZWdpc3RlciBpcyBlbmNvZGVkIGluIERkLgorICBCaW5hcnkgfD0gZW5jb2RlVkZQUmQoTUksIE9wSWR4KzIpOworCisgIC8vIE51bWJlciBvZiByZWdpc3RlcnMgYXJlIGVuY29kZWQgaW4gb2Zmc2V0IGZpZWxkLgorICB1bnNpZ25lZCBOdW1SZWdzID0gMTsKKyAgZm9yICh1bnNpZ25lZCBpID0gT3BJZHgrMywgZSA9IE1JLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgTU8uaXNJbXBsaWNpdCgpKQorICAgICAgYnJlYWs7CisgICAgKytOdW1SZWdzOworICB9CisgIC8vIEJpdCA4IHdpbGwgYmUgc2V0IGlmIDxsaXN0PiBpcyBjb25zZWN1dGl2ZSA2NC1iaXQgcmVnaXN0ZXJzIChlLmcuLCBEMCkKKyAgLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIDAsIGluIHRoZSBjYXNlIG9mIDMyLWJpdCByZWdpc3RlcnMuCisgIGlmKEJpbmFyeSAmIDB4MTAwKQorICAgIEJpbmFyeSB8PSBOdW1SZWdzICogMjsKKyAgZWxzZQorICAgIEJpbmFyeSB8PSBOdW1SZWdzOworCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdE1pc2NJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIHVuc2lnbmVkIE9wY29kZSA9IE1JLmdldERlc2MoKS5PcGNvZGU7CisgIC8vIFBhcnQgb2YgYmluYXJ5IGlzIGRldGVybWluZWQgYnkgVGFibGVHbi4KKyAgdW5zaWduZWQgQmluYXJ5ID0gZ2V0QmluYXJ5Q29kZUZvckluc3RyKE1JKTsKKworICAvLyBTZXQgdGhlIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBwcmVkaWNhdGUKKyAgQmluYXJ5IHw9IElJLT5nZXRQcmVkaWNhdGUoJk1JKSA8PCBBUk1JSTo6Q29uZFNoaWZ0OworCisgIHN3aXRjaChPcGNvZGUpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJBUk1Db2RlRW1pdHRlcjo6ZW1pdE1pc2NJbnN0cnVjdGlvbiIpOworCisgIGNhc2UgQVJNOjpGTVNUQVQ6CisgICAgLy8gTm8gZnVydGhlciBlbmNvZGluZyBuZWVkZWQuCisgICAgYnJlYWs7CisKKyAgY2FzZSBBUk06OlZNUlM6CisgIGNhc2UgQVJNOjpWTVNSOiB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PMCA9IE1JLmdldE9wZXJhbmQoMCk7CisgICAgLy8gRW5jb2RlIFJ0LgorICAgIEJpbmFyeSB8PSBBUk1SZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKE1PMC5nZXRSZWcoKSkKKyAgICAgICAgICAgICAgICA8PCBBUk1JSTo6UmVnUmRTaGlmdDsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgQVJNOjpGQ09OU1REOgorICBjYXNlIEFSTTo6RkNPTlNUUzogeworICAgIC8vIEVuY29kZSBEZCAvIFNkLgorICAgIEJpbmFyeSB8PSBlbmNvZGVWRlBSZChNSSwgMCk7CisKKyAgICAvLyBFbmNvZGUgaW1tLiwgVGFibGUgQTctMTggVkZQIG1vZGlmaWVkIGltbWVkaWF0ZSBjb25zdGFudHMKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUkuZ2V0T3BlcmFuZCgxKTsKKyAgICB1bnNpZ25lZCBJbW0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oTU8xLmdldEZQSW1tKCktPmdldFZhbHVlQVBGKCkKKyAgICAgICAgICAgICAgICAgICAgICAuYml0Y2FzdFRvQVBJbnQoKS5nZXRIaUJpdHMoMzIpLmdldExpbWl0ZWRWYWx1ZSgpKTsKKyAgICB1bnNpZ25lZCBNb2RpZmllZEltbTsKKworICAgIGlmKE9wY29kZSA9PSBBUk06OkZDT05TVFMpCisgICAgICBNb2RpZmllZEltbSA9IChJbW0gJiAweDgwMDAwMDAwKSA+PiAyNCB8IC8vIGEKKyAgICAgICAgICAgICAgICAgICAgKEltbSAmIDB4MDNGODAwMDApID4+IDE5OyAgLy8gYmNkZWZnaAorICAgIGVsc2UgLy8gT3Bjb2RlID09IEFSTTo6RkNPTlNURAorICAgICAgTW9kaWZpZWRJbW0gPSAoSW1tICYgMHg4MDAwMDAwMCkgPj4gMjQgfCAvLyBhCisgICAgICAgICAgICAgICAgICAgIChJbW0gJiAweDAwN0YwMDAwKSA+PiAxNjsgIC8vIGJjZGVmZ2gKKworICAgIC8vIEluc3RzezE5LTE2fSA9IGFiY2QsIEluc3RzezMtMH0gPSBlZmdoCisgICAgQmluYXJ5IHw9ICgoTW9kaWZpZWRJbW0gJiAweEYwKSA+PiA0KSA8PCAxNjsKKyAgICBCaW5hcnkgfD0gKE1vZGlmaWVkSW1tICYgMHhGKTsKKyAgICBicmVhazsKKyAgfQorICB9CisKKyAgZW1pdFdvcmRMRShCaW5hcnkpOworfQorCitzdGF0aWMgdW5zaWduZWQgZW5jb2RlTkVPTlJkKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIE9wSWR4KSB7CisgIHVuc2lnbmVkIFJlZ0QgPSBNSS5nZXRPcGVyYW5kKE9wSWR4KS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgQmluYXJ5ID0gMDsKKyAgUmVnRCA9IEFSTVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoUmVnRCk7CisgIEJpbmFyeSB8PSAoUmVnRCAmIDB4ZikgPDwgQVJNSUk6OlJlZ1JkU2hpZnQ7CisgIEJpbmFyeSB8PSAoKFJlZ0QgPj4gNCkgJiAxKSA8PCBBUk1JSTo6RF9CaXRTaGlmdDsKKyAgcmV0dXJuIEJpbmFyeTsKK30KKworc3RhdGljIHVuc2lnbmVkIGVuY29kZU5FT05Sbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBPcElkeCkgeworICB1bnNpZ25lZCBSZWdOID0gTUkuZ2V0T3BlcmFuZChPcElkeCkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIEJpbmFyeSA9IDA7CisgIFJlZ04gPSBBUk1SZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKFJlZ04pOworICBCaW5hcnkgfD0gKFJlZ04gJiAweGYpIDw8IEFSTUlJOjpSZWdSblNoaWZ0OworICBCaW5hcnkgfD0gKChSZWdOID4+IDQpICYgMSkgPDwgQVJNSUk6Ok5fQml0U2hpZnQ7CisgIHJldHVybiBCaW5hcnk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBlbmNvZGVORU9OUm0oY29uc3QgTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgT3BJZHgpIHsKKyAgdW5zaWduZWQgUmVnTSA9IE1JLmdldE9wZXJhbmQoT3BJZHgpLmdldFJlZygpOworICB1bnNpZ25lZCBCaW5hcnkgPSAwOworICBSZWdNID0gQVJNUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhSZWdNKTsKKyAgQmluYXJ5IHw9IChSZWdNICYgMHhmKTsKKyAgQmluYXJ5IHw9ICgoUmVnTSA+PiA0KSAmIDEpIDw8IEFSTUlJOjpNX0JpdFNoaWZ0OworICByZXR1cm4gQmluYXJ5OworfQorCisvLy8gY29udmVydE5FT05EYXRhUHJvY1RvVGh1bWIgLSBDb252ZXJ0IHRoZSBBUk0gbW9kZSBlbmNvZGluZyBmb3IgYSBORU9OCisvLy8gZGF0YS1wcm9jZXNzaW5nIGluc3RydWN0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIFRodW1iIGVuY29kaW5nLgorc3RhdGljIHVuc2lnbmVkIGNvbnZlcnRORU9ORGF0YVByb2NUb1RodW1iKHVuc2lnbmVkIEJpbmFyeSkgeworICBhc3NlcnQoKEJpbmFyeSAmIDB4ZmUwMDAwMDApID09IDB4ZjIwMDAwMDAgJiYKKyAgICAgICAgICJub3QgYW4gQVJNIE5FT04gZGF0YS1wcm9jZXNzaW5nIGluc3RydWN0aW9uIik7CisgIHVuc2lnbmVkIFVCaXQgPSAoQmluYXJ5ID4+IDI0KSAmIDE7CisgIHJldHVybiAweGVmMDAwMDAwIHwgKFVCaXQgPDwgMjgpIHwgKEJpbmFyeSAmIDB4ZmZmZmZmKTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdE5FT05MYW5lSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSkgeworICB1bnNpZ25lZCBCaW5hcnkgPSBnZXRCaW5hcnlDb2RlRm9ySW5zdHIoTUkpOworCisgIHVuc2lnbmVkIFJlZ1RPcElkeCwgUmVnTk9wSWR4LCBMbk9wSWR4OworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLmdldERlc2MoKTsKKyAgaWYgKChUSUQuVFNGbGFncyAmIEFSTUlJOjpGb3JtTWFzaykgPT0gQVJNSUk6Ok5HZXRMbkZybSkgeworICAgIFJlZ1RPcElkeCA9IDA7CisgICAgUmVnTk9wSWR4ID0gMTsKKyAgICBMbk9wSWR4ID0gMjsKKyAgfSBlbHNlIHsgLy8gQVJNSUk6Ok5TZXRMbkZybQorICAgIFJlZ1RPcElkeCA9IDI7CisgICAgUmVnTk9wSWR4ID0gMDsKKyAgICBMbk9wSWR4ID0gMzsKKyAgfQorCisgIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZWRpY2F0ZQorICBCaW5hcnkgfD0gKElzVGh1bWIgPyBBUk1DQzo6QUwgOiBJSS0+Z2V0UHJlZGljYXRlKCZNSSkpIDw8IEFSTUlJOjpDb25kU2hpZnQ7CisKKyAgdW5zaWduZWQgUmVnVCA9IE1JLmdldE9wZXJhbmQoUmVnVE9wSWR4KS5nZXRSZWcoKTsKKyAgUmVnVCA9IEFSTVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoUmVnVCk7CisgIEJpbmFyeSB8PSAoUmVnVCA8PCBBUk1JSTo6UmVnUmRTaGlmdCk7CisgIEJpbmFyeSB8PSBlbmNvZGVORU9OUm4oTUksIFJlZ05PcElkeCk7CisKKyAgdW5zaWduZWQgTGFuZVNoaWZ0OworICBpZiAoKEJpbmFyeSAmICgxIDw8IDIyKSkgIT0gMCkKKyAgICBMYW5lU2hpZnQgPSAwOyAvLyA4LWJpdCBlbGVtZW50cworICBlbHNlIGlmICgoQmluYXJ5ICYgKDEgPDwgNSkpICE9IDApCisgICAgTGFuZVNoaWZ0ID0gMTsgLy8gMTYtYml0IGVsZW1lbnRzCisgIGVsc2UKKyAgICBMYW5lU2hpZnQgPSAyOyAvLyAzMi1iaXQgZWxlbWVudHMKKworICB1bnNpZ25lZCBMYW5lID0gTUkuZ2V0T3BlcmFuZChMbk9wSWR4KS5nZXRJbW0oKSA8PCBMYW5lU2hpZnQ7CisgIHVuc2lnbmVkIE9wYzEgPSBMYW5lID4+IDI7CisgIHVuc2lnbmVkIE9wYzIgPSBMYW5lICYgMzsKKyAgYXNzZXJ0KChPcGMxICYgMykgPT0gMCAmJiAib3V0LW9mLXJhbmdlIGxhbmUgbnVtYmVyIG9wZXJhbmQiKTsKKyAgQmluYXJ5IHw9IChPcGMxIDw8IDIxKTsKKyAgQmluYXJ5IHw9IChPcGMyIDw8IDUpOworCisgIGVtaXRXb3JkTEUoQmluYXJ5KTsKK30KKwordm9pZCBBUk1Db2RlRW1pdHRlcjo6ZW1pdE5FT05EdXBJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisKKyAgLy8gU2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gcHJlZGljYXRlCisgIEJpbmFyeSB8PSAoSXNUaHVtYiA/IEFSTUNDOjpBTCA6IElJLT5nZXRQcmVkaWNhdGUoJk1JKSkgPDwgQVJNSUk6OkNvbmRTaGlmdDsKKworICB1bnNpZ25lZCBSZWdUID0gTUkuZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgUmVnVCA9IEFSTVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoUmVnVCk7CisgIEJpbmFyeSB8PSAoUmVnVCA8PCBBUk1JSTo6UmVnUmRTaGlmdCk7CisgIEJpbmFyeSB8PSBlbmNvZGVORU9OUm4oTUksIDApOworICBlbWl0V29yZExFKEJpbmFyeSk7Cit9CisKK3ZvaWQgQVJNQ29kZUVtaXR0ZXI6OmVtaXRORU9OMVJlZ01vZEltbUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgdW5zaWduZWQgQmluYXJ5ID0gZ2V0QmluYXJ5Q29kZUZvckluc3RyKE1JKTsKKyAgLy8gRGVzdGluYXRpb24gcmVnaXN0ZXIgaXMgZW5jb2RlZCBpbiBEZC4KKyAgQmluYXJ5IHw9IGVuY29kZU5FT05SZChNSSwgMCk7CisgIC8vIEltbWVkaWF0ZSBmaWVsZHM6IE9wLCBDbW9kZSwgSSwgSW1tMywgSW1tNAorICB1bnNpZ25lZCBJbW0gPSBNSS5nZXRPcGVyYW5kKDEpLmdldEltbSgpOworICB1bnNpZ25lZCBPcCA9IChJbW0gPj4gMTIpICYgMTsKKyAgdW5zaWduZWQgQ21vZGUgPSAoSW1tID4+IDgpICYgMHhmOworICB1bnNpZ25lZCBJID0gKEltbSA+PiA3KSAmIDE7CisgIHVuc2lnbmVkIEltbTMgPSAoSW1tID4+IDQpICYgMHg3OworICB1bnNpZ25lZCBJbW00ID0gSW1tICYgMHhmOworICBCaW5hcnkgfD0gKEkgPDwgMjQpIHwgKEltbTMgPDwgMTYpIHwgKENtb2RlIDw8IDgpIHwgKE9wIDw8IDUpIHwgSW1tNDsKKyAgaWYgKElzVGh1bWIpCisgICAgQmluYXJ5ID0gY29udmVydE5FT05EYXRhUHJvY1RvVGh1bWIoQmluYXJ5KTsKKyAgZW1pdFdvcmRMRShCaW5hcnkpOworfQorCit2b2lkIEFSTUNvZGVFbWl0dGVyOjplbWl0TkVPTjJSZWdJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUkuZ2V0RGVzYygpOworICB1bnNpZ25lZCBCaW5hcnkgPSBnZXRCaW5hcnlDb2RlRm9ySW5zdHIoTUkpOworICAvLyBEZXN0aW5hdGlvbiByZWdpc3RlciBpcyBlbmNvZGVkIGluIERkOyBzb3VyY2UgcmVnaXN0ZXIgaW4gRG0uCisgIHVuc2lnbmVkIE9wSWR4ID0gMDsKKyAgQmluYXJ5IHw9IGVuY29kZU5FT05SZChNSSwgT3BJZHgrKyk7CisgIGlmIChUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoT3BJZHgsIFRPSTo6VElFRF9UTykgIT0gLTEpCisgICAgKytPcElkeDsKKyAgQmluYXJ5IHw9IGVuY29kZU5FT05SbShNSSwgT3BJZHgpOworICBpZiAoSXNUaHVtYikKKyAgICBCaW5hcnkgPSBjb252ZXJ0TkVPTkRhdGFQcm9jVG9UaHVtYihCaW5hcnkpOworICAvLyBGSVhNRTogVGhpcyBkb2VzIG5vdCBoYW5kbGUgVkRVUGZkZiBvciBWRFVQZnFmLgorICBlbWl0V29yZExFKEJpbmFyeSk7Cit9CisKK3ZvaWQgQVJNQ29kZUVtaXR0ZXI6OmVtaXRORU9OM1JlZ0luc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS5nZXREZXNjKCk7CisgIHVuc2lnbmVkIEJpbmFyeSA9IGdldEJpbmFyeUNvZGVGb3JJbnN0cihNSSk7CisgIC8vIERlc3RpbmF0aW9uIHJlZ2lzdGVyIGlzIGVuY29kZWQgaW4gRGQ7IHNvdXJjZSByZWdpc3RlcnMgaW4gRG4gYW5kIERtLgorICB1bnNpZ25lZCBPcElkeCA9IDA7CisgIEJpbmFyeSB8PSBlbmNvZGVORU9OUmQoTUksIE9wSWR4KyspOworICBpZiAoVElELmdldE9wZXJhbmRDb25zdHJhaW50KE9wSWR4LCBUT0k6OlRJRURfVE8pICE9IC0xKQorICAgICsrT3BJZHg7CisgIEJpbmFyeSB8PSBlbmNvZGVORU9OUm4oTUksIE9wSWR4KyspOworICBpZiAoVElELmdldE9wZXJhbmRDb25zdHJhaW50KE9wSWR4LCBUT0k6OlRJRURfVE8pICE9IC0xKQorICAgICsrT3BJZHg7CisgIEJpbmFyeSB8PSBlbmNvZGVORU9OUm0oTUksIE9wSWR4KTsKKyAgaWYgKElzVGh1bWIpCisgICAgQmluYXJ5ID0gY29udmVydE5FT05EYXRhUHJvY1RvVGh1bWIoQmluYXJ5KTsKKyAgLy8gRklYTUU6IFRoaXMgZG9lcyBub3QgaGFuZGxlIFZNT1ZEbmVvbiBvciBWTU9WUS4KKyAgZW1pdFdvcmRMRShCaW5hcnkpOworfQorCisjaW5jbHVkZSAiQVJNR2VuQ29kZUVtaXR0ZXIuaW5jIgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQ29uc3RhbnRJc2xhbmRQYXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUNvbnN0YW50SXNsYW5kUGFzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0ODQyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUNvbnN0YW50SXNsYW5kUGFzcy5jcHAKQEAgLTAsMCArMSwxODc3IEBACisvLz09PS0tIEFSTUNvbnN0YW50SXNsYW5kUGFzcy5jcHAgLSBBUk0gY29uc3RhbnQgaXNsYW5kcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHBhc3MgdGhhdCBzcGxpdHMgdGhlIGNvbnN0YW50IHBvb2wgdXAgaW50byAnaXNsYW5kcycKKy8vIHdoaWNoIGFyZSBzY2F0dGVyZWQgdGhyb3VnaC1vdXQgdGhlIGZ1bmN0aW9uLiAgVGhpcyBpcyByZXF1aXJlZCBkdWUgdG8gdGhlCisvLyBsaW1pdGVkIHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudHMgdGhhdCBBUk0gaGFzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXJtLWNwLWlzbGFuZHMiCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAiQVJNQWRkcmVzc2luZ01vZGVzLmgiCisjaW5jbHVkZSAiQVJNTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIkFSTUluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1DUEVzLCAgICAgICAiTnVtYmVyIG9mIGNvbnN0cG9vbCBlbnRyaWVzIik7CitTVEFUSVNUSUMoTnVtU3BsaXQsICAgICAgIk51bWJlciBvZiB1bmNvbmQgYnJhbmNoZXMgaW5zZXJ0ZWQiKTsKK1NUQVRJU1RJQyhOdW1DQnJGaXhlZCwgICAiTnVtYmVyIG9mIGNvbmQgYnJhbmNoZXMgZml4ZWQiKTsKK1NUQVRJU1RJQyhOdW1VQnJGaXhlZCwgICAiTnVtYmVyIG9mIHVuY29uZCBicmFuY2hlcyBmaXhlZCIpOworU1RBVElTVElDKE51bVRCcywgICAgICAgICJOdW1iZXIgb2YgdGFibGUgYnJhbmNoZXMgZ2VuZXJhdGVkIik7CitTVEFUSVNUSUMoTnVtVDJDUFNocnVuaywgIk51bWJlciBvZiBUaHVtYjIgY29uc3RhbnRwb29sIGluc3RydWN0aW9ucyBzaHJ1bmsiKTsKK1NUQVRJU1RJQyhOdW1UMkJyU2hydW5rLCAiTnVtYmVyIG9mIFRodW1iMiBpbW1lZGlhdGUgYnJhbmNoZXMgc2hydW5rIik7CitTVEFUSVNUSUMoTnVtQ0JaLCAgICAgICAgIk51bWJlciBvZiBDQlogLyBDQk5aIGZvcm1lZCIpOworU1RBVElTVElDKE51bUpUTW92ZWQsICAgICJOdW1iZXIgb2YganVtcCB0YWJsZSBkZXN0aW5hdGlvbiBibG9ja3MgbW92ZWQiKTsKK1NUQVRJU1RJQyhOdW1KVEluc2VydGVkLCAiTnVtYmVyIG9mIGp1bXAgdGFibGUgaW50ZXJtZWRpYXRlIGJsb2NrcyBpbnNlcnRlZCIpOworCisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitBZGp1c3RKdW1wVGFibGVCbG9ja3MoImFybS1hZGp1c3QtanVtcC10YWJsZXMiLCBjbDo6SGlkZGVuLCBjbDo6aW5pdCh0cnVlKSwKKyAgICAgICAgICBjbDo6ZGVzYygiQWRqdXN0IGJhc2ljIGJsb2NrIGxheW91dCB0byBiZXR0ZXIgdXNlIFRCW0JIXSIpKTsKKworbmFtZXNwYWNlIHsKKyAgLy8vIEFSTUNvbnN0YW50SXNsYW5kcyAtIER1ZSB0byBsaW1pdGVkIFBDLXJlbGF0aXZlIGRpc3BsYWNlbWVudHMsIEFSTQorICAvLy8gcmVxdWlyZXMgY29uc3RhbnQgcG9vbCBlbnRyaWVzIHRvIGJlIHNjYXR0ZXJlZCBhbW9uZyB0aGUgaW5zdHJ1Y3Rpb25zCisgIC8vLyBpbnNpZGUgYSBmdW5jdGlvbi4gIFRvIGRvIHRoaXMsIGl0IGNvbXBsZXRlbHkgaWdub3JlcyB0aGUgbm9ybWFsIExMVk0KKyAgLy8vIGNvbnN0YW50IHBvb2w7IGluc3RlYWQsIGl0IHBsYWNlcyBjb25zdGFudHMgd2hlcmV2ZXIgaXQgZmVlbHMgbGlrZSB3aXRoCisgIC8vLyBzcGVjaWFsIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIC8vLyBUaGUgdGVybWlub2xvZ3kgdXNlZCBpbiB0aGlzIHBhc3MgaW5jbHVkZXM6CisgIC8vLyAgIElzbGFuZHMgLSBDbHVtcHMgb2YgY29uc3RhbnRzIHBsYWNlZCBpbiB0aGUgZnVuY3Rpb24uCisgIC8vLyAgIFdhdGVyICAgLSBQb3RlbnRpYWwgcGxhY2VzIHdoZXJlIGFuIGlzbGFuZCBjb3VsZCBiZSBmb3JtZWQuCisgIC8vLyAgIENQRSAgICAgLSBBIGNvbnN0YW50IHBvb2wgZW50cnkgdGhhdCBoYXMgYmVlbiBwbGFjZWQgc29tZXdoZXJlLCB3aGljaAorICAvLy8gICAgICAgICAgICAgdHJhY2tzIGEgbGlzdCBvZiB1c2Vycy4KKyAgY2xhc3MgQVJNQ29uc3RhbnRJc2xhbmRzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIC8vLyBCQlNpemVzIC0gVGhlIHNpemUgb2YgZWFjaCBNYWNoaW5lQmFzaWNCbG9jayBpbiBieXRlcyBvZiBjb2RlLCBpbmRleGVkCisgICAgLy8vIGJ5IE1CQiBOdW1iZXIuICBUaGUgdHdvLWJ5dGUgcGFkcyByZXF1aXJlZCBmb3IgVGh1bWIgYWxpZ25tZW50IGFyZQorICAgIC8vLyBjb3VudGVkIGFzIHBhcnQgb2YgdGhlIGZvbGxvd2luZyBibG9jayAoaS5lLiwgdGhlIG9mZnNldCBhbmQgc2l6ZSBmb3IKKyAgICAvLy8gYSBwYWRkZWQgYmxvY2sgd2lsbCBib3RoIGJlID09MiBtb2QgNCkuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IEJCU2l6ZXM7CisKKyAgICAvLy8gQkJPZmZzZXRzIC0gdGhlIG9mZnNldCBvZiBlYWNoIE1CQiBpbiBieXRlcywgc3RhcnRpbmcgZnJvbSAwLgorICAgIC8vLyBUaGUgdHdvLWJ5dGUgcGFkcyByZXF1aXJlZCBmb3IgVGh1bWIgYWxpZ25tZW50IGFyZSBjb3VudGVkIGFzIHBhcnQgb2YKKyAgICAvLy8gdGhlIGZvbGxvd2luZyBibG9jay4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gQkJPZmZzZXRzOworCisgICAgLy8vIFdhdGVyTGlzdCAtIEEgc29ydGVkIGxpc3Qgb2YgYmFzaWMgYmxvY2tzIHdoZXJlIGlzbGFuZHMgY291bGQgYmUgcGxhY2VkCisgICAgLy8vIChpLmUuIGJsb2NrcyB0aGF0IGRvbid0IGZhbGwgdGhyb3VnaCB0byB0aGUgZm9sbG93aW5nIGJsb2NrLCBkdWUKKyAgICAvLy8gdG8gYSByZXR1cm4sIHVucmVhY2hhYmxlLCBvciB1bmNvbmRpdGlvbmFsIGJyYW5jaCkuCisgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiBXYXRlckxpc3Q7CisKKyAgICAvLy8gTmV3V2F0ZXJMaXN0IC0gVGhlIHN1YnNldCBvZiBXYXRlckxpc3QgdGhhdCB3YXMgY3JlYXRlZCBzaW5jZSB0aGUKKyAgICAvLy8gcHJldmlvdXMgaXRlcmF0aW9uIGJ5IGluc2VydGluZyB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzLgorICAgIFNtYWxsU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwgND4gTmV3V2F0ZXJMaXN0OworCisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+OjppdGVyYXRvciB3YXRlcl9pdGVyYXRvcjsKKworICAgIC8vLyBDUFVzZXIgLSBPbmUgdXNlciBvZiBhIGNvbnN0YW50IHBvb2wsIGtlZXBpbmcgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gcG9pbnRlciwgdGhlIGNvbnN0YW50IHBvb2wgYmVpbmcgcmVmZXJlbmNlZCwgYW5kIHRoZSBtYXggZGlzcGxhY2VtZW50CisgICAgLy8vIGFsbG93ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIENQLiAgVGhlIEhpZ2hXYXRlck1hcmsgcmVjb3JkcyB0aGUKKyAgICAvLy8gaGlnaGVzdCBiYXNpYyBibG9jayB3aGVyZSBhIG5ldyBDUEVudHJ5IGNhbiBiZSBwbGFjZWQuICBUbyBlbnN1cmUgdGhpcworICAgIC8vLyBwYXNzIHRlcm1pbmF0ZXMsIHRoZSBDUCBlbnRyaWVzIGFyZSBpbml0aWFsbHkgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgLy8vIGZ1bmN0aW9uIGFuZCB0aGVuIG1vdmUgbW9ub3RvbmljYWxseSB0byBsb3dlciBhZGRyZXNzZXMuICBUaGUKKyAgICAvLy8gZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcyB3aGVuIHRoZSBjdXJyZW50IENQIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIKKyAgICAvLy8gQ1BVc2VyIGlzIG91dCBvZiByYW5nZSwgYnV0IHRoZXJlIGlzIGFub3RoZXIgQ1AgZW50cnkgZm9yIHRoZSBzYW1lCisgICAgLy8vIGNvbnN0YW50IHZhbHVlIGluIHJhbmdlLiAgV2Ugd2FudCB0byB1c2UgdGhlIGV4aXN0aW5nIGluLXJhbmdlIENQCisgICAgLy8vIGVudHJ5LCBidXQgaWYgaXQgbGF0ZXIgbW92ZXMgb3V0IG9mIHJhbmdlLCB0aGUgc2VhcmNoIGZvciBuZXcgd2F0ZXIKKyAgICAvLy8gc2hvdWxkIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZi4gIFRoZSBIaWdoV2F0ZXJNYXJrIGlzIHVzZWQgdG8gcmVjb3JkCisgICAgLy8vIHRoYXQgcG9pbnQuCisgICAgc3RydWN0IENQVXNlciB7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JOworICAgICAgTWFjaGluZUluc3RyICpDUEVNSTsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpIaWdoV2F0ZXJNYXJrOworICAgICAgdW5zaWduZWQgTWF4RGlzcDsKKyAgICAgIGJvb2wgTmVnT2s7CisgICAgICBib29sIElzU29JbW07CisgICAgICBDUFVzZXIoTWFjaGluZUluc3RyICptaSwgTWFjaGluZUluc3RyICpjcGVtaSwgdW5zaWduZWQgbWF4ZGlzcCwKKyAgICAgICAgICAgICBib29sIG5lZywgYm9vbCBzb2ltbSkKKyAgICAgICAgOiBNSShtaSksIENQRU1JKGNwZW1pKSwgTWF4RGlzcChtYXhkaXNwKSwgTmVnT2sobmVnKSwgSXNTb0ltbShzb2ltbSkgeworICAgICAgICBIaWdoV2F0ZXJNYXJrID0gQ1BFTUktPmdldFBhcmVudCgpOworICAgICAgfQorICAgIH07CisKKyAgICAvLy8gQ1BVc2VycyAtIEtlZXAgdHJhY2sgb2YgYWxsIG9mIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyB0aGF0IHVzZSB2YXJpb3VzCisgICAgLy8vIGNvbnN0YW50IHBvb2xzIGFuZCB0aGVpciBtYXggZGlzcGxhY2VtZW50LgorICAgIHN0ZDo6dmVjdG9yPENQVXNlcj4gQ1BVc2VyczsKKworICAgIC8vLyBDUEVudHJ5IC0gT25lIHBlciBjb25zdGFudCBwb29sIGVudHJ5LCBrZWVwaW5nIHRoZSBtYWNoaW5lIGluc3RydWN0aW9uCisgICAgLy8vIHBvaW50ZXIsIHRoZSBjb25zdHBvb2wgaW5kZXgsIGFuZCB0aGUgbnVtYmVyIG9mIENQVXNlcidzIHdoaWNoCisgICAgLy8vIHJlZmVyZW5jZSB0aGlzIGVudHJ5LgorICAgIHN0cnVjdCBDUEVudHJ5IHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqQ1BFTUk7CisgICAgICB1bnNpZ25lZCBDUEk7CisgICAgICB1bnNpZ25lZCBSZWZDb3VudDsKKyAgICAgIENQRW50cnkoTWFjaGluZUluc3RyICpjcGVtaSwgdW5zaWduZWQgY3BpLCB1bnNpZ25lZCByYyA9IDApCisgICAgICAgIDogQ1BFTUkoY3BlbWkpLCBDUEkoY3BpKSwgUmVmQ291bnQocmMpIHt9CisgICAgfTsKKworICAgIC8vLyBDUEVudHJpZXMgLSBLZWVwIHRyYWNrIG9mIGFsbCBvZiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSBtYWNoaW5lCisgICAgLy8vIGluc3RydWN0aW9ucy4gRm9yIGVhY2ggb3JpZ2luYWwgY29uc3Rwb29sIGluZGV4IChpLmUuIHRob3NlIHRoYXQKKyAgICAvLy8gZXhpc3RlZCB1cG9uIGVudHJ5IHRvIHRoaXMgcGFzcyksIGl0IGtlZXBzIGEgdmVjdG9yIG9mIGVudHJpZXMuCisgICAgLy8vIE9yaWdpbmFsIGVsZW1lbnRzIGFyZSBjbG9uZWQgYXMgd2UgZ28gYWxvbmc7IHRoZSBjbG9uZXMgYXJlCisgICAgLy8vIHB1dCBpbiB0aGUgdmVjdG9yIG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50LCBidXQgaGF2ZSBkaXN0aW5jdCBDUElzLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPENQRW50cnk+ID4gQ1BFbnRyaWVzOworCisgICAgLy8vIEltbUJyYW5jaCAtIE9uZSBwZXIgaW1tZWRpYXRlIGJyYW5jaCwga2VlcGluZyB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbgorICAgIC8vLyBwb2ludGVyLCBjb25kaXRpb25hbCBvciB1bmNvbmRpdGlvbmFsLCB0aGUgbWF4IGRpc3BsYWNlbWVudCwKKyAgICAvLy8gYW5kIChpZiBpc0NvbmQgaXMgdHJ1ZSkgdGhlIGNvcnJlc3BvbmRpbmcgdW5jb25kaXRpb25hbCBicmFuY2gKKyAgICAvLy8gb3Bjb2RlLgorICAgIHN0cnVjdCBJbW1CcmFuY2ggeworICAgICAgTWFjaGluZUluc3RyICpNSTsKKyAgICAgIHVuc2lnbmVkIE1heERpc3AgOiAzMTsKKyAgICAgIGJvb2wgaXNDb25kIDogMTsKKyAgICAgIGludCBVbmNvbmRCcjsKKyAgICAgIEltbUJyYW5jaChNYWNoaW5lSW5zdHIgKm1pLCB1bnNpZ25lZCBtYXhkaXNwLCBib29sIGNvbmQsIGludCB1YnIpCisgICAgICAgIDogTUkobWkpLCBNYXhEaXNwKG1heGRpc3ApLCBpc0NvbmQoY29uZCksIFVuY29uZEJyKHVicikge30KKyAgICB9OworCisgICAgLy8vIEltbUJyYW5jaGVzIC0gS2VlcCB0cmFjayBvZiBhbGwgdGhlIGltbWVkaWF0ZSBicmFuY2ggaW5zdHJ1Y3Rpb25zLgorICAgIC8vLworICAgIHN0ZDo6dmVjdG9yPEltbUJyYW5jaD4gSW1tQnJhbmNoZXM7CisKKyAgICAvLy8gUHVzaFBvcE1JcyAtIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSBUaHVtYiBwdXNoIC8gcG9wIGluc3RydWN0aW9ucy4KKyAgICAvLy8KKyAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBQdXNoUG9wTUlzOworCisgICAgLy8vIFQySnVtcFRhYmxlcyAtIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSBUaHVtYjIganVtcHRhYmxlIGluc3RydWN0aW9ucy4KKyAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBUMkp1bXBUYWJsZXM7CisKKyAgICAvLy8gSGFzRmFySnVtcCAtIFRydWUgaWYgYW55IGZhciBqdW1wIGluc3RydWN0aW9uIGhhcyBiZWVuIGVtaXR0ZWQgZHVyaW5nCisgICAgLy8vIHRoZSBicmFuY2ggZml4IHVwIHBhc3MuCisgICAgYm9vbCBIYXNGYXJKdW1wOworCisgICAgLy8vIEhhc0lubGluZUFzbSAtIFRydWUgaWYgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIGlubGluZSBhc3NlbWJseS4KKyAgICBib29sIEhhc0lubGluZUFzbTsKKworICAgIGNvbnN0IEFSTUluc3RySW5mbyAqVElJOworICAgIGNvbnN0IEFSTVN1YnRhcmdldCAqU1RJOworICAgIEFSTUZ1bmN0aW9uSW5mbyAqQUZJOworICAgIGJvb2wgaXNUaHVtYjsKKyAgICBib29sIGlzVGh1bWIxOworICAgIGJvb2wgaXNUaHVtYjI7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBBUk1Db25zdGFudElzbGFuZHMoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJBUk0gY29uc3RhbnQgaXNsYW5kIHBsYWNlbWVudCBhbmQgYnJhbmNoIHNob3J0ZW5pbmcgcGFzcyI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBEb0luaXRpYWxQbGFjZW1lbnQoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPiAmQ1BFTUlzKTsKKyAgICBDUEVudHJ5ICpmaW5kQ29uc3RQb29sRW50cnkodW5zaWduZWQgQ1BJLCBjb25zdCBNYWNoaW5lSW5zdHIgKkNQRU1JKTsKKyAgICB2b2lkIEp1bXBUYWJsZUZ1bmN0aW9uU2NhbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKyAgICB2b2lkIEluaXRpYWxGdW5jdGlvblNjYW4oTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyKj4gJkNQRU1Jcyk7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKlNwbGl0QmxvY2tCZWZvcmVJbnN0cihNYWNoaW5lSW5zdHIgKk1JKTsKKyAgICB2b2lkIFVwZGF0ZUZvckluc2VydGVkV2F0ZXJCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTmV3QkIpOworICAgIHZvaWQgQWRqdXN0QkJPZmZzZXRzQWZ0ZXIoTWFjaGluZUJhc2ljQmxvY2sgKkJCLCBpbnQgZGVsdGEpOworICAgIGJvb2wgRGVjcmVtZW50T2xkRW50cnkodW5zaWduZWQgQ1BJLCBNYWNoaW5lSW5zdHIqIENQRU1JKTsKKyAgICBpbnQgTG9va0ZvckV4aXN0aW5nQ1BFbnRyeShDUFVzZXImIFUsIHVuc2lnbmVkIFVzZXJPZmZzZXQpOworICAgIGJvb2wgTG9va0ZvcldhdGVyKENQVXNlciZVLCB1bnNpZ25lZCBVc2VyT2Zmc2V0LCB3YXRlcl9pdGVyYXRvciAmV2F0ZXJJdGVyKTsKKyAgICB2b2lkIENyZWF0ZU5ld1dhdGVyKHVuc2lnbmVkIENQVXNlckluZGV4LCB1bnNpZ25lZCBVc2VyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZOZXdNQkIpOworICAgIGJvb2wgSGFuZGxlQ29uc3RhbnRQb29sVXNlcihNYWNoaW5lRnVuY3Rpb24gJk1GLCB1bnNpZ25lZCBDUFVzZXJJbmRleCk7CisgICAgdm9pZCBSZW1vdmVEZWFkQ1BFTUkoTWFjaGluZUluc3RyICpDUEVNSSk7CisgICAgYm9vbCBSZW1vdmVVbnVzZWRDUEVudHJpZXMoKTsKKyAgICBib29sIENQRUlzSW5SYW5nZShNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBVc2VyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqQ1BFTUksIHVuc2lnbmVkIERpc3AsIGJvb2wgTmVnT2ssCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEb0R1bXAgPSBmYWxzZSk7CisgICAgYm9vbCBXYXRlcklzSW5SYW5nZSh1bnNpZ25lZCBVc2VyT2Zmc2V0LCBNYWNoaW5lQmFzaWNCbG9jayAqV2F0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBDUFVzZXIgJlUpOworICAgIGJvb2wgT2Zmc2V0SXNJblJhbmdlKHVuc2lnbmVkIFVzZXJPZmZzZXQsIHVuc2lnbmVkIFRyaWFsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERpc3AsIGJvb2wgTmVnYXRpdmVPSywgYm9vbCBJc1NvSW1tID0gZmFsc2UpOworICAgIGJvb2wgQkJJc0luUmFuZ2UoTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUJhc2ljQmxvY2sgKkJCLCB1bnNpZ25lZCBEaXNwKTsKKyAgICBib29sIEZpeFVwSW1tZWRpYXRlQnIoTWFjaGluZUZ1bmN0aW9uICZNRiwgSW1tQnJhbmNoICZCcik7CisgICAgYm9vbCBGaXhVcENvbmRpdGlvbmFsQnIoTWFjaGluZUZ1bmN0aW9uICZNRiwgSW1tQnJhbmNoICZCcik7CisgICAgYm9vbCBGaXhVcFVuY29uZGl0aW9uYWxCcihNYWNoaW5lRnVuY3Rpb24gJk1GLCBJbW1CcmFuY2ggJkJyKTsKKyAgICBib29sIFVuZG9MUlNwaWxsUmVzdG9yZSgpOworICAgIGJvb2wgT3B0aW1pemVUaHVtYjJJbnN0cnVjdGlvbnMoTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgYm9vbCBPcHRpbWl6ZVRodW1iMkJyYW5jaGVzKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworICAgIGJvb2wgUmVvcmRlclRodW1iMkp1bXBUYWJsZXMoTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgYm9vbCBPcHRpbWl6ZVRodW1iMkp1bXBUYWJsZXMoTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkFkanVzdEpUVGFyZ2V0QmxvY2tGb3J3YXJkKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkpUQkIpOworCisgICAgdW5zaWduZWQgR2V0T2Zmc2V0T2YoTWFjaGluZUluc3RyICpNSSkgY29uc3Q7CisgICAgdm9pZCBkdW1wQkJzKCk7CisgICAgdm9pZCB2ZXJpZnkoTWFjaGluZUZ1bmN0aW9uICZNRik7CisgIH07CisgIGNoYXIgQVJNQ29uc3RhbnRJc2xhbmRzOjpJRCA9IDA7Cit9CisKKy8vLyB2ZXJpZnkgLSBjaGVjayBCQk9mZnNldHMsIEJCU2l6ZXMsIGFsaWdubWVudCBvZiBpc2xhbmRzCit2b2lkIEFSTUNvbnN0YW50SXNsYW5kczo6dmVyaWZ5KE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgYXNzZXJ0KEJCT2Zmc2V0cy5zaXplKCkgPT0gQkJTaXplcy5zaXplKCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gQkJPZmZzZXRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgYXNzZXJ0KEJCT2Zmc2V0c1tpLTFdK0JCU2l6ZXNbaS0xXSA9PSBCQk9mZnNldHNbaV0pOworICBpZiAoIWlzVGh1bWIpCisgICAgcmV0dXJuOworI2lmbmRlZiBOREVCVUcKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7CisgICAgICAgTUJCSSAhPSBFOyArK01CQkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTUJCSTsKKyAgICBpZiAoIU1CQi0+ZW1wdHkoKSAmJgorICAgICAgICBNQkItPmJlZ2luKCktPmdldE9wY29kZSgpID09IEFSTTo6Q09OU1RQT09MX0VOVFJZKSB7CisgICAgICB1bnNpZ25lZCBNQkJJZCA9IE1CQi0+Z2V0TnVtYmVyKCk7CisgICAgICBhc3NlcnQoSGFzSW5saW5lQXNtIHx8CisgICAgICAgICAgICAgKEJCT2Zmc2V0c1tNQkJJZF0lNCA9PSAwICYmIEJCU2l6ZXNbTUJCSWRdJTQgPT0gMCkgfHwKKyAgICAgICAgICAgICAoQkJPZmZzZXRzW01CQklkXSU0ICE9IDAgJiYgQkJTaXplc1tNQkJJZF0lNCAhPSAwKSk7CisgICAgfQorICB9CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUFVzZXJzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDUFVzZXIgJlUgPSBDUFVzZXJzW2ldOworICAgIHVuc2lnbmVkIFVzZXJPZmZzZXQgPSBHZXRPZmZzZXRPZihVLk1JKSArIChpc1RodW1iID8gNCA6IDgpOworICAgIHVuc2lnbmVkIENQRU9mZnNldCAgPSBHZXRPZmZzZXRPZihVLkNQRU1JKTsKKyAgICB1bnNpZ25lZCBEaXNwID0gVXNlck9mZnNldCA8IENQRU9mZnNldCA/IENQRU9mZnNldCAtIFVzZXJPZmZzZXQgOgorICAgICAgVXNlck9mZnNldCAtIENQRU9mZnNldDsKKyAgICBhc3NlcnQoRGlzcCA8PSBVLk1heERpc3AgfHwgIkNvbnN0YW50IHBvb2wgZW50cnkgb3V0IG9mIHJhbmdlISIpOworICB9CisjZW5kaWYKK30KKworLy8vIHByaW50IGJsb2NrIHNpemUgYW5kIG9mZnNldCBpbmZvcm1hdGlvbiAtIGRlYnVnZ2luZwordm9pZCBBUk1Db25zdGFudElzbGFuZHM6OmR1bXBCQnMoKSB7CisgIGZvciAodW5zaWduZWQgSiA9IDAsIEUgPSBCQk9mZnNldHMuc2l6ZSgpOyBKICE9RTsgKytKKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJibG9jayAiIDw8IEogPDwgIiBvZmZzZXQgIiA8PCBCQk9mZnNldHNbSl0KKyAgICAgICAgICAgICAgICAgPDwgIiBzaXplICIgPDwgQkJTaXplc1tKXSA8PCAiXG4iKTsKKyAgfQorfQorCisvLy8gY3JlYXRlQVJNQ29uc3RhbnRJc2xhbmRQYXNzIC0gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgY29uc3Rwb29sCisvLy8gaXNsYW5kIHBhc3MuCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUFSTUNvbnN0YW50SXNsYW5kUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBBUk1Db25zdGFudElzbGFuZHMoKTsKK30KKworYm9vbCBBUk1Db25zdGFudElzbGFuZHM6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgTWFjaGluZUNvbnN0YW50UG9vbCAmTUNQID0gKk1GLmdldENvbnN0YW50UG9vbCgpOworCisgIFRJSSA9IChjb25zdCBBUk1JbnN0ckluZm8qKU1GLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworICBBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgU1RJID0gJk1GLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCk7CisKKyAgaXNUaHVtYiA9IEFGSS0+aXNUaHVtYkZ1bmN0aW9uKCk7CisgIGlzVGh1bWIxID0gQUZJLT5pc1RodW1iMU9ubHlGdW5jdGlvbigpOworICBpc1RodW1iMiA9IEFGSS0+aXNUaHVtYjJGdW5jdGlvbigpOworCisgIEhhc0Zhckp1bXAgPSBmYWxzZTsKKyAgSGFzSW5saW5lQXNtID0gZmFsc2U7CisKKyAgLy8gUmVudW1iZXIgYWxsIG9mIHRoZSBtYWNoaW5lIGJhc2ljIGJsb2NrcyBpbiB0aGUgZnVuY3Rpb24sIGd1YXJhbnRlZWluZyB0aGF0CisgIC8vIHRoZSBudW1iZXJzIGFncmVlIHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBibG9jayBpbiB0aGUgZnVuY3Rpb24uCisgIE1GLlJlbnVtYmVyQmxvY2tzKCk7CisKKyAgLy8gVHJ5IHRvIHJlb3JkZXIgYW5kIG90aGVyd2lzZSBhZGp1c3QgdGhlIGJsb2NrIGxheW91dCB0byBtYWtlIGdvb2QgdXNlCisgIC8vIG9mIHRoZSBUQltCSF0gaW5zdHJ1Y3Rpb25zLgorICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgaWYgKGlzVGh1bWIyICYmIEFkanVzdEp1bXBUYWJsZUJsb2NrcykgeworICAgIEp1bXBUYWJsZUZ1bmN0aW9uU2NhbihNRik7CisgICAgTWFkZUNoYW5nZSB8PSBSZW9yZGVyVGh1bWIySnVtcFRhYmxlcyhNRik7CisgICAgLy8gRGF0YSBpcyBvdXQgb2YgZGF0ZSwgc28gY2xlYXIgaXQuIEl0J2xsIGJlIHJlLWNvbXB1dGVkIGxhdGVyLgorICAgIFQySnVtcFRhYmxlcy5jbGVhcigpOworICAgIC8vIEJsb2NrcyBtYXkgaGF2ZSBzaGlmdGVkIGFyb3VuZC4gS2VlcCB0aGUgbnVtYmVyaW5nIHVwIHRvIGRhdGUuCisgICAgTUYuUmVudW1iZXJCbG9ja3MoKTsKKyAgfQorCisgIC8vIFRodW1iMSBmdW5jdGlvbnMgY29udGFpbmluZyBjb25zdGFudCBwb29scyBnZXQgNC1ieXRlIGFsaWdubWVudC4KKyAgLy8gVGhpcyBpcyBzbyB3ZSBjYW4ga2VlcCBleGFjdCB0cmFjayBvZiB3aGVyZSB0aGUgYWxpZ25tZW50IHBhZGRpbmcgZ29lcy4KKworICAvLyBBUk0gYW5kIFRodW1iMiBmdW5jdGlvbnMgbmVlZCB0byBiZSA0LWJ5dGUgYWxpZ25lZC4KKyAgaWYgKCFpc1RodW1iMSkKKyAgICBNRi5FbnN1cmVBbGlnbm1lbnQoMik7ICAvLyAyID0gbG9nMig0KQorCisgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgcGxhY2VtZW50IG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMuICBUbyBzdGFydCB3aXRoLAorICAvLyB3ZSBwdXQgdGhlbSBhbGwgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVJbnN0cio+IENQRU1JczsKKyAgaWYgKCFNQ1AuaXNFbXB0eSgpKSB7CisgICAgRG9Jbml0aWFsUGxhY2VtZW50KE1GLCBDUEVNSXMpOworICAgIGlmIChpc1RodW1iMSkKKyAgICAgIE1GLkVuc3VyZUFsaWdubWVudCgyKTsgIC8vIDIgPSBsb2cyKDQpCisgIH0KKworICAvLy8gVGhlIG5leHQgVUlEIHRvIHRha2UgaXMgdGhlIGZpcnN0IHVudXNlZCBvbmUuCisgIEFGSS0+aW5pdENvbnN0UG9vbEVudHJ5VUlkKENQRU1Jcy5zaXplKCkpOworCisgIC8vIERvIHRoZSBpbml0aWFsIHNjYW4gb2YgdGhlIGZ1bmN0aW9uLCBidWlsZGluZyB1cCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgLy8gc2l6ZXMgb2YgZWFjaCBibG9jaywgdGhlIGxvY2F0aW9uIG9mIGFsbCB0aGUgd2F0ZXIsIGFuZCBmaW5kaW5nIGFsbCBvZiB0aGUKKyAgLy8gY29uc3RhbnQgcG9vbCB1c2Vycy4KKyAgSW5pdGlhbEZ1bmN0aW9uU2NhbihNRiwgQ1BFTUlzKTsKKyAgQ1BFTUlzLmNsZWFyKCk7CisgIERFQlVHKGR1bXBCQnMoKSk7CisKKworICAvLy8gUmVtb3ZlIGRlYWQgY29uc3RhbnQgcG9vbCBlbnRyaWVzLgorICBSZW1vdmVVbnVzZWRDUEVudHJpZXMoKTsKKworICAvLyBJdGVyYXRpdmVseSBwbGFjZSBjb25zdGFudCBwb29sIGVudHJpZXMgYW5kIGZpeCB1cCBicmFuY2hlcyB1bnRpbCB0aGVyZQorICAvLyBpcyBubyBjaGFuZ2UuCisgIHVuc2lnbmVkIE5vQ1BJdGVycyA9IDAsIE5vQlJJdGVycyA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgYm9vbCBDUENoYW5nZSA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUFVzZXJzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBDUENoYW5nZSB8PSBIYW5kbGVDb25zdGFudFBvb2xVc2VyKE1GLCBpKTsKKyAgICBpZiAoQ1BDaGFuZ2UgJiYgKytOb0NQSXRlcnMgPiAzMCkKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvbnN0YW50IElzbGFuZCBwYXNzIGZhaWxlZCB0byBjb252ZXJnZSEiKTsKKyAgICBERUJVRyhkdW1wQkJzKCkpOworCisgICAgLy8gQ2xlYXIgTmV3V2F0ZXJMaXN0IG5vdy4gIElmIHdlIHNwbGl0IGEgYmxvY2sgZm9yIGJyYW5jaGVzLCBpdCBzaG91bGQKKyAgICAvLyBhcHBlYXIgYXMgIm5ldyB3YXRlciIgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiBjb25zdGFudCBwb29sIHBsYWNlbWVudC4KKyAgICBOZXdXYXRlckxpc3QuY2xlYXIoKTsKKworICAgIGJvb2wgQlJDaGFuZ2UgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW1tQnJhbmNoZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIEJSQ2hhbmdlIHw9IEZpeFVwSW1tZWRpYXRlQnIoTUYsIEltbUJyYW5jaGVzW2ldKTsKKyAgICBpZiAoQlJDaGFuZ2UgJiYgKytOb0JSSXRlcnMgPiAzMCkKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkJyYW5jaCBGaXggVXAgcGFzcyBmYWlsZWQgdG8gY29udmVyZ2UhIik7CisgICAgREVCVUcoZHVtcEJCcygpKTsKKworICAgIGlmICghQ1BDaGFuZ2UgJiYgIUJSQ2hhbmdlKQorICAgICAgYnJlYWs7CisgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgIH0KKworICAvLyBTaHJpbmsgMzItYml0IFRodW1iMiBicmFuY2gsIGxvYWQsIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMuCisgIGlmIChpc1RodW1iMiAmJiAhU1RJLT5wcmVmZXJzMzJCaXRUaHVtYigpKQorICAgIE1hZGVDaGFuZ2UgfD0gT3B0aW1pemVUaHVtYjJJbnN0cnVjdGlvbnMoTUYpOworCisgIC8vIEFmdGVyIGEgd2hpbGUsIHRoaXMgbWlnaHQgYmUgbWFkZSBkZWJ1Zy1vbmx5LCBidXQgaXQgaXMgbm90IGV4cGVuc2l2ZS4KKyAgdmVyaWZ5KE1GKTsKKworICAvLyBJZiBMUiBoYXMgYmVlbiBmb3JjZWQgc3BpbGxlZCBhbmQgbm8gZmFyIGp1bXAgKGkuZS4gQkwpIGhhcyBiZWVuIGlzc3VlZCwKKyAgLy8gdW5kbyB0aGUgc3BpbGwgLyByZXN0b3JlIG9mIExSIGlmIHBvc3NpYmxlLgorICBpZiAoaXNUaHVtYiAmJiAhSGFzRmFySnVtcCAmJiBBRkktPmlzTFJTcGlsbGVkRm9yRmFySnVtcCgpKQorICAgIE1hZGVDaGFuZ2UgfD0gVW5kb0xSU3BpbGxSZXN0b3JlKCk7CisKKyAgREVCVUcoZXJycygpIDw8ICdcbic7IGR1bXBCQnMoKSk7CisKKyAgQkJTaXplcy5jbGVhcigpOworICBCQk9mZnNldHMuY2xlYXIoKTsKKyAgV2F0ZXJMaXN0LmNsZWFyKCk7CisgIENQVXNlcnMuY2xlYXIoKTsKKyAgQ1BFbnRyaWVzLmNsZWFyKCk7CisgIEltbUJyYW5jaGVzLmNsZWFyKCk7CisgIFB1c2hQb3BNSXMuY2xlYXIoKTsKKyAgVDJKdW1wVGFibGVzLmNsZWFyKCk7CisKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vLyBEb0luaXRpYWxQbGFjZW1lbnQgLSBQZXJmb3JtIHRoZSBpbml0aWFsIHBsYWNlbWVudCBvZiB0aGUgY29uc3RhbnQgcG9vbAorLy8vIGVudHJpZXMuICBUbyBzdGFydCB3aXRoLCB3ZSBwdXQgdGhlbSBhbGwgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCit2b2lkIEFSTUNvbnN0YW50SXNsYW5kczo6RG9Jbml0aWFsUGxhY2VtZW50KE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyKj4gJkNQRU1JcykgeworICAvLyBDcmVhdGUgdGhlIGJhc2ljIGJsb2NrIHRvIGhvbGQgdGhlIENQRSdzLgorICBNYWNoaW5lQmFzaWNCbG9jayAqQkIgPSBNRi5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jaygpOworICBNRi5wdXNoX2JhY2soQkIpOworCisgIC8vIEFkZCBhbGwgb2YgdGhlIGNvbnN0YW50cyBmcm9tIHRoZSBjb25zdGFudCBwb29sIHRvIHRoZSBlbmQgYmxvY2ssIHVzZSBhbgorICAvLyBpZGVudGl0eSBtYXBwaW5nIG9mIENQSSdzIHRvIENQRSdzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQ29uc3RhbnRQb29sRW50cnk+ICZDUHMgPQorICAgIE1GLmdldENvbnN0YW50UG9vbCgpLT5nZXRDb25zdGFudHMoKTsKKworICBjb25zdCBUYXJnZXREYXRhICZURCA9ICpNRi5nZXRUYXJnZXQoKS5nZXRUYXJnZXREYXRhKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIFNpemUgPSBURC5nZXRUeXBlQWxsb2NTaXplKENQc1tpXS5nZXRUeXBlKCkpOworICAgIC8vIFZlcmlmeSB0aGF0IGFsbCBjb25zdGFudCBwb29sIGVudHJpZXMgYXJlIGEgbXVsdGlwbGUgb2YgNCBieXRlcy4gIElmIG5vdCwKKyAgICAvLyB3ZSB3b3VsZCBoYXZlIHRvIHBhZCB0aGVtIG91dCBvciBzb21ldGhpbmcgc28gdGhhdCBpbnN0cnVjdGlvbnMgc3RheQorICAgIC8vIGFsaWduZWQuCisgICAgYXNzZXJ0KChTaXplICYgMykgPT0gMCAmJiAiQ1AgRW50cnkgbm90IG11bHRpcGxlIG9mIDQgYnl0ZXMhIik7CisgICAgTWFjaGluZUluc3RyICpDUEVNSSA9CisgICAgICBCdWlsZE1JKEJCLCBEZWJ1Z0xvYygpLCBUSUktPmdldChBUk06OkNPTlNUUE9PTF9FTlRSWSkpCisgICAgICAgIC5hZGRJbW0oaSkuYWRkQ29uc3RhbnRQb29sSW5kZXgoaSkuYWRkSW1tKFNpemUpOworICAgIENQRU1Jcy5wdXNoX2JhY2soQ1BFTUkpOworCisgICAgLy8gQWRkIGEgbmV3IENQRW50cnksIGJ1dCBubyBjb3JyZXNwb25kaW5nIENQVXNlciB5ZXQuCisgICAgc3RkOjp2ZWN0b3I8Q1BFbnRyeT4gQ1BFczsKKyAgICBDUEVzLnB1c2hfYmFjayhDUEVudHJ5KENQRU1JLCBpKSk7CisgICAgQ1BFbnRyaWVzLnB1c2hfYmFjayhDUEVzKTsKKyAgICArK051bUNQRXM7CisgICAgREVCVUcoZXJycygpIDw8ICJNb3ZlZCBDUEkjIiA8PCBpIDw8ICIgdG8gZW5kIG9mIGZ1bmN0aW9uIGFzICMiIDw8IGkKKyAgICAgICAgICAgICAgICAgPDwgIlxuIik7CisgIH0KK30KKworLy8vIEJCSGFzRmFsbHRocm91Z2ggLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrIGNhbiBmYWxsdGhyb3VnaAorLy8vIGludG8gdGhlIGJsb2NrIGltbWVkaWF0ZWx5IGFmdGVyIGl0Lgorc3RhdGljIGJvb2wgQkJIYXNGYWxsdGhyb3VnaChNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIC8vIEdldCB0aGUgbmV4dCBtYWNoaW5lIGJhc2ljIGJsb2NrIGluIHRoZSBmdW5jdGlvbi4KKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkJJID0gTUJCOworICAvLyBDYW4ndCBmYWxsIG9mZiBlbmQgb2YgZnVuY3Rpb24uCisgIGlmIChsbHZtOjpuZXh0KE1CQkkpID09IE1CQi0+Z2V0UGFyZW50KCktPmVuZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBNYWNoaW5lQmFzaWNCbG9jayAqTmV4dEJCID0gbGx2bTo6bmV4dChNQkJJKTsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6c3VjY19pdGVyYXRvciBJID0gTUJCLT5zdWNjX2JlZ2luKCksCisgICAgICAgRSA9IE1CQi0+c3VjY19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCpJID09IE5leHRCQikKKyAgICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGZpbmRDb25zdFBvb2xFbnRyeSAtIEdpdmVuIHRoZSBjb25zdHBvb2wgaW5kZXggYW5kIENPTlNUUE9PTF9FTlRSWSBNSSwKKy8vLyBsb29rIHVwIHRoZSBjb3JyZXNwb25kaW5nIENQRW50cnkuCitBUk1Db25zdGFudElzbGFuZHM6OkNQRW50cnkKKypBUk1Db25zdGFudElzbGFuZHM6OmZpbmRDb25zdFBvb2xFbnRyeSh1bnNpZ25lZCBDUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpDUEVNSSkgeworICBzdGQ6OnZlY3RvcjxDUEVudHJ5PiAmQ1BFcyA9IENQRW50cmllc1tDUEldOworICAvLyBOdW1iZXIgb2YgZW50cmllcyBwZXIgY29uc3Rwb29sIGluZGV4IHNob3VsZCBiZSBzbWFsbCwganVzdCBkbyBhCisgIC8vIGxpbmVhciBzZWFyY2guCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUEVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoQ1BFc1tpXS5DUEVNSSA9PSBDUEVNSSkKKyAgICAgIHJldHVybiAmQ1BFc1tpXTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLy8vIEp1bXBUYWJsZUZ1bmN0aW9uU2NhbiAtIERvIGEgc2NhbiBvZiB0aGUgZnVuY3Rpb24sIGJ1aWxkaW5nIHVwCisvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNpemVzIG9mIGVhY2ggYmxvY2sgYW5kIHRoZSBsb2NhdGlvbnMgb2YgYWxsCisvLy8gdGhlIGp1bXAgdGFibGVzLgordm9pZCBBUk1Db25zdGFudElzbGFuZHM6Okp1bXBUYWJsZUZ1bmN0aW9uU2NhbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkJJID0gTUYuYmVnaW4oKSwgRSA9IE1GLmVuZCgpOworICAgICAgIE1CQkkgIT0gRTsgKytNQkJJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9ICpNQkJJOworCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5iZWdpbigpLCBFID0gTUJCLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBpZiAoSS0+Z2V0RGVzYygpLmlzQnJhbmNoKCkgJiYgSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0MkJSX0pUKQorICAgICAgICBUMkp1bXBUYWJsZXMucHVzaF9iYWNrKEkpOworICB9Cit9CisKKy8vLyBJbml0aWFsRnVuY3Rpb25TY2FuIC0gRG8gdGhlIGluaXRpYWwgc2NhbiBvZiB0aGUgZnVuY3Rpb24sIGJ1aWxkaW5nIHVwCisvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNpemVzIG9mIGVhY2ggYmxvY2ssIHRoZSBsb2NhdGlvbiBvZiBhbGwgdGhlIHdhdGVyLAorLy8vIGFuZCBmaW5kaW5nIGFsbCBvZiB0aGUgY29uc3RhbnQgcG9vbCB1c2Vycy4KK3ZvaWQgQVJNQ29uc3RhbnRJc2xhbmRzOjpJbml0aWFsRnVuY3Rpb25TY2FuKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPiAmQ1BFTUlzKSB7CisgIC8vIEZpcnN0IHRoaW5nLCBzZWUgaWYgdGhlIGZ1bmN0aW9uIGhhcyBhbnkgaW5saW5lIGFzc2VtYmx5IGluIGl0LiBJZiBzbywKKyAgLy8gd2UgaGF2ZSB0byBiZSBjb25zZXJ2YXRpdmUgYWJvdXQgYWxpZ25tZW50IGFzc3VtcHRpb25zLCBhcyB3ZSBkb24ndAorICAvLyBrbm93IGZvciBzdXJlIHRoZSBzaXplIG9mIGFueSBpbnN0cnVjdGlvbnMgaW4gdGhlIGlubGluZSBhc3NlbWJseS4KKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7CisgICAgICAgTUJCSSAhPSBFOyArK01CQkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1CQkk7CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5iZWdpbigpLCBFID0gTUJCLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpJTkxJTkVBU00pCisgICAgICAgIEhhc0lubGluZUFzbSA9IHRydWU7CisgIH0KKworICAvLyBOb3cgZ28gYmFjayB0aHJvdWdoIHRoZSBpbnN0cnVjdGlvbnMgYW5kIGJ1aWxkIHVwIG91ciBkYXRhIHN0cnVjdHVyZXMKKyAgdW5zaWduZWQgT2Zmc2V0ID0gMDsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7CisgICAgICAgTUJCSSAhPSBFOyArK01CQkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1CQkk7CisKKyAgICAvLyBJZiB0aGlzIGJsb2NrIGRvZXNuJ3QgZmFsbCB0aHJvdWdoIGludG8gdGhlIG5leHQgTUJCLCB0aGVuIHRoaXMgaXMKKyAgICAvLyAnd2F0ZXInIHRoYXQgYSBjb25zdGFudCBwb29sIGlzbGFuZCBjb3VsZCBiZSBwbGFjZWQuCisgICAgaWYgKCFCQkhhc0ZhbGx0aHJvdWdoKCZNQkIpKQorICAgICAgV2F0ZXJMaXN0LnB1c2hfYmFjaygmTUJCKTsKKworICAgIHVuc2lnbmVkIE1CQlNpemUgPSAwOworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuYmVnaW4oKSwgRSA9IE1CQi5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gQWRkIGluc3RydWN0aW9uIHNpemUgdG8gTUJCU2l6ZS4KKyAgICAgIE1CQlNpemUgKz0gVElJLT5HZXRJbnN0U2l6ZUluQnl0ZXMoSSk7CisKKyAgICAgIGludCBPcGMgPSBJLT5nZXRPcGNvZGUoKTsKKyAgICAgIGlmIChJLT5nZXREZXNjKCkuaXNCcmFuY2goKSkgeworICAgICAgICBib29sIGlzQ29uZCA9IGZhbHNlOworICAgICAgICB1bnNpZ25lZCBCaXRzID0gMDsKKyAgICAgICAgdW5zaWduZWQgU2NhbGUgPSAxOworICAgICAgICBpbnQgVU9wYyA9IE9wYzsKKyAgICAgICAgc3dpdGNoIChPcGMpIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjb250aW51ZTsgIC8vIElnbm9yZSBvdGhlciBKVCBicmFuY2hlcworICAgICAgICBjYXNlIEFSTTo6dEJSX0pUcjoKKyAgICAgICAgICAvLyBBIFRodW1iMSB0YWJsZSBqdW1wIG1heSBpbnZvbHZlIHBhZGRpbmc7IGZvciB0aGUgb2Zmc2V0cyB0bworICAgICAgICAgIC8vIGJlIHJpZ2h0LCBmdW5jdGlvbnMgY29udGFpbmluZyB0aGVzZSBtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICAgICAgICAgIC8vIHRCUl9KVHIgZXhwYW5kcyB0byBhIG1vdiBwYyBmb2xsb3dlZCBieSAuYWxpZ24gMiBhbmQgdGhlbiB0aGUganVtcAorICAgICAgICAgIC8vIHRhYmxlIGVudHJpZXMuIFNvIHRoaXMgY29kZSBjaGVja3Mgd2hldGhlciBvZmZzZXQgb2YgdEJSX0pUciArIDIKKyAgICAgICAgICAvLyBpcyBhbGlnbmVkLiAgVGhhdCBpcyBoZWxkIGluIE9mZnNldCtNQkJTaXplLCB3aGljaCBhbHJlYWR5IGhhcworICAgICAgICAgIC8vIDIgYWRkZWQgaW4gZm9yIHRoZSBzaXplIG9mIHRoZSBtb3YgcGMgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgTUYuRW5zdXJlQWxpZ25tZW50KDJVKTsKKyAgICAgICAgICBpZiAoKE9mZnNldCtNQkJTaXplKSU0ICE9IDAgfHwgSGFzSW5saW5lQXNtKQorICAgICAgICAgICAgLy8gRklYTUU6IEFkZCBhIHBzZXVkbyBBTElHTiBpbnN0cnVjdGlvbiBpbnN0ZWFkLgorICAgICAgICAgICAgTUJCU2l6ZSArPSAyOyAgICAgICAgICAgLy8gcGFkZGluZworICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIERvZXMgbm90IGdldCBhbiBlbnRyeSBpbiBJbW1CcmFuY2hlcworICAgICAgICBjYXNlIEFSTTo6dDJCUl9KVDoKKyAgICAgICAgICBUMkp1bXBUYWJsZXMucHVzaF9iYWNrKEkpOworICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIERvZXMgbm90IGdldCBhbiBlbnRyeSBpbiBJbW1CcmFuY2hlcworICAgICAgICBjYXNlIEFSTTo6QmNjOgorICAgICAgICAgIGlzQ29uZCA9IHRydWU7CisgICAgICAgICAgVU9wYyA9IEFSTTo6QjsKKyAgICAgICAgICAvLyBGYWxsdGhyb3VnaAorICAgICAgICBjYXNlIEFSTTo6QjoKKyAgICAgICAgICBCaXRzID0gMjQ7CisgICAgICAgICAgU2NhbGUgPSA0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFSTTo6dEJjYzoKKyAgICAgICAgICBpc0NvbmQgPSB0cnVlOworICAgICAgICAgIFVPcGMgPSBBUk06OnRCOworICAgICAgICAgIEJpdHMgPSA4OworICAgICAgICAgIFNjYWxlID0gMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBUk06OnRCOgorICAgICAgICAgIEJpdHMgPSAxMTsKKyAgICAgICAgICBTY2FsZSA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVJNOjp0MkJjYzoKKyAgICAgICAgICBpc0NvbmQgPSB0cnVlOworICAgICAgICAgIFVPcGMgPSBBUk06OnQyQjsKKyAgICAgICAgICBCaXRzID0gMjA7CisgICAgICAgICAgU2NhbGUgPSAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFSTTo6dDJCOgorICAgICAgICAgIEJpdHMgPSAyNDsKKyAgICAgICAgICBTY2FsZSA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWNvcmQgdGhpcyBpbW1lZGlhdGUgYnJhbmNoLgorICAgICAgICB1bnNpZ25lZCBNYXhPZmZzID0gKCgxIDw8IChCaXRzLTEpKS0xKSAqIFNjYWxlOworICAgICAgICBJbW1CcmFuY2hlcy5wdXNoX2JhY2soSW1tQnJhbmNoKEksIE1heE9mZnMsIGlzQ29uZCwgVU9wYykpOworICAgICAgfQorCisgICAgICBpZiAoT3BjID09IEFSTTo6dFBVU0ggfHwgT3BjID09IEFSTTo6dFBPUF9SRVQpCisgICAgICAgIFB1c2hQb3BNSXMucHVzaF9iYWNrKEkpOworCisgICAgICBpZiAoT3BjID09IEFSTTo6Q09OU1RQT09MX0VOVFJZKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gU2NhbiB0aGUgaW5zdHJ1Y3Rpb25zIGZvciBjb25zdGFudCBwb29sIG9wZXJhbmRzLgorICAgICAgZm9yICh1bnNpZ25lZCBvcCA9IDAsIGUgPSBJLT5nZXROdW1PcGVyYW5kcygpOyBvcCAhPSBlOyArK29wKQorICAgICAgICBpZiAoSS0+Z2V0T3BlcmFuZChvcCkuaXNDUEkoKSkgeworICAgICAgICAgIC8vIFdlIGZvdW5kIG9uZS4gIFRoZSBhZGRyZXNzaW5nIG1vZGUgdGVsbHMgdXMgdGhlIG1heCBkaXNwbGFjZW1lbnQKKyAgICAgICAgICAvLyBmcm9tIHRoZSBQQyB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gcGVybWl0cy4KKworICAgICAgICAgIC8vIEJhc2ljIHNpemUgaW5mbyBjb21lcyBmcm9tIHRoZSBUU0ZsYWdzIGZpZWxkLgorICAgICAgICAgIHVuc2lnbmVkIEJpdHMgPSAwOworICAgICAgICAgIHVuc2lnbmVkIFNjYWxlID0gMTsKKyAgICAgICAgICBib29sIE5lZ09rID0gZmFsc2U7CisgICAgICAgICAgYm9vbCBJc1NvSW1tID0gZmFsc2U7CisKKyAgICAgICAgICBzd2l0Y2ggKE9wYykgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGFkZHJlc3NpbmcgbW9kZSBmb3IgQ1AgcmVmZXJlbmNlISIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAvLyBUYWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSBDUCBlbnRyeS4KKyAgICAgICAgICBjYXNlIEFSTTo6TEVBcGNyZWw6CisgICAgICAgICAgICAvLyBUaGlzIHRha2VzIGEgU29JbW0sIHdoaWNoIGlzIDggYml0IGltbWVkaWF0ZSByb3RhdGVkLiBXZSdsbAorICAgICAgICAgICAgLy8gcHJldGVuZCB0aGUgbWF4aW11bSBvZmZzZXQgaXMgMjU1ICogNC4gU2luY2UgZWFjaCBpbnN0cnVjdGlvbgorICAgICAgICAgICAgLy8gNCBieXRlIHdpZGUsIHRoaXMgaXMgYWx3YXlzIGNvcnJlY3QuIFdlJ2xsIGNoZWNrIGZvciBvdGhlcgorICAgICAgICAgICAgLy8gZGlzcGxhY2VtZW50cyB0aGF0IGZpdHMgaW4gYSBTb0ltbSBhcyB3ZWxsLgorICAgICAgICAgICAgQml0cyA9IDg7CisgICAgICAgICAgICBTY2FsZSA9IDQ7CisgICAgICAgICAgICBOZWdPayA9IHRydWU7CisgICAgICAgICAgICBJc1NvSW1tID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQVJNOjp0MkxFQXBjcmVsOgorICAgICAgICAgICAgQml0cyA9IDEyOworICAgICAgICAgICAgTmVnT2sgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBBUk06OnRMRUFwY3JlbDoKKyAgICAgICAgICAgIEJpdHMgPSA4OworICAgICAgICAgICAgU2NhbGUgPSA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEFSTTo6TERSOgorICAgICAgICAgIGNhc2UgQVJNOjpMRFJjcDoKKyAgICAgICAgICBjYXNlIEFSTTo6dDJMRFJwY2k6CisgICAgICAgICAgICBCaXRzID0gMTI7ICAvLyArLW9mZnNldF8xMgorICAgICAgICAgICAgTmVnT2sgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEFSTTo6dExEUnBjaToKKyAgICAgICAgICBjYXNlIEFSTTo6dExEUmNwOgorICAgICAgICAgICAgQml0cyA9IDg7CisgICAgICAgICAgICBTY2FsZSA9IDQ7ICAvLyArKG9mZnNldF84KjQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgQVJNOjpWTERSRDoKKyAgICAgICAgICBjYXNlIEFSTTo6VkxEUlM6CisgICAgICAgICAgICBCaXRzID0gODsKKyAgICAgICAgICAgIFNjYWxlID0gNDsgIC8vICstKG9mZnNldF84KjQpCisgICAgICAgICAgICBOZWdPayA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHRoaXMgaXMgYSB1c2VyIG9mIGEgQ1AgZW50cnkuCisgICAgICAgICAgdW5zaWduZWQgQ1BJID0gSS0+Z2V0T3BlcmFuZChvcCkuZ2V0SW5kZXgoKTsKKyAgICAgICAgICBNYWNoaW5lSW5zdHIgKkNQRU1JID0gQ1BFTUlzW0NQSV07CisgICAgICAgICAgdW5zaWduZWQgTWF4T2ZmcyA9ICgoMSA8PCBCaXRzKS0xKSAqIFNjYWxlOworICAgICAgICAgIENQVXNlcnMucHVzaF9iYWNrKENQVXNlcihJLCBDUEVNSSwgTWF4T2ZmcywgTmVnT2ssIElzU29JbW0pKTsKKworICAgICAgICAgIC8vIEluY3JlbWVudCBjb3JyZXNwb25kaW5nIENQRW50cnkgcmVmZXJlbmNlIGNvdW50LgorICAgICAgICAgIENQRW50cnkgKkNQRSA9IGZpbmRDb25zdFBvb2xFbnRyeShDUEksIENQRU1JKTsKKyAgICAgICAgICBhc3NlcnQoQ1BFICYmICJDYW5ub3QgZmluZCBhIGNvcnJlc3BvbmRpbmcgQ1BFbnRyeSEiKTsKKyAgICAgICAgICBDUEUtPlJlZkNvdW50Kys7CisKKyAgICAgICAgICAvLyBJbnN0cnVjdGlvbnMgY2FuIG9ubHkgdXNlIG9uZSBDUCBlbnRyeSwgZG9uJ3QgYm90aGVyIHNjYW5uaW5nIHRoZQorICAgICAgICAgIC8vIHJlc3Qgb2YgdGhlIG9wZXJhbmRzLgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW4gdGh1bWIgbW9kZSwgaWYgdGhpcyBibG9jayBpcyBhIGNvbnN0cG9vbCBpc2xhbmQsIHdlIG1heSBuZWVkIHBhZGRpbmcKKyAgICAvLyBzbyBpdCdzIGFsaWduZWQgb24gNCBieXRlIGJvdW5kYXJ5LgorICAgIGlmIChpc1RodW1iICYmCisgICAgICAgICFNQkIuZW1wdHkoKSAmJgorICAgICAgICBNQkIuYmVnaW4oKS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpDT05TVFBPT0xfRU5UUlkgJiYKKyAgICAgICAgKChPZmZzZXQlNCkgIT0gMCB8fCBIYXNJbmxpbmVBc20pKQorICAgICAgTUJCU2l6ZSArPSAyOworCisgICAgQkJTaXplcy5wdXNoX2JhY2soTUJCU2l6ZSk7CisgICAgQkJPZmZzZXRzLnB1c2hfYmFjayhPZmZzZXQpOworICAgIE9mZnNldCArPSBNQkJTaXplOworICB9Cit9CisKKy8vLyBHZXRPZmZzZXRPZiAtIFJldHVybiB0aGUgY3VycmVudCBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uCisvLy8gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgVGhpcyBvZmZzZXQgY2hhbmdlcyBhcyBzdHVmZiBpcyBtb3ZlZAorLy8vIGFyb3VuZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLgordW5zaWduZWQgQVJNQ29uc3RhbnRJc2xhbmRzOjpHZXRPZmZzZXRPZihNYWNoaW5lSW5zdHIgKk1JKSBjb25zdCB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNSS0+Z2V0UGFyZW50KCk7CisKKyAgLy8gVGhlIG9mZnNldCBpcyBjb21wb3NlZCBvZiB0d28gdGhpbmdzOiB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiBhbGwgTUJCJ3MKKyAgLy8gYmVmb3JlIHRoaXMgaW5zdHJ1Y3Rpb24ncyBibG9jaywgYW5kIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrCisgIC8vIGl0IGlzIGluLgorICB1bnNpZ25lZCBPZmZzZXQgPSBCQk9mZnNldHNbTUJCLT5nZXROdW1iZXIoKV07CisKKyAgLy8gSWYgd2UncmUgbG9va2luZyBmb3IgYSBDT05TVFBPT0xfRU5UUlkgaW4gVGh1bWIsIHNlZSBpZiB0aGlzIGJsb2NrIGhhcworICAvLyBhbGlnbm1lbnQgcGFkZGluZywgYW5kIGNvbXBlbnNhdGUgaWYgc28uCisgIGlmIChpc1RodW1iICYmCisgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpDT05TVFBPT0xfRU5UUlkgJiYKKyAgICAgIChPZmZzZXQlNCAhPSAwIHx8IEhhc0lubGluZUFzbSkpCisgICAgT2Zmc2V0ICs9IDI7CisKKyAgLy8gU3VtIGluc3RydWN0aW9ucyBiZWZvcmUgTUkgaW4gTUJCLgorICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLT5iZWdpbigpOyA7ICsrSSkgeworICAgIGFzc2VydChJICE9IE1CQi0+ZW5kKCkgJiYgIkRpZG4ndCBmaW5kIE1JIGluIGl0cyBvd24gYmFzaWMgYmxvY2s/Iik7CisgICAgaWYgKCYqSSA9PSBNSSkgcmV0dXJuIE9mZnNldDsKKyAgICBPZmZzZXQgKz0gVElJLT5HZXRJbnN0U2l6ZUluQnl0ZXMoSSk7CisgIH0KK30KKworLy8vIENvbXBhcmVNQkJOdW1iZXJzIC0gTGl0dGxlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBzb3J0IHRoZSBXYXRlckxpc3QgYnkgTUJCCisvLy8gSUQuCitzdGF0aWMgYm9vbCBDb21wYXJlTUJCTnVtYmVycyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlJIUykgeworICByZXR1cm4gTEhTLT5nZXROdW1iZXIoKSA8IFJIUy0+Z2V0TnVtYmVyKCk7Cit9CisKKy8vLyBVcGRhdGVGb3JJbnNlcnRlZFdhdGVyQmxvY2sgLSBXaGVuIGEgYmxvY2sgaXMgbmV3bHkgaW5zZXJ0ZWQgaW50byB0aGUKKy8vLyBtYWNoaW5lIGZ1bmN0aW9uLCBpdCB1cHNldHMgYWxsIG9mIHRoZSBibG9jayBudW1iZXJzLiAgUmVudW1iZXIgdGhlIGJsb2NrcworLy8vIGFuZCB1cGRhdGUgdGhlIGFycmF5cyB0aGF0IHBhcmFsbGVsIHRoaXMgbnVtYmVyaW5nLgordm9pZCBBUk1Db25zdGFudElzbGFuZHM6OlVwZGF0ZUZvckluc2VydGVkV2F0ZXJCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTmV3QkIpIHsKKyAgLy8gUmVudW1iZXIgdGhlIE1CQidzIHRvIGtlZXAgdGhlbSBjb25zZXF1dGl2ZS4KKyAgTmV3QkItPmdldFBhcmVudCgpLT5SZW51bWJlckJsb2NrcyhOZXdCQik7CisKKyAgLy8gSW5zZXJ0IGEgc2l6ZSBpbnRvIEJCU2l6ZXMgdG8gYWxpZ24gaXQgcHJvcGVybHkgd2l0aCB0aGUgKG5ld2x5CisgIC8vIHJlbnVtYmVyZWQpIGJsb2NrIG51bWJlcnMuCisgIEJCU2l6ZXMuaW5zZXJ0KEJCU2l6ZXMuYmVnaW4oKStOZXdCQi0+Z2V0TnVtYmVyKCksIDApOworCisgIC8vIExpa2V3aXNlIGZvciBCQk9mZnNldHMuCisgIEJCT2Zmc2V0cy5pbnNlcnQoQkJPZmZzZXRzLmJlZ2luKCkrTmV3QkItPmdldE51bWJlcigpLCAwKTsKKworICAvLyBOZXh0LCB1cGRhdGUgV2F0ZXJMaXN0LiAgU3BlY2lmaWNhbGx5LCB3ZSBuZWVkIHRvIGFkZCBOZXdNQkIgYXMgaGF2aW5nCisgIC8vIGF2YWlsYWJsZSB3YXRlciBhZnRlciBpdC4KKyAgd2F0ZXJfaXRlcmF0b3IgSVAgPQorICAgIHN0ZDo6bG93ZXJfYm91bmQoV2F0ZXJMaXN0LmJlZ2luKCksIFdhdGVyTGlzdC5lbmQoKSwgTmV3QkIsCisgICAgICAgICAgICAgICAgICAgICBDb21wYXJlTUJCTnVtYmVycyk7CisgIFdhdGVyTGlzdC5pbnNlcnQoSVAsIE5ld0JCKTsKK30KKworCisvLy8gU3BsaXQgdGhlIGJhc2ljIGJsb2NrIGNvbnRhaW5pbmcgTUkgaW50byB0d28gYmxvY2tzLCB3aGljaCBhcmUgam9pbmVkIGJ5CisvLy8gYW4gdW5jb25kaXRpb25hbCBicmFuY2guICBVcGRhdGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCByZW51bWJlciBibG9ja3MgdG8KKy8vLyBhY2NvdW50IGZvciB0aGlzIGNoYW5nZSBhbmQgcmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCBibG9jay4KK01hY2hpbmVCYXNpY0Jsb2NrICpBUk1Db25zdGFudElzbGFuZHM6OlNwbGl0QmxvY2tCZWZvcmVJbnN0cihNYWNoaW5lSW5zdHIgKk1JKSB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpPcmlnQkIgPSBNSS0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqT3JpZ0JCLT5nZXRQYXJlbnQoKTsKKworICAvLyBDcmVhdGUgYSBuZXcgTUJCIGZvciB0aGUgY29kZSBhZnRlciB0aGUgT3JpZ0JCLgorICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3QkIgPQorICAgIE1GLkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKE9yaWdCQi0+Z2V0QmFzaWNCbG9jaygpKTsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkJJID0gT3JpZ0JCOyArK01CQkk7CisgIE1GLmluc2VydChNQkJJLCBOZXdCQik7CisKKyAgLy8gU3BsaWNlIHRoZSBpbnN0cnVjdGlvbnMgc3RhcnRpbmcgd2l0aCBNSSBvdmVyIHRvIE5ld0JCLgorICBOZXdCQi0+c3BsaWNlKE5ld0JCLT5lbmQoKSwgT3JpZ0JCLCBNSSwgT3JpZ0JCLT5lbmQoKSk7CisKKyAgLy8gQWRkIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIGZyb20gT3JpZ0JCIHRvIE5ld0JCLgorICAvLyBOb3RlIHRoZSBuZXcgdW5jb25kaXRpb25hbCBicmFuY2ggaXMgbm90IGJlaW5nIHJlY29yZGVkLgorICAvLyBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgbWVhbmluZ2Z1bCBEZWJ1Z0luZm8gYXZhaWxhYmxlOyB0aGlzIGRvZXNuJ3QKKyAgLy8gY29ycmVzcG9uZCB0byBhbnl0aGluZyBpbiB0aGUgc291cmNlLgorICB1bnNpZ25lZCBPcGMgPSBpc1RodW1iID8gKGlzVGh1bWIyID8gQVJNOjp0MkIgOiBBUk06OnRCKSA6IEFSTTo6QjsKKyAgQnVpbGRNSShPcmlnQkIsIERlYnVnTG9jKCksIFRJSS0+Z2V0KE9wYykpLmFkZE1CQihOZXdCQik7CisgICsrTnVtU3BsaXQ7CisKKyAgLy8gVXBkYXRlIHRoZSBDRkcuICBBbGwgc3VjY3Mgb2YgT3JpZ0JCIGFyZSBub3cgc3VjY3Mgb2YgTmV3QkIuCisgIHdoaWxlICghT3JpZ0JCLT5zdWNjX2VtcHR5KCkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjYyA9ICpPcmlnQkItPnN1Y2NfYmVnaW4oKTsKKyAgICBPcmlnQkItPnJlbW92ZVN1Y2Nlc3NvcihTdWNjKTsKKyAgICBOZXdCQi0+YWRkU3VjY2Vzc29yKFN1Y2MpOworCisgICAgLy8gVGhpcyBwYXNzIHNob3VsZCBiZSBydW4gYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbiwgc28gdGhlcmUgc2hvdWxkIGJlIG5vCisgICAgLy8gUEhJIG5vZGVzIHRvIHVwZGF0ZS4KKyAgICBhc3NlcnQoKFN1Y2MtPmVtcHR5KCkgfHwgIVN1Y2MtPmJlZ2luKCktPmlzUEhJKCkpCisgICAgICAgICAgICYmICJQSEkgbm9kZXMgc2hvdWxkIGJlIGVsaW1pbmF0ZWQgYnkgbm93ISIpOworICB9CisKKyAgLy8gT3JpZ0JCIGJyYW5jaGVzIHRvIE5ld0JCLgorICBPcmlnQkItPmFkZFN1Y2Nlc3NvcihOZXdCQik7CisKKyAgLy8gVXBkYXRlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyB0byBhY2NvdW50IGZvciB0aGUgbmV3bHkgaW5zZXJ0ZWQgTUJCLgorICAvLyBUaGlzIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyBVcGRhdGVGb3JJbnNlcnRlZFdhdGVyQmxvY2ssIGV4Y2VwdCB0aGF0CisgIC8vIHRoZSBXYXRlciBnb2VzIGFmdGVyIE9yaWdCQiwgbm90IE5ld0JCLgorICBNRi5SZW51bWJlckJsb2NrcyhOZXdCQik7CisKKyAgLy8gSW5zZXJ0IGEgc2l6ZSBpbnRvIEJCU2l6ZXMgdG8gYWxpZ24gaXQgcHJvcGVybHkgd2l0aCB0aGUgKG5ld2x5CisgIC8vIHJlbnVtYmVyZWQpIGJsb2NrIG51bWJlcnMuCisgIEJCU2l6ZXMuaW5zZXJ0KEJCU2l6ZXMuYmVnaW4oKStOZXdCQi0+Z2V0TnVtYmVyKCksIDApOworCisgIC8vIExpa2V3aXNlIGZvciBCQk9mZnNldHMuCisgIEJCT2Zmc2V0cy5pbnNlcnQoQkJPZmZzZXRzLmJlZ2luKCkrTmV3QkItPmdldE51bWJlcigpLCAwKTsKKworICAvLyBOZXh0LCB1cGRhdGUgV2F0ZXJMaXN0LiAgU3BlY2lmaWNhbGx5LCB3ZSBuZWVkIHRvIGFkZCBPcmlnTUJCIGFzIGhhdmluZworICAvLyBhdmFpbGFibGUgd2F0ZXIgYWZ0ZXIgaXQgKGJ1dCBub3QgaWYgaXQncyBhbHJlYWR5IHRoZXJlLCB3aGljaCBoYXBwZW5zCisgIC8vIHdoZW4gc3BsaXR0aW5nIGJlZm9yZSBhIGNvbmRpdGlvbmFsIGJyYW5jaCB0aGF0IGlzIGZvbGxvd2VkIGJ5IGFuCisgIC8vIHVuY29uZGl0aW9uYWwgYnJhbmNoIC0gaW4gdGhhdCBjYXNlIHdlIHdhbnQgdG8gaW5zZXJ0IE5ld0JCKS4KKyAgd2F0ZXJfaXRlcmF0b3IgSVAgPQorICAgIHN0ZDo6bG93ZXJfYm91bmQoV2F0ZXJMaXN0LmJlZ2luKCksIFdhdGVyTGlzdC5lbmQoKSwgT3JpZ0JCLAorICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZU1CQk51bWJlcnMpOworICBNYWNoaW5lQmFzaWNCbG9jayogV2F0ZXJCQiA9ICpJUDsKKyAgaWYgKFdhdGVyQkIgPT0gT3JpZ0JCKQorICAgIFdhdGVyTGlzdC5pbnNlcnQobGx2bTo6bmV4dChJUCksIE5ld0JCKTsKKyAgZWxzZQorICAgIFdhdGVyTGlzdC5pbnNlcnQoSVAsIE9yaWdCQik7CisgIE5ld1dhdGVyTGlzdC5pbnNlcnQoT3JpZ0JCKTsKKworICB1bnNpZ25lZCBPcmlnQkJJID0gT3JpZ0JCLT5nZXROdW1iZXIoKTsKKyAgdW5zaWduZWQgTmV3QkJJID0gTmV3QkItPmdldE51bWJlcigpOworCisgIGludCBkZWx0YSA9IGlzVGh1bWIxID8gMiA6IDQ7CisKKyAgLy8gRmlndXJlIG91dCBob3cgbGFyZ2UgdGhlIE9yaWdCQiBpcy4gIEFzIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBvcmlnaW5hbAorICAvLyBibG9jaywgaXQgY2Fubm90IGNvbnRhaW4gYSB0YWJsZWp1bXAuICBUaGUgc2l6ZSBpbmNsdWRlcworICAvLyB0aGUgbmV3IGp1bXAgd2UgYWRkZWQuICAoSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGRvIHRoaXMgd2l0aG91dAorICAvLyByZWNvdW50aW5nIGV2ZXJ5dGhpbmcsIGJ1dCBpdCdzIHZlcnkgY29uZnVzaW5nLCBhbmQgdGhpcyBpcyByYXJlbHkKKyAgLy8gZXhlY3V0ZWQuKQorICB1bnNpZ25lZCBPcmlnQkJTaXplID0gMDsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE9yaWdCQi0+YmVnaW4oKSwgRSA9IE9yaWdCQi0+ZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgT3JpZ0JCU2l6ZSArPSBUSUktPkdldEluc3RTaXplSW5CeXRlcyhJKTsKKyAgQkJTaXplc1tPcmlnQkJJXSA9IE9yaWdCQlNpemU7CisKKyAgLy8gLi4uYW5kIGFkanVzdCBCQk9mZnNldHMgZm9yIE5ld0JCIGFjY29yZGluZ2x5LgorICBCQk9mZnNldHNbTmV3QkJJXSA9IEJCT2Zmc2V0c1tPcmlnQkJJXSArIEJCU2l6ZXNbT3JpZ0JCSV07CisKKyAgLy8gRmlndXJlIG91dCBob3cgbGFyZ2UgdGhlIE5ld01CQiBpcy4gIEFzIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgb3JpZ2luYWwKKyAgLy8gYmxvY2ssIGl0IG1heSBjb250YWluIGEgdGFibGVqdW1wLgorICB1bnNpZ25lZCBOZXdCQlNpemUgPSAwOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTmV3QkItPmJlZ2luKCksIEUgPSBOZXdCQi0+ZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgTmV3QkJTaXplICs9IFRJSS0+R2V0SW5zdFNpemVJbkJ5dGVzKEkpOworICAvLyBTZXQgdGhlIHNpemUgb2YgTmV3QkIgaW4gQkJTaXplcy4gIEl0IGRvZXMgbm90IGluY2x1ZGUgYW55IHBhZGRpbmcgbm93LgorICBCQlNpemVzW05ld0JCSV0gPSBOZXdCQlNpemU7CisKKyAgTWFjaGluZUluc3RyKiBUaHVtYkpUTUkgPSBwcmlvcihOZXdCQi0+ZW5kKCkpOworICBpZiAoVGh1bWJKVE1JLT5nZXRPcGNvZGUoKSA9PSBBUk06OnRCUl9KVHIpIHsKKyAgICAvLyBXZSd2ZSBhZGRlZCBhbm90aGVyIDItYnl0ZSBpbnN0cnVjdGlvbiBiZWZvcmUgdGhpcyB0YWJsZWp1bXAsIHdoaWNoCisgICAgLy8gbWVhbnMgd2Ugd2lsbCBhbHdheXMgbmVlZCBwYWRkaW5nIGlmIHdlIGRpZG4ndCBiZWZvcmUsIGFuZCB2aWNlIHZlcnNhLgorCisgICAgLy8gVGhlIG9yaWdpbmFsIG9mZnNldCBvZiB0aGUganVtcCBpbnN0cnVjdGlvbiB3YXM6CisgICAgdW5zaWduZWQgT3JpZ09mZnNldCA9IEJCT2Zmc2V0c1tPcmlnQkJJXSArIEJCU2l6ZXNbT3JpZ0JCSV0gLSBkZWx0YTsKKyAgICBpZiAoT3JpZ09mZnNldCU0ID09IDApIHsKKyAgICAgIC8vIFdlIGhhZCBwYWRkaW5nIGJlZm9yZSBhbmQgbm93IHdlIGRvbid0LiAgTm8gbmV0IGNoYW5nZSBpbiBjb2RlIHNpemUuCisgICAgICBkZWx0YSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIGRpZG4ndCBoYXZlIHBhZGRpbmcgYmVmb3JlIGFuZCBub3cgd2UgZG8uCisgICAgICBCQlNpemVzW05ld0JCSV0gKz0gMjsKKyAgICAgIGRlbHRhID0gNDsKKyAgICB9CisgIH0KKworICAvLyBBbGwgQkJPZmZzZXRzIGZvbGxvd2luZyB0aGVzZSBibG9ja3MgbXVzdCBiZSBtb2RpZmllZC4KKyAgaWYgKGRlbHRhKQorICAgIEFkanVzdEJCT2Zmc2V0c0FmdGVyKE5ld0JCLCBkZWx0YSk7CisKKyAgcmV0dXJuIE5ld0JCOworfQorCisvLy8gT2Zmc2V0SXNJblJhbmdlIC0gQ2hlY2tzIHdoZXRoZXIgVXNlck9mZnNldCAodGhlIGxvY2F0aW9uIG9mIGEgY29uc3RhbnQgcG9vbAorLy8vIHJlZmVyZW5jZSkgaXMgd2l0aGluIE1heERpc3Agb2YgVHJpYWxPZmZzZXQgKGEgcHJvcG9zZWQgbG9jYXRpb24gb2YgYQorLy8vIGNvbnN0YW50IHBvb2wgZW50cnkpLgorYm9vbCBBUk1Db25zdGFudElzbGFuZHM6Ok9mZnNldElzSW5SYW5nZSh1bnNpZ25lZCBVc2VyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUcmlhbE9mZnNldCwgdW5zaWduZWQgTWF4RGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOZWdhdGl2ZU9LLCBib29sIElzU29JbW0pIHsKKyAgLy8gT24gVGh1bWIgb2Zmc2V0cz09MiBtb2QgNCBhcmUgcm91bmRlZCBkb3duIGJ5IHRoZSBoYXJkd2FyZSBmb3IKKyAgLy8gcHVycG9zZXMgb2YgdGhlIGRpc3BsYWNlbWVudCBjb21wdXRhdGlvbjsgY29tcGVuc2F0ZSBmb3IgdGhhdCBoZXJlLgorICAvLyBFZmZlY3RpdmVseSwgdGhlIHZhbGlkIHJhbmdlIG9mIGRpc3BsYWNlbWVudHMgaXMgMiBieXRlcyBzbWFsbGVyIGZvciBzdWNoCisgIC8vIHJlZmVyZW5jZXMuCisgIHVuc2lnbmVkIFRvdGFsQWRqID0gMDsKKyAgaWYgKGlzVGh1bWIgJiYgVXNlck9mZnNldCU0ICE9MCkgeworICAgIFVzZXJPZmZzZXQgLT0gMjsKKyAgICBUb3RhbEFkaiA9IDI7CisgIH0KKyAgLy8gQ1BFcyB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiA0LgorICBpZiAoaXNUaHVtYiAmJiBUcmlhbE9mZnNldCU0ICE9IDApIHsKKyAgICBUcmlhbE9mZnNldCArPSAyOworICAgIFRvdGFsQWRqICs9IDI7CisgIH0KKworICAvLyBJbiBUaHVtYjIgbW9kZSwgbGF0ZXIgYnJhbmNoIGFkanVzdG1lbnRzIGNhbiBzaGlmdCBpbnN0cnVjdGlvbnMgdXAgYW5kCisgIC8vIGNhdXNlIGFsaWdubWVudCBjaGFuZ2UuIEluIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvIHRoaXMgY2FuIGNhdXNlIHRoZQorICAvLyB1c2VyJ3MgZWZmZWN0aXZlIGFkZHJlc3MgdG8gYmUgc3VidHJhY3RlZCBieSAyIGFuZCB0aGUgQ1BFJ3MgYWRkcmVzcyB0bworICAvLyBiZSBwbHVzIDIuCisgIGlmIChpc1RodW1iMiAmJiBUb3RhbEFkaiAhPSA0KQorICAgIE1heERpc3AgLT0gKDQgLSBUb3RhbEFkaik7CisKKyAgaWYgKFVzZXJPZmZzZXQgPD0gVHJpYWxPZmZzZXQpIHsKKyAgICAvLyBVc2VyIGJlZm9yZSB0aGUgVHJpYWwuCisgICAgaWYgKFRyaWFsT2Zmc2V0IC0gVXNlck9mZnNldCA8PSBNYXhEaXNwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gRklYTUU6IE1ha2UgdXNlIGZ1bGwgcmFuZ2Ugb2Ygc29pbW0gdmFsdWVzLgorICB9IGVsc2UgaWYgKE5lZ2F0aXZlT0spIHsKKyAgICBpZiAoVXNlck9mZnNldCAtIFRyaWFsT2Zmc2V0IDw9IE1heERpc3ApCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBGSVhNRTogTWFrZSB1c2UgZnVsbCByYW5nZSBvZiBzb2ltbSB2YWx1ZXMuCisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gV2F0ZXJJc0luUmFuZ2UgLSBSZXR1cm5zIHRydWUgaWYgYSBDUEUgcGxhY2VkIGFmdGVyIHRoZSBzcGVjaWZpZWQKKy8vLyBXYXRlciAoYSBiYXNpYyBibG9jaykgd2lsbCBiZSBpbiByYW5nZSBmb3IgdGhlIHNwZWNpZmljIE1JLgorCitib29sIEFSTUNvbnN0YW50SXNsYW5kczo6V2F0ZXJJc0luUmFuZ2UodW5zaWduZWQgVXNlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayogV2F0ZXIsIENQVXNlciAmVSkgeworICB1bnNpZ25lZCBNYXhEaXNwID0gVS5NYXhEaXNwOworICB1bnNpZ25lZCBDUEVPZmZzZXQgPSBCQk9mZnNldHNbV2F0ZXItPmdldE51bWJlcigpXSArCisgICAgICAgICAgICAgICAgICAgICAgIEJCU2l6ZXNbV2F0ZXItPmdldE51bWJlcigpXTsKKworICAvLyBJZiB0aGUgQ1BFIGlzIHRvIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgaW5zdHJ1Y3Rpb24sIHRoYXQgd2lsbCByYWlzZQorICAvLyB0aGUgb2Zmc2V0IG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgaWYgKENQRU9mZnNldCA8IFVzZXJPZmZzZXQpCisgICAgVXNlck9mZnNldCArPSBVLkNQRU1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworCisgIHJldHVybiBPZmZzZXRJc0luUmFuZ2UoVXNlck9mZnNldCwgQ1BFT2Zmc2V0LCBNYXhEaXNwLCBVLk5lZ09rLCBVLklzU29JbW0pOworfQorCisvLy8gQ1BFSXNJblJhbmdlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHNwZWNpZmljIE1JIGFuZAorLy8vIHNwZWNpZmljIENvbnN0UG9vbCBlbnRyeSBpbnN0cnVjdGlvbiBjYW4gZml0IGluIE1JJ3MgZGlzcGxhY2VtZW50IGZpZWxkLgorYm9vbCBBUk1Db25zdGFudElzbGFuZHM6OkNQRUlzSW5SYW5nZShNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBVc2VyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKkNQRU1JLCB1bnNpZ25lZCBNYXhEaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5lZ09rLCBib29sIERvRHVtcCkgeworICB1bnNpZ25lZCBDUEVPZmZzZXQgID0gR2V0T2Zmc2V0T2YoQ1BFTUkpOworICBhc3NlcnQoKENQRU9mZnNldCU0ID09IDAgfHwgSGFzSW5saW5lQXNtKSAmJiAiTWlzYWxpZ25lZCBDUEUiKTsKKworICBpZiAoRG9EdW1wKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJVc2VyIG9mIENQRSMiIDw8IENQRU1JLT5nZXRPcGVyYW5kKDApLmdldEltbSgpCisgICAgICAgICAgICAgICAgIDw8ICIgbWF4IGRlbHRhPSIgPDwgTWF4RGlzcAorICAgICAgICAgICAgICAgICA8PCAiIGluc24gYWRkcmVzcz0iIDw8IFVzZXJPZmZzZXQKKyAgICAgICAgICAgICAgICAgPDwgIiBDUEUgYWRkcmVzcz0iIDw8IENQRU9mZnNldAorICAgICAgICAgICAgICAgICA8PCAiIG9mZnNldD0iIDw8IGludChDUEVPZmZzZXQtVXNlck9mZnNldCkgPDwgIlx0IiA8PCAqTUkpOworICB9CisKKyAgcmV0dXJuIE9mZnNldElzSW5SYW5nZShVc2VyT2Zmc2V0LCBDUEVPZmZzZXQsIE1heERpc3AsIE5lZ09rKTsKK30KKworI2lmbmRlZiBOREVCVUcKKy8vLyBCQklzSnVtcGVkT3ZlciAtIFJldHVybiB0cnVlIG9mIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sncyBvbmx5IHByZWRlY2Vzc29yCisvLy8gdW5jb25kaXRpb25hbGx5IGJyYW5jaGVzIHRvIGl0cyBvbmx5IHN1Y2Nlc3Nvci4KK3N0YXRpYyBib29sIEJCSXNKdW1wZWRPdmVyKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgaWYgKE1CQi0+cHJlZF9zaXplKCkgIT0gMSB8fCBNQkItPnN1Y2Nfc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjID0gKk1CQi0+c3VjY19iZWdpbigpOworICBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZCA9ICpNQkItPnByZWRfYmVnaW4oKTsKKyAgTWFjaGluZUluc3RyICpQcmVkTUkgPSAmUHJlZC0+YmFjaygpOworICBpZiAoUHJlZE1JLT5nZXRPcGNvZGUoKSA9PSBBUk06OkIgfHwgUHJlZE1JLT5nZXRPcGNvZGUoKSA9PSBBUk06OnRCCisgICAgICB8fCBQcmVkTUktPmdldE9wY29kZSgpID09IEFSTTo6dDJCKQorICAgIHJldHVybiBQcmVkTUktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCkgPT0gU3VjYzsKKyAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmIC8vIE5ERUJVRworCit2b2lkIEFSTUNvbnN0YW50SXNsYW5kczo6QWRqdXN0QkJPZmZzZXRzQWZ0ZXIoTWFjaGluZUJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkgeworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkkgPSBCQjsgTUJCSSA9IGxsdm06Om5leHQoTUJCSSk7CisgIGZvcih1bnNpZ25lZCBpID0gQkItPmdldE51bWJlcigpKzEsIGUgPSBCQi0+Z2V0UGFyZW50KCktPmdldE51bUJsb2NrSURzKCk7CisgICAgICBpIDwgZTsgKytpKSB7CisgICAgQkJPZmZzZXRzW2ldICs9IGRlbHRhOworICAgIC8vIElmIHNvbWUgZXhpc3RpbmcgYmxvY2tzIGhhdmUgcGFkZGluZywgYWRqdXN0IHRoZSBwYWRkaW5nIGFzIG5lZWRlZCwgYQorICAgIC8vIGJpdCB0cmlja3kuICBkZWx0YSBjYW4gYmUgbmVnYXRpdmUgc28gZG9uJ3QgdXNlICUgb24gdGhhdC4KKyAgICBpZiAoIWlzVGh1bWIpCisgICAgICBjb250aW51ZTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTUJCSTsKKyAgICBpZiAoIU1CQi0+ZW1wdHkoKSAmJiAhSGFzSW5saW5lQXNtKSB7CisgICAgICAvLyBDb25zdGFudCBwb29sIGVudHJpZXMgcmVxdWlyZSBwYWRkaW5nLgorICAgICAgaWYgKE1CQi0+YmVnaW4oKS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpDT05TVFBPT0xfRU5UUlkpIHsKKyAgICAgICAgdW5zaWduZWQgT2xkT2Zmc2V0ID0gQkJPZmZzZXRzW2ldIC0gZGVsdGE7CisgICAgICAgIGlmICgoT2xkT2Zmc2V0JTQpID09IDAgJiYgKEJCT2Zmc2V0c1tpXSU0KSAhPSAwKSB7CisgICAgICAgICAgLy8gYWRkIG5ldyBwYWRkaW5nCisgICAgICAgICAgQkJTaXplc1tpXSArPSAyOworICAgICAgICAgIGRlbHRhICs9IDI7CisgICAgICAgIH0gZWxzZSBpZiAoKE9sZE9mZnNldCU0KSAhPSAwICYmIChCQk9mZnNldHNbaV0lNCkgPT0gMCkgeworICAgICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBwYWRkaW5nCisgICAgICAgICAgQkJTaXplc1tpXSAtPSAyOworICAgICAgICAgIGRlbHRhIC09IDI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIFRodW1iMSBqdW1wIHRhYmxlcyByZXF1aXJlIHBhZGRpbmcuICBUaGV5IHNob3VsZCBiZSBhdCB0aGUgZW5kOworICAgICAgLy8gZm9sbG93aW5nIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgYXJlIHJlbW92ZWQgYnkgQW5hbHl6ZUJyYW5jaC4KKyAgICAgIC8vIHRCUl9KVHIgZXhwYW5kcyB0byBhIG1vdiBwYyBmb2xsb3dlZCBieSAuYWxpZ24gMiBhbmQgdGhlbiB0aGUganVtcAorICAgICAgLy8gdGFibGUgZW50cmllcy4gU28gdGhpcyBjb2RlIGNoZWNrcyB3aGV0aGVyIG9mZnNldCBvZiB0QlJfSlRyCisgICAgICAvLyBpcyBhbGlnbmVkOyBpZiBpdCBpcywgdGhlIG9mZnNldCBvZiB0aGUganVtcCB0YWJsZSBmb2xsb3dpbmcgdGhlCisgICAgICAvLyBpbnN0cnVjdGlvbiB3aWxsIG5vdCBiZSBhbGlnbmVkLCBhbmQgd2UgbmVlZCBwYWRkaW5nLgorICAgICAgTWFjaGluZUluc3RyICpUaHVtYkpUTUkgPSBwcmlvcihNQkItPmVuZCgpKTsKKyAgICAgIGlmIChUaHVtYkpUTUktPmdldE9wY29kZSgpID09IEFSTTo6dEJSX0pUcikgeworICAgICAgICB1bnNpZ25lZCBOZXdNSU9mZnNldCA9IEdldE9mZnNldE9mKFRodW1iSlRNSSk7CisgICAgICAgIHVuc2lnbmVkIE9sZE1JT2Zmc2V0ID0gTmV3TUlPZmZzZXQgLSBkZWx0YTsKKyAgICAgICAgaWYgKChPbGRNSU9mZnNldCU0KSA9PSAwICYmIChOZXdNSU9mZnNldCU0KSAhPSAwKSB7CisgICAgICAgICAgLy8gcmVtb3ZlIGV4aXN0aW5nIHBhZGRpbmcKKyAgICAgICAgICBCQlNpemVzW2ldIC09IDI7CisgICAgICAgICAgZGVsdGEgLT0gMjsKKyAgICAgICAgfSBlbHNlIGlmICgoT2xkTUlPZmZzZXQlNCkgIT0gMCAmJiAoTmV3TUlPZmZzZXQlNCkgPT0gMCkgeworICAgICAgICAgIC8vIGFkZCBuZXcgcGFkZGluZworICAgICAgICAgIEJCU2l6ZXNbaV0gKz0gMjsKKyAgICAgICAgICBkZWx0YSArPSAyOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZGVsdGE9PTApCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTUJCSSA9IGxsdm06Om5leHQoTUJCSSk7CisgIH0KK30KKworLy8vIERlY3JlbWVudE9sZEVudHJ5IC0gZmluZCB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSB3aXRoIGluZGV4IENQSQorLy8vIGFuZCBpbnN0cnVjdGlvbiBDUEVNSSwgYW5kIGRlY3JlbWVudCBpdHMgcmVmY291bnQuICBJZiB0aGUgcmVmY291bnQKKy8vLyBiZWNvbWVzIDAgcmVtb3ZlIHRoZSBlbnRyeSBhbmQgaW5zdHJ1Y3Rpb24uICBSZXR1cm5zIHRydWUgaWYgd2UgcmVtb3ZlZAorLy8vIHRoZSBlbnRyeSwgZmFsc2UgaWYgd2UgZGlkbid0LgorCitib29sIEFSTUNvbnN0YW50SXNsYW5kczo6RGVjcmVtZW50T2xkRW50cnkodW5zaWduZWQgQ1BJLCBNYWNoaW5lSW5zdHIgKkNQRU1JKSB7CisgIC8vIEZpbmQgdGhlIG9sZCBlbnRyeS4gRWxpbWluYXRlIGl0IGlmIGl0IGlzIG5vIGxvbmdlciB1c2VkLgorICBDUEVudHJ5ICpDUEUgPSBmaW5kQ29uc3RQb29sRW50cnkoQ1BJLCBDUEVNSSk7CisgIGFzc2VydChDUEUgJiYgIlVuZXhwZWN0ZWQhIik7CisgIGlmICgtLUNQRS0+UmVmQ291bnQgPT0gMCkgeworICAgIFJlbW92ZURlYWRDUEVNSShDUEVNSSk7CisgICAgQ1BFLT5DUEVNSSA9IE5VTEw7CisgICAgLS1OdW1DUEVzOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIExvb2tGb3JDUEVudHJ5SW5SYW5nZSAtIHNlZSBpZiB0aGUgY3VycmVudGx5IHJlZmVyZW5jZWQgQ1BFIGlzIGluIHJhbmdlOworLy8vIGlmIG5vdCwgc2VlIGlmIGFuIGluLXJhbmdlIGNsb25lIG9mIHRoZSBDUEUgaXMgaW4gcmFuZ2UsIGFuZCBpZiBzbywKKy8vLyBjaGFuZ2UgdGhlIGRhdGEgc3RydWN0dXJlcyBzbyB0aGUgdXNlciByZWZlcmVuY2VzIHRoZSBjbG9uZS4gIFJldHVybnM6CisvLy8gMCA9IG5vIGV4aXN0aW5nIGVudHJ5IGZvdW5kCisvLy8gMSA9IGVudHJ5IGZvdW5kLCBhbmQgdGhlcmUgd2VyZSBubyBjb2RlIGluc2VydGlvbnMgb3IgZGVsZXRpb25zCisvLy8gMiA9IGVudHJ5IGZvdW5kLCBhbmQgdGhlcmUgd2VyZSBjb2RlIGluc2VydGlvbnMgb3IgZGVsZXRpb25zCitpbnQgQVJNQ29uc3RhbnRJc2xhbmRzOjpMb29rRm9yRXhpc3RpbmdDUEVudHJ5KENQVXNlciYgVSwgdW5zaWduZWQgVXNlck9mZnNldCkKK3sKKyAgTWFjaGluZUluc3RyICpVc2VyTUkgPSBVLk1JOworICBNYWNoaW5lSW5zdHIgKkNQRU1JICA9IFUuQ1BFTUk7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBDUEUgaXMgYWxyZWFkeSBpbi1yYW5nZS4KKyAgaWYgKENQRUlzSW5SYW5nZShVc2VyTUksIFVzZXJPZmZzZXQsIENQRU1JLCBVLk1heERpc3AsIFUuTmVnT2ssIHRydWUpKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJJbiByYW5nZVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBOby4gIExvb2sgZm9yIHByZXZpb3VzbHkgY3JlYXRlZCBjbG9uZXMgb2YgdGhlIENQRSB0aGF0IGFyZSBpbiByYW5nZS4KKyAgdW5zaWduZWQgQ1BJID0gQ1BFTUktPmdldE9wZXJhbmQoMSkuZ2V0SW5kZXgoKTsKKyAgc3RkOjp2ZWN0b3I8Q1BFbnRyeT4gJkNQRXMgPSBDUEVudHJpZXNbQ1BJXTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENQRXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIC8vIFdlIGFscmVhZHkgdHJpZWQgdGhpcyBvbmUKKyAgICBpZiAoQ1BFc1tpXS5DUEVNSSA9PSBDUEVNSSkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIFJlbW92aW5nIENQRXMgY2FuIGxlYXZlIGVtcHR5IGVudHJpZXMsIHNraXAKKyAgICBpZiAoQ1BFc1tpXS5DUEVNSSA9PSBOVUxMKQorICAgICAgY29udGludWU7CisgICAgaWYgKENQRUlzSW5SYW5nZShVc2VyTUksIFVzZXJPZmZzZXQsIENQRXNbaV0uQ1BFTUksIFUuTWF4RGlzcCwgVS5OZWdPaykpIHsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiUmVwbGFjaW5nIENQRSMiIDw8IENQSSA8PCAiIHdpdGggQ1BFIyIKKyAgICAgICAgICAgICAgICAgICA8PCBDUEVzW2ldLkNQSSA8PCAiXG4iKTsKKyAgICAgIC8vIFBvaW50IHRoZSBDUFVzZXIgbm9kZSB0byB0aGUgcmVwbGFjZW1lbnQKKyAgICAgIFUuQ1BFTUkgPSBDUEVzW2ldLkNQRU1JOworICAgICAgLy8gQ2hhbmdlIHRoZSBDUEkgaW4gdGhlIGluc3RydWN0aW9uIG9wZXJhbmQgdG8gcmVmZXIgdG8gdGhlIGNsb25lLgorICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZSA9IFVzZXJNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaiAhPSBlOyArK2opCisgICAgICAgIGlmIChVc2VyTUktPmdldE9wZXJhbmQoaikuaXNDUEkoKSkgeworICAgICAgICAgIFVzZXJNSS0+Z2V0T3BlcmFuZChqKS5zZXRJbmRleChDUEVzW2ldLkNQSSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIC8vIEFkanVzdCB0aGUgcmVmY291bnQgb2YgdGhlIGNsb25lLi4uCisgICAgICBDUEVzW2ldLlJlZkNvdW50Kys7CisgICAgICAvLyAuLi5hbmQgdGhlIG9yaWdpbmFsLiAgSWYgd2UgZGlkbid0IHJlbW92ZSB0aGUgb2xkIGVudHJ5LCBub25lIG9mIHRoZQorICAgICAgLy8gYWRkcmVzc2VzIGNoYW5nZWQsIHNvIHdlIGRvbid0IG5lZWQgYW5vdGhlciBwYXNzLgorICAgICAgcmV0dXJuIERlY3JlbWVudE9sZEVudHJ5KENQSSwgQ1BFTUkpID8gMiA6IDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLy8gZ2V0VW5jb25kaXRpb25hbEJyRGlzcCAtIFJldHVybnMgdGhlIG1heGltdW0gZGlzcGxhY2VtZW50IHRoYXQgY2FuIGZpdCBpbgorLy8vIHRoZSBzcGVjaWZpYyB1bmNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbi4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0VW5jb25kaXRpb25hbEJyRGlzcChpbnQgT3BjKSB7CisgIHN3aXRjaCAoT3BjKSB7CisgIGNhc2UgQVJNOjp0QjoKKyAgICByZXR1cm4gKCgxPDwxMCktMSkqMjsKKyAgY2FzZSBBUk06OnQyQjoKKyAgICByZXR1cm4gKCgxPDwyMyktMSkqMjsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiAoKDE8PDIzKS0xKSo0OworfQorCisvLy8gTG9va0ZvcldhdGVyIC0gTG9vayBmb3IgYW4gZXhpc3RpbmcgZW50cnkgaW4gdGhlIFdhdGVyTGlzdCBpbiB3aGljaAorLy8vIHdlIGNhbiBwbGFjZSB0aGUgQ1BFIHJlZmVyZW5jZWQgZnJvbSBVIHNvIGl0J3Mgd2l0aGluIHJhbmdlIG9mIFUncyBNSS4KKy8vLyBSZXR1cm5zIHRydWUgaWYgZm91bmQsIGZhbHNlIGlmIG5vdC4gIElmIGl0IHJldHVybnMgdHJ1ZSwgV2F0ZXJJdGVyCisvLy8gaXMgc2V0IHRvIHRoZSBXYXRlckxpc3QgZW50cnkuICBGb3IgVGh1bWIsIHByZWZlciB3YXRlciB0aGF0IHdpbGwgbm90CisvLy8gaW50cm9kdWNlIHBhZGRpbmcgdG8gd2F0ZXIgdGhhdCB3aWxsLiAgVG8gZW5zdXJlIHRoYXQgdGhpcyBwYXNzCisvLy8gdGVybWluYXRlcywgdGhlIENQRSBsb2NhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIENQVXNlciBpcyBvbmx5IGFsbG93ZWQgdG8KKy8vLyBtb3ZlIHRvIGEgbG93ZXIgYWRkcmVzcywgc28gc2VhcmNoIGJhY2t3YXJkIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQKKy8vLyBwcmVmZXIgdGhlIGZpcnN0IHdhdGVyIHRoYXQgaXMgaW4gcmFuZ2UuCitib29sIEFSTUNvbnN0YW50SXNsYW5kczo6TG9va0ZvcldhdGVyKENQVXNlciAmVSwgdW5zaWduZWQgVXNlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJfaXRlcmF0b3IgJldhdGVySXRlcikgeworICBpZiAoV2F0ZXJMaXN0LmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgRm91bmRXYXRlclRoYXRXb3VsZFBhZCA9IGZhbHNlOworICB3YXRlcl9pdGVyYXRvciBJUFRoYXRXb3VsZFBhZDsKKyAgZm9yICh3YXRlcl9pdGVyYXRvciBJUCA9IHByaW9yKFdhdGVyTGlzdC5lbmQoKSksCisgICAgICAgICBCID0gV2F0ZXJMaXN0LmJlZ2luKCk7OyAtLUlQKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIFdhdGVyQkIgPSAqSVA7CisgICAgLy8gQ2hlY2sgaWYgd2F0ZXIgaXMgaW4gcmFuZ2UgYW5kIGlzIGVpdGhlciBhdCBhIGxvd2VyIGFkZHJlc3MgdGhhbiB0aGUKKyAgICAvLyBjdXJyZW50ICJoaWdoIHdhdGVyIG1hcmsiIG9yIGEgbmV3IHdhdGVyIGJsb2NrIHRoYXQgd2FzIGNyZWF0ZWQgc2luY2UKKyAgICAvLyB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIGJ5IGluc2VydGluZyBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gIEluIHRoZQorICAgIC8vIGxhdHRlciBjYXNlLCB3ZSB3YW50IHRvIGFsbG93IHJlc2V0dGluZyB0aGUgaGlnaCB3YXRlciBtYXJrIGJhY2sgdG8KKyAgICAvLyB0aGlzIG5ldyB3YXRlciBzaW5jZSB3ZSBoYXZlbid0IHNlZW4gaXQgYmVmb3JlLiAgSW5zZXJ0aW5nIGJyYW5jaGVzCisgICAgLy8gc2hvdWxkIGJlIHJlbGF0aXZlbHkgdW5jb21tb24gYW5kIHdoZW4gaXQgZG9lcyBoYXBwZW4sIHdlIHdhbnQgdG8gYmUKKyAgICAvLyBzdXJlIHRvIHRha2UgYWR2YW50YWdlIG9mIGl0IGZvciBhbGwgdGhlIENQRXMgbmVhciB0aGF0IGJsb2NrLCBzbyB0aGF0CisgICAgLy8gd2UgZG9uJ3QgaW5zZXJ0IG1vcmUgYnJhbmNoZXMgdGhhbiBuZWNlc3NhcnkuCisgICAgaWYgKFdhdGVySXNJblJhbmdlKFVzZXJPZmZzZXQsIFdhdGVyQkIsIFUpICYmCisgICAgICAgIChXYXRlckJCLT5nZXROdW1iZXIoKSA8IFUuSGlnaFdhdGVyTWFyay0+Z2V0TnVtYmVyKCkgfHwKKyAgICAgICAgIE5ld1dhdGVyTGlzdC5jb3VudChXYXRlckJCKSkpIHsKKyAgICAgIHVuc2lnbmVkIFdCQklkID0gV2F0ZXJCQi0+Z2V0TnVtYmVyKCk7CisgICAgICBpZiAoaXNUaHVtYiAmJgorICAgICAgICAgIChCQk9mZnNldHNbV0JCSWRdICsgQkJTaXplc1tXQkJJZF0pJTQgIT0gMCkgeworICAgICAgICAvLyBUaGlzIGlzIHZhbGlkIFdhdGVyLCBidXQgd291bGQgaW50cm9kdWNlIHBhZGRpbmcuICBSZW1lbWJlcgorICAgICAgICAvLyBpdCBpbiBjYXNlIHdlIGRvbid0IGZpbmQgYW55IFdhdGVyIHRoYXQgZG9lc24ndCBkbyB0aGlzLgorICAgICAgICBpZiAoIUZvdW5kV2F0ZXJUaGF0V291bGRQYWQpIHsKKyAgICAgICAgICBGb3VuZFdhdGVyVGhhdFdvdWxkUGFkID0gdHJ1ZTsKKyAgICAgICAgICBJUFRoYXRXb3VsZFBhZCA9IElQOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBXYXRlckl0ZXIgPSBJUDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChJUCA9PSBCKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKEZvdW5kV2F0ZXJUaGF0V291bGRQYWQpIHsKKyAgICBXYXRlckl0ZXIgPSBJUFRoYXRXb3VsZFBhZDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBDcmVhdGVOZXdXYXRlciAtIE5vIGV4aXN0aW5nIFdhdGVyTGlzdCBlbnRyeSB3aWxsIHdvcmsgZm9yCisvLy8gQ1BVc2Vyc1tDUFVzZXJJbmRleF0sIHNvIGNyZWF0ZSBhIHBsYWNlIHRvIHB1dCB0aGUgQ1BFLiAgVGhlIGVuZCBvZiB0aGUKKy8vLyBibG9jayBpcyB1c2VkIGlmIGluIHJhbmdlLCBhbmQgdGhlIGNvbmRpdGlvbmFsIGJyYW5jaCBtdW5nZWQgc28gY29udHJvbAorLy8vIGZsb3cgaXMgY29ycmVjdC4gIE90aGVyd2lzZSB0aGUgYmxvY2sgaXMgc3BsaXQgdG8gY3JlYXRlIGEgaG9sZSB3aXRoIGFuCisvLy8gdW5jb25kaXRpb25hbCBicmFuY2ggYXJvdW5kIGl0LiAgSW4gZWl0aGVyIGNhc2UgTmV3TUJCIGlzIHNldCB0byBhCisvLy8gYmxvY2sgZm9sbG93aW5nIHdoaWNoIHRoZSBuZXcgaXNsYW5kIGNhbiBiZSBpbnNlcnRlZCAodGhlIFdhdGVyTGlzdAorLy8vIGlzIG5vdCBhZGp1c3RlZCkuCit2b2lkIEFSTUNvbnN0YW50SXNsYW5kczo6Q3JlYXRlTmV3V2F0ZXIodW5zaWduZWQgQ1BVc2VySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVXNlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqJk5ld01CQikgeworICBDUFVzZXIgJlUgPSBDUFVzZXJzW0NQVXNlckluZGV4XTsKKyAgTWFjaGluZUluc3RyICpVc2VyTUkgPSBVLk1JOworICBNYWNoaW5lSW5zdHIgKkNQRU1JICA9IFUuQ1BFTUk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpVc2VyTUJCID0gVXNlck1JLT5nZXRQYXJlbnQoKTsKKyAgdW5zaWduZWQgT2Zmc2V0T2ZOZXh0QmxvY2sgPSBCQk9mZnNldHNbVXNlck1CQi0+Z2V0TnVtYmVyKCldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQlNpemVzW1VzZXJNQkItPmdldE51bWJlcigpXTsKKyAgYXNzZXJ0KE9mZnNldE9mTmV4dEJsb2NrPT0gQkJPZmZzZXRzW1VzZXJNQkItPmdldE51bWJlcigpKzFdKTsKKworICAvLyBJZiB0aGUgYmxvY2sgZG9lcyBub3QgZW5kIGluIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIGFscmVhZHksIGFuZCBpZiB0aGUKKyAgLy8gZW5kIG9mIHRoZSBibG9jayBpcyB3aXRoaW4gcmFuZ2UsIG1ha2UgbmV3IHdhdGVyIHRoZXJlLiAgKFRoZSBhZGRpdGlvbgorICAvLyBiZWxvdyBpcyBmb3IgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoIHdlIHdpbGwgYmUgYWRkaW5nOiA0IGJ5dGVzIG9uIEFSTSArCisgIC8vIFRodW1iMiwgMiBvbiBUaHVtYjEuICBQb3NzaWJsZSBUaHVtYjEgYWxpZ25tZW50IHBhZGRpbmcgaXMgYWxsb3dlZCBmb3IKKyAgLy8gaW5zaWRlIE9mZnNldElzSW5SYW5nZS4KKyAgaWYgKEJCSGFzRmFsbHRocm91Z2goVXNlck1CQikgJiYKKyAgICAgIE9mZnNldElzSW5SYW5nZShVc2VyT2Zmc2V0LCBPZmZzZXRPZk5leHRCbG9jayArIChpc1RodW1iMSA/IDI6IDQpLAorICAgICAgICAgICAgICAgICAgICAgIFUuTWF4RGlzcCwgVS5OZWdPaywgVS5Jc1NvSW1tKSkgeworICAgIERFQlVHKGVycnMoKSA8PCAiU3BsaXQgYXQgZW5kIG9mIGJsb2NrXG4iKTsKKyAgICBpZiAoJlVzZXJNQkItPmJhY2soKSA9PSBVc2VyTUkpCisgICAgICBhc3NlcnQoQkJIYXNGYWxsdGhyb3VnaChVc2VyTUJCKSAmJiAiRXhwZWN0ZWQgYSBmYWxsdGhyb3VnaCBCQiEiKTsKKyAgICBOZXdNQkIgPSBsbHZtOjpuZXh0KE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoVXNlck1CQikpOworICAgIC8vIEFkZCBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCBmcm9tIFVzZXJNQkIgdG8gZmFsbHRocm91Z2ggYmxvY2suCisgICAgLy8gUmVjb3JkIGl0IGZvciBicmFuY2ggbGVuZ3RoZW5pbmc7IHRoaXMgbmV3IGJyYW5jaCB3aWxsIG5vdCBnZXQgb3V0IG9mCisgICAgLy8gcmFuZ2UsIGJ1dCBpZiB0aGUgcHJlY2VkaW5nIGNvbmRpdGlvbmFsIGJyYW5jaCBpcyBvdXQgb2YgcmFuZ2UsIHRoZQorICAgIC8vIHRhcmdldHMgd2lsbCBiZSBleGNoYW5nZWQsIGFuZCB0aGUgYWx0ZXJlZCBicmFuY2ggbWF5IGJlIG91dCBvZgorICAgIC8vIHJhbmdlLCBzbyB0aGUgbWFjaGluZXJ5IGhhcyB0byBrbm93IGFib3V0IGl0LgorICAgIGludCBVbmNvbmRCciA9IGlzVGh1bWIgPyAoKGlzVGh1bWIyKSA/IEFSTTo6dDJCIDogQVJNOjp0QikgOiBBUk06OkI7CisgICAgQnVpbGRNSShVc2VyTUJCLCBEZWJ1Z0xvYygpLCBUSUktPmdldChVbmNvbmRCcikpLmFkZE1CQihOZXdNQkIpOworICAgIHVuc2lnbmVkIE1heERpc3AgPSBnZXRVbmNvbmRpdGlvbmFsQnJEaXNwKFVuY29uZEJyKTsKKyAgICBJbW1CcmFuY2hlcy5wdXNoX2JhY2soSW1tQnJhbmNoKCZVc2VyTUJCLT5iYWNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1heERpc3AsIGZhbHNlLCBVbmNvbmRCcikpOworICAgIGludCBkZWx0YSA9IGlzVGh1bWIxID8gMiA6IDQ7CisgICAgQkJTaXplc1tVc2VyTUJCLT5nZXROdW1iZXIoKV0gKz0gZGVsdGE7CisgICAgQWRqdXN0QkJPZmZzZXRzQWZ0ZXIoVXNlck1CQiwgZGVsdGEpOworICB9IGVsc2UgeworICAgIC8vIFdoYXQgYSBiaWcgYmxvY2suICBGaW5kIGEgcGxhY2Ugd2l0aGluIHRoZSBibG9jayB0byBzcGxpdCBpdC4KKyAgICAvLyBUaGlzIGlzIGEgbGl0dGxlIHRyaWNreSBvbiBUaHVtYjEgc2luY2UgaW5zdHJ1Y3Rpb25zIGFyZSAyIGJ5dGVzCisgICAgLy8gYW5kIGNvbnN0YW50IHBvb2wgZW50cmllcyBhcmUgNCBieXRlczogaWYgaW5zdHJ1Y3Rpb24gSSByZWZlcmVuY2VzCisgICAgLy8gaXNsYW5kIENQRSwgYW5kIGluc3RydWN0aW9uIEkrMSByZWZlcmVuY2VzIENQRScsIGl0IHdpbGwKKyAgICAvLyBub3Qgd29yayB3ZWxsIHRvIHB1dCBDUEUgYXMgZmFyIGZvcndhcmQgYXMgcG9zc2libGUsIHNpbmNlIHRoZW4KKyAgICAvLyBDUEUnIGNhbm5vdCBpbW1lZGlhdGVseSBmb2xsb3cgaXQgKHRoYXQgbG9jYXRpb24gaXMgMiBieXRlcworICAgIC8vIGZhcnRoZXIgYXdheSBmcm9tIEkrMSB0aGFuIENQRSB3YXMgZnJvbSBJKSBhbmQgd2UnZCBuZWVkIHRvIGNyZWF0ZQorICAgIC8vIGEgbmV3IGlzbGFuZC4gIFNvLCB3ZSBtYWtlIGEgZmlyc3QgZ3Vlc3MsIHRoZW4gd2FsayB0aHJvdWdoIHRoZQorICAgIC8vIGluc3RydWN0aW9ucyBiZXR3ZWVuIHRoZSBvbmUgY3VycmVudGx5IGJlaW5nIGxvb2tlZCBhdCBhbmQgdGhlCisgICAgLy8gcG9zc2libGUgaW5zZXJ0aW9uIHBvaW50LCBhbmQgbWFrZSBzdXJlIGFueSBvdGhlciBpbnN0cnVjdGlvbnMKKyAgICAvLyB0aGF0IHJlZmVyZW5jZSBDUEVzIHdpbGwgYmUgYWJsZSB0byB1c2UgdGhlIHNhbWUgaXNsYW5kIGFyZWE7CisgICAgLy8gaWYgbm90LCB3ZSBiYWNrIHVwIHRoZSBpbnNlcnRpb24gcG9pbnQuCisKKyAgICAvLyBUaGUgNCBpbiB0aGUgZm9sbG93aW5nIGlzIGZvciB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggd2UnbGwgYmUKKyAgICAvLyBpbnNlcnRpbmcgKGFsbG93cyBmb3IgbG9uZyBicmFuY2ggb24gVGh1bWIxKS4gIEFsaWdubWVudCBvZiB0aGUKKyAgICAvLyBpc2xhbmQgaXMgaGFuZGxlZCBpbnNpZGUgT2Zmc2V0SXNJblJhbmdlLgorICAgIHVuc2lnbmVkIEJhc2VJbnNlcnRPZmZzZXQgPSBVc2VyT2Zmc2V0ICsgVS5NYXhEaXNwIC00OworICAgIC8vIFRoaXMgY291bGQgcG9pbnQgb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrIGlmIHdlJ3ZlIGFscmVhZHkgZ290CisgICAgLy8gY29uc3RhbnQgcG9vbCBlbnRyaWVzIGZvbGxvd2luZyB0aGlzIGJsb2NrOyBvbmx5IHRoZSBsYXN0IG9uZSBpcworICAgIC8vIGluIHRoZSB3YXRlciBsaXN0LiAgQmFjayBwYXN0IGFueSBwb3NzaWJsZSBicmFuY2hlcyAoYWxsb3cgZm9yIGEKKyAgICAvLyBjb25kaXRpb25hbCBhbmQgYSBtYXhpbWFsbHkgbG9uZyB1bmNvbmRpdGlvbmFsKS4KKyAgICBpZiAoQmFzZUluc2VydE9mZnNldCA+PSBCQk9mZnNldHNbVXNlck1CQi0+Z2V0TnVtYmVyKCkrMV0pCisgICAgICBCYXNlSW5zZXJ0T2Zmc2V0ID0gQkJPZmZzZXRzW1VzZXJNQkItPmdldE51bWJlcigpKzFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1RodW1iMSA/IDYgOiA4KTsKKyAgICB1bnNpZ25lZCBFbmRJbnNlcnRPZmZzZXQgPSBCYXNlSW5zZXJ0T2Zmc2V0ICsKKyAgICAgICAgICAgQ1BFTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCk7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JID0gVXNlck1JOworICAgICsrTUk7CisgICAgdW5zaWduZWQgQ1BVSW5kZXggPSBDUFVzZXJJbmRleCsxOworICAgIGZvciAodW5zaWduZWQgT2Zmc2V0ID0gVXNlck9mZnNldCtUSUktPkdldEluc3RTaXplSW5CeXRlcyhVc2VyTUkpOworICAgICAgICAgT2Zmc2V0IDwgQmFzZUluc2VydE9mZnNldDsKKyAgICAgICAgIE9mZnNldCArPSBUSUktPkdldEluc3RTaXplSW5CeXRlcyhNSSksCisgICAgICAgICAgICBNSSA9IGxsdm06Om5leHQoTUkpKSB7CisgICAgICBpZiAoQ1BVSW5kZXggPCBDUFVzZXJzLnNpemUoKSAmJiBDUFVzZXJzW0NQVUluZGV4XS5NSSA9PSBNSSkgeworICAgICAgICBDUFVzZXIgJlUgPSBDUFVzZXJzW0NQVUluZGV4XTsKKyAgICAgICAgaWYgKCFPZmZzZXRJc0luUmFuZ2UoT2Zmc2V0LCBFbmRJbnNlcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUuTWF4RGlzcCwgVS5OZWdPaywgVS5Jc1NvSW1tKSkgeworICAgICAgICAgIEJhc2VJbnNlcnRPZmZzZXQgLT0gKGlzVGh1bWIxID8gMiA6IDQpOworICAgICAgICAgIEVuZEluc2VydE9mZnNldCAgLT0gKGlzVGh1bWIxID8gMiA6IDQpOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgaXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZSwgYXMgd2UgZG9uJ3QgYWNjb3VudCBmb3IgQ1BFTUlzCisgICAgICAgIC8vIGJlaW5nIHJldXNlZCB3aXRoaW4gdGhlIGJsb2NrLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgbXVjaC4KKyAgICAgICAgRW5kSW5zZXJ0T2Zmc2V0ICs9IENQVXNlcnNbQ1BVSW5kZXhdLkNQRU1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgICAgICBDUFVJbmRleCsrOworICAgICAgfQorICAgIH0KKyAgICBERUJVRyhlcnJzKCkgPDwgIlNwbGl0IGluIG1pZGRsZSBvZiBiaWcgYmxvY2tcbiIpOworICAgIE5ld01CQiA9IFNwbGl0QmxvY2tCZWZvcmVJbnN0cihwcmlvcihNSSkpOworICB9Cit9CisKKy8vLyBIYW5kbGVDb25zdGFudFBvb2xVc2VyIC0gQW5hbHl6ZSB0aGUgc3BlY2lmaWVkIHVzZXIsIGNoZWNraW5nIHRvIHNlZSBpZiBpdAorLy8vIGlzIG91dC1vZi1yYW5nZS4gIElmIHNvLCBwaWNrIHVwIHRoZSBjb25zdGFudCBwb29sIHZhbHVlIGFuZCBtb3ZlIGl0IHNvbWUKKy8vLyBwbGFjZSBpbi1yYW5nZS4gIFJldHVybiB0cnVlIGlmIHdlIGNoYW5nZWQgYW55IGFkZHJlc3NlcyAodGh1cyBtdXN0IHJ1bgorLy8vIGFub3RoZXIgcGFzcyBvZiBicmFuY2ggbGVuZ3RoZW5pbmcpLCBmYWxzZSBvdGhlcndpc2UuCitib29sIEFSTUNvbnN0YW50SXNsYW5kczo6SGFuZGxlQ29uc3RhbnRQb29sVXNlcihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ1BVc2VySW5kZXgpIHsKKyAgQ1BVc2VyICZVID0gQ1BVc2Vyc1tDUFVzZXJJbmRleF07CisgIE1hY2hpbmVJbnN0ciAqVXNlck1JID0gVS5NSTsKKyAgTWFjaGluZUluc3RyICpDUEVNSSAgPSBVLkNQRU1JOworICB1bnNpZ25lZCBDUEkgPSBDUEVNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOworICB1bnNpZ25lZCBTaXplID0gQ1BFTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCk7CisgIC8vIENvbXB1dGUgdGhpcyBvbmx5IG9uY2UsIGl0J3MgZXhwZW5zaXZlLiAgVGhlIDQgb3IgOCBpcyB0aGUgdmFsdWUgdGhlCisgIC8vIGhhcmR3YXJlIGtlZXBzIGluIHRoZSBQQy4KKyAgdW5zaWduZWQgVXNlck9mZnNldCA9IEdldE9mZnNldE9mKFVzZXJNSSkgKyAoaXNUaHVtYiA/IDQgOiA4KTsKKworICAvLyBTZWUgaWYgdGhlIGN1cnJlbnQgZW50cnkgaXMgd2l0aGluIHJhbmdlLCBvciB0aGVyZSBpcyBhIGNsb25lIG9mIGl0CisgIC8vIGluIHJhbmdlLgorICBpbnQgcmVzdWx0ID0gTG9va0ZvckV4aXN0aW5nQ1BFbnRyeShVLCBVc2VyT2Zmc2V0KTsKKyAgaWYgKHJlc3VsdD09MSkgcmV0dXJuIGZhbHNlOworICBlbHNlIGlmIChyZXN1bHQ9PTIpIHJldHVybiB0cnVlOworCisgIC8vIE5vIGV4aXN0aW5nIGNsb25lIG9mIHRoaXMgQ1BFIGlzIHdpdGhpbiByYW5nZS4KKyAgLy8gV2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGEgbmV3IGNsb25lLiAgR2V0IGEgVUlEIGZvciBpdC4KKyAgdW5zaWduZWQgSUQgPSBBRkktPmNyZWF0ZUNvbnN0UG9vbEVudHJ5VUlkKCk7CisKKyAgLy8gTG9vayBmb3Igd2F0ZXIgd2hlcmUgd2UgY2FuIHBsYWNlIHRoaXMgQ1BFLgorICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3SXNsYW5kID0gTUYuQ3JlYXRlTWFjaGluZUJhc2ljQmxvY2soKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk5ld01CQjsKKyAgd2F0ZXJfaXRlcmF0b3IgSVA7CisgIGlmIChMb29rRm9yV2F0ZXIoVSwgVXNlck9mZnNldCwgSVApKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJmb3VuZCB3YXRlciBpbiByYW5nZVxuIik7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKldhdGVyQkIgPSAqSVA7CisKKyAgICAvLyBJZiB0aGUgb3JpZ2luYWwgV2F0ZXJMaXN0IGVudHJ5IHdhcyAibmV3IHdhdGVyIiBvbiB0aGlzIGl0ZXJhdGlvbiwKKyAgICAvLyBwcm9wYWdhdGUgdGhhdCB0byB0aGUgbmV3IGlzbGFuZC4gIFRoaXMgaXMganVzdCBrZWVwaW5nIE5ld1dhdGVyTGlzdAorICAgIC8vIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIFdhdGVyTGlzdCwgd2hpY2ggd2lsbCBiZSB1cGRhdGVkIGJlbG93LgorICAgIGlmIChOZXdXYXRlckxpc3QuY291bnQoV2F0ZXJCQikpIHsKKyAgICAgIE5ld1dhdGVyTGlzdC5lcmFzZShXYXRlckJCKTsKKyAgICAgIE5ld1dhdGVyTGlzdC5pbnNlcnQoTmV3SXNsYW5kKTsKKyAgICB9CisgICAgLy8gVGhlIG5ldyBDUEUgZ29lcyBiZWZvcmUgdGhlIGZvbGxvd2luZyBibG9jayAoTmV3TUJCKS4KKyAgICBOZXdNQkIgPSBsbHZtOjpuZXh0KE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoV2F0ZXJCQikpOworCisgIH0gZWxzZSB7CisgICAgLy8gTm8gd2F0ZXIgZm91bmQuCisgICAgREVCVUcoZXJycygpIDw8ICJObyB3YXRlciBmb3VuZFxuIik7CisgICAgQ3JlYXRlTmV3V2F0ZXIoQ1BVc2VySW5kZXgsIFVzZXJPZmZzZXQsIE5ld01CQik7CisKKyAgICAvLyBTcGxpdEJsb2NrQmVmb3JlSW5zdHIgYWRkcyB0byBXYXRlckxpc3QsIHdoaWNoIGlzIGltcG9ydGFudCB3aGVuIGl0IGlzCisgICAgLy8gY2FsbGVkIHdoaWxlIGhhbmRsaW5nIGJyYW5jaGVzIHNvIHRoYXQgdGhlIHdhdGVyIHdpbGwgYmUgc2VlbiBvbiB0aGUKKyAgICAvLyBuZXh0IGl0ZXJhdGlvbiBmb3IgY29uc3RhbnQgcG9vbHMsIGJ1dCBpbiB0aGlzIGNvbnRleHQsIHdlIGRvbid0IHdhbnQKKyAgICAvLyBpdC4gIENoZWNrIGZvciB0aGlzIHNvIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBXYXRlckxpc3QuCisgICAgLy8gQWxzbyByZW1vdmUgYW55IGVudHJ5IGZyb20gTmV3V2F0ZXJMaXN0LgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpXYXRlckJCID0gcHJpb3IoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihOZXdNQkIpKTsKKyAgICBJUCA9IHN0ZDo6ZmluZChXYXRlckxpc3QuYmVnaW4oKSwgV2F0ZXJMaXN0LmVuZCgpLCBXYXRlckJCKTsKKyAgICBpZiAoSVAgIT0gV2F0ZXJMaXN0LmVuZCgpKQorICAgICAgTmV3V2F0ZXJMaXN0LmVyYXNlKFdhdGVyQkIpOworCisgICAgLy8gV2UgYXJlIGFkZGluZyBuZXcgd2F0ZXIuICBVcGRhdGUgTmV3V2F0ZXJMaXN0LgorICAgIE5ld1dhdGVyTGlzdC5pbnNlcnQoTmV3SXNsYW5kKTsKKyAgfQorCisgIC8vIFJlbW92ZSB0aGUgb3JpZ2luYWwgV2F0ZXJMaXN0IGVudHJ5OyB3ZSB3YW50IHN1YnNlcXVlbnQgaW5zZXJ0aW9ucyBpbgorICAvLyB0aGlzIHZpY2luaXR5IHRvIGdvIGFmdGVyIHRoZSBvbmUgd2UncmUgYWJvdXQgdG8gaW5zZXJ0LiAgVGhpcworICAvLyBjb25zaWRlcmFibHkgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGhhdmUgdG8gbW92ZSB0aGUgc2FtZSBDUEUKKyAgLy8gbW9yZSB0aGFuIG9uY2UgYW5kIGlzIGFsc28gaW1wb3J0YW50IHRvIGVuc3VyZSB0aGUgYWxnb3JpdGhtIHRlcm1pbmF0ZXMuCisgIGlmIChJUCAhPSBXYXRlckxpc3QuZW5kKCkpCisgICAgV2F0ZXJMaXN0LmVyYXNlKElQKTsKKworICAvLyBPa2F5LCB3ZSBrbm93IHdlIGNhbiBwdXQgYW4gaXNsYW5kIGJlZm9yZSBOZXdNQkIgbm93LCBkbyBpdCEKKyAgTUYuaW5zZXJ0KE5ld01CQiwgTmV3SXNsYW5kKTsKKworICAvLyBVcGRhdGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIGFjY291bnQgZm9yIHRoZSBuZXdseSBpbnNlcnRlZCBNQkIuCisgIFVwZGF0ZUZvckluc2VydGVkV2F0ZXJCbG9jayhOZXdJc2xhbmQpOworCisgIC8vIERlY3JlbWVudCB0aGUgb2xkIGVudHJ5LCBhbmQgcmVtb3ZlIGl0IGlmIHJlZmNvdW50IGJlY29tZXMgMC4KKyAgRGVjcmVtZW50T2xkRW50cnkoQ1BJLCBDUEVNSSk7CisKKyAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhbiBpc2xhbmQgdG8gYWRkIHRoZSBDUEUgdG8sIGNsb25lIHRoZSBvcmlnaW5hbCBDUEUgYW5kCisgIC8vIGFkZCBpdCB0byB0aGUgaXNsYW5kLgorICBVLkhpZ2hXYXRlck1hcmsgPSBOZXdJc2xhbmQ7CisgIFUuQ1BFTUkgPSBCdWlsZE1JKE5ld0lzbGFuZCwgRGVidWdMb2MoKSwgVElJLT5nZXQoQVJNOjpDT05TVFBPT0xfRU5UUlkpKQorICAgICAgICAgICAgICAgIC5hZGRJbW0oSUQpLmFkZENvbnN0YW50UG9vbEluZGV4KENQSSkuYWRkSW1tKFNpemUpOworICBDUEVudHJpZXNbQ1BJXS5wdXNoX2JhY2soQ1BFbnRyeShVLkNQRU1JLCBJRCwgMSkpOworICArK051bUNQRXM7CisKKyAgQkJPZmZzZXRzW05ld0lzbGFuZC0+Z2V0TnVtYmVyKCldID0gQkJPZmZzZXRzW05ld01CQi0+Z2V0TnVtYmVyKCldOworICAvLyBDb21wZW5zYXRlIGZvciAuYWxpZ24gMiBpbiB0aHVtYiBtb2RlLgorICBpZiAoaXNUaHVtYiAmJiAoQkJPZmZzZXRzW05ld0lzbGFuZC0+Z2V0TnVtYmVyKCldJTQgIT0gMCB8fCBIYXNJbmxpbmVBc20pKQorICAgIFNpemUgKz0gMjsKKyAgLy8gSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGlzbGFuZCBibG9jayB0byBhY2NvdW50IGZvciB0aGUgbmV3IGVudHJ5LgorICBCQlNpemVzW05ld0lzbGFuZC0+Z2V0TnVtYmVyKCldICs9IFNpemU7CisgIEFkanVzdEJCT2Zmc2V0c0FmdGVyKE5ld0lzbGFuZCwgU2l6ZSk7CisKKyAgLy8gRmluYWxseSwgY2hhbmdlIHRoZSBDUEkgaW4gdGhlIGluc3RydWN0aW9uIG9wZXJhbmQgdG8gYmUgSUQuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVc2VyTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChVc2VyTUktPmdldE9wZXJhbmQoaSkuaXNDUEkoKSkgeworICAgICAgVXNlck1JLT5nZXRPcGVyYW5kKGkpLnNldEluZGV4KElEKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBERUJVRyhlcnJzKCkgPDwgIiAgTW92ZWQgQ1BFIHRvICMiIDw8IElEIDw8ICIgQ1BJPSIgPDwgQ1BJCisgICAgICAgICAgIDw8ICdcdCcgPDwgKlVzZXJNSSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBSZW1vdmVEZWFkQ1BFTUkgLSBSZW1vdmUgYSBkZWFkIGNvbnN0YW50IHBvb2wgZW50cnkgaW5zdHJ1Y3Rpb24uIFVwZGF0ZQorLy8vIHNpemVzIGFuZCBvZmZzZXRzIG9mIGltcGFjdGVkIGJhc2ljIGJsb2Nrcy4KK3ZvaWQgQVJNQ29uc3RhbnRJc2xhbmRzOjpSZW1vdmVEZWFkQ1BFTUkoTWFjaGluZUluc3RyICpDUEVNSSkgeworICBNYWNoaW5lQmFzaWNCbG9jayAqQ1BFQkIgPSBDUEVNSS0+Z2V0UGFyZW50KCk7CisgIHVuc2lnbmVkIFNpemUgPSBDUEVNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKTsKKyAgQ1BFTUktPmVyYXNlRnJvbVBhcmVudCgpOworICBCQlNpemVzW0NQRUJCLT5nZXROdW1iZXIoKV0gLT0gU2l6ZTsKKyAgLy8gQWxsIHN1Y2NlZWRpbmcgb2Zmc2V0cyBoYXZlIHRoZSBjdXJyZW50IHNpemUgdmFsdWUgYWRkZWQgaW4sIGZpeCB0aGlzLgorICBpZiAoQ1BFQkItPmVtcHR5KCkpIHsKKyAgICAvLyBJbiB0aHVtYjEgbW9kZSwgdGhlIHNpemUgb2YgaXNsYW5kIG1heSBiZSBwYWRkZWQgYnkgdHdvIHRvIGNvbXBlbnNhdGUgZm9yCisgICAgLy8gdGhlIGFsaWdubWVudCByZXF1aXJlbWVudC4gIFRoZW4gaXQgd2lsbCBub3cgYmUgMiB3aGVuIHRoZSBibG9jayBpcworICAgIC8vIGVtcHR5LCBzbyBmaXggdGhpcy4KKyAgICAvLyBBbGwgc3VjY2VlZGluZyBvZmZzZXRzIGhhdmUgdGhlIGN1cnJlbnQgc2l6ZSB2YWx1ZSBhZGRlZCBpbiwgZml4IHRoaXMuCisgICAgaWYgKEJCU2l6ZXNbQ1BFQkItPmdldE51bWJlcigpXSAhPSAwKSB7CisgICAgICBTaXplICs9IEJCU2l6ZXNbQ1BFQkItPmdldE51bWJlcigpXTsKKyAgICAgIEJCU2l6ZXNbQ1BFQkItPmdldE51bWJlcigpXSA9IDA7CisgICAgfQorICB9CisgIEFkanVzdEJCT2Zmc2V0c0FmdGVyKENQRUJCLCAtU2l6ZSk7CisgIC8vIEFuIGlzbGFuZCBoYXMgb25seSBvbmUgcHJlZGVjZXNzb3IgQkIgYW5kIG9uZSBzdWNjZXNzb3IgQkIuIENoZWNrIGlmCisgIC8vIHRoaXMgQkIncyBwcmVkZWNlc3NvciBqdW1wcyBkaXJlY3RseSB0byB0aGlzIEJCJ3Mgc3VjY2Vzc29yLiBUaGlzCisgIC8vIHNob3VsZG4ndCBoYXBwZW4gY3VycmVudGx5LgorICBhc3NlcnQoIUJCSXNKdW1wZWRPdmVyKENQRUJCKSAmJiAiSG93IGRpZCB0aGlzIGhhcHBlbj8iKTsKKyAgLy8gRklYTUU6IHJlbW92ZSB0aGUgZW1wdHkgYmxvY2tzIGFmdGVyIGFsbCB0aGUgd29yayBpcyBkb25lPworfQorCisvLy8gUmVtb3ZlVW51c2VkQ1BFbnRyaWVzIC0gUmVtb3ZlIGNvbnN0YW50IHBvb2wgZW50cmllcyB3aG9zZSByZWZjb3VudHMKKy8vLyBhcmUgemVyby4KK2Jvb2wgQVJNQ29uc3RhbnRJc2xhbmRzOjpSZW1vdmVVbnVzZWRDUEVudHJpZXMoKSB7CisgIHVuc2lnbmVkIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENQRW50cmllcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBzdGQ6OnZlY3RvcjxDUEVudHJ5PiAmQ1BFcyA9IENQRW50cmllc1tpXTsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVlID0gQ1BFcy5zaXplKCk7IGogIT0gZWU7ICsraikgeworICAgICAgICBpZiAoQ1BFc1tqXS5SZWZDb3VudCA9PSAwICYmIENQRXNbal0uQ1BFTUkpIHsKKyAgICAgICAgICBSZW1vdmVEZWFkQ1BFTUkoQ1BFc1tqXS5DUEVNSSk7CisgICAgICAgICAgQ1BFc1tqXS5DUEVNSSA9IE5VTEw7CisgICAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworLy8vIEJCSXNJblJhbmdlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHNwZWNpZmljIE1JIGFuZAorLy8vIHNwZWNpZmljIEJCIGNhbiBmaXQgaW4gTUkncyBkaXNwbGFjZW1lbnQgZmllbGQuCitib29sIEFSTUNvbnN0YW50SXNsYW5kczo6QkJJc0luUmFuZ2UoTWFjaGluZUluc3RyICpNSSxNYWNoaW5lQmFzaWNCbG9jayAqRGVzdEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heERpc3ApIHsKKyAgdW5zaWduZWQgUENBZGogICAgICA9IGlzVGh1bWIgPyA0IDogODsKKyAgdW5zaWduZWQgQnJPZmZzZXQgICA9IEdldE9mZnNldE9mKE1JKSArIFBDQWRqOworICB1bnNpZ25lZCBEZXN0T2Zmc2V0ID0gQkJPZmZzZXRzW0Rlc3RCQi0+Z2V0TnVtYmVyKCldOworCisgIERFQlVHKGVycnMoKSA8PCAiQnJhbmNoIG9mIGRlc3RpbmF0aW9uIEJCIyIgPDwgRGVzdEJCLT5nZXROdW1iZXIoKQorICAgICAgICAgICAgICAgPDwgIiBmcm9tIEJCIyIgPDwgTUktPmdldFBhcmVudCgpLT5nZXROdW1iZXIoKQorICAgICAgICAgICAgICAgPDwgIiBtYXggZGVsdGE9IiA8PCBNYXhEaXNwCisgICAgICAgICAgICAgICA8PCAiIGZyb20gIiA8PCBHZXRPZmZzZXRPZihNSSkgPDwgIiB0byAiIDw8IERlc3RPZmZzZXQKKyAgICAgICAgICAgICAgIDw8ICIgb2Zmc2V0ICIgPDwgaW50KERlc3RPZmZzZXQtQnJPZmZzZXQpIDw8ICJcdCIgPDwgKk1JKTsKKworICBpZiAoQnJPZmZzZXQgPD0gRGVzdE9mZnNldCkgeworICAgIC8vIEJyYW5jaCBiZWZvcmUgdGhlIERlc3QuCisgICAgaWYgKERlc3RPZmZzZXQtQnJPZmZzZXQgPD0gTWF4RGlzcCkKKyAgICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIGlmIChCck9mZnNldC1EZXN0T2Zmc2V0IDw9IE1heERpc3ApCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBGaXhVcEltbWVkaWF0ZUJyIC0gRml4IHVwIGFuIGltbWVkaWF0ZSBicmFuY2ggd2hvc2UgZGVzdGluYXRpb24gaXMgdG9vIGZhcgorLy8vIGF3YXkgdG8gZml0IGluIGl0cyBkaXNwbGFjZW1lbnQgZmllbGQuCitib29sIEFSTUNvbnN0YW50SXNsYW5kczo6Rml4VXBJbW1lZGlhdGVCcihNYWNoaW5lRnVuY3Rpb24gJk1GLCBJbW1CcmFuY2ggJkJyKSB7CisgIE1hY2hpbmVJbnN0ciAqTUkgPSBCci5NSTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKkRlc3RCQiA9IE1JLT5nZXRPcGVyYW5kKDApLmdldE1CQigpOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgRGVzdEJCIGlzIGFscmVhZHkgaW4tcmFuZ2UuCisgIGlmIChCQklzSW5SYW5nZShNSSwgRGVzdEJCLCBCci5NYXhEaXNwKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFCci5pc0NvbmQpCisgICAgcmV0dXJuIEZpeFVwVW5jb25kaXRpb25hbEJyKE1GLCBCcik7CisgIHJldHVybiBGaXhVcENvbmRpdGlvbmFsQnIoTUYsIEJyKTsKK30KKworLy8vIEZpeFVwVW5jb25kaXRpb25hbEJyIC0gRml4IHVwIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHdob3NlIGRlc3RpbmF0aW9uIGlzCisvLy8gdG9vIGZhciBhd2F5IHRvIGZpdCBpbiBpdHMgZGlzcGxhY2VtZW50IGZpZWxkLiBJZiB0aGUgTFIgcmVnaXN0ZXIgaGFzIGJlZW4KKy8vLyBzcGlsbGVkIGluIHRoZSBlcGlsb2d1ZSwgdGhlbiB3ZSBjYW4gdXNlIEJMIHRvIGltcGxlbWVudCBhIGZhciBqdW1wLgorLy8vIE90aGVyd2lzZSwgYWRkIGFuIGludGVybWVkaWF0ZSBicmFuY2ggaW5zdHJ1Y3Rpb24gdG8gYSBicmFuY2guCitib29sCitBUk1Db25zdGFudElzbGFuZHM6OkZpeFVwVW5jb25kaXRpb25hbEJyKE1hY2hpbmVGdW5jdGlvbiAmTUYsIEltbUJyYW5jaCAmQnIpIHsKKyAgTWFjaGluZUluc3RyICpNSSA9IEJyLk1JOworICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTUktPmdldFBhcmVudCgpOworICBpZiAoIWlzVGh1bWIxKQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkZpeFVwVW5jb25kaXRpb25hbEJyIGlzIFRodW1iMSBvbmx5ISIpOworCisgIC8vIFVzZSBCTCB0byBpbXBsZW1lbnQgZmFyIGp1bXAuCisgIEJyLk1heERpc3AgPSAoMSA8PCAyMSkgKiAyOworICBNSS0+c2V0RGVzYyhUSUktPmdldChBUk06OnRCZmFyKSk7CisgIEJCU2l6ZXNbTUJCLT5nZXROdW1iZXIoKV0gKz0gMjsKKyAgQWRqdXN0QkJPZmZzZXRzQWZ0ZXIoTUJCLCAyKTsKKyAgSGFzRmFySnVtcCA9IHRydWU7CisgICsrTnVtVUJyRml4ZWQ7CisKKyAgREVCVUcoZXJycygpIDw8ICIgIENoYW5nZWQgQiB0byBsb25nIGp1bXAgIiA8PCAqTUkpOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gRml4VXBDb25kaXRpb25hbEJyIC0gRml4IHVwIGEgY29uZGl0aW9uYWwgYnJhbmNoIHdob3NlIGRlc3RpbmF0aW9uIGlzIHRvbworLy8vIGZhciBhd2F5IHRvIGZpdCBpbiBpdHMgZGlzcGxhY2VtZW50IGZpZWxkLiBJdCBpcyBjb252ZXJ0ZWQgdG8gYW4gaW52ZXJzZQorLy8vIGNvbmRpdGlvbmFsIGJyYW5jaCArIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHRvIHRoZSBkZXN0aW5hdGlvbi4KK2Jvb2wKK0FSTUNvbnN0YW50SXNsYW5kczo6Rml4VXBDb25kaXRpb25hbEJyKE1hY2hpbmVGdW5jdGlvbiAmTUYsIEltbUJyYW5jaCAmQnIpIHsKKyAgTWFjaGluZUluc3RyICpNSSA9IEJyLk1JOworICBNYWNoaW5lQmFzaWNCbG9jayAqRGVzdEJCID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisKKyAgLy8gQWRkIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHRvIHRoZSBkZXN0aW5hdGlvbiBhbmQgaW52ZXJ0IHRoZSBicmFuY2gKKyAgLy8gY29uZGl0aW9uIHRvIGp1bXAgb3ZlciBpdDoKKyAgLy8gYmx0IEwxCisgIC8vID0+CisgIC8vIGJnZSBMMgorICAvLyBiICAgTDEKKyAgLy8gTDI6CisgIEFSTUNDOjpDb25kQ29kZXMgQ0MgPSAoQVJNQ0M6OkNvbmRDb2RlcylNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKTsKKyAgQ0MgPSBBUk1DQzo6Z2V0T3Bwb3NpdGVDb25kaXRpb24oQ0MpOworICB1bnNpZ25lZCBDQ1JlZyA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpOworCisgIC8vIElmIHRoZSBicmFuY2ggaXMgYXQgdGhlIGVuZCBvZiBpdHMgTUJCIGFuZCB0aGF0IGhhcyBhIGZhbGwtdGhyb3VnaCBibG9jaywKKyAgLy8gZGlyZWN0IHRoZSB1cGRhdGVkIGNvbmRpdGlvbmFsIGJyYW5jaCB0byB0aGUgZmFsbC10aHJvdWdoIGJsb2NrLiBPdGhlcndpc2UsCisgIC8vIHNwbGl0IHRoZSBNQkIgYmVmb3JlIHRoZSBuZXh0IGluc3RydWN0aW9uLgorICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTUktPmdldFBhcmVudCgpOworICBNYWNoaW5lSW5zdHIgKkJNSSA9ICZNQkItPmJhY2soKTsKKyAgYm9vbCBOZWVkU3BsaXQgPSAoQk1JICE9IE1JKSB8fCAhQkJIYXNGYWxsdGhyb3VnaChNQkIpOworCisgICsrTnVtQ0JyRml4ZWQ7CisgIGlmIChCTUkgIT0gTUkpIHsKKyAgICBpZiAobGx2bTo6bmV4dChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoTUkpKSA9PSBwcmlvcihNQkItPmVuZCgpKSAmJgorICAgICAgICBCTUktPmdldE9wY29kZSgpID09IEJyLlVuY29uZEJyKSB7CisgICAgICAvLyBMYXN0IE1JIGluIHRoZSBCQiBpcyBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gQ2FuIHdlIHNpbXBseSBpbnZlcnQgdGhlCisgICAgICAvLyBjb25kaXRpb24gYW5kIHN3YXAgZGVzdGluYXRpb25zOgorICAgICAgLy8gYmVxIEwxCisgICAgICAvLyBiICAgTDIKKyAgICAgIC8vID0+CisgICAgICAvLyBibmUgTDIKKyAgICAgIC8vIGIgICBMMQorICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk5ld0Rlc3QgPSBCTUktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgICBpZiAoQkJJc0luUmFuZ2UoTUksIE5ld0Rlc3QsIEJyLk1heERpc3ApKSB7CisgICAgICAgIERFQlVHKGVycnMoKSA8PCAiICBJbnZlcnQgQmNjIGNvbmRpdGlvbiBhbmQgc3dhcCBpdHMgZGVzdGluYXRpb24gd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICA8PCAqQk1JKTsKKyAgICAgICAgQk1JLT5nZXRPcGVyYW5kKDApLnNldE1CQihEZXN0QkIpOworICAgICAgICBNSS0+Z2V0T3BlcmFuZCgwKS5zZXRNQkIoTmV3RGVzdCk7CisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDEpLnNldEltbShDQyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChOZWVkU3BsaXQpIHsKKyAgICBTcGxpdEJsb2NrQmVmb3JlSW5zdHIoTUkpOworICAgIC8vIE5vIG5lZWQgZm9yIHRoZSBicmFuY2ggdG8gdGhlIG5leHQgYmxvY2suIFdlJ3JlIGFkZGluZyBhbiB1bmNvbmRpdGlvbmFsCisgICAgLy8gYnJhbmNoIHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAgICBpbnQgZGVsdGEgPSBUSUktPkdldEluc3RTaXplSW5CeXRlcygmTUJCLT5iYWNrKCkpOworICAgIEJCU2l6ZXNbTUJCLT5nZXROdW1iZXIoKV0gLT0gZGVsdGE7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIFNwbGl0QkIgPSBsbHZtOjpuZXh0KE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IoTUJCKSk7CisgICAgQWRqdXN0QkJPZmZzZXRzQWZ0ZXIoU3BsaXRCQiwgLWRlbHRhKTsKKyAgICBNQkItPmJhY2soKS5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAvLyBCQk9mZnNldHNbU3BsaXRCQl0gaXMgd3JvbmcgdGVtcG9yYXJpbHksIGZpeGVkIGJlbG93CisgIH0KKyAgTWFjaGluZUJhc2ljQmxvY2sgKk5leHRCQiA9IGxsdm06Om5leHQoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihNQkIpKTsKKworICBERUJVRyhlcnJzKCkgPDwgIiAgSW5zZXJ0IEIgdG8gQkIjIiA8PCBEZXN0QkItPmdldE51bWJlcigpCisgICAgICAgICAgICAgICA8PCAiIGFsc28gaW52ZXJ0IGNvbmRpdGlvbiBhbmQgY2hhbmdlIGRlc3QuIHRvIEJCIyIKKyAgICAgICAgICAgICAgIDw8IE5leHRCQi0+Z2V0TnVtYmVyKCkgPDwgIlxuIik7CisKKyAgLy8gSW5zZXJ0IGEgbmV3IGNvbmRpdGlvbmFsIGJyYW5jaCBhbmQgYSBuZXcgdW5jb25kaXRpb25hbCBicmFuY2guCisgIC8vIEFsc28gdXBkYXRlIHRoZSBJbW1CcmFuY2ggYXMgd2VsbCBhcyBhZGRpbmcgYSBuZXcgZW50cnkgZm9yIHRoZSBuZXcgYnJhbmNoLgorICBCdWlsZE1JKE1CQiwgRGVidWdMb2MoKSwgVElJLT5nZXQoTUktPmdldE9wY29kZSgpKSkKKyAgICAuYWRkTUJCKE5leHRCQikuYWRkSW1tKENDKS5hZGRSZWcoQ0NSZWcpOworICBCci5NSSA9ICZNQkItPmJhY2soKTsKKyAgQkJTaXplc1tNQkItPmdldE51bWJlcigpXSArPSBUSUktPkdldEluc3RTaXplSW5CeXRlcygmTUJCLT5iYWNrKCkpOworICBCdWlsZE1JKE1CQiwgRGVidWdMb2MoKSwgVElJLT5nZXQoQnIuVW5jb25kQnIpKS5hZGRNQkIoRGVzdEJCKTsKKyAgQkJTaXplc1tNQkItPmdldE51bWJlcigpXSArPSBUSUktPkdldEluc3RTaXplSW5CeXRlcygmTUJCLT5iYWNrKCkpOworICB1bnNpZ25lZCBNYXhEaXNwID0gZ2V0VW5jb25kaXRpb25hbEJyRGlzcChCci5VbmNvbmRCcik7CisgIEltbUJyYW5jaGVzLnB1c2hfYmFjayhJbW1CcmFuY2goJk1CQi0+YmFjaygpLCBNYXhEaXNwLCBmYWxzZSwgQnIuVW5jb25kQnIpKTsKKworICAvLyBSZW1vdmUgdGhlIG9sZCBjb25kaXRpb25hbCBicmFuY2guICBJdCBtYXkgb3IgbWF5IG5vdCBzdGlsbCBiZSBpbiBNQkIuCisgIEJCU2l6ZXNbTUktPmdldFBhcmVudCgpLT5nZXROdW1iZXIoKV0gLT0gVElJLT5HZXRJbnN0U2l6ZUluQnl0ZXMoTUkpOworICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8gVGhlIG5ldCBzaXplIGNoYW5nZSBpcyBhbiBhZGRpdGlvbiBvZiBvbmUgdW5jb25kaXRpb25hbCBicmFuY2guCisgIGludCBkZWx0YSA9IFRJSS0+R2V0SW5zdFNpemVJbkJ5dGVzKCZNQkItPmJhY2soKSk7CisgIEFkanVzdEJCT2Zmc2V0c0FmdGVyKE1CQiwgZGVsdGEpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFVuZG9MUlNwaWxsUmVzdG9yZSAtIFJlbW92ZSBUaHVtYiBwdXNoIC8gcG9wIGluc3RydWN0aW9ucyB0aGF0IG9ubHkgc3BpbGxzCisvLy8gTFIgLyByZXN0b3JlcyBMUiB0byBwYy4gRklYTUU6IFRoaXMgaXMgZG9uZSBoZXJlIGJlY2F1c2UgaXQncyBvbmx5IHBvc3NpYmxlCisvLy8gdG8gZG8gdGhpcyBpZiB0QmZhciBpcyBub3QgdXNlZC4KK2Jvb2wgQVJNQ29uc3RhbnRJc2xhbmRzOjpVbmRvTFJTcGlsbFJlc3RvcmUoKSB7CisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUHVzaFBvcE1Jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZUluc3RyICpNSSA9IFB1c2hQb3BNSXNbaV07CisgICAgLy8gRmlyc3QgdHdvIG9wZXJhbmRzIGFyZSBwcmVkaWNhdGVzLgorICAgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0UE9QX1JFVCAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSA9PSBBUk06OlBDICYmCisgICAgICAgIE1JLT5nZXROdW1FeHBsaWNpdE9wZXJhbmRzKCkgPT0gMykgeworICAgICAgQnVpbGRNSShNSS0+Z2V0UGFyZW50KCksIE1JLT5nZXREZWJ1Z0xvYygpLCBUSUktPmdldChBUk06OnRCWF9SRVQpKTsKKyAgICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworYm9vbCBBUk1Db25zdGFudElzbGFuZHM6Ok9wdGltaXplVGh1bWIySW5zdHJ1Y3Rpb25zKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgLy8gU2hyaW5rIEFEUiBhbmQgTERSIGZyb20gY29uc3RhbnRwb29sLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ1BVc2Vycy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ1BVc2VyICZVID0gQ1BVc2Vyc1tpXTsKKyAgICB1bnNpZ25lZCBPcGNvZGUgPSBVLk1JLT5nZXRPcGNvZGUoKTsKKyAgICB1bnNpZ25lZCBOZXdPcGMgPSAwOworICAgIHVuc2lnbmVkIFNjYWxlID0gMTsKKyAgICB1bnNpZ25lZCBCaXRzID0gMDsKKyAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgQVJNOjp0MkxFQXBjcmVsOgorICAgICAgaWYgKGlzQVJNTG93UmVnaXN0ZXIoVS5NSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkpIHsKKyAgICAgICAgTmV3T3BjID0gQVJNOjp0TEVBcGNyZWw7CisgICAgICAgIEJpdHMgPSA4OworICAgICAgICBTY2FsZSA9IDQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSTTo6dDJMRFJwY2k6CisgICAgICBpZiAoaXNBUk1Mb3dSZWdpc3RlcihVLk1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKSkgeworICAgICAgICBOZXdPcGMgPSBBUk06OnRMRFJwY2k7CisgICAgICAgIEJpdHMgPSA4OworICAgICAgICBTY2FsZSA9IDQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIU5ld09wYykKKyAgICAgIGNvbnRpbnVlOworCisgICAgdW5zaWduZWQgVXNlck9mZnNldCA9IEdldE9mZnNldE9mKFUuTUkpICsgNDsKKyAgICB1bnNpZ25lZCBNYXhPZmZzID0gKCgxIDw8IEJpdHMpIC0gMSkgKiBTY2FsZTsKKyAgICAvLyBGSVhNRTogQ2hlY2sgaWYgb2Zmc2V0IGlzIG11bHRpcGxlIG9mIHNjYWxlIGlmIHNjYWxlIGlzIG5vdCA0LgorICAgIGlmIChDUEVJc0luUmFuZ2UoVS5NSSwgVXNlck9mZnNldCwgVS5DUEVNSSwgTWF4T2ZmcywgZmFsc2UsIHRydWUpKSB7CisgICAgICBVLk1JLT5zZXREZXNjKFRJSS0+Z2V0KE5ld09wYykpOworICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IFUuTUktPmdldFBhcmVudCgpOworICAgICAgQkJTaXplc1tNQkItPmdldE51bWJlcigpXSAtPSAyOworICAgICAgQWRqdXN0QkJPZmZzZXRzQWZ0ZXIoTUJCLCAtMik7CisgICAgICArK051bVQyQ1BTaHJ1bms7CisgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBNYWRlQ2hhbmdlIHw9IE9wdGltaXplVGh1bWIyQnJhbmNoZXMoTUYpOworICBNYWRlQ2hhbmdlIHw9IE9wdGltaXplVGh1bWIySnVtcFRhYmxlcyhNRik7CisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCitib29sIEFSTUNvbnN0YW50SXNsYW5kczo6T3B0aW1pemVUaHVtYjJCcmFuY2hlcyhNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbW1CcmFuY2hlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgSW1tQnJhbmNoICZCciA9IEltbUJyYW5jaGVzW2ldOworICAgIHVuc2lnbmVkIE9wY29kZSA9IEJyLk1JLT5nZXRPcGNvZGUoKTsKKyAgICB1bnNpZ25lZCBOZXdPcGMgPSAwOworICAgIHVuc2lnbmVkIFNjYWxlID0gMTsKKyAgICB1bnNpZ25lZCBCaXRzID0gMDsKKyAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgQVJNOjp0MkI6CisgICAgICBOZXdPcGMgPSBBUk06OnRCOworICAgICAgQml0cyA9IDExOworICAgICAgU2NhbGUgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUk06OnQyQmNjOiB7CisgICAgICBOZXdPcGMgPSBBUk06OnRCY2M7CisgICAgICBCaXRzID0gODsKKyAgICAgIFNjYWxlID0gMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgaWYgKE5ld09wYykgeworICAgICAgdW5zaWduZWQgTWF4T2ZmcyA9ICgoMSA8PCAoQml0cy0xKSktMSkgKiBTY2FsZTsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpEZXN0QkIgPSBCci5NSS0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICAgIGlmIChCQklzSW5SYW5nZShCci5NSSwgRGVzdEJCLCBNYXhPZmZzKSkgeworICAgICAgICBCci5NSS0+c2V0RGVzYyhUSUktPmdldChOZXdPcGMpKTsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IEJyLk1JLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgQkJTaXplc1tNQkItPmdldE51bWJlcigpXSAtPSAyOworICAgICAgICBBZGp1c3RCQk9mZnNldHNBZnRlcihNQkIsIC0yKTsKKyAgICAgICAgKytOdW1UMkJyU2hydW5rOworICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBPcGNvZGUgPSBCci5NSS0+Z2V0T3Bjb2RlKCk7CisgICAgaWYgKE9wY29kZSAhPSBBUk06OnRCY2MpCisgICAgICBjb250aW51ZTsKKworICAgIE5ld09wYyA9IDA7CisgICAgdW5zaWduZWQgUHJlZFJlZyA9IDA7CisgICAgQVJNQ0M6OkNvbmRDb2RlcyBQcmVkID0gbGx2bTo6Z2V0SW5zdHJQcmVkaWNhdGUoQnIuTUksIFByZWRSZWcpOworICAgIGlmIChQcmVkID09IEFSTUNDOjpFUSkKKyAgICAgIE5ld09wYyA9IEFSTTo6dENCWjsKKyAgICBlbHNlIGlmIChQcmVkID09IEFSTUNDOjpORSkKKyAgICAgIE5ld09wYyA9IEFSTTo6dENCTlo7CisgICAgaWYgKCFOZXdPcGMpCisgICAgICBjb250aW51ZTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRGVzdEJCID0gQnIuTUktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgLy8gQ2hlY2sgaWYgdGhlIGRpc3RhbmNlIGlzIHdpdGhpbiAxMjYuIFN1YnRyYWN0IHN0YXJ0aW5nIG9mZnNldCBieSAyCisgICAgLy8gYmVjYXVzZSB0aGUgY21wIHdpbGwgYmUgZWxpbWluYXRlZC4KKyAgICB1bnNpZ25lZCBCck9mZnNldCA9IEdldE9mZnNldE9mKEJyLk1JKSArIDQgLSAyOworICAgIHVuc2lnbmVkIERlc3RPZmZzZXQgPSBCQk9mZnNldHNbRGVzdEJCLT5nZXROdW1iZXIoKV07CisgICAgaWYgKEJyT2Zmc2V0IDwgRGVzdE9mZnNldCAmJiAoRGVzdE9mZnNldCAtIEJyT2Zmc2V0KSA8PSAxMjYpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBDbXBNSSA9IEJyLk1JOyAtLUNtcE1JOworICAgICAgaWYgKENtcE1JLT5nZXRPcGNvZGUoKSA9PSBBUk06OnRDTVB6aTgpIHsKKyAgICAgICAgdW5zaWduZWQgUmVnID0gQ21wTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgICAgIFByZWQgPSBsbHZtOjpnZXRJbnN0clByZWRpY2F0ZShDbXBNSSwgUHJlZFJlZyk7CisgICAgICAgIGlmIChQcmVkID09IEFSTUNDOjpBTCAmJgorICAgICAgICAgICAgQ21wTUktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkgPT0gMCAmJgorICAgICAgICAgICAgaXNBUk1Mb3dSZWdpc3RlcihSZWcpKSB7CisgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IEJyLk1JLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgICBNYWNoaW5lSW5zdHIgKk5ld0JSID0KKyAgICAgICAgICAgIEJ1aWxkTUkoKk1CQiwgQ21wTUksIEJyLk1JLT5nZXREZWJ1Z0xvYygpLCBUSUktPmdldChOZXdPcGMpKQorICAgICAgICAgICAgLmFkZFJlZyhSZWcpLmFkZE1CQihEZXN0QkIsIEJyLk1JLT5nZXRPcGVyYW5kKDApLmdldFRhcmdldEZsYWdzKCkpOworICAgICAgICAgIENtcE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgICBCci5NSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgICAgQnIuTUkgPSBOZXdCUjsKKyAgICAgICAgICBCQlNpemVzW01CQi0+Z2V0TnVtYmVyKCldIC09IDI7CisgICAgICAgICAgQWRqdXN0QkJPZmZzZXRzQWZ0ZXIoTUJCLCAtMik7CisgICAgICAgICAgKytOdW1DQlo7CisgICAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworLy8vIE9wdGltaXplVGh1bWIySnVtcFRhYmxlcyAtIFVzZSB0YmIgLyB0YmggaW5zdHJ1Y3Rpb25zIHRvIGdlbmVyYXRlIHNtYWxsZXIKKy8vLyBqdW1wdGFibGVzIHdoZW4gaXQncyBwb3NzaWJsZS4KK2Jvb2wgQVJNQ29uc3RhbnRJc2xhbmRzOjpPcHRpbWl6ZVRodW1iMkp1bXBUYWJsZXMoTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKworICAvLyBGSVhNRTogQWZ0ZXIgdGhlIHRhYmxlcyBhcmUgc2hydW5rLCBjYW4gd2UgZ2V0IHJpZCBzb21lIG9mIHRoZQorICAvLyBjb25zdGFudHBvb2wgdGFibGVzPworICBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqTUpUSSA9IE1GLmdldEp1bXBUYWJsZUluZm8oKTsKKyAgaWYgKE1KVEkgPT0gMCkgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gJkpUID0gTUpUSS0+Z2V0SnVtcFRhYmxlcygpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVDJKdW1wVGFibGVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gVDJKdW1wVGFibGVzW2ldOworICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUktPmdldERlc2MoKTsKKyAgICB1bnNpZ25lZCBOdW1PcHMgPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgICB1bnNpZ25lZCBKVE9wSWR4ID0gTnVtT3BzIC0gKFRJRC5pc1ByZWRpY2FibGUoKSA/IDMgOiAyKTsKKyAgICBNYWNoaW5lT3BlcmFuZCBKVE9QID0gTUktPmdldE9wZXJhbmQoSlRPcElkeCk7CisgICAgdW5zaWduZWQgSlRJID0gSlRPUC5nZXRJbmRleCgpOworICAgIGFzc2VydChKVEkgPCBKVC5zaXplKCkpOworCisgICAgYm9vbCBCeXRlT2sgPSB0cnVlOworICAgIGJvb2wgSGFsZldvcmRPayA9IHRydWU7CisgICAgdW5zaWduZWQgSlRPZmZzZXQgPSBHZXRPZmZzZXRPZihNSSkgKyA0OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gJkpUQkJzID0gSlRbSlRJXS5NQkJzOworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVlID0gSlRCQnMuc2l6ZSgpOyBqICE9IGVlOyArK2opIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBKVEJCc1tqXTsKKyAgICAgIHVuc2lnbmVkIERzdE9mZnNldCA9IEJCT2Zmc2V0c1tNQkItPmdldE51bWJlcigpXTsKKyAgICAgIC8vIE5lZ2F0aXZlIG9mZnNldCBpcyBub3Qgb2suIEZJWE1FOiBXZSBzaG91bGQgY2hhbmdlIEJCIGxheW91dCB0byBtYWtlCisgICAgICAvLyBzdXJlIGFsbCB0aGUgYnJhbmNoZXMgYXJlIGZvcndhcmQuCisgICAgICBpZiAoQnl0ZU9rICYmIChEc3RPZmZzZXQgLSBKVE9mZnNldCkgPiAoKDE8PDgpLTEpKjIpCisgICAgICAgIEJ5dGVPayA9IGZhbHNlOworICAgICAgdW5zaWduZWQgVEJITGltaXQgPSAoKDE8PDE2KS0xKSoyOworICAgICAgaWYgKEhhbGZXb3JkT2sgJiYgKERzdE9mZnNldCAtIEpUT2Zmc2V0KSA+IFRCSExpbWl0KQorICAgICAgICBIYWxmV29yZE9rID0gZmFsc2U7CisgICAgICBpZiAoIUJ5dGVPayAmJiAhSGFsZldvcmRPaykKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKEJ5dGVPayB8fCBIYWxmV29yZE9rKSB7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTUktPmdldFBhcmVudCgpOworICAgICAgdW5zaWduZWQgQmFzZVJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgICAgYm9vbCBCYXNlUmVnS2lsbCA9IE1JLT5nZXRPcGVyYW5kKDApLmlzS2lsbCgpOworICAgICAgaWYgKCFCYXNlUmVnS2lsbCkKKyAgICAgICAgY29udGludWU7CisgICAgICB1bnNpZ25lZCBJZHhSZWcgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICAgIGJvb2wgSWR4UmVnS2lsbCA9IE1JLT5nZXRPcGVyYW5kKDEpLmlzS2lsbCgpOworCisgICAgICAvLyBTY2FuIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGRlZmluZXMgdGhlIGJhc2UKKyAgICAgIC8vIHJlZ2lzdGVyLiBEdWUgdG8gcG9zdC1SQSBzY2hlZHVsaW5nLCB3ZSBjYW4ndCBjb3VudCBvbiBpdAorICAgICAgLy8gaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24uCisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUHJldkkgPSBNSTsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCID0gTUJCLT5iZWdpbigpOworICAgICAgd2hpbGUgKFByZXZJICE9IEIgJiYgIVByZXZJLT5kZWZpbmVzUmVnaXN0ZXIoQmFzZVJlZykpCisgICAgICAgIC0tUHJldkk7CisKKyAgICAgIC8vIElmIGZvciBzb21lIHJlYXNvbiB3ZSBkaWRuJ3QgZmluZCBpdCwgd2UgY2FuJ3QgZG8gYW55dGhpbmcsIHNvCisgICAgICAvLyBqdXN0IHNraXAgdGhpcyBvbmUuCisgICAgICBpZiAoIVByZXZJLT5kZWZpbmVzUmVnaXN0ZXIoQmFzZVJlZykpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBNYWNoaW5lSW5zdHIgKkFkZHJNSSA9IFByZXZJOworICAgICAgYm9vbCBPcHRPayA9IHRydWU7CisgICAgICAvLyBFeGFtaW5lIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlIGp1bXB0YWJsZSBlbnRyeSBhZGRyZXNzLgorICAgICAgLy8gTWFrZSBzdXJlIGl0IG9ubHkgZGVmaW5lcyB0aGUgYmFzZSByZWdpc3RlciBhbmQga2lsbHMgYW55IHVzZXMKKyAgICAgIC8vIG90aGVyIHRoYW4gdGhlIGluZGV4IHJlZ2lzdGVyLgorICAgICAgZm9yICh1bnNpZ25lZCBrID0gMCwgZWVlID0gQWRkck1JLT5nZXROdW1PcGVyYW5kcygpOyBrICE9IGVlZTsgKytrKSB7CisgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IEFkZHJNSS0+Z2V0T3BlcmFuZChrKTsKKyAgICAgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5nZXRSZWcoKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKE1PLmlzRGVmKCkgJiYgTU8uZ2V0UmVnKCkgIT0gQmFzZVJlZykgeworICAgICAgICAgIE9wdE9rID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1PLmlzVXNlKCkgJiYgIU1PLmlzS2lsbCgpICYmIE1PLmdldFJlZygpICE9IElkeFJlZykgeworICAgICAgICAgIE9wdE9rID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghT3B0T2spCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBOb3cgc2NhbiBiYWNrIGFnYWluIHRvIGZpbmQgdGhlIHRMRUFwY3JlbCBvciB0MkxFQXBjcmVsSlQgaW5zdHJ1Y3Rpb24KKyAgICAgIC8vIHRoYXQgZ2F2ZSB1cyB0aGUgaW5pdGlhbCBiYXNlIHJlZ2lzdGVyIGRlZmluaXRpb24uCisgICAgICBmb3IgKC0tUHJldkk7IFByZXZJICE9IEIgJiYgIVByZXZJLT5kZWZpbmVzUmVnaXN0ZXIoQmFzZVJlZyk7IC0tUHJldkkpCisgICAgICAgIDsKKworICAgICAgLy8gVGhlIGluc3RydWN0aW9uIHNob3VsZCBiZSBhIHRMRUFwY3JlbCBvciB0MkxFQXBjcmVsSlQ7IHdlIHdhbnQKKyAgICAgIC8vIHRvIGRlbGV0ZSBpdCBhcyB3ZWxsLgorICAgICAgTWFjaGluZUluc3RyICpMZWFNSSA9IFByZXZJOworICAgICAgaWYgKChMZWFNSS0+Z2V0T3Bjb2RlKCkgIT0gQVJNOjp0TEVBcGNyZWxKVCAmJgorICAgICAgICAgICBMZWFNSS0+Z2V0T3Bjb2RlKCkgIT0gQVJNOjp0MkxFQXBjcmVsSlQpIHx8CisgICAgICAgICAgTGVhTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgIT0gQmFzZVJlZykKKyAgICAgICAgT3B0T2sgPSBmYWxzZTsKKworICAgICAgaWYgKCFPcHRPaykKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHVuc2lnbmVkIE9wYyA9IEJ5dGVPayA/IEFSTTo6dDJUQkIgOiBBUk06OnQyVEJIOworICAgICAgTWFjaGluZUluc3RyICpOZXdKVE1JID0gQnVpbGRNSShNQkIsIE1JLT5nZXREZWJ1Z0xvYygpLCBUSUktPmdldChPcGMpKQorICAgICAgICAuYWRkUmVnKElkeFJlZywgZ2V0S2lsbFJlZ1N0YXRlKElkeFJlZ0tpbGwpKQorICAgICAgICAuYWRkSnVtcFRhYmxlSW5kZXgoSlRJLCBKVE9QLmdldFRhcmdldEZsYWdzKCkpCisgICAgICAgIC5hZGRJbW0oTUktPmdldE9wZXJhbmQoSlRPcElkeCsxKS5nZXRJbW0oKSk7CisgICAgICAvLyBGSVhNRTogSW5zZXJ0IGFuICJBTElHTiIgaW5zdHJ1Y3Rpb24gdG8gZW5zdXJlIHRoZSBuZXh0IGluc3RydWN0aW9uCisgICAgICAvLyBpcyAyLWJ5dGUgYWxpZ25lZC4gRm9yIG5vdywgYXNtIHByaW50ZXIgd2lsbCBmaXggaXQgdXAuCisgICAgICB1bnNpZ25lZCBOZXdTaXplID0gVElJLT5HZXRJbnN0U2l6ZUluQnl0ZXMoTmV3SlRNSSk7CisgICAgICB1bnNpZ25lZCBPcmlnU2l6ZSA9IFRJSS0+R2V0SW5zdFNpemVJbkJ5dGVzKEFkZHJNSSk7CisgICAgICBPcmlnU2l6ZSArPSBUSUktPkdldEluc3RTaXplSW5CeXRlcyhMZWFNSSk7CisgICAgICBPcmlnU2l6ZSArPSBUSUktPkdldEluc3RTaXplSW5CeXRlcyhNSSk7CisKKyAgICAgIEFkZHJNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBMZWFNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgICAgIGludCBkZWx0YSA9IE9yaWdTaXplIC0gTmV3U2l6ZTsKKyAgICAgIEJCU2l6ZXNbTUJCLT5nZXROdW1iZXIoKV0gLT0gZGVsdGE7CisgICAgICBBZGp1c3RCQk9mZnNldHNBZnRlcihNQkIsIC1kZWx0YSk7CisKKyAgICAgICsrTnVtVEJzOworICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vLyBSZW9yZGVyVGh1bWIySnVtcFRhYmxlcyAtIEFkanVzdCB0aGUgZnVuY3Rpb24ncyBibG9jayBsYXlvdXQgdG8gZW5zdXJlIHRoYXQKKy8vLyBqdW1wIHRhYmxlcyBhbHdheXMgYnJhbmNoIGZvcndhcmRzLCBzaW5jZSB0aGF0J3Mgd2hhdCB0YmIgYW5kIHRiaCBuZWVkLgorYm9vbCBBUk1Db25zdGFudElzbGFuZHM6OlJlb3JkZXJUaHVtYjJKdW1wVGFibGVzKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgTWFjaGluZUp1bXBUYWJsZUluZm8gKk1KVEkgPSBNRi5nZXRKdW1wVGFibGVJbmZvKCk7CisgIGlmIChNSlRJID09IDApIHJldHVybiBmYWxzZTsKKworICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lSnVtcFRhYmxlRW50cnk+ICZKVCA9IE1KVEktPmdldEp1bXBUYWJsZXMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFQySnVtcFRhYmxlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZUluc3RyICpNSSA9IFQySnVtcFRhYmxlc1tpXTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgICAgdW5zaWduZWQgTnVtT3BzID0gVElELmdldE51bU9wZXJhbmRzKCk7CisgICAgdW5zaWduZWQgSlRPcElkeCA9IE51bU9wcyAtIChUSUQuaXNQcmVkaWNhYmxlKCkgPyAzIDogMik7CisgICAgTWFjaGluZU9wZXJhbmQgSlRPUCA9IE1JLT5nZXRPcGVyYW5kKEpUT3BJZHgpOworICAgIHVuc2lnbmVkIEpUSSA9IEpUT1AuZ2V0SW5kZXgoKTsKKyAgICBhc3NlcnQoSlRJIDwgSlQuc2l6ZSgpKTsKKworICAgIC8vIFdlIHByZWZlciBpZiB0YXJnZXQgYmxvY2tzIGZvciB0aGUganVtcCB0YWJsZSBjb21lIGFmdGVyIHRoZSBqdW1wCisgICAgLy8gaW5zdHJ1Y3Rpb24gc28gd2UgY2FuIHVzZSBUQltCSF0uIExvb3AgdGhyb3VnaCB0aGUgdGFyZ2V0IGJsb2NrcworICAgIC8vIGFuZCB0cnkgdG8gYWRqdXN0IHRoZW0gc3VjaCB0aGF0IHRoYXQncyB0cnVlLgorICAgIGludCBKVE51bWJlciA9IE1JLT5nZXRQYXJlbnQoKS0+Z2V0TnVtYmVyKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiAmSlRCQnMgPSBKVFtKVEldLk1CQnM7CisgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZWUgPSBKVEJCcy5zaXplKCk7IGogIT0gZWU7ICsraikgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IEpUQkJzW2pdOworICAgICAgaW50IERUTnVtYmVyID0gTUJCLT5nZXROdW1iZXIoKTsKKworICAgICAgaWYgKERUTnVtYmVyIDwgSlROdW1iZXIpIHsKKyAgICAgICAgLy8gVGhlIGRlc3RpbmF0aW9uIHByZWNlZGVzIHRoZSBzd2l0Y2guIFRyeSB0byBtb3ZlIHRoZSBibG9jayBmb3J3YXJkCisgICAgICAgIC8vIHNvIHdlIGhhdmUgYSBwb3NpdGl2ZSBvZmZzZXQuCisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdCQiA9CisgICAgICAgICAgQWRqdXN0SlRUYXJnZXRCbG9ja0ZvcndhcmQoTUJCLCBNSS0+Z2V0UGFyZW50KCkpOworICAgICAgICBpZiAoTmV3QkIpCisgICAgICAgICAgTUpUSS0+UmVwbGFjZU1CQkluSnVtcFRhYmxlKEpUSSwgSlRCQnNbal0sIE5ld0JCKTsKKyAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKK01hY2hpbmVCYXNpY0Jsb2NrICpBUk1Db25zdGFudElzbGFuZHM6OgorQWRqdXN0SlRUYXJnZXRCbG9ja0ZvcndhcmQoTWFjaGluZUJhc2ljQmxvY2sgKkJCLCBNYWNoaW5lQmFzaWNCbG9jayAqSlRCQikKK3sKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpCQi0+Z2V0UGFyZW50KCk7CisKKyAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIGJsb2NrIGlzIHRlcm1pbmF0ZWQgYnkgYW4gdW5jb25kaXRpb25hbCBicmFuY2gsCisgIC8vIHRyeSB0byBtb3ZlIGl0OyBvdGhlcndpc2UsIGNyZWF0ZSBhIG5ldyBibG9jayBmb2xsb3dpbmcgdGhlIGp1bXAKKyAgLy8gdGFibGUgdGhhdCBicmFuY2hlcyBiYWNrIHRvIHRoZSBhY3R1YWwgdGFyZ2V0LiBUaGlzIGlzIGEgdmVyeSBzaW1wbGUKKyAgLy8gaGV1cmlzdGljLiBGSVhNRTogV2UgY2FuIGRlZmluaXRlbHkgaW1wcm92ZSBpdC4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiA9IDAsICpGQkIgPSAwOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwgND4gQ29uZDsKKyAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDQ+IENvbmRQcmlvcjsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBCQmkgPSBCQjsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBPbGRQcmlvciA9IHByaW9yKEJCaSk7CisKKyAgLy8gSWYgdGhlIGJsb2NrIHRlcm1pbmF0b3IgaXNuJ3QgYW5hbHl6YWJsZSwgZG9uJ3QgdHJ5IHRvIG1vdmUgdGhlIGJsb2NrCisgIGJvb2wgQiA9IFRJSS0+QW5hbHl6ZUJyYW5jaCgqQkIsIFRCQiwgRkJCLCBDb25kKTsKKworICAvLyBJZiB0aGUgYmxvY2sgZW5kcyBpbiBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgbW92ZSBpdC4gVGhlIHByaW9yIGJsb2NrCisgIC8vIGhhcyB0byBoYXZlIGFuIGFuYWx5emFibGUgdGVybWluYXRvciBmb3IgdXMgdG8gbW92ZSB0aGlzIG9uZS4gQmUgcGFyYW5vaWQKKyAgLy8gYW5kIG1ha2Ugc3VyZSB3ZSdyZSBub3QgdHJ5aW5nIHRvIG1vdmUgdGhlIGVudHJ5IGJsb2NrIG9mIHRoZSBmdW5jdGlvbi4KKyAgaWYgKCFCICYmIENvbmQuZW1wdHkoKSAmJiBCQiAhPSBNRi5iZWdpbigpICYmCisgICAgICAhVElJLT5BbmFseXplQnJhbmNoKCpPbGRQcmlvciwgVEJCLCBGQkIsIENvbmRQcmlvcikpIHsKKyAgICBCQi0+bW92ZUFmdGVyKEpUQkIpOworICAgIE9sZFByaW9yLT51cGRhdGVUZXJtaW5hdG9yKCk7CisgICAgQkItPnVwZGF0ZVRlcm1pbmF0b3IoKTsKKyAgICAvLyBVcGRhdGUgbnVtYmVyaW5nIHRvIGFjY291bnQgZm9yIHRoZSBibG9jayBiZWluZyBtb3ZlZC4KKyAgICBNRi5SZW51bWJlckJsb2NrcygpOworICAgICsrTnVtSlRNb3ZlZDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIG5ldyBNQkIgZm9yIHRoZSBjb2RlIGFmdGVyIHRoZSBqdW1wIEJCLgorICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3QkIgPQorICAgIE1GLkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKEpUQkItPmdldEJhc2ljQmxvY2soKSk7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUJCSSA9IEpUQkI7ICsrTUJCSTsKKyAgTUYuaW5zZXJ0KE1CQkksIE5ld0JCKTsKKworICAvLyBBZGQgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggZnJvbSBOZXdCQiB0byBCQi4KKyAgLy8gVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIG1lYW5pbmdmdWwgRGVidWdJbmZvIGF2YWlsYWJsZTsgdGhpcyBkb2Vzbid0CisgIC8vIGNvcnJlc3BvbmQgZGlyZWN0bHkgdG8gYW55dGhpbmcgaW4gdGhlIHNvdXJjZS4KKyAgYXNzZXJ0IChpc1RodW1iMiAmJiAiQWRqdXN0aW5nIGZvciBUQltCSF0gYnV0IG5vdCBpbiBUaHVtYjI/Iik7CisgIEJ1aWxkTUkoTmV3QkIsIERlYnVnTG9jKCksIFRJSS0+Z2V0KEFSTTo6dDJCKSkuYWRkTUJCKEJCKTsKKworICAvLyBVcGRhdGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIGFjY291bnQgZm9yIHRoZSBuZXdseSBpbnNlcnRlZCBNQkIuCisgIE1GLlJlbnVtYmVyQmxvY2tzKE5ld0JCKTsKKworICAvLyBVcGRhdGUgdGhlIENGRy4KKyAgTmV3QkItPmFkZFN1Y2Nlc3NvcihCQik7CisgIEpUQkItPnJlbW92ZVN1Y2Nlc3NvcihCQik7CisgIEpUQkItPmFkZFN1Y2Nlc3NvcihOZXdCQik7CisKKyAgKytOdW1KVEluc2VydGVkOworICByZXR1cm4gTmV3QkI7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1Db25zdGFudFBvb2xWYWx1ZS5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1Db25zdGFudFBvb2xWYWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzY2NjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUNvbnN0YW50UG9vbFZhbHVlLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLy89PT0tIEFSTUNvbnN0YW50UG9vbFZhbHVlLmNwcCAtIEFSTSBjb25zdGFudHBvb2wgdmFsdWUgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQVJNIHNwZWNpZmljIGNvbnN0YW50cG9vbCB2YWx1ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNQ29uc3RhbnRQb29sVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNzdGRsaWI+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworQVJNQ29uc3RhbnRQb29sVmFsdWU6OkFSTUNvbnN0YW50UG9vbFZhbHVlKGNvbnN0IENvbnN0YW50ICpjdmFsLCB1bnNpZ25lZCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DUDo6QVJNQ1BLaW5kIEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBQQ0FkaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFkZENBKQorICA6IE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSgoY29uc3QgVHlwZSopY3ZhbC0+Z2V0VHlwZSgpKSwKKyAgICBDVmFsKGN2YWwpLCBTKE5VTEwpLCBMYWJlbElkKGlkKSwgS2luZChLKSwgUENBZGp1c3QoUENBZGopLAorICAgIE1vZGlmaWVyKE1vZGlmKSwgQWRkQ3VycmVudEFkZHJlc3MoQWRkQ0EpIHt9CisKK0FSTUNvbnN0YW50UG9vbFZhbHVlOjpBUk1Db25zdGFudFBvb2xWYWx1ZShMTFZNQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFBDQWRqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkQ0EpCisgIDogTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlKChjb25zdCBUeXBlKilUeXBlOjpnZXRJbnQzMlR5KEMpKSwKKyAgICBDVmFsKE5VTEwpLCBTKHN0cmR1cChzKSksIExhYmVsSWQoaWQpLCBLaW5kKEFSTUNQOjpDUEV4dFN5bWJvbCksCisgICAgUENBZGp1c3QoUENBZGopLCBNb2RpZmllcihNb2RpZiksIEFkZEN1cnJlbnRBZGRyZXNzKEFkZENBKSB7fQorCitBUk1Db25zdGFudFBvb2xWYWx1ZTo6QVJNQ29uc3RhbnRQb29sVmFsdWUoY29uc3QgR2xvYmFsVmFsdWUgKmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmKQorICA6IE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSgoY29uc3QgVHlwZSopVHlwZTo6Z2V0SW50MzJUeShndi0+Z2V0Q29udGV4dCgpKSksCisgICAgQ1ZhbChndiksIFMoTlVMTCksIExhYmVsSWQoMCksIEtpbmQoQVJNQ1A6OkNQVmFsdWUpLCBQQ0FkanVzdCgwKSwKKyAgICBNb2RpZmllcihNb2RpZikge30KKworY29uc3QgR2xvYmFsVmFsdWUgKkFSTUNvbnN0YW50UG9vbFZhbHVlOjpnZXRHVigpIGNvbnN0IHsKKyAgcmV0dXJuIGR5bl9jYXN0X29yX251bGw8R2xvYmFsVmFsdWU+KENWYWwpOworfQorCitjb25zdCBCbG9ja0FkZHJlc3MgKkFSTUNvbnN0YW50UG9vbFZhbHVlOjpnZXRCbG9ja0FkZHJlc3MoKSBjb25zdCB7CisgIHJldHVybiBkeW5fY2FzdF9vcl9udWxsPEJsb2NrQWRkcmVzcz4oQ1ZhbCk7Cit9CisKK2ludCBBUk1Db25zdGFudFBvb2xWYWx1ZTo6Z2V0RXhpc3RpbmdNYWNoaW5lQ1BWYWx1ZShNYWNoaW5lQ29uc3RhbnRQb29sICpDUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgdW5zaWduZWQgQWxpZ25NYXNrID0gQWxpZ25tZW50IC0gMTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUNvbnN0YW50UG9vbEVudHJ5PiBDb25zdGFudHMgPSBDUC0+Z2V0Q29uc3RhbnRzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDb25zdGFudHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChDb25zdGFudHNbaV0uaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSAmJgorICAgICAgICAoQ29uc3RhbnRzW2ldLmdldEFsaWdubWVudCgpICYgQWxpZ25NYXNrKSA9PSAwKSB7CisgICAgICBBUk1Db25zdGFudFBvb2xWYWx1ZSAqQ1BWID0KKyAgICAgICAgKEFSTUNvbnN0YW50UG9vbFZhbHVlICopQ29uc3RhbnRzW2ldLlZhbC5NYWNoaW5lQ1BWYWw7CisgICAgICBpZiAoQ1BWLT5DVmFsID09IENWYWwgJiYKKyAgICAgICAgICBDUFYtPkxhYmVsSWQgPT0gTGFiZWxJZCAmJgorICAgICAgICAgIENQVi0+UENBZGp1c3QgPT0gUENBZGp1c3QgJiYKKyAgICAgICAgICAoQ1BWLT5TID09IFMgfHwgc3RyY21wKENQVi0+UywgUykgPT0gMCkgJiYKKyAgICAgICAgICAoQ1BWLT5Nb2RpZmllciA9PSBNb2RpZmllciB8fCBzdHJjbXAoQ1BWLT5Nb2RpZmllciwgTW9kaWZpZXIpID09IDApKQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKworICByZXR1cm4gLTE7Cit9CisKK0FSTUNvbnN0YW50UG9vbFZhbHVlOjp+QVJNQ29uc3RhbnRQb29sVmFsdWUoKSB7CisgIGZyZWUoKHZvaWQqKVMpOworfQorCit2b2lkCitBUk1Db25zdGFudFBvb2xWYWx1ZTo6QWRkU2VsZWN0aW9uREFHQ1NFSWQoRm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgSUQuQWRkUG9pbnRlcihDVmFsKTsKKyAgSUQuQWRkUG9pbnRlcihTKTsKKyAgSUQuQWRkSW50ZWdlcihMYWJlbElkKTsKKyAgSUQuQWRkSW50ZWdlcihQQ0FkanVzdCk7Cit9CisKK2Jvb2wKK0FSTUNvbnN0YW50UG9vbFZhbHVlOjpoYXNTYW1lVmFsdWUoQVJNQ29uc3RhbnRQb29sVmFsdWUgKkFDUFYpIHsKKyAgaWYgKEFDUFYtPktpbmQgPT0gS2luZCAmJgorICAgICAgQUNQVi0+Q1ZhbCA9PSBDVmFsICYmCisgICAgICBBQ1BWLT5QQ0FkanVzdCA9PSBQQ0FkanVzdCAmJgorICAgICAgKEFDUFYtPlMgPT0gUyB8fCBzdHJjbXAoQUNQVi0+UywgUykgPT0gMCkgJiYKKyAgICAgIChBQ1BWLT5Nb2RpZmllciA9PSBNb2RpZmllciB8fCBzdHJjbXAoQUNQVi0+TW9kaWZpZXIsIE1vZGlmaWVyKSA9PSAwKSkgeworICAgIGlmIChBQ1BWLT5MYWJlbElkID09IExhYmVsSWQpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBUd28gUEMgcmVsYXRpdmUgY29uc3Rwb29sIGVudHJpZXMgY29udGFpbmluZyB0aGUgc2FtZSBHViBhZGRyZXNzIG9yCisgICAgLy8gZXh0ZXJuYWwgc3ltYm9scy4gRklYTUU6IFdoYXQgYWJvdXQgYmxvY2thZGRyZXNzPworICAgIGlmIChLaW5kID09IEFSTUNQOjpDUFZhbHVlIHx8IEtpbmQgPT0gQVJNQ1A6OkNQRXh0U3ltYm9sKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFSTUNvbnN0YW50UG9vbFZhbHVlOjpkdW1wKCkgY29uc3QgeworICBlcnJzKCkgPDwgIiAgIiA8PCAqdGhpczsKK30KKworCit2b2lkIEFSTUNvbnN0YW50UG9vbFZhbHVlOjpwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3QgeworICBpZiAoQ1ZhbCkKKyAgICBPIDw8IENWYWwtPmdldE5hbWUoKTsKKyAgZWxzZQorICAgIE8gPDwgUzsKKyAgaWYgKE1vZGlmaWVyKSBPIDw8ICIoIiA8PCBNb2RpZmllciA8PCAiKSI7CisgIGlmIChQQ0FkanVzdCAhPSAwKSB7CisgICAgTyA8PCAiLShMUEMiIDw8IExhYmVsSWQgPDwgIisiIDw8ICh1bnNpZ25lZClQQ0FkanVzdDsKKyAgICBpZiAoQWRkQ3VycmVudEFkZHJlc3MpIE8gPDwgIi0uIjsKKyAgICBPIDw8ICIpIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNQ29uc3RhbnRQb29sVmFsdWUuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUNvbnN0YW50UG9vbFZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExOWI1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUNvbnN0YW50UG9vbFZhbHVlLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vPT09LSBBUk1Db25zdGFudFBvb2xWYWx1ZS5oIC0gQVJNIGNvbnN0YW50cG9vbCB2YWx1ZSAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEFSTSBzcGVjaWZpYyBjb25zdGFudHBvb2wgdmFsdWUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9BUk1fQ09OU1RBTlRQT09MVkFMVUVfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9BUk1fQ09OU1RBTlRQT09MVkFMVUVfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbnN0YW50OworY2xhc3MgQmxvY2tBZGRyZXNzOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBMTFZNQ29udGV4dDsKKworbmFtZXNwYWNlIEFSTUNQIHsKKyAgZW51bSBBUk1DUEtpbmQgeworICAgIENQVmFsdWUsCisgICAgQ1BFeHRTeW1ib2wsCisgICAgQ1BCbG9ja0FkZHJlc3MsCisgICAgQ1BMU0RBCisgIH07Cit9CisKKy8vLyBBUk1Db25zdGFudFBvb2xWYWx1ZSAtIEFSTSBzcGVjaWZpYyBjb25zdGFudHBvb2wgdmFsdWUuIFRoaXMgaXMgdXNlZCB0bworLy8vIHJlcHJlc2VudCBQQy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiB0aGUgbG9hZAorLy8vIGluc3RydWN0aW9uIGFuZCB0aGUgY29uc3RhbnQgYmVpbmcgbG9hZGVkLCBpLmUuICgmR1YtKExQSUMrOCkpLgorY2xhc3MgQVJNQ29uc3RhbnRQb29sVmFsdWUgOiBwdWJsaWMgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlIHsKKyAgY29uc3QgQ29uc3RhbnQgKkNWYWw7ICAgIC8vIENvbnN0YW50IGJlaW5nIGxvYWRlZC4KKyAgY29uc3QgY2hhciAqUzsgICAgICAgICAgIC8vIEV4dFN5bWJvbCBiZWluZyBsb2FkZWQuCisgIHVuc2lnbmVkIExhYmVsSWQ7ICAgICAgICAvLyBMYWJlbCBpZCBvZiB0aGUgbG9hZC4KKyAgQVJNQ1A6OkFSTUNQS2luZCBLaW5kOyAgIC8vIEtpbmQgb2YgY29uc3RhbnQuCisgIHVuc2lnbmVkIGNoYXIgUENBZGp1c3Q7ICAvLyBFeHRyYSBhZGp1c3RtZW50IGlmIGNvbnN0YW50cG9vbCBpcyBwYy1yZWxhdGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDggZm9yIEFSTSwgNCBmb3IgVGh1bWIuCisgIGNvbnN0IGNoYXIgKk1vZGlmaWVyOyAgICAvLyBHViBtb2RpZmllciBpLmUuICgmR1YobW9kaWZpZXIpLShMUElDKzgpKQorICBib29sIEFkZEN1cnJlbnRBZGRyZXNzOworCitwdWJsaWM6CisgIEFSTUNvbnN0YW50UG9vbFZhbHVlKGNvbnN0IENvbnN0YW50ICpjdmFsLCB1bnNpZ25lZCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQVJNQ1A6OkFSTUNQS2luZCBLaW5kID0gQVJNQ1A6OkNQVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgUENBZGogPSAwLCBjb25zdCBjaGFyICpNb2RpZmllciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkQ3VycmVudEFkZHJlc3MgPSBmYWxzZSk7CisgIEFSTUNvbnN0YW50UG9vbFZhbHVlKExMVk1Db250ZXh0ICZDLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBQQ0FkaiA9IDAsIGNvbnN0IGNoYXIgKk1vZGlmaWVyID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRDdXJyZW50QWRkcmVzcyA9IGZhbHNlKTsKKyAgQVJNQ29uc3RhbnRQb29sVmFsdWUoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBjb25zdCBjaGFyICpNb2RpZmllcik7CisgIEFSTUNvbnN0YW50UG9vbFZhbHVlKCk7CisgIH5BUk1Db25zdGFudFBvb2xWYWx1ZSgpOworCisgIGNvbnN0IEdsb2JhbFZhbHVlICpnZXRHVigpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiBTOyB9CisgIGNvbnN0IEJsb2NrQWRkcmVzcyAqZ2V0QmxvY2tBZGRyZXNzKCkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldE1vZGlmaWVyKCkgY29uc3QgeyByZXR1cm4gTW9kaWZpZXI7IH0KKyAgYm9vbCBoYXNNb2RpZmllcigpIGNvbnN0IHsgcmV0dXJuIE1vZGlmaWVyICE9IE5VTEw7IH0KKyAgYm9vbCBtdXN0QWRkQ3VycmVudEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBBZGRDdXJyZW50QWRkcmVzczsgfQorICB1bnNpZ25lZCBnZXRMYWJlbElkKCkgY29uc3QgeyByZXR1cm4gTGFiZWxJZDsgfQorICB1bnNpZ25lZCBjaGFyIGdldFBDQWRqdXN0bWVudCgpIGNvbnN0IHsgcmV0dXJuIFBDQWRqdXN0OyB9CisgIGJvb2wgaXNHbG9iYWxWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gQVJNQ1A6OkNQVmFsdWU7IH0KKyAgYm9vbCBpc0V4dFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gQVJNQ1A6OkNQRXh0U3ltYm9sOyB9CisgIGJvb2wgaXNCbG9ja0FkZHJlc3MoKSB7IHJldHVybiBLaW5kID09IEFSTUNQOjpDUEJsb2NrQWRkcmVzczsgfQorICBib29sIGlzTFNEQSgpIHsgcmV0dXJuIEtpbmQgPT0gQVJNQ1A6OkNQTFNEQTsgfQorCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UmVsb2NhdGlvbkluZm8oKSBjb25zdCB7CisgICAgLy8gRklYTUU6IFRoaXMgaXMgY29uc2VydmF0aXZlbHkgY2xhaW1pbmcgdGhhdCB0aGVzZSBlbnRyaWVzIHJlcXVpcmUgYQorICAgIC8vIHJlbG9jYXRpb24sIHdlIG1heSBiZSBhYmxlIHRvIGRvIGJldHRlciB0aGFuIHRoaXMuCisgICAgcmV0dXJuIDI7CisgIH0KKworICB2aXJ0dWFsIGludCBnZXRFeGlzdGluZ01hY2hpbmVDUFZhbHVlKE1hY2hpbmVDb25zdGFudFBvb2wgKkNQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCk7CisKKyAgdmlydHVhbCB2b2lkIEFkZFNlbGVjdGlvbkRBR0NTRUlkKEZvbGRpbmdTZXROb2RlSUQgJklEKTsKKworICAvLy8gaGFzU2FtZVZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBBUk0gY29uc3Rwb29sIHZhbHVlCisgIC8vLyBjYW4gc2hhcmUgdGhlIHNhbWUgY29uc3RhbnRwb29sIGVudHJ5IGFzIGFub3RoZXIgQVJNIGNvbnN0cG9vbCB2YWx1ZS4KKyAgYm9vbCBoYXNTYW1lVmFsdWUoQVJNQ29uc3RhbnRQb29sVmFsdWUgKkFDUFYpOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gKk8pIGNvbnN0IHsgaWYgKE8pIHByaW50KCpPKTsgfQorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk8sIGNvbnN0IEFSTUNvbnN0YW50UG9vbFZhbHVlICZWKSB7CisgIFYucHJpbnQoTyk7CisgIHJldHVybiBPOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUV4cGFuZFBzZXVkb0luc3RzLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUV4cGFuZFBzZXVkb0luc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWY4YTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNRXhwYW5kUHNldWRvSW5zdHMuY3BwCkBAIC0wLDAgKzEsMTgyIEBACisvLz09PS0tIEFSTUV4cGFuZFBzZXVkb0luc3RzLmNwcCAtIEV4cGFuZCBwc2V1ZG8gaW5zdHJ1Y3Rpb25zIC0tLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHBhc3MgdGhhdCBleHBhbmQgcHNldWRvIGluc3RydWN0aW9ucyBpbnRvIHRhcmdldAorLy8gaW5zdHJ1Y3Rpb25zIHRvIGFsbG93IHByb3BlciBzY2hlZHVsaW5nLCBpZi1jb252ZXJzaW9uLCBhbmQgb3RoZXIgbGF0ZQorLy8gb3B0aW1pemF0aW9ucy4gVGhpcyBwYXNzIHNob3VsZCBiZSBydW4gYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbiBidXQgYmVmb3JlCisvLyBwb3N0LSByZWdhbGxvYyBzY2hlZHVsaW5nIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJhcm0tcHNldWRvIgorI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTUJhc2VJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgQVJNRXhwYW5kUHNldWRvIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgQVJNRXhwYW5kUHNldWRvKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGbik7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJBUk0gcHNldWRvIGluc3RydWN0aW9uIGV4cGFuc2lvbiBwYXNzIjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIFRyYW5zZmVySW1wT3BzKE1hY2hpbmVJbnN0ciAmT2xkTUksCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHJCdWlsZGVyICZVc2VNSSwgTWFjaGluZUluc3RyQnVpbGRlciAmRGVmTUkpOworICAgIGJvb2wgRXhwYW5kTUJCKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworICB9OworICBjaGFyIEFSTUV4cGFuZFBzZXVkbzo6SUQgPSAwOworfQorCisvLy8gVHJhbnNmZXJJbXBPcHMgLSBUcmFuc2ZlciBpbXBsaWNpdCBvcGVyYW5kcyBvbiB0aGUgcHNldWRvIGluc3RydWN0aW9uIHRvCisvLy8gdGhlIGluc3RydWN0aW9ucyBjcmVhdGVkIGZyb20gdGhlIGV4cGFuc2lvbi4KK3ZvaWQgQVJNRXhwYW5kUHNldWRvOjpUcmFuc2ZlckltcE9wcyhNYWNoaW5lSW5zdHIgJk9sZE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgJlVzZU1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgJkRlZk1JKSB7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmRGVzYyA9IE9sZE1JLmdldERlc2MoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gRGVzYy5nZXROdW1PcGVyYW5kcygpLCBlID0gT2xkTUkuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgICBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE9sZE1JLmdldE9wZXJhbmQoaSk7CisgICAgYXNzZXJ0KE1PLmlzUmVnKCkgJiYgTU8uZ2V0UmVnKCkpOworICAgIGlmIChNTy5pc1VzZSgpKQorICAgICAgVXNlTUkuYWRkUmVnKE1PLmdldFJlZygpLCBnZXRLaWxsUmVnU3RhdGUoTU8uaXNLaWxsKCkpKTsKKyAgICBlbHNlCisgICAgICBEZWZNSS5hZGRSZWcoTU8uZ2V0UmVnKCksCisgICAgICAgICAgICAgICAgICAgZ2V0RGVmUmVnU3RhdGUodHJ1ZSkgfCBnZXREZWFkUmVnU3RhdGUoTU8uaXNEZWFkKCkpKTsKKyAgfQorfQorCitib29sIEFSTUV4cGFuZFBzZXVkbzo6RXhwYW5kTUJCKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIHsKKyAgYm9vbCBNb2RpZmllZCA9IGZhbHNlOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gTUJCLmJlZ2luKCksIEUgPSBNQkIuZW5kKCk7CisgIHdoaWxlIChNQkJJICE9IEUpIHsKKyAgICBNYWNoaW5lSW5zdHIgJk1JID0gKk1CQkk7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE5NQkJJID0gbGx2bTo6bmV4dChNQkJJKTsKKworICAgIHVuc2lnbmVkIE9wY29kZSA9IE1JLmdldE9wY29kZSgpOworICAgIHN3aXRjaCAoT3Bjb2RlKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSBBUk06OnRMRFJwY2lfcGljOiAKKyAgICBjYXNlIEFSTTo6dDJMRFJwY2lfcGljOiB7CisgICAgICB1bnNpZ25lZCBOZXdMZE9wYyA9IChPcGNvZGUgPT0gQVJNOjp0TERScGNpX3BpYykKKyAgICAgICAgPyBBUk06OnRMRFJwY2kgOiBBUk06OnQyTERScGNpOworICAgICAgdW5zaWduZWQgRHN0UmVnID0gTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAgIGJvb2wgRHN0SXNEZWFkID0gTUkuZ2V0T3BlcmFuZCgwKS5pc0RlYWQoKTsKKyAgICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCMSA9CisgICAgICAgIEFkZERlZmF1bHRQcmVkKEJ1aWxkTUkoTUJCLCBNQkJJLCBNSS5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJSS0+Z2V0KE5ld0xkT3BjKSwgRHN0UmVnKQorICAgICAgICAgICAgICAgICAgICAgICAuYWRkT3BlcmFuZChNSS5nZXRPcGVyYW5kKDEpKSk7CisgICAgICAoKk1JQjEpLnNldE1lbVJlZnMoTUkubWVtb3BlcmFuZHNfYmVnaW4oKSwgTUkubWVtb3BlcmFuZHNfZW5kKCkpOworICAgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIyID0gQnVpbGRNSShNQkIsIE1CQkksIE1JLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJSS0+Z2V0KEFSTTo6dFBJQ0FERCkpCisgICAgICAgIC5hZGRSZWcoRHN0UmVnLCBnZXREZWZSZWdTdGF0ZSh0cnVlKSB8IGdldERlYWRSZWdTdGF0ZShEc3RJc0RlYWQpKQorICAgICAgICAuYWRkUmVnKERzdFJlZykKKyAgICAgICAgLmFkZE9wZXJhbmQoTUkuZ2V0T3BlcmFuZCgyKSk7CisgICAgICBUcmFuc2ZlckltcE9wcyhNSSwgTUlCMSwgTUlCMik7CisgICAgICBNSS5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIE1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQVJNOjp0Mk1PVmkzMmltbTogeworICAgICAgdW5zaWduZWQgUHJlZFJlZyA9IDA7CisgICAgICBBUk1DQzo6Q29uZENvZGVzIFByZWQgPSBsbHZtOjpnZXRJbnN0clByZWRpY2F0ZSgmTUksIFByZWRSZWcpOworICAgICAgdW5zaWduZWQgRHN0UmVnID0gTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAgIGJvb2wgRHN0SXNEZWFkID0gTUkuZ2V0T3BlcmFuZCgwKS5pc0RlYWQoKTsKKyAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoMSk7CisgICAgICBNYWNoaW5lSW5zdHJCdWlsZGVyIExPMTYsIEhJMTY7CisKKyAgICAgIExPMTYgPSBCdWlsZE1JKE1CQiwgTUJCSSwgTUkuZ2V0RGVidWdMb2MoKSwgVElJLT5nZXQoQVJNOjp0Mk1PVmkxNiksCisgICAgICAgICAgICAgICAgICAgICBEc3RSZWcpOworICAgICAgSEkxNiA9IEJ1aWxkTUkoTUJCLCBNQkJJLCBNSS5nZXREZWJ1Z0xvYygpLCBUSUktPmdldChBUk06OnQyTU9WVGkxNikpCisgICAgICAgIC5hZGRSZWcoRHN0UmVnLCBnZXREZWZSZWdTdGF0ZSh0cnVlKSB8IGdldERlYWRSZWdTdGF0ZShEc3RJc0RlYWQpKQorICAgICAgICAuYWRkUmVnKERzdFJlZyk7CisKKyAgICAgIGlmIChNTy5pc0ltbSgpKSB7CisgICAgICAgIHVuc2lnbmVkIEltbSA9IE1PLmdldEltbSgpOworICAgICAgICB1bnNpZ25lZCBMbzE2ID0gSW1tICYgMHhmZmZmOworICAgICAgICB1bnNpZ25lZCBIaTE2ID0gKEltbSA+PiAxNikgJiAweGZmZmY7CisgICAgICAgIExPMTYgPSBMTzE2LmFkZEltbShMbzE2KTsKKyAgICAgICAgSEkxNiA9IEhJMTYuYWRkSW1tKEhpMTYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gTU8uZ2V0R2xvYmFsKCk7CisgICAgICAgIHVuc2lnbmVkIFRGID0gTU8uZ2V0VGFyZ2V0RmxhZ3MoKTsKKyAgICAgICAgTE8xNiA9IExPMTYuYWRkR2xvYmFsQWRkcmVzcyhHViwgTU8uZ2V0T2Zmc2V0KCksIFRGIHwgQVJNSUk6Ok1PX0xPMTYpOworICAgICAgICBISTE2ID0gSEkxNi5hZGRHbG9iYWxBZGRyZXNzKEdWLCBNTy5nZXRPZmZzZXQoKSwgVEYgfCBBUk1JSTo6TU9fSEkxNik7CisgICAgICB9CisgICAgICAoKkxPMTYpLnNldE1lbVJlZnMoTUkubWVtb3BlcmFuZHNfYmVnaW4oKSwgTUkubWVtb3BlcmFuZHNfZW5kKCkpOworICAgICAgKCpISTE2KS5zZXRNZW1SZWZzKE1JLm1lbW9wZXJhbmRzX2JlZ2luKCksIE1JLm1lbW9wZXJhbmRzX2VuZCgpKTsKKyAgICAgIExPMTYuYWRkSW1tKFByZWQpLmFkZFJlZyhQcmVkUmVnKTsKKyAgICAgIEhJMTYuYWRkSW1tKFByZWQpLmFkZFJlZyhQcmVkUmVnKTsKKyAgICAgIFRyYW5zZmVySW1wT3BzKE1JLCBMTzE2LCBISTE2KTsKKyAgICAgIE1JLmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgTW9kaWZpZWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBBUk06OlZNT1ZRUTogeworICAgICAgdW5zaWduZWQgRHN0UmVnID0gTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAgIGJvb2wgRHN0SXNEZWFkID0gTUkuZ2V0T3BlcmFuZCgwKS5pc0RlYWQoKTsKKyAgICAgIHVuc2lnbmVkIEV2ZW5Ec3QgPSBUUkktPmdldFN1YlJlZyhEc3RSZWcsIEFSTTo6cXN1Yl8wKTsKKyAgICAgIHVuc2lnbmVkIE9kZERzdCAgPSBUUkktPmdldFN1YlJlZyhEc3RSZWcsIEFSTTo6cXN1Yl8xKTsKKyAgICAgIHVuc2lnbmVkIFNyY1JlZyA9IE1JLmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICBib29sIFNyY0lzS2lsbCA9IE1JLmdldE9wZXJhbmQoMSkuaXNLaWxsKCk7CisgICAgICB1bnNpZ25lZCBFdmVuU3JjID0gVFJJLT5nZXRTdWJSZWcoU3JjUmVnLCBBUk06OnFzdWJfMCk7CisgICAgICB1bnNpZ25lZCBPZGRTcmMgID0gVFJJLT5nZXRTdWJSZWcoU3JjUmVnLCBBUk06OnFzdWJfMSk7CisgICAgICBNYWNoaW5lSW5zdHJCdWlsZGVyIEV2ZW4gPQorICAgICAgICBBZGREZWZhdWx0UHJlZChCdWlsZE1JKE1CQiwgTUJCSSwgTUkuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUktPmdldChBUk06OlZNT1ZRKSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoRXZlbkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVmUmVnU3RhdGUodHJ1ZSkgfCBnZXREZWFkUmVnU3RhdGUoRHN0SXNEZWFkKSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoRXZlblNyYywgZ2V0S2lsbFJlZ1N0YXRlKFNyY0lzS2lsbCkpKTsKKyAgICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgT2RkID0KKyAgICAgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIE1CQkksIE1JLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoQVJNOjpWTU9WUSkpCisgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKE9kZERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVmUmVnU3RhdGUodHJ1ZSkgfCBnZXREZWFkUmVnU3RhdGUoRHN0SXNEZWFkKSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoT2RkU3JjLCBnZXRLaWxsUmVnU3RhdGUoU3JjSXNLaWxsKSkpOworICAgICAgVHJhbnNmZXJJbXBPcHMoTUksIEV2ZW4sIE9kZCk7CisgICAgICBNSS5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIE1vZGlmaWVkID0gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIE1CQkkgPSBOTUJCSTsKKyAgfQorCisgIHJldHVybiBNb2RpZmllZDsKK30KKworYm9vbCBBUk1FeHBhbmRQc2V1ZG86OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgVElJID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgIFRSSSA9IE1GLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworCisgIGJvb2wgTW9kaWZpZWQgPSBmYWxzZTsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1GSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsgTUZJICE9IEU7CisgICAgICAgKytNRkkpCisgICAgTW9kaWZpZWQgfD0gRXhwYW5kTUJCKCpNRkkpOworICByZXR1cm4gTW9kaWZpZWQ7Cit9CisKKy8vLyBjcmVhdGVBUk1FeHBhbmRQc2V1ZG9QYXNzIC0gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgcHNldWRvIGluc3RydWN0aW9uCisvLy8gZXhwYW5zaW9uIHBhc3MuCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUFSTUV4cGFuZFBzZXVkb1Bhc3MoKSB7CisgIHJldHVybiBuZXcgQVJNRXhwYW5kUHNldWRvKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1GYXN0SVNlbC5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1GYXN0SVNlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkMDM3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUZhc3RJU2VsLmNwcApAQCAtMCwwICsxLDcyIEBACisvLz09PS0tIEFSTUZhc3RJU2VsLmNwcCAtIEFSTSBGYXN0SVNlbCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBBUk0tc3BlY2lmaWMgc3VwcG9ydCBmb3IgdGhlIEZhc3RJU2VsIGNsYXNzLiBTb21lCisvLyBvZiB0aGUgdGFyZ2V0LXNwZWNpZmljIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IHRhYmxlZ2VuIGluIHRoZSBmaWxlCisvLyBBUk1HZW5GYXN0SVNlbC5pbmMsIHdoaWNoIGlzICNpbmNsdWRlZCBoZXJlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1SZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJBUk1UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiQVJNU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0Zhc3RJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0Z1bmN0aW9uTG93ZXJpbmdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworCitjbGFzcyBBUk1GYXN0SVNlbCA6IHB1YmxpYyBGYXN0SVNlbCB7CisKKyAgLy8vIFN1YnRhcmdldCAtIEtlZXAgYSBwb2ludGVyIHRvIHRoZSBBUk1TdWJ0YXJnZXQgYXJvdW5kIHNvIHRoYXQgd2UgY2FuCisgIC8vLyBtYWtlIHRoZSByaWdodCBkZWNpc2lvbiB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgZGlmZmVyZW50IHRhcmdldHMuCisgIGNvbnN0IEFSTVN1YnRhcmdldCAqU3VidGFyZ2V0OworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBUk1GYXN0SVNlbChGdW5jdGlvbkxvd2VyaW5nSW5mbyAmZnVuY0luZm8pIDogRmFzdElTZWwoZnVuY0luZm8pIHsKKyAgICAgIFN1YnRhcmdldCA9ICZUTS5nZXRTdWJ0YXJnZXQ8QVJNU3VidGFyZ2V0PigpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBUYXJnZXRTZWxlY3RJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiAqSSk7CisKKyAgI2luY2x1ZGUgIkFSTUdlbkZhc3RJU2VsLmluYyIKKworICB9OworCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vICNpbmNsdWRlICJBUk1HZW5DYWxsaW5nQ29udi5pbmMiCisKK2Jvb2wgQVJNRmFzdElTZWw6OlRhcmdldFNlbGVjdEluc3RydWN0aW9uKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgbGx2bTo6RmFzdElTZWwgKkFSTTo6Y3JlYXRlRmFzdElTZWwoRnVuY3Rpb25Mb3dlcmluZ0luZm8gJmZ1bmNJbmZvKSB7CisgICAgLy8gVHVybiBpdCBvZmYgZm9yIG5vdy4gSXQncyBub3QgcXVpdGUgcmVhZHkuCisgICAgcmV0dXJuIDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUZyYW1lSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNRnJhbWVJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkYWUyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUZyYW1lSW5mby5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LS0gQVJNVGFyZ2V0RnJhbWVJbmZvLmggLSBEZWZpbmUgVGFyZ2V0RnJhbWVJbmZvIGZvciBBUk0gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEFSTV9GUkFNRUlORk9fSAorI2RlZmluZSBBUk1fRlJBTUVJTkZPX0gKKworI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTVN1YnRhcmdldC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFSTUZyYW1lSW5mbyA6IHB1YmxpYyBUYXJnZXRGcmFtZUluZm8geworcHVibGljOgorICBleHBsaWNpdCBBUk1GcmFtZUluZm8oY29uc3QgQVJNU3VidGFyZ2V0ICZTVCkKKyAgICA6IFRhcmdldEZyYW1lSW5mbyhTdGFja0dyb3dzRG93biwgU1QuZ2V0U3RhY2tBbGlnbm1lbnQoKSwgMCwgNCkgeworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUdsb2JhbE1lcmdlLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUdsb2JhbE1lcmdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWIwYzZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNR2xvYmFsTWVyZ2UuY3BwCkBAIC0wLDAgKzEsMjEyIEBACisvLz09PS0tIEFSTUdsb2JhbE1lcmdlLmNwcCAtIEludGVybmFsIGdsb2JhbHMgbWVyZ2luZyAgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBwYXNzIG1lcmdlcyBnbG9iYWxzIHdpdGggaW50ZXJuYWwgbGlua2FnZSBpbnRvIG9uZS4gVGhpcyB3YXkgYWxsIHRoZQorLy8gZ2xvYmFscyB3aGljaCB3ZXJlIG1lcmdlZCBpbnRvIGEgYmlnZ2VzdCBvbmUgY2FuIGJlIGFkZHJlc3NlZCB1c2luZyBvZmZzZXRzCisvLyBmcm9tIHRoZSBzYW1lIGJhc2UgcG9pbnRlciAobm8gbmVlZCBmb3Igc2VwYXJhdGUgYmFzZSBwb2ludGVyIGZvciBlYWNoIG9mIHRoZQorLy8gZ2xvYmFsKS4gU3VjaCBhIHRyYW5zZm9ybWF0aW9uIGNhbiBzaWduaWZpY2FudGx5IHJlZHVjZSB0aGUgcmVnaXN0ZXIgcHJlc3N1cmUKKy8vIHdoZW4gbWFueSBnbG9iYWxzIGFyZSBpbnZvbHZlZC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGNvZGUgd2hpY2ggdG91Y2hlcyBzZXZlcmFsIGdsb2JhbCB2YXJpYWJsZXMgYXQgb25jZToKKy8vCisvLyBzdGF0aWMgaW50IGZvb1tOXSwgYmFyW05dLCBiYXpbTl07CisvLworLy8gZm9yIChpID0gMDsgaSA8IE47ICsraSkgeworLy8gICAgZm9vW2ldID0gYmFyW2ldICogYmF6W2ldOworLy8gfQorLy8KKy8vICBPbiBBUk0gdGhlIGFkZHJlc3NlcyBvZiAzIGFycmF5cyBzaG91bGQgYmUga2VwdCBpbiB0aGUgcmVnaXN0ZXJzLCB0aHVzCisvLyAgdGhpcyBjb2RlIGhhcyBxdWl0ZSBsYXJnZSByZWdpc3RlciBwcmVzc3VyZSAobG9vcCBib2R5KToKKy8vCisvLyAgbGRyICAgICByMSwgW3I1XSwgIzQKKy8vICBsZHIgICAgIHIyLCBbcjZdLCAjNAorLy8gIG11bCAgICAgcjEsIHIyLCByMQorLy8gIHN0ciAgICAgcjEsIFtyMF0sICM0CisvLworLy8gIFBhc3MgY29udmVydHMgdGhlIGNvZGUgdG8gc29tZXRoaW5nIGxpa2U6CisvLworLy8gIHN0YXRpYyBzdHJ1Y3QgeworLy8gICAgaW50IGZvb1tOXTsKKy8vICAgIGludCBiYXJbTl07CisvLyAgICBpbnQgYmF6W05dOworLy8gIH0gbWVyZ2VkOworLy8KKy8vICBmb3IgKGkgPSAwOyBpIDwgTjsgKytpKSB7CisvLyAgICBtZXJnZWQuZm9vW2ldID0gbWVyZ2VkLmJhcltpXSAqIG1lcmdlZC5iYXpbaV07CisvLyAgfQorLy8KKy8vICBhbmQgaW4gQVJNIGNvZGUgdGhpcyBiZWNvbWVzOgorLy8KKy8vICBsZHIgICAgIHIwLCBbcjUsICM0MF0KKy8vICBsZHIgICAgIHIxLCBbcjUsICM4MF0KKy8vICBtdWwgICAgIHIwLCByMSwgcjAKKy8vICBzdHIgICAgIHIwLCBbcjVdLCAjNAorLy8KKy8vICBub3RlIHRoYXQgd2Ugc2F2ZWQgMiByZWdpc3RlcnMgaGVyZSBhbG1vc3RseSAiZm9yIGZyZWUiLgorLy8gPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXJtLWdsb2JhbC1tZXJnZSIKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIEFSTUdsb2JhbE1lcmdlIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgICAgLy8vIFRMSSAtIEtlZXAgYSBwb2ludGVyIG9mIGEgVGFyZ2V0TG93ZXJpbmcgdG8gY29uc3VsdCBmb3IgZGV0ZXJtaW5pbmcKKyAgICAvLy8gdGFyZ2V0IHR5cGUgc2l6ZXMuCisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSTsKKworICAgIGJvb2wgZG9NZXJnZShTbWFsbFZlY3RvckltcGw8R2xvYmFsVmFyaWFibGUqPiAmR2xvYmFscywKKyAgICAgICAgICAgICAgICAgTW9kdWxlICZNLCBib29sKSBjb25zdDsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7ICAgICAgICAgICAgIC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQuCisgICAgZXhwbGljaXQgQVJNR2xvYmFsTWVyZ2UoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKnRsaSkKKyAgICAgIDogRnVuY3Rpb25QYXNzKElEKSwgVExJKHRsaSkge30KKworICAgIHZpcnR1YWwgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSk7CisgICAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24mIEYpOworCisgICAgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIk1lcmdlIGludGVybmFsIGdsb2JhbHMiOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIEZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgICAgc3RydWN0IEdsb2JhbENtcCB7CisgICAgICBjb25zdCBUYXJnZXREYXRhICpURDsKKworICAgICAgR2xvYmFsQ21wKGNvbnN0IFRhcmdldERhdGEgKnRkKToKKyAgICAgICAgVEQodGQpIHsgfQorCisgICAgICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IEdsb2JhbFZhcmlhYmxlKiBHVjEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhcmlhYmxlKiBHVjIpIHsKKyAgICAgICAgY29uc3QgVHlwZSogVHkxID0gY2FzdDxQb2ludGVyVHlwZT4oR1YxLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICBjb25zdCBUeXBlKiBUeTIgPSBjYXN0PFBvaW50ZXJUeXBlPihHVjItPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisKKyAgICAgICAgcmV0dXJuIChURC0+Z2V0VHlwZUFsbG9jU2l6ZShUeTEpIDwgVEQtPmdldFR5cGVBbGxvY1NpemUoVHkyKSk7CisgICAgICB9CisgICAgfTsKKyAgfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworY2hhciBBUk1HbG9iYWxNZXJnZTo6SUQgPSAwOworCitib29sIEFSTUdsb2JhbE1lcmdlOjpkb01lcmdlKFNtYWxsVmVjdG9ySW1wbDxHbG9iYWxWYXJpYWJsZSo+ICZHbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgJk0sIGJvb2wgaXNDb25zdCkgY29uc3QgeworICBjb25zdCBUYXJnZXREYXRhICpURCA9IFRMSS0+Z2V0VGFyZ2V0RGF0YSgpOworCisgIC8vIEZJWE1FOiBJbmZlciB0aGUgbWF4aW11bSBwb3NzaWJsZSBvZmZzZXQgZGVwZW5kaW5nIG9uIHRoZSBhY3R1YWwgdXNlcnMKKyAgLy8gKHRoZXNlIG1heCBvZmZzZXRzIGFyZSBkaWZmZXJlbnQgZm9yIHRoZSB1c2VycyBpbnNpZGUgVGh1bWIgb3IgQVJNCisgIC8vIGZ1bmN0aW9ucykKKyAgdW5zaWduZWQgTWF4T2Zmc2V0ID0gVExJLT5nZXRNYXhpbWFsR2xvYmFsT2Zmc2V0KCk7CisKKyAgLy8gRklYTUU6IEZpbmQgYmV0dGVyIGhldXJpc3RpY3MKKyAgc3RkOjpzdGFibGVfc29ydChHbG9iYWxzLmJlZ2luKCksIEdsb2JhbHMuZW5kKCksIEdsb2JhbENtcChURCkpOworCisgIGNvbnN0IFR5cGUgKkludDMyVHkgPSBUeXBlOjpnZXRJbnQzMlR5KE0uZ2V0Q29udGV4dCgpKTsKKworICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IEdsb2JhbHMuc2l6ZSgpOyBpICE9IGU7ICkgeworICAgIHNpemVfdCBqID0gMDsKKyAgICB1aW50NjRfdCBNZXJnZWRTaXplID0gMDsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gVHlzOworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gSW5pdHM7CisgICAgZm9yIChqID0gaTsgTWVyZ2VkU2l6ZSA8IE1heE9mZnNldCAmJiBqICE9IGU7ICsraikgeworICAgICAgY29uc3QgVHlwZSogVHkgPSBHbG9iYWxzW2pdLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICBUeXMucHVzaF9iYWNrKFR5KTsKKyAgICAgIEluaXRzLnB1c2hfYmFjayhHbG9iYWxzW2pdLT5nZXRJbml0aWFsaXplcigpKTsKKyAgICAgIE1lcmdlZFNpemUgKz0gVEQtPmdldFR5cGVBbGxvY1NpemUoVHkpOworICAgIH0KKworICAgIFN0cnVjdFR5cGUqIE1lcmdlZFR5ID0gU3RydWN0VHlwZTo6Z2V0KE0uZ2V0Q29udGV4dCgpLCBUeXMpOworICAgIENvbnN0YW50KiBNZXJnZWRJbml0ID0gQ29uc3RhbnRTdHJ1Y3Q6OmdldChNZXJnZWRUeSwgSW5pdHMpOworICAgIEdsb2JhbFZhcmlhYmxlKiBNZXJnZWRHViA9IG5ldyBHbG9iYWxWYXJpYWJsZShNLCBNZXJnZWRUeSwgaXNDb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVyZ2VkSW5pdCwgIm1lcmdlZCIpOworICAgIGZvciAoc2l6ZV90IGsgPSBpOyBrIDwgajsgKytrKSB7CisgICAgICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDI+IElkeDsKKyAgICAgIElkeC5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCAwKSk7CisgICAgICBJZHgucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgay1pKSk7CisKKyAgICAgIENvbnN0YW50KiBHRVAgPQorICAgICAgICBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihNZXJnZWRHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklkeFswXSwgSWR4LnNpemUoKSk7CisKKyAgICAgIEdsb2JhbHNba10tPnJlcGxhY2VBbGxVc2VzV2l0aChHRVApOworICAgICAgR2xvYmFsc1trXS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgfQorICAgIGkgPSBqOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBBUk1HbG9iYWxNZXJnZTo6ZG9Jbml0aWFsaXphdGlvbihNb2R1bGUmIE0pIHsKKyAgU21hbGxWZWN0b3I8R2xvYmFsVmFyaWFibGUqLCAxNj4gR2xvYmFscywgQ29uc3RHbG9iYWxzOworICBjb25zdCBUYXJnZXREYXRhICpURCA9IFRMSS0+Z2V0VGFyZ2V0RGF0YSgpOworICB1bnNpZ25lZCBNYXhPZmZzZXQgPSBUTEktPmdldE1heGltYWxHbG9iYWxPZmZzZXQoKTsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gR3JhYiBhbGwgbm9uLWNvbnN0IGdsb2JhbHMuCisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksCisgICAgICAgICBFID0gTS5nbG9iYWxfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgLy8gTWVyZ2UgaXMgc2FmZSBmb3IgIm5vcm1hbCIgaW50ZXJuYWwgZ2xvYmFscyBvbmx5CisgICAgaWYgKCFJLT5oYXNMb2NhbExpbmthZ2UoKSB8fCBJLT5pc1RocmVhZExvY2FsKCkgfHwgSS0+aGFzU2VjdGlvbigpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBJZ25vcmUgZmFuY3ktYWxpZ25lZCBnbG9iYWxzIGZvciBub3cuCisgICAgaWYgKEktPmdldEFsaWdubWVudCgpICE9IDApCisgICAgICBjb250aW51ZTsKKworICAgIC8vIElnbm9yZSBhbGwgJ3NwZWNpYWwnIGdsb2JhbHMuCisgICAgaWYgKEktPmdldE5hbWUoKS5zdGFydHN3aXRoKCJsbHZtLiIpIHx8CisgICAgICAgIEktPmdldE5hbWUoKS5zdGFydHN3aXRoKCIubGx2bS4iKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKFRELT5nZXRUeXBlQWxsb2NTaXplKEktPmdldFR5cGUoKSkgPCBNYXhPZmZzZXQpIHsKKyAgICAgIGlmIChJLT5pc0NvbnN0YW50KCkpCisgICAgICAgIENvbnN0R2xvYmFscy5wdXNoX2JhY2soSSk7CisgICAgICBlbHNlCisgICAgICAgIEdsb2JhbHMucHVzaF9iYWNrKEkpOworICAgIH0KKyAgfQorCisgIGlmIChHbG9iYWxzLnNpemUoKSA+IDEpCisgICAgQ2hhbmdlZCB8PSBkb01lcmdlKEdsb2JhbHMsIE0sIGZhbHNlKTsKKyAgLy8gRklYTUU6IFRoaXMgY3VycmVudGx5IGJyZWFrcyB0aGUgRUggcHJvY2Vzc2luZyBkdWUgdG8gd2F5IGhvdyB0aGUgCisgIC8vIHR5cGVpbmZvIGRldGVjdGlvbiB3b3Jrcy4gV2UgbWlnaHQgd2FudCB0byBkZXRlY3QgdGhlIFRJcyBhbmQgaWdub3JlIAorICAvLyB0aGVtIGluIHRoZSBmdXR1cmUuCisgIAorICAvLyBpZiAoQ29uc3RHbG9iYWxzLnNpemUoKSA+IDEpCisgIC8vICBDaGFuZ2VkIHw9IGRvTWVyZ2UoQ29uc3RHbG9iYWxzLCBNLCB0cnVlKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworYm9vbCBBUk1HbG9iYWxNZXJnZTo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiYgRikgeworICByZXR1cm4gZmFsc2U7Cit9CisKK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlQVJNR2xvYmFsTWVyZ2VQYXNzKGNvbnN0IFRhcmdldExvd2VyaW5nICp0bGkpIHsKKyAgcmV0dXJuIG5ldyBBUk1HbG9iYWxNZXJnZSh0bGkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSVNlbERBR1RvREFHLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUlTZWxEQUdUb0RBRy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwMTJjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUlTZWxEQUdUb0RBRy5jcHAKQEAgLTAsMCArMSwyMzg3IEBACisvLz09PS0tIEFSTUlTZWxEQUdUb0RBRy5jcHAgLSBBIGRhZyB0byBkYWcgaW5zdCBzZWxlY3RvciBmb3IgQVJNIC0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGluc3RydWN0aW9uIHNlbGVjdG9yIGZvciB0aGUgQVJNIHRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFybS1pc2VsIgorI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTUFkZHJlc3NpbmdNb2Rlcy5oIgorI2luY2x1ZGUgIkFSTVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0Rpc2FibGVTaGlmdGVyT3AoImRpc2FibGUtc2hpZnRlci1vcCIsIGNsOjpIaWRkZW4sCisgIGNsOjpkZXNjKCJEaXNhYmxlIGlzZWwgb2Ygc2hpZnRlci1vcCIpLAorICBjbDo6aW5pdChmYWxzZSkpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBUk1EQUdUb0RBR0lTZWwgLSBBUk0gc3BlY2lmaWMgY29kZSB0byBzZWxlY3QgQVJNIG1hY2hpbmUKKy8vLyBpbnN0cnVjdGlvbnMgZm9yIFNlbGVjdGlvbkRBRyBvcGVyYXRpb25zLgorLy8vCituYW1lc3BhY2UgeworY2xhc3MgQVJNREFHVG9EQUdJU2VsIDogcHVibGljIFNlbGVjdGlvbkRBR0lTZWwgeworICBBUk1CYXNlVGFyZ2V0TWFjaGluZSAmVE07CisKKyAgLy8vIFN1YnRhcmdldCAtIEtlZXAgYSBwb2ludGVyIHRvIHRoZSBBUk1TdWJ0YXJnZXQgYXJvdW5kIHNvIHRoYXQgd2UgY2FuCisgIC8vLyBtYWtlIHRoZSByaWdodCBkZWNpc2lvbiB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgZGlmZmVyZW50IHRhcmdldHMuCisgIGNvbnN0IEFSTVN1YnRhcmdldCAqU3VidGFyZ2V0OworCitwdWJsaWM6CisgIGV4cGxpY2l0IEFSTURBR1RvREFHSVNlbChBUk1CYXNlVGFyZ2V0TWFjaGluZSAmdG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkKKyAgICA6IFNlbGVjdGlvbkRBR0lTZWwodG0sIE9wdExldmVsKSwgVE0odG0pLAorICAgIFN1YnRhcmdldCgmVE0uZ2V0U3VidGFyZ2V0PEFSTVN1YnRhcmdldD4oKSkgeworICB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIkFSTSBJbnN0cnVjdGlvbiBTZWxlY3Rpb24iOworICB9CisKKyAgLy8vIGdldEkzMkltbSAtIFJldHVybiBhIHRhcmdldCBjb25zdGFudCBvZiB0eXBlIGkzMiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHZhbHVlLgorICBpbmxpbmUgU0RWYWx1ZSBnZXRJMzJJbW0odW5zaWduZWQgSW1tKSB7CisgICAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoSW1tLCBNVlQ6OmkzMik7CisgIH0KKworICBTRE5vZGUgKlNlbGVjdChTRE5vZGUgKk4pOworCisgIGJvb2wgU2VsZWN0U2hpZnRlck9wZXJhbmRSZWcoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkIsIFNEVmFsdWUgJkMpOworICBib29sIFNlbGVjdEFkZHJNb2RlMihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCwgU0RWYWx1ZSAmT3BjKTsKKyAgYm9vbCBTZWxlY3RBZGRyTW9kZTJPZmZzZXQoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZzZXQsIFNEVmFsdWUgJk9wYyk7CisgIGJvb2wgU2VsZWN0QWRkck1vZGUzKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2Zmc2V0LCBTRFZhbHVlICZPcGMpOworICBib29sIFNlbGVjdEFkZHJNb2RlM09mZnNldChTRE5vZGUgKk9wLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCwgU0RWYWx1ZSAmT3BjKTsKKyAgYm9vbCBTZWxlY3RBZGRyTW9kZTQoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZNb2RlKTsKKyAgYm9vbCBTZWxlY3RBZGRyTW9kZTUoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZzZXQpOworICBib29sIFNlbGVjdEFkZHJNb2RlNihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkFkZHIsIFNEVmFsdWUgJkFsaWduKTsKKworICBib29sIFNlbGVjdEFkZHJNb2RlUEMoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMYWJlbCk7CisKKyAgYm9vbCBTZWxlY3RUaHVtYkFkZHJNb2RlUlIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZzZXQpOworICBib29sIFNlbGVjdFRodW1iQWRkck1vZGVSSTUoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCB1bnNpZ25lZCBTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJk9mZkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCk7CisgIGJvb2wgU2VsZWN0VGh1bWJBZGRyTW9kZVMxKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2ZmSW1tLCBTRFZhbHVlICZPZmZzZXQpOworICBib29sIFNlbGVjdFRodW1iQWRkck1vZGVTMihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZkltbSwgU0RWYWx1ZSAmT2Zmc2V0KTsKKyAgYm9vbCBTZWxlY3RUaHVtYkFkZHJNb2RlUzQoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZJbW0sIFNEVmFsdWUgJk9mZnNldCk7CisgIGJvb2wgU2VsZWN0VGh1bWJBZGRyTW9kZVNQKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2ZmSW1tKTsKKworICBib29sIFNlbGVjdFQyU2hpZnRlck9wZXJhbmRSZWcoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZVJlZywgU0RWYWx1ZSAmT3BjKTsKKyAgYm9vbCBTZWxlY3RUMkFkZHJNb2RlSW1tMTIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZJbW0pOworICBib29sIFNlbGVjdFQyQWRkck1vZGVJbW04KFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZJbW0pOworICBib29sIFNlbGVjdFQyQWRkck1vZGVJbW04T2Zmc2V0KFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZkltbSk7CisgIGJvb2wgU2VsZWN0VDJBZGRyTW9kZUltbThzNChTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZJbW0pOworICBib29sIFNlbGVjdFQyQWRkck1vZGVTb1JlZyhTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZlJlZywgU0RWYWx1ZSAmU2hJbW0pOworCisgIC8vIEluY2x1ZGUgdGhlIHBpZWNlcyBhdXRvZ2VuZXJhdGVkIGZyb20gdGhlIHRhcmdldCBkZXNjcmlwdGlvbi4KKyNpbmNsdWRlICJBUk1HZW5EQUdJU2VsLmluYyIKKworcHJpdmF0ZToKKyAgLy8vIFNlbGVjdEFSTUluZGV4ZWRMb2FkIC0gSW5kZXhlZCAocHJlL3Bvc3QgaW5jL2RlYykgbG9hZCBtYXRjaGluZyBjb2RlIGZvcgorICAvLy8gQVJNLgorICBTRE5vZGUgKlNlbGVjdEFSTUluZGV4ZWRMb2FkKFNETm9kZSAqTik7CisgIFNETm9kZSAqU2VsZWN0VDJJbmRleGVkTG9hZChTRE5vZGUgKk4pOworCisgIC8vLyBTZWxlY3RWTEQgLSBTZWxlY3QgTkVPTiBsb2FkIGludHJpbnNpY3MuICBOdW1WZWNzIHNob3VsZCBiZQorICAvLy8gMSwgMiwgMyBvciA0LiAgVGhlIG9wY29kZSBhcnJheXMgc3BlY2lmeSB0aGUgaW5zdHJ1Y3Rpb25zIHVzZWQgZm9yCisgIC8vLyBsb2FkcyBvZiBEIHJlZ2lzdGVycyBhbmQgZXZlbiBzdWJyZWdzIGFuZCBvZGQgc3VicmVncyBvZiBRIHJlZ2lzdGVycy4KKyAgLy8vIEZvciBOdW1WZWNzIDw9IDIsIFFPcGNvZGVzMSBpcyBub3QgdXNlZC4KKyAgU0ROb2RlICpTZWxlY3RWTEQoU0ROb2RlICpOLCB1bnNpZ25lZCBOdW1WZWNzLCB1bnNpZ25lZCAqRE9wY29kZXMsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpRT3Bjb2RlczAsIHVuc2lnbmVkICpRT3Bjb2RlczEpOworCisgIC8vLyBTZWxlY3RWU1QgLSBTZWxlY3QgTkVPTiBzdG9yZSBpbnRyaW5zaWNzLiAgTnVtVmVjcyBzaG91bGQKKyAgLy8vIGJlIDEsIDIsIDMgb3IgNC4gIFRoZSBvcGNvZGUgYXJyYXlzIHNwZWNpZnkgdGhlIGluc3RydWN0aW9ucyB1c2VkIGZvcgorICAvLy8gc3RvcmVzIG9mIEQgcmVnaXN0ZXJzIGFuZCBldmVuIHN1YnJlZ3MgYW5kIG9kZCBzdWJyZWdzIG9mIFEgcmVnaXN0ZXJzLgorICAvLy8gRm9yIE51bVZlY3MgPD0gMiwgUU9wY29kZXMxIGlzIG5vdCB1c2VkLgorICBTRE5vZGUgKlNlbGVjdFZTVChTRE5vZGUgKk4sIHVuc2lnbmVkIE51bVZlY3MsIHVuc2lnbmVkICpET3Bjb2RlcywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKlFPcGNvZGVzMCwgdW5zaWduZWQgKlFPcGNvZGVzMSk7CisKKyAgLy8vIFNlbGVjdFZMRFNUTGFuZSAtIFNlbGVjdCBORU9OIGxvYWQvc3RvcmUgbGFuZSBpbnRyaW5zaWNzLiAgTnVtVmVjcyBzaG91bGQKKyAgLy8vIGJlIDIsIDMgb3IgNC4gIFRoZSBvcGNvZGUgYXJyYXlzIHNwZWNpZnkgdGhlIGluc3RydWN0aW9ucyB1c2VkIGZvcgorICAvLy8gbG9hZC9zdG9yZSBvZiBEIHJlZ2lzdGVycyBhbmQgZXZlbiBzdWJyZWdzIGFuZCBvZGQgc3VicmVncyBvZiBRIHJlZ2lzdGVycy4KKyAgU0ROb2RlICpTZWxlY3RWTERTVExhbmUoU0ROb2RlICpOLCBib29sIElzTG9hZCwgdW5zaWduZWQgTnVtVmVjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKkRPcGNvZGVzLCB1bnNpZ25lZCAqUU9wY29kZXMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqUU9wY29kZXMxKTsKKworICAvLy8gU2VsZWN0VlRCTCAtIFNlbGVjdCBORU9OIFZUQkwgYW5kIFZUQlggaW50cmluc2ljcy4gIE51bVZlY3Mgc2hvdWxkIGJlIDIsCisgIC8vLyAzIG9yIDQuICBUaGVzZSBhcmUgY3VzdG9tLXNlbGVjdGVkIHNvIHRoYXQgYSBSRUdfU0VRVUVOQ0UgY2FuIGJlCisgIC8vLyBnZW5lcmF0ZWQgdG8gZm9yY2UgdGhlIHRhYmxlIHJlZ2lzdGVycyB0byBiZSBjb25zZWN1dGl2ZS4KKyAgU0ROb2RlICpTZWxlY3RWVEJMKFNETm9kZSAqTiwgYm9vbCBJc0V4dCwgdW5zaWduZWQgTnVtVmVjcywgdW5zaWduZWQgT3BjKTsKKworICAvLy8gU2VsZWN0VjZUMkJpdGZpZWxkRXh0cmFjdE9wIC0gU2VsZWN0IFNCRlgvVUJGWCBpbnN0cnVjdGlvbnMgZm9yIEFSTS4KKyAgU0ROb2RlICpTZWxlY3RWNlQyQml0ZmllbGRFeHRyYWN0T3AoU0ROb2RlICpOLCBib29sIGlzU2lnbmVkKTsKKworICAvLy8gU2VsZWN0Q01PVk9wIC0gU2VsZWN0IENNT1YgaW5zdHJ1Y3Rpb25zIGZvciBBUk0uCisgIFNETm9kZSAqU2VsZWN0Q01PVk9wKFNETm9kZSAqTik7CisgIFNETm9kZSAqU2VsZWN0VDJDTU9WU2hpZnRPcChTRE5vZGUgKk4sIFNEVmFsdWUgRmFsc2VWYWwsIFNEVmFsdWUgVHJ1ZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgQ0NWYWwsIFNEVmFsdWUgQ0NSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBJbkZsYWcpOworICBTRE5vZGUgKlNlbGVjdEFSTUNNT1ZTaGlmdE9wKFNETm9kZSAqTiwgU0RWYWx1ZSBGYWxzZVZhbCwgU0RWYWx1ZSBUcnVlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgQ0NWYWwsIFNEVmFsdWUgQ0NSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgSW5GbGFnKTsKKyAgU0ROb2RlICpTZWxlY3RUMkNNT1ZTb0ltbU9wKFNETm9kZSAqTiwgU0RWYWx1ZSBGYWxzZVZhbCwgU0RWYWx1ZSBUcnVlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBDQ1ZhbCwgU0RWYWx1ZSBDQ1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEluRmxhZyk7CisgIFNETm9kZSAqU2VsZWN0QVJNQ01PVlNvSW1tT3AoU0ROb2RlICpOLCBTRFZhbHVlIEZhbHNlVmFsLCBTRFZhbHVlIFRydWVWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBDQ1ZhbCwgU0RWYWx1ZSBDQ1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBJbkZsYWcpOworCisgIFNETm9kZSAqU2VsZWN0Q29uY2F0VmVjdG9yKFNETm9kZSAqTik7CisKKyAgLy8vIFNlbGVjdElubGluZUFzbU1lbW9yeU9wZXJhbmQgLSBJbXBsZW1lbnQgYWRkcmVzc2luZyBtb2RlIHNlbGVjdGlvbiBmb3IKKyAgLy8vIGlubGluZSBhc20gZXhwcmVzc2lvbnMuCisgIHZpcnR1YWwgYm9vbCBTZWxlY3RJbmxpbmVBc21NZW1vcnlPcGVyYW5kKGNvbnN0IFNEVmFsdWUgJk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbnN0cmFpbnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3V0T3BzKTsKKworICAvLyBGb3JtIHBhaXJzIG9mIGNvbnNlY3V0aXZlIFMsIEQsIG9yIFEgcmVnaXN0ZXJzLgorICBTRE5vZGUgKlBhaXJTUmVncyhFVlQgVlQsIFNEVmFsdWUgVjAsIFNEVmFsdWUgVjEpOworICBTRE5vZGUgKlBhaXJEUmVncyhFVlQgVlQsIFNEVmFsdWUgVjAsIFNEVmFsdWUgVjEpOworICBTRE5vZGUgKlBhaXJRUmVncyhFVlQgVlQsIFNEVmFsdWUgVjAsIFNEVmFsdWUgVjEpOworCisgIC8vIEZvcm0gc2VxdWVuY2VzIG9mIDQgY29uc2VjdXRpdmUgUywgRCwgb3IgUSByZWdpc3RlcnMuCisgIFNETm9kZSAqUXVhZFNSZWdzKEVWVCBWVCwgU0RWYWx1ZSBWMCwgU0RWYWx1ZSBWMSwgU0RWYWx1ZSBWMiwgU0RWYWx1ZSBWMyk7CisgIFNETm9kZSAqUXVhZERSZWdzKEVWVCBWVCwgU0RWYWx1ZSBWMCwgU0RWYWx1ZSBWMSwgU0RWYWx1ZSBWMiwgU0RWYWx1ZSBWMyk7CisgIFNETm9kZSAqUXVhZFFSZWdzKEVWVCBWVCwgU0RWYWx1ZSBWMCwgU0RWYWx1ZSBWMSwgU0RWYWx1ZSBWMiwgU0RWYWx1ZSBWMyk7CisKKyAgLy8gRm9ybSBzZXF1ZW5jZXMgb2YgOCBjb25zZWN1dGl2ZSBEIHJlZ2lzdGVycy4KKyAgU0ROb2RlICpPY3RvRFJlZ3MoRVZUIFZULCBTRFZhbHVlIFYwLCBTRFZhbHVlIFYxLCBTRFZhbHVlIFYyLCBTRFZhbHVlIFYzLAorICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFY0LCBTRFZhbHVlIFY1LCBTRFZhbHVlIFY2LCBTRFZhbHVlIFY3KTsKK307Cit9CisKKy8vLyBpc0ludDMySW1tZWRpYXRlIC0gVGhpcyBtZXRob2QgdGVzdHMgdG8gc2VlIGlmIHRoZSBub2RlIGlzIGEgMzItYml0IGNvbnN0YW50CisvLy8gb3BlcmFuZC4gSWYgc28gSW1tIHdpbGwgcmVjZWl2ZSB0aGUgMzItYml0IHZhbHVlLgorc3RhdGljIGJvb2wgaXNJbnQzMkltbWVkaWF0ZShTRE5vZGUgKk4sIHVuc2lnbmVkICZJbW0pIHsKKyAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQgJiYgTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTMyKSB7CisgICAgSW1tID0gY2FzdDxDb25zdGFudFNETm9kZT4oTiktPmdldFpFeHRWYWx1ZSgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gaXNJbnQzMkltbWVkaWF0ZSAtIFRoaXMgbWV0aG9kIHRlc3RzIHRvIHNlZSBpZiBhIGNvbnN0YW50IG9wZXJhbmQuCisvLyBJZiBzbyBJbW0gd2lsbCByZWNlaXZlIHRoZSAzMiBiaXQgdmFsdWUuCitzdGF0aWMgYm9vbCBpc0ludDMySW1tZWRpYXRlKFNEVmFsdWUgTiwgdW5zaWduZWQgJkltbSkgeworICByZXR1cm4gaXNJbnQzMkltbWVkaWF0ZShOLmdldE5vZGUoKSwgSW1tKTsKK30KKworLy8gaXNPcGNXaXRoSW50SW1tZWRpYXRlIC0gVGhpcyBtZXRob2QgdGVzdHMgdG8gc2VlIGlmIHRoZSBub2RlIGlzIGEgc3BlY2lmaWMKKy8vIG9wY29kZSBhbmQgdGhhdCBpdCBoYXMgYSBpbW1lZGlhdGUgaW50ZWdlciByaWdodCBvcGVyYW5kLgorLy8gSWYgc28gSW1tIHdpbGwgcmVjZWl2ZSB0aGUgMzIgYml0IHZhbHVlLgorc3RhdGljIGJvb2wgaXNPcGNXaXRoSW50SW1tZWRpYXRlKFNETm9kZSAqTiwgdW5zaWduZWQgT3BjLCB1bnNpZ25lZCYgSW1tKSB7CisgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBPcGMgJiYKKyAgICAgICAgIGlzSW50MzJJbW1lZGlhdGUoTi0+Z2V0T3BlcmFuZCgxKS5nZXROb2RlKCksIEltbSk7Cit9CisKKworYm9vbCBBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdFNoaWZ0ZXJPcGVyYW5kUmVnKFNETm9kZSAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmU2hSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT3BjKSB7CisgIGlmIChEaXNhYmxlU2hpZnRlck9wKQorICAgIHJldHVybiBmYWxzZTsKKworICBBUk1fQU06OlNoaWZ0T3BjIFNoT3BjVmFsID0gQVJNX0FNOjpnZXRTaGlmdE9wY0Zvck5vZGUoTik7CisKKyAgLy8gRG9uJ3QgbWF0Y2ggYmFzZSByZWdpc3RlciBvbmx5IGNhc2UuIFRoYXQgaXMgbWF0Y2hlZCB0byBhIHNlcGFyYXRlCisgIC8vIGxvd2VyIGNvbXBsZXhpdHkgcGF0dGVybiB3aXRoIGV4cGxpY2l0IHJlZ2lzdGVyIG9wZXJhbmQuCisgIGlmIChTaE9wY1ZhbCA9PSBBUk1fQU06Om5vX3NoaWZ0KSByZXR1cm4gZmFsc2U7CisKKyAgQmFzZVJlZyA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgdW5zaWduZWQgU2hJbW1WYWwgPSAwOworICBpZiAoQ29uc3RhbnRTRE5vZGUgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpKSB7CisgICAgU2hSZWcgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKTsKKyAgICBTaEltbVZhbCA9IFJIUy0+Z2V0WkV4dFZhbHVlKCkgJiAzMTsKKyAgfSBlbHNlIHsKKyAgICBTaFJlZyA9IE4uZ2V0T3BlcmFuZCgxKTsKKyAgfQorICBPcGMgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTV9BTTo6Z2V0U09SZWdPcGMoU2hPcGNWYWwsIFNoSW1tVmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0QWRkck1vZGUyKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPcGMpIHsKKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpNVUwpIHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAvLyBYICogWzMsNSw5XSAtPiBYICsgWCAqIFsyLDQsOF0gZXRjLgorICAgICAgaW50IFJIU0MgPSAoaW50KVJIUy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBpZiAoUkhTQyAmIDEpIHsKKyAgICAgICAgUkhTQyA9IFJIU0MgJiB+MTsKKyAgICAgICAgQVJNX0FNOjpBZGRyT3BjIEFkZFN1YiA9IEFSTV9BTTo6YWRkOworICAgICAgICBpZiAoUkhTQyA8IDApIHsKKyAgICAgICAgICBBZGRTdWIgPSBBUk1fQU06OnN1YjsKKyAgICAgICAgICBSSFNDID0gLSBSSFNDOworICAgICAgICB9CisgICAgICAgIGlmIChpc1Bvd2VyT2YyXzMyKFJIU0MpKSB7CisgICAgICAgICAgdW5zaWduZWQgU2hBbXQgPSBMb2cyXzMyKFJIU0MpOworICAgICAgICAgIEJhc2UgPSBPZmZzZXQgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgT3BjID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk1fQU06OmdldEFNMk9wYyhBZGRTdWIsIFNoQW10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNX0FNOjpsc2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgIT0gSVNEOjpBREQgJiYgTi5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNVQikgeworICAgIEJhc2UgPSBOOworICAgIGlmIChOLmdldE9wY29kZSgpID09IElTRDo6RnJhbWVJbmRleCkgeworICAgICAgaW50IEZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOKS0+Z2V0SW5kZXgoKTsKKyAgICAgIEJhc2UgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRkksIFRMSS5nZXRQb2ludGVyVHkoKSk7CisgICAgfSBlbHNlIGlmIChOLmdldE9wY29kZSgpID09IEFSTUlTRDo6V3JhcHBlciAmJgorICAgICAgICAgICAgICAgIShTdWJ0YXJnZXQtPnVzZU1vdnQoKSAmJgorICAgICAgICAgICAgICAgICBOLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzKSkgeworICAgICAgQmFzZSA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgICB9CisgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgICAgT3BjID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk1fQU06OmdldEFNMk9wYyhBUk1fQU06OmFkZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTV9BTTo6bm9fc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gTWF0Y2ggc2ltcGxlIFIgKy8tIGltbTEyIG9wZXJhbmRzLgorICBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBpbnQgUkhTQyA9IChpbnQpUkhTLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIGlmICgoUkhTQyA+PSAwICYmIFJIU0MgPCAweDEwMDApIHx8CisgICAgICAgICAgKFJIU0MgPCAwICYmIFJIU0MgPiAtMHgxMDAwKSkgeyAvLyAxMiBiaXRzLgorICAgICAgICBCYXNlID0gTi5nZXRPcGVyYW5kKDApOworICAgICAgICBpZiAoQmFzZS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZyYW1lSW5kZXgpIHsKKyAgICAgICAgICBpbnQgRkkgPSBjYXN0PEZyYW1lSW5kZXhTRE5vZGU+KEJhc2UpLT5nZXRJbmRleCgpOworICAgICAgICAgIEJhc2UgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRkksIFRMSS5nZXRQb2ludGVyVHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisKKyAgICAgICAgQVJNX0FNOjpBZGRyT3BjIEFkZFN1YiA9IEFSTV9BTTo6YWRkOworICAgICAgICBpZiAoUkhTQyA8IDApIHsKKyAgICAgICAgICBBZGRTdWIgPSBBUk1fQU06OnN1YjsKKyAgICAgICAgICBSSFNDID0gLSBSSFNDOworICAgICAgICB9CisgICAgICAgIE9wYyA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNX0FNOjpnZXRBTTJPcGMoQWRkU3ViLCBSSFNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTV9BTTo6bm9fc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTMyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgIC8vIE90aGVyd2lzZSB0aGlzIGlzIFIgKy8tIFtwb3NzaWJseSBzaGlmdGVkXSBSLgorICBBUk1fQU06OkFkZHJPcGMgQWRkU3ViID0gTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCA/IEFSTV9BTTo6YWRkOkFSTV9BTTo6c3ViOworICBBUk1fQU06OlNoaWZ0T3BjIFNoT3BjVmFsID0gQVJNX0FNOjpnZXRTaGlmdE9wY0Zvck5vZGUoTi5nZXRPcGVyYW5kKDEpKTsKKyAgdW5zaWduZWQgU2hBbXQgPSAwOworCisgIEJhc2UgICA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgT2Zmc2V0ID0gTi5nZXRPcGVyYW5kKDEpOworCisgIGlmIChTaE9wY1ZhbCAhPSBBUk1fQU06Om5vX3NoaWZ0KSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBSSFMgb2YgdGhlIHNoaWZ0IGlzIGEgY29uc3RhbnQsIGlmIG5vdCwgd2UgY2FuJ3QgZm9sZAorICAgIC8vIGl0LgorICAgIGlmIChDb25zdGFudFNETm9kZSAqU2ggPQorICAgICAgICAgICBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBTaEFtdCA9IFNoLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIE9mZnNldCA9IE4uZ2V0T3BlcmFuZCgxKS5nZXRPcGVyYW5kKDApOworICAgIH0gZWxzZSB7CisgICAgICBTaE9wY1ZhbCA9IEFSTV9BTTo6bm9fc2hpZnQ7CisgICAgfQorICB9CisKKyAgLy8gVHJ5IG1hdGNoaW5nIChSIHNobCBDKSArIChSKS4KKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQgJiYgU2hPcGNWYWwgPT0gQVJNX0FNOjpub19zaGlmdCkgeworICAgIFNoT3BjVmFsID0gQVJNX0FNOjpnZXRTaGlmdE9wY0Zvck5vZGUoTi5nZXRPcGVyYW5kKDApKTsKKyAgICBpZiAoU2hPcGNWYWwgIT0gQVJNX0FNOjpub19zaGlmdCkgeworICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBSSFMgb2YgdGhlIHNoaWZ0IGlzIGEgY29uc3RhbnQsIGlmIG5vdCwgd2UgY2FuJ3QKKyAgICAgIC8vIGZvbGQgaXQuCisgICAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlNoID0KKyAgICAgICAgICBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgIFNoQW10ID0gU2gtPmdldFpFeHRWYWx1ZSgpOworICAgICAgICBPZmZzZXQgPSBOLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKTsKKyAgICAgICAgQmFzZSA9IE4uZ2V0T3BlcmFuZCgxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNoT3BjVmFsID0gQVJNX0FNOjpub19zaGlmdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBPcGMgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTV9BTTo6Z2V0QU0yT3BjKEFkZFN1YiwgU2hBbXQsIFNoT3BjVmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0QWRkck1vZGUyT2Zmc2V0KFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2Zmc2V0LCBTRFZhbHVlICZPcGMpIHsKKyAgdW5zaWduZWQgT3Bjb2RlID0gT3AtPmdldE9wY29kZSgpOworICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gKE9wY29kZSA9PSBJU0Q6OkxPQUQpCisgICAgPyBjYXN0PExvYWRTRE5vZGU+KE9wKS0+Z2V0QWRkcmVzc2luZ01vZGUoKQorICAgIDogY2FzdDxTdG9yZVNETm9kZT4oT3ApLT5nZXRBZGRyZXNzaW5nTW9kZSgpOworICBBUk1fQU06OkFkZHJPcGMgQWRkU3ViID0gKEFNID09IElTRDo6UFJFX0lOQyB8fCBBTSA9PSBJU0Q6OlBPU1RfSU5DKQorICAgID8gQVJNX0FNOjphZGQgOiBBUk1fQU06OnN1YjsKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4pKSB7CisgICAgaW50IFZhbCA9IChpbnQpQy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKFZhbCA+PSAwICYmIFZhbCA8IDB4MTAwMCkgeyAvLyAxMiBiaXRzLgorICAgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgICAgICBPcGMgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTV9BTTo6Z2V0QU0yT3BjKEFkZFN1YiwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1fQU06Om5vX3NoaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgT2Zmc2V0ID0gTjsKKyAgQVJNX0FNOjpTaGlmdE9wYyBTaE9wY1ZhbCA9IEFSTV9BTTo6Z2V0U2hpZnRPcGNGb3JOb2RlKE4pOworICB1bnNpZ25lZCBTaEFtdCA9IDA7CisgIGlmIChTaE9wY1ZhbCAhPSBBUk1fQU06Om5vX3NoaWZ0KSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBSSFMgb2YgdGhlIHNoaWZ0IGlzIGEgY29uc3RhbnQsIGlmIG5vdCwgd2UgY2FuJ3QgZm9sZAorICAgIC8vIGl0LgorICAgIGlmIChDb25zdGFudFNETm9kZSAqU2ggPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgU2hBbXQgPSBTaC0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBPZmZzZXQgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNoT3BjVmFsID0gQVJNX0FNOjpub19zaGlmdDsKKyAgICB9CisgIH0KKworICBPcGMgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTV9BTTo6Z2V0QU0yT3BjKEFkZFN1YiwgU2hBbXQsIFNoT3BjVmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7CisgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQVJNREFHVG9EQUdJU2VsOjpTZWxlY3RBZGRyTW9kZTMoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9wYykgeworICBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQikgeworICAgIC8vIFggLSBDICBpcyBjYW5vbmljYWxpemUgdG8gWCArIC1DLCBubyBuZWVkIHRvIGhhbmRsZSBpdCBoZXJlLgorICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgT2Zmc2V0ID0gTi5nZXRPcGVyYW5kKDEpOworICAgIE9wYyA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNX0FNOjpnZXRBTTNPcGMoQVJNX0FNOjpzdWIsIDApLE1WVDo6aTMyKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChOLmdldE9wY29kZSgpICE9IElTRDo6QUREKSB7CisgICAgQmFzZSA9IE47CisgICAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGcmFtZUluZGV4KSB7CisgICAgICBpbnQgRkkgPSBjYXN0PEZyYW1lSW5kZXhTRE5vZGU+KE4pLT5nZXRJbmRleCgpOworICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSSwgVExJLmdldFBvaW50ZXJUeSgpKTsKKyAgICB9CisgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgICAgT3BjID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk1fQU06OmdldEFNM09wYyhBUk1fQU06OmFkZCwgMCksTVZUOjppMzIpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gSWYgdGhlIFJIUyBpcyArLy0gaW1tOCwgZm9sZCBpbnRvIGFkZHIgbW9kZS4KKyAgaWYgKENvbnN0YW50U0ROb2RlICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKSkgeworICAgIGludCBSSFNDID0gKGludClSSFMtPmdldFpFeHRWYWx1ZSgpOworICAgIGlmICgoUkhTQyA+PSAwICYmIFJIU0MgPCAyNTYpIHx8CisgICAgICAgIChSSFNDIDwgMCAmJiBSSFNDID4gLTI1NikpIHsgLy8gbm90ZSAtMjU2IGl0c2VsZiBpc24ndCBhbGxvd2VkLgorICAgICAgQmFzZSA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgICAgIGlmIChCYXNlLmdldE9wY29kZSgpID09IElTRDo6RnJhbWVJbmRleCkgeworICAgICAgICBpbnQgRkkgPSBjYXN0PEZyYW1lSW5kZXhTRE5vZGU+KEJhc2UpLT5nZXRJbmRleCgpOworICAgICAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRGcmFtZUluZGV4KEZJLCBUTEkuZ2V0UG9pbnRlclR5KCkpOworICAgICAgfQorICAgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisKKyAgICAgIEFSTV9BTTo6QWRkck9wYyBBZGRTdWIgPSBBUk1fQU06OmFkZDsKKyAgICAgIGlmIChSSFNDIDwgMCkgeworICAgICAgICBBZGRTdWIgPSBBUk1fQU06OnN1YjsKKyAgICAgICAgUkhTQyA9IC0gUkhTQzsKKyAgICAgIH0KKyAgICAgIE9wYyA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNX0FNOjpnZXRBTTNPcGMoQWRkU3ViLCBSSFNDKSxNVlQ6OmkzMik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBCYXNlID0gTi5nZXRPcGVyYW5kKDApOworICBPZmZzZXQgPSBOLmdldE9wZXJhbmQoMSk7CisgIE9wYyA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNX0FNOjpnZXRBTTNPcGMoQVJNX0FNOjphZGQsIDApLCBNVlQ6OmkzMik7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0QWRkck1vZGUzT2Zmc2V0KFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2Zmc2V0LCBTRFZhbHVlICZPcGMpIHsKKyAgdW5zaWduZWQgT3Bjb2RlID0gT3AtPmdldE9wY29kZSgpOworICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gKE9wY29kZSA9PSBJU0Q6OkxPQUQpCisgICAgPyBjYXN0PExvYWRTRE5vZGU+KE9wKS0+Z2V0QWRkcmVzc2luZ01vZGUoKQorICAgIDogY2FzdDxTdG9yZVNETm9kZT4oT3ApLT5nZXRBZGRyZXNzaW5nTW9kZSgpOworICBBUk1fQU06OkFkZHJPcGMgQWRkU3ViID0gKEFNID09IElTRDo6UFJFX0lOQyB8fCBBTSA9PSBJU0Q6OlBPU1RfSU5DKQorICAgID8gQVJNX0FNOjphZGQgOiBBUk1fQU06OnN1YjsKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4pKSB7CisgICAgaW50IFZhbCA9IChpbnQpQy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKFZhbCA+PSAwICYmIFZhbCA8IDI1NikgeworICAgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgICAgICBPcGMgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTV9BTTo6Z2V0QU0zT3BjKEFkZFN1YiwgVmFsKSwgTVZUOjppMzIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgT2Zmc2V0ID0gTjsKKyAgT3BjID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk1fQU06OmdldEFNM09wYyhBZGRTdWIsIDApLCBNVlQ6OmkzMik7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0QWRkck1vZGU0KFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQWRkciwgU0RWYWx1ZSAmTW9kZSkgeworICBBZGRyID0gTjsKKyAgTW9kZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdEFkZHJNb2RlNShTRE5vZGUgKk9wLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJk9mZnNldCkgeworICBpZiAoTi5nZXRPcGNvZGUoKSAhPSBJU0Q6OkFERCkgeworICAgIEJhc2UgPSBOOworICAgIGlmIChOLmdldE9wY29kZSgpID09IElTRDo6RnJhbWVJbmRleCkgeworICAgICAgaW50IEZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOKS0+Z2V0SW5kZXgoKTsKKyAgICAgIEJhc2UgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRkksIFRMSS5nZXRQb2ludGVyVHkoKSk7CisgICAgfSBlbHNlIGlmIChOLmdldE9wY29kZSgpID09IEFSTUlTRDo6V3JhcHBlciAmJgorICAgICAgICAgICAgICAgIShTdWJ0YXJnZXQtPnVzZU1vdnQoKSAmJgorICAgICAgICAgICAgICAgICBOLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzKSkgeworICAgICAgQmFzZSA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgICB9CisgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk1fQU06OmdldEFNNU9wYyhBUk1fQU06OmFkZCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBJZiB0aGUgUkhTIGlzICsvLSBpbW04LCBmb2xkIGludG8gYWRkciBtb2RlLgorICBpZiAoQ29uc3RhbnRTRE5vZGUgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpKSB7CisgICAgaW50IFJIU0MgPSAoaW50KVJIUy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKChSSFNDICYgMykgPT0gMCkgeyAgLy8gVGhlIGNvbnN0YW50IGlzIGltcGxpY2l0bHkgbXVsdGlwbGllZCBieSA0LgorICAgICAgUkhTQyA+Pj0gMjsKKyAgICAgIGlmICgoUkhTQyA+PSAwICYmIFJIU0MgPCAyNTYpIHx8CisgICAgICAgICAgKFJIU0MgPCAwICYmIFJIU0MgPiAtMjU2KSkgeyAvLyBub3RlIC0yNTYgaXRzZWxmIGlzbid0IGFsbG93ZWQuCisgICAgICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgICAgIGlmIChCYXNlLmdldE9wY29kZSgpID09IElTRDo6RnJhbWVJbmRleCkgeworICAgICAgICAgIGludCBGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oQmFzZSktPmdldEluZGV4KCk7CisgICAgICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSSwgVExJLmdldFBvaW50ZXJUeSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEFSTV9BTTo6QWRkck9wYyBBZGRTdWIgPSBBUk1fQU06OmFkZDsKKyAgICAgICAgaWYgKFJIU0MgPCAwKSB7CisgICAgICAgICAgQWRkU3ViID0gQVJNX0FNOjpzdWI7CisgICAgICAgICAgUkhTQyA9IC0gUkhTQzsKKyAgICAgICAgfQorICAgICAgICBPZmZzZXQgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTV9BTTo6Z2V0QU01T3BjKEFkZFN1YiwgUkhTQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBCYXNlID0gTjsKKyAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk1fQU06OmdldEFNNU9wYyhBUk1fQU06OmFkZCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdEFkZHJNb2RlNihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkFkZHIsIFNEVmFsdWUgJkFsaWduKSB7CisgIEFkZHIgPSBOOworICAvLyBEZWZhdWx0IHRvIG5vIGFsaWdubWVudC4KKyAgQWxpZ24gPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQVJNREFHVG9EQUdJU2VsOjpTZWxlY3RBZGRyTW9kZVBDKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCwgU0RWYWx1ZSAmTGFiZWwpIHsKKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gQVJNSVNEOjpQSUNfQUREICYmIE4uaGFzT25lVXNlKCkpIHsKKyAgICBPZmZzZXQgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBOMSA9IE4uZ2V0T3BlcmFuZCgxKTsKKyAgICBMYWJlbCAgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xKS0+Z2V0WkV4dFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0VGh1bWJBZGRyTW9kZVJSKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmT2Zmc2V0KXsKKyAgLy8gRklYTUUgZGwgc2hvdWxkIGNvbWUgZnJvbSB0aGUgcGFyZW50IGxvYWQgb3Igc3RvcmUsIG5vdCB0aGUgYWRkcmVzcworICBpZiAoTi5nZXRPcGNvZGUoKSAhPSBJU0Q6OkFERCkgeworICAgIENvbnN0YW50U0ROb2RlICpOQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOKTsKKyAgICBpZiAoIU5DIHx8ICFOQy0+aXNOdWxsVmFsdWUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEJhc2UgPSBPZmZzZXQgPSBOOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQmFzZSA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgT2Zmc2V0ID0gTi5nZXRPcGVyYW5kKDEpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbAorQVJNREFHVG9EQUdJU2VsOjpTZWxlY3RUaHVtYkFkZHJNb2RlUkk1KFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTY2FsZSwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZJbW0sIFNEVmFsdWUgJk9mZnNldCkgeworICBpZiAoU2NhbGUgPT0gNCkgeworICAgIFNEVmFsdWUgVG1wQmFzZSwgVG1wT2ZmSW1tOworICAgIGlmIChTZWxlY3RUaHVtYkFkZHJNb2RlU1AoT3AsIE4sIFRtcEJhc2UsIFRtcE9mZkltbSkpCisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBXZSB3YW50IHRvIHNlbGVjdCB0TERSc3BpIC8gdFNUUnNwaSBpbnN0ZWFkLgorICAgIGlmIChOLmdldE9wY29kZSgpID09IEFSTUlTRDo6V3JhcHBlciAmJgorICAgICAgICBOLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRDb25zdGFudFBvb2wpCisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBXZSB3YW50IHRvIHNlbGVjdCB0TERScGNpIGluc3RlYWQuCisgIH0KKworICBpZiAoTi5nZXRPcGNvZGUoKSAhPSBJU0Q6OkFERCkgeworICAgIGlmIChOLmdldE9wY29kZSgpID09IEFSTUlTRDo6V3JhcHBlciAmJgorICAgICAgICAhKFN1YnRhcmdldC0+dXNlTW92dCgpICYmCisgICAgICAgICAgTi5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsQWRkcmVzcykpIHsKKyAgICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgfSBlbHNlCisgICAgICBCYXNlID0gTjsKKworICAgIE9mZnNldCA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgTVZUOjppMzIpOworICAgIE9mZkltbSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gVGh1bWIgZG9lcyBub3QgaGF2ZSBbc3AsIHJdIGFkZHJlc3MgbW9kZS4KKyAgUmVnaXN0ZXJTRE5vZGUgKkxIU1IgPSBkeW5fY2FzdDxSZWdpc3RlclNETm9kZT4oTi5nZXRPcGVyYW5kKDApKTsKKyAgUmVnaXN0ZXJTRE5vZGUgKlJIU1IgPSBkeW5fY2FzdDxSZWdpc3RlclNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKTsKKyAgaWYgKChMSFNSICYmIExIU1ItPmdldFJlZygpID09IEFSTTo6U1ApIHx8CisgICAgICAoUkhTUiAmJiBSSFNSLT5nZXRSZWcoKSA9PSBBUk06OlNQKSkgeworICAgIEJhc2UgPSBOOworICAgIE9mZnNldCA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgTVZUOjppMzIpOworICAgIE9mZkltbSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gSWYgdGhlIFJIUyBpcyArIGltbTUgKiBzY2FsZSwgZm9sZCBpbnRvIGFkZHIgbW9kZS4KKyAgaWYgKENvbnN0YW50U0ROb2RlICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKSkgeworICAgIGludCBSSFNDID0gKGludClSSFMtPmdldFpFeHRWYWx1ZSgpOworICAgIGlmICgoUkhTQyAmIChTY2FsZS0xKSkgPT0gMCkgeyAgLy8gVGhlIGNvbnN0YW50IGlzIGltcGxpY2l0bHkgbXVsdGlwbGllZC4KKyAgICAgIFJIU0MgLz0gU2NhbGU7CisgICAgICBpZiAoUkhTQyA+PSAwICYmIFJIU0MgPCAzMikgeworICAgICAgICBCYXNlID0gTi5nZXRPcGVyYW5kKDApOworICAgICAgICBPZmZzZXQgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKTsKKyAgICAgICAgT2ZmSW1tID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChSSFNDLCBNVlQ6OmkzMik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgIE9mZnNldCA9IE4uZ2V0T3BlcmFuZCgxKTsKKyAgT2ZmSW1tID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBNVlQ6OmkzMik7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0VGh1bWJBZGRyTW9kZVMxKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmT2ZmSW1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZzZXQpIHsKKyAgcmV0dXJuIFNlbGVjdFRodW1iQWRkck1vZGVSSTUoT3AsIE4sIDEsIEJhc2UsIE9mZkltbSwgT2Zmc2V0KTsKK30KKworYm9vbCBBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdFRodW1iQWRkck1vZGVTMihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJk9mZkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2Zmc2V0KSB7CisgIHJldHVybiBTZWxlY3RUaHVtYkFkZHJNb2RlUkk1KE9wLCBOLCAyLCBCYXNlLCBPZmZJbW0sIE9mZnNldCk7Cit9CisKK2Jvb2wgQVJNREFHVG9EQUdJU2VsOjpTZWxlY3RUaHVtYkFkZHJNb2RlUzQoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZPZmZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCkgeworICByZXR1cm4gU2VsZWN0VGh1bWJBZGRyTW9kZVJJNShPcCwgTiwgNCwgQmFzZSwgT2ZmSW1tLCBPZmZzZXQpOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0VGh1bWJBZGRyTW9kZVNQKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZPZmZJbW0pIHsKKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGcmFtZUluZGV4KSB7CisgICAgaW50IEZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOKS0+Z2V0SW5kZXgoKTsKKyAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRGcmFtZUluZGV4KEZJLCBUTEkuZ2V0UG9pbnRlclR5KCkpOworICAgIE9mZkltbSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgIT0gSVNEOjpBREQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFJlZ2lzdGVyU0ROb2RlICpMSFNSID0gZHluX2Nhc3Q8UmVnaXN0ZXJTRE5vZGU+KE4uZ2V0T3BlcmFuZCgwKSk7CisgIGlmIChOLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGcmFtZUluZGV4IHx8CisgICAgICAoTEhTUiAmJiBMSFNSLT5nZXRSZWcoKSA9PSBBUk06OlNQKSkgeworICAgIC8vIElmIHRoZSBSSFMgaXMgKyBpbW04ICogc2NhbGUsIGZvbGQgaW50byBhZGRyIG1vZGUuCisgICAgaWYgKENvbnN0YW50U0ROb2RlICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgaW50IFJIU0MgPSAoaW50KVJIUy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBpZiAoKFJIU0MgJiAzKSA9PSAwKSB7ICAvLyBUaGUgY29uc3RhbnQgaXMgaW1wbGljaXRseSBtdWx0aXBsaWVkLgorICAgICAgICBSSFNDID4+PSAyOworICAgICAgICBpZiAoUkhTQyA+PSAwICYmIFJIU0MgPCAyNTYpIHsKKyAgICAgICAgICBCYXNlID0gTi5nZXRPcGVyYW5kKDApOworICAgICAgICAgIGlmIChCYXNlLmdldE9wY29kZSgpID09IElTRDo6RnJhbWVJbmRleCkgeworICAgICAgICAgICAgaW50IEZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihCYXNlKS0+Z2V0SW5kZXgoKTsKKyAgICAgICAgICAgIEJhc2UgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRkksIFRMSS5nZXRQb2ludGVyVHkoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIE9mZkltbSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoUkhTQywgTVZUOjppMzIpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0VDJTaGlmdGVyT3BlcmFuZFJlZyhTRE5vZGUgKk9wLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT3BjKSB7CisgIGlmIChEaXNhYmxlU2hpZnRlck9wKQorICAgIHJldHVybiBmYWxzZTsKKworICBBUk1fQU06OlNoaWZ0T3BjIFNoT3BjVmFsID0gQVJNX0FNOjpnZXRTaGlmdE9wY0Zvck5vZGUoTik7CisKKyAgLy8gRG9uJ3QgbWF0Y2ggYmFzZSByZWdpc3RlciBvbmx5IGNhc2UuIFRoYXQgaXMgbWF0Y2hlZCB0byBhIHNlcGFyYXRlCisgIC8vIGxvd2VyIGNvbXBsZXhpdHkgcGF0dGVybiB3aXRoIGV4cGxpY2l0IHJlZ2lzdGVyIG9wZXJhbmQuCisgIGlmIChTaE9wY1ZhbCA9PSBBUk1fQU06Om5vX3NoaWZ0KSByZXR1cm4gZmFsc2U7CisKKyAgQmFzZVJlZyA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgdW5zaWduZWQgU2hJbW1WYWwgPSAwOworICBpZiAoQ29uc3RhbnRTRE5vZGUgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpKSB7CisgICAgU2hJbW1WYWwgPSBSSFMtPmdldFpFeHRWYWx1ZSgpICYgMzE7CisgICAgT3BjID0gZ2V0STMySW1tKEFSTV9BTTo6Z2V0U09SZWdPcGMoU2hPcGNWYWwsIFNoSW1tVmFsKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQVJNREFHVG9EQUdJU2VsOjpTZWxlY3RUMkFkZHJNb2RlSW1tMTIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZPZmZJbW0pIHsKKyAgLy8gTWF0Y2ggc2ltcGxlIFIgKyBpbW0xMiBvcGVyYW5kcy4KKworICAvLyBCYXNlIG9ubHkuCisgIGlmIChOLmdldE9wY29kZSgpICE9IElTRDo6QUREICYmIE4uZ2V0T3Bjb2RlKCkgIT0gSVNEOjpTVUIpIHsKKyAgICBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZyYW1lSW5kZXgpIHsKKyAgICAgIC8vIE1hdGNoIGZyYW1lIGluZGV4Li4uCisgICAgICBpbnQgRkkgPSBjYXN0PEZyYW1lSW5kZXhTRE5vZGU+KE4pLT5nZXRJbmRleCgpOworICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSSwgVExJLmdldFBvaW50ZXJUeSgpKTsKKyAgICAgIE9mZkltbSAgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoTi5nZXRPcGNvZGUoKSA9PSBBUk1JU0Q6OldyYXBwZXIgJiYKKyAgICAgICAgICAgICAgICEoU3VidGFyZ2V0LT51c2VNb3Z0KCkgJiYKKyAgICAgICAgICAgICAgICAgTi5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsQWRkcmVzcykpIHsKKyAgICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgICBpZiAoQmFzZS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldENvbnN0YW50UG9vbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gV2Ugd2FudCB0byBzZWxlY3QgdDJMRFJwY2kgaW5zdGVhZC4KKyAgICB9IGVsc2UKKyAgICAgIEJhc2UgPSBOOworICAgIE9mZkltbSAgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChDb25zdGFudFNETm9kZSAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICBpZiAoU2VsZWN0VDJBZGRyTW9kZUltbTgoT3AsIE4sIEJhc2UsIE9mZkltbSkpCisgICAgICAvLyBMZXQgdDJMRFJpOCBoYW5kbGUgKFIgLSBpbW04KS4KKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGludCBSSFNDID0gKGludClSSFMtPmdldFpFeHRWYWx1ZSgpOworICAgIGlmIChOLmdldE9wY29kZSgpID09IElTRDo6U1VCKQorICAgICAgUkhTQyA9IC1SSFNDOworCisgICAgaWYgKFJIU0MgPj0gMCAmJiBSSFNDIDwgMHgxMDAwKSB7IC8vIDEyIGJpdHMgKHVuc2lnbmVkKQorICAgICAgQmFzZSAgID0gTi5nZXRPcGVyYW5kKDApOworICAgICAgaWYgKEJhc2UuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGcmFtZUluZGV4KSB7CisgICAgICAgIGludCBGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oQmFzZSktPmdldEluZGV4KCk7CisgICAgICAgIEJhc2UgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRkksIFRMSS5nZXRQb2ludGVyVHkoKSk7CisgICAgICB9CisgICAgICBPZmZJbW0gPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KFJIU0MsIE1WVDo6aTMyKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIEJhc2Ugb25seS4KKyAgQmFzZSA9IE47CisgIE9mZkltbSAgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQVJNREFHVG9EQUdJU2VsOjpTZWxlY3RUMkFkZHJNb2RlSW1tOChTRE5vZGUgKk9wLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmT2ZmSW1tKSB7CisgIC8vIE1hdGNoIHNpbXBsZSBSIC0gaW1tOCBvcGVyYW5kcy4KKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQgfHwgTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQikgeworICAgIGlmIChDb25zdGFudFNETm9kZSAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIGludCBSSFNDID0gKGludClSSFMtPmdldFNFeHRWYWx1ZSgpOworICAgICAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIpCisgICAgICAgIFJIU0MgPSAtUkhTQzsKKworICAgICAgaWYgKChSSFNDID49IC0yNTUpICYmIChSSFNDIDwgMCkpIHsgLy8gOCBiaXRzIChhbHdheXMgbmVnYXRpdmUpCisgICAgICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgICAgIGlmIChCYXNlLmdldE9wY29kZSgpID09IElTRDo6RnJhbWVJbmRleCkgeworICAgICAgICAgIGludCBGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oQmFzZSktPmdldEluZGV4KCk7CisgICAgICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSSwgVExJLmdldFBvaW50ZXJUeSgpKTsKKyAgICAgICAgfQorICAgICAgICBPZmZJbW0gPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KFJIU0MsIE1WVDo6aTMyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0VDJBZGRyTW9kZUltbThPZmZzZXQoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZkltbSl7CisgIHVuc2lnbmVkIE9wY29kZSA9IE9wLT5nZXRPcGNvZGUoKTsKKyAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSA9IChPcGNvZGUgPT0gSVNEOjpMT0FEKQorICAgID8gY2FzdDxMb2FkU0ROb2RlPihPcCktPmdldEFkZHJlc3NpbmdNb2RlKCkKKyAgICA6IGNhc3Q8U3RvcmVTRE5vZGU+KE9wKS0+Z2V0QWRkcmVzc2luZ01vZGUoKTsKKyAgaWYgKENvbnN0YW50U0ROb2RlICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTikpIHsKKyAgICBpbnQgUkhTQyA9IChpbnQpUkhTLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBpZiAoUkhTQyA+PSAwICYmIFJIU0MgPCAweDEwMCkgeyAvLyA4IGJpdHMuCisgICAgICBPZmZJbW0gPSAoKEFNID09IElTRDo6UFJFX0lOQykgfHwgKEFNID09IElTRDo6UE9TVF9JTkMpKQorICAgICAgICA/IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoUkhTQywgTVZUOjppMzIpCisgICAgICAgIDogQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgtUkhTQywgTVZUOjppMzIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFSTURBR1RvREFHSVNlbDo6U2VsZWN0VDJBZGRyTW9kZUltbThzNChTRE5vZGUgKk9wLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZPZmZJbW0pIHsKKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQpIHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBpbnQgUkhTQyA9IChpbnQpUkhTLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIC8vIDggYml0cy4KKyAgICAgIGlmICgoKFJIU0MgJiAweDMpID09IDApICYmCisgICAgICAgICAgKChSSFNDID49IDAgJiYgUkhTQyA8IDB4NDAwKSB8fCAoUkhTQyA8IDAgJiYgUkhTQyA+IC0weDQwMCkpKSB7CisgICAgICAgIEJhc2UgICA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgICAgICAgT2ZmSW1tID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChSSFNDLCBNVlQ6OmkzMik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChOLmdldE9wY29kZSgpID09IElTRDo6U1VCKSB7CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgaW50IFJIU0MgPSAoaW50KVJIUy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAvLyA4IGJpdHMuCisgICAgICBpZiAoKChSSFNDICYgMHgzKSA9PSAwKSAmJiAoUkhTQyA+PSAwICYmIFJIU0MgPCAweDQwMCkpIHsKKyAgICAgICAgQmFzZSAgID0gTi5nZXRPcGVyYW5kKDApOworICAgICAgICBPZmZJbW0gPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KC1SSFNDLCBNVlQ6OmkzMik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdFQyQWRkck1vZGVTb1JlZyhTRE5vZGUgKk9wLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZlJlZywgU0RWYWx1ZSAmU2hJbW0pIHsKKyAgLy8gKFIgLSBpbW04KSBzaG91bGQgYmUgaGFuZGxlZCBieSB0MkxEUmk4LiBUaGUgcmVzdCBhcmUgaGFuZGxlZCBieSB0MkxEUmkxMi4KKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgIT0gSVNEOjpBREQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIExlYXZlIChSICsgaW1tMTIpIGZvciB0MkxEUmkxMiwgKFIgLSBpbW04KSBmb3IgdDJMRFJpOC4KKyAgaWYgKENvbnN0YW50U0ROb2RlICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKSkgeworICAgIGludCBSSFNDID0gKGludClSSFMtPmdldFpFeHRWYWx1ZSgpOworICAgIGlmIChSSFNDID49IDAgJiYgUkhTQyA8IDB4MTAwMCkgLy8gMTIgYml0cyAodW5zaWduZWQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZWxzZSBpZiAoUkhTQyA8IDAgJiYgUkhTQyA+PSAtMjU1KSAvLyA4IGJpdHMKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIExvb2sgZm9yIChSICsgUikgb3IgKFIgKyAoUiA8PCBbMSwyLDNdKSkuCisgIHVuc2lnbmVkIFNoQW10ID0gMDsKKyAgQmFzZSAgID0gTi5nZXRPcGVyYW5kKDApOworICBPZmZSZWcgPSBOLmdldE9wZXJhbmQoMSk7CisKKyAgLy8gU3dhcCBpZiBpdCBpcyAoKFIgPDwgYykgKyBSKS4KKyAgQVJNX0FNOjpTaGlmdE9wYyBTaE9wY1ZhbCA9IEFSTV9BTTo6Z2V0U2hpZnRPcGNGb3JOb2RlKE9mZlJlZyk7CisgIGlmIChTaE9wY1ZhbCAhPSBBUk1fQU06OmxzbCkgeworICAgIFNoT3BjVmFsID0gQVJNX0FNOjpnZXRTaGlmdE9wY0Zvck5vZGUoQmFzZSk7CisgICAgaWYgKFNoT3BjVmFsID09IEFSTV9BTTo6bHNsKQorICAgICAgc3RkOjpzd2FwKEJhc2UsIE9mZlJlZyk7CisgIH0KKworICBpZiAoU2hPcGNWYWwgPT0gQVJNX0FNOjpsc2wpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIFJIUyBvZiB0aGUgc2hpZnQgaXMgYSBjb25zdGFudCwgaWYgbm90LCB3ZSBjYW4ndCBmb2xkCisgICAgLy8gaXQuCisgICAgaWYgKENvbnN0YW50U0ROb2RlICpTaCA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPZmZSZWcuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIFNoQW10ID0gU2gtPmdldFpFeHRWYWx1ZSgpOworICAgICAgaWYgKFNoQW10ID49IDQpIHsKKyAgICAgICAgU2hBbXQgPSAwOworICAgICAgICBTaE9wY1ZhbCA9IEFSTV9BTTo6bm9fc2hpZnQ7CisgICAgICB9IGVsc2UKKyAgICAgICAgT2ZmUmVnID0gT2ZmUmVnLmdldE9wZXJhbmQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNoT3BjVmFsID0gQVJNX0FNOjpub19zaGlmdDsKKyAgICB9CisgIH0KKworICBTaEltbSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoU2hBbXQsIE1WVDo6aTMyKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBnZXRBTCAtIFJldHVybnMgYSBBUk1DQzo6QUwgaW1tZWRpYXRlIG5vZGUuCitzdGF0aWMgaW5saW5lIFNEVmFsdWUgZ2V0QUwoU2VsZWN0aW9uREFHICpDdXJEQUcpIHsKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoKHVpbnQ2NF90KUFSTUNDOjpBTCwgTVZUOjppMzIpOworfQorCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6U2VsZWN0QVJNSW5kZXhlZExvYWQoU0ROb2RlICpOKSB7CisgIExvYWRTRE5vZGUgKkxEID0gY2FzdDxMb2FkU0ROb2RlPihOKTsKKyAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSA9IExELT5nZXRBZGRyZXNzaW5nTW9kZSgpOworICBpZiAoQU0gPT0gSVNEOjpVTklOREVYRUQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgRVZUIExvYWRlZFZUID0gTEQtPmdldE1lbW9yeVZUKCk7CisgIFNEVmFsdWUgT2Zmc2V0LCBBTU9wYzsKKyAgYm9vbCBpc1ByZSA9IChBTSA9PSBJU0Q6OlBSRV9JTkMpIHx8IChBTSA9PSBJU0Q6OlBSRV9ERUMpOworICB1bnNpZ25lZCBPcGNvZGUgPSAwOworICBib29sIE1hdGNoID0gZmFsc2U7CisgIGlmIChMb2FkZWRWVCA9PSBNVlQ6OmkzMiAmJgorICAgICAgU2VsZWN0QWRkck1vZGUyT2Zmc2V0KE4sIExELT5nZXRPZmZzZXQoKSwgT2Zmc2V0LCBBTU9wYykpIHsKKyAgICBPcGNvZGUgPSBpc1ByZSA/IEFSTTo6TERSX1BSRSA6IEFSTTo6TERSX1BPU1Q7CisgICAgTWF0Y2ggPSB0cnVlOworICB9IGVsc2UgaWYgKExvYWRlZFZUID09IE1WVDo6aTE2ICYmCisgICAgICAgICAgICAgU2VsZWN0QWRkck1vZGUzT2Zmc2V0KE4sIExELT5nZXRPZmZzZXQoKSwgT2Zmc2V0LCBBTU9wYykpIHsKKyAgICBNYXRjaCA9IHRydWU7CisgICAgT3Bjb2RlID0gKExELT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpTRVhUTE9BRCkKKyAgICAgID8gKGlzUHJlID8gQVJNOjpMRFJTSF9QUkUgOiBBUk06OkxEUlNIX1BPU1QpCisgICAgICA6IChpc1ByZSA/IEFSTTo6TERSSF9QUkUgOiBBUk06OkxEUkhfUE9TVCk7CisgIH0gZWxzZSBpZiAoTG9hZGVkVlQgPT0gTVZUOjppOCB8fCBMb2FkZWRWVCA9PSBNVlQ6OmkxKSB7CisgICAgaWYgKExELT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpTRVhUTE9BRCkgeworICAgICAgaWYgKFNlbGVjdEFkZHJNb2RlM09mZnNldChOLCBMRC0+Z2V0T2Zmc2V0KCksIE9mZnNldCwgQU1PcGMpKSB7CisgICAgICAgIE1hdGNoID0gdHJ1ZTsKKyAgICAgICAgT3Bjb2RlID0gaXNQcmUgPyBBUk06OkxEUlNCX1BSRSA6IEFSTTo6TERSU0JfUE9TVDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKFNlbGVjdEFkZHJNb2RlMk9mZnNldChOLCBMRC0+Z2V0T2Zmc2V0KCksIE9mZnNldCwgQU1PcGMpKSB7CisgICAgICAgIE1hdGNoID0gdHJ1ZTsKKyAgICAgICAgT3Bjb2RlID0gaXNQcmUgPyBBUk06OkxEUkJfUFJFIDogQVJNOjpMRFJCX1BPU1Q7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKE1hdGNoKSB7CisgICAgU0RWYWx1ZSBDaGFpbiA9IExELT5nZXRDaGFpbigpOworICAgIFNEVmFsdWUgQmFzZSA9IExELT5nZXRCYXNlUHRyKCk7CisgICAgU0RWYWx1ZSBPcHNbXT0geyBCYXNlLCBPZmZzZXQsIEFNT3BjLCBnZXRBTChDdXJEQUcpLAorICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMiksIENoYWluIH07CisgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3Bjb2RlLCBOLT5nZXREZWJ1Z0xvYygpLCBNVlQ6OmkzMiwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgT3BzLCA2KTsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6U2VsZWN0VDJJbmRleGVkTG9hZChTRE5vZGUgKk4pIHsKKyAgTG9hZFNETm9kZSAqTEQgPSBjYXN0PExvYWRTRE5vZGU+KE4pOworICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gTEQtPmdldEFkZHJlc3NpbmdNb2RlKCk7CisgIGlmIChBTSA9PSBJU0Q6OlVOSU5ERVhFRCkKKyAgICByZXR1cm4gTlVMTDsKKworICBFVlQgTG9hZGVkVlQgPSBMRC0+Z2V0TWVtb3J5VlQoKTsKKyAgYm9vbCBpc1NFeHRMZCA9IExELT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpTRVhUTE9BRDsKKyAgU0RWYWx1ZSBPZmZzZXQ7CisgIGJvb2wgaXNQcmUgPSAoQU0gPT0gSVNEOjpQUkVfSU5DKSB8fCAoQU0gPT0gSVNEOjpQUkVfREVDKTsKKyAgdW5zaWduZWQgT3Bjb2RlID0gMDsKKyAgYm9vbCBNYXRjaCA9IGZhbHNlOworICBpZiAoU2VsZWN0VDJBZGRyTW9kZUltbThPZmZzZXQoTiwgTEQtPmdldE9mZnNldCgpLCBPZmZzZXQpKSB7CisgICAgc3dpdGNoIChMb2FkZWRWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgY2FzZSBNVlQ6OmkzMjoKKyAgICAgIE9wY29kZSA9IGlzUHJlID8gQVJNOjp0MkxEUl9QUkUgOiBBUk06OnQyTERSX1BPU1Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1WVDo6aTE2OgorICAgICAgaWYgKGlzU0V4dExkKQorICAgICAgICBPcGNvZGUgPSBpc1ByZSA/IEFSTTo6dDJMRFJTSF9QUkUgOiBBUk06OnQyTERSU0hfUE9TVDsKKyAgICAgIGVsc2UKKyAgICAgICAgT3Bjb2RlID0gaXNQcmUgPyBBUk06OnQyTERSSF9QUkUgOiBBUk06OnQyTERSSF9QT1NUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNVlQ6Omk4OgorICAgIGNhc2UgTVZUOjppMToKKyAgICAgIGlmIChpc1NFeHRMZCkKKyAgICAgICAgT3Bjb2RlID0gaXNQcmUgPyBBUk06OnQyTERSU0JfUFJFIDogQVJNOjp0MkxEUlNCX1BPU1Q7CisgICAgICBlbHNlCisgICAgICAgIE9wY29kZSA9IGlzUHJlID8gQVJNOjp0MkxEUkJfUFJFIDogQVJNOjp0MkxEUkJfUE9TVDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgTWF0Y2ggPSB0cnVlOworICB9CisKKyAgaWYgKE1hdGNoKSB7CisgICAgU0RWYWx1ZSBDaGFpbiA9IExELT5nZXRDaGFpbigpOworICAgIFNEVmFsdWUgQmFzZSA9IExELT5nZXRCYXNlUHRyKCk7CisgICAgU0RWYWx1ZSBPcHNbXT0geyBCYXNlLCBPZmZzZXQsIGdldEFMKEN1ckRBRyksCisgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKSwgQ2hhaW4gfTsKKyAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGNvZGUsIE4tPmdldERlYnVnTG9jKCksIE1WVDo6aTMyLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBPcHMsIDUpOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vLyBQYWlyU1JlZ3MgLSBGb3JtIGEgRCByZWdpc3RlciBmcm9tIGEgcGFpciBvZiBTIHJlZ2lzdGVycy4KKy8vLworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OlBhaXJTUmVncyhFVlQgVlQsIFNEVmFsdWUgVjAsIFNEVmFsdWUgVjEpIHsKKyAgRGVidWdMb2MgZGwgPSBWMC5nZXROb2RlKCktPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgU3ViUmVnMCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNOjpzc3ViXzAsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBTdWJSZWcxID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OnNzdWJfMSwgTVZUOjppMzIpOworICBjb25zdCBTRFZhbHVlIE9wc1tdID0geyBWMCwgU3ViUmVnMCwgVjEsIFN1YlJlZzEgfTsKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpSRUdfU0VRVUVOQ0UsIGRsLCBWVCwgT3BzLCA0KTsKK30KKworLy8vIFBhaXJEUmVncyAtIEZvcm0gYSBxdWFkIHJlZ2lzdGVyIGZyb20gYSBwYWlyIG9mIEQgcmVnaXN0ZXJzLgorLy8vCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6UGFpckRSZWdzKEVWVCBWVCwgU0RWYWx1ZSBWMCwgU0RWYWx1ZSBWMSkgeworICBEZWJ1Z0xvYyBkbCA9IFYwLmdldE5vZGUoKS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBTdWJSZWcwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OmRzdWJfMCwgTVZUOjppMzIpOworICBTRFZhbHVlIFN1YlJlZzEgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTTo6ZHN1Yl8xLCBNVlQ6OmkzMik7CisgIGNvbnN0IFNEVmFsdWUgT3BzW10gPSB7IFYwLCBTdWJSZWcwLCBWMSwgU3ViUmVnMSB9OworICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OlJFR19TRVFVRU5DRSwgZGwsIFZULCBPcHMsIDQpOworfQorCisvLy8gUGFpclFSZWdzIC0gRm9ybSA0IGNvbnNlY3V0aXZlIEQgcmVnaXN0ZXJzIGZyb20gYSBwYWlyIG9mIFEgcmVnaXN0ZXJzLgorLy8vCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6UGFpclFSZWdzKEVWVCBWVCwgU0RWYWx1ZSBWMCwgU0RWYWx1ZSBWMSkgeworICBEZWJ1Z0xvYyBkbCA9IFYwLmdldE5vZGUoKS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBTdWJSZWcwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OnFzdWJfMCwgTVZUOjppMzIpOworICBTRFZhbHVlIFN1YlJlZzEgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTTo6cXN1Yl8xLCBNVlQ6OmkzMik7CisgIGNvbnN0IFNEVmFsdWUgT3BzW10gPSB7IFYwLCBTdWJSZWcwLCBWMSwgU3ViUmVnMSB9OworICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OlJFR19TRVFVRU5DRSwgZGwsIFZULCBPcHMsIDQpOworfQorCisvLy8gUXVhZFNSZWdzIC0gRm9ybSA0IGNvbnNlY3V0aXZlIFMgcmVnaXN0ZXJzLgorLy8vCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6UXVhZFNSZWdzKEVWVCBWVCwgU0RWYWx1ZSBWMCwgU0RWYWx1ZSBWMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBWMiwgU0RWYWx1ZSBWMykgeworICBEZWJ1Z0xvYyBkbCA9IFYwLmdldE5vZGUoKS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBTdWJSZWcwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OnNzdWJfMCwgTVZUOjppMzIpOworICBTRFZhbHVlIFN1YlJlZzEgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTTo6c3N1Yl8xLCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgU3ViUmVnMiA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNOjpzc3ViXzIsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBTdWJSZWczID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OnNzdWJfMywgTVZUOjppMzIpOworICBjb25zdCBTRFZhbHVlIE9wc1tdID0geyBWMCwgU3ViUmVnMCwgVjEsIFN1YlJlZzEsIFYyLCBTdWJSZWcyLCBWMywgU3ViUmVnMyB9OworICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OlJFR19TRVFVRU5DRSwgZGwsIFZULCBPcHMsIDgpOworfQorCisvLy8gUXVhZERSZWdzIC0gRm9ybSA0IGNvbnNlY3V0aXZlIEQgcmVnaXN0ZXJzLgorLy8vCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6UXVhZERSZWdzKEVWVCBWVCwgU0RWYWx1ZSBWMCwgU0RWYWx1ZSBWMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBWMiwgU0RWYWx1ZSBWMykgeworICBEZWJ1Z0xvYyBkbCA9IFYwLmdldE5vZGUoKS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBTdWJSZWcwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OmRzdWJfMCwgTVZUOjppMzIpOworICBTRFZhbHVlIFN1YlJlZzEgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTTo6ZHN1Yl8xLCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgU3ViUmVnMiA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNOjpkc3ViXzIsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBTdWJSZWczID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OmRzdWJfMywgTVZUOjppMzIpOworICBjb25zdCBTRFZhbHVlIE9wc1tdID0geyBWMCwgU3ViUmVnMCwgVjEsIFN1YlJlZzEsIFYyLCBTdWJSZWcyLCBWMywgU3ViUmVnMyB9OworICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OlJFR19TRVFVRU5DRSwgZGwsIFZULCBPcHMsIDgpOworfQorCisvLy8gUXVhZFFSZWdzIC0gRm9ybSA0IGNvbnNlY3V0aXZlIFEgcmVnaXN0ZXJzLgorLy8vCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6UXVhZFFSZWdzKEVWVCBWVCwgU0RWYWx1ZSBWMCwgU0RWYWx1ZSBWMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBWMiwgU0RWYWx1ZSBWMykgeworICBEZWJ1Z0xvYyBkbCA9IFYwLmdldE5vZGUoKS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBTdWJSZWcwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OnFzdWJfMCwgTVZUOjppMzIpOworICBTRFZhbHVlIFN1YlJlZzEgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTTo6cXN1Yl8xLCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgU3ViUmVnMiA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNOjpxc3ViXzIsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBTdWJSZWczID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OnFzdWJfMywgTVZUOjppMzIpOworICBjb25zdCBTRFZhbHVlIE9wc1tdID0geyBWMCwgU3ViUmVnMCwgVjEsIFN1YlJlZzEsIFYyLCBTdWJSZWcyLCBWMywgU3ViUmVnMyB9OworICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OlJFR19TRVFVRU5DRSwgZGwsIFZULCBPcHMsIDgpOworfQorCisvLy8gT2N0b0RSZWdzIC0gRm9ybSA4IGNvbnNlY3V0aXZlIEQgcmVnaXN0ZXJzLgorLy8vCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6T2N0b0RSZWdzKEVWVCBWVCwgU0RWYWx1ZSBWMCwgU0RWYWx1ZSBWMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBWMiwgU0RWYWx1ZSBWMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBWNCwgU0RWYWx1ZSBWNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBWNiwgU0RWYWx1ZSBWNykgeworICBEZWJ1Z0xvYyBkbCA9IFYwLmdldE5vZGUoKS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBTdWJSZWcwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OmRzdWJfMCwgTVZUOjppMzIpOworICBTRFZhbHVlIFN1YlJlZzEgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTTo6ZHN1Yl8xLCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgU3ViUmVnMiA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNOjpkc3ViXzIsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBTdWJSZWczID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OmRzdWJfMywgTVZUOjppMzIpOworICBTRFZhbHVlIFN1YlJlZzQgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTTo6ZHN1Yl80LCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgU3ViUmVnNSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNOjpkc3ViXzUsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBTdWJSZWc2ID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OmRzdWJfNiwgTVZUOjppMzIpOworICBTRFZhbHVlIFN1YlJlZzcgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTTo6ZHN1Yl83LCBNVlQ6OmkzMik7CisgIGNvbnN0IFNEVmFsdWUgT3BzW10gPXsgVjAsIFN1YlJlZzAsIFYxLCBTdWJSZWcxLCBWMiwgU3ViUmVnMiwgVjMsIFN1YlJlZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVjQsIFN1YlJlZzQsIFY1LCBTdWJSZWc1LCBWNiwgU3ViUmVnNiwgVjcsIFN1YlJlZzcgfTsKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpSRUdfU0VRVUVOQ0UsIGRsLCBWVCwgT3BzLCAxNik7Cit9CisKKy8vLyBHZXRORU9OU3VicmVnVlQgLSBHaXZlbiBhIHR5cGUgZm9yIGEgMTI4LWJpdCBORU9OIHZlY3RvciwgcmV0dXJuIHRoZSB0eXBlCisvLy8gZm9yIGEgNjQtYml0IHN1YnJlZ2lzdGVyIG9mIHRoZSB2ZWN0b3IuCitzdGF0aWMgRVZUIEdldE5FT05TdWJyZWdWVChFVlQgVlQpIHsKKyAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoInVuaGFuZGxlZCBORU9OIHR5cGUiKTsKKyAgY2FzZSBNVlQ6OnYxNmk4OiByZXR1cm4gTVZUOjp2OGk4OworICBjYXNlIE1WVDo6djhpMTY6IHJldHVybiBNVlQ6OnY0aTE2OworICBjYXNlIE1WVDo6djRmMzI6IHJldHVybiBNVlQ6OnYyZjMyOworICBjYXNlIE1WVDo6djRpMzI6IHJldHVybiBNVlQ6OnYyaTMyOworICBjYXNlIE1WVDo6djJpNjQ6IHJldHVybiBNVlQ6OnYxaTY0OworICB9Cit9CisKK1NETm9kZSAqQVJNREFHVG9EQUdJU2VsOjpTZWxlY3RWTEQoU0ROb2RlICpOLCB1bnNpZ25lZCBOdW1WZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqRE9wY29kZXMsIHVuc2lnbmVkICpRT3Bjb2RlczAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpRT3Bjb2RlczEpIHsKKyAgYXNzZXJ0KE51bVZlY3MgPj0gMSAmJiBOdW1WZWNzIDw9IDQgJiYgIlZMRCBOdW1WZWNzIG91dC1vZi1yYW5nZSIpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgU0RWYWx1ZSBNZW1BZGRyLCBBbGlnbjsKKyAgaWYgKCFTZWxlY3RBZGRyTW9kZTYoTiwgTi0+Z2V0T3BlcmFuZCgyKSwgTWVtQWRkciwgQWxpZ24pKQorICAgIHJldHVybiBOVUxMOworCisgIFNEVmFsdWUgQ2hhaW4gPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIGJvb2wgaXM2NEJpdFZlY3RvciA9IFZULmlzNjRCaXRWZWN0b3IoKTsKKworICB1bnNpZ25lZCBPcGNvZGVJbmRleDsKKyAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoInVuaGFuZGxlZCB2bGQgdHlwZSIpOworICAgIC8vIERvdWJsZS1yZWdpc3RlciBvcGVyYXRpb25zOgorICBjYXNlIE1WVDo6djhpODogIE9wY29kZUluZGV4ID0gMDsgYnJlYWs7CisgIGNhc2UgTVZUOjp2NGkxNjogT3Bjb2RlSW5kZXggPSAxOyBicmVhazsKKyAgY2FzZSBNVlQ6OnYyZjMyOgorICBjYXNlIE1WVDo6djJpMzI6IE9wY29kZUluZGV4ID0gMjsgYnJlYWs7CisgIGNhc2UgTVZUOjp2MWk2NDogT3Bjb2RlSW5kZXggPSAzOyBicmVhazsKKyAgICAvLyBRdWFkLXJlZ2lzdGVyIG9wZXJhdGlvbnM6CisgIGNhc2UgTVZUOjp2MTZpODogT3Bjb2RlSW5kZXggPSAwOyBicmVhazsKKyAgY2FzZSBNVlQ6OnY4aTE2OiBPcGNvZGVJbmRleCA9IDE7IGJyZWFrOworICBjYXNlIE1WVDo6djRmMzI6CisgIGNhc2UgTVZUOjp2NGkzMjogT3Bjb2RlSW5kZXggPSAyOyBicmVhazsKKyAgY2FzZSBNVlQ6OnYyaTY0OiBPcGNvZGVJbmRleCA9IDM7CisgICAgYXNzZXJ0KE51bVZlY3MgPT0gMSAmJiAidjJpNjQgdHlwZSBvbmx5IHN1cHBvcnRlZCBmb3IgVkxEMSIpOworICAgIGJyZWFrOworICB9CisKKyAgU0RWYWx1ZSBQcmVkID0gZ2V0QUwoQ3VyREFHKTsKKyAgU0RWYWx1ZSBSZWcwID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgIGlmIChpczY0Qml0VmVjdG9yKSB7CisgICAgdW5zaWduZWQgT3BjID0gRE9wY29kZXNbT3Bjb2RlSW5kZXhdOworICAgIGNvbnN0IFNEVmFsdWUgT3BzW10gPSB7IE1lbUFkZHIsIEFsaWduLCBQcmVkLCBSZWcwLCBDaGFpbiB9OworICAgIHN0ZDo6dmVjdG9yPEVWVD4gUmVzVHlzKE51bVZlY3MsIFZUKTsKKyAgICBSZXNUeXMucHVzaF9iYWNrKE1WVDo6T3RoZXIpOworICAgIFNETm9kZSAqVkxkID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBSZXNUeXMsIE9wcywgNSk7CisgICAgaWYgKE51bVZlY3MgPCAyKQorICAgICAgcmV0dXJuIFZMZDsKKworICAgIFNEVmFsdWUgUmVnU2VxOworICAgIFNEVmFsdWUgVjAgPSBTRFZhbHVlKFZMZCwgMCk7CisgICAgU0RWYWx1ZSBWMSA9IFNEVmFsdWUoVkxkLCAxKTsKKworICAgIC8vIEZvcm0gYSBSRUdfU0VRVUVOQ0UgdG8gZm9yY2UgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgICBpZiAoTnVtVmVjcyA9PSAyKQorICAgICAgUmVnU2VxID0gU0RWYWx1ZShQYWlyRFJlZ3MoTVZUOjp2Mmk2NCwgVjAsIFYxKSwgMCk7CisgICAgZWxzZSB7CisgICAgICBTRFZhbHVlIFYyID0gU0RWYWx1ZShWTGQsIDIpOworICAgICAgLy8gSWYgaXQncyBhIHZsZDMsIGZvcm0gYSBxdWFkIEQtcmVnaXN0ZXIgYnV0IGRpc2NhcmQgdGhlIGxhc3QgcGFydC4KKyAgICAgIFNEVmFsdWUgVjMgPSAoTnVtVmVjcyA9PSAzKQorICAgICAgICAgID8gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGLGRsLFZUKSwgMCkKKyAgICAgICAgICA6IFNEVmFsdWUoVkxkLCAzKTsKKyAgICAgIFJlZ1NlcSA9IFNEVmFsdWUoUXVhZERSZWdzKE1WVDo6djRpNjQsIFYwLCBWMSwgVjIsIFYzKSwgMCk7CisgICAgfQorCisgICAgYXNzZXJ0KEFSTTo6ZHN1Yl83ID09IEFSTTo6ZHN1Yl8wKzcgJiYgIlVuZXhwZWN0ZWQgc3VicmVnIG51bWJlcmluZyIpOworICAgIGZvciAodW5zaWduZWQgVmVjID0gMDsgVmVjIDwgTnVtVmVjczsgKytWZWMpIHsKKyAgICAgIFNEVmFsdWUgRCA9IEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhBUk06OmRzdWJfMCtWZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIFZULCBSZWdTZXEpOworICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCBWZWMpLCBEKTsKKyAgICB9CisgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCBOdW1WZWNzKSwgU0RWYWx1ZShWTGQsIE51bVZlY3MpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIEVWVCBSZWdWVCA9IEdldE5FT05TdWJyZWdWVChWVCk7CisgIGlmIChOdW1WZWNzIDw9IDIpIHsKKyAgICAvLyBRdWFkIHJlZ2lzdGVycyBhcmUgZGlyZWN0bHkgc3VwcG9ydGVkIGZvciBWTEQxIGFuZCBWTEQyLAorICAgIC8vIGxvYWRpbmcgcGFpcnMgb2YgRCByZWdzLgorICAgIHVuc2lnbmVkIE9wYyA9IFFPcGNvZGVzMFtPcGNvZGVJbmRleF07CisgICAgY29uc3QgU0RWYWx1ZSBPcHNbXSA9IHsgTWVtQWRkciwgQWxpZ24sIFByZWQsIFJlZzAsIENoYWluIH07CisgICAgc3RkOjp2ZWN0b3I8RVZUPiBSZXNUeXMoMiAqIE51bVZlY3MsIFJlZ1ZUKTsKKyAgICBSZXNUeXMucHVzaF9iYWNrKE1WVDo6T3RoZXIpOworICAgIFNETm9kZSAqVkxkID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBSZXNUeXMsIE9wcywgNSk7CisgICAgQ2hhaW4gPSBTRFZhbHVlKFZMZCwgMiAqIE51bVZlY3MpOworCisgICAgLy8gQ29tYmluZSB0aGUgZXZlbiBhbmQgb2RkIHN1YnJlZ3MgdG8gcHJvZHVjZSB0aGUgcmVzdWx0LgorICAgIGlmIChOdW1WZWNzID09IDEpIHsKKyAgICAgIFNETm9kZSAqUSA9IFBhaXJEUmVncyhWVCwgU0RWYWx1ZShWTGQsIDApLCBTRFZhbHVlKFZMZCwgMSkpOworICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCAwKSwgU0RWYWx1ZShRLCAwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNEVmFsdWUgUVEgPSBTRFZhbHVlKFF1YWREUmVncyhNVlQ6OnY0aTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVkxkLCAwKSwgU0RWYWx1ZShWTGQsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVkxkLCAyKSwgU0RWYWx1ZShWTGQsIDMpKSwgMCk7CisgICAgICBTRFZhbHVlIFEwID0gQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6cXN1Yl8wLCBkbCwgVlQsIFFRKTsKKyAgICAgIFNEVmFsdWUgUTEgPSBDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoQVJNOjpxc3ViXzEsIGRsLCBWVCwgUVEpOworICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCAwKSwgUTApOworICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCAxKSwgUTEpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBPdGhlcndpc2UsIHF1YWQgcmVnaXN0ZXJzIGFyZSBsb2FkZWQgd2l0aCB0d28gc2VwYXJhdGUgaW5zdHJ1Y3Rpb25zLAorICAgIC8vIHdoZXJlIG9uZSBsb2FkcyB0aGUgZXZlbiByZWdpc3RlcnMgYW5kIHRoZSBvdGhlciBsb2FkcyB0aGUgb2RkIHJlZ2lzdGVycy4KKworICAgIHN0ZDo6dmVjdG9yPEVWVD4gUmVzVHlzKE51bVZlY3MsIFJlZ1ZUKTsKKyAgICBSZXNUeXMucHVzaF9iYWNrKE1lbUFkZHIuZ2V0VmFsdWVUeXBlKCkpOworICAgIFJlc1R5cy5wdXNoX2JhY2soTVZUOjpPdGhlcik7CisKKyAgICAvLyBMb2FkIHRoZSBldmVuIHN1YnJlZ3MuCisgICAgdW5zaWduZWQgT3BjID0gUU9wY29kZXMwW09wY29kZUluZGV4XTsKKyAgICBjb25zdCBTRFZhbHVlIE9wc0FbXSA9IHsgTWVtQWRkciwgQWxpZ24sIFJlZzAsIFByZWQsIFJlZzAsIENoYWluIH07CisgICAgU0ROb2RlICpWTGRBID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBSZXNUeXMsIE9wc0EsIDYpOworICAgIENoYWluID0gU0RWYWx1ZShWTGRBLCBOdW1WZWNzKzEpOworCisgICAgLy8gTG9hZCB0aGUgb2RkIHN1YnJlZ3MuCisgICAgT3BjID0gUU9wY29kZXMxW09wY29kZUluZGV4XTsKKyAgICBjb25zdCBTRFZhbHVlIE9wc0JbXSA9IHsgU0RWYWx1ZShWTGRBLCBOdW1WZWNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ24sIFJlZzAsIFByZWQsIFJlZzAsIENoYWluIH07CisgICAgU0ROb2RlICpWTGRCID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBSZXNUeXMsIE9wc0IsIDYpOworICAgIENoYWluID0gU0RWYWx1ZShWTGRCLCBOdW1WZWNzKzEpOworCisgICAgU0RWYWx1ZSBWMCA9IFNEVmFsdWUoVkxkQSwgMCk7CisgICAgU0RWYWx1ZSBWMSA9IFNEVmFsdWUoVkxkQiwgMCk7CisgICAgU0RWYWx1ZSBWMiA9IFNEVmFsdWUoVkxkQSwgMSk7CisgICAgU0RWYWx1ZSBWMyA9IFNEVmFsdWUoVkxkQiwgMSk7CisgICAgU0RWYWx1ZSBWNCA9IFNEVmFsdWUoVkxkQSwgMik7CisgICAgU0RWYWx1ZSBWNSA9IFNEVmFsdWUoVkxkQiwgMik7CisgICAgU0RWYWx1ZSBWNiA9IChOdW1WZWNzID09IDMpCisgICAgICA/IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRixkbCxSZWdWVCksIDApCisgICAgICA6IFNEVmFsdWUoVkxkQSwgMyk7CisgICAgU0RWYWx1ZSBWNyA9IChOdW1WZWNzID09IDMpCisgICAgICA/IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRixkbCxSZWdWVCksIDApCisgICAgICA6IFNEVmFsdWUoVkxkQiwgMyk7CisgICAgU0RWYWx1ZSBSZWdTZXEgPSBTRFZhbHVlKE9jdG9EUmVncyhNVlQ6OnY4aTY0LCBWMCwgVjEsIFYyLCBWMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0LCBWNSwgVjYsIFY3KSwgMCk7CisKKyAgICAvLyBFeHRyYWN0IG91dCB0aGUgMyAvIDQgUSByZWdpc3RlcnMuCisgICAgYXNzZXJ0KEFSTTo6cXN1Yl8zID09IEFSTTo6cXN1Yl8wKzMgJiYgIlVuZXhwZWN0ZWQgc3VicmVnIG51bWJlcmluZyIpOworICAgIGZvciAodW5zaWduZWQgVmVjID0gMDsgVmVjIDwgTnVtVmVjczsgKytWZWMpIHsKKyAgICAgIFNEVmFsdWUgUSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhBUk06OnFzdWJfMCtWZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIFZULCBSZWdTZXEpOworICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCBWZWMpLCBRKTsKKyAgICB9CisgIH0KKyAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCBOdW1WZWNzKSwgQ2hhaW4pOworICByZXR1cm4gTlVMTDsKK30KKworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdFZTVChTRE5vZGUgKk4sIHVuc2lnbmVkIE51bVZlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpET3Bjb2RlcywgdW5zaWduZWQgKlFPcGNvZGVzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKlFPcGNvZGVzMSkgeworICBhc3NlcnQoTnVtVmVjcyA+PSAxICYmIE51bVZlY3MgPD0gNCAmJiAiVlNUIE51bVZlY3Mgb3V0LW9mLXJhbmdlIik7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBTRFZhbHVlIE1lbUFkZHIsIEFsaWduOworICBpZiAoIVNlbGVjdEFkZHJNb2RlNihOLCBOLT5nZXRPcGVyYW5kKDIpLCBNZW1BZGRyLCBBbGlnbikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgU0RWYWx1ZSBDaGFpbiA9IE4tPmdldE9wZXJhbmQoMCk7CisgIEVWVCBWVCA9IE4tPmdldE9wZXJhbmQoMykuZ2V0VmFsdWVUeXBlKCk7CisgIGJvb2wgaXM2NEJpdFZlY3RvciA9IFZULmlzNjRCaXRWZWN0b3IoKTsKKworICB1bnNpZ25lZCBPcGNvZGVJbmRleDsKKyAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoInVuaGFuZGxlZCB2c3QgdHlwZSIpOworICAgIC8vIERvdWJsZS1yZWdpc3RlciBvcGVyYXRpb25zOgorICBjYXNlIE1WVDo6djhpODogIE9wY29kZUluZGV4ID0gMDsgYnJlYWs7CisgIGNhc2UgTVZUOjp2NGkxNjogT3Bjb2RlSW5kZXggPSAxOyBicmVhazsKKyAgY2FzZSBNVlQ6OnYyZjMyOgorICBjYXNlIE1WVDo6djJpMzI6IE9wY29kZUluZGV4ID0gMjsgYnJlYWs7CisgIGNhc2UgTVZUOjp2MWk2NDogT3Bjb2RlSW5kZXggPSAzOyBicmVhazsKKyAgICAvLyBRdWFkLXJlZ2lzdGVyIG9wZXJhdGlvbnM6CisgIGNhc2UgTVZUOjp2MTZpODogT3Bjb2RlSW5kZXggPSAwOyBicmVhazsKKyAgY2FzZSBNVlQ6OnY4aTE2OiBPcGNvZGVJbmRleCA9IDE7IGJyZWFrOworICBjYXNlIE1WVDo6djRmMzI6CisgIGNhc2UgTVZUOjp2NGkzMjogT3Bjb2RlSW5kZXggPSAyOyBicmVhazsKKyAgY2FzZSBNVlQ6OnYyaTY0OiBPcGNvZGVJbmRleCA9IDM7CisgICAgYXNzZXJ0KE51bVZlY3MgPT0gMSAmJiAidjJpNjQgdHlwZSBvbmx5IHN1cHBvcnRlZCBmb3IgVlNUMSIpOworICAgIGJyZWFrOworICB9CisKKyAgU0RWYWx1ZSBQcmVkID0gZ2V0QUwoQ3VyREFHKTsKKyAgU0RWYWx1ZSBSZWcwID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTA+IE9wczsKKyAgT3BzLnB1c2hfYmFjayhNZW1BZGRyKTsKKyAgT3BzLnB1c2hfYmFjayhBbGlnbik7CisKKyAgaWYgKGlzNjRCaXRWZWN0b3IpIHsKKyAgICBpZiAoTnVtVmVjcyA+PSAyKSB7CisgICAgICBTRFZhbHVlIFJlZ1NlcTsKKyAgICAgIFNEVmFsdWUgVjAgPSBOLT5nZXRPcGVyYW5kKDArMyk7CisgICAgICBTRFZhbHVlIFYxID0gTi0+Z2V0T3BlcmFuZCgxKzMpOworCisgICAgICAvLyBGb3JtIGEgUkVHX1NFUVVFTkNFIHRvIGZvcmNlIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgICAgICBpZiAoTnVtVmVjcyA9PSAyKQorICAgICAgICBSZWdTZXEgPSBTRFZhbHVlKFBhaXJEUmVncyhNVlQ6OnYyaTY0LCBWMCwgVjEpLCAwKTsKKyAgICAgIGVsc2UgeworICAgICAgICBTRFZhbHVlIFYyID0gTi0+Z2V0T3BlcmFuZCgyKzMpOworICAgICAgICAvLyBJZiBpdCdzIGEgdmxkMywgZm9ybSBhIHF1YWQgRC1yZWdpc3RlciBhbmQgbGVhdmUgdGhlIGxhc3QgcGFydCBhcyAKKyAgICAgICAgLy8gYW4gdW5kZWYuCisgICAgICAgIFNEVmFsdWUgVjMgPSAoTnVtVmVjcyA9PSAzKQorICAgICAgICAgID8gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGLGRsLFZUKSwgMCkKKyAgICAgICAgICA6IE4tPmdldE9wZXJhbmQoMyszKTsKKyAgICAgICAgUmVnU2VxID0gU0RWYWx1ZShRdWFkRFJlZ3MoTVZUOjp2NGk2NCwgVjAsIFYxLCBWMiwgVjMpLCAwKTsKKyAgICAgIH0KKworICAgICAgLy8gTm93IGV4dHJhY3QgdGhlIEQgcmVnaXN0ZXJzIGJhY2sgb3V0LgorICAgICAgT3BzLnB1c2hfYmFjayhDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoQVJNOjpkc3ViXzAsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NlcSkpOworICAgICAgT3BzLnB1c2hfYmFjayhDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoQVJNOjpkc3ViXzEsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NlcSkpOworICAgICAgaWYgKE51bVZlY3MgPiAyKQorICAgICAgICBPcHMucHVzaF9iYWNrKEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhBUk06OmRzdWJfMiwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTZXEpKTsKKyAgICAgIGlmIChOdW1WZWNzID4gMykKKyAgICAgICAgT3BzLnB1c2hfYmFjayhDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoQVJNOjpkc3ViXzMsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2VxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAodW5zaWduZWQgVmVjID0gMDsgVmVjIDwgTnVtVmVjczsgKytWZWMpCisgICAgICAgIE9wcy5wdXNoX2JhY2soTi0+Z2V0T3BlcmFuZChWZWMrMykpOworICAgIH0KKyAgICBPcHMucHVzaF9iYWNrKFByZWQpOworICAgIE9wcy5wdXNoX2JhY2soUmVnMCk7IC8vIHByZWRpY2F0ZSByZWdpc3RlcgorICAgIE9wcy5wdXNoX2JhY2soQ2hhaW4pOworICAgIHVuc2lnbmVkIE9wYyA9IERPcGNvZGVzW09wY29kZUluZGV4XTsKKyAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBNVlQ6Ok90aGVyLCBPcHMuZGF0YSgpLCBOdW1WZWNzKzUpOworICB9CisKKyAgRVZUIFJlZ1ZUID0gR2V0TkVPTlN1YnJlZ1ZUKFZUKTsKKyAgaWYgKE51bVZlY3MgPD0gMikgeworICAgIC8vIFF1YWQgcmVnaXN0ZXJzIGFyZSBkaXJlY3RseSBzdXBwb3J0ZWQgZm9yIFZTVDEgYW5kIFZTVDIsCisgICAgLy8gc3RvcmluZyBwYWlycyBvZiBEIHJlZ3MuCisgICAgdW5zaWduZWQgT3BjID0gUU9wY29kZXMwW09wY29kZUluZGV4XTsKKyAgICBpZiAoTnVtVmVjcyA9PSAyKSB7CisgICAgICAvLyBGaXJzdCBleHRyYWN0IHRoZSBwYWlyIG9mIFEgcmVnaXN0ZXJzLgorICAgICAgU0RWYWx1ZSBRMCA9IE4tPmdldE9wZXJhbmQoMyk7CisgICAgICBTRFZhbHVlIFExID0gTi0+Z2V0T3BlcmFuZCg0KTsKKworICAgICAgLy8gRm9ybSBhIFFRIHJlZ2lzdGVyLgorICAgICAgU0RWYWx1ZSBRUSA9IFNEVmFsdWUoUGFpclFSZWdzKE1WVDo6djRpNjQsIFEwLCBRMSksIDApOworCisgICAgICAvLyBOb3cgZXh0cmFjdCB0aGUgRCByZWdpc3RlcnMgYmFjayBvdXQuCisgICAgICBPcHMucHVzaF9iYWNrKEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhBUk06OmRzdWJfMCwgZGwsIFJlZ1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVEpKTsKKyAgICAgIE9wcy5wdXNoX2JhY2soQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6ZHN1Yl8xLCBkbCwgUmVnVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUSkpOworICAgICAgT3BzLnB1c2hfYmFjayhDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoQVJNOjpkc3ViXzIsIGRsLCBSZWdWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFRKSk7CisgICAgICBPcHMucHVzaF9iYWNrKEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhBUk06OmRzdWJfMywgZGwsIFJlZ1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVEpKTsKKyAgICAgIE9wcy5wdXNoX2JhY2soUHJlZCk7CisgICAgICBPcHMucHVzaF9iYWNrKFJlZzApOyAvLyBwcmVkaWNhdGUgcmVnaXN0ZXIKKyAgICAgIE9wcy5wdXNoX2JhY2soQ2hhaW4pOworICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3BjLCBkbCwgTVZUOjpPdGhlciwgT3BzLmRhdGEoKSwgNSArIDQpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHVuc2lnbmVkIFZlYyA9IDA7IFZlYyA8IE51bVZlY3M7ICsrVmVjKSB7CisgICAgICAgIE9wcy5wdXNoX2JhY2soQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6ZHN1Yl8wLCBkbCwgUmVnVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoVmVjKzMpKSk7CisgICAgICAgIE9wcy5wdXNoX2JhY2soQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6ZHN1Yl8xLCBkbCwgUmVnVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoVmVjKzMpKSk7CisgICAgICB9CisgICAgICBPcHMucHVzaF9iYWNrKFByZWQpOworICAgICAgT3BzLnB1c2hfYmFjayhSZWcwKTsgLy8gcHJlZGljYXRlIHJlZ2lzdGVyCisgICAgICBPcHMucHVzaF9iYWNrKENoYWluKTsKKyAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wYywgZGwsIE1WVDo6T3RoZXIsIE9wcy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICsgMiAqIE51bVZlY3MpOworICAgIH0KKyAgfQorCisgIC8vIE90aGVyd2lzZSwgcXVhZCByZWdpc3RlcnMgYXJlIHN0b3JlZCB3aXRoIHR3byBzZXBhcmF0ZSBpbnN0cnVjdGlvbnMsCisgIC8vIHdoZXJlIG9uZSBzdG9yZXMgdGhlIGV2ZW4gcmVnaXN0ZXJzIGFuZCB0aGUgb3RoZXIgc3RvcmVzIHRoZSBvZGQgcmVnaXN0ZXJzLgorCisgIC8vIEZvcm0gdGhlIFFRUVEgUkVHX1NFUVVFTkNFLgorICBTRFZhbHVlIFZbOF07CisgIGZvciAodW5zaWduZWQgVmVjID0gMCwgaSA9IDA7IFZlYyA8IE51bVZlY3M7ICsrVmVjLCBpKz0yKSB7CisgICAgVltpXSAgID0gQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6ZHN1Yl8wLCBkbCwgUmVnVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoVmVjKzMpKTsKKyAgICBWW2krMV0gPSBDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoQVJNOjpkc3ViXzEsIGRsLCBSZWdWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZChWZWMrMykpOworICB9CisgIGlmIChOdW1WZWNzID09IDMpCisgICAgVls2XSA9IFZbN10gPSBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIFJlZ1ZUKSwgMCk7CisKKyAgU0RWYWx1ZSBSZWdTZXEgPSBTRFZhbHVlKE9jdG9EUmVncyhNVlQ6OnY4aTY0LCBWWzBdLCBWWzFdLCBWWzJdLCBWWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZbNF0sIFZbNV0sIFZbNl0sIFZbN10pLCAwKTsKKworICAvLyBTdG9yZSB0aGUgZXZlbiBEIHJlZ2lzdGVycy4KKyAgYXNzZXJ0KEFSTTo6ZHN1Yl83ID09IEFSTTo6ZHN1Yl8wKzcgJiYgIlVuZXhwZWN0ZWQgc3VicmVnIG51bWJlcmluZyIpOworICBPcHMucHVzaF9iYWNrKFJlZzApOyAvLyBwb3N0LWFjY2VzcyBhZGRyZXNzIG9mZnNldAorICBmb3IgKHVuc2lnbmVkIFZlYyA9IDA7IFZlYyA8IE51bVZlY3M7ICsrVmVjKQorICAgIE9wcy5wdXNoX2JhY2soQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6ZHN1Yl8wK1ZlYyoyLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdWVCwgUmVnU2VxKSk7CisgIE9wcy5wdXNoX2JhY2soUHJlZCk7CisgIE9wcy5wdXNoX2JhY2soUmVnMCk7IC8vIHByZWRpY2F0ZSByZWdpc3RlcgorICBPcHMucHVzaF9iYWNrKENoYWluKTsKKyAgdW5zaWduZWQgT3BjID0gUU9wY29kZXMwW09wY29kZUluZGV4XTsKKyAgU0ROb2RlICpWU3RBID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBNZW1BZGRyLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsIE9wcy5kYXRhKCksIE51bVZlY3MrNik7CisgIENoYWluID0gU0RWYWx1ZShWU3RBLCAxKTsKKworICAvLyBTdG9yZSB0aGUgb2RkIEQgcmVnaXN0ZXJzLgorICBPcHNbMF0gPSBTRFZhbHVlKFZTdEEsIDApOyAvLyBNZW1BZGRyCisgIGZvciAodW5zaWduZWQgVmVjID0gMDsgVmVjIDwgTnVtVmVjczsgKytWZWMpCisgICAgT3BzW1ZlYyszXSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhBUk06OmRzdWJfMStWZWMqMiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdWVCwgUmVnU2VxKTsKKyAgT3BzW051bVZlY3MrNV0gPSBDaGFpbjsKKyAgT3BjID0gUU9wY29kZXMxW09wY29kZUluZGV4XTsKKyAgU0ROb2RlICpWU3RCID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBNZW1BZGRyLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsIE9wcy5kYXRhKCksIE51bVZlY3MrNik7CisgIENoYWluID0gU0RWYWx1ZShWU3RCLCAxKTsKKyAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCAwKSwgQ2hhaW4pOworICByZXR1cm4gTlVMTDsKK30KKworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdFZMRFNUTGFuZShTRE5vZGUgKk4sIGJvb2wgSXNMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1WZWNzLCB1bnNpZ25lZCAqRE9wY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpRT3Bjb2RlczAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpRT3Bjb2RlczEpIHsKKyAgYXNzZXJ0KE51bVZlY3MgPj0yICYmIE51bVZlY3MgPD0gNCAmJiAiVkxEU1RMYW5lIE51bVZlY3Mgb3V0LW9mLXJhbmdlIik7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBTRFZhbHVlIE1lbUFkZHIsIEFsaWduOworICBpZiAoIVNlbGVjdEFkZHJNb2RlNihOLCBOLT5nZXRPcGVyYW5kKDIpLCBNZW1BZGRyLCBBbGlnbikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgU0RWYWx1ZSBDaGFpbiA9IE4tPmdldE9wZXJhbmQoMCk7CisgIHVuc2lnbmVkIExhbmUgPQorICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoTnVtVmVjcyszKSktPmdldFpFeHRWYWx1ZSgpOworICBFVlQgVlQgPSBJc0xvYWQgPyBOLT5nZXRWYWx1ZVR5cGUoMCkgOiBOLT5nZXRPcGVyYW5kKDMpLmdldFZhbHVlVHlwZSgpOworICBib29sIGlzNjRCaXRWZWN0b3IgPSBWVC5pczY0Qml0VmVjdG9yKCk7CisKKyAgLy8gUXVhZCByZWdpc3RlcnMgYXJlIGhhbmRsZWQgYnkgbG9hZC9zdG9yZSBvZiBzdWJyZWdzLiBGaW5kIHRoZSBzdWJyZWcgaW5mby4KKyAgdW5zaWduZWQgTnVtRWx0cyA9IDA7CisgIGJvb2wgRXZlbiA9IGZhbHNlOworICBFVlQgUmVnVlQgPSBWVDsKKyAgaWYgKCFpczY0Qml0VmVjdG9yKSB7CisgICAgUmVnVlQgPSBHZXRORU9OU3VicmVnVlQoVlQpOworICAgIE51bUVsdHMgPSBSZWdWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgIEV2ZW4gPSBMYW5lIDwgTnVtRWx0czsKKyAgfQorCisgIHVuc2lnbmVkIE9wY29kZUluZGV4OworICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgidW5oYW5kbGVkIHZsZC92c3QgbGFuZSB0eXBlIik7CisgICAgLy8gRG91YmxlLXJlZ2lzdGVyIG9wZXJhdGlvbnM6CisgIGNhc2UgTVZUOjp2OGk4OiAgT3Bjb2RlSW5kZXggPSAwOyBicmVhazsKKyAgY2FzZSBNVlQ6OnY0aTE2OiBPcGNvZGVJbmRleCA9IDE7IGJyZWFrOworICBjYXNlIE1WVDo6djJmMzI6CisgIGNhc2UgTVZUOjp2MmkzMjogT3Bjb2RlSW5kZXggPSAyOyBicmVhazsKKyAgICAvLyBRdWFkLXJlZ2lzdGVyIG9wZXJhdGlvbnM6CisgIGNhc2UgTVZUOjp2OGkxNjogT3Bjb2RlSW5kZXggPSAwOyBicmVhazsKKyAgY2FzZSBNVlQ6OnY0ZjMyOgorICBjYXNlIE1WVDo6djRpMzI6IE9wY29kZUluZGV4ID0gMTsgYnJlYWs7CisgIH0KKworICBTRFZhbHVlIFByZWQgPSBnZXRBTChDdXJEQUcpOworICBTRFZhbHVlIFJlZzAgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKTsKKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxMD4gT3BzOworICBPcHMucHVzaF9iYWNrKE1lbUFkZHIpOworICBPcHMucHVzaF9iYWNrKEFsaWduKTsKKworICB1bnNpZ25lZCBPcGMgPSAwOworICBpZiAoaXM2NEJpdFZlY3RvcikgeworICAgIE9wYyA9IERPcGNvZGVzW09wY29kZUluZGV4XTsKKyAgICBTRFZhbHVlIFJlZ1NlcTsKKyAgICBTRFZhbHVlIFYwID0gTi0+Z2V0T3BlcmFuZCgwKzMpOworICAgIFNEVmFsdWUgVjEgPSBOLT5nZXRPcGVyYW5kKDErMyk7CisgICAgaWYgKE51bVZlY3MgPT0gMikgeworICAgICAgUmVnU2VxID0gU0RWYWx1ZShQYWlyRFJlZ3MoTVZUOjp2Mmk2NCwgVjAsIFYxKSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNEVmFsdWUgVjIgPSBOLT5nZXRPcGVyYW5kKDIrMyk7CisgICAgICBTRFZhbHVlIFYzID0gKE51bVZlY3MgPT0gMykKKyAgICAgICAgPyBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYsZGwsVlQpLCAwKQorICAgICAgICA6IE4tPmdldE9wZXJhbmQoMyszKTsKKyAgICAgIFJlZ1NlcSA9IFNEVmFsdWUoUXVhZERSZWdzKE1WVDo6djRpNjQsIFYwLCBWMSwgVjIsIFYzKSwgMCk7CisgICAgfQorCisgICAgLy8gTm93IGV4dHJhY3QgdGhlIEQgcmVnaXN0ZXJzIGJhY2sgb3V0LgorICAgIE9wcy5wdXNoX2JhY2soQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6ZHN1Yl8wLCBkbCwgVlQsIFJlZ1NlcSkpOworICAgIE9wcy5wdXNoX2JhY2soQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6ZHN1Yl8xLCBkbCwgVlQsIFJlZ1NlcSkpOworICAgIGlmIChOdW1WZWNzID4gMikKKyAgICAgIE9wcy5wdXNoX2JhY2soQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6ZHN1Yl8yLCBkbCwgVlQsUmVnU2VxKSk7CisgICAgaWYgKE51bVZlY3MgPiAzKQorICAgICAgT3BzLnB1c2hfYmFjayhDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoQVJNOjpkc3ViXzMsIGRsLCBWVCxSZWdTZXEpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGxvYWRpbmcgdGhlIGV2ZW4gb3Igb2RkIHN1YnJlZyBvZiBhIFEgcmVnaXN0ZXIuCisgICAgaWYgKExhbmUgPCBOdW1FbHRzKSB7CisgICAgICBPcGMgPSBRT3Bjb2RlczBbT3Bjb2RlSW5kZXhdOworICAgIH0gZWxzZSB7CisgICAgICBMYW5lIC09IE51bUVsdHM7CisgICAgICBPcGMgPSBRT3Bjb2RlczFbT3Bjb2RlSW5kZXhdOworICAgIH0KKworICAgIFNEVmFsdWUgUmVnU2VxOworICAgIFNEVmFsdWUgVjAgPSBOLT5nZXRPcGVyYW5kKDArMyk7CisgICAgU0RWYWx1ZSBWMSA9IE4tPmdldE9wZXJhbmQoMSszKTsKKyAgICBpZiAoTnVtVmVjcyA9PSAyKSB7CisgICAgICBSZWdTZXEgPSBTRFZhbHVlKFBhaXJRUmVncyhNVlQ6OnY0aTY0LCBWMCwgVjEpLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgU0RWYWx1ZSBWMiA9IE4tPmdldE9wZXJhbmQoMiszKTsKKyAgICAgIFNEVmFsdWUgVjMgPSAoTnVtVmVjcyA9PSAzKQorICAgICAgICA/IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRixkbCxWVCksIDApCisgICAgICAgIDogTi0+Z2V0T3BlcmFuZCgzKzMpOworICAgICAgUmVnU2VxID0gU0RWYWx1ZShRdWFkUVJlZ3MoTVZUOjp2OGk2NCwgVjAsIFYxLCBWMiwgVjMpLCAwKTsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IHRoZSBzdWJyZWdzIG9mIHRoZSBpbnB1dCB2ZWN0b3IuCisgICAgdW5zaWduZWQgU3ViSWR4ID0gRXZlbiA/IEFSTTo6ZHN1Yl8wIDogQVJNOjpkc3ViXzE7CisgICAgZm9yICh1bnNpZ25lZCBWZWMgPSAwOyBWZWMgPCBOdW1WZWNzOyArK1ZlYykKKyAgICAgIE9wcy5wdXNoX2JhY2soQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKFN1YklkeCtWZWMqMiwgZGwsIFJlZ1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2VxKSk7CisgIH0KKyAgT3BzLnB1c2hfYmFjayhnZXRJMzJJbW0oTGFuZSkpOworICBPcHMucHVzaF9iYWNrKFByZWQpOworICBPcHMucHVzaF9iYWNrKFJlZzApOworICBPcHMucHVzaF9iYWNrKENoYWluKTsKKworICBpZiAoIUlzTG9hZCkKKyAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBNVlQ6Ok90aGVyLCBPcHMuZGF0YSgpLCBOdW1WZWNzKzYpOworCisgIHN0ZDo6dmVjdG9yPEVWVD4gUmVzVHlzKE51bVZlY3MsIFJlZ1ZUKTsKKyAgUmVzVHlzLnB1c2hfYmFjayhNVlQ6Ok90aGVyKTsKKyAgU0ROb2RlICpWTGRMbiA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3BjLCBkbCwgUmVzVHlzLCBPcHMuZGF0YSgpLE51bVZlY3MrNik7CisKKyAgLy8gRm9ybSBhIFJFR19TRVFVRU5DRSB0byBmb3JjZSByZWdpc3RlciBhbGxvY2F0aW9uLgorICBTRFZhbHVlIFJlZ1NlcTsKKyAgaWYgKGlzNjRCaXRWZWN0b3IpIHsKKyAgICBTRFZhbHVlIFYwID0gU0RWYWx1ZShWTGRMbiwgMCk7CisgICAgU0RWYWx1ZSBWMSA9IFNEVmFsdWUoVkxkTG4sIDEpOworICAgIGlmIChOdW1WZWNzID09IDIpIHsKKyAgICAgIFJlZ1NlcSA9IFNEVmFsdWUoUGFpckRSZWdzKE1WVDo6djJpNjQsIFYwLCBWMSksIDApOworICAgIH0gZWxzZSB7CisgICAgICBTRFZhbHVlIFYyID0gU0RWYWx1ZShWTGRMbiwgMik7CisgICAgICAvLyBJZiBpdCdzIGEgdmxkMywgZm9ybSBhIHF1YWQgRC1yZWdpc3RlciBidXQgZGlzY2FyZCB0aGUgbGFzdCBwYXJ0LgorICAgICAgU0RWYWx1ZSBWMyA9IChOdW1WZWNzID09IDMpCisgICAgICAgID8gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGLGRsLFZUKSwgMCkKKyAgICAgICAgOiBTRFZhbHVlKFZMZExuLCAzKTsKKyAgICAgIFJlZ1NlcSA9IFNEVmFsdWUoUXVhZERSZWdzKE1WVDo6djRpNjQsIFYwLCBWMSwgVjIsIFYzKSwgMCk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIEZvciAxMjgtYml0IHZlY3RvcnMsIHRha2UgdGhlIDY0LWJpdCByZXN1bHRzIG9mIHRoZSBsb2FkIGFuZCBpbnNlcnQKKyAgICAvLyB0aGVtIGFzIHN1YnJlZ3MgaW50byB0aGUgcmVzdWx0LgorICAgIFNEVmFsdWUgVls4XTsKKyAgICBmb3IgKHVuc2lnbmVkIFZlYyA9IDAsIGkgPSAwOyBWZWMgPCBOdW1WZWNzOyArK1ZlYywgaSs9MikgeworICAgICAgaWYgKEV2ZW4pIHsKKyAgICAgICAgVltpXSAgID0gU0RWYWx1ZShWTGRMbiwgVmVjKTsKKyAgICAgICAgVltpKzFdID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIFJlZ1ZUKSwgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBWW2ldICAgPSBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCwgUmVnVlQpLCAwKTsKKyAgICAgICAgVltpKzFdID0gU0RWYWx1ZShWTGRMbiwgVmVjKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKE51bVZlY3MgPT0gMykKKyAgICAgIFZbNl0gPSBWWzddID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIFJlZ1ZUKSwgMCk7CisKKyAgICBpZiAoTnVtVmVjcyA9PSAyKQorICAgICAgUmVnU2VxID0gU0RWYWx1ZShRdWFkRFJlZ3MoTVZUOjp2NGk2NCwgVlswXSwgVlsxXSwgVlsyXSwgVlszXSksIDApOworICAgIGVsc2UKKyAgICAgIFJlZ1NlcSA9IFNEVmFsdWUoT2N0b0RSZWdzKE1WVDo6djhpNjQsIFZbMF0sIFZbMV0sIFZbMl0sIFZbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWWzRdLCBWWzVdLCBWWzZdLCBWWzddKSwgMCk7CisgIH0KKworICBhc3NlcnQoQVJNOjpkc3ViXzcgPT0gQVJNOjpkc3ViXzArNyAmJiAiVW5leHBlY3RlZCBzdWJyZWcgbnVtYmVyaW5nIik7CisgIGFzc2VydChBUk06OnFzdWJfMyA9PSBBUk06OnFzdWJfMCszICYmICJVbmV4cGVjdGVkIHN1YnJlZyBudW1iZXJpbmciKTsKKyAgdW5zaWduZWQgU3ViSWR4ID0gaXM2NEJpdFZlY3RvciA/IEFSTTo6ZHN1Yl8wIDogQVJNOjpxc3ViXzA7CisgIGZvciAodW5zaWduZWQgVmVjID0gMDsgVmVjIDwgTnVtVmVjczsgKytWZWMpCisgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCBWZWMpLAorICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhTdWJJZHgrVmVjLCBkbCwgVlQsIFJlZ1NlcSkpOworICBSZXBsYWNlVXNlcyhTRFZhbHVlKE4sIE51bVZlY3MpLCBTRFZhbHVlKFZMZExuLCBOdW1WZWNzKSk7CisgIHJldHVybiBOVUxMOworfQorCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6U2VsZWN0VlRCTChTRE5vZGUgKk4sIGJvb2wgSXNFeHQsIHVuc2lnbmVkIE51bVZlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGMpIHsKKyAgYXNzZXJ0KE51bVZlY3MgPj0gMiAmJiBOdW1WZWNzIDw9IDQgJiYgIlZUQkwgTnVtVmVjcyBvdXQtb2YtcmFuZ2UiKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIHVuc2lnbmVkIEZpcnN0VGJsUmVnID0gSXNFeHQgPyAyIDogMTsKKworICAvLyBGb3JtIGEgUkVHX1NFUVVFTkNFIHRvIGZvcmNlIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIFNEVmFsdWUgUmVnU2VxOworICBTRFZhbHVlIFYwID0gTi0+Z2V0T3BlcmFuZChGaXJzdFRibFJlZyArIDApOworICBTRFZhbHVlIFYxID0gTi0+Z2V0T3BlcmFuZChGaXJzdFRibFJlZyArIDEpOworICBpZiAoTnVtVmVjcyA9PSAyKQorICAgIFJlZ1NlcSA9IFNEVmFsdWUoUGFpckRSZWdzKE1WVDo6djE2aTgsIFYwLCBWMSksIDApOworICBlbHNlIHsKKyAgICBTRFZhbHVlIFYyID0gTi0+Z2V0T3BlcmFuZChGaXJzdFRibFJlZyArIDIpOworICAgIC8vIElmIGl0J3MgYSB2dGJsMywgZm9ybSBhIHF1YWQgRC1yZWdpc3RlciBhbmQgbGVhdmUgdGhlIGxhc3QgcGFydCBhcyAKKyAgICAvLyBhbiB1bmRlZi4KKyAgICBTRFZhbHVlIFYzID0gKE51bVZlY3MgPT0gMykKKyAgICAgID8gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGLCBkbCwgVlQpLCAwKQorICAgICAgOiBOLT5nZXRPcGVyYW5kKEZpcnN0VGJsUmVnICsgMyk7CisgICAgUmVnU2VxID0gU0RWYWx1ZShRdWFkRFJlZ3MoTVZUOjp2NGk2NCwgVjAsIFYxLCBWMiwgVjMpLCAwKTsKKyAgfQorCisgIC8vIE5vdyBleHRyYWN0IHRoZSBEIHJlZ2lzdGVycyBiYWNrIG91dC4KKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgNj4gT3BzOworICBpZiAoSXNFeHQpCisgICAgT3BzLnB1c2hfYmFjayhOLT5nZXRPcGVyYW5kKDEpKTsKKyAgT3BzLnB1c2hfYmFjayhDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoQVJNOjpkc3ViXzAsIGRsLCBWVCwgUmVnU2VxKSk7CisgIE9wcy5wdXNoX2JhY2soQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKEFSTTo6ZHN1Yl8xLCBkbCwgVlQsIFJlZ1NlcSkpOworICBpZiAoTnVtVmVjcyA+IDIpCisgICAgT3BzLnB1c2hfYmFjayhDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoQVJNOjpkc3ViXzIsIGRsLCBWVCwgUmVnU2VxKSk7CisgIGlmIChOdW1WZWNzID4gMykKKyAgICBPcHMucHVzaF9iYWNrKEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhBUk06OmRzdWJfMywgZGwsIFZULCBSZWdTZXEpKTsKKworICBPcHMucHVzaF9iYWNrKE4tPmdldE9wZXJhbmQoRmlyc3RUYmxSZWcgKyBOdW1WZWNzKSk7CisgIE9wcy5wdXNoX2JhY2soZ2V0QUwoQ3VyREFHKSk7IC8vIHByZWRpY2F0ZQorICBPcHMucHVzaF9iYWNrKEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgTVZUOjppMzIpKTsgLy8gcHJlZGljYXRlIHJlZ2lzdGVyCisgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wYywgZGwsIFZULCBPcHMuZGF0YSgpLCBPcHMuc2l6ZSgpKTsKK30KKworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdFY2VDJCaXRmaWVsZEV4dHJhY3RPcChTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTaWduZWQpIHsKKyAgaWYgKCFTdWJ0YXJnZXQtPmhhc1Y2VDJPcHMoKSkKKyAgICByZXR1cm4gTlVMTDsKKworICB1bnNpZ25lZCBPcGMgPSBpc1NpZ25lZCA/IChTdWJ0YXJnZXQtPmlzVGh1bWIoKSA/IEFSTTo6dDJTQkZYIDogQVJNOjpTQkZYKQorICAgIDogKFN1YnRhcmdldC0+aXNUaHVtYigpID8gQVJNOjp0MlVCRlggOiBBUk06OlVCRlgpOworCisKKyAgLy8gRm9yIHVuc2lnbmVkIGV4dHJhY3RzLCBjaGVjayBmb3IgYSBzaGlmdCByaWdodCBhbmQgbWFzaworICB1bnNpZ25lZCBBbmRfaW1tID0gMDsKKyAgaWYgKE4tPmdldE9wY29kZSgpID09IElTRDo6QU5EKSB7CisgICAgaWYgKGlzT3BjV2l0aEludEltbWVkaWF0ZShOLCBJU0Q6OkFORCwgQW5kX2ltbSkpIHsKKworICAgICAgLy8gVGhlIGltbWVkaWF0ZSBpcyBhIG1hc2sgb2YgdGhlIGxvdyBiaXRzIGlmZiBpbW0gJiAoaW1tKzEpID09IDAKKyAgICAgIGlmIChBbmRfaW1tICYgKEFuZF9pbW0gKyAxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIHVuc2lnbmVkIFNybF9pbW0gPSAwOworICAgICAgaWYgKGlzT3BjV2l0aEludEltbWVkaWF0ZShOLT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKSwgSVNEOjpTUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNybF9pbW0pKSB7CisgICAgICAgIGFzc2VydChTcmxfaW1tID4gMCAmJiBTcmxfaW1tIDwgMzIgJiYgImJhZCBhbW91bnQgaW4gc2hpZnQgbm9kZSEiKTsKKworICAgICAgICB1bnNpZ25lZCBXaWR0aCA9IENvdW50VHJhaWxpbmdPbmVzXzMyKEFuZF9pbW0pOworICAgICAgICB1bnNpZ25lZCBMU0IgPSBTcmxfaW1tOworICAgICAgICBTRFZhbHVlIFJlZzAgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKTsKKyAgICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTi0+Z2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KExTQiwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KFdpZHRoLCBNVlQ6OmkzMiksCisgICAgICAgICAgZ2V0QUwoQ3VyREFHKSwgUmVnMCB9OworICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgT3BjLCBNVlQ6OmkzMiwgT3BzLCA1KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBPdGhlcndpc2UsIHdlJ3JlIGxvb2tpbmcgZm9yIGEgc2hpZnQgb2YgYSBzaGlmdAorICB1bnNpZ25lZCBTaGxfaW1tID0gMDsKKyAgaWYgKGlzT3BjV2l0aEludEltbWVkaWF0ZShOLT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKSwgSVNEOjpTSEwsIFNobF9pbW0pKSB7CisgICAgYXNzZXJ0KFNobF9pbW0gPiAwICYmIFNobF9pbW0gPCAzMiAmJiAiYmFkIGFtb3VudCBpbiBzaGlmdCBub2RlISIpOworICAgIHVuc2lnbmVkIFNybF9pbW0gPSAwOworICAgIGlmIChpc0ludDMySW1tZWRpYXRlKE4tPmdldE9wZXJhbmQoMSksIFNybF9pbW0pKSB7CisgICAgICBhc3NlcnQoU3JsX2ltbSA+IDAgJiYgU3JsX2ltbSA8IDMyICYmICJiYWQgYW1vdW50IGluIHNoaWZ0IG5vZGUhIik7CisgICAgICB1bnNpZ25lZCBXaWR0aCA9IDMyIC0gU3JsX2ltbTsKKyAgICAgIGludCBMU0IgPSBTcmxfaW1tIC0gU2hsX2ltbTsKKyAgICAgIGlmIChMU0IgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIFNEVmFsdWUgUmVnMCA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgTVZUOjppMzIpOworICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTi0+Z2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChMU0IsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoV2lkdGgsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFMKEN1ckRBRyksIFJlZzAgfTsKKyAgICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBPcGMsIE1WVDo6aTMyLCBPcHMsIDUpOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OgorU2VsZWN0VDJDTU9WU2hpZnRPcChTRE5vZGUgKk4sIFNEVmFsdWUgRmFsc2VWYWwsIFNEVmFsdWUgVHJ1ZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBDQ1ZhbCwgU0RWYWx1ZSBDQ1IsIFNEVmFsdWUgSW5GbGFnKSB7CisgIFNEVmFsdWUgQ1BUbXAwOworICBTRFZhbHVlIENQVG1wMTsKKyAgaWYgKFNlbGVjdFQyU2hpZnRlck9wZXJhbmRSZWcoTiwgVHJ1ZVZhbCwgQ1BUbXAwLCBDUFRtcDEpKSB7CisgICAgdW5zaWduZWQgU09WYWwgPSBjYXN0PENvbnN0YW50U0ROb2RlPihDUFRtcDEpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICB1bnNpZ25lZCBTT1NoT3AgPSBBUk1fQU06OmdldFNPUmVnU2hPcChTT1ZhbCk7CisgICAgdW5zaWduZWQgT3BjID0gMDsKKyAgICBzd2l0Y2ggKFNPU2hPcCkgeworICAgIGNhc2UgQVJNX0FNOjpsc2w6IE9wYyA9IEFSTTo6dDJNT1ZDQ2xzbDsgYnJlYWs7CisgICAgY2FzZSBBUk1fQU06OmxzcjogT3BjID0gQVJNOjp0Mk1PVkNDbHNyOyBicmVhazsKKyAgICBjYXNlIEFSTV9BTTo6YXNyOiBPcGMgPSBBUk06OnQyTU9WQ0Nhc3I7IGJyZWFrOworICAgIGNhc2UgQVJNX0FNOjpyb3I6IE9wYyA9IEFSTTo6dDJNT1ZDQ3JvcjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc29fcmVnIG9wY29kZSEiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBTRFZhbHVlIFNPU2hJbW0gPQorICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk1fQU06OmdldFNPUmVnT2Zmc2V0KFNPVmFsKSwgTVZUOjppMzIpOworICAgIFNEVmFsdWUgQ0MgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KENDVmFsLCBNVlQ6OmkzMik7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgRmFsc2VWYWwsIENQVG1wMCwgU09TaEltbSwgQ0MsIENDUiwgSW5GbGFnIH07CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIE9wYywgTVZUOjppMzIsT3BzLCA2KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OgorU2VsZWN0QVJNQ01PVlNoaWZ0T3AoU0ROb2RlICpOLCBTRFZhbHVlIEZhbHNlVmFsLCBTRFZhbHVlIFRydWVWYWwsCisgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Q29uZENvZGVzIENDVmFsLCBTRFZhbHVlIENDUiwgU0RWYWx1ZSBJbkZsYWcpIHsKKyAgU0RWYWx1ZSBDUFRtcDA7CisgIFNEVmFsdWUgQ1BUbXAxOworICBTRFZhbHVlIENQVG1wMjsKKyAgaWYgKFNlbGVjdFNoaWZ0ZXJPcGVyYW5kUmVnKE4sIFRydWVWYWwsIENQVG1wMCwgQ1BUbXAxLCBDUFRtcDIpKSB7CisgICAgU0RWYWx1ZSBDQyA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQ0NWYWwsIE1WVDo6aTMyKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBGYWxzZVZhbCwgQ1BUbXAwLCBDUFRtcDEsIENQVG1wMiwgQ0MsIENDUiwgSW5GbGFnIH07CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIEFSTTo6TU9WQ0NzLCBNVlQ6OmkzMiwgT3BzLCA3KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OgorU2VsZWN0VDJDTU9WU29JbW1PcChTRE5vZGUgKk4sIFNEVmFsdWUgRmFsc2VWYWwsIFNEVmFsdWUgVHJ1ZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBDQ1ZhbCwgU0RWYWx1ZSBDQ1IsIFNEVmFsdWUgSW5GbGFnKSB7CisgIENvbnN0YW50U0ROb2RlICpUID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFRydWVWYWwpOworICBpZiAoIVQpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKFByZWRpY2F0ZV90Ml9zb19pbW0oVHJ1ZVZhbC5nZXROb2RlKCkpKSB7CisgICAgU0RWYWx1ZSBUcnVlID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChULT5nZXRaRXh0VmFsdWUoKSwgTVZUOjppMzIpOworICAgIFNEVmFsdWUgQ0MgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KENDVmFsLCBNVlQ6OmkzMik7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgRmFsc2VWYWwsIFRydWUsIENDLCBDQ1IsIEluRmxhZyB9OworICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OnQyTU9WQ0NpLCBNVlQ6OmkzMiwgT3BzLCA1KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OgorU2VsZWN0QVJNQ01PVlNvSW1tT3AoU0ROb2RlICpOLCBTRFZhbHVlIEZhbHNlVmFsLCBTRFZhbHVlIFRydWVWYWwsCisgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Q29uZENvZGVzIENDVmFsLCBTRFZhbHVlIENDUiwgU0RWYWx1ZSBJbkZsYWcpIHsKKyAgQ29uc3RhbnRTRE5vZGUgKlQgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oVHJ1ZVZhbCk7CisgIGlmICghVCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoUHJlZGljYXRlX3NvX2ltbShUcnVlVmFsLmdldE5vZGUoKSkpIHsKKyAgICBTRFZhbHVlIFRydWUgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KFQtPmdldFpFeHRWYWx1ZSgpLCBNVlQ6OmkzMik7CisgICAgU0RWYWx1ZSBDQyA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQ0NWYWwsIE1WVDo6aTMyKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBGYWxzZVZhbCwgVHJ1ZSwgQ0MsIENDUiwgSW5GbGFnIH07CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6TU9WQ0NpLCBNVlQ6OmkzMiwgT3BzLCA1KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdENNT1ZPcChTRE5vZGUgKk4pIHsKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBTRFZhbHVlIEZhbHNlVmFsID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBUcnVlVmFsICA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgQ0MgPSBOLT5nZXRPcGVyYW5kKDIpOworICBTRFZhbHVlIENDUiA9IE4tPmdldE9wZXJhbmQoMyk7CisgIFNEVmFsdWUgSW5GbGFnID0gTi0+Z2V0T3BlcmFuZCg0KTsKKyAgYXNzZXJ0KENDLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpOworICBhc3NlcnQoQ0NSLmdldE9wY29kZSgpID09IElTRDo6UmVnaXN0ZXIpOworICBBUk1DQzo6Q29uZENvZGVzIENDVmFsID0KKyAgICAoQVJNQ0M6OkNvbmRDb2RlcyljYXN0PENvbnN0YW50U0ROb2RlPihDQyktPmdldFpFeHRWYWx1ZSgpOworCisgIGlmICghU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSAmJiBWVCA9PSBNVlQ6OmkzMikgeworICAgIC8vIFBhdHRlcm46IChBUk1jbW92OmkzMiBHUFI6aTMyOiRmYWxzZSwgc29fcmVnOmkzMjokdHJ1ZSwgKGltbTppMzIpOiRjYykKKyAgICAvLyBFbWl0czogKE1PVkNDczppMzIgR1BSOmkzMjokZmFsc2UsIHNvX3JlZzppMzI6JHRydWUsIChpbW06aTMyKTokY2MpCisgICAgLy8gUGF0dGVybiBjb21wbGV4aXR5ID0gMTggIGNvc3QgPSAxICBzaXplID0gMAorICAgIFNEVmFsdWUgQ1BUbXAwOworICAgIFNEVmFsdWUgQ1BUbXAxOworICAgIFNEVmFsdWUgQ1BUbXAyOworICAgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIoKSkgeworICAgICAgU0ROb2RlICpSZXMgPSBTZWxlY3RUMkNNT1ZTaGlmdE9wKE4sIEZhbHNlVmFsLCBUcnVlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDVmFsLCBDQ1IsIEluRmxhZyk7CisgICAgICBpZiAoIVJlcykKKyAgICAgICAgUmVzID0gU2VsZWN0VDJDTU9WU2hpZnRPcChOLCBUcnVlVmFsLCBGYWxzZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Z2V0T3Bwb3NpdGVDb25kaXRpb24oQ0NWYWwpLCBDQ1IsIEluRmxhZyk7CisgICAgICBpZiAoUmVzKQorICAgICAgICByZXR1cm4gUmVzOworICAgIH0gZWxzZSB7CisgICAgICBTRE5vZGUgKlJlcyA9IFNlbGVjdEFSTUNNT1ZTaGlmdE9wKE4sIEZhbHNlVmFsLCBUcnVlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbCwgQ0NSLCBJbkZsYWcpOworICAgICAgaWYgKCFSZXMpCisgICAgICAgIFJlcyA9IFNlbGVjdEFSTUNNT1ZTaGlmdE9wKE4sIFRydWVWYWwsIEZhbHNlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpnZXRPcHBvc2l0ZUNvbmRpdGlvbihDQ1ZhbCksIENDUiwgSW5GbGFnKTsKKyAgICAgIGlmIChSZXMpCisgICAgICAgIHJldHVybiBSZXM7CisgICAgfQorCisgICAgLy8gUGF0dGVybjogKEFSTWNtb3Y6aTMyIEdQUjppMzI6JGZhbHNlLAorICAgIC8vICAgICAgICAgICAgIChpbW06aTMyKTw8UDpQcmVkaWNhdGVfc29faW1tPj46JHRydWUsCisgICAgLy8gICAgICAgICAgICAgKGltbTppMzIpOiRjYykKKyAgICAvLyBFbWl0czogKE1PVkNDaTppMzIgR1BSOmkzMjokZmFsc2UsCisgICAgLy8gICAgICAgICAgIChzb19pbW06aTMyIChpbW06aTMyKTokdHJ1ZSksIChpbW06aTMyKTokY2MpCisgICAgLy8gUGF0dGVybiBjb21wbGV4aXR5ID0gMTAgIGNvc3QgPSAxICBzaXplID0gMAorICAgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIoKSkgeworICAgICAgU0ROb2RlICpSZXMgPSBTZWxlY3RUMkNNT1ZTb0ltbU9wKE4sIEZhbHNlVmFsLCBUcnVlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDVmFsLCBDQ1IsIEluRmxhZyk7CisgICAgICBpZiAoIVJlcykKKyAgICAgICAgUmVzID0gU2VsZWN0VDJDTU9WU29JbW1PcChOLCBUcnVlVmFsLCBGYWxzZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Z2V0T3Bwb3NpdGVDb25kaXRpb24oQ0NWYWwpLCBDQ1IsIEluRmxhZyk7CisgICAgICBpZiAoUmVzKQorICAgICAgICByZXR1cm4gUmVzOworICAgIH0gZWxzZSB7CisgICAgICBTRE5vZGUgKlJlcyA9IFNlbGVjdEFSTUNNT1ZTb0ltbU9wKE4sIEZhbHNlVmFsLCBUcnVlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbCwgQ0NSLCBJbkZsYWcpOworICAgICAgaWYgKCFSZXMpCisgICAgICAgIFJlcyA9IFNlbGVjdEFSTUNNT1ZTb0ltbU9wKE4sIFRydWVWYWwsIEZhbHNlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpnZXRPcHBvc2l0ZUNvbmRpdGlvbihDQ1ZhbCksIENDUiwgSW5GbGFnKTsKKyAgICAgIGlmIChSZXMpCisgICAgICAgIHJldHVybiBSZXM7CisgICAgfQorICB9CisKKyAgLy8gUGF0dGVybjogKEFSTWNtb3Y6aTMyIEdQUjppMzI6JGZhbHNlLCBHUFI6aTMyOiR0cnVlLCAoaW1tOmkzMik6JGNjKQorICAvLyBFbWl0czogKE1PVkNDcjppMzIgR1BSOmkzMjokZmFsc2UsIEdQUjppMzI6JHRydWUsIChpbW06aTMyKTokY2MpCisgIC8vIFBhdHRlcm4gY29tcGxleGl0eSA9IDYgIGNvc3QgPSAxICBzaXplID0gMAorICAvLworICAvLyBQYXR0ZXJuOiAoQVJNY21vdjppMzIgR1BSOmkzMjokZmFsc2UsIEdQUjppMzI6JHRydWUsIChpbW06aTMyKTokY2MpCisgIC8vIEVtaXRzOiAodE1PVkNDcjppMzIgR1BSOmkzMjokZmFsc2UsIEdQUjppMzI6JHRydWUsIChpbW06aTMyKTokY2MpCisgIC8vIFBhdHRlcm4gY29tcGxleGl0eSA9IDYgIGNvc3QgPSAxMSAgc2l6ZSA9IDAKKyAgLy8KKyAgLy8gQWxzbyBGQ1BZU2NjIGFuZCBGQ1BZRGNjLgorICBTRFZhbHVlIFRtcDIgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KENDVmFsLCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgT3BzW10gPSB7IEZhbHNlVmFsLCBUcnVlVmFsLCBUbXAyLCBDQ1IsIEluRmxhZyB9OworICB1bnNpZ25lZCBPcGMgPSAwOworICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlICYmICJJbGxlZ2FsIGNvbmRpdGlvbmFsIG1vdmUgdHlwZSEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBNVlQ6OmkzMjoKKyAgICBPcGMgPSBTdWJ0YXJnZXQtPmlzVGh1bWIoKQorICAgICAgPyAoU3VidGFyZ2V0LT5oYXNUaHVtYjIoKSA/IEFSTTo6dDJNT1ZDQ3IgOiBBUk06OnRNT1ZDQ3JfcHNldWRvKQorICAgICAgOiBBUk06Ok1PVkNDcjsKKyAgICBicmVhazsKKyAgY2FzZSBNVlQ6OmYzMjoKKyAgICBPcGMgPSBBUk06OlZNT1ZTY2M7CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjpmNjQ6CisgICAgT3BjID0gQVJNOjpWTU9WRGNjOworICAgIGJyZWFrOworICB9CisgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBPcGMsIFZULCBPcHMsIDUpOworfQorCitTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6U2VsZWN0Q29uY2F0VmVjdG9yKFNETm9kZSAqTikgeworICAvLyBUaGUgb25seSB0aW1lIGEgQ09OQ0FUX1ZFQ1RPUlMgb3BlcmF0aW9uIGNhbiBoYXZlIGxlZ2FsIHR5cGVzIGlzIHdoZW4KKyAgLy8gdHdvIDY0LWJpdCB2ZWN0b3JzIGFyZSBjb25jYXRlbmF0ZWQgdG8gYSAxMjgtYml0IHZlY3Rvci4KKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBpZiAoIVZULmlzMTI4Qml0VmVjdG9yKCkgfHwgTi0+Z2V0TnVtT3BlcmFuZHMoKSAhPSAyKQorICAgIGxsdm1fdW5yZWFjaGFibGUoInVuZXhwZWN0ZWQgQ09OQ0FUX1ZFQ1RPUlMiKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIFYwID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBWMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgU3ViUmVnMCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNOjpkc3ViXzAsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBTdWJSZWcxID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OmRzdWJfMSwgTVZUOjppMzIpOworICBjb25zdCBTRFZhbHVlIE9wc1tdID0geyBWMCwgU3ViUmVnMCwgVjEsIFN1YlJlZzEgfTsKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpSRUdfU0VRVUVOQ0UsIGRsLCBWVCwgT3BzLCA0KTsKK30KKworU0ROb2RlICpBUk1EQUdUb0RBR0lTZWw6OlNlbGVjdChTRE5vZGUgKk4pIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIGlmIChOLT5pc01hY2hpbmVPcGNvZGUoKSkKKyAgICByZXR1cm4gTlVMTDsgICAvLyBBbHJlYWR5IHNlbGVjdGVkLgorCisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpDb25zdGFudDogeworICAgIHVuc2lnbmVkIFZhbCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4pLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBib29sIFVzZUNQID0gdHJ1ZTsKKyAgICBpZiAoU3VidGFyZ2V0LT5oYXNUaHVtYjIoKSkKKyAgICAgIC8vIFRodW1iMi1hd2FyZSB0YXJnZXRzIGhhdmUgdGhlIE1PVlQgaW5zdHJ1Y3Rpb24sIHNvIGFsbCBpbW1lZGlhdGVzIGNhbgorICAgICAgLy8gYmUgZG9uZSB3aXRoIE1PViArIE1PVlQsIGF0IHdvcnN0LgorICAgICAgVXNlQ1AgPSAwOworICAgIGVsc2UgeworICAgICAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYigpKSB7CisgICAgICAgIFVzZUNQID0gKFZhbCA+IDI1NSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTU9WCisgICAgICAgICAgICAgICAgIH5WYWwgPiAyNTUgJiYgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTU9WICsgTVZOCisgICAgICAgICAgICAgICAgICFBUk1fQU06OmlzVGh1bWJJbW1TaGlmdGVkVmFsKFZhbCkpOyAgLy8gTU9WICsgTFNMCisgICAgICB9IGVsc2UKKyAgICAgICAgVXNlQ1AgPSAoQVJNX0FNOjpnZXRTT0ltbVZhbChWYWwpID09IC0xICYmICAgICAvLyBNT1YKKyAgICAgICAgICAgICAgICAgQVJNX0FNOjpnZXRTT0ltbVZhbCh+VmFsKSA9PSAtMSAmJiAgICAvLyBNVk4KKyAgICAgICAgICAgICAgICAgIUFSTV9BTTo6aXNTT0ltbVR3b1BhcnRWYWwoVmFsKSk7ICAgICAvLyB0d28gaW5zdHJzLgorICAgIH0KKworICAgIGlmIChVc2VDUCkgeworICAgICAgU0RWYWx1ZSBDUElkeCA9CisgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnRQb29sKENvbnN0YW50SW50OjpnZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50MzJUeSgqQ3VyREFHLT5nZXRDb250ZXh0KCkpLCBWYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpOworCisgICAgICBTRE5vZGUgKlJlc05vZGU7CisgICAgICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSkgeworICAgICAgICBTRFZhbHVlIFByZWQgPSBnZXRBTChDdXJEQUcpOworICAgICAgICBTRFZhbHVlIFByZWRSZWcgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKTsKKyAgICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgQ1BJZHgsIFByZWQsIFByZWRSZWcsIEN1ckRBRy0+Z2V0RW50cnlOb2RlKCkgfTsKKyAgICAgICAgUmVzTm9kZSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoQVJNOjp0TERSY3AsIGRsLCBNVlQ6OmkzMiwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCA0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7CisgICAgICAgICAgQ1BJZHgsCisgICAgICAgICAgQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMiksCisgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBNVlQ6OmkzMiksCisgICAgICAgICAgZ2V0QUwoQ3VyREFHKSwKKyAgICAgICAgICBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKSwKKyAgICAgICAgICBDdXJEQUctPmdldEVudHJ5Tm9kZSgpCisgICAgICAgIH07CisgICAgICAgIFJlc05vZGU9Q3VyREFHLT5nZXRNYWNoaW5lTm9kZShBUk06OkxEUmNwLCBkbCwgTVZUOjppMzIsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsIDYpOworICAgICAgfQorICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCAwKSwgU0RWYWx1ZShSZXNOb2RlLCAwKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBPdGhlciBjYXNlcyBhcmUgYXV0b2dlbmVyYXRlZC4KKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6RnJhbWVJbmRleDogeworICAgIC8vIFNlbGVjdHMgdG8gQUREcmkgRkksIDAgd2hpY2ggaW4gdHVybiB3aWxsIGJlY29tZSBBRERyaSBTUCwgaW1tLgorICAgIGludCBGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oTiktPmdldEluZGV4KCk7CisgICAgU0RWYWx1ZSBURkkgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRkksIFRMSS5nZXRQb2ludGVyVHkoKSk7CisgICAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkpIHsKKyAgICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBBUk06OnRBRERyU1BpLCBNVlQ6OmkzMiwgVEZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpKTsKKyAgICB9IGVsc2UgeworICAgICAgdW5zaWduZWQgT3BjID0gKChTdWJ0YXJnZXQtPmlzVGh1bWIoKSAmJiBTdWJ0YXJnZXQtPmhhc1RodW1iMigpKSA/CisgICAgICAgICAgICAgICAgICAgICAgQVJNOjp0MkFERHJpIDogQVJNOjpBRERyaSk7CisgICAgICBTRFZhbHVlIE9wc1tdID0geyBURkksIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QUwoQ3VyREFHKSwgQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKSB9OworICAgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIE9wYywgTVZUOjppMzIsIE9wcywgNSk7CisgICAgfQorICB9CisgIGNhc2UgSVNEOjpTUkw6CisgICAgaWYgKFNETm9kZSAqSSA9IFNlbGVjdFY2VDJCaXRmaWVsZEV4dHJhY3RPcChOLCBmYWxzZSkpCisgICAgICByZXR1cm4gSTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNSQToKKyAgICBpZiAoU0ROb2RlICpJID0gU2VsZWN0VjZUMkJpdGZpZWxkRXh0cmFjdE9wKE4sIHRydWUpKQorICAgICAgcmV0dXJuIEk7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpNVUw6CisgICAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkpCisgICAgICBicmVhazsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHVuc2lnbmVkIFJIU1YgPSBDLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIGlmICghUkhTVikgYnJlYWs7CisgICAgICBpZiAoaXNQb3dlck9mMl8zMihSSFNWLTEpKSB7ICAvLyAyXm4rMT8KKyAgICAgICAgdW5zaWduZWQgU2hJbW0gPSBMb2cyXzMyKFJIU1YtMSk7CisgICAgICAgIGlmIChTaEltbSA+PSAzMikKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgU0RWYWx1ZSBWID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgU2hJbW0gPSBBUk1fQU06OmdldFNPUmVnT3BjKEFSTV9BTTo6bHNsLCBTaEltbSk7CisgICAgICAgIFNEVmFsdWUgU2hJbW1PcCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoU2hJbW0sIE1WVDo6aTMyKTsKKyAgICAgICAgU0RWYWx1ZSBSZWcwID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgICAgICAgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIoKSkgeworICAgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7IFYsIFYsIFNoSW1tT3AsIGdldEFMKEN1ckRBRyksIFJlZzAsIFJlZzAgfTsKKyAgICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgQVJNOjp0MkFERHJzLCBNVlQ6OmkzMiwgT3BzLCA2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTRFZhbHVlIE9wc1tdID0geyBWLCBWLCBSZWcwLCBTaEltbU9wLCBnZXRBTChDdXJEQUcpLCBSZWcwLCBSZWcwIH07CisgICAgICAgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIEFSTTo6QUREcnMsIE1WVDo6aTMyLCBPcHMsIDcpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaXNQb3dlck9mMl8zMihSSFNWKzEpKSB7ICAvLyAyXm4tMT8KKyAgICAgICAgdW5zaWduZWQgU2hJbW0gPSBMb2cyXzMyKFJIU1YrMSk7CisgICAgICAgIGlmIChTaEltbSA+PSAzMikKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgU0RWYWx1ZSBWID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgU2hJbW0gPSBBUk1fQU06OmdldFNPUmVnT3BjKEFSTV9BTTo6bHNsLCBTaEltbSk7CisgICAgICAgIFNEVmFsdWUgU2hJbW1PcCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoU2hJbW0sIE1WVDo6aTMyKTsKKyAgICAgICAgU0RWYWx1ZSBSZWcwID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgICAgICAgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIoKSkgeworICAgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7IFYsIFYsIFNoSW1tT3AsIGdldEFMKEN1ckRBRyksIFJlZzAsIFJlZzAgfTsKKyAgICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgQVJNOjp0MlJTQnJzLCBNVlQ6OmkzMiwgT3BzLCA2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTRFZhbHVlIE9wc1tdID0geyBWLCBWLCBSZWcwLCBTaEltbU9wLCBnZXRBTChDdXJEQUcpLCBSZWcwLCBSZWcwIH07CisgICAgICAgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIEFSTTo6UlNCcnMsIE1WVDo6aTMyLCBPcHMsIDcpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6QU5EOiB7CisgICAgLy8gQ2hlY2sgZm9yIHVuc2lnbmVkIGJpdGZpZWxkIGV4dHJhY3QKKyAgICBpZiAoU0ROb2RlICpJID0gU2VsZWN0VjZUMkJpdGZpZWxkRXh0cmFjdE9wKE4sIGZhbHNlKSkKKyAgICAgIHJldHVybiBJOworCisgICAgLy8gKGFuZCAob3IgeCwgYzIpLCBjMSkgYW5kIHRvcCAxNi1iaXRzIG9mIGMxIGFuZCBjMiBtYXRjaCwgbG93ZXIgMTYtYml0cworICAgIC8vIG9mIGMxIGFyZSAweGZmZmYsIGFuZCBsb3dlciAxNi1iaXQgb2YgYzIgYXJlIDAuIFRoYXQgaXMsIHRoZSB0b3AgMTYtYml0cworICAgIC8vIGFyZSBlbnRpcmVseSBjb250cmlidXRlZCBieSBjMiBhbmQgbG93ZXIgMTYtYml0cyBhcmUgZW50aXJlbHkgY29udHJpYnV0ZWQKKyAgICAvLyBieSB4LiBUaGF0J3MgZXF1YWwgdG8gKG9yIChhbmQgeCwgMHhmZmZmKSwgKGFuZCBjMSwgMHhmZmZmMDAwMCkpLgorICAgIC8vIFNlbGVjdCBpdCB0bzogIm1vdnQgeCwgKChjMSAmIDB4ZmZmZikgPj4gMTYpCisgICAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICAgIGlmIChWVCAhPSBNVlQ6OmkzMikKKyAgICAgIGJyZWFrOworICAgIHVuc2lnbmVkIE9wYyA9IChTdWJ0YXJnZXQtPmlzVGh1bWIoKSAmJiBTdWJ0YXJnZXQtPmhhc1RodW1iMigpKQorICAgICAgPyBBUk06OnQyTU9WVGkxNgorICAgICAgOiAoU3VidGFyZ2V0LT5oYXNWNlQyT3BzKCkgPyBBUk06Ok1PVlRpMTYgOiAwKTsKKyAgICBpZiAoIU9wYykKKyAgICAgIGJyZWFrOworICAgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApLCBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgICAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMSk7CisgICAgaWYgKCFOMUMpCisgICAgICBicmVhazsKKyAgICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpPUiAmJiBOMC5nZXROb2RlKCktPmhhc09uZVVzZSgpKSB7CisgICAgICBTRFZhbHVlIE4yID0gTjAuZ2V0T3BlcmFuZCgxKTsKKyAgICAgIENvbnN0YW50U0ROb2RlICpOMkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjIpOworICAgICAgaWYgKCFOMkMpCisgICAgICAgIGJyZWFrOworICAgICAgdW5zaWduZWQgTjFDVmFsID0gTjFDLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIHVuc2lnbmVkIE4yQ1ZhbCA9IE4yQy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBpZiAoKE4xQ1ZhbCAmIDB4ZmZmZjAwMDBVKSA9PSAoTjJDVmFsICYgMHhmZmZmMDAwMFUpICYmCisgICAgICAgICAgKE4xQ1ZhbCAmIDB4ZmZmZlUpID09IDB4ZmZmZlUgJiYKKyAgICAgICAgICAoTjJDVmFsICYgMHhmZmZmVSkgPT0gMHgwVSkgeworICAgICAgICBTRFZhbHVlIEltbTE2ID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgoTjJDVmFsICYgMHhGRkZGMDAwMFUpID4+IDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7CisgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7IE4wLmdldE9wZXJhbmQoMCksIEltbTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBTChDdXJEQUcpLCBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKSB9OworICAgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBWVCwgT3BzLCA0KTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBUk1JU0Q6OlZNT1ZSUkQ6CisgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoQVJNOjpWTU9WUlJELCBkbCwgTVZUOjppMzIsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCksIGdldEFMKEN1ckRBRyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMikpOworICBjYXNlIElTRDo6VU1VTF9MT0hJOiB7CisgICAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkpCisgICAgICBicmVhazsKKyAgICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iKCkpIHsKKyAgICAgIFNEVmFsdWUgT3BzW10gPSB7IE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBTChDdXJEQUcpLCBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgTVZUOjppMzIpIH07CisgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShBUk06OnQyVU1VTEwsIGRsLCBNVlQ6OmkzMiwgTVZUOjppMzIsT3BzLDQpOworICAgIH0gZWxzZSB7CisgICAgICBTRFZhbHVlIE9wc1tdID0geyBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QUwoQ3VyREFHKSwgQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKSB9OworICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoQVJNOjpVTVVMTCwgZGwsIE1WVDo6aTMyLCBNVlQ6OmkzMiwgT3BzLCA1KTsKKyAgICB9CisgIH0KKyAgY2FzZSBJU0Q6OlNNVUxfTE9ISTogeworICAgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIxT25seSgpKQorICAgICAgYnJlYWs7CisgICAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYigpKSB7CisgICAgICBTRFZhbHVlIE9wc1tdID0geyBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QUwoQ3VyREFHKSwgQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMikgfTsKKyAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKEFSTTo6dDJTTVVMTCwgZGwsIE1WVDo6aTMyLCBNVlQ6OmkzMixPcHMsNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNEVmFsdWUgT3BzW10gPSB7IE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBTChDdXJEQUcpLCBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgTVZUOjppMzIpIH07CisgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShBUk06OlNNVUxMLCBkbCwgTVZUOjppMzIsIE1WVDo6aTMyLCBPcHMsIDUpOworICAgIH0KKyAgfQorICBjYXNlIElTRDo6TE9BRDogeworICAgIFNETm9kZSAqUmVzTm9kZSA9IDA7CisgICAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYigpICYmIFN1YnRhcmdldC0+aGFzVGh1bWIyKCkpCisgICAgICBSZXNOb2RlID0gU2VsZWN0VDJJbmRleGVkTG9hZChOKTsKKyAgICBlbHNlCisgICAgICBSZXNOb2RlID0gU2VsZWN0QVJNSW5kZXhlZExvYWQoTik7CisgICAgaWYgKFJlc05vZGUpCisgICAgICByZXR1cm4gUmVzTm9kZTsKKworICAgIC8vIFZMRE1RIG11c3QgYmUgY3VzdG9tLXNlbGVjdGVkIGZvciAidjJmNjQgbG9hZCIgdG8gc2V0IHRoZSBBTTVPcGMgdmFsdWUuCisgICAgaWYgKFN1YnRhcmdldC0+aGFzVkZQMigpICYmCisgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5ID09IE1WVDo6djJmNjQpIHsKKyAgICAgIFNEVmFsdWUgQ2hhaW4gPSBOLT5nZXRPcGVyYW5kKDApOworICAgICAgU0RWYWx1ZSBBTTVPcGMgPQorICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTV9BTTo6Z2V0QU01T3BjKEFSTV9BTTo6aWEsIDQpLCBNVlQ6OmkzMik7CisgICAgICBTRFZhbHVlIFByZWQgPSBnZXRBTChDdXJEQUcpOworICAgICAgU0RWYWx1ZSBQcmVkUmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgICAgICBTRFZhbHVlIE9wc1tdID0geyBOLT5nZXRPcGVyYW5kKDEpLCBBTTVPcGMsIFByZWQsIFByZWRSZWcsIENoYWluIH07CisgICAgICBNYWNoaW5lU0ROb2RlOjptbW9faXRlcmF0b3IgTWVtT3AgPSBNRi0+YWxsb2NhdGVNZW1SZWZzQXJyYXkoMSk7CisgICAgICBNZW1PcFswXSA9IGNhc3Q8TWVtU0ROb2RlPihOKS0+Z2V0TWVtT3BlcmFuZCgpOworICAgICAgU0ROb2RlICpSZXQgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKEFSTTo6VkxETVEsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6djJmNjQsIE1WVDo6T3RoZXIsIE9wcywgNSk7CisgICAgICBjYXN0PE1hY2hpbmVTRE5vZGU+KFJldCktPnNldE1lbVJlZnMoTWVtT3AsIE1lbU9wICsgMSk7CisgICAgICByZXR1cm4gUmV0OworICAgIH0KKyAgICAvLyBPdGhlciBjYXNlcyBhcmUgYXV0b2dlbmVyYXRlZC4KKyAgICBicmVhazsKKyAgfQorICBjYXNlIElTRDo6U1RPUkU6IHsKKyAgICAvLyBWU1RNUSBtdXN0IGJlIGN1c3RvbS1zZWxlY3RlZCBmb3IgInYyZjY0IHN0b3JlIiB0byBzZXQgdGhlIEFNNU9wYyB2YWx1ZS4KKyAgICBpZiAoU3VidGFyZ2V0LT5oYXNWRlAyKCkgJiYKKyAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5ID09IE1WVDo6djJmNjQpIHsKKyAgICAgIFNEVmFsdWUgQ2hhaW4gPSBOLT5nZXRPcGVyYW5kKDApOworICAgICAgU0RWYWx1ZSBBTTVPcGMgPQorICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTV9BTTo6Z2V0QU01T3BjKEFSTV9BTTo6aWEsIDQpLCBNVlQ6OmkzMik7CisgICAgICBTRFZhbHVlIFByZWQgPSBnZXRBTChDdXJEQUcpOworICAgICAgU0RWYWx1ZSBQcmVkUmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgICAgICBTRFZhbHVlIE9wc1tdID0geyBOLT5nZXRPcGVyYW5kKDEpLCBOLT5nZXRPcGVyYW5kKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQU01T3BjLCBQcmVkLCBQcmVkUmVnLCBDaGFpbiB9OworICAgICAgTWFjaGluZVNETm9kZTo6bW1vX2l0ZXJhdG9yIE1lbU9wID0gTUYtPmFsbG9jYXRlTWVtUmVmc0FycmF5KDEpOworICAgICAgTWVtT3BbMF0gPSBjYXN0PE1lbVNETm9kZT4oTiktPmdldE1lbU9wZXJhbmQoKTsKKyAgICAgIFNETm9kZSAqUmV0ID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShBUk06OlZTVE1RLCBkbCwgTVZUOjpPdGhlciwgT3BzLCA2KTsKKyAgICAgIGNhc3Q8TWFjaGluZVNETm9kZT4oUmV0KS0+c2V0TWVtUmVmcyhNZW1PcCwgTWVtT3AgKyAxKTsKKyAgICAgIHJldHVybiBSZXQ7CisgICAgfQorICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICB9CisgIGNhc2UgQVJNSVNEOjpCUkNPTkQ6IHsKKyAgICAvLyBQYXR0ZXJuOiAoQVJNYnJjb25kOnZvaWQgKGJiOk90aGVyKTokZHN0LCAoaW1tOmkzMik6JGNjKQorICAgIC8vIEVtaXRzOiAoQmNjOnZvaWQgKGJiOk90aGVyKTokZHN0LCAoaW1tOmkzMik6JGNjKQorICAgIC8vIFBhdHRlcm4gY29tcGxleGl0eSA9IDYgIGNvc3QgPSAxICBzaXplID0gMAorCisgICAgLy8gUGF0dGVybjogKEFSTWJyY29uZDp2b2lkIChiYjpPdGhlcik6JGRzdCwgKGltbTppMzIpOiRjYykKKyAgICAvLyBFbWl0czogKHRCY2M6dm9pZCAoYmI6T3RoZXIpOiRkc3QsIChpbW06aTMyKTokY2MpCisgICAgLy8gUGF0dGVybiBjb21wbGV4aXR5ID0gNiAgY29zdCA9IDEgIHNpemUgPSAwCisKKyAgICAvLyBQYXR0ZXJuOiAoQVJNYnJjb25kOnZvaWQgKGJiOk90aGVyKTokZHN0LCAoaW1tOmkzMik6JGNjKQorICAgIC8vIEVtaXRzOiAodDJCY2M6dm9pZCAoYmI6T3RoZXIpOiRkc3QsIChpbW06aTMyKTokY2MpCisgICAgLy8gUGF0dGVybiBjb21wbGV4aXR5ID0gNiAgY29zdCA9IDEgIHNpemUgPSAwCisKKyAgICB1bnNpZ25lZCBPcGMgPSBTdWJ0YXJnZXQtPmlzVGh1bWIoKSA/CisgICAgICAoKFN1YnRhcmdldC0+aGFzVGh1bWIyKCkpID8gQVJNOjp0MkJjYyA6IEFSTTo6dEJjYykgOiBBUk06OkJjYzsKKyAgICBTRFZhbHVlIENoYWluID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIE4xID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgICBTRFZhbHVlIE4yID0gTi0+Z2V0T3BlcmFuZCgyKTsKKyAgICBTRFZhbHVlIE4zID0gTi0+Z2V0T3BlcmFuZCgzKTsKKyAgICBTRFZhbHVlIEluRmxhZyA9IE4tPmdldE9wZXJhbmQoNCk7CisgICAgYXNzZXJ0KE4xLmdldE9wY29kZSgpID09IElTRDo6QmFzaWNCbG9jayk7CisgICAgYXNzZXJ0KE4yLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpOworICAgIGFzc2VydChOMy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlJlZ2lzdGVyKTsKKworICAgIFNEVmFsdWUgVG1wMiA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoKCh1bnNpZ25lZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihOMiktPmdldFpFeHRWYWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTjEsIFRtcDIsIE4zLCBDaGFpbiwgSW5GbGFnIH07CisgICAgU0ROb2RlICpSZXNOb2RlID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpGbGFnLCBPcHMsIDUpOworICAgIENoYWluID0gU0RWYWx1ZShSZXNOb2RlLCAwKTsKKyAgICBpZiAoTi0+Z2V0TnVtVmFsdWVzKCkgPT0gMikgeworICAgICAgSW5GbGFnID0gU0RWYWx1ZShSZXNOb2RlLCAxKTsKKyAgICAgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTiwgMSksIEluRmxhZyk7CisgICAgfQorICAgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTiwgMCksCisgICAgICAgICAgICAgICAgU0RWYWx1ZShDaGFpbi5nZXROb2RlKCksIENoYWluLmdldFJlc05vKCkpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjYXNlIEFSTUlTRDo6Q01PVjoKKyAgICByZXR1cm4gU2VsZWN0Q01PVk9wKE4pOworICBjYXNlIEFSTUlTRDo6Q05FRzogeworICAgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIE4xID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgICBTRFZhbHVlIE4yID0gTi0+Z2V0T3BlcmFuZCgyKTsKKyAgICBTRFZhbHVlIE4zID0gTi0+Z2V0T3BlcmFuZCgzKTsKKyAgICBTRFZhbHVlIEluRmxhZyA9IE4tPmdldE9wZXJhbmQoNCk7CisgICAgYXNzZXJ0KE4yLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpOworICAgIGFzc2VydChOMy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlJlZ2lzdGVyKTsKKworICAgIFNEVmFsdWUgVG1wMiA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoKCh1bnNpZ25lZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihOMiktPmdldFpFeHRWYWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTjAsIE4xLCBUbXAyLCBOMywgSW5GbGFnIH07CisgICAgdW5zaWduZWQgT3BjID0gMDsKKyAgICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UgJiYgIklsbGVnYWwgY29uZGl0aW9uYWwgbW92ZSB0eXBlISIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNVlQ6OmYzMjoKKyAgICAgIE9wYyA9IEFSTTo6Vk5FR1NjYzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICBPcGMgPSBBUk06OlZORUdEY2M7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIE9wYywgVlQsIE9wcywgNSk7CisgIH0KKworICBjYXNlIEFSTUlTRDo6VlpJUDogeworICAgIHVuc2lnbmVkIE9wYyA9IDA7CisgICAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICAgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOworICAgIGNhc2UgTVZUOjp2OGk4OiAgT3BjID0gQVJNOjpWWklQZDg7IGJyZWFrOworICAgIGNhc2UgTVZUOjp2NGkxNjogT3BjID0gQVJNOjpWWklQZDE2OyBicmVhazsKKyAgICBjYXNlIE1WVDo6djJmMzI6CisgICAgY2FzZSBNVlQ6OnYyaTMyOiBPcGMgPSBBUk06OlZaSVBkMzI7IGJyZWFrOworICAgIGNhc2UgTVZUOjp2MTZpODogT3BjID0gQVJNOjpWWklQcTg7IGJyZWFrOworICAgIGNhc2UgTVZUOjp2OGkxNjogT3BjID0gQVJNOjpWWklQcTE2OyBicmVhazsKKyAgICBjYXNlIE1WVDo6djRmMzI6CisgICAgY2FzZSBNVlQ6OnY0aTMyOiBPcGMgPSBBUk06OlZaSVBxMzI7IGJyZWFrOworICAgIH0KKyAgICBTRFZhbHVlIFByZWQgPSBnZXRBTChDdXJEQUcpOworICAgIFNEVmFsdWUgUHJlZFJlZyA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgTVZUOjppMzIpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSksIFByZWQsIFByZWRSZWcgfTsKKyAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBWVCwgVlQsIE9wcywgNCk7CisgIH0KKyAgY2FzZSBBUk1JU0Q6OlZVWlA6IHsKKyAgICB1bnNpZ25lZCBPcGMgPSAwOworICAgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsKKyAgICBjYXNlIE1WVDo6djhpODogIE9wYyA9IEFSTTo6VlVaUGQ4OyBicmVhazsKKyAgICBjYXNlIE1WVDo6djRpMTY6IE9wYyA9IEFSTTo6VlVaUGQxNjsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OnYyZjMyOgorICAgIGNhc2UgTVZUOjp2MmkzMjogT3BjID0gQVJNOjpWVVpQZDMyOyBicmVhazsKKyAgICBjYXNlIE1WVDo6djE2aTg6IE9wYyA9IEFSTTo6VlVaUHE4OyBicmVhazsKKyAgICBjYXNlIE1WVDo6djhpMTY6IE9wYyA9IEFSTTo6VlVaUHExNjsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OnY0ZjMyOgorICAgIGNhc2UgTVZUOjp2NGkzMjogT3BjID0gQVJNOjpWVVpQcTMyOyBicmVhazsKKyAgICB9CisgICAgU0RWYWx1ZSBQcmVkID0gZ2V0QUwoQ3VyREFHKTsKKyAgICBTRFZhbHVlIFByZWRSZWcgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpLCBQcmVkLCBQcmVkUmVnIH07CisgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3BjLCBkbCwgVlQsIFZULCBPcHMsIDQpOworICB9CisgIGNhc2UgQVJNSVNEOjpWVFJOOiB7CisgICAgdW5zaWduZWQgT3BjID0gMDsKKyAgICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CisgICAgY2FzZSBNVlQ6OnY4aTg6ICBPcGMgPSBBUk06OlZUUk5kODsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OnY0aTE2OiBPcGMgPSBBUk06OlZUUk5kMTY7IGJyZWFrOworICAgIGNhc2UgTVZUOjp2MmYzMjoKKyAgICBjYXNlIE1WVDo6djJpMzI6IE9wYyA9IEFSTTo6VlRSTmQzMjsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OnYxNmk4OiBPcGMgPSBBUk06OlZUUk5xODsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OnY4aTE2OiBPcGMgPSBBUk06OlZUUk5xMTY7IGJyZWFrOworICAgIGNhc2UgTVZUOjp2NGYzMjoKKyAgICBjYXNlIE1WVDo6djRpMzI6IE9wYyA9IEFSTTo6VlRSTnEzMjsgYnJlYWs7CisgICAgfQorICAgIFNEVmFsdWUgUHJlZCA9IGdldEFMKEN1ckRBRyk7CisgICAgU0RWYWx1ZSBQcmVkUmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBNVlQ6OmkzMik7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSwgUHJlZCwgUHJlZFJlZyB9OworICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wYywgZGwsIFZULCBWVCwgT3BzLCA0KTsKKyAgfQorICBjYXNlIEFSTUlTRDo6QlVJTERfVkVDVE9SOiB7CisgICAgRVZUIFZlY1ZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICAgIEVWVCBFbHRWVCA9IFZlY1ZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgdW5zaWduZWQgTnVtRWx0cyA9IFZlY1ZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgaWYgKEVsdFZULmdldFNpbXBsZVZUKCkgPT0gTVZUOjpmNjQpIHsKKyAgICAgIGFzc2VydChOdW1FbHRzID09IDIgJiYgInVuZXhwZWN0ZWQgdHlwZSBmb3IgQlVJTERfVkVDVE9SIik7CisgICAgICByZXR1cm4gUGFpckRSZWdzKFZlY1ZULCBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpKTsKKyAgICB9CisgICAgYXNzZXJ0KEVsdFZULmdldFNpbXBsZVZUKCkgPT0gTVZUOjpmMzIgJiYKKyAgICAgICAgICAgInVuZXhwZWN0ZWQgdHlwZSBmb3IgQlVJTERfVkVDVE9SIik7CisgICAgaWYgKE51bUVsdHMgPT0gMikKKyAgICAgIHJldHVybiBQYWlyU1JlZ3MoVmVjVlQsIE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSkpOworICAgIGFzc2VydChOdW1FbHRzID09IDQgJiYgInVuZXhwZWN0ZWQgdHlwZSBmb3IgQlVJTERfVkVDVE9SIik7CisgICAgcmV0dXJuIFF1YWRTUmVncyhWZWNWVCwgTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMiksIE4tPmdldE9wZXJhbmQoMykpOworICB9CisKKyAgY2FzZSBJU0Q6OklOVFJJTlNJQ19WT0lEOgorICBjYXNlIElTRDo6SU5UUklOU0lDX1dfQ0hBSU46IHsKKyAgICB1bnNpZ25lZCBJbnRObyA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBzd2l0Y2ggKEludE5vKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZsZDE6IHsKKyAgICAgIHVuc2lnbmVkIERPcGNvZGVzW10gPSB7IEFSTTo6VkxEMWQ4LCBBUk06OlZMRDFkMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlZMRDFkMzIsIEFSTTo6VkxEMWQ2NCB9OworICAgICAgdW5zaWduZWQgUU9wY29kZXNbXSA9IHsgQVJNOjpWTEQxcTgsIEFSTTo6VkxEMXExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6VkxEMXEzMiwgQVJNOjpWTEQxcTY0IH07CisgICAgICByZXR1cm4gU2VsZWN0VkxEKE4sIDEsIERPcGNvZGVzLCBRT3Bjb2RlcywgMCk7CisgICAgfQorCisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZsZDI6IHsKKyAgICAgIHVuc2lnbmVkIERPcGNvZGVzW10gPSB7IEFSTTo6VkxEMmQ4LCBBUk06OlZMRDJkMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlZMRDJkMzIsIEFSTTo6VkxEMXE2NCB9OworICAgICAgdW5zaWduZWQgUU9wY29kZXNbXSA9IHsgQVJNOjpWTEQycTgsIEFSTTo6VkxEMnExNiwgQVJNOjpWTEQycTMyIH07CisgICAgICByZXR1cm4gU2VsZWN0VkxEKE4sIDIsIERPcGNvZGVzLCBRT3Bjb2RlcywgMCk7CisgICAgfQorCisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZsZDM6IHsKKyAgICAgIHVuc2lnbmVkIERPcGNvZGVzW10gPSB7IEFSTTo6VkxEM2Q4LCBBUk06OlZMRDNkMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlZMRDNkMzIsIEFSTTo6VkxEMWQ2NFQgfTsKKyAgICAgIHVuc2lnbmVkIFFPcGNvZGVzMFtdID0geyBBUk06OlZMRDNxOF9VUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpWTEQzcTE2X1VQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlZMRDNxMzJfVVBEIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczFbXSA9IHsgQVJNOjpWTEQzcThvZGRfVVBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6VkxEM3ExNm9kZF9VUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpWTEQzcTMyb2RkX1VQRCB9OworICAgICAgcmV0dXJuIFNlbGVjdFZMRChOLCAzLCBET3Bjb2RlcywgUU9wY29kZXMwLCBRT3Bjb2RlczEpOworICAgIH0KKworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92bGQ0OiB7CisgICAgICB1bnNpZ25lZCBET3Bjb2Rlc1tdID0geyBBUk06OlZMRDRkOCwgQVJNOjpWTEQ0ZDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpWTEQ0ZDMyLCBBUk06OlZMRDFkNjRRIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczBbXSA9IHsgQVJNOjpWTEQ0cThfVVBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6VkxENHExNl9VUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpWTEQ0cTMyX1VQRCB9OworICAgICAgdW5zaWduZWQgUU9wY29kZXMxW10gPSB7IEFSTTo6VkxENHE4b2RkX1VQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlZMRDRxMTZvZGRfVVBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6VkxENHEzMm9kZF9VUEQgfTsKKyAgICAgIHJldHVybiBTZWxlY3RWTEQoTiwgNCwgRE9wY29kZXMsIFFPcGNvZGVzMCwgUU9wY29kZXMxKTsKKyAgICB9CisKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdmxkMmxhbmU6IHsKKyAgICAgIHVuc2lnbmVkIERPcGNvZGVzW10gPSB7IEFSTTo6VkxEMkxOZDgsIEFSTTo6VkxEMkxOZDE2LCBBUk06OlZMRDJMTmQzMiB9OworICAgICAgdW5zaWduZWQgUU9wY29kZXMwW10gPSB7IEFSTTo6VkxEMkxOcTE2LCBBUk06OlZMRDJMTnEzMiB9OworICAgICAgdW5zaWduZWQgUU9wY29kZXMxW10gPSB7IEFSTTo6VkxEMkxOcTE2b2RkLCBBUk06OlZMRDJMTnEzMm9kZCB9OworICAgICAgcmV0dXJuIFNlbGVjdFZMRFNUTGFuZShOLCB0cnVlLCAyLCBET3Bjb2RlcywgUU9wY29kZXMwLCBRT3Bjb2RlczEpOworICAgIH0KKworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92bGQzbGFuZTogeworICAgICAgdW5zaWduZWQgRE9wY29kZXNbXSA9IHsgQVJNOjpWTEQzTE5kOCwgQVJNOjpWTEQzTE5kMTYsIEFSTTo6VkxEM0xOZDMyIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczBbXSA9IHsgQVJNOjpWTEQzTE5xMTYsIEFSTTo6VkxEM0xOcTMyIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczFbXSA9IHsgQVJNOjpWTEQzTE5xMTZvZGQsIEFSTTo6VkxEM0xOcTMyb2RkIH07CisgICAgICByZXR1cm4gU2VsZWN0VkxEU1RMYW5lKE4sIHRydWUsIDMsIERPcGNvZGVzLCBRT3Bjb2RlczAsIFFPcGNvZGVzMSk7CisgICAgfQorCisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZsZDRsYW5lOiB7CisgICAgICB1bnNpZ25lZCBET3Bjb2Rlc1tdID0geyBBUk06OlZMRDRMTmQ4LCBBUk06OlZMRDRMTmQxNiwgQVJNOjpWTEQ0TE5kMzIgfTsKKyAgICAgIHVuc2lnbmVkIFFPcGNvZGVzMFtdID0geyBBUk06OlZMRDRMTnExNiwgQVJNOjpWTEQ0TE5xMzIgfTsKKyAgICAgIHVuc2lnbmVkIFFPcGNvZGVzMVtdID0geyBBUk06OlZMRDRMTnExNm9kZCwgQVJNOjpWTEQ0TE5xMzJvZGQgfTsKKyAgICAgIHJldHVybiBTZWxlY3RWTERTVExhbmUoTiwgdHJ1ZSwgNCwgRE9wY29kZXMsIFFPcGNvZGVzMCwgUU9wY29kZXMxKTsKKyAgICB9CisKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnN0MTogeworICAgICAgdW5zaWduZWQgRE9wY29kZXNbXSA9IHsgQVJNOjpWU1QxZDgsIEFSTTo6VlNUMWQxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6VlNUMWQzMiwgQVJNOjpWU1QxZDY0IH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2Rlc1tdID0geyBBUk06OlZTVDFxOCwgQVJNOjpWU1QxcTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpWU1QxcTMyLCBBUk06OlZTVDFxNjQgfTsKKyAgICAgIHJldHVybiBTZWxlY3RWU1QoTiwgMSwgRE9wY29kZXMsIFFPcGNvZGVzLCAwKTsKKyAgICB9CisKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnN0MjogeworICAgICAgdW5zaWduZWQgRE9wY29kZXNbXSA9IHsgQVJNOjpWU1QyZDgsIEFSTTo6VlNUMmQxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6VlNUMmQzMiwgQVJNOjpWU1QxcTY0IH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2Rlc1tdID0geyBBUk06OlZTVDJxOCwgQVJNOjpWU1QycTE2LCBBUk06OlZTVDJxMzIgfTsKKyAgICAgIHJldHVybiBTZWxlY3RWU1QoTiwgMiwgRE9wY29kZXMsIFFPcGNvZGVzLCAwKTsKKyAgICB9CisKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnN0MzogeworICAgICAgdW5zaWduZWQgRE9wY29kZXNbXSA9IHsgQVJNOjpWU1QzZDgsIEFSTTo6VlNUM2QxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6VlNUM2QzMiwgQVJNOjpWU1QxZDY0VCB9OworICAgICAgdW5zaWduZWQgUU9wY29kZXMwW10gPSB7IEFSTTo6VlNUM3E4X1VQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlZTVDNxMTZfVVBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6VlNUM3EzMl9VUEQgfTsKKyAgICAgIHVuc2lnbmVkIFFPcGNvZGVzMVtdID0geyBBUk06OlZTVDNxOG9kZF9VUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpWU1QzcTE2b2RkX1VQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlZTVDNxMzJvZGRfVVBEIH07CisgICAgICByZXR1cm4gU2VsZWN0VlNUKE4sIDMsIERPcGNvZGVzLCBRT3Bjb2RlczAsIFFPcGNvZGVzMSk7CisgICAgfQorCisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZzdDQ6IHsKKyAgICAgIHVuc2lnbmVkIERPcGNvZGVzW10gPSB7IEFSTTo6VlNUNGQ4LCBBUk06OlZTVDRkMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlZTVDRkMzIsIEFSTTo6VlNUMWQ2NFEgfTsKKyAgICAgIHVuc2lnbmVkIFFPcGNvZGVzMFtdID0geyBBUk06OlZTVDRxOF9VUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpWU1Q0cTE2X1VQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlZTVDRxMzJfVVBEIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczFbXSA9IHsgQVJNOjpWU1Q0cThvZGRfVVBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6VlNUNHExNm9kZF9VUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpWU1Q0cTMyb2RkX1VQRCB9OworICAgICAgcmV0dXJuIFNlbGVjdFZTVChOLCA0LCBET3Bjb2RlcywgUU9wY29kZXMwLCBRT3Bjb2RlczEpOworICAgIH0KKworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92c3QybGFuZTogeworICAgICAgdW5zaWduZWQgRE9wY29kZXNbXSA9IHsgQVJNOjpWU1QyTE5kOCwgQVJNOjpWU1QyTE5kMTYsIEFSTTo6VlNUMkxOZDMyIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczBbXSA9IHsgQVJNOjpWU1QyTE5xMTYsIEFSTTo6VlNUMkxOcTMyIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczFbXSA9IHsgQVJNOjpWU1QyTE5xMTZvZGQsIEFSTTo6VlNUMkxOcTMyb2RkIH07CisgICAgICByZXR1cm4gU2VsZWN0VkxEU1RMYW5lKE4sIGZhbHNlLCAyLCBET3Bjb2RlcywgUU9wY29kZXMwLCBRT3Bjb2RlczEpOworICAgIH0KKworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92c3QzbGFuZTogeworICAgICAgdW5zaWduZWQgRE9wY29kZXNbXSA9IHsgQVJNOjpWU1QzTE5kOCwgQVJNOjpWU1QzTE5kMTYsIEFSTTo6VlNUM0xOZDMyIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczBbXSA9IHsgQVJNOjpWU1QzTE5xMTYsIEFSTTo6VlNUM0xOcTMyIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczFbXSA9IHsgQVJNOjpWU1QzTE5xMTZvZGQsIEFSTTo6VlNUM0xOcTMyb2RkIH07CisgICAgICByZXR1cm4gU2VsZWN0VkxEU1RMYW5lKE4sIGZhbHNlLCAzLCBET3Bjb2RlcywgUU9wY29kZXMwLCBRT3Bjb2RlczEpOworICAgIH0KKworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92c3Q0bGFuZTogeworICAgICAgdW5zaWduZWQgRE9wY29kZXNbXSA9IHsgQVJNOjpWU1Q0TE5kOCwgQVJNOjpWU1Q0TE5kMTYsIEFSTTo6VlNUNExOZDMyIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczBbXSA9IHsgQVJNOjpWU1Q0TE5xMTYsIEFSTTo6VlNUNExOcTMyIH07CisgICAgICB1bnNpZ25lZCBRT3Bjb2RlczFbXSA9IHsgQVJNOjpWU1Q0TE5xMTZvZGQsIEFSTTo6VlNUNExOcTMyb2RkIH07CisgICAgICByZXR1cm4gU2VsZWN0VkxEU1RMYW5lKE4sIGZhbHNlLCA0LCBET3Bjb2RlcywgUU9wY29kZXMwLCBRT3Bjb2RlczEpOworICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIElTRDo6SU5UUklOU0lDX1dPX0NIQUlOOiB7CisgICAgdW5zaWduZWQgSW50Tm8gPSBjYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDApKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgc3dpdGNoIChJbnRObykgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92dGJsMjoKKyAgICAgIHJldHVybiBTZWxlY3RWVEJMKE4sIGZhbHNlLCAyLCBBUk06OlZUQkwyKTsKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnRibDM6CisgICAgICByZXR1cm4gU2VsZWN0VlRCTChOLCBmYWxzZSwgMywgQVJNOjpWVEJMMyk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Z0Ymw0OgorICAgICAgcmV0dXJuIFNlbGVjdFZUQkwoTiwgZmFsc2UsIDQsIEFSTTo6VlRCTDQpOworCisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Z0YngyOgorICAgICAgcmV0dXJuIFNlbGVjdFZUQkwoTiwgdHJ1ZSwgMiwgQVJNOjpWVEJYMik7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Z0YngzOgorICAgICAgcmV0dXJuIFNlbGVjdFZUQkwoTiwgdHJ1ZSwgMywgQVJNOjpWVEJYMyk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Z0Yng0OgorICAgICAgcmV0dXJuIFNlbGVjdFZUQkwoTiwgdHJ1ZSwgNCwgQVJNOjpWVEJYNCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOgorICAgIHJldHVybiBTZWxlY3RDb25jYXRWZWN0b3IoTik7CisgIH0KKworICByZXR1cm4gU2VsZWN0Q29kZShOKTsKK30KKworYm9vbCBBUk1EQUdUb0RBR0lTZWw6OgorU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChjb25zdCBTRFZhbHVlICZPcCwgY2hhciBDb25zdHJhaW50Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gJk91dE9wcykgeworICBhc3NlcnQoQ29uc3RyYWludENvZGUgPT0gJ20nICYmICJ1bmV4cGVjdGVkIGFzbSBtZW1vcnkgY29uc3RyYWludCIpOworICAvLyBSZXF1aXJlIHRoZSBhZGRyZXNzIHRvIGJlIGluIGEgcmVnaXN0ZXIuICBUaGF0IGlzIHNhZmUgZm9yIGFsbCBBUk0KKyAgLy8gdmFyaWFudHMgYW5kIGl0IGlzIGhhcmQgdG8gZG8gYW55dGhpbmcgbXVjaCBzbWFydGVyIHdpdGhvdXQga25vd2luZworICAvLyBob3cgdGhlIG9wZXJhbmQgaXMgdXNlZC4KKyAgT3V0T3BzLnB1c2hfYmFjayhPcCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGNyZWF0ZUFSTUlTZWxEYWcgLSBUaGlzIHBhc3MgY29udmVydHMgYSBsZWdhbGl6ZWQgREFHIGludG8gYQorLy8vIEFSTS1zcGVjaWZpYyBEQUcsIHJlYWR5IGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorLy8vCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUFSTUlTZWxEYWcoQVJNQmFzZVRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIHJldHVybiBuZXcgQVJNREFHVG9EQUdJU2VsKFRNLCBPcHRMZXZlbCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JU2VsTG93ZXJpbmcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSVNlbExvd2VyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzk4ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSVNlbExvd2VyaW5nLmNwcApAQCAtMCwwICsxLDU1NTggQEAKKy8vPT09LS0gQVJNSVNlbExvd2VyaW5nLmNwcCAtIEFSTSBEQUcgTG93ZXJpbmcgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZXMgdGhhdCBBUk0gdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50byBhCisvLyBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXJtLWlzZWwiCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAiQVJNQWRkcmVzc2luZ01vZGVzLmgiCisjaW5jbHVkZSAiQVJNQ29uc3RhbnRQb29sVmFsdWUuaCIKKyNpbmNsdWRlICJBUk1JU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJBUk1NYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAiQVJNUGVyZmVjdFNodWZmbGUuaCIKKyNpbmNsdWRlICJBUk1SZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJBUk1TdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJBUk1UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiQVJNVGFyZ2V0T2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9DYWxsaW5nQ29udkxvd2VyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbk1hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1ZlY3RvckV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxzc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1UYWlsQ2FsbHMsICJOdW1iZXIgb2YgdGFpbCBjYWxscyIpOworCisvLyBUaGlzIG9wdGlvbiBzaG91bGQgZ28gYXdheSB3aGVuIE1hY2hpbmUgTElDTSBpcyBzbWFydCBlbm91Z2ggdG8gaG9pc3QgYSAKKy8vIHJlZy10by1yZWcgVkRVUC4KK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitFbmFibGVBUk1WRFVQc3BsYXQoImFybS12ZHVwLXNwbGF0IiwgY2w6OkhpZGRlbiwKKyAgY2w6OmRlc2MoIkdlbmVyYXRlIFZEVVAgZm9yIGludGVnZXIgY29uc3RhbnQgc3BsYXRzIChURU1QT1JBUlkgT1BUSU9OKS4iKSwKKyAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0VuYWJsZUFSTUxvbmdDYWxscygiYXJtLWxvbmctY2FsbHMiLCBjbDo6SGlkZGVuLAorICBjbDo6ZGVzYygiR2VuZXJhdGUgY2FsbHMgdmlhIGluZGlyZWN0IGNhbGwgaW5zdHJ1Y3Rpb25zIiksCisgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitBUk1JbnRlcndvcmtpbmcoImFybS1pbnRlcndvcmtpbmciLCBjbDo6SGlkZGVuLAorICBjbDo6ZGVzYygiRW5hYmxlIC8gZGlzYWJsZSBBUk0gaW50ZXJ3b3JraW5nIChmb3IgZGVidWdnaW5nIG9ubHkpIiksCisgIGNsOjppbml0KHRydWUpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0VuYWJsZUFSTUNvZGVQbGFjZW1lbnQoImFybS1jb2RlLXBsYWNlbWVudCIsIGNsOjpIaWRkZW4sCisgIGNsOjpkZXNjKCJFbmFibGUgY29kZSBwbGFjZW1lbnQgcGFzcyBmb3IgQVJNIiksCisgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBib29sIENDX0FSTV9BUENTX0N1c3RvbV9mNjQodW5zaWduZWQgJlZhbE5vLCBFVlQgJlZhbFZULCBFVlQgJkxvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyAmTG9jSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5ICZBcmdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTdGF0ZSAmU3RhdGUpOworc3RhdGljIGJvb2wgQ0NfQVJNX0FBUENTX0N1c3RvbV9mNjQodW5zaWduZWQgJlZhbE5vLCBFVlQgJlZhbFZULCBFVlQgJkxvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgJkFyZ0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTdGF0ZSAmU3RhdGUpOworc3RhdGljIGJvb2wgUmV0Q0NfQVJNX0FQQ1NfQ3VzdG9tX2Y2NCh1bnNpZ25lZCAmVmFsTm8sIEVWVCAmVmFsVlQsIEVWVCAmTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDVmFsQXNzaWduOjpMb2NJbmZvICZMb2NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgJkFyZ0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1N0YXRlICZTdGF0ZSk7CitzdGF0aWMgYm9vbCBSZXRDQ19BUk1fQUFQQ1NfQ3VzdG9tX2Y2NCh1bnNpZ25lZCAmVmFsTm8sIEVWVCAmVmFsVlQsIEVWVCAmTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyAmTG9jSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSAmQXJnRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1N0YXRlICZTdGF0ZSk7CisKK3ZvaWQgQVJNVGFyZ2V0TG93ZXJpbmc6OmFkZFR5cGVGb3JORU9OKEVWVCBWVCwgRVZUIFByb21vdGVkTGRTdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFByb21vdGVkQml0d2lzZVZUKSB7CisgIGlmIChWVCAhPSBQcm9tb3RlZExkU3RWVCkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkxPQUQsIFZULmdldFNpbXBsZVZUKCksIFByb21vdGUpOworICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OkxPQUQsIFZULmdldFNpbXBsZVZUKCksCisgICAgICAgICAgICAgICAgICAgICAgIFByb21vdGVkTGRTdFZULmdldFNpbXBsZVZUKCkpOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RPUkUsIFZULmdldFNpbXBsZVZUKCksIFByb21vdGUpOworICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OlNUT1JFLCBWVC5nZXRTaW1wbGVWVCgpLAorICAgICAgICAgICAgICAgICAgICAgICBQcm9tb3RlZExkU3RWVC5nZXRTaW1wbGVWVCgpKTsKKyAgfQorCisgIEVWVCBFbGVtVHkgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICBpZiAoRWxlbVR5ICE9IE1WVDo6aTY0ICYmIEVsZW1UeSAhPSBNVlQ6OmY2NCkKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWU0VUQ0MsIFZULmdldFNpbXBsZVZUKCksIEN1c3RvbSk7CisgIGlmIChFbGVtVHkgPT0gTVZUOjppOCB8fCBFbGVtVHkgPT0gTVZUOjppMTYpCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBWVC5nZXRTaW1wbGVWVCgpLCBDdXN0b20pOworICBpZiAoRWxlbVR5ICE9IE1WVDo6aTMyKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCwgVlQuZ2V0U2ltcGxlVlQoKSwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQLCBWVC5nZXRTaW1wbGVWVCgpLCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQsIFZULmdldFNpbXBsZVZUKCksIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCwgVlQuZ2V0U2ltcGxlVlQoKSwgRXhwYW5kKTsKKyAgfQorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCVUlMRF9WRUNUT1IsIFZULmdldFNpbXBsZVZUKCksIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLCBWVC5nZXRTaW1wbGVWVCgpLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDT05DQVRfVkVDVE9SUywgVlQuZ2V0U2ltcGxlVlQoKSwgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiwgVlQuZ2V0U2ltcGxlVlQoKSwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCBWVC5nZXRTaW1wbGVWVCgpLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIFZULmdldFNpbXBsZVZUKCksIEV4cGFuZCk7CisgIGlmIChWVC5pc0ludGVnZXIoKSkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITCwgVlQuZ2V0U2ltcGxlVlQoKSwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkEsIFZULmdldFNpbXBsZVZUKCksIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JMLCBWVC5nZXRTaW1wbGVWVCgpLCBDdXN0b20pOworICB9CisKKyAgLy8gUHJvbW90ZSBhbGwgYml0LXdpc2Ugb3BlcmF0aW9ucy4KKyAgaWYgKFZULmlzSW50ZWdlcigpICYmIFZUICE9IFByb21vdGVkQml0d2lzZVZUKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QU5ELCBWVC5nZXRTaW1wbGVWVCgpLCBQcm9tb3RlKTsKKyAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpBTkQsIFZULmdldFNpbXBsZVZUKCksCisgICAgICAgICAgICAgICAgICAgICAgIFByb21vdGVkQml0d2lzZVZULmdldFNpbXBsZVZUKCkpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok9SLCAgVlQuZ2V0U2ltcGxlVlQoKSwgUHJvbW90ZSk7CisgICAgQWRkUHJvbW90ZWRUb1R5cGUgKElTRDo6T1IsICBWVC5nZXRTaW1wbGVWVCgpLAorICAgICAgICAgICAgICAgICAgICAgICBQcm9tb3RlZEJpdHdpc2VWVC5nZXRTaW1wbGVWVCgpKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpYT1IsIFZULmdldFNpbXBsZVZUKCksIFByb21vdGUpOworICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OlhPUiwgVlQuZ2V0U2ltcGxlVlQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHJvbW90ZWRCaXR3aXNlVlQuZ2V0U2ltcGxlVlQoKSk7CisgIH0KKworICAvLyBOZW9uIGRvZXMgbm90IHN1cHBvcnQgdmVjdG9yIGRpdmlkZS9yZW1haW5kZXIgb3BlcmF0aW9ucy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0RJViwgVlQuZ2V0U2ltcGxlVlQoKSwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgVlQuZ2V0U2ltcGxlVlQoKSwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkRJViwgVlQuZ2V0U2ltcGxlVlQoKSwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgVlQuZ2V0U2ltcGxlVlQoKSwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VVJFTSwgVlQuZ2V0U2ltcGxlVlQoKSwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlJFTSwgVlQuZ2V0U2ltcGxlVlQoKSwgRXhwYW5kKTsKK30KKwordm9pZCBBUk1UYXJnZXRMb3dlcmluZzo6YWRkRFJUeXBlRm9yTkVPTihFVlQgVlQpIHsKKyAgYWRkUmVnaXN0ZXJDbGFzcyhWVCwgQVJNOjpEUFJSZWdpc3RlckNsYXNzKTsKKyAgYWRkVHlwZUZvck5FT04oVlQsIE1WVDo6ZjY0LCBNVlQ6OnYyaTMyKTsKK30KKwordm9pZCBBUk1UYXJnZXRMb3dlcmluZzo6YWRkUVJUeXBlRm9yTkVPTihFVlQgVlQpIHsKKyAgYWRkUmVnaXN0ZXJDbGFzcyhWVCwgQVJNOjpRUFJSZWdpc3RlckNsYXNzKTsKKyAgYWRkVHlwZUZvck5FT04oVlQsIE1WVDo6djJmNjQsIE1WVDo6djRpMzIpOworfQorCitzdGF0aWMgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlICpjcmVhdGVUTE9GKFRhcmdldE1hY2hpbmUgJlRNKSB7CisgIGlmIChUTS5nZXRTdWJ0YXJnZXQ8QVJNU3VidGFyZ2V0PigpLmlzVGFyZ2V0RGFyd2luKCkpCisgICAgcmV0dXJuIG5ldyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVNYWNoTygpOworCisgIHJldHVybiBuZXcgQVJNRWxmVGFyZ2V0T2JqZWN0RmlsZSgpOworfQorCitBUk1UYXJnZXRMb3dlcmluZzo6QVJNVGFyZ2V0TG93ZXJpbmcoVGFyZ2V0TWFjaGluZSAmVE0pCisgICAgOiBUYXJnZXRMb3dlcmluZyhUTSwgY3JlYXRlVExPRihUTSkpIHsKKyAgU3VidGFyZ2V0ID0gJlRNLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCk7CisgIFJlZ0luZm8gPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKworICBpZiAoU3VidGFyZ2V0LT5pc1RhcmdldERhcndpbigpKSB7CisgICAgLy8gVXNlcyBWRlAgZm9yIFRodW1iIGxpYmZ1bmNzIGlmIGF2YWlsYWJsZS4KKyAgICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iKCkgJiYgU3VidGFyZ2V0LT5oYXNWRlAyKCkpIHsKKyAgICAgIC8vIFNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYy4KKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpBRERfRjMyLCAiX19hZGRzZjN2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTVUJfRjMyLCAiX19zdWJzZjN2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpNVUxfRjMyLCAiX19tdWxzZjN2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpESVZfRjMyLCAiX19kaXZzZjN2ZnAiKTsKKworICAgICAgLy8gRG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgorICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkFERF9GNjQsICJfX2FkZGRmM3ZmcCIpOworICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlNVQl9GNjQsICJfX3N1YmRmM3ZmcCIpOworICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok1VTF9GNjQsICJfX211bGRmM3ZmcCIpOworICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkRJVl9GNjQsICJfX2RpdmRmM3ZmcCIpOworCisgICAgICAvLyBTaW5nbGUtcHJlY2lzaW9uIGNvbXBhcmlzb25zLgorICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok9FUV9GMzIsICJfX2Vxc2YydmZwIik7CisgICAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6VU5FX0YzMiwgIl9fbmVzZjJ2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPTFRfRjMyLCAiX19sdHNmMnZmcCIpOworICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok9MRV9GMzIsICJfX2xlc2YydmZwIik7CisgICAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6T0dFX0YzMiwgIl9fZ2VzZjJ2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPR1RfRjMyLCAiX19ndHNmMnZmcCIpOworICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlVPX0YzMiwgICJfX3Vub3Jkc2YydmZwIik7CisgICAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6T19GMzIsICAgIl9fdW5vcmRzZjJ2ZnAiKTsKKworICAgICAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpPRVFfRjMyLCBJU0Q6OlNFVE5FKTsKKyAgICAgIHNldENtcExpYmNhbGxDQyhSVExJQjo6VU5FX0YzMiwgSVNEOjpTRVRORSk7CisgICAgICBzZXRDbXBMaWJjYWxsQ0MoUlRMSUI6Ok9MVF9GMzIsIElTRDo6U0VUTkUpOworICAgICAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpPTEVfRjMyLCBJU0Q6OlNFVE5FKTsKKyAgICAgIHNldENtcExpYmNhbGxDQyhSVExJQjo6T0dFX0YzMiwgSVNEOjpTRVRORSk7CisgICAgICBzZXRDbXBMaWJjYWxsQ0MoUlRMSUI6Ok9HVF9GMzIsIElTRDo6U0VUTkUpOworICAgICAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpVT19GMzIsICBJU0Q6OlNFVE5FKTsKKyAgICAgIHNldENtcExpYmNhbGxDQyhSVExJQjo6T19GMzIsICAgSVNEOjpTRVRFUSk7CisKKyAgICAgIC8vIERvdWJsZS1wcmVjaXNpb24gY29tcGFyaXNvbnMuCisgICAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6T0VRX0Y2NCwgIl9fZXFkZjJ2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpVTkVfRjY0LCAiX19uZWRmMnZmcCIpOworICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok9MVF9GNjQsICJfX2x0ZGYydmZwIik7CisgICAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6T0xFX0Y2NCwgIl9fbGVkZjJ2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPR0VfRjY0LCAiX19nZWRmMnZmcCIpOworICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok9HVF9GNjQsICJfX2d0ZGYydmZwIik7CisgICAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6VU9fRjY0LCAgIl9fdW5vcmRkZjJ2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPX0Y2NCwgICAiX191bm9yZGRmMnZmcCIpOworCisgICAgICBzZXRDbXBMaWJjYWxsQ0MoUlRMSUI6Ok9FUV9GNjQsIElTRDo6U0VUTkUpOworICAgICAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpVTkVfRjY0LCBJU0Q6OlNFVE5FKTsKKyAgICAgIHNldENtcExpYmNhbGxDQyhSVExJQjo6T0xUX0Y2NCwgSVNEOjpTRVRORSk7CisgICAgICBzZXRDbXBMaWJjYWxsQ0MoUlRMSUI6Ok9MRV9GNjQsIElTRDo6U0VUTkUpOworICAgICAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpPR0VfRjY0LCBJU0Q6OlNFVE5FKTsKKyAgICAgIHNldENtcExpYmNhbGxDQyhSVExJQjo6T0dUX0Y2NCwgSVNEOjpTRVRORSk7CisgICAgICBzZXRDbXBMaWJjYWxsQ0MoUlRMSUI6OlVPX0Y2NCwgIElTRDo6U0VUTkUpOworICAgICAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpPX0Y2NCwgICBJU0Q6OlNFVEVRKTsKKworICAgICAgLy8gRmxvYXRpbmctcG9pbnQgdG8gaW50ZWdlciBjb252ZXJzaW9ucy4KKyAgICAgIC8vIGk2NCBjb252ZXJzaW9ucyBhcmUgZG9uZSB2aWEgbGlicmFyeSByb3V0aW5lcyBldmVuIHdoZW4gZ2VuZXJhdGluZyBWRlAKKyAgICAgIC8vIGluc3RydWN0aW9ucywgc28gdXNlIHRoZSBzYW1lIG9uZXMuCisgICAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6RlBUT1NJTlRfRjY0X0kzMiwgIl9fZml4ZGZzaXZmcCIpOworICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkZQVE9VSU5UX0Y2NF9JMzIsICJfX2ZpeHVuc2Rmc2l2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpGUFRPU0lOVF9GMzJfSTMyLCAiX19maXhzZnNpdmZwIik7CisgICAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6RlBUT1VJTlRfRjMyX0kzMiwgIl9fZml4dW5zc2ZzaXZmcCIpOworCisgICAgICAvLyBDb252ZXJzaW9ucyBiZXR3ZWVuIGZsb2F0aW5nIHR5cGVzLgorICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkZQUk9VTkRfRjY0X0YzMiwgIl9fdHJ1bmNkZnNmMnZmcCIpOworICAgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkZQRVhUX0YzMl9GNjQsICAgIl9fZXh0ZW5kc2ZkZjJ2ZnAiKTsKKworICAgICAgLy8gSW50ZWdlciB0byBmbG9hdGluZy1wb2ludCBjb252ZXJzaW9ucy4KKyAgICAgIC8vIGk2NCBjb252ZXJzaW9ucyBhcmUgZG9uZSB2aWEgbGlicmFyeSByb3V0aW5lcyBldmVuIHdoZW4gZ2VuZXJhdGluZyBWRlAKKyAgICAgIC8vIGluc3RydWN0aW9ucywgc28gdXNlIHRoZSBzYW1lIG9uZXMuCisgICAgICAvLyBGSVhNRTogVGhlcmUgYXBwZWFycyB0byBiZSBzb21lIG5hbWluZyBpbmNvbnNpc3RlbmN5IGluIEFSTSBsaWJnY2M6CisgICAgICAvLyBlLmcuLCBfX2Zsb2F0dW5zaWRmIHZzLiBfX2Zsb2F0dW5zc2lkZnZmcC4KKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTSU5UVE9GUF9JMzJfRjY0LCAiX19mbG9hdHNpZGZ2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpVSU5UVE9GUF9JMzJfRjY0LCAiX19mbG9hdHVuc3NpZGZ2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTSU5UVE9GUF9JMzJfRjMyLCAiX19mbG9hdHNpc2Z2ZnAiKTsKKyAgICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpVSU5UVE9GUF9JMzJfRjMyLCAiX19mbG9hdHVuc3Npc2Z2ZnAiKTsKKyAgICB9CisgIH0KKworICAvLyBUaGVzZSBsaWJjYWxscyBhcmUgbm90IGF2YWlsYWJsZSBpbiAzMi1iaXQuCisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTSExfSTEyOCwgMCk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTUkxfSTEyOCwgMCk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTUkFfSTEyOCwgMCk7CisKKyAgLy8gTGliY2FsbHMgc2hvdWxkIHVzZSB0aGUgQUFQQ1MgYmFzZSBzdGFuZGFyZCBBQkksIGV2ZW4gaWYgaGFyZCBmbG9hdAorICAvLyBpcyBpbiBlZmZlY3QsIGFzIHBlciB0aGUgQVJNIFJUQUJJIHNwZWNpZmljYXRpb24sIHNlY3Rpb24gNC4xLjIuCisgIGlmIChTdWJ0YXJnZXQtPmlzQUFQQ1NfQUJJKCkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFJUTElCOjpVTktOT1dOX0xJQkNBTEw7ICsraSkgeworICAgICAgc2V0TGliY2FsbENhbGxpbmdDb252KHN0YXRpY19jYXN0PFJUTElCOjpMaWJjYWxsPihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6QVJNX0FBUENTKTsKKyAgICB9CisgIH0KKworICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSkKKyAgICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6aTMyLCBBUk06OnRHUFJSZWdpc3RlckNsYXNzKTsKKyAgZWxzZQorICAgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppMzIsIEFSTTo6R1BSUmVnaXN0ZXJDbGFzcyk7CisgIGlmICghVXNlU29mdEZsb2F0ICYmIFN1YnRhcmdldC0+aGFzVkZQMigpICYmICFTdWJ0YXJnZXQtPmlzVGh1bWIxT25seSgpKSB7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmYzMiwgQVJNOjpTUFJSZWdpc3RlckNsYXNzKTsKKyAgICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjY0LCBBUk06OkRQUlJlZ2lzdGVyQ2xhc3MpOworCisgICAgc2V0VHJ1bmNTdG9yZUFjdGlvbihNVlQ6OmY2NCwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIH0KKworICBpZiAoU3VidGFyZ2V0LT5oYXNORU9OKCkpIHsKKyAgICBhZGREUlR5cGVGb3JORU9OKE1WVDo6djJmMzIpOworICAgIGFkZERSVHlwZUZvck5FT04oTVZUOjp2OGk4KTsKKyAgICBhZGREUlR5cGVGb3JORU9OKE1WVDo6djRpMTYpOworICAgIGFkZERSVHlwZUZvck5FT04oTVZUOjp2MmkzMik7CisgICAgYWRkRFJUeXBlRm9yTkVPTihNVlQ6OnYxaTY0KTsKKworICAgIGFkZFFSVHlwZUZvck5FT04oTVZUOjp2NGYzMik7CisgICAgYWRkUVJUeXBlRm9yTkVPTihNVlQ6OnYyZjY0KTsKKyAgICBhZGRRUlR5cGVGb3JORU9OKE1WVDo6djE2aTgpOworICAgIGFkZFFSVHlwZUZvck5FT04oTVZUOjp2OGkxNik7CisgICAgYWRkUVJUeXBlRm9yTkVPTihNVlQ6OnY0aTMyKTsKKyAgICBhZGRRUlR5cGVGb3JORU9OKE1WVDo6djJpNjQpOworCisgICAgLy8gdjJmNjQgaXMgbGVnYWwgc28gdGhhdCBRUiBzdWJyZWdzIGNhbiBiZSBleHRyYWN0ZWQgYXMgZjY0IGVsZW1lbnRzLCBidXQKKyAgICAvLyBuZWl0aGVyIE5lb24gbm9yIFZGUCBzdXBwb3J0IGFueSBhcml0aG1ldGljIG9wZXJhdGlvbnMgb24gaXQuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkFERCwgTVZUOjp2MmY2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU1VCLCBNVlQ6OnYyZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZNVUwsIE1WVDo6djJmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkRJViwgTVZUOjp2MmY2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUkVNLCBNVlQ6OnYyZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1BZU0lHTiwgTVZUOjp2MmY2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWU0VUQ0MsIE1WVDo6djJmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Rk5FRywgTVZUOjp2MmY2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQUJTLCBNVlQ6OnYyZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTUVJULCBNVlQ6OnYyZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTSU4sIE1WVDo6djJmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUywgTVZUOjp2MmY2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUE9XSSwgTVZUOjp2MmY2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUE9XLCBNVlQ6OnYyZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZMT0csIE1WVDo6djJmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxPRzIsIE1WVDo6djJmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxPRzEwLCBNVlQ6OnYyZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZFWFAsIE1WVDo6djJmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkVYUDIsIE1WVDo6djJmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNFSUwsIE1WVDo6djJmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlRSVU5DLCBNVlQ6OnYyZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSSU5ULCBNVlQ6OnYyZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZORUFSQllJTlQsIE1WVDo6djJmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkZMT09SLCBNVlQ6OnYyZjY0LCBFeHBhbmQpOworCisgICAgLy8gTmVvbiBkb2VzIG5vdCBzdXBwb3J0IHNvbWUgb3BlcmF0aW9ucyBvbiB2MWk2NCBhbmQgdjJpNjQgdHlwZXMuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMLCBNVlQ6OnYxaTY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTCwgTVZUOjp2Mmk2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWU0VUQ0MsIE1WVDo6djFpNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VlNFVENDLCBNVlQ6OnYyaTY0LCBFeHBhbmQpOworCisgICAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTik7CisgICAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OlNITCk7CisgICAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OlNSTCk7CisgICAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OlNSQSk7CisgICAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OlNJR05fRVhURU5EKTsKKyAgICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6WkVST19FWFRFTkQpOworICAgIHNldFRhcmdldERBR0NvbWJpbmUoSVNEOjpBTllfRVhURU5EKTsKKyAgICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6U0VMRUNUX0NDKTsKKyAgfQorCisgIGNvbXB1dGVSZWdpc3RlclByb3BlcnRpZXMoKTsKKworICAvLyBBUk0gZG9lcyBub3QgaGF2ZSBmMzIgZXh0ZW5kaW5nIGxvYWQuCisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICAvLyBBUk0gZG9lcyBub3QgaGF2ZSBpMSBzaWduIGV4dGVuZGluZyBsb2FkLgorICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6U0VYVExPQUQsIE1WVDo6aTEsIFByb21vdGUpOworCisgIC8vIEFSTSBzdXBwb3J0cyBhbGwgNCBmbGF2b3JzIG9mIGludGVnZXIgaW5kZXhlZCBsb2FkIC8gc3RvcmUuCisgIGlmICghU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSkgeworICAgIGZvciAodW5zaWduZWQgaW0gPSAodW5zaWduZWQpSVNEOjpQUkVfSU5DOworICAgICAgICAgaW0gIT0gKHVuc2lnbmVkKUlTRDo6TEFTVF9JTkRFWEVEX01PREU7ICsraW0pIHsKKyAgICAgIHNldEluZGV4ZWRMb2FkQWN0aW9uKGltLCAgTVZUOjppMSwgIExlZ2FsKTsKKyAgICAgIHNldEluZGV4ZWRMb2FkQWN0aW9uKGltLCAgTVZUOjppOCwgIExlZ2FsKTsKKyAgICAgIHNldEluZGV4ZWRMb2FkQWN0aW9uKGltLCAgTVZUOjppMTYsIExlZ2FsKTsKKyAgICAgIHNldEluZGV4ZWRMb2FkQWN0aW9uKGltLCAgTVZUOjppMzIsIExlZ2FsKTsKKyAgICAgIHNldEluZGV4ZWRTdG9yZUFjdGlvbihpbSwgTVZUOjppMSwgIExlZ2FsKTsKKyAgICAgIHNldEluZGV4ZWRTdG9yZUFjdGlvbihpbSwgTVZUOjppOCwgIExlZ2FsKTsKKyAgICAgIHNldEluZGV4ZWRTdG9yZUFjdGlvbihpbSwgTVZUOjppMTYsIExlZ2FsKTsKKyAgICAgIHNldEluZGV4ZWRTdG9yZUFjdGlvbihpbSwgTVZUOjppMzIsIExlZ2FsKTsKKyAgICB9CisgIH0KKworICAvLyBpNjQgb3BlcmF0aW9uIHN1cHBvcnQuCisgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIxT25seSgpKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMLCAgICAgTVZUOjppNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUsICAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFMsICAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTTVVMX0xPSEksIE1WVDo6aTMyLCBFeHBhbmQpOworICB9IGVsc2UgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTCwgICAgIE1WVDo6aTY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTEhVLCAgIE1WVDo6aTMyLCBFeHBhbmQpOworICAgIGlmICghU3VidGFyZ2V0LT5oYXNWNk9wcygpKQorICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFMsIE1WVDo6aTMyLCBFeHBhbmQpOworICB9CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITF9QQVJUUywgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQV9QQVJUUywgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTF9QQVJUUywgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTCwgICAgICAgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQSwgICAgICAgTVZUOjppNjQsIEN1c3RvbSk7CisKKyAgLy8gQVJNIGRvZXMgbm90IGhhdmUgUk9UTC4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Uk9UTCwgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFRaLCAgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUUE9QLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgaWYgKCFTdWJ0YXJnZXQtPmhhc1Y1VE9wcygpIHx8IFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkpCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RMWiwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgLy8gT25seSBBUk12NiBoYXMgQlNXQVAuCisgIGlmICghU3VidGFyZ2V0LT5oYXNWNk9wcygpKQorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJTV0FQLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKworICAvLyBUaGVzZSBhcmUgZXhwYW5kZWQgaW50byBsaWJjYWxscy4KKyAgaWYgKCFTdWJ0YXJnZXQtPmhhc0RpdmlkZSgpKSB7CisgICAgLy8gdjdNIGhhcyBhIGhhcmR3YXJlIGRpdmlkZXIKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWLCAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgIE1WVDo6aTMyLCBFeHBhbmQpOworICB9CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSRU0sICBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VVJFTSwgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJVlJFTSwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6R2xvYmFsQWRkcmVzcywgTVZUOjppMzIsICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q29uc3RhbnRQb29sLCAgTVZUOjppMzIsICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6R0xPQkFMX09GRlNFVF9UQUJMRSwgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbFRMU0FkZHJlc3MsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCbG9ja0FkZHJlc3MsIE1WVDo6aTMyLCBDdXN0b20pOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlRSQVAsIE1WVDo6T3RoZXIsIExlZ2FsKTsKKworICAvLyBVc2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBU1RBUlQsICAgICAgICAgICAgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFBUkcsICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQUNPUFksICAgICAgICAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBRU5ELCAgICAgICAgICAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RBQ0tTQVZFLCAgICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVEFDS1JFU1RPUkUsICAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkVIU0VMRUNUSU9OLCAgICAgICAgTVZUOjppMzIsICAgRXhwYW5kKTsKKyAgLy8gRklYTUU6IFNob3VsZG4ndCBuZWVkIHRoaXMsIHNpbmNlIG5vIHJlZ2lzdGVyIGlzIHVzZWQsIGJ1dCB0aGUgbGVnYWxpemVyCisgIC8vIGRvZXNuJ3QgeWV0IGtub3cgaG93IHRvIG5vdCBkbyB0aGF0IGZvciBTakxqLgorICBzZXRFeGNlcHRpb25TZWxlY3RvclJlZ2lzdGVyKEFSTTo6UjApOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0MsIE1WVDo6aTMyLCBFeHBhbmQpOworICAvLyBIYW5kbGUgYXRvbWljcyBkaXJlY3RseSBmb3IgQVJNdls2N10gKGV4Y2VwdCBmb3IgVGh1bWIxKSwgb3RoZXJ3aXNlCisgIC8vIHVzZSB0aGUgZGVmYXVsdCBleHBhbnNpb24uCisgIGJvb2wgY2FuSGFuZGxlQXRvbWljcyA9CisgICAgKFN1YnRhcmdldC0+aGFzVjdPcHMoKSB8fAorICAgICAgKFN1YnRhcmdldC0+aGFzVjZPcHMoKSAmJiAhU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSkpOworICBpZiAoY2FuSGFuZGxlQXRvbWljcykgeworICAgIC8vIG1lbWJhcnJpZXIgbmVlZHMgY3VzdG9tIGxvd2VyaW5nOyB0aGUgcmVzdCBhcmUgbGVnYWwgYW5kIGhhbmRsZWQKKyAgICAvLyBub3JtYWxseS4KKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNRU1CQVJSSUVSLCBNVlQ6Ok90aGVyLCBDdXN0b20pOworICB9IGVsc2UgeworICAgIC8vIFNldCB0aGVtIGFsbCBmb3IgZXhwYW5zaW9uLCB3aGljaCB3aWxsIGZvcmNlIGxpYmNhbGxzLgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1FTUJBUlJJRVIsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0NNUF9TV0FQLCAgTVZUOjppOCwgIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0NNUF9TV0FQLCAgTVZUOjppMTYsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0NNUF9TV0FQLCAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX1NXQVAsICAgICAgTVZUOjppOCwgIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX1NXQVAsICAgICAgTVZUOjppMTYsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX1NXQVAsICAgICAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfQURELCAgTVZUOjppOCwgIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfQURELCAgTVZUOjppMTYsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfQURELCAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfU1VCLCAgTVZUOjppOCwgIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfU1VCLCAgTVZUOjppMTYsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfU1VCLCAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfQU5ELCAgTVZUOjppOCwgIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfQU5ELCAgTVZUOjppMTYsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfQU5ELCAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfT1IsICAgTVZUOjppOCwgIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfT1IsICAgTVZUOjppMTYsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfT1IsICAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfWE9SLCAgTVZUOjppOCwgIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfWE9SLCAgTVZUOjppMTYsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfWE9SLCAgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfTkFORCwgTVZUOjppOCwgIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfTkFORCwgTVZUOjppMTYsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfTkFORCwgTVZUOjppMzIsIEV4cGFuZCk7CisgICAgLy8gU2luY2UgdGhlIGxpYmNhbGxzIGluY2x1ZGUgbG9ja2luZywgZm9sZCBpbiB0aGUgZmVuY2VzCisgICAgc2V0U2hvdWxkRm9sZEF0b21pY0ZlbmNlcyh0cnVlKTsKKyAgfQorICAvLyA2NC1iaXQgdmVyc2lvbnMgYXJlIGFsd2F5cyBsaWJjYWxscyAoZm9yIG5vdykKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0NNUF9TV0FQLCAgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFUT01JQ19TV0FQLCAgICAgIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBVE9NSUNfTE9BRF9BREQsICBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfU1VCLCAgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFUT01JQ19MT0FEX0FORCwgIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBVE9NSUNfTE9BRF9PUiwgICBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfWE9SLCAgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFUT01JQ19MT0FEX05BTkQsIE1WVDo6aTY0LCBFeHBhbmQpOworCisgIC8vIFJlcXVpcmVzIFNYVEIvU1hUSCwgYXZhaWxhYmxlIG9uIHY2IGFuZCB1cCBpbiBib3RoIEFSTSBhbmQgVGh1bWIgbW9kZXMuCisgIGlmICghU3VidGFyZ2V0LT5oYXNWNk9wcygpKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTE2LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBNVlQ6Omk4LCAgRXhwYW5kKTsKKyAgfQorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSUdOX0VYVEVORF9JTlJFRywgTVZUOjppMSwgRXhwYW5kKTsKKworICBpZiAoIVVzZVNvZnRGbG9hdCAmJiBTdWJ0YXJnZXQtPmhhc1ZGUDIoKSAmJiAhU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSkgeworICAgIC8vIFR1cm4gZjY0LT5pNjQgaW50byBWTU9WUlJELCBpNjQgLT4gZjY0IHRvIFZNT1ZEUlIKKyAgICAvLyBpZmYgdGFyZ2V0IHN1cHBvcnRzIHZmcDIuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsIE1WVDo6aTY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZMVF9ST1VORFNfLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgfQorCisgIC8vIFdlIHdhbnQgdG8gY3VzdG9tIGxvd2VyIHNvbWUgb2Ygb3VyIGludHJpbnNpY3MuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKyAgaWYgKFN1YnRhcmdldC0+aXNUYXJnZXREYXJ3aW4oKSkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkVIX1NKTEpfU0VUSk1QLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFSF9TSkxKX0xPTkdKTVAsIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisgIH0KKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRVRDQywgICAgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRVRDQywgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRVRDQywgICAgIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsICAgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsICAgIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIE1WVDo6ZjMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIE1WVDo6ZjY0LCBDdXN0b20pOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSQ09ORCwgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJfQ0MsICAgICBNVlQ6OmkzMiwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUl9DQywgICAgIE1WVDo6ZjMyLCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0NDLCAgICAgTVZUOjpmNjQsICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJfSlQsICAgICBNVlQ6Ok90aGVyLCBDdXN0b20pOworCisgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2luL2Nvcy9mbW9kL2NvcHlzaWduL3BvdworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU0lOLCAgICAgIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU0lOLCAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TLCAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TLCAgICAgIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUkVNLCAgICAgIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUkVNLCAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBpZiAoIVVzZVNvZnRGbG9hdCAmJiBTdWJ0YXJnZXQtPmhhc1ZGUDIoKSAmJiAhU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1BZU0lHTiwgTVZUOjpmNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCBNVlQ6OmYzMiwgQ3VzdG9tKTsKKyAgfQorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUE9XLCAgICAgIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUE9XLCAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworCisgIC8vIFZhcmlvdXMgVkZQIGdvb2RuZXNzCisgIGlmICghVXNlU29mdEZsb2F0ICYmICFTdWJ0YXJnZXQtPmlzVGh1bWIxT25seSgpKSB7CisgICAgLy8gaW50IDwtPiBmcCBhcmUgY3VzdG9tIGV4cGFuZGVkIGludG8gYml0X2NvbnZlcnQgKyBBUk1JU0Qgb3BzLgorICAgIGlmIChTdWJ0YXJnZXQtPmhhc1ZGUDIoKSkgeworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCwgTVZUOjppMzIsIEN1c3RvbSk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1VJTlQsIE1WVDo6aTMyLCBDdXN0b20pOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fU0lOVCwgTVZUOjppMzIsIEN1c3RvbSk7CisgICAgfQorICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGhhbGYtcHJlY2lzaW9uIEZQLgorICAgIGlmICghU3VidGFyZ2V0LT5oYXNGUDE2KCkpIHsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQMTZfVE9fRlAzMiwgTVZUOjpmMzIsIEV4cGFuZCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUDMyX1RPX0ZQMTYsIE1WVDo6aTMyLCBFeHBhbmQpOworICAgIH0KKyAgfQorCisgIC8vIFdlIGhhdmUgdGFyZ2V0LXNwZWNpZmljIGRhZyBjb21iaW5lIHBhdHRlcm5zIGZvciB0aGUgZm9sbG93aW5nIG5vZGVzOgorICAvLyBBUk1JU0Q6OlZNT1ZSUkQgIC0gTm8gbmVlZCB0byBjYWxsIHNldFRhcmdldERBR0NvbWJpbmUKKyAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OkFERCk7CisgIHNldFRhcmdldERBR0NvbWJpbmUoSVNEOjpTVUIpOworICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6TVVMKTsKKworICBpZiAoU3VidGFyZ2V0LT5oYXNWNlQyT3BzKCkpCisgICAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6Ok9SKTsKKworICBzZXRTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUoQVJNOjpTUCk7CisKKyAgaWYgKFVzZVNvZnRGbG9hdCB8fCBTdWJ0YXJnZXQtPmlzVGh1bWIxT25seSgpIHx8ICFTdWJ0YXJnZXQtPmhhc1ZGUDIoKSkKKyAgICBzZXRTY2hlZHVsaW5nUHJlZmVyZW5jZShTY2hlZDo6UmVnUHJlc3N1cmUpOworICBlbHNlCisgICAgc2V0U2NoZWR1bGluZ1ByZWZlcmVuY2UoU2NoZWQ6Okh5YnJpZCk7CisKKyAgbWF4U3RvcmVzUGVyTWVtY3B5ID0gMTsgICAvLy8vIHRlbXBvcmFyeSAtIHJld3JpdGUgaW50ZXJmYWNlIHRvIHVzZSB0eXBlCisKKyAgLy8gT24gQVJNIGFyZ3VtZW50cyBzbWFsbGVyIHRoYW4gNCBieXRlcyBhcmUgZXh0ZW5kZWQsIHNvIGFsbCBhcmd1bWVudHMKKyAgLy8gYXJlIGF0IGxlYXN0IDQgYnl0ZXMgYWxpZ25lZC4KKyAgc2V0TWluU3RhY2tBcmd1bWVudEFsaWdubWVudCg0KTsKKworICBpZiAoRW5hYmxlQVJNQ29kZVBsYWNlbWVudCkKKyAgICBiZW5lZml0RnJvbUNvZGVQbGFjZW1lbnRPcHQgPSB0cnVlOworfQorCitzdGQ6OnBhaXI8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyosIHVpbnQ4X3Q+CitBUk1UYXJnZXRMb3dlcmluZzo6ZmluZFJlcHJlc2VudGF0aXZlQ2xhc3MoRVZUIFZUKSBjb25zdHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUlJDID0gMDsKKyAgdWludDhfdCBDb3N0ID0gMTsKKyAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjpmaW5kUmVwcmVzZW50YXRpdmVDbGFzcyhWVCk7CisgIC8vIFVzZSBEUFIgYXMgcmVwcmVzZW50YXRpdmUgcmVnaXN0ZXIgY2xhc3MgZm9yIGFsbCBmbG9hdGluZyBwb2ludAorICAvLyBhbmQgdmVjdG9yIHR5cGVzLiBTaW5jZSB0aGVyZSBhcmUgMzIgU1BSIHJlZ2lzdGVycyBhbmQgMzIgRFBSIHJlZ2lzdGVycyBzbworICAvLyB0aGUgY29zdCBpcyAxIGZvciBib3RoIGYzMiBhbmQgZjY0LgorICBjYXNlIE1WVDo6ZjMyOiBjYXNlIE1WVDo6ZjY0OiBjYXNlIE1WVDo6djhpODogY2FzZSBNVlQ6OnY0aTE2OgorICBjYXNlIE1WVDo6djJpMzI6IGNhc2UgTVZUOjp2MWk2NDogY2FzZSBNVlQ6OnYyZjMyOgorICAgIFJSQyA9IEFSTTo6RFBSUmVnaXN0ZXJDbGFzczsKKyAgICBicmVhazsKKyAgY2FzZSBNVlQ6OnYxNmk4OiBjYXNlIE1WVDo6djhpMTY6IGNhc2UgTVZUOjp2NGkzMjogY2FzZSBNVlQ6OnYyaTY0OgorICBjYXNlIE1WVDo6djRmMzI6IGNhc2UgTVZUOjp2MmY2NDoKKyAgICBSUkMgPSBBUk06OkRQUlJlZ2lzdGVyQ2xhc3M7CisgICAgQ29zdCA9IDI7CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjp2NGk2NDoKKyAgICBSUkMgPSBBUk06OkRQUlJlZ2lzdGVyQ2xhc3M7CisgICAgQ29zdCA9IDQ7CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjp2OGk2NDoKKyAgICBSUkMgPSBBUk06OkRQUlJlZ2lzdGVyQ2xhc3M7CisgICAgQ29zdCA9IDg7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFJSQywgQ29zdCk7Cit9CisKK2NvbnN0IGNoYXIgKkFSTVRhcmdldExvd2VyaW5nOjpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogcmV0dXJuIDA7CisgIGNhc2UgQVJNSVNEOjpXcmFwcGVyOiAgICAgICByZXR1cm4gIkFSTUlTRDo6V3JhcHBlciI7CisgIGNhc2UgQVJNSVNEOjpXcmFwcGVySlQ6ICAgICByZXR1cm4gIkFSTUlTRDo6V3JhcHBlckpUIjsKKyAgY2FzZSBBUk1JU0Q6OkNBTEw6ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpDQUxMIjsKKyAgY2FzZSBBUk1JU0Q6OkNBTExfUFJFRDogICAgIHJldHVybiAiQVJNSVNEOjpDQUxMX1BSRUQiOworICBjYXNlIEFSTUlTRDo6Q0FMTF9OT0xJTks6ICAgcmV0dXJuICJBUk1JU0Q6OkNBTExfTk9MSU5LIjsKKyAgY2FzZSBBUk1JU0Q6OnRDQUxMOiAgICAgICAgIHJldHVybiAiQVJNSVNEOjp0Q0FMTCI7CisgIGNhc2UgQVJNSVNEOjpCUkNPTkQ6ICAgICAgICByZXR1cm4gIkFSTUlTRDo6QlJDT05EIjsKKyAgY2FzZSBBUk1JU0Q6OkJSX0pUOiAgICAgICAgIHJldHVybiAiQVJNSVNEOjpCUl9KVCI7CisgIGNhc2UgQVJNSVNEOjpCUjJfSlQ6ICAgICAgICByZXR1cm4gIkFSTUlTRDo6QlIyX0pUIjsKKyAgY2FzZSBBUk1JU0Q6OlJFVF9GTEFHOiAgICAgIHJldHVybiAiQVJNSVNEOjpSRVRfRkxBRyI7CisgIGNhc2UgQVJNSVNEOjpQSUNfQUREOiAgICAgICByZXR1cm4gIkFSTUlTRDo6UElDX0FERCI7CisgIGNhc2UgQVJNSVNEOjpDTVA6ICAgICAgICAgICByZXR1cm4gIkFSTUlTRDo6Q01QIjsKKyAgY2FzZSBBUk1JU0Q6OkNNUFo6ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpDTVBaIjsKKyAgY2FzZSBBUk1JU0Q6OkNNUEZQOiAgICAgICAgIHJldHVybiAiQVJNSVNEOjpDTVBGUCI7CisgIGNhc2UgQVJNSVNEOjpDTVBGUHcwOiAgICAgICByZXR1cm4gIkFSTUlTRDo6Q01QRlB3MCI7CisgIGNhc2UgQVJNSVNEOjpCQ0NfaTY0OiAgICAgICByZXR1cm4gIkFSTUlTRDo6QkNDX2k2NCI7CisgIGNhc2UgQVJNSVNEOjpGTVNUQVQ6ICAgICAgICByZXR1cm4gIkFSTUlTRDo6Rk1TVEFUIjsKKyAgY2FzZSBBUk1JU0Q6OkNNT1Y6ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpDTU9WIjsKKyAgY2FzZSBBUk1JU0Q6OkNORUc6ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpDTkVHIjsKKworICBjYXNlIEFSTUlTRDo6UkJJVDogICAgICAgICAgcmV0dXJuICJBUk1JU0Q6OlJCSVQiOworCisgIGNhc2UgQVJNSVNEOjpGVE9TSTogICAgICAgICByZXR1cm4gIkFSTUlTRDo6RlRPU0kiOworICBjYXNlIEFSTUlTRDo6RlRPVUk6ICAgICAgICAgcmV0dXJuICJBUk1JU0Q6OkZUT1VJIjsKKyAgY2FzZSBBUk1JU0Q6OlNJVE9GOiAgICAgICAgIHJldHVybiAiQVJNSVNEOjpTSVRPRiI7CisgIGNhc2UgQVJNSVNEOjpVSVRPRjogICAgICAgICByZXR1cm4gIkFSTUlTRDo6VUlUT0YiOworCisgIGNhc2UgQVJNSVNEOjpTUkxfRkxBRzogICAgICByZXR1cm4gIkFSTUlTRDo6U1JMX0ZMQUciOworICBjYXNlIEFSTUlTRDo6U1JBX0ZMQUc6ICAgICAgcmV0dXJuICJBUk1JU0Q6OlNSQV9GTEFHIjsKKyAgY2FzZSBBUk1JU0Q6OlJSWDogICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpSUlgiOworCisgIGNhc2UgQVJNSVNEOjpWTU9WUlJEOiAgICAgICAgIHJldHVybiAiQVJNSVNEOjpWTU9WUlJEIjsKKyAgY2FzZSBBUk1JU0Q6OlZNT1ZEUlI6ICAgICAgICAgcmV0dXJuICJBUk1JU0Q6OlZNT1ZEUlIiOworCisgIGNhc2UgQVJNSVNEOjpFSF9TSkxKX1NFVEpNUDogcmV0dXJuICJBUk1JU0Q6OkVIX1NKTEpfU0VUSk1QIjsKKyAgY2FzZSBBUk1JU0Q6OkVIX1NKTEpfTE9OR0pNUDpyZXR1cm4gIkFSTUlTRDo6RUhfU0pMSl9MT05HSk1QIjsKKworICBjYXNlIEFSTUlTRDo6VENfUkVUVVJOOiAgICAgcmV0dXJuICJBUk1JU0Q6OlRDX1JFVFVSTiI7CisgIAorICBjYXNlIEFSTUlTRDo6VEhSRUFEX1BPSU5URVI6cmV0dXJuICJBUk1JU0Q6OlRIUkVBRF9QT0lOVEVSIjsKKworICBjYXNlIEFSTUlTRDo6RFlOX0FMTE9DOiAgICAgcmV0dXJuICJBUk1JU0Q6OkRZTl9BTExPQyI7CisKKyAgY2FzZSBBUk1JU0Q6Ok1FTUJBUlJJRVI6ICAgIHJldHVybiAiQVJNSVNEOjpNRU1CQVJSSUVSIjsKKyAgY2FzZSBBUk1JU0Q6OlNZTkNCQVJSSUVSOiAgIHJldHVybiAiQVJNSVNEOjpTWU5DQkFSUklFUiI7CisKKyAgY2FzZSBBUk1JU0Q6OlZDRVE6ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpWQ0VRIjsKKyAgY2FzZSBBUk1JU0Q6OlZDR0U6ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpWQ0dFIjsKKyAgY2FzZSBBUk1JU0Q6OlZDR0VVOiAgICAgICAgIHJldHVybiAiQVJNSVNEOjpWQ0dFVSI7CisgIGNhc2UgQVJNSVNEOjpWQ0dUOiAgICAgICAgICByZXR1cm4gIkFSTUlTRDo6VkNHVCI7CisgIGNhc2UgQVJNSVNEOjpWQ0dUVTogICAgICAgICByZXR1cm4gIkFSTUlTRDo6VkNHVFUiOworICBjYXNlIEFSTUlTRDo6VlRTVDogICAgICAgICAgcmV0dXJuICJBUk1JU0Q6OlZUU1QiOworCisgIGNhc2UgQVJNSVNEOjpWU0hMOiAgICAgICAgICByZXR1cm4gIkFSTUlTRDo6VlNITCI7CisgIGNhc2UgQVJNSVNEOjpWU0hSczogICAgICAgICByZXR1cm4gIkFSTUlTRDo6VlNIUnMiOworICBjYXNlIEFSTUlTRDo6VlNIUnU6ICAgICAgICAgcmV0dXJuICJBUk1JU0Q6OlZTSFJ1IjsKKyAgY2FzZSBBUk1JU0Q6OlZTSExMczogICAgICAgIHJldHVybiAiQVJNSVNEOjpWU0hMTHMiOworICBjYXNlIEFSTUlTRDo6VlNITEx1OiAgICAgICAgcmV0dXJuICJBUk1JU0Q6OlZTSExMdSI7CisgIGNhc2UgQVJNSVNEOjpWU0hMTGk6ICAgICAgICByZXR1cm4gIkFSTUlTRDo6VlNITExpIjsKKyAgY2FzZSBBUk1JU0Q6OlZTSFJOOiAgICAgICAgIHJldHVybiAiQVJNSVNEOjpWU0hSTiI7CisgIGNhc2UgQVJNSVNEOjpWUlNIUnM6ICAgICAgICByZXR1cm4gIkFSTUlTRDo6VlJTSFJzIjsKKyAgY2FzZSBBUk1JU0Q6OlZSU0hSdTogICAgICAgIHJldHVybiAiQVJNSVNEOjpWUlNIUnUiOworICBjYXNlIEFSTUlTRDo6VlJTSFJOOiAgICAgICAgcmV0dXJuICJBUk1JU0Q6OlZSU0hSTiI7CisgIGNhc2UgQVJNSVNEOjpWUVNITHM6ICAgICAgICByZXR1cm4gIkFSTUlTRDo6VlFTSExzIjsKKyAgY2FzZSBBUk1JU0Q6OlZRU0hMdTogICAgICAgIHJldHVybiAiQVJNSVNEOjpWUVNITHUiOworICBjYXNlIEFSTUlTRDo6VlFTSExzdTogICAgICAgcmV0dXJuICJBUk1JU0Q6OlZRU0hMc3UiOworICBjYXNlIEFSTUlTRDo6VlFTSFJOczogICAgICAgcmV0dXJuICJBUk1JU0Q6OlZRU0hSTnMiOworICBjYXNlIEFSTUlTRDo6VlFTSFJOdTogICAgICAgcmV0dXJuICJBUk1JU0Q6OlZRU0hSTnUiOworICBjYXNlIEFSTUlTRDo6VlFTSFJOc3U6ICAgICAgcmV0dXJuICJBUk1JU0Q6OlZRU0hSTnN1IjsKKyAgY2FzZSBBUk1JU0Q6OlZRUlNIUk5zOiAgICAgIHJldHVybiAiQVJNSVNEOjpWUVJTSFJOcyI7CisgIGNhc2UgQVJNSVNEOjpWUVJTSFJOdTogICAgICByZXR1cm4gIkFSTUlTRDo6VlFSU0hSTnUiOworICBjYXNlIEFSTUlTRDo6VlFSU0hSTnN1OiAgICAgcmV0dXJuICJBUk1JU0Q6OlZRUlNIUk5zdSI7CisgIGNhc2UgQVJNSVNEOjpWR0VUTEFORXU6ICAgICByZXR1cm4gIkFSTUlTRDo6VkdFVExBTkV1IjsKKyAgY2FzZSBBUk1JU0Q6OlZHRVRMQU5FczogICAgIHJldHVybiAiQVJNSVNEOjpWR0VUTEFORXMiOworICBjYXNlIEFSTUlTRDo6Vk1PVklNTTogICAgICAgcmV0dXJuICJBUk1JU0Q6OlZNT1ZJTU0iOworICBjYXNlIEFSTUlTRDo6Vk1WTklNTTogICAgICAgcmV0dXJuICJBUk1JU0Q6OlZNVk5JTU0iOworICBjYXNlIEFSTUlTRDo6VkRVUDogICAgICAgICAgcmV0dXJuICJBUk1JU0Q6OlZEVVAiOworICBjYXNlIEFSTUlTRDo6VkRVUExBTkU6ICAgICAgcmV0dXJuICJBUk1JU0Q6OlZEVVBMQU5FIjsKKyAgY2FzZSBBUk1JU0Q6OlZFWFQ6ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpWRVhUIjsKKyAgY2FzZSBBUk1JU0Q6OlZSRVY2NDogICAgICAgIHJldHVybiAiQVJNSVNEOjpWUkVWNjQiOworICBjYXNlIEFSTUlTRDo6VlJFVjMyOiAgICAgICAgcmV0dXJuICJBUk1JU0Q6OlZSRVYzMiI7CisgIGNhc2UgQVJNSVNEOjpWUkVWMTY6ICAgICAgICByZXR1cm4gIkFSTUlTRDo6VlJFVjE2IjsKKyAgY2FzZSBBUk1JU0Q6OlZaSVA6ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpWWklQIjsKKyAgY2FzZSBBUk1JU0Q6OlZVWlA6ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpWVVpQIjsKKyAgY2FzZSBBUk1JU0Q6OlZUUk46ICAgICAgICAgIHJldHVybiAiQVJNSVNEOjpWVFJOIjsKKyAgY2FzZSBBUk1JU0Q6OkJVSUxEX1ZFQ1RPUjogIHJldHVybiAiQVJNSVNEOjpCVUlMRF9WRUNUT1IiOworICBjYXNlIEFSTUlTRDo6Rk1BWDogICAgICAgICAgcmV0dXJuICJBUk1JU0Q6OkZNQVgiOworICBjYXNlIEFSTUlTRDo6Rk1JTjogICAgICAgICAgcmV0dXJuICJBUk1JU0Q6OkZNSU4iOworICBjYXNlIEFSTUlTRDo6QkZJOiAgICAgICAgICAgcmV0dXJuICJBUk1JU0Q6OkJGSSI7CisgIH0KK30KKworLy8vIGdldFJlZ0NsYXNzRm9yIC0gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUKKy8vLyBzcGVjaWZpZWQgdmFsdWUgdHlwZS4KK1RhcmdldFJlZ2lzdGVyQ2xhc3MgKkFSTVRhcmdldExvd2VyaW5nOjpnZXRSZWdDbGFzc0ZvcihFVlQgVlQpIGNvbnN0IHsKKyAgLy8gTWFwIHY0aTY0IHRvIFFRIHJlZ2lzdGVycyBidXQgZG8gbm90IG1ha2UgdGhlIHR5cGUgbGVnYWwuIFNpbWlsYXJseSBtYXAKKyAgLy8gdjhpNjQgdG8gUVFRUSByZWdpc3RlcnMuIHY0aTY0IGFuZCB2OGk2NCBhcmUgb25seSB1c2VkIGZvciBSRUdfU0VRVUVOQ0UgdG8KKyAgLy8gbG9hZCAvIHN0b3JlIDQgdG8gOCBjb25zZWN1dGl2ZSBEIHJlZ2lzdGVycy4KKyAgaWYgKFN1YnRhcmdldC0+aGFzTkVPTigpKSB7CisgICAgaWYgKFZUID09IE1WVDo6djRpNjQpCisgICAgICByZXR1cm4gQVJNOjpRUVBSUmVnaXN0ZXJDbGFzczsKKyAgICBlbHNlIGlmIChWVCA9PSBNVlQ6OnY4aTY0KQorICAgICAgcmV0dXJuIEFSTTo6UVFRUVBSUmVnaXN0ZXJDbGFzczsKKyAgfQorICByZXR1cm4gVGFyZ2V0TG93ZXJpbmc6OmdldFJlZ0NsYXNzRm9yKFZUKTsKK30KKworLy8gQ3JlYXRlIGEgZmFzdCBpc2VsIG9iamVjdC4KK0Zhc3RJU2VsICoKK0FSTVRhcmdldExvd2VyaW5nOjpjcmVhdGVGYXN0SVNlbChGdW5jdGlvbkxvd2VyaW5nSW5mbyAmZnVuY0luZm8pIGNvbnN0IHsKKyAgcmV0dXJuIEFSTTo6Y3JlYXRlRmFzdElTZWwoZnVuY0luZm8pOworfQorCisvLy8gZ2V0RnVuY3Rpb25BbGlnbm1lbnQgLSBSZXR1cm4gdGhlIExvZzIgYWxpZ25tZW50IG9mIHRoaXMgZnVuY3Rpb24uCit1bnNpZ25lZCBBUk1UYXJnZXRMb3dlcmluZzo6Z2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFRhcmdldE1hY2hpbmUoKS5nZXRTdWJ0YXJnZXQ8QVJNU3VidGFyZ2V0PigpLmlzVGh1bWIoKSA/IDEgOiAyOworfQorCisvLy8gZ2V0TWF4aW1hbEdsb2JhbE9mZnNldCAtIFJldHVybnMgdGhlIG1heGltYWwgcG9zc2libGUgb2Zmc2V0IHdoaWNoIGNhbgorLy8vIGJlIHVzZWQgZm9yIGxvYWRzIC8gc3RvcmVzIGZyb20gdGhlIGdsb2JhbC4KK3Vuc2lnbmVkIEFSTVRhcmdldExvd2VyaW5nOjpnZXRNYXhpbWFsR2xvYmFsT2Zmc2V0KCkgY29uc3QgeworICByZXR1cm4gKFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkgPyAxMjcgOiA0MDk1KTsKK30KKworU2NoZWQ6OlByZWZlcmVuY2UgQVJNVGFyZ2V0TG93ZXJpbmc6OmdldFNjaGVkdWxpbmdQcmVmZXJlbmNlKFNETm9kZSAqTikgY29uc3QgeworICB1bnNpZ25lZCBOdW1WYWxzID0gTi0+Z2V0TnVtVmFsdWVzKCk7CisgIGlmICghTnVtVmFscykKKyAgICByZXR1cm4gU2NoZWQ6OlJlZ1ByZXNzdXJlOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtVmFsczsgKytpKSB7CisgICAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKGkpOworICAgIGlmIChWVC5pc0Zsb2F0aW5nUG9pbnQoKSB8fCBWVC5pc1ZlY3RvcigpKQorICAgICAgcmV0dXJuIFNjaGVkOjpMYXRlbmN5OworICB9CisKKyAgaWYgKCFOLT5pc01hY2hpbmVPcGNvZGUoKSkKKyAgICByZXR1cm4gU2NoZWQ6OlJlZ1ByZXNzdXJlOworCisgIC8vIExvYWQgYXJlIHNjaGVkdWxlZCBmb3IgbGF0ZW5jeSBldmVuIGlmIHRoZXJlIGluc3RydWN0aW9uIGl0aW5lcmFyeQorICAvLyBpcyBub3QgYXZhaWxhYmxlLgorICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IGdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBUSUktPmdldChOLT5nZXRNYWNoaW5lT3Bjb2RlKCkpOworICBpZiAoVElELm1heUxvYWQoKSkKKyAgICByZXR1cm4gU2NoZWQ6OkxhdGVuY3k7CisKKyAgY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICZJdGlucyA9IGdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckl0aW5lcmFyeURhdGEoKTsKKyAgaWYgKCFJdGlucy5pc0VtcHR5KCkgJiYgSXRpbnMuZ2V0U3RhZ2VMYXRlbmN5KFRJRC5nZXRTY2hlZENsYXNzKCkpID4gMikKKyAgICByZXR1cm4gU2NoZWQ6OkxhdGVuY3k7CisgIHJldHVybiBTY2hlZDo6UmVnUHJlc3N1cmU7Cit9CisKK3Vuc2lnbmVkCitBUk1UYXJnZXRMb3dlcmluZzo6Z2V0UmVnUHJlc3N1cmVMaW1pdChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgc3dpdGNoIChSQy0+Z2V0SUQoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiAwOworICBjYXNlIEFSTTo6dEdQUlJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIFJlZ0luZm8tPmhhc0ZQKE1GKSA/IDQgOiA1OworICBjYXNlIEFSTTo6R1BSUmVnQ2xhc3NJRDogeworICAgIHVuc2lnbmVkIEZQID0gUmVnSW5mby0+aGFzRlAoTUYpID8gMSA6IDA7CisgICAgcmV0dXJuIDEwIC0gRlAgLSAoU3VidGFyZ2V0LT5pc1I5UmVzZXJ2ZWQoKSA/IDEgOiAwKTsKKyAgfQorICBjYXNlIEFSTTo6U1BSUmVnQ2xhc3NJRDogIC8vIEN1cnJlbnRseSBub3QgdXNlZCBhcyAncmVwJyByZWdpc3RlciBjbGFzcy4KKyAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIDMyIC0gMTA7CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIExvd2VyaW5nIENvZGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBJbnRDQ1RvQVJNQ0MgLSBDb252ZXJ0IGEgREFHIGludGVnZXIgY29uZGl0aW9uIGNvZGUgdG8gYW4gQVJNIENDCitzdGF0aWMgQVJNQ0M6OkNvbmRDb2RlcyBJbnRDQ1RvQVJNQ0MoSVNEOjpDb25kQ29kZSBDQykgeworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29uZGl0aW9uIGNvZGUhIik7CisgIGNhc2UgSVNEOjpTRVRORTogIHJldHVybiBBUk1DQzo6TkU7CisgIGNhc2UgSVNEOjpTRVRFUTogIHJldHVybiBBUk1DQzo6RVE7CisgIGNhc2UgSVNEOjpTRVRHVDogIHJldHVybiBBUk1DQzo6R1Q7CisgIGNhc2UgSVNEOjpTRVRHRTogIHJldHVybiBBUk1DQzo6R0U7CisgIGNhc2UgSVNEOjpTRVRMVDogIHJldHVybiBBUk1DQzo6TFQ7CisgIGNhc2UgSVNEOjpTRVRMRTogIHJldHVybiBBUk1DQzo6TEU7CisgIGNhc2UgSVNEOjpTRVRVR1Q6IHJldHVybiBBUk1DQzo6SEk7CisgIGNhc2UgSVNEOjpTRVRVR0U6IHJldHVybiBBUk1DQzo6SFM7CisgIGNhc2UgSVNEOjpTRVRVTFQ6IHJldHVybiBBUk1DQzo6TE87CisgIGNhc2UgSVNEOjpTRVRVTEU6IHJldHVybiBBUk1DQzo6TFM7CisgIH0KK30KKworLy8vIEZQQ0NUb0FSTUNDIC0gQ29udmVydCBhIERBRyBmcCBjb25kaXRpb24gY29kZSB0byBhbiBBUk0gQ0MuCitzdGF0aWMgdm9pZCBGUENDVG9BUk1DQyhJU0Q6OkNvbmRDb2RlIENDLCBBUk1DQzo6Q29uZENvZGVzICZDb25kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgJkNvbmRDb2RlMikgeworICBDb25kQ29kZTIgPSBBUk1DQzo6QUw7CisgIHN3aXRjaCAoQ0MpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBGUCBjb25kaXRpb24hIik7CisgIGNhc2UgSVNEOjpTRVRFUToKKyAgY2FzZSBJU0Q6OlNFVE9FUTogQ29uZENvZGUgPSBBUk1DQzo6RVE7IGJyZWFrOworICBjYXNlIElTRDo6U0VUR1Q6CisgIGNhc2UgSVNEOjpTRVRPR1Q6IENvbmRDb2RlID0gQVJNQ0M6OkdUOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVEdFOgorICBjYXNlIElTRDo6U0VUT0dFOiBDb25kQ29kZSA9IEFSTUNDOjpHRTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRPTFQ6IENvbmRDb2RlID0gQVJNQ0M6Ok1JOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVE9MRTogQ29uZENvZGUgPSBBUk1DQzo6TFM7IGJyZWFrOworICBjYXNlIElTRDo6U0VUT05FOiBDb25kQ29kZSA9IEFSTUNDOjpNSTsgQ29uZENvZGUyID0gQVJNQ0M6OkdUOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVE86ICAgQ29uZENvZGUgPSBBUk1DQzo6VkM7IGJyZWFrOworICBjYXNlIElTRDo6U0VUVU86ICBDb25kQ29kZSA9IEFSTUNDOjpWUzsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRVRVE6IENvbmRDb2RlID0gQVJNQ0M6OkVROyBDb25kQ29kZTIgPSBBUk1DQzo6VlM7IGJyZWFrOworICBjYXNlIElTRDo6U0VUVUdUOiBDb25kQ29kZSA9IEFSTUNDOjpISTsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRVR0U6IENvbmRDb2RlID0gQVJNQ0M6OlBMOyBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVExUOgorICBjYXNlIElTRDo6U0VUVUxUOiBDb25kQ29kZSA9IEFSTUNDOjpMVDsgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRMRToKKyAgY2FzZSBJU0Q6OlNFVFVMRTogQ29uZENvZGUgPSBBUk1DQzo6TEU7IGJyZWFrOworICBjYXNlIElTRDo6U0VUTkU6CisgIGNhc2UgSVNEOjpTRVRVTkU6IENvbmRDb2RlID0gQVJNQ0M6Ok5FOyBicmVhazsKKyAgfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZyBDb252ZW50aW9uIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNR2VuQ2FsbGluZ0NvbnYuaW5jIgorCisvLyBBUENTIGY2NCBpcyBpbiByZWdpc3RlciBwYWlycywgcG9zc2libHkgc3BsaXQgdG8gc3RhY2sKK3N0YXRpYyBib29sIGY2NEFzc2lnbkFQQ1ModW5zaWduZWQgJlZhbE5vLCBFVlQgJlZhbFZULCBFVlQgJkxvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyAmTG9jSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTdGF0ZSAmU3RhdGUsIGJvb2wgQ2FuRmFpbCkgeworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdFtdID0geyBBUk06OlIwLCBBUk06OlIxLCBBUk06OlIyLCBBUk06OlIzIH07CisKKyAgLy8gVHJ5IHRvIGdldCB0aGUgZmlyc3QgcmVnaXN0ZXIuCisgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0LCA0KSkKKyAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldEN1c3RvbVJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsKKyAgZWxzZSB7CisgICAgLy8gRm9yIHRoZSAybmQgaGFsZiBvZiBhIHYyZjY0LCBkbyBub3QgZmFpbC4KKyAgICBpZiAoQ2FuRmFpbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFB1dCB0aGUgd2hvbGUgdGhpbmcgb24gdGhlIHN0YWNrLgorICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0Q3VzdG9tTWVtKFZhbE5vLCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZS5BbGxvY2F0ZVN0YWNrKDgsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1ZULCBMb2NJbmZvKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBUcnkgdG8gZ2V0IHRoZSBzZWNvbmQgcmVnaXN0ZXIuCisgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0LCA0KSkKKyAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldEN1c3RvbVJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsKKyAgZWxzZQorICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0Q3VzdG9tTWVtKFZhbE5vLCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZS5BbGxvY2F0ZVN0YWNrKDQsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1ZULCBMb2NJbmZvKSk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBDQ19BUk1fQVBDU19DdXN0b21fZjY0KHVuc2lnbmVkICZWYWxObywgRVZUICZWYWxWVCwgRVZUICZMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSAmQXJnRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU3RhdGUgJlN0YXRlKSB7CisgIGlmICghZjY0QXNzaWduQVBDUyhWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBTdGF0ZSwgdHJ1ZSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoTG9jVlQgPT0gTVZUOjp2MmY2NCAmJgorICAgICAgIWY2NEFzc2lnbkFQQ1MoVmFsTm8sIFZhbFZULCBMb2NWVCwgTG9jSW5mbywgU3RhdGUsIGZhbHNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOyAgLy8gd2UgaGFuZGxlZCBpdAorfQorCisvLyBBQVBDUyBmNjQgaXMgaW4gYWxpZ25lZCByZWdpc3RlciBwYWlycworc3RhdGljIGJvb2wgZjY0QXNzaWduQUFQQ1ModW5zaWduZWQgJlZhbE5vLCBFVlQgJlZhbFZULCBFVlQgJkxvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1N0YXRlICZTdGF0ZSwgYm9vbCBDYW5GYWlsKSB7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBIaVJlZ0xpc3RbXSA9IHsgQVJNOjpSMCwgQVJNOjpSMiB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTG9SZWdMaXN0W10gPSB7IEFSTTo6UjEsIEFSTTo6UjMgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFNoYWRvd1JlZ0xpc3RbXSA9IHsgQVJNOjpSMCwgQVJNOjpSMSB9OworCisgIHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKEhpUmVnTGlzdCwgU2hhZG93UmVnTGlzdCwgMik7CisgIGlmIChSZWcgPT0gMCkgeworICAgIC8vIEZvciB0aGUgMm5kIGhhbGYgb2YgYSB2MmY2NCwgZG8gbm90IGp1c3QgZmFpbC4KKyAgICBpZiAoQ2FuRmFpbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFB1dCB0aGUgd2hvbGUgdGhpbmcgb24gdGhlIHN0YWNrLgorICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0Q3VzdG9tTWVtKFZhbE5vLCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZS5BbGxvY2F0ZVN0YWNrKDgsIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1ZULCBMb2NJbmZvKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB1bnNpZ25lZCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQorICAgIGlmIChIaVJlZ0xpc3RbaV0gPT0gUmVnKQorICAgICAgYnJlYWs7CisKKyAgdW5zaWduZWQgVCA9IFN0YXRlLkFsbG9jYXRlUmVnKExvUmVnTGlzdFtpXSk7CisgICh2b2lkKVQ7CisgIGFzc2VydChUID09IExvUmVnTGlzdFtpXSAmJiAiQ291bGQgbm90IGFsbG9jYXRlIHJlZ2lzdGVyIik7CisKKyAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRDdXN0b21SZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7CisgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0Q3VzdG9tUmVnKFZhbE5vLCBWYWxWVCwgTG9SZWdMaXN0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NWVCwgTG9jSW5mbykpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgQ0NfQVJNX0FBUENTX0N1c3RvbV9mNjQodW5zaWduZWQgJlZhbE5vLCBFVlQgJlZhbFZULCBFVlQgJkxvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgJkFyZ0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTdGF0ZSAmU3RhdGUpIHsKKyAgaWYgKCFmNjRBc3NpZ25BQVBDUyhWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBTdGF0ZSwgdHJ1ZSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoTG9jVlQgPT0gTVZUOjp2MmY2NCAmJgorICAgICAgIWY2NEFzc2lnbkFBUENTKFZhbE5vLCBWYWxWVCwgTG9jVlQsIExvY0luZm8sIFN0YXRlLCBmYWxzZSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsgIC8vIHdlIGhhbmRsZWQgaXQKK30KKworc3RhdGljIGJvb2wgZjY0UmV0QXNzaWduKHVuc2lnbmVkICZWYWxObywgRVZUICZWYWxWVCwgRVZUICZMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyAmTG9jSW5mbywgQ0NTdGF0ZSAmU3RhdGUpIHsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEhpUmVnTGlzdFtdID0geyBBUk06OlIwLCBBUk06OlIyIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBMb1JlZ0xpc3RbXSA9IHsgQVJNOjpSMSwgQVJNOjpSMyB9OworCisgIHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKEhpUmVnTGlzdCwgTG9SZWdMaXN0LCAyKTsKKyAgaWYgKFJlZyA9PSAwKQorICAgIHJldHVybiBmYWxzZTsgLy8gd2UgZGlkbid0IGhhbmRsZSBpdAorCisgIHVuc2lnbmVkIGk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpCisgICAgaWYgKEhpUmVnTGlzdFtpXSA9PSBSZWcpCisgICAgICBicmVhazsKKworICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldEN1c3RvbVJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsKKyAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRDdXN0b21SZWcoVmFsTm8sIFZhbFZULCBMb1JlZ0xpc3RbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1ZULCBMb2NJbmZvKSk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBSZXRDQ19BUk1fQVBDU19DdXN0b21fZjY0KHVuc2lnbmVkICZWYWxObywgRVZUICZWYWxWVCwgRVZUICZMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSAmQXJnRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU3RhdGUgJlN0YXRlKSB7CisgIGlmICghZjY0UmV0QXNzaWduKFZhbE5vLCBWYWxWVCwgTG9jVlQsIExvY0luZm8sIFN0YXRlKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChMb2NWVCA9PSBNVlQ6OnYyZjY0ICYmICFmNjRSZXRBc3NpZ24oVmFsTm8sIFZhbFZULCBMb2NWVCwgTG9jSW5mbywgU3RhdGUpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7ICAvLyB3ZSBoYW5kbGVkIGl0Cit9CisKK3N0YXRpYyBib29sIFJldENDX0FSTV9BQVBDU19DdXN0b21fZjY0KHVuc2lnbmVkICZWYWxObywgRVZUICZWYWxWVCwgRVZUICZMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDVmFsQXNzaWduOjpMb2NJbmZvICZMb2NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5ICZBcmdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU3RhdGUgJlN0YXRlKSB7CisgIHJldHVybiBSZXRDQ19BUk1fQVBDU19DdXN0b21fZjY0KFZhbE5vLCBWYWxWVCwgTG9jVlQsIExvY0luZm8sIEFyZ0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7Cit9CisKKy8vLyBDQ0Fzc2lnbkZuRm9yTm9kZSAtIFNlbGVjdHMgdGhlIGNvcnJlY3QgQ0NBc3NpZ25GbiBmb3IgYSB0aGUKKy8vLyBnaXZlbiBDYWxsaW5nQ29udmVudGlvbiB2YWx1ZS4KK0NDQXNzaWduRm4gKkFSTVRhcmdldExvd2VyaW5nOjpDQ0Fzc2lnbkZuRm9yTm9kZShDYWxsaW5nQ29udjo6SUQgQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhckFyZykgY29uc3QgeworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgY2FsbGluZyBjb252ZW50aW9uIik7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkM6CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkZhc3Q6CisgICAgLy8gVXNlIHRhcmdldCB0cmlwbGUgJiBzdWJ0YXJnZXQgZmVhdHVyZXMgdG8gZG8gYWN0dWFsIGRpc3BhdGNoLgorICAgIGlmIChTdWJ0YXJnZXQtPmlzQUFQQ1NfQUJJKCkpIHsKKyAgICAgIGlmIChTdWJ0YXJnZXQtPmhhc1ZGUDIoKSAmJgorICAgICAgICAgIEZsb2F0QUJJVHlwZSA9PSBGbG9hdEFCSTo6SGFyZCAmJiAhaXNWYXJBcmcpCisgICAgICAgIHJldHVybiAoUmV0dXJuID8gUmV0Q0NfQVJNX0FBUENTX1ZGUDogQ0NfQVJNX0FBUENTX1ZGUCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoUmV0dXJuID8gUmV0Q0NfQVJNX0FBUENTOiBDQ19BUk1fQUFQQ1MpOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gKFJldHVybiA/IFJldENDX0FSTV9BUENTOiBDQ19BUk1fQVBDUyk7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkFSTV9BQVBDU19WRlA6CisgICAgcmV0dXJuIChSZXR1cm4gPyBSZXRDQ19BUk1fQUFQQ1NfVkZQOiBDQ19BUk1fQUFQQ1NfVkZQKTsKKyAgY2FzZSBDYWxsaW5nQ29udjo6QVJNX0FBUENTOgorICAgIHJldHVybiAoUmV0dXJuID8gUmV0Q0NfQVJNX0FBUENTOiBDQ19BUk1fQUFQQ1MpOworICBjYXNlIENhbGxpbmdDb252OjpBUk1fQVBDUzoKKyAgICByZXR1cm4gKFJldHVybiA/IFJldENDX0FSTV9BUENTOiBDQ19BUk1fQVBDUyk7CisgIH0KK30KKworLy8vIExvd2VyQ2FsbFJlc3VsdCAtIExvd2VyIHRoZSByZXN1bHQgdmFsdWVzIG9mIGEgY2FsbCBpbnRvIHRoZQorLy8vIGFwcHJvcHJpYXRlIGNvcGllcyBvdXQgb2YgYXBwcm9wcmlhdGUgcGh5c2ljYWwgcmVnaXN0ZXJzLgorU0RWYWx1ZQorQVJNVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbFJlc3VsdChTRFZhbHVlIENoYWluLCBTRFZhbHVlIEluRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworCisgIC8vIEFzc2lnbiBsb2NhdGlvbnMgdG8gZWFjaCB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGNhbGwuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gUlZMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgUlZMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisgIENDSW5mby5BbmFseXplQ2FsbFJlc3VsdChJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnbkZuRm9yTm9kZShDYWxsQ29udiwgLyogUmV0dXJuKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFyQXJnKSk7CisKKyAgLy8gQ29weSBhbGwgb2YgdGhlIHJlc3VsdCByZWdpc3RlcnMgb3V0IG9mIHRoZWlyIHNwZWNpZmllZCBwaHlzcmVnLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkgeworICAgIENDVmFsQXNzaWduIFZBID0gUlZMb2NzW2ldOworCisgICAgU0RWYWx1ZSBWYWw7CisgICAgaWYgKFZBLm5lZWRzQ3VzdG9tKCkpIHsKKyAgICAgIC8vIEhhbmRsZSBmNjQgb3IgaGFsZiBvZiBhIHYyZjY0LgorICAgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZBLmdldExvY1JlZygpLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5GbGFnKTsKKyAgICAgIENoYWluID0gTG8uZ2V0VmFsdWUoMSk7CisgICAgICBJbkZsYWcgPSBMby5nZXRWYWx1ZSgyKTsKKyAgICAgIFZBID0gUlZMb2NzWysraV07IC8vIHNraXAgYWhlYWQgdG8gbmV4dCBsb2MKKyAgICAgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRmxhZyk7CisgICAgICBDaGFpbiA9IEhpLmdldFZhbHVlKDEpOworICAgICAgSW5GbGFnID0gSGkuZ2V0VmFsdWUoMik7CisgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZNT1ZEUlIsIGRsLCBNVlQ6OmY2NCwgTG8sIEhpKTsKKworICAgICAgaWYgKFZBLmdldExvY1ZUKCkgPT0gTVZUOjp2MmY2NCkgeworICAgICAgICBTRFZhbHVlIFZlYyA9IERBRy5nZXROb2RlKElTRDo6VU5ERUYsIGRsLCBNVlQ6OnYyZjY0KTsKKyAgICAgICAgVmVjID0gREFHLmdldE5vZGUoSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgZGwsIE1WVDo6djJmNjQsIFZlYywgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpKTsKKworICAgICAgICBWQSA9IFJWTG9jc1srK2ldOyAvLyBza2lwIGFoZWFkIHRvIG5leHQgbG9jCisgICAgICAgIExvID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgVkEuZ2V0TG9jUmVnKCksIE1WVDo6aTMyLCBJbkZsYWcpOworICAgICAgICBDaGFpbiA9IExvLmdldFZhbHVlKDEpOworICAgICAgICBJbkZsYWcgPSBMby5nZXRWYWx1ZSgyKTsKKyAgICAgICAgVkEgPSBSVkxvY3NbKytpXTsgLy8gc2tpcCBhaGVhZCB0byBuZXh0IGxvYworICAgICAgICBIaSA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZBLmdldExvY1JlZygpLCBNVlQ6OmkzMiwgSW5GbGFnKTsKKyAgICAgICAgQ2hhaW4gPSBIaS5nZXRWYWx1ZSgxKTsKKyAgICAgICAgSW5GbGFnID0gSGkuZ2V0VmFsdWUoMik7CisgICAgICAgIFZhbCA9IERBRy5nZXROb2RlKEFSTUlTRDo6Vk1PVkRSUiwgZGwsIE1WVDo6ZjY0LCBMbywgSGkpOworICAgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCBkbCwgTVZUOjp2MmY2NCwgVmVjLCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6OmkzMikpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBWYWwgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwgVkEuZ2V0TG9jVlQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkZsYWcpOworICAgICAgQ2hhaW4gPSBWYWwuZ2V0VmFsdWUoMSk7CisgICAgICBJbkZsYWcgPSBWYWwuZ2V0VmFsdWUoMik7CisgICAgfQorCisgICAgc3dpdGNoIChWQS5nZXRMb2NJbmZvKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGxvYyBpbmZvISIpOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OkZ1bGw6IGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OkJDdnQ6CisgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVkEuZ2V0VmFsVlQoKSwgVmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIEluVmFscy5wdXNoX2JhY2soVmFsKTsKKyAgfQorCisgIHJldHVybiBDaGFpbjsKK30KKworLy8vIENyZWF0ZUNvcHlPZkJ5VmFsQXJndW1lbnQgLSBNYWtlIGEgY29weSBvZiBhbiBhZ2dyZWdhdGUgYXQgYWRkcmVzcyBzcGVjaWZpZWQKKy8vLyBieSAiU3JjIiB0byBhZGRyZXNzICJEc3QiIG9mIHNpemUgIlNpemUiLiAgQWxpZ25tZW50IGluZm9ybWF0aW9uIGlzCisvLy8gc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXIgYXR0cmlidXRlLiAgVGhlIGNvcHkgd2lsbCBiZSBwYXNzZWQgYXMKKy8vLyBhIGJ5dmFsIGZ1bmN0aW9uIHBhcmFtZXRlci4KKy8vLyBTb21ldGltZXMgd2hhdCB3ZSBhcmUgY29weWluZyBpcyB0aGUgZW5kIG9mIGEgbGFyZ2VyIG9iamVjdCwgdGhlIHBhcnQgdGhhdAorLy8vIGRvZXMgbm90IGZpdCBpbiByZWdpc3RlcnMuCitzdGF0aWMgU0RWYWx1ZQorQ3JlYXRlQ29weU9mQnlWYWxBcmd1bWVudChTRFZhbHVlIFNyYywgU0RWYWx1ZSBEc3QsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBGbGFncywgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIFNEVmFsdWUgU2l6ZU5vZGUgPSBEQUcuZ2V0Q29uc3RhbnQoRmxhZ3MuZ2V0QnlWYWxTaXplKCksIE1WVDo6aTMyKTsKKyAgcmV0dXJuIERBRy5nZXRNZW1jcHkoQ2hhaW4sIGRsLCBEc3QsIFNyYywgU2l6ZU5vZGUsIEZsYWdzLmdldEJ5VmFsQWxpZ24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgLyppc1ZvbGF0aWxlPSovZmFsc2UsIC8qQWx3YXlzSW5saW5lPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIDApOworfQorCisvLy8gTG93ZXJNZW1PcENhbGxUbyAtIFN0b3JlIHRoZSBhcmd1bWVudCB0byB0aGUgc3RhY2suCitTRFZhbHVlCitBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJNZW1PcENhbGxUbyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTdGFja1B0ciwgU0RWYWx1ZSBBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDQ1ZhbEFzc2lnbiAmVkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MpIGNvbnN0IHsKKyAgdW5zaWduZWQgTG9jTWVtT2Zmc2V0ID0gVkEuZ2V0TG9jTWVtT2Zmc2V0KCk7CisgIFNEVmFsdWUgUHRyT2ZmID0gREFHLmdldEludFB0ckNvbnN0YW50KExvY01lbU9mZnNldCk7CisgIFB0ck9mZiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgZ2V0UG9pbnRlclR5KCksIFN0YWNrUHRyLCBQdHJPZmYpOworICBpZiAoRmxhZ3MuaXNCeVZhbCgpKSB7CisgICAgcmV0dXJuIENyZWF0ZUNvcHlPZkJ5VmFsQXJndW1lbnQoQXJnLCBQdHJPZmYsIENoYWluLCBGbGFncywgREFHLCBkbCk7CisgIH0KKyAgcmV0dXJuIERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIEFyZywgUHRyT2ZmLAorICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRTdGFjaygpLCBMb2NNZW1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKK30KKwordm9pZCBBUk1UYXJnZXRMb3dlcmluZzo6UGFzc0Y2NEFyZ0luUmVncyhEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgJkFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1ZlY3RvciAmUmVnc1RvUGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ24gJlZBLCBDQ1ZhbEFzc2lnbiAmTmV4dFZBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZTdGFja1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gJk1lbU9wQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MpIGNvbnN0IHsKKworICBTRFZhbHVlIGZtcnJkID0gREFHLmdldE5vZGUoQVJNSVNEOjpWTU9WUlJELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoTVZUOjppMzIsIE1WVDo6aTMyKSwgQXJnKTsKKyAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoVkEuZ2V0TG9jUmVnKCksIGZtcnJkKSk7CisKKyAgaWYgKE5leHRWQS5pc1JlZ0xvYygpKQorICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE5leHRWQS5nZXRMb2NSZWcoKSwgZm1ycmQuZ2V0VmFsdWUoMSkpKTsKKyAgZWxzZSB7CisgICAgYXNzZXJ0KE5leHRWQS5pc01lbUxvYygpKTsKKyAgICBpZiAoU3RhY2tQdHIuZ2V0Tm9kZSgpID09IDApCisgICAgICBTdGFja1B0ciA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIEFSTTo6U1AsIGdldFBvaW50ZXJUeSgpKTsKKworICAgIE1lbU9wQ2hhaW5zLnB1c2hfYmFjayhMb3dlck1lbU9wQ2FsbFRvKENoYWluLCBTdGFja1B0ciwgZm1ycmQuZ2V0VmFsdWUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIERBRywgTmV4dFZBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKSk7CisgIH0KK30KKworLy8vIExvd2VyQ2FsbCAtIExvd2VyaW5nIGEgY2FsbCBpbnRvIGEgY2FsbHNlcV9zdGFydCA8LQorLy8vIEFSTUlTRDpDQUxMIDwtIGNhbGxzZXFfZW5kIGNoYWluLiBBbHNvIGFkZCBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgorLy8vIG5vZGVzLgorU0RWYWx1ZQorQVJNVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdCB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIGJvb2wgSXNTdHJ1Y3RSZXQgICAgPSAoT3V0cy5lbXB0eSgpKSA/IGZhbHNlIDogT3V0c1swXS5GbGFncy5pc1NSZXQoKTsKKyAgYm9vbCBJc1NpYkNhbGwgPSBmYWxzZTsKKyAgaWYgKGlzVGFpbENhbGwpIHsKKyAgICAvLyBDaGVjayBpZiBpdCdzIHJlYWxseSBwb3NzaWJsZSB0byBkbyBhIHRhaWwgY2FsbC4KKyAgICBpc1RhaWxDYWxsID0gSXNFbGlnaWJsZUZvclRhaWxDYWxsT3B0aW1pemF0aW9uKENhbGxlZSwgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgIGlzVmFyQXJnLCBJc1N0cnVjdFJldCwgTUYuZ2V0RnVuY3Rpb24oKS0+aGFzU3RydWN0UmV0QXR0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cywgT3V0VmFscywgSW5zLCBEQUcpOworICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgR3VhcmFudGVlZFRhaWxDYWxsT3B0IGZvciBBUk0sIG9ubHkgYXV0b21hdGljYWxseQorICAgIC8vIGRldGVjdGVkIHNpYmNhbGxzLgorICAgIGlmIChpc1RhaWxDYWxsKSB7CisgICAgICArK051bVRhaWxDYWxsczsKKyAgICAgIElzU2liQ2FsbCA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8gQW5hbHl6ZSBvcGVyYW5kcyBvZiB0aGUgY2FsbCwgYXNzaWduaW5nIGxvY2F0aW9ucyB0byBlYWNoIG9wZXJhbmQuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gQXJnTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksIEFyZ0xvY3MsCisgICAgICAgICAgICAgICAgICpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgQ0NJbmZvLkFuYWx5emVDYWxsT3BlcmFuZHMoT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbkZvck5vZGUoQ2FsbENvbnYsIC8qIFJldHVybiovIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhckFyZykpOworCisgIC8vIEdldCBhIGNvdW50IG9mIGhvdyBtYW55IGJ5dGVzIGFyZSB0byBiZSBwdXNoZWQgb24gdGhlIHN0YWNrLgorICB1bnNpZ25lZCBOdW1CeXRlcyA9IENDSW5mby5nZXROZXh0U3RhY2tPZmZzZXQoKTsKKworICAvLyBGb3IgdGFpbCBjYWxscywgbWVtb3J5IG9wZXJhbmRzIGFyZSBhdmFpbGFibGUgaW4gb3VyIGNhbGxlcidzIHN0YWNrLgorICBpZiAoSXNTaWJDYWxsKQorICAgIE51bUJ5dGVzID0gMDsKKworICAvLyBBZGp1c3QgdGhlIHN0YWNrIHBvaW50ZXIgZm9yIHRoZSBuZXcgYXJndW1lbnRzLi4uCisgIC8vIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZWxpbWluYXRlZCBieSB0aGUgcHJvbG9nL2VwaWxvZyBwYXNzCisgIGlmICghSXNTaWJDYWxsKQorICAgIENoYWluID0gREFHLmdldENBTExTRVFfU1RBUlQoQ2hhaW4sIERBRy5nZXRJbnRQdHJDb25zdGFudChOdW1CeXRlcywgdHJ1ZSkpOworCisgIFNEVmFsdWUgU3RhY2tQdHIgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBBUk06OlNQLCBnZXRQb2ludGVyVHkoKSk7CisKKyAgUmVnc1RvUGFzc1ZlY3RvciBSZWdzVG9QYXNzOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBNZW1PcENoYWluczsKKworICAvLyBXYWxrIHRoZSByZWdpc3Rlci9tZW1sb2MgYXNzaWdubWVudHMsIGluc2VydGluZyBjb3BpZXMvbG9hZHMuICBJbiB0aGUgY2FzZQorICAvLyBvZiB0YWlsIGNhbGwgb3B0aW1pemF0aW9uLCBhcmd1bWVudHMgYXJlIGhhbmRsZWQgbGF0ZXIuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIHJlYWxBcmdJZHggPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7CisgICAgICAgaSAhPSBlOworICAgICAgICsraSwgKytyZWFsQXJnSWR4KSB7CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tpXTsKKyAgICBTRFZhbHVlIEFyZyA9IE91dFZhbHNbcmVhbEFyZ0lkeF07CisgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzID0gT3V0c1tyZWFsQXJnSWR4XS5GbGFnczsKKworICAgIC8vIFByb21vdGUgdGhlIHZhbHVlIGlmIG5lZWRlZC4KKyAgICBzd2l0Y2ggKFZBLmdldExvY0luZm8oKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbG9jIGluZm8hIik7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6RnVsbDogYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6U0V4dDoKKyAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6WkV4dDoKKyAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6QUV4dDoKKyAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIFZBLmdldExvY1ZUKCksIEFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENDVmFsQXNzaWduOjpCQ3Z0OgorICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZBLmdldExvY1ZUKCksIEFyZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBmNjQgYW5kIHYyZjY0IG1pZ2h0IGJlIHBhc3NlZCBpbiBpMzIgcGFpcnMgYW5kIG11c3QgYmUgc3BsaXQgaW50byBwaWVjZXMKKyAgICBpZiAoVkEubmVlZHNDdXN0b20oKSkgeworICAgICAgaWYgKFZBLmdldExvY1ZUKCkgPT0gTVZUOjp2MmY2NCkgeworICAgICAgICBTRFZhbHVlIE9wMCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgTVZUOjpmNjQsIEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpKTsKKyAgICAgICAgU0RWYWx1ZSBPcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE1WVDo6ZjY0LCBBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTMyKSk7CisKKyAgICAgICAgUGFzc0Y2NEFyZ0luUmVncyhkbCwgREFHLCBDaGFpbiwgT3AwLCBSZWdzVG9QYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZBLCBBcmdMb2NzWysraV0sIFN0YWNrUHRyLCBNZW1PcENoYWlucywgRmxhZ3MpOworCisgICAgICAgIFZBID0gQXJnTG9jc1srK2ldOyAvLyBza2lwIGFoZWFkIHRvIG5leHQgbG9jCisgICAgICAgIGlmIChWQS5pc1JlZ0xvYygpKSB7CisgICAgICAgICAgUGFzc0Y2NEFyZ0luUmVncyhkbCwgREFHLCBDaGFpbiwgT3AxLCBSZWdzVG9QYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVkEsIEFyZ0xvY3NbKytpXSwgU3RhY2tQdHIsIE1lbU9wQ2hhaW5zLCBGbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0KFZBLmlzTWVtTG9jKCkpOworCisgICAgICAgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKExvd2VyTWVtT3BDYWxsVG8oQ2hhaW4sIFN0YWNrUHRyLCBPcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIERBRywgVkEsIEZsYWdzKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFBhc3NGNjRBcmdJblJlZ3MoZGwsIERBRywgQ2hhaW4sIEFyZywgUmVnc1RvUGFzcywgVkEsIEFyZ0xvY3NbKytpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdGFja1B0ciwgTWVtT3BDaGFpbnMsIEZsYWdzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFZBLmlzUmVnTG9jKCkpIHsKKyAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFZBLmdldExvY1JlZygpLCBBcmcpKTsKKyAgICB9IGVsc2UgaWYgKCFJc1NpYkNhbGwpIHsKKyAgICAgIGFzc2VydChWQS5pc01lbUxvYygpKTsKKworICAgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKExvd2VyTWVtT3BDYWxsVG8oQ2hhaW4sIFN0YWNrUHRyLCBBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCwgREFHLCBWQSwgRmxhZ3MpKTsKKyAgICB9CisgIH0KKworICBpZiAoIU1lbU9wQ2hhaW5zLmVtcHR5KCkpCisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZNZW1PcENoYWluc1swXSwgTWVtT3BDaGFpbnMuc2l6ZSgpKTsKKworICAvLyBCdWlsZCBhIHNlcXVlbmNlIG9mIGNvcHktdG8tcmVnIG5vZGVzIGNoYWluZWQgdG9nZXRoZXIgd2l0aCB0b2tlbiBjaGFpbgorICAvLyBhbmQgZmxhZyBvcGVyYW5kcyB3aGljaCBjb3B5IHRoZSBvdXRnb2luZyBhcmdzIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlZ3MuCisgIFNEVmFsdWUgSW5GbGFnOworICAvLyBUYWlsIGNhbGwgYnl2YWwgbG93ZXJpbmcgbWlnaHQgb3ZlcndyaXRlIGFyZ3VtZW50IHJlZ2lzdGVycyBzbyBpbiBjYXNlIG9mCisgIC8vIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24gdGhlIGNvcGllcyB0byByZWdpc3RlcnMgYXJlIGxvd2VyZWQgbGF0ZXIuCisgIGlmICghaXNUYWlsQ2FsbCkKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBSZWdzVG9QYXNzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3NUb1Bhc3NbaV0uc2Vjb25kLCBJbkZsYWcpOworICAgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgICAgfQorCisgIC8vIEZvciB0YWlsIGNhbGxzIGxvd2VyIHRoZSBhcmd1bWVudHMgdG8gdGhlICdyZWFsJyBzdGFjayBzbG90LgorICBpZiAoaXNUYWlsQ2FsbCkgeworICAgIC8vIEZvcmNlIGFsbCB0aGUgaW5jb21pbmcgc3RhY2sgYXJndW1lbnRzIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBzdGFjaworICAgIC8vIGJlZm9yZSBhbnkgbmV3IG91dGdvaW5nIGFyZ3VtZW50cyBhcmUgc3RvcmVkIHRvIHRoZSBzdGFjaywgYmVjYXVzZSB0aGUKKyAgICAvLyBvdXRnb2luZyBzdGFjayBzbG90cyBtYXkgYWxpYXMgdGhlIGluY29taW5nIGFyZ3VtZW50IHN0YWNrIHNsb3RzLCBhbmQKKyAgICAvLyB0aGUgYWxpYXMgaXNuJ3Qgb3RoZXJ3aXNlIGV4cGxpY2l0LiBUaGlzIGlzIHNsaWdodGx5IG1vcmUgY29uc2VydmF0aXZlCisgICAgLy8gdGhhbiBuZWNlc3NhcnksIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCBlYWNoIHN0b3JlIGVmZmVjdGl2ZWx5IGRlcGVuZHMKKyAgICAvLyBvbiBldmVyeSBhcmd1bWVudCBpbnN0ZWFkIG9mIGp1c3QgdGhvc2UgYXJndW1lbnRzIGl0IHdvdWxkIGNsb2JiZXIuCisKKyAgICAvLyBEbyBub3QgZmxhZyBwcmVjZWVkaW5nIGNvcHl0b3JlZyBzdHVmZiB0b2dldGhlciB3aXRoIHRoZSBmb2xsb3dpbmcgc3R1ZmYuCisgICAgSW5GbGFnID0gU0RWYWx1ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzVG9QYXNzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFJlZ3NUb1Bhc3NbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQsIEluRmxhZyk7CisgICAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgICB9CisgICAgSW5GbGFnID1TRFZhbHVlKCk7CisgIH0KKworICAvLyBJZiB0aGUgY2FsbGVlIGlzIGEgR2xvYmFsQWRkcmVzcy9FeHRlcm5hbFN5bWJvbCBub2RlIChxdWl0ZSBjb21tb24sIGV2ZXJ5CisgIC8vIGRpcmVjdCBjYWxsIGlzKSB0dXJuIGl0IGludG8gYSBUYXJnZXRHbG9iYWxBZGRyZXNzL1RhcmdldEV4dGVybmFsU3ltYm9sCisgIC8vIG5vZGUgc28gdGhhdCBsZWdhbGl6ZSBkb2Vzbid0IGhhY2sgaXQuCisgIGJvb2wgaXNEaXJlY3QgPSBmYWxzZTsKKyAgYm9vbCBpc0FSTUZ1bmMgPSBmYWxzZTsKKyAgYm9vbCBpc0xvY2FsQVJNRnVuYyA9IGZhbHNlOworICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworCisgIGlmIChFbmFibGVBUk1Mb25nQ2FsbHMpIHsKKyAgICBhc3NlcnQgKGdldFRhcmdldE1hY2hpbmUoKS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6U3RhdGljCisgICAgICAgICAgICAmJiAibG9uZy1jYWxscyB3aXRoIG5vbi1zdGF0aWMgcmVsb2NhdGlvbiBtb2RlbCEiKTsKKyAgICAvLyBIYW5kbGUgYSBnbG9iYWwgYWRkcmVzcyBvciBhbiBleHRlcm5hbCBzeW1ib2wuIElmIGl0J3Mgbm90IG9uZSBvZgorICAgIC8vIHRob3NlLCB0aGUgdGFyZ2V0J3MgYWxyZWFkeSBpbiBhIHJlZ2lzdGVyLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRvCisgICAgLy8gYW55dGhpbmcgZXh0cmEuCisgICAgaWYgKEdsb2JhbEFkZHJlc3NTRE5vZGUgKkcgPSBkeW5fY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihDYWxsZWUpKSB7CisgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBHLT5nZXRHbG9iYWwoKTsKKyAgICAgIC8vIENyZWF0ZSBhIGNvbnN0YW50IHBvb2wgZW50cnkgZm9yIHRoZSBjYWxsZWUgYWRkcmVzcworICAgICAgdW5zaWduZWQgQVJNUENMYWJlbEluZGV4ID0gQUZJLT5jcmVhdGVDb25zdFBvb2xFbnRyeVVJZCgpOworICAgICAgQVJNQ29uc3RhbnRQb29sVmFsdWUgKkNQViA9IG5ldyBBUk1Db25zdGFudFBvb2xWYWx1ZShHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNUENMYWJlbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DUDo6Q1BWYWx1ZSwgMCk7CisgICAgICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGxlZSBpbnRvIGEgcmVnaXN0ZXIKKyAgICAgIFNEVmFsdWUgQ1BBZGRyID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDUFYsIGdldFBvaW50ZXJUeSgpLCA0KTsKKyAgICAgIENQQWRkciA9IERBRy5nZXROb2RlKEFSTUlTRDo6V3JhcHBlciwgZGwsIE1WVDo6aTMyLCBDUEFkZHIpOworICAgICAgQ2FsbGVlID0gREFHLmdldExvYWQoZ2V0UG9pbnRlclR5KCksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEVudHJ5Tm9kZSgpLCBDUEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Q29uc3RhbnRQb29sKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgIH0gZWxzZSBpZiAoRXh0ZXJuYWxTeW1ib2xTRE5vZGUgKlM9ZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpIHsKKyAgICAgIGNvbnN0IGNoYXIgKlN5bSA9IFMtPmdldFN5bWJvbCgpOworCisgICAgICAvLyBDcmVhdGUgYSBjb25zdGFudCBwb29sIGVudHJ5IGZvciB0aGUgY2FsbGVlIGFkZHJlc3MKKyAgICAgIHVuc2lnbmVkIEFSTVBDTGFiZWxJbmRleCA9IEFGSS0+Y3JlYXRlQ29uc3RQb29sRW50cnlVSWQoKTsKKyAgICAgIEFSTUNvbnN0YW50UG9vbFZhbHVlICpDUFYgPSBuZXcgQVJNQ29uc3RhbnRQb29sVmFsdWUoKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltLCBBUk1QQ0xhYmVsSW5kZXgsIDApOworICAgICAgLy8gR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsZWUgaW50byBhIHJlZ2lzdGVyCisgICAgICBTRFZhbHVlIENQQWRkciA9IERBRy5nZXRUYXJnZXRDb25zdGFudFBvb2woQ1BWLCBnZXRQb2ludGVyVHkoKSwgNCk7CisgICAgICBDUEFkZHIgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OldyYXBwZXIsIGRsLCBNVlQ6OmkzMiwgQ1BBZGRyKTsKKyAgICAgIENhbGxlZSA9IERBRy5nZXRMb2FkKGdldFBvaW50ZXJUeSgpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRFbnRyeU5vZGUoKSwgQ1BBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KENhbGxlZSkpIHsKKyAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBHLT5nZXRHbG9iYWwoKTsKKyAgICBpc0RpcmVjdCA9IHRydWU7CisgICAgYm9vbCBpc0V4dCA9IEdWLT5pc0RlY2xhcmF0aW9uKCkgfHwgR1YtPmlzV2Vha0ZvckxpbmtlcigpOworICAgIGJvb2wgaXNTdHViID0gKGlzRXh0ICYmIFN1YnRhcmdldC0+aXNUYXJnZXREYXJ3aW4oKSkgJiYKKyAgICAgICAgICAgICAgICAgICBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgIT0gUmVsb2M6OlN0YXRpYzsKKyAgICBpc0FSTUZ1bmMgPSAhU3VidGFyZ2V0LT5pc1RodW1iKCkgfHwgaXNTdHViOworICAgIC8vIEFSTSBjYWxsIHRvIGEgbG9jYWwgQVJNIGZ1bmN0aW9uIGlzIHByZWRpY2FibGUuCisgICAgaXNMb2NhbEFSTUZ1bmMgPSAhU3VidGFyZ2V0LT5pc1RodW1iKCkgJiYgKCFpc0V4dCB8fCAhQVJNSW50ZXJ3b3JraW5nKTsKKyAgICAvLyB0QlggdGFrZXMgYSByZWdpc3RlciBzb3VyY2Ugb3BlcmFuZC4KKyAgICBpZiAoaXNBUk1GdW5jICYmIFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkgJiYgIVN1YnRhcmdldC0+aGFzVjVUT3BzKCkpIHsKKyAgICAgIHVuc2lnbmVkIEFSTVBDTGFiZWxJbmRleCA9IEFGSS0+Y3JlYXRlQ29uc3RQb29sRW50cnlVSWQoKTsKKyAgICAgIEFSTUNvbnN0YW50UG9vbFZhbHVlICpDUFYgPSBuZXcgQVJNQ29uc3RhbnRQb29sVmFsdWUoR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTVBDTGFiZWxJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ1A6OkNQVmFsdWUsIDQpOworICAgICAgU0RWYWx1ZSBDUEFkZHIgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKENQViwgZ2V0UG9pbnRlclR5KCksIDQpOworICAgICAgQ1BBZGRyID0gREFHLmdldE5vZGUoQVJNSVNEOjpXcmFwcGVyLCBkbCwgTVZUOjppMzIsIENQQWRkcik7CisgICAgICBDYWxsZWUgPSBEQUcuZ2V0TG9hZChnZXRQb2ludGVyVHkoKSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0RW50cnlOb2RlKCksIENQQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICBTRFZhbHVlIFBJQ0xhYmVsID0gREFHLmdldENvbnN0YW50KEFSTVBDTGFiZWxJbmRleCwgTVZUOjppMzIpOworICAgICAgQ2FsbGVlID0gREFHLmdldE5vZGUoQVJNSVNEOjpQSUNfQURELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBvaW50ZXJUeSgpLCBDYWxsZWUsIFBJQ0xhYmVsKTsKKyAgICB9IGVsc2UKKyAgICAgIENhbGxlZSA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEdWLCBkbCwgZ2V0UG9pbnRlclR5KCkpOworICB9IGVsc2UgaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpTID0gZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpIHsKKyAgICBpc0RpcmVjdCA9IHRydWU7CisgICAgYm9vbCBpc1N0dWIgPSBTdWJ0YXJnZXQtPmlzVGFyZ2V0RGFyd2luKCkgJiYKKyAgICAgICAgICAgICAgICAgIGdldFRhcmdldE1hY2hpbmUoKS5nZXRSZWxvY2F0aW9uTW9kZWwoKSAhPSBSZWxvYzo6U3RhdGljOworICAgIGlzQVJNRnVuYyA9ICFTdWJ0YXJnZXQtPmlzVGh1bWIoKSB8fCBpc1N0dWI7CisgICAgLy8gdEJYIHRha2VzIGEgcmVnaXN0ZXIgc291cmNlIG9wZXJhbmQuCisgICAgY29uc3QgY2hhciAqU3ltID0gUy0+Z2V0U3ltYm9sKCk7CisgICAgaWYgKGlzQVJNRnVuYyAmJiBTdWJ0YXJnZXQtPmlzVGh1bWIxT25seSgpICYmICFTdWJ0YXJnZXQtPmhhc1Y1VE9wcygpKSB7CisgICAgICB1bnNpZ25lZCBBUk1QQ0xhYmVsSW5kZXggPSBBRkktPmNyZWF0ZUNvbnN0UG9vbEVudHJ5VUlkKCk7CisgICAgICBBUk1Db25zdGFudFBvb2xWYWx1ZSAqQ1BWID0gbmV3IEFSTUNvbnN0YW50UG9vbFZhbHVlKCpEQUcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bSwgQVJNUENMYWJlbEluZGV4LCA0KTsKKyAgICAgIFNEVmFsdWUgQ1BBZGRyID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDUFYsIGdldFBvaW50ZXJUeSgpLCA0KTsKKyAgICAgIENQQWRkciA9IERBRy5nZXROb2RlKEFSTUlTRDo6V3JhcHBlciwgZGwsIE1WVDo6aTMyLCBDUEFkZHIpOworICAgICAgQ2FsbGVlID0gREFHLmdldExvYWQoZ2V0UG9pbnRlclR5KCksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEVudHJ5Tm9kZSgpLCBDUEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Q29uc3RhbnRQb29sKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgU0RWYWx1ZSBQSUNMYWJlbCA9IERBRy5nZXRDb25zdGFudChBUk1QQ0xhYmVsSW5kZXgsIE1WVDo6aTMyKTsKKyAgICAgIENhbGxlZSA9IERBRy5nZXROb2RlKEFSTUlTRDo6UElDX0FERCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSwgQ2FsbGVlLCBQSUNMYWJlbCk7CisgICAgfSBlbHNlCisgICAgICBDYWxsZWUgPSBEQUcuZ2V0VGFyZ2V0RXh0ZXJuYWxTeW1ib2woU3ltLCBnZXRQb2ludGVyVHkoKSk7CisgIH0KKworICAvLyBGSVhNRTogaGFuZGxlIHRhaWwgY2FsbHMgZGlmZmVyZW50bHkuCisgIHVuc2lnbmVkIENhbGxPcGM7CisgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIoKSkgeworICAgIGlmICgoIWlzRGlyZWN0IHx8IGlzQVJNRnVuYykgJiYgIVN1YnRhcmdldC0+aGFzVjVUT3BzKCkpCisgICAgICBDYWxsT3BjID0gQVJNSVNEOjpDQUxMX05PTElOSzsKKyAgICBlbHNlCisgICAgICBDYWxsT3BjID0gaXNBUk1GdW5jID8gQVJNSVNEOjpDQUxMIDogQVJNSVNEOjp0Q0FMTDsKKyAgfSBlbHNlIHsKKyAgICBDYWxsT3BjID0gKGlzRGlyZWN0IHx8IFN1YnRhcmdldC0+aGFzVjVUT3BzKCkpCisgICAgICA/IChpc0xvY2FsQVJNRnVuYyA/IEFSTUlTRDo6Q0FMTF9QUkVEIDogQVJNSVNEOjpDQUxMKQorICAgICAgOiBBUk1JU0Q6OkNBTExfTk9MSU5LOworICB9CisKKyAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gT3BzOworICBPcHMucHVzaF9iYWNrKENoYWluKTsKKyAgT3BzLnB1c2hfYmFjayhDYWxsZWUpOworCisgIC8vIEFkZCBhcmd1bWVudCByZWdpc3RlcnMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBzbyB0aGF0IHRoZXkgYXJlIGtub3duIGxpdmUKKyAgLy8gaW50byB0aGUgY2FsbC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3NUb1Bhc3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBPcHMucHVzaF9iYWNrKERBRy5nZXRSZWdpc3RlcihSZWdzVG9QYXNzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3NUb1Bhc3NbaV0uc2Vjb25kLmdldFZhbHVlVHlwZSgpKSk7CisKKyAgaWYgKEluRmxhZy5nZXROb2RlKCkpCisgICAgT3BzLnB1c2hfYmFjayhJbkZsYWcpOworCisgIFNEVlRMaXN0IE5vZGVUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIGlmIChpc1RhaWxDYWxsKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlRDX1JFVFVSTiwgZGwsIE5vZGVUeXMsICZPcHNbMF0sIE9wcy5zaXplKCkpOworCisgIC8vIFJldHVybnMgYSBjaGFpbiBhbmQgYSBmbGFnIGZvciByZXR2YWwgY29weSB0byB1c2UuCisgIENoYWluID0gREFHLmdldE5vZGUoQ2FsbE9wYywgZGwsIE5vZGVUeXMsICZPcHNbMF0sIE9wcy5zaXplKCkpOworICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKworICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX0VORChDaGFpbiwgREFHLmdldEludFB0ckNvbnN0YW50KE51bUJ5dGVzLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDAsIHRydWUpLCBJbkZsYWcpOworICBpZiAoIUlucy5lbXB0eSgpKQorICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIEhhbmRsZSByZXN1bHQgdmFsdWVzLCBjb3B5aW5nIHRoZW0gb3V0IG9mIHBoeXNyZWdzIGludG8gdnJlZ3MgdGhhdCB3ZQorICAvLyByZXR1cm4uCisgIHJldHVybiBMb3dlckNhbGxSZXN1bHQoQ2hhaW4sIEluRmxhZywgQ2FsbENvbnYsIGlzVmFyQXJnLCBJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIERBRywgSW5WYWxzKTsKK30KKworLy8vIE1hdGNoaW5nU3RhY2tPZmZzZXQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RhY2sgY2FsbCBhcmd1bWVudCBpcworLy8vIGFscmVhZHkgYXZhaWxhYmxlIGluIHRoZSBzYW1lIHBvc2l0aW9uIChyZWxhdGl2ZWx5KSBvZiB0aGUgY2FsbGVyJ3MKKy8vLyBpbmNvbWluZyBhcmd1bWVudCBzdGFjay4KK3N0YXRpYworYm9vbCBNYXRjaGluZ1N0YWNrT2Zmc2V0KFNEVmFsdWUgQXJnLCB1bnNpZ25lZCBPZmZzZXQsIElTRDo6QXJnRmxhZ3NUeSBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnJhbWVJbmZvICpNRkksIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1JbnN0ckluZm8gKlRJSSkgeworICB1bnNpZ25lZCBCeXRlcyA9IEFyZy5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCkgLyA4OworICBpbnQgRkkgPSBJTlRfTUFYOworICBpZiAoQXJnLmdldE9wY29kZSgpID09IElTRDo6Q29weUZyb21SZWcpIHsKKyAgICB1bnNpZ25lZCBWUiA9IGNhc3Q8UmVnaXN0ZXJTRE5vZGU+KEFyZy5nZXRPcGVyYW5kKDEpKS0+Z2V0UmVnKCk7CisgICAgaWYgKCFWUiB8fCBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihWUikpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgTWFjaGluZUluc3RyICpEZWYgPSBNUkktPmdldFZSZWdEZWYoVlIpOworICAgIGlmICghRGVmKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghRmxhZ3MuaXNCeVZhbCgpKSB7CisgICAgICBpZiAoIVRJSS0+aXNMb2FkRnJvbVN0YWNrU2xvdChEZWYsIEZJKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgaWYgKExvYWRTRE5vZGUgKkxkID0gZHluX2Nhc3Q8TG9hZFNETm9kZT4oQXJnKSkgeworICAgIGlmIChGbGFncy5pc0J5VmFsKCkpCisgICAgICAvLyBCeVZhbCBhcmd1bWVudCBpcyBwYXNzZWQgaW4gYXMgYSBwb2ludGVyIGJ1dCBpdCdzIG5vdyBiZWluZworICAgICAgLy8gZGVyZWZlcmVuY2VkLiBlLmcuCisgICAgICAvLyBkZWZpbmUgQGZvbyglc3RydWN0LlgqICVBKSB7CisgICAgICAvLyAgIHRhaWwgY2FsbCBAYmFyKCVzdHJ1Y3QuWCogYnl2YWwgJUEpCisgICAgICAvLyB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgU0RWYWx1ZSBQdHIgPSBMZC0+Z2V0QmFzZVB0cigpOworICAgIEZyYW1lSW5kZXhTRE5vZGUgKkZJTm9kZSA9IGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KFB0cik7CisgICAgaWYgKCFGSU5vZGUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgRkkgPSBGSU5vZGUtPmdldEluZGV4KCk7CisgIH0gZWxzZQorICAgIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoRkkgIT0gSU5UX01BWCk7CisgIGlmICghTUZJLT5pc0ZpeGVkT2JqZWN0SW5kZXgoRkkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIE9mZnNldCA9PSBNRkktPmdldE9iamVjdE9mZnNldChGSSkgJiYgQnl0ZXMgPT0gTUZJLT5nZXRPYmplY3RTaXplKEZJKTsKK30KKworLy8vIElzRWxpZ2libGVGb3JUYWlsQ2FsbE9wdGltaXphdGlvbiAtIENoZWNrIHdoZXRoZXIgdGhlIGNhbGwgaXMgZWxpZ2libGUKKy8vLyBmb3IgdGFpbCBjYWxsIG9wdGltaXphdGlvbi4gVGFyZ2V0cyB3aGljaCB3YW50IHRvIGRvIHRhaWwgY2FsbAorLy8vIG9wdGltaXphdGlvbiBzaG91bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCitib29sCitBUk1UYXJnZXRMb3dlcmluZzo6SXNFbGlnaWJsZUZvclRhaWxDYWxsT3B0aW1pemF0aW9uKFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbGVlQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNDYWxsZWVTdHJ1Y3RSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNDYWxsZXJTdHJ1Y3RSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyYgREFHKSBjb25zdCB7CisgIGNvbnN0IEZ1bmN0aW9uICpDYWxsZXJGID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZ1bmN0aW9uKCk7CisgIENhbGxpbmdDb252OjpJRCBDYWxsZXJDQyA9IENhbGxlckYtPmdldENhbGxpbmdDb252KCk7CisgIGJvb2wgQ0NNYXRjaCA9IENhbGxlckNDID09IENhbGxlZUNDOworCisgIC8vIExvb2sgZm9yIG9idmlvdXMgc2FmZSBjYXNlcyB0byBwZXJmb3JtIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24gdGhhdCBkbyBub3QKKyAgLy8gcmVxdWlyZSBBQkkgY2hhbmdlcy4gVGhpcyBpcyB3aGF0IGdjYyBjYWxscyBzaWJjYWxsLgorCisgIC8vIERvIG5vdCBzaWJjYWxsIG9wdGltaXplIHZhcmFyZyBjYWxscyB1bmxlc3MgdGhlIGNhbGwgc2l0ZSBpcyBub3QgcGFzc2luZworICAvLyBhbnkgYXJndW1lbnRzLgorICBpZiAoaXNWYXJBcmcgJiYgIU91dHMuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQWxzbyBhdm9pZCBzaWJjYWxsIG9wdGltaXphdGlvbiBpZiBlaXRoZXIgY2FsbGVyIG9yIGNhbGxlZSB1c2VzIHN0cnVjdAorICAvLyByZXR1cm4gc2VtYW50aWNzLgorICBpZiAoaXNDYWxsZWVTdHJ1Y3RSZXQgfHwgaXNDYWxsZXJTdHJ1Y3RSZXQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEZJWE1FOiBDb21wbGV0ZWx5IGRpc2FibGUgc2liY2FsbCBmb3IgVGh1bWIxIHNpbmNlIFRodW1iMVJlZ2lzdGVySW5mbzo6CisgIC8vIGVtaXRFcGlsb2d1ZSBpcyBub3QgcmVhZHkgZm9yIHRoZW0uCisgIC8vIERvaW5nIHRoaXMgaXMgdHJpY2t5LCBzaW5jZSB0aGUgTERNL1BPUCBpbnN0cnVjdGlvbiBvbiBUaHVtYiBkb2Vzbid0IHRha2UKKyAgLy8gTFIuICBUaGlzIG1lYW5zIGlmIHdlIG5lZWQgdG8gcmVsb2FkIExSLCBpdCB0YWtlcyBhbiBleHRyYSBpbnN0cnVjdGlvbnMsCisgIC8vIHdoaWNoIG91dHdlaWdocyB0aGUgdmFsdWUgb2YgdGhlIHRhaWwgY2FsbDsgYnV0IGhlcmUgd2UgZG9uJ3Qga25vdyB5ZXQKKyAgLy8gd2hldGhlciBMUiBpcyBnb2luZyB0byBiZSB1c2VkLiAgUHJvYmFibHkgdGhlIHJpZ2h0IGFwcHJvYWNoIGlzIHRvCisgIC8vIGdlbmVyYXRlIHRoZSB0YWlsIGNhbGwgaGVyZSBhbmQgdHVybiBpdCBiYWNrIGludG8gQ0FMTC9SRVQgaW4gCisgIC8vIGVtaXRFcGlsb2d1ZSBpZiBMUiBpcyB1c2VkLgorICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRm9yIHRoZSBtb21lbnQsIHdlIGNhbiBvbmx5IGRvIHRoaXMgdG8gZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcworICAvLyBjb21waWxhdGlvbiwgb3IgdG8gaW5kaXJlY3QgY2FsbHMuICBBIFRodW1iIEIgdG8gYW4gQVJNIGZ1bmN0aW9uLAorICAvLyBvciB2aWNlIHZlcnNhLCBpcyBub3QgZWFzaWx5IGZpeGVkIHVwIGluIHRoZSBsaW5rZXIgdW5saWtlIEJMLgorICAvLyAoV2UgY291bGQgZG8gdGhpcyBieSBsb2FkaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsZWUgaW50byBhIHJlZ2lzdGVyOworICAvLyB0aGF0IGlzIGFuIGV4dHJhIGluc3RydWN0aW9uIG92ZXIgdGhlIGRpcmVjdCBjYWxsIGFuZCBidXJucyBhIHJlZ2lzdGVyCisgIC8vIGFzIHdlbGwsIHNvIGlzIG5vdCBsaWtlbHkgdG8gYmUgYSB3aW4uKQorCisgIC8vIEl0IG1pZ2h0IGJlIHNhZmUgdG8gcmVtb3ZlIHRoaXMgcmVzdHJpY3Rpb24gb24gbm9uLURhcndpbi4KKworICAvLyBUaHVtYjEgUElDIGNhbGxzIHRvIGV4dGVybmFsIHN5bWJvbHMgdXNlIEJYLCBzbyB0aGV5IGNhbiBiZSB0YWlsIGNhbGxzLAorICAvLyBidXQgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCByZWdpc3RlcnM7IHRoZSBvbmx5IHZhbGlkCisgIC8vIHJlZ2lzdGVycyBhcmUgdGhlIDQgdXNlZCBmb3IgcGFyYW1ldGVycy4gIFdlIGRvbid0IGN1cnJlbnRseSBkbyB0aGlzCisgIC8vIGNhc2UuCisgIGlmIChpc2E8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKEdsb2JhbEFkZHJlc3NTRE5vZGUgKkcgPSBkeW5fY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihDYWxsZWUpKSB7CisgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gRy0+Z2V0R2xvYmFsKCk7CisgICAgaWYgKEdWLT5pc0RlY2xhcmF0aW9uKCkgfHwgR1YtPmlzV2Vha0ZvckxpbmtlcigpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZG8gbm90IG1hdGNoLCB0aGVuIHdlJ2QgYmV0dGVyIG1ha2Ugc3VyZSB0aGUKKyAgLy8gcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdoYXQgdGhlIGNhbGxlciBleHBlY3RzLgorICBpZiAoIUNDTWF0Y2gpIHsKKyAgICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczE7CisgICAgQ0NTdGF0ZSBDQ0luZm8xKENhbGxlZUNDLCBmYWxzZSwgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICAgICBSVkxvY3MxLCAqREFHLmdldENvbnRleHQoKSk7CisgICAgQ0NJbmZvMS5BbmFseXplQ2FsbFJlc3VsdChJbnMsIENDQXNzaWduRm5Gb3JOb2RlKENhbGxlZUNDLCB0cnVlLCBpc1ZhckFyZykpOworCisgICAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBSVkxvY3MyOworICAgIENDU3RhdGUgQ0NJbmZvMihDYWxsZXJDQywgZmFsc2UsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgUlZMb2NzMiwgKkRBRy5nZXRDb250ZXh0KCkpOworICAgIENDSW5mbzIuQW5hbHl6ZUNhbGxSZXN1bHQoSW5zLCBDQ0Fzc2lnbkZuRm9yTm9kZShDYWxsZXJDQywgdHJ1ZSwgaXNWYXJBcmcpKTsKKworICAgIGlmIChSVkxvY3MxLnNpemUoKSAhPSBSVkxvY3MyLnNpemUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUlZMb2NzMS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoUlZMb2NzMVtpXS5pc1JlZ0xvYygpICE9IFJWTG9jczJbaV0uaXNSZWdMb2MoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKFJWTG9jczFbaV0uZ2V0TG9jSW5mbygpICE9IFJWTG9jczJbaV0uZ2V0TG9jSW5mbygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoUlZMb2NzMVtpXS5pc1JlZ0xvYygpKSB7CisgICAgICAgIGlmIChSVkxvY3MxW2ldLmdldExvY1JlZygpICE9IFJWTG9jczJbaV0uZ2V0TG9jUmVnKCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFJWTG9jczFbaV0uZ2V0TG9jTWVtT2Zmc2V0KCkgIT0gUlZMb2NzMltpXS5nZXRMb2NNZW1PZmZzZXQoKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGNhbGxlZSB0YWtlcyBubyBhcmd1bWVudHMgdGhlbiBnbyBvbiB0byBjaGVjayB0aGUgcmVzdWx0cyBvZiB0aGUKKyAgLy8gY2FsbC4KKyAgaWYgKCFPdXRzLmVtcHR5KCkpIHsKKyAgICAvLyBDaGVjayBpZiBzdGFjayBhZGp1c3RtZW50IGlzIG5lZWRlZC4gRm9yIG5vdywgZG8gbm90IGRvIHRoaXMgaWYgYW55CisgICAgLy8gYXJndW1lbnQgaXMgcGFzc2VkIG9uIHRoZSBzdGFjay4KKyAgICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IEFyZ0xvY3M7CisgICAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbGVlQ0MsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgICAgQXJnTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworICAgIENDSW5mby5BbmFseXplQ2FsbE9wZXJhbmRzKE91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbkZvck5vZGUoQ2FsbGVlQ0MsIGZhbHNlLCBpc1ZhckFyZykpOworICAgIGlmIChDQ0luZm8uZ2V0TmV4dFN0YWNrT2Zmc2V0KCkpIHsKKyAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisKKyAgICAgIC8vIENoZWNrIGlmIHRoZSBhcmd1bWVudHMgYXJlIGFscmVhZHkgbGFpZCBvdXQgaW4gdGhlIHJpZ2h0IHdheSBhcworICAgICAgLy8gdGhlIGNhbGxlcidzIGZpeGVkIHN0YWNrIG9iamVjdHMuCisgICAgICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSA9ICZNRi5nZXRSZWdJbmZvKCk7CisgICAgICBjb25zdCBBUk1JbnN0ckluZm8gKlRJSSA9CisgICAgICAgICgoQVJNVGFyZ2V0TWFjaGluZSYpZ2V0VGFyZ2V0TWFjaGluZSgpKS5nZXRJbnN0ckluZm8oKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIHJlYWxBcmdJZHggPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7CisgICAgICAgICAgIGkgIT0gZTsKKyAgICAgICAgICAgKytpLCArK3JlYWxBcmdJZHgpIHsKKyAgICAgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tpXTsKKyAgICAgICAgRVZUIFJlZ1ZUID0gVkEuZ2V0TG9jVlQoKTsKKyAgICAgICAgU0RWYWx1ZSBBcmcgPSBPdXRWYWxzW3JlYWxBcmdJZHhdOworICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MgPSBPdXRzW3JlYWxBcmdJZHhdLkZsYWdzOworICAgICAgICBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpJbmRpcmVjdCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChWQS5uZWVkc0N1c3RvbSgpKSB7CisgICAgICAgICAgLy8gZjY0IGFuZCB2ZWN0b3IgdHlwZXMgYXJlIHNwbGl0IGludG8gbXVsdGlwbGUgcmVnaXN0ZXJzIG9yCisgICAgICAgICAgLy8gcmVnaXN0ZXIvc3RhY2stc2xvdCBjb21iaW5hdGlvbnMuICBUaGUgdHlwZXMgd2lsbCBub3QgbWF0Y2gKKyAgICAgICAgICAvLyB0aGUgcmVnaXN0ZXJzOyBnaXZlIHVwIG9uIG1lbW9yeSBmNjQgcmVmcyB1bnRpbCB3ZSBmaWd1cmUKKyAgICAgICAgICAvLyBvdXQgd2hhdCB0byBkbyBhYm91dCB0aGlzLgorICAgICAgICAgIGlmICghVkEuaXNSZWdMb2MoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBpZiAoIUFyZ0xvY3NbKytpXS5pc1JlZ0xvYygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICAgICAgICBpZiAoUmVnVlQgPT0gTVZUOjp2MmY2NCkgeworICAgICAgICAgICAgaWYgKCFBcmdMb2NzWysraV0uaXNSZWdMb2MoKSkKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKCFBcmdMb2NzWysraV0uaXNSZWdMb2MoKSkKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghVkEuaXNSZWdMb2MoKSkgeworICAgICAgICAgIGlmICghTWF0Y2hpbmdTdGFja09mZnNldChBcmcsIFZBLmdldExvY01lbU9mZnNldCgpLCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZJLCBNUkksIFRJSSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworU0RWYWx1ZQorQVJNVGFyZ2V0TG93ZXJpbmc6Okxvd2VyUmV0dXJuKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworCisgIC8vIENDVmFsQXNzaWduIC0gcmVwcmVzZW50IHRoZSBhc3NpZ25tZW50IG9mIHRoZSByZXR1cm4gdmFsdWUgdG8gYSBsb2NhdGlvbi4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBSVkxvY3M7CisKKyAgLy8gQ0NTdGF0ZSAtIEluZm8gYWJvdXQgdGhlIHJlZ2lzdGVycyBhbmQgc3RhY2sgc2xvdHMuCisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLCBSVkxvY3MsCisgICAgICAgICAgICAgICAgICpEQUcuZ2V0Q29udGV4dCgpKTsKKworICAvLyBBbmFseXplIG91dGdvaW5nIHJldHVybiB2YWx1ZXMuCisgIENDSW5mby5BbmFseXplUmV0dXJuKE91dHMsIENDQXNzaWduRm5Gb3JOb2RlKENhbGxDb252LCAvKiBSZXR1cm4gKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYXJBcmcpKTsKKworICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXR1cm4gbG93ZXJlZCBmb3IgdGhpcyBmdW5jdGlvbiwgYWRkCisgIC8vIHRoZSByZWdzIHRvIHRoZSBsaXZlb3V0IHNldCBmb3IgdGhlIGZ1bmN0aW9uLgorICBpZiAoREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5saXZlb3V0X2VtcHR5KCkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkKKyAgICAgIGlmIChSVkxvY3NbaV0uaXNSZWdMb2MoKSkKKyAgICAgICAgREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5hZGRMaXZlT3V0KFJWTG9jc1tpXS5nZXRMb2NSZWcoKSk7CisgIH0KKworICBTRFZhbHVlIEZsYWc7CisKKyAgLy8gQ29weSB0aGUgcmVzdWx0IHZhbHVlcyBpbnRvIHRoZSBvdXRwdXQgcmVnaXN0ZXJzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCByZWFsUlZMb2NJZHggPSAwOworICAgICAgIGkgIT0gUlZMb2NzLnNpemUoKTsKKyAgICAgICArK2ksICsrcmVhbFJWTG9jSWR4KSB7CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gUlZMb2NzW2ldOworICAgIGFzc2VydChWQS5pc1JlZ0xvYygpICYmICJDYW4gb25seSByZXR1cm4gaW4gcmVnaXN0ZXJzISIpOworCisgICAgU0RWYWx1ZSBBcmcgPSBPdXRWYWxzW3JlYWxSVkxvY0lkeF07CisKKyAgICBzd2l0Y2ggKFZBLmdldExvY0luZm8oKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbG9jIGluZm8hIik7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6RnVsbDogYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6QkN2dDoKKyAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKFZBLm5lZWRzQ3VzdG9tKCkpIHsKKyAgICAgIGlmIChWQS5nZXRMb2NWVCgpID09IE1WVDo6djJmNjQpIHsKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgZmlyc3QgaGFsZiBhbmQgcmV0dXJuIGl0IGluIHR3byByZWdpc3RlcnMuCisgICAgICAgIFNEVmFsdWUgSGFsZiA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgTVZUOjpmNjQsIEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSk7CisgICAgICAgIFNEVmFsdWUgSGFsZkdQUnMgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZNT1ZSUkQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZUTGlzdChNVlQ6OmkzMiwgTVZUOjppMzIpLCBIYWxmKTsKKworICAgICAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwgSGFsZkdQUnMsIEZsYWcpOworICAgICAgICBGbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgICAgICAgIFZBID0gUlZMb2NzWysraV07IC8vIHNraXAgYWhlYWQgdG8gbmV4dCBsb2MKKyAgICAgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgVkEuZ2V0TG9jUmVnKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYWxmR1BScy5nZXRWYWx1ZSgxKSwgRmxhZyk7CisgICAgICAgIEZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgICAgICAgVkEgPSBSVkxvY3NbKytpXTsgLy8gc2tpcCBhaGVhZCB0byBuZXh0IGxvYworCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIDJuZCBoYWxmIGFuZCBmYWxsIHRocm91Z2ggdG8gaGFuZGxlIGl0IGFzIGFuIGY2NCB2YWx1ZS4KKyAgICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBNVlQ6OmY2NCwgQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgTVZUOjppMzIpKTsKKyAgICAgIH0KKyAgICAgIC8vIExlZ2FsaXplIHJldCBmNjQgLT4gcmV0IDIgeCBpMzIuICBXZSBhbHdheXMgaGF2ZSBmbXJyZCBpZiBmNjQgaXMKKyAgICAgIC8vIGF2YWlsYWJsZS4KKyAgICAgIFNEVmFsdWUgZm1ycmQgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZNT1ZSUkQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoTVZUOjppMzIsIE1WVDo6aTMyKSwgJkFyZywgMSk7CisgICAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwgZm1ycmQsIEZsYWcpOworICAgICAgRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICAgICAgVkEgPSBSVkxvY3NbKytpXTsgLy8gc2tpcCBhaGVhZCB0byBuZXh0IGxvYworICAgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgVkEuZ2V0TG9jUmVnKCksIGZtcnJkLmdldFZhbHVlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWcpOworICAgIH0gZWxzZQorICAgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgVkEuZ2V0TG9jUmVnKCksIEFyZywgRmxhZyk7CisKKyAgICAvLyBHdWFyYW50ZWUgdGhhdCBhbGwgZW1pdHRlZCBjb3BpZXMgYXJlCisgICAgLy8gc3R1Y2sgdG9nZXRoZXIsIGF2b2lkaW5nIHNvbWV0aGluZyBiYWQuCisgICAgRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisKKyAgU0RWYWx1ZSByZXN1bHQ7CisgIGlmIChGbGFnLmdldE5vZGUoKSkKKyAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlJFVF9GTEFHLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4sIEZsYWcpOworICBlbHNlIC8vIFJldHVybiBWb2lkCisgICAgcmVzdWx0ID0gREFHLmdldE5vZGUoQVJNSVNEOjpSRVRfRkxBRywgZGwsIE1WVDo6T3RoZXIsIENoYWluKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBDb25zdGFudFBvb2wsIEp1bXBUYWJsZSwgR2xvYmFsQWRkcmVzcywgYW5kIEV4dGVybmFsU3ltYm9sIGFyZSBsb3dlcmVkIGFzCisvLyB0aGVpciB0YXJnZXQgY291bnRlcnBhcnQgd3JhcHBlZCBpbiB0aGUgQVJNSVNEOjpXcmFwcGVyIG5vZGUuIFN1cHBvc2UgTiBpcworLy8gb25lIG9mIHRoZSBhYm92ZSBtZW50aW9uZWQgbm9kZXMuIEl0IGhhcyB0byBiZSB3cmFwcGVkIGJlY2F1c2Ugb3RoZXJ3aXNlCisvLyBTZWxlY3QoTikgcmV0dXJucyBOLiBTbyB0aGUgcmF3IFRhcmdldEdsb2JhbEFkZHJlc3Mgbm9kZXMsIGV0Yy4gY2FuIG9ubHkKKy8vIGJlIHVzZWQgdG8gZm9ybSBhZGRyZXNzaW5nIG1vZGUuIFRoZXNlIHdyYXBwZWQgbm9kZXMgd2lsbCBiZSBzZWxlY3RlZAorLy8gaW50byBNT1ZpLgorc3RhdGljIFNEVmFsdWUgTG93ZXJDb25zdGFudFBvb2woU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgRVZUIFB0clZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIC8vIEZJWE1FIHRoZXJlIGlzIG5vIGFjdHVhbCBkZWJ1ZyBpbmZvIGhlcmUKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBDb25zdGFudFBvb2xTRE5vZGUgKkNQID0gY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KE9wKTsKKyAgU0RWYWx1ZSBSZXM7CisgIGlmIChDUC0+aXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSkKKyAgICBSZXMgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKENQLT5nZXRNYWNoaW5lQ1BWYWwoKSwgUHRyVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUC0+Z2V0QWxpZ25tZW50KCkpOworICBlbHNlCisgICAgUmVzID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDUC0+Z2V0Q29uc3RWYWwoKSwgUHRyVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUC0+Z2V0QWxpZ25tZW50KCkpOworICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpXcmFwcGVyLCBkbCwgTVZUOjppMzIsIFJlcyk7Cit9CisKK3Vuc2lnbmVkIEFSTVRhcmdldExvd2VyaW5nOjpnZXRKdW1wVGFibGVFbmNvZGluZygpIGNvbnN0IHsKKyAgcmV0dXJuIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19JbmxpbmU7Cit9CisKK1NEVmFsdWUgQVJNVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQmxvY2tBZGRyZXNzKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICB1bnNpZ25lZCBBUk1QQ0xhYmVsSW5kZXggPSAwOworICBEZWJ1Z0xvYyBETCA9IE9wLmdldERlYnVnTG9jKCk7CisgIEVWVCBQdHJWVCA9IGdldFBvaW50ZXJUeSgpOworICBjb25zdCBCbG9ja0FkZHJlc3MgKkJBID0gY2FzdDxCbG9ja0FkZHJlc3NTRE5vZGU+KE9wKS0+Z2V0QmxvY2tBZGRyZXNzKCk7CisgIFJlbG9jOjpNb2RlbCBSZWxvY00gPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCk7CisgIFNEVmFsdWUgQ1BBZGRyOworICBpZiAoUmVsb2NNID09IFJlbG9jOjpTdGF0aWMpIHsKKyAgICBDUEFkZHIgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKEJBLCBQdHJWVCwgNCk7CisgIH0gZWxzZSB7CisgICAgdW5zaWduZWQgUENBZGogPSBTdWJ0YXJnZXQtPmlzVGh1bWIoKSA/IDQgOiA4OworICAgIEFSTVBDTGFiZWxJbmRleCA9IEFGSS0+Y3JlYXRlQ29uc3RQb29sRW50cnlVSWQoKTsKKyAgICBBUk1Db25zdGFudFBvb2xWYWx1ZSAqQ1BWID0gbmV3IEFSTUNvbnN0YW50UG9vbFZhbHVlKEJBLCBBUk1QQ0xhYmVsSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DUDo6Q1BCbG9ja0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0Fkaik7CisgICAgQ1BBZGRyID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDUFYsIFB0clZULCA0KTsKKyAgfQorICBDUEFkZHIgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OldyYXBwZXIsIERMLCBQdHJWVCwgQ1BBZGRyKTsKKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0TG9hZChQdHJWVCwgREwsIERBRy5nZXRFbnRyeU5vZGUoKSwgQ1BBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICBpZiAoUmVsb2NNID09IFJlbG9jOjpTdGF0aWMpCisgICAgcmV0dXJuIFJlc3VsdDsKKyAgU0RWYWx1ZSBQSUNMYWJlbCA9IERBRy5nZXRDb25zdGFudChBUk1QQ0xhYmVsSW5kZXgsIE1WVDo6aTMyKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6UElDX0FERCwgREwsIFB0clZULCBSZXN1bHQsIFBJQ0xhYmVsKTsKK30KKworLy8gTG93ZXIgSVNEOjpHbG9iYWxUTFNBZGRyZXNzIHVzaW5nIHRoZSAiZ2VuZXJhbCBkeW5hbWljIiBtb2RlbAorU0RWYWx1ZQorQVJNVGFyZ2V0TG93ZXJpbmc6Okxvd2VyVG9UTFNHZW5lcmFsRHluYW1pY01vZGVsKEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gR0EtPmdldERlYnVnTG9jKCk7CisgIEVWVCBQdHJWVCA9IGdldFBvaW50ZXJUeSgpOworICB1bnNpZ25lZCBjaGFyIFBDQWRqID0gU3VidGFyZ2V0LT5pc1RodW1iKCkgPyA0IDogODsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgdW5zaWduZWQgQVJNUENMYWJlbEluZGV4ID0gQUZJLT5jcmVhdGVDb25zdFBvb2xFbnRyeVVJZCgpOworICBBUk1Db25zdGFudFBvb2xWYWx1ZSAqQ1BWID0KKyAgICBuZXcgQVJNQ29uc3RhbnRQb29sVmFsdWUoR0EtPmdldEdsb2JhbCgpLCBBUk1QQ0xhYmVsSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNQOjpDUFZhbHVlLCBQQ0FkaiwgInRsc2dkIiwgdHJ1ZSk7CisgIFNEVmFsdWUgQXJndW1lbnQgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKENQViwgUHRyVlQsIDQpOworICBBcmd1bWVudCA9IERBRy5nZXROb2RlKEFSTUlTRDo6V3JhcHBlciwgZGwsIE1WVDo6aTMyLCBBcmd1bWVudCk7CisgIEFyZ3VtZW50ID0gREFHLmdldExvYWQoUHRyVlQsIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksIEFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICBTRFZhbHVlIENoYWluID0gQXJndW1lbnQuZ2V0VmFsdWUoMSk7CisKKyAgU0RWYWx1ZSBQSUNMYWJlbCA9IERBRy5nZXRDb25zdGFudChBUk1QQ0xhYmVsSW5kZXgsIE1WVDo6aTMyKTsKKyAgQXJndW1lbnQgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlBJQ19BREQsIGRsLCBQdHJWVCwgQXJndW1lbnQsIFBJQ0xhYmVsKTsKKworICAvLyBjYWxsIF9fdGxzX2dldF9hZGRyLgorICBBcmdMaXN0VHkgQXJnczsKKyAgQXJnTGlzdEVudHJ5IEVudHJ5OworICBFbnRyeS5Ob2RlID0gQXJndW1lbnQ7CisgIEVudHJ5LlR5ID0gKGNvbnN0IFR5cGUgKikgVHlwZTo6Z2V0SW50MzJUeSgqREFHLmdldENvbnRleHQoKSk7CisgIEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKyAgLy8gRklYTUU6IGlzIHRoZXJlIHVzZWZ1bCBkZWJ1ZyBpbmZvIGF2YWlsYWJsZSBoZXJlPworICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gQ2FsbFJlc3VsdCA9CisgICAgTG93ZXJDYWxsVG8oQ2hhaW4sIChjb25zdCBUeXBlICopIFR5cGU6OmdldEludDMyVHkoKkRBRy5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgIDAsIENhbGxpbmdDb252OjpDLCBmYWxzZSwgLyppc1JldHVyblZhbHVlVXNlZD0qL3RydWUsCisgICAgICAgICAgICAgICAgREFHLmdldEV4dGVybmFsU3ltYm9sKCJfX3Rsc19nZXRfYWRkciIsIFB0clZUKSwgQXJncywgREFHLCBkbCk7CisgIHJldHVybiBDYWxsUmVzdWx0LmZpcnN0OworfQorCisvLyBMb3dlciBJU0Q6Okdsb2JhbFRMU0FkZHJlc3MgdXNpbmcgdGhlICJpbml0aWFsIGV4ZWMiIG9yCisvLyAibG9jYWwgZXhlYyIgbW9kZWwuCitTRFZhbHVlCitBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJUb1RMU0V4ZWNNb2RlbHMoR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gR0EtPmdldEdsb2JhbCgpOworICBEZWJ1Z0xvYyBkbCA9IEdBLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIE9mZnNldDsKKyAgU0RWYWx1ZSBDaGFpbiA9IERBRy5nZXRFbnRyeU5vZGUoKTsKKyAgRVZUIFB0clZUID0gZ2V0UG9pbnRlclR5KCk7CisgIC8vIEdldCB0aGUgVGhyZWFkIFBvaW50ZXIKKyAgU0RWYWx1ZSBUaHJlYWRQb2ludGVyID0gREFHLmdldE5vZGUoQVJNSVNEOjpUSFJFQURfUE9JTlRFUiwgZGwsIFB0clZUKTsKKworICBpZiAoR1YtPmlzRGVjbGFyYXRpb24oKSkgeworICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgICAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgICB1bnNpZ25lZCBBUk1QQ0xhYmVsSW5kZXggPSBBRkktPmNyZWF0ZUNvbnN0UG9vbEVudHJ5VUlkKCk7CisgICAgLy8gSW5pdGlhbCBleGVjIG1vZGVsLgorICAgIHVuc2lnbmVkIGNoYXIgUENBZGogPSBTdWJ0YXJnZXQtPmlzVGh1bWIoKSA/IDQgOiA4OworICAgIEFSTUNvbnN0YW50UG9vbFZhbHVlICpDUFYgPQorICAgICAgbmV3IEFSTUNvbnN0YW50UG9vbFZhbHVlKEdBLT5nZXRHbG9iYWwoKSwgQVJNUENMYWJlbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNQOjpDUFZhbHVlLCBQQ0FkaiwgImdvdHRwb2ZmIiwgdHJ1ZSk7CisgICAgT2Zmc2V0ID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDUFYsIFB0clZULCA0KTsKKyAgICBPZmZzZXQgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OldyYXBwZXIsIGRsLCBNVlQ6OmkzMiwgT2Zmc2V0KTsKKyAgICBPZmZzZXQgPSBEQUcuZ2V0TG9hZChQdHJWVCwgZGwsIENoYWluLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgQ2hhaW4gPSBPZmZzZXQuZ2V0VmFsdWUoMSk7CisKKyAgICBTRFZhbHVlIFBJQ0xhYmVsID0gREFHLmdldENvbnN0YW50KEFSTVBDTGFiZWxJbmRleCwgTVZUOjppMzIpOworICAgIE9mZnNldCA9IERBRy5nZXROb2RlKEFSTUlTRDo6UElDX0FERCwgZGwsIFB0clZULCBPZmZzZXQsIFBJQ0xhYmVsKTsKKworICAgIE9mZnNldCA9IERBRy5nZXRMb2FkKFB0clZULCBkbCwgQ2hhaW4sIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Q29uc3RhbnRQb29sKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBsb2NhbCBleGVjIG1vZGVsCisgICAgQVJNQ29uc3RhbnRQb29sVmFsdWUgKkNQViA9IG5ldyBBUk1Db25zdGFudFBvb2xWYWx1ZShHViwgInRwb2ZmIik7CisgICAgT2Zmc2V0ID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDUFYsIFB0clZULCA0KTsKKyAgICBPZmZzZXQgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OldyYXBwZXIsIGRsLCBNVlQ6OmkzMiwgT2Zmc2V0KTsKKyAgICBPZmZzZXQgPSBEQUcuZ2V0TG9hZChQdHJWVCwgZGwsIENoYWluLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgIH0KKworICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgdGhyZWFkIGxvY2FsIHZhcmlhYmxlIGlzIHRoZSBhZGQgb2YgdGhlIHRocmVhZAorICAvLyBwb2ludGVyIHdpdGggdGhlIG9mZnNldCBvZiB0aGUgdmFyaWFibGUuCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULCBUaHJlYWRQb2ludGVyLCBPZmZzZXQpOworfQorCitTRFZhbHVlCitBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJHbG9iYWxUTFNBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIFRPRE86IGltcGxlbWVudCB0aGUgImxvY2FsIGR5bmFtaWMiIG1vZGVsCisgIGFzc2VydChTdWJ0YXJnZXQtPmlzVGFyZ2V0RUxGKCkgJiYKKyAgICAgICAgICJUTFMgbm90IGltcGxlbWVudGVkIGZvciBub24tRUxGIHRhcmdldHMiKTsKKyAgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EgPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKTsKKyAgLy8gSWYgdGhlIHJlbG9jYXRpb24gbW9kZWwgaXMgUElDLCB1c2UgdGhlICJHZW5lcmFsIER5bmFtaWMiIFRMUyBNb2RlbCwKKyAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgIkxvY2FsIEV4ZWMiIFRMUyBNb2RlbAorICBpZiAoZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKQorICAgIHJldHVybiBMb3dlclRvVExTR2VuZXJhbER5bmFtaWNNb2RlbChHQSwgREFHKTsKKyAgZWxzZQorICAgIHJldHVybiBMb3dlclRvVExTRXhlY01vZGVscyhHQSwgREFHKTsKK30KKworU0RWYWx1ZSBBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJHbG9iYWxBZGRyZXNzRUxGKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRVZUIFB0clZUID0gZ2V0UG9pbnRlclR5KCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihPcCktPmdldEdsb2JhbCgpOworICBSZWxvYzo6TW9kZWwgUmVsb2NNID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFJlbG9jYXRpb25Nb2RlbCgpOworICBpZiAoUmVsb2NNID09IFJlbG9jOjpQSUNfKSB7CisgICAgYm9vbCBVc2VHT1RPRkYgPSBHVi0+aGFzTG9jYWxMaW5rYWdlKCkgfHwgR1YtPmhhc0hpZGRlblZpc2liaWxpdHkoKTsKKyAgICBBUk1Db25zdGFudFBvb2xWYWx1ZSAqQ1BWID0KKyAgICAgIG5ldyBBUk1Db25zdGFudFBvb2xWYWx1ZShHViwgVXNlR09UT0ZGID8gIkdPVE9GRiIgOiAiR09UIik7CisgICAgU0RWYWx1ZSBDUEFkZHIgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKENQViwgUHRyVlQsIDQpOworICAgIENQQWRkciA9IERBRy5nZXROb2RlKEFSTUlTRDo6V3JhcHBlciwgZGwsIE1WVDo6aTMyLCBDUEFkZHIpOworICAgIFNEVmFsdWUgUmVzdWx0ID0gREFHLmdldExvYWQoUHRyVlQsIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Q29uc3RhbnRQb29sKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgIFNEVmFsdWUgQ2hhaW4gPSBSZXN1bHQuZ2V0VmFsdWUoMSk7CisgICAgU0RWYWx1ZSBHT1QgPSBEQUcuZ2V0R0xPQkFMX09GRlNFVF9UQUJMRShQdHJWVCk7CisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJWVCwgUmVzdWx0LCBHT1QpOworICAgIGlmICghVXNlR09UT0ZGKQorICAgICAgUmVzdWx0ID0gREFHLmdldExvYWQoUHRyVlQsIGRsLCBDaGFpbiwgUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEdPVCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9IGVsc2UgeworICAgIC8vIElmIHdlIGhhdmUgVDIgb3BzLCB3ZSBjYW4gbWF0ZXJpYWxpemUgdGhlIGFkZHJlc3MgZGlyZWN0bHkgdmlhIG1vdnQvbW92dworICAgIC8vIHBhaXIuIFRoaXMgaXMgYWx3YXlzIGNoZWFwZXIuCisgICAgaWYgKFN1YnRhcmdldC0+dXNlTW92dCgpKSB7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpXcmFwcGVyLCBkbCwgUHRyVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoR1YsIGRsLCBQdHJWVCkpOworICAgIH0gZWxzZSB7CisgICAgICBTRFZhbHVlIENQQWRkciA9IERBRy5nZXRUYXJnZXRDb25zdGFudFBvb2woR1YsIFB0clZULCA0KTsKKyAgICAgIENQQWRkciA9IERBRy5nZXROb2RlKEFSTUlTRDo6V3JhcHBlciwgZGwsIE1WVDo6aTMyLCBDUEFkZHIpOworICAgICAgcmV0dXJuIERBRy5nZXRMb2FkKFB0clZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBDUEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgfQorICB9Cit9CisKK1NEVmFsdWUgQVJNVGFyZ2V0TG93ZXJpbmc6Okxvd2VyR2xvYmFsQWRkcmVzc0RhcndpbihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIEFSTUZ1bmN0aW9uSW5mbyAqQUZJID0gTUYuZ2V0SW5mbzxBUk1GdW5jdGlvbkluZm8+KCk7CisgIHVuc2lnbmVkIEFSTVBDTGFiZWxJbmRleCA9IDA7CisgIEVWVCBQdHJWVCA9IGdldFBvaW50ZXJUeSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGNhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oT3ApLT5nZXRHbG9iYWwoKTsKKyAgUmVsb2M6Ok1vZGVsIFJlbG9jTSA9IGdldFRhcmdldE1hY2hpbmUoKS5nZXRSZWxvY2F0aW9uTW9kZWwoKTsKKyAgU0RWYWx1ZSBDUEFkZHI7CisgIGlmIChSZWxvY00gPT0gUmVsb2M6OlN0YXRpYykKKyAgICBDUEFkZHIgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKEdWLCBQdHJWVCwgNCk7CisgIGVsc2UgeworICAgIEFSTVBDTGFiZWxJbmRleCA9IEFGSS0+Y3JlYXRlQ29uc3RQb29sRW50cnlVSWQoKTsKKyAgICB1bnNpZ25lZCBQQ0FkaiA9IChSZWxvY00gIT0gUmVsb2M6OlBJQ18pID8gMCA6IChTdWJ0YXJnZXQtPmlzVGh1bWIoKT80OjgpOworICAgIEFSTUNvbnN0YW50UG9vbFZhbHVlICpDUFYgPQorICAgICAgbmV3IEFSTUNvbnN0YW50UG9vbFZhbHVlKEdWLCBBUk1QQ0xhYmVsSW5kZXgsIEFSTUNQOjpDUFZhbHVlLCBQQ0Fkaik7CisgICAgQ1BBZGRyID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDUFYsIFB0clZULCA0KTsKKyAgfQorICBDUEFkZHIgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OldyYXBwZXIsIGRsLCBNVlQ6OmkzMiwgQ1BBZGRyKTsKKworICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXRMb2FkKFB0clZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBDUEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgIFNEVmFsdWUgQ2hhaW4gPSBSZXN1bHQuZ2V0VmFsdWUoMSk7CisKKyAgaWYgKFJlbG9jTSA9PSBSZWxvYzo6UElDXykgeworICAgIFNEVmFsdWUgUElDTGFiZWwgPSBEQUcuZ2V0Q29uc3RhbnQoQVJNUENMYWJlbEluZGV4LCBNVlQ6OmkzMik7CisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoQVJNSVNEOjpQSUNfQURELCBkbCwgUHRyVlQsIFJlc3VsdCwgUElDTGFiZWwpOworICB9CisKKyAgaWYgKFN1YnRhcmdldC0+R1ZJc0luZGlyZWN0U3ltYm9sKEdWLCBSZWxvY00pKQorICAgIFJlc3VsdCA9IERBRy5nZXRMb2FkKFB0clZULCBkbCwgQ2hhaW4sIFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0R09UKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKworICByZXR1cm4gUmVzdWx0OworfQorCitTRFZhbHVlIEFSTVRhcmdldExvd2VyaW5nOjpMb3dlckdMT0JBTF9PRkZTRVRfVEFCTEUoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBhc3NlcnQoU3VidGFyZ2V0LT5pc1RhcmdldEVMRigpICYmCisgICAgICAgICAiR0xPQkFMIE9GRlNFVCBUQUJMRSBub3QgaW1wbGVtZW50ZWQgZm9yIG5vbi1FTEYgdGFyZ2V0cyIpOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICB1bnNpZ25lZCBBUk1QQ0xhYmVsSW5kZXggPSBBRkktPmNyZWF0ZUNvbnN0UG9vbEVudHJ5VUlkKCk7CisgIEVWVCBQdHJWVCA9IGdldFBvaW50ZXJUeSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIHVuc2lnbmVkIFBDQWRqID0gU3VidGFyZ2V0LT5pc1RodW1iKCkgPyA0IDogODsKKyAgQVJNQ29uc3RhbnRQb29sVmFsdWUgKkNQViA9IG5ldyBBUk1Db25zdGFudFBvb2xWYWx1ZSgqREFHLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1QQ0xhYmVsSW5kZXgsIFBDQWRqKTsKKyAgU0RWYWx1ZSBDUEFkZHIgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKENQViwgUHRyVlQsIDQpOworICBDUEFkZHIgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OldyYXBwZXIsIGRsLCBNVlQ6OmkzMiwgQ1BBZGRyKTsKKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0TG9hZChQdHJWVCwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwgQ1BBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICBTRFZhbHVlIFBJQ0xhYmVsID0gREFHLmdldENvbnN0YW50KEFSTVBDTGFiZWxJbmRleCwgTVZUOjppMzIpOworICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpQSUNfQURELCBkbCwgUHRyVlQsIFJlc3VsdCwgUElDTGFiZWwpOworfQorCitTRFZhbHVlCitBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJFSF9TSkxKX1NFVEpNUChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgVmFsID0gREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6RUhfU0pMSl9TRVRKTVAsIGRsLCBNVlQ6OmkzMiwgT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMSksIFZhbCk7Cit9CisKK1NEVmFsdWUKK0FSTVRhcmdldExvd2VyaW5nOjpMb3dlckVIX1NKTEpfTE9OR0pNUChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkVIX1NKTEpfTE9OR0pNUCwgZGwsIE1WVDo6T3RoZXIsIE9wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpLCBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpKTsKK30KKworU0RWYWx1ZQorQVJNVGFyZ2V0TG93ZXJpbmc6Okxvd2VySU5UUklOU0lDX1dPX0NIQUlOKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVJNU3VidGFyZ2V0ICpTdWJ0YXJnZXQpIGNvbnN0IHsKKyAgdW5zaWduZWQgSW50Tm8gPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDApKS0+Z2V0WkV4dFZhbHVlKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgc3dpdGNoIChJbnRObykgeworICBkZWZhdWx0OiByZXR1cm4gU0RWYWx1ZSgpOyAgICAvLyBEb24ndCBjdXN0b20gbG93ZXIgbW9zdCBpbnRyaW5zaWNzLgorICBjYXNlIEludHJpbnNpYzo6YXJtX3RocmVhZF9wb2ludGVyOiB7CisgICAgRVZUIFB0clZUID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLmdldFBvaW50ZXJUeSgpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlRIUkVBRF9QT0lOVEVSLCBkbCwgUHRyVlQpOworICB9CisgIGNhc2UgSW50cmluc2ljOjplaF9zamxqX2xzZGE6IHsKKyAgICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICAgIEFSTUZ1bmN0aW9uSW5mbyAqQUZJID0gTUYuZ2V0SW5mbzxBUk1GdW5jdGlvbkluZm8+KCk7CisgICAgdW5zaWduZWQgQVJNUENMYWJlbEluZGV4ID0gQUZJLT5jcmVhdGVDb25zdFBvb2xFbnRyeVVJZCgpOworICAgIEVWVCBQdHJWVCA9IGdldFBvaW50ZXJUeSgpOworICAgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgICBSZWxvYzo6TW9kZWwgUmVsb2NNID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFJlbG9jYXRpb25Nb2RlbCgpOworICAgIFNEVmFsdWUgQ1BBZGRyOworICAgIHVuc2lnbmVkIFBDQWRqID0gKFJlbG9jTSAhPSBSZWxvYzo6UElDXykKKyAgICAgID8gMCA6IChTdWJ0YXJnZXQtPmlzVGh1bWIoKSA/IDQgOiA4KTsKKyAgICBBUk1Db25zdGFudFBvb2xWYWx1ZSAqQ1BWID0KKyAgICAgIG5ldyBBUk1Db25zdGFudFBvb2xWYWx1ZShNRi5nZXRGdW5jdGlvbigpLCBBUk1QQ0xhYmVsSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ1A6OkNQTFNEQSwgUENBZGopOworICAgIENQQWRkciA9IERBRy5nZXRUYXJnZXRDb25zdGFudFBvb2woQ1BWLCBQdHJWVCwgNCk7CisgICAgQ1BBZGRyID0gREFHLmdldE5vZGUoQVJNSVNEOjpXcmFwcGVyLCBkbCwgTVZUOjppMzIsIENQQWRkcik7CisgICAgU0RWYWx1ZSBSZXN1bHQgPQorICAgICAgREFHLmdldExvYWQoUHRyVlQsIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksIENQQWRkciwKKyAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICBpZiAoUmVsb2NNID09IFJlbG9jOjpQSUNfKSB7CisgICAgICBTRFZhbHVlIFBJQ0xhYmVsID0gREFHLmdldENvbnN0YW50KEFSTVBDTGFiZWxJbmRleCwgTVZUOjppMzIpOworICAgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoQVJNSVNEOjpQSUNfQURELCBkbCwgUHRyVlQsIFJlc3VsdCwgUElDTGFiZWwpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9CisgIH0KK30KKworc3RhdGljIFNEVmFsdWUgTG93ZXJNRU1CQVJSSUVSKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAqU3VidGFyZ2V0KSB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBPcDUgPSBPcC5nZXRPcGVyYW5kKDUpOworICB1bnNpZ25lZCBpc0RldmljZUJhcnJpZXIgPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcDUpLT5nZXRaRXh0VmFsdWUoKTsKKyAgLy8gdjYgYW5kIHY3IGNhbiBib3RoIGhhbmRsZSBiYXJyaWVycyBkaXJlY3RseSwgYnV0IG5lZWQgaGFuZGxlZCBhIGJpdAorICAvLyBkaWZmZXJlbnRseS4gVGh1bWIxIGFuZCBwcmUtdjYgQVJNIG1vZGUgdXNlIGEgbGliY2FsbCBpbnN0ZWFkIGFuZCBzaG91bGQKKyAgLy8gbmV2ZXIgZ2V0IGhlcmUuCisgIHVuc2lnbmVkIE9wYyA9IGlzRGV2aWNlQmFycmllciA/IEFSTUlTRDo6U1lOQ0JBUlJJRVIgOiBBUk1JU0Q6Ok1FTUJBUlJJRVI7CisgIGlmIChTdWJ0YXJnZXQtPmhhc1Y3T3BzKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKE9wYywgZGwsIE1WVDo6T3RoZXIsIE9wLmdldE9wZXJhbmQoMCkpOworICBlbHNlIGlmIChTdWJ0YXJnZXQtPmhhc1Y2T3BzKCkgJiYgIVN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKE9wYywgZGwsIE1WVDo6T3RoZXIsIE9wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBNVlQ6OmkzMikpOworICBhc3NlcnQoMCAmJiAiVW5leHBlY3RlZCBJU0Q6Ok1FTUJBUlJJRVIgZW5jb3VudGVyZWQuIFNob3VsZCBiZSBsaWJjYWxsISIpOworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitzdGF0aWMgU0RWYWx1ZSBMb3dlclZBU1RBUlQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgQVJNRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworCisgIC8vIHZhc3RhcnQganVzdCBzdG9yZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFZhckFyZ3NGcmFtZUluZGV4IHNsb3QgaW50byB0aGUKKyAgLy8gbWVtb3J5IGxvY2F0aW9uIGFyZ3VtZW50LgorICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIEVWVCBQdHJWVCA9IERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKS5nZXRQb2ludGVyVHkoKTsKKyAgU0RWYWx1ZSBGUiA9IERBRy5nZXRGcmFtZUluZGV4KEZ1bmNJbmZvLT5nZXRWYXJBcmdzRnJhbWVJbmRleCgpLCBQdHJWVCk7CisgIGNvbnN0IFZhbHVlICpTViA9IGNhc3Q8U3JjVmFsdWVTRE5vZGU+KE9wLmdldE9wZXJhbmQoMikpLT5nZXRWYWx1ZSgpOworICByZXR1cm4gREFHLmdldFN0b3JlKE9wLmdldE9wZXJhbmQoMCksIGRsLCBGUiwgT3AuZ2V0T3BlcmFuZCgxKSwgU1YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKK30KKworU0RWYWx1ZQorQVJNVGFyZ2V0TG93ZXJpbmc6OkdldEY2NEZvcm1hbEFyZ3VtZW50KENDVmFsQXNzaWduICZWQSwgQ0NWYWxBc3NpZ24gJk5leHRWQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZSb290LCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCkgY29uc3QgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworCisgIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDOworICBpZiAoQUZJLT5pc1RodW1iMU9ubHlGdW5jdGlvbigpKQorICAgIFJDID0gQVJNOjp0R1BSUmVnaXN0ZXJDbGFzczsKKyAgZWxzZQorICAgIFJDID0gQVJNOjpHUFJSZWdpc3RlckNsYXNzOworCisgIC8vIFRyYW5zZm9ybSB0aGUgYXJndW1lbnRzIHN0b3JlZCBpbiBwaHlzaWNhbCByZWdpc3RlcnMgaW50byB2aXJ0dWFsIG9uZXMuCisgIHVuc2lnbmVkIFJlZyA9IE1GLmFkZExpdmVJbihWQS5nZXRMb2NSZWcoKSwgUkMpOyAKKyAgU0RWYWx1ZSBBcmdWYWx1ZSA9IERBRy5nZXRDb3B5RnJvbVJlZyhSb290LCBkbCwgUmVnLCBNVlQ6OmkzMik7CisKKyAgU0RWYWx1ZSBBcmdWYWx1ZTI7CisgIGlmIChOZXh0VkEuaXNNZW1Mb2MoKSkgeworICAgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICAgIGludCBGSSA9IE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoNCwgTmV4dFZBLmdldExvY01lbU9mZnNldCgpLCB0cnVlKTsKKworICAgIC8vIENyZWF0ZSBsb2FkIG5vZGUgdG8gcmV0cmlldmUgYXJndW1lbnRzIGZyb20gdGhlIHN0YWNrLgorICAgIFNEVmFsdWUgRklOID0gREFHLmdldEZyYW1lSW5kZXgoRkksIGdldFBvaW50ZXJUeSgpKTsKKyAgICBBcmdWYWx1ZTIgPSBEQUcuZ2V0TG9hZChNVlQ6OmkzMiwgZGwsIFJvb3QsIEZJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhGSSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgfSBlbHNlIHsKKyAgICBSZWcgPSBNRi5hZGRMaXZlSW4oTmV4dFZBLmdldExvY1JlZygpLCBSQyk7CisgICAgQXJnVmFsdWUyID0gREFHLmdldENvcHlGcm9tUmVnKFJvb3QsIGRsLCBSZWcsIE1WVDo6aTMyKTsKKyAgfQorCisgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZNT1ZEUlIsIGRsLCBNVlQ6OmY2NCwgQXJnVmFsdWUsIEFyZ1ZhbHVlMik7Cit9CisKK1NEVmFsdWUKK0FSTVRhcmdldExvd2VyaW5nOjpMb3dlckZvcm1hbEFyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworCisgIEFSTUZ1bmN0aW9uSW5mbyAqQUZJID0gTUYuZ2V0SW5mbzxBUk1GdW5jdGlvbkluZm8+KCk7CisKKyAgLy8gQXNzaWduIGxvY2F0aW9ucyB0byBhbGwgb2YgdGhlIGluY29taW5nIGFyZ3VtZW50cy4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwgQXJnTG9jcywKKyAgICAgICAgICAgICAgICAgKkRBRy5nZXRDb250ZXh0KCkpOworICBDQ0luZm8uQW5hbHl6ZUZvcm1hbEFyZ3VtZW50cyhJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm5Gb3JOb2RlKENhbGxDb252LCAvKiBSZXR1cm4qLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYXJBcmcpKTsKKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gQXJnVmFsdWVzOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBBcmdMb2NzW2ldOworCisgICAgLy8gQXJndW1lbnRzIHN0b3JlZCBpbiByZWdpc3RlcnMuCisgICAgaWYgKFZBLmlzUmVnTG9jKCkpIHsKKyAgICAgIEVWVCBSZWdWVCA9IFZBLmdldExvY1ZUKCk7CisKKyAgICAgIFNEVmFsdWUgQXJnVmFsdWU7CisgICAgICBpZiAoVkEubmVlZHNDdXN0b20oKSkgeworICAgICAgICAvLyBmNjQgYW5kIHZlY3RvciB0eXBlcyBhcmUgc3BsaXQgdXAgaW50byBtdWx0aXBsZSByZWdpc3RlcnMgb3IKKyAgICAgICAgLy8gY29tYmluYXRpb25zIG9mIHJlZ2lzdGVycyBhbmQgc3RhY2sgc2xvdHMuCisgICAgICAgIGlmIChWQS5nZXRMb2NWVCgpID09IE1WVDo6djJmNjQpIHsKKyAgICAgICAgICBTRFZhbHVlIEFyZ1ZhbHVlMSA9IEdldEY2NEZvcm1hbEFyZ3VtZW50KFZBLCBBcmdMb2NzWysraV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbiwgREFHLCBkbCk7CisgICAgICAgICAgVkEgPSBBcmdMb2NzWysraV07IC8vIHNraXAgYWhlYWQgdG8gbmV4dCBsb2MKKyAgICAgICAgICBTRFZhbHVlIEFyZ1ZhbHVlMjsKKyAgICAgICAgICBpZiAoVkEuaXNNZW1Mb2MoKSkgeworICAgICAgICAgICAgaW50IEZJID0gTUZJLT5DcmVhdGVGaXhlZE9iamVjdCg4LCBWQS5nZXRMb2NNZW1PZmZzZXQoKSwgdHJ1ZSk7CisgICAgICAgICAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZJLCBnZXRQb2ludGVyVHkoKSk7CisgICAgICAgICAgICBBcmdWYWx1ZTIgPSBEQUcuZ2V0TG9hZChNVlQ6OmY2NCwgZGwsIENoYWluLCBGSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhGSSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBcmdWYWx1ZTIgPSBHZXRGNjRGb3JtYWxBcmd1bWVudChWQSwgQXJnTG9jc1srK2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW4sIERBRywgZGwpOworICAgICAgICAgIH0KKyAgICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6VU5ERUYsIGRsLCBNVlQ6OnYyZjY0KTsKKyAgICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIGRsLCBNVlQ6OnYyZjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnVmFsdWUsIEFyZ1ZhbHVlMSwgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKyAgICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIGRsLCBNVlQ6OnYyZjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnVmFsdWUsIEFyZ1ZhbHVlMiwgREFHLmdldEludFB0ckNvbnN0YW50KDEpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgQXJnVmFsdWUgPSBHZXRGNjRGb3JtYWxBcmd1bWVudChWQSwgQXJnTG9jc1srK2ldLCBDaGFpbiwgREFHLCBkbCk7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDOworCisgICAgICAgIGlmIChSZWdWVCA9PSBNVlQ6OmYzMikKKyAgICAgICAgICBSQyA9IEFSTTo6U1BSUmVnaXN0ZXJDbGFzczsKKyAgICAgICAgZWxzZSBpZiAoUmVnVlQgPT0gTVZUOjpmNjQpCisgICAgICAgICAgUkMgPSBBUk06OkRQUlJlZ2lzdGVyQ2xhc3M7CisgICAgICAgIGVsc2UgaWYgKFJlZ1ZUID09IE1WVDo6djJmNjQpCisgICAgICAgICAgUkMgPSBBUk06OlFQUlJlZ2lzdGVyQ2xhc3M7CisgICAgICAgIGVsc2UgaWYgKFJlZ1ZUID09IE1WVDo6aTMyKQorICAgICAgICAgIFJDID0gKEFGSS0+aXNUaHVtYjFPbmx5RnVuY3Rpb24oKSA/CisgICAgICAgICAgICAgICAgQVJNOjp0R1BSUmVnaXN0ZXJDbGFzcyA6IEFSTTo6R1BSUmVnaXN0ZXJDbGFzcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJSZWdWVCBub3Qgc3VwcG9ydGVkIGJ5IEZPUk1BTF9BUkdVTUVOVFMgTG93ZXJpbmciKTsKKworICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGFyZ3VtZW50cyBpbiBwaHlzaWNhbCByZWdpc3RlcnMgaW50byB2aXJ0dWFsIG9uZXMuCisgICAgICAgIHVuc2lnbmVkIFJlZyA9IE1GLmFkZExpdmVJbihWQS5nZXRMb2NSZWcoKSwgUkMpOworICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFJlZywgUmVnVlQpOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGlzIGlzIGFuIDggb3IgMTYtYml0IHZhbHVlLCBpdCBpcyByZWFsbHkgcGFzc2VkIHByb21vdGVkCisgICAgICAvLyB0byAzMiBiaXRzLiAgSW5zZXJ0IGFuIGFzc2VydFtzel1leHQgdG8gY2FwdHVyZSB0aGlzLCB0aGVuCisgICAgICAvLyB0cnVuY2F0ZSB0byB0aGUgcmlnaHQgc2l6ZS4KKyAgICAgIHN3aXRjaCAoVkEuZ2V0TG9jSW5mbygpKSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGxvYyBpbmZvISIpOworICAgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6RnVsbDogYnJlYWs7CisgICAgICBjYXNlIENDVmFsQXNzaWduOjpCQ3Z0OgorICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWQS5nZXRWYWxWVCgpLCBBcmdWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6U0V4dDoKKyAgICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFNleHQsIGRsLCBSZWdWVCwgQXJnVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShWQS5nZXRWYWxWVCgpKSk7CisgICAgICAgIEFyZ1ZhbHVlID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFZBLmdldFZhbFZUKCksIEFyZ1ZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENDVmFsQXNzaWduOjpaRXh0OgorICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0WmV4dCwgZGwsIFJlZ1ZULCBBcmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKFZBLmdldFZhbFZUKCkpKTsKKyAgICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgVkEuZ2V0VmFsVlQoKSwgQXJnVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgSW5WYWxzLnB1c2hfYmFjayhBcmdWYWx1ZSk7CisKKyAgICB9IGVsc2UgeyAvLyBWQS5pc1JlZ0xvYygpCisKKyAgICAgIC8vIHNhbml0eSBjaGVjaworICAgICAgYXNzZXJ0KFZBLmlzTWVtTG9jKCkpOworICAgICAgYXNzZXJ0KFZBLmdldFZhbFZUKCkgIT0gTVZUOjppNjQgJiYgImk2NCBzaG91bGQgYWxyZWFkeSBiZSBsb3dlcmVkIik7CisKKyAgICAgIHVuc2lnbmVkIEFyZ1NpemUgPSBWQS5nZXRMb2NWVCgpLmdldFNpemVJbkJpdHMoKS84OworICAgICAgaW50IEZJID0gTUZJLT5DcmVhdGVGaXhlZE9iamVjdChBcmdTaXplLCBWQS5nZXRMb2NNZW1PZmZzZXQoKSwgdHJ1ZSk7CisKKyAgICAgIC8vIENyZWF0ZSBsb2FkIG5vZGVzIHRvIHJldHJpZXZlIGFyZ3VtZW50cyBmcm9tIHRoZSBzdGFjay4KKyAgICAgIFNEVmFsdWUgRklOID0gREFHLmdldEZyYW1lSW5kZXgoRkksIGdldFBvaW50ZXJUeSgpKTsKKyAgICAgIEluVmFscy5wdXNoX2JhY2soREFHLmdldExvYWQoVkEuZ2V0VmFsVlQoKSwgZGwsIENoYWluLCBGSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKEZJKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisgICAgfQorICB9CisKKyAgLy8gdmFyYXJncworICBpZiAoaXNWYXJBcmcpIHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR1BSQXJnUmVnc1tdID0geworICAgICAgQVJNOjpSMCwgQVJNOjpSMSwgQVJNOjpSMiwgQVJNOjpSMworICAgIH07CisKKyAgICB1bnNpZ25lZCBOdW1HUFJzID0gQ0NJbmZvLmdldEZpcnN0VW5hbGxvY2F0ZWQKKyAgICAgIChHUFJBcmdSZWdzLCBzaXplb2YoR1BSQXJnUmVncykgLyBzaXplb2YoR1BSQXJnUmVnc1swXSkpOworCisgICAgdW5zaWduZWQgQWxpZ24gPSBNRi5nZXRUYXJnZXQoKS5nZXRGcmFtZUluZm8oKS0+Z2V0U3RhY2tBbGlnbm1lbnQoKTsKKyAgICB1bnNpZ25lZCBWQVJlZ1NpemUgPSAoNCAtIE51bUdQUnMpICogNDsKKyAgICB1bnNpZ25lZCBWQVJlZ1NhdmVTaXplID0gKFZBUmVnU2l6ZSArIEFsaWduIC0gMSkgJiB+KEFsaWduIC0gMSk7CisgICAgdW5zaWduZWQgQXJnT2Zmc2V0ID0gQ0NJbmZvLmdldE5leHRTdGFja09mZnNldCgpOworICAgIGlmIChWQVJlZ1NhdmVTaXplKSB7CisgICAgICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIHZhcmFyZywgc3RvcmUgYW55IHJlbWFpbmluZyBpbnRlZ2VyIGFyZ3VtZW50IHJlZ3MKKyAgICAgIC8vIHRvIHRoZWlyIHNwb3RzIG9uIHRoZSBzdGFjayBzbyB0aGF0IHRoZXkgbWF5IGJlIGxvYWRlZCBieSBkZWZlcmVuY2luZworICAgICAgLy8gdGhlIHJlc3VsdCBvZiB2YV9uZXh0LgorICAgICAgQUZJLT5zZXRWYXJBcmdzUmVnU2F2ZVNpemUoVkFSZWdTYXZlU2l6ZSk7CisgICAgICBBRkktPnNldFZhckFyZ3NGcmFtZUluZGV4KAorICAgICAgICBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KFZBUmVnU2F2ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnT2Zmc2V0ICsgVkFSZWdTYXZlU2l6ZSAtIFZBUmVnU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisgICAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEFGSS0+Z2V0VmFyQXJnc0ZyYW1lSW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCkpOworCisgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBNZW1PcHM7CisgICAgICBmb3IgKDsgTnVtR1BScyA8IDQ7ICsrTnVtR1BScykgeworICAgICAgICBUYXJnZXRSZWdpc3RlckNsYXNzICpSQzsKKyAgICAgICAgaWYgKEFGSS0+aXNUaHVtYjFPbmx5RnVuY3Rpb24oKSkKKyAgICAgICAgICBSQyA9IEFSTTo6dEdQUlJlZ2lzdGVyQ2xhc3M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBSQyA9IEFSTTo6R1BSUmVnaXN0ZXJDbGFzczsKKworICAgICAgICB1bnNpZ25lZCBWUmVnID0gTUYuYWRkTGl2ZUluKEdQUkFyZ1JlZ3NbTnVtR1BSc10sIFJDKTsKKyAgICAgICAgU0RWYWx1ZSBWYWwgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBWUmVnLCBNVlQ6OmkzMik7CisgICAgICAgIFNEVmFsdWUgU3RvcmUgPQorICAgICAgICAgIERBRy5nZXRTdG9yZShWYWwuZ2V0VmFsdWUoMSksIGRsLCBWYWwsIEZJTiwKKyAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKEFGSS0+Z2V0VmFyQXJnc0ZyYW1lSW5kZXgoKSksCisgICAgICAgICAgICAgICAwLCBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICBNZW1PcHMucHVzaF9iYWNrKFN0b3JlKTsKKyAgICAgICAgRklOID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwgRklOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoNCwgZ2V0UG9pbnRlclR5KCkpKTsKKyAgICAgIH0KKyAgICAgIGlmICghTWVtT3BzLmVtcHR5KCkpCisgICAgICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbU9wc1swXSwgTWVtT3BzLnNpemUoKSk7CisgICAgfSBlbHNlCisgICAgICAvLyBUaGlzIHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgYXJndW1lbnQgcGFzc2VkIHZpYSBzdGFjay4KKyAgICAgIEFGSS0+c2V0VmFyQXJnc0ZyYW1lSW5kZXgoTUZJLT5DcmVhdGVGaXhlZE9iamVjdCg0LCBBcmdPZmZzZXQsIHRydWUpKTsKKyAgfQorCisgIHJldHVybiBDaGFpbjsKK30KKworLy8vIGlzRmxvYXRpbmdQb2ludFplcm8gLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICswLjAuCitzdGF0aWMgYm9vbCBpc0Zsb2F0aW5nUG9pbnRaZXJvKFNEVmFsdWUgT3ApIHsKKyAgaWYgKENvbnN0YW50RlBTRE5vZGUgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE9wKSkKKyAgICByZXR1cm4gQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzUG9zWmVybygpOworICBlbHNlIGlmIChJU0Q6OmlzRVhUTG9hZChPcC5nZXROb2RlKCkpIHx8IElTRDo6aXNOT05fRVhUTG9hZChPcC5nZXROb2RlKCkpKSB7CisgICAgLy8gTWF5YmUgdGhpcyBoYXMgYWxyZWFkeSBiZWVuIGxlZ2FsaXplZCBpbnRvIHRoZSBjb25zdGFudCBwb29sPworICAgIGlmIChPcC5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IEFSTUlTRDo6V3JhcHBlcikgeworICAgICAgU0RWYWx1ZSBXcmFwcGVyT3AgPSBPcC5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMCk7CisgICAgICBpZiAoQ29uc3RhbnRQb29sU0ROb2RlICpDUCA9IGR5bl9jYXN0PENvbnN0YW50UG9vbFNETm9kZT4oV3JhcHBlck9wKSkKKyAgICAgICAgaWYgKGNvbnN0IENvbnN0YW50RlAgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlA+KENQLT5nZXRDb25zdFZhbCgpKSkKKyAgICAgICAgICByZXR1cm4gQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzUG9zWmVybygpOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBSZXR1cm5zIGFwcHJvcHJpYXRlIEFSTSBDTVAgKGNtcCkgYW5kIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGNvZGUgZm9yCisvLy8gdGhlIGdpdmVuIG9wZXJhbmRzLgorU0RWYWx1ZQorQVJNVGFyZ2V0TG93ZXJpbmc6OmdldEFSTUNtcChTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsIElTRDo6Q29uZENvZGUgQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkFSTWNjLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIGNvbnN0IHsKKyAgaWYgKENvbnN0YW50U0ROb2RlICpSSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFJIUy5nZXROb2RlKCkpKSB7CisgICAgdW5zaWduZWQgQyA9IFJIU0MtPmdldFpFeHRWYWx1ZSgpOworICAgIGlmICghaXNMZWdhbElDbXBJbW1lZGlhdGUoQykpIHsKKyAgICAgIC8vIENvbnN0YW50IGRvZXMgbm90IGZpdCwgdHJ5IGFkanVzdGluZyBpdCBieSBvbmU/CisgICAgICBzd2l0Y2ggKENDKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTRVRMVDoKKyAgICAgIGNhc2UgSVNEOjpTRVRHRToKKyAgICAgICAgaWYgKGlzTGVnYWxJQ21wSW1tZWRpYXRlKEMtMSkpIHsKKyAgICAgICAgICBDQyA9IChDQyA9PSBJU0Q6OlNFVExUKSA/IElTRDo6U0VUTEUgOiBJU0Q6OlNFVEdUOworICAgICAgICAgIFJIUyA9IERBRy5nZXRDb25zdGFudChDLTEsIE1WVDo6aTMyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTRVRVTFQ6CisgICAgICBjYXNlIElTRDo6U0VUVUdFOgorICAgICAgICBpZiAoQyA+IDAgJiYgaXNMZWdhbElDbXBJbW1lZGlhdGUoQy0xKSkgeworICAgICAgICAgIENDID0gKENDID09IElTRDo6U0VUVUxUKSA/IElTRDo6U0VUVUxFIDogSVNEOjpTRVRVR1Q7CisgICAgICAgICAgUkhTID0gREFHLmdldENvbnN0YW50KEMtMSwgTVZUOjppMzIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVExFOgorICAgICAgY2FzZSBJU0Q6OlNFVEdUOgorICAgICAgICBpZiAoaXNMZWdhbElDbXBJbW1lZGlhdGUoQysxKSkgeworICAgICAgICAgIENDID0gKENDID09IElTRDo6U0VUTEUpID8gSVNEOjpTRVRMVCA6IElTRDo6U0VUR0U7CisgICAgICAgICAgUkhTID0gREFHLmdldENvbnN0YW50KEMrMSwgTVZUOjppMzIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVFVMRToKKyAgICAgIGNhc2UgSVNEOjpTRVRVR1Q6CisgICAgICAgIGlmIChDIDwgMHhmZmZmZmZmZiAmJiBpc0xlZ2FsSUNtcEltbWVkaWF0ZShDKzEpKSB7CisgICAgICAgICAgQ0MgPSAoQ0MgPT0gSVNEOjpTRVRVTEUpID8gSVNEOjpTRVRVTFQgOiBJU0Q6OlNFVFVHRTsKKyAgICAgICAgICBSSFMgPSBEQUcuZ2V0Q29uc3RhbnQoQysxLCBNVlQ6OmkzMik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQVJNQ0M6OkNvbmRDb2RlcyBDb25kQ29kZSA9IEludENDVG9BUk1DQyhDQyk7CisgIEFSTUlTRDo6Tm9kZVR5cGUgQ29tcGFyZVR5cGU7CisgIHN3aXRjaCAoQ29uZENvZGUpIHsKKyAgZGVmYXVsdDoKKyAgICBDb21wYXJlVHlwZSA9IEFSTUlTRDo6Q01QOworICAgIGJyZWFrOworICBjYXNlIEFSTUNDOjpFUToKKyAgY2FzZSBBUk1DQzo6TkU6CisgICAgLy8gVXNlcyBvbmx5IFogRmxhZworICAgIENvbXBhcmVUeXBlID0gQVJNSVNEOjpDTVBaOworICAgIGJyZWFrOworICB9CisgIEFSTWNjID0gREFHLmdldENvbnN0YW50KENvbmRDb2RlLCBNVlQ6OmkzMik7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShDb21wYXJlVHlwZSwgZGwsIE1WVDo6RmxhZywgTEhTLCBSSFMpOworfQorCisvLy8gUmV0dXJucyBhIGFwcHJvcHJpYXRlIFZGUCBDTVAgKGZjbXB7c3xkfStmbXN0YXQpIGZvciB0aGUgZ2l2ZW4gb3BlcmFuZHMuCitTRFZhbHVlCitBUk1UYXJnZXRMb3dlcmluZzo6Z2V0VkZQQ21wKFNEVmFsdWUgTEhTLCBTRFZhbHVlIFJIUywgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSBjb25zdCB7CisgIFNEVmFsdWUgQ21wOworICBpZiAoIWlzRmxvYXRpbmdQb2ludFplcm8oUkhTKSkKKyAgICBDbXAgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkNNUEZQLCBkbCwgTVZUOjpGbGFnLCBMSFMsIFJIUyk7CisgIGVsc2UKKyAgICBDbXAgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkNNUEZQdzAsIGRsLCBNVlQ6OkZsYWcsIExIUyk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkZNU1RBVCwgZGwsIE1WVDo6RmxhZywgQ21wKTsKK30KKworU0RWYWx1ZSBBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJTRUxFQ1RfQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIFNEVmFsdWUgTEhTID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBSSFMgPSBPcC5nZXRPcGVyYW5kKDEpOworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCg0KSktPmdldCgpOworICBTRFZhbHVlIFRydWVWYWwgPSBPcC5nZXRPcGVyYW5kKDIpOworICBTRFZhbHVlIEZhbHNlVmFsID0gT3AuZ2V0T3BlcmFuZCgzKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIpIHsKKyAgICBTRFZhbHVlIEFSTWNjOworICAgIFNEVmFsdWUgQ0NSID0gREFHLmdldFJlZ2lzdGVyKEFSTTo6Q1BTUiwgTVZUOjppMzIpOworICAgIFNEVmFsdWUgQ21wID0gZ2V0QVJNQ21wKExIUywgUkhTLCBDQywgQVJNY2MsIERBRywgZGwpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkNNT1YsIGRsLCBWVCwgRmFsc2VWYWwsIFRydWVWYWwsIEFSTWNjLCBDQ1IsQ21wKTsKKyAgfQorCisgIEFSTUNDOjpDb25kQ29kZXMgQ29uZENvZGUsIENvbmRDb2RlMjsKKyAgRlBDQ1RvQVJNQ0MoQ0MsIENvbmRDb2RlLCBDb25kQ29kZTIpOworCisgIFNEVmFsdWUgQVJNY2MgPSBEQUcuZ2V0Q29uc3RhbnQoQ29uZENvZGUsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBDbXAgPSBnZXRWRlBDbXAoTEhTLCBSSFMsIERBRywgZGwpOworICBTRFZhbHVlIENDUiA9IERBRy5nZXRSZWdpc3RlcihBUk06OkNQU1IsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkNNT1YsIGRsLCBWVCwgRmFsc2VWYWwsIFRydWVWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNY2MsIENDUiwgQ21wKTsKKyAgaWYgKENvbmRDb2RlMiAhPSBBUk1DQzo6QUwpIHsKKyAgICBTRFZhbHVlIEFSTWNjMiA9IERBRy5nZXRDb25zdGFudChDb25kQ29kZTIsIE1WVDo6aTMyKTsKKyAgICAvLyBGSVhNRTogTmVlZHMgYW5vdGhlciBDTVAgYmVjYXVzZSBmbGFnIGNhbiBoYXZlIGJ1dCBvbmUgdXNlLgorICAgIFNEVmFsdWUgQ21wMiA9IGdldFZGUENtcChMSFMsIFJIUywgREFHLCBkbCk7CisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoQVJNSVNEOjpDTU9WLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0LCBUcnVlVmFsLCBBUk1jYzIsIENDUiwgQ21wMik7CisgIH0KKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8vIGNhbkNoYW5nZVRvSW50IC0gR2l2ZW4gdGhlIGZwIGNvbXBhcmUgb3BlcmFuZCwgcmV0dXJuIHRydWUgaWYgaXQgaXMgc3VpdGFibGUKKy8vLyB0byBtb3JwaCB0byBhbiBpbnRlZ2VyIGNvbXBhcmUgc2VxdWVuY2UuCitzdGF0aWMgYm9vbCBjYW5DaGFuZ2VUb0ludChTRFZhbHVlIE9wLCBib29sICZTZWVuWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAqU3VidGFyZ2V0KSB7CisgIFNETm9kZSAqTiA9IE9wLmdldE5vZGUoKTsKKyAgaWYgKCFOLT5oYXNPbmVVc2UoKSkKKyAgICAvLyBPdGhlcndpc2UgaXQgcmVxdWlyZXMgbW92aW5nIHRoZSB2YWx1ZSBmcm9tIGZwIHRvIGludGVnZXIgcmVnaXN0ZXJzLgorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFOLT5nZXROdW1WYWx1ZXMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBpZiAoVlQgIT0gTVZUOjpmMzIgJiYgIVN1YnRhcmdldC0+aXNGUEJyY2NTbG93KCkpCisgICAgLy8gZjMyIGNhc2UgaXMgZ2VuZXJhbGx5IHByb2ZpdGFibGUuIGY2NCBjYXNlIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiB2Y21wZSArCisgICAgLy8gdm1ycyBhcmUgdmVyeSBzbG93LCBlLmcuIGNvcnRleC1hOC4KKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGlzRmxvYXRpbmdQb2ludFplcm8oT3ApKSB7CisgICAgU2Vlblplcm8gPSB0cnVlOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBJU0Q6OmlzTm9ybWFsTG9hZChOKTsKK30KKworc3RhdGljIFNEVmFsdWUgYml0Y2FzdGYzMlRvaTMyKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIGlmIChpc0Zsb2F0aW5nUG9pbnRaZXJvKE9wKSkKKyAgICByZXR1cm4gREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKworICBpZiAoTG9hZFNETm9kZSAqTGQgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihPcCkpCisgICAgcmV0dXJuIERBRy5nZXRMb2FkKE1WVDo6aTMyLCBPcC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICBMZC0+Z2V0Q2hhaW4oKSwgTGQtPmdldEJhc2VQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTGQtPmdldFNyY1ZhbHVlKCksIExkLT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICBMZC0+aXNWb2xhdGlsZSgpLCBMZC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICBMZC0+Z2V0QWxpZ25tZW50KCkpOworCisgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gVkZQIGNtcCBhcmd1bWVudCEiKTsKK30KKworc3RhdGljIHZvaWQgZXhwYW5kZjY0VG9pMzIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZSZXRWYWwxLCBTRFZhbHVlICZSZXRWYWwyKSB7CisgIGlmIChpc0Zsb2F0aW5nUG9pbnRaZXJvKE9wKSkgeworICAgIFJldFZhbDEgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIFJldFZhbDIgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChMb2FkU0ROb2RlICpMZCA9IGR5bl9jYXN0PExvYWRTRE5vZGU+KE9wKSkgeworICAgIFNEVmFsdWUgUHRyID0gTGQtPmdldEJhc2VQdHIoKTsKKyAgICBSZXRWYWwxID0gREFHLmdldExvYWQoTVZUOjppMzIsIE9wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIExkLT5nZXRDaGFpbigpLCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExkLT5nZXRTcmNWYWx1ZSgpLCBMZC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGQtPmlzVm9sYXRpbGUoKSwgTGQtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGQtPmdldEFsaWdubWVudCgpKTsKKworICAgIEVWVCBQdHJUeXBlID0gUHRyLmdldFZhbHVlVHlwZSgpOworICAgIHVuc2lnbmVkIE5ld0FsaWduID0gTWluQWxpZ24oTGQtPmdldEFsaWdubWVudCgpLCA0KTsKKyAgICBTRFZhbHVlIE5ld1B0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBPcC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyVHlwZSwgUHRyLCBEQUcuZ2V0Q29uc3RhbnQoNCwgUHRyVHlwZSkpOworICAgIFJldFZhbDIgPSBEQUcuZ2V0TG9hZChNVlQ6OmkzMiwgT3AuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGQtPmdldENoYWluKCksIE5ld1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGQtPmdldFNyY1ZhbHVlKCksIExkLT5nZXRTcmNWYWx1ZU9mZnNldCgpICsgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGQtPmlzVm9sYXRpbGUoKSwgTGQtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3QWxpZ24pOworICAgIHJldHVybjsKKyAgfQorCisgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gVkZQIGNtcCBhcmd1bWVudCEiKTsKK30KKworLy8vIE9wdGltaXplVkZQQnJjb25kIC0gV2l0aCAtZW5hYmxlLXVuc2FmZS1mcC1tYXRoLCBpdCdzIGxlZ2FsIHRvIG9wdGltaXplIHNvbWUKKy8vLyBmMzIgYW5kIGV2ZW4gZjY0IGNvbXBhcmlzb25zIHRvIGludGVnZXIgb25lcy4KK1NEVmFsdWUKK0FSTVRhcmdldExvd2VyaW5nOjpPcHRpbWl6ZVZGUEJyY29uZChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBTRFZhbHVlIENoYWluID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgSVNEOjpDb25kQ29kZSBDQyA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpLT5nZXQoKTsKKyAgU0RWYWx1ZSBMSFMgPSBPcC5nZXRPcGVyYW5kKDIpOworICBTRFZhbHVlIFJIUyA9IE9wLmdldE9wZXJhbmQoMyk7CisgIFNEVmFsdWUgRGVzdCA9IE9wLmdldE9wZXJhbmQoNCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBib29sIFNlZW5aZXJvID0gZmFsc2U7CisgIGlmIChjYW5DaGFuZ2VUb0ludChMSFMsIFNlZW5aZXJvLCBTdWJ0YXJnZXQpICYmCisgICAgICBjYW5DaGFuZ2VUb0ludChSSFMsIFNlZW5aZXJvLCBTdWJ0YXJnZXQpICYmCisgICAgICAvLyBJZiBvbmUgb2YgdGhlIG9wZXJhbmQgaXMgemVybywgaXQncyBzYWZlIHRvIGlnbm9yZSB0aGUgTmFOIGNhc2Ugc2luY2UKKyAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCBlcXVhbGl0eSBjb21wYXJpc29ucy4KKyAgICAgIChTZWVuWmVybyB8fCAoREFHLmlzS25vd25OZXZlck5hTihMSFMpICYmIERBRy5pc0tub3duTmV2ZXJOYU4oUkhTKSkpKSB7CisgICAgLy8gSWYgdW5zYWZlIGZwIG1hdGggb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQgYW5kIHRoZXJlIGFyZSBubyBvdGh0ZXIgdXNlcyBvZgorICAgIC8vIHRoZSBDTVAgb3BlcmFuZHMsIGFuZCB0aGUgY29uZGl0aW9uIGNvZGUgaXMgRVEgb2UgTkUsIHdlIGNhbiBvcHRpbWl6ZSBpdAorICAgIC8vIHRvIGFuIGludGVnZXIgY29tcGFyaXNvbi4KKyAgICBpZiAoQ0MgPT0gSVNEOjpTRVRPRVEpCisgICAgICBDQyA9IElTRDo6U0VURVE7CisgICAgZWxzZSBpZiAoQ0MgPT0gSVNEOjpTRVRVTkUpCisgICAgICBDQyA9IElTRDo6U0VUTkU7CisKKyAgICBTRFZhbHVlIEFSTWNjOworICAgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmMzIpIHsKKyAgICAgIExIUyA9IGJpdGNhc3RmMzJUb2kzMihMSFMsIERBRyk7CisgICAgICBSSFMgPSBiaXRjYXN0ZjMyVG9pMzIoUkhTLCBEQUcpOworICAgICAgU0RWYWx1ZSBDbXAgPSBnZXRBUk1DbXAoTEhTLCBSSFMsIENDLCBBUk1jYywgREFHLCBkbCk7CisgICAgICBTRFZhbHVlIENDUiA9IERBRy5nZXRSZWdpc3RlcihBUk06OkNQU1IsIE1WVDo6aTMyKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkJSQ09ORCwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW4sIERlc3QsIEFSTWNjLCBDQ1IsIENtcCk7CisgICAgfQorCisgICAgU0RWYWx1ZSBMSFMxLCBMSFMyOworICAgIFNEVmFsdWUgUkhTMSwgUkhTMjsKKyAgICBleHBhbmRmNjRUb2kzMihMSFMsIERBRywgTEhTMSwgTEhTMik7CisgICAgZXhwYW5kZjY0VG9pMzIoUkhTLCBEQUcsIFJIUzEsIFJIUzIpOworICAgIEFSTUNDOjpDb25kQ29kZXMgQ29uZENvZGUgPSBJbnRDQ1RvQVJNQ0MoQ0MpOworICAgIEFSTWNjID0gREFHLmdldENvbnN0YW50KENvbmRDb2RlLCBNVlQ6OmkzMik7CisgICAgU0RWVExpc3QgVlRMaXN0ID0gREFHLmdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBBUk1jYywgTEhTMSwgTEhTMiwgUkhTMSwgUkhTMiwgRGVzdCB9OworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkJDQ19pNjQsIGRsLCBWVExpc3QsIE9wcywgNyk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIEFSTVRhcmdldExvd2VyaW5nOjpMb3dlckJSX0NDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmdldCgpOworICBTRFZhbHVlIExIUyA9IE9wLmdldE9wZXJhbmQoMik7CisgIFNEVmFsdWUgUkhTID0gT3AuZ2V0T3BlcmFuZCgzKTsKKyAgU0RWYWx1ZSBEZXN0ID0gT3AuZ2V0T3BlcmFuZCg0KTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIpIHsKKyAgICBTRFZhbHVlIEFSTWNjOworICAgIFNEVmFsdWUgQ21wID0gZ2V0QVJNQ21wKExIUywgUkhTLCBDQywgQVJNY2MsIERBRywgZGwpOworICAgIFNEVmFsdWUgQ0NSID0gREFHLmdldFJlZ2lzdGVyKEFSTTo6Q1BTUiwgTVZUOjppMzIpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkJSQ09ORCwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgIENoYWluLCBEZXN0LCBBUk1jYywgQ0NSLCBDbXApOworICB9CisKKyAgYXNzZXJ0KExIUy5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmYzMiB8fCBMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmNjQpOworCisgIGlmIChVbnNhZmVGUE1hdGggJiYKKyAgICAgIChDQyA9PSBJU0Q6OlNFVEVRIHx8IENDID09IElTRDo6U0VUT0VRIHx8CisgICAgICAgQ0MgPT0gSVNEOjpTRVRORSB8fCBDQyA9PSBJU0Q6OlNFVFVORSkpIHsKKyAgICBTRFZhbHVlIFJlc3VsdCA9IE9wdGltaXplVkZQQnJjb25kKE9wLCBEQUcpOworICAgIGlmIChSZXN1bHQuZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIEFSTUNDOjpDb25kQ29kZXMgQ29uZENvZGUsIENvbmRDb2RlMjsKKyAgRlBDQ1RvQVJNQ0MoQ0MsIENvbmRDb2RlLCBDb25kQ29kZTIpOworCisgIFNEVmFsdWUgQVJNY2MgPSBEQUcuZ2V0Q29uc3RhbnQoQ29uZENvZGUsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBDbXAgPSBnZXRWRlBDbXAoTEhTLCBSSFMsIERBRywgZGwpOworICBTRFZhbHVlIENDUiA9IERBRy5nZXRSZWdpc3RlcihBUk06OkNQU1IsIE1WVDo6aTMyKTsKKyAgU0RWVExpc3QgVlRMaXN0ID0gREFHLmdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICBTRFZhbHVlIE9wc1tdID0geyBDaGFpbiwgRGVzdCwgQVJNY2MsIENDUiwgQ21wIH07CisgIFNEVmFsdWUgUmVzID0gREFHLmdldE5vZGUoQVJNSVNEOjpCUkNPTkQsIGRsLCBWVExpc3QsIE9wcywgNSk7CisgIGlmIChDb25kQ29kZTIgIT0gQVJNQ0M6OkFMKSB7CisgICAgQVJNY2MgPSBEQUcuZ2V0Q29uc3RhbnQoQ29uZENvZGUyLCBNVlQ6OmkzMik7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgUmVzLCBEZXN0LCBBUk1jYywgQ0NSLCBSZXMuZ2V0VmFsdWUoMSkgfTsKKyAgICBSZXMgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkJSQ09ORCwgZGwsIFZUTGlzdCwgT3BzLCA1KTsKKyAgfQorICByZXR1cm4gUmVzOworfQorCitTRFZhbHVlIEFSTVRhcmdldExvd2VyaW5nOjpMb3dlckJSX0pUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFRhYmxlID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBJbmRleCA9IE9wLmdldE9wZXJhbmQoMik7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBFVlQgUFR5ID0gZ2V0UG9pbnRlclR5KCk7CisgIEp1bXBUYWJsZVNETm9kZSAqSlQgPSBjYXN0PEp1bXBUYWJsZVNETm9kZT4oVGFibGUpOworICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgU0RWYWx1ZSBVSWQgPSBEQUcuZ2V0Q29uc3RhbnQoQUZJLT5jcmVhdGVKdW1wVGFibGVVSWQoKSwgUFR5KTsKKyAgU0RWYWx1ZSBKVEkgPSBEQUcuZ2V0VGFyZ2V0SnVtcFRhYmxlKEpULT5nZXRJbmRleCgpLCBQVHkpOworICBUYWJsZSA9IERBRy5nZXROb2RlKEFSTUlTRDo6V3JhcHBlckpULCBkbCwgTVZUOjppMzIsIEpUSSwgVUlkKTsKKyAgSW5kZXggPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZGwsIFBUeSwgSW5kZXgsIERBRy5nZXRDb25zdGFudCg0LCBQVHkpKTsKKyAgU0RWYWx1ZSBBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQVHksIEluZGV4LCBUYWJsZSk7CisgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIyKCkpIHsKKyAgICAvLyBUaHVtYjIgdXNlcyBhIHR3by1sZXZlbCBqdW1wLiBUaGF0IGlzLCBpdCBqdW1wcyBpbnRvIHRoZSBqdW1wIHRhYmxlCisgICAgLy8gd2hpY2ggZG9lcyBhbm90aGVyIGp1bXAgdG8gdGhlIGRlc3RpbmF0aW9uLiBUaGlzIGFsc28gbWFrZXMgaXQgZWFzaWVyCisgICAgLy8gdG8gdHJhbnNsYXRlIGl0IHRvIFRCQiAvIFRCSCBsYXRlci4KKyAgICAvLyBGSVhNRTogVGhpcyBtaWdodCBub3Qgd29yayBpZiB0aGUgZnVuY3Rpb24gaXMgZXh0cmVtZWx5IGxhcmdlLgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkJSMl9KVCwgZGwsIE1WVDo6T3RoZXIsIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICBBZGRyLCBPcC5nZXRPcGVyYW5kKDIpLCBKVEksIFVJZCk7CisgIH0KKyAgaWYgKGdldFRhcmdldE1hY2hpbmUoKS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6UElDXykgeworICAgIEFkZHIgPSBEQUcuZ2V0TG9hZCgoRVZUKU1WVDo6aTMyLCBkbCwgQ2hhaW4sIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRKdW1wVGFibGUoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICBDaGFpbiA9IEFkZHIuZ2V0VmFsdWUoMSk7CisgICAgQWRkciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUFR5LCBBZGRyLCBUYWJsZSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6QlJfSlQsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbiwgQWRkciwgSlRJLCBVSWQpOworICB9IGVsc2UgeworICAgIEFkZHIgPSBEQUcuZ2V0TG9hZChQVHksIGRsLCBDaGFpbiwgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEp1bXBUYWJsZSgpLCAwLCBmYWxzZSwgZmFsc2UsIDApOworICAgIENoYWluID0gQWRkci5nZXRWYWx1ZSgxKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpCUl9KVCwgZGwsIE1WVDo6T3RoZXIsIENoYWluLCBBZGRyLCBKVEksIFVJZCk7CisgIH0KK30KKworc3RhdGljIFNEVmFsdWUgTG93ZXJGUF9UT19JTlQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICB1bnNpZ25lZCBPcGM7CisKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIGFzc2VydCgwICYmICJJbnZhbGlkIG9wY29kZSEiKTsKKyAgY2FzZSBJU0Q6OkZQX1RPX1NJTlQ6CisgICAgT3BjID0gQVJNSVNEOjpGVE9TSTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkZQX1RPX1VJTlQ6CisgICAgT3BjID0gQVJNSVNEOjpGVE9VSTsKKyAgICBicmVhazsKKyAgfQorICBPcCA9IERBRy5nZXROb2RlKE9wYywgZGwsIE1WVDo6ZjMyLCBPcC5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmkzMiwgT3ApOworfQorCitzdGF0aWMgU0RWYWx1ZSBMb3dlcklOVF9UT19GUChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgeworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICB1bnNpZ25lZCBPcGM7CisKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIGFzc2VydCgwICYmICJJbnZhbGlkIG9wY29kZSEiKTsKKyAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6CisgICAgT3BjID0gQVJNSVNEOjpTSVRPRjsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlVJTlRfVE9fRlA6CisgICAgT3BjID0gQVJNSVNEOjpVSVRPRjsKKyAgICBicmVhazsKKyAgfQorCisgIE9wID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6ZjMyLCBPcC5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKE9wYywgZGwsIFZULCBPcCk7Cit9CisKK1NEVmFsdWUgQVJNVGFyZ2V0TG93ZXJpbmc6Okxvd2VyRkNPUFlTSUdOKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIEltcGxlbWVudCBmY29weXNpZ24gd2l0aCBhIGZhYnMgYW5kIGEgY29uZGl0aW9uYWwgZm5lZy4KKyAgU0RWYWx1ZSBUbXAwID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBUbXAxID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIFNyY1ZUID0gVG1wMS5nZXRWYWx1ZVR5cGUoKTsKKyAgU0RWYWx1ZSBBYnNWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZBQlMsIGRsLCBWVCwgVG1wMCk7CisgIFNEVmFsdWUgQVJNY2MgPSBEQUcuZ2V0Q29uc3RhbnQoQVJNQ0M6OkxULCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgRlAwID0gREFHLmdldENvbnN0YW50RlAoMC4wLCBTcmNWVCk7CisgIFNEVmFsdWUgQ21wID0gZ2V0VkZQQ21wKFRtcDEsIEZQMCwgREFHLCBkbCk7CisgIFNEVmFsdWUgQ0NSID0gREFHLmdldFJlZ2lzdGVyKEFSTTo6Q1BTUiwgTVZUOjppMzIpOworICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpDTkVHLCBkbCwgVlQsIEFic1ZhbCwgQWJzVmFsLCBBUk1jYywgQ0NSLCBDbXApOworfQorCitTRFZhbHVlIEFSTVRhcmdldExvd2VyaW5nOjpMb3dlclJFVFVSTkFERFIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0eworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTUZJLT5zZXRSZXR1cm5BZGRyZXNzSXNUYWtlbih0cnVlKTsKKworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICB1bnNpZ25lZCBEZXB0aCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMCkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgaWYgKERlcHRoKSB7CisgICAgU0RWYWx1ZSBGcmFtZUFkZHIgPSBMb3dlckZSQU1FQUREUihPcCwgREFHKTsKKyAgICBTRFZhbHVlIE9mZnNldCA9IERBRy5nZXRDb25zdGFudCg0LCBNVlQ6OmkzMik7CisgICAgcmV0dXJuIERBRy5nZXRMb2FkKFZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFZULCBGcmFtZUFkZHIsIE9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSwgMCk7CisgIH0KKworICAvLyBSZXR1cm4gTFIsIHdoaWNoIGNvbnRhaW5zIHRoZSByZXR1cm4gYWRkcmVzcy4gTWFyayBpdCBhbiBpbXBsaWNpdCBsaXZlLWluLgorICB1bnNpZ25lZCBSZWcgPSBNRi5hZGRMaXZlSW4oQVJNOjpMUiwgZ2V0UmVnQ2xhc3NGb3IoTVZUOjppMzIpKTsKKyAgcmV0dXJuIERBRy5nZXRDb3B5RnJvbVJlZyhEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBSZWcsIFZUKTsKK30KKworU0RWYWx1ZSBBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJGUkFNRUFERFIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZyYW1lSW5mbygpOworICBNRkktPnNldEZyYW1lQWRkcmVzc0lzVGFrZW4odHJ1ZSk7CisKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsgIC8vIEZJWE1FIHByb2JhYmx5IG5vdCBtZWFuaW5nZnVsCisgIHVuc2lnbmVkIERlcHRoID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgwKSktPmdldFpFeHRWYWx1ZSgpOworICB1bnNpZ25lZCBGcmFtZVJlZyA9IChTdWJ0YXJnZXQtPmlzVGh1bWIoKSB8fCBTdWJ0YXJnZXQtPmlzVGFyZ2V0RGFyd2luKCkpCisgICAgPyBBUk06OlI3IDogQVJNOjpSMTE7CisgIFNEVmFsdWUgRnJhbWVBZGRyID0gREFHLmdldENvcHlGcm9tUmVnKERBRy5nZXRFbnRyeU5vZGUoKSwgZGwsIEZyYW1lUmVnLCBWVCk7CisgIHdoaWxlIChEZXB0aC0tKQorICAgIEZyYW1lQWRkciA9IERBRy5nZXRMb2FkKFZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBGcmFtZUFkZHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgcmV0dXJuIEZyYW1lQWRkcjsKK30KKworLy8vIEV4cGFuZEJJVF9DT05WRVJUIC0gSWYgdGhlIHRhcmdldCBzdXBwb3J0cyBWRlAsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvCisvLy8gZXhwYW5kIGEgYml0IGNvbnZlcnQgd2hlcmUgZWl0aGVyIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gdHlwZSBpcyBpNjQgdG8KKy8vLyB1c2UgYSBWTU9WRFJSIG9yIFZNT1ZSUkQgbm9kZS4gIFRoaXMgc2hvdWxkIG5vdCBiZSBkb25lIHdoZW4gdGhlIG5vbi1pNjQKKy8vLyBvcGVyYW5kIHR5cGUgaXMgaWxsZWdhbCAoZS5nLiwgdjJmMzIgZm9yIGEgdGFyZ2V0IHRoYXQgZG9lc24ndCBzdXBwb3J0CisvLy8gdmVjdG9ycyksIHNpbmNlIHRoZSBsZWdhbGl6ZXIgd29uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhhdC4KK3N0YXRpYyBTRFZhbHVlIEV4cGFuZEJJVF9DT05WRVJUKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSA9IERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIE9wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGZvciBpNjQgdHlwZXMsIGVpdGhlciBhcyB0aGUKKyAgLy8gc291cmNlIG9yIGRlc3RpbmF0aW9uIG9mIHRoZSBiaXQgY29udmVydC4KKyAgRVZUIFNyY1ZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBEc3RWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgYXNzZXJ0KChTcmNWVCA9PSBNVlQ6Omk2NCB8fCBEc3RWVCA9PSBNVlQ6Omk2NCkgJiYKKyAgICAgICAgICJFeHBhbmRCSVRfQ09OVkVSVCBjYWxsZWQgZm9yIG5vbi1pNjQgdHlwZSIpOworCisgIC8vIFR1cm4gaTY0LT5mNjQgaW50byBWTU9WRFJSLgorICBpZiAoU3JjVlQgPT0gTVZUOjppNjQgJiYgVExJLmlzVHlwZUxlZ2FsKERzdFZUKSkgeworICAgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE1WVDo6aTMyLCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSk7CisgICAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgTVZUOjppMzIpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIERzdFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZNT1ZEUlIsIGRsLCBNVlQ6OmY2NCwgTG8sIEhpKSk7CisgIH0KKworICAvLyBUdXJuIGY2NC0+aTY0IGludG8gVk1PVlJSRC4KKyAgaWYgKERzdFZUID09IE1WVDo6aTY0ICYmIFRMSS5pc1R5cGVMZWdhbChTcmNWVCkpIHsKKyAgICBTRFZhbHVlIEN2dCA9IERBRy5nZXROb2RlKEFSTUlTRDo6Vk1PVlJSRCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlRMaXN0KE1WVDo6aTMyLCBNVlQ6OmkzMiksICZPcCwgMSk7CisgICAgLy8gTWVyZ2UgdGhlIHBpZWNlcyBpbnRvIGEgc2luZ2xlIGk2NCB2YWx1ZS4KKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgTVZUOjppNjQsIEN2dCwgQ3Z0LmdldFZhbHVlKDEpKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBnZXRaZXJvVmVjdG9yIC0gUmV0dXJucyBhIHZlY3RvciBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIGFsbCB6ZXJvIGVsZW1lbnRzLgorLy8vIFplcm8gdmVjdG9ycyBhcmUgdXNlZCB0byByZXByZXNlbnQgdmVjdG9yIG5lZ2F0aW9uIGFuZCBpbiB0aG9zZSBjYXNlcworLy8vIHdpbGwgYmUgaW1wbGVtZW50ZWQgd2l0aCB0aGUgTkVPTiBWTkVHIGluc3RydWN0aW9uLiAgSG93ZXZlciwgVk5FRyBkb2VzCisvLy8gbm90IHN1cHBvcnQgaTY0IGVsZW1lbnRzLCBzbyBzb21ldGltZXMgdGhlIHplcm8gdmVjdG9ycyB3aWxsIG5lZWQgdG8gYmUKKy8vLyBleHBsaWNpdGx5IGNvbnN0cnVjdGVkLiAgUmVnYXJkbGVzcywgdXNlIGEgY2Fub25pY2FsIFZNT1YgdG8gY3JlYXRlIHRoZQorLy8vIHplcm8gdmVjdG9yLgorc3RhdGljIFNEVmFsdWUgZ2V0WmVyb1ZlY3RvcihFVlQgVlQsIFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCkgeworICBhc3NlcnQoVlQuaXNWZWN0b3IoKSAmJiAiRXhwZWN0ZWQgYSB2ZWN0b3IgdHlwZSIpOworICAvLyBUaGUgY2Fub25pY2FsIG1vZGlmaWVkIGltbWVkaWF0ZSBlbmNvZGluZyBvZiBhIHplcm8gdmVjdG9yIGlzLi4uLjAhCisgIFNEVmFsdWUgRW5jb2RlZFZhbCA9IERBRy5nZXRUYXJnZXRDb25zdGFudCgwLCBNVlQ6OmkzMik7CisgIEVWVCBWbW92VlQgPSBWVC5pczEyOEJpdFZlY3RvcigpID8gTVZUOjp2NGkzMiA6IE1WVDo6djJpMzI7CisgIFNEVmFsdWUgVm1vdiA9IERBRy5nZXROb2RlKEFSTUlTRDo6Vk1PVklNTSwgZGwsIFZtb3ZWVCwgRW5jb2RlZFZhbCk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsIFZtb3YpOworfQorCisvLy8gTG93ZXJTaGlmdFJpZ2h0UGFydHMgLSBMb3dlciBTUkFfUEFSVFMsIHdoaWNoIHJldHVybnMgdHdvCisvLy8gaTMyIHZhbHVlcyBhbmQgdGFrZSBhIDIgeCBpMzIgdmFsdWUgdG8gc2hpZnQgcGx1cyBhIHNoaWZ0IGFtb3VudC4KK1NEVmFsdWUgQVJNVGFyZ2V0TG93ZXJpbmc6Okxvd2VyU2hpZnRSaWdodFBhcnRzKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBhc3NlcnQoT3AuZ2V0TnVtT3BlcmFuZHMoKSA9PSAzICYmICJOb3QgYSBkb3VibGUtc2hpZnQhIik7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICB1bnNpZ25lZCBWVEJpdHMgPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBTaE9wTG8gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFNoT3BIaSA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgU2hBbXQgID0gT3AuZ2V0T3BlcmFuZCgyKTsKKyAgU0RWYWx1ZSBBUk1jYzsKKyAgdW5zaWduZWQgT3BjID0gKE9wLmdldE9wY29kZSgpID09IElTRDo6U1JBX1BBUlRTKSA/IElTRDo6U1JBIDogSVNEOjpTUkw7CisKKyAgYXNzZXJ0KE9wLmdldE9wY29kZSgpID09IElTRDo6U1JBX1BBUlRTIHx8IE9wLmdldE9wY29kZSgpID09IElTRDo6U1JMX1BBUlRTKTsKKworICBTRFZhbHVlIFJldlNoQW10ID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChWVEJpdHMsIE1WVDo6aTMyKSwgU2hBbXQpOworICBTRFZhbHVlIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIFZULCBTaE9wTG8sIFNoQW10KTsKKyAgU0RWYWx1ZSBFeHRyYVNoQW10ID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBNVlQ6OmkzMiwgU2hBbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChWVEJpdHMsIE1WVDo6aTMyKSk7CisgIFNEVmFsdWUgVG1wMiA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgVlQsIFNoT3BIaSwgUmV2U2hBbXQpOworICBTRFZhbHVlIEZhbHNlVmFsID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFZULCBUbXAxLCBUbXAyKTsKKyAgU0RWYWx1ZSBUcnVlVmFsID0gREFHLmdldE5vZGUoT3BjLCBkbCwgVlQsIFNoT3BIaSwgRXh0cmFTaEFtdCk7CisKKyAgU0RWYWx1ZSBDQ1IgPSBEQUcuZ2V0UmVnaXN0ZXIoQVJNOjpDUFNSLCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgQ21wID0gZ2V0QVJNQ21wKEV4dHJhU2hBbXQsIERBRy5nZXRDb25zdGFudCgwLCBNVlQ6OmkzMiksIElTRDo6U0VUR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTWNjLCBEQUcsIGRsKTsKKyAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKE9wYywgZGwsIFZULCBTaE9wSGksIFNoQW10KTsKKyAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKEFSTUlTRDo6Q01PViwgZGwsIFZULCBGYWxzZVZhbCwgVHJ1ZVZhbCwgQVJNY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1IsIENtcCk7CisKKyAgU0RWYWx1ZSBPcHNbMl0gPSB7IExvLCBIaSB9OworICByZXR1cm4gREFHLmdldE1lcmdlVmFsdWVzKE9wcywgMiwgZGwpOworfQorCisvLy8gTG93ZXJTaGlmdExlZnRQYXJ0cyAtIExvd2VyIFNITF9QQVJUUywgd2hpY2ggcmV0dXJucyB0d28KKy8vLyBpMzIgdmFsdWVzIGFuZCB0YWtlIGEgMiB4IGkzMiB2YWx1ZSB0byBzaGlmdCBwbHVzIGEgc2hpZnQgYW1vdW50LgorU0RWYWx1ZSBBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJTaGlmdExlZnRQYXJ0cyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBhc3NlcnQoT3AuZ2V0TnVtT3BlcmFuZHMoKSA9PSAzICYmICJOb3QgYSBkb3VibGUtc2hpZnQhIik7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICB1bnNpZ25lZCBWVEJpdHMgPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBTaE9wTG8gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFNoT3BIaSA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgU2hBbXQgID0gT3AuZ2V0T3BlcmFuZCgyKTsKKyAgU0RWYWx1ZSBBUk1jYzsKKworICBhc3NlcnQoT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSExfUEFSVFMpOworICBTRFZhbHVlIFJldlNoQW10ID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChWVEJpdHMsIE1WVDo6aTMyKSwgU2hBbXQpOworICBTRFZhbHVlIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIFZULCBTaE9wTG8sIFJldlNoQW10KTsKKyAgU0RWYWx1ZSBFeHRyYVNoQW10ID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBNVlQ6OmkzMiwgU2hBbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChWVEJpdHMsIE1WVDo6aTMyKSk7CisgIFNEVmFsdWUgVG1wMiA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgVlQsIFNoT3BIaSwgU2hBbXQpOworICBTRFZhbHVlIFRtcDMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIFZULCBTaE9wTG8sIEV4dHJhU2hBbXQpOworCisgIFNEVmFsdWUgRmFsc2VWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgVlQsIFRtcDEsIFRtcDIpOworICBTRFZhbHVlIENDUiA9IERBRy5nZXRSZWdpc3RlcihBUk06OkNQU1IsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBDbXAgPSBnZXRBUk1DbXAoRXh0cmFTaEFtdCwgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSwgSVNEOjpTRVRHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNY2MsIERBRywgZGwpOworICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBWVCwgU2hPcExvLCBTaEFtdCk7CisgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkNNT1YsIGRsLCBWVCwgRmFsc2VWYWwsIFRtcDMsIEFSTWNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NSLCBDbXApOworCisgIFNEVmFsdWUgT3BzWzJdID0geyBMbywgSGkgfTsKKyAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPcHMsIDIsIGRsKTsKK30KKworU0RWYWx1ZSBBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJGTFRfUk9VTkRTXyhTRFZhbHVlIE9wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgLy8gVGhlIHJvdW5kaW5nIG1vZGUgaXMgaW4gYml0cyAyMzoyMiBvZiB0aGUgRlBTQ1IuCisgIC8vIFRoZSBBUk0gcm91bmRpbmcgbW9kZSB2YWx1ZSB0byBGTFRfUk9VTkRTIG1hcHBpbmcgaXMgMC0+MSwgMS0+MiwgMi0+MywgMy0+MAorICAvLyBUaGUgZm9ybXVsYSB3ZSB1c2UgdG8gaW1wbGVtZW50IHRoaXMgaXMgKCgoRlBTQ1IgKyAxIDw8IDIyKSA+PiAyMikgJiAzKQorICAvLyBzbyB0aGF0IHRoZSBzaGlmdCArIGFuZCBnZXQgZm9sZGVkIGludG8gYSBiaXRmaWVsZCBleHRyYWN0LgorICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgRlBTQ1IgPSBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEludHJpbnNpYzo6YXJtX2dldF9mcHNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMikpOworICBTRFZhbHVlIEZsdFJvdW5kcyA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppMzIsIEZQU0NSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMVUgPDwgMjIsIE1WVDo6aTMyKSk7CisgIFNEVmFsdWUgUk1PREUgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE1WVDo6aTMyLCBGbHRSb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMjIsIE1WVDo6aTMyKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIE1WVDo6aTMyLCBSTU9ERSwgCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMywgTVZUOjppMzIpKTsKK30KKworc3RhdGljIFNEVmFsdWUgTG93ZXJDVFRaKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVJNU3VidGFyZ2V0ICpTVCkgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBpZiAoIVNULT5oYXNWNlQyT3BzKCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBTRFZhbHVlIHJiaXQgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlJCSVQsIGRsLCBWVCwgTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkNUTFosIGRsLCBWVCwgcmJpdCk7Cit9CisKK3N0YXRpYyBTRFZhbHVlIExvd2VyU2hpZnQoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVJNU3VidGFyZ2V0ICpTVCkgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBMb3dlciB2ZWN0b3Igc2hpZnRzIG9uIE5FT04gdG8gdXNlIFZTSEwuCisgIGlmIChWVC5pc1ZlY3RvcigpKSB7CisgICAgYXNzZXJ0KFNULT5oYXNORU9OKCkgJiYgInVuZXhwZWN0ZWQgdmVjdG9yIHNoaWZ0Iik7CisKKyAgICAvLyBMZWZ0IHNoaWZ0cyB0cmFuc2xhdGUgZGlyZWN0bHkgdG8gdGhlIHZzaGlmdHUgaW50cmluc2ljLgorICAgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6OmFybV9uZW9uX3ZzaGlmdHUsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpKTsKKworICAgIGFzc2VydCgoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkEgfHwKKyAgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6U1JMKSAmJiAidW5leHBlY3RlZCB2ZWN0b3Igc2hpZnQgb3Bjb2RlIik7CisKKyAgICAvLyBORU9OIHVzZXMgdGhlIHNhbWUgaW50cmluc2ljcyBmb3IgYm90aCBsZWZ0IGFuZCByaWdodCBzaGlmdHMuICBGb3IKKyAgICAvLyByaWdodCBzaGlmdHMsIHRoZSBzaGlmdCBhbW91bnRzIGFyZSBuZWdhdGl2ZSwgc28gbmVnYXRlIHRoZSB2ZWN0b3Igb2YKKyAgICAvLyBzaGlmdCBhbW91bnRzLgorICAgIEVWVCBTaGlmdFZUID0gTi0+Z2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICBTRFZhbHVlIE5lZ2F0ZWRDb3VudCA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwgU2hpZnRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFplcm9WZWN0b3IoU2hpZnRWVCwgREFHLCBkbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBJbnRyaW5zaWM6OklEIHZzaGlmdEludCA9IChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSQSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljOjphcm1fbmVvbl92c2hpZnRzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM6OmFybV9uZW9uX3ZzaGlmdHUpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQodnNoaWZ0SW50LCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCksIE5lZ2F0ZWRDb3VudCk7CisgIH0KKworICAvLyBXZSBjYW4gZ2V0IGhlcmUgZm9yIGEgbm9kZSBsaWtlIGkzMiA9IElTRDo6U0hMIGkzMiwgaTY0CisgIGlmIChWVCAhPSBNVlQ6Omk2NCkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIGFzc2VydCgoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkwgfHwgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkEpICYmCisgICAgICAgICAiVW5rbm93biBzaGlmdCB0byBsb3dlciEiKTsKKworICAvLyBXZSBvbmx5IGxvd2VyIFNSQSwgU1JMIG9mIDEgaGVyZSwgYWxsIG90aGVycyB1c2UgZ2VuZXJpYyBsb3dlcmluZy4KKyAgaWYgKCFpc2E8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpIHx8CisgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCkgIT0gMSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIC8vIElmIHdlIGFyZSBpbiB0aHVtYiBtb2RlLCB3ZSBkb24ndCBoYXZlIFJSWC4KKyAgaWYgKFNULT5pc1RodW1iMU9ubHkoKSkgcmV0dXJuIFNEVmFsdWUoKTsKKworICAvLyBPa2F5LCB3ZSBoYXZlIGEgNjQtYml0IFNSQSBvciBTUkwgb2YgMS4gIExvd2VyIHRoaXMgdG8gYW4gUlJYIGV4cHIuCisgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE1WVDo6aTMyLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSk7CisgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE1WVDo6aTMyLCBOLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTMyKSk7CisKKyAgLy8gRmlyc3QsIGJ1aWxkIGEgU1JBX0ZMQUcvU1JMX0ZMQUcgb3AsIHdoaWNoIHNoaWZ0cyB0aGUgdG9wIHBhcnQgYnkgb25lIGFuZAorICAvLyBjYXB0dXJlcyB0aGUgcmVzdWx0IGludG8gYSBjYXJyeSBmbGFnLgorICB1bnNpZ25lZCBPcGMgPSBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSTCA/IEFSTUlTRDo6U1JMX0ZMQUc6QVJNSVNEOjpTUkFfRkxBRzsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBEQUcuZ2V0VlRMaXN0KE1WVDo6aTMyLCBNVlQ6OkZsYWcpLCAmSGksIDEpOworCisgIC8vIFRoZSBsb3cgcGFydCBpcyBhbiBBUk1JU0Q6OlJSWCBvcGVyYW5kLCB3aGljaCBzaGlmdHMgdGhlIGNhcnJ5IGluLgorICBMbyA9IERBRy5nZXROb2RlKEFSTUlTRDo6UlJYLCBkbCwgTVZUOjppMzIsIExvLCBIaS5nZXRWYWx1ZSgxKSk7CisKKyAgLy8gTWVyZ2UgdGhlIHBpZWNlcyBpbnRvIGEgc2luZ2xlIGk2NCB2YWx1ZS4KKyByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgTVZUOjppNjQsIExvLCBIaSk7Cit9CisKK3N0YXRpYyBTRFZhbHVlIExvd2VyVlNFVENDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIFNEVmFsdWUgVG1wT3AwLCBUbXBPcDE7CisgIGJvb2wgSW52ZXJ0ID0gZmFsc2U7CisgIGJvb2wgU3dhcCA9IGZhbHNlOworICB1bnNpZ25lZCBPcGMgPSAwOworCisgIFNEVmFsdWUgT3AwID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBPcDEgPSBPcC5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIENDID0gT3AuZ2V0T3BlcmFuZCgyKTsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIElTRDo6Q29uZENvZGUgU2V0Q0NPcGNvZGUgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihDQyktPmdldCgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgaWYgKE9wLmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCkpIHsKKyAgICBzd2l0Y2ggKFNldENDT3Bjb2RlKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSWxsZWdhbCBGUCBjb21wYXJpc29uIik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRVTkU6CisgICAgY2FzZSBJU0Q6OlNFVE5FOiAgSW52ZXJ0ID0gdHJ1ZTsgLy8gRmFsbHRocm91Z2gKKyAgICBjYXNlIElTRDo6U0VUT0VROgorICAgIGNhc2UgSVNEOjpTRVRFUTogIE9wYyA9IEFSTUlTRDo6VkNFUTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVE9MVDoKKyAgICBjYXNlIElTRDo6U0VUTFQ6IFN3YXAgPSB0cnVlOyAvLyBGYWxsdGhyb3VnaAorICAgIGNhc2UgSVNEOjpTRVRPR1Q6CisgICAgY2FzZSBJU0Q6OlNFVEdUOiAgT3BjID0gQVJNSVNEOjpWQ0dUOyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUT0xFOgorICAgIGNhc2UgSVNEOjpTRVRMRTogIFN3YXAgPSB0cnVlOyAvLyBGYWxsdGhyb3VnaAorICAgIGNhc2UgSVNEOjpTRVRPR0U6CisgICAgY2FzZSBJU0Q6OlNFVEdFOiBPcGMgPSBBUk1JU0Q6OlZDR0U7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRVR0U6IFN3YXAgPSB0cnVlOyAvLyBGYWxsdGhyb3VnaAorICAgIGNhc2UgSVNEOjpTRVRVTEU6IEludmVydCA9IHRydWU7IE9wYyA9IEFSTUlTRDo6VkNHVDsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVHVDogU3dhcCA9IHRydWU7IC8vIEZhbGx0aHJvdWdoCisgICAgY2FzZSBJU0Q6OlNFVFVMVDogSW52ZXJ0ID0gdHJ1ZTsgT3BjID0gQVJNSVNEOjpWQ0dFOyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUVUVROiBJbnZlcnQgPSB0cnVlOyAvLyBGYWxsdGhyb3VnaAorICAgIGNhc2UgSVNEOjpTRVRPTkU6CisgICAgICAvLyBFeHBhbmQgdGhpcyB0byAoT0xUIHwgT0dUKS4KKyAgICAgIFRtcE9wMCA9IE9wMDsKKyAgICAgIFRtcE9wMSA9IE9wMTsKKyAgICAgIE9wYyA9IElTRDo6T1I7CisgICAgICBPcDAgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZDR1QsIGRsLCBWVCwgVG1wT3AxLCBUbXBPcDApOworICAgICAgT3AxID0gREFHLmdldE5vZGUoQVJNSVNEOjpWQ0dULCBkbCwgVlQsIFRtcE9wMCwgVG1wT3AxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRVTzogSW52ZXJ0ID0gdHJ1ZTsgLy8gRmFsbHRocm91Z2gKKyAgICBjYXNlIElTRDo6U0VUTzoKKyAgICAgIC8vIEV4cGFuZCB0aGlzIHRvIChPTFQgfCBPR0UpLgorICAgICAgVG1wT3AwID0gT3AwOworICAgICAgVG1wT3AxID0gT3AxOworICAgICAgT3BjID0gSVNEOjpPUjsKKyAgICAgIE9wMCA9IERBRy5nZXROb2RlKEFSTUlTRDo6VkNHVCwgZGwsIFZULCBUbXBPcDEsIFRtcE9wMCk7CisgICAgICBPcDEgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZDR0UsIGRsLCBWVCwgVG1wT3AwLCBUbXBPcDEpOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIEludGVnZXIgY29tcGFyaXNvbnMuCisgICAgc3dpdGNoIChTZXRDQ09wY29kZSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgaW50ZWdlciBjb21wYXJpc29uIik7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRORTogIEludmVydCA9IHRydWU7CisgICAgY2FzZSBJU0Q6OlNFVEVROiAgT3BjID0gQVJNSVNEOjpWQ0VROyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUTFQ6ICBTd2FwID0gdHJ1ZTsKKyAgICBjYXNlIElTRDo6U0VUR1Q6ICBPcGMgPSBBUk1JU0Q6OlZDR1Q7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRMRTogIFN3YXAgPSB0cnVlOworICAgIGNhc2UgSVNEOjpTRVRHRTogIE9wYyA9IEFSTUlTRDo6VkNHRTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVMVDogU3dhcCA9IHRydWU7CisgICAgY2FzZSBJU0Q6OlNFVFVHVDogT3BjID0gQVJNSVNEOjpWQ0dUVTsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVFVMRTogU3dhcCA9IHRydWU7CisgICAgY2FzZSBJU0Q6OlNFVFVHRTogT3BjID0gQVJNSVNEOjpWQ0dFVTsgYnJlYWs7CisgICAgfQorCisgICAgLy8gRGV0ZWN0IFZUU1QgKFZlY3RvciBUZXN0IEJpdHMpID0gaWNtcCBuZSAoYW5kIChvcDAsIG9wMSksIHplcm8pLgorICAgIGlmIChPcGMgPT0gQVJNSVNEOjpWQ0VRKSB7CisKKyAgICAgIFNEVmFsdWUgQW5kT3A7CisgICAgICBpZiAoSVNEOjppc0J1aWxkVmVjdG9yQWxsWmVyb3MoT3AxLmdldE5vZGUoKSkpCisgICAgICAgIEFuZE9wID0gT3AwOworICAgICAgZWxzZSBpZiAoSVNEOjppc0J1aWxkVmVjdG9yQWxsWmVyb3MoT3AwLmdldE5vZGUoKSkpCisgICAgICAgIEFuZE9wID0gT3AxOworCisgICAgICAvLyBJZ25vcmUgYml0Y29udmVydC4KKyAgICAgIGlmIChBbmRPcC5nZXROb2RlKCkgJiYgQW5kT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCSVRfQ09OVkVSVCkKKyAgICAgICAgQW5kT3AgPSBBbmRPcC5nZXRPcGVyYW5kKDApOworCisgICAgICBpZiAoQW5kT3AuZ2V0Tm9kZSgpICYmIEFuZE9wLmdldE9wY29kZSgpID09IElTRDo6QU5EKSB7CisgICAgICAgIE9wYyA9IEFSTUlTRDo6VlRTVDsKKyAgICAgICAgT3AwID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULCBBbmRPcC5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgT3AxID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULCBBbmRPcC5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgSW52ZXJ0ID0gIUludmVydDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoU3dhcCkKKyAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOworCisgIFNEVmFsdWUgUmVzdWx0ID0gREFHLmdldE5vZGUoT3BjLCBkbCwgVlQsIE9wMCwgT3AxKTsKKworICBpZiAoSW52ZXJ0KQorICAgIFJlc3VsdCA9IERBRy5nZXROT1QoZGwsIFJlc3VsdCwgVlQpOworCisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBpc05FT05Nb2RpZmllZEltbSAtIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgc3BsYXQgdmFsdWUgY29ycmVzcG9uZHMgdG8gYQorLy8vIHZhbGlkIHZlY3RvciBjb25zdGFudCBmb3IgYSBORU9OIGluc3RydWN0aW9uIHdpdGggYSAibW9kaWZpZWQgaW1tZWRpYXRlIgorLy8vIG9wZXJhbmQgKGUuZy4sIFZNT1YpLiAgSWYgc28sIHJldHVybiB0aGUgZW5jb2RlZCB2YWx1ZS4KK3N0YXRpYyBTRFZhbHVlIGlzTkVPTk1vZGlmaWVkSW1tKHVpbnQ2NF90IFNwbGF0Qml0cywgdWludDY0X3QgU3BsYXRVbmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNwbGF0Qml0U2l6ZSwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgJlZULCBib29sIGlzMTI4Qml0cywgYm9vbCBpc1ZNT1YpIHsKKyAgdW5zaWduZWQgT3BDbW9kZSwgSW1tOworCisgIC8vIFNwbGF0Qml0U2l6ZSBpcyBzZXQgdG8gdGhlIHNtYWxsZXN0IHNpemUgdGhhdCBzcGxhdHMgdGhlIHZlY3Rvciwgc28gYQorICAvLyB6ZXJvIHZlY3RvciB3aWxsIGFsd2F5cyBoYXZlIFNwbGF0Qml0U2l6ZSA9PSA4LiAgSG93ZXZlciwgTkVPTiBtb2RpZmllZAorICAvLyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zIG90aGVycyB0aGFuIFZNT1YgZG8gbm90IHN1cHBvcnQgdGhlIDgtYml0IGVuY29kaW5nCisgIC8vIG9mIGEgemVybyB2ZWN0b3IsIGFuZCB0aGUgZGVmYXVsdCBlbmNvZGluZyBvZiB6ZXJvIGlzIHN1cHBvc2VkIHRvIGJlIHRoZQorICAvLyAzMi1iaXQgdmVyc2lvbi4KKyAgaWYgKFNwbGF0Qml0cyA9PSAwKQorICAgIFNwbGF0Qml0U2l6ZSA9IDMyOworCisgIHN3aXRjaCAoU3BsYXRCaXRTaXplKSB7CisgIGNhc2UgODoKKyAgICBpZiAoIWlzVk1PVikKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgLy8gQW55IDEtYnl0ZSB2YWx1ZSBpcyBPSy4gIE9wPTAsIENtb2RlPTExMTAuCisgICAgYXNzZXJ0KChTcGxhdEJpdHMgJiB+MHhmZikgPT0gMCAmJiAib25lIGJ5dGUgc3BsYXQgdmFsdWUgaXMgdG9vIGJpZyIpOworICAgIE9wQ21vZGUgPSAweGU7CisgICAgSW1tID0gU3BsYXRCaXRzOworICAgIFZUID0gaXMxMjhCaXRzID8gTVZUOjp2MTZpOCA6IE1WVDo6djhpODsKKyAgICBicmVhazsKKworICBjYXNlIDE2OgorICAgIC8vIE5FT04ncyAxNi1iaXQgVk1PViBzdXBwb3J0cyBzcGxhdCB2YWx1ZXMgd2hlcmUgb25seSBvbmUgYnl0ZSBpcyBub256ZXJvLgorICAgIFZUID0gaXMxMjhCaXRzID8gTVZUOjp2OGkxNiA6IE1WVDo6djRpMTY7CisgICAgaWYgKChTcGxhdEJpdHMgJiB+MHhmZikgPT0gMCkgeworICAgICAgLy8gVmFsdWUgPSAweDAwbm46IE9wPXgsIENtb2RlPTEwMHguCisgICAgICBPcENtb2RlID0gMHg4OworICAgICAgSW1tID0gU3BsYXRCaXRzOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgoU3BsYXRCaXRzICYgfjB4ZmYwMCkgPT0gMCkgeworICAgICAgLy8gVmFsdWUgPSAweG5uMDA6IE9wPXgsIENtb2RlPTEwMXguCisgICAgICBPcENtb2RlID0gMHhhOworICAgICAgSW1tID0gU3BsYXRCaXRzID4+IDg7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBjYXNlIDMyOgorICAgIC8vIE5FT04ncyAzMi1iaXQgVk1PViBzdXBwb3J0cyBzcGxhdCB2YWx1ZXMgd2hlcmU6CisgICAgLy8gKiBvbmx5IG9uZSBieXRlIGlzIG5vbnplcm8sIG9yCisgICAgLy8gKiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyAweGZmIGFuZCB0aGUgc2Vjb25kIGJ5dGUgaXMgbm9uemVybywgb3IKKyAgICAvLyAqIHRoZSBsZWFzdCBzaWduaWZpY2FudCAyIGJ5dGVzIGFyZSAweGZmIGFuZCB0aGUgdGhpcmQgaXMgbm9uemVyby4KKyAgICBWVCA9IGlzMTI4Qml0cyA/IE1WVDo6djRpMzIgOiBNVlQ6OnYyaTMyOworICAgIGlmICgoU3BsYXRCaXRzICYgfjB4ZmYpID09IDApIHsKKyAgICAgIC8vIFZhbHVlID0gMHgwMDAwMDBubjogT3A9eCwgQ21vZGU9MDAweC4KKyAgICAgIE9wQ21vZGUgPSAwOworICAgICAgSW1tID0gU3BsYXRCaXRzOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgoU3BsYXRCaXRzICYgfjB4ZmYwMCkgPT0gMCkgeworICAgICAgLy8gVmFsdWUgPSAweDAwMDBubjAwOiBPcD14LCBDbW9kZT0wMDF4LgorICAgICAgT3BDbW9kZSA9IDB4MjsKKyAgICAgIEltbSA9IFNwbGF0Qml0cyA+PiA4OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgoU3BsYXRCaXRzICYgfjB4ZmYwMDAwKSA9PSAwKSB7CisgICAgICAvLyBWYWx1ZSA9IDB4MDBubjAwMDA6IE9wPXgsIENtb2RlPTAxMHguCisgICAgICBPcENtb2RlID0gMHg0OworICAgICAgSW1tID0gU3BsYXRCaXRzID4+IDE2OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgoU3BsYXRCaXRzICYgfjB4ZmYwMDAwMDApID09IDApIHsKKyAgICAgIC8vIFZhbHVlID0gMHhubjAwMDAwMDogT3A9eCwgQ21vZGU9MDExeC4KKyAgICAgIE9wQ21vZGUgPSAweDY7CisgICAgICBJbW0gPSBTcGxhdEJpdHMgPj4gMjQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKFNwbGF0Qml0cyAmIH4weGZmZmYpID09IDAgJiYKKyAgICAgICAgKChTcGxhdEJpdHMgfCBTcGxhdFVuZGVmKSAmIDB4ZmYpID09IDB4ZmYpIHsKKyAgICAgIC8vIFZhbHVlID0gMHgwMDAwbm5mZjogT3A9eCwgQ21vZGU9MTEwMC4KKyAgICAgIE9wQ21vZGUgPSAweGM7CisgICAgICBJbW0gPSBTcGxhdEJpdHMgPj4gODsKKyAgICAgIFNwbGF0Qml0cyB8PSAweGZmOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKChTcGxhdEJpdHMgJiB+MHhmZmZmZmYpID09IDAgJiYKKyAgICAgICAgKChTcGxhdEJpdHMgfCBTcGxhdFVuZGVmKSAmIDB4ZmZmZikgPT0gMHhmZmZmKSB7CisgICAgICAvLyBWYWx1ZSA9IDB4MDBubmZmZmY6IE9wPXgsIENtb2RlPTExMDEuCisgICAgICBPcENtb2RlID0gMHhkOworICAgICAgSW1tID0gU3BsYXRCaXRzID4+IDE2OworICAgICAgU3BsYXRCaXRzIHw9IDB4ZmZmZjsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIE5vdGU6IHRoZXJlIGFyZSBhIGZldyAzMi1iaXQgc3BsYXQgdmFsdWVzIChzcGVjaWZpY2FsbHk6IDAwZmZmZjAwLAorICAgIC8vIGZmMDAwMDAwLCBmZjAwMDBmZiwgYW5kIGZmZmYwMGZmKSB0aGF0IGFyZSB2YWxpZCBmb3IgVk1PVi5JNjQgYnV0IG5vdAorICAgIC8vIFZNT1YuSTMyLiAgQSAodmVyeSkgbWlub3Igb3B0aW1pemF0aW9uIHdvdWxkIGJlIHRvIHJlcGxpY2F0ZSB0aGUgdmFsdWUKKyAgICAvLyBhbmQgZmFsbCB0aHJvdWdoIGhlcmUgdG8gdGVzdCBmb3IgYSB2YWxpZCA2NC1iaXQgc3BsYXQuICBCdXQsIHRoZW4gdGhlCisgICAgLy8gY2FsbGVyIHdvdWxkIGFsc28gbmVlZCB0byBjaGVjayBhbmQgaGFuZGxlIHRoZSBjaGFuZ2UgaW4gc2l6ZS4KKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIGNhc2UgNjQ6IHsKKyAgICBpZiAoIWlzVk1PVikKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgLy8gTkVPTiBoYXMgYSA2NC1iaXQgVk1PViBzcGxhdCB3aGVyZSBlYWNoIGJ5dGUgaXMgZWl0aGVyIDAgb3IgMHhmZi4KKyAgICB1aW50NjRfdCBCaXRNYXNrID0gMHhmZjsKKyAgICB1aW50NjRfdCBWYWwgPSAwOworICAgIHVuc2lnbmVkIEltbU1hc2sgPSAxOworICAgIEltbSA9IDA7CisgICAgZm9yIChpbnQgQnl0ZU51bSA9IDA7IEJ5dGVOdW0gPCA4OyArK0J5dGVOdW0pIHsKKyAgICAgIGlmICgoKFNwbGF0Qml0cyB8IFNwbGF0VW5kZWYpICYgQml0TWFzaykgPT0gQml0TWFzaykgeworICAgICAgICBWYWwgfD0gQml0TWFzazsKKyAgICAgICAgSW1tIHw9IEltbU1hc2s7CisgICAgICB9IGVsc2UgaWYgKChTcGxhdEJpdHMgJiBCaXRNYXNrKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgICB9CisgICAgICBCaXRNYXNrIDw8PSA4OworICAgICAgSW1tTWFzayA8PD0gMTsKKyAgICB9CisgICAgLy8gT3A9MSwgQ21vZGU9MTExMC4KKyAgICBPcENtb2RlID0gMHgxZTsKKyAgICBTcGxhdEJpdHMgPSBWYWw7CisgICAgVlQgPSBpczEyOEJpdHMgPyBNVlQ6OnYyaTY0IDogTVZUOjp2MWk2NDsKKyAgICBicmVhazsKKyAgfQorCisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgidW5leHBlY3RlZCBzaXplIGZvciBpc05FT05Nb2RpZmllZEltbSIpOworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICB1bnNpZ25lZCBFbmNvZGVkVmFsID0gQVJNX0FNOjpjcmVhdGVORU9OTW9kSW1tKE9wQ21vZGUsIEltbSk7CisgIHJldHVybiBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoRW5jb2RlZFZhbCwgTVZUOjppMzIpOworfQorCitzdGF0aWMgYm9vbCBpc1ZFWFRNYXNrKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZNLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJlJldmVyc2VWRVhULCB1bnNpZ25lZCAmSW1tKSB7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBSZXZlcnNlVkVYVCA9IGZhbHNlOworICBJbW0gPSBNWzBdOworCisgIC8vIElmIHRoaXMgaXMgYSBWRVhUIHNodWZmbGUsIHRoZSBpbW1lZGlhdGUgdmFsdWUgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdAorICAvLyBlbGVtZW50LiAgVGhlIG90aGVyIHNodWZmbGUgaW5kaWNlcyBtdXN0IGJlIHRoZSBzdWNjZXNzaXZlIGVsZW1lbnRzIGFmdGVyCisgIC8vIHRoZSBmaXJzdCBvbmUuCisgIHVuc2lnbmVkIEV4cGVjdGVkRWx0ID0gSW1tOworICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgTnVtRWx0czsgKytpKSB7CisgICAgLy8gSW5jcmVtZW50IHRoZSBleHBlY3RlZCBpbmRleC4gIElmIGl0IHdyYXBzIGFyb3VuZCwgaXQgbWF5IHN0aWxsIGJlCisgICAgLy8gYSBWRVhUIGJ1dCB0aGUgc291cmNlIHZlY3RvcnMgbXVzdCBiZSBzd2FwcGVkLgorICAgIEV4cGVjdGVkRWx0ICs9IDE7CisgICAgaWYgKEV4cGVjdGVkRWx0ID09IE51bUVsdHMgKiAyKSB7CisgICAgICBFeHBlY3RlZEVsdCA9IDA7CisgICAgICBSZXZlcnNlVkVYVCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKEV4cGVjdGVkRWx0ICE9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihNW2ldKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEFkanVzdCB0aGUgaW5kZXggdmFsdWUgaWYgdGhlIHNvdXJjZSBvcGVyYW5kcyB3aWxsIGJlIHN3YXBwZWQuCisgIGlmIChSZXZlcnNlVkVYVCkKKyAgICBJbW0gLT0gTnVtRWx0czsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzVlJFVk1hc2sgLSBDaGVjayBpZiBhIHZlY3RvciBzaHVmZmxlIGNvcnJlc3BvbmRzIHRvIGEgVlJFVgorLy8vIGluc3RydWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBibG9ja3NpemUuICAoVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cworLy8vIHdpdGhpbiBlYWNoIGJsb2NrIG9mIHRoZSB2ZWN0b3IgaXMgcmV2ZXJzZWQuKQorc3RhdGljIGJvb2wgaXNWUkVWTWFzayhjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCbG9ja1NpemUpIHsKKyAgYXNzZXJ0KChCbG9ja1NpemU9PTE2IHx8IEJsb2NrU2l6ZT09MzIgfHwgQmxvY2tTaXplPT02NCkgJiYKKyAgICAgICAgICJPbmx5IHBvc3NpYmxlIGJsb2NrIHNpemVzIGZvciBWUkVWIGFyZTogMTYsIDMyLCA2NCIpOworCisgIHVuc2lnbmVkIEVsdFN6ID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIGlmIChFbHRTeiA9PSA2NCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgTnVtRWx0cyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIHVuc2lnbmVkIEJsb2NrRWx0cyA9IE1bMF0gKyAxOworCisgIGlmIChCbG9ja1NpemUgPD0gRWx0U3ogfHwgQmxvY2tTaXplICE9IEJsb2NrRWx0cyAqIEVsdFN6KQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtRWx0czsgKytpKSB7CisgICAgaWYgKCh1bnNpZ25lZCkgTVtpXSAhPQorICAgICAgICAoaSAtIGklQmxvY2tFbHRzKSArIChCbG9ja0VsdHMgLSAxIC0gaSVCbG9ja0VsdHMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGlzVlRSTk1hc2soY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJk0sIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJldoaWNoUmVzdWx0KSB7CisgIHVuc2lnbmVkIEVsdFN6ID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIGlmIChFbHRTeiA9PSA2NCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgTnVtRWx0cyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIFdoaWNoUmVzdWx0ID0gKE1bMF0gPT0gMCA/IDAgOiAxKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUVsdHM7IGkgKz0gMikgeworICAgIGlmICgodW5zaWduZWQpIE1baV0gIT0gaSArIFdoaWNoUmVzdWx0IHx8CisgICAgICAgICh1bnNpZ25lZCkgTVtpKzFdICE9IGkgKyBOdW1FbHRzICsgV2hpY2hSZXN1bHQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1ZUUk5fdl91bmRlZl9NYXNrIC0gU3BlY2lhbCBjYXNlIG9mIGlzVlRSTk1hc2sgZm9yIGNhbm9uaWNhbCBmb3JtIG9mCisvLy8gInZlY3Rvcl9zaHVmZmxlIHYsIHYiLCBpLmUuLCAidmVjdG9yX3NodWZmbGUgdiwgdW5kZWYiLgorLy8vIE1hc2sgaXMgZS5nLiwgPDAsIDAsIDIsIDI+IGluc3RlYWQgb2YgPDAsIDQsIDIsIDY+Lgorc3RhdGljIGJvb2wgaXNWVFJOX3ZfdW5kZWZfTWFzayhjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmV2hpY2hSZXN1bHQpIHsKKyAgdW5zaWduZWQgRWx0U3ogPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgaWYgKEVsdFN6ID09IDY0KQorICAgIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCBOdW1FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgV2hpY2hSZXN1bHQgPSAoTVswXSA9PSAwID8gMCA6IDEpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtRWx0czsgaSArPSAyKSB7CisgICAgaWYgKCh1bnNpZ25lZCkgTVtpXSAhPSBpICsgV2hpY2hSZXN1bHQgfHwKKyAgICAgICAgKHVuc2lnbmVkKSBNW2krMV0gIT0gaSArIFdoaWNoUmVzdWx0KQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBpc1ZVWlBNYXNrKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZNLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZXaGljaFJlc3VsdCkgeworICB1bnNpZ25lZCBFbHRTeiA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICBpZiAoRWx0U3ogPT0gNjQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBXaGljaFJlc3VsdCA9IChNWzBdID09IDAgPyAwIDogMSk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWx0czsgKytpKSB7CisgICAgaWYgKCh1bnNpZ25lZCkgTVtpXSAhPSAyICogaSArIFdoaWNoUmVzdWx0KQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVlVaUC4zMiBmb3IgNjQtYml0IHZlY3RvcnMgaXMgYSBwc2V1ZG8taW5zdHJ1Y3Rpb24gYWxpYXMgZm9yIFZUUk4uMzIuCisgIGlmIChWVC5pczY0Qml0VmVjdG9yKCkgJiYgRWx0U3ogPT0gMzIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gaXNWVVpQX3ZfdW5kZWZfTWFzayAtIFNwZWNpYWwgY2FzZSBvZiBpc1ZVWlBNYXNrIGZvciBjYW5vbmljYWwgZm9ybSBvZgorLy8vICJ2ZWN0b3Jfc2h1ZmZsZSB2LCB2IiwgaS5lLiwgInZlY3Rvcl9zaHVmZmxlIHYsIHVuZGVmIi4KKy8vLyBNYXNrIGlzIGUuZy4sIDwwLCAyLCAwLCAyPiBpbnN0ZWFkIG9mIDwwLCAyLCA0LCA2PiwKK3N0YXRpYyBib29sIGlzVlVaUF92X3VuZGVmX01hc2soY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJk0sIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJldoaWNoUmVzdWx0KSB7CisgIHVuc2lnbmVkIEVsdFN6ID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIGlmIChFbHRTeiA9PSA2NCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgSGFsZiA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgLyAyOworICBXaGljaFJlc3VsdCA9IChNWzBdID09IDAgPyAwIDogMSk7CisgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gMjsgKytqKSB7CisgICAgdW5zaWduZWQgSWR4ID0gV2hpY2hSZXN1bHQ7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBIYWxmOyArK2kpIHsKKyAgICAgIGlmICgodW5zaWduZWQpIE1baSArIGogKiBIYWxmXSAhPSBJZHgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIElkeCArPSAyOworICAgIH0KKyAgfQorCisgIC8vIFZVWlAuMzIgZm9yIDY0LWJpdCB2ZWN0b3JzIGlzIGEgcHNldWRvLWluc3RydWN0aW9uIGFsaWFzIGZvciBWVFJOLjMyLgorICBpZiAoVlQuaXM2NEJpdFZlY3RvcigpICYmIEVsdFN6ID09IDMyKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgaXNWWklQTWFzayhjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmV2hpY2hSZXN1bHQpIHsKKyAgdW5zaWduZWQgRWx0U3ogPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgaWYgKEVsdFN6ID09IDY0KQorICAgIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCBOdW1FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgV2hpY2hSZXN1bHQgPSAoTVswXSA9PSAwID8gMCA6IDEpOworICB1bnNpZ25lZCBJZHggPSBXaGljaFJlc3VsdCAqIE51bUVsdHMgLyAyOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUVsdHM7IGkgKz0gMikgeworICAgIGlmICgodW5zaWduZWQpIE1baV0gIT0gSWR4IHx8CisgICAgICAgICh1bnNpZ25lZCkgTVtpKzFdICE9IElkeCArIE51bUVsdHMpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgSWR4ICs9IDE7CisgIH0KKworICAvLyBWWklQLjMyIGZvciA2NC1iaXQgdmVjdG9ycyBpcyBhIHBzZXVkby1pbnN0cnVjdGlvbiBhbGlhcyBmb3IgVlRSTi4zMi4KKyAgaWYgKFZULmlzNjRCaXRWZWN0b3IoKSAmJiBFbHRTeiA9PSAzMikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1ZaSVBfdl91bmRlZl9NYXNrIC0gU3BlY2lhbCBjYXNlIG9mIGlzVlpJUE1hc2sgZm9yIGNhbm9uaWNhbCBmb3JtIG9mCisvLy8gInZlY3Rvcl9zaHVmZmxlIHYsIHYiLCBpLmUuLCAidmVjdG9yX3NodWZmbGUgdiwgdW5kZWYiLgorLy8vIE1hc2sgaXMgZS5nLiwgPDAsIDAsIDEsIDE+IGluc3RlYWQgb2YgPDAsIDQsIDEsIDU+Lgorc3RhdGljIGJvb2wgaXNWWklQX3ZfdW5kZWZfTWFzayhjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmV2hpY2hSZXN1bHQpIHsKKyAgdW5zaWduZWQgRWx0U3ogPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgaWYgKEVsdFN6ID09IDY0KQorICAgIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCBOdW1FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgV2hpY2hSZXN1bHQgPSAoTVswXSA9PSAwID8gMCA6IDEpOworICB1bnNpZ25lZCBJZHggPSBXaGljaFJlc3VsdCAqIE51bUVsdHMgLyAyOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUVsdHM7IGkgKz0gMikgeworICAgIGlmICgodW5zaWduZWQpIE1baV0gIT0gSWR4IHx8CisgICAgICAgICh1bnNpZ25lZCkgTVtpKzFdICE9IElkeCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBJZHggKz0gMTsKKyAgfQorCisgIC8vIFZaSVAuMzIgZm9yIDY0LWJpdCB2ZWN0b3JzIGlzIGEgcHNldWRvLWluc3RydWN0aW9uIGFsaWFzIGZvciBWVFJOLjMyLgorICBpZiAoVlQuaXM2NEJpdFZlY3RvcigpICYmIEVsdFN6ID09IDMyKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gSWYgTiBpcyBhbiBpbnRlZ2VyIGNvbnN0YW50IHRoYXQgY2FuIGJlIG1vdmVkIGludG8gYSByZWdpc3RlciBpbiBvbmUKKy8vIGluc3RydWN0aW9uLCByZXR1cm4gYW4gU0RWYWx1ZSBvZiBzdWNoIGEgY29uc3RhbnQgKHdpbGwgYmVjb21lIGEgTU9WCisvLyBpbnN0cnVjdGlvbikuICBPdGhlcndpc2UgcmV0dXJuIG51bGwuCitzdGF0aWMgU0RWYWx1ZSBJc1NpbmdsZUluc3RyQ29uc3RhbnQoU0RWYWx1ZSBOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgKlNULCBEZWJ1Z0xvYyBkbCkgeworICB1aW50NjRfdCBWYWw7CisgIGlmICghaXNhPENvbnN0YW50U0ROb2RlPihOKSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICBWYWwgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOKS0+Z2V0WkV4dFZhbHVlKCk7CisKKyAgaWYgKFNULT5pc1RodW1iMU9ubHkoKSkgeworICAgIGlmIChWYWwgPD0gMjU1IHx8IH5WYWwgPD0gMjU1KQorICAgICAgcmV0dXJuIERBRy5nZXRDb25zdGFudChWYWwsIE1WVDo6aTMyKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoQVJNX0FNOjpnZXRTT0ltbVZhbChWYWwpICE9IC0xIHx8IEFSTV9BTTo6Z2V0U09JbW1WYWwoflZhbCkgIT0gLTEpCisgICAgICByZXR1cm4gREFHLmdldENvbnN0YW50KFZhbCwgTVZUOjppMzIpOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vIElmIHRoaXMgaXMgYSBjYXNlIHdlIGNhbid0IGhhbmRsZSwgcmV0dXJuIG51bGwgYW5kIGxldCB0aGUgZGVmYXVsdAorLy8gZXhwYW5zaW9uIGNvZGUgdGFrZSBjYXJlIG9mIGl0Lgorc3RhdGljIFNEVmFsdWUgTG93ZXJCVUlMRF9WRUNUT1IoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVJNU3VidGFyZ2V0ICpTVCkgeworICBCdWlsZFZlY3RvclNETm9kZSAqQlZOID0gY2FzdDxCdWlsZFZlY3RvclNETm9kZT4oT3AuZ2V0Tm9kZSgpKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKworICBBUEludCBTcGxhdEJpdHMsIFNwbGF0VW5kZWY7CisgIHVuc2lnbmVkIFNwbGF0Qml0U2l6ZTsKKyAgYm9vbCBIYXNBbnlVbmRlZnM7CisgIGlmIChCVk4tPmlzQ29uc3RhbnRTcGxhdChTcGxhdEJpdHMsIFNwbGF0VW5kZWYsIFNwbGF0Qml0U2l6ZSwgSGFzQW55VW5kZWZzKSkgeworICAgIGlmIChTcGxhdEJpdFNpemUgPD0gNjQpIHsKKyAgICAgIC8vIENoZWNrIGlmIGFuIGltbWVkaWF0ZSBWTU9WIHdvcmtzLgorICAgICAgRVZUIFZtb3ZWVDsKKyAgICAgIFNEVmFsdWUgVmFsID0gaXNORU9OTW9kaWZpZWRJbW0oU3BsYXRCaXRzLmdldFpFeHRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhdFVuZGVmLmdldFpFeHRWYWx1ZSgpLCBTcGxhdEJpdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRywgVm1vdlZULCBWVC5pczEyOEJpdFZlY3RvcigpLCB0cnVlKTsKKyAgICAgIGlmIChWYWwuZ2V0Tm9kZSgpKSB7CisgICAgICAgIFNEVmFsdWUgVm1vdiA9IERBRy5nZXROb2RlKEFSTUlTRDo6Vk1PVklNTSwgZGwsIFZtb3ZWVCwgVmFsKTsKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWVCwgVm1vdik7CisgICAgICB9CisKKyAgICAgIC8vIFRyeSBhbiBpbW1lZGlhdGUgVk1WTi4KKyAgICAgIHVpbnQ2NF90IE5lZ2F0ZWRJbW0gPSAoU3BsYXRCaXRzLmdldFpFeHRWYWx1ZSgpIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgxTEwgPDwgU3BsYXRCaXRTaXplKSAtIDEpKTsKKyAgICAgIFZhbCA9IGlzTkVPTk1vZGlmaWVkSW1tKE5lZ2F0ZWRJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGF0VW5kZWYuZ2V0WkV4dFZhbHVlKCksIFNwbGF0Qml0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLCBWbW92VlQsIFZULmlzMTI4Qml0VmVjdG9yKCksIGZhbHNlKTsKKyAgICAgIGlmIChWYWwuZ2V0Tm9kZSgpKSB7CisgICAgICAgIFNEVmFsdWUgVm1vdiA9IERBRy5nZXROb2RlKEFSTUlTRDo6Vk1WTklNTSwgZGwsIFZtb3ZWVCwgVmFsKTsKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWVCwgVm1vdik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gU2NhbiB0aHJvdWdoIHRoZSBvcGVyYW5kcyB0byBzZWUgaWYgb25seSBvbmUgdmFsdWUgaXMgdXNlZC4KKyAgdW5zaWduZWQgTnVtRWx0cyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIGJvb2wgaXNPbmx5TG93RWxlbWVudCA9IHRydWU7CisgIGJvb2wgdXNlc09ubHlPbmVWYWx1ZSA9IHRydWU7CisgIGJvb2wgaXNDb25zdGFudCA9IHRydWU7CisgIFNEVmFsdWUgVmFsdWU7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1FbHRzOyArK2kpIHsKKyAgICBTRFZhbHVlIFYgPSBPcC5nZXRPcGVyYW5kKGkpOworICAgIGlmIChWLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoaSA+IDApCisgICAgICBpc09ubHlMb3dFbGVtZW50ID0gZmFsc2U7CisgICAgaWYgKCFpc2E8Q29uc3RhbnRGUFNETm9kZT4oVikgJiYgIWlzYTxDb25zdGFudFNETm9kZT4oVikpCisgICAgICBpc0NvbnN0YW50ID0gZmFsc2U7CisKKyAgICBpZiAoIVZhbHVlLmdldE5vZGUoKSkKKyAgICAgIFZhbHVlID0gVjsKKyAgICBlbHNlIGlmIChWICE9IFZhbHVlKQorICAgICAgdXNlc09ubHlPbmVWYWx1ZSA9IGZhbHNlOworICB9CisKKyAgaWYgKCFWYWx1ZS5nZXROb2RlKCkpCisgICAgcmV0dXJuIERBRy5nZXRVTkRFRihWVCk7CisKKyAgaWYgKGlzT25seUxvd0VsZW1lbnQpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIFZULCBWYWx1ZSk7CisKKyAgdW5zaWduZWQgRWx0U2l6ZSA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworCisgIGlmIChFbmFibGVBUk1WRFVQc3BsYXQpIHsKKyAgICAvLyBVc2UgVkRVUCBmb3Igbm9uLWNvbnN0YW50IHNwbGF0cy4gIEZvciBmMzIgY29uc3RhbnQgc3BsYXRzLCByZWR1Y2UgdG8KKyAgICAvLyBpMzIgYW5kIHRyeSBhZ2Fpbi4KKyAgICBpZiAodXNlc09ubHlPbmVWYWx1ZSAmJiBFbHRTaXplIDw9IDMyKSB7CisgICAgICBpZiAoIWlzQ29uc3RhbnQpCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZEVVAsIGRsLCBWVCwgVmFsdWUpOworICAgICAgaWYgKFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCkpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtRWx0czsgKytpKQorICAgICAgICAgIE9wcy5wdXNoX2JhY2soREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6aTMyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoaSkpKTsKKyAgICAgICAgU0RWYWx1ZSBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djRpMzIsICZPcHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtRWx0cyk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTG93ZXJCVUlMRF9WRUNUT1IoVmFsLCBEQUcsIFNUKSk7CisgICAgICB9CisgICAgICBTRFZhbHVlIFZhbCA9IElzU2luZ2xlSW5zdHJDb25zdGFudChWYWx1ZSwgREFHLCBTVCwgZGwpOworICAgICAgaWYgKFZhbC5nZXROb2RlKCkpCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZEVVAsIGRsLCBWVCwgVmFsKTsKKyAgICB9CisgIH0KKworICAvLyBJZiBhbGwgZWxlbWVudHMgYXJlIGNvbnN0YW50cyBhbmQgdGhlIGNhc2UgYWJvdmUgZGlkbid0IGdldCBoaXQsIGZhbGwgYmFjaworICAvLyB0byB0aGUgZGVmYXVsdCBleHBhbnNpb24sIHdoaWNoIHdpbGwgZ2VuZXJhdGUgYSBsb2FkIGZyb20gdGhlIGNvbnN0YW50CisgIC8vIHBvb2wuCisgIGlmIChpc0NvbnN0YW50KQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgaWYgKCFFbmFibGVBUk1WRFVQc3BsYXQpIHsKKyAgICAvLyBVc2UgVkRVUCBmb3Igbm9uLWNvbnN0YW50IHNwbGF0cy4KKyAgICBpZiAodXNlc09ubHlPbmVWYWx1ZSAmJiBFbHRTaXplIDw9IDMyKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6VkRVUCwgZGwsIFZULCBWYWx1ZSk7CisgIH0KKworICAvLyBWZWN0b3JzIHdpdGggMzItIG9yIDY0LWJpdCBlbGVtZW50cyBjYW4gYmUgYnVpbHQgYnkgZGlyZWN0bHkgYXNzaWduaW5nCisgIC8vIHRoZSBzdWJyZWdpc3RlcnMuICBMb3dlciBpdCB0byBhbiBBUk1JU0Q6OkJVSUxEX1ZFQ1RPUiBzbyB0aGUgb3BlcmFuZHMKKyAgLy8gd2lsbCBiZSBsZWdhbGl6ZWQuCisgIGlmIChFbHRTaXplID49IDMyKSB7CisgICAgLy8gRG8gdGhlIGV4cGFuc2lvbiB3aXRoIGZsb2F0aW5nLXBvaW50IHR5cGVzLCBzaW5jZSB0aGF0IGlzIHdoYXQgdGhlIFZGUAorICAgIC8vIHJlZ2lzdGVycyBhcmUgZGVmaW5lZCB0byB1c2UsIGFuZCBzaW5jZSBpNjQgaXMgbm90IGxlZ2FsLgorICAgIEVWVCBFbHRWVCA9IEVWVDo6Z2V0RmxvYXRpbmdQb2ludFZUKEVsdFNpemUpOworICAgIEVWVCBWZWNWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIEVsdFZULCBOdW1FbHRzKTsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUVsdHM7ICsraSkKKyAgICAgIE9wcy5wdXNoX2JhY2soREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIEVsdFZULCBPcC5nZXRPcGVyYW5kKGkpKSk7CisgICAgU0RWYWx1ZSBWYWwgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIFZlY1ZULCAmT3BzWzBdLE51bUVsdHMpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsIFZhbCk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gaXNTaHVmZmxlTWFza0xlZ2FsIC0gVGFyZ2V0cyBjYW4gdXNlIHRoaXMgdG8gaW5kaWNhdGUgdGhhdCB0aGV5IG9ubHkKKy8vLyBzdXBwb3J0ICpzb21lKiBWRUNUT1JfU0hVRkZMRSBvcGVyYXRpb25zLCB0aG9zZSB3aXRoIHNwZWNpZmljIG1hc2tzLgorLy8vIEJ5IGRlZmF1bHQsIGlmIGEgdGFyZ2V0IHN1cHBvcnRzIHRoZSBWRUNUT1JfU0hVRkZMRSBub2RlLCBhbGwgbWFzayB2YWx1ZXMKKy8vLyBhcmUgYXNzdW1lZCB0byBiZSBsZWdhbC4KK2Jvb2wKK0FSTVRhcmdldExvd2VyaW5nOjppc1NodWZmbGVNYXNrTGVnYWwoY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3QgeworICBpZiAoVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA9PSA0ICYmCisgICAgICAoVlQuaXMxMjhCaXRWZWN0b3IoKSB8fCBWVC5pczY0Qml0VmVjdG9yKCkpKSB7CisgICAgdW5zaWduZWQgUEZJbmRleGVzWzRdOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gNDsgKytpKSB7CisgICAgICBpZiAoTVtpXSA8IDApCisgICAgICAgIFBGSW5kZXhlc1tpXSA9IDg7CisgICAgICBlbHNlCisgICAgICAgIFBGSW5kZXhlc1tpXSA9IE1baV07CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSB0aGUgaW5kZXggaW4gdGhlIHBlcmZlY3Qgc2h1ZmZsZSB0YWJsZS4KKyAgICB1bnNpZ25lZCBQRlRhYmxlSW5kZXggPQorICAgICAgUEZJbmRleGVzWzBdKjkqOSo5K1BGSW5kZXhlc1sxXSo5KjkrUEZJbmRleGVzWzJdKjkrUEZJbmRleGVzWzNdOworICAgIHVuc2lnbmVkIFBGRW50cnkgPSBQZXJmZWN0U2h1ZmZsZVRhYmxlW1BGVGFibGVJbmRleF07CisgICAgdW5zaWduZWQgQ29zdCA9IChQRkVudHJ5ID4+IDMwKTsKKworICAgIGlmIChDb3N0IDw9IDQpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgUmV2ZXJzZVZFWFQ7CisgIHVuc2lnbmVkIEltbSwgV2hpY2hSZXN1bHQ7CisKKyAgdW5zaWduZWQgRWx0U2l6ZSA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICByZXR1cm4gKEVsdFNpemUgPj0gMzIgfHwKKyAgICAgICAgICBTaHVmZmxlVmVjdG9yU0ROb2RlOjppc1NwbGF0TWFzaygmTVswXSwgVlQpIHx8CisgICAgICAgICAgaXNWUkVWTWFzayhNLCBWVCwgNjQpIHx8CisgICAgICAgICAgaXNWUkVWTWFzayhNLCBWVCwgMzIpIHx8CisgICAgICAgICAgaXNWUkVWTWFzayhNLCBWVCwgMTYpIHx8CisgICAgICAgICAgaXNWRVhUTWFzayhNLCBWVCwgUmV2ZXJzZVZFWFQsIEltbSkgfHwKKyAgICAgICAgICBpc1ZUUk5NYXNrKE0sIFZULCBXaGljaFJlc3VsdCkgfHwKKyAgICAgICAgICBpc1ZVWlBNYXNrKE0sIFZULCBXaGljaFJlc3VsdCkgfHwKKyAgICAgICAgICBpc1ZaSVBNYXNrKE0sIFZULCBXaGljaFJlc3VsdCkgfHwKKyAgICAgICAgICBpc1ZUUk5fdl91bmRlZl9NYXNrKE0sIFZULCBXaGljaFJlc3VsdCkgfHwKKyAgICAgICAgICBpc1ZVWlBfdl91bmRlZl9NYXNrKE0sIFZULCBXaGljaFJlc3VsdCkgfHwKKyAgICAgICAgICBpc1ZaSVBfdl91bmRlZl9NYXNrKE0sIFZULCBXaGljaFJlc3VsdCkpOworfQorCisvLy8gR2VuZXJhdGVQZXJmZWN0U2h1ZmZsZSAtIEdpdmVuIGFuIGVudHJ5IGluIHRoZSBwZXJmZWN0LXNodWZmbGUgdGFibGUsIGVtaXQKKy8vLyB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbnMgdG8gYnVpbGQgdGhlIHNodWZmbGUuCitzdGF0aWMgU0RWYWx1ZSBHZW5lcmF0ZVBlcmZlY3RTaHVmZmxlKHVuc2lnbmVkIFBGRW50cnksIFNEVmFsdWUgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFJIUywgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIHVuc2lnbmVkIE9wTnVtID0gKFBGRW50cnkgPj4gMjYpICYgMHgwRjsKKyAgdW5zaWduZWQgTEhTSUQgPSAoUEZFbnRyeSA+PiAxMykgJiAoKDEgPDwgMTMpLTEpOworICB1bnNpZ25lZCBSSFNJRCA9IChQRkVudHJ5ID4+ICAwKSAmICgoMSA8PCAxMyktMSk7CisKKyAgZW51bSB7CisgICAgT1BfQ09QWSA9IDAsIC8vIENvcHksIHVzZWQgZm9yIHRoaW5ncyBsaWtlIDx1LHUsdSwzPiB0byBzYXkgaXQgaXMgPDAsMSwyLDM+CisgICAgT1BfVlJFViwKKyAgICBPUF9WRFVQMCwKKyAgICBPUF9WRFVQMSwKKyAgICBPUF9WRFVQMiwKKyAgICBPUF9WRFVQMywKKyAgICBPUF9WRVhUMSwKKyAgICBPUF9WRVhUMiwKKyAgICBPUF9WRVhUMywKKyAgICBPUF9WVVpQTCwgLy8gVlVaUCwgbGVmdCByZXN1bHQKKyAgICBPUF9WVVpQUiwgLy8gVlVaUCwgcmlnaHQgcmVzdWx0CisgICAgT1BfVlpJUEwsIC8vIFZaSVAsIGxlZnQgcmVzdWx0CisgICAgT1BfVlpJUFIsIC8vIFZaSVAsIHJpZ2h0IHJlc3VsdAorICAgIE9QX1ZUUk5MLCAvLyBWVFJOLCBsZWZ0IHJlc3VsdAorICAgIE9QX1ZUUk5SICAvLyBWVFJOLCByaWdodCByZXN1bHQKKyAgfTsKKworICBpZiAoT3BOdW0gPT0gT1BfQ09QWSkgeworICAgIGlmIChMSFNJRCA9PSAoMSo5KzIpKjkrMykgcmV0dXJuIExIUzsKKyAgICBhc3NlcnQoTEhTSUQgPT0gKCg0KjkrNSkqOSs2KSo5KzcgJiYgIklsbGVnYWwgT1BfQ09QWSEiKTsKKyAgICByZXR1cm4gUkhTOworICB9CisKKyAgU0RWYWx1ZSBPcExIUywgT3BSSFM7CisgIE9wTEhTID0gR2VuZXJhdGVQZXJmZWN0U2h1ZmZsZShQZXJmZWN0U2h1ZmZsZVRhYmxlW0xIU0lEXSwgTEhTLCBSSFMsIERBRywgZGwpOworICBPcFJIUyA9IEdlbmVyYXRlUGVyZmVjdFNodWZmbGUoUGVyZmVjdFNodWZmbGVUYWJsZVtSSFNJRF0sIExIUywgUkhTLCBEQUcsIGRsKTsKKyAgRVZUIFZUID0gT3BMSFMuZ2V0VmFsdWVUeXBlKCk7CisKKyAgc3dpdGNoIChPcE51bSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNodWZmbGUgb3Bjb2RlISIpOworICBjYXNlIE9QX1ZSRVY6CisgICAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6VlJFVjY0LCBkbCwgVlQsIE9wTEhTKTsKKyAgY2FzZSBPUF9WRFVQMDoKKyAgY2FzZSBPUF9WRFVQMToKKyAgY2FzZSBPUF9WRFVQMjoKKyAgY2FzZSBPUF9WRFVQMzoKKyAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpWRFVQTEFORSwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICBPcExIUywgREFHLmdldENvbnN0YW50KE9wTnVtLU9QX1ZEVVAwLCBNVlQ6OmkzMikpOworICBjYXNlIE9QX1ZFWFQxOgorICBjYXNlIE9QX1ZFWFQyOgorICBjYXNlIE9QX1ZFWFQzOgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZFWFQsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgT3BMSFMsIE9wUkhTLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoT3BOdW0tT1BfVkVYVDErMSwgTVZUOjppMzIpKTsKKyAgY2FzZSBPUF9WVVpQTDoKKyAgY2FzZSBPUF9WVVpQUjoKKyAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpWVVpQLCBkbCwgREFHLmdldFZUTGlzdChWVCwgVlQpLAorICAgICAgICAgICAgICAgICAgICAgICBPcExIUywgT3BSSFMpLmdldFZhbHVlKE9wTnVtLU9QX1ZVWlBMKTsKKyAgY2FzZSBPUF9WWklQTDoKKyAgY2FzZSBPUF9WWklQUjoKKyAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpWWklQLCBkbCwgREFHLmdldFZUTGlzdChWVCwgVlQpLAorICAgICAgICAgICAgICAgICAgICAgICBPcExIUywgT3BSSFMpLmdldFZhbHVlKE9wTnVtLU9QX1ZaSVBMKTsKKyAgY2FzZSBPUF9WVFJOTDoKKyAgY2FzZSBPUF9WVFJOUjoKKyAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpWVFJOLCBkbCwgREFHLmdldFZUTGlzdChWVCwgVlQpLAorICAgICAgICAgICAgICAgICAgICAgICBPcExIUywgT3BSSFMpLmdldFZhbHVlKE9wTnVtLU9QX1ZUUk5MKTsKKyAgfQorfQorCitzdGF0aWMgU0RWYWx1ZSBMb3dlclZFQ1RPUl9TSFVGRkxFKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIFNEVmFsdWUgVjEgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFYyID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgU2h1ZmZsZVZlY3RvclNETm9kZSAqU1ZOID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihPcC5nZXROb2RlKCkpOworICBTbWFsbFZlY3RvcjxpbnQsIDg+IFNodWZmbGVNYXNrOworCisgIC8vIENvbnZlcnQgc2h1ZmZsZXMgdGhhdCBhcmUgZGlyZWN0bHkgc3VwcG9ydGVkIG9uIE5FT04gdG8gdGFyZ2V0LXNwZWNpZmljCisgIC8vIERBRyBub2RlcywgaW5zdGVhZCBvZiBrZWVwaW5nIHRoZW0gYXMgc2h1ZmZsZXMgYW5kIG1hdGNoaW5nIHRoZW0gYWdhaW4KKyAgLy8gZHVyaW5nIGNvZGUgc2VsZWN0aW9uLiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCBhbmQgYXZvaWRzIHRoZSBwb3NzaWJpbGl0eQorICAvLyBvZiBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBsZWdhbGl6YXRpb24gYW5kIHNlbGVjdGlvbi4KKyAgLy8gRklYTUU6IGZsb2F0aW5nLXBvaW50IHZlY3RvcnMgc2hvdWxkIGJlIGNhbm9uaWNhbGl6ZWQgdG8gaW50ZWdlciB2ZWN0b3JzCisgIC8vIG9mIHRoZSBzYW1lIHRpbWUgc28gdGhhdCB0aGV5IGdldCBDU0VkIHByb3Blcmx5LgorICBTVk4tPmdldE1hc2soU2h1ZmZsZU1hc2spOworCisgIHVuc2lnbmVkIEVsdFNpemUgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgaWYgKEVsdFNpemUgPD0gMzIpIHsKKyAgICBpZiAoU2h1ZmZsZVZlY3RvclNETm9kZTo6aXNTcGxhdE1hc2soJlNodWZmbGVNYXNrWzBdLCBWVCkpIHsKKyAgICAgIGludCBMYW5lID0gU1ZOLT5nZXRTcGxhdEluZGV4KCk7CisgICAgICAvLyBJZiB0aGlzIGlzIHVuZGVmIHNwbGF0LCBnZW5lcmF0ZSBpdCB2aWEgImp1c3QiIHZkdXAsIGlmIHBvc3NpYmxlLgorICAgICAgaWYgKExhbmUgPT0gLTEpIExhbmUgPSAwOworCisgICAgICBpZiAoTGFuZSA9PSAwICYmIFYxLmdldE9wY29kZSgpID09IElTRDo6U0NBTEFSX1RPX1ZFQ1RPUikgeworICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpWRFVQLCBkbCwgVlQsIFYxLmdldE9wZXJhbmQoMCkpOworICAgICAgfQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6VkRVUExBTkUsIGRsLCBWVCwgVjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KExhbmUsIE1WVDo6aTMyKSk7CisgICAgfQorCisgICAgYm9vbCBSZXZlcnNlVkVYVDsKKyAgICB1bnNpZ25lZCBJbW07CisgICAgaWYgKGlzVkVYVE1hc2soU2h1ZmZsZU1hc2ssIFZULCBSZXZlcnNlVkVYVCwgSW1tKSkgeworICAgICAgaWYgKFJldmVyc2VWRVhUKQorICAgICAgICBzdGQ6OnN3YXAoVjEsIFYyKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZFWFQsIGRsLCBWVCwgVjEsIFYyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbW0sIE1WVDo6aTMyKSk7CisgICAgfQorCisgICAgaWYgKGlzVlJFVk1hc2soU2h1ZmZsZU1hc2ssIFZULCA2NCkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpWUkVWNjQsIGRsLCBWVCwgVjEpOworICAgIGlmIChpc1ZSRVZNYXNrKFNodWZmbGVNYXNrLCBWVCwgMzIpKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6VlJFVjMyLCBkbCwgVlQsIFYxKTsKKyAgICBpZiAoaXNWUkVWTWFzayhTaHVmZmxlTWFzaywgVlQsIDE2KSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZSRVYxNiwgZGwsIFZULCBWMSk7CisKKyAgICAvLyBDaGVjayBmb3IgTmVvbiBzaHVmZmxlcyB0aGF0IG1vZGlmeSBib3RoIGlucHV0IHZlY3RvcnMgaW4gcGxhY2UuCisgICAgLy8gSWYgYm90aCByZXN1bHRzIGFyZSB1c2VkLCBpLmUuLCBpZiB0aGVyZSBhcmUgdHdvIHNodWZmbGVzIHdpdGggdGhlIHNhbWUKKyAgICAvLyBzb3VyY2Ugb3BlcmFuZHMgYW5kIHdpdGggbWFza3MgY29ycmVzcG9uZGluZyB0byBib3RoIHJlc3VsdHMgb2Ygb25lIG9mCisgICAgLy8gdGhlc2Ugb3BlcmF0aW9ucywgREFHIG1lbW9pemF0aW9uIHdpbGwgZW5zdXJlIHRoYXQgYSBzaW5nbGUgbm9kZSBpcworICAgIC8vIHVzZWQgZm9yIGJvdGggc2h1ZmZsZXMuCisgICAgdW5zaWduZWQgV2hpY2hSZXN1bHQ7CisgICAgaWYgKGlzVlRSTk1hc2soU2h1ZmZsZU1hc2ssIFZULCBXaGljaFJlc3VsdCkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpWVFJOLCBkbCwgREFHLmdldFZUTGlzdChWVCwgVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFYxLCBWMikuZ2V0VmFsdWUoV2hpY2hSZXN1bHQpOworICAgIGlmIChpc1ZVWlBNYXNrKFNodWZmbGVNYXNrLCBWVCwgV2hpY2hSZXN1bHQpKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6VlVaUCwgZGwsIERBRy5nZXRWVExpc3QoVlQsIFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWMSwgVjIpLmdldFZhbHVlKFdoaWNoUmVzdWx0KTsKKyAgICBpZiAoaXNWWklQTWFzayhTaHVmZmxlTWFzaywgVlQsIFdoaWNoUmVzdWx0KSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZaSVAsIGRsLCBEQUcuZ2V0VlRMaXN0KFZULCBWVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgVjEsIFYyKS5nZXRWYWx1ZShXaGljaFJlc3VsdCk7CisKKyAgICBpZiAoaXNWVFJOX3ZfdW5kZWZfTWFzayhTaHVmZmxlTWFzaywgVlQsIFdoaWNoUmVzdWx0KSkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBUk1JU0Q6OlZUUk4sIGRsLCBEQUcuZ2V0VlRMaXN0KFZULCBWVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgVjEsIFYxKS5nZXRWYWx1ZShXaGljaFJlc3VsdCk7CisgICAgaWYgKGlzVlVaUF92X3VuZGVmX01hc2soU2h1ZmZsZU1hc2ssIFZULCBXaGljaFJlc3VsdCkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoQVJNSVNEOjpWVVpQLCBkbCwgREFHLmdldFZUTGlzdChWVCwgVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFYxLCBWMSkuZ2V0VmFsdWUoV2hpY2hSZXN1bHQpOworICAgIGlmIChpc1ZaSVBfdl91bmRlZl9NYXNrKFNodWZmbGVNYXNrLCBWVCwgV2hpY2hSZXN1bHQpKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6VlpJUCwgZGwsIERBRy5nZXRWVExpc3QoVlQsIFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWMSwgVjEpLmdldFZhbHVlKFdoaWNoUmVzdWx0KTsKKyAgfQorCisgIC8vIElmIHRoZSBzaHVmZmxlIGlzIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgYW5kIGl0IGhhcyA0IGVsZW1lbnRzLCB1c2UKKyAgLy8gdGhlIFBlcmZlY3RTaHVmZmxlLWdlbmVyYXRlZCB0YWJsZSB0byBzeW50aGVzaXplIGl0IGZyb20gb3RoZXIgc2h1ZmZsZXMuCisgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBpZiAoTnVtRWx0cyA9PSA0KSB7CisgICAgdW5zaWduZWQgUEZJbmRleGVzWzRdOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gNDsgKytpKSB7CisgICAgICBpZiAoU2h1ZmZsZU1hc2tbaV0gPCAwKQorICAgICAgICBQRkluZGV4ZXNbaV0gPSA4OworICAgICAgZWxzZQorICAgICAgICBQRkluZGV4ZXNbaV0gPSBTaHVmZmxlTWFza1tpXTsKKyAgICB9CisKKyAgICAvLyBDb21wdXRlIHRoZSBpbmRleCBpbiB0aGUgcGVyZmVjdCBzaHVmZmxlIHRhYmxlLgorICAgIHVuc2lnbmVkIFBGVGFibGVJbmRleCA9CisgICAgICBQRkluZGV4ZXNbMF0qOSo5KjkrUEZJbmRleGVzWzFdKjkqOStQRkluZGV4ZXNbMl0qOStQRkluZGV4ZXNbM107CisgICAgdW5zaWduZWQgUEZFbnRyeSA9IFBlcmZlY3RTaHVmZmxlVGFibGVbUEZUYWJsZUluZGV4XTsKKyAgICB1bnNpZ25lZCBDb3N0ID0gKFBGRW50cnkgPj4gMzApOworCisgICAgaWYgKENvc3QgPD0gNCkKKyAgICAgIHJldHVybiBHZW5lcmF0ZVBlcmZlY3RTaHVmZmxlKFBGRW50cnksIFYxLCBWMiwgREFHLCBkbCk7CisgIH0KKworICAvLyBJbXBsZW1lbnQgc2h1ZmZsZXMgd2l0aCAzMi0gb3IgNjQtYml0IGVsZW1lbnRzIGFzIEFSTUlTRDo6QlVJTERfVkVDVE9Scy4KKyAgaWYgKEVsdFNpemUgPj0gMzIpIHsKKyAgICAvLyBEbyB0aGUgZXhwYW5zaW9uIHdpdGggZmxvYXRpbmctcG9pbnQgdHlwZXMsIHNpbmNlIHRoYXQgaXMgd2hhdCB0aGUgVkZQCisgICAgLy8gcmVnaXN0ZXJzIGFyZSBkZWZpbmVkIHRvIHVzZSwgYW5kIHNpbmNlIGk2NCBpcyBub3QgbGVnYWwuCisgICAgRVZUIEVsdFZUID0gRVZUOjpnZXRGbG9hdGluZ1BvaW50VlQoRWx0U2l6ZSk7CisgICAgRVZUIFZlY1ZUID0gRVZUOjpnZXRWZWN0b3JWVCgqREFHLmdldENvbnRleHQoKSwgRWx0VlQsIE51bUVsdHMpOworICAgIFYxID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZlY1ZULCBWMSk7CisgICAgVjIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVmVjVlQsIFYyKTsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUVsdHM7ICsraSkgeworICAgICAgaWYgKFNodWZmbGVNYXNrW2ldIDwgMCkKKyAgICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0VU5ERUYoRWx0VlQpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIEVsdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNodWZmbGVNYXNrW2ldIDwgKGludClOdW1FbHRzID8gVjEgOiBWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoU2h1ZmZsZU1hc2tbaV0gJiAoTnVtRWx0cy0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpKSk7CisgICAgfQorICAgIFNEVmFsdWUgVmFsID0gREFHLmdldE5vZGUoQVJNSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBWZWNWVCwgJk9wc1swXSxOdW1FbHRzKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULCBWYWwpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworc3RhdGljIFNEVmFsdWUgTG93ZXJFWFRSQUNUX1ZFQ1RPUl9FTFQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBWZWMgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIExhbmUgPSBPcC5nZXRPcGVyYW5kKDEpOworICBhc3NlcnQoVlQgPT0gTVZUOjppMzIgJiYKKyAgICAgICAgIFZlYy5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKSA8IDMyICYmCisgICAgICAgICAidW5leHBlY3RlZCB0eXBlIGZvciBjdXN0b20tbG93ZXJpbmcgdmVjdG9yIGV4dHJhY3QiKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6VkdFVExBTkV1LCBkbCwgTVZUOjppMzIsIFZlYywgTGFuZSk7Cit9CisKK3N0YXRpYyBTRFZhbHVlIExvd2VyQ09OQ0FUX1ZFQ1RPUlMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgLy8gVGhlIG9ubHkgdGltZSBhIENPTkNBVF9WRUNUT1JTIG9wZXJhdGlvbiBjYW4gaGF2ZSBsZWdhbCB0eXBlcyBpcyB3aGVuCisgIC8vIHR3byA2NC1iaXQgdmVjdG9ycyBhcmUgY29uY2F0ZW5hdGVkIHRvIGEgMTI4LWJpdCB2ZWN0b3IuCisgIGFzc2VydChPcC5nZXRWYWx1ZVR5cGUoKS5pczEyOEJpdFZlY3RvcigpICYmIE9wLmdldE51bU9wZXJhbmRzKCkgPT0gMiAmJgorICAgICAgICAgInVuZXhwZWN0ZWQgQ09OQ0FUX1ZFQ1RPUlMiKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIFZhbCA9IERBRy5nZXRVTkRFRihNVlQ6OnYyZjY0KTsKKyAgU0RWYWx1ZSBPcDAgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIE9wMSA9IE9wLmdldE9wZXJhbmQoMSk7CisgIGlmIChPcDAuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpVTkRFRikKKyAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCBkbCwgTVZUOjp2MmY2NCwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmY2NCwgT3AwKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICBpZiAoT3AxLmdldE9wY29kZSgpICE9IElTRDo6VU5ERUYpCisgICAgVmFsID0gREFHLmdldE5vZGUoSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgZGwsIE1WVDo6djJmNjQsIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjpmNjQsIE9wMSksCisgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDEpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwgVmFsKTsKK30KKworU0RWYWx1ZSBBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJPcGVyYXRpb24oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJEb24ndCBrbm93IGhvdyB0byBjdXN0b20gbG93ZXIgdGhpcyEiKTsKKyAgY2FzZSBJU0Q6OkNvbnN0YW50UG9vbDogIHJldHVybiBMb3dlckNvbnN0YW50UG9vbChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkJsb2NrQWRkcmVzczogIHJldHVybiBMb3dlckJsb2NrQWRkcmVzcyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6Okdsb2JhbEFkZHJlc3M6CisgICAgcmV0dXJuIFN1YnRhcmdldC0+aXNUYXJnZXREYXJ3aW4oKSA/IExvd2VyR2xvYmFsQWRkcmVzc0RhcndpbihPcCwgREFHKSA6CisgICAgICBMb3dlckdsb2JhbEFkZHJlc3NFTEYoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpHbG9iYWxUTFNBZGRyZXNzOiAgIHJldHVybiBMb3dlckdsb2JhbFRMU0FkZHJlc3MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6ICAgICByZXR1cm4gTG93ZXJTRUxFQ1RfQ0MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpCUl9DQzogICAgICAgICByZXR1cm4gTG93ZXJCUl9DQyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkJSX0pUOiAgICAgICAgIHJldHVybiBMb3dlckJSX0pUKE9wLCBEQUcpOworICBjYXNlIElTRDo6VkFTVEFSVDogICAgICAgcmV0dXJuIExvd2VyVkFTVEFSVChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6Ok1FTUJBUlJJRVI6ICAgIHJldHVybiBMb3dlck1FTUJBUlJJRVIoT3AsIERBRywgU3VidGFyZ2V0KTsKKyAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6CisgIGNhc2UgSVNEOjpVSU5UX1RPX0ZQOiAgICByZXR1cm4gTG93ZXJJTlRfVE9fRlAoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpGUF9UT19TSU5UOgorICBjYXNlIElTRDo6RlBfVE9fVUlOVDogICAgcmV0dXJuIExvd2VyRlBfVE9fSU5UKE9wLCBEQUcpOworICBjYXNlIElTRDo6RkNPUFlTSUdOOiAgICAgcmV0dXJuIExvd2VyRkNPUFlTSUdOKE9wLCBEQUcpOworICBjYXNlIElTRDo6UkVUVVJOQUREUjogICAgcmV0dXJuIExvd2VyUkVUVVJOQUREUihPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkZSQU1FQUREUjogICAgIHJldHVybiBMb3dlckZSQU1FQUREUihPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkdMT0JBTF9PRkZTRVRfVEFCTEU6IHJldHVybiBMb3dlckdMT0JBTF9PRkZTRVRfVEFCTEUoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpFSF9TSkxKX1NFVEpNUDogcmV0dXJuIExvd2VyRUhfU0pMSl9TRVRKTVAoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpFSF9TSkxKX0xPTkdKTVA6IHJldHVybiBMb3dlckVIX1NKTEpfTE9OR0pNUChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OklOVFJJTlNJQ19XT19DSEFJTjogcmV0dXJuIExvd2VySU5UUklOU0lDX1dPX0NIQUlOKE9wLCBEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0YXJnZXQpOworICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6ICAgcmV0dXJuIEV4cGFuZEJJVF9DT05WRVJUKE9wLmdldE5vZGUoKSwgREFHKTsKKyAgY2FzZSBJU0Q6OlNITDoKKyAgY2FzZSBJU0Q6OlNSTDoKKyAgY2FzZSBJU0Q6OlNSQTogICAgICAgICAgIHJldHVybiBMb3dlclNoaWZ0KE9wLmdldE5vZGUoKSwgREFHLCBTdWJ0YXJnZXQpOworICBjYXNlIElTRDo6U0hMX1BBUlRTOiAgICAgcmV0dXJuIExvd2VyU2hpZnRMZWZ0UGFydHMoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpTUkxfUEFSVFM6CisgIGNhc2UgSVNEOjpTUkFfUEFSVFM6ICAgICByZXR1cm4gTG93ZXJTaGlmdFJpZ2h0UGFydHMoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpDVFRaOiAgICAgICAgICByZXR1cm4gTG93ZXJDVFRaKE9wLmdldE5vZGUoKSwgREFHLCBTdWJ0YXJnZXQpOworICBjYXNlIElTRDo6VlNFVENDOiAgICAgICAgcmV0dXJuIExvd2VyVlNFVENDKE9wLCBEQUcpOworICBjYXNlIElTRDo6QlVJTERfVkVDVE9SOiAgcmV0dXJuIExvd2VyQlVJTERfVkVDVE9SKE9wLCBEQUcsIFN1YnRhcmdldCk7CisgIGNhc2UgSVNEOjpWRUNUT1JfU0hVRkZMRTogcmV0dXJuIExvd2VyVkVDVE9SX1NIVUZGTEUoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQ6IHJldHVybiBMb3dlckVYVFJBQ1RfVkVDVE9SX0VMVChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkNPTkNBVF9WRUNUT1JTOiByZXR1cm4gTG93ZXJDT05DQVRfVkVDVE9SUyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkZMVF9ST1VORFNfOiByZXR1cm4gTG93ZXJGTFRfUk9VTkRTXyhPcCwgREFHKTsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gUmVwbGFjZU5vZGVSZXN1bHRzIC0gUmVwbGFjZSB0aGUgcmVzdWx0cyBvZiBub2RlIHdpdGggYW4gaWxsZWdhbCByZXN1bHQKKy8vLyB0eXBlIHdpdGggbmV3IHZhbHVlcyBidWlsdCBvdXQgb2YgY3VzdG9tIGNvZGUuCit2b2lkIEFSTVRhcmdldExvd2VyaW5nOjpSZXBsYWNlTm9kZVJlc3VsdHMoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiZSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgUmVzOworICBzd2l0Y2ggKE4tPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiRG9uJ3Qga25vdyBob3cgdG8gY3VzdG9tIGV4cGFuZCB0aGlzISIpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6QklUX0NPTlZFUlQ6CisgICAgUmVzID0gRXhwYW5kQklUX0NPTlZFUlQoTiwgREFHKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNSTDoKKyAgY2FzZSBJU0Q6OlNSQToKKyAgICBSZXMgPSBMb3dlclNoaWZ0KE4sIERBRywgU3VidGFyZ2V0KTsKKyAgICBicmVhazsKKyAgfQorICBpZiAoUmVzLmdldE5vZGUoKSkKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhSZXMpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBBUk0gU2NoZWR1bGVyIEhvb2tzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNYWNoaW5lQmFzaWNCbG9jayAqCitBUk1UYXJnZXRMb3dlcmluZzo6RW1pdEF0b21pY0NtcFN3YXAoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgY29uc3QgeworICB1bnNpZ25lZCBkZXN0ICAgID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIHB0ciAgICAgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgb2xkdmFsICA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpOworICB1bnNpZ25lZCBuZXd2YWwgID0gTUktPmdldE9wZXJhbmQoMykuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIHNjcmF0Y2ggPSBCQi0+Z2V0UGFyZW50KCktPmdldFJlZ0luZm8oKQorICAgIC5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoQVJNOjpHUFJSZWdpc3RlckNsYXNzKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0SW5zdHJJbmZvKCk7CisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisgIGJvb2wgaXNUaHVtYjIgPSBTdWJ0YXJnZXQtPmlzVGh1bWIyKCk7CisKKyAgdW5zaWduZWQgbGRyT3BjLCBzdHJPcGM7CisgIHN3aXRjaCAoU2l6ZSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJ1bnN1cHBvcnRlZCBzaXplIGZvciBBdG9taWNDbXBTd2FwISIpOworICBjYXNlIDE6CisgICAgbGRyT3BjID0gaXNUaHVtYjIgPyBBUk06OnQyTERSRVhCIDogQVJNOjpMRFJFWEI7CisgICAgc3RyT3BjID0gaXNUaHVtYjIgPyBBUk06OnQyTERSRVhCIDogQVJNOjpTVFJFWEI7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBsZHJPcGMgPSBpc1RodW1iMiA/IEFSTTo6dDJMRFJFWEggOiBBUk06OkxEUkVYSDsKKyAgICBzdHJPcGMgPSBpc1RodW1iMiA/IEFSTTo6dDJTVFJFWEggOiBBUk06OlNUUkVYSDsKKyAgICBicmVhazsKKyAgY2FzZSA0OgorICAgIGxkck9wYyA9IGlzVGh1bWIyID8gQVJNOjp0MkxEUkVYIDogQVJNOjpMRFJFWDsKKyAgICBzdHJPcGMgPSBpc1RodW1iMiA/IEFSTTo6dDJTVFJFWCA6IEFSTTo6U1RSRVg7CisgICAgYnJlYWs7CisgIH0KKworICBNYWNoaW5lRnVuY3Rpb24gKk1GID0gQkItPmdldFBhcmVudCgpOworICBjb25zdCBCYXNpY0Jsb2NrICpMTFZNX0JCID0gQkItPmdldEJhc2ljQmxvY2soKTsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJdCA9IEJCOworICArK0l0OyAvLyBpbnNlcnQgdGhlIG5ldyBibG9ja3MgYWZ0ZXIgdGhlIGN1cnJlbnQgYmxvY2sKKworICBNYWNoaW5lQmFzaWNCbG9jayAqbG9vcDFNQkIgPSBNRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpsb29wMk1CQiA9IE1GLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmV4aXRNQkIgPSBNRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1GLT5pbnNlcnQoSXQsIGxvb3AxTUJCKTsKKyAgTUYtPmluc2VydChJdCwgbG9vcDJNQkIpOworICBNRi0+aW5zZXJ0KEl0LCBleGl0TUJCKTsKKworICAvLyBUcmFuc2ZlciB0aGUgcmVtYWluZGVyIG9mIEJCIGFuZCBpdHMgc3VjY2Vzc29yIGVkZ2VzIHRvIGV4aXRNQkIuCisgIGV4aXRNQkItPnNwbGljZShleGl0TUJCLT5iZWdpbigpLCBCQiwKKyAgICAgICAgICAgICAgICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKE1JKSksCisgICAgICAgICAgICAgICAgICBCQi0+ZW5kKCkpOworICBleGl0TUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKEJCKTsKKworICAvLyAgdGhpc01CQjoKKyAgLy8gICAuLi4KKyAgLy8gICBmYWxsdGhyb3VnaCAtLT4gbG9vcDFNQkIKKyAgQkItPmFkZFN1Y2Nlc3Nvcihsb29wMU1CQik7CisKKyAgLy8gbG9vcDFNQkI6CisgIC8vICAgbGRyZXggZGVzdCwgW3B0cl0KKyAgLy8gICBjbXAgZGVzdCwgb2xkdmFsCisgIC8vICAgYm5lIGV4aXRNQkIKKyAgQkIgPSBsb29wMU1CQjsKKyAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KGxkck9wYyksIGRlc3QpLmFkZFJlZyhwdHIpKTsKKyAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KGlzVGh1bWIyID8gQVJNOjp0MkNNUHJyIDogQVJNOjpDTVBycikpCisgICAgICAgICAgICAgICAgIC5hZGRSZWcoZGVzdCkuYWRkUmVnKG9sZHZhbCkpOworICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXNUaHVtYjIgPyBBUk06OnQyQmNjIDogQVJNOjpCY2MpKQorICAgIC5hZGRNQkIoZXhpdE1CQikuYWRkSW1tKEFSTUNDOjpORSkuYWRkUmVnKEFSTTo6Q1BTUik7CisgIEJCLT5hZGRTdWNjZXNzb3IobG9vcDJNQkIpOworICBCQi0+YWRkU3VjY2Vzc29yKGV4aXRNQkIpOworCisgIC8vIGxvb3AyTUJCOgorICAvLyAgIHN0cmV4IHNjcmF0Y2gsIG5ld3ZhbCwgW3B0cl0KKyAgLy8gICBjbXAgc2NyYXRjaCwgIzAKKyAgLy8gICBibmUgbG9vcDFNQkIKKyAgQkIgPSBsb29wMk1CQjsKKyAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KHN0ck9wYyksIHNjcmF0Y2gpLmFkZFJlZyhuZXd2YWwpCisgICAgICAgICAgICAgICAgIC5hZGRSZWcocHRyKSk7CisgIEFkZERlZmF1bHRQcmVkKEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChpc1RodW1iMiA/IEFSTTo6dDJDTVByaSA6IEFSTTo6Q01QcmkpKQorICAgICAgICAgICAgICAgICAuYWRkUmVnKHNjcmF0Y2gpLmFkZEltbSgwKSk7CisgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChpc1RodW1iMiA/IEFSTTo6dDJCY2MgOiBBUk06OkJjYykpCisgICAgLmFkZE1CQihsb29wMU1CQikuYWRkSW1tKEFSTUNDOjpORSkuYWRkUmVnKEFSTTo6Q1BTUik7CisgIEJCLT5hZGRTdWNjZXNzb3IobG9vcDFNQkIpOworICBCQi0+YWRkU3VjY2Vzc29yKGV4aXRNQkIpOworCisgIC8vICBleGl0TUJCOgorICAvLyAgIC4uLgorICBCQiA9IGV4aXRNQkI7CisKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBpbnN0cnVjdGlvbiBpcyBnb25lIG5vdy4KKworICByZXR1cm4gQkI7Cit9CisKK01hY2hpbmVCYXNpY0Jsb2NrICoKK0FSTVRhcmdldExvd2VyaW5nOjpFbWl0QXRvbWljQmluYXJ5KE1hY2hpbmVJbnN0ciAqTUksIE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIEJpbk9wY29kZSkgY29uc3QgeworICAvLyBUaGlzIGFsc28gaGFuZGxlcyBBVE9NSUNfU1dBUCwgaW5kaWNhdGVkIGJ5IEJpbk9wY29kZT09MC4KKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0SW5zdHJJbmZvKCk7CisKKyAgY29uc3QgQmFzaWNCbG9jayAqTExWTV9CQiA9IEJCLT5nZXRCYXNpY0Jsb2NrKCk7CisgIE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBCQi0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSXQgPSBCQjsKKyAgKytJdDsKKworICB1bnNpZ25lZCBkZXN0ID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIHB0ciA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICB1bnNpZ25lZCBpbmNyID0gTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCk7CisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgYm9vbCBpc1RodW1iMiA9IFN1YnRhcmdldC0+aXNUaHVtYjIoKTsKKyAgdW5zaWduZWQgbGRyT3BjLCBzdHJPcGM7CisgIHN3aXRjaCAoU2l6ZSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJ1bnN1cHBvcnRlZCBzaXplIGZvciBBdG9taWNDbXBTd2FwISIpOworICBjYXNlIDE6CisgICAgbGRyT3BjID0gaXNUaHVtYjIgPyBBUk06OnQyTERSRVhCIDogQVJNOjpMRFJFWEI7CisgICAgc3RyT3BjID0gaXNUaHVtYjIgPyBBUk06OnQyU1RSRVhCIDogQVJNOjpTVFJFWEI7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBsZHJPcGMgPSBpc1RodW1iMiA/IEFSTTo6dDJMRFJFWEggOiBBUk06OkxEUkVYSDsKKyAgICBzdHJPcGMgPSBpc1RodW1iMiA/IEFSTTo6dDJTVFJFWEggOiBBUk06OlNUUkVYSDsKKyAgICBicmVhazsKKyAgY2FzZSA0OgorICAgIGxkck9wYyA9IGlzVGh1bWIyID8gQVJNOjp0MkxEUkVYIDogQVJNOjpMRFJFWDsKKyAgICBzdHJPcGMgPSBpc1RodW1iMiA/IEFSTTo6dDJTVFJFWCA6IEFSTTo6U1RSRVg7CisgICAgYnJlYWs7CisgIH0KKworICBNYWNoaW5lQmFzaWNCbG9jayAqbG9vcE1CQiA9IE1GLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmV4aXRNQkIgPSBNRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1GLT5pbnNlcnQoSXQsIGxvb3BNQkIpOworICBNRi0+aW5zZXJ0KEl0LCBleGl0TUJCKTsKKworICAvLyBUcmFuc2ZlciB0aGUgcmVtYWluZGVyIG9mIEJCIGFuZCBpdHMgc3VjY2Vzc29yIGVkZ2VzIHRvIGV4aXRNQkIuCisgIGV4aXRNQkItPnNwbGljZShleGl0TUJCLT5iZWdpbigpLCBCQiwKKyAgICAgICAgICAgICAgICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKE1JKSksCisgICAgICAgICAgICAgICAgICBCQi0+ZW5kKCkpOworICBleGl0TUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKEJCKTsKKworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZSZWdJbmZvID0gTUYtPmdldFJlZ0luZm8oKTsKKyAgdW5zaWduZWQgc2NyYXRjaCA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKEFSTTo6R1BSUmVnaXN0ZXJDbGFzcyk7CisgIHVuc2lnbmVkIHNjcmF0Y2gyID0gKCFCaW5PcGNvZGUpID8gaW5jciA6CisgICAgUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoQVJNOjpHUFJSZWdpc3RlckNsYXNzKTsKKworICAvLyAgdGhpc01CQjoKKyAgLy8gICAuLi4KKyAgLy8gICBmYWxsdGhyb3VnaCAtLT4gbG9vcE1CQgorICBCQi0+YWRkU3VjY2Vzc29yKGxvb3BNQkIpOworCisgIC8vICBsb29wTUJCOgorICAvLyAgIGxkcmV4IGRlc3QsIHB0cgorICAvLyAgIDxiaW5vcD4gc2NyYXRjaDIsIGRlc3QsIGluY3IKKyAgLy8gICBzdHJleCBzY3JhdGNoLCBzY3JhdGNoMiwgcHRyCisgIC8vICAgY21wIHNjcmF0Y2gsICMwCisgIC8vICAgYm5lLSBsb29wTUJCCisgIC8vICAgZmFsbHRocm91Z2ggLS0+IGV4aXRNQkIKKyAgQkIgPSBsb29wTUJCOworICBBZGREZWZhdWx0UHJlZChCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQobGRyT3BjKSwgZGVzdCkuYWRkUmVnKHB0cikpOworICBpZiAoQmluT3Bjb2RlKSB7CisgICAgLy8gb3BlcmFuZCBvcmRlciBuZWVkcyB0byBnbyB0aGUgb3RoZXIgd2F5IGZvciBOQU5ECisgICAgaWYgKEJpbk9wY29kZSA9PSBBUk06OkJJQ3JyIHx8IEJpbk9wY29kZSA9PSBBUk06OnQyQklDcnIpCisgICAgICBBZGREZWZhdWx0UHJlZChCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoQmluT3Bjb2RlKSwgc2NyYXRjaDIpLgorICAgICAgICAgICAgICAgICAgICAgYWRkUmVnKGluY3IpLmFkZFJlZyhkZXN0KSkuYWRkUmVnKDApOworICAgIGVsc2UKKyAgICAgIEFkZERlZmF1bHRQcmVkKEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChCaW5PcGNvZGUpLCBzY3JhdGNoMikuCisgICAgICAgICAgICAgICAgICAgICBhZGRSZWcoZGVzdCkuYWRkUmVnKGluY3IpKS5hZGRSZWcoMCk7CisgIH0KKworICBBZGREZWZhdWx0UHJlZChCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoc3RyT3BjKSwgc2NyYXRjaCkuYWRkUmVnKHNjcmF0Y2gyKQorICAgICAgICAgICAgICAgICAuYWRkUmVnKHB0cikpOworICBBZGREZWZhdWx0UHJlZChCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXNUaHVtYjIgPyBBUk06OnQyQ01QcmkgOiBBUk06OkNNUHJpKSkKKyAgICAgICAgICAgICAgICAgLmFkZFJlZyhzY3JhdGNoKS5hZGRJbW0oMCkpOworICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXNUaHVtYjIgPyBBUk06OnQyQmNjIDogQVJNOjpCY2MpKQorICAgIC5hZGRNQkIobG9vcE1CQikuYWRkSW1tKEFSTUNDOjpORSkuYWRkUmVnKEFSTTo6Q1BTUik7CisKKyAgQkItPmFkZFN1Y2Nlc3Nvcihsb29wTUJCKTsKKyAgQkItPmFkZFN1Y2Nlc3NvcihleGl0TUJCKTsKKworICAvLyAgZXhpdE1CQjoKKyAgLy8gICAuLi4KKyAgQkIgPSBleGl0TUJCOworCisgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsgICAvLyBUaGUgaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisKKyAgcmV0dXJuIEJCOworfQorCitzdGF0aWMKK01hY2hpbmVCYXNpY0Jsb2NrICpPdGhlclN1Y2MoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MpIHsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6c3VjY19pdGVyYXRvciBJID0gTUJCLT5zdWNjX2JlZ2luKCksCisgICAgICAgRSA9IE1CQi0+c3VjY19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCpJICE9IFN1Y2MpCisgICAgICByZXR1cm4gKkk7CisgIGxsdm1fdW5yZWFjaGFibGUoIkV4cGVjdGluZyBhIEJCIHdpdGggdHdvIHN1Y2Nlc3NvcnMhIik7Cit9CisKK01hY2hpbmVCYXNpY0Jsb2NrICoKK0FSTVRhcmdldExvd2VyaW5nOjpFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworICBib29sIGlzVGh1bWIyID0gU3VidGFyZ2V0LT5pc1RodW1iMigpOworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIE1JLT5kdW1wKCk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBpbnN0ciB0eXBlIHRvIGluc2VydCIpOworCisgIGNhc2UgQVJNOjpBVE9NSUNfTE9BRF9BRERfSTg6CisgICAgIHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgMSwgaXNUaHVtYjIgPyBBUk06OnQyQUREcnIgOiBBUk06OkFERHJyKTsKKyAgY2FzZSBBUk06OkFUT01JQ19MT0FEX0FERF9JMTY6CisgICAgIHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgMiwgaXNUaHVtYjIgPyBBUk06OnQyQUREcnIgOiBBUk06OkFERHJyKTsKKyAgY2FzZSBBUk06OkFUT01JQ19MT0FEX0FERF9JMzI6CisgICAgIHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgNCwgaXNUaHVtYjIgPyBBUk06OnQyQUREcnIgOiBBUk06OkFERHJyKTsKKworICBjYXNlIEFSTTo6QVRPTUlDX0xPQURfQU5EX0k4OgorICAgICByZXR1cm4gRW1pdEF0b21pY0JpbmFyeShNSSwgQkIsIDEsIGlzVGh1bWIyID8gQVJNOjp0MkFORHJyIDogQVJNOjpBTkRycik7CisgIGNhc2UgQVJNOjpBVE9NSUNfTE9BRF9BTkRfSTE2OgorICAgICByZXR1cm4gRW1pdEF0b21pY0JpbmFyeShNSSwgQkIsIDIsIGlzVGh1bWIyID8gQVJNOjp0MkFORHJyIDogQVJNOjpBTkRycik7CisgIGNhc2UgQVJNOjpBVE9NSUNfTE9BRF9BTkRfSTMyOgorICAgICByZXR1cm4gRW1pdEF0b21pY0JpbmFyeShNSSwgQkIsIDQsIGlzVGh1bWIyID8gQVJNOjp0MkFORHJyIDogQVJNOjpBTkRycik7CisKKyAgY2FzZSBBUk06OkFUT01JQ19MT0FEX09SX0k4OgorICAgICByZXR1cm4gRW1pdEF0b21pY0JpbmFyeShNSSwgQkIsIDEsIGlzVGh1bWIyID8gQVJNOjp0Mk9SUnJyIDogQVJNOjpPUlJycik7CisgIGNhc2UgQVJNOjpBVE9NSUNfTE9BRF9PUl9JMTY6CisgICAgIHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgMiwgaXNUaHVtYjIgPyBBUk06OnQyT1JScnIgOiBBUk06Ok9SUnJyKTsKKyAgY2FzZSBBUk06OkFUT01JQ19MT0FEX09SX0kzMjoKKyAgICAgcmV0dXJuIEVtaXRBdG9taWNCaW5hcnkoTUksIEJCLCA0LCBpc1RodW1iMiA/IEFSTTo6dDJPUlJyciA6IEFSTTo6T1JScnIpOworCisgIGNhc2UgQVJNOjpBVE9NSUNfTE9BRF9YT1JfSTg6CisgICAgIHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgMSwgaXNUaHVtYjIgPyBBUk06OnQyRU9ScnIgOiBBUk06OkVPUnJyKTsKKyAgY2FzZSBBUk06OkFUT01JQ19MT0FEX1hPUl9JMTY6CisgICAgIHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgMiwgaXNUaHVtYjIgPyBBUk06OnQyRU9ScnIgOiBBUk06OkVPUnJyKTsKKyAgY2FzZSBBUk06OkFUT01JQ19MT0FEX1hPUl9JMzI6CisgICAgIHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgNCwgaXNUaHVtYjIgPyBBUk06OnQyRU9ScnIgOiBBUk06OkVPUnJyKTsKKworICBjYXNlIEFSTTo6QVRPTUlDX0xPQURfTkFORF9JODoKKyAgICAgcmV0dXJuIEVtaXRBdG9taWNCaW5hcnkoTUksIEJCLCAxLCBpc1RodW1iMiA/IEFSTTo6dDJCSUNyciA6IEFSTTo6QklDcnIpOworICBjYXNlIEFSTTo6QVRPTUlDX0xPQURfTkFORF9JMTY6CisgICAgIHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgMiwgaXNUaHVtYjIgPyBBUk06OnQyQklDcnIgOiBBUk06OkJJQ3JyKTsKKyAgY2FzZSBBUk06OkFUT01JQ19MT0FEX05BTkRfSTMyOgorICAgICByZXR1cm4gRW1pdEF0b21pY0JpbmFyeShNSSwgQkIsIDQsIGlzVGh1bWIyID8gQVJNOjp0MkJJQ3JyIDogQVJNOjpCSUNycik7CisKKyAgY2FzZSBBUk06OkFUT01JQ19MT0FEX1NVQl9JODoKKyAgICAgcmV0dXJuIEVtaXRBdG9taWNCaW5hcnkoTUksIEJCLCAxLCBpc1RodW1iMiA/IEFSTTo6dDJTVUJyciA6IEFSTTo6U1VCcnIpOworICBjYXNlIEFSTTo6QVRPTUlDX0xPQURfU1VCX0kxNjoKKyAgICAgcmV0dXJuIEVtaXRBdG9taWNCaW5hcnkoTUksIEJCLCAyLCBpc1RodW1iMiA/IEFSTTo6dDJTVUJyciA6IEFSTTo6U1VCcnIpOworICBjYXNlIEFSTTo6QVRPTUlDX0xPQURfU1VCX0kzMjoKKyAgICAgcmV0dXJuIEVtaXRBdG9taWNCaW5hcnkoTUksIEJCLCA0LCBpc1RodW1iMiA/IEFSTTo6dDJTVUJyciA6IEFSTTo6U1VCcnIpOworCisgIGNhc2UgQVJNOjpBVE9NSUNfU1dBUF9JODogIHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgMSwgMCk7CisgIGNhc2UgQVJNOjpBVE9NSUNfU1dBUF9JMTY6IHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgMiwgMCk7CisgIGNhc2UgQVJNOjpBVE9NSUNfU1dBUF9JMzI6IHJldHVybiBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgNCwgMCk7CisKKyAgY2FzZSBBUk06OkFUT01JQ19DTVBfU1dBUF9JODogIHJldHVybiBFbWl0QXRvbWljQ21wU3dhcChNSSwgQkIsIDEpOworICBjYXNlIEFSTTo6QVRPTUlDX0NNUF9TV0FQX0kxNjogcmV0dXJuIEVtaXRBdG9taWNDbXBTd2FwKE1JLCBCQiwgMik7CisgIGNhc2UgQVJNOjpBVE9NSUNfQ01QX1NXQVBfSTMyOiByZXR1cm4gRW1pdEF0b21pY0NtcFN3YXAoTUksIEJCLCA0KTsKKworICBjYXNlIEFSTTo6dE1PVkNDcl9wc2V1ZG86IHsKKyAgICAvLyBUbyAiaW5zZXJ0IiBhIFNFTEVDVF9DQyBpbnN0cnVjdGlvbiwgd2UgYWN0dWFsbHkgaGF2ZSB0byBpbnNlcnQgdGhlCisgICAgLy8gZGlhbW9uZCBjb250cm9sLWZsb3cgcGF0dGVybi4gIFRoZSBpbmNvbWluZyBpbnN0cnVjdGlvbiBrbm93cyB0aGUKKyAgICAvLyBkZXN0aW5hdGlvbiB2cmVnIHRvIHNldCwgdGhlIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyIHRvIGJyYW5jaCBvbiwgdGhlCisgICAgLy8gdHJ1ZS9mYWxzZSB2YWx1ZXMgdG8gc2VsZWN0IGJldHdlZW4sIGFuZCBhIGJyYW5jaCBvcGNvZGUgdG8gdXNlLgorICAgIGNvbnN0IEJhc2ljQmxvY2sgKkxMVk1fQkIgPSBCQi0+Z2V0QmFzaWNCbG9jaygpOworICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSXQgPSBCQjsKKyAgICArK0l0OworCisgICAgLy8gIHRoaXNNQkI6CisgICAgLy8gIC4uLgorICAgIC8vICAgVHJ1ZVZhbCA9IC4uLgorICAgIC8vICAgY21wVFkgY2NYLCByMSwgcjIKKyAgICAvLyAgIGJDQyBjb3B5MU1CQgorICAgIC8vICAgZmFsbHRocm91Z2ggLS0+IGNvcHkwTUJCCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKnRoaXNNQkIgID0gQkI7CisgICAgTWFjaGluZUZ1bmN0aW9uICpGID0gQkItPmdldFBhcmVudCgpOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpjb3B5ME1CQiA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpzaW5rTUJCICA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICAgIEYtPmluc2VydChJdCwgY29weTBNQkIpOworICAgIEYtPmluc2VydChJdCwgc2lua01CQik7CisKKyAgICAvLyBUcmFuc2ZlciB0aGUgcmVtYWluZGVyIG9mIEJCIGFuZCBpdHMgc3VjY2Vzc29yIGVkZ2VzIHRvIHNpbmtNQkIuCisgICAgc2lua01CQi0+c3BsaWNlKHNpbmtNQkItPmJlZ2luKCksIEJCLAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpuZXh0KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihNSSkpLAorICAgICAgICAgICAgICAgICAgICBCQi0+ZW5kKCkpOworICAgIHNpbmtNQkItPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXMoQkIpOworCisgICAgQkItPmFkZFN1Y2Nlc3Nvcihjb3B5ME1CQik7CisgICAgQkItPmFkZFN1Y2Nlc3NvcihzaW5rTUJCKTsKKworICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChBUk06OnRCY2MpKS5hZGRNQkIoc2lua01CQikKKyAgICAgIC5hZGRJbW0oTUktPmdldE9wZXJhbmQoMykuZ2V0SW1tKCkpLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCg0KS5nZXRSZWcoKSk7CisKKyAgICAvLyAgY29weTBNQkI6CisgICAgLy8gICAlRmFsc2VWYWx1ZSA9IC4uLgorICAgIC8vICAgIyBmYWxsdGhyb3VnaCB0byBzaW5rTUJCCisgICAgQkIgPSBjb3B5ME1CQjsKKworICAgIC8vIFVwZGF0ZSBtYWNoaW5lLUNGRyBlZGdlcworICAgIEJCLT5hZGRTdWNjZXNzb3Ioc2lua01CQik7CisKKyAgICAvLyAgc2lua01CQjoKKyAgICAvLyAgICVSZXN1bHQgPSBwaGkgWyAlRmFsc2VWYWx1ZSwgY29weTBNQkIgXSwgWyAlVHJ1ZVZhbHVlLCB0aGlzTUJCIF0KKyAgICAvLyAgLi4uCisgICAgQkIgPSBzaW5rTUJCOworICAgIEJ1aWxkTUkoKkJCLCBCQi0+YmVnaW4oKSwgZGwsCisgICAgICAgICAgICBUSUktPmdldChBUk06OlBISSksIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKQorICAgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkuYWRkTUJCKGNvcHkwTUJCKQorICAgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSkuYWRkTUJCKHRoaXNNQkIpOworCisgICAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisgICAgcmV0dXJuIEJCOworICB9CisKKyAgY2FzZSBBUk06OkJDQ2k2NDoKKyAgY2FzZSBBUk06OkJDQ1ppNjQ6IHsKKyAgICAvLyBDb21wYXJlIGJvdGggcGFydHMgdGhhdCBtYWtlIHVwIHRoZSBkb3VibGUgY29tcGFyaXNvbiBzZXBhcmF0ZWx5IGZvcgorICAgIC8vIGVxdWFsaXR5LgorICAgIGJvb2wgUkhTaXNaZXJvID0gTUktPmdldE9wY29kZSgpID09IEFSTTo6QkNDWmk2NDsKKworICAgIHVuc2lnbmVkIExIUzEgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBMSFMyID0gTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCk7CisgICAgaWYgKFJIU2lzWmVybykgeworICAgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShCQiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJSS0+Z2V0KGlzVGh1bWIyID8gQVJNOjp0MkNNUHJpIDogQVJNOjpDTVByaSkpCisgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKExIUzEpLmFkZEltbSgwKSk7CisgICAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXNUaHVtYjIgPyBBUk06OnQyQ01QcmkgOiBBUk06OkNNUHJpKSkKKyAgICAgICAgLmFkZFJlZyhMSFMyKS5hZGRJbW0oMCkKKyAgICAgICAgLmFkZEltbShBUk1DQzo6RVEpLmFkZFJlZyhBUk06OkNQU1IpOworICAgIH0gZWxzZSB7CisgICAgICB1bnNpZ25lZCBSSFMxID0gTUktPmdldE9wZXJhbmQoMykuZ2V0UmVnKCk7CisgICAgICB1bnNpZ25lZCBSSFMyID0gTUktPmdldE9wZXJhbmQoNCkuZ2V0UmVnKCk7CisgICAgICBBZGREZWZhdWx0UHJlZChCdWlsZE1JKEJCLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoaXNUaHVtYjIgPyBBUk06OnQyQ01QcnIgOiBBUk06OkNNUHJyKSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoTEhTMSkuYWRkUmVnKFJIUzEpKTsKKyAgICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChpc1RodW1iMiA/IEFSTTo6dDJDTVByciA6IEFSTTo6Q01QcnIpKQorICAgICAgICAuYWRkUmVnKExIUzIpLmFkZFJlZyhSSFMyKQorICAgICAgICAuYWRkSW1tKEFSTUNDOjpFUSkuYWRkUmVnKEFSTTo6Q1BTUik7CisgICAgfQorCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKmRlc3RNQkIgPSBNSS0+Z2V0T3BlcmFuZChSSFNpc1plcm8gPyAzIDogNSkuZ2V0TUJCKCk7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKmV4aXRNQkIgPSBPdGhlclN1Y2MoQkIsIGRlc3RNQkIpOworICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRJbW0oKSA9PSBBUk1DQzo6TkUpCisgICAgICBzdGQ6OnN3YXAoZGVzdE1CQiwgZXhpdE1CQik7CisKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXNUaHVtYjIgPyBBUk06OnQyQmNjIDogQVJNOjpCY2MpKQorICAgICAgLmFkZE1CQihkZXN0TUJCKS5hZGRJbW0oQVJNQ0M6OkVRKS5hZGRSZWcoQVJNOjpDUFNSKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXNUaHVtYjIgPyBBUk06OnQyQiA6IEFSTTo6QikpCisgICAgICAuYWRkTUJCKGV4aXRNQkIpOworCisgICAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisgICAgcmV0dXJuIEJCOworICB9CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNIE9wdGltaXphdGlvbiBIb29rcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RhdGljCitTRFZhbHVlIGNvbWJpbmVTZWxlY3RBbmRVc2UoU0ROb2RlICpOLCBTRFZhbHVlIFNsY3QsIFNEVmFsdWUgT3RoZXJPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZzo6REFHQ29tYmluZXJJbmZvICZEQ0kpIHsKKyAgU2VsZWN0aW9uREFHICZEQUcgPSBEQ0kuREFHOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIHVuc2lnbmVkIE9wYyA9IE4tPmdldE9wY29kZSgpOworICBib29sIGlzU2xjdENDID0gU2xjdC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNFTEVDVF9DQzsKKyAgU0RWYWx1ZSBMSFMgPSBpc1NsY3RDQyA/IFNsY3QuZ2V0T3BlcmFuZCgyKSA6IFNsY3QuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBSSFMgPSBpc1NsY3RDQyA/IFNsY3QuZ2V0T3BlcmFuZCgzKSA6IFNsY3QuZ2V0T3BlcmFuZCgyKTsKKyAgSVNEOjpDb25kQ29kZSBDQyA9IElTRDo6U0VUQ0NfSU5WQUxJRDsKKworICBpZiAoaXNTbGN0Q0MpIHsKKyAgICBDQyA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KFNsY3QuZ2V0T3BlcmFuZCg0KSktPmdldCgpOworICB9IGVsc2UgeworICAgIFNEVmFsdWUgQ0NPcCA9IFNsY3QuZ2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoQ0NPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNFVENDKQorICAgICAgQ0MgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihDQ09wLmdldE9wZXJhbmQoMikpLT5nZXQoKTsKKyAgfQorCisgIGJvb2wgRG9YZm9ybSA9IGZhbHNlOworICBib29sIEludkNDID0gZmFsc2U7CisgIGFzc2VydCAoKE9wYyA9PSBJU0Q6OkFERCB8fCAoT3BjID09IElTRDo6U1VCICYmIFNsY3QgPT0gTi0+Z2V0T3BlcmFuZCgxKSkpICYmCisgICAgICAgICAgIkJhZCBpbnB1dCEiKTsKKworICBpZiAoTEhTLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQgJiYKKyAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KExIUyktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICBEb1hmb3JtID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChDQyAhPSBJU0Q6OlNFVENDX0lOVkFMSUQgJiYKKyAgICAgICAgICAgICBSSFMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJgorICAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KFJIUyktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgIFNEVmFsdWUgT3AwID0gU2xjdC5nZXRPcGVyYW5kKDApOworICAgIEVWVCBPcFZUID0gaXNTbGN0Q0MgPyBPcDAuZ2V0VmFsdWVUeXBlKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBPcDAuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICBib29sIGlzSW50ID0gT3BWVC5pc0ludGVnZXIoKTsKKyAgICBDQyA9IElTRDo6Z2V0U2V0Q0NJbnZlcnNlKENDLCBpc0ludCk7CisKKyAgICBpZiAoIVRMSS5pc0NvbmRDb2RlTGVnYWwoQ0MsIE9wVlQpKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsgICAgICAgICAvLyBJbnZlcnNlIG9wZXJhdG9yIGlzbid0IGxlZ2FsLgorCisgICAgRG9YZm9ybSA9IHRydWU7CisgICAgSW52Q0MgPSB0cnVlOworICB9CisKKyAgaWYgKERvWGZvcm0pIHsKKyAgICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXROb2RlKE9wYywgUkhTLmdldERlYnVnTG9jKCksIFZULCBPdGhlck9wLCBSSFMpOworICAgIGlmIChpc1NsY3RDQykKKyAgICAgIHJldHVybiBEQUcuZ2V0U2VsZWN0Q0MoTi0+Z2V0RGVidWdMb2MoKSwgT3RoZXJPcCwgUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGN0LmdldE9wZXJhbmQoMCksIFNsY3QuZ2V0T3BlcmFuZCgxKSwgQ0MpOworICAgIFNEVmFsdWUgQ0NPcCA9IFNsY3QuZ2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoSW52Q0MpCisgICAgICBDQ09wID0gREFHLmdldFNldENDKFNsY3QuZ2V0RGVidWdMb2MoKSwgQ0NPcC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NPcC5nZXRPcGVyYW5kKDApLCBDQ09wLmdldE9wZXJhbmQoMSksIENDKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICBDQ09wLCBPdGhlck9wLCBSZXN1bHQpOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBQZXJmb3JtQUREQ29tYmluZVdpdGhPcGVyYW5kcyAtIFRyeSBEQUcgY29tYmluYXRpb25zIGZvciBhbiBBREQgd2l0aAorLy8vIG9wZXJhbmRzIE4wIGFuZCBOMS4gIFRoaXMgaXMgYSBoZWxwZXIgZm9yIFBlcmZvcm1BRERDb21iaW5lIHRoYXQgaXMKKy8vLyBjYWxsZWQgd2l0aCB0aGUgZGVmYXVsdCBvcGVyYW5kcywgYW5kIGlmIHRoYXQgZmFpbHMsIHdpdGggY29tbXV0ZWQKKy8vLyBvcGVyYW5kcy4KK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1BRERDb21iaW5lV2l0aE9wZXJhbmRzKFNETm9kZSAqTiwgU0RWYWx1ZSBOMCwgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TG93ZXJpbmc6OkRBR0NvbWJpbmVySW5mbyAmRENJKSB7CisgIFNlbGVjdGlvbkRBRyAmREFHID0gRENJLkRBRzsKKworICAvLyBmb2xkIChhZGQgKHNlbGVjdCBjYywgMCwgYyksIHgpIC0+IChzZWxlY3QgY2MsIHgsIChhZGQsIHgsIGMpKQorICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRUxFQ1QgJiYgTjAuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkgeworICAgIFNEVmFsdWUgUmVzdWx0ID0gY29tYmluZVNlbGVjdEFuZFVzZShOLCBOMCwgTjEsIERDSSk7CisgICAgaWYgKFJlc3VsdC5nZXROb2RlKCkpIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLyBmb2xkIChhZGQgKGFybV9uZW9uX3ZhYmQgYSwgYikgYykgLT4gKGFybV9uZW9uX3ZhYmEgYywgYSwgYikKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4gJiYgVlQuaXNJbnRlZ2VyKCkpIHsKKyAgICB1bnNpZ25lZCBJbnRObyA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMCkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBpZiAoSW50Tm8gPT0gSW50cmluc2ljOjphcm1fbmVvbl92YWJkcykKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEludHJpbnNpYzo6YXJtX25lb25fdmFiYXMsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOMSwgTjAuZ2V0T3BlcmFuZCgxKSwgTjAuZ2V0T3BlcmFuZCgyKSk7CisgICAgaWYgKEludE5vID09IEludHJpbnNpYzo6YXJtX25lb25fdmFiZHUpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4sIE4tPmdldERlYnVnTG9jKCksIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6OmFybV9uZW9uX3ZhYmF1LCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgTjEsIE4wLmdldE9wZXJhbmQoMSksIE4wLmdldE9wZXJhbmQoMikpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIFBlcmZvcm1BRERDb21iaW5lIC0gVGFyZ2V0LXNwZWNpZmljIGRhZyBjb21iaW5lIHhmb3JtcyBmb3IgSVNEOjpBREQuCisvLy8KK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1BRERDb21iaW5lKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldExvd2VyaW5nOjpEQUdDb21iaW5lckluZm8gJkRDSSkgeworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisKKyAgLy8gRmlyc3QgdHJ5IHdpdGggdGhlIGRlZmF1bHQgb3BlcmFuZCBvcmRlci4KKyAgU0RWYWx1ZSBSZXN1bHQgPSBQZXJmb3JtQUREQ29tYmluZVdpdGhPcGVyYW5kcyhOLCBOMCwgTjEsIERDSSk7CisgIGlmIChSZXN1bHQuZ2V0Tm9kZSgpKQorICAgIHJldHVybiBSZXN1bHQ7CisKKyAgLy8gSWYgdGhhdCBkaWRuJ3Qgd29yaywgdHJ5IGFnYWluIHdpdGggdGhlIG9wZXJhbmRzIGNvbW11dGVkLgorICByZXR1cm4gUGVyZm9ybUFERENvbWJpbmVXaXRoT3BlcmFuZHMoTiwgTjEsIE4wLCBEQ0kpOworfQorCisvLy8gUGVyZm9ybVNVQkNvbWJpbmUgLSBUYXJnZXQtc3BlY2lmaWMgZGFnIGNvbWJpbmUgeGZvcm1zIGZvciBJU0Q6OlNVQi4KKy8vLworc3RhdGljIFNEVmFsdWUgUGVyZm9ybVNVQkNvbWJpbmUoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TG93ZXJpbmc6OkRBR0NvbWJpbmVySW5mbyAmRENJKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIE4xID0gTi0+Z2V0T3BlcmFuZCgxKTsKKworICAvLyBmb2xkIChzdWIgeCwgKHNlbGVjdCBjYywgMCwgYykpIC0+IChzZWxlY3QgY2MsIHgsIChzdWIsIHgsIGMpKQorICBpZiAoTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRUxFQ1QgJiYgTjEuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkgeworICAgIFNEVmFsdWUgUmVzdWx0ID0gY29tYmluZVNlbGVjdEFuZFVzZShOLCBOMSwgTjAsIERDSSk7CisgICAgaWYgKFJlc3VsdC5nZXROb2RlKCkpIHJldHVybiBSZXN1bHQ7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitzdGF0aWMgU0RWYWx1ZSBQZXJmb3JtTVVMQ29tYmluZShTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZzo6REFHQ29tYmluZXJJbmZvICZEQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgKlN1YnRhcmdldCkgeworICBTZWxlY3Rpb25EQUcgJkRBRyA9IERDSS5EQUc7CisKKyAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBpZiAoREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLgorICAgICAgZ2V0RnVuY3Rpb24oKS0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6T3B0aW1pemVGb3JTaXplKSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIGlmIChEQ0kuaXNCZWZvcmVMZWdhbGl6ZSgpIHx8IERDSS5pc0NhbGxlZEJ5TGVnYWxpemVyKCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIGlmIChWVCAhPSBNVlQ6OmkzMikKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpOworICBpZiAoIUMpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICB1aW50NjRfdCBNdWxBbXQgPSBDLT5nZXRaRXh0VmFsdWUoKTsKKyAgdW5zaWduZWQgU2hpZnRBbXQgPSBDb3VudFRyYWlsaW5nWmVyb3NfNjQoTXVsQW10KTsKKyAgU2hpZnRBbXQgPSBTaGlmdEFtdCAmICgzMiAtIDEpOworICBTRFZhbHVlIFYgPSBOLT5nZXRPcGVyYW5kKDApOworICBEZWJ1Z0xvYyBETCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgU0RWYWx1ZSBSZXM7CisgIE11bEFtdCA+Pj0gU2hpZnRBbXQ7CisgIGlmIChpc1Bvd2VyT2YyXzMyKE11bEFtdCAtIDEpKSB7CisgICAgLy8gKG11bCB4LCAyXk4gKyAxKSA9PiAoYWRkIChzaGwgeCwgTiksIHgpCisgICAgUmVzID0gREFHLmdldE5vZGUoSVNEOjpBREQsIERMLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICBWLCBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYsIERBRy5nZXRDb25zdGFudChMb2cyXzMyKE11bEFtdC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpKSk7CisgIH0gZWxzZSBpZiAoaXNQb3dlck9mMl8zMihNdWxBbXQgKyAxKSkgeworICAgIC8vIChtdWwgeCwgMl5OIC0gMSkgPT4gKHN1YiAoc2hsIHgsIE4pLCB4KQorICAgIFJlcyA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBETCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTSEwsIERMLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWLCBEQUcuZ2V0Q29uc3RhbnQoTG9nMl8zMihNdWxBbXQrMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTMyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYpOworICB9IGVsc2UKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIGlmIChTaGlmdEFtdCAhPSAwKQorICAgIFJlcyA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBETCwgVlQsIFJlcywKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoU2hpZnRBbXQsIE1WVDo6aTMyKSk7CisKKyAgLy8gRG8gbm90IGFkZCBuZXcgbm9kZXMgdG8gREFHIGNvbWJpbmVyIHdvcmtsaXN0LgorICBEQ0kuQ29tYmluZVRvKE4sIFJlcywgZmFsc2UpOworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gUGVyZm9ybU9SQ29tYmluZSAtIFRhcmdldC1zcGVjaWZpYyBkYWcgY29tYmluZSB4Zm9ybXMgZm9yIElTRDo6T1IKK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1PUkNvbWJpbmUoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZzo6REFHQ29tYmluZXJJbmZvICZEQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAqU3VidGFyZ2V0KSB7CisgIC8vIFRyeSB0byB1c2UgdGhlIEFSTS9UaHVtYjIgQkZJIChiaXRmaWVsZCBpbnNlcnQpIGluc3RydWN0aW9uIHdoZW4KKyAgLy8gcmVhc29uYWJsZS4KKworICAvLyBCRkkgaXMgb25seSBhdmFpbGFibGUgb24gVjZUMisKKyAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkgfHwgIVN1YnRhcmdldC0+aGFzVjZUMk9wcygpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgU2VsZWN0aW9uREFHICZEQUcgPSBEQ0kuREFHOworICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKSwgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBEZWJ1Z0xvYyBETCA9IE4tPmdldERlYnVnTG9jKCk7CisgIC8vIDEpIG9yIChhbmQgQSwgbWFzayksIHZhbCA9PiBBUk1iZmkgQSwgdmFsLCBtYXNrCisgIC8vICAgICAgaWZmICh2YWwgJiBtYXNrKSA9PSB2YWwKKyAgLy8KKyAgLy8gMikgb3IgKGFuZCBBLCBtYXNrKSwgKGFuZCBCLCBtYXNrMikgPT4gQVJNYmZpIEEsIChsc3IgQiwgYW10KSwgbWFzaworICAvLyAgMmEpIGlmZiBpc0JpdEZpZWxkSW52ZXJ0ZWRNYXNrKG1hc2spICYmIGlzQml0RmllbGRJbnZlcnRlZE1hc2sofm1hc2syKQorICAvLyAgICAgICAgICAmJiBDb3VudFBvcHVsYXRpb25fMzIobWFzaykgPT0gQ291bnRQb3B1bGF0aW9uXzMyKH5tYXNrMikKKyAgLy8gIDJiKSBpZmYgaXNCaXRGaWVsZEludmVydGVkTWFzayh+bWFzaykgJiYgaXNCaXRGaWVsZEludmVydGVkTWFzayhtYXNrMikKKyAgLy8gICAgICAgICAgJiYgQ291bnRQb3B1bGF0aW9uXzMyKG1hc2spID09IENvdW50UG9wdWxhdGlvbl8zMih+bWFzazIpCisgIC8vICAoaS5lLiwgY29weSBhIGJpdGZpZWxkIHZhbHVlIGludG8gYW5vdGhlciBiaXRmaWVsZCBvZiB0aGUgc2FtZSB3aWR0aCkKKyAgaWYgKE4wLmdldE9wY29kZSgpICE9IElTRDo6QU5EKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBpZiAoVlQgIT0gTVZUOjppMzIpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworCisgIC8vIFRoZSB2YWx1ZSBhbmQgdGhlIG1hc2sgbmVlZCB0byBiZSBjb25zdGFudHMgc28gd2UgY2FuIHZlcmlmeSB0aGlzIGlzCisgIC8vIGFjdHVhbGx5IGEgYml0ZmllbGQgc2V0LiBJZiB0aGUgbWFzayBpcyAweGZmZmYsIHdlIGNhbiBkbyBiZXR0ZXIKKyAgLy8gdmlhIGEgbW92dCBpbnN0cnVjdGlvbiwgc28gZG9uJ3QgdXNlIEJGSSBpbiB0aGF0IGNhc2UuCisgIENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE9wZXJhbmQoMSkpOworICBpZiAoIUMpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgdW5zaWduZWQgTWFzayA9IEMtPmdldFpFeHRWYWx1ZSgpOworICBpZiAoTWFzayA9PSAweGZmZmYpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgU0RWYWx1ZSBSZXM7CisgIC8vIENhc2UgKDEpOiBvciAoYW5kIEEsIG1hc2spLCB2YWwgPT4gQVJNYmZpIEEsIHZhbCwgbWFzaworICBpZiAoKEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEpKSkgeworICAgIHVuc2lnbmVkIFZhbCA9IEMtPmdldFpFeHRWYWx1ZSgpOworICAgIGlmICghQVJNOjppc0JpdEZpZWxkSW52ZXJ0ZWRNYXNrKE1hc2spIHx8IChWYWwgJiB+TWFzaykgIT0gVmFsKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICBWYWwgPj49IENvdW50VHJhaWxpbmdaZXJvc18zMih+TWFzayk7CisKKyAgICBSZXMgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkJGSSwgREwsIFZULCBOMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChWYWwsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTWFzaywgTVZUOjppMzIpKTsKKworICAgIC8vIERvIG5vdCBhZGQgbmV3IG5vZGVzIHRvIERBRyBjb21iaW5lciB3b3JrbGlzdC4KKyAgICBEQ0kuQ29tYmluZVRvKE4sIFJlcywgZmFsc2UpOworICB9IGVsc2UgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6QU5EKSB7CisgICAgLy8gY2FzZSAoMikgb3IgKGFuZCBBLCBtYXNrKSwgKGFuZCBCLCBtYXNrMikgPT4gQVJNYmZpIEEsIChsc3IgQiwgYW10KSwgbWFzaworICAgIEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEuZ2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKCFDKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICB1bnNpZ25lZCBNYXNrMiA9IEMtPmdldFpFeHRWYWx1ZSgpOworCisgICAgaWYgKEFSTTo6aXNCaXRGaWVsZEludmVydGVkTWFzayhNYXNrKSAmJgorICAgICAgICBBUk06OmlzQml0RmllbGRJbnZlcnRlZE1hc2sofk1hc2syKSAmJgorICAgICAgICAoQ291bnRQb3B1bGF0aW9uXzMyKE1hc2spID09IENvdW50UG9wdWxhdGlvbl8zMih+TWFzazIpKSkgeworICAgICAgLy8gVGhlIHBhY2sgaGFsZndvcmQgaW5zdHJ1Y3Rpb24gd29ya3MgYmV0dGVyIGZvciBtYXNrcyB0aGF0IGZpdCBpdCwKKyAgICAgIC8vIHNvIHVzZSB0aGF0IHdoZW4gaXQncyBhdmFpbGFibGUuCisgICAgICBpZiAoU3VidGFyZ2V0LT5oYXNUMkV4dHJhY3RQYWNrKCkgJiYKKyAgICAgICAgICAoTWFzayA9PSAweGZmZmYgfHwgTWFzayA9PSAweGZmZmYwMDAwKSkKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICAgIC8vIDJhCisgICAgICB1bnNpZ25lZCBsc2IgPSBDb3VudFRyYWlsaW5nWmVyb3NfMzIoTWFzazIpOworICAgICAgUmVzID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIERMLCBWVCwgTjEuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChsc2IsIE1WVDo6aTMyKSk7CisgICAgICBSZXMgPSBEQUcuZ2V0Tm9kZShBUk1JU0Q6OkJGSSwgREwsIFZULCBOMC5nZXRPcGVyYW5kKDApLCBSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTWFzaywgTVZUOjppMzIpKTsKKyAgICAgIC8vIERvIG5vdCBhZGQgbmV3IG5vZGVzIHRvIERBRyBjb21iaW5lciB3b3JrbGlzdC4KKyAgICAgIERDSS5Db21iaW5lVG8oTiwgUmVzLCBmYWxzZSk7CisgICAgfSBlbHNlIGlmIChBUk06OmlzQml0RmllbGRJbnZlcnRlZE1hc2sofk1hc2spICYmCisgICAgICAgICAgICAgICBBUk06OmlzQml0RmllbGRJbnZlcnRlZE1hc2soTWFzazIpICYmCisgICAgICAgICAgICAgICAoQ291bnRQb3B1bGF0aW9uXzMyKH5NYXNrKSA9PSBDb3VudFBvcHVsYXRpb25fMzIoTWFzazIpKSkgeworICAgICAgLy8gVGhlIHBhY2sgaGFsZndvcmQgaW5zdHJ1Y3Rpb24gd29ya3MgYmV0dGVyIGZvciBtYXNrcyB0aGF0IGZpdCBpdCwKKyAgICAgIC8vIHNvIHVzZSB0aGF0IHdoZW4gaXQncyBhdmFpbGFibGUuCisgICAgICBpZiAoU3VidGFyZ2V0LT5oYXNUMkV4dHJhY3RQYWNrKCkgJiYKKyAgICAgICAgICAoTWFzazIgPT0gMHhmZmZmIHx8IE1hc2syID09IDB4ZmZmZjAwMDApKQorICAgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgICAgLy8gMmIKKyAgICAgIHVuc2lnbmVkIGxzYiA9IENvdW50VHJhaWxpbmdaZXJvc18zMihNYXNrKTsKKyAgICAgIFJlcyA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBETCwgVlQsIE4wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQobHNiLCBNVlQ6OmkzMikpOworICAgICAgUmVzID0gREFHLmdldE5vZGUoQVJNSVNEOjpCRkksIERMLCBWVCwgTjEuZ2V0T3BlcmFuZCgwKSwgUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTWFzazIsIE1WVDo6aTMyKSk7CisgICAgICAvLyBEbyBub3QgYWRkIG5ldyBub2RlcyB0byBEQUcgY29tYmluZXIgd29ya2xpc3QuCisgICAgICBEQ0kuQ29tYmluZVRvKE4sIFJlcywgZmFsc2UpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBQZXJmb3JtVk1PVlJSRENvbWJpbmUgLSBUYXJnZXQtc3BlY2lmaWMgZGFnIGNvbWJpbmUgeGZvcm1zIGZvcgorLy8vIEFSTUlTRDo6Vk1PVlJSRC4KK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1WTU9WUlJEQ29tYmluZShTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldExvd2VyaW5nOjpEQUdDb21iaW5lckluZm8gJkRDSSkgeworICAvLyBmbXJyZChmbWRyciB4LCB5KSAtPiB4LHkKKyAgU0RWYWx1ZSBJbkRvdWJsZSA9IE4tPmdldE9wZXJhbmQoMCk7CisgIGlmIChJbkRvdWJsZS5nZXRPcGNvZGUoKSA9PSBBUk1JU0Q6OlZNT1ZEUlIpCisgICAgcmV0dXJuIERDSS5Db21iaW5lVG8oTiwgSW5Eb3VibGUuZ2V0T3BlcmFuZCgwKSwgSW5Eb3VibGUuZ2V0T3BlcmFuZCgxKSk7CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBQZXJmb3JtVkRVUExBTkVDb21iaW5lIC0gVGFyZ2V0LXNwZWNpZmljIGRhZyBjb21iaW5lIHhmb3JtcyBmb3IKKy8vLyBBUk1JU0Q6OlZEVVBMQU5FLgorc3RhdGljIFNEVmFsdWUgUGVyZm9ybVZEVVBMQU5FQ29tYmluZShTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldExvd2VyaW5nOjpEQUdDb21iaW5lckluZm8gJkRDSSkgeworICAvLyBJZiB0aGUgc291cmNlIGlzIGFscmVhZHkgYSBWTU9WSU1NIG9yIFZNVk5JTU0gc3BsYXQsIHRoZSBWRFVQTEFORSBpcworICAvLyByZWR1bmRhbnQuCisgIFNEVmFsdWUgT3AgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gSWdub3JlIGJpdF9jb252ZXJ0cy4KKyAgd2hpbGUgKE9wLmdldE9wY29kZSgpID09IElTRDo6QklUX0NPTlZFUlQpCisgICAgT3AgPSBPcC5nZXRPcGVyYW5kKDApOworICBpZiAoT3AuZ2V0T3Bjb2RlKCkgIT0gQVJNSVNEOjpWTU9WSU1NICYmIE9wLmdldE9wY29kZSgpICE9IEFSTUlTRDo6Vk1WTklNTSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgVk1PViBlbGVtZW50IHNpemUgaXMgbm90IGJpZ2dlciB0aGFuIHRoZSBWRFVQTEFORSBlbGVtZW50cy4KKyAgdW5zaWduZWQgRWx0U2l6ZSA9IE9wLmdldFZhbHVlVHlwZSgpLmdldFZlY3RvckVsZW1lbnRUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAvLyBUaGUgY2Fub25pY2FsIFZNT1YgZm9yIGEgemVybyB2ZWN0b3IgdXNlcyBhIDMyLWJpdCBlbGVtZW50IHNpemUuCisgIHVuc2lnbmVkIEltbSA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMCkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgdW5zaWduZWQgRWx0Qml0czsKKyAgaWYgKEFSTV9BTTo6ZGVjb2RlTkVPTk1vZEltbShJbW0sIEVsdEJpdHMpID09IDApCisgICAgRWx0U2l6ZSA9IDg7CisgIGlmIChFbHRTaXplID4gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5nZXRTaXplSW5CaXRzKCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBTRFZhbHVlIFJlcyA9IERDSS5EQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgT3ApOworICByZXR1cm4gRENJLkNvbWJpbmVUbyhOLCBSZXMsIGZhbHNlKTsKK30KKworLy8vIGdldFZTaGlmdEltbSAtIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBidWlsZF92ZWN0b3IgZm9yIHRoZSBpbW1lZGlhdGUKKy8vLyBvcGVyYW5kIG9mIGEgdmVjdG9yIHNoaWZ0IG9wZXJhdGlvbiwgd2hlcmUgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUKKy8vLyBidWlsZF92ZWN0b3IgbXVzdCBoYXZlIHRoZSBzYW1lIGNvbnN0YW50IGludGVnZXIgdmFsdWUuCitzdGF0aWMgYm9vbCBnZXRWU2hpZnRJbW0oU0RWYWx1ZSBPcCwgdW5zaWduZWQgRWxlbWVudEJpdHMsIGludDY0X3QgJkNudCkgeworICAvLyBJZ25vcmUgYml0X2NvbnZlcnRzLgorICB3aGlsZSAoT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCSVRfQ09OVkVSVCkKKyAgICBPcCA9IE9wLmdldE9wZXJhbmQoMCk7CisgIEJ1aWxkVmVjdG9yU0ROb2RlICpCVk4gPSBkeW5fY2FzdDxCdWlsZFZlY3RvclNETm9kZT4oT3AuZ2V0Tm9kZSgpKTsKKyAgQVBJbnQgU3BsYXRCaXRzLCBTcGxhdFVuZGVmOworICB1bnNpZ25lZCBTcGxhdEJpdFNpemU7CisgIGJvb2wgSGFzQW55VW5kZWZzOworICBpZiAoISBCVk4gfHwgISBCVk4tPmlzQ29uc3RhbnRTcGxhdChTcGxhdEJpdHMsIFNwbGF0VW5kZWYsIFNwbGF0Qml0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzQW55VW5kZWZzLCBFbGVtZW50Qml0cykgfHwKKyAgICAgIFNwbGF0Qml0U2l6ZSA+IEVsZW1lbnRCaXRzKQorICAgIHJldHVybiBmYWxzZTsKKyAgQ250ID0gU3BsYXRCaXRzLmdldFNFeHRWYWx1ZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzVlNoaWZ0TEltbSAtIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBidWlsZF92ZWN0b3IgZm9yIHRoZSBpbW1lZGlhdGUKKy8vLyBvcGVyYW5kIG9mIGEgdmVjdG9yIHNoaWZ0IGxlZnQgb3BlcmF0aW9uLiAgVGhhdCB2YWx1ZSBtdXN0IGJlIGluIHRoZSByYW5nZToKKy8vLyAgIDAgPD0gVmFsdWUgPCBFbGVtZW50Qml0cyBmb3IgYSBsZWZ0IHNoaWZ0OyBvcgorLy8vICAgMCA8PSBWYWx1ZSA8PSBFbGVtZW50Qml0cyBmb3IgYSBsb25nIGxlZnQgc2hpZnQuCitzdGF0aWMgYm9vbCBpc1ZTaGlmdExJbW0oU0RWYWx1ZSBPcCwgRVZUIFZULCBib29sIGlzTG9uZywgaW50NjRfdCAmQ250KSB7CisgIGFzc2VydChWVC5pc1ZlY3RvcigpICYmICJ2ZWN0b3Igc2hpZnQgY291bnQgaXMgbm90IGEgdmVjdG9yIHR5cGUiKTsKKyAgdW5zaWduZWQgRWxlbWVudEJpdHMgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgaWYgKCEgZ2V0VlNoaWZ0SW1tKE9wLCBFbGVtZW50Qml0cywgQ250KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiAoQ250ID49IDAgJiYgKGlzTG9uZyA/IENudC0xIDogQ250KSA8IEVsZW1lbnRCaXRzKTsKK30KKworLy8vIGlzVlNoaWZ0UkltbSAtIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBidWlsZF92ZWN0b3IgZm9yIHRoZSBpbW1lZGlhdGUKKy8vLyBvcGVyYW5kIG9mIGEgdmVjdG9yIHNoaWZ0IHJpZ2h0IG9wZXJhdGlvbi4gIEZvciBhIHNoaWZ0IG9wY29kZSwgdGhlIHZhbHVlCisvLy8gaXMgcG9zaXRpdmUsIGJ1dCBmb3IgYW4gaW50cmluc2ljIHRoZSB2YWx1ZSBjb3VudCBtdXN0IGJlIG5lZ2F0aXZlLiBUaGUKKy8vLyBhYnNvbHV0ZSB2YWx1ZSBtdXN0IGJlIGluIHRoZSByYW5nZToKKy8vLyAgIDEgPD0gfFZhbHVlfCA8PSBFbGVtZW50Qml0cyBmb3IgYSByaWdodCBzaGlmdDsgb3IKKy8vLyAgIDEgPD0gfFZhbHVlfCA8PSBFbGVtZW50Qml0cy8yIGZvciBhIG5hcnJvdyByaWdodCBzaGlmdC4KK3N0YXRpYyBib29sIGlzVlNoaWZ0UkltbShTRFZhbHVlIE9wLCBFVlQgVlQsIGJvb2wgaXNOYXJyb3csIGJvb2wgaXNJbnRyaW5zaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmQ250KSB7CisgIGFzc2VydChWVC5pc1ZlY3RvcigpICYmICJ2ZWN0b3Igc2hpZnQgY291bnQgaXMgbm90IGEgdmVjdG9yIHR5cGUiKTsKKyAgdW5zaWduZWQgRWxlbWVudEJpdHMgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgaWYgKCEgZ2V0VlNoaWZ0SW1tKE9wLCBFbGVtZW50Qml0cywgQ250KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChpc0ludHJpbnNpYykKKyAgICBDbnQgPSAtQ250OworICByZXR1cm4gKENudCA+PSAxICYmIENudCA8PSAoaXNOYXJyb3cgPyBFbGVtZW50Qml0cy8yIDogRWxlbWVudEJpdHMpKTsKK30KKworLy8vIFBlcmZvcm1JbnRyaW5zaWNDb21iaW5lIC0gQVJNLXNwZWNpZmljIERBRyBjb21iaW5pbmcgZm9yIGludHJpbnNpY3MuCitzdGF0aWMgU0RWYWx1ZSBQZXJmb3JtSW50cmluc2ljQ29tYmluZShTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIHVuc2lnbmVkIEludE5vID0gY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgwKSktPmdldFpFeHRWYWx1ZSgpOworICBzd2l0Y2ggKEludE5vKSB7CisgIGRlZmF1bHQ6CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIG1vc3QgaW50cmluc2ljcy4KKyAgICBicmVhazsKKworICAvLyBWZWN0b3Igc2hpZnRzOiBjaGVjayBmb3IgaW1tZWRpYXRlIHZlcnNpb25zIGFuZCBsb3dlciB0aGVtLgorICAvLyBOb3RlOiBUaGlzIGlzIGRvbmUgZHVyaW5nIERBRyBjb21iaW5pbmcgaW5zdGVhZCBvZiBEQUcgbGVnYWxpemluZyBiZWNhdXNlCisgIC8vIHRoZSBidWlsZF92ZWN0b3JzIGZvciA2NC1iaXQgdmVjdG9yIGVsZW1lbnQgc2hpZnQgY291bnRzIGFyZSBnZW5lcmFsbHkKKyAgLy8gbm90IGxlZ2FsLCBhbmQgaXQgaXMgaGFyZCB0byBzZWUgdGhlaXIgdmFsdWVzIGFmdGVyIHRoZXkgZ2V0IGxlZ2FsaXplZCB0bworICAvLyBsb2FkcyBmcm9tIGEgY29uc3RhbnQgcG9vbC4KKyAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZzaGlmdHM6CisgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92c2hpZnR1OgorICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0bHM6CisgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92c2hpZnRsdToKKyAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZzaGlmdG46CisgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cnNoaWZ0czoKKyAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zyc2hpZnR1OgorICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnJzaGlmdG46CisgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXNoaWZ0czoKKyAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc2hpZnR1OgorICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnFzaGlmdHN1OgorICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnFzaGlmdG5zOgorICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnFzaGlmdG51OgorICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnFzaGlmdG5zdToKKyAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxcnNoaWZ0bnM6CisgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdG51OgorICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnFyc2hpZnRuc3U6IHsKKyAgICBFVlQgVlQgPSBOLT5nZXRPcGVyYW5kKDEpLmdldFZhbHVlVHlwZSgpOworICAgIGludDY0X3QgQ250OworICAgIHVuc2lnbmVkIFZTaGlmdE9wYyA9IDA7CisKKyAgICBzd2l0Y2ggKEludE5vKSB7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZzaGlmdHM6CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZzaGlmdHU6CisgICAgICBpZiAoaXNWU2hpZnRMSW1tKE4tPmdldE9wZXJhbmQoMiksIFZULCBmYWxzZSwgQ250KSkgeworICAgICAgICBWU2hpZnRPcGMgPSBBUk1JU0Q6OlZTSEw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGlzVlNoaWZ0UkltbShOLT5nZXRPcGVyYW5kKDIpLCBWVCwgZmFsc2UsIHRydWUsIENudCkpIHsKKyAgICAgICAgVlNoaWZ0T3BjID0gKEludE5vID09IEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0cyA/CisgICAgICAgICAgICAgICAgICAgICBBUk1JU0Q6OlZTSFJzIDogQVJNSVNEOjpWU0hSdSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92c2hpZnRsczoKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0bHU6CisgICAgICBpZiAoaXNWU2hpZnRMSW1tKE4tPmdldE9wZXJhbmQoMiksIFZULCB0cnVlLCBDbnQpKQorICAgICAgICBicmVhazsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoImludmFsaWQgc2hpZnQgY291bnQgZm9yIHZzaGxsIGludHJpbnNpYyIpOworCisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zyc2hpZnRzOgorICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cnNoaWZ0dToKKyAgICAgIGlmIChpc1ZTaGlmdFJJbW0oTi0+Z2V0T3BlcmFuZCgyKSwgVlQsIGZhbHNlLCB0cnVlLCBDbnQpKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnFzaGlmdHM6CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc2hpZnR1OgorICAgICAgaWYgKGlzVlNoaWZ0TEltbShOLT5nZXRPcGVyYW5kKDIpLCBWVCwgZmFsc2UsIENudCkpCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXNoaWZ0c3U6CisgICAgICBpZiAoaXNWU2hpZnRMSW1tKE4tPmdldE9wZXJhbmQoMiksIFZULCBmYWxzZSwgQ250KSkKKyAgICAgICAgYnJlYWs7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIHNoaWZ0IGNvdW50IGZvciB2cXNobHUgaW50cmluc2ljIik7CisKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0bjoKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnJzaGlmdG46CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc2hpZnRuczoKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnFzaGlmdG51OgorICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXNoaWZ0bnN1OgorICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdG5zOgorICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdG51OgorICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdG5zdToKKyAgICAgIC8vIE5hcnJvd2luZyBzaGlmdHMgcmVxdWlyZSBhbiBpbW1lZGlhdGUgcmlnaHQgc2hpZnQuCisgICAgICBpZiAoaXNWU2hpZnRSSW1tKE4tPmdldE9wZXJhbmQoMiksIFZULCB0cnVlLCB0cnVlLCBDbnQpKQorICAgICAgICBicmVhazsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoImludmFsaWQgc2hpZnQgY291bnQgZm9yIG5hcnJvd2luZyB2ZWN0b3Igc2hpZnQgIgorICAgICAgICAgICAgICAgICAgICAgICAiaW50cmluc2ljIik7CisKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgidW5oYW5kbGVkIHZlY3RvciBzaGlmdCIpOworICAgIH0KKworICAgIHN3aXRjaCAoSW50Tm8pIHsKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0czoKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0dToKKyAgICAgIC8vIE9wY29kZSBhbHJlYWR5IHNldCBhYm92ZS4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92c2hpZnRsczoKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0bHU6CisgICAgICBpZiAoQ250ID09IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkuZ2V0U2l6ZUluQml0cygpKQorICAgICAgICBWU2hpZnRPcGMgPSBBUk1JU0Q6OlZTSExMaTsKKyAgICAgIGVsc2UKKyAgICAgICAgVlNoaWZ0T3BjID0gKEludE5vID09IEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0bHMgPworICAgICAgICAgICAgICAgICAgICAgQVJNSVNEOjpWU0hMTHMgOiBBUk1JU0Q6OlZTSExMdSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0bjoKKyAgICAgIFZTaGlmdE9wYyA9IEFSTUlTRDo6VlNIUk47IGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cnNoaWZ0czoKKyAgICAgIFZTaGlmdE9wYyA9IEFSTUlTRDo6VlJTSFJzOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnJzaGlmdHU6CisgICAgICBWU2hpZnRPcGMgPSBBUk1JU0Q6OlZSU0hSdTsgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zyc2hpZnRuOgorICAgICAgVlNoaWZ0T3BjID0gQVJNSVNEOjpWUlNIUk47IGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXNoaWZ0czoKKyAgICAgIFZTaGlmdE9wYyA9IEFSTUlTRDo6VlFTSExzOyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnFzaGlmdHU6CisgICAgICBWU2hpZnRPcGMgPSBBUk1JU0Q6OlZRU0hMdTsgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc2hpZnRzdToKKyAgICAgIFZTaGlmdE9wYyA9IEFSTUlTRDo6VlFTSExzdTsgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc2hpZnRuczoKKyAgICAgIFZTaGlmdE9wYyA9IEFSTUlTRDo6VlFTSFJOczsgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc2hpZnRudToKKyAgICAgIFZTaGlmdE9wYyA9IEFSTUlTRDo6VlFTSFJOdTsgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc2hpZnRuc3U6CisgICAgICBWU2hpZnRPcGMgPSBBUk1JU0Q6OlZRU0hSTnN1OyBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6YXJtX25lb25fdnFyc2hpZnRuczoKKyAgICAgIFZTaGlmdE9wYyA9IEFSTUlTRDo6VlFSU0hSTnM7IGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdG51OgorICAgICAgVlNoaWZ0T3BjID0gQVJNSVNEOjpWUVJTSFJOdTsgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxcnNoaWZ0bnN1OgorICAgICAgVlNoaWZ0T3BjID0gQVJNSVNEOjpWUVJTSFJOc3U7IGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShWU2hpZnRPcGMsIE4tPmdldERlYnVnTG9jKCksIE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKSwgREFHLmdldENvbnN0YW50KENudCwgTVZUOjppMzIpKTsKKyAgfQorCisgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92c2hpZnRpbnM6IHsKKyAgICBFVlQgVlQgPSBOLT5nZXRPcGVyYW5kKDEpLmdldFZhbHVlVHlwZSgpOworICAgIGludDY0X3QgQ250OworICAgIHVuc2lnbmVkIFZTaGlmdE9wYyA9IDA7CisKKyAgICBpZiAoaXNWU2hpZnRMSW1tKE4tPmdldE9wZXJhbmQoMyksIFZULCBmYWxzZSwgQ250KSkKKyAgICAgIFZTaGlmdE9wYyA9IEFSTUlTRDo6VlNMSTsKKyAgICBlbHNlIGlmIChpc1ZTaGlmdFJJbW0oTi0+Z2V0T3BlcmFuZCgzKSwgVlQsIGZhbHNlLCB0cnVlLCBDbnQpKQorICAgICAgVlNoaWZ0T3BjID0gQVJNSVNEOjpWU1JJOworICAgIGVsc2UgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiaW52YWxpZCBzaGlmdCBjb3VudCBmb3IgdnNsaS92c3JpIGludHJpbnNpYyIpOworICAgIH0KKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShWU2hpZnRPcGMsIE4tPmdldERlYnVnTG9jKCksIE4tPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKSwgTi0+Z2V0T3BlcmFuZCgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KENudCwgTVZUOjppMzIpKTsKKyAgfQorCisgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdHM6CisgIGNhc2UgSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdHU6CisgICAgLy8gTm8gaW1tZWRpYXRlIHZlcnNpb25zIG9mIHRoZXNlIHRvIGNoZWNrIGZvci4KKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBQZXJmb3JtU2hpZnRDb21iaW5lIC0gQ2hlY2tzIGZvciBpbW1lZGlhdGUgdmVyc2lvbnMgb2YgdmVjdG9yIHNoaWZ0cyBhbmQKKy8vLyBsb3dlcnMgdGhlbS4gIEFzIHdpdGggdGhlIHZlY3RvciBzaGlmdCBpbnRyaW5zaWNzLCB0aGlzIGlzIGRvbmUgZHVyaW5nIERBRworLy8vIGNvbWJpbmluZyBpbnN0ZWFkIG9mIERBRyBsZWdhbGl6aW5nIGJlY2F1c2UgdGhlIGJ1aWxkX3ZlY3RvcnMgZm9yIDY0LWJpdAorLy8vIHZlY3RvciBlbGVtZW50IHNoaWZ0IGNvdW50cyBhcmUgZ2VuZXJhbGx5IG5vdCBsZWdhbCwgYW5kIGl0IGlzIGhhcmQgdG8gc2VlCisvLy8gdGhlaXIgdmFsdWVzIGFmdGVyIHRoZXkgZ2V0IGxlZ2FsaXplZCB0byBsb2FkcyBmcm9tIGEgY29uc3RhbnQgcG9vbC4KK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1TaGlmdENvbWJpbmUoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVJNU3VidGFyZ2V0ICpTVCkgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisKKyAgLy8gTm90aGluZyB0byBiZSBkb25lIGZvciBzY2FsYXIgc2hpZnRzLgorICBpZiAoISBWVC5pc1ZlY3RvcigpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgYXNzZXJ0KFNULT5oYXNORU9OKCkgJiYgInVuZXhwZWN0ZWQgdmVjdG9yIHNoaWZ0Iik7CisgIGludDY0X3QgQ250OworCisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgidW5leHBlY3RlZCBzaGlmdCBvcGNvZGUiKTsKKworICBjYXNlIElTRDo6U0hMOgorICAgIGlmIChpc1ZTaGlmdExJbW0oTi0+Z2V0T3BlcmFuZCgxKSwgVlQsIGZhbHNlLCBDbnQpKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKEFSTUlTRDo6VlNITCwgTi0+Z2V0RGVidWdMb2MoKSwgVlQsIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KENudCwgTVZUOjppMzIpKTsKKyAgICBicmVhazsKKworICBjYXNlIElTRDo6U1JBOgorICBjYXNlIElTRDo6U1JMOgorICAgIGlmIChpc1ZTaGlmdFJJbW0oTi0+Z2V0T3BlcmFuZCgxKSwgVlQsIGZhbHNlLCBmYWxzZSwgQ250KSkgeworICAgICAgdW5zaWduZWQgVlNoaWZ0T3BjID0gKE4tPmdldE9wY29kZSgpID09IElTRDo6U1JBID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1JU0Q6OlZTSFJzIDogQVJNSVNEOjpWU0hSdSk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoVlNoaWZ0T3BjLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQ250LCBNVlQ6OmkzMikpOworICAgIH0KKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gUGVyZm9ybUV4dGVuZENvbWJpbmUgLSBUYXJnZXQtc3BlY2lmaWMgREFHIGNvbWJpbmluZyBmb3IgSVNEOjpTSUdOX0VYVEVORCwKKy8vLyBJU0Q6OlpFUk9fRVhURU5ELCBhbmQgSVNEOjpBTllfRVhURU5ELgorc3RhdGljIFNEVmFsdWUgUGVyZm9ybUV4dGVuZENvbWJpbmUoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAqU1QpIHsKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisKKyAgLy8gQ2hlY2sgZm9yIHNpZ24tIGFuZCB6ZXJvLWV4dGVuc2lvbnMgb2YgdmVjdG9yIGV4dHJhY3Qgb3BlcmF0aW9ucyBvZiA4LQorICAvLyBhbmQgMTYtYml0IHZlY3RvciBlbGVtZW50cy4gIE5FT04gc3VwcG9ydHMgdGhlc2UgZGlyZWN0bHkuICBUaGV5IGFyZQorICAvLyBoYW5kbGVkIGR1cmluZyBEQUcgY29tYmluaW5nIGJlY2F1c2UgdHlwZSBsZWdhbGl6YXRpb24gd2lsbCBwcm9tb3RlIHRoZW0KKyAgLy8gdG8gMzItYml0IHR5cGVzIGFuZCBpdCBpcyBtZXNzeSB0byByZWNvZ25pemUgdGhlIG9wZXJhdGlvbnMgYWZ0ZXIgdGhhdC4KKyAgaWYgKFNULT5oYXNORU9OKCkgJiYgTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQpIHsKKyAgICBTRFZhbHVlIFZlYyA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBMYW5lID0gTjAuZ2V0T3BlcmFuZCgxKTsKKyAgICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgRVZUIEVsdFZUID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSA9IERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKTsKKworICAgIGlmIChWVCA9PSBNVlQ6OmkzMiAmJgorICAgICAgICAoRWx0VlQgPT0gTVZUOjppOCB8fCBFbHRWVCA9PSBNVlQ6OmkxNikgJiYKKyAgICAgICAgVExJLmlzVHlwZUxlZ2FsKFZlYy5nZXRWYWx1ZVR5cGUoKSkpIHsKKworICAgICAgdW5zaWduZWQgT3BjID0gMDsKKyAgICAgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoInVuZXhwZWN0ZWQgb3Bjb2RlIik7CisgICAgICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6CisgICAgICAgIE9wYyA9IEFSTUlTRDo6VkdFVExBTkVzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpaRVJPX0VYVEVORDoKKyAgICAgIGNhc2UgSVNEOjpBTllfRVhURU5EOgorICAgICAgICBPcGMgPSBBUk1JU0Q6OlZHRVRMQU5FdTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoT3BjLCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgVmVjLCBMYW5lKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gUGVyZm9ybVNFTEVDVF9DQ0NvbWJpbmUgLSBUYXJnZXQtc3BlY2lmaWMgREFHIGNvbWJpbmluZyBmb3IgSVNEOjpTRUxFQ1RfQ0MKKy8vLyB0byBtYXRjaCBmMzIgbWF4L21pbiBwYXR0ZXJucyB0byB1c2UgTkVPTiB2bWF4L3ZtaW4gaW5zdHJ1Y3Rpb25zLgorc3RhdGljIFNEVmFsdWUgUGVyZm9ybVNFTEVDVF9DQ0NvbWJpbmUoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAqU1QpIHsKKyAgLy8gSWYgdGhlIHRhcmdldCBzdXBwb3J0cyBORU9OLCB0cnkgdG8gdXNlIHZtYXgvdm1pbiBpbnN0cnVjdGlvbnMgZm9yIGYzMgorICAvLyBzZWxlY3RzIGxpa2UgInggPCB5ID8geCA6IHkiLiAgVW5sZXNzIHRoZSBOb05hTnNGUE1hdGggb3B0aW9uIGlzIHNldCwKKyAgLy8gYmUgY2FyZWZ1bCBhYm91dCBOYU5zOiAgTkVPTidzIHZtYXgvdm1pbiByZXR1cm4gTmFOIGlmIGVpdGhlciBvcGVyYW5kIGlzCisgIC8vIGEgTmFOOyBvbmx5IGRvIHRoZSB0cmFuc2Zvcm1hdGlvbiB3aGVuIGl0IG1hdGNoZXMgdGhhdCBiZWhhdmlvci4KKworICAvLyBGb3Igbm93IG9ubHkgZG8gdGhpcyB3aGVuIHVzaW5nIE5FT04gZm9yIEZQIG9wZXJhdGlvbnM7IGlmIHVzaW5nIFZGUCwgaXQKKyAgLy8gaXMgbm90IG9idmlvdXMgdGhhdCB0aGUgYmVuZWZpdCBvdXR3ZWlnaHMgdGhlIGNvc3Qgb2Ygc3dpdGNoaW5nIHRvIHRoZQorICAvLyBORU9OIHBpcGVsaW5lLgorICBpZiAoIVNULT5oYXNORU9OKCkgfHwgIVNULT51c2VORU9ORm9yU2luZ2xlUHJlY2lzaW9uRlAoKSB8fAorICAgICAgTi0+Z2V0VmFsdWVUeXBlKDApICE9IE1WVDo6ZjMyKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgU0RWYWx1ZSBDb25kTEhTID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBDb25kUkhTID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBMSFMgPSBOLT5nZXRPcGVyYW5kKDIpOworICBTRFZhbHVlIFJIUyA9IE4tPmdldE9wZXJhbmQoMyk7CisgIElTRDo6Q29uZENvZGUgQ0MgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihOLT5nZXRPcGVyYW5kKDQpKS0+Z2V0KCk7CisKKyAgdW5zaWduZWQgT3Bjb2RlID0gMDsKKyAgYm9vbCBJc1JldmVyc2VkOworICBpZiAoREFHLmlzRXF1YWxUbyhMSFMsIENvbmRMSFMpICYmIERBRy5pc0VxdWFsVG8oUkhTLCBDb25kUkhTKSkgeworICAgIElzUmV2ZXJzZWQgPSBmYWxzZTsgLy8geCBDQyB5ID8geCA6IHkKKyAgfSBlbHNlIGlmIChEQUcuaXNFcXVhbFRvKExIUywgQ29uZFJIUykgJiYgREFHLmlzRXF1YWxUbyhSSFMsIENvbmRMSFMpKSB7CisgICAgSXNSZXZlcnNlZCA9IHRydWUgOyAvLyB4IENDIHkgPyB5IDogeAorICB9IGVsc2UgeworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICBib29sIElzVW5vcmRlcmVkOworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIElTRDo6U0VUT0xUOgorICBjYXNlIElTRDo6U0VUT0xFOgorICBjYXNlIElTRDo6U0VUTFQ6CisgIGNhc2UgSVNEOjpTRVRMRToKKyAgY2FzZSBJU0Q6OlNFVFVMVDoKKyAgY2FzZSBJU0Q6OlNFVFVMRToKKyAgICAvLyBJZiBMSFMgaXMgTmFOLCBhbiBvcmRlcmVkIGNvbXBhcmlzb24gd2lsbCBiZSBmYWxzZSBhbmQgdGhlIHJlc3VsdCB3aWxsCisgICAgLy8gYmUgdGhlIFJIUywgYnV0IHZtaW4oTmFOLCBSSFMpID0gTmFOLiAgQXZvaWQgdGhpcyBieSBjaGVja2luZyB0aGF0IExIUworICAgIC8vICE9IE5hTi4gIExpa2V3aXNlLCBmb3IgdW5vcmRlcmVkIGNvbXBhcmlzb25zLCBjaGVjayBmb3IgUkhTICE9IE5hTi4KKyAgICBJc1Vub3JkZXJlZCA9IChDQyA9PSBJU0Q6OlNFVFVMVCB8fCBDQyA9PSBJU0Q6OlNFVFVMRSk7CisgICAgaWYgKCFEQUcuaXNLbm93bk5ldmVyTmFOKElzVW5vcmRlcmVkID8gUkhTIDogTEhTKSkKKyAgICAgIGJyZWFrOworICAgIC8vIEZvciBsZXNzLXRoYW4tb3ItZXF1YWwgY29tcGFyaXNvbnMsICIrMCA8PSAtMCIgd2lsbCBiZSB0cnVlIGJ1dCB2bWluCisgICAgLy8gd2lsbCByZXR1cm4gLTAsIHNvIHZtaW4gY2FuIG9ubHkgYmUgdXNlZCBmb3IgdW5zYWZlIG1hdGggb3IgaWYgb25lIG9mCisgICAgLy8gdGhlIG9wZXJhbmRzIGlzIGtub3duIHRvIGJlIG5vbnplcm8uCisgICAgaWYgKChDQyA9PSBJU0Q6OlNFVExFIHx8IENDID09IElTRDo6U0VUT0xFIHx8IENDID09IElTRDo6U0VUVUxFKSAmJgorICAgICAgICAhVW5zYWZlRlBNYXRoICYmCisgICAgICAgICEoREFHLmlzS25vd25OZXZlclplcm8oTEhTKSB8fCBEQUcuaXNLbm93bk5ldmVyWmVybyhSSFMpKSkKKyAgICAgIGJyZWFrOworICAgIE9wY29kZSA9IElzUmV2ZXJzZWQgPyBBUk1JU0Q6OkZNQVggOiBBUk1JU0Q6OkZNSU47CisgICAgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OlNFVE9HVDoKKyAgY2FzZSBJU0Q6OlNFVE9HRToKKyAgY2FzZSBJU0Q6OlNFVEdUOgorICBjYXNlIElTRDo6U0VUR0U6CisgIGNhc2UgSVNEOjpTRVRVR1Q6CisgIGNhc2UgSVNEOjpTRVRVR0U6CisgICAgLy8gSWYgTEhTIGlzIE5hTiwgYW4gb3JkZXJlZCBjb21wYXJpc29uIHdpbGwgYmUgZmFsc2UgYW5kIHRoZSByZXN1bHQgd2lsbAorICAgIC8vIGJlIHRoZSBSSFMsIGJ1dCB2bWF4KE5hTiwgUkhTKSA9IE5hTi4gIEF2b2lkIHRoaXMgYnkgY2hlY2tpbmcgdGhhdCBMSFMKKyAgICAvLyAhPSBOYU4uICBMaWtld2lzZSwgZm9yIHVub3JkZXJlZCBjb21wYXJpc29ucywgY2hlY2sgZm9yIFJIUyAhPSBOYU4uCisgICAgSXNVbm9yZGVyZWQgPSAoQ0MgPT0gSVNEOjpTRVRVR1QgfHwgQ0MgPT0gSVNEOjpTRVRVR0UpOworICAgIGlmICghREFHLmlzS25vd25OZXZlck5hTihJc1Vub3JkZXJlZCA/IFJIUyA6IExIUykpCisgICAgICBicmVhazsKKyAgICAvLyBGb3IgZ3JlYXRlci10aGFuLW9yLWVxdWFsIGNvbXBhcmlzb25zLCAiLTAgPj0gKzAiIHdpbGwgYmUgdHJ1ZSBidXQgdm1heAorICAgIC8vIHdpbGwgcmV0dXJuICswLCBzbyB2bWF4IGNhbiBvbmx5IGJlIHVzZWQgZm9yIHVuc2FmZSBtYXRoIG9yIGlmIG9uZSBvZgorICAgIC8vIHRoZSBvcGVyYW5kcyBpcyBrbm93biB0byBiZSBub256ZXJvLgorICAgIGlmICgoQ0MgPT0gSVNEOjpTRVRHRSB8fCBDQyA9PSBJU0Q6OlNFVE9HRSB8fCBDQyA9PSBJU0Q6OlNFVFVHRSkgJiYKKyAgICAgICAgIVVuc2FmZUZQTWF0aCAmJgorICAgICAgICAhKERBRy5pc0tub3duTmV2ZXJaZXJvKExIUykgfHwgREFHLmlzS25vd25OZXZlclplcm8oUkhTKSkpCisgICAgICBicmVhazsKKyAgICBPcGNvZGUgPSBJc1JldmVyc2VkID8gQVJNSVNEOjpGTUlOIDogQVJNSVNEOjpGTUFYOworICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFPcGNvZGUpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKE9wY29kZSwgTi0+Z2V0RGVidWdMb2MoKSwgTi0+Z2V0VmFsdWVUeXBlKDApLCBMSFMsIFJIUyk7Cit9CisKK1NEVmFsdWUgQVJNVGFyZ2V0TG93ZXJpbmc6OlBlcmZvcm1EQUdDb21iaW5lKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBR0NvbWJpbmVySW5mbyAmRENJKSBjb25zdCB7CisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpBREQ6ICAgICAgICByZXR1cm4gUGVyZm9ybUFERENvbWJpbmUoTiwgRENJKTsKKyAgY2FzZSBJU0Q6OlNVQjogICAgICAgIHJldHVybiBQZXJmb3JtU1VCQ29tYmluZShOLCBEQ0kpOworICBjYXNlIElTRDo6TVVMOiAgICAgICAgcmV0dXJuIFBlcmZvcm1NVUxDb21iaW5lKE4sIERDSSwgU3VidGFyZ2V0KTsKKyAgY2FzZSBJU0Q6Ok9SOiAgICAgICAgIHJldHVybiBQZXJmb3JtT1JDb21iaW5lKE4sIERDSSwgU3VidGFyZ2V0KTsKKyAgY2FzZSBBUk1JU0Q6OlZNT1ZSUkQ6IHJldHVybiBQZXJmb3JtVk1PVlJSRENvbWJpbmUoTiwgRENJKTsKKyAgY2FzZSBBUk1JU0Q6OlZEVVBMQU5FOiByZXR1cm4gUGVyZm9ybVZEVVBMQU5FQ29tYmluZShOLCBEQ0kpOworICBjYXNlIElTRDo6SU5UUklOU0lDX1dPX0NIQUlOOiByZXR1cm4gUGVyZm9ybUludHJpbnNpY0NvbWJpbmUoTiwgRENJLkRBRyk7CisgIGNhc2UgSVNEOjpTSEw6CisgIGNhc2UgSVNEOjpTUkE6CisgIGNhc2UgSVNEOjpTUkw6ICAgICAgICByZXR1cm4gUGVyZm9ybVNoaWZ0Q29tYmluZShOLCBEQ0kuREFHLCBTdWJ0YXJnZXQpOworICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6CisgIGNhc2UgSVNEOjpaRVJPX0VYVEVORDoKKyAgY2FzZSBJU0Q6OkFOWV9FWFRFTkQ6IHJldHVybiBQZXJmb3JtRXh0ZW5kQ29tYmluZShOLCBEQ0kuREFHLCBTdWJ0YXJnZXQpOworICBjYXNlIElTRDo6U0VMRUNUX0NDOiAgcmV0dXJuIFBlcmZvcm1TRUxFQ1RfQ0NDb21iaW5lKE4sIERDSS5EQUcsIFN1YnRhcmdldCk7CisgIH0KKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworYm9vbCBBUk1UYXJnZXRMb3dlcmluZzo6YWxsb3dzVW5hbGlnbmVkTWVtb3J5QWNjZXNzZXMoRVZUIFZUKSBjb25zdCB7CisgIGlmICghU3VidGFyZ2V0LT5oYXNWNk9wcygpKQorICAgIC8vIFByZS12NiBkb2VzIG5vdCBzdXBwb3J0IHVuYWxpZ25lZCBtZW0gYWNjZXNzLgorICAgIHJldHVybiBmYWxzZTsKKworICAvLyB2NisgbWF5IG9yIG1heSBub3Qgc3VwcG9ydCB1bmFsaWduZWQgbWVtIGFjY2VzcyBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbQorICAvLyBjb25maWd1cmF0aW9uLgorICAvLyBGSVhNRTogVGhpcyBpcyBwcmV0dHkgY29uc2VydmF0aXZlLiBTaG91bGQgd2UgcHJvdmlkZSBjbWRsaW5lIG9wdGlvbiB0bworICAvLyBjb250cm9sIHRoZSBiZWhhdmlvdXI/CisgIGlmICghU3VidGFyZ2V0LT5pc1RhcmdldERhcndpbigpKQorICAgIHJldHVybiBmYWxzZTsKKworICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgTVZUOjppODoKKyAgY2FzZSBNVlQ6OmkxNjoKKyAgY2FzZSBNVlQ6OmkzMjoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgLy8gRklYTUU6IFZMRDEgZXRjIHdpdGggc3RhbmRhcmQgYWxpZ25tZW50IGlzIGxlZ2FsLgorICB9Cit9CisKK3N0YXRpYyBib29sIGlzTGVnYWxUMUFkZHJlc3NJbW1lZGlhdGUoaW50NjRfdCBWLCBFVlQgVlQpIHsKKyAgaWYgKFYgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCBTY2FsZSA9IDE7CisgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgIGNhc2UgTVZUOjppMToKKyAgY2FzZSBNVlQ6Omk4OgorICAgIC8vIFNjYWxlID09IDE7CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjppMTY6CisgICAgLy8gU2NhbGUgPT0gMjsKKyAgICBTY2FsZSA9IDI7CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjppMzI6CisgICAgLy8gU2NhbGUgPT0gNDsKKyAgICBTY2FsZSA9IDQ7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoKFYgJiAoU2NhbGUgLSAxKSkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIFYgLz0gU2NhbGU7CisgIHJldHVybiBWID09IChWICYgKCgxTEwgPDwgNSkgLSAxKSk7Cit9CisKK3N0YXRpYyBib29sIGlzTGVnYWxUMkFkZHJlc3NJbW1lZGlhdGUoaW50NjRfdCBWLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAqU3VidGFyZ2V0KSB7CisgIGJvb2wgaXNOZWcgPSBmYWxzZTsKKyAgaWYgKFYgPCAwKSB7CisgICAgaXNOZWcgPSB0cnVlOworICAgIFYgPSAtIFY7CisgIH0KKworICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICBjYXNlIE1WVDo6aTE6CisgIGNhc2UgTVZUOjppODoKKyAgY2FzZSBNVlQ6OmkxNjoKKyAgY2FzZSBNVlQ6OmkzMjoKKyAgICAvLyArIGltbTEyIG9yIC0gaW1tOAorICAgIGlmIChpc05lZykKKyAgICAgIHJldHVybiBWID09IChWICYgKCgxTEwgPDwgOCkgLSAxKSk7CisgICAgcmV0dXJuIFYgPT0gKFYgJiAoKDFMTCA8PCAxMikgLSAxKSk7CisgIGNhc2UgTVZUOjpmMzI6CisgIGNhc2UgTVZUOjpmNjQ6CisgICAgLy8gU2FtZSBhcyBBUk0gbW9kZS4gRklYTUU6IE5FT04/CisgICAgaWYgKCFTdWJ0YXJnZXQtPmhhc1ZGUDIoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoKFYgJiAzKSAhPSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFYgPj49IDI7CisgICAgcmV0dXJuIFYgPT0gKFYgJiAoKDFMTCA8PCA4KSAtIDEpKTsKKyAgfQorfQorCisvLy8gaXNMZWdhbEFkZHJlc3NJbW1lZGlhdGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW50ZWdlciB2YWx1ZSBjYW4gYmUgdXNlZAorLy8vIGFzIHRoZSBvZmZzZXQgb2YgdGhlIHRhcmdldCBhZGRyZXNzaW5nIG1vZGUgZm9yIGxvYWQgLyBzdG9yZSBvZiB0aGUKKy8vLyBnaXZlbiB0eXBlLgorc3RhdGljIGJvb2wgaXNMZWdhbEFkZHJlc3NJbW1lZGlhdGUoaW50NjRfdCBWLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgKlN1YnRhcmdldCkgeworICBpZiAoViA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghVlQuaXNTaW1wbGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkpCisgICAgcmV0dXJuIGlzTGVnYWxUMUFkZHJlc3NJbW1lZGlhdGUoViwgVlQpOworICBlbHNlIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIyKCkpCisgICAgcmV0dXJuIGlzTGVnYWxUMkFkZHJlc3NJbW1lZGlhdGUoViwgVlQsIFN1YnRhcmdldCk7CisKKyAgLy8gQVJNIG1vZGUuCisgIGlmIChWIDwgMCkKKyAgICBWID0gLSBWOworICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICBjYXNlIE1WVDo6aTE6CisgIGNhc2UgTVZUOjppODoKKyAgY2FzZSBNVlQ6OmkzMjoKKyAgICAvLyArLSBpbW0xMgorICAgIHJldHVybiBWID09IChWICYgKCgxTEwgPDwgMTIpIC0gMSkpOworICBjYXNlIE1WVDo6aTE2OgorICAgIC8vICstIGltbTgKKyAgICByZXR1cm4gViA9PSAoViAmICgoMUxMIDw8IDgpIC0gMSkpOworICBjYXNlIE1WVDo6ZjMyOgorICBjYXNlIE1WVDo6ZjY0OgorICAgIGlmICghU3VidGFyZ2V0LT5oYXNWRlAyKCkpIC8vIEZJWE1FOiBORU9OPworICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICgoViAmIDMpICE9IDApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgViA+Pj0gMjsKKyAgICByZXR1cm4gViA9PSAoViAmICgoMUxMIDw8IDgpIC0gMSkpOworICB9Cit9CisKK2Jvb2wgQVJNVGFyZ2V0TG93ZXJpbmc6OmlzTGVnYWxUMlNjYWxlZEFkZHJlc3NpbmdNb2RlKGNvbnN0IEFkZHJNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3QgeworICBpbnQgU2NhbGUgPSBBTS5TY2FsZTsKKyAgaWYgKFNjYWxlIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgY2FzZSBNVlQ6OmkxOgorICBjYXNlIE1WVDo6aTg6CisgIGNhc2UgTVZUOjppMTY6CisgIGNhc2UgTVZUOjppMzI6CisgICAgaWYgKFNjYWxlID09IDEpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyByICsgciA8PCBpbW0KKyAgICBTY2FsZSA9IFNjYWxlICYgfjE7CisgICAgcmV0dXJuIFNjYWxlID09IDIgfHwgU2NhbGUgPT0gNCB8fCBTY2FsZSA9PSA4OworICBjYXNlIE1WVDo6aTY0OgorICAgIC8vIHIgKyByCisgICAgaWYgKCgodW5zaWduZWQpQU0uSGFzQmFzZVJlZyArIFNjYWxlKSA8PSAyKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIE1WVDo6aXNWb2lkOgorICAgIC8vIE5vdGUsIHdlIGFsbG93ICJ2b2lkIiB1c2VzIChiYXNpY2FsbHksIHVzZXMgdGhhdCBhcmVuJ3QgbG9hZHMgb3IKKyAgICAvLyBzdG9yZXMpLCBiZWNhdXNlIGFybSBhbGxvd3MgZm9sZGluZyBhIHNjYWxlIGludG8gbWFueSBhcml0aG1ldGljCisgICAgLy8gb3BlcmF0aW9ucy4gIFRoaXMgc2hvdWxkIGJlIG1hZGUgbW9yZSBwcmVjaXNlIGFuZCByZXZpc2l0ZWQgbGF0ZXIuCisKKyAgICAvLyBBbGxvdyByIDw8IGltbSwgYnV0IHRoZSBpbW0gaGFzIHRvIGJlIGEgbXVsdGlwbGUgb2YgdHdvLgorICAgIGlmIChTY2FsZSAmIDEpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXNQb3dlck9mMl8zMihTY2FsZSk7CisgIH0KK30KKworLy8vIGlzTGVnYWxBZGRyZXNzaW5nTW9kZSAtIFJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzaW5nIG1vZGUgcmVwcmVzZW50ZWQKKy8vLyBieSBBTSBpcyBsZWdhbCBmb3IgdGhpcyB0YXJnZXQsIGZvciBhIGxvYWQvc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorYm9vbCBBUk1UYXJnZXRMb3dlcmluZzo6aXNMZWdhbEFkZHJlc3NpbmdNb2RlKGNvbnN0IEFkZHJNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgY29uc3QgeworICBFVlQgVlQgPSBnZXRWYWx1ZVR5cGUoVHksIHRydWUpOworICBpZiAoIWlzTGVnYWxBZGRyZXNzSW1tZWRpYXRlKEFNLkJhc2VPZmZzLCBWVCwgU3VidGFyZ2V0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2FuIG5ldmVyIGZvbGQgYWRkciBvZiBnbG9iYWwgaW50byBsb2FkL3N0b3JlLgorICBpZiAoQU0uQmFzZUdWKQorICAgIHJldHVybiBmYWxzZTsKKworICBzd2l0Y2ggKEFNLlNjYWxlKSB7CisgIGNhc2UgMDogIC8vIG5vIHNjYWxlIHJlZywgbXVzdCBiZSAicitpIiBvciAiciIsIG9yICJpIi4KKyAgICBicmVhazsKKyAgY2FzZSAxOgorICAgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIxT25seSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEZBTEwgVEhST1VHSC4KKyAgZGVmYXVsdDoKKyAgICAvLyBBUk0gZG9lc24ndCBzdXBwb3J0IGFueSBSK1Iqc2NhbGUraW1tIGFkZHIgbW9kZXMuCisgICAgaWYgKEFNLkJhc2VPZmZzKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFWVC5pc1NpbXBsZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYjIoKSkKKyAgICAgIHJldHVybiBpc0xlZ2FsVDJTY2FsZWRBZGRyZXNzaW5nTW9kZShBTSwgVlQpOworCisgICAgaW50IFNjYWxlID0gQU0uU2NhbGU7CisgICAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgTVZUOjppMToKKyAgICBjYXNlIE1WVDo6aTg6CisgICAgY2FzZSBNVlQ6OmkzMjoKKyAgICAgIGlmIChTY2FsZSA8IDApIFNjYWxlID0gLVNjYWxlOworICAgICAgaWYgKFNjYWxlID09IDEpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgLy8gciArIHIgPDwgaW1tCisgICAgICByZXR1cm4gaXNQb3dlck9mMl8zMihTY2FsZSAmIH4xKTsKKyAgICBjYXNlIE1WVDo6aTE2OgorICAgIGNhc2UgTVZUOjppNjQ6CisgICAgICAvLyByICsgcgorICAgICAgaWYgKCgodW5zaWduZWQpQU0uSGFzQmFzZVJlZyArIFNjYWxlKSA8PSAyKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2UgTVZUOjppc1ZvaWQ6CisgICAgICAvLyBOb3RlLCB3ZSBhbGxvdyAidm9pZCIgdXNlcyAoYmFzaWNhbGx5LCB1c2VzIHRoYXQgYXJlbid0IGxvYWRzIG9yCisgICAgICAvLyBzdG9yZXMpLCBiZWNhdXNlIGFybSBhbGxvd3MgZm9sZGluZyBhIHNjYWxlIGludG8gbWFueSBhcml0aG1ldGljCisgICAgICAvLyBvcGVyYXRpb25zLiAgVGhpcyBzaG91bGQgYmUgbWFkZSBtb3JlIHByZWNpc2UgYW5kIHJldmlzaXRlZCBsYXRlci4KKworICAgICAgLy8gQWxsb3cgciA8PCBpbW0sIGJ1dCB0aGUgaW1tIGhhcyB0byBiZSBhIG11bHRpcGxlIG9mIHR3by4KKyAgICAgIGlmIChTY2FsZSAmIDEpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBpc1Bvd2VyT2YyXzMyKFNjYWxlKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc0xlZ2FsSUNtcEltbWVkaWF0ZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW1tZWRpYXRlIGlzIGxlZ2FsCisvLy8gaWNtcCBpbW1lZGlhdGUsIHRoYXQgaXMgdGhlIHRhcmdldCBoYXMgaWNtcCBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIGNvbXBhcmUKKy8vLyBhIHJlZ2lzdGVyIGFnYWluc3QgdGhlIGltbWVkaWF0ZSB3aXRob3V0IGhhdmluZyB0byBtYXRlcmlhbGl6ZSB0aGUKKy8vLyBpbW1lZGlhdGUgaW50byBhIHJlZ2lzdGVyLgorYm9vbCBBUk1UYXJnZXRMb3dlcmluZzo6aXNMZWdhbElDbXBJbW1lZGlhdGUoaW50NjRfdCBJbW0pIGNvbnN0IHsKKyAgaWYgKCFTdWJ0YXJnZXQtPmlzVGh1bWIoKSkKKyAgICByZXR1cm4gQVJNX0FNOjpnZXRTT0ltbVZhbChJbW0pICE9IC0xOworICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iMigpKQorICAgIHJldHVybiBBUk1fQU06OmdldFQyU09JbW1WYWwoSW1tKSAhPSAtMTsgCisgIHJldHVybiBJbW0gPj0gMCAmJiBJbW0gPD0gMjU1OworfQorCitzdGF0aWMgYm9vbCBnZXRBUk1JbmRleGVkQWRkcmVzc1BhcnRzKFNETm9kZSAqUHRyLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTRVhUTG9hZCwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2Zmc2V0LCBib29sICZpc0luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgaWYgKFB0ci0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpBREQgJiYgUHRyLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNVQikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKFZUID09IE1WVDo6aTE2IHx8ICgoVlQgPT0gTVZUOjppOCB8fCBWVCA9PSBNVlQ6OmkxKSAmJiBpc1NFWFRMb2FkKSkgeworICAgIC8vIEFkZHJlc3NpbmdNb2RlIDMKKyAgICBCYXNlID0gUHRyLT5nZXRPcGVyYW5kKDApOworICAgIGlmIChDb25zdGFudFNETm9kZSAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFB0ci0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIGludCBSSFNDID0gKGludClSSFMtPmdldFpFeHRWYWx1ZSgpOworICAgICAgaWYgKFJIU0MgPCAwICYmIFJIU0MgPiAtMjU2KSB7CisgICAgICAgIGFzc2VydChQdHItPmdldE9wY29kZSgpID09IElTRDo6QUREKTsKKyAgICAgICAgaXNJbmMgPSBmYWxzZTsKKyAgICAgICAgT2Zmc2V0ID0gREFHLmdldENvbnN0YW50KC1SSFNDLCBSSFMtPmdldFZhbHVlVHlwZSgwKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBpc0luYyA9IChQdHItPmdldE9wY29kZSgpID09IElTRDo6QUREKTsKKyAgICBPZmZzZXQgPSBQdHItPmdldE9wZXJhbmQoMSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoVlQgPT0gTVZUOjppMzIgfHwgVlQgPT0gTVZUOjppOCB8fCBWVCA9PSBNVlQ6OmkxKSB7CisgICAgLy8gQWRkcmVzc2luZ01vZGUgMgorICAgIGlmIChDb25zdGFudFNETm9kZSAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFB0ci0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIGludCBSSFNDID0gKGludClSSFMtPmdldFpFeHRWYWx1ZSgpOworICAgICAgaWYgKFJIU0MgPCAwICYmIFJIU0MgPiAtMHgxMDAwKSB7CisgICAgICAgIGFzc2VydChQdHItPmdldE9wY29kZSgpID09IElTRDo6QUREKTsKKyAgICAgICAgaXNJbmMgPSBmYWxzZTsKKyAgICAgICAgT2Zmc2V0ID0gREFHLmdldENvbnN0YW50KC1SSFNDLCBSSFMtPmdldFZhbHVlVHlwZSgwKSk7CisgICAgICAgIEJhc2UgPSBQdHItPmdldE9wZXJhbmQoMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChQdHItPmdldE9wY29kZSgpID09IElTRDo6QUREKSB7CisgICAgICBpc0luYyA9IHRydWU7CisgICAgICBBUk1fQU06OlNoaWZ0T3BjIFNoT3BjVmFsPSBBUk1fQU06OmdldFNoaWZ0T3BjRm9yTm9kZShQdHItPmdldE9wZXJhbmQoMCkpOworICAgICAgaWYgKFNoT3BjVmFsICE9IEFSTV9BTTo6bm9fc2hpZnQpIHsKKyAgICAgICAgQmFzZSA9IFB0ci0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgICAgT2Zmc2V0ID0gUHRyLT5nZXRPcGVyYW5kKDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQmFzZSA9IFB0ci0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgT2Zmc2V0ID0gUHRyLT5nZXRPcGVyYW5kKDEpOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaXNJbmMgPSAoUHRyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCk7CisgICAgQmFzZSA9IFB0ci0+Z2V0T3BlcmFuZCgwKTsKKyAgICBPZmZzZXQgPSBQdHItPmdldE9wZXJhbmQoMSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBGSVhNRTogVXNlIFZMRE0gLyBWU1RNIHRvIGVtdWxhdGUgaW5kZXhlZCBGUCBsb2FkIC8gc3RvcmUuCisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgZ2V0VDJJbmRleGVkQWRkcmVzc1BhcnRzKFNETm9kZSAqUHRyLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NFWFRMb2FkLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCwgYm9vbCAmaXNJbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgaWYgKFB0ci0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpBREQgJiYgUHRyLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNVQikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQmFzZSA9IFB0ci0+Z2V0T3BlcmFuZCgwKTsKKyAgaWYgKENvbnN0YW50U0ROb2RlICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oUHRyLT5nZXRPcGVyYW5kKDEpKSkgeworICAgIGludCBSSFNDID0gKGludClSSFMtPmdldFpFeHRWYWx1ZSgpOworICAgIGlmIChSSFNDIDwgMCAmJiBSSFNDID4gLTB4MTAwKSB7IC8vIDggYml0cy4KKyAgICAgIGFzc2VydChQdHItPmdldE9wY29kZSgpID09IElTRDo6QUREKTsKKyAgICAgIGlzSW5jID0gZmFsc2U7CisgICAgICBPZmZzZXQgPSBEQUcuZ2V0Q29uc3RhbnQoLVJIU0MsIFJIUy0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoUkhTQyA+IDAgJiYgUkhTQyA8IDB4MTAwKSB7IC8vIDggYml0LCBubyB6ZXJvLgorICAgICAgaXNJbmMgPSBQdHItPmdldE9wY29kZSgpID09IElTRDo6QUREOworICAgICAgT2Zmc2V0ID0gREFHLmdldENvbnN0YW50KFJIU0MsIFJIUy0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGdldFByZUluZGV4ZWRBZGRyZXNzUGFydHMgLSByZXR1cm5zIHRydWUgYnkgdmFsdWUsIGJhc2UgcG9pbnRlciBhbmQKKy8vLyBvZmZzZXQgcG9pbnRlciBhbmQgYWRkcmVzc2luZyBtb2RlIGJ5IHJlZmVyZW5jZSBpZiB0aGUgbm9kZSdzIGFkZHJlc3MKKy8vLyBjYW4gYmUgbGVnYWxseSByZXByZXNlbnRlZCBhcyBwcmUtaW5kZXhlZCBsb2FkIC8gc3RvcmUgYWRkcmVzcy4KK2Jvb2wKK0FSTVRhcmdldExvd2VyaW5nOjpnZXRQcmVJbmRleGVkQWRkcmVzc1BhcnRzKFNETm9kZSAqTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6TWVtSW5kZXhlZE1vZGUgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEVWVCBWVDsKKyAgU0RWYWx1ZSBQdHI7CisgIGJvb2wgaXNTRVhUTG9hZCA9IGZhbHNlOworICBpZiAoTG9hZFNETm9kZSAqTEQgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihOKSkgeworICAgIFB0ciA9IExELT5nZXRCYXNlUHRyKCk7CisgICAgVlQgID0gTEQtPmdldE1lbW9yeVZUKCk7CisgICAgaXNTRVhUTG9hZCA9IExELT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpTRVhUTE9BRDsKKyAgfSBlbHNlIGlmIChTdG9yZVNETm9kZSAqU1QgPSBkeW5fY2FzdDxTdG9yZVNETm9kZT4oTikpIHsKKyAgICBQdHIgPSBTVC0+Z2V0QmFzZVB0cigpOworICAgIFZUICA9IFNULT5nZXRNZW1vcnlWVCgpOworICB9IGVsc2UKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBpc0luYzsKKyAgYm9vbCBpc0xlZ2FsID0gZmFsc2U7CisgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIyKCkpCisgICAgaXNMZWdhbCA9IGdldFQySW5kZXhlZEFkZHJlc3NQYXJ0cyhQdHIuZ2V0Tm9kZSgpLCBWVCwgaXNTRVhUTG9hZCwgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwgaXNJbmMsIERBRyk7CisgIGVsc2UKKyAgICBpc0xlZ2FsID0gZ2V0QVJNSW5kZXhlZEFkZHJlc3NQYXJ0cyhQdHIuZ2V0Tm9kZSgpLCBWVCwgaXNTRVhUTG9hZCwgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsIGlzSW5jLCBEQUcpOworICBpZiAoIWlzTGVnYWwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEFNID0gaXNJbmMgPyBJU0Q6OlBSRV9JTkMgOiBJU0Q6OlBSRV9ERUM7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gZ2V0UG9zdEluZGV4ZWRBZGRyZXNzUGFydHMgLSByZXR1cm5zIHRydWUgYnkgdmFsdWUsIGJhc2UgcG9pbnRlciBhbmQKKy8vLyBvZmZzZXQgcG9pbnRlciBhbmQgYWRkcmVzc2luZyBtb2RlIGJ5IHJlZmVyZW5jZSBpZiB0aGlzIG5vZGUgY2FuIGJlCisvLy8gY29tYmluZWQgd2l0aCBhIGxvYWQgLyBzdG9yZSB0byBmb3JtIGEgcG9zdC1pbmRleGVkIGxvYWQgLyBzdG9yZS4KK2Jvb2wgQVJNVGFyZ2V0TG93ZXJpbmc6OmdldFBvc3RJbmRleGVkQWRkcmVzc1BhcnRzKFNETm9kZSAqTiwgU0ROb2RlICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6Ok1lbUluZGV4ZWRNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIxT25seSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBFVlQgVlQ7CisgIFNEVmFsdWUgUHRyOworICBib29sIGlzU0VYVExvYWQgPSBmYWxzZTsKKyAgaWYgKExvYWRTRE5vZGUgKkxEID0gZHluX2Nhc3Q8TG9hZFNETm9kZT4oTikpIHsKKyAgICBWVCAgPSBMRC0+Z2V0TWVtb3J5VlQoKTsKKyAgICBQdHIgPSBMRC0+Z2V0QmFzZVB0cigpOworICAgIGlzU0VYVExvYWQgPSBMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6U0VYVExPQUQ7CisgIH0gZWxzZSBpZiAoU3RvcmVTRE5vZGUgKlNUID0gZHluX2Nhc3Q8U3RvcmVTRE5vZGU+KE4pKSB7CisgICAgVlQgID0gU1QtPmdldE1lbW9yeVZUKCk7CisgICAgUHRyID0gU1QtPmdldEJhc2VQdHIoKTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgaXNJbmM7CisgIGJvb2wgaXNMZWdhbCA9IGZhbHNlOworICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iMigpKQorICAgIGlzTGVnYWwgPSBnZXRUMkluZGV4ZWRBZGRyZXNzUGFydHMoT3AsIFZULCBpc1NFWFRMb2FkLCBCYXNlLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luYywgREFHKTsKKyAgZWxzZQorICAgIGlzTGVnYWwgPSBnZXRBUk1JbmRleGVkQWRkcmVzc1BhcnRzKE9wLCBWVCwgaXNTRVhUTG9hZCwgQmFzZSwgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5jLCBEQUcpOworICBpZiAoIWlzTGVnYWwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChQdHIgIT0gQmFzZSkgeworICAgIC8vIFN3YXAgYmFzZSBwdHIgYW5kIG9mZnNldCB0byBjYXRjaCBtb3JlIHBvc3QtaW5kZXggbG9hZCAvIHN0b3JlIHdoZW4KKyAgICAvLyBpdCdzIGxlZ2FsLiBJbiBUaHVtYjIgbW9kZSwgb2Zmc2V0IG11c3QgYmUgYW4gaW1tZWRpYXRlLgorICAgIGlmIChQdHIgPT0gT2Zmc2V0ICYmIE9wLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCAmJgorICAgICAgICAhU3VidGFyZ2V0LT5pc1RodW1iMigpKQorICAgICAgc3RkOjpzd2FwKEJhc2UsIE9mZnNldCk7CisKKyAgICAvLyBQb3N0LWluZGV4ZWQgbG9hZCAvIHN0b3JlIHVwZGF0ZSB0aGUgYmFzZSBwb2ludGVyLgorICAgIGlmIChQdHIgIT0gQmFzZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEFNID0gaXNJbmMgPyBJU0Q6OlBPU1RfSU5DIDogSVNEOjpQT1NUX0RFQzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQVJNVGFyZ2V0TG93ZXJpbmc6OmNvbXB1dGVNYXNrZWRCaXRzRm9yVGFyZ2V0Tm9kZShjb25zdCBTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSBjb25zdCB7CisgIEtub3duWmVybyA9IEtub3duT25lID0gQVBJbnQoTWFzay5nZXRCaXRXaWR0aCgpLCAwKTsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBBUk1JU0Q6OkNNT1Y6IHsKKyAgICAvLyBCaXRzIGFyZSBrbm93biB6ZXJvL29uZSBpZiBrbm93biBvbiB0aGUgTEhTIGFuZCBSSFMuCisgICAgREFHLkNvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMCksIE1hc2ssIEtub3duWmVybywgS25vd25PbmUsIERlcHRoKzEpOworICAgIGlmIChLbm93blplcm8gPT0gMCAmJiBLbm93bk9uZSA9PSAwKSByZXR1cm47CisKKyAgICBBUEludCBLbm93blplcm9SSFMsIEtub3duT25lUkhTOworICAgIERBRy5Db21wdXRlTWFza2VkQml0cyhPcC5nZXRPcGVyYW5kKDEpLCBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm9SSFMsIEtub3duT25lUkhTLCBEZXB0aCsxKTsKKyAgICBLbm93blplcm8gJj0gS25vd25aZXJvUkhTOworICAgIEtub3duT25lICAmPSBLbm93bk9uZVJIUzsKKyAgICByZXR1cm47CisgIH0KKyAgfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBBUk0gSW5saW5lIEFzc2VtYmx5IFN1cHBvcnQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBnZXRDb25zdHJhaW50VHlwZSAtIEdpdmVuIGEgY29uc3RyYWludCBsZXR0ZXIsIHJldHVybiB0aGUgdHlwZSBvZgorLy8vIGNvbnN0cmFpbnQgaXQgaXMgZm9yIHRoaXMgdGFyZ2V0LgorQVJNVGFyZ2V0TG93ZXJpbmc6OkNvbnN0cmFpbnRUeXBlCitBUk1UYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQpIGNvbnN0IHsKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICBkZWZhdWx0OiAgYnJlYWs7CisgICAgY2FzZSAnbCc6IHJldHVybiBDX1JlZ2lzdGVyQ2xhc3M7CisgICAgY2FzZSAndyc6IHJldHVybiBDX1JlZ2lzdGVyQ2xhc3M7CisgICAgfQorICB9CisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoQ29uc3RyYWludCk7Cit9CisKK3N0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+CitBUk1UYXJnZXRMb3dlcmluZzo6Z2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3QgeworICBpZiAoQ29uc3RyYWludC5zaXplKCkgPT0gMSkgeworICAgIC8vIEdDQyBBUk0gQ29uc3RyYWludCBMZXR0ZXJzCisgICAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgY2FzZSAnbCc6CisgICAgICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iKCkpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgQVJNOjp0R1BSUmVnaXN0ZXJDbGFzcyk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgQVJNOjpHUFJSZWdpc3RlckNsYXNzKTsKKyAgICBjYXNlICdyJzoKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgQVJNOjpHUFJSZWdpc3RlckNsYXNzKTsKKyAgICBjYXNlICd3JzoKKyAgICAgIGlmIChWVCA9PSBNVlQ6OmYzMikKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBBUk06OlNQUlJlZ2lzdGVyQ2xhc3MpOworICAgICAgaWYgKFZULmdldFNpemVJbkJpdHMoKSA9PSA2NCkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBBUk06OkRQUlJlZ2lzdGVyQ2xhc3MpOworICAgICAgaWYgKFZULmdldFNpemVJbkJpdHMoKSA9PSAxMjgpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgQVJNOjpRUFJSZWdpc3RlckNsYXNzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoU3RyaW5nUmVmKCJ7Y2N9IikuZXF1YWxzX2xvd2VyKENvbnN0cmFpbnQpKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih1bnNpZ25lZChBUk06OkNQU1IpLCBBUk06OkNDUlJlZ2lzdGVyQ2xhc3MpOworCisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChDb25zdHJhaW50LCBWVCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVuc2lnbmVkPiBBUk1UYXJnZXRMb3dlcmluZzo6CitnZXRSZWdDbGFzc0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCB7CisgIGlmIChDb25zdHJhaW50LnNpemUoKSAhPSAxKQorICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKKworICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsgICAgICAvLyBHQ0MgQVJNIENvbnN0cmFpbnQgTGV0dGVycworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSAnbCc6CisgICAgcmV0dXJuIG1ha2VfdmVjdG9yPHVuc2lnbmVkPihBUk06OlIwLCBBUk06OlIxLCBBUk06OlIyLCBBUk06OlIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpSNCwgQVJNOjpSNSwgQVJNOjpSNiwgQVJNOjpSNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICBjYXNlICdyJzoKKyAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KEFSTTo6UjAsIEFSTTo6UjEsIEFSTTo6UjIsIEFSTTo6UjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlI0LCBBUk06OlI1LCBBUk06OlI2LCBBUk06OlI3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpSOCwgQVJNOjpSOSwgQVJNOjpSMTAsIEFSTTo6UjExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpSMTIsIEFSTTo6TFIsIDApOworICBjYXNlICd3JzoKKyAgICBpZiAoVlQgPT0gTVZUOjpmMzIpCisgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KEFSTTo6UzAsIEFSTTo6UzEsIEFSTTo6UzIsIEFSTTo6UzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6UzQsIEFSTTo6UzUsIEFSTTo6UzYsIEFSTTo6UzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6UzgsIEFSTTo6UzksIEFSTTo6UzEwLCBBUk06OlMxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpTMTIsQVJNOjpTMTMsQVJNOjpTMTQsQVJNOjpTMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6UzE2LEFSTTo6UzE3LEFSTTo6UzE4LEFSTTo6UzE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlMyMCxBUk06OlMyMSxBUk06OlMyMixBUk06OlMyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpTMjQsQVJNOjpTMjUsQVJNOjpTMjYsQVJNOjpTMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTTo6UzI4LEFSTTo6UzI5LEFSTTo6UzMwLEFSTTo6UzMxLCAwKTsKKyAgICBpZiAoVlQuZ2V0U2l6ZUluQml0cygpID09IDY0KQorICAgICAgcmV0dXJuIG1ha2VfdmVjdG9yPHVuc2lnbmVkPihBUk06OkQwLCBBUk06OkQxLCBBUk06OkQyLCBBUk06OkQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OkQ0LCBBUk06OkQ1LCBBUk06OkQ2LCBBUk06OkQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OkQ4LCBBUk06OkQ5LCBBUk06OkQxMCxBUk06OkQxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNOjpEMTIsQVJNOjpEMTMsQVJNOjpEMTQsQVJNOjpEMTUsIDApOworICAgIGlmIChWVC5nZXRTaXplSW5CaXRzKCkgPT0gMTI4KQorICAgICAgcmV0dXJuIG1ha2VfdmVjdG9yPHVuc2lnbmVkPihBUk06OlEwLCBBUk06OlExLCBBUk06OlEyLCBBUk06OlEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk06OlE0LCBBUk06OlE1LCBBUk06OlE2LCBBUk06OlE3LCAwKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPigpOworfQorCisvLy8gTG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludCAtIExvd2VyIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpbnRvIHRoZSBPcHMKKy8vLyB2ZWN0b3IuICBJZiBpdCBpcyBpbnZhbGlkLCBkb24ndCBhZGQgYW55dGhpbmcgdG8gT3BzLgordm9pZCBBUk1UYXJnZXRMb3dlcmluZzo6TG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+Jk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBSZXN1bHQoMCwgMCk7CisKKyAgc3dpdGNoIChDb25zdHJhaW50KSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlICdJJzogY2FzZSAnSic6IGNhc2UgJ0snOiBjYXNlICdMJzoKKyAgY2FzZSAnTSc6IGNhc2UgJ04nOiBjYXNlICdPJzoKKyAgICBDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcCk7CisgICAgaWYgKCFDKQorICAgICAgcmV0dXJuOworCisgICAgaW50NjRfdCBDVmFsNjQgPSBDLT5nZXRTRXh0VmFsdWUoKTsKKyAgICBpbnQgQ1ZhbCA9IChpbnQpIENWYWw2NDsKKyAgICAvLyBOb25lIG9mIHRoZXNlIGNvbnN0cmFpbnRzIGFsbG93IHZhbHVlcyBsYXJnZXIgdGhhbiAzMiBiaXRzLiAgQ2hlY2sKKyAgICAvLyB0aGF0IHRoZSB2YWx1ZSBmaXRzIGluIGFuIGludC4KKyAgICBpZiAoQ1ZhbCAhPSBDVmFsNjQpCisgICAgICByZXR1cm47CisKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnQpIHsKKyAgICAgIGNhc2UgJ0knOgorICAgICAgICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSkgeworICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBhIGNvbnN0YW50IGJldHdlZW4gMCBhbmQgMjU1LCBmb3IgQURECisgICAgICAgICAgLy8gaW1tZWRpYXRlcy4KKyAgICAgICAgICBpZiAoQ1ZhbCA+PSAwICYmIENWYWwgPD0gMjU1KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoU3VidGFyZ2V0LT5pc1RodW1iMigpKSB7CisgICAgICAgICAgLy8gQSBjb25zdGFudCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGltbWVkaWF0ZSB2YWx1ZSBpbiBhCisgICAgICAgICAgLy8gZGF0YS1wcm9jZXNzaW5nIGluc3RydWN0aW9uLgorICAgICAgICAgIGlmIChBUk1fQU06OmdldFQyU09JbW1WYWwoQ1ZhbCkgIT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBBIGNvbnN0YW50IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gaW1tZWRpYXRlIHZhbHVlIGluIGEKKyAgICAgICAgICAvLyBkYXRhLXByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgaWYgKEFSTV9BTTo6Z2V0U09JbW1WYWwoQ1ZhbCkgIT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgJ0onOgorICAgICAgICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iKCkpIHsgIC8vIEZJWE1FIHRodW1iMgorICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBhIGNvbnN0YW50IGJldHdlZW4gLTI1NSBhbmQgLTEsIGZvciBuZWdhdGVkIEFERAorICAgICAgICAgIC8vIGltbWVkaWF0ZXMuIFRoaXMgY2FuIGJlIHVzZWQgaW4gR0NDIHdpdGggYW4gIm4iIG1vZGlmaWVyIHRoYXQKKyAgICAgICAgICAvLyBwcmludHMgdGhlIG5lZ2F0ZWQgdmFsdWUsIGZvciB1c2Ugd2l0aCBTVUIgaW5zdHJ1Y3Rpb25zLiBJdCBpcworICAgICAgICAgIC8vIG5vdCB1c2VmdWwgb3RoZXJ3aXNlIGJ1dCBpcyBpbXBsZW1lbnRlZCBmb3IgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICBpZiAoQ1ZhbCA+PSAtMjU1ICYmIENWYWwgPD0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgYSBjb25zdGFudCBiZXR3ZWVuIC00MDk1IGFuZCA0MDk1LiBJdCBpcyBub3QgY2xlYXIKKyAgICAgICAgICAvLyB3aGF0IHRoaXMgY29uc3RyYWludCBpcyBpbnRlbmRlZCBmb3IuIEltcGxlbWVudGVkIGZvcgorICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBHQ0MuCisgICAgICAgICAgaWYgKENWYWwgPj0gLTQwOTUgJiYgQ1ZhbCA8PSA0MDk1KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlICdLJzoKKyAgICAgICAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYjFPbmx5KCkpIHsKKyAgICAgICAgICAvLyBBIDMyLWJpdCB2YWx1ZSB3aGVyZSBvbmx5IG9uZSBieXRlIGhhcyBhIG5vbnplcm8gdmFsdWUuIEV4Y2x1ZGUKKyAgICAgICAgICAvLyB6ZXJvIHRvIG1hdGNoIEdDQy4gVGhpcyBjb25zdHJhaW50IGlzIHVzZWQgYnkgR0NDIGludGVybmFsbHkgZm9yCisgICAgICAgICAgLy8gY29uc3RhbnRzIHRoYXQgY2FuIGJlIGxvYWRlZCB3aXRoIGEgbW92ZS9zaGlmdCBjb21iaW5hdGlvbi4KKyAgICAgICAgICAvLyBJdCBpcyBub3QgdXNlZnVsIG90aGVyd2lzZSBidXQgaXMgaW1wbGVtZW50ZWQgZm9yIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAgaWYgKENWYWwgIT0gMCAmJiBBUk1fQU06OmlzVGh1bWJJbW1TaGlmdGVkVmFsKENWYWwpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoU3VidGFyZ2V0LT5pc1RodW1iMigpKSB7CisgICAgICAgICAgLy8gQSBjb25zdGFudCB3aG9zZSBiaXR3aXNlIGludmVyc2UgY2FuIGJlIHVzZWQgYXMgYW4gaW1tZWRpYXRlCisgICAgICAgICAgLy8gdmFsdWUgaW4gYSBkYXRhLXByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIFRoaXMgY2FuIGJlIHVzZWQgaW4gR0NDCisgICAgICAgICAgLy8gd2l0aCBhICJCIiBtb2RpZmllciB0aGF0IHByaW50cyB0aGUgaW52ZXJ0ZWQgdmFsdWUsIGZvciB1c2Ugd2l0aAorICAgICAgICAgIC8vIEJJQyBhbmQgTVZOIGluc3RydWN0aW9ucy4gSXQgaXMgbm90IHVzZWZ1bCBvdGhlcndpc2UgYnV0IGlzCisgICAgICAgICAgLy8gaW1wbGVtZW50ZWQgZm9yIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAgaWYgKEFSTV9BTTo6Z2V0VDJTT0ltbVZhbCh+Q1ZhbCkgIT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBBIGNvbnN0YW50IHdob3NlIGJpdHdpc2UgaW52ZXJzZSBjYW4gYmUgdXNlZCBhcyBhbiBpbW1lZGlhdGUKKyAgICAgICAgICAvLyB2YWx1ZSBpbiBhIGRhdGEtcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gVGhpcyBjYW4gYmUgdXNlZCBpbiBHQ0MKKyAgICAgICAgICAvLyB3aXRoIGEgIkIiIG1vZGlmaWVyIHRoYXQgcHJpbnRzIHRoZSBpbnZlcnRlZCB2YWx1ZSwgZm9yIHVzZSB3aXRoCisgICAgICAgICAgLy8gQklDIGFuZCBNVk4gaW5zdHJ1Y3Rpb25zLiBJdCBpcyBub3QgdXNlZnVsIG90aGVyd2lzZSBidXQgaXMKKyAgICAgICAgICAvLyBpbXBsZW1lbnRlZCBmb3IgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICBpZiAoQVJNX0FNOjpnZXRTT0ltbVZhbCh+Q1ZhbCkgIT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgJ0wnOgorICAgICAgICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iMU9ubHkoKSkgeworICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBhIGNvbnN0YW50IGJldHdlZW4gLTcgYW5kIDcsCisgICAgICAgICAgLy8gZm9yIDMtb3BlcmFuZCBBREQvU1VCIGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuCisgICAgICAgICAgaWYgKENWYWwgPj0gLTcgJiYgQ1ZhbCA8IDcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIyKCkpIHsKKyAgICAgICAgICAvLyBBIGNvbnN0YW50IHdob3NlIG5lZ2F0aW9uIGNhbiBiZSB1c2VkIGFzIGFuIGltbWVkaWF0ZSB2YWx1ZSBpbiBhCisgICAgICAgICAgLy8gZGF0YS1wcm9jZXNzaW5nIGluc3RydWN0aW9uLiBUaGlzIGNhbiBiZSB1c2VkIGluIEdDQyB3aXRoIGFuICJuIgorICAgICAgICAgIC8vIG1vZGlmaWVyIHRoYXQgcHJpbnRzIHRoZSBuZWdhdGVkIHZhbHVlLCBmb3IgdXNlIHdpdGggU1VCCisgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb25zLiBJdCBpcyBub3QgdXNlZnVsIG90aGVyd2lzZSBidXQgaXMgaW1wbGVtZW50ZWQgZm9yCisgICAgICAgICAgLy8gY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICBpZiAoQVJNX0FNOjpnZXRUMlNPSW1tVmFsKC1DVmFsKSAhPSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEEgY29uc3RhbnQgd2hvc2UgbmVnYXRpb24gY2FuIGJlIHVzZWQgYXMgYW4gaW1tZWRpYXRlIHZhbHVlIGluIGEKKyAgICAgICAgICAvLyBkYXRhLXByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIFRoaXMgY2FuIGJlIHVzZWQgaW4gR0NDIHdpdGggYW4gIm4iCisgICAgICAgICAgLy8gbW9kaWZpZXIgdGhhdCBwcmludHMgdGhlIG5lZ2F0ZWQgdmFsdWUsIGZvciB1c2Ugd2l0aCBTVUIKKyAgICAgICAgICAvLyBpbnN0cnVjdGlvbnMuIEl0IGlzIG5vdCB1c2VmdWwgb3RoZXJ3aXNlIGJ1dCBpcyBpbXBsZW1lbnRlZCBmb3IKKyAgICAgICAgICAvLyBjb21wYXRpYmlsaXR5LgorICAgICAgICAgIGlmIChBUk1fQU06OmdldFNPSW1tVmFsKC1DVmFsKSAhPSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSAnTSc6CisgICAgICAgIGlmIChTdWJ0YXJnZXQtPmlzVGh1bWIoKSkgeyAvLyBGSVhNRSB0aHVtYjIKKyAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGJldHdlZW4gMCBhbmQgMTAyMCwgZm9yCisgICAgICAgICAgLy8gQUREIHNwICsgaW1tZWRpYXRlLgorICAgICAgICAgIGlmICgoQ1ZhbCA+PSAwICYmIENWYWwgPD0gMTAyMCkgJiYgKChDVmFsICYgMykgPT0gMCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBBIHBvd2VyIG9mIHR3byBvciBhIGNvbnN0YW50IGJldHdlZW4gMCBhbmQgMzIuICBUaGlzIGlzIHVzZWQgaW4KKyAgICAgICAgICAvLyBHQ0MgZm9yIHRoZSBzaGlmdCBhbW91bnQgb24gc2hpZnRlZCByZWdpc3RlciBvcGVyYW5kcywgYnV0IGl0IGlzCisgICAgICAgICAgLy8gdXNlZnVsIGluIGdlbmVyYWwgZm9yIGFueSBzaGlmdCBhbW91bnRzLgorICAgICAgICAgIGlmICgoQ1ZhbCA+PSAwICYmIENWYWwgPD0gMzIpIHx8ICgoQ1ZhbCAmIChDVmFsIC0gMSkpID09IDApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlICdOJzoKKyAgICAgICAgaWYgKFN1YnRhcmdldC0+aXNUaHVtYigpKSB7ICAvLyBGSVhNRSB0aHVtYjIKKyAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgYSBjb25zdGFudCBiZXR3ZWVuIDAgYW5kIDMxLCBmb3Igc2hpZnQgYW1vdW50cy4KKyAgICAgICAgICBpZiAoQ1ZhbCA+PSAwICYmIENWYWwgPD0gMzEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgJ08nOgorICAgICAgICBpZiAoU3VidGFyZ2V0LT5pc1RodW1iKCkpIHsgIC8vIEZJWE1FIHRodW1iMgorICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgYmV0d2VlbiAtNTA4IGFuZCA1MDgsIGZvcgorICAgICAgICAgIC8vIEFERC9TVUIgc3AgPSBzcCArIGltbWVkaWF0ZS4KKyAgICAgICAgICBpZiAoKENWYWwgPj0gLTUwOCAmJiBDVmFsIDw9IDUwOCkgJiYgKChDVmFsICYgMykgPT0gMCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRDb25zdGFudChDVmFsLCBPcC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoUmVzdWx0LmdldE5vZGUoKSkgeworICAgIE9wcy5wdXNoX2JhY2soUmVzdWx0KTsKKyAgICByZXR1cm47CisgIH0KKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjpMb3dlckFzbU9wZXJhbmRGb3JDb25zdHJhaW50KE9wLCBDb25zdHJhaW50LCBPcHMsIERBRyk7Cit9CisKK2Jvb2wKK0FSTVRhcmdldExvd2VyaW5nOjppc09mZnNldEZvbGRpbmdMZWdhbChjb25zdCBHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSkgY29uc3QgeworICAvLyBUaGUgQVJNIHRhcmdldCBpc24ndCB5ZXQgYXdhcmUgb2Ygb2Zmc2V0cy4KKyAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgQVJNOjpnZXRWRlBmMzJJbW0oY29uc3QgQVBGbG9hdCAmRlBJbW0pIHsKKyAgQVBJbnQgSW1tID0gRlBJbW0uYml0Y2FzdFRvQVBJbnQoKTsKKyAgdWludDMyX3QgU2lnbiA9IEltbS5sc2hyKDMxKS5nZXRaRXh0VmFsdWUoKSAmIDE7CisgIGludDMyX3QgRXhwID0gKEltbS5sc2hyKDIzKS5nZXRTRXh0VmFsdWUoKSAmIDB4ZmYpIC0gMTI3OyAgLy8gLTEyNiB0byAxMjcKKyAgaW50NjRfdCBNYW50aXNzYSA9IEltbS5nZXRaRXh0VmFsdWUoKSAmIDB4N2ZmZmZmOyAgLy8gMjMgYml0cworCisgIC8vIFdlIGNhbiBoYW5kbGUgNCBiaXRzIG9mIG1hbnRpc3NhLgorICAvLyBtYW50aXNzYSA9ICgxNitVSW50KGU6ZjpnOmgpKS8xNi4KKyAgaWYgKE1hbnRpc3NhICYgMHg3ZmZmZikKKyAgICByZXR1cm4gLTE7CisgIE1hbnRpc3NhID4+PSAxOTsKKyAgaWYgKChNYW50aXNzYSAmIDB4ZikgIT0gTWFudGlzc2EpCisgICAgcmV0dXJuIC0xOworCisgIC8vIFdlIGNhbiBoYW5kbGUgMyBiaXRzIG9mIGV4cG9uZW50OiBleHAgPT0gVUludChOT1QoYik6YzpkKS0zCisgIGlmIChFeHAgPCAtMyB8fCBFeHAgPiA0KQorICAgIHJldHVybiAtMTsKKyAgRXhwID0gKChFeHArMykgJiAweDcpIF4gNDsKKworICByZXR1cm4gKChpbnQpU2lnbiA8PCA3KSB8IChFeHAgPDwgNCkgfCBNYW50aXNzYTsKK30KKworaW50IEFSTTo6Z2V0VkZQZjY0SW1tKGNvbnN0IEFQRmxvYXQgJkZQSW1tKSB7CisgIEFQSW50IEltbSA9IEZQSW1tLmJpdGNhc3RUb0FQSW50KCk7CisgIHVpbnQ2NF90IFNpZ24gPSBJbW0ubHNocig2MykuZ2V0WkV4dFZhbHVlKCkgJiAxOworICBpbnQ2NF90IEV4cCA9IChJbW0ubHNocig1MikuZ2V0U0V4dFZhbHVlKCkgJiAweDdmZikgLSAxMDIzOyAgIC8vIC0xMDIyIHRvIDEwMjMKKyAgdWludDY0X3QgTWFudGlzc2EgPSBJbW0uZ2V0WkV4dFZhbHVlKCkgJiAweGZmZmZmZmZmZmZmZmZMTDsKKworICAvLyBXZSBjYW4gaGFuZGxlIDQgYml0cyBvZiBtYW50aXNzYS4KKyAgLy8gbWFudGlzc2EgPSAoMTYrVUludChlOmY6ZzpoKSkvMTYuCisgIGlmIChNYW50aXNzYSAmIDB4ZmZmZmZmZmZmZmZmTEwpCisgICAgcmV0dXJuIC0xOworICBNYW50aXNzYSA+Pj0gNDg7CisgIGlmICgoTWFudGlzc2EgJiAweGYpICE9IE1hbnRpc3NhKQorICAgIHJldHVybiAtMTsKKworICAvLyBXZSBjYW4gaGFuZGxlIDMgYml0cyBvZiBleHBvbmVudDogZXhwID09IFVJbnQoTk9UKGIpOmM6ZCktMworICBpZiAoRXhwIDwgLTMgfHwgRXhwID4gNCkKKyAgICByZXR1cm4gLTE7CisgIEV4cCA9ICgoRXhwKzMpICYgMHg3KSBeIDQ7CisKKyAgcmV0dXJuICgoaW50KVNpZ24gPDwgNykgfCAoRXhwIDw8IDQpIHwgTWFudGlzc2E7Cit9CisKK2Jvb2wgQVJNOjppc0JpdEZpZWxkSW52ZXJ0ZWRNYXNrKHVuc2lnbmVkIHYpIHsKKyAgaWYgKHYgPT0gMHhmZmZmZmZmZikKKyAgICByZXR1cm4gMDsKKyAgLy8gdGhlcmUgY2FuIGJlIDEncyBvbiBlaXRoZXIgb3IgYm90aCAib3V0c2lkZXMiLCBhbGwgdGhlICJpbnNpZGUiCisgIC8vIGJpdHMgbXVzdCBiZSAwJ3MKKyAgdW5zaWduZWQgaW50IGxzYiA9IDAsIG1zYiA9IDMxOworICB3aGlsZSAodiAmICgxIDw8IG1zYikpIC0tbXNiOworICB3aGlsZSAodiAmICgxIDw8IGxzYikpICsrbHNiOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gbHNiOyBpIDw9IG1zYjsgKytpKSB7CisgICAgaWYgKHYgJiAoMSA8PCBpKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLy8gaXNGUEltbUxlZ2FsIC0gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgY2FuIGluc3RydWN0aW9uIHNlbGVjdCB0aGUKKy8vLyBzcGVjaWZpZWQgRlAgaW1tZWRpYXRlIG5hdGl2ZWx5LiBJZiBmYWxzZSwgdGhlIGxlZ2FsaXplciB3aWxsCisvLy8gbWF0ZXJpYWxpemUgdGhlIEZQIGltbWVkaWF0ZSBhcyBhIGxvYWQgZnJvbSBhIGNvbnN0YW50IHBvb2wuCitib29sIEFSTVRhcmdldExvd2VyaW5nOjppc0ZQSW1tTGVnYWwoY29uc3QgQVBGbG9hdCAmSW1tLCBFVlQgVlQpIGNvbnN0IHsKKyAgaWYgKCFTdWJ0YXJnZXQtPmhhc1ZGUDMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChWVCA9PSBNVlQ6OmYzMikKKyAgICByZXR1cm4gQVJNOjpnZXRWRlBmMzJJbW0oSW1tKSAhPSAtMTsKKyAgaWYgKFZUID09IE1WVDo6ZjY0KQorICAgIHJldHVybiBBUk06OmdldFZGUGY2NEltbShJbW0pICE9IC0xOworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JU2VsTG93ZXJpbmcuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUlTZWxMb3dlcmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTUzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JU2VsTG93ZXJpbmcuaApAQCAtMCwwICsxLDQxMSBAQAorLy89PT0tLSBBUk1JU2VsTG93ZXJpbmcuaCAtIEFSTSBEQUcgTG93ZXJpbmcgSW50ZXJmYWNlIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IEFSTSB1c2VzIHRvIGxvd2VyIExMVk0gY29kZSBpbnRvIGEKKy8vIHNlbGVjdGlvbiBEQUcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBUk1JU0VMTE9XRVJJTkdfSAorI2RlZmluZSBBUk1JU0VMTE9XRVJJTkdfSAorCisjaW5jbHVkZSAiQVJNU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRmFzdElTZWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQVJNQ29uc3RhbnRQb29sVmFsdWU7CisKKyAgbmFtZXNwYWNlIEFSTUlTRCB7CisgICAgLy8gQVJNIFNwZWNpZmljIERBRyBOb2RlcworICAgIGVudW0gTm9kZVR5cGUgeworICAgICAgLy8gU3RhcnQgdGhlIG51bWJlcmluZyB3aGVyZSB0aGUgYnVpbHRpbiBvcHMgYW5kIHRhcmdldCBvcHMgbGVhdmUgb2ZmLgorICAgICAgRklSU1RfTlVNQkVSID0gSVNEOjpCVUlMVElOX09QX0VORCwKKworICAgICAgV3JhcHBlciwgICAgICAvLyBXcmFwcGVyIC0gQSB3cmFwcGVyIG5vZGUgZm9yIFRhcmdldENvbnN0YW50UG9vbCwKKyAgICAgICAgICAgICAgICAgICAgLy8gVGFyZ2V0RXh0ZXJuYWxTeW1ib2wsIGFuZCBUYXJnZXRHbG9iYWxBZGRyZXNzLgorICAgICAgV3JhcHBlckpULCAgICAvLyBXcmFwcGVySlQgLSBBIHdyYXBwZXIgbm9kZSBmb3IgVGFyZ2V0SnVtcFRhYmxlCisKKyAgICAgIENBTEwsICAgICAgICAgLy8gRnVuY3Rpb24gY2FsbC4KKyAgICAgIENBTExfUFJFRCwgICAgLy8gRnVuY3Rpb24gY2FsbCB0aGF0J3MgcHJlZGljYWJsZS4KKyAgICAgIENBTExfTk9MSU5LLCAgLy8gRnVuY3Rpb24gY2FsbCB3aXRoIGJyYW5jaCBub3QgYnJhbmNoLWFuZC1saW5rLgorICAgICAgdENBTEwsICAgICAgICAvLyBUaHVtYiBmdW5jdGlvbiBjYWxsLgorICAgICAgQlJDT05ELCAgICAgICAvLyBDb25kaXRpb25hbCBicmFuY2guCisgICAgICBCUl9KVCwgICAgICAgIC8vIEp1bXB0YWJsZSBicmFuY2guCisgICAgICBCUjJfSlQsICAgICAgIC8vIEp1bXB0YWJsZSBicmFuY2ggKDIgbGV2ZWwgLSBqdW1wdGFibGUgZW50cnkgaXMgYSBqdW1wKS4KKyAgICAgIFJFVF9GTEFHLCAgICAgLy8gUmV0dXJuIHdpdGggYSBmbGFnIG9wZXJhbmQuCisKKyAgICAgIFBJQ19BREQsICAgICAgLy8gQWRkIHdpdGggYSBQQyBvcGVyYW5kIGFuZCBhIFBJQyBsYWJlbC4KKworICAgICAgQ01QLCAgICAgICAgICAvLyBBUk0gY29tcGFyZSBpbnN0cnVjdGlvbnMuCisgICAgICBDTVBaLCAgICAgICAgIC8vIEFSTSBjb21wYXJlIHRoYXQgc2V0cyBvbmx5IFogZmxhZy4KKyAgICAgIENNUEZQLCAgICAgICAgLy8gQVJNIFZGUCBjb21wYXJlIGluc3RydWN0aW9uLCBzZXRzIEZQU0NSLgorICAgICAgQ01QRlB3MCwgICAgICAvLyBBUk0gVkZQIGNvbXBhcmUgYWdhaW5zdCB6ZXJvIGluc3RydWN0aW9uLCBzZXRzIEZQU0NSLgorICAgICAgRk1TVEFULCAgICAgICAvLyBBUk0gZm1zdGF0IGluc3RydWN0aW9uLgorICAgICAgQ01PViwgICAgICAgICAvLyBBUk0gY29uZGl0aW9uYWwgbW92ZSBpbnN0cnVjdGlvbnMuCisgICAgICBDTkVHLCAgICAgICAgIC8vIEFSTSBjb25kaXRpb25hbCBuZWdhdGUgaW5zdHJ1Y3Rpb25zLgorCisgICAgICBCQ0NfaTY0LAorCisgICAgICBSQklULCAgICAgICAgIC8vIEFSTSBiaXRyZXZlcnNlIGluc3RydWN0aW9uCisKKyAgICAgIEZUT1NJLCAgICAgICAgLy8gRlAgdG8gc2ludCB3aXRoaW4gYSBGUCByZWdpc3Rlci4KKyAgICAgIEZUT1VJLCAgICAgICAgLy8gRlAgdG8gdWludCB3aXRoaW4gYSBGUCByZWdpc3Rlci4KKyAgICAgIFNJVE9GLCAgICAgICAgLy8gc2ludCB0byBGUCB3aXRoaW4gYSBGUCByZWdpc3Rlci4KKyAgICAgIFVJVE9GLCAgICAgICAgLy8gdWludCB0byBGUCB3aXRoaW4gYSBGUCByZWdpc3Rlci4KKworICAgICAgU1JMX0ZMQUcsICAgICAvLyBWLEZsYWcgPSBzcmxfZmxhZyBYIC0+IHNybCBYLCAxICsgc2F2ZSBjYXJyeSBvdXQuCisgICAgICBTUkFfRkxBRywgICAgIC8vIFYsRmxhZyA9IHNyYV9mbGFnIFggLT4gc3JhIFgsIDEgKyBzYXZlIGNhcnJ5IG91dC4KKyAgICAgIFJSWCwgICAgICAgICAgLy8gViA9IFJSWCBYLCBGbGFnICAgICAtPiBzcmwgWCwgMSArIHNoaWZ0IGluIGNhcnJ5IGZsYWcuCisKKyAgICAgIFZNT1ZSUkQsICAgICAgLy8gZG91YmxlIHRvIHR3byBncHJzLgorICAgICAgVk1PVkRSUiwgICAgICAvLyBUd28gZ3BycyB0byBkb3VibGUuCisKKyAgICAgIEVIX1NKTEpfU0VUSk1QLCAgICAvLyBTakxqIGV4Y2VwdGlvbiBoYW5kbGluZyBzZXRqbXAuCisgICAgICBFSF9TSkxKX0xPTkdKTVAsICAgLy8gU2pMaiBleGNlcHRpb24gaGFuZGxpbmcgbG9uZ2ptcC4KKworICAgICAgVENfUkVUVVJOLCAgICAvLyBUYWlsIGNhbGwgcmV0dXJuIHBzZXVkby4KKworICAgICAgVEhSRUFEX1BPSU5URVIsCisKKyAgICAgIERZTl9BTExPQywgICAgLy8gRHluYW1pYyBhbGxvY2F0aW9uIG9uIHRoZSBzdGFjay4KKworICAgICAgTUVNQkFSUklFUiwgICAvLyBNZW1vcnkgYmFycmllcgorICAgICAgU1lOQ0JBUlJJRVIsICAvLyBNZW1vcnkgc3luYyBiYXJyaWVyCisgICAgICAKKyAgICAgIFZDRVEsICAgICAgICAgLy8gVmVjdG9yIGNvbXBhcmUgZXF1YWwuCisgICAgICBWQ0dFLCAgICAgICAgIC8vIFZlY3RvciBjb21wYXJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbC4KKyAgICAgIFZDR0VVLCAgICAgICAgLy8gVmVjdG9yIGNvbXBhcmUgdW5zaWduZWQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsLgorICAgICAgVkNHVCwgICAgICAgICAvLyBWZWN0b3IgY29tcGFyZSBncmVhdGVyIHRoYW4uCisgICAgICBWQ0dUVSwgICAgICAgIC8vIFZlY3RvciBjb21wYXJlIHVuc2lnbmVkIGdyZWF0ZXIgdGhhbi4KKyAgICAgIFZUU1QsICAgICAgICAgLy8gVmVjdG9yIHRlc3QgYml0cy4KKworICAgICAgLy8gVmVjdG9yIHNoaWZ0IGJ5IGltbWVkaWF0ZToKKyAgICAgIFZTSEwsICAgICAgICAgLy8gLi4ubGVmdAorICAgICAgVlNIUnMsICAgICAgICAvLyAuLi5yaWdodCAoc2lnbmVkKQorICAgICAgVlNIUnUsICAgICAgICAvLyAuLi5yaWdodCAodW5zaWduZWQpCisgICAgICBWU0hMTHMsICAgICAgIC8vIC4uLmxlZnQgbG9uZyAoc2lnbmVkKQorICAgICAgVlNITEx1LCAgICAgICAvLyAuLi5sZWZ0IGxvbmcgKHVuc2lnbmVkKQorICAgICAgVlNITExpLCAgICAgICAvLyAuLi5sZWZ0IGxvbmcgKHdpdGggbWF4aW11bSBzaGlmdCBjb3VudCkKKyAgICAgIFZTSFJOLCAgICAgICAgLy8gLi4ucmlnaHQgbmFycm93CisKKyAgICAgIC8vIFZlY3RvciByb3VuZGluZyBzaGlmdCBieSBpbW1lZGlhdGU6CisgICAgICBWUlNIUnMsICAgICAgIC8vIC4uLnJpZ2h0IChzaWduZWQpCisgICAgICBWUlNIUnUsICAgICAgIC8vIC4uLnJpZ2h0ICh1bnNpZ25lZCkKKyAgICAgIFZSU0hSTiwgICAgICAgLy8gLi4ucmlnaHQgbmFycm93CisKKyAgICAgIC8vIFZlY3RvciBzYXR1cmF0aW5nIHNoaWZ0IGJ5IGltbWVkaWF0ZToKKyAgICAgIFZRU0hMcywgICAgICAgLy8gLi4ubGVmdCAoc2lnbmVkKQorICAgICAgVlFTSEx1LCAgICAgICAvLyAuLi5sZWZ0ICh1bnNpZ25lZCkKKyAgICAgIFZRU0hMc3UsICAgICAgLy8gLi4ubGVmdCAoc2lnbmVkIHRvIHVuc2lnbmVkKQorICAgICAgVlFTSFJOcywgICAgICAvLyAuLi5yaWdodCBuYXJyb3cgKHNpZ25lZCkKKyAgICAgIFZRU0hSTnUsICAgICAgLy8gLi4ucmlnaHQgbmFycm93ICh1bnNpZ25lZCkKKyAgICAgIFZRU0hSTnN1LCAgICAgLy8gLi4ucmlnaHQgbmFycm93IChzaWduZWQgdG8gdW5zaWduZWQpCisKKyAgICAgIC8vIFZlY3RvciBzYXR1cmF0aW5nIHJvdW5kaW5nIHNoaWZ0IGJ5IGltbWVkaWF0ZToKKyAgICAgIFZRUlNIUk5zLCAgICAgLy8gLi4ucmlnaHQgbmFycm93IChzaWduZWQpCisgICAgICBWUVJTSFJOdSwgICAgIC8vIC4uLnJpZ2h0IG5hcnJvdyAodW5zaWduZWQpCisgICAgICBWUVJTSFJOc3UsICAgIC8vIC4uLnJpZ2h0IG5hcnJvdyAoc2lnbmVkIHRvIHVuc2lnbmVkKQorCisgICAgICAvLyBWZWN0b3Igc2hpZnQgYW5kIGluc2VydDoKKyAgICAgIFZTTEksICAgICAgICAgLy8gLi4ubGVmdAorICAgICAgVlNSSSwgICAgICAgICAvLyAuLi5yaWdodAorCisgICAgICAvLyBWZWN0b3IgZ2V0IGxhbmUgKFZNT1Ygc2NhbGFyIHRvIEFSTSBjb3JlIHJlZ2lzdGVyKQorICAgICAgLy8gKFRoZXNlIGFyZSB1c2VkIGZvciA4LSBhbmQgMTYtYml0IGVsZW1lbnQgdHlwZXMgb25seS4pCisgICAgICBWR0VUTEFORXUsICAgIC8vIHplcm8tZXh0ZW5kIHZlY3RvciBleHRyYWN0IGVsZW1lbnQKKyAgICAgIFZHRVRMQU5FcywgICAgLy8gc2lnbi1leHRlbmQgdmVjdG9yIGV4dHJhY3QgZWxlbWVudAorCisgICAgICAvLyBWZWN0b3IgbW92ZSBpbW1lZGlhdGUgYW5kIG1vdmUgbmVnYXRlZCBpbW1lZGlhdGU6CisgICAgICBWTU9WSU1NLAorICAgICAgVk1WTklNTSwKKworICAgICAgLy8gVmVjdG9yIGR1cGxpY2F0ZToKKyAgICAgIFZEVVAsCisgICAgICBWRFVQTEFORSwKKworICAgICAgLy8gVmVjdG9yIHNodWZmbGVzOgorICAgICAgVkVYVCwgICAgICAgICAvLyBleHRyYWN0CisgICAgICBWUkVWNjQsICAgICAgIC8vIHJldmVyc2UgZWxlbWVudHMgd2l0aGluIDY0LWJpdCBkb3VibGV3b3JkcworICAgICAgVlJFVjMyLCAgICAgICAvLyByZXZlcnNlIGVsZW1lbnRzIHdpdGhpbiAzMi1iaXQgd29yZHMKKyAgICAgIFZSRVYxNiwgICAgICAgLy8gcmV2ZXJzZSBlbGVtZW50cyB3aXRoaW4gMTYtYml0IGhhbGZ3b3JkcworICAgICAgVlpJUCwgICAgICAgICAvLyB6aXAgKGludGVybGVhdmUpCisgICAgICBWVVpQLCAgICAgICAgIC8vIHVuemlwIChkZWludGVybGVhdmUpCisgICAgICBWVFJOLCAgICAgICAgIC8vIHRyYW5zcG9zZQorCisgICAgICAvLyBPcGVyYW5kcyBvZiB0aGUgc3RhbmRhcmQgQlVJTERfVkVDVE9SIG5vZGUgYXJlIG5vdCBsZWdhbGl6ZWQsIHdoaWNoCisgICAgICAvLyBpcyBmaW5lIGlmIEJVSUxEX1ZFQ1RPUnMgYXJlIGFsd2F5cyBsb3dlcmVkIHRvIHNodWZmbGVzIG9yIG90aGVyCisgICAgICAvLyBvcGVyYXRpb25zLCBidXQgZm9yIEFSTSBzb21lIEJVSUxEX1ZFQ1RPUnMgYXJlIGxlZ2FsIGFzLWlzIGFuZCB0aGVpcgorICAgICAgLy8gb3BlcmFuZHMgbmVlZCB0byBiZSBsZWdhbGl6ZWQuICBEZWZpbmUgYW4gQVJNLXNwZWNpZmljIHZlcnNpb24gb2YKKyAgICAgIC8vIEJVSUxEX1ZFQ1RPUiBmb3IgdGhpcyBwdXJwb3NlLgorICAgICAgQlVJTERfVkVDVE9SLAorCisgICAgICAvLyBGbG9hdGluZy1wb2ludCBtYXggYW5kIG1pbjoKKyAgICAgIEZNQVgsCisgICAgICBGTUlOLAorCisgICAgICAvLyBCaXQtZmllbGQgaW5zZXJ0CisgICAgICBCRkkKKyAgICB9OworICB9CisKKyAgLy8vIERlZmluZSBzb21lIHByZWRpY2F0ZXMgdGhhdCBhcmUgdXNlZCBmb3Igbm9kZSBtYXRjaGluZy4KKyAgbmFtZXNwYWNlIEFSTSB7CisgICAgLy8vIGdldFZGUGYzMkltbSAvIGdldFZGUGY2NEltbSAtIElmIHRoZSBnaXZlbiBmcCBpbW1lZGlhdGUgY2FuIGJlCisgICAgLy8vIG1hdGVyaWFsaXplZCB3aXRoIGEgVk1PVi5mMzIgLyBWTU9WLmY2NCAoaS5lLiBmY29uc3RzIC8gZmNvbnN0ZCkKKyAgICAvLy8gaW5zdHJ1Y3Rpb24sIHJldHVybnMgaXRzIDgtYml0IGludGVnZXIgcmVwcmVzZW50YXRpb24uIE90aGVyd2lzZSwKKyAgICAvLy8gcmV0dXJucyAtMS4KKyAgICBpbnQgZ2V0VkZQZjMySW1tKGNvbnN0IEFQRmxvYXQgJkZQSW1tKTsKKyAgICBpbnQgZ2V0VkZQZjY0SW1tKGNvbnN0IEFQRmxvYXQgJkZQSW1tKTsKKyAgICBib29sIGlzQml0RmllbGRJbnZlcnRlZE1hc2sodW5zaWduZWQgdik7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gIEFSTVRhcmdldExvd2VyaW5nIC0gQVJNIEltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRMb3dlcmluZyBpbnRlcmZhY2UKKworICBjbGFzcyBBUk1UYXJnZXRMb3dlcmluZyA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBUk1UYXJnZXRMb3dlcmluZyhUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldEp1bXBUYWJsZUVuY29kaW5nKHZvaWQpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlIExvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIC8vLyBSZXBsYWNlTm9kZVJlc3VsdHMgLSBSZXBsYWNlIHRoZSByZXN1bHRzIG9mIG5vZGUgd2l0aCBhbiBpbGxlZ2FsIHJlc3VsdAorICAgIC8vLyB0eXBlIHdpdGggbmV3IHZhbHVlcyBidWlsdCBvdXQgb2YgY3VzdG9tIGNvZGUuCisgICAgLy8vCisgICAgdmlydHVhbCB2b2lkIFJlcGxhY2VOb2RlUmVzdWx0cyhTRE5vZGUgKk4sIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiZSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlIFBlcmZvcm1EQUdDb21iaW5lKFNETm9kZSAqTiwgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0OworCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworCisgICAgdmlydHVhbCBNYWNoaW5lQmFzaWNCbG9jayAqCisgICAgICBFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAgIC8vLyBhbGxvd3NVbmFsaWduZWRNZW1vcnlBY2Nlc3NlcyAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGFsbG93cworICAgIC8vLyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLiBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgLy8vIEZJWE1FOiBBZGQgZ2V0T3B0aW1hbE1lbU9wVHlwZSB0byBpbXBsZW1lbnQgbWVtY3B5IHdpdGggTkVPTj8KKyAgICB2aXJ0dWFsIGJvb2wgYWxsb3dzVW5hbGlnbmVkTWVtb3J5QWNjZXNzZXMoRVZUIFZUKSBjb25zdDsKKworICAgIC8vLyBpc0xlZ2FsQWRkcmVzc2luZ01vZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzc2luZyBtb2RlIHJlcHJlc2VudGVkCisgICAgLy8vIGJ5IEFNIGlzIGxlZ2FsIGZvciB0aGlzIHRhcmdldCwgZm9yIGEgbG9hZC9zdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgdmlydHVhbCBib29sIGlzTGVnYWxBZGRyZXNzaW5nTW9kZShjb25zdCBBZGRyTW9kZSAmQU0sIGNvbnN0IFR5cGUgKlR5KWNvbnN0OworICAgIGJvb2wgaXNMZWdhbFQyU2NhbGVkQWRkcmVzc2luZ01vZGUoY29uc3QgQWRkck1vZGUgJkFNLCBFVlQgVlQpIGNvbnN0OworCisgICAgLy8vIGlzTGVnYWxJQ21wSW1tZWRpYXRlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbW1lZGlhdGUgaXMgbGVnYWwKKyAgICAvLy8gaWNtcCBpbW1lZGlhdGUsIHRoYXQgaXMgdGhlIHRhcmdldCBoYXMgaWNtcCBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuCisgICAgLy8vIGNvbXBhcmUgYSByZWdpc3RlciBhZ2FpbnN0IHRoZSBpbW1lZGlhdGUgd2l0aG91dCBoYXZpbmcgdG8gbWF0ZXJpYWxpemUKKyAgICAvLy8gdGhlIGltbWVkaWF0ZSBpbnRvIGEgcmVnaXN0ZXIuCisgICAgdmlydHVhbCBib29sIGlzTGVnYWxJQ21wSW1tZWRpYXRlKGludDY0X3QgSW1tKSBjb25zdDsKKworICAgIC8vLyBnZXRQcmVJbmRleGVkQWRkcmVzc1BhcnRzIC0gcmV0dXJucyB0cnVlIGJ5IHZhbHVlLCBiYXNlIHBvaW50ZXIgYW5kCisgICAgLy8vIG9mZnNldCBwb2ludGVyIGFuZCBhZGRyZXNzaW5nIG1vZGUgYnkgcmVmZXJlbmNlIGlmIHRoZSBub2RlJ3MgYWRkcmVzcworICAgIC8vLyBjYW4gYmUgbGVnYWxseSByZXByZXNlbnRlZCBhcyBwcmUtaW5kZXhlZCBsb2FkIC8gc3RvcmUgYWRkcmVzcy4KKyAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJlSW5kZXhlZEFkZHJlc3NQYXJ0cyhTRE5vZGUgKk4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6TWVtSW5kZXhlZE1vZGUgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIC8vLyBnZXRQb3N0SW5kZXhlZEFkZHJlc3NQYXJ0cyAtIHJldHVybnMgdHJ1ZSBieSB2YWx1ZSwgYmFzZSBwb2ludGVyIGFuZAorICAgIC8vLyBvZmZzZXQgcG9pbnRlciBhbmQgYWRkcmVzc2luZyBtb2RlIGJ5IHJlZmVyZW5jZSBpZiB0aGlzIG5vZGUgY2FuIGJlCisgICAgLy8vIGNvbWJpbmVkIHdpdGggYSBsb2FkIC8gc3RvcmUgdG8gZm9ybSBhIHBvc3QtaW5kZXhlZCBsb2FkIC8gc3RvcmUuCisgICAgdmlydHVhbCBib29sIGdldFBvc3RJbmRleGVkQWRkcmVzc1BhcnRzKFNETm9kZSAqTiwgU0ROb2RlICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6Ok1lbUluZGV4ZWRNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGNvbXB1dGVNYXNrZWRCaXRzRm9yVGFyZ2V0Tm9kZShjb25zdCBTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25aZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCkgY29uc3Q7CisKKworICAgIENvbnN0cmFpbnRUeXBlIGdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdDsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqPgorICAgICAgZ2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdDsKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4KKyAgICBnZXRSZWdDbGFzc0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3Q7CisKKyAgICAvLy8gTG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludCAtIExvd2VyIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpbnRvIHRoZSBPcHMKKyAgICAvLy8gdmVjdG9yLiAgSWYgaXQgaXMgaW52YWxpZCwgZG9uJ3QgYWRkIGFueXRoaW5nIHRvIE9wcy4gSWYgaGFzTWVtb3J5IGlzCisgICAgLy8vIHRydWUgaXQgbWVhbnMgb25lIG9mIHRoZSBhc20gY29uc3RyYWludCBvZiB0aGUgaW5saW5lIGFzbSBpbnN0cnVjdGlvbgorICAgIC8vLyBiZWluZyBwcm9jZXNzZWQgaXMgJ20nLgorICAgIHZpcnR1YWwgdm9pZCBMb3dlckFzbU9wZXJhbmRGb3JDb25zdHJhaW50KFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBDb25zdHJhaW50TGV0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgY29uc3QgQVJNU3VidGFyZ2V0KiBnZXRTdWJ0YXJnZXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gU3VidGFyZ2V0OworICAgIH0KKworICAgIC8vLyBnZXRSZWdDbGFzc0ZvciAtIFJldHVybiB0aGUgcmVnaXN0ZXIgY2xhc3MgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlCisgICAgLy8vIHNwZWNpZmllZCB2YWx1ZSB0eXBlLgorICAgIHZpcnR1YWwgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3NGb3IoRVZUIFZUKSBjb25zdDsKKworICAgIC8vLyBnZXRGdW5jdGlvbkFsaWdubWVudCAtIFJldHVybiB0aGUgTG9nMiBhbGlnbm1lbnQgb2YgdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldEZ1bmN0aW9uQWxpZ25tZW50KGNvbnN0IEZ1bmN0aW9uICpGKSBjb25zdDsKKworICAgIC8vLyBnZXRNYXhpbWFsR2xvYmFsT2Zmc2V0IC0gUmV0dXJucyB0aGUgbWF4aW1hbCBwb3NzaWJsZSBvZmZzZXQgd2hpY2ggY2FuCisgICAgLy8vIGJlIHVzZWQgZm9yIGxvYWRzIC8gc3RvcmVzIGZyb20gdGhlIGdsb2JhbC4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1heGltYWxHbG9iYWxPZmZzZXQoKSBjb25zdDsKKworICAgIC8vLyBjcmVhdGVGYXN0SVNlbCAtIFRoaXMgbWV0aG9kIHJldHVybnMgYSB0YXJnZXQgc3BlY2lmaWMgRmFzdElTZWwgb2JqZWN0LAorICAgIC8vLyBvciBudWxsIGlmIHRoZSB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCAiZmFzdCIgSVNlbC4KKyAgICB2aXJ0dWFsIEZhc3RJU2VsICpjcmVhdGVGYXN0SVNlbChGdW5jdGlvbkxvd2VyaW5nSW5mbyAmZnVuY0luZm8pIGNvbnN0OworCisgICAgU2NoZWQ6OlByZWZlcmVuY2UgZ2V0U2NoZWR1bGluZ1ByZWZlcmVuY2UoU0ROb2RlICpOKSBjb25zdDsKKworICAgIHVuc2lnbmVkIGdldFJlZ1ByZXNzdXJlTGltaXQoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAgIGJvb2wgaXNTaHVmZmxlTWFza0xlZ2FsKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZNLCBFVlQgVlQpIGNvbnN0OworICAgIGJvb2wgaXNPZmZzZXRGb2xkaW5nTGVnYWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EpIGNvbnN0OworCisgICAgLy8vIGlzRlBJbW1MZWdhbCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGNhbiBpbnN0cnVjdGlvbiBzZWxlY3QgdGhlCisgICAgLy8vIHNwZWNpZmllZCBGUCBpbW1lZGlhdGUgbmF0aXZlbHkuIElmIGZhbHNlLCB0aGUgbGVnYWxpemVyIHdpbGwKKyAgICAvLy8gbWF0ZXJpYWxpemUgdGhlIEZQIGltbWVkaWF0ZSBhcyBhIGxvYWQgZnJvbSBhIGNvbnN0YW50IHBvb2wuCisgICAgdmlydHVhbCBib29sIGlzRlBJbW1MZWdhbChjb25zdCBBUEZsb2F0ICZJbW0sIEVWVCBWVCkgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorICAgIHN0ZDo6cGFpcjxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiwgdWludDhfdD4KKyAgICBmaW5kUmVwcmVzZW50YXRpdmVDbGFzcyhFVlQgVlQpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgLy8vIFN1YnRhcmdldCAtIEtlZXAgYSBwb2ludGVyIHRvIHRoZSBBUk1TdWJ0YXJnZXQgYXJvdW5kIHNvIHRoYXQgd2UgY2FuCisgICAgLy8vIG1ha2UgdGhlIHJpZ2h0IGRlY2lzaW9uIHdoZW4gZ2VuZXJhdGluZyBjb2RlIGZvciBkaWZmZXJlbnQgdGFyZ2V0cy4KKyAgICBjb25zdCBBUk1TdWJ0YXJnZXQgKlN1YnRhcmdldDsKKworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUmVnSW5mbzsKKworICAgIC8vLyBBUk1QQ0xhYmVsSW5kZXggLSBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgQVJNIFBDIGxhYmVscyBjcmVhdGVkLgorICAgIC8vLworICAgIHVuc2lnbmVkIEFSTVBDTGFiZWxJbmRleDsKKworICAgIHZvaWQgYWRkVHlwZUZvck5FT04oRVZUIFZULCBFVlQgUHJvbW90ZWRMZFN0VlQsIEVWVCBQcm9tb3RlZEJpdHdpc2VWVCk7CisgICAgdm9pZCBhZGREUlR5cGVGb3JORU9OKEVWVCBWVCk7CisgICAgdm9pZCBhZGRRUlR5cGVGb3JORU9OKEVWVCBWVCk7CisKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgU0RWYWx1ZT4sIDg+IFJlZ3NUb1Bhc3NWZWN0b3I7CisgICAgdm9pZCBQYXNzRjY0QXJnSW5SZWdzKERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSAmQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdzVG9QYXNzVmVjdG9yICZSZWdzVG9QYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbEFzc2lnbiAmVkEsIENDVmFsQXNzaWduICZOZXh0VkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJlN0YWNrUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiAmTWVtT3BDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBGbGFncykgY29uc3Q7CisgICAgU0RWYWx1ZSBHZXRGNjRGb3JtYWxBcmd1bWVudChDQ1ZhbEFzc2lnbiAmVkEsIENDVmFsQXNzaWduICZOZXh0VkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZSb290LCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSBjb25zdDsKKworICAgIENDQXNzaWduRm4gKkNDQXNzaWduRm5Gb3JOb2RlKENhbGxpbmdDb252OjpJRCBDQywgYm9vbCBSZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhckFyZykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlck1lbU9wQ2FsbFRvKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgU3RhY2tQdHIsIFNEVmFsdWUgQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENDVmFsQXNzaWduICZWQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRUhfU0pMSl9TRVRKTVAoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJFSF9TSkxKX0xPTkdKTVAoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJJTlRSSU5TSUNfV09fQ0hBSU4oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgKlN1YnRhcmdldCkgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckJsb2NrQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckdsb2JhbEFkZHJlc3NEYXJ3aW4oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJHbG9iYWxBZGRyZXNzRUxGKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyR2xvYmFsVExTQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclRvVExTR2VuZXJhbER5bmFtaWNNb2RlbChHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJUb1RMU0V4ZWNNb2RlbHMoR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyR0xPQkFMX09GRlNFVF9UQUJMRShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckJSX0pUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU0VMRUNUX0NDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyQlJfQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJGQ09QWVNJR04oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJSRVRVUk5BRERSKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRlJBTUVBRERSKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU2hpZnRSaWdodFBhcnRzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU2hpZnRMZWZ0UGFydHMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJGTFRfUk9VTkRTXyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICBTRFZhbHVlIExvd2VyQ2FsbFJlc3VsdChTRFZhbHVlIENoYWluLCBTRFZhbHVlIEluRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJGb3JtYWxBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlckNhbGwoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgIGJvb2wgJmlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIC8vLyBJc0VsaWdpYmxlRm9yVGFpbENhbGxPcHRpbWl6YXRpb24gLSBDaGVjayB3aGV0aGVyIHRoZSBjYWxsIGlzIGVsaWdpYmxlCisgICAgLy8vIGZvciB0YWlsIGNhbGwgb3B0aW1pemF0aW9uLiBUYXJnZXRzIHdoaWNoIHdhbnQgdG8gZG8gdGFpbCBjYWxsCisgICAgLy8vIG9wdGltaXphdGlvbiBzaG91bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgYm9vbCBJc0VsaWdpYmxlRm9yVGFpbENhbGxPcHRpbWl6YXRpb24oU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxlZUNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NhbGxlZVN0cnVjdFJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ2FsbGVyU3RydWN0UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyYgREFHKSBjb25zdDsKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyUmV0dXJuKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIFNEVmFsdWUgZ2V0QVJNQ21wKFNEVmFsdWUgTEhTLCBTRFZhbHVlIFJIUywgSVNEOjpDb25kQ29kZSBDQywKKyAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZBUk1jYywgU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsKSBjb25zdDsKKyAgICBTRFZhbHVlIGdldFZGUENtcChTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsKSBjb25zdDsKKworICAgIFNEVmFsdWUgT3B0aW1pemVWRlBCcmNvbmQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkVtaXRBdG9taWNDbXBTd2FwKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgY29uc3Q7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkVtaXRBdG9taWNCaW5hcnkoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaW5PcGNvZGUpIGNvbnN0OworCisgIH07CisgIAorICBuYW1lc3BhY2UgQVJNIHsKKyAgICBGYXN0SVNlbCAqY3JlYXRlRmFzdElTZWwoRnVuY3Rpb25Mb3dlcmluZ0luZm8gJmZ1bmNJbmZvKTsKKyAgfQorfQorCisjZW5kaWYgIC8vIEFSTUlTRUxMT1dFUklOR19ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JbnN0ckZvcm1hdHMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JbnN0ckZvcm1hdHMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmODg3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUluc3RyRm9ybWF0cy50ZApAQCAtMCwwICsxLDE2ODMgQEAKKy8vPT09LSBBUk1JbnN0ckZvcm1hdHMudGQgLSBBUk0gSW5zdHJ1Y3Rpb24gRm9ybWF0cyAtLSotIHRhYmxlZ2VuIC0qLS0tLS0tLS0tPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQVJNIEluc3RydWN0aW9uIEZvcm1hdCBEZWZpbml0aW9ucy4KKy8vCisKKy8vIEZvcm1hdCBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgYnkgdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyBwYXJ0IG9mIHRoZQorLy8gYWQtaG9jIHNvbHV0aW9uIHVzZWQgdG8gZW1pdCBtYWNoaW5lIGluc3RydWN0aW9uIGVuY29kaW5ncyBieSBvdXIgbWFjaGluZQorLy8gY29kZSBlbWl0dGVyLgorY2xhc3MgRm9ybWF0PGJpdHM8Nj4gdmFsPiB7CisgIGJpdHM8Nj4gVmFsdWUgPSB2YWw7Cit9CisKK2RlZiBQc2V1ZG8gICAgICAgIDogRm9ybWF0PDA+OworZGVmIE11bEZybSAgICAgICAgOiBGb3JtYXQ8MT47CitkZWYgQnJGcm0gICAgICAgICA6IEZvcm1hdDwyPjsKK2RlZiBCck1pc2NGcm0gICAgIDogRm9ybWF0PDM+OworCitkZWYgRFBGcm0gICAgICAgICA6IEZvcm1hdDw0PjsKK2RlZiBEUFNvUmVnRnJtICAgIDogRm9ybWF0PDU+OworCitkZWYgTGRGcm0gICAgICAgICA6IEZvcm1hdDw2PjsKK2RlZiBTdEZybSAgICAgICAgIDogRm9ybWF0PDc+OworZGVmIExkTWlzY0ZybSAgICAgOiBGb3JtYXQ8OD47CitkZWYgU3RNaXNjRnJtICAgICA6IEZvcm1hdDw5PjsKK2RlZiBMZFN0TXVsRnJtICAgIDogRm9ybWF0PDEwPjsKKworZGVmIExkU3RFeEZybSAgICAgOiBGb3JtYXQ8MTE+OworCitkZWYgQXJpdGhNaXNjRnJtICA6IEZvcm1hdDwxMj47CitkZWYgU2F0RnJtICAgICAgICA6IEZvcm1hdDwxMz47CitkZWYgRXh0RnJtICAgICAgICA6IEZvcm1hdDwxND47CisKK2RlZiBWRlBVbmFyeUZybSAgIDogRm9ybWF0PDE1PjsKK2RlZiBWRlBCaW5hcnlGcm0gIDogRm9ybWF0PDE2PjsKK2RlZiBWRlBDb252MUZybSAgIDogRm9ybWF0PDE3PjsKK2RlZiBWRlBDb252MkZybSAgIDogRm9ybWF0PDE4PjsKK2RlZiBWRlBDb252M0ZybSAgIDogRm9ybWF0PDE5PjsKK2RlZiBWRlBDb252NEZybSAgIDogRm9ybWF0PDIwPjsKK2RlZiBWRlBDb252NUZybSAgIDogRm9ybWF0PDIxPjsKK2RlZiBWRlBMZFN0RnJtICAgIDogRm9ybWF0PDIyPjsKK2RlZiBWRlBMZFN0TXVsRnJtIDogRm9ybWF0PDIzPjsKK2RlZiBWRlBNaXNjRnJtICAgIDogRm9ybWF0PDI0PjsKKworZGVmIFRodW1iRnJtICAgICAgOiBGb3JtYXQ8MjU+OworZGVmIE1pc2NGcm0gICAgICAgOiBGb3JtYXQ8MjY+OworCitkZWYgTkdldExuRnJtICAgICA6IEZvcm1hdDwyNz47CitkZWYgTlNldExuRnJtICAgICA6IEZvcm1hdDwyOD47CitkZWYgTkR1cEZybSAgICAgICA6IEZvcm1hdDwyOT47CitkZWYgTkxkU3RGcm0gICAgICA6IEZvcm1hdDwzMD47CitkZWYgTjFSZWdNb2RJbW1Gcm06IEZvcm1hdDwzMT47CitkZWYgTjJSZWdGcm0gICAgICA6IEZvcm1hdDwzMj47CitkZWYgTlZDVlRGcm0gICAgICA6IEZvcm1hdDwzMz47CitkZWYgTlZEdXBMbkZybSAgICA6IEZvcm1hdDwzND47CitkZWYgTjJSZWdWU2hMRnJtICA6IEZvcm1hdDwzNT47CitkZWYgTjJSZWdWU2hSRnJtICA6IEZvcm1hdDwzNj47CitkZWYgTjNSZWdGcm0gICAgICA6IEZvcm1hdDwzNz47CitkZWYgTjNSZWdWU2hGcm0gICA6IEZvcm1hdDwzOD47CitkZWYgTlZFeHRGcm0gICAgICA6IEZvcm1hdDwzOT47CitkZWYgTlZNdWxTTEZybSAgICA6IEZvcm1hdDw0MD47CitkZWYgTlZUQkxGcm0gICAgICA6IEZvcm1hdDw0MT47CisKKy8vIE1pc2MgZmxhZ3MuCisKKy8vIHRoZSBpbnN0cnVjdGlvbiBoYXMgYSBSbiByZWdpc3RlciBvcGVyYW5kLgorLy8gVW5hcnlEUCAtIEluZGljYXRlcyB0aGlzIGlzIGEgdW5hcnkgZGF0YSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCBpLmUuCisvLyBpdCBkb2Vzbid0IGhhdmUgYSBSbiBvcGVyYW5kLgorY2xhc3MgVW5hcnlEUCAgICB7IGJpdCBpc1VuYXJ5RGF0YVByb2MgPSAxOyB9CisKKy8vIFhmb3JtMTZCaXQgLSBJbmRpY2F0ZXMgdGhpcyBUaHVtYjIgaW5zdHJ1Y3Rpb24gbWF5IGJlIHRyYW5zZm9ybWVkIGludG8KKy8vIGEgMTYtYml0IFRodW1iIGluc3RydWN0aW9uIGlmIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgbWV0LgorY2xhc3MgWGZvcm0xNkJpdCB7IGJpdCBjYW5YZm9ybVRvMTZCaXQgPSAxOyB9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBUk0gSW5zdHJ1Y3Rpb24gZmxhZ3MuICBUaGVzZSBuZWVkIHRvIG1hdGNoIEFSTUJhc2VJbnN0ckluZm8uaC4KKy8vCisKKy8vIEFkZHJlc3NpbmcgbW9kZS4KK2NsYXNzIEFkZHJNb2RlPGJpdHM8ND4gdmFsPiB7CisgIGJpdHM8ND4gVmFsdWUgPSB2YWw7Cit9CitkZWYgQWRkck1vZGVOb25lICA6IEFkZHJNb2RlPDA+OworZGVmIEFkZHJNb2RlMSAgICAgOiBBZGRyTW9kZTwxPjsKK2RlZiBBZGRyTW9kZTIgICAgIDogQWRkck1vZGU8Mj47CitkZWYgQWRkck1vZGUzICAgICA6IEFkZHJNb2RlPDM+OworZGVmIEFkZHJNb2RlNCAgICAgOiBBZGRyTW9kZTw0PjsKK2RlZiBBZGRyTW9kZTUgICAgIDogQWRkck1vZGU8NT47CitkZWYgQWRkck1vZGU2ICAgICA6IEFkZHJNb2RlPDY+OworZGVmIEFkZHJNb2RlVDFfMSAgOiBBZGRyTW9kZTw3PjsKK2RlZiBBZGRyTW9kZVQxXzIgIDogQWRkck1vZGU8OD47CitkZWYgQWRkck1vZGVUMV80ICA6IEFkZHJNb2RlPDk+OworZGVmIEFkZHJNb2RlVDFfcyAgOiBBZGRyTW9kZTwxMD47CitkZWYgQWRkck1vZGVUMl9pMTI6IEFkZHJNb2RlPDExPjsKK2RlZiBBZGRyTW9kZVQyX2k4IDogQWRkck1vZGU8MTI+OworZGVmIEFkZHJNb2RlVDJfc28gOiBBZGRyTW9kZTwxMz47CitkZWYgQWRkck1vZGVUMl9wYyA6IEFkZHJNb2RlPDE0PjsKK2RlZiBBZGRyTW9kZVQyX2k4czQgOiBBZGRyTW9kZTwxNT47CisKKy8vIEluc3RydWN0aW9uIHNpemUuCitjbGFzcyBTaXplRmxhZ1ZhbDxiaXRzPDM+IHZhbD4geworICBiaXRzPDM+IFZhbHVlID0gdmFsOworfQorZGVmIFNpemVJbnZhbGlkICA6IFNpemVGbGFnVmFsPDA+OyAgLy8gVW5zZXQuCitkZWYgU2l6ZVNwZWNpYWwgIDogU2l6ZUZsYWdWYWw8MT47ICAvLyBQc2V1ZG8gb3Igc3BlY2lhbC4KK2RlZiBTaXplOEJ5dGVzICAgOiBTaXplRmxhZ1ZhbDwyPjsKK2RlZiBTaXplNEJ5dGVzICAgOiBTaXplRmxhZ1ZhbDwzPjsKK2RlZiBTaXplMkJ5dGVzICAgOiBTaXplRmxhZ1ZhbDw0PjsKKworLy8gTG9hZCAvIHN0b3JlIGluZGV4IG1vZGUuCitjbGFzcyBJbmRleE1vZGU8Yml0czwyPiB2YWw+IHsKKyAgYml0czwyPiBWYWx1ZSA9IHZhbDsKK30KK2RlZiBJbmRleE1vZGVOb25lIDogSW5kZXhNb2RlPDA+OworZGVmIEluZGV4TW9kZVByZSAgOiBJbmRleE1vZGU8MT47CitkZWYgSW5kZXhNb2RlUG9zdCA6IEluZGV4TW9kZTwyPjsKK2RlZiBJbmRleE1vZGVVcGQgIDogSW5kZXhNb2RlPDM+OworCisvLyBJbnN0cnVjdGlvbiBleGVjdXRpb24gZG9tYWluLgorY2xhc3MgRG9tYWluPGJpdHM8Mj4gdmFsPiB7CisgIGJpdHM8Mj4gVmFsdWUgPSB2YWw7Cit9CitkZWYgR2VuZXJpY0RvbWFpbiA6IERvbWFpbjwwPjsKK2RlZiBWRlBEb21haW4gICAgIDogRG9tYWluPDE+OyAvLyBJbnN0cnVjdGlvbnMgaW4gVkZQIGRvbWFpbiBvbmx5CitkZWYgTmVvbkRvbWFpbiAgICA6IERvbWFpbjwyPjsgLy8gSW5zdHJ1Y3Rpb25zIGluIE5lb24gZG9tYWluIG9ubHkKK2RlZiBWRlBOZW9uRG9tYWluIDogRG9tYWluPDM+OyAvLyBJbnN0cnVjdGlvbnMgaW4gYm90aCBWRlAgJiBOZW9uIGRvbWFpbnMKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gQVJNIHNwZWNpYWwgb3BlcmFuZHMuCisvLworCisvLyBBUk0gUHJlZGljYXRlIG9wZXJhbmQuIERlZmF1bHQgdG8gMTQgPSBhbHdheXMgKEFMKS4gU2Vjb25kIHBhcnQgaXMgQ0MKKy8vIHJlZ2lzdGVyIHdob3NlIGRlZmF1bHQgaXMgMCAobm8gcmVnaXN0ZXIpLgorZGVmIHByZWQgOiBQcmVkaWNhdGVPcGVyYW5kPE90aGVyVlQsIChvcHMgaTMyaW1tLCBDQ1IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHMgKGkzMiAxNCksIChpMzIgemVyb19yZWcpKT4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRQcmVkaWNhdGVPcGVyYW5kIjsKK30KKworLy8gQ29uZGl0aW9uYWwgY29kZSByZXN1bHQgZm9yIGluc3RydWN0aW9ucyB3aG9zZSAncycgYml0IGlzIHNldCwgZS5nLiBzdWJzLgorZGVmIGNjX291dCA6IE9wdGlvbmFsRGVmT3BlcmFuZDxPdGhlclZULCAob3BzIENDUiksIChvcHMgKGkzMiB6ZXJvX3JlZykpPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFNCaXRNb2RpZmllck9wZXJhbmQiOworfQorCisvLyBTYW1lIGFzIGNjX291dCBleGNlcHQgaXQgZGVmYXVsdHMgdG8gc2V0dGluZyBDUFNSLgorZGVmIHNfY2Nfb3V0IDogT3B0aW9uYWxEZWZPcGVyYW5kPE90aGVyVlQsIChvcHMgQ0NSKSwgKG9wcyAoaTMyIENQU1IpKT4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTQml0TW9kaWZpZXJPcGVyYW5kIjsKK30KKworLy8gQVJNIHNwZWNpYWwgb3BlcmFuZHMgZm9yIGRpc2Fzc2VtYmx5IG9ubHkuCisvLworCitkZWYgY3BzX29wdCA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludENQU09wdGlvbk9wZXJhbmQiOworfQorCitkZWYgbXNyX21hc2sgOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRNU1JNYXNrT3BlcmFuZCI7Cit9CisKKy8vIEE4LjYuMTE3LCBBOC42LjExOC4gIERpZmZlcmVudCBpbnN0cnVjdGlvbnMgYXJlIGdlbmVyYXRlZCBmb3IgIzAgYW5kICMtMC4KKy8vIFRoZSBuZWdfemVybyBvcGVyYW5kIHRyYW5zbGF0ZXMgLTAgdG8gLTEsIC0xIHRvIC0yLCAuLi4sIGV0Yy4KK2RlZiBuZWdfemVybyA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludE5lZ1plcm9PcGVyYW5kIjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gQVJNIEluc3RydWN0aW9uIHRlbXBsYXRlcy4KKy8vCisKK2NsYXNzIEluc3RUZW1wbGF0ZTxBZGRyTW9kZSBhbSwgU2l6ZUZsYWdWYWwgc3osIEluZGV4TW9kZSBpbSwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXQgZiwgRG9tYWluIGQsIHN0cmluZyBjc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluPgorICA6IEluc3RydWN0aW9uIHsKKyAgbGV0IE5hbWVzcGFjZSA9ICJBUk0iOworCisgIEFkZHJNb2RlIEFNID0gYW07CisgIFNpemVGbGFnVmFsIFNaID0gc3o7CisgIEluZGV4TW9kZSBJTSA9IGltOworICBiaXRzPDI+IEluZGV4TW9kZUJpdHMgPSBJTS5WYWx1ZTsKKyAgRm9ybWF0IEYgPSBmOworICBiaXRzPDY+IEZvcm0gPSBGLlZhbHVlOworICBEb21haW4gRCA9IGQ7CisgIGJpdCBpc1VuYXJ5RGF0YVByb2MgPSAwOworICBiaXQgY2FuWGZvcm1UbzE2Qml0ID0gMDsKKworICAvLyBUaGUgbGF5b3V0IG9mIFRTRmxhZ3Mgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIEFSTUJhc2VJbnN0ckluZm8uaC4KKyAgbGV0IFRTRmxhZ3N7My0wfSAgID0gQU0uVmFsdWU7CisgIGxldCBUU0ZsYWdzezYtNH0gICA9IFNaLlZhbHVlOworICBsZXQgVFNGbGFnc3s4LTd9ICAgPSBJbmRleE1vZGVCaXRzOworICBsZXQgVFNGbGFnc3sxNC05fSAgPSBGb3JtOworICBsZXQgVFNGbGFnc3sxNX0gICAgPSBpc1VuYXJ5RGF0YVByb2M7CisgIGxldCBUU0ZsYWdzezE2fSAgICA9IGNhblhmb3JtVG8xNkJpdDsKKyAgbGV0IFRTRmxhZ3N7MTgtMTd9ID0gRC5WYWx1ZTsKKworICBsZXQgQ29uc3RyYWludHMgPSBjc3RyOworICBsZXQgSXRpbmVyYXJ5ID0gaXRpbjsKK30KKworY2xhc3MgRW5jb2RpbmcgeworICBmaWVsZCBiaXRzPDMyPiBJbnN0OworfQorCitjbGFzcyBJbnN0QVJNPEFkZHJNb2RlIGFtLCBTaXplRmxhZ1ZhbCBzeiwgSW5kZXhNb2RlIGltLAorICAgICAgICAgICAgICBGb3JtYXQgZiwgRG9tYWluIGQsIHN0cmluZyBjc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluPgorICA6IEluc3RUZW1wbGF0ZTxhbSwgc3osIGltLCBmLCBkLCBjc3RyLCBpdGluPiwgRW5jb2Rpbmc7CisKKy8vIFRoaXMgRW5jb2RpbmctbGVzcyBjbGFzcyBpcyB1c2VkIGJ5IFRodW1iMSB0byBzcGVjaWZ5IHRoZSBlbmNvZGluZyBiaXRzIGxhdGVyCisvLyBvbiBieSBhZGRpbmcgZmxhdm9ycyB0byBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuCitjbGFzcyBJbnN0VGh1bWI8QWRkck1vZGUgYW0sIFNpemVGbGFnVmFsIHN6LCBJbmRleE1vZGUgaW0sCisgICAgICAgICAgICAgICAgRm9ybWF0IGYsIERvbWFpbiBkLCBzdHJpbmcgY3N0ciwgSW5zdHJJdGluQ2xhc3MgaXRpbj4KKyAgOiBJbnN0VGVtcGxhdGU8YW0sIHN6LCBpbSwgZiwgZCwgY3N0ciwgaXRpbj47CisKK2NsYXNzIFBzZXVkb0luc3Q8ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgICBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJbnN0QVJNPEFkZHJNb2RlTm9uZSwgU2l6ZVNwZWNpYWwsIEluZGV4TW9kZU5vbmUsIFBzZXVkbywgR2VuZXJpY0RvbWFpbiwKKyAgICAgICAgICAgICIiLCBpdGluPiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IG9vcHM7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gaW9wczsKKyAgbGV0IEFzbVN0cmluZyA9IGFzbTsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworfQorCisvLyBBbG1vc3QgYWxsIEFSTSBpbnN0cnVjdGlvbnMgYXJlIHByZWRpY2FibGUuCitjbGFzcyBJPGRhZyBvb3BzLCBkYWcgaW9wcywgQWRkck1vZGUgYW0sIFNpemVGbGFnVmFsIHN6LAorICAgICAgICBJbmRleE1vZGUgaW0sIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwKKyAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdEFSTTxhbSwgc3osIGltLCBmLCBHZW5lcmljRG9tYWluLCBjc3RyLCBpdGluPiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IG9vcHM7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gIWNvbihpb3BzLCAoaW5zIHByZWQ6JHApKTsKKyAgbGV0IEFzbVN0cmluZyA9ICFzdHJjb25jYXQob3BjLCAhc3RyY29uY2F0KCIke3B9IiwgYXNtKSk7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBbSXNBUk1dOworfQorLy8gQSBmZXcgYXJlIG5vdCBwcmVkaWNhYmxlCitjbGFzcyBJbm9QPGRhZyBvb3BzLCBkYWcgaW9wcywgQWRkck1vZGUgYW0sIFNpemVGbGFnVmFsIHN6LAorICAgICAgICAgICBJbmRleE1vZGUgaW0sIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwKKyAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdEFSTTxhbSwgc3osIGltLCBmLCBHZW5lcmljRG9tYWluLCBjc3RyLCBpdGluPiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IG9vcHM7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gaW9wczsKKyAgbGV0IEFzbVN0cmluZyA9ICFzdHJjb25jYXQob3BjLCBhc20pOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxldCBpc1ByZWRpY2FibGUgPSAwOworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtJc0FSTV07Cit9CisKKy8vIFNhbWUgYXMgSSBleGNlcHQgaXQgY2FuIG9wdGlvbmFsbHkgbW9kaWZ5IENQU1IuIE5vdGUgaXQncyBtb2RlbGVkIGFzCisvLyBhbiBpbnB1dCBvcGVyYW5kIHNpbmNlIGJ5IGRlZmF1bHQgaXQncyBhIHplcm8gcmVnaXN0ZXIuIEl0IHdpbGwKKy8vIGJlY29tZSBhbiBpbXBsaWNpdCBkZWYgb25jZSBpdCdzICJmbGlwcGVkIi4KK2NsYXNzIHNJPGRhZyBvb3BzLCBkYWcgaW9wcywgQWRkck1vZGUgYW0sIFNpemVGbGFnVmFsIHN6LAorICAgICAgICAgSW5kZXhNb2RlIGltLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLAorICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdEFSTTxhbSwgc3osIGltLCBmLCBHZW5lcmljRG9tYWluLCBjc3RyLCBpdGluPiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IG9vcHM7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gIWNvbihpb3BzLCAoaW5zIHByZWQ6JHAsIGNjX291dDokcykpOworICBsZXQgQXNtU3RyaW5nID0gIXN0cmNvbmNhdChvcGMsICFzdHJjb25jYXQoIiR7cH0ke3N9IiwgYXNtKSk7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBbSXNBUk1dOworfQorCisvLyBTcGVjaWFsIGNhc2VzCitjbGFzcyBYSTxkYWcgb29wcywgZGFnIGlvcHMsIEFkZHJNb2RlIGFtLCBTaXplRmxhZ1ZhbCBzeiwKKyAgICAgICAgIEluZGV4TW9kZSBpbSwgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdEFSTTxhbSwgc3osIGltLCBmLCBHZW5lcmljRG9tYWluLCBjc3RyLCBpdGluPiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IG9vcHM7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gaW9wczsKKyAgbGV0IEFzbVN0cmluZyA9IGFzbTsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtJc0FSTV07Cit9CisKK2NsYXNzIEFJPGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCAiIiwgcGF0dGVybj47CitjbGFzcyBBc0k8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBzSTxvb3BzLCBpb3BzLCBBZGRyTW9kZU5vbmUsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPjsKK2NsYXNzIEFYSTxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFhJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwKKyAgICAgICBhc20sICIiLCBwYXR0ZXJuPjsKK2NsYXNzIEFJbm9QPGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJbm9QPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwKKyAgICAgICAgIG9wYywgYXNtLCAiIiwgcGF0dGVybj47CisKKy8vIEN0cmwgZmxvdyBpbnN0cnVjdGlvbnMKK2NsYXNzIEFCSTxiaXRzPDQ+IG9wY29kLCBkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZU5vbmUsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIEJyRnJtLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI3LTI0fSA9IG9wY29kOworfQorY2xhc3MgQUJYSTxiaXRzPDQ+IG9wY29kLCBkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFhJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgQnJGcm0sIGl0aW4sCisgICAgICAgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHsyNy0yNH0gPSBvcGNvZDsKK30KK2NsYXNzIEFCWEl4MjxkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWEk8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplOEJ5dGVzLCBJbmRleE1vZGVOb25lLCBQc2V1ZG8sIGl0aW4sCisgICAgICAgYXNtLCAiIiwgcGF0dGVybj47CisKKy8vIEJSX0pUIGluc3RydWN0aW9ucworY2xhc3MgSlRJPGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYSTxvb3BzLCBpb3BzLCBBZGRyTW9kZU5vbmUsIFNpemVTcGVjaWFsLCBJbmRleE1vZGVOb25lLCBCck1pc2NGcm0sIGl0aW4sCisgICAgICAgYXNtLCAiIiwgcGF0dGVybj47CisKKworLy8gQXRvbWljIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zCisKK2NsYXNzIEFJbGRyZXg8Yml0czwyPiBvcGNvZCwgZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgTGRTdEV4RnJtLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI3LTIzfSA9IDBiMDAwMTE7CisgIGxldCBJbnN0ezIyLTIxfSA9IG9wY29kOworICBsZXQgSW5zdHsyMH0gPSAxOworICBsZXQgSW5zdHsxMS0wfSAgPSAwYjExMTExMDAxMTExMTsKK30KK2NsYXNzIEFJc3RyZXg8Yml0czwyPiBvcGNvZCwgZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgTGRTdEV4RnJtLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI3LTIzfSA9IDBiMDAwMTE7CisgIGxldCBJbnN0ezIyLTIxfSA9IG9wY29kOworICBsZXQgSW5zdHsyMH0gPSAwOworICBsZXQgSW5zdHsxMS00fSAgPSAwYjExMTExMDAxOworfQorCisvLyBhZGRybW9kZTEgaW5zdHJ1Y3Rpb25zCitjbGFzcyBBSTE8Yml0czw0PiBvcGNvZCwgZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgbGV0IEluc3R7MjctMjZ9ID0gezAsMH07Cit9CitjbGFzcyBBc0kxPGJpdHM8ND4gb3Bjb2QsIGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IHNJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwKKyAgICAgICBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjQtMjF9ID0gb3Bjb2Q7CisgIGxldCBJbnN0ezI3LTI2fSA9IHswLDB9OworfQorY2xhc3MgQVhJMTxiaXRzPDQ+IG9wY29kLCBkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTEsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICAgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgbGV0IEluc3R7MjctMjZ9ID0gezAsMH07Cit9CitjbGFzcyBBSTF4MjxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTEsIFNpemU4Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+OworCisKKy8vIGFkZHJtb2RlMiBsb2FkcyBhbmQgc3RvcmVzCitjbGFzcyBBSTI8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMiwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHsyNy0yNn0gPSB7MCwxfTsKK30KKworLy8gbG9hZHMKK2NsYXNzIEFJMmxkdzxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUyLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezIwfSAgICA9IDE7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDA7IC8vIFcgYml0CisgIGxldCBJbnN0ezIyfSAgICA9IDA7IC8vIEIgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDE7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI2fSA9IHswLDF9OworfQorY2xhc3MgQVhJMmxkdzxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTIsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICAgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHsyMH0gICAgPSAxOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyMn0gICAgPSAwOyAvLyBCIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAxOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNn0gPSB7MCwxfTsKK30KK2NsYXNzIEFJMmxkYjxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUyLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezIwfSAgICA9IDE7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDA7IC8vIFcgYml0CisgIGxldCBJbnN0ezIyfSAgICA9IDE7IC8vIEIgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDE7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI2fSA9IHswLDF9OworfQorY2xhc3MgQVhJMmxkYjxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTIsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICAgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHsyMH0gICAgPSAxOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyMn0gICAgPSAxOyAvLyBCIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAxOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNn0gPSB7MCwxfTsKK30KKworLy8gc3RvcmVzCitjbGFzcyBBSTJzdHc8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMiwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHsyMH0gICAgPSAwOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyMn0gICAgPSAwOyAvLyBCIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAxOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNn0gPSB7MCwxfTsKK30KK2NsYXNzIEFYSTJzdHc8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWEk8b29wcywgaW9wcywgQWRkck1vZGUyLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBmLCBpdGluLAorICAgICAgIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjJ9ICAgID0gMDsgLy8gQiBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjZ9ID0gezAsMX07Cit9CitjbGFzcyBBSTJzdGI8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMiwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHsyMH0gICAgPSAwOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyMn0gICAgPSAxOyAvLyBCIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAxOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNn0gPSB7MCwxfTsKK30KK2NsYXNzIEFYSTJzdGI8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWEk8b29wcywgaW9wcywgQWRkck1vZGUyLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBmLCBpdGluLAorICAgICAgIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjJ9ICAgID0gMTsgLy8gQiBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjZ9ID0gezAsMX07Cit9CisKKy8vIFByZS1pbmRleGVkIGxvYWRzCitjbGFzcyBBSTJsZHdwcjxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUyLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVQcmUsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgY3N0ciwgcGF0dGVybj4geworICBsZXQgSW5zdHsyMH0gICAgPSAxOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAxOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyMn0gICAgPSAwOyAvLyBCIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAxOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNn0gPSB7MCwxfTsKK30KK2NsYXNzIEFJMmxkYnByPGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTIsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZVByZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCBjc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezIwfSAgICA9IDE7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDE7IC8vIFcgYml0CisgIGxldCBJbnN0ezIyfSAgICA9IDE7IC8vIEIgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDE7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI2fSA9IHswLDF9OworfQorCisvLyBQcmUtaW5kZXhlZCBzdG9yZXMKK2NsYXNzIEFJMnN0d3ByPGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTIsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZVByZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCBjc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezIwfSAgICA9IDA7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDE7IC8vIFcgYml0CisgIGxldCBJbnN0ezIyfSAgICA9IDA7IC8vIEIgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDE7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI2fSA9IHswLDF9OworfQorY2xhc3MgQUkyc3RicHI8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMiwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlUHJlLCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMTsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjJ9ICAgID0gMTsgLy8gQiBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjZ9ID0gezAsMX07Cit9CisKKy8vIFBvc3QtaW5kZXhlZCBsb2FkcworY2xhc3MgQUkybGR3cG88ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMiwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlUG9zdCwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCBjc3RyLHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjJ9ICAgID0gMDsgLy8gQiBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMDsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjZ9ID0gezAsMX07Cit9CitjbGFzcyBBSTJsZGJwbzxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUyLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVQb3N0LCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sIGNzdHIscGF0dGVybj4geworICBsZXQgSW5zdHsyMH0gICAgPSAxOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyMn0gICAgPSAxOyAvLyBCIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAwOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNn0gPSB7MCwxfTsKK30KKworLy8gUG9zdC1pbmRleGVkIHN0b3JlcworY2xhc3MgQUkyc3R3cG88ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMiwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlUG9zdCwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCBjc3RyLHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjJ9ICAgID0gMDsgLy8gQiBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMDsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjZ9ID0gezAsMX07Cit9CitjbGFzcyBBSTJzdGJwbzxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUyLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVQb3N0LCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sIGNzdHIscGF0dGVybj4geworICBsZXQgSW5zdHsyMH0gICAgPSAwOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyMn0gICAgPSAxOyAvLyBCIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAwOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNn0gPSB7MCwxfTsKK30KKworLy8gYWRkcm1vZGUzIGluc3RydWN0aW9ucworY2xhc3MgQUkzPGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+OworY2xhc3MgQVhJMzxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICAgYXNtLCAiIiwgcGF0dGVybj47CisKKy8vIGxvYWRzCitjbGFzcyBBSTNsZGg8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMywgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHs0fSAgICAgPSAxOworICBsZXQgSW5zdHs1fSAgICAgPSAxOyAvLyBIIGJpdAorICBsZXQgSW5zdHs2fSAgICAgPSAwOyAvLyBTIGJpdAorICBsZXQgSW5zdHs3fSAgICAgPSAxOworICBsZXQgSW5zdHsyMH0gICAgPSAxOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAxOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNX0gPSAwYjAwMDsKK30KK2NsYXNzIEFYSTNsZGg8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWEk8b29wcywgaW9wcywgQWRkck1vZGUzLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBmLCBpdGluLAorICAgICAgIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMTsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMDsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKK30KK2NsYXNzIEFJM2xkc2g8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMTsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMTsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7Cit9CitjbGFzcyBBWEkzbGRzaDxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWEk8b29wcywgaW9wcywgQWRkck1vZGUzLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBmLCBpdGluLAorICAgICAgIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMTsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMTsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKK30KK2NsYXNzIEFJM2xkc2I8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMDsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMTsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7Cit9CitjbGFzcyBBWEkzbGRzYjxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWEk8b29wcywgaW9wcywgQWRkck1vZGUzLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBmLCBpdGluLAorICAgICAgIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMDsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMTsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKK30KK2NsYXNzIEFJM2xkZDxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUzLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezR9ICAgICA9IDE7CisgIGxldCBJbnN0ezV9ICAgICA9IDA7IC8vIEggYml0CisgIGxldCBJbnN0ezZ9ICAgICA9IDE7IC8vIFMgYml0CisgIGxldCBJbnN0ezd9ICAgICA9IDE7CisgIGxldCBJbnN0ezIwfSAgICA9IDA7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDA7IC8vIFcgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDE7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI1fSA9IDBiMDAwOworfQorCisvLyBzdG9yZXMKK2NsYXNzIEFJM3N0aDxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUzLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezR9ICAgICA9IDE7CisgIGxldCBJbnN0ezV9ICAgICA9IDE7IC8vIEggYml0CisgIGxldCBJbnN0ezZ9ICAgICA9IDA7IC8vIFMgYml0CisgIGxldCBJbnN0ezd9ICAgICA9IDE7CisgIGxldCBJbnN0ezIwfSAgICA9IDA7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDA7IC8vIFcgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDE7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI1fSA9IDBiMDAwOworfQorY2xhc3MgQVhJM3N0aDxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICAgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHs0fSAgICAgPSAxOworICBsZXQgSW5zdHs1fSAgICAgPSAxOyAvLyBIIGJpdAorICBsZXQgSW5zdHs2fSAgICAgPSAwOyAvLyBTIGJpdAorICBsZXQgSW5zdHs3fSAgICAgPSAxOworICBsZXQgSW5zdHsyMH0gICAgPSAwOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAxOyAvLyBQIGJpdAorfQorY2xhc3MgQUkzc3RkPGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMTsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMTsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7Cit9CisKKy8vIFByZS1pbmRleGVkIGxvYWRzCitjbGFzcyBBSTNsZGhwcjxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUzLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVQcmUsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgY3N0ciwgcGF0dGVybj4geworICBsZXQgSW5zdHs0fSAgICAgPSAxOworICBsZXQgSW5zdHs1fSAgICAgPSAxOyAvLyBIIGJpdAorICBsZXQgSW5zdHs2fSAgICAgPSAwOyAvLyBTIGJpdAorICBsZXQgSW5zdHs3fSAgICAgPSAxOworICBsZXQgSW5zdHsyMH0gICAgPSAxOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAxOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAxOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNX0gPSAwYjAwMDsKK30KK2NsYXNzIEFJM2xkc2hwcjxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMywgU2l6ZTRCeXRlcywgSW5kZXhNb2RlUHJlLCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMTsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMTsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMTsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7Cit9CitjbGFzcyBBSTNsZHNicHI8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZVByZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCBjc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezR9ICAgICA9IDE7CisgIGxldCBJbnN0ezV9ICAgICA9IDA7IC8vIEggYml0CisgIGxldCBJbnN0ezZ9ICAgICA9IDE7IC8vIFMgYml0CisgIGxldCBJbnN0ezd9ICAgICA9IDE7CisgIGxldCBJbnN0ezIwfSAgICA9IDE7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDE7IC8vIFcgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDE7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI1fSA9IDBiMDAwOworfQorY2xhc3MgQUkzbGRkcHI8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZVByZSwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCBjc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezR9ICAgICA9IDE7CisgIGxldCBJbnN0ezV9ICAgICA9IDA7IC8vIEggYml0CisgIGxldCBJbnN0ezZ9ICAgICA9IDE7IC8vIFMgYml0CisgIGxldCBJbnN0ezd9ICAgICA9IDE7CisgIGxldCBJbnN0ezIwfSAgICA9IDA7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDE7IC8vIFcgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDE7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI1fSA9IDBiMDAwOworfQorCisKKy8vIFByZS1pbmRleGVkIHN0b3JlcworY2xhc3MgQUkzc3RocHI8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMywgU2l6ZTRCeXRlcywgSW5kZXhNb2RlUHJlLCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMTsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMDsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMTsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7Cit9CitjbGFzcyBBSTNzdGRwcjxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMywgU2l6ZTRCeXRlcywgSW5kZXhNb2RlUHJlLCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMTsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMTsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMTsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMTsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7Cit9CisKKy8vIFBvc3QtaW5kZXhlZCBsb2FkcworY2xhc3MgQUkzbGRocG88ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlMywgU2l6ZTRCeXRlcywgSW5kZXhNb2RlUG9zdCwgZiwgaXRpbiwKKyAgICAgIG9wYywgYXNtLCBjc3RyLHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMTsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMDsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMDsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7Cit9CitjbGFzcyBBSTNsZHNocG88ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZVBvc3QsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgY3N0cixwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezR9ICAgICA9IDE7CisgIGxldCBJbnN0ezV9ICAgICA9IDE7IC8vIEggYml0CisgIGxldCBJbnN0ezZ9ICAgICA9IDE7IC8vIFMgYml0CisgIGxldCBJbnN0ezd9ICAgICA9IDE7CisgIGxldCBJbnN0ezIwfSAgICA9IDE7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDA7IC8vIFcgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDA7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI1fSA9IDBiMDAwOworfQorY2xhc3MgQUkzbGRzYnBvPGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUzLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVQb3N0LCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sIGNzdHIscGF0dGVybj4geworICBsZXQgSW5zdHs0fSAgICAgPSAxOworICBsZXQgSW5zdHs1fSAgICAgPSAwOyAvLyBIIGJpdAorICBsZXQgSW5zdHs2fSAgICAgPSAxOyAvLyBTIGJpdAorICBsZXQgSW5zdHs3fSAgICAgPSAxOworICBsZXQgSW5zdHsyMH0gICAgPSAxOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAwOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNX0gPSAwYjAwMDsKK30KK2NsYXNzIEFJM2xkZHBvPGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGUzLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVQb3N0LCBmLCBpdGluLAorICAgICAgb3BjLCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMTsKKyAgbGV0IEluc3R7NX0gICAgID0gMDsgLy8gSCBiaXQKKyAgbGV0IEluc3R7Nn0gICAgID0gMTsgLy8gUyBiaXQKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjF9ICAgID0gMDsgLy8gVyBiaXQKKyAgbGV0IEluc3R7MjR9ICAgID0gMDsgLy8gUCBiaXQKKyAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7Cit9CisKKy8vIFBvc3QtaW5kZXhlZCBzdG9yZXMKK2NsYXNzIEFJM3N0aHBvPGRhZyBvb3BzLCBkYWcgaW9wcywgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZVBvc3QsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgY3N0cixwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezR9ICAgICA9IDE7CisgIGxldCBJbnN0ezV9ICAgICA9IDE7IC8vIEggYml0CisgIGxldCBJbnN0ezZ9ICAgICA9IDA7IC8vIFMgYml0CisgIGxldCBJbnN0ezd9ICAgICA9IDE7CisgIGxldCBJbnN0ezIwfSAgICA9IDA7IC8vIEwgYml0CisgIGxldCBJbnN0ezIxfSAgICA9IDA7IC8vIFcgYml0CisgIGxldCBJbnN0ezI0fSAgICA9IDA7IC8vIFAgYml0CisgIGxldCBJbnN0ezI3LTI1fSA9IDBiMDAwOworfQorY2xhc3MgQUkzc3RkcG88ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTMsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZVBvc3QsIGYsIGl0aW4sCisgICAgICBvcGMsIGFzbSwgY3N0ciwgcGF0dGVybj4geworICBsZXQgSW5zdHs0fSAgICAgPSAxOworICBsZXQgSW5zdHs1fSAgICAgPSAxOyAvLyBIIGJpdAorICBsZXQgSW5zdHs2fSAgICAgPSAxOyAvLyBTIGJpdAorICBsZXQgSW5zdHs3fSAgICAgPSAxOworICBsZXQgSW5zdHsyMH0gICAgPSAwOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdAorICBsZXQgSW5zdHsyNH0gICAgPSAwOyAvLyBQIGJpdAorICBsZXQgSW5zdHsyNy0yNX0gPSAwYjAwMDsKK30KKworLy8gYWRkcm1vZGU0IGluc3RydWN0aW9ucworY2xhc3MgQVhJNGxkPGRhZyBvb3BzLCBkYWcgaW9wcywgSW5kZXhNb2RlIGltLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWEk8b29wcywgaW9wcywgQWRkck1vZGU0LCBTaXplNEJ5dGVzLCBpbSwgZiwgaXRpbiwKKyAgICAgICBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsgLy8gTCBiaXQKKyAgbGV0IEluc3R7MjJ9ICAgID0gMDsgLy8gUyBiaXQKKyAgbGV0IEluc3R7MjctMjV9ID0gMGIxMDA7Cit9CitjbGFzcyBBWEk0c3Q8ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbmRleE1vZGUgaW0sIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTQsIFNpemU0Qnl0ZXMsIGltLCBmLCBpdGluLAorICAgICAgIGFzbSwgY3N0ciwgcGF0dGVybj4geworICBsZXQgSW5zdHsyMH0gICAgPSAwOyAvLyBMIGJpdAorICBsZXQgSW5zdHsyMn0gICAgPSAwOyAvLyBTIGJpdAorICBsZXQgSW5zdHsyNy0yNX0gPSAwYjEwMDsKK30KKworLy8gVW5zaWduZWQgbXVsdGlwbHksIG11bHRpcGx5LWFjY3VtdWxhdGUgaW5zdHJ1Y3Rpb25zLgorY2xhc3MgQU11bDFJPGJpdHM8Nz4gb3Bjb2QsIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgTXVsRnJtLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezctNH0gICA9IDBiMTAwMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsgLy8gUyBiaXQKKyAgbGV0IEluc3R7MjctMjF9ID0gb3Bjb2Q7Cit9CitjbGFzcyBBc011bDFJPGJpdHM8Nz4gb3Bjb2QsIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogc0k8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBNdWxGcm0sIGl0aW4sCisgICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezctNH0gICA9IDBiMTAwMTsKKyAgbGV0IEluc3R7MjctMjF9ID0gb3Bjb2Q7Cit9CisKKy8vIE1vc3Qgc2lnbmlmaWNhbnQgd29yZCBtdWx0aXBseQorY2xhc3MgQU11bDJJPGJpdHM8Nz4gb3Bjb2QsIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgTXVsRnJtLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezctNH0gICA9IDBiMTAwMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMTsKKyAgbGV0IEluc3R7MjctMjF9ID0gb3Bjb2Q7Cit9CisKKy8vIFNNVUw8eD48eT4gLyBTTVVMVzx5PiAvIFNNTEE8eD48eT4gLyBTTUxBVzx4Pjx5PgorY2xhc3MgQU11bHh5STxiaXRzPDc+IG9wY29kLCBkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBNdWxGcm0sIGl0aW4sCisgICAgICBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7NH0gICAgID0gMDsKKyAgbGV0IEluc3R7N30gICAgID0gMTsKKyAgbGV0IEluc3R7MjB9ICAgID0gMDsKKyAgbGV0IEluc3R7MjctMjF9ID0gb3Bjb2Q7Cit9CisKKy8vIEV4dGVuZCBpbnN0cnVjdGlvbnMuCitjbGFzcyBBRXh0STxiaXRzPDg+IG9wY29kLCBkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgRXh0RnJtLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezctNH0gICA9IDBiMDExMTsKKyAgbGV0IEluc3R7MjctMjB9ID0gb3Bjb2Q7Cit9CisKKy8vIE1pc2MgQXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMuCitjbGFzcyBBTWlzY0ExSTxiaXRzPDg+IG9wY29kLCBkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgQXJpdGhNaXNjRnJtLCBpdGluLAorICAgICAgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI3LTIwfSA9IG9wY29kOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBBUk1QYXQgLSBTYW1lIGFzIFBhdDw+LCBidXQgcmVxdWlyZXMgdGhhdCB0aGUgY29tcGlsZXIgYmUgaW4gQVJNIG1vZGUuCitjbGFzcyBBUk1QYXQ8ZGFnIHBhdHRlcm4sIGRhZyByZXN1bHQ+IDogUGF0PHBhdHRlcm4sIHJlc3VsdD4geworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtJc0FSTV07Cit9CitjbGFzcyBBUk1WNVRFUGF0PGRhZyBwYXR0ZXJuLCBkYWcgcmVzdWx0PiA6IFBhdDxwYXR0ZXJuLCByZXN1bHQ+IHsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBbSXNBUk0sIEhhc1Y1VEVdOworfQorY2xhc3MgQVJNVjZQYXQ8ZGFnIHBhdHRlcm4sIGRhZyByZXN1bHQ+IDogUGF0PHBhdHRlcm4sIHJlc3VsdD4geworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtJc0FSTSwgSGFzVjZdOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRodW1iIEluc3RydWN0aW9uIEZvcm1hdCBEZWZpbml0aW9ucy4KKy8vCisKKy8vIFRJIC0gVGh1bWIgaW5zdHJ1Y3Rpb24uCisKK2NsYXNzIFRodW1iSTxkYWcgb29wcywgZGFnIGlvcHMsIEFkZHJNb2RlIGFtLCBTaXplRmxhZ1ZhbCBzeiwKKyAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdFRodW1iPGFtLCBzeiwgSW5kZXhNb2RlTm9uZSwgVGh1bWJGcm0sIEdlbmVyaWNEb21haW4sIGNzdHIsIGl0aW4+IHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gb29wczsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSBpb3BzOworICBsZXQgQXNtU3RyaW5nID0gYXNtOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0lzVGh1bWJdOworfQorCitjbGFzcyBUSTxkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iSTxvb3BzLCBpb3BzLCBBZGRyTW9kZU5vbmUsIFNpemUyQnl0ZXMsIGl0aW4sIGFzbSwgIiIsIHBhdHRlcm4+OworCisvLyBUd28tYWRkcmVzcyBpbnN0cnVjdGlvbnMKK2NsYXNzIFRJdDxkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBhc20sCisgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVGh1bWJJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTJCeXRlcywgaXRpbiwgYXNtLCAiJGxocyA9ICRkc3QiLAorICAgICAgICAgICBwYXR0ZXJuPjsKKworLy8gdEJMLCB0QlggMzItYml0IGluc3RydWN0aW9ucworY2xhc3MgVEl4MjxiaXRzPDU+IG9wY29kMSwgYml0czwyPiBvcGNvZDIsIGJpdCBvcGNvZDMsCisgICAgICAgICAgIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBUaHVtYkk8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplNEJ5dGVzLCBpdGluLCBhc20sICIiLCBwYXR0ZXJuPiwKKyAgICAgIEVuY29kaW5nIHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gb3Bjb2QxOworICBsZXQgSW5zdHsxNS0xNH0gPSBvcGNvZDI7CisgIGxldCBJbnN0ezEyfSA9IG9wY29kMzsKK30KKworLy8gQlJfSlQgaW5zdHJ1Y3Rpb25zCitjbGFzcyBUSlRJPGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVGh1bWJJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZVNwZWNpYWwsIGl0aW4sIGFzbSwgIiIsIHBhdHRlcm4+OworCisvLyBUaHVtYjEgb25seQorY2xhc3MgVGh1bWIxSTxkYWcgb29wcywgZGFnIGlvcHMsIEFkZHJNb2RlIGFtLCBTaXplRmxhZ1ZhbCBzeiwKKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEluc3RUaHVtYjxhbSwgc3osIEluZGV4TW9kZU5vbmUsIFRodW1iRnJtLCBHZW5lcmljRG9tYWluLCBjc3RyLCBpdGluPiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IG9vcHM7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gaW9wczsKKyAgbGV0IEFzbVN0cmluZyA9IGFzbTsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtJc1RodW1iMU9ubHldOworfQorCitjbGFzcyBUMUk8ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMUk8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplMkJ5dGVzLCBpdGluLCBhc20sICIiLCBwYXR0ZXJuPjsKK2NsYXNzIFQxSXgyPGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMUk8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplNEJ5dGVzLCBpdGluLCBhc20sICIiLCBwYXR0ZXJuPjsKK2NsYXNzIFQxSlRJPGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMUk8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplU3BlY2lhbCwgaXRpbiwgYXNtLCAiIiwgcGF0dGVybj47CisKKy8vIFR3by1hZGRyZXNzIGluc3RydWN0aW9ucworY2xhc3MgVDFJdDxkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBUaHVtYjFJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTJCeXRlcywgaXRpbiwKKyAgICAgICAgICAgIGFzbSwgY3N0ciwgcGF0dGVybj47CisKKy8vIFRodW1iMSBpbnN0cnVjdGlvbiB0aGF0IGNhbiBlaXRoZXIgYmUgcHJlZGljYXRlZCBvciBzZXQgQ1BTUi4KK2NsYXNzIFRodW1iMXNJPGRhZyBvb3BzLCBkYWcgaW9wcywgQWRkck1vZGUgYW0sIFNpemVGbGFnVmFsIHN6LAorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJbnN0VGh1bWI8YW0sIHN6LCBJbmRleE1vZGVOb25lLCBUaHVtYkZybSwgR2VuZXJpY0RvbWFpbiwgY3N0ciwgaXRpbj4geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAhY29uKG9vcHMsIChvdXRzIHNfY2Nfb3V0OiRzKSk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gIWNvbihpb3BzLCAoaW5zIHByZWQ6JHApKTsKKyAgbGV0IEFzbVN0cmluZyA9ICFzdHJjb25jYXQob3BjLCAhc3RyY29uY2F0KCIke3N9JHtwfSIsIGFzbSkpOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0lzVGh1bWIxT25seV07Cit9CisKK2NsYXNzIFQxc0k8ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBUaHVtYjFzSTxvb3BzLCBpb3BzLCBBZGRyTW9kZU5vbmUsIFNpemUyQnl0ZXMsIGl0aW4sIG9wYywgYXNtLCAiIiwgcGF0dGVybj47CisKKy8vIFR3by1hZGRyZXNzIGluc3RydWN0aW9ucworY2xhc3MgVDFzSXQ8ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVGh1bWIxc0k8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplMkJ5dGVzLCBpdGluLCBvcGMsIGFzbSwKKyAgICAgICAgICAgICAiJGxocyA9ICRkc3QiLCBwYXR0ZXJuPjsKKworLy8gVGh1bWIxIGluc3RydWN0aW9uIHRoYXQgY2FuIGJlIHByZWRpY2F0ZWQuCitjbGFzcyBUaHVtYjFwSTxkYWcgb29wcywgZGFnIGlvcHMsIEFkZHJNb2RlIGFtLCBTaXplRmxhZ1ZhbCBzeiwKKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdFRodW1iPGFtLCBzeiwgSW5kZXhNb2RlTm9uZSwgVGh1bWJGcm0sIEdlbmVyaWNEb21haW4sIGNzdHIsIGl0aW4+IHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gb29wczsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAhY29uKGlvcHMsIChpbnMgcHJlZDokcCkpOworICBsZXQgQXNtU3RyaW5nID0gIXN0cmNvbmNhdChvcGMsICFzdHJjb25jYXQoIiR7cH0iLCBhc20pKTsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtJc1RodW1iMU9ubHldOworfQorCitjbGFzcyBUMXBJPGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVGh1bWIxcEk8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplMkJ5dGVzLCBpdGluLCBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+OworCisvLyBUd28tYWRkcmVzcyBpbnN0cnVjdGlvbnMKK2NsYXNzIFQxcEl0PGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMXBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTJCeXRlcywgaXRpbiwgb3BjLCBhc20sCisgICAgICAgICAgICAgIiRsaHMgPSAkZHN0IiwgcGF0dGVybj47CisKK2NsYXNzIFQxcEkxPGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMXBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlVDFfMSwgU2l6ZTJCeXRlcywgaXRpbiwgb3BjLCBhc20sICIiLCBwYXR0ZXJuPjsKK2NsYXNzIFQxcEkyPGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMXBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlVDFfMiwgU2l6ZTJCeXRlcywgaXRpbiwgb3BjLCBhc20sICIiLCBwYXR0ZXJuPjsKK2NsYXNzIFQxcEk0PGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMXBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlVDFfNCwgU2l6ZTJCeXRlcywgaXRpbiwgb3BjLCBhc20sICIiLCBwYXR0ZXJuPjsKK2NsYXNzIFQxcElzPGRhZyBvb3BzLCBkYWcgaW9wcywKKyAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMXBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlVDFfcywgU2l6ZTJCeXRlcywgaXRpbiwgb3BjLCBhc20sICIiLCBwYXR0ZXJuPjsKKworY2xhc3MgRW5jb2RpbmcxNiA6IEVuY29kaW5nIHsKKyAgbGV0IEluc3R7MzEtMTZ9ID0gMHgwMDAwOworfQorCisvLyBBNi4yIDE2LWJpdCBUaHVtYiBpbnN0cnVjdGlvbiBlbmNvZGluZworY2xhc3MgVDFFbmNvZGluZzxiaXRzPDY+IG9wY29kZT4gOiBFbmNvZGluZzE2IHsKKyAgbGV0IEluc3R7MTUtMTB9ID0gb3Bjb2RlOworfQorCisvLyBBNi4yLjEgU2hpZnQgKGltbWVkaWF0ZSksIGFkZCwgc3VidHJhY3QsIG1vdmUsIGFuZCBjb21wYXJlIGVuY29kaW5nLgorY2xhc3MgVDFHZW5lcmFsPGJpdHM8NT4gb3Bjb2RlPiA6IEVuY29kaW5nMTYgeworICBsZXQgSW5zdHsxNS0xNH0gPSAwYjAwOworICBsZXQgSW5zdHsxMy05fSA9IG9wY29kZTsKK30KKworLy8gQTYuMi4yIERhdGEtcHJvY2Vzc2luZyBlbmNvZGluZy4KK2NsYXNzIFQxRGF0YVByb2Nlc3Npbmc8Yml0czw0PiBvcGNvZGU+IDogRW5jb2RpbmcxNiB7CisgIGxldCBJbnN0ezE1LTEwfSA9IDBiMDEwMDAwOworICBsZXQgSW5zdHs5LTZ9ID0gb3Bjb2RlOworfQorCisvLyBBNi4yLjMgU3BlY2lhbCBkYXRhIGluc3RydWN0aW9ucyBhbmQgYnJhbmNoIGFuZCBleGNoYW5nZSBlbmNvZGluZy4KK2NsYXNzIFQxU3BlY2lhbDxiaXRzPDQ+IG9wY29kZT4gOiBFbmNvZGluZzE2IHsKKyAgbGV0IEluc3R7MTUtMTB9ID0gMGIwMTAwMDE7CisgIGxldCBJbnN0ezktNn0gPSBvcGNvZGU7Cit9CisKKy8vIEE2LjIuNCBMb2FkL3N0b3JlIHNpbmdsZSBkYXRhIGl0ZW0gZW5jb2RpbmcuCitjbGFzcyBUMUxvYWRTdG9yZTxiaXRzPDQ+IG9wQSwgYml0czwzPiBvcEI+IDogRW5jb2RpbmcxNiB7CisgIGxldCBJbnN0ezE1LTEyfSA9IG9wQTsKKyAgbGV0IEluc3R7MTEtOX0gPSBvcEI7Cit9CitjbGFzcyBUMUxkU3Q8Yml0czwzPiBvcEI+IDogVDFMb2FkU3RvcmU8MGIwMTAxLCBvcEI+OworY2xhc3MgVDFMZFN0NEltbTxiaXRzPDM+IG9wQj4gOiBUMUxvYWRTdG9yZTwwYjAxMTAsIG9wQj47IC8vIEltbWVkaWF0ZSwgNCBieXRlcworY2xhc3MgVDFMZFN0MUltbTxiaXRzPDM+IG9wQj4gOiBUMUxvYWRTdG9yZTwwYjAxMTEsIG9wQj47IC8vIEltbWVkaWF0ZSwgMSBieXRlCitjbGFzcyBUMUxkU3QySW1tPGJpdHM8Mz4gb3BCPiA6IFQxTG9hZFN0b3JlPDBiMTAwMCwgb3BCPjsgLy8gSW1tZWRpYXRlLCAyIGJ5dGVzCitjbGFzcyBUMUxkU3RTUDxiaXRzPDM+IG9wQj4gOiBUMUxvYWRTdG9yZTwwYjEwMDEsIG9wQj47ICAgLy8gU1AgcmVsYXRpdmUKKworLy8gQTYuMi41IE1pc2NlbGxhbmVvdXMgMTYtYml0IGluc3RydWN0aW9ucyBlbmNvZGluZy4KK2NsYXNzIFQxTWlzYzxiaXRzPDc+IG9wY29kZT4gOiBFbmNvZGluZzE2IHsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMDExOworICBsZXQgSW5zdHsxMS01fSA9IG9wY29kZTsKK30KKworLy8gVGh1bWIySSAtIFRodW1iMiBpbnN0cnVjdGlvbi4gQWxtb3N0IGFsbCBUaHVtYjIgaW5zdHJ1Y3Rpb25zIGFyZSBwcmVkaWNhYmxlLgorY2xhc3MgVGh1bWIySTxkYWcgb29wcywgZGFnIGlvcHMsIEFkZHJNb2RlIGFtLCBTaXplRmxhZ1ZhbCBzeiwKKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEluc3RBUk08YW0sIHN6LCBJbmRleE1vZGVOb25lLCBUaHVtYkZybSwgR2VuZXJpY0RvbWFpbiwgY3N0ciwgaXRpbj4geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSBvb3BzOworICBsZXQgSW5PcGVyYW5kTGlzdCA9ICFjb24oaW9wcywgKGlucyBwcmVkOiRwKSk7CisgIGxldCBBc21TdHJpbmcgPSAhc3RyY29uY2F0KG9wYywgIXN0cmNvbmNhdCgiJHtwfSIsIGFzbSkpOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0lzVGh1bWIyXTsKK30KKworLy8gU2FtZSBhcyBUaHVtYjJJIGV4Y2VwdCBpdCBjYW4gb3B0aW9uYWxseSBtb2RpZnkgQ1BTUi4gTm90ZSBpdCdzIG1vZGVsZWQgYXMKKy8vIGFuIGlucHV0IG9wZXJhbmQgc2luY2UgYnkgZGVmYXVsdCBpdCdzIGEgemVybyByZWdpc3Rlci4gSXQgd2lsbAorLy8gYmVjb21lIGFuIGltcGxpY2l0IGRlZiBvbmNlIGl0J3MgImZsaXBwZWQiLgorLy8gRklYTUU6IFRoaXMgdXNlcyB1bmlmaWVkIHN5bnRheCBzbyB7c30gY29tZXMgYmVmb3JlIHtwfS4gV2Ugc2hvdWxkIG1ha2UgaXQKKy8vIG1vcmUgY29uc2lzdGVudC4KK2NsYXNzIFRodW1iMnNJPGRhZyBvb3BzLCBkYWcgaW9wcywgQWRkck1vZGUgYW0sIFNpemVGbGFnVmFsIHN6LAorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJbnN0QVJNPGFtLCBzeiwgSW5kZXhNb2RlTm9uZSwgVGh1bWJGcm0sIEdlbmVyaWNEb21haW4sIGNzdHIsIGl0aW4+IHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gb29wczsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAhY29uKGlvcHMsIChpbnMgcHJlZDokcCwgY2Nfb3V0OiRzKSk7CisgIGxldCBBc21TdHJpbmcgPSAhc3RyY29uY2F0KG9wYywgIXN0cmNvbmNhdCgiJHtzfSR7cH0iLCBhc20pKTsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtJc1RodW1iMl07Cit9CisKKy8vIFNwZWNpYWwgY2FzZXMKK2NsYXNzIFRodW1iMlhJPGRhZyBvb3BzLCBkYWcgaW9wcywgQWRkck1vZGUgYW0sIFNpemVGbGFnVmFsIHN6LAorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJbnN0QVJNPGFtLCBzeiwgSW5kZXhNb2RlTm9uZSwgVGh1bWJGcm0sIEdlbmVyaWNEb21haW4sIGNzdHIsIGl0aW4+IHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gb29wczsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSBpb3BzOworICBsZXQgQXNtU3RyaW5nID0gYXNtOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0lzVGh1bWIyXTsKK30KKworY2xhc3MgVGh1bWJYSTxkYWcgb29wcywgZGFnIGlvcHMsIEFkZHJNb2RlIGFtLCBTaXplRmxhZ1ZhbCBzeiwKKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEluc3RBUk08YW0sIHN6LCBJbmRleE1vZGVOb25lLCBUaHVtYkZybSwgR2VuZXJpY0RvbWFpbiwgY3N0ciwgaXRpbj4geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSBvb3BzOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IGlvcHM7CisgIGxldCBBc21TdHJpbmcgPSBhc207CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBbSXNUaHVtYjFPbmx5XTsKK30KKworY2xhc3MgVDJJPGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBUaHVtYjJJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgaXRpbiwgb3BjLCBhc20sICIiLCBwYXR0ZXJuPjsKK2NsYXNzIFQySWkxMjxkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVGh1bWIySTxvb3BzLCBpb3BzLCBBZGRyTW9kZVQyX2kxMiwgU2l6ZTRCeXRlcywgaXRpbiwgb3BjLCBhc20sICIiLHBhdHRlcm4+OworY2xhc3MgVDJJaTg8ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVGh1bWIySTxvb3BzLCBpb3BzLCBBZGRyTW9kZVQyX2k4LCBTaXplNEJ5dGVzLCBpdGluLCBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+OworY2xhc3MgVDJJc288ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVGh1bWIySTxvb3BzLCBpb3BzLCBBZGRyTW9kZVQyX3NvLCBTaXplNEJ5dGVzLCBpdGluLCBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+OworY2xhc3MgVDJJcGM8ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVGh1bWIySTxvb3BzLCBpb3BzLCBBZGRyTW9kZVQyX3BjLCBTaXplNEJ5dGVzLCBpdGluLCBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+OworY2xhc3MgVDJJaThzNDxiaXQgUCwgYml0IFcsIGJpdCBsb2FkLCBkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMkk8b29wcywgaW9wcywgQWRkck1vZGVUMl9pOHM0LCBTaXplNEJ5dGVzLCBpdGluLCBvcGMsIGFzbSwgIiIsCisgICAgICAgICAgICBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDA7CisgIGxldCBJbnN0ezI0fSA9IFA7CisgIGxldCBJbnN0ezIzfSA9ID87IC8vIFRoZSBVIGJpdC4KKyAgbGV0IEluc3R7MjJ9ID0gMTsKKyAgbGV0IEluc3R7MjF9ID0gVzsKKyAgbGV0IEluc3R7MjB9ID0gbG9hZDsKK30KKworY2xhc3MgVDJzSTxkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMnNJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgaXRpbiwgb3BjLCBhc20sICIiLCBwYXR0ZXJuPjsKKworY2xhc3MgVDJYSTxkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMlhJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgaXRpbiwgYXNtLCAiIiwgcGF0dGVybj47CitjbGFzcyBUMkpUSTxkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBUaHVtYjJYSTxvb3BzLCBpb3BzLCBBZGRyTW9kZU5vbmUsIFNpemVTcGVjaWFsLCBpdGluLCBhc20sICIiLCBwYXR0ZXJuPjsKKworY2xhc3MgVDJJeDI8ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVGh1bWIySTxvb3BzLCBpb3BzLCBBZGRyTW9kZU5vbmUsIFNpemU4Qnl0ZXMsIGl0aW4sIG9wYywgYXNtLCAiIiwgcGF0dGVybj47CisKKy8vIFR3by1hZGRyZXNzIGluc3RydWN0aW9ucworY2xhc3MgVDJYSXQ8ZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFRodW1iMlhJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgaXRpbiwgYXNtLCBjc3RyLCBwYXR0ZXJuPjsKKworLy8gVDJJaWR4bGRzdCAtIFRodW1iMiBpbmRleGVkIGxvYWQgLyBzdG9yZSBpbnN0cnVjdGlvbnMuCitjbGFzcyBUMklpZHhsZHN0PGJpdCBzaWduZWQsIGJpdHM8Mj4gb3Bjb2QsIGJpdCBsb2FkLCBiaXQgcHJlLAorICAgICAgICAgICAgICAgICBkYWcgb29wcywgZGFnIGlvcHMsCisgICAgICAgICAgICAgICAgIEFkZHJNb2RlIGFtLCBJbmRleE1vZGUgaW0sIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJbnN0QVJNPGFtLCBTaXplNEJ5dGVzLCBpbSwgVGh1bWJGcm0sIEdlbmVyaWNEb21haW4sIGNzdHIsIGl0aW4+IHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gb29wczsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAhY29uKGlvcHMsIChpbnMgcHJlZDokcCkpOworICBsZXQgQXNtU3RyaW5nID0gIXN0cmNvbmNhdChvcGMsICFzdHJjb25jYXQoIiR7cH0iLCBhc20pKTsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtJc1RodW1iMl07CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDA7CisgIGxldCBJbnN0ezI0fSA9IHNpZ25lZDsKKyAgbGV0IEluc3R7MjN9ID0gMDsKKyAgbGV0IEluc3R7MjItMjF9ID0gb3Bjb2Q7CisgIGxldCBJbnN0ezIwfSA9IGxvYWQ7CisgIGxldCBJbnN0ezExfSA9IDE7CisgIC8vIChQLCBXKSA9ICgxLCAxKSBQcmUtaW5kZXhlZCBvciAoMCwgMSkgUG9zdC1pbmRleGVkCisgIGxldCBJbnN0ezEwfSA9IHByZTsgLy8gVGhlIFAgYml0LgorICBsZXQgSW5zdHs4fSA9IDE7IC8vIFRoZSBXIGJpdC4KK30KKworLy8gSGVscGVyIGNsYXNzIGZvciBkaXNhc3NlbWJseSBvbmx5CisvLyBBNi4zLjE2ICYgQTYuMy4xNworLy8gVDJJbWFjIC0gVGh1bWIyIG11bHRpcGx5IFthY2N1bXVsYXRlLCBhbmQgYWJzb2x1dGUgZGlmZmVyZW5jZV0gaW5zdHJ1Y3Rpb25zLgorY2xhc3MgVDJJX21hYzxiaXQgbG9uZywgYml0czwzPiBvcDIyXzIwLCBiaXRzPDQ+IG9wN180LCBkYWcgb29wcywgZGFnIGlvcHMsCisgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVDJJPG9vcHMsIGlvcHMsIGl0aW4sIG9wYywgYXNtLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTI0fSA9IDBiMDExOworICBsZXQgSW5zdHsyM30gPSBsb25nOworICBsZXQgSW5zdHsyMi0yMH0gPSBvcDIyXzIwOworICBsZXQgSW5zdHs3LTR9ID0gb3A3XzQ7Cit9CisKKy8vIFR2NVBhdCAtIFNhbWUgYXMgUGF0PD4sIGJ1dCByZXF1aXJlcyBWNVQgVGh1bWIgbW9kZS4KK2NsYXNzIFR2NVBhdDxkYWcgcGF0dGVybiwgZGFnIHJlc3VsdD4gOiBQYXQ8cGF0dGVybiwgcmVzdWx0PiB7CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0lzVGh1bWIxT25seSwgSGFzVjVUXTsKK30KKworLy8gVDFQYXQgLSBTYW1lIGFzIFBhdDw+LCBidXQgcmVxdWlyZXMgdGhhdCB0aGUgY29tcGlsZXIgYmUgaW4gVGh1bWIxIG1vZGUuCitjbGFzcyBUMVBhdDxkYWcgcGF0dGVybiwgZGFnIHJlc3VsdD4gOiBQYXQ8cGF0dGVybiwgcmVzdWx0PiB7CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0lzVGh1bWIxT25seV07Cit9CisKKy8vIFQyUGF0IC0gU2FtZSBhcyBQYXQ8PiwgYnV0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbXBpbGVyIGJlIGluIFRodW1iMiBtb2RlLgorY2xhc3MgVDJQYXQ8ZGFnIHBhdHRlcm4sIGRhZyByZXN1bHQ+IDogUGF0PHBhdHRlcm4sIHJlc3VsdD4geworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtJc1RodW1iMl07Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBUk0gVkZQIEluc3RydWN0aW9uIHRlbXBsYXRlcy4KKy8vCisKKy8vIEFsbW9zdCBhbGwgVkZQIGluc3RydWN0aW9ucyBhcmUgcHJlZGljYWJsZS4KK2NsYXNzIFZGUEk8ZGFnIG9vcHMsIGRhZyBpb3BzLCBBZGRyTW9kZSBhbSwgU2l6ZUZsYWdWYWwgc3osCisgICAgICAgICAgIEluZGV4TW9kZSBpbSwgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJbnN0QVJNPGFtLCBzeiwgaW0sIGYsIFZGUERvbWFpbiwgY3N0ciwgaXRpbj4geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSBvb3BzOworICBsZXQgSW5PcGVyYW5kTGlzdCA9ICFjb24oaW9wcywgKGlucyBwcmVkOiRwKSk7CisgIGxldCBBc21TdHJpbmcgPSAhc3RyY29uY2F0KG9wYywgIXN0cmNvbmNhdCgiJHtwfSIsIGFzbSkpOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0hhc1ZGUDJdOworfQorCisvLyBTcGVjaWFsIGNhc2VzCitjbGFzcyBWRlBYSTxkYWcgb29wcywgZGFnIGlvcHMsIEFkZHJNb2RlIGFtLCBTaXplRmxhZ1ZhbCBzeiwKKyAgICAgICAgICAgIEluZGV4TW9kZSBpbSwgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdEFSTTxhbSwgc3osIGltLCBmLCBWRlBEb21haW4sIGNzdHIsIGl0aW4+IHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gb29wczsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSBpb3BzOworICBsZXQgQXNtU3RyaW5nID0gYXNtOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0hhc1ZGUDJdOworfQorCitjbGFzcyBWRlBBSTxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVkZQSTxvb3BzLCBpb3BzLCBBZGRyTW9kZU5vbmUsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sCisgICAgICAgICBvcGMsIGFzbSwgIiIsIHBhdHRlcm4+OworCisvLyBBUk0gVkZQIGFkZHJtb2RlNSBsb2FkcyBhbmQgc3RvcmVzCitjbGFzcyBBREk1PGJpdHM8ND4gb3Bjb2QxLCBiaXRzPDI+IG9wY29kMiwgZGFnIG9vcHMsIGRhZyBpb3BzLAorICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBWRlBJPG9vcHMsIGlvcHMsIEFkZHJNb2RlNSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwKKyAgICAgICAgIFZGUExkU3RGcm0sIGl0aW4sIG9wYywgYXNtLCAiIiwgcGF0dGVybj4geworICAvLyBUT0RPOiBNYXJrIHRoZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc3VidGFyZ2V0IGluZm8uCisgIGxldCBJbnN0ezI3LTI0fSA9IG9wY29kMTsKKyAgbGV0IEluc3R7MjEtMjB9ID0gb3Bjb2QyOworICBsZXQgSW5zdHsxMS04fSAgPSAwYjEwMTE7CisKKyAgLy8gNjQtYml0IGxvYWRzICYgc3RvcmVzIG9wZXJhdGUgb24gYm90aCBORU9OIGFuZCBWRlAgcGlwZWxpbmVzLgorICBsZXQgRCA9IFZGUE5lb25Eb21haW47Cit9CisKK2NsYXNzIEFTSTU8Yml0czw0PiBvcGNvZDEsIGJpdHM8Mj4gb3Bjb2QyLCBkYWcgb29wcywgZGFnIGlvcHMsCisgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFZGUEk8b29wcywgaW9wcywgQWRkck1vZGU1LCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLAorICAgICAgICAgVkZQTGRTdEZybSwgaXRpbiwgb3BjLCBhc20sICIiLCBwYXR0ZXJuPiB7CisgIC8vIFRPRE86IE1hcmsgdGhlIGluc3RydWN0aW9ucyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzdWJ0YXJnZXQgaW5mby4KKyAgbGV0IEluc3R7MjctMjR9ID0gb3Bjb2QxOworICBsZXQgSW5zdHsyMS0yMH0gPSBvcGNvZDI7CisgIGxldCBJbnN0ezExLTh9ICA9IDBiMTAxMDsKK30KKworLy8gTG9hZCAvIHN0b3JlIG11bHRpcGxlCitjbGFzcyBBWERJNTxkYWcgb29wcywgZGFnIGlvcHMsIEluZGV4TW9kZSBpbSwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBWRlBYSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTUsIFNpemU0Qnl0ZXMsIGltLAorICAgICAgICAgIFZGUExkU3RNdWxGcm0sIGl0aW4sIGFzbSwgY3N0ciwgcGF0dGVybj4geworICAvLyBUT0RPOiBNYXJrIHRoZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc3VidGFyZ2V0IGluZm8uCisgIGxldCBJbnN0ezI3LTI1fSA9IDBiMTEwOworICBsZXQgSW5zdHsxMS04fSAgPSAwYjEwMTE7CisKKyAgLy8gNjQtYml0IGxvYWRzICYgc3RvcmVzIG9wZXJhdGUgb24gYm90aCBORU9OIGFuZCBWRlAgcGlwZWxpbmVzLgorICBsZXQgRCA9IFZGUE5lb25Eb21haW47Cit9CisKK2NsYXNzIEFYU0k1PGRhZyBvb3BzLCBkYWcgaW9wcywgSW5kZXhNb2RlIGltLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFZGUFhJPG9vcHMsIGlvcHMsIEFkZHJNb2RlNSwgU2l6ZTRCeXRlcywgaW0sCisgICAgICAgICAgVkZQTGRTdE11bEZybSwgaXRpbiwgYXNtLCBjc3RyLCBwYXR0ZXJuPiB7CisgIC8vIFRPRE86IE1hcmsgdGhlIGluc3RydWN0aW9ucyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzdWJ0YXJnZXQgaW5mby4KKyAgbGV0IEluc3R7MjctMjV9ID0gMGIxMTA7CisgIGxldCBJbnN0ezExLTh9ICA9IDBiMTAxMDsKK30KKworLy8gRG91YmxlIHByZWNpc2lvbiwgdW5hcnkKK2NsYXNzIEFEdUk8Yml0czw1PiBvcGNvZDEsIGJpdHM8Mj4gb3Bjb2QyLCBiaXRzPDQ+IG9wY29kMywgYml0czwyPiBvcGNvZDQsCisgICAgICAgICAgIGJpdCBvcGNvZDUsIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIG9wYywKKyAgICAgICAgICAgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVkZQQUk8b29wcywgaW9wcywgVkZQVW5hcnlGcm0sIGl0aW4sIG9wYywgYXNtLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI3LTIzfSA9IG9wY29kMTsKKyAgbGV0IEluc3R7MjEtMjB9ID0gb3Bjb2QyOworICBsZXQgSW5zdHsxOS0xNn0gPSBvcGNvZDM7CisgIGxldCBJbnN0ezExLTh9ICA9IDBiMTAxMTsKKyAgbGV0IEluc3R7Ny02fSAgID0gb3Bjb2Q0OworICBsZXQgSW5zdHs0fSAgICAgPSBvcGNvZDU7Cit9CisKKy8vIERvdWJsZSBwcmVjaXNpb24sIGJpbmFyeQorY2xhc3MgQURiSTxiaXRzPDU+IG9wY29kMSwgYml0czwyPiBvcGNvZDIsIGJpdCBvcDYsIGJpdCBvcDQsIGRhZyBvb3BzLAorICAgICAgICAgICBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVkZQQUk8b29wcywgaW9wcywgVkZQQmluYXJ5RnJtLCBpdGluLCBvcGMsIGFzbSwgcGF0dGVybj4geworICBsZXQgSW5zdHsyNy0yM30gPSBvcGNvZDE7CisgIGxldCBJbnN0ezIxLTIwfSA9IG9wY29kMjsKKyAgbGV0IEluc3R7MTEtOH0gID0gMGIxMDExOworICBsZXQgSW5zdHs2fSA9IG9wNjsKKyAgbGV0IEluc3R7NH0gPSBvcDQ7Cit9CisKKy8vIERvdWJsZSBwcmVjaXNpb24sIGJpbmFyeSwgVk1MW0FTXSAoZm9yIGFkZGl0aW9uYWwgcHJlZGljYXRlKQorY2xhc3MgQURiSV92bWxYPGJpdHM8NT4gb3Bjb2QxLCBiaXRzPDI+IG9wY29kMiwgYml0IG9wNiwgYml0IG9wNCwgZGFnIG9vcHMsCisgICAgICAgICAgIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBWRlBBSTxvb3BzLCBpb3BzLCBWRlBCaW5hcnlGcm0sIGl0aW4sIG9wYywgYXNtLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI3LTIzfSA9IG9wY29kMTsKKyAgbGV0IEluc3R7MjEtMjB9ID0gb3Bjb2QyOworICBsZXQgSW5zdHsxMS04fSAgPSAwYjEwMTE7CisgIGxldCBJbnN0ezZ9ID0gb3A2OworICBsZXQgSW5zdHs0fSA9IG9wNDsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBbSGFzVkZQMiwgVXNlVk1MeF07Cit9CisKKworLy8gU2luZ2xlIHByZWNpc2lvbiwgdW5hcnkKK2NsYXNzIEFTdUk8Yml0czw1PiBvcGNvZDEsIGJpdHM8Mj4gb3Bjb2QyLCBiaXRzPDQ+IG9wY29kMywgYml0czwyPiBvcGNvZDQsCisgICAgICAgICAgIGJpdCBvcGNvZDUsIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIG9wYywKKyAgICAgICAgICAgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVkZQQUk8b29wcywgaW9wcywgVkZQVW5hcnlGcm0sIGl0aW4sIG9wYywgYXNtLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI3LTIzfSA9IG9wY29kMTsKKyAgbGV0IEluc3R7MjEtMjB9ID0gb3Bjb2QyOworICBsZXQgSW5zdHsxOS0xNn0gPSBvcGNvZDM7CisgIGxldCBJbnN0ezExLTh9ICA9IDBiMTAxMDsKKyAgbGV0IEluc3R7Ny02fSAgID0gb3Bjb2Q0OworICBsZXQgSW5zdHs0fSAgICAgPSBvcGNvZDU7Cit9CisKKy8vIFNpbmdsZSBwcmVjaXNpb24gdW5hcnksIGlmIG5vIE5FT04KKy8vIFNhbWUgYXMgQVN1SSBleGNlcHQgbm90IGF2YWlsYWJsZSBpZiBORU9OIGlzIGVuYWJsZWQKK2NsYXNzIEFTdUluPGJpdHM8NT4gb3Bjb2QxLCBiaXRzPDI+IG9wY29kMiwgYml0czw0PiBvcGNvZDMsIGJpdHM8Mj4gb3Bjb2Q0LAorICAgICAgICAgICAgYml0IG9wY29kNSwgZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgb3BjLAorICAgICAgICAgICAgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogQVN1STxvcGNvZDEsIG9wY29kMiwgb3Bjb2QzLCBvcGNvZDQsIG9wY29kNSwgb29wcywgaW9wcywgaXRpbiwgb3BjLCBhc20sCisgICAgICAgICBwYXR0ZXJuPiB7CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0hhc1ZGUDIsRG9udFVzZU5FT05Gb3JGUF07Cit9CisKKy8vIFNpbmdsZSBwcmVjaXNpb24sIGJpbmFyeQorY2xhc3MgQVNiSTxiaXRzPDU+IG9wY29kMSwgYml0czwyPiBvcGNvZDIsIGJpdCBvcDYsIGJpdCBvcDQsIGRhZyBvb3BzLCBkYWcgaW9wcywKKyAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVkZQQUk8b29wcywgaW9wcywgVkZQQmluYXJ5RnJtLCBpdGluLCBvcGMsIGFzbSwgcGF0dGVybj4geworICBsZXQgSW5zdHsyNy0yM30gPSBvcGNvZDE7CisgIGxldCBJbnN0ezIxLTIwfSA9IG9wY29kMjsKKyAgbGV0IEluc3R7MTEtOH0gID0gMGIxMDEwOworICBsZXQgSW5zdHs2fSA9IG9wNjsKKyAgbGV0IEluc3R7NH0gPSBvcDQ7Cit9CisKKy8vIFNpbmdsZSBwcmVjaXNpb24gYmluYXJ5LCBpZiBubyBORU9OCisvLyBTYW1lIGFzIEFTYkkgZXhjZXB0IG5vdCBhdmFpbGFibGUgaWYgTkVPTiBpcyBlbmFibGVkCitjbGFzcyBBU2JJbjxiaXRzPDU+IG9wY29kMSwgYml0czwyPiBvcGNvZDIsIGJpdCBvcDYsIGJpdCBvcDQsIGRhZyBvb3BzLAorICAgICAgICAgICAgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBhc20sCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBBU2JJPG9wY29kMSwgb3Bjb2QyLCBvcDYsIG9wNCwgb29wcywgaW9wcywgaXRpbiwgb3BjLCBhc20sIHBhdHRlcm4+IHsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBbSGFzVkZQMixEb250VXNlTkVPTkZvckZQXTsKK30KKworLy8gVkZQIGNvbnZlcnNpb24gaW5zdHJ1Y3Rpb25zCitjbGFzcyBBVkNvbnYxSTxiaXRzPDU+IG9wY29kMSwgYml0czwyPiBvcGNvZDIsIGJpdHM8ND4gb3Bjb2QzLCBiaXRzPDQ+IG9wY29kNCwKKyAgICAgICAgICAgICAgIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFZGUEFJPG9vcHMsIGlvcHMsIFZGUENvbnYxRnJtLCBpdGluLCBvcGMsIGFzbSwgcGF0dGVybj4geworICBsZXQgSW5zdHsyNy0yM30gPSBvcGNvZDE7CisgIGxldCBJbnN0ezIxLTIwfSA9IG9wY29kMjsKKyAgbGV0IEluc3R7MTktMTZ9ID0gb3Bjb2QzOworICBsZXQgSW5zdHsxMS04fSAgPSBvcGNvZDQ7CisgIGxldCBJbnN0ezZ9ICAgICA9IDE7CisgIGxldCBJbnN0ezR9ICAgICA9IDA7Cit9CisKKy8vIFZGUCBjb252ZXJzaW9uIGJldHdlZW4gZmxvYXRpbmctcG9pbnQgYW5kIGZpeGVkLXBvaW50CitjbGFzcyBBVkNvbnYxWEk8Yml0czw1PiBvcDEsIGJpdHM8Mj4gb3AyLCBiaXRzPDQ+IG9wMywgYml0czw0PiBvcDQsIGJpdCBvcDUsCisgICAgICAgICAgICAgICAgZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLAorICAgICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEFWQ29udjFJPG9wMSwgb3AyLCBvcDMsIG9wNCwgb29wcywgaW9wcywgaXRpbiwgb3BjLCBhc20sIHBhdHRlcm4+IHsKKyAgLy8gc2l6ZSAoZml4ZWQtcG9pbnQgbnVtYmVyKTogc3ggPT0gMCA/IDE2IDogMzIKKyAgbGV0IEluc3R7N30gPSBvcDU7IC8vIHN4Cit9CisKKy8vIFZGUCBjb252ZXJzaW9uIGluc3RydWN0aW9ucywgaWYgbm8gTkVPTgorY2xhc3MgQVZDb252MUluPGJpdHM8NT4gb3Bjb2QxLCBiaXRzPDI+IG9wY29kMiwgYml0czw0PiBvcGNvZDMsIGJpdHM8ND4gb3Bjb2Q0LAorICAgICAgICAgICAgICAgIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBBVkNvbnYxSTxvcGNvZDEsIG9wY29kMiwgb3Bjb2QzLCBvcGNvZDQsIG9vcHMsIGlvcHMsIGl0aW4sIG9wYywgYXNtLAorICAgICAgICAgICAgIHBhdHRlcm4+IHsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBbSGFzVkZQMixEb250VXNlTkVPTkZvckZQXTsKK30KKworY2xhc3MgQVZDb252WEk8Yml0czw4PiBvcGNvZDEsIGJpdHM8ND4gb3Bjb2QyLCBkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLAorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFZGUEFJPG9vcHMsIGlvcHMsIGYsIGl0aW4sIG9wYywgYXNtLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI3LTIwfSA9IG9wY29kMTsKKyAgbGV0IEluc3R7MTEtOH0gID0gb3Bjb2QyOworICBsZXQgSW5zdHs0fSAgICAgPSAxOworfQorCitjbGFzcyBBVkNvbnYySTxiaXRzPDg+IG9wY29kMSwgYml0czw0PiBvcGNvZDIsIGRhZyBvb3BzLCBkYWcgaW9wcywKKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEFWQ29udlhJPG9wY29kMSwgb3Bjb2QyLCBvb3BzLCBpb3BzLCBWRlBDb252MkZybSwgaXRpbiwgb3BjLCBhc20sIHBhdHRlcm4+OworCitjbGFzcyBBVkNvbnYzSTxiaXRzPDg+IG9wY29kMSwgYml0czw0PiBvcGNvZDIsIGRhZyBvb3BzLCBkYWcgaW9wcywKKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEFWQ29udlhJPG9wY29kMSwgb3Bjb2QyLCBvb3BzLCBpb3BzLCBWRlBDb252M0ZybSwgaXRpbiwgb3BjLCBhc20sIHBhdHRlcm4+OworCitjbGFzcyBBVkNvbnY0STxiaXRzPDg+IG9wY29kMSwgYml0czw0PiBvcGNvZDIsIGRhZyBvb3BzLCBkYWcgaW9wcywKKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEFWQ29udlhJPG9wY29kMSwgb3Bjb2QyLCBvb3BzLCBpb3BzLCBWRlBDb252NEZybSwgaXRpbiwgb3BjLCBhc20sIHBhdHRlcm4+OworCitjbGFzcyBBVkNvbnY1STxiaXRzPDg+IG9wY29kMSwgYml0czw0PiBvcGNvZDIsIGRhZyBvb3BzLCBkYWcgaW9wcywKKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEFWQ29udlhJPG9wY29kMSwgb3Bjb2QyLCBvb3BzLCBpb3BzLCBWRlBDb252NUZybSwgaXRpbiwgb3BjLCBhc20sIHBhdHRlcm4+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVJNIE5FT04gSW5zdHJ1Y3Rpb24gdGVtcGxhdGVzLgorLy8KKworY2xhc3MgTmVvbkk8ZGFnIG9vcHMsIGRhZyBpb3BzLCBBZGRyTW9kZSBhbSwgSW5kZXhNb2RlIGltLCBGb3JtYXQgZiwKKyAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBkdCwgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJbnN0QVJNPGFtLCBTaXplNEJ5dGVzLCBpbSwgZiwgTmVvbkRvbWFpbiwgY3N0ciwgaXRpbj4geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSBvb3BzOworICBsZXQgSW5PcGVyYW5kTGlzdCA9ICFjb24oaW9wcywgKGlucyBwcmVkOiRwKSk7CisgIGxldCBBc21TdHJpbmcgPSAhc3RyY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdCghc3RyY29uY2F0KG9wYywgIiR7cH0iKSwgIXN0cmNvbmNhdCgiLiIsIGR0KSksCisgICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KCJcdCIsIGFzbSkpOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0hhc05FT05dOworfQorCisvLyBTYW1lIGFzIE5lb25JIGV4Y2VwdCBpdCBkb2VzIG5vdCBoYXZlIGEgImRhdGEgdHlwZSIgc3BlY2lmaWVyLgorY2xhc3MgTmVvblhJPGRhZyBvb3BzLCBkYWcgaW9wcywgQWRkck1vZGUgYW0sIEluZGV4TW9kZSBpbSwgRm9ybWF0IGYsCisgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsCisgICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdEFSTTxhbSwgU2l6ZTRCeXRlcywgaW0sIGYsIE5lb25Eb21haW4sIGNzdHIsIGl0aW4+IHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gb29wczsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAhY29uKGlvcHMsIChpbnMgcHJlZDokcCkpOworICBsZXQgQXNtU3RyaW5nID0gIXN0cmNvbmNhdCghc3RyY29uY2F0KG9wYywgIiR7cH0iKSwgIXN0cmNvbmNhdCgiXHQiLCBhc20pKTsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtIYXNORU9OXTsKK30KKworY2xhc3MgTkxkU3Q8Yml0IG9wMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIGJpdHM8ND4gb3A3XzQsCisgICAgICAgICAgICBkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgZHQsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBOZW9uSTxvb3BzLCBpb3BzLCBBZGRyTW9kZTYsIEluZGV4TW9kZU5vbmUsIE5MZFN0RnJtLCBpdGluLCBvcGMsIGR0LCBhc20sCisgICAgICAgICAgY3N0ciwgcGF0dGVybj4geworICBsZXQgSW5zdHszMS0yNH0gPSAwYjExMTEwMTAwOworICBsZXQgSW5zdHsyM30gPSBvcDIzOworICBsZXQgSW5zdHsyMS0yMH0gPSBvcDIxXzIwOworICBsZXQgSW5zdHsxMS04fSA9IG9wMTFfODsKKyAgbGV0IEluc3R7Ny00fSA9IG9wN180OworfQorCitjbGFzcyBORGF0YUk8ZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgZHQsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBOZW9uSTxvb3BzLCBpb3BzLCBBZGRyTW9kZU5vbmUsIEluZGV4TW9kZU5vbmUsIGYsIGl0aW4sIG9wYywgZHQsIGFzbSwgY3N0ciwKKyAgICAgICAgICBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTI1fSA9IDBiMTExMTAwMTsKK30KKworY2xhc3MgTkRhdGFYSTxkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogTmVvblhJPG9vcHMsIGlvcHMsIEFkZHJNb2RlTm9uZSwgSW5kZXhNb2RlTm9uZSwgZiwgaXRpbiwgb3BjLCBhc20sCisgICAgICAgICAgIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMjV9ID0gMGIxMTExMDAxOworfQorCisvLyBORU9OICJvbmUgcmVnaXN0ZXIgYW5kIGEgbW9kaWZpZWQgaW1tZWRpYXRlIiBmb3JtYXQuCitjbGFzcyBOMU1vZEltbTxiaXQgb3AyMywgYml0czwzPiBvcDIxXzE5LCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNywgYml0IG9wNiwKKyAgICAgICAgICAgICAgIGJpdCBvcDUsIGJpdCBvcDQsCisgICAgICAgICAgICAgICBkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgZHQsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLAorICAgICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogTkRhdGFJPG9vcHMsIGlvcHMsIE4xUmVnTW9kSW1tRnJtLCBpdGluLCBvcGMsIGR0LCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjN9ID0gb3AyMzsKKyAgbGV0IEluc3R7MjEtMTl9ID0gb3AyMV8xOTsKKyAgbGV0IEluc3R7MTEtOH0gPSBvcDExXzg7CisgIGxldCBJbnN0ezd9ID0gb3A3OworICBsZXQgSW5zdHs2fSA9IG9wNjsKKyAgbGV0IEluc3R7NX0gPSBvcDU7CisgIGxldCBJbnN0ezR9ID0gb3A0OworfQorCisvLyBORU9OIDIgdmVjdG9yIHJlZ2lzdGVyIGZvcm1hdC4KK2NsYXNzIE4yVjxiaXRzPDI+IG9wMjRfMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czwyPiBvcDE5XzE4LCBiaXRzPDI+IG9wMTdfMTYsCisgICAgICAgICAgYml0czw1PiBvcDExXzcsIGJpdCBvcDYsIGJpdCBvcDQsCisgICAgICAgICAgZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBkdCwgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IE5EYXRhSTxvb3BzLCBpb3BzLCBOMlJlZ0ZybSwgaXRpbiwgb3BjLCBkdCwgYXNtLCBjc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI0LTIzfSA9IG9wMjRfMjM7CisgIGxldCBJbnN0ezIxLTIwfSA9IG9wMjFfMjA7CisgIGxldCBJbnN0ezE5LTE4fSA9IG9wMTlfMTg7CisgIGxldCBJbnN0ezE3LTE2fSA9IG9wMTdfMTY7CisgIGxldCBJbnN0ezExLTd9ID0gb3AxMV83OworICBsZXQgSW5zdHs2fSA9IG9wNjsKKyAgbGV0IEluc3R7NH0gPSBvcDQ7Cit9CisKKy8vIFNhbWUgYXMgTjJWIGV4Y2VwdCBpdCBkb2Vzbid0IGhhdmUgYSBkYXRhdHlwZSBzdWZmaXguCitjbGFzcyBOMlZYPGJpdHM8Mj4gb3AyNF8yMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDI+IG9wMTlfMTgsIGJpdHM8Mj4gb3AxN18xNiwKKyAgICAgICAgICAgYml0czw1PiBvcDExXzcsIGJpdCBvcDYsIGJpdCBvcDQsCisgICAgICAgICAgIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IE5EYXRhWEk8b29wcywgaW9wcywgTjJSZWdGcm0sIGl0aW4sIG9wYywgYXNtLCBjc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezI0LTIzfSA9IG9wMjRfMjM7CisgIGxldCBJbnN0ezIxLTIwfSA9IG9wMjFfMjA7CisgIGxldCBJbnN0ezE5LTE4fSA9IG9wMTlfMTg7CisgIGxldCBJbnN0ezE3LTE2fSA9IG9wMTdfMTY7CisgIGxldCBJbnN0ezExLTd9ID0gb3AxMV83OworICBsZXQgSW5zdHs2fSA9IG9wNjsKKyAgbGV0IEluc3R7NH0gPSBvcDQ7Cit9CisKKy8vIE5FT04gMiB2ZWN0b3IgcmVnaXN0ZXIgd2l0aCBpbW1lZGlhdGUuCitjbGFzcyBOMlZJbW08Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNywgYml0IG9wNiwgYml0IG9wNCwKKyAgICAgICAgICAgICBkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBkdCwgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IE5EYXRhSTxvb3BzLCBpb3BzLCBmLCBpdGluLCBvcGMsIGR0LCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjR9ID0gb3AyNDsKKyAgbGV0IEluc3R7MjN9ID0gb3AyMzsKKyAgbGV0IEluc3R7MTEtOH0gPSBvcDExXzg7CisgIGxldCBJbnN0ezd9ID0gb3A3OworICBsZXQgSW5zdHs2fSA9IG9wNjsKKyAgbGV0IEluc3R7NH0gPSBvcDQ7Cit9CisKKy8vIE5FT04gMyB2ZWN0b3IgcmVnaXN0ZXIgZm9ybWF0LgorY2xhc3MgTjNWPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNiwgYml0IG9wNCwKKyAgICAgICAgICBkYWcgb29wcywgZGFnIGlvcHMsIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBkdCwgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IE5EYXRhSTxvb3BzLCBpb3BzLCBmLCBpdGluLCBvcGMsIGR0LCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjR9ID0gb3AyNDsKKyAgbGV0IEluc3R7MjN9ID0gb3AyMzsKKyAgbGV0IEluc3R7MjEtMjB9ID0gb3AyMV8yMDsKKyAgbGV0IEluc3R7MTEtOH0gPSBvcDExXzg7CisgIGxldCBJbnN0ezZ9ID0gb3A2OworICBsZXQgSW5zdHs0fSA9IG9wNDsKK30KKworLy8gU2FtZSBhcyBOM1YgZXhjZXB0IGl0IGRvZXNuJ3QgaGF2ZSBhIGRhdGEgdHlwZSBzdWZmaXguCitjbGFzcyBOM1ZYPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNiwKKyAgICAgICAgICAgYml0IG9wNCwKKyAgICAgICAgICAgZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgc3RyaW5nIGNzdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IE5EYXRhWEk8b29wcywgaW9wcywgZiwgaXRpbiwgb3BjLCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MjR9ID0gb3AyNDsKKyAgbGV0IEluc3R7MjN9ID0gb3AyMzsKKyAgbGV0IEluc3R7MjEtMjB9ID0gb3AyMV8yMDsKKyAgbGV0IEluc3R7MTEtOH0gPSBvcDExXzg7CisgIGxldCBJbnN0ezZ9ID0gb3A2OworICBsZXQgSW5zdHs0fSA9IG9wNDsKK30KKworLy8gTkVPTiBWTU9WcyBiZXR3ZWVuIHNjYWxhciBhbmQgY29yZSByZWdpc3RlcnMuCitjbGFzcyBOVkxhbmVPcDxiaXRzPDg+IG9wY29kMSwgYml0czw0PiBvcGNvZDIsIGJpdHM8Mj4gb3Bjb2QzLAorICAgICAgICAgICAgICAgZGFnIG9vcHMsIGRhZyBpb3BzLCBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBkdCwgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdEFSTTxBZGRyTW9kZU5vbmUsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIGYsIEdlbmVyaWNEb21haW4sCisgICAgICAgICAgICAiIiwgaXRpbj4geworICBsZXQgSW5zdHsyNy0yMH0gPSBvcGNvZDE7CisgIGxldCBJbnN0ezExLTh9ID0gb3Bjb2QyOworICBsZXQgSW5zdHs2LTV9ID0gb3Bjb2QzOworICBsZXQgSW5zdHs0fSA9IDE7CisKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gb29wczsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAhY29uKGlvcHMsIChpbnMgcHJlZDokcCkpOworICBsZXQgQXNtU3RyaW5nID0gIXN0cmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoIXN0cmNvbmNhdChvcGMsICIke3B9IiksICFzdHJjb25jYXQoIi4iLCBkdCkpLAorICAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdCgiXHQiLCBhc20pKTsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtIYXNORU9OXTsKK30KK2NsYXNzIE5WR2V0TGFuZTxiaXRzPDg+IG9wY29kMSwgYml0czw0PiBvcGNvZDIsIGJpdHM8Mj4gb3Bjb2QzLAorICAgICAgICAgICAgICAgIGRhZyBvb3BzLCBkYWcgaW9wcywgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgICBzdHJpbmcgb3BjLCBzdHJpbmcgZHQsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IE5WTGFuZU9wPG9wY29kMSwgb3Bjb2QyLCBvcGNvZDMsIG9vcHMsIGlvcHMsIE5HZXRMbkZybSwgaXRpbiwKKyAgICAgICAgICAgICBvcGMsIGR0LCBhc20sIHBhdHRlcm4+OworY2xhc3MgTlZTZXRMYW5lPGJpdHM8OD4gb3Bjb2QxLCBiaXRzPDQ+IG9wY29kMiwgYml0czwyPiBvcGNvZDMsCisgICAgICAgICAgICAgICAgZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgIHN0cmluZyBvcGMsIHN0cmluZyBkdCwgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogTlZMYW5lT3A8b3Bjb2QxLCBvcGNvZDIsIG9wY29kMywgb29wcywgaW9wcywgTlNldExuRnJtLCBpdGluLAorICAgICAgICAgICAgIG9wYywgZHQsIGFzbSwgcGF0dGVybj47CitjbGFzcyBOVkR1cDxiaXRzPDg+IG9wY29kMSwgYml0czw0PiBvcGNvZDIsIGJpdHM8Mj4gb3Bjb2QzLAorICAgICAgICAgICAgZGFnIG9vcHMsIGRhZyBpb3BzLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGR0LCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBOVkxhbmVPcDxvcGNvZDEsIG9wY29kMiwgb3Bjb2QzLCBvb3BzLCBpb3BzLCBORHVwRnJtLCBpdGluLAorICAgICAgICAgICAgIG9wYywgZHQsIGFzbSwgcGF0dGVybj47CisKKy8vIFZlY3RvciBEdXBsaWNhdGUgTGFuZSAoZnJvbSBzY2FsYXIgdG8gYWxsIGVsZW1lbnRzKQorY2xhc3MgTlZEdXBMYW5lPGJpdHM8ND4gb3AxOV8xNiwgYml0IG9wNiwgZGFnIG9vcHMsIGRhZyBpb3BzLAorICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBkdCwgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBORGF0YUk8b29wcywgaW9wcywgTlZEdXBMbkZybSwgaXRpbiwgb3BjLCBkdCwgYXNtLCAiIiwgcGF0dGVybj4geworICBsZXQgSW5zdHsyNC0yM30gPSAwYjExOworICBsZXQgSW5zdHsyMS0yMH0gPSAwYjExOworICBsZXQgSW5zdHsxOS0xNn0gPSBvcDE5XzE2OworICBsZXQgSW5zdHsxMS03fSA9IDBiMTEwMDA7CisgIGxldCBJbnN0ezZ9ID0gb3A2OworICBsZXQgSW5zdHs0fSA9IDA7Cit9CisKKy8vIE5FT05GUFBhdCAtIFNhbWUgYXMgUGF0PD4sIGJ1dCByZXF1aXJlcyB0aGF0IHRoZSBjb21waWxlciBiZSB1c2luZyBORU9OCisvLyBmb3Igc2luZ2xlLXByZWNpc2lvbiBGUC4KK2NsYXNzIE5FT05GUFBhdDxkYWcgcGF0dGVybiwgZGFnIHJlc3VsdD4gOiBQYXQ8cGF0dGVybiwgcmVzdWx0PiB7CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW0hhc05FT04sVXNlTkVPTkZvckZQXTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUluc3RySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JbnN0ckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMjI4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsODYgQEAKKy8vPT09LSBBUk1JbnN0ckluZm8uY3BwIC0gQVJNIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUk0gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAiQVJNQWRkcmVzc2luZ01vZGVzLmgiCisjaW5jbHVkZSAiQVJNR2VuSW5zdHJJbmZvLmluYyIKKyNpbmNsdWRlICJBUk1NYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVWYXJpYWJsZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitBUk1JbnN0ckluZm86OkFSTUluc3RySW5mbyhjb25zdCBBUk1TdWJ0YXJnZXQgJlNUSSkKKyAgOiBBUk1CYXNlSW5zdHJJbmZvKFNUSSksIFJJKCp0aGlzLCBTVEkpIHsKK30KKwordW5zaWduZWQgQVJNSW5zdHJJbmZvOjpnZXRVbmluZGV4ZWRPcGNvZGUodW5zaWduZWQgT3BjKSBjb25zdCB7CisgIHN3aXRjaCAoT3BjKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIEFSTTo6TERSX1BSRToKKyAgY2FzZSBBUk06OkxEUl9QT1NUOgorICAgIHJldHVybiBBUk06OkxEUjsKKyAgY2FzZSBBUk06OkxEUkhfUFJFOgorICBjYXNlIEFSTTo6TERSSF9QT1NUOgorICAgIHJldHVybiBBUk06OkxEUkg7CisgIGNhc2UgQVJNOjpMRFJCX1BSRToKKyAgY2FzZSBBUk06OkxEUkJfUE9TVDoKKyAgICByZXR1cm4gQVJNOjpMRFJCOworICBjYXNlIEFSTTo6TERSU0hfUFJFOgorICBjYXNlIEFSTTo6TERSU0hfUE9TVDoKKyAgICByZXR1cm4gQVJNOjpMRFJTSDsKKyAgY2FzZSBBUk06OkxEUlNCX1BSRToKKyAgY2FzZSBBUk06OkxEUlNCX1BPU1Q6CisgICAgcmV0dXJuIEFSTTo6TERSU0I7CisgIGNhc2UgQVJNOjpTVFJfUFJFOgorICBjYXNlIEFSTTo6U1RSX1BPU1Q6CisgICAgcmV0dXJuIEFSTTo6U1RSOworICBjYXNlIEFSTTo6U1RSSF9QUkU6CisgIGNhc2UgQVJNOjpTVFJIX1BPU1Q6CisgICAgcmV0dXJuIEFSTTo6U1RSSDsKKyAgY2FzZSBBUk06OlNUUkJfUFJFOgorICBjYXNlIEFSTTo6U1RSQl9QT1NUOgorICAgIHJldHVybiBBUk06OlNUUkI7CisgIH0KKworICByZXR1cm4gMDsKK30KKwordm9pZCBBUk1JbnN0ckluZm86OgorcmVNYXRlcmlhbGl6ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3ViSWR4LCBjb25zdCBNYWNoaW5lSW5zdHIgKk9yaWcsCisgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3JpZy0+Z2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgT3Bjb2RlID0gT3JpZy0+Z2V0T3Bjb2RlKCk7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpNT1ZpMnBpZWNlczogeworICAgIFJJLmVtaXRMb2FkQ29uc3RQb29sKE1CQiwgSSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdFJlZywgU3ViSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWctPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEFSTUNDOjpDb25kQ29kZXMpT3JpZy0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcmlnLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpKTsKKyAgICBNYWNoaW5lSW5zdHIgKk5ld01JID0gcHJpb3IoSSk7CisgICAgTmV3TUktPmdldE9wZXJhbmQoMCkuc2V0U3ViUmVnKFN1YklkeCk7CisgICAgcmV0dXJuOworICB9CisgIH0KKworICByZXR1cm4gQVJNQmFzZUluc3RySW5mbzo6cmVNYXRlcmlhbGl6ZShNQkIsIEksIERlc3RSZWcsIFN1YklkeCwgT3JpZywgVFJJKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSW5zdHJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JbnN0ckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYzZmZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSW5zdHJJbmZvLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tIEFSTUluc3RySW5mby5oIC0gQVJNIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFSTSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQVJNSU5TVFJVQ1RJT05JTkZPX0gKKyNkZWZpbmUgQVJNSU5TVFJVQ1RJT05JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgIkFSTUJhc2VJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJBUk1SZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJBUk1TdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJBUk0uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBUk1TdWJ0YXJnZXQ7CisKK2NsYXNzIEFSTUluc3RySW5mbyA6IHB1YmxpYyBBUk1CYXNlSW5zdHJJbmZvIHsKKyAgQVJNUmVnaXN0ZXJJbmZvIFJJOworcHVibGljOgorICBleHBsaWNpdCBBUk1JbnN0ckluZm8oY29uc3QgQVJNU3VidGFyZ2V0ICZTVEkpOworCisgIC8vIFJldHVybiB0aGUgbm9uLXByZS9wb3N0IGluY3JlbWVudGluZyB2ZXJzaW9uIG9mICdPcGMnLiBSZXR1cm4gMAorICAvLyBpZiB0aGVyZSBpcyBub3Qgc3VjaCBhbiBvcGNvZGUuCisgIHVuc2lnbmVkIGdldFVuaW5kZXhlZE9wY29kZSh1bnNpZ25lZCBPcGMpIGNvbnN0OworCisgIHZvaWQgcmVNYXRlcmlhbGl6ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTdWJJZHgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgKk9yaWcsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3Q7CisKKyAgLy8vIGdldFJlZ2lzdGVySW5mbyAtIFRhcmdldEluc3RySW5mbyBpcyBhIHN1cGVyc2V0IG9mIE1SZWdpc3RlciBpbmZvLiAgQXMKKyAgLy8vIHN1Y2gsIHdoZW5ldmVyIGEgY2xpZW50IGhhcyBhbiBpbnN0YW5jZSBvZiBpbnN0cnVjdGlvbiBpbmZvLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBiZSBhYmxlIHRvIGdldCByZWdpc3RlciBpbmZvIGFzIHdlbGwgKHRocm91Z2ggdGhpcyBtZXRob2QpLgorICAvLy8KKyAgY29uc3QgQVJNUmVnaXN0ZXJJbmZvICZnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBSSTsgfQorfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUluc3RySW5mby50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUluc3RySW5mby50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQwY2NhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSW5zdHJJbmZvLnRkCkBAIC0wLDAgKzEsMzA5MCBAQAorLy89PT0tIEFSTUluc3RySW5mby50ZCAtIFRhcmdldCBEZXNjcmlwdGlvbiBmb3IgQVJNIFRhcmdldCAtKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLw0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBBUk0gaW5zdHJ1Y3Rpb25zIGluIFRhYmxlR2VuIGZvcm1hdC4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBBUk0gc3BlY2lmaWMgREFHIE5vZGVzLg0KKy8vDQorDQorLy8gVHlwZSBwcm9maWxlcy4NCitkZWYgU0RUX0FSTUNhbGxTZXFTdGFydCA6IFNEQ2FsbFNlcVN0YXJ0PFsgU0RUQ2lzVlQ8MCwgaTMyPiBdPjsNCitkZWYgU0RUX0FSTUNhbGxTZXFFbmQgICA6IFNEQ2FsbFNlcUVuZDxbIFNEVENpc1ZUPDAsIGkzMj4sIFNEVENpc1ZUPDEsIGkzMj4gXT47DQorDQorZGVmIFNEVF9BUk1TYXZlQ2FsbFBDIDogU0RUeXBlUHJvZmlsZTwwLCAxLCBbXT47DQorDQorZGVmIFNEVF9BUk1jYWxsICAgIDogU0RUeXBlUHJvZmlsZTwwLCAtMSwgW1NEVENpc1B0clR5PDA+XT47DQorDQorZGVmIFNEVF9BUk1DTW92ICAgIDogU0RUeXBlUHJvZmlsZTwxLCAzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDMsIGkzMj5dPjsNCisNCitkZWYgU0RUX0FSTUJyY29uZCAgOiBTRFR5cGVQcm9maWxlPDAsIDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0RUQ2lzVlQ8MCwgT3RoZXJWVD4sIFNEVENpc1ZUPDEsIGkzMj5dPjsNCisNCitkZWYgU0RUX0FSTUJySlQgICAgOiBTRFR5cGVQcm9maWxlPDAsIDMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRFRDaXNQdHJUeTwwPiwgU0RUQ2lzVlQ8MSwgaTMyPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDIsIGkzMj5dPjsNCisNCitkZWYgU0RUX0FSTUJyMkpUICAgOiBTRFR5cGVQcm9maWxlPDAsIDQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRFRDaXNQdHJUeTwwPiwgU0RUQ2lzVlQ8MSwgaTMyPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDIsIGkzMj4sIFNEVENpc1ZUPDMsIGkzMj5dPjsNCisNCitkZWYgU0RUX0FSTUJDQ19pNjQgOiBTRFR5cGVQcm9maWxlPDAsIDYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRFRDaXNWVDwwLCBpMzI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVlQ8MSwgaTMyPiwgU0RUQ2lzVlQ8MiwgaTMyPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDMsIGkzMj4sIFNEVENpc1ZUPDQsIGkzMj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDw1LCBPdGhlclZUPl0+Ow0KKw0KK2RlZiBTRFRfQVJNQ21wICAgICA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgW1NEVENpc1NhbWVBczwwLCAxPl0+Ow0KKw0KK2RlZiBTRFRfQVJNUElDQWRkICA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgW1NEVENpc1NhbWVBczwwLCAxPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNQdHJUeTwxPiwgU0RUQ2lzVlQ8MiwgaTMyPl0+Ow0KKw0KK2RlZiBTRFRfQVJNVGhyZWFkUG9pbnRlciA6IFNEVHlwZVByb2ZpbGU8MSwgMCwgW1NEVENpc1B0clR5PDA+XT47DQorZGVmIFNEVF9BUk1FSF9TSkxKX1NldGptcCA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgW1NEVENpc0ludDwwPiwgU0RUQ2lzUHRyVHk8MT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc0ludDwyPl0+Ow0KK2RlZiBTRFRfQVJNRUhfU0pMSl9Mb25nam1wOiBTRFR5cGVQcm9maWxlPDAsIDIsIFtTRFRDaXNQdHJUeTwwPiwgU0RUQ2lzSW50PDE+XT47DQorDQorZGVmIFNEVF9BUk1NRU1CQVJSSUVSVjcgIDogU0RUeXBlUHJvZmlsZTwwLCAwLCBbXT47DQorZGVmIFNEVF9BUk1TWU5DQkFSUklFUlY3IDogU0RUeXBlUHJvZmlsZTwwLCAwLCBbXT47DQorZGVmIFNEVF9BUk1NRU1CQVJSSUVSVjYgIDogU0RUeXBlUHJvZmlsZTwwLCAxLCBbU0RUQ2lzSW50PDA+XT47DQorZGVmIFNEVF9BUk1TWU5DQkFSUklFUlY2IDogU0RUeXBlUHJvZmlsZTwwLCAxLCBbU0RUQ2lzSW50PDA+XT47DQorDQorZGVmIFNEVF9BUk1UQ1JFVCA6IFNEVHlwZVByb2ZpbGU8MCwgMSwgW1NEVENpc1B0clR5PDA+XT47DQorDQorZGVmIFNEVF9BUk1CRkkgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFtTRFRDaXNWVDwwLCBpMzI+LCBTRFRDaXNWVDwxLCBpMzI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVlQ8MiwgaTMyPiwgU0RUQ2lzVlQ8MywgaTMyPl0+Ow0KKw0KKy8vIE5vZGUgZGVmaW5pdGlvbnMuDQorZGVmIEFSTVdyYXBwZXIgICAgICAgOiBTRE5vZGU8IkFSTUlTRDo6V3JhcHBlciIsICAgICBTRFRJbnRVbmFyeU9wPjsNCitkZWYgQVJNV3JhcHBlckpUICAgICA6IFNETm9kZTwiQVJNSVNEOjpXcmFwcGVySlQiLCAgIFNEVEludEJpbk9wPjsNCisNCitkZWYgQVJNY2FsbHNlcV9zdGFydCA6IFNETm9kZTwiSVNEOjpDQUxMU0VRX1NUQVJUIiwgU0RUX0FSTUNhbGxTZXFTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3V0RmxhZ10+Ow0KK2RlZiBBUk1jYWxsc2VxX2VuZCAgIDogU0ROb2RlPCJJU0Q6OkNBTExTRVFfRU5EIiwgICBTRFRfQVJNQ2FsbFNlcUVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZ10+Ow0KKw0KK2RlZiBBUk1jYWxsICAgICAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OkNBTEwiLCBTRFRfQVJNY2FsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUFZhcmlhZGljXT47DQorZGVmIEFSTWNhbGxfcHJlZCAgICA6IFNETm9kZTwiQVJNSVNEOjpDQUxMX1BSRUQiLCBTRFRfQVJNY2FsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUFZhcmlhZGljXT47DQorZGVmIEFSTWNhbGxfbm9saW5rICAgOiBTRE5vZGU8IkFSTUlTRDo6Q0FMTF9OT0xJTksiLCBTRFRfQVJNY2FsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUFZhcmlhZGljXT47DQorDQorZGVmIEFSTXJldGZsYWcgICAgICAgOiBTRE5vZGU8IkFSTUlTRDo6UkVUX0ZMQUciLCBTRFROb25lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWddPjsNCisNCitkZWYgQVJNY21vdiAgICAgICAgICA6IFNETm9kZTwiQVJNSVNEOjpDTU9WIiwgU0RUX0FSTUNNb3YsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBJbkZsYWddPjsNCitkZWYgQVJNY25lZyAgICAgICAgICA6IFNETm9kZTwiQVJNSVNEOjpDTkVHIiwgU0RUX0FSTUNNb3YsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBJbkZsYWddPjsNCisNCitkZWYgQVJNYnJjb25kICAgICAgICA6IFNETm9kZTwiQVJNSVNEOjpCUkNPTkQiLCBTRFRfQVJNQnJjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBJbkZsYWcsIFNETlBPdXRGbGFnXT47DQorDQorZGVmIEFSTWJyanQgICAgICAgICAgOiBTRE5vZGU8IkFSTUlTRDo6QlJfSlQiLCBTRFRfQVJNQnJKVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluXT47DQorZGVmIEFSTWJyMmp0ICAgICAgICAgOiBTRE5vZGU8IkFSTUlTRDo6QlIyX0pUIiwgU0RUX0FSTUJyMkpULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW5dPjsNCisNCitkZWYgQVJNQmNjaTY0ICAgICAgICA6IFNETm9kZTwiQVJNSVNEOjpCQ0NfaTY0IiwgU0RUX0FSTUJDQ19pNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+Ow0KKw0KK2RlZiBBUk1jbXAgICAgICAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OkNNUCIsIFNEVF9BUk1DbXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBPdXRGbGFnXT47DQorDQorZGVmIEFSTWNtcFogICAgICAgICAgOiBTRE5vZGU8IkFSTUlTRDo6Q01QWiIsIFNEVF9BUk1DbXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBPdXRGbGFnLFNETlBDb21tdXRhdGl2ZV0+Ow0KKw0KK2RlZiBBUk1waWNfYWRkICAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlBJQ19BREQiLCBTRFRfQVJNUElDQWRkPjsNCisNCitkZWYgQVJNc3JsX2ZsYWcgICAgICA6IFNETm9kZTwiQVJNSVNEOjpTUkxfRkxBRyIsIFNEVEludFVuYXJ5T3AsIFtTRE5QT3V0RmxhZ10+Ow0KK2RlZiBBUk1zcmFfZmxhZyAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlNSQV9GTEFHIiwgU0RUSW50VW5hcnlPcCwgW1NETlBPdXRGbGFnXT47DQorZGVmIEFSTXJyeCAgICAgICAgICAgOiBTRE5vZGU8IkFSTUlTRDo6UlJYIiAgICAgLCBTRFRJbnRVbmFyeU9wLCBbU0ROUEluRmxhZyBdPjsNCisNCitkZWYgQVJNdGhyZWFkX3BvaW50ZXI6IFNETm9kZTwiQVJNSVNEOjpUSFJFQURfUE9JTlRFUiIsIFNEVF9BUk1UaHJlYWRQb2ludGVyPjsNCitkZWYgQVJNZWhfc2psal9zZXRqbXA6IFNETm9kZTwiQVJNSVNEOjpFSF9TSkxKX1NFVEpNUCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVF9BUk1FSF9TSkxKX1NldGptcCwgW1NETlBIYXNDaGFpbl0+Ow0KK2RlZiBBUk1laF9zamxqX2xvbmdqbXA6IFNETm9kZTwiQVJNSVNEOjpFSF9TSkxKX0xPTkdKTVAiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUX0FSTUVIX1NKTEpfTG9uZ2ptcCwgW1NETlBIYXNDaGFpbl0+Ow0KKw0KK2RlZiBBUk1NZW1CYXJyaWVyVjcgIDogU0ROb2RlPCJBUk1JU0Q6Ok1FTUJBUlJJRVIiLCBTRFRfQVJNTUVNQkFSUklFUlY3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW5dPjsNCitkZWYgQVJNU3luY0JhcnJpZXJWNyA6IFNETm9kZTwiQVJNSVNEOjpTWU5DQkFSUklFUiIsIFNEVF9BUk1NRU1CQVJSSUVSVjcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+Ow0KK2RlZiBBUk1NZW1CYXJyaWVyVjYgIDogU0ROb2RlPCJBUk1JU0Q6Ok1FTUJBUlJJRVIiLCBTRFRfQVJNTUVNQkFSUklFUlY2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW5dPjsNCitkZWYgQVJNU3luY0JhcnJpZXJWNiA6IFNETm9kZTwiQVJNSVNEOjpTWU5DQkFSUklFUiIsIFNEVF9BUk1NRU1CQVJSSUVSVjYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+Ow0KKw0KK2RlZiBBUk1yYml0ICAgICAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlJCSVQiLCBTRFRJbnRVbmFyeU9wPjsNCisNCitkZWYgQVJNdGNyZXQgICAgICAgICA6IFNETm9kZTwiQVJNSVNEOjpUQ19SRVRVUk4iLCBTRFRfQVJNVENSRVQsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sICBTRE5QT3B0SW5GbGFnLCBTRE5QVmFyaWFkaWNdPjsNCisNCisNCitkZWYgQVJNYmZpICAgICAgICAgICA6IFNETm9kZTwiQVJNSVNEOjpCRkkiLCBTRFRfQVJNQkZJPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEFSTSBJbnN0cnVjdGlvbiBQcmVkaWNhdGUgRGVmaW5pdGlvbnMuDQorLy8NCitkZWYgSGFzVjRUICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmhhc1Y0VE9wcygpIj47DQorZGVmIE5vVjRUICAgICA6IFByZWRpY2F0ZTwiIVN1YnRhcmdldC0+aGFzVjRUT3BzKCkiPjsNCitkZWYgSGFzVjVUICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmhhc1Y1VE9wcygpIj47DQorZGVmIEhhc1Y1VEUgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT5oYXNWNVRFT3BzKCkiPjsNCitkZWYgSGFzVjYgICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmhhc1Y2T3BzKCkiPjsNCitkZWYgSGFzVjZUMiAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmhhc1Y2VDJPcHMoKSI+Ow0KK2RlZiBOb1Y2VDIgICAgOiBQcmVkaWNhdGU8IiFTdWJ0YXJnZXQtPmhhc1Y2VDJPcHMoKSI+Ow0KK2RlZiBIYXNWNyAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzVjdPcHMoKSI+Ow0KK2RlZiBOb1ZGUCAgICAgOiBQcmVkaWNhdGU8IiFTdWJ0YXJnZXQtPmhhc1ZGUDIoKSI+Ow0KK2RlZiBIYXNWRlAyICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzVkZQMigpIj47DQorZGVmIEhhc1ZGUDMgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT5oYXNWRlAzKCkiPjsNCitkZWYgSGFzTkVPTiAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmhhc05FT04oKSI+Ow0KK2RlZiBIYXNEaXZpZGUgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzRGl2aWRlKCkiPjsNCitkZWYgSGFzVDJFeHRyYWN0UGFjayA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT5oYXNUMkV4dHJhY3RQYWNrKCkiPjsNCitkZWYgVXNlTkVPTkZvckZQIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPnVzZU5FT05Gb3JTaW5nbGVQcmVjaXNpb25GUCgpIj47DQorZGVmIERvbnRVc2VORU9ORm9yRlAgOiBQcmVkaWNhdGU8IiFTdWJ0YXJnZXQtPnVzZU5FT05Gb3JTaW5nbGVQcmVjaXNpb25GUCgpIj47DQorZGVmIElzVGh1bWIgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT5pc1RodW1iKCkiPjsNCitkZWYgSXNUaHVtYjFPbmx5IDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmlzVGh1bWIxT25seSgpIj47DQorZGVmIElzVGh1bWIyICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT5pc1RodW1iMigpIj47DQorZGVmIElzQVJNICAgICA6IFByZWRpY2F0ZTwiIVN1YnRhcmdldC0+aXNUaHVtYigpIj47DQorZGVmIElzRGFyd2luICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmlzVGFyZ2V0RGFyd2luKCkiPjsNCitkZWYgSXNOb3REYXJ3aW4gOiBQcmVkaWNhdGU8IiFTdWJ0YXJnZXQtPmlzVGFyZ2V0RGFyd2luKCkiPjsNCisNCisvLyBGSVhNRTogRXZlbnR1YWxseSB0aGlzIHdpbGwgYmUganVzdCAiaGFzVjZUMk9wcyIuDQorZGVmIFVzZU1vdnQgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT51c2VNb3Z0KCkiPjsNCitkZWYgRG9udFVzZU1vdnQgOiBQcmVkaWNhdGU8IiFTdWJ0YXJnZXQtPnVzZU1vdnQoKSI+Ow0KKw0KK2RlZiBVc2VWTUx4ICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+dXNlVk1MeCgpIj47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBBUk0gRmxhZyBEZWZpbml0aW9ucy4NCisNCitjbGFzcyBSZWdDb25zdHJhaW50PHN0cmluZyBDPiB7DQorICBzdHJpbmcgQ29uc3RyYWludHMgPSBDOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBBUk0gc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGFuZCBwYXR0ZXJuIGZyYWdtZW50cy4NCisvLw0KKw0KKy8vIHNvX2ltbV9uZWdfWEZPUk0gLSBSZXR1cm4gYSBzb19pbW0gdmFsdWUgcGFja2VkIGludG8gdGhlIGZvcm1hdCBkZXNjcmliZWQgZm9yDQorLy8gc29faW1tX25lZyBkZWYgYmVsb3cuDQorZGVmIHNvX2ltbV9uZWdfWEZPUk0gOiBTRE5vZGVYRm9ybTxpbW0sIFt7DQorICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgtKGludClOLT5nZXRaRXh0VmFsdWUoKSwgTVZUOjppMzIpOw0KK31dPjsNCisNCisvLyBzb19pbW1fbm90X1hGT1JNIC0gUmV0dXJuIGEgc29faW1tIHZhbHVlIHBhY2tlZCBpbnRvIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGZvcg0KKy8vIHNvX2ltbV9ub3QgZGVmIGJlbG93Lg0KK2RlZiBzb19pbW1fbm90X1hGT1JNIDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQofihpbnQpTi0+Z2V0WkV4dFZhbHVlKCksIE1WVDo6aTMyKTsNCit9XT47DQorDQorLy8gcm90X2ltbSBwcmVkaWNhdGUgLSBUcnVlIGlmIHRoZSAzMi1iaXQgaW1tZWRpYXRlIGlzIGVxdWFsIHRvIDgsIDE2LCBvciAyNC4NCitkZWYgcm90X2ltbSA6IFBhdExlYWY8KGkzMiBpbW0pLCBbew0KKyAgaW50MzJfdCB2ID0gKGludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCk7DQorICByZXR1cm4gdiA9PSA4IHx8IHYgPT0gMTYgfHwgdiA9PSAyNDsNCit9XT47DQorDQorLy8vIGltbTFfMTUgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgMzItYml0IGltbWVkaWF0ZSBpcyBpbiB0aGUgcmFuZ2UgWzEsMTVdLg0KK2RlZiBpbW0xXzE1IDogUGF0TGVhZjwoaTMyIGltbSksIFt7DQorICByZXR1cm4gKGludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkgPj0gMSAmJiAoaW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSA8IDE2Ow0KK31dPjsNCisNCisvLy8gaW1tMTZfMzEgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgMzItYml0IGltbWVkaWF0ZSBpcyBpbiB0aGUgcmFuZ2UgWzE2LDMxXS4NCitkZWYgaW1tMTZfMzEgOiBQYXRMZWFmPChpMzIgaW1tKSwgW3sNCisgIHJldHVybiAoaW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSA+PSAxNiAmJiAoaW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSA8IDMyOw0KK31dPjsNCisNCitkZWYgc29faW1tX25lZyA6DQorICBQYXRMZWFmPChpbW0pLCBbew0KKyAgICByZXR1cm4gQVJNX0FNOjpnZXRTT0ltbVZhbCgtKGludClOLT5nZXRaRXh0VmFsdWUoKSkgIT0gLTE7DQorICB9XSwgc29faW1tX25lZ19YRk9STT47DQorDQorZGVmIHNvX2ltbV9ub3QgOg0KKyAgUGF0TGVhZjwoaW1tKSwgW3sNCisgICAgcmV0dXJuIEFSTV9BTTo6Z2V0U09JbW1WYWwofihpbnQpTi0+Z2V0WkV4dFZhbHVlKCkpICE9IC0xOw0KKyAgfV0sIHNvX2ltbV9ub3RfWEZPUk0+Ow0KKw0KKy8vIHNleHRfMTZfbm9kZSBwcmVkaWNhdGUgLSBUcnVlIGlmIHRoZSBTRE5vZGUgaXMgc2lnbi1leHRlbmRlZCAxNiBvciBtb3JlIGJpdHMuDQorZGVmIHNleHRfMTZfbm9kZSA6IFBhdExlYWY8KGkzMiBHUFI6JGEpLCBbew0KKyAgcmV0dXJuIEN1ckRBRy0+Q29tcHV0ZU51bVNpZ25CaXRzKFNEVmFsdWUoTiwwKSkgPj0gMTc7DQorfV0+Ow0KKw0KKy8vLyBiZl9pbnZfbWFza19pbW0gcHJlZGljYXRlIC0gQW4gQU5EIG1hc2sgdG8gY2xlYXIgYW4gYXJiaXRyYXJ5IHdpZHRoIGJpdGZpZWxkDQorLy8vIGUuZy4sIDB4ZjAwMGZmZmYNCitkZWYgYmZfaW52X21hc2tfaW1tIDogT3BlcmFuZDxpMzI+LA0KKyAgICAgICAgICAgICAgICAgICAgICBQYXRMZWFmPChpbW0pLCBbew0KKyAgcmV0dXJuIEFSTTo6aXNCaXRGaWVsZEludmVydGVkTWFzayhOLT5nZXRaRXh0VmFsdWUoKSk7DQorfV0gPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRCaXRmaWVsZEludk1hc2tJbW1PcGVyYW5kIjsNCit9DQorDQorLy8vIFNwbGl0IGEgMzItYml0IGltbWVkaWF0ZSBpbnRvIHR3byAxNiBiaXQgcGFydHMuDQorZGVmIGxvMTYgOiBTRE5vZGVYRm9ybTxpbW0sIFt7DQorICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkgJiAweGZmZmYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7DQorfV0+Ow0KKw0KK2RlZiBoaTE2IDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpID4+IDE2LCBNVlQ6OmkzMik7DQorfV0+Ow0KKw0KK2RlZiBsbzE2QWxsWmVybyA6IFBhdExlYWY8KGkzMiBpbW0pLCBbew0KKyAgLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBsb3cgMTYtYml0cyBhcmUgMC4NCisgIHJldHVybiAoKCh1aW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSkgJiAweEZGRkZVTCkgPT0gMDsNCit9XSwgaGkxNj47DQorDQorLy8vIGltbTBfNjU1MzUgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgMzItYml0IGltbWVkaWF0ZSBpcyBpbiB0aGUgcmFuZ2UNCisvLy8gWzAuNjU1MzVdLg0KK2RlZiBpbW0wXzY1NTM1IDogUGF0TGVhZjwoaTMyIGltbSksIFt7DQorICByZXR1cm4gKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpIDwgNjU1MzY7DQorfV0+Ow0KKw0KK2NsYXNzIEJpbk9wRnJhZzxkYWcgcmVzPiA6IFBhdEZyYWc8KG9wcyBub2RlOiRMSFMsIG5vZGU6JFJIUyksIHJlcz47DQorY2xhc3MgVW5PcEZyYWcgPGRhZyByZXM+IDogUGF0RnJhZzwob3BzIG5vZGU6JFNyYyksIHJlcz47DQorDQorLy8vIGFkZGUgYW5kIHN1YmUgcHJlZGljYXRlcyAtIFRydWUgYmFzZWQgb24gd2hldGhlciB0aGUgY2FycnkgZmxhZyBvdXRwdXQNCisvLy8gd2lsbCBiZSBuZWVkZWQgb3Igbm90Lg0KK2RlZiBhZGRlX2RlYWRfY2FycnkgOg0KKyAgUGF0RnJhZzwob3BzIG5vZGU6JExIUywgbm9kZTokUkhTKSwgKGFkZGUgbm9kZTokTEhTLCBub2RlOiRSSFMpLA0KKyAgW3tyZXR1cm4gIU4tPmhhc0FueVVzZU9mVmFsdWUoMSk7fV0+Ow0KK2RlZiBzdWJlX2RlYWRfY2FycnkgOg0KKyAgUGF0RnJhZzwob3BzIG5vZGU6JExIUywgbm9kZTokUkhTKSwgKHN1YmUgbm9kZTokTEhTLCBub2RlOiRSSFMpLA0KKyAgW3tyZXR1cm4gIU4tPmhhc0FueVVzZU9mVmFsdWUoMSk7fV0+Ow0KK2RlZiBhZGRlX2xpdmVfY2FycnkgOg0KKyAgUGF0RnJhZzwob3BzIG5vZGU6JExIUywgbm9kZTokUkhTKSwgKGFkZGUgbm9kZTokTEhTLCBub2RlOiRSSFMpLA0KKyAgW3tyZXR1cm4gTi0+aGFzQW55VXNlT2ZWYWx1ZSgxKTt9XT47DQorZGVmIHN1YmVfbGl2ZV9jYXJyeSA6DQorICBQYXRGcmFnPChvcHMgbm9kZTokTEhTLCBub2RlOiRSSFMpLCAoc3ViZSBub2RlOiRMSFMsIG5vZGU6JFJIUyksDQorICBbe3JldHVybiBOLT5oYXNBbnlVc2VPZlZhbHVlKDEpO31dPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIE9wZXJhbmQgRGVmaW5pdGlvbnMuDQorLy8NCisNCisvLyBCcmFuY2ggdGFyZ2V0Lg0KK2RlZiBicnRhcmdldCA6IE9wZXJhbmQ8T3RoZXJWVD47DQorDQorLy8gQSBsaXN0IG9mIHJlZ2lzdGVycyBzZXBhcmF0ZWQgYnkgY29tbWEuIFVzZWQgYnkgbG9hZC9zdG9yZSBtdWx0aXBsZS4NCitkZWYgcmVnbGlzdCA6IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRSZWdpc3Rlckxpc3QiOw0KK30NCisNCisvLyBBbiBvcGVyYW5kIGZvciB0aGUgQ09OU1RQT09MX0VOVFJZIHBzZXVkby1pbnN0cnVjdGlvbi4NCitkZWYgY3BpbnN0X29wZXJhbmQgOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50Q1BJbnN0T3BlcmFuZCI7DQorfQ0KKw0KK2RlZiBqdGJsb2NrX29wZXJhbmQgOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50SlRCbG9ja09wZXJhbmQiOw0KK30NCitkZWYganQyYmxvY2tfb3BlcmFuZCA6IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRKVDJCbG9ja09wZXJhbmQiOw0KK30NCisNCisvLyBMb2NhbCBQQyBsYWJlbHMuDQorZGVmIHBjbGFiZWwgOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UENMYWJlbCI7DQorfQ0KKw0KKy8vIHNoaWZ0ZXJfb3BlcmFuZCBvcGVyYW5kczogc29fcmVnIGFuZCBzb19pbW0uDQorZGVmIHNvX3JlZyA6IE9wZXJhbmQ8aTMyPiwgICAgLy8gcmVnIHJlZyBpbW0NCisgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTMyLCAzLCAiU2VsZWN0U2hpZnRlck9wZXJhbmRSZWciLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hsLHNybCxzcmEscm90cl0+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFNPUmVnT3BlcmFuZCI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgR1BSLCBHUFIsIGkzMmltbSk7DQorfQ0KKw0KKy8vIHNvX2ltbSAtIE1hdGNoIGEgMzItYml0IHNoaWZ0ZXJfb3BlcmFuZCBpbW1lZGlhdGUgb3BlcmFuZCwgd2hpY2ggaXMgYW4NCisvLyA4LWJpdCBpbW1lZGlhdGUgcm90YXRlZCBieSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJpdHMuICBzb19pbW0gdmFsdWVzIGFyZQ0KKy8vIHJlcHJlc2VudGVkIGluIHRoZSBpbW0gZmllbGQgaW4gdGhlIHNhbWUgMTItYml0IGZvcm0gdGhhdCB0aGV5IGFyZSBlbmNvZGVkDQorLy8gaW50byBzb19pbW0gaW5zdHJ1Y3Rpb25zOiB0aGUgOC1iaXQgaW1tZWRpYXRlIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzDQorLy8gW2JpdHMgMC03XSwgdGhlIDQtYml0IHNoaWZ0IGFtb3VudCBpcyB0aGUgbmV4dCA0IGJpdHMgW2JpdHMgOC0xMV0uDQorZGVmIHNvX2ltbSA6IE9wZXJhbmQ8aTMyPiwNCisgICAgICAgICAgICAgUGF0TGVhZjwoaW1tKSwgW3sNCisgICAgICByZXR1cm4gQVJNX0FNOjpnZXRTT0ltbVZhbChOLT5nZXRaRXh0VmFsdWUoKSkgIT0gLTE7DQorICAgIH1dPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTT0ltbU9wZXJhbmQiOw0KK30NCisNCisvLyBCcmVhayBzb19pbW0ncyB1cCBpbnRvIHR3byBwaWVjZXMuICBUaGlzIGhhbmRsZXMgaW1tZWRpYXRlcyB3aXRoIHVwIHRvIDE2DQorLy8gYml0cyBzZXQgaW4gdGhlbS4gIFRoaXMgdXNlcyBzb19pbW0ycGFydCB0byBtYXRjaCBhbmQgc29faW1tMnBhcnRfWzEyXSB0bw0KKy8vIGdldCB0aGUgZmlyc3Qvc2Vjb25kIHBpZWNlcy4NCitkZWYgc29faW1tMnBhcnQgOiBPcGVyYW5kPGkzMj4sDQorICAgICAgICAgICAgICAgICAgUGF0TGVhZjwoaW1tKSwgW3sNCisgICAgICByZXR1cm4gQVJNX0FNOjppc1NPSW1tVHdvUGFydFZhbCgodW5zaWduZWQpTi0+Z2V0WkV4dFZhbHVlKCkpOw0KKyAgICB9XT4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50U09JbW0yUGFydE9wZXJhbmQiOw0KK30NCisNCitkZWYgc29faW1tMnBhcnRfMSA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIHVuc2lnbmVkIFYgPSBBUk1fQU06OmdldFNPSW1tVHdvUGFydEZpcnN0KCh1bnNpZ25lZClOLT5nZXRaRXh0VmFsdWUoKSk7DQorICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChWLCBNVlQ6OmkzMik7DQorfV0+Ow0KKw0KK2RlZiBzb19pbW0ycGFydF8yIDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgdW5zaWduZWQgViA9IEFSTV9BTTo6Z2V0U09JbW1Ud29QYXJ0U2Vjb25kKCh1bnNpZ25lZClOLT5nZXRaRXh0VmFsdWUoKSk7DQorICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChWLCBNVlQ6OmkzMik7DQorfV0+Ow0KKw0KK2RlZiBzb19uZWdfaW1tMnBhcnQgOiBPcGVyYW5kPGkzMj4sIFBhdExlYWY8KGltbSksIFt7DQorICAgICAgcmV0dXJuIEFSTV9BTTo6aXNTT0ltbVR3b1BhcnRWYWwoLShpbnQpTi0+Z2V0WkV4dFZhbHVlKCkpOw0KKyAgICB9XT4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50U09JbW0yUGFydE9wZXJhbmQiOw0KK30NCisNCitkZWYgc29fbmVnX2ltbTJwYXJ0XzEgOiBTRE5vZGVYRm9ybTxpbW0sIFt7DQorICB1bnNpZ25lZCBWID0gQVJNX0FNOjpnZXRTT0ltbVR3b1BhcnRGaXJzdCgtKGludClOLT5nZXRaRXh0VmFsdWUoKSk7DQorICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChWLCBNVlQ6OmkzMik7DQorfV0+Ow0KKw0KK2RlZiBzb19uZWdfaW1tMnBhcnRfMiA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIHVuc2lnbmVkIFYgPSBBUk1fQU06OmdldFNPSW1tVHdvUGFydFNlY29uZCgtKGludClOLT5nZXRaRXh0VmFsdWUoKSk7DQorICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChWLCBNVlQ6OmkzMik7DQorfV0+Ow0KKw0KKy8vLyBpbW0wXzMxIHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIDMyLWJpdCBpbW1lZGlhdGUgaXMgaW4gdGhlIHJhbmdlIFswLDMxXS4NCitkZWYgaW1tMF8zMSA6IE9wZXJhbmQ8aTMyPiwgUGF0TGVhZjwoaW1tKSwgW3sNCisgIHJldHVybiAoaW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSA8IDMyOw0KK31dPjsNCisNCisvLyBEZWZpbmUgQVJNIHNwZWNpZmljIGFkZHJlc3NpbmcgbW9kZXMuDQorDQorLy8gYWRkcm1vZGUyIDo9IHJlZyArLy0gcmVnIHNob3AgaW1tDQorLy8gYWRkcm1vZGUyIDo9IHJlZyArLy0gaW1tMTINCisvLw0KK2RlZiBhZGRybW9kZTIgOiBPcGVyYW5kPGkzMj4sDQorICAgICAgICAgICAgICAgIENvbXBsZXhQYXR0ZXJuPGkzMiwgMywgIlNlbGVjdEFkZHJNb2RlMiIsIFtdPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRBZGRyTW9kZTJPcGVyYW5kIjsNCisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBHUFI6JGJhc2UsIEdQUjokb2Zmc3JlZywgaTMyaW1tOiRvZmZzaW1tKTsNCit9DQorDQorZGVmIGFtMm9mZnNldCA6IE9wZXJhbmQ8aTMyPiwNCisgICAgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTMyLCAyLCAiU2VsZWN0QWRkck1vZGUyT2Zmc2V0IiwgW10+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludEFkZHJNb2RlMk9mZnNldE9wZXJhbmQiOw0KKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdQUiwgaTMyaW1tKTsNCit9DQorDQorLy8gYWRkcm1vZGUzIDo9IHJlZyArLy0gcmVnDQorLy8gYWRkcm1vZGUzIDo9IHJlZyArLy0gaW1tOA0KKy8vDQorZGVmIGFkZHJtb2RlMyA6IE9wZXJhbmQ8aTMyPiwNCisgICAgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTMyLCAzLCAiU2VsZWN0QWRkck1vZGUzIiwgW10+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludEFkZHJNb2RlM09wZXJhbmQiOw0KKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdQUjokYmFzZSwgR1BSOiRvZmZzcmVnLCBpMzJpbW06JG9mZnNpbW0pOw0KK30NCisNCitkZWYgYW0zb2Zmc2V0IDogT3BlcmFuZDxpMzI+LA0KKyAgICAgICAgICAgICAgICBDb21wbGV4UGF0dGVybjxpMzIsIDIsICJTZWxlY3RBZGRyTW9kZTNPZmZzZXQiLCBbXT4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50QWRkck1vZGUzT2Zmc2V0T3BlcmFuZCI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgR1BSLCBpMzJpbW0pOw0KK30NCisNCisvLyBhZGRybW9kZTQgOj0gcmVnLCA8bW9kZXxXPg0KKy8vDQorZGVmIGFkZHJtb2RlNCA6IE9wZXJhbmQ8aTMyPiwNCisgICAgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTMyLCAyLCAiU2VsZWN0QWRkck1vZGU0IiwgW10+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludEFkZHJNb2RlNE9wZXJhbmQiOw0KKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdQUjokYWRkciwgaTMyaW1tKTsNCit9DQorDQorLy8gYWRkcm1vZGU1IDo9IHJlZyArLy0gaW1tOCo0DQorLy8NCitkZWYgYWRkcm1vZGU1IDogT3BlcmFuZDxpMzI+LA0KKyAgICAgICAgICAgICAgICBDb21wbGV4UGF0dGVybjxpMzIsIDIsICJTZWxlY3RBZGRyTW9kZTUiLCBbXT4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50QWRkck1vZGU1T3BlcmFuZCI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgR1BSOiRiYXNlLCBpMzJpbW0pOw0KK30NCisNCisvLyBhZGRybW9kZTYgOj0gcmVnIHdpdGggb3B0aW9uYWwgd3JpdGViYWNrDQorLy8NCitkZWYgYWRkcm1vZGU2IDogT3BlcmFuZDxpMzI+LA0KKyAgICAgICAgICAgICAgICBDb21wbGV4UGF0dGVybjxpMzIsIDIsICJTZWxlY3RBZGRyTW9kZTYiLCBbXT4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50QWRkck1vZGU2T3BlcmFuZCI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgR1BSOiRhZGRyLCBpMzJpbW0pOw0KK30NCisNCitkZWYgYW02b2Zmc2V0IDogT3BlcmFuZDxpMzI+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludEFkZHJNb2RlNk9mZnNldE9wZXJhbmQiOw0KKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdQUik7DQorfQ0KKw0KKy8vIGFkZHJtb2RlcGMgOj0gcGMgKyByZWcNCisvLw0KK2RlZiBhZGRybW9kZXBjIDogT3BlcmFuZDxpMzI+LA0KKyAgICAgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTMyLCAyLCAiU2VsZWN0QWRkck1vZGVQQyIsIFtdPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRBZGRyTW9kZVBDT3BlcmFuZCI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgR1BSLCBpMzJpbW0pOw0KK30NCisNCitkZWYgbm9oYXNoX2ltbSA6IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnROb0hhc2hJbW1lZGlhdGUiOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIkFSTUluc3RyRm9ybWF0cy50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIE11bHRpY2xhc3MgaGVscGVycy4uLg0KKy8vDQorDQorLy8vIEFzSTFfYmluX2lycyAtIERlZmluZXMgYSBzZXQgb2YgKG9wIHIsIHtzb19pbW18cnxzb19yZWd9KSBwYXR0ZXJucyBmb3IgYQ0KKy8vLyBiaW5vcCB0aGF0IHByb2R1Y2VzIGEgdmFsdWUuDQorbXVsdGljbGFzcyBBc0kxX2Jpbl9pcnM8Yml0czw0PiBvcGNvZCwgc3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgYml0IENvbW11dGFibGUgPSAwPiB7DQorICBkZWYgcmkgOiBBc0kxPG9wY29kLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBzb19pbW06JGIpLCBEUEZybSwNCisgICAgICAgICAgICAgICBJSUNfaUFMVWksIG9wYywgIlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG9wbm9kZSBHUFI6JGEsIHNvX2ltbTokYikpXT4gew0KKyAgICBsZXQgSW5zdHsyNX0gPSAxOw0KKyAgfQ0KKyAgZGVmIHJyIDogQXNJMTxvcGNvZCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgR1BSOiRiKSwgRFBGcm0sDQorICAgICAgICAgICAgICAgSUlDX2lBTFVyLCBvcGMsICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChvcG5vZGUgR1BSOiRhLCBHUFI6JGIpKV0+IHsNCisgICAgbGV0IEluc3R7MTEtNH0gPSAwYjAwMDAwMDAwOw0KKyAgICBsZXQgSW5zdHsyNX0gPSAwOw0KKyAgICBsZXQgaXNDb21tdXRhYmxlID0gQ29tbXV0YWJsZTsNCisgIH0NCisgIGRlZiBycyA6IEFzSTE8b3Bjb2QsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIHNvX3JlZzokYiksIERQU29SZWdGcm0sDQorICAgICAgICAgICAgICAgSUlDX2lBTFVzciwgb3BjLCAiXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIEdQUjokYSwgc29fcmVnOiRiKSldPiB7DQorICAgIGxldCBJbnN0ezI1fSA9IDA7DQorICB9DQorfQ0KKw0KKy8vLyBBSTFfYmluX3NfaXJzIC0gU2ltaWxhciB0byBBc0kxX2Jpbl9pcnMgZXhjZXB0IGl0IHNldHMgdGhlICdzJyBiaXQgc28gdGhlDQorLy8vIGluc3RydWN0aW9uIG1vZGlmaWVzIHRoZSBDUFNSIHJlZ2lzdGVyLg0KK2xldCBEZWZzID0gW0NQU1JdIGluIHsNCittdWx0aWNsYXNzIEFJMV9iaW5fc19pcnM8Yml0czw0PiBvcGNvZCwgc3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBDb21tdXRhYmxlID0gMD4gew0KKyAgZGVmIHJpIDogQUkxPG9wY29kLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBzb19pbW06JGIpLCBEUEZybSwNCisgICAgICAgICAgICAgICBJSUNfaUFMVWksIG9wYywgIlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG9wbm9kZSBHUFI6JGEsIHNvX2ltbTokYikpXT4gew0KKyAgICBsZXQgSW5zdHsyMH0gPSAxOw0KKyAgICBsZXQgSW5zdHsyNX0gPSAxOw0KKyAgfQ0KKyAgZGVmIHJyIDogQUkxPG9wY29kLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIpLCBEUEZybSwNCisgICAgICAgICAgICAgICBJSUNfaUFMVXIsIG9wYywgIlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG9wbm9kZSBHUFI6JGEsIEdQUjokYikpXT4gew0KKyAgICBsZXQgaXNDb21tdXRhYmxlID0gQ29tbXV0YWJsZTsNCisgICAgbGV0IEluc3R7MTEtNH0gPSAwYjAwMDAwMDAwOw0KKyAgICBsZXQgSW5zdHsyMH0gPSAxOw0KKyAgICBsZXQgSW5zdHsyNX0gPSAwOw0KKyAgfQ0KKyAgZGVmIHJzIDogQUkxPG9wY29kLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBzb19yZWc6JGIpLCBEUFNvUmVnRnJtLA0KKyAgICAgICAgICAgICAgIElJQ19pQUxVc3IsIG9wYywgIlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG9wbm9kZSBHUFI6JGEsIHNvX3JlZzokYikpXT4gew0KKyAgICBsZXQgSW5zdHsyMH0gPSAxOw0KKyAgICBsZXQgSW5zdHsyNX0gPSAwOw0KKyAgfQ0KK30NCit9DQorDQorLy8vIEFJMV9jbXBfaXJzIC0gRGVmaW5lcyBhIHNldCBvZiAob3Agciwge3NvX2ltbXxyfHNvX3JlZ30pIGNtcCAvIHRlc3QNCisvLy8gcGF0dGVybnMuIFNpbWlsYXIgdG8gQXNJMV9iaW5faXJzIGV4Y2VwdCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgcHJvZHVjZQ0KKy8vLyBhIGV4cGxpY2l0IHJlc3VsdCwgb25seSBpbXBsaWNpdGx5IHNldCBDUFNSLg0KK2xldCBpc0NvbXBhcmUgPSAxLCBEZWZzID0gW0NQU1JdIGluIHsNCittdWx0aWNsYXNzIEFJMV9jbXBfaXJzPGJpdHM8ND4gb3Bjb2QsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgYml0IENvbW11dGFibGUgPSAwPiB7DQorICBkZWYgcmkgOiBBSTE8b3Bjb2QsIChvdXRzKSwgKGlucyBHUFI6JGEsIHNvX2ltbTokYiksIERQRnJtLCBJSUNfaUNNUGksDQorICAgICAgICAgICAgICAgb3BjLCAiXHQkYSwgJGIiLA0KKyAgICAgICAgICAgICAgIFsob3Bub2RlIEdQUjokYSwgc29faW1tOiRiKV0+IHsNCisgICAgbGV0IEluc3R7MjB9ID0gMTsNCisgICAgbGV0IEluc3R7MjV9ID0gMTsNCisgIH0NCisgIGRlZiByciA6IEFJMTxvcGNvZCwgKG91dHMpLCAoaW5zIEdQUjokYSwgR1BSOiRiKSwgRFBGcm0sIElJQ19pQ01QciwNCisgICAgICAgICAgICAgICBvcGMsICJcdCRhLCAkYiIsDQorICAgICAgICAgICAgICAgWyhvcG5vZGUgR1BSOiRhLCBHUFI6JGIpXT4gew0KKyAgICBsZXQgSW5zdHsxMS00fSA9IDBiMDAwMDAwMDA7DQorICAgIGxldCBJbnN0ezIwfSA9IDE7DQorICAgIGxldCBJbnN0ezI1fSA9IDA7DQorICAgIGxldCBpc0NvbW11dGFibGUgPSBDb21tdXRhYmxlOw0KKyAgfQ0KKyAgZGVmIHJzIDogQUkxPG9wY29kLCAob3V0cyksIChpbnMgR1BSOiRhLCBzb19yZWc6JGIpLCBEUFNvUmVnRnJtLCBJSUNfaUNNUHNyLA0KKyAgICAgICAgICAgICAgIG9wYywgIlx0JGEsICRiIiwNCisgICAgICAgICAgICAgICBbKG9wbm9kZSBHUFI6JGEsIHNvX3JlZzokYildPiB7DQorICAgIGxldCBJbnN0ezIwfSA9IDE7DQorICAgIGxldCBJbnN0ezI1fSA9IDA7DQorICB9DQorfQ0KK30NCisNCisvLy8gQUlfdW5hcnlfcnJvdCAtIEEgdW5hcnkgb3BlcmF0aW9uIHdpdGggdHdvIGZvcm1zOiBvbmUgd2hvc2Ugb3BlcmFuZCBpcyBhDQorLy8vIHJlZ2lzdGVyIGFuZCBvbmUgd2hvc2Ugb3BlcmFuZCBpcyBhIHJlZ2lzdGVyIHJvdGF0ZWQgYnkgOC8xNi8yNC4NCisvLy8gRklYTUU6IFJlbW92ZSB0aGUgJ3InIHZhcmlhbnQuIEl0cyByb3RfaW1tIGlzIHplcm8uDQorbXVsdGljbGFzcyBBSV91bmFyeV9ycm90PGJpdHM8OD4gb3Bjb2QsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlPiB7DQorICBkZWYgciAgICAgOiBBRXh0STxvcGNvZCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwNCisgICAgICAgICAgICAgICAgIElJQ19pVU5Bciwgb3BjLCAiXHQkZHN0LCAkc3JjIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIEdQUjokc3JjKSldPiwNCisgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZdPiB7DQorICAgIGxldCBJbnN0ezExLTEwfSA9IDBiMDA7DQorICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsNCisgIH0NCisgIGRlZiByX3JvdCA6IEFFeHRJPG9wY29kLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRzcmMsIGkzMmltbTokcm90KSwNCisgICAgICAgICAgICAgICAgIElJQ19pVU5Bc2ksIG9wYywgIlx0JGRzdCwgJHNyYywgcm9yICRyb3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChvcG5vZGUgKHJvdHIgR1BSOiRzcmMsIHJvdF9pbW06JHJvdCkpKV0+LA0KKyAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNl0+IHsNCisgICAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOw0KKyAgfQ0KK30NCisNCittdWx0aWNsYXNzIEFJX3VuYXJ5X3Jyb3RfbnA8Yml0czw4PiBvcGNvZCwgc3RyaW5nIG9wYz4gew0KKyAgZGVmIHIgICAgIDogQUV4dEk8b3Bjb2QsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYyksDQorICAgICAgICAgICAgICAgICBJSUNfaVVOQXIsIG9wYywgIlx0JGRzdCwgJHNyYyIsDQorICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNl0+IHsNCisgICAgbGV0IEluc3R7MTEtMTB9ID0gMGIwMDsNCisgICAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOw0KKyAgfQ0KKyAgZGVmIHJfcm90IDogQUV4dEk8b3Bjb2QsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYywgaTMyaW1tOiRyb3QpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2lVTkFzaSwgb3BjLCAiXHQkZHN0LCAkc3JjLCByb3IgJHJvdCIsDQorICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNl0+IHsNCisgICAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOw0KKyAgfQ0KK30NCisNCisvLy8gQUlfYmluX3Jyb3QgLSBBIGJpbmFyeSBvcGVyYXRpb24gd2l0aCB0d28gZm9ybXM6IG9uZSB3aG9zZSBvcGVyYW5kIGlzIGENCisvLy8gcmVnaXN0ZXIgYW5kIG9uZSB3aG9zZSBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIgcm90YXRlZCBieSA4LzE2LzI0Lg0KK211bHRpY2xhc3MgQUlfYmluX3Jyb3Q8Yml0czw4PiBvcGNvZCwgc3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGU+IHsNCisgIGRlZiByciAgICAgOiBBRXh0STxvcGNvZCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokTEhTLCBHUFI6JFJIUyksDQorICAgICAgICAgICAgICAgICAgSUlDX2lBTFVyLCBvcGMsICJcdCRkc3QsICRMSFMsICRSSFMiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIEdQUjokTEhTLCBHUFI6JFJIUykpXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNl0+IHsNCisgICAgbGV0IEluc3R7MTEtMTB9ID0gMGIwMDsNCisgIH0NCisgIGRlZiBycl9yb3QgOiBBRXh0STxvcGNvZCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokTEhTLCBHUFI6JFJIUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyaW1tOiRyb3QpLA0KKyAgICAgICAgICAgICAgICAgIElJQ19pQUxVc2ksIG9wYywgIlx0JGRzdCwgJExIUywgJFJIUywgcm9yICRyb3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIEdQUjokTEhTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3RyIEdQUjokUkhTLCByb3RfaW1tOiRyb3QpKSldPiwNCisgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2XT47DQorfQ0KKw0KKy8vIEZvciBkaXNhc3NlbWJseSBvbmx5Lg0KK211bHRpY2xhc3MgQUlfYmluX3Jyb3RfbnA8Yml0czw4PiBvcGNvZCwgc3RyaW5nIG9wYz4gew0KKyAgZGVmIHJyICAgICA6IEFFeHRJPG9wY29kLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRMSFMsIEdQUjokUkhTKSwNCisgICAgICAgICAgICAgICAgICBJSUNfaUFMVXIsIG9wYywgIlx0JGRzdCwgJExIUywgJFJIUyIsDQorICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2XT4gew0KKyAgICBsZXQgSW5zdHsxMS0xMH0gPSAwYjAwOw0KKyAgfQ0KKyAgZGVmIHJyX3JvdCA6IEFFeHRJPG9wY29kLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRMSFMsIEdQUjokUkhTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJpbW06JHJvdCksDQorICAgICAgICAgICAgICAgICAgSUlDX2lBTFVzaSwgb3BjLCAiXHQkZHN0LCAkTEhTLCAkUkhTLCByb3IgJHJvdCIsDQorICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2XT47DQorfQ0KKw0KKy8vLyBBSTFfYWRkZV9zdWJlX2lycyAtIERlZmluZSBpbnN0cnVjdGlvbnMgYW5kIHBhdHRlcm5zIGZvciBhZGRlIGFuZCBzdWJlLg0KK2xldCBVc2VzID0gW0NQU1JdIGluIHsNCittdWx0aWNsYXNzIEFJMV9hZGRlX3N1YmVfaXJzPGJpdHM8ND4gb3Bjb2QsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IENvbW11dGFibGUgPSAwPiB7DQorICBkZWYgcmkgOiBBc0kxPG9wY29kLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBzb19pbW06JGIpLA0KKyAgICAgICAgICAgICAgICBEUEZybSwgSUlDX2lBTFVpLCBvcGMsICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChvcG5vZGUgR1BSOiRhLCBzb19pbW06JGIpKV0+LA0KKyAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTV0+IHsNCisgICAgbGV0IEluc3R7MjV9ID0gMTsNCisgIH0NCisgIGRlZiByciA6IEFzSTE8b3Bjb2QsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksDQorICAgICAgICAgICAgICAgIERQRnJtLCBJSUNfaUFMVXIsIG9wYywgIlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG9wbm9kZSBHUFI6JGEsIEdQUjokYikpXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNXT4gew0KKyAgICBsZXQgaXNDb21tdXRhYmxlID0gQ29tbXV0YWJsZTsNCisgICAgbGV0IEluc3R7MTEtNH0gPSAwYjAwMDAwMDAwOw0KKyAgICBsZXQgSW5zdHsyNX0gPSAwOw0KKyAgfQ0KKyAgZGVmIHJzIDogQXNJMTxvcGNvZCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgc29fcmVnOiRiKSwNCisgICAgICAgICAgICAgICAgRFBTb1JlZ0ZybSwgSUlDX2lBTFVzciwgb3BjLCAiXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIEdQUjokYSwgc29fcmVnOiRiKSldPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk1dPiB7DQorICAgIGxldCBJbnN0ezI1fSA9IDA7DQorICB9DQorfQ0KKy8vIENhcnJ5IHNldHRpbmcgdmFyaWFudHMNCitsZXQgRGVmcyA9IFtDUFNSXSBpbiB7DQorbXVsdGljbGFzcyBBSTFfYWRkZV9zdWJlX3NfaXJzPGJpdHM8ND4gb3Bjb2QsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IENvbW11dGFibGUgPSAwPiB7DQorICBkZWYgU3JpIDogQVhJMTxvcGNvZCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgc29faW1tOiRiKSwNCisgICAgICAgICAgICAgICAgRFBGcm0sIElJQ19pQUxVaSwgIXN0cmNvbmNhdChvcGMsICJcdCRkc3QsICRhLCAkYiIpLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIEdQUjokYSwgc29faW1tOiRiKSldPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk1dPiB7DQorICAgIGxldCBJbnN0ezIwfSA9IDE7DQorICAgIGxldCBJbnN0ezI1fSA9IDE7DQorICB9DQorICBkZWYgU3JyIDogQVhJMTxvcGNvZCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgR1BSOiRiKSwNCisgICAgICAgICAgICAgICAgRFBGcm0sIElJQ19pQUxVciwgIXN0cmNvbmNhdChvcGMsICJcdCRkc3QsICRhLCAkYiIpLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIEdQUjokYSwgR1BSOiRiKSldPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk1dPiB7DQorICAgIGxldCBJbnN0ezExLTR9ID0gMGIwMDAwMDAwMDsNCisgICAgbGV0IEluc3R7MjB9ID0gMTsNCisgICAgbGV0IEluc3R7MjV9ID0gMDsNCisgIH0NCisgIGRlZiBTcnMgOiBBWEkxPG9wY29kLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBzb19yZWc6JGIpLA0KKyAgICAgICAgICAgICAgICBEUFNvUmVnRnJtLCBJSUNfaUFMVXNyLCAhc3RyY29uY2F0KG9wYywgIlx0JGRzdCwgJGEsICRiIiksDQorICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChvcG5vZGUgR1BSOiRhLCBzb19yZWc6JGIpKV0+LA0KKyAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTV0+IHsNCisgICAgbGV0IEluc3R7MjB9ID0gMTsNCisgICAgbGV0IEluc3R7MjV9ID0gMDsNCisgIH0NCit9DQorfQ0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgTWlzY2VsbGFuZW91cyBJbnN0cnVjdGlvbnMuDQorLy8NCisNCisvLy8gQ09OU1RQT09MX0VOVFJZIC0gVGhpcyBpbnN0cnVjdGlvbiByZXByZXNlbnRzIGEgZmxvYXRpbmcgY29uc3RhbnQgcG9vbCBpbg0KKy8vLyB0aGUgZnVuY3Rpb24uICBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgSUQjIGZvciB0aGlzIGluc3RydWN0aW9uLCB0aGUgc2Vjb25kDQorLy8vIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBNYWNoaW5lQ29uc3RhbnRQb29sIHRoYXQgdGhpcyBpcywgdGhlIHRoaXJkIGlzIHRoZQ0KKy8vLyBzaXplIGluIGJ5dGVzIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4NCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEsIGlzTm90RHVwbGljYWJsZSA9IDEgaW4NCitkZWYgQ09OU1RQT09MX0VOVFJZIDoNCitQc2V1ZG9JbnN0PChvdXRzKSwgKGlucyBjcGluc3Rfb3BlcmFuZDokaW5zdGlkLCBjcGluc3Rfb3BlcmFuZDokY3BpZHgsDQorICAgICAgICAgICAgICAgICAgICBpMzJpbW06JHNpemUpLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICIke2luc3RpZDpsYWJlbH0gJHtjcGlkeDpjcGVudHJ5fSIsIFtdPjsNCisNCisvLyBGSVhNRTogTWFya2luZyB0aGVzZSBhcyBoYXNTaWRlRWZmZWN0cyBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBtYWNoaW5lIERDRQ0KKy8vIGZyb20gcmVtb3Zpbmcgb25lIGhhbGYgb2YgdGhlIG1hdGNoZWQgcGFpcnMuIFRoYXQgYnJlYWtzIFBFSSwgd2hpY2ggYXNzdW1lcw0KKy8vIHRoZXNlIHdpbGwgYWx3YXlzIGJlIGluIHBhaXJzLCBhbmQgYXNzZXJ0cyBpZiBpdCBmaW5kcyBvdGhlcndpc2UuIEJldHRlciB3YXk/DQorbGV0IERlZnMgPSBbU1BdLCBVc2VzID0gW1NQXSwgaGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCitkZWYgQURKQ0FMTFNUQUNLVVAgOg0KK1BzZXVkb0luc3Q8KG91dHMpLCAoaW5zIGkzMmltbTokYW10MSwgaTMyaW1tOiRhbXQyLCBwcmVkOiRwKSwgTm9JdGluZXJhcnksDQorICAgICAgICAgICAiJHs6Y29tbWVudH0gQURKQ0FMTFNUQUNLVVAgJGFtdDEiLA0KKyAgICAgICAgICAgWyhBUk1jYWxsc2VxX2VuZCB0aW1tOiRhbXQxLCB0aW1tOiRhbXQyKV0+Ow0KKw0KK2RlZiBBREpDQUxMU1RBQ0tET1dOIDoNCitQc2V1ZG9JbnN0PChvdXRzKSwgKGlucyBpMzJpbW06JGFtdCwgcHJlZDokcCksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgIiR7OmNvbW1lbnR9IEFESkNBTExTVEFDS0RPV04gJGFtdCIsDQorICAgICAgICAgICBbKEFSTWNhbGxzZXFfc3RhcnQgdGltbTokYW10KV0+Ow0KK30NCisNCitkZWYgTk9QIDogQUk8KG91dHMpLCAoaW5zKSwgTWlzY0ZybSwgTm9JdGluZXJhcnksICJub3AiLCAiIiwNCisgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNlQyXT4gew0KKyAgbGV0IEluc3R7MjctMTZ9ID0gMGIwMDExMDAxMDAwMDA7DQorICBsZXQgSW5zdHs3LTB9ID0gMGIwMDAwMDAwMDsNCit9DQorDQorZGVmIFlJRUxEIDogQUk8KG91dHMpLCAoaW5zKSwgTWlzY0ZybSwgTm9JdGluZXJhcnksICJ5aWVsZCIsICIiLA0KKyAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2VDJdPiB7DQorICBsZXQgSW5zdHsyNy0xNn0gPSAwYjAwMTEwMDEwMDAwMDsNCisgIGxldCBJbnN0ezctMH0gPSAwYjAwMDAwMDAxOw0KK30NCisNCitkZWYgV0ZFIDogQUk8KG91dHMpLCAoaW5zKSwgTWlzY0ZybSwgTm9JdGluZXJhcnksICJ3ZmUiLCAiIiwNCisgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNlQyXT4gew0KKyAgbGV0IEluc3R7MjctMTZ9ID0gMGIwMDExMDAxMDAwMDA7DQorICBsZXQgSW5zdHs3LTB9ID0gMGIwMDAwMDAxMDsNCit9DQorDQorZGVmIFdGSSA6IEFJPChvdXRzKSwgKGlucyksIE1pc2NGcm0sIE5vSXRpbmVyYXJ5LCAid2ZpIiwgIiIsDQorICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZUMl0+IHsNCisgIGxldCBJbnN0ezI3LTE2fSA9IDBiMDAxMTAwMTAwMDAwOw0KKyAgbGV0IEluc3R7Ny0wfSA9IDBiMDAwMDAwMTE7DQorfQ0KKw0KK2RlZiBTRUwgOiBBSTwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIpLCBEUEZybSwgTm9JdGluZXJhcnksICJzZWwiLA0KKyAgICAgICAgICAgICAiXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2XT4gew0KKyAgbGV0IEluc3R7MjctMjB9ID0gMGIwMTEwMTAwMDsNCisgIGxldCBJbnN0ezctNH0gPSAwYjEwMTE7DQorfQ0KKw0KK2RlZiBTRVYgOiBBSTwob3V0cyksIChpbnMpLCBNaXNjRnJtLCBOb0l0aW5lcmFyeSwgInNldiIsICIiLA0KKyAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2VDJdPiB7DQorICBsZXQgSW5zdHsyNy0xNn0gPSAwYjAwMTEwMDEwMDAwMDsNCisgIGxldCBJbnN0ezctMH0gPSAwYjAwMDAwMTAwOw0KK30NCisNCisvLyBUaGUgaTMyaW1tIG9wZXJhbmQgJHZhbCBjYW4gYmUgdXNlZCBieSBhIGRlYnVnZ2VyIHRvIHN0b3JlIG1vcmUgaW5mb3JtYXRpb24NCisvLyBhYm91dCB0aGUgYnJlYWtwb2ludC4NCitkZWYgQktQVCA6IEFJPChvdXRzKSwgKGlucyBpMzJpbW06JHZhbCksIE1pc2NGcm0sIE5vSXRpbmVyYXJ5LCAiYmtwdCIsICJcdCR2YWwiLA0KKyAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTV0+IHsNCisgIGxldCBJbnN0ezI3LTIwfSA9IDBiMDAwMTAwMTA7DQorICBsZXQgSW5zdHs3LTR9ID0gMGIwMTExOw0KK30NCisNCisvLyBDaGFuZ2UgUHJvY2Vzc29yIFN0YXRlIGlzIGEgc3lzdGVtIGluc3RydWN0aW9uIC0tIGZvciBkaXNhc3NlbWJseSBvbmx5Lg0KKy8vIFRoZSBzaW5nbGV0b24gJG9wdCBvcGVyYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246DQorLy8gb3B0ezQtMH0gPSBtb2RlIGZyb20gSW5zdHs0LTB9DQorLy8gb3B0ezV9ID0gY2hhbmdlbW9kZSBmcm9tIEluc3R7MTd9DQorLy8gb3B0ezgtNn0gPSBBSUYgZnJvbSBJbnN0ezgtNn0NCisvLyBvcHR7MTAtOX0gPSBpbW9kIGZyb20gSW5zdHsxOS0xOH0gd2l0aCAwYjEwIGFzIGVuYWJsZSBhbmQgMGIxMSBhcyBkaXNhYmxlDQorZGVmIENQUyA6IEFYSTwob3V0cyksIChpbnMgY3BzX29wdDokb3B0KSwgTWlzY0ZybSwgTm9JdGluZXJhcnksICJjcHMkb3B0IiwNCisgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTV0+IHsNCisgIGxldCBJbnN0ezMxLTI4fSA9IDBiMTExMTsNCisgIGxldCBJbnN0ezI3LTIwfSA9IDBiMDAwMTAwMDA7DQorICBsZXQgSW5zdHsxNn0gPSAwOw0KKyAgbGV0IEluc3R7NX0gPSAwOw0KK30NCisNCisvLyBQcmVsb2FkIHNpZ25hbHMgdGhlIG1lbW9yeSBzeXN0ZW0gb2YgcG9zc2libGUgZnV0dXJlIGRhdGEvaW5zdHJ1Y3Rpb24gYWNjZXNzLg0KKy8vIFRoZXNlIGFyZSBmb3IgZGlzYXNzZW1ibHkgb25seS4NCisvLw0KKy8vIEE4LjYuMTE3LCBBOC42LjExOC4gIERpZmZlcmVudCBpbnN0cnVjdGlvbnMgYXJlIGdlbmVyYXRlZCBmb3IgIzAgYW5kICMtMC4NCisvLyBUaGUgbmVnX3plcm8gb3BlcmFuZCB0cmFuc2xhdGVzIC0wIHRvIC0xLCAtMSB0byAtMiwgLi4uLCBldGMuDQorbXVsdGljbGFzcyBBUHJlTG9hZDxiaXQgZGF0YSwgYml0IHJlYWQsIHN0cmluZyBvcGM+IHsNCisNCisgIGRlZiBpIDogQVhJPChvdXRzKSwgKGlucyBHUFI6JGJhc2UsIG5lZ196ZXJvOiRpbW0pLCBNaXNjRnJtLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgIlx0WyRiYXNlLCAkaW1tXSIpLCBbXT4gew0KKyAgICBsZXQgSW5zdHszMS0yNn0gPSAwYjExMTEwMTsNCisgICAgbGV0IEluc3R7MjV9ID0gMDsgLy8gMCBmb3IgaW1tZWRpYXRlIGZvcm0NCisgICAgbGV0IEluc3R7MjR9ID0gZGF0YTsNCisgICAgbGV0IEluc3R7MjJ9ID0gcmVhZDsNCisgICAgbGV0IEluc3R7MjEtMjB9ID0gMGIwMTsNCisgIH0NCisNCisgIGRlZiByIDogQVhJPChvdXRzKSwgKGlucyBhZGRybW9kZTI6JGFkZHIpLCBNaXNjRnJtLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgIlx0JGFkZHIiKSwgW10+IHsNCisgICAgbGV0IEluc3R7MzEtMjZ9ID0gMGIxMTExMDE7DQorICAgIGxldCBJbnN0ezI1fSA9IDE7IC8vIDEgZm9yIHJlZ2lzdGVyIGZvcm0NCisgICAgbGV0IEluc3R7MjR9ID0gZGF0YTsNCisgICAgbGV0IEluc3R7MjJ9ID0gcmVhZDsNCisgICAgbGV0IEluc3R7MjEtMjB9ID0gMGIwMTsNCisgICAgbGV0IEluc3R7NH0gPSAwOw0KKyAgfQ0KK30NCisNCitkZWZtIFBMRCAgOiBBUHJlTG9hZDwxLCAxLCAicGxkIj47DQorZGVmbSBQTERXIDogQVByZUxvYWQ8MSwgMCwgInBsZHciPjsNCitkZWZtIFBMSSAgOiBBUHJlTG9hZDwwLCAxLCAicGxpIj47DQorDQorZGVmIFNFVEVOREJFIDogQVhJPChvdXRzKSwoaW5zKSwgTWlzY0ZybSwgTm9JdGluZXJhcnksICJzZXRlbmRcdGJlIiwNCisgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk1dPiB7DQorICBsZXQgSW5zdHszMS0yOH0gPSAwYjExMTE7DQorICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAwMDEwMDAwOw0KKyAgbGV0IEluc3R7MTZ9ID0gMTsNCisgIGxldCBJbnN0ezl9ID0gMTsNCisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDA7DQorfQ0KKw0KK2RlZiBTRVRFTkRMRSA6IEFYSTwob3V0cyksKGlucyksIE1pc2NGcm0sIE5vSXRpbmVyYXJ5LCAic2V0ZW5kXHRsZSIsDQorICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNXT4gew0KKyAgbGV0IEluc3R7MzEtMjh9ID0gMGIxMTExOw0KKyAgbGV0IEluc3R7MjctMjB9ID0gMGIwMDAxMDAwMDsNCisgIGxldCBJbnN0ezE2fSA9IDE7DQorICBsZXQgSW5zdHs5fSA9IDA7DQorICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAwOw0KK30NCisNCitkZWYgREJHIDogQUk8KG91dHMpLCAoaW5zIGkzMmltbTokb3B0KSwgTWlzY0ZybSwgTm9JdGluZXJhcnksICJkYmciLCAiXHQkb3B0IiwNCisgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWN10+IHsNCisgIGxldCBJbnN0ezI3LTE2fSA9IDBiMDAxMTAwMTAwMDAwOw0KKyAgbGV0IEluc3R7Ny00fSA9IDBiMTExMTsNCit9DQorDQorLy8gQTUuNCBQZXJtYW5lbnRseSBVTkRFRklORUQgaW5zdHJ1Y3Rpb25zLg0KKy8vIEZJWE1FOiBUZW1wb3JhcnkgZW1pdHRlZCBhcyByYXcgYnl0ZXMgdW50aWwgdGhpcyBwc2V1ZG8tb3Agd2lsbCBiZSBhZGRlZCB0bw0KKy8vIGJpbnV0aWxzDQorbGV0IGlzQmFycmllciA9IDEsIGlzVGVybWluYXRvciA9IDEgaW4NCitkZWYgVFJBUCA6IEFYSTwob3V0cyksIChpbnMpLCBNaXNjRnJtLCBOb0l0aW5lcmFyeSwgDQorICAgICAgICAgICAgICAgIi5sb25nIDB4ZTdmZmRlZmUgJHs6Y29tbWVudH0gdHJhcCIsIFsodHJhcCldPiwNCisgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTV0+IHsNCisgIGxldCBJbnN0ezI3LTI1fSA9IDBiMDExOw0KKyAgbGV0IEluc3R7MjQtMjB9ID0gMGIxMTExMTsNCisgIGxldCBJbnN0ezctNX0gPSAwYjExMTsNCisgIGxldCBJbnN0ezR9ID0gMGIxOw0KK30NCisNCisvLyBBZGRyZXNzIGNvbXB1dGF0aW9uIGFuZCBsb2FkcyBhbmQgc3RvcmVzIGluIFBJQyBtb2RlLg0KK2xldCBpc05vdER1cGxpY2FibGUgPSAxIGluIHsNCitkZWYgUElDQUREIDogQVhJMTwwYjAxMDAsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIHBjbGFiZWw6JGNwLCBwcmVkOiRwKSwNCisgICAgICAgICAgICAgICAgICBQc2V1ZG8sIElJQ19pQUxVciwgIlxuJGNwOlxuXHRhZGQkcFx0JGRzdCwgcGMsICRhIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChBUk1waWNfYWRkIEdQUjokYSwgaW1tOiRjcCkpXT47DQorDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDEwIGluIHsNCitkZWYgUElDTERSICA6IEFYSTJsZHc8KG91dHMgR1BSOiRkc3QpLCAoaW5zIGFkZHJtb2RlcGM6JGFkZHIsIHByZWQ6JHApLA0KKyAgICAgICAgICAgICAgICAgIFBzZXVkbywgSUlDX2lMb2FkciwgIlxuJHthZGRyOmxhYmVsfTpcblx0bGRyJHBcdCRkc3QsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKGxvYWQgYWRkcm1vZGVwYzokYWRkcikpXT47DQorDQorZGVmIFBJQ0xEUkggOiBBWEkzbGRoPChvdXRzIEdQUjokZHN0KSwgKGlucyBhZGRybW9kZXBjOiRhZGRyLCBwcmVkOiRwKSwNCisgICAgICAgICAgICAgICAgUHNldWRvLCBJSUNfaUxvYWRyLCAiXG4ke2FkZHI6bGFiZWx9OlxuXHRsZHJoJHtwfVx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoemV4dGxvYWRpMTYgYWRkcm1vZGVwYzokYWRkcikpXT47DQorDQorZGVmIFBJQ0xEUkIgOiBBWEkybGRiPChvdXRzIEdQUjokZHN0KSwgKGlucyBhZGRybW9kZXBjOiRhZGRyLCBwcmVkOiRwKSwNCisgICAgICAgICAgICAgICAgUHNldWRvLCBJSUNfaUxvYWRyLCAiXG4ke2FkZHI6bGFiZWx9OlxuXHRsZHJiJHtwfVx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoemV4dGxvYWRpOCBhZGRybW9kZXBjOiRhZGRyKSldPjsNCisNCitkZWYgUElDTERSU0ggOiBBWEkzbGRzaDwob3V0cyBHUFI6JGRzdCksIChpbnMgYWRkcm1vZGVwYzokYWRkciwgcHJlZDokcCksDQorICAgICAgICAgICAgICAgUHNldWRvLCBJSUNfaUxvYWRyLCAiXG4ke2FkZHI6bGFiZWx9OlxuXHRsZHJzaCR7cH1cdCRkc3QsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKHNleHRsb2FkaTE2IGFkZHJtb2RlcGM6JGFkZHIpKV0+Ow0KKw0KK2RlZiBQSUNMRFJTQiA6IEFYSTNsZHNiPChvdXRzIEdQUjokZHN0KSwgKGlucyBhZGRybW9kZXBjOiRhZGRyLCBwcmVkOiRwKSwNCisgICAgICAgICAgICAgICBQc2V1ZG8sIElJQ19pTG9hZHIsICJcbiR7YWRkcjpsYWJlbH06XG5cdGxkcnNiJHtwfVx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoc2V4dGxvYWRpOCBhZGRybW9kZXBjOiRhZGRyKSldPjsNCit9DQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDEwIGluIHsNCitkZWYgUElDU1RSICA6IEFYSTJzdHc8KG91dHMpLCAoaW5zIEdQUjokc3JjLCBhZGRybW9kZXBjOiRhZGRyLCBwcmVkOiRwKSwNCisgICAgICAgICAgICAgICBQc2V1ZG8sIElJQ19pU3RvcmVyLCAiXG4ke2FkZHI6bGFiZWx9OlxuXHRzdHIkcFx0JHNyYywgJGFkZHIiLA0KKyAgICAgICAgICAgICAgIFsoc3RvcmUgR1BSOiRzcmMsIGFkZHJtb2RlcGM6JGFkZHIpXT47DQorDQorZGVmIFBJQ1NUUkggOiBBWEkzc3RoPChvdXRzKSwgKGlucyBHUFI6JHNyYywgYWRkcm1vZGVwYzokYWRkciwgcHJlZDokcCksDQorICAgICAgICAgICAgICAgUHNldWRvLCBJSUNfaVN0b3JlciwgIlxuJHthZGRyOmxhYmVsfTpcblx0c3RyaCR7cH1cdCRzcmMsICRhZGRyIiwNCisgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpMTYgR1BSOiRzcmMsIGFkZHJtb2RlcGM6JGFkZHIpXT47DQorDQorZGVmIFBJQ1NUUkIgOiBBWEkyc3RiPChvdXRzKSwgKGlucyBHUFI6JHNyYywgYWRkcm1vZGVwYzokYWRkciwgcHJlZDokcCksDQorICAgICAgICAgICAgICAgUHNldWRvLCBJSUNfaVN0b3JlciwgIlxuJHthZGRyOmxhYmVsfTpcblx0c3RyYiR7cH1cdCRzcmMsICRhZGRyIiwNCisgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpOCBHUFI6JHNyYywgYWRkcm1vZGVwYzokYWRkcildPjsNCit9DQorfSAvLyBpc05vdER1cGxpY2FibGUgPSAxDQorDQorDQorLy8gTEVBcGNyZWwgLSBMb2FkIGEgcGMtcmVsYXRpdmUgYWRkcmVzcyBpbnRvIGEgcmVnaXN0ZXIgd2l0aG91dCBvZmZlbmRpbmcgdGhlDQorLy8gYXNzZW1ibGVyLg0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCitkZWYgTEVBcGNyZWwgOiBBWEkxPDB4MCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIGkzMmltbTokbGFiZWwsIHByZWQ6JHApLA0KKyAgICAgICAgICAgICAgICAgICAgUHNldWRvLCBJSUNfaUFMVWksDQorICAgICAgICAgICAgICAgICAgICAiYWRyJHBcdCRkc3QsICMkbGFiZWwiLCBbXT47DQorDQorfSAvLyBuZXZlckhhc1NpZGVFZmZlY3RzDQorZGVmIExFQXBjcmVsSlQgOiBBWEkxPDB4MCwgKG91dHMgR1BSOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTMyaW1tOiRsYWJlbCwgbm9oYXNoX2ltbTokaWQsIHByZWQ6JHApLA0KKyAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG8sIElJQ19pQUxVaSwNCisgICAgICAgICAgICAgICAgICAgICAgImFkciRwXHQkZHN0LCAjJHtsYWJlbH1fJHtpZH0iLCBbXT4gew0KKyAgICBsZXQgSW5zdHsyNX0gPSAxOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBDb250cm9sIEZsb3cgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorDQorbGV0IGlzUmV0dXJuID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSBpbiB7DQorICAvLyBBUk1WNFQgYW5kIGFib3ZlDQorICBkZWYgQlhfUkVUIDogQUk8KG91dHMpLCAoaW5zKSwgQnJNaXNjRnJtLCBJSUNfQnIsDQorICAgICAgICAgICAgICAgICAgImJ4IiwgIlx0bHIiLCBbKEFSTXJldGZsYWcpXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNFRdPiB7DQorICAgIGxldCBJbnN0ezMtMH0gICA9IDBiMTExMDsNCisgICAgbGV0IEluc3R7Ny00fSAgID0gMGIwMDAxOw0KKyAgICBsZXQgSW5zdHsxOS04fSAgPSAwYjExMTExMTExMTExMTsNCisgICAgbGV0IEluc3R7MjctMjB9ID0gMGIwMDAxMDAxMDsNCisgIH0NCisNCisgIC8vIEFSTVY0IG9ubHkNCisgIGRlZiBNT1ZQQ0xSIDogQUk8KG91dHMpLCAoaW5zKSwgQnJNaXNjRnJtLCBJSUNfQnIsIA0KKyAgICAgICAgICAgICAgICAgICJtb3YiLCAiXHRwYywgbHIiLCBbKEFSTXJldGZsYWcpXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBOb1Y0VF0+IHsNCisgICAgbGV0IEluc3R7MTEtMH0gID0gMGIwMDAwMDAwMDExMTA7DQorICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsNCisgICAgbGV0IEluc3R7MTktMTZ9ID0gMGIwMDAwOw0KKyAgICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAwMDExMDEwOw0KKyAgfQ0KK30NCisNCisvLyBJbmRpcmVjdCBicmFuY2hlcw0KK2xldCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGlzQmFycmllciA9IDEsIGlzSW5kaXJlY3RCcmFuY2ggPSAxIGluIHsNCisgIC8vIEFSTVY0VCBhbmQgYWJvdmUNCisgIGRlZiBCUklORCA6IEFYSTwob3V0cyksIChpbnMgR1BSOiRkc3QpLCBCck1pc2NGcm0sIElJQ19CciwgImJ4XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKGJyaW5kIEdQUjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNFRdPiB7DQorICAgIGxldCBJbnN0ezctNH0gICA9IDBiMDAwMTsNCisgICAgbGV0IEluc3R7MTktOH0gID0gMGIxMTExMTExMTExMTE7DQorICAgIGxldCBJbnN0ezI3LTIwfSA9IDBiMDAwMTAwMTA7DQorICAgIGxldCBJbnN0ezMxLTI4fSA9IDBiMTExMDsNCisgIH0NCisNCisgIC8vIEFSTVY0IG9ubHkNCisgIGRlZiBNT1ZQQ1JYIDogQVhJPChvdXRzKSwgKGlucyBHUFI6JGRzdCksIEJyTWlzY0ZybSwgSUlDX0JyLCAibW92XHRwYywgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhicmluZCBHUFI6JGRzdCldPiwNCisgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgTm9WNFRdPiB7DQorICAgIGxldCBJbnN0ezExLTR9ICA9IDBiMDAwMDAwMDA7DQorICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsNCisgICAgbGV0IEluc3R7MTktMTZ9ID0gMGIwMDAwOw0KKyAgICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAwMDExMDEwOw0KKyAgICBsZXQgSW5zdHszMS0yOH0gPSAwYjExMTA7DQorICB9DQorfQ0KKw0KKy8vIEZJWE1FOiByZW1vdmUgd2hlbiB3ZSBoYXZlIGEgd2F5IHRvIG1hcmtpbmcgYSBNSSB3aXRoIHRoZXNlIHByb3BlcnRpZXMuDQorLy8gRklYTUU6IFNob3VsZCBwYyBiZSBhbiBpbXBsaWNpdCBvcGVyYW5kIGxpa2UgUElDQURELCBldGM/DQorbGV0IGlzUmV0dXJuID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSwgbWF5TG9hZCA9IDEsDQorICAgIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgPSAxIGluDQorICBkZWYgTERNX1JFVCA6IEFYSTRsZDwob3V0cyBHUFI6JHdiKSwgKGlucyBhZGRybW9kZTQ6JGFkZHIsIHByZWQ6JHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2xpc3Q6JGRzdHMsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAgICBJbmRleE1vZGVVcGQsIExkU3RNdWxGcm0sIElJQ19CciwNCisgICAgICAgICAgICAgICAgICAgICAgICJsZG0ke2FkZHI6c3VibW9kZX0ke3B9XHQkYWRkciEsICRkc3RzIiwNCisgICAgICAgICAgICAgICAgICAgICAgICIkYWRkci5hZGRyID0gJHdiIiwgW10+Ow0KKw0KKy8vIE9uIG5vbi1EYXJ3aW4gcGxhdGZvcm1zIFI5IGlzIGNhbGxlZS1zYXZlZC4NCitsZXQgaXNDYWxsID0gMSwNCisgIERlZnMgPSBbUjAsICBSMSwgIFIyLCAgUjMsICBSMTIsIExSLA0KKyAgICAgICAgICBEMCwgIEQxLCAgRDIsICBEMywgIEQ0LCAgRDUsICBENiwgIEQ3LA0KKyAgICAgICAgICBEMTYsIEQxNywgRDE4LCBEMTksIEQyMCwgRDIxLCBEMjIsIEQyMywNCisgICAgICAgICAgRDI0LCBEMjUsIEQyNiwgRDI3LCBEMjgsIEQyOSwgRDMwLCBEMzEsIENQU1IsIEZQU0NSXSBpbiB7DQorICBkZWYgQkwgIDogQUJYSTwwYjEwMTEsIChvdXRzKSwgKGlucyBpMzJpbW06JGZ1bmMsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgIElJQ19CciwgImJsXHQke2Z1bmM6Y2FsbH0iLA0KKyAgICAgICAgICAgICAgICBbKEFSTWNhbGwgdGdsb2JhbGFkZHI6JGZ1bmMpXT4sDQorICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBJc05vdERhcndpbl0+IHsNCisgICAgbGV0IEluc3R7MzEtMjh9ID0gMGIxMTEwOw0KKyAgfQ0KKw0KKyAgZGVmIEJMX3ByZWQgOiBBQkk8MGIxMDExLCAob3V0cyksIChpbnMgaTMyaW1tOiRmdW5jLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICBJSUNfQnIsICJibCIsICJcdCR7ZnVuYzpjYWxsfSIsDQorICAgICAgICAgICAgICAgICAgIFsoQVJNY2FsbF9wcmVkIHRnbG9iYWxhZGRyOiRmdW5jKV0+LA0KKyAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIElzTm90RGFyd2luXT47DQorDQorICAvLyBBUk12NVQgYW5kIGFib3ZlDQorICBkZWYgQkxYIDogQVhJPChvdXRzKSwgKGlucyBHUFI6JGZ1bmMsIHZhcmlhYmxlX29wcyksIEJyTWlzY0ZybSwNCisgICAgICAgICAgICAgICAgSUlDX0JyLCAiYmx4XHQkZnVuYyIsDQorICAgICAgICAgICAgICAgIFsoQVJNY2FsbCBHUFI6JGZ1bmMpXT4sDQorICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVQsIElzTm90RGFyd2luXT4gew0KKyAgICBsZXQgSW5zdHs3LTR9ICAgPSAwYjAwMTE7DQorICAgIGxldCBJbnN0ezE5LTh9ICA9IDBiMTExMTExMTExMTExOw0KKyAgICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAwMDEwMDEwOw0KKyAgfQ0KKw0KKyAgLy8gQVJNdjRUDQorICAvLyBOb3RlOiBSZXN0cmljdCAkZnVuYyB0byB0aGUgdEdQUiByZWdjbGFzcyB0byBwcmV2ZW50IGl0IGJlaW5nIGluIExSLg0KKyAgZGVmIEJYIDogQUJYSXgyPChvdXRzKSwgKGlucyB0R1BSOiRmdW5jLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgIElJQ19CciwgIm1vdlx0bHIsIHBjXG5cdGJ4XHQkZnVuYyIsDQorICAgICAgICAgICAgICAgICAgWyhBUk1jYWxsX25vbGluayB0R1BSOiRmdW5jKV0+LA0KKyAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNFQsIElzTm90RGFyd2luXT4gew0KKyAgICBsZXQgSW5zdHs3LTR9ICAgPSAwYjAwMDE7DQorICAgIGxldCBJbnN0ezE5LTh9ICA9IDBiMTExMTExMTExMTExOw0KKyAgICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAwMDEwMDEwOw0KKyAgfQ0KKw0KKyAgLy8gQVJNdjQNCisgIGRlZiBCTU9WUENSWCA6IEFCWEl4Mjwob3V0cyksIChpbnMgdEdQUjokZnVuYywgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgIElJQ19CciwgIm1vdlx0bHIsIHBjXG5cdG1vdlx0cGMsICRmdW5jIiwNCisgICAgICAgICAgICAgICAgIFsoQVJNY2FsbF9ub2xpbmsgdEdQUjokZnVuYyldPiwNCisgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgTm9WNFQsIElzTm90RGFyd2luXT4gew0KKyAgICBsZXQgSW5zdHsxMS00fSAgPSAwYjAwMDAwMDAwOw0KKyAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7DQorICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMDAwMDsNCisgICAgbGV0IEluc3R7MjctMjB9ID0gMGIwMDAxMTAxMDsNCisgIH0NCit9DQorDQorLy8gT24gRGFyd2luIFI5IGlzIGNhbGwtY2xvYmJlcmVkLg0KK2xldCBpc0NhbGwgPSAxLA0KKyAgRGVmcyA9IFtSMCwgIFIxLCAgUjIsICBSMywgIFI5LCAgUjEyLCBMUiwNCisgICAgICAgICAgRDAsICBEMSwgIEQyLCAgRDMsICBENCwgIEQ1LCAgRDYsICBENywNCisgICAgICAgICAgRDE2LCBEMTcsIEQxOCwgRDE5LCBEMjAsIEQyMSwgRDIyLCBEMjMsDQorICAgICAgICAgIEQyNCwgRDI1LCBEMjYsIEQyNywgRDI4LCBEMjksIEQzMCwgRDMxLCBDUFNSLCBGUFNDUl0gaW4gew0KKyAgZGVmIEJMcjkgIDogQUJYSTwwYjEwMTEsIChvdXRzKSwgKGlucyBpMzJpbW06JGZ1bmMsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgIElJQ19CciwgImJsXHQke2Z1bmM6Y2FsbH0iLA0KKyAgICAgICAgICAgICAgICBbKEFSTWNhbGwgdGdsb2JhbGFkZHI6JGZ1bmMpXT4sIFJlcXVpcmVzPFtJc0FSTSwgSXNEYXJ3aW5dPiB7DQorICAgIGxldCBJbnN0ezMxLTI4fSA9IDBiMTExMDsNCisgIH0NCisNCisgIGRlZiBCTHI5X3ByZWQgOiBBQkk8MGIxMDExLCAob3V0cyksIChpbnMgaTMyaW1tOiRmdW5jLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICBJSUNfQnIsICJibCIsICJcdCR7ZnVuYzpjYWxsfSIsDQorICAgICAgICAgICAgICAgICAgIFsoQVJNY2FsbF9wcmVkIHRnbG9iYWxhZGRyOiRmdW5jKV0+LA0KKyAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSXNEYXJ3aW5dPjsNCisNCisgIC8vIEFSTXY1VCBhbmQgYWJvdmUNCisgIGRlZiBCTFhyOSA6IEFYSTwob3V0cyksIChpbnMgR1BSOiRmdW5jLCB2YXJpYWJsZV9vcHMpLCBCck1pc2NGcm0sDQorICAgICAgICAgICAgICAgIElJQ19CciwgImJseFx0JGZ1bmMiLA0KKyAgICAgICAgICAgICAgICBbKEFSTWNhbGwgR1BSOiRmdW5jKV0+LCBSZXF1aXJlczxbSXNBUk0sIEhhc1Y1VCwgSXNEYXJ3aW5dPiB7DQorICAgIGxldCBJbnN0ezctNH0gICA9IDBiMDAxMTsNCisgICAgbGV0IEluc3R7MTktOH0gID0gMGIxMTExMTExMTExMTE7DQorICAgIGxldCBJbnN0ezI3LTIwfSA9IDBiMDAwMTAwMTA7DQorICB9DQorDQorICAvLyBBUk12NFQNCisgIC8vIE5vdGU6IFJlc3RyaWN0ICRmdW5jIHRvIHRoZSB0R1BSIHJlZ2NsYXNzIHRvIHByZXZlbnQgaXQgYmVpbmcgaW4gTFIuDQorICBkZWYgQlhyOSA6IEFCWEl4Mjwob3V0cyksIChpbnMgdEdQUjokZnVuYywgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICBJSUNfQnIsICJtb3ZcdGxyLCBwY1xuXHRieFx0JGZ1bmMiLA0KKyAgICAgICAgICAgICAgICAgIFsoQVJNY2FsbF9ub2xpbmsgdEdQUjokZnVuYyldPiwNCisgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNFQsIElzRGFyd2luXT4gew0KKyAgICBsZXQgSW5zdHs3LTR9ICAgPSAwYjAwMDE7DQorICAgIGxldCBJbnN0ezE5LTh9ICA9IDBiMTExMTExMTExMTExOw0KKyAgICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAwMDEwMDEwOw0KKyAgfQ0KKw0KKyAgLy8gQVJNdjQNCisgIGRlZiBCTU9WUENSWHI5IDogQUJYSXgyPChvdXRzKSwgKGlucyB0R1BSOiRmdW5jLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgSUlDX0JyLCAibW92XHRsciwgcGNcblx0bW92XHRwYywgJGZ1bmMiLA0KKyAgICAgICAgICAgICAgICAgWyhBUk1jYWxsX25vbGluayB0R1BSOiRmdW5jKV0+LA0KKyAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBOb1Y0VCwgSXNEYXJ3aW5dPiB7DQorICAgIGxldCBJbnN0ezExLTR9ICA9IDBiMDAwMDAwMDA7DQorICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsNCisgICAgbGV0IEluc3R7MTktMTZ9ID0gMGIwMDAwOw0KKyAgICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAwMDExMDEwOw0KKyAgfQ0KK30NCisNCisvLyBUYWlsIGNhbGxzLg0KKw0KK2xldCBpc0NhbGwgPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBpc1JldHVybiA9IDEsIGlzQmFycmllciA9IDEgaW4gew0KKyAgLy8gRGFyd2luIHZlcnNpb25zLg0KKyAgbGV0IERlZnMgPSBbUjAsIFIxLCBSMiwgUjMsIFI5LCBSMTIsDQorICAgICAgICAgICAgICBEMCwgRDEsIEQyLCBEMywgRDQsIEQ1LCBENiwgRDcsDQorICAgICAgICAgICAgICBEMTYsIEQxNywgRDE4LCBEMTksIEQyMCwgRDIxLCBEMjIsIEQyMywgRDI0LCBEMjUsIEQyNiwNCisgICAgICAgICAgICAgIEQyNywgRDI4LCBEMjksIEQzMCwgRDMxLCBQQ10sDQorICAgICAgVXNlcyA9IFtTUF0gaW4gew0KKyAgICBkZWYgVENSRVRVUk5kaSA6IEFJbm9QPChvdXRzKSwgKGlucyBpMzJpbW06JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkbywgSUlDX0JyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIkBUQ19SRVRVUk4iLCJcdCRkc3QiLCBbXT4sIFJlcXVpcmVzPFtJc0Rhcndpbl0+Ow0KKw0KKyAgICBkZWYgVENSRVRVUk5yaSA6IEFJbm9QPChvdXRzKSwgKGlucyB0Y0dQUjokZHN0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvLCBJSUNfQnIsDQorICAgICAgICAgICAgICAgICAgICAgICAiQFRDX1JFVFVSTiIsIlx0JGRzdCIsIFtdPiwgUmVxdWlyZXM8W0lzRGFyd2luXT47DQorDQorICAgIGRlZiBUQUlMSk1QZCA6IEFCWEk8MGIxMDEwLCAob3V0cyksIChpbnMgYnJ0YXJnZXQ6JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgSUlDX0JyLCAiYlx0JGRzdCAgQCBUQUlMQ0FMTCIsDQorICAgICAgICAgICAgICAgICAgIFtdPiwgUmVxdWlyZXM8W0lzRGFyd2luXT47DQorDQorICAgIGRlZiBUQUlMSk1QZHQ6IEFCWEk8MGIxMDEwLCAob3V0cyksIChpbnMgYnJ0YXJnZXQ6JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgSUlDX0JyLCAiYi53XHQkZHN0ICBAIFRBSUxDQUxMIiwNCisgICAgICAgICAgICAgICAgICAgW10+LCBSZXF1aXJlczxbSXNEYXJ3aW5dPjsNCisNCisgICAgZGVmIFRBSUxKTVByIDogQVhJPChvdXRzKSwgKGlucyB0Y0dQUjokZHN0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgIEJyTWlzY0ZybSwgSUlDX0JyLCAiYnhcdCRkc3QgIEAgVEFJTENBTEwiLA0KKyAgICAgICAgICAgICAgICAgICBbXT4sIFJlcXVpcmVzPFtJc0Rhcndpbl0+IHsNCisgICAgICAgICAgICAgICAgICAgbGV0IEluc3R7Ny00fSAgID0gMGIwMDAxOw0KKyAgICAgICAgICAgICAgICAgICBsZXQgSW5zdHsxOS04fSAgPSAwYjExMTExMTExMTExMTsNCisgICAgICAgICAgICAgICAgICAgbGV0IEluc3R7MjctMjB9ID0gMGIwMDAxMDAxMDsNCisgICAgICAgICAgICAgICAgICAgbGV0IEluc3R7MzEtMjh9ID0gMGIxMTEwOw0KKyAgICB9DQorICB9DQorDQorICAvLyBOb24tRGFyd2luIHZlcnNpb25zICh0aGUgZGlmZmVyZW5jZSBpcyBSOSkuDQorICBsZXQgRGVmcyA9IFtSMCwgUjEsIFIyLCBSMywgUjEyLA0KKyAgICAgICAgICAgICAgRDAsIEQxLCBEMiwgRDMsIEQ0LCBENSwgRDYsIEQ3LA0KKyAgICAgICAgICAgICAgRDE2LCBEMTcsIEQxOCwgRDE5LCBEMjAsIEQyMSwgRDIyLCBEMjMsIEQyNCwgRDI1LCBEMjYsDQorICAgICAgICAgICAgICBEMjcsIEQyOCwgRDI5LCBEMzAsIEQzMSwgUENdLA0KKyAgICAgIFVzZXMgPSBbU1BdIGluIHsNCisgICAgZGVmIFRDUkVUVVJOZGlORCA6IEFJbm9QPChvdXRzKSwgKGlucyBpMzJpbW06JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkbywgSUlDX0JyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIkBUQ19SRVRVUk4iLCJcdCRkc3QiLCBbXT4sIFJlcXVpcmVzPFtJc05vdERhcndpbl0+Ow0KKw0KKyAgICBkZWYgVENSRVRVUk5yaU5EIDogQUlub1A8KG91dHMpLCAoaW5zIHRjR1BSOiRkc3QsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG8sIElJQ19CciwNCisgICAgICAgICAgICAgICAgICAgICAgICJAVENfUkVUVVJOIiwiXHQkZHN0IiwgW10+LCBSZXF1aXJlczxbSXNOb3REYXJ3aW5dPjsNCisNCisgICAgZGVmIFRBSUxKTVBkTkQgOiBBQlhJPDBiMTAxMCwgKG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgIElJQ19CciwgImJcdCRkc3QgIEAgVEFJTENBTEwiLA0KKyAgICAgICAgICAgICAgICAgICBbXT4sIFJlcXVpcmVzPFtJc0FSTSwgSXNOb3REYXJ3aW5dPjsNCisNCisgICAgZGVmIFRBSUxKTVBkTkR0IDogQUJYSTwwYjEwMTAsIChvdXRzKSwgKGlucyBicnRhcmdldDokZHN0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICBJSUNfQnIsICJiLndcdCRkc3QgIEAgVEFJTENBTEwiLA0KKyAgICAgICAgICAgICAgICAgICBbXT4sIFJlcXVpcmVzPFtJc1RodW1iLCBJc05vdERhcndpbl0+Ow0KKw0KKyAgICBkZWYgVEFJTEpNUHJORCA6IEFYSTwob3V0cyksIChpbnMgdGNHUFI6JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICBCck1pc2NGcm0sIElJQ19CciwgImJ4XHQkZHN0ICBAIFRBSUxDQUxMIiwNCisgICAgICAgICAgICAgICAgICAgW10+LCBSZXF1aXJlczxbSXNOb3REYXJ3aW5dPiB7DQorICAgICAgICAgICAgICAgICAgIGxldCBJbnN0ezctNH0gICA9IDBiMDAwMTsNCisgICAgICAgICAgICAgICAgICAgbGV0IEluc3R7MTktOH0gID0gMGIxMTExMTExMTExMTE7DQorICAgICAgICAgICAgICAgICAgIGxldCBJbnN0ezI3LTIwfSA9IDBiMDAwMTAwMTA7DQorICAgICAgICAgICAgICAgICAgIGxldCBJbnN0ezMxLTI4fSA9IDBiMTExMDsNCisgICAgfQ0KKyAgfQ0KK30NCisNCitsZXQgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxIGluIHsNCisgIC8vIEIgaXMgInByZWRpY2FibGUiIHNpbmNlIGl0IGNhbiBiZSB4Zm9ybWVkIGludG8gYSBCY2MuDQorICBsZXQgaXNCYXJyaWVyID0gMSBpbiB7DQorICAgIGxldCBpc1ByZWRpY2FibGUgPSAxIGluDQorICAgIGRlZiBCIDogQUJYSTwwYjEwMTAsIChvdXRzKSwgKGlucyBicnRhcmdldDokdGFyZ2V0KSwgSUlDX0JyLA0KKyAgICAgICAgICAgICAgICAiYlx0JHRhcmdldCIsIFsoYnIgYmI6JHRhcmdldCldPjsNCisNCisgIGxldCBpc05vdER1cGxpY2FibGUgPSAxLCBpc0luZGlyZWN0QnJhbmNoID0gMSBpbiB7DQorICBkZWYgQlJfSlRyIDogSlRJPChvdXRzKSwgKGlucyBHUFI6JHRhcmdldCwganRibG9ja19vcGVyYW5kOiRqdCwgaTMyaW1tOiRpZCksDQorICAgICAgICAgICAgICAgICAgICBJSUNfQnIsICJtb3ZcdHBjLCAkdGFyZ2V0JGp0IiwNCisgICAgICAgICAgICAgICAgICAgIFsoQVJNYnJqdCBHUFI6JHRhcmdldCwgdGp1bXB0YWJsZTokanQsIGltbTokaWQpXT4gew0KKyAgICBsZXQgSW5zdHsxMS00fSAgPSAwYjAwMDAwMDAwOw0KKyAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7DQorICAgIGxldCBJbnN0ezIwfSAgICA9IDA7IC8vIFMgQml0DQorICAgIGxldCBJbnN0ezI0LTIxfSA9IDBiMTEwMTsNCisgICAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7DQorICB9DQorICBkZWYgQlJfSlRtIDogSlRJPChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgKGlucyBhZGRybW9kZTI6JHRhcmdldCwganRibG9ja19vcGVyYW5kOiRqdCwgaTMyaW1tOiRpZCksDQorICAgICAgICAgICAgICAgICAgIElJQ19CciwgImxkclx0cGMsICR0YXJnZXQkanQiLA0KKyAgICAgICAgICAgICAgICAgICBbKEFSTWJyanQgKGkzMiAobG9hZCBhZGRybW9kZTI6JHRhcmdldCkpLCB0anVtcHRhYmxlOiRqdCwNCisgICAgICAgICAgICAgICAgICAgICBpbW06JGlkKV0+IHsNCisgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOw0KKyAgICBsZXQgSW5zdHsyMH0gICAgPSAxOyAvLyBMIGJpdA0KKyAgICBsZXQgSW5zdHsyMX0gICAgPSAwOyAvLyBXIGJpdA0KKyAgICBsZXQgSW5zdHsyMn0gICAgPSAwOyAvLyBCIGJpdA0KKyAgICBsZXQgSW5zdHsyNH0gICAgPSAxOyAvLyBQIGJpdA0KKyAgICBsZXQgSW5zdHsyNy0yNX0gPSAwYjAxMTsNCisgIH0NCisgIGRlZiBCUl9KVGFkZCA6IEpUSTwob3V0cyksDQorICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiR0YXJnZXQsIEdQUjokaWR4LCBqdGJsb2NrX29wZXJhbmQ6JGp0LCBpMzJpbW06JGlkKSwNCisgICAgICAgICAgICAgICAgICAgIElJQ19CciwgImFkZFx0cGMsICR0YXJnZXQsICRpZHgkanQiLA0KKyAgICAgICAgICAgICAgICAgICAgWyhBUk1icmp0IChhZGQgR1BSOiR0YXJnZXQsIEdQUjokaWR4KSwgdGp1bXB0YWJsZTokanQsDQorICAgICAgICAgICAgICAgICAgICAgIGltbTokaWQpXT4gew0KKyAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7DQorICAgIGxldCBJbnN0ezIwfSAgICA9IDA7IC8vIFMgYml0DQorICAgIGxldCBJbnN0ezI0LTIxfSA9IDBiMDEwMDsNCisgICAgbGV0IEluc3R7MjctMjV9ID0gMGIwMDA7DQorICB9DQorICB9IC8vIGlzTm90RHVwbGljYWJsZSA9IDEsIGlzSW5kaXJlY3RCcmFuY2ggPSAxDQorICB9IC8vIGlzQmFycmllciA9IDENCisNCisgIC8vIEZJWE1FOiBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBhIHBhdHRlcm4gZm9yIEFSTUJyY29uZCwgYnV0IGNhbid0IHVzZQ0KKyAgLy8gYSB0d28tdmFsdWUgb3BlcmFuZCB3aGVyZSBhIGRhZyBub2RlIGV4cGVjdHMgdHdvIG9wZXJhbmRzLiA6KA0KKyAgZGVmIEJjYyA6IEFCSTwwYjEwMTAsIChvdXRzKSwgKGlucyBicnRhcmdldDokdGFyZ2V0KSwNCisgICAgICAgICAgICAgICBJSUNfQnIsICJiIiwgIlx0JHRhcmdldCIsDQorICAgICAgICAgICAgICAgWy8qKEFSTWJyY29uZCBiYjokdGFyZ2V0LCBpbW06JGNjLCBDQ1I6JGNjcikqL10+Ow0KK30NCisNCisvLyBCcmFuY2ggYW5kIEV4Y2hhbmdlIEphemVsbGUgLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkNCitkZWYgQlhKIDogQUJJPDBiMDAwMSwgKG91dHMpLCAoaW5zIEdQUjokZnVuYyksIE5vSXRpbmVyYXJ5LCAiYnhqIiwgIlx0JGZ1bmMiLA0KKyAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyMy0yMH0gPSAwYjAwMTA7DQorICAvL2xldCBJbnN0ezE5LTh9ID0gMHhmZmY7DQorICBsZXQgSW5zdHs3LTR9ID0gMGIwMDEwOw0KK30NCisNCisvLyBTZWN1cmUgTW9uaXRvciBDYWxsIGlzIGEgc3lzdGVtIGluc3RydWN0aW9uIC0tIGZvciBkaXNhc3NlbWJseSBvbmx5DQorZGVmIFNNQyA6IEFCSTwwYjAwMDEsIChvdXRzKSwgKGlucyBpMzJpbW06JG9wdCksIE5vSXRpbmVyYXJ5LCAic21jIiwgIlx0JG9wdCIsDQorICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsNCisgIGxldCBJbnN0ezIzLTIwfSA9IDBiMDExMDsNCisgIGxldCBJbnN0ezctNH0gPSAwYjAxMTE7DQorfQ0KKw0KKy8vIFN1cGVydmlzb3IgQ2FsbCAoU29mdHdhcmUgSW50ZXJydXB0KSAtLSBmb3IgZGlzYXNzZW1ibHkgb25seQ0KK2xldCBpc0NhbGwgPSAxIGluIHsNCitkZWYgU1ZDIDogQUJJPDBiMTExMSwgKG91dHMpLCAoaW5zIGkzMmltbTokc3ZjKSwgSUlDX0JyLCAic3ZjIiwgIlx0JHN2YyIsDQorICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+Ow0KK30NCisNCisvLyBTdG9yZSBSZXR1cm4gU3RhdGUgaXMgYSBzeXN0ZW0gaW5zdHJ1Y3Rpb24gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkNCitkZWYgU1JTVyA6IEFCWEk8ezEsMCwwLD99LCAob3V0cyksIChpbnMgYWRkcm1vZGU0OiRhZGRyLCBpMzJpbW06JG1vZGUpLA0KKyAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwgInNycyR7YWRkcjpzdWJtb2RlfVx0c3AhLCAkbW9kZSIsDQorICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MzEtMjh9ID0gMGIxMTExOw0KKyAgbGV0IEluc3R7MjItMjB9ID0gMGIxMTA7IC8vIFcgPSAxDQorfQ0KKw0KK2RlZiBTUlMgIDogQUJYSTx7MSwwLDAsP30sIChvdXRzKSwgKGlucyBhZGRybW9kZTQ6JGFkZHIsIGkzMmltbTokbW9kZSksDQorICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAic3JzJHthZGRyOnN1Ym1vZGV9XHRzcCwgJG1vZGUiLA0KKyAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsNCisgIGxldCBJbnN0ezMxLTI4fSA9IDBiMTExMTsNCisgIGxldCBJbnN0ezIyLTIwfSA9IDBiMTAwOyAvLyBXID0gMA0KK30NCisNCisvLyBSZXR1cm4gRnJvbSBFeGNlcHRpb24gaXMgYSBzeXN0ZW0gaW5zdHJ1Y3Rpb24gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkNCitkZWYgUkZFVyA6IEFCWEk8ezEsMCwwLD99LCAob3V0cyksIChpbnMgYWRkcm1vZGU0OiRhZGRyLCBHUFI6JGJhc2UpLA0KKyAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwgInJmZSR7YWRkcjpzdWJtb2RlfVx0JGJhc2UhIiwNCisgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHszMS0yOH0gPSAwYjExMTE7DQorICBsZXQgSW5zdHsyMi0yMH0gPSAwYjAxMTsgLy8gVyA9IDENCit9DQorDQorZGVmIFJGRSAgOiBBQlhJPHsxLDAsMCw/fSwgKG91dHMpLCAoaW5zIGFkZHJtb2RlNDokYWRkciwgR1BSOiRiYXNlKSwNCisgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJyZmUke2FkZHI6c3VibW9kZX1cdCRiYXNlIiwNCisgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHszMS0yOH0gPSAwYjExMTE7DQorICBsZXQgSW5zdHsyMi0yMH0gPSAwYjAwMTsgLy8gVyA9IDANCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgTG9hZCAvIHN0b3JlIEluc3RydWN0aW9ucy4NCisvLw0KKw0KKy8vIExvYWQNCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCitkZWYgTERSICA6IEFJMmxkdzwob3V0cyBHUFI6JGRzdCksIChpbnMgYWRkcm1vZGUyOiRhZGRyKSwgTGRGcm0sIElJQ19pTG9hZHIsDQorICAgICAgICAgICAgICAgImxkciIsICJcdCRkc3QsICRhZGRyIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKGxvYWQgYWRkcm1vZGUyOiRhZGRyKSldPjsNCisNCisvLyBTcGVjaWFsIExEUiBmb3IgbG9hZHMgZnJvbSBub24tcGMtcmVsYXRpdmUgY29uc3Rwb29scy4NCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIG1heUxvYWQgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSwNCisgICAgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbg0KK2RlZiBMRFJjcCA6IEFJMmxkdzwob3V0cyBHUFI6JGRzdCksIChpbnMgYWRkcm1vZGUyOiRhZGRyKSwgTGRGcm0sIElJQ19pTG9hZHIsDQorICAgICAgICAgICAgICAgICAibGRyIiwgIlx0JGRzdCwgJGFkZHIiLCBbXT47DQorDQorLy8gTG9hZHMgd2l0aCB6ZXJvIGV4dGVuc2lvbg0KK2RlZiBMRFJIICA6IEFJM2xkaDwob3V0cyBHUFI6JGRzdCksIChpbnMgYWRkcm1vZGUzOiRhZGRyKSwgTGRNaXNjRnJtLA0KKyAgICAgICAgICAgICAgICAgIElJQ19pTG9hZHIsICJsZHJoIiwgIlx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoemV4dGxvYWRpMTYgYWRkcm1vZGUzOiRhZGRyKSldPjsNCisNCitkZWYgTERSQiAgOiBBSTJsZGI8KG91dHMgR1BSOiRkc3QpLCAoaW5zIGFkZHJtb2RlMjokYWRkciksIExkRnJtLA0KKyAgICAgICAgICAgICAgICAgIElJQ19pTG9hZHIsICJsZHJiIiwgIlx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoemV4dGxvYWRpOCBhZGRybW9kZTI6JGFkZHIpKV0+Ow0KKw0KKy8vIExvYWRzIHdpdGggc2lnbiBleHRlbnNpb24NCitkZWYgTERSU0ggOiBBSTNsZHNoPChvdXRzIEdQUjokZHN0KSwgKGlucyBhZGRybW9kZTM6JGFkZHIpLCBMZE1pc2NGcm0sDQorICAgICAgICAgICAgICAgICAgIElJQ19pTG9hZHIsICJsZHJzaCIsICJcdCRkc3QsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChzZXh0bG9hZGkxNiBhZGRybW9kZTM6JGFkZHIpKV0+Ow0KKw0KK2RlZiBMRFJTQiA6IEFJM2xkc2I8KG91dHMgR1BSOiRkc3QpLCAoaW5zIGFkZHJtb2RlMzokYWRkciksIExkTWlzY0ZybSwNCisgICAgICAgICAgICAgICAgICAgSUlDX2lMb2FkciwgImxkcnNiIiwgIlx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKHNleHRsb2FkaTggYWRkcm1vZGUzOiRhZGRyKSldPjsNCisNCitsZXQgbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMSBpbiB7DQorLy8gTG9hZCBkb3VibGV3b3JkDQorZGVmIExEUkQgOiBBSTNsZGQ8KG91dHMgR1BSOiRkc3QxLCBHUFI6JGRzdDIpLCAoaW5zIGFkZHJtb2RlMzokYWRkciksIExkTWlzY0ZybSwNCisgICAgICAgICAgICAgICAgIElJQ19pTG9hZHIsICJsZHJkIiwgIlx0JGRzdDEsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgIFtdPiwgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVRFXT47DQorDQorLy8gSW5kZXhlZCBsb2Fkcw0KK2RlZiBMRFJfUFJFICA6IEFJMmxkd3ByPChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgYWRkcm1vZGUyOiRhZGRyKSwgTGRGcm0sIElJQ19pTG9hZHJ1LA0KKyAgICAgICAgICAgICAgICAgICAgICJsZHIiLCAiXHQkZHN0LCAkYWRkciEiLCAiJGFkZHIuYmFzZSA9ICRiYXNlX3diIiwgW10+Ow0KKw0KK2RlZiBMRFJfUE9TVCA6IEFJMmxkd3BvPChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRiYXNlLCBhbTJvZmZzZXQ6JG9mZnNldCksIExkRnJtLCBJSUNfaUxvYWRydSwNCisgICAgICAgICAgICAgICAgICAgICAibGRyIiwgIlx0JGRzdCwgWyRiYXNlXSwgJG9mZnNldCIsICIkYmFzZSA9ICRiYXNlX3diIiwgW10+Ow0KKw0KK2RlZiBMRFJIX1BSRSAgOiBBSTNsZGhwcjwob3V0cyBHUFI6JGRzdCwgR1BSOiRiYXNlX3diKSwNCisgICAgICAgICAgICAgICAgICAgICAoaW5zIGFkZHJtb2RlMzokYWRkciksIExkTWlzY0ZybSwgSUlDX2lMb2FkcnUsDQorICAgICAgICAgICAgICAgICAgICAgImxkcmgiLCAiXHQkZHN0LCAkYWRkciEiLCAiJGFkZHIuYmFzZSA9ICRiYXNlX3diIiwgW10+Ow0KKw0KK2RlZiBMRFJIX1BPU1QgOiBBSTNsZGhwbzwob3V0cyBHUFI6JGRzdCwgR1BSOiRiYXNlX3diKSwNCisgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokYmFzZSxhbTNvZmZzZXQ6JG9mZnNldCksIExkTWlzY0ZybSwgSUlDX2lMb2FkcnUsDQorICAgICAgICAgICAgICAgICAgICAibGRyaCIsICJcdCRkc3QsIFskYmFzZV0sICRvZmZzZXQiLCAiJGJhc2UgPSAkYmFzZV93YiIsIFtdPjsNCisNCitkZWYgTERSQl9QUkUgIDogQUkybGRicHI8KG91dHMgR1BSOiRkc3QsIEdQUjokYmFzZV93YiksDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBhZGRybW9kZTI6JGFkZHIpLCBMZEZybSwgSUlDX2lMb2FkcnUsDQorICAgICAgICAgICAgICAgICAgICAgImxkcmIiLCAiXHQkZHN0LCAkYWRkciEiLCAiJGFkZHIuYmFzZSA9ICRiYXNlX3diIiwgW10+Ow0KKw0KK2RlZiBMRFJCX1BPU1QgOiBBSTJsZGJwbzwob3V0cyBHUFI6JGRzdCwgR1BSOiRiYXNlX3diKSwNCisgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokYmFzZSxhbTJvZmZzZXQ6JG9mZnNldCksIExkRnJtLCBJSUNfaUxvYWRydSwNCisgICAgICAgICAgICAgICAgICAgICJsZHJiIiwgIlx0JGRzdCwgWyRiYXNlXSwgJG9mZnNldCIsICIkYmFzZSA9ICRiYXNlX3diIiwgW10+Ow0KKw0KK2RlZiBMRFJTSF9QUkUgOiBBSTNsZHNocHI8KG91dHMgR1BSOiRkc3QsIEdQUjokYmFzZV93YiksDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgYWRkcm1vZGUzOiRhZGRyKSwgTGRNaXNjRnJtLCBJSUNfaUxvYWRydSwNCisgICAgICAgICAgICAgICAgICAgICAgImxkcnNoIiwgIlx0JGRzdCwgJGFkZHIhIiwgIiRhZGRyLmJhc2UgPSAkYmFzZV93YiIsIFtdPjsNCisNCitkZWYgTERSU0hfUE9TVDogQUkzbGRzaHBvPChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokYmFzZSxhbTNvZmZzZXQ6JG9mZnNldCksIExkTWlzY0ZybSwgSUlDX2lMb2FkcnUsDQorICAgICAgICAgICAgICAgICAgICJsZHJzaCIsICJcdCRkc3QsIFskYmFzZV0sICRvZmZzZXQiLCAiJGJhc2UgPSAkYmFzZV93YiIsIFtdPjsNCisNCitkZWYgTERSU0JfUFJFIDogQUkzbGRzYnByPChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5zIGFkZHJtb2RlMzokYWRkciksIExkTWlzY0ZybSwgSUlDX2lMb2FkcnUsDQorICAgICAgICAgICAgICAgICAgICAgICJsZHJzYiIsICJcdCRkc3QsICRhZGRyISIsICIkYWRkci5iYXNlID0gJGJhc2Vfd2IiLCBbXT47DQorDQorZGVmIExEUlNCX1BPU1Q6IEFJM2xkc2Jwbzwob3V0cyBHUFI6JGRzdCwgR1BSOiRiYXNlX3diKSwNCisgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JGJhc2UsYW0zb2Zmc2V0OiRvZmZzZXQpLCBMZE1pc2NGcm0sIElJQ19pTG9hZHJ1LA0KKyAgICAgICAgICAgICAgICAgICAibGRyc2IiLCAiXHQkZHN0LCBbJGJhc2VdLCAkb2Zmc2V0IiwgIiRiYXNlID0gJGJhc2Vfd2IiLCBbXT47DQorDQorLy8gRm9yIGRpc2Fzc2VtYmx5IG9ubHkNCitkZWYgTERSRF9QUkUgOiBBSTNsZGRwcjwob3V0cyBHUFI6JGRzdDEsIEdQUjokZHN0MiwgR1BSOiRiYXNlX3diKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGFkZHJtb2RlMzokYWRkciksIExkTWlzY0ZybSwgSUlDX2lMb2FkciwNCisgICAgICAgICAgICAgICAgICJsZHJkIiwgIlx0JGRzdDEsICRkc3QyLCAkYWRkciEiLCAiJGFkZHIuYmFzZSA9ICRiYXNlX3diIiwgW10+LA0KKyAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y1VEVdPjsNCisNCisvLyBGb3IgZGlzYXNzZW1ibHkgb25seQ0KK2RlZiBMRFJEX1BPU1QgOiBBSTNsZGRwbzwob3V0cyBHUFI6JGRzdDEsIEdQUjokZHN0MiwgR1BSOiRiYXNlX3diKSwNCisgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRiYXNlLGFtM29mZnNldDokb2Zmc2V0KSwgTGRNaXNjRnJtLCBJSUNfaUxvYWRyLA0KKyAgICAgICAgICAgICJsZHJkIiwgIlx0JGRzdDEsICRkc3QyLCBbJGJhc2VdLCAkb2Zmc2V0IiwgIiRiYXNlID0gJGJhc2Vfd2IiLCBbXT4sDQorICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjVURV0+Ow0KKw0KK30gLy8gbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMQ0KKw0KKy8vIExEUlQsIExEUkJULCBMRFJTQlQsIExEUkhULCBMRFJTSFQgYXJlIGZvciBkaXNhc3NlbWJseSBvbmx5Lg0KKw0KK2RlZiBMRFJUIDogQUkybGR3cG88KG91dHMgR1BSOiRkc3QsIEdQUjokYmFzZV93YiksDQorICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRiYXNlLCBhbTJvZmZzZXQ6JG9mZnNldCksIExkRnJtLCBJSUNfaUxvYWRydSwNCisgICAgICAgICAgICAgICAgICAgImxkcnQiLCAiXHQkZHN0LCBbJGJhc2VdLCAkb2Zmc2V0IiwgIiRiYXNlID0gJGJhc2Vfd2IiLCBbXT4gew0KKyAgbGV0IEluc3R7MjF9ID0gMTsgLy8gb3ZlcndyaXRlDQorfQ0KKw0KK2RlZiBMRFJCVCA6IEFJMmxkYnBvPChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRiYXNlLGFtMm9mZnNldDokb2Zmc2V0KSwgTGRGcm0sIElJQ19pTG9hZHJ1LA0KKyAgICAgICAgICAgICAgICAgICJsZHJidCIsICJcdCRkc3QsIFskYmFzZV0sICRvZmZzZXQiLCAiJGJhc2UgPSAkYmFzZV93YiIsIFtdPiB7DQorICBsZXQgSW5zdHsyMX0gPSAxOyAvLyBvdmVyd3JpdGUNCit9DQorDQorZGVmIExEUlNCVCA6IEFJM2xkc2Jwbzwob3V0cyBHUFI6JGRzdCwgR1BSOiRiYXNlX3diKSwNCisgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRiYXNlLGFtM29mZnNldDokb2Zmc2V0KSwgTGRNaXNjRnJtLCBJSUNfaUxvYWRydSwNCisgICAgICAgICAgICAgICAgICJsZHJzYnQiLCAiXHQkZHN0LCBbJGJhc2VdLCAkb2Zmc2V0IiwgIiRiYXNlID0gJGJhc2Vfd2IiLCBbXT4gew0KKyAgbGV0IEluc3R7MjF9ID0gMTsgLy8gb3ZlcndyaXRlDQorfQ0KKw0KK2RlZiBMRFJIVCA6IEFJM2xkaHBvPChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRiYXNlLCBhbTNvZmZzZXQ6JG9mZnNldCksIExkTWlzY0ZybSwgSUlDX2lMb2FkcnUsDQorICAgICAgICAgICAgICAgICAgImxkcmh0IiwgIlx0JGRzdCwgWyRiYXNlXSwgJG9mZnNldCIsICIkYmFzZSA9ICRiYXNlX3diIiwgW10+IHsNCisgIGxldCBJbnN0ezIxfSA9IDE7IC8vIG92ZXJ3cml0ZQ0KK30NCisNCitkZWYgTERSU0hUIDogQUkzbGRzaHBvPChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgKGlucyBHUFI6JGJhc2UsYW0zb2Zmc2V0OiRvZmZzZXQpLCBMZE1pc2NGcm0sIElJQ19pTG9hZHJ1LA0KKyAgICAgICAgICAgICAgICAgImxkcnNodCIsICJcdCRkc3QsIFskYmFzZV0sICRvZmZzZXQiLCAiJGJhc2UgPSAkYmFzZV93YiIsIFtdPiB7DQorICBsZXQgSW5zdHsyMX0gPSAxOyAvLyBvdmVyd3JpdGUNCit9DQorDQorLy8gU3RvcmUNCitkZWYgU1RSICA6IEFJMnN0dzwob3V0cyksIChpbnMgR1BSOiRzcmMsIGFkZHJtb2RlMjokYWRkciksIFN0RnJtLCBJSUNfaVN0b3JlciwNCisgICAgICAgICAgICAgICAic3RyIiwgIlx0JHNyYywgJGFkZHIiLA0KKyAgICAgICAgICAgICAgIFsoc3RvcmUgR1BSOiRzcmMsIGFkZHJtb2RlMjokYWRkcildPjsNCisNCisvLyBTdG9yZXMgd2l0aCB0cnVuY2F0ZQ0KK2RlZiBTVFJIIDogQUkzc3RoPChvdXRzKSwgKGlucyBHUFI6JHNyYywgYWRkcm1vZGUzOiRhZGRyKSwgU3RNaXNjRnJtLA0KKyAgICAgICAgICAgICAgIElJQ19pU3RvcmVyLCAic3RyaCIsICJcdCRzcmMsICRhZGRyIiwNCisgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpMTYgR1BSOiRzcmMsIGFkZHJtb2RlMzokYWRkcildPjsNCisNCitkZWYgU1RSQiA6IEFJMnN0Yjwob3V0cyksIChpbnMgR1BSOiRzcmMsIGFkZHJtb2RlMjokYWRkciksIFN0RnJtLCBJSUNfaVN0b3JlciwNCisgICAgICAgICAgICAgICAic3RyYiIsICJcdCRzcmMsICRhZGRyIiwNCisgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpOCBHUFI6JHNyYywgYWRkcm1vZGUyOiRhZGRyKV0+Ow0KKw0KKy8vIFN0b3JlIGRvdWJsZXdvcmQNCitsZXQgbWF5U3RvcmUgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSwgaGFzRXh0cmFTcmNSZWdBbGxvY1JlcSA9IDEgaW4NCitkZWYgU1RSRCA6IEFJM3N0ZDwob3V0cyksIChpbnMgR1BSOiRzcmMxLCBHUFI6JHNyYzIsIGFkZHJtb2RlMzokYWRkciksDQorICAgICAgICAgICAgICAgU3RNaXNjRnJtLCBJSUNfaVN0b3JlciwNCisgICAgICAgICAgICAgICAic3RyZCIsICJcdCRzcmMxLCAkYWRkciIsIFtdPiwgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVRFXT47DQorDQorLy8gSW5kZXhlZCBzdG9yZXMNCitkZWYgU1RSX1BSRSAgOiBBSTJzdHdwcjwob3V0cyBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMsIEdQUjokYmFzZSwgYW0yb2Zmc2V0OiRvZmZzZXQpLA0KKyAgICAgICAgICAgICAgICAgICAgIFN0RnJtLCBJSUNfaVN0b3JlcnUsDQorICAgICAgICAgICAgICAgICAgICAic3RyIiwgIlx0JHNyYywgWyRiYXNlLCAkb2Zmc2V0XSEiLCAiJGJhc2UgPSAkYmFzZV93YiIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGJhc2Vfd2IsDQorICAgICAgICAgICAgICAgICAgICAgIChwcmVfc3RvcmUgR1BSOiRzcmMsIEdQUjokYmFzZSwgYW0yb2Zmc2V0OiRvZmZzZXQpKV0+Ow0KKw0KK2RlZiBTVFJfUE9TVCA6IEFJMnN0d3BvPChvdXRzIEdQUjokYmFzZV93YiksDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgR1BSOiRiYXNlLGFtMm9mZnNldDokb2Zmc2V0KSwNCisgICAgICAgICAgICAgICAgICAgICBTdEZybSwgSUlDX2lTdG9yZXJ1LA0KKyAgICAgICAgICAgICAgICAgICAgInN0ciIsICJcdCRzcmMsIFskYmFzZV0sICRvZmZzZXQiLCAiJGJhc2UgPSAkYmFzZV93YiIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGJhc2Vfd2IsDQorICAgICAgICAgICAgICAgICAgICAgIChwb3N0X3N0b3JlIEdQUjokc3JjLCBHUFI6JGJhc2UsIGFtMm9mZnNldDokb2Zmc2V0KSldPjsNCisNCitkZWYgU1RSSF9QUkUgOiBBSTNzdGhwcjwob3V0cyBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMsIEdQUjokYmFzZSxhbTNvZmZzZXQ6JG9mZnNldCksDQorICAgICAgICAgICAgICAgICAgICAgU3RNaXNjRnJtLCBJSUNfaVN0b3JlcnUsDQorICAgICAgICAgICAgICAgICAgICAgInN0cmgiLCAiXHQkc3JjLCBbJGJhc2UsICRvZmZzZXRdISIsICIkYmFzZSA9ICRiYXNlX3diIiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokYmFzZV93YiwNCisgICAgICAgICAgICAgICAgICAgICAgKHByZV90cnVuY3N0aTE2IEdQUjokc3JjLCBHUFI6JGJhc2UsYW0zb2Zmc2V0OiRvZmZzZXQpKV0+Ow0KKw0KK2RlZiBTVFJIX1BPU1Q6IEFJM3N0aHBvPChvdXRzIEdQUjokYmFzZV93YiksDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgR1BSOiRiYXNlLGFtM29mZnNldDokb2Zmc2V0KSwNCisgICAgICAgICAgICAgICAgICAgICBTdE1pc2NGcm0sIElJQ19pU3RvcmVydSwNCisgICAgICAgICAgICAgICAgICAgICAic3RyaCIsICJcdCRzcmMsIFskYmFzZV0sICRvZmZzZXQiLCAiJGJhc2UgPSAkYmFzZV93YiIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGJhc2Vfd2IsIChwb3N0X3RydW5jc3RpMTYgR1BSOiRzcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFI6JGJhc2UsIGFtM29mZnNldDokb2Zmc2V0KSldPjsNCisNCitkZWYgU1RSQl9QUkUgOiBBSTJzdGJwcjwob3V0cyBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMsIEdQUjokYmFzZSxhbTJvZmZzZXQ6JG9mZnNldCksDQorICAgICAgICAgICAgICAgICAgICAgU3RGcm0sIElJQ19pU3RvcmVydSwNCisgICAgICAgICAgICAgICAgICAgICAic3RyYiIsICJcdCRzcmMsIFskYmFzZSwgJG9mZnNldF0hIiwgIiRiYXNlID0gJGJhc2Vfd2IiLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRiYXNlX3diLCAocHJlX3RydW5jc3RpOCBHUFI6JHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUjokYmFzZSwgYW0yb2Zmc2V0OiRvZmZzZXQpKV0+Ow0KKw0KK2RlZiBTVFJCX1BPU1Q6IEFJMnN0YnBvPChvdXRzIEdQUjokYmFzZV93YiksDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgR1BSOiRiYXNlLGFtMm9mZnNldDokb2Zmc2V0KSwNCisgICAgICAgICAgICAgICAgICAgICBTdEZybSwgSUlDX2lTdG9yZXJ1LA0KKyAgICAgICAgICAgICAgICAgICAgICJzdHJiIiwgIlx0JHNyYywgWyRiYXNlXSwgJG9mZnNldCIsICIkYmFzZSA9ICRiYXNlX3diIiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokYmFzZV93YiwgKHBvc3RfdHJ1bmNzdGk4IEdQUjokc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSOiRiYXNlLCBhbTJvZmZzZXQ6JG9mZnNldCkpXT47DQorDQorLy8gRm9yIGRpc2Fzc2VtYmx5IG9ubHkNCitkZWYgU1RSRF9QUkUgOiBBSTNzdGRwcjwob3V0cyBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMxLCBHUFI6JHNyYzIsIEdQUjokYmFzZSwgYW0zb2Zmc2V0OiRvZmZzZXQpLA0KKyAgICAgICAgICAgICAgICAgICAgIFN0TWlzY0ZybSwgSUlDX2lTdG9yZXJ1LA0KKyAgICAgICAgICAgICAgICAgICAgICJzdHJkIiwgIlx0JHNyYzEsICRzcmMyLCBbJGJhc2UsICRvZmZzZXRdISIsDQorICAgICAgICAgICAgICAgICAgICAgIiRiYXNlID0gJGJhc2Vfd2IiLCBbXT47DQorDQorLy8gRm9yIGRpc2Fzc2VtYmx5IG9ubHkNCitkZWYgU1RSRF9QT1NUOiBBSTNzdGRwbzwob3V0cyBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMxLCBHUFI6JHNyYzIsIEdQUjokYmFzZSwgYW0zb2Zmc2V0OiRvZmZzZXQpLA0KKyAgICAgICAgICAgICAgICAgICAgIFN0TWlzY0ZybSwgSUlDX2lTdG9yZXJ1LA0KKyAgICAgICAgICAgICAgICAgICAgICJzdHJkIiwgIlx0JHNyYzEsICRzcmMyLCBbJGJhc2VdLCAkb2Zmc2V0IiwNCisgICAgICAgICAgICAgICAgICAgICAiJGJhc2UgPSAkYmFzZV93YiIsIFtdPjsNCisNCisvLyBTVFJULCBTVFJCVCwgYW5kIFNUUkhUIGFyZSBmb3IgZGlzYXNzZW1ibHkgb25seS4NCisNCitkZWYgU1RSVCA6IEFJMnN0d3BvPChvdXRzIEdQUjokYmFzZV93YiksDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokc3JjLCBHUFI6JGJhc2UsYW0yb2Zmc2V0OiRvZmZzZXQpLA0KKyAgICAgICAgICAgICAgICAgICAgU3RGcm0sIElJQ19pU3RvcmVydSwNCisgICAgICAgICAgICAgICAgICAgICJzdHJ0IiwgIlx0JHNyYywgWyRiYXNlXSwgJG9mZnNldCIsICIkYmFzZSA9ICRiYXNlX3diIiwNCisgICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MjF9ID0gMTsgLy8gb3ZlcndyaXRlDQorfQ0KKw0KK2RlZiBTVFJCVCA6IEFJMnN0YnBvPChvdXRzIEdQUjokYmFzZV93YiksDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgR1BSOiRiYXNlLGFtMm9mZnNldDokb2Zmc2V0KSwNCisgICAgICAgICAgICAgICAgICAgICBTdEZybSwgSUlDX2lTdG9yZXJ1LA0KKyAgICAgICAgICAgICAgICAgICAgICJzdHJidCIsICJcdCRzcmMsIFskYmFzZV0sICRvZmZzZXQiLCAiJGJhc2UgPSAkYmFzZV93YiIsDQorICAgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyMX0gPSAxOyAvLyBvdmVyd3JpdGUNCit9DQorDQorZGVmIFNUUkhUOiBBSTNzdGhwbzwob3V0cyBHUFI6JGJhc2Vfd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgR1BSOiRiYXNlLGFtM29mZnNldDokb2Zmc2V0KSwNCisgICAgICAgICAgICAgICAgICAgIFN0TWlzY0ZybSwgSUlDX2lTdG9yZXJ1LA0KKyAgICAgICAgICAgICAgICAgICAgInN0cmh0IiwgIlx0JHNyYywgWyRiYXNlXSwgJG9mZnNldCIsICIkYmFzZSA9ICRiYXNlX3diIiwNCisgICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MjF9ID0gMTsgLy8gb3ZlcndyaXRlDQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIExvYWQgLyBzdG9yZSBtdWx0aXBsZSBJbnN0cnVjdGlvbnMuDQorLy8NCisNCitsZXQgbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMSBpbiB7DQorZGVmIExETSA6IEFYSTRsZDwob3V0cyksIChpbnMgYWRkcm1vZGU0OiRhZGRyLCBwcmVkOiRwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnbGlzdDokZHN0cywgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgIEluZGV4TW9kZU5vbmUsIExkU3RNdWxGcm0sIElJQ19pTG9hZG0sDQorICAgICAgICAgICAgICAgICAibGRtJHthZGRyOnN1Ym1vZGV9JHtwfVx0JGFkZHIsICRkc3RzIiwgIiIsIFtdPjsNCisNCitkZWYgTERNX1VQRCA6IEFYSTRsZDwob3V0cyBHUFI6JHdiKSwgKGlucyBhZGRybW9kZTQ6JGFkZHIsIHByZWQ6JHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdsaXN0OiRkc3RzLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgIEluZGV4TW9kZVVwZCwgTGRTdE11bEZybSwgSUlDX2lMb2FkbSwNCisgICAgICAgICAgICAgICAgICAgICAibGRtJHthZGRyOnN1Ym1vZGV9JHtwfVx0JGFkZHIhLCAkZHN0cyIsDQorICAgICAgICAgICAgICAgICAgICAgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT47DQorfSAvLyBtYXlMb2FkLCBuZXZlckhhc1NpZGVFZmZlY3RzLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxDQorDQorbGV0IG1heVN0b3JlID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEsIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEgPSAxIGluIHsNCitkZWYgU1RNIDogQVhJNHN0PChvdXRzKSwgKGlucyBhZGRybW9kZTQ6JGFkZHIsIHByZWQ6JHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdsaXN0OiRzcmNzLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgSW5kZXhNb2RlTm9uZSwgTGRTdE11bEZybSwgSUlDX2lTdG9yZW0sDQorICAgICAgICAgICAgICAgICAic3RtJHthZGRyOnN1Ym1vZGV9JHtwfVx0JGFkZHIsICRzcmNzIiwgIiIsIFtdPjsNCisNCitkZWYgU1RNX1VQRCA6IEFYSTRzdDwob3V0cyBHUFI6JHdiKSwgKGlucyBhZGRybW9kZTQ6JGFkZHIsIHByZWQ6JHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdsaXN0OiRzcmNzLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgIEluZGV4TW9kZVVwZCwgTGRTdE11bEZybSwgSUlDX2lTdG9yZW0sDQorICAgICAgICAgICAgICAgICAgICAgInN0bSR7YWRkcjpzdWJtb2RlfSR7cH1cdCRhZGRyISwgJHNyY3MiLA0KKyAgICAgICAgICAgICAgICAgICAgICIkYWRkci5hZGRyID0gJHdiIiwgW10+Ow0KK30gLy8gbWF5U3RvcmUsIG5ldmVySGFzU2lkZUVmZmVjdHMsIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXENCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBNb3ZlIEluc3RydWN0aW9ucy4NCisvLw0KKw0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbg0KK2RlZiBNT1ZyIDogQXNJMTwwYjExMDEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYyksIERQRnJtLCBJSUNfaU1PVnIsDQorICAgICAgICAgICAgICAgICJtb3YiLCAiXHQkZHN0LCAkc3JjIiwgW10+LCBVbmFyeURQIHsNCisgIGxldCBJbnN0ezExLTR9ID0gMGIwMDAwMDAwMDsNCisgIGxldCBJbnN0ezI1fSA9IDA7DQorfQ0KKw0KKy8vIEEgdmVyc2lvbiBmb3IgdGhlIHNtYWxsZXIgc2V0IG9mIHRhaWwgY2FsbCByZWdpc3RlcnMuDQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluDQorZGVmIE1PVnJfVEMgOiBBc0kxPDBiMTEwMSwgKG91dHMgdGNHUFI6JGRzdCksIChpbnMgdGNHUFI6JHNyYyksIERQRnJtLCANCisgICAgICAgICAgICAgICAgSUlDX2lNT1ZyLCAibW92IiwgIlx0JGRzdCwgJHNyYyIsIFtdPiwgVW5hcnlEUCB7DQorICBsZXQgSW5zdHsxMS00fSA9IDBiMDAwMDAwMDA7DQorICBsZXQgSW5zdHsyNX0gPSAwOw0KK30NCisNCitkZWYgTU9WcyA6IEFzSTE8MGIxMTAxLCAob3V0cyBHUFI6JGRzdCksIChpbnMgc29fcmVnOiRzcmMpLA0KKyAgICAgICAgICAgICAgICBEUFNvUmVnRnJtLCBJSUNfaU1PVnNyLA0KKyAgICAgICAgICAgICAgICAibW92IiwgIlx0JGRzdCwgJHNyYyIsIFsoc2V0IEdQUjokZHN0LCBzb19yZWc6JHNyYyldPiwgVW5hcnlEUCB7DQorICBsZXQgSW5zdHsyNX0gPSAwOw0KK30NCisNCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSwgaXNBc0NoZWFwQXNBTW92ZSA9IDEgaW4NCitkZWYgTU9WaSA6IEFzSTE8MGIxMTAxLCAob3V0cyBHUFI6JGRzdCksIChpbnMgc29faW1tOiRzcmMpLCBEUEZybSwgSUlDX2lNT1ZpLA0KKyAgICAgICAgICAgICAgICAibW92IiwgIlx0JGRzdCwgJHNyYyIsIFsoc2V0IEdQUjokZHN0LCBzb19pbW06JHNyYyldPiwgVW5hcnlEUCB7DQorICBsZXQgSW5zdHsyNX0gPSAxOw0KK30NCisNCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSwgaXNBc0NoZWFwQXNBTW92ZSA9IDEgaW4NCitkZWYgTU9WaTE2IDogQUkxPDBiMTAwMCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgIERQRnJtLCBJSUNfaU1PVmksDQorICAgICAgICAgICAgICAgICAibW92dyIsICJcdCRkc3QsICRzcmMiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIGltbTBfNjU1MzU6JHNyYyldPiwNCisgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZUMl0+LCBVbmFyeURQIHsNCisgIGxldCBJbnN0ezIwfSA9IDA7DQorICBsZXQgSW5zdHsyNX0gPSAxOw0KK30NCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiIGluDQorZGVmIE1PVlRpMTYgOiBBSTE8MGIxMDEwLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRzcmMsIGkzMmltbTokaW1tKSwNCisgICAgICAgICAgICAgICAgICBEUEZybSwgSUlDX2lNT1ZpLA0KKyAgICAgICAgICAgICAgICAgICJtb3Z0IiwgIlx0JGRzdCwgJGltbSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhbmQgR1BSOiRzcmMsIDB4ZmZmZiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvMTZBbGxaZXJvOiRpbW0pKV0+LCBVbmFyeURQLA0KKyAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZUMl0+IHsNCisgIGxldCBJbnN0ezIwfSA9IDA7DQorICBsZXQgSW5zdHsyNX0gPSAxOw0KK30NCisNCitkZWYgOiBBUk1QYXQ8KG9yIEdQUjokc3JjLCAweGZmZmYwMDAwKSwgKE1PVlRpMTYgR1BSOiRzcmMsIDB4ZmZmZik+LA0KKyAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZUMl0+Ow0KKw0KK2xldCBVc2VzID0gW0NQU1JdIGluDQorZGVmIE1PVnJ4IDogQXNJMTwwYjExMDEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYyksIFBzZXVkbywgSUlDX2lNT1ZzaSwNCisgICAgICAgICAgICAgICAgICJtb3YiLCAiXHQkZHN0LCAkc3JjLCBycngiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChBUk1ycnggR1BSOiRzcmMpKV0+LCBVbmFyeURQOw0KKw0KKy8vIFRoZXNlIGFyZW4ndCByZWFsbHkgbW92IGluc3RydWN0aW9ucywgYnV0IHdlIGhhdmUgdG8gZGVmaW5lIHRoZW0gdGhpcyB3YXkNCisvLyBkdWUgdG8gZmxhZyBvcGVyYW5kcy4NCisNCitsZXQgRGVmcyA9IFtDUFNSXSBpbiB7DQorZGVmIE1PVnNybF9mbGFnIDogQUkxPDBiMTEwMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwgUHNldWRvLA0KKyAgICAgICAgICAgICAgICAgICAgICBJSUNfaU1PVnNpLCAibW92cyIsICJcdCRkc3QsICRzcmMsIGxzciAjMSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoQVJNc3JsX2ZsYWcgR1BSOiRzcmMpKV0+LCBVbmFyeURQOw0KK2RlZiBNT1ZzcmFfZmxhZyA6IEFJMTwwYjExMDEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYyksIFBzZXVkbywNCisgICAgICAgICAgICAgICAgICAgICAgSUlDX2lNT1ZzaSwgIm1vdnMiLCAiXHQkZHN0LCAkc3JjLCBhc3IgIzEiLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKEFSTXNyYV9mbGFnIEdQUjokc3JjKSldPiwgVW5hcnlEUDsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgRXh0ZW5kIEluc3RydWN0aW9ucy4NCisvLw0KKw0KKy8vIFNpZ24gZXh0ZW5kZXJzDQorDQorZGVmbSBTWFRCICA6IEFJX3VuYXJ5X3Jyb3Q8MGIwMTEwMTAxMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3h0YiIsIFVuT3BGcmFnPChzZXh0X2lucmVnIG5vZGU6JFNyYywgaTgpPj47DQorZGVmbSBTWFRIICA6IEFJX3VuYXJ5X3Jyb3Q8MGIwMTEwMTAxMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3h0aCIsIFVuT3BGcmFnPChzZXh0X2lucmVnIG5vZGU6JFNyYywgaTE2KT4+Ow0KKw0KK2RlZm0gU1hUQUIgOiBBSV9iaW5fcnJvdDwwYjAxMTAxMDEwLA0KKyAgICAgICAgICAgICAgICJzeHRhYiIsIEJpbk9wRnJhZzwoYWRkIG5vZGU6JExIUywgKHNleHRfaW5yZWcgbm9kZTokUkhTLCBpOCkpPj47DQorZGVmbSBTWFRBSCA6IEFJX2Jpbl9ycm90PDBiMDExMDEwMTEsDQorICAgICAgICAgICAgICAgInN4dGFoIiwgQmluT3BGcmFnPChhZGQgbm9kZTokTEhTLCAoc2V4dF9pbnJlZyBub2RlOiRSSFMsaTE2KSk+PjsNCisNCisvLyBGb3IgZGlzYXNzZW1ibHkgb25seQ0KK2RlZm0gU1hUQjE2ICA6IEFJX3VuYXJ5X3Jyb3RfbnA8MGIwMTEwMTAwMCwgInN4dGIxNiI+Ow0KKw0KKy8vIEZvciBkaXNhc3NlbWJseSBvbmx5DQorZGVmbSBTWFRBQjE2IDogQUlfYmluX3Jyb3RfbnA8MGIwMTEwMTAwMCwgInN4dGFiMTYiPjsNCisNCisvLyBaZXJvIGV4dGVuZGVycw0KKw0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAxNiBpbiB7DQorZGVmbSBVWFRCICAgOiBBSV91bmFyeV9ycm90PDBiMDExMDExMTAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1eHRiIiAgLCBVbk9wRnJhZzwoYW5kIG5vZGU6JFNyYywgMHgwMDAwMDBGRik+PjsNCitkZWZtIFVYVEggICA6IEFJX3VuYXJ5X3Jyb3Q8MGIwMTEwMTExMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInV4dGgiICAsIFVuT3BGcmFnPChhbmQgbm9kZTokU3JjLCAweDAwMDBGRkZGKT4+Ow0KK2RlZm0gVVhUQjE2IDogQUlfdW5hcnlfcnJvdDwwYjAxMTAxMTAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXh0YjE2IiwgVW5PcEZyYWc8KGFuZCBub2RlOiRTcmMsIDB4MDBGRjAwRkYpPj47DQorDQorLy8gRklYTUU6IFRoaXMgcGF0dGVybiBpbmNvcnJlY3RseSBhc3N1bWVzIHRoZSBzaGwgb3BlcmF0b3IgaXMgYSByb3RhdGUuDQorLy8gICAgICAgIFRoZSB0cmFuc2Zvcm1hdGlvbiBzaG91bGQgcHJvYmFibHkgYmUgZG9uZSBhcyBhIGNvbWJpbmVyIGFjdGlvbg0KKy8vICAgICAgICBpbnN0ZWFkIHNvIHdlIGNhbiBpbmNsdWRlIGEgY2hlY2sgZm9yIG1hc2tpbmcgYmFjayBpbiB0aGUgdXBwZXINCisvLyAgICAgICAgZWlnaHQgYml0cyBvZiB0aGUgc291cmNlIGludG8gdGhlIGxvd2VyIGVpZ2h0IGJpdHMgb2YgdGhlIHJlc3VsdC4NCisvL2RlZiA6IEFSTVY2UGF0PChhbmQgKHNobCBHUFI6JFNyYywgKGkzMiA4KSksIDB4RkYwMEZGKSwNCisvLyAgICAgICAgICAgICAgIChVWFRCMTZyX3JvdCBHUFI6JFNyYywgMjQpPjsNCitkZWYgOiBBUk1WNlBhdDwoYW5kIChzcmwgR1BSOiRTcmMsIChpMzIgOCkpLCAweEZGMDBGRiksDQorICAgICAgICAgICAgICAgKFVYVEIxNnJfcm90IEdQUjokU3JjLCA4KT47DQorDQorZGVmbSBVWFRBQiA6IEFJX2Jpbl9ycm90PDBiMDExMDExMTAsICJ1eHRhYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChhZGQgbm9kZTokTEhTLCAoYW5kIG5vZGU6JFJIUywgMHgwMEZGKSk+PjsNCitkZWZtIFVYVEFIIDogQUlfYmluX3Jyb3Q8MGIwMTEwMTExMSwgInV4dGFoIiwNCisgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KGFkZCBub2RlOiRMSFMsIChhbmQgbm9kZTokUkhTLCAweEZGRkYpKT4+Ow0KK30NCisNCisvLyBUaGlzIGlzbid0IHNhZmUgaW4gZ2VuZXJhbCwgdGhlIGFkZCBpcyB0d28gMTYtYml0IHVuaXRzLCBub3QgYSAzMi1iaXQgYWRkLg0KKy8vIEZvciBkaXNhc3NlbWJseSBvbmx5DQorZGVmbSBVWFRBQjE2IDogQUlfYmluX3Jyb3RfbnA8MGIwMTEwMTEwMCwgInV4dGFiMTYiPjsNCisNCisNCitkZWYgU0JGWCAgOiBJPChvdXRzIEdQUjokZHN0KSwNCisgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMsIGltbTBfMzE6JGxzYiwgaW1tMF8zMTokd2lkdGgpLA0KKyAgICAgICAgICAgICAgIEFkZHJNb2RlMSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgRFBGcm0sIElJQ19pQUxVaSwNCisgICAgICAgICAgICAgICAic2JmeCIsICJcdCRkc3QsICRzcmMsICRsc2IsICR3aWR0aCIsICIiLCBbXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNlQyXT4gew0KKyAgbGV0IEluc3R7MjctMjF9ID0gMGIwMTExMTAxOw0KKyAgbGV0IEluc3R7Ni00fSAgID0gMGIxMDE7DQorfQ0KKw0KK2RlZiBVQkZYICA6IEk8KG91dHMgR1BSOiRkc3QpLA0KKyAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgaW1tMF8zMTokbHNiLCBpbW0wXzMxOiR3aWR0aCksDQorICAgICAgICAgICAgICAgQWRkck1vZGUxLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBEUEZybSwgSUlDX2lBTFVpLA0KKyAgICAgICAgICAgICAgICJ1YmZ4IiwgIlx0JGRzdCwgJHNyYywgJGxzYiwgJHdpZHRoIiwgIiIsIFtdPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2VDJdPiB7DQorICBsZXQgSW5zdHsyNy0yMX0gPSAwYjAxMTExMTE7DQorICBsZXQgSW5zdHs2LTR9ICAgPSAwYjEwMTsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMuDQorLy8NCisNCitkZWZtIEFERCAgOiBBc0kxX2Jpbl9pcnM8MGIwMTAwLCAiYWRkIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChhZGQgIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIDE+Ow0KK2RlZm0gU1VCICA6IEFzSTFfYmluX2lyczwwYjAwMTAsICJzdWIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KHN1YiAgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47DQorDQorLy8gQUREIGFuZCBTVUIgd2l0aCAncycgYml0IHNldC4NCitkZWZtIEFERFMgOiBBSTFfYmluX3NfaXJzPDBiMDEwMCwgImFkZHMiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChhZGRjIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIDE+Ow0KK2RlZm0gU1VCUyA6IEFJMV9iaW5fc19pcnM8MGIwMDEwLCAic3VicyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KHN1YmMgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47DQorDQorZGVmbSBBREMgOiBBSTFfYWRkZV9zdWJlX2lyczwwYjAxMDEsICJhZGMiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChhZGRlX2RlYWRfY2Fycnkgbm9kZTokTEhTLCBub2RlOiRSSFMpPiwgMT47DQorZGVmbSBTQkMgOiBBSTFfYWRkZV9zdWJlX2lyczwwYjAxMTAsICJzYmMiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChzdWJlX2RlYWRfY2Fycnkgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47DQorZGVmbSBBRENTIDogQUkxX2FkZGVfc3ViZV9zX2lyczwwYjAxMDEsICJhZGNzIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoYWRkZV9saXZlX2NhcnJ5IG5vZGU6JExIUywgbm9kZTokUkhTKT4sIDE+Ow0KK2RlZm0gU0JDUyA6IEFJMV9hZGRlX3N1YmVfc19pcnM8MGIwMTEwLCAic2JjcyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KHN1YmVfbGl2ZV9jYXJyeSBub2RlOiRMSFMsIG5vZGU6JFJIUykgPj47DQorDQorZGVmIFJTQnJpIDogQXNJMTwwYjAwMTEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIHNvX2ltbTokYiksIERQRnJtLA0KKyAgICAgICAgICAgICAgICAgSUlDX2lBTFVpLCAicnNiIiwgIlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoc3ViIHNvX2ltbTokYiwgR1BSOiRhKSldPiB7DQorICAgIGxldCBJbnN0ezI1fSA9IDE7DQorfQ0KKw0KKy8vIFRoZSByZWcvcmVnIGZvcm0gaXMgb25seSBkZWZpbmVkIGZvciB0aGUgZGlzYXNzZW1ibGVyOyBmb3IgY29kZWdlbiBpdCBpcw0KKy8vIGVxdWl2YWxlbnQgdG8gU1VCcnIuDQorZGVmIFJTQnJyIDogQXNJMTwwYjAwMTEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksIERQRnJtLA0KKyAgICAgICAgICAgICAgICAgSUlDX2lBTFVyLCAicnNiIiwgIlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgICBsZXQgSW5zdHsyNX0gPSAwOw0KKyAgICBsZXQgSW5zdHsxMS00fSA9IDBiMDAwMDAwMDA7DQorfQ0KKw0KK2RlZiBSU0JycyA6IEFzSTE8MGIwMDExLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBzb19yZWc6JGIpLCBEUFNvUmVnRnJtLA0KKyAgICAgICAgICAgICAgICAgSUlDX2lBTFVzciwgInJzYiIsICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKHN1YiBzb19yZWc6JGIsIEdQUjokYSkpXT4gew0KKyAgICBsZXQgSW5zdHsyNX0gPSAwOw0KK30NCisNCisvLyBSU0Igd2l0aCAncycgYml0IHNldC4NCitsZXQgRGVmcyA9IFtDUFNSXSBpbiB7DQorZGVmIFJTQlNyaSA6IEFJMTwwYjAwMTEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIHNvX2ltbTokYiksIERQRnJtLA0KKyAgICAgICAgICAgICAgICAgSUlDX2lBTFVpLCAicnNicyIsICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKHN1YmMgc29faW1tOiRiLCBHUFI6JGEpKV0+IHsNCisgICAgbGV0IEluc3R7MjB9ID0gMTsNCisgICAgbGV0IEluc3R7MjV9ID0gMTsNCit9DQorZGVmIFJTQlNycyA6IEFJMTwwYjAwMTEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIHNvX3JlZzokYiksIERQU29SZWdGcm0sDQorICAgICAgICAgICAgICAgICBJSUNfaUFMVXNyLCAicnNicyIsICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKHN1YmMgc29fcmVnOiRiLCBHUFI6JGEpKV0+IHsNCisgICAgbGV0IEluc3R7MjB9ID0gMTsNCisgICAgbGV0IEluc3R7MjV9ID0gMDsNCit9DQorfQ0KKw0KK2xldCBVc2VzID0gW0NQU1JdIGluIHsNCitkZWYgUlNDcmkgOiBBc0kxPDBiMDExMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgc29faW1tOiRiKSwNCisgICAgICAgICAgICAgICAgIERQRnJtLCBJSUNfaUFMVWksICJyc2MiLCAiXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChzdWJlX2RlYWRfY2Fycnkgc29faW1tOiRiLCBHUFI6JGEpKV0+LA0KKyAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNXT4gew0KKyAgICBsZXQgSW5zdHsyNX0gPSAxOw0KK30NCisvLyBUaGUgcmVnL3JlZyBmb3JtIGlzIG9ubHkgZGVmaW5lZCBmb3IgdGhlIGRpc2Fzc2VtYmxlcjsgZm9yIGNvZGVnZW4gaXQgaXMNCisvLyBlcXVpdmFsZW50IHRvIFNVQnJyLg0KK2RlZiBSU0NyciA6IEFzSTE8MGIwMTExLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgRFBGcm0sIElJQ19pQUxVciwgInJzYyIsICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsNCisgICAgbGV0IEluc3R7MjV9ID0gMDsNCisgICAgbGV0IEluc3R7MTEtNH0gPSAwYjAwMDAwMDAwOw0KK30NCitkZWYgUlNDcnMgOiBBc0kxPDBiMDExMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgc29fcmVnOiRiKSwNCisgICAgICAgICAgICAgICAgIERQU29SZWdGcm0sIElJQ19pQUxVc3IsICJyc2MiLCAiXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChzdWJlX2RlYWRfY2Fycnkgc29fcmVnOiRiLCBHUFI6JGEpKV0+LA0KKyAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNXT4gew0KKyAgICBsZXQgSW5zdHsyNX0gPSAwOw0KK30NCit9DQorDQorLy8gRklYTUU6IEFsbG93IHRoZXNlIHRvIGJlIHByZWRpY2F0ZWQuDQorbGV0IERlZnMgPSBbQ1BTUl0sIFVzZXMgPSBbQ1BTUl0gaW4gew0KK2RlZiBSU0NTcmkgOiBBWEkxPDBiMDExMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgc29faW1tOiRiKSwNCisgICAgICAgICAgICAgICAgICBEUEZybSwgSUlDX2lBTFVpLCAicnNjc1x0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKHN1YmVfZGVhZF9jYXJyeSBzb19pbW06JGIsIEdQUjokYSkpXT4sDQorICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNXT4gew0KKyAgICBsZXQgSW5zdHsyMH0gPSAxOw0KKyAgICBsZXQgSW5zdHsyNX0gPSAxOw0KK30NCitkZWYgUlNDU3JzIDogQVhJMTwwYjAxMTEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIHNvX3JlZzokYiksDQorICAgICAgICAgICAgICAgICAgRFBTb1JlZ0ZybSwgSUlDX2lBTFVzciwgInJzY3NcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChzdWJlX2RlYWRfY2Fycnkgc29fcmVnOiRiLCBHUFI6JGEpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTV0+IHsNCisgICAgbGV0IEluc3R7MjB9ID0gMTsNCisgICAgbGV0IEluc3R7MjV9ID0gMDsNCit9DQorfQ0KKw0KKy8vIChzdWIgWCwgaW1tKSBnZXRzIGNhbm9uaWNhbGl6ZWQgdG8gKGFkZCBYLCAtaW1tKS4gIE1hdGNoIHRoaXMgZm9ybS4NCisvLyBUaGUgYXNzdW1lLW5vLWNhcnJ5LWluIGZvcm0gdXNlcyB0aGUgbmVnYXRpb24gb2YgdGhlIGlucHV0IHNpbmNlIGFkZC9zdWINCisvLyBhc3N1bWUgb3Bwb3NpdGUgbWVhbmluZ3Mgb2YgdGhlIGNhcnJ5IGZsYWcgKGkuZS4sIGNhcnJ5ID09ICFib3Jyb3cpLg0KKy8vIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBBZGRXaXRoQ2FycnkoKSBpbiB0aGUgQVJNIEFSTSBBMi4yLjEgZm9yIHRoZSBnb3J5DQorLy8gZGV0YWlscy4NCitkZWYgOiBBUk1QYXQ8KGFkZCAgICBHUFI6JHNyYywgc29faW1tX25lZzokaW1tKSwNCisgICAgICAgICAgICAgKFNVQnJpICBHUFI6JHNyYywgc29faW1tX25lZzokaW1tKT47DQorZGVmIDogQVJNUGF0PChhZGRjICAgR1BSOiRzcmMsIHNvX2ltbV9uZWc6JGltbSksDQorICAgICAgICAgICAgIChTVUJTcmkgR1BSOiRzcmMsIHNvX2ltbV9uZWc6JGltbSk+Ow0KKy8vIFRoZSB3aXRoLWNhcnJ5LWluIGZvcm0gbWF0Y2hlcyBiaXR3aXNlIG5vdCBpbnN0ZWFkIG9mIHRoZSBuZWdhdGlvbi4NCisvLyBFZmZlY3RpdmVseSwgdGhlIGludmVyc2UgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNhcnJ5IGZsYWcgYWxyZWFkeSBhY2NvdW50cw0KKy8vIGZvciBwYXJ0IG9mIHRoZSBuZWdhdGlvbi4NCitkZWYgOiBBUk1QYXQ8KGFkZGUgICBHUFI6JHNyYywgc29faW1tX25vdDokaW1tKSwNCisgICAgICAgICAgICAgKFNCQ3JpICBHUFI6JHNyYywgc29faW1tX25vdDokaW1tKT47DQorDQorLy8gTm90ZTogVGhlc2UgYXJlIGltcGxlbWVudGVkIGluIEMrKyBjb2RlLCBiZWNhdXNlIHRoZXkgaGF2ZSB0byBnZW5lcmF0ZQ0KKy8vIEFERC9TVUJycyBpbnN0cnVjdGlvbnMsIHdoaWNoIHVzZSBhIGNvbXBsZXggcGF0dGVybiB0aGF0IGEgeGZvcm0gZnVuY3Rpb24NCisvLyBjYW5ub3QgcHJvZHVjZS4NCisvLyAobXVsIFgsIDJebisxKSAtPiAoYWRkIChYIDw8IG4pLCBYKQ0KKy8vIChtdWwgWCwgMl5uLTEpIC0+IChyc2IgWCwgKFggPDwgbikpDQorDQorLy8gQVJNIEFyaXRobWV0aWMgSW5zdHJ1Y3Rpb24gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkNCisvLyBHUFI6JGRzdCA9IEdQUjokYSBvcCBHUFI6JGINCitjbGFzcyBBQUk8Yml0czw4PiBvcDI3XzIwLCBiaXRzPDQ+IG9wN180LCBzdHJpbmcgb3BjLA0KKyAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybiA9IFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4NCisgIDogQUk8KG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgR1BSOiRiKSwgRFBGcm0sIElJQ19pQUxVciwNCisgICAgICAgb3BjLCAiXHQkZHN0LCAkYSwgJGIiLCBwYXR0ZXJuPiB7DQorICBsZXQgSW5zdHsyNy0yMH0gPSBvcDI3XzIwOw0KKyAgbGV0IEluc3R7Ny00fSA9IG9wN180Ow0KK30NCisNCisvLyBTYXR1cmF0aW5nIGFkZC9zdWJ0cmFjdCAtLSBmb3IgZGlzYXNzZW1ibHkgb25seQ0KKw0KK2RlZiBRQUREICAgIDogQUFJPDBiMDAwMTAwMDAsIDBiMDEwMSwgInFhZGQiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoaW50X2FybV9xYWRkIEdQUjokYSwgR1BSOiRiKSldPjsNCitkZWYgUUFERDE2ICA6IEFBSTwwYjAxMTAwMDEwLCAwYjAwMDEsICJxYWRkMTYiPjsNCitkZWYgUUFERDggICA6IEFBSTwwYjAxMTAwMDEwLCAwYjEwMDEsICJxYWRkOCI+Ow0KK2RlZiBRQVNYICAgIDogQUFJPDBiMDExMDAwMTAsIDBiMDAxMSwgInFhc3giPjsNCitkZWYgUURBREQgICA6IEFBSTwwYjAwMDEwMTAwLCAwYjAxMDEsICJxZGFkZCI+Ow0KK2RlZiBRRFNVQiAgIDogQUFJPDBiMDAwMTAxMTAsIDBiMDEwMSwgInFkc3ViIj47DQorZGVmIFFTQVggICAgOiBBQUk8MGIwMTEwMDAxMCwgMGIwMTAxLCAicXNheCI+Ow0KK2RlZiBRU1VCICAgIDogQUFJPDBiMDAwMTAwMTAsIDBiMDEwMSwgInFzdWIiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoaW50X2FybV9xc3ViIEdQUjokYSwgR1BSOiRiKSldPjsNCitkZWYgUVNVQjE2ICA6IEFBSTwwYjAxMTAwMDEwLCAwYjAxMTEsICJxc3ViMTYiPjsNCitkZWYgUVNVQjggICA6IEFBSTwwYjAxMTAwMDEwLCAwYjExMTEsICJxc3ViOCI+Ow0KK2RlZiBVUUFERDE2IDogQUFJPDBiMDExMDAxMTAsIDBiMDAwMSwgInVxYWRkMTYiPjsNCitkZWYgVVFBREQ4ICA6IEFBSTwwYjAxMTAwMTEwLCAwYjEwMDEsICJ1cWFkZDgiPjsNCitkZWYgVVFBU1ggICA6IEFBSTwwYjAxMTAwMTEwLCAwYjAwMTEsICJ1cWFzeCI+Ow0KK2RlZiBVUVNBWCAgIDogQUFJPDBiMDExMDAxMTAsIDBiMDEwMSwgInVxc2F4Ij47DQorZGVmIFVRU1VCMTYgOiBBQUk8MGIwMTEwMDExMCwgMGIwMTExLCAidXFzdWIxNiI+Ow0KK2RlZiBVUVNVQjggIDogQUFJPDBiMDExMDAxMTAsIDBiMTExMSwgInVxc3ViOCI+Ow0KKw0KKy8vIFNpZ25lZC9VbnNpZ25lZCBhZGQvc3VidHJhY3QgLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkNCisNCitkZWYgU0FTWCAgIDogQUFJPDBiMDExMDAwMDEsIDBiMDAxMSwgInNhc3giPjsNCitkZWYgU0FERDE2IDogQUFJPDBiMDExMDAwMDEsIDBiMDAwMSwgInNhZGQxNiI+Ow0KK2RlZiBTQUREOCAgOiBBQUk8MGIwMTEwMDAwMSwgMGIxMDAxLCAic2FkZDgiPjsNCitkZWYgU1NBWCAgIDogQUFJPDBiMDExMDAwMDEsIDBiMDEwMSwgInNzYXgiPjsNCitkZWYgU1NVQjE2IDogQUFJPDBiMDExMDAwMDEsIDBiMDExMSwgInNzdWIxNiI+Ow0KK2RlZiBTU1VCOCAgOiBBQUk8MGIwMTEwMDAwMSwgMGIxMTExLCAic3N1YjgiPjsNCitkZWYgVUFTWCAgIDogQUFJPDBiMDExMDAxMDEsIDBiMDAxMSwgInVhc3giPjsNCitkZWYgVUFERDE2IDogQUFJPDBiMDExMDAxMDEsIDBiMDAwMSwgInVhZGQxNiI+Ow0KK2RlZiBVQUREOCAgOiBBQUk8MGIwMTEwMDEwMSwgMGIxMDAxLCAidWFkZDgiPjsNCitkZWYgVVNBWCAgIDogQUFJPDBiMDExMDAxMDEsIDBiMDEwMSwgInVzYXgiPjsNCitkZWYgVVNVQjE2IDogQUFJPDBiMDExMDAxMDEsIDBiMDExMSwgInVzdWIxNiI+Ow0KK2RlZiBVU1VCOCAgOiBBQUk8MGIwMTEwMDEwMSwgMGIxMTExLCAidXN1YjgiPjsNCisNCisvLyBTaWduZWQvVW5zaWduZWQgaGFsdmluZyBhZGQvc3VidHJhY3QgLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkNCisNCitkZWYgU0hBU1ggICA6IEFBSTwwYjAxMTAwMDExLCAwYjAwMTEsICJzaGFzeCI+Ow0KK2RlZiBTSEFERDE2IDogQUFJPDBiMDExMDAwMTEsIDBiMDAwMSwgInNoYWRkMTYiPjsNCitkZWYgU0hBREQ4ICA6IEFBSTwwYjAxMTAwMDExLCAwYjEwMDEsICJzaGFkZDgiPjsNCitkZWYgU0hTQVggICA6IEFBSTwwYjAxMTAwMDExLCAwYjAxMDEsICJzaHNheCI+Ow0KK2RlZiBTSFNVQjE2IDogQUFJPDBiMDExMDAwMTEsIDBiMDExMSwgInNoc3ViMTYiPjsNCitkZWYgU0hTVUI4ICA6IEFBSTwwYjAxMTAwMDExLCAwYjExMTEsICJzaHN1YjgiPjsNCitkZWYgVUhBU1ggICA6IEFBSTwwYjAxMTAwMTExLCAwYjAwMTEsICJ1aGFzeCI+Ow0KK2RlZiBVSEFERDE2IDogQUFJPDBiMDExMDAxMTEsIDBiMDAwMSwgInVoYWRkMTYiPjsNCitkZWYgVUhBREQ4ICA6IEFBSTwwYjAxMTAwMTExLCAwYjEwMDEsICJ1aGFkZDgiPjsNCitkZWYgVUhTQVggICA6IEFBSTwwYjAxMTAwMTExLCAwYjAxMDEsICJ1aHNheCI+Ow0KK2RlZiBVSFNVQjE2IDogQUFJPDBiMDExMDAxMTEsIDBiMDExMSwgInVoc3ViMTYiPjsNCitkZWYgVUhTVUI4ICA6IEFBSTwwYjAxMTAwMTExLCAwYjExMTEsICJ1aHN1YjgiPjsNCisNCisvLyBVbnNpZ25lZCBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZXMgW2FuZCBBY2N1bXVsYXRlXSAtLSBmb3IgZGlzYXNzZW1ibHkgb25seQ0KKw0KK2RlZiBVU0FEOCAgOiBBSTwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIpLA0KKyAgICAgICAgICAgICAgICBNdWxGcm0gLyogZm9yIGNvbnZlbmllbmNlICovLCBOb0l0aW5lcmFyeSwgInVzYWQ4IiwNCisgICAgICAgICAgICAgICAgIlx0JGRzdCwgJGEsICRiIiwgW10+LA0KKyAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2XT4gew0KKyAgbGV0IEluc3R7MjctMjB9ID0gMGIwMTExMTAwMDsNCisgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsNCisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDE7DQorfQ0KK2RlZiBVU0FEQTggOiBBSTwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIsIEdQUjokYWNjKSwNCisgICAgICAgICAgICAgICAgTXVsRnJtIC8qIGZvciBjb252ZW5pZW5jZSAqLywgTm9JdGluZXJhcnksICJ1c2FkYTgiLA0KKyAgICAgICAgICAgICAgICAiXHQkZHN0LCAkYSwgJGIsICRhY2MiLCBbXT4sDQorICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZdPiB7DQorICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAxMTExMDAwOw0KKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMTsNCit9DQorDQorLy8gU2lnbmVkL1Vuc2lnbmVkIHNhdHVyYXRlIC0tIGZvciBkaXNhc3NlbWJseSBvbmx5DQorDQorZGVmIFNTQVRsc2wgOiBBSTwob3V0cyBHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRiaXRfcG9zLCBHUFI6JGEsIGkzMmltbTokc2hhbXQpLA0KKyAgICAgICAgICAgICAgICAgU2F0RnJtLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICJzc2F0IiwgIlx0JGRzdCwgJGJpdF9wb3MsICRhLCBsc2wgJHNoYW10IiwNCisgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MjctMjF9ID0gMGIwMTEwMTAxOw0KKyAgbGV0IEluc3R7Ni00fSA9IDBiMDAxOw0KK30NCisNCitkZWYgU1NBVGFzciA6IEFJPChvdXRzIEdQUjokZHN0KSwgKGlucyBpMzJpbW06JGJpdF9wb3MsIEdQUjokYSwgaTMyaW1tOiRzaGFtdCksDQorICAgICAgICAgICAgICAgICBTYXRGcm0sIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgICAgInNzYXQiLCAiXHQkZHN0LCAkYml0X3BvcywgJGEsIGFzciAkc2hhbXQiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyNy0yMX0gPSAwYjAxMTAxMDE7DQorICBsZXQgSW5zdHs2LTR9ID0gMGIxMDE7DQorfQ0KKw0KK2RlZiBTU0FUMTYgOiBBSTwob3V0cyBHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRiaXRfcG9zLCBHUFI6JGEpLCBTYXRGcm0sDQorICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAic3NhdDE2IiwgIlx0JGRzdCwgJGJpdF9wb3MsICRhIiwNCisgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAxMTAxMDEwOw0KKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAxMTsNCit9DQorDQorZGVmIFVTQVRsc2wgOiBBSTwob3V0cyBHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRiaXRfcG9zLCBHUFI6JGEsIGkzMmltbTokc2hhbXQpLA0KKyAgICAgICAgICAgICAgICAgU2F0RnJtLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICJ1c2F0IiwgIlx0JGRzdCwgJGJpdF9wb3MsICRhLCBsc2wgJHNoYW10IiwNCisgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MjctMjF9ID0gMGIwMTEwMTExOw0KKyAgbGV0IEluc3R7Ni00fSA9IDBiMDAxOw0KK30NCisNCitkZWYgVVNBVGFzciA6IEFJPChvdXRzIEdQUjokZHN0KSwgKGlucyBpMzJpbW06JGJpdF9wb3MsIEdQUjokYSwgaTMyaW1tOiRzaGFtdCksDQorICAgICAgICAgICAgICAgICBTYXRGcm0sIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgICAgInVzYXQiLCAiXHQkZHN0LCAkYml0X3BvcywgJGEsIGFzciAkc2hhbXQiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyNy0yMX0gPSAwYjAxMTAxMTE7DQorICBsZXQgSW5zdHs2LTR9ID0gMGIxMDE7DQorfQ0KKw0KK2RlZiBVU0FUMTYgOiBBSTwob3V0cyBHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRiaXRfcG9zLCBHUFI6JGEpLCBTYXRGcm0sDQorICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAidXNhdDE2IiwgIlx0JGRzdCwgJGJpdF9wb3MsICRhIiwNCisgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyNy0yMH0gPSAwYjAxMTAxMTEwOw0KKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAxMTsNCit9DQorDQorZGVmIDogQVJNVjZQYXQ8KGludF9hcm1fc3NhdCBHUFI6JGEsIGltbTokcG9zKSwgKFNTQVRsc2wgaW1tOiRwb3MsIEdQUjokYSwgMCk+Ow0KK2RlZiA6IEFSTVY2UGF0PChpbnRfYXJtX3VzYXQgR1BSOiRhLCBpbW06JHBvcyksIChVU0FUbHNsIGltbTokcG9zLCBHUFI6JGEsIDApPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBCaXR3aXNlIEluc3RydWN0aW9ucy4NCisvLw0KKw0KK2RlZm0gQU5EICAgOiBBc0kxX2Jpbl9pcnM8MGIwMDAwLCAiYW5kIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoYW5kIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIDE+Ow0KK2RlZm0gT1JSICAgOiBBc0kxX2Jpbl9pcnM8MGIxMTAwLCAib3JyIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwob3IgIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIDE+Ow0KK2RlZm0gRU9SICAgOiBBc0kxX2Jpbl9pcnM8MGIwMDAxLCAiZW9yIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoeG9yIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIDE+Ow0KK2RlZm0gQklDICAgOiBBc0kxX2Jpbl9pcnM8MGIxMTEwLCAiYmljIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoYW5kIG5vZGU6JExIUywgKG5vdCBub2RlOiRSSFMpKT4+Ow0KKw0KK2RlZiBCRkMgICAgOiBJPChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYywgYmZfaW52X21hc2tfaW1tOiRpbW0pLA0KKyAgICAgICAgICAgICAgIEFkZHJNb2RlMSwgU2l6ZTRCeXRlcywgSW5kZXhNb2RlTm9uZSwgRFBGcm0sIElJQ19pVU5Bc2ksDQorICAgICAgICAgICAgICAgImJmYyIsICJcdCRkc3QsICRpbW0iLCAiJHNyYyA9ICRkc3QiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoYW5kIEdQUjokc3JjLCBiZl9pbnZfbWFza19pbW06JGltbSkpXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNlQyXT4gew0KKyAgbGV0IEluc3R7MjctMjF9ID0gMGIwMTExMTEwOw0KKyAgbGV0IEluc3R7Ni0wfSAgID0gMGIwMDExMTExOw0KK30NCisNCisvLyBBOC42LjE4ICBCRkkgLSBCaXRmaWVsZCBpbnNlcnQgKEVuY29kaW5nIEExKQ0KK2RlZiBCRkkgICAgOiBJPChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYywgR1BSOiR2YWwsIGJmX2ludl9tYXNrX2ltbTokaW1tKSwNCisgICAgICAgICAgICAgICBBZGRyTW9kZTEsIFNpemU0Qnl0ZXMsIEluZGV4TW9kZU5vbmUsIERQRnJtLCBJSUNfaVVOQXNpLA0KKyAgICAgICAgICAgICAgICJiZmkiLCAiXHQkZHN0LCAkdmFsLCAkaW1tIiwgIiRzcmMgPSAkZHN0IiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKEFSTWJmaSBHUFI6JHNyYywgR1BSOiR2YWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZl9pbnZfbWFza19pbW06JGltbSkpXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNlQyXT4gew0KKyAgbGV0IEluc3R7MjctMjF9ID0gMGIwMTExMTEwOw0KKyAgbGV0IEluc3R7Ni00fSAgID0gMGIwMDE7IC8vIFJuOiBJbnN0ezMtMH0gIT0gMTUNCit9DQorDQorZGVmICBNVk5yICA6IEFzSTE8MGIxMTExLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRzcmMpLCBEUEZybSwgSUlDX2lNT1ZyLA0KKyAgICAgICAgICAgICAgICAgICJtdm4iLCAiXHQkZHN0LCAkc3JjIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG5vdCBHUFI6JHNyYykpXT4sIFVuYXJ5RFAgew0KKyAgbGV0IEluc3R7MjV9ID0gMDsNCisgIGxldCBJbnN0ezExLTR9ID0gMGIwMDAwMDAwMDsNCit9DQorZGVmICBNVk5zICA6IEFzSTE8MGIxMTExLCAob3V0cyBHUFI6JGRzdCksIChpbnMgc29fcmVnOiRzcmMpLCBEUFNvUmVnRnJtLA0KKyAgICAgICAgICAgICAgICAgIElJQ19pTU9Wc3IsICJtdm4iLCAiXHQkZHN0LCAkc3JjIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG5vdCBzb19yZWc6JHNyYykpXT4sIFVuYXJ5RFAgew0KKyAgbGV0IEluc3R7MjV9ID0gMDsNCit9DQorbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEsIGlzQXNDaGVhcEFzQU1vdmUgPSAxIGluDQorZGVmICBNVk5pICA6IEFzSTE8MGIxMTExLCAob3V0cyBHUFI6JGRzdCksIChpbnMgc29faW1tOiRpbW0pLCBEUEZybSwNCisgICAgICAgICAgICAgICAgICBJSUNfaU1PVmksICJtdm4iLCAiXHQkZHN0LCAkaW1tIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgc29faW1tX25vdDokaW1tKV0+LFVuYXJ5RFAgew0KKyAgICBsZXQgSW5zdHsyNX0gPSAxOw0KK30NCisNCitkZWYgOiBBUk1QYXQ8KGFuZCAgIEdQUjokc3JjLCBzb19pbW1fbm90OiRpbW0pLA0KKyAgICAgICAgICAgICAoQklDcmkgR1BSOiRzcmMsIHNvX2ltbV9ub3Q6JGltbSk+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIE11bHRpcGx5IEluc3RydWN0aW9ucy4NCisvLw0KKw0KK2xldCBpc0NvbW11dGFibGUgPSAxIGluDQorZGVmIE1VTCAgIDogQXNNdWwxSTwwYjAwMDAwMDAsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksDQorICAgICAgICAgICAgICAgICAgIElJQ19pTVVMMzIsICJtdWwiLCAiXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG11bCBHUFI6JGEsIEdQUjokYikpXT47DQorDQorZGVmIE1MQSAgIDogQXNNdWwxSTwwYjAwMDAwMDEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiwgR1BSOiRjKSwNCisgICAgICAgICAgICAgICAgICAgIElJQ19pTUFDMzIsICJtbGEiLCAiXHQkZHN0LCAkYSwgJGIsICRjIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChhZGQgKG11bCBHUFI6JGEsIEdQUjokYiksIEdQUjokYykpXT47DQorDQorZGVmIE1MUyAgIDogQU11bDFJPDBiMDAwMDAxMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgR1BSOiRiLCBHUFI6JGMpLA0KKyAgICAgICAgICAgICAgICAgICBJSUNfaU1BQzMyLCAibWxzIiwgIlx0JGRzdCwgJGEsICRiLCAkYyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoc3ViIEdQUjokYywgKG11bCBHUFI6JGEsIEdQUjokYikpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2VDJdPjsNCisNCisvLyBFeHRyYSBwcmVjaXNpb24gbXVsdGlwbGllcyB3aXRoIGxvdyAvIGhpZ2ggcmVzdWx0cw0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4gew0KK2RlZiBTTVVMTCA6IEFzTXVsMUk8MGIwMDAwMTEwLCAob3V0cyBHUFI6JGxkc3QsIEdQUjokaGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRhLCBHUFI6JGIpLCBJSUNfaU1VTDY0LA0KKyAgICAgICAgICAgICAgICAgICAgInNtdWxsIiwgIlx0JGxkc3QsICRoZHN0LCAkYSwgJGIiLCBbXT47DQorDQorZGVmIFVNVUxMIDogQXNNdWwxSTwwYjAwMDAxMDAsIChvdXRzIEdQUjokbGRzdCwgR1BSOiRoZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JGEsIEdQUjokYiksIElJQ19pTVVMNjQsDQorICAgICAgICAgICAgICAgICAgICAidW11bGwiLCAiXHQkbGRzdCwgJGhkc3QsICRhLCAkYiIsIFtdPjsNCit9DQorDQorLy8gTXVsdGlwbHkgKyBhY2N1bXVsYXRlDQorZGVmIFNNTEFMIDogQXNNdWwxSTwwYjAwMDAxMTEsIChvdXRzIEdQUjokbGRzdCwgR1BSOiRoZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JGEsIEdQUjokYiksIElJQ19pTUFDNjQsDQorICAgICAgICAgICAgICAgICAgICAic21sYWwiLCAiXHQkbGRzdCwgJGhkc3QsICRhLCAkYiIsIFtdPjsNCisNCitkZWYgVU1MQUwgOiBBc011bDFJPDBiMDAwMDEwMSwgKG91dHMgR1BSOiRsZHN0LCBHUFI6JGhkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokYSwgR1BSOiRiKSwgSUlDX2lNQUM2NCwNCisgICAgICAgICAgICAgICAgICAgICJ1bWxhbCIsICJcdCRsZHN0LCAkaGRzdCwgJGEsICRiIiwgW10+Ow0KKw0KK2RlZiBVTUFBTCA6IEFNdWwxSSA8MGIwMDAwMDEwLCAob3V0cyBHUFI6JGxkc3QsIEdQUjokaGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRhLCBHUFI6JGIpLCBJSUNfaU1BQzY0LA0KKyAgICAgICAgICAgICAgICAgICAgInVtYWFsIiwgIlx0JGxkc3QsICRoZHN0LCAkYSwgJGIiLCBbXT4sDQorICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2XT47DQorfSAvLyBuZXZlckhhc1NpZGVFZmZlY3RzDQorDQorLy8gTW9zdCBzaWduaWZpY2FudCB3b3JkIG11bHRpcGx5DQorZGVmIFNNTVVMIDogQU11bDJJIDwwYjAxMTEwMTAsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksDQorICAgICAgICAgICAgICAgSUlDX2lNVUwzMiwgInNtbXVsIiwgIlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG11bGhzIEdQUjokYSwgR1BSOiRiKSldPiwNCisgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2XT4gew0KKyAgbGV0IEluc3R7Ny00fSAgID0gMGIwMDAxOw0KKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOw0KK30NCisNCitkZWYgU01NVUxSIDogQU11bDJJIDwwYjAxMTEwMTAsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksDQorICAgICAgICAgICAgICAgSUlDX2lNVUwzMiwgInNtbXVsciIsICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2XT4gew0KKyAgbGV0IEluc3R7Ny00fSAgID0gMGIwMDExOyAvLyBSID0gMQ0KKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOw0KK30NCisNCitkZWYgU01NTEEgOiBBTXVsMkkgPDBiMDExMTAxMCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgR1BSOiRiLCBHUFI6JGMpLA0KKyAgICAgICAgICAgICAgIElJQ19pTUFDMzIsICJzbW1sYSIsICJcdCRkc3QsICRhLCAkYiwgJGMiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoYWRkIChtdWxocyBHUFI6JGEsIEdQUjokYiksIEdQUjokYykpXT4sDQorICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNl0+IHsNCisgIGxldCBJbnN0ezctNH0gICA9IDBiMDAwMTsNCit9DQorDQorZGVmIFNNTUxBUiA6IEFNdWwySSA8MGIwMTExMDEwLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIsIEdQUjokYyksDQorICAgICAgICAgICAgICAgSUlDX2lNQUMzMiwgInNtbWxhciIsICJcdCRkc3QsICRhLCAkYiwgJGMiLA0KKyAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4sDQorICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNl0+IHsNCisgIGxldCBJbnN0ezctNH0gICA9IDBiMDAxMTsgLy8gUiA9IDENCit9DQorDQorZGVmIFNNTUxTIDogQU11bDJJIDwwYjAxMTEwMTAsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiwgR1BSOiRjKSwNCisgICAgICAgICAgICAgICBJSUNfaU1BQzMyLCAic21tbHMiLCAiXHQkZHN0LCAkYSwgJGIsICRjIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKHN1YiBHUFI6JGMsIChtdWxocyBHUFI6JGEsIEdQUjokYikpKV0+LA0KKyAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZdPiB7DQorICBsZXQgSW5zdHs3LTR9ICAgPSAwYjExMDE7DQorfQ0KKw0KK2RlZiBTTU1MU1IgOiBBTXVsMkkgPDBiMDExMTAxMCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgR1BSOiRiLCBHUFI6JGMpLA0KKyAgICAgICAgICAgICAgIElJQ19pTUFDMzIsICJzbW1sc3IiLCAiXHQkZHN0LCAkYSwgJGIsICRjIiwNCisgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZdPiB7DQorICBsZXQgSW5zdHs3LTR9ICAgPSAwYjExMTE7IC8vIFIgPSAxDQorfQ0KKw0KK211bHRpY2xhc3MgQUlfc211bDxzdHJpbmcgb3BjLCBQYXRGcmFnIG9wbm9kZT4gew0KKyAgZGVmIEJCIDogQU11bHh5STwwYjAwMDEwMTEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksDQorICAgICAgICAgICAgICBJSUNfaU1VTDMyLCAhc3RyY29uY2F0KG9wYywgImJiIiksICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG9wbm9kZSAoc2V4dF9pbnJlZyBHUFI6JGEsIGkxNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V4dF9pbnJlZyBHUFI6JGIsIGkxNikpKV0+LA0KKyAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVRFXT4gew0KKyAgICAgICAgICAgICBsZXQgSW5zdHs1fSA9IDA7DQorICAgICAgICAgICAgIGxldCBJbnN0ezZ9ID0gMDsNCisgICAgICAgICAgIH0NCisNCisgIGRlZiBCVCA6IEFNdWx4eUk8MGIwMDAxMDExLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIpLA0KKyAgICAgICAgICAgICAgSUlDX2lNVUwzMiwgIXN0cmNvbmNhdChvcGMsICJidCIpLCAiXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChvcG5vZGUgKHNleHRfaW5yZWcgR1BSOiRhLCBpMTYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyYSBHUFI6JGIsIChpMzIgMTYpKSkpXT4sDQorICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y1VEVdPiB7DQorICAgICAgICAgICAgIGxldCBJbnN0ezV9ID0gMDsNCisgICAgICAgICAgICAgbGV0IEluc3R7Nn0gPSAxOw0KKyAgICAgICAgICAgfQ0KKw0KKyAgZGVmIFRCIDogQU11bHh5STwwYjAwMDEwMTEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksDQorICAgICAgICAgICAgICBJSUNfaU1VTDMyLCAhc3RyY29uY2F0KG9wYywgInRiIiksICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG9wbm9kZSAoc3JhIEdQUjokYSwgKGkzMiAxNikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNleHRfaW5yZWcgR1BSOiRiLCBpMTYpKSldPiwNCisgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjVURV0+IHsNCisgICAgICAgICAgICAgbGV0IEluc3R7NX0gPSAxOw0KKyAgICAgICAgICAgICBsZXQgSW5zdHs2fSA9IDA7DQorICAgICAgICAgICB9DQorDQorICBkZWYgVFQgOiBBTXVseHlJPDBiMDAwMTAxMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgR1BSOiRiKSwNCisgICAgICAgICAgICAgIElJQ19pTVVMMzIsICFzdHJjb25jYXQob3BjLCAidHQiKSwgIlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIChzcmEgR1BSOiRhLCAoaTMyIDE2KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JhIEdQUjokYiwgKGkzMiAxNikpKSldPiwNCisgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y1VEVdPiB7DQorICAgICAgICAgICAgIGxldCBJbnN0ezV9ID0gMTsNCisgICAgICAgICAgICAgbGV0IEluc3R7Nn0gPSAxOw0KKyAgICAgICAgICAgfQ0KKw0KKyAgZGVmIFdCIDogQU11bHh5STwwYjAwMDEwMDEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksDQorICAgICAgICAgICAgICBJSUNfaU1VTDE2LCAhc3RyY29uY2F0KG9wYywgIndiIiksICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKHNyYSAob3Bub2RlIEdQUjokYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V4dF9pbnJlZyBHUFI6JGIsIGkxNikpLCAoaTMyIDE2KSkpXT4sDQorICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y1VEVdPiB7DQorICAgICAgICAgICAgIGxldCBJbnN0ezV9ID0gMTsNCisgICAgICAgICAgICAgbGV0IEluc3R7Nn0gPSAwOw0KKyAgICAgICAgICAgfQ0KKw0KKyAgZGVmIFdUIDogQU11bHh5STwwYjAwMDEwMDEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksDQorICAgICAgICAgICAgICBJSUNfaU1VTDE2LCAhc3RyY29uY2F0KG9wYywgInd0IiksICJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKHNyYSAob3Bub2RlIEdQUjokYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JhIEdQUjokYiwgKGkzMiAxNikpKSwgKGkzMiAxNikpKV0+LA0KKyAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjVURV0+IHsNCisgICAgICAgICAgICAgbGV0IEluc3R7NX0gPSAxOw0KKyAgICAgICAgICAgICBsZXQgSW5zdHs2fSA9IDE7DQorICAgICAgICAgICB9DQorfQ0KKw0KKw0KK211bHRpY2xhc3MgQUlfc21sYTxzdHJpbmcgb3BjLCBQYXRGcmFnIG9wbm9kZT4gew0KKyAgZGVmIEJCIDogQU11bHh5STwwYjAwMDEwMDAsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiwgR1BSOiRhY2MpLA0KKyAgICAgICAgICAgICAgSUlDX2lNQUMxNiwgIXN0cmNvbmNhdChvcGMsICJiYiIpLCAiXHQkZHN0LCAkYSwgJGIsICRhY2MiLA0KKyAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChhZGQgR1BSOiRhY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcG5vZGUgKHNleHRfaW5yZWcgR1BSOiRhLCBpMTYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXh0X2lucmVnIEdQUjokYiwgaTE2KSkpKV0+LA0KKyAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVRFXT4gew0KKyAgICAgICAgICAgICBsZXQgSW5zdHs1fSA9IDA7DQorICAgICAgICAgICAgIGxldCBJbnN0ezZ9ID0gMDsNCisgICAgICAgICAgIH0NCisNCisgIGRlZiBCVCA6IEFNdWx4eUk8MGIwMDAxMDAwLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIsIEdQUjokYWNjKSwNCisgICAgICAgICAgICAgIElJQ19pTUFDMTYsICFzdHJjb25jYXQob3BjLCAiYnQiKSwgIlx0JGRzdCwgJGEsICRiLCAkYWNjIiwNCisgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoYWRkIEdQUjokYWNjLCAob3Bub2RlIChzZXh0X2lucmVnIEdQUjokYSwgaTE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyYSBHUFI6JGIsIChpMzIgMTYpKSkpKV0+LA0KKyAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVRFXT4gew0KKyAgICAgICAgICAgICBsZXQgSW5zdHs1fSA9IDA7DQorICAgICAgICAgICAgIGxldCBJbnN0ezZ9ID0gMTsNCisgICAgICAgICAgIH0NCisNCisgIGRlZiBUQiA6IEFNdWx4eUk8MGIwMDAxMDAwLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIsIEdQUjokYWNjKSwNCisgICAgICAgICAgICAgIElJQ19pTUFDMTYsICFzdHJjb25jYXQob3BjLCAidGIiKSwgIlx0JGRzdCwgJGEsICRiLCAkYWNjIiwNCisgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoYWRkIEdQUjokYWNjLCAob3Bub2RlIChzcmEgR1BSOiRhLCAoaTMyIDE2KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXh0X2lucmVnIEdQUjokYiwgaTE2KSkpKV0+LA0KKyAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVRFXT4gew0KKyAgICAgICAgICAgICBsZXQgSW5zdHs1fSA9IDE7DQorICAgICAgICAgICAgIGxldCBJbnN0ezZ9ID0gMDsNCisgICAgICAgICAgIH0NCisNCisgIGRlZiBUVCA6IEFNdWx4eUk8MGIwMDAxMDAwLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIsIEdQUjokYWNjKSwNCisgICAgICAgICAgICAgIElJQ19pTUFDMTYsICFzdHJjb25jYXQob3BjLCAidHQiKSwgIlx0JGRzdCwgJGEsICRiLCAkYWNjIiwNCisgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChhZGQgR1BSOiRhY2MsIChvcG5vZGUgKHNyYSBHUFI6JGEsIChpMzIgMTYpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyYSBHUFI6JGIsIChpMzIgMTYpKSkpKV0+LA0KKyAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjVURV0+IHsNCisgICAgICAgICAgICAgbGV0IEluc3R7NX0gPSAxOw0KKyAgICAgICAgICAgICBsZXQgSW5zdHs2fSA9IDE7DQorICAgICAgICAgICB9DQorDQorICBkZWYgV0IgOiBBTXVseHlJPDBiMDAwMTAwMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgR1BSOiRiLCBHUFI6JGFjYyksDQorICAgICAgICAgICAgICBJSUNfaU1BQzE2LCAhc3RyY29uY2F0KG9wYywgIndiIiksICJcdCRkc3QsICRhLCAkYiwgJGFjYyIsDQorICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKGFkZCBHUFI6JGFjYywgKHNyYSAob3Bub2RlIEdQUjokYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V4dF9pbnJlZyBHUFI6JGIsIGkxNikpLCAoaTMyIDE2KSkpKV0+LA0KKyAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVRFXT4gew0KKyAgICAgICAgICAgICBsZXQgSW5zdHs1fSA9IDA7DQorICAgICAgICAgICAgIGxldCBJbnN0ezZ9ID0gMDsNCisgICAgICAgICAgIH0NCisNCisgIGRlZiBXVCA6IEFNdWx4eUk8MGIwMDAxMDAxLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIsIEdQUjokYWNjKSwNCisgICAgICAgICAgICAgIElJQ19pTUFDMTYsICFzdHJjb25jYXQob3BjLCAid3QiKSwgIlx0JGRzdCwgJGEsICRiLCAkYWNjIiwNCisgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoYWRkIEdQUjokYWNjLCAoc3JhIChvcG5vZGUgR1BSOiRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyYSBHUFI6JGIsIChpMzIgMTYpKSksIChpMzIgMTYpKSkpXT4sDQorICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVRFXT4gew0KKyAgICAgICAgICAgICBsZXQgSW5zdHs1fSA9IDA7DQorICAgICAgICAgICAgIGxldCBJbnN0ezZ9ID0gMTsNCisgICAgICAgICAgIH0NCit9DQorDQorZGVmbSBTTVVMIDogQUlfc211bDwic211bCIsIEJpbk9wRnJhZzwobXVsIG5vZGU6JExIUywgbm9kZTokUkhTKT4+Ow0KK2RlZm0gU01MQSA6IEFJX3NtbGE8InNtbGEiLCBCaW5PcEZyYWc8KG11bCBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsNCisNCisvLyBIYWxmd29yZCBtdWx0aXBseSBhY2N1bXVsYXRlIGxvbmc6IFNNTEFMPHg+PHk+IC0tIGZvciBkaXNhc3NlbWJseSBvbmx5DQorZGVmIFNNTEFMQkIgOiBBTXVseHlJPDBiMDAwMTAxMCwob3V0cyBHUFI6JGxkc3QsR1BSOiRoZHN0KSwoaW5zIEdQUjokYSxHUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgICAgICBJSUNfaU1BQzY0LCAic21sYWxiYiIsICJcdCRsZHN0LCAkaGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjVURV0+IHsNCisgIGxldCBJbnN0ezV9ID0gMDsNCisgIGxldCBJbnN0ezZ9ID0gMDsNCit9DQorDQorZGVmIFNNTEFMQlQgOiBBTXVseHlJPDBiMDAwMTAxMCwob3V0cyBHUFI6JGxkc3QsR1BSOiRoZHN0KSwoaW5zIEdQUjokYSxHUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgICAgICBJSUNfaU1BQzY0LCAic21sYWxidCIsICJcdCRsZHN0LCAkaGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjVURV0+IHsNCisgIGxldCBJbnN0ezV9ID0gMDsNCisgIGxldCBJbnN0ezZ9ID0gMTsNCit9DQorDQorZGVmIFNNTEFMVEIgOiBBTXVseHlJPDBiMDAwMTAxMCwob3V0cyBHUFI6JGxkc3QsR1BSOiRoZHN0KSwoaW5zIEdQUjokYSxHUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgICAgICBJSUNfaU1BQzY0LCAic21sYWx0YiIsICJcdCRsZHN0LCAkaGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjVURV0+IHsNCisgIGxldCBJbnN0ezV9ID0gMTsNCisgIGxldCBJbnN0ezZ9ID0gMDsNCit9DQorDQorZGVmIFNNTEFMVFQgOiBBTXVseHlJPDBiMDAwMTAxMCwob3V0cyBHUFI6JGxkc3QsR1BSOiRoZHN0KSwoaW5zIEdQUjokYSxHUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgICAgICBJSUNfaU1BQzY0LCAic21sYWx0dCIsICJcdCRsZHN0LCAkaGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjVURV0+IHsNCisgIGxldCBJbnN0ezV9ID0gMTsNCisgIGxldCBJbnN0ezZ9ID0gMTsNCit9DQorDQorLy8gSGVscGVyIGNsYXNzIGZvciBBSV9zbWxkIC0tIGZvciBkaXNhc3NlbWJseSBvbmx5DQorY2xhc3MgQU11bER1YWxJPGJpdCBsb25nLCBiaXQgc3ViLCBiaXQgc3dhcCwgZGFnIG9vcHMsIGRhZyBpb3BzLA0KKyAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtPg0KKyAgOiBBSTxvb3BzLCBpb3BzLCBNdWxGcm0sIGl0aW4sIG9wYywgYXNtLCBbXT4sIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZdPiB7DQorICBsZXQgSW5zdHs0fSAgICAgPSAxOw0KKyAgbGV0IEluc3R7NX0gICAgID0gc3dhcDsNCisgIGxldCBJbnN0ezZ9ICAgICA9IHN1YjsNCisgIGxldCBJbnN0ezd9ICAgICA9IDA7DQorICBsZXQgSW5zdHsyMS0yMH0gPSAwYjAwOw0KKyAgbGV0IEluc3R7MjJ9ICAgID0gbG9uZzsNCisgIGxldCBJbnN0ezI3LTIzfSA9IDBiMDExMTA7DQorfQ0KKw0KK211bHRpY2xhc3MgQUlfc21sZDxiaXQgc3ViLCBzdHJpbmcgb3BjPiB7DQorDQorICBkZWYgRCA6IEFNdWxEdWFsSTwwLCBzdWIsIDAsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiwgR1BSOiRhY2MpLA0KKyAgICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAhc3RyY29uY2F0KG9wYywgImQiKSwgIlx0JGRzdCwgJGEsICRiLCAkYWNjIj47DQorDQorICBkZWYgRFggOiBBTXVsRHVhbEk8MCwgc3ViLCAxLCAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRhLCBHUFI6JGIsIEdQUjokYWNjKSwNCisgICAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwgIXN0cmNvbmNhdChvcGMsICJkeCIpLCAiXHQkZHN0LCAkYSwgJGIsICRhY2MiPjsNCisNCisgIGRlZiBMRCA6IEFNdWxEdWFsSTwxLCBzdWIsIDAsIChvdXRzIEdQUjokbGRzdCxHUFI6JGhkc3QpLCAoaW5zIEdQUjokYSxHUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAhc3RyY29uY2F0KG9wYywgImxkIiksICJcdCRsZHN0LCAkaGRzdCwgJGEsICRiIj47DQorDQorICBkZWYgTERYIDogQU11bER1YWxJPDEsIHN1YiwgMSwgKG91dHMgR1BSOiRsZHN0LEdQUjokaGRzdCksKGlucyBHUFI6JGEsR1BSOiRiKSwNCisgICAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwgIXN0cmNvbmNhdChvcGMsICJsZHgiKSwiXHQkbGRzdCwgJGhkc3QsICRhLCAkYiI+Ow0KKw0KK30NCisNCitkZWZtIFNNTEEgOiBBSV9zbWxkPDAsICJzbWxhIj47DQorZGVmbSBTTUxTIDogQUlfc21sZDwxLCAic21scyI+Ow0KKw0KK211bHRpY2xhc3MgQUlfc2RtbDxiaXQgc3ViLCBzdHJpbmcgb3BjPiB7DQorDQorICBkZWYgRCA6IEFNdWxEdWFsSTwwLCBzdWIsIDAsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksDQorICAgICAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwgIXN0cmNvbmNhdChvcGMsICJkIiksICJcdCRkc3QsICRhLCAkYiI+IHsNCisgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOw0KKyAgfQ0KKw0KKyAgZGVmIERYIDogQU11bER1YWxJPDAsIHN1YiwgMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokYSwgR1BSOiRiKSwNCisgICAgICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAhc3RyY29uY2F0KG9wYywgImR4IiksICJcdCRkc3QsICRhLCAkYiI+IHsNCisgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOw0KKyAgfQ0KKw0KK30NCisNCitkZWZtIFNNVUEgOiBBSV9zZG1sPDAsICJzbXVhIj47DQorZGVmbSBTTVVTIDogQUlfc2RtbDwxLCAic211cyI+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIE1pc2MuIEFyaXRobWV0aWMgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorDQorZGVmIENMWiAgOiBBTWlzY0ExSTwwYjAwMDAxMDExMCwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwgSUlDX2lVTkFyLA0KKyAgICAgICAgICAgICAgImNseiIsICJcdCRkc3QsICRzcmMiLA0KKyAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChjdGx6IEdQUjokc3JjKSldPiwgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNVRdPiB7DQorICBsZXQgSW5zdHs3LTR9ICAgPSAwYjAwMDE7DQorICBsZXQgSW5zdHsxMS04fSAgPSAwYjExMTE7DQorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7DQorfQ0KKw0KK2RlZiBSQklUIDogQU1pc2NBMUk8MGIwMTEwMTExMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwgSUlDX2lVTkFyLA0KKyAgICAgICAgICAgICAgInJiaXQiLCAiXHQkZHN0LCAkc3JjIiwNCisgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoQVJNcmJpdCBHUFI6JHNyYykpXT4sDQorICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2VDJdPiB7DQorICBsZXQgSW5zdHs3LTR9ICAgPSAwYjAwMTE7DQorICBsZXQgSW5zdHsxMS04fSAgPSAwYjExMTE7DQorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7DQorfQ0KKw0KK2RlZiBSRVYgIDogQU1pc2NBMUk8MGIwMTEwMTAxMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwgSUlDX2lVTkFyLA0KKyAgICAgICAgICAgICAgInJldiIsICJcdCRkc3QsICRzcmMiLA0KKyAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChic3dhcCBHUFI6JHNyYykpXT4sIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZdPiB7DQorICBsZXQgSW5zdHs3LTR9ICAgPSAwYjAwMTE7DQorICBsZXQgSW5zdHsxMS04fSAgPSAwYjExMTE7DQorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7DQorfQ0KKw0KK2RlZiBSRVYxNiA6IEFNaXNjQTFJPDBiMDExMDEwMTEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYyksIElJQ19pVU5BciwNCisgICAgICAgICAgICAgICAicmV2MTYiLCAiXHQkZHN0LCAkc3JjIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgKG9yIChhbmQgKHNybCBHUFI6JHNyYywgKGkzMiA4KSksIDB4RkYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhbmQgKHNobCBHUFI6JHNyYywgKGkzMiA4KSksIDB4RkYwMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhbmQgKHNybCBHUFI6JHNyYywgKGkzMiA4KSksIDB4RkYwMDAwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCAoc2hsIEdQUjokc3JjLCAoaTMyIDgpKSwgMHhGRjAwMDAwMCkpKSkpXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNl0+IHsNCisgIGxldCBJbnN0ezctNH0gICA9IDBiMTAxMTsNCisgIGxldCBJbnN0ezExLTh9ICA9IDBiMTExMTsNCisgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsNCit9DQorDQorZGVmIFJFVlNIIDogQU1pc2NBMUk8MGIwMTEwMTExMSwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwgSUlDX2lVTkFyLA0KKyAgICAgICAgICAgICAgICJyZXZzaCIsICJcdCRkc3QsICRzcmMiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LA0KKyAgICAgICAgICAgICAgICAgIChzZXh0X2lucmVnDQorICAgICAgICAgICAgICAgICAgICAob3IgKHNybCAoYW5kIEdQUjokc3JjLCAweEZGMDApLCAoaTMyIDgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoc2hsIEdQUjokc3JjLCAoaTMyIDgpKSksIGkxNikpXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNl0+IHsNCisgIGxldCBJbnN0ezctNH0gICA9IDBiMTAxMTsNCisgIGxldCBJbnN0ezExLTh9ICA9IDBiMTExMTsNCisgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsNCit9DQorDQorZGVmIFBLSEJUIDogQU1pc2NBMUk8MGIwMTEwMTAwMCwgKG91dHMgR1BSOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMxLCBHUFI6JHNyYzIsIGkzMmltbTokc2hhbXQpLA0KKyAgICAgICAgICAgICAgIElJQ19pQUxVc2ksICJwa2hidCIsICJcdCRkc3QsICRzcmMxLCAkc3JjMiwgbHNsICRzaGFtdCIsDQorICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChvciAoYW5kIEdQUjokc3JjMSwgMHhGRkZGKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKHNobCBHUFI6JHNyYzIsIChpMzIgaW1tOiRzaGFtdCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwKSkpXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWNl0+IHsNCisgIGxldCBJbnN0ezYtNH0gPSAwYjAwMTsNCit9DQorDQorLy8gQWx0ZXJuYXRlIGNhc2VzIGZvciBQS0hCVCB3aGVyZSBpZGVudGl0aWVzIGVsaW1pbmF0ZSBzb21lIG5vZGVzLg0KK2RlZiA6IEFSTVY2UGF0PChvciAoYW5kIEdQUjokc3JjMSwgMHhGRkZGKSwgKGFuZCBHUFI6JHNyYzIsIDB4RkZGRjAwMDApKSwNCisgICAgICAgICAgICAgICAoUEtIQlQgR1BSOiRzcmMxLCBHUFI6JHNyYzIsIDApPjsNCitkZWYgOiBBUk1WNlBhdDwob3IgKGFuZCBHUFI6JHNyYzEsIDB4RkZGRiksIChzaGwgR1BSOiRzcmMyLCBpbW0xNl8zMTokc2hhbXQpKSwNCisgICAgICAgICAgICAgICAoUEtIQlQgR1BSOiRzcmMxLCBHUFI6JHNyYzIsIGltbTE2XzMxOiRzaGFtdCk+Ow0KKw0KKw0KK2RlZiBQS0hUQiA6IEFNaXNjQTFJPDBiMDExMDEwMDAsIChvdXRzIEdQUjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokc3JjMSwgR1BSOiRzcmMyLCBpMzJpbW06JHNoYW10KSwNCisgICAgICAgICAgICAgICBJSUNfaUFMVXNpLCAicGtodGIiLCAiXHQkZHN0LCAkc3JjMSwgJHNyYzIsIGFzciAkc2hhbXQiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3IgKGFuZCBHUFI6JHNyYzEsIDB4RkZGRjAwMDApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCAoc3JhIEdQUjokc3JjMiwgaW1tMTZfMzE6JHNoYW10KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGKSkpXT4sIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZdPiB7DQorICBsZXQgSW5zdHs2LTR9ID0gMGIxMDE7DQorfQ0KKw0KKy8vIEFsdGVybmF0ZSBjYXNlcyBmb3IgUEtIVEIgd2hlcmUgaWRlbnRpdGllcyBlbGltaW5hdGUgc29tZSBub2Rlcy4gIE5vdGUgdGhhdA0KKy8vIGEgc2hpZnQgYW1vdW50IG9mIDAgaXMgKm5vdCBsZWdhbCogaGVyZSwgaXQgaXMgUEtIQlQgaW5zdGVhZC4NCitkZWYgOiBBUk1WNlBhdDwob3IgKGFuZCBHUFI6JHNyYzEsIDB4RkZGRjAwMDApLCAoc3JsIEdQUjokc3JjMiwgKGkzMiAxNikpKSwNCisgICAgICAgICAgICAgICAoUEtIVEIgR1BSOiRzcmMxLCBHUFI6JHNyYzIsIDE2KT47DQorZGVmIDogQVJNVjZQYXQ8KG9yIChhbmQgR1BSOiRzcmMxLCAweEZGRkYwMDAwKSwNCisgICAgICAgICAgICAgICAgICAgKGFuZCAoc3JsIEdQUjokc3JjMiwgaW1tMV8xNTokc2hhbXQpLCAweEZGRkYpKSwNCisgICAgICAgICAgICAgICAoUEtIVEIgR1BSOiRzcmMxLCBHUFI6JHNyYzIsIGltbTFfMTU6JHNoYW10KT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgQ29tcGFyaXNvbiBJbnN0cnVjdGlvbnMuLi4NCisvLw0KKw0KK2RlZm0gQ01QICA6IEFJMV9jbXBfaXJzPDBiMTAxMCwgImNtcCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChBUk1jbXAgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47DQorLy9GSVhNRTogRGlzYWJsZSBDTU4sIGFzIENDb2RlcyBhcmUgYmFja3dhcmRzIGZyb20gY29tcGFyZSBleHBlY3RhdGlvbnMNCisvLyAgICAgICBDb21wYXJlLXRvLXplcm8gc3RpbGwgd29ya3Mgb3V0LCBqdXN0IG5vdCB0aGUgcmVsYXRpb25hbHMNCisvL2RlZm0gQ01OICA6IEFJMV9jbXBfaXJzPDBiMTAxMSwgImNtbiIsDQorLy8gICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KEFSTWNtcCBub2RlOiRMSFMsKGluZWcgbm9kZTokUkhTKSk+PjsNCisNCisvLyBOb3RlIHRoYXQgVFNUL1RFUSBkb24ndCBzZXQgYWxsIHRoZSBzYW1lIGZsYWdzIHRoYXQgQ01QIGRvZXMhDQorZGVmbSBUU1QgIDogQUkxX2NtcF9pcnM8MGIxMDAwLCAidHN0IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KEFSTWNtcFogKGFuZCBub2RlOiRMSFMsIG5vZGU6JFJIUyksIDApPiwgMT47DQorZGVmbSBURVEgIDogQUkxX2NtcF9pcnM8MGIxMDAxLCAidGVxIiwNCisgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KEFSTWNtcFogKHhvciBub2RlOiRMSFMsIG5vZGU6JFJIUyksIDApPiwgMT47DQorDQorZGVmbSBDTVB6ICA6IEFJMV9jbXBfaXJzPDBiMTAxMCwgImNtcCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoQVJNY21wWiBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsNCitkZWZtIENNTnogIDogQUkxX2NtcF9pcnM8MGIxMDExLCAiY21uIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChBUk1jbXBaIG5vZGU6JExIUywoaW5lZyBub2RlOiRSSFMpKT4+Ow0KKw0KKy8vZGVmIDogQVJNUGF0PChBUk1jbXAgR1BSOiRzcmMsIHNvX2ltbV9uZWc6JGltbSksDQorLy8gICAgICAgICAgICAgKENNTnJpICBHUFI6JHNyYywgc29faW1tX25lZzokaW1tKT47DQorDQorZGVmIDogQVJNUGF0PChBUk1jbXBaIEdQUjokc3JjLCBzb19pbW1fbmVnOiRpbW0pLA0KKyAgICAgICAgICAgICAoQ01OenJpICBHUFI6JHNyYywgc29faW1tX25lZzokaW1tKT47DQorDQorLy8gUHNldWRvIGk2NCBjb21wYXJlcyBmb3Igc29tZSBmbG9hdGluZyBwb2ludCBjb21wYXJlcy4NCitsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMSwgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLA0KKyAgICBEZWZzID0gW0NQU1JdIGluIHsNCitkZWYgQkNDaTY0IDogUHNldWRvSW5zdDwob3V0cyksDQorICAgICAoaW5zIGkzMmltbTokY2MsIEdQUjokbGhzMSwgR1BSOiRsaHMyLCBHUFI6JHJoczEsIEdQUjokcmhzMiwgYnJ0YXJnZXQ6JGRzdCksDQorICAgICAgSUlDX0JyLA0KKyAgICAgIiR7OmNvbW1lbnR9IEJcdCRkc3QgR1BSOiRsaHMxLCBHUFI6JGxoczIsIEdQUjokcmhzMSwgR1BSOiRyaHMyLCBpbW06JGNjIiwNCisgICAgWyhBUk1CY2NpNjQgaW1tOiRjYywgR1BSOiRsaHMxLCBHUFI6JGxoczIsIEdQUjokcmhzMSwgR1BSOiRyaHMyLCBiYjokZHN0KV0+Ow0KKw0KK2RlZiBCQ0NaaTY0IDogUHNldWRvSW5zdDwob3V0cyksDQorICAgICAoaW5zIGkzMmltbTokY2MsIEdQUjokbGhzMSwgR1BSOiRsaHMyLCBicnRhcmdldDokZHN0KSwNCisgICAgICBJSUNfQnIsDQorICAgICAiJHs6Y29tbWVudH0gQlx0JGRzdCBHUFI6JGxoczEsIEdQUjokbGhzMiwgMCwgMCwgaW1tOiRjYyIsDQorICAgIFsoQVJNQmNjaTY0IGltbTokY2MsIEdQUjokbGhzMSwgR1BSOiRsaHMyLCAwLCAwLCBiYjokZHN0KV0+Ow0KK30gLy8gdXNlc0N1c3RvbUluc2VydGVyDQorDQorDQorLy8gQ29uZGl0aW9uYWwgbW92ZXMNCisvLyBGSVhNRTogc2hvdWxkIGJlIGFibGUgdG8gd3JpdGUgYSBwYXR0ZXJuIGZvciBBUk1jbW92LCBidXQgY2FuJ3QgdXNlDQorLy8gYSB0d28tdmFsdWUgb3BlcmFuZCB3aGVyZSBhIGRhZyBub2RlIGV4cGVjdHMgdHdvIG9wZXJhbmRzLiA6KA0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorZGVmIE1PVkNDciA6IEFJMTwwYjExMDEsIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGZhbHNlLCBHUFI6JHRydWUpLCBEUEZybSwNCisgICAgICAgICAgICAgICAgSUlDX2lDTU9WciwgIm1vdiIsICJcdCRkc3QsICR0cnVlIiwNCisgICAgICBbLyooc2V0IEdQUjokZHN0LCAoQVJNY21vdiBHUFI6JGZhbHNlLCBHUFI6JHRydWUsIGltbTokY2MsIENDUjokY2NyKSkqL10+LA0KKyAgICAgICAgICAgICAgICBSZWdDb25zdHJhaW50PCIkZmFsc2UgPSAkZHN0Ij4sIFVuYXJ5RFAgew0KKyAgbGV0IEluc3R7MTEtNH0gPSAwYjAwMDAwMDAwOw0KKyAgbGV0IEluc3R7MjV9ID0gMDsNCit9DQorDQorZGVmIE1PVkNDcyA6IEFJMTwwYjExMDEsIChvdXRzIEdQUjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokZmFsc2UsIHNvX3JlZzokdHJ1ZSksIERQU29SZWdGcm0sIElJQ19pQ01PVnNyLA0KKyAgICAgICAgICAgICAgICAibW92IiwgIlx0JGRzdCwgJHRydWUiLA0KKyAgIFsvKihzZXQgR1BSOiRkc3QsIChBUk1jbW92IEdQUjokZmFsc2UsIHNvX3JlZzokdHJ1ZSwgaW1tOiRjYywgQ0NSOiRjY3IpKSovXT4sDQorICAgICAgICAgICAgICAgIFJlZ0NvbnN0cmFpbnQ8IiRmYWxzZSA9ICRkc3QiPiwgVW5hcnlEUCB7DQorICBsZXQgSW5zdHsyNX0gPSAwOw0KK30NCisNCitkZWYgTU9WQ0NpIDogQUkxPDBiMTEwMSwgKG91dHMgR1BSOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRmYWxzZSwgc29faW1tOiR0cnVlKSwgRFBGcm0sIElJQ19pQ01PVmksDQorICAgICAgICAgICAgICAgICJtb3YiLCAiXHQkZHN0LCAkdHJ1ZSIsDQorICAgWy8qKHNldCBHUFI6JGRzdCwgKEFSTWNtb3YgR1BSOiRmYWxzZSwgc29faW1tOiR0cnVlLCBpbW06JGNjLCBDQ1I6JGNjcikpKi9dPiwNCisgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJGZhbHNlID0gJGRzdCI+LCBVbmFyeURQIHsNCisgIGxldCBJbnN0ezI1fSA9IDE7DQorfQ0KK30gLy8gbmV2ZXJIYXNTaWRlRWZmZWN0cw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQXRvbWljIG9wZXJhdGlvbnMgaW50cmluc2ljcw0KKy8vDQorDQorLy8gbWVtb3J5IGJhcnJpZXJzIHByb3RlY3QgdGhlIGF0b21pYyBzZXF1ZW5jZXMNCitsZXQgaGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCitkZWYgSW50X01lbUJhcnJpZXJWNyA6IEFJbm9QPChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiZG1iIiwgIiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhBUk1NZW1CYXJyaWVyVjcpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWN10+IHsNCisgIGxldCBJbnN0ezMxLTR9ID0gMHhmNTdmZjA1Ow0KKyAgLy8gRklYTUU6IGFkZCBzdXBwb3J0IGZvciBvcHRpb25zIG90aGVyIHRoYW4gYSBmdWxsIHN5c3RlbSBETUINCisgIC8vIFNlZSBETUIgZGlzYXNzZW1ibHktb25seSB2YXJpYW50cyBiZWxvdy4NCisgIGxldCBJbnN0ezMtMH0gPSAwYjExMTE7DQorfQ0KKw0KK2RlZiBJbnRfU3luY0JhcnJpZXJWNyA6IEFJbm9QPChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiZHNiIiwgIiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhBUk1TeW5jQmFycmllclY3KV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjddPiB7DQorICBsZXQgSW5zdHszMS00fSA9IDB4ZjU3ZmYwNDsNCisgIC8vIEZJWE1FOiBhZGQgc3VwcG9ydCBmb3Igb3B0aW9ucyBvdGhlciB0aGFuIGEgZnVsbCBzeXN0ZW0gRFNCDQorICAvLyBTZWUgRFNCIGRpc2Fzc2VtYmx5LW9ubHkgdmFyaWFudHMgYmVsb3cuDQorICBsZXQgSW5zdHszLTB9ID0gMGIxMTExOw0KK30NCisNCitkZWYgSW50X01lbUJhcnJpZXJWNiA6IEFJbm9QPChvdXRzKSwgKGlucyBHUFI6JHplcm8pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtY3IiLCAiXHRwMTUsIDAsICR6ZXJvLCBjNywgYzEwLCA1IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoQVJNTWVtQmFycmllclY2IEdQUjokemVybyldPiwNCisgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZdPiB7DQorICAvLyBGSVhNRTogYWRkIHN1cHBvcnQgZm9yIG9wdGlvbnMgb3RoZXIgdGhhbiBhIGZ1bGwgc3lzdGVtIERNQg0KKyAgLy8gRklYTUU6IGFkZCBlbmNvZGluZw0KK30NCisNCitkZWYgSW50X1N5bmNCYXJyaWVyVjYgOiBBSW5vUDwob3V0cyksIChpbnMgR1BSOiR6ZXJvKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG8sIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJtY3IiLCAiXHRwMTUsIDAsICR6ZXJvLCBjNywgYzEwLCA0IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKEFSTVN5bmNCYXJyaWVyVjYgR1BSOiR6ZXJvKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSGFzVjZdPiB7DQorICAvLyBGSVhNRTogYWRkIHN1cHBvcnQgZm9yIG9wdGlvbnMgb3RoZXIgdGhhbiBhIGZ1bGwgc3lzdGVtIERTQg0KKyAgLy8gRklYTUU6IGFkZCBlbmNvZGluZw0KK30NCit9DQorDQorLy8gSGVscGVyIGNsYXNzIGZvciBtdWx0aWNsYXNzIE1lbUIgLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkNCitjbGFzcyBBTUJJPHN0cmluZyBvcGMsIHN0cmluZyBhc20+DQorICA6IEFJbm9QPChvdXRzKSwgKGlucyksIE1pc2NGcm0sIE5vSXRpbmVyYXJ5LCBvcGMsIGFzbSwNCisgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWN10+IHsNCisgIGxldCBJbnN0ezMxLTIwfSA9IDB4ZjU3Ow0KK30NCisNCittdWx0aWNsYXNzIE1lbUI8Yml0czw0PiBvcDdfNCwgc3RyaW5nIG9wYz4gew0KKw0KKyAgZGVmIHN0IDogQU1CSTxvcGMsICJcdHN0Ij4gew0KKyAgICBsZXQgSW5zdHs3LTR9ID0gb3A3XzQ7DQorICAgIGxldCBJbnN0ezMtMH0gPSAwYjExMTA7DQorICB9DQorDQorICBkZWYgaXNoIDogQU1CSTxvcGMsICJcdGlzaCI+IHsNCisgICAgbGV0IEluc3R7Ny00fSA9IG9wN180Ow0KKyAgICBsZXQgSW5zdHszLTB9ID0gMGIxMDExOw0KKyAgfQ0KKw0KKyAgZGVmIGlzaHN0IDogQU1CSTxvcGMsICJcdGlzaHN0Ij4gew0KKyAgICBsZXQgSW5zdHs3LTR9ID0gb3A3XzQ7DQorICAgIGxldCBJbnN0ezMtMH0gPSAwYjEwMTA7DQorICB9DQorDQorICBkZWYgbnNoIDogQU1CSTxvcGMsICJcdG5zaCI+IHsNCisgICAgbGV0IEluc3R7Ny00fSA9IG9wN180Ow0KKyAgICBsZXQgSW5zdHszLTB9ID0gMGIwMTExOw0KKyAgfQ0KKw0KKyAgZGVmIG5zaHN0IDogQU1CSTxvcGMsICJcdG5zaHN0Ij4gew0KKyAgICBsZXQgSW5zdHs3LTR9ID0gb3A3XzQ7DQorICAgIGxldCBJbnN0ezMtMH0gPSAwYjAxMTA7DQorICB9DQorDQorICBkZWYgb3NoIDogQU1CSTxvcGMsICJcdG9zaCI+IHsNCisgICAgbGV0IEluc3R7Ny00fSA9IG9wN180Ow0KKyAgICBsZXQgSW5zdHszLTB9ID0gMGIwMDExOw0KKyAgfQ0KKw0KKyAgZGVmIG9zaHN0IDogQU1CSTxvcGMsICJcdG9zaHN0Ij4gew0KKyAgICBsZXQgSW5zdHs3LTR9ID0gb3A3XzQ7DQorICAgIGxldCBJbnN0ezMtMH0gPSAwYjAwMTA7DQorICB9DQorfQ0KKw0KKy8vIFRoZXNlIERNQiB2YXJpYW50cyBhcmUgZm9yIGRpc2Fzc2VtYmx5IG9ubHkuDQorZGVmbSBETUIgOiBNZW1CPDBiMDEwMSwgImRtYiI+Ow0KKw0KKy8vIFRoZXNlIERTQiB2YXJpYW50cyBhcmUgZm9yIGRpc2Fzc2VtYmx5IG9ubHkuDQorZGVmbSBEU0IgOiBNZW1CPDBiMDEwMCwgImRzYiI+Ow0KKw0KKy8vIElTQiBoYXMgb25seSBmdWxsIHN5c3RlbSBvcHRpb24gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkNCitkZWYgSVNCc3kgOiBBTUJJPCJpc2IiLCAiIj4gew0KKyAgbGV0IEluc3R7Ny00fSA9IDBiMDExMDsNCisgIGxldCBJbnN0ezMtMH0gPSAwYjExMTE7DQorfQ0KKw0KK2xldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxIGluIHsNCisgIGxldCBVc2VzID0gW0NQU1JdIGluIHsNCisgICAgZGVmIEFUT01JQ19MT0FEX0FERF9JOCA6IFBzZXVkb0luc3Q8DQorICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokcHRyLCBHUFI6JGluY3IpLCBOb0l0aW5lcmFyeSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfQUREX0k4IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2xvYWRfYWRkXzggR1BSOiRwdHIsIEdQUjokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9TVUJfSTggOiBQc2V1ZG9JbnN0PA0KKyAgICAgIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHB0ciwgR1BSOiRpbmNyKSwgTm9JdGluZXJhcnksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX1NVQl9JOCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFI6JGRzdCwgKGF0b21pY19sb2FkX3N1Yl84IEdQUjokcHRyLCBHUFI6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfQU5EX0k4IDogUHNldWRvSW5zdDwNCisgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRwdHIsIEdQUjokaW5jciksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9BTkRfSTggUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSOiRkc3QsIChhdG9taWNfbG9hZF9hbmRfOCBHUFI6JHB0ciwgR1BSOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX09SX0k4IDogUHNldWRvSW5zdDwNCisgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRwdHIsIEdQUjokaW5jciksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9PUl9JOCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFI6JGRzdCwgKGF0b21pY19sb2FkX29yXzggR1BSOiRwdHIsIEdQUjokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9YT1JfSTggOiBQc2V1ZG9JbnN0PA0KKyAgICAgIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHB0ciwgR1BSOiRpbmNyKSwgTm9JdGluZXJhcnksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX1hPUl9JOCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFI6JGRzdCwgKGF0b21pY19sb2FkX3hvcl84IEdQUjokcHRyLCBHUFI6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfTkFORF9JOCA6IFBzZXVkb0luc3Q8DQorICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokcHRyLCBHUFI6JGluY3IpLCBOb0l0aW5lcmFyeSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfTkFORF9JOCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFI6JGRzdCwgKGF0b21pY19sb2FkX25hbmRfOCBHUFI6JHB0ciwgR1BSOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX0FERF9JMTYgOiBQc2V1ZG9JbnN0PA0KKyAgICAgIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHB0ciwgR1BSOiRpbmNyKSwgTm9JdGluZXJhcnksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX0FERF9JMTYgUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSOiRkc3QsIChhdG9taWNfbG9hZF9hZGRfMTYgR1BSOiRwdHIsIEdQUjokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9TVUJfSTE2IDogUHNldWRvSW5zdDwNCisgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRwdHIsIEdQUjokaW5jciksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9TVUJfSTE2IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2xvYWRfc3ViXzE2IEdQUjokcHRyLCBHUFI6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfQU5EX0kxNiA6IFBzZXVkb0luc3Q8DQorICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokcHRyLCBHUFI6JGluY3IpLCBOb0l0aW5lcmFyeSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfQU5EX0kxNiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFI6JGRzdCwgKGF0b21pY19sb2FkX2FuZF8xNiBHUFI6JHB0ciwgR1BSOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX09SX0kxNiA6IFBzZXVkb0luc3Q8DQorICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokcHRyLCBHUFI6JGluY3IpLCBOb0l0aW5lcmFyeSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfT1JfSTE2IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2xvYWRfb3JfMTYgR1BSOiRwdHIsIEdQUjokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9YT1JfSTE2IDogUHNldWRvSW5zdDwNCisgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRwdHIsIEdQUjokaW5jciksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9YT1JfSTE2IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2xvYWRfeG9yXzE2IEdQUjokcHRyLCBHUFI6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfTkFORF9JMTYgOiBQc2V1ZG9JbnN0PA0KKyAgICAgIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHB0ciwgR1BSOiRpbmNyKSwgTm9JdGluZXJhcnksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX05BTkRfSTE2IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2xvYWRfbmFuZF8xNiBHUFI6JHB0ciwgR1BSOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX0FERF9JMzIgOiBQc2V1ZG9JbnN0PA0KKyAgICAgIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHB0ciwgR1BSOiRpbmNyKSwgTm9JdGluZXJhcnksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX0FERF9JMzIgUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSOiRkc3QsIChhdG9taWNfbG9hZF9hZGRfMzIgR1BSOiRwdHIsIEdQUjokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9TVUJfSTMyIDogUHNldWRvSW5zdDwNCisgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRwdHIsIEdQUjokaW5jciksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9TVUJfSTMyIFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2xvYWRfc3ViXzMyIEdQUjokcHRyLCBHUFI6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfQU5EX0kzMiA6IFBzZXVkb0luc3Q8DQorICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokcHRyLCBHUFI6JGluY3IpLCBOb0l0aW5lcmFyeSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfQU5EX0kzMiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFI6JGRzdCwgKGF0b21pY19sb2FkX2FuZF8zMiBHUFI6JHB0ciwgR1BSOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX09SX0kzMiA6IFBzZXVkb0luc3Q8DQorICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokcHRyLCBHUFI6JGluY3IpLCBOb0l0aW5lcmFyeSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfT1JfSTMyIFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2xvYWRfb3JfMzIgR1BSOiRwdHIsIEdQUjokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9YT1JfSTMyIDogUHNldWRvSW5zdDwNCisgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRwdHIsIEdQUjokaW5jciksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9YT1JfSTMyIFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2xvYWRfeG9yXzMyIEdQUjokcHRyLCBHUFI6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfTkFORF9JMzIgOiBQc2V1ZG9JbnN0PA0KKyAgICAgIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHB0ciwgR1BSOiRpbmNyKSwgTm9JdGluZXJhcnksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX05BTkRfSTMyIFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2xvYWRfbmFuZF8zMiBHUFI6JHB0ciwgR1BSOiRpbmNyKSldPjsNCisNCisgICAgZGVmIEFUT01JQ19TV0FQX0k4IDogUHNldWRvSW5zdDwNCisgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRwdHIsIEdQUjokbmV3KSwgTm9JdGluZXJhcnksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19TV0FQX0k4IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX3N3YXBfOCBHUFI6JHB0ciwgR1BSOiRuZXcpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX1NXQVBfSTE2IDogUHNldWRvSW5zdDwNCisgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRwdHIsIEdQUjokbmV3KSwgTm9JdGluZXJhcnksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19TV0FQX0kxNiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFI6JGRzdCwgKGF0b21pY19zd2FwXzE2IEdQUjokcHRyLCBHUFI6JG5ldykpXT47DQorICAgIGRlZiBBVE9NSUNfU1dBUF9JMzIgOiBQc2V1ZG9JbnN0PA0KKyAgICAgIChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHB0ciwgR1BSOiRuZXcpLCBOb0l0aW5lcmFyeSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX1NXQVBfSTMyIFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX3N3YXBfMzIgR1BSOiRwdHIsIEdQUjokbmV3KSldPjsNCisNCisgICAgZGVmIEFUT01JQ19DTVBfU1dBUF9JOCA6IFBzZXVkb0luc3Q8DQorICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokcHRyLCBHUFI6JG9sZCwgR1BSOiRuZXcpLCBOb0l0aW5lcmFyeSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0NNUF9TV0FQX0k4IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2NtcF9zd2FwXzggR1BSOiRwdHIsIEdQUjokb2xkLCBHUFI6JG5ldykpXT47DQorICAgIGRlZiBBVE9NSUNfQ01QX1NXQVBfSTE2IDogUHNldWRvSW5zdDwNCisgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRwdHIsIEdQUjokb2xkLCBHUFI6JG5ldyksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfQ01QX1NXQVBfSTE2IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUjokZHN0LCAoYXRvbWljX2NtcF9zd2FwXzE2IEdQUjokcHRyLCBHUFI6JG9sZCwgR1BSOiRuZXcpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0NNUF9TV0FQX0kzMiA6IFBzZXVkb0luc3Q8DQorICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokcHRyLCBHUFI6JG9sZCwgR1BSOiRuZXcpLCBOb0l0aW5lcmFyeSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0NNUF9TV0FQX0kzMiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFI6JGRzdCwgKGF0b21pY19jbXBfc3dhcF8zMiBHUFI6JHB0ciwgR1BSOiRvbGQsIEdQUjokbmV3KSldPjsNCit9DQorfQ0KKw0KK2xldCBtYXlMb2FkID0gMSBpbiB7DQorZGVmIExEUkVYQiA6IEFJbGRyZXg8MGIxMCwgKG91dHMgR1BSOiRkZXN0KSwgKGlucyBHUFI6JHB0ciksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgICAgICAgImxkcmV4YiIsICJcdCRkZXN0LCBbJHB0cl0iLA0KKyAgICAgICAgICAgICAgICAgICAgW10+Ow0KK2RlZiBMRFJFWEggOiBBSWxkcmV4PDBiMTEsIChvdXRzIEdQUjokZGVzdCksIChpbnMgR1BSOiRwdHIpLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICAgICJsZHJleGgiLCAiXHQkZGVzdCwgWyRwdHJdIiwNCisgICAgICAgICAgICAgICAgICAgIFtdPjsNCitkZWYgTERSRVggIDogQUlsZHJleDwwYjAwLCAob3V0cyBHUFI6JGRlc3QpLCAoaW5zIEdQUjokcHRyKSwgTm9JdGluZXJhcnksDQorICAgICAgICAgICAgICAgICAgICAibGRyZXgiLCAiXHQkZGVzdCwgWyRwdHJdIiwNCisgICAgICAgICAgICAgICAgICAgIFtdPjsNCitkZWYgTERSRVhEIDogQUlsZHJleDwwYjAxLCAob3V0cyBHUFI6JGRlc3QsIEdQUjokZGVzdDIpLCAoaW5zIEdQUjokcHRyKSwNCisgICAgICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgICAgICAgImxkcmV4ZCIsICJcdCRkZXN0LCAkZGVzdDIsIFskcHRyXSIsDQorICAgICAgICAgICAgICAgICAgICBbXT47DQorfQ0KKw0KK2xldCBtYXlTdG9yZSA9IDEsIENvbnN0cmFpbnRzID0gIkBlYXJseWNsb2JiZXIgJHN1Y2Nlc3MiIGluIHsNCitkZWYgU1RSRVhCIDogQUlzdHJleDwwYjEwLCAob3V0cyBHUFI6JHN1Y2Nlc3MpLCAoaW5zIEdQUjokc3JjLCBHUFI6JHB0ciksDQorICAgICAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICAgICJzdHJleGIiLCAiXHQkc3VjY2VzcywgJHNyYywgWyRwdHJdIiwNCisgICAgICAgICAgICAgICAgICAgIFtdPjsNCitkZWYgU1RSRVhIIDogQUlzdHJleDwwYjExLCAob3V0cyBHUFI6JHN1Y2Nlc3MpLCAoaW5zIEdQUjokc3JjLCBHUFI6JHB0ciksDQorICAgICAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICAgICJzdHJleGgiLCAiXHQkc3VjY2VzcywgJHNyYywgWyRwdHJdIiwNCisgICAgICAgICAgICAgICAgICAgIFtdPjsNCitkZWYgU1RSRVggIDogQUlzdHJleDwwYjAwLCAob3V0cyBHUFI6JHN1Y2Nlc3MpLCAoaW5zIEdQUjokc3JjLCBHUFI6JHB0ciksDQorICAgICAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICAgICJzdHJleCIsICJcdCRzdWNjZXNzLCAkc3JjLCBbJHB0cl0iLA0KKyAgICAgICAgICAgICAgICAgICAgW10+Ow0KK2RlZiBTVFJFWEQgOiBBSXN0cmV4PDBiMDEsIChvdXRzIEdQUjokc3VjY2VzcyksDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokc3JjLCBHUFI6JHNyYzIsIEdQUjokcHRyKSwNCisgICAgICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgICAgICAgInN0cmV4ZCIsICJcdCRzdWNjZXNzLCAkc3JjLCAkc3JjMiwgWyRwdHJdIiwNCisgICAgICAgICAgICAgICAgICAgIFtdPjsNCit9DQorDQorLy8gQ2xlYXItRXhjbHVzaXZlIGlzIGZvciBkaXNhc3NlbWJseSBvbmx5Lg0KK2RlZiBDTFJFWCA6IEFYSTwob3V0cyksIChpbnMpLCBNaXNjRnJtLCBOb0l0aW5lcmFyeSwgImNscmV4IiwNCisgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y3XT4gIHsNCisgIGxldCBJbnN0ezMxLTIwfSA9IDB4ZjU3Ow0KKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMTsNCit9DQorDQorLy8gU1dQL1NXUEIgYXJlIGRlcHJlY2F0ZWQgaW4gVjYvVjcgYW5kIGZvciBkaXNhc3NlbWJseSBvbmx5Lg0KK2xldCBtYXlMb2FkID0gMSBpbiB7DQorZGVmIFNXUCA6IEFJPChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYywgR1BSOiRwdHIpLCBMZFN0RXhGcm0sIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAic3dwIiwgIlx0JGRzdCwgJHNyYywgWyRwdHJdIiwNCisgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyNy0yM30gPSAwYjAwMDEwOw0KKyAgbGV0IEluc3R7MjJ9ID0gMDsgLy8gQiA9IDANCisgIGxldCBJbnN0ezIxLTIwfSA9IDBiMDA7DQorICBsZXQgSW5zdHs3LTR9ID0gMGIxMDAxOw0KK30NCisNCitkZWYgU1dQQiA6IEFJPChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYywgR1BSOiRwdHIpLCBMZFN0RXhGcm0sIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAic3dwYiIsICJcdCRkc3QsICRzcmMsIFskcHRyXSIsDQorICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MjctMjN9ID0gMGIwMDAxMDsNCisgIGxldCBJbnN0ezIyfSA9IDE7IC8vIEIgPSAxDQorICBsZXQgSW5zdHsyMS0yMH0gPSAwYjAwOw0KKyAgbGV0IEluc3R7Ny00fSA9IDBiMTAwMTsNCit9DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gVExTIEluc3RydWN0aW9ucw0KKy8vDQorDQorLy8gX19hZWFiaV9yZWFkX3RwIHByZXNlcnZlcyB0aGUgcmVnaXN0ZXJzIHIxLXIzLg0KK2xldCBpc0NhbGwgPSAxLA0KKyAgRGVmcyA9IFtSMCwgUjEyLCBMUiwgQ1BTUl0gaW4gew0KKyAgZGVmIFRQc29mdCA6IEFCWEk8MGIxMDExLCAob3V0cyksIChpbnMpLCBJSUNfQnIsDQorICAgICAgICAgICAgICAgImJsXHRfX2FlYWJpX3JlYWRfdHAiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IFIwLCBBUk10aHJlYWRfcG9pbnRlcildPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTSkxKIEV4Y2VwdGlvbiBoYW5kbGluZyBpbnRyaW5zaWNzDQorLy8gICBlaF9zamxqX3NldGptcCgpIGlzIGFuIGluc3RydWN0aW9uIHNlcXVlbmNlIHRvIHN0b3JlIHRoZSByZXR1cm4NCisvLyAgIGFkZHJlc3MgYW5kIHNhdmUgIzAgaW4gUjAgZm9yIHRoZSBub24tbG9uZ2ptcCBjYXNlLg0KKy8vICAgU2luY2UgYnkgaXRzIG5hdHVyZSB3ZSBtYXkgYmUgY29taW5nIGZyb20gc29tZSBvdGhlciBmdW5jdGlvbiB0byBnZXQNCisvLyAgIGhlcmUsIGFuZCB3ZSdyZSB1c2luZyB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uIHRvDQorLy8gICBzYXZlL3Jlc3RvcmUgcmVnaXN0ZXJzLCB3ZSBjYW4ndCBrZWVwIGFueXRoaW5nIGxpdmUgaW4gcmVncyBhY3Jvc3MNCisvLyAgIHRoZSBlaF9zamxqX3NldGptcCgpLCBlbHNlIGl0IHdpbGwgYWxtb3N0IGNlcnRhaW5seSBoYXZlIGJlZW4gdHJvbXBlZCB1cG9uDQorLy8gICB3aGVuIHdlIGdldCBoZXJlIGZyb20gYSBsb25nam1wKCkuIFdlIGZvcmNlIGV2ZXJ0aGluZyBvdXQgb2YgcmVnaXN0ZXJzDQorLy8gICBleGNlcHQgZm9yIG91ciBvd24gaW5wdXQgYnkgbGlzdGluZyB0aGUgcmVsZXZhbnQgcmVnaXN0ZXJzIGluIERlZnMuIEJ5DQorLy8gICBkb2luZyBzbywgd2UgYWxzbyBjYXVzZSB0aGUgcHJvbG9ndWUvZXBpbG9ndWUgY29kZSB0byBhY3RpdmVseSBwcmVzZXJ2ZQ0KKy8vICAgYWxsIG9mIHRoZSBjYWxsZWUtc2F2ZWQgcmVzZ2lzdGVycywgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdhbnQuDQorLy8gICBBIGNvbnN0YW50IHZhbHVlIGlzIHBhc3NlZCBpbiAkdmFsLCBhbmQgd2UgdXNlIHRoZSBsb2NhdGlvbiBhcyBhIHNjcmF0Y2guDQorbGV0IERlZnMgPQ0KKyAgWyBSMCwgIFIxLCAgUjIsICBSMywgIFI0LCAgUjUsICBSNiwgIFI3LCAgUjgsICBSOSwgIFIxMCwgUjExLCBSMTIsIExSLCAgRDAsDQorICAgIEQxLCAgRDIsICBEMywgIEQ0LCAgRDUsICBENiwgIEQ3LCAgRDgsICBEOSwgIEQxMCwgRDExLCBEMTIsIEQxMywgRDE0LCBEMTUsDQorICAgIEQxNiwgRDE3LCBEMTgsIEQxOSwgRDIwLCBEMjEsIEQyMiwgRDIzLCBEMjQsIEQyNSwgRDI2LCBEMjcsIEQyOCwgRDI5LCBEMzAsDQorICAgIEQzMSBdLCBoYXNTaWRlRWZmZWN0cyA9IDEsIGlzQmFycmllciA9IDEgaW4gew0KKyAgZGVmIEludF9laF9zamxqX3NldGptcCA6IFhJPChvdXRzKSwgKGlucyBHUFI6JHNyYywgR1BSOiR2YWwpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTW9kZU5vbmUsIFNpemVTcGVjaWFsLCBJbmRleE1vZGVOb25lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG8sIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRcdCR2YWwsIHBjLCAjOFx0JHs6Y29tbWVudH0gZWhfc2V0am1wIGJlZ2luXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyXHQkdmFsLCBbJHNyYywgIys0XVxuXHQiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdlx0cjAsICMwXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkXHRwYywgcGMsICMwXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92XHRyMCwgIzEgJHs6Y29tbWVudH0gZWhfc2V0am1wIGVuZCIsICIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMCwgKEFSTWVoX3NqbGpfc2V0am1wIEdQUjokc3JjLCBHUFI6JHZhbCkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBIYXNWRlAyXT47DQorfQ0KKw0KK2xldCBEZWZzID0NCisgIFsgUjAsICBSMSwgIFIyLCAgUjMsICBSNCwgIFI1LCAgUjYsICBSNywgIFI4LCAgUjksICBSMTAsIFIxMSwgUjEyLCBMUiBdLA0KKyAgaGFzU2lkZUVmZmVjdHMgPSAxLCBpc0JhcnJpZXIgPSAxIGluIHsNCisgIGRlZiBJbnRfZWhfc2psal9zZXRqbXBfbm9mcCA6IFhJPChvdXRzKSwgKGlucyBHUFI6JHNyYywgR1BSOiR2YWwpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVOb25lLCBTaXplU3BlY2lhbCwgSW5kZXhNb2RlTm9uZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkbywgTm9JdGluZXJhcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFx0JHZhbCwgcGMsICM4XG4gJHs6Y29tbWVudH0gZWhfc2V0am1wIGJlZ2luXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyXHQkdmFsLCBbJHNyYywgIys0XVxuXHQiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdlx0cjAsICMwXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkXHRwYywgcGMsICMwXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92XHRyMCwgIzEgJHs6Y29tbWVudH0gZWhfc2V0am1wIGVuZCIsICIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMCwgKEFSTWVoX3NqbGpfc2V0am1wIEdQUjokc3JjLCBHUFI6JHZhbCkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIE5vVkZQXT47DQorfQ0KKw0KKy8vIEZJWE1FOiBOb24tRGFyd2luIHZlcnNpb24ocykNCitsZXQgaXNCYXJyaWVyID0gMSwgaGFzU2lkZUVmZmVjdHMgPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLA0KKyAgICBEZWZzID0gWyBSNywgTFIsIFNQIF0gaW4gew0KK2RlZiBJbnRfZWhfc2psal9sb25nam1wIDogWEk8KG91dHMpLCAoaW5zIEdQUjokc3JjLCBHUFI6JHNjcmF0Y2gpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVOb25lLCBTaXplU3BlY2lhbCwgSW5kZXhNb2RlTm9uZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkbywgTm9JdGluZXJhcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGRyXHRzcCwgWyRzcmMsICM4XVxuXHQiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGRyXHQkc2NyYXRjaCwgWyRzcmMsICM0XVxuXHQiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGRyXHRyNywgWyRzcmNdXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieFx0JHNjcmF0Y2giLCAiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhBUk1laF9zamxqX2xvbmdqbXAgR1BSOiRzcmMsIEdQUjokc2NyYXRjaCldPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSXNEYXJ3aW5dPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBOb24tSW5zdHJ1Y3Rpb24gUGF0dGVybnMNCisvLw0KKw0KKy8vIExhcmdlIGltbWVkaWF0ZSBoYW5kbGluZy4NCisNCisvLyBUd28gcGllY2Ugc29faW1tcy4NCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbg0KK2RlZiBNT1ZpMnBpZWNlcyA6IEFJMXgyPChvdXRzIEdQUjokZHN0KSwgKGlucyBzb19pbW0ycGFydDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvLCBJSUNfaU1PVmksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJtb3YiLCAiXHQkZHN0LCAkc3JjIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIHNvX2ltbTJwYXJ0OiRzcmMpXT4sDQorICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBOb1Y2VDJdPjsNCisNCitkZWYgOiBBUk1QYXQ8KG9yIEdQUjokTEhTLCBzb19pbW0ycGFydDokUkhTKSwNCisgICAgICAgICAgICAgKE9SUnJpIChPUlJyaSBHUFI6JExIUywgKHNvX2ltbTJwYXJ0XzEgaW1tOiRSSFMpKSwNCisgICAgICAgICAgICAgICAgICAgIChzb19pbW0ycGFydF8yIGltbTokUkhTKSk+Ow0KK2RlZiA6IEFSTVBhdDwoeG9yIEdQUjokTEhTLCBzb19pbW0ycGFydDokUkhTKSwNCisgICAgICAgICAgICAgKEVPUnJpIChFT1JyaSBHUFI6JExIUywgKHNvX2ltbTJwYXJ0XzEgaW1tOiRSSFMpKSwNCisgICAgICAgICAgICAgICAgICAgIChzb19pbW0ycGFydF8yIGltbTokUkhTKSk+Ow0KK2RlZiA6IEFSTVBhdDwoYWRkIEdQUjokTEhTLCBzb19pbW0ycGFydDokUkhTKSwNCisgICAgICAgICAgICAgKEFERHJpIChBRERyaSBHUFI6JExIUywgKHNvX2ltbTJwYXJ0XzEgaW1tOiRSSFMpKSwNCisgICAgICAgICAgICAgICAgICAgIChzb19pbW0ycGFydF8yIGltbTokUkhTKSk+Ow0KK2RlZiA6IEFSTVBhdDwoYWRkIEdQUjokTEhTLCBzb19uZWdfaW1tMnBhcnQ6JFJIUyksDQorICAgICAgICAgICAgIChTVUJyaSAoU1VCcmkgR1BSOiRMSFMsIChzb19uZWdfaW1tMnBhcnRfMSBpbW06JFJIUykpLA0KKyAgICAgICAgICAgICAgICAgICAgKHNvX25lZ19pbW0ycGFydF8yIGltbTokUkhTKSk+Ow0KKw0KKy8vIDMyLWJpdCBpbW1lZGlhdGUgdXNpbmcgbW92dyArIG1vdnQuDQorLy8gVGhpcyBpcyBhIHNpbmdsZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24sIHRoZSBiZW5lZml0IGlzIHRoYXQgaXQgY2FuIGJlIHJlbWF0J2QNCisvLyBhcyBhIHNpbmdsZSB1bml0IGluc3RlYWQgb2YgaGF2aW5nIHRvIGhhbmRsZSByZWcgaW5wdXRzLg0KKy8vIEZJWE1FOiBSZW1vdmUgdGhpcyB3aGVuIHdlIGNhbiBkbyBnZW5lcmFsaXplZCByZW1hdC4NCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbg0KK2RlZiBNT1ZpMzJpbW0gOiBBSTF4Mjwob3V0cyBHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRzcmMpLCBQc2V1ZG8sIElJQ19pTU9WaSwNCisgICAgICAgICAgICAgICAgICAgIm1vdnciLCAiXHQkZHN0LCAke3NyYzpsbzE2fVxuXHRtb3Z0JHtwfVx0JGRzdCwgJHtzcmM6aGkxNn0iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoaTMyIGltbTokc3JjKSldPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y2VDJdPjsNCisNCisvLyBDb25zdGFudFBvb2wsIEdsb2JhbEFkZHJlc3MsIGFuZCBKdW1wVGFibGUNCitkZWYgOiBBUk1QYXQ8KEFSTVdyYXBwZXIgIHRnbG9iYWxhZGRyIDokZHN0KSwgKExFQXBjcmVsIHRnbG9iYWxhZGRyIDokZHN0KT4sDQorICAgICAgICAgICAgUmVxdWlyZXM8W0lzQVJNLCBEb250VXNlTW92dF0+Ow0KK2RlZiA6IEFSTVBhdDwoQVJNV3JhcHBlciAgdGNvbnN0cG9vbCAgOiRkc3QpLCAoTEVBcGNyZWwgdGNvbnN0cG9vbCAgOiRkc3QpPjsNCitkZWYgOiBBUk1QYXQ8KEFSTVdyYXBwZXIgIHRnbG9iYWxhZGRyIDokZHN0KSwgKE1PVmkzMmltbSB0Z2xvYmFsYWRkciA6JGRzdCk+LA0KKyAgICAgICAgICAgIFJlcXVpcmVzPFtJc0FSTSwgVXNlTW92dF0+Ow0KK2RlZiA6IEFSTVBhdDwoQVJNV3JhcHBlckpUIHRqdW1wdGFibGU6JGRzdCwgaW1tOiRpZCksDQorICAgICAgICAgICAgIChMRUFwY3JlbEpUIHRqdW1wdGFibGU6JGRzdCwgaW1tOiRpZCk+Ow0KKw0KKy8vIFRPRE86IGFkZCxzdWIsYW5kLCAzLWluc3RyIGZvcm1zPw0KKw0KKy8vIFRhaWwgY2FsbHMNCitkZWYgOiBBUk1QYXQ8KEFSTXRjcmV0IHRjR1BSOiRkc3QpLA0KKyAgICAgICAgICAoVENSRVRVUk5yaSB0Y0dQUjokZHN0KT4sIFJlcXVpcmVzPFtJc0Rhcndpbl0+Ow0KKw0KK2RlZiA6IEFSTVBhdDwoQVJNdGNyZXQgKGkzMiB0Z2xvYmFsYWRkcjokZHN0KSksDQorICAgICAgICAgIChUQ1JFVFVSTmRpIHRleHRlcm5hbHN5bTokZHN0KT4sIFJlcXVpcmVzPFtJc0Rhcndpbl0+Ow0KKw0KK2RlZiA6IEFSTVBhdDwoQVJNdGNyZXQgKGkzMiB0ZXh0ZXJuYWxzeW06JGRzdCkpLA0KKyAgICAgICAgICAoVENSRVRVUk5kaSB0ZXh0ZXJuYWxzeW06JGRzdCk+LCBSZXF1aXJlczxbSXNEYXJ3aW5dPjsNCisNCitkZWYgOiBBUk1QYXQ8KEFSTXRjcmV0IHRjR1BSOiRkc3QpLA0KKyAgICAgICAgICAoVENSRVRVUk5yaU5EIHRjR1BSOiRkc3QpPiwgUmVxdWlyZXM8W0lzTm90RGFyd2luXT47DQorDQorZGVmIDogQVJNUGF0PChBUk10Y3JldCAoaTMyIHRnbG9iYWxhZGRyOiRkc3QpKSwNCisgICAgICAgICAgKFRDUkVUVVJOZGlORCB0ZXh0ZXJuYWxzeW06JGRzdCk+LCBSZXF1aXJlczxbSXNOb3REYXJ3aW5dPjsNCisNCitkZWYgOiBBUk1QYXQ8KEFSTXRjcmV0IChpMzIgdGV4dGVybmFsc3ltOiRkc3QpKSwNCisgICAgICAgICAgKFRDUkVUVVJOZGlORCB0ZXh0ZXJuYWxzeW06JGRzdCk+LCBSZXF1aXJlczxbSXNOb3REYXJ3aW5dPjsNCisNCisvLyBEaXJlY3QgY2FsbHMNCitkZWYgOiBBUk1QYXQ8KEFSTWNhbGwgdGV4dGVybmFsc3ltOiRmdW5jKSwgKEJMIHRleHRlcm5hbHN5bTokZnVuYyk+LA0KKyAgICAgIFJlcXVpcmVzPFtJc0FSTSwgSXNOb3REYXJ3aW5dPjsNCitkZWYgOiBBUk1QYXQ8KEFSTWNhbGwgdGV4dGVybmFsc3ltOiRmdW5jKSwgKEJMcjkgdGV4dGVybmFsc3ltOiRmdW5jKT4sDQorICAgICAgUmVxdWlyZXM8W0lzQVJNLCBJc0Rhcndpbl0+Ow0KKw0KKy8vIHpleHRsb2FkIGkxIC0+IHpleHRsb2FkIGk4DQorZGVmIDogQVJNUGF0PCh6ZXh0bG9hZGkxIGFkZHJtb2RlMjokYWRkciksICAoTERSQiBhZGRybW9kZTI6JGFkZHIpPjsNCisNCisvLyBleHRsb2FkIC0+IHpleHRsb2FkDQorZGVmIDogQVJNUGF0PChleHRsb2FkaTEgIGFkZHJtb2RlMjokYWRkciksICAoTERSQiBhZGRybW9kZTI6JGFkZHIpPjsNCitkZWYgOiBBUk1QYXQ8KGV4dGxvYWRpOCAgYWRkcm1vZGUyOiRhZGRyKSwgIChMRFJCIGFkZHJtb2RlMjokYWRkcik+Ow0KK2RlZiA6IEFSTVBhdDwoZXh0bG9hZGkxNiBhZGRybW9kZTM6JGFkZHIpLCAgKExEUkggYWRkcm1vZGUzOiRhZGRyKT47DQorDQorZGVmIDogQVJNUGF0PChleHRsb2FkaTggIGFkZHJtb2RlcGM6JGFkZHIpLCAoUElDTERSQiBhZGRybW9kZXBjOiRhZGRyKT47DQorZGVmIDogQVJNUGF0PChleHRsb2FkaTE2IGFkZHJtb2RlcGM6JGFkZHIpLCAoUElDTERSSCBhZGRybW9kZXBjOiRhZGRyKT47DQorDQorLy8gc211bCogYW5kIHNtbGEqDQorZGVmIDogQVJNVjVURVBhdDwobXVsIChzcmEgKHNobCBHUFI6JGEsIChpMzIgMTYpKSwgKGkzMiAxNikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoc3JhIChzaGwgR1BSOiRiLCAoaTMyIDE2KSksIChpMzIgMTYpKSksDQorICAgICAgICAgICAgICAgICAoU01VTEJCIEdQUjokYSwgR1BSOiRiKT47DQorZGVmIDogQVJNVjVURVBhdDwobXVsIHNleHRfMTZfbm9kZTokYSwgc2V4dF8xNl9ub2RlOiRiKSwNCisgICAgICAgICAgICAgICAgIChTTVVMQkIgR1BSOiRhLCBHUFI6JGIpPjsNCitkZWYgOiBBUk1WNVRFUGF0PChtdWwgKHNyYSAoc2hsIEdQUjokYSwgKGkzMiAxNikpLCAoaTMyIDE2KSksDQorICAgICAgICAgICAgICAgICAgICAgIChzcmEgR1BSOiRiLCAoaTMyIDE2KSkpLA0KKyAgICAgICAgICAgICAgICAgKFNNVUxCVCBHUFI6JGEsIEdQUjokYik+Ow0KK2RlZiA6IEFSTVY1VEVQYXQ8KG11bCBzZXh0XzE2X25vZGU6JGEsIChzcmEgR1BSOiRiLCAoaTMyIDE2KSkpLA0KKyAgICAgICAgICAgICAgICAgKFNNVUxCVCBHUFI6JGEsIEdQUjokYik+Ow0KK2RlZiA6IEFSTVY1VEVQYXQ8KG11bCAoc3JhIEdQUjokYSwgKGkzMiAxNikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoc3JhIChzaGwgR1BSOiRiLCAoaTMyIDE2KSksIChpMzIgMTYpKSksDQorICAgICAgICAgICAgICAgICAoU01VTFRCIEdQUjokYSwgR1BSOiRiKT47DQorZGVmIDogQVJNVjVURVBhdDwobXVsIChzcmEgR1BSOiRhLCAoaTMyIDE2KSksIHNleHRfMTZfbm9kZTokYiksDQorICAgICAgICAgICAgICAgIChTTVVMVEIgR1BSOiRhLCBHUFI6JGIpPjsNCitkZWYgOiBBUk1WNVRFUGF0PChzcmEgKG11bCBHUFI6JGEsIChzcmEgKHNobCBHUFI6JGIsIChpMzIgMTYpKSwgKGkzMiAxNikpKSwNCisgICAgICAgICAgICAgICAgICAgICAgKGkzMiAxNikpLA0KKyAgICAgICAgICAgICAgICAgKFNNVUxXQiBHUFI6JGEsIEdQUjokYik+Ow0KK2RlZiA6IEFSTVY1VEVQYXQ8KHNyYSAobXVsIEdQUjokYSwgc2V4dF8xNl9ub2RlOiRiKSwgKGkzMiAxNikpLA0KKyAgICAgICAgICAgICAgICAgKFNNVUxXQiBHUFI6JGEsIEdQUjokYik+Ow0KKw0KK2RlZiA6IEFSTVY1VEVQYXQ8KGFkZCBHUFI6JGFjYywNCisgICAgICAgICAgICAgICAgICAgICAgKG11bCAoc3JhIChzaGwgR1BSOiRhLCAoaTMyIDE2KSksIChpMzIgMTYpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JhIChzaGwgR1BSOiRiLCAoaTMyIDE2KSksIChpMzIgMTYpKSkpLA0KKyAgICAgICAgICAgICAgICAgKFNNTEFCQiBHUFI6JGEsIEdQUjokYiwgR1BSOiRhY2MpPjsNCitkZWYgOiBBUk1WNVRFUGF0PChhZGQgR1BSOiRhY2MsDQorICAgICAgICAgICAgICAgICAgICAgIChtdWwgc2V4dF8xNl9ub2RlOiRhLCBzZXh0XzE2X25vZGU6JGIpKSwNCisgICAgICAgICAgICAgICAgIChTTUxBQkIgR1BSOiRhLCBHUFI6JGIsIEdQUjokYWNjKT47DQorZGVmIDogQVJNVjVURVBhdDwoYWRkIEdQUjokYWNjLA0KKyAgICAgICAgICAgICAgICAgICAgICAobXVsIChzcmEgKHNobCBHUFI6JGEsIChpMzIgMTYpKSwgKGkzMiAxNikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmEgR1BSOiRiLCAoaTMyIDE2KSkpKSwNCisgICAgICAgICAgICAgICAgIChTTUxBQlQgR1BSOiRhLCBHUFI6JGIsIEdQUjokYWNjKT47DQorZGVmIDogQVJNVjVURVBhdDwoYWRkIEdQUjokYWNjLA0KKyAgICAgICAgICAgICAgICAgICAgICAobXVsIHNleHRfMTZfbm9kZTokYSwgKHNyYSBHUFI6JGIsIChpMzIgMTYpKSkpLA0KKyAgICAgICAgICAgICAgICAgKFNNTEFCVCBHUFI6JGEsIEdQUjokYiwgR1BSOiRhY2MpPjsNCitkZWYgOiBBUk1WNVRFUGF0PChhZGQgR1BSOiRhY2MsDQorICAgICAgICAgICAgICAgICAgICAgIChtdWwgKHNyYSBHUFI6JGEsIChpMzIgMTYpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JhIChzaGwgR1BSOiRiLCAoaTMyIDE2KSksIChpMzIgMTYpKSkpLA0KKyAgICAgICAgICAgICAgICAgKFNNTEFUQiBHUFI6JGEsIEdQUjokYiwgR1BSOiRhY2MpPjsNCitkZWYgOiBBUk1WNVRFUGF0PChhZGQgR1BSOiRhY2MsDQorICAgICAgICAgICAgICAgICAgICAgIChtdWwgKHNyYSBHUFI6JGEsIChpMzIgMTYpKSwgc2V4dF8xNl9ub2RlOiRiKSksDQorICAgICAgICAgICAgICAgICAoU01MQVRCIEdQUjokYSwgR1BSOiRiLCBHUFI6JGFjYyk+Ow0KK2RlZiA6IEFSTVY1VEVQYXQ8KGFkZCBHUFI6JGFjYywNCisgICAgICAgICAgICAgICAgICAgICAgKHNyYSAobXVsIEdQUjokYSwgKHNyYSAoc2hsIEdQUjokYiwgKGkzMiAxNikpLCAoaTMyIDE2KSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIgMTYpKSksDQorICAgICAgICAgICAgICAgICAoU01MQVdCIEdQUjokYSwgR1BSOiRiLCBHUFI6JGFjYyk+Ow0KK2RlZiA6IEFSTVY1VEVQYXQ8KGFkZCBHUFI6JGFjYywNCisgICAgICAgICAgICAgICAgICAgICAgKHNyYSAobXVsIEdQUjokYSwgc2V4dF8xNl9ub2RlOiRiKSwgKGkzMiAxNikpKSwNCisgICAgICAgICAgICAgICAgIChTTUxBV0IgR1BSOiRhLCBHUFI6JGIsIEdQUjokYWNjKT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBUaHVtYiBTdXBwb3J0DQorLy8NCisNCitpbmNsdWRlICJBUk1JbnN0clRodW1iLnRkIg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gVGh1bWIyIFN1cHBvcnQNCisvLw0KKw0KK2luY2x1ZGUgIkFSTUluc3RyVGh1bWIyLnRkIg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRmxvYXRpbmcgUG9pbnQgU3VwcG9ydA0KKy8vDQorDQoraW5jbHVkZSAiQVJNSW5zdHJWRlAudGQiDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBBZHZhbmNlZCBTSU1EIChORU9OKSBTdXBwb3J0DQorLy8NCisNCitpbmNsdWRlICJBUk1JbnN0ck5FT04udGQiDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBDb3Byb2Nlc3NvciBJbnN0cnVjdGlvbnMuICBGb3IgZGlzYXNzZW1ibHkgb25seS4NCisvLw0KKw0KK2RlZiBDRFAgOiBBQkk8MGIxMTEwLCAob3V0cyksIChpbnMgbm9oYXNoX2ltbTokY29wLCBpMzJpbW06JG9wYzEsDQorICAgICAgICAgICAgbm9oYXNoX2ltbTokQ1JkLCBub2hhc2hfaW1tOiRDUm4sIG5vaGFzaF9pbW06JENSbSwgaTMyaW1tOiRvcGMyKSwNCisgICAgICAgICAgICBOb0l0aW5lcmFyeSwgImNkcCIsICJcdHAkY29wLCAkb3BjMSwgY3IkQ1JkLCBjciRDUm4sIGNyJENSbSwgJG9wYzIiLA0KKyAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHs0fSA9IDA7DQorfQ0KKw0KK2RlZiBDRFAyIDogQUJYSTwwYjExMTAsIChvdXRzKSwgKGlucyBub2hhc2hfaW1tOiRjb3AsIGkzMmltbTokb3BjMSwNCisgICAgICAgICAgICAgICBub2hhc2hfaW1tOiRDUmQsIG5vaGFzaF9pbW06JENSbiwgbm9oYXNoX2ltbTokQ1JtLCBpMzJpbW06JG9wYzIpLA0KKyAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAiY2RwMlx0cCRjb3AsICRvcGMxLCBjciRDUmQsIGNyJENSbiwgY3IkQ1JtLCAkb3BjMiIsDQorICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHszMS0yOH0gPSAwYjExMTE7DQorICBsZXQgSW5zdHs0fSA9IDA7DQorfQ0KKw0KK2NsYXNzIEFDSTxkYWcgb29wcywgZGFnIGlvcHMsIHN0cmluZyBvcGMsIHN0cmluZyBhc20+DQorICA6IEk8b29wcywgaW9wcywgQWRkck1vZGVOb25lLCBTaXplNEJ5dGVzLCBJbmRleE1vZGVOb25lLCBCckZybSwgTm9JdGluZXJhcnksDQorICAgICAgb3BjLCBhc20sICIiLCBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsNCisgIGxldCBJbnN0ezI3LTI1fSA9IDBiMTEwOw0KK30NCisNCittdWx0aWNsYXNzIExkU3RDb3A8Yml0czw0PiBvcDMxXzI4LCBiaXQgbG9hZCwgc3RyaW5nIG9wYz4gew0KKw0KKyAgZGVmIF9PRkZTRVQgOiBBQ0k8KG91dHMpLA0KKyAgICAgIChpbnMgbm9oYXNoX2ltbTokY29wLCBub2hhc2hfaW1tOiRDUmQsIGFkZHJtb2RlMjokYWRkciksDQorICAgICAgb3BjLCAiXHRwJGNvcCwgY3IkQ1JkLCAkYWRkciI+IHsNCisgICAgbGV0IEluc3R7MzEtMjh9ID0gb3AzMV8yODsNCisgICAgbGV0IEluc3R7MjR9ID0gMTsgLy8gUCA9IDENCisgICAgbGV0IEluc3R7MjF9ID0gMDsgLy8gVyA9IDANCisgICAgbGV0IEluc3R7MjJ9ID0gMDsgLy8gRCA9IDANCisgICAgbGV0IEluc3R7MjB9ID0gbG9hZDsNCisgIH0NCisNCisgIGRlZiBfUFJFIDogQUNJPChvdXRzKSwNCisgICAgICAoaW5zIG5vaGFzaF9pbW06JGNvcCwgbm9oYXNoX2ltbTokQ1JkLCBhZGRybW9kZTI6JGFkZHIpLA0KKyAgICAgIG9wYywgIlx0cCRjb3AsIGNyJENSZCwgJGFkZHIhIj4gew0KKyAgICBsZXQgSW5zdHszMS0yOH0gPSBvcDMxXzI4Ow0KKyAgICBsZXQgSW5zdHsyNH0gPSAxOyAvLyBQID0gMQ0KKyAgICBsZXQgSW5zdHsyMX0gPSAxOyAvLyBXID0gMQ0KKyAgICBsZXQgSW5zdHsyMn0gPSAwOyAvLyBEID0gMA0KKyAgICBsZXQgSW5zdHsyMH0gPSBsb2FkOw0KKyAgfQ0KKw0KKyAgZGVmIF9QT1NUIDogQUNJPChvdXRzKSwNCisgICAgICAoaW5zIG5vaGFzaF9pbW06JGNvcCwgbm9oYXNoX2ltbTokQ1JkLCBHUFI6JGJhc2UsIGFtMm9mZnNldDokb2Zmc2V0KSwNCisgICAgICBvcGMsICJcdHAkY29wLCBjciRDUmQsIFskYmFzZV0sICRvZmZzZXQiPiB7DQorICAgIGxldCBJbnN0ezMxLTI4fSA9IG9wMzFfMjg7DQorICAgIGxldCBJbnN0ezI0fSA9IDA7IC8vIFAgPSAwDQorICAgIGxldCBJbnN0ezIxfSA9IDE7IC8vIFcgPSAxDQorICAgIGxldCBJbnN0ezIyfSA9IDA7IC8vIEQgPSAwDQorICAgIGxldCBJbnN0ezIwfSA9IGxvYWQ7DQorICB9DQorDQorICBkZWYgX09QVElPTiA6IEFDSTwob3V0cyksDQorICAgICAgKGlucyBub2hhc2hfaW1tOiRjb3AsIG5vaGFzaF9pbW06JENSZCwgR1BSOiRiYXNlLCBpMzJpbW06JG9wdGlvbiksDQorICAgICAgb3BjLCAiXHRwJGNvcCwgY3IkQ1JkLCBbJGJhc2VdLCAkb3B0aW9uIj4gew0KKyAgICBsZXQgSW5zdHszMS0yOH0gPSBvcDMxXzI4Ow0KKyAgICBsZXQgSW5zdHsyNH0gPSAwOyAvLyBQID0gMA0KKyAgICBsZXQgSW5zdHsyM30gPSAxOyAvLyBVID0gMQ0KKyAgICBsZXQgSW5zdHsyMX0gPSAwOyAvLyBXID0gMA0KKyAgICBsZXQgSW5zdHsyMn0gPSAwOyAvLyBEID0gMA0KKyAgICBsZXQgSW5zdHsyMH0gPSBsb2FkOw0KKyAgfQ0KKw0KKyAgZGVmIExfT0ZGU0VUIDogQUNJPChvdXRzKSwNCisgICAgICAoaW5zIG5vaGFzaF9pbW06JGNvcCwgbm9oYXNoX2ltbTokQ1JkLCBhZGRybW9kZTI6JGFkZHIpLA0KKyAgICAgICFzdHJjb25jYXQob3BjLCAibCIpLCAiXHRwJGNvcCwgY3IkQ1JkLCAkYWRkciI+IHsNCisgICAgbGV0IEluc3R7MzEtMjh9ID0gb3AzMV8yODsNCisgICAgbGV0IEluc3R7MjR9ID0gMTsgLy8gUCA9IDENCisgICAgbGV0IEluc3R7MjF9ID0gMDsgLy8gVyA9IDANCisgICAgbGV0IEluc3R7MjJ9ID0gMTsgLy8gRCA9IDENCisgICAgbGV0IEluc3R7MjB9ID0gbG9hZDsNCisgIH0NCisNCisgIGRlZiBMX1BSRSA6IEFDSTwob3V0cyksDQorICAgICAgKGlucyBub2hhc2hfaW1tOiRjb3AsIG5vaGFzaF9pbW06JENSZCwgYWRkcm1vZGUyOiRhZGRyKSwNCisgICAgICAhc3RyY29uY2F0KG9wYywgImwiKSwgIlx0cCRjb3AsIGNyJENSZCwgJGFkZHIhIj4gew0KKyAgICBsZXQgSW5zdHszMS0yOH0gPSBvcDMxXzI4Ow0KKyAgICBsZXQgSW5zdHsyNH0gPSAxOyAvLyBQID0gMQ0KKyAgICBsZXQgSW5zdHsyMX0gPSAxOyAvLyBXID0gMQ0KKyAgICBsZXQgSW5zdHsyMn0gPSAxOyAvLyBEID0gMQ0KKyAgICBsZXQgSW5zdHsyMH0gPSBsb2FkOw0KKyAgfQ0KKw0KKyAgZGVmIExfUE9TVCA6IEFDSTwob3V0cyksDQorICAgICAgKGlucyBub2hhc2hfaW1tOiRjb3AsIG5vaGFzaF9pbW06JENSZCwgR1BSOiRiYXNlLCBhbTJvZmZzZXQ6JG9mZnNldCksDQorICAgICAgIXN0cmNvbmNhdChvcGMsICJsIiksICJcdHAkY29wLCBjciRDUmQsIFskYmFzZV0sICRvZmZzZXQiPiB7DQorICAgIGxldCBJbnN0ezMxLTI4fSA9IG9wMzFfMjg7DQorICAgIGxldCBJbnN0ezI0fSA9IDA7IC8vIFAgPSAwDQorICAgIGxldCBJbnN0ezIxfSA9IDE7IC8vIFcgPSAxDQorICAgIGxldCBJbnN0ezIyfSA9IDE7IC8vIEQgPSAxDQorICAgIGxldCBJbnN0ezIwfSA9IGxvYWQ7DQorICB9DQorDQorICBkZWYgTF9PUFRJT04gOiBBQ0k8KG91dHMpLA0KKyAgICAgIChpbnMgbm9oYXNoX2ltbTokY29wLCBub2hhc2hfaW1tOiRDUmQsIEdQUjokYmFzZSwgbm9oYXNoX2ltbTokb3B0aW9uKSwNCisgICAgICAhc3RyY29uY2F0KG9wYywgImwiKSwgIlx0cCRjb3AsIGNyJENSZCwgWyRiYXNlXSwgJG9wdGlvbiI+IHsNCisgICAgbGV0IEluc3R7MzEtMjh9ID0gb3AzMV8yODsNCisgICAgbGV0IEluc3R7MjR9ID0gMDsgLy8gUCA9IDANCisgICAgbGV0IEluc3R7MjN9ID0gMTsgLy8gVSA9IDENCisgICAgbGV0IEluc3R7MjF9ID0gMDsgLy8gVyA9IDANCisgICAgbGV0IEluc3R7MjJ9ID0gMTsgLy8gRCA9IDENCisgICAgbGV0IEluc3R7MjB9ID0gbG9hZDsNCisgIH0NCit9DQorDQorZGVmbSBMREMgIDogTGRTdENvcDx7Pyw/LD8sP30sIDEsICJsZGMiPjsNCitkZWZtIExEQzIgOiBMZFN0Q29wPDBiMTExMSwgICAgMSwgImxkYzIiPjsNCitkZWZtIFNUQyAgOiBMZFN0Q29wPHs/LD8sPyw/fSwgMCwgInN0YyI+Ow0KK2RlZm0gU1RDMiA6IExkU3RDb3A8MGIxMTExLCAgICAwLCAic3RjMiI+Ow0KKw0KK2RlZiBNQ1IgOiBBQkk8MGIxMTEwLCAob3V0cyksIChpbnMgbm9oYXNoX2ltbTokY29wLCBpMzJpbW06JG9wYzEsDQorICAgICAgICAgICAgICBHUFI6JFJ0LCBub2hhc2hfaW1tOiRDUm4sIG5vaGFzaF9pbW06JENSbSwgaTMyaW1tOiRvcGMyKSwNCisgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAibWNyIiwgIlx0cCRjb3AsICRvcGMxLCAkUnQsIGNyJENSbiwgY3IkQ1JtLCAkb3BjMiIsDQorICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsNCisgIGxldCBJbnN0ezIwfSA9IDA7DQorICBsZXQgSW5zdHs0fSA9IDE7DQorfQ0KKw0KK2RlZiBNQ1IyIDogQUJYSTwwYjExMTAsIChvdXRzKSwgKGlucyBub2hhc2hfaW1tOiRjb3AsIGkzMmltbTokb3BjMSwNCisgICAgICAgICAgICAgICAgR1BSOiRSdCwgbm9oYXNoX2ltbTokQ1JuLCBub2hhc2hfaW1tOiRDUm0sIGkzMmltbTokb3BjMiksDQorICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAibWNyMlx0cCRjb3AsICRvcGMxLCAkUnQsIGNyJENSbiwgY3IkQ1JtLCAkb3BjMiIsDQorICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MzEtMjh9ID0gMGIxMTExOw0KKyAgbGV0IEluc3R7MjB9ID0gMDsNCisgIGxldCBJbnN0ezR9ID0gMTsNCit9DQorDQorZGVmIE1SQyA6IEFCSTwwYjExMTAsIChvdXRzKSwgKGlucyBub2hhc2hfaW1tOiRjb3AsIGkzMmltbTokb3BjMSwNCisgICAgICAgICAgICAgIEdQUjokUnQsIG5vaGFzaF9pbW06JENSbiwgbm9oYXNoX2ltbTokQ1JtLCBpMzJpbW06JG9wYzIpLA0KKyAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJtcmMiLCAiXHRwJGNvcCwgJG9wYzEsICRSdCwgY3IkQ1JuLCBjciRDUm0sICRvcGMyIiwNCisgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MjB9ID0gMTsNCisgIGxldCBJbnN0ezR9ID0gMTsNCit9DQorDQorZGVmIE1SQzIgOiBBQlhJPDBiMTExMCwgKG91dHMpLCAoaW5zIG5vaGFzaF9pbW06JGNvcCwgaTMyaW1tOiRvcGMxLA0KKyAgICAgICAgICAgICAgICBHUFI6JFJ0LCBub2hhc2hfaW1tOiRDUm4sIG5vaGFzaF9pbW06JENSbSwgaTMyaW1tOiRvcGMyKSwNCisgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJtcmMyXHRwJGNvcCwgJG9wYzEsICRSdCwgY3IkQ1JuLCBjciRDUm0sICRvcGMyIiwNCisgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHszMS0yOH0gPSAwYjExMTE7DQorICBsZXQgSW5zdHsyMH0gPSAxOw0KKyAgbGV0IEluc3R7NH0gPSAxOw0KK30NCisNCitkZWYgTUNSUiA6IEFCSTwwYjExMDAsIChvdXRzKSwgKGlucyBub2hhc2hfaW1tOiRjb3AsIGkzMmltbTokb3BjLA0KKyAgICAgICAgICAgICAgIEdQUjokUnQsIEdQUjokUnQyLCBub2hhc2hfaW1tOiRDUm0pLA0KKyAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAibWNyciIsICJcdHAkY29wLCAkb3BjLCAkUnQsICRSdDIsIGNyJENSbSIsDQorICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyMy0yMH0gPSAwYjAxMDA7DQorfQ0KKw0KK2RlZiBNQ1JSMiA6IEFCWEk8MGIxMTAwLCAob3V0cyksIChpbnMgbm9oYXNoX2ltbTokY29wLCBpMzJpbW06JG9wYywNCisgICAgICAgICAgICAgICAgIEdQUjokUnQsIEdQUjokUnQyLCBub2hhc2hfaW1tOiRDUm0pLA0KKyAgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJtY3JyMlx0cCRjb3AsICRvcGMsICRSdCwgJFJ0MiwgY3IkQ1JtIiwNCisgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MzEtMjh9ID0gMGIxMTExOw0KKyAgbGV0IEluc3R7MjMtMjB9ID0gMGIwMTAwOw0KK30NCisNCitkZWYgTVJSQyA6IEFCSTwwYjExMDAsIChvdXRzKSwgKGlucyBub2hhc2hfaW1tOiRjb3AsIGkzMmltbTokb3BjLA0KKyAgICAgICAgICAgICAgIEdQUjokUnQsIEdQUjokUnQyLCBub2hhc2hfaW1tOiRDUm0pLA0KKyAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAibXJyYyIsICJcdHAkY29wLCAkb3BjLCAkUnQsICRSdDIsIGNyJENSbSIsDQorICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyMy0yMH0gPSAwYjAxMDE7DQorfQ0KKw0KK2RlZiBNUlJDMiA6IEFCWEk8MGIxMTAwLCAob3V0cyksIChpbnMgbm9oYXNoX2ltbTokY29wLCBpMzJpbW06JG9wYywNCisgICAgICAgICAgICAgICAgIEdQUjokUnQsIEdQUjokUnQyLCBub2hhc2hfaW1tOiRDUm0pLA0KKyAgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJtcnJjMlx0cCRjb3AsICRvcGMsICRSdCwgJFJ0MiwgY3IkQ1JtIiwNCisgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MzEtMjh9ID0gMGIxMTExOw0KKyAgbGV0IEluc3R7MjMtMjB9ID0gMGIwMTAxOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIE1vdmUgYmV0d2VlbiBzcGVjaWFsIHJlZ2lzdGVyIGFuZCBBUk0gY29yZSByZWdpc3RlciAtLSBmb3IgZGlzYXNzZW1ibHkgb25seQ0KKy8vDQorDQorZGVmIE1SUyA6IEFCSTwwYjAwMDEsKG91dHMgR1BSOiRkc3QpLChpbnMpLCBOb0l0aW5lcmFyeSwgIm1ycyIsICJcdCRkc3QsIGNwc3IiLA0KKyAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyMy0yMH0gPSAwYjAwMDA7DQorICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAwOw0KK30NCisNCitkZWYgTVJTc3lzIDogQUJJPDBiMDAwMSwob3V0cyBHUFI6JGRzdCksKGlucyksIE5vSXRpbmVyYXJ5LCJtcnMiLCJcdCRkc3QsIHNwc3IiLA0KKyAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyMy0yMH0gPSAwYjAxMDA7DQorICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAwOw0KK30NCisNCitkZWYgTVNSIDogQUJJPDBiMDAwMSwgKG91dHMpLCAoaW5zIEdQUjokc3JjLCBtc3JfbWFzazokbWFzayksIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgIm1zciIsICJcdGNwc3IkbWFzaywgJHNyYyIsDQorICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsNCisgIGxldCBJbnN0ezIzLTIwfSA9IDBiMDAxMDsNCisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDA7DQorfQ0KKw0KK2RlZiBNU1JpIDogQUJJPDBiMDAxMSwgKG91dHMpLCAoaW5zIHNvX2ltbTokYSwgbXNyX21hc2s6JG1hc2spLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICJtc3IiLCAiXHRjcHNyJG1hc2ssICRhIiwNCisgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7MjMtMjB9ID0gMGIwMDEwOw0KKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMDsNCit9DQorDQorZGVmIE1TUnN5cyA6IEFCSTwwYjAwMDEsIChvdXRzKSwgKGlucyBHUFI6JHNyYywgbXNyX21hc2s6JG1hc2spLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICJtc3IiLCAiXHRzcHNyJG1hc2ssICRzcmMiLA0KKyAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7DQorICBsZXQgSW5zdHsyMy0yMH0gPSAwYjAxMTA7DQorICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAwOw0KK30NCisNCitkZWYgTVNSc3lzaSA6IEFCSTwwYjAwMTEsIChvdXRzKSwgKGlucyBzb19pbW06JGEsIG1zcl9tYXNrOiRtYXNrKSwgTm9JdGluZXJhcnksDQorICAgICAgICAgICAgICAibXNyIiwgIlx0c3BzciRtYXNrLCAkYSIsDQorICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsNCisgIGxldCBJbnN0ezIzLTIwfSA9IDBiMDExMDsNCisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDA7DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUluc3RyTkVPTi50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUluc3RyTkVPTi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTVhMmZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSW5zdHJORU9OLnRkCkBAIC0wLDAgKzEsMzUxMyBAQAorLy89PT0tIEFSTUluc3RyTkVPTi50ZCAtIE5FT04gc3VwcG9ydCBmb3IgQVJNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBBUk0gTkVPTiBpbnN0cnVjdGlvbiBzZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE5FT04tc3BlY2lmaWMgREFHIE5vZGVzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIFNEVEFSTVZDTVAgICAgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFtTRFRDaXNJbnQ8MD4sIFNEVENpc1NhbWVBczwxLCAyPl0+OworCitkZWYgTkVPTnZjZXEgICAgICA6IFNETm9kZTwiQVJNSVNEOjpWQ0VRIiwgU0RUQVJNVkNNUD47CitkZWYgTkVPTnZjZ2UgICAgICA6IFNETm9kZTwiQVJNSVNEOjpWQ0dFIiwgU0RUQVJNVkNNUD47CitkZWYgTkVPTnZjZ2V1ICAgICA6IFNETm9kZTwiQVJNSVNEOjpWQ0dFVSIsIFNEVEFSTVZDTVA+OworZGVmIE5FT052Y2d0ICAgICAgOiBTRE5vZGU8IkFSTUlTRDo6VkNHVCIsIFNEVEFSTVZDTVA+OworZGVmIE5FT052Y2d0dSAgICAgOiBTRE5vZGU8IkFSTUlTRDo6VkNHVFUiLCBTRFRBUk1WQ01QPjsKK2RlZiBORU9OdnRzdCAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZUU1QiLCBTRFRBUk1WQ01QPjsKKworLy8gVHlwZXMgZm9yIHZlY3RvciBzaGlmdCBieSBpbW1lZGlhdGVzLiAgVGhlICJTSFgiIHZlcnNpb24gaXMgZm9yIGxvbmcgYW5kCisvLyBuYXJyb3cgb3BlcmF0aW9ucyB3aGVyZSB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB2ZWN0b3JzIGhhdmUgZGlmZmVyZW50CisvLyB0eXBlcy4gIFRoZSAiU0hJTlMiIHZlcnNpb24gaXMgZm9yIHNoaWZ0IGFuZCBpbnNlcnQgb3BlcmF0aW9ucy4KK2RlZiBTRFRBUk1WU0ggICAgIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzSW50PDA+LCBTRFRDaXNTYW1lQXM8MCwgMT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDIsIGkzMj5dPjsKK2RlZiBTRFRBUk1WU0hYICAgIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzSW50PDA+LCBTRFRDaXNJbnQ8MT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDIsIGkzMj5dPjsKK2RlZiBTRFRBUk1WU0hJTlMgIDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbU0RUQ2lzSW50PDA+LCBTRFRDaXNTYW1lQXM8MCwgMT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzVlQ8MywgaTMyPl0+OworCitkZWYgTkVPTnZzaGwgICAgICA6IFNETm9kZTwiQVJNSVNEOjpWU0hMIiwgU0RUQVJNVlNIPjsKK2RlZiBORU9OdnNocnMgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZTSFJzIiwgU0RUQVJNVlNIPjsKK2RlZiBORU9OdnNocnUgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZTSFJ1IiwgU0RUQVJNVlNIPjsKK2RlZiBORU9OdnNobGxzICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZTSExMcyIsIFNEVEFSTVZTSFg+OworZGVmIE5FT052c2hsbHUgICAgOiBTRE5vZGU8IkFSTUlTRDo6VlNITEx1IiwgU0RUQVJNVlNIWD47CitkZWYgTkVPTnZzaGxsaSAgICA6IFNETm9kZTwiQVJNSVNEOjpWU0hMTGkiLCBTRFRBUk1WU0hYPjsKK2RlZiBORU9OdnNocm4gICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZTSFJOIiwgU0RUQVJNVlNIWD47CisKK2RlZiBORU9OdnJzaHJzICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZSU0hScyIsIFNEVEFSTVZTSD47CitkZWYgTkVPTnZyc2hydSAgICA6IFNETm9kZTwiQVJNSVNEOjpWUlNIUnUiLCBTRFRBUk1WU0g+OworZGVmIE5FT052cnNocm4gICAgOiBTRE5vZGU8IkFSTUlTRDo6VlJTSFJOIiwgU0RUQVJNVlNIWD47CisKK2RlZiBORU9OdnFzaGxzICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZRU0hMcyIsIFNEVEFSTVZTSD47CitkZWYgTkVPTnZxc2hsdSAgICA6IFNETm9kZTwiQVJNSVNEOjpWUVNITHUiLCBTRFRBUk1WU0g+OworZGVmIE5FT052cXNobHN1ICAgOiBTRE5vZGU8IkFSTUlTRDo6VlFTSExzdSIsIFNEVEFSTVZTSD47CitkZWYgTkVPTnZxc2hybnMgICA6IFNETm9kZTwiQVJNSVNEOjpWUVNIUk5zIiwgU0RUQVJNVlNIWD47CitkZWYgTkVPTnZxc2hybnUgICA6IFNETm9kZTwiQVJNSVNEOjpWUVNIUk51IiwgU0RUQVJNVlNIWD47CitkZWYgTkVPTnZxc2hybnN1ICA6IFNETm9kZTwiQVJNSVNEOjpWUVNIUk5zdSIsIFNEVEFSTVZTSFg+OworCitkZWYgTkVPTnZxcnNocm5zICA6IFNETm9kZTwiQVJNSVNEOjpWUVJTSFJOcyIsIFNEVEFSTVZTSFg+OworZGVmIE5FT052cXJzaHJudSAgOiBTRE5vZGU8IkFSTUlTRDo6VlFSU0hSTnUiLCBTRFRBUk1WU0hYPjsKK2RlZiBORU9OdnFyc2hybnN1IDogU0ROb2RlPCJBUk1JU0Q6OlZRUlNIUk5zdSIsIFNEVEFSTVZTSFg+OworCitkZWYgTkVPTnZzbGkgICAgICA6IFNETm9kZTwiQVJNSVNEOjpWU0xJIiwgU0RUQVJNVlNISU5TPjsKK2RlZiBORU9OdnNyaSAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZTUkkiLCBTRFRBUk1WU0hJTlM+OworCitkZWYgU0RUQVJNVkdFVExOICA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgW1NEVENpc1ZUPDAsIGkzMj4sIFNEVENpc0ludDwxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVlQ8MiwgaTMyPl0+OworZGVmIE5FT052Z2V0bGFuZXUgOiBTRE5vZGU8IkFSTUlTRDo6VkdFVExBTkV1IiwgU0RUQVJNVkdFVExOPjsKK2RlZiBORU9OdmdldGxhbmVzIDogU0ROb2RlPCJBUk1JU0Q6OlZHRVRMQU5FcyIsIFNEVEFSTVZHRVRMTj47CisKK2RlZiBTRFRBUk1WTU9WSU1NIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbU0RUQ2lzVmVjPDA+LCBTRFRDaXNWVDwxLCBpMzI+XT47CitkZWYgTkVPTnZtb3ZJbW0gICA6IFNETm9kZTwiQVJNSVNEOjpWTU9WSU1NIiwgU0RUQVJNVk1PVklNTT47CitkZWYgTkVPTnZtdm5JbW0gICA6IFNETm9kZTwiQVJNSVNEOjpWTVZOSU1NIiwgU0RUQVJNVk1PVklNTT47CisKK2RlZiBORU9OdmR1cCAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZEVVAiLCBTRFR5cGVQcm9maWxlPDEsIDEsIFtTRFRDaXNWZWM8MD5dPj47CisKKy8vIFZEVVBMQU5FIGNhbiBwcm9kdWNlIGEgcXVhZC1yZWdpc3RlciByZXN1bHQgZnJvbSBhIGRvdWJsZS1yZWdpc3RlciBzb3VyY2UsCisvLyBzbyB0aGUgcmVzdWx0IGlzIG5vdCBjb25zdHJhaW5lZCB0byBtYXRjaCB0aGUgc291cmNlLgorZGVmIE5FT052ZHVwbGFuZSAgOiBTRE5vZGU8IkFSTUlTRDo6VkRVUExBTkUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzVmVjPDA+LCBTRFRDaXNWZWM8MT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwyLCBpMzI+XT4+OworCitkZWYgU0RUQVJNVkVYVCAgICA6IFNEVHlwZVByb2ZpbGU8MSwgMywgW1NEVENpc1ZlYzwwPiwgU0RUQ2lzU2FtZUFzPDAsIDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNTYW1lQXM8MCwgMj4sIFNEVENpc1ZUPDMsIGkzMj5dPjsKK2RlZiBORU9OdmV4dCAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZFWFQiLCBTRFRBUk1WRVhUPjsKKworZGVmIFNEVEFSTVZTSFVGICAgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFtTRFRDaXNWZWM8MD4sIFNEVENpc1NhbWVBczwwLCAxPl0+OworZGVmIE5FT052cmV2NjQgICAgOiBTRE5vZGU8IkFSTUlTRDo6VlJFVjY0IiwgU0RUQVJNVlNIVUY+OworZGVmIE5FT052cmV2MzIgICAgOiBTRE5vZGU8IkFSTUlTRDo6VlJFVjMyIiwgU0RUQVJNVlNIVUY+OworZGVmIE5FT052cmV2MTYgICAgOiBTRE5vZGU8IkFSTUlTRDo6VlJFVjE2IiwgU0RUQVJNVlNIVUY+OworCitkZWYgU0RUQVJNVlNIVUYyICA6IFNEVHlwZVByb2ZpbGU8MiwgMiwgW1NEVENpc1ZlYzwwPiwgU0RUQ2lzU2FtZUFzPDAsIDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNTYW1lQXM8MCwgMj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1NhbWVBczwwLCAzPl0+OworZGVmIE5FT056aXAgICAgICAgOiBTRE5vZGU8IkFSTUlTRDo6VlpJUCIsIFNEVEFSTVZTSFVGMj47CitkZWYgTkVPTnV6cCAgICAgICA6IFNETm9kZTwiQVJNSVNEOjpWVVpQIiwgU0RUQVJNVlNIVUYyPjsKK2RlZiBORU9OdHJuICAgICAgIDogU0ROb2RlPCJBUk1JU0Q6OlZUUk4iLCBTRFRBUk1WU0hVRjI+OworCitkZWYgU0RUQVJNRk1BWCAgICA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgW1NEVENpc1ZUPDAsIGYzMj4sIFNEVENpc1NhbWVBczwwLCAxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzU2FtZUFzPDAsIDI+XT47CitkZWYgTkVPTmZtYXggICAgICA6IFNETm9kZTwiQVJNSVNEOjpGTUFYIiwgU0RUQVJNRk1BWD47CitkZWYgTkVPTmZtaW4gICAgICA6IFNETm9kZTwiQVJNSVNEOjpGTUlOIiwgU0RUQVJNRk1BWD47CisKK2RlZiBORU9OaW1tQWxsWmVyb3NWOiBQYXRMZWFmPChORU9Odm1vdkltbSAoaTMyIHRpbW0pKSwgW3sKKyAgQ29uc3RhbnRTRE5vZGUgKkNvbnN0VmFsID0gY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgwKSk7CisgIHVuc2lnbmVkIEVsdEJpdHMgPSAwOworICB1aW50NjRfdCBFbHRWYWwgPSBBUk1fQU06OmRlY29kZU5FT05Nb2RJbW0oQ29uc3RWYWwtPmdldFpFeHRWYWx1ZSgpLCBFbHRCaXRzKTsKKyAgcmV0dXJuIChFbHRCaXRzID09IDMyICYmIEVsdFZhbCA9PSAwKTsKK31dPjsKKworZGVmIE5FT05pbW1BbGxPbmVzVjogUGF0TGVhZjwoTkVPTnZtb3ZJbW0gKGkzMiB0aW1tKSksIFt7CisgIENvbnN0YW50U0ROb2RlICpDb25zdFZhbCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMCkpOworICB1bnNpZ25lZCBFbHRCaXRzID0gMDsKKyAgdWludDY0X3QgRWx0VmFsID0gQVJNX0FNOjpkZWNvZGVORU9OTW9kSW1tKENvbnN0VmFsLT5nZXRaRXh0VmFsdWUoKSwgRWx0Qml0cyk7CisgIHJldHVybiAoRWx0Qml0cyA9PSA4ICYmIEVsdFZhbCA9PSAweGZmKTsKK31dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE5FT04gb3BlcmFuZCBkZWZpbml0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIG5Nb2RJbW0gOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRORU9OTW9kSW1tT3BlcmFuZCI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBORU9OIGxvYWQgLyBzdG9yZSBpbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBtYXlMb2FkID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4geworLy8gVXNlIHZsZG1pYSB0byBsb2FkIGEgUSByZWdpc3RlciBhcyBhIEQgcmVnaXN0ZXIgcGFpci4KKy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byBWTERNRCBleGNlcHQgdGhhdCBpdCBoYXMgYSBRIHJlZ2lzdGVyIG9wZXJhbmQKKy8vIGluc3RlYWQgb2YgYSBwYWlyIG9mIEQgcmVnaXN0ZXJzLgorZGVmIFZMRE1RCisgIDogQVhESTU8KG91dHMgUVBSOiRkc3QpLCAoaW5zIGFkZHJtb2RlNTokYWRkciwgcHJlZDokcCksCisgICAgICAgICAgSW5kZXhNb2RlTm9uZSwgSUlDX2ZwTG9hZG0sCisgICAgICAgICAgInZsZG0ke2FkZHI6c3VibW9kZX0ke3B9XHQke2FkZHI6YmFzZX0sICR7ZHN0OmRyZWdwYWlyfSIsICIiLCBbXT47CisKKy8vIFVzZSB2bGQxIHRvIGxvYWQgYSBRIHJlZ2lzdGVyIGFzIGEgRCByZWdpc3RlciBwYWlyLgorLy8gVGhpcyBhbHRlcm5hdGl2ZSB0byBWTERNUSBhbGxvd3MgYW4gYWxpZ25tZW50IHRvIGJlIHNwZWNpZmllZC4KKy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byBWTEQxcTY0IGV4Y2VwdCB0aGF0IGl0IGhhcyBhIFEgcmVnaXN0ZXIgb3BlcmFuZC4KK2RlZiBWTEQxcQorICA6IE5MZFN0PDAsMGIxMCwwYjEwMTAsMGIxMTAwLCAob3V0cyBRUFI6JGRzdCksIChpbnMgYWRkcm1vZGU2OiRhZGRyKSwKKyAgICAgICAgICBJSUNfVkxEMSwgInZsZDEiLCAiNjQiLCAiJHtkc3Q6ZHJlZ3BhaXJ9LCAkYWRkciIsICIiLCBbXT47Cit9IC8vIG1heUxvYWQgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMQorCitsZXQgbWF5U3RvcmUgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7CisvLyBVc2UgdnN0bWlhIHRvIHN0b3JlIGEgUSByZWdpc3RlciBhcyBhIEQgcmVnaXN0ZXIgcGFpci4KKy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byBWU1RNRCBleGNlcHQgdGhhdCBpdCBoYXMgYSBRIHJlZ2lzdGVyIG9wZXJhbmQKKy8vIGluc3RlYWQgb2YgYSBwYWlyIG9mIEQgcmVnaXN0ZXJzLgorZGVmIFZTVE1RCisgIDogQVhESTU8KG91dHMpLCAoaW5zIFFQUjokc3JjLCBhZGRybW9kZTU6JGFkZHIsIHByZWQ6JHApLAorICAgICAgICAgIEluZGV4TW9kZU5vbmUsIElJQ19mcFN0b3JlbSwKKyAgICAgICAgICAidnN0bSR7YWRkcjpzdWJtb2RlfSR7cH1cdCR7YWRkcjpiYXNlfSwgJHtzcmM6ZHJlZ3BhaXJ9IiwgIiIsIFtdPjsKKworLy8gVXNlIHZzdDEgdG8gc3RvcmUgYSBRIHJlZ2lzdGVyIGFzIGEgRCByZWdpc3RlciBwYWlyLgorLy8gVGhpcyBhbHRlcm5hdGl2ZSB0byBWU1RNUSBhbGxvd3MgYW4gYWxpZ25tZW50IHRvIGJlIHNwZWNpZmllZC4KKy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byBWU1QxcTY0IGV4Y2VwdCB0aGF0IGl0IGhhcyBhIFEgcmVnaXN0ZXIgb3BlcmFuZC4KK2RlZiBWU1QxcQorICA6IE5MZFN0PDAsMGIwMCwwYjEwMTAsMGIxMTAwLCAob3V0cyksIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBRUFI6JHNyYyksCisgICAgICAgICAgSUlDX1ZTVCwgInZzdDEiLCAiNjQiLCAiJHtzcmM6ZHJlZ3BhaXJ9LCAkYWRkciIsICIiLCBbXT47Cit9IC8vIG1heVN0b3JlID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEKKworbGV0IG1heUxvYWQgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSwgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcSA9IDEgaW4geworCisvLyAgIFZMRDEgICAgIDogVmVjdG9yIExvYWQgKG11bHRpcGxlIHNpbmdsZSBlbGVtZW50cykKK2NsYXNzIFZMRDFEPGJpdHM8ND4gb3A3XzQsIHN0cmluZyBEdD4KKyAgOiBOTGRTdDwwLDBiMTAsMGIwMTExLG9wN180LCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIpLCBJSUNfVkxEMSwKKyAgICAgICAgICAidmxkMSIsIER0LCAiXFx7JGRzdFxcfSwgJGFkZHIiLCAiIiwgW10+OworY2xhc3MgVkxEMVE8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsMGIxMCwwYjEwMTAsb3A3XzQsIChvdXRzIERQUjokZHN0MSwgRFBSOiRkc3QyKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciksIElJQ19WTEQxLAorICAgICAgICAgICJ2bGQxIiwgRHQsICJcXHskZHN0MSwgJGRzdDJcXH0sICRhZGRyIiwgIiIsIFtdPjsKKworZGVmICBWTEQxZDggICA6IFZMRDFEPDBiMDAwMCwgIjgiPjsKK2RlZiAgVkxEMWQxNiAgOiBWTEQxRDwwYjAxMDAsICIxNiI+OworZGVmICBWTEQxZDMyICA6IFZMRDFEPDBiMTAwMCwgIjMyIj47CitkZWYgIFZMRDFkNjQgIDogVkxEMUQ8MGIxMTAwLCAiNjQiPjsKKworZGVmICBWTEQxcTggICA6IFZMRDFRPDBiMDAwMCwgIjgiPjsKK2RlZiAgVkxEMXExNiAgOiBWTEQxUTwwYjAxMDAsICIxNiI+OworZGVmICBWTEQxcTMyICA6IFZMRDFRPDBiMTAwMCwgIjMyIj47CitkZWYgIFZMRDFxNjQgIDogVkxEMVE8MGIxMTAwLCAiNjQiPjsKKworLy8gLi4ud2l0aCBhZGRyZXNzIHJlZ2lzdGVyIHdyaXRlYmFjazoKK2NsYXNzIFZMRDFEV0I8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsMGIxMCwwYjAxMTEsb3A3XzQsIChvdXRzIERQUjokZHN0LCBHUFI6JHdiKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgYW02b2Zmc2V0OiRvZmZzZXQpLCBJSUNfVkxEMSwKKyAgICAgICAgICAidmxkMSIsIER0LCAiXFx7JGRzdFxcfSwgJGFkZHIkb2Zmc2V0IiwKKyAgICAgICAgICAiJGFkZHIuYWRkciA9ICR3YiIsIFtdPjsKK2NsYXNzIFZMRDFRV0I8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsMGIxMCwwYjEwMTAsb3A3XzQsIChvdXRzIFFQUjokZHN0LCBHUFI6JHdiKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgYW02b2Zmc2V0OiRvZmZzZXQpLCBJSUNfVkxEMSwKKyAgICAgICAgICAidmxkMSIsIER0LCAiJHtkc3Q6ZHJlZ3BhaXJ9LCAkYWRkciRvZmZzZXQiLAorICAgICAgICAgICIkYWRkci5hZGRyID0gJHdiIiwgW10+OworCitkZWYgVkxEMWQ4X1VQRCAgOiBWTEQxRFdCPDBiMDAwMCwgIjgiPjsKK2RlZiBWTEQxZDE2X1VQRCA6IFZMRDFEV0I8MGIwMTAwLCAiMTYiPjsKK2RlZiBWTEQxZDMyX1VQRCA6IFZMRDFEV0I8MGIxMDAwLCAiMzIiPjsKK2RlZiBWTEQxZDY0X1VQRCA6IFZMRDFEV0I8MGIxMTAwLCAiNjQiPjsKKworZGVmIFZMRDFxOF9VUEQgIDogVkxEMVFXQjwwYjAwMDAsICI4Ij47CitkZWYgVkxEMXExNl9VUEQgOiBWTEQxUVdCPDBiMDEwMCwgIjE2Ij47CitkZWYgVkxEMXEzMl9VUEQgOiBWTEQxUVdCPDBiMTAwMCwgIjMyIj47CitkZWYgVkxEMXE2NF9VUEQgOiBWTEQxUVdCPDBiMTEwMCwgIjY0Ij47CisKKy8vIC4uLndpdGggMyByZWdpc3RlcnMgKHNvbWUgb2YgdGhlc2UgYXJlIG9ubHkgZm9yIHRoZSBkaXNhc3NlbWJsZXIpOgorY2xhc3MgVkxEMUQzPGJpdHM8ND4gb3A3XzQsIHN0cmluZyBEdD4KKyAgOiBOTGRTdDwwLDBiMTAsMGIwMTEwLG9wN180LCAob3V0cyBEUFI6JGRzdDEsIERQUjokZHN0MiwgRFBSOiRkc3QzKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciksIElJQ19WTEQxLCAidmxkMSIsIER0LAorICAgICAgICAgICJcXHskZHN0MSwgJGRzdDIsICRkc3QzXFx9LCAkYWRkciIsICIiLCBbXT47CitjbGFzcyBWTEQxRDNXQjxiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwwYjEwLDBiMDExMCxvcDdfNCwgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MywgR1BSOiR3YiksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIGFtNm9mZnNldDokb2Zmc2V0KSwgSUlDX1ZMRDEsICJ2bGQxIiwgRHQsCisgICAgICAgICAgIlxceyRkc3QxLCAkZHN0MiwgJGRzdDNcXH0sICRhZGRyJG9mZnNldCIsICIkYWRkci5hZGRyID0gJHdiIiwgW10+OworCitkZWYgVkxEMWQ4VCAgICAgIDogVkxEMUQzPDBiMDAwMCwgIjgiPjsKK2RlZiBWTEQxZDE2VCAgICAgOiBWTEQxRDM8MGIwMTAwLCAiMTYiPjsKK2RlZiBWTEQxZDMyVCAgICAgOiBWTEQxRDM8MGIxMDAwLCAiMzIiPjsKK2RlZiBWTEQxZDY0VCAgICAgOiBWTEQxRDM8MGIxMTAwLCAiNjQiPjsKKworZGVmIFZMRDFkOFRfVVBEICA6IFZMRDFEM1dCPDBiMDAwMCwgIjgiPjsKK2RlZiBWTEQxZDE2VF9VUEQgOiBWTEQxRDNXQjwwYjAxMDAsICIxNiI+OworZGVmIFZMRDFkMzJUX1VQRCA6IFZMRDFEM1dCPDBiMTAwMCwgIjMyIj47CitkZWYgVkxEMWQ2NFRfVVBEIDogVkxEMUQzV0I8MGIxMTAwLCAiNjQiPjsKKworLy8gLi4ud2l0aCA0IHJlZ2lzdGVycyAoc29tZSBvZiB0aGVzZSBhcmUgb25seSBmb3IgdGhlIGRpc2Fzc2VtYmxlcik6CitjbGFzcyBWTEQxRDQ8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsMGIxMCwwYjAwMTAsb3A3XzQsKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MywgRFBSOiRkc3Q0KSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciksIElJQ19WTEQxLCAidmxkMSIsIER0LAorICAgICAgICAgICJcXHskZHN0MSwgJGRzdDIsICRkc3QzLCAkZHN0NFxcfSwgJGFkZHIiLCAiIiwgW10+OworY2xhc3MgVkxEMUQ0V0I8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsMGIxMCwwYjAwMTAsb3A3XzQsCisgICAgICAgICAgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MywgRFBSOiRkc3Q0LCBHUFI6JHdiKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgYW02b2Zmc2V0OiRvZmZzZXQpLCBJSUNfVkxEMSwgInZsZDEiLCBEdCwKKyAgICAgICAgICAiXFx7JGRzdDEsICRkc3QyLCAkZHN0MywgJGRzdDRcXH0sICRhZGRyJG9mZnNldCIsICIkYWRkci5hZGRyID0gJHdiIiwKKyAgICAgICAgICBbXT47CisKK2RlZiBWTEQxZDhRICAgICAgOiBWTEQxRDQ8MGIwMDAwLCAiOCI+OworZGVmIFZMRDFkMTZRICAgICA6IFZMRDFENDwwYjAxMDAsICIxNiI+OworZGVmIFZMRDFkMzJRICAgICA6IFZMRDFENDwwYjEwMDAsICIzMiI+OworZGVmIFZMRDFkNjRRICAgICA6IFZMRDFENDwwYjExMDAsICI2NCI+OworCitkZWYgVkxEMWQ4UV9VUEQgIDogVkxEMUQ0V0I8MGIwMDAwLCAiOCI+OworZGVmIFZMRDFkMTZRX1VQRCA6IFZMRDFENFdCPDBiMDEwMCwgIjE2Ij47CitkZWYgVkxEMWQzMlFfVVBEIDogVkxEMUQ0V0I8MGIxMDAwLCAiMzIiPjsKK2RlZiBWTEQxZDY0UV9VUEQgOiBWTEQxRDRXQjwwYjExMDAsICI2NCI+OworCisvLyAgIFZMRDIgICAgIDogVmVjdG9yIExvYWQgKG11bHRpcGxlIDItZWxlbWVudCBzdHJ1Y3R1cmVzKQorY2xhc3MgVkxEMkQ8Yml0czw0PiBvcDExXzgsIGJpdHM8ND4gb3A3XzQsIHN0cmluZyBEdD4KKyAgOiBOTGRTdDwwLCAwYjEwLCBvcDExXzgsIG9wN180LCAob3V0cyBEUFI6JGRzdDEsIERQUjokZHN0MiksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIpLCBJSUNfVkxEMiwKKyAgICAgICAgICAidmxkMiIsIER0LCAiXFx7JGRzdDEsICRkc3QyXFx9LCAkYWRkciIsICIiLCBbXT47CitjbGFzcyBWTEQyUTxiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwgMGIxMCwgMGIwMDExLCBvcDdfNCwKKyAgICAgICAgICAob3V0cyBEUFI6JGRzdDEsIERQUjokZHN0MiwgRFBSOiRkc3QzLCBEUFI6JGRzdDQpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyKSwgSUlDX1ZMRDIsCisgICAgICAgICAgInZsZDIiLCBEdCwgIlxceyRkc3QxLCAkZHN0MiwgJGRzdDMsICRkc3Q0XFx9LCAkYWRkciIsICIiLCBbXT47CisKK2RlZiAgVkxEMmQ4ICAgOiBWTEQyRDwwYjEwMDAsIDBiMDAwMCwgIjgiPjsKK2RlZiAgVkxEMmQxNiAgOiBWTEQyRDwwYjEwMDAsIDBiMDEwMCwgIjE2Ij47CitkZWYgIFZMRDJkMzIgIDogVkxEMkQ8MGIxMDAwLCAwYjEwMDAsICIzMiI+OworCitkZWYgIFZMRDJxOCAgIDogVkxEMlE8MGIwMDAwLCAiOCI+OworZGVmICBWTEQycTE2ICA6IFZMRDJRPDBiMDEwMCwgIjE2Ij47CitkZWYgIFZMRDJxMzIgIDogVkxEMlE8MGIxMDAwLCAiMzIiPjsKKworLy8gLi4ud2l0aCBhZGRyZXNzIHJlZ2lzdGVyIHdyaXRlYmFjazoKK2NsYXNzIFZMRDJEV0I8Yml0czw0PiBvcDExXzgsIGJpdHM8ND4gb3A3XzQsIHN0cmluZyBEdD4KKyAgOiBOTGRTdDwwLCAwYjEwLCBvcDExXzgsIG9wN180LCAob3V0cyBEUFI6JGRzdDEsIERQUjokZHN0MiwgR1BSOiR3YiksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIGFtNm9mZnNldDokb2Zmc2V0KSwgSUlDX1ZMRDIsCisgICAgICAgICAgInZsZDIiLCBEdCwgIlxceyRkc3QxLCAkZHN0MlxcfSwgJGFkZHIkb2Zmc2V0IiwKKyAgICAgICAgICAiJGFkZHIuYWRkciA9ICR3YiIsIFtdPjsKK2NsYXNzIFZMRDJRV0I8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsIDBiMTAsIDBiMDAxMSwgb3A3XzQsCisgICAgICAgICAgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MywgRFBSOiRkc3Q0LCBHUFI6JHdiKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgYW02b2Zmc2V0OiRvZmZzZXQpLCBJSUNfVkxEMiwKKyAgICAgICAgICAidmxkMiIsIER0LCAiXFx7JGRzdDEsICRkc3QyLCAkZHN0MywgJGRzdDRcXH0sICRhZGRyJG9mZnNldCIsCisgICAgICAgICAgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT47CisKK2RlZiBWTEQyZDhfVVBEICA6IFZMRDJEV0I8MGIxMDAwLCAwYjAwMDAsICI4Ij47CitkZWYgVkxEMmQxNl9VUEQgOiBWTEQyRFdCPDBiMTAwMCwgMGIwMTAwLCAiMTYiPjsKK2RlZiBWTEQyZDMyX1VQRCA6IFZMRDJEV0I8MGIxMDAwLCAwYjEwMDAsICIzMiI+OworCitkZWYgVkxEMnE4X1VQRCAgOiBWTEQyUVdCPDBiMDAwMCwgIjgiPjsKK2RlZiBWTEQycTE2X1VQRCA6IFZMRDJRV0I8MGIwMTAwLCAiMTYiPjsKK2RlZiBWTEQycTMyX1VQRCA6IFZMRDJRV0I8MGIxMDAwLCAiMzIiPjsKKworLy8gLi4ud2l0aCBkb3VibGUtc3BhY2VkIHJlZ2lzdGVycyAoZm9yIGRpc2Fzc2VtYmx5IG9ubHkpOgorZGVmIFZMRDJiOCAgICAgIDogVkxEMkQ8MGIxMDAxLCAwYjAwMDAsICI4Ij47CitkZWYgVkxEMmIxNiAgICAgOiBWTEQyRDwwYjEwMDEsIDBiMDEwMCwgIjE2Ij47CitkZWYgVkxEMmIzMiAgICAgOiBWTEQyRDwwYjEwMDEsIDBiMTAwMCwgIjMyIj47CitkZWYgVkxEMmI4X1VQRCAgOiBWTEQyRFdCPDBiMTAwMSwgMGIwMDAwLCAiOCI+OworZGVmIFZMRDJiMTZfVVBEIDogVkxEMkRXQjwwYjEwMDEsIDBiMDEwMCwgIjE2Ij47CitkZWYgVkxEMmIzMl9VUEQgOiBWTEQyRFdCPDBiMTAwMSwgMGIxMDAwLCAiMzIiPjsKKworLy8gICBWTEQzICAgICA6IFZlY3RvciBMb2FkIChtdWx0aXBsZSAzLWVsZW1lbnQgc3RydWN0dXJlcykKK2NsYXNzIFZMRDNEPGJpdHM8ND4gb3AxMV84LCBiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwgMGIxMCwgb3AxMV84LCBvcDdfNCwgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MyksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIpLCBJSUNfVkxEMywKKyAgICAgICAgICAidmxkMyIsIER0LCAiXFx7JGRzdDEsICRkc3QyLCAkZHN0M1xcfSwgJGFkZHIiLCAiIiwgW10+OworCitkZWYgIFZMRDNkOCAgIDogVkxEM0Q8MGIwMTAwLCAwYjAwMDAsICI4Ij47CitkZWYgIFZMRDNkMTYgIDogVkxEM0Q8MGIwMTAwLCAwYjAxMDAsICIxNiI+OworZGVmICBWTEQzZDMyICA6IFZMRDNEPDBiMDEwMCwgMGIxMDAwLCAiMzIiPjsKKworLy8gLi4ud2l0aCBhZGRyZXNzIHJlZ2lzdGVyIHdyaXRlYmFjazoKK2NsYXNzIFZMRDNEV0I8Yml0czw0PiBvcDExXzgsIGJpdHM8ND4gb3A3XzQsIHN0cmluZyBEdD4KKyAgOiBOTGRTdDwwLCAwYjEwLCBvcDExXzgsIG9wN180LAorICAgICAgICAgIChvdXRzIERQUjokZHN0MSwgRFBSOiRkc3QyLCBEUFI6JGRzdDMsIEdQUjokd2IpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBhbTZvZmZzZXQ6JG9mZnNldCksIElJQ19WTEQzLAorICAgICAgICAgICJ2bGQzIiwgRHQsICJcXHskZHN0MSwgJGRzdDIsICRkc3QzXFx9LCAkYWRkciRvZmZzZXQiLAorICAgICAgICAgICIkYWRkci5hZGRyID0gJHdiIiwgW10+OworCitkZWYgVkxEM2Q4X1VQRCAgOiBWTEQzRFdCPDBiMDEwMCwgMGIwMDAwLCAiOCI+OworZGVmIFZMRDNkMTZfVVBEIDogVkxEM0RXQjwwYjAxMDAsIDBiMDEwMCwgIjE2Ij47CitkZWYgVkxEM2QzMl9VUEQgOiBWTEQzRFdCPDBiMDEwMCwgMGIxMDAwLCAiMzIiPjsKKworLy8gLi4ud2l0aCBkb3VibGUtc3BhY2VkIHJlZ2lzdGVycyAobm9uLXVwZGF0aW5nIHZlcnNpb25zIGZvciBkaXNhc3NlbWJseSBvbmx5KToKK2RlZiBWTEQzcTggICAgICA6IFZMRDNEPDBiMDEwMSwgMGIwMDAwLCAiOCI+OworZGVmIFZMRDNxMTYgICAgIDogVkxEM0Q8MGIwMTAxLCAwYjAxMDAsICIxNiI+OworZGVmIFZMRDNxMzIgICAgIDogVkxEM0Q8MGIwMTAxLCAwYjEwMDAsICIzMiI+OworZGVmIFZMRDNxOF9VUEQgIDogVkxEM0RXQjwwYjAxMDEsIDBiMDAwMCwgIjgiPjsKK2RlZiBWTEQzcTE2X1VQRCA6IFZMRDNEV0I8MGIwMTAxLCAwYjAxMDAsICIxNiI+OworZGVmIFZMRDNxMzJfVVBEIDogVkxEM0RXQjwwYjAxMDEsIDBiMTAwMCwgIjMyIj47CisKKy8vIC4uLmFsdGVybmF0ZSB2ZXJzaW9ucyB0byBiZSBhbGxvY2F0ZWQgb2RkIHJlZ2lzdGVyIG51bWJlcnM6CitkZWYgVkxEM3E4b2RkX1VQRCAgOiBWTEQzRFdCPDBiMDEwMSwgMGIwMDAwLCAiOCI+OworZGVmIFZMRDNxMTZvZGRfVVBEIDogVkxEM0RXQjwwYjAxMDEsIDBiMDEwMCwgIjE2Ij47CitkZWYgVkxEM3EzMm9kZF9VUEQgOiBWTEQzRFdCPDBiMDEwMSwgMGIxMDAwLCAiMzIiPjsKKworLy8gICBWTEQ0ICAgICA6IFZlY3RvciBMb2FkIChtdWx0aXBsZSA0LWVsZW1lbnQgc3RydWN0dXJlcykKK2NsYXNzIFZMRDREPGJpdHM8ND4gb3AxMV84LCBiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwgMGIxMCwgb3AxMV84LCBvcDdfNCwKKyAgICAgICAgICAob3V0cyBEUFI6JGRzdDEsIERQUjokZHN0MiwgRFBSOiRkc3QzLCBEUFI6JGRzdDQpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyKSwgSUlDX1ZMRDQsCisgICAgICAgICAgInZsZDQiLCBEdCwgIlxceyRkc3QxLCAkZHN0MiwgJGRzdDMsICRkc3Q0XFx9LCAkYWRkciIsICIiLCBbXT47CisKK2RlZiAgVkxENGQ4ICAgOiBWTEQ0RDwwYjAwMDAsIDBiMDAwMCwgIjgiPjsKK2RlZiAgVkxENGQxNiAgOiBWTEQ0RDwwYjAwMDAsIDBiMDEwMCwgIjE2Ij47CitkZWYgIFZMRDRkMzIgIDogVkxENEQ8MGIwMDAwLCAwYjEwMDAsICIzMiI+OworCisvLyAuLi53aXRoIGFkZHJlc3MgcmVnaXN0ZXIgd3JpdGViYWNrOgorY2xhc3MgVkxENERXQjxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsIDBiMTAsIG9wMTFfOCwgb3A3XzQsCisgICAgICAgICAgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MywgRFBSOiRkc3Q0LCBHUFI6JHdiKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgYW02b2Zmc2V0OiRvZmZzZXQpLCBJSUNfVkxENCwKKyAgICAgICAgICAidmxkNCIsIER0LCAiXFx7JGRzdDEsICRkc3QyLCAkZHN0MywgJGRzdDRcXH0sICRhZGRyJG9mZnNldCIsCisgICAgICAgICAgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT47CisKK2RlZiBWTEQ0ZDhfVVBEICA6IFZMRDREV0I8MGIwMDAwLCAwYjAwMDAsICI4Ij47CitkZWYgVkxENGQxNl9VUEQgOiBWTEQ0RFdCPDBiMDAwMCwgMGIwMTAwLCAiMTYiPjsKK2RlZiBWTEQ0ZDMyX1VQRCA6IFZMRDREV0I8MGIwMDAwLCAwYjEwMDAsICIzMiI+OworCisvLyAuLi53aXRoIGRvdWJsZS1zcGFjZWQgcmVnaXN0ZXJzIChub24tdXBkYXRpbmcgdmVyc2lvbnMgZm9yIGRpc2Fzc2VtYmx5IG9ubHkpOgorZGVmIFZMRDRxOCAgICAgIDogVkxENEQ8MGIwMDAxLCAwYjAwMDAsICI4Ij47CitkZWYgVkxENHExNiAgICAgOiBWTEQ0RDwwYjAwMDEsIDBiMDEwMCwgIjE2Ij47CitkZWYgVkxENHEzMiAgICAgOiBWTEQ0RDwwYjAwMDEsIDBiMTAwMCwgIjMyIj47CitkZWYgVkxENHE4X1VQRCAgOiBWTEQ0RFdCPDBiMDAwMSwgMGIwMDAwLCAiOCI+OworZGVmIFZMRDRxMTZfVVBEIDogVkxENERXQjwwYjAwMDEsIDBiMDEwMCwgIjE2Ij47CitkZWYgVkxENHEzMl9VUEQgOiBWTEQ0RFdCPDBiMDAwMSwgMGIxMDAwLCAiMzIiPjsKKworLy8gLi4uYWx0ZXJuYXRlIHZlcnNpb25zIHRvIGJlIGFsbG9jYXRlZCBvZGQgcmVnaXN0ZXIgbnVtYmVyczoKK2RlZiBWTEQ0cThvZGRfVVBEICA6IFZMRDREV0I8MGIwMDAxLCAwYjAwMDAsICI4Ij47CitkZWYgVkxENHExNm9kZF9VUEQgOiBWTEQ0RFdCPDBiMDAwMSwgMGIwMTAwLCAiMTYiPjsKK2RlZiBWTEQ0cTMyb2RkX1VQRCA6IFZMRDREV0I8MGIwMDAxLCAwYjEwMDAsICIzMiI+OworCisvLyAgIFZMRDFMTiAgIDogVmVjdG9yIExvYWQgKHNpbmdsZSBlbGVtZW50IHRvIG9uZSBsYW5lKQorLy8gICBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZC4KKworLy8gICBWTEQyTE4gICA6IFZlY3RvciBMb2FkIChzaW5nbGUgMi1lbGVtZW50IHN0cnVjdHVyZSB0byBvbmUgbGFuZSkKK2NsYXNzIFZMRDJMTjxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDEsIDBiMTAsIG9wMTFfOCwgb3A3XzQsIChvdXRzIERQUjokZHN0MSwgRFBSOiRkc3QyKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICAgIElJQ19WTEQyLCAidmxkMiIsIER0LCAiXFx7JGRzdDFbJGxhbmVdLCAkZHN0MlskbGFuZV1cXH0sICRhZGRyIiwKKyAgICAgICAgICAiJHNyYzEgPSAkZHN0MSwgJHNyYzIgPSAkZHN0MiIsIFtdPjsKKworZGVmIFZMRDJMTmQ4ICA6IFZMRDJMTjwwYjAwMDEsIHs/LD8sPyw/fSwgIjgiPjsKK2RlZiBWTEQyTE5kMTYgOiBWTEQyTE48MGIwMTAxLCB7Pyw/LDAsP30sICIxNiI+OworZGVmIFZMRDJMTmQzMiA6IFZMRDJMTjwwYjEwMDEsIHs/LDAsPyw/fSwgIjMyIj47CisKKy8vIC4uLndpdGggZG91YmxlLXNwYWNlZCByZWdpc3RlcnM6CitkZWYgVkxEMkxOcTE2IDogVkxEMkxOPDBiMDEwMSwgez8sPywxLD99LCAiMTYiPjsKK2RlZiBWTEQyTE5xMzIgOiBWTEQyTE48MGIxMDAxLCB7PywxLD8sP30sICIzMiI+OworCisvLyAuLi5hbHRlcm5hdGUgdmVyc2lvbnMgdG8gYmUgYWxsb2NhdGVkIG9kZCByZWdpc3RlciBudW1iZXJzOgorZGVmIFZMRDJMTnExNm9kZCA6IFZMRDJMTjwwYjAxMDEsIHs/LD8sMSw/fSwgIjE2Ij47CitkZWYgVkxEMkxOcTMyb2RkIDogVkxEMkxOPDBiMTAwMSwgez8sMSw/LD99LCAiMzIiPjsKKworLy8gLi4ud2l0aCBhZGRyZXNzIHJlZ2lzdGVyIHdyaXRlYmFjazoKK2NsYXNzIFZMRDJMTldCPGJpdHM8ND4gb3AxMV84LCBiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MSwgMGIxMCwgb3AxMV84LCBvcDdfNCwgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIEdQUjokd2IpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBhbTZvZmZzZXQ6JG9mZnNldCwKKyAgICAgICAgICAgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIG5vaGFzaF9pbW06JGxhbmUpLCBJSUNfVkxEMiwgInZsZDIiLCBEdCwKKyAgICAgICAgICAiXFx7JGRzdDFbJGxhbmVdLCAkZHN0MlskbGFuZV1cXH0sICRhZGRyJG9mZnNldCIsCisgICAgICAgICAgIiRzcmMxID0gJGRzdDEsICRzcmMyID0gJGRzdDIsICRhZGRyLmFkZHIgPSAkd2IiLCBbXT47CisKK2RlZiBWTEQyTE5kOF9VUEQgIDogVkxEMkxOV0I8MGIwMDAxLCB7Pyw/LD8sP30sICI4Ij47CitkZWYgVkxEMkxOZDE2X1VQRCA6IFZMRDJMTldCPDBiMDEwMSwgez8sPywwLD99LCAiMTYiPjsKK2RlZiBWTEQyTE5kMzJfVVBEIDogVkxEMkxOV0I8MGIxMDAxLCB7PywwLD8sP30sICIzMiI+OworCitkZWYgVkxEMkxOcTE2X1VQRCA6IFZMRDJMTldCPDBiMDEwMSwgez8sPywxLD99LCAiMTYiPjsKK2RlZiBWTEQyTE5xMzJfVVBEIDogVkxEMkxOV0I8MGIxMDAxLCB7PywxLD8sP30sICIzMiI+OworCisvLyAgIFZMRDNMTiAgIDogVmVjdG9yIExvYWQgKHNpbmdsZSAzLWVsZW1lbnQgc3RydWN0dXJlIHRvIG9uZSBsYW5lKQorY2xhc3MgVkxEM0xOPGJpdHM8ND4gb3AxMV84LCBiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MSwgMGIxMCwgb3AxMV84LCBvcDdfNCwgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MyksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIERQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFI6JHNyYzMsCisgICAgICAgICAgbm9oYXNoX2ltbTokbGFuZSksIElJQ19WTEQzLCAidmxkMyIsIER0LAorICAgICAgICAgICJcXHskZHN0MVskbGFuZV0sICRkc3QyWyRsYW5lXSwgJGRzdDNbJGxhbmVdXFx9LCAkYWRkciIsCisgICAgICAgICAgIiRzcmMxID0gJGRzdDEsICRzcmMyID0gJGRzdDIsICRzcmMzID0gJGRzdDMiLCBbXT47CisKK2RlZiBWTEQzTE5kOCAgOiBWTEQzTE48MGIwMDEwLCB7Pyw/LD8sMH0sICI4Ij47CitkZWYgVkxEM0xOZDE2IDogVkxEM0xOPDBiMDExMCwgez8sPywwLDB9LCAiMTYiPjsKK2RlZiBWTEQzTE5kMzIgOiBWTEQzTE48MGIxMDEwLCB7PywwLDAsMH0sICIzMiI+OworCisvLyAuLi53aXRoIGRvdWJsZS1zcGFjZWQgcmVnaXN0ZXJzOgorZGVmIFZMRDNMTnExNiA6IFZMRDNMTjwwYjAxMTAsIHs/LD8sMSwwfSwgIjE2Ij47CitkZWYgVkxEM0xOcTMyIDogVkxEM0xOPDBiMTAxMCwgez8sMSwwLDB9LCAiMzIiPjsKKworLy8gLi4uYWx0ZXJuYXRlIHZlcnNpb25zIHRvIGJlIGFsbG9jYXRlZCBvZGQgcmVnaXN0ZXIgbnVtYmVyczoKK2RlZiBWTEQzTE5xMTZvZGQgOiBWTEQzTE48MGIwMTEwLCB7Pyw/LDEsMH0sICIxNiI+OworZGVmIFZMRDNMTnEzMm9kZCA6IFZMRDNMTjwwYjEwMTAsIHs/LDEsMCwwfSwgIjMyIj47CisKKy8vIC4uLndpdGggYWRkcmVzcyByZWdpc3RlciB3cml0ZWJhY2s6CitjbGFzcyBWTEQzTE5XQjxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDEsIDBiMTAsIG9wMTFfOCwgb3A3XzQsCisgICAgICAgICAgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MywgR1BSOiR3YiksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIGFtNm9mZnNldDokb2Zmc2V0LAorICAgICAgICAgICBEUFI6JHNyYzEsIERQUjokc3JjMiwgRFBSOiRzcmMzLCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgICBJSUNfVkxEMywgInZsZDMiLCBEdCwKKyAgICAgICAgICAiXFx7JGRzdDFbJGxhbmVdLCAkZHN0MlskbGFuZV0sICRkc3QzWyRsYW5lXVxcfSwgJGFkZHIkb2Zmc2V0IiwKKyAgICAgICAgICAiJHNyYzEgPSAkZHN0MSwgJHNyYzIgPSAkZHN0MiwgJHNyYzMgPSAkZHN0MywgJGFkZHIuYWRkciA9ICR3YiIsCisgICAgICAgICAgW10+OworCitkZWYgVkxEM0xOZDhfVVBEICA6IFZMRDNMTldCPDBiMDAxMCwgez8sPyw/LDB9LCAiOCI+OworZGVmIFZMRDNMTmQxNl9VUEQgOiBWTEQzTE5XQjwwYjAxMTAsIHs/LD8sMCwwfSwgIjE2Ij47CitkZWYgVkxEM0xOZDMyX1VQRCA6IFZMRDNMTldCPDBiMTAxMCwgez8sMCwwLDB9LCAiMzIiPjsKKworZGVmIFZMRDNMTnExNl9VUEQgOiBWTEQzTE5XQjwwYjAxMTAsIHs/LD8sMSwwfSwgIjE2Ij47CitkZWYgVkxEM0xOcTMyX1VQRCA6IFZMRDNMTldCPDBiMTAxMCwgez8sMSwwLDB9LCAiMzIiPjsKKworLy8gICBWTEQ0TE4gICA6IFZlY3RvciBMb2FkIChzaW5nbGUgNC1lbGVtZW50IHN0cnVjdHVyZSB0byBvbmUgbGFuZSkKK2NsYXNzIFZMRDRMTjxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDEsIDBiMTAsIG9wMTFfOCwgb3A3XzQsCisgICAgICAgICAgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MywgRFBSOiRkc3Q0KSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMywgRFBSOiRzcmM0LAorICAgICAgICAgIG5vaGFzaF9pbW06JGxhbmUpLCBJSUNfVkxENCwgInZsZDQiLCBEdCwKKyAgICAgICAgICAiXFx7JGRzdDFbJGxhbmVdLCAkZHN0MlskbGFuZV0sICRkc3QzWyRsYW5lXSwgJGRzdDRbJGxhbmVdXFx9LCAkYWRkciIsCisgICAgICAgICAgIiRzcmMxID0gJGRzdDEsICRzcmMyID0gJGRzdDIsICRzcmMzID0gJGRzdDMsICRzcmM0ID0gJGRzdDQiLCBbXT47CisKK2RlZiBWTEQ0TE5kOCAgOiBWTEQ0TE48MGIwMDExLCB7Pyw/LD8sP30sICI4Ij47CitkZWYgVkxENExOZDE2IDogVkxENExOPDBiMDExMSwgez8sPywwLD99LCAiMTYiPjsKK2RlZiBWTEQ0TE5kMzIgOiBWTEQ0TE48MGIxMDExLCB7PywwLD8sP30sICIzMiI+OworCisvLyAuLi53aXRoIGRvdWJsZS1zcGFjZWQgcmVnaXN0ZXJzOgorZGVmIFZMRDRMTnExNiA6IFZMRDRMTjwwYjAxMTEsIHs/LD8sMSw/fSwgIjE2Ij47CitkZWYgVkxENExOcTMyIDogVkxENExOPDBiMTAxMSwgez8sMSw/LD99LCAiMzIiPjsKKworLy8gLi4uYWx0ZXJuYXRlIHZlcnNpb25zIHRvIGJlIGFsbG9jYXRlZCBvZGQgcmVnaXN0ZXIgbnVtYmVyczoKK2RlZiBWTEQ0TE5xMTZvZGQgOiBWTEQ0TE48MGIwMTExLCB7Pyw/LDEsP30sICIxNiI+OworZGVmIFZMRDRMTnEzMm9kZCA6IFZMRDRMTjwwYjEwMTEsIHs/LDEsPyw/fSwgIjMyIj47CisKKy8vIC4uLndpdGggYWRkcmVzcyByZWdpc3RlciB3cml0ZWJhY2s6CitjbGFzcyBWTEQ0TE5XQjxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDEsIDBiMTAsIG9wMTFfOCwgb3A3XzQsCisgICAgICAgICAgKG91dHMgRFBSOiRkc3QxLCBEUFI6JGRzdDIsIERQUjokZHN0MywgRFBSOiRkc3Q0LCBHUFI6JHdiKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgYW02b2Zmc2V0OiRvZmZzZXQsCisgICAgICAgICAgIERQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFI6JHNyYzMsIERQUjokc3JjNCwgbm9oYXNoX2ltbTokbGFuZSksCisgICAgICAgICAgSUlDX1ZMRDQsICJ2bGQ0IiwgRHQsCisiXFx7JGRzdDFbJGxhbmVdLCAkZHN0MlskbGFuZV0sICRkc3QzWyRsYW5lXSwgJGRzdDRbJGxhbmVdXFx9LCAkYWRkciRvZmZzZXQiLAorIiRzcmMxID0gJGRzdDEsICRzcmMyID0gJGRzdDIsICRzcmMzID0gJGRzdDMsICRzcmM0ID0gJGRzdDQsICRhZGRyLmFkZHIgPSAkd2IiLAorICAgICAgICAgIFtdPjsKKworZGVmIFZMRDRMTmQ4X1VQRCAgOiBWTEQ0TE5XQjwwYjAwMTEsIHs/LD8sPyw/fSwgIjgiPjsKK2RlZiBWTEQ0TE5kMTZfVVBEIDogVkxENExOV0I8MGIwMTExLCB7Pyw/LDAsP30sICIxNiI+OworZGVmIFZMRDRMTmQzMl9VUEQgOiBWTEQ0TE5XQjwwYjEwMTEsIHs/LDAsPyw/fSwgIjMyIj47CisKK2RlZiBWTEQ0TE5xMTZfVVBEIDogVkxENExOV0I8MGIwMTExLCB7Pyw/LDEsP30sICIxNiI+OworZGVmIFZMRDRMTnEzMl9VUEQgOiBWTEQ0TE5XQjwwYjEwMTEsIHs/LDEsPyw/fSwgIjMyIj47CisKKy8vICAgVkxEMURVUCAgOiBWZWN0b3IgTG9hZCAoc2luZ2xlIGVsZW1lbnQgdG8gYWxsIGxhbmVzKQorLy8gICBWTEQyRFVQICA6IFZlY3RvciBMb2FkIChzaW5nbGUgMi1lbGVtZW50IHN0cnVjdHVyZSB0byBhbGwgbGFuZXMpCisvLyAgIFZMRDNEVVAgIDogVmVjdG9yIExvYWQgKHNpbmdsZSAzLWVsZW1lbnQgc3RydWN0dXJlIHRvIGFsbCBsYW5lcykKKy8vICAgVkxENERVUCAgOiBWZWN0b3IgTG9hZCAoc2luZ2xlIDQtZWxlbWVudCBzdHJ1Y3R1cmUgdG8gYWxsIGxhbmVzKQorLy8gICBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZC4KK30gLy8gbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMQorCitsZXQgbWF5U3RvcmUgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSwgaGFzRXh0cmFTcmNSZWdBbGxvY1JlcSA9IDEgaW4geworCisvLyAgIFZTVDEgICAgIDogVmVjdG9yIFN0b3JlIChtdWx0aXBsZSBzaW5nbGUgZWxlbWVudHMpCitjbGFzcyBWU1QxRDxiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwwYjAwLDBiMDExMSxvcDdfNCwgKG91dHMpLCAoaW5zIGFkZHJtb2RlNjokYWRkciwgRFBSOiRzcmMpLCBJSUNfVlNULAorICAgICAgICAgICJ2c3QxIiwgRHQsICJcXHskc3JjXFx9LCAkYWRkciIsICIiLCBbXT47CitjbGFzcyBWU1QxUTxiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwwYjAwLDBiMTAxMCxvcDdfNCwgKG91dHMpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBEUFI6JHNyYzEsIERQUjokc3JjMiksIElJQ19WU1QsCisgICAgICAgICAgInZzdDEiLCBEdCwgIlxceyRzcmMxLCAkc3JjMlxcfSwgJGFkZHIiLCAiIiwgW10+OworCitkZWYgIFZTVDFkOCAgIDogVlNUMUQ8MGIwMDAwLCAiOCI+OworZGVmICBWU1QxZDE2ICA6IFZTVDFEPDBiMDEwMCwgIjE2Ij47CitkZWYgIFZTVDFkMzIgIDogVlNUMUQ8MGIxMDAwLCAiMzIiPjsKK2RlZiAgVlNUMWQ2NCAgOiBWU1QxRDwwYjExMDAsICI2NCI+OworCitkZWYgIFZTVDFxOCAgIDogVlNUMVE8MGIwMDAwLCAiOCI+OworZGVmICBWU1QxcTE2ICA6IFZTVDFRPDBiMDEwMCwgIjE2Ij47CitkZWYgIFZTVDFxMzIgIDogVlNUMVE8MGIxMDAwLCAiMzIiPjsKK2RlZiAgVlNUMXE2NCAgOiBWU1QxUTwwYjExMDAsICI2NCI+OworCisvLyAuLi53aXRoIGFkZHJlc3MgcmVnaXN0ZXIgd3JpdGViYWNrOgorY2xhc3MgVlNUMURXQjxiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwgMGIwMCwgMGIwMTExLCBvcDdfNCwgKG91dHMgR1BSOiR3YiksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIGFtNm9mZnNldDokb2Zmc2V0LCBEUFI6JHNyYyksIElJQ19WU1QsCisgICAgICAgICAgInZzdDEiLCBEdCwgIlxceyRzcmNcXH0sICRhZGRyJG9mZnNldCIsICIkYWRkci5hZGRyID0gJHdiIiwgW10+OworY2xhc3MgVlNUMVFXQjxiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwgMGIwMCwgMGIxMDEwLCBvcDdfNCwgKG91dHMgR1BSOiR3YiksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIGFtNm9mZnNldDokb2Zmc2V0LCBRUFI6JHNyYyksIElJQ19WU1QsCisgICAgICAgICAgInZzdDEiLCBEdCwgIiR7c3JjOmRyZWdwYWlyfSwgJGFkZHIkb2Zmc2V0IiwgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT47CisKK2RlZiBWU1QxZDhfVVBEICA6IFZTVDFEV0I8MGIwMDAwLCAiOCI+OworZGVmIFZTVDFkMTZfVVBEIDogVlNUMURXQjwwYjAxMDAsICIxNiI+OworZGVmIFZTVDFkMzJfVVBEIDogVlNUMURXQjwwYjEwMDAsICIzMiI+OworZGVmIFZTVDFkNjRfVVBEIDogVlNUMURXQjwwYjExMDAsICI2NCI+OworCitkZWYgVlNUMXE4X1VQRCAgOiBWU1QxUVdCPDBiMDAwMCwgIjgiPjsKK2RlZiBWU1QxcTE2X1VQRCA6IFZTVDFRV0I8MGIwMTAwLCAiMTYiPjsKK2RlZiBWU1QxcTMyX1VQRCA6IFZTVDFRV0I8MGIxMDAwLCAiMzIiPjsKK2RlZiBWU1QxcTY0X1VQRCA6IFZTVDFRV0I8MGIxMTAwLCAiNjQiPjsKKworLy8gLi4ud2l0aCAzIHJlZ2lzdGVycyAoc29tZSBvZiB0aGVzZSBhcmUgb25seSBmb3IgdGhlIGRpc2Fzc2VtYmxlcik6CitjbGFzcyBWU1QxRDM8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsIDBiMDAsIDBiMDExMCwgb3A3XzQsIChvdXRzKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMyksCisgICAgICAgICAgSUlDX1ZTVCwgInZzdDEiLCBEdCwgIlxceyRzcmMxLCAkc3JjMiwgJHNyYzNcXH0sICRhZGRyIiwgIiIsIFtdPjsKK2NsYXNzIFZTVDFEM1dCPGJpdHM8ND4gb3A3XzQsIHN0cmluZyBEdD4KKyAgOiBOTGRTdDwwLCAwYjAwLCAwYjAxMTAsIG9wN180LCAob3V0cyBHUFI6JHdiKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgYW02b2Zmc2V0OiRvZmZzZXQsCisgICAgICAgICAgIERQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFI6JHNyYzMpLAorICAgICAgICAgIElJQ19WU1QsICJ2c3QxIiwgRHQsICJcXHskc3JjMSwgJHNyYzIsICRzcmMzXFx9LCAkYWRkciRvZmZzZXQiLAorICAgICAgICAgICIkYWRkci5hZGRyID0gJHdiIiwgW10+OworCitkZWYgVlNUMWQ4VCAgICAgIDogVlNUMUQzPDBiMDAwMCwgIjgiPjsKK2RlZiBWU1QxZDE2VCAgICAgOiBWU1QxRDM8MGIwMTAwLCAiMTYiPjsKK2RlZiBWU1QxZDMyVCAgICAgOiBWU1QxRDM8MGIxMDAwLCAiMzIiPjsKK2RlZiBWU1QxZDY0VCAgICAgOiBWU1QxRDM8MGIxMTAwLCAiNjQiPjsKKworZGVmIFZTVDFkOFRfVVBEICA6IFZTVDFEM1dCPDBiMDAwMCwgIjgiPjsKK2RlZiBWU1QxZDE2VF9VUEQgOiBWU1QxRDNXQjwwYjAxMDAsICIxNiI+OworZGVmIFZTVDFkMzJUX1VQRCA6IFZTVDFEM1dCPDBiMTAwMCwgIjMyIj47CitkZWYgVlNUMWQ2NFRfVVBEIDogVlNUMUQzV0I8MGIxMTAwLCAiNjQiPjsKKworLy8gLi4ud2l0aCA0IHJlZ2lzdGVycyAoc29tZSBvZiB0aGVzZSBhcmUgb25seSBmb3IgdGhlIGRpc2Fzc2VtYmxlcik6CitjbGFzcyBWU1QxRDQ8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsIDBiMDAsIDBiMDAxMCwgb3A3XzQsIChvdXRzKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMywgRFBSOiRzcmM0KSwKKyAgICAgICAgICBJSUNfVlNULCAidnN0MSIsIER0LCAiXFx7JHNyYzEsICRzcmMyLCAkc3JjMywgJHNyYzRcXH0sICRhZGRyIiwgIiIsCisgICAgICAgICAgW10+OworY2xhc3MgVlNUMUQ0V0I8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsIDBiMDAsIDBiMDAxMCwgb3A3XzQsIChvdXRzIEdQUjokd2IpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBhbTZvZmZzZXQ6JG9mZnNldCwKKyAgICAgICAgICAgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMywgRFBSOiRzcmM0KSwKKyAgICAgICAgICBJSUNfVlNULCAidnN0MSIsIER0LCAiXFx7JHNyYzEsICRzcmMyLCAkc3JjMywgJHNyYzRcXH0sICRhZGRyJG9mZnNldCIsCisgICAgICAgICAgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT47CisKK2RlZiBWU1QxZDhRICAgICAgOiBWU1QxRDQ8MGIwMDAwLCAiOCI+OworZGVmIFZTVDFkMTZRICAgICA6IFZTVDFENDwwYjAxMDAsICIxNiI+OworZGVmIFZTVDFkMzJRICAgICA6IFZTVDFENDwwYjEwMDAsICIzMiI+OworZGVmIFZTVDFkNjRRICAgICA6IFZTVDFENDwwYjExMDAsICI2NCI+OworCitkZWYgVlNUMWQ4UV9VUEQgIDogVlNUMUQ0V0I8MGIwMDAwLCAiOCI+OworZGVmIFZTVDFkMTZRX1VQRCA6IFZTVDFENFdCPDBiMDEwMCwgIjE2Ij47CitkZWYgVlNUMWQzMlFfVVBEIDogVlNUMUQ0V0I8MGIxMDAwLCAiMzIiPjsKK2RlZiBWU1QxZDY0UV9VUEQgOiBWU1QxRDRXQjwwYjExMDAsICI2NCI+OworCisvLyAgIFZTVDIgICAgIDogVmVjdG9yIFN0b3JlIChtdWx0aXBsZSAyLWVsZW1lbnQgc3RydWN0dXJlcykKK2NsYXNzIFZTVDJEPGJpdHM8ND4gb3AxMV84LCBiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwgMGIwMCwgb3AxMV84LCBvcDdfNCwgKG91dHMpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBEUFI6JHNyYzEsIERQUjokc3JjMiksCisgICAgICAgICAgSUlDX1ZTVCwgInZzdDIiLCBEdCwgIlxceyRzcmMxLCAkc3JjMlxcfSwgJGFkZHIiLCAiIiwgW10+OworY2xhc3MgVlNUMlE8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsIDBiMDAsIDBiMDAxMSwgb3A3XzQsIChvdXRzKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMywgRFBSOiRzcmM0KSwKKyAgICAgICAgICBJSUNfVlNULCAidnN0MiIsIER0LCAiXFx7JHNyYzEsICRzcmMyLCAkc3JjMywgJHNyYzRcXH0sICRhZGRyIiwKKyAgICAgICAgICAiIiwgW10+OworCitkZWYgIFZTVDJkOCAgIDogVlNUMkQ8MGIxMDAwLCAwYjAwMDAsICI4Ij47CitkZWYgIFZTVDJkMTYgIDogVlNUMkQ8MGIxMDAwLCAwYjAxMDAsICIxNiI+OworZGVmICBWU1QyZDMyICA6IFZTVDJEPDBiMTAwMCwgMGIxMDAwLCAiMzIiPjsKKworZGVmICBWU1QycTggICA6IFZTVDJRPDBiMDAwMCwgIjgiPjsKK2RlZiAgVlNUMnExNiAgOiBWU1QyUTwwYjAxMDAsICIxNiI+OworZGVmICBWU1QycTMyICA6IFZTVDJRPDBiMTAwMCwgIjMyIj47CisKKy8vIC4uLndpdGggYWRkcmVzcyByZWdpc3RlciB3cml0ZWJhY2s6CitjbGFzcyBWU1QyRFdCPGJpdHM8ND4gb3AxMV84LCBiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwgMGIwMCwgb3AxMV84LCBvcDdfNCwgKG91dHMgR1BSOiR3YiksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIGFtNm9mZnNldDokb2Zmc2V0LCBEUFI6JHNyYzEsIERQUjokc3JjMiksCisgICAgICAgICAgSUlDX1ZTVCwgInZzdDIiLCBEdCwgIlxceyRzcmMxLCAkc3JjMlxcfSwgJGFkZHIkb2Zmc2V0IiwKKyAgICAgICAgICAiJGFkZHIuYWRkciA9ICR3YiIsIFtdPjsKK2NsYXNzIFZTVDJRV0I8Yml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsIDBiMDAsIDBiMDAxMSwgb3A3XzQsIChvdXRzIEdQUjokd2IpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBhbTZvZmZzZXQ6JG9mZnNldCwKKyAgICAgICAgICAgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMywgRFBSOiRzcmM0KSwKKyAgICAgICAgICBJSUNfVlNULCAidnN0MiIsIER0LCAiXFx7JHNyYzEsICRzcmMyLCAkc3JjMywgJHNyYzRcXH0sICRhZGRyJG9mZnNldCIsCisgICAgICAgICAgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT47CisKK2RlZiBWU1QyZDhfVVBEICA6IFZTVDJEV0I8MGIxMDAwLCAwYjAwMDAsICI4Ij47CitkZWYgVlNUMmQxNl9VUEQgOiBWU1QyRFdCPDBiMTAwMCwgMGIwMTAwLCAiMTYiPjsKK2RlZiBWU1QyZDMyX1VQRCA6IFZTVDJEV0I8MGIxMDAwLCAwYjEwMDAsICIzMiI+OworCitkZWYgVlNUMnE4X1VQRCAgOiBWU1QyUVdCPDBiMDAwMCwgIjgiPjsKK2RlZiBWU1QycTE2X1VQRCA6IFZTVDJRV0I8MGIwMTAwLCAiMTYiPjsKK2RlZiBWU1QycTMyX1VQRCA6IFZTVDJRV0I8MGIxMDAwLCAiMzIiPjsKKworLy8gLi4ud2l0aCBkb3VibGUtc3BhY2VkIHJlZ2lzdGVycyAoZm9yIGRpc2Fzc2VtYmx5IG9ubHkpOgorZGVmIFZTVDJiOCAgICAgIDogVlNUMkQ8MGIxMDAxLCAwYjAwMDAsICI4Ij47CitkZWYgVlNUMmIxNiAgICAgOiBWU1QyRDwwYjEwMDEsIDBiMDEwMCwgIjE2Ij47CitkZWYgVlNUMmIzMiAgICAgOiBWU1QyRDwwYjEwMDEsIDBiMTAwMCwgIjMyIj47CitkZWYgVlNUMmI4X1VQRCAgOiBWU1QyRFdCPDBiMTAwMSwgMGIwMDAwLCAiOCI+OworZGVmIFZTVDJiMTZfVVBEIDogVlNUMkRXQjwwYjEwMDEsIDBiMDEwMCwgIjE2Ij47CitkZWYgVlNUMmIzMl9VUEQgOiBWU1QyRFdCPDBiMTAwMSwgMGIxMDAwLCAiMzIiPjsKKworLy8gICBWU1QzICAgICA6IFZlY3RvciBTdG9yZSAobXVsdGlwbGUgMy1lbGVtZW50IHN0cnVjdHVyZXMpCitjbGFzcyBWU1QzRDxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDAsIDBiMDAsIG9wMTFfOCwgb3A3XzQsIChvdXRzKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMyksIElJQ19WU1QsCisgICAgICAgICAgInZzdDMiLCBEdCwgIlxceyRzcmMxLCAkc3JjMiwgJHNyYzNcXH0sICRhZGRyIiwgIiIsIFtdPjsKKworZGVmICBWU1QzZDggICA6IFZTVDNEPDBiMDEwMCwgMGIwMDAwLCAiOCI+OworZGVmICBWU1QzZDE2ICA6IFZTVDNEPDBiMDEwMCwgMGIwMTAwLCAiMTYiPjsKK2RlZiAgVlNUM2QzMiAgOiBWU1QzRDwwYjAxMDAsIDBiMTAwMCwgIjMyIj47CisKKy8vIC4uLndpdGggYWRkcmVzcyByZWdpc3RlciB3cml0ZWJhY2s6CitjbGFzcyBWU1QzRFdCPGJpdHM8ND4gb3AxMV84LCBiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwgMGIwMCwgb3AxMV84LCBvcDdfNCwgKG91dHMgR1BSOiR3YiksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIGFtNm9mZnNldDokb2Zmc2V0LAorICAgICAgICAgICBEUFI6JHNyYzEsIERQUjokc3JjMiwgRFBSOiRzcmMzKSwgSUlDX1ZTVCwKKyAgICAgICAgICAidnN0MyIsIER0LCAiXFx7JHNyYzEsICRzcmMyLCAkc3JjM1xcfSwgJGFkZHIkb2Zmc2V0IiwKKyAgICAgICAgICAiJGFkZHIuYWRkciA9ICR3YiIsIFtdPjsKKworZGVmIFZTVDNkOF9VUEQgIDogVlNUM0RXQjwwYjAxMDAsIDBiMDAwMCwgIjgiPjsKK2RlZiBWU1QzZDE2X1VQRCA6IFZTVDNEV0I8MGIwMTAwLCAwYjAxMDAsICIxNiI+OworZGVmIFZTVDNkMzJfVVBEIDogVlNUM0RXQjwwYjAxMDAsIDBiMTAwMCwgIjMyIj47CisKKy8vIC4uLndpdGggZG91YmxlLXNwYWNlZCByZWdpc3RlcnMgKG5vbi11cGRhdGluZyB2ZXJzaW9ucyBmb3IgZGlzYXNzZW1ibHkgb25seSk6CitkZWYgVlNUM3E4ICAgICAgOiBWU1QzRDwwYjAxMDEsIDBiMDAwMCwgIjgiPjsKK2RlZiBWU1QzcTE2ICAgICA6IFZTVDNEPDBiMDEwMSwgMGIwMTAwLCAiMTYiPjsKK2RlZiBWU1QzcTMyICAgICA6IFZTVDNEPDBiMDEwMSwgMGIxMDAwLCAiMzIiPjsKK2RlZiBWU1QzcThfVVBEICA6IFZTVDNEV0I8MGIwMTAxLCAwYjAwMDAsICI4Ij47CitkZWYgVlNUM3ExNl9VUEQgOiBWU1QzRFdCPDBiMDEwMSwgMGIwMTAwLCAiMTYiPjsKK2RlZiBWU1QzcTMyX1VQRCA6IFZTVDNEV0I8MGIwMTAxLCAwYjEwMDAsICIzMiI+OworCisvLyAuLi5hbHRlcm5hdGUgdmVyc2lvbnMgdG8gYmUgYWxsb2NhdGVkIG9kZCByZWdpc3RlciBudW1iZXJzOgorZGVmIFZTVDNxOG9kZF9VUEQgIDogVlNUM0RXQjwwYjAxMDEsIDBiMDAwMCwgIjgiPjsKK2RlZiBWU1QzcTE2b2RkX1VQRCA6IFZTVDNEV0I8MGIwMTAxLCAwYjAxMDAsICIxNiI+OworZGVmIFZTVDNxMzJvZGRfVVBEIDogVlNUM0RXQjwwYjAxMDEsIDBiMTAwMCwgIjMyIj47CisKKy8vICAgVlNUNCAgICAgOiBWZWN0b3IgU3RvcmUgKG11bHRpcGxlIDQtZWxlbWVudCBzdHJ1Y3R1cmVzKQorY2xhc3MgVlNUNEQ8Yml0czw0PiBvcDExXzgsIGJpdHM8ND4gb3A3XzQsIHN0cmluZyBEdD4KKyAgOiBOTGRTdDwwLCAwYjAwLCBvcDExXzgsIG9wN180LCAob3V0cyksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIERQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFI6JHNyYzMsIERQUjokc3JjNCksCisgICAgICAgICAgSUlDX1ZTVCwgInZzdDQiLCBEdCwgIlxceyRzcmMxLCAkc3JjMiwgJHNyYzMsICRzcmM0XFx9LCAkYWRkciIsCisgICAgICAgICAgIiIsIFtdPjsKKworZGVmICBWU1Q0ZDggICA6IFZTVDREPDBiMDAwMCwgMGIwMDAwLCAiOCI+OworZGVmICBWU1Q0ZDE2ICA6IFZTVDREPDBiMDAwMCwgMGIwMTAwLCAiMTYiPjsKK2RlZiAgVlNUNGQzMiAgOiBWU1Q0RDwwYjAwMDAsIDBiMTAwMCwgIjMyIj47CisKKy8vIC4uLndpdGggYWRkcmVzcyByZWdpc3RlciB3cml0ZWJhY2s6CitjbGFzcyBWU1Q0RFdCPGJpdHM8ND4gb3AxMV84LCBiaXRzPDQ+IG9wN180LCBzdHJpbmcgRHQ+CisgIDogTkxkU3Q8MCwgMGIwMCwgb3AxMV84LCBvcDdfNCwgKG91dHMgR1BSOiR3YiksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIGFtNm9mZnNldDokb2Zmc2V0LAorICAgICAgICAgICBEUFI6JHNyYzEsIERQUjokc3JjMiwgRFBSOiRzcmMzLCBEUFI6JHNyYzQpLCBJSUNfVlNULAorICAgICAgICAgICAidnN0NCIsIER0LCAiXFx7JHNyYzEsICRzcmMyLCAkc3JjMywgJHNyYzRcXH0sICRhZGRyJG9mZnNldCIsCisgICAgICAgICAgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT47CisKK2RlZiBWU1Q0ZDhfVVBEICA6IFZTVDREV0I8MGIwMDAwLCAwYjAwMDAsICI4Ij47CitkZWYgVlNUNGQxNl9VUEQgOiBWU1Q0RFdCPDBiMDAwMCwgMGIwMTAwLCAiMTYiPjsKK2RlZiBWU1Q0ZDMyX1VQRCA6IFZTVDREV0I8MGIwMDAwLCAwYjEwMDAsICIzMiI+OworCisvLyAuLi53aXRoIGRvdWJsZS1zcGFjZWQgcmVnaXN0ZXJzIChub24tdXBkYXRpbmcgdmVyc2lvbnMgZm9yIGRpc2Fzc2VtYmx5IG9ubHkpOgorZGVmIFZTVDRxOCAgICAgIDogVlNUNEQ8MGIwMDAxLCAwYjAwMDAsICI4Ij47CitkZWYgVlNUNHExNiAgICAgOiBWU1Q0RDwwYjAwMDEsIDBiMDEwMCwgIjE2Ij47CitkZWYgVlNUNHEzMiAgICAgOiBWU1Q0RDwwYjAwMDEsIDBiMTAwMCwgIjMyIj47CitkZWYgVlNUNHE4X1VQRCAgOiBWU1Q0RFdCPDBiMDAwMSwgMGIwMDAwLCAiOCI+OworZGVmIFZTVDRxMTZfVVBEIDogVlNUNERXQjwwYjAwMDEsIDBiMDEwMCwgIjE2Ij47CitkZWYgVlNUNHEzMl9VUEQgOiBWU1Q0RFdCPDBiMDAwMSwgMGIxMDAwLCAiMzIiPjsKKworLy8gLi4uYWx0ZXJuYXRlIHZlcnNpb25zIHRvIGJlIGFsbG9jYXRlZCBvZGQgcmVnaXN0ZXIgbnVtYmVyczoKK2RlZiBWU1Q0cThvZGRfVVBEICA6IFZTVDREV0I8MGIwMDAxLCAwYjAwMDAsICI4Ij47CitkZWYgVlNUNHExNm9kZF9VUEQgOiBWU1Q0RFdCPDBiMDAwMSwgMGIwMTAwLCAiMTYiPjsKK2RlZiBWU1Q0cTMyb2RkX1VQRCA6IFZTVDREV0I8MGIwMDAxLCAwYjEwMDAsICIzMiI+OworCisvLyAgIFZTVDFMTiAgIDogVmVjdG9yIFN0b3JlIChzaW5nbGUgZWxlbWVudCBmcm9tIG9uZSBsYW5lKQorLy8gICBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZC4KKworLy8gICBWU1QyTE4gICA6IFZlY3RvciBTdG9yZSAoc2luZ2xlIDItZWxlbWVudCBzdHJ1Y3R1cmUgZnJvbSBvbmUgbGFuZSkKK2NsYXNzIFZTVDJMTjxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDEsIDBiMDAsIG9wMTFfOCwgb3A3XzQsIChvdXRzKSwKKyAgICAgICAgICAoaW5zIGFkZHJtb2RlNjokYWRkciwgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICAgIElJQ19WU1QsICJ2c3QyIiwgRHQsICJcXHskc3JjMVskbGFuZV0sICRzcmMyWyRsYW5lXVxcfSwgJGFkZHIiLAorICAgICAgICAgICIiLCBbXT47CisKK2RlZiBWU1QyTE5kOCAgOiBWU1QyTE48MGIwMDAxLCB7Pyw/LD8sP30sICI4Ij47CitkZWYgVlNUMkxOZDE2IDogVlNUMkxOPDBiMDEwMSwgez8sPywwLD99LCAiMTYiPjsKK2RlZiBWU1QyTE5kMzIgOiBWU1QyTE48MGIxMDAxLCB7PywwLD8sP30sICIzMiI+OworCisvLyAuLi53aXRoIGRvdWJsZS1zcGFjZWQgcmVnaXN0ZXJzOgorZGVmIFZTVDJMTnExNiA6IFZTVDJMTjwwYjAxMDEsIHs/LD8sMSw/fSwgIjE2Ij47CitkZWYgVlNUMkxOcTMyIDogVlNUMkxOPDBiMTAwMSwgez8sMSw/LD99LCAiMzIiPjsKKworLy8gLi4uYWx0ZXJuYXRlIHZlcnNpb25zIHRvIGJlIGFsbG9jYXRlZCBvZGQgcmVnaXN0ZXIgbnVtYmVyczoKK2RlZiBWU1QyTE5xMTZvZGQgOiBWU1QyTE48MGIwMTAxLCB7Pyw/LDEsP30sICIxNiI+OworZGVmIFZTVDJMTnEzMm9kZCA6IFZTVDJMTjwwYjEwMDEsIHs/LDEsPyw/fSwgIjMyIj47CisKKy8vIC4uLndpdGggYWRkcmVzcyByZWdpc3RlciB3cml0ZWJhY2s6CitjbGFzcyBWU1QyTE5XQjxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDEsIDBiMDAsIG9wMTFfOCwgb3A3XzQsIChvdXRzIEdQUjokd2IpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBhbTZvZmZzZXQ6JG9mZnNldCwKKyAgICAgICAgICAgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIG5vaGFzaF9pbW06JGxhbmUpLCBJSUNfVlNULCAidnN0MiIsIER0LAorICAgICAgICAgICJcXHskc3JjMVskbGFuZV0sICRzcmMyWyRsYW5lXVxcfSwgJGFkZHIkb2Zmc2V0IiwKKyAgICAgICAgICAiJGFkZHIuYWRkciA9ICR3YiIsIFtdPjsKKworZGVmIFZTVDJMTmQ4X1VQRCAgOiBWU1QyTE5XQjwwYjAwMDEsIHs/LD8sPyw/fSwgIjgiPjsKK2RlZiBWU1QyTE5kMTZfVVBEIDogVlNUMkxOV0I8MGIwMTAxLCB7Pyw/LDAsP30sICIxNiI+OworZGVmIFZTVDJMTmQzMl9VUEQgOiBWU1QyTE5XQjwwYjEwMDEsIHs/LDAsPyw/fSwgIjMyIj47CisKK2RlZiBWU1QyTE5xMTZfVVBEIDogVlNUMkxOV0I8MGIwMTAxLCB7Pyw/LDEsP30sICIxNiI+OworZGVmIFZTVDJMTnEzMl9VUEQgOiBWU1QyTE5XQjwwYjEwMDEsIHs/LDEsPyw/fSwgIjMyIj47CisKKy8vICAgVlNUM0xOICAgOiBWZWN0b3IgU3RvcmUgKHNpbmdsZSAzLWVsZW1lbnQgc3RydWN0dXJlIGZyb20gb25lIGxhbmUpCitjbGFzcyBWU1QzTE48Yml0czw0PiBvcDExXzgsIGJpdHM8ND4gb3A3XzQsIHN0cmluZyBEdD4KKyAgOiBOTGRTdDwxLCAwYjAwLCBvcDExXzgsIG9wN180LCAob3V0cyksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIERQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFI6JHNyYzMsCisgICAgICAgICAgIG5vaGFzaF9pbW06JGxhbmUpLCBJSUNfVlNULCAidnN0MyIsIER0LAorICAgICAgICAgICJcXHskc3JjMVskbGFuZV0sICRzcmMyWyRsYW5lXSwgJHNyYzNbJGxhbmVdXFx9LCAkYWRkciIsICIiLCBbXT47CisKK2RlZiBWU1QzTE5kOCAgOiBWU1QzTE48MGIwMDEwLCB7Pyw/LD8sMH0sICI4Ij47CitkZWYgVlNUM0xOZDE2IDogVlNUM0xOPDBiMDExMCwgez8sPywwLDB9LCAiMTYiPjsKK2RlZiBWU1QzTE5kMzIgOiBWU1QzTE48MGIxMDEwLCB7PywwLDAsMH0sICIzMiI+OworCisvLyAuLi53aXRoIGRvdWJsZS1zcGFjZWQgcmVnaXN0ZXJzOgorZGVmIFZTVDNMTnExNiA6IFZTVDNMTjwwYjAxMTAsIHs/LD8sMSwwfSwgIjE2Ij47CitkZWYgVlNUM0xOcTMyIDogVlNUM0xOPDBiMTAxMCwgez8sMSwwLDB9LCAiMzIiPjsKKworLy8gLi4uYWx0ZXJuYXRlIHZlcnNpb25zIHRvIGJlIGFsbG9jYXRlZCBvZGQgcmVnaXN0ZXIgbnVtYmVyczoKK2RlZiBWU1QzTE5xMTZvZGQgOiBWU1QzTE48MGIwMTEwLCB7Pyw/LDEsMH0sICIxNiI+OworZGVmIFZTVDNMTnEzMm9kZCA6IFZTVDNMTjwwYjEwMTAsIHs/LDEsMCwwfSwgIjMyIj47CisKKy8vIC4uLndpdGggYWRkcmVzcyByZWdpc3RlciB3cml0ZWJhY2s6CitjbGFzcyBWU1QzTE5XQjxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDEsIDBiMDAsIG9wMTFfOCwgb3A3XzQsIChvdXRzIEdQUjokd2IpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBhbTZvZmZzZXQ6JG9mZnNldCwKKyAgICAgICAgICAgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMywgbm9oYXNoX2ltbTokbGFuZSksCisgICAgICAgICAgSUlDX1ZTVCwgInZzdDMiLCBEdCwKKyAgICAgICAgICAiXFx7JHNyYzFbJGxhbmVdLCAkc3JjMlskbGFuZV0sICRzcmMzWyRsYW5lXVxcfSwgJGFkZHIkb2Zmc2V0IiwKKyAgICAgICAgICAiJGFkZHIuYWRkciA9ICR3YiIsIFtdPjsKKworZGVmIFZTVDNMTmQ4X1VQRCAgOiBWU1QzTE5XQjwwYjAwMTAsIHs/LD8sPywwfSwgIjgiPjsKK2RlZiBWU1QzTE5kMTZfVVBEIDogVlNUM0xOV0I8MGIwMTEwLCB7Pyw/LDAsMH0sICIxNiI+OworZGVmIFZTVDNMTmQzMl9VUEQgOiBWU1QzTE5XQjwwYjEwMTAsIHs/LDAsMCwwfSwgIjMyIj47CisKK2RlZiBWU1QzTE5xMTZfVVBEIDogVlNUM0xOV0I8MGIwMTEwLCB7Pyw/LDEsMH0sICIxNiI+OworZGVmIFZTVDNMTnEzMl9VUEQgOiBWU1QzTE5XQjwwYjEwMTAsIHs/LDEsMCwwfSwgIjMyIj47CisKKy8vICAgVlNUNExOICAgOiBWZWN0b3IgU3RvcmUgKHNpbmdsZSA0LWVsZW1lbnQgc3RydWN0dXJlIGZyb20gb25lIGxhbmUpCitjbGFzcyBWU1Q0TE48Yml0czw0PiBvcDExXzgsIGJpdHM8ND4gb3A3XzQsIHN0cmluZyBEdD4KKyAgOiBOTGRTdDwxLCAwYjAwLCBvcDExXzgsIG9wN180LCAob3V0cyksCisgICAgICAgICAgKGlucyBhZGRybW9kZTY6JGFkZHIsIERQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFI6JHNyYzMsIERQUjokc3JjNCwKKyAgICAgICAgICAgbm9oYXNoX2ltbTokbGFuZSksIElJQ19WU1QsICJ2c3Q0IiwgRHQsCisgICAgICAgICAgIlxceyRzcmMxWyRsYW5lXSwgJHNyYzJbJGxhbmVdLCAkc3JjM1skbGFuZV0sICRzcmM0WyRsYW5lXVxcfSwgJGFkZHIiLAorICAgICAgICAgICIiLCBbXT47CisKK2RlZiBWU1Q0TE5kOCAgOiBWU1Q0TE48MGIwMDExLCB7Pyw/LD8sP30sICI4Ij47CitkZWYgVlNUNExOZDE2IDogVlNUNExOPDBiMDExMSwgez8sPywwLD99LCAiMTYiPjsKK2RlZiBWU1Q0TE5kMzIgOiBWU1Q0TE48MGIxMDExLCB7PywwLD8sP30sICIzMiI+OworCisvLyAuLi53aXRoIGRvdWJsZS1zcGFjZWQgcmVnaXN0ZXJzOgorZGVmIFZTVDRMTnExNiA6IFZTVDRMTjwwYjAxMTEsIHs/LD8sMSw/fSwgIjE2Ij47CitkZWYgVlNUNExOcTMyIDogVlNUNExOPDBiMTAxMSwgez8sMSw/LD99LCAiMzIiPjsKKworLy8gLi4uYWx0ZXJuYXRlIHZlcnNpb25zIHRvIGJlIGFsbG9jYXRlZCBvZGQgcmVnaXN0ZXIgbnVtYmVyczoKK2RlZiBWU1Q0TE5xMTZvZGQgOiBWU1Q0TE48MGIwMTExLCB7Pyw/LDEsP30sICIxNiI+OworZGVmIFZTVDRMTnEzMm9kZCA6IFZTVDRMTjwwYjEwMTEsIHs/LDEsPyw/fSwgIjMyIj47CisKKy8vIC4uLndpdGggYWRkcmVzcyByZWdpc3RlciB3cml0ZWJhY2s6CitjbGFzcyBWU1Q0TE5XQjxiaXRzPDQ+IG9wMTFfOCwgYml0czw0PiBvcDdfNCwgc3RyaW5nIER0PgorICA6IE5MZFN0PDEsIDBiMDAsIG9wMTFfOCwgb3A3XzQsIChvdXRzIEdQUjokd2IpLAorICAgICAgICAgIChpbnMgYWRkcm1vZGU2OiRhZGRyLCBhbTZvZmZzZXQ6JG9mZnNldCwKKyAgICAgICAgICAgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMywgRFBSOiRzcmM0LCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgICBJSUNfVlNULCAidnN0NCIsIER0LAorICAiXFx7JHNyYzFbJGxhbmVdLCAkc3JjMlskbGFuZV0sICRzcmMzWyRsYW5lXSwgJHNyYzRbJGxhbmVdXFx9LCAkYWRkciRvZmZzZXQiLAorICAgICAgICAgICIkYWRkci5hZGRyID0gJHdiIiwgW10+OworCitkZWYgVlNUNExOZDhfVVBEICA6IFZTVDRMTldCPDBiMDAxMSwgez8sPyw/LD99LCAiOCI+OworZGVmIFZTVDRMTmQxNl9VUEQgOiBWU1Q0TE5XQjwwYjAxMTEsIHs/LD8sMCw/fSwgIjE2Ij47CitkZWYgVlNUNExOZDMyX1VQRCA6IFZTVDRMTldCPDBiMTAxMSwgez8sMCw/LD99LCAiMzIiPjsKKworZGVmIFZTVDRMTnExNl9VUEQgOiBWU1Q0TE5XQjwwYjAxMTEsIHs/LD8sMSw/fSwgIjE2Ij47CitkZWYgVlNUNExOcTMyX1VQRCA6IFZTVDRMTldCPDBiMTAxMSwgez8sMSw/LD99LCAiMzIiPjsKKworfSAvLyBtYXlTdG9yZSA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxID0gMQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBORU9OIHBhdHRlcm4gZnJhZ21lbnRzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBFeHRyYWN0IEQgc3ViLXJlZ2lzdGVycyBvZiBRIHJlZ2lzdGVycy4KK2RlZiBEU3ViUmVnX2k4X3JlZyAgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIGFzc2VydChBUk06OmRzdWJfNyA9PSBBUk06OmRzdWJfMCs3ICYmICJVbmV4cGVjdGVkIHN1YnJlZyBudW1iZXJpbmciKTsKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNOjpkc3ViXzAgKyBOLT5nZXRaRXh0VmFsdWUoKS84LCBNVlQ6OmkzMik7Cit9XT47CitkZWYgRFN1YlJlZ19pMTZfcmVnIDogU0ROb2RlWEZvcm08aW1tLCBbeworICBhc3NlcnQoQVJNOjpkc3ViXzcgPT0gQVJNOjpkc3ViXzArNyAmJiAiVW5leHBlY3RlZCBzdWJyZWcgbnVtYmVyaW5nIik7CisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFSTTo6ZHN1Yl8wICsgTi0+Z2V0WkV4dFZhbHVlKCkvNCwgTVZUOjppMzIpOworfV0+OworZGVmIERTdWJSZWdfaTMyX3JlZyA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgYXNzZXJ0KEFSTTo6ZHN1Yl83ID09IEFSTTo6ZHN1Yl8wKzcgJiYgIlVuZXhwZWN0ZWQgc3VicmVnIG51bWJlcmluZyIpOworICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OmRzdWJfMCArIE4tPmdldFpFeHRWYWx1ZSgpLzIsIE1WVDo6aTMyKTsKK31dPjsKK2RlZiBEU3ViUmVnX2Y2NF9yZWcgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIGFzc2VydChBUk06OmRzdWJfNyA9PSBBUk06OmRzdWJfMCs3ICYmICJVbmV4cGVjdGVkIHN1YnJlZyBudW1iZXJpbmciKTsKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQVJNOjpkc3ViXzAgKyBOLT5nZXRaRXh0VmFsdWUoKSwgTVZUOjppMzIpOworfV0+OworCisvLyBFeHRyYWN0IFMgc3ViLXJlZ2lzdGVycyBvZiBRL0QgcmVnaXN0ZXJzLgorZGVmIFNTdWJSZWdfZjMyX3JlZyA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgYXNzZXJ0KEFSTTo6c3N1Yl8zID09IEFSTTo6c3N1Yl8wKzMgJiYgIlVuZXhwZWN0ZWQgc3VicmVnIG51bWJlcmluZyIpOworICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBUk06OnNzdWJfMCArIE4tPmdldFpFeHRWYWx1ZSgpLCBNVlQ6OmkzMik7Cit9XT47CisKKy8vIFRyYW5zbGF0ZSBsYW5lIG51bWJlcnMgZnJvbSBRIHJlZ2lzdGVycyB0byBEIHN1YnJlZ3MuCitkZWYgU3ViUmVnX2k4X2xhbmUgIDogU0ROb2RlWEZvcm08aW1tLCBbeworICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChOLT5nZXRaRXh0VmFsdWUoKSAmIDcsIE1WVDo6aTMyKTsKK31dPjsKK2RlZiBTdWJSZWdfaTE2X2xhbmUgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KE4tPmdldFpFeHRWYWx1ZSgpICYgMywgTVZUOjppMzIpOworfV0+OworZGVmIFN1YlJlZ19pMzJfbGFuZSA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoTi0+Z2V0WkV4dFZhbHVlKCkgJiAxLCBNVlQ6OmkzMik7Cit9XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBDbGFzc2VzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBCYXNpYyAyLXJlZ2lzdGVyIG9wZXJhdGlvbnM6IHNpbmdsZS0sIGRvdWJsZS0gYW5kIHF1YWQtcmVnaXN0ZXIuCitjbGFzcyBOMlZTPGJpdHM8Mj4gb3AyNF8yMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDI+IG9wMTlfMTgsCisgICAgICAgICAgIGJpdHM8Mj4gb3AxN18xNiwgYml0czw1PiBvcDExXzcsIGJpdCBvcDQsIHN0cmluZyBPcGNvZGVTdHIsCisgICAgICAgICAgIHN0cmluZyBEdCwgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgU0ROb2RlIE9wTm9kZT4KKyAgOiBOMlY8b3AyNF8yMywgb3AyMV8yMCwgb3AxOV8xOCwgb3AxN18xNiwgb3AxMV83LCAwLCBvcDQsCisgICAgICAgIChvdXRzIERQUl9WRlAyOiRkc3QpLCAoaW5zIERQUl9WRlAyOiRzcmMpLAorICAgICAgICBJSUNfVlVOQUQsIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjIiwgIiIsIFtdPjsKK2NsYXNzIE4yVkQ8Yml0czwyPiBvcDI0XzIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8Mj4gb3AxOV8xOCwKKyAgICAgICAgICAgYml0czwyPiBvcDE3XzE2LCBiaXRzPDU+IG9wMTFfNywgYml0IG9wNCwgc3RyaW5nIE9wY29kZVN0ciwKKyAgICAgICAgICAgc3RyaW5nIER0LCBWYWx1ZVR5cGUgUmVzVHksIFZhbHVlVHlwZSBPcFR5LCBTRE5vZGUgT3BOb2RlPgorICA6IE4yVjxvcDI0XzIzLCBvcDIxXzIwLCBvcDE5XzE4LCBvcDE3XzE2LCBvcDExXzcsIDAsIG9wNCwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokc3JjKSwgSUlDX1ZVTkFELCBPcGNvZGVTdHIsIER0LCIkZHN0LCAkc3JjIiwgIiIsCisgICAgICAgIFsoc2V0IERQUjokZHN0LCAoUmVzVHkgKE9wTm9kZSAoT3BUeSBEUFI6JHNyYykpKSldPjsKK2NsYXNzIE4yVlE8Yml0czwyPiBvcDI0XzIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8Mj4gb3AxOV8xOCwKKyAgICAgICAgICAgYml0czwyPiBvcDE3XzE2LCBiaXRzPDU+IG9wMTFfNywgYml0IG9wNCwgc3RyaW5nIE9wY29kZVN0ciwKKyAgICAgICAgICAgc3RyaW5nIER0LCBWYWx1ZVR5cGUgUmVzVHksIFZhbHVlVHlwZSBPcFR5LCBTRE5vZGUgT3BOb2RlPgorICA6IE4yVjxvcDI0XzIzLCBvcDIxXzIwLCBvcDE5XzE4LCBvcDE3XzE2LCBvcDExXzcsIDEsIG9wNCwgKG91dHMgUVBSOiRkc3QpLAorICAgICAgICAoaW5zIFFQUjokc3JjKSwgSUlDX1ZVTkFRLCBPcGNvZGVTdHIsIER0LCIkZHN0LCAkc3JjIiwgIiIsCisgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoUmVzVHkgKE9wTm9kZSAoT3BUeSBRUFI6JHNyYykpKSldPjsKKworLy8gQmFzaWMgMi1yZWdpc3RlciBpbnRyaW5zaWNzLCBib3RoIGRvdWJsZS0gYW5kIHF1YWQtcmVnaXN0ZXIuCitjbGFzcyBOMlZESW50PGJpdHM8Mj4gb3AyNF8yMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDI+IG9wMTlfMTgsCisgICAgICAgICAgICAgIGJpdHM8Mj4gb3AxN18xNiwgYml0czw1PiBvcDExXzcsIGJpdCBvcDQsCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgSW50cmluc2ljIEludE9wPgorICA6IE4yVjxvcDI0XzIzLCBvcDIxXzIwLCBvcDE5XzE4LCBvcDE3XzE2LCBvcDExXzcsIDAsIG9wNCwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokc3JjKSwgaXRpbiwgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMiLCAiIiwKKyAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChSZXNUeSAoSW50T3AgKE9wVHkgRFBSOiRzcmMpKSkpXT47CitjbGFzcyBOMlZRSW50PGJpdHM8Mj4gb3AyNF8yMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDI+IG9wMTlfMTgsCisgICAgICAgICAgICAgIGJpdHM8Mj4gb3AxN18xNiwgYml0czw1PiBvcDExXzcsIGJpdCBvcDQsCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgSW50cmluc2ljIEludE9wPgorICA6IE4yVjxvcDI0XzIzLCBvcDIxXzIwLCBvcDE5XzE4LCBvcDE3XzE2LCBvcDExXzcsIDEsIG9wNCwgKG91dHMgUVBSOiRkc3QpLAorICAgICAgICAoaW5zIFFQUjokc3JjKSwgaXRpbiwgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMiLCAiIiwKKyAgICAgICAgWyhzZXQgUVBSOiRkc3QsIChSZXNUeSAoSW50T3AgKE9wVHkgUVBSOiRzcmMpKSkpXT47CisKKy8vIE5hcnJvdyAyLXJlZ2lzdGVyIGludHJpbnNpY3MuCitjbGFzcyBOMlZOSW50PGJpdHM8Mj4gb3AyNF8yMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDI+IG9wMTlfMTgsCisgICAgICAgICAgICAgIGJpdHM8Mj4gb3AxN18xNiwgYml0czw1PiBvcDExXzcsIGJpdCBvcDYsIGJpdCBvcDQsCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgVmFsdWVUeXBlIFR5RCwgVmFsdWVUeXBlIFR5USwgSW50cmluc2ljIEludE9wPgorICA6IE4yVjxvcDI0XzIzLCBvcDIxXzIwLCBvcDE5XzE4LCBvcDE3XzE2LCBvcDExXzcsIG9wNiwgb3A0LCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgIChpbnMgUVBSOiRzcmMpLCBpdGluLCBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYyIsICIiLAorICAgICAgICBbKHNldCBEUFI6JGRzdCwgKFR5RCAoSW50T3AgKFR5USBRUFI6JHNyYykpKSldPjsKKworLy8gTG9uZyAyLXJlZ2lzdGVyIGludHJpbnNpY3MgKGN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIFZNT1ZMKS4KK2NsYXNzIE4yVkxJbnQ8Yml0czwyPiBvcDI0XzIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8Mj4gb3AxOV8xOCwKKyAgICAgICAgICAgICAgYml0czwyPiBvcDE3XzE2LCBiaXRzPDU+IG9wMTFfNywgYml0IG9wNiwgYml0IG9wNCwKKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICBWYWx1ZVR5cGUgVHlRLCBWYWx1ZVR5cGUgVHlELCBJbnRyaW5zaWMgSW50T3A+CisgIDogTjJWPG9wMjRfMjMsIG9wMjFfMjAsIG9wMTlfMTgsIG9wMTdfMTYsIG9wMTFfNywgb3A2LCBvcDQsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgKGlucyBEUFI6JHNyYyksIGl0aW4sIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjIiwgIiIsCisgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoVHlRIChJbnRPcCAoVHlEIERQUjokc3JjKSkpKV0+OworCisvLyAyLXJlZ2lzdGVyIHNodWZmbGVzIChWVFJOL1ZaSVAvVlVaUCksIGJvdGggZG91YmxlLSBhbmQgcXVhZC1yZWdpc3Rlci4KK2NsYXNzIE4yVkRTaHVmZmxlPGJpdHM8Mj4gb3AxOV8xOCwgYml0czw1PiBvcDExXzcsIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdD4KKyAgOiBOMlY8MGIxMSwgMGIxMSwgb3AxOV8xOCwgMGIxMCwgb3AxMV83LCAwLCAwLCAob3V0cyBEUFI6JGRzdDEsIERQUjokZHN0MiksCisgICAgICAgIChpbnMgRFBSOiRzcmMxLCBEUFI6JHNyYzIpLCBJSUNfVlBFUk1ELCAKKyAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QxLCAkZHN0MiIsCisgICAgICAgICIkc3JjMSA9ICRkc3QxLCAkc3JjMiA9ICRkc3QyIiwgW10+OworY2xhc3MgTjJWUVNodWZmbGU8Yml0czwyPiBvcDE5XzE4LCBiaXRzPDU+IG9wMTFfNywKKyAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdD4KKyAgOiBOMlY8MGIxMSwgMGIxMSwgb3AxOV8xOCwgMGIxMCwgb3AxMV83LCAxLCAwLCAob3V0cyBRUFI6JGRzdDEsIFFQUjokZHN0MiksCisgICAgICAgIChpbnMgUVBSOiRzcmMxLCBRUFI6JHNyYzIpLCBpdGluLCBPcGNvZGVTdHIsIER0LCAiJGRzdDEsICRkc3QyIiwKKyAgICAgICAgIiRzcmMxID0gJGRzdDEsICRzcmMyID0gJGRzdDIiLCBbXT47CisKKy8vIEJhc2ljIDMtcmVnaXN0ZXIgb3BlcmF0aW9uczogc2luZ2xlLSwgZG91YmxlLSBhbmQgcXVhZC1yZWdpc3Rlci4KK2NsYXNzIE4zVlM8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksCisgICAgICAgICAgIFNETm9kZSBPcE5vZGUsIGJpdCBDb21tdXRhYmxlPgorICA6IE4zVjxvcDI0LCBvcDIzLCBvcDIxXzIwLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgKG91dHMgRFBSX1ZGUDI6JGRzdCksIChpbnMgRFBSX1ZGUDI6JHNyYzEsIERQUl9WRlAyOiRzcmMyKSwgTjNSZWdGcm0sCisgICAgICAgIElJQ19WQklORCwgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMxLCAkc3JjMiIsICIiLCBbXT4geworICBsZXQgaXNDb21tdXRhYmxlID0gQ29tbXV0YWJsZTsKK30KKworY2xhc3MgTjNWRDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgU0ROb2RlIE9wTm9kZSwgYml0IENvbW11dGFibGU+CisgIDogTjNWPG9wMjQsIG9wMjMsIG9wMjFfMjAsIG9wMTFfOCwgMCwgb3A0LAorICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRzcmMxLCBEUFI6JHNyYzIpLCBOM1JlZ0ZybSwgaXRpbiwKKyAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMxLCAkc3JjMiIsICIiLAorICAgICAgICBbKHNldCBEUFI6JGRzdCwgKFJlc1R5IChPcE5vZGUgKE9wVHkgRFBSOiRzcmMxKSwgKE9wVHkgRFBSOiRzcmMyKSkpKV0+IHsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IENvbW11dGFibGU7Cit9CisvLyBTYW1lIGFzIE4zVkQgYnV0IG5vIGRhdGEgdHlwZS4KK2NsYXNzIE4zVkRYPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNCwKKyAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIE9wY29kZVN0ciwKKyAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwKKyAgICAgICAgICAgU0ROb2RlIE9wTm9kZSwgYml0IENvbW11dGFibGU+CisgIDogTjNWWDxvcDI0LCBvcDIzLCBvcDIxXzIwLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JHNyYzEsIERQUjokc3JjMiksIE4zUmVnRnJtLCBpdGluLCAKKyAgICAgICAgIE9wY29kZVN0ciwgIiRkc3QsICRzcmMxLCAkc3JjMiIsICIiLAorICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChSZXNUeSAoT3BOb2RlIChPcFR5IERQUjokc3JjMSksIChPcFR5IERQUjokc3JjMikpKSldPnsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IENvbW11dGFibGU7Cit9CisKK2NsYXNzIE4zVkRTTDxiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCAKKyAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgVmFsdWVUeXBlIFR5LCBTRE5vZGUgU2hPcD4KKyAgOiBOM1Y8MCwgMSwgb3AyMV8yMCwgb3AxMV84LCAxLCAwLAorICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRzcmMxLCBEUFJfVkZQMjokc3JjMiwgbm9oYXNoX2ltbTokbGFuZSksCisgICAgICAgIE5WTXVsU0xGcm0sIGl0aW4sIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjMSwgJHNyYzJbJGxhbmVdIiwgIiIsCisgICAgICAgIFsoc2V0IChUeSBEUFI6JGRzdCksCisgICAgICAgICAgICAgIChUeSAoU2hPcCAoVHkgRFBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChUeSAoTkVPTnZkdXBsYW5lIChUeSBEUFJfVkZQMjokc3JjMiksaW1tOiRsYW5lKSkpKSldPiB7CisgIGxldCBpc0NvbW11dGFibGUgPSAwOworfQorY2xhc3MgTjNWRFNMMTY8Yml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwgCisgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBUeSwgU0ROb2RlIFNoT3A+CisgIDogTjNWPDAsIDEsIG9wMjFfMjAsIG9wMTFfOCwgMSwgMCwKKyAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjMSwgRFBSXzg6JHNyYzIsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICBOVk11bFNMRnJtLCBJSUNfVk1VTGkxNkQsIE9wY29kZVN0ciwgRHQsIiRkc3QsICRzcmMxLCAkc3JjMlskbGFuZV0iLCIiLAorICAgICAgICBbKHNldCAoVHkgRFBSOiRkc3QpLAorICAgICAgICAgICAgICAoVHkgKFNoT3AgKFR5IERQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAoVHkgKE5FT052ZHVwbGFuZSAoVHkgRFBSXzg6JHNyYzIpLCBpbW06JGxhbmUpKSkpKV0+IHsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDA7Cit9CisKK2NsYXNzIE4zVlE8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksIFNETm9kZSBPcE5vZGUsIGJpdCBDb21tdXRhYmxlPgorICA6IE4zVjxvcDI0LCBvcDIzLCBvcDIxXzIwLCBvcDExXzgsIDEsIG9wNCwKKyAgICAgICAgKG91dHMgUVBSOiRkc3QpLCAoaW5zIFFQUjokc3JjMSwgUVBSOiRzcmMyKSwgTjNSZWdGcm0sIGl0aW4sIAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzEsICRzcmMyIiwgIiIsCisgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoUmVzVHkgKE9wTm9kZSAoT3BUeSBRUFI6JHNyYzEpLCAoT3BUeSBRUFI6JHNyYzIpKSkpXT4geworICBsZXQgaXNDb21tdXRhYmxlID0gQ29tbXV0YWJsZTsKK30KK2NsYXNzIE4zVlFYPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNCwKKyAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIE9wY29kZVN0ciwKKyAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgU0ROb2RlIE9wTm9kZSwgYml0IENvbW11dGFibGU+CisgIDogTjNWWDxvcDI0LCBvcDIzLCBvcDIxXzIwLCBvcDExXzgsIDEsIG9wNCwKKyAgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBRUFI6JHNyYzEsIFFQUjokc3JjMiksIE4zUmVnRnJtLCBpdGluLCAKKyAgICAgICAgIE9wY29kZVN0ciwgIiRkc3QsICRzcmMxLCAkc3JjMiIsICIiLAorICAgICAgICAgWyhzZXQgUVBSOiRkc3QsIChSZXNUeSAoT3BOb2RlIChPcFR5IFFQUjokc3JjMSksIChPcFR5IFFQUjokc3JjMikpKSldPnsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IENvbW11dGFibGU7Cit9CitjbGFzcyBOM1ZRU0w8Yml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwgCisgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksIFNETm9kZSBTaE9wPgorICA6IE4zVjwxLCAxLCBvcDIxXzIwLCBvcDExXzgsIDEsIDAsCisgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBRUFI6JHNyYzEsIERQUl9WRlAyOiRzcmMyLCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgTlZNdWxTTEZybSwgaXRpbiwgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMxLCAkc3JjMlskbGFuZV0iLCAiIiwKKyAgICAgICAgWyhzZXQgKFJlc1R5IFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgKFJlc1R5IChTaE9wIChSZXNUeSBRUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJlc1R5IChORU9OdmR1cGxhbmUgKE9wVHkgRFBSX1ZGUDI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRsYW5lKSkpKSldPiB7CisgIGxldCBpc0NvbW11dGFibGUgPSAwOworfQorY2xhc3MgTjNWUVNMMTY8Yml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgU0ROb2RlIFNoT3A+CisgIDogTjNWPDEsIDEsIG9wMjFfMjAsIG9wMTFfOCwgMSwgMCwKKyAgICAgICAgKG91dHMgUVBSOiRkc3QpLCAoaW5zIFFQUjokc3JjMSwgRFBSXzg6JHNyYzIsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICBOVk11bFNMRnJtLCBJSUNfVk1VTGkxNlEsIE9wY29kZVN0ciwgRHQsIiRkc3QsICRzcmMxLCAkc3JjMlskbGFuZV0iLCIiLAorICAgICAgICBbKHNldCAoUmVzVHkgUVBSOiRkc3QpLAorICAgICAgICAgICAgICAoUmVzVHkgKFNoT3AgKFJlc1R5IFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVzVHkgKE5FT052ZHVwbGFuZSAoT3BUeSBEUFJfODokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGxhbmUpKSkpKV0+IHsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDA7Cit9CisKKy8vIEJhc2ljIDMtcmVnaXN0ZXIgaW50cmluc2ljcywgYm90aCBkb3VibGUtIGFuZCBxdWFkLXJlZ2lzdGVyLgorY2xhc3MgTjNWREludDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksIEludHJpbnNpYyBJbnRPcCwgYml0IENvbW11dGFibGU+CisgIDogTjNWPG9wMjQsIG9wMjMsIG9wMjFfMjAsIG9wMTFfOCwgMCwgb3A0LAorICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRzcmMxLCBEUFI6JHNyYzIpLCBmLCBpdGluLAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzEsICRzcmMyIiwgIiIsCisgICAgICAgIFsoc2V0IERQUjokZHN0LCAoUmVzVHkgKEludE9wIChPcFR5IERQUjokc3JjMSksIChPcFR5IERQUjokc3JjMikpKSldPiB7CisgIGxldCBpc0NvbW11dGFibGUgPSBDb21tdXRhYmxlOworfQorY2xhc3MgTjNWREludFNMPGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIEluc3RySXRpbkNsYXNzIGl0aW4sIAorICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgVmFsdWVUeXBlIFR5LCBJbnRyaW5zaWMgSW50T3A+CisgIDogTjNWPDAsIDEsIG9wMjFfMjAsIG9wMTFfOCwgMSwgMCwKKyAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjMSwgRFBSX1ZGUDI6JHNyYzIsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICBOVk11bFNMRnJtLCBpdGluLCBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzEsICRzcmMyWyRsYW5lXSIsICIiLAorICAgICAgICBbKHNldCAoVHkgRFBSOiRkc3QpLAorICAgICAgICAgICAgICAoVHkgKEludE9wIChUeSBEUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChUeSAoTkVPTnZkdXBsYW5lIChUeSBEUFJfVkZQMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRsYW5lKSkpKSldPiB7CisgIGxldCBpc0NvbW11dGFibGUgPSAwOworfQorY2xhc3MgTjNWREludFNMMTY8Yml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwgSW5zdHJJdGluQ2xhc3MgaXRpbiwKKyAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgVmFsdWVUeXBlIFR5LCBJbnRyaW5zaWMgSW50T3A+CisgIDogTjNWPDAsIDEsIG9wMjFfMjAsIG9wMTFfOCwgMSwgMCwKKyAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjMSwgRFBSXzg6JHNyYzIsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICBOVk11bFNMRnJtLCBpdGluLCBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzEsICRzcmMyWyRsYW5lXSIsICIiLAorICAgICAgICBbKHNldCAoVHkgRFBSOiRkc3QpLAorICAgICAgICAgICAgICAoVHkgKEludE9wIChUeSBEUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChUeSAoTkVPTnZkdXBsYW5lIChUeSBEUFJfODokc3JjMiksIGltbTokbGFuZSkpKSkpXT4geworICBsZXQgaXNDb21tdXRhYmxlID0gMDsKK30KKworY2xhc3MgTjNWUUludDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgIEZvcm1hdCBmLCBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksIEludHJpbnNpYyBJbnRPcCwgYml0IENvbW11dGFibGU+CisgIDogTjNWPG9wMjQsIG9wMjMsIG9wMjFfMjAsIG9wMTFfOCwgMSwgb3A0LAorICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgUVBSOiRzcmMxLCBRUFI6JHNyYzIpLCBmLCBpdGluLAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzEsICRzcmMyIiwgIiIsCisgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoUmVzVHkgKEludE9wIChPcFR5IFFQUjokc3JjMSksIChPcFR5IFFQUjokc3JjMikpKSldPiB7CisgIGxldCBpc0NvbW11dGFibGUgPSBDb21tdXRhYmxlOworfQorY2xhc3MgTjNWUUludFNMPGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIEluc3RySXRpbkNsYXNzIGl0aW4sIAorICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgUmVzVHksIFZhbHVlVHlwZSBPcFR5LCBJbnRyaW5zaWMgSW50T3A+CisgIDogTjNWPDEsIDEsIG9wMjFfMjAsIG9wMTFfOCwgMSwgMCwKKyAgICAgICAgKG91dHMgUVBSOiRkc3QpLCAoaW5zIFFQUjokc3JjMSwgRFBSX1ZGUDI6JHNyYzIsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICBOVk11bFNMRnJtLCBpdGluLCBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzEsICRzcmMyWyRsYW5lXSIsICIiLAorICAgICAgICBbKHNldCAoUmVzVHkgUVBSOiRkc3QpLAorICAgICAgICAgICAgICAoUmVzVHkgKEludE9wIChSZXNUeSBRUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZXNUeSAoTkVPTnZkdXBsYW5lIChPcFR5IERQUl9WRlAyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGxhbmUpKSkpKV0+IHsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDA7Cit9CitjbGFzcyBOM1ZRSW50U0wxNjxiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgSW50cmluc2ljIEludE9wPgorICA6IE4zVjwxLCAxLCBvcDIxXzIwLCBvcDExXzgsIDEsIDAsCisgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBRUFI6JHNyYzEsIERQUl84OiRzcmMyLCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgTlZNdWxTTEZybSwgaXRpbiwgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMxLCAkc3JjMlskbGFuZV0iLCAiIiwKKyAgICAgICAgWyhzZXQgKFJlc1R5IFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgKFJlc1R5IChJbnRPcCAoUmVzVHkgUVBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVzVHkgKE5FT052ZHVwbGFuZSAoT3BUeSBEUFJfODokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRsYW5lKSkpKSldPiB7CisgIGxldCBpc0NvbW11dGFibGUgPSAwOworfQorCisvLyBNdWx0aXBseS1BZGQvU3ViIG9wZXJhdGlvbnM6IHNpbmdsZS0sIGRvdWJsZS0gYW5kIHF1YWQtcmVnaXN0ZXIuCitjbGFzcyBOM1ZTTXVsT3A8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgVHksIFNETm9kZSBNdWxPcCwgU0ROb2RlIE9wTm9kZT4KKyAgOiBOM1Y8b3AyNCwgb3AyMywgb3AyMV8yMCwgb3AxMV84LCAwLCBvcDQsCisgICAgICAgIChvdXRzIERQUl9WRlAyOiRkc3QpLAorICAgICAgICAoaW5zIERQUl9WRlAyOiRzcmMxLCBEUFJfVkZQMjokc3JjMiwgRFBSX1ZGUDI6JHNyYzMpLCBOM1JlZ0ZybSwgaXRpbiwKKyAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMyLCAkc3JjMyIsICIkc3JjMSA9ICRkc3QiLCBbXT47CisKK2NsYXNzIE4zVkRNdWxPcDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgIFZhbHVlVHlwZSBUeSwgU0ROb2RlIE11bE9wLCBTRE5vZGUgT3BOb2RlPgorICA6IE4zVjxvcDI0LCBvcDIzLCBvcDIxXzIwLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFI6JHNyYzMpLCBOM1JlZ0ZybSwgaXRpbiwKKyAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMyLCAkc3JjMyIsICIkc3JjMSA9ICRkc3QiLAorICAgICAgICBbKHNldCBEUFI6JGRzdCwgKFR5IChPcE5vZGUgRFBSOiRzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHkgKE11bE9wIERQUjokc3JjMiwgRFBSOiRzcmMzKSkpKSldPjsKK2NsYXNzIE4zVkRNdWxPcFNMPGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgVHksIFNETm9kZSBNdWxPcCwgU0ROb2RlIFNoT3A+CisgIDogTjNWPDAsIDEsIG9wMjFfMjAsIG9wMTFfOCwgMSwgMCwKKyAgICAgICAgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFJfVkZQMjokc3JjMywgbm9oYXNoX2ltbTokbGFuZSksCisgICAgICAgIE5WTXVsU0xGcm0sIGl0aW4sCisgICAgICAgIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjMiwgJHNyYzNbJGxhbmVdIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgIFsoc2V0IChUeSBEUFI6JGRzdCksCisgICAgICAgICAgICAgIChUeSAoU2hPcCAoVHkgRFBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChUeSAoTXVsT3AgRFBSOiRzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHkgKE5FT052ZHVwbGFuZSAoVHkgRFBSX1ZGUDI6JHNyYzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGxhbmUpKSkpKSkpXT47CitjbGFzcyBOM1ZETXVsT3BTTDE2PGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICAgICAgVmFsdWVUeXBlIFR5LCBTRE5vZGUgTXVsT3AsIFNETm9kZSBTaE9wPgorICA6IE4zVjwwLCAxLCBvcDIxXzIwLCBvcDExXzgsIDEsIDAsCisgICAgICAgIChvdXRzIERQUjokZHN0KSwKKyAgICAgICAgKGlucyBEUFI6JHNyYzEsIERQUjokc3JjMiwgRFBSXzg6JHNyYzMsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICBOVk11bFNMRnJtLCBpdGluLAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzIsICRzcmMzWyRsYW5lXSIsICIkc3JjMSA9ICRkc3QiLAorICAgICAgICBbKHNldCAoVHkgRFBSOiRkc3QpLAorICAgICAgICAgICAgICAoVHkgKFNoT3AgKFR5IERQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAoVHkgKE11bE9wIERQUjokc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFR5IChORU9OdmR1cGxhbmUgKFR5IERQUl84OiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRsYW5lKSkpKSkpKV0+OworCitjbGFzcyBOM1ZRTXVsT3A8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgVmFsdWVUeXBlIFR5LAorICAgICAgICAgICAgICAgIFNETm9kZSBNdWxPcCwgU0ROb2RlIE9wTm9kZT4KKyAgOiBOM1Y8b3AyNCwgb3AyMywgb3AyMV8yMCwgb3AxMV84LCAxLCBvcDQsCisgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBRUFI6JHNyYzEsIFFQUjokc3JjMiwgUVBSOiRzcmMzKSwgTjNSZWdGcm0sIGl0aW4sCisgICAgICAgIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjMiwgJHNyYzMiLCAiJHNyYzEgPSAkZHN0IiwKKyAgICAgICAgWyhzZXQgUVBSOiRkc3QsIChUeSAoT3BOb2RlIFFQUjokc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFR5IChNdWxPcCBRUFI6JHNyYzIsIFFQUjokc3JjMykpKSkpXT47CitjbGFzcyBOM1ZRTXVsT3BTTDxiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBWYWx1ZVR5cGUgUmVzVHksIFZhbHVlVHlwZSBPcFR5LAorICAgICAgICAgICAgICAgICAgU0ROb2RlIE11bE9wLCBTRE5vZGUgU2hPcD4KKyAgOiBOM1Y8MSwgMSwgb3AyMV8yMCwgb3AxMV84LCAxLCAwLAorICAgICAgICAob3V0cyBRUFI6JGRzdCksCisgICAgICAgIChpbnMgUVBSOiRzcmMxLCBRUFI6JHNyYzIsIERQUl9WRlAyOiRzcmMzLCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgTlZNdWxTTEZybSwgaXRpbiwKKyAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMyLCAkc3JjM1skbGFuZV0iLCAiJHNyYzEgPSAkZHN0IiwKKyAgICAgICAgWyhzZXQgKFJlc1R5IFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgKFJlc1R5IChTaE9wIChSZXNUeSBRUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJlc1R5IChNdWxPcCBRUFI6JHNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZXNUeSAoTkVPTnZkdXBsYW5lIChPcFR5IERQUl9WRlAyOiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRsYW5lKSkpKSkpKV0+OworY2xhc3MgTjNWUU11bE9wU0wxNjxiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksCisgICAgICAgICAgICAgICAgICAgIFNETm9kZSBNdWxPcCwgU0ROb2RlIFNoT3A+CisgIDogTjNWPDEsIDEsIG9wMjFfMjAsIG9wMTFfOCwgMSwgMCwKKyAgICAgICAgKG91dHMgUVBSOiRkc3QpLAorICAgICAgICAoaW5zIFFQUjokc3JjMSwgUVBSOiRzcmMyLCBEUFJfODokc3JjMywgbm9oYXNoX2ltbTokbGFuZSksCisgICAgICAgIE5WTXVsU0xGcm0sIGl0aW4sCisgICAgICAgIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjMiwgJHNyYzNbJGxhbmVdIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgIFsoc2V0IChSZXNUeSBRUFI6JGRzdCksCisgICAgICAgICAgICAgIChSZXNUeSAoU2hPcCAoUmVzVHkgUVBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZXNUeSAoTXVsT3AgUVBSOiRzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVzVHkgKE5FT052ZHVwbGFuZSAoT3BUeSBEUFJfODokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokbGFuZSkpKSkpKSldPjsKKworLy8gTmVvbiAzLWFyZ3VtZW50IGludHJpbnNpY3MsIGJvdGggZG91YmxlLSBhbmQgcXVhZC1yZWdpc3Rlci4KKy8vIFRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpcyBhbHNvIHVzZWQgYXMgdGhlIGZpcnN0IHNvdXJjZSBvcGVyYW5kIHJlZ2lzdGVyLgorY2xhc3MgTjNWREludDM8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgSW50cmluc2ljIEludE9wPgorICA6IE4zVjxvcDI0LCBvcDIzLCBvcDIxXzIwLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFI6JHNyYzMpLCBOM1JlZ0ZybSwgaXRpbiwKKyAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMyLCAkc3JjMyIsICIkc3JjMSA9ICRkc3QiLAorICAgICAgICBbKHNldCBEUFI6JGRzdCwgKFJlc1R5IChJbnRPcCAoT3BUeSBEUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT3BUeSBEUFI6JHNyYzIpLCAoT3BUeSBEUFI6JHNyYzMpKSkpXT47CitjbGFzcyBOM1ZRSW50MzxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICBWYWx1ZVR5cGUgUmVzVHksIFZhbHVlVHlwZSBPcFR5LCBJbnRyaW5zaWMgSW50T3A+CisgIDogTjNWPG9wMjQsIG9wMjMsIG9wMjFfMjAsIG9wMTFfOCwgMSwgb3A0LAorICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgUVBSOiRzcmMxLCBRUFI6JHNyYzIsIFFQUjokc3JjMyksIE4zUmVnRnJtLCBpdGluLAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzIsICRzcmMzIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoUmVzVHkgKEludE9wIChPcFR5IFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPcFR5IFFQUjokc3JjMiksIChPcFR5IFFQUjokc3JjMykpKSldPjsKKworLy8gTmVvbiBMb25nIDMtYXJndW1lbnQgaW50cmluc2ljLiAgVGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGlzCisvLyBhIHF1YWQtcmVnaXN0ZXIgYW5kIGlzIGFsc28gdXNlZCBhcyB0aGUgZmlyc3Qgc291cmNlIG9wZXJhbmQgcmVnaXN0ZXIuCitjbGFzcyBOM1ZMSW50MzxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICBWYWx1ZVR5cGUgVHlRLCBWYWx1ZVR5cGUgVHlELCBJbnRyaW5zaWMgSW50T3A+CisgIDogTjNWPG9wMjQsIG9wMjMsIG9wMjFfMjAsIG9wMTFfOCwgMCwgb3A0LAorICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgUVBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMyksIE4zUmVnRnJtLCBpdGluLAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzIsICRzcmMzIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgIFsoc2V0IFFQUjokZHN0LAorICAgICAgICAgIChUeVEgKEludE9wIChUeVEgUVBSOiRzcmMxKSwgKFR5RCBEUFI6JHNyYzIpLCAoVHlEIERQUjokc3JjMykpKSldPjsKK2NsYXNzIE4zVkxJbnQzU0w8Yml0IG9wMjQsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgSW50cmluc2ljIEludE9wPgorICA6IE4zVjxvcDI0LCAxLCBvcDIxXzIwLCBvcDExXzgsIDEsIDAsCisgICAgICAgIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgKGlucyBRUFI6JHNyYzEsIERQUjokc3JjMiwgRFBSX1ZGUDI6JHNyYzMsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICBOVk11bFNMRnJtLCBpdGluLAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzIsICRzcmMzWyRsYW5lXSIsICIkc3JjMSA9ICRkc3QiLAorICAgICAgICBbKHNldCAoUmVzVHkgUVBSOiRkc3QpLAorICAgICAgICAgICAgICAoUmVzVHkgKEludE9wIChSZXNUeSBRUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPcFR5IERQUjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9wVHkgKE5FT052ZHVwbGFuZSAoT3BUeSBEUFJfVkZQMjokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGxhbmUpKSkpKV0+OworY2xhc3MgTjNWTEludDNTTDE2PGJpdCBvcDI0LCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LAorICAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgUmVzVHksIFZhbHVlVHlwZSBPcFR5LCBJbnRyaW5zaWMgSW50T3A+CisgIDogTjNWPG9wMjQsIDEsIG9wMjFfMjAsIG9wMTFfOCwgMSwgMCwKKyAgICAgICAgKG91dHMgUVBSOiRkc3QpLAorICAgICAgICAoaW5zIFFQUjokc3JjMSwgRFBSOiRzcmMyLCBEUFJfODokc3JjMywgbm9oYXNoX2ltbTokbGFuZSksCisgICAgICAgIE5WTXVsU0xGcm0sIGl0aW4sCisgICAgICAgIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjMiwgJHNyYzNbJGxhbmVdIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgIFsoc2V0IChSZXNUeSBRUFI6JGRzdCksCisgICAgICAgICAgICAgIChSZXNUeSAoSW50T3AgKFJlc1R5IFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9wVHkgRFBSOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT3BUeSAoTkVPTnZkdXBsYW5lIChPcFR5IERQUl84OiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokbGFuZSkpKSkpXT47CisKKy8vIE5hcnJvd2luZyAzLXJlZ2lzdGVyIGludHJpbnNpY3MuCitjbGFzcyBOM1ZOSW50PGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNCwKKyAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBWYWx1ZVR5cGUgVHlELCBWYWx1ZVR5cGUgVHlRLAorICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50T3AsIGJpdCBDb21tdXRhYmxlPgorICA6IE4zVjxvcDI0LCBvcDIzLCBvcDIxXzIwLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIFFQUjokc3JjMSwgUVBSOiRzcmMyKSwgTjNSZWdGcm0sIElJQ19WQklOaTRELAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzEsICRzcmMyIiwgIiIsCisgICAgICAgIFsoc2V0IERQUjokZHN0LCAoVHlEIChJbnRPcCAoVHlRIFFQUjokc3JjMSksIChUeVEgUVBSOiRzcmMyKSkpKV0+IHsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IENvbW11dGFibGU7Cit9CisKKy8vIExvbmcgMy1yZWdpc3RlciBpbnRyaW5zaWNzLgorY2xhc3MgTjNWTEludDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgVmFsdWVUeXBlIFR5USwgVmFsdWVUeXBlIFR5RCwgSW50cmluc2ljIEludE9wLCBiaXQgQ29tbXV0YWJsZT4KKyAgOiBOM1Y8b3AyNCwgb3AyMywgb3AyMV8yMCwgb3AxMV84LCAwLCBvcDQsCisgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBEUFI6JHNyYzEsIERQUjokc3JjMiksIE4zUmVnRnJtLCBpdGluLAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzEsICRzcmMyIiwgIiIsCisgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoVHlRIChJbnRPcCAoVHlEIERQUjokc3JjMSksIChUeUQgRFBSOiRzcmMyKSkpKV0+IHsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IENvbW11dGFibGU7Cit9CitjbGFzcyBOM1ZMSW50U0w8Yml0IG9wMjQsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czw0PiBvcDExXzgsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksIEludHJpbnNpYyBJbnRPcD4KKyAgOiBOM1Y8b3AyNCwgMSwgb3AyMV8yMCwgb3AxMV84LCAxLCAwLAorICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgRFBSOiRzcmMxLCBEUFJfVkZQMjokc3JjMiwgbm9oYXNoX2ltbTokbGFuZSksCisgICAgICAgIE5WTXVsU0xGcm0sIGl0aW4sIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjMSwgJHNyYzJbJGxhbmVdIiwgIiIsCisgICAgICAgIFsoc2V0IChSZXNUeSBRUFI6JGRzdCksCisgICAgICAgICAgICAgIChSZXNUeSAoSW50T3AgKE9wVHkgRFBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT3BUeSAoTkVPTnZkdXBsYW5lIChPcFR5IERQUl9WRlAyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokbGFuZSkpKSkpXT47CitjbGFzcyBOM1ZMSW50U0wxNjxiaXQgb3AyNCwgYml0czwyPiBvcDIxXzIwLCBiaXRzPDQ+IG9wMTFfOCwKKyAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksIEludHJpbnNpYyBJbnRPcD4KKyAgOiBOM1Y8b3AyNCwgMSwgb3AyMV8yMCwgb3AxMV84LCAxLCAwLAorICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgRFBSOiRzcmMxLCBEUFJfODokc3JjMiwgbm9oYXNoX2ltbTokbGFuZSksIAorICAgICAgICBOVk11bFNMRnJtLCBpdGluLCBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzEsICRzcmMyWyRsYW5lXSIsICIiLAorICAgICAgICBbKHNldCAoUmVzVHkgUVBSOiRkc3QpLAorICAgICAgICAgICAgICAoUmVzVHkgKEludE9wIChPcFR5IERQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9wVHkgKE5FT052ZHVwbGFuZSAoT3BUeSBEUFJfODokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGxhbmUpKSkpKV0+OworCisvLyBXaWRlIDMtcmVnaXN0ZXIgaW50cmluc2ljcy4KK2NsYXNzIE4zVldJbnQ8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBUeVEsIFZhbHVlVHlwZSBUeUQsCisgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRPcCwgYml0IENvbW11dGFibGU+CisgIDogTjNWPG9wMjQsIG9wMjMsIG9wMjFfMjAsIG9wMTFfOCwgMCwgb3A0LAorICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgUVBSOiRzcmMxLCBEUFI6JHNyYzIpLCBOM1JlZ0ZybSwgSUlDX1ZTVUJpRCwKKyAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMxLCAkc3JjMiIsICIiLAorICAgICAgICBbKHNldCBRUFI6JGRzdCwgKFR5USAoSW50T3AgKFR5USBRUFI6JHNyYzEpLCAoVHlEIERQUjokc3JjMikpKSldPiB7CisgIGxldCBpc0NvbW11dGFibGUgPSBDb21tdXRhYmxlOworfQorCisvLyBQYWlyd2lzZSBsb25nIDItcmVnaXN0ZXIgaW50cmluc2ljcywgYm90aCBkb3VibGUtIGFuZCBxdWFkLXJlZ2lzdGVyLgorY2xhc3MgTjJWRFBMSW50PGJpdHM8Mj4gb3AyNF8yMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDI+IG9wMTlfMTgsCisgICAgICAgICAgICAgICAgYml0czwyPiBvcDE3XzE2LCBiaXRzPDU+IG9wMTFfNywgYml0IG9wNCwKKyAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgSW50cmluc2ljIEludE9wPgorICA6IE4yVjxvcDI0XzIzLCBvcDIxXzIwLCBvcDE5XzE4LCBvcDE3XzE2LCBvcDExXzcsIDAsIG9wNCwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokc3JjKSwgSUlDX1ZTSExpRCwgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMiLCAiIiwKKyAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChSZXNUeSAoSW50T3AgKE9wVHkgRFBSOiRzcmMpKSkpXT47CitjbGFzcyBOMlZRUExJbnQ8Yml0czwyPiBvcDI0XzIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8Mj4gb3AxOV8xOCwKKyAgICAgICAgICAgICAgICBiaXRzPDI+IG9wMTdfMTYsIGJpdHM8NT4gb3AxMV83LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgUmVzVHksIFZhbHVlVHlwZSBPcFR5LCBJbnRyaW5zaWMgSW50T3A+CisgIDogTjJWPG9wMjRfMjMsIG9wMjFfMjAsIG9wMTlfMTgsIG9wMTdfMTYsIG9wMTFfNywgMSwgb3A0LCAob3V0cyBRUFI6JGRzdCksCisgICAgICAgIChpbnMgUVBSOiRzcmMpLCBJSUNfVlNITGlELCBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYyIsICIiLAorICAgICAgICBbKHNldCBRUFI6JGRzdCwgKFJlc1R5IChJbnRPcCAoT3BUeSBRUFI6JHNyYykpKSldPjsKKworLy8gUGFpcndpc2UgbG9uZyAyLXJlZ2lzdGVyIGFjY3VtdWxhdGUgaW50cmluc2ljcywKKy8vIGJvdGggZG91YmxlLSBhbmQgcXVhZC1yZWdpc3Rlci4KKy8vIFRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpcyBhbHNvIHVzZWQgYXMgdGhlIGZpcnN0IHNvdXJjZSBvcGVyYW5kIHJlZ2lzdGVyLgorY2xhc3MgTjJWRFBMSW50MjxiaXRzPDI+IG9wMjRfMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czwyPiBvcDE5XzE4LAorICAgICAgICAgICAgICAgICBiaXRzPDI+IG9wMTdfMTYsIGJpdHM8NT4gb3AxMV83LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksIEludHJpbnNpYyBJbnRPcD4KKyAgOiBOMlY8b3AyNF8yMywgb3AyMV8yMCwgb3AxOV8xOCwgb3AxN18xNiwgb3AxMV83LCAwLCBvcDQsCisgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JHNyYzEsIERQUjokc3JjMiksIElJQ19WUEFMaUQsCisgICAgICAgIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjMiIsICIkc3JjMSA9ICRkc3QiLAorICAgICAgICBbKHNldCBEUFI6JGRzdCwgKFJlc1R5IChJbnRPcCAoUmVzVHkgRFBSOiRzcmMxKSwgKE9wVHkgRFBSOiRzcmMyKSkpKV0+OworY2xhc3MgTjJWUVBMSW50MjxiaXRzPDI+IG9wMjRfMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czwyPiBvcDE5XzE4LAorICAgICAgICAgICAgICAgICBiaXRzPDI+IG9wMTdfMTYsIGJpdHM8NT4gb3AxMV83LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksIEludHJpbnNpYyBJbnRPcD4KKyAgOiBOMlY8b3AyNF8yMywgb3AyMV8yMCwgb3AxOV8xOCwgb3AxN18xNiwgb3AxMV83LCAxLCBvcDQsCisgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBRUFI6JHNyYzEsIFFQUjokc3JjMiksIElJQ19WUEFMaVEsCisgICAgICAgIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjMiIsICIkc3JjMSA9ICRkc3QiLAorICAgICAgICBbKHNldCBRUFI6JGRzdCwgKFJlc1R5IChJbnRPcCAoUmVzVHkgUVBSOiRzcmMxKSwgKE9wVHkgUVBSOiRzcmMyKSkpKV0+OworCisvLyBTaGlmdCBieSBpbW1lZGlhdGUsCisvLyBib3RoIGRvdWJsZS0gYW5kIHF1YWQtcmVnaXN0ZXIuCitjbGFzcyBOMlZEU2g8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNywgYml0IG9wNCwKKyAgICAgICAgICAgICBGb3JtYXQgZiwgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgIFZhbHVlVHlwZSBUeSwgU0ROb2RlIE9wTm9kZT4KKyAgOiBOMlZJbW08b3AyNCwgb3AyMywgb3AxMV84LCBvcDcsIDAsIG9wNCwKKyAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjLCBpMzJpbW06JFNJTU0pLCBmLCBpdGluLAorICAgICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYywgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChUeSAoT3BOb2RlIChUeSBEUFI6JHNyYyksIChpMzIgaW1tOiRTSU1NKSkpKV0+OworY2xhc3MgTjJWUVNoPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw0PiBvcDExXzgsIGJpdCBvcDcsIGJpdCBvcDQsCisgICAgICAgICAgICAgRm9ybWF0IGYsIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICBWYWx1ZVR5cGUgVHksIFNETm9kZSBPcE5vZGU+CisgIDogTjJWSW1tPG9wMjQsIG9wMjMsIG9wMTFfOCwgb3A3LCAxLCBvcDQsCisgICAgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBRUFI6JHNyYywgaTMyaW1tOiRTSU1NKSwgZiwgaXRpbiwKKyAgICAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMsICRTSU1NIiwgIiIsCisgICAgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoVHkgKE9wTm9kZSAoVHkgUVBSOiRzcmMpLCAoaTMyIGltbTokU0lNTSkpKSldPjsKKworLy8gTG9uZyBzaGlmdCBieSBpbW1lZGlhdGUuCitjbGFzcyBOMlZMU2g8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNywgYml0IG9wNiwgYml0IG9wNCwKKyAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgVmFsdWVUeXBlIFJlc1R5LCBWYWx1ZVR5cGUgT3BUeSwgU0ROb2RlIE9wTm9kZT4KKyAgOiBOMlZJbW08b3AyNCwgb3AyMywgb3AxMV84LCBvcDcsIG9wNiwgb3A0LAorICAgICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgRFBSOiRzcmMsIGkzMmltbTokU0lNTSksIE4yUmVnVlNoTEZybSwKKyAgICAgICAgICAgSUlDX1ZTSExpRCwgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMsICRTSU1NIiwgIiIsCisgICAgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoUmVzVHkgKE9wTm9kZSAoT3BUeSBEUFI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyIGltbTokU0lNTSkpKSldPjsKKworLy8gTmFycm93IHNoaWZ0IGJ5IGltbWVkaWF0ZS4KK2NsYXNzIE4yVk5TaDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A3LCBiaXQgb3A2LCBiaXQgb3A0LAorICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICBWYWx1ZVR5cGUgUmVzVHksIFZhbHVlVHlwZSBPcFR5LCBTRE5vZGUgT3BOb2RlPgorICA6IE4yVkltbTxvcDI0LCBvcDIzLCBvcDExXzgsIG9wNywgb3A2LCBvcDQsCisgICAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBRUFI6JHNyYywgaTMyaW1tOiRTSU1NKSwgTjJSZWdWU2hSRnJtLCBpdGluLAorICAgICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYywgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChSZXNUeSAoT3BOb2RlIChPcFR5IFFQUjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIgaW1tOiRTSU1NKSkpKV0+OworCisvLyBTaGlmdCByaWdodCBieSBpbW1lZGlhdGUgYW5kIGFjY3VtdWxhdGUsCisvLyBib3RoIGRvdWJsZS0gYW5kIHF1YWQtcmVnaXN0ZXIuCitjbGFzcyBOMlZEU2hBZGQ8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNywgYml0IG9wNCwKKyAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBUeSwgU0ROb2RlIFNoT3A+CisgIDogTjJWSW1tPG9wMjQsIG9wMjMsIG9wMTFfOCwgb3A3LCAwLCBvcDQsIChvdXRzIERQUjokZHN0KSwKKyAgICAgICAgICAgKGlucyBEUFI6JHNyYzEsIERQUjokc3JjMiwgaTMyaW1tOiRTSU1NKSwgTjJSZWdWU2hSRnJtLCBJSUNfVlBBTGlELAorICAgICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzIsICRTSU1NIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgICAgIFsoc2V0IERQUjokZHN0LCAoVHkgKGFkZCBEUFI6JHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUeSAoU2hPcCBEUFI6JHNyYzIsIChpMzIgaW1tOiRTSU1NKSkpKSkpXT47CitjbGFzcyBOMlZRU2hBZGQ8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNywgYml0IG9wNCwKKyAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBUeSwgU0ROb2RlIFNoT3A+CisgIDogTjJWSW1tPG9wMjQsIG9wMjMsIG9wMTFfOCwgb3A3LCAxLCBvcDQsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgICAgKGlucyBRUFI6JHNyYzEsIFFQUjokc3JjMiwgaTMyaW1tOiRTSU1NKSwgTjJSZWdWU2hSRnJtLCBJSUNfVlBBTGlELAorICAgICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYzIsICRTSU1NIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoVHkgKGFkZCBRUFI6JHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUeSAoU2hPcCBRUFI6JHNyYzIsIChpMzIgaW1tOiRTSU1NKSkpKSkpXT47CisKKy8vIFNoaWZ0IGJ5IGltbWVkaWF0ZSBhbmQgaW5zZXJ0LAorLy8gYm90aCBkb3VibGUtIGFuZCBxdWFkLXJlZ2lzdGVyLgorY2xhc3MgTjJWRFNoSW5zPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw0PiBvcDExXzgsIGJpdCBvcDcsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgRm9ybWF0IGYsIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgVmFsdWVUeXBlIFR5LFNETm9kZSBTaE9wPgorICA6IE4yVkltbTxvcDI0LCBvcDIzLCBvcDExXzgsIG9wNywgMCwgb3A0LCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgICAgIChpbnMgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIGkzMmltbTokU0lNTSksIGYsIElJQ19WU0hMaUQsCisgICAgICAgICAgIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjMiwgJFNJTU0iLCAiJHNyYzEgPSAkZHN0IiwKKyAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChUeSAoU2hPcCBEUFI6JHNyYzEsIERQUjokc3JjMiwgKGkzMiBpbW06JFNJTU0pKSkpXT47CitjbGFzcyBOMlZRU2hJbnM8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNywgYml0IG9wNCwKKyAgICAgICAgICAgICAgICBGb3JtYXQgZiwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBWYWx1ZVR5cGUgVHksU0ROb2RlIFNoT3A+CisgIDogTjJWSW1tPG9wMjQsIG9wMjMsIG9wMTFfOCwgb3A3LCAxLCBvcDQsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgICAgKGlucyBRUFI6JHNyYzEsIFFQUjokc3JjMiwgaTMyaW1tOiRTSU1NKSwgZiwgSUlDX1ZTSExpUSwKKyAgICAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMyLCAkU0lNTSIsICIkc3JjMSA9ICRkc3QiLAorICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKFR5IChTaE9wIFFQUjokc3JjMSwgUVBSOiRzcmMyLCAoaTMyIGltbTokU0lNTSkpKSldPjsKKworLy8gQ29udmVydCwgd2l0aCBmcmFjdGlvbmFsIGJpdHMgaW1tZWRpYXRlLAorLy8gYm90aCBkb3VibGUtIGFuZCBxdWFkLXJlZ2lzdGVyLgorY2xhc3MgTjJWQ3Z0RDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A3LCBiaXQgb3A0LAorICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksCisgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRPcD4KKyAgOiBOMlZJbW08b3AyNCwgb3AyMywgb3AxMV84LCBvcDcsIDAsIG9wNCwKKyAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjLCBpMzJpbW06JFNJTU0pLCBOVkNWVEZybSwKKyAgICAgICAgICAgSUlDX1ZVTkFELCBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYywgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChSZXNUeSAoSW50T3AgKE9wVHkgRFBSOiRzcmMpLCAoaTMyIGltbTokU0lNTSkpKSldPjsKK2NsYXNzIE4yVkN2dFE8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNywgYml0IG9wNCwKKyAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBWYWx1ZVR5cGUgUmVzVHksIFZhbHVlVHlwZSBPcFR5LAorICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50T3A+CisgIDogTjJWSW1tPG9wMjQsIG9wMjMsIG9wMTFfOCwgb3A3LCAxLCBvcDQsCisgICAgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBRUFI6JHNyYywgaTMyaW1tOiRTSU1NKSwgTlZDVlRGcm0sCisgICAgICAgICAgIElJQ19WVU5BUSwgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMsICRTSU1NIiwgIiIsCisgICAgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoUmVzVHkgKEludE9wIChPcFR5IFFQUjokc3JjKSwgKGkzMiBpbW06JFNJTU0pKSkpXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNdWx0aWNsYXNzZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEFiYnJldmlhdGlvbnMgdXNlZCBpbiBtdWx0aWNsYXNzIHN1ZmZpeGVzOgorLy8gICBRID0gcXVhcnRlciBpbnQgKDggYml0KSBlbGVtZW50cworLy8gICBIID0gaGFsZiBpbnQgKDE2IGJpdCkgZWxlbWVudHMKKy8vICAgUyA9IHNpbmdsZSBpbnQgKDMyIGJpdCkgZWxlbWVudHMKKy8vICAgRCA9IGRvdWJsZSBpbnQgKDY0IGJpdCkgZWxlbWVudHMKKworLy8gTmVvbiAyLXJlZ2lzdGVyIHZlY3RvciBvcGVyYXRpb25zIC0tIGZvciBkaXNhc3NlbWJseSBvbmx5LgorCisvLyBGaXJzdCB3aXRoIG9ubHkgZWxlbWVudCBzaXplcyBvZiA4LCAxNiBhbmQgMzIgYml0czoKK211bHRpY2xhc3MgTjJWX1FIU19jbXA8Yml0czwyPiBvcDI0XzIzLCBiaXRzPDI+IG9wMjFfMjAsIGJpdHM8Mj4gb3AxN18xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgYml0czw1PiBvcDExXzcsIGJpdCBvcDQsIHN0cmluZyBvcGMsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFzbT4geworICAvLyA2NC1iaXQgdmVjdG9yIHR5cGVzLgorICBkZWYgdjhpOCAgOiBOMlY8b3AyNF8yMywgb3AyMV8yMCwgMGIwMCwgb3AxN18xNiwgb3AxMV83LCAwLCBvcDQsCisgICAgICAgICAgICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRzcmMpLCBOb0l0aW5lcmFyeSwKKyAgICAgICAgICAgICAgICAgIG9wYywgIXN0cmNvbmNhdChEdCwgIjgiKSwgYXNtLCAiIiwgW10+OworICBkZWYgdjRpMTYgOiBOMlY8b3AyNF8yMywgb3AyMV8yMCwgMGIwMSwgb3AxN18xNiwgb3AxMV83LCAwLCBvcDQsCisgICAgICAgICAgICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRzcmMpLCBOb0l0aW5lcmFyeSwKKyAgICAgICAgICAgICAgICAgIG9wYywgIXN0cmNvbmNhdChEdCwgIjE2IiksIGFzbSwgIiIsIFtdPjsKKyAgZGVmIHYyaTMyIDogTjJWPG9wMjRfMjMsIG9wMjFfMjAsIDBiMTAsIG9wMTdfMTYsIG9wMTFfNywgMCwgb3A0LAorICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjKSwgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICBvcGMsICFzdHJjb25jYXQoRHQsICIzMiIpLCBhc20sICIiLCBbXT47CisgIGRlZiB2MmYzMiA6IE4yVjxvcDI0XzIzLCBvcDIxXzIwLCAwYjEwLCBvcDE3XzE2LCBvcDExXzcsIDAsIG9wNCwKKyAgICAgICAgICAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JHNyYyksIE5vSXRpbmVyYXJ5LAorICAgICAgICAgICAgICAgICAgb3BjLCAiZjMyIiwgYXNtLCAiIiwgW10+IHsKKyAgICBsZXQgSW5zdHsxMH0gPSAxOyAvLyBvdmVyd3JpdGUgRiA9IDEKKyAgfQorCisgIC8vIDEyOC1iaXQgdmVjdG9yIHR5cGVzLgorICBkZWYgdjE2aTggOiBOMlY8b3AyNF8yMywgb3AyMV8yMCwgMGIwMCwgb3AxN18xNiwgb3AxMV83LCAxLCBvcDQsCisgICAgICAgICAgICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgUVBSOiRzcmMpLCBOb0l0aW5lcmFyeSwKKyAgICAgICAgICAgICAgICAgIG9wYywgIXN0cmNvbmNhdChEdCwgIjgiKSwgYXNtLCAiIiwgW10+OworICBkZWYgdjhpMTYgOiBOMlY8b3AyNF8yMywgb3AyMV8yMCwgMGIwMSwgb3AxN18xNiwgb3AxMV83LCAxLCBvcDQsCisgICAgICAgICAgICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgUVBSOiRzcmMpLCBOb0l0aW5lcmFyeSwKKyAgICAgICAgICAgICAgICAgIG9wYywgIXN0cmNvbmNhdChEdCwgIjE2IiksIGFzbSwgIiIsIFtdPjsKKyAgZGVmIHY0aTMyIDogTjJWPG9wMjRfMjMsIG9wMjFfMjAsIDBiMTAsIG9wMTdfMTYsIG9wMTFfNywgMSwgb3A0LAorICAgICAgICAgICAgICAgICAgKG91dHMgUVBSOiRkc3QpLCAoaW5zIFFQUjokc3JjKSwgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICBvcGMsICFzdHJjb25jYXQoRHQsICIzMiIpLCBhc20sICIiLCBbXT47CisgIGRlZiB2NGYzMiA6IE4yVjxvcDI0XzIzLCBvcDIxXzIwLCAwYjEwLCBvcDE3XzE2LCBvcDExXzcsIDEsIG9wNCwKKyAgICAgICAgICAgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBRUFI6JHNyYyksIE5vSXRpbmVyYXJ5LAorICAgICAgICAgICAgICAgICAgb3BjLCAiZjMyIiwgYXNtLCAiIiwgW10+IHsKKyAgICBsZXQgSW5zdHsxMH0gPSAxOyAvLyBvdmVyd3JpdGUgRiA9IDEKKyAgfQorfQorCisvLyBOZW9uIDMtcmVnaXN0ZXIgdmVjdG9yIG9wZXJhdGlvbnMuCisKKy8vIEZpcnN0IHdpdGggb25seSBlbGVtZW50IHNpemVzIG9mIDgsIDE2IGFuZCAzMiBiaXRzOgorbXVsdGljbGFzcyBOM1ZfUUhTPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbkQxNiwgSW5zdHJJdGluQ2xhc3MgaXRpbkQzMiwKKyAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluUTE2LCBJbnN0ckl0aW5DbGFzcyBpdGluUTMyLAorICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICAgICBTRE5vZGUgT3BOb2RlLCBiaXQgQ29tbXV0YWJsZSA9IDA+IHsKKyAgLy8gNjQtYml0IHZlY3RvciB0eXBlcy4KKyAgZGVmIHY4aTggIDogTjNWRDxvcDI0LCBvcDIzLCAwYjAwLCBvcDExXzgsIG9wNCwgaXRpbkQxNiwgCisgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiOCIpLAorICAgICAgICAgICAgICAgICAgIHY4aTgsIHY4aTgsIE9wTm9kZSwgQ29tbXV0YWJsZT47CisgIGRlZiB2NGkxNiA6IE4zVkQ8b3AyNCwgb3AyMywgMGIwMSwgb3AxMV84LCBvcDQsIGl0aW5EMTYsCisgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMTYiKSwKKyAgICAgICAgICAgICAgICAgICB2NGkxNiwgdjRpMTYsIE9wTm9kZSwgQ29tbXV0YWJsZT47CisgIGRlZiB2MmkzMiA6IE4zVkQ8b3AyNCwgb3AyMywgMGIxMCwgb3AxMV84LCBvcDQsIGl0aW5EMzIsCisgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwKKyAgICAgICAgICAgICAgICAgICB2MmkzMiwgdjJpMzIsIE9wTm9kZSwgQ29tbXV0YWJsZT47CisKKyAgLy8gMTI4LWJpdCB2ZWN0b3IgdHlwZXMuCisgIGRlZiB2MTZpOCA6IE4zVlE8b3AyNCwgb3AyMywgMGIwMCwgb3AxMV84LCBvcDQsIGl0aW5RMTYsCisgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiOCIpLAorICAgICAgICAgICAgICAgICAgIHYxNmk4LCB2MTZpOCwgT3BOb2RlLCBDb21tdXRhYmxlPjsKKyAgZGVmIHY4aTE2IDogTjNWUTxvcDI0LCBvcDIzLCAwYjAxLCBvcDExXzgsIG9wNCwgaXRpblExNiwKKyAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLAorICAgICAgICAgICAgICAgICAgIHY4aTE2LCB2OGkxNiwgT3BOb2RlLCBDb21tdXRhYmxlPjsKKyAgZGVmIHY0aTMyIDogTjNWUTxvcDI0LCBvcDIzLCAwYjEwLCBvcDExXzgsIG9wNCwgaXRpblEzMiwKKyAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIzMiIpLAorICAgICAgICAgICAgICAgICAgIHY0aTMyLCB2NGkzMiwgT3BOb2RlLCBDb21tdXRhYmxlPjsKK30KKworbXVsdGljbGFzcyBOM1ZTTF9IUzxiaXRzPDQ+IG9wMTFfOCwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBTRE5vZGUgU2hPcD4geworICBkZWYgdjRpMTYgOiBOM1ZEU0wxNjwwYjAxLCBvcDExXzgsIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksCisgICAgICAgICAgICAgICAgICAgICAgIHY0aTE2LCBTaE9wPjsKKyAgZGVmIHYyaTMyIDogTjNWRFNMPDBiMTAsIG9wMTFfOCwgSUlDX1ZNVUxpMzJELCBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsIjMyIiksCisgICAgICAgICAgICAgICAgICAgICB2MmkzMiwgU2hPcD47CisgIGRlZiB2OGkxNiA6IE4zVlFTTDE2PDBiMDEsIG9wMTFfOCwgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMTYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdjhpMTYsIHY0aTE2LCBTaE9wPjsKKyAgZGVmIHY0aTMyIDogTjNWUVNMPDBiMTAsIG9wMTFfOCwgSUlDX1ZNVUxpMzJRLCBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsIjMyIiksCisgICAgICAgICAgICAgICAgICAgICB2NGkzMiwgdjJpMzIsIFNoT3A+OworfQorCisvLyAuLi4udGhlbiBhbHNvIHdpdGggZWxlbWVudCBzaXplIDY0IGJpdHM6CittdWx0aWNsYXNzIE4zVl9RSFNEPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW5ELCBJbnN0ckl0aW5DbGFzcyBpdGluUSwKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgICAgICBTRE5vZGUgT3BOb2RlLCBiaXQgQ29tbXV0YWJsZSA9IDA+CisgIDogTjNWX1FIUzxvcDI0LCBvcDIzLCBvcDExXzgsIG9wNCwgaXRpbkQsIGl0aW5ELCBpdGluUSwgaXRpblEsCisgICAgICAgICAgICBPcGNvZGVTdHIsIER0LCBPcE5vZGUsIENvbW11dGFibGU+IHsKKyAgZGVmIHYxaTY0IDogTjNWRDxvcDI0LCBvcDIzLCAwYjExLCBvcDExXzgsIG9wNCwgaXRpbkQsCisgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiNjQiKSwKKyAgICAgICAgICAgICAgICAgICB2MWk2NCwgdjFpNjQsIE9wTm9kZSwgQ29tbXV0YWJsZT47CisgIGRlZiB2Mmk2NCA6IE4zVlE8b3AyNCwgb3AyMywgMGIxMSwgb3AxMV84LCBvcDQsIGl0aW5RLAorICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjY0IiksCisgICAgICAgICAgICAgICAgICAgdjJpNjQsIHYyaTY0LCBPcE5vZGUsIENvbW11dGFibGU+OworfQorCisKKy8vIE5lb24gTmFycm93aW5nIDItcmVnaXN0ZXIgdmVjdG9yIGludHJpbnNpY3MsCisvLyAgIHNvdXJjZSBvcGVyYW5kIGVsZW1lbnQgc2l6ZXMgb2YgMTYsIDMyIGFuZCA2NCBiaXRzOgorbXVsdGljbGFzcyBOMlZOSW50X0hTRDxiaXRzPDI+IG9wMjRfMjMsIGJpdHM8Mj4gb3AyMV8yMCwgYml0czwyPiBvcDE3XzE2LAorICAgICAgICAgICAgICAgICAgICAgICBiaXRzPDU+IG9wMTFfNywgYml0IG9wNiwgYml0IG9wNCwgCisgICAgICAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljIEludE9wPiB7CisgIGRlZiB2OGk4ICA6IE4yVk5JbnQ8b3AyNF8yMywgb3AyMV8yMCwgMGIwMCwgb3AxN18xNiwgb3AxMV83LCBvcDYsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICBpdGluLCBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLAorICAgICAgICAgICAgICAgICAgICAgIHY4aTgsIHY4aTE2LCBJbnRPcD47CisgIGRlZiB2NGkxNiA6IE4yVk5JbnQ8b3AyNF8yMywgb3AyMV8yMCwgMGIwMSwgb3AxN18xNiwgb3AxMV83LCBvcDYsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICBpdGluLCBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIzMiIpLAorICAgICAgICAgICAgICAgICAgICAgIHY0aTE2LCB2NGkzMiwgSW50T3A+OworICBkZWYgdjJpMzIgOiBOMlZOSW50PG9wMjRfMjMsIG9wMjFfMjAsIDBiMTAsIG9wMTdfMTYsIG9wMTFfNywgb3A2LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgaXRpbiwgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiNjQiKSwKKyAgICAgICAgICAgICAgICAgICAgICB2MmkzMiwgdjJpNjQsIEludE9wPjsKK30KKworCisvLyBOZW9uIExlbmd0aGVuaW5nIDItcmVnaXN0ZXIgdmVjdG9yIGludHJpbnNpYyAoY3VycmVudGx5IHNwZWNpZmljIHRvIFZNT1ZMKS4KKy8vICAgc291cmNlIG9wZXJhbmQgZWxlbWVudCBzaXplcyBvZiAxNiwgMzIgYW5kIDY0IGJpdHM6CittdWx0aWNsYXNzIE4yVkxJbnRfUUhTPGJpdHM8Mj4gb3AyNF8yMywgYml0czw1PiBvcDExXzcsIGJpdCBvcDYsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgSW50cmluc2ljIEludE9wPiB7CisgIGRlZiB2OGkxNiA6IE4yVkxJbnQ8b3AyNF8yMywgMGIwMCwgMGIxMCwgMGIwMCwgb3AxMV83LCBvcDYsIG9wNCwgSUlDX1ZRVU5BaUQsCisgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiOCIpLCB2OGkxNiwgdjhpOCwgSW50T3A+OworICBkZWYgdjRpMzIgOiBOMlZMSW50PG9wMjRfMjMsIDBiMDEsIDBiMDAsIDBiMDAsIG9wMTFfNywgb3A2LCBvcDQsIElJQ19WUVVOQWlELAorICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksIHY0aTMyLCB2NGkxNiwgSW50T3A+OworICBkZWYgdjJpNjQgOiBOMlZMSW50PG9wMjRfMjMsIDBiMTAsIDBiMDAsIDBiMDAsIG9wMTFfNywgb3A2LCBvcDQsIElJQ19WUVVOQWlELAorICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjMyIiksIHYyaTY0LCB2MmkzMiwgSW50T3A+OworfQorCisKKy8vIE5lb24gMy1yZWdpc3RlciB2ZWN0b3IgaW50cmluc2ljcy4KKworLy8gRmlyc3Qgd2l0aCBvbmx5IGVsZW1lbnQgc2l6ZXMgb2YgMTYgYW5kIDMyIGJpdHM6CittdWx0aWNsYXNzIE4zVkludF9IUzxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LCBGb3JtYXQgZiwKKyAgICAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW5EMTYsIEluc3RySXRpbkNsYXNzIGl0aW5EMzIsCisgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluUTE2LCBJbnN0ckl0aW5DbGFzcyBpdGluUTMyLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljIEludE9wLCBiaXQgQ29tbXV0YWJsZSA9IDA+IHsKKyAgLy8gNjQtYml0IHZlY3RvciB0eXBlcy4KKyAgZGVmIHY0aTE2IDogTjNWREludDxvcDI0LCBvcDIzLCAwYjAxLCBvcDExXzgsIG9wNCwgZiwgaXRpbkQxNiwKKyAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLAorICAgICAgICAgICAgICAgICAgICAgIHY0aTE2LCB2NGkxNiwgSW50T3AsIENvbW11dGFibGU+OworICBkZWYgdjJpMzIgOiBOM1ZESW50PG9wMjQsIG9wMjMsIDBiMTAsIG9wMTFfOCwgb3A0LCBmLCBpdGluRDMyLAorICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjMyIiksCisgICAgICAgICAgICAgICAgICAgICAgdjJpMzIsIHYyaTMyLCBJbnRPcCwgQ29tbXV0YWJsZT47CisKKyAgLy8gMTI4LWJpdCB2ZWN0b3IgdHlwZXMuCisgIGRlZiB2OGkxNiA6IE4zVlFJbnQ8b3AyNCwgb3AyMywgMGIwMSwgb3AxMV84LCBvcDQsIGYsIGl0aW5RMTYsCisgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMTYiKSwKKyAgICAgICAgICAgICAgICAgICAgICB2OGkxNiwgdjhpMTYsIEludE9wLCBDb21tdXRhYmxlPjsKKyAgZGVmIHY0aTMyIDogTjNWUUludDxvcDI0LCBvcDIzLCAwYjEwLCBvcDExXzgsIG9wNCwgZiwgaXRpblEzMiwKKyAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIzMiIpLAorICAgICAgICAgICAgICAgICAgICAgIHY0aTMyLCB2NGkzMiwgSW50T3AsIENvbW11dGFibGU+OworfQorCittdWx0aWNsYXNzIE4zVkludFNMX0hTPGJpdHM8ND4gb3AxMV84LCAKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbkQxNiwgSW5zdHJJdGluQ2xhc3MgaXRpbkQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpblExNiwgSW5zdHJJdGluQ2xhc3MgaXRpblEzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBJbnRyaW5zaWMgSW50T3A+IHsKKyAgZGVmIHY0aTE2IDogTjNWREludFNMMTY8MGIwMSwgb3AxMV84LCBpdGluRDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLCB2NGkxNiwgSW50T3A+OworICBkZWYgdjJpMzIgOiBOM1ZESW50U0w8MGIxMCwgb3AxMV84LCBpdGluRDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwgdjJpMzIsIEludE9wPjsKKyAgZGVmIHY4aTE2IDogTjNWUUludFNMMTY8MGIwMSwgb3AxMV84LCBpdGluUTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLCB2OGkxNiwgdjRpMTYsIEludE9wPjsKKyAgZGVmIHY0aTMyIDogTjNWUUludFNMPDBiMTAsIG9wMTFfOCwgaXRpblEzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjMyIiksIHY0aTMyLCB2MmkzMiwgSW50T3A+OworfQorCisvLyAuLi4udGhlbiBhbHNvIHdpdGggZWxlbWVudCBzaXplIG9mIDggYml0czoKK211bHRpY2xhc3MgTjNWSW50X1FIUzxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LCBGb3JtYXQgZiwKKyAgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluRDE2LCBJbnN0ckl0aW5DbGFzcyBpdGluRDMyLAorICAgICAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW5RMTYsIEluc3RySXRpbkNsYXNzIGl0aW5RMzIsCisgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRPcCwgYml0IENvbW11dGFibGUgPSAwPgorICA6IE4zVkludF9IUzxvcDI0LCBvcDIzLCBvcDExXzgsIG9wNCwgZiwgaXRpbkQxNiwgaXRpbkQzMiwgaXRpblExNiwgaXRpblEzMiwKKyAgICAgICAgICAgICAgT3Bjb2RlU3RyLCBEdCwgSW50T3AsIENvbW11dGFibGU+IHsKKyAgZGVmIHY4aTggIDogTjNWREludDxvcDI0LCBvcDIzLCAwYjAwLCBvcDExXzgsIG9wNCwgZiwgaXRpbkQxNiwKKyAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksCisgICAgICAgICAgICAgICAgICAgICAgdjhpOCwgdjhpOCwgSW50T3AsIENvbW11dGFibGU+OworICBkZWYgdjE2aTggOiBOM1ZRSW50PG9wMjQsIG9wMjMsIDBiMDAsIG9wMTFfOCwgb3A0LCBmLCBpdGluUTE2LAorICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjgiKSwKKyAgICAgICAgICAgICAgICAgICAgICB2MTZpOCwgdjE2aTgsIEludE9wLCBDb21tdXRhYmxlPjsKK30KKworLy8gLi4uLnRoZW4gYWxzbyB3aXRoIGVsZW1lbnQgc2l6ZSBvZiA2NCBiaXRzOgorbXVsdGljbGFzcyBOM1ZJbnRfUUhTRDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LCBGb3JtYXQgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbkQxNiwgSW5zdHJJdGluQ2xhc3MgaXRpbkQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpblExNiwgSW5zdHJJdGluQ2xhc3MgaXRpblEzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50T3AsIGJpdCBDb21tdXRhYmxlID0gMD4KKyAgOiBOM1ZJbnRfUUhTPG9wMjQsIG9wMjMsIG9wMTFfOCwgb3A0LCBmLCBpdGluRDE2LCBpdGluRDMyLCBpdGluUTE2LCBpdGluUTMyLAorICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCBEdCwgSW50T3AsIENvbW11dGFibGU+IHsKKyAgZGVmIHYxaTY0IDogTjNWREludDxvcDI0LCBvcDIzLCAwYjExLCBvcDExXzgsIG9wNCwgZiwgaXRpbkQzMiwKKyAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI2NCIpLAorICAgICAgICAgICAgICAgICAgICAgIHYxaTY0LCB2MWk2NCwgSW50T3AsIENvbW11dGFibGU+OworICBkZWYgdjJpNjQgOiBOM1ZRSW50PG9wMjQsIG9wMjMsIDBiMTEsIG9wMTFfOCwgb3A0LCBmLCBpdGluUTMyLAorICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjY0IiksCisgICAgICAgICAgICAgICAgICAgICAgdjJpNjQsIHYyaTY0LCBJbnRPcCwgQ29tbXV0YWJsZT47Cit9CisKKy8vIE5lb24gTmFycm93aW5nIDMtcmVnaXN0ZXIgdmVjdG9yIGludHJpbnNpY3MsCisvLyAgIHNvdXJjZSBvcGVyYW5kIGVsZW1lbnQgc2l6ZXMgb2YgMTYsIDMyIGFuZCA2NCBiaXRzOgorbXVsdGljbGFzcyBOM1ZOSW50X0hTRDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRPcCwgYml0IENvbW11dGFibGUgPSAwPiB7CisgIGRlZiB2OGk4ICA6IE4zVk5JbnQ8b3AyNCwgb3AyMywgMGIwMCwgb3AxMV84LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMTYiKSwKKyAgICAgICAgICAgICAgICAgICAgICB2OGk4LCB2OGkxNiwgSW50T3AsIENvbW11dGFibGU+OworICBkZWYgdjRpMTYgOiBOM1ZOSW50PG9wMjQsIG9wMjMsIDBiMDEsIG9wMTFfOCwgb3A0LAorICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjMyIiksCisgICAgICAgICAgICAgICAgICAgICAgdjRpMTYsIHY0aTMyLCBJbnRPcCwgQ29tbXV0YWJsZT47CisgIGRlZiB2MmkzMiA6IE4zVk5JbnQ8b3AyNCwgb3AyMywgMGIxMCwgb3AxMV84LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiNjQiKSwKKyAgICAgICAgICAgICAgICAgICAgICB2MmkzMiwgdjJpNjQsIEludE9wLCBDb21tdXRhYmxlPjsKK30KKworCisvLyBOZW9uIExvbmcgMy1yZWdpc3RlciB2ZWN0b3IgaW50cmluc2ljcy4KKworLy8gRmlyc3Qgd2l0aCBvbmx5IGVsZW1lbnQgc2l6ZXMgb2YgMTYgYW5kIDMyIGJpdHM6CittdWx0aWNsYXNzIE4zVkxJbnRfSFM8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluMTYsIEluc3RySXRpbkNsYXNzIGl0aW4zMiwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljIEludE9wLCBiaXQgQ29tbXV0YWJsZSA9IDA+IHsKKyAgZGVmIHY0aTMyIDogTjNWTEludDxvcDI0LCBvcDIzLCAwYjAxLCBvcDExXzgsIG9wNCwgaXRpbjE2LCAKKyAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLAorICAgICAgICAgICAgICAgICAgICAgIHY0aTMyLCB2NGkxNiwgSW50T3AsIENvbW11dGFibGU+OworICBkZWYgdjJpNjQgOiBOM1ZMSW50PG9wMjQsIG9wMjMsIDBiMTAsIG9wMTFfOCwgb3A0LCBpdGluMzIsCisgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICB2Mmk2NCwgdjJpMzIsIEludE9wLCBDb21tdXRhYmxlPjsKK30KKworbXVsdGljbGFzcyBOM1ZMSW50U0xfSFM8Yml0IG9wMjQsIGJpdHM8ND4gb3AxMV84LAorICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljIEludE9wPiB7CisgIGRlZiB2NGkxNiA6IE4zVkxJbnRTTDE2PG9wMjQsIDBiMDEsIG9wMTFfOCwgaXRpbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksIHY0aTMyLCB2NGkxNiwgSW50T3A+OworICBkZWYgdjJpMzIgOiBOM1ZMSW50U0w8b3AyNCwgMGIxMCwgb3AxMV84LCBpdGluLAorICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwgdjJpNjQsIHYyaTMyLCBJbnRPcD47Cit9CisKKy8vIC4uLi50aGVuIGFsc28gd2l0aCBlbGVtZW50IHNpemUgb2YgOCBiaXRzOgorbXVsdGljbGFzcyBOM1ZMSW50X1FIUzxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluMTYsIEluc3RySXRpbkNsYXNzIGl0aW4zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50T3AsIGJpdCBDb21tdXRhYmxlID0gMD4KKyAgOiBOM1ZMSW50X0hTPG9wMjQsIG9wMjMsIG9wMTFfOCwgb3A0LCBpdGluMTYsIGl0aW4zMiwgT3Bjb2RlU3RyLCBEdCwKKyAgICAgICAgICAgICAgIEludE9wLCBDb21tdXRhYmxlPiB7CisgIGRlZiB2OGkxNiA6IE4zVkxJbnQ8b3AyNCwgb3AyMywgMGIwMCwgb3AxMV84LCBvcDQsIGl0aW4xNiwKKyAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksCisgICAgICAgICAgICAgICAgICAgICAgdjhpMTYsIHY4aTgsIEludE9wLCBDb21tdXRhYmxlPjsKK30KKworCisvLyBOZW9uIFdpZGUgMy1yZWdpc3RlciB2ZWN0b3IgaW50cmluc2ljcywKKy8vICAgc291cmNlIG9wZXJhbmQgZWxlbWVudCBzaXplcyBvZiA4LCAxNiBhbmQgMzIgYml0czoKK211bHRpY2xhc3MgTjNWV0ludF9RSFM8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50T3AsIGJpdCBDb21tdXRhYmxlID0gMD4geworICBkZWYgdjhpMTYgOiBOM1ZXSW50PG9wMjQsIG9wMjMsIDBiMDAsIG9wMTFfOCwgb3A0LAorICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjgiKSwKKyAgICAgICAgICAgICAgICAgICAgICB2OGkxNiwgdjhpOCwgSW50T3AsIENvbW11dGFibGU+OworICBkZWYgdjRpMzIgOiBOM1ZXSW50PG9wMjQsIG9wMjMsIDBiMDEsIG9wMTFfOCwgb3A0LAorICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksCisgICAgICAgICAgICAgICAgICAgICAgdjRpMzIsIHY0aTE2LCBJbnRPcCwgQ29tbXV0YWJsZT47CisgIGRlZiB2Mmk2NCA6IE4zVldJbnQ8b3AyNCwgb3AyMywgMGIxMCwgb3AxMV84LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICB2Mmk2NCwgdjJpMzIsIEludE9wLCBDb21tdXRhYmxlPjsKK30KKworCisvLyBOZW9uIE11bHRpcGx5LU9wIHZlY3RvciBvcGVyYXRpb25zLAorLy8gICBlbGVtZW50IHNpemVzIG9mIDgsIDE2IGFuZCAzMiBiaXRzOgorbXVsdGljbGFzcyBOM1ZNdWxPcF9RSFM8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW5EMTYsIEluc3RySXRpbkNsYXNzIGl0aW5EMzIsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluUTE2LCBJbnN0ckl0aW5DbGFzcyBpdGluUTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBTRE5vZGUgT3BOb2RlPiB7CisgIC8vIDY0LWJpdCB2ZWN0b3IgdHlwZXMuCisgIGRlZiB2OGk4ICA6IE4zVkRNdWxPcDxvcDI0LCBvcDIzLCAwYjAwLCBvcDExXzgsIG9wNCwgaXRpbkQxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjgiKSwgdjhpOCwgbXVsLCBPcE5vZGU+OworICBkZWYgdjRpMTYgOiBOM1ZETXVsT3A8b3AyNCwgb3AyMywgMGIwMSwgb3AxMV84LCBvcDQsIGl0aW5EMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLCB2NGkxNiwgbXVsLCBPcE5vZGU+OworICBkZWYgdjJpMzIgOiBOM1ZETXVsT3A8b3AyNCwgb3AyMywgMGIxMCwgb3AxMV84LCBvcDQsIGl0aW5EMzIsCisgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIzMiIpLCB2MmkzMiwgbXVsLCBPcE5vZGU+OworCisgIC8vIDEyOC1iaXQgdmVjdG9yIHR5cGVzLgorICBkZWYgdjE2aTggOiBOM1ZRTXVsT3A8b3AyNCwgb3AyMywgMGIwMCwgb3AxMV84LCBvcDQsIGl0aW5RMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksIHYxNmk4LCBtdWwsIE9wTm9kZT47CisgIGRlZiB2OGkxNiA6IE4zVlFNdWxPcDxvcDI0LCBvcDIzLCAwYjAxLCBvcDExXzgsIG9wNCwgaXRpblExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksIHY4aTE2LCBtdWwsIE9wTm9kZT47CisgIGRlZiB2NGkzMiA6IE4zVlFNdWxPcDxvcDI0LCBvcDIzLCAwYjEwLCBvcDExXzgsIG9wNCwgaXRpblEzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjMyIiksIHY0aTMyLCBtdWwsIE9wTm9kZT47Cit9CisKK211bHRpY2xhc3MgTjNWTXVsT3BTTF9IUzxiaXRzPDQ+IG9wMTFfOCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbkQxNiwgSW5zdHJJdGluQ2xhc3MgaXRpbkQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluUTE2LCBJbnN0ckl0aW5DbGFzcyBpdGluUTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgU0ROb2RlIFNoT3A+IHsKKyAgZGVmIHY0aTE2IDogTjNWRE11bE9wU0wxNjwwYjAxLCBvcDExXzgsIGl0aW5EMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMTYiKSwgdjRpMTYsIG11bCwgU2hPcD47CisgIGRlZiB2MmkzMiA6IE4zVkRNdWxPcFNMPDBiMTAsIG9wMTFfOCwgaXRpbkQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwgdjJpMzIsIG11bCwgU2hPcD47CisgIGRlZiB2OGkxNiA6IE4zVlFNdWxPcFNMMTY8MGIwMSwgb3AxMV84LCBpdGluUTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksIHY4aTE2LCB2NGkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwsIFNoT3A+OworICBkZWYgdjRpMzIgOiBOM1ZRTXVsT3BTTDwwYjEwLCBvcDExXzgsIGl0aW5RMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjMyIiksIHY0aTMyLCB2MmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsLCBTaE9wPjsKK30KKworLy8gTmVvbiAzLWFyZ3VtZW50IGludHJpbnNpY3MsCisvLyAgIGVsZW1lbnQgc2l6ZXMgb2YgOCwgMTYgYW5kIDMyIGJpdHM6CittdWx0aWNsYXNzIE4zVkludDNfUUhTPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW5ELCBJbnN0ckl0aW5DbGFzcyBpdGluUSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBJbnRyaW5zaWMgSW50T3A+IHsKKyAgLy8gNjQtYml0IHZlY3RvciB0eXBlcy4KKyAgZGVmIHY4aTggIDogTjNWREludDM8b3AyNCwgb3AyMywgMGIwMCwgb3AxMV84LCBvcDQsIGl0aW5ELAorICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksIHY4aTgsIHY4aTgsIEludE9wPjsKKyAgZGVmIHY0aTE2IDogTjNWREludDM8b3AyNCwgb3AyMywgMGIwMSwgb3AxMV84LCBvcDQsIGl0aW5ELAorICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLCB2NGkxNiwgdjRpMTYsIEludE9wPjsKKyAgZGVmIHYyaTMyIDogTjNWREludDM8b3AyNCwgb3AyMywgMGIxMCwgb3AxMV84LCBvcDQsIGl0aW5ELAorICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIzMiIpLCB2MmkzMiwgdjJpMzIsIEludE9wPjsKKworICAvLyAxMjgtYml0IHZlY3RvciB0eXBlcy4KKyAgZGVmIHYxNmk4IDogTjNWUUludDM8b3AyNCwgb3AyMywgMGIwMCwgb3AxMV84LCBvcDQsIGl0aW5RLAorICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksIHYxNmk4LCB2MTZpOCwgSW50T3A+OworICBkZWYgdjhpMTYgOiBOM1ZRSW50MzxvcDI0LCBvcDIzLCAwYjAxLCBvcDExXzgsIG9wNCwgaXRpblEsCisgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksIHY4aTE2LCB2OGkxNiwgSW50T3A+OworICBkZWYgdjRpMzIgOiBOM1ZRSW50MzxvcDI0LCBvcDIzLCAwYjEwLCBvcDExXzgsIG9wNCwgaXRpblEsCisgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjMyIiksIHY0aTMyLCB2NGkzMiwgSW50T3A+OworfQorCisKKy8vIE5lb24gTG9uZyAzLWFyZ3VtZW50IGludHJpbnNpY3MuCisKKy8vIEZpcnN0IHdpdGggb25seSBlbGVtZW50IHNpemVzIG9mIDE2IGFuZCAzMiBiaXRzOgorbXVsdGljbGFzcyBOM1ZMSW50M19IUzxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluMTYsIEluc3RySXRpbkNsYXNzIGl0aW4zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBJbnRyaW5zaWMgSW50T3A+IHsKKyAgZGVmIHY0aTMyIDogTjNWTEludDM8b3AyNCwgb3AyMywgMGIwMSwgb3AxMV84LCBvcDQsIGl0aW4xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMTYiKSwgdjRpMzIsIHY0aTE2LCBJbnRPcD47CisgIGRlZiB2Mmk2NCA6IE4zVkxJbnQzPG9wMjQsIG9wMjMsIDBiMTAsIG9wMTFfOCwgb3A0LCBpdGluMzIsCisgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjMyIiksIHYyaTY0LCB2MmkzMiwgSW50T3A+OworfQorCittdWx0aWNsYXNzIE4zVkxJbnQzU0xfSFM8Yml0IG9wMjQsIGJpdHM8ND4gb3AxMV84LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgSW50cmluc2ljIEludE9wPiB7CisgIGRlZiB2NGkxNiA6IE4zVkxJbnQzU0wxNjxvcDI0LCAwYjAxLCBvcDExXzgsIElJQ19WTUFDaTE2RCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwiMTYiKSwgdjRpMzIsIHY0aTE2LCBJbnRPcD47CisgIGRlZiB2MmkzMiA6IE4zVkxJbnQzU0w8b3AyNCwgMGIxMCwgb3AxMV84LCBJSUNfVk1BQ2kzMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwgdjJpNjQsIHYyaTMyLCBJbnRPcD47Cit9CisKKy8vIC4uLi50aGVuIGFsc28gd2l0aCBlbGVtZW50IHNpemUgb2YgOCBiaXRzOgorbXVsdGljbGFzcyBOM1ZMSW50M19RSFM8Yml0IG9wMjQsIGJpdCBvcDIzLCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4xNiwgSW5zdHJJdGluQ2xhc3MgaXRpbjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBJbnRyaW5zaWMgSW50T3A+CisgIDogTjNWTEludDNfSFM8b3AyNCwgb3AyMywgb3AxMV84LCBvcDQsIGl0aW4xNiwgaXRpbjMyLCBPcGNvZGVTdHIsIER0LCBJbnRPcD4geworICBkZWYgdjhpMTYgOiBOM1ZMSW50MzxvcDI0LCBvcDIzLCAwYjAwLCBvcDExXzgsIG9wNCwgaXRpbjE2LAorICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksIHY4aTE2LCB2OGk4LCBJbnRPcD47Cit9CisKKworLy8gTmVvbiAyLXJlZ2lzdGVyIHZlY3RvciBpbnRyaW5zaWNzLAorLy8gICBlbGVtZW50IHNpemVzIG9mIDgsIDE2IGFuZCAzMiBiaXRzOgorbXVsdGljbGFzcyBOMlZJbnRfUUhTPGJpdHM8Mj4gb3AyNF8yMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDI+IG9wMTdfMTYsCisgICAgICAgICAgICAgICAgICAgICAgYml0czw1PiBvcDExXzcsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbkQsIEluc3RySXRpbkNsYXNzIGl0aW5RLAorICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgSW50cmluc2ljIEludE9wPiB7CisgIC8vIDY0LWJpdCB2ZWN0b3IgdHlwZXMuCisgIGRlZiB2OGk4ICA6IE4yVkRJbnQ8b3AyNF8yMywgb3AyMV8yMCwgMGIwMCwgb3AxN18xNiwgb3AxMV83LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgaXRpbkQsIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjgiKSwgdjhpOCwgdjhpOCwgSW50T3A+OworICBkZWYgdjRpMTYgOiBOMlZESW50PG9wMjRfMjMsIG9wMjFfMjAsIDBiMDEsIG9wMTdfMTYsIG9wMTFfNywgb3A0LAorICAgICAgICAgICAgICAgICAgICAgIGl0aW5ELCBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLHY0aTE2LHY0aTE2LEludE9wPjsKKyAgZGVmIHYyaTMyIDogTjJWREludDxvcDI0XzIzLCBvcDIxXzIwLCAwYjEwLCBvcDE3XzE2LCBvcDExXzcsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICBpdGluRCwgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSx2MmkzMix2MmkzMixJbnRPcD47CisKKyAgLy8gMTI4LWJpdCB2ZWN0b3IgdHlwZXMuCisgIGRlZiB2MTZpOCA6IE4yVlFJbnQ8b3AyNF8yMywgb3AyMV8yMCwgMGIwMCwgb3AxN18xNiwgb3AxMV83LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgaXRpblEsIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjgiKSwgdjE2aTgsdjE2aTgsSW50T3A+OworICBkZWYgdjhpMTYgOiBOMlZRSW50PG9wMjRfMjMsIG9wMjFfMjAsIDBiMDEsIG9wMTdfMTYsIG9wMTFfNywgb3A0LAorICAgICAgICAgICAgICAgICAgICAgIGl0aW5RLCBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLHY4aTE2LHY4aTE2LEludE9wPjsKKyAgZGVmIHY0aTMyIDogTjJWUUludDxvcDI0XzIzLCBvcDIxXzIwLCAwYjEwLCBvcDE3XzE2LCBvcDExXzcsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICBpdGluUSwgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSx2NGkzMix2NGkzMixJbnRPcD47Cit9CisKKworLy8gTmVvbiBQYWlyd2lzZSBsb25nIDItcmVnaXN0ZXIgaW50cmluc2ljcywKKy8vICAgZWxlbWVudCBzaXplcyBvZiA4LCAxNiBhbmQgMzIgYml0czoKK211bHRpY2xhc3MgTjJWUExJbnRfUUhTPGJpdHM8Mj4gb3AyNF8yMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDI+IG9wMTdfMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzPDU+IG9wMTFfNywgYml0IG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgSW50cmluc2ljIEludE9wPiB7CisgIC8vIDY0LWJpdCB2ZWN0b3IgdHlwZXMuCisgIGRlZiB2OGk4ICA6IE4yVkRQTEludDxvcDI0XzIzLCBvcDIxXzIwLCAwYjAwLCBvcDE3XzE2LCBvcDExXzcsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjgiKSwgdjRpMTYsIHY4aTgsIEludE9wPjsKKyAgZGVmIHY0aTE2IDogTjJWRFBMSW50PG9wMjRfMjMsIG9wMjFfMjAsIDBiMDEsIG9wMTdfMTYsIG9wMTFfNywgb3A0LAorICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMTYiKSwgdjJpMzIsIHY0aTE2LCBJbnRPcD47CisgIGRlZiB2MmkzMiA6IE4yVkRQTEludDxvcDI0XzIzLCBvcDIxXzIwLCAwYjEwLCBvcDE3XzE2LCBvcDExXzcsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjMyIiksIHYxaTY0LCB2MmkzMiwgSW50T3A+OworCisgIC8vIDEyOC1iaXQgdmVjdG9yIHR5cGVzLgorICBkZWYgdjE2aTggOiBOMlZRUExJbnQ8b3AyNF8yMywgb3AyMV8yMCwgMGIwMCwgb3AxN18xNiwgb3AxMV83LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksIHY4aTE2LCB2MTZpOCwgSW50T3A+OworICBkZWYgdjhpMTYgOiBOMlZRUExJbnQ8b3AyNF8yMywgb3AyMV8yMCwgMGIwMSwgb3AxN18xNiwgb3AxMV83LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLCB2NGkzMiwgdjhpMTYsIEludE9wPjsKKyAgZGVmIHY0aTMyIDogTjJWUVBMSW50PG9wMjRfMjMsIG9wMjFfMjAsIDBiMTAsIG9wMTdfMTYsIG9wMTFfNywgb3A0LAorICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwgdjJpNjQsIHY0aTMyLCBJbnRPcD47Cit9CisKKworLy8gTmVvbiBQYWlyd2lzZSBsb25nIDItcmVnaXN0ZXIgYWNjdW11bGF0ZSBpbnRyaW5zaWNzLAorLy8gICBlbGVtZW50IHNpemVzIG9mIDgsIDE2IGFuZCAzMiBiaXRzOgorbXVsdGljbGFzcyBOMlZQTEludDJfUUhTPGJpdHM8Mj4gb3AyNF8yMywgYml0czwyPiBvcDIxXzIwLCBiaXRzPDI+IG9wMTdfMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYml0czw1PiBvcDExXzcsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBJbnRyaW5zaWMgSW50T3A+IHsKKyAgLy8gNjQtYml0IHZlY3RvciB0eXBlcy4KKyAgZGVmIHY4aTggIDogTjJWRFBMSW50MjxvcDI0XzIzLCBvcDIxXzIwLCAwYjAwLCBvcDE3XzE2LCBvcDExXzcsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksIHY0aTE2LCB2OGk4LCBJbnRPcD47CisgIGRlZiB2NGkxNiA6IE4yVkRQTEludDI8b3AyNF8yMywgb3AyMV8yMCwgMGIwMSwgb3AxN18xNiwgb3AxMV83LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMTYiKSwgdjJpMzIsIHY0aTE2LCBJbnRPcD47CisgIGRlZiB2MmkzMiA6IE4yVkRQTEludDI8b3AyNF8yMywgb3AyMV8yMCwgMGIxMCwgb3AxN18xNiwgb3AxMV83LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwgdjFpNjQsIHYyaTMyLCBJbnRPcD47CisKKyAgLy8gMTI4LWJpdCB2ZWN0b3IgdHlwZXMuCisgIGRlZiB2MTZpOCA6IE4yVlFQTEludDI8b3AyNF8yMywgb3AyMV8yMCwgMGIwMCwgb3AxN18xNiwgb3AxMV83LCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiOCIpLCB2OGkxNiwgdjE2aTgsIEludE9wPjsKKyAgZGVmIHY4aTE2IDogTjJWUVBMSW50MjxvcDI0XzIzLCBvcDIxXzIwLCAwYjAxLCBvcDE3XzE2LCBvcDExXzcsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLCB2NGkzMiwgdjhpMTYsIEludE9wPjsKKyAgZGVmIHY0aTMyIDogTjJWUVBMSW50MjxvcDI0XzIzLCBvcDIxXzIwLCAwYjEwLCBvcDE3XzE2LCBvcDExXzcsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIzMiIpLCB2Mmk2NCwgdjRpMzIsIEludE9wPjsKK30KKworCisvLyBOZW9uIDItcmVnaXN0ZXIgdmVjdG9yIHNoaWZ0IGJ5IGltbWVkaWF0ZSwKKy8vICAgd2l0aCBmIG9mIGVpdGhlciBOMlJlZ1ZTaExGcm0gb3IgTjJSZWdWU2hSRnJtCisvLyAgIGVsZW1lbnQgc2l6ZXMgb2YgOCwgMTYsIDMyIGFuZCA2NCBiaXRzOgorbXVsdGljbGFzcyBOMlZTaF9RSFNEPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgT3BOb2RlLCBGb3JtYXQgZj4geworICAvLyA2NC1iaXQgdmVjdG9yIHR5cGVzLgorICBkZWYgdjhpOCAgOiBOMlZEU2g8b3AyNCwgb3AyMywgb3AxMV84LCAwLCBvcDQsIGYsIGl0aW4sCisgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksIHY4aTgsIE9wTm9kZT4geworICAgIGxldCBJbnN0ezIxLTE5fSA9IDBiMDAxOyAvLyBpbW02ID0gMDAxeHh4CisgIH0KKyAgZGVmIHY0aTE2IDogTjJWRFNoPG9wMjQsIG9wMjMsIG9wMTFfOCwgMCwgb3A0LCBmLCBpdGluLAorICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMTYiKSwgdjRpMTYsIE9wTm9kZT4geworICAgIGxldCBJbnN0ezIxLTIwfSA9IDBiMDE7ICAvLyBpbW02ID0gMDF4eHh4CisgIH0KKyAgZGVmIHYyaTMyIDogTjJWRFNoPG9wMjQsIG9wMjMsIG9wMTFfOCwgMCwgb3A0LCBmLCBpdGluLAorICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwgdjJpMzIsIE9wTm9kZT4geworICAgIGxldCBJbnN0ezIxfSA9IDBiMTsgICAgICAvLyBpbW02ID0gMXh4eHh4CisgIH0KKyAgZGVmIHYxaTY0IDogTjJWRFNoPG9wMjQsIG9wMjMsIG9wMTFfOCwgMSwgb3A0LCBmLCBpdGluLAorICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiNjQiKSwgdjFpNjQsIE9wTm9kZT47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbTYgPSB4eHh4eHgKKworICAvLyAxMjgtYml0IHZlY3RvciB0eXBlcy4KKyAgZGVmIHYxNmk4IDogTjJWUVNoPG9wMjQsIG9wMjMsIG9wMTFfOCwgMCwgb3A0LCBmLCBpdGluLAorICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiOCIpLCB2MTZpOCwgT3BOb2RlPiB7CisgICAgbGV0IEluc3R7MjEtMTl9ID0gMGIwMDE7IC8vIGltbTYgPSAwMDF4eHgKKyAgfQorICBkZWYgdjhpMTYgOiBOMlZRU2g8b3AyNCwgb3AyMywgb3AxMV84LCAwLCBvcDQsIGYsIGl0aW4sCisgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLCB2OGkxNiwgT3BOb2RlPiB7CisgICAgbGV0IEluc3R7MjEtMjB9ID0gMGIwMTsgIC8vIGltbTYgPSAwMXh4eHgKKyAgfQorICBkZWYgdjRpMzIgOiBOMlZRU2g8b3AyNCwgb3AyMywgb3AxMV84LCAwLCBvcDQsIGYsIGl0aW4sCisgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIzMiIpLCB2NGkzMiwgT3BOb2RlPiB7CisgICAgbGV0IEluc3R7MjF9ID0gMGIxOyAgICAgIC8vIGltbTYgPSAxeHh4eHgKKyAgfQorICBkZWYgdjJpNjQgOiBOMlZRU2g8b3AyNCwgb3AyMywgb3AxMV84LCAxLCBvcDQsIGYsIGl0aW4sCisgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI2NCIpLCB2Mmk2NCwgT3BOb2RlPjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tNiA9IHh4eHh4eAorfQorCisvLyBOZW9uIFNoaWZ0LUFjY3VtdWxhdGUgdmVjdG9yIG9wZXJhdGlvbnMsCisvLyAgIGVsZW1lbnQgc2l6ZXMgb2YgOCwgMTYsIDMyIGFuZCA2NCBiaXRzOgorbXVsdGljbGFzcyBOMlZTaEFkZF9RSFNEPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw0PiBvcDExXzgsIGJpdCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBTRE5vZGUgU2hPcD4geworICAvLyA2NC1iaXQgdmVjdG9yIHR5cGVzLgorICBkZWYgdjhpOCAgOiBOMlZEU2hBZGQ8b3AyNCwgb3AyMywgb3AxMV84LCAwLCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI4IiksIHY4aTgsIFNoT3A+IHsKKyAgICBsZXQgSW5zdHsyMS0xOX0gPSAwYjAwMTsgLy8gaW1tNiA9IDAwMXh4eAorICB9CisgIGRlZiB2NGkxNiA6IE4yVkRTaEFkZDxvcDI0LCBvcDIzLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksIHY0aTE2LCBTaE9wPiB7CisgICAgbGV0IEluc3R7MjEtMjB9ID0gMGIwMTsgIC8vIGltbTYgPSAwMXh4eHgKKyAgfQorICBkZWYgdjJpMzIgOiBOMlZEU2hBZGQ8b3AyNCwgb3AyMywgb3AxMV84LCAwLCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIzMiIpLCB2MmkzMiwgU2hPcD4geworICAgIGxldCBJbnN0ezIxfSA9IDBiMTsgICAgICAvLyBpbW02ID0gMXh4eHh4CisgIH0KKyAgZGVmIHYxaTY0IDogTjJWRFNoQWRkPG9wMjQsIG9wMjMsIG9wMTFfOCwgMSwgb3A0LAorICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiNjQiKSwgdjFpNjQsIFNoT3A+OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW02ID0geHh4eHh4CisKKyAgLy8gMTI4LWJpdCB2ZWN0b3IgdHlwZXMuCisgIGRlZiB2MTZpOCA6IE4yVlFTaEFkZDxvcDI0LCBvcDIzLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjgiKSwgdjE2aTgsIFNoT3A+IHsKKyAgICBsZXQgSW5zdHsyMS0xOX0gPSAwYjAwMTsgLy8gaW1tNiA9IDAwMXh4eAorICB9CisgIGRlZiB2OGkxNiA6IE4yVlFTaEFkZDxvcDI0LCBvcDIzLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksIHY4aTE2LCBTaE9wPiB7CisgICAgbGV0IEluc3R7MjEtMjB9ID0gMGIwMTsgIC8vIGltbTYgPSAwMXh4eHgKKyAgfQorICBkZWYgdjRpMzIgOiBOMlZRU2hBZGQ8b3AyNCwgb3AyMywgb3AxMV84LCAwLCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIzMiIpLCB2NGkzMiwgU2hPcD4geworICAgIGxldCBJbnN0ezIxfSA9IDBiMTsgICAgICAvLyBpbW02ID0gMXh4eHh4CisgIH0KKyAgZGVmIHYyaTY0IDogTjJWUVNoQWRkPG9wMjQsIG9wMjMsIG9wMTFfOCwgMSwgb3A0LAorICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiNjQiKSwgdjJpNjQsIFNoT3A+OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW02ID0geHh4eHh4Cit9CisKKworLy8gTmVvbiBTaGlmdC1JbnNlcnQgdmVjdG9yIG9wZXJhdGlvbnMsCisvLyAgIHdpdGggZiBvZiBlaXRoZXIgTjJSZWdWU2hMRnJtIG9yIE4yUmVnVlNoUkZybQorLy8gICBlbGVtZW50IHNpemVzIG9mIDgsIDE2LCAzMiBhbmQgNjQgYml0czoKK211bHRpY2xhc3MgTjJWU2hJbnNfUUhTRDxiaXQgb3AyNCwgYml0IG9wMjMsIGJpdHM8ND4gb3AxMV84LCBiaXQgb3A0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIFNETm9kZSBTaE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCBmPiB7CisgIC8vIDY0LWJpdCB2ZWN0b3IgdHlwZXMuCisgIGRlZiB2OGk4ICA6IE4yVkRTaEluczxvcDI0LCBvcDIzLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGYsIE9wY29kZVN0ciwgIjgiLCB2OGk4LCBTaE9wPiB7CisgICAgbGV0IEluc3R7MjEtMTl9ID0gMGIwMDE7IC8vIGltbTYgPSAwMDF4eHgKKyAgfQorICBkZWYgdjRpMTYgOiBOMlZEU2hJbnM8b3AyNCwgb3AyMywgb3AxMV84LCAwLCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICBmLCBPcGNvZGVTdHIsICIxNiIsIHY0aTE2LCBTaE9wPiB7CisgICAgbGV0IEluc3R7MjEtMjB9ID0gMGIwMTsgIC8vIGltbTYgPSAwMXh4eHgKKyAgfQorICBkZWYgdjJpMzIgOiBOMlZEU2hJbnM8b3AyNCwgb3AyMywgb3AxMV84LCAwLCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICBmLCBPcGNvZGVTdHIsICIzMiIsIHYyaTMyLCBTaE9wPiB7CisgICAgbGV0IEluc3R7MjF9ID0gMGIxOyAgICAgIC8vIGltbTYgPSAxeHh4eHgKKyAgfQorICBkZWYgdjFpNjQgOiBOMlZEU2hJbnM8b3AyNCwgb3AyMywgb3AxMV84LCAxLCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICBmLCBPcGNvZGVTdHIsICI2NCIsIHYxaTY0LCBTaE9wPjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tNiA9IHh4eHh4eAorCisgIC8vIDEyOC1iaXQgdmVjdG9yIHR5cGVzLgorICBkZWYgdjE2aTggOiBOMlZRU2hJbnM8b3AyNCwgb3AyMywgb3AxMV84LCAwLCBvcDQsCisgICAgICAgICAgICAgICAgICAgICAgICBmLCBPcGNvZGVTdHIsICI4IiwgdjE2aTgsIFNoT3A+IHsKKyAgICBsZXQgSW5zdHsyMS0xOX0gPSAwYjAwMTsgLy8gaW1tNiA9IDAwMXh4eAorICB9CisgIGRlZiB2OGkxNiA6IE4yVlFTaEluczxvcDI0LCBvcDIzLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGYsIE9wY29kZVN0ciwgIjE2IiwgdjhpMTYsIFNoT3A+IHsKKyAgICBsZXQgSW5zdHsyMS0yMH0gPSAwYjAxOyAgLy8gaW1tNiA9IDAxeHh4eAorICB9CisgIGRlZiB2NGkzMiA6IE4yVlFTaEluczxvcDI0LCBvcDIzLCBvcDExXzgsIDAsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGYsIE9wY29kZVN0ciwgIjMyIiwgdjRpMzIsIFNoT3A+IHsKKyAgICBsZXQgSW5zdHsyMX0gPSAwYjE7ICAgICAgLy8gaW1tNiA9IDF4eHh4eAorICB9CisgIGRlZiB2Mmk2NCA6IE4yVlFTaEluczxvcDI0LCBvcDIzLCBvcDExXzgsIDEsIG9wNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGYsIE9wY29kZVN0ciwgIjY0IiwgdjJpNjQsIFNoT3A+OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW02ID0geHh4eHh4Cit9CisKKy8vIE5lb24gU2hpZnQgTG9uZyBvcGVyYXRpb25zLAorLy8gICBlbGVtZW50IHNpemVzIG9mIDgsIDE2LCAzMiBiaXRzOgorbXVsdGljbGFzcyBOMlZMU2hfUUhTPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw0PiBvcDExXzgsIGJpdCBvcDcsIGJpdCBvcDYsCisgICAgICAgICAgICAgICAgICAgICAgYml0IG9wNCwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBTRE5vZGUgT3BOb2RlPiB7CisgIGRlZiB2OGkxNiA6IE4yVkxTaDxvcDI0LCBvcDIzLCBvcDExXzgsIG9wNywgb3A2LCBvcDQsCisgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjgiKSwgdjhpMTYsIHY4aTgsIE9wTm9kZT4geworICAgIGxldCBJbnN0ezIxLTE5fSA9IDBiMDAxOyAvLyBpbW02ID0gMDAxeHh4CisgIH0KKyAgZGVmIHY0aTMyIDogTjJWTFNoPG9wMjQsIG9wMjMsIG9wMTFfOCwgb3A3LCBvcDYsIG9wNCwKKyAgICAgICAgICAgICAgICAgIE9wY29kZVN0ciwgIXN0cmNvbmNhdChEdCwgIjE2IiksIHY0aTMyLCB2NGkxNiwgT3BOb2RlPiB7CisgICAgbGV0IEluc3R7MjEtMjB9ID0gMGIwMTsgIC8vIGltbTYgPSAwMXh4eHgKKyAgfQorICBkZWYgdjJpNjQgOiBOMlZMU2g8b3AyNCwgb3AyMywgb3AxMV84LCBvcDcsIG9wNiwgb3A0LAorICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwgdjJpNjQsIHYyaTMyLCBPcE5vZGU+IHsKKyAgICBsZXQgSW5zdHsyMX0gPSAwYjE7ICAgICAgLy8gaW1tNiA9IDF4eHh4eAorICB9Cit9CisKKy8vIE5lb24gU2hpZnQgTmFycm93IG9wZXJhdGlvbnMsCisvLyAgIGVsZW1lbnQgc2l6ZXMgb2YgMTYsIDMyLCA2NCBiaXRzOgorbXVsdGljbGFzcyBOMlZOU2hfSFNEPGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw0PiBvcDExXzgsIGJpdCBvcDcsIGJpdCBvcDYsCisgICAgICAgICAgICAgICAgICAgICAgYml0IG9wNCwgSW5zdHJJdGluQ2xhc3MgaXRpbiwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LAorICAgICAgICAgICAgICAgICAgICAgIFNETm9kZSBPcE5vZGU+IHsKKyAgZGVmIHY4aTggOiBOMlZOU2g8b3AyNCwgb3AyMywgb3AxMV84LCBvcDcsIG9wNiwgb3A0LCBpdGluLAorICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICIxNiIpLCB2OGk4LCB2OGkxNiwgT3BOb2RlPiB7CisgICAgbGV0IEluc3R7MjEtMTl9ID0gMGIwMDE7IC8vIGltbTYgPSAwMDF4eHgKKyAgfQorICBkZWYgdjRpMTYgOiBOMlZOU2g8b3AyNCwgb3AyMywgb3AxMV84LCBvcDcsIG9wNiwgb3A0LCBpdGluLAorICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlU3RyLCAhc3RyY29uY2F0KER0LCAiMzIiKSwgdjRpMTYsIHY0aTMyLCBPcE5vZGU+IHsKKyAgICBsZXQgSW5zdHsyMS0yMH0gPSAwYjAxOyAgLy8gaW1tNiA9IDAxeHh4eAorICB9CisgIGRlZiB2MmkzMiA6IE4yVk5TaDxvcDI0LCBvcDIzLCBvcDExXzgsIG9wNywgb3A2LCBvcDQsIGl0aW4sCisgICAgICAgICAgICAgICAgICAgICBPcGNvZGVTdHIsICFzdHJjb25jYXQoRHQsICI2NCIpLCB2MmkzMiwgdjJpNjQsIE9wTm9kZT4geworICAgIGxldCBJbnN0ezIxfSA9IDBiMTsgICAgICAvLyBpbW02ID0gMXh4eHh4CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIERlZmluaXRpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVmVjdG9yIEFkZCBPcGVyYXRpb25zLgorCisvLyAgIFZBREQgICAgIDogVmVjdG9yIEFkZCAoaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQpCitkZWZtIFZBREQgICAgIDogTjNWX1FIU0Q8MCwgMCwgMGIxMDAwLCAwLCBJSUNfVkJJTmlELCBJSUNfVkJJTmlRLCAidmFkZCIsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhZGQsIDE+OworZGVmICBWQUREZmQgICA6IE4zVkQ8MCwgMCwgMGIwMCwgMGIxMTAxLCAwLCBJSUNfVkJJTkQsICJ2YWRkIiwgImYzMiIsCisgICAgICAgICAgICAgICAgICAgICB2MmYzMiwgdjJmMzIsIGZhZGQsIDE+OworZGVmICBWQUREZnEgICA6IE4zVlE8MCwgMCwgMGIwMCwgMGIxMTAxLCAwLCBJSUNfVkJJTlEsICJ2YWRkIiwgImYzMiIsCisgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjRmMzIsIGZhZGQsIDE+OworLy8gICBWQURETCAgICA6IFZlY3RvciBBZGQgTG9uZyAoUSA9IEQgKyBEKQorZGVmbSBWQURETHMgICA6IE4zVkxJbnRfUUhTPDAsMSwwYjAwMDAsMCwgSUlDX1ZTSExpRCwgSUlDX1ZTSExpRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFkZGwiLCAicyIsIGludF9hcm1fbmVvbl92YWRkbHMsIDE+OworZGVmbSBWQURETHUgICA6IE4zVkxJbnRfUUhTPDEsMSwwYjAwMDAsMCwgSUlDX1ZTSExpRCwgSUlDX1ZTSExpRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFkZGwiLCAidSIsIGludF9hcm1fbmVvbl92YWRkbHUsIDE+OworLy8gICBWQUREVyAgICA6IFZlY3RvciBBZGQgV2lkZSAoUSA9IFEgKyBEKQorZGVmbSBWQUREV3MgICA6IE4zVldJbnRfUUhTPDAsMSwwYjAwMDEsMCwgInZhZGR3IiwgInMiLCBpbnRfYXJtX25lb25fdmFkZHdzLCAwPjsKK2RlZm0gVkFERFd1ICAgOiBOM1ZXSW50X1FIUzwxLDEsMGIwMDAxLDAsICJ2YWRkdyIsICJ1IiwgaW50X2FybV9uZW9uX3ZhZGR3dSwgMD47CisvLyAgIFZIQUREICAgIDogVmVjdG9yIEhhbHZpbmcgQWRkCitkZWZtIFZIQUREcyAgIDogTjNWSW50X1FIUzwwLCAwLCAwYjAwMDAsIDAsIE4zUmVnRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZCSU5pNEQsIElJQ19WQklOaTRELCBJSUNfVkJJTmk0USwgSUlDX1ZCSU5pNFEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmhhZGQiLCAicyIsIGludF9hcm1fbmVvbl92aGFkZHMsIDE+OworZGVmbSBWSEFERHUgICA6IE4zVkludF9RSFM8MSwgMCwgMGIwMDAwLCAwLCBOM1JlZ0ZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WQklOaTRELCBJSUNfVkJJTmk0RCwgSUlDX1ZCSU5pNFEsIElJQ19WQklOaTRRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZoYWRkIiwgInUiLCBpbnRfYXJtX25lb25fdmhhZGR1LCAxPjsKKy8vICAgVlJIQUREICAgOiBWZWN0b3IgUm91bmRpbmcgSGFsdmluZyBBZGQKK2RlZm0gVlJIQUREcyAgOiBOM1ZJbnRfUUhTPDAsIDAsIDBiMDAwMSwgMCwgTjNSZWdGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVkJJTmk0RCwgSUlDX1ZCSU5pNEQsIElJQ19WQklOaTRRLCBJSUNfVkJJTmk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cmhhZGQiLCAicyIsIGludF9hcm1fbmVvbl92cmhhZGRzLCAxPjsKK2RlZm0gVlJIQUREdSAgOiBOM1ZJbnRfUUhTPDEsIDAsIDBiMDAwMSwgMCwgTjNSZWdGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVkJJTmk0RCwgSUlDX1ZCSU5pNEQsIElJQ19WQklOaTRRLCBJSUNfVkJJTmk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cmhhZGQiLCAidSIsIGludF9hcm1fbmVvbl92cmhhZGR1LCAxPjsKKy8vICAgVlFBREQgICAgOiBWZWN0b3IgU2F0dXJhdGluZyBBZGQKK2RlZm0gVlFBRERzICAgOiBOM1ZJbnRfUUhTRDwwLCAwLCAwYjAwMDAsIDEsIE4zUmVnRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WQklOaTRELCBJSUNfVkJJTmk0RCwgSUlDX1ZCSU5pNFEsIElJQ19WQklOaTRRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cWFkZCIsICJzIiwgaW50X2FybV9uZW9uX3ZxYWRkcywgMT47CitkZWZtIFZRQUREdSAgIDogTjNWSW50X1FIU0Q8MSwgMCwgMGIwMDAwLCAxLCBOM1JlZ0ZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVkJJTmk0RCwgSUlDX1ZCSU5pNEQsIElJQ19WQklOaTRRLCBJSUNfVkJJTmk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnFhZGQiLCAidSIsIGludF9hcm1fbmVvbl92cWFkZHUsIDE+OworLy8gICBWQURESE4gICA6IFZlY3RvciBBZGQgYW5kIE5hcnJvdyBSZXR1cm5pbmcgSGlnaCBIYWxmIChEID0gUSArIFEpCitkZWZtIFZBRERITiAgIDogTjNWTkludF9IU0Q8MCwxLDBiMDEwMCwwLCAidmFkZGhuIiwgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9hcm1fbmVvbl92YWRkaG4sIDE+OworLy8gICBWUkFEREhOICA6IFZlY3RvciBSb3VuZGluZyBBZGQgYW5kIE5hcnJvdyBSZXR1cm5pbmcgSGlnaCBIYWxmIChEID0gUSArIFEpCitkZWZtIFZSQURESE4gIDogTjNWTkludF9IU0Q8MSwxLDBiMDEwMCwwLCAidnJhZGRobiIsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfYXJtX25lb25fdnJhZGRobiwgMT47CisKKy8vIFZlY3RvciBNdWx0aXBseSBPcGVyYXRpb25zLgorCisvLyAgIFZNVUwgICAgIDogVmVjdG9yIE11bHRpcGx5IChpbnRlZ2VyLCBwb2x5bm9taWFsIGFuZCBmbG9hdGluZy1wb2ludCkKK2RlZm0gVk1VTCAgICAgOiBOM1ZfUUhTPDAsIDAsIDBiMTAwMSwgMSwgSUlDX1ZNVUxpMTZELCBJSUNfVk1VTGkzMkQsCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1VTGkxNlEsIElJQ19WTVVMaTMyUSwgInZtdWwiLCAiaSIsIG11bCwgMT47CitkZWYgIFZNVUxwZCAgIDogTjNWREludDwxLCAwLCAwYjAwLCAwYjEwMDEsIDEsIE4zUmVnRnJtLCBJSUNfVk1VTGkxNkQsICJ2bXVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwOCIsIHY4aTgsIHY4aTgsIGludF9hcm1fbmVvbl92bXVscCwgMT47CitkZWYgIFZNVUxwcSAgIDogTjNWUUludDwxLCAwLCAwYjAwLCAwYjEwMDEsIDEsIE4zUmVnRnJtLCBJSUNfVk1VTGkxNlEsICJ2bXVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwOCIsIHYxNmk4LCB2MTZpOCwgaW50X2FybV9uZW9uX3ZtdWxwLCAxPjsKK2RlZiAgVk1VTGZkICAgOiBOM1ZEPDEsIDAsIDBiMDAsIDBiMTEwMSwgMSwgSUlDX1ZCSU5ELCAidm11bCIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgdjJmMzIsIHYyZjMyLCBmbXVsLCAxPjsKK2RlZiAgVk1VTGZxICAgOiBOM1ZRPDEsIDAsIDBiMDAsIDBiMTEwMSwgMSwgSUlDX1ZCSU5RLCAidm11bCIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgdjRmMzIsIHY0ZjMyLCBmbXVsLCAxPjsKK2RlZm0gVk1VTHNsICAgOiBOM1ZTTF9IUzwwYjEwMDAsICJ2bXVsIiwgImkiLCBtdWw+OworZGVmICBWTVVMc2xmZCA6IE4zVkRTTDwwYjEwLCAwYjEwMDEsIElJQ19WQklORCwgInZtdWwiLCAiZjMyIiwgdjJmMzIsIGZtdWw+OworZGVmICBWTVVMc2xmcSA6IE4zVlFTTDwwYjEwLCAwYjEwMDEsIElJQ19WQklOUSwgInZtdWwiLCAiZjMyIiwgdjRmMzIsCisgICAgICAgICAgICAgICAgICAgICAgIHYyZjMyLCBmbXVsPjsKKworZGVmIDogUGF0PCh2OGkxNiAobXVsICh2OGkxNiBRUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiAoTkVPTnZkdXBsYW5lICh2OGkxNiBRUFI6JHNyYzIpLCBpbW06JGxhbmUpKSkpLAorICAgICAgICAgICh2OGkxNiAoVk1VTHNsdjhpMTYgKHY4aTE2IFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRpMTYgKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaTE2X3JlZyBpbW06JGxhbmUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3ViUmVnX2kxNl9sYW5lIGltbTokbGFuZSkpKT47CitkZWYgOiBQYXQ8KHY0aTMyIChtdWwgKHY0aTMyIFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIChORU9OdmR1cGxhbmUgKHY0aTMyIFFQUjokc3JjMiksIGltbTokbGFuZSkpKSksCisgICAgICAgICAgKHY0aTMyIChWTVVMc2x2NGkzMiAodjRpMzIgUVBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MmkzMiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFN1YlJlZ19pMzJfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdWJSZWdfaTMyX2xhbmUgaW1tOiRsYW5lKSkpPjsKK2RlZiA6IFBhdDwodjRmMzIgKGZtdWwgKHY0ZjMyIFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiAoTkVPTnZkdXBsYW5lICh2NGYzMiBRUFI6JHNyYzIpLCBpbW06JGxhbmUpKSkpLAorICAgICAgICAgICh2NGYzMiAoVk1VTHNsZnEgKHY0ZjMyIFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJmMzIgKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaTMyX3JlZyBpbW06JGxhbmUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3ViUmVnX2kzMl9sYW5lIGltbTokbGFuZSkpKT47CisKKy8vICAgVlFETVVMSCAgOiBWZWN0b3IgU2F0dXJhdGluZyBEb3VibGluZyBNdWx0aXBseSBSZXR1cm5pbmcgSGlnaCBIYWxmCitkZWZtIFZRRE1VTEggIDogTjNWSW50X0hTPDAsIDAsIDBiMTAxMSwgMCwgTjNSZWdGcm0sIElJQ19WTVVMaTE2RCwgSUlDX1ZNVUxpMzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1VTGkxNlEsIElJQ19WTVVMaTMyUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cWRtdWxoIiwgInMiLCBpbnRfYXJtX25lb25fdnFkbXVsaCwgMT47CitkZWZtIFZRRE1VTEhzbDogTjNWSW50U0xfSFM8MGIxMTAwLCBJSUNfVk1VTGkxNkQsIElJQ19WTVVMaTMyRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1VTGkxNlEsIElJQ19WTVVMaTMyUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnFkbXVsaCIsICJzIiwgIGludF9hcm1fbmVvbl92cWRtdWxoPjsKK2RlZiA6IFBhdDwodjhpMTYgKGludF9hcm1fbmVvbl92cWRtdWxoICh2OGkxNiBRUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2IChORU9OdmR1cGxhbmUgKHY4aTE2IFFQUjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGxhbmUpKSkpLAorICAgICAgICAgICh2OGkxNiAoVlFETVVMSHNsdjhpMTYgKHY4aTE2IFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRpMTYgKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaTE2X3JlZyBpbW06JGxhbmUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3ViUmVnX2kxNl9sYW5lIGltbTokbGFuZSkpKT47CitkZWYgOiBQYXQ8KHY0aTMyIChpbnRfYXJtX25lb25fdnFkbXVsaCAodjRpMzIgUVBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoTkVPTnZkdXBsYW5lICh2NGkzMiBRUFI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRsYW5lKSkpKSwKKyAgICAgICAgICAodjRpMzIgKFZRRE1VTEhzbHY0aTMyICh2NGkzMiBRUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyaTMyIChFWFRSQUNUX1NVQlJFRyBRUFI6JHNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2kzMl9yZWcgaW1tOiRsYW5lKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN1YlJlZ19pMzJfbGFuZSBpbW06JGxhbmUpKSk+OworCisvLyAgIFZRUkRNVUxIIDogVmVjdG9yIFJvdW5kaW5nIFNhdHVyYXRpbmcgRG91YmxpbmcgTXVsdGlwbHkgUmV0dXJuaW5nIEhpZ2ggSGFsZgorZGVmbSBWUVJETVVMSCAgIDogTjNWSW50X0hTPDEsIDAsIDBiMTAxMSwgMCwgTjNSZWdGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZNVUxpMTZELElJQ19WTVVMaTMyRCxJSUNfVk1VTGkxNlEsSUlDX1ZNVUxpMzJRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cXJkbXVsaCIsICJzIiwgaW50X2FybV9uZW9uX3ZxcmRtdWxoLCAxPjsKK2RlZm0gVlFSRE1VTEhzbCA6IE4zVkludFNMX0hTPDBiMTEwMSwgSUlDX1ZNVUxpMTZELCBJSUNfVk1VTGkzMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1VTGkxNlEsIElJQ19WTVVMaTMyUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cXJkbXVsaCIsICJzIiwgIGludF9hcm1fbmVvbl92cXJkbXVsaD47CitkZWYgOiBQYXQ8KHY4aTE2IChpbnRfYXJtX25lb25fdnFyZG11bGggKHY4aTE2IFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2IChORU9OdmR1cGxhbmUgKHY4aTE2IFFQUjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRsYW5lKSkpKSwKKyAgICAgICAgICAodjhpMTYgKFZRUkRNVUxIc2x2OGkxNiAodjhpMTYgUVBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRpMTYgKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2kxNl9yZWcgaW1tOiRsYW5lKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdWJSZWdfaTE2X2xhbmUgaW1tOiRsYW5lKSkpPjsKK2RlZiA6IFBhdDwodjRpMzIgKGludF9hcm1fbmVvbl92cXJkbXVsaCAodjRpMzIgUVBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRpMzIgKE5FT052ZHVwbGFuZSAodjRpMzIgUVBSOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGxhbmUpKSkpLAorICAgICAgICAgICh2NGkzMiAoVlFSRE1VTEhzbHY0aTMyICh2NGkzMiBRUFI6JHNyYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MmkzMiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaTMyX3JlZyBpbW06JGxhbmUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN1YlJlZ19pMzJfbGFuZSBpbW06JGxhbmUpKSk+OworCisvLyAgIFZNVUxMICAgIDogVmVjdG9yIE11bHRpcGx5IExvbmcgKGludGVnZXIgYW5kIHBvbHlub21pYWwpIChRID0gRCAqIEQpCitkZWZtIFZNVUxMcyAgIDogTjNWTEludF9RSFM8MCwxLDBiMTEwMCwwLCBJSUNfVk1VTGkxNkQsIElJQ19WTVVMaTMyRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm11bGwiLCAicyIsIGludF9hcm1fbmVvbl92bXVsbHMsIDE+OworZGVmbSBWTVVMTHUgICA6IE4zVkxJbnRfUUhTPDEsMSwwYjExMDAsMCwgSUlDX1ZNVUxpMTZELCBJSUNfVk1VTGkzMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZtdWxsIiwgInUiLCBpbnRfYXJtX25lb25fdm11bGx1LCAxPjsKK2RlZiAgVk1VTExwICAgOiBOM1ZMSW50PDAsIDEsIDBiMDAsIDBiMTExMCwgMCwgSUlDX1ZNVUxpMTZELCAidm11bGwiLCAicDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjhpMTYsIHY4aTgsIGludF9hcm1fbmVvbl92bXVsbHAsIDE+OworZGVmbSBWTVVMTHNscyA6IE4zVkxJbnRTTF9IUzwwLCAwYjEwMTAsIElJQ19WTVVMaTE2RCwgInZtdWxsIiwgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfYXJtX25lb25fdm11bGxzPjsKK2RlZm0gVk1VTExzbHUgOiBOM1ZMSW50U0xfSFM8MSwgMGIxMDEwLCBJSUNfVk1VTGkxNkQsICJ2bXVsbCIsICJ1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X2FybV9uZW9uX3ZtdWxsdT47CisKKy8vICAgVlFETVVMTCAgOiBWZWN0b3IgU2F0dXJhdGluZyBEb3VibGluZyBNdWx0aXBseSBMb25nIChRID0gRCAqIEQpCitkZWZtIFZRRE1VTEwgIDogTjNWTEludF9IUzwwLDEsMGIxMTAxLDAsIElJQ19WTVVMaTE2RCwgSUlDX1ZNVUxpMzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZxZG11bGwiLCAicyIsIGludF9hcm1fbmVvbl92cWRtdWxsLCAxPjsKK2RlZm0gVlFETVVMTHNsOiBOM1ZMSW50U0xfSFM8MCwgMGIxMDExLCBJSUNfVk1VTGkxNkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cWRtdWxsIiwgInMiLCBpbnRfYXJtX25lb25fdnFkbXVsbD47CisKKy8vIFZlY3RvciBNdWx0aXBseS1BY2N1bXVsYXRlIGFuZCBNdWx0aXBseS1TdWJ0cmFjdCBPcGVyYXRpb25zLgorCisvLyAgIFZNTEEgICAgIDogVmVjdG9yIE11bHRpcGx5IEFjY3VtdWxhdGUgKGludGVnZXIgYW5kIGZsb2F0aW5nLXBvaW50KQorZGVmbSBWTUxBICAgICA6IE4zVk11bE9wX1FIUzwwLCAwLCAwYjEwMDEsIDAsIElJQ19WTUFDaTE2RCwgSUlDX1ZNQUNpMzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1BQ2kxNlEsIElJQ19WTUFDaTMyUSwgInZtbGEiLCAiaSIsIGFkZD47CitkZWYgIFZNTEFmZCAgIDogTjNWRE11bE9wPDAsIDAsIDBiMDAsIDBiMTEwMSwgMSwgSUlDX1ZNQUNELCAidm1sYSIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2MmYzMiwgZm11bCwgZmFkZD47CitkZWYgIFZNTEFmcSAgIDogTjNWUU11bE9wPDAsIDAsIDBiMDAsIDBiMTEwMSwgMSwgSUlDX1ZNQUNRLCAidm1sYSIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgZm11bCwgZmFkZD47CitkZWZtIFZNTEFzbCAgIDogTjNWTXVsT3BTTF9IUzwwYjAwMDAsIElJQ19WTUFDaTE2RCwgSUlDX1ZNQUNpMzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZNQUNpMTZRLCBJSUNfVk1BQ2kzMlEsICJ2bWxhIiwgImkiLCBhZGQ+OworZGVmICBWTUxBc2xmZCA6IE4zVkRNdWxPcFNMPDBiMTAsIDBiMDAwMSwgSUlDX1ZNQUNELCAidm1sYSIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyZjMyLCBmbXVsLCBmYWRkPjsKK2RlZiAgVk1MQXNsZnEgOiBOM1ZRTXVsT3BTTDwwYjEwLCAwYjAwMDEsIElJQ19WTUFDUSwgInZtbGEiLCAiZjMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjJmMzIsIGZtdWwsIGZhZGQ+OworCitkZWYgOiBQYXQ8KHY4aTE2IChhZGQgKHY4aTE2IFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAobXVsICh2OGkxNiBRUFI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYgKE5FT052ZHVwbGFuZSAodjhpMTYgUVBSOiRzcmMzKSwgaW1tOiRsYW5lKSkpKSksCisgICAgICAgICAgKHY4aTE2IChWTUxBc2x2OGkxNiAodjhpMTYgUVBSOiRzcmMxKSwgKHY4aTE2IFFQUjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRpMTYgKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaTE2X3JlZyBpbW06JGxhbmUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3ViUmVnX2kxNl9sYW5lIGltbTokbGFuZSkpKT47CisKK2RlZiA6IFBhdDwodjRpMzIgKGFkZCAodjRpMzIgUVBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgIChtdWwgKHY0aTMyIFFQUjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoTkVPTnZkdXBsYW5lICh2NGkzMiBRUFI6JHNyYzMpLCBpbW06JGxhbmUpKSkpKSwKKyAgICAgICAgICAodjRpMzIgKFZNTEFzbHY0aTMyICh2NGkzMiBRUFI6JHNyYzEpLCAodjRpMzIgUVBSOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MmkzMiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFN1YlJlZ19pMzJfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdWJSZWdfaTMyX2xhbmUgaW1tOiRsYW5lKSkpPjsKKworZGVmIDogUGF0PCh2NGYzMiAoZmFkZCAodjRmMzIgUVBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgIChmbXVsICh2NGYzMiBRUFI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIChORU9OdmR1cGxhbmUgKHY0ZjMyIFFQUjokc3JjMyksIGltbTokbGFuZSkpKSkpLAorICAgICAgICAgICh2NGYzMiAoVk1MQXNsZnEgKHY0ZjMyIFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRmMzIgUVBSOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MmYzMiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFN1YlJlZ19pMzJfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdWJSZWdfaTMyX2xhbmUgaW1tOiRsYW5lKSkpPjsKKworLy8gICBWTUxBTCAgICA6IFZlY3RvciBNdWx0aXBseSBBY2N1bXVsYXRlIExvbmcgKFEgKz0gRCAqIEQpCitkZWZtIFZNTEFMcyAgIDogTjNWTEludDNfUUhTPDAsMSwwYjEwMDAsMCwgSUlDX1ZNQUNpMTZELCBJSUNfVk1BQ2kzMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bWxhbCIsICJzIiwgaW50X2FybV9uZW9uX3ZtbGFscz47CitkZWZtIFZNTEFMdSAgIDogTjNWTEludDNfUUhTPDEsMSwwYjEwMDAsMCwgSUlDX1ZNQUNpMTZELCBJSUNfVk1BQ2kzMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bWxhbCIsICJ1IiwgaW50X2FybV9uZW9uX3ZtbGFsdT47CisKK2RlZm0gVk1MQUxzbHMgOiBOM1ZMSW50M1NMX0hTPDAsIDBiMDAxMCwgInZtbGFsIiwgInMiLCBpbnRfYXJtX25lb25fdm1sYWxzPjsKK2RlZm0gVk1MQUxzbHUgOiBOM1ZMSW50M1NMX0hTPDEsIDBiMDAxMCwgInZtbGFsIiwgInUiLCBpbnRfYXJtX25lb25fdm1sYWx1PjsKKworLy8gICBWUURNTEFMICA6IFZlY3RvciBTYXR1cmF0aW5nIERvdWJsaW5nIE11bHRpcGx5IEFjY3VtdWxhdGUgTG9uZyAoUSArPSBEICogRCkKK2RlZm0gVlFETUxBTCAgOiBOM1ZMSW50M19IUzwwLCAxLCAwYjEwMDEsIDAsIElJQ19WTUFDaTE2RCwgSUlDX1ZNQUNpMzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cWRtbGFsIiwgInMiLCBpbnRfYXJtX25lb25fdnFkbWxhbD47CitkZWZtIFZRRE1MQUxzbDogTjNWTEludDNTTF9IUzwwLCAwYjAwMTEsICJ2cWRtbGFsIiwgInMiLCBpbnRfYXJtX25lb25fdnFkbWxhbD47CisKKy8vICAgVk1MUyAgICAgOiBWZWN0b3IgTXVsdGlwbHkgU3VidHJhY3QgKGludGVnZXIgYW5kIGZsb2F0aW5nLXBvaW50KQorZGVmbSBWTUxTICAgICA6IE4zVk11bE9wX1FIUzwxLCAwLCAwYjEwMDEsIDAsIElJQ19WTUFDaTE2RCwgSUlDX1ZNQUNpMzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1BQ2kxNlEsIElJQ19WTUFDaTMyUSwgInZtbHMiLCAiaSIsIHN1Yj47CitkZWYgIFZNTFNmZCAgIDogTjNWRE11bE9wPDAsIDAsIDBiMTAsIDBiMTEwMSwgMSwgSUlDX1ZNQUNELCAidm1scyIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2MmYzMiwgZm11bCwgZnN1Yj47CitkZWYgIFZNTFNmcSAgIDogTjNWUU11bE9wPDAsIDAsIDBiMTAsIDBiMTEwMSwgMSwgSUlDX1ZNQUNRLCAidm1scyIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgZm11bCwgZnN1Yj47CitkZWZtIFZNTFNzbCAgIDogTjNWTXVsT3BTTF9IUzwwYjAxMDAsIElJQ19WTUFDaTE2RCwgSUlDX1ZNQUNpMzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZNQUNpMTZRLCBJSUNfVk1BQ2kzMlEsICJ2bWxzIiwgImkiLCBzdWI+OworZGVmICBWTUxTc2xmZCA6IE4zVkRNdWxPcFNMPDBiMTAsIDBiMDEwMSwgSUlDX1ZNQUNELCAidm1scyIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyZjMyLCBmbXVsLCBmc3ViPjsKK2RlZiAgVk1MU3NsZnEgOiBOM1ZRTXVsT3BTTDwwYjEwLCAwYjAxMDEsIElJQ19WTUFDUSwgInZtbHMiLCAiZjMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjJmMzIsIGZtdWwsIGZzdWI+OworCitkZWYgOiBQYXQ8KHY4aTE2IChzdWIgKHY4aTE2IFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAobXVsICh2OGkxNiBRUFI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYgKE5FT052ZHVwbGFuZSAodjhpMTYgUVBSOiRzcmMzKSwgaW1tOiRsYW5lKSkpKSksCisgICAgICAgICAgKHY4aTE2IChWTUxTc2x2OGkxNiAodjhpMTYgUVBSOiRzcmMxKSwgKHY4aTE2IFFQUjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRpMTYgKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaTE2X3JlZyBpbW06JGxhbmUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3ViUmVnX2kxNl9sYW5lIGltbTokbGFuZSkpKT47CisKK2RlZiA6IFBhdDwodjRpMzIgKHN1YiAodjRpMzIgUVBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgIChtdWwgKHY0aTMyIFFQUjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAodjRpMzIgKE5FT052ZHVwbGFuZSAodjRpMzIgUVBSOiRzcmMzKSwgaW1tOiRsYW5lKSkpKSksCisgICAgICAgICAgKHY0aTMyIChWTUxTc2x2NGkzMiAodjRpMzIgUVBSOiRzcmMxKSwgKHY0aTMyIFFQUjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJpMzIgKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaTMyX3JlZyBpbW06JGxhbmUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3ViUmVnX2kzMl9sYW5lIGltbTokbGFuZSkpKT47CisKK2RlZiA6IFBhdDwodjRmMzIgKGZzdWIgKHY0ZjMyIFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAoZm11bCAodjRmMzIgUVBSOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiAoTkVPTnZkdXBsYW5lICh2NGYzMiBRUFI6JHNyYzMpLCBpbW06JGxhbmUpKSkpKSwKKyAgICAgICAgICAodjRmMzIgKFZNTFNzbGZxICh2NGYzMiBRUFI6JHNyYzEpLCAodjRmMzIgUVBSOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MmYzMiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFN1YlJlZ19pMzJfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdWJSZWdfaTMyX2xhbmUgaW1tOiRsYW5lKSkpPjsKKworLy8gICBWTUxTTCAgICA6IFZlY3RvciBNdWx0aXBseSBTdWJ0cmFjdCBMb25nIChRIC09IEQgKiBEKQorZGVmbSBWTUxTTHMgICA6IE4zVkxJbnQzX1FIUzwwLDEsMGIxMDEwLDAsIElJQ19WTUFDaTE2RCwgSUlDX1ZNQUNpMzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm1sc2wiLCAicyIsIGludF9hcm1fbmVvbl92bWxzbHM+OworZGVmbSBWTUxTTHUgICA6IE4zVkxJbnQzX1FIUzwxLDEsMGIxMDEwLDAsIElJQ19WTUFDaTE2RCwgSUlDX1ZNQUNpMzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm1sc2wiLCAidSIsIGludF9hcm1fbmVvbl92bWxzbHU+OworCitkZWZtIFZNTFNMc2xzIDogTjNWTEludDNTTF9IUzwwLCAwYjAxMTAsICJ2bWxzbCIsICJzIiwgaW50X2FybV9uZW9uX3ZtbHNscz47CitkZWZtIFZNTFNMc2x1IDogTjNWTEludDNTTF9IUzwxLCAwYjAxMTAsICJ2bWxzbCIsICJ1IiwgaW50X2FybV9uZW9uX3ZtbHNsdT47CisKKy8vICAgVlFETUxTTCAgOiBWZWN0b3IgU2F0dXJhdGluZyBEb3VibGluZyBNdWx0aXBseSBTdWJ0cmFjdCBMb25nIChRIC09IEQgKiBEKQorZGVmbSBWUURNTFNMICA6IE4zVkxJbnQzX0hTPDAsIDEsIDBiMTAxMSwgMCwgSUlDX1ZNQUNpMTZELCBJSUNfVk1BQ2kzMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZxZG1sc2wiLCAicyIsIGludF9hcm1fbmVvbl92cWRtbHNsPjsKK2RlZm0gVlFETUxTTHNsOiBOM1ZMSW50M1NMX0hTPDAsIDBiMTExLCAidnFkbWxzbCIsICJzIiwgaW50X2FybV9uZW9uX3ZxZG1sc2w+OworCisvLyBWZWN0b3IgU3VidHJhY3QgT3BlcmF0aW9ucy4KKworLy8gICBWU1VCICAgICA6IFZlY3RvciBTdWJ0cmFjdCAoaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQpCitkZWZtIFZTVUIgICAgIDogTjNWX1FIU0Q8MSwgMCwgMGIxMDAwLCAwLCBJSUNfVlNVQmlELCBJSUNfVlNVQmlRLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ2c3ViIiwgImkiLCBzdWIsIDA+OworZGVmICBWU1VCZmQgICA6IE4zVkQ8MCwgMCwgMGIxMCwgMGIxMTAxLCAwLCBJSUNfVkJJTkQsICJ2c3ViIiwgImYzMiIsCisgICAgICAgICAgICAgICAgICAgICB2MmYzMiwgdjJmMzIsIGZzdWIsIDA+OworZGVmICBWU1VCZnEgICA6IE4zVlE8MCwgMCwgMGIxMCwgMGIxMTAxLCAwLCBJSUNfVkJJTlEsICJ2c3ViIiwgImYzMiIsCisgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjRmMzIsIGZzdWIsIDA+OworLy8gICBWU1VCTCAgICA6IFZlY3RvciBTdWJ0cmFjdCBMb25nIChRID0gRCAtIEQpCitkZWZtIFZTVUJMcyAgIDogTjNWTEludF9RSFM8MCwxLDBiMDAxMCwwLCBJSUNfVlNITGlELCBJSUNfVlNITGlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2c3VibCIsICJzIiwgaW50X2FybV9uZW9uX3ZzdWJscywgMT47CitkZWZtIFZTVUJMdSAgIDogTjNWTEludF9RSFM8MSwxLDBiMDAxMCwwLCBJSUNfVlNITGlELCBJSUNfVlNITGlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2c3VibCIsICJ1IiwgaW50X2FybV9uZW9uX3ZzdWJsdSwgMT47CisvLyAgIFZTVUJXICAgIDogVmVjdG9yIFN1YnRyYWN0IFdpZGUgKFEgPSBRIC0gRCkKK2RlZm0gVlNVQldzICAgOiBOM1ZXSW50X1FIUzwwLDEsMGIwMDExLDAsICJ2c3VidyIsICJzIiwgaW50X2FybV9uZW9uX3ZzdWJ3cywgMD47CitkZWZtIFZTVUJXdSAgIDogTjNWV0ludF9RSFM8MSwxLDBiMDAxMSwwLCAidnN1YnciLCAidSIsIGludF9hcm1fbmVvbl92c3Vid3UsIDA+OworLy8gICBWSFNVQiAgICA6IFZlY3RvciBIYWx2aW5nIFN1YnRyYWN0CitkZWZtIFZIU1VCcyAgIDogTjNWSW50X1FIUzwwLCAwLCAwYjAwMTAsIDAsIE4zUmVnRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZTVUJpNEQsIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0USwgSUlDX1ZTVUJpNFEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmhzdWIiLCAicyIsIGludF9hcm1fbmVvbl92aHN1YnMsIDA+OworZGVmbSBWSFNVQnUgICA6IE4zVkludF9RSFM8MSwgMCwgMGIwMDEwLCAwLCBOM1JlZ0ZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNFEsIElJQ19WU1VCaTRRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZoc3ViIiwgInUiLCBpbnRfYXJtX25lb25fdmhzdWJ1LCAwPjsKKy8vICAgVlFTVUIgICAgOiBWZWN0b3IgU2F0dXJpbmcgU3VidHJhY3QKK2RlZm0gVlFTVUJzICAgOiBOM1ZJbnRfUUhTRDwwLCAwLCAwYjAwMTAsIDEsIE4zUmVnRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNFEsIElJQ19WU1VCaTRRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cXN1YiIsICJzIiwgaW50X2FybV9uZW9uX3Zxc3VicywgMD47CitkZWZtIFZRU1VCdSAgIDogTjNWSW50X1FIU0Q8MSwgMCwgMGIwMDEwLCAxLCBOM1JlZ0ZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNEQsIElJQ19WU1VCaTRRLCBJSUNfVlNVQmk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnFzdWIiLCAidSIsIGludF9hcm1fbmVvbl92cXN1YnUsIDA+OworLy8gICBWU1VCSE4gICA6IFZlY3RvciBTdWJ0cmFjdCBhbmQgTmFycm93IFJldHVybmluZyBIaWdoIEhhbGYgKEQgPSBRIC0gUSkKK2RlZm0gVlNVQkhOICAgOiBOM1ZOSW50X0hTRDwwLDEsMGIwMTEwLDAsICJ2c3ViaG4iLCAiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X2FybV9uZW9uX3ZzdWJobiwgMD47CisvLyAgIFZSU1VCSE4gIDogVmVjdG9yIFJvdW5kaW5nIFN1YnRyYWN0IGFuZCBOYXJyb3cgUmV0dXJuaW5nIEhpZ2ggSGFsZiAoRD1RLVEpCitkZWZtIFZSU1VCSE4gIDogTjNWTkludF9IU0Q8MSwxLDBiMDExMCwwLCAidnJzdWJobiIsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfYXJtX25lb25fdnJzdWJobiwgMD47CisKKy8vIFZlY3RvciBDb21wYXJpc29ucy4KKworLy8gICBWQ0VRICAgICA6IFZlY3RvciBDb21wYXJlIEVxdWFsCitkZWZtIFZDRVEgICAgIDogTjNWX1FIUzwxLCAwLCAwYjEwMDAsIDEsIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNFEsCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNVQmk0USwgInZjZXEiLCAiaSIsIE5FT052Y2VxLCAxPjsKK2RlZiAgVkNFUWZkICAgOiBOM1ZEPDAsMCwwYjAwLDBiMTExMCwwLCBJSUNfVkJJTkQsICJ2Y2VxIiwgImYzMiIsIHYyaTMyLCB2MmYzMiwKKyAgICAgICAgICAgICAgICAgICAgIE5FT052Y2VxLCAxPjsKK2RlZiAgVkNFUWZxICAgOiBOM1ZRPDAsMCwwYjAwLDBiMTExMCwwLCBJSUNfVkJJTlEsICJ2Y2VxIiwgImYzMiIsIHY0aTMyLCB2NGYzMiwKKyAgICAgICAgICAgICAgICAgICAgIE5FT052Y2VxLCAxPjsKKy8vIEZvciBkaXNhc3NlbWJseSBvbmx5LgorZGVmbSBWQ0VReiAgICA6IE4yVl9RSFNfY21wPDBiMTEsIDBiMTEsIDBiMDEsIDBiMDAwMTAsIDAsICJ2Y2VxIiwgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkZHN0LCAkc3JjLCAjMCI+OworCisvLyAgIFZDR0UgICAgIDogVmVjdG9yIENvbXBhcmUgR3JlYXRlciBUaGFuIG9yIEVxdWFsCitkZWZtIFZDR0VzICAgIDogTjNWX1FIUzwwLCAwLCAwYjAwMTEsIDEsIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNFEsCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNVQmk0USwgInZjZ2UiLCAicyIsIE5FT052Y2dlLCAwPjsKK2RlZm0gVkNHRXUgICAgOiBOM1ZfUUhTPDEsIDAsIDBiMDAxMSwgMSwgSUlDX1ZTVUJpNEQsIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0USwgCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNVQmk0USwgInZjZ2UiLCAidSIsIE5FT052Y2dldSwgMD47CitkZWYgIFZDR0VmZCAgIDogTjNWRDwxLDAsMGIwMCwwYjExMTAsMCwgSUlDX1ZCSU5ELCAidmNnZSIsICJmMzIiLCB2MmkzMiwgdjJmMzIsCisgICAgICAgICAgICAgICAgICAgICBORU9OdmNnZSwgMD47CitkZWYgIFZDR0VmcSAgIDogTjNWUTwxLDAsMGIwMCwwYjExMTAsMCwgSUlDX1ZCSU5RLCAidmNnZSIsICJmMzIiLCB2NGkzMiwgdjRmMzIsCisgICAgICAgICAgICAgICAgICAgICBORU9OdmNnZSwgMD47CisvLyBGb3IgZGlzYXNzZW1ibHkgb25seS4KK2RlZm0gVkNHRXogICAgOiBOMlZfUUhTX2NtcDwwYjExLCAwYjExLCAwYjAxLCAwYjAwMDAxLCAwLCAidmNnZSIsICJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGRzdCwgJHNyYywgIzAiPjsKKy8vIEZvciBkaXNhc3NlbWJseSBvbmx5LgorZGVmbSBWQ0xFeiAgICA6IE4yVl9RSFNfY21wPDBiMTEsIDBiMTEsIDBiMDEsIDBiMDAwMTEsIDAsICJ2Y2xlIiwgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkZHN0LCAkc3JjLCAjMCI+OworCisvLyAgIFZDR1QgICAgIDogVmVjdG9yIENvbXBhcmUgR3JlYXRlciBUaGFuCitkZWZtIFZDR1RzICAgIDogTjNWX1FIUzwwLCAwLCAwYjAwMTEsIDAsIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNFEsCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNVQmk0USwgInZjZ3QiLCAicyIsIE5FT052Y2d0LCAwPjsKK2RlZm0gVkNHVHUgICAgOiBOM1ZfUUhTPDEsIDAsIDBiMDAxMSwgMCwgSUlDX1ZTVUJpNEQsIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WU1VCaTRRLCAidmNndCIsICJ1IiwgTkVPTnZjZ3R1LCAwPjsKK2RlZiAgVkNHVGZkICAgOiBOM1ZEPDEsMCwwYjEwLDBiMTExMCwwLCBJSUNfVkJJTkQsICJ2Y2d0IiwgImYzMiIsIHYyaTMyLCB2MmYzMiwKKyAgICAgICAgICAgICAgICAgICAgIE5FT052Y2d0LCAwPjsKK2RlZiAgVkNHVGZxICAgOiBOM1ZRPDEsMCwwYjEwLDBiMTExMCwwLCBJSUNfVkJJTlEsICJ2Y2d0IiwgImYzMiIsIHY0aTMyLCB2NGYzMiwKKyAgICAgICAgICAgICAgICAgICAgIE5FT052Y2d0LCAwPjsKKy8vIEZvciBkaXNhc3NlbWJseSBvbmx5LgorZGVmbSBWQ0dUeiAgICA6IE4yVl9RSFNfY21wPDBiMTEsIDBiMTEsIDBiMDEsIDBiMDAwMDAsIDAsICJ2Y2d0IiwgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkZHN0LCAkc3JjLCAjMCI+OworLy8gRm9yIGRpc2Fzc2VtYmx5IG9ubHkuCitkZWZtIFZDTFR6ICAgIDogTjJWX1FIU19jbXA8MGIxMSwgMGIxMSwgMGIwMSwgMGIwMDEwMCwgMCwgInZjbHQiLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRkc3QsICRzcmMsICMwIj47CisKKy8vICAgVkFDR0UgICAgOiBWZWN0b3IgQWJzb2x1dGUgQ29tcGFyZSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwgKGFrYSBWQ0FHRSkKK2RlZiAgVkFDR0VkICAgOiBOM1ZESW50PDEsIDAsIDBiMDAsIDBiMTExMCwgMSwgTjNSZWdGcm0sIElJQ19WQklORCwgInZhY2dlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmMzIiLCB2MmkzMiwgdjJmMzIsIGludF9hcm1fbmVvbl92YWNnZWQsIDA+OworZGVmICBWQUNHRXEgICA6IE4zVlFJbnQ8MSwgMCwgMGIwMCwgMGIxMTEwLCAxLCBOM1JlZ0ZybSwgSUlDX1ZCSU5RLCAidmFjZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgImYzMiIsIHY0aTMyLCB2NGYzMiwgaW50X2FybV9uZW9uX3ZhY2dlcSwgMD47CisvLyAgIFZBQ0dUICAgIDogVmVjdG9yIEFic29sdXRlIENvbXBhcmUgR3JlYXRlciBUaGFuIChha2EgVkNBR1QpCitkZWYgIFZBQ0dUZCAgIDogTjNWREludDwxLCAwLCAwYjEwLCAwYjExMTAsIDEsIE4zUmVnRnJtLCBJSUNfVkJJTkQsICJ2YWNndCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZjMyIiwgdjJpMzIsIHYyZjMyLCBpbnRfYXJtX25lb25fdmFjZ3RkLCAwPjsKK2RlZiAgVkFDR1RxICAgOiBOM1ZRSW50PDEsIDAsIDBiMTAsIDBiMTExMCwgMSwgTjNSZWdGcm0sIElJQ19WQklOUSwgInZhY2d0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmMzIiLCB2NGkzMiwgdjRmMzIsIGludF9hcm1fbmVvbl92YWNndHEsIDA+OworLy8gICBWVFNUICAgICA6IFZlY3RvciBUZXN0IEJpdHMKK2RlZm0gVlRTVCAgICAgOiBOM1ZfUUhTPDAsIDAsIDBiMTAwMCwgMSwgSUlDX1ZCSU5pNEQsIElJQ19WQklOaTRELCBJSUNfVkJJTmk0USwgCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVkJJTmk0USwgInZ0c3QiLCAiIiwgTkVPTnZ0c3QsIDE+OworCisvLyBWZWN0b3IgQml0d2lzZSBPcGVyYXRpb25zLgorCitkZWYgdm5vdGQgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLAorICAgICAgICAgICAgICAgICAgICAoeG9yIG5vZGU6JGluLCAoYml0Y29udmVydCAodjhpOCBORU9OaW1tQWxsT25lc1YpKSk+OworZGVmIHZub3RxIDogUGF0RnJhZzwob3BzIG5vZGU6JGluKSwKKyAgICAgICAgICAgICAgICAgICAgKHhvciBub2RlOiRpbiwgKGJpdGNvbnZlcnQgKHYxNmk4IE5FT05pbW1BbGxPbmVzVikpKT47CisKKworLy8gICBWQU5EICAgICA6IFZlY3RvciBCaXR3aXNlIEFORAorZGVmICBWQU5EZCAgICA6IE4zVkRYPDAsIDAsIDBiMDAsIDBiMDAwMSwgMSwgSUlDX1ZCSU5pRCwgInZhbmQiLAorICAgICAgICAgICAgICAgICAgICAgIHYyaTMyLCB2MmkzMiwgYW5kLCAxPjsKK2RlZiAgVkFORHEgICAgOiBOM1ZRWDwwLCAwLCAwYjAwLCAwYjAwMDEsIDEsIElJQ19WQklOaVEsICJ2YW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICB2NGkzMiwgdjRpMzIsIGFuZCwgMT47CisKKy8vICAgVkVPUiAgICAgOiBWZWN0b3IgQml0d2lzZSBFeGNsdXNpdmUgT1IKK2RlZiAgVkVPUmQgICAgOiBOM1ZEWDwxLCAwLCAwYjAwLCAwYjAwMDEsIDEsIElJQ19WQklOaUQsICJ2ZW9yIiwKKyAgICAgICAgICAgICAgICAgICAgICB2MmkzMiwgdjJpMzIsIHhvciwgMT47CitkZWYgIFZFT1JxICAgIDogTjNWUVg8MSwgMCwgMGIwMCwgMGIwMDAxLCAxLCBJSUNfVkJJTmlRLCAidmVvciIsCisgICAgICAgICAgICAgICAgICAgICAgdjRpMzIsIHY0aTMyLCB4b3IsIDE+OworCisvLyAgIFZPUlIgICAgIDogVmVjdG9yIEJpdHdpc2UgT1IKK2RlZiAgVk9SUmQgICAgOiBOM1ZEWDwwLCAwLCAwYjEwLCAwYjAwMDEsIDEsIElJQ19WQklOaUQsICJ2b3JyIiwKKyAgICAgICAgICAgICAgICAgICAgICB2MmkzMiwgdjJpMzIsIG9yLCAxPjsKK2RlZiAgVk9SUnEgICAgOiBOM1ZRWDwwLCAwLCAwYjEwLCAwYjAwMDEsIDEsIElJQ19WQklOaVEsICJ2b3JyIiwKKyAgICAgICAgICAgICAgICAgICAgICB2NGkzMiwgdjRpMzIsIG9yLCAxPjsKKworLy8gICBWQklDICAgICA6IFZlY3RvciBCaXR3aXNlIEJpdCBDbGVhciAoQU5EIE5PVCkKK2RlZiAgVkJJQ2QgICAgOiBOM1ZYPDAsIDAsIDBiMDEsIDBiMDAwMSwgMCwgMSwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgKGlucyBEUFI6JHNyYzEsIERQUjokc3JjMiksIE4zUmVnRnJtLCBJSUNfVkJJTmlELAorICAgICAgICAgICAgICAgICAgICAgInZiaWMiLCAiJGRzdCwgJHNyYzEsICRzcmMyIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKHYyaTMyIChhbmQgRFBSOiRzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2bm90ZCBEUFI6JHNyYzIpKSkpXT47CitkZWYgIFZCSUNxICAgIDogTjNWWDwwLCAwLCAwYjAxLCAwYjAwMDEsIDEsIDEsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbnMgUVBSOiRzcmMxLCBRUFI6JHNyYzIpLCBOM1JlZ0ZybSwgSUlDX1ZCSU5pUSwKKyAgICAgICAgICAgICAgICAgICAgICJ2YmljIiwgIiRkc3QsICRzcmMxLCAkc3JjMiIsICIiLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUVBSOiRkc3QsICh2NGkzMiAoYW5kIFFQUjokc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm5vdHEgUVBSOiRzcmMyKSkpKV0+OworCisvLyAgIFZPUk4gICAgIDogVmVjdG9yIEJpdHdpc2UgT1IgTk9UCitkZWYgIFZPUk5kICAgIDogTjNWWDwwLCAwLCAwYjExLCAwYjAwMDEsIDAsIDEsIChvdXRzIERQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbnMgRFBSOiRzcmMxLCBEUFI6JHNyYzIpLCBOM1JlZ0ZybSwgSUlDX1ZCSU5pRCwKKyAgICAgICAgICAgICAgICAgICAgICJ2b3JuIiwgIiRkc3QsICRzcmMxLCAkc3JjMiIsICIiLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2MmkzMiAob3IgRFBSOiRzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZub3RkIERQUjokc3JjMikpKSldPjsKK2RlZiAgVk9STnEgICAgOiBOM1ZYPDAsIDAsIDBiMTEsIDBiMDAwMSwgMSwgMSwgKG91dHMgUVBSOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgKGlucyBRUFI6JHNyYzEsIFFQUjokc3JjMiksIE4zUmVnRnJtLCBJSUNfVkJJTmlRLAorICAgICAgICAgICAgICAgICAgICAgInZvcm4iLCAiJGRzdCwgJHNyYzEsICRzcmMyIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHY0aTMyIChvciBRUFI6JHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm5vdHEgUVBSOiRzcmMyKSkpKV0+OworCisvLyAgIFZNVk4gICAgIDogVmVjdG9yIEJpdHdpc2UgTk9UIChJbW1lZGlhdGUpCisKK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluIHsKK2RlZiBWTVZOdjRpMTYgOiBOMU1vZEltbTwxLCAwYjAwMCwgezEsMCw/LDB9LCAwLCAwLCAxLCAxLCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBuTW9kSW1tOiRTSU1NKSwgSUlDX1ZNT1ZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgInZtdm4iLCAiaTE2IiwgIiRkc3QsICRTSU1NIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2NGkxNiAoTkVPTnZtdm5JbW0gdGltbTokU0lNTSkpKV0+OworZGVmIFZNVk52OGkxNiA6IE4xTW9kSW1tPDEsIDBiMDAwLCB7MSwwLD8sMH0sIDAsIDEsIDEsIDEsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIG5Nb2RJbW06JFNJTU0pLCBJSUNfVk1PVkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidm12biIsICJpMTYiLCAiJGRzdCwgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHY4aTE2IChORU9Odm12bkltbSB0aW1tOiRTSU1NKSkpXT47CisKK2RlZiBWTVZOdjJpMzIgOiBOMU1vZEltbTwxLCAwYjAwMCwgez8sPyw/LD99LCAwLCAwLCAxLCAxLCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBuTW9kSW1tOiRTSU1NKSwgSUlDX1ZNT1ZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgInZtdm4iLCAiaTMyIiwgIiRkc3QsICRTSU1NIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2MmkzMiAoTkVPTnZtdm5JbW0gdGltbTokU0lNTSkpKV0+OworZGVmIFZNVk52NGkzMiA6IE4xTW9kSW1tPDEsIDBiMDAwLCB7Pyw/LD8sP30sIDAsIDEsIDEsIDEsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIG5Nb2RJbW06JFNJTU0pLCBJSUNfVk1PVkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidm12biIsICJpMzIiLCAiJGRzdCwgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHY0aTMyIChORU9Odm12bkltbSB0aW1tOiRTSU1NKSkpXT47Cit9CisKKy8vICAgVk1WTiAgICAgOiBWZWN0b3IgQml0d2lzZSBOT1QKK2RlZiAgVk1WTmQgICAgOiBOMlZYPDBiMTEsIDBiMTEsIDBiMDAsIDBiMDAsIDBiMDEwMTEsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRzcmMpLCBJSUNfVlNVQmlELAorICAgICAgICAgICAgICAgICAgICAgInZtdm4iLCAiJGRzdCwgJHNyYyIsICIiLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2MmkzMiAodm5vdGQgRFBSOiRzcmMpKSldPjsKK2RlZiAgVk1WTnEgICAgOiBOMlZYPDBiMTEsIDBiMTEsIDBiMDAsIDBiMDAsIDBiMDEwMTEsIDEsIDAsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBRUFI6JGRzdCksIChpbnMgUVBSOiRzcmMpLCBJSUNfVlNVQmlELAorICAgICAgICAgICAgICAgICAgICAgInZtdm4iLCAiJGRzdCwgJHNyYyIsICIiLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUVBSOiRkc3QsICh2NGkzMiAodm5vdHEgUVBSOiRzcmMpKSldPjsKK2RlZiA6IFBhdDwodjJpMzIgKHZub3RkIERQUjokc3JjKSksIChWTVZOZCBEUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAodm5vdHEgUVBSOiRzcmMpKSwgKFZNVk5xIFFQUjokc3JjKT47CisKKy8vICAgVkJTTCAgICAgOiBWZWN0b3IgQml0d2lzZSBTZWxlY3QKK2RlZiAgVkJTTGQgICAgOiBOM1ZYPDEsIDAsIDBiMDEsIDBiMDAwMSwgMCwgMSwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgKGlucyBEUFI6JHNyYzEsIERQUjokc3JjMiwgRFBSOiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgIE4zUmVnRnJtLCBJSUNfVkNOVGlELAorICAgICAgICAgICAgICAgICAgICAgInZic2wiLCAiJGRzdCwgJHNyYzIsICRzcmMzIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHYyaTMyIChvciAoYW5kIERQUjokc3JjMiwgRFBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIERQUjokc3JjMywgKHZub3RkIERQUjokc3JjMSkpKSkpXT47CitkZWYgIFZCU0xxICAgIDogTjNWWDwxLCAwLCAwYjAxLCAwYjAwMDEsIDEsIDEsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbnMgUVBSOiRzcmMxLCBRUFI6JHNyYzIsIFFQUjokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICBOM1JlZ0ZybSwgSUlDX1ZDTlRpUSwKKyAgICAgICAgICAgICAgICAgICAgICJ2YnNsIiwgIiRkc3QsICRzcmMyLCAkc3JjMyIsICIkc3JjMSA9ICRkc3QiLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUVBSOiRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAob3IgKGFuZCBRUFI6JHNyYzIsIFFQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBRUFI6JHNyYzMsICh2bm90cSBRUFI6JHNyYzEpKSkpKV0+OworCisvLyAgIFZCSUYgICAgIDogVmVjdG9yIEJpdHdpc2UgSW5zZXJ0IGlmIEZhbHNlCisvLyAgICAgICAgICAgICAgbGlrZSBWQlNMIGJ1dCB3aXRoOiAidmJpZiAkZHN0LCAkc3JjMywgJHNyYzEiLCAiJHNyYzIgPSAkZHN0IiwKK2RlZiAgVkJJRmQgICAgOiBOM1ZYPDEsIDAsIDBiMTEsIDBiMDAwMSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JHNyYzEsIERQUjokc3JjMiwgRFBSOiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgIE4zUmVnRnJtLCBJSUNfVkJJTmlELAorICAgICAgICAgICAgICAgICAgICAgInZiaWYiLCAiJGRzdCwgJHNyYzIsICRzcmMzIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+OworZGVmICBWQklGcSAgICA6IE4zVlg8MSwgMCwgMGIxMSwgMGIwMDAxLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgUVBSOiRkc3QpLCAoaW5zIFFQUjokc3JjMSwgUVBSOiRzcmMyLCBRUFI6JHNyYzMpLAorICAgICAgICAgICAgICAgICAgICAgTjNSZWdGcm0sIElJQ19WQklOaVEsCisgICAgICAgICAgICAgICAgICAgICAidmJpZiIsICIkZHN0LCAkc3JjMiwgJHNyYzMiLCAiJHNyYzEgPSAkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT47CisKKy8vICAgVkJJVCAgICAgOiBWZWN0b3IgQml0d2lzZSBJbnNlcnQgaWYgVHJ1ZQorLy8gICAgICAgICAgICAgIGxpa2UgVkJTTCBidXQgd2l0aDogInZiaXQgJGRzdCwgJHNyYzIsICRzcmMxIiwgIiRzcmMzID0gJGRzdCIsCitkZWYgIFZCSVRkICAgIDogTjNWWDwxLCAwLCAwYjEwLCAwYjAwMDEsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRzcmMxLCBEUFI6JHNyYzIsIERQUjokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICBOM1JlZ0ZybSwgSUlDX1ZCSU5pRCwKKyAgICAgICAgICAgICAgICAgICAgICJ2Yml0IiwgIiRkc3QsICRzcmMyLCAkc3JjMyIsICIkc3JjMSA9ICRkc3QiLAorICAgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsKK2RlZiAgVkJJVHEgICAgOiBOM1ZYPDEsIDAsIDBiMTAsIDBiMDAwMSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIFFQUjokZHN0KSwgKGlucyBRUFI6JHNyYzEsIFFQUjokc3JjMiwgUVBSOiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgIE4zUmVnRnJtLCBJSUNfVkJJTmlRLAorICAgICAgICAgICAgICAgICAgICAgInZiaXQiLCAiJGRzdCwgJHNyYzIsICRzcmMzIiwgIiRzcmMxID0gJGRzdCIsCisgICAgICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+OworCisvLyBWQklUL1ZCSUYgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuICBUaGUgVHdvQWRkcmVzcyBwYXNzIHdpbGwgbm90IGdvIGxvb2tpbmcKKy8vIGZvciBlcXVpdmFsZW50IG9wZXJhdGlvbnMgd2l0aCBkaWZmZXJlbnQgcmVnaXN0ZXIgY29uc3RyYWludHM7IGl0IGp1c3QKKy8vIGluc2VydHMgY29waWVzLgorCisvLyBWZWN0b3IgQWJzb2x1dGUgRGlmZmVyZW5jZXMuCisKKy8vICAgVkFCRCAgICAgOiBWZWN0b3IgQWJzb2x1dGUgRGlmZmVyZW5jZQorZGVmbSBWQUJEcyAgICA6IE4zVkludF9RSFM8MCwgMCwgMGIwMTExLCAwLCBOM1JlZ0ZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNFEsIElJQ19WU1VCaTRRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhYmQiLCAicyIsIGludF9hcm1fbmVvbl92YWJkcywgMD47CitkZWZtIFZBQkR1ICAgIDogTjNWSW50X1FIUzwxLCAwLCAwYjAxMTEsIDAsIE4zUmVnRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZTVUJpNEQsIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0USwgSUlDX1ZTVUJpNFEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFiZCIsICJ1IiwgaW50X2FybV9uZW9uX3ZhYmR1LCAwPjsKK2RlZiAgVkFCRGZkICAgOiBOM1ZESW50PDEsIDAsIDBiMTAsIDBiMTEwMSwgMCwgTjNSZWdGcm0sIElJQ19WQklORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2YWJkIiwgImYzMiIsIHYyZjMyLCB2MmYzMiwgaW50X2FybV9uZW9uX3ZhYmRzLCAwPjsKK2RlZiAgVkFCRGZxICAgOiBOM1ZRSW50PDEsIDAsIDBiMTAsIDBiMTEwMSwgMCwgTjNSZWdGcm0sIElJQ19WQklOUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2YWJkIiwgImYzMiIsIHY0ZjMyLCB2NGYzMiwgaW50X2FybV9uZW9uX3ZhYmRzLCAwPjsKKworLy8gICBWQUJETCAgICA6IFZlY3RvciBBYnNvbHV0ZSBEaWZmZXJlbmNlIExvbmcgKFEgPSB8IEQgLSBEIHwpCitkZWZtIFZBQkRMcyAgIDogTjNWTEludF9RSFM8MCwxLDBiMDExMSwwLCBJSUNfVlNVQmk0USwgSUlDX1ZTVUJpNFEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhYmRsIiwgInMiLCBpbnRfYXJtX25lb25fdmFiZGxzLCAwPjsKK2RlZm0gVkFCREx1ICAgOiBOM1ZMSW50X1FIUzwxLDEsMGIwMTExLDAsIElJQ19WU1VCaTRRLCBJSUNfVlNVQmk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhYmRsIiwgInUiLCBpbnRfYXJtX25lb25fdmFiZGx1LCAwPjsKKworLy8gICBWQUJBICAgICA6IFZlY3RvciBBYnNvbHV0ZSBEaWZmZXJlbmNlIGFuZCBBY2N1bXVsYXRlCitkZWZtIFZBQkFzICAgIDogTjNWSW50M19RSFM8MCwwLDBiMDExMSwxLCBJSUNfVkFCQUQsIElJQ19WQUJBUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFiYSIsICJzIiwgaW50X2FybV9uZW9uX3ZhYmFzPjsKK2RlZm0gVkFCQXUgICAgOiBOM1ZJbnQzX1FIUzwxLDAsMGIwMTExLDEsIElJQ19WQUJBRCwgSUlDX1ZBQkFRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWJhIiwgInUiLCBpbnRfYXJtX25lb25fdmFiYXU+OworCisvLyAgIFZBQkFMICAgIDogVmVjdG9yIEFic29sdXRlIERpZmZlcmVuY2UgYW5kIEFjY3VtdWxhdGUgTG9uZyAoUSArPSB8IEQgLSBEIHwpCitkZWZtIFZBQkFMcyAgIDogTjNWTEludDNfUUhTPDAsMSwwYjAxMDEsMCwgSUlDX1ZBQkFELCBJSUNfVkFCQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWJhbCIsICJzIiwgaW50X2FybV9uZW9uX3ZhYmFscz47CitkZWZtIFZBQkFMdSAgIDogTjNWTEludDNfUUhTPDEsMSwwYjAxMDEsMCwgSUlDX1ZBQkFELCBJSUNfVkFCQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWJhbCIsICJ1IiwgaW50X2FybV9uZW9uX3ZhYmFsdT47CisKKy8vIFZlY3RvciBNYXhpbXVtIGFuZCBNaW5pbXVtLgorCisvLyAgIFZNQVggICAgIDogVmVjdG9yIE1heGltdW0KK2RlZm0gVk1BWHMgICAgOiBOM1ZJbnRfUUhTPDAsIDAsIDBiMDExMCwgMCwgTjNSZWdGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNEQsIElJQ19WU1VCaTRRLCBJSUNfVlNVQmk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bWF4IiwgInMiLCBpbnRfYXJtX25lb25fdm1heHMsIDE+OworZGVmbSBWTUFYdSAgICA6IE4zVkludF9RSFM8MSwgMCwgMGIwMTEwLCAwLCBOM1JlZ0ZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNFEsIElJQ19WU1VCaTRRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZtYXgiLCAidSIsIGludF9hcm1fbmVvbl92bWF4dSwgMT47CitkZWYgIFZNQVhmZCAgIDogTjNWREludDwwLCAwLCAwYjAwLCAwYjExMTEsIDAsIE4zUmVnRnJtLCBJSUNfVkJJTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAidm1heCIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjJmMzIsIHYyZjMyLCBpbnRfYXJtX25lb25fdm1heHMsIDE+OworZGVmICBWTUFYZnEgICA6IE4zVlFJbnQ8MCwgMCwgMGIwMCwgMGIxMTExLCAwLCBOM1JlZ0ZybSwgSUlDX1ZCSU5RLAorICAgICAgICAgICAgICAgICAgICAgICAgInZtYXgiLCAiZjMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY0ZjMyLCB2NGYzMiwgaW50X2FybV9uZW9uX3ZtYXhzLCAxPjsKKworLy8gICBWTUlOICAgICA6IFZlY3RvciBNaW5pbXVtCitkZWZtIFZNSU5zICAgIDogTjNWSW50X1FIUzwwLCAwLCAwYjAxMTAsIDEsIE4zUmVnRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZTVUJpNEQsIElJQ19WU1VCaTRELCBJSUNfVlNVQmk0USwgSUlDX1ZTVUJpNFEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidm1pbiIsICJzIiwgaW50X2FybV9uZW9uX3ZtaW5zLCAxPjsKK2RlZm0gVk1JTnUgICAgOiBOM1ZJbnRfUUhTPDEsIDAsIDBiMDExMCwgMSwgTjNSZWdGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNVQmk0RCwgSUlDX1ZTVUJpNEQsIElJQ19WU1VCaTRRLCBJSUNfVlNVQmk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bWluIiwgInUiLCBpbnRfYXJtX25lb25fdm1pbnUsIDE+OworZGVmICBWTUlOZmQgICA6IE4zVkRJbnQ8MCwgMCwgMGIxMCwgMGIxMTExLCAwLCBOM1JlZ0ZybSwgSUlDX1ZCSU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgInZtaW4iLCAiZjMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHYyZjMyLCB2MmYzMiwgaW50X2FybV9uZW9uX3ZtaW5zLCAxPjsKK2RlZiAgVk1JTmZxICAgOiBOM1ZRSW50PDAsIDAsIDBiMTAsIDBiMTExMSwgMCwgTjNSZWdGcm0sIElJQ19WQklOUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2bWluIiwgImYzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjRmMzIsIGludF9hcm1fbmVvbl92bWlucywgMT47CisKKy8vIFZlY3RvciBQYWlyd2lzZSBPcGVyYXRpb25zLgorCisvLyAgIFZQQUREICAgIDogVmVjdG9yIFBhaXJ3aXNlIEFkZAorZGVmICBWUEFERGk4ICA6IE4zVkRJbnQ8MCwgMCwgMGIwMCwgMGIxMDExLCAxLCBOM1JlZ0ZybSwgSUlDX1ZTSExpRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2cGFkZCIsICJpOCIsCisgICAgICAgICAgICAgICAgICAgICAgICB2OGk4LCB2OGk4LCBpbnRfYXJtX25lb25fdnBhZGQsIDA+OworZGVmICBWUEFERGkxNiA6IE4zVkRJbnQ8MCwgMCwgMGIwMSwgMGIxMDExLCAxLCBOM1JlZ0ZybSwgSUlDX1ZTSExpRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2cGFkZCIsICJpMTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjRpMTYsIHY0aTE2LCBpbnRfYXJtX25lb25fdnBhZGQsIDA+OworZGVmICBWUEFERGkzMiA6IE4zVkRJbnQ8MCwgMCwgMGIxMCwgMGIxMDExLCAxLCBOM1JlZ0ZybSwgSUlDX1ZTSExpRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2cGFkZCIsICJpMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjJpMzIsIHYyaTMyLCBpbnRfYXJtX25lb25fdnBhZGQsIDA+OworZGVmICBWUEFERGYgICA6IE4zVkRJbnQ8MSwgMCwgMGIwMCwgMGIxMTAxLCAwLCBOM1JlZ0ZybSwgCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVkJJTkQsICJ2cGFkZCIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjJmMzIsIHYyZjMyLCBpbnRfYXJtX25lb25fdnBhZGQsIDA+OworCisvLyAgIFZQQURETCAgIDogVmVjdG9yIFBhaXJ3aXNlIEFkZCBMb25nCitkZWZtIFZQQURETHMgIDogTjJWUExJbnRfUUhTPDBiMTEsIDBiMTEsIDBiMDAsIDBiMDAxMDAsIDAsICJ2cGFkZGwiLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9hcm1fbmVvbl92cGFkZGxzPjsKK2RlZm0gVlBBRERMdSAgOiBOMlZQTEludF9RSFM8MGIxMSwgMGIxMSwgMGIwMCwgMGIwMDEwMSwgMCwgInZwYWRkbCIsICJ1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X2FybV9uZW9uX3ZwYWRkbHU+OworCisvLyAgIFZQQURBTCAgIDogVmVjdG9yIFBhaXJ3aXNlIEFkZCBhbmQgQWNjdW11bGF0ZSBMb25nCitkZWZtIFZQQURBTHMgIDogTjJWUExJbnQyX1FIUzwwYjExLCAwYjExLCAwYjAwLCAwYjAxMTAwLCAwLCAidnBhZGFsIiwgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X2FybV9uZW9uX3ZwYWRhbHM+OworZGVmbSBWUEFEQUx1ICA6IE4yVlBMSW50Ml9RSFM8MGIxMSwgMGIxMSwgMGIwMCwgMGIwMTEwMSwgMCwgInZwYWRhbCIsICJ1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9hcm1fbmVvbl92cGFkYWx1PjsKKworLy8gICBWUE1BWCAgICA6IFZlY3RvciBQYWlyd2lzZSBNYXhpbXVtCitkZWYgIFZQTUFYczggIDogTjNWREludDwwLCAwLCAwYjAwLCAwYjEwMTAsIDAsIE4zUmVnRnJtLCBJSUNfVlNVQmk0RCwgInZwbWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzOCIsIHY4aTgsIHY4aTgsIGludF9hcm1fbmVvbl92cG1heHMsIDA+OworZGVmICBWUE1BWHMxNiA6IE4zVkRJbnQ8MCwgMCwgMGIwMSwgMGIxMDEwLCAwLCBOM1JlZ0ZybSwgSUlDX1ZTVUJpNEQsICJ2cG1heCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiczE2IiwgdjRpMTYsIHY0aTE2LCBpbnRfYXJtX25lb25fdnBtYXhzLCAwPjsKK2RlZiAgVlBNQVhzMzIgOiBOM1ZESW50PDAsIDAsIDBiMTAsIDBiMTAxMCwgMCwgTjNSZWdGcm0sIElJQ19WU1VCaTRELCAidnBtYXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgInMzMiIsIHYyaTMyLCB2MmkzMiwgaW50X2FybV9uZW9uX3ZwbWF4cywgMD47CitkZWYgIFZQTUFYdTggIDogTjNWREludDwxLCAwLCAwYjAwLCAwYjEwMTAsIDAsIE4zUmVnRnJtLCBJSUNfVlNVQmk0RCwgInZwbWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1OCIsIHY4aTgsIHY4aTgsIGludF9hcm1fbmVvbl92cG1heHUsIDA+OworZGVmICBWUE1BWHUxNiA6IE4zVkRJbnQ8MSwgMCwgMGIwMSwgMGIxMDEwLCAwLCBOM1JlZ0ZybSwgSUlDX1ZTVUJpNEQsICJ2cG1heCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidTE2IiwgdjRpMTYsIHY0aTE2LCBpbnRfYXJtX25lb25fdnBtYXh1LCAwPjsKK2RlZiAgVlBNQVh1MzIgOiBOM1ZESW50PDEsIDAsIDBiMTAsIDBiMTAxMCwgMCwgTjNSZWdGcm0sIElJQ19WU1VCaTRELCAidnBtYXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgInUzMiIsIHYyaTMyLCB2MmkzMiwgaW50X2FybV9uZW9uX3ZwbWF4dSwgMD47CitkZWYgIFZQTUFYZiAgIDogTjNWREludDwxLCAwLCAwYjAwLCAwYjExMTEsIDAsIE4zUmVnRnJtLCBJSUNfVlNVQmk0RCwgInZwbWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmMzIiLCB2MmYzMiwgdjJmMzIsIGludF9hcm1fbmVvbl92cG1heHMsIDA+OworCisvLyAgIFZQTUlOICAgIDogVmVjdG9yIFBhaXJ3aXNlIE1pbmltdW0KK2RlZiAgVlBNSU5zOCAgOiBOM1ZESW50PDAsIDAsIDBiMDAsIDBiMTAxMCwgMSwgTjNSZWdGcm0sIElJQ19WU1VCaTRELCAidnBtaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgInM4IiwgdjhpOCwgdjhpOCwgaW50X2FybV9uZW9uX3ZwbWlucywgMD47CitkZWYgIFZQTUlOczE2IDogTjNWREludDwwLCAwLCAwYjAxLCAwYjEwMTAsIDEsIE4zUmVnRnJtLCBJSUNfVlNVQmk0RCwgInZwbWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzMTYiLCB2NGkxNiwgdjRpMTYsIGludF9hcm1fbmVvbl92cG1pbnMsIDA+OworZGVmICBWUE1JTnMzMiA6IE4zVkRJbnQ8MCwgMCwgMGIxMCwgMGIxMDEwLCAxLCBOM1JlZ0ZybSwgSUlDX1ZTVUJpNEQsICJ2cG1pbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiczMyIiwgdjJpMzIsIHYyaTMyLCBpbnRfYXJtX25lb25fdnBtaW5zLCAwPjsKK2RlZiAgVlBNSU51OCAgOiBOM1ZESW50PDEsIDAsIDBiMDAsIDBiMTAxMCwgMSwgTjNSZWdGcm0sIElJQ19WU1VCaTRELCAidnBtaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgInU4IiwgdjhpOCwgdjhpOCwgaW50X2FybV9uZW9uX3ZwbWludSwgMD47CitkZWYgIFZQTUlOdTE2IDogTjNWREludDwxLCAwLCAwYjAxLCAwYjEwMTAsIDEsIE4zUmVnRnJtLCBJSUNfVlNVQmk0RCwgInZwbWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1MTYiLCB2NGkxNiwgdjRpMTYsIGludF9hcm1fbmVvbl92cG1pbnUsIDA+OworZGVmICBWUE1JTnUzMiA6IE4zVkRJbnQ8MSwgMCwgMGIxMCwgMGIxMDEwLCAxLCBOM1JlZ0ZybSwgSUlDX1ZTVUJpNEQsICJ2cG1pbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidTMyIiwgdjJpMzIsIHYyaTMyLCBpbnRfYXJtX25lb25fdnBtaW51LCAwPjsKK2RlZiAgVlBNSU5mICAgOiBOM1ZESW50PDEsIDAsIDBiMTAsIDBiMTExMSwgMCwgTjNSZWdGcm0sIElJQ19WU1VCaTRELCAidnBtaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgImYzMiIsIHYyZjMyLCB2MmYzMiwgaW50X2FybV9uZW9uX3ZwbWlucywgMD47CisKKy8vIFZlY3RvciBSZWNpcHJvY2FsIGFuZCBSZWNpcHJvY2FsIFNxdWFyZSBSb290IEVzdGltYXRlIGFuZCBTdGVwLgorCisvLyAgIFZSRUNQRSAgIDogVmVjdG9yIFJlY2lwcm9jYWwgRXN0aW1hdGUKK2RlZiAgVlJFQ1BFZCAgOiBOMlZESW50PDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDEwMDAsIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZVTkFELCAidnJlY3BlIiwgInUzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2MmkzMiwgdjJpMzIsIGludF9hcm1fbmVvbl92cmVjcGU+OworZGVmICBWUkVDUEVxICA6IE4yVlFJbnQ8MGIxMSwgMGIxMSwgMGIxMCwgMGIxMSwgMGIwMTAwMCwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlVOQVEsICJ2cmVjcGUiLCAidTMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY0aTMyLCB2NGkzMiwgaW50X2FybV9uZW9uX3ZyZWNwZT47CitkZWYgIFZSRUNQRWZkIDogTjJWREludDwwYjExLCAwYjExLCAwYjEwLCAwYjExLCAwYjAxMDEwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZVTkFELCAidnJlY3BlIiwgImYzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2MmYzMiwgdjJmMzIsIGludF9hcm1fbmVvbl92cmVjcGU+OworZGVmICBWUkVDUEVmcSA6IE4yVlFJbnQ8MGIxMSwgMGIxMSwgMGIxMCwgMGIxMSwgMGIwMTAxMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WVU5BUSwgInZyZWNwZSIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjRmMzIsIHY0ZjMyLCBpbnRfYXJtX25lb25fdnJlY3BlPjsKKworLy8gICBWUkVDUFMgICA6IFZlY3RvciBSZWNpcHJvY2FsIFN0ZXAKK2RlZiAgVlJFQ1BTZmQgOiBOM1ZESW50PDAsIDAsIDBiMDAsIDBiMTExMSwgMSwgTjNSZWdGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlJFQ1NELCAidnJlY3BzIiwgImYzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2MmYzMiwgdjJmMzIsIGludF9hcm1fbmVvbl92cmVjcHMsIDE+OworZGVmICBWUkVDUFNmcSA6IE4zVlFJbnQ8MCwgMCwgMGIwMCwgMGIxMTExLCAxLCBOM1JlZ0ZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WUkVDU1EsICJ2cmVjcHMiLCAiZjMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY0ZjMyLCB2NGYzMiwgaW50X2FybV9uZW9uX3ZyZWNwcywgMT47CisKKy8vICAgVlJTUVJURSAgOiBWZWN0b3IgUmVjaXByb2NhbCBTcXVhcmUgUm9vdCBFc3RpbWF0ZQorZGVmICBWUlNRUlRFZCAgOiBOMlZESW50PDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDEwMDEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZVTkFELCAidnJzcXJ0ZSIsICJ1MzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHYyaTMyLCB2MmkzMiwgaW50X2FybV9uZW9uX3Zyc3FydGU+OworZGVmICBWUlNRUlRFcSAgOiBOMlZRSW50PDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDEwMDEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZVTkFRLCAidnJzcXJ0ZSIsICJ1MzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHY0aTMyLCB2NGkzMiwgaW50X2FybV9uZW9uX3Zyc3FydGU+OworZGVmICBWUlNRUlRFZmQgOiBOMlZESW50PDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDEwMTEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZVTkFELCAidnJzcXJ0ZSIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHYyZjMyLCB2MmYzMiwgaW50X2FybV9uZW9uX3Zyc3FydGU+OworZGVmICBWUlNRUlRFZnEgOiBOMlZRSW50PDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDEwMTEsIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WVU5BUSwgInZyc3FydGUiLCAiZjMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjRmMzIsIGludF9hcm1fbmVvbl92cnNxcnRlPjsKKworLy8gICBWUlNRUlRTICA6IFZlY3RvciBSZWNpcHJvY2FsIFNxdWFyZSBSb290IFN0ZXAKK2RlZiBWUlNRUlRTZmQgOiBOM1ZESW50PDAsIDAsIDBiMTAsIDBiMTExMSwgMSwgTjNSZWdGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlJFQ1NELCAidnJzcXJ0cyIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjJmMzIsIHYyZjMyLCBpbnRfYXJtX25lb25fdnJzcXJ0cywgMT47CitkZWYgVlJTUVJUU2ZxIDogTjNWUUludDwwLCAwLCAwYjEwLCAwYjExMTEsIDEsIE4zUmVnRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZSRUNTUSwgInZyc3FydHMiLCAiZjMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY0ZjMyLCB2NGYzMiwgaW50X2FybV9uZW9uX3Zyc3FydHMsIDE+OworCisvLyBWZWN0b3IgU2hpZnRzLgorCisvLyAgIFZTSEwgICAgIDogVmVjdG9yIFNoaWZ0CitkZWZtIFZTSExzICAgIDogTjNWSW50X1FIU0Q8MCwgMCwgMGIwMTAwLCAwLCBOM1JlZ1ZTaEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNITGlELCBJSUNfVlNITGlELCBJSUNfVlNITGlRLCBJSUNfVlNITGlRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2hsIiwgInMiLCBpbnRfYXJtX25lb25fdnNoaWZ0cywgMD47CitkZWZtIFZTSEx1ICAgIDogTjNWSW50X1FIU0Q8MSwgMCwgMGIwMTAwLCAwLCBOM1JlZ1ZTaEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNITGlELCBJSUNfVlNITGlELCBJSUNfVlNITGlRLCBJSUNfVlNITGlRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2hsIiwgInUiLCBpbnRfYXJtX25lb25fdnNoaWZ0dSwgMD47CisvLyAgIFZTSEwgICAgIDogVmVjdG9yIFNoaWZ0IExlZnQgKEltbWVkaWF0ZSkKK2RlZm0gVlNITGkgICAgOiBOMlZTaF9RSFNEPDAsIDEsIDBiMDEwMSwgMSwgSUlDX1ZTSExpRCwgInZzaGwiLCAiaSIsIE5FT052c2hsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTjJSZWdWU2hMRnJtPjsKKy8vICAgVlNIUiAgICAgOiBWZWN0b3IgU2hpZnQgUmlnaHQgKEltbWVkaWF0ZSkKK2RlZm0gVlNIUnMgICAgOiBOMlZTaF9RSFNEPDAsIDEsIDBiMDAwMCwgMSwgSUlDX1ZTSExpRCwgInZzaHIiLCAicyIsIE5FT052c2hycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE4yUmVnVlNoUkZybT47CitkZWZtIFZTSFJ1ICAgIDogTjJWU2hfUUhTRDwxLCAxLCAwYjAwMDAsIDEsIElJQ19WU0hMaUQsICJ2c2hyIiwgInUiLCBORU9OdnNocnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOMlJlZ1ZTaFJGcm0+OworCisvLyAgIFZTSExMICAgIDogVmVjdG9yIFNoaWZ0IExlZnQgTG9uZworZGVmbSBWU0hMTHMgICA6IE4yVkxTaF9RSFM8MCwgMSwgMGIxMDEwLCAwLCAwLCAxLCAidnNobGwiLCAicyIsIE5FT052c2hsbHM+OworZGVmbSBWU0hMTHUgICA6IE4yVkxTaF9RSFM8MSwgMSwgMGIxMDEwLCAwLCAwLCAxLCAidnNobGwiLCAidSIsIE5FT052c2hsbHU+OworCisvLyAgIFZTSExMICAgIDogVmVjdG9yIFNoaWZ0IExlZnQgTG9uZyAod2l0aCBtYXhpbXVtIHNoaWZ0IGNvdW50KQorY2xhc3MgTjJWTFNoTWF4PGJpdCBvcDI0LCBiaXQgb3AyMywgYml0czw2PiBvcDIxXzE2LCBiaXRzPDQ+IG9wMTFfOCwgYml0IG9wNywKKyAgICAgICAgICAgICAgICBiaXQgb3A2LCBiaXQgb3A0LCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBSZXNUeSwKKyAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgT3BUeSwgU0ROb2RlIE9wTm9kZT4KKyAgOiBOMlZMU2g8b3AyNCwgb3AyMywgb3AxMV84LCBvcDcsIG9wNiwgb3A0LCBPcGNvZGVTdHIsIER0LAorICAgICAgICAgICBSZXNUeSwgT3BUeSwgT3BOb2RlPiB7CisgIGxldCBJbnN0ezIxLTE2fSA9IG9wMjFfMTY7Cit9CitkZWYgIFZTSExMaTggIDogTjJWTFNoTWF4PDEsIDEsIDBiMTEwMDEwLCAwYjAwMTEsIDAsIDAsIDAsICJ2c2hsbCIsICJpOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHY4aTE2LCB2OGk4LCBORU9OdnNobGxpPjsKK2RlZiAgVlNITExpMTYgOiBOMlZMU2hNYXg8MSwgMSwgMGIxMTAxMTAsIDBiMDAxMSwgMCwgMCwgMCwgInZzaGxsIiwgImkxNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHY0aTMyLCB2NGkxNiwgTkVPTnZzaGxsaT47CitkZWYgIFZTSExMaTMyIDogTjJWTFNoTWF4PDEsIDEsIDBiMTExMDEwLCAwYjAwMTEsIDAsIDAsIDAsICJ2c2hsbCIsICJpMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2Mmk2NCwgdjJpMzIsIE5FT052c2hsbGk+OworCisvLyAgIFZTSFJOICAgIDogVmVjdG9yIFNoaWZ0IFJpZ2h0IGFuZCBOYXJyb3cKK2RlZm0gVlNIUk4gICAgOiBOMlZOU2hfSFNEPDAsMSwwYjEwMDAsMCwwLDEsIElJQ19WU0hMaUQsICJ2c2hybiIsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FT052c2hybj47CisKKy8vICAgVlJTSEwgICAgOiBWZWN0b3IgUm91bmRpbmcgU2hpZnQKK2RlZm0gVlJTSExzICAgOiBOM1ZJbnRfUUhTRDwwLCAwLCAwYjAxMDEsIDAsIE4zUmVnVlNoRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WU0hMaTRELCBJSUNfVlNITGk0RCwgSUlDX1ZTSExpNFEsIElJQ19WU0hMaTRRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cnNobCIsICJzIiwgaW50X2FybV9uZW9uX3Zyc2hpZnRzLCAwPjsKK2RlZm0gVlJTSEx1ICAgOiBOM1ZJbnRfUUhTRDwxLCAwLCAwYjAxMDEsIDAsIE4zUmVnVlNoRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WU0hMaTRELCBJSUNfVlNITGk0RCwgSUlDX1ZTSExpNFEsIElJQ19WU0hMaTRRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cnNobCIsICJ1IiwgaW50X2FybV9uZW9uX3Zyc2hpZnR1LCAwPjsKKy8vICAgVlJTSFIgICAgOiBWZWN0b3IgUm91bmRpbmcgU2hpZnQgUmlnaHQKK2RlZm0gVlJTSFJzICAgOiBOMlZTaF9RSFNEPDAsMSwwYjAwMTAsMSwgSUlDX1ZTSExpNEQsICJ2cnNociIsICJzIiwgTkVPTnZyc2hycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE4yUmVnVlNoUkZybT47CitkZWZtIFZSU0hSdSAgIDogTjJWU2hfUUhTRDwxLDEsMGIwMDEwLDEsIElJQ19WU0hMaTRELCAidnJzaHIiLCAidSIsIE5FT052cnNocnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOMlJlZ1ZTaFJGcm0+OworCisvLyAgIFZSU0hSTiAgIDogVmVjdG9yIFJvdW5kaW5nIFNoaWZ0IFJpZ2h0IGFuZCBOYXJyb3cKK2RlZm0gVlJTSFJOICAgOiBOMlZOU2hfSFNEPDAsIDEsIDBiMTAwMCwgMCwgMSwgMSwgSUlDX1ZTSExpNEQsICJ2cnNocm4iLCAiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBORU9OdnJzaHJuPjsKKworLy8gICBWUVNITCAgICA6IFZlY3RvciBTYXR1cmF0aW5nIFNoaWZ0CitkZWZtIFZRU0hMcyAgIDogTjNWSW50X1FIU0Q8MCwgMCwgMGIwMTAwLCAxLCBOM1JlZ1ZTaEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNITGk0RCwgSUlDX1ZTSExpNEQsIElJQ19WU0hMaTRRLCBJSUNfVlNITGk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnFzaGwiLCAicyIsIGludF9hcm1fbmVvbl92cXNoaWZ0cywgMD47CitkZWZtIFZRU0hMdSAgIDogTjNWSW50X1FIU0Q8MSwgMCwgMGIwMTAwLCAxLCBOM1JlZ1ZTaEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlNITGk0RCwgSUlDX1ZTSExpNEQsIElJQ19WU0hMaTRRLCBJSUNfVlNITGk0USwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnFzaGwiLCAidSIsIGludF9hcm1fbmVvbl92cXNoaWZ0dSwgMD47CisvLyAgIFZRU0hMICAgIDogVmVjdG9yIFNhdHVyYXRpbmcgU2hpZnQgTGVmdCAoSW1tZWRpYXRlKQorZGVmbSBWUVNITHNpICA6IE4yVlNoX1FIU0Q8MCwxLDBiMDExMSwxLCBJSUNfVlNITGk0RCwgInZxc2hsIiwgInMiLE5FT052cXNobHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOMlJlZ1ZTaExGcm0+OworZGVmbSBWUVNITHVpICA6IE4yVlNoX1FIU0Q8MSwxLDBiMDExMSwxLCBJSUNfVlNITGk0RCwgInZxc2hsIiwgInUiLE5FT052cXNobHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOMlJlZ1ZTaExGcm0+OworLy8gICBWUVNITFUgICA6IFZlY3RvciBTYXR1cmF0aW5nIFNoaWZ0IExlZnQgKEltbWVkaWF0ZSwgVW5zaWduZWQpCitkZWZtIFZRU0hMc3UgIDogTjJWU2hfUUhTRDwxLDEsMGIwMTEwLDEsIElJQ19WU0hMaTRELCJ2cXNobHUiLCJzIixORU9OdnFzaGxzdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE4yUmVnVlNoTEZybT47CisKKy8vICAgVlFTSFJOICAgOiBWZWN0b3IgU2F0dXJhdGluZyBTaGlmdCBSaWdodCBhbmQgTmFycm93CitkZWZtIFZRU0hSTnMgIDogTjJWTlNoX0hTRDwwLCAxLCAwYjEwMDEsIDAsIDAsIDEsIElJQ19WU0hMaTRELCAidnFzaHJuIiwgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVPTnZxc2hybnM+OworZGVmbSBWUVNIUk51ICA6IE4yVk5TaF9IU0Q8MSwgMSwgMGIxMDAxLCAwLCAwLCAxLCBJSUNfVlNITGk0RCwgInZxc2hybiIsICJ1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FT052cXNocm51PjsKKworLy8gICBWUVNIUlVOICA6IFZlY3RvciBTYXR1cmF0aW5nIFNoaWZ0IFJpZ2h0IGFuZCBOYXJyb3cgKFVuc2lnbmVkKQorZGVmbSBWUVNIUlVOICA6IE4yVk5TaF9IU0Q8MSwgMSwgMGIxMDAwLCAwLCAwLCAxLCBJSUNfVlNITGk0RCwgInZxc2hydW4iLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBORU9OdnFzaHJuc3U+OworCisvLyAgIFZRUlNITCAgIDogVmVjdG9yIFNhdHVyYXRpbmcgUm91bmRpbmcgU2hpZnQKK2RlZm0gVlFSU0hMcyAgOiBOM1ZJbnRfUUhTRDwwLCAwLCAwYjAxMDEsIDEsIE4zUmVnVlNoRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WU0hMaTRELCBJSUNfVlNITGk0RCwgSUlDX1ZTSExpNFEsIElJQ19WU0hMaTRRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cXJzaGwiLCAicyIsIGludF9hcm1fbmVvbl92cXJzaGlmdHMsIDA+OworZGVmbSBWUVJTSEx1ICA6IE4zVkludF9RSFNEPDEsIDAsIDBiMDEwMSwgMSwgTjNSZWdWU2hGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZTSExpNEQsIElJQ19WU0hMaTRELCBJSUNfVlNITGk0USwgSUlDX1ZTSExpNFEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZxcnNobCIsICJ1IiwgaW50X2FybV9uZW9uX3ZxcnNoaWZ0dSwgMD47CisKKy8vICAgVlFSU0hSTiAgOiBWZWN0b3IgU2F0dXJhdGluZyBSb3VuZGluZyBTaGlmdCBSaWdodCBhbmQgTmFycm93CitkZWZtIFZRUlNIUk5zIDogTjJWTlNoX0hTRDwwLCAxLCAwYjEwMDEsIDAsIDEsIDEsIElJQ19WU0hMaTRELCAidnFyc2hybiIsICJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FT052cXJzaHJucz47CitkZWZtIFZRUlNIUk51IDogTjJWTlNoX0hTRDwxLCAxLCAwYjEwMDEsIDAsIDEsIDEsIElJQ19WU0hMaTRELCAidnFyc2hybiIsICJ1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FT052cXJzaHJudT47CisKKy8vICAgVlFSU0hSVU4gOiBWZWN0b3IgU2F0dXJhdGluZyBSb3VuZGluZyBTaGlmdCBSaWdodCBhbmQgTmFycm93IChVbnNpZ25lZCkKK2RlZm0gVlFSU0hSVU4gOiBOMlZOU2hfSFNEPDEsIDEsIDBiMTAwMCwgMCwgMSwgMSwgSUlDX1ZTSExpNEQsICJ2cXJzaHJ1biIsICJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FT052cXJzaHJuc3U+OworCisvLyAgIFZTUkEgICAgIDogVmVjdG9yIFNoaWZ0IFJpZ2h0IGFuZCBBY2N1bXVsYXRlCitkZWZtIFZTUkFzICAgIDogTjJWU2hBZGRfUUhTRDwwLCAxLCAwYjAwMDEsIDEsICJ2c3JhIiwgInMiLCBORU9OdnNocnM+OworZGVmbSBWU1JBdSAgICA6IE4yVlNoQWRkX1FIU0Q8MSwgMSwgMGIwMDAxLCAxLCAidnNyYSIsICJ1IiwgTkVPTnZzaHJ1PjsKKy8vICAgVlJTUkEgICAgOiBWZWN0b3IgUm91bmRpbmcgU2hpZnQgUmlnaHQgYW5kIEFjY3VtdWxhdGUKK2RlZm0gVlJTUkFzICAgOiBOMlZTaEFkZF9RSFNEPDAsIDEsIDBiMDAxMSwgMSwgInZyc3JhIiwgInMiLCBORU9OdnJzaHJzPjsKK2RlZm0gVlJTUkF1ICAgOiBOMlZTaEFkZF9RSFNEPDEsIDEsIDBiMDAxMSwgMSwgInZyc3JhIiwgInUiLCBORU9OdnJzaHJ1PjsKKworLy8gICBWU0xJICAgICA6IFZlY3RvciBTaGlmdCBMZWZ0IGFuZCBJbnNlcnQKK2RlZm0gVlNMSSAgICAgOiBOMlZTaEluc19RSFNEPDEsIDEsIDBiMDEwMSwgMSwgInZzbGkiLCBORU9OdnNsaSwgTjJSZWdWU2hMRnJtPjsKKy8vICAgVlNSSSAgICAgOiBWZWN0b3IgU2hpZnQgUmlnaHQgYW5kIEluc2VydAorZGVmbSBWU1JJICAgICA6IE4yVlNoSW5zX1FIU0Q8MSwgMSwgMGIwMTAwLCAxLCAidnNyaSIsIE5FT052c3JpLCBOMlJlZ1ZTaFJGcm0+OworCisvLyBWZWN0b3IgQWJzb2x1dGUgYW5kIFNhdHVyYXRpbmcgQWJzb2x1dGUuCisKKy8vICAgVkFCUyAgICAgOiBWZWN0b3IgQWJzb2x1dGUgVmFsdWUKK2RlZm0gVkFCUyAgICAgOiBOMlZJbnRfUUhTPDBiMTEsIDBiMTEsIDBiMDEsIDBiMDAxMTAsIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZVTkFpRCwgSUlDX1ZVTkFpUSwgInZhYnMiLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfYXJtX25lb25fdmFicz47CitkZWYgIFZBQlNmZCAgIDogTjJWREludDwwYjExLCAwYjExLCAwYjEwLCAwYjAxLCAwYjAxMTEwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZVTkFELCAidmFicyIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjJmMzIsIHYyZjMyLCBpbnRfYXJtX25lb25fdmFicz47CitkZWYgIFZBQlNmcSAgIDogTjJWUUludDwwYjExLCAwYjExLCAwYjEwLCAwYjAxLCAwYjAxMTEwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZVTkFRLCAidmFicyIsICJmMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjRmMzIsIHY0ZjMyLCBpbnRfYXJtX25lb25fdmFicz47CisKKy8vICAgVlFBQlMgICAgOiBWZWN0b3IgU2F0dXJhdGluZyBBYnNvbHV0ZSBWYWx1ZQorZGVmbSBWUUFCUyAgICA6IE4yVkludF9RSFM8MGIxMSwgMGIxMSwgMGIwMCwgMGIwMTExMCwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVlFVTkFpRCwgSUlDX1ZRVU5BaVEsICJ2cWFicyIsICJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9hcm1fbmVvbl92cWFicz47CisKKy8vIFZlY3RvciBOZWdhdGUuCisKK2RlZiB2bmVnZCAgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLAorICAgICAgICAgICAgICAgICAgICAgKHN1YiAoYml0Y29udmVydCAodjJpMzIgTkVPTmltbUFsbFplcm9zVikpLCBub2RlOiRpbik+OworZGVmIHZuZWdxICA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksCisgICAgICAgICAgICAgICAgICAgICAoc3ViIChiaXRjb252ZXJ0ICh2NGkzMiBORU9OaW1tQWxsWmVyb3NWKSksIG5vZGU6JGluKT47CisKK2NsYXNzIFZORUdEPGJpdHM8Mj4gc2l6ZSwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBWYWx1ZVR5cGUgVHk+CisgIDogTjJWPDBiMTEsIDBiMTEsIHNpemUsIDBiMDEsIDBiMDAxMTEsIDAsIDAsIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JHNyYyksCisgICAgICAgIElJQ19WU0hMaUQsIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjIiwgIiIsCisgICAgICAgIFsoc2V0IERQUjokZHN0LCAoVHkgKHZuZWdkIERQUjokc3JjKSkpXT47CitjbGFzcyBWTkVHUTxiaXRzPDI+IHNpemUsIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgVmFsdWVUeXBlIFR5PgorICA6IE4yVjwwYjExLCAwYjExLCBzaXplLCAwYjAxLCAwYjAwMTExLCAxLCAwLCAob3V0cyBRUFI6JGRzdCksIChpbnMgUVBSOiRzcmMpLAorICAgICAgICBJSUNfVlNITGlELCBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYyIsICIiLAorICAgICAgICBbKHNldCBRUFI6JGRzdCwgKFR5ICh2bmVncSBRUFI6JHNyYykpKV0+OworCisvLyAgIFZORUcgICAgIDogVmVjdG9yIE5lZ2F0ZSAoaW50ZWdlcikKK2RlZiAgVk5FR3M4ZCAgOiBWTkVHRDwwYjAwLCAidm5lZyIsICJzOCIsIHY4aTg+OworZGVmICBWTkVHczE2ZCA6IFZORUdEPDBiMDEsICJ2bmVnIiwgInMxNiIsIHY0aTE2PjsKK2RlZiAgVk5FR3MzMmQgOiBWTkVHRDwwYjEwLCAidm5lZyIsICJzMzIiLCB2MmkzMj47CitkZWYgIFZORUdzOHEgIDogVk5FR1E8MGIwMCwgInZuZWciLCAiczgiLCB2MTZpOD47CitkZWYgIFZORUdzMTZxIDogVk5FR1E8MGIwMSwgInZuZWciLCAiczE2IiwgdjhpMTY+OworZGVmICBWTkVHczMycSA6IFZORUdRPDBiMTAsICJ2bmVnIiwgInMzMiIsIHY0aTMyPjsKKworLy8gICBWTkVHICAgICA6IFZlY3RvciBOZWdhdGUgKGZsb2F0aW5nLXBvaW50KQorZGVmICBWTkVHZmQgICA6IE4yVjwwYjExLCAwYjExLCAwYjEwLCAwYjAxLCAwYjAxMTExLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRzcmMpLCBJSUNfVlVOQUQsCisgICAgICAgICAgICAgICAgICAgICJ2bmVnIiwgImYzMiIsICIkZHN0LCAkc3JjIiwgIiIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IERQUjokZHN0LCAodjJmMzIgKGZuZWcgRFBSOiRzcmMpKSldPjsKK2RlZiAgVk5FR2YzMnEgOiBOMlY8MGIxMSwgMGIxMSwgMGIxMCwgMGIwMSwgMGIwMTExMSwgMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgUVBSOiRkc3QpLCAoaW5zIFFQUjokc3JjKSwgSUlDX1ZVTkFRLAorICAgICAgICAgICAgICAgICAgICAidm5lZyIsICJmMzIiLCAiJGRzdCwgJHNyYyIsICIiLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHY0ZjMyIChmbmVnIFFQUjokc3JjKSkpXT47CisKK2RlZiA6IFBhdDwodjhpOCAgKHZuZWdkICBEUFI6JHNyYykpLCAoVk5FR3M4ZCBEUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGkxNiAodm5lZ2QgIERQUjokc3JjKSksIChWTkVHczE2ZCBEUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MmkzMiAodm5lZ2QgIERQUjokc3JjKSksIChWTkVHczMyZCBEUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MTZpOCAodm5lZ3EgUVBSOiRzcmMpKSwgKFZORUdzOHEgUVBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpMTYgKHZuZWdxIFFQUjokc3JjKSksIChWTkVHczE2cSBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAodm5lZ3EgUVBSOiRzcmMpKSwgKFZORUdzMzJxIFFQUjokc3JjKT47CisKKy8vICAgVlFORUcgICAgOiBWZWN0b3IgU2F0dXJhdGluZyBOZWdhdGUKK2RlZm0gVlFORUcgICAgOiBOMlZJbnRfUUhTPDBiMTEsIDBiMTEsIDBiMDAsIDBiMDExMTEsIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZRVU5BaUQsIElJQ19WUVVOQWlRLCAidnFuZWciLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfYXJtX25lb25fdnFuZWc+OworCisvLyBWZWN0b3IgQml0IENvdW50aW5nIE9wZXJhdGlvbnMuCisKKy8vICAgVkNMUyAgICAgOiBWZWN0b3IgQ291bnQgTGVhZGluZyBTaWduIEJpdHMKK2RlZm0gVkNMUyAgICAgOiBOMlZJbnRfUUhTPDBiMTEsIDBiMTEsIDBiMDAsIDBiMDEwMDAsIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZDTlRpRCwgSUlDX1ZDTlRpUSwgInZjbHMiLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfYXJtX25lb25fdmNscz47CisvLyAgIFZDTFogICAgIDogVmVjdG9yIENvdW50IExlYWRpbmcgWmVyb3MKK2RlZm0gVkNMWiAgICAgOiBOMlZJbnRfUUhTPDBiMTEsIDBiMTEsIDBiMDAsIDBiMDEwMDEsIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZDTlRpRCwgSUlDX1ZDTlRpUSwgInZjbHoiLCAiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfYXJtX25lb25fdmNsej47CisvLyAgIFZDTlQgICAgIDogVmVjdG9yIENvdW50IE9uZSBCaXRzCitkZWYgIFZDTlRkICAgIDogTjJWREludDwwYjExLCAwYjExLCAwYjAwLCAwYjAwLCAwYjAxMDEwLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WQ05UaUQsICJ2Y250IiwgIjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjhpOCwgdjhpOCwgaW50X2FybV9uZW9uX3ZjbnQ+OworZGVmICBWQ05UcSAgICA6IE4yVlFJbnQ8MGIxMSwgMGIxMSwgMGIwMCwgMGIwMCwgMGIwMTAxMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WQ05UaVEsICJ2Y250IiwgIjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjE2aTgsIHYxNmk4LCBpbnRfYXJtX25lb25fdmNudD47CisKKy8vIFZlY3RvciBTd2FwIC0tIGZvciBkaXNhc3NlbWJseSBvbmx5LgorZGVmICBWU1dQZCAgICA6IE4yVlg8MGIxMSwgMGIxMSwgMGIwMCwgMGIxMCwgMGIwMDAwMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JHNyYyksIE5vSXRpbmVyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgInZzd3AiLCAiJGRzdCwgJHNyYyIsICIiLCBbXT47CitkZWYgIFZTV1BxICAgIDogTjJWWDwwYjExLCAwYjExLCAwYjAwLCAwYjEwLCAwYjAwMDAwLCAxLCAwLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgUVBSOiRkc3QpLCAoaW5zIFFQUjokc3JjKSwgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICAgICAidnN3cCIsICIkZHN0LCAkc3JjIiwgIiIsIFtdPjsKKworLy8gVmVjdG9yIE1vdmUgT3BlcmF0aW9ucy4KKworLy8gICBWTU9WICAgICA6IFZlY3RvciBNb3ZlIChSZWdpc3RlcikKKworbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsKK2RlZiAgVk1PVkRuZW9uOiBOM1ZYPDAsIDAsIDBiMTAsIDBiMDAwMSwgMCwgMSwgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgIE4zUmVnRnJtLCBJSUNfVk1PVkQsICJ2bW92IiwgIiRkc3QsICRzcmMiLCAiIiwgW10+OworZGVmICBWTU9WUSAgICA6IE4zVlg8MCwgMCwgMGIxMCwgMGIwMDAxLCAxLCAxLCAob3V0cyBRUFI6JGRzdCksIChpbnMgUVBSOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgTjNSZWdGcm0sIElJQ19WTU9WRCwgInZtb3YiLCAiJGRzdCwgJHNyYyIsICIiLCBbXT47CisKKy8vIFBzZXVkbyB2ZWN0b3IgbW92ZSBpbnN0cnVjdGlvbnMgZm9yIFFRIGFuZCBRUVFRIHJlZ2lzdGVycy4gVGhpcyBzaG91bGQKKy8vIGJlIGV4cGFuZGVkIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24gaXMgY29tcGxldGVkLgorZGVmICBWTU9WUVEgICA6IFBzZXVkb0luc3Q8KG91dHMgUVFQUjokZHN0KSwgKGlucyBRUVBSOiRzcmMpLAorICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAiJHs6Y29tbWVudH0gdm1vdlx0JGRzdCwgJHNyYyIsIFtdPjsKKworZGVmICBWTU9WUVFRUSA6IFBzZXVkb0luc3Q8KG91dHMgUVFRUVBSOiRkc3QpLCAoaW5zIFFRUVFQUjokc3JjKSwKKyAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwgIiR7OmNvbW1lbnR9IHZtb3ZcdCRkc3QsICRzcmMiLCBbXT47Cit9IC8vIG5ldmVySGFzU2lkZUVmZmVjdHMKKworLy8gICBWTU9WICAgICA6IFZlY3RvciBNb3ZlIChJbW1lZGlhdGUpCisKK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluIHsKK2RlZiBWTU9WdjhpOCAgOiBOMU1vZEltbTwxLCAwYjAwMCwgMGIxMTEwLCAwLCAwLCAwLCAxLCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBuTW9kSW1tOiRTSU1NKSwgSUlDX1ZNT1ZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgInZtb3YiLCAiaTgiLCAiJGRzdCwgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKHY4aTggKE5FT052bW92SW1tIHRpbW06JFNJTU0pKSldPjsKK2RlZiBWTU9WdjE2aTggOiBOMU1vZEltbTwxLCAwYjAwMCwgMGIxMTEwLCAwLCAxLCAwLCAxLCAob3V0cyBRUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBuTW9kSW1tOiRTSU1NKSwgSUlDX1ZNT1ZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgInZtb3YiLCAiaTgiLCAiJGRzdCwgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHYxNmk4IChORU9Odm1vdkltbSB0aW1tOiRTSU1NKSkpXT47CisKK2RlZiBWTU9WdjRpMTYgOiBOMU1vZEltbTwxLCAwYjAwMCwgezEsMCw/LDB9LCAwLCAwLCAwLCAxLCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBuTW9kSW1tOiRTSU1NKSwgSUlDX1ZNT1ZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgInZtb3YiLCAiaTE2IiwgIiRkc3QsICRTSU1NIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2NGkxNiAoTkVPTnZtb3ZJbW0gdGltbTokU0lNTSkpKV0+OworZGVmIFZNT1Z2OGkxNiA6IE4xTW9kSW1tPDEsIDBiMDAwLCB7MSwwLD8sMH0sIDAsIDEsIDAsIDEsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIG5Nb2RJbW06JFNJTU0pLCBJSUNfVk1PVkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidm1vdiIsICJpMTYiLCAiJGRzdCwgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHY4aTE2IChORU9Odm1vdkltbSB0aW1tOiRTSU1NKSkpXT47CisKK2RlZiBWTU9WdjJpMzIgOiBOMU1vZEltbTwxLCAwYjAwMCwgez8sPyw/LD99LCAwLCAwLCAwLCAxLCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBuTW9kSW1tOiRTSU1NKSwgSUlDX1ZNT1ZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgInZtb3YiLCAiaTMyIiwgIiRkc3QsICRTSU1NIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2MmkzMiAoTkVPTnZtb3ZJbW0gdGltbTokU0lNTSkpKV0+OworZGVmIFZNT1Z2NGkzMiA6IE4xTW9kSW1tPDEsIDBiMDAwLCB7Pyw/LD8sP30sIDAsIDEsIDAsIDEsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIG5Nb2RJbW06JFNJTU0pLCBJSUNfVk1PVkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidm1vdiIsICJpMzIiLCAiJGRzdCwgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHY0aTMyIChORU9Odm1vdkltbSB0aW1tOiRTSU1NKSkpXT47CisKK2RlZiBWTU9WdjFpNjQgOiBOMU1vZEltbTwxLCAwYjAwMCwgMGIxMTEwLCAwLCAwLCAxLCAxLCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBuTW9kSW1tOiRTSU1NKSwgSUlDX1ZNT1ZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgInZtb3YiLCAiaTY0IiwgIiRkc3QsICRTSU1NIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2MWk2NCAoTkVPTnZtb3ZJbW0gdGltbTokU0lNTSkpKV0+OworZGVmIFZNT1Z2Mmk2NCA6IE4xTW9kSW1tPDEsIDBiMDAwLCAwYjExMTAsIDAsIDEsIDEsIDEsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIG5Nb2RJbW06JFNJTU0pLCBJSUNfVk1PVkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidm1vdiIsICJpNjQiLCAiJGRzdCwgJFNJTU0iLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHYyaTY0IChORU9Odm1vdkltbSB0aW1tOiRTSU1NKSkpXT47Cit9IC8vIGlzUmVNYXRlcmlhbGl6YWJsZQorCisvLyAgIFZNT1YgICAgIDogVmVjdG9yIEdldCBMYW5lIChtb3ZlIHNjYWxhciB0byBBUk0gY29yZSByZWdpc3RlcikKKworZGVmIFZHRVRMTnM4ICA6IE5WR2V0TGFuZTx7MSwxLDEsMCwwLDEsPywxfSwgMGIxMDExLCB7Pyw/fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIERQUjokc3JjLCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZNT1ZTSSwgInZtb3YiLCAiczgiLCAiJGRzdCwgJHNyY1skbGFuZV0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKE5FT052Z2V0bGFuZXMgKHY4aTggRFBSOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokbGFuZSkpXT47CitkZWYgVkdFVExOczE2IDogTlZHZXRMYW5lPHsxLDEsMSwwLDAsMCw/LDF9LCAwYjEwMTEsIHs/LDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgRFBSOiRzcmMsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1PVlNJLCAidm1vdiIsICJzMTYiLCAiJGRzdCwgJHNyY1skbGFuZV0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKE5FT052Z2V0bGFuZXMgKHY0aTE2IERQUjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGxhbmUpKV0+OworZGVmIFZHRVRMTnU4ICA6IE5WR2V0TGFuZTx7MSwxLDEsMCwxLDEsPywxfSwgMGIxMDExLCB7Pyw/fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1BSOiRkc3QpLCAoaW5zIERQUjokc3JjLCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZNT1ZTSSwgInZtb3YiLCAidTgiLCAiJGRzdCwgJHNyY1skbGFuZV0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKE5FT052Z2V0bGFuZXUgKHY4aTggRFBSOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokbGFuZSkpXT47CitkZWYgVkdFVExOdTE2IDogTlZHZXRMYW5lPHsxLDEsMSwwLDEsMCw/LDF9LCAwYjEwMTEsIHs/LDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgRFBSOiRzcmMsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1PVlNJLCAidm1vdiIsICJ1MTYiLCAiJGRzdCwgJHNyY1skbGFuZV0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKE5FT052Z2V0bGFuZXUgKHY0aTE2IERQUjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGxhbmUpKV0+OworZGVmIFZHRVRMTmkzMiA6IE5WR2V0TGFuZTx7MSwxLDEsMCwwLDAsPywxfSwgMGIxMDExLCAwYjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUFI6JGRzdCksIChpbnMgRFBSOiRzcmMsIG5vaGFzaF9pbW06JGxhbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1PVlNJLCAidm1vdiIsICIzMiIsICIkZHN0LCAkc3JjWyRsYW5lXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoZXh0cmFjdGVsdCAodjJpMzIgRFBSOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokbGFuZSkpXT47CisvLyBkZWYgVkdFVExOZjMyOiBzZWUgRk1SREggYW5kIEZNUkRMIGluIEFSTUluc3RyVkZQLnRkCitkZWYgOiBQYXQ8KE5FT052Z2V0bGFuZXMgKHYxNmk4IFFQUjokc3JjKSwgaW1tOiRsYW5lKSwKKyAgICAgICAgICAoVkdFVExOczggKHY4aTggKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaThfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgIChTdWJSZWdfaThfbGFuZSBpbW06JGxhbmUpKT47CitkZWYgOiBQYXQ8KE5FT052Z2V0bGFuZXMgKHY4aTE2IFFQUjokc3JjKSwgaW1tOiRsYW5lKSwKKyAgICAgICAgICAoVkdFVExOczE2ICh2NGkxNiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2kxNl9yZWcgaW1tOiRsYW5lKSkpLAorICAgICAgICAgICAgICAgICAgICAgKFN1YlJlZ19pMTZfbGFuZSBpbW06JGxhbmUpKT47CitkZWYgOiBQYXQ8KE5FT052Z2V0bGFuZXUgKHYxNmk4IFFQUjokc3JjKSwgaW1tOiRsYW5lKSwKKyAgICAgICAgICAoVkdFVExOdTggKHY4aTggKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaThfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgIChTdWJSZWdfaThfbGFuZSBpbW06JGxhbmUpKT47CitkZWYgOiBQYXQ8KE5FT052Z2V0bGFuZXUgKHY4aTE2IFFQUjokc3JjKSwgaW1tOiRsYW5lKSwKKyAgICAgICAgICAoVkdFVExOdTE2ICh2NGkxNiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2kxNl9yZWcgaW1tOiRsYW5lKSkpLAorICAgICAgICAgICAgICAgICAgICAgKFN1YlJlZ19pMTZfbGFuZSBpbW06JGxhbmUpKT47CitkZWYgOiBQYXQ8KGV4dHJhY3RlbHQgKHY0aTMyIFFQUjokc3JjKSwgaW1tOiRsYW5lKSwKKyAgICAgICAgICAoVkdFVExOaTMyICh2MmkzMiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2kzMl9yZWcgaW1tOiRsYW5lKSkpLAorICAgICAgICAgICAgICAgICAgICAgKFN1YlJlZ19pMzJfbGFuZSBpbW06JGxhbmUpKT47CitkZWYgOiBQYXQ8KGV4dHJhY3RlbHQgKHYyZjMyIERQUjokc3JjMSksIGltbTokc3JjMiksCisgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHICh2MmYzMiAoQ09QWV9UT19SRUdDTEFTUyAodjJmMzIgRFBSOiRzcmMxKSxEUFJfVkZQMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoU1N1YlJlZ19mMzJfcmVnIGltbTokc3JjMikpPjsKK2RlZiA6IFBhdDwoZXh0cmFjdGVsdCAodjRmMzIgUVBSOiRzcmMxKSwgaW1tOiRzcmMyKSwKKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKHY0ZjMyIChDT1BZX1RPX1JFR0NMQVNTICh2NGYzMiBRUFI6JHNyYzEpLFFQUl9WRlAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChTU3ViUmVnX2YzMl9yZWcgaW1tOiRzcmMyKSk+OworLy9kZWYgOiBQYXQ8KGV4dHJhY3RlbHQgKHYyaTY0IFFQUjokc3JjMSksIGltbTokc3JjMiksCisvLyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMxLCAoRFN1YlJlZ19mNjRfcmVnIGltbTokc3JjMikpPjsKK2RlZiA6IFBhdDwoZXh0cmFjdGVsdCAodjJmNjQgUVBSOiRzcmMxKSwgaW1tOiRzcmMyKSwKKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMxLCAoRFN1YlJlZ19mNjRfcmVnIGltbTokc3JjMikpPjsKKworCisvLyAgIFZNT1YgICAgIDogVmVjdG9yIFNldCBMYW5lIChtb3ZlIEFSTSBjb3JlIHJlZ2lzdGVyIHRvIHNjYWxhcikKKworbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4geworZGVmIFZTRVRMTmk4ICA6IE5WU2V0TGFuZTx7MSwxLDEsMCwwLDEsPywwfSwgMGIxMDExLCB7Pyw/fSwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIERQUjokc3JjMSwgR1BSOiRzcmMyLCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZNT1ZJU0wsICJ2bW92IiwgIjgiLCAiJGRzdFskbGFuZV0sICRzcmMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2ZWN0b3JfaW5zZXJ0ICh2OGk4IERQUjokc3JjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSOiRzcmMyLCBpbW06JGxhbmUpKV0+OworZGVmIFZTRVRMTmkxNiA6IE5WU2V0TGFuZTx7MSwxLDEsMCwwLDAsPywwfSwgMGIxMDExLCB7PywxfSwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIERQUjokc3JjMSwgR1BSOiRzcmMyLCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX1ZNT1ZJU0wsICJ2bW92IiwgIjE2IiwgIiRkc3RbJGxhbmVdLCAkc3JjMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IERQUjokZHN0LCAodmVjdG9yX2luc2VydCAodjRpMTYgRFBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFI6JHNyYzIsIGltbTokbGFuZSkpXT47CitkZWYgVlNFVExOaTMyIDogTlZTZXRMYW5lPHsxLDEsMSwwLDAsMCw/LDB9LCAwYjEwMTEsIDBiMDAsIChvdXRzIERQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBEUFI6JHNyYzEsIEdQUjokc3JjMiwgbm9oYXNoX2ltbTokbGFuZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19WTU9WSVNMLCAidm1vdiIsICIzMiIsICIkZHN0WyRsYW5lXSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKGluc2VydGVsdCAodjJpMzIgRFBSOiRzcmMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFI6JHNyYzIsIGltbTokbGFuZSkpXT47Cit9CitkZWYgOiBQYXQ8KHZlY3Rvcl9pbnNlcnQgKHYxNmk4IFFQUjokc3JjMSksIEdQUjokc3JjMiwgaW1tOiRsYW5lKSwKKyAgICAgICAgICAodjE2aTggKElOU0VSVF9TVUJSRUcgUVBSOiRzcmMxLCAKKyAgICAgICAgICAgICAgICAgICh2OGk4IChWU0VUTE5pOCAodjhpOCAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFN1YlJlZ19pOF9yZWcgaW1tOiRsYW5lKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUjokc3JjMiwgKFN1YlJlZ19pOF9sYW5lIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2k4X3JlZyBpbW06JGxhbmUpKSk+OworZGVmIDogUGF0PCh2ZWN0b3JfaW5zZXJ0ICh2OGkxNiBRUFI6JHNyYzEpLCBHUFI6JHNyYzIsIGltbTokbGFuZSksCisgICAgICAgICAgKHY4aTE2IChJTlNFUlRfU1VCUkVHIFFQUjokc3JjMSwgCisgICAgICAgICAgICAgICAgICAodjRpMTYgKFZTRVRMTmkxNiAodjRpMTYgKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFN1YlJlZ19pMTZfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSOiRzcmMyLCAoU3ViUmVnX2kxNl9sYW5lIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2kxNl9yZWcgaW1tOiRsYW5lKSkpPjsKK2RlZiA6IFBhdDwoaW5zZXJ0ZWx0ICh2NGkzMiBRUFI6JHNyYzEpLCBHUFI6JHNyYzIsIGltbTokbGFuZSksCisgICAgICAgICAgKHY0aTMyIChJTlNFUlRfU1VCUkVHIFFQUjokc3JjMSwgCisgICAgICAgICAgICAgICAgICAodjJpMzIgKFZTRVRMTmkzMiAodjJpMzIgKEVYVFJBQ1RfU1VCUkVHIFFQUjokc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFN1YlJlZ19pMzJfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSOiRzcmMyLCAoU3ViUmVnX2kzMl9sYW5lIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2kzMl9yZWcgaW1tOiRsYW5lKSkpPjsKKworZGVmIDogUGF0PCh2MmYzMiAoaW5zZXJ0ZWx0IERQUjokc3JjMSwgU1BSOiRzcmMyLCBpbW06JHNyYzMpKSwKKyAgICAgICAgICAoSU5TRVJUX1NVQlJFRyAodjJmMzIgKENPUFlfVE9fUkVHQ0xBU1MgRFBSOiRzcmMxLCBEUFJfVkZQMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUFI6JHNyYzIsIChTU3ViUmVnX2YzMl9yZWcgaW1tOiRzcmMzKSk+OworZGVmIDogUGF0PCh2NGYzMiAoaW5zZXJ0ZWx0IFFQUjokc3JjMSwgU1BSOiRzcmMyLCBpbW06JHNyYzMpKSwKKyAgICAgICAgICAoSU5TRVJUX1NVQlJFRyAodjRmMzIgKENPUFlfVE9fUkVHQ0xBU1MgUVBSOiRzcmMxLCBRUFJfVkZQMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUFI6JHNyYzIsIChTU3ViUmVnX2YzMl9yZWcgaW1tOiRzcmMzKSk+OworCisvL2RlZiA6IFBhdDwodjJpNjQgKGluc2VydGVsdCBRUFI6JHNyYzEsIERQUjokc3JjMiwgaW1tOiRzcmMzKSksCisvLyAgICAgICAgICAoSU5TRVJUX1NVQlJFRyBRUFI6JHNyYzEsIERQUjokc3JjMiwgKERTdWJSZWdfZjY0X3JlZyBpbW06JHNyYzMpKT47CitkZWYgOiBQYXQ8KHYyZjY0IChpbnNlcnRlbHQgUVBSOiRzcmMxLCBEUFI6JHNyYzIsIGltbTokc3JjMykpLAorICAgICAgICAgIChJTlNFUlRfU1VCUkVHIFFQUjokc3JjMSwgRFBSOiRzcmMyLCAoRFN1YlJlZ19mNjRfcmVnIGltbTokc3JjMykpPjsKKworZGVmIDogUGF0PCh2MmYzMiAoc2NhbGFyX3RvX3ZlY3RvciBTUFI6JHNyYykpLAorICAgICAgICAgIChJTlNFUlRfU1VCUkVHICh2MmYzMiAoSU1QTElDSVRfREVGKSksIFNQUjokc3JjLCBzc3ViXzApPjsKK2RlZiA6IFBhdDwodjJmNjQgKHNjYWxhcl90b192ZWN0b3IgKGY2NCBEUFI6JHNyYykpKSwKKyAgICAgICAgICAoSU5TRVJUX1NVQlJFRyAodjJmNjQgKElNUExJQ0lUX0RFRikpLCBEUFI6JHNyYywgZHN1Yl8wKT47CitkZWYgOiBQYXQ8KHY0ZjMyIChzY2FsYXJfdG9fdmVjdG9yIFNQUjokc3JjKSksCisgICAgICAgICAgKElOU0VSVF9TVUJSRUcgKHY0ZjMyIChJTVBMSUNJVF9ERUYpKSwgU1BSOiRzcmMsIHNzdWJfMCk+OworCitkZWYgOiBQYXQ8KHY4aTggKHNjYWxhcl90b192ZWN0b3IgR1BSOiRzcmMpKSwKKyAgICAgICAgICAoVlNFVExOaTggICh2OGk4ICAoSU1QTElDSVRfREVGKSksIEdQUjokc3JjLCAoaTMyIDApKT47CitkZWYgOiBQYXQ8KHY0aTE2IChzY2FsYXJfdG9fdmVjdG9yIEdQUjokc3JjKSksCisgICAgICAgICAgKFZTRVRMTmkxNiAodjRpMTYgKElNUExJQ0lUX0RFRikpLCBHUFI6JHNyYywgKGkzMiAwKSk+OworZGVmIDogUGF0PCh2MmkzMiAoc2NhbGFyX3RvX3ZlY3RvciBHUFI6JHNyYykpLAorICAgICAgICAgIChWU0VUTE5pMzIgKHYyaTMyIChJTVBMSUNJVF9ERUYpKSwgR1BSOiRzcmMsIChpMzIgMCkpPjsKKworZGVmIDogUGF0PCh2MTZpOCAoc2NhbGFyX3RvX3ZlY3RvciBHUFI6JHNyYykpLAorICAgICAgICAgIChJTlNFUlRfU1VCUkVHICh2MTZpOCAoSU1QTElDSVRfREVGKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKFZTRVRMTmk4ICh2OGk4IChJTVBMSUNJVF9ERUYpKSwgR1BSOiRzcmMsIChpMzIgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdWJfMCk+OworZGVmIDogUGF0PCh2OGkxNiAoc2NhbGFyX3RvX3ZlY3RvciBHUFI6JHNyYykpLAorICAgICAgICAgIChJTlNFUlRfU1VCUkVHICh2OGkxNiAoSU1QTElDSVRfREVGKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKFZTRVRMTmkxNiAodjRpMTYgKElNUExJQ0lUX0RFRikpLCBHUFI6JHNyYywgKGkzMiAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN1Yl8wKT47CitkZWYgOiBQYXQ8KHY0aTMyIChzY2FsYXJfdG9fdmVjdG9yIEdQUjokc3JjKSksCisgICAgICAgICAgKElOU0VSVF9TVUJSRUcgKHY0aTMyIChJTVBMSUNJVF9ERUYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoVlNFVExOaTMyICh2MmkzMiAoSU1QTElDSVRfREVGKSksIEdQUjokc3JjLCAoaTMyIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3ViXzApPjsKKworLy8gICBWRFVQICAgICA6IFZlY3RvciBEdXBsaWNhdGUgKGZyb20gQVJNIGNvcmUgcmVnaXN0ZXIgdG8gYWxsIGVsZW1lbnRzKQorCitjbGFzcyBWRFVQRDxiaXRzPDg+IG9wY29kMSwgYml0czwyPiBvcGNvZDMsIHN0cmluZyBEdCwgVmFsdWVUeXBlIFR5PgorICA6IE5WRHVwPG9wY29kMSwgMGIxMDExLCBvcGNvZDMsIChvdXRzIERQUjokZHN0KSwgKGlucyBHUFI6JHNyYyksCisgICAgICAgICAgSUlDX1ZNT1ZJUywgInZkdXAiLCBEdCwgIiRkc3QsICRzcmMiLAorICAgICAgICAgIFsoc2V0IERQUjokZHN0LCAoVHkgKE5FT052ZHVwIChpMzIgR1BSOiRzcmMpKSkpXT47CitjbGFzcyBWRFVQUTxiaXRzPDg+IG9wY29kMSwgYml0czwyPiBvcGNvZDMsIHN0cmluZyBEdCwgVmFsdWVUeXBlIFR5PgorICA6IE5WRHVwPG9wY29kMSwgMGIxMDExLCBvcGNvZDMsIChvdXRzIFFQUjokZHN0KSwgKGlucyBHUFI6JHNyYyksCisgICAgICAgICAgSUlDX1ZNT1ZJUywgInZkdXAiLCBEdCwgIiRkc3QsICRzcmMiLAorICAgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoVHkgKE5FT052ZHVwIChpMzIgR1BSOiRzcmMpKSkpXT47CisKK2RlZiAgVkRVUDhkICAgOiBWRFVQRDwwYjExMTAxMTAwLCAwYjAwLCAiOCIsIHY4aTg+OworZGVmICBWRFVQMTZkICA6IFZEVVBEPDBiMTExMDEwMDAsIDBiMDEsICIxNiIsIHY0aTE2PjsKK2RlZiAgVkRVUDMyZCAgOiBWRFVQRDwwYjExMTAxMDAwLCAwYjAwLCAiMzIiLCB2MmkzMj47CitkZWYgIFZEVVA4cSAgIDogVkRVUFE8MGIxMTEwMTExMCwgMGIwMCwgIjgiLCB2MTZpOD47CitkZWYgIFZEVVAxNnEgIDogVkRVUFE8MGIxMTEwMTAxMCwgMGIwMSwgIjE2IiwgdjhpMTY+OworZGVmICBWRFVQMzJxICA6IFZEVVBRPDBiMTExMDEwMTAsIDBiMDAsICIzMiIsIHY0aTMyPjsKKworZGVmICBWRFVQZmQgICA6IE5WRHVwPDBiMTExMDEwMDAsIDBiMTAxMSwgMGIwMCwgKG91dHMgRFBSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1PVklTLCAidmR1cCIsICIzMiIsICIkZHN0LCAkc3JjIiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKHYyZjMyIChORU9OdmR1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmMzIgKGJpdGNvbnZlcnQgR1BSOiRzcmMpKSkpKV0+OworZGVmICBWRFVQZnEgICA6IE5WRHVwPDBiMTExMDEwMTAsIDBiMTAxMSwgMGIwMCwgKG91dHMgUVBSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICBJSUNfVk1PVklTLCAidmR1cCIsICIzMiIsICIkZHN0LCAkc3JjIiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHY0ZjMyIChORU9OdmR1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmMzIgKGJpdGNvbnZlcnQgR1BSOiRzcmMpKSkpKV0+OworCisvLyAgIFZEVVAgICAgIDogVmVjdG9yIER1cGxpY2F0ZSBMYW5lIChmcm9tIHNjYWxhciB0byBhbGwgZWxlbWVudHMpCisKK2NsYXNzIFZEVVBMTkQ8Yml0czw0PiBvcDE5XzE2LCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgIFZhbHVlVHlwZSBUeT4KKyAgOiBOVkR1cExhbmU8b3AxOV8xNiwgMCwgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokc3JjLCBub2hhc2hfaW1tOiRsYW5lKSwKKyAgICAgICAgICAgICAgSUlDX1ZNT1ZELCBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyY1skbGFuZV0iLAorICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKFR5IChORU9OdmR1cGxhbmUgKFR5IERQUjokc3JjKSwgaW1tOiRsYW5lKSkpXT47CisKK2NsYXNzIFZEVVBMTlE8Yml0czw0PiBvcDE5XzE2LCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsCisgICAgICAgICAgICAgIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHk+CisgIDogTlZEdXBMYW5lPG9wMTlfMTYsIDEsIChvdXRzIFFQUjokZHN0KSwgKGlucyBEUFI6JHNyYywgbm9oYXNoX2ltbTokbGFuZSksCisgICAgICAgICAgICAgIElJQ19WTU9WRCwgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmNbJGxhbmVdIiwKKyAgICAgICAgICAgICAgWyhzZXQgUVBSOiRkc3QsIChSZXNUeSAoTkVPTnZkdXBsYW5lIChPcFR5IERQUjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRsYW5lKSkpXT47CisKKy8vIEluc3R7MTktMTZ9IGlzIHBhcnRpYWxseSBzcGVjaWZpZWQgZGVwZW5kaW5nIG9uIHRoZSBlbGVtZW50IHNpemUuCisKK2RlZiBWRFVQTE44ZCAgOiBWRFVQTE5EPHs/LD8sPywxfSwgInZkdXAiLCAiOCIsIHY4aTg+OworZGVmIFZEVVBMTjE2ZCA6IFZEVVBMTkQ8ez8sPywxLDB9LCAidmR1cCIsICIxNiIsIHY0aTE2PjsKK2RlZiBWRFVQTE4zMmQgOiBWRFVQTE5EPHs/LDEsMCwwfSwgInZkdXAiLCAiMzIiLCB2MmkzMj47CitkZWYgVkRVUExOZmQgIDogVkRVUExORDx7PywxLDAsMH0sICJ2ZHVwIiwgIjMyIiwgdjJmMzI+OworZGVmIFZEVVBMTjhxICA6IFZEVVBMTlE8ez8sPyw/LDF9LCAidmR1cCIsICI4IiwgdjE2aTgsIHY4aTg+OworZGVmIFZEVVBMTjE2cSA6IFZEVVBMTlE8ez8sPywxLDB9LCAidmR1cCIsICIxNiIsIHY4aTE2LCB2NGkxNj47CitkZWYgVkRVUExOMzJxIDogVkRVUExOUTx7PywxLDAsMH0sICJ2ZHVwIiwgIjMyIiwgdjRpMzIsIHYyaTMyPjsKK2RlZiBWRFVQTE5mcSAgOiBWRFVQTE5RPHs/LDEsMCwwfSwgInZkdXAiLCAiMzIiLCB2NGYzMiwgdjJmMzI+OworCitkZWYgOiBQYXQ8KHYxNmk4IChORU9OdmR1cGxhbmUgKHYxNmk4IFFQUjokc3JjKSwgaW1tOiRsYW5lKSksCisgICAgICAgICAgKHYxNmk4IChWRFVQTE44cSAodjhpOCAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTdWJSZWdfaThfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdWJSZWdfaThfbGFuZSBpbW06JGxhbmUpKSk+OworZGVmIDogUGF0PCh2OGkxNiAoTkVPTnZkdXBsYW5lICh2OGkxNiBRUFI6JHNyYyksIGltbTokbGFuZSkpLAorICAgICAgICAgICh2OGkxNiAoVkRVUExOMTZxICh2NGkxNiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFN1YlJlZ19pMTZfcmVnIGltbTokbGFuZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3ViUmVnX2kxNl9sYW5lIGltbTokbGFuZSkpKT47CitkZWYgOiBQYXQ8KHY0aTMyIChORU9OdmR1cGxhbmUgKHY0aTMyIFFQUjokc3JjKSwgaW1tOiRsYW5lKSksCisgICAgICAgICAgKHY0aTMyIChWRFVQTE4zMnEgKHYyaTMyIChFWFRSQUNUX1NVQlJFRyBRUFI6JHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2kzMl9yZWcgaW1tOiRsYW5lKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdWJSZWdfaTMyX2xhbmUgaW1tOiRsYW5lKSkpPjsKK2RlZiA6IFBhdDwodjRmMzIgKE5FT052ZHVwbGFuZSAodjRmMzIgUVBSOiRzcmMpLCBpbW06JGxhbmUpKSwKKyAgICAgICAgICAodjRmMzIgKFZEVVBMTmZxICh2MmYzMiAoRVhUUkFDVF9TVUJSRUcgUVBSOiRzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEU3ViUmVnX2kzMl9yZWcgaW1tOiRsYW5lKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN1YlJlZ19pMzJfbGFuZSBpbW06JGxhbmUpKSk+OworCitkZWYgIFZEVVBmZGYgIDogTjJWPDBiMTEsIDBiMTEsIHs/LDF9LCB7MCwwfSwgMGIxMTAwMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIFNQUjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgSUlDX1ZNT1ZELCAidmR1cCIsICIzMiIsICIkZHN0LCAke3NyYzpsYW5lfSIsICIiLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKHYyZjMyIChORU9OdmR1cCAoZjMyIFNQUjokc3JjKSkpKV0+OworCitkZWYgIFZEVVBmcWYgIDogTjJWPDBiMTEsIDBiMTEsIHs/LDF9LCB7MCwwfSwgMGIxMTAwMCwgMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgUVBSOiRkc3QpLCAoaW5zIFNQUjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgSUlDX1ZNT1ZELCAidmR1cCIsICIzMiIsICIkZHN0LCAke3NyYzpsYW5lfSIsICIiLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBRUFI6JGRzdCwgKHY0ZjMyIChORU9OdmR1cCAoZjMyIFNQUjokc3JjKSkpKV0+OworCisvLyAgIFZNT1ZOICAgIDogVmVjdG9yIE5hcnJvd2luZyBNb3ZlCitkZWZtIFZNT1ZOICAgIDogTjJWTkludF9IU0Q8MGIxMSwwYjExLDBiMTAsMGIwMDEwMCwwLDAsIElJQ19WTU9WRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm1vdm4iLCAiaSIsIGludF9hcm1fbmVvbl92bW92bj47CisvLyAgIFZRTU9WTiAgIDogVmVjdG9yIFNhdHVyYXRpbmcgTmFycm93aW5nIE1vdmUKK2RlZm0gVlFNT1ZOcyAgOiBOMlZOSW50X0hTRDwwYjExLDBiMTEsMGIxMCwwYjAwMTAxLDAsMCwgSUlDX1ZRVU5BaUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZxbW92biIsICJzIiwgaW50X2FybV9uZW9uX3ZxbW92bnM+OworZGVmbSBWUU1PVk51ICA6IE4yVk5JbnRfSFNEPDBiMTEsMGIxMSwwYjEwLDBiMDAxMDEsMSwwLCBJSUNfVlFVTkFpRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnFtb3ZuIiwgInUiLCBpbnRfYXJtX25lb25fdnFtb3ZudT47CitkZWZtIFZRTU9WTnN1IDogTjJWTkludF9IU0Q8MGIxMSwwYjExLDBiMTAsMGIwMDEwMCwxLDAsIElJQ19WUVVOQWlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2cW1vdnVuIiwgInMiLCBpbnRfYXJtX25lb25fdnFtb3Zuc3U+OworLy8gICBWTU9WTCAgICA6IFZlY3RvciBMZW5ndGhlbmluZyBNb3ZlCitkZWZtIFZNT1ZMcyAgIDogTjJWTEludF9RSFM8MGIwMSwwYjEwMTAwLDAsMSwgInZtb3ZsIiwgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9hcm1fbmVvbl92bW92bHM+OworZGVmbSBWTU9WTHUgICA6IE4yVkxJbnRfUUhTPDBiMTEsMGIxMDEwMCwwLDEsICJ2bW92bCIsICJ1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfYXJtX25lb25fdm1vdmx1PjsKKworLy8gVmVjdG9yIENvbnZlcnNpb25zLgorCisvLyAgIFZDVlQgICAgIDogVmVjdG9yIENvbnZlcnQgQmV0d2VlbiBGbG9hdGluZy1Qb2ludCBhbmQgSW50ZWdlcnMKK2RlZiAgVkNWVGYyc2QgOiBOMlZEPDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDExMTAsIDAsICJ2Y3Z0IiwgInMzMi5mMzIiLAorICAgICAgICAgICAgICAgICAgICAgdjJpMzIsIHYyZjMyLCBmcF90b19zaW50PjsKK2RlZiAgVkNWVGYydWQgOiBOMlZEPDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDExMTEsIDAsICJ2Y3Z0IiwgInUzMi5mMzIiLAorICAgICAgICAgICAgICAgICAgICAgdjJpMzIsIHYyZjMyLCBmcF90b191aW50PjsKK2RlZiAgVkNWVHMyZmQgOiBOMlZEPDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDExMDAsIDAsICJ2Y3Z0IiwgImYzMi5zMzIiLAorICAgICAgICAgICAgICAgICAgICAgdjJmMzIsIHYyaTMyLCBzaW50X3RvX2ZwPjsKK2RlZiAgVkNWVHUyZmQgOiBOMlZEPDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDExMDEsIDAsICJ2Y3Z0IiwgImYzMi51MzIiLAorICAgICAgICAgICAgICAgICAgICAgdjJmMzIsIHYyaTMyLCB1aW50X3RvX2ZwPjsKKworZGVmICBWQ1ZUZjJzcSA6IE4yVlE8MGIxMSwgMGIxMSwgMGIxMCwgMGIxMSwgMGIwMTExMCwgMCwgInZjdnQiLCAiczMyLmYzMiIsCisgICAgICAgICAgICAgICAgICAgICB2NGkzMiwgdjRmMzIsIGZwX3RvX3NpbnQ+OworZGVmICBWQ1ZUZjJ1cSA6IE4yVlE8MGIxMSwgMGIxMSwgMGIxMCwgMGIxMSwgMGIwMTExMSwgMCwgInZjdnQiLCAidTMyLmYzMiIsCisgICAgICAgICAgICAgICAgICAgICB2NGkzMiwgdjRmMzIsIGZwX3RvX3VpbnQ+OworZGVmICBWQ1ZUczJmcSA6IE4yVlE8MGIxMSwgMGIxMSwgMGIxMCwgMGIxMSwgMGIwMTEwMCwgMCwgInZjdnQiLCAiZjMyLnMzMiIsCisgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjRpMzIsIHNpbnRfdG9fZnA+OworZGVmICBWQ1ZUdTJmcSA6IE4yVlE8MGIxMSwgMGIxMSwgMGIxMCwgMGIxMSwgMGIwMTEwMSwgMCwgInZjdnQiLCAiZjMyLnUzMiIsCisgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjRpMzIsIHVpbnRfdG9fZnA+OworCisvLyAgIFZDVlQgICAgIDogVmVjdG9yIENvbnZlcnQgQmV0d2VlbiBGbG9hdGluZy1Qb2ludCBhbmQgRml4ZWQtUG9pbnQuCitkZWYgVkNWVGYyeHNkIDogTjJWQ3Z0RDwwLCAxLCAwYjExMTEsIDAsIDEsICJ2Y3Z0IiwgInMzMi5mMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjJpMzIsIHYyZjMyLCBpbnRfYXJtX25lb25fdmN2dGZwMmZ4cz47CitkZWYgVkNWVGYyeHVkIDogTjJWQ3Z0RDwxLCAxLCAwYjExMTEsIDAsIDEsICJ2Y3Z0IiwgInUzMi5mMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjJpMzIsIHYyZjMyLCBpbnRfYXJtX25lb25fdmN2dGZwMmZ4dT47CitkZWYgVkNWVHhzMmZkIDogTjJWQ3Z0RDwwLCAxLCAwYjExMTAsIDAsIDEsICJ2Y3Z0IiwgImYzMi5zMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjJmMzIsIHYyaTMyLCBpbnRfYXJtX25lb25fdmN2dGZ4czJmcD47CitkZWYgVkNWVHh1MmZkIDogTjJWQ3Z0RDwxLCAxLCAwYjExMTAsIDAsIDEsICJ2Y3Z0IiwgImYzMi51MzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdjJmMzIsIHYyaTMyLCBpbnRfYXJtX25lb25fdmN2dGZ4dTJmcD47CisKK2RlZiBWQ1ZUZjJ4c3EgOiBOMlZDdnRRPDAsIDEsIDBiMTExMSwgMCwgMSwgInZjdnQiLCAiczMyLmYzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2NGkzMiwgdjRmMzIsIGludF9hcm1fbmVvbl92Y3Z0ZnAyZnhzPjsKK2RlZiBWQ1ZUZjJ4dXEgOiBOMlZDdnRRPDEsIDEsIDBiMTExMSwgMCwgMSwgInZjdnQiLCAidTMyLmYzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2NGkzMiwgdjRmMzIsIGludF9hcm1fbmVvbl92Y3Z0ZnAyZnh1PjsKK2RlZiBWQ1ZUeHMyZnEgOiBOMlZDdnRRPDAsIDEsIDBiMTExMCwgMCwgMSwgInZjdnQiLCAiZjMyLnMzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjRpMzIsIGludF9hcm1fbmVvbl92Y3Z0ZnhzMmZwPjsKK2RlZiBWQ1ZUeHUyZnEgOiBOMlZDdnRRPDEsIDEsIDBiMTExMCwgMCwgMSwgInZjdnQiLCAiZjMyLnUzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2NGYzMiwgdjRpMzIsIGludF9hcm1fbmVvbl92Y3Z0Znh1MmZwPjsKKworLy8gVmVjdG9yIFJldmVyc2UuCisKKy8vICAgVlJFVjY0ICAgOiBWZWN0b3IgUmV2ZXJzZSBlbGVtZW50cyB3aXRoaW4gNjQtYml0IGRvdWJsZXdvcmRzCisKK2NsYXNzIFZSRVY2NEQ8Yml0czwyPiBvcDE5XzE4LCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBUeT4KKyAgOiBOMlY8MGIxMSwgMGIxMSwgb3AxOV8xOCwgMGIwMCwgMGIwMDAwMCwgMCwgMCwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokc3JjKSwgSUlDX1ZNT1ZELCAKKyAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMiLCAiIiwKKyAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChUeSAoTkVPTnZyZXY2NCAoVHkgRFBSOiRzcmMpKSkpXT47CitjbGFzcyBWUkVWNjRRPGJpdHM8Mj4gb3AxOV8xOCwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBWYWx1ZVR5cGUgVHk+CisgIDogTjJWPDBiMTEsIDBiMTEsIG9wMTlfMTgsIDBiMDAsIDBiMDAwMDAsIDEsIDAsIChvdXRzIFFQUjokZHN0KSwKKyAgICAgICAgKGlucyBRUFI6JHNyYyksIElJQ19WTU9WRCwgCisgICAgICAgIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjIiwgIiIsCisgICAgICAgIFsoc2V0IFFQUjokZHN0LCAoVHkgKE5FT052cmV2NjQgKFR5IFFQUjokc3JjKSkpKV0+OworCitkZWYgVlJFVjY0ZDggIDogVlJFVjY0RDwwYjAwLCAidnJldjY0IiwgIjgiLCB2OGk4PjsKK2RlZiBWUkVWNjRkMTYgOiBWUkVWNjREPDBiMDEsICJ2cmV2NjQiLCAiMTYiLCB2NGkxNj47CitkZWYgVlJFVjY0ZDMyIDogVlJFVjY0RDwwYjEwLCAidnJldjY0IiwgIjMyIiwgdjJpMzI+OworZGVmIFZSRVY2NGRmICA6IFZSRVY2NEQ8MGIxMCwgInZyZXY2NCIsICIzMiIsIHYyZjMyPjsKKworZGVmIFZSRVY2NHE4ICA6IFZSRVY2NFE8MGIwMCwgInZyZXY2NCIsICI4IiwgdjE2aTg+OworZGVmIFZSRVY2NHExNiA6IFZSRVY2NFE8MGIwMSwgInZyZXY2NCIsICIxNiIsIHY4aTE2PjsKK2RlZiBWUkVWNjRxMzIgOiBWUkVWNjRRPDBiMTAsICJ2cmV2NjQiLCAiMzIiLCB2NGkzMj47CitkZWYgVlJFVjY0cWYgIDogVlJFVjY0UTwwYjEwLCAidnJldjY0IiwgIjMyIiwgdjRmMzI+OworCisvLyAgIFZSRVYzMiAgIDogVmVjdG9yIFJldmVyc2UgZWxlbWVudHMgd2l0aGluIDMyLWJpdCB3b3JkcworCitjbGFzcyBWUkVWMzJEPGJpdHM8Mj4gb3AxOV8xOCwgc3RyaW5nIE9wY29kZVN0ciwgc3RyaW5nIER0LCBWYWx1ZVR5cGUgVHk+CisgIDogTjJWPDBiMTEsIDBiMTEsIG9wMTlfMTgsIDBiMDAsIDBiMDAwMDEsIDAsIDAsIChvdXRzIERQUjokZHN0KSwKKyAgICAgICAgKGlucyBEUFI6JHNyYyksIElJQ19WTU9WRCwgCisgICAgICAgIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkc3JjIiwgIiIsCisgICAgICAgIFsoc2V0IERQUjokZHN0LCAoVHkgKE5FT052cmV2MzIgKFR5IERQUjokc3JjKSkpKV0+OworY2xhc3MgVlJFVjMyUTxiaXRzPDI+IG9wMTlfMTgsIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgVmFsdWVUeXBlIFR5PgorICA6IE4yVjwwYjExLCAwYjExLCBvcDE5XzE4LCAwYjAwLCAwYjAwMDAxLCAxLCAwLCAob3V0cyBRUFI6JGRzdCksCisgICAgICAgIChpbnMgUVBSOiRzcmMpLCBJSUNfVk1PVkQsIAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYyIsICIiLAorICAgICAgICBbKHNldCBRUFI6JGRzdCwgKFR5IChORU9OdnJldjMyIChUeSBRUFI6JHNyYykpKSldPjsKKworZGVmIFZSRVYzMmQ4ICA6IFZSRVYzMkQ8MGIwMCwgInZyZXYzMiIsICI4IiwgdjhpOD47CitkZWYgVlJFVjMyZDE2IDogVlJFVjMyRDwwYjAxLCAidnJldjMyIiwgIjE2IiwgdjRpMTY+OworCitkZWYgVlJFVjMycTggIDogVlJFVjMyUTwwYjAwLCAidnJldjMyIiwgIjgiLCB2MTZpOD47CitkZWYgVlJFVjMycTE2IDogVlJFVjMyUTwwYjAxLCAidnJldjMyIiwgIjE2IiwgdjhpMTY+OworCisvLyAgIFZSRVYxNiAgIDogVmVjdG9yIFJldmVyc2UgZWxlbWVudHMgd2l0aGluIDE2LWJpdCBoYWxmd29yZHMKKworY2xhc3MgVlJFVjE2RDxiaXRzPDI+IG9wMTlfMTgsIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBEdCwgVmFsdWVUeXBlIFR5PgorICA6IE4yVjwwYjExLCAwYjExLCBvcDE5XzE4LCAwYjAwLCAwYjAwMDEwLCAwLCAwLCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgIChpbnMgRFBSOiRzcmMpLCBJSUNfVk1PVkQsIAorICAgICAgICBPcGNvZGVTdHIsIER0LCAiJGRzdCwgJHNyYyIsICIiLAorICAgICAgICBbKHNldCBEUFI6JGRzdCwgKFR5IChORU9OdnJldjE2IChUeSBEUFI6JHNyYykpKSldPjsKK2NsYXNzIFZSRVYxNlE8Yml0czwyPiBvcDE5XzE4LCBzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBUeT4KKyAgOiBOMlY8MGIxMSwgMGIxMSwgb3AxOV8xOCwgMGIwMCwgMGIwMDAxMCwgMSwgMCwgKG91dHMgUVBSOiRkc3QpLAorICAgICAgICAoaW5zIFFQUjokc3JjKSwgSUlDX1ZNT1ZELCAKKyAgICAgICAgT3Bjb2RlU3RyLCBEdCwgIiRkc3QsICRzcmMiLCAiIiwKKyAgICAgICAgWyhzZXQgUVBSOiRkc3QsIChUeSAoTkVPTnZyZXYxNiAoVHkgUVBSOiRzcmMpKSkpXT47CisKK2RlZiBWUkVWMTZkOCAgOiBWUkVWMTZEPDBiMDAsICJ2cmV2MTYiLCAiOCIsIHY4aTg+OworZGVmIFZSRVYxNnE4ICA6IFZSRVYxNlE8MGIwMCwgInZyZXYxNiIsICI4IiwgdjE2aTg+OworCisvLyBPdGhlciBWZWN0b3IgU2h1ZmZsZXMuCisKKy8vICAgVkVYVCAgICAgOiBWZWN0b3IgRXh0cmFjdAorCitjbGFzcyBWRVhUZDxzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBUeT4KKyAgOiBOM1Y8MCwxLDBiMTEsez8sPyw/LD99LDAsMCwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokbGhzLCBEUFI6JHJocywgaTMyaW1tOiRpbmRleCksIE5WRXh0RnJtLAorICAgICAgICBJSUNfVkVYVEQsIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkbGhzLCAkcmhzLCAkaW5kZXgiLCAiIiwKKyAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChUeSAoTkVPTnZleHQgKFR5IERQUjokbGhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFR5IERQUjokcmhzKSwgaW1tOiRpbmRleCkpKV0+OworCitjbGFzcyBWRVhUcTxzdHJpbmcgT3Bjb2RlU3RyLCBzdHJpbmcgRHQsIFZhbHVlVHlwZSBUeT4KKyAgOiBOM1Y8MCwxLDBiMTEsez8sPyw/LD99LDEsMCwgKG91dHMgUVBSOiRkc3QpLAorICAgICAgICAoaW5zIFFQUjokbGhzLCBRUFI6JHJocywgaTMyaW1tOiRpbmRleCksIE5WRXh0RnJtLAorICAgICAgICBJSUNfVkVYVFEsIE9wY29kZVN0ciwgRHQsICIkZHN0LCAkbGhzLCAkcmhzLCAkaW5kZXgiLCAiIiwKKyAgICAgICAgWyhzZXQgUVBSOiRkc3QsIChUeSAoTkVPTnZleHQgKFR5IFFQUjokbGhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFR5IFFQUjokcmhzKSwgaW1tOiRpbmRleCkpKV0+OworCitkZWYgVkVYVGQ4ICA6IFZFWFRkPCJ2ZXh0IiwgIjgiLCAgdjhpOD47CitkZWYgVkVYVGQxNiA6IFZFWFRkPCJ2ZXh0IiwgIjE2IiwgdjRpMTY+OworZGVmIFZFWFRkMzIgOiBWRVhUZDwidmV4dCIsICIzMiIsIHYyaTMyPjsKK2RlZiBWRVhUZGYgIDogVkVYVGQ8InZleHQiLCAiMzIiLCB2MmYzMj47CisKK2RlZiBWRVhUcTggIDogVkVYVHE8InZleHQiLCAiOCIsICB2MTZpOD47CitkZWYgVkVYVHExNiA6IFZFWFRxPCJ2ZXh0IiwgIjE2IiwgdjhpMTY+OworZGVmIFZFWFRxMzIgOiBWRVhUcTwidmV4dCIsICIzMiIsIHY0aTMyPjsKK2RlZiBWRVhUcWYgIDogVkVYVHE8InZleHQiLCAiMzIiLCB2NGYzMj47CisKKy8vICAgVlRSTiAgICAgOiBWZWN0b3IgVHJhbnNwb3NlCisKK2RlZiAgVlRSTmQ4ICAgOiBOMlZEU2h1ZmZsZTwwYjAwLCAwYjAwMDAxLCAidnRybiIsICI4Ij47CitkZWYgIFZUUk5kMTYgIDogTjJWRFNodWZmbGU8MGIwMSwgMGIwMDAwMSwgInZ0cm4iLCAiMTYiPjsKK2RlZiAgVlRSTmQzMiAgOiBOMlZEU2h1ZmZsZTwwYjEwLCAwYjAwMDAxLCAidnRybiIsICIzMiI+OworCitkZWYgIFZUUk5xOCAgIDogTjJWUVNodWZmbGU8MGIwMCwgMGIwMDAwMSwgSUlDX1ZQRVJNUSwgInZ0cm4iLCAiOCI+OworZGVmICBWVFJOcTE2ICA6IE4yVlFTaHVmZmxlPDBiMDEsIDBiMDAwMDEsIElJQ19WUEVSTVEsICJ2dHJuIiwgIjE2Ij47CitkZWYgIFZUUk5xMzIgIDogTjJWUVNodWZmbGU8MGIxMCwgMGIwMDAwMSwgSUlDX1ZQRVJNUSwgInZ0cm4iLCAiMzIiPjsKKworLy8gICBWVVpQICAgICA6IFZlY3RvciBVbnppcCAoRGVpbnRlcmxlYXZlKQorCitkZWYgIFZVWlBkOCAgIDogTjJWRFNodWZmbGU8MGIwMCwgMGIwMDAxMCwgInZ1enAiLCAiOCI+OworZGVmICBWVVpQZDE2ICA6IE4yVkRTaHVmZmxlPDBiMDEsIDBiMDAwMTAsICJ2dXpwIiwgIjE2Ij47CitkZWYgIFZVWlBkMzIgIDogTjJWRFNodWZmbGU8MGIxMCwgMGIwMDAxMCwgInZ1enAiLCAiMzIiPjsKKworZGVmICBWVVpQcTggICA6IE4yVlFTaHVmZmxlPDBiMDAsIDBiMDAwMTAsIElJQ19WUEVSTVEzLCAidnV6cCIsICI4Ij47CitkZWYgIFZVWlBxMTYgIDogTjJWUVNodWZmbGU8MGIwMSwgMGIwMDAxMCwgSUlDX1ZQRVJNUTMsICJ2dXpwIiwgIjE2Ij47CitkZWYgIFZVWlBxMzIgIDogTjJWUVNodWZmbGU8MGIxMCwgMGIwMDAxMCwgSUlDX1ZQRVJNUTMsICJ2dXpwIiwgIjMyIj47CisKKy8vICAgVlpJUCAgICAgOiBWZWN0b3IgWmlwIChJbnRlcmxlYXZlKQorCitkZWYgIFZaSVBkOCAgIDogTjJWRFNodWZmbGU8MGIwMCwgMGIwMDAxMSwgInZ6aXAiLCAiOCI+OworZGVmICBWWklQZDE2ICA6IE4yVkRTaHVmZmxlPDBiMDEsIDBiMDAwMTEsICJ2emlwIiwgIjE2Ij47CitkZWYgIFZaSVBkMzIgIDogTjJWRFNodWZmbGU8MGIxMCwgMGIwMDAxMSwgInZ6aXAiLCAiMzIiPjsKKworZGVmICBWWklQcTggICA6IE4yVlFTaHVmZmxlPDBiMDAsIDBiMDAwMTEsIElJQ19WUEVSTVEzLCAidnppcCIsICI4Ij47CitkZWYgIFZaSVBxMTYgIDogTjJWUVNodWZmbGU8MGIwMSwgMGIwMDAxMSwgSUlDX1ZQRVJNUTMsICJ2emlwIiwgIjE2Ij47CitkZWYgIFZaSVBxMzIgIDogTjJWUVNodWZmbGU8MGIxMCwgMGIwMDAxMSwgSUlDX1ZQRVJNUTMsICJ2emlwIiwgIjMyIj47CisKKy8vIFZlY3RvciBUYWJsZSBMb29rdXAgYW5kIFRhYmxlIEV4dGVuc2lvbi4KKworLy8gICBWVEJMICAgICA6IFZlY3RvciBUYWJsZSBMb29rdXAKK2RlZiAgVlRCTDEKKyAgOiBOM1Y8MSwxLDBiMTEsMGIxMDAwLDAsMCwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokdGJsMSwgRFBSOiRzcmMpLCBOVlRCTEZybSwgSUlDX1ZUQjEsCisgICAgICAgICJ2dGJsIiwgIjgiLCAiJGRzdCwgXFx7JHRibDFcXH0sICRzcmMiLCAiIiwKKyAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2OGk4IChpbnRfYXJtX25lb25fdnRibDEgRFBSOiR0YmwxLCBEUFI6JHNyYykpKV0+OworbGV0IGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEgPSAxIGluIHsKK2RlZiAgVlRCTDIKKyAgOiBOM1Y8MSwxLDBiMTEsMGIxMDAxLDAsMCwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokdGJsMSwgRFBSOiR0YmwyLCBEUFI6JHNyYyksIE5WVEJMRnJtLCBJSUNfVlRCMiwKKyAgICAgICAgInZ0YmwiLCAiOCIsICIkZHN0LCBcXHskdGJsMSwgJHRibDJcXH0sICRzcmMiLCAiIiwgW10+OworZGVmICBWVEJMMworICA6IE4zVjwxLDEsMGIxMSwwYjEwMTAsMCwwLCAob3V0cyBEUFI6JGRzdCksCisgICAgICAgIChpbnMgRFBSOiR0YmwxLCBEUFI6JHRibDIsIERQUjokdGJsMywgRFBSOiRzcmMpLCBOVlRCTEZybSwgSUlDX1ZUQjMsCisgICAgICAgICJ2dGJsIiwgIjgiLCAiJGRzdCwgXFx7JHRibDEsICR0YmwyLCAkdGJsM1xcfSwgJHNyYyIsICIiLCBbXT47CitkZWYgIFZUQkw0CisgIDogTjNWPDEsMSwwYjExLDBiMTAxMSwwLDAsIChvdXRzIERQUjokZHN0KSwKKyAgICAgICAgKGlucyBEUFI6JHRibDEsIERQUjokdGJsMiwgRFBSOiR0YmwzLCBEUFI6JHRibDQsIERQUjokc3JjKSwKKyAgICAgICAgTlZUQkxGcm0sIElJQ19WVEI0LAorICAgICAgICAidnRibCIsICI4IiwgIiRkc3QsIFxceyR0YmwxLCAkdGJsMiwgJHRibDMsICR0Ymw0XFx9LCAkc3JjIiwgIiIsIFtdPjsKK30gLy8gaGFzRXh0cmFTcmNSZWdBbGxvY1JlcSA9IDEKKworLy8gICBWVEJYICAgICA6IFZlY3RvciBUYWJsZSBFeHRlbnNpb24KK2RlZiAgVlRCWDEKKyAgOiBOM1Y8MSwxLDBiMTEsMGIxMDAwLDEsMCwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokb3JpZywgRFBSOiR0YmwxLCBEUFI6JHNyYyksIE5WVEJMRnJtLCBJSUNfVlRCWDEsCisgICAgICAgICJ2dGJ4IiwgIjgiLCAiJGRzdCwgXFx7JHRibDFcXH0sICRzcmMiLCAiJG9yaWcgPSAkZHN0IiwKKyAgICAgICAgWyhzZXQgRFBSOiRkc3QsICh2OGk4IChpbnRfYXJtX25lb25fdnRieDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUFI6JG9yaWcsIERQUjokdGJsMSwgRFBSOiRzcmMpKSldPjsKK2xldCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxID0gMSBpbiB7CitkZWYgIFZUQlgyCisgIDogTjNWPDEsMSwwYjExLDBiMTAwMSwxLDAsIChvdXRzIERQUjokZHN0KSwKKyAgICAgICAgKGlucyBEUFI6JG9yaWcsIERQUjokdGJsMSwgRFBSOiR0YmwyLCBEUFI6JHNyYyksIE5WVEJMRnJtLCBJSUNfVlRCWDIsCisgICAgICAgICJ2dGJ4IiwgIjgiLCAiJGRzdCwgXFx7JHRibDEsICR0YmwyXFx9LCAkc3JjIiwgIiRvcmlnID0gJGRzdCIsIFtdPjsKK2RlZiAgVlRCWDMKKyAgOiBOM1Y8MSwxLDBiMTEsMGIxMDEwLDEsMCwgKG91dHMgRFBSOiRkc3QpLAorICAgICAgICAoaW5zIERQUjokb3JpZywgRFBSOiR0YmwxLCBEUFI6JHRibDIsIERQUjokdGJsMywgRFBSOiRzcmMpLAorICAgICAgICBOVlRCTEZybSwgSUlDX1ZUQlgzLAorICAgICAgICAidnRieCIsICI4IiwgIiRkc3QsIFxceyR0YmwxLCAkdGJsMiwgJHRibDNcXH0sICRzcmMiLAorICAgICAgICAiJG9yaWcgPSAkZHN0IiwgW10+OworZGVmICBWVEJYNAorICA6IE4zVjwxLDEsMGIxMSwwYjEwMTEsMSwwLCAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRvcmlnLCBEUFI6JHRibDEsCisgICAgICAgIERQUjokdGJsMiwgRFBSOiR0YmwzLCBEUFI6JHRibDQsIERQUjokc3JjKSwgTlZUQkxGcm0sIElJQ19WVEJYNCwKKyAgICAgICAgInZ0YngiLCAiOCIsICIkZHN0LCBcXHskdGJsMSwgJHRibDIsICR0YmwzLCAkdGJsNFxcfSwgJHNyYyIsCisgICAgICAgICIkb3JpZyA9ICRkc3QiLCBbXT47Cit9IC8vIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEgPSAxCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBORU9OIGluc3RydWN0aW9ucyBmb3Igc2luZ2xlLXByZWNpc2lvbiBGUCBtYXRoCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBOMlZTUGF0PFNETm9kZSBPcE5vZGUsIFZhbHVlVHlwZSBSZXNUeSwgVmFsdWVUeXBlIE9wVHksIE5lb25JIEluc3Q+CisgIDogTkVPTkZQUGF0PChSZXNUeSAoT3BOb2RlIFNQUjokYSkpLAorICAgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKE9wVHkgKEluc3QgKElOU0VSVF9TVUJSRUcgKE9wVHkgKElNUExJQ0lUX0RFRikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQUjokYSwgc3N1Yl8wKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N1Yl8wKT47CisKK2NsYXNzIE4zVlNQYXQ8U0ROb2RlIE9wTm9kZSwgTmVvbkkgSW5zdD4KKyAgOiBORU9ORlBQYXQ8KGYzMiAoT3BOb2RlIFNQUjokYSwgU1BSOiRiKSksCisgICAgICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyAodjJmMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnN0IChJTlNFUlRfU1VCUkVHICh2MmYzMiAoSU1QTElDSVRfREVGKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUFI6JGEsIHNzdWJfMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5TRVJUX1NVQlJFRyAodjJmMzIgKElNUExJQ0lUX0RFRikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BSOiRiLCBzc3ViXzApKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3ViXzApPjsKKworY2xhc3MgTjNWU011bE9wUGF0PFNETm9kZSBNdWxOb2RlLCBTRE5vZGUgT3BOb2RlLCBOZW9uSSBJbnN0PgorICA6IE5FT05GUFBhdDwoZjMyIChPcE5vZGUgU1BSOiRhY2MsIChmMzIgKE11bE5vZGUgU1BSOiRhLCBTUFI6JGIpKSkpLAorICAgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKEluc3QgKElOU0VSVF9TVUJSRUcgKHYyZjMyIChJTVBMSUNJVF9ERUYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQUjokYWNjLCBzc3ViXzApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOU0VSVF9TVUJSRUcgKHYyZjMyIChJTVBMSUNJVF9ERUYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQUjokYSwgc3N1Yl8wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlNFUlRfU1VCUkVHICh2MmYzMiAoSU1QTElDSVRfREVGKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUFI6JGIsIHNzdWJfMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N1Yl8wKT47CisKKy8vIFRoZXNlIG5lZWQgc2VwYXJhdGUgaW5zdHJ1Y3Rpb25zIGJlY2F1c2UgdGhleSBtdXN0IHVzZSBEUFJfVkZQMiByZWdpc3RlcgorLy8gY2xhc3Mgd2hpY2ggaGF2ZSBTUFIgc3ViLXJlZ2lzdGVycy4KKworLy8gVmVjdG9yIEFkZCBPcGVyYXRpb25zIHVzZWQgZm9yIHNpbmdsZS1wcmVjaXNpb24gRlAKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbgorZGVmIFZBRERmZF9zZnAgOiBOM1ZTPDAsMCwwYjAwLDBiMTEwMSwwLCAidmFkZCIsICJmMzIiLCB2MmYzMiwgdjJmMzIsIGZhZGQsIDE+OworZGVmIDogTjNWU1BhdDxmYWRkLCBWQUREZmRfc2ZwPjsKKworLy8gVmVjdG9yIFN1YiBPcGVyYXRpb25zIHVzZWQgZm9yIHNpbmdsZS1wcmVjaXNpb24gRlAKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbgorZGVmIFZTVUJmZF9zZnAgOiBOM1ZTPDAsMCwwYjEwLDBiMTEwMSwwLCAidnN1YiIsICJmMzIiLCB2MmYzMiwgdjJmMzIsIGZzdWIsIDA+OworZGVmIDogTjNWU1BhdDxmc3ViLCBWU1VCZmRfc2ZwPjsKKworLy8gVmVjdG9yIE11bHRpcGx5IE9wZXJhdGlvbnMgdXNlZCBmb3Igc2luZ2xlLXByZWNpc2lvbiBGUAorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluCitkZWYgVk1VTGZkX3NmcCA6IE4zVlM8MSwwLDBiMDAsMGIxMTAxLDEsICJ2bXVsIiwgImYzMiIsIHYyZjMyLCB2MmYzMiwgZm11bCwgMT47CitkZWYgOiBOM1ZTUGF0PGZtdWwsIFZNVUxmZF9zZnA+OworCisvLyBWZWN0b3IgTXVsdGlwbHktQWNjdW11bGF0ZS9TdWJ0cmFjdCB1c2VkIGZvciBzaW5nbGUtcHJlY2lzaW9uIEZQCisvLyB2bWxbYXNdLmYzMiBjYW4gY2F1c2UgNC04IGN5Y2xlIHN0YWxscyBpbiBmb2xsb3dpbmcgQVNJTUQgaW5zdHJ1Y3Rpb25zLCBzbworLy8gd2Ugd2FudCB0byBhdm9pZCB0aGVtIGZvciBub3cuIGUuZy4sIGFsdGVybmF0aW5nIHZtbGEvdmFkZCBpbnN0cnVjdGlvbnMuCisKKy8vbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluCisvL2RlZiBWTUxBZmRfc2ZwIDogTjNWU011bE9wPDAsMCwwYjAwLDBiMTEwMSwxLCBJSUNfVk1BQ0QsICJ2bWxhIiwgImYzMiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyZjMyLCBmbXVsLCBmYWRkPjsKKy8vZGVmIDogTjNWU011bE9wUGF0PGZtdWwsIGZhZGQsIFZNTEFmZF9zZnA+OworCisvL2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbgorLy9kZWYgVk1MU2ZkX3NmcCA6IE4zVlNNdWxPcDwwLDAsMGIxMCwwYjExMDEsMSwgSUlDX1ZNQUNELCAidm1scyIsICJmMzIiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICB2MmYzMiwgZm11bCwgZnN1Yj47CisvL2RlZiA6IE4zVlNNdWxPcFBhdDxmbXVsLCBmc3ViLCBWTUxTZmRfc2ZwPjsKKworLy8gVmVjdG9yIEFic29sdXRlIHVzZWQgZm9yIHNpbmdsZS1wcmVjaXNpb24gRlAKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbgorZGVmICBWQUJTZmRfc2ZwIDogTjJWPDBiMTEsIDBiMTEsIDBiMTAsIDBiMDEsIDBiMDExMTAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSX1ZGUDI6JGRzdCksIChpbnMgRFBSX1ZGUDI6JHNyYyksIElJQ19WVU5BRCwKKyAgICAgICAgICAgICAgICAgICAgICAidmFicyIsICJmMzIiLCAiJGRzdCwgJHNyYyIsICIiLCBbXT47CitkZWYgOiBOMlZTUGF0PGZhYnMsIGYzMiwgdjJmMzIsIFZBQlNmZF9zZnA+OworCisvLyBWZWN0b3IgTmVnYXRlIHVzZWQgZm9yIHNpbmdsZS1wcmVjaXNpb24gRlAKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbgorZGVmICBWTkVHZmRfc2ZwIDogTjJWPDBiMTEsIDBiMTEsIDBiMTAsIDBiMDEsIDBiMDExMTEsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSX1ZGUDI6JGRzdCksIChpbnMgRFBSX1ZGUDI6JHNyYyksIElJQ19WVU5BRCwKKyAgICAgICAgICAgICAgICAgICAgICAidm5lZyIsICJmMzIiLCAiJGRzdCwgJHNyYyIsICIiLCBbXT47CitkZWYgOiBOMlZTUGF0PGZuZWcsIGYzMiwgdjJmMzIsIFZORUdmZF9zZnA+OworCisvLyBWZWN0b3IgTWF4aW11bSB1c2VkIGZvciBzaW5nbGUtcHJlY2lzaW9uIEZQCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4KK2RlZiBWTUFYZmRfc2ZwIDogTjNWPDAsIDAsIDBiMDAsIDBiMTExMSwgMCwgMCwgKG91dHMgRFBSX1ZGUDI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAoaW5zIERQUl9WRlAyOiRzcmMxLCBEUFJfVkZQMjokc3JjMiksIE4zUmVnRnJtLCBJSUNfVkJJTkQsCisgICAgICAgICAgICAgICAgICAgICAidm1heCIsICJmMzIiLCAiJGRzdCwgJHNyYzEsICRzcmMyIiwgIiIsIFtdPjsKK2RlZiA6IE4zVlNQYXQ8TkVPTmZtYXgsIFZNQVhmZF9zZnA+OworCisvLyBWZWN0b3IgTWluaW11bSB1c2VkIGZvciBzaW5nbGUtcHJlY2lzaW9uIEZQCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4KK2RlZiBWTUlOZmRfc2ZwIDogTjNWPDAsIDAsIDBiMDAsIDBiMTExMSwgMCwgMCwgKG91dHMgRFBSX1ZGUDI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAoaW5zIERQUl9WRlAyOiRzcmMxLCBEUFJfVkZQMjokc3JjMiksIE4zUmVnRnJtLCBJSUNfVkJJTkQsCisgICAgICAgICAgICAgICAgICAgICAidm1pbiIsICJmMzIiLCAiJGRzdCwgJHNyYzEsICRzcmMyIiwgIiIsIFtdPjsKK2RlZiA6IE4zVlNQYXQ8TkVPTmZtaW4sIFZNSU5mZF9zZnA+OworCisvLyBWZWN0b3IgQ29udmVydCBiZXR3ZWVuIHNpbmdsZS1wcmVjaXNpb24gRlAgYW5kIGludGVnZXIKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbgorZGVmICBWQ1ZUZjJzZF9zZnAgOiBOMlZTPDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDExMTAsIDAsICJ2Y3Z0IiwgInMzMi5mMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHYyaTMyLCB2MmYzMiwgZnBfdG9fc2ludD47CitkZWYgOiBOMlZTUGF0PGFybV9mdG9zaSwgZjMyLCB2MmYzMiwgVkNWVGYyc2Rfc2ZwPjsKKworbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluCitkZWYgIFZDVlRmMnVkX3NmcCA6IE4yVlM8MGIxMSwgMGIxMSwgMGIxMCwgMGIxMSwgMGIwMTExMSwgMCwgInZjdnQiLCAidTMyLmYzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdjJpMzIsIHYyZjMyLCBmcF90b191aW50PjsKK2RlZiA6IE4yVlNQYXQ8YXJtX2Z0b3VpLCBmMzIsIHYyZjMyLCBWQ1ZUZjJ1ZF9zZnA+OworCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4KK2RlZiAgVkNWVHMyZmRfc2ZwIDogTjJWUzwwYjExLCAwYjExLCAwYjEwLCAwYjExLCAwYjAxMTAwLCAwLCAidmN2dCIsICJmMzIuczMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2MmYzMiwgdjJpMzIsIHNpbnRfdG9fZnA+OworZGVmIDogTjJWU1BhdDxhcm1fc2l0b2YsIGYzMiwgdjJpMzIsIFZDVlRzMmZkX3NmcD47CisKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbgorZGVmICBWQ1ZUdTJmZF9zZnAgOiBOMlZTPDBiMTEsIDBiMTEsIDBiMTAsIDBiMTEsIDBiMDExMDEsIDAsICJ2Y3Z0IiwgImYzMi51MzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHYyZjMyLCB2MmkzMiwgdWludF90b19mcD47CitkZWYgOiBOMlZTUGF0PGFybV91aXRvZiwgZjMyLCB2MmkzMiwgVkNWVHUyZmRfc2ZwPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE5vbi1JbnN0cnVjdGlvbiBQYXR0ZXJucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gYml0X2NvbnZlcnQKK2RlZiA6IFBhdDwodjFpNjQgKGJpdGNvbnZlcnQgKHYyaTMyIERQUjokc3JjKSkpLCAodjFpNjQgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjFpNjQgKGJpdGNvbnZlcnQgKHY0aTE2IERQUjokc3JjKSkpLCAodjFpNjQgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjFpNjQgKGJpdGNvbnZlcnQgKHY4aTggIERQUjokc3JjKSkpLCAodjFpNjQgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjFpNjQgKGJpdGNvbnZlcnQgKGY2NCAgIERQUjokc3JjKSkpLCAodjFpNjQgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjFpNjQgKGJpdGNvbnZlcnQgKHYyZjMyIERQUjokc3JjKSkpLCAodjFpNjQgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJpMzIgKGJpdGNvbnZlcnQgKHYxaTY0IERQUjokc3JjKSkpLCAodjJpMzIgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJpMzIgKGJpdGNvbnZlcnQgKHY0aTE2IERQUjokc3JjKSkpLCAodjJpMzIgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJpMzIgKGJpdGNvbnZlcnQgKHY4aTggIERQUjokc3JjKSkpLCAodjJpMzIgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJpMzIgKGJpdGNvbnZlcnQgKGY2NCAgIERQUjokc3JjKSkpLCAodjJpMzIgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJpMzIgKGJpdGNvbnZlcnQgKHYyZjMyIERQUjokc3JjKSkpLCAodjJpMzIgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjRpMTYgKGJpdGNvbnZlcnQgKHYxaTY0IERQUjokc3JjKSkpLCAodjRpMTYgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjRpMTYgKGJpdGNvbnZlcnQgKHYyaTMyIERQUjokc3JjKSkpLCAodjRpMTYgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjRpMTYgKGJpdGNvbnZlcnQgKHY4aTggIERQUjokc3JjKSkpLCAodjRpMTYgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjRpMTYgKGJpdGNvbnZlcnQgKGY2NCAgIERQUjokc3JjKSkpLCAodjRpMTYgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjRpMTYgKGJpdGNvbnZlcnQgKHYyZjMyIERQUjokc3JjKSkpLCAodjRpMTYgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpOCAgKGJpdGNvbnZlcnQgKHYxaTY0IERQUjokc3JjKSkpLCAodjhpOCAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpOCAgKGJpdGNvbnZlcnQgKHYyaTMyIERQUjokc3JjKSkpLCAodjhpOCAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpOCAgKGJpdGNvbnZlcnQgKHY0aTE2IERQUjokc3JjKSkpLCAodjhpOCAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpOCAgKGJpdGNvbnZlcnQgKGY2NCAgIERQUjokc3JjKSkpLCAodjhpOCAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpOCAgKGJpdGNvbnZlcnQgKHYyZjMyIERQUjokc3JjKSkpLCAodjhpOCAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwoZjY0ICAgKGJpdGNvbnZlcnQgKHYxaTY0IERQUjokc3JjKSkpLCAoZjY0ICAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwoZjY0ICAgKGJpdGNvbnZlcnQgKHYyaTMyIERQUjokc3JjKSkpLCAoZjY0ICAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwoZjY0ICAgKGJpdGNvbnZlcnQgKHY0aTE2IERQUjokc3JjKSkpLCAoZjY0ICAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwoZjY0ICAgKGJpdGNvbnZlcnQgKHY4aTggIERQUjokc3JjKSkpLCAoZjY0ICAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwoZjY0ICAgKGJpdGNvbnZlcnQgKHYyZjMyIERQUjokc3JjKSkpLCAoZjY0ICAgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJmMzIgKGJpdGNvbnZlcnQgKGY2NCAgIERQUjokc3JjKSkpLCAodjJmMzIgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJmMzIgKGJpdGNvbnZlcnQgKHYxaTY0IERQUjokc3JjKSkpLCAodjJmMzIgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJmMzIgKGJpdGNvbnZlcnQgKHYyaTMyIERQUjokc3JjKSkpLCAodjJmMzIgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJmMzIgKGJpdGNvbnZlcnQgKHY0aTE2IERQUjokc3JjKSkpLCAodjJmMzIgRFBSOiRzcmMpPjsKK2RlZiA6IFBhdDwodjJmMzIgKGJpdGNvbnZlcnQgKHY4aTggIERQUjokc3JjKSkpLCAodjJmMzIgRFBSOiRzcmMpPjsKKworZGVmIDogUGF0PCh2Mmk2NCAoYml0Y29udmVydCAodjRpMzIgUVBSOiRzcmMpKSksICh2Mmk2NCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2Mmk2NCAoYml0Y29udmVydCAodjhpMTYgUVBSOiRzcmMpKSksICh2Mmk2NCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2Mmk2NCAoYml0Y29udmVydCAodjE2aTggUVBSOiRzcmMpKSksICh2Mmk2NCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2Mmk2NCAoYml0Y29udmVydCAodjJmNjQgUVBSOiRzcmMpKSksICh2Mmk2NCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2Mmk2NCAoYml0Y29udmVydCAodjRmMzIgUVBSOiRzcmMpKSksICh2Mmk2NCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjJpNjQgUVBSOiRzcmMpKSksICh2NGkzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjhpMTYgUVBSOiRzcmMpKSksICh2NGkzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjE2aTggUVBSOiRzcmMpKSksICh2NGkzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjJmNjQgUVBSOiRzcmMpKSksICh2NGkzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjRmMzIgUVBSOiRzcmMpKSksICh2NGkzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2OGkxNiAoYml0Y29udmVydCAodjJpNjQgUVBSOiRzcmMpKSksICh2OGkxNiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2OGkxNiAoYml0Y29udmVydCAodjRpMzIgUVBSOiRzcmMpKSksICh2OGkxNiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2OGkxNiAoYml0Y29udmVydCAodjE2aTggUVBSOiRzcmMpKSksICh2OGkxNiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2OGkxNiAoYml0Y29udmVydCAodjJmNjQgUVBSOiRzcmMpKSksICh2OGkxNiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2OGkxNiAoYml0Y29udmVydCAodjRmMzIgUVBSOiRzcmMpKSksICh2OGkxNiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MTZpOCAoYml0Y29udmVydCAodjJpNjQgUVBSOiRzcmMpKSksICh2MTZpOCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MTZpOCAoYml0Y29udmVydCAodjRpMzIgUVBSOiRzcmMpKSksICh2MTZpOCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MTZpOCAoYml0Y29udmVydCAodjhpMTYgUVBSOiRzcmMpKSksICh2MTZpOCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MTZpOCAoYml0Y29udmVydCAodjJmNjQgUVBSOiRzcmMpKSksICh2MTZpOCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MTZpOCAoYml0Y29udmVydCAodjRmMzIgUVBSOiRzcmMpKSksICh2MTZpOCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGYzMiAoYml0Y29udmVydCAodjJpNjQgUVBSOiRzcmMpKSksICh2NGYzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGYzMiAoYml0Y29udmVydCAodjRpMzIgUVBSOiRzcmMpKSksICh2NGYzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGYzMiAoYml0Y29udmVydCAodjhpMTYgUVBSOiRzcmMpKSksICh2NGYzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGYzMiAoYml0Y29udmVydCAodjE2aTggUVBSOiRzcmMpKSksICh2NGYzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2NGYzMiAoYml0Y29udmVydCAodjJmNjQgUVBSOiRzcmMpKSksICh2NGYzMiBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjJpNjQgUVBSOiRzcmMpKSksICh2MmY2NCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjRpMzIgUVBSOiRzcmMpKSksICh2MmY2NCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjhpMTYgUVBSOiRzcmMpKSksICh2MmY2NCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjE2aTggUVBSOiRzcmMpKSksICh2MmY2NCBRUFI6JHNyYyk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjRmMzIgUVBSOiRzcmMpKSksICh2MmY2NCBRUFI6JHNyYyk+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSW5zdHJUaHVtYi50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUluc3RyVGh1bWIudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2NGZlZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUluc3RyVGh1bWIudGQKQEAgLTAsMCArMSwxMDMxIEBACisvLz09PS0gQVJNSW5zdHJUaHVtYi50ZCAtIFRodW1iIHN1cHBvcnQgZm9yIEFSTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIFRodW1iIGluc3RydWN0aW9uIHNldC4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBUaHVtYiBzcGVjaWZpYyBEQUcgTm9kZXMuDQorLy8NCisNCitkZWYgQVJNdGNhbGwgOiBTRE5vZGU8IkFSTUlTRDo6dENBTEwiLCBTRFRfQVJNY2FsbCwNCisgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZywgU0ROUE91dEZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICBTRE5QVmFyaWFkaWNdPjsNCisNCitkZWYgaW1tX25lZ19YRk9STSA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KC0oaW50KU4tPmdldFpFeHRWYWx1ZSgpLCBNVlQ6OmkzMik7DQorfV0+Ow0KK2RlZiBpbW1fY29tcF9YRk9STSA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KH4oKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpKSwgTVZUOjppMzIpOw0KK31dPjsNCisNCisNCisvLy8gaW1tMF83IHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIDMyLWJpdCBpbW1lZGlhdGUgaXMgaW4gdGhlIHJhbmdlIFswLDddLg0KK2RlZiBpbW0wXzcgOiBQYXRMZWFmPChpMzIgaW1tKSwgW3sNCisgIHJldHVybiAodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkgPCA4Ow0KK31dPjsNCitkZWYgaW1tMF83X25lZyA6IFBhdExlYWY8KGkzMiBpbW0pLCBbew0KKyAgcmV0dXJuICh1aW50MzJfdCktTi0+Z2V0WkV4dFZhbHVlKCkgPCA4Ow0KK31dLCBpbW1fbmVnX1hGT1JNPjsNCisNCitkZWYgaW1tMF8yNTUgOiBQYXRMZWFmPChpMzIgaW1tKSwgW3sNCisgIHJldHVybiAodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkgPCAyNTY7DQorfV0+Ow0KK2RlZiBpbW0wXzI1NV9jb21wIDogUGF0TGVhZjwoaTMyIGltbSksIFt7DQorICByZXR1cm4gfigodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkpIDwgMjU2Ow0KK31dPjsNCisNCitkZWYgaW1tOF8yNTUgOiBQYXRMZWFmPChpMzIgaW1tKSwgW3sNCisgIHJldHVybiAodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkgPj0gOCAmJiAodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkgPCAyNTY7DQorfV0+Ow0KK2RlZiBpbW04XzI1NV9uZWcgOiBQYXRMZWFmPChpMzIgaW1tKSwgW3sNCisgIHVuc2lnbmVkIFZhbCA9IC1OLT5nZXRaRXh0VmFsdWUoKTsNCisgIHJldHVybiBWYWwgPj0gOCAmJiBWYWwgPCAyNTY7DQorfV0sIGltbV9uZWdfWEZPUk0+Ow0KKw0KKy8vIEJyZWFrIGltbSdzIHVwIGludG8gdHdvIHBpZWNlczogYW4gaW1tZWRpYXRlICsgYSBsZWZ0IHNoaWZ0Lg0KKy8vIFRoaXMgdXNlcyB0aHVtYl9pbW1zaGlmdGVkIHRvIG1hdGNoIGFuZCB0aHVtYl9pbW1zaGlmdGVkX3ZhbCBhbmQNCisvLyB0aHVtYl9pbW1zaGlmdGVkX3NoYW10IHRvIGdldCB0aGUgdmFsL3NoaWZ0IHBpZWNlcy4NCitkZWYgdGh1bWJfaW1tc2hpZnRlZCA6IFBhdExlYWY8KGltbSksIFt7DQorICByZXR1cm4gQVJNX0FNOjppc1RodW1iSW1tU2hpZnRlZFZhbCgodW5zaWduZWQpTi0+Z2V0WkV4dFZhbHVlKCkpOw0KK31dPjsNCisNCitkZWYgdGh1bWJfaW1tc2hpZnRlZF92YWwgOiBTRE5vZGVYRm9ybTxpbW0sIFt7DQorICB1bnNpZ25lZCBWID0gQVJNX0FNOjpnZXRUaHVtYkltbU5vblNoaWZ0ZWRWYWwoKHVuc2lnbmVkKU4tPmdldFpFeHRWYWx1ZSgpKTsNCisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KFYsIE1WVDo6aTMyKTsNCit9XT47DQorDQorZGVmIHRodW1iX2ltbXNoaWZ0ZWRfc2hhbXQgOiBTRE5vZGVYRm9ybTxpbW0sIFt7DQorICB1bnNpZ25lZCBWID0gQVJNX0FNOjpnZXRUaHVtYkltbVZhbFNoaWZ0KCh1bnNpZ25lZClOLT5nZXRaRXh0VmFsdWUoKSk7DQorICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChWLCBNVlQ6OmkzMik7DQorfV0+Ow0KKw0KKy8vIFNjYWxlZCA0IGltbWVkaWF0ZS4NCitkZWYgdF9pbW1fczQgOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VGh1bWJTNEltbU9wZXJhbmQiOw0KK30NCisNCisvLyBEZWZpbmUgVGh1bWIgc3BlY2lmaWMgYWRkcmVzc2luZyBtb2Rlcy4NCisNCisvLyB0X2FkZHJtb2RlX3JyIDo9IHJlZyArIHJlZw0KKy8vDQorZGVmIHRfYWRkcm1vZGVfcnIgOiBPcGVyYW5kPGkzMj4sDQorICAgICAgICAgICAgICAgICAgICBDb21wbGV4UGF0dGVybjxpMzIsIDIsICJTZWxlY3RUaHVtYkFkZHJNb2RlUlIiLCBbXT4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VGh1bWJBZGRyTW9kZVJST3BlcmFuZCI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgdEdQUjokYmFzZSwgdEdQUjokb2Zmc3JlZyk7DQorfQ0KKw0KKy8vIHRfYWRkcm1vZGVfczQgOj0gcmVnICsgcmVnDQorLy8gICAgICAgICAgICAgICAgICByZWcgKyBpbW01ICogNA0KKy8vDQorZGVmIHRfYWRkcm1vZGVfczQgOiBPcGVyYW5kPGkzMj4sDQorICAgICAgICAgICAgICAgICAgICBDb21wbGV4UGF0dGVybjxpMzIsIDMsICJTZWxlY3RUaHVtYkFkZHJNb2RlUzQiLCBbXT4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VGh1bWJBZGRyTW9kZVM0T3BlcmFuZCI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgdEdQUjokYmFzZSwgaTMyaW1tOiRvZmZzaW1tLCB0R1BSOiRvZmZzcmVnKTsNCit9DQorDQorLy8gdF9hZGRybW9kZV9zMiA6PSByZWcgKyByZWcNCisvLyAgICAgICAgICAgICAgICAgIHJlZyArIGltbTUgKiAyDQorLy8NCitkZWYgdF9hZGRybW9kZV9zMiA6IE9wZXJhbmQ8aTMyPiwNCisgICAgICAgICAgICAgICAgICAgIENvbXBsZXhQYXR0ZXJuPGkzMiwgMywgIlNlbGVjdFRodW1iQWRkck1vZGVTMiIsIFtdPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRUaHVtYkFkZHJNb2RlUzJPcGVyYW5kIjsNCisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyB0R1BSOiRiYXNlLCBpMzJpbW06JG9mZnNpbW0sIHRHUFI6JG9mZnNyZWcpOw0KK30NCisNCisvLyB0X2FkZHJtb2RlX3MxIDo9IHJlZyArIHJlZw0KKy8vICAgICAgICAgICAgICAgICAgcmVnICsgaW1tNQ0KKy8vDQorZGVmIHRfYWRkcm1vZGVfczEgOiBPcGVyYW5kPGkzMj4sDQorICAgICAgICAgICAgICAgICAgICBDb21wbGV4UGF0dGVybjxpMzIsIDMsICJTZWxlY3RUaHVtYkFkZHJNb2RlUzEiLCBbXT4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VGh1bWJBZGRyTW9kZVMxT3BlcmFuZCI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgdEdQUjokYmFzZSwgaTMyaW1tOiRvZmZzaW1tLCB0R1BSOiRvZmZzcmVnKTsNCit9DQorDQorLy8gdF9hZGRybW9kZV9zcCA6PSBzcCArIGltbTggKiA0DQorLy8NCitkZWYgdF9hZGRybW9kZV9zcCA6IE9wZXJhbmQ8aTMyPiwNCisgICAgICAgICAgICAgICAgICAgIENvbXBsZXhQYXR0ZXJuPGkzMiwgMiwgIlNlbGVjdFRodW1iQWRkck1vZGVTUCIsIFtdPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRUaHVtYkFkZHJNb2RlU1BPcGVyYW5kIjsNCisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBHUFI6JGJhc2UsIGkzMmltbTokb2Zmc2ltbSk7DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIE1pc2NlbGxhbmVvdXMgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorDQorLy8gRklYTUU6IE1hcmtpbmcgdGhlc2UgYXMgaGFzU2lkZUVmZmVjdHMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgbWFjaGluZSBEQ0UNCisvLyBmcm9tIHJlbW92aW5nIG9uZSBoYWxmIG9mIHRoZSBtYXRjaGVkIHBhaXJzLiBUaGF0IGJyZWFrcyBQRUksIHdoaWNoIGFzc3VtZXMNCisvLyB0aGVzZSB3aWxsIGFsd2F5cyBiZSBpbiBwYWlycywgYW5kIGFzc2VydHMgaWYgaXQgZmluZHMgb3RoZXJ3aXNlLiBCZXR0ZXIgd2F5Pw0KK2xldCBEZWZzID0gW1NQXSwgVXNlcyA9IFtTUF0sIGhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorZGVmIHRBREpDQUxMU1RBQ0tVUCA6DQorUHNldWRvSW5zdDwob3V0cyksIChpbnMgaTMyaW1tOiRhbXQxLCBpMzJpbW06JGFtdDIpLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICIkezpjb21tZW50fSB0QURKQ0FMTFNUQUNLVVAgJGFtdDEiLA0KKyAgICAgICAgICAgWyhBUk1jYWxsc2VxX2VuZCBpbW06JGFtdDEsIGltbTokYW10MildPiwgUmVxdWlyZXM8W0lzVGh1bWIxT25seV0+Ow0KKw0KK2RlZiB0QURKQ0FMTFNUQUNLRE9XTiA6DQorUHNldWRvSW5zdDwob3V0cyksIChpbnMgaTMyaW1tOiRhbXQpLCBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICIkezpjb21tZW50fSB0QURKQ0FMTFNUQUNLRE9XTiAkYW10IiwNCisgICAgICAgICAgIFsoQVJNY2FsbHNlcV9zdGFydCBpbW06JGFtdCldPiwgUmVxdWlyZXM8W0lzVGh1bWIxT25seV0+Ow0KK30NCisNCitkZWYgdE5PUCA6IFQxcEk8KG91dHMpLCAoaW5zKSwgTm9JdGluZXJhcnksICJub3AiLCAiIiwNCisgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgIFQxRW5jb2Rpbmc8MGIxMDExMTE+IHsNCisgIGxldCBJbnN0ezktOH0gPSAwYjExOw0KKyAgbGV0IEluc3R7Ny0wfSA9IDBiMDAwMDAwMDA7DQorfSANCisNCitkZWYgdFlJRUxEIDogVDFwSTwob3V0cyksIChpbnMpLCBOb0l0aW5lcmFyeSwgInlpZWxkIiwgIiIsDQorICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiwNCisgICAgICAgICAgICAgVDFFbmNvZGluZzwwYjEwMTExMT4gew0KKyAgbGV0IEluc3R7OS04fSA9IDBiMTE7DQorICBsZXQgSW5zdHs3LTB9ID0gMGIwMDAxMDAwMDsNCit9IA0KKw0KK2RlZiB0V0ZFIDogVDFwSTwob3V0cyksIChpbnMpLCBOb0l0aW5lcmFyeSwgIndmZSIsICIiLA0KKyAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICAgVDFFbmNvZGluZzwwYjEwMTExMT4gew0KKyAgbGV0IEluc3R7OS04fSA9IDBiMTE7DQorICBsZXQgSW5zdHs3LTB9ID0gMGIwMDEwMDAwMDsNCit9IA0KKw0KK2RlZiB0V0ZJIDogVDFwSTwob3V0cyksIChpbnMpLCBOb0l0aW5lcmFyeSwgIndmaSIsICIiLA0KKyAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICAgVDFFbmNvZGluZzwwYjEwMTExMT4gew0KKyAgbGV0IEluc3R7OS04fSA9IDBiMTE7DQorICBsZXQgSW5zdHs3LTB9ID0gMGIwMDExMDAwMDsNCit9IA0KKw0KK2RlZiB0U0VWIDogVDFwSTwob3V0cyksIChpbnMpLCBOb0l0aW5lcmFyeSwgInNldiIsICIiLA0KKyAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICAgVDFFbmNvZGluZzwwYjEwMTExMT4gew0KKyAgbGV0IEluc3R7OS04fSA9IDBiMTE7DQorICBsZXQgSW5zdHs3LTB9ID0gMGIwMTAwMDAwMDsNCit9IA0KKw0KK2RlZiB0U0VURU5EQkUgOiBUMUk8KG91dHMpLCAoaW5zKSwgTm9JdGluZXJhcnksICJzZXRlbmRcdGJlIiwNCisgICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4sDQorICAgICAgICAgICAgICAgIFQxRW5jb2Rpbmc8MGIxMDExMDE+IHsNCisgIGxldCBJbnN0ezktNX0gPSAwYjEwMDEwOw0KKyAgbGV0IEluc3R7M30gPSAxOw0KK30NCisNCitkZWYgdFNFVEVORExFIDogVDFJPChvdXRzKSwgKGlucyksIE5vSXRpbmVyYXJ5LCAic2V0ZW5kXHRsZSIsDQorICAgICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICAgICAgICBUMUVuY29kaW5nPDBiMTAxMTAxPiB7DQorICBsZXQgSW5zdHs5LTV9ID0gMGIxMDAxMDsNCisgIGxldCBJbnN0ezN9ID0gMDsNCit9DQorDQorLy8gVGhlIGkzMmltbSBvcGVyYW5kICR2YWwgY2FuIGJlIHVzZWQgYnkgYSBkZWJ1Z2dlciB0byBzdG9yZSBtb3JlIGluZm9ybWF0aW9uDQorLy8gYWJvdXQgdGhlIGJyZWFrcG9pbnQuDQorZGVmIHRCS1BUIDogVDFJPChvdXRzKSwgKGlucyBpMzJpbW06JHZhbCksIE5vSXRpbmVyYXJ5LCAiYmtwdFx0JHZhbCIsDQorICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4sDQorICAgICAgICAgICAgVDFFbmNvZGluZzwwYjEwMTExMT4gew0KKyAgbGV0IEluc3R7OS04fSA9IDBiMTA7DQorfQ0KKw0KKy8vIENoYW5nZSBQcm9jZXNzb3IgU3RhdGUgaXMgYSBzeXN0ZW0gaW5zdHJ1Y3Rpb24gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkuDQorLy8gVGhlIHNpbmdsZXRvbiAkb3B0IG9wZXJhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoNCisvLyBvcHR7NC0wfSA9IG1vZGUgPT0+IGRvbid0IGNhcmUNCisvLyBvcHR7NX0gPSBjaGFuZ2Vtb2RlID09PiAwIChmYWxzZSBmb3IgMTYtYml0IFRodW1iIGluc3RyKQ0KKy8vIG9wdHs4LTZ9ID0gQUlGIGZyb20gSW5zdHsyLTB9DQorLy8gb3B0ezEwLTl9ID0gMTppbW9kIGZyb20gSW5zdHs0fSB3aXRoIDBiMTAgYXMgZW5hYmxlIGFuZCAwYjExIGFzIGRpc2FibGUNCisvLw0KKy8vIFRoZSBvcHR7NC0wfSBhbmQgb3B0ezV9IHN1Yi1maWVsZHMgYXJlIHRvIGFjY29tbW9kYXRlIDMyLWJpdCBUaHVtYiBhbmQgQVJNDQorLy8gQ1BTIHdoaWNoIGhhcyBtb3JlIG9wdGlvbnMuDQorZGVmIHRDUFMgOiBUMUk8KG91dHMpLCAoaW5zIGNwc19vcHQ6JG9wdCksIE5vSXRpbmVyYXJ5LCAiY3BzJG9wdCIsDQorICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+LA0KKyAgICAgICAgICAgVDFNaXNjPDBiMDExMDAxMT47DQorDQorLy8gRm9yIGJvdGggdGh1bWIxIGFuZCB0aHVtYjIuDQorbGV0IGlzTm90RHVwbGljYWJsZSA9IDEgaW4NCitkZWYgdFBJQ0FERCA6IFRJdDwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRsaHMsIHBjbGFiZWw6JGNwKSwgSUlDX2lBTFVyLA0KKyAgICAgICAgICAgICAgICAgIlxuJGNwOlxuXHRhZGRcdCRkc3QsIHBjIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoQVJNcGljX2FkZCBHUFI6JGxocywgaW1tOiRjcCkpXT4sDQorICAgICAgICAgICAgICBUMVNwZWNpYWw8ezAsMCw/LD99PiB7DQorICBsZXQgSW5zdHs2LTN9ID0gMGIxMTExOyAvLyBBOC42LjYgUm0gPSBwYw0KK30NCisNCisvLyBQQyByZWxhdGl2ZSBhZGQuDQorZGVmIHRBRERyUENpIDogVDFJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgdF9pbW1fczQ6JHJocyksIElJQ19pQUxVaSwNCisgICAgICAgICAgICAgICAgICAiYWRkXHQkZHN0LCBwYywgJHJocyIsIFtdPiwNCisgICAgICAgICAgICAgICBUMUVuY29kaW5nPHsxLDAsMSwwLDAsP30+OyAvLyBBNi4yICYgQTguNi4xMA0KKw0KKy8vIEFERCByZCwgc3AsICNpbW04DQorZGVmIHRBRERyU1BpIDogVDFJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgR1BSOiRzcCwgdF9pbW1fczQ6JHJocyksIElJQ19pQUxVaSwNCisgICAgICAgICAgICAgICAgICAiYWRkXHQkZHN0LCAkc3AsICRyaHMiLCBbXT4sDQorICAgICAgICAgICAgICAgVDFFbmNvZGluZzx7MSwwLDEsMCwxLD99PjsgLy8gQTYuMiAmIEE4LjYuOA0KKw0KKy8vIEFERCBzcCwgc3AsICNpbW03DQorZGVmIHRBRERzcGkgOiBUSXQ8KG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokbGhzLCB0X2ltbV9zNDokcmhzKSwgSUlDX2lBTFVpLA0KKyAgICAgICAgICAgICAgICAgICJhZGRcdCRkc3QsICRyaHMiLCBbXT4sDQorICAgICAgICAgICAgICBUMU1pc2M8ezAsMCwwLDAsMCw/LD99PjsgLy8gQTYuMi41ICYgQTguNi44DQorDQorLy8gU1VCIHNwLCBzcCwgI2ltbTcNCitkZWYgdFNVQnNwaSA6IFRJdDwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRsaHMsIHRfaW1tX3M0OiRyaHMpLCBJSUNfaUFMVWksDQorICAgICAgICAgICAgICAgICAgInN1Ylx0JGRzdCwgJHJocyIsIFtdPiwNCisgICAgICAgICAgICAgIFQxTWlzYzx7MCwwLDAsMCwxLD8sP30+OyAvLyBBNi4yLjUgJiBBOC42LjIxNQ0KKw0KKy8vIEFERCBybSwgc3ANCitkZWYgdEFERHJTUCA6IFRJdDwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRsaHMsIEdQUjokcmhzKSwgSUlDX2lBTFVyLA0KKyAgICAgICAgICAgICAgICAgICJhZGRcdCRkc3QsICRyaHMiLCBbXT4sDQorICAgICAgICAgICAgICBUMVNwZWNpYWw8ezAsMCw/LD99PiB7DQorICBsZXQgSW5zdHs2LTN9ID0gMGIxMTAxOyAvLyBBOC42LjkgRW5jb2RpbmcgVDENCit9DQorDQorLy8gQUREIHNwLCBybQ0KK2RlZiB0QUREc3ByIDogVEl0PChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGxocywgR1BSOiRyaHMpLCBJSUNfaUFMVXIsDQorICAgICAgICAgICAgICAgICAgImFkZFx0JGRzdCwgJHJocyIsIFtdPiwNCisgICAgICAgICAgICAgIFQxU3BlY2lhbDx7MCwwLD8sP30+IHsNCisgIC8vIEE4LjYuOSBFbmNvZGluZyBUMg0KKyAgbGV0IEluc3R7N30gPSAxOw0KKyAgbGV0IEluc3R7Mi0wfSA9IDBiMTAxOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBDb250cm9sIEZsb3cgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorDQorbGV0IGlzUmV0dXJuID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSBpbiB7DQorICBkZWYgdEJYX1JFVCA6IFRJPChvdXRzKSwgKGlucyksIElJQ19CciwgImJ4XHRsciIsIFsoQVJNcmV0ZmxhZyldPiwNCisgICAgICAgICAgICAgICAgVDFTcGVjaWFsPHsxLDEsMCw/fT4geyAvLyBBNi4yLjMgJiBBOC42LjI1DQorICAgIGxldCBJbnN0ezYtM30gPSAwYjExMTA7IC8vIFJtID0gbHINCisgIH0NCisgIC8vIEFsdGVybmF0aXZlIHJldHVybiBpbnN0cnVjdGlvbiB1c2VkIGJ5IHZhcmFyZyBmdW5jdGlvbnMuDQorICBkZWYgdEJYX1JFVF92YXJhcmcgOiBUSTwob3V0cyksIChpbnMgdEdQUjokdGFyZ2V0KSwgSUlDX0JyLCAiYnhcdCR0YXJnZXQiLFtdPiwNCisgICAgICAgICAgICAgICAgICAgICAgIFQxU3BlY2lhbDx7MSwxLDAsP30+OyAvLyBBNi4yLjMgJiBBOC42LjI1DQorfQ0KKw0KKy8vIEluZGlyZWN0IGJyYW5jaGVzDQorbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSwgaXNJbmRpcmVjdEJyYW5jaCA9IDEgaW4gew0KKyAgZGVmIHRCUklORCA6IFRJPChvdXRzKSwgKGlucyBHUFI6JGRzdCksIElJQ19CciwgIm1vdlx0cGMsICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoYnJpbmQgR1BSOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgVDFTcGVjaWFsPHsxLDAsMSw/fT4gew0KKyAgICAvLyA8UmQ+ID0gSW5zdHs3OjItMH0gPSBwYw0KKyAgICBsZXQgSW5zdHsyLTB9ID0gMGIxMTE7DQorICB9DQorfQ0KKw0KKy8vIEZJWE1FOiByZW1vdmUgd2hlbiB3ZSBoYXZlIGEgd2F5IHRvIG1hcmtpbmcgYSBNSSB3aXRoIHRoZXNlIHByb3BlcnRpZXMuDQorbGV0IGlzUmV0dXJuID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSwgbWF5TG9hZCA9IDEsDQorICAgIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgPSAxIGluDQorZGVmIHRQT1BfUkVUIDogVDFJPChvdXRzKSwgKGlucyBwcmVkOiRwLCByZWdsaXN0OiRkc3RzLCB2YXJpYWJsZV9vcHMpLCBJSUNfQnIsDQorICAgICAgICAgICAgICAgICAgICJwb3Ake3B9XHQkZHN0cyIsIFtdPiwNCisgICAgICAgICAgICAgICBUMU1pc2M8ezEsMSwwLD8sPyw/LD99PjsNCisNCitsZXQgaXNDYWxsID0gMSwNCisgIERlZnMgPSBbUjAsICBSMSwgIFIyLCAgUjMsICBSMTIsIExSLA0KKyAgICAgICAgICBEMCwgIEQxLCAgRDIsICBEMywgIEQ0LCAgRDUsICBENiwgIEQ3LA0KKyAgICAgICAgICBEMTYsIEQxNywgRDE4LCBEMTksIEQyMCwgRDIxLCBEMjIsIEQyMywNCisgICAgICAgICAgRDI0LCBEMjUsIEQyNiwgRDI3LCBEMjgsIEQyOSwgRDMwLCBEMzEsIENQU1IsIEZQU0NSXSBpbiB7DQorICAvLyBBbHNvIHVzZWQgZm9yIFRodW1iMg0KKyAgZGVmIHRCTCAgOiBUSXgyPDBiMTExMTAsIDBiMTEsIDEsDQorICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkzMmltbTokZnVuYywgdmFyaWFibGVfb3BzKSwgSUlDX0JyLA0KKyAgICAgICAgICAgICAgICAgICJibFx0JHtmdW5jOmNhbGx9IiwNCisgICAgICAgICAgICAgICAgICBbKEFSTXRjYWxsIHRnbG9iYWxhZGRyOiRmdW5jKV0+LA0KKyAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYiwgSXNOb3REYXJ3aW5dPjsNCisNCisgIC8vIEFSTXY1VCBhbmQgYWJvdmUsIGFsc28gdXNlZCBmb3IgVGh1bWIyDQorICBkZWYgdEJMWGkgOiBUSXgyPDBiMTExMTAsIDBiMTEsIDAsDQorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMzJpbW06JGZ1bmMsIHZhcmlhYmxlX29wcyksIElJQ19CciwNCisgICAgICAgICAgICAgICAgICAgImJseFx0JHtmdW5jOmNhbGx9IiwNCisgICAgICAgICAgICAgICAgICAgWyhBUk1jYWxsIHRnbG9iYWxhZGRyOiRmdW5jKV0+LA0KKyAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzVGh1bWIsIEhhc1Y1VCwgSXNOb3REYXJ3aW5dPjsNCisNCisgIC8vIEFsc28gdXNlZCBmb3IgVGh1bWIyDQorICBkZWYgdEJMWHIgOiBUSTwob3V0cyksIChpbnMgR1BSOiRmdW5jLCB2YXJpYWJsZV9vcHMpLCBJSUNfQnIsDQorICAgICAgICAgICAgICAgICAgImJseFx0JGZ1bmMiLA0KKyAgICAgICAgICAgICAgICAgIFsoQVJNdGNhbGwgR1BSOiRmdW5jKV0+LA0KKyAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzVGh1bWIsIEhhc1Y1VCwgSXNOb3REYXJ3aW5dPiwNCisgICAgICAgICAgICAgIFQxU3BlY2lhbDx7MSwxLDEsP30+OyAvLyBBNi4yLjMgJiBBOC42LjI0Ow0KKw0KKyAgLy8gQVJNdjRUDQorICBkZWYgdEJYIDogVEl4Mjx7Pyw/LD8sPyw/fSwgez8sP30sID8sDQorICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIHRHUFI6JGZ1bmMsIHZhcmlhYmxlX29wcyksIElJQ19CciwNCisgICAgICAgICAgICAgICAgICAibW92XHRsciwgcGNcblx0YnhcdCRmdW5jIiwNCisgICAgICAgICAgICAgICAgICBbKEFSTWNhbGxfbm9saW5rIHRHUFI6JGZ1bmMpXT4sDQorICAgICAgICAgICAgUmVxdWlyZXM8W0lzVGh1bWIxT25seSwgSXNOb3REYXJ3aW5dPjsNCit9DQorDQorLy8gT24gRGFyd2luIFI5IGlzIGNhbGwtY2xvYmJlcmVkLg0KK2xldCBpc0NhbGwgPSAxLA0KKyAgRGVmcyA9IFtSMCwgIFIxLCAgUjIsICBSMywgIFI5LCAgUjEyLCBMUiwNCisgICAgICAgICAgRDAsICBEMSwgIEQyLCAgRDMsICBENCwgIEQ1LCAgRDYsICBENywNCisgICAgICAgICAgRDE2LCBEMTcsIEQxOCwgRDE5LCBEMjAsIEQyMSwgRDIyLCBEMjMsDQorICAgICAgICAgIEQyNCwgRDI1LCBEMjYsIEQyNywgRDI4LCBEMjksIEQzMCwgRDMxLCBDUFNSLCBGUFNDUl0gaW4gew0KKyAgLy8gQWxzbyB1c2VkIGZvciBUaHVtYjINCisgIGRlZiB0QkxyOSA6IFRJeDI8MGIxMTExMCwgMGIxMSwgMSwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkzMmltbTokZnVuYywgdmFyaWFibGVfb3BzKSwgSUlDX0JyLA0KKyAgICAgICAgICAgICAgICAgICAiYmxcdCR7ZnVuYzpjYWxsfSIsDQorICAgICAgICAgICAgICAgICAgIFsoQVJNdGNhbGwgdGdsb2JhbGFkZHI6JGZ1bmMpXT4sDQorICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYiwgSXNEYXJ3aW5dPjsNCisNCisgIC8vIEFSTXY1VCBhbmQgYWJvdmUsIGFsc28gdXNlZCBmb3IgVGh1bWIyDQorICBkZWYgdEJMWGlfcjkgOiBUSXgyPDBiMTExMTAsIDBiMTEsIDAsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMzJpbW06JGZ1bmMsIHZhcmlhYmxlX29wcyksIElJQ19CciwNCisgICAgICAgICAgICAgICAgICAgICAgImJseFx0JHtmdW5jOmNhbGx9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhBUk1jYWxsIHRnbG9iYWxhZGRyOiRmdW5jKV0+LA0KKyAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzVGh1bWIsIEhhc1Y1VCwgSXNEYXJ3aW5dPjsNCisNCisgIC8vIEFsc28gdXNlZCBmb3IgVGh1bWIyDQorICBkZWYgdEJMWHJfcjkgOiBUSTwob3V0cyksIChpbnMgR1BSOiRmdW5jLCB2YXJpYWJsZV9vcHMpLCBJSUNfQnIsDQorICAgICAgICAgICAgICAgICAgICAiYmx4XHQkZnVuYyIsDQorICAgICAgICAgICAgICAgICAgICBbKEFSTXRjYWxsIEdQUjokZnVuYyldPiwNCisgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc1RodW1iLCBIYXNWNVQsIElzRGFyd2luXT4sDQorICAgICAgICAgICAgICAgICBUMVNwZWNpYWw8ezEsMSwxLD99PjsgLy8gQTYuMi4zICYgQTguNi4yNA0KKw0KKyAgLy8gQVJNdjRUDQorICBkZWYgdEJYcjkgOiBUSXgyPHs/LD8sPyw/LD99LCB7Pyw/fSwgPywNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIHRHUFI6JGZ1bmMsIHZhcmlhYmxlX29wcyksIElJQ19CciwNCisgICAgICAgICAgICAgICAgICAgIm1vdlx0bHIsIHBjXG5cdGJ4XHQkZnVuYyIsDQorICAgICAgICAgICAgICAgICAgIFsoQVJNY2FsbF9ub2xpbmsgdEdQUjokZnVuYyldPiwNCisgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc1RodW1iMU9ubHksIElzRGFyd2luXT47DQorfQ0KKw0KK2xldCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEgaW4gew0KKyAgbGV0IGlzQmFycmllciA9IDEgaW4gew0KKyAgICBsZXQgaXNQcmVkaWNhYmxlID0gMSBpbg0KKyAgICBkZWYgdEIgICA6IFQxSTwob3V0cyksIChpbnMgYnJ0YXJnZXQ6JHRhcmdldCksIElJQ19CciwNCisgICAgICAgICAgICAgICAgICAgImJcdCR0YXJnZXQiLCBbKGJyIGJiOiR0YXJnZXQpXT4sDQorICAgICAgICAgICAgICAgVDFFbmNvZGluZzx7MSwxLDEsMCwwLD99PjsNCisNCisgIC8vIEZhciBqdW1wDQorICBsZXQgRGVmcyA9IFtMUl0gaW4NCisgIGRlZiB0QmZhciA6IFRJeDI8MGIxMTExMCwgMGIxMSwgMSwgKG91dHMpLCAoaW5zIGJydGFyZ2V0OiR0YXJnZXQpLCBJSUNfQnIsDQorICAgICAgICAgICAgICAgICAgICAiYmxcdCR0YXJnZXRcdCR7OmNvbW1lbnR9IGZhciBqdW1wIixbXT47DQorDQorICBkZWYgdEJSX0pUciA6IFQxSlRJPChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgKGlucyB0R1BSOiR0YXJnZXQsIGp0YmxvY2tfb3BlcmFuZDokanQsIGkzMmltbTokaWQpLA0KKyAgICAgICAgICAgICAgICAgICAgICBJSUNfQnIsICJtb3ZcdHBjLCAkdGFyZ2V0XG5cdC5hbGlnblx0MiRqdCIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoQVJNYnJqdCB0R1BSOiR0YXJnZXQsIHRqdW1wdGFibGU6JGp0LCBpbW06JGlkKV0+LA0KKyAgICAgICAgICAgICAgICBFbmNvZGluZzE2IHsNCisgICAgbGV0IEluc3R7MTUtN30gPSAwYjAxMDAwMTEwMTsNCisgICAgbGV0IEluc3R7Mi0wfSA9IDBiMTExOw0KKyAgfQ0KKyAgfQ0KK30NCisNCisvLyBGSVhNRTogc2hvdWxkIGJlIGFibGUgdG8gd3JpdGUgYSBwYXR0ZXJuIGZvciBBUk1CcmNvbmQsIGJ1dCBjYW4ndCB1c2UNCisvLyBhIHR3by12YWx1ZSBvcGVyYW5kIHdoZXJlIGEgZGFnIG5vZGUgZXhwZWN0cyB0d28gb3BlcmFuZHMuIDooDQorbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSBpbg0KKyAgZGVmIHRCY2MgOiBUMUk8KG91dHMpLCAoaW5zIGJydGFyZ2V0OiR0YXJnZXQsIHByZWQ6JGNjKSwgSUlDX0JyLA0KKyAgICAgICAgICAgICAgICAgImIkY2NcdCR0YXJnZXQiLA0KKyAgICAgICAgICAgICAgICAgWy8qKEFSTWJyY29uZCBiYjokdGFyZ2V0LCBpbW06JGNjKSovXT4sDQorICAgICAgICAgICAgIFQxRW5jb2Rpbmc8ezEsMSwwLDEsPyw/fT47DQorDQorLy8gQ29tcGFyZSBhbmQgYnJhbmNoIG9uIHplcm8gLyBub24temVybw0KK2xldCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEgaW4gew0KKyAgZGVmIHRDQlogIDogVDFJPChvdXRzKSwgKGlucyB0R1BSOiRjbXAsIGJydGFyZ2V0OiR0YXJnZXQpLCBJSUNfQnIsDQorICAgICAgICAgICAgICAgICAgImNielx0JGNtcCwgJHRhcmdldCIsIFtdPiwNCisgICAgICAgICAgICAgIFQxTWlzYzx7MCwwLD8sMSw/LD8sP30+Ow0KKw0KKyAgZGVmIHRDQk5aIDogVDFJPChvdXRzKSwgKGlucyB0R1BSOiRjbXAsIGJydGFyZ2V0OiR0YXJnZXQpLCBJSUNfQnIsDQorICAgICAgICAgICAgICAgICAgImNibnpcdCRjbXAsICR0YXJnZXQiLCBbXT4sDQorICAgICAgICAgICAgICBUMU1pc2M8ezEsMCw/LDEsPyw/LD99PjsNCit9DQorDQorLy8gQTguNi4yMTggU3VwZXJ2aXNvciBDYWxsIChTb2Z0d2FyZSBJbnRlcnJ1cHQpIC0tIGZvciBkaXNhc3NlbWJseSBvbmx5DQorLy8gQTguNi4xNiBCOiBFbmNvZGluZyBUMQ0KKy8vIElmIEluc3R7MTEtOH0gPT0gMGIxMTExIHRoZW4gU0VFIFNWQw0KK2xldCBpc0NhbGwgPSAxIGluIHsNCitkZWYgdFNWQyA6IFQxcEk8KG91dHMpLCAoaW5zIGkzMmltbTokc3ZjKSwgSUlDX0JyLCAic3ZjIiwgIlx0JHN2YyIsIFtdPiwNCisgICAgICAgICAgIEVuY29kaW5nMTYgew0KKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTAxOw0KKyAgbGV0IEluc3R7MTEtOH0gPSAwYjExMTE7DQorfQ0KK30NCisNCisvLyBBOC42LjE2IEI6IEVuY29kaW5nIFQxDQorLy8gSWYgSW5zdHsxMS04fSA9PSAwYjExMTAgdGhlbiBVTkRFRklORUQNCisvLyBGSVhNRTogVGVtcG9yYXJ5IGVtaXR0ZWQgYXMgcmF3IGJ5dGVzIHVudGlsIHRoaXMgcHNldWRvLW9wIHdpbGwgYmUgYWRkZWQgdG8NCisvLyBiaW51dGlscw0KK2xldCBpc0JhcnJpZXIgPSAxLCBpc1Rlcm1pbmF0b3IgPSAxIGluDQorZGVmIHRUUkFQIDogVEk8KG91dHMpLCAoaW5zKSwgSUlDX0JyLCANCisgICAgICAgICAgICAgICAiLnNob3J0IDB4ZGVmZSAkezpjb21tZW50fSB0cmFwIiwgWyh0cmFwKV0+LCBFbmNvZGluZzE2IHsNCisgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTEwMTsNCisgIGxldCBJbnN0ezExLTh9ID0gMGIxMTEwOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBMb2FkIFN0b3JlIEluc3RydWN0aW9ucy4NCisvLw0KKw0KK2xldCBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbg0KK2RlZiB0TERSIDogVDFwSTQ8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0X2FkZHJtb2RlX3M0OiRhZGRyKSwgSUlDX2lMb2FkciwNCisgICAgICAgICAgICAgICAibGRyIiwgIlx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKGxvYWQgdF9hZGRybW9kZV9zNDokYWRkcikpXT4sDQorICAgICAgICAgICBUMUxkU3Q8MGIxMDA+Ow0KK2RlZiB0TERSaTogVDFwSTQ8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0X2FkZHJtb2RlX3M0OiRhZGRyKSwgSUlDX2lMb2FkciwNCisgICAgICAgICAgICAgICAibGRyIiwgIlx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgIFtdPiwNCisgICAgICAgICAgIFQxTGRTdDRJbW08ezEsPyw/fT47DQorDQorZGVmIHRMRFJCIDogVDFwSTE8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0X2FkZHJtb2RlX3MxOiRhZGRyKSwgSUlDX2lMb2FkciwNCisgICAgICAgICAgICAgICAgImxkcmIiLCAiXHQkZHN0LCAkYWRkciIsDQorICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKHpleHRsb2FkaTggdF9hZGRybW9kZV9zMTokYWRkcikpXT4sDQorICAgICAgICAgICAgVDFMZFN0PDBiMTEwPjsNCitkZWYgdExEUkJpOiBUMXBJMTwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRfYWRkcm1vZGVfczE6JGFkZHIpLCBJSUNfaUxvYWRyLA0KKyAgICAgICAgICAgICAgICAibGRyYiIsICJcdCRkc3QsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgW10+LA0KKyAgICAgICAgICAgIFQxTGRTdDFJbW08ezEsPyw/fT47DQorDQorZGVmIHRMRFJIIDogVDFwSTI8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0X2FkZHJtb2RlX3MyOiRhZGRyKSwgSUlDX2lMb2FkciwNCisgICAgICAgICAgICAgICAgImxkcmgiLCAiXHQkZHN0LCAkYWRkciIsDQorICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKHpleHRsb2FkaTE2IHRfYWRkcm1vZGVfczI6JGFkZHIpKV0+LA0KKyAgICAgICAgICAgIFQxTGRTdDwwYjEwMT47DQorZGVmIHRMRFJIaTogVDFwSTI8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0X2FkZHJtb2RlX3MyOiRhZGRyKSwgSUlDX2lMb2FkciwNCisgICAgICAgICAgICAgICAgImxkcmgiLCAiXHQkZHN0LCAkYWRkciIsDQorICAgICAgICAgICAgICAgIFtdPiwNCisgICAgICAgICAgICBUMUxkU3QySW1tPHsxLD8sP30+Ow0KKw0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAxMCBpbg0KK2RlZiB0TERSU0IgOiBUMXBJMTwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRfYWRkcm1vZGVfcnI6JGFkZHIpLCBJSUNfaUxvYWRyLA0KKyAgICAgICAgICAgICAgICAgImxkcnNiIiwgIlx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoc2V4dGxvYWRpOCB0X2FkZHJtb2RlX3JyOiRhZGRyKSldPiwNCisgICAgICAgICAgICAgVDFMZFN0PDBiMDExPjsNCisNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTAgaW4NCitkZWYgdExEUlNIIDogVDFwSTI8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0X2FkZHJtb2RlX3JyOiRhZGRyKSwgSUlDX2lMb2FkciwNCisgICAgICAgICAgICAgICAgICJsZHJzaCIsICJcdCRkc3QsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKHNleHRsb2FkaTE2IHRfYWRkcm1vZGVfcnI6JGFkZHIpKV0+LA0KKyAgICAgICAgICAgICBUMUxkU3Q8MGIxMTE+Ow0KKw0KK2xldCBjYW5Gb2xkQXNMb2FkID0gMSBpbg0KK2RlZiB0TERSc3BpIDogVDFwSXM8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0X2FkZHJtb2RlX3NwOiRhZGRyKSwgSUlDX2lMb2FkaSwNCisgICAgICAgICAgICAgICAgICAibGRyIiwgIlx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKGxvYWQgdF9hZGRybW9kZV9zcDokYWRkcikpXT4sDQorICAgICAgICAgICAgICBUMUxkU3RTUDx7MSw/LD99PjsNCisNCisvLyBTcGVjaWFsIGluc3RydWN0aW9uIGZvciByZXN0b3JlLiBJdCBjYW5ub3QgY2xvYmJlciBjb25kaXRpb24gcmVnaXN0ZXINCisvLyB3aGVuIGl0J3MgZXhwYW5kZWQgYnkgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoKS4NCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIG1heUxvYWQgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbg0KK2RlZiB0UmVzdG9yZSA6IFQxcElzPChvdXRzIHRHUFI6JGRzdCksIChpbnMgdF9hZGRybW9kZV9zcDokYWRkciksIElJQ19pTG9hZGksDQorICAgICAgICAgICAgICAgICAgICAibGRyIiwgIlx0JGRzdCwgJGFkZHIiLCBbXT4sDQorICAgICAgICAgICAgICAgVDFMZFN0U1A8ezEsPyw/fT47DQorDQorLy8gTG9hZCB0Y29uc3Rwb29sDQorLy8gRklYTUU6IFVzZSBsZHIubiB0byB3b3JrIGFyb3VuZCBhIERhcndpbiBhc3NlbWJsZXIgYnVnLg0KK2xldCBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbg0KK2RlZiB0TERScGNpIDogVDFwSXM8KG91dHMgdEdQUjokZHN0KSwgKGlucyBpMzJpbW06JGFkZHIpLCBJSUNfaUxvYWRpLA0KKyAgICAgICAgICAgICAgICAgICJsZHIiLCAiLm5cdCRkc3QsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChsb2FkIChBUk1XcmFwcGVyIHRjb25zdHBvb2w6JGFkZHIpKSldPiwNCisgICAgICAgICAgICAgIFQxRW5jb2Rpbmc8ezAsMSwwLDAsMSw/fT47IC8vIEE2LjIgJiBBOC42LjU5DQorDQorLy8gU3BlY2lhbCBMRFIgZm9yIGxvYWRzIGZyb20gbm9uLXBjLXJlbGF0aXZlIGNvbnN0cG9vbHMuDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBtYXlMb2FkID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEsDQorICAgIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCitkZWYgdExEUmNwICA6IFQxcElzPChvdXRzIHRHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRhZGRyKSwgSUlDX2lMb2FkaSwNCisgICAgICAgICAgICAgICAgICAibGRyIiwgIlx0JGRzdCwgJGFkZHIiLCBbXT4sDQorICAgICAgICAgICAgICBUMUxkU3RTUDx7MSw/LD99PjsNCisNCitkZWYgdFNUUiA6IFQxcEk0PChvdXRzKSwgKGlucyB0R1BSOiRzcmMsIHRfYWRkcm1vZGVfczQ6JGFkZHIpLCBJSUNfaVN0b3JlciwNCisgICAgICAgICAgICAgICAic3RyIiwgIlx0JHNyYywgJGFkZHIiLA0KKyAgICAgICAgICAgICAgIFsoc3RvcmUgdEdQUjokc3JjLCB0X2FkZHJtb2RlX3M0OiRhZGRyKV0+LA0KKyAgICAgICAgICAgVDFMZFN0PDBiMDAwPjsNCitkZWYgdFNUUmk6IFQxcEk0PChvdXRzKSwgKGlucyB0R1BSOiRzcmMsIHRfYWRkcm1vZGVfczQ6JGFkZHIpLCBJSUNfaVN0b3JlciwNCisgICAgICAgICAgICAgICAic3RyIiwgIlx0JHNyYywgJGFkZHIiLA0KKyAgICAgICAgICAgICAgIFtdPiwNCisgICAgICAgICAgIFQxTGRTdDRJbW08ezAsPyw/fT47DQorDQorZGVmIHRTVFJCIDogVDFwSTE8KG91dHMpLCAoaW5zIHRHUFI6JHNyYywgdF9hZGRybW9kZV9zMTokYWRkciksIElJQ19pU3RvcmVyLA0KKyAgICAgICAgICAgICAgICAgInN0cmIiLCAiXHQkc3JjLCAkYWRkciIsDQorICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpOCB0R1BSOiRzcmMsIHRfYWRkcm1vZGVfczE6JGFkZHIpXT4sDQorICAgICAgICAgICAgVDFMZFN0PDBiMDEwPjsNCitkZWYgdFNUUkJpOiBUMXBJMTwob3V0cyksIChpbnMgdEdQUjokc3JjLCB0X2FkZHJtb2RlX3MxOiRhZGRyKSwgSUlDX2lTdG9yZXIsDQorICAgICAgICAgICAgICAgICAic3RyYiIsICJcdCRzcmMsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgIFtdPiwNCisgICAgICAgICAgICBUMUxkU3QxSW1tPHswLD8sP30+Ow0KKw0KK2RlZiB0U1RSSCA6IFQxcEkyPChvdXRzKSwgKGlucyB0R1BSOiRzcmMsIHRfYWRkcm1vZGVfczI6JGFkZHIpLCBJSUNfaVN0b3JlciwNCisgICAgICAgICAgICAgICAgICJzdHJoIiwgIlx0JHNyYywgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTE2IHRHUFI6JHNyYywgdF9hZGRybW9kZV9zMjokYWRkcildPiwNCisgICAgICAgICAgICBUMUxkU3Q8MGIwMDE+Ow0KK2RlZiB0U1RSSGk6IFQxcEkyPChvdXRzKSwgKGlucyB0R1BSOiRzcmMsIHRfYWRkcm1vZGVfczI6JGFkZHIpLCBJSUNfaVN0b3JlciwNCisgICAgICAgICAgICAgICAgICJzdHJoIiwgIlx0JHNyYywgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgW10+LA0KKyAgICAgICAgICAgIFQxTGRTdDJJbW08ezAsPyw/fT47DQorDQorZGVmIHRTVFJzcGkgOiBUMXBJczwob3V0cyksIChpbnMgdEdQUjokc3JjLCB0X2FkZHJtb2RlX3NwOiRhZGRyKSwgSUlDX2lTdG9yZWksDQorICAgICAgICAgICAgICAgICAgICJzdHIiLCAiXHQkc3JjLCAkYWRkciIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgdEdQUjokc3JjLCB0X2FkZHJtb2RlX3NwOiRhZGRyKV0+LA0KKyAgICAgICAgICAgICAgVDFMZFN0U1A8ezAsPyw/fT47DQorDQorbGV0IG1heVN0b3JlID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4gew0KKy8vIFNwZWNpYWwgaW5zdHJ1Y3Rpb24gZm9yIHNwaWxsLiBJdCBjYW5ub3QgY2xvYmJlciBjb25kaXRpb24gcmVnaXN0ZXINCisvLyB3aGVuIGl0J3MgZXhwYW5kZWQgYnkgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoKS4NCitkZWYgdFNwaWxsIDogVDFwSXM8KG91dHMpLCAoaW5zIHRHUFI6JHNyYywgdF9hZGRybW9kZV9zcDokYWRkciksIElJQ19pU3RvcmVpLA0KKyAgICAgICAgICAgICAgICAgICJzdHIiLCAiXHQkc3JjLCAkYWRkciIsIFtdPiwNCisgICAgICAgICAgICAgVDFMZFN0U1A8ezAsPyw/fT47DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIExvYWQgLyBzdG9yZSBtdWx0aXBsZSBJbnN0cnVjdGlvbnMuDQorLy8NCisNCisvLyBUaGVzZSByZXF1aXJlcyBiYXNlIGFkZHJlc3MgdG8gYmUgd3JpdHRlbiBiYWNrIG9yIG9uZSBvZiB0aGUgbG9hZGVkIHJlZ3MuDQorbGV0IG1heUxvYWQgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSwgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcSA9IDEgaW4gew0KK2RlZiB0TERNIDogVDFJPChvdXRzKSwNCisgICAgICAgICAgICAgICAoaW5zIGFkZHJtb2RlNDokYWRkciwgcHJlZDokcCwgcmVnbGlzdDokZHN0cywgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICBJSUNfaUxvYWRtLA0KKyAgICAgICAgICAgICAgICJsZG0ke2FkZHI6c3VibW9kZX0ke3B9XHQkYWRkciwgJGRzdHMiLCBbXT4sDQorICAgICAgICAgICBUMUVuY29kaW5nPHsxLDEsMCwwLDEsP30+OyAvLyBBNi4yICYgQTguNi41Mw0KKw0KK2RlZiB0TERNX1VQRCA6IFQxSXQ8KG91dHMgdEdQUjokd2IpLA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBhZGRybW9kZTQ6JGFkZHIsIHByZWQ6JHAsIHJlZ2xpc3Q6JGRzdHMsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICBJSUNfaUxvYWRtLA0KKyAgICAgICAgICAgICAgICAgICAgImxkbSR7YWRkcjpzdWJtb2RlfSR7cH1cdCRhZGRyISwgJGRzdHMiLA0KKyAgICAgICAgICAgICAgICAgICAgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT4sDQorICAgICAgICAgICAgICAgVDFFbmNvZGluZzx7MSwxLDAsMCwxLD99PjsgLy8gQTYuMiAmIEE4LjYuNTMNCit9IC8vIG1heUxvYWQsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxDQorDQorbGV0IG1heVN0b3JlID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEsIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEgPSAxIGluDQorZGVmIHRTVE1fVVBEIDogVDFJdDwob3V0cyB0R1BSOiR3YiksDQorICAgICAgICAgICAgICAgICAgICAoaW5zIGFkZHJtb2RlNDokYWRkciwgcHJlZDokcCwgcmVnbGlzdDokc3JjcywgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgIElJQ19pU3RvcmVtLA0KKyAgICAgICAgICAgICAgICAgICAgInN0bSR7YWRkcjpzdWJtb2RlfSR7cH1cdCRhZGRyISwgJHNyY3MiLA0KKyAgICAgICAgICAgICAgICAgICAgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT4sDQorICAgICAgICAgICBUMUVuY29kaW5nPHsxLDEsMCwwLDAsP30+OyAvLyBBNi4yICYgQTguNi4xODkNCisNCitsZXQgbWF5TG9hZCA9IDEsIFVzZXMgPSBbU1BdLCBEZWZzID0gW1NQXSwgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcSA9IDEgaW4NCitkZWYgdFBPUCA6IFQxSTwob3V0cyksIChpbnMgcHJlZDokcCwgcmVnbGlzdDokZHN0cywgdmFyaWFibGVfb3BzKSwgSUlDX0JyLA0KKyAgICAgICAgICAgICAgICJwb3Ake3B9XHQkZHN0cyIsIFtdPiwNCisgICAgICAgICAgIFQxTWlzYzx7MSwxLDAsPyw/LD8sP30+Ow0KKw0KK2xldCBtYXlTdG9yZSA9IDEsIFVzZXMgPSBbU1BdLCBEZWZzID0gW1NQXSwgaGFzRXh0cmFTcmNSZWdBbGxvY1JlcSA9IDEgaW4NCitkZWYgdFBVU0ggOiBUMUk8KG91dHMpLCAoaW5zIHByZWQ6JHAsIHJlZ2xpc3Q6JHNyY3MsIHZhcmlhYmxlX29wcyksIElJQ19CciwNCisgICAgICAgICAgICAgICAgInB1c2gke3B9XHQkc3JjcyIsIFtdPiwNCisgICAgICAgICAgICBUMU1pc2M8ezAsMSwwLD8sPyw/LD99PjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBBcml0aG1ldGljIEluc3RydWN0aW9ucy4NCisvLw0KKw0KKy8vIEFkZCB3aXRoIGNhcnJ5IHJlZ2lzdGVyDQorbGV0IGlzQ29tbXV0YWJsZSA9IDEsIFVzZXMgPSBbQ1BTUl0gaW4NCitkZWYgdEFEQyA6IFQxc0l0PChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokbGhzLCB0R1BSOiRyaHMpLCBJSUNfaUFMVXIsDQorICAgICAgICAgICAgICAgICAiYWRjIiwgIlx0JGRzdCwgJHJocyIsDQorICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChhZGRlIHRHUFI6JGxocywgdEdQUjokcmhzKSldPiwNCisgICAgICAgICAgIFQxRGF0YVByb2Nlc3Npbmc8MGIwMTAxPjsNCisNCisvLyBBZGQgaW1tZWRpYXRlDQorZGVmIHRBRERpMyA6IFQxc0k8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRsaHMsIGkzMmltbTokcmhzKSwgSUlDX2lBTFVpLA0KKyAgICAgICAgICAgICAgICAgICAiYWRkIiwgIlx0JGRzdCwgJGxocywgJHJocyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKGFkZCB0R1BSOiRsaHMsIGltbTBfNzokcmhzKSldPiwNCisgICAgICAgICAgICAgVDFHZW5lcmFsPDBiMDExMTA+Ow0KKw0KK2RlZiB0QUREaTggOiBUMXNJdDwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGxocywgaTMyaW1tOiRyaHMpLCBJSUNfaUFMVWksDQorICAgICAgICAgICAgICAgICAgICJhZGQiLCAiXHQkZHN0LCAkcmhzIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoYWRkIHRHUFI6JGxocywgaW1tOF8yNTU6JHJocykpXT4sDQorICAgICAgICAgICAgIFQxR2VuZXJhbDx7MSwxLDAsPyw/fT47DQorDQorLy8gQWRkIHJlZ2lzdGVyDQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4NCitkZWYgdEFERHJyIDogVDFzSTwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGxocywgdEdQUjokcmhzKSwgSUlDX2lBTFVyLA0KKyAgICAgICAgICAgICAgICAgICAiYWRkIiwgIlx0JGRzdCwgJGxocywgJHJocyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKGFkZCB0R1BSOiRsaHMsIHRHUFI6JHJocykpXT4sDQorICAgICAgICAgICAgIFQxR2VuZXJhbDwwYjAxMTAwPjsNCisNCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4NCitkZWYgdEFERGhpcnIgOiBUMXBJdDwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRsaHMsIEdQUjokcmhzKSwgSUlDX2lBTFVyLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGQiLCAiXHQkZHN0LCAkcmhzIiwgW10+LA0KKyAgICAgICAgICAgICAgIFQxU3BlY2lhbDx7MCwwLD8sP30+Ow0KKw0KKy8vIEFuZCByZWdpc3Rlcg0KK2xldCBpc0NvbW11dGFibGUgPSAxIGluDQorZGVmIHRBTkQgOiBUMXNJdDwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGxocywgdEdQUjokcmhzKSwgSUlDX2lBTFVyLA0KKyAgICAgICAgICAgICAgICAgImFuZCIsICJcdCRkc3QsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoYW5kIHRHUFI6JGxocywgdEdQUjokcmhzKSldPiwNCisgICAgICAgICAgIFQxRGF0YVByb2Nlc3Npbmc8MGIwMDAwPjsNCisNCisvLyBBU1IgaW1tZWRpYXRlDQorZGVmIHRBU1JyaSA6IFQxc0k8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRsaHMsIGkzMmltbTokcmhzKSwgSUlDX2lNT1ZzaSwNCisgICAgICAgICAgICAgICAgICAiYXNyIiwgIlx0JGRzdCwgJGxocywgJHJocyIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoc3JhIHRHUFI6JGxocywgKGkzMiBpbW06JHJocykpKV0+LA0KKyAgICAgICAgICAgICBUMUdlbmVyYWw8ezAsMSwwLD8sP30+Ow0KKw0KKy8vIEFTUiByZWdpc3Rlcg0KK2RlZiB0QVNScnIgOiBUMXNJdDwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGxocywgdEdQUjokcmhzKSwgSUlDX2lNT1ZzciwNCisgICAgICAgICAgICAgICAgICAgImFzciIsICJcdCRkc3QsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChzcmEgdEdQUjokbGhzLCB0R1BSOiRyaHMpKV0+LA0KKyAgICAgICAgICAgICBUMURhdGFQcm9jZXNzaW5nPDBiMDEwMD47DQorDQorLy8gQklDIHJlZ2lzdGVyDQorZGVmIHRCSUMgOiBUMXNJdDwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGxocywgdEdQUjokcmhzKSwgSUlDX2lBTFVyLA0KKyAgICAgICAgICAgICAgICAgImJpYyIsICJcdCRkc3QsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoYW5kIHRHUFI6JGxocywgKG5vdCB0R1BSOiRyaHMpKSldPiwNCisgICAgICAgICAgIFQxRGF0YVByb2Nlc3Npbmc8MGIxMTEwPjsNCisNCisvLyBDTU4gcmVnaXN0ZXINCitsZXQgRGVmcyA9IFtDUFNSXSBpbiB7DQorLy9GSVhNRTogRGlzYWJsZSBDTU4sIGFzIENDb2RlcyBhcmUgYmFja3dhcmRzIGZyb20gY29tcGFyZSBleHBlY3RhdGlvbnMNCisvLyAgICAgICBDb21wYXJlLXRvLXplcm8gc3RpbGwgd29ya3Mgb3V0LCBqdXN0IG5vdCB0aGUgcmVsYXRpb25hbHMNCisvL2RlZiB0Q01OIDogVDFwSTwob3V0cyksIChpbnMgdEdQUjokbGhzLCB0R1BSOiRyaHMpLCBJSUNfaUNNUHIsDQorLy8gICAgICAgICAgICAgICAgImNtbiIsICJcdCRsaHMsICRyaHMiLA0KKy8vICAgICAgICAgICAgICAgIFsoQVJNY21wIHRHUFI6JGxocywgKGluZWcgdEdQUjokcmhzKSldPiwNCisvLyAgICAgICAgICAgVDFEYXRhUHJvY2Vzc2luZzwwYjEwMTE+Ow0KK2RlZiB0Q01OeiA6IFQxcEk8KG91dHMpLCAoaW5zIHRHUFI6JGxocywgdEdQUjokcmhzKSwgSUlDX2lDTVByLA0KKyAgICAgICAgICAgICAgICAgImNtbiIsICJcdCRsaHMsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgWyhBUk1jbXBaIHRHUFI6JGxocywgKGluZWcgdEdQUjokcmhzKSldPiwNCisgICAgICAgICAgICBUMURhdGFQcm9jZXNzaW5nPDBiMTAxMT47DQorfQ0KKw0KKy8vIENNUCBpbW1lZGlhdGUNCitsZXQgRGVmcyA9IFtDUFNSXSBpbiB7DQorZGVmIHRDTVBpOCA6IFQxcEk8KG91dHMpLCAoaW5zIHRHUFI6JGxocywgaTMyaW1tOiRyaHMpLCBJSUNfaUNNUGksDQorICAgICAgICAgICAgICAgICAgImNtcCIsICJcdCRsaHMsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgIFsoQVJNY21wIHRHUFI6JGxocywgaW1tMF8yNTU6JHJocyldPiwNCisgICAgICAgICAgICAgVDFHZW5lcmFsPHsxLDAsMSw/LD99PjsNCitkZWYgdENNUHppOCA6IFQxcEk8KG91dHMpLCAoaW5zIHRHUFI6JGxocywgaTMyaW1tOiRyaHMpLCBJSUNfaUNNUGksDQorICAgICAgICAgICAgICAgICAgImNtcCIsICJcdCRsaHMsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgIFsoQVJNY21wWiB0R1BSOiRsaHMsIGltbTBfMjU1OiRyaHMpXT4sDQorICAgICAgICAgICAgICBUMUdlbmVyYWw8ezEsMCwxLD8sP30+Ow0KK30NCisNCisvLyBDTVAgcmVnaXN0ZXINCitsZXQgRGVmcyA9IFtDUFNSXSBpbiB7DQorZGVmIHRDTVByIDogVDFwSTwob3V0cyksIChpbnMgdEdQUjokbGhzLCB0R1BSOiRyaHMpLCBJSUNfaUNNUHIsDQorICAgICAgICAgICAgICAgICAiY21wIiwgIlx0JGxocywgJHJocyIsDQorICAgICAgICAgICAgICAgICBbKEFSTWNtcCB0R1BSOiRsaHMsIHRHUFI6JHJocyldPiwNCisgICAgICAgICAgICBUMURhdGFQcm9jZXNzaW5nPDBiMTAxMD47DQorZGVmIHRDTVB6ciA6IFQxcEk8KG91dHMpLCAoaW5zIHRHUFI6JGxocywgdEdQUjokcmhzKSwgSUlDX2lDTVByLA0KKyAgICAgICAgICAgICAgICAgICJjbXAiLCAiXHQkbGhzLCAkcmhzIiwNCisgICAgICAgICAgICAgICAgICBbKEFSTWNtcFogdEdQUjokbGhzLCB0R1BSOiRyaHMpXT4sDQorICAgICAgICAgICAgIFQxRGF0YVByb2Nlc3Npbmc8MGIxMDEwPjsNCisNCitkZWYgdENNUGhpciA6IFQxcEk8KG91dHMpLCAoaW5zIEdQUjokbGhzLCBHUFI6JHJocyksIElJQ19pQ01QciwNCisgICAgICAgICAgICAgICAgICAgImNtcCIsICJcdCRsaHMsICRyaHMiLCBbXT4sDQorICAgICAgICAgICAgICBUMVNwZWNpYWw8ezAsMSw/LD99PjsNCitkZWYgdENNUHpoaXIgOiBUMXBJPChvdXRzKSwgKGlucyBHUFI6JGxocywgR1BSOiRyaHMpLCBJSUNfaUNNUHIsDQorICAgICAgICAgICAgICAgICAgICAiY21wIiwgIlx0JGxocywgJHJocyIsIFtdPiwNCisgICAgICAgICAgICAgICBUMVNwZWNpYWw8ezAsMSw/LD99PjsNCit9DQorDQorDQorLy8gWE9SIHJlZ2lzdGVyDQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4NCitkZWYgdEVPUiA6IFQxc0l0PChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokbGhzLCB0R1BSOiRyaHMpLCBJSUNfaUFMVXIsDQorICAgICAgICAgICAgICAgICAiZW9yIiwgIlx0JGRzdCwgJHJocyIsDQorICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsICh4b3IgdEdQUjokbGhzLCB0R1BSOiRyaHMpKV0+LA0KKyAgICAgICAgICAgVDFEYXRhUHJvY2Vzc2luZzwwYjAwMDE+Ow0KKw0KKy8vIExTTCBpbW1lZGlhdGUNCitkZWYgdExTTHJpIDogVDFzSTwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGxocywgaTMyaW1tOiRyaHMpLCBJSUNfaU1PVnNpLA0KKyAgICAgICAgICAgICAgICAgICJsc2wiLCAiXHQkZHN0LCAkbGhzLCAkcmhzIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChzaGwgdEdQUjokbGhzLCAoaTMyIGltbTokcmhzKSkpXT4sDQorICAgICAgICAgICAgIFQxR2VuZXJhbDx7MCwwLDAsPyw/fT47DQorDQorLy8gTFNMIHJlZ2lzdGVyDQorZGVmIHRMU0xyciA6IFQxc0l0PChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokbGhzLCB0R1BSOiRyaHMpLCBJSUNfaU1PVnNyLA0KKyAgICAgICAgICAgICAgICAgICAibHNsIiwgIlx0JGRzdCwgJHJocyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKHNobCB0R1BSOiRsaHMsIHRHUFI6JHJocykpXT4sDQorICAgICAgICAgICAgIFQxRGF0YVByb2Nlc3Npbmc8MGIwMDEwPjsNCisNCisvLyBMU1IgaW1tZWRpYXRlDQorZGVmIHRMU1JyaSA6IFQxc0k8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRsaHMsIGkzMmltbTokcmhzKSwgSUlDX2lNT1ZzaSwNCisgICAgICAgICAgICAgICAgICAibHNyIiwgIlx0JGRzdCwgJGxocywgJHJocyIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoc3JsIHRHUFI6JGxocywgKGkzMiBpbW06JHJocykpKV0+LA0KKyAgICAgICAgICAgICBUMUdlbmVyYWw8ezAsMCwxLD8sP30+Ow0KKw0KKy8vIExTUiByZWdpc3Rlcg0KK2RlZiB0TFNScnIgOiBUMXNJdDwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGxocywgdEdQUjokcmhzKSwgSUlDX2lNT1ZzciwNCisgICAgICAgICAgICAgICAgICAgImxzciIsICJcdCRkc3QsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChzcmwgdEdQUjokbGhzLCB0R1BSOiRyaHMpKV0+LA0KKyAgICAgICAgICAgICBUMURhdGFQcm9jZXNzaW5nPDBiMDAxMT47DQorDQorLy8gbW92ZSByZWdpc3Rlcg0KK2RlZiB0TU9WaTggOiBUMXNJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRzcmMpLCBJSUNfaU1PVmksDQorICAgICAgICAgICAgICAgICAgIm1vdiIsICJcdCRkc3QsICRzcmMiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgaW1tMF8yNTU6JHNyYyldPiwNCisgICAgICAgICAgICAgVDFHZW5lcmFsPHsxLDAsMCw/LD99PjsNCisNCisvLyBUT0RPOiBBNy03MzogTU9WKDIpIC0gbW92IHNldHRpbmcgZmxhZy4NCisNCisNCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4gew0KKy8vIEZJWE1FOiBNYWtlIHRoaXMgcHJlZGljYWJsZS4NCitkZWYgdE1PVnIgICAgICAgOiBUMUk8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRzcmMpLCBJSUNfaU1PVnIsDQorICAgICAgICAgICAgICAgICAgICAgICJtb3ZcdCRkc3QsICRzcmMiLCBbXT4sDQorICAgICAgICAgICAgICAgICAgVDFTcGVjaWFsPDBiMTAwMD47DQorbGV0IERlZnMgPSBbQ1BTUl0gaW4NCitkZWYgdE1PVlNyICAgICAgOiBUMUk8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRzcmMpLCBJSUNfaU1PVnIsDQorICAgICAgICAgICAgICAgICAgICAgICAibW92c1x0JGRzdCwgJHNyYyIsIFtdPiwgRW5jb2RpbmcxNiB7DQorICBsZXQgSW5zdHsxNS02fSA9IDBiMDAwMDAwMDAwMDsNCit9DQorDQorLy8gRklYTUU6IE1ha2UgdGhlc2UgcHJlZGljYWJsZS4NCitkZWYgdE1PVmdwcjJ0Z3ByIDogVDFJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgR1BSOiRzcmMpLCBJSUNfaU1PVnIsDQorICAgICAgICAgICAgICAgICAgICAgICAibW92XHQkZHN0LCAkc3JjIiwgW10+LA0KKyAgICAgICAgICAgICAgICAgICBUMVNwZWNpYWw8ezEsMCwwLD99PjsNCitkZWYgdE1PVnRncHIyZ3ByIDogVDFJPChvdXRzIEdQUjokZHN0KSwgKGlucyB0R1BSOiRzcmMpLCBJSUNfaU1PVnIsDQorICAgICAgICAgICAgICAgICAgICAgICAibW92XHQkZHN0LCAkc3JjIiwgW10+LA0KKyAgICAgICAgICAgICAgICAgICBUMVNwZWNpYWw8ezEsMCw/LDB9PjsNCitkZWYgdE1PVmdwcjJncHIgIDogVDFJPChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNyYyksIElJQ19pTU9WciwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3ZcdCRkc3QsICRzcmMiLCBbXT4sDQorICAgICAgICAgICAgICAgICAgIFQxU3BlY2lhbDx7MSwwLD8sP30+Ow0KK30gLy8gbmV2ZXJIYXNTaWRlRWZmZWN0cw0KKw0KKy8vIG11bHRpcGx5IHJlZ2lzdGVyDQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4NCitkZWYgdE1VTCA6IFQxc0l0PChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokbGhzLCB0R1BSOiRyaHMpLCBJSUNfaU1VTDMyLA0KKyAgICAgICAgICAgICAgICAgIm11bCIsICJcdCRkc3QsICRyaHMsICRkc3QiLCAvKiBBOC42LjEwNSBNVUwgRW5jb2RpbmcgVDEgKi8NCisgICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKG11bCB0R1BSOiRsaHMsIHRHUFI6JHJocykpXT4sDQorICAgICAgICAgICBUMURhdGFQcm9jZXNzaW5nPDBiMTEwMT47DQorDQorLy8gbW92ZSBpbnZlcnNlIHJlZ2lzdGVyDQorZGVmIHRNVk4gOiBUMXNJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokc3JjKSwgSUlDX2lNT1ZyLA0KKyAgICAgICAgICAgICAgICAibXZuIiwgIlx0JGRzdCwgJHNyYyIsDQorICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKG5vdCB0R1BSOiRzcmMpKV0+LA0KKyAgICAgICAgICAgVDFEYXRhUHJvY2Vzc2luZzwwYjExMTE+Ow0KKw0KKy8vIGJpdHdpc2Ugb3IgcmVnaXN0ZXINCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbg0KK2RlZiB0T1JSIDogVDFzSXQ8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRsaHMsIHRHUFI6JHJocyksICBJSUNfaUFMVXIsDQorICAgICAgICAgICAgICAgICAib3JyIiwgIlx0JGRzdCwgJHJocyIsDQorICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChvciB0R1BSOiRsaHMsIHRHUFI6JHJocykpXT4sDQorICAgICAgICAgICBUMURhdGFQcm9jZXNzaW5nPDBiMTEwMD47DQorDQorLy8gc3dhcHMNCitkZWYgdFJFViA6IFQxcEk8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRzcmMpLCBJSUNfaVVOQXIsDQorICAgICAgICAgICAgICAgICJyZXYiLCAiXHQkZHN0LCAkc3JjIiwNCisgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoYnN3YXAgdEdQUjokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzVGh1bWIxT25seSwgSGFzVjZdPiwNCisgICAgICAgICAgIFQxTWlzYzx7MSwwLDEsMCwwLDAsP30+Ow0KKw0KK2RlZiB0UkVWMTYgOiBUMXBJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokc3JjKSwgSUlDX2lVTkFyLA0KKyAgICAgICAgICAgICAgICAgICJyZXYxNiIsICJcdCRkc3QsICRzcmMiLA0KKyAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsDQorICAgICAgICAgICAgICAgICAgIChvciAoYW5kIChzcmwgdEdQUjokc3JjLCAoaTMyIDgpKSwgMHhGRiksDQorICAgICAgICAgICAgICAgICAgICAgICAob3IgKGFuZCAoc2hsIHRHUFI6JHNyYywgKGkzMiA4KSksIDB4RkYwMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhbmQgKHNybCB0R1BSOiRzcmMsIChpMzIgOCkpLCAweEZGMDAwMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKHNobCB0R1BSOiRzcmMsIChpMzIgOCkpLCAweEZGMDAwMDAwKSkpKSldPiwNCisgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzVGh1bWIxT25seSwgSGFzVjZdPiwNCisgICAgICAgICAgICAgVDFNaXNjPHsxLDAsMSwwLDAsMSw/fT47DQorDQorZGVmIHRSRVZTSCA6IFQxcEk8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRzcmMpLCBJSUNfaVVOQXIsDQorICAgICAgICAgICAgICAgICAgInJldnNoIiwgIlx0JGRzdCwgJHNyYyIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChzZXh0X2lucmVnDQorICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgKHNybCAoYW5kIHRHUFI6JHNyYywgMHhGRjAwKSwgKGkzMiA4KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNobCB0R1BSOiRzcmMsIChpMzIgOCkpKSwgaTE2KSldPiwNCisgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjFPbmx5LCBIYXNWNl0+LA0KKyAgICAgICAgICAgICBUMU1pc2M8ezEsMCwxLDAsMSwxLD99PjsNCisNCisvLyByb3RhdGUgcmlnaHQgcmVnaXN0ZXINCitkZWYgdFJPUiA6IFQxc0l0PChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokbGhzLCB0R1BSOiRyaHMpLCBJSUNfaU1PVnNyLA0KKyAgICAgICAgICAgICAgICAgInJvciIsICJcdCRkc3QsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAocm90ciB0R1BSOiRsaHMsIHRHUFI6JHJocykpXT4sDQorICAgICAgICAgICBUMURhdGFQcm9jZXNzaW5nPDBiMDExMT47DQorDQorLy8gbmVnYXRlIHJlZ2lzdGVyDQorZGVmIHRSU0IgOiBUMXNJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokc3JjKSwgSUlDX2lBTFVpLA0KKyAgICAgICAgICAgICAgICAicnNiIiwgIlx0JGRzdCwgJHNyYywgIzAiLA0KKyAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChpbmVnIHRHUFI6JHNyYykpXT4sDQorICAgICAgICAgICBUMURhdGFQcm9jZXNzaW5nPDBiMTAwMT47DQorDQorLy8gU3VidHJhY3Qgd2l0aCBjYXJyeSByZWdpc3Rlcg0KK2xldCBVc2VzID0gW0NQU1JdIGluDQorZGVmIHRTQkMgOiBUMXNJdDwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGxocywgdEdQUjokcmhzKSwgSUlDX2lBTFVyLA0KKyAgICAgICAgICAgICAgICAgInNiYyIsICJcdCRkc3QsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoc3ViZSB0R1BSOiRsaHMsIHRHUFI6JHJocykpXT4sDQorICAgICAgICAgICBUMURhdGFQcm9jZXNzaW5nPDBiMDExMD47DQorDQorLy8gU3VidHJhY3QgaW1tZWRpYXRlDQorZGVmIHRTVUJpMyA6IFQxc0k8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRsaHMsIGkzMmltbTokcmhzKSwgSUlDX2lBTFVpLA0KKyAgICAgICAgICAgICAgICAgICJzdWIiLCAiXHQkZHN0LCAkbGhzLCAkcmhzIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChhZGQgdEdQUjokbGhzLCBpbW0wXzdfbmVnOiRyaHMpKV0+LA0KKyAgICAgICAgICAgICBUMUdlbmVyYWw8MGIwMTExMT47DQorDQorZGVmIHRTVUJpOCA6IFQxc0l0PChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokbGhzLCBpMzJpbW06JHJocyksIElJQ19pQUxVaSwNCisgICAgICAgICAgICAgICAgICAgInN1YiIsICJcdCRkc3QsICRyaHMiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChhZGQgdEdQUjokbGhzLCBpbW04XzI1NV9uZWc6JHJocykpXT4sDQorICAgICAgICAgICAgIFQxR2VuZXJhbDx7MSwxLDEsPyw/fT47DQorDQorLy8gc3VidHJhY3QgcmVnaXN0ZXINCitkZWYgdFNVQnJyIDogVDFzSTwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGxocywgdEdQUjokcmhzKSwgSUlDX2lBTFVyLA0KKyAgICAgICAgICAgICAgICAgICJzdWIiLCAiXHQkZHN0LCAkbGhzLCAkcmhzIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChzdWIgdEdQUjokbGhzLCB0R1BSOiRyaHMpKV0+LA0KKyAgICAgICAgICAgICBUMUdlbmVyYWw8MGIwMTEwMT47DQorDQorLy8gVE9ETzogQTctOTY6IFNUTUlBIC0gc3RvcmUgbXVsdGlwbGUuDQorDQorLy8gc2lnbi1leHRlbmQgYnl0ZQ0KK2RlZiB0U1hUQiAgOiBUMXBJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokc3JjKSwgSUlDX2lVTkFyLA0KKyAgICAgICAgICAgICAgICAgICJzeHRiIiwgIlx0JGRzdCwgJHNyYyIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoc2V4dF9pbnJlZyB0R1BSOiRzcmMsIGk4KSldPiwNCisgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjFPbmx5LCBIYXNWNl0+LA0KKyAgICAgICAgICAgICBUMU1pc2M8ezAsMCwxLDAsMCwxLD99PjsNCisNCisvLyBzaWduLWV4dGVuZCBzaG9ydA0KK2RlZiB0U1hUSCAgOiBUMXBJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgdEdQUjokc3JjKSwgSUlDX2lVTkFyLA0KKyAgICAgICAgICAgICAgICAgICJzeHRoIiwgIlx0JGRzdCwgJHNyYyIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgdEdQUjokZHN0LCAoc2V4dF9pbnJlZyB0R1BSOiRzcmMsIGkxNikpXT4sDQorICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzVGh1bWIxT25seSwgSGFzVjZdPiwNCisgICAgICAgICAgICAgVDFNaXNjPHswLDAsMSwwLDAsMCw/fT47DQorDQorLy8gdGVzdA0KK2xldCBpc0NvbW11dGFibGUgPSAxLCBEZWZzID0gW0NQU1JdIGluDQorZGVmIHRUU1QgIDogVDFwSTwob3V0cyksIChpbnMgdEdQUjokbGhzLCB0R1BSOiRyaHMpLCBJSUNfaUNNUHIsDQorICAgICAgICAgICAgICAgICAidHN0IiwgIlx0JGxocywgJHJocyIsDQorICAgICAgICAgICAgICAgICBbKEFSTWNtcFogKGFuZCB0R1BSOiRsaHMsIHRHUFI6JHJocyksIDApXT4sDQorICAgICAgICAgICAgVDFEYXRhUHJvY2Vzc2luZzwwYjEwMDA+Ow0KKw0KKy8vIHplcm8tZXh0ZW5kIGJ5dGUNCitkZWYgdFVYVEIgIDogVDFwSTwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JHNyYyksIElJQ19pVU5BciwNCisgICAgICAgICAgICAgICAgICAidXh0YiIsICJcdCRkc3QsICRzcmMiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IHRHUFI6JGRzdCwgKGFuZCB0R1BSOiRzcmMsIDB4RkYpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc1RodW1iMU9ubHksIEhhc1Y2XT4sDQorICAgICAgICAgICAgIFQxTWlzYzx7MCwwLDEsMCwxLDEsP30+Ow0KKw0KKy8vIHplcm8tZXh0ZW5kIHNob3J0DQorZGVmIHRVWFRIICA6IFQxcEk8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRzcmMpLCBJSUNfaVVOQXIsDQorICAgICAgICAgICAgICAgICAgInV4dGgiLCAiXHQkZHN0LCAkc3JjIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCB0R1BSOiRkc3QsIChhbmQgdEdQUjokc3JjLCAweEZGRkYpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc1RodW1iMU9ubHksIEhhc1Y2XT4sDQorICAgICAgICAgICAgIFQxTWlzYzx7MCwwLDEsMCwxLDAsP30+Ow0KKw0KKw0KKy8vIENvbmRpdGlvbmFsIG1vdmUgdE1PVkNDciAtIFVzZWQgdG8gaW1wbGVtZW50IHRoZSBUaHVtYiBTRUxFQ1RfQ0Mgb3BlcmF0aW9uLg0KKy8vIEV4cGFuZGVkIGFmdGVyIGluc3RydWN0aW9uIHNlbGVjdGlvbiBpbnRvIGEgYnJhbmNoIHNlcXVlbmNlLg0KK2xldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxIGluICAvLyBFeHBhbmRlZCBhZnRlciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uDQorICBkZWYgdE1PVkNDcl9wc2V1ZG8gOg0KKyAgUHNldWRvSW5zdDwob3V0cyB0R1BSOiRkc3QpLCAoaW5zIHRHUFI6JGZhbHNlLCB0R1BSOiR0cnVlLCBwcmVkOiRjYyksDQorICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwgIiR7OmNvbW1lbnR9IHRNT1ZDQ3IgJGNjIiwNCisgICAgICAgICAgICAgWy8qKHNldCB0R1BSOiRkc3QsIChBUk1jbW92IHRHUFI6JGZhbHNlLCB0R1BSOiR0cnVlLCBpbW06JGNjKSkqL10+Ow0KKw0KKw0KKy8vIDE2LWJpdCBtb3ZjYyBpbiBJVCBibG9ja3MgZm9yIFRodW1iMi4NCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4gew0KK2RlZiB0TU9WQ0NyIDogVDFwSXQ8KG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokbGhzLCBHUFI6JHJocyksIElJQ19pQ01PVnIsDQorICAgICAgICAgICAgICAgICAgICAibW92IiwgIlx0JGRzdCwgJHJocyIsIFtdPiwNCisgICAgICAgICAgICAgIFQxU3BlY2lhbDx7MSwwLD8sP30+Ow0KKw0KK2RlZiB0TU9WQ0NpIDogVDFwSXQ8KG91dHMgdEdQUjokZHN0KSwgKGlucyB0R1BSOiRsaHMsIGkzMmltbTokcmhzKSwgSUlDX2lDTU9WaSwNCisgICAgICAgICAgICAgICAgICAgICJtb3YiLCAiXHQkZHN0LCAkcmhzIiwgW10+LA0KKyAgICAgICAgICAgICAgVDFHZW5lcmFsPHsxLDAsMCw/LD99PjsNCit9IC8vIG5ldmVySGFzU2lkZUVmZmVjdHMNCisNCisvLyB0TEVBcGNyZWwgLSBMb2FkIGEgcGMtcmVsYXRpdmUgYWRkcmVzcyBpbnRvIGEgcmVnaXN0ZXIgd2l0aG91dCBvZmZlbmRpbmcgdGhlDQorLy8gYXNzZW1ibGVyLg0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCitkZWYgdExFQXBjcmVsIDogVDFJPChvdXRzIHRHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRsYWJlbCwgcHJlZDokcCksIElJQ19pQUxVaSwNCisgICAgICAgICAgICAgICAgICAgICJhZHIkcFx0JGRzdCwgIyRsYWJlbCIsIFtdPiwNCisgICAgICAgICAgICAgICAgVDFFbmNvZGluZzx7MSwwLDEsMCwwLD99PjsgLy8gQTYuMiAmIEE4LjYuMTANCisNCit9IC8vIG5ldmVySGFzU2lkZUVmZmVjdHMNCitkZWYgdExFQXBjcmVsSlQgOiBUMUk8KG91dHMgdEdQUjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgKGlucyBpMzJpbW06JGxhYmVsLCBub2hhc2hfaW1tOiRpZCwgcHJlZDokcCksDQorICAgICAgICAgICAgICAgICAgICAgIElJQ19pQUxVaSwgImFkciRwXHQkZHN0LCAjJHtsYWJlbH1fJHtpZH0iLCBbXT4sDQorICAgICAgICAgICAgICAgICAgVDFFbmNvZGluZzx7MSwwLDEsMCwwLD99PjsgLy8gQTYuMiAmIEE4LjYuMTANCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFRMUyBJbnN0cnVjdGlvbnMNCisvLw0KKw0KKy8vIF9fYWVhYmlfcmVhZF90cCBwcmVzZXJ2ZXMgdGhlIHJlZ2lzdGVycyByMS1yMy4NCitsZXQgaXNDYWxsID0gMSwNCisgIERlZnMgPSBbUjAsIExSXSBpbiB7DQorICBkZWYgdFRQc29mdCA6IFRJeDI8MGIxMTExMCwgMGIxMSwgMSwgKG91dHMpLCAoaW5zKSwgSUlDX0JyLA0KKyAgICAgICAgICAgICAgICAgICAgICJibFx0X19hZWFiaV9yZWFkX3RwIiwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMCwgQVJNdGhyZWFkX3BvaW50ZXIpXT47DQorfQ0KKw0KKy8vIFNKTEogRXhjZXB0aW9uIGhhbmRsaW5nIGludHJpbnNpY3MNCisvLyAgIGVoX3NqbGpfc2V0am1wKCkgaXMgYW4gaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgdG8gc3RvcmUgdGhlIHJldHVybg0KKy8vICAgYWRkcmVzcyBhbmQgc2F2ZSAjMCBpbiBSMCBmb3IgdGhlIG5vbi1sb25nam1wIGNhc2UuDQorLy8gICBTaW5jZSBieSBpdHMgbmF0dXJlIHdlIG1heSBiZSBjb21pbmcgZnJvbSBzb21lIG90aGVyIGZ1bmN0aW9uIHRvIGdldA0KKy8vICAgaGVyZSwgYW5kIHdlJ3JlIHVzaW5nIHRoZSBzdGFjayBmcmFtZSBmb3IgdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24gdG8NCisvLyAgIHNhdmUvcmVzdG9yZSByZWdpc3RlcnMsIHdlIGNhbid0IGtlZXAgYW55dGhpbmcgbGl2ZSBpbiByZWdzIGFjcm9zcw0KKy8vICAgdGhlIGVoX3NqbGpfc2V0am1wKCksIGVsc2UgaXQgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGhhdmUgYmVlbiB0cm9tcGVkIHVwb24NCisvLyAgIHdoZW4gd2UgZ2V0IGhlcmUgZnJvbSBhIGxvbmdqbXAoKS4gV2UgZm9yY2UgZXZlcnRoaW5nIG91dCBvZiByZWdpc3RlcnMNCisvLyAgIGV4Y2VwdCBmb3Igb3VyIG93biBpbnB1dCBieSBsaXN0aW5nIHRoZSByZWxldmFudCByZWdpc3RlcnMgaW4gRGVmcy4gQnkNCisvLyAgIGRvaW5nIHNvLCB3ZSBhbHNvIGNhdXNlIHRoZSBwcm9sb2d1ZS9lcGlsb2d1ZSBjb2RlIHRvIGFjdGl2ZWx5IHByZXNlcnZlDQorLy8gICBhbGwgb2YgdGhlIGNhbGxlZS1zYXZlZCByZXNnaXN0ZXJzLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4NCisvLyAgICR2YWwgaXMgYSBzY3JhdGNoIHJlZ2lzdGVyIGZvciBvdXIgdXNlLg0KK2xldCBEZWZzID0NCisgIFsgUjAsICBSMSwgIFIyLCAgUjMsICBSNCwgIFI1LCAgUjYsICBSNywgUjEyIF0sIGhhc1NpZGVFZmZlY3RzID0gMSwNCisgICBpc0JhcnJpZXIgPSAxICBpbiB7DQorICBkZWYgdEludF9laF9zamxqX3NldGptcCA6IFRodW1iWEk8KG91dHMpLChpbnMgdEdQUjokc3JjLCB0R1BSOiR2YWwpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlTm9uZSwgU2l6ZVNwZWNpYWwsIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZcdCR2YWwsIHBjXHQkezpjb21tZW50fSBiZWdpbiBlaC5zZXRqbXBcblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRzXHQkdmFsLCAjN1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0clx0JHZhbCwgWyRzcmMsICM0XVxuXHQiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnNcdHIwLCAjMFxuXHQiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJcdDFmXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92c1x0cjAsICMxXHQkezpjb21tZW50fSBlbmQgZWguc2V0am1wXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMToiLCAiIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgUjAsIChBUk1laF9zamxqX3NldGptcCB0R1BSOiRzcmMsIHRHUFI6JHZhbCkpXT47DQorfQ0KKw0KKy8vIEZJWE1FOiBOb24tRGFyd2luIHZlcnNpb24ocykNCitsZXQgaXNCYXJyaWVyID0gMSwgaGFzU2lkZUVmZmVjdHMgPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLA0KKyAgICBEZWZzID0gWyBSNywgTFIsIFNQIF0gaW4gew0KK2RlZiB0SW50X2VoX3NqbGpfbG9uZ2ptcCA6IFhJPChvdXRzKSwgKGlucyBHUFI6JHNyYywgR1BSOiRzY3JhdGNoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlTm9uZSwgU2l6ZVNwZWNpYWwsIEluZGV4TW9kZU5vbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG8sIE5vSXRpbmVyYXJ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxkclx0JHNjcmF0Y2gsIFskc3JjLCAjOF1cblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdlx0c3AsICRzY3JhdGNoXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZHJcdCRzY3JhdGNoLCBbJHNyYywgIzRdXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZHJcdHI3LCBbJHNyY11cblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ4XHQkc2NyYXRjaCIsICIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbKEFSTWVoX3NqbGpfbG9uZ2ptcCBHUFI6JHNyYywgR1BSOiRzY3JhdGNoKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzVGh1bWIsIElzRGFyd2luXT47DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTm9uLUluc3RydWN0aW9uIFBhdHRlcm5zDQorLy8NCisNCisvLyBBZGQgd2l0aCBjYXJyeQ0KK2RlZiA6IFQxUGF0PChhZGRjICAgdEdQUjokbGhzLCBpbW0wXzc6JHJocyksDQorICAgICAgICAgICAgKHRBRERpMyB0R1BSOiRsaHMsIGltbTBfNzokcmhzKT47DQorZGVmIDogVDFQYXQ8KGFkZGMgICB0R1BSOiRsaHMsIGltbThfMjU1OiRyaHMpLA0KKyAgICAgICAgICAgICh0QUREaTggdEdQUjokbGhzLCBpbW04XzI1NTokcmhzKT47DQorZGVmIDogVDFQYXQ8KGFkZGMgICB0R1BSOiRsaHMsIHRHUFI6JHJocyksDQorICAgICAgICAgICAgKHRBRERyciB0R1BSOiRsaHMsIHRHUFI6JHJocyk+Ow0KKw0KKy8vIFN1YnRyYWN0IHdpdGggY2FycnkNCitkZWYgOiBUMVBhdDwoYWRkYyAgIHRHUFI6JGxocywgaW1tMF83X25lZzokcmhzKSwNCisgICAgICAgICAgICAodFNVQmkzIHRHUFI6JGxocywgaW1tMF83X25lZzokcmhzKT47DQorZGVmIDogVDFQYXQ8KGFkZGMgICB0R1BSOiRsaHMsIGltbThfMjU1X25lZzokcmhzKSwNCisgICAgICAgICAgICAodFNVQmk4IHRHUFI6JGxocywgaW1tOF8yNTVfbmVnOiRyaHMpPjsNCitkZWYgOiBUMVBhdDwoc3ViYyAgIHRHUFI6JGxocywgdEdQUjokcmhzKSwNCisgICAgICAgICAgICAodFNVQnJyIHRHUFI6JGxocywgdEdQUjokcmhzKT47DQorDQorLy8gQ29uc3RhbnRQb29sLCBHbG9iYWxBZGRyZXNzDQorZGVmIDogVDFQYXQ8KEFSTVdyYXBwZXIgIHRnbG9iYWxhZGRyIDokZHN0KSwgKHRMRUFwY3JlbCB0Z2xvYmFsYWRkciA6JGRzdCk+Ow0KK2RlZiA6IFQxUGF0PChBUk1XcmFwcGVyICB0Y29uc3Rwb29sICA6JGRzdCksICh0TEVBcGNyZWwgdGNvbnN0cG9vbCAgOiRkc3QpPjsNCisNCisvLyBKdW1wVGFibGUNCitkZWYgOiBUMVBhdDwoQVJNV3JhcHBlckpUIHRqdW1wdGFibGU6JGRzdCwgaW1tOiRpZCksDQorICAgICAgICAgICAgKHRMRUFwY3JlbEpUIHRqdW1wdGFibGU6JGRzdCwgaW1tOiRpZCk+Ow0KKw0KKy8vIERpcmVjdCBjYWxscw0KK2RlZiA6IFQxUGF0PChBUk10Y2FsbCB0ZXh0ZXJuYWxzeW06JGZ1bmMpLCAodEJMIHRleHRlcm5hbHN5bTokZnVuYyk+LA0KKyAgICAgIFJlcXVpcmVzPFtJc1RodW1iLCBJc05vdERhcndpbl0+Ow0KK2RlZiA6IFQxUGF0PChBUk10Y2FsbCB0ZXh0ZXJuYWxzeW06JGZ1bmMpLCAodEJMcjkgdGV4dGVybmFsc3ltOiRmdW5jKT4sDQorICAgICAgUmVxdWlyZXM8W0lzVGh1bWIsIElzRGFyd2luXT47DQorDQorZGVmIDogVHY1UGF0PChBUk1jYWxsIHRleHRlcm5hbHN5bTokZnVuYyksICh0QkxYaSB0ZXh0ZXJuYWxzeW06JGZ1bmMpPiwNCisgICAgICBSZXF1aXJlczxbSXNUaHVtYiwgSGFzVjVULCBJc05vdERhcndpbl0+Ow0KK2RlZiA6IFR2NVBhdDwoQVJNY2FsbCB0ZXh0ZXJuYWxzeW06JGZ1bmMpLCAodEJMWGlfcjkgdGV4dGVybmFsc3ltOiRmdW5jKT4sDQorICAgICAgUmVxdWlyZXM8W0lzVGh1bWIsIEhhc1Y1VCwgSXNEYXJ3aW5dPjsNCisNCisvLyBJbmRpcmVjdCBjYWxscyB0byBBUk0gcm91dGluZXMNCitkZWYgOiBUdjVQYXQ8KEFSTWNhbGwgR1BSOiRkc3QpLCAodEJMWHIgR1BSOiRkc3QpPiwNCisgICAgICBSZXF1aXJlczxbSXNUaHVtYiwgSGFzVjVULCBJc05vdERhcndpbl0+Ow0KK2RlZiA6IFR2NVBhdDwoQVJNY2FsbCBHUFI6JGRzdCksICh0QkxYcl9yOSBHUFI6JGRzdCk+LA0KKyAgICAgIFJlcXVpcmVzPFtJc1RodW1iLCBIYXNWNVQsIElzRGFyd2luXT47DQorDQorLy8gemV4dGxvYWQgaTEgLT4gemV4dGxvYWQgaTgNCitkZWYgOiBUMVBhdDwoemV4dGxvYWRpMSB0X2FkZHJtb2RlX3MxOiRhZGRyKSwNCisgICAgICAgICAgICAodExEUkIgdF9hZGRybW9kZV9zMTokYWRkcik+Ow0KKw0KKy8vIGV4dGxvYWQgLT4gemV4dGxvYWQNCitkZWYgOiBUMVBhdDwoZXh0bG9hZGkxICB0X2FkZHJtb2RlX3MxOiRhZGRyKSwgICh0TERSQiB0X2FkZHJtb2RlX3MxOiRhZGRyKT47DQorZGVmIDogVDFQYXQ8KGV4dGxvYWRpOCAgdF9hZGRybW9kZV9zMTokYWRkciksICAodExEUkIgdF9hZGRybW9kZV9zMTokYWRkcik+Ow0KK2RlZiA6IFQxUGF0PChleHRsb2FkaTE2IHRfYWRkcm1vZGVfczI6JGFkZHIpLCAgKHRMRFJIIHRfYWRkcm1vZGVfczI6JGFkZHIpPjsNCisNCisvLyBJZiBpdCdzIGltcG9zc2libGUgdG8gdXNlIFtyLHJdIGFkZHJlc3MgbW9kZSBmb3Igc2V4dGxvYWQsIHNlbGVjdCB0bw0KKy8vIGxkcntifGh9ICsgc3h0e2J8aH0gaW5zdGVhZC4NCitkZWYgOiBUMVBhdDwoc2V4dGxvYWRpOCB0X2FkZHJtb2RlX3MxOiRhZGRyKSwNCisgICAgICAgICAgICAodFNYVEIgKHRMRFJCIHRfYWRkcm1vZGVfczE6JGFkZHIpKT4sDQorICAgICAgUmVxdWlyZXM8W0lzVGh1bWIxT25seSwgSGFzVjZdPjsNCitkZWYgOiBUMVBhdDwoc2V4dGxvYWRpMTYgdF9hZGRybW9kZV9zMjokYWRkciksDQorICAgICAgICAgICAgKHRTWFRIICh0TERSSCB0X2FkZHJtb2RlX3MyOiRhZGRyKSk+LA0KKyAgICAgIFJlcXVpcmVzPFtJc1RodW1iMU9ubHksIEhhc1Y2XT47DQorDQorZGVmIDogVDFQYXQ8KHNleHRsb2FkaTggdF9hZGRybW9kZV9zMTokYWRkciksDQorICAgICAgICAgICAgKHRBU1JyaSAodExTTHJpICh0TERSQiB0X2FkZHJtb2RlX3MxOiRhZGRyKSwgMjQpLCAyNCk+Ow0KK2RlZiA6IFQxUGF0PChzZXh0bG9hZGkxNiB0X2FkZHJtb2RlX3MxOiRhZGRyKSwNCisgICAgICAgICAgICAodEFTUnJpICh0TFNMcmkgKHRMRFJIIHRfYWRkcm1vZGVfczE6JGFkZHIpLCAxNiksIDE2KT47DQorDQorLy8gTGFyZ2UgaW1tZWRpYXRlIGhhbmRsaW5nLg0KKw0KKy8vIFR3byBwaWVjZSBpbW1zLg0KK2RlZiA6IFQxUGF0PChpMzIgdGh1bWJfaW1tc2hpZnRlZDokc3JjKSwNCisgICAgICAgICAgICAodExTTHJpICh0TU9WaTggKHRodW1iX2ltbXNoaWZ0ZWRfdmFsIGltbTokc3JjKSksDQorICAgICAgICAgICAgICAgICAgICAodGh1bWJfaW1tc2hpZnRlZF9zaGFtdCBpbW06JHNyYykpPjsNCisNCitkZWYgOiBUMVBhdDwoaTMyIGltbTBfMjU1X2NvbXA6JHNyYyksDQorICAgICAgICAgICAgKHRNVk4gKHRNT1ZpOCAoaW1tX2NvbXBfWEZPUk0gaW1tOiRzcmMpKSk+Ow0KKw0KKy8vIFBzZXVkbyBpbnN0cnVjdGlvbiB0aGF0IGNvbWJpbmVzIGxkciBmcm9tIGNvbnN0cG9vbCBhbmQgYWRkIHBjLiBUaGlzIHNob3VsZA0KKy8vIGJlIGV4cGFuZGVkIGludG8gdHdvIGluc3RydWN0aW9ucyBsYXRlIHRvIGFsbG93IGlmLWNvbnZlcnNpb24gYW5kDQorLy8gc2NoZWR1bGluZy4NCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbg0KK2RlZiB0TERScGNpX3BpYyA6IFBzZXVkb0luc3Q8KG91dHMgR1BSOiRkc3QpLCAoaW5zIGkzMmltbTokYWRkciwgcGNsYWJlbDokY3ApLA0KKyAgICAgICAgICAgICAgICAgICBOb0l0aW5lcmFyeSwNCisgICAgICAgICAgICAgICAgICAgIiR7OmNvbW1lbnR9IGxkci5uXHQkZHN0LCAkYWRkclxuJGNwOlxuXHRhZGRcdCRkc3QsIHBjIiwNCisgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKEFSTXBpY19hZGQgKGxvYWQgKEFSTVdyYXBwZXIgdGNvbnN0cG9vbDokYWRkcikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JGNwKSldPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjFPbmx5XT47DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSW5zdHJUaHVtYjIudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JbnN0clRodW1iMi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGY2MjllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSW5zdHJUaHVtYjIudGQKQEAgLTAsMCArMSwyNzczIEBACisvLz09PS0gQVJNSW5zdHJUaHVtYjIudGQgLSBUaHVtYjIgc3VwcG9ydCBmb3IgQVJNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIFRodW1iMiBpbnN0cnVjdGlvbiBzZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gSVQgYmxvY2sgcHJlZGljYXRlIGZpZWxkCitkZWYgaXRfcHJlZCA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludE1hbmRhdG9yeVByZWRpY2F0ZU9wZXJhbmQiOworfQorCisvLyBJVCBibG9jayBjb25kaXRpb24gbWFzaworZGVmIGl0X21hc2sgOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRUaHVtYklUTWFzayI7Cit9CisKKy8vIFRhYmxlIGJyYW5jaCBhZGRyZXNzCitkZWYgdGJfYWRkcm1vZGUgOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRUQkFkZHJNb2RlIjsKK30KKworLy8gU2hpZnRlZCBvcGVyYW5kcy4gTm8gcmVnaXN0ZXIgY29udHJvbGxlZCBzaGlmdHMgZm9yIFRodW1iMi4KKy8vIE5vdGU6IFdlIGRvIG5vdCBzdXBwb3J0IHJyeCBzaGlmdGVkIG9wZXJhbmRzIHlldC4KK2RlZiB0Ml9zb19yZWcgOiBPcGVyYW5kPGkzMj4sICAgIC8vIHJlZyBpbW0KKyAgICAgICAgICAgICAgICBDb21wbGV4UGF0dGVybjxpMzIsIDIsICJTZWxlY3RUMlNoaWZ0ZXJPcGVyYW5kUmVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hsLHNybCxzcmEscm90cl0+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VDJTT09wZXJhbmQiOworICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgckdQUiwgaTMyaW1tKTsKK30KKworLy8gdDJfc29faW1tX25vdF9YRk9STSAtIFJldHVybiB0aGUgY29tcGxlbWVudCBvZiBhIHQyX3NvX2ltbSB2YWx1ZQorZGVmIHQyX3NvX2ltbV9ub3RfWEZPUk0gOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KH4oKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpKSwgTVZUOjppMzIpOworfV0+OworCisvLyB0Ml9zb19pbW1fbmVnX1hGT1JNIC0gUmV0dXJuIHRoZSBuZWdhdGlvbiBvZiBhIHQyX3NvX2ltbSB2YWx1ZQorZGVmIHQyX3NvX2ltbV9uZWdfWEZPUk0gOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KC0oKGludClOLT5nZXRaRXh0VmFsdWUoKSksIE1WVDo6aTMyKTsKK31dPjsKKworLy8gdDJfc29faW1tIC0gTWF0Y2ggYSAzMi1iaXQgaW1tZWRpYXRlIG9wZXJhbmQsIHdoaWNoIGlzIGFuCisvLyA4LWJpdCBpbW1lZGlhdGUgcm90YXRlZCBieSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJpdHMsIG9yIGFuIDgtYml0CisvLyBpbW1lZGlhdGUgc3BsYXR0ZWQgaW50byBtdWx0aXBsZSBieXRlcyBvZiB0aGUgd29yZC4gdDJfc29faW1tIHZhbHVlcyBhcmUKKy8vIHJlcHJlc2VudGVkIGluIHRoZSBpbW0gZmllbGQgaW4gdGhlIHNhbWUgMTItYml0IGZvcm0gdGhhdCB0aGV5IGFyZSBlbmNvZGVkCisvLyBpbnRvIHQyX3NvX2ltbSBpbnN0cnVjdGlvbnM6IHRoZSA4LWJpdCBpbW1lZGlhdGUgaXMgdGhlIGxlYXN0IHNpZ25pZmljYW50CisvLyBiaXRzIFtiaXRzIDAtN10sIHRoZSA0LWJpdCBzaGlmdC9zcGxhdCBhbW91bnQgaXMgdGhlIG5leHQgNCBiaXRzIFtiaXRzIDgtMTFdLgorZGVmIHQyX3NvX2ltbSA6IE9wZXJhbmQ8aTMyPiwKKyAgICAgICAgICAgICAgICBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gQVJNX0FNOjpnZXRUMlNPSW1tVmFsKCh1aW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSkgIT0gLTE7Cit9XT47CisKKy8vIHQyX3NvX2ltbV9ub3QgLSBNYXRjaCBhbiBpbW1lZGlhdGUgdGhhdCBpcyBhIGNvbXBsZW1lbnQKKy8vIG9mIGEgdDJfc29faW1tLgorZGVmIHQyX3NvX2ltbV9ub3QgOiBPcGVyYW5kPGkzMj4sCisgICAgICAgICAgICAgICAgICAgIFBhdExlYWY8KGltbSksIFt7CisgIHJldHVybiBBUk1fQU06OmdldFQyU09JbW1WYWwofigodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkpKSAhPSAtMTsKK31dLCB0Ml9zb19pbW1fbm90X1hGT1JNPjsKKworLy8gdDJfc29faW1tX25lZyAtIE1hdGNoIGFuIGltbWVkaWF0ZSB0aGF0IGlzIGEgbmVnYXRpb24gb2YgYSB0Ml9zb19pbW0uCitkZWYgdDJfc29faW1tX25lZyA6IE9wZXJhbmQ8aTMyPiwKKyAgICAgICAgICAgICAgICAgICAgUGF0TGVhZjwoaW1tKSwgW3sKKyAgcmV0dXJuIEFSTV9BTTo6Z2V0VDJTT0ltbVZhbCgtKChpbnQpTi0+Z2V0WkV4dFZhbHVlKCkpKSAhPSAtMTsKK31dLCB0Ml9zb19pbW1fbmVnX1hGT1JNPjsKKworLy8gQnJlYWsgdDJfc29faW1tJ3MgdXAgaW50byB0d28gcGllY2VzLiAgVGhpcyBoYW5kbGVzIGltbWVkaWF0ZXMgd2l0aCB1cCB0byAxNgorLy8gYml0cyBzZXQgaW4gdGhlbS4gIFRoaXMgdXNlcyB0Ml9zb19pbW0ycGFydCB0byBtYXRjaCBhbmQgdDJfc29faW1tMnBhcnRfWzEyXQorLy8gdG8gZ2V0IHRoZSBmaXJzdC9zZWNvbmQgcGllY2VzLgorZGVmIHQyX3NvX2ltbTJwYXJ0IDogT3BlcmFuZDxpMzI+LAorICAgICAgICAgICAgICAgICAgUGF0TGVhZjwoaW1tKSwgW3sKKyAgICAgIHJldHVybiBBUk1fQU06OmlzVDJTT0ltbVR3b1BhcnRWYWwoKHVuc2lnbmVkKU4tPmdldFpFeHRWYWx1ZSgpKTsKKyAgICB9XT4geworfQorCitkZWYgdDJfc29faW1tMnBhcnRfMSA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgdW5zaWduZWQgViA9IEFSTV9BTTo6Z2V0VDJTT0ltbVR3b1BhcnRGaXJzdCgodW5zaWduZWQpTi0+Z2V0WkV4dFZhbHVlKCkpOworICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChWLCBNVlQ6OmkzMik7Cit9XT47CisKK2RlZiB0Ml9zb19pbW0ycGFydF8yIDogU0ROb2RlWEZvcm08aW1tLCBbeworICB1bnNpZ25lZCBWID0gQVJNX0FNOjpnZXRUMlNPSW1tVHdvUGFydFNlY29uZCgodW5zaWduZWQpTi0+Z2V0WkV4dFZhbHVlKCkpOworICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChWLCBNVlQ6OmkzMik7Cit9XT47CisKK2RlZiB0Ml9zb19uZWdfaW1tMnBhcnQgOiBPcGVyYW5kPGkzMj4sIFBhdExlYWY8KGltbSksIFt7CisgICAgICByZXR1cm4gQVJNX0FNOjppc1QyU09JbW1Ud29QYXJ0VmFsKC0oaW50KU4tPmdldFpFeHRWYWx1ZSgpKTsKKyAgICB9XT4geworfQorCitkZWYgdDJfc29fbmVnX2ltbTJwYXJ0XzEgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIHVuc2lnbmVkIFYgPSBBUk1fQU06OmdldFQyU09JbW1Ud29QYXJ0Rmlyc3QoLShpbnQpTi0+Z2V0WkV4dFZhbHVlKCkpOworICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChWLCBNVlQ6OmkzMik7Cit9XT47CisKK2RlZiB0Ml9zb19uZWdfaW1tMnBhcnRfMiA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgdW5zaWduZWQgViA9IEFSTV9BTTo6Z2V0VDJTT0ltbVR3b1BhcnRTZWNvbmQoLShpbnQpTi0+Z2V0WkV4dFZhbHVlKCkpOworICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChWLCBNVlQ6OmkzMik7Cit9XT47CisKKy8vLyBpbW0xXzMxIHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIDMyLWJpdCBpbW1lZGlhdGUgaXMgaW4gdGhlIHJhbmdlIFsxLDMxXS4KK2RlZiBpbW0xXzMxIDogUGF0TGVhZjwoaTMyIGltbSksIFt7CisgIHJldHVybiAoaW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSA+PSAxICYmIChpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpIDwgMzI7Cit9XT47CisKKy8vLyBpbW0wXzQwOTUgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgMzItYml0IGltbWVkaWF0ZSBpcyBpbiB0aGUgcmFuZ2UgWzAuNDA5NV0uCitkZWYgaW1tMF80MDk1IDogT3BlcmFuZDxpMzI+LAorICAgICAgICAgICAgICAgIFBhdExlYWY8KGkzMiBpbW0pLCBbeworICByZXR1cm4gKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpIDwgNDA5NjsKK31dPjsKKworZGVmIGltbTBfNDA5NV9uZWcgOiBQYXRMZWFmPChpMzIgaW1tKSwgW3sKKyByZXR1cm4gKHVpbnQzMl90KSgtTi0+Z2V0WkV4dFZhbHVlKCkpIDwgNDA5NjsKK31dLCBpbW1fbmVnX1hGT1JNPjsKKworZGVmIGltbTBfMjU1X25lZyA6IFBhdExlYWY8KGkzMiBpbW0pLCBbeworICByZXR1cm4gKHVpbnQzMl90KSgtTi0+Z2V0WkV4dFZhbHVlKCkpIDwgMjU1OworfV0sIGltbV9uZWdfWEZPUk0+OworCitkZWYgaW1tMF8yNTVfbm90IDogUGF0TGVhZjwoaTMyIGltbSksIFt7CisgIHJldHVybiAodWludDMyX3QpKH5OLT5nZXRaRXh0VmFsdWUoKSkgPCAyNTU7Cit9XSwgaW1tX2NvbXBfWEZPUk0+OworCisvLyBEZWZpbmUgVGh1bWIyIHNwZWNpZmljIGFkZHJlc3NpbmcgbW9kZXMuCisKKy8vIHQyYWRkcm1vZGVfaW1tMTIgIDo9IHJlZyArIGltbTEyCitkZWYgdDJhZGRybW9kZV9pbW0xMiA6IE9wZXJhbmQ8aTMyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTMyLCAyLCAiU2VsZWN0VDJBZGRyTW9kZUltbTEyIiwgW10+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VDJBZGRyTW9kZUltbTEyT3BlcmFuZCI7CisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBHUFI6JGJhc2UsIGkzMmltbTokb2Zmc2ltbSk7Cit9CisKKy8vIHQyYWRkcm1vZGVfaW1tOCAgOj0gcmVnICsvLSBpbW04CitkZWYgdDJhZGRybW9kZV9pbW04IDogT3BlcmFuZDxpMzI+LAorICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXhQYXR0ZXJuPGkzMiwgMiwgIlNlbGVjdFQyQWRkck1vZGVJbW04IiwgW10+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VDJBZGRyTW9kZUltbThPcGVyYW5kIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdQUjokYmFzZSwgaTMyaW1tOiRvZmZzaW1tKTsKK30KKworZGVmIHQyYW1faW1tOF9vZmZzZXQgOiBPcGVyYW5kPGkzMj4sCisgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXhQYXR0ZXJuPGkzMiwgMSwgIlNlbGVjdFQyQWRkck1vZGVJbW04T2Zmc2V0IiwgW10+eworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRUMkFkZHJNb2RlSW1tOE9mZnNldE9wZXJhbmQiOworfQorCisvLyB0MmFkZHJtb2RlX2ltbThzNCAgOj0gcmVnICsvLSAoaW1tOCA8PCAyKQorZGVmIHQyYWRkcm1vZGVfaW1tOHM0IDogT3BlcmFuZDxpMzI+LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTMyLCAyLCAiU2VsZWN0VDJBZGRyTW9kZUltbThzNCIsIFtdPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFQyQWRkck1vZGVJbW04czRPcGVyYW5kIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdQUjokYmFzZSwgaTMyaW1tOiRvZmZzaW1tKTsKK30KKworZGVmIHQyYW1faW1tOHM0X29mZnNldCA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFQyQWRkck1vZGVJbW04czRPZmZzZXRPcGVyYW5kIjsKK30KKworLy8gdDJhZGRybW9kZV9zb19yZWcgIDo9IHJlZyArIChyZWcgPDwgaW1tMikKK2RlZiB0MmFkZHJtb2RlX3NvX3JlZyA6IE9wZXJhbmQ8aTMyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXhQYXR0ZXJuPGkzMiwgMywgIlNlbGVjdFQyQWRkck1vZGVTb1JlZyIsIFtdPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFQyQWRkck1vZGVTb1JlZ09wZXJhbmQiOworICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgR1BSOiRiYXNlLCByR1BSOiRvZmZzcmVnLCBpMzJpbW06JG9mZnNpbW0pOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNdWx0aWNsYXNzIGhlbHBlcnMuLi4KKy8vCisKKy8vLyBUMklfdW5faXJzIC0gRGVmaW5lcyBhIHNldCBvZiAob3AgcmVnLCB7c29faW1tfHJ8c29fcmVnfSkgcGF0dGVybnMgZm9yIGEKKy8vLyB1bmFyeSBvcGVyYXRpb24gdGhhdCBwcm9kdWNlcyBhIHZhbHVlLiBUaGVzZSBhcmUgcHJlZGljYWJsZSBhbmQgY2FuIGJlCisvLy8gY2hhbmdlZCB0byBtb2RpZnkgQ1BTUi4KK211bHRpY2xhc3MgVDJJX3VuX2lyczxiaXRzPDQ+IG9wY29kLCBzdHJpbmcgb3BjLCBQYXRGcmFnIG9wbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBiaXQgQ2hlYXAgPSAwLCBiaXQgUmVNYXQgPSAwPiB7CisgICAvLyBzaGlmdGVkIGltbQorICAgZGVmIGkgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgdDJfc29faW1tOiRzcmMpLCBJSUNfaU1PVmksCisgICAgICAgICAgICAgICAgb3BjLCAiXHQkZHN0LCAkc3JjIiwKKyAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgdDJfc29faW1tOiRzcmMpKV0+IHsKKyAgICAgbGV0IGlzQXNDaGVhcEFzQU1vdmUgPSBDaGVhcDsKKyAgICAgbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IFJlTWF0OworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICAgICBsZXQgSW5zdHsyNX0gPSAwOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gPzsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7IC8vIFJuCisgICAgIGxldCBJbnN0ezE1fSA9IDA7CisgICB9CisgICAvLyByZWdpc3RlcgorICAgZGVmIHIgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjKSwgSUlDX2lNT1ZyLAorICAgICAgICAgICAgICAgIG9wYywgIi53XHQkZHN0LCAkc3JjIiwKKyAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgckdQUjokc3JjKSldPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgICAgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSA/OyAvLyBUaGUgUyBiaXQuCisgICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4KKyAgICAgbGV0IEluc3R7MTQtMTJ9ID0gMGIwMDA7IC8vIGltbTMKKyAgICAgbGV0IEluc3R7Ny02fSA9IDBiMDA7IC8vIGltbTIKKyAgICAgbGV0IEluc3R7NS00fSA9IDBiMDA7IC8vIHR5cGUKKyAgIH0KKyAgIC8vIHNoaWZ0ZWQgcmVnaXN0ZXIKKyAgIGRlZiBzIDogVDJzSTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHQyX3NvX3JlZzokc3JjKSwgSUlDX2lNT1ZzaSwKKyAgICAgICAgICAgICAgICBvcGMsICIud1x0JGRzdCwgJHNyYyIsCisgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIHQyX3NvX3JlZzokc3JjKSldPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgICAgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSA/OyAvLyBUaGUgUyBiaXQuCisgICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4KKyAgIH0KK30KKworLy8vIFQySV9iaW5faXJzIC0gRGVmaW5lcyBhIHNldCBvZiAob3AgcmVnLCB7c29faW1tfHJ8c29fcmVnfSkgcGF0dGVybnMgZm9yIGEKKy8vLyBiaW5hcnkgb3BlcmF0aW9uIHRoYXQgcHJvZHVjZXMgYSB2YWx1ZS4gVGhlc2UgYXJlIHByZWRpY2FibGUgYW5kIGNhbiBiZQorLy8vIGNoYW5nZWQgdG8gbW9kaWZ5IENQU1IuCittdWx0aWNsYXNzIFQySV9iaW5faXJzPGJpdHM8ND4gb3Bjb2QsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlLAorICAgICAgICAgICAgICAgICAgICAgICBiaXQgQ29tbXV0YWJsZSA9IDAsIHN0cmluZyB3aWRlID0iIj4geworICAgLy8gc2hpZnRlZCBpbW0KKyAgIGRlZiByaSA6IFQyc0k8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRsaHMsIHQyX3NvX2ltbTokcmhzKSwgSUlDX2lBTFVpLAorICAgICAgICAgICAgICAgICBvcGMsICJcdCRkc3QsICRsaHMsICRyaHMiLAorICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgckdQUjokbGhzLCB0Ml9zb19pbW06JHJocykpXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICAgICBsZXQgSW5zdHsyNX0gPSAwOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gPzsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxNX0gPSAwOworICAgfQorICAgLy8gcmVnaXN0ZXIKKyAgIGRlZiByciA6IFQyc0k8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRsaHMsIHJHUFI6JHJocyksIElJQ19pQUxVciwKKyAgICAgICAgICAgICAgICAgb3BjLCAhc3RyY29uY2F0KHdpZGUsICJcdCRkc3QsICRsaHMsICRyaHMiKSwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIHJHUFI6JGxocywgckdQUjokcmhzKSldPiB7CisgICAgIGxldCBpc0NvbW11dGFibGUgPSBDb21tdXRhYmxlOworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICAgICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gPzsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxNC0xMn0gPSAwYjAwMDsgLy8gaW1tMworICAgICBsZXQgSW5zdHs3LTZ9ID0gMGIwMDsgLy8gaW1tMgorICAgICBsZXQgSW5zdHs1LTR9ID0gMGIwMDsgLy8gdHlwZQorICAgfQorICAgLy8gc2hpZnRlZCByZWdpc3RlcgorICAgZGVmIHJzIDogVDJzSTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGxocywgdDJfc29fcmVnOiRyaHMpLCBJSUNfaUFMVXNpLAorICAgICAgICAgICAgICAgICBvcGMsICFzdHJjb25jYXQod2lkZSwgIlx0JGRzdCwgJGxocywgJHJocyIpLAorICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgckdQUjokbGhzLCB0Ml9zb19yZWc6JHJocykpXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICAgICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gPzsgLy8gVGhlIFMgYml0LgorICAgfQorfQorCisvLy8gVDJJX2Jpbl93X2lycyAtIFNhbWUgYXMgVDJJX2Jpbl9pcnMgZXhjZXB0IHRoZXNlIG9wZXJhdGlvbnMgbmVlZAorLy8gIHRoZSAiLnciIHByZWZpeCB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgYXJlIHdpZGUuCittdWx0aWNsYXNzIFQySV9iaW5fd19pcnM8Yml0czw0PiBvcGNvZCwgc3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYml0IENvbW11dGFibGUgPSAwPiA6CisgICAgVDJJX2Jpbl9pcnM8b3Bjb2QsIG9wYywgb3Bub2RlLCBDb21tdXRhYmxlLCAiLnciPjsKKworLy8vIFQySV9yYmluX2lzIC0gU2FtZSBhcyBUMklfYmluX2lycyBleGNlcHQgdGhlIG9yZGVyIG9mIG9wZXJhbmRzIGFyZQorLy8vIHJldmVyc2VkLiBJdCBkb2Vzbid0IGRlZmluZSB0aGUgJ3JyJyBmb3JtIHNpbmNlIGl0J3MgaGFuZGxlZCBieSBpdHMKKy8vLyBUMklfYmluX2lycyBjb3VudGVycGFydC4KK211bHRpY2xhc3MgVDJJX3JiaW5faXM8Yml0czw0PiBvcGNvZCwgc3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGU+IHsKKyAgIC8vIHNoaWZ0ZWQgaW1tCisgICBkZWYgcmkgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokcmhzLCB0Ml9zb19pbW06JGxocyksIElJQ19pQUxVaSwKKyAgICAgICAgICAgICAgICAgb3BjLCAiLndcdCRkc3QsICRyaHMsICRsaHMiLAorICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgdDJfc29faW1tOiRsaHMsIHJHUFI6JHJocykpXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICAgICBsZXQgSW5zdHsyNX0gPSAwOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gPzsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxNX0gPSAwOworICAgfQorICAgLy8gc2hpZnRlZCByZWdpc3RlcgorICAgZGVmIHJzIDogVDJzSTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JHJocywgdDJfc29fcmVnOiRsaHMpLCBJSUNfaUFMVXNpLAorICAgICAgICAgICAgICAgICBvcGMsICJcdCRkc3QsICRyaHMsICRsaHMiLAorICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgdDJfc29fcmVnOiRsaHMsIHJHUFI6JHJocykpXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICAgICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gPzsgLy8gVGhlIFMgYml0LgorICAgfQorfQorCisvLy8gVDJJX2Jpbl9zX2lycyAtIFNpbWlsYXIgdG8gVDJJX2Jpbl9pcnMgZXhjZXB0IGl0IHNldHMgdGhlICdzJyBiaXQgc28gdGhlCisvLy8gaW5zdHJ1Y3Rpb24gbW9kaWZpZXMgdGhlIENQU1IgcmVnaXN0ZXIuCitsZXQgRGVmcyA9IFtDUFNSXSBpbiB7CittdWx0aWNsYXNzIFQySV9iaW5fc19pcnM8Yml0czw0PiBvcGNvZCwgc3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYml0IENvbW11dGFibGUgPSAwPiB7CisgICAvLyBzaGlmdGVkIGltbQorICAgZGVmIHJpIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgR1BSOiRsaHMsIHQyX3NvX2ltbTokcmhzKSwgSUlDX2lBTFVpLAorICAgICAgICAgICAgICAgICFzdHJjb25jYXQob3BjLCAicyIpLCAiLndcdCRkc3QsICRsaHMsICRyaHMiLAorICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKG9wbm9kZSBHUFI6JGxocywgdDJfc29faW1tOiRyaHMpKV0+IHsKKyAgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgICAgbGV0IEluc3R7MjV9ID0gMDsKKyAgICAgbGV0IEluc3R7MjQtMjF9ID0gb3Bjb2Q7CisgICAgIGxldCBJbnN0ezIwfSA9IDE7IC8vIFRoZSBTIGJpdC4KKyAgICAgbGV0IEluc3R7MTV9ID0gMDsKKyAgIH0KKyAgIC8vIHJlZ2lzdGVyCisgICBkZWYgcnIgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyBHUFI6JGxocywgckdQUjokcmhzKSwgSUlDX2lBTFVyLAorICAgICAgICAgICAgICAgICFzdHJjb25jYXQob3BjLCAicyIpLCAiLndcdCRkc3QsICRsaHMsICRyaHMiLAorICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKG9wbm9kZSBHUFI6JGxocywgckdQUjokcmhzKSldPiB7CisgICAgIGxldCBpc0NvbW11dGFibGUgPSBDb21tdXRhYmxlOworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICAgICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gMTsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxNC0xMn0gPSAwYjAwMDsgLy8gaW1tMworICAgICBsZXQgSW5zdHs3LTZ9ID0gMGIwMDsgLy8gaW1tMgorICAgICBsZXQgSW5zdHs1LTR9ID0gMGIwMDsgLy8gdHlwZQorICAgfQorICAgLy8gc2hpZnRlZCByZWdpc3RlcgorICAgZGVmIHJzIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgR1BSOiRsaHMsIHQyX3NvX3JlZzokcmhzKSwgSUlDX2lBTFVzaSwKKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgInMiKSwgIi53XHQkZHN0LCAkbGhzLCAkcmhzIiwKKyAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgR1BSOiRsaHMsIHQyX3NvX3JlZzokcmhzKSldPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgICAgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSAxOyAvLyBUaGUgUyBiaXQuCisgICB9Cit9Cit9CisKKy8vLyBUMklfYmluX2lpMTJycyAtIERlZmluZXMgYSBzZXQgb2YgKG9wIHJlZywge3NvX2ltbXxpbW0wXzQwOTV8cnxzb19yZWd9KQorLy8vIHBhdHRlcm5zIGZvciBhIGJpbmFyeSBvcGVyYXRpb24gdGhhdCBwcm9kdWNlcyBhIHZhbHVlLgorbXVsdGljbGFzcyBUMklfYmluX2lpMTJyczxiaXRzPDM+IG9wMjNfMjEsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgQ29tbXV0YWJsZSA9IDA+IHsKKyAgIC8vIHNoaWZ0ZWQgaW1tCisgICBkZWYgcmkgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgR1BSOiRsaHMsIHQyX3NvX2ltbTokcmhzKSwgSUlDX2lBTFVpLAorICAgICAgICAgICAgICAgICBvcGMsICIud1x0JGRzdCwgJGxocywgJHJocyIsCisgICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKG9wbm9kZSBHUFI6JGxocywgdDJfc29faW1tOiRyaHMpKV0+IHsKKyAgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgICAgbGV0IEluc3R7MjV9ID0gMDsKKyAgICAgbGV0IEluc3R7MjR9ID0gMTsKKyAgICAgbGV0IEluc3R7MjMtMjF9ID0gb3AyM18yMTsKKyAgICAgbGV0IEluc3R7MjB9ID0gMDsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxNX0gPSAwOworICAgfQorICAgLy8gMTItYml0IGltbQorICAgZGVmIHJpMTIgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyBHUFI6JGxocywgaW1tMF80MDk1OiRyaHMpLCBJSUNfaUFMVWksCisgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgInciKSwgIlx0JGRzdCwgJGxocywgJHJocyIsCisgICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgR1BSOiRsaHMsIGltbTBfNDA5NTokcmhzKSldPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgICAgIGxldCBJbnN0ezI1fSA9IDE7CisgICAgIGxldCBJbnN0ezI0fSA9IDA7CisgICAgIGxldCBJbnN0ezIzLTIxfSA9IG9wMjNfMjE7CisgICAgIGxldCBJbnN0ezIwfSA9IDA7IC8vIFRoZSBTIGJpdC4KKyAgICAgbGV0IEluc3R7MTV9ID0gMDsKKyAgIH0KKyAgIC8vIHJlZ2lzdGVyCisgICBkZWYgcnIgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgR1BSOiRsaHMsIHJHUFI6JHJocyksIElJQ19pQUxVciwKKyAgICAgICAgICAgICAgICAgb3BjLCAiLndcdCRkc3QsICRsaHMsICRyaHMiLAorICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgR1BSOiRsaHMsIHJHUFI6JHJocykpXT4geworICAgICBsZXQgaXNDb21tdXRhYmxlID0gQ29tbXV0YWJsZTsKKyAgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgICAgbGV0IEluc3R7MjYtMjV9ID0gMGIwMTsKKyAgICAgbGV0IEluc3R7MjR9ID0gMTsKKyAgICAgbGV0IEluc3R7MjMtMjF9ID0gb3AyM18yMTsKKyAgICAgbGV0IEluc3R7MjB9ID0gMDsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxNC0xMn0gPSAwYjAwMDsgLy8gaW1tMworICAgICBsZXQgSW5zdHs3LTZ9ID0gMGIwMDsgLy8gaW1tMgorICAgICBsZXQgSW5zdHs1LTR9ID0gMGIwMDsgLy8gdHlwZQorICAgfQorICAgLy8gc2hpZnRlZCByZWdpc3RlcgorICAgZGVmIHJzIDogVDJzSTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIEdQUjokbGhzLCB0Ml9zb19yZWc6JHJocyksIElJQ19pQUxVc2ksCisgICAgICAgICAgICAgICAgIG9wYywgIi53XHQkZHN0LCAkbGhzLCAkcmhzIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIEdQUjokbGhzLCB0Ml9zb19yZWc6JHJocykpXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICAgICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICAgICBsZXQgSW5zdHsyNH0gPSAxOworICAgICBsZXQgSW5zdHsyMy0yMX0gPSBvcDIzXzIxOworICAgICBsZXQgSW5zdHsyMH0gPSAwOyAvLyBUaGUgUyBiaXQuCisgICB9Cit9CisKKy8vLyBUMklfYWRkZV9zdWJlX2lycyAtIERlZmluZXMgYSBzZXQgb2YgKG9wIHJlZywge3NvX2ltbXxyfHNvX3JlZ30pIHBhdHRlcm5zCisvLy8gZm9yIGEgYmluYXJ5IG9wZXJhdGlvbiB0aGF0IHByb2R1Y2VzIGEgdmFsdWUgYW5kIHVzZSB0aGUgY2FycnkKKy8vLyBiaXQuIEl0J3Mgbm90IHByZWRpY2FibGUuCitsZXQgVXNlcyA9IFtDUFNSXSBpbiB7CittdWx0aWNsYXNzIFQySV9hZGRlX3N1YmVfaXJzPGJpdHM8ND4gb3Bjb2QsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgQ29tbXV0YWJsZSA9IDA+IHsKKyAgIC8vIHNoaWZ0ZWQgaW1tCisgICBkZWYgcmkgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokbGhzLCB0Ml9zb19pbW06JHJocyksIElJQ19pQUxVaSwKKyAgICAgICAgICAgICAgICAgb3BjLCAiXHQkZHN0LCAkbGhzLCAkcmhzIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIHJHUFI6JGxocywgdDJfc29faW1tOiRyaHMpKV0+LAorICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjJdPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgICAgIGxldCBJbnN0ezI1fSA9IDA7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSAwOyAvLyBUaGUgUyBiaXQuCisgICAgIGxldCBJbnN0ezE1fSA9IDA7CisgICB9CisgICAvLyByZWdpc3RlcgorICAgZGVmIHJyIDogVDJzSTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGxocywgckdQUjokcmhzKSwgSUlDX2lBTFVyLAorICAgICAgICAgICAgICAgICBvcGMsICIud1x0JGRzdCwgJGxocywgJHJocyIsCisgICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKG9wbm9kZSByR1BSOiRsaHMsIHJHUFI6JHJocykpXT4sCisgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc1RodW1iMl0+IHsKKyAgICAgbGV0IGlzQ29tbXV0YWJsZSA9IENvbW11dGFibGU7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgICAgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSAwOyAvLyBUaGUgUyBiaXQuCisgICAgIGxldCBJbnN0ezE0LTEyfSA9IDBiMDAwOyAvLyBpbW0zCisgICAgIGxldCBJbnN0ezctNn0gPSAwYjAwOyAvLyBpbW0yCisgICAgIGxldCBJbnN0ezUtNH0gPSAwYjAwOyAvLyB0eXBlCisgICB9CisgICAvLyBzaGlmdGVkIHJlZ2lzdGVyCisgICBkZWYgcnMgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokbGhzLCB0Ml9zb19yZWc6JHJocyksIElJQ19pQUxVc2ksCisgICAgICAgICAgICAgICAgIG9wYywgIi53XHQkZHN0LCAkbGhzLCAkcmhzIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIHJHUFI6JGxocywgdDJfc29fcmVnOiRyaHMpKV0+LAorICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjJdPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgICAgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSAwOyAvLyBUaGUgUyBiaXQuCisgICB9Cit9CisKKy8vIENhcnJ5IHNldHRpbmcgdmFyaWFudHMKK2xldCBEZWZzID0gW0NQU1JdIGluIHsKK211bHRpY2xhc3MgVDJJX2FkZGVfc3ViZV9zX2lyczxiaXRzPDQ+IG9wY29kLCBzdHJpbmcgb3BjLCBQYXRGcmFnIG9wbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgQ29tbXV0YWJsZSA9IDA+IHsKKyAgIC8vIHNoaWZ0ZWQgaW1tCisgICBkZWYgcmkgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokbGhzLCB0Ml9zb19pbW06JHJocyksIElJQ19pQUxVaSwKKyAgICAgICAgICAgICAgICAgb3BjLCAiXHQkZHN0LCAkbGhzLCAkcmhzIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIHJHUFI6JGxocywgdDJfc29faW1tOiRyaHMpKV0+LAorICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjJdPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgICAgIGxldCBJbnN0ezI1fSA9IDA7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSAxOyAvLyBUaGUgUyBiaXQuCisgICAgIGxldCBJbnN0ezE1fSA9IDA7CisgICB9CisgICAvLyByZWdpc3RlcgorICAgZGVmIHJyIDogVDJzSTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGxocywgckdQUjokcmhzKSwgSUlDX2lBTFVyLAorICAgICAgICAgICAgICAgICBvcGMsICIud1x0JGRzdCwgJGxocywgJHJocyIsCisgICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKG9wbm9kZSByR1BSOiRsaHMsIHJHUFI6JHJocykpXT4sCisgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc1RodW1iMl0+IHsKKyAgICAgbGV0IGlzQ29tbXV0YWJsZSA9IENvbW11dGFibGU7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgICAgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSAxOyAvLyBUaGUgUyBiaXQuCisgICAgIGxldCBJbnN0ezE0LTEyfSA9IDBiMDAwOyAvLyBpbW0zCisgICAgIGxldCBJbnN0ezctNn0gPSAwYjAwOyAvLyBpbW0yCisgICAgIGxldCBJbnN0ezUtNH0gPSAwYjAwOyAvLyB0eXBlCisgICB9CisgICAvLyBzaGlmdGVkIHJlZ2lzdGVyCisgICBkZWYgcnMgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokbGhzLCB0Ml9zb19yZWc6JHJocyksIElJQ19pQUxVc2ksCisgICAgICAgICAgICAgICAgIG9wYywgIi53XHQkZHN0LCAkbGhzLCAkcmhzIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIHJHUFI6JGxocywgdDJfc29fcmVnOiRyaHMpKV0+LAorICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjJdPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgICAgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSAxOyAvLyBUaGUgUyBiaXQuCisgICB9Cit9Cit9Cit9CisKKy8vLyBUMklfcmJpbl9zX2lzIC0gU2FtZSBhcyBUMklfcmJpbl9pcyBleGNlcHQgc2V0cyAncycgYml0LgorbGV0IERlZnMgPSBbQ1BTUl0gaW4geworbXVsdGljbGFzcyBUMklfcmJpbl9zX2lzPGJpdHM8ND4gb3Bjb2QsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlPiB7CisgICAvLyBzaGlmdGVkIGltbQorICAgZGVmIHJpIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokcmhzLCB0Ml9zb19pbW06JGxocyksIElJQ19pQUxVaSwKKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgInMiKSwgIi53XHQkZHN0LCAkcmhzLCAkbGhzIiwKKyAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgdDJfc29faW1tOiRsaHMsIHJHUFI6JHJocykpXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICAgICBsZXQgSW5zdHsyNX0gPSAwOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gMTsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxNX0gPSAwOworICAgfQorICAgLy8gc2hpZnRlZCByZWdpc3RlcgorICAgZGVmIHJzIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokcmhzLCB0Ml9zb19yZWc6JGxocyksIElJQ19pQUxVc2ksCisgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChvcGMsICJzIiksICJcdCRkc3QsICRyaHMsICRsaHMiLAorICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKG9wbm9kZSB0Ml9zb19yZWc6JGxocywgckdQUjokcmhzKSldPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgICAgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgICAgIGxldCBJbnN0ezI0LTIxfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsyMH0gPSAxOyAvLyBUaGUgUyBiaXQuCisgICB9Cit9Cit9CisKKy8vLyBUMklfc2hfaXIgLSBEZWZpbmVzIGEgc2V0IG9mIChvcCByZWcsIHtzb19pbW18cn0pIHBhdHRlcm5zIGZvciBhIHNoaWZ0IC8KKy8vICByb3RhdGUgb3BlcmF0aW9uIHRoYXQgcHJvZHVjZXMgYSB2YWx1ZS4KK211bHRpY2xhc3MgVDJJX3NoX2lyPGJpdHM8Mj4gb3Bjb2QsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlPiB7CisgICAvLyA1LWJpdCBpbW0KKyAgIGRlZiByaSA6IFQyc0k8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRsaHMsIGkzMmltbTokcmhzKSwgSUlDX2lNT1ZzaSwKKyAgICAgICAgICAgICAgICAgb3BjLCAiLndcdCRkc3QsICRsaHMsICRyaHMiLAorICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgckdQUjokbGhzLCBpbW0xXzMxOiRyaHMpKV0+IHsKKyAgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgICAgbGV0IEluc3R7MjYtMjF9ID0gMGIwMTAwMTA7CisgICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4KKyAgICAgbGV0IEluc3R7NS00fSA9IG9wY29kOworICAgfQorICAgLy8gcmVnaXN0ZXIKKyAgIGRlZiByciA6IFQyc0k8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRsaHMsIHJHUFI6JHJocyksIElJQ19pTU9Wc3IsCisgICAgICAgICAgICAgICAgIG9wYywgIi53XHQkZHN0LCAkbGhzLCAkcmhzIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIHJHUFI6JGxocywgckdQUjokcmhzKSldPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDEwMDsKKyAgICAgbGV0IEluc3R7MjItMjF9ID0gb3Bjb2Q7CisgICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsKKyAgICAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMDsKKyAgIH0KK30KKworLy8vIFQySV9jbXBfaXJzIC0gRGVmaW5lcyBhIHNldCBvZiAob3Agciwge3NvX2ltbXxyfHNvX3JlZ30pIGNtcCAvIHRlc3QKKy8vLyBwYXR0ZXJucy4gU2ltaWxhciB0byBUMklfYmluX2lycyBleGNlcHQgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IHByb2R1Y2UKKy8vLyBhIGV4cGxpY2l0IHJlc3VsdCwgb25seSBpbXBsaWNpdGx5IHNldCBDUFNSLgorbGV0IERlZnMgPSBbQ1BTUl0gaW4geworbXVsdGljbGFzcyBUMklfY21wX2lyczxiaXRzPDQ+IG9wY29kLCBzdHJpbmcgb3BjLCBQYXRGcmFnIG9wbm9kZT4geworICAgLy8gc2hpZnRlZCBpbW0KKyAgIGRlZiByaSA6IFQySTwob3V0cyksIChpbnMgR1BSOiRsaHMsIHQyX3NvX2ltbTokcmhzKSwgSUlDX2lDTVBpLAorICAgICAgICAgICAgICAgIG9wYywgIi53XHQkbGhzLCAkcmhzIiwKKyAgICAgICAgICAgICAgICBbKG9wbm9kZSBHUFI6JGxocywgdDJfc29faW1tOiRyaHMpXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICAgICBsZXQgSW5zdHsyNX0gPSAwOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gMTsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxNX0gPSAwOworICAgICBsZXQgSW5zdHsxMS04fSA9IDBiMTExMTsgLy8gUmQKKyAgIH0KKyAgIC8vIHJlZ2lzdGVyCisgICBkZWYgcnIgOiBUMkk8KG91dHMpLCAoaW5zIEdQUjokbGhzLCByR1BSOiRyaHMpLCBJSUNfaUNNUHIsCisgICAgICAgICAgICAgICAgb3BjLCAiLndcdCRsaHMsICRyaHMiLAorICAgICAgICAgICAgICAgIFsob3Bub2RlIEdQUjokbGhzLCByR1BSOiRyaHMpXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICAgICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICAgICBsZXQgSW5zdHsyNC0yMX0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MjB9ID0gMTsgLy8gVGhlIFMgYml0LgorICAgICBsZXQgSW5zdHsxNC0xMn0gPSAwYjAwMDsgLy8gaW1tMworICAgICBsZXQgSW5zdHsxMS04fSA9IDBiMTExMTsgLy8gUmQKKyAgICAgbGV0IEluc3R7Ny02fSA9IDBiMDA7IC8vIGltbTIKKyAgICAgbGV0IEluc3R7NS00fSA9IDBiMDA7IC8vIHR5cGUKKyAgIH0KKyAgIC8vIHNoaWZ0ZWQgcmVnaXN0ZXIKKyAgIGRlZiBycyA6IFQySTwob3V0cyksIChpbnMgR1BSOiRsaHMsIHQyX3NvX3JlZzokcmhzKSwgSUlDX2lDTVBzaSwKKyAgICAgICAgICAgICAgICBvcGMsICIud1x0JGxocywgJHJocyIsCisgICAgICAgICAgICAgICAgWyhvcG5vZGUgR1BSOiRsaHMsIHQyX3NvX3JlZzokcmhzKV0+IHsKKyAgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgICAgbGV0IEluc3R7MjYtMjV9ID0gMGIwMTsKKyAgICAgbGV0IEluc3R7MjQtMjF9ID0gb3Bjb2Q7CisgICAgIGxldCBJbnN0ezIwfSA9IDE7IC8vIFRoZSBTIGJpdC4KKyAgICAgbGV0IEluc3R7MTEtOH0gPSAwYjExMTE7IC8vIFJkCisgICB9Cit9Cit9CisKKy8vLyBUMklfbGQgLSBEZWZpbmVzIGEgc2V0IG9mIChvcCByLCB7aW1tMTJ8aW1tOHxzb19yZWd9KSBsb2FkIHBhdHRlcm5zLgorbXVsdGljbGFzcyBUMklfbGQ8Yml0IHNpZ25lZCwgYml0czwyPiBvcGNvZCwgc3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGU+IHsKKyAgZGVmIGkxMiA6IFQySWkxMjwob3V0cyBHUFI6JGRzdCksIChpbnMgdDJhZGRybW9kZV9pbW0xMjokYWRkciksIElJQ19pTG9hZGksCisgICAgICAgICAgICAgICAgICAgb3BjLCAiLndcdCRkc3QsICRhZGRyIiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKG9wbm9kZSB0MmFkZHJtb2RlX2ltbTEyOiRhZGRyKSldPiB7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAwOworICAgIGxldCBJbnN0ezI0fSA9IHNpZ25lZDsKKyAgICBsZXQgSW5zdHsyM30gPSAxOworICAgIGxldCBJbnN0ezIyLTIxfSA9IG9wY29kOworICAgIGxldCBJbnN0ezIwfSA9IDE7IC8vIGxvYWQKKyAgfQorICBkZWYgaTggIDogVDJJaTggPChvdXRzIEdQUjokZHN0KSwgKGlucyB0MmFkZHJtb2RlX2ltbTg6JGFkZHIpLCBJSUNfaUxvYWRpLAorICAgICAgICAgICAgICAgICAgIG9wYywgIlx0JGRzdCwgJGFkZHIiLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIHQyYWRkcm1vZGVfaW1tODokYWRkcikpXT4geworICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgbGV0IEluc3R7MjYtMjV9ID0gMGIwMDsKKyAgICBsZXQgSW5zdHsyNH0gPSBzaWduZWQ7CisgICAgbGV0IEluc3R7MjN9ID0gMDsKKyAgICBsZXQgSW5zdHsyMi0yMX0gPSBvcGNvZDsKKyAgICBsZXQgSW5zdHsyMH0gPSAxOyAvLyBsb2FkCisgICAgbGV0IEluc3R7MTF9ID0gMTsKKyAgICAvLyBPZmZzZXQ6IGluZGV4PT1UUlVFLCB3YmFjaz09RkFMU0UKKyAgICBsZXQgSW5zdHsxMH0gPSAxOyAvLyBUaGUgUCBiaXQuCisgICAgbGV0IEluc3R7OH0gPSAwOyAvLyBUaGUgVyBiaXQuCisgIH0KKyAgZGVmIHMgICA6IFQySXNvIDwob3V0cyBHUFI6JGRzdCksIChpbnMgdDJhZGRybW9kZV9zb19yZWc6JGFkZHIpLCBJSUNfaUxvYWRyLAorICAgICAgICAgICAgICAgICAgIG9wYywgIi53XHQkZHN0LCAkYWRkciIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChvcG5vZGUgdDJhZGRybW9kZV9zb19yZWc6JGFkZHIpKV0+IHsKKyAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICAgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDA7CisgICAgbGV0IEluc3R7MjR9ID0gc2lnbmVkOworICAgIGxldCBJbnN0ezIzfSA9IDA7CisgICAgbGV0IEluc3R7MjItMjF9ID0gb3Bjb2Q7CisgICAgbGV0IEluc3R7MjB9ID0gMTsgLy8gbG9hZAorICAgIGxldCBJbnN0ezExLTZ9ID0gMGIwMDAwMDA7CisgIH0KKyAgZGVmIHBjaSA6IFQySXBjIDwob3V0cyBHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRhZGRyKSwgSUlDX2lMb2FkaSwKKyAgICAgICAgICAgICAgICAgICBvcGMsICIud1x0JGRzdCwgJGFkZHIiLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAob3Bub2RlIChBUk1XcmFwcGVyIHRjb25zdHBvb2w6JGFkZHIpKSldPiB7CisgICAgbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDE7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAwOworICAgIGxldCBJbnN0ezI0fSA9IHNpZ25lZDsKKyAgICBsZXQgSW5zdHsyM30gPSA/OyAvLyBhZGQgPSAoVSA9PSAnMScpCisgICAgbGV0IEluc3R7MjItMjF9ID0gb3Bjb2Q7CisgICAgbGV0IEluc3R7MjB9ID0gMTsgLy8gbG9hZAorICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4KKyAgfQorfQorCisvLy8gVDJJX3N0IC0gRGVmaW5lcyBhIHNldCBvZiAob3Agciwge2ltbTEyfGltbTh8c29fcmVnfSkgc3RvcmUgcGF0dGVybnMuCittdWx0aWNsYXNzIFQySV9zdDxiaXRzPDI+IG9wY29kLCBzdHJpbmcgb3BjLCBQYXRGcmFnIG9wbm9kZT4geworICBkZWYgaTEyIDogVDJJaTEyPChvdXRzKSwgKGlucyBHUFI6JHNyYywgdDJhZGRybW9kZV9pbW0xMjokYWRkciksIElJQ19pU3RvcmVpLAorICAgICAgICAgICAgICAgICAgIG9wYywgIi53XHQkc3JjLCAkYWRkciIsCisgICAgICAgICAgICAgICAgICAgWyhvcG5vZGUgR1BSOiRzcmMsIHQyYWRkcm1vZGVfaW1tMTI6JGFkZHIpXT4geworICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMDAxOworICAgIGxldCBJbnN0ezIyLTIxfSA9IG9wY29kOworICAgIGxldCBJbnN0ezIwfSA9IDA7IC8vICFsb2FkCisgIH0KKyAgZGVmIGk4ICA6IFQySWk4IDwob3V0cyksIChpbnMgR1BSOiRzcmMsIHQyYWRkcm1vZGVfaW1tODokYWRkciksIElJQ19pU3RvcmVpLAorICAgICAgICAgICAgICAgICAgIG9wYywgIlx0JHNyYywgJGFkZHIiLAorICAgICAgICAgICAgICAgICAgIFsob3Bub2RlIEdQUjokc3JjLCB0MmFkZHJtb2RlX2ltbTg6JGFkZHIpXT4geworICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMDAwOworICAgIGxldCBJbnN0ezIyLTIxfSA9IG9wY29kOworICAgIGxldCBJbnN0ezIwfSA9IDA7IC8vICFsb2FkCisgICAgbGV0IEluc3R7MTF9ID0gMTsKKyAgICAvLyBPZmZzZXQ6IGluZGV4PT1UUlVFLCB3YmFjaz09RkFMU0UKKyAgICBsZXQgSW5zdHsxMH0gPSAxOyAvLyBUaGUgUCBiaXQuCisgICAgbGV0IEluc3R7OH0gPSAwOyAvLyBUaGUgVyBiaXQuCisgIH0KKyAgZGVmIHMgICA6IFQySXNvIDwob3V0cyksIChpbnMgR1BSOiRzcmMsIHQyYWRkcm1vZGVfc29fcmVnOiRhZGRyKSwgSUlDX2lTdG9yZXIsCisgICAgICAgICAgICAgICAgICAgb3BjLCAiLndcdCRzcmMsICRhZGRyIiwKKyAgICAgICAgICAgICAgICAgICBbKG9wbm9kZSBHUFI6JHNyYywgdDJhZGRybW9kZV9zb19yZWc6JGFkZHIpXT4geworICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMDAwOworICAgIGxldCBJbnN0ezIyLTIxfSA9IG9wY29kOworICAgIGxldCBJbnN0ezIwfSA9IDA7IC8vICFsb2FkCisgICAgbGV0IEluc3R7MTEtNn0gPSAwYjAwMDAwMDsKKyAgfQorfQorCisvLy8gVDJJX3VuYXJ5X3Jyb3QgLSBBIHVuYXJ5IG9wZXJhdGlvbiB3aXRoIHR3byBmb3Jtczogb25lIHdob3NlIG9wZXJhbmQgaXMgYQorLy8vIHJlZ2lzdGVyIGFuZCBvbmUgd2hvc2Ugb3BlcmFuZCBpcyBhIHJlZ2lzdGVyIHJvdGF0ZWQgYnkgOC8xNi8yNC4KK211bHRpY2xhc3MgVDJJX3VuYXJ5X3Jyb3Q8Yml0czwzPiBvcGNvZCwgc3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGU+IHsKKyAgZGVmIHIgICAgIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjKSwgSUlDX2lVTkFyLAorICAgICAgICAgICAgICAgICAgb3BjLCAiLndcdCRkc3QsICRzcmMiLAorICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgckdQUjokc3JjKSldPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDEwMDsKKyAgICAgbGV0IEluc3R7MjItMjB9ID0gb3Bjb2Q7CisgICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4KKyAgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOworICAgICBsZXQgSW5zdHs3fSA9IDE7CisgICAgIGxldCBJbnN0ezUtNH0gPSAwYjAwOyAvLyByb3RhdGUKKyAgIH0KKyAgZGVmIHJfcm90IDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjLCBpMzJpbW06JHJvdCksIElJQ19pVU5Bc2ksCisgICAgICAgICAgICAgICAgICBvcGMsICIud1x0JGRzdCwgJHNyYywgcm9yICRyb3QiLAorICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgKHJvdHIgckdQUjokc3JjLCByb3RfaW1tOiRyb3QpKSldPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDEwMDsKKyAgICAgbGV0IEluc3R7MjItMjB9ID0gb3Bjb2Q7CisgICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4KKyAgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOworICAgICBsZXQgSW5zdHs3fSA9IDE7CisgICAgIGxldCBJbnN0ezUtNH0gPSB7Pyw/fTsgLy8gcm90YXRlCisgICB9Cit9CisKKy8vIFVYVEIxNiAtIFJlcXVyZXMgVDJFeHRyYWN0UGFjaywgZG9lcyBub3QgbmVlZCB0aGUgLncgcXVhbGlmaWVyLgorbXVsdGljbGFzcyBUMklfdW5hcnlfcnJvdF91eHRiMTY8Yml0czwzPiBvcGNvZCwgc3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGU+IHsKKyAgZGVmIHIgICAgIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjKSwgSUlDX2lVTkFyLAorICAgICAgICAgICAgICAgICAgb3BjLCAiXHQkZHN0LCAkc3JjIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIHJHUFI6JHNyYykpXT4sCisgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNUMkV4dHJhY3RQYWNrXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMDA7CisgICAgIGxldCBJbnN0ezIyLTIwfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7IC8vIFJuCisgICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsKKyAgICAgbGV0IEluc3R7N30gPSAxOworICAgICBsZXQgSW5zdHs1LTR9ID0gMGIwMDsgLy8gcm90YXRlCisgICB9CisgIGRlZiByX3JvdCA6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JHNyYywgaTMyaW1tOiRyb3QpLCBJSUNfaVVOQXNpLAorICAgICAgICAgICAgICAgICAgb3BjLCAiXHQkZHN0LCAkc3JjLCByb3IgJHJvdCIsCisgICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKG9wbm9kZSAocm90ciByR1BSOiRzcmMsIHJvdF9pbW06JHJvdCkpKV0+LAorICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSGFzVDJFeHRyYWN0UGFja10+IHsKKyAgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMTAwOworICAgICBsZXQgSW5zdHsyMi0yMH0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOyAvLyBSbgorICAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7CisgICAgIGxldCBJbnN0ezd9ID0gMTsKKyAgICAgbGV0IEluc3R7NS00fSA9IHs/LD99OyAvLyByb3RhdGUKKyAgIH0KK30KKworLy8gU1hUQjE2IC0gUmVxdXJlcyBUMkV4dHJhY3RQYWNrLCBkb2VzIG5vdCBuZWVkIHRoZSAudyBxdWFsaWZpZXIsIG5vIHBhdHRlcm4KKy8vIHN1cHBvcnRlZCB5ZXQuCittdWx0aWNsYXNzIFQySV91bmFyeV9ycm90X3N4dGIxNjxiaXRzPDM+IG9wY29kLCBzdHJpbmcgb3BjPiB7CisgIGRlZiByICAgICA6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JHNyYyksIElJQ19pVU5BciwKKyAgICAgICAgICAgICAgICAgIG9wYywgIlx0JGRzdCwgJHNyYyIsIFtdPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDEwMDsKKyAgICAgbGV0IEluc3R7MjItMjB9ID0gb3Bjb2Q7CisgICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4KKyAgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOworICAgICBsZXQgSW5zdHs3fSA9IDE7CisgICAgIGxldCBJbnN0ezUtNH0gPSAwYjAwOyAvLyByb3RhdGUKKyAgIH0KKyAgZGVmIHJfcm90IDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjLCBpMzJpbW06JHJvdCksIElJQ19pVU5Bc2ksCisgICAgICAgICAgICAgICAgICBvcGMsICJcdCRkc3QsICRzcmMsIHJvciAkcm90IiwgW10+IHsKKyAgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMTAwOworICAgICBsZXQgSW5zdHsyMi0yMH0gPSBvcGNvZDsKKyAgICAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOyAvLyBSbgorICAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7CisgICAgIGxldCBJbnN0ezd9ID0gMTsKKyAgICAgbGV0IEluc3R7NS00fSA9IHs/LD99OyAvLyByb3RhdGUKKyAgIH0KK30KKworLy8vIFQySV9iaW5fcnJvdCAtIEEgYmluYXJ5IG9wZXJhdGlvbiB3aXRoIHR3byBmb3Jtczogb25lIHdob3NlIG9wZXJhbmQgaXMgYQorLy8vIHJlZ2lzdGVyIGFuZCBvbmUgd2hvc2Ugb3BlcmFuZCBpcyBhIHJlZ2lzdGVyIHJvdGF0ZWQgYnkgOC8xNi8yNC4KK211bHRpY2xhc3MgVDJJX2Jpbl9ycm90PGJpdHM8Mz4gb3Bjb2QsIHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlPiB7CisgIGRlZiByciAgICAgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRMSFMsIHJHUFI6JFJIUyksIElJQ19pQUxVciwKKyAgICAgICAgICAgICAgICAgIG9wYywgIlx0JGRzdCwgJExIUywgJFJIUyIsCisgICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgckdQUjokTEhTLCByR1BSOiRSSFMpKV0+LAorICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1QyRXh0cmFjdFBhY2tdPiB7CisgICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDEwMDsKKyAgICAgbGV0IEluc3R7MjItMjB9ID0gb3Bjb2Q7CisgICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsKKyAgICAgbGV0IEluc3R7N30gPSAxOworICAgICBsZXQgSW5zdHs1LTR9ID0gMGIwMDsgLy8gcm90YXRlCisgICB9CisgIGRlZiBycl9yb3QgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRMSFMsIHJHUFI6JFJIUywgaTMyaW1tOiRyb3QpLAorICAgICAgICAgICAgICAgICAgSUlDX2lBTFVzciwgb3BjLCAiXHQkZHN0LCAkTEhTLCAkUkhTLCByb3IgJHJvdCIsCisgICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgckdQUjokTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvdHIgckdQUjokUkhTLCByb3RfaW1tOiRyb3QpKSldPiwKKyAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNUMkV4dHJhY3RQYWNrXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMDA7CisgICAgIGxldCBJbnN0ezIyLTIwfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7CisgICAgIGxldCBJbnN0ezd9ID0gMTsKKyAgICAgbGV0IEluc3R7NS00fSA9IHs/LD99OyAvLyByb3RhdGUKKyAgIH0KK30KKworLy8gRE8gdmFyaWFudCAtIGRpc2Fzc2VtYmx5IG9ubHksIG5vIHBhdHRlcm4KKworbXVsdGljbGFzcyBUMklfYmluX3Jyb3RfRE88Yml0czwzPiBvcGNvZCwgc3RyaW5nIG9wYz4geworICBkZWYgcnIgICAgIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokTEhTLCByR1BSOiRSSFMpLCBJSUNfaUFMVXIsCisgICAgICAgICAgICAgICAgICBvcGMsICJcdCRkc3QsICRMSFMsICRSSFMiLCBbXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMDA7CisgICAgIGxldCBJbnN0ezIyLTIwfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7CisgICAgIGxldCBJbnN0ezd9ID0gMTsKKyAgICAgbGV0IEluc3R7NS00fSA9IDBiMDA7IC8vIHJvdGF0ZQorICAgfQorICBkZWYgcnJfcm90IDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokTEhTLCByR1BSOiRSSFMsIGkzMmltbTokcm90KSwKKyAgICAgICAgICAgICAgICAgIElJQ19pQUxVc3IsIG9wYywgIlx0JGRzdCwgJExIUywgJFJIUywgcm9yICRyb3QiLCBbXT4geworICAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMDA7CisgICAgIGxldCBJbnN0ezIyLTIwfSA9IG9wY29kOworICAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7CisgICAgIGxldCBJbnN0ezd9ID0gMTsKKyAgICAgbGV0IEluc3R7NS00fSA9IHs/LD99OyAvLyByb3RhdGUKKyAgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBNaXNjZWxsYW5lb3VzIEluc3RydWN0aW9ucy4KKy8vCisKKy8vIExFQXBjcmVsIC0gTG9hZCBhIHBjLXJlbGF0aXZlIGFkZHJlc3MgaW50byBhIHJlZ2lzdGVyIHdpdGhvdXQgb2ZmZW5kaW5nIHRoZQorLy8gYXNzZW1ibGVyLgorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsKK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluCitkZWYgdDJMRUFwY3JlbCA6IFQyWEk8KG91dHMgckdQUjokZHN0KSwgKGlucyBpMzJpbW06JGxhYmVsLCBwcmVkOiRwKSwgSUlDX2lBTFVpLAorICAgICAgICAgICAgICAgICAgICAgICJhZHIkcC53XHQkZHN0LCAjJGxhYmVsIiwgW10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgbGV0IEluc3R7MjUtMjR9ID0gMGIxMDsKKyAgLy8gSW5zdHsyMzoyMX0gPSAnMTEnIChhZGQgPSBGQUxTRSkgb3IgJzAwJyAoYWRkID0gVFJVRSkKKyAgbGV0IEluc3R7MjJ9ID0gMDsKKyAgbGV0IEluc3R7MjB9ID0gMDsKKyAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOyAvLyBSbgorICBsZXQgSW5zdHsxNX0gPSAwOworfQorfSAvLyBuZXZlckhhc1NpZGVFZmZlY3RzCitkZWYgdDJMRUFwY3JlbEpUIDogVDJYSTwob3V0cyByR1BSOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBpMzJpbW06JGxhYmVsLCBub2hhc2hfaW1tOiRpZCwgcHJlZDokcCksIElJQ19pQUxVaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhZHIkcC53XHQkZHN0LCAjJHtsYWJlbH1fJHtpZH0iLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNS0yNH0gPSAwYjEwOworICAvLyBJbnN0ezIzOjIxfSA9ICcxMScgKGFkZCA9IEZBTFNFKSBvciAnMDAnIChhZGQgPSBUUlVFKQorICBsZXQgSW5zdHsyMn0gPSAwOworICBsZXQgSW5zdHsyMH0gPSAwOworICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7IC8vIFJuCisgIGxldCBJbnN0ezE1fSA9IDA7Cit9CisKKy8vIEFERCByLCBzcCwge3NvX2ltbXxpMTJ9CitkZWYgdDJBRERyU1BpICAgOiBUMnNJPChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JHNwLCB0Ml9zb19pbW06JGltbSksCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfaUFMVWksICJhZGQiLCAiLndcdCRkc3QsICRzcCwgJGltbSIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI1fSA9IDA7CisgIGxldCBJbnN0ezI0LTIxfSA9IDBiMTAwMDsKKyAgbGV0IEluc3R7MjB9ID0gPzsgLy8gVGhlIFMgYml0LgorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMDE7IC8vIFJuID0gc3AKKyAgbGV0IEluc3R7MTV9ID0gMDsKK30KK2RlZiB0MkFERHJTUGkxMiA6IFQySTwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRzcCwgaW1tMF80MDk1OiRpbW0pLAorICAgICAgICAgICAgICAgICAgICAgICBJSUNfaUFMVWksICJhZGR3IiwgIlx0JGRzdCwgJHNwLCAkaW1tIiwgW10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgbGV0IEluc3R7MjV9ID0gMTsKKyAgbGV0IEluc3R7MjQtMjF9ID0gMGIwMDAwOworICBsZXQgSW5zdHsyMH0gPSAwOyAvLyBUaGUgUyBiaXQuCisgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTEwMTsgLy8gUm4gPSBzcAorICBsZXQgSW5zdHsxNX0gPSAwOworfQorCisvLyBBREQgciwgc3AsIHNvX3JlZworZGVmIHQyQUREclNQcyAgIDogVDJzSTwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRzcCwgdDJfc29fcmVnOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgSUlDX2lBTFVzaSwgImFkZCIsICIud1x0JGRzdCwgJHNwLCAkcmhzIiwgW10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgbGV0IEluc3R7MjYtMjV9ID0gMGIwMTsKKyAgbGV0IEluc3R7MjQtMjF9ID0gMGIxMDAwOworICBsZXQgSW5zdHsyMH0gPSA/OyAvLyBUaGUgUyBiaXQuCisgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTEwMTsgLy8gUm4gPSBzcAorICBsZXQgSW5zdHsxNX0gPSAwOworfQorCisvLyBTVUIgciwgc3AsIHtzb19pbW18aTEyfQorZGVmIHQyU1VCclNQaSAgIDogVDJzSTwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRzcCwgdDJfc29faW1tOiRpbW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgSUlDX2lBTFVpLCAic3ViIiwgIi53XHQkZHN0LCAkc3AsICRpbW0iLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNX0gPSAwOworICBsZXQgSW5zdHsyNC0yMX0gPSAwYjExMDE7CisgIGxldCBJbnN0ezIwfSA9ID87IC8vIFRoZSBTIGJpdC4KKyAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTAxOyAvLyBSbiA9IHNwCisgIGxldCBJbnN0ezE1fSA9IDA7Cit9CitkZWYgdDJTVUJyU1BpMTIgOiBUMkk8KG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokc3AsIGltbTBfNDA5NTokaW1tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgSUlDX2lBTFVpLCAic3VidyIsICJcdCRkc3QsICRzcCwgJGltbSIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI1fSA9IDE7CisgIGxldCBJbnN0ezI0LTIxfSA9IDBiMDEwMTsKKyAgbGV0IEluc3R7MjB9ID0gMDsgLy8gVGhlIFMgYml0LgorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMDE7IC8vIFJuID0gc3AKKyAgbGV0IEluc3R7MTV9ID0gMDsKK30KKworLy8gU1VCIHIsIHNwLCBzb19yZWcKK2RlZiB0MlNVQnJTUHMgICA6IFQyc0k8KG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokc3AsIHQyX3NvX3JlZzokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgSUlDX2lBTFVzaSwKKyAgICAgICAgICAgICAgICAgICAgICAgInN1YiIsICJcdCRkc3QsICRzcCwgJHJocyIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgIGxldCBJbnN0ezI0LTIxfSA9IDBiMTEwMTsKKyAgbGV0IEluc3R7MjB9ID0gPzsgLy8gVGhlIFMgYml0LgorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMDE7IC8vIFJuID0gc3AKKyAgbGV0IEluc3R7MTV9ID0gMDsKK30KKworLy8gU2lnbmVkIGFuZCB1bnNpZ25lZCBkaXZpc2lvbiBvbiB2Ny1NCitkZWYgdDJTRElWIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiksIElJQ19pQUxVaSwgCisgICAgICAgICAgICAgICAgICJzZGl2IiwgIlx0JGRzdCwgJGEsICRiIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAoc2RpdiByR1BSOiRhLCByR1BSOiRiKSldPiwKKyAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc0RpdmlkZV0+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgbGV0IEluc3R7MjYtMjF9ID0gMGIwMTExMDA7CisgIGxldCBJbnN0ezIwfSA9IDBiMTsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOworICBsZXQgSW5zdHs3LTR9ID0gMGIxMTExOworfQorCitkZWYgdDJVRElWIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiksIElJQ19pQUxVaSwgCisgICAgICAgICAgICAgICAgICJ1ZGl2IiwgIlx0JGRzdCwgJGEsICRiIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAodWRpdiByR1BSOiRhLCByR1BSOiRiKSldPiwKKyAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc0RpdmlkZV0+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgbGV0IEluc3R7MjYtMjF9ID0gMGIwMTExMDE7CisgIGxldCBJbnN0ezIwfSA9IDBiMTsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOworICBsZXQgSW5zdHs3LTR9ID0gMGIxMTExOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIExvYWQgLyBzdG9yZSBJbnN0cnVjdGlvbnMuCisvLworCisvLyBMb2FkCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgIGluCitkZWZtIHQyTERSICAgOiBUMklfbGQ8MCwgMGIxMCwgImxkciIsICBVbk9wRnJhZzwobG9hZCBub2RlOiRTcmMpPj47CisKKy8vIExvYWRzIHdpdGggemVybyBleHRlbnNpb24KK2RlZm0gdDJMRFJIICA6IFQySV9sZDwwLCAwYjAxLCAibGRyaCIsIFVuT3BGcmFnPCh6ZXh0bG9hZGkxNiBub2RlOiRTcmMpPj47CitkZWZtIHQyTERSQiAgOiBUMklfbGQ8MCwgMGIwMCwgImxkcmIiLCBVbk9wRnJhZzwoemV4dGxvYWRpOCAgbm9kZTokU3JjKT4+OworCisvLyBMb2FkcyB3aXRoIHNpZ24gZXh0ZW5zaW9uCitkZWZtIHQyTERSU0ggOiBUMklfbGQ8MSwgMGIwMSwgImxkcnNoIiwgVW5PcEZyYWc8KHNleHRsb2FkaTE2IG5vZGU6JFNyYyk+PjsKK2RlZm0gdDJMRFJTQiA6IFQySV9sZDwxLCAwYjAwLCAibGRyc2IiLCBVbk9wRnJhZzwoc2V4dGxvYWRpOCAgbm9kZTokU3JjKT4+OworCitsZXQgbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMSBpbiB7CisvLyBMb2FkIGRvdWJsZXdvcmQKK2RlZiB0MkxEUkRpOCAgOiBUMklpOHM0PDEsIDAsIDEsIChvdXRzIHJHUFI6JGRzdDEsIHJHUFI6JGRzdDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyB0MmFkZHJtb2RlX2ltbThzNDokYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICBJSUNfaUxvYWRpLCAibGRyZCIsICJcdCRkc3QxLCAkYWRkciIsIFtdPjsKK2RlZiB0MkxEUkRwY2kgOiBUMklpOHM0PDEsIDAsIDEsIChvdXRzIHJHUFI6JGRzdDEsIHJHUFI6JGRzdDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBpMzJpbW06JGFkZHIpLCBJSUNfaUxvYWRpLAorICAgICAgICAgICAgICAgICAgICAgICAibGRyZCIsICJcdCRkc3QxLCAkYWRkciIsIFtdPiB7CisgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4KK30KK30gLy8gbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMQorCisvLyB6ZXh0bG9hZCBpMSAtPiB6ZXh0bG9hZCBpOAorZGVmIDogVDJQYXQ8KHpleHRsb2FkaTEgdDJhZGRybW9kZV9pbW0xMjokYWRkciksCisgICAgICAgICAgICAodDJMRFJCaTEyICB0MmFkZHJtb2RlX2ltbTEyOiRhZGRyKT47CitkZWYgOiBUMlBhdDwoemV4dGxvYWRpMSB0MmFkZHJtb2RlX2ltbTg6JGFkZHIpLAorICAgICAgICAgICAgKHQyTERSQmk4ICAgdDJhZGRybW9kZV9pbW04OiRhZGRyKT47CitkZWYgOiBUMlBhdDwoemV4dGxvYWRpMSB0MmFkZHJtb2RlX3NvX3JlZzokYWRkciksCisgICAgICAgICAgICAodDJMRFJCcyAgICB0MmFkZHJtb2RlX3NvX3JlZzokYWRkcik+OworZGVmIDogVDJQYXQ8KHpleHRsb2FkaTEgKEFSTVdyYXBwZXIgdGNvbnN0cG9vbDokYWRkcikpLAorICAgICAgICAgICAgKHQyTERSQnBjaSAgdGNvbnN0cG9vbDokYWRkcik+OworCisvLyBleHRsb2FkIC0+IHpleHRsb2FkCisvLyBGSVhNRTogUmVkdWNlIHRoZSBudW1iZXIgb2YgcGF0dGVybnMgYnkgbGVnYWxpemluZyBleHRsb2FkIHRvIHpleHRsb2FkCisvLyBlYXJsaWVyPworZGVmIDogVDJQYXQ8KGV4dGxvYWRpMSAgdDJhZGRybW9kZV9pbW0xMjokYWRkciksCisgICAgICAgICAgICAodDJMRFJCaTEyICB0MmFkZHJtb2RlX2ltbTEyOiRhZGRyKT47CitkZWYgOiBUMlBhdDwoZXh0bG9hZGkxICB0MmFkZHJtb2RlX2ltbTg6JGFkZHIpLAorICAgICAgICAgICAgKHQyTERSQmk4ICAgdDJhZGRybW9kZV9pbW04OiRhZGRyKT47CitkZWYgOiBUMlBhdDwoZXh0bG9hZGkxICB0MmFkZHJtb2RlX3NvX3JlZzokYWRkciksCisgICAgICAgICAgICAodDJMRFJCcyAgICB0MmFkZHJtb2RlX3NvX3JlZzokYWRkcik+OworZGVmIDogVDJQYXQ8KGV4dGxvYWRpMSAgKEFSTVdyYXBwZXIgdGNvbnN0cG9vbDokYWRkcikpLAorICAgICAgICAgICAgKHQyTERSQnBjaSAgdGNvbnN0cG9vbDokYWRkcik+OworCitkZWYgOiBUMlBhdDwoZXh0bG9hZGk4ICB0MmFkZHJtb2RlX2ltbTEyOiRhZGRyKSwKKyAgICAgICAgICAgICh0MkxEUkJpMTIgIHQyYWRkcm1vZGVfaW1tMTI6JGFkZHIpPjsKK2RlZiA6IFQyUGF0PChleHRsb2FkaTggIHQyYWRkcm1vZGVfaW1tODokYWRkciksCisgICAgICAgICAgICAodDJMRFJCaTggICB0MmFkZHJtb2RlX2ltbTg6JGFkZHIpPjsKK2RlZiA6IFQyUGF0PChleHRsb2FkaTggIHQyYWRkcm1vZGVfc29fcmVnOiRhZGRyKSwKKyAgICAgICAgICAgICh0MkxEUkJzICAgIHQyYWRkcm1vZGVfc29fcmVnOiRhZGRyKT47CitkZWYgOiBUMlBhdDwoZXh0bG9hZGk4ICAoQVJNV3JhcHBlciB0Y29uc3Rwb29sOiRhZGRyKSksCisgICAgICAgICAgICAodDJMRFJCcGNpICB0Y29uc3Rwb29sOiRhZGRyKT47CisKK2RlZiA6IFQyUGF0PChleHRsb2FkaTE2IHQyYWRkcm1vZGVfaW1tMTI6JGFkZHIpLAorICAgICAgICAgICAgKHQyTERSSGkxMiAgdDJhZGRybW9kZV9pbW0xMjokYWRkcik+OworZGVmIDogVDJQYXQ8KGV4dGxvYWRpMTYgdDJhZGRybW9kZV9pbW04OiRhZGRyKSwKKyAgICAgICAgICAgICh0MkxEUkhpOCAgIHQyYWRkcm1vZGVfaW1tODokYWRkcik+OworZGVmIDogVDJQYXQ8KGV4dGxvYWRpMTYgdDJhZGRybW9kZV9zb19yZWc6JGFkZHIpLAorICAgICAgICAgICAgKHQyTERSSHMgICAgdDJhZGRybW9kZV9zb19yZWc6JGFkZHIpPjsKK2RlZiA6IFQyUGF0PChleHRsb2FkaTE2IChBUk1XcmFwcGVyIHRjb25zdHBvb2w6JGFkZHIpKSwKKyAgICAgICAgICAgICh0MkxEUkhwY2kgIHRjb25zdHBvb2w6JGFkZHIpPjsKKworLy8gRklYTUU6IFRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBvZiB0aGUgbG9hZHMgYW5kIHN0b3JlcyBjYW4ndCBiZSBQQywgYnV0CisvLyAgICAgICAgY2FuIGJlIFNQLiBXZSBuZWVkIGFub3RoZXIgcmVnY2xhc3MgKHNpbWlsYXIgdG8gckdQUikgdG8gcmVwcmVzZW50CisvLyAgICAgICAgdGhhdC4gTm90IGEgcHJlc3NpbmcgaXNzdWUgc2luY2UgdGhlc2UgYXJlIHNlbGVjdGVkIG1hbnVhbGx5LAorLy8gICAgICAgIG5vdCB2aWEgcGF0dGVybi4KKworLy8gSW5kZXhlZCBsb2FkcworbGV0IG1heUxvYWQgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7CitkZWYgdDJMRFJfUFJFICA6IFQySWlkeGxkc3Q8MCwgMGIxMCwgMSwgMSwgKG91dHMgR1BSOiRkc3QsIEdQUjokYmFzZV93YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyB0MmFkZHJtb2RlX2ltbTg6JGFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlVDJfaTgsIEluZGV4TW9kZVByZSwgSUlDX2lMb2FkaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxkciIsICJcdCRkc3QsICRhZGRyISIsICIkYWRkci5iYXNlID0gJGJhc2Vfd2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIHQyTERSX1BPU1QgOiBUMklpZHhsZHN0PDAsIDBiMTAsIDEsIDAsIChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRiYXNlLCB0MmFtX2ltbThfb2Zmc2V0OiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlVDJfaTgsIEluZGV4TW9kZVBvc3QsIElJQ19pTG9hZGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAibGRyIiwgIlx0JGRzdCwgWyRiYXNlXSwgJG9mZnNldCIsICIkYmFzZSA9ICRiYXNlX3diIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiB0MkxEUkJfUFJFIDogVDJJaWR4bGRzdDwwLCAwYjAwLCAxLCAxLCAob3V0cyBHUFI6JGRzdCwgR1BSOiRiYXNlX3diKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIHQyYWRkcm1vZGVfaW1tODokYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVUMl9pOCwgSW5kZXhNb2RlUHJlLCBJSUNfaUxvYWRpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGRyYiIsICJcdCRkc3QsICRhZGRyISIsICIkYWRkci5iYXNlID0gJGJhc2Vfd2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiB0MkxEUkJfUE9TVCA6IFQySWlkeGxkc3Q8MCwgMGIwMCwgMSwgMCwgKG91dHMgR1BSOiRkc3QsIEdQUjokYmFzZV93YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JGJhc2UsIHQyYW1faW1tOF9vZmZzZXQ6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVUMl9pOCwgSW5kZXhNb2RlUG9zdCwgSUlDX2lMb2FkaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImxkcmIiLCAiXHQkZHN0LCBbJGJhc2VdLCAkb2Zmc2V0IiwgIiRiYXNlID0gJGJhc2Vfd2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIHQyTERSSF9QUkUgOiBUMklpZHhsZHN0PDAsIDBiMDEsIDEsIDEsIChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgdDJhZGRybW9kZV9pbW04OiRhZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTW9kZVQyX2k4LCBJbmRleE1vZGVQcmUsIElJQ19pTG9hZGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZHJoIiwgIlx0JGRzdCwgJGFkZHIhIiwgIiRhZGRyLmJhc2UgPSAkYmFzZV93YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+OworZGVmIHQyTERSSF9QT1NUIDogVDJJaWR4bGRzdDwwLCAwYjAxLCAxLCAwLCAob3V0cyBHUFI6JGRzdCwgR1BSOiRiYXNlX3diKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokYmFzZSwgdDJhbV9pbW04X29mZnNldDokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTW9kZVQyX2k4LCBJbmRleE1vZGVQb3N0LCBJSUNfaUxvYWRpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibGRyaCIsICJcdCRkc3QsIFskYmFzZV0sICRvZmZzZXQiLCAiJGJhc2UgPSAkYmFzZV93YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+OworCitkZWYgdDJMRFJTQl9QUkUgOiBUMklpZHhsZHN0PDEsIDBiMDAsIDEsIDEsIChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgdDJhZGRybW9kZV9pbW04OiRhZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTW9kZVQyX2k4LCBJbmRleE1vZGVQcmUsIElJQ19pTG9hZGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZHJzYiIsICJcdCRkc3QsICRhZGRyISIsICIkYWRkci5iYXNlID0gJGJhc2Vfd2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiB0MkxEUlNCX1BPU1QgOiBUMklpZHhsZHN0PDEsIDBiMDAsIDEsIDAsIChvdXRzIEdQUjokZHN0LCBHUFI6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRiYXNlLCB0MmFtX2ltbThfb2Zmc2V0OiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlVDJfaTgsIEluZGV4TW9kZVBvc3QsIElJQ19pTG9hZGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgImxkcnNiIiwgIlx0JGRzdCwgWyRiYXNlXSwgJG9mZnNldCIsICIkYmFzZSA9ICRiYXNlX3diIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiB0MkxEUlNIX1BSRSA6IFQySWlkeGxkc3Q8MSwgMGIwMSwgMSwgMSwgKG91dHMgR1BSOiRkc3QsIEdQUjokYmFzZV93YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyB0MmFkZHJtb2RlX2ltbTg6JGFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlVDJfaTgsIEluZGV4TW9kZVByZSwgSUlDX2lMb2FkaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxkcnNoIiwgIlx0JGRzdCwgJGFkZHIhIiwgIiRhZGRyLmJhc2UgPSAkYmFzZV93YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+OworZGVmIHQyTERSU0hfUE9TVCA6IFQySWlkeGxkc3Q8MSwgMGIwMSwgMSwgMCwgKG91dHMgR1BSOiRkc3QsIEdQUjokYmFzZV93YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JGJhc2UsIHQyYW1faW1tOF9vZmZzZXQ6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVUMl9pOCwgSW5kZXhNb2RlUG9zdCwgSUlDX2lMb2FkaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAibGRyc2giLCAiXHQkZHN0LCBbJGJhc2VdLCAkb2Zmc2V0IiwgIiRiYXNlID0gJGJhc2Vfd2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK30gLy8gbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIAorCisvLyBMRFJULCBMRFJCVCwgTERSSFQsIExEUlNCVCwgTERSU0hUIGFsbCBoYXZlIG9mZnNldCBtb2RlIChQVVc9MGIxMTApIGFuZCBhcmUKKy8vIGZvciBkaXNhc3NlbWJseSBvbmx5LgorLy8gUmVmOiBBOC42LjU3IExEUiAoaW1tZWRpYXRlLCBUaHVtYikgRW5jb2RpbmcgVDQKK2NsYXNzIFQySWxkVDxiaXQgc2lnbmVkLCBiaXRzPDI+IHR5cGUsIHN0cmluZyBvcGM+CisgIDogVDJJaTg8KG91dHMgR1BSOiRkc3QpLCAoaW5zIHQyYWRkcm1vZGVfaW1tODokYWRkciksIElJQ19pTG9hZGksIG9wYywKKyAgICAgICAgICAiXHQkZHN0LCAkYWRkciIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDA7CisgIGxldCBJbnN0ezI0fSA9IHNpZ25lZDsKKyAgbGV0IEluc3R7MjN9ID0gMDsKKyAgbGV0IEluc3R7MjItMjF9ID0gdHlwZTsKKyAgbGV0IEluc3R7MjB9ID0gMTsgLy8gbG9hZAorICBsZXQgSW5zdHsxMX0gPSAxOworICBsZXQgSW5zdHsxMC04fSA9IDBiMTEwOyAvLyBQVVcuCit9CisKK2RlZiB0MkxEUlQgICA6IFQySWxkVDwwLCAwYjEwLCAibGRydCI+OworZGVmIHQyTERSQlQgIDogVDJJbGRUPDAsIDBiMDAsICJsZHJidCI+OworZGVmIHQyTERSSFQgIDogVDJJbGRUPDAsIDBiMDEsICJsZHJodCI+OworZGVmIHQyTERSU0JUIDogVDJJbGRUPDEsIDBiMDAsICJsZHJzYnQiPjsKK2RlZiB0MkxEUlNIVCA6IFQySWxkVDwxLCAwYjAxLCAibGRyc2h0Ij47CisKKy8vIFN0b3JlCitkZWZtIHQyU1RSIDpUMklfc3Q8MGIxMCwic3RyIiwgQmluT3BGcmFnPChzdG9yZSBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsKK2RlZm0gdDJTVFJCOlQySV9zdDwwYjAwLCJzdHJiIixCaW5PcEZyYWc8KHRydW5jc3RvcmVpOCBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsKK2RlZm0gdDJTVFJIOlQySV9zdDwwYjAxLCJzdHJoIixCaW5PcEZyYWc8KHRydW5jc3RvcmVpMTYgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47CisKKy8vIFN0b3JlIGRvdWJsZXdvcmQKK2xldCBtYXlMb2FkID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEsIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEgPSAxIGluCitkZWYgdDJTVFJEaTggOiBUMklpOHM0PDEsIDAsIDAsIChvdXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYzEsIEdQUjokc3JjMiwgdDJhZGRybW9kZV9pbW04czQ6JGFkZHIpLAorICAgICAgICAgICAgICAgSUlDX2lTdG9yZXIsICJzdHJkIiwgIlx0JHNyYzEsICRhZGRyIiwgW10+OworCisvLyBJbmRleGVkIHN0b3JlcworZGVmIHQyU1RSX1BSRSAgOiBUMklpZHhsZHN0PDAsIDBiMTAsIDAsIDEsIChvdXRzIEdQUjokYmFzZV93YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgR1BSOiRiYXNlLCB0MmFtX2ltbThfb2Zmc2V0OiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlVDJfaTgsIEluZGV4TW9kZVByZSwgSUlDX2lTdG9yZWl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHIiLCAiXHQkc3JjLCBbJGJhc2UsICRvZmZzZXRdISIsICIkYmFzZSA9ICRiYXNlX3diIiwKKyAgICAgICAgICAgICBbKHNldCBHUFI6JGJhc2Vfd2IsCisgICAgICAgICAgICAgICAgICAgKHByZV9zdG9yZSBHUFI6JHNyYywgR1BSOiRiYXNlLCB0MmFtX2ltbThfb2Zmc2V0OiRvZmZzZXQpKV0+OworCitkZWYgdDJTVFJfUE9TVCA6IFQySWlkeGxkc3Q8MCwgMGIxMCwgMCwgMCwgKG91dHMgR1BSOiRiYXNlX3diKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokc3JjLCBHUFI6JGJhc2UsIHQyYW1faW1tOF9vZmZzZXQ6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVUMl9pOCwgSW5kZXhNb2RlUG9zdCwgSUlDX2lTdG9yZWl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyIiwgIlx0JHNyYywgWyRiYXNlXSwgJG9mZnNldCIsICIkYmFzZSA9ICRiYXNlX3diIiwKKyAgICAgICAgICAgICBbKHNldCBHUFI6JGJhc2Vfd2IsCisgICAgICAgICAgICAgICAgICAocG9zdF9zdG9yZSBHUFI6JHNyYywgR1BSOiRiYXNlLCB0MmFtX2ltbThfb2Zmc2V0OiRvZmZzZXQpKV0+OworCitkZWYgdDJTVFJIX1BSRSAgOiBUMklpZHhsZHN0PDAsIDBiMDEsIDAsIDEsIChvdXRzIEdQUjokYmFzZV93YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgR1BSOiRiYXNlLCB0MmFtX2ltbThfb2Zmc2V0OiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlVDJfaTgsIEluZGV4TW9kZVByZSwgSUlDX2lTdG9yZWl1LAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmgiLCAiXHQkc3JjLCBbJGJhc2UsICRvZmZzZXRdISIsICIkYmFzZSA9ICRiYXNlX3diIiwKKyAgICAgICAgWyhzZXQgR1BSOiRiYXNlX3diLAorICAgICAgICAgICAgICAocHJlX3RydW5jc3RpMTYgR1BSOiRzcmMsIEdQUjokYmFzZSwgdDJhbV9pbW04X29mZnNldDokb2Zmc2V0KSldPjsKKworZGVmIHQyU1RSSF9QT1NUIDogVDJJaWR4bGRzdDwwLCAwYjAxLCAwLCAwLCAob3V0cyBHUFI6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMsIEdQUjokYmFzZSwgdDJhbV9pbW04X29mZnNldDokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTW9kZVQyX2k4LCBJbmRleE1vZGVQb3N0LCBJSUNfaVN0b3JlaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmgiLCAiXHQkc3JjLCBbJGJhc2VdLCAkb2Zmc2V0IiwgIiRiYXNlID0gJGJhc2Vfd2IiLAorICAgICAgIFsoc2V0IEdQUjokYmFzZV93YiwKKyAgICAgICAgICAgICAocG9zdF90cnVuY3N0aTE2IEdQUjokc3JjLCBHUFI6JGJhc2UsIHQyYW1faW1tOF9vZmZzZXQ6JG9mZnNldCkpXT47CisKK2RlZiB0MlNUUkJfUFJFICA6IFQySWlkeGxkc3Q8MCwgMGIwMCwgMCwgMSwgKG91dHMgR1BSOiRiYXNlX3diKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokc3JjLCBHUFI6JGJhc2UsIHQyYW1faW1tOF9vZmZzZXQ6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVUMl9pOCwgSW5kZXhNb2RlUHJlLCBJSUNfaVN0b3JlaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyYiIsICJcdCRzcmMsIFskYmFzZSwgJG9mZnNldF0hIiwgIiRiYXNlID0gJGJhc2Vfd2IiLAorICAgICAgICAgWyhzZXQgR1BSOiRiYXNlX3diLAorICAgICAgICAgICAgICAgKHByZV90cnVuY3N0aTggR1BSOiRzcmMsIEdQUjokYmFzZSwgdDJhbV9pbW04X29mZnNldDokb2Zmc2V0KSldPjsKKworZGVmIHQyU1RSQl9QT1NUIDogVDJJaWR4bGRzdDwwLCAwYjAwLCAwLCAwLCAob3V0cyBHUFI6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMsIEdQUjokYmFzZSwgdDJhbV9pbW04X29mZnNldDokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTW9kZVQyX2k4LCBJbmRleE1vZGVQb3N0LCBJSUNfaVN0b3JlaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmIiLCAiXHQkc3JjLCBbJGJhc2VdLCAkb2Zmc2V0IiwgIiRiYXNlID0gJGJhc2Vfd2IiLAorICAgICAgICBbKHNldCBHUFI6JGJhc2Vfd2IsCisgICAgICAgICAgICAgIChwb3N0X3RydW5jc3RpOCBHUFI6JHNyYywgR1BSOiRiYXNlLCB0MmFtX2ltbThfb2Zmc2V0OiRvZmZzZXQpKV0+OworCisvLyBTVFJULCBTVFJCVCwgU1RSSFQgYWxsIGhhdmUgb2Zmc2V0IG1vZGUgKFBVVz0wYjExMCkgYW5kIGFyZSBmb3IgZGlzYXNzZW1ibHkKKy8vIG9ubHkuCisvLyBSZWY6IEE4LjYuMTkzIFNUUiAoaW1tZWRpYXRlLCBUaHVtYikgRW5jb2RpbmcgVDQKK2NsYXNzIFQySXN0VDxiaXRzPDI+IHR5cGUsIHN0cmluZyBvcGM+CisgIDogVDJJaTg8KG91dHMgR1BSOiRzcmMpLCAoaW5zIHQyYWRkcm1vZGVfaW1tODokYWRkciksIElJQ19pU3RvcmVpLCBvcGMsCisgICAgICAgICAgIlx0JHNyYywgJGFkZHIiLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAwOworICBsZXQgSW5zdHsyNH0gPSAwOyAvLyBub3Qgc2lnbmVkCisgIGxldCBJbnN0ezIzfSA9IDA7CisgIGxldCBJbnN0ezIyLTIxfSA9IHR5cGU7CisgIGxldCBJbnN0ezIwfSA9IDA7IC8vIHN0b3JlCisgIGxldCBJbnN0ezExfSA9IDE7CisgIGxldCBJbnN0ezEwLTh9ID0gMGIxMTA7IC8vIFBVVworfQorCitkZWYgdDJTVFJUICAgOiBUMklzdFQ8MGIxMCwgInN0cnQiPjsKK2RlZiB0MlNUUkJUICA6IFQySXN0VDwwYjAwLCAic3RyYnQiPjsKK2RlZiB0MlNUUkhUICA6IFQySXN0VDwwYjAxLCAic3RyaHQiPjsKKworLy8gbGRyZCAvIHN0cmQgcHJlIC8gcG9zdCB2YXJpYW50cworLy8gRm9yIGRpc2Fzc2VtYmx5IG9ubHkuCisKK2RlZiB0MkxEUkRfUFJFICA6IFQySWk4czQ8MSwgMSwgMSwgKG91dHMgR1BSOiRkc3QxLCBHUFI6JGRzdDIpLAorICAgICAgICAgICAgICAgICAoaW5zIEdQUjokYmFzZSwgdDJhbV9pbW04czRfb2Zmc2V0OiRpbW0pLCBOb0l0aW5lcmFyeSwKKyAgICAgICAgICAgICAgICAgImxkcmQiLCAiXHQkZHN0MSwgJGRzdDIsIFskYmFzZSwgJGltbV0hIiwgW10+OworCitkZWYgdDJMRFJEX1BPU1QgOiBUMklpOHM0PDAsIDEsIDEsIChvdXRzIEdQUjokZHN0MSwgR1BSOiRkc3QyKSwKKyAgICAgICAgICAgICAgICAgKGlucyBHUFI6JGJhc2UsIHQyYW1faW1tOHM0X29mZnNldDokaW1tKSwgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICJsZHJkIiwgIlx0JGRzdDEsICRkc3QyLCBbJGJhc2VdLCAkaW1tIiwgW10+OworCitkZWYgdDJTVFJEX1BSRSAgOiBUMklpOHM0PDEsIDEsIDAsIChvdXRzKSwKKyAgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYzEsIEdQUjokc3JjMiwgR1BSOiRiYXNlLCB0MmFtX2ltbThzNF9vZmZzZXQ6JGltbSksCisgICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAic3RyZCIsICJcdCRzcmMxLCAkc3JjMiwgWyRiYXNlLCAkaW1tXSEiLCBbXT47CisKK2RlZiB0MlNUUkRfUE9TVCA6IFQySWk4czQ8MCwgMSwgMCwgKG91dHMpLAorICAgICAgICAgICAgICAgICAoaW5zIEdQUjokc3JjMSwgR1BSOiRzcmMyLCBHUFI6JGJhc2UsIHQyYW1faW1tOHM0X29mZnNldDokaW1tKSwKKyAgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJzdHJkIiwgIlx0JHNyYzEsICRzcmMyLCBbJGJhc2VdLCAkaW1tIiwgW10+OworCisvLyBUMklwbCAoUHJlbG9hZCBEYXRhL0luc3RydWN0aW9uKSBzaWduYWxzIHRoZSBtZW1vcnkgc3lzdGVtIG9mIHBvc3NpYmxlIGZ1dHVyZQorLy8gZGF0YS9pbnN0cnVjdGlvbiBhY2Nlc3MuICBUaGVzZSBhcmUgZm9yIGRpc2Fzc2VtYmx5IG9ubHkuCisvLworLy8gQTguNi4xMTcsIEE4LjYuMTE4LiAgRGlmZmVyZW50IGluc3RydWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGZvciAjMCBhbmQgIy0wLgorLy8gVGhlIG5lZ196ZXJvIG9wZXJhbmQgdHJhbnNsYXRlcyAtMCB0byAtMSwgLTEgdG8gLTIsIC4uLiwgZXRjLgorbXVsdGljbGFzcyBUMklwbDxiaXQgaW5zdHIsIGJpdCB3cml0ZSwgc3RyaW5nIG9wYz4geworCisgIGRlZiBpMTIgOiBUMkk8KG91dHMpLCAoaW5zIEdQUjokYmFzZSwgaTMyaW1tOiRpbW0pLCBJSUNfaUxvYWRpLCBvcGMsCisgICAgICAgICAgICAgICAgIlx0WyRiYXNlLCAkaW1tXSIsIFtdPiB7CisgICAgbGV0IEluc3R7MzEtMjV9ID0gMGIxMTExMTAwOworICAgIGxldCBJbnN0ezI0fSA9IGluc3RyOworICAgIGxldCBJbnN0ezIzfSA9IDE7IC8vIFUgPSAxCisgICAgbGV0IEluc3R7MjJ9ID0gMDsKKyAgICBsZXQgSW5zdHsyMX0gPSB3cml0ZTsKKyAgICBsZXQgSW5zdHsyMH0gPSAxOworICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsKKyAgfQorCisgIGRlZiBpOCA6IFQySTwob3V0cyksIChpbnMgR1BSOiRiYXNlLCBuZWdfemVybzokaW1tKSwgSUlDX2lMb2FkaSwgb3BjLAorICAgICAgICAgICAgICAgICJcdFskYmFzZSwgJGltbV0iLCBbXT4geworICAgIGxldCBJbnN0ezMxLTI1fSA9IDBiMTExMTEwMDsKKyAgICBsZXQgSW5zdHsyNH0gPSBpbnN0cjsKKyAgICBsZXQgSW5zdHsyM30gPSAwOyAvLyBVID0gMAorICAgIGxldCBJbnN0ezIyfSA9IDA7CisgICAgbGV0IEluc3R7MjF9ID0gd3JpdGU7CisgICAgbGV0IEluc3R7MjB9ID0gMTsKKyAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7CisgICAgbGV0IEluc3R7MTEtOH0gPSAwYjExMDA7CisgIH0KKworICBkZWYgcGNpIDogVDJJPChvdXRzKSwgKGlucyBHUFI6JGJhc2UsIG5lZ196ZXJvOiRpbW0pLCBJSUNfaUxvYWRpLCBvcGMsCisgICAgICAgICAgICAgICAgIlx0W3BjLCAkaW1tXSIsIFtdPiB7CisgICAgbGV0IEluc3R7MzEtMjV9ID0gMGIxMTExMTAwOworICAgIGxldCBJbnN0ezI0fSA9IGluc3RyOworICAgIGxldCBJbnN0ezIzfSA9ID87IC8vIGFkZCA9IChVID09IDEpCisgICAgbGV0IEluc3R7MjJ9ID0gMDsKKyAgICBsZXQgSW5zdHsyMX0gPSB3cml0ZTsKKyAgICBsZXQgSW5zdHsyMH0gPSAxOworICAgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4gPSAwYjExMTEKKyAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7CisgIH0KKworICBkZWYgciAgIDogVDJJPChvdXRzKSwgKGlucyBHUFI6JGJhc2UsIEdQUjokYSksIElJQ19pTG9hZGksIG9wYywKKyAgICAgICAgICAgICAgICAiXHRbJGJhc2UsICRhXSIsIFtdPiB7CisgICAgbGV0IEluc3R7MzEtMjV9ID0gMGIxMTExMTAwOworICAgIGxldCBJbnN0ezI0fSA9IGluc3RyOworICAgIGxldCBJbnN0ezIzfSA9IDA7IC8vIGFkZCA9IFRSVUUgZm9yIFQxCisgICAgbGV0IEluc3R7MjJ9ID0gMDsKKyAgICBsZXQgSW5zdHsyMX0gPSB3cml0ZTsKKyAgICBsZXQgSW5zdHsyMH0gPSAxOworICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsKKyAgICBsZXQgSW5zdHsxMS02fSA9IDAwMDAwMDA7CisgICAgbGV0IEluc3R7NS00fSA9IDBiMDA7IC8vIG5vIHNoaWZ0IGlzIGFwcGxpZWQKKyAgfQorCisgIGRlZiBzICAgOiBUMkk8KG91dHMpLCAoaW5zIEdQUjokYmFzZSwgR1BSOiRhLCBpMzJpbW06JHNoYW10KSwgSUlDX2lMb2FkaSwgb3BjLAorICAgICAgICAgICAgICAgICJcdFskYmFzZSwgJGEsIGxzbCAkc2hhbXRdIiwgW10+IHsKKyAgICBsZXQgSW5zdHszMS0yNX0gPSAwYjExMTExMDA7CisgICAgbGV0IEluc3R7MjR9ID0gaW5zdHI7CisgICAgbGV0IEluc3R7MjN9ID0gMDsgLy8gYWRkID0gVFJVRSBmb3IgVDEKKyAgICBsZXQgSW5zdHsyMn0gPSAwOworICAgIGxldCBJbnN0ezIxfSA9IHdyaXRlOworICAgIGxldCBJbnN0ezIwfSA9IDE7CisgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOworICAgIGxldCBJbnN0ezExLTZ9ID0gMDAwMDAwMDsKKyAgfQorfQorCitkZWZtIHQyUExEICA6IFQySXBsPDAsIDAsICJwbGQiPjsKK2RlZm0gdDJQTERXIDogVDJJcGw8MCwgMSwgInBsZHciPjsKK2RlZm0gdDJQTEkgIDogVDJJcGw8MSwgMCwgInBsaSI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIExvYWQgLyBzdG9yZSBtdWx0aXBsZSBJbnN0cnVjdGlvbnMuCisvLworCitsZXQgbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMSBpbiB7CitkZWYgdDJMRE0gOiBUMlhJPChvdXRzKSwgKGlucyBhZGRybW9kZTQ6JGFkZHIsIHByZWQ6JHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2xpc3Q6JGRzdHMsIHZhcmlhYmxlX29wcyksIElJQ19pTG9hZG0sCisgICAgICAgICAgICAgICAgICJsZG0ke2FkZHI6c3VibW9kZX0ke3B9JHthZGRyOndpZGV9XHQkYWRkciwgJGRzdHMiLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAwOworICBsZXQgSW5zdHsyNC0yM30gPSB7PywgP307IC8vIElBOiAnMDEnLCBEQjogJzEwJworICBsZXQgSW5zdHsyMn0gPSAwOworICBsZXQgSW5zdHsyMX0gPSAwOyAvLyBUaGUgVyBiaXQuCisgIGxldCBJbnN0ezIwfSA9IDE7IC8vIExvYWQKK30KKworZGVmIHQyTERNX1VQRCA6IFQyWEl0PChvdXRzIEdQUjokd2IpLCAoaW5zIGFkZHJtb2RlNDokYWRkciwgcHJlZDokcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2xpc3Q6JGRzdHMsIHZhcmlhYmxlX29wcyksIElJQ19pTG9hZG0sCisgICAgICAgICAgICAgICAgICAgICAgImxkbSR7YWRkcjpzdWJtb2RlfSR7cH0ke2FkZHI6d2lkZX1cdCRhZGRyISwgJGRzdHMiLAorICAgICAgICAgICAgICAgICAgICAgICIkYWRkci5hZGRyID0gJHdiIiwgW10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgbGV0IEluc3R7MjYtMjV9ID0gMGIwMDsKKyAgbGV0IEluc3R7MjQtMjN9ID0gez8sID99OyAvLyBJQTogJzAxJywgREI6ICcxMCcKKyAgbGV0IEluc3R7MjJ9ID0gMDsKKyAgbGV0IEluc3R7MjF9ID0gMTsgLy8gVGhlIFcgYml0LgorICBsZXQgSW5zdHsyMH0gPSAxOyAvLyBMb2FkCit9Cit9IC8vIG1heUxvYWQsIG5ldmVySGFzU2lkZUVmZmVjdHMsIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEKKworbGV0IG1heVN0b3JlID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEsIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEgPSAxIGluIHsKK2RlZiB0MlNUTSA6IFQyWEk8KG91dHMpLCAoaW5zIGFkZHJtb2RlNDokYWRkciwgcHJlZDokcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnbGlzdDokc3JjcywgdmFyaWFibGVfb3BzKSwgSUlDX2lTdG9yZW0sCisgICAgICAgICAgICAgICAgICJzdG0ke2FkZHI6c3VibW9kZX0ke3B9JHthZGRyOndpZGV9XHQkYWRkciwgJHNyY3MiLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAwOworICBsZXQgSW5zdHsyNC0yM30gPSB7PywgP307IC8vIElBOiAnMDEnLCBEQjogJzEwJworICBsZXQgSW5zdHsyMn0gPSAwOworICBsZXQgSW5zdHsyMX0gPSAwOyAvLyBUaGUgVyBiaXQuCisgIGxldCBJbnN0ezIwfSA9IDA7IC8vIFN0b3JlCit9CisKK2RlZiB0MlNUTV9VUEQgOiBUMlhJdDwob3V0cyBHUFI6JHdiKSwgKGlucyBhZGRybW9kZTQ6JGFkZHIsIHByZWQ6JHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdsaXN0OiRzcmNzLCB2YXJpYWJsZV9vcHMpLAorICAgICAgICAgICAgICAgICAgICAgIElJQ19pU3RvcmVtLAorICAgICAgICAgICAgICAgICAgICAgICJzdG0ke2FkZHI6c3VibW9kZX0ke3B9JHthZGRyOndpZGV9XHQkYWRkciEsICRzcmNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAiJGFkZHIuYWRkciA9ICR3YiIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDA7CisgIGxldCBJbnN0ezI0LTIzfSA9IHs/LCA/fTsgLy8gSUE6ICcwMScsIERCOiAnMTAnCisgIGxldCBJbnN0ezIyfSA9IDA7CisgIGxldCBJbnN0ezIxfSA9IDE7IC8vIFRoZSBXIGJpdC4KKyAgbGV0IEluc3R7MjB9ID0gMDsgLy8gU3RvcmUKK30KK30gLy8gbWF5U3RvcmUsIG5ldmVySGFzU2lkZUVmZmVjdHMsIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBNb3ZlIEluc3RydWN0aW9ucy4KKy8vCisKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbgorZGVmIHQyTU9WciA6IFQyc0k8KG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwgSUlDX2lNT1ZyLAorICAgICAgICAgICAgICAgICAgICJtb3YiLCAiLndcdCRkc3QsICRzcmMiLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICBsZXQgSW5zdHsyNC0yMX0gPSAwYjAwMTA7CisgIGxldCBJbnN0ezIwfSA9ID87IC8vIFRoZSBTIGJpdC4KKyAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOyAvLyBSbgorICBsZXQgSW5zdHsxNC0xMn0gPSAwYjAwMDsKKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMDsKK30KKworLy8gQWRkZWRDb21wbGV4aXR5IHRvIGVuc3VyZSBpc2VsIHRyaWVzIHQyTU9WaSBiZWZvcmUgdDJNT1ZpMTYuCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSwgaXNBc0NoZWFwQXNBTW92ZSA9IDEsIEFkZGVkQ29tcGxleGl0eSA9IDEgaW4KK2RlZiB0Mk1PVmkgOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgdDJfc29faW1tOiRzcmMpLCBJSUNfaU1PVmksCisgICAgICAgICAgICAgICAgICAgIm1vdiIsICIud1x0JGRzdCwgJHNyYyIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCB0Ml9zb19pbW06JHNyYyldPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI1fSA9IDA7CisgIGxldCBJbnN0ezI0LTIxfSA9IDBiMDAxMDsKKyAgbGV0IEluc3R7MjB9ID0gPzsgLy8gVGhlIFMgYml0LgorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7IC8vIFJuCisgIGxldCBJbnN0ezE1fSA9IDA7Cit9CisKK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxLCBpc0FzQ2hlYXBBc0FNb3ZlID0gMSBpbgorZGVmIHQyTU9WaTE2IDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRzcmMpLCBJSUNfaU1PVmksCisgICAgICAgICAgICAgICAgICAgIm1vdnciLCAiXHQkZHN0LCAkc3JjIiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIGltbTBfNjU1MzU6JHNyYyldPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI1fSA9IDE7CisgIGxldCBJbnN0ezI0LTIxfSA9IDBiMDAxMDsKKyAgbGV0IEluc3R7MjB9ID0gMDsgLy8gVGhlIFMgYml0LgorICBsZXQgSW5zdHsxNX0gPSAwOworfQorCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiIGluCitkZWYgdDJNT1ZUaTE2IDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjLCBpMzJpbW06JGltbSksIElJQ19pTU9WaSwKKyAgICAgICAgICAgICAgICAgICAgIm1vdnQiLCAiXHQkZHN0LCAkaW1tIiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgKGFuZCByR1BSOiRzcmMsIDB4ZmZmZiksIGxvMTZBbGxaZXJvOiRpbW0pKV0+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgbGV0IEluc3R7MjV9ID0gMTsKKyAgbGV0IEluc3R7MjQtMjF9ID0gMGIwMTEwOworICBsZXQgSW5zdHsyMH0gPSAwOyAvLyBUaGUgUyBiaXQuCisgIGxldCBJbnN0ezE1fSA9IDA7Cit9CisKK2RlZiA6IFQyUGF0PChvciByR1BSOiRzcmMsIDB4ZmZmZjAwMDApLCAodDJNT1ZUaTE2IHJHUFI6JHNyYywgMHhmZmZmKT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRXh0ZW5kIEluc3RydWN0aW9ucy4KKy8vCisKKy8vIFNpZ24gZXh0ZW5kZXJzCisKK2RlZm0gdDJTWFRCICA6IFQySV91bmFyeV9ycm90PDBiMTAwLCAic3h0YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbk9wRnJhZzwoc2V4dF9pbnJlZyBub2RlOiRTcmMsIGk4KT4+OworZGVmbSB0MlNYVEggIDogVDJJX3VuYXJ5X3Jyb3Q8MGIwMDAsICJzeHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuT3BGcmFnPChzZXh0X2lucmVnIG5vZGU6JFNyYywgaTE2KT4+OworZGVmbSB0MlNYVEIxNiA6IFQySV91bmFyeV9ycm90X3N4dGIxNjwwYjAxMCwgInN4dGIxNiI+OworCitkZWZtIHQyU1hUQUIgOiBUMklfYmluX3Jyb3Q8MGIxMDAsICJzeHRhYiIsCisgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KGFkZCBub2RlOiRMSFMsIChzZXh0X2lucmVnIG5vZGU6JFJIUywgaTgpKT4+OworZGVmbSB0MlNYVEFIIDogVDJJX2Jpbl9ycm90PDBiMDAwLCAic3h0YWgiLAorICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChhZGQgbm9kZTokTEhTLCAoc2V4dF9pbnJlZyBub2RlOiRSSFMsaTE2KSk+PjsKK2RlZm0gdDJTWFRBQjE2IDogVDJJX2Jpbl9ycm90X0RPPDBiMDEwLCAic3h0YWIxNiI+OworCisvLyBUT0RPOiBTWFQoQSl7QnxIfTE2IC0gZG9uZSBmb3IgZGlzYXNzZW1ibHkgb25seQorCisvLyBaZXJvIGV4dGVuZGVycworCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTYgaW4geworZGVmbSB0MlVYVEIgICA6IFQySV91bmFyeV9ycm90PDBiMTAxLCAidXh0YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5PcEZyYWc8KGFuZCBub2RlOiRTcmMsIDB4MDAwMDAwRkYpPj47CitkZWZtIHQyVVhUSCAgIDogVDJJX3VuYXJ5X3Jyb3Q8MGIwMDEsICJ1eHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbk9wRnJhZzwoYW5kIG5vZGU6JFNyYywgMHgwMDAwRkZGRik+PjsKK2RlZm0gdDJVWFRCMTYgOiBUMklfdW5hcnlfcnJvdF91eHRiMTY8MGIwMTEsICJ1eHRiMTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuT3BGcmFnPChhbmQgbm9kZTokU3JjLCAweDAwRkYwMEZGKT4+OworCisvLyBGSVhNRTogVGhpcyBwYXR0ZXJuIGluY29ycmVjdGx5IGFzc3VtZXMgdGhlIHNobCBvcGVyYXRvciBpcyBhIHJvdGF0ZS4KKy8vICAgICAgICBUaGUgdHJhbnNmb3JtYXRpb24gc2hvdWxkIHByb2JhYmx5IGJlIGRvbmUgYXMgYSBjb21iaW5lciBhY3Rpb24KKy8vICAgICAgICBpbnN0ZWFkIHNvIHdlIGNhbiBpbmNsdWRlIGEgY2hlY2sgZm9yIG1hc2tpbmcgYmFjayBpbiB0aGUgdXBwZXIKKy8vICAgICAgICBlaWdodCBiaXRzIG9mIHRoZSBzb3VyY2UgaW50byB0aGUgbG93ZXIgZWlnaHQgYml0cyBvZiB0aGUgcmVzdWx0LgorLy9kZWYgOiBUMlBhdDwoYW5kIChzaGwgckdQUjokU3JjLCAoaTMyIDgpKSwgMHhGRjAwRkYpLAorLy8gICAgICAgICAgICAodDJVWFRCMTZyX3JvdCByR1BSOiRTcmMsIDI0KT4sIFJlcXVpcmVzPFtIYXNUMkV4dHJhY3RQYWNrXT47CitkZWYgOiBUMlBhdDwoYW5kIChzcmwgckdQUjokU3JjLCAoaTMyIDgpKSwgMHhGRjAwRkYpLAorICAgICAgICAgICAgKHQyVVhUQjE2cl9yb3QgckdQUjokU3JjLCA4KT4sIFJlcXVpcmVzPFtIYXNUMkV4dHJhY3RQYWNrXT47CisKK2RlZm0gdDJVWFRBQiA6IFQySV9iaW5fcnJvdDwwYjEwMSwgInV4dGFiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoYWRkIG5vZGU6JExIUywgKGFuZCBub2RlOiRSSFMsIDB4MDBGRikpPj47CitkZWZtIHQyVVhUQUggOiBUMklfYmluX3Jyb3Q8MGIwMDEsICJ1eHRhaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KGFkZCBub2RlOiRMSFMsIChhbmQgbm9kZTokUkhTLCAweEZGRkYpKT4+OworZGVmbSB0MlVYVEFCMTYgOiBUMklfYmluX3Jyb3RfRE88MGIwMTEsICJ1eHRhYjE2Ij47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMuCisvLworCitkZWZtIHQyQUREICA6IFQySV9iaW5faWkxMnJzPDBiMDAwLCAiYWRkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChhZGQgIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIDE+OworZGVmbSB0MlNVQiAgOiBUMklfYmluX2lpMTJyczwwYjEwMSwgInN1YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoc3ViICBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsKKworLy8gQUREIGFuZCBTVUIgd2l0aCAncycgYml0IHNldC4gTm8gMTItYml0IGltbWVkaWF0ZSAoVDQpIHZhcmlhbnRzLgorZGVmbSB0MkFERFMgOiBUMklfYmluX3NfaXJzIDwwYjEwMDAsICJhZGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KGFkZGMgbm9kZTokTEhTLCBub2RlOiRSSFMpPiwgMT47CitkZWZtIHQyU1VCUyA6IFQySV9iaW5fc19pcnMgPDBiMTEwMSwgInN1YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoc3ViYyBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsKKworZGVmbSB0MkFEQyAgOiBUMklfYWRkZV9zdWJlX2lyczwwYjEwMTAsICJhZGMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KGFkZGVfZGVhZF9jYXJyeSBub2RlOiRMSFMsIG5vZGU6JFJIUyk+LCAxPjsKK2RlZm0gdDJTQkMgIDogVDJJX2FkZGVfc3ViZV9pcnM8MGIxMDExLCAic2JjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChzdWJlX2RlYWRfY2Fycnkgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47CitkZWZtIHQyQURDUyA6IFQySV9hZGRlX3N1YmVfc19pcnM8MGIxMDEwLCAiYWRjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChhZGRlX2xpdmVfY2Fycnkgbm9kZTokTEhTLCBub2RlOiRSSFMpPiwgMT47CitkZWZtIHQyU0JDUyA6IFQySV9hZGRlX3N1YmVfc19pcnM8MGIxMDExLCAic2JjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChzdWJlX2xpdmVfY2Fycnkgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47CisKKy8vIFJTQgorZGVmbSB0MlJTQiAgOiBUMklfcmJpbl9pcyAgIDwwYjExMTAsICJyc2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KHN1YiAgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47CitkZWZtIHQyUlNCUyA6IFQySV9yYmluX3NfaXMgPDBiMTExMCwgInJzYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoc3ViYyBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsKKworLy8gKHN1YiBYLCBpbW0pIGdldHMgY2Fub25pY2FsaXplZCB0byAoYWRkIFgsIC1pbW0pLiAgTWF0Y2ggdGhpcyBmb3JtLgorLy8gVGhlIGFzc3VtZS1uby1jYXJyeS1pbiBmb3JtIHVzZXMgdGhlIG5lZ2F0aW9uIG9mIHRoZSBpbnB1dCBzaW5jZSBhZGQvc3ViCisvLyBhc3N1bWUgb3Bwb3NpdGUgbWVhbmluZ3Mgb2YgdGhlIGNhcnJ5IGZsYWcgKGkuZS4sIGNhcnJ5ID09ICFib3Jyb3cpLgorLy8gU2VlIHRoZSBkZWZpbml0aW9uIG9mIEFkZFdpdGhDYXJyeSgpIGluIHRoZSBBUk0gQVJNIEEyLjIuMSBmb3IgdGhlIGdvcnkKKy8vIGRldGFpbHMuCisvLyBUaGUgQWRkZWRDb21wbGV4aXR5IHByZWZlcmVuY2VzIHRoZSBmaXJzdCB2YXJpYW50IG92ZXIgdGhlIG90aGVycyBzaW5jZQorLy8gaXQgY2FuIGJlIHNocnVuayB0byBhIDE2LWJpdCB3aWRlIGVuY29kaW5nLCB3aGlsZSB0aGUgb3RoZXJzIGNhbm5vdC4KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAxIGluCitkZWYgOiBUMlBhdDwoYWRkICAgICAgICBHUFI6JHNyYywgaW1tMF8yNTVfbmVnOiRpbW0pLAorICAgICAgICAgICAgKHQyU1VCcmkgICAgR1BSOiRzcmMsIGltbTBfMjU1X25lZzokaW1tKT47CitkZWYgOiBUMlBhdDwoYWRkICAgICAgICBHUFI6JHNyYywgdDJfc29faW1tX25lZzokaW1tKSwKKyAgICAgICAgICAgICh0MlNVQnJpICAgIEdQUjokc3JjLCB0Ml9zb19pbW1fbmVnOiRpbW0pPjsKK2RlZiA6IFQyUGF0PChhZGQgICAgICAgIEdQUjokc3JjLCBpbW0wXzQwOTVfbmVnOiRpbW0pLAorICAgICAgICAgICAgKHQyU1VCcmkxMiAgR1BSOiRzcmMsIGltbTBfNDA5NV9uZWc6JGltbSk+OworbGV0IEFkZGVkQ29tcGxleGl0eSA9IDEgaW4KK2RlZiA6IFQyUGF0PChhZGRjICAgICAgIHJHUFI6JHNyYywgaW1tMF8yNTVfbmVnOiRpbW0pLAorICAgICAgICAgICAgKHQyU1VCU3JpICAgckdQUjokc3JjLCBpbW0wXzI1NV9uZWc6JGltbSk+OworZGVmIDogVDJQYXQ8KGFkZGMgICAgICAgckdQUjokc3JjLCB0Ml9zb19pbW1fbmVnOiRpbW0pLAorICAgICAgICAgICAgKHQyU1VCU3JpICAgckdQUjokc3JjLCB0Ml9zb19pbW1fbmVnOiRpbW0pPjsKKy8vIFRoZSB3aXRoLWNhcnJ5LWluIGZvcm0gbWF0Y2hlcyBiaXR3aXNlIG5vdCBpbnN0ZWFkIG9mIHRoZSBuZWdhdGlvbi4KKy8vIEVmZmVjdGl2ZWx5LCB0aGUgaW52ZXJzZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgY2FycnkgZmxhZyBhbHJlYWR5IGFjY291bnRzCisvLyBmb3IgcGFydCBvZiB0aGUgbmVnYXRpb24uCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMSBpbgorZGVmIDogVDJQYXQ8KGFkZGUgICAgICAgckdQUjokc3JjLCBpbW0wXzI1NV9ub3Q6JGltbSksCisgICAgICAgICAgICAodDJTQkNTcmkgICByR1BSOiRzcmMsIGltbTBfMjU1X25vdDokaW1tKT47CitkZWYgOiBUMlBhdDwoYWRkZSAgICAgICByR1BSOiRzcmMsIHQyX3NvX2ltbV9ub3Q6JGltbSksCisgICAgICAgICAgICAodDJTQkNTcmkgICByR1BSOiRzcmMsIHQyX3NvX2ltbV9ub3Q6JGltbSk+OworCisvLyBTZWxlY3QgQnl0ZXMgLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkKKworZGVmIHQyU0VMIDogVDJJPChvdXRzIEdQUjokZHN0KSwgKGlucyBHUFI6JGEsIEdQUjokYiksIE5vSXRpbmVyYXJ5LCAic2VsIiwKKyAgICAgICAgICAgICAgICAiXHQkZHN0LCAkYSwgJGIiLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICBsZXQgSW5zdHsyNi0yNH0gPSAwYjAxMDsKKyAgbGV0IEluc3R7MjN9ID0gMGIxOworICBsZXQgSW5zdHsyMi0yMH0gPSAwYjAxMDsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOworICBsZXQgSW5zdHs3fSA9IDBiMTsKKyAgbGV0IEluc3R7Ni00fSA9IDBiMDAwOworfQorCisvLyBBNi4zLjEzLCBBNi4zLjE0LCBBNi4zLjE1IFBhcmFsbGVsIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAoc2lnbmVkL3Vuc2lnbmVkKQorLy8gQW5kIE1pc2NlbGxhbmVvdXMgb3BlcmF0aW9ucyAtLSBmb3IgZGlzYXNzZW1ibHkgb25seQorY2xhc3MgVDJJX3BhbTxiaXRzPDM+IG9wMjJfMjAsIGJpdHM8ND4gb3A3XzQsIHN0cmluZyBvcGMsCisgICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXQgPSBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+CisgIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiksIE5vSXRpbmVyYXJ5LCBvcGMsCisgICAgICAgICJcdCRkc3QsICRhLCAkYiIsIHBhdD4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMDE7CisgIGxldCBJbnN0ezIyLTIwfSA9IG9wMjJfMjA7CisgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsKKyAgbGV0IEluc3R7Ny00fSA9IG9wN180OworfQorCisvLyBTYXR1cmF0aW5nIGFkZC9zdWJ0cmFjdCAtLSBmb3IgZGlzYXNzZW1ibHkgb25seQorCitkZWYgdDJRQUREICAgIDogVDJJX3BhbTwwYjAwMCwgMGIxMDAwLCAicWFkZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChpbnRfYXJtX3FhZGQgckdQUjokYSwgckdQUjokYikpXT47CitkZWYgdDJRQUREMTYgIDogVDJJX3BhbTwwYjAwMSwgMGIwMDAxLCAicWFkZDE2Ij47CitkZWYgdDJRQUREOCAgIDogVDJJX3BhbTwwYjAwMCwgMGIwMDAxLCAicWFkZDgiPjsKK2RlZiB0MlFBU1ggICAgOiBUMklfcGFtPDBiMDEwLCAwYjAwMDEsICJxYXN4Ij47CitkZWYgdDJRREFERCAgIDogVDJJX3BhbTwwYjAwMCwgMGIxMDAxLCAicWRhZGQiPjsKK2RlZiB0MlFEU1VCICAgOiBUMklfcGFtPDBiMDAwLCAwYjEwMTEsICJxZHN1YiI+OworZGVmIHQyUVNBWCAgICA6IFQySV9wYW08MGIxMTAsIDBiMDAwMSwgInFzYXgiPjsKK2RlZiB0MlFTVUIgICAgOiBUMklfcGFtPDBiMDAwLCAwYjEwMTAsICJxc3ViIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKGludF9hcm1fcXN1YiByR1BSOiRhLCByR1BSOiRiKSldPjsKK2RlZiB0MlFTVUIxNiAgOiBUMklfcGFtPDBiMTAxLCAwYjAwMDEsICJxc3ViMTYiPjsKK2RlZiB0MlFTVUI4ICAgOiBUMklfcGFtPDBiMTAwLCAwYjAwMDEsICJxc3ViOCI+OworZGVmIHQyVVFBREQxNiA6IFQySV9wYW08MGIwMDEsIDBiMDEwMSwgInVxYWRkMTYiPjsKK2RlZiB0MlVRQUREOCAgOiBUMklfcGFtPDBiMDAwLCAwYjAxMDEsICJ1cWFkZDgiPjsKK2RlZiB0MlVRQVNYICAgOiBUMklfcGFtPDBiMDEwLCAwYjAxMDEsICJ1cWFzeCI+OworZGVmIHQyVVFTQVggICA6IFQySV9wYW08MGIxMTAsIDBiMDEwMSwgInVxc2F4Ij47CitkZWYgdDJVUVNVQjE2IDogVDJJX3BhbTwwYjEwMSwgMGIwMTAxLCAidXFzdWIxNiI+OworZGVmIHQyVVFTVUI4ICA6IFQySV9wYW08MGIxMDAsIDBiMDEwMSwgInVxc3ViOCI+OworCisvLyBTaWduZWQvVW5zaWduZWQgYWRkL3N1YnRyYWN0IC0tIGZvciBkaXNhc3NlbWJseSBvbmx5CisKK2RlZiB0MlNBU1ggICAgOiBUMklfcGFtPDBiMDEwLCAwYjAwMDAsICJzYXN4Ij47CitkZWYgdDJTQUREMTYgIDogVDJJX3BhbTwwYjAwMSwgMGIwMDAwLCAic2FkZDE2Ij47CitkZWYgdDJTQUREOCAgIDogVDJJX3BhbTwwYjAwMCwgMGIwMDAwLCAic2FkZDgiPjsKK2RlZiB0MlNTQVggICAgOiBUMklfcGFtPDBiMTEwLCAwYjAwMDAsICJzc2F4Ij47CitkZWYgdDJTU1VCMTYgIDogVDJJX3BhbTwwYjEwMSwgMGIwMDAwLCAic3N1YjE2Ij47CitkZWYgdDJTU1VCOCAgIDogVDJJX3BhbTwwYjEwMCwgMGIwMDAwLCAic3N1YjgiPjsKK2RlZiB0MlVBU1ggICAgOiBUMklfcGFtPDBiMDEwLCAwYjAxMDAsICJ1YXN4Ij47CitkZWYgdDJVQUREMTYgIDogVDJJX3BhbTwwYjAwMSwgMGIwMTAwLCAidWFkZDE2Ij47CitkZWYgdDJVQUREOCAgIDogVDJJX3BhbTwwYjAwMCwgMGIwMTAwLCAidWFkZDgiPjsKK2RlZiB0MlVTQVggICAgOiBUMklfcGFtPDBiMTEwLCAwYjAxMDAsICJ1c2F4Ij47CitkZWYgdDJVU1VCMTYgIDogVDJJX3BhbTwwYjEwMSwgMGIwMTAwLCAidXN1YjE2Ij47CitkZWYgdDJVU1VCOCAgIDogVDJJX3BhbTwwYjEwMCwgMGIwMTAwLCAidXN1YjgiPjsKKworLy8gU2lnbmVkL1Vuc2lnbmVkIGhhbHZpbmcgYWRkL3N1YnRyYWN0IC0tIGZvciBkaXNhc3NlbWJseSBvbmx5CisKK2RlZiB0MlNIQVNYICAgOiBUMklfcGFtPDBiMDEwLCAwYjAwMTAsICJzaGFzeCI+OworZGVmIHQyU0hBREQxNiA6IFQySV9wYW08MGIwMDEsIDBiMDAxMCwgInNoYWRkMTYiPjsKK2RlZiB0MlNIQUREOCAgOiBUMklfcGFtPDBiMDAwLCAwYjAwMTAsICJzaGFkZDgiPjsKK2RlZiB0MlNIU0FYICAgOiBUMklfcGFtPDBiMTEwLCAwYjAwMTAsICJzaHNheCI+OworZGVmIHQyU0hTVUIxNiA6IFQySV9wYW08MGIxMDEsIDBiMDAxMCwgInNoc3ViMTYiPjsKK2RlZiB0MlNIU1VCOCAgOiBUMklfcGFtPDBiMTAwLCAwYjAwMTAsICJzaHN1YjgiPjsKK2RlZiB0MlVIQVNYICAgOiBUMklfcGFtPDBiMDEwLCAwYjAxMTAsICJ1aGFzeCI+OworZGVmIHQyVUhBREQxNiA6IFQySV9wYW08MGIwMDEsIDBiMDExMCwgInVoYWRkMTYiPjsKK2RlZiB0MlVIQUREOCAgOiBUMklfcGFtPDBiMDAwLCAwYjAxMTAsICJ1aGFkZDgiPjsKK2RlZiB0MlVIU0FYICAgOiBUMklfcGFtPDBiMTEwLCAwYjAxMTAsICJ1aHNheCI+OworZGVmIHQyVUhTVUIxNiA6IFQySV9wYW08MGIxMDEsIDBiMDExMCwgInVoc3ViMTYiPjsKK2RlZiB0MlVIU1VCOCAgOiBUMklfcGFtPDBiMTAwLCAwYjAxMTAsICJ1aHN1YjgiPjsKKworLy8gVW5zaWduZWQgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIFthbmQgQWNjdW11bGF0ZV0gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkKKworZGVmIHQyVVNBRDggICA6IFQySV9tYWM8MCwgMGIxMTEsIDBiMDAwMCwgKG91dHMgckdQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIHJHUFI6JGEsIHJHUFI6JGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJ1c2FkOCIsICJcdCRkc3QsICRhLCAkYiIsIFtdPiB7CisgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsKK30KK2RlZiB0MlVTQURBOCAgOiBUMklfbWFjPDAsIDBiMTExLCAwYjAwMDAsIChvdXRzIHJHUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgIChpbnMgckdQUjokYSwgckdQUjokYiwgckdQUjokYWNjKSwgTm9JdGluZXJhcnksICJ1c2FkYTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlx0JGRzdCwgJGEsICRiLCAkYWNjIiwgW10+OworCisvLyBTaWduZWQvVW5zaWduZWQgc2F0dXJhdGUgLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkKKworZGVmIHQyU1NBVGxzbDpUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyBpMzJpbW06JGJpdF9wb3MsckdQUjokYSxpMzJpbW06JHNoYW10KSwKKyAgICAgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJzc2F0IiwgIlx0JGRzdCwgJGJpdF9wb3MsICRhLCBsc2wgJHNoYW10IiwKKyAgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI1LTIyfSA9IDBiMTEwMDsKKyAgbGV0IEluc3R7MjB9ID0gMDsKKyAgbGV0IEluc3R7MTV9ID0gMDsKKyAgbGV0IEluc3R7MjF9ID0gMDsgICAgICAgIC8vIHNoID0gJzAnCit9CisKK2RlZiB0MlNTQVRhc3I6VDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRiaXRfcG9zLHJHUFI6JGEsaTMyaW1tOiRzaGFtdCksCisgICAgICAgICAgICAgICAgICAgIE5vSXRpbmVyYXJ5LCAic3NhdCIsICJcdCRkc3QsICRiaXRfcG9zLCAkYSwgYXNyICRzaGFtdCIsCisgICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNS0yMn0gPSAwYjExMDA7CisgIGxldCBJbnN0ezIwfSA9IDA7CisgIGxldCBJbnN0ezE1fSA9IDA7CisgIGxldCBJbnN0ezIxfSA9IDE7ICAgICAgICAvLyBzaCA9ICcxJworfQorCitkZWYgdDJTU0FUMTY6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIGkzMmltbTokYml0X3BvcywgckdQUjokYSksIE5vSXRpbmVyYXJ5LAorICAgICAgICAgICAgICAgICAgICJzc2F0MTYiLCAiXHQkZHN0LCAkYml0X3BvcywgJGEiLAorICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNS0yMn0gPSAwYjExMDA7CisgIGxldCBJbnN0ezIwfSA9IDA7CisgIGxldCBJbnN0ezE1fSA9IDA7CisgIGxldCBJbnN0ezIxfSA9IDE7ICAgICAgICAvLyBzaCA9ICcxJworICBsZXQgSW5zdHsxNC0xMn0gPSAwYjAwMDsgLy8gaW1tMyA9ICcwMDAnCisgIGxldCBJbnN0ezctNn0gPSAwYjAwOyAgICAvLyBpbW0yID0gJzAwJworfQorCitkZWYgdDJVU0FUbHNsOlQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIGkzMmltbTokYml0X3BvcyxyR1BSOiRhLGkzMmltbTokc2hhbXQpLAorICAgICAgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJ1c2F0IiwgIlx0JGRzdCwgJGJpdF9wb3MsICRhLCBsc2wgJHNoYW10IiwKKyAgICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNS0yMn0gPSAwYjExMTA7CisgIGxldCBJbnN0ezIwfSA9IDA7CisgIGxldCBJbnN0ezE1fSA9IDA7CisgIGxldCBJbnN0ezIxfSA9IDA7ICAgICAgICAvLyBzaCA9ICcwJworfQorCitkZWYgdDJVU0FUYXNyOlQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIGkzMmltbTokYml0X3BvcyxyR1BSOiRhLGkzMmltbTokc2hhbXQpLAorICAgICAgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksICJ1c2F0IiwgIlx0JGRzdCwgJGJpdF9wb3MsICRhLCBhc3IgJHNoYW10IiwKKyAgICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNS0yMn0gPSAwYjExMTA7CisgIGxldCBJbnN0ezIwfSA9IDA7CisgIGxldCBJbnN0ezE1fSA9IDA7CisgIGxldCBJbnN0ezIxfSA9IDE7ICAgICAgICAvLyBzaCA9ICcxJworfQorCitkZWYgdDJVU0FUMTY6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIGkzMmltbTokYml0X3BvcywgckdQUjokYSksIE5vSXRpbmVyYXJ5LAorICAgICAgICAgICAgICAgICAgICJ1c2F0MTYiLCAiXHQkZHN0LCAkYml0X3BvcywgJGEiLAorICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNS0yMn0gPSAwYjExMTA7CisgIGxldCBJbnN0ezIwfSA9IDA7CisgIGxldCBJbnN0ezE1fSA9IDA7CisgIGxldCBJbnN0ezIxfSA9IDE7ICAgICAgICAvLyBzaCA9ICcxJworICBsZXQgSW5zdHsxNC0xMn0gPSAwYjAwMDsgLy8gaW1tMyA9ICcwMDAnCisgIGxldCBJbnN0ezctNn0gPSAwYjAwOyAgICAvLyBpbW0yID0gJzAwJworfQorCitkZWYgOiBUMlBhdDwoaW50X2FybV9zc2F0IEdQUjokYSwgaW1tOiRwb3MpLCAodDJTU0FUbHNsIGltbTokcG9zLCBHUFI6JGEsIDApPjsKK2RlZiA6IFQyUGF0PChpbnRfYXJtX3VzYXQgR1BSOiRhLCBpbW06JHBvcyksICh0MlVTQVRsc2wgaW1tOiRwb3MsIEdQUjokYSwgMCk+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFNoaWZ0IGFuZCByb3RhdGUgSW5zdHJ1Y3Rpb25zLgorLy8KKworZGVmbSB0MkxTTCAgOiBUMklfc2hfaXI8MGIwMCwgImxzbCIsIEJpbk9wRnJhZzwoc2hsICBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsKK2RlZm0gdDJMU1IgIDogVDJJX3NoX2lyPDBiMDEsICJsc3IiLCBCaW5PcEZyYWc8KHNybCAgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47CitkZWZtIHQyQVNSICA6IFQySV9zaF9pcjwwYjEwLCAiYXNyIiwgQmluT3BGcmFnPChzcmEgIG5vZGU6JExIUywgbm9kZTokUkhTKT4+OworZGVmbSB0MlJPUiAgOiBUMklfc2hfaXI8MGIxMSwgInJvciIsIEJpbk9wRnJhZzwocm90ciBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsKKworbGV0IFVzZXMgPSBbQ1BTUl0gaW4geworZGVmIHQyTU9WcnggOiBUMnNJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjKSwgSUlDX2lNT1ZzaSwKKyAgICAgICAgICAgICAgICAgICAicnJ4IiwgIlx0JGRzdCwgJHNyYyIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAoQVJNcnJ4IHJHUFI6JHNyYykpXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICBsZXQgSW5zdHsyNC0yMX0gPSAwYjAwMTA7CisgIGxldCBJbnN0ezIwfSA9ID87IC8vIFRoZSBTIGJpdC4KKyAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOyAvLyBSbgorICBsZXQgSW5zdHsxNC0xMn0gPSAwYjAwMDsKKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAxMTsKK30KK30KKworbGV0IERlZnMgPSBbQ1BTUl0gaW4geworZGVmIHQyTU9Wc3JsX2ZsYWcgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRzcmMpLCBJSUNfaU1PVnNpLAorICAgICAgICAgICAgICAgICAgICAgICAgImxzcnMiLCAiLndcdCRkc3QsICRzcmMsICMxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKEFSTXNybF9mbGFnIHJHUFI6JHNyYykpXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICBsZXQgSW5zdHsyNC0yMX0gPSAwYjAwMTA7CisgIGxldCBJbnN0ezIwfSA9IDE7IC8vIFRoZSBTIGJpdC4KKyAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOyAvLyBSbgorICBsZXQgSW5zdHs1LTR9ID0gMGIwMTsgLy8gU2hpZnQgdHlwZS4KKyAgLy8gU2hpZnQgYW1vdW50ID0gSW5zdHsxNC0xMjo3LTZ9ID0gMS4KKyAgbGV0IEluc3R7MTQtMTJ9ID0gMGIwMDA7CisgIGxldCBJbnN0ezctNn0gPSAwYjAxOworfQorZGVmIHQyTU9Wc3JhX2ZsYWcgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRzcmMpLCBJSUNfaU1PVnNpLAorICAgICAgICAgICAgICAgICAgICAgICAgImFzcnMiLCAiLndcdCRkc3QsICRzcmMsICMxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKEFSTXNyYV9mbGFnIHJHUFI6JHNyYykpXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICBsZXQgSW5zdHsyNC0yMX0gPSAwYjAwMTA7CisgIGxldCBJbnN0ezIwfSA9IDE7IC8vIFRoZSBTIGJpdC4KKyAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOyAvLyBSbgorICBsZXQgSW5zdHs1LTR9ID0gMGIxMDsgLy8gU2hpZnQgdHlwZS4KKyAgLy8gU2hpZnQgYW1vdW50ID0gSW5zdHsxNC0xMjo3LTZ9ID0gMS4KKyAgbGV0IEluc3R7MTQtMTJ9ID0gMGIwMDA7CisgIGxldCBJbnN0ezctNn0gPSAwYjAxOworfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIEJpdHdpc2UgSW5zdHJ1Y3Rpb25zLgorLy8KKworZGVmbSB0MkFORCAgOiBUMklfYmluX3dfaXJzPDBiMDAwMCwgImFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChhbmQgbm9kZTokTEhTLCBub2RlOiRSSFMpPiwgMT47CitkZWZtIHQyT1JSICA6IFQySV9iaW5fd19pcnM8MGIwMDEwLCAib3JyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KG9yICBub2RlOiRMSFMsIG5vZGU6JFJIUyk+LCAxPjsKK2RlZm0gdDJFT1IgIDogVDJJX2Jpbl93X2lyczwwYjAxMDAsICJlb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoeG9yIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIDE+OworCitkZWZtIHQyQklDICA6IFQySV9iaW5fd19pcnM8MGIwMDAxLCAiYmljIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5PcEZyYWc8KGFuZCBub2RlOiRMSFMsIChub3Qgbm9kZTokUkhTKSk+PjsKKworbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiBpbgorZGVmIHQyQkZDIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjLCBiZl9pbnZfbWFza19pbW06JGltbSksCisgICAgICAgICAgICAgICAgSUlDX2lVTkFzaSwgImJmYyIsICJcdCRkc3QsICRpbW0iLAorICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKGFuZCByR1BSOiRzcmMsIGJmX2ludl9tYXNrX2ltbTokaW1tKSldPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI1fSA9IDE7CisgIGxldCBJbnN0ezI0LTIwfSA9IDBiMTAxMTA7CisgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4KKyAgbGV0IEluc3R7MTV9ID0gMDsKK30KKworZGVmIHQyU0JGWDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjLCBpbW0wXzMxOiRsc2IsIGltbTBfMzE6JHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgSUlDX2lBTFVpLCAic2JmeCIsICJcdCRkc3QsICRzcmMsICRsc2IsICR3aWR0aCIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI1fSA9IDE7CisgIGxldCBJbnN0ezI0LTIwfSA9IDBiMTAxMDA7CisgIGxldCBJbnN0ezE1fSA9IDA7Cit9CisKK2RlZiB0MlVCRlg6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JHNyYywgaW1tMF8zMTokbHNiLCBpbW0wXzMxOiR3aWR0aCksCisgICAgICAgICAgICAgICAgIElJQ19pQUxVaSwgInViZngiLCAiXHQkZHN0LCAkc3JjLCAkbHNiLCAkd2lkdGgiLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNX0gPSAxOworICBsZXQgSW5zdHsyNC0yMH0gPSAwYjExMTAwOworICBsZXQgSW5zdHsxNX0gPSAwOworfQorCisvLyBBOC42LjE4ICBCRkkgLSBCaXRmaWVsZCBpbnNlcnQgKEVuY29kaW5nIFQxKQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiBpbgorZGVmIHQyQkZJIDogVDJJPChvdXRzIHJHUFI6JGRzdCksCisgICAgICAgICAgICAgICAgKGlucyByR1BSOiRzcmMsIHJHUFI6JHZhbCwgYmZfaW52X21hc2tfaW1tOiRpbW0pLAorICAgICAgICAgICAgICAgIElJQ19pQUxVaSwgImJmaSIsICJcdCRkc3QsICR2YWwsICRpbW0iLAorICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKEFSTWJmaSByR1BSOiRzcmMsIHJHUFI6JHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX2ludl9tYXNrX2ltbTokaW1tKSldPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI1fSA9IDE7CisgIGxldCBJbnN0ezI0LTIwfSA9IDBiMTAxMTA7CisgIGxldCBJbnN0ezE1fSA9IDA7Cit9CisKK2RlZm0gdDJPUk4gIDogVDJJX2Jpbl9pcnM8MGIwMDExLCAib3JuIiwgQmluT3BGcmFnPChvciAgbm9kZTokTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IG5vZGU6JFJIUykpPj47CisKKy8vIFByZWZlciBvdmVyIG9mIHQyRU9ScmkgcmEsIHJiLCAtMSBiZWNhdXNlIG12biBoYXMgMTYtYml0IHZlcnNpb24KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAxIGluCitkZWZtIHQyTVZOICA6IFQySV91bl9pcnMgPDBiMDAxMSwgIm12biIsIFVuT3BGcmFnPChub3Qgbm9kZTokU3JjKT4sIDEsIDE+OworCisKK2xldCBBZGRlZENvbXBsZXhpdHkgPSAxIGluCitkZWYgOiBUMlBhdDwoYW5kICAgICByR1BSOiRzcmMsIHQyX3NvX2ltbV9ub3Q6JGltbSksCisgICAgICAgICAgICAodDJCSUNyaSByR1BSOiRzcmMsIHQyX3NvX2ltbV9ub3Q6JGltbSk+OworCisvLyBGSVhNRTogRGlzYWJsZSB0aGlzIHBhdHRlcm4gb24gRGFyd2luIHRvIHdvcmthcm91bmQgYW4gYXNzZW1ibGVyIGJ1Zy4KK2RlZiA6IFQyUGF0PChvciAgICAgIHJHUFI6JHNyYywgdDJfc29faW1tX25vdDokaW1tKSwKKyAgICAgICAgICAgICh0Mk9STnJpIHJHUFI6JHNyYywgdDJfc29faW1tX25vdDokaW1tKT4sCisgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjJdPjsKKworZGVmIDogVDJQYXQ8KHQyX3NvX2ltbV9ub3Q6JHNyYyksCisgICAgICAgICAgICAodDJNVk5pIHQyX3NvX2ltbV9ub3Q6JHNyYyk+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIE11bHRpcGx5IEluc3RydWN0aW9ucy4KKy8vCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbgorZGVmIHQyTVVMOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiKSwgSUlDX2lNVUwzMiwKKyAgICAgICAgICAgICAgICAibXVsIiwgIlx0JGRzdCwgJGEsICRiIiwKKyAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChtdWwgckdQUjokYSwgckdQUjokYikpXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMTA7CisgIGxldCBJbnN0ezIyLTIwfSA9IDBiMDAwOworICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7IC8vIFJhID0gMGIxMTExIChubyBhY2N1bXVsYXRlKQorICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAwOyAvLyBNdWx0aXBseQorfQorCitkZWYgdDJNTEE6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIsIHJHUFI6JGMpLCBJSUNfaU1BQzMyLAorCQkibWxhIiwgIlx0JGRzdCwgJGEsICRiLCAkYyIsCisJCVsoc2V0IHJHUFI6JGRzdCwgKGFkZCAobXVsIHJHUFI6JGEsIHJHUFI6JGIpLCByR1BSOiRjKSldPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMDsKKyAgbGV0IEluc3R7MjItMjB9ID0gMGIwMDA7CisgIGxldCBJbnN0ezE1LTEyfSA9IHs/LCA/LCA/LCA/fTsgLy8gUmEKKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMDsgLy8gTXVsdGlwbHkKK30KKworZGVmIHQyTUxTOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiLCByR1BSOiRjKSwgSUlDX2lNQUMzMiwKKwkJIm1scyIsICJcdCRkc3QsICRhLCAkYiwgJGMiLAorICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKHN1YiByR1BSOiRjLCAobXVsIHJHUFI6JGEsIHJHUFI6JGIpKSldPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMDsKKyAgbGV0IEluc3R7MjItMjB9ID0gMGIwMDA7CisgIGxldCBJbnN0ezE1LTEyfSA9IHs/LCA/LCA/LCA/fTsgLy8gUmEKKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMTsgLy8gTXVsdGlwbHkgYW5kIFN1YnRyYWN0Cit9CisKKy8vIEV4dHJhIHByZWNpc2lvbiBtdWx0aXBsaWVzIHdpdGggbG93IC8gaGlnaCByZXN1bHRzCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4geworbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4geworZGVmIHQyU01VTEwgOiBUMkk8KG91dHMgckdQUjokbGRzdCwgckdQUjokaGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiksIElJQ19pTVVMNjQsCisgICAgICAgICAgICAgICAgICAgInNtdWxsIiwgIlx0JGxkc3QsICRoZHN0LCAkYSwgJGIiLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMTE7CisgIGxldCBJbnN0ezIyLTIwfSA9IDBiMDAwOworICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAwOworfQorCitkZWYgdDJVTVVMTCA6IFQySTwob3V0cyByR1BSOiRsZHN0LCByR1BSOiRoZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiKSwgSUlDX2lNVUw2NCwKKyAgICAgICAgICAgICAgICAgICAidW11bGwiLCAiXHQkbGRzdCwgJGhkc3QsICRhLCAkYiIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMTsKKyAgbGV0IEluc3R7MjItMjB9ID0gMGIwMTA7CisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDA7Cit9Cit9IC8vIGlzQ29tbXV0YWJsZQorCisvLyBNdWx0aXBseSArIGFjY3VtdWxhdGUKK2RlZiB0MlNNTEFMIDogVDJJPChvdXRzIHJHUFI6JGxkc3QsIHJHUFI6JGhkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIpLCBJSUNfaU1BQzY0LAorICAgICAgICAgICAgICAgICAgInNtbGFsIiwgIlx0JGxkc3QsICRoZHN0LCAkYSwgJGIiLCBbXT57CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMTsKKyAgbGV0IEluc3R7MjItMjB9ID0gMGIxMDA7CisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDA7Cit9CisKK2RlZiB0MlVNTEFMIDogVDJJPChvdXRzIHJHUFI6JGxkc3QsIHJHUFI6JGhkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIpLCBJSUNfaU1BQzY0LAorICAgICAgICAgICAgICAgICAgInVtbGFsIiwgIlx0JGxkc3QsICRoZHN0LCAkYSwgJGIiLCBbXT57CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMTsKKyAgbGV0IEluc3R7MjItMjB9ID0gMGIxMTA7CisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDA7Cit9CisKK2RlZiB0MlVNQUFMIDogVDJJPChvdXRzIHJHUFI6JGxkc3QsIHJHUFI6JGhkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIpLCBJSUNfaU1BQzY0LAorICAgICAgICAgICAgICAgICAgInVtYWFsIiwgIlx0JGxkc3QsICRoZHN0LCAkYSwgJGIiLCBbXT57CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMTsKKyAgbGV0IEluc3R7MjItMjB9ID0gMGIxMTA7CisgIGxldCBJbnN0ezctNH0gPSAwYjAxMTA7Cit9Cit9IC8vIG5ldmVySGFzU2lkZUVmZmVjdHMKKworLy8gUm91bmRpbmcgdmFyaWFudHMgb2YgdGhlIGJlbG93IGluY2x1ZGVkIGZvciBkaXNhc3NlbWJseSBvbmx5CisKKy8vIE1vc3Qgc2lnbmlmaWNhbnQgd29yZCBtdWx0aXBseQorZGVmIHQyU01NVUwgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiKSwgSUlDX2lNVUwzMiwKKyAgICAgICAgICAgICAgICAgICJzbW11bCIsICJcdCRkc3QsICRhLCAkYiIsCisgICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChtdWxocyByR1BSOiRhLCByR1BSOiRiKSldPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMDsKKyAgbGV0IEluc3R7MjItMjB9ID0gMGIxMDE7CisgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsgLy8gUmEgPSAwYjExMTEgKG5vIGFjY3VtdWxhdGUpCisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDA7IC8vIE5vIFJvdW5kaW5nIChJbnN0ezR9ID0gMCkKK30KKworZGVmIHQyU01NVUxSIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiksIElJQ19pTVVMMzIsCisgICAgICAgICAgICAgICAgICAic21tdWxyIiwgIlx0JGRzdCwgJGEsICRiIiwgW10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMTEwOworICBsZXQgSW5zdHsyMi0yMH0gPSAwYjEwMTsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOyAvLyBSYSA9IDBiMTExMSAobm8gYWNjdW11bGF0ZSkKKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMTsgLy8gUm91bmRpbmcgKEluc3R7NH0gPSAxKQorfQorCitkZWYgdDJTTU1MQSA6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIsIHJHUFI6JGMpLCBJSUNfaU1BQzMyLAorICAgICAgICAgICAgICAgICAgInNtbWxhIiwgIlx0JGRzdCwgJGEsICRiLCAkYyIsCisgICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChhZGQgKG11bGhzIHJHUFI6JGEsIHJHUFI6JGIpLCByR1BSOiRjKSldPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMDsKKyAgbGV0IEluc3R7MjItMjB9ID0gMGIxMDE7CisgIGxldCBJbnN0ezE1LTEyfSA9IHs/LCA/LCA/LCA/fTsgLy8gUmEKKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMDsgLy8gTm8gUm91bmRpbmcgKEluc3R7NH0gPSAwKQorfQorCitkZWYgdDJTTU1MQVIgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiLCByR1BSOiRjKSwgSUlDX2lNQUMzMiwKKyAgICAgICAgICAgICAgICAgICJzbW1sYXIiLCAiXHQkZHN0LCAkYSwgJGIsICRjIiwgW10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMTEwOworICBsZXQgSW5zdHsyMi0yMH0gPSAwYjEwMTsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gez8sID8sID8sID99OyAvLyBSYQorICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAxOyAvLyBSb3VuZGluZyAoSW5zdHs0fSA9IDEpCit9CisKK2RlZiB0MlNNTUxTIDogVDJJIDwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIsIHJHUFI6JGMpLCBJSUNfaU1BQzMyLAorICAgICAgICAgICAgICAgICAgICJzbW1scyIsICJcdCRkc3QsICRhLCAkYiwgJGMiLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKHN1YiByR1BSOiRjLCAobXVsaHMgckdQUjokYSwgckdQUjokYikpKV0+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMTEwOworICBsZXQgSW5zdHsyMi0yMH0gPSAwYjExMDsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gez8sID8sID8sID99OyAvLyBSYQorICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAwOyAvLyBObyBSb3VuZGluZyAoSW5zdHs0fSA9IDApCit9CisKK2RlZiB0MlNNTUxTUiA6IFQySSA8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiLCByR1BSOiRjKSwgSUlDX2lNQUMzMiwKKyAgICAgICAgICAgICAgICAgICAic21tbHNyIiwgIlx0JGRzdCwgJGEsICRiLCAkYyIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMDsKKyAgbGV0IEluc3R7MjItMjB9ID0gMGIxMTA7CisgIGxldCBJbnN0ezE1LTEyfSA9IHs/LCA/LCA/LCA/fTsgLy8gUmEKKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMTsgLy8gUm91bmRpbmcgKEluc3R7NH0gPSAxKQorfQorCittdWx0aWNsYXNzIFQySV9zbXVsPHN0cmluZyBvcGMsIFBhdEZyYWcgb3Bub2RlPiB7CisgIGRlZiBCQiA6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIpLCBJSUNfaU1VTDMyLAorICAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgImJiIiksICJcdCRkc3QsICRhLCAkYiIsCisgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKG9wbm9kZSAoc2V4dF9pbnJlZyByR1BSOiRhLCBpMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V4dF9pbnJlZyByR1BSOiRiLCBpMTYpKSldPiB7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMTA7CisgICAgbGV0IEluc3R7MjItMjB9ID0gMGIwMDE7CisgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOyAvLyBSYSA9IDBiMTExMSAobm8gYWNjdW11bGF0ZSkKKyAgICBsZXQgSW5zdHs3LTZ9ID0gMGIwMDsKKyAgICBsZXQgSW5zdHs1LTR9ID0gMGIwMDsKKyAgfQorCisgIGRlZiBCVCA6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIpLCBJSUNfaU1VTDMyLAorICAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgImJ0IiksICJcdCRkc3QsICRhLCAkYiIsCisgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKG9wbm9kZSAoc2V4dF9pbnJlZyByR1BSOiRhLCBpMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JhIHJHUFI6JGIsIChpMzIgMTYpKSkpXT4geworICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMTEwOworICAgIGxldCBJbnN0ezIyLTIwfSA9IDBiMDAxOworICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsgLy8gUmEgPSAwYjExMTEgKG5vIGFjY3VtdWxhdGUpCisgICAgbGV0IEluc3R7Ny02fSA9IDBiMDA7CisgICAgbGV0IEluc3R7NS00fSA9IDBiMDE7CisgIH0KKworICBkZWYgVEIgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiKSwgSUlDX2lNVUwzMiwKKyAgICAgICAgICAgICAgIXN0cmNvbmNhdChvcGMsICJ0YiIpLCAiXHQkZHN0LCAkYSwgJGIiLAorICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvcG5vZGUgKHNyYSByR1BSOiRhLCAoaTMyIDE2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXh0X2lucmVnIHJHUFI6JGIsIGkxNikpKV0+IHsKKyAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICAgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMDsKKyAgICBsZXQgSW5zdHsyMi0yMH0gPSAwYjAwMTsKKyAgICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7IC8vIFJhID0gMGIxMTExIChubyBhY2N1bXVsYXRlKQorICAgIGxldCBJbnN0ezctNn0gPSAwYjAwOworICAgIGxldCBJbnN0ezUtNH0gPSAwYjEwOworICB9CisKKyAgZGVmIFRUIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiksIElJQ19pTVVMMzIsCisgICAgICAgICAgICAgICFzdHJjb25jYXQob3BjLCAidHQiKSwgIlx0JGRzdCwgJGEsICRiIiwKKyAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAob3Bub2RlIChzcmEgckdQUjokYSwgKGkzMiAxNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JhIHJHUFI6JGIsIChpMzIgMTYpKSkpXT4geworICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMTEwOworICAgIGxldCBJbnN0ezIyLTIwfSA9IDBiMDAxOworICAgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsgLy8gUmEgPSAwYjExMTEgKG5vIGFjY3VtdWxhdGUpCisgICAgbGV0IEluc3R7Ny02fSA9IDBiMDA7CisgICAgbGV0IEluc3R7NS00fSA9IDBiMTE7CisgIH0KKworICBkZWYgV0IgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiKSwgSUlDX2lNVUwxNiwKKyAgICAgICAgICAgICAgIXN0cmNvbmNhdChvcGMsICJ3YiIpLCAiXHQkZHN0LCAkYSwgJGIiLAorICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChzcmEgKG9wbm9kZSByR1BSOiRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNleHRfaW5yZWcgckdQUjokYiwgaTE2KSksIChpMzIgMTYpKSldPiB7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMTA7CisgICAgbGV0IEluc3R7MjItMjB9ID0gMGIwMTE7CisgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOyAvLyBSYSA9IDBiMTExMSAobm8gYWNjdW11bGF0ZSkKKyAgICBsZXQgSW5zdHs3LTZ9ID0gMGIwMDsKKyAgICBsZXQgSW5zdHs1LTR9ID0gMGIwMDsKKyAgfQorCisgIGRlZiBXVCA6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIpLCBJSUNfaU1VTDE2LAorICAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgInd0IiksICJcdCRkc3QsICRhLCAkYiIsCisgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKHNyYSAob3Bub2RlIHJHUFI6JGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JhIHJHUFI6JGIsIChpMzIgMTYpKSksIChpMzIgMTYpKSldPiB7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMTA7CisgICAgbGV0IEluc3R7MjItMjB9ID0gMGIwMTE7CisgICAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOyAvLyBSYSA9IDBiMTExMSAobm8gYWNjdW11bGF0ZSkKKyAgICBsZXQgSW5zdHs3LTZ9ID0gMGIwMDsKKyAgICBsZXQgSW5zdHs1LTR9ID0gMGIwMTsKKyAgfQorfQorCisKK211bHRpY2xhc3MgVDJJX3NtbGE8c3RyaW5nIG9wYywgUGF0RnJhZyBvcG5vZGU+IHsKKyAgZGVmIEJCIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiwgckdQUjokYWNjKSwgSUlDX2lNQUMxNiwKKyAgICAgICAgICAgICAgIXN0cmNvbmNhdChvcGMsICJiYiIpLCAiXHQkZHN0LCAkYSwgJGIsICRhY2MiLAorICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChhZGQgckdQUjokYWNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcG5vZGUgKHNleHRfaW5yZWcgckdQUjokYSwgaTE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXh0X2lucmVnIHJHUFI6JGIsIGkxNikpKSldPiB7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMTA7CisgICAgbGV0IEluc3R7MjItMjB9ID0gMGIwMDE7CisgICAgbGV0IEluc3R7MTUtMTJ9ID0gez8sID8sID8sID99OyAvLyBSYQorICAgIGxldCBJbnN0ezctNn0gPSAwYjAwOworICAgIGxldCBJbnN0ezUtNH0gPSAwYjAwOworICB9CisKKyAgZGVmIEJUIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiwgckdQUjokYWNjKSwgSUlDX2lNQUMxNiwKKyAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgImJ0IiksICJcdCRkc3QsICRhLCAkYiwgJGFjYyIsCisgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAoYWRkIHJHUFI6JGFjYywgKG9wbm9kZSAoc2V4dF9pbnJlZyByR1BSOiRhLCBpMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyYSByR1BSOiRiLCAoaTMyIDE2KSkpKSldPiB7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMTA7CisgICAgbGV0IEluc3R7MjItMjB9ID0gMGIwMDE7CisgICAgbGV0IEluc3R7MTUtMTJ9ID0gez8sID8sID8sID99OyAvLyBSYQorICAgIGxldCBJbnN0ezctNn0gPSAwYjAwOworICAgIGxldCBJbnN0ezUtNH0gPSAwYjAxOworICB9CisKKyAgZGVmIFRCIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiwgckdQUjokYWNjKSwgSUlDX2lNQUMxNiwKKyAgICAgICAgICAgICAgIXN0cmNvbmNhdChvcGMsICJ0YiIpLCAiXHQkZHN0LCAkYSwgJGIsICRhY2MiLAorICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChhZGQgckdQUjokYWNjLCAob3Bub2RlIChzcmEgckdQUjokYSwgKGkzMiAxNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXh0X2lucmVnIHJHUFI6JGIsIGkxNikpKSldPiB7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMTA7CisgICAgbGV0IEluc3R7MjItMjB9ID0gMGIwMDE7CisgICAgbGV0IEluc3R7MTUtMTJ9ID0gez8sID8sID8sID99OyAvLyBSYQorICAgIGxldCBJbnN0ezctNn0gPSAwYjAwOworICAgIGxldCBJbnN0ezUtNH0gPSAwYjEwOworICB9CisKKyAgZGVmIFRUIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiwgckdQUjokYWNjKSwgSUlDX2lNQUMxNiwKKyAgICAgICAgICAgICAgIXN0cmNvbmNhdChvcGMsICJ0dCIpLCAiXHQkZHN0LCAkYSwgJGIsICRhY2MiLAorICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKGFkZCByR1BSOiRhY2MsIChvcG5vZGUgKHNyYSByR1BSOiRhLCAoaTMyIDE2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JhIHJHUFI6JGIsIChpMzIgMTYpKSkpKV0+IHsKKyAgICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICAgIGxldCBJbnN0ezI2LTIzfSA9IDBiMDExMDsKKyAgICBsZXQgSW5zdHsyMi0yMH0gPSAwYjAwMTsKKyAgICBsZXQgSW5zdHsxNS0xMn0gPSB7PywgPywgPywgP307IC8vIFJhCisgICAgbGV0IEluc3R7Ny02fSA9IDBiMDA7CisgICAgbGV0IEluc3R7NS00fSA9IDBiMTE7CisgIH0KKworICBkZWYgV0IgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiLCByR1BSOiRhY2MpLCBJSUNfaU1BQzE2LAorICAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgIndiIiksICJcdCRkc3QsICRhLCAkYiwgJGFjYyIsCisgICAgICAgICAgICAgIFsoc2V0IHJHUFI6JGRzdCwgKGFkZCByR1BSOiRhY2MsIChzcmEgKG9wbm9kZSByR1BSOiRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V4dF9pbnJlZyByR1BSOiRiLCBpMTYpKSwgKGkzMiAxNikpKSldPiB7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMTsKKyAgICBsZXQgSW5zdHsyNi0yM30gPSAwYjAxMTA7CisgICAgbGV0IEluc3R7MjItMjB9ID0gMGIwMTE7CisgICAgbGV0IEluc3R7MTUtMTJ9ID0gez8sID8sID8sID99OyAvLyBSYQorICAgIGxldCBJbnN0ezctNn0gPSAwYjAwOworICAgIGxldCBJbnN0ezUtNH0gPSAwYjAwOworICB9CisKKyAgZGVmIFdUIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokYSwgckdQUjokYiwgckdQUjokYWNjKSwgSUlDX2lNQUMxNiwKKyAgICAgICAgICAgICAgIXN0cmNvbmNhdChvcGMsICJ3dCIpLCAiXHQkZHN0LCAkYSwgJGIsICRhY2MiLAorICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChhZGQgckdQUjokYWNjLCAoc3JhIChvcG5vZGUgckdQUjokYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JhIHJHUFI6JGIsIChpMzIgMTYpKSksIChpMzIgMTYpKSkpXT4geworICAgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTE7CisgICAgbGV0IEluc3R7MjYtMjN9ID0gMGIwMTEwOworICAgIGxldCBJbnN0ezIyLTIwfSA9IDBiMDExOworICAgIGxldCBJbnN0ezE1LTEyfSA9IHs/LCA/LCA/LCA/fTsgLy8gUmEKKyAgICBsZXQgSW5zdHs3LTZ9ID0gMGIwMDsKKyAgICBsZXQgSW5zdHs1LTR9ID0gMGIwMTsKKyAgfQorfQorCitkZWZtIHQyU01VTCA6IFQySV9zbXVsPCJzbXVsIiwgQmluT3BGcmFnPChtdWwgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47CitkZWZtIHQyU01MQSA6IFQySV9zbWxhPCJzbWxhIiwgQmluT3BGcmFnPChtdWwgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47CisKKy8vIEhhbGZ3b3JkIG11bHRpcGxlIGFjY3VtdWxhdGUgbG9uZzogU01MQUw8eD48eT4gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkKK2RlZiB0MlNNTEFMQkIgOiBUMklfbWFjPDEsIDBiMTAwLCAwYjEwMDAsIChvdXRzIHJHUFI6JGxkc3QsckdQUjokaGRzdCksCisgICAgICAgICAgIChpbnMgckdQUjokYSxyR1BSOiRiKSwgSUlDX2lNQUM2NCwgInNtbGFsYmIiLCAiXHQkbGRzdCwgJGhkc3QsICRhLCAkYiIsCisgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT47CitkZWYgdDJTTUxBTEJUIDogVDJJX21hYzwxLCAwYjEwMCwgMGIxMDAxLCAob3V0cyByR1BSOiRsZHN0LHJHUFI6JGhkc3QpLAorICAgICAgICAgICAoaW5zIHJHUFI6JGEsckdQUjokYiksIElJQ19pTUFDNjQsICJzbWxhbGJ0IiwgIlx0JGxkc3QsICRoZHN0LCAkYSwgJGIiLAorICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+OworZGVmIHQyU01MQUxUQiA6IFQySV9tYWM8MSwgMGIxMDAsIDBiMTAxMCwgKG91dHMgckdQUjokbGRzdCxyR1BSOiRoZHN0KSwKKyAgICAgICAgICAgKGlucyByR1BSOiRhLHJHUFI6JGIpLCBJSUNfaU1BQzY0LCAic21sYWx0YiIsICJcdCRsZHN0LCAkaGRzdCwgJGEsICRiIiwKKyAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsKK2RlZiB0MlNNTEFMVFQgOiBUMklfbWFjPDEsIDBiMTAwLCAwYjEwMTEsIChvdXRzIHJHUFI6JGxkc3QsckdQUjokaGRzdCksCisgICAgICAgICAgIChpbnMgckdQUjokYSxyR1BSOiRiKSwgSUlDX2lNQUM2NCwgInNtbGFsdHQiLCAiXHQkbGRzdCwgJGhkc3QsICRhLCAkYiIsCisgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT47CisKKy8vIER1YWwgaGFsZndvcmQgbXVsdGlwbGU6IFNNVUFELCBTTVVTRCwgU01MQUQsIFNNTFNELCBTTUxBTEQsIFNNTFNMRAorLy8gVGhlc2UgYXJlIGZvciBkaXNhc3NlbWJseSBvbmx5LgorCitkZWYgdDJTTVVBRCAgIDogVDJJX21hYzwwLCAwYjAxMCwgMGIwMDAwLCAob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSUlDX2lNQUMzMiwgInNtdWFkIiwgIlx0JGRzdCwgJGEsICRiIiwgW10+IHsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOworfQorZGVmIHQyU01VQURYICA6IFQySV9tYWM8MCwgMGIwMTAsIDBiMDAwMSwgKG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElJQ19pTUFDMzIsICJzbXVhZHgiLCAiXHQkZHN0LCAkYSwgJGIiLCBbXT4geworICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7Cit9CitkZWYgdDJTTVVTRCAgIDogVDJJX21hYzwwLCAwYjEwMCwgMGIwMDAwLCAob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGEsIHJHUFI6JGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSUlDX2lNQUMzMiwgInNtdXNkIiwgIlx0JGRzdCwgJGEsICRiIiwgW10+IHsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOworfQorZGVmIHQyU01VU0RYICA6IFQySV9tYWM8MCwgMGIxMDAsIDBiMDAwMSwgKG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRhLCByR1BSOiRiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElJQ19pTUFDMzIsICJzbXVzZHgiLCAiXHQkZHN0LCAkYSwgJGIiLCBbXT4geworICBsZXQgSW5zdHsxNS0xMn0gPSAwYjExMTE7Cit9CitkZWYgdDJTTUxBRCAgIDogVDJJX21hYzwwLCAwYjAxMCwgMGIwMDAwLCAob3V0cyByR1BSOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyByR1BSOiRhLCByR1BSOiRiLCByR1BSOiRhY2MpLCBJSUNfaU1BQzMyLCAic21sYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlx0JGRzdCwgJGEsICRiLCAkYWNjIiwgW10+OworZGVmIHQyU01MQURYICA6IFQySV9tYWM8MCwgMGIwMTAsIDBiMDAwMSwgKG91dHMgckdQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgckdQUjokYSwgckdQUjokYiwgckdQUjokYWNjKSwgSUlDX2lNQUMzMiwgInNtbGFkeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiXHQkZHN0LCAkYSwgJGIsICRhY2MiLCBbXT47CitkZWYgdDJTTUxTRCAgIDogVDJJX21hYzwwLCAwYjEwMCwgMGIwMDAwLCAob3V0cyByR1BSOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyByR1BSOiRhLCByR1BSOiRiLCByR1BSOiRhY2MpLCBJSUNfaU1BQzMyLCAic21sc2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlx0JGRzdCwgJGEsICRiLCAkYWNjIiwgW10+OworZGVmIHQyU01MU0RYICA6IFQySV9tYWM8MCwgMGIxMDAsIDBiMDAwMSwgKG91dHMgckdQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgckdQUjokYSwgckdQUjokYiwgckdQUjokYWNjKSwgSUlDX2lNQUMzMiwgInNtbHNkeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiXHQkZHN0LCAkYSwgJGIsICRhY2MiLCBbXT47CitkZWYgdDJTTUxBTEQgIDogVDJJX21hYzwxLCAwYjEwMCwgMGIxMTAwLCAob3V0cyByR1BSOiRsZHN0LHJHUFI6JGhkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyByR1BSOiRhLHJHUFI6JGIpLCBJSUNfaU1BQzY0LCAic21sYWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJcdCRsZHN0LCAkaGRzdCwgJGEsICRiIiwgW10+OworZGVmIHQyU01MQUxEWCA6IFQySV9tYWM8MSwgMGIxMDAsIDBiMTEwMSwgKG91dHMgckdQUjokbGRzdCxyR1BSOiRoZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgckdQUjokYSxyR1BSOiRiKSwgSUlDX2lNQUM2NCwgInNtbGFsZHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlx0JGxkc3QsICRoZHN0LCAkYSwgJGIiLCBbXT47CitkZWYgdDJTTUxTTEQgIDogVDJJX21hYzwxLCAwYjEwMSwgMGIxMTAwLCAob3V0cyByR1BSOiRsZHN0LHJHUFI6JGhkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyByR1BSOiRhLHJHUFI6JGIpLCBJSUNfaU1BQzY0LCAic21sc2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJcdCRsZHN0LCAkaGRzdCwgJGEsICRiIiwgW10+OworZGVmIHQyU01MU0xEWCA6IFQySV9tYWM8MSwgMGIxMDEsIDBiMTEwMSwgKG91dHMgckdQUjokbGRzdCxyR1BSOiRoZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgckdQUjokYSxyR1BSOiRiKSwgSUlDX2lNQUM2NCwgInNtbHNsZHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlx0JGxkc3QsICRoZHN0LCAkYSwgJGIiLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTWlzYy4gQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMuCisvLworCitjbGFzcyBUMklfbWlzYzxiaXRzPDI+IG9wMSwgYml0czwyPiBvcDIsIGRhZyBvb3BzLCBkYWcgaW9wcywKKyAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFQySTxvb3BzLCBpb3BzLCBpdGluLCBvcGMsIGFzbSwgcGF0dGVybj4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTExOworICBsZXQgSW5zdHsyNi0yMn0gPSAwYjAxMDEwOworICBsZXQgSW5zdHsyMS0yMH0gPSBvcDE7CisgIGxldCBJbnN0ezE1LTEyfSA9IDBiMTExMTsKKyAgbGV0IEluc3R7Ny02fSA9IDBiMTA7CisgIGxldCBJbnN0ezUtNH0gPSBvcDI7Cit9CisKK2RlZiB0MkNMWiA6IFQySV9taXNjPDBiMTEsIDBiMDAsIChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjKSwgSUlDX2lVTkFyLAorICAgICAgICAgICAgICAgICAgICAiY2x6IiwgIlx0JGRzdCwgJHNyYyIsIFsoc2V0IHJHUFI6JGRzdCwgKGN0bHogckdQUjokc3JjKSldPjsKKworZGVmIHQyUkJJVCA6IFQySV9taXNjPDBiMDEsIDBiMTAsIChvdXRzIHJHUFI6JGRzdCksIChpbnMgckdQUjokc3JjKSwgSUlDX2lVTkFyLAorICAgICAgICAgICAgICAgICAgICAgICJyYml0IiwgIlx0JGRzdCwgJHNyYyIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAoQVJNcmJpdCByR1BSOiRzcmMpKV0+OworCitkZWYgdDJSRVYgOiBUMklfbWlzYzwwYjAxLCAwYjAwLCAob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JHNyYyksIElJQ19pVU5BciwKKyAgICAgICAgICAgICAgICAgICAicmV2IiwgIi53XHQkZHN0LCAkc3JjIiwgWyhzZXQgckdQUjokZHN0LCAoYnN3YXAgckdQUjokc3JjKSldPjsKKworZGVmIHQyUkVWMTYgOiBUMklfbWlzYzwwYjAxLCAwYjAxLCAob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JHNyYyksIElJQ19pVU5BciwKKyAgICAgICAgICAgICAgICAgICAgICAgInJldjE2IiwgIi53XHQkZHN0LCAkc3JjIiwKKyAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsCisgICAgICAgICAgICAgICAgICAgIChvciAoYW5kIChzcmwgckdQUjokc3JjLCAoaTMyIDgpKSwgMHhGRiksCisgICAgICAgICAgICAgICAgICAgICAgICAob3IgKGFuZCAoc2hsIHJHUFI6JHNyYywgKGkzMiA4KSksIDB4RkYwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhbmQgKHNybCByR1BSOiRzcmMsIChpMzIgOCkpLCAweEZGMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKHNobCByR1BSOiRzcmMsIChpMzIgOCkpLCAweEZGMDAwMDAwKSkpKSldPjsKKworZGVmIHQyUkVWU0ggOiBUMklfbWlzYzwwYjAxLCAwYjExLCAob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JHNyYyksIElJQ19pVU5BciwKKyAgICAgICAgICAgICAgICAgICAgICAgInJldnNoIiwgIi53XHQkZHN0LCAkc3JjIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LAorICAgICAgICAgICAgICAgICAgICAoc2V4dF9pbnJlZworICAgICAgICAgICAgICAgICAgICAgIChvciAoc3JsIChhbmQgckdQUjokc3JjLCAweEZGMDApLCAoaTMyIDgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHNobCByR1BSOiRzcmMsIChpMzIgOCkpKSwgaTE2KSldPjsKKworZGVmIHQyUEtIQlQgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRzcmMxLCByR1BSOiRzcmMyLCBpMzJpbW06JHNoYW10KSwKKyAgICAgICAgICAgICAgICAgIElJQ19pQUxVc2ksICJwa2hidCIsICJcdCRkc3QsICRzcmMxLCAkc3JjMiwgbHNsICRzaGFtdCIsCisgICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvciAoYW5kIHJHUFI6JHNyYzEsIDB4RkZGRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKHNobCByR1BSOiRzcmMyLCAoaTMyIGltbTokc2hhbXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwKSkpXT4sCisgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSGFzVDJFeHRyYWN0UGFja10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgbGV0IEluc3R7MjYtMjV9ID0gMGIwMTsKKyAgbGV0IEluc3R7MjQtMjB9ID0gMGIwMTEwMDsKKyAgbGV0IEluc3R7NX0gPSAwOyAvLyBCVCBmb3JtCisgIGxldCBJbnN0ezR9ID0gMDsKK30KKworLy8gQWx0ZXJuYXRlIGNhc2VzIGZvciBQS0hCVCB3aGVyZSBpZGVudGl0aWVzIGVsaW1pbmF0ZSBzb21lIG5vZGVzLgorZGVmIDogVDJQYXQ8KG9yIChhbmQgckdQUjokc3JjMSwgMHhGRkZGKSwgKGFuZCByR1BSOiRzcmMyLCAweEZGRkYwMDAwKSksCisgICAgICAgICAgICAodDJQS0hCVCByR1BSOiRzcmMxLCByR1BSOiRzcmMyLCAwKT4sCisgICAgICAgICAgICBSZXF1aXJlczxbSGFzVDJFeHRyYWN0UGFja10+OworZGVmIDogVDJQYXQ8KG9yIChhbmQgckdQUjokc3JjMSwgMHhGRkZGKSwgKHNobCByR1BSOiRzcmMyLCBpbW0xNl8zMTokc2hhbXQpKSwKKyAgICAgICAgICAgICh0MlBLSEJUIHJHUFI6JHNyYzEsIHJHUFI6JHNyYzIsIGltbTE2XzMxOiRzaGFtdCk+LAorICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1QyRXh0cmFjdFBhY2tdPjsKKworZGVmIHQyUEtIVEIgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRzcmMxLCByR1BSOiRzcmMyLCBpMzJpbW06JHNoYW10KSwKKyAgICAgICAgICAgICAgICAgIElJQ19pQUxVc2ksICJwa2h0YiIsICJcdCRkc3QsICRzcmMxLCAkc3JjMiwgYXNyICRzaGFtdCIsCisgICAgICAgICAgICAgICAgICBbKHNldCByR1BSOiRkc3QsIChvciAoYW5kIHJHUFI6JHNyYzEsIDB4RkZGRjAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIChzcmEgckdQUjokc3JjMiwgaW1tMTZfMzE6JHNoYW10KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYpKSldPiwKKyAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNUMkV4dHJhY3RQYWNrXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAxOworICBsZXQgSW5zdHsyNC0yMH0gPSAwYjAxMTAwOworICBsZXQgSW5zdHs1fSA9IDE7IC8vIFRCIGZvcm0KKyAgbGV0IEluc3R7NH0gPSAwOworfQorCisvLyBBbHRlcm5hdGUgY2FzZXMgZm9yIFBLSFRCIHdoZXJlIGlkZW50aXRpZXMgZWxpbWluYXRlIHNvbWUgbm9kZXMuICBOb3RlIHRoYXQKKy8vIGEgc2hpZnQgYW1vdW50IG9mIDAgaXMgKm5vdCBsZWdhbCogaGVyZSwgaXQgaXMgUEtIQlQgaW5zdGVhZC4KK2RlZiA6IFQyUGF0PChvciAoYW5kIHJHUFI6JHNyYzEsIDB4RkZGRjAwMDApLCAoc3JsIHJHUFI6JHNyYzIsIChpMzIgMTYpKSksCisgICAgICAgICAgICAodDJQS0hUQiByR1BSOiRzcmMxLCByR1BSOiRzcmMyLCAxNik+LAorICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1QyRXh0cmFjdFBhY2tdPjsKK2RlZiA6IFQyUGF0PChvciAoYW5kIHJHUFI6JHNyYzEsIDB4RkZGRjAwMDApLAorICAgICAgICAgICAgICAgICAgICAgKGFuZCAoc3JsIHJHUFI6JHNyYzIsIGltbTFfMTU6JHNoYW10KSwgMHhGRkZGKSksCisgICAgICAgICAgICAodDJQS0hUQiByR1BSOiRzcmMxLCByR1BSOiRzcmMyLCBpbW0xXzE1OiRzaGFtdCk+LAorICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1QyRXh0cmFjdFBhY2tdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBDb21wYXJpc29uIEluc3RydWN0aW9ucy4uLgorLy8KK2xldCBpc0NvbXBhcmUgPSAxIGluIHsKK2RlZm0gdDJDTVAgIDogVDJJX2NtcF9pcnM8MGIxMTAxLCAiY21wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChBUk1jbXAgbm9kZTokTEhTLCBub2RlOiRSSFMpPj47CitkZWZtIHQyQ01QeiA6IFQySV9jbXBfaXJzPDBiMTEwMSwgImNtcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoQVJNY21wWiBub2RlOiRMSFMsIG5vZGU6JFJIUyk+PjsKK30KKworLy9GSVhNRTogRGlzYWJsZSBDTU4sIGFzIENDb2RlcyBhcmUgYmFja3dhcmRzIGZyb20gY29tcGFyZSBleHBlY3RhdGlvbnMKKy8vICAgICAgIENvbXBhcmUtdG8temVybyBzdGlsbCB3b3JrcyBvdXQsIGp1c3Qgbm90IHRoZSByZWxhdGlvbmFscworLy9kZWZtIHQyQ01OICA6IFQySV9jbXBfaXJzPDBiMTAwMCwgImNtbiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChBUk1jbXAgbm9kZTokTEhTLChpbmVnIG5vZGU6JFJIUykpPj47CitkZWZtIHQyQ01OeiA6IFQySV9jbXBfaXJzPDBiMTAwMCwgImNtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoQVJNY21wWiBub2RlOiRMSFMsKGluZWcgbm9kZTokUkhTKSk+PjsKKworLy9kZWYgOiBUMlBhdDwoQVJNY21wICBHUFI6JHNyYywgdDJfc29faW1tX25lZzokaW1tKSwKKy8vICAgICAgICAgICAgKHQyQ01OcmkgR1BSOiRzcmMsIHQyX3NvX2ltbV9uZWc6JGltbSk+OworCitkZWYgOiBUMlBhdDwoQVJNY21wWiAgR1BSOiRzcmMsIHQyX3NvX2ltbV9uZWc6JGltbSksCisgICAgICAgICAgICAodDJDTU56cmkgR1BSOiRzcmMsIHQyX3NvX2ltbV9uZWc6JGltbSk+OworCitkZWZtIHQyVFNUICA6IFQySV9jbXBfaXJzPDBiMDAwMCwgInRzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbk9wRnJhZzwoQVJNY21wWiAoYW5kIG5vZGU6JExIUywgbm9kZTokUkhTKSwgMCk+PjsKK2RlZm0gdDJURVEgIDogVDJJX2NtcF9pcnM8MGIwMTAwLCAidGVxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmluT3BGcmFnPChBUk1jbXBaICh4b3Igbm9kZTokTEhTLCBub2RlOiRSSFMpLCAwKT4+OworCisvLyBDb25kaXRpb25hbCBtb3ZlcworLy8gRklYTUU6IHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlIGEgcGF0dGVybiBmb3IgQVJNY21vdiwgYnV0IGNhbid0IHVzZQorLy8gYSB0d28tdmFsdWUgb3BlcmFuZCB3aGVyZSBhIGRhZyBub2RlIGV4cGVjdHMgdHdvIG9wZXJhbmRzLiA6KAorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsKK2RlZiB0Mk1PVkNDciA6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zIHJHUFI6JGZhbHNlLCByR1BSOiR0cnVlKSwgSUlDX2lDTU9WciwKKyAgICAgICAgICAgICAgICAgICAibW92IiwgIi53XHQkZHN0LCAkdHJ1ZSIsCisgICBbLyooc2V0IHJHUFI6JGRzdCwgKEFSTWNtb3YgckdQUjokZmFsc2UsIHJHUFI6JHRydWUsIGltbTokY2MsIENDUjokY2NyKSkqL10+LAorICAgICAgICAgICAgICAgIFJlZ0NvbnN0cmFpbnQ8IiRmYWxzZSA9ICRkc3QiPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgIGxldCBJbnN0ezI0LTIxfSA9IDBiMDAxMDsKKyAgbGV0IEluc3R7MjB9ID0gMDsgLy8gVGhlIFMgYml0LgorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7IC8vIFJuCisgIGxldCBJbnN0ezE0LTEyfSA9IDBiMDAwOworICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAwOworfQorCitkZWYgdDJNT1ZDQ2kgOiBUMkk8KG91dHMgckdQUjokZHN0KSwgKGlucyByR1BSOiRmYWxzZSwgdDJfc29faW1tOiR0cnVlKSwKKyAgICAgICAgICAgICAgICAgICBJSUNfaUNNT1ZpLCAibW92IiwgIi53XHQkZHN0LCAkdHJ1ZSIsCitbLyooc2V0IHJHUFI6JGRzdCwoQVJNY21vdiByR1BSOiRmYWxzZSx0Ml9zb19pbW06JHRydWUsIGltbTokY2MsIENDUjokY2NyKSkqL10+LAorICAgICAgICAgICAgICAgICAgIFJlZ0NvbnN0cmFpbnQ8IiRmYWxzZSA9ICRkc3QiPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI1fSA9IDA7CisgIGxldCBJbnN0ezI0LTIxfSA9IDBiMDAxMDsKKyAgbGV0IEluc3R7MjB9ID0gMDsgLy8gVGhlIFMgYml0LgorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7IC8vIFJuCisgIGxldCBJbnN0ezE1fSA9IDA7Cit9CisKK2NsYXNzIFQySV9tb3ZjY19zaDxiaXRzPDI+IG9wY29kLCBkYWcgb29wcywgZGFnIGlvcHMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9wYywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogVDJJPG9vcHMsIGlvcHMsIGl0aW4sIG9wYywgYXNtLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTI1fSA9IDBiMDE7CisgIGxldCBJbnN0ezI0LTIxfSA9IDBiMDAxMDsKKyAgbGV0IEluc3R7MjB9ID0gMDsgLy8gVGhlIFMgYml0LgorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjExMTE7IC8vIFJuCisgIGxldCBJbnN0ezUtNH0gPSBvcGNvZDsgLy8gU2hpZnQgdHlwZS4KK30KK2RlZiB0Mk1PVkNDbHNsIDogVDJJX21vdmNjX3NoPDBiMDAsIChvdXRzIHJHUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgckdQUjokZmFsc2UsIHJHUFI6JHRydWUsIGkzMmltbTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX2lDTU9Wc2ksICJsc2wiLCAiLndcdCRkc3QsICR0cnVlLCAkcmhzIiwgW10+LAorICAgICAgICAgICAgICAgICBSZWdDb25zdHJhaW50PCIkZmFsc2UgPSAkZHN0Ij47CitkZWYgdDJNT1ZDQ2xzciA6IFQySV9tb3ZjY19zaDwwYjAxLCAob3V0cyByR1BSOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIHJHUFI6JGZhbHNlLCByR1BSOiR0cnVlLCBpMzJpbW06JHJocyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJQ19pQ01PVnNpLCAibHNyIiwgIi53XHQkZHN0LCAkdHJ1ZSwgJHJocyIsIFtdPiwKKyAgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJGZhbHNlID0gJGRzdCI+OworZGVmIHQyTU9WQ0Nhc3IgOiBUMklfbW92Y2Nfc2g8MGIxMCwgKG91dHMgckdQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyByR1BSOiRmYWxzZSwgckdQUjokdHJ1ZSwgaTMyaW1tOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSUNfaUNNT1ZzaSwgImFzciIsICIud1x0JGRzdCwgJHRydWUsICRyaHMiLCBbXT4sCisgICAgICAgICAgICAgICAgIFJlZ0NvbnN0cmFpbnQ8IiRmYWxzZSA9ICRkc3QiPjsKK2RlZiB0Mk1PVkNDcm9yIDogVDJJX21vdmNjX3NoPDBiMTEsIChvdXRzIHJHUFI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgckdQUjokZmFsc2UsIHJHUFI6JHRydWUsIGkzMmltbTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlDX2lDTU9Wc2ksICJyb3IiLCAiLndcdCRkc3QsICR0cnVlLCAkcmhzIiwgW10+LAorICAgICAgICAgICAgICAgICBSZWdDb25zdHJhaW50PCIkZmFsc2UgPSAkZHN0Ij47Cit9IC8vIG5ldmVySGFzU2lkZUVmZmVjdHMKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEF0b21pYyBvcGVyYXRpb25zIGludHJpbnNpY3MKKy8vCisKKy8vIG1lbW9yeSBiYXJyaWVycyBwcm90ZWN0IHRoZSBhdG9taWMgc2VxdWVuY2VzCitsZXQgaGFzU2lkZUVmZmVjdHMgPSAxIGluIHsKK2RlZiB0MkludF9NZW1CYXJyaWVyVjcgOiBBSW5vUDwob3V0cyksIChpbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgVGh1bWJGcm0sIE5vSXRpbmVyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgImRtYiIsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhBUk1NZW1CYXJyaWVyVjcpXT4sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjJdPiB7CisgIGxldCBJbnN0ezMxLTR9ID0gMHhGM0JGOEY1OworICAvLyBGSVhNRTogYWRkIHN1cHBvcnQgZm9yIG9wdGlvbnMgb3RoZXIgdGhhbiBhIGZ1bGwgc3lzdGVtIERNQgorICBsZXQgSW5zdHszLTB9ID0gMGIxMTExOworfQorCitkZWYgdDJJbnRfU3luY0JhcnJpZXJWNyA6IEFJbm9QPChvdXRzKSwgKGlucyksCisgICAgICAgICAgICAgICAgICAgICAgICBUaHVtYkZybSwgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAiZHNiIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBbKEFSTVN5bmNCYXJyaWVyVjcpXT4sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjJdPiB7CisgIGxldCBJbnN0ezMxLTR9ID0gMHhGM0JGOEY0OworICAvLyBGSVhNRTogYWRkIHN1cHBvcnQgZm9yIG9wdGlvbnMgb3RoZXIgdGhhbiBhIGZ1bGwgc3lzdGVtIERTQgorICBsZXQgSW5zdHszLTB9ID0gMGIxMTExOworfQorfQorCisvLyBIZWxwZXIgY2xhc3MgZm9yIG11bHRpY2xhc3MgVDJNZW1CIC0tIGZvciBkaXNhc3NlbWJseSBvbmx5CitjbGFzcyBUMklfbWVtYjxzdHJpbmcgb3BjLCBzdHJpbmcgYXNtPgorICA6IFQySTwob3V0cyksIChpbnMpLCBOb0l0aW5lcmFyeSwgb3BjLCBhc20sCisgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4sCisgICAgUmVxdWlyZXM8W0lzVGh1bWIyLCBIYXNWN10+IHsKKyAgbGV0IEluc3R7MzEtMjB9ID0gMHhmM2I7CisgIGxldCBJbnN0ezE1LTE0fSA9IDBiMTA7CisgIGxldCBJbnN0ezEyfSA9IDA7Cit9CisKK211bHRpY2xhc3MgVDJNZW1CPGJpdHM8ND4gb3A3XzQsIHN0cmluZyBvcGM+IHsKKworICBkZWYgc3QgOiBUMklfbWVtYjxvcGMsICJcdHN0Ij4geworICAgIGxldCBJbnN0ezctNH0gPSBvcDdfNDsKKyAgICBsZXQgSW5zdHszLTB9ID0gMGIxMTEwOworICB9CisKKyAgZGVmIGlzaCA6IFQySV9tZW1iPG9wYywgIlx0aXNoIj4geworICAgIGxldCBJbnN0ezctNH0gPSBvcDdfNDsKKyAgICBsZXQgSW5zdHszLTB9ID0gMGIxMDExOworICB9CisKKyAgZGVmIGlzaHN0IDogVDJJX21lbWI8b3BjLCAiXHRpc2hzdCI+IHsKKyAgICBsZXQgSW5zdHs3LTR9ID0gb3A3XzQ7CisgICAgbGV0IEluc3R7My0wfSA9IDBiMTAxMDsKKyAgfQorCisgIGRlZiBuc2ggOiBUMklfbWVtYjxvcGMsICJcdG5zaCI+IHsKKyAgICBsZXQgSW5zdHs3LTR9ID0gb3A3XzQ7CisgICAgbGV0IEluc3R7My0wfSA9IDBiMDExMTsKKyAgfQorCisgIGRlZiBuc2hzdCA6IFQySV9tZW1iPG9wYywgIlx0bnNoc3QiPiB7CisgICAgbGV0IEluc3R7Ny00fSA9IG9wN180OworICAgIGxldCBJbnN0ezMtMH0gPSAwYjAxMTA7CisgIH0KKworICBkZWYgb3NoIDogVDJJX21lbWI8b3BjLCAiXHRvc2giPiB7CisgICAgbGV0IEluc3R7Ny00fSA9IG9wN180OworICAgIGxldCBJbnN0ezMtMH0gPSAwYjAwMTE7CisgIH0KKworICBkZWYgb3Noc3QgOiBUMklfbWVtYjxvcGMsICJcdG9zaHN0Ij4geworICAgIGxldCBJbnN0ezctNH0gPSBvcDdfNDsKKyAgICBsZXQgSW5zdHszLTB9ID0gMGIwMDEwOworICB9Cit9CisKKy8vIFRoZXNlIERNQiB2YXJpYW50cyBhcmUgZm9yIGRpc2Fzc2VtYmx5IG9ubHkuCitkZWZtIHQyRE1CIDogVDJNZW1CPDBiMDEwMSwgImRtYiI+OworCisvLyBUaGVzZSBEU0IgdmFyaWFudHMgYXJlIGZvciBkaXNhc3NlbWJseSBvbmx5LgorZGVmbSB0MkRTQiA6IFQyTWVtQjwwYjAxMDAsICJkc2IiPjsKKworLy8gSVNCIGhhcyBvbmx5IGZ1bGwgc3lzdGVtIG9wdGlvbiAtLSBmb3IgZGlzYXNzZW1ibHkgb25seQorZGVmIHQySVNCc3kgOiBUMklfbWVtYjwiaXNiIiwgIiI+IHsKKyAgbGV0IEluc3R7Ny00fSA9IDBiMDExMDsKKyAgbGV0IEluc3R7My0wfSA9IDBiMTExMTsKK30KKworY2xhc3MgVDJJX2xkcmV4PGJpdHM8Mj4gb3Bjb2QsIGRhZyBvb3BzLCBkYWcgaW9wcywgQWRkck1vZGUgYW0sIFNpemVGbGFnVmFsIHN6LAorICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIHN0cmluZyBvcGMsIHN0cmluZyBhc20sIHN0cmluZyBjc3RyLAorICAgICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuLCBiaXRzPDQ+IHJ0MiA9IDBiMTExMT4KKyAgOiBUaHVtYjJJPG9vcHMsIGlvcHMsIGFtLCBzeiwgaXRpbiwgb3BjLCBhc20sIGNzdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgbGV0IEluc3R7MjYtMjB9ID0gMGIwMDAxMTAxOworICBsZXQgSW5zdHsxMS04fSA9IHJ0MjsKKyAgbGV0IEluc3R7Ny02fSA9IDBiMDE7CisgIGxldCBJbnN0ezUtNH0gPSBvcGNvZDsKKyAgbGV0IEluc3R7My0wfSA9IDBiMTExMTsKK30KK2NsYXNzIFQySV9zdHJleDxiaXRzPDI+IG9wY29kLCBkYWcgb29wcywgZGFnIGlvcHMsIEFkZHJNb2RlIGFtLCBTaXplRmxhZ1ZhbCBzeiwKKyAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBzdHJpbmcgb3BjLCBzdHJpbmcgYXNtLCBzdHJpbmcgY3N0ciwKKyAgICAgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybiwgYml0czw0PiBydDIgPSAwYjExMTE+CisgIDogVGh1bWIySTxvb3BzLCBpb3BzLCBhbSwgc3osIGl0aW4sIG9wYywgYXNtLCBjc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTIwfSA9IDBiMDAwMTEwMDsKKyAgbGV0IEluc3R7MTEtOH0gPSBydDI7CisgIGxldCBJbnN0ezctNn0gPSAwYjAxOworICBsZXQgSW5zdHs1LTR9ID0gb3Bjb2Q7Cit9CisKK2xldCBtYXlMb2FkID0gMSBpbiB7CitkZWYgdDJMRFJFWEIgOiBUMklfbGRyZXg8MGIwMCwgKG91dHMgckdQUjokZGVzdCksIChpbnMgckdQUjokcHRyKSwgQWRkck1vZGVOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNpemU0Qnl0ZXMsIE5vSXRpbmVyYXJ5LCAibGRyZXhiIiwgIlx0JGRlc3QsIFskcHRyXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIFtdPjsKK2RlZiB0MkxEUkVYSCA6IFQySV9sZHJleDwwYjAxLCAob3V0cyByR1BSOiRkZXN0KSwgKGlucyByR1BSOiRwdHIpLCBBZGRyTW9kZU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZTRCeXRlcywgTm9JdGluZXJhcnksICJsZHJleGgiLCAiXHQkZGVzdCwgWyRwdHJdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgW10+OworZGVmIHQyTERSRVggIDogVGh1bWIySTwob3V0cyByR1BSOiRkZXN0KSwgKGlucyByR1BSOiRwdHIpLCBBZGRyTW9kZU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIFNpemU0Qnl0ZXMsIE5vSXRpbmVyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAibGRyZXgiLCAiXHQkZGVzdCwgWyRwdHJdIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgW10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgbGV0IEluc3R7MjYtMjB9ID0gMGIwMDAwMTAxOworICBsZXQgSW5zdHsxMS04fSA9IDBiMTExMTsKKyAgbGV0IEluc3R7Ny0wfSA9IDBiMDAwMDAwMDA7IC8vIGltbTggPSAwCit9CitkZWYgdDJMRFJFWEQgOiBUMklfbGRyZXg8MGIxMSwgKG91dHMgckdQUjokZGVzdCwgckdQUjokZGVzdDIpLCAoaW5zIHJHUFI6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVOb25lLCBTaXplNEJ5dGVzLCBOb0l0aW5lcmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibGRyZXhkIiwgIlx0JGRlc3QsICRkZXN0MiwgWyRwdHJdIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgW10sIHs/LCA/LCA/LCA/fT47Cit9CisKK2xldCBtYXlTdG9yZSA9IDEsIENvbnN0cmFpbnRzID0gIkBlYXJseWNsb2JiZXIgJHN1Y2Nlc3MiIGluIHsKK2RlZiB0MlNUUkVYQiA6IFQySV9zdHJleDwwYjAwLCAob3V0cyByR1BSOiRzdWNjZXNzKSwgKGlucyByR1BSOiRzcmMsIHJHUFI6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVOb25lLCBTaXplNEJ5dGVzLCBOb0l0aW5lcmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZXhiIiwgIlx0JHN1Y2Nlc3MsICRzcmMsIFskcHRyXSIsICIiLCBbXT47CitkZWYgdDJTVFJFWEggOiBUMklfc3RyZXg8MGIwMSwgKG91dHMgckdQUjokc3VjY2VzcyksIChpbnMgckdQUjokc3JjLCByR1BSOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmV4aCIsICJcdCRzdWNjZXNzLCAkc3JjLCBbJHB0cl0iLCAiIiwgW10+OworZGVmIHQyU1RSRVggIDogVGh1bWIySTwob3V0cyByR1BSOiRzdWNjZXNzKSwgKGlucyByR1BSOiRzcmMsIHJHUFI6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICJzdHJleCIsICJcdCRzdWNjZXNzLCAkc3JjLCBbJHB0cl0iLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yMH0gPSAwYjAwMDAxMDA7CisgIGxldCBJbnN0ezctMH0gPSAwYjAwMDAwMDAwOyAvLyBpbW04ID0gMAorfQorZGVmIHQyU1RSRVhEIDogVDJJX3N0cmV4PDBiMTEsIChvdXRzIHJHUFI6JHN1Y2Nlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgckdQUjokc3JjLCByR1BSOiRzcmMyLCByR1BSOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlTm9uZSwgU2l6ZTRCeXRlcywgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmV4ZCIsICJcdCRzdWNjZXNzLCAkc3JjLCAkc3JjMiwgWyRwdHJdIiwgIiIsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHs/LCA/LCA/LCA/fT47Cit9CisKKy8vIENsZWFyLUV4Y2x1c2l2ZSBpcyBmb3IgZGlzYXNzZW1ibHkgb25seS4KK2RlZiB0MkNMUkVYIDogVDJJPChvdXRzKSwgKGlucyksIE5vSXRpbmVyYXJ5LCAiY2xyZXgiLCAiIiwKKyAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4sCisgICAgICAgICAgICBSZXF1aXJlczxbSXNBUk0sIEhhc1Y3XT4gIHsKKyAgbGV0IEluc3R7MzEtMjB9ID0gMHhmM2I7CisgIGxldCBJbnN0ezE1LTE0fSA9IDBiMTA7CisgIGxldCBJbnN0ezEyfSA9IDA7CisgIGxldCBJbnN0ezctNH0gPSAwYjAwMTA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUTFMgSW5zdHJ1Y3Rpb25zCisvLworCisvLyBfX2FlYWJpX3JlYWRfdHAgcHJlc2VydmVzIHRoZSByZWdpc3RlcnMgcjEtcjMuCitsZXQgaXNDYWxsID0gMSwKKyAgRGVmcyA9IFtSMCwgUjEyLCBMUiwgQ1BTUl0gaW4geworICBkZWYgdDJUUHNvZnQgOiBUMlhJPChvdXRzKSwgKGlucyksIElJQ19CciwKKyAgICAgICAgICAgICAgICAgICAgICJibFx0X19hZWFiaV9yZWFkX3RwIiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIwLCBBUk10aHJlYWRfcG9pbnRlcildPiB7CisgICAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgICBsZXQgSW5zdHsxNS0xNH0gPSAwYjExOworICAgIGxldCBJbnN0ezEyfSA9IDE7CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNKTEogRXhjZXB0aW9uIGhhbmRsaW5nIGludHJpbnNpY3MKKy8vICAgZWhfc2psal9zZXRqbXAoKSBpcyBhbiBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB0byBzdG9yZSB0aGUgcmV0dXJuCisvLyAgIGFkZHJlc3MgYW5kIHNhdmUgIzAgaW4gUjAgZm9yIHRoZSBub24tbG9uZ2ptcCBjYXNlLgorLy8gICBTaW5jZSBieSBpdHMgbmF0dXJlIHdlIG1heSBiZSBjb21pbmcgZnJvbSBzb21lIG90aGVyIGZ1bmN0aW9uIHRvIGdldAorLy8gICBoZXJlLCBhbmQgd2UncmUgdXNpbmcgdGhlIHN0YWNrIGZyYW1lIGZvciB0aGUgY29udGFpbmluZyBmdW5jdGlvbiB0bworLy8gICBzYXZlL3Jlc3RvcmUgcmVnaXN0ZXJzLCB3ZSBjYW4ndCBrZWVwIGFueXRoaW5nIGxpdmUgaW4gcmVncyBhY3Jvc3MKKy8vICAgdGhlIGVoX3NqbGpfc2V0am1wKCksIGVsc2UgaXQgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGhhdmUgYmVlbiB0cm9tcGVkIHVwb24KKy8vICAgd2hlbiB3ZSBnZXQgaGVyZSBmcm9tIGEgbG9uZ2ptcCgpLiBXZSBmb3JjZSBldmVydGhpbmcgb3V0IG9mIHJlZ2lzdGVycworLy8gICBleGNlcHQgZm9yIG91ciBvd24gaW5wdXQgYnkgbGlzdGluZyB0aGUgcmVsZXZhbnQgcmVnaXN0ZXJzIGluIERlZnMuIEJ5CisvLyAgIGRvaW5nIHNvLCB3ZSBhbHNvIGNhdXNlIHRoZSBwcm9sb2d1ZS9lcGlsb2d1ZSBjb2RlIHRvIGFjdGl2ZWx5IHByZXNlcnZlCisvLyAgIGFsbCBvZiB0aGUgY2FsbGVlLXNhdmVkIHJlc2dpc3RlcnMsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LgorLy8gICAkdmFsIGlzIGEgc2NyYXRjaCByZWdpc3RlciBmb3Igb3VyIHVzZS4KK2xldCBEZWZzID0KKyAgWyBSMCwgIFIxLCAgUjIsICBSMywgIFI0LCAgUjUsICBSNiwgIFI3LCAgUjgsICBSOSwgIFIxMCwgUjExLCBSMTIsIExSLCAgRDAsCisgICAgRDEsICBEMiwgIEQzLCAgRDQsICBENSwgIEQ2LCAgRDcsICBEOCwgIEQ5LCAgRDEwLCBEMTEsIEQxMiwgRDEzLCBEMTQsIEQxNSwKKyAgICBEMTYsIEQxNywgRDE4LCBEMTksIEQyMCwgRDIxLCBEMjIsIEQyMywgRDI0LCBEMjUsIEQyNiwgRDI3LCBEMjgsIEQyOSwgRDMwLAorICAgIEQzMSBdLCBoYXNTaWRlRWZmZWN0cyA9IDEsIGlzQmFycmllciA9IDEgaW4geworICBkZWYgdDJJbnRfZWhfc2psal9zZXRqbXAgOiBUaHVtYjJYSTwob3V0cyksIChpbnMgR1BSOiRzcmMsIHRHUFI6JHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVOb25lLCBTaXplU3BlY2lhbCwgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdlx0JHZhbCwgcGNcdCR7OmNvbW1lbnR9IGJlZ2luIGVoLnNldGptcFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHNcdCR2YWwsICM3XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyXHQkdmFsLCBbJHNyYywgIzRdXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92c1x0cjAsICMwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYlx0MWZcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZzXHRyMCwgIzFcdCR7OmNvbW1lbnR9IGVuZCBlaC5zZXRqbXBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxOiIsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMCwgKEFSTWVoX3NqbGpfc2V0am1wIEdQUjokc3JjLCB0R1BSOiR2YWwpKV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjIsIEhhc1ZGUDJdPjsKK30KKworbGV0IERlZnMgPQorICBbIFIwLCAgUjEsICBSMiwgIFIzLCAgUjQsICBSNSwgIFI2LCAgUjcsICBSOCwgIFI5LCAgUjEwLCBSMTEsIFIxMiwgTFIgXSwKKyAgaGFzU2lkZUVmZmVjdHMgPSAxLCBpc0JhcnJpZXIgPSAxIGluIHsKKyAgZGVmIHQySW50X2VoX3NqbGpfc2V0am1wX25vZnAgOiBUaHVtYjJYSTwob3V0cyksIChpbnMgR1BSOiRzcmMsIHRHUFI6JHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkck1vZGVOb25lLCBTaXplU3BlY2lhbCwgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdlx0JHZhbCwgcGNcdCR7OmNvbW1lbnR9IGJlZ2luIGVoLnNldGptcFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHNcdCR2YWwsICM3XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyXHQkdmFsLCBbJHNyYywgIzRdXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92c1x0cjAsICMwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYlx0MWZcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZzXHRyMCwgIzFcdCR7OmNvbW1lbnR9IGVuZCBlaC5zZXRqbXBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxOiIsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMCwgKEFSTWVoX3NqbGpfc2V0am1wIEdQUjokc3JjLCB0R1BSOiR2YWwpKV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc1RodW1iMiwgTm9WRlBdPjsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29udHJvbC1GbG93IEluc3RydWN0aW9ucworLy8KKworLy8gRklYTUU6IHJlbW92ZSB3aGVuIHdlIGhhdmUgYSB3YXkgdG8gbWFya2luZyBhIE1JIHdpdGggdGhlc2UgcHJvcGVydGllcy4KKy8vIEZJWE1FOiAkZHN0MSBzaG91bGQgYmUgYSBkZWYuIEJ1dCB0aGUgZXh0cmEgb3BzIG11c3QgYmUgaW4gdGhlIGVuZCBvZiB0aGUKKy8vIG9wZXJhbmQgbGlzdC4KKy8vIEZJWE1FOiBTaG91bGQgcGMgYmUgYW4gaW1wbGljaXQgb3BlcmFuZCBsaWtlIFBJQ0FERCwgZXRjPworbGV0IGlzUmV0dXJuID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSwgbWF5TG9hZCA9IDEsCisgICAgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcSA9IDEgaW4KKyAgZGVmIHQyTERNX1JFVCA6IFQyWEl0PChvdXRzIEdQUjokd2IpLCAoaW5zIGFkZHJtb2RlNDokYWRkciwgcHJlZDokcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnbGlzdDokZHN0cywgdmFyaWFibGVfb3BzKSwgSUlDX0JyLAorICAgICAgICAgICAgICAgICAgICAgICAgImxkbSR7YWRkcjpzdWJtb2RlfSR7cH0ke2FkZHI6d2lkZX1cdCRhZGRyISwgJGRzdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiRhZGRyLmFkZHIgPSAkd2IiLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yNX0gPSAwYjAwOworICBsZXQgSW5zdHsyNC0yM30gPSB7PywgP307IC8vIElBOiAnMDEnLCBEQjogJzEwJworICBsZXQgSW5zdHsyMn0gPSAwOworICBsZXQgSW5zdHsyMX0gPSAxOyAvLyBUaGUgVyBiaXQuCisgIGxldCBJbnN0ezIwfSA9IDE7IC8vIExvYWQKK30KKworbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSBpbiB7CitsZXQgaXNQcmVkaWNhYmxlID0gMSBpbgorZGVmIHQyQiAgIDogVDJYSTwob3V0cyksIChpbnMgYnJ0YXJnZXQ6JHRhcmdldCksIElJQ19CciwKKyAgICAgICAgICAgICAgICAgImIud1x0JHRhcmdldCIsCisgICAgICAgICAgICAgICAgIFsoYnIgYmI6JHRhcmdldCldPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezE1LTE0fSA9IDBiMTA7CisgIGxldCBJbnN0ezEyfSA9IDE7Cit9CisKK2xldCBpc05vdER1cGxpY2FibGUgPSAxLCBpc0luZGlyZWN0QnJhbmNoID0gMSBpbiB7CitkZWYgdDJCUl9KVCA6CisgICAgVDJKVEk8KG91dHMpLAorICAgICAgICAgIChpbnMgR1BSOiR0YXJnZXQsIEdQUjokaW5kZXgsIGp0MmJsb2NrX29wZXJhbmQ6JGp0LCBpMzJpbW06JGlkKSwKKyAgICAgICAgICAgSUlDX0JyLCAibW92XHRwYywgJHRhcmdldCRqdCIsCisgICAgICAgICAgWyhBUk1icjJqdCBHUFI6JHRhcmdldCwgR1BSOiRpbmRleCwgdGp1bXB0YWJsZTokanQsIGltbTokaWQpXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yMH0gPSAwYjAxMDAxMDA7CisgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsKKyAgbGV0IEluc3R7MTQtMTJ9ID0gMGIwMDA7CisgIGxldCBJbnN0ezExLTh9ID0gMGIxMTExOyAvLyBSZCA9IHBjCisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDA7Cit9CisKKy8vIEZJWE1FOiBBZGQgYSBub24tcGMgYmFzZWQgY2FzZSB0aGF0IGNhbiBiZSBwcmVkaWNhdGVkLgorZGVmIHQyVEJCIDoKKyAgICBUMkpUSTwob3V0cyksCisgICAgICAgIChpbnMgdGJfYWRkcm1vZGU6JGluZGV4LCBqdDJibG9ja19vcGVyYW5kOiRqdCwgaTMyaW1tOiRpZCksCisgICAgICAgICBJSUNfQnIsICJ0YmJcdCRpbmRleCRqdCIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTIwfSA9IDBiMDAwMTEwMTsKKyAgbGV0IEluc3R7MTktMTZ9ID0gMGIxMTExOyAvLyBSbiA9IHBjICh0YWJsZSBmb2xsb3dzIHRoaXMgaW5zdHJ1Y3Rpb24pCisgIGxldCBJbnN0ezE1LTh9ID0gMGIxMTExMDAwMDsKKyAgbGV0IEluc3R7Ny00fSA9IDBiMDAwMDsgLy8gQiBmb3JtCit9CisKK2RlZiB0MlRCSCA6CisgICAgVDJKVEk8KG91dHMpLAorICAgICAgICAoaW5zIHRiX2FkZHJtb2RlOiRpbmRleCwganQyYmxvY2tfb3BlcmFuZDokanQsIGkzMmltbTokaWQpLAorICAgICAgICAgSUlDX0JyLCAidGJoXHQkaW5kZXgkanQiLCBbXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yMH0gPSAwYjAwMDExMDE7CisgIGxldCBJbnN0ezE5LTE2fSA9IDBiMTExMTsgLy8gUm4gPSBwYyAodGFibGUgZm9sbG93cyB0aGlzIGluc3RydWN0aW9uKQorICBsZXQgSW5zdHsxNS04fSA9IDBiMTExMTAwMDA7CisgIGxldCBJbnN0ezctNH0gPSAwYjAwMDE7IC8vIEggZm9ybQorfQorCisvLyBHZW5lcmljIHZlcnNpb25zIG9mIHRoZSBhYm92ZSB0d28gaW5zdHJ1Y3Rpb25zLCBmb3IgZGlzYXNzZW1ibHkgb25seQorCitkZWYgdDJUQkJnZW4gOiBUMkk8KG91dHMpLCAoaW5zIEdQUjokYSwgR1BSOiRiKSwgSUlDX0JyLAorICAgICAgICAgICAgICAgICAgICAidGJiIiwgIlx0WyRhLCAkYl0iLCBbXT57CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTIwfSA9IDBiMDAwMTEwMTsKKyAgbGV0IEluc3R7MTUtOH0gPSAwYjExMTEwMDAwOworICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAwOyAvLyBCIGZvcm0KK30KKworZGVmIHQyVEJIZ2VuIDogVDJJPChvdXRzKSwgKGlucyBHUFI6JGEsIEdQUjokYiksIElJQ19CciwKKyAgICAgICAgICAgICAgICAgICAidGJoIiwgIlx0WyRhLCAkYiwgbHNsICMxXSIsIFtdPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTIwfSA9IDBiMDAwMTEwMTsKKyAgbGV0IEluc3R7MTUtOH0gPSAwYjExMTEwMDAwOworICBsZXQgSW5zdHs3LTR9ID0gMGIwMDAxOyAvLyBIIGZvcm0KK30KK30gLy8gaXNOb3REdXBsaWNhYmxlLCBpc0luZGlyZWN0QnJhbmNoCisKK30gLy8gaXNCcmFuY2gsIGlzVGVybWluYXRvciwgaXNCYXJyaWVyCisKKy8vIEZJWE1FOiBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBhIHBhdHRlcm4gZm9yIEFSTUJyY29uZCwgYnV0IGNhbid0IHVzZQorLy8gYSB0d28tdmFsdWUgb3BlcmFuZCB3aGVyZSBhIGRhZyBub2RlIGV4cGVjdHMgdHdvIG9wZXJhbmRzLiA6KAorbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSBpbgorZGVmIHQyQmNjIDogVDJJPChvdXRzKSwgKGlucyBicnRhcmdldDokdGFyZ2V0KSwgSUlDX0JyLAorICAgICAgICAgICAgICAgICJiIiwgIi53XHQkdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICBbLyooQVJNYnJjb25kIGJiOiR0YXJnZXQsIGltbTokY2MpKi9dPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezE1LTE0fSA9IDBiMTA7CisgIGxldCBJbnN0ezEyfSA9IDA7Cit9CisKKworLy8gSVQgYmxvY2sKK2xldCBEZWZzID0gW0lUU1RBVEVdIGluCitkZWYgdDJJVCA6IFRodW1iMlhJPChvdXRzKSwgKGlucyBpdF9wcmVkOiRjYywgaXRfbWFzazokbWFzayksCisgICAgICAgICAgICAgICAgICAgIEFkZHJNb2RlTm9uZSwgU2l6ZTJCeXRlcywgIElJQ19pQUxVeCwKKyAgICAgICAgICAgICAgICAgICAgIml0JG1hc2tcdCRjYyIsICIiLCBbXT4geworICAvLyAxNi1iaXQgaW5zdHJ1Y3Rpb24uCisgIGxldCBJbnN0ezMxLTE2fSA9IDB4MDAwMDsKKyAgbGV0IEluc3R7MTUtOH0gPSAwYjEwMTExMTExOworfQorCisvLyBCcmFuY2ggYW5kIEV4Y2hhbmdlIEphemVsbGUgLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkKKy8vIFJtID0gSW5zdHsxOS0xNn0KK2RlZiB0MkJYSiA6IFQySTwob3V0cyksIChpbnMgckdQUjokZnVuYyksIE5vSXRpbmVyYXJ5LCAiYnhqIiwgIlx0JGZ1bmMiLAorICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgbGV0IEluc3R7MjZ9ID0gMDsKKyAgbGV0IEluc3R7MjUtMjB9ID0gMGIxMTExMDA7CisgIGxldCBJbnN0ezE1LTE0fSA9IDBiMTA7CisgIGxldCBJbnN0ezEyfSA9IDA7Cit9CisKKy8vIENoYW5nZSBQcm9jZXNzb3IgU3RhdGUgaXMgYSBzeXN0ZW0gaW5zdHJ1Y3Rpb24gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkuCisvLyBUaGUgc2luZ2xldG9uICRvcHQgb3BlcmFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorLy8gb3B0ezQtMH0gPSBtb2RlIGZyb20gSW5zdHs0LTB9CisvLyBvcHR7NX0gPSBjaGFuZ2Vtb2RlIGZyb20gSW5zdHsxN30KKy8vIG9wdHs4LTZ9ID0gQUlGIGZyb20gSW5zdHs4LTZ9CisvLyBvcHR7MTAtOX0gPSBpbW9kIGZyb20gSW5zdHsxOS0xOH0gd2l0aCAwYjEwIGFzIGVuYWJsZSBhbmQgMGIxMSBhcyBkaXNhYmxlCitkZWYgdDJDUFMgOiBUMlhJPChvdXRzKSwoaW5zIGNwc19vcHQ6JG9wdCksIE5vSXRpbmVyYXJ5LCAiY3BzJG9wdCIsCisgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNn0gPSAwOworICBsZXQgSW5zdHsyNS0yMH0gPSAwYjExMTAxMDsKKyAgbGV0IEluc3R7MTUtMTR9ID0gMGIxMDsKKyAgbGV0IEluc3R7MTJ9ID0gMDsKK30KKworLy8gQTYuMy40IEJyYW5jaGVzIGFuZCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wKKy8vIFRhYmxlIEE2LTE0IENoYW5nZSBQcm9jZXNzb3IgU3RhdGUsIGFuZCBoaW50IGluc3RydWN0aW9ucworLy8gSGVscGVyIGNsYXNzIGZvciBkaXNhc3NlbWJseSBvbmx5LgorY2xhc3MgVDJJX2hpbnQ8Yml0czw4PiBvcDdfMCwgc3RyaW5nIG9wYywgc3RyaW5nIGFzbT4KKyAgOiBUMkk8KG91dHMpLCAoaW5zKSwgTm9JdGluZXJhcnksIG9wYywgYXNtLAorICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsKKyAgbGV0IEluc3R7MzEtMjB9ID0gMHhmM2E7CisgIGxldCBJbnN0ezE1LTE0fSA9IDBiMTA7CisgIGxldCBJbnN0ezEyfSA9IDA7CisgIGxldCBJbnN0ezEwLTh9ID0gMGIwMDA7CisgIGxldCBJbnN0ezctMH0gPSBvcDdfMDsKK30KKworZGVmIHQyTk9QICAgOiBUMklfaGludDwwYjAwMDAwMDAwLCAibm9wIiwgICAiLnciPjsKK2RlZiB0MllJRUxEIDogVDJJX2hpbnQ8MGIwMDAwMDAwMSwgInlpZWxkIiwgIi53Ij47CitkZWYgdDJXRkUgICA6IFQySV9oaW50PDBiMDAwMDAwMTAsICJ3ZmUiLCAgICIudyI+OworZGVmIHQyV0ZJICAgOiBUMklfaGludDwwYjAwMDAwMDExLCAid2ZpIiwgICAiLnciPjsKK2RlZiB0MlNFViAgIDogVDJJX2hpbnQ8MGIwMDAwMDEwMCwgInNldiIsICAgIi53Ij47CisKK2RlZiB0MkRCRyA6IFQySTwob3V0cyksKGlucyBpMzJpbW06JG9wdCksIE5vSXRpbmVyYXJ5LCAiZGJnIiwgIlx0JG9wdCIsCisgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7CisgIGxldCBJbnN0ezMxLTIwfSA9IDB4ZjNhOworICBsZXQgSW5zdHsxNS0xNH0gPSAwYjEwOworICBsZXQgSW5zdHsxMn0gPSAwOworICBsZXQgSW5zdHsxMC04fSA9IDBiMDAwOworICBsZXQgSW5zdHs3LTR9ID0gMGIxMTExOworfQorCisvLyBTZWN1cmUgTW9uaXRvciBDYWxsIGlzIGEgc3lzdGVtIGluc3RydWN0aW9uIC0tIGZvciBkaXNhc3NlbWJseSBvbmx5CisvLyBPcHRpb24gPSBJbnN0ezE5LTE2fQorZGVmIHQyU01DIDogVDJJPChvdXRzKSwgKGlucyBpMzJpbW06JG9wdCksIE5vSXRpbmVyYXJ5LCAic21jIiwgIlx0JG9wdCIsCisgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMTA7CisgIGxldCBJbnN0ezI2LTIwfSA9IDBiMTExMTExMTsKKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMDAwOworfQorCisvLyBTdG9yZSBSZXR1cm4gU3RhdGUgaXMgYSBzeXN0ZW0gaW5zdHJ1Y3Rpb24gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkKK2RlZiB0MlNSU0RCVyA6IFQySTwob3V0cyksKGlucyBpMzJpbW06JG1vZGUpLE5vSXRpbmVyYXJ5LCJzcnNkYiIsIlx0c3AhLCAkbW9kZSIsCisgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTIwfSA9IDBiMDAwMDAxMDsgLy8gVyA9IDEKK30KKworZGVmIHQyU1JTREIgIDogVDJJPChvdXRzKSwoaW5zIGkzMmltbTokbW9kZSksTm9JdGluZXJhcnksInNyc2RiIiwiXHRzcCwgJG1vZGUiLAorICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yMH0gPSAwYjAwMDAwMDA7IC8vIFcgPSAwCit9CisKK2RlZiB0MlNSU0lBVyA6IFQySTwob3V0cyksKGlucyBpMzJpbW06JG1vZGUpLE5vSXRpbmVyYXJ5LCJzcnNpYSIsIlx0c3AhLCAkbW9kZSIsCisgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTIwfSA9IDBiMDAxMTAxMDsgLy8gVyA9IDEKK30KKworZGVmIHQyU1JTSUEgIDogVDJJPChvdXRzKSwgKGlucyBpMzJpbW06JG1vZGUpLE5vSXRpbmVyYXJ5LCJzcnNpYSIsIlx0c3AsICRtb2RlIiwKKyAgICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgbGV0IEluc3R7MjYtMjB9ID0gMGIwMDExMDAwOyAvLyBXID0gMAorfQorCisvLyBSZXR1cm4gRnJvbSBFeGNlcHRpb24gaXMgYSBzeXN0ZW0gaW5zdHJ1Y3Rpb24gLS0gZm9yIGRpc2Fzc2VtYmx5IG9ubHkKK2RlZiB0MlJGRURCVyA6IFQySTwob3V0cyksIChpbnMgckdQUjokYmFzZSksIE5vSXRpbmVyYXJ5LCAicmZlZGIiLCAiXHQkYmFzZSEiLAorICAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTAxOworICBsZXQgSW5zdHsyNi0yMH0gPSAwYjAwMDAwMTE7IC8vIFcgPSAxCit9CisKK2RlZiB0MlJGRURCICA6IFQySTwob3V0cyksIChpbnMgckdQUjokYmFzZSksIE5vSXRpbmVyYXJ5LCAicmZlYWIiLCAiXHQkYmFzZSIsCisgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTIwfSA9IDBiMDAwMDAwMTsgLy8gVyA9IDAKK30KKworZGVmIHQyUkZFSUFXIDogVDJJPChvdXRzKSwgKGlucyByR1BSOiRiYXNlKSwgTm9JdGluZXJhcnksICJyZmVpYSIsICJcdCRiYXNlISIsCisgICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPiB7CisgIGxldCBJbnN0ezMxLTI3fSA9IDBiMTExMDE7CisgIGxldCBJbnN0ezI2LTIwfSA9IDBiMDAxMTAxMTsgLy8gVyA9IDEKK30KKworZGVmIHQyUkZFSUEgIDogVDJJPChvdXRzKSwgKGlucyByR1BSOiRiYXNlKSwgTm9JdGluZXJhcnksICJyZmVpYSIsICJcdCRiYXNlIiwKKyAgICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTEwMTsKKyAgbGV0IEluc3R7MjYtMjB9ID0gMGIwMDExMDAxOyAvLyBXID0gMAorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTm9uLUluc3RydWN0aW9uIFBhdHRlcm5zCisvLworCisvLyBUd28gcGllY2Ugc29faW1tcy4KK2RlZiA6IFQyUGF0PChvciByR1BSOiRMSFMsIHQyX3NvX2ltbTJwYXJ0OiRSSFMpLAorICAgICAgICAgICAgICh0Mk9SUnJpICh0Mk9SUnJpIHJHUFI6JExIUywgKHQyX3NvX2ltbTJwYXJ0XzEgaW1tOiRSSFMpKSwKKyAgICAgICAgICAgICAgICAgICAgKHQyX3NvX2ltbTJwYXJ0XzIgaW1tOiRSSFMpKT47CitkZWYgOiBUMlBhdDwoeG9yIHJHUFI6JExIUywgdDJfc29faW1tMnBhcnQ6JFJIUyksCisgICAgICAgICAgICAgKHQyRU9ScmkgKHQyRU9ScmkgckdQUjokTEhTLCAodDJfc29faW1tMnBhcnRfMSBpbW06JFJIUykpLAorICAgICAgICAgICAgICAgICAgICAodDJfc29faW1tMnBhcnRfMiBpbW06JFJIUykpPjsKK2RlZiA6IFQyUGF0PChhZGQgckdQUjokTEhTLCB0Ml9zb19pbW0ycGFydDokUkhTKSwKKyAgICAgICAgICAgICAodDJBRERyaSAodDJBRERyaSByR1BSOiRMSFMsICh0Ml9zb19pbW0ycGFydF8xIGltbTokUkhTKSksCisgICAgICAgICAgICAgICAgICAgICh0Ml9zb19pbW0ycGFydF8yIGltbTokUkhTKSk+OworZGVmIDogVDJQYXQ8KGFkZCByR1BSOiRMSFMsIHQyX3NvX25lZ19pbW0ycGFydDokUkhTKSwKKyAgICAgICAgICAgICAodDJTVUJyaSAodDJTVUJyaSByR1BSOiRMSFMsICh0Ml9zb19uZWdfaW1tMnBhcnRfMSBpbW06JFJIUykpLAorICAgICAgICAgICAgICAgICAgICAodDJfc29fbmVnX2ltbTJwYXJ0XzIgaW1tOiRSSFMpKT47CisKKy8vIDMyLWJpdCBpbW1lZGlhdGUgdXNpbmcgbW92dyArIG1vdnQuCisvLyBUaGlzIGlzIGEgc2luZ2xlIHBzZXVkbyBpbnN0cnVjdGlvbiB0byBtYWtlIGl0IHJlLW1hdGVyaWFsaXphYmxlLiBSZW1vdmUKKy8vIHdoZW4gd2UgY2FuIGRvIGdlbmVyYWxpemVkIHJlbWF0LgorbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4KK2RlZiB0Mk1PVmkzMmltbSA6IFQySXgyPChvdXRzIHJHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRzcmMpLCBJSUNfaU1PVmksCisgICAgICAgICAgICAgICAgICAgIm1vdnciLCAiXHQkZHN0LCAke3NyYzpsbzE2fVxuXHRtb3Z0JHtwfVx0JGRzdCwgJHtzcmM6aGkxNn0iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgckdQUjokZHN0LCAoaTMyIGltbTokc3JjKSldPjsKKworLy8gQ29uc3RhbnRQb29sLCBHbG9iYWxBZGRyZXNzLCBhbmQgSnVtcFRhYmxlCitkZWYgOiBUMlBhdDwoQVJNV3JhcHBlciAgdGdsb2JhbGFkZHIgOiRkc3QpLCAodDJMRUFwY3JlbCB0Z2xvYmFsYWRkciA6JGRzdCk+LAorICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjIsIERvbnRVc2VNb3Z0XT47CitkZWYgOiBUMlBhdDwoQVJNV3JhcHBlciAgdGNvbnN0cG9vbCAgOiRkc3QpLCAodDJMRUFwY3JlbCB0Y29uc3Rwb29sICA6JGRzdCk+OworZGVmIDogVDJQYXQ8KEFSTVdyYXBwZXIgIHRnbG9iYWxhZGRyIDokZHN0KSwgKHQyTU9WaTMyaW1tIHRnbG9iYWxhZGRyIDokZHN0KT4sCisgICAgICAgICAgIFJlcXVpcmVzPFtJc1RodW1iMiwgVXNlTW92dF0+OworCitkZWYgOiBUMlBhdDwoQVJNV3JhcHBlckpUIHRqdW1wdGFibGU6JGRzdCwgaW1tOiRpZCksCisgICAgICAgICAgICAodDJMRUFwY3JlbEpUIHRqdW1wdGFibGU6JGRzdCwgaW1tOiRpZCk+OworCisvLyBQc2V1ZG8gaW5zdHJ1Y3Rpb24gdGhhdCBjb21iaW5lcyBsZHIgZnJvbSBjb25zdHBvb2wgYW5kIGFkZCBwYy4gVGhpcyBzaG91bGQKKy8vIGJlIGV4cGFuZGVkIGludG8gdHdvIGluc3RydWN0aW9ucyBsYXRlIHRvIGFsbG93IGlmLWNvbnZlcnNpb24gYW5kCisvLyBzY2hlZHVsaW5nLgorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluCitkZWYgdDJMRFJwY2lfcGljIDogUHNldWRvSW5zdDwob3V0cyBHUFI6JGRzdCksIChpbnMgaTMyaW1tOiRhZGRyLCBwY2xhYmVsOiRjcCksCisgICAgICAgICAgICAgICAgICAgTm9JdGluZXJhcnksCisgICAgICAgICAgICAgICAgICAgIiR7OmNvbW1lbnR9IGxkci53XHQkZHN0LCAkYWRkclxuJGNwOlxuXHRhZGRcdCRkc3QsIHBjIiwKKyAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoQVJNcGljX2FkZCAobG9hZCAoQVJNV3JhcHBlciB0Y29uc3Rwb29sOiRhZGRyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRjcCkpXT4sCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNUaHVtYjJdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1vdmUgYmV0d2VlbiBzcGVjaWFsIHJlZ2lzdGVyIGFuZCBBUk0gY29yZSByZWdpc3RlciAtLSBmb3IgZGlzYXNzZW1ibHkgb25seQorLy8KKworLy8gUmQgPSBJbnN0cnsxMS04fQorZGVmIHQyTVJTIDogVDJJPChvdXRzIHJHUFI6JGRzdCksIChpbnMpLCBOb0l0aW5lcmFyeSwgIm1ycyIsICJcdCRkc3QsIGNwc3IiLAorICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4geworICBsZXQgSW5zdHszMS0yN30gPSAwYjExMTEwOworICBsZXQgSW5zdHsyNn0gPSAwOworICBsZXQgSW5zdHsyNS0yMX0gPSAwYjExMTExOworICBsZXQgSW5zdHsyMH0gPSAwOyAvLyBUaGUgUiBiaXQuCisgIGxldCBJbnN0ezE1LTE0fSA9IDBiMTA7CisgIGxldCBJbnN0ezEyfSA9IDA7Cit9CisKKy8vIFJkID0gSW5zdHJ7MTEtOH0KK2RlZiB0Mk1SU3N5cyA6IFQySTwob3V0cyByR1BSOiRkc3QpLCAoaW5zKSwgTm9JdGluZXJhcnksICJtcnMiLCAiXHQkZHN0LCBzcHNyIiwKKyAgICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgbGV0IEluc3R7MjZ9ID0gMDsKKyAgbGV0IEluc3R7MjUtMjF9ID0gMGIxMTExMTsKKyAgbGV0IEluc3R7MjB9ID0gMTsgLy8gVGhlIFIgYml0LgorICBsZXQgSW5zdHsxNS0xNH0gPSAwYjEwOworICBsZXQgSW5zdHsxMn0gPSAwOworfQorCisvLyBSbiA9IEluc3R7MTktMTZ9CitkZWYgdDJNU1IgOiBUMkk8KG91dHMpLCAoaW5zIHJHUFI6JHNyYywgbXNyX21hc2s6JG1hc2spLCBOb0l0aW5lcmFyeSwgIm1zciIsCisgICAgICAgICAgICAgICAgIlx0Y3BzciRtYXNrLCAkc3JjIiwKKyAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgbGV0IEluc3R7MjZ9ID0gMDsKKyAgbGV0IEluc3R7MjUtMjF9ID0gMGIxMTEwMDsKKyAgbGV0IEluc3R7MjB9ID0gMDsgLy8gVGhlIFIgYml0LgorICBsZXQgSW5zdHsxNS0xNH0gPSAwYjEwOworICBsZXQgSW5zdHsxMn0gPSAwOworfQorCisvLyBSbiA9IEluc3R7MTktMTZ9CitkZWYgdDJNU1JzeXMgOiBUMkk8KG91dHMpLCAoaW5zIHJHUFI6JHNyYywgbXNyX21hc2s6JG1hc2spLCBOb0l0aW5lcmFyeSwgIm1zciIsCisgICAgICAgICAgICAgICAgICAgIlx0c3BzciRtYXNrLCAkc3JjIiwKKyAgICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsKKyAgbGV0IEluc3R7MzEtMjd9ID0gMGIxMTExMDsKKyAgbGV0IEluc3R7MjZ9ID0gMDsKKyAgbGV0IEluc3R7MjUtMjF9ID0gMGIxMTEwMDsKKyAgbGV0IEluc3R7MjB9ID0gMTsgLy8gVGhlIFIgYml0LgorICBsZXQgSW5zdHsxNS0xNH0gPSAwYjEwOworICBsZXQgSW5zdHsxMn0gPSAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSW5zdHJWRlAudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1JbnN0clZGUC50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2I0MTJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNSW5zdHJWRlAudGQKQEAgLTAsMCArMSw3MDMgQEAKKy8vPT09LSBBUk1JbnN0clZGUC50ZCAtIFZGUCBzdXBwb3J0IGZvciBBUk0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgQVJNIFZGUCBpbnN0cnVjdGlvbiBzZXQuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2RlZiBTRFRfRlRPSSA6DQorU0RUeXBlUHJvZmlsZTwxLCAxLCBbU0RUQ2lzVlQ8MCwgZjMyPiwgU0RUQ2lzRlA8MT5dPjsNCitkZWYgU0RUX0lUT0YgOg0KK1NEVHlwZVByb2ZpbGU8MSwgMSwgW1NEVENpc0ZQPDA+LCBTRFRDaXNWVDwxLCBmMzI+XT47DQorZGVmIFNEVF9DTVBGUDAgOg0KK1NEVHlwZVByb2ZpbGU8MCwgMSwgW1NEVENpc0ZQPDA+XT47DQorZGVmIFNEVF9WTU9WRFJSIDoNCitTRFR5cGVQcm9maWxlPDEsIDIsIFtTRFRDaXNWVDwwLCBmNjQ+LCBTRFRDaXNWVDwxLCBpMzI+LA0KKyAgICAgICAgICAgICAgICAgICAgIFNEVENpc1NhbWVBczwxLCAyPl0+Ow0KKw0KK2RlZiBhcm1fZnRvdWkgIDogU0ROb2RlPCJBUk1JU0Q6OkZUT1VJIiwgIFNEVF9GVE9JPjsNCitkZWYgYXJtX2Z0b3NpICA6IFNETm9kZTwiQVJNSVNEOjpGVE9TSSIsICBTRFRfRlRPST47DQorZGVmIGFybV9zaXRvZiAgOiBTRE5vZGU8IkFSTUlTRDo6U0lUT0YiLCAgU0RUX0lUT0Y+Ow0KK2RlZiBhcm1fdWl0b2YgIDogU0ROb2RlPCJBUk1JU0Q6OlVJVE9GIiwgIFNEVF9JVE9GPjsNCitkZWYgYXJtX2Ztc3RhdCA6IFNETm9kZTwiQVJNSVNEOjpGTVNUQVQiLCBTRFROb25lLCBbU0ROUEluRmxhZyxTRE5QT3V0RmxhZ10+Ow0KK2RlZiBhcm1fY21wZnAgIDogU0ROb2RlPCJBUk1JU0Q6OkNNUEZQIiwgIFNEVF9BUk1DbXAsIFtTRE5QT3V0RmxhZ10+Ow0KK2RlZiBhcm1fY21wZnAwIDogU0ROb2RlPCJBUk1JU0Q6OkNNUEZQdzAiLFNEVF9DTVBGUDAsIFtTRE5QT3V0RmxhZ10+Ow0KK2RlZiBhcm1fZm1kcnIgIDogU0ROb2RlPCJBUk1JU0Q6OlZNT1ZEUlIiLCAgU0RUX1ZNT1ZEUlI+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gT3BlcmFuZCBEZWZpbml0aW9ucy4NCisvLw0KKw0KKw0KK2RlZiB2ZnBfZjMyaW1tIDogT3BlcmFuZDxmMzI+LA0KKyAgICAgICAgICAgICAgICAgUGF0TGVhZjwoZjMyIGZwaW1tKSwgW3sNCisgICAgICByZXR1cm4gQVJNOjpnZXRWRlBmMzJJbW0oTi0+Z2V0VmFsdWVBUEYoKSkgIT0gLTE7DQorICAgIH1dPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRWRlBmMzJJbW1PcGVyYW5kIjsNCit9DQorDQorZGVmIHZmcF9mNjRpbW0gOiBPcGVyYW5kPGY2ND4sDQorICAgICAgICAgICAgICAgICBQYXRMZWFmPChmNjQgZnBpbW0pLCBbew0KKyAgICAgIHJldHVybiBBUk06OmdldFZGUGY2NEltbShOLT5nZXRWYWx1ZUFQRigpKSAhPSAtMTsNCisgICAgfV0+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFZGUGY2NEltbU9wZXJhbmQiOw0KK30NCisNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBMb2FkIC8gc3RvcmUgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluIHsNCitkZWYgVkxEUkQgOiBBREk1PDBiMTEwMSwgMGIwMSwgKG91dHMgRFBSOiRkc3QpLCAoaW5zIGFkZHJtb2RlNTokYWRkciksDQorICAgICAgICAgICAgICAgICBJSUNfZnBMb2FkNjQsICJ2bGRyIiwgIi42NFx0JGRzdCwgJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChmNjQgKGxvYWQgYWRkcm1vZGU1OiRhZGRyKSkpXT47DQorDQorZGVmIFZMRFJTIDogQVNJNTwwYjExMDEsIDBiMDEsIChvdXRzIFNQUjokZHN0KSwgKGlucyBhZGRybW9kZTU6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwTG9hZDMyLCAidmxkciIsICIuMzJcdCRkc3QsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFNQUjokZHN0LCAobG9hZCBhZGRybW9kZTU6JGFkZHIpKV0+Ow0KK30gLy8gY2FuRm9sZEFzTG9hZA0KKw0KK2RlZiBWU1RSRCAgOiBBREk1PDBiMTEwMSwgMGIwMCwgKG91dHMpLCAoaW5zIERQUjokc3JjLCBhZGRybW9kZTU6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwU3RvcmU2NCwgInZzdHIiLCAiLjY0XHQkc3JjLCAkYWRkciIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChmNjQgRFBSOiRzcmMpLCBhZGRybW9kZTU6JGFkZHIpXT47DQorDQorZGVmIFZTVFJTICA6IEFTSTU8MGIxMTAxLCAwYjAwLCAob3V0cyksIChpbnMgU1BSOiRzcmMsIGFkZHJtb2RlNTokYWRkciksDQorICAgICAgICAgICAgICAgICBJSUNfZnBTdG9yZTMyLCAidnN0ciIsICIuMzJcdCRzcmMsICRhZGRyIiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgU1BSOiRzcmMsIGFkZHJtb2RlNTokYWRkcildPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBMb2FkIC8gc3RvcmUgbXVsdGlwbGUgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorDQorbGV0IG1heUxvYWQgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSwgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcSA9IDEgaW4gew0KK2RlZiBWTERNRCA6IEFYREk1PChvdXRzKSwgKGlucyBhZGRybW9kZTU6JGFkZHIsIHByZWQ6JHAsIHJlZ2xpc3Q6JGRzdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVfb3BzKSwgSW5kZXhNb2RlTm9uZSwgSUlDX2ZwTG9hZG0sDQorICAgICAgICAgICAgICAgICAgInZsZG0ke2FkZHI6c3VibW9kZX0ke3B9XHQke2FkZHI6YmFzZX0sICRkc3RzIiwgIiIsIFtdPiB7DQorICBsZXQgSW5zdHsyMH0gPSAxOw0KK30NCisNCitkZWYgVkxETVMgOiBBWFNJNTwob3V0cyksIChpbnMgYWRkcm1vZGU1OiRhZGRyLCBwcmVkOiRwLCByZWdsaXN0OiRkc3RzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX29wcyksIEluZGV4TW9kZU5vbmUsIElJQ19mcExvYWRtLA0KKyAgICAgICAgICAgICAgICAgICJ2bGRtJHthZGRyOnN1Ym1vZGV9JHtwfVx0JHthZGRyOmJhc2V9LCAkZHN0cyIsICIiLCBbXT4gew0KKyAgbGV0IEluc3R7MjB9ID0gMTsNCit9DQorDQorZGVmIFZMRE1EX1VQRCA6IEFYREk1PChvdXRzIEdQUjokd2IpLCAoaW5zIGFkZHJtb2RlNTokYWRkciwgcHJlZDokcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdsaXN0OiRkc3RzLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICBJbmRleE1vZGVVcGQsIElJQ19mcExvYWRtLA0KKyAgICAgICAgICAgICAgICAgICAgICAidmxkbSR7YWRkcjpzdWJtb2RlfSR7cH1cdCR7YWRkcjpiYXNlfSEsICRkc3RzIiwNCisgICAgICAgICAgICAgICAgICAgICAgIiRhZGRyLmJhc2UgPSAkd2IiLCBbXT4gew0KKyAgbGV0IEluc3R7MjB9ID0gMTsNCit9DQorDQorZGVmIFZMRE1TX1VQRCA6IEFYU0k1PChvdXRzIEdQUjokd2IpLCAoaW5zIGFkZHJtb2RlNTokYWRkciwgcHJlZDokcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdsaXN0OiRkc3RzLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICBJbmRleE1vZGVVcGQsIElJQ19mcExvYWRtLCANCisgICAgICAgICAgICAgICAgICAgICAgInZsZG0ke2FkZHI6c3VibW9kZX0ke3B9XHQke2FkZHI6YmFzZX0hLCAkZHN0cyIsDQorICAgICAgICAgICAgICAgICAgICAgICIkYWRkci5iYXNlID0gJHdiIiwgW10+IHsNCisgIGxldCBJbnN0ezIwfSA9IDE7DQorfQ0KK30gLy8gbWF5TG9hZCwgbmV2ZXJIYXNTaWRlRWZmZWN0cywgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcQ0KKw0KK2xldCBtYXlTdG9yZSA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxID0gMSBpbiB7DQorZGVmIFZTVE1EIDogQVhESTU8KG91dHMpLCAoaW5zIGFkZHJtb2RlNTokYWRkciwgcHJlZDokcCwgcmVnbGlzdDokc3JjcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9vcHMpLCBJbmRleE1vZGVOb25lLCBJSUNfZnBTdG9yZW0sDQorICAgICAgICAgICAgICAgICAgInZzdG0ke2FkZHI6c3VibW9kZX0ke3B9XHQke2FkZHI6YmFzZX0sICRzcmNzIiwgIiIsIFtdPiB7DQorICBsZXQgSW5zdHsyMH0gPSAwOw0KK30NCisNCitkZWYgVlNUTVMgOiBBWFNJNTwob3V0cyksIChpbnMgYWRkcm1vZGU1OiRhZGRyLCBwcmVkOiRwLCByZWdsaXN0OiRzcmNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX29wcyksIEluZGV4TW9kZU5vbmUsIElJQ19mcFN0b3JlbSwNCisgICAgICAgICAgICAgICAgICAidnN0bSR7YWRkcjpzdWJtb2RlfSR7cH1cdCR7YWRkcjpiYXNlfSwgJHNyY3MiLCAiIiwgW10+IHsNCisgIGxldCBJbnN0ezIwfSA9IDA7DQorfQ0KKw0KK2RlZiBWU1RNRF9VUEQgOiBBWERJNTwob3V0cyBHUFI6JHdiKSwgKGlucyBhZGRybW9kZTU6JGFkZHIsIHByZWQ6JHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnbGlzdDokc3JjcywgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgSW5kZXhNb2RlVXBkLCBJSUNfZnBTdG9yZW0sDQorICAgICAgICAgICAgICAgICAgICAgICJ2c3RtJHthZGRyOnN1Ym1vZGV9JHtwfVx0JHthZGRyOmJhc2V9ISwgJHNyY3MiLA0KKyAgICAgICAgICAgICAgICAgICAgICAiJGFkZHIuYmFzZSA9ICR3YiIsIFtdPiB7DQorICBsZXQgSW5zdHsyMH0gPSAwOw0KK30NCisNCitkZWYgVlNUTVNfVVBEIDogQVhTSTU8KG91dHMgR1BSOiR3YiksIChpbnMgYWRkcm1vZGU1OiRhZGRyLCBwcmVkOiRwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2xpc3Q6JHNyY3MsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAgIEluZGV4TW9kZVVwZCwgSUlDX2ZwU3RvcmVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAidnN0bSR7YWRkcjpzdWJtb2RlfSR7cH1cdCR7YWRkcjpiYXNlfSEsICRzcmNzIiwNCisgICAgICAgICAgICAgICAgICAgICAgIiRhZGRyLmJhc2UgPSAkd2IiLCBbXT4gew0KKyAgbGV0IEluc3R7MjB9ID0gMDsNCit9DQorfSAvLyBtYXlTdG9yZSwgbmV2ZXJIYXNTaWRlRWZmZWN0cywgaGFzRXh0cmFTcmNSZWdBbGxvY1JlcQ0KKw0KKy8vIEZMRE1YLCBGU1RNWCAtIG1peGluZyBTL0QgcmVnaXN0ZXJzIGZvciBwcmUtYXJtdjYgY29yZXMNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEZQIEJpbmFyeSBPcGVyYXRpb25zLg0KKy8vDQorDQorZGVmIFZBREREICA6IEFEYkk8MGIxMTEwMCwgMGIxMSwgMCwgMCwgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSwgRFBSOiRiKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcEFMVTY0LCAidmFkZCIsICIuZjY0XHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChmYWRkIERQUjokYSwgKGY2NCBEUFI6JGIpKSldPjsNCisNCitkZWYgVkFERFMgIDogQVNiSW48MGIxMTEwMCwgMGIxMSwgMCwgMCwgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgU1BSOiRiKSwNCisgICAgICAgICAgICAgICAgICBJSUNfZnBBTFUzMiwgInZhZGQiLCAiLmYzMlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBTUFI6JGRzdCwgKGZhZGQgU1BSOiRhLCBTUFI6JGIpKV0+Ow0KKw0KKy8vIFRoZXNlIGFyZSBlbmNvZGVkIGFzIHVuYXJ5IGluc3RydWN0aW9ucy4NCitsZXQgRGVmcyA9IFtGUFNDUl0gaW4gew0KK2RlZiBWQ01QRUQgOiBBRHVJPDBiMTExMDEsIDBiMTEsIDBiMDEwMCwgMGIxMSwgMCwgKG91dHMpLCAoaW5zIERQUjokYSwgRFBSOiRiKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcENNUDY0LCAidmNtcGUiLCAiLmY2NFx0JGEsICRiIiwNCisgICAgICAgICAgICAgICAgIFsoYXJtX2NtcGZwIERQUjokYSwgKGY2NCBEUFI6JGIpKV0+Ow0KKw0KK2RlZiBWQ01QRCAgOiBBRHVJPDBiMTExMDEsIDBiMTEsIDBiMDEwMCwgMGIwMSwgMCwgKG91dHMpLCAoaW5zIERQUjokYSwgRFBSOiRiKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcENNUDY0LCAidmNtcCIsICIuZjY0XHQkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVkNNUEVTIDogQVN1STwwYjExMTAxLCAwYjExLCAwYjAxMDAsIDBiMTEsIDAsIChvdXRzKSwgKGlucyBTUFI6JGEsIFNQUjokYiksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDTVAzMiwgInZjbXBlIiwgIi5mMzJcdCRhLCAkYiIsDQorICAgICAgICAgICAgICAgICBbKGFybV9jbXBmcCBTUFI6JGEsIFNQUjokYildPjsNCisNCitkZWYgVkNNUFMgIDogQVN1STwwYjExMTAxLCAwYjExLCAwYjAxMDAsIDBiMDEsIDAsIChvdXRzKSwgKGlucyBTUFI6JGEsIFNQUjokYiksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDTVAzMiwgInZjbXAiLCAiLmYzMlx0JGEsICRiIiwNCisgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT47DQorfQ0KKw0KK2RlZiBWRElWRCAgOiBBRGJJPDBiMTExMDEsIDBiMDAsIDAsIDAsIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JGEsIERQUjokYiksDQorICAgICAgICAgICAgICAgICBJSUNfZnBESVY2NCwgInZkaXYiLCAiLmY2NFx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IERQUjokZHN0LCAoZmRpdiBEUFI6JGEsIChmNjQgRFBSOiRiKSkpXT47DQorDQorZGVmIFZESVZTICA6IEFTYkk8MGIxMTEwMSwgMGIwMCwgMCwgMCwgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgU1BSOiRiKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcERJVjMyLCAidmRpdiIsICIuZjMyXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgU1BSOiRkc3QsIChmZGl2IFNQUjokYSwgU1BSOiRiKSldPjsNCisNCitkZWYgVk1VTEQgIDogQURiSTwwYjExMTAwLCAwYjEwLCAwLCAwLCAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRhLCBEUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwTVVMNjQsICJ2bXVsIiwgIi5mNjRcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKGZtdWwgRFBSOiRhLCAoZjY0IERQUjokYikpKV0+Ow0KKw0KK2RlZiBWTVVMUyAgOiBBU2JJbjwwYjExMTAwLCAwYjEwLCAwLCAwLCAob3V0cyBTUFI6JGRzdCksIChpbnMgU1BSOiRhLCBTUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgIElJQ19mcE1VTDMyLCAidm11bCIsICIuZjMyXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFNQUjokZHN0LCAoZm11bCBTUFI6JGEsIFNQUjokYikpXT47DQorDQorZGVmIFZOTVVMRCAgOiBBRGJJPDBiMTExMDAsIDBiMTAsIDEsIDAsIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JGEsIERQUjokYiksDQorICAgICAgICAgICAgICAgICAgSUlDX2ZwTVVMNjQsICJ2bm11bCIsICIuZjY0XHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IERQUjokZHN0LCAoZm5lZyAoZm11bCBEUFI6JGEsIChmNjQgRFBSOiRiKSkpKV0+Ow0KKw0KK2RlZiBWTk1VTFMgIDogQVNiSTwwYjExMTAwLCAwYjEwLCAxLCAwLCAob3V0cyBTUFI6JGRzdCksIChpbnMgU1BSOiRhLCBTUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgIElJQ19mcE1VTDMyLCAidm5tdWwiLCAiLmYzMlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBTUFI6JGRzdCwgKGZuZWcgKGZtdWwgU1BSOiRhLCBTUFI6JGIpKSldPjsNCisNCisvLyBNYXRjaCByZWFzc29jaWF0ZWQgZm9ybXMgb25seSBpZiBub3Qgc2lnbiBkZXBlbmRlbnQgcm91bmRpbmcuDQorZGVmIDogUGF0PChmbXVsIChmbmVnIERQUjokYSksIChmNjQgRFBSOiRiKSksDQorICAgICAgICAgIChWTk1VTEQgRFBSOiRhLCBEUFI6JGIpPiwgUmVxdWlyZXM8W05vSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmddPjsNCitkZWYgOiBQYXQ8KGZtdWwgKGZuZWcgU1BSOiRhKSwgU1BSOiRiKSwNCisgICAgICAgICAgKFZOTVVMUyBTUFI6JGEsIFNQUjokYik+LCBSZXF1aXJlczxbTm9Ib25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ10+Ow0KKw0KKw0KK2RlZiBWU1VCRCAgOiBBRGJJPDBiMTExMDAsIDBiMTEsIDEsIDAsIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JGEsIERQUjokYiksDQorICAgICAgICAgICAgICAgICBJSUNfZnBBTFU2NCwgInZzdWIiLCAiLmY2NFx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IERQUjokZHN0LCAoZnN1YiBEUFI6JGEsIChmNjQgRFBSOiRiKSkpXT47DQorDQorZGVmIFZTVUJTICA6IEFTYkluPDBiMTExMDAsIDBiMTEsIDEsIDAsIChvdXRzIFNQUjokZHN0KSwgKGlucyBTUFI6JGEsIFNQUjokYiksDQorICAgICAgICAgICAgICAgICAgSUlDX2ZwQUxVMzIsICJ2c3ViIiwgIi5mMzJcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgU1BSOiRkc3QsIChmc3ViIFNQUjokYSwgU1BSOiRiKSldPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEZQIFVuYXJ5IE9wZXJhdGlvbnMuDQorLy8NCisNCitkZWYgVkFCU0QgIDogQUR1STwwYjExMTAxLCAwYjExLCAwYjAwMDAsIDBiMTEsIDAsIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwVU5BNjQsICJ2YWJzIiwgIi5mNjRcdCRkc3QsICRhIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IERQUjokZHN0LCAoZmFicyAoZjY0IERQUjokYSkpKV0+Ow0KKw0KK2RlZiBWQUJTUyAgOiBBU3VJbjwwYjExMTAxLCAwYjExLCAwYjAwMDAsIDBiMTEsIDAsKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSksDQorICAgICAgICAgICAgICAgICAgSUlDX2ZwVU5BMzIsICJ2YWJzIiwgIi5mMzJcdCRkc3QsICRhIiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBTUFI6JGRzdCwgKGZhYnMgU1BSOiRhKSldPjsNCisNCitsZXQgRGVmcyA9IFtGUFNDUl0gaW4gew0KK2RlZiBWQ01QRVpEIDogQUR1STwwYjExMTAxLCAwYjExLCAwYjAxMDEsIDBiMTEsIDAsIChvdXRzKSwgKGlucyBEUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgIElJQ19mcENNUDY0LCAidmNtcGUiLCAiLmY2NFx0JGEsICMwIiwNCisgICAgICAgICAgICAgICAgICBbKGFybV9jbXBmcDAgKGY2NCBEUFI6JGEpKV0+Ow0KKw0KK2RlZiBWQ01QWkQgIDogQUR1STwwYjExMTAxLCAwYjExLCAwYjAxMDEsIDBiMDEsIDAsIChvdXRzKSwgKGlucyBEUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgIElJQ19mcENNUDY0LCAidmNtcCIsICIuZjY0XHQkYSwgIzAiLA0KKyAgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT47DQorDQorZGVmIFZDTVBFWlMgOiBBU3VJPDBiMTExMDEsIDBiMTEsIDBiMDEwMSwgMGIxMSwgMCwgKG91dHMpLCAoaW5zIFNQUjokYSksDQorICAgICAgICAgICAgICAgICAgSUlDX2ZwQ01QMzIsICJ2Y21wZSIsICIuZjMyXHQkYSwgIzAiLA0KKyAgICAgICAgICAgICAgICAgIFsoYXJtX2NtcGZwMCBTUFI6JGEpXT47DQorDQorZGVmIFZDTVBaUyAgOiBBU3VJPDBiMTExMDEsIDBiMTEsIDBiMDEwMSwgMGIwMSwgMCwgKG91dHMpLCAoaW5zIFNQUjokYSksDQorICAgICAgICAgICAgICAgICAgSUlDX2ZwQ01QMzIsICJ2Y21wIiwgIi5mMzJcdCRhLCAjMCIsDQorICAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCit9DQorDQorZGVmIFZDVlREUyA6IEFTdUk8MGIxMTEwMSwgMGIxMSwgMGIwMTExLCAwYjExLCAwLCAob3V0cyBEUFI6JGRzdCksIChpbnMgU1BSOiRhKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcENWVERTLCAidmN2dCIsICIuZjY0LmYzMlx0JGRzdCwgJGEiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChmZXh0ZW5kIFNQUjokYSkpXT47DQorDQorLy8gU3BlY2lhbCBjYXNlIGVuY29kaW5nOiBiaXRzIDExLTggaXMgMGIxMDExLg0KK2RlZiBWQ1ZUU0QgOiBWRlBBSTwob3V0cyBTUFI6JGRzdCksIChpbnMgRFBSOiRhKSwgVkZQVW5hcnlGcm0sDQorICAgICAgICAgICAgICAgICAgIElJQ19mcENWVFNELCAidmN2dCIsICIuZjMyLmY2NFx0JGRzdCwgJGEiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBTUFI6JGRzdCwgKGZyb3VuZCBEUFI6JGEpKV0+IHsNCisgIGxldCBJbnN0ezI3LTIzfSA9IDBiMTExMDE7DQorICBsZXQgSW5zdHsyMS0xNn0gPSAwYjExMDExMTsNCisgIGxldCBJbnN0ezExLTh9ICA9IDBiMTAxMTsNCisgIGxldCBJbnN0ezctNn0gICA9IDBiMTE7DQorICBsZXQgSW5zdHs0fSAgICAgPSAwOw0KK30NCisNCisvLyBCZXR3ZWVuIGhhbGYtcHJlY2lzaW9uIGFuZCBzaW5nbGUtcHJlY2lzaW9uLiAgRm9yIGRpc2Fzc2VtYmx5IG9ubHkuDQorDQorZGVmIFZDVlRCU0g6IEFTdUk8MGIxMTEwMSwgMGIxMSwgMGIwMDEwLCAwYjAxLCAwLCAob3V0cyBTUFI6JGRzdCksIChpbnMgU1BSOiRhKSwNCisgICAgICAgICAgICAgICAgIC8qIEZJWE1FICovIElJQ19mcENWVFNILCAidmN2dGIiLCAiLmYzMi5mMTZcdCRkc3QsICRhIiwNCisgICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT47DQorDQorZGVmIDogQVJNUGF0PChmMzJfdG9fZjE2IFNQUjokYSksDQorICAgICAgICAgICAgIChpMzIgKENPUFlfVE9fUkVHQ0xBU1MgKFZDVlRCU0ggU1BSOiRhKSwgR1BSKSk+Ow0KKw0KK2RlZiBWQ1ZUQkhTOiBBU3VJPDBiMTExMDEsIDBiMTEsIDBiMDAxMSwgMGIwMSwgMCwgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSksDQorICAgICAgICAgICAgICAgICAvKiBGSVhNRSAqLyBJSUNfZnBDVlRIUywgInZjdnRiIiwgIi5mMTYuZjMyXHQkZHN0LCAkYSIsDQorICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+Ow0KKw0KK2RlZiA6IEFSTVBhdDwoZjE2X3RvX2YzMiBHUFI6JGEpLA0KKyAgICAgICAgICAgICAoVkNWVEJIUyAoQ09QWV9UT19SRUdDTEFTUyBHUFI6JGEsIFNQUikpPjsNCisNCitkZWYgVkNWVFRTSDogQVN1STwwYjExMTAxLCAwYjExLCAwYjAwMTAsIDBiMTEsIDAsIChvdXRzIFNQUjokZHN0KSwgKGlucyBTUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgLyogRklYTUUgKi8gSUlDX2ZwQ1ZUU0gsICJ2Y3Z0dCIsICIuZjMyLmYxNlx0JGRzdCwgJGEiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVkNWVFRIUzogQVN1STwwYjExMTAxLCAwYjExLCAwYjAwMTEsIDBiMTEsIDAsIChvdXRzIFNQUjokZHN0KSwgKGlucyBTUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgLyogRklYTUUgKi8gSUlDX2ZwQ1ZUSFMsICJ2Y3Z0dCIsICIuZjE2LmYzMlx0JGRzdCwgJGEiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4gew0KK2RlZiBWTU9WRDogQUR1STwwYjExMTAxLCAwYjExLCAwYjAwMDAsIDBiMDEsIDAsIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwVU5BNjQsICJ2bW92IiwgIi5mNjRcdCRkc3QsICRhIiwgW10+Ow0KKw0KK2RlZiBWTU9WUzogQVN1STwwYjExMTAxLCAwYjExLCAwYjAwMDAsIDBiMDEsIDAsIChvdXRzIFNQUjokZHN0KSwgKGlucyBTUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwVU5BMzIsICJ2bW92IiwgIi5mMzJcdCRkc3QsICRhIiwgW10+Ow0KK30gLy8gbmV2ZXJIYXNTaWRlRWZmZWN0cw0KKw0KK2RlZiBWTkVHRCAgOiBBRHVJPDBiMTExMDEsIDBiMTEsIDBiMDAwMSwgMGIwMSwgMCwgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSksDQorICAgICAgICAgICAgICAgICBJSUNfZnBVTkE2NCwgInZuZWciLCAiLmY2NFx0JGRzdCwgJGEiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChmbmVnIChmNjQgRFBSOiRhKSkpXT47DQorDQorZGVmIFZORUdTICA6IEFTdUluPDBiMTExMDEsIDBiMTEsIDBiMDAwMSwgMGIwMSwgMCwob3V0cyBTUFI6JGRzdCksIChpbnMgU1BSOiRhKSwNCisgICAgICAgICAgICAgICAgICBJSUNfZnBVTkEzMiwgInZuZWciLCAiLmYzMlx0JGRzdCwgJGEiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFNQUjokZHN0LCAoZm5lZyBTUFI6JGEpKV0+Ow0KKw0KK2RlZiBWU1FSVEQgOiBBRHVJPDBiMTExMDEsIDBiMTEsIDBiMDAwMSwgMGIxMSwgMCwgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSksDQorICAgICAgICAgICAgICAgICBJSUNfZnBTUVJUNjQsICJ2c3FydCIsICIuZjY0XHQkZHN0LCAkYSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKGZzcXJ0IChmNjQgRFBSOiRhKSkpXT47DQorDQorZGVmIFZTUVJUUyA6IEFTdUk8MGIxMTEwMSwgMGIxMSwgMGIwMDAxLCAwYjExLCAwLCAob3V0cyBTUFI6JGRzdCksIChpbnMgU1BSOiRhKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcFNRUlQzMiwgInZzcXJ0IiwgIi5mMzJcdCRkc3QsICRhIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFNQUjokZHN0LCAoZnNxcnQgU1BSOiRhKSldPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEZQIDwtPiBHUFIgQ29waWVzLiAgSW50IDwtPiBGUCBDb252ZXJzaW9ucy4NCisvLw0KKw0KK2RlZiBWTU9WUlMgOiBBVkNvbnYySTwwYjExMTAwMDAxLCAwYjEwMTAsIChvdXRzIEdQUjokZHN0KSwgKGlucyBTUFI6JHNyYyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBNT1ZTSSwgInZtb3YiLCAiXHQkZHN0LCAkc3JjIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoYml0Y29udmVydCBTUFI6JHNyYykpXT47DQorDQorZGVmIFZNT1ZTUiA6IEFWQ29udjRJPDBiMTExMDAwMDAsIDBiMTAxMCwgKG91dHMgU1BSOiRkc3QpLCAoaW5zIEdQUjokc3JjKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcE1PVklTLCAidm1vdiIsICJcdCRkc3QsICRzcmMiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgU1BSOiRkc3QsIChiaXRjb252ZXJ0IEdQUjokc3JjKSldPjsNCisNCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4gew0KK2RlZiBWTU9WUlJEICA6IEFWQ29udjNJPDBiMTEwMDAxMDEsIDBiMTAxMSwNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1BSOiR3YiwgR1BSOiRkc3QyKSwgKGlucyBEUFI6JHNyYyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBNT1ZESSwgInZtb3YiLCAiXHQkd2IsICRkc3QyLCAkc3JjIiwNCisgICAgICAgICAgICAgICAgIFsvKiBGSVhNRTogQ2FuJ3Qgd3JpdGUgcGF0dGVybiBmb3IgbXVsdGlwbGUgcmVzdWx0IGluc3RyKi9dPiB7DQorICBsZXQgSW5zdHs3LTZ9ID0gMGIwMDsNCit9DQorDQorZGVmIFZNT1ZSUlMgIDogQVZDb252M0k8MGIxMTAwMDEwMSwgMGIxMDEwLA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUFI6JHdiLCBHUFI6JGRzdDIpLCAoaW5zIFNQUjokc3JjMSwgU1BSOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcE1PVkRJLCAidm1vdiIsICJcdCR3YiwgJGRzdDIsICRzcmMxLCAkc3JjMiIsDQorICAgICAgICAgICAgICAgICBbLyogRm9yIGRpc2Fzc2VtYmx5IG9ubHk7IHBhdHRlcm4gbGVmdCBibGFuayAqL10+IHsNCisgIGxldCBJbnN0ezctNn0gPSAwYjAwOw0KK30NCit9IC8vIG5ldmVySGFzU2lkZUVmZmVjdHMNCisNCisvLyBGTURIUjogR1BSIC0+IFNQUg0KKy8vIEZNRExSOiBHUFIgLT4gU1BSDQorDQorZGVmIFZNT1ZEUlIgOiBBVkNvbnY1STwwYjExMDAwMTAwLCAwYjEwMTEsDQorICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIEdQUjokc3JjMSwgR1BSOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgSUlDX2ZwTU9WSUQsICJ2bW92IiwgIlx0JGRzdCwgJHNyYzEsICRzcmMyIiwNCisgICAgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChhcm1fZm1kcnIgR1BSOiRzcmMxLCBHUFI6JHNyYzIpKV0+IHsNCisgIGxldCBJbnN0ezctNn0gPSAwYjAwOw0KK30NCisNCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4NCitkZWYgVk1PVlNSUiA6IEFWQ29udjVJPDBiMTEwMDAxMDAsIDBiMTAxMCwNCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBTUFI6JGRzdDEsIFNQUjokZHN0MiksIChpbnMgR1BSOiRzcmMxLCBHUFI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICBJSUNfZnBNT1ZJRCwgInZtb3YiLCAiXHQkZHN0MSwgJGRzdDIsICRzcmMxLCAkc3JjMiIsDQorICAgICAgICAgICAgICAgIFsvKiBGb3IgZGlzYXNzZW1ibHkgb25seTsgcGF0dGVybiBsZWZ0IGJsYW5rICovXT4gew0KKyAgbGV0IEluc3R7Ny02fSA9IDBiMDA7DQorfQ0KKw0KKy8vIEZNUkRIOiBTUFIgLT4gR1BSDQorLy8gRk1SREw6IFNQUiAtPiBHUFINCisvLyBGTVJSUzogU1BSIC0+IEdQUg0KKy8vIEZNUlggOiBTUFIgc3lzdGVtIHJlZyAtPiBHUFINCisNCisvLyBGTVNSUjogR1BSIC0+IFNQUg0KKw0KKy8vIEZNWFI6IEdQUiAtPiBWRlAgU3N0ZW0gcmVnDQorDQorDQorLy8gSW50IHRvIEZQOg0KKw0KK2RlZiBWU0lUT0QgOiBBVkNvbnYxSTwwYjExMTAxLCAwYjExLCAwYjEwMDAsIDBiMTAxMSwNCisgICAgICAgICAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBTUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwQ1ZUSUQsICJ2Y3Z0IiwgIi5mNjQuczMyXHQkZHN0LCAkYSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKGY2NCAoYXJtX3NpdG9mIFNQUjokYSkpKV0+IHsNCisgIGxldCBJbnN0ezd9ID0gMTsgLy8gczMyDQorfQ0KKw0KK2RlZiBWU0lUT1MgOiBBVkNvbnYxSW48MGIxMTEwMSwgMGIxMSwgMGIxMDAwLCAwYjEwMTAsDQorICAgICAgICAgICAgICAgICAob3V0cyBTUFI6JGRzdCksKGlucyBTUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwQ1ZUSVMsICJ2Y3Z0IiwgIi5mMzIuczMyXHQkZHN0LCAkYSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBTUFI6JGRzdCwgKGFybV9zaXRvZiBTUFI6JGEpKV0+IHsNCisgIGxldCBJbnN0ezd9ID0gMTsgLy8gczMyDQorfQ0KKw0KK2RlZiBWVUlUT0QgOiBBVkNvbnYxSTwwYjExMTAxLCAwYjExLCAwYjEwMDAsIDBiMTAxMSwNCisgICAgICAgICAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBTUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwQ1ZUSUQsICJ2Y3Z0IiwgIi5mNjQudTMyXHQkZHN0LCAkYSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKGY2NCAoYXJtX3VpdG9mIFNQUjokYSkpKV0+IHsNCisgIGxldCBJbnN0ezd9ID0gMDsgLy8gdTMyDQorfQ0KKw0KK2RlZiBWVUlUT1MgOiBBVkNvbnYxSW48MGIxMTEwMSwgMGIxMSwgMGIxMDAwLCAwYjEwMTAsDQorICAgICAgICAgICAgICAgICAob3V0cyBTUFI6JGRzdCksIChpbnMgU1BSOiRhKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcENWVElTLCAidmN2dCIsICIuZjMyLnUzMlx0JGRzdCwgJGEiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgU1BSOiRkc3QsIChhcm1fdWl0b2YgU1BSOiRhKSldPiB7DQorICBsZXQgSW5zdHs3fSA9IDA7IC8vIHUzMg0KK30NCisNCisvLyBGUCB0byBJbnQ6DQorLy8gQWx3YXlzIHNldCBaIGJpdCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIGkuZS4gInJvdW5kIHRvd2FyZHMgemVybyIgdmFyaWFudHMuDQorDQorZGVmIFZUT1NJWkQgOiBBVkNvbnYxSTwwYjExMTAxLCAwYjExLCAwYjExMDEsIDBiMTAxMSwNCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFNQUjokZHN0KSwgKGlucyBEUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwQ1ZUREksICJ2Y3Z0IiwgIi5zMzIuZjY0XHQkZHN0LCAkYSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBTUFI6JGRzdCwgKGFybV9mdG9zaSAoZjY0IERQUjokYSkpKV0+IHsNCisgIGxldCBJbnN0ezd9ID0gMTsgLy8gWiBiaXQNCit9DQorDQorZGVmIFZUT1NJWlMgOiBBVkNvbnYxSW48MGIxMTEwMSwgMGIxMSwgMGIxMTAxLCAwYjEwMTAsDQorICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRTSSwgInZjdnQiLCAiLnMzMi5mMzJcdCRkc3QsICRhIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFNQUjokZHN0LCAoYXJtX2Z0b3NpIFNQUjokYSkpXT4gew0KKyAgbGV0IEluc3R7N30gPSAxOyAvLyBaIGJpdA0KK30NCisNCitkZWYgVlRPVUlaRCA6IEFWQ29udjFJPDBiMTExMDEsIDBiMTEsIDBiMTEwMCwgMGIxMDExLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIERQUjokYSksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRESSwgInZjdnQiLCAiLnUzMi5mNjRcdCRkc3QsICRhIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFNQUjokZHN0LCAoYXJtX2Z0b3VpIChmNjQgRFBSOiRhKSkpXT4gew0KKyAgbGV0IEluc3R7N30gPSAxOyAvLyBaIGJpdA0KK30NCisNCitkZWYgVlRPVUlaUyA6IEFWQ29udjFJbjwwYjExMTAxLCAwYjExLCAwYjExMDAsIDBiMTAxMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBTUFI6JGRzdCksIChpbnMgU1BSOiRhKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcENWVFNJLCAidmN2dCIsICIudTMyLmYzMlx0JGRzdCwgJGEiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgU1BSOiRkc3QsIChhcm1fZnRvdWkgU1BSOiRhKSldPiB7DQorICBsZXQgSW5zdHs3fSA9IDE7IC8vIFogYml0DQorfQ0KKw0KKy8vIEFuZCB0aGUgWiBiaXQgJzAnIHZhcmlhbnRzLCBpLmUuIHVzZSB0aGUgcm91bmRpbmcgbW9kZSBzcGVjaWZpZWQgYnkgRlBTQ1IuDQorLy8gRm9yIGRpc2Fzc2VtYmx5IG9ubHkuDQorbGV0IFVzZXMgPSBbRlBTQ1JdIGluIHsNCitkZWYgVlRPU0lSRCA6IEFWQ29udjFJPDBiMTExMDEsIDBiMTEsIDBiMTEwMSwgMGIxMDExLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIERQUjokYSksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRESSwgInZjdnRyIiwgIi5zMzIuZjY0XHQkZHN0LCAkYSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBTUFI6JGRzdCwgKGludF9hcm1fdmN2dHIgKGY2NCBEUFI6JGEpKSldPiB7DQorICBsZXQgSW5zdHs3fSA9IDA7IC8vIFogYml0DQorfQ0KKw0KK2RlZiBWVE9TSVJTIDogQVZDb252MUluPDBiMTExMDEsIDBiMTEsIDBiMTEwMSwgMGIxMDEwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFNQUjokZHN0KSwgKGlucyBTUFI6JGEpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwQ1ZUU0ksICJ2Y3Z0ciIsICIuczMyLmYzMlx0JGRzdCwgJGEiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgU1BSOiRkc3QsIChpbnRfYXJtX3ZjdnRyIFNQUjokYSkpXT4gew0KKyAgbGV0IEluc3R7N30gPSAwOyAvLyBaIGJpdA0KK30NCisNCitkZWYgVlRPVUlSRCA6IEFWQ29udjFJPDBiMTExMDEsIDBiMTEsIDBiMTEwMCwgMGIxMDExLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIERQUjokYSksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRESSwgInZjdnRyIiwgIi51MzIuZjY0XHQkZHN0LCAkYSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBTUFI6JGRzdCwgKGludF9hcm1fdmN2dHJ1IChmNjQgRFBSOiRhKSkpXT4gew0KKyAgbGV0IEluc3R7N30gPSAwOyAvLyBaIGJpdA0KK30NCisNCitkZWYgVlRPVUlSUyA6IEFWQ29udjFJbjwwYjExMTAxLCAwYjExLCAwYjExMDAsIDBiMTAxMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBTUFI6JGRzdCksIChpbnMgU1BSOiRhKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcENWVFNJLCAidmN2dHIiLCAiLnUzMi5mMzJcdCRkc3QsICRhIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFNQUjokZHN0LCAoaW50X2FybV92Y3Z0cnUgU1BSOiRhKSldPiB7DQorICBsZXQgSW5zdHs3fSA9IDA7IC8vIFogYml0DQorfQ0KK30NCisNCisvLyBDb252ZXJ0IGJldHdlZW4gZmxvYXRpbmctcG9pbnQgYW5kIGZpeGVkLXBvaW50DQorLy8gRGF0YSB0eXBlIGZvciBmaXhlZC1wb2ludCBuYW1pbmcgY29udmVudGlvbjoNCisvLyAgIFMxNiAoVT0wLCBzeD0wKSAtPiBTSA0KKy8vICAgVTE2IChVPTEsIHN4PTApIC0+IFVIDQorLy8gICBTMzIgKFU9MCwgc3g9MSkgLT4gU0wNCisvLyAgIFUzMiAoVT0xLCBzeD0xKSAtPiBVTA0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkYSA9ICRkc3QiIGluIHsNCisNCisvLyBGUCB0byBGaXhlZC1Qb2ludDoNCisNCitkZWYgVlRPU0hTIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTExMCwgMGIxMDEwLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRTSSwgInZjdnQiLCAiLnMxNi5mMzJcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlRPVUhTIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTExMSwgMGIxMDEwLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRTSSwgInZjdnQiLCAiLnUxNi5mMzJcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlRPU0xTIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTExMCwgMGIxMDEwLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRTSSwgInZjdnQiLCAiLnMzMi5mMzJcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlRPVUxTIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTExMSwgMGIxMDEwLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRTSSwgInZjdnQiLCAiLnUzMi5mMzJcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlRPU0hEIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTExMCwgMGIxMDExLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRESSwgInZjdnQiLCAiLnMxNi5mNjRcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlRPVUhEIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTExMSwgMGIxMDExLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRESSwgInZjdnQiLCAiLnUxNi5mNjRcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlRPU0xEIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTExMCwgMGIxMDExLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRESSwgInZjdnQiLCAiLnMzMi5mNjRcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlRPVUxEIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTExMSwgMGIxMDExLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRESSwgInZjdnQiLCAiLnUzMi5mNjRcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCisvLyBGaXhlZC1Qb2ludCB0byBGUDoNCisNCitkZWYgVlNIVE9TIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTAxMCwgMGIxMDEwLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRJUywgInZjdnQiLCAiLmYzMi5zMTZcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlVIVE9TIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTAxMSwgMGIxMDEwLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRJUywgInZjdnQiLCAiLmYzMi51MTZcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlNMVE9TIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTAxMCwgMGIxMDEwLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRJUywgInZjdnQiLCAiLmYzMi5zMzJcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlVMVE9TIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTAxMSwgMGIxMDEwLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRJUywgInZjdnQiLCAiLmYzMi51MzJcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlNIVE9EIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTAxMCwgMGIxMDExLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRJRCwgInZjdnQiLCAiLmY2NC5zMTZcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlVIVE9EIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTAxMSwgMGIxMDExLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRJRCwgInZjdnQiLCAiLmY2NC51MTZcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlNMVE9EIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTAxMCwgMGIxMDExLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRJRCwgInZjdnQiLCAiLmY2NC5zMzJcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCitkZWYgVlVMVE9EIDogQVZDb252MVhJPDBiMTExMDEsIDBiMTEsIDBiMTAxMSwgMGIxMDExLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRFBSOiRkc3QpLCAoaW5zIERQUjokYSwgaTMyaW1tOiRmYml0cyksDQorICAgICAgICAgICAgICAgICBJSUNfZnBDVlRJRCwgInZjdnQiLCAiLmY2NC51MzJcdCRkc3QsICRhLCAkZmJpdHMiLA0KKyAgICAgICAgICAgICAgICAgWy8qIEZvciBkaXNhc3NlbWJseSBvbmx5OyBwYXR0ZXJuIGxlZnQgYmxhbmsgKi9dPjsNCisNCit9IC8vIEVuZCBvZiAnbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiBpbicNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEZQIEZNQSBPcGVyYXRpb25zLg0KKy8vDQorDQorZGVmIFZNTEFEIDogQURiSV92bWxYPDBiMTExMDAsIDBiMDAsIDAsIDAsDQorICAgICAgICAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JGRzdGluLCBEUFI6JGEsIERQUjokYiksDQorICAgICAgICAgICAgICAgIElJQ19mcE1BQzY0LCAidm1sYSIsICIuZjY0XHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKGZhZGQgKGZtdWwgRFBSOiRhLCBEUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGY2NCBEUFI6JGRzdGluKSkpXT4sDQorICAgICAgICAgICAgICAgIFJlZ0NvbnN0cmFpbnQ8IiRkc3RpbiA9ICRkc3QiPjsNCisNCitkZWYgVk1MQVMgOiBBU2JJbjwwYjExMTAwLCAwYjAwLCAwLCAwLA0KKyAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokZHN0aW4sIFNQUjokYSwgU1BSOiRiKSwNCisgICAgICAgICAgICAgICAgIElJQ19mcE1BQzMyLCAidm1sYSIsICIuZjMyXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgU1BSOiRkc3QsIChmYWRkIChmbXVsIFNQUjokYSwgU1BSOiRiKSwgU1BSOiRkc3RpbikpXT4sDQorICAgICAgICAgICAgICAgICBSZWdDb25zdHJhaW50PCIkZHN0aW4gPSAkZHN0Ij47DQorDQorZGVmIFZOTUxTRCA6IEFEYklfdm1sWDwwYjExMTAwLCAwYjAxLCAwLCAwLA0KKyAgICAgICAgICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRkc3RpbiwgRFBSOiRhLCBEUFI6JGIpLA0KKyAgICAgICAgICAgICAgICBJSUNfZnBNQUM2NCwgInZubWxzIiwgIi5mNjRcdCRkc3QsICRhLCAkYiIsDQorICAgICAgICAgICAgICAgIFsoc2V0IERQUjokZHN0LCAoZnN1YiAoZm11bCBEUFI6JGEsIERQUjokYiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZjY0IERQUjokZHN0aW4pKSldPiwNCisgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJGRzdGluID0gJGRzdCI+Ow0KKw0KK2RlZiBWTk1MU1MgOiBBU2JJPDBiMTExMDAsIDBiMDEsIDAsIDAsDQorICAgICAgICAgICAgICAgIChvdXRzIFNQUjokZHN0KSwgKGlucyBTUFI6JGRzdGluLCBTUFI6JGEsIFNQUjokYiksDQorICAgICAgICAgICAgICAgIElJQ19mcE1BQzMyLCAidm5tbHMiLCAiLmYzMlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgICAgWyhzZXQgU1BSOiRkc3QsIChmc3ViIChmbXVsIFNQUjokYSwgU1BSOiRiKSwgU1BSOiRkc3RpbikpXT4sDQorICAgICAgICAgICAgICAgIFJlZ0NvbnN0cmFpbnQ8IiRkc3RpbiA9ICRkc3QiPjsNCisNCitkZWYgVk1MU0QgOiBBRGJJX3ZtbFg8MGIxMTEwMCwgMGIwMCwgMSwgMCwNCisgICAgICAgICAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JGRzdGluLCBEUFI6JGEsIERQUjokYiksDQorICAgICAgICAgICAgICAgICBJSUNfZnBNQUM2NCwgInZtbHMiLCAiLmY2NFx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgWyhzZXQgRFBSOiRkc3QsIChmYWRkIChmbmVnIChmbXVsIERQUjokYSwgRFBSOiRiKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZjY0IERQUjokZHN0aW4pKSldPiwNCisgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJGRzdGluID0gJGRzdCI+Ow0KKw0KK2RlZiBWTUxTUyA6IEFTYkluPDBiMTExMDAsIDBiMDAsIDEsIDAsDQorICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokZHN0aW4sIFNQUjokYSwgU1BSOiRiKSwNCisgICAgICAgICAgICAgICAgICBJSUNfZnBNQUMzMiwgInZtbHMiLCAiLmYzMlx0JGRzdCwgJGEsICRiIiwNCisgICAgICAgICAgICAgWyhzZXQgU1BSOiRkc3QsIChmYWRkIChmbmVnIChmbXVsIFNQUjokYSwgU1BSOiRiKSksIFNQUjokZHN0aW4pKV0+LA0KKyAgICAgICAgICAgICAgICBSZWdDb25zdHJhaW50PCIkZHN0aW4gPSAkZHN0Ij47DQorDQorZGVmIDogUGF0PChmc3ViIERQUjokZHN0aW4sIChmbXVsIERQUjokYSwgKGY2NCBEUFI6JGIpKSksDQorICAgICAgICAgIChWTUxTRCBEUFI6JGRzdGluLCBEUFI6JGEsIERQUjokYik+LCBSZXF1aXJlczxbRG9udFVzZU5FT05Gb3JGUF0+Ow0KK2RlZiA6IFBhdDwoZnN1YiBTUFI6JGRzdGluLCAoZm11bCBTUFI6JGEsIFNQUjokYikpLA0KKyAgICAgICAgICAoVk1MU1MgU1BSOiRkc3RpbiwgU1BSOiRhLCBTUFI6JGIpPiwgUmVxdWlyZXM8W0RvbnRVc2VORU9ORm9yRlBdPjsNCisNCitkZWYgVk5NTEFEIDogQURiSV92bWxYPDBiMTExMDAsIDBiMDEsIDEsIDAsDQorICAgICAgICAgICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRkc3RpbiwgRFBSOiRhLCBEUFI6JGIpLA0KKyAgICAgICAgICAgICAgICAgSUlDX2ZwTUFDNjQsICJ2bm1sYSIsICIuZjY0XHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgKGZzdWIgKGZuZWcgKGZtdWwgRFBSOiRhLCBEUFI6JGIpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmNjQgRFBSOiRkc3RpbikpKV0+LA0KKyAgICAgICAgICAgICAgICBSZWdDb25zdHJhaW50PCIkZHN0aW4gPSAkZHN0Ij47DQorDQorZGVmIFZOTUxBUyA6IEFTYkk8MGIxMTEwMCwgMGIwMSwgMSwgMCwNCisgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokZHN0aW4sIFNQUjokYSwgU1BSOiRiKSwNCisgICAgICAgICAgICAgICAgSUlDX2ZwTUFDMzIsICJ2bm1sYSIsICIuZjMyXHQkZHN0LCAkYSwgJGIiLA0KKyAgICAgICAgICAgICBbKHNldCBTUFI6JGRzdCwgKGZzdWIgKGZuZWcgKGZtdWwgU1BSOiRhLCBTUFI6JGIpKSwgU1BSOiRkc3RpbikpXT4sDQorICAgICAgICAgICAgICAgIFJlZ0NvbnN0cmFpbnQ8IiRkc3RpbiA9ICRkc3QiPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEZQIENvbmRpdGlvbmFsIG1vdmVzLg0KKy8vDQorDQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCitkZWYgVk1PVkRjYyAgOiBBRHVJPDBiMTExMDEsIDBiMTEsIDBiMDAwMCwgMGIwMSwgMCwNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIERQUjokZHN0KSwgKGlucyBEUFI6JGZhbHNlLCBEUFI6JHRydWUpLA0KKyAgICAgICAgICAgICAgICAgICAgSUlDX2ZwVU5BNjQsICJ2bW92IiwgIi5mNjRcdCRkc3QsICR0cnVlIiwNCisgICAgICAgICAgICAgICAgWy8qKHNldCBEUFI6JGRzdCwgKEFSTWNtb3YgRFBSOiRmYWxzZSwgRFBSOiR0cnVlLCBpbW06JGNjKSkqL10+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJGZhbHNlID0gJGRzdCI+Ow0KKw0KK2RlZiBWTU9WU2NjICA6IEFTdUk8MGIxMTEwMSwgMGIxMSwgMGIwMDAwLCAwYjAxLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgU1BSOiRkc3QpLCAoaW5zIFNQUjokZmFsc2UsIFNQUjokdHJ1ZSksDQorICAgICAgICAgICAgICAgICAgICBJSUNfZnBVTkEzMiwgInZtb3YiLCAiLmYzMlx0JGRzdCwgJHRydWUiLA0KKyAgICAgICAgICAgICAgICBbLyooc2V0IFNQUjokZHN0LCAoQVJNY21vdiBTUFI6JGZhbHNlLCBTUFI6JHRydWUsIGltbTokY2MpKSovXT4sDQorICAgICAgICAgICAgICAgICAgICBSZWdDb25zdHJhaW50PCIkZmFsc2UgPSAkZHN0Ij47DQorDQorZGVmIFZORUdEY2MgIDogQUR1STwwYjExMTAxLCAwYjExLCAwYjAwMDEsIDBiMDEsIDAsDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBEUFI6JGRzdCksIChpbnMgRFBSOiRmYWxzZSwgRFBSOiR0cnVlKSwNCisgICAgICAgICAgICAgICAgICAgIElJQ19mcFVOQTY0LCAidm5lZyIsICIuZjY0XHQkZHN0LCAkdHJ1ZSIsDQorICAgICAgICAgICAgICAgIFsvKihzZXQgRFBSOiRkc3QsIChBUk1jbmVnIERQUjokZmFsc2UsIERQUjokdHJ1ZSwgaW1tOiRjYykpKi9dPiwNCisgICAgICAgICAgICAgICAgICAgIFJlZ0NvbnN0cmFpbnQ8IiRmYWxzZSA9ICRkc3QiPjsNCisNCitkZWYgVk5FR1NjYyAgOiBBU3VJPDBiMTExMDEsIDBiMTEsIDBiMDAwMSwgMGIwMSwgMCwNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIFNQUjokZHN0KSwgKGlucyBTUFI6JGZhbHNlLCBTUFI6JHRydWUpLA0KKyAgICAgICAgICAgICAgICAgICAgSUlDX2ZwVU5BMzIsICJ2bmVnIiwgIi5mMzJcdCRkc3QsICR0cnVlIiwNCisgICAgICAgICAgICAgICAgWy8qKHNldCBTUFI6JGRzdCwgKEFSTWNuZWcgU1BSOiRmYWxzZSwgU1BSOiR0cnVlLCBpbW06JGNjKSkqL10+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJGZhbHNlID0gJGRzdCI+Ow0KK30gLy8gbmV2ZXJIYXNTaWRlRWZmZWN0cw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTWlzYy4NCisvLw0KKw0KKy8vIEFQU1IgaXMgdGhlIGFwcGxpY2F0aW9uIGxldmVsIGFsaWFzIG9mIENQU1IuIFRoaXMgRlBTQ1IgTiwgWiwgQywgViBmbGFncw0KKy8vIHRvIEFQU1IuDQorbGV0IERlZnMgPSBbQ1BTUl0sIFVzZXMgPSBbRlBTQ1JdIGluDQorZGVmIEZNU1RBVCA6IFZGUEFJPChvdXRzKSwgKGlucyksIFZGUE1pc2NGcm0sIElJQ19mcFNUQVQsICJ2bXJzIiwNCisgICAgICAgICAgICAgICAgICAgIlx0YXBzcl9uemN2LCBmcHNjciIsDQorICAgICAgICAgICAgIFsoYXJtX2Ztc3RhdCldPiB7DQorICBsZXQgSW5zdHsyNy0yMH0gPSAwYjExMTAxMTExOw0KKyAgbGV0IEluc3R7MTktMTZ9ID0gMGIwMDAxOw0KKyAgbGV0IEluc3R7MTUtMTJ9ID0gMGIxMTExOw0KKyAgbGV0IEluc3R7MTEtOH0gID0gMGIxMDEwOw0KKyAgbGV0IEluc3R7N30gICAgID0gMDsNCisgIGxldCBJbnN0ezR9ICAgICA9IDE7DQorfQ0KKw0KKy8vIEZQU0NSIDwtPiBHUFIgKGZvciBkaXNhc3NlbWJseSBvbmx5KQ0KK2xldCBoYXNTaWRlRWZmZWN0cyA9IDEsIFVzZXMgPSBbRlBTQ1JdIGluDQorZGVmIFZNUlMgOiBWRlBBSTwob3V0cyBHUFI6JGRzdCksIChpbnMpLCBWRlBNaXNjRnJtLCBJSUNfZnBTVEFULA0KKyAgICAgICAgICAgICAgICAgInZtcnMiLCAiXHQkZHN0LCBmcHNjciIsDQorICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoaW50X2FybV9nZXRfZnBzY3IpKV0+IHsNCisgIGxldCBJbnN0ezI3LTIwfSA9IDBiMTExMDExMTE7DQorICBsZXQgSW5zdHsxOS0xNn0gPSAwYjAwMDE7DQorICBsZXQgSW5zdHsxMS04fSAgPSAwYjEwMTA7DQorICBsZXQgSW5zdHs3fSAgICAgPSAwOw0KKyAgbGV0IEluc3R7NH0gICAgID0gMTsNCit9DQorDQorbGV0IERlZnMgPSBbRlBTQ1JdIGluIA0KK2RlZiBWTVNSIDogVkZQQUk8KG91dHMpLCAoaW5zIEdQUjokc3JjKSwgVkZQTWlzY0ZybSwgSUlDX2ZwU1RBVCwgDQorICAgICAgICAgICAgICAgICAidm1zciIsICJcdGZwc2NyLCAkc3JjIiwNCisgICAgICAgICAgICAgWyhpbnRfYXJtX3NldF9mcHNjciBHUFI6JHNyYyldPiB7DQorICBsZXQgSW5zdHsyNy0yMH0gPSAwYjExMTAxMTEwOw0KKyAgbGV0IEluc3R7MTktMTZ9ID0gMGIwMDAxOw0KKyAgbGV0IEluc3R7MTEtOH0gID0gMGIxMDEwOw0KKyAgbGV0IEluc3R7N30gICAgID0gMDsNCisgIGxldCBJbnN0ezR9ICAgICA9IDE7DQorfQ0KKw0KKy8vIE1hdGVyaWFsaXplIEZQIGltbWVkaWF0ZXMuIFZGUDMgb25seS4NCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbiB7DQorZGVmIEZDT05TVEQgOiBWRlBBSTwob3V0cyBEUFI6JGRzdCksIChpbnMgdmZwX2Y2NGltbTokaW1tKSwNCisgICAgICAgICAgICAgICAgICAgIFZGUE1pc2NGcm0sIElJQ19mcFVOQTY0LA0KKyAgICAgICAgICAgICAgICAgICAgInZtb3YiLCAiLmY2NFx0JGRzdCwgJGltbSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBEUFI6JGRzdCwgdmZwX2Y2NGltbTokaW1tKV0+LCBSZXF1aXJlczxbSGFzVkZQM10+IHsNCisgIGxldCBJbnN0ezI3LTIzfSA9IDBiMTExMDE7DQorICBsZXQgSW5zdHsyMS0yMH0gPSAwYjExOw0KKyAgbGV0IEluc3R7MTEtOX0gID0gMGIxMDE7DQorICBsZXQgSW5zdHs4fSAgICAgPSAxOw0KKyAgbGV0IEluc3R7Ny00fSAgID0gMGIwMDAwOw0KK30NCisNCitkZWYgRkNPTlNUUyA6IFZGUEFJPChvdXRzIFNQUjokZHN0KSwgKGlucyB2ZnBfZjMyaW1tOiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgVkZQTWlzY0ZybSwgSUlDX2ZwVU5BMzIsDQorICAgICAgICAgICAgICAgICAgICAidm1vdiIsICIuZjMyXHQkZHN0LCAkaW1tIiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFNQUjokZHN0LCB2ZnBfZjMyaW1tOiRpbW0pXT4sIFJlcXVpcmVzPFtIYXNWRlAzXT4gew0KKyAgbGV0IEluc3R7MjctMjN9ID0gMGIxMTEwMTsNCisgIGxldCBJbnN0ezIxLTIwfSA9IDBiMTE7DQorICBsZXQgSW5zdHsxMS05fSAgPSAwYjEwMTsNCisgIGxldCBJbnN0ezh9ICAgICA9IDA7DQorICBsZXQgSW5zdHs3LTR9ICAgPSAwYjAwMDA7DQorfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1KSVRJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUpJVEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNmQ3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1KSVRJbmZvLmNwcApAQCAtMCwwICsxLDMzNSBAQAorLy89PT0tLSBBUk1KSVRJbmZvLmNwcCAtIEltcGxlbWVudCB0aGUgSklUIGludGVyZmFjZXMgZm9yIHRoZSBBUk0gdGFyZ2V0IC0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgSklUIGludGVyZmFjZXMgZm9yIHRoZSBBUk0gdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiaml0IgorI2luY2x1ZGUgIkFSTUpJVEluZm8uaCIKKyNpbmNsdWRlICJBUk1JbnN0ckluZm8uaCIKKyNpbmNsdWRlICJBUk1Db25zdGFudFBvb2xWYWx1ZS5oIgorI2luY2x1ZGUgIkFSTVJlbG9jYXRpb25zLmgiCisjaW5jbHVkZSAiQVJNU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9KSVRDb2RlRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTWVtb3J5LmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCit2b2lkIEFSTUpJVEluZm86OnJlcGxhY2VNYWNoaW5lQ29kZUZvckZ1bmN0aW9uKHZvaWQgKk9sZCwgdm9pZCAqTmV3KSB7CisgIHJlcG9ydF9mYXRhbF9lcnJvcigiQVJNSklUSW5mbzo6cmVwbGFjZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24iKTsKK30KKworLy8vIEpJVENvbXBpbGVyRnVuY3Rpb24gLSBUaGlzIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBKSVQgZnVuY3Rpb24gdXNlZCB0bworLy8vIGNvbXBpbGUgYSBmdW5jdGlvbiBsYXppbHkuCitzdGF0aWMgVGFyZ2V0SklUSW5mbzo6SklUQ29tcGlsZXJGbiBKSVRDb21waWxlckZ1bmN0aW9uOworCisvLyBHZXQgdGhlIEFTTVBSRUZJWCBmb3IgdGhlIGN1cnJlbnQgaG9zdC4gIFRoaXMgaXMgb2Z0ZW4gJ18nLgorI2lmbmRlZiBfX1VTRVJfTEFCRUxfUFJFRklYX18KKyNkZWZpbmUgX19VU0VSX0xBQkVMX1BSRUZJWF9fCisjZW5kaWYKKyNkZWZpbmUgR0VUQVNNUFJFRklYMihYKSAjWAorI2RlZmluZSBHRVRBU01QUkVGSVgoWCkgR0VUQVNNUFJFRklYMihYKQorI2RlZmluZSBBU01QUkVGSVggR0VUQVNNUFJFRklYKF9fVVNFUl9MQUJFTF9QUkVGSVhfXykKKworLy8gQ29tcGlsYXRpb25DYWxsYmFjayBzdHViIC0gV2UgY2FuJ3QgdXNlIGEgQyBmdW5jdGlvbiB3aXRoIGlubGluZSBhc3NlbWJseSBpbgorLy8gaXQsIGJlY2F1c2Ugd2UgdGhlIHByb2xvZy9lcGlsb2cgaW5zZXJ0ZWQgYnkgR0NDIHdvbid0IHdvcmsgZm9yIHVzICh3ZSBuZWVkCisvLyB0byBwcmVzZXJ2ZSBtb3JlIGNvbnRleHQgYW5kIG1hbmlwdWxhdGUgdGhlIHN0YWNrIGRpcmVjdGx5KS4gIEluc3RlYWQsCisvLyB3cml0ZSBvdXIgb3duIHdyYXBwZXIsIHdoaWNoIGRvZXMgdGhpbmdzIG91ciB3YXksIHNvIHdlIGhhdmUgY29tcGxldGUKKy8vIGNvbnRyb2wgb3ZlciByZWdpc3RlciBzYXZpbmcgYW5kIHJlc3RvcmluZy4KK2V4dGVybiAiQyIgeworI2lmIGRlZmluZWQoX19hcm1fXykKKyAgdm9pZCBBUk1Db21waWxhdGlvbkNhbGxiYWNrKCk7CisgIGFzbSgKKyAgICAiLnRleHRcbiIKKyAgICAiLmFsaWduIDJcbiIKKyAgICAiLmdsb2JsICIgQVNNUFJFRklYICJBUk1Db21waWxhdGlvbkNhbGxiYWNrXG4iCisgICAgQVNNUFJFRklYICJBUk1Db21waWxhdGlvbkNhbGxiYWNrOlxuIgorICAgIC8vIFNhdmUgY2FsbGVyIHNhdmVkIHJlZ2lzdGVycyBzaW5jZSB0aGV5IG1heSBjb250YWluIHN0dWZmCisgICAgLy8gZm9yIHRoZSByZWFsIHRhcmdldCBmdW5jdGlvbiByaWdodCBub3cuIFdlIGhhdmUgdG8gYWN0IGFzIGlmIHRoaXMKKyAgICAvLyB3aG9sZSBjb21waWxhdGlvbiBjYWxsYmFjayBkb2Vzbid0IGV4aXN0IGFzIGZhciBhcyB0aGUgY2FsbGVyIGlzCisgICAgLy8gY29uY2VybmVkLCBzbyB3ZSBjYW4ndCBqdXN0IHByZXNlcnZlIHRoZSBjYWxsZWUgc2F2ZWQgcmVncy4KKyAgICAic3RtZGIgc3AhLCB7cjAsIHIxLCByMiwgcjMsIGxyfVxuIgorI2lmIChkZWZpbmVkKF9fVkZQX0ZQX18pICYmICFkZWZpbmVkKF9fU09GVEZQX18pKQorICAgICJmc3RtZmRkIHNwISwge2QwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkN31cbiIKKyNlbmRpZgorICAgIC8vIFRoZSBMUiBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3R1YiBmdW5jdGlvbiBvbiBlbnRyeS4KKyAgICAvLyBwYXNzIGl0IGFzIHRoZSBhcmd1bWVudCB0byB0aGUgQyBwYXJ0IG9mIHRoZSBjYWxsYmFjaworICAgICJtb3YgIHIwLCBsclxuIgorICAgICJzdWIgIHNwLCBzcCwgIzRcbiIKKyAgICAvLyBDYWxsIHRoZSBDIHBvcnRpb24gb2YgdGhlIGNhbGxiYWNrCisgICAgImJsICAgIiBBU01QUkVGSVggIkFSTUNvbXBpbGF0aW9uQ2FsbGJhY2tDXG4iCisgICAgImFkZCAgc3AsIHNwLCAjNFxuIgorICAgIC8vIFJlc3RvcmluZyB0aGUgTFIgdG8gdGhlIHJldHVybiBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGludm9rZWQKKyAgICAvLyB0aGUgc3R1YiBhbmQgZGUtYWxsb2NhdGluZyB0aGUgc3RhY2sgc3BhY2UgZm9yIGl0IHJlcXVpcmVzIHVzIHRvCisgICAgLy8gc3dhcCB0aGUgdHdvIHNhdmVkIExSIHZhbHVlcyBvbiB0aGUgc3RhY2ssIGFzIHRoZXkncmUgYmFja3dhcmRzCisgICAgLy8gZm9yIHdoYXQgd2UgbmVlZCBzaW5jZSB0aGUgcG9wIGluc3RydWN0aW9uIGhhcyBhIHByZS1kZXRlcm1pbmVkCisgICAgLy8gb3JkZXIgZm9yIHRoZSByZWdpc3RlcnMuCisgICAgLy8gICAgICArLS0tLS0tLS0rCisgICAgLy8gICAwICB8IExSICAgICB8IE9yaWdpbmFsIHJldHVybiBhZGRyZXNzCisgICAgLy8gICAgICArLS0tLS0tLS0rCisgICAgLy8gICAxICB8IExSICAgICB8IFN0dWIgYWRkcmVzcyAoc3RhcnQgb2Ygc3R1YikKKyAgICAvLyAyLTUgIHwgUjMuLlIwIHwgU2F2ZWQgcmVnaXN0ZXJzICh3ZSBuZWVkIHRvIHByZXNlcnZlIGFsbCByZWdzKQorICAgIC8vIDYtMjAgfCBEMC4uRDcgfCBTYXZlZCBWRlAgcmVnaXN0ZXJzCisgICAgLy8gICAgICArLS0tLS0tLS0rCisgICAgLy8KKyNpZiAoZGVmaW5lZChfX1ZGUF9GUF9fKSAmJiAhZGVmaW5lZChfX1NPRlRGUF9fKSkKKyAgICAvLyBSZXN0b3JlIFZGUCBjYWxsZXItc2F2ZWQgcmVnaXN0ZXJzLgorICAgICJmbGRtZmRkIHNwISwge2QwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkN31cbiIKKyNlbmRpZgorICAgIC8vCisgICAgLy8gICAgICBXZSBuZWVkIHRvIGV4Y2hhbmdlIHRoZSB2YWx1ZXMgaW4gc2xvdHMgMCBhbmQgMSBzbyB3ZSBjYW4KKyAgICAvLyAgICAgIHJldHVybiB0byB0aGUgYWRkcmVzcyBpbiBzbG90IDEgd2l0aCB0aGUgYWRkcmVzcyBpbiBzbG90IDAKKyAgICAvLyAgICAgIHJlc3RvcmVkIHRvIHRoZSBMUi4KKyAgICAibGRyICByMCwgW3NwLCMyMF1cbiIKKyAgICAibGRyICByMSwgW3NwLCMxNl1cbiIKKyAgICAic3RyICByMSwgW3NwLCMyMF1cbiIKKyAgICAic3RyICByMCwgW3NwLCMxNl1cbiIKKyAgICAvLyBSZXR1cm4gdG8gdGhlIChuZXdseSBtb2RpZmllZCkgc3R1YiB0byBpbnZva2UgdGhlIHJlYWwgZnVuY3Rpb24uCisgICAgLy8gVGhlIGFib3ZlIHR3aWRkbGluZyBvZiB0aGUgc2F2ZWQgcmV0dXJuIGFkZHJlc3NlcyBhbGxvd3MgdXMgdG8KKyAgICAvLyBkZWFsbG9jYXRlIGV2ZXJ5dGhpbmcsIGluY2x1ZGluZyB0aGUgTFIgdGhlIHN0dWIgc2F2ZWQsIGFsbCBpbiBvbmUKKyAgICAvLyBwb3AgaW5zdHJ1Y3Rpb24uCisgICAgImxkbWlhICBzcCEsIHtyMCwgcjEsIHIyLCByMywgbHIsIHBjfVxuIgorICAgICAgKTsKKyNlbHNlICAvLyBOb3QgYW4gQVJNIGhvc3QKKyAgdm9pZCBBUk1Db21waWxhdGlvbkNhbGxiYWNrKCkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIkNhbm5vdCBjYWxsIEFSTUNvbXBpbGF0aW9uQ2FsbGJhY2soKSBvbiBhIG5vbi1BUk0gYXJjaCEiKTsKKyAgfQorI2VuZGlmCit9CisKKy8vLyBBUk1Db21waWxhdGlvbkNhbGxiYWNrQyAtIFRoaXMgaXMgdGhlIHRhcmdldC1zcGVjaWZpYyBmdW5jdGlvbiBpbnZva2VkCisvLy8gYnkgdGhlIGZ1bmN0aW9uIHN0dWIgd2hlbiB3ZSBkaWQgbm90IGtub3cgdGhlIHJlYWwgdGFyZ2V0IG9mIGEgY2FsbC4KKy8vLyBUaGlzIGZ1bmN0aW9uIG11c3QgbG9jYXRlIHRoZSBzdGFydCBvZiB0aGUgc3R1YiBvciBjYWxsIHNpdGUgYW5kIHBhc3MKKy8vLyBpdCBpbnRvIHRoZSBKSVQgY29tcGlsZXIgZnVuY3Rpb24uCitleHRlcm4gIkMiIHZvaWQgQVJNQ29tcGlsYXRpb25DYWxsYmFja0MoaW50cHRyX3QgU3R1YkFkZHIpIHsKKyAgLy8gR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBjb21waWxlZCBjb2RlIGZvciB0aGlzIGZ1bmN0aW9uLgorICBpbnRwdHJfdCBOZXdWYWwgPSAoaW50cHRyX3QpSklUQ29tcGlsZXJGdW5jdGlvbigodm9pZCopU3R1YkFkZHIpOworCisgIC8vIFJld3JpdGUgdGhlIGNhbGwgdGFyZ2V0Li4uIHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIGhlcmUgZXZlcnkgdGltZSB3ZQorICAvLyBleGVjdXRlIHRoZSBjYWxsLiBXZSdyZSByZXBsYWNpbmcgdGhlIGZpcnN0IHR3byBpbnN0cnVjdGlvbnMgb2YgdGhlCisgIC8vIHN0dWIgd2l0aDoKKyAgLy8gICBsZHIgcGMsIFtwYywjLTRdCisgIC8vICAgPGFkZHI+CisgIGlmICghc3lzOjpNZW1vcnk6OnNldFJhbmdlV3JpdGFibGUoKHZvaWQqKVN0dWJBZGRyLCA4KSkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIkVSUk9SOiBVbmFibGUgdG8gbWFyayBzdHViIHdyaXRhYmxlIik7CisgIH0KKyAgKihpbnRwdHJfdCAqKVN0dWJBZGRyID0gMHhlNTFmZjAwNDsgIC8vIGxkciBwYywgW3BjLCAjLTRdCisgICooaW50cHRyX3QgKikoU3R1YkFkZHIrNCkgPSBOZXdWYWw7CisgIGlmICghc3lzOjpNZW1vcnk6OnNldFJhbmdlRXhlY3V0YWJsZSgodm9pZCopU3R1YkFkZHIsIDgpKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiRVJST1I6IFVuYWJsZSB0byBtYXJrIHN0dWIgZXhlY3V0YWJsZSIpOworICB9Cit9CisKK1RhcmdldEpJVEluZm86OkxhenlSZXNvbHZlckZuCitBUk1KSVRJbmZvOjpnZXRMYXp5UmVzb2x2ZXJGdW5jdGlvbihKSVRDb21waWxlckZuIEYpIHsKKyAgSklUQ29tcGlsZXJGdW5jdGlvbiA9IEY7CisgIHJldHVybiBBUk1Db21waWxhdGlvbkNhbGxiYWNrOworfQorCit2b2lkICpBUk1KSVRJbmZvOjplbWl0R2xvYmFsVmFsdWVJbmRpcmVjdFN5bShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIHZvaWQgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpIHsKKyAgdWludDhfdCBCdWZmZXJbNF07CisgIHVpbnQ4X3QgKkN1ciA9IEJ1ZmZlcjsKKyAgTWFjaGluZUNvZGVFbWl0dGVyOjplbWl0V29yZExFSW50byhDdXIsIChpbnRwdHJfdClQdHIpOworICB2b2lkICpQdHJBZGRyID0gSkNFLmFsbG9jSW5kaXJlY3RHVigKKyAgICAgIEdWLCBCdWZmZXIsIHNpemVvZihCdWZmZXIpLCAvKkFsaWdubWVudD0qLzQpOworICBhZGRJbmRpcmVjdFN5bUFkZHIoUHRyLCAoaW50cHRyX3QpUHRyQWRkcik7CisgIHJldHVybiBQdHJBZGRyOworfQorCitUYXJnZXRKSVRJbmZvOjpTdHViTGF5b3V0IEFSTUpJVEluZm86OmdldFN0dWJMYXlvdXQoKSB7CisgIC8vIFRoZSBzdHViIGNvbnRhaW5zIHVwIHRvIDMgNC1ieXRlIGluc3RydWN0aW9ucywgYWxpZ25lZCBhdCA0IGJ5dGVzLCBhbmQgYQorICAvLyA0LWJ5dGUgYWRkcmVzcy4gIFNlZSBlbWl0RnVuY3Rpb25TdHViIGZvciBkZXRhaWxzLgorICBTdHViTGF5b3V0IFJlc3VsdCA9IHsxNiwgNH07CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK3ZvaWQgKkFSTUpJVEluZm86OmVtaXRGdW5jdGlvblN0dWIoY29uc3QgRnVuY3Rpb24qIEYsIHZvaWQgKkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRDb2RlRW1pdHRlciAmSkNFKSB7CisgIHZvaWQgKkFkZHI7CisgIC8vIElmIHRoaXMgaXMganVzdCBhIGNhbGwgdG8gYW4gZXh0ZXJuYWwgZnVuY3Rpb24sIGVtaXQgYSBicmFuY2ggaW5zdGVhZCBvZiBhCisgIC8vIGNhbGwuICBUaGUgY29kZSBpcyB0aGUgc2FtZSBleGNlcHQgZm9yIG9uZSBiaXQgb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgIGlmIChGbiAhPSAodm9pZCopKGludHB0cl90KUFSTUNvbXBpbGF0aW9uQ2FsbGJhY2spIHsKKyAgICAvLyBCcmFuY2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gYWRkci4KKyAgICBpZiAoSXNQSUMpIHsKKyAgICAgIC8vIFRoZSBzdHViIGlzIDE2LWJ5dGUgc2l6ZSBhbmQgNC1hbGlnbmVkLgorICAgICAgaW50cHRyX3QgTGF6eVB0ciA9IGdldEluZGlyZWN0U3ltQWRkcihGbik7CisgICAgICBpZiAoIUxhenlQdHIpIHsKKyAgICAgICAgLy8gSW4gUElDIG1vZGUsIHRoZSBmdW5jdGlvbiBzdHViIGlzIGxvYWRpbmcgYSBsYXp5LXB0ci4KKyAgICAgICAgTGF6eVB0cj0gKGludHB0cl90KWVtaXRHbG9iYWxWYWx1ZUluZGlyZWN0U3ltKChHbG9iYWxWYWx1ZSopRiwgRm4sIEpDRSk7CisgICAgICAgIERFQlVHKGlmIChGKQorICAgICAgICAgICAgICAgIGVycnMoKSA8PCAiSklUOiBJbmRpcmVjdCBzeW1ib2wgZW1pdHRlZCBhdCBbIiA8PCBMYXp5UHRyCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdIGZvciBHViAnIiA8PCBGLT5nZXROYW1lKCkgPDwgIidcbiI7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnJzKCkgPDwgIkpJVDogU3R1YiBlbWl0dGVkIGF0IFsiIDw8IExhenlQdHIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIl0gZm9yIGV4dGVybmFsIGZ1bmN0aW9uIGF0ICciIDw8IEZuIDw8ICInXG4iKTsKKyAgICAgIH0KKyAgICAgIEpDRS5lbWl0QWxpZ25tZW50KDQpOworICAgICAgQWRkciA9ICh2b2lkKilKQ0UuZ2V0Q3VycmVudFBDVmFsdWUoKTsKKyAgICAgIGlmICghc3lzOjpNZW1vcnk6OnNldFJhbmdlV3JpdGFibGUoQWRkciwgMTYpKSB7CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkVSUk9SOiBVbmFibGUgdG8gbWFyayBzdHViIHdyaXRhYmxlIik7CisgICAgICB9CisgICAgICBKQ0UuZW1pdFdvcmRMRSgweGU1OWZjMDA0KTsgICAgICAgICAgICAvLyBsZHIgaXAsIFtwYywgIys0XQorICAgICAgSkNFLmVtaXRXb3JkTEUoMHhlMDhmYzAwYyk7ICAgICAgICAgICAgLy8gTF9mdW5jJHNjdjogYWRkIGlwLCBwYywgaXAKKyAgICAgIEpDRS5lbWl0V29yZExFKDB4ZTU5Y2YwMDApOyAgICAgICAgICAgIC8vIGxkciBwYywgW2lwXQorICAgICAgSkNFLmVtaXRXb3JkTEUoTGF6eVB0ciAtIChpbnRwdHJfdChBZGRyKSs0KzgpKTsgIC8vIGZ1bmMgLSAoTF9mdW5jJHNjdis4KQorICAgICAgc3lzOjpNZW1vcnk6OkludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKEFkZHIsIDE2KTsKKyAgICAgIGlmICghc3lzOjpNZW1vcnk6OnNldFJhbmdlRXhlY3V0YWJsZShBZGRyLCAxNikpIHsKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiRVJST1I6IFVuYWJsZSB0byBtYXJrIHN0dWIgZXhlY3V0YWJsZSIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgc3R1YiBpcyA4LWJ5dGUgc2l6ZSBhbmQgNC1hbGlnbmVkLgorICAgICAgSkNFLmVtaXRBbGlnbm1lbnQoNCk7CisgICAgICBBZGRyID0gKHZvaWQqKUpDRS5nZXRDdXJyZW50UENWYWx1ZSgpOworICAgICAgaWYgKCFzeXM6Ok1lbW9yeTo6c2V0UmFuZ2VXcml0YWJsZShBZGRyLCA4KSkgeworICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJFUlJPUjogVW5hYmxlIHRvIG1hcmsgc3R1YiB3cml0YWJsZSIpOworICAgICAgfQorICAgICAgSkNFLmVtaXRXb3JkTEUoMHhlNTFmZjAwNCk7ICAgIC8vIGxkciBwYywgW3BjLCAjLTRdCisgICAgICBKQ0UuZW1pdFdvcmRMRSgoaW50cHRyX3QpRm4pOyAgLy8gYWRkciBvZiBmdW5jdGlvbgorICAgICAgc3lzOjpNZW1vcnk6OkludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKEFkZHIsIDgpOworICAgICAgaWYgKCFzeXM6Ok1lbW9yeTo6c2V0UmFuZ2VFeGVjdXRhYmxlKEFkZHIsIDgpKSB7CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkVSUk9SOiBVbmFibGUgdG8gbWFyayBzdHViIGV4ZWN1dGFibGUiKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIGNvbXBpbGF0aW9uIGNhbGxiYWNrIHdpbGwgb3ZlcndyaXRlIHRoZSBmaXJzdCB0d28gd29yZHMgb2YgdGhpcworICAgIC8vIHN0dWIgd2l0aCBpbmRpcmVjdCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHRhcmdldGluZyB0aGUgY29tcGlsZWQgY29kZS4KKyAgICAvLyBUaGlzIHN0dWIgc2V0cyB0aGUgcmV0dXJuIGFkZHJlc3MgdG8gcmVzdGFydCB0aGUgc3R1Yiwgc28gdGhhdAorICAgIC8vIHRoZSBuZXcgYnJhbmNoIHdpbGwgYmUgaW52b2tlZCB3aGVuIHdlIGNvbWUgYmFjay4KKyAgICAvLworICAgIC8vIEJyYW5jaCBhbmQgbGluayB0byB0aGUgY29tcGlsYXRpb24gY2FsbGJhY2suCisgICAgLy8gVGhlIHN0dWIgaXMgMTYtYnl0ZSBzaXplIGFuZCA0LWJ5dGUgYWxpZ25lZC4KKyAgICBKQ0UuZW1pdEFsaWdubWVudCg0KTsKKyAgICBBZGRyID0gKHZvaWQqKUpDRS5nZXRDdXJyZW50UENWYWx1ZSgpOworICAgIGlmICghc3lzOjpNZW1vcnk6OnNldFJhbmdlV3JpdGFibGUoQWRkciwgMTYpKSB7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJFUlJPUjogVW5hYmxlIHRvIG1hcmsgc3R1YiB3cml0YWJsZSIpOworICAgIH0KKyAgICAvLyBTYXZlIExSIHNvIHRoZSBjYWxsYmFjayBjYW4gZGV0ZXJtaW5lIHdoaWNoIHN0dWIgY2FsbGVkIGl0LgorICAgIC8vIFRoZSBjb21waWxhdGlvbiBjYWxsYmFjayBpcyByZXNwb25zaWJsZSBmb3IgcG9wcGluZyB0aGlzIHByaW9yCisgICAgLy8gdG8gcmV0dXJuaW5nLgorICAgIEpDRS5lbWl0V29yZExFKDB4ZTkyZDQwMDApOyAvLyBwdXNoIHtscn0KKyAgICAvLyBTZXQgdGhlIHJldHVybiBhZGRyZXNzIHRvIGdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgc3R1Yi4KKyAgICBKQ0UuZW1pdFdvcmRMRSgweGUyNGZlMDBjKTsgLy8gc3ViIGxyLCBwYywgIzEyCisgICAgLy8gSW52b2tlIHRoZSBjb21waWxhdGlvbiBjYWxsYmFjay4KKyAgICBKQ0UuZW1pdFdvcmRMRSgweGU1MWZmMDA0KTsgLy8gbGRyIHBjLCBbcGMsICMtNF0KKyAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24gY2FsbGJhY2suCisgICAgSkNFLmVtaXRXb3JkTEUoKGludHB0cl90KUFSTUNvbXBpbGF0aW9uQ2FsbGJhY2spOworICAgIHN5czo6TWVtb3J5OjpJbnZhbGlkYXRlSW5zdHJ1Y3Rpb25DYWNoZShBZGRyLCAxNik7CisgICAgaWYgKCFzeXM6Ok1lbW9yeTo6c2V0UmFuZ2VFeGVjdXRhYmxlKEFkZHIsIDE2KSkgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiRVJST1I6IFVuYWJsZSB0byBtYXJrIHN0dWIgZXhlY3V0YWJsZSIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBBZGRyOworfQorCitpbnRwdHJfdCBBUk1KSVRJbmZvOjpyZXNvbHZlUmVsb2NEZXN0QWRkcihNYWNoaW5lUmVsb2NhdGlvbiAqTVIpIGNvbnN0IHsKKyAgQVJNOjpSZWxvY2F0aW9uVHlwZSBSVCA9IChBUk06OlJlbG9jYXRpb25UeXBlKU1SLT5nZXRSZWxvY2F0aW9uVHlwZSgpOworICBzd2l0Y2ggKFJUKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIChpbnRwdHJfdCkoTVItPmdldFJlc3VsdFBvaW50ZXIoKSk7CisgIGNhc2UgQVJNOjpyZWxvY19hcm1fcGljX2p0OgorICAgIC8vIERlc3RpbmF0aW9uIGFkZHJlc3MgLSBqdW1wIHRhYmxlIGJhc2UuCisgICAgcmV0dXJuIChpbnRwdHJfdCkoTVItPmdldFJlc3VsdFBvaW50ZXIoKSkgLSBNUi0+Z2V0Q29uc3RhbnRWYWwoKTsKKyAgY2FzZSBBUk06OnJlbG9jX2FybV9qdF9iYXNlOgorICAgIC8vIEp1bXAgdGFibGUgYmFzZSBhZGRyZXNzLgorICAgIHJldHVybiBnZXRKdW1wVGFibGVCYXNlQWRkcihNUi0+Z2V0SnVtcFRhYmxlSW5kZXgoKSk7CisgIGNhc2UgQVJNOjpyZWxvY19hcm1fY3BfZW50cnk6CisgIGNhc2UgQVJNOjpyZWxvY19hcm1fdmZwX2NwX2VudHJ5OgorICAgIC8vIENvbnN0YW50IHBvb2wgZW50cnkgYWRkcmVzcy4KKyAgICByZXR1cm4gZ2V0Q29uc3RhbnRQb29sRW50cnlBZGRyKE1SLT5nZXRDb25zdGFudFBvb2xJbmRleCgpKTsKKyAgY2FzZSBBUk06OnJlbG9jX2FybV9tYWNoaW5lX2NwX2VudHJ5OiB7CisgICAgQVJNQ29uc3RhbnRQb29sVmFsdWUgKkFDUFYgPSAoQVJNQ29uc3RhbnRQb29sVmFsdWUqKU1SLT5nZXRDb25zdGFudFZhbCgpOworICAgIGFzc2VydCgoIUFDUFYtPmhhc01vZGlmaWVyKCkgJiYgIUFDUFYtPm11c3RBZGRDdXJyZW50QWRkcmVzcygpKSAmJgorICAgICAgICAgICAiQ2FuJ3QgaGFuZGxlIHRoaXMgbWFjaGluZSBjb25zdGFudCBwb29sIGVudHJ5IHlldCEiKTsKKyAgICBpbnRwdHJfdCBBZGRyID0gKGludHB0cl90KShNUi0+Z2V0UmVzdWx0UG9pbnRlcigpKTsKKyAgICBBZGRyIC09IGdldFBDTGFiZWxBZGRyKEFDUFYtPmdldExhYmVsSWQoKSkgKyBBQ1BWLT5nZXRQQ0FkanVzdG1lbnQoKTsKKyAgICByZXR1cm4gQWRkcjsKKyAgfQorICB9Cit9CisKKy8vLyByZWxvY2F0ZSAtIEJlZm9yZSB0aGUgSklUIGNhbiBydW4gYSBibG9jayBvZiBjb2RlIHRoYXQgaGFzIGJlZW4gZW1pdHRlZCwKKy8vLyBpdCBtdXN0IHJld3JpdGUgdGhlIGNvZGUgdG8gY29udGFpbiB0aGUgYWN0dWFsIGFkZHJlc3NlcyBvZiBhbnkKKy8vLyByZWZlcmVuY2VkIGdsb2JhbCBzeW1ib2xzLgordm9pZCBBUk1KSVRJbmZvOjpyZWxvY2F0ZSh2b2lkICpGdW5jdGlvbiwgTWFjaGluZVJlbG9jYXRpb24gKk1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZWxvY3MsIHVuc2lnbmVkIGNoYXIqIEdPVEJhc2UpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1SZWxvY3M7ICsraSwgKytNUikgeworICAgIHZvaWQgKlJlbG9jUG9zID0gKGNoYXIqKUZ1bmN0aW9uICsgTVItPmdldE1hY2hpbmVDb2RlT2Zmc2V0KCk7CisgICAgaW50cHRyX3QgUmVzdWx0UHRyID0gcmVzb2x2ZVJlbG9jRGVzdEFkZHIoTVIpOworICAgIHN3aXRjaCAoKEFSTTo6UmVsb2NhdGlvblR5cGUpTVItPmdldFJlbG9jYXRpb25UeXBlKCkpIHsKKyAgICBjYXNlIEFSTTo6cmVsb2NfYXJtX2NwX2VudHJ5OgorICAgIGNhc2UgQVJNOjpyZWxvY19hcm1fdmZwX2NwX2VudHJ5OgorICAgIGNhc2UgQVJNOjpyZWxvY19hcm1fcmVsYXRpdmU6IHsKKyAgICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgUEMgcmVsYXRpdmUgdmFsdWUuIFdlCisgICAgICAvLyBzdWJ0cmFjdCB0aGUgYmFzZSBhZGRyIGZyb20gdGhlIHRhcmdldCBhZGRyIHRvIGZvcm0gYSBieXRlIG9mZnNldC4KKyAgICAgIFJlc3VsdFB0ciA9IFJlc3VsdFB0ciAtIChpbnRwdHJfdClSZWxvY1BvcyAtIDg7CisgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHBvc2l0aXZlLCBzZXQgYml0IFUoMjMpIHRvIDEuCisgICAgICBpZiAoUmVzdWx0UHRyID49IDApCisgICAgICAgICooKGludHB0cl90KilSZWxvY1BvcykgfD0gMSA8PCBBUk1JSTo6VV9CaXRTaGlmdDsKKyAgICAgIGVsc2UgeworICAgICAgICAvLyBPdGhlcndpc2UsIG9idGFpbiB0aGUgYWJzb2x1dGUgdmFsdWUgYW5kIHNldCBiaXQgVSgyMykgdG8gMC4KKyAgICAgICAgKigoaW50cHRyX3QqKVJlbG9jUG9zKSAmPSB+KDEgPDwgQVJNSUk6OlVfQml0U2hpZnQpOworICAgICAgICBSZXN1bHRQdHIgPSAtIFJlc3VsdFB0cjsKKyAgICAgIH0KKyAgICAgIC8vIFNldCB0aGUgaW1tZWQgdmFsdWUgY2FsY3VsYXRlZC4KKyAgICAgIC8vIFZGUCBpbW1lZGlhdGUgb2Zmc2V0IGlzIG11bHRpcGxpZWQgYnkgNC4KKyAgICAgIGlmIChNUi0+Z2V0UmVsb2NhdGlvblR5cGUoKSA9PSBBUk06OnJlbG9jX2FybV92ZnBfY3BfZW50cnkpCisgICAgICAgIFJlc3VsdFB0ciA9IFJlc3VsdFB0ciA+PiAyOworICAgICAgKigoaW50cHRyX3QqKVJlbG9jUG9zKSB8PSBSZXN1bHRQdHI7CisgICAgICAvLyBTZXQgcmVnaXN0ZXIgUm4gdG8gUEMuCisgICAgICAqKChpbnRwdHJfdCopUmVsb2NQb3MpIHw9CisgICAgICAgIEFSTVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoQVJNOjpQQykgPDwgQVJNSUk6OlJlZ1JuU2hpZnQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBUk06OnJlbG9jX2FybV9waWNfanQ6CisgICAgY2FzZSBBUk06OnJlbG9jX2FybV9tYWNoaW5lX2NwX2VudHJ5OgorICAgIGNhc2UgQVJNOjpyZWxvY19hcm1fYWJzb2x1dGU6IHsKKyAgICAgIC8vIFRoZXNlIGFkZHJlc3NlcyBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZC4KKyAgICAgICooKGludHB0cl90KilSZWxvY1BvcykgfD0gKGludHB0cl90KVJlc3VsdFB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFSTTo6cmVsb2NfYXJtX2JyYW5jaDogeworICAgICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2YWx1ZSBvZiBzaWduZWRfaW1tZWRfMjQKKyAgICAgIC8vIGZpZWxkLiBXZSBzdWJ0cmFjdCB0aGUgYmFzZSBhZGRyIGZyb20gdGhlIHRhcmdldCBhZGRyIHRvIGZvcm0gYQorICAgICAgLy8gYnl0ZSBvZmZzZXQsIHdoaWNoIG11c3QgYmUgaW5zaWRlIHRoZSByYW5nZSAtMzM1NTQ0MzIgYW5kICszMzU1NDQyOC4KKyAgICAgIC8vIFRoZW4sIHdlIHNldCB0aGUgc2lnbmVkX2ltbWVkXzI0IGZpZWxkIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiaXRzCisgICAgICAvLyBbMjU6Ml0gb2YgdGhlIGJ5dGUgb2Zmc2V0LiBNb3JlIGRldGFpbHMgQVJNLUFSTSBwLiBBNC0xMS4KKyAgICAgIFJlc3VsdFB0ciA9IFJlc3VsdFB0ciAtIChpbnRwdHJfdClSZWxvY1BvcyAtIDg7CisgICAgICBSZXN1bHRQdHIgPSAoUmVzdWx0UHRyICYgMHgwM0ZGRkZGQykgPj4gMjsKKyAgICAgIGFzc2VydChSZXN1bHRQdHIgPj0gLTMzNTU0NDMyICYmIFJlc3VsdFB0ciA8PSAzMzU1NDQyOCk7CisgICAgICAqKChpbnRwdHJfdCopUmVsb2NQb3MpIHw9IFJlc3VsdFB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFSTTo6cmVsb2NfYXJtX2p0X2Jhc2U6IHsKKyAgICAgIC8vIEpUIGJhc2UgLSAoaW5zdHJ1Y3Rpb24gYWRkciArIDgpCisgICAgICBSZXN1bHRQdHIgPSBSZXN1bHRQdHIgLSAoaW50cHRyX3QpUmVsb2NQb3MgLSA4OworICAgICAgKigoaW50cHRyX3QqKVJlbG9jUG9zKSB8PSBSZXN1bHRQdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBUk06OnJlbG9jX2FybV9tb3Z3OiB7CisgICAgICBSZXN1bHRQdHIgPSBSZXN1bHRQdHIgJiAweEZGRkY7IAorICAgICAgKigoaW50cHRyX3QqKVJlbG9jUG9zKSB8PSBSZXN1bHRQdHIgJiAweEZGRjsKKyAgICAgICooKGludHB0cl90KilSZWxvY1BvcykgfD0gKChSZXN1bHRQdHIgPj4gMTIpICYgMHhGKSA8PCAxNjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFSTTo6cmVsb2NfYXJtX21vdnQ6IHsKKyAgICAgIFJlc3VsdFB0ciA9IChSZXN1bHRQdHIgPj4gMTYpICYgMHhGRkZGOyAKKyAgICAgICooKGludHB0cl90KilSZWxvY1BvcykgfD0gUmVzdWx0UHRyICYgMHhGRkY7CisgICAgICAqKChpbnRwdHJfdCopUmVsb2NQb3MpIHw9ICgoUmVzdWx0UHRyID4+IDEyKSAmIDB4RikgPDwgMTY7CisgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1KSVRJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1KSVRJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkOWVmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUpJVEluZm8uaApAQCAtMCwwICsxLDE4MyBAQAorLy89PT0tIEFSTUpJVEluZm8uaCAtIEFSTSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSklUIGludGVyZmFjZSAgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBBUk1KSVRJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQVJNSklUSU5GT19ICisjZGVmaW5lIEFSTUpJVElORk9fSAorCisjaW5jbHVkZSAiQVJNTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEpJVEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQVJNVGFyZ2V0TWFjaGluZTsKKworICBjbGFzcyBBUk1KSVRJbmZvIDogcHVibGljIFRhcmdldEpJVEluZm8geworICAgIC8vIENvbnN0UG9vbElkMkFkZHJNYXAgLSBBIG1hcCBmcm9tIGNvbnN0YW50IHBvb2wgaWRzIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gQ09OU1RQT09MX0VOVFJZIGFkZHJlc3Nlcy4KKyAgICBTbWFsbFZlY3RvcjxpbnRwdHJfdCwgMTY+IENvbnN0UG9vbElkMkFkZHJNYXA7CisKKyAgICAvLyBKdW1wVGFibGVJZDJBZGRyTWFwIC0gQSBtYXAgZnJvbSBpbmxpbmUganVtcHRhYmxlIGlkcyB0byB0aGUKKyAgICAvLyBjb3JyZXNwb25kaW5nIGlubGluZSBqdW1wIHRhYmxlIGJhc2VzLgorICAgIFNtYWxsVmVjdG9yPGludHB0cl90LCAxNj4gSnVtcFRhYmxlSWQyQWRkck1hcDsKKworICAgIC8vIFBDTGFiZWxNYXAgLSBBIG1hcCBmcm9tIFBDIGxhYmVscyB0byBhZGRyZXNzZXMuCisgICAgRGVuc2VNYXA8dW5zaWduZWQsIGludHB0cl90PiBQQ0xhYmVsTWFwOworCisgICAgLy8gU3ltMkluZGlyZWN0U3ltTWFwIC0gQSBtYXAgZnJvbSBzeW1ib2wgKEdsb2JhbFZhbHVlIGFuZCBFeHRlcm5hbFN5bWJvbCkKKyAgICAvLyBhZGRyZXNzZXMgdG8gdGhlaXIgaW5kaXJlY3Qgc3ltYm9sIGFkZHJlc3Nlcy4KKyAgICBEZW5zZU1hcDx2b2lkKiwgaW50cHRyX3Q+IFN5bTJJbmRpcmVjdFN5bU1hcDsKKworICAgIC8vIElzUElDIC0gVHJ1ZSBpZiB0aGUgcmVsb2NhdGlvbiBtb2RlbCBpcyBQSUMuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUKKyAgICAvLyBob3cgdG8gY29kZWdlbiBmdW5jdGlvbiBzdHVicy4KKyAgICBib29sIElzUElDOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBUk1KSVRJbmZvKCkgOiBJc1BJQyhmYWxzZSkgeyB1c2VHT1QgPSBmYWxzZTsgfQorCisgICAgLy8vIHJlcGxhY2VNYWNoaW5lQ29kZUZvckZ1bmN0aW9uIC0gTWFrZSBpdCBzbyB0aGF0IGNhbGxpbmcgdGhlIGZ1bmN0aW9uCisgICAgLy8vIHdob3NlIG1hY2hpbmUgY29kZSBpcyBhdCBPTEQgdHVybnMgaW50byBhIGNhbGwgdG8gTkVXLCBwZXJoYXBzIGJ5CisgICAgLy8vIG92ZXJ3cml0aW5nIE9MRCB3aXRoIGEgYnJhbmNoIHRvIE5FVy4gIFRoaXMgaXMgdXNlZCBmb3Igc2VsZi1tb2RpZnlpbmcKKyAgICAvLy8gY29kZS4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgcmVwbGFjZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24odm9pZCAqT2xkLCB2b2lkICpOZXcpOworCisgICAgLy8vIGVtaXRHbG9iYWxWYWx1ZUluZGlyZWN0U3ltIC0gVXNlIHRoZSBzcGVjaWZpZWQgSklUQ29kZUVtaXR0ZXIgb2JqZWN0CisgICAgLy8vIHRvIGVtaXQgYW4gaW5kaXJlY3Qgc3ltYm9sIHdoaWNoIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gcHRyLgorICAgIHZpcnR1YWwgdm9pZCAqZW1pdEdsb2JhbFZhbHVlSW5kaXJlY3RTeW0oY29uc3QgR2xvYmFsVmFsdWUqIEdWLCB2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpOworCisgICAgLy8gZ2V0U3R1YkxheW91dCAtIFJldHVybnMgdGhlIHNpemUgYW5kIGFsaWdubWVudCBvZiB0aGUgbGFyZ2VzdCBjYWxsIHN0dWIKKyAgICAvLyBvbiBBUk0uCisgICAgdmlydHVhbCBTdHViTGF5b3V0IGdldFN0dWJMYXlvdXQoKTsKKworICAgIC8vLyBlbWl0RnVuY3Rpb25TdHViIC0gVXNlIHRoZSBzcGVjaWZpZWQgSklUQ29kZUVtaXR0ZXIgb2JqZWN0IHRvIGVtaXQgYQorICAgIC8vLyBzbWFsbCBuYXRpdmUgZnVuY3Rpb24gdGhhdCBzaW1wbHkgY2FsbHMgdGhlIGZ1bmN0aW9uIGF0IHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gYWRkcmVzcy4KKyAgICB2aXJ0dWFsIHZvaWQgKmVtaXRGdW5jdGlvblN0dWIoY29uc3QgRnVuY3Rpb24qIEYsIHZvaWQgKkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRDb2RlRW1pdHRlciAmSkNFKTsKKworICAgIC8vLyBnZXRMYXp5UmVzb2x2ZXJGdW5jdGlvbiAtIEV4cG9zZSB0aGUgbGF6eSByZXNvbHZlciB0byB0aGUgSklULgorICAgIHZpcnR1YWwgTGF6eVJlc29sdmVyRm4gZ2V0TGF6eVJlc29sdmVyRnVuY3Rpb24oSklUQ29tcGlsZXJGbik7CisKKyAgICAvLy8gcmVsb2NhdGUgLSBCZWZvcmUgdGhlIEpJVCBjYW4gcnVuIGEgYmxvY2sgb2YgY29kZSB0aGF0IGhhcyBiZWVuIGVtaXR0ZWQsCisgICAgLy8vIGl0IG11c3QgcmV3cml0ZSB0aGUgY29kZSB0byBjb250YWluIHRoZSBhY3R1YWwgYWRkcmVzc2VzIG9mIGFueQorICAgIC8vLyByZWZlcmVuY2VkIGdsb2JhbCBzeW1ib2xzLgorICAgIHZpcnR1YWwgdm9pZCByZWxvY2F0ZSh2b2lkICpGdW5jdGlvbiwgTWFjaGluZVJlbG9jYXRpb24gKk1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZWxvY3MsIHVuc2lnbmVkIGNoYXIqIEdPVEJhc2UpOworCisgICAgLy8vIGhhc0N1c3RvbUNvbnN0YW50UG9vbCAtIEFsbG93cyBhIHRhcmdldCB0byBzcGVjaWZ5IHRoYXQgY29uc3RhbnQKKyAgICAvLy8gcG9vbCBhZGRyZXNzIHJlc29sdXRpb24gaXMgaGFuZGxlZCBieSB0aGUgdGFyZ2V0LgorICAgIHZpcnR1YWwgYm9vbCBoYXNDdXN0b21Db25zdGFudFBvb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICAvLy8gaGFzQ3VzdG9tSnVtcFRhYmxlcyAtIEFsbG93cyBhIHRhcmdldCB0byBzcGVjaWZ5IHRoYXQganVtcHRhYmxlcworICAgIC8vLyBhcmUgZW1pdHRlZCBieSB0aGUgdGFyZ2V0LgorICAgIHZpcnR1YWwgYm9vbCBoYXNDdXN0b21KdW1wVGFibGVzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgLy8vIGFsbG9jYXRlU2VwYXJhdGVHVk1lbW9yeSAtIElmIHRydWUsIGdsb2JhbHMgc2hvdWxkIGJlIHBsYWNlZCBpbgorICAgIC8vLyBzZXBhcmF0ZWx5IGFsbG9jYXRlZCBoZWFwIG1lbW9yeSByYXRoZXIgdGhhbiBpbiB0aGUgc2FtZQorICAgIC8vLyBjb2RlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgSklUQ29kZUVtaXR0ZXIuCisgICAgdmlydHVhbCBib29sIGFsbG9jYXRlU2VwYXJhdGVHVk1lbW9yeSgpIGNvbnN0IHsKKyNpZmRlZiBfX0FQUExFX18KKyAgICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIC0gSW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGFnZSBmb3IgdGhlIGZ1bmN0aW9uIGJlaW5nIEpJVHRlZC4KKyAgICAvLy8gUmVzaXplIGNvbnN0YW50IHBvb2wgaWRzIHRvIENPTlNUUE9PTF9FTlRSWSBhZGRyZXNzZXMgbWFwOyByZXNpemUKKyAgICAvLy8ganVtcCB0YWJsZSBpZHMgdG8ganVtcCB0YWJsZSBiYXNlcyBtYXA7IHJlbWVtYmVyIGlmIGNvZGVnZW4gcmVsb2NhdGlvbgorICAgIC8vLyBtb2RlbCBpcyBQSUMuCisgICAgdm9pZCBJbml0aWFsaXplKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGJvb2wgaXNQSUMpIHsKKyAgICAgIGNvbnN0IEFSTUZ1bmN0aW9uSW5mbyAqQUZJID0gTUYuZ2V0SW5mbzxBUk1GdW5jdGlvbkluZm8+KCk7CisgICAgICBDb25zdFBvb2xJZDJBZGRyTWFwLnJlc2l6ZShBRkktPmdldE51bUNvbnN0UG9vbEVudHJpZXMoKSk7CisgICAgICBKdW1wVGFibGVJZDJBZGRyTWFwLnJlc2l6ZShBRkktPmdldE51bUp1bXBUYWJsZXMoKSk7CisgICAgICBJc1BJQyA9IGlzUElDOworICAgIH0KKworICAgIC8vLyBnZXRDb25zdGFudFBvb2xFbnRyeUFkZHIgLSBUaGUgQVJNIHRhcmdldCBwdXRzIGFsbCBjb25zdGFudAorICAgIC8vLyBwb29sIGVudHJpZXMgaW50byBjb25zdGFudCBpc2xhbmRzLiBUaGlzIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICAgLy8vIGNvbnN0YW50IHBvb2wgZW50cnkgb2YgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICBpbnRwdHJfdCBnZXRDb25zdGFudFBvb2xFbnRyeUFkZHIodW5zaWduZWQgQ1BJKSBjb25zdCB7CisgICAgICBhc3NlcnQoQ1BJIDwgQ29uc3RQb29sSWQyQWRkck1hcC5zaXplKCkpOworICAgICAgcmV0dXJuIENvbnN0UG9vbElkMkFkZHJNYXBbQ1BJXTsKKyAgICB9CisKKyAgICAvLy8gYWRkQ29uc3RhbnRQb29sRW50cnlBZGRyIC0gTWFwIGEgQ29uc3RhbnQgUG9vbCBJbmRleCB0byB0aGUgYWRkcmVzcworICAgIC8vLyB3aGVyZSBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBpcyBzdG9yZWQuIFdoZW4gcmVsb2NhdGlvbnMgYXJlIHByb2Nlc3NlZCwKKyAgICAvLy8gdGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIHRvIHRoZSBjb25zdGFudC4KKyAgICB2b2lkIGFkZENvbnN0YW50UG9vbEVudHJ5QWRkcih1bnNpZ25lZCBDUEksIGludHB0cl90IEFkZHIpIHsKKyAgICAgIGFzc2VydChDUEkgPCBDb25zdFBvb2xJZDJBZGRyTWFwLnNpemUoKSk7CisgICAgICBDb25zdFBvb2xJZDJBZGRyTWFwW0NQSV0gPSBBZGRyOworICAgIH0KKworICAgIC8vLyBnZXRKdW1wVGFibGVCYXNlQWRkciAtIFRoZSBBUk0gdGFyZ2V0IGlubGluZSBhbGwganVtcCB0YWJsZXMgd2l0aGluCisgICAgLy8vIHRleHQgc2VjdGlvbiBvZiB0aGUgZnVuY3Rpb24uIFRoaXMgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgYmFzZSBvZgorICAgIC8vLyB0aGUganVtcCB0YWJsZSBvZiB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgIGludHB0cl90IGdldEp1bXBUYWJsZUJhc2VBZGRyKHVuc2lnbmVkIEpUSSkgY29uc3QgeworICAgICAgYXNzZXJ0KEpUSSA8IEp1bXBUYWJsZUlkMkFkZHJNYXAuc2l6ZSgpKTsKKyAgICAgIHJldHVybiBKdW1wVGFibGVJZDJBZGRyTWFwW0pUSV07CisgICAgfQorCisgICAgLy8vIGFkZEp1bXBUYWJsZUJhc2VBZGRyIC0gTWFwIGEganVtcCB0YWJsZSBpbmRleCB0byB0aGUgYWRkcmVzcyB3aGVyZQorICAgIC8vLyB0aGUgY29ycmVzcG9uZGluZyBpbmxpbmUganVtcCB0YWJsZSBpcyBlbWl0dGVkLiBXaGVuIHJlbG9jYXRpb25zIGFyZQorICAgIC8vLyBwcm9jZXNzZWQsIHRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIHRvIHJlc29sdmUgcmVmZXJlbmNlcyB0byB0aGUKKyAgICAvLy8ganVtcCB0YWJsZS4KKyAgICB2b2lkIGFkZEp1bXBUYWJsZUJhc2VBZGRyKHVuc2lnbmVkIEpUSSwgaW50cHRyX3QgQWRkcikgeworICAgICAgYXNzZXJ0KEpUSSA8IEp1bXBUYWJsZUlkMkFkZHJNYXAuc2l6ZSgpKTsKKyAgICAgIEp1bXBUYWJsZUlkMkFkZHJNYXBbSlRJXSA9IEFkZHI7CisgICAgfQorCisgICAgLy8vIGdldFBDTGFiZWxBZGRyIC0gUmV0cmlldmUgdGhlIGFkZHJlc3Mgb2YgdGhlIFBDIGxhYmVsIG9mIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgaWQuCisgICAgaW50cHRyX3QgZ2V0UENMYWJlbEFkZHIodW5zaWduZWQgSWQpIGNvbnN0IHsKKyAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCBpbnRwdHJfdD46OmNvbnN0X2l0ZXJhdG9yIEkgPSBQQ0xhYmVsTWFwLmZpbmQoSWQpOworICAgICAgYXNzZXJ0KEkgIT0gUENMYWJlbE1hcC5lbmQoKSk7CisgICAgICByZXR1cm4gSS0+c2Vjb25kOworICAgIH0KKworICAgIC8vLyBhZGRQQ0xhYmVsQWRkciAtIFJlbWVtYmVyIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgUEMgbGFiZWwuCisgICAgdm9pZCBhZGRQQ0xhYmVsQWRkcih1bnNpZ25lZCBJZCwgaW50cHRyX3QgQWRkcikgeworICAgICAgUENMYWJlbE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSWQsIEFkZHIpKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0SW5kaXJlY3RTeW1BZGRyIC0gUmV0cmlldmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGluZGlyZWN0IHN5bWJvbCBvZiB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIHN5bWJvbCBsb2NhdGVkIGF0IGFkZHJlc3MuIFJldHVybnMgMCBpZiB0aGUgaW5kaXJlY3Qgc3ltYm9sCisgICAgLy8vIGhhcyBub3QgYmVlbiBlbWl0dGVkLgorICAgIGludHB0cl90IGdldEluZGlyZWN0U3ltQWRkcih2b2lkICpBZGRyKSBjb25zdCB7CisgICAgICBEZW5zZU1hcDx2b2lkKixpbnRwdHJfdD46OmNvbnN0X2l0ZXJhdG9yIEk9IFN5bTJJbmRpcmVjdFN5bU1hcC5maW5kKEFkZHIpOworICAgICAgaWYgKEkgIT0gU3ltMkluZGlyZWN0U3ltTWFwLmVuZCgpKQorICAgICAgICByZXR1cm4gSS0+c2Vjb25kOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8vIGFkZEluZGlyZWN0U3ltQWRkciAtIEFkZCBhIG1hcHBpbmcgZnJvbSBhZGRyZXNzIG9mIGFuIGVtaXR0ZWQgc3ltYm9sIHRvCisgICAgLy8vIGl0cyBpbmRpcmVjdCBzeW1ib2wgYWRkcmVzcy4KKyAgICB2b2lkIGFkZEluZGlyZWN0U3ltQWRkcih2b2lkICpTeW1BZGRyLCBpbnRwdHJfdCBJbmRTeW1BZGRyKSB7CisgICAgICBTeW0ySW5kaXJlY3RTeW1NYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFN5bUFkZHIsIEluZFN5bUFkZHIpKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gcmVzb2x2ZVJlbG9jRGVzdEFkZHIgLSBSZXNvbHZlIHRoZSByZXN1bHRpbmcgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbgorICAgIC8vLyBpZiBpdCdzIG5vdCBhbHJlYWR5IHNvbHZlZC4gQ29uc3RhbnRwb29sIGVudHJpZXMgbXVzdCBiZSByZXNvbHZlZCBieQorICAgIC8vLyBBUk0gdGFyZ2V0LgorICAgIGludHB0cl90IHJlc29sdmVSZWxvY0Rlc3RBZGRyKE1hY2hpbmVSZWxvY2F0aW9uICpNUikgY29uc3Q7CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNTG9hZFN0b3JlT3B0aW1pemVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUxvYWRTdG9yZU9wdGltaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1ODBmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTUxvYWRTdG9yZU9wdGltaXplci5jcHAKQEAgLTAsMCArMSwxNzA4IEBACisvLz09PS0tIEFSTUxvYWRTdG9yZU9wdGltaXplci5jcHAgLSBBUk0gbG9hZCAvIHN0b3JlIG9wdC4gcGFzcyAtLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHBhc3MgdGhhdCBwZXJmb3JtcyBsb2FkIC8gc3RvcmUgcmVsYXRlZCBwZWVwaG9sZQorLy8gb3B0aW1pemF0aW9ucy4gVGhpcyBwYXNzIHNob3VsZCBiZSBydW4gYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFybS1sZHN0LW9wdCIKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1BZGRyZXNzaW5nTW9kZXMuaCIKKyNpbmNsdWRlICJBUk1CYXNlSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiQVJNTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIkFSTVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUmVnaXN0ZXJTY2F2ZW5naW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUxETUdlbmVkICwgIk51bWJlciBvZiBsZG0gaW5zdHJ1Y3Rpb25zIGdlbmVyYXRlZCIpOworU1RBVElTVElDKE51bVNUTUdlbmVkICwgIk51bWJlciBvZiBzdG0gaW5zdHJ1Y3Rpb25zIGdlbmVyYXRlZCIpOworU1RBVElTVElDKE51bVZMRE1HZW5lZCwgIk51bWJlciBvZiB2bGRtIGluc3RydWN0aW9ucyBnZW5lcmF0ZWQiKTsKK1NUQVRJU1RJQyhOdW1WU1RNR2VuZWQsICJOdW1iZXIgb2YgdnN0bSBpbnN0cnVjdGlvbnMgZ2VuZXJhdGVkIik7CitTVEFUSVNUSUMoTnVtTGRTdE1vdmVkLCAiTnVtYmVyIG9mIGxvYWQgLyBzdG9yZSBpbnN0cnVjdGlvbnMgbW92ZWQiKTsKK1NUQVRJU1RJQyhOdW1MRFJERm9ybWVkLCJOdW1iZXIgb2YgbGRyZCBjcmVhdGVkIGJlZm9yZSBhbGxvY2F0aW9uIik7CitTVEFUSVNUSUMoTnVtU1RSREZvcm1lZCwiTnVtYmVyIG9mIHN0cmQgY3JlYXRlZCBiZWZvcmUgYWxsb2NhdGlvbiIpOworU1RBVElTVElDKE51bUxEUkQyTERNLCAgIk51bWJlciBvZiBsZHJkIGluc3RydWN0aW9ucyB0dXJuZWQgYmFjayBpbnRvIGxkbSIpOworU1RBVElTVElDKE51bVNUUkQyU1RNLCAgIk51bWJlciBvZiBzdHJkIGluc3RydWN0aW9ucyB0dXJuZWQgYmFjayBpbnRvIHN0bSIpOworU1RBVElTVElDKE51bUxEUkQyTERSLCAgIk51bWJlciBvZiBsZHJkIGluc3RydWN0aW9ucyB0dXJuZWQgYmFjayBpbnRvIGxkcidzIik7CitTVEFUSVNUSUMoTnVtU1RSRDJTVFIsICAiTnVtYmVyIG9mIHN0cmQgaW5zdHJ1Y3Rpb25zIHR1cm5lZCBiYWNrIGludG8gc3RyJ3MiKTsKKworLy8vIEFSTUFsbG9jTG9hZFN0b3JlT3B0IC0gUG9zdC0gcmVnaXN0ZXIgYWxsb2NhdGlvbiBwYXNzIHRoZSBjb21iaW5lCisvLy8gbG9hZCAvIHN0b3JlIGluc3RydWN0aW9ucyB0byBmb3JtIGxkbSAvIHN0bSBpbnN0cnVjdGlvbnMuCisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBBUk1Mb2FkU3RvcmVPcHQgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgQVJNTG9hZFN0b3JlT3B0KCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgICAgQVJNRnVuY3Rpb25JbmZvICpBRkk7CisgICAgUmVnU2NhdmVuZ2VyICpSUzsKKyAgICBib29sIGlzVGh1bWIyOworCisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRm4pOworCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiQVJNIGxvYWQgLyBzdG9yZSBvcHRpbWl6YXRpb24gcGFzcyI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RydWN0IE1lbU9wUXVldWVFbnRyeSB7CisgICAgICBpbnQgT2Zmc2V0OworICAgICAgdW5zaWduZWQgUmVnOworICAgICAgYm9vbCBpc0tpbGw7CisgICAgICB1bnNpZ25lZCBQb3NpdGlvbjsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJOworICAgICAgYm9vbCBNZXJnZWQ7CisgICAgICBNZW1PcFF1ZXVlRW50cnkoaW50IG8sIHVuc2lnbmVkIHIsIGJvb2wgaywgdW5zaWduZWQgcCwgCisgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGkpCisgICAgICAgIDogT2Zmc2V0KG8pLCBSZWcociksIGlzS2lsbChrKSwgUG9zaXRpb24ocCksIE1CQkkoaSksIE1lcmdlZChmYWxzZSkge30KKyAgICB9OworICAgIHR5cGVkZWYgU21hbGxWZWN0b3I8TWVtT3BRdWV1ZUVudHJ5LDg+IE1lbU9wUXVldWU7CisgICAgdHlwZWRlZiBNZW1PcFF1ZXVlOjppdGVyYXRvciBNZW1PcFF1ZXVlSXRlcjsKKworICAgIGJvb2wgTWVyZ2VPcHMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkksCisgICAgICAgICAgICAgICAgICBpbnQgT2Zmc2V0LCB1bnNpZ25lZCBCYXNlLCBib29sIEJhc2VLaWxsLCBpbnQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBQcmVkLCB1bnNpZ25lZCBQcmVkUmVnLCB1bnNpZ25lZCBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgYm9vbD4sIDg+ICZSZWdzKTsKKyAgICB2b2lkIE1lcmdlT3BzVXBkYXRlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZW1PcFF1ZXVlICZNZW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtZW1PcHNCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1lbU9wc0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluc2VydEFmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIEJhc2VLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByZWRSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IsIDQ+ICZNZXJnZXMpOworICAgIHZvaWQgTWVyZ2VMRFJfU1RSKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIHVuc2lnbmVkIFNJbmRleCwgdW5zaWduZWQgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgT3Bjb2RlLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCwgdW5zaWduZWQgUHJlZFJlZywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTY3JhdGNoLCBNZW1PcFF1ZXVlICZNZW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yLCA0PiAmTWVyZ2VzKTsKKworICAgIHZvaWQgQWR2YW5jZVJTKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1lbU9wUXVldWUgJk1lbU9wcyk7CisgICAgYm9vbCBGaXhJbnZhbGlkUmVnUGFpck9wKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUJCSSk7CisgICAgYm9vbCBNZXJnZUJhc2VVcGRhdGVMb2FkU3RvcmUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZBZHZhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSk7CisgICAgYm9vbCBNZXJnZUJhc2VVcGRhdGVMU011bHRpcGxlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZBZHZhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJkkpOworICAgIGJvb2wgTG9hZFN0b3JlTXVsdGlwbGVPcHRpKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworICAgIGJvb2wgTWVyZ2VSZXR1cm5JbnRvTERNKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworICB9OworICBjaGFyIEFSTUxvYWRTdG9yZU9wdDo6SUQgPSAwOworfQorCitzdGF0aWMgaW50IGdldExvYWRTdG9yZU11bHRpcGxlT3Bjb2RlKGludCBPcGNvZGUpIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgY2FzZSBBUk06OkxEUjoKKyAgICArK051bUxETUdlbmVkOworICAgIHJldHVybiBBUk06OkxETTsKKyAgY2FzZSBBUk06OlNUUjoKKyAgICArK051bVNUTUdlbmVkOworICAgIHJldHVybiBBUk06OlNUTTsKKyAgY2FzZSBBUk06OnQyTERSaTg6CisgIGNhc2UgQVJNOjp0MkxEUmkxMjoKKyAgICArK051bUxETUdlbmVkOworICAgIHJldHVybiBBUk06OnQyTERNOworICBjYXNlIEFSTTo6dDJTVFJpODoKKyAgY2FzZSBBUk06OnQyU1RSaTEyOgorICAgICsrTnVtU1RNR2VuZWQ7CisgICAgcmV0dXJuIEFSTTo6dDJTVE07CisgIGNhc2UgQVJNOjpWTERSUzoKKyAgICArK051bVZMRE1HZW5lZDsKKyAgICByZXR1cm4gQVJNOjpWTERNUzsKKyAgY2FzZSBBUk06OlZTVFJTOgorICAgICsrTnVtVlNUTUdlbmVkOworICAgIHJldHVybiBBUk06OlZTVE1TOworICBjYXNlIEFSTTo6VkxEUkQ6CisgICAgKytOdW1WTERNR2VuZWQ7CisgICAgcmV0dXJuIEFSTTo6VkxETUQ7CisgIGNhc2UgQVJNOjpWU1RSRDoKKyAgICArK051bVZTVE1HZW5lZDsKKyAgICByZXR1cm4gQVJNOjpWU1RNRDsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIG9wY29kZSEiKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgaXNUMmkzMkxvYWQodW5zaWduZWQgT3BjKSB7CisgIHJldHVybiBPcGMgPT0gQVJNOjp0MkxEUmkxMiB8fCBPcGMgPT0gQVJNOjp0MkxEUmk4OworfQorCitzdGF0aWMgYm9vbCBpc2kzMkxvYWQodW5zaWduZWQgT3BjKSB7CisgIHJldHVybiBPcGMgPT0gQVJNOjpMRFIgfHwgaXNUMmkzMkxvYWQoT3BjKTsKK30KKworc3RhdGljIGJvb2wgaXNUMmkzMlN0b3JlKHVuc2lnbmVkIE9wYykgeworICByZXR1cm4gT3BjID09IEFSTTo6dDJTVFJpMTIgfHwgT3BjID09IEFSTTo6dDJTVFJpODsKK30KKworc3RhdGljIGJvb2wgaXNpMzJTdG9yZSh1bnNpZ25lZCBPcGMpIHsKKyAgcmV0dXJuIE9wYyA9PSBBUk06OlNUUiB8fCBpc1QyaTMyU3RvcmUoT3BjKTsKK30KKworLy8vIE1lcmdlT3BzIC0gQ3JlYXRlIGFuZCBpbnNlcnQgYSBMRE0gb3IgU1RNIHdpdGggQmFzZSBhcyBiYXNlIHJlZ2lzdGVyIGFuZAorLy8vIHJlZ2lzdGVycyBpbiBSZWdzIGFzIHRoZSByZWdpc3RlciBvcGVyYW5kcyB0aGF0IHdvdWxkIGJlIGxvYWRlZCAvIHN0b3JlZC4KKy8vLyBJdCByZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIGRvbmUuCitib29sCitBUk1Mb2FkU3RvcmVPcHQ6Ok1lcmdlT3BzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT2Zmc2V0LCB1bnNpZ25lZCBCYXNlLCBib29sIEJhc2VLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT3Bjb2RlLCBBUk1DQzo6Q29uZENvZGVzIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByZWRSZWcsIHVuc2lnbmVkIFNjcmF0Y2gsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIGJvb2w+LCA4PiAmUmVncykgeworICAvLyBPbmx5IGEgc2luZ2xlIHJlZ2lzdGVyIHRvIGxvYWQgLyBzdG9yZS4gRG9uJ3QgYm90aGVyLgorICB1bnNpZ25lZCBOdW1SZWdzID0gUmVncy5zaXplKCk7CisgIGlmIChOdW1SZWdzIDw9IDEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEFSTV9BTTo6QU1TdWJNb2RlIE1vZGUgPSBBUk1fQU06OmlhOworICBib29sIGlzQU00ID0gaXNpMzJMb2FkKE9wY29kZSkgfHwgaXNpMzJTdG9yZShPcGNvZGUpOworICBpZiAoaXNBTTQgJiYgT2Zmc2V0ID09IDQpIHsKKyAgICBpZiAoaXNUaHVtYjIpCisgICAgICAvLyBUaHVtYjIgZG9lcyBub3Qgc3VwcG9ydCBsZG1pYiAvIHN0bWliLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIE1vZGUgPSBBUk1fQU06OmliOworICB9IGVsc2UgaWYgKGlzQU00ICYmIE9mZnNldCA9PSAtNCAqIChpbnQpTnVtUmVncyArIDQpIHsKKyAgICBpZiAoaXNUaHVtYjIpCisgICAgICAvLyBUaHVtYjIgZG9lcyBub3Qgc3VwcG9ydCBsZG1kYSAvIHN0bWRhLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIE1vZGUgPSBBUk1fQU06OmRhOworICB9IGVsc2UgaWYgKGlzQU00ICYmIE9mZnNldCA9PSAtNCAqIChpbnQpTnVtUmVncykgeworICAgIE1vZGUgPSBBUk1fQU06OmRiOworICB9IGVsc2UgaWYgKE9mZnNldCAhPSAwKSB7CisgICAgLy8gSWYgc3RhcnRpbmcgb2Zmc2V0IGlzbid0IHplcm8sIGluc2VydCBhIE1JIHRvIG1hdGVyaWFsaXplIGEgbmV3IGJhc2UuCisgICAgLy8gQnV0IG9ubHkgZG8gc28gaWYgaXQgaXMgY29zdCBlZmZlY3RpdmUsIGkuZS4gbWVyZ2luZyBtb3JlIHRoYW4gdHdvCisgICAgLy8gbG9hZHMgLyBzdG9yZXMuCisgICAgaWYgKE51bVJlZ3MgPD0gMikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIE5ld0Jhc2U7CisgICAgaWYgKGlzaTMyTG9hZChPcGNvZGUpKQorICAgICAgLy8gSWYgaXQgaXMgYSBsb2FkLCB0aGVuIGp1c3QgdXNlIG9uZSBvZiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgdG8KKyAgICAgIC8vIHVzZSBhcyB0aGUgbmV3IGJhc2UuCisgICAgICBOZXdCYXNlID0gUmVnc1tOdW1SZWdzLTFdLmZpcnN0OworICAgIGVsc2UgeworICAgICAgLy8gVXNlIHRoZSBzY3JhdGNoIHJlZ2lzdGVyIHRvIHVzZSBhcyBhIG5ldyBiYXNlLgorICAgICAgTmV3QmFzZSA9IFNjcmF0Y2g7CisgICAgICBpZiAoTmV3QmFzZSA9PSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCBCYXNlT3BjID0gIWlzVGh1bWIyCisgICAgICA/IEFSTTo6QUREcmkKKyAgICAgIDogKChCYXNlID09IEFSTTo6U1ApID8gQVJNOjp0MkFERHJTUGkgOiBBUk06OnQyQUREcmkpOworICAgIGlmIChPZmZzZXQgPCAwKSB7CisgICAgICBCYXNlT3BjID0gIWlzVGh1bWIyCisgICAgICAgID8gQVJNOjpTVUJyaQorICAgICAgICA6ICgoQmFzZSA9PSBBUk06OlNQKSA/IEFSTTo6dDJTVUJyU1BpIDogQVJNOjp0MlNVQnJpKTsKKyAgICAgIE9mZnNldCA9IC0gT2Zmc2V0OworICAgIH0KKyAgICBpbnQgSW1tZWRPZmZzZXQgPSBpc1RodW1iMgorICAgICAgPyBBUk1fQU06OmdldFQyU09JbW1WYWwoT2Zmc2V0KSA6IEFSTV9BTTo6Z2V0U09JbW1WYWwoT2Zmc2V0KTsKKyAgICBpZiAoSW1tZWRPZmZzZXQgPT0gLTEpCisgICAgICAvLyBGSVhNRTogVHJ5IHQyQUREcmkxMiBvciB0MlNVQnJpMTI/CisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBQcm9iYWJseSBub3Qgd29ydGggaXQgdGhlbi4KKworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLT5nZXQoQmFzZU9wYyksIE5ld0Jhc2UpCisgICAgICAuYWRkUmVnKEJhc2UsIGdldEtpbGxSZWdTdGF0ZShCYXNlS2lsbCkpLmFkZEltbShPZmZzZXQpCisgICAgICAuYWRkSW1tKFByZWQpLmFkZFJlZyhQcmVkUmVnKS5hZGRSZWcoMCk7CisgICAgQmFzZSA9IE5ld0Jhc2U7CisgICAgQmFzZUtpbGwgPSB0cnVlOyAgLy8gTmV3IGJhc2UgaXMgYWx3YXlzIGtpbGxlZCByaWdodCBpdHMgdXNlLgorICB9CisKKyAgYm9vbCBpc0RQUiA9IChPcGNvZGUgPT0gQVJNOjpWTERSRCB8fCBPcGNvZGUgPT0gQVJNOjpWU1RSRCk7CisgIGJvb2wgaXNEZWYgPSAoaXNpMzJMb2FkKE9wY29kZSkgfHwgT3Bjb2RlID09IEFSTTo6VkxEUlMgfHwKKyAgICAgICAgICAgICAgICBPcGNvZGUgPT0gQVJNOjpWTERSRCk7CisgIE9wY29kZSA9IGdldExvYWRTdG9yZU11bHRpcGxlT3Bjb2RlKE9wY29kZSk7CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gKGlzQU00KQorICAgID8gQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUktPmdldChPcGNvZGUpKQorICAgICAgICAuYWRkUmVnKEJhc2UsIGdldEtpbGxSZWdTdGF0ZShCYXNlS2lsbCkpCisgICAgICAgIC5hZGRJbW0oQVJNX0FNOjpnZXRBTTRNb2RlSW1tKE1vZGUpKS5hZGRJbW0oUHJlZCkuYWRkUmVnKFByZWRSZWcpCisgICAgOiBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS0+Z2V0KE9wY29kZSkpCisgICAgICAgIC5hZGRSZWcoQmFzZSwgZ2V0S2lsbFJlZ1N0YXRlKEJhc2VLaWxsKSkKKyAgICAgICAgLmFkZEltbShBUk1fQU06OmdldEFNNU9wYyhNb2RlLCBpc0RQUiA/IE51bVJlZ3M8PDEgOiBOdW1SZWdzKSkKKyAgICAgICAgLmFkZEltbShQcmVkKS5hZGRSZWcoUHJlZFJlZyk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUmVnczsgKytpKQorICAgIE1JQiA9IE1JQi5hZGRSZWcoUmVnc1tpXS5maXJzdCwgZ2V0RGVmUmVnU3RhdGUoaXNEZWYpCisgICAgICAgICAgICAgICAgICAgICB8IGdldEtpbGxSZWdTdGF0ZShSZWdzW2ldLnNlY29uZCkpOworCisgIHJldHVybiB0cnVlOworfQorCisvLyBNZXJnZU9wc1VwZGF0ZSAtIGNhbGwgTWVyZ2VPcHMgYW5kIHVwZGF0ZSBNZW1PcHMgYW5kIG1lcmdlcyBhY2NvcmRpbmdseSBvbgorLy8gc3VjY2Vzcy4KK3ZvaWQgQVJNTG9hZFN0b3JlT3B0OjpNZXJnZU9wc1VwZGF0ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbU9wUXVldWUgJm1lbU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtZW1PcHNCZWdpbiwgdW5zaWduZWQgbWVtT3BzRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluc2VydEFmdGVyLCBpbnQgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJhc2UsIGJvb2wgQmFzZUtpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Q29uZENvZGVzIFByZWQsIHVuc2lnbmVkIFByZWRSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yLCA0PiAmTWVyZ2VzKSB7CisgIC8vIEZpcnN0IGNhbGN1bGF0ZSB3aGljaCBvZiB0aGUgcmVnaXN0ZXJzIHNob3VsZCBiZSBraWxsZWQgYnkgdGhlIG1lcmdlZAorICAvLyBpbnN0cnVjdGlvbi4KKyAgY29uc3QgdW5zaWduZWQgaW5zZXJ0UG9zID0gbWVtT3BzW2luc2VydEFmdGVyXS5Qb3NpdGlvbjsKKworICBTbWFsbFNldDx1bnNpZ25lZCwgND4gVW5hdmFpbFJlZ3M7CisgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiBLaWxsZWRSZWdzOworICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+IEtpbGxlcjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1lbU9wc0JlZ2luOyArK2kpIHsKKyAgICBpZiAobWVtT3BzW2ldLlBvc2l0aW9uIDwgaW5zZXJ0UG9zICYmIG1lbU9wc1tpXS5pc0tpbGwpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IG1lbU9wc1tpXS5SZWc7CisgICAgICBpZiAobWVtT3BzW2ldLk1lcmdlZCkKKyAgICAgICAgVW5hdmFpbFJlZ3MuaW5zZXJ0KFJlZyk7CisgICAgICBlbHNlIHsKKyAgICAgICAgS2lsbGVkUmVncy5pbnNlcnQoUmVnKTsKKyAgICAgICAgS2lsbGVyW1JlZ10gPSBpOworICAgICAgfQorICAgIH0KKyAgfQorICBmb3IgKHVuc2lnbmVkIGkgPSBtZW1PcHNFbmQsIGUgPSBtZW1PcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChtZW1PcHNbaV0uUG9zaXRpb24gPCBpbnNlcnRQb3MgJiYgbWVtT3BzW2ldLmlzS2lsbCkgeworICAgICAgdW5zaWduZWQgUmVnID0gbWVtT3BzW2ldLlJlZzsKKyAgICAgIEtpbGxlZFJlZ3MuaW5zZXJ0KFJlZyk7CisgICAgICBLaWxsZXJbUmVnXSA9IGk7CisgICAgfQorICB9CisKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBib29sPiwgOD4gUmVnczsKKyAgZm9yICh1bnNpZ25lZCBpID0gbWVtT3BzQmVnaW47IGkgPCBtZW1PcHNFbmQ7ICsraSkgeworICAgIHVuc2lnbmVkIFJlZyA9IG1lbU9wc1tpXS5SZWc7CisgICAgaWYgKFVuYXZhaWxSZWdzLmNvdW50KFJlZykpCisgICAgICAvLyBSZWdpc3RlciBpcyBraWxsZWQgYmVmb3JlIGFuZCBpdCdzIG5vdCBlYXN5IC8gcG9zc2libGUgdG8gdXBkYXRlIHRoZQorICAgICAgLy8ga2lsbCBtYXJrZXIgb24gYWxyZWFkeSBtZXJnZWQgaW5zdHJ1Y3Rpb25zLiBBYm9ydC4KKyAgICAgIHJldHVybjsKKworICAgIC8vIElmIHdlIGFyZSBpbnNlcnRpbmcgdGhlIG1lcmdlZCBvcGVyYXRpb24gYWZ0ZXIgYW4gdW5tZXJnZWQgb3BlcmF0aW9uIHRoYXQKKyAgICAvLyB1c2VzIHRoZSBzYW1lIHJlZ2lzdGVyLCBtYWtlIHN1cmUgdG8gdHJhbnNmZXIgYW55IGtpbGwgZmxhZy4KKyAgICBib29sIGlzS2lsbCA9IG1lbU9wc1tpXS5pc0tpbGwgfHwgS2lsbGVkUmVncy5jb3VudChSZWcpOworICAgIFJlZ3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFJlZywgaXNLaWxsKSk7CisgIH0KKworICAvLyBUcnkgdG8gZG8gdGhlIG1lcmdlLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTG9jID0gbWVtT3BzW2luc2VydEFmdGVyXS5NQkJJOworICArK0xvYzsKKyAgaWYgKCFNZXJnZU9wcyhNQkIsIExvYywgT2Zmc2V0LCBCYXNlLCBCYXNlS2lsbCwgT3Bjb2RlLAorICAgICAgICAgICAgICAgIFByZWQsIFByZWRSZWcsIFNjcmF0Y2gsIGRsLCBSZWdzKSkKKyAgICByZXR1cm47CisKKyAgLy8gTWVyZ2Ugc3VjY2VlZGVkLCB1cGRhdGUgcmVjb3Jkcy4KKyAgTWVyZ2VzLnB1c2hfYmFjayhwcmlvcihMb2MpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gbWVtT3BzQmVnaW47IGkgPCBtZW1PcHNFbmQ7ICsraSkgeworICAgIC8vIFJlbW92ZSBraWxsIGZsYWdzIGZyb20gYW55IHVubWVyZ2VkIG1lbW9wcyB0aGF0IGNvbWUgYmVmb3JlIGluc2VydFBvcy4KKyAgICBpZiAoUmVnc1tpLW1lbU9wc0JlZ2luXS5zZWNvbmQpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IFJlZ3NbaS1tZW1PcHNCZWdpbl0uZmlyc3Q7CisgICAgICBpZiAoS2lsbGVkUmVncy5jb3VudChSZWcpKSB7CisgICAgICAgIHVuc2lnbmVkIGogPSBLaWxsZXJbUmVnXTsKKyAgICAgICAgbWVtT3BzW2pdLk1CQkktPmdldE9wZXJhbmQoMCkuc2V0SXNLaWxsKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgTUJCLmVyYXNlKG1lbU9wc1tpXS5NQkJJKTsKKyAgICBtZW1PcHNbaV0uTWVyZ2VkID0gdHJ1ZTsKKyAgfQorfQorCisvLy8gTWVyZ2VMRFJfU1RSIC0gTWVyZ2UgYSBudW1iZXIgb2YgbG9hZCAvIHN0b3JlIGluc3RydWN0aW9ucyBpbnRvIG9uZSBvciBtb3JlCisvLy8gbG9hZCAvIHN0b3JlIG11bHRpcGxlIGluc3RydWN0aW9ucy4KK3ZvaWQKK0FSTUxvYWRTdG9yZU9wdDo6TWVyZ2VMRFJfU1RSKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIHVuc2lnbmVkIFNJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQmFzZSwgaW50IE9wY29kZSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBQcmVkLCB1bnNpZ25lZCBQcmVkUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTY3JhdGNoLCBNZW1PcFF1ZXVlICZNZW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciwgND4gJk1lcmdlcykgeworICBib29sIGlzQU00ID0gaXNpMzJMb2FkKE9wY29kZSkgfHwgaXNpMzJTdG9yZShPcGNvZGUpOworICBpbnQgT2Zmc2V0ID0gTWVtT3BzW1NJbmRleF0uT2Zmc2V0OworICBpbnQgU09mZnNldCA9IE9mZnNldDsKKyAgdW5zaWduZWQgaW5zZXJ0QWZ0ZXIgPSBTSW5kZXg7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBMb2MgPSBNZW1PcHNbU0luZGV4XS5NQkJJOworICBEZWJ1Z0xvYyBkbCA9IExvYy0+Z2V0RGVidWdMb2MoKTsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJlBNTyA9IExvYy0+Z2V0T3BlcmFuZCgwKTsKKyAgdW5zaWduZWQgUFJlZyA9IFBNTy5nZXRSZWcoKTsKKyAgdW5zaWduZWQgUFJlZ051bSA9IFBNTy5pc1VuZGVmKCkgPyBVSU5UX01BWAorICAgIDogQVJNUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhQUmVnKTsKKyAgdW5zaWduZWQgQ291bnQgPSAxOworCisgIGZvciAodW5zaWduZWQgaSA9IFNJbmRleCsxLCBlID0gTWVtT3BzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpbnQgTmV3T2Zmc2V0ID0gTWVtT3BzW2ldLk9mZnNldDsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNZW1PcHNbaV0uTUJCSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBSZWdOdW0gPSBNTy5pc1VuZGVmKCkgPyBVSU5UX01BWAorICAgICAgOiBBUk1SZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKFJlZyk7CisgICAgLy8gQU00IC0gcmVnaXN0ZXIgbnVtYmVycyBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgLy8gQU01IC0gY29uc2VjdXRpdmUgcmVnaXN0ZXIgbnVtYmVycyBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgLy8gICAgICAgQ2FuIG9ubHkgZG8gdXAgdG8gMTYgZG91YmxlLXdvcmQgcmVnaXN0ZXJzIHBlciBpbnNuLgorICAgIGlmIChSZWcgIT0gQVJNOjpTUCAmJgorICAgICAgICBOZXdPZmZzZXQgPT0gT2Zmc2V0ICsgKGludClTaXplICYmCisgICAgICAgICgoaXNBTTQgJiYgUmVnTnVtID4gUFJlZ051bSkKKyAgICAgICAgIHx8ICgoU2l6ZSA8IDggfHwgQ291bnQgPCAxNikgJiYgUmVnTnVtID09IFBSZWdOdW0rMSkpKSB7CisgICAgICBPZmZzZXQgKz0gU2l6ZTsKKyAgICAgIFBSZWdOdW0gPSBSZWdOdW07CisgICAgICArK0NvdW50OworICAgIH0gZWxzZSB7CisgICAgICAvLyBDYW4ndCBtZXJnZSB0aGlzIGluLiBUcnkgbWVyZ2UgdGhlIGVhcmxpZXIgb25lcyBmaXJzdC4KKyAgICAgIE1lcmdlT3BzVXBkYXRlKE1CQiwgTWVtT3BzLCBTSW5kZXgsIGksIGluc2VydEFmdGVyLCBTT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgQmFzZSwgZmFsc2UsIE9wY29kZSwgUHJlZCwgUHJlZFJlZywgU2NyYXRjaCwgZGwsIE1lcmdlcyk7CisgICAgICBNZXJnZUxEUl9TVFIoTUJCLCBpLCBCYXNlLCBPcGNvZGUsIFNpemUsIFByZWQsIFByZWRSZWcsIFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgTWVtT3BzLCBNZXJnZXMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChNZW1PcHNbaV0uUG9zaXRpb24gPiBNZW1PcHNbaW5zZXJ0QWZ0ZXJdLlBvc2l0aW9uKQorICAgICAgaW5zZXJ0QWZ0ZXIgPSBpOworICB9CisKKyAgYm9vbCBCYXNlS2lsbCA9IExvYy0+ZmluZFJlZ2lzdGVyVXNlT3BlcmFuZElkeChCYXNlLCB0cnVlKSAhPSAtMTsKKyAgTWVyZ2VPcHNVcGRhdGUoTUJCLCBNZW1PcHMsIFNJbmRleCwgTWVtT3BzLnNpemUoKSwgaW5zZXJ0QWZ0ZXIsIFNPZmZzZXQsCisgICAgICAgICAgICAgICAgIEJhc2UsIEJhc2VLaWxsLCBPcGNvZGUsIFByZWQsIFByZWRSZWcsIFNjcmF0Y2gsIGRsLCBNZXJnZXMpOworICByZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc01hdGNoaW5nRGVjcmVtZW50KE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlcywgdW5zaWduZWQgTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Q29uZENvZGVzIFByZWQsIHVuc2lnbmVkIFByZWRSZWcpeworICB1bnNpZ25lZCBNeVByZWRSZWcgPSAwOworICBpZiAoIU1JKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSAhPSBBUk06OnQyU1VCcmkgJiYKKyAgICAgIE1JLT5nZXRPcGNvZGUoKSAhPSBBUk06OnQyU1VCclNQaSAmJgorICAgICAgTUktPmdldE9wY29kZSgpICE9IEFSTTo6dDJTVUJyU1BpMTIgJiYKKyAgICAgIE1JLT5nZXRPcGNvZGUoKSAhPSBBUk06OnRTVUJzcGkgJiYKKyAgICAgIE1JLT5nZXRPcGNvZGUoKSAhPSBBUk06OlNVQnJpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBNYWtlIHN1cmUgdGhlIG9mZnNldCBmaXRzIGluIDggYml0cy4KKyAgaWYgKEJ5dGVzIDw9IDAgfHwgKExpbWl0ICYmIEJ5dGVzID49IExpbWl0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgU2NhbGUgPSAoTUktPmdldE9wY29kZSgpID09IEFSTTo6dFNVQnNwaSkgPyA0IDogMTsgLy8gRklYTUUKKyAgcmV0dXJuIChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBCYXNlICYmCisgICAgICAgICAgTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkgPT0gQmFzZSAmJgorICAgICAgICAgIChNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSpTY2FsZSkgPT0gQnl0ZXMgJiYKKyAgICAgICAgICBsbHZtOjpnZXRJbnN0clByZWRpY2F0ZShNSSwgTXlQcmVkUmVnKSA9PSBQcmVkICYmCisgICAgICAgICAgTXlQcmVkUmVnID09IFByZWRSZWcpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNNYXRjaGluZ0luY3JlbWVudChNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnl0ZXMsIHVuc2lnbmVkIExpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBQcmVkLCB1bnNpZ25lZCBQcmVkUmVnKXsKKyAgdW5zaWduZWQgTXlQcmVkUmVnID0gMDsKKyAgaWYgKCFNSSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgIT0gQVJNOjp0MkFERHJpICYmCisgICAgICBNSS0+Z2V0T3Bjb2RlKCkgIT0gQVJNOjp0MkFERHJTUGkgJiYKKyAgICAgIE1JLT5nZXRPcGNvZGUoKSAhPSBBUk06OnQyQUREclNQaTEyICYmCisgICAgICBNSS0+Z2V0T3Bjb2RlKCkgIT0gQVJNOjp0QUREc3BpICYmCisgICAgICBNSS0+Z2V0T3Bjb2RlKCkgIT0gQVJNOjpBRERyaSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKEJ5dGVzIDw9IDAgfHwgKExpbWl0ICYmIEJ5dGVzID49IExpbWl0KSkKKyAgICAvLyBNYWtlIHN1cmUgdGhlIG9mZnNldCBmaXRzIGluIDggYml0cy4KKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgU2NhbGUgPSAoTUktPmdldE9wY29kZSgpID09IEFSTTo6dEFERHNwaSkgPyA0IDogMTsgLy8gRklYTUUKKyAgcmV0dXJuIChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBCYXNlICYmCisgICAgICAgICAgTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkgPT0gQmFzZSAmJgorICAgICAgICAgIChNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSpTY2FsZSkgPT0gQnl0ZXMgJiYKKyAgICAgICAgICBsbHZtOjpnZXRJbnN0clByZWRpY2F0ZShNSSwgTXlQcmVkUmVnKSA9PSBQcmVkICYmCisgICAgICAgICAgTXlQcmVkUmVnID09IFByZWRSZWcpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldExTTXVsdGlwbGVUcmFuc2ZlclNpemUoTWFjaGluZUluc3RyICpNSSkgeworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgY2FzZSBBUk06OkxEUjoKKyAgY2FzZSBBUk06OlNUUjoKKyAgY2FzZSBBUk06OnQyTERSaTg6CisgIGNhc2UgQVJNOjp0MkxEUmkxMjoKKyAgY2FzZSBBUk06OnQyU1RSaTg6CisgIGNhc2UgQVJNOjp0MlNUUmkxMjoKKyAgY2FzZSBBUk06OlZMRFJTOgorICBjYXNlIEFSTTo6VlNUUlM6CisgICAgcmV0dXJuIDQ7CisgIGNhc2UgQVJNOjpWTERSRDoKKyAgY2FzZSBBUk06OlZTVFJEOgorICAgIHJldHVybiA4OworICBjYXNlIEFSTTo6TERNOgorICBjYXNlIEFSTTo6U1RNOgorICBjYXNlIEFSTTo6dDJMRE06CisgIGNhc2UgQVJNOjp0MlNUTToKKyAgICByZXR1cm4gKE1JLT5nZXROdW1PcGVyYW5kcygpIC0gNCkgKiA0OworICBjYXNlIEFSTTo6VkxETVM6CisgIGNhc2UgQVJNOjpWU1RNUzoKKyAgY2FzZSBBUk06OlZMRE1EOgorICBjYXNlIEFSTTo6VlNUTUQ6CisgICAgcmV0dXJuIEFSTV9BTTo6Z2V0QU01T2Zmc2V0KE1JLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpKSAqIDQ7CisgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGdldFVwZGF0aW5nTFNNdWx0aXBsZU9wY29kZSh1bnNpZ25lZCBPcGMpIHsKKyAgc3dpdGNoIChPcGMpIHsKKyAgY2FzZSBBUk06OkxETTogcmV0dXJuIEFSTTo6TERNX1VQRDsKKyAgY2FzZSBBUk06OlNUTTogcmV0dXJuIEFSTTo6U1RNX1VQRDsKKyAgY2FzZSBBUk06OnQyTERNOiByZXR1cm4gQVJNOjp0MkxETV9VUEQ7CisgIGNhc2UgQVJNOjp0MlNUTTogcmV0dXJuIEFSTTo6dDJTVE1fVVBEOworICBjYXNlIEFSTTo6VkxETVM6IHJldHVybiBBUk06OlZMRE1TX1VQRDsKKyAgY2FzZSBBUk06OlZMRE1EOiByZXR1cm4gQVJNOjpWTERNRF9VUEQ7CisgIGNhc2UgQVJNOjpWU1RNUzogcmV0dXJuIEFSTTo6VlNUTVNfVVBEOworICBjYXNlIEFSTTo6VlNUTUQ6IHJldHVybiBBUk06OlZTVE1EX1VQRDsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIG9wY29kZSEiKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIE1lcmdlQmFzZVVwZGF0ZUxTTXVsdGlwbGUgLSBGb2xkIHByb2NlZWRpbmcvdHJhaWxpbmcgaW5jL2RlYyBvZiBiYXNlCisvLy8gcmVnaXN0ZXIgaW50byB0aGUgTERNL1NUTS9WTERNe0R8U30vVlNUTXtEfFN9IG9wIHdoZW4gcG9zc2libGU6CisvLy8KKy8vLyBzdG1pYSBybiwgPHJhLCByYiwgcmM+CisvLy8gcm4gOj0gcm4gKyA0ICogMzsKKy8vLyA9PgorLy8vIHN0bWlhIHJuISwgPHJhLCByYiwgcmM+CisvLy8KKy8vLyBybiA6PSBybiAtIDQgKiAzOworLy8vIGxkbWlhIHJuLCA8cmEsIHJiLCByYz4KKy8vLyA9PgorLy8vIGxkbWRiIHJuISwgPHJhLCByYiwgcmM+Citib29sIEFSTUxvYWRTdG9yZU9wdDo6TWVyZ2VCYXNlVXBkYXRlTFNNdWx0aXBsZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQWR2YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJKSB7CisgIE1hY2hpbmVJbnN0ciAqTUkgPSBNQkJJOworICB1bnNpZ25lZCBCYXNlID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIGJvb2wgQmFzZUtpbGwgPSBNSS0+Z2V0T3BlcmFuZCgwKS5pc0tpbGwoKTsKKyAgdW5zaWduZWQgQnl0ZXMgPSBnZXRMU011bHRpcGxlVHJhbnNmZXJTaXplKE1JKTsKKyAgdW5zaWduZWQgUHJlZFJlZyA9IDA7CisgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCA9IGxsdm06OmdldEluc3RyUHJlZGljYXRlKE1JLCBQcmVkUmVnKTsKKyAgaW50IE9wY29kZSA9IE1JLT5nZXRPcGNvZGUoKTsKKyAgRGVidWdMb2MgZGwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgYm9vbCBpc0FNNCA9IChPcGNvZGUgPT0gQVJNOjpMRE0gfHwgT3Bjb2RlID09IEFSTTo6dDJMRE0gfHwKKyAgICAgICAgICAgICAgICBPcGNvZGUgPT0gQVJNOjpTVE0gfHwgT3Bjb2RlID09IEFSTTo6dDJTVE0pOworCisgIGJvb2wgRG9NZXJnZSA9IGZhbHNlOworICBBUk1fQU06OkFNU3ViTW9kZSBNb2RlID0gQVJNX0FNOjppYTsKKyAgdW5zaWduZWQgT2Zmc2V0ID0gMDsKKworICBpZiAoaXNBTTQpIHsKKyAgICAvLyBDYW4ndCB1c2UgYW4gdXBkYXRpbmcgbGQvc3QgaWYgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgYWxzbyBhIGRlc3QKKyAgICAvLyByZWdpc3Rlci4gZS5nLiBsZG1kYiByMCEsIHtyMCwgcjEsIHIyfS4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAzLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoTUktPmdldE9wZXJhbmQoaSkuZ2V0UmVnKCkgPT0gQmFzZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNb2RlID0gQVJNX0FNOjpnZXRBTTRTdWJNb2RlKE1JLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBWTERNe0R8U30sIFZTVE17RHxTfSBhZGRyZXNzaW5nIG1vZGUgNSBvcHMuCisgICAgTW9kZSA9IEFSTV9BTTo6Z2V0QU01U3ViTW9kZShNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKSk7CisgICAgT2Zmc2V0ID0gQVJNX0FNOjpnZXRBTTVPZmZzZXQoTUktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkpOworICB9CisKKyAgLy8gVHJ5IG1lcmdpbmcgd2l0aCB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbk1CQkkgPSBNQkIuYmVnaW4oKTsKKyAgaWYgKE1CQkkgIT0gQmVnaW5NQkJJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFByZXZNQkJJID0gcHJpb3IoTUJCSSk7CisgICAgd2hpbGUgKFByZXZNQkJJICE9IEJlZ2luTUJCSSAmJiBQcmV2TUJCSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICAtLVByZXZNQkJJOworICAgIGlmIChpc0FNNCkgeworICAgICAgaWYgKE1vZGUgPT0gQVJNX0FNOjppYSAmJgorICAgICAgICAgIGlzTWF0Y2hpbmdEZWNyZW1lbnQoUHJldk1CQkksIEJhc2UsIEJ5dGVzLCAwLCBQcmVkLCBQcmVkUmVnKSkgeworICAgICAgICBEb01lcmdlID0gdHJ1ZTsKKyAgICAgICAgTW9kZSA9IEFSTV9BTTo6ZGI7CisgICAgICB9IGVsc2UgaWYgKGlzQU00ICYmIE1vZGUgPT0gQVJNX0FNOjppYiAmJgorICAgICAgICAgICAgICAgICBpc01hdGNoaW5nRGVjcmVtZW50KFByZXZNQkJJLCBCYXNlLCBCeXRlcywgMCwgUHJlZCwgUHJlZFJlZykpIHsKKyAgICAgICAgRG9NZXJnZSA9IHRydWU7CisgICAgICAgIE1vZGUgPSBBUk1fQU06OmRhOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoTW9kZSA9PSBBUk1fQU06OmlhICYmCisgICAgICAgICAgaXNNYXRjaGluZ0RlY3JlbWVudChQcmV2TUJCSSwgQmFzZSwgQnl0ZXMsIDAsIFByZWQsIFByZWRSZWcpKSB7CisgICAgICAgIE1vZGUgPSBBUk1fQU06OmRiOworICAgICAgICBEb01lcmdlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKERvTWVyZ2UpCisgICAgICBNQkIuZXJhc2UoUHJldk1CQkkpOworICB9CisKKyAgLy8gVHJ5IG1lcmdpbmcgd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVuZE1CQkkgPSBNQkIuZW5kKCk7CisgIGlmICghRG9NZXJnZSAmJiBNQkJJICE9IEVuZE1CQkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTmV4dE1CQkkgPSBsbHZtOjpuZXh0KE1CQkkpOworICAgIHdoaWxlIChOZXh0TUJCSSAhPSBFbmRNQkJJICYmIE5leHRNQkJJLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICsrTmV4dE1CQkk7CisgICAgaWYgKGlzQU00KSB7CisgICAgICBpZiAoKE1vZGUgPT0gQVJNX0FNOjppYSB8fCBNb2RlID09IEFSTV9BTTo6aWIpICYmCisgICAgICAgICAgaXNNYXRjaGluZ0luY3JlbWVudChOZXh0TUJCSSwgQmFzZSwgQnl0ZXMsIDAsIFByZWQsIFByZWRSZWcpKSB7CisgICAgICAgIERvTWVyZ2UgPSB0cnVlOworICAgICAgfSBlbHNlIGlmICgoTW9kZSA9PSBBUk1fQU06OmRhIHx8IE1vZGUgPT0gQVJNX0FNOjpkYikgJiYKKyAgICAgICAgICAgICAgICAgaXNNYXRjaGluZ0RlY3JlbWVudChOZXh0TUJCSSwgQmFzZSwgQnl0ZXMsIDAsIFByZWQsIFByZWRSZWcpKSB7CisgICAgICAgIERvTWVyZ2UgPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoTW9kZSA9PSBBUk1fQU06OmlhICYmCisgICAgICAgICAgaXNNYXRjaGluZ0luY3JlbWVudChOZXh0TUJCSSwgQmFzZSwgQnl0ZXMsIDAsIFByZWQsIFByZWRSZWcpKSB7CisgICAgICAgIERvTWVyZ2UgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoRG9NZXJnZSkgeworICAgICAgaWYgKE5leHRNQkJJID09IEkpIHsKKyAgICAgICAgQWR2YW5jZSA9IHRydWU7CisgICAgICAgICsrSTsKKyAgICAgIH0KKyAgICAgIE1CQi5lcmFzZShOZXh0TUJCSSk7CisgICAgfQorICB9CisKKyAgaWYgKCFEb01lcmdlKQorICAgIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCBOZXdPcGMgPSBnZXRVcGRhdGluZ0xTTXVsdGlwbGVPcGNvZGUoT3Bjb2RlKTsKKyAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS0+Z2V0KE5ld09wYykpCisgICAgLmFkZFJlZyhCYXNlLCBnZXREZWZSZWdTdGF0ZSh0cnVlKSkgLy8gV0IgYmFzZSByZWdpc3RlcgorICAgIC5hZGRSZWcoQmFzZSwgZ2V0S2lsbFJlZ1N0YXRlKEJhc2VLaWxsKSk7CisgIGlmIChpc0FNNCkgeworICAgIC8vIFt0Ml1MRE1fVVBELCBbdDJdU1RNX1VQRAorICAgIE1JQi5hZGRJbW0oQVJNX0FNOjpnZXRBTTRNb2RlSW1tKE1vZGUpKQorICAgICAgLmFkZEltbShQcmVkKS5hZGRSZWcoUHJlZFJlZyk7CisgIH0gZWxzZSB7CisgICAgLy8gVkxETVtTRH1fVVBELCBWU1RNW1NEXV9VUEQKKyAgICBNSUIuYWRkSW1tKEFSTV9BTTo6Z2V0QU01T3BjKE1vZGUsIE9mZnNldCkpCisgICAgICAuYWRkSW1tKFByZWQpLmFkZFJlZyhQcmVkUmVnKTsKKyAgfQorICAvLyBUcmFuc2ZlciB0aGUgcmVzdCBvZiBvcGVyYW5kcy4KKyAgZm9yICh1bnNpZ25lZCBPcE51bSA9IDQsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgT3BOdW0gIT0gZTsgKytPcE51bSkKKyAgICBNSUIuYWRkT3BlcmFuZChNSS0+Z2V0T3BlcmFuZChPcE51bSkpOworICAvLyBUcmFuc2ZlciBtZW1vcGVyYW5kcy4KKyAgKCpNSUIpLnNldE1lbVJlZnMoTUktPm1lbW9wZXJhbmRzX2JlZ2luKCksIE1JLT5tZW1vcGVyYW5kc19lbmQoKSk7CisKKyAgTUJCLmVyYXNlKE1CQkkpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGdldFByZUluZGV4ZWRMb2FkU3RvcmVPcGNvZGUodW5zaWduZWQgT3BjKSB7CisgIHN3aXRjaCAoT3BjKSB7CisgIGNhc2UgQVJNOjpMRFI6IHJldHVybiBBUk06OkxEUl9QUkU7CisgIGNhc2UgQVJNOjpTVFI6IHJldHVybiBBUk06OlNUUl9QUkU7CisgIGNhc2UgQVJNOjpWTERSUzogcmV0dXJuIEFSTTo6VkxETVNfVVBEOworICBjYXNlIEFSTTo6VkxEUkQ6IHJldHVybiBBUk06OlZMRE1EX1VQRDsKKyAgY2FzZSBBUk06OlZTVFJTOiByZXR1cm4gQVJNOjpWU1RNU19VUEQ7CisgIGNhc2UgQVJNOjpWU1RSRDogcmV0dXJuIEFSTTo6VlNUTURfVVBEOworICBjYXNlIEFSTTo6dDJMRFJpODoKKyAgY2FzZSBBUk06OnQyTERSaTEyOgorICAgIHJldHVybiBBUk06OnQyTERSX1BSRTsKKyAgY2FzZSBBUk06OnQyU1RSaTg6CisgIGNhc2UgQVJNOjp0MlNUUmkxMjoKKyAgICByZXR1cm4gQVJNOjp0MlNUUl9QUkU7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBvcGNvZGUhIik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBnZXRQb3N0SW5kZXhlZExvYWRTdG9yZU9wY29kZSh1bnNpZ25lZCBPcGMpIHsKKyAgc3dpdGNoIChPcGMpIHsKKyAgY2FzZSBBUk06OkxEUjogcmV0dXJuIEFSTTo6TERSX1BPU1Q7CisgIGNhc2UgQVJNOjpTVFI6IHJldHVybiBBUk06OlNUUl9QT1NUOworICBjYXNlIEFSTTo6VkxEUlM6IHJldHVybiBBUk06OlZMRE1TX1VQRDsKKyAgY2FzZSBBUk06OlZMRFJEOiByZXR1cm4gQVJNOjpWTERNRF9VUEQ7CisgIGNhc2UgQVJNOjpWU1RSUzogcmV0dXJuIEFSTTo6VlNUTVNfVVBEOworICBjYXNlIEFSTTo6VlNUUkQ6IHJldHVybiBBUk06OlZTVE1EX1VQRDsKKyAgY2FzZSBBUk06OnQyTERSaTg6CisgIGNhc2UgQVJNOjp0MkxEUmkxMjoKKyAgICByZXR1cm4gQVJNOjp0MkxEUl9QT1NUOworICBjYXNlIEFSTTo6dDJTVFJpODoKKyAgY2FzZSBBUk06OnQyU1RSaTEyOgorICAgIHJldHVybiBBUk06OnQyU1RSX1BPU1Q7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBvcGNvZGUhIik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBNZXJnZUJhc2VVcGRhdGVMb2FkU3RvcmUgLSBGb2xkIHByb2NlZWRpbmcvdHJhaWxpbmcgaW5jL2RlYyBvZiBiYXNlCisvLy8gcmVnaXN0ZXIgaW50byB0aGUgTERSL1NUUi9GTER7RHxTfS9GU1R7RHxTfSBvcCB3aGVuIHBvc3NpYmxlOgorYm9vbCBBUk1Mb2FkU3RvcmVPcHQ6Ok1lcmdlQmFzZVVwZGF0ZUxvYWRTdG9yZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkFkdmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gTUJCSTsKKyAgdW5zaWduZWQgQmFzZSA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICBib29sIEJhc2VLaWxsID0gTUktPmdldE9wZXJhbmQoMSkuaXNLaWxsKCk7CisgIHVuc2lnbmVkIEJ5dGVzID0gZ2V0TFNNdWx0aXBsZVRyYW5zZmVyU2l6ZShNSSk7CisgIGludCBPcGNvZGUgPSBNSS0+Z2V0T3Bjb2RlKCk7CisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisgIGJvb2wgaXNBTTUgPSAoT3Bjb2RlID09IEFSTTo6VkxEUkQgfHwgT3Bjb2RlID09IEFSTTo6VkxEUlMgfHwKKyAgICAgICAgICAgICAgICBPcGNvZGUgPT0gQVJNOjpWU1RSRCB8fCBPcGNvZGUgPT0gQVJNOjpWU1RSUyk7CisgIGJvb2wgaXNBTTIgPSAoT3Bjb2RlID09IEFSTTo6TERSIHx8IE9wY29kZSA9PSBBUk06OlNUUik7CisgIGlmIChpc0FNMiAmJiBBUk1fQU06OmdldEFNMk9mZnNldChNSS0+Z2V0T3BlcmFuZCgzKS5nZXRJbW0oKSkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChpc0FNNSAmJiBBUk1fQU06OmdldEFNNU9mZnNldChNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChpc1QyaTMyTG9hZChPcGNvZGUpIHx8IGlzVDJpMzJTdG9yZShPcGNvZGUpKQorICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSAhPSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgaXNMZCA9IGlzaTMyTG9hZChPcGNvZGUpIHx8IE9wY29kZSA9PSBBUk06OlZMRFJTIHx8IE9wY29kZSA9PSBBUk06OlZMRFJEOworICAvLyBDYW4ndCBkbyB0aGUgbWVyZ2UgaWYgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGlzIHRoZSBzYW1lIGFzIHRoZSB3b3VsZC1iZQorICAvLyB3cml0ZWJhY2sgcmVnaXN0ZXIuCisgIGlmIChpc0xkICYmIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpID09IEJhc2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIFByZWRSZWcgPSAwOworICBBUk1DQzo6Q29uZENvZGVzIFByZWQgPSBsbHZtOjpnZXRJbnN0clByZWRpY2F0ZShNSSwgUHJlZFJlZyk7CisgIGJvb2wgRG9NZXJnZSA9IGZhbHNlOworICBBUk1fQU06OkFkZHJPcGMgQWRkU3ViID0gQVJNX0FNOjphZGQ7CisgIHVuc2lnbmVkIE5ld09wYyA9IDA7CisgIC8vIEFNMiAtIDEyIGJpdHMsIHRodW1iMiAtIDggYml0cy4KKyAgdW5zaWduZWQgTGltaXQgPSBpc0FNNSA/IDAgOiAoaXNBTTIgPyAweDEwMDAgOiAweDEwMCk7CisKKyAgLy8gVHJ5IG1lcmdpbmcgd2l0aCB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbk1CQkkgPSBNQkIuYmVnaW4oKTsKKyAgaWYgKE1CQkkgIT0gQmVnaW5NQkJJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFByZXZNQkJJID0gcHJpb3IoTUJCSSk7CisgICAgd2hpbGUgKFByZXZNQkJJICE9IEJlZ2luTUJCSSAmJiBQcmV2TUJCSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICAtLVByZXZNQkJJOworICAgIGlmIChpc01hdGNoaW5nRGVjcmVtZW50KFByZXZNQkJJLCBCYXNlLCBCeXRlcywgTGltaXQsIFByZWQsIFByZWRSZWcpKSB7CisgICAgICBEb01lcmdlID0gdHJ1ZTsKKyAgICAgIEFkZFN1YiA9IEFSTV9BTTo6c3ViOworICAgIH0gZWxzZSBpZiAoIWlzQU01ICYmCisgICAgICAgICAgICAgICBpc01hdGNoaW5nSW5jcmVtZW50KFByZXZNQkJJLCBCYXNlLCBCeXRlcywgTGltaXQsUHJlZCxQcmVkUmVnKSkgeworICAgICAgRG9NZXJnZSA9IHRydWU7CisgICAgfQorICAgIGlmIChEb01lcmdlKSB7CisgICAgICBOZXdPcGMgPSBnZXRQcmVJbmRleGVkTG9hZFN0b3JlT3Bjb2RlKE9wY29kZSk7CisgICAgICBNQkIuZXJhc2UoUHJldk1CQkkpOworICAgIH0KKyAgfQorCisgIC8vIFRyeSBtZXJnaW5nIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFbmRNQkJJID0gTUJCLmVuZCgpOworICBpZiAoIURvTWVyZ2UgJiYgTUJCSSAhPSBFbmRNQkJJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE5leHRNQkJJID0gbGx2bTo6bmV4dChNQkJJKTsKKyAgICB3aGlsZSAoTmV4dE1CQkkgIT0gRW5kTUJCSSAmJiBOZXh0TUJCSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICArK05leHRNQkJJOworICAgIGlmICghaXNBTTUgJiYKKyAgICAgICAgaXNNYXRjaGluZ0RlY3JlbWVudChOZXh0TUJCSSwgQmFzZSwgQnl0ZXMsIExpbWl0LCBQcmVkLCBQcmVkUmVnKSkgeworICAgICAgRG9NZXJnZSA9IHRydWU7CisgICAgICBBZGRTdWIgPSBBUk1fQU06OnN1YjsKKyAgICB9IGVsc2UgaWYgKGlzTWF0Y2hpbmdJbmNyZW1lbnQoTmV4dE1CQkksIEJhc2UsIEJ5dGVzLCBMaW1pdCxQcmVkLFByZWRSZWcpKSB7CisgICAgICBEb01lcmdlID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKERvTWVyZ2UpIHsKKyAgICAgIE5ld09wYyA9IGdldFBvc3RJbmRleGVkTG9hZFN0b3JlT3Bjb2RlKE9wY29kZSk7CisgICAgICBpZiAoTmV4dE1CQkkgPT0gSSkgeworICAgICAgICBBZHZhbmNlID0gdHJ1ZTsKKyAgICAgICAgKytJOworICAgICAgfQorICAgICAgTUJCLmVyYXNlKE5leHRNQkJJKTsKKyAgICB9CisgIH0KKworICBpZiAoIURvTWVyZ2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgaXNEUFIgPSBOZXdPcGMgPT0gQVJNOjpWTERNRCB8fCBOZXdPcGMgPT0gQVJNOjpWU1RNRDsKKyAgdW5zaWduZWQgT2Zmc2V0ID0gMDsKKyAgaWYgKGlzQU01KQorICAgIE9mZnNldCA9IEFSTV9BTTo6Z2V0QU01T3BjKEFkZFN1YiA9PSBBUk1fQU06OnN1YiA/IEFSTV9BTTo6ZGIgOiBBUk1fQU06OmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc0RQUiA/IDIgOiAxKSk7CisgIGVsc2UgaWYgKGlzQU0yKQorICAgIE9mZnNldCA9IEFSTV9BTTo6Z2V0QU0yT3BjKEFkZFN1YiwgQnl0ZXMsIEFSTV9BTTo6bm9fc2hpZnQpOworICBlbHNlCisgICAgT2Zmc2V0ID0gQWRkU3ViID09IEFSTV9BTTo6c3ViID8gLUJ5dGVzIDogQnl0ZXM7CisKKyAgaWYgKGlzQU01KSB7CisgICAgLy8gVkxETVtTRH1fVVBELCBWU1RNW1NEXV9VUEQKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS0+Z2V0KE5ld09wYykpCisgICAgICAuYWRkUmVnKEJhc2UsIGdldERlZlJlZ1N0YXRlKHRydWUpKSAvLyBXQiBiYXNlIHJlZ2lzdGVyCisgICAgICAuYWRkUmVnKEJhc2UsIGdldEtpbGxSZWdTdGF0ZShpc0xkID8gQmFzZUtpbGwgOiBmYWxzZSkpCisgICAgICAuYWRkSW1tKE9mZnNldCkKKyAgICAgIC5hZGRJbW0oUHJlZCkuYWRkUmVnKFByZWRSZWcpCisgICAgICAuYWRkUmVnKE1PLmdldFJlZygpLCAoaXNMZCA/IGdldERlZlJlZ1N0YXRlKHRydWUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRLaWxsUmVnU3RhdGUoTU8uaXNLaWxsKCkpKSk7CisgIH0gZWxzZSBpZiAoaXNMZCkgeworICAgIGlmIChpc0FNMikKKyAgICAgIC8vIExEUl9QUkUsIExEUl9QT1NULAorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUktPmdldChOZXdPcGMpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAgICAgLmFkZFJlZyhCYXNlLCBSZWdTdGF0ZTo6RGVmaW5lKQorICAgICAgICAuYWRkUmVnKEJhc2UpLmFkZFJlZygwKS5hZGRJbW0oT2Zmc2V0KS5hZGRJbW0oUHJlZCkuYWRkUmVnKFByZWRSZWcpOworICAgIGVsc2UKKyAgICAgIC8vIHQyTERSX1BSRSwgdDJMRFJfUE9TVAorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUktPmdldChOZXdPcGMpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAgICAgLmFkZFJlZyhCYXNlLCBSZWdTdGF0ZTo6RGVmaW5lKQorICAgICAgICAuYWRkUmVnKEJhc2UpLmFkZEltbShPZmZzZXQpLmFkZEltbShQcmVkKS5hZGRSZWcoUHJlZFJlZyk7CisgIH0gZWxzZSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoMCk7CisgICAgaWYgKGlzQU0yKQorICAgICAgLy8gU1RSX1BSRSwgU1RSX1BPU1QKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLT5nZXQoTmV3T3BjKSwgQmFzZSkKKyAgICAgICAgLmFkZFJlZyhNTy5nZXRSZWcoKSwgZ2V0S2lsbFJlZ1N0YXRlKE1PLmlzS2lsbCgpKSkKKyAgICAgICAgLmFkZFJlZyhCYXNlKS5hZGRSZWcoMCkuYWRkSW1tKE9mZnNldCkuYWRkSW1tKFByZWQpLmFkZFJlZyhQcmVkUmVnKTsKKyAgICBlbHNlCisgICAgICAvLyB0MlNUUl9QUkUsIHQyU1RSX1BPU1QKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLT5nZXQoTmV3T3BjKSwgQmFzZSkKKyAgICAgICAgLmFkZFJlZyhNTy5nZXRSZWcoKSwgZ2V0S2lsbFJlZ1N0YXRlKE1PLmlzS2lsbCgpKSkKKyAgICAgICAgLmFkZFJlZyhCYXNlKS5hZGRJbW0oT2Zmc2V0KS5hZGRJbW0oUHJlZCkuYWRkUmVnKFByZWRSZWcpOworICB9CisgIE1CQi5lcmFzZShNQkJJKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzTWVtb3J5T3AgLSBSZXR1cm5zIHRydWUgaWYgaW5zdHJ1Y3Rpb24gaXMgYSBtZW1vcnkgb3BlcmF0aW9ucyAodGhhdCB0aGlzCisvLy8gcGFzcyBpcyBjYXBhYmxlIG9mIG9wZXJhdGluZyBvbikuCitzdGF0aWMgYm9vbCBpc01lbW9yeU9wKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgLy8gV2hlbiBubyBtZW1vcnkgb3BlcmFuZHMgYXJlIHByZXNlbnQsIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSB1bmFsaWduZWQsCisgIC8vIHZvbGF0aWxlLCB1bmZvbGRhYmxlLgorICBpZiAoIU1JLT5oYXNPbmVNZW1PcGVyYW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICpNTU8gPSAqTUktPm1lbW9wZXJhbmRzX2JlZ2luKCk7CisKKyAgLy8gRG9uJ3QgdG91Y2ggdm9sYXRpbGUgbWVtb3J5IGFjY2Vzc2VzIC0gd2UgbWF5IGJlIGNoYW5naW5nIHRoZWlyIG9yZGVyLgorICBpZiAoTU1PLT5pc1ZvbGF0aWxlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFVuYWxpZ25lZCBsZHIvc3RyIGlzIGVtdWxhdGVkIGJ5IHNvbWUga2VybmVscywgYnV0IHVuYWxpZ25lZCBsZG0vc3RtIGlzCisgIC8vIG5vdC4KKyAgaWYgKE1NTy0+Z2V0QWxpZ25tZW50KCkgPCA0KQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBzdHIgPHVuZGVmPiBjb3VsZCBwcm9iYWJseSBiZSBlbGltaW5hdGVkIGVudGlyZWx5LCBidXQgZm9yIG5vdyB3ZSBqdXN0IHdhbnQKKyAgLy8gdG8gYXZvaWQgbWFraW5nIGEgbWVzcyBvZiBpdC4KKyAgLy8gRklYTUU6IFVzZSBzdHIgPHVuZGVmPiBhcyBhIHdpbGRjYXJkIHRvIGVuYWJsZSBiZXR0ZXIgc3RtIGZvbGRpbmcuCisgIGlmIChNSS0+Z2V0TnVtT3BlcmFuZHMoKSA+IDAgJiYgTUktPmdldE9wZXJhbmQoMCkuaXNSZWcoKSAmJgorICAgICAgTUktPmdldE9wZXJhbmQoMCkuaXNVbmRlZigpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBMaWtld2lzZSBkb24ndCBtZXNzIHdpdGggcmVmZXJlbmNlcyB0byB1bmRlZmluZWQgYWRkcmVzc2VzLgorICBpZiAoTUktPmdldE51bU9wZXJhbmRzKCkgPiAxICYmIE1JLT5nZXRPcGVyYW5kKDEpLmlzUmVnKCkgJiYKKyAgICAgIE1JLT5nZXRPcGVyYW5kKDEpLmlzVW5kZWYoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IE9wY29kZSA9IE1JLT5nZXRPcGNvZGUoKTsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgQVJNOjpMRFI6CisgIGNhc2UgQVJNOjpTVFI6CisgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKDEpLmlzUmVnKCkgJiYgTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCkgPT0gMDsKKyAgY2FzZSBBUk06OlZMRFJTOgorICBjYXNlIEFSTTo6VlNUUlM6CisgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKDEpLmlzUmVnKCk7CisgIGNhc2UgQVJNOjpWTERSRDoKKyAgY2FzZSBBUk06OlZTVFJEOgorICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgxKS5pc1JlZygpOworICBjYXNlIEFSTTo6dDJMRFJpODoKKyAgY2FzZSBBUk06OnQyTERSaTEyOgorICBjYXNlIEFSTTo6dDJTVFJpODoKKyAgY2FzZSBBUk06OnQyU1RSaTEyOgorICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgxKS5pc1JlZygpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEFkdmFuY2VSUyAtIEFkdmFuY2UgcmVnaXN0ZXIgc2NhdmVuZ2VyIHRvIGp1c3QgYmVmb3JlIHRoZSBlYXJsaWVzdCBtZW1vcnkKKy8vLyBvcCB0aGF0IGlzIGJlaW5nIG1lcmdlZC4KK3ZvaWQgQVJNTG9hZFN0b3JlT3B0OjpBZHZhbmNlUlMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWVtT3BRdWV1ZSAmTWVtT3BzKSB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBMb2MgPSBNZW1PcHNbMF0uTUJCSTsKKyAgdW5zaWduZWQgUG9zaXRpb24gPSBNZW1PcHNbMF0uUG9zaXRpb247CisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBNZW1PcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChNZW1PcHNbaV0uUG9zaXRpb24gPCBQb3NpdGlvbikgeworICAgICAgUG9zaXRpb24gPSBNZW1PcHNbaV0uUG9zaXRpb247CisgICAgICBMb2MgPSBNZW1PcHNbaV0uTUJCSTsKKyAgICB9CisgIH0KKworICBpZiAoTG9jICE9IE1CQi5iZWdpbigpKQorICAgIFJTLT5mb3J3YXJkKHByaW9yKExvYykpOworfQorCitzdGF0aWMgaW50IGdldE1lbW9yeU9wT2Zmc2V0KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgaW50IE9wY29kZSA9IE1JLT5nZXRPcGNvZGUoKTsKKyAgYm9vbCBpc0FNMiA9IE9wY29kZSA9PSBBUk06OkxEUiB8fCBPcGNvZGUgPT0gQVJNOjpTVFI7CisgIGJvb2wgaXNBTTMgPSBPcGNvZGUgPT0gQVJNOjpMRFJEIHx8IE9wY29kZSA9PSBBUk06OlNUUkQ7CisgIHVuc2lnbmVkIE51bU9wZXJhbmRzID0gTUktPmdldERlc2MoKS5nZXROdW1PcGVyYW5kcygpOworICB1bnNpZ25lZCBPZmZGaWVsZCA9IE1JLT5nZXRPcGVyYW5kKE51bU9wZXJhbmRzLTMpLmdldEltbSgpOworCisgIGlmIChPcGNvZGUgPT0gQVJNOjp0MkxEUmkxMiB8fCBPcGNvZGUgPT0gQVJNOjp0MkxEUmk4IHx8CisgICAgICBPcGNvZGUgPT0gQVJNOjp0MlNUUmkxMiB8fCBPcGNvZGUgPT0gQVJNOjp0MlNUUmk4IHx8CisgICAgICBPcGNvZGUgPT0gQVJNOjp0MkxEUkRpOCB8fCBPcGNvZGUgPT0gQVJNOjp0MlNUUkRpOCkKKyAgICByZXR1cm4gT2ZmRmllbGQ7CisKKyAgaW50IE9mZnNldCA9IGlzQU0yCisgICAgPyBBUk1fQU06OmdldEFNMk9mZnNldChPZmZGaWVsZCkKKyAgICA6IChpc0FNMyA/IEFSTV9BTTo6Z2V0QU0zT2Zmc2V0KE9mZkZpZWxkKQorICAgICAgICAgICAgIDogQVJNX0FNOjpnZXRBTTVPZmZzZXQoT2ZmRmllbGQpICogNCk7CisgIGlmIChpc0FNMikgeworICAgIGlmIChBUk1fQU06OmdldEFNMk9wKE9mZkZpZWxkKSA9PSBBUk1fQU06OnN1YikKKyAgICAgIE9mZnNldCA9IC1PZmZzZXQ7CisgIH0gZWxzZSBpZiAoaXNBTTMpIHsKKyAgICBpZiAoQVJNX0FNOjpnZXRBTTNPcChPZmZGaWVsZCkgPT0gQVJNX0FNOjpzdWIpCisgICAgICBPZmZzZXQgPSAtT2Zmc2V0OworICB9IGVsc2UgeworICAgIGlmIChBUk1fQU06OmdldEFNNU9wKE9mZkZpZWxkKSA9PSBBUk1fQU06OnN1YikKKyAgICAgIE9mZnNldCA9IC1PZmZzZXQ7CisgIH0KKyAgcmV0dXJuIE9mZnNldDsKK30KKworc3RhdGljIHZvaWQgSW5zZXJ0TERSX1NUUihNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBPZmZJbW0sIGJvb2wgaXNEZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCB1bnNpZ25lZCBOZXdPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywgYm9vbCBSZWdEZWFkS2lsbCwgYm9vbCBSZWdVbmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQmFzZVJlZywgYm9vbCBCYXNlS2lsbCwgYm9vbCBCYXNlVW5kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9mZlJlZywgYm9vbCBPZmZLaWxsLCBib29sIE9mZlVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Q29uZENvZGVzIFByZWQsIHVuc2lnbmVkIFByZWRSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLCBib29sIGlzVDIpIHsKKyAgaW50IE9mZnNldCA9IE9mZkltbTsKKyAgaWYgKCFpc1QyKSB7CisgICAgaWYgKE9mZkltbSA8IDApCisgICAgICBPZmZzZXQgPSBBUk1fQU06OmdldEFNMk9wYyhBUk1fQU06OnN1YiwgLU9mZkltbSwgQVJNX0FNOjpub19zaGlmdCk7CisgICAgZWxzZQorICAgICAgT2Zmc2V0ID0gQVJNX0FNOjpnZXRBTTJPcGMoQVJNX0FNOjphZGQsIE9mZkltbSwgQVJNX0FNOjpub19zaGlmdCk7CisgIH0KKyAgaWYgKGlzRGVmKSB7CisgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKE1CQiwgTUJCSSwgTUJCSS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoTmV3T3BjKSkKKyAgICAgIC5hZGRSZWcoUmVnLCBnZXREZWZSZWdTdGF0ZSh0cnVlKSB8IGdldERlYWRSZWdTdGF0ZShSZWdEZWFkS2lsbCkpCisgICAgICAuYWRkUmVnKEJhc2VSZWcsIGdldEtpbGxSZWdTdGF0ZShCYXNlS2lsbCl8Z2V0VW5kZWZSZWdTdGF0ZShCYXNlVW5kZWYpKTsKKyAgICBpZiAoIWlzVDIpCisgICAgICBNSUIuYWRkUmVnKE9mZlJlZywgIGdldEtpbGxSZWdTdGF0ZShPZmZLaWxsKXxnZXRVbmRlZlJlZ1N0YXRlKE9mZlVuZGVmKSk7CisgICAgTUlCLmFkZEltbShPZmZzZXQpLmFkZEltbShQcmVkKS5hZGRSZWcoUHJlZFJlZyk7CisgIH0gZWxzZSB7CisgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKE1CQiwgTUJCSSwgTUJCSS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoTmV3T3BjKSkKKyAgICAgIC5hZGRSZWcoUmVnLCBnZXRLaWxsUmVnU3RhdGUoUmVnRGVhZEtpbGwpIHwgZ2V0VW5kZWZSZWdTdGF0ZShSZWdVbmRlZikpCisgICAgICAuYWRkUmVnKEJhc2VSZWcsIGdldEtpbGxSZWdTdGF0ZShCYXNlS2lsbCl8Z2V0VW5kZWZSZWdTdGF0ZShCYXNlVW5kZWYpKTsKKyAgICBpZiAoIWlzVDIpCisgICAgICBNSUIuYWRkUmVnKE9mZlJlZywgIGdldEtpbGxSZWdTdGF0ZShPZmZLaWxsKXxnZXRVbmRlZlJlZ1N0YXRlKE9mZlVuZGVmKSk7CisgICAgTUlCLmFkZEltbShPZmZzZXQpLmFkZEltbShQcmVkKS5hZGRSZWcoUHJlZFJlZyk7CisgIH0KK30KKworYm9vbCBBUk1Mb2FkU3RvcmVPcHQ6OkZpeEludmFsaWRSZWdQYWlyT3AoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUJCSSkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gJipNQkJJOworICB1bnNpZ25lZCBPcGNvZGUgPSBNSS0+Z2V0T3Bjb2RlKCk7CisgIGlmIChPcGNvZGUgPT0gQVJNOjpMRFJEIHx8IE9wY29kZSA9PSBBUk06OlNUUkQgfHwKKyAgICAgIE9wY29kZSA9PSBBUk06OnQyTERSRGk4IHx8IE9wY29kZSA9PSBBUk06OnQyU1RSRGk4KSB7CisgICAgdW5zaWduZWQgRXZlblJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIHVuc2lnbmVkIE9kZFJlZyAgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBFdmVuUmVnTnVtID0gVFJJLT5nZXREd2FyZlJlZ051bShFdmVuUmVnLCBmYWxzZSk7CisgICAgdW5zaWduZWQgT2RkUmVnTnVtICA9IFRSSS0+Z2V0RHdhcmZSZWdOdW0oT2RkUmVnLCBmYWxzZSk7CisgICAgaWYgKChFdmVuUmVnTnVtICYgMSkgPT0gMCAmJiAoRXZlblJlZ051bSArIDEpID09IE9kZFJlZ051bSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBOZXdCQkkgPSBNQkJJOworICAgIGJvb2wgaXNUMiA9IE9wY29kZSA9PSBBUk06OnQyTERSRGk4IHx8IE9wY29kZSA9PSBBUk06OnQyU1RSRGk4OworICAgIGJvb2wgaXNMZCA9IE9wY29kZSA9PSBBUk06OkxEUkQgfHwgT3Bjb2RlID09IEFSTTo6dDJMRFJEaTg7CisgICAgYm9vbCBFdmVuRGVhZEtpbGwgPSBpc0xkID8KKyAgICAgIE1JLT5nZXRPcGVyYW5kKDApLmlzRGVhZCgpIDogTUktPmdldE9wZXJhbmQoMCkuaXNLaWxsKCk7CisgICAgYm9vbCBFdmVuVW5kZWYgPSBNSS0+Z2V0T3BlcmFuZCgwKS5pc1VuZGVmKCk7CisgICAgYm9vbCBPZGREZWFkS2lsbCAgPSBpc0xkID8KKyAgICAgIE1JLT5nZXRPcGVyYW5kKDEpLmlzRGVhZCgpIDogTUktPmdldE9wZXJhbmQoMSkuaXNLaWxsKCk7CisgICAgYm9vbCBPZGRVbmRlZiA9IE1JLT5nZXRPcGVyYW5kKDEpLmlzVW5kZWYoKTsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmQmFzZU9wID0gTUktPmdldE9wZXJhbmQoMik7CisgICAgdW5zaWduZWQgQmFzZVJlZyA9IEJhc2VPcC5nZXRSZWcoKTsKKyAgICBib29sIEJhc2VLaWxsID0gQmFzZU9wLmlzS2lsbCgpOworICAgIGJvb2wgQmFzZVVuZGVmID0gQmFzZU9wLmlzVW5kZWYoKTsKKyAgICB1bnNpZ25lZCBPZmZSZWcgPSBpc1QyID8gMCA6IE1JLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpOworICAgIGJvb2wgT2ZmS2lsbCA9IGlzVDIgPyBmYWxzZSA6IE1JLT5nZXRPcGVyYW5kKDMpLmlzS2lsbCgpOworICAgIGJvb2wgT2ZmVW5kZWYgPSBpc1QyID8gZmFsc2UgOiBNSS0+Z2V0T3BlcmFuZCgzKS5pc1VuZGVmKCk7CisgICAgaW50IE9mZkltbSA9IGdldE1lbW9yeU9wT2Zmc2V0KE1JKTsKKyAgICB1bnNpZ25lZCBQcmVkUmVnID0gMDsKKyAgICBBUk1DQzo6Q29uZENvZGVzIFByZWQgPSBsbHZtOjpnZXRJbnN0clByZWRpY2F0ZShNSSwgUHJlZFJlZyk7CisKKyAgICBpZiAoT2RkUmVnTnVtID4gRXZlblJlZ051bSAmJiBPZmZSZWcgPT0gMCAmJiBPZmZJbW0gPT0gMCkgeworICAgICAgLy8gQXNjZW5kaW5nIHJlZ2lzdGVyIG51bWJlcnMgYW5kIG5vIG9mZnNldC4gSXQncyBzYWZlIHRvIGNoYW5nZSBpdCB0byBhCisgICAgICAvLyBsZG0gb3Igc3RtLgorICAgICAgdW5zaWduZWQgTmV3T3BjID0gKGlzTGQpCisgICAgICAgID8gKGlzVDIgPyBBUk06OnQyTERNIDogQVJNOjpMRE0pCisgICAgICAgIDogKGlzVDIgPyBBUk06OnQyU1RNIDogQVJNOjpTVE0pOworICAgICAgaWYgKGlzTGQpIHsKKyAgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIE1CQkktPmdldERlYnVnTG9jKCksIFRJSS0+Z2V0KE5ld09wYykpCisgICAgICAgICAgLmFkZFJlZyhCYXNlUmVnLCBnZXRLaWxsUmVnU3RhdGUoQmFzZUtpbGwpKQorICAgICAgICAgIC5hZGRJbW0oQVJNX0FNOjpnZXRBTTRNb2RlSW1tKEFSTV9BTTo6aWEpKQorICAgICAgICAgIC5hZGRJbW0oUHJlZCkuYWRkUmVnKFByZWRSZWcpCisgICAgICAgICAgLmFkZFJlZyhFdmVuUmVnLCBnZXREZWZSZWdTdGF0ZShpc0xkKSB8IGdldERlYWRSZWdTdGF0ZShFdmVuRGVhZEtpbGwpKQorICAgICAgICAgIC5hZGRSZWcoT2RkUmVnLCAgZ2V0RGVmUmVnU3RhdGUoaXNMZCkgfCBnZXREZWFkUmVnU3RhdGUoT2RkRGVhZEtpbGwpKTsKKyAgICAgICAgKytOdW1MRFJEMkxETTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBNQkJJLT5nZXREZWJ1Z0xvYygpLCBUSUktPmdldChOZXdPcGMpKQorICAgICAgICAgIC5hZGRSZWcoQmFzZVJlZywgZ2V0S2lsbFJlZ1N0YXRlKEJhc2VLaWxsKSkKKyAgICAgICAgICAuYWRkSW1tKEFSTV9BTTo6Z2V0QU00TW9kZUltbShBUk1fQU06OmlhKSkKKyAgICAgICAgICAuYWRkSW1tKFByZWQpLmFkZFJlZyhQcmVkUmVnKQorICAgICAgICAgIC5hZGRSZWcoRXZlblJlZywKKyAgICAgICAgICAgICAgICAgIGdldEtpbGxSZWdTdGF0ZShFdmVuRGVhZEtpbGwpIHwgZ2V0VW5kZWZSZWdTdGF0ZShFdmVuVW5kZWYpKQorICAgICAgICAgIC5hZGRSZWcoT2RkUmVnLAorICAgICAgICAgICAgICAgICAgZ2V0S2lsbFJlZ1N0YXRlKE9kZERlYWRLaWxsKSAgfCBnZXRVbmRlZlJlZ1N0YXRlKE9kZFVuZGVmKSk7CisgICAgICAgICsrTnVtU1RSRDJTVE07CisgICAgICB9CisgICAgICBOZXdCQkkgPSBsbHZtOjpwcmlvcihNQkJJKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU3BsaXQgaW50byB0d28gaW5zdHJ1Y3Rpb25zLgorICAgICAgYXNzZXJ0KCghaXNUMiB8fCAhT2ZmUmVnKSAmJgorICAgICAgICAgICAgICJUaHVtYjIgbGRyZCAvIHN0cmQgZG9lcyBub3QgZW5jb2RlIG9mZnNldCByZWdpc3RlciEiKTsKKyAgICAgIHVuc2lnbmVkIE5ld09wYyA9IChpc0xkKQorICAgICAgICA/IChpc1QyID8gKE9mZkltbSA8IDAgPyBBUk06OnQyTERSaTggOiBBUk06OnQyTERSaTEyKSA6IEFSTTo6TERSKQorICAgICAgICA6IChpc1QyID8gKE9mZkltbSA8IDAgPyBBUk06OnQyU1RSaTggOiBBUk06OnQyU1RSaTEyKSA6IEFSTTo6U1RSKTsKKyAgICAgIERlYnVnTG9jIGRsID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBsb2FkIGFuZCBiYXNlIHJlZ2lzdGVyIGlzIGtpbGxlZCwgaXQgbWF5IGhhdmUgYmVlbgorICAgICAgLy8gcmUtZGVmZWQgYnkgdGhlIGxvYWQsIG1ha2Ugc3VyZSB0aGUgZmlyc3QgbG9hZCBkb2VzIG5vdCBjbG9iYmVyIGl0LgorICAgICAgaWYgKGlzTGQgJiYKKyAgICAgICAgICAoQmFzZUtpbGwgfHwgT2ZmS2lsbCkgJiYKKyAgICAgICAgICAoVFJJLT5yZWdzT3ZlcmxhcChFdmVuUmVnLCBCYXNlUmVnKSB8fAorICAgICAgICAgICAoT2ZmUmVnICYmIFRSSS0+cmVnc092ZXJsYXAoRXZlblJlZywgT2ZmUmVnKSkpKSB7CisgICAgICAgIGFzc2VydCghVFJJLT5yZWdzT3ZlcmxhcChPZGRSZWcsIEJhc2VSZWcpICYmCisgICAgICAgICAgICAgICAoIU9mZlJlZyB8fCAhVFJJLT5yZWdzT3ZlcmxhcChPZGRSZWcsIE9mZlJlZykpKTsKKyAgICAgICAgSW5zZXJ0TERSX1NUUihNQkIsIE1CQkksIE9mZkltbSs0LCBpc0xkLCBkbCwgTmV3T3BjLAorICAgICAgICAgICAgICAgICAgICAgIE9kZFJlZywgT2RkRGVhZEtpbGwsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIEJhc2VSZWcsIGZhbHNlLCBCYXNlVW5kZWYsIE9mZlJlZywgZmFsc2UsIE9mZlVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgIFByZWQsIFByZWRSZWcsIFRJSSwgaXNUMik7CisgICAgICAgIE5ld0JCSSA9IGxsdm06OnByaW9yKE1CQkkpOworICAgICAgICBJbnNlcnRMRFJfU1RSKE1CQiwgTUJCSSwgT2ZmSW1tLCBpc0xkLCBkbCwgTmV3T3BjLAorICAgICAgICAgICAgICAgICAgICAgIEV2ZW5SZWcsIEV2ZW5EZWFkS2lsbCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgQmFzZVJlZywgQmFzZUtpbGwsIEJhc2VVbmRlZiwgT2ZmUmVnLCBPZmZLaWxsLCBPZmZVbmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICBQcmVkLCBQcmVkUmVnLCBUSUksIGlzVDIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE9kZFJlZyA9PSBFdmVuUmVnICYmIEV2ZW5EZWFkS2lsbCkgeworICAgICAgICAgIC8vIElmIHRoZSB0d28gc291cmNlIG9wZXJhbmRzIGFyZSB0aGUgc2FtZSwgdGhlIGtpbGwgbWFya2VyIGlzCisgICAgICAgICAgLy8gcHJvYmFibHkgb24gdGhlIGZpcnN0IG9uZS4gZS5nLgorICAgICAgICAgIC8vIHQyU1RSRGk4ICVSNTxraWxsPiwgJVI1LCAlUjk8a2lsbD4sIDAsIDE0LCAlcmVnMAorICAgICAgICAgIEV2ZW5EZWFkS2lsbCA9IGZhbHNlOworICAgICAgICAgIE9kZERlYWRLaWxsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBJbnNlcnRMRFJfU1RSKE1CQiwgTUJCSSwgT2ZmSW1tLCBpc0xkLCBkbCwgTmV3T3BjLAorICAgICAgICAgICAgICAgICAgICAgIEV2ZW5SZWcsIEV2ZW5EZWFkS2lsbCwgRXZlblVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgIEJhc2VSZWcsIGZhbHNlLCBCYXNlVW5kZWYsIE9mZlJlZywgZmFsc2UsIE9mZlVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgIFByZWQsIFByZWRSZWcsIFRJSSwgaXNUMik7CisgICAgICAgIE5ld0JCSSA9IGxsdm06OnByaW9yKE1CQkkpOworICAgICAgICBJbnNlcnRMRFJfU1RSKE1CQiwgTUJCSSwgT2ZmSW1tKzQsIGlzTGQsIGRsLCBOZXdPcGMsCisgICAgICAgICAgICAgICAgICAgICAgT2RkUmVnLCBPZGREZWFkS2lsbCwgT2RkVW5kZWYsCisgICAgICAgICAgICAgICAgICAgICAgQmFzZVJlZywgQmFzZUtpbGwsIEJhc2VVbmRlZiwgT2ZmUmVnLCBPZmZLaWxsLCBPZmZVbmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICBQcmVkLCBQcmVkUmVnLCBUSUksIGlzVDIpOworICAgICAgfQorICAgICAgaWYgKGlzTGQpCisgICAgICAgICsrTnVtTERSRDJMRFI7CisgICAgICBlbHNlCisgICAgICAgICsrTnVtU1RSRDJTVFI7CisgICAgfQorCisgICAgTUJCLmVyYXNlKE1JKTsKKyAgICBNQkJJID0gTmV3QkJJOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIExvYWRTdG9yZU11bHRpcGxlT3B0aSAtIEFuIG9wdGltaXphdGlvbiBwYXNzIHRvIHR1cm4gbXVsdGlwbGUgTERSIC8gU1RSCisvLy8gb3BzIG9mIHRoZSBzYW1lIGJhc2UgYW5kIGluY3JlbWVudGluZyBvZmZzZXQgaW50byBMRE0gLyBTVE0gb3BzLgorYm9vbCBBUk1Mb2FkU3RvcmVPcHQ6OkxvYWRTdG9yZU11bHRpcGxlT3B0aShNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSB7CisgIHVuc2lnbmVkIE51bU1lcmdlcyA9IDA7CisgIHVuc2lnbmVkIE51bU1lbU9wcyA9IDA7CisgIE1lbU9wUXVldWUgTWVtT3BzOworICB1bnNpZ25lZCBDdXJyQmFzZSA9IDA7CisgIGludCBDdXJyT3BjID0gLTE7CisgIHVuc2lnbmVkIEN1cnJTaXplID0gMDsKKyAgQVJNQ0M6OkNvbmRDb2RlcyBDdXJyUHJlZCA9IEFSTUNDOjpBTDsKKyAgdW5zaWduZWQgQ3VyclByZWRSZWcgPSAwOworICB1bnNpZ25lZCBQb3NpdGlvbiA9IDA7CisgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciw0PiBNZXJnZXM7CisKKyAgUlMtPmVudGVyQmFzaWNCbG9jaygmTUJCKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBNQkIuYmVnaW4oKSwgRSA9IE1CQi5lbmQoKTsKKyAgd2hpbGUgKE1CQkkgIT0gRSkgeworICAgIGlmIChGaXhJbnZhbGlkUmVnUGFpck9wKE1CQiwgTUJCSSkpCisgICAgICBjb250aW51ZTsKKworICAgIGJvb2wgQWR2YW5jZSAgPSBmYWxzZTsKKyAgICBib29sIFRyeU1lcmdlID0gZmFsc2U7CisgICAgYm9vbCBDbG9iYmVyICA9IGZhbHNlOworCisgICAgYm9vbCBpc01lbU9wID0gaXNNZW1vcnlPcChNQkJJKTsKKyAgICBpZiAoaXNNZW1PcCkgeworICAgICAgaW50IE9wY29kZSA9IE1CQkktPmdldE9wY29kZSgpOworICAgICAgdW5zaWduZWQgU2l6ZSA9IGdldExTTXVsdGlwbGVUcmFuc2ZlclNpemUoTUJCSSk7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNQkJJLT5nZXRPcGVyYW5kKDApOworICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBib29sIGlzS2lsbCA9IE1PLmlzRGVmKCkgPyBmYWxzZSA6IE1PLmlzS2lsbCgpOworICAgICAgdW5zaWduZWQgQmFzZSA9IE1CQkktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICB1bnNpZ25lZCBQcmVkUmVnID0gMDsKKyAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCA9IGxsdm06OmdldEluc3RyUHJlZGljYXRlKE1CQkksIFByZWRSZWcpOworICAgICAgaW50IE9mZnNldCA9IGdldE1lbW9yeU9wT2Zmc2V0KE1CQkkpOworICAgICAgLy8gV2F0Y2ggb3V0IGZvcjoKKyAgICAgIC8vIHI0IDo9IGxkciBbcjVdCisgICAgICAvLyByNSA6PSBsZHIgW3I1LCAjNF0KKyAgICAgIC8vIHI2IDo9IGxkciBbcjUsICM4XQorICAgICAgLy8KKyAgICAgIC8vIFRoZSBzZWNvbmQgbGRyIGhhcyBlZmZlY3RpdmVseSBicm9rZW4gdGhlIGNoYWluIGV2ZW4gdGhvdWdoIGl0CisgICAgICAvLyBsb29rcyBsaWtlIHRoZSBsYXRlciBsZHIocykgdXNlIHRoZSBzYW1lIGJhc2UgcmVnaXN0ZXIuIFRyeSB0bworICAgICAgLy8gbWVyZ2UgdGhlIGxkcidzIHNvIGZhciwgaW5jbHVkaW5nIHRoaXMgb25lLiBCdXQgZG9uJ3QgdHJ5IHRvCisgICAgICAvLyBjb21iaW5lIHRoZSBmb2xsb3dpbmcgbGRyKHMpLgorICAgICAgQ2xvYmJlciA9IChpc2kzMkxvYWQoT3Bjb2RlKSAmJiBCYXNlID09IE1CQkktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpOworICAgICAgaWYgKEN1cnJCYXNlID09IDAgJiYgIUNsb2JiZXIpIHsKKyAgICAgICAgLy8gU3RhcnQgb2YgYSBuZXcgY2hhaW4uCisgICAgICAgIEN1cnJCYXNlID0gQmFzZTsKKyAgICAgICAgQ3Vyck9wYyAgPSBPcGNvZGU7CisgICAgICAgIEN1cnJTaXplID0gU2l6ZTsKKyAgICAgICAgQ3VyclByZWQgPSBQcmVkOworICAgICAgICBDdXJyUHJlZFJlZyA9IFByZWRSZWc7CisgICAgICAgIE1lbU9wcy5wdXNoX2JhY2soTWVtT3BRdWV1ZUVudHJ5KE9mZnNldCwgUmVnLCBpc0tpbGwsIFBvc2l0aW9uLCBNQkJJKSk7CisgICAgICAgICsrTnVtTWVtT3BzOworICAgICAgICBBZHZhbmNlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChDbG9iYmVyKSB7CisgICAgICAgICAgVHJ5TWVyZ2UgPSB0cnVlOworICAgICAgICAgIEFkdmFuY2UgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEN1cnJPcGMgPT0gT3Bjb2RlICYmIEN1cnJCYXNlID09IEJhc2UgJiYgQ3VyclByZWQgPT0gUHJlZCkgeworICAgICAgICAgIC8vIE5vIG5lZWQgdG8gbWF0Y2ggUHJlZFJlZy4KKyAgICAgICAgICAvLyBDb250aW51ZSBhZGRpbmcgdG8gdGhlIHF1ZXVlLgorICAgICAgICAgIGlmIChPZmZzZXQgPiBNZW1PcHMuYmFjaygpLk9mZnNldCkgeworICAgICAgICAgICAgTWVtT3BzLnB1c2hfYmFjayhNZW1PcFF1ZXVlRW50cnkoT2Zmc2V0LCBSZWcsIGlzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uLCBNQkJJKSk7CisgICAgICAgICAgICArK051bU1lbU9wczsKKyAgICAgICAgICAgIEFkdmFuY2UgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKE1lbU9wUXVldWVJdGVyIEkgPSBNZW1PcHMuYmVnaW4oKSwgRSA9IE1lbU9wcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgICAgICAgaWYgKE9mZnNldCA8IEktPk9mZnNldCkgeworICAgICAgICAgICAgICAgIE1lbU9wcy5pbnNlcnQoSSwgTWVtT3BRdWV1ZUVudHJ5KE9mZnNldCwgUmVnLCBpc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb24sIE1CQkkpKTsKKyAgICAgICAgICAgICAgICArK051bU1lbU9wczsKKyAgICAgICAgICAgICAgICBBZHZhbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChPZmZzZXQgPT0gSS0+T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgLy8gQ29sbGlzaW9uISBUaGlzIGNhbid0IGJlIG1lcmdlZCEKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChNQkJJLT5pc0RlYnVnVmFsdWUoKSkgeworICAgICAgKytNQkJJOworICAgICAgaWYgKE1CQkkgPT0gRSkKKyAgICAgICAgLy8gUmVhY2ggdGhlIGVuZCBvZiB0aGUgYmxvY2ssIHRyeSBtZXJnaW5nIHRoZSBtZW1vcnkgaW5zdHJ1Y3Rpb25zLgorICAgICAgICBUcnlNZXJnZSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChBZHZhbmNlKSB7CisgICAgICArK1Bvc2l0aW9uOworICAgICAgKytNQkJJOworICAgICAgaWYgKE1CQkkgPT0gRSkKKyAgICAgICAgLy8gUmVhY2ggdGhlIGVuZCBvZiB0aGUgYmxvY2ssIHRyeSBtZXJnaW5nIHRoZSBtZW1vcnkgaW5zdHJ1Y3Rpb25zLgorICAgICAgICBUcnlNZXJnZSA9IHRydWU7CisgICAgfSBlbHNlCisgICAgICBUcnlNZXJnZSA9IHRydWU7CisKKyAgICBpZiAoVHJ5TWVyZ2UpIHsKKyAgICAgIGlmIChOdW1NZW1PcHMgPiAxKSB7CisgICAgICAgIC8vIFRyeSB0byBmaW5kIGEgZnJlZSByZWdpc3RlciB0byB1c2UgYXMgYSBuZXcgYmFzZSBpbiBjYXNlIGl0J3MgbmVlZGVkLgorICAgICAgICAvLyBGaXJzdCBhZHZhbmNlIHRvIHRoZSBpbnN0cnVjdGlvbiBqdXN0IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGNoYWluLgorICAgICAgICBBZHZhbmNlUlMoTUJCLCBNZW1PcHMpOworICAgICAgICAvLyBGaW5kIGEgc2NyYXRjaCByZWdpc3Rlci4KKyAgICAgICAgdW5zaWduZWQgU2NyYXRjaCA9IFJTLT5GaW5kVW51c2VkUmVnKEFSTTo6R1BSUmVnaXN0ZXJDbGFzcyk7CisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGxvYWQgLyBzdG9yZSBpbnN0cnVjdGlvbnMuCisgICAgICAgIFJTLT5mb3J3YXJkKHByaW9yKE1CQkkpKTsKKworICAgICAgICAvLyBNZXJnZSBvcHMuCisgICAgICAgIE1lcmdlcy5jbGVhcigpOworICAgICAgICBNZXJnZUxEUl9TVFIoTUJCLCAwLCBDdXJyQmFzZSwgQ3Vyck9wYywgQ3VyclNpemUsCisgICAgICAgICAgICAgICAgICAgICBDdXJyUHJlZCwgQ3VyclByZWRSZWcsIFNjcmF0Y2gsIE1lbU9wcywgTWVyZ2VzKTsKKworICAgICAgICAvLyBUcnkgZm9sZGluZyBwcmVjZWVkaW5nL3RyYWlsaW5nIGJhc2UgaW5jL2RlYyBpbnRvIHRoZSBnZW5lcmF0ZWQKKyAgICAgICAgLy8gTERNL1NUTSBvcHMuCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNZXJnZXMuc2l6ZSgpOyBpIDwgZTsgKytpKQorICAgICAgICAgIGlmIChNZXJnZUJhc2VVcGRhdGVMU011bHRpcGxlKE1CQiwgTWVyZ2VzW2ldLCBBZHZhbmNlLCBNQkJJKSkKKyAgICAgICAgICAgICsrTnVtTWVyZ2VzOworICAgICAgICBOdW1NZXJnZXMgKz0gTWVyZ2VzLnNpemUoKTsKKworICAgICAgICAvLyBUcnkgZm9sZGluZyBwcmVjZWVkaW5nL3RyYWlsaW5nIGJhc2UgaW5jL2RlYyBpbnRvIHRob3NlIGxvYWQvc3RvcmUKKyAgICAgICAgLy8gdGhhdCB3ZXJlIG5vdCBtZXJnZWQgdG8gZm9ybSBMRE0vU1RNIG9wcy4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1NZW1PcHM7ICsraSkKKyAgICAgICAgICBpZiAoIU1lbU9wc1tpXS5NZXJnZWQpCisgICAgICAgICAgICBpZiAoTWVyZ2VCYXNlVXBkYXRlTG9hZFN0b3JlKE1CQiwgTWVtT3BzW2ldLk1CQkksIFRJSSxBZHZhbmNlLE1CQkkpKQorICAgICAgICAgICAgICArK051bU1lcmdlczsKKworICAgICAgICAvLyBSUyBtYXkgYmUgcG9pbnRpbmcgdG8gYW4gaW5zdHJ1Y3Rpb24gdGhhdCdzIGRlbGV0ZWQuCisgICAgICAgIFJTLT5za2lwVG8ocHJpb3IoTUJCSSkpOworICAgICAgfSBlbHNlIGlmIChOdW1NZW1PcHMgPT0gMSkgeworICAgICAgICAvLyBUcnkgZm9sZGluZyBwcmVjZWVkaW5nL3RyYWlsaW5nIGJhc2UgaW5jL2RlYyBpbnRvIHRoZSBzaW5nbGUKKyAgICAgICAgLy8gbG9hZC9zdG9yZS4KKyAgICAgICAgaWYgKE1lcmdlQmFzZVVwZGF0ZUxvYWRTdG9yZShNQkIsIE1lbU9wc1swXS5NQkJJLCBUSUksIEFkdmFuY2UsIE1CQkkpKSB7CisgICAgICAgICAgKytOdW1NZXJnZXM7CisgICAgICAgICAgUlMtPmZvcndhcmQocHJpb3IoTUJCSSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEN1cnJCYXNlID0gMDsKKyAgICAgIEN1cnJPcGMgPSAtMTsKKyAgICAgIEN1cnJTaXplID0gMDsKKyAgICAgIEN1cnJQcmVkID0gQVJNQ0M6OkFMOworICAgICAgQ3VyclByZWRSZWcgPSAwOworICAgICAgaWYgKE51bU1lbU9wcykgeworICAgICAgICBNZW1PcHMuY2xlYXIoKTsKKyAgICAgICAgTnVtTWVtT3BzID0gMDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgaXRlcmF0b3IgaGFzbid0IGJlZW4gYWR2YW5jZWQgYW5kIHRoaXMgaXMgbm90IGEgbWVtb3J5IG9wLCBza2lwIGl0LgorICAgICAgLy8gSXQgY2FuJ3Qgc3RhcnQgYSBuZXcgY2hhaW4gYW55d2F5LgorICAgICAgaWYgKCFBZHZhbmNlICYmICFpc01lbU9wICYmIE1CQkkgIT0gRSkgeworICAgICAgICArK1Bvc2l0aW9uOworICAgICAgICArK01CQkk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBOdW1NZXJnZXMgPiAwOworfQorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgT2Zmc2V0Q29tcGFyZSB7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IE1hY2hpbmVJbnN0ciAqTEhTLCBjb25zdCBNYWNoaW5lSW5zdHIgKlJIUykgY29uc3QgeworICAgICAgaW50IExPZmZzZXQgPSBnZXRNZW1vcnlPcE9mZnNldChMSFMpOworICAgICAgaW50IFJPZmZzZXQgPSBnZXRNZW1vcnlPcE9mZnNldChSSFMpOworICAgICAgYXNzZXJ0KExIUyA9PSBSSFMgfHwgTE9mZnNldCAhPSBST2Zmc2V0KTsKKyAgICAgIHJldHVybiBMT2Zmc2V0ID4gUk9mZnNldDsKKyAgICB9CisgIH07Cit9CisKKy8vLyBNZXJnZVJldHVybkludG9MRE0gLSBJZiB0aGlzIGlzIGEgZXhpdCBCQiwgdHJ5IG1lcmdpbmcgdGhlIHJldHVybiBvcHMKKy8vLyAoImJ4IGxyIiBhbmQgIm1vdiBwYywgbHIiKSBpbnRvIHRoZSBwcmVjZWVkaW5nIHN0YWNrIHJlc3RvcmUgc28gaXQKKy8vLyBkaXJlY3RseSByZXN0b3JlIHRoZSB2YWx1ZSBvZiBMUiBpbnRvIHBjLgorLy8vICAgbGRtZmQgc3AhLCB7Li4uLCBscn0KKy8vLyAgIGJ4IGxyCisvLy8gb3IKKy8vLyAgIGxkbWZkIHNwISwgey4uLiwgbHJ9CisvLy8gICBtb3YgcGMsIGxyCisvLy8gPT4KKy8vLyAgIGxkbWZkIHNwISwgey4uLiwgcGN9Citib29sIEFSTUxvYWRTdG9yZU9wdDo6TWVyZ2VSZXR1cm5JbnRvTERNKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIHsKKyAgaWYgKE1CQi5lbXB0eSgpKSByZXR1cm4gZmFsc2U7CisKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBwcmlvcihNQkIuZW5kKCkpOworICBpZiAoTUJCSSAhPSBNQkIuYmVnaW4oKSAmJgorICAgICAgKE1CQkktPmdldE9wY29kZSgpID09IEFSTTo6QlhfUkVUIHx8CisgICAgICAgTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0QlhfUkVUIHx8CisgICAgICAgTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpNT1ZQQ0xSKSkgeworICAgIE1hY2hpbmVJbnN0ciAqUHJldk1JID0gcHJpb3IoTUJCSSk7CisgICAgaWYgKFByZXZNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpMRE1fVVBEIHx8CisgICAgICAgIFByZXZNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0MkxETV9VUEQpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IFByZXZNSS0+Z2V0T3BlcmFuZChQcmV2TUktPmdldE51bU9wZXJhbmRzKCktMSk7CisgICAgICBpZiAoTU8uZ2V0UmVnKCkgIT0gQVJNOjpMUikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgdW5zaWduZWQgTmV3T3BjID0gaXNUaHVtYjIgPyBBUk06OnQyTERNX1JFVCA6IEFSTTo6TERNX1JFVDsKKyAgICAgIFByZXZNSS0+c2V0RGVzYyhUSUktPmdldChOZXdPcGMpKTsKKyAgICAgIE1PLnNldFJlZyhBUk06OlBDKTsKKyAgICAgIE1CQi5lcmFzZShNQkJJKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQVJNTG9hZFN0b3JlT3B0OjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKSB7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gRm4uZ2V0VGFyZ2V0KCk7CisgIEFGSSA9IEZuLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICBUSUkgPSBUTS5nZXRJbnN0ckluZm8oKTsKKyAgVFJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIFJTID0gbmV3IFJlZ1NjYXZlbmdlcigpOworICBpc1RodW1iMiA9IEFGSS0+aXNUaHVtYjJGdW5jdGlvbigpOworCisgIGJvb2wgTW9kaWZpZWQgPSBmYWxzZTsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1GSSA9IEZuLmJlZ2luKCksIEUgPSBGbi5lbmQoKTsgTUZJICE9IEU7CisgICAgICAgKytNRkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1GSTsKKyAgICBNb2RpZmllZCB8PSBMb2FkU3RvcmVNdWx0aXBsZU9wdGkoTUJCKTsKKyAgICBNb2RpZmllZCB8PSBNZXJnZVJldHVybkludG9MRE0oTUJCKTsKKyAgfQorCisgIGRlbGV0ZSBSUzsKKyAgcmV0dXJuIE1vZGlmaWVkOworfQorCisKKy8vLyBBUk1QcmVBbGxvY0xvYWRTdG9yZU9wdCAtIFByZS0gcmVnaXN0ZXIgYWxsb2NhdGlvbiBwYXNzIHRoYXQgbW92ZQorLy8vIGxvYWQgLyBzdG9yZXMgZnJvbSBjb25zZWN1dGl2ZSBsb2NhdGlvbnMgY2xvc2UgdG8gbWFrZSBpdCBtb3JlCisvLy8gbGlrZWx5IHRoZXkgd2lsbCBiZSBjb21iaW5lZCBsYXRlci4KKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEFSTVByZUFsbG9jTG9hZFN0b3JlT3B0IDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3N7CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgQVJNUHJlQWxsb2NMb2FkU3RvcmVPcHQoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICBjb25zdCBUYXJnZXREYXRhICpURDsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgICBjb25zdCBBUk1TdWJ0YXJnZXQgKlNUSTsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisgICAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIkFSTSBwcmUtIHJlZ2lzdGVyIGFsbG9jYXRpb24gbG9hZCAvIHN0b3JlIG9wdGltaXphdGlvbiBwYXNzIjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIENhbkZvcm1MZFN0RFdvcmQoTWFjaGluZUluc3RyICpPcDAsIE1hY2hpbmVJbnN0ciAqT3AxLCBEZWJ1Z0xvYyAmZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOZXdPcGMsIHVuc2lnbmVkICZFdmVuUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmT2RkUmVnLCB1bnNpZ25lZCAmQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk9mZlJlZywgaW50ICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZQcmVkUmVnLCBBUk1DQzo6Q29uZENvZGVzICZQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1QyKTsKKyAgICBib29sIFJlc2NoZWR1bGVPcHMoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyKiwgND4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQmFzZSwgYm9vbCBpc0xkLAorICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD4gJk1JMkxvY01hcCk7CisgICAgYm9vbCBSZXNjaGVkdWxlTG9hZFN0b3JlSW5zdHJzKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworICB9OworICBjaGFyIEFSTVByZUFsbG9jTG9hZFN0b3JlT3B0OjpJRCA9IDA7Cit9CisKK2Jvb2wgQVJNUHJlQWxsb2NMb2FkU3RvcmVPcHQ6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRm4pIHsKKyAgVEQgID0gRm4uZ2V0VGFyZ2V0KCkuZ2V0VGFyZ2V0RGF0YSgpOworICBUSUkgPSBGbi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKTsKKyAgVFJJID0gRm4uZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIFNUSSA9ICZGbi5nZXRUYXJnZXQoKS5nZXRTdWJ0YXJnZXQ8QVJNU3VidGFyZ2V0PigpOworICBNUkkgPSAmRm4uZ2V0UmVnSW5mbygpOworICBNRiAgPSAmRm47CisKKyAgYm9vbCBNb2RpZmllZCA9IGZhbHNlOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUZJID0gRm4uYmVnaW4oKSwgRSA9IEZuLmVuZCgpOyBNRkkgIT0gRTsKKyAgICAgICArK01GSSkKKyAgICBNb2RpZmllZCB8PSBSZXNjaGVkdWxlTG9hZFN0b3JlSW5zdHJzKE1GSSk7CisKKyAgcmV0dXJuIE1vZGlmaWVkOworfQorCitzdGF0aWMgYm9vbCBJc1NhZmVBbmRQcm9maXRhYmxlVG9Nb3ZlKGJvb2wgaXNMZCwgdW5zaWduZWQgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIqLCA0PiAmTWVtT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDx1bnNpZ25lZCwgND4gJk1lbVJlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSB7CisgIC8vIEFyZSB0aGVyZSBzdG9yZXMgLyBsb2FkcyAvIGNhbGxzIGJldHdlZW4gdGhlbT8KKyAgLy8gRklYTUU6IFRoaXMgaXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZS4gV2Ugc2hvdWxkIG1ha2UgdXNlIG9mIGFsaWFzIGluZm9ybWF0aW9uCisgIC8vIHNvbWUgZGF5LgorICBTbWFsbFNldDx1bnNpZ25lZCwgND4gQWRkZWRSZWdQcmVzc3VyZTsKKyAgd2hpbGUgKCsrSSAhPSBFKSB7CisgICAgaWYgKEktPmlzRGVidWdWYWx1ZSgpIHx8IE1lbU9wcy5jb3VudCgmKkkpKQorICAgICAgY29udGludWU7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBJLT5nZXREZXNjKCk7CisgICAgaWYgKFRJRC5pc0NhbGwoKSB8fCBUSUQuaXNUZXJtaW5hdG9yKCkgfHwgVElELmhhc1VubW9kZWxlZFNpZGVFZmZlY3RzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGlzTGQgJiYgVElELm1heVN0b3JlKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFpc0xkKSB7CisgICAgICBpZiAoVElELm1heUxvYWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgLy8gSXQncyBub3Qgc2FmZSB0byBtb3ZlIHRoZSBmaXJzdCAnc3RyJyBkb3duLgorICAgICAgLy8gc3RyIHIxLCBbcjBdCisgICAgICAvLyBzdHJoIHI1LCBbcjBdCisgICAgICAvLyBzdHIgcjQsIFtyMCwgIys0XQorICAgICAgaWYgKFRJRC5tYXlTdG9yZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaiA9IDAsIE51bU9wcyA9IEktPmdldE51bU9wZXJhbmRzKCk7IGogIT0gTnVtT3BzOyArK2opIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IEktPmdldE9wZXJhbmQoaik7CisgICAgICBpZiAoIU1PLmlzUmVnKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBpZiAoTU8uaXNEZWYoKSAmJiBUUkktPnJlZ3NPdmVybGFwKFJlZywgQmFzZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChSZWcgIT0gQmFzZSAmJiAhTWVtUmVncy5jb3VudChSZWcpKQorICAgICAgICBBZGRlZFJlZ1ByZXNzdXJlLmluc2VydChSZWcpOworICAgIH0KKyAgfQorCisgIC8vIEVzdGltYXRlIHJlZ2lzdGVyIHByZXNzdXJlIGluY3JlYXNlIGR1ZSB0byB0aGUgdHJhbnNmb3JtYXRpb24uCisgIGlmIChNZW1SZWdzLnNpemUoKSA8PSA0KQorICAgIC8vIE9rIGlmIHdlIGFyZSBtb3Zpbmcgc21hbGwgbnVtYmVyIG9mIGluc3RydWN0aW9ucy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIEFkZGVkUmVnUHJlc3N1cmUuc2l6ZSgpIDw9IE1lbVJlZ3Muc2l6ZSgpICogMjsKK30KKworYm9vbAorQVJNUHJlQWxsb2NMb2FkU3RvcmVPcHQ6OkNhbkZvcm1MZFN0RFdvcmQoTWFjaGluZUluc3RyICpPcDAsIE1hY2hpbmVJbnN0ciAqT3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgJmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk5ld09wYywgdW5zaWduZWQgJkV2ZW5SZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmT2RkUmVnLCB1bnNpZ25lZCAmQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZPZmZSZWcsIGludCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlByZWRSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Q29uZENvZGVzICZQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNUMikgeworICAvLyBNYWtlIHN1cmUgd2UncmUgYWxsb3dlZCB0byBnZW5lcmF0ZSBMRFJEL1NUUkQuCisgIGlmICghU1RJLT5oYXNWNVRFT3BzKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEZJWE1FOiBWTERSUyAvIFZTVFJTIC0+IFZMRFJEIC8gVlNUUkQKKyAgdW5zaWduZWQgU2NhbGUgPSAxOworICB1bnNpZ25lZCBPcGNvZGUgPSBPcDAtPmdldE9wY29kZSgpOworICBpZiAoT3Bjb2RlID09IEFSTTo6TERSKQorICAgIE5ld09wYyA9IEFSTTo6TERSRDsKKyAgZWxzZSBpZiAoT3Bjb2RlID09IEFSTTo6U1RSKQorICAgIE5ld09wYyA9IEFSTTo6U1RSRDsKKyAgZWxzZSBpZiAoT3Bjb2RlID09IEFSTTo6dDJMRFJpOCB8fCBPcGNvZGUgPT0gQVJNOjp0MkxEUmkxMikgeworICAgIE5ld09wYyA9IEFSTTo6dDJMRFJEaTg7CisgICAgU2NhbGUgPSA0OworICAgIGlzVDIgPSB0cnVlOworICB9IGVsc2UgaWYgKE9wY29kZSA9PSBBUk06OnQyU1RSaTggfHwgT3Bjb2RlID09IEFSTTo6dDJTVFJpMTIpIHsKKyAgICBOZXdPcGMgPSBBUk06OnQyU1RSRGk4OworICAgIFNjYWxlID0gNDsKKyAgICBpc1QyID0gdHJ1ZTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgb2Zmc2V0IHJlZ2lzdGVycyBtYXRjaC4KKyAgaWYgKCFpc1QyICYmCisgICAgICAoT3AwLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpICE9IE9wMS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gTXVzdCBzdXJlIHRoZSBiYXNlIGFkZHJlc3Mgc2F0aXNmaWVzIGk2NCBsZCAvIHN0IGFsaWdubWVudCByZXF1aXJlbWVudC4KKyAgaWYgKCFPcDAtPmhhc09uZU1lbU9wZXJhbmQoKSB8fAorICAgICAgISgqT3AwLT5tZW1vcGVyYW5kc19iZWdpbigpKS0+Z2V0VmFsdWUoKSB8fAorICAgICAgKCpPcDAtPm1lbW9wZXJhbmRzX2JlZ2luKCkpLT5pc1ZvbGF0aWxlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIEFsaWduID0gKCpPcDAtPm1lbW9wZXJhbmRzX2JlZ2luKCkpLT5nZXRBbGlnbm1lbnQoKTsKKyAgY29uc3QgRnVuY3Rpb24gKkZ1bmMgPSBNRi0+Z2V0RnVuY3Rpb24oKTsKKyAgdW5zaWduZWQgUmVxQWxpZ24gPSBTVEktPmhhc1Y2T3BzKCkKKyAgICA/IFRELT5nZXRQcmVmVHlwZUFsaWdubWVudChUeXBlOjpnZXRJbnQ2NFR5KEZ1bmMtPmdldENvbnRleHQoKSkpIAorICAgIDogODsgIC8vIFByZS12NiBuZWVkIDgtYnl0ZSBhbGlnbgorICBpZiAoQWxpZ24gPCBSZXFBbGlnbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVGhlbiBtYWtlIHN1cmUgdGhlIGltbWVkaWF0ZSBvZmZzZXQgZml0cy4KKyAgaW50IE9mZkltbSA9IGdldE1lbW9yeU9wT2Zmc2V0KE9wMCk7CisgIGlmIChpc1QyKSB7CisgICAgaWYgKE9mZkltbSA8IDApIHsKKyAgICAgIGlmIChPZmZJbW0gPCAtMjU1KQorICAgICAgICAvLyBDYW4ndCBmYWxsIGJhY2sgdG8gdDJMRFJpOCAvIHQyU1RSaTguCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IExpbWl0ID0gKDEgPDwgOCkgKiBTY2FsZTsKKyAgICAgIGlmIChPZmZJbW0gPj0gTGltaXQgfHwgKE9mZkltbSAmIChTY2FsZS0xKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgT2Zmc2V0ID0gT2ZmSW1tOworICB9IGVsc2UgeworICAgIEFSTV9BTTo6QWRkck9wYyBBZGRTdWIgPSBBUk1fQU06OmFkZDsKKyAgICBpZiAoT2ZmSW1tIDwgMCkgeworICAgICAgQWRkU3ViID0gQVJNX0FNOjpzdWI7CisgICAgICBPZmZJbW0gPSAtIE9mZkltbTsKKyAgICB9CisgICAgaW50IExpbWl0ID0gKDEgPDwgOCkgKiBTY2FsZTsKKyAgICBpZiAoT2ZmSW1tID49IExpbWl0IHx8IChPZmZJbW0gJiAoU2NhbGUtMSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIE9mZnNldCA9IEFSTV9BTTo6Z2V0QU0zT3BjKEFkZFN1YiwgT2ZmSW1tKTsKKyAgfQorICBFdmVuUmVnID0gT3AwLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICBPZGRSZWcgID0gT3AxLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICBpZiAoRXZlblJlZyA9PSBPZGRSZWcpCisgICAgcmV0dXJuIGZhbHNlOworICBCYXNlUmVnID0gT3AwLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICBpZiAoIWlzVDIpCisgICAgT2ZmUmVnID0gT3AwLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpOworICBQcmVkID0gbGx2bTo6Z2V0SW5zdHJQcmVkaWNhdGUoT3AwLCBQcmVkUmVnKTsKKyAgZGwgPSBPcDAtPmdldERlYnVnTG9jKCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEFSTVByZUFsbG9jTG9hZFN0b3JlT3B0OjpSZXNjaGVkdWxlT3BzKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQmFzZSwgYm9vbCBpc0xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+ICZNSTJMb2NNYXApIHsKKyAgYm9vbCBSZXRWYWwgPSBmYWxzZTsKKworICAvLyBTb3J0IGJ5IG9mZnNldCAoaW4gcmV2ZXJzZSBvcmRlcikuCisgIHN0ZDo6c29ydChPcHMuYmVnaW4oKSwgT3BzLmVuZCgpLCBPZmZzZXRDb21wYXJlKCkpOworCisgIC8vIFRoZSBsb2FkcyAvIHN0b3JlcyBvZiB0aGUgc2FtZSBiYXNlIGFyZSBpbiBvcmRlci4gU2NhbiB0aGVtIGZyb20gZmlyc3QgdG8KKyAgLy8gbGFzdCBhbmQgY2hlY2sgZm9yIHRoZSBmb2xsb3dpbmc6CisgIC8vIDEuIEFueSBkZWYgb2YgYmFzZS4KKyAgLy8gMi4gQW55IGdhcHMuCisgIHdoaWxlIChPcHMuc2l6ZSgpID4gMSkgeworICAgIHVuc2lnbmVkIEZpcnN0TG9jID0gfjBVOworICAgIHVuc2lnbmVkIExhc3RMb2MgPSAwOworICAgIE1hY2hpbmVJbnN0ciAqRmlyc3RPcCA9IDA7CisgICAgTWFjaGluZUluc3RyICpMYXN0T3AgPSAwOworICAgIGludCBMYXN0T2Zmc2V0ID0gMDsKKyAgICB1bnNpZ25lZCBMYXN0T3Bjb2RlID0gMDsKKyAgICB1bnNpZ25lZCBMYXN0Qnl0ZXMgPSAwOworICAgIHVuc2lnbmVkIE51bU1vdmUgPSAwOworICAgIGZvciAoaW50IGkgPSBPcHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqT3AgPSBPcHNbaV07CisgICAgICB1bnNpZ25lZCBMb2MgPSBNSTJMb2NNYXBbT3BdOworICAgICAgaWYgKExvYyA8PSBGaXJzdExvYykgeworICAgICAgICBGaXJzdExvYyA9IExvYzsKKyAgICAgICAgRmlyc3RPcCA9IE9wOworICAgICAgfQorICAgICAgaWYgKExvYyA+PSBMYXN0TG9jKSB7CisgICAgICAgIExhc3RMb2MgPSBMb2M7CisgICAgICAgIExhc3RPcCA9IE9wOworICAgICAgfQorCisgICAgICB1bnNpZ25lZCBPcGNvZGUgPSBPcC0+Z2V0T3Bjb2RlKCk7CisgICAgICBpZiAoTGFzdE9wY29kZSAmJiBPcGNvZGUgIT0gTGFzdE9wY29kZSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGludCBPZmZzZXQgPSBnZXRNZW1vcnlPcE9mZnNldChPcCk7CisgICAgICB1bnNpZ25lZCBCeXRlcyA9IGdldExTTXVsdGlwbGVUcmFuc2ZlclNpemUoT3ApOworICAgICAgaWYgKExhc3RCeXRlcykgeworICAgICAgICBpZiAoQnl0ZXMgIT0gTGFzdEJ5dGVzIHx8IE9mZnNldCAhPSAoTGFzdE9mZnNldCArIChpbnQpQnl0ZXMpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgTGFzdE9mZnNldCA9IE9mZnNldDsKKyAgICAgIExhc3RCeXRlcyA9IEJ5dGVzOworICAgICAgTGFzdE9wY29kZSA9IE9wY29kZTsKKyAgICAgIGlmICgrK051bU1vdmUgPT0gOCkgLy8gRklYTUU6IFR1bmUgdGhpcyBsaW1pdC4KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKE51bU1vdmUgPD0gMSkKKyAgICAgIE9wcy5wb3BfYmFjaygpOworICAgIGVsc2UgeworICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyKiwgND4gTWVtT3BzOworICAgICAgU21hbGxTZXQ8dW5zaWduZWQsIDQ+IE1lbVJlZ3M7CisgICAgICBmb3IgKGludCBpID0gTnVtTW92ZS0xOyBpID49IDA7IC0taSkgeworICAgICAgICBNZW1PcHMuaW5zZXJ0KE9wc1tpXSk7CisgICAgICAgIE1lbVJlZ3MuaW5zZXJ0KE9wc1tpXS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSk7CisgICAgICB9CisKKyAgICAgIC8vIEJlIGNvbnNlcnZhdGl2ZSwgaWYgdGhlIGluc3RydWN0aW9ucyBhcmUgdG9vIGZhciBhcGFydCwgZG9uJ3QKKyAgICAgIC8vIG1vdmUgdGhlbS4gV2Ugd2FudCB0byBsaW1pdCB0aGUgaW5jcmVhc2Ugb2YgcmVnaXN0ZXIgcHJlc3N1cmUuCisgICAgICBib29sIERvTW92ZSA9IChMYXN0TG9jIC0gRmlyc3RMb2MpIDw9IE51bU1vdmUqNDsgLy8gRklYTUU6IFR1bmUgdGhpcy4KKyAgICAgIGlmIChEb01vdmUpCisgICAgICAgIERvTW92ZSA9IElzU2FmZUFuZFByb2ZpdGFibGVUb01vdmUoaXNMZCwgQmFzZSwgRmlyc3RPcCwgTGFzdE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbU9wcywgTWVtUmVncywgVFJJKTsKKyAgICAgIGlmICghRG9Nb3ZlKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtTW92ZTsgKytpKQorICAgICAgICAgIE9wcy5wb3BfYmFjaygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgbmV3IGxvY2F0aW9uIGZvciB0aGUgbG9hZHMgLyBzdG9yZXMuCisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQb3MgPSBpc0xkID8gRmlyc3RPcCA6IExhc3RPcDsKKyAgICAgICAgd2hpbGUgKEluc2VydFBvcyAhPSBNQkItPmVuZCgpCisgICAgICAgICAgICAgICAmJiAoTWVtT3BzLmNvdW50KEluc2VydFBvcykgfHwgSW5zZXJ0UG9zLT5pc0RlYnVnVmFsdWUoKSkpCisgICAgICAgICAgKytJbnNlcnRQb3M7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIG1vdmluZyBhIHBhaXIgb2YgbG9hZHMgLyBzdG9yZXMsIHNlZSBpZiBpdCBtYWtlcyBzZW5zZQorICAgICAgICAvLyB0byB0cnkgdG8gYWxsb2NhdGUgYSBwYWlyIG9mIHJlZ2lzdGVycyB0aGF0IGNhbiBmb3JtIHJlZ2lzdGVyIHBhaXJzLgorICAgICAgICBNYWNoaW5lSW5zdHIgKk9wMCA9IE9wcy5iYWNrKCk7CisgICAgICAgIE1hY2hpbmVJbnN0ciAqT3AxID0gT3BzW09wcy5zaXplKCktMl07CisgICAgICAgIHVuc2lnbmVkIEV2ZW5SZWcgPSAwLCBPZGRSZWcgPSAwOworICAgICAgICB1bnNpZ25lZCBCYXNlUmVnID0gMCwgT2ZmUmVnID0gMCwgUHJlZFJlZyA9IDA7CisgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCA9IEFSTUNDOjpBTDsKKyAgICAgICAgYm9vbCBpc1QyID0gZmFsc2U7CisgICAgICAgIHVuc2lnbmVkIE5ld09wYyA9IDA7CisgICAgICAgIGludCBPZmZzZXQgPSAwOworICAgICAgICBEZWJ1Z0xvYyBkbDsKKyAgICAgICAgaWYgKE51bU1vdmUgPT0gMiAmJiBDYW5Gb3JtTGRTdERXb3JkKE9wMCwgT3AxLCBkbCwgTmV3T3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlblJlZywgT2RkUmVnLCBCYXNlUmVnLCBPZmZSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsIFByZWRSZWcsIFByZWQsIGlzVDIpKSB7CisgICAgICAgICAgT3BzLnBvcF9iYWNrKCk7CisgICAgICAgICAgT3BzLnBvcF9iYWNrKCk7CisKKyAgICAgICAgICAvLyBGb3JtIHRoZSBwYWlyIGluc3RydWN0aW9uLgorICAgICAgICAgIGlmIChpc0xkKSB7CisgICAgICAgICAgICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQiA9IEJ1aWxkTUkoKk1CQiwgSW5zZXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBUSUktPmdldChOZXdPcGMpKQorICAgICAgICAgICAgICAuYWRkUmVnKEV2ZW5SZWcsIFJlZ1N0YXRlOjpEZWZpbmUpCisgICAgICAgICAgICAgIC5hZGRSZWcoT2RkUmVnLCBSZWdTdGF0ZTo6RGVmaW5lKQorICAgICAgICAgICAgICAuYWRkUmVnKEJhc2VSZWcpOworICAgICAgICAgICAgaWYgKCFpc1QyKQorICAgICAgICAgICAgICBNSUIuYWRkUmVnKE9mZlJlZyk7CisgICAgICAgICAgICBNSUIuYWRkSW1tKE9mZnNldCkuYWRkSW1tKFByZWQpLmFkZFJlZyhQcmVkUmVnKTsKKyAgICAgICAgICAgICsrTnVtTERSREZvcm1lZDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKCpNQkIsIEluc2VydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCwgVElJLT5nZXQoTmV3T3BjKSkKKyAgICAgICAgICAgICAgLmFkZFJlZyhFdmVuUmVnKQorICAgICAgICAgICAgICAuYWRkUmVnKE9kZFJlZykKKyAgICAgICAgICAgICAgLmFkZFJlZyhCYXNlUmVnKTsKKyAgICAgICAgICAgIGlmICghaXNUMikKKyAgICAgICAgICAgICAgTUlCLmFkZFJlZyhPZmZSZWcpOworICAgICAgICAgICAgTUlCLmFkZEltbShPZmZzZXQpLmFkZEltbShQcmVkKS5hZGRSZWcoUHJlZFJlZyk7CisgICAgICAgICAgICArK051bVNUUkRGb3JtZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIE1CQi0+ZXJhc2UoT3AwKTsKKyAgICAgICAgICBNQkItPmVyYXNlKE9wMSk7CisKKyAgICAgICAgICAvLyBBZGQgcmVnaXN0ZXIgYWxsb2NhdGlvbiBoaW50cyB0byBmb3JtIHJlZ2lzdGVyIHBhaXJzLgorICAgICAgICAgIE1SSS0+c2V0UmVnQWxsb2NhdGlvbkhpbnQoRXZlblJlZywgQVJNUkk6OlJlZ1BhaXJFdmVuLCBPZGRSZWcpOworICAgICAgICAgIE1SSS0+c2V0UmVnQWxsb2NhdGlvbkhpbnQoT2RkUmVnLCAgQVJNUkk6OlJlZ1BhaXJPZGQsIEV2ZW5SZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtTW92ZTsgKytpKSB7CisgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk9wID0gT3BzLmJhY2soKTsKKyAgICAgICAgICAgIE9wcy5wb3BfYmFjaygpOworICAgICAgICAgICAgTUJCLT5zcGxpY2UoSW5zZXJ0UG9zLCBNQkIsIE9wKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBOdW1MZFN0TW92ZWQgKz0gTnVtTW92ZTsKKyAgICAgICAgUmV0VmFsID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gUmV0VmFsOworfQorCitib29sCitBUk1QcmVBbGxvY0xvYWRTdG9yZU9wdDo6UmVzY2hlZHVsZUxvYWRTdG9yZUluc3RycyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgIGJvb2wgUmV0VmFsID0gZmFsc2U7CisKKyAgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+IE1JMkxvY01hcDsKKyAgRGVuc2VNYXA8dW5zaWduZWQsIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDQ+ID4gQmFzZTJMZHNNYXA7CisgIERlbnNlTWFwPHVuc2lnbmVkLCBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiA+IEJhc2UyU3RzTWFwOworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gTGRCYXNlczsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IFN0QmFzZXM7CisKKyAgdW5zaWduZWQgTG9jID0gMDsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBNQkItPmJlZ2luKCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFID0gTUJCLT5lbmQoKTsKKyAgd2hpbGUgKE1CQkkgIT0gRSkgeworICAgIGZvciAoOyBNQkJJICE9IEU7ICsrTUJCSSkgeworICAgICAgTWFjaGluZUluc3RyICpNSSA9IE1CQkk7CisgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgICAgICBpZiAoVElELmlzQ2FsbCgpIHx8IFRJRC5pc1Rlcm1pbmF0b3IoKSkgeworICAgICAgICAvLyBTdG9wIGF0IGJhcnJpZXJzLgorICAgICAgICArK01CQkk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoIU1JLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICAgTUkyTG9jTWFwW01JXSA9ICsrTG9jOworCisgICAgICBpZiAoIWlzTWVtb3J5T3AoTUkpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHVuc2lnbmVkIFByZWRSZWcgPSAwOworICAgICAgaWYgKGxsdm06OmdldEluc3RyUHJlZGljYXRlKE1JLCBQcmVkUmVnKSAhPSBBUk1DQzo6QUwpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpbnQgT3BjID0gTUktPmdldE9wY29kZSgpOworICAgICAgYm9vbCBpc0xkID0gaXNpMzJMb2FkKE9wYykgfHwgT3BjID09IEFSTTo6VkxEUlMgfHwgT3BjID09IEFSTTo6VkxEUkQ7CisgICAgICB1bnNpZ25lZCBCYXNlID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICBpbnQgT2Zmc2V0ID0gZ2V0TWVtb3J5T3BPZmZzZXQoTUkpOworCisgICAgICBib29sIFN0b3BIZXJlID0gZmFsc2U7CisgICAgICBpZiAoaXNMZCkgeworICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyKiwgND4gPjo6aXRlcmF0b3IgQkkgPQorICAgICAgICAgIEJhc2UyTGRzTWFwLmZpbmQoQmFzZSk7CisgICAgICAgIGlmIChCSSAhPSBCYXNlMkxkc01hcC5lbmQoKSkgeworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCSS0+c2Vjb25kLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChPZmZzZXQgPT0gZ2V0TWVtb3J5T3BPZmZzZXQoQkktPnNlY29uZFtpXSkpIHsKKyAgICAgICAgICAgICAgU3RvcEhlcmUgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFTdG9wSGVyZSkKKyAgICAgICAgICAgIEJJLT5zZWNvbmQucHVzaF9iYWNrKE1JKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBNSXM7CisgICAgICAgICAgTUlzLnB1c2hfYmFjayhNSSk7CisgICAgICAgICAgQmFzZTJMZHNNYXBbQmFzZV0gPSBNSXM7CisgICAgICAgICAgTGRCYXNlcy5wdXNoX2JhY2soQmFzZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiA+OjppdGVyYXRvciBCSSA9CisgICAgICAgICAgQmFzZTJTdHNNYXAuZmluZChCYXNlKTsKKyAgICAgICAgaWYgKEJJICE9IEJhc2UyU3RzTWFwLmVuZCgpKSB7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEJJLT5zZWNvbmQuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKE9mZnNldCA9PSBnZXRNZW1vcnlPcE9mZnNldChCSS0+c2Vjb25kW2ldKSkgeworICAgICAgICAgICAgICBTdG9wSGVyZSA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIVN0b3BIZXJlKQorICAgICAgICAgICAgQkktPnNlY29uZC5wdXNoX2JhY2soTUkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDQ+IE1JczsKKyAgICAgICAgICBNSXMucHVzaF9iYWNrKE1JKTsKKyAgICAgICAgICBCYXNlMlN0c01hcFtCYXNlXSA9IE1JczsKKyAgICAgICAgICBTdEJhc2VzLnB1c2hfYmFjayhCYXNlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoU3RvcEhlcmUpIHsKKyAgICAgICAgLy8gRm91bmQgYSBkdXBsaWNhdGUgKGEgYmFzZStvZmZzZXQgY29tYmluYXRpb24gdGhhdCdzIHNlZW4gZWFybGllcikuCisgICAgICAgIC8vIEJhY2t0cmFjay4KKyAgICAgICAgLS1Mb2M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJlLXNjaGVkdWxlIGxvYWRzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMZEJhc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIHVuc2lnbmVkIEJhc2UgPSBMZEJhc2VzW2ldOworICAgICAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyKiwgND4gJkxkcyA9IEJhc2UyTGRzTWFwW0Jhc2VdOworICAgICAgaWYgKExkcy5zaXplKCkgPiAxKQorICAgICAgICBSZXRWYWwgfD0gUmVzY2hlZHVsZU9wcyhNQkIsIExkcywgQmFzZSwgdHJ1ZSwgTUkyTG9jTWFwKTsKKyAgICB9CisKKyAgICAvLyBSZS1zY2hlZHVsZSBzdG9yZXMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN0QmFzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgdW5zaWduZWQgQmFzZSA9IFN0QmFzZXNbaV07CisgICAgICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiAmU3RzID0gQmFzZTJTdHNNYXBbQmFzZV07CisgICAgICBpZiAoU3RzLnNpemUoKSA+IDEpCisgICAgICAgIFJldFZhbCB8PSBSZXNjaGVkdWxlT3BzKE1CQiwgU3RzLCBCYXNlLCBmYWxzZSwgTUkyTG9jTWFwKTsKKyAgICB9CisKKyAgICBpZiAoTUJCSSAhPSBFKSB7CisgICAgICBCYXNlMkxkc01hcC5jbGVhcigpOworICAgICAgQmFzZTJTdHNNYXAuY2xlYXIoKTsKKyAgICAgIExkQmFzZXMuY2xlYXIoKTsKKyAgICAgIFN0QmFzZXMuY2xlYXIoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gUmV0VmFsOworfQorCisKKy8vLyBjcmVhdGVBUk1Mb2FkU3RvcmVPcHRpbWl6YXRpb25QYXNzIC0gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgbG9hZCAvIHN0b3JlCisvLy8gb3B0aW1pemF0aW9uIHBhc3MuCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUFSTUxvYWRTdG9yZU9wdGltaXphdGlvblBhc3MoYm9vbCBQcmVBbGxvYykgeworICBpZiAoUHJlQWxsb2MpCisgICAgcmV0dXJuIG5ldyBBUk1QcmVBbGxvY0xvYWRTdG9yZU9wdCgpOworICByZXR1cm4gbmV3IEFSTUxvYWRTdG9yZU9wdCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNTUNBc21JbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTU1DQXNtSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlZGZjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTU1DQXNtSW5mby5jcHAKQEAgLTAsMCArMSw2OCBAQAorLy89PT0tLSBBUk1NQ0FzbUluZm8uY3BwIC0gQVJNIGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiB0aGUgQVJNTUNBc21JbmZvIHByb3BlcnRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkFSTU1DQXNtSW5mby5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhcm1fYXNtX3RhYmxlW10gPSB7CisgICJ7cjB9IiwgInIwIiwKKyAgIntyMX0iLCAicjEiLAorICAie3IyfSIsICJyMiIsCisgICJ7cjN9IiwgInIzIiwKKyAgIntyNH0iLCAicjQiLAorICAie3I1fSIsICJyNSIsCisgICJ7cjZ9IiwgInI2IiwKKyAgIntyN30iLCAicjciLAorICAie3I4fSIsICJyOCIsCisgICJ7cjl9IiwgInI5IiwKKyAgIntyMTB9IiwgInIxMCIsCisgICJ7cjExfSIsICJyMTEiLAorICAie3IxMn0iLCAicjEyIiwKKyAgIntyMTN9IiwgInIxMyIsCisgICJ7cjE0fSIsICJyMTQiLAorICAie2xyfSIsICJsciIsCisgICJ7c3B9IiwgInNwIiwKKyAgIntpcH0iLCAiaXAiLAorICAie2ZwfSIsICJmcCIsCisgICJ7c2x9IiwgInNsIiwKKyAgInttZW1vcnl9IiwgIm1lbW9yeSIsCisgICJ7Y2N9IiwgImNjIiwKKyAgMCwwCit9OworCitBUk1NQ0FzbUluZm9EYXJ3aW46OkFSTU1DQXNtSW5mb0RhcndpbigpIHsKKyAgQXNtVHJhbnNDQkUgPSBhcm1fYXNtX3RhYmxlOworICBEYXRhNjRiaXRzRGlyZWN0aXZlID0gMDsKKyAgQ29tbWVudFN0cmluZyA9ICJAIjsKKyAgU3VwcG9ydHNEZWJ1Z0luZm9ybWF0aW9uID0gdHJ1ZTsKKworICAvLyBFeGNlcHRpb25zIGhhbmRsaW5nCisgIEV4Y2VwdGlvbnNUeXBlID0gRXhjZXB0aW9uSGFuZGxpbmc6OlNqTGo7Cit9CisKK0FSTUVMRk1DQXNtSW5mbzo6QVJNRUxGTUNBc21JbmZvKCkgeworICAvLyAiLmNvbW0gYWxpZ24gaXMgaW4gYnl0ZXMgYnV0IC5hbGlnbiBpcyBwb3ctMi4iCisgIEFsaWdubWVudElzSW5CeXRlcyA9IGZhbHNlOworCisgIERhdGE2NGJpdHNEaXJlY3RpdmUgPSAwOworICBDb21tZW50U3RyaW5nID0gIkAiOworCisgIEhhc0xFQjEyOCA9IHRydWU7CisgIFByaXZhdGVHbG9iYWxQcmVmaXggPSAiLkwiOworICBXZWFrUmVmRGlyZWN0aXZlID0gIlx0LndlYWtcdCI7CisgIEhhc0xDT01NRGlyZWN0aXZlID0gdHJ1ZTsKKworICBEd2FyZlJlcXVpcmVzRnJhbWVTZWN0aW9uID0gZmFsc2U7CisKKyAgU3VwcG9ydHNEZWJ1Z0luZm9ybWF0aW9uID0gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTU1DQXNtSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNTUNBc21JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmNzgyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTU1DQXNtSW5mby5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09PT0tLSBBUk1NQ0FzbUluZm8uaCAtIEFSTSBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLS09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBBUk1NQ0FzbUluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FSTVRBUkdFVEFTTUlORk9fSAorI2RlZmluZSBMTFZNX0FSTVRBUkdFVEFTTUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm9EYXJ3aW4uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIHN0cnVjdCBBUk1NQ0FzbUluZm9EYXJ3aW4gOiBwdWJsaWMgTUNBc21JbmZvRGFyd2luIHsKKyAgICBleHBsaWNpdCBBUk1NQ0FzbUluZm9EYXJ3aW4oKTsKKyAgfTsKKworICBzdHJ1Y3QgQVJNRUxGTUNBc21JbmZvIDogcHVibGljIE1DQXNtSW5mbyB7CisgICAgZXhwbGljaXQgQVJNRUxGTUNBc21JbmZvKCk7CisgIH07CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1NQ0luc3RMb3dlci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1NQ0luc3RMb3dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyYjA2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTU1DSW5zdExvd2VyLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLy89PT0tLSBBUk1NQ0luc3RMb3dlci5jcHAgLSBDb252ZXJ0IEFSTSBNYWNoaW5lSW5zdHIgdG8gYW4gTUNJbnN0IC0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY29kZSB0byBsb3dlciBBUk0gTWFjaGluZUluc3RycyB0byB0aGVpciBjb3JyZXNwb25kaW5nCisvLyBNQ0luc3QgcmVjb3Jkcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNTUNJbnN0TG93ZXIuaCIKKy8vI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mb0ltcGxzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdC5oIgorLy8jaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworCisjaWYgMAorY29uc3QgQVJNU3VidGFyZ2V0ICZBUk1NQ0luc3RMb3dlcjo6Z2V0U3VidGFyZ2V0KCkgY29uc3QgeworICByZXR1cm4gQXNtUHJpbnRlci5nZXRTdWJ0YXJnZXQoKTsKK30KKworTWFjaGluZU1vZHVsZUluZm9NYWNoTyAmQVJNTUNJbnN0TG93ZXI6OmdldE1hY2hPTU1JKCkgY29uc3QgeworICBhc3NlcnQoZ2V0U3VidGFyZ2V0KCkuaXNUYXJnZXREYXJ3aW4oKSAmJiJDYW4gb25seSBnZXQgTWFjaE8gaW5mbyBvbiBkYXJ3aW4iKTsKKyAgcmV0dXJuIEFzbVByaW50ZXIuTU1JLT5nZXRPYmpGaWxlSW5mbzxNYWNoaW5lTW9kdWxlSW5mb01hY2hPPigpOyAKK30KKyNlbmRpZgorCitNQ1N5bWJvbCAqQVJNTUNJbnN0TG93ZXI6OgorR2V0R2xvYmFsQWRkcmVzc1N5bWJvbChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIGNvbnN0IHsKKyAgLy8gRklYTUU6IEhBTkRMRSBQTFQgcmVmZXJlbmNlcyBob3c/PworICBzd2l0Y2ggKE1PLmdldFRhcmdldEZsYWdzKCkpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gdGFyZ2V0IGZsYWcgb24gR1Ygb3BlcmFuZCIpOworICBjYXNlIDA6IGJyZWFrOworICB9CisgIAorICByZXR1cm4gUHJpbnRlci5NYW5nLT5nZXRTeW1ib2woTU8uZ2V0R2xvYmFsKCkpOworfQorCitNQ1N5bWJvbCAqQVJNTUNJbnN0TG93ZXI6OgorR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdCB7CisgIC8vIEZJWE1FOiBIQU5ETEUgUExUIHJlZmVyZW5jZXMgaG93Pz8KKyAgc3dpdGNoIChNTy5nZXRUYXJnZXRGbGFncygpKSB7CisgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIHRhcmdldCBmbGFnIG9uIEdWIG9wZXJhbmQiKTsKKyAgY2FzZSAwOiBicmVhazsKKyAgfQorICAKKyAgcmV0dXJuIFByaW50ZXIuR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woTU8uZ2V0U3ltYm9sTmFtZSgpKTsKK30KKworCisKK01DU3ltYm9sICpBUk1NQ0luc3RMb3dlcjo6CitHZXRKdW1wVGFibGVTeW1ib2woY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdCB7CisgIFNtYWxsU3RyaW5nPDI1Nj4gTmFtZTsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbShOYW1lKSA8PCBQcmludGVyLk1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJKVEkiCisgICAgPDwgUHJpbnRlci5nZXRGdW5jdGlvbk51bWJlcigpIDw8ICdfJyA8PCBNTy5nZXRJbmRleCgpOworICAKKyNpZiAwCisgIHN3aXRjaCAoTU8uZ2V0VGFyZ2V0RmxhZ3MoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdGFyZ2V0IGZsYWcgb24gR1Ygb3BlcmFuZCIpOworICB9CisjZW5kaWYKKyAgCisgIC8vIENyZWF0ZSBhIHN5bWJvbCBmb3IgdGhlIG5hbWUuCisgIHJldHVybiBDdHguR2V0T3JDcmVhdGVTeW1ib2woTmFtZS5zdHIoKSk7Cit9CisKK01DU3ltYm9sICpBUk1NQ0luc3RMb3dlcjo6CitHZXRDb25zdGFudFBvb2xJbmRleFN5bWJvbChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIGNvbnN0IHsKKyAgU21hbGxTdHJpbmc8MjU2PiBOYW1lOworICByYXdfc3ZlY3Rvcl9vc3RyZWFtKE5hbWUpIDw8IFByaW50ZXIuTUFJLT5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCkgPDwgIkNQSSIKKyAgICA8PCBQcmludGVyLmdldEZ1bmN0aW9uTnVtYmVyKCkgPDwgJ18nIDw8IE1PLmdldEluZGV4KCk7CisgIAorI2lmIDAKKyAgc3dpdGNoIChNTy5nZXRUYXJnZXRGbGFncygpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdGFyZ2V0IGZsYWcgb24gR1Ygb3BlcmFuZCIpOworICB9CisjZW5kaWYKKyAgCisgIC8vIENyZWF0ZSBhIHN5bWJvbCBmb3IgdGhlIG5hbWUuCisgIHJldHVybiBDdHguR2V0T3JDcmVhdGVTeW1ib2woTmFtZS5zdHIoKSk7Cit9CisgIAorTUNPcGVyYW5kIEFSTU1DSW5zdExvd2VyOjoKK0xvd2VyU3ltYm9sT3BlcmFuZChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8sIE1DU3ltYm9sICpTeW0pIGNvbnN0IHsKKyAgLy8gRklYTUU6IFdlIHdvdWxkIGxpa2UgYW4gZWZmaWNpZW50IGZvcm0gZm9yIHRoaXMsIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYQorICAvLyBsb3Qgb2YgZXh0cmEgdW5pcXVpbmcuCisgIGNvbnN0IE1DRXhwciAqRXhwciA9IE1DU3ltYm9sUmVmRXhwcjo6Q3JlYXRlKFN5bSwgQ3R4KTsKKyAgCisjaWYgMAorICBzd2l0Y2ggKE1PLmdldFRhcmdldEZsYWdzKCkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB0YXJnZXQgZmxhZyBvbiBHViBvcGVyYW5kIik7CisgIH0KKyNlbmRpZgorICAKKyAgaWYgKCFNTy5pc0pUSSgpICYmIE1PLmdldE9mZnNldCgpKQorICAgIEV4cHIgPSBNQ0JpbmFyeUV4cHI6OkNyZWF0ZUFkZChFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnN0YW50RXhwcjo6Q3JlYXRlKE1PLmdldE9mZnNldCgpLCBDdHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdHgpOworICByZXR1cm4gTUNPcGVyYW5kOjpDcmVhdGVFeHByKEV4cHIpOworfQorCisKK3ZvaWQgQVJNTUNJbnN0TG93ZXI6Okxvd2VyKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIE1DSW5zdCAmT3V0TUkpIGNvbnN0IHsKKyAgT3V0TUkuc2V0T3Bjb2RlKE1JLT5nZXRPcGNvZGUoKSk7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgCisgICAgTUNPcGVyYW5kIE1DT3A7CisgICAgc3dpdGNoIChNTy5nZXRUeXBlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgTUktPmR1bXAoKTsKKyAgICAgIGFzc2VydCgwICYmICJ1bmtub3duIG9wZXJhbmQgdHlwZSIpOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyOgorICAgICAgLy8gSWdub3JlIGFsbCBpbXBsaWNpdCByZWdpc3RlciBvcGVyYW5kcy4KKyAgICAgIGlmIChNTy5pc0ltcGxpY2l0KCkpIGNvbnRpbnVlOworICAgICAgYXNzZXJ0KCFNTy5nZXRTdWJSZWcoKSAmJiAiU3VicmVncyBzaG91bGQgYmUgZWxpbWluYXRlZCEiKTsKKyAgICAgIE1DT3AgPSBNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhNTy5nZXRSZWcoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgICBNQ09wID0gTUNPcGVyYW5kOjpDcmVhdGVJbW0oTU8uZ2V0SW1tKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fTWFjaGluZUJhc2ljQmxvY2s6CisgICAgICBNQ09wID0gTUNPcGVyYW5kOjpDcmVhdGVFeHByKE1DU3ltYm9sUmVmRXhwcjo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICBNTy5nZXRNQkIoKS0+Z2V0U3ltYm9sKCksIEN0eCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fR2xvYmFsQWRkcmVzczoKKyAgICAgIE1DT3AgPSBMb3dlclN5bWJvbE9wZXJhbmQoTU8sIEdldEdsb2JhbEFkZHJlc3NTeW1ib2woTU8pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOgorICAgICAgTUNPcCA9IExvd2VyU3ltYm9sT3BlcmFuZChNTywgR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woTU8pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0p1bXBUYWJsZUluZGV4OgorICAgICAgTUNPcCA9IExvd2VyU3ltYm9sT3BlcmFuZChNTywgR2V0SnVtcFRhYmxlU3ltYm9sKE1PKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19Db25zdGFudFBvb2xJbmRleDoKKyAgICAgIE1DT3AgPSBMb3dlclN5bWJvbE9wZXJhbmQoTU8sIEdldENvbnN0YW50UG9vbEluZGV4U3ltYm9sKE1PKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19CbG9ja0FkZHJlc3M6CisgICAgICBNQ09wID0gTG93ZXJTeW1ib2xPcGVyYW5kKE1PLCBQcmludGVyLkdldEJsb2NrQWRkcmVzc1N5bWJvbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTy5nZXRCbG9ja0FkZHJlc3MoKSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIE91dE1JLmFkZE9wZXJhbmQoTUNPcCk7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1NQ0luc3RMb3dlci5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNTUNJbnN0TG93ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODFhMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNTUNJbnN0TG93ZXIuaApAQCAtMCwwICsxLDU2IEBACisvLz09PS0tIEFSTU1DSW5zdExvd2VyLmggLSBMb3dlciBNYWNoaW5lSW5zdHIgdG8gTUNJbnN0IC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEFSTV9NQ0lOU1RMT1dFUl9ICisjZGVmaW5lIEFSTV9NQ0lOU1RMT1dFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBc21QcmludGVyOworICBjbGFzcyBNQ0FzbUluZm87CisgIGNsYXNzIE1DQ29udGV4dDsKKyAgY2xhc3MgTUNJbnN0OworICBjbGFzcyBNQ09wZXJhbmQ7CisgIGNsYXNzIE1DU3ltYm9sOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIE1hY2hpbmVNb2R1bGVJbmZvTWFjaE87CisgIGNsYXNzIE1hY2hpbmVPcGVyYW5kOworICBjbGFzcyBNYW5nbGVyOworICAvL2NsYXNzIEFSTVN1YnRhcmdldDsKKyAgCisvLy8gQVJNTUNJbnN0TG93ZXIgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gbG93ZXIgYW4gTWFjaGluZUluc3RyIGludG8gYW4gTUNJbnN0LgorY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgQVJNTUNJbnN0TG93ZXIgeworICBNQ0NvbnRleHQgJkN0eDsKKyAgTWFuZ2xlciAmTWFuZzsKKyAgQXNtUHJpbnRlciAmUHJpbnRlcjsKKworICAvL2NvbnN0IEFSTVN1YnRhcmdldCAmZ2V0U3VidGFyZ2V0KCkgY29uc3Q7CitwdWJsaWM6CisgIEFSTU1DSW5zdExvd2VyKE1DQ29udGV4dCAmY3R4LCBNYW5nbGVyICZtYW5nLCBBc21QcmludGVyICZwcmludGVyKQorICAgIDogQ3R4KGN0eCksIE1hbmcobWFuZyksIFByaW50ZXIocHJpbnRlcikge30KKyAgCisgIHZvaWQgTG93ZXIoY29uc3QgTWFjaGluZUluc3RyICpNSSwgTUNJbnN0ICZPdXRNSSkgY29uc3Q7CisKKyAgLy9NQ1N5bWJvbCAqR2V0UElDQmFzZVN5bWJvbCgpIGNvbnN0OworICBNQ1N5bWJvbCAqR2V0R2xvYmFsQWRkcmVzc1N5bWJvbChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIGNvbnN0OworICBNQ1N5bWJvbCAqR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdDsKKyAgTUNTeW1ib2wgKkdldEp1bXBUYWJsZVN5bWJvbChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIGNvbnN0OworICBNQ1N5bWJvbCAqR2V0Q29uc3RhbnRQb29sSW5kZXhTeW1ib2woY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdDsKKyAgTUNPcGVyYW5kIExvd2VyU3ltYm9sT3BlcmFuZChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8sIE1DU3ltYm9sICpTeW0pIGNvbnN0OworICAKKy8qCitwcml2YXRlOgorICBNYWNoaW5lTW9kdWxlSW5mb01hY2hPICZnZXRNYWNoT01NSSgpIGNvbnN0OworICovCit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNTWFjaGluZUZ1bmN0aW9uSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNTWFjaGluZUZ1bmN0aW9uSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNGMyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1NYWNoaW5lRnVuY3Rpb25JbmZvLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8vPT09PS0gQVJNTWFjaGluZUZ1Y3Rpb25JbmZvLmggLSBBUk0gbWFjaGluZSBmdW5jdGlvbiBpbmZvIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIEFSTS1zcGVjaWZpYyBwZXItbWFjaGluZS1mdW5jdGlvbiBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEFSTU1BQ0hJTkVGVU5DVElPTklORk9fSAorI2RlZmluZSBBUk1NQUNISU5FRlVOQ1RJT05JTkZPX0gKKworI2luY2x1ZGUgIkFSTVN1YnRhcmdldC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEFSTUZ1bmN0aW9uSW5mbyAtIFRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIE1hY2hpbmVGdW5jdGlvbiBwcml2YXRlCisvLy8gQVJNIHRhcmdldC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBNYWNoaW5lRnVuY3Rpb24uCitjbGFzcyBBUk1GdW5jdGlvbkluZm8gOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uSW5mbyB7CisKKyAgLy8vIGlzVGh1bWIgLSBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gaXMgY29tcGlsZWQgdW5kZXIgVGh1bWIgbW9kZS4KKyAgLy8vIFVzZWQgdG8gaW5pdGlhbGl6ZWQgQWxpZ24sIHNvIG11c3QgcHJlY2VkZSBpdC4KKyAgYm9vbCBpc1RodW1iOworCisgIC8vLyBoYXNUaHVtYjIgLSBUcnVlIGlmIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIFRodW1iMi4gRG8gbm90IHVzZQorICAvLy8gdG8gZGV0ZXJtaW5lIGlmIGZ1bmN0aW9uIGlzIGNvbXBpbGVkIHVuZGVyIFRodW1iIG1vZGUsIGZvciB0aGF0IHVzZQorICAvLy8gJ2lzVGh1bWInLgorICBib29sIGhhc1RodW1iMjsKKworICAvLy8gVmFyQXJnc1JlZ1NhdmVTaXplIC0gU2l6ZSBvZiB0aGUgcmVnaXN0ZXIgc2F2ZSBhcmVhIGZvciB2YXJhcmcgZnVuY3Rpb25zLgorICAvLy8KKyAgdW5zaWduZWQgVmFyQXJnc1JlZ1NhdmVTaXplOworCisgIC8vLyBIYXNTdGFja0ZyYW1lIC0gVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBhIHN0YWNrIGZyYW1lLiBTZXQgYnkKKyAgLy8vIHByb2Nlc3NGdW5jdGlvbkJlZm9yZUNhbGxlZVNhdmVkU2NhbigpLgorICBib29sIEhhc1N0YWNrRnJhbWU7CisKKyAgLy8vIFJlc3RvcmVTUEZyb21GUCAtIFRydWUgaWYgZXBpbG9ndWUgc2hvdWxkIHJlc3RvcmUgU1AgZnJvbSBGUC4gU2V0IGJ5CisgIC8vLyBlbWl0UHJvbG9ndWUuCisgIGJvb2wgUmVzdG9yZVNQRnJvbUZQOworCisgIC8vLyBMUlNwaWxsZWRGb3JGYXJKdW1wIC0gVHJ1ZSBpZiB0aGUgTFIgcmVnaXN0ZXIgaGFzIGJlZW4gZm9yIHNwaWxsZWQgdG8KKyAgLy8vIGVuYWJsZSBmYXIganVtcC4KKyAgYm9vbCBMUlNwaWxsZWRGb3JGYXJKdW1wOworCisgIC8vLyBGcmFtZVB0clNwaWxsT2Zmc2V0IC0gSWYgSGFzU3RhY2tGcmFtZSwgdGhpcyByZWNvcmRzIHRoZSBmcmFtZSBwb2ludGVyCisgIC8vLyBzcGlsbCBzdGFjayBvZmZzZXQuCisgIHVuc2lnbmVkIEZyYW1lUHRyU3BpbGxPZmZzZXQ7CisKKyAgLy8vIEdQUkNTMU9mZnNldCwgR1BSQ1MyT2Zmc2V0LCBEUFJDU09mZnNldCAtIFN0YXJ0aW5nIG9mZnNldCBvZiBjYWxsZWUgc2F2ZWQKKyAgLy8vIHJlZ2lzdGVyIHNwaWxscyBhcmVhcy4gRm9yIE1hYyBPUyBYOgorICAvLy8KKyAgLy8vIEdQUiBjYWxsZWUtc2F2ZWQgKDEpIDogcjQsIHI1LCByNiwgcjcsIGxyCisgIC8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLy8gR1BSIGNhbGxlZS1zYXZlZCAoMikgOiByOCwgcjEwLCByMTEKKyAgLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vLyBEUFIgY2FsbGVlLXNhdmVkIDogZDggLSBkMTUKKyAgdW5zaWduZWQgR1BSQ1MxT2Zmc2V0OworICB1bnNpZ25lZCBHUFJDUzJPZmZzZXQ7CisgIHVuc2lnbmVkIERQUkNTT2Zmc2V0OworCisgIC8vLyBHUFJDUzFTaXplLCBHUFJDUzJTaXplLCBEUFJDU1NpemUgLSBTaXplcyBvZiBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgc3BpbGxzCisgIC8vLyBhcmVhcy4KKyAgdW5zaWduZWQgR1BSQ1MxU2l6ZTsKKyAgdW5zaWduZWQgR1BSQ1MyU2l6ZTsKKyAgdW5zaWduZWQgRFBSQ1NTaXplOworCisgIC8vLyBHUFJDUzFGcmFtZXMsIEdQUkNTMkZyYW1lcywgRFBSQ1NGcmFtZXMgLSBLZWVwcyB0cmFjayBvZiBmcmFtZSBpbmRpY2VzCisgIC8vLyB3aGljaCBiZWxvbmcgdG8gdGhlc2Ugc3BpbGwgYXJlYXMuCisgIEJpdFZlY3RvciBHUFJDUzFGcmFtZXM7CisgIEJpdFZlY3RvciBHUFJDUzJGcmFtZXM7CisgIEJpdFZlY3RvciBEUFJDU0ZyYW1lczsKKworICAvLy8gU3BpbGxlZENTUmVncyAtIEEgQml0VmVjdG9yIG1hc2sgb2YgYWxsIHNwaWxsZWQgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycy4KKyAgLy8vCisgIEJpdFZlY3RvciBTcGlsbGVkQ1NSZWdzOworCisgIC8vLyBKdW1wVGFibGVVSWQgLSBVbmlxdWUgaWQgZm9yIGp1bXB0YWJsZXMuCisgIC8vLworICB1bnNpZ25lZCBKdW1wVGFibGVVSWQ7CisKKyAgdW5zaWduZWQgQ29uc3RQb29sRW50cnlVSWQ7CisKKyAgLy8vIFZhckFyZ3NGcmFtZUluZGV4IC0gRnJhbWVJbmRleCBmb3Igc3RhcnQgb2YgdmFyYXJncyBhcmVhLgorICBpbnQgVmFyQXJnc0ZyYW1lSW5kZXg7CisKKyAgLy8vIEhhc0lUQmxvY2tzIC0gVHJ1ZSBpZiBJVCBibG9ja3MgaGF2ZSBiZWVuIGluc2VydGVkLgorICBib29sIEhhc0lUQmxvY2tzOworCitwdWJsaWM6CisgIEFSTUZ1bmN0aW9uSW5mbygpIDoKKyAgICBpc1RodW1iKGZhbHNlKSwKKyAgICBoYXNUaHVtYjIoZmFsc2UpLAorICAgIFZhckFyZ3NSZWdTYXZlU2l6ZSgwKSwgSGFzU3RhY2tGcmFtZShmYWxzZSksIFJlc3RvcmVTUEZyb21GUChmYWxzZSksCisgICAgTFJTcGlsbGVkRm9yRmFySnVtcChmYWxzZSksCisgICAgRnJhbWVQdHJTcGlsbE9mZnNldCgwKSwgR1BSQ1MxT2Zmc2V0KDApLCBHUFJDUzJPZmZzZXQoMCksIERQUkNTT2Zmc2V0KDApLAorICAgIEdQUkNTMVNpemUoMCksIEdQUkNTMlNpemUoMCksIERQUkNTU2l6ZSgwKSwKKyAgICBHUFJDUzFGcmFtZXMoMCksIEdQUkNTMkZyYW1lcygwKSwgRFBSQ1NGcmFtZXMoMCksCisgICAgSnVtcFRhYmxlVUlkKDApLCBDb25zdFBvb2xFbnRyeVVJZCgwKSwgVmFyQXJnc0ZyYW1lSW5kZXgoMCksCisgICAgSGFzSVRCbG9ja3MoZmFsc2UpIHt9CisKKyAgZXhwbGljaXQgQVJNRnVuY3Rpb25JbmZvKE1hY2hpbmVGdW5jdGlvbiAmTUYpIDoKKyAgICBpc1RodW1iKE1GLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCkuaXNUaHVtYigpKSwKKyAgICBoYXNUaHVtYjIoTUYuZ2V0VGFyZ2V0KCkuZ2V0U3VidGFyZ2V0PEFSTVN1YnRhcmdldD4oKS5oYXNUaHVtYjIoKSksCisgICAgVmFyQXJnc1JlZ1NhdmVTaXplKDApLCBIYXNTdGFja0ZyYW1lKGZhbHNlKSwgUmVzdG9yZVNQRnJvbUZQKGZhbHNlKSwKKyAgICBMUlNwaWxsZWRGb3JGYXJKdW1wKGZhbHNlKSwKKyAgICBGcmFtZVB0clNwaWxsT2Zmc2V0KDApLCBHUFJDUzFPZmZzZXQoMCksIEdQUkNTMk9mZnNldCgwKSwgRFBSQ1NPZmZzZXQoMCksCisgICAgR1BSQ1MxU2l6ZSgwKSwgR1BSQ1MyU2l6ZSgwKSwgRFBSQ1NTaXplKDApLAorICAgIEdQUkNTMUZyYW1lcygzMiksIEdQUkNTMkZyYW1lcygzMiksIERQUkNTRnJhbWVzKDMyKSwKKyAgICBTcGlsbGVkQ1NSZWdzKE1GLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpLT5nZXROdW1SZWdzKCkpLAorICAgIEp1bXBUYWJsZVVJZCgwKSwgQ29uc3RQb29sRW50cnlVSWQoMCksIFZhckFyZ3NGcmFtZUluZGV4KDApLAorICAgIEhhc0lUQmxvY2tzKGZhbHNlKSB7fQorCisgIGJvb2wgaXNUaHVtYkZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gaXNUaHVtYjsgfQorICBib29sIGlzVGh1bWIxT25seUZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gaXNUaHVtYiAmJiAhaGFzVGh1bWIyOyB9CisgIGJvb2wgaXNUaHVtYjJGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIGlzVGh1bWIgJiYgaGFzVGh1bWIyOyB9CisKKyAgdW5zaWduZWQgZ2V0VmFyQXJnc1JlZ1NhdmVTaXplKCkgY29uc3QgeyByZXR1cm4gVmFyQXJnc1JlZ1NhdmVTaXplOyB9CisgIHZvaWQgc2V0VmFyQXJnc1JlZ1NhdmVTaXplKHVuc2lnbmVkIHMpIHsgVmFyQXJnc1JlZ1NhdmVTaXplID0gczsgfQorCisgIGJvb2wgaGFzU3RhY2tGcmFtZSgpIGNvbnN0IHsgcmV0dXJuIEhhc1N0YWNrRnJhbWU7IH0KKyAgdm9pZCBzZXRIYXNTdGFja0ZyYW1lKGJvb2wgcykgeyBIYXNTdGFja0ZyYW1lID0gczsgfQorCisgIGJvb2wgc2hvdWxkUmVzdG9yZVNQRnJvbUZQKCkgY29uc3QgeyByZXR1cm4gUmVzdG9yZVNQRnJvbUZQOyB9CisgIHZvaWQgc2V0U2hvdWxkUmVzdG9yZVNQRnJvbUZQKGJvb2wgcykgeyBSZXN0b3JlU1BGcm9tRlAgPSBzOyB9CisKKyAgYm9vbCBpc0xSU3BpbGxlZEZvckZhckp1bXAoKSBjb25zdCB7IHJldHVybiBMUlNwaWxsZWRGb3JGYXJKdW1wOyB9CisgIHZvaWQgc2V0TFJJc1NwaWxsZWRGb3JGYXJKdW1wKGJvb2wgcykgeyBMUlNwaWxsZWRGb3JGYXJKdW1wID0gczsgfQorCisgIHVuc2lnbmVkIGdldEZyYW1lUHRyU3BpbGxPZmZzZXQoKSBjb25zdCB7IHJldHVybiBGcmFtZVB0clNwaWxsT2Zmc2V0OyB9CisgIHZvaWQgc2V0RnJhbWVQdHJTcGlsbE9mZnNldCh1bnNpZ25lZCBvKSB7IEZyYW1lUHRyU3BpbGxPZmZzZXQgPSBvOyB9CisKKyAgdW5zaWduZWQgZ2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMU9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIEdQUkNTMU9mZnNldDsgfQorICB1bnNpZ25lZCBnZXRHUFJDYWxsZWVTYXZlZEFyZWEyT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gR1BSQ1MyT2Zmc2V0OyB9CisgIHVuc2lnbmVkIGdldERQUkNhbGxlZVNhdmVkQXJlYU9mZnNldCgpICBjb25zdCB7IHJldHVybiBEUFJDU09mZnNldDsgfQorCisgIHZvaWQgc2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMU9mZnNldCh1bnNpZ25lZCBvKSB7IEdQUkNTMU9mZnNldCA9IG87IH0KKyAgdm9pZCBzZXRHUFJDYWxsZWVTYXZlZEFyZWEyT2Zmc2V0KHVuc2lnbmVkIG8pIHsgR1BSQ1MyT2Zmc2V0ID0gbzsgfQorICB2b2lkIHNldERQUkNhbGxlZVNhdmVkQXJlYU9mZnNldCh1bnNpZ25lZCBvKSAgeyBEUFJDU09mZnNldCA9IG87IH0KKworICB1bnNpZ25lZCBnZXRHUFJDYWxsZWVTYXZlZEFyZWExU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEdQUkNTMVNpemU7IH0KKyAgdW5zaWduZWQgZ2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMlNpemUoKSBjb25zdCB7IHJldHVybiBHUFJDUzJTaXplOyB9CisgIHVuc2lnbmVkIGdldERQUkNhbGxlZVNhdmVkQXJlYVNpemUoKSAgY29uc3QgeyByZXR1cm4gRFBSQ1NTaXplOyB9CisKKyAgdm9pZCBzZXRHUFJDYWxsZWVTYXZlZEFyZWExU2l6ZSh1bnNpZ25lZCBzKSB7IEdQUkNTMVNpemUgPSBzOyB9CisgIHZvaWQgc2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMlNpemUodW5zaWduZWQgcykgeyBHUFJDUzJTaXplID0gczsgfQorICB2b2lkIHNldERQUkNhbGxlZVNhdmVkQXJlYVNpemUodW5zaWduZWQgcykgIHsgRFBSQ1NTaXplID0gczsgfQorCisgIGJvb2wgaXNHUFJDYWxsZWVTYXZlZEFyZWExRnJhbWUoaW50IGZpKSBjb25zdCB7CisgICAgaWYgKGZpIDwgMCB8fCBmaSA+PSAoaW50KUdQUkNTMUZyYW1lcy5zaXplKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEdQUkNTMUZyYW1lc1tmaV07CisgIH0KKyAgYm9vbCBpc0dQUkNhbGxlZVNhdmVkQXJlYTJGcmFtZShpbnQgZmkpIGNvbnN0IHsKKyAgICBpZiAoZmkgPCAwIHx8IGZpID49IChpbnQpR1BSQ1MyRnJhbWVzLnNpemUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gR1BSQ1MyRnJhbWVzW2ZpXTsKKyAgfQorICBib29sIGlzRFBSQ2FsbGVlU2F2ZWRBcmVhRnJhbWUoaW50IGZpKSBjb25zdCB7CisgICAgaWYgKGZpIDwgMCB8fCBmaSA+PSAoaW50KURQUkNTRnJhbWVzLnNpemUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRFBSQ1NGcmFtZXNbZmldOworICB9CisKKyAgdm9pZCBhZGRHUFJDYWxsZWVTYXZlZEFyZWExRnJhbWUoaW50IGZpKSB7CisgICAgaWYgKGZpID49IDApIHsKKyAgICAgIGludCBTaXplID0gR1BSQ1MxRnJhbWVzLnNpemUoKTsKKyAgICAgIGlmIChmaSA+PSBTaXplKSB7CisgICAgICAgIFNpemUgKj0gMjsKKyAgICAgICAgaWYgKGZpID49IFNpemUpCisgICAgICAgICAgU2l6ZSA9IGZpKzE7CisgICAgICAgIEdQUkNTMUZyYW1lcy5yZXNpemUoU2l6ZSk7CisgICAgICB9CisgICAgICBHUFJDUzFGcmFtZXNbZmldID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgdm9pZCBhZGRHUFJDYWxsZWVTYXZlZEFyZWEyRnJhbWUoaW50IGZpKSB7CisgICAgaWYgKGZpID49IDApIHsKKyAgICAgIGludCBTaXplID0gR1BSQ1MyRnJhbWVzLnNpemUoKTsKKyAgICAgIGlmIChmaSA+PSBTaXplKSB7CisgICAgICAgIFNpemUgKj0gMjsKKyAgICAgICAgaWYgKGZpID49IFNpemUpCisgICAgICAgICAgU2l6ZSA9IGZpKzE7CisgICAgICAgIEdQUkNTMkZyYW1lcy5yZXNpemUoU2l6ZSk7CisgICAgICB9CisgICAgICBHUFJDUzJGcmFtZXNbZmldID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgdm9pZCBhZGREUFJDYWxsZWVTYXZlZEFyZWFGcmFtZShpbnQgZmkpIHsKKyAgICBpZiAoZmkgPj0gMCkgeworICAgICAgaW50IFNpemUgPSBEUFJDU0ZyYW1lcy5zaXplKCk7CisgICAgICBpZiAoZmkgPj0gU2l6ZSkgeworICAgICAgICBTaXplICo9IDI7CisgICAgICAgIGlmIChmaSA+PSBTaXplKQorICAgICAgICAgIFNpemUgPSBmaSsxOworICAgICAgICBEUFJDU0ZyYW1lcy5yZXNpemUoU2l6ZSk7CisgICAgICB9CisgICAgICBEUFJDU0ZyYW1lc1tmaV0gPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0Q1NSZWdpc3RlcklzU3BpbGxlZCh1bnNpZ25lZCBSZWcpIHsKKyAgICBTcGlsbGVkQ1NSZWdzLnNldChSZWcpOworICB9CisKKyAgYm9vbCBpc0NTUmVnaXN0ZXJTcGlsbGVkKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBTcGlsbGVkQ1NSZWdzW1JlZ107CisgIH0KKworICBjb25zdCBCaXRWZWN0b3IgJmdldFNwaWxsZWRDU1JlZ2lzdGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3BpbGxlZENTUmVnczsKKyAgfQorCisgIHVuc2lnbmVkIGNyZWF0ZUp1bXBUYWJsZVVJZCgpIHsKKyAgICByZXR1cm4gSnVtcFRhYmxlVUlkKys7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1KdW1wVGFibGVzKCkgY29uc3QgeworICAgIHJldHVybiBKdW1wVGFibGVVSWQ7CisgIH0KKworICB2b2lkIGluaXRDb25zdFBvb2xFbnRyeVVJZCh1bnNpZ25lZCBVSWQpIHsKKyAgICBDb25zdFBvb2xFbnRyeVVJZCA9IFVJZDsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUNvbnN0UG9vbEVudHJpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0UG9vbEVudHJ5VUlkOworICB9CisKKyAgdW5zaWduZWQgY3JlYXRlQ29uc3RQb29sRW50cnlVSWQoKSB7CisgICAgcmV0dXJuIENvbnN0UG9vbEVudHJ5VUlkKys7CisgIH0KKworICBpbnQgZ2V0VmFyQXJnc0ZyYW1lSW5kZXgoKSBjb25zdCB7IHJldHVybiBWYXJBcmdzRnJhbWVJbmRleDsgfQorICB2b2lkIHNldFZhckFyZ3NGcmFtZUluZGV4KGludCBJbmRleCkgeyBWYXJBcmdzRnJhbWVJbmRleCA9IEluZGV4OyB9CisKKyAgYm9vbCBoYXNJVEJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIEhhc0lUQmxvY2tzOyB9CisgIHZvaWQgc2V0SGFzSVRCbG9ja3MoYm9vbCBoKSB7IEhhc0lUQmxvY2tzID0gaDsgfQorfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBBUk1NQUNISU5FRlVOQ1RJT05JTkZPX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVBlcmZlY3RTaHVmZmxlLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1QZXJmZWN0U2h1ZmZsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjdjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1QZXJmZWN0U2h1ZmZsZS5oCkBAIC0wLDAgKzEsNjU4NiBAQAorLy89PT0tLSBBUk1QZXJmZWN0U2h1ZmZsZS5oIC0gTkVPTiBQZXJmZWN0IFNodWZmbGUgVGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUsIHdoaWNoIHdhcyBhdXRvZ2VuZXJhdGVkIGJ5IGxsdm0tUGVyZmVjdFNodWZmbGUsIGNvbnRhaW5zIGRhdGEKKy8vIGZvciB0aGUgb3B0aW1hbCB3YXkgdG8gYnVpbGQgYSBwZXJmZWN0IHNodWZmbGUgdXNpbmcgbmVvbiBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gMzEgZW50cmllcyBoYXZlIGNvc3QgMAorLy8gMjQyIGVudHJpZXMgaGF2ZSBjb3N0IDEKKy8vIDE0NDcgZW50cmllcyBoYXZlIGNvc3QgMgorLy8gMzYwMiBlbnRyaWVzIGhhdmUgY29zdCAzCisvLyAxMjM3IGVudHJpZXMgaGF2ZSBjb3N0IDQKKy8vIDIgZW50cmllcyBoYXZlIGNvc3QgNQorCisvLyBUaGlzIHRhYmxlIGlzIDY1NjEqNCA9IDI2MjQ0IGJ5dGVzIGluIHNpemUuCitzdGF0aWMgY29uc3QgdW5zaWduZWQgUGVyZmVjdFNodWZmbGVUYWJsZVs2NTYxKzFdID0geworICAxMzUwNTM0MTRVLAkvLyA8MCwwLDAsMD46IENvc3QgMSB2ZHVwMCBMSFMKKyAgMTU0MzUwMzk3NFUsCS8vIDwwLDAsMCwxPjogQ29zdCAyIHZleHQyIDwwLDAsMCwwPiwgTEhTCisgIDI2MTg1NzI5NjJVLAkvLyA8MCwwLDAsMj46IENvc3QgMyB2ZXh0MiA8MCwyLDAsMD4sIDwwLDIsMCwwPgorICAyNTY4MDU0OTIzVSwJLy8gPDAsMCwwLDM+OiBDb3N0IDMgdmV4dDEgPDMsMCwwLDA+LCA8MywwLDAsMD4KKyAgMTQ3NjM5ODM5MFUsCS8vIDwwLDAsMCw0PjogQ29zdCAyIHZleHQxIDwwLDAsMCwwPiwgUkhTCisgIDI1NTAxNDA2MjRVLAkvLyA8MCwwLDAsNT46IENvc3QgMyB2ZXh0MSA8MCwwLDAsMD4sIDw1LDEsNywzPgorICAyNTUwMTQxNDM0VSwJLy8gPDAsMCwwLDY+OiBDb3N0IDMgdmV4dDEgPDAsMCwwLDA+LCA8NiwyLDcsMz4KKyAgMjU5MTk0NTcxMVUsCS8vIDwwLDAsMCw3PjogQ29zdCAzIHZleHQxIDw3LDAsMCwwPiwgPDcsMCwwLDA+CisgIDEzNTA1MzQxNFUsCS8vIDwwLDAsMCx1PjogQ29zdCAxIHZkdXAwIExIUworICAyODg2NTE2NzM2VSwJLy8gPDAsMCwxLDA+OiBDb3N0IDMgdnppcGwgTEhTLCA8MCwwLDAsMD4KKyAgMTgxMjc3NTAxNFUsCS8vIDwwLDAsMSwxPjogQ29zdCAyIHZ6aXBsIExIUywgTEhTCisgIDE2MTgxMzMwOTRVLAkvLyA8MCwwLDEsMj46IENvc3QgMiB2ZXh0MyA8MSwyLDMsMD4sIExIUworICAyNjI1MjA5MjkyVSwJLy8gPDAsMCwxLDM+OiBDb3N0IDMgdmV4dDIgPDEsMywwLDA+LCA8MSwzLDAsMD4KKyAgMjg4NjU1ODAzNFUsCS8vIDwwLDAsMSw0PjogQ29zdCAzIHZ6aXBsIExIUywgPDAsNCwxLDU+CisgIDI2MTcyNDY4NjRVLAkvLyA8MCwwLDEsNT46IENvc3QgMyB2ZXh0MiA8MCwwLDAsMD4sIDwxLDUsMyw3PgorICAzNjU5NzIzMDMxVSwJLy8gPDAsMCwxLDY+OiBDb3N0IDQgdmV4dDEgPDYsMCwwLDE+LCA8NiwwLDAsMT4KKyAgMjU5MTk1MzkwNFUsCS8vIDwwLDAsMSw3PjogQ29zdCAzIHZleHQxIDw3LDAsMCwxPiwgPDcsMCwwLDE+CisgIDE4MTI3NzU1ODFVLAkvLyA8MCwwLDEsdT46IENvc3QgMiB2emlwbCBMSFMsIExIUworICAzMDIwNzM0NDY0VSwJLy8gPDAsMCwyLDA+OiBDb3N0IDMgdnRybmwgTEhTLCA8MCwwLDAsMD4KKyAgMzAyMDczNDQ3NFUsCS8vIDwwLDAsMiwxPjogQ29zdCAzIHZ0cm5sIExIUywgPDAsMCwxLDE+CisgIDE5NDY5OTI3NDJVLAkvLyA8MCwwLDIsMj46IENvc3QgMiB2dHJubCBMSFMsIExIUworICAyNjMxMTgxOTg5VSwJLy8gPDAsMCwyLDM+OiBDb3N0IDMgdmV4dDIgPDIsMywwLDA+LCA8MiwzLDAsMD4KKyAgMzAyMDczNDY2OFUsCS8vIDwwLDAsMiw0PjogQ29zdCAzIHZ0cm5sIExIUywgPDAsMiw0LDY+CisgIDM4MjY1NTA1NjlVLAkvLyA8MCwwLDIsNT46IENvc3QgNCB2dXpwbCA8MCwyLDAsMj4sIDwyLDQsNSw2PgorICAyNjE3MjQ3Njc0VSwJLy8gPDAsMCwyLDY+OiBDb3N0IDMgdmV4dDIgPDAsMCwwLDA+LCA8Miw2LDMsNz4KKyAgMjU5MTk2MjA5N1UsCS8vIDwwLDAsMiw3PjogQ29zdCAzIHZleHQxIDw3LDAsMCwyPiwgPDcsMCwwLDI+CisgIDE5NDY5OTI3OTZVLAkvLyA8MCwwLDIsdT46IENvc3QgMiB2dHJubCBMSFMsIExIUworICAyNjM1MTYzNzg3VSwJLy8gPDAsMCwzLDA+OiBDb3N0IDMgdmV4dDIgPDMsMCwwLDA+LCA8MywwLDAsMD4KKyAgMjY4NjQxOTE5NlUsCS8vIDwwLDAsMywxPjogQ29zdCAzIHZleHQzIDwwLDMsMSwwPiwgPDAsMywxLDA+CisgIDI2ODY0OTI5MzNVLAkvLyA8MCwwLDMsMj46IENvc3QgMyB2ZXh0MyA8MCwzLDIsMD4sIDwwLDMsMiwwPgorICAyNjE3MjQ4MTU2VSwJLy8gPDAsMCwzLDM+OiBDb3N0IDMgdmV4dDIgPDAsMCwwLDA+LCA8MywzLDMsMz4KKyAgMjYxNzI0ODI1OFUsCS8vIDwwLDAsMyw0PjogQ29zdCAzIHZleHQyIDwwLDAsMCwwPiwgPDMsNCw1LDY+CisgIDM4MjY1NTEyOThVLAkvLyA8MCwwLDMsNT46IENvc3QgNCB2dXpwbCA8MCwyLDAsMj4sIDwzLDQsNSw2PgorICAzNjkwOTkwMjAwVSwJLy8gPDAsMCwzLDY+OiBDb3N0IDQgdmV4dDIgPDAsMCwwLDA+LCA8Myw2LDAsNz4KKyAgMzcxMzU1MTA0MlUsCS8vIDwwLDAsMyw3PjogQ29zdCA0IHZleHQyIDwzLDcsMCwwPiwgPDMsNywwLDA+CisgIDI2MzUxNjM3ODdVLAkvLyA8MCwwLDMsdT46IENvc3QgMyB2ZXh0MiA8MywwLDAsMD4sIDwzLDAsMCwwPgorICAyNjE3MjQ4NjU4VSwJLy8gPDAsMCw0LDA+OiBDb3N0IDMgdmV4dDIgPDAsMCwwLDA+LCA8NCwwLDUsMT4KKyAgMjg4ODQ1MDE1MFUsCS8vIDwwLDAsNCwxPjogQ29zdCAzIHZ6aXBsIDwwLDQsMSw1PiwgTEhTCisgIDMwMjE1NzAxNTBVLAkvLyA8MCwwLDQsMj46IENvc3QgMyB2dHJubCA8MCwyLDQsNj4sIExIUworICAzNjQxODI5NTE5VSwJLy8gPDAsMCw0LDM+OiBDb3N0IDQgdmV4dDEgPDMsMCwwLDQ+LCA8MywwLDAsND4KKyAgMzAyMTU3MDI1MlUsCS8vIDwwLDAsNCw0PjogQ29zdCAzIHZ0cm5sIDwwLDIsNCw2PiwgPDAsMiw0LDY+CisgIDE1NDM1MDcyNTRVLAkvLyA8MCwwLDQsNT46IENvc3QgMiB2ZXh0MiA8MCwwLDAsMD4sIFJIUworICAyNzUyODEwMjk0VSwJLy8gPDAsMCw0LDY+OiBDb3N0IDMgdnV6cGwgPDAsMiwwLDI+LCBSSFMKKyAgMzc4Njk5ODE1MlUsCS8vIDwwLDAsNCw3PjogQ29zdCA0IHZleHQzIDw0LDcsNSwwPiwgPDAsNCw3LDU+CisgIDE1NDM1MDc0OTdVLAkvLyA8MCwwLDQsdT46IENvc3QgMiB2ZXh0MiA8MCwwLDAsMD4sIFJIUworICAyNjg0MzU0OTcyVSwJLy8gPDAsMCw1LDA+OiBDb3N0IDMgdmV4dDMgPDAsMCwwLDA+LCA8MCw1LDAsNz4KKyAgMjYxNzI0OTQ4OFUsCS8vIDwwLDAsNSwxPjogQ29zdCAzIHZleHQyIDwwLDAsMCwwPiwgPDUsMSw3LDM+CisgIDM3NjU2MTcwNzBVLAkvLyA8MCwwLDUsMj46IENvc3QgNCB2ZXh0MyA8MSwyLDMsMD4sIDwwLDUsMiw3PgorICAzNjM1ODY1NzgwVSwJLy8gPDAsMCw1LDM+OiBDb3N0IDQgdmV4dDEgPDIsMCwwLDU+LCA8MywwLDQsNT4KKyAgMjYxNzI0OTczNFUsCS8vIDwwLDAsNSw0PjogQ29zdCAzIHZleHQyIDwwLDAsMCwwPiwgPDUsNCw3LDY+CisgIDI2MTcyNDk3OTZVLAkvLyA8MCwwLDUsNT46IENvc3QgMyB2ZXh0MiA8MCwwLDAsMD4sIDw1LDUsNSw1PgorICAyNzE4NzEyMjc0VSwJLy8gPDAsMCw1LDY+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8MCw1LDYsNz4KKyAgMjYxNzI0OTk2MFUsCS8vIDwwLDAsNSw3PjogQ29zdCAzIHZleHQyIDwwLDAsMCwwPiwgPDUsNyw1LDc+CisgIDI3MjAwMzkzOTZVLAkvLyA8MCwwLDUsdT46IENvc3QgMyB2ZXh0MyA8NSx1LDcsMD4sIDwwLDUsdSw3PgorICAyNjg0MzU1MDUzVSwJLy8gPDAsMCw2LDA+OiBDb3N0IDMgdmV4dDMgPDAsMCwwLDA+LCA8MCw2LDAsNz4KKyAgMzk2MzYwOTE5MFUsCS8vIDwwLDAsNiwxPjogQ29zdCA0IHZ6aXBsIDwwLDYsMiw3PiwgTEhTCisgIDI2MTcyNTAyOThVLAkvLyA8MCwwLDYsMj46IENvc3QgMyB2ZXh0MiA8MCwwLDAsMD4sIDw2LDIsNywzPgorICAzNzk2NDM1NDY0VSwJLy8gPDAsMCw2LDM+OiBDb3N0IDQgdmV4dDMgPDYsMyw3LDA+LCA8MCw2LDMsNz4KKyAgMzY1OTc2Mjk5OFUsCS8vIDwwLDAsNiw0PjogQ29zdCA0IHZleHQxIDw2LDAsMCw2PiwgUkhTCisgIDM2NTk3NjM4MTBVLAkvLyA8MCwwLDYsNT46IENvc3QgNCB2ZXh0MSA8NiwwLDAsNj4sIDw1LDYsNywwPgorICAyNjE3MjUwNjE2VSwJLy8gPDAsMCw2LDY+OiBDb3N0IDMgdmV4dDIgPDAsMCwwLDA+LCA8Niw2LDYsNj4KKyAgMjY1NzcyNzMwOVUsCS8vIDwwLDAsNiw3PjogQ29zdCAzIHZleHQyIDw2LDcsMCwwPiwgPDYsNywwLDA+CisgIDI2NTgzOTA5NDJVLAkvLyA8MCwwLDYsdT46IENvc3QgMyB2ZXh0MiA8Nix1LDAsMD4sIDw2LHUsMCwwPgorICAyNjU5MDU0NTc1VSwJLy8gPDAsMCw3LDA+OiBDb3N0IDMgdmV4dDIgPDcsMCwwLDA+LCA8NywwLDAsMD4KKyAgMzYzNTg4MDg1NFUsCS8vIDwwLDAsNywxPjogQ29zdCA0IHZleHQxIDwyLDAsMCw3PiwgPDEsMiwzLDA+CisgIDM2MzU4ODE0MDFVLAkvLyA8MCwwLDcsMj46IENvc3QgNCB2ZXh0MSA8MiwwLDAsNz4sIDwyLDAsMCw3PgorICAzNzM0Nzg3Mjk4VSwJLy8gPDAsMCw3LDM+OiBDb3N0IDQgdmV4dDIgPDcsMywwLDA+LCA8NywzLDAsMD4KKyAgMjYxNzI1MTE3NFUsCS8vIDwwLDAsNyw0PjogQ29zdCAzIHZleHQyIDwwLDAsMCwwPiwgPDcsNCw1LDY+CisgIDM2NTk3NzIwMDJVLAkvLyA8MCwwLDcsNT46IENvc3QgNCB2ZXh0MSA8NiwwLDAsNz4sIDw1LDYsNywwPgorICAzNjU5NzcyMTg5VSwJLy8gPDAsMCw3LDY+OiBDb3N0IDQgdmV4dDEgPDYsMCwwLDc+LCA8NiwwLDAsNz4KKyAgMjYxNzI1MTQzNlUsCS8vIDwwLDAsNyw3PjogQ29zdCAzIHZleHQyIDwwLDAsMCwwPiwgPDcsNyw3LDc+CisgIDI2NTkwNTQ1NzVVLAkvLyA8MCwwLDcsdT46IENvc3QgMyB2ZXh0MiA8NywwLDAsMD4sIDw3LDAsMCwwPgorICAxMzUwNTM0MTRVLAkvLyA8MCwwLHUsMD46IENvc3QgMSB2ZHVwMCBMSFMKKyAgMTgxNzQxOTg3OFUsCS8vIDwwLDAsdSwxPjogQ29zdCAyIHZ6aXBsIExIUywgTEhTCisgIDE5NDc0MzUxMTBVLAkvLyA8MCwwLHUsMj46IENvc3QgMiB2dHJubCBMSFMsIExIUworICAyNTY4MTIwNDY3VSwJLy8gPDAsMCx1LDM+OiBDb3N0IDMgdmV4dDEgPDMsMCwwLHU+LCA8MywwLDAsdT4KKyAgMTQ3NjQ2MzkyNlUsCS8vIDwwLDAsdSw0PjogQ29zdCAyIHZleHQxIDwwLDAsMCx1PiwgUkhTCisgIDE1NDM1MTAxNzBVLAkvLyA8MCwwLHUsNT46IENvc3QgMiB2ZXh0MiA8MCwwLDAsMD4sIFJIUworICAyNzUyODEzMjEwVSwJLy8gPDAsMCx1LDY+OiBDb3N0IDMgdnV6cGwgPDAsMiwwLDI+LCBSSFMKKyAgMjU5MjAxMTI1NVUsCS8vIDwwLDAsdSw3PjogQ29zdCAzIHZleHQxIDw3LDAsMCx1PiwgPDcsMCwwLHU+CisgIDEzNTA1MzQxNFUsCS8vIDwwLDAsdSx1PjogQ29zdCAxIHZkdXAwIExIUworICAyNjE4NTgxMDAyVSwJLy8gPDAsMSwwLDA+OiBDb3N0IDMgdmV4dDIgPDAsMiwwLDE+LCA8MCwwLDEsMT4KKyAgMTU1NzQ0Njc1OFUsCS8vIDwwLDEsMCwxPjogQ29zdCAyIHZleHQyIDwyLDMsMCwxPiwgTEhTCisgIDI2MTg1ODExNTVVLAkvLyA8MCwxLDAsMj46IENvc3QgMyB2ZXh0MiA8MCwyLDAsMT4sIDwwLDIsMCwxPgorICAyNjkwNTQ4NDY4VSwJLy8gPDAsMSwwLDM+OiBDb3N0IDMgdmV4dDMgPDEsMCwzLDA+LCA8MSwwLDMsMD4KKyAgMjYyNjU0Mzk1NFUsCS8vIDwwLDEsMCw0PjogQ29zdCAzIHZleHQyIDwxLDUsMCwxPiwgPDAsNCwxLDU+CisgIDQwOTQ5ODUyMTZVLAkvLyA8MCwxLDAsNT46IENvc3QgNCB2dHJubCA8MCwyLDAsMj4sIDwxLDMsNSw3PgorICAyNTkyMDE5Mjc4VSwJLy8gPDAsMSwwLDY+OiBDb3N0IDMgdmV4dDEgPDcsMCwxLDA+LCA8Niw3LDAsMT4KKyAgMjU5MjAxOTQ0OFUsCS8vIDwwLDEsMCw3PjogQ29zdCAzIHZleHQxIDw3LDAsMSwwPiwgPDcsMCwxLDA+CisgIDE1NTc0NDczMjVVLAkvLyA8MCwxLDAsdT46IENvc3QgMiB2ZXh0MiA8MiwzLDAsMT4sIExIUworICAxNDc2NDc2OTM4VSwJLy8gPDAsMSwxLDA+OiBDb3N0IDIgdmV4dDEgPDAsMCwxLDE+LCA8MCwwLDEsMT4KKyAgMjg4NjUxNzU1NlUsCS8vIDwwLDEsMSwxPjogQ29zdCAzIHZ6aXBsIExIUywgPDEsMSwxLDE+CisgIDI4ODY1MTc2NTRVLAkvLyA8MCwxLDEsMj46IENvc3QgMyB2emlwbCBMSFMsIDwxLDIsMywwPgorICAyODg2NTE3NzIwVSwJLy8gPDAsMSwxLDM+OiBDb3N0IDMgdnppcGwgTEhTLCA8MSwzLDEsMz4KKyAgMTQ3NjQ4MDMxMFUsCS8vIDwwLDEsMSw0PjogQ29zdCAyIHZleHQxIDwwLDAsMSwxPiwgUkhTCisgIDI4ODY1NTg4NjRVLAkvLyA8MCwxLDEsNT46IENvc3QgMyB2emlwbCBMSFMsIDwxLDUsMyw3PgorICAyNTUwMjIzMzU0VSwJLy8gPDAsMSwxLDY+OiBDb3N0IDMgdmV4dDEgPDAsMCwxLDE+LCA8NiwyLDcsMz4KKyAgMjU1MDIyMzg1NlUsCS8vIDwwLDEsMSw3PjogQ29zdCAzIHZleHQxIDwwLDAsMSwxPiwgPDcsMCwwLDE+CisgIDE0NzY0ODI4NjJVLAkvLyA8MCwxLDEsdT46IENvc3QgMiB2ZXh0MSA8MCwwLDEsMT4sIExIUworICAxNDk0NDAxMTI2VSwJLy8gPDAsMSwyLDA+OiBDb3N0IDIgdmV4dDEgPDMsMCwxLDI+LCBMSFMKKyAgMzAyMDczNTI4NFUsCS8vIDwwLDEsMiwxPjogQ29zdCAzIHZ0cm5sIExIUywgPDEsMSwxLDE+CisgIDI1NjIxNzIzNDlVLAkvLyA8MCwxLDIsMj46IENvc3QgMyB2ZXh0MSA8MiwwLDEsMj4sIDwyLDAsMSwyPgorICA4MzU1ODRVLAkvLyA8MCwxLDIsMz46IENvc3QgMCBjb3B5IExIUworICAxNDk0NDA0NDA2VSwJLy8gPDAsMSwyLDQ+OiBDb3N0IDIgdmV4dDEgPDMsMCwxLDI+LCBSSFMKKyAgMzAyMDczNTQ4OFUsCS8vIDwwLDEsMiw1PjogQ29zdCAzIHZ0cm5sIExIUywgPDEsMyw1LDc+CisgIDI2MzExOTA0NThVLAkvLyA8MCwxLDIsNj46IENvc3QgMyB2ZXh0MiA8MiwzLDAsMT4sIDwyLDYsMyw3PgorICAxNTE4Mjk0MDEwVSwJLy8gPDAsMSwyLDc+OiBDb3N0IDIgdmV4dDEgPDcsMCwxLDI+LCA8NywwLDEsMj4KKyAgODM1NTg0VSwJLy8gPDAsMSwyLHU+OiBDb3N0IDAgY29weSBMSFMKKyAgMjY5MjMxODE1NlUsCS8vIDwwLDEsMywwPjogQ29zdCAzIHZleHQzIDwxLDMsMCwwPiwgPDEsMywwLDA+CisgIDI2OTE4NzU4MDBVLAkvLyA8MCwxLDMsMT46IENvc3QgMyB2ZXh0MyA8MSwyLDMsMD4sIDwxLDMsMSwzPgorICAyNjkxODc1ODA2VSwJLy8gPDAsMSwzLDI+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDA+LCA8MSwzLDIsMD4KKyAgMjY5MjUzOTM2N1UsCS8vIDwwLDEsMywzPjogQ29zdCAzIHZleHQzIDwxLDMsMywwPiwgPDEsMywzLDA+CisgIDI1NjIxODI0NTRVLAkvLyA8MCwxLDMsND46IENvc3QgMyB2ZXh0MSA8MiwwLDEsMz4sIFJIUworICAyNjkxODc1ODQwVSwJLy8gPDAsMSwzLDU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDA+LCA8MSwzLDUsNz4KKyAgMjY5Mjc2MDU3OFUsCS8vIDwwLDEsMyw2PjogQ29zdCAzIHZleHQzIDwxLDMsNiwwPiwgPDEsMyw2LDA+CisgIDI2Mzk4MTc0MTFVLAkvLyA8MCwxLDMsNz46IENvc3QgMyB2ZXh0MiA8Myw3LDAsMT4sIDwzLDcsMCwxPgorICAyNjkxODc1ODYzVSwJLy8gPDAsMSwzLHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDA+LCA8MSwzLHUsMz4KKyAgMjU2ODE1OTMzNFUsCS8vIDwwLDEsNCwwPjogQ29zdCAzIHZleHQxIDwzLDAsMSw0PiwgTEhTCisgIDQwOTUzMTI2OTJVLAkvLyA8MCwxLDQsMT46IENvc3QgNCB2dHJubCA8MCwyLDQsNj4sIDwxLDEsMSwxPgorICAyNTY4MTYwOTM0VSwJLy8gPDAsMSw0LDI+OiBDb3N0IDMgdmV4dDEgPDMsMCwxLDQ+LCA8MiwzLDAsMT4KKyAgMjU2ODE2MTQzMlUsCS8vIDwwLDEsNCwzPjogQ29zdCAzIHZleHQxIDwzLDAsMSw0PiwgPDMsMCwxLDQ+CisgIDI1NjgxNjI2MTRVLAkvLyA8MCwxLDQsND46IENvc3QgMyB2ZXh0MSA8MywwLDEsND4sIFJIUworICAxNTU3NDUwMDM4VSwJLy8gPDAsMSw0LDU+OiBDb3N0IDIgdmV4dDIgPDIsMywwLDE+LCBSSFMKKyAgMjc1NDIzNTcwMlUsCS8vIDwwLDEsNCw2PjogQ29zdCAzIHZ1enBsIDwwLDQsMSw1PiwgUkhTCisgIDI1OTIwNTIyMjBVLAkvLyA8MCwxLDQsNz46IENvc3QgMyB2ZXh0MSA8NywwLDEsND4sIDw3LDAsMSw0PgorICAxNTU3NDUwMjgxVSwJLy8gPDAsMSw0LHU+OiBDb3N0IDIgdmV4dDIgPDIsMywwLDE+LCBSSFMKKyAgMzc2NTYxNzc3NVUsCS8vIDwwLDEsNSwwPjogQ29zdCA0IHZleHQzIDwxLDIsMywwPiwgPDEsNSwwLDE+CisgIDI2NDc3ODEwMDdVLAkvLyA8MCwxLDUsMT46IENvc3QgMyB2ZXh0MiA8NSwxLDAsMT4sIDw1LDEsMCwxPgorICAzNzA0OTM0MTM4VSwJLy8gPDAsMSw1LDI+OiBDb3N0IDQgdmV4dDIgPDIsMywwLDE+LCA8NSwyLDMsMD4KKyAgMjY5MTg3NTk4NFUsCS8vIDwwLDEsNSwzPjogQ29zdCAzIHZleHQzIDwxLDIsMywwPiwgPDEsNSwzLDc+CisgIDI2NTc3MzQ1OThVLAkvLyA8MCwxLDUsND46IENvc3QgMyB2ZXh0MiA8Niw3LDAsMT4sIDw1LDQsNyw2PgorICAyNjUwNDM1NTM5VSwJLy8gPDAsMSw1LDU+OiBDb3N0IDMgdmV4dDIgPDUsNSwwLDE+LCA8NSw1LDAsMT4KKyAgMjY1MTA5OTE3MlUsCS8vIDwwLDEsNSw2PjogQ29zdCAzIHZleHQyIDw1LDYsMCwxPiwgPDUsNiwwLDE+CisgIDI2NTE3NjI4MDVVLAkvLyA8MCwxLDUsNz46IENvc3QgMyB2ZXh0MiA8NSw3LDAsMT4sIDw1LDcsMCwxPgorICAyNjkxODc2MDI5VSwJLy8gPDAsMSw1LHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDA+LCA8MSw1LHUsNz4KKyAgMjU5MjA2MzU5MFUsCS8vIDwwLDEsNiwwPjogQ29zdCAzIHZleHQxIDw3LDAsMSw2PiwgTEhTCisgIDM3NjU2MTc4NzFVLAkvLyA8MCwxLDYsMT46IENvc3QgNCB2ZXh0MyA8MSwyLDMsMD4sIDwxLDYsMSw3PgorICAyNjU0NDE3MzM3VSwJLy8gPDAsMSw2LDI+OiBDb3N0IDMgdmV4dDIgPDYsMiwwLDE+LCA8NiwyLDAsMT4KKyAgMzc2NTYxNzg4OVUsCS8vIDwwLDEsNiwzPjogQ29zdCA0IHZleHQzIDwxLDIsMywwPiwgPDEsNiwzLDc+CisgIDI1OTIwNjY4NzBVLAkvLyA8MCwxLDYsND46IENvc3QgMyB2ZXh0MSA8NywwLDEsNj4sIFJIUworICAzNzY1NjE3OTA3VSwJLy8gPDAsMSw2LDU+OiBDb3N0IDQgdmV4dDMgPDEsMiwzLDA+LCA8MSw2LDUsNz4KKyAgMjY1NzA3MTg2OVUsCS8vIDwwLDEsNiw2PjogQ29zdCAzIHZleHQyIDw2LDYsMCwxPiwgPDYsNiwwLDE+CisgIDE1ODM5OTM2NzhVLAkvLyA8MCwxLDYsNz46IENvc3QgMiB2ZXh0MiA8Niw3LDAsMT4sIDw2LDcsMCwxPgorICAxNTg0NjU3MzExVSwJLy8gPDAsMSw2LHU+OiBDb3N0IDIgdmV4dDIgPDYsdSwwLDE+LCA8Nix1LDAsMT4KKyAgMjY1NzczNTY3MlUsCS8vIDwwLDEsNywwPjogQ29zdCAzIHZleHQyIDw2LDcsMCwxPiwgPDcsMCwxLDA+CisgIDI2NTc3MzU4MDhVLAkvLyA8MCwxLDcsMT46IENvc3QgMyB2ZXh0MiA8Niw3LDAsMT4sIDw3LDEsNywxPgorICAyNjMxMTkzNzcyVSwJLy8gPDAsMSw3LDI+OiBDb3N0IDMgdmV4dDIgPDIsMywwLDE+LCA8NywyLDMsMD4KKyAgMjY2MTA1MzY2N1UsCS8vIDwwLDEsNywzPjogQ29zdCAzIHZleHQyIDw3LDMsMCwxPiwgPDcsMywwLDE+CisgIDI2NTc3MzYwMzhVLAkvLyA8MCwxLDcsND46IENvc3QgMyB2ZXh0MiA8Niw3LDAsMT4sIDw3LDQsNSw2PgorICAzNzIxNTI0NjIxVSwJLy8gPDAsMSw3LDU+OiBDb3N0IDQgdmV4dDIgPDUsMSwwLDE+LCA8Nyw1LDEsMD4KKyAgMjY1NzczNjE1OFUsCS8vIDwwLDEsNyw2PjogQ29zdCAzIHZleHQyIDw2LDcsMCwxPiwgPDcsNiwxLDA+CisgIDI2NTc3MzYzMDBVLAkvLyA8MCwxLDcsNz46IENvc3QgMyB2ZXh0MiA8Niw3LDAsMT4sIDw3LDcsNyw3PgorICAyNjU3NzM2MzIyVSwJLy8gPDAsMSw3LHU+OiBDb3N0IDMgdmV4dDIgPDYsNywwLDE+LCA8Nyx1LDEsMj4KKyAgMTQ5NDQ1MDI3OFUsCS8vIDwwLDEsdSwwPjogQ29zdCAyIHZleHQxIDwzLDAsMSx1PiwgTEhTCisgIDE1NTc0NTI1OTBVLAkvLyA8MCwxLHUsMT46IENvc3QgMiB2ZXh0MiA8MiwzLDAsMT4sIExIUworICAyNzU0MjM4MjU0VSwJLy8gPDAsMSx1LDI+OiBDb3N0IDMgdnV6cGwgPDAsNCwxLDU+LCBMSFMKKyAgODM1NTg0VSwJLy8gPDAsMSx1LDM+OiBDb3N0IDAgY29weSBMSFMKKyAgMTQ5NDQ1MzU1OFUsCS8vIDwwLDEsdSw0PjogQ29zdCAyIHZleHQxIDwzLDAsMSx1PiwgUkhTCisgIDE1NTc0NTI5NTRVLAkvLyA8MCwxLHUsNT46IENvc3QgMiB2ZXh0MiA8MiwzLDAsMT4sIFJIUworICAyNzU0MjM4NjE4VSwJLy8gPDAsMSx1LDY+OiBDb3N0IDMgdnV6cGwgPDAsNCwxLDU+LCBSSFMKKyAgMTUxODM0MzE2OFUsCS8vIDwwLDEsdSw3PjogQ29zdCAyIHZleHQxIDw3LDAsMSx1PiwgPDcsMCwxLHU+CisgIDgzNTU4NFUsCS8vIDwwLDEsdSx1PjogQ29zdCAwIGNvcHkgTEhTCisgIDI3NTIyOTkwMDhVLAkvLyA8MCwyLDAsMD46IENvc3QgMyB2dXpwbCBMSFMsIDwwLDAsMCwwPgorICAxNTQ0ODQ3NDYyVSwJLy8gPDAsMiwwLDE+OiBDb3N0IDIgdmV4dDIgPDAsMiwwLDI+LCBMSFMKKyAgMTY3ODU1NzI4NlUsCS8vIDwwLDIsMCwyPjogQ29zdCAyIHZ1enBsIExIUywgTEhTCisgIDI2OTY1MjExNjVVLAkvLyA8MCwyLDAsMz46IENvc3QgMyB2ZXh0MyA8MiwwLDMsMD4sIDwyLDAsMywwPgorICAyNzUyMzQwMTcyVSwJLy8gPDAsMiwwLDQ+OiBDb3N0IDMgdnV6cGwgTEhTLCA8MCwyLDQsNj4KKyAgMjY5MTg3NjMyNlUsCS8vIDwwLDIsMCw1PjogQ29zdCAzIHZleHQzIDwxLDIsMywwPiwgPDIsMCw1LDc+CisgIDI2MTg1ODk2OTVVLAkvLyA8MCwyLDAsNj46IENvc3QgMyB2ZXh0MiA8MCwyLDAsMj4sIDwwLDYsMiw3PgorICAyNTkyMDkzMTg1VSwJLy8gPDAsMiwwLDc+OiBDb3N0IDMgdmV4dDEgPDcsMCwyLDA+LCA8NywwLDIsMD4KKyAgMTY3ODU1NzM0MFUsCS8vIDwwLDIsMCx1PjogQ29zdCAyIHZ1enBsIExIUywgTEhTCisgIDI2MTg1ODk5NDJVLAkvLyA8MCwyLDEsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDAsMj4sIDwxLDAsMywyPgorICAyNzUyMjk5ODI4VSwJLy8gPDAsMiwxLDE+OiBDb3N0IDMgdnV6cGwgTEhTLCA8MSwxLDEsMT4KKyAgMjg4NjUxODM3NlUsCS8vIDwwLDIsMSwyPjogQ29zdCAzIHZ6aXBsIExIUywgPDIsMiwyLDI+CisgIDI3NTIyOTk3NjZVLAkvLyA8MCwyLDEsMz46IENvc3QgMyB2dXpwbCBMSFMsIDwxLDAsMywyPgorICAyNTUwMjk1ODYyVSwJLy8gPDAsMiwxLDQ+OiBDb3N0IDMgdmV4dDEgPDAsMCwyLDE+LCBSSFMKKyAgMjc1MjM0MDk5MlUsCS8vIDwwLDIsMSw1PjogQ29zdCAzIHZ1enBsIExIUywgPDEsMyw1LDc+CisgIDI4ODY1NTk2NzRVLAkvLyA8MCwyLDEsNj46IENvc3QgMyB2emlwbCBMSFMsIDwyLDYsMyw3PgorICAzOTM0MjA4MTA2VSwJLy8gPDAsMiwxLDc+OiBDb3N0IDQgdnV6cHIgPDcsMCwxLDI+LCA8MCwxLDIsNz4KKyAgMjc1MjM0MDc3MVUsCS8vIDwwLDIsMSx1PjogQ29zdCAzIHZ1enBsIExIUywgPDEsMCx1LDI+CisgIDE0NzY1NTg4NjhVLAkvLyA8MCwyLDIsMD46IENvc3QgMiB2ZXh0MSA8MCwwLDIsMj4sIDwwLDAsMiwyPgorICAyMjI2NjI4MDI5VSwJLy8gPDAsMiwyLDE+OiBDb3N0IDMgdnJldiA8MiwwLDEsMj4KKyAgMjc1MjMwMDY0OFUsCS8vIDwwLDIsMiwyPjogQ29zdCAzIHZ1enBsIExIUywgPDIsMiwyLDI+CisgIDMwMjA3MzYxMTRVLAkvLyA8MCwyLDIsMz46IENvc3QgMyB2dHJubCBMSFMsIDwyLDIsMywzPgorICAxNDc2NTYyMjMwVSwJLy8gPDAsMiwyLDQ+OiBDb3N0IDIgdmV4dDEgPDAsMCwyLDI+LCBSSFMKKyAgMjU1MDMwNDQ2NFUsCS8vIDwwLDIsMiw1PjogQ29zdCAzIHZleHQxIDwwLDAsMiwyPiwgPDUsMSw3LDM+CisgIDI2MTg1OTExNjJVLAkvLyA8MCwyLDIsNj46IENvc3QgMyB2ZXh0MiA8MCwyLDAsMj4sIDwyLDYsMyw3PgorICAyNTUwMzA1Nzc3VSwJLy8gPDAsMiwyLDc+OiBDb3N0IDMgdmV4dDEgPDAsMCwyLDI+LCA8NywwLDAsMj4KKyAgMTQ3NjU2NDc4MlUsCS8vIDwwLDIsMix1PjogQ29zdCAyIHZleHQxIDwwLDAsMiwyPiwgTEhTCisgIDI2MTg1OTEzODJVLAkvLyA8MCwyLDMsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDAsMj4sIDwzLDAsMSwyPgorICAyNzUyMzAxMjA2VSwJLy8gPDAsMiwzLDE+OiBDb3N0IDMgdnV6cGwgTEhTLCA8MywwLDEsMj4KKyAgMzgyNjA0MzEyMVUsCS8vIDwwLDIsMywyPjogQ29zdCA0IHZ1enBsIExIUywgPDMsMSwyLDM+CisgIDI3NTIzMDE0NjhVLAkvLyA8MCwyLDMsMz46IENvc3QgMyB2dXpwbCBMSFMsIDwzLDMsMywzPgorICAyNjE4NTkxNzQ2VSwJLy8gPDAsMiwzLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMiwwLDI+LCA8Myw0LDUsNj4KKyAgMjc1MjMwMTU3MFUsCS8vIDwwLDIsMyw1PjogQ29zdCAzIHZ1enBsIExIUywgPDMsNCw1LDY+CisgIDM4MzA2ODgxMDJVLAkvLyA8MCwyLDMsNj46IENvc3QgNCB2dXpwbCBMSFMsIDwzLDIsNiwzPgorICAyNjk4ODA3MDEyVSwJLy8gPDAsMiwzLDc+OiBDb3N0IDMgdmV4dDMgPDIsMyw3LDA+LCA8MiwzLDcsMD4KKyAgMjc1MjMwMTI2OVUsCS8vIDwwLDIsMyx1PjogQ29zdCAzIHZ1enBsIExIUywgPDMsMCx1LDI+CisgIDI1NjIyNjEwOTRVLAkvLyA8MCwyLDQsMD46IENvc3QgMyB2ZXh0MSA8MiwwLDIsND4sIExIUworICA0MDk1MzEzODI4VSwJLy8gPDAsMiw0LDE+OiBDb3N0IDQgdnRybmwgPDAsMiw0LDY+LCA8Miw2LDEsMz4KKyAgMjIyNjcxODE1MlUsCS8vIDwwLDIsNCwyPjogQ29zdCAzIHZyZXYgPDIsMCwyLDQ+CisgIDI1NjgyMzUxNjlVLAkvLyA8MCwyLDQsMz46IENvc3QgMyB2ZXh0MSA8MywwLDIsND4sIDwzLDAsMiw0PgorICAyNTYyMjY0Mzc0VSwJLy8gPDAsMiw0LDQ+OiBDb3N0IDMgdmV4dDEgPDIsMCwyLDQ+LCBSSFMKKyAgMTU0NDg1MDc0MlUsCS8vIDwwLDIsNCw1PjogQ29zdCAyIHZleHQyIDwwLDIsMCwyPiwgUkhTCisgIDE2Nzg1NjA1NjZVLAkvLyA8MCwyLDQsNj46IENvc3QgMiB2dXpwbCBMSFMsIFJIUworICAyNTkyMTI1OTU3VSwJLy8gPDAsMiw0LDc+OiBDb3N0IDMgdmV4dDEgPDcsMCwyLDQ+LCA8NywwLDIsND4KKyAgMTY3ODU2MDU4NFUsCS8vIDwwLDIsNCx1PjogQ29zdCAyIHZ1enBsIExIUywgUkhTCisgIDI2OTE4NzY2ODZVLAkvLyA8MCwyLDUsMD46IENvc3QgMyB2ZXh0MyA8MSwyLDMsMD4sIDwyLDUsMCw3PgorICAyNjE4NTkyOTc2VSwJLy8gPDAsMiw1LDE+OiBDb3N0IDMgdmV4dDIgPDAsMiwwLDI+LCA8NSwxLDcsMz4KKyAgMzc2NTYxODUyOFUsCS8vIDwwLDIsNSwyPjogQ29zdCA0IHZleHQzIDwxLDIsMywwPiwgPDIsNSwyLDc+CisgIDM3NjU2MTg1MzZVLAkvLyA8MCwyLDUsMz46IENvc3QgNCB2ZXh0MyA8MSwyLDMsMD4sIDwyLDUsMyw2PgorICAyNjE4NTkzMjIyVSwJLy8gPDAsMiw1LDQ+OiBDb3N0IDMgdmV4dDIgPDAsMiwwLDI+LCA8NSw0LDcsNj4KKyAgMjc1MjMwMzEwOFUsCS8vIDwwLDIsNSw1PjogQ29zdCAzIHZ1enBsIExIUywgPDUsNSw1LDU+CisgIDI2MTg1OTMzNzhVLAkvLyA8MCwyLDUsNj46IENvc3QgMyB2ZXh0MiA8MCwyLDAsMj4sIDw1LDYsNywwPgorICAyODI0Nzg1MjA2VSwJLy8gPDAsMiw1LDc+OiBDb3N0IDMgdnV6cHIgPDEsMCwzLDI+LCBSSFMKKyAgMjgyNDc4NTIwN1UsCS8vIDwwLDIsNSx1PjogQ29zdCAzIHZ1enByIDwxLDAsMywyPiwgUkhTCisgIDI3NTIzMDM5NTBVLAkvLyA8MCwyLDYsMD46IENvc3QgMyB2dXpwbCBMSFMsIDw2LDcsMCwxPgorICAzODMwNjkwMDgxVSwJLy8gPDAsMiw2LDE+OiBDb3N0IDQgdnV6cGwgTEhTLCA8NiwwLDEsMj4KKyAgMjYxODU5Mzc4NlUsCS8vIDwwLDIsNiwyPjogQ29zdCAzIHZleHQyIDwwLDIsMCwyPiwgPDYsMiw3LDM+CisgIDI2OTE4NzY3OTRVLAkvLyA8MCwyLDYsMz46IENvc3QgMyB2ZXh0MyA8MSwyLDMsMD4sIDwyLDYsMyw3PgorICAyNzUyMzAzOTkwVSwJLy8gPDAsMiw2LDQ+OiBDb3N0IDMgdnV6cGwgTEhTLCA8Niw3LDQsNT4KKyAgMzgzMDY5MDQ0NVUsCS8vIDwwLDIsNiw1PjogQ29zdCA0IHZ1enBsIExIUywgPDYsNCw1LDY+CisgIDI3NTIzMDM5MjhVLAkvLyA8MCwyLDYsNj46IENvc3QgMyB2dXpwbCBMSFMsIDw2LDYsNiw2PgorICAyNjU3NzQzNjk1VSwJLy8gPDAsMiw2LDc+OiBDb3N0IDMgdmV4dDIgPDYsNywwLDI+LCA8Niw3LDAsMj4KKyAgMjY5MTg3NjgzOVUsCS8vIDwwLDIsNix1PjogQ29zdCAzIHZleHQzIDwxLDIsMywwPiwgPDIsNix1LDc+CisgIDI2NTkwNzA5NjFVLAkvLyA8MCwyLDcsMD46IENvc3QgMyB2ZXh0MiA8NywwLDAsMj4sIDw3LDAsMCwyPgorICAyNjU5NzM0NTk0VSwJLy8gPDAsMiw3LDE+OiBDb3N0IDMgdmV4dDIgPDcsMSwwLDI+LCA8NywxLDAsMj4KKyAgMzczNDE0MDA1MVUsCS8vIDwwLDIsNywyPjogQ29zdCA0IHZleHQyIDw3LDIsMCwyPiwgPDcsMiwwLDI+CisgIDI3MDExNjY1OTZVLAkvLyA8MCwyLDcsMz46IENvc3QgMyB2ZXh0MyA8Miw3LDMsMD4sIDwyLDcsMywwPgorICAyNjYyMzg5MDk0VSwJLy8gPDAsMiw3LDQ+OiBDb3N0IDMgdmV4dDIgPDcsNSwwLDI+LCA8Nyw0LDUsNj4KKyAgMjY2MjM4OTEyNlUsCS8vIDwwLDIsNyw1PjogQ29zdCAzIHZleHQyIDw3LDUsMCwyPiwgPDcsNSwwLDI+CisgIDM3MzY3OTQ1ODNVLAkvLyA8MCwyLDcsNj46IENvc3QgNCB2ZXh0MiA8Nyw2LDAsMj4sIDw3LDYsMCwyPgorICAyNzUyMzA0NzQ4VSwJLy8gPDAsMiw3LDc+OiBDb3N0IDMgdnV6cGwgTEhTLCA8Nyw3LDcsNz4KKyAgMjY1OTA3MDk2MVUsCS8vIDwwLDIsNyx1PjogQ29zdCAzIHZleHQyIDw3LDAsMCwyPiwgPDcsMCwwLDI+CisgIDE0NzY2MDgwMjZVLAkvLyA8MCwyLHUsMD46IENvc3QgMiB2ZXh0MSA8MCwwLDIsdT4sIDwwLDAsMix1PgorICAxNTQ0ODUzMjk0VSwJLy8gPDAsMix1LDE+OiBDb3N0IDIgdmV4dDIgPDAsMiwwLDI+LCBMSFMKKyAgMTY3ODU2MzExOFUsCS8vIDwwLDIsdSwyPjogQ29zdCAyIHZ1enBsIExIUywgTEhTCisgIDMwMjExNzg0ODJVLAkvLyA8MCwyLHUsMz46IENvc3QgMyB2dHJubCBMSFMsIDwyLDIsMywzPgorICAxNDc2NjExMzgyVSwJLy8gPDAsMix1LDQ+OiBDb3N0IDIgdmV4dDEgPDAsMCwyLHU+LCBSSFMKKyAgMTU0NDg1MzY1OFUsCS8vIDwwLDIsdSw1PjogQ29zdCAyIHZleHQyIDwwLDIsMCwyPiwgUkhTCisgIDE2Nzg1NjM0ODJVLAkvLyA8MCwyLHUsNj46IENvc3QgMiB2dXpwbCBMSFMsIFJIUworICAyODI0Nzg1NDQ5VSwJLy8gPDAsMix1LDc+OiBDb3N0IDMgdnV6cHIgPDEsMCwzLDI+LCBSSFMKKyAgMTY3ODU2MzE3MlUsCS8vIDwwLDIsdSx1PjogQ29zdCAyIHZ1enBsIExIUywgTEhTCisgIDI1NTYzMjk5ODRVLAkvLyA8MCwzLDAsMD46IENvc3QgMyB2ZXh0MSA8MSwwLDMsMD4sIDwwLDAsMCwwPgorICAyNjg2NDIxMTQyVSwJLy8gPDAsMywwLDE+OiBDb3N0IDMgdmV4dDMgPDAsMywxLDA+LCA8MywwLDEsMj4KKyAgMjU2MjMwMzQzN1UsCS8vIDwwLDMsMCwyPjogQ29zdCAzIHZleHQxIDwyLDAsMywwPiwgPDIsMCwzLDA+CisgIDQwOTQ5ODY2NTJVLAkvLyA8MCwzLDAsMz46IENvc3QgNCB2dHJubCA8MCwyLDAsMj4sIDwzLDMsMywzPgorICAyNTU2MzMzMzY2VSwJLy8gPDAsMywwLDQ+OiBDb3N0IDMgdmV4dDEgPDEsMCwzLDA+LCBSSFMKKyAgNDA5NDk4Njc1NFUsCS8vIDwwLDMsMCw1PjogQ29zdCA0IHZ0cm5sIDwwLDIsMCwyPiwgPDMsNCw1LDY+CisgIDM3OTg3OTY0ODhVLAkvLyA8MCwzLDAsNj46IENvc3QgNCB2ZXh0MyA8Niw3LDMsMD4sIDwzLDAsNiw3PgorICAzNzc2NTMwNjM0VSwJLy8gPDAsMywwLDc+OiBDb3N0IDQgdmV4dDMgPDMsMCw3LDA+LCA8MywwLDcsMD4KKyAgMjU1NjMzNTkxOFUsCS8vIDwwLDMsMCx1PjogQ29zdCAzIHZleHQxIDwxLDAsMywwPiwgTEhTCisgIDI4ODY1MTg5MzRVLAkvLyA8MCwzLDEsMD46IENvc3QgMyB2emlwbCBMSFMsIDwzLDAsMSwyPgorICAyNTU2MzM4OTMzVSwJLy8gPDAsMywxLDE+OiBDb3N0IDMgdmV4dDEgPDEsMCwzLDE+LCA8MSwwLDMsMT4KKyAgMjY5MTg3NzEwNVUsCS8vIDwwLDMsMSwyPjogQ29zdCAzIHZleHQzIDwxLDIsMywwPiwgPDMsMSwyLDM+CisgIDI4ODY1MTkxOTZVLAkvLyA8MCwzLDEsMz46IENvc3QgMyB2emlwbCBMSFMsIDwzLDMsMywzPgorICAyODg2NTE5Mjk4VSwJLy8gPDAsMywxLDQ+OiBDb3N0IDMgdnppcGwgTEhTLCA8Myw0LDUsNj4KKyAgNDA5NTc0MDQxOFUsCS8vIDwwLDMsMSw1PjogQ29zdCA0IHZ0cm5sIDwwLDMsMSw0PiwgPDMsNCw1LDY+CisgIDM2NTk5NDQyNDJVLAkvLyA8MCwzLDEsNj46IENvc3QgNCB2ZXh0MSA8NiwwLDMsMT4sIDw2LDAsMywxPgorICAzNzY5NjAwMjg2VSwJLy8gPDAsMywxLDc+OiBDb3N0IDQgdmV4dDMgPDEsdSwzLDA+LCA8MywxLDcsMz4KKyAgMjg4NjUxOTU4MlUsCS8vIDwwLDMsMSx1PjogQ29zdCAzIHZ6aXBsIExIUywgPDMsdSwxLDI+CisgIDE0ODI2MDQ2NDZVLAkvLyA8MCwzLDIsMD46IENvc3QgMiB2ZXh0MSA8MSwwLDMsMj4sIExIUworICAxNDgyNjA1MzAyVSwJLy8gPDAsMywyLDE+OiBDb3N0IDIgdmV4dDEgPDEsMCwzLDI+LCA8MSwwLDMsMj4KKyAgMjU1NjM0ODAwOFUsCS8vIDwwLDMsMiwyPjogQ29zdCAzIHZleHQxIDwxLDAsMywyPiwgPDIsMiwyLDI+CisgIDMwMjA3MzY5MjRVLAkvLyA8MCwzLDIsMz46IENvc3QgMyB2dHJubCBMSFMsIDwzLDMsMywzPgorICAxNDgyNjA3OTI2VSwJLy8gPDAsMywyLDQ+OiBDb3N0IDIgdmV4dDEgPDEsMCwzLDI+LCBSSFMKKyAgMzAyMDczNzAyNlUsCS8vIDwwLDMsMiw1PjogQ29zdCAzIHZ0cm5sIExIUywgPDMsNCw1LDY+CisgIDI1OTgxNTQ3NDZVLAkvLyA8MCwzLDIsNj46IENvc3QgMyB2ZXh0MSA8dSwwLDMsMj4sIDw2LDIsNywzPgorICAyNTk4MTU1MjU4VSwJLy8gPDAsMywyLDc+OiBDb3N0IDMgdmV4dDEgPHUsMCwzLDI+LCA8NywwLDEsMj4KKyAgMTQ4MjYxMDQ3OFUsCS8vIDwwLDMsMix1PjogQ29zdCAyIHZleHQxIDwxLDAsMywyPiwgTEhTCisgIDM2OTIzNDEzOThVLAkvLyA8MCwzLDMsMD46IENvc3QgNCB2ZXh0MiA8MCwyLDAsMz4sIDwzLDAsMSwyPgorICAyNjM1ODUxOTk5VSwJLy8gPDAsMywzLDE+OiBDb3N0IDMgdmV4dDIgPDMsMSwwLDM+LCA8MywxLDAsMz4KKyAgMzYzNjA2OTg0MFUsCS8vIDwwLDMsMywyPjogQ29zdCA0IHZleHQxIDwyLDAsMywzPiwgPDIsMCwzLDM+CisgIDI2OTE4NzcyNzZVLAkvLyA8MCwzLDMsMz46IENvc3QgMyB2ZXh0MyA8MSwyLDMsMD4sIDwzLDMsMywzPgorICAzOTYxNTIyNjkwVSwJLy8gPDAsMywzLDQ+OiBDb3N0IDQgdnppcGwgPDAsMywxLDQ+LCA8Myw0LDUsNj4KKyAgMzgyNjc5NzA1OFUsCS8vIDwwLDMsMyw1PjogQ29zdCA0IHZ1enBsIDwwLDIsMyw1PiwgPDMsNCw1LDY+CisgIDM3MDM2MjIyODJVLAkvLyA8MCwzLDMsNj46IENvc3QgNCB2ZXh0MiA8MiwxLDAsMz4sIDwzLDYsMiw3PgorICAzNzY5NjAwNDUyVSwJLy8gPDAsMywzLDc+OiBDb3N0IDQgdmV4dDMgPDEsdSwzLDA+LCA8MywzLDcsNz4KKyAgMjY0MDQ5NzQzMFUsCS8vIDwwLDMsMyx1PjogQ29zdCAzIHZleHQyIDwzLHUsMCwzPiwgPDMsdSwwLDM+CisgIDM5NjIxOTQwNzBVLAkvLyA8MCwzLDQsMD46IENvc3QgNCB2emlwbCA8MCw0LDEsNT4sIDwzLDAsMSwyPgorICAyMjMyNjE3MTEyVSwJLy8gPDAsMyw0LDE+OiBDb3N0IDMgdnJldiA8MywwLDEsND4KKyAgMjIzMjY5MDg0OVUsCS8vIDwwLDMsNCwyPjogQ29zdCAzIHZyZXYgPDMsMCwyLDQ+CisgIDQwOTUzMTQzMzJVLAkvLyA8MCwzLDQsMz46IENvc3QgNCB2dHJubCA8MCwyLDQsNj4sIDwzLDMsMywzPgorICAzOTYyMTk0NDM0VSwJLy8gPDAsMyw0LDQ+OiBDb3N0IDQgdnppcGwgPDAsNCwxLDU+LCA8Myw0LDUsNj4KKyAgMjY5MTg3NzM3OFUsCS8vIDwwLDMsNCw1PjogQ29zdCAzIHZleHQzIDwxLDIsMywwPiwgPDMsNCw1LDY+CisgIDM4MjY3NjUxMTBVLAkvLyA8MCwzLDQsNj46IENvc3QgNCB2dXpwbCA8MCwyLDMsMT4sIFJIUworICAzNjY1OTQxNTE4VSwJLy8gPDAsMyw0LDc+OiBDb3N0IDQgdmV4dDEgPDcsMCwzLDQ+LCA8NywwLDMsND4KKyAgMjY5MTg3NzQwNVUsCS8vIDwwLDMsNCx1PjogQ29zdCAzIHZleHQzIDwxLDIsMywwPiwgPDMsNCx1LDY+CisgIDM2MzAxMTI4NzBVLAkvLyA8MCwzLDUsMD46IENvc3QgNCB2ZXh0MSA8MSwwLDMsNT4sIExIUworICAzNjMwMTEzNTI2VSwJLy8gPDAsMyw1LDE+OiBDb3N0IDQgdmV4dDEgPDEsMCwzLDU+LCA8MSwwLDMsMj4KKyAgNDAzNTE5OTczNFUsCS8vIDwwLDMsNSwyPjogQ29zdCA0IHZ6aXByIDwxLDQsMCw1PiwgPDEsMCwzLDI+CisgIDM3Njk2MDA1NzhVLAkvLyA8MCwzLDUsMz46IENvc3QgNCB2ZXh0MyA8MSx1LDMsMD4sIDwzLDUsMyw3PgorICAyMjMyODQ2NTE2VSwJLy8gPDAsMyw1LDQ+OiBDb3N0IDMgdnJldiA8MywwLDQsNT4KKyAgMzc3OTAzNzc4MFUsCS8vIDwwLDMsNSw1PjogQ29zdCA0IHZleHQzIDwzLDQsNSwwPiwgPDMsNSw1LDc+CisgIDI3MTg3MTQ0NjFVLAkvLyA8MCwzLDUsNj46IENvc3QgMyB2ZXh0MyA8NSw2LDcsMD4sIDwzLDUsNiw3PgorICAyNzA2MTA2OTc1VSwJLy8gPDAsMyw1LDc+OiBDb3N0IDMgdmV4dDMgPDMsNSw3LDA+LCA8Myw1LDcsMD4KKyAgMjIzMzE0MTQ2NFUsCS8vIDwwLDMsNSx1PjogQ29zdCAzIHZyZXYgPDMsMCx1LDU+CisgIDI2OTE4Nzc0OTZVLAkvLyA8MCwzLDYsMD46IENvc3QgMyB2ZXh0MyA8MSwyLDMsMD4sIDwzLDYsMCw3PgorICAzNzI3NTExOTE0VSwJLy8gPDAsMyw2LDE+OiBDb3N0IDQgdmV4dDIgPDYsMSwwLDM+LCA8NiwxLDAsMz4KKyAgMzc2NTYxOTMzOFUsCS8vIDwwLDMsNiwyPjogQ29zdCA0IHZleHQzIDwxLDIsMywwPiwgPDMsNiwyLDc+CisgIDM3NjU2MTkzNDdVLAkvLyA8MCwzLDYsMz46IENvc3QgNCB2ZXh0MyA8MSwyLDMsMD4sIDwzLDYsMyw3PgorICAzNzY1OTg3OTk2VSwJLy8gPDAsMyw2LDQ+OiBDb3N0IDQgdmV4dDMgPDEsMix1LDA+LCA8Myw2LDQsNz4KKyAgMzMwNjY3MDI3MFUsCS8vIDwwLDMsNiw1PjogQ29zdCA0IHZyZXYgPDMsMCw1LDY+CisgIDM3OTI0NTYzNjVVLAkvLyA8MCwzLDYsNj46IENvc3QgNCB2ZXh0MyA8NSw2LDcsMD4sIDwzLDYsNiw2PgorICAyNzA2NzcwNjA4VSwJLy8gPDAsMyw2LDc+OiBDb3N0IDMgdmV4dDMgPDMsNiw3LDA+LCA8Myw2LDcsMD4KKyAgMjcwNjg0NDM0NVUsCS8vIDwwLDMsNix1PjogQ29zdCAzIHZleHQzIDwzLDYsdSwwPiwgPDMsNix1LDA+CisgIDM3Njk2MDA3MDdVLAkvLyA8MCwzLDcsMD46IENvc3QgNCB2ZXh0MyA8MSx1LDMsMD4sIDwzLDcsMCwxPgorICAyNjU5NzQyNzg3VSwJLy8gPDAsMyw3LDE+OiBDb3N0IDMgdmV4dDIgPDcsMSwwLDM+LCA8NywxLDAsMz4KKyAgMzYzNjEwMjYxMlUsCS8vIDwwLDMsNywyPjogQ29zdCA0IHZleHQxIDwyLDAsMyw3PiwgPDIsMCwzLDc+CisgIDM3Njk2MDA3NDBVLAkvLyA8MCwzLDcsMz46IENvc3QgNCB2ZXh0MyA8MSx1LDMsMD4sIDwzLDcsMyw3PgorICAzNzY5NjAwNzQ3VSwJLy8gPDAsMyw3LDQ+OiBDb3N0IDQgdmV4dDMgPDEsdSwzLDA+LCA8Myw3LDQsNT4KKyAgMzc2OTYwMDc1OFUsCS8vIDwwLDMsNyw1PjogQ29zdCA0IHZleHQzIDwxLHUsMywwPiwgPDMsNyw1LDc+CisgIDM2NTk5OTM0MDBVLAkvLyA8MCwzLDcsNj46IENvc3QgNCB2ZXh0MSA8NiwwLDMsNz4sIDw2LDAsMyw3PgorICAzNzgxMTc2MDY1VSwJLy8gPDAsMyw3LDc+OiBDb3N0IDQgdmV4dDMgPDMsNyw3LDA+LCA8Myw3LDcsMD4KKyAgMjY2NDM4ODIxOFUsCS8vIDwwLDMsNyx1PjogQ29zdCAzIHZleHQyIDw3LHUsMCwzPiwgPDcsdSwwLDM+CisgIDE0ODI2NTM3OThVLAkvLyA8MCwzLHUsMD46IENvc3QgMiB2ZXh0MSA8MSwwLDMsdT4sIExIUworICAxNDgyNjU0NDYwVSwJLy8gPDAsMyx1LDE+OiBDb3N0IDIgdmV4dDEgPDEsMCwzLHU+LCA8MSwwLDMsdT4KKyAgMjU1NjM5NzE2MFUsCS8vIDwwLDMsdSwyPjogQ29zdCAzIHZleHQxIDwxLDAsMyx1PiwgPDIsMiwyLDI+CisgIDMwMjExNzkyOTJVLAkvLyA8MCwzLHUsMz46IENvc3QgMyB2dHJubCBMSFMsIDwzLDMsMywzPgorICAxNDgyNjU3MDc4VSwJLy8gPDAsMyx1LDQ+OiBDb3N0IDIgdmV4dDEgPDEsMCwzLHU+LCBSSFMKKyAgMzAyMTE3OTM5NFUsCS8vIDwwLDMsdSw1PjogQ29zdCAzIHZ0cm5sIExIUywgPDMsNCw1LDY+CisgIDI1OTgyMDM4OThVLAkvLyA8MCwzLHUsNj46IENvc3QgMyB2ZXh0MSA8dSwwLDMsdT4sIDw2LDIsNywzPgorICAyNzA4MDk3ODc0VSwJLy8gPDAsMyx1LDc+OiBDb3N0IDMgdmV4dDMgPDMsdSw3LDA+LCA8Myx1LDcsMD4KKyAgMTQ4MjY1OTYzMFUsCS8vIDwwLDMsdSx1PjogQ29zdCAyIHZleHQxIDwxLDAsMyx1PiwgTEhTCisgIDI2MTcyNzg0NjhVLAkvLyA8MCw0LDAsMD46IENvc3QgMyB2ZXh0MiA8MCwwLDAsND4sIDwwLDAsMCw0PgorICAyNjE4NjA1NjcwVSwJLy8gPDAsNCwwLDE+OiBDb3N0IDMgdmV4dDIgPDAsMiwwLDQ+LCBMSFMKKyAgMjYxODYwNTczNFUsCS8vIDwwLDQsMCwyPjogQ29zdCAzIHZleHQyIDwwLDIsMCw0PiwgPDAsMiwwLDQ+CisgIDM2NDIwOTE2OTVVLAkvLyA8MCw0LDAsMz46IENvc3QgNCB2ZXh0MSA8MywwLDQsMD4sIDwzLDAsNCwwPgorICAyNzUzMTM0Nzk2VSwJLy8gPDAsNCwwLDQ+OiBDb3N0IDMgdnV6cGwgPDAsMiw0LDY+LCA8MCwyLDQsNj4KKyAgMjcxODcxNDc3MFUsCS8vIDwwLDQsMCw1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDQsMCw1LDE+CisgIDMwMjEyNDU3NTBVLAkvLyA8MCw0LDAsNj46IENvc3QgMyB2dHJubCA8MCwyLDAsMj4sIFJIUworICAzNjY1OTgyNDgzVSwJLy8gPDAsNCwwLDc+OiBDb3N0IDQgdmV4dDEgPDcsMCw0LDA+LCA8NywwLDQsMD4KKyAgMzAyMTI0NTc2OFUsCS8vIDwwLDQsMCx1PjogQ29zdCAzIHZ0cm5sIDwwLDIsMCwyPiwgUkhTCisgIDI1NjgzNTU5NDJVLAkvLyA8MCw0LDEsMD46IENvc3QgMyB2ZXh0MSA8MywwLDQsMT4sIExIUworICAzNjkyMzQ4MjEyVSwJLy8gPDAsNCwxLDE+OiBDb3N0IDQgdmV4dDIgPDAsMiwwLDQ+LCA8MSwxLDEsMT4KKyAgMzY5MjM0ODMxMFUsCS8vIDwwLDQsMSwyPjogQ29zdCA0IHZleHQyIDwwLDIsMCw0PiwgPDEsMiwzLDA+CisgIDI1NjgzNTgwNjRVLAkvLyA8MCw0LDEsMz46IENvc3QgMyB2ZXh0MSA8MywwLDQsMT4sIDwzLDAsNCwxPgorICAyNTY4MzU5MjIyVSwJLy8gPDAsNCwxLDQ+OiBDb3N0IDMgdmV4dDEgPDMsMCw0LDE+LCBSSFMKKyAgMTgxMjc3ODI5NFUsCS8vIDwwLDQsMSw1PjogQ29zdCAyIHZ6aXBsIExIUywgUkhTCisgIDMwMjI2NzExNThVLAkvLyA8MCw0LDEsNj46IENvc3QgMyB2dHJubCA8MCw0LDEsNT4sIFJIUworICAyNTkyMjQ4ODUyVSwJLy8gPDAsNCwxLDc+OiBDb3N0IDMgdmV4dDEgPDcsMCw0LDE+LCA8NywwLDQsMT4KKyAgMTgxMjc3ODUzN1UsCS8vIDwwLDQsMSx1PjogQ29zdCAyIHZ6aXBsIExIUywgUkhTCisgIDI1NjgzNjQxMzRVLAkvLyA8MCw0LDIsMD46IENvc3QgMyB2ZXh0MSA8MywwLDQsMj4sIExIUworICAyMjM4NTczNDIzVSwJLy8gPDAsNCwyLDE+OiBDb3N0IDMgdnJldiA8NCwwLDEsMj4KKyAgMzY5MjM0OTAzMlUsCS8vIDwwLDQsMiwyPjogQ29zdCA0IHZleHQyIDwwLDIsMCw0PiwgPDIsMiwyLDI+CisgIDI2MzEyMTQ3NjFVLAkvLyA8MCw0LDIsMz46IENvc3QgMyB2ZXh0MiA8MiwzLDAsND4sIDwyLDMsMCw0PgorICAyNTY4MzY3NDE0VSwJLy8gPDAsNCwyLDQ+OiBDb3N0IDMgdmV4dDEgPDMsMCw0LDI+LCBSSFMKKyAgMjg4NzAyODAyMlUsCS8vIDwwLDQsMiw1PjogQ29zdCAzIHZ6aXBsIDwwLDIsMCwyPiwgUkhTCisgIDE5NDY5OTYwMjJVLAkvLyA8MCw0LDIsNj46IENvc3QgMiB2dHJubCBMSFMsIFJIUworICAyNTkyMjU3MDQ1VSwJLy8gPDAsNCwyLDc+OiBDb3N0IDMgdmV4dDEgPDcsMCw0LDI+LCA8NywwLDQsMj4KKyAgMTk0Njk5NjA0MFUsCS8vIDwwLDQsMix1PjogQ29zdCAyIHZ0cm5sIExIUywgUkhTCisgIDM2OTIzNDk1OTBVLAkvLyA8MCw0LDMsMD46IENvc3QgNCB2ZXh0MiA8MCwyLDAsND4sIDwzLDAsMSwyPgorICAzODI2ODc4NjE0VSwJLy8gPDAsNCwzLDE+OiBDb3N0IDQgdnV6cGwgPDAsMiw0LDY+LCA8MywwLDEsMj4KKyAgMzgyNjg3ODYyNVUsCS8vIDwwLDQsMywyPjogQ29zdCA0IHZ1enBsIDwwLDIsNCw2PiwgPDMsMCwyLDQ+CisgIDM2OTIzNDk4NTJVLAkvLyA8MCw0LDMsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDAsND4sIDwzLDMsMywzPgorICAzNjkyMzQ5OTU0VSwJLy8gPDAsNCwzLDQ+OiBDb3N0IDQgdmV4dDIgPDAsMiwwLDQ+LCA8Myw0LDUsNj4KKyAgMzgyNjg3ODk3OFUsCS8vIDwwLDQsMyw1PjogQ29zdCA0IHZ1enBsIDwwLDIsNCw2PiwgPDMsNCw1LDY+CisgIDQwOTUyMDA1NjZVLAkvLyA8MCw0LDMsNj46IENvc3QgNCB2dHJubCA8MCwyLDMsMT4sIFJIUworICAzNzEzNTgzODE0VSwJLy8gPDAsNCwzLDc+OiBDb3N0IDQgdmV4dDIgPDMsNywwLDQ+LCA8Myw3LDAsND4KKyAgMzY5MjM1MDIzOFUsCS8vIDwwLDQsMyx1PjogQ29zdCA0IHZleHQyIDwwLDIsMCw0PiwgPDMsdSwxLDI+CisgIDI1NTA0NjQ1NTJVLAkvLyA8MCw0LDQsMD46IENvc3QgMyB2ZXh0MSA8MCwwLDQsND4sIDwwLDAsNCw0PgorICAzOTYyMTk0OTE0VSwJLy8gPDAsNCw0LDE+OiBDb3N0IDQgdnppcGwgPDAsNCwxLDU+LCA8NCwxLDUsMD4KKyAgMzY5MzY3NzYzMVUsCS8vIDwwLDQsNCwyPjogQ29zdCA0IHZleHQyIDwwLDQsMCw0PiwgPDQsMiw2LDM+CisgIDM2NDIxMjQ0NjdVLAkvLyA8MCw0LDQsMz46IENvc3QgNCB2ZXh0MSA8MywwLDQsND4sIDwzLDAsNCw0PgorICAyNzE4NzE1MDg4VSwJLy8gPDAsNCw0LDQ+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8NCw0LDQsND4KKyAgMjYxODYwODk1MFUsCS8vIDwwLDQsNCw1PjogQ29zdCAzIHZleHQyIDwwLDIsMCw0PiwgUkhTCisgIDI3NTMxMzc5NzRVLAkvLyA8MCw0LDQsNj46IENvc3QgMyB2dXpwbCA8MCwyLDQsNj4sIFJIUworICAzNjY2MDE1MjU1VSwJLy8gPDAsNCw0LDc+OiBDb3N0IDQgdmV4dDEgPDcsMCw0LDQ+LCA8NywwLDQsND4KKyAgMjYxODYwOTE5M1UsCS8vIDwwLDQsNCx1PjogQ29zdCAzIHZleHQyIDwwLDIsMCw0PiwgUkhTCisgIDI1NjgzODg3MTBVLAkvLyA8MCw0LDUsMD46IENvc3QgMyB2ZXh0MSA8MywwLDQsNT4sIExIUworICAyNTY4Mzg5NTI2VSwJLy8gPDAsNCw1LDE+OiBDb3N0IDMgdmV4dDEgPDMsMCw0LDU+LCA8MSwyLDMsMD4KKyAgMzYzNjE1OTk2M1UsCS8vIDwwLDQsNSwyPjogQ29zdCA0IHZleHQxIDwyLDAsNCw1PiwgPDIsMCw0LDU+CisgIDI1NjgzOTA4MzZVLAkvLyA8MCw0LDUsMz46IENvc3QgMyB2ZXh0MSA8MywwLDQsNT4sIDwzLDAsNCw1PgorICAyNTY4MzkxOTkwVSwJLy8gPDAsNCw1LDQ+OiBDb3N0IDMgdmV4dDEgPDMsMCw0LDU+LCBSSFMKKyAgMjcxODcxNTE4MFUsCS8vIDwwLDQsNSw1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDQsNSw1LDY+CisgIDE2MTgxMzYzNzRVLAkvLyA8MCw0LDUsNj46IENvc3QgMiB2ZXh0MyA8MSwyLDMsMD4sIFJIUworICAyNTkyMjgxNjI0VSwJLy8gPDAsNCw1LDc+OiBDb3N0IDMgdmV4dDEgPDcsMCw0LDU+LCA8NywwLDQsNT4KKyAgMTYxODEzNjM5MlUsCS8vIDwwLDQsNSx1PjogQ29zdCAyIHZleHQzIDwxLDIsMywwPiwgUkhTCisgIDI1NTA0ODA5MzhVLAkvLyA8MCw0LDYsMD46IENvc3QgMyB2ZXh0MSA8MCwwLDQsNj4sIDwwLDAsNCw2PgorICAzODI2ODgwODAxVSwJLy8gPDAsNCw2LDE+OiBDb3N0IDQgdnV6cGwgPDAsMiw0LDY+LCA8NiwwLDEsMj4KKyAgMjU2MjQyNjMzMlUsCS8vIDwwLDQsNiwyPjogQ29zdCAzIHZleHQxIDwyLDAsNCw2PiwgPDIsMCw0LDY+CisgIDM3ODYxOTAxODFVLAkvLyA8MCw0LDYsMz46IENvc3QgNCB2ZXh0MyA8NCw2LDMsMD4sIDw0LDYsMywwPgorICAyNzE4NzE1MjUyVSwJLy8gPDAsNCw2LDQ+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8NCw2LDQsNj4KKyAgMzgyNjg4MTE2NVUsCS8vIDwwLDQsNiw1PjogQ29zdCA0IHZ1enBsIDwwLDIsNCw2PiwgPDYsNCw1LDY+CisgIDI3MTI2Njk1NjhVLAkvLyA8MCw0LDYsNj46IENvc3QgMyB2ZXh0MyA8NCw2LDYsMD4sIDw0LDYsNiwwPgorICAyNjU3NzYwMDgxVSwJLy8gPDAsNCw2LDc+OiBDb3N0IDMgdmV4dDIgPDYsNywwLDQ+LCA8Niw3LDAsND4KKyAgMjcxODcxNTI4NFUsCS8vIDwwLDQsNix1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDQsNix1LDI+CisgIDM2NTQwOTA4NTRVLAkvLyA8MCw0LDcsMD46IENvc3QgNCB2ZXh0MSA8NSwwLDQsNz4sIExIUworICAzOTM0MjI5MzI2VSwJLy8gPDAsNCw3LDE+OiBDb3N0IDQgdnV6cHIgPDcsMCwxLDQ+LCA8Niw3LDAsMT4KKyAgMzczNDE1NjQzN1UsCS8vIDwwLDQsNywyPjogQ29zdCA0IHZleHQyIDw3LDIsMCw0PiwgPDcsMiwwLDQ+CisgIDM3MzQ4MjAwNzBVLAkvLyA8MCw0LDcsMz46IENvc3QgNCB2ZXh0MiA8NywzLDAsND4sIDw3LDMsMCw0PgorICAzNjU0MDk0MTM0VSwJLy8gPDAsNCw3LDQ+OiBDb3N0IDQgdmV4dDEgPDUsMCw0LDc+LCBSSFMKKyAgMjcxMzI1OTQ2NFUsCS8vIDwwLDQsNyw1PjogQ29zdCAzIHZleHQzIDw0LDcsNSwwPiwgPDQsNyw1LDA+CisgIDI3MTMzMzMyMDFVLAkvLyA8MCw0LDcsNj46IENvc3QgMyB2ZXh0MyA8NCw3LDYsMD4sIDw0LDcsNiwwPgorICAzNjU0MDk1ODY2VSwJLy8gPDAsNCw3LDc+OiBDb3N0IDQgdmV4dDEgPDUsMCw0LDc+LCA8NywwLDEsMj4KKyAgMjcxMzI1OTQ2NFUsCS8vIDwwLDQsNyx1PjogQ29zdCAzIHZleHQzIDw0LDcsNSwwPiwgPDQsNyw1LDA+CisgIDI1Njg0MTMyODZVLAkvLyA8MCw0LHUsMD46IENvc3QgMyB2ZXh0MSA8MywwLDQsdT4sIExIUworICAyNjE4NjExNTAyVSwJLy8gPDAsNCx1LDE+OiBDb3N0IDMgdmV4dDIgPDAsMiwwLDQ+LCBMSFMKKyAgMjc1MzE0MDUyNlUsCS8vIDwwLDQsdSwyPjogQ29zdCAzIHZ1enBsIDwwLDIsNCw2PiwgTEhTCisgIDI1Njg0MTU0MTVVLAkvLyA8MCw0LHUsMz46IENvc3QgMyB2ZXh0MSA8MywwLDQsdT4sIDwzLDAsNCx1PgorICAyNTY4NDE2NTY2VSwJLy8gPDAsNCx1LDQ+OiBDb3N0IDMgdmV4dDEgPDMsMCw0LHU+LCBSSFMKKyAgMTgxNzQyMzE1OFUsCS8vIDwwLDQsdSw1PjogQ29zdCAyIHZ6aXBsIExIUywgUkhTCisgIDE5NDc0MzgzOTBVLAkvLyA8MCw0LHUsNj46IENvc3QgMiB2dHJubCBMSFMsIFJIUworICAyNTkyMzA2MjAzVSwJLy8gPDAsNCx1LDc+OiBDb3N0IDMgdmV4dDEgPDcsMCw0LHU+LCA8NywwLDQsdT4KKyAgMTk0NzQzODQwOFUsCS8vIDwwLDQsdSx1PjogQ29zdCAyIHZ0cm5sIExIUywgUkhTCisgIDM2MzAyMTkyNjRVLAkvLyA8MCw1LDAsMD46IENvc3QgNCB2ZXh0MSA8MSwwLDUsMD4sIDwwLDAsMCwwPgorICAyNjI1OTEyOTM0VSwJLy8gPDAsNSwwLDE+OiBDb3N0IDMgdmV4dDIgPDEsNCwwLDU+LCBMSFMKKyAgMzY5MjM1NTc0OFUsCS8vIDwwLDUsMCwyPjogQ29zdCA0IHZleHQyIDwwLDIsMCw1PiwgPDAsMiwwLDI+CisgIDM2OTMwMTkzODRVLAkvLyA8MCw1LDAsMz46IENvc3QgNCB2ZXh0MiA8MCwzLDAsNT4sIDwwLDMsMCw1PgorICAzNjMwMjIyNjQ2VSwJLy8gPDAsNSwwLDQ+OiBDb3N0IDQgdmV4dDEgPDEsMCw1LDA+LCBSSFMKKyAgMzY5OTY1NTA2MlUsCS8vIDwwLDUsMCw1PjogQ29zdCA0IHZleHQyIDwxLDQsMCw1PiwgPDAsNSwwLDE+CisgIDI3MTg3MTU1MDhVLAkvLyA8MCw1LDAsNj46IENvc3QgMyB2ZXh0MyA8NSw2LDcsMD4sIDw1LDAsNiwxPgorICAzMDg3MDExMTI2VSwJLy8gPDAsNSwwLDc+OiBDb3N0IDMgdnRybnIgPDAsMCwwLDA+LCBSSFMKKyAgMjYyNTkxMzUwMVUsCS8vIDwwLDUsMCx1PjogQ29zdCAzIHZleHQyIDwxLDQsMCw1PiwgTEhTCisgIDE1MDA2NTk4MTRVLAkvLyA8MCw1LDEsMD46IENvc3QgMiB2ZXh0MSA8NCwwLDUsMT4sIExIUworICAyODg2NTIwNTI4VSwJLy8gPDAsNSwxLDE+OiBDb3N0IDMgdnppcGwgTEhTLCA8NSwxLDcsMz4KKyAgMjU3NDQwMzE3NlUsCS8vIDwwLDUsMSwyPjogQ29zdCAzIHZleHQxIDw0LDAsNSwxPiwgPDIsMiwyLDI+CisgIDI1NzQ0MDM3MzRVLAkvLyA8MCw1LDEsMz46IENvc3QgMyB2ZXh0MSA8NCwwLDUsMT4sIDwzLDAsMSwyPgorICAxNTAwNjYyNjc0VSwJLy8gPDAsNSwxLDQ+OiBDb3N0IDIgdmV4dDEgPDQsMCw1LDE+LCA8NCwwLDUsMT4KKyAgMjg4NjUyMDgzNlUsCS8vIDwwLDUsMSw1PjogQ29zdCAzIHZ6aXBsIExIUywgPDUsNSw1LDU+CisgIDI4ODY1MjA5MzBVLAkvLyA8MCw1LDEsNj46IENvc3QgMyB2emlwbCBMSFMsIDw1LDYsNywwPgorICAyNzE4NzE1NjAwVSwJLy8gPDAsNSwxLDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8NSwxLDcsMz4KKyAgMTUwMDY2NTY0NlUsCS8vIDwwLDUsMSx1PjogQ29zdCAyIHZleHQxIDw0LDAsNSwxPiwgTEhTCisgIDI1NTY0OTM5MjZVLAkvLyA8MCw1LDIsMD46IENvc3QgMyB2ZXh0MSA8MSwwLDUsMj4sIExIUworICAyMjQ0NTQ2MTIwVSwJLy8gPDAsNSwyLDE+OiBDb3N0IDMgdnJldiA8NSwwLDEsMj4KKyAgMzY5MjM1NzI1NlUsCS8vIDwwLDUsMiwyPjogQ29zdCA0IHZleHQyIDwwLDIsMCw1PiwgPDIsMiw1LDc+CisgIDI1Njg0Mzk5OTRVLAkvLyA8MCw1LDIsMz46IENvc3QgMyB2ZXh0MSA8MywwLDUsMj4sIDwzLDAsNSwyPgorICAyNTU2NDk3MjA2VSwJLy8gPDAsNSwyLDQ+OiBDb3N0IDMgdmV4dDEgPDEsMCw1LDI+LCBSSFMKKyAgMzAyMDczODU2NFUsCS8vIDwwLDUsMiw1PjogQ29zdCAzIHZ0cm5sIExIUywgPDUsNSw1LDU+CisgIDQwMjc4NzcxNjFVLAkvLyA8MCw1LDIsNj46IENvc3QgNCB2emlwciA8MCwyLDAsMj4sIDwyLDQsNSw2PgorICAzMDkzMjIwNjYyVSwJLy8gPDAsNSwyLDc+OiBDb3N0IDMgdnRybnIgPDEsMCwzLDI+LCBSSFMKKyAgMzA5MzIyMDY2M1UsCS8vIDwwLDUsMix1PjogQ29zdCAzIHZ0cm5yIDwxLDAsMywyPiwgUkhTCisgIDM2OTk2NTY4NTRVLAkvLyA8MCw1LDMsMD46IENvc3QgNCB2ZXh0MiA8MSw0LDAsNT4sIDwzLDAsMSwyPgorICAzNjk5NjU2OTI3VSwJLy8gPDAsNSwzLDE+OiBDb3N0IDQgdmV4dDIgPDEsNCwwLDU+LCA8MywxLDAsMz4KKyAgMzY5OTY1NzAwNlUsCS8vIDwwLDUsMywyPjogQ29zdCA0IHZleHQyIDwxLDQsMCw1PiwgPDMsMiwwLDE+CisgIDM2OTk2NTcxMTZVLAkvLyA8MCw1LDMsMz46IENvc3QgNCB2ZXh0MiA8MSw0LDAsNT4sIDwzLDMsMywzPgorICAyNjM3ODU5Mjg0VSwJLy8gPDAsNSwzLDQ+OiBDb3N0IDMgdmV4dDIgPDMsNCwwLDU+LCA8Myw0LDAsNT4KKyAgMzc5MDMxOTQ1M1UsCS8vIDwwLDUsMyw1PjogQ29zdCA0IHZleHQzIDw1LDMsNSwwPiwgPDUsMyw1LDA+CisgIDM2OTk2NTczNTRVLAkvLyA8MCw1LDMsNj46IENvc3QgNCB2ZXh0MiA8MSw0LDAsNT4sIDwzLDYsMiw3PgorICAyNzE2NzI1MTAzVSwJLy8gPDAsNSwzLDc+OiBDb3N0IDMgdmV4dDMgPDUsMyw3LDA+LCA8NSwzLDcsMD4KKyAgMjcxNjc5ODg0MFUsCS8vIDwwLDUsMyx1PjogQ29zdCAzIHZleHQzIDw1LDMsdSwwPiwgPDUsMyx1LDA+CisgIDI2NjE3NDc2MDJVLAkvLyA8MCw1LDQsMD46IENvc3QgMyB2ZXh0MiA8Nyw0LDAsNT4sIDw0LDAsNSwxPgorICAzNjMwMjUyODEwVSwJLy8gPDAsNSw0LDE+OiBDb3N0IDQgdmV4dDEgPDEsMCw1LDQ+LCA8MSwwLDUsND4KKyAgMzYzNjIyNTUwN1UsCS8vIDwwLDUsNCwyPjogQ29zdCA0IHZleHQxIDwyLDAsNSw0PiwgPDIsMCw1LDQ+CisgIDM3MTY5MTAxNzJVLAkvLyA8MCw1LDQsMz46IENvc3QgNCB2ZXh0MiA8NCwzLDAsNT4sIDw0LDMsMCw1PgorICAzOTYyMTk1ODkyVSwJLy8gPDAsNSw0LDQ+OiBDb3N0IDQgdnppcGwgPDAsNCwxLDU+LCA8NSw0LDUsNj4KKyAgMjYyNTkxNjIxNFUsCS8vIDwwLDUsNCw1PjogQ29zdCAzIHZleHQyIDwxLDQsMCw1PiwgUkhTCisgIDM3MTg5MDEwNzFVLAkvLyA8MCw1LDQsNj46IENvc3QgNCB2ZXh0MiA8NCw2LDAsNT4sIDw0LDYsMCw1PgorICAyNzE4NzE1ODQ2VSwJLy8gPDAsNSw0LDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8NSw0LDcsNj4KKyAgMjYyNTkxNjQ1N1UsCS8vIDwwLDUsNCx1PjogQ29zdCAzIHZleHQyIDwxLDQsMCw1PiwgUkhTCisgIDM3OTEyNzgwMzRVLAkvLyA8MCw1LDUsMD46IENvc3QgNCB2ZXh0MyA8NSw1LDAsMD4sIDw1LDUsMCwwPgorICAzNzkxMzUxNzcxVSwJLy8gPDAsNSw1LDE+OiBDb3N0IDQgdmV4dDMgPDUsNSwxLDA+LCA8NSw1LDEsMD4KKyAgMzMxODM4NjI2MFUsCS8vIDwwLDUsNSwyPjogQ29zdCA0IHZyZXYgPDUsMCwyLDU+CisgIDM3OTE0OTkyNDVVLAkvLyA8MCw1LDUsMz46IENvc3QgNCB2ZXh0MyA8NSw1LDMsMD4sIDw1LDUsMywwPgorICAzMzE4NTMzNzM0VSwJLy8gPDAsNSw1LDQ+OiBDb3N0IDQgdnJldiA8NSwwLDQsNT4KKyAgMjcxODcxNTkwOFUsCS8vIDwwLDUsNSw1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDUsNSw1LDU+CisgIDI2NTc3Njc1MjJVLAkvLyA8MCw1LDUsNj46IENvc3QgMyB2ZXh0MiA8Niw3LDAsNT4sIDw1LDYsNywwPgorICAyNzE4NzE1OTI4VSwJLy8gPDAsNSw1LDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8NSw1LDcsNz4KKyAgMjcxODcxNTkzN1UsCS8vIDwwLDUsNSx1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDUsNSx1LDc+CisgIDI1OTIzNTg1MDJVLAkvLyA8MCw1LDYsMD46IENvc3QgMyB2ZXh0MSA8NywwLDUsNj4sIExIUworICAzNzkyMDE1NDA0VSwJLy8gPDAsNSw2LDE+OiBDb3N0IDQgdmV4dDMgPDUsNiwxLDA+LCA8NSw2LDEsMD4KKyAgMzczMTUwOTc1NFUsCS8vIDwwLDUsNiwyPjogQ29zdCA0IHZleHQyIDw2LDcsMCw1PiwgPDYsMiw3LDM+CisgIDM3ODU3NDg1NDZVLAkvLyA8MCw1LDYsMz46IENvc3QgNCB2ZXh0MyA8NCw1LDYsMD4sIDw1LDYsMyw0PgorICAyNTkyMzYxNzgyVSwJLy8gPDAsNSw2LDQ+OiBDb3N0IDMgdmV4dDEgPDcsMCw1LDY+LCBSSFMKKyAgMjU5MjM2MjU5NFUsCS8vIDwwLDUsNiw1PjogQ29zdCAzIHZleHQxIDw3LDAsNSw2PiwgPDUsNiw3LDA+CisgIDM3ODU3NDg1NzZVLAkvLyA8MCw1LDYsNj46IENvc3QgNCB2ZXh0MyA8NCw1LDYsMD4sIDw1LDYsNiw3PgorICAxNjQ0OTc0MTc4VSwJLy8gPDAsNSw2LDc+OiBDb3N0IDIgdmV4dDMgPDUsNiw3LDA+LCA8NSw2LDcsMD4KKyAgMTY0NTA0NzkxNVUsCS8vIDwwLDUsNix1PjogQ29zdCAyIHZleHQzIDw1LDYsdSwwPiwgPDUsNix1LDA+CisgIDI1NjI1MDY4NTRVLAkvLyA8MCw1LDcsMD46IENvc3QgMyB2ZXh0MSA8MiwwLDUsNz4sIExIUworICAyNTYyNTA3NjcwVSwJLy8gPDAsNSw3LDE+OiBDb3N0IDMgdmV4dDEgPDIsMCw1LDc+LCA8MSwyLDMsMD4KKyAgMjU2MjUwODI2MlUsCS8vIDwwLDUsNywyPjogQ29zdCAzIHZleHQxIDwyLDAsNSw3PiwgPDIsMCw1LDc+CisgIDM2MzYyNTA3NzRVLAkvLyA8MCw1LDcsMz46IENvc3QgNCB2ZXh0MSA8MiwwLDUsNz4sIDwzLDAsMSwyPgorICAyNTYyNTEwMTM0VSwJLy8gPDAsNSw3LDQ+OiBDb3N0IDMgdmV4dDEgPDIsMCw1LDc+LCBSSFMKKyAgMjcxODcxNjA3MlUsCS8vIDwwLDUsNyw1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDUsNyw1LDc+CisgIDI3MTg3MTYwNzRVLAkvLyA8MCw1LDcsNj46IENvc3QgMyB2ZXh0MyA8NSw2LDcsMD4sIDw1LDcsNiwwPgorICAyNzE5Mzc5NjM1VSwJLy8gPDAsNSw3LDc+OiBDb3N0IDMgdmV4dDMgPDUsNyw3LDA+LCA8NSw3LDcsMD4KKyAgMjU2MjUxMjY4NlUsCS8vIDwwLDUsNyx1PjogQ29zdCAzIHZleHQxIDwyLDAsNSw3PiwgTEhTCisgIDE1MDA3MTcxNThVLAkvLyA8MCw1LHUsMD46IENvc3QgMiB2ZXh0MSA8NCwwLDUsdT4sIExIUworICAyNjI1OTE4NzY2VSwJLy8gPDAsNSx1LDE+OiBDb3N0IDMgdmV4dDIgPDEsNCwwLDU+LCBMSFMKKyAgMjcxOTY3NDU4M1UsCS8vIDwwLDUsdSwyPjogQ29zdCAzIHZleHQzIDw1LHUsMiwwPiwgPDUsdSwyLDA+CisgIDI1Njg0ODkxNTJVLAkvLyA8MCw1LHUsMz46IENvc3QgMyB2ZXh0MSA8MywwLDUsdT4sIDwzLDAsNSx1PgorICAxNTAwNzIwMDI1VSwJLy8gPDAsNSx1LDQ+OiBDb3N0IDIgdmV4dDEgPDQsMCw1LHU+LCA8NCwwLDUsdT4KKyAgMjYyNTkxOTEzMFUsCS8vIDwwLDUsdSw1PjogQ29zdCAzIHZleHQyIDwxLDQsMCw1PiwgUkhTCisgIDI1ODY0MDcyNDNVLAkvLyA8MCw1LHUsNj46IENvc3QgMyB2ZXh0MSA8NiwwLDUsdT4sIDw2LDAsNSx1PgorICAxNjQ2MzAxNDQ0VSwJLy8gPDAsNSx1LDc+OiBDb3N0IDIgdmV4dDMgPDUsdSw3LDA+LCA8NSx1LDcsMD4KKyAgMTY0NjM3NTE4MVUsCS8vIDwwLDUsdSx1PjogQ29zdCAyIHZleHQzIDw1LHUsdSwwPiwgPDUsdSx1LDA+CisgIDI1ODY0MTExMTBVLAkvLyA8MCw2LDAsMD46IENvc3QgMyB2ZXh0MSA8NiwwLDYsMD4sIExIUworICAyNjE5OTQ5MTU4VSwJLy8gPDAsNiwwLDE+OiBDb3N0IDMgdmV4dDIgPDAsNCwwLDY+LCBMSFMKKyAgMjYxOTk0OTIyMFUsCS8vIDwwLDYsMCwyPjogQ29zdCAzIHZleHQyIDwwLDQsMCw2PiwgPDAsMiwwLDI+CisgIDM3ODU3NDg3ODlVLAkvLyA8MCw2LDAsMz46IENvc3QgNCB2ZXh0MyA8NCw1LDYsMD4sIDw2LDAsMyw0PgorICAyNjE5OTQ5Mzg2VSwJLy8gPDAsNiwwLDQ+OiBDb3N0IDMgdmV4dDIgPDAsNCwwLDY+LCA8MCw0LDAsNj4KKyAgMjU4NjQxNTIwMlUsCS8vIDwwLDYsMCw1PjogQ29zdCAzIHZleHQxIDw2LDAsNiwwPiwgPDUsNiw3LDA+CisgIDI1ODY0MTU0MzZVLAkvLyA8MCw2LDAsNj46IENvc3QgMyB2ZXh0MSA8NiwwLDYsMD4sIDw2LDAsNiwwPgorICAyOTUyNzkzMzk4VSwJLy8gPDAsNiwwLDc+OiBDb3N0IDMgdnppcHIgPDAsMCwwLDA+LCBSSFMKKyAgMjYxOTk0OTcyNVUsCS8vIDwwLDYsMCx1PjogQ29zdCAzIHZleHQyIDwwLDQsMCw2PiwgTEhTCisgIDI1NjI1MzE0MzBVLAkvLyA8MCw2LDEsMD46IENvc3QgMyB2ZXh0MSA8MiwwLDYsMT4sIExIUworICAzNjkzNjkxNzAwVSwJLy8gPDAsNiwxLDE+OiBDb3N0IDQgdmV4dDIgPDAsNCwwLDY+LCA8MSwxLDEsMT4KKyAgMjg4NjUyMTMzOFUsCS8vIDwwLDYsMSwyPjogQ29zdCAzIHZ6aXBsIExIUywgPDYsMiw3LDM+CisgIDM2OTM2OTE4NjRVLAkvLyA8MCw2LDEsMz46IENvc3QgNCB2ZXh0MiA8MCw0LDAsNj4sIDwxLDMsMSwzPgorICAyNTYyNTM0NzEwVSwJLy8gPDAsNiwxLDQ+OiBDb3N0IDMgdmV4dDEgPDIsMCw2LDE+LCBSSFMKKyAgMjU4MDQ1MDkzMlUsCS8vIDwwLDYsMSw1PjogQ29zdCAzIHZleHQxIDw1LDAsNiwxPiwgPDUsMCw2LDE+CisgIDI4ODY1MjE2NTZVLAkvLyA8MCw2LDEsNj46IENvc3QgMyB2emlwbCBMSFMsIDw2LDYsNiw2PgorICAyOTY2NzM2MTgyVSwJLy8gPDAsNiwxLDc+OiBDb3N0IDMgdnppcHIgPDIsMywwLDE+LCBSSFMKKyAgMjk2NjczNjE4M1UsCS8vIDwwLDYsMSx1PjogQ29zdCAzIHZ6aXByIDwyLDMsMCwxPiwgUkhTCisgIDE1MDA3NDE3MzRVLAkvLyA8MCw2LDIsMD46IENvc3QgMiB2ZXh0MSA8NCwwLDYsMj4sIExIUworICAyMjUwNTE4ODE3VSwJLy8gPDAsNiwyLDE+OiBDb3N0IDMgdnJldiA8NiwwLDEsMj4KKyAgMjU3NDQ4NTA5NlUsCS8vIDwwLDYsMiwyPjogQ29zdCAzIHZleHQxIDw0LDAsNiwyPiwgPDIsMiwyLDI+CisgIDI2MzE4OTQ2OTRVLAkvLyA8MCw2LDIsMz46IENvc3QgMyB2ZXh0MiA8Miw0LDAsNj4sIDwyLDMsMCwxPgorICAxNTAwNzQ0NjA0VSwJLy8gPDAsNiwyLDQ+OiBDb3N0IDIgdmV4dDEgPDQsMCw2LDI+LCA8NCwwLDYsMj4KKyAgMjU3NDQ4NzI0OFUsCS8vIDwwLDYsMiw1PjogQ29zdCAzIHZleHQxIDw0LDAsNiwyPiwgPDUsMSw3LDM+CisgIDMwMjA3MzkzODRVLAkvLyA8MCw2LDIsNj46IENvc3QgMyB2dHJubCBMSFMsIDw2LDYsNiw2PgorICAyOTU0MTM2ODg2VSwJLy8gPDAsNiwyLDc+OiBDb3N0IDMgdnppcHIgPDAsMiwwLDI+LCBSSFMKKyAgMTUwMDc0NzU2NlUsCS8vIDwwLDYsMix1PjogQ29zdCAyIHZleHQxIDw0LDAsNiwyPiwgTEhTCisgIDM2OTM2OTMwNzhVLAkvLyA8MCw2LDMsMD46IENvc3QgNCB2ZXh0MiA8MCw0LDAsNj4sIDwzLDAsMSwyPgorICAzNzA1NjM3MTM2VSwJLy8gPDAsNiwzLDE+OiBDb3N0IDQgdmV4dDIgPDIsNCwwLDY+LCA8MywxLDUsNz4KKyAgMzcwNTYzNzE5MlUsCS8vIDwwLDYsMywyPjogQ29zdCA0IHZleHQyIDwyLDQsMCw2PiwgPDMsMiwzLDA+CisgIDM2OTM2OTMzNDBVLAkvLyA8MCw2LDMsMz46IENvc3QgNCB2ZXh0MiA8MCw0LDAsNj4sIDwzLDMsMywzPgorICAyNjM3ODY3NDc3VSwJLy8gPDAsNiwzLDQ+OiBDb3N0IDMgdmV4dDIgPDMsNCwwLDY+LCA8Myw0LDAsNj4KKyAgMzcwNTYzNzQyNFUsCS8vIDwwLDYsMyw1PjogQ29zdCA0IHZleHQyIDwyLDQsMCw2PiwgPDMsNSwxLDc+CisgIDM2NjYxNTQwNTZVLAkvLyA8MCw2LDMsNj46IENvc3QgNCB2ZXh0MSA8NywwLDYsMz4sIDw2LDMsNywwPgorICAyNzIyNjk3ODAwVSwJLy8gPDAsNiwzLDc+OiBDb3N0IDMgdmV4dDMgPDYsMyw3LDA+LCA8NiwzLDcsMD4KKyAgMjcyMjc3MTUzN1UsCS8vIDwwLDYsMyx1PjogQ29zdCAzIHZleHQzIDw2LDMsdSwwPiwgPDYsMyx1LDA+CisgIDI1NjI1NTYwMDZVLAkvLyA8MCw2LDQsMD46IENvc3QgMyB2ZXh0MSA8MiwwLDYsND4sIExIUworICA0MDk1MzE2MjU3VSwJLy8gPDAsNiw0LDE+OiBDb3N0IDQgdnRybmwgPDAsMiw0LDY+LCA8NiwwLDEsMj4KKyAgMjU2MjU1NzQyMFUsCS8vIDwwLDYsNCwyPjogQ29zdCAzIHZleHQxIDwyLDAsNiw0PiwgPDIsMCw2LDQ+CisgIDM2MzYyOTk5MjZVLAkvLyA8MCw2LDQsMz46IENvc3QgNCB2ZXh0MSA8MiwwLDYsND4sIDwzLDAsMSwyPgorICAyNTYyNTU5Mjg2VSwJLy8gPDAsNiw0LDQ+OiBDb3N0IDMgdmV4dDEgPDIsMCw2LDQ+LCBSSFMKKyAgMjYxOTk1MjQzOFUsCS8vIDwwLDYsNCw1PjogQ29zdCAzIHZleHQyIDwwLDQsMCw2PiwgUkhTCisgIDI3MjMyODc2OTZVLAkvLyA8MCw2LDQsNj46IENvc3QgMyB2ZXh0MyA8Niw0LDYsMD4sIDw2LDQsNiwwPgorICA0MDI3ODk1MDk0VSwJLy8gPDAsNiw0LDc+OiBDb3N0IDQgdnppcHIgPDAsMiwwLDQ+LCBSSFMKKyAgMjYxOTk1MjY4MVUsCS8vIDwwLDYsNCx1PjogQ29zdCAzIHZleHQyIDwwLDQsMCw2PiwgUkhTCisgIDI3MTg3MTY1OTRVLAkvLyA8MCw2LDUsMD46IENvc3QgMyB2ZXh0MyA8NSw2LDcsMD4sIDw2LDUsMCw3PgorICAzNjQ4MjUwNzc0VSwJLy8gPDAsNiw1LDE+OiBDb3N0IDQgdmV4dDEgPDQsMCw2LDU+LCA8MSwyLDMsMD4KKyAgMzc5MjQ1ODQzNlUsCS8vIDwwLDYsNSwyPjogQ29zdCA0IHZleHQzIDw1LDYsNywwPiwgPDYsNSwyLDc+CisgIDM3MDU2Mzg3NjdVLAkvLyA8MCw2LDUsMz46IENvc3QgNSB2ZXh0MiA8Miw0LDAsNj4sIDw1LDMsNywwPgorICAzNjQ4MjUyODMxVSwJLy8gPDAsNiw1LDQ+OiBDb3N0IDQgdmV4dDEgPDQsMCw2LDU+LCA8NCwwLDYsNT4KKyAgMzc5NzYxOTQxNlUsCS8vIDwwLDYsNSw1PjogQ29zdCA0IHZleHQzIDw2LDUsNSwwPiwgPDYsNSw1LDA+CisgIDM3OTI0NTg0NzJVLAkvLyA8MCw2LDUsNj46IENvc3QgNCB2ZXh0MyA8NSw2LDcsMD4sIDw2LDUsNiw3PgorICA0MDM1MjAyMzU4VSwJLy8gPDAsNiw1LDc+OiBDb3N0IDQgdnppcHIgPDEsNCwwLDU+LCBSSFMKKyAgMjcxODcxNjU5NFUsCS8vIDwwLDYsNSx1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDYsNSwwLDc+CisgIDM3ODY0MTI3OTZVLAkvLyA8MCw2LDYsMD46IENvc3QgNCB2ZXh0MyA8NCw2LDYsMD4sIDw2LDYsMCwwPgorICAzNzkyNDU4NTA0VSwJLy8gPDAsNiw2LDE+OiBDb3N0IDQgdmV4dDMgPDUsNiw3LDA+LCA8Niw2LDEsMz4KKyAgMzcyODIwMDEyNlUsCS8vIDwwLDYsNiwyPjogQ29zdCA0IHZleHQyIDw2LDIsMCw2PiwgPDYsMiwwLDY+CisgIDM3OTgxMzU1NzVVLAkvLyA8MCw2LDYsMz46IENvc3QgNCB2ZXh0MyA8Niw2LDMsMD4sIDw2LDYsMywwPgorICAzNzg2NDEyODM2VSwJLy8gPDAsNiw2LDQ+OiBDb3N0IDQgdmV4dDMgPDQsNiw2LDA+LCA8Niw2LDQsND4KKyAgMzc5MjQ1ODU0M1UsCS8vIDwwLDYsNiw1PjogQ29zdCA0IHZleHQzIDw1LDYsNywwPiwgPDYsNiw1LDY+CisgIDI3MTg3MTY3MjhVLAkvLyA8MCw2LDYsNj46IENvc3QgMyB2ZXh0MyA8NSw2LDcsMD4sIDw2LDYsNiw2PgorICAyNzE4NzE2NzM4VSwJLy8gPDAsNiw2LDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8Niw2LDcsNz4KKyAgMjcxODcxNjc0N1UsCS8vIDwwLDYsNix1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDYsNix1LDc+CisgIDI3MTg3MTY3NTBVLAkvLyA8MCw2LDcsMD46IENvc3QgMyB2ZXh0MyA8NSw2LDcsMD4sIDw2LDcsMCwxPgorICAyNzI0OTA5OTEwVSwJLy8gPDAsNiw3LDE+OiBDb3N0IDMgdmV4dDMgPDYsNywxLDA+LCA8Niw3LDEsMD4KKyAgMzYzNjMyMzgyM1UsCS8vIDwwLDYsNywyPjogQ29zdCA0IHZleHQxIDwyLDAsNiw3PiwgPDIsMCw2LDc+CisgIDI3MjUwNTczODRVLAkvLyA8MCw2LDcsMz46IENvc3QgMyB2ZXh0MyA8Niw3LDMsMD4sIDw2LDcsMywwPgorICAyNzE4NzE2NzkwVSwJLy8gPDAsNiw3LDQ+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8Niw3LDQsNT4KKyAgMjcxODcxNjgwMFUsCS8vIDwwLDYsNyw1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDYsNyw1LDY+CisgIDM3OTI0NTg2MjlVLAkvLyA8MCw2LDcsNj46IENvc3QgNCB2ZXh0MyA8NSw2LDcsMD4sIDw2LDcsNiwyPgorICAyNzI1MzUyMzMyVSwJLy8gPDAsNiw3LDc+OiBDb3N0IDMgdmV4dDMgPDYsNyw3LDA+LCA8Niw3LDcsMD4KKyAgMjcxODcxNjgyMlUsCS8vIDwwLDYsNyx1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDYsNyx1LDE+CisgIDE1MDA3OTA4ODZVLAkvLyA8MCw2LHUsMD46IENvc3QgMiB2ZXh0MSA8NCwwLDYsdT4sIExIUworICAyNjE5OTU0OTkwVSwJLy8gPDAsNix1LDE+OiBDb3N0IDMgdmV4dDIgPDAsNCwwLDY+LCBMSFMKKyAgMjU2MjU5MDE5MlUsCS8vIDwwLDYsdSwyPjogQ29zdCAzIHZleHQxIDwyLDAsNix1PiwgPDIsMCw2LHU+CisgIDI3MjU3MjEwMTdVLAkvLyA8MCw2LHUsMz46IENvc3QgMyB2ZXh0MyA8Nix1LDMsMD4sIDw2LHUsMywwPgorICAxNTAwNzkzNzYyVSwJLy8gPDAsNix1LDQ+OiBDb3N0IDIgdmV4dDEgPDQsMCw2LHU+LCA8NCwwLDYsdT4KKyAgMjYxOTk1NTM1NFUsCS8vIDwwLDYsdSw1PjogQ29zdCAzIHZleHQyIDwwLDQsMCw2PiwgUkhTCisgIDI3MjU5NDIyMjhVLAkvLyA8MCw2LHUsNj46IENvc3QgMyB2ZXh0MyA8Nix1LDYsMD4sIDw2LHUsNiwwPgorICAyOTU0MTg2MDM4VSwJLy8gPDAsNix1LDc+OiBDb3N0IDMgdnppcHIgPDAsMiwwLHU+LCBSSFMKKyAgMTUwMDc5NjcxOFUsCS8vIDwwLDYsdSx1PjogQ29zdCAyIHZleHQxIDw0LDAsNix1PiwgTEhTCisgIDIyNTY0MDEzOTFVLAkvLyA8MCw3LDAsMD46IENvc3QgMyB2cmV2IDw3LDAsMCwwPgorICAyNjMyNTY0ODM4VSwJLy8gPDAsNywwLDE+OiBDb3N0IDMgdmV4dDIgPDIsNSwwLDc+LCBMSFMKKyAgMjI1NjU0ODg2NVUsCS8vIDwwLDcsMCwyPjogQ29zdCAzIHZyZXYgPDcsMCwyLDA+CisgIDM3MDA5OTgzOTZVLAkvLyA8MCw3LDAsMz46IENvc3QgNCB2ZXh0MiA8MSw2LDAsNz4sIDwwLDMsMSwwPgorICAyNzE4NzE2OTUyVSwJLy8gPDAsNywwLDQ+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8NywwLDQsNT4KKyAgMjcxODcxNjk2MlUsCS8vIDwwLDcsMCw1PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPDcsMCw1LDY+CisgIDI2MjEyODQ4NDVVLAkvLyA8MCw3LDAsNj46IENvc3QgMyB2ZXh0MiA8MCw2LDAsNz4sIDwwLDYsMCw3PgorICAzOTA0Njg1NTQyVSwJLy8gPDAsNywwLDc+OiBDb3N0IDQgdnV6cHIgPDIsMCw1LDc+LCA8MiwwLDUsNz4KKyAgMjYzMjU2NTQwNVUsCS8vIDwwLDcsMCx1PjogQ29zdCAzIHZleHQyIDwyLDUsMCw3PiwgTEhTCisgIDIyNTY0MDk1ODRVLAkvLyA8MCw3LDEsMD46IENvc3QgMyB2cmV2IDw3LDAsMCwxPgorICAzNzA2MzA3MzgwVSwJLy8gPDAsNywxLDE+OiBDb3N0IDQgdmV4dDIgPDIsNSwwLDc+LCA8MSwxLDEsMT4KKyAgMjYzMjU2NTY1NFUsCS8vIDwwLDcsMSwyPjogQ29zdCAzIHZleHQyIDwyLDUsMCw3PiwgPDEsMiwzLDA+CisgIDM3Njk2MDMxNjhVLAkvLyA8MCw3LDEsMz46IENvc3QgNCB2ZXh0MyA8MSx1LDMsMD4sIDw3LDEsMyw1PgorICAyMjU2NzA0NTMyVSwJLy8gPDAsNywxLDQ+OiBDb3N0IDMgdnJldiA8NywwLDQsMT4KKyAgMzc2OTYwMzE4NFUsCS8vIDwwLDcsMSw1PjogQ29zdCA0IHZleHQzIDwxLHUsMywwPiwgPDcsMSw1LDM+CisgIDM3MDA5OTkzNjZVLAkvLyA8MCw3LDEsNj46IENvc3QgNCB2ZXh0MiA8MSw2LDAsNz4sIDwxLDYsMCw3PgorICAyODg2NTIyNDc2VSwJLy8gPDAsNywxLDc+OiBDb3N0IDMgdnppcGwgTEhTLCA8Nyw3LDcsNz4KKyAgMjI1Njk5OTQ4MFUsCS8vIDwwLDcsMSx1PjogQ29zdCAzIHZyZXYgPDcsMCx1LDE+CisgIDI1ODY1MDEyMjJVLAkvLyA8MCw3LDIsMD46IENvc3QgMyB2ZXh0MSA8NiwwLDcsMj4sIExIUworICAxMTgyNzQ5NjkwVSwJLy8gPDAsNywyLDE+OiBDb3N0IDIgdnJldiA8NywwLDEsMj4KKyAgMzYzNjM1NjU5NVUsCS8vIDwwLDcsMiwyPjogQ29zdCA0IHZleHQxIDwyLDAsNywyPiwgPDIsMCw3LDI+CisgIDI3Mjc3MTE5MTZVLAkvLyA8MCw3LDIsMz46IENvc3QgMyB2ZXh0MyA8NywyLDMsMD4sIDw3LDIsMywwPgorICAyNTg2NTA0NTAyVSwJLy8gPDAsNywyLDQ+OiBDb3N0IDMgdmV4dDEgPDYsMCw3LDI+LCBSSFMKKyAgMjYzMjU2NjYwNlUsCS8vIDwwLDcsMiw1PjogQ29zdCAzIHZleHQyIDwyLDUsMCw3PiwgPDIsNSwwLDc+CisgIDI1ODY1MDU1NTlVLAkvLyA8MCw3LDIsNj46IENvc3QgMyB2ZXh0MSA8NiwwLDcsMj4sIDw2LDAsNywyPgorICAzMDIwNzQwMjA0VSwJLy8gPDAsNywyLDc+OiBDb3N0IDMgdnRybmwgTEhTLCA8Nyw3LDcsNz4KKyAgMTE4MzI2NTg0OVUsCS8vIDwwLDcsMix1PjogQ29zdCAyIHZyZXYgPDcsMCx1LDI+CisgIDM3MDEwMDAzNDJVLAkvLyA8MCw3LDMsMD46IENvc3QgNCB2ZXh0MiA8MSw2LDAsNz4sIDwzLDAsMSwyPgorICAzNzA2MzA4ODQ5VSwJLy8gPDAsNywzLDE+OiBDb3N0IDQgdmV4dDIgPDIsNSwwLDc+LCA8MywxLDIsMz4KKyAgMzMzMDMxNTI2OFUsCS8vIDwwLDcsMywyPjogQ29zdCA0IHZyZXYgPDcsMCwyLDM+CisgIDM3MDYzMDkwMjBVLAkvLyA8MCw3LDMsMz46IENvc3QgNCB2ZXh0MiA8Miw1LDAsNz4sIDwzLDMsMywzPgorICAzNzA2MzA5MTIyVSwJLy8gPDAsNywzLDQ+OiBDb3N0IDQgdmV4dDIgPDIsNSwwLDc+LCA8Myw0LDUsNj4KKyAgMzcxMjI4MTEyN1UsCS8vIDwwLDcsMyw1PjogQ29zdCA0IHZleHQyIDwzLDUsMCw3PiwgPDMsNSwwLDc+CisgIDI2MzkyMDI5MzZVLAkvLyA8MCw3LDMsNj46IENvc3QgMyB2ZXh0MiA8Myw2LDAsNz4sIDwzLDYsMCw3PgorICAzODAyNDEyMzIxVSwJLy8gPDAsNywzLDc+OiBDb3N0IDQgdmV4dDMgPDcsMyw3LDA+LCA8NywzLDcsMD4KKyAgMjY0MDUzMDIwMlUsCS8vIDwwLDcsMyx1PjogQ29zdCAzIHZleHQyIDwzLHUsMCw3PiwgPDMsdSwwLDc+CisgIDM2NTQyODc0NjJVLAkvLyA8MCw3LDQsMD46IENvc3QgNCB2ZXh0MSA8NSwwLDcsND4sIExIUworICAyMjU2NTA3OTAwVSwJLy8gPDAsNyw0LDE+OiBDb3N0IDMgdnJldiA8NywwLDEsND4KKyAgMjI1NjU4MTYzN1UsCS8vIDwwLDcsNCwyPjogQ29zdCAzIHZyZXYgPDcsMCwyLDQ+CisgIDM2NjAyNjIwMDhVLAkvLyA8MCw3LDQsMz46IENvc3QgNCB2ZXh0MSA8NiwwLDcsND4sIDwzLDYsMCw3PgorICAzNzg2NDEzNDA1VSwJLy8gPDAsNyw0LDQ+OiBDb3N0IDQgdmV4dDMgPDQsNiw2LDA+LCA8Nyw0LDQsNj4KKyAgMjYzMjU2ODExOFUsCS8vIDwwLDcsNCw1PjogQ29zdCAzIHZleHQyIDwyLDUsMCw3PiwgUkhTCisgIDM3MTg5MTc0NTdVLAkvLyA8MCw3LDQsNj46IENvc3QgNCB2ZXh0MiA8NCw2LDAsNz4sIDw0LDYsMCw3PgorICAzNzg3MDAzMjU1VSwJLy8gPDAsNyw0LDc+OiBDb3N0IDQgdmV4dDMgPDQsNyw1LDA+LCA8Nyw0LDcsNT4KKyAgMjYzMjU2ODM2MVUsCS8vIDwwLDcsNCx1PjogQ29zdCAzIHZleHQyIDwyLDUsMCw3PiwgUkhTCisgIDM3MDYzMTAyNjhVLAkvLyA8MCw3LDUsMD46IENvc3QgNCB2ZXh0MiA8Miw1LDAsNz4sIDw1LDAsNywwPgorICAzNzkyNDU5MTU2VSwJLy8gPDAsNyw1LDE+OiBDb3N0IDQgdmV4dDMgPDUsNiw3LDA+LCA8Nyw1LDEsNz4KKyAgMzMzMDMzMTY1NFUsCS8vIDwwLDcsNSwyPjogQ29zdCA0IHZyZXYgPDcsMCwyLDU+CisgIDM3MjI4OTkyNTVVLAkvLyA8MCw3LDUsMz46IENvc3QgNCB2ZXh0MiA8NSwzLDAsNz4sIDw1LDMsMCw3PgorICAyMjU2NzM3MzA0VSwJLy8gPDAsNyw1LDQ+OiBDb3N0IDMgdnJldiA8NywwLDQsNT4KKyAgMzcyNDIyNjUyMVUsCS8vIDwwLDcsNSw1PjogQ29zdCA0IHZleHQyIDw1LDUsMCw3PiwgPDUsNSwwLDc+CisgIDI3MTg3MTczNzdVLAkvLyA8MCw3LDUsNj46IENvc3QgMyB2ZXh0MyA8NSw2LDcsMD4sIDw3LDUsNiw3PgorICAyNzI5OTk3NzYzVSwJLy8gPDAsNyw1LDc+OiBDb3N0IDMgdmV4dDMgPDcsNSw3LDA+LCA8Nyw1LDcsMD4KKyAgMjcyMDA0NDQ5OVUsCS8vIDwwLDcsNSx1PjogQ29zdCAzIHZleHQzIDw1LHUsNywwPiwgPDcsNSx1LDc+CisgIDM3MTI5NDY1MTdVLAkvLyA8MCw3LDYsMD46IENvc3QgNCB2ZXh0MiA8Myw2LDAsNz4sIDw2LDAsNywwPgorICAyMjU2NTI0Mjg2VSwJLy8gPDAsNyw2LDE+OiBDb3N0IDMgdnJldiA8NywwLDEsNj4KKyAgMzc5MjQ1OTI0NlUsCS8vIDwwLDcsNiwyPjogQ29zdCA0IHZleHQzIDw1LDYsNywwPiwgPDcsNiwyLDc+CisgIDM3OTY0NDA1NjdVLAkvLyA8MCw3LDYsMz46IENvc3QgNCB2ZXh0MyA8NiwzLDcsMD4sIDw3LDYsMyw3PgorICAzNjU0MzA3MTI2VSwJLy8gPDAsNyw2LDQ+OiBDb3N0IDQgdmV4dDEgPDUsMCw3LDY+LCBSSFMKKyAgMjY1NjQ1NzM5NFUsCS8vIDwwLDcsNiw1PjogQ29zdCAzIHZleHQyIDw2LDUsMCw3PiwgPDYsNSwwLDc+CisgIDM3OTI0NTkyODFVLAkvLyA8MCw3LDYsNj46IENvc3QgNCB2ZXh0MyA8NSw2LDcsMD4sIDw3LDYsNiw2PgorICAyNzMwNjYxMzk2VSwJLy8gPDAsNyw2LDc+OiBDb3N0IDMgdmV4dDMgPDcsNiw3LDA+LCA8Nyw2LDcsMD4KKyAgMjY1ODQ0ODI5M1UsCS8vIDwwLDcsNix1PjogQ29zdCAzIHZleHQyIDw2LHUsMCw3PiwgPDYsdSwwLDc+CisgIDM3ODcwMDM0MzFVLAkvLyA8MCw3LDcsMD46IENvc3QgNCB2ZXh0MyA8NCw3LDUsMD4sIDw3LDcsMCwxPgorICAzNjU0MzEyODU0VSwJLy8gPDAsNyw3LDE+OiBDb3N0IDQgdmV4dDEgPDUsMCw3LDc+LCA8MSwyLDMsMD4KKyAgMzY1NDMxMzQ0NlUsCS8vIDwwLDcsNywyPjogQ29zdCA0IHZleHQxIDw1LDAsNyw3PiwgPDIsMCw1LDc+CisgIDM4MDQ3NzE5MDVVLAkvLyA8MCw3LDcsMz46IENvc3QgNCB2ZXh0MyA8Nyw3LDMsMD4sIDw3LDcsMywwPgorICAzNjU0MzE1MzE4VSwJLy8gPDAsNyw3LDQ+OiBDb3N0IDQgdmV4dDEgPDUsMCw3LDc+LCBSSFMKKyAgMzY1NDMxNTY1MVUsCS8vIDwwLDcsNyw1PjogQ29zdCA0IHZleHQxIDw1LDAsNyw3PiwgPDUsMCw3LDc+CisgIDM2NjAyODgzNDhVLAkvLyA8MCw3LDcsNj46IENvc3QgNCB2ZXh0MSA8NiwwLDcsNz4sIDw2LDAsNyw3PgorICAyNzE4NzE3NTQ4VSwJLy8gPDAsNyw3LDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDA+LCA8Nyw3LDcsNz4KKyAgMjY2NDQyMDk5MFUsCS8vIDwwLDcsNyx1PjogQ29zdCAzIHZleHQyIDw3LHUsMCw3PiwgPDcsdSwwLDc+CisgIDIyNTY0NjY5MzVVLAkvLyA8MCw3LHUsMD46IENvc3QgMyB2cmV2IDw3LDAsMCx1PgorICAxMTgyNzk4ODQ4VSwJLy8gPDAsNyx1LDE+OiBDb3N0IDIgdnJldiA8NywwLDEsdT4KKyAgMjI1NjYxNDQwOVUsCS8vIDwwLDcsdSwyPjogQ29zdCAzIHZyZXYgPDcsMCwyLHU+CisgIDI3MzE2OTM3MTRVLAkvLyA8MCw3LHUsMz46IENvc3QgMyB2ZXh0MyA8Nyx1LDMsMD4sIDw3LHUsMywwPgorICAyMjU2NzYxODgzVSwJLy8gPDAsNyx1LDQ+OiBDb3N0IDMgdnJldiA8NywwLDQsdT4KKyAgMjYzMjU3MTAzNFUsCS8vIDwwLDcsdSw1PjogQ29zdCAzIHZleHQyIDwyLDUsMCw3PiwgUkhTCisgIDI2NjkwNjY0MjFVLAkvLyA8MCw3LHUsNj46IENvc3QgMyB2ZXh0MiA8dSw2LDAsNz4sIDx1LDYsMCw3PgorICAyNzMxOTg4NjYyVSwJLy8gPDAsNyx1LDc+OiBDb3N0IDMgdmV4dDMgPDcsdSw3LDA+LCA8Nyx1LDcsMD4KKyAgMTE4MzMxNTAwN1UsCS8vIDwwLDcsdSx1PjogQ29zdCAyIHZyZXYgPDcsMCx1LHU+CisgIDEzNTA1MzQxNFUsCS8vIDwwLHUsMCwwPjogQ29zdCAxIHZkdXAwIExIUworICAxNTQ0ODk2NjE0VSwJLy8gPDAsdSwwLDE+OiBDb3N0IDIgdmV4dDIgPDAsMiwwLHU+LCBMSFMKKyAgMTY3ODk5OTY1NFUsCS8vIDwwLHUsMCwyPjogQ29zdCAyIHZ1enBsIExIUywgTEhTCisgIDI2OTE4ODA2NzdVLAkvLyA8MCx1LDAsMz46IENvc3QgMyB2ZXh0MyA8MSwyLDMsMD4sIDx1LDAsMywyPgorICAxNDc2OTg4MjE0VSwJLy8gPDAsdSwwLDQ+OiBDb3N0IDIgdmV4dDEgPDAsMCx1LDA+LCBSSFMKKyAgMjcxODc5MTQxOVUsCS8vIDwwLHUsMCw1PjogQ29zdCAzIHZleHQzIDw1LDYsdSwwPiwgPHUsMCw1LDY+CisgIDMwMjEyNDg2NjZVLAkvLyA8MCx1LDAsNj46IENvc3QgMyB2dHJubCA8MCwyLDAsMj4sIFJIUworICAyNTkyNTM1NjA3VSwJLy8gPDAsdSwwLDc+OiBDb3N0IDMgdmV4dDEgPDcsMCx1LDA+LCA8NywwLHUsMD4KKyAgMTM1MDUzNDE0VSwJLy8gPDAsdSwwLHU+OiBDb3N0IDEgdmR1cDAgTEhTCisgIDE0NzY5OTMwOTdVLAkvLyA8MCx1LDEsMD46IENvc3QgMiB2ZXh0MSA8MCwwLHUsMT4sIDwwLDAsdSwxPgorICAxODEyNzgwODQ2VSwJLy8gPDAsdSwxLDE+OiBDb3N0IDIgdnppcGwgTEhTLCBMSFMKKyAgMTYxODEzODkyNlUsCS8vIDwwLHUsMSwyPjogQ29zdCAyIHZleHQzIDwxLDIsMywwPiwgTEhTCisgIDI3NTI3NDIxMzRVLAkvLyA8MCx1LDEsMz46IENvc3QgMyB2dXpwbCBMSFMsIDwxLDAsMywyPgorICAxNDc2OTk2NDA2VSwJLy8gPDAsdSwxLDQ+OiBDb3N0IDIgdmV4dDEgPDAsMCx1LDE+LCBSSFMKKyAgMTgxMjc4MTIxMFUsCS8vIDwwLHUsMSw1PjogQ29zdCAyIHZ6aXBsIExIUywgUkhTCisgIDI4ODcwMDY0MTZVLAkvLyA8MCx1LDEsNj46IENvc3QgMyB2emlwbCBMSFMsIDx1LDYsMyw3PgorICAyOTY2NzM2MjAwVSwJLy8gPDAsdSwxLDc+OiBDb3N0IDMgdnppcHIgPDIsMywwLDE+LCBSSFMKKyAgMTgxMjc4MTQxM1UsCS8vIDwwLHUsMSx1PjogQ29zdCAyIHZ6aXBsIExIUywgTEhTCisgIDE0ODI5NzMyODZVLAkvLyA8MCx1LDIsMD46IENvc3QgMiB2ZXh0MSA8MSwwLHUsMj4sIExIUworICAxNDgyOTczOTg3VSwJLy8gPDAsdSwyLDE+OiBDb3N0IDIgdmV4dDEgPDEsMCx1LDI+LCA8MSwwLHUsMj4KKyAgMTk0Njk5ODU3NFUsCS8vIDwwLHUsMiwyPjogQ29zdCAyIHZ0cm5sIExIUywgTEhTCisgIDgzNTU4NFUsCS8vIDwwLHUsMiwzPjogQ29zdCAwIGNvcHkgTEhTCisgIDE0ODI5NzY1NjZVLAkvLyA8MCx1LDIsND46IENvc3QgMiB2ZXh0MSA8MSwwLHUsMj4sIFJIUworICAzMDIwNzgxNjMxVSwJLy8gPDAsdSwyLDU+OiBDb3N0IDMgdnRybmwgTEhTLCA8dSw0LDUsNj4KKyAgMTk0Njk5ODkzOFUsCS8vIDwwLHUsMiw2PjogQ29zdCAyIHZ0cm5sIExIUywgUkhTCisgIDE1MTg4MTAxNjlVLAkvLyA8MCx1LDIsNz46IENvc3QgMiB2ZXh0MSA8NywwLHUsMj4sIDw3LDAsdSwyPgorICA4MzU1ODRVLAkvLyA8MCx1LDIsdT46IENvc3QgMCBjb3B5IExIUworICAyNjE4NjQwNTM0VSwJLy8gPDAsdSwzLDA+OiBDb3N0IDMgdmV4dDIgPDAsMiwwLHU+LCA8MywwLDEsMj4KKyAgMjc1Mjc0MzU3NFUsCS8vIDwwLHUsMywxPjogQ29zdCAzIHZ1enBsIExIUywgPDMsMCwxLDI+CisgIDI2MzY1NTY1OTdVLAkvLyA8MCx1LDMsMj46IENvc3QgMyB2ZXh0MiA8MywyLDAsdT4sIDwzLDIsMCx1PgorICAyNzUyNzQzODM2VSwJLy8gPDAsdSwzLDM+OiBDb3N0IDMgdnV6cGwgTEhTLCA8MywzLDMsMz4KKyAgMjYxODY0MDg5OFUsCS8vIDwwLHUsMyw0PjogQ29zdCAzIHZleHQyIDwwLDIsMCx1PiwgPDMsNCw1LDY+CisgIDI3NTI3NDM5MzhVLAkvLyA8MCx1LDMsNT46IENvc3QgMyB2dXpwbCBMSFMsIDwzLDQsNSw2PgorICAyNjM5MjAyOTM2VSwJLy8gPDAsdSwzLDY+OiBDb3N0IDMgdmV4dDIgPDMsNiwwLDc+LCA8Myw2LDAsNz4KKyAgMjYzOTg3NDc2MlUsCS8vIDwwLHUsMyw3PjogQ29zdCAzIHZleHQyIDwzLDcsMCx1PiwgPDMsNywwLHU+CisgIDI3NTI3NDM2MzdVLAkvLyA8MCx1LDMsdT46IENvc3QgMyB2dXpwbCBMSFMsIDwzLDAsdSwyPgorICAyNTYyNzAzNDYyVSwJLy8gPDAsdSw0LDA+OiBDb3N0IDMgdmV4dDEgPDIsMCx1LDQ+LCBMSFMKKyAgMjg4ODQ1NTk4MlUsCS8vIDwwLHUsNCwxPjogQ29zdCAzIHZ6aXBsIDwwLDQsMSw1PiwgTEhTCisgIDMwMjE1NzU5ODJVLAkvLyA8MCx1LDQsMj46IENvc3QgMyB2dHJubCA8MCwyLDQsNj4sIExIUworICAyNTY4Njc3NTkxVSwJLy8gPDAsdSw0LDM+OiBDb3N0IDMgdmV4dDEgPDMsMCx1LDQ+LCA8MywwLHUsND4KKyAgMjU2MjcwNjc0MlUsCS8vIDwwLHUsNCw0PjogQ29zdCAzIHZleHQxIDwyLDAsdSw0PiwgUkhTCisgIDE1NDQ4OTk4OTRVLAkvLyA8MCx1LDQsNT46IENvc3QgMiB2ZXh0MiA8MCwyLDAsdT4sIFJIUworICAxNjc5MDAyOTM0VSwJLy8gPDAsdSw0LDY+OiBDb3N0IDIgdnV6cGwgTEhTLCBSSFMKKyAgMjcxODcxODAzM1UsCS8vIDwwLHUsNCw3PjogQ29zdCAzIHZleHQzIDw1LDYsNywwPiwgPHUsNCw3LDY+CisgIDE2NzkwMDI5NTJVLAkvLyA8MCx1LDQsdT46IENvc3QgMiB2dXpwbCBMSFMsIFJIUworICAyNTY4NjgzNjIyVSwJLy8gPDAsdSw1LDA+OiBDb3N0IDMgdmV4dDEgPDMsMCx1LDU+LCBMSFMKKyAgMjU2ODY4NDQzOFUsCS8vIDwwLHUsNSwxPjogQ29zdCAzIHZleHQxIDwzLDAsdSw1PiwgPDEsMiwzLDA+CisgIDM3NjU2MjI5MDJVLAkvLyA8MCx1LDUsMj46IENvc3QgNCB2ZXh0MyA8MSwyLDMsMD4sIDx1LDUsMiw3PgorICAyNjkxODgxMDg3VSwJLy8gPDAsdSw1LDM+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDA+LCA8dSw1LDMsNz4KKyAgMjU2ODY4NjkwMlUsCS8vIDwwLHUsNSw0PjogQ29zdCAzIHZleHQxIDwzLDAsdSw1PiwgUkhTCisgIDI2NTA0OTI4OTBVLAkvLyA8MCx1LDUsNT46IENvc3QgMyB2ZXh0MiA8NSw1LDAsdT4sIDw1LDUsMCx1PgorICAxNjE4MTM5MjkwVSwJLy8gPDAsdSw1LDY+OiBDb3N0IDIgdmV4dDMgPDEsMiwzLDA+LCBSSFMKKyAgMjgyNDgzNDM1OFUsCS8vIDwwLHUsNSw3PjogQ29zdCAzIHZ1enByIDwxLDAsMyx1PiwgUkhTCisgIDE2MTgxMzkzMDhVLAkvLyA8MCx1LDUsdT46IENvc3QgMiB2ZXh0MyA8MSwyLDMsMD4sIFJIUworICAyNTkyNTc5Njg2VSwJLy8gPDAsdSw2LDA+OiBDb3N0IDMgdmV4dDEgPDcsMCx1LDY+LCBMSFMKKyAgMjI2MjQ5Njk4M1UsCS8vIDwwLHUsNiwxPjogQ29zdCAzIHZyZXYgPHUsMCwxLDY+CisgIDI2NTQ0NzQ2ODhVLAkvLyA8MCx1LDYsMj46IENvc3QgMyB2ZXh0MiA8NiwyLDAsdT4sIDw2LDIsMCx1PgorICAyNjkxODgxMTY4VSwJLy8gPDAsdSw2LDM+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDA+LCA8dSw2LDMsNz4KKyAgMjU5MjU4Mjk2NlUsCS8vIDwwLHUsNiw0PjogQ29zdCAzIHZleHQxIDw3LDAsdSw2PiwgUkhTCisgIDI2NTY0NjU1ODdVLAkvLyA8MCx1LDYsNT46IENvc3QgMyB2ZXh0MiA8Niw1LDAsdT4sIDw2LDUsMCx1PgorICAyNjU3MTI5MjIwVSwJLy8gPDAsdSw2LDY+OiBDb3N0IDMgdmV4dDIgPDYsNiwwLHU+LCA8Niw2LDAsdT4KKyAgMTU4NDA1MTAyOVUsCS8vIDwwLHUsNiw3PjogQ29zdCAyIHZleHQyIDw2LDcsMCx1PiwgPDYsNywwLHU+CisgIDE1ODQ3MTQ2NjJVLAkvLyA8MCx1LDYsdT46IENvc3QgMiB2ZXh0MiA8Nix1LDAsdT4sIDw2LHUsMCx1PgorICAyNTYyNzI4MDM4VSwJLy8gPDAsdSw3LDA+OiBDb3N0IDMgdmV4dDEgPDIsMCx1LDc+LCBMSFMKKyAgMjU2MjcyODg1NFUsCS8vIDwwLHUsNywxPjogQ29zdCAzIHZleHQxIDwyLDAsdSw3PiwgPDEsMiwzLDA+CisgIDI1NjI3Mjk0NzNVLAkvLyA8MCx1LDcsMj46IENvc3QgMyB2ZXh0MSA8MiwwLHUsNz4sIDwyLDAsdSw3PgorICAyNjYxMTExMDE4VSwJLy8gPDAsdSw3LDM+OiBDb3N0IDMgdmV4dDIgPDcsMywwLHU+LCA8NywzLDAsdT4KKyAgMjU2MjczMTMxOFUsCS8vIDwwLHUsNyw0PjogQ29zdCAzIHZleHQxIDwyLDAsdSw3PiwgUkhTCisgIDI3MTg3MTgyNThVLAkvLyA8MCx1LDcsNT46IENvc3QgMyB2ZXh0MyA8NSw2LDcsMD4sIDx1LDcsNSw2PgorICAyNTg2NjIwMjYxVSwJLy8gPDAsdSw3LDY+OiBDb3N0IDMgdmV4dDEgPDYsMCx1LDc+LCA8NiwwLHUsNz4KKyAgMjY1Nzc5MzY0NFUsCS8vIDwwLHUsNyw3PjogQ29zdCAzIHZleHQyIDw2LDcsMCx1PiwgPDcsNyw3LDc+CisgIDI1NjI3MzM4NzBVLAkvLyA8MCx1LDcsdT46IENvc3QgMyB2ZXh0MSA8MiwwLHUsNz4sIExIUworICAxMzUwNTM0MTRVLAkvLyA8MCx1LHUsMD46IENvc3QgMSB2ZHVwMCBMSFMKKyAgMTU0NDkwMjQ0NlUsCS8vIDwwLHUsdSwxPjogQ29zdCAyIHZleHQyIDwwLDIsMCx1PiwgTEhTCisgIDE2NzkwMDU0ODZVLAkvLyA8MCx1LHUsMj46IENvc3QgMiB2dXpwbCBMSFMsIExIUworICA4MzU1ODRVLAkvLyA8MCx1LHUsMz46IENvc3QgMCBjb3B5IExIUworICAxNDgzMDI1NzE4VSwJLy8gPDAsdSx1LDQ+OiBDb3N0IDIgdmV4dDEgPDEsMCx1LHU+LCBSSFMKKyAgMTU0NDkwMjgxMFUsCS8vIDwwLHUsdSw1PjogQ29zdCAyIHZleHQyIDwwLDIsMCx1PiwgUkhTCisgIDE2NzkwMDU4NTBVLAkvLyA8MCx1LHUsNj46IENvc3QgMiB2dXpwbCBMSFMsIFJIUworICAxNTE4ODU5MzI3VSwJLy8gPDAsdSx1LDc+OiBDb3N0IDIgdmV4dDEgPDcsMCx1LHU+LCA8NywwLHUsdT4KKyAgODM1NTg0VSwJLy8gPDAsdSx1LHU+OiBDb3N0IDAgY29weSBMSFMKKyAgMjY4OTc0NDg5NlUsCS8vIDwxLDAsMCwwPjogQ29zdCAzIHZleHQzIDwwLHUsMSwxPiwgPDAsMCwwLDA+CisgIDE2MTA2OTQ2NjZVLAkvLyA8MSwwLDAsMT46IENvc3QgMiB2ZXh0MyA8MCwwLDEsMT4sIDwwLDAsMSwxPgorICAyNjg5NzQ0OTE2VSwJLy8gPDEsMCwwLDI+OiBDb3N0IDMgdmV4dDMgPDAsdSwxLDE+LCA8MCwwLDIsMj4KKyAgMjYxOTMxMDMzMlUsCS8vIDwxLDAsMCwzPjogQ29zdCAzIHZleHQyIDwwLDMsMSwwPiwgPDAsMywxLDA+CisgIDI2ODQ2NTc3MDFVLAkvLyA8MSwwLDAsND46IENvc3QgMyB2ZXh0MyA8MCwwLDQsMT4sIDwwLDAsNCwxPgorICAyNjIwNjM3NTk4VSwJLy8gPDEsMCwwLDU+OiBDb3N0IDMgdmV4dDIgPDAsNSwxLDA+LCA8MCw1LDEsMD4KKyAgMzcwODk3NzY1NFUsCS8vIDwxLDAsMCw2PjogQ29zdCA0IHZleHQyIDwzLDAsMSwwPiwgPDAsNiwxLDc+CisgIDM2NjYzNTExNjhVLAkvLyA8MSwwLDAsNz46IENvc3QgNCB2ZXh0MSA8NywxLDAsMD4sIDw3LDEsMCwwPgorICAxNjExMjEwODI1VSwJLy8gPDEsMCwwLHU+OiBDb3N0IDIgdmV4dDMgPDAsMCx1LDE+LCA8MCwwLHUsMT4KKyAgMjU1Njc4MDY0NlUsCS8vIDwxLDAsMSwwPjogQ29zdCAzIHZleHQxIDwxLDEsMCwxPiwgTEhTCisgIDI1NTY3ODEzNTVVLAkvLyA8MSwwLDEsMT46IENvc3QgMyB2ZXh0MSA8MSwxLDAsMT4sIDwxLDEsMCwxPgorICAxNjE2MDAzMTc0VSwJLy8gPDEsMCwxLDI+OiBDb3N0IDIgdmV4dDMgPDAsdSwxLDE+LCBMSFMKKyAgMzY5MzA1Mjg4OFUsCS8vIDwxLDAsMSwzPjogQ29zdCA0IHZleHQyIDwwLDMsMSwwPiwgPDEsMywxLDM+CisgIDI1NTY3ODM5MjZVLAkvLyA8MSwwLDEsND46IENvc3QgMyB2ZXh0MSA8MSwxLDAsMT4sIFJIUworICAyNTgwNjcyMTQzVSwJLy8gPDEsMCwxLDU+OiBDb3N0IDMgdmV4dDEgPDUsMSwwLDE+LCA8NSwxLDAsMT4KKyAgMjcyNDgzOTU2NlUsCS8vIDwxLDAsMSw2PjogQ29zdCAzIHZleHQzIDw2LDcsMCwxPiwgPDAsMSw2LDc+CisgIDM2NTQ0MTUzNTRVLAkvLyA8MSwwLDEsNz46IENvc3QgNCB2ZXh0MSA8NSwxLDAsMT4sIDw3LDAsMSwyPgorICAxNjE2MDAzMjI4VSwJLy8gPDEsMCwxLHU+OiBDb3N0IDIgdmV4dDMgPDAsdSwxLDE+LCBMSFMKKyAgMjY4NTY5MDAxOVUsCS8vIDwxLDAsMiwwPjogQ29zdCAzIHZleHQzIDwwLDIsMCwxPiwgPDAsMiwwLDE+CisgIDI2ODU3NjM3NTZVLAkvLyA8MSwwLDIsMT46IENvc3QgMyB2ZXh0MyA8MCwyLDEsMT4sIDwwLDIsMSwxPgorICAyNjk4Mjk3NTI0VSwJLy8gPDEsMCwyLDI+OiBDb3N0IDMgdmV4dDMgPDIsMywwLDE+LCA8MCwyLDIsMD4KKyAgMjY4NTkxMTIzMFUsCS8vIDwxLDAsMiwzPjogQ29zdCAzIHZleHQzIDwwLDIsMywxPiwgPDAsMiwzLDE+CisgIDI2ODk3NDUxMDBVLAkvLyA8MSwwLDIsND46IENvc3QgMyB2ZXh0MyA8MCx1LDEsMT4sIDwwLDIsNCw2PgorICAzNzY0ODE0MDM4VSwJLy8gPDEsMCwyLDU+OiBDb3N0IDQgdmV4dDMgPDEsMSwxLDE+LCA8MCwyLDUsNz4KKyAgMjcyNDgzOTY0MFUsCS8vIDwxLDAsMiw2PjogQ29zdCAzIHZleHQzIDw2LDcsMCwxPiwgPDAsMiw2LDA+CisgIDI1OTI2MjU2NThVLAkvLyA8MSwwLDIsNz46IENvc3QgMyB2ZXh0MSA8NywxLDAsMj4sIDw3LDAsMSwyPgorICAyNjg2Mjc5OTE1VSwJLy8gPDEsMCwyLHU+OiBDb3N0IDMgdmV4dDMgPDAsMix1LDE+LCA8MCwyLHUsMT4KKyAgMzA4Nzg0MzMyOFUsCS8vIDwxLDAsMywwPjogQ29zdCAzIHZ0cm5yIExIUywgPDAsMCwwLDA+CisgIDMwODc4NDMzMzhVLAkvLyA8MSwwLDMsMT46IENvc3QgMyB2dHJuciBMSFMsIDwwLDAsMSwxPgorICA2Nzk0NDU1MFUsCS8vIDwxLDAsMywyPjogQ29zdCAxIHZyZXYgTEhTCisgIDI1Njg3NDMxMzVVLAkvLyA8MSwwLDMsMz46IENvc3QgMyB2ZXh0MSA8MywxLDAsMz4sIDwzLDEsMCwzPgorICAyNTYyNzcyMjc4VSwJLy8gPDEsMCwzLDQ+OiBDb3N0IDMgdmV4dDEgPDIsMSwwLDM+LCBSSFMKKyAgNDA5OTg1MDQ1NFUsCS8vIDwxLDAsMyw1PjogQ29zdCA0IHZ0cm5sIDwxLDAsMywyPiwgPDAsMiw1LDc+CisgIDM3MDQ5OTg1MzhVLAkvLyA8MSwwLDMsNj46IENvc3QgNCB2ZXh0MiA8MiwzLDEsMD4sIDwzLDYsMiw3PgorICAyNTkyNjMzOTIzVSwJLy8gPDEsMCwzLDc+OiBDb3N0IDMgdmV4dDEgPDcsMSwwLDM+LCA8NywxLDAsMz4KKyAgNjgzODY5NzJVLAkvLyA8MSwwLDMsdT46IENvc3QgMSB2cmV2IExIUworICAyNjIwNjQwMTQ2VSwJLy8gPDEsMCw0LDA+OiBDb3N0IDMgdmV4dDIgPDAsNSwxLDA+LCA8NCwwLDUsMT4KKyAgMjY4OTc0NTIzNFUsCS8vIDwxLDAsNCwxPjogQ29zdCAzIHZleHQzIDwwLHUsMSwxPiwgPDAsNCwxLDU+CisgIDI2ODk3NDUyNDRVLAkvLyA8MSwwLDQsMj46IENvc3QgMyB2ZXh0MyA8MCx1LDEsMT4sIDwwLDQsMiw2PgorICAzNzYwOTgwMzIwVSwJLy8gPDEsMCw0LDM+OiBDb3N0IDQgdmV4dDMgPDAsNCwzLDE+LCA8MCw0LDMsMT4KKyAgMzc2MTA1NDA1N1UsCS8vIDwxLDAsNCw0PjogQ29zdCA0IHZleHQzIDwwLDQsNCwxPiwgPDAsNCw0LDE+CisgIDI2MTkzMTM0NjJVLAkvLyA8MSwwLDQsNT46IENvc3QgMyB2ZXh0MiA8MCwzLDEsMD4sIFJIUworICAzNzYxMjAxNTMxVSwJLy8gPDEsMCw0LDY+OiBDb3N0IDQgdmV4dDMgPDAsNCw2LDE+LCA8MCw0LDYsMT4KKyAgMzY2NjM4Mzk0MFUsCS8vIDwxLDAsNCw3PjogQ29zdCA0IHZleHQxIDw3LDEsMCw0PiwgPDcsMSwwLDQ+CisgIDI2MTkzMTM3MDVVLAkvLyA8MSwwLDQsdT46IENvc3QgMyB2ZXh0MiA8MCwzLDEsMD4sIFJIUworICA0MDI5MzAwNzM2VSwJLy8gPDEsMCw1LDA+OiBDb3N0IDQgdnppcHIgPDAsNCwxLDU+LCA8MCwwLDAsMD4KKyAgMjg5NTI0OTUxMFUsCS8vIDwxLDAsNSwxPjogQ29zdCAzIHZ6aXBsIDwxLDUsMyw3PiwgTEhTCisgIDMwMjgyODc1OTBVLAkvLyA8MSwwLDUsMj46IENvc3QgMyB2dHJubCA8MSwzLDUsNz4sIExIUworICAzNjQyNTAxMzQ1VSwJLy8gPDEsMCw1LDM+OiBDb3N0IDQgdmV4dDEgPDMsMSwwLDU+LCA8MywxLDAsNT4KKyAgMjIxNTU5MjA1OFUsCS8vIDwxLDAsNSw0PjogQ29zdCAzIHZyZXYgPDAsMSw0LDU+CisgIDM3MjQyNDI5MDdVLAkvLyA8MSwwLDUsNT46IENvc3QgNCB2ZXh0MiA8NSw1LDEsMD4sIDw1LDUsMSwwPgorICAzNzI0OTA2NTQwVSwJLy8gPDEsMCw1LDY+OiBDb3N0IDQgdmV4dDIgPDUsNiwxLDA+LCA8NSw2LDEsMD4KKyAgMzkxMTExODEzNFUsCS8vIDwxLDAsNSw3PjogQ29zdCA0IHZ1enByIDwzLDEsMywwPiwgUkhTCisgIDMwMjgyODc2NDRVLAkvLyA8MSwwLDUsdT46IENvc3QgMyB2dHJubCA8MSwzLDUsNz4sIExIUworICAzNzYyMDg2Mzc1VSwJLy8gPDEsMCw2LDA+OiBDb3N0IDQgdmV4dDMgPDAsNiwwLDE+LCA8MCw2LDAsMT4KKyAgMjY5ODI5Nzg0NlUsCS8vIDwxLDAsNiwxPjogQ29zdCAzIHZleHQzIDwyLDMsMCwxPiwgPDAsNiwxLDc+CisgIDM3NjAwMjIwMTVVLAkvLyA8MSwwLDYsMj46IENvc3QgNCB2ZXh0MyA8MCwyLHUsMT4sIDwwLDYsMiw3PgorICAzNjQyNTA5NTM4VSwJLy8gPDEsMCw2LDM+OiBDb3N0IDQgdmV4dDEgPDMsMSwwLDY+LCA8MywxLDAsNj4KKyAgMzc2MjM4MTMyM1UsCS8vIDwxLDAsNiw0PjogQ29zdCA0IHZleHQzIDwwLDYsNCwxPiwgPDAsNiw0LDE+CisgIDM3MzAyMTU2MDRVLAkvLyA8MSwwLDYsNT46IENvc3QgNCB2ZXh0MiA8Niw1LDEsMD4sIDw2LDUsMSwwPgorICAzNzMwODc5MjM3VSwJLy8gPDEsMCw2LDY+OiBDb3N0IDQgdmV4dDIgPDYsNiwxLDA+LCA8Niw2LDEsMD4KKyAgMjY1NzgwMTA0NlUsCS8vIDwxLDAsNiw3PjogQ29zdCAzIHZleHQyIDw2LDcsMSwwPiwgPDYsNywxLDA+CisgIDI2NTg0NjQ2NzlVLAkvLyA8MSwwLDYsdT46IENvc3QgMyB2ZXh0MiA8Nix1LDEsMD4sIDw2LHUsMSwwPgorICAyNjU5MTI4MzEyVSwJLy8gPDEsMCw3LDA+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLDA+LCA8NywwLDEsMD4KKyAgNDA0Nzg5ODI3OFUsCS8vIDwxLDAsNywxPjogQ29zdCA0IHZ6aXByIDwzLDUsMSw3PiwgPDIsMywwLDE+CisgIDIyMTU0NjA5NzBVLAkvLyA8MSwwLDcsMj46IENvc3QgMyB2cmV2IDwwLDEsMiw3PgorICAzNzM0ODYxMDM1VSwJLy8gPDEsMCw3LDM+OiBDb3N0IDQgdmV4dDIgPDcsMywxLDA+LCA8NywzLDEsMD4KKyAgMzczMTU0MzM5OFUsCS8vIDwxLDAsNyw0PjogQ29zdCA0IHZleHQyIDw2LDcsMSwwPiwgPDcsNCw1LDY+CisgIDM3MzYxODgzMDFVLAkvLyA8MSwwLDcsNT46IENvc3QgNCB2ZXh0MiA8Nyw1LDEsMD4sIDw3LDUsMSwwPgorICAyNjYzMTEwMTEwVSwJLy8gPDEsMCw3LDY+OiBDb3N0IDMgdmV4dDIgPDcsNiwxLDA+LCA8Nyw2LDEsMD4KKyAgMzczMTU0MzY2MFUsCS8vIDwxLDAsNyw3PjogQ29zdCA0IHZleHQyIDw2LDcsMSwwPiwgPDcsNyw3LDc+CisgIDI2NjQ0MzczNzZVLAkvLyA8MSwwLDcsdT46IENvc3QgMyB2ZXh0MiA8Nyx1LDEsMD4sIDw3LHUsMSwwPgorICAzMDg3ODg0Mjg4VSwJLy8gPDEsMCx1LDA+OiBDb3N0IDMgdnRybnIgTEhTLCA8MCwwLDAsMD4KKyAgMTYxNjAwMzczMFUsCS8vIDwxLDAsdSwxPjogQ29zdCAyIHZleHQzIDwwLHUsMSwxPiwgPDAsdSwxLDE+CisgIDY3OTg1NTE1VSwJLy8gPDEsMCx1LDI+OiBDb3N0IDEgdnJldiBMSFMKKyAgMjY4OTg5MzAyOFUsCS8vIDwxLDAsdSwzPjogQ29zdCAzIHZleHQzIDwwLHUsMywxPiwgPDAsdSwzLDE+CisgIDI2ODk3NDU1ODZVLAkvLyA8MSwwLHUsND46IENvc3QgMyB2ZXh0MyA8MCx1LDEsMT4sIDwwLHUsNCw2PgorICAyNjE5MzE2Mzc4VSwJLy8gPDEsMCx1LDU+OiBDb3N0IDMgdmV4dDIgPDAsMywxLDA+LCBSSFMKKyAgMjY2OTA4MjgwN1UsCS8vIDwxLDAsdSw2PjogQ29zdCAzIHZleHQyIDx1LDYsMSwwPiwgPHUsNiwxLDA+CisgIDI1OTI2NzQ4ODhVLAkvLyA8MSwwLHUsNz46IENvc3QgMyB2ZXh0MSA8NywxLDAsdT4sIDw3LDEsMCx1PgorICA2ODQyNzkzN1UsCS8vIDwxLDAsdSx1PjogQ29zdCAxIHZyZXYgTEhTCisgIDE1NDM1ODU4MDJVLAkvLyA8MSwxLDAsMD46IENvc3QgMiB2ZXh0MiA8MCwwLDEsMT4sIDwwLDAsMSwxPgorICAxNTQ4ODk0MzEwVSwJLy8gPDEsMSwwLDE+OiBDb3N0IDIgdmV4dDIgPDAsdSwxLDE+LCBMSFMKKyAgMjYxODY1NDg5MlUsCS8vIDwxLDEsMCwyPjogQ29zdCAzIHZleHQyIDwwLDIsMSwxPiwgPDAsMiwxLDE+CisgIDI2ODk3NDU2NTRVLAkvLyA8MSwxLDAsMz46IENvc3QgMyB2ZXh0MyA8MCx1LDEsMT4sIDwxLDAsMywyPgorICAyNjIyNjM2MzcwVSwJLy8gPDEsMSwwLDQ+OiBDb3N0IDMgdmV4dDIgPDAsdSwxLDE+LCA8MCw0LDEsNT4KKyAgMjYyMDY0NTc5MVUsCS8vIDwxLDEsMCw1PjogQ29zdCAzIHZleHQyIDwwLDUsMSwxPiwgPDAsNSwxLDE+CisgIDM2OTYzNzgzNjdVLAkvLyA8MSwxLDAsNj46IENvc3QgNCB2ZXh0MiA8MCx1LDEsMT4sIDwwLDYsMiw3PgorICAzNjY2NDI0OTA1VSwJLy8gPDEsMSwwLDc+OiBDb3N0IDQgdmV4dDEgPDcsMSwxLDA+LCA8NywxLDEsMD4KKyAgMTU0ODg5NDg2NlUsCS8vIDwxLDEsMCx1PjogQ29zdCAyIHZleHQyIDwwLHUsMSwxPiwgPDAsdSwxLDE+CisgIDE0ODMxMTI1NTBVLAkvLyA8MSwxLDEsMD46IENvc3QgMiB2ZXh0MSA8MSwxLDEsMT4sIExIUworICAyMDIxNjIyNzhVLAkvLyA8MSwxLDEsMT46IENvc3QgMSB2ZHVwMSBMSFMKKyAgMjYyMjYzNjk1MFUsCS8vIDwxLDEsMSwyPjogQ29zdCAzIHZleHQyIDwwLHUsMSwxPiwgPDEsMiwzLDA+CisgIDI2MjI2MzcwMTZVLAkvLyA8MSwxLDEsMz46IENvc3QgMyB2ZXh0MiA8MCx1LDEsMT4sIDwxLDMsMSwzPgorICAxNDgzMTE1ODMwVSwJLy8gPDEsMSwxLDQ+OiBDb3N0IDIgdmV4dDEgPDEsMSwxLDE+LCBSSFMKKyAgMjYyMjYzNzIwMFUsCS8vIDwxLDEsMSw1PjogQ29zdCAzIHZleHQyIDwwLHUsMSwxPiwgPDEsNSwzLDc+CisgIDI2MjI2MzcyNjNVLAkvLyA8MSwxLDEsNj46IENvc3QgMyB2ZXh0MiA8MCx1LDEsMT4sIDwxLDYsMSw3PgorICAyNTkyNjkxMjc0VSwJLy8gPDEsMSwxLDc+OiBDb3N0IDMgdmV4dDEgPDcsMSwxLDE+LCA8NywxLDEsMT4KKyAgMjAyMTYyMjc4VSwJLy8gPDEsMSwxLHU+OiBDb3N0IDEgdmR1cDEgTEhTCisgIDI1NTA4OTA1ODhVLAkvLyA8MSwxLDIsMD46IENvc3QgMyB2ZXh0MSA8MCwxLDEsMj4sIDwwLDEsMSwyPgorICAyNjE3MzI5MTgzVSwJLy8gPDEsMSwyLDE+OiBDb3N0IDMgdmV4dDIgPDAsMCwxLDE+LCA8MiwxLDMsMT4KKyAgMjYyMjYzNzY3MlUsCS8vIDwxLDEsMiwyPjogQ29zdCAzIHZleHQyIDwwLHUsMSwxPiwgPDIsMiwyLDI+CisgIDI2MjI2Mzc3MzRVLAkvLyA8MSwxLDIsMz46IENvc3QgMyB2ZXh0MiA8MCx1LDEsMT4sIDwyLDMsMCwxPgorICAyNTUwODkzODc4VSwJLy8gPDEsMSwyLDQ+OiBDb3N0IDMgdmV4dDEgPDAsMSwxLDI+LCBSSFMKKyAgMzY5NjM3OTc0NFUsCS8vIDwxLDEsMiw1PjogQ29zdCA0IHZleHQyIDwwLHUsMSwxPiwgPDIsNSwyLDc+CisgIDI2MjI2MzgwMTBVLAkvLyA8MSwxLDIsNj46IENvc3QgMyB2ZXh0MiA8MCx1LDEsMT4sIDwyLDYsMyw3PgorICAzODA0NTU0MTcwVSwJLy8gPDEsMSwyLDc+OiBDb3N0IDQgdmV4dDMgPDcsNywwLDE+LCA8MSwyLDcsMD4KKyAgMjYyMjYzODEzOVUsCS8vIDwxLDEsMix1PjogQ29zdCAzIHZleHQyIDwwLHUsMSwxPiwgPDIsdSwwLDE+CisgIDI2MjI2MzgyMzBVLAkvLyA8MSwxLDMsMD46IENvc3QgMyB2ZXh0MiA8MCx1LDEsMT4sIDwzLDAsMSwyPgorICAzMDg3ODQ0MTQ4VSwJLy8gPDEsMSwzLDE+OiBDb3N0IDMgdnRybnIgTEhTLCA8MSwxLDEsMT4KKyAgNDE2MTU4NTI0NFUsCS8vIDwxLDEsMywyPjogQ29zdCA0IHZ0cm5yIExIUywgPDAsMSwxLDI+CisgIDIwMTQxMDE2MDZVLAkvLyA8MSwxLDMsMz46IENvc3QgMiB2dHJuciBMSFMsIExIUworICAyNjIyNjM4NTk0VSwJLy8gPDEsMSwzLDQ+OiBDb3N0IDMgdmV4dDIgPDAsdSwxLDE+LCA8Myw0LDUsNj4KKyAgMjY4OTc0NTkyMFUsCS8vIDwxLDEsMyw1PjogQ29zdCAzIHZleHQzIDwwLHUsMSwxPiwgPDEsMyw1LDc+CisgIDM3NjM0ODc3NTNVLAkvLyA8MSwxLDMsNj46IENvc3QgNCB2ZXh0MyA8MCx1LDEsMT4sIDwxLDMsNiw3PgorICAyNTkyNzA3NjYwVSwJLy8gPDEsMSwzLDc+OiBDb3N0IDMgdmV4dDEgPDcsMSwxLDM+LCA8NywxLDEsMz4KKyAgMjAxNDEwMTYxMVUsCS8vIDwxLDEsMyx1PjogQ29zdCAyIHZ0cm5yIExIUywgTEhTCisgIDI1NTY4Nzg5NTBVLAkvLyA8MSwxLDQsMD46IENvc3QgMyB2ZXh0MSA8MSwxLDEsND4sIExIUworICAyMjIxMzM1MzUxVSwJLy8gPDEsMSw0LDE+OiBDb3N0IDMgdnJldiA8MSwxLDEsND4KKyAgMzY5NjM4MDk4OFUsCS8vIDwxLDEsNCwyPjogQ29zdCA0IHZleHQyIDwwLHUsMSwxPiwgPDQsMiw2LDA+CisgIDM3NjM0ODc4MDVVLAkvLyA8MSwxLDQsMz46IENvc3QgNCB2ZXh0MyA8MCx1LDEsMT4sIDwxLDQsMyw1PgorICAyNTU2ODgyMjMwVSwJLy8gPDEsMSw0LDQ+OiBDb3N0IDMgdmV4dDEgPDEsMSwxLDQ+LCBSSFMKKyAgMTU0ODg5NzU5MFUsCS8vIDwxLDEsNCw1PjogQ29zdCAyIHZleHQyIDwwLHUsMSwxPiwgUkhTCisgIDI3NTgxODQyNDZVLAkvLyA8MSwxLDQsNj46IENvc3QgMyB2dXpwbCA8MSwxLDEsMT4sIFJIUworICAzNjY2NDU3Njc3VSwJLy8gPDEsMSw0LDc+OiBDb3N0IDQgdmV4dDEgPDcsMSwxLDQ+LCA8NywxLDEsND4KKyAgMTU0ODg5NzgzM1UsCS8vIDwxLDEsNCx1PjogQ29zdCAyIHZleHQyIDwwLHUsMSwxPiwgUkhTCisgIDI2OTM2NTM2MTVVLAkvLyA8MSwxLDUsMD46IENvc3QgMyB2ZXh0MyA8MSw1LDAsMT4sIDwxLDUsMCwxPgorICAyNjE3MzMxNDA4VSwJLy8gPDEsMSw1LDE+OiBDb3N0IDMgdmV4dDIgPDAsMCwxLDE+LCA8NSwxLDcsMz4KKyAgNDAyOTMwMjkzNFUsCS8vIDwxLDEsNSwyPjogQ29zdCA0IHZ6aXByIDwwLDQsMSw1PiwgPDMsMCwxLDI+CisgIDI2ODk3NDYwNjRVLAkvLyA8MSwxLDUsMz46IENvc3QgMyB2ZXh0MyA8MCx1LDEsMT4sIDwxLDUsMyw3PgorICAyMjIxNTY0NzU1VSwJLy8gPDEsMSw1LDQ+OiBDb3N0IDMgdnJldiA8MSwxLDQsNT4KKyAgMjk1NTU1OTI1MFUsCS8vIDwxLDEsNSw1PjogQ29zdCAzIHZ6aXByIDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDI2MTczMzE4MTBVLAkvLyA8MSwxLDUsNj46IENvc3QgMyB2ZXh0MiA8MCwwLDEsMT4sIDw1LDYsNywwPgorICAyODI1MjkzMTEwVSwJLy8gPDEsMSw1LDc+OiBDb3N0IDMgdnV6cHIgPDEsMSwxLDE+LCBSSFMKKyAgMjY4OTc0NjEwOVUsCS8vIDwxLDEsNSx1PjogQ29zdCAzIHZleHQzIDwwLHUsMSwxPiwgPDEsNSx1LDc+CisgIDM2OTYzODIyNDFVLAkvLyA8MSwxLDYsMD46IENvc3QgNCB2ZXh0MiA8MCx1LDEsMT4sIDw2LDAsMSwyPgorICAyNjg5NzQ2MTI3VSwJLy8gPDEsMSw2LDE+OiBDb3N0IDMgdmV4dDMgPDAsdSwxLDE+LCA8MSw2LDEsNz4KKyAgMjYxNzMzMjIxOFUsCS8vIDwxLDEsNiwyPjogQ29zdCAzIHZleHQyIDwwLDAsMSwxPiwgPDYsMiw3LDM+CisgIDM3NjM0ODc5NjlVLAkvLyA8MSwxLDYsMz46IENvc3QgNCB2ZXh0MyA8MCx1LDEsMT4sIDwxLDYsMyw3PgorICAzNjk2MzgyNjA1VSwJLy8gPDEsMSw2LDQ+OiBDb3N0IDQgdmV4dDIgPDAsdSwxLDE+LCA8Niw0LDUsNj4KKyAgNDAyOTMwOTI2NlUsCS8vIDwxLDEsNiw1PjogQ29zdCA0IHZ6aXByIDwwLDQsMSw2PiwgPDAsNCwxLDU+CisgIDI2MTczMzI1MzZVLAkvLyA8MSwxLDYsNj46IENvc3QgMyB2ZXh0MiA8MCwwLDEsMT4sIDw2LDYsNiw2PgorICAyNzI0ODQwNzAyVSwJLy8gPDEsMSw2LDc+OiBDb3N0IDMgdmV4dDMgPDYsNywwLDE+LCA8MSw2LDcsMD4KKyAgMjcyNTUwNDI2M1UsCS8vIDwxLDEsNix1PjogQ29zdCAzIHZleHQzIDw2LHUsMCwxPiwgPDEsNix1LDA+CisgIDI2MTczMzI3MjBVLAkvLyA8MSwxLDcsMD46IENvc3QgMyB2ZXh0MiA8MCwwLDEsMT4sIDw3LDAsMCwxPgorICAyNjU5ODAwMTM4VSwJLy8gPDEsMSw3LDE+OiBDb3N0IDMgdmV4dDIgPDcsMSwxLDE+LCA8NywxLDEsMT4KKyAgMzY5MTA3NDcxN1UsCS8vIDwxLDEsNywyPjogQ29zdCA0IHZleHQyIDwwLDAsMSwxPiwgPDcsMiwxLDM+CisgIDQxNjc4MTExNzRVLAkvLyA8MSwxLDcsMz46IENvc3QgNCB2dHJuciA8MSwxLDUsNz4sIExIUworICAyNjE3MzMzMDk0VSwJLy8gPDEsMSw3LDQ+OiBDb3N0IDMgdmV4dDIgPDAsMCwxLDE+LCA8Nyw0LDUsNj4KKyAgMzI5NTM5NjcwMlUsCS8vIDwxLDEsNyw1PjogQ29zdCA0IHZyZXYgPDEsMSw1LDc+CisgIDM4MDM4OTEwMTRVLAkvLyA8MSwxLDcsNj46IENvc3QgNCB2ZXh0MyA8Nyw2LDAsMT4sIDwxLDcsNiwwPgorICAyNjE3MzMzMzU2VSwJLy8gPDEsMSw3LDc+OiBDb3N0IDMgdmV4dDIgPDAsMCwxLDE+LCA8Nyw3LDcsNz4KKyAgMjY1OTgwMDEzOFUsCS8vIDwxLDEsNyx1PjogQ29zdCAzIHZleHQyIDw3LDEsMSwxPiwgPDcsMSwxLDE+CisgIDE0ODMxMTI1NTBVLAkvLyA8MSwxLHUsMD46IENvc3QgMiB2ZXh0MSA8MSwxLDEsMT4sIExIUworICAyMDIxNjIyNzhVLAkvLyA8MSwxLHUsMT46IENvc3QgMSB2ZHVwMSBMSFMKKyAgMjYyMjY0MjA1NlUsCS8vIDwxLDEsdSwyPjogQ29zdCAzIHZleHQyIDwwLHUsMSwxPiwgPHUsMiwzLDM+CisgIDIwMTQxNDI1NjZVLAkvLyA8MSwxLHUsMz46IENvc3QgMiB2dHJuciBMSFMsIExIUworICAxNDgzMTE1ODMwVSwJLy8gPDEsMSx1LDQ+OiBDb3N0IDIgdmV4dDEgPDEsMSwxLDE+LCBSSFMKKyAgMTU0ODkwMDUwNlUsCS8vIDwxLDEsdSw1PjogQ29zdCAyIHZleHQyIDwwLHUsMSwxPiwgUkhTCisgIDI2MjI2NDIzODRVLAkvLyA8MSwxLHUsNj46IENvc3QgMyB2ZXh0MiA8MCx1LDEsMT4sIDx1LDYsMyw3PgorICAyODI1MjkzMzUzVSwJLy8gPDEsMSx1LDc+OiBDb3N0IDMgdnV6cHIgPDEsMSwxLDE+LCBSSFMKKyAgMjAyMTYyMjc4VSwJLy8gPDEsMSx1LHU+OiBDb3N0IDEgdmR1cDEgTEhTCisgIDI2MzUyNTE3MTJVLAkvLyA8MSwyLDAsMD46IENvc3QgMyB2ZXh0MiA8MywwLDEsMj4sIDwwLDAsMCwwPgorICAxNTYxNTA5OTkwVSwJLy8gPDEsMiwwLDE+OiBDb3N0IDIgdmV4dDIgPDMsMCwxLDI+LCBMSFMKKyAgMjYxODY2MzA4NVUsCS8vIDwxLDIsMCwyPjogQ29zdCAzIHZleHQyIDwwLDIsMSwyPiwgPDAsMiwxLDI+CisgIDI2OTY1MjkzNThVLAkvLyA8MSwyLDAsMz46IENvc3QgMyB2ZXh0MyA8MiwwLDMsMT4sIDwyLDAsMywxPgorICAyNjM1MjUyMDUwVSwJLy8gPDEsMiwwLDQ+OiBDb3N0IDMgdmV4dDIgPDMsMCwxLDI+LCA8MCw0LDEsNT4KKyAgMzc2OTUzMzkyNlUsCS8vIDwxLDIsMCw1PjogQ29zdCA0IHZleHQzIDwxLHUsMiwxPiwgPDIsMCw1LDc+CisgIDI2MjEzMTc2MTdVLAkvLyA8MSwyLDAsNj46IENvc3QgMyB2ZXh0MiA8MCw2LDEsMj4sIDwwLDYsMSwyPgorICAyNjU5MTQwMTcwVSwJLy8gPDEsMiwwLDc+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLDI+LCA8MCw3LDIsMT4KKyAgMTU2MTUxMDU1N1UsCS8vIDwxLDIsMCx1PjogQ29zdCAyIHZleHQyIDwzLDAsMSwyPiwgTEhTCisgIDI2MjMzMDg1MTZVLAkvLyA8MSwyLDEsMD46IENvc3QgMyB2ZXh0MiA8MSwwLDEsMj4sIDwxLDAsMSwyPgorICAyNjM1MjUyNTMyVSwJLy8gPDEsMiwxLDE+OiBDb3N0IDMgdmV4dDIgPDMsMCwxLDI+LCA8MSwxLDEsMT4KKyAgMjYzMTI3MTMxOFUsCS8vIDwxLDIsMSwyPjogQ29zdCAzIHZleHQyIDwyLDMsMSwyPiwgPDEsMiwzLDA+CisgIDI5NTgxODA0NTRVLAkvLyA8MSwyLDEsMz46IENvc3QgMyB2emlwciA8MCx1LDEsMT4sIExIUworICAyNTUwOTU5NDE0VSwJLy8gPDEsMiwxLDQ+OiBDb3N0IDMgdmV4dDEgPDAsMSwyLDE+LCBSSFMKKyAgMjYzNTI1Mjg4MFUsCS8vIDwxLDIsMSw1PjogQ29zdCAzIHZleHQyIDwzLDAsMSwyPiwgPDEsNSwzLDc+CisgIDI2MzUyNTI5NTJVLAkvLyA8MSwyLDEsNj46IENvc3QgMyB2ZXh0MiA8MywwLDEsMj4sIDwxLDYsMiw3PgorICAzNzMyODgyNzMxVSwJLy8gPDEsMiwxLDc+OiBDb3N0IDQgdmV4dDIgPDcsMCwxLDI+LCA8MSw3LDMsMD4KKyAgMjk1ODE4MDQ1OVUsCS8vIDwxLDIsMSx1PjogQ29zdCAzIHZ6aXByIDwwLHUsMSwxPiwgTEhTCisgIDI2MjkyODEyMTNVLAkvLyA8MSwyLDIsMD46IENvc3QgMyB2ZXh0MiA8MiwwLDEsMj4sIDwyLDAsMSwyPgorICAyNjM1MjUzMjgwVSwJLy8gPDEsMiwyLDE+OiBDb3N0IDMgdmV4dDIgPDMsMCwxLDI+LCA8MiwxLDMsMj4KKyAgMjYxODY2NDU1MlUsCS8vIDwxLDIsMiwyPjogQ29zdCAzIHZleHQyIDwwLDIsMSwyPiwgPDIsMiwyLDI+CisgIDI2ODk3NDY1NDZVLAkvLyA8MSwyLDIsMz46IENvc3QgMyB2ZXh0MyA8MCx1LDEsMT4sIDwyLDIsMywzPgorICAzNzY0ODE1NDg1VSwJLy8gPDEsMiwyLDQ+OiBDb3N0IDQgdmV4dDMgPDEsMSwxLDE+LCA8MiwyLDQsNT4KKyAgMzc2MDAyMzE3NlUsCS8vIDwxLDIsMiw1PjogQ29zdCA0IHZleHQzIDwwLDIsdSwxPiwgPDIsMiw1LDc+CisgIDI2MzUyNTM2OTBVLAkvLyA8MSwyLDIsNj46IENvc3QgMyB2ZXh0MiA8MywwLDEsMj4sIDwyLDYsMyw3PgorICAyNjU5MTQxNjEwVSwJLy8gPDEsMiwyLDc+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLDI+LCA8Miw3LDAsMT4KKyAgMjY4OTc0NjU5MVUsCS8vIDwxLDIsMix1PjogQ29zdCAzIHZleHQzIDwwLHUsMSwxPiwgPDIsMix1LDM+CisgIDQwMzQ4ODg3MFUsCS8vIDwxLDIsMywwPjogQ29zdCAxIHZleHQxIExIUywgTEhTCisgIDE0NzcyMzEzNTBVLAkvLyA8MSwyLDMsMT46IENvc3QgMiB2ZXh0MSBMSFMsIDwxLDAsMywyPgorICAxNDc3MjMyMjMyVSwJLy8gPDEsMiwzLDI+OiBDb3N0IDIgdmV4dDEgTEhTLCA8MiwyLDIsMj4KKyAgMTQ3NzIzMzA1MlUsCS8vIDwxLDIsMywzPjogQ29zdCAyIHZleHQxIExIUywgPDMsMywzLDM+CisgIDQwMzQ5MjE1MFUsCS8vIDwxLDIsMyw0PjogQ29zdCAxIHZleHQxIExIUywgUkhTCisgIDE1MjUwMTAxMjhVLAkvLyA8MSwyLDMsNT46IENvc3QgMiB2ZXh0MSBMSFMsIDw1LDEsNywzPgorICAxNTI1MDEwOTM4VSwJLy8gPDEsMiwzLDY+OiBDb3N0IDIgdmV4dDEgTEhTLCA8NiwyLDcsMz4KKyAgMTUyNTAxMTQ1MFUsCS8vIDwxLDIsMyw3PjogQ29zdCAyIHZleHQxIExIUywgPDcsMCwxLDI+CisgIDQwMzQ5NDcwMlUsCS8vIDwxLDIsMyx1PjogQ29zdCAxIHZleHQxIExIUywgTEhTCisgIDI2NDEyMjY2MDdVLAkvLyA8MSwyLDQsMD46IENvc3QgMyB2ZXh0MiA8NCwwLDEsMj4sIDw0LDAsMSwyPgorICAzNjI0NzIzNDQ2VSwJLy8gPDEsMiw0LDE+OiBDb3N0IDQgdmV4dDEgPDAsMSwyLDQ+LCA8MSwzLDQsNj4KKyAgMzMwMTEyMzYwOVUsCS8vIDwxLDIsNCwyPjogQ29zdCA0IHZyZXYgPDIsMSwyLDQ+CisgIDI1OTg3NTkxOThVLAkvLyA8MSwyLDQsMz46IENvc3QgMyB2ZXh0MSA8dSwxLDIsND4sIDwzLHUsMSwyPgorICAyNjU5MTQyODY0VSwJLy8gPDEsMiw0LDQ+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLDI+LCA8NCw0LDQsND4KKyAgMTU2MTUxMzI3MFUsCS8vIDwxLDIsNCw1PjogQ29zdCAyIHZleHQyIDwzLDAsMSwyPiwgUkhTCisgIDI2NTkxNDMwMjhVLAkvLyA8MSwyLDQsNj46IENvc3QgMyB2ZXh0MiA8NywwLDEsMj4sIDw0LDYsNCw2PgorICAyNjU5MTQzMTEyVSwJLy8gPDEsMiw0LDc+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLDI+LCA8NCw3LDUsMD4KKyAgMTU2MTUxMzUxM1UsCS8vIDwxLDIsNCx1PjogQ29zdCAyIHZleHQyIDwzLDAsMSwyPiwgUkhTCisgIDI1NTA5ODg5MDJVLAkvLyA8MSwyLDUsMD46IENvc3QgMyB2ZXh0MSA8MCwxLDIsNT4sIExIUworICAyNTUwOTg5ODI0VSwJLy8gPDEsMiw1LDE+OiBDb3N0IDMgdmV4dDEgPDAsMSwyLDU+LCA8MSwzLDUsNz4KKyAgMzYyNDczMjI2NFUsCS8vIDwxLDIsNSwyPjogQ29zdCA0IHZleHQxIDwwLDEsMiw1PiwgPDIsMiwyLDI+CisgIDI5NTU1NTkwMTRVLAkvLyA8MSwyLDUsMz46IENvc3QgMyB2emlwciA8MCw0LDEsNT4sIExIUworICAyNTUwOTkyMTgyVSwJLy8gPDEsMiw1LDQ+OiBDb3N0IDMgdmV4dDEgPDAsMSwyLDU+LCBSSFMKKyAgMjY1OTE0MzY4NFUsCS8vIDwxLDIsNSw1PjogQ29zdCAzIHZleHQyIDw3LDAsMSwyPiwgPDUsNSw1LDU+CisgIDI2NTkxNDM3NzhVLAkvLyA8MSwyLDUsNj46IENvc3QgMyB2ZXh0MiA8NywwLDEsMj4sIDw1LDYsNywwPgorICAyNjU5MTQzODQ4VSwJLy8gPDEsMiw1LDc+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLDI+LCA8NSw3LDUsNz4KKyAgMjU1MDk5NDczNFUsCS8vIDwxLDIsNSx1PjogQ29zdCAzIHZleHQxIDwwLDEsMiw1PiwgTEhTCisgIDI3MDAyODk5NDVVLAkvLyA8MSwyLDYsMD46IENvc3QgMyB2ZXh0MyA8Miw2LDAsMT4sIDwyLDYsMCwxPgorICAyNjM1MjU2MjMyVSwJLy8gPDEsMiw2LDE+OiBDb3N0IDMgdmV4dDIgPDMsMCwxLDI+LCA8NiwxLDcsMj4KKyAgMjY1OTE0NDE4NlUsCS8vIDwxLDIsNiwyPjogQ29zdCAzIHZleHQyIDw3LDAsMSwyPiwgPDYsMiw3LDM+CisgIDI2ODk3NDY4NzRVLAkvLyA8MSwyLDYsMz46IENvc3QgMyB2ZXh0MyA8MCx1LDEsMT4sIDwyLDYsMyw3PgorICAzNzYzNDg4NzA1VSwJLy8gPDEsMiw2LDQ+OiBDb3N0IDQgdmV4dDMgPDAsdSwxLDE+LCA8Miw2LDQsNT4KKyAgMzc2MzQ4ODcxNlUsCS8vIDwxLDIsNiw1PjogQ29zdCA0IHZleHQzIDwwLHUsMSwxPiwgPDIsNiw1LDc+CisgIDI2NTkxNDQ1MDRVLAkvLyA8MSwyLDYsNj46IENvc3QgMyB2ZXh0MiA8NywwLDEsMj4sIDw2LDYsNiw2PgorICAyNjU3ODE3NDMyVSwJLy8gPDEsMiw2LDc+OiBDb3N0IDMgdmV4dDIgPDYsNywxLDI+LCA8Niw3LDEsMj4KKyAgMjY4OTc0NjkxOVUsCS8vIDwxLDIsNix1PjogQ29zdCAzIHZleHQzIDwwLHUsMSwxPiwgPDIsNix1LDc+CisgIDE1ODU0MDI4NzRVLAkvLyA8MSwyLDcsMD46IENvc3QgMiB2ZXh0MiA8NywwLDEsMj4sIDw3LDAsMSwyPgorICAyNjU5MTQ0NzcwVSwJLy8gPDEsMiw3LDE+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLDI+LCA8NywxLDAsMj4KKyAgMzcwODk5ODg1OFUsCS8vIDwxLDIsNywyPjogQ29zdCA0IHZleHQyIDwzLDAsMSwyPiwgPDcsMiw2LDM+CisgIDI2MzUyNTcwNTlVLAkvLyA8MSwyLDcsMz46IENvc3QgMyB2ZXh0MiA8MywwLDEsMj4sIDw3LDMsMCwxPgorICAyNjU5MTQ1MDYyVSwJLy8gPDEsMiw3LDQ+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLDI+LCA8Nyw0LDUsNj4KKyAgMzczMjg4NjkxNlUsCS8vIDwxLDIsNyw1PjogQ29zdCA0IHZleHQyIDw3LDAsMSwyPiwgPDcsNSwwLDA+CisgIDM3MzI4ODY5OThVLAkvLyA8MSwyLDcsNj46IENvc3QgNCB2ZXh0MiA8NywwLDEsMj4sIDw3LDYsMCwxPgorICAyNjU5MTQ1MjU1VSwJLy8gPDEsMiw3LDc+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLDI+LCA8Nyw3LDAsMT4KKyAgMTU5MDcxMTkzOFUsCS8vIDwxLDIsNyx1PjogQ29zdCAyIHZleHQyIDw3LHUsMSwyPiwgPDcsdSwxLDI+CisgIDQwMzUyOTgzNVUsCS8vIDwxLDIsdSwwPjogQ29zdCAxIHZleHQxIExIUywgTEhTCisgIDE0NzcyNzIzMTBVLAkvLyA8MSwyLHUsMT46IENvc3QgMiB2ZXh0MSBMSFMsIDwxLDAsMywyPgorICAxNDc3MjczMTkyVSwJLy8gPDEsMix1LDI+OiBDb3N0IDIgdmV4dDEgTEhTLCA8MiwyLDIsMj4KKyAgMTQ3NzI3Mzc1MFUsCS8vIDwxLDIsdSwzPjogQ29zdCAyIHZleHQxIExIUywgPDMsMCwxLDI+CisgIDQwMzUzMzExMFUsCS8vIDwxLDIsdSw0PjogQ29zdCAxIHZleHQxIExIUywgUkhTCisgIDE1NjE1MTYxODZVLAkvLyA8MSwyLHUsNT46IENvc3QgMiB2ZXh0MiA8MywwLDEsMj4sIFJIUworICAxNTI1MDUxODk4VSwJLy8gPDEsMix1LDY+OiBDb3N0IDIgdmV4dDEgTEhTLCA8NiwyLDcsMz4KKyAgMTUyNTA1MjQxMFUsCS8vIDwxLDIsdSw3PjogQ29zdCAyIHZleHQxIExIUywgPDcsMCwxLDI+CisgIDQwMzUzNTY2MlUsCS8vIDwxLDIsdSx1PjogQ29zdCAxIHZleHQxIExIUywgTEhTCisgIDI4MTk0MDc4NzJVLAkvLyA8MSwzLDAsMD46IENvc3QgMyB2dXpwciBMSFMsIDwwLDAsMCwwPgorICAxNTUxNTY0OTAyVSwJLy8gPDEsMywwLDE+OiBDb3N0IDIgdmV4dDIgPDEsMywxLDM+LCBMSFMKKyAgMjgxOTQwODYzMFUsCS8vIDwxLDMsMCwyPjogQ29zdCAzIHZ1enByIExIUywgPDEsMCwzLDI+CisgIDI2MTkzMzQ5MTFVLAkvLyA8MSwzLDAsMz46IENvc3QgMyB2ZXh0MiA8MCwzLDEsMz4sIDwwLDMsMSwzPgorICAyNjI1MzA2OTYyVSwJLy8gPDEsMywwLDQ+OiBDb3N0IDMgdmV4dDIgPDEsMywxLDM+LCA8MCw0LDEsNT4KKyAgMzgzMjcyNTg3OVUsCS8vIDwxLDMsMCw1PjogQ29zdCA0IHZ1enBsIDwxLDIsMywwPiwgPDAsNCw1LDY+CisgIDM2OTkwNDg5NTlVLAkvLyA8MSwzLDAsNj46IENvc3QgNCB2ZXh0MiA8MSwzLDEsMz4sIDwwLDYsMiw3PgorICAzNzc2NTM4ODI3VSwJLy8gPDEsMywwLDc+OiBDb3N0IDQgdmV4dDMgPDMsMCw3LDE+LCA8MywwLDcsMT4KKyAgMTU1MTU2NTQ2OVUsCS8vIDwxLDMsMCx1PjogQ29zdCAyIHZleHQyIDwxLDMsMSwzPiwgTEhTCisgIDI2MTg2NzE4NjJVLAkvLyA8MSwzLDEsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDEsMz4sIDwxLDAsMywyPgorICAyODE5NDA4NjkyVSwJLy8gPDEsMywxLDE+OiBDb3N0IDMgdnV6cHIgTEhTLCA8MSwxLDEsMT4KKyAgMjYyNDY0Mzk3NVUsCS8vIDwxLDMsMSwyPjogQ29zdCAzIHZleHQyIDwxLDIsMSwzPiwgPDEsMiwxLDM+CisgIDE3NDU2NjYxNTBVLAkvLyA8MSwzLDEsMz46IENvc3QgMiB2dXpwciBMSFMsIExIUworICAyNTU3MDA1MTEwVSwJLy8gPDEsMywxLDQ+OiBDb3N0IDMgdmV4dDEgPDEsMSwzLDE+LCBSSFMKKyAgMjYyNTMwNzc5MlUsCS8vIDwxLDMsMSw1PjogQ29zdCAzIHZleHQyIDwxLDMsMSwzPiwgPDEsNSwzLDc+CisgIDM2OTgzODYxMjdVLAkvLyA8MSwzLDEsNj46IENvc3QgNCB2ZXh0MiA8MSwyLDEsMz4sIDwxLDYsMSw3PgorICAyNTkyODM4NzQ4VSwJLy8gPDEsMywxLDc+OiBDb3N0IDMgdmV4dDEgPDcsMSwzLDE+LCA8NywxLDMsMT4KKyAgMTc0NTY2NjE1NVUsCS8vIDwxLDMsMSx1PjogQ29zdCAyIHZ1enByIExIUywgTEhTCisgIDI4MTk0MDg3OTBVLAkvLyA8MSwzLDIsMD46IENvc3QgMyB2dXpwciBMSFMsIDwxLDIsMywwPgorICAyNjI1MzA4MTkzVSwJLy8gPDEsMywyLDE+OiBDb3N0IDMgdmV4dDIgPDEsMywxLDM+LCA8MiwxLDMsMz4KKyAgMjgxOTQwODAzNlUsCS8vIDwxLDMsMiwyPjogQ29zdCAzIHZ1enByIExIUywgPDAsMiwwLDI+CisgIDI4MTk4NTE4OTBVLAkvLyA8MSwzLDIsMz46IENvc3QgMyB2dXpwciBMSFMsIDwyLDIsMywzPgorICAyODE5NDA4Nzk0VSwJLy8gPDEsMywyLDQ+OiBDb3N0IDMgdnV6cHIgTEhTLCA8MSwyLDMsND4KKyAgMzg5MzE0OTg5MFUsCS8vIDwxLDMsMiw1PjogQ29zdCA0IHZ1enByIExIUywgPDAsMiwzLDU+CisgIDI4MTk0MDgwNzZVLAkvLyA8MSwzLDIsNj46IENvc3QgMyB2dXpwciBMSFMsIDwwLDIsNCw2PgorICAzNzcyMDQxNTgzVSwJLy8gPDEsMywyLDc+OiBDb3N0IDQgdmV4dDMgPDIsMywwLDE+LCA8MywyLDcsMz4KKyAgMjgxOTQwODA0MlUsCS8vIDwxLDMsMix1PjogQ29zdCAzIHZ1enByIExIUywgPDAsMiwwLHU+CisgIDE0ODMyNzYzOTBVLAkvLyA8MSwzLDMsMD46IENvc3QgMiB2ZXh0MSA8MSwxLDMsMz4sIExIUworICAxNDgzMjc3MTI4VSwJLy8gPDEsMywzLDE+OiBDb3N0IDIgdmV4dDEgPDEsMSwzLDM+LCA8MSwxLDMsMz4KKyAgMjU1NzAxOTc1MlUsCS8vIDwxLDMsMywyPjogQ29zdCAzIHZleHQxIDwxLDEsMywzPiwgPDIsMiwyLDI+CisgIDI4MTk0MDg4NTZVLAkvLyA8MSwzLDMsMz46IENvc3QgMyB2dXpwciBMSFMsIDwxLDMsMSwzPgorICAxNDgzMjc5NjcwVSwJLy8gPDEsMywzLDQ+OiBDb3N0IDIgdmV4dDEgPDEsMSwzLDM+LCBSSFMKKyAgMjgxOTQwOTYxNFUsCS8vIDwxLDMsMyw1PjogQ29zdCAzIHZ1enByIExIUywgPDIsMyw0LDU+CisgIDI1OTg4MjY0OTBVLAkvLyA8MSwzLDMsNj46IENvc3QgMyB2ZXh0MSA8dSwxLDMsMz4sIDw2LDIsNywzPgorICAzMDg3ODQ0MzUyVSwJLy8gPDEsMywzLDc+OiBDb3N0IDMgdnRybnIgTEhTLCA8MSwzLDUsNz4KKyAgMTQ4MzI4MjIyMlUsCS8vIDwxLDMsMyx1PjogQ29zdCAyIHZleHQxIDwxLDEsMywzPiwgTEhTCisgIDI1Njg5NzAzNDJVLAkvLyA8MSwzLDQsMD46IENvc3QgMyB2ZXh0MSA8MywxLDMsND4sIExIUworICAyNTY4OTcxMjI0VSwJLy8gPDEsMyw0LDE+OiBDb3N0IDMgdmV4dDEgPDMsMSwzLDQ+LCA8MSwzLDEsMz4KKyAgMzgzMjc2MTI5MFUsCS8vIDwxLDMsNCwyPjogQ29zdCA0IHZ1enBsIDwxLDIsMyw0PiwgPDQsMSwyLDM+CisgIDIyMzM0MjgyMTlVLAkvLyA8MSwzLDQsMz46IENvc3QgMyB2cmV2IDwzLDEsMyw0PgorICAyNTY4OTczNjIyVSwJLy8gPDEsMyw0LDQ+OiBDb3N0IDMgdmV4dDEgPDMsMSwzLDQ+LCBSSFMKKyAgMTU1MTU2ODE4MlUsCS8vIDwxLDMsNCw1PjogQ29zdCAyIHZleHQyIDwxLDMsMSwzPiwgUkhTCisgIDI4MTk0MTA0MzRVLAkvLyA8MSwzLDQsNj46IENvc3QgMyB2dXpwciBMSFMsIDwzLDQsNSw2PgorICAzNjY2NjA1MTUxVSwJLy8gPDEsMyw0LDc+OiBDb3N0IDQgdmV4dDEgPDcsMSwzLDQ+LCA8NywxLDMsND4KKyAgMTU1MTU2ODQyNVUsCS8vIDwxLDMsNCx1PjogQ29zdCAyIHZleHQyIDwxLDMsMSwzPiwgUkhTCisgIDI1NjMwMDY1NjZVLAkvLyA8MSwzLDUsMD46IENvc3QgMyB2ZXh0MSA8MiwxLDMsNT4sIExIUworICAyNTY4OTc5NDU2VSwJLy8gPDEsMyw1LDE+OiBDb3N0IDMgdmV4dDEgPDMsMSwzLDU+LCA8MSwzLDUsNz4KKyAgMjU2MzAwODAzNVUsCS8vIDwxLDMsNSwyPjogQ29zdCAzIHZleHQxIDwyLDEsMyw1PiwgPDIsMSwzLDU+CisgIDIyMzM0MzY0MTJVLAkvLyA8MSwzLDUsMz46IENvc3QgMyB2cmV2IDwzLDEsMyw1PgorICAyNTYzMDA5ODQ2VSwJLy8gPDEsMyw1LDQ+OiBDb3N0IDMgdmV4dDEgPDIsMSwzLDU+LCBSSFMKKyAgMjg2NzE4NzcxNlUsCS8vIDwxLDMsNSw1PjogQ29zdCAzIHZ1enByIExIUywgPDUsNSw1LDU+CisgIDI2NTU4MzQyMTRVLAkvLyA8MSwzLDUsNj46IENvc3QgMyB2ZXh0MiA8Niw0LDEsMz4sIDw1LDYsNyw0PgorICAxNzQ1NjY5NDMwVSwJLy8gPDEsMyw1LDc+OiBDb3N0IDIgdnV6cHIgTEhTLCBSSFMKKyAgMTc0NTY2OTQzMVUsCS8vIDwxLDMsNSx1PjogQ29zdCAyIHZ1enByIExIUywgUkhTCisgIDI4NjcxODc4MTBVLAkvLyA8MSwzLDYsMD46IENvc3QgMyB2dXpwciBMSFMsIDw1LDYsNywwPgorICAzNjk5MDUyOTMxVSwJLy8gPDEsMyw2LDE+OiBDb3N0IDQgdmV4dDIgPDEsMywxLDM+LCA8NiwxLDMsMT4KKyAgMjY1NDUwNzQ2MFUsCS8vIDwxLDMsNiwyPjogQ29zdCAzIHZleHQyIDw2LDIsMSwzPiwgPDYsMiwxLDM+CisgIDM3NjYyOTEwOTFVLAkvLyA8MSwzLDYsMz46IENvc3QgNCB2ZXh0MyA8MSwzLDMsMT4sIDwzLDYsMyw3PgorICAyNjU1ODM0NzI2VSwJLy8gPDEsMyw2LDQ+OiBDb3N0IDMgdmV4dDIgPDYsNCwxLDM+LCA8Niw0LDEsMz4KKyAgMzkyMzM4NDU2MlUsCS8vIDwxLDMsNiw1PjogQ29zdCA0IHZ1enByIDw1LDEsNywzPiwgPHUsNiw3LDU+CisgIDI2NTcxNjE5OTJVLAkvLyA8MSwzLDYsNj46IENvc3QgMyB2ZXh0MiA8Niw2LDEsMz4sIDw2LDYsMSwzPgorICAyODE5ODUyMjE4VSwJLy8gPDEsMyw2LDc+OiBDb3N0IDMgdnV6cHIgTEhTLCA8Miw2LDMsNz4KKyAgMjgxOTg1MjIxOVUsCS8vIDwxLDMsNix1PjogQ29zdCAzIHZ1enByIExIUywgPDIsNiwzLHU+CisgIDI3MDY5MjYyNzVVLAkvLyA8MSwzLDcsMD46IENvc3QgMyB2ZXh0MyA8Myw3LDAsMT4sIDwzLDcsMCwxPgorICAyNjU5ODE2NTI0VSwJLy8gPDEsMyw3LDE+OiBDb3N0IDMgdmV4dDIgPDcsMSwxLDM+LCA8NywxLDEsMz4KKyAgMzYzNjc2NjI0NVUsCS8vIDwxLDMsNywyPjogQ29zdCA0IHZleHQxIDwyLDEsMyw3PiwgPDIsMSwzLDc+CisgIDI4NjcxODc5MDNVLAkvLyA8MSwzLDcsMz46IENvc3QgMyB2dXpwciBMSFMsIDw1LDcsdSwzPgorICAyNjI1MzEyMTAyVSwJLy8gPDEsMyw3LDQ+OiBDb3N0IDMgdmV4dDIgPDEsMywxLDM+LCA8Nyw0LDUsNj4KKyAgMjg2NzE4ODU5OFUsCS8vIDwxLDMsNyw1PjogQ29zdCAzIHZ1enByIExIUywgPDYsNyw0LDU+CisgIDM3MjgyNTAzNDRVLAkvLyA8MSwzLDcsNj46IENvc3QgNCB2ZXh0MiA8NiwyLDEsMz4sIDw3LDYsMiwxPgorICAyODY3MTg3ODgwVSwJLy8gPDEsMyw3LDc+OiBDb3N0IDMgdnV6cHIgTEhTLCA8NSw3LDUsNz4KKyAgMjcwNzUxNjE3MVUsCS8vIDwxLDMsNyx1PjogQ29zdCAzIHZleHQzIDwzLDcsdSwxPiwgPDMsNyx1LDE+CisgIDE0ODMzMTczNTBVLAkvLyA8MSwzLHUsMD46IENvc3QgMiB2ZXh0MSA8MSwxLDMsdT4sIExIUworICAxNDgzMzE4MDkzVSwJLy8gPDEsMyx1LDE+OiBDb3N0IDIgdmV4dDEgPDEsMSwzLHU+LCA8MSwxLDMsdT4KKyAgMjgxOTQxMDcxOFUsCS8vIDwxLDMsdSwyPjogQ29zdCAzIHZ1enByIExIUywgPDMsdSwxLDI+CisgIDE3NDU2NjY3MTdVLAkvLyA8MSwzLHUsMz46IENvc3QgMiB2dXpwciBMSFMsIExIUworICAxNDgzMzIwNjMwVSwJLy8gPDEsMyx1LDQ+OiBDb3N0IDIgdmV4dDEgPDEsMSwzLHU+LCBSSFMKKyAgMTU1MTU3MTA5OFUsCS8vIDwxLDMsdSw1PjogQ29zdCAyIHZleHQyIDwxLDMsMSwzPiwgUkhTCisgIDI4MTk0MTA3NThVLAkvLyA8MSwzLHUsNj46IENvc3QgMyB2dXpwciBMSFMsIDwzLHUsNSw2PgorICAxNzQ1NjY5NjczVSwJLy8gPDEsMyx1LDc+OiBDb3N0IDIgdnV6cHIgTEhTLCBSSFMKKyAgMTc0NTY2NjcyMlUsCS8vIDwxLDMsdSx1PjogQ29zdCAyIHZ1enByIExIUywgTEhTCisgIDI2MTczNTIyMDVVLAkvLyA8MSw0LDAsMD46IENvc3QgMyB2ZXh0MiA8MCwwLDEsND4sIDwwLDAsMSw0PgorICAyNjE5MzQyOTUwVSwJLy8gPDEsNCwwLDE+OiBDb3N0IDMgdmV4dDIgPDAsMywxLDQ+LCBMSFMKKyAgMzY5MjQyMTI5NVUsCS8vIDwxLDQsMCwyPjogQ29zdCA0IHZleHQyIDwwLDIsMSw0PiwgPDAsMiwxLDQ+CisgIDI2MTkzNDMxMDRVLAkvLyA8MSw0LDAsMz46IENvc3QgMyB2ZXh0MiA8MCwzLDEsND4sIDwwLDMsMSw0PgorICAyNjE3MzUyNTMwVSwJLy8gPDEsNCwwLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMCwxLDQ+LCA8MCw0LDEsNT4KKyAgMTYzNDg4MDQwMlUsCS8vIDwxLDQsMCw1PjogQ29zdCAyIHZleHQzIDw0LDAsNSwxPiwgPDQsMCw1LDE+CisgIDI3MTM5MzA2NTJVLAkvLyA8MSw0LDAsNj46IENvc3QgMyB2ZXh0MyA8NCx1LDUsMT4sIDw0LDAsNiwyPgorICAzNzMyODk4Mzk2VSwJLy8gPDEsNCwwLDc+OiBDb3N0IDQgdmV4dDIgPDcsMCwxLDQ+LCA8MCw3LDQsMT4KKyAgMTYzNTEwMTYxM1UsCS8vIDwxLDQsMCx1PjogQ29zdCAyIHZleHQzIDw0LDAsdSwxPiwgPDQsMCx1LDE+CisgIDM2OTMwODU0MzBVLAkvLyA8MSw0LDEsMD46IENvc3QgNCB2ZXh0MiA8MCwzLDEsND4sIDwxLDAsMywyPgorICAyNjIzOTg4NTM1VSwJLy8gPDEsNCwxLDE+OiBDb3N0IDMgdmV4dDIgPDEsMSwxLDQ+LCA8MSwxLDEsND4KKyAgMzY5MzA4NTU5MFUsCS8vIDwxLDQsMSwyPjogQ29zdCA0IHZleHQyIDwwLDMsMSw0PiwgPDEsMiwzLDA+CisgIDM2OTI0MjIxMzRVLAkvLyA8MSw0LDEsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDEsND4sIDwxLDMsNCw2PgorICAzNjkzMDg1NzI2VSwJLy8gPDEsNCwxLDQ+OiBDb3N0IDQgdmV4dDIgPDAsMywxLDQ+LCA8MSw0LDAsMT4KKyAgMjg5MjQwMTk3NFUsCS8vIDwxLDQsMSw1PjogQ29zdCAzIHZ6aXBsIDwxLDEsMSwxPiwgUkhTCisgIDMwMjY2MTk3MDJVLAkvLyA8MSw0LDEsNj46IENvc3QgMyB2dHJubCA8MSwxLDEsMT4sIFJIUworICAzODAwMjA2MzI0VSwJLy8gPDEsNCwxLDc+OiBDb3N0IDQgdmV4dDMgPDcsMCw0LDE+LCA8NCwxLDcsMD4KKyAgMjg5MjQwMjIxN1UsCS8vIDwxLDQsMSx1PjogQ29zdCAzIHZ6aXBsIDwxLDEsMSwxPiwgUkhTCisgIDM5NjY5Nzg5MjdVLAkvLyA8MSw0LDIsMD46IENvc3QgNCB2emlwbCA8MSwyLDMsND4sIDw0LDAsMSwyPgorICAzOTY2OTc5MDE4VSwJLy8gPDEsNCwyLDE+OiBDb3N0IDQgdnppcGwgPDEsMiwzLDQ+LCA8NCwxLDIsMz4KKyAgMzY5MzA4NjMxMlUsCS8vIDwxLDQsMiwyPjogQ29zdCA0IHZleHQyIDwwLDMsMSw0PiwgPDIsMiwyLDI+CisgIDI2MzUyNjk3OThVLAkvLyA8MSw0LDIsMz46IENvc3QgMyB2ZXh0MiA8MywwLDEsND4sIDwyLDMsMCwxPgorICAzOTY2OTc5MjgwVSwJLy8gPDEsNCwyLDQ+OiBDb3N0IDQgdnppcGwgPDEsMiwzLDQ+LCA8NCw0LDQsND4KKyAgMjg5MzIwNDc5MFUsCS8vIDwxLDQsMiw1PjogQ29zdCAzIHZ6aXBsIDwxLDIsMywwPiwgUkhTCisgIDM2OTMwODY2NTBVLAkvLyA8MSw0LDIsNj46IENvc3QgNCB2ZXh0MiA8MCwzLDEsND4sIDwyLDYsMyw3PgorICAzNjY2NjYyNTAyVSwJLy8gPDEsNCwyLDc+OiBDb3N0IDQgdmV4dDEgPDcsMSw0LDI+LCA8NywxLDQsMj4KKyAgMjg5MzIwNTAzM1UsCS8vIDwxLDQsMix1PjogQ29zdCAzIHZ6aXBsIDwxLDIsMywwPiwgUkhTCisgIDI1NjMwNjM5MTBVLAkvLyA8MSw0LDMsMD46IENvc3QgMyB2ZXh0MSA8MiwxLDQsMz4sIExIUworICAyNTYzMDY0NzMwVSwJLy8gPDEsNCwzLDE+OiBDb3N0IDMgdmV4dDEgPDIsMSw0LDM+LCA8MSwyLDMsND4KKyAgMjU2MzA2NTM4NlUsCS8vIDwxLDQsMywyPjogQ29zdCAzIHZleHQxIDwyLDEsNCwzPiwgPDIsMSw0LDM+CisgIDM2OTMwODcxMzJVLAkvLyA8MSw0LDMsMz46IENvc3QgNCB2ZXh0MiA8MCwzLDEsND4sIDwzLDMsMywzPgorICAyNjE5MzQ1NDEwVSwJLy8gPDEsNCwzLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMywxLDQ+LCA8Myw0LDUsNj4KKyAgMzA4Nzg0MzY2NlUsCS8vIDwxLDQsMyw1PjogQ29zdCAzIHZ0cm5yIExIUywgPDAsNCwxLDU+CisgIDMwODc4NDM2NzZVLAkvLyA8MSw0LDMsNj46IENvc3QgMyB2dHJuciBMSFMsIDwwLDQsMiw2PgorICAzNjY2NjcwNjk1VSwJLy8gPDEsNCwzLDc+OiBDb3N0IDQgdmV4dDEgPDcsMSw0LDM+LCA8NywxLDQsMz4KKyAgMzA4Nzg0MzY2OVUsCS8vIDwxLDQsMyx1PjogQ29zdCAzIHZ0cm5yIExIUywgPDAsNCwxLHU+CisgIDI2MjA2NzI5MTRVLAkvLyA8MSw0LDQsMD46IENvc3QgMyB2ZXh0MiA8MCw1LDEsND4sIDw0LDAsNSwxPgorICAzNjMwODQyNzA2VSwJLy8gPDEsNCw0LDE+OiBDb3N0IDQgdmV4dDEgPDEsMSw0LDQ+LCA8MSwxLDQsND4KKyAgMzMxMzA2OTAwM1UsCS8vIDwxLDQsNCwyPjogQ29zdCA0IHZyZXYgPDQsMSwyLDQ+CisgIDM2NDI3ODgxMDBVLAkvLyA8MSw0LDQsMz46IENvc3QgNCB2ZXh0MSA8MywxLDQsND4sIDwzLDEsNCw0PgorICAyNzEzOTMwOTYwVSwJLy8gPDEsNCw0LDQ+OiBDb3N0IDMgdmV4dDMgPDQsdSw1LDE+LCA8NCw0LDQsND4KKyAgMjYxOTM0NjIzMFUsCS8vIDwxLDQsNCw1PjogQ29zdCAzIHZleHQyIDwwLDMsMSw0PiwgUkhTCisgIDI3MTM5MzA5ODBVLAkvLyA8MSw0LDQsNj46IENvc3QgMyB2ZXh0MyA8NCx1LDUsMT4sIDw0LDQsNiw2PgorICAzNzM2ODgyNjQyVSwJLy8gPDEsNCw0LDc+OiBDb3N0IDQgdmV4dDIgPDcsNiwxLDQ+LCA8NCw3LDYsMT4KKyAgMjYxOTM0NjQ3M1UsCS8vIDwxLDQsNCx1PjogQ29zdCAzIHZleHQyIDwwLDMsMSw0PiwgUkhTCisgIDI1NTcxMDgzMjZVLAkvLyA8MSw0LDUsMD46IENvc3QgMyB2ZXh0MSA8MSwxLDQsNT4sIExIUworICAyNTU3MTA5MDc1VSwJLy8gPDEsNCw1LDE+OiBDb3N0IDMgdmV4dDEgPDEsMSw0LDU+LCA8MSwxLDQsNT4KKyAgMjU5ODkxMzc3NFUsCS8vIDwxLDQsNSwyPjogQ29zdCAzIHZleHQxIDx1LDEsNCw1PiwgPDIsMyx1LDE+CisgIDM2MzA4NTIyNDZVLAkvLyA8MSw0LDUsMz46IENvc3QgNCB2ZXh0MSA8MSwxLDQsNT4sIDwzLDAsMSwyPgorICAyNTU3MTExNjA2VSwJLy8gPDEsNCw1LDQ+OiBDb3N0IDMgdmV4dDEgPDEsMSw0LDU+LCBSSFMKKyAgMjg5NTI1Mjc5MFUsCS8vIDwxLDQsNSw1PjogQ29zdCAzIHZ6aXBsIDwxLDUsMyw3PiwgUkhTCisgIDE2MTYwMDY0NTRVLAkvLyA8MSw0LDUsNj46IENvc3QgMiB2ZXh0MyA8MCx1LDEsMT4sIFJIUworICAzODk5MDU5NTEwVSwJLy8gPDEsNCw1LDc+OiBDb3N0IDQgdnV6cHIgPDEsMSwxLDQ+LCBSSFMKKyAgMTYxNjAwNjQ3MlUsCS8vIDwxLDQsNSx1PjogQ29zdCAyIHZleHQzIDwwLHUsMSwxPiwgUkhTCisgIDI1NTcxMTY1MThVLAkvLyA8MSw0LDYsMD46IENvc3QgMyB2ZXh0MSA8MSwxLDQsNj4sIExIUworICAyNTU3MTE3MjM2VSwJLy8gPDEsNCw2LDE+OiBDb3N0IDMgdmV4dDEgPDEsMSw0LDY+LCA8MSwxLDEsMT4KKyAgMzYzMDg1OTg4MFUsCS8vIDwxLDQsNiwyPjogQ29zdCA0IHZleHQxIDwxLDEsNCw2PiwgPDIsMiwyLDI+CisgIDI1NjkwNjI1NTBVLAkvLyA8MSw0LDYsMz46IENvc3QgMyB2ZXh0MSA8MywxLDQsNj4sIDwzLDAsMSwyPgorICAyNTU3MTE5Nzk4VSwJLy8gPDEsNCw2LDQ+OiBDb3N0IDMgdmV4dDEgPDEsMSw0LDY+LCBSSFMKKyAgMzc2MzQ5MDE3NFUsCS8vIDwxLDQsNiw1PjogQ29zdCA0IHZleHQzIDwwLHUsMSwxPiwgPDQsNiw1LDc+CisgIDM3NjM0OTAxODNVLAkvLyA8MSw0LDYsNj46IENvc3QgNCB2ZXh0MyA8MCx1LDEsMT4sIDw0LDYsNiw3PgorICAyNzEyNzUxNDk4VSwJLy8gPDEsNCw2LDc+OiBDb3N0IDMgdmV4dDMgPDQsNiw3LDE+LCA8NCw2LDcsMT4KKyAgMjU1NzEyMjM1MFUsCS8vIDwxLDQsNix1PjogQ29zdCAzIHZleHQxIDwxLDEsNCw2PiwgTEhTCisgIDI2NTkxNjEwODRVLAkvLyA8MSw0LDcsMD46IENvc3QgMyB2ZXh0MiA8NywwLDEsND4sIDw3LDAsMSw0PgorICAzNzMyOTAzMDQwVSwJLy8gPDEsNCw3LDE+OiBDb3N0IDQgdmV4dDIgPDcsMCwxLDQ+LCA8NywxLDcsMT4KKyAgMzczNDIzMDE3NFUsCS8vIDwxLDQsNywyPjogQ29zdCA0IHZleHQyIDw3LDIsMSw0PiwgPDcsMiwxLDQ+CisgIDM3MzQ4OTM4MDdVLAkvLyA8MSw0LDcsMz46IENvc3QgNCB2ZXh0MiA8NywzLDEsND4sIDw3LDMsMSw0PgorICAzNjYwNzI5NjU0VSwJLy8gPDEsNCw3LDQ+OiBDb3N0IDQgdmV4dDEgPDYsMSw0LDc+LCBSSFMKKyAgMzc4NjQ5MzM4NFUsCS8vIDwxLDQsNyw1PjogQ29zdCA0IHZleHQzIDw0LDYsNywxPiwgPDQsNyw1LDA+CisgIDI3MTMzNDEzOTRVLAkvLyA8MSw0LDcsNj46IENvc3QgMyB2ZXh0MyA8NCw3LDYsMT4sIDw0LDcsNiwxPgorICAzNjYwNzMxMzg2VSwJLy8gPDEsNCw3LDc+OiBDb3N0IDQgdmV4dDEgPDYsMSw0LDc+LCA8NywwLDEsMj4KKyAgMjY2NDQ3MDE0OFUsCS8vIDwxLDQsNyx1PjogQ29zdCAzIHZleHQyIDw3LHUsMSw0PiwgPDcsdSwxLDQ+CisgIDI1NTcxMzI5MDJVLAkvLyA8MSw0LHUsMD46IENvc3QgMyB2ZXh0MSA8MSwxLDQsdT4sIExIUworICAyNjE5MzQ4NzgyVSwJLy8gPDEsNCx1LDE+OiBDb3N0IDMgdmV4dDIgPDAsMywxLDQ+LCBMSFMKKyAgMjU2MzEwNjM1MVUsCS8vIDwxLDQsdSwyPjogQ29zdCAzIHZleHQxIDwyLDEsNCx1PiwgPDIsMSw0LHU+CisgIDI3MTM3ODM4MTZVLAkvLyA8MSw0LHUsMz46IENvc3QgMyB2ZXh0MyA8NCx1LDMsMT4sIDw0LHUsMywxPgorICAyNjIyNjY2ODE1VSwJLy8gPDEsNCx1LDQ+OiBDb3N0IDMgdmV4dDIgPDAsdSwxLDQ+LCA8dSw0LDUsNj4KKyAgMTY0MDE4OTQ2NlUsCS8vIDwxLDQsdSw1PjogQ29zdCAyIHZleHQzIDw0LHUsNSwxPiwgPDQsdSw1LDE+CisgIDE2MTYwMDY2OTdVLAkvLyA8MSw0LHUsNj46IENvc3QgMiB2ZXh0MyA8MCx1LDEsMT4sIFJIUworICAyNzEyNzUxNDk4VSwJLy8gPDEsNCx1LDc+OiBDb3N0IDMgdmV4dDMgPDQsNiw3LDE+LCA8NCw2LDcsMT4KKyAgMTYxNjAwNjcxNVUsCS8vIDwxLDQsdSx1PjogQ29zdCAyIHZleHQzIDwwLHUsMSwxPiwgUkhTCisgIDI2MjAwMTQ1OTJVLAkvLyA8MSw1LDAsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDwwLDAsMCwwPgorICAxNTQ2MjcyODcwVSwJLy8gPDEsNSwwLDE+OiBDb3N0IDIgdmV4dDIgPDAsNCwxLDU+LCBMSFMKKyAgMjYxODY4NzY2NFUsCS8vIDwxLDUsMCwyPjogQ29zdCAzIHZleHQyIDwwLDIsMSw1PiwgPDAsMiwxLDU+CisgIDM2OTMwOTMxMjBVLAkvLyA8MSw1LDAsMz46IENvc3QgNCB2ZXh0MiA8MCwzLDEsNT4sIDwwLDMsMSw0PgorICAxNTQ2MjczMTA2VSwJLy8gPDEsNSwwLDQ+OiBDb3N0IDIgdmV4dDIgPDAsNCwxLDU+LCA8MCw0LDEsNT4KKyAgMjYyMDY3ODU2M1UsCS8vIDwxLDUsMCw1PjogQ29zdCAzIHZleHQyIDwwLDUsMSw1PiwgPDAsNSwxLDU+CisgIDI3MTQ2Njg2NjBVLAkvLyA8MSw1LDAsNj46IENvc3QgMyB2ZXh0MyA8NSwwLDYsMT4sIDw1LDAsNiwxPgorICAzNzcyMDQyODc3VSwJLy8gPDEsNSwwLDc+OiBDb3N0IDQgdmV4dDMgPDIsMywwLDE+LCA8NSwwLDcsMT4KKyAgMTU0NjI3MzQzN1UsCS8vIDwxLDUsMCx1PjogQ29zdCAyIHZleHQyIDwwLDQsMSw1PiwgTEhTCisgIDI2MjAwMTUzNTBVLAkvLyA8MSw1LDEsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDwxLDAsMywyPgorICAyNjIwMDE1NDEyVSwJLy8gPDEsNSwxLDE+OiBDb3N0IDMgdmV4dDIgPDAsNCwxLDU+LCA8MSwxLDEsMT4KKyAgMjYyMDAxNTUxMFUsCS8vIDwxLDUsMSwyPjogQ29zdCAzIHZleHQyIDwwLDQsMSw1PiwgPDEsMiwzLDA+CisgIDI2MTg2ODg1MTJVLAkvLyA8MSw1LDEsMz46IENvc3QgMyB2ZXh0MiA8MCwyLDEsNT4sIDwxLDMsNSw3PgorICAyNjIwMDE1Njc3VSwJLy8gPDEsNSwxLDQ+OiBDb3N0IDMgdmV4dDIgPDAsNCwxLDU+LCA8MSw0LDMsNT4KKyAgMjYyMDAxNTcyN1UsCS8vIDwxLDUsMSw1PjogQ29zdCAzIHZleHQyIDwwLDQsMSw1PiwgPDEsNSwwLDE+CisgIDI2MjAwMTU4NTlVLAkvLyA8MSw1LDEsNj46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDwxLDYsNSw3PgorICAzMDkzNzI4NTY2VSwJLy8gPDEsNSwxLDc+OiBDb3N0IDMgdnRybnIgPDEsMSwxLDE+LCBSSFMKKyAgMjYyMDAxNTk4MVUsCS8vIDwxLDUsMSx1PjogQ29zdCAzIHZleHQyIDwwLDQsMSw1PiwgPDEsdSwxLDM+CisgIDM2OTI0MzA4MTZVLAkvLyA8MSw1LDIsMD46IENvc3QgNCB2ZXh0MiA8MCwyLDEsNT4sIDwyLDAsNSwxPgorICAyNjIwMDE2MTYzVSwJLy8gPDEsNSwyLDE+OiBDb3N0IDMgdmV4dDIgPDAsNCwxLDU+LCA8MiwxLDMsNT4KKyAgMjYyMDAxNjIzMlUsCS8vIDwxLDUsMiwyPjogQ29zdCAzIHZleHQyIDwwLDQsMSw1PiwgPDIsMiwyLDI+CisgIDI2MjAwMTYyOTRVLAkvLyA8MSw1LDIsMz46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDwyLDMsMCwxPgorICAzNjkzNzU4MjIxVSwJLy8gPDEsNSwyLDQ+OiBDb3N0IDQgdmV4dDIgPDAsNCwxLDU+LCA8Miw0LDIsNT4KKyAgMzY5MjQzMTIwOVUsCS8vIDwxLDUsMiw1PjogQ29zdCA0IHZleHQyIDwwLDIsMSw1PiwgPDIsNSwzLDc+CisgIDI2MjAwMTY1NzBVLAkvLyA8MSw1LDIsNj46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDwyLDYsMyw3PgorICA0MTczNTk4MDA2VSwJLy8gPDEsNSwyLDc+OiBDb3N0IDQgdnRybnIgPDIsMSwzLDI+LCBSSFMKKyAgMjYyMDAxNjY5OVUsCS8vIDwxLDUsMix1PjogQ29zdCAzIHZleHQyIDwwLDQsMSw1PiwgPDIsdSwwLDE+CisgIDI2MjAwMTY3OTBVLAkvLyA8MSw1LDMsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDwzLDAsMSwyPgorICAyNTY5MTEwNjcyVSwJLy8gPDEsNSwzLDE+OiBDb3N0IDMgdmV4dDEgPDMsMSw1LDM+LCA8MSw1LDMsNz4KKyAgMzY5Mzc1ODc4NVUsCS8vIDwxLDUsMywyPjogQ29zdCA0IHZleHQyIDwwLDQsMSw1PiwgPDMsMiwyLDI+CisgIDI2MjAwMTcwNTJVLAkvLyA8MSw1LDMsMz46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDwzLDMsMywzPgorICAyNjIwMDE3MTU0VSwJLy8gPDEsNSwzLDQ+OiBDb3N0IDMgdmV4dDIgPDAsNCwxLDU+LCA8Myw0LDUsNj4KKyAgMzEzNTYyMzE3MlUsCS8vIDwxLDUsMyw1PjogQ29zdCAzIHZ0cm5yIExIUywgPDUsNSw1LDU+CisgIDQxNjE1ODcwNDhVLAkvLyA8MSw1LDMsNj46IENvc3QgNCB2dHJuciBMSFMsIDwyLDUsMyw2PgorICAyMDE0MTA0ODg2VSwJLy8gPDEsNSwzLDc+OiBDb3N0IDIgdnRybnIgTEhTLCBSSFMKKyAgMjAxNDEwNDg4N1UsCS8vIDwxLDUsMyx1PjogQ29zdCAyIHZ0cm5yIExIUywgUkhTCisgIDI2MjAwMTc1NTRVLAkvLyA8MSw1LDQsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDw0LDAsNSwxPgorICAyNjIwMDE3NjM0VSwJLy8gPDEsNSw0LDE+OiBDb3N0IDMgdmV4dDIgPDAsNCwxLDU+LCA8NCwxLDUsMD4KKyAgMzY5Mzc1OTU1MVUsCS8vIDwxLDUsNCwyPjogQ29zdCA0IHZleHQyIDwwLDQsMSw1PiwgPDQsMiw2LDM+CisgIDM2NDI4NjE4MzdVLAkvLyA8MSw1LDQsMz46IENvc3QgNCB2ZXh0MSA8MywxLDUsND4sIDwzLDEsNSw0PgorICAyNTc1MDkyNzEwVSwJLy8gPDEsNSw0LDQ+OiBDb3N0IDMgdmV4dDEgPDQsMSw1LDQ+LCA8NCwxLDUsND4KKyAgMTU0NjI3NjE1MFUsCS8vIDwxLDUsNCw1PjogQ29zdCAyIHZleHQyIDwwLDQsMSw1PiwgUkhTCisgIDI3NTk4NTU0MTRVLAkvLyA8MSw1LDQsNj46IENvc3QgMyB2dXpwbCA8MSwzLDUsNz4sIFJIUworICAyNzEzOTMxNzE4VSwJLy8gPDEsNSw0LDc+OiBDb3N0IDMgdmV4dDMgPDQsdSw1LDE+LCA8NSw0LDcsNj4KKyAgMTU0NjI3NjM5M1UsCS8vIDwxLDUsNCx1PjogQ29zdCAyIHZleHQyIDwwLDQsMSw1PiwgUkhTCisgIDI1NTcxODIwNTRVLAkvLyA8MSw1LDUsMD46IENvc3QgMyB2ZXh0MSA8MSwxLDUsNT4sIExIUworICAyNTU3MTgyODEyVSwJLy8gPDEsNSw1LDE+OiBDb3N0IDMgdmV4dDEgPDEsMSw1LDU+LCA8MSwxLDUsNT4KKyAgMzYzMDkyNTM0N1UsCS8vIDwxLDUsNSwyPjogQ29zdCA0IHZleHQxIDwxLDEsNSw1PiwgPDIsMSwzLDU+CisgIDQwMjkzMDE2NzVVLAkvLyA8MSw1LDUsMz46IENvc3QgNCB2emlwciA8MCw0LDEsNT4sIDwxLDIsNSwzPgorICAyNTU3MTg1MzM0VSwJLy8gPDEsNSw1LDQ+OiBDb3N0IDMgdmV4dDEgPDEsMSw1LDU+LCBSSFMKKyAgMjcxMzkzMTc4MFUsCS8vIDwxLDUsNSw1PjogQ29zdCAzIHZleHQzIDw0LHUsNSwxPiwgPDUsNSw1LDU+CisgIDI2Njc3OTQ1MzBVLAkvLyA8MSw1LDUsNj46IENvc3QgMyB2ZXh0MiA8dSw0LDEsNT4sIDw1LDYsNywwPgorICAyNzEzOTMxODAwVSwJLy8gPDEsNSw1LDc+OiBDb3N0IDMgdmV4dDMgPDQsdSw1LDE+LCA8NSw1LDcsNz4KKyAgMjU1NzE4Nzg4NlUsCS8vIDwxLDUsNSx1PjogQ29zdCAzIHZleHQxIDwxLDEsNSw1PiwgTEhTCisgIDI3MTgyMDgwMzZVLAkvLyA8MSw1LDYsMD46IENvc3QgMyB2ZXh0MyA8NSw2LDAsMT4sIDw1LDYsMCwxPgorICAyNjIwMDE5MTE1VSwJLy8gPDEsNSw2LDE+OiBDb3N0IDMgdmV4dDIgPDAsNCwxLDU+LCA8NiwxLDcsNT4KKyAgMjY2Nzc5NDkzOFUsCS8vIDwxLDUsNiwyPjogQ29zdCAzIHZleHQyIDx1LDQsMSw1PiwgPDYsMiw3LDM+CisgIDM3ODc2NzM2NjZVLAkvLyA8MSw1LDYsMz46IENvc3QgNCB2ZXh0MyA8NCx1LDUsMT4sIDw1LDYsMyw0PgorICAzNjkzNzYxMTY1VSwJLy8gPDEsNSw2LDQ+OiBDb3N0IDQgdmV4dDIgPDAsNCwxLDU+LCA8Niw0LDUsNj4KKyAgMzMxOTI3OTI5N1UsCS8vIDwxLDUsNiw1PjogQ29zdCA0IHZyZXYgPDUsMSw1LDY+CisgIDI2Njc3OTUyNTZVLAkvLyA8MSw1LDYsNj46IENvc3QgMyB2ZXh0MiA8dSw0LDEsNT4sIDw2LDYsNiw2PgorICAyNzEzOTMxODc0VSwJLy8gPDEsNSw2LDc+OiBDb3N0IDMgdmV4dDMgPDQsdSw1LDE+LCA8NSw2LDcsMD4KKyAgMjcxMzkzMTg4M1UsCS8vIDwxLDUsNix1PjogQ29zdCAzIHZleHQzIDw0LHUsNSwxPiwgPDUsNix1LDA+CisgIDI1NTcxOTg0MzhVLAkvLyA8MSw1LDcsMD46IENvc3QgMyB2ZXh0MSA8MSwxLDUsNz4sIExIUworICAyNTU3MTk5MTU2VSwJLy8gPDEsNSw3LDE+OiBDb3N0IDMgdmV4dDEgPDEsMSw1LDc+LCA8MSwxLDEsMT4KKyAgMjU2OTE0Mzk3NFUsCS8vIDwxLDUsNywyPjogQ29zdCAzIHZleHQxIDwzLDEsNSw3PiwgPDIsMywwLDE+CisgIDI1NjkxNDQ1OTJVLAkvLyA8MSw1LDcsMz46IENvc3QgMyB2ZXh0MSA8MywxLDUsNz4sIDwzLDEsNSw3PgorICAyNTU3MjAxNzE4VSwJLy8gPDEsNSw3LDQ+OiBDb3N0IDMgdmV4dDEgPDEsMSw1LDc+LCBSSFMKKyAgMjcxMzkzMTk0NFUsCS8vIDwxLDUsNyw1PjogQ29zdCAzIHZleHQzIDw0LHUsNSwxPiwgPDUsNyw1LDc+CisgIDM3ODc2NzM3NzBVLAkvLyA8MSw1LDcsNj46IENvc3QgNCB2ZXh0MyA8NCx1LDUsMT4sIDw1LDcsNiwwPgorICAyNzE5Mzg3ODI4VSwJLy8gPDEsNSw3LDc+OiBDb3N0IDMgdmV4dDMgPDUsNyw3LDE+LCA8NSw3LDcsMT4KKyAgMjU1NzIwNDI3MFUsCS8vIDwxLDUsNyx1PjogQ29zdCAzIHZleHQxIDwxLDEsNSw3PiwgTEhTCisgIDI2MjAwMjA0MzVVLAkvLyA8MSw1LHUsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDx1LDAsMSwyPgorICAxNTQ2Mjc4NzAyVSwJLy8gPDEsNSx1LDE+OiBDb3N0IDIgdmV4dDIgPDAsNCwxLDU+LCBMSFMKKyAgMjYyMDAyMDYxNlUsCS8vIDwxLDUsdSwyPjogQ29zdCAzIHZleHQyIDwwLDQsMSw1PiwgPHUsMiwzLDM+CisgIDI2MjAwMjA2NjhVLAkvLyA8MSw1LHUsMz46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDx1LDMsMCwxPgorICAxNTk0MDU0NjgyVSwJLy8gPDEsNSx1LDQ+OiBDb3N0IDIgdmV4dDIgPHUsNCwxLDU+LCA8dSw0LDEsNT4KKyAgMTU0NjI3OTA2NlUsCS8vIDwxLDUsdSw1PjogQ29zdCAyIHZleHQyIDwwLDQsMSw1PiwgUkhTCisgIDI2MjAwMjA5NDRVLAkvLyA8MSw1LHUsNj46IENvc3QgMyB2ZXh0MiA8MCw0LDEsNT4sIDx1LDYsMyw3PgorICAyMDE0MTQ1ODQ2VSwJLy8gPDEsNSx1LDc+OiBDb3N0IDIgdnRybnIgTEhTLCBSSFMKKyAgMjAxNDE0NTg0N1UsCS8vIDwxLDUsdSx1PjogQ29zdCAyIHZ0cm5yIExIUywgUkhTCisgIDM2OTI0Mzc1MDRVLAkvLyA8MSw2LDAsMD46IENvc3QgNCB2ZXh0MiA8MCwyLDEsNj4sIDwwLDAsMCwwPgorICAyNjE4Njk1NzgyVSwJLy8gPDEsNiwwLDE+OiBDb3N0IDMgdmV4dDIgPDAsMiwxLDY+LCBMSFMKKyAgMjYxODY5NTg1N1UsCS8vIDwxLDYsMCwyPjogQ29zdCAzIHZleHQyIDwwLDIsMSw2PiwgPDAsMiwxLDY+CisgIDM3OTQxNjE5NzBVLAkvLyA8MSw2LDAsMz46IENvc3QgNCB2ZXh0MyA8NiwwLDMsMT4sIDw2LDAsMywxPgorICAyNjIwMDIzMTIyVSwJLy8gPDEsNiwwLDQ+OiBDb3N0IDMgdmV4dDIgPDAsNCwxLDY+LCA8MCw0LDEsNT4KKyAgMjYyMDY4Njc1NlUsCS8vIDwxLDYsMCw1PjogQ29zdCAzIHZleHQyIDwwLDUsMSw2PiwgPDAsNSwxLDY+CisgIDI2MjEzNTAzODlVLAkvLyA8MSw2LDAsNj46IENvc3QgMyB2ZXh0MiA8MCw2LDEsNj4sIDwwLDYsMSw2PgorICA0MDI4NTk5NjA2VSwJLy8gPDEsNiwwLDc+OiBDb3N0IDQgdnppcHIgPDAsMywxLDA+LCBSSFMKKyAgMjYxODY5NjM0OVUsCS8vIDwxLDYsMCx1PjogQ29zdCAzIHZleHQyIDwwLDIsMSw2PiwgTEhTCisgIDM2OTI0MzgyNjJVLAkvLyA8MSw2LDEsMD46IENvc3QgNCB2ZXh0MiA8MCwyLDEsNj4sIDwxLDAsMywyPgorICAyNjI1OTk1NTcyVSwJLy8gPDEsNiwxLDE+OiBDb3N0IDMgdmV4dDIgPDEsNCwxLDY+LCA8MSwxLDEsMT4KKyAgMzY5MjQzODQyMlUsCS8vIDwxLDYsMSwyPjogQ29zdCA0IHZleHQyIDwwLDIsMSw2PiwgPDEsMiwzLDA+CisgIDM2OTI0Mzg0ODhVLAkvLyA8MSw2LDEsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDEsNj4sIDwxLDMsMSwzPgorICAyNjI1OTk1ODIwVSwJLy8gPDEsNiwxLDQ+OiBDb3N0IDMgdmV4dDIgPDEsNCwxLDY+LCA8MSw0LDEsNj4KKyAgMzY5MjQzODY3MlUsCS8vIDwxLDYsMSw1PjogQ29zdCA0IHZleHQyIDwwLDIsMSw2PiwgPDEsNSwzLDc+CisgIDM2OTI0Mzg3MjBVLAkvLyA8MSw2LDEsNj46IENvc3QgNCB2ZXh0MiA8MCwyLDEsNj4sIDwxLDYsMCwxPgorICAyOTU4MTgzNzM0VSwJLy8gPDEsNiwxLDc+OiBDb3N0IDMgdnppcHIgPDAsdSwxLDE+LCBSSFMKKyAgMjk1ODE4MzczNVUsCS8vIDwxLDYsMSx1PjogQ29zdCAzIHZ6aXByIDwwLHUsMSwxPiwgUkhTCisgIDI3MjE1MjYyMDFVLAkvLyA8MSw2LDIsMD46IENvc3QgMyB2ZXh0MyA8NiwyLDAsMT4sIDw2LDIsMCwxPgorICAzNjkyNDM5MDk3VSwJLy8gPDEsNiwyLDE+OiBDb3N0IDQgdmV4dDIgPDAsMiwxLDY+LCA8MiwxLDYsMD4KKyAgMzY5MjQzOTE0NFUsCS8vIDwxLDYsMiwyPjogQ29zdCA0IHZleHQyIDwwLDIsMSw2PiwgPDIsMiwyLDI+CisgIDM2OTI0MzkyMDZVLAkvLyA8MSw2LDIsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDEsNj4sIDwyLDMsMCwxPgorICAzNjM2OTQ4Mjc4VSwJLy8gPDEsNiwyLDQ+OiBDb3N0IDQgdmV4dDEgPDIsMSw2LDI+LCBSSFMKKyAgMzc4NzY3NDA5MlUsCS8vIDwxLDYsMiw1PjogQ29zdCA0IHZleHQzIDw0LHUsNSwxPiwgPDYsMiw1LDc+CisgIDI2MTg2OTc2NThVLAkvLyA8MSw2LDIsNj46IENvc3QgMyB2ZXh0MiA8MCwyLDEsNj4sIDwyLDYsMyw3PgorICAyOTcwNzk5NDE0VSwJLy8gPDEsNiwyLDc+OiBDb3N0IDMgdnppcHIgPDMsMCwxLDI+LCBSSFMKKyAgMjk3MDc5OTQxNVUsCS8vIDwxLDYsMix1PjogQ29zdCAzIHZ6aXByIDwzLDAsMSwyPiwgUkhTCisgIDI1NjMyMTEzNjZVLAkvLyA8MSw2LDMsMD46IENvc3QgMyB2ZXh0MSA8MiwxLDYsMz4sIExIUworICAzNjk5NzM4ODU0VSwJLy8gPDEsNiwzLDE+OiBDb3N0IDQgdmV4dDIgPDEsNCwxLDY+LCA8MywxLDEsMT4KKyAgMjU2MzIxMjg2MFUsCS8vIDwxLDYsMywyPjogQ29zdCAzIHZleHQxIDwyLDEsNiwzPiwgPDIsMSw2LDM+CisgIDM2OTI0Mzk5NjRVLAkvLyA8MSw2LDMsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDEsNj4sIDwzLDMsMywzPgorICAyNTYzMjE0NjQ2VSwJLy8gPDEsNiwzLDQ+OiBDb3N0IDMgdmV4dDEgPDIsMSw2LDM+LCBSSFMKKyAgNDE5MTgyMDAxOFUsCS8vIDwxLDYsMyw1PjogQ29zdCA0IHZ0cm5yIDw1LDEsNywzPiwgPHUsNiw3LDU+CisgIDI1ODcxMDM2NDhVLAkvLyA8MSw2LDMsNj46IENvc3QgMyB2ZXh0MSA8NiwxLDYsMz4sIDw2LDEsNiwzPgorICAzMDg3ODQ1MzA2VSwJLy8gPDEsNiwzLDc+OiBDb3N0IDMgdnRybnIgTEhTLCA8Miw2LDMsNz4KKyAgMzA4Nzg0NTMwN1UsCS8vIDwxLDYsMyx1PjogQ29zdCAzIHZ0cm5yIExIUywgPDIsNiwzLHU+CisgIDM2OTM3Njc1NzBVLAkvLyA8MSw2LDQsMD46IENvc3QgNCB2ZXh0MiA8MCw0LDEsNj4sIDw0LDAsNSwxPgorICAzNjkzNzY3NjUwVSwJLy8gPDEsNiw0LDE+OiBDb3N0IDQgdmV4dDIgPDAsNCwxLDY+LCA8NCwxLDUsMD4KKyAgMzYzNjk2Mjg3N1UsCS8vIDwxLDYsNCwyPjogQ29zdCA0IHZleHQxIDwyLDEsNiw0PiwgPDIsMSw2LDQ+CisgIDMzMjUwODgxMzRVLAkvLyA8MSw2LDQsMz46IENvc3QgNCB2cmV2IDw2LDEsMyw0PgorICAzNjkzNzY3ODk4VSwJLy8gPDEsNiw0LDQ+OiBDb3N0IDQgdmV4dDIgPDAsNCwxLDY+LCA8NCw0LDUsNT4KKyAgMjYxODY5OTA2MlUsCS8vIDwxLDYsNCw1PjogQ29zdCAzIHZleHQyIDwwLDIsMSw2PiwgUkhTCisgIDM4MzM2NzA5NjZVLAkvLyA8MSw2LDQsNj46IENvc3QgNCB2dXpwbCA8MSwzLDYsNz4sIFJIUworICA0MDI4NjMyMzc0VSwJLy8gPDEsNiw0LDc+OiBDb3N0IDQgdnppcHIgPDAsMywxLDQ+LCBSSFMKKyAgMjYxODY5OTMwNVUsCS8vIDwxLDYsNCx1PjogQ29zdCAzIHZleHQyIDwwLDIsMSw2PiwgUkhTCisgIDM2OTM3NjgyNjRVLAkvLyA8MSw2LDUsMD46IENvc3QgNCB2ZXh0MiA8MCw0LDEsNj4sIDw1LDAsMSwyPgorICAzNjMwOTk4MzczVSwJLy8gPDEsNiw1LDE+OiBDb3N0IDQgdmV4dDEgPDEsMSw2LDU+LCA8MSwxLDYsNT4KKyAgMzYzNjk3MTA3MFUsCS8vIDwxLDYsNSwyPjogQ29zdCA0IHZleHQxIDwyLDEsNiw1PiwgPDIsMSw2LDU+CisgIDM2NDI5NDM3NjdVLAkvLyA8MSw2LDUsMz46IENvc3QgNCB2ZXh0MSA8MywxLDYsNT4sIDwzLDEsNiw1PgorICAzNjkzNzY4NjI4VSwJLy8gPDEsNiw1LDQ+OiBDb3N0IDQgdmV4dDIgPDAsNCwxLDY+LCA8NSw0LDUsNj4KKyAgMzczMjkxODI3NlUsCS8vIDwxLDYsNSw1PjogQ29zdCA0IHZleHQyIDw3LDAsMSw2PiwgPDUsNSw1LDU+CisgIDI2MjA2OTA1MzBVLAkvLyA8MSw2LDUsNj46IENvc3QgMyB2ZXh0MiA8MCw1LDEsNj4sIDw1LDYsNywwPgorICAyOTU1NTYyMjk0VSwJLy8gPDEsNiw1LDc+OiBDb3N0IDMgdnppcHIgPDAsNCwxLDU+LCBSSFMKKyAgMjk1NTU2MjI5NVUsCS8vIDwxLDYsNSx1PjogQ29zdCAzIHZ6aXByIDwwLDQsMSw1PiwgUkhTCisgIDI3MjQxODA3MzNVLAkvLyA8MSw2LDYsMD46IENvc3QgMyB2ZXh0MyA8Niw2LDAsMT4sIDw2LDYsMCwxPgorICAzNjMxMDA2NTY2VSwJLy8gPDEsNiw2LDE+OiBDb3N0IDQgdmV4dDEgPDEsMSw2LDY+LCA8MSwxLDYsNj4KKyAgMzYzMTAwNzY3NFUsCS8vIDwxLDYsNiwyPjogQ29zdCA0IHZleHQxIDwxLDEsNiw2PiwgPDIsNiwzLDc+CisgIDM2OTI0NDIxODRVLAkvLyA8MSw2LDYsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDEsNj4sIDw2LDMsNywwPgorICAzNjMxMDA5MDc4VSwJLy8gPDEsNiw2LDQ+OiBDb3N0IDQgdmV4dDEgPDEsMSw2LDY+LCBSSFMKKyAgMzc4NzY3NDQxNlUsCS8vIDwxLDYsNiw1PjogQ29zdCA0IHZleHQzIDw0LHUsNSwxPiwgPDYsNiw1LDc+CisgIDI3MTM5MzI2MDBVLAkvLyA8MSw2LDYsNj46IENvc3QgMyB2ZXh0MyA8NCx1LDUsMT4sIDw2LDYsNiw2PgorICAyNzEzOTMyNjEwVSwJLy8gPDEsNiw2LDc+OiBDb3N0IDMgdmV4dDMgPDQsdSw1LDE+LCA8Niw2LDcsNz4KKyAgMjcxMzkzMjYxOVUsCS8vIDwxLDYsNix1PjogQ29zdCAzIHZleHQzIDw0LHUsNSwxPiwgPDYsNix1LDc+CisgIDE2NTExMDI1NDJVLAkvLyA8MSw2LDcsMD46IENvc3QgMiB2ZXh0MyA8Niw3LDAsMT4sIDw2LDcsMCwxPgorICAyNzI0OTE4MTAzVSwJLy8gPDEsNiw3LDE+OiBDb3N0IDMgdmV4dDMgPDYsNywxLDE+LCA8Niw3LDEsMT4KKyAgMjY5ODMwMjMwNlUsCS8vIDwxLDYsNywyPjogQ29zdCAzIHZleHQzIDwyLDMsMCwxPiwgPDYsNywyLDM+CisgIDM2NDI5NjAxNTNVLAkvLyA8MSw2LDcsMz46IENvc3QgNCB2ZXh0MSA8MywxLDYsNz4sIDwzLDEsNiw3PgorICAyNzEzOTMyNjYyVSwJLy8gPDEsNiw3LDQ+OiBDb3N0IDMgdmV4dDMgPDQsdSw1LDE+LCA8Niw3LDQsNT4KKyAgMjcyNTIxMzA1MVUsCS8vIDwxLDYsNyw1PjogQ29zdCAzIHZleHQzIDw2LDcsNSwxPiwgPDYsNyw1LDE+CisgIDI3MjQ4NDQ0MjZVLAkvLyA8MSw2LDcsNj46IENvc3QgMyB2ZXh0MyA8Niw3LDAsMT4sIDw2LDcsNiw3PgorICA0MDM1OTU2MDIyVSwJLy8gPDEsNiw3LDc+OiBDb3N0IDQgdnppcHIgPDEsNSwxLDc+LCBSSFMKKyAgMTY1MTY5MjQzOFUsCS8vIDwxLDYsNyx1PjogQ29zdCAyIHZleHQzIDw2LDcsdSwxPiwgPDYsNyx1LDE+CisgIDE2NTE3NjYxNzVVLAkvLyA8MSw2LHUsMD46IENvc3QgMiB2ZXh0MyA8Nix1LDAsMT4sIDw2LHUsMCwxPgorICAyNjE4NzAxNjE0VSwJLy8gPDEsNix1LDE+OiBDb3N0IDMgdmV4dDIgPDAsMiwxLDY+LCBMSFMKKyAgMzEzNTY2MzUwOFUsCS8vIDwxLDYsdSwyPjogQ29zdCAzIHZ0cm5yIExIUywgPDQsNix1LDI+CisgIDM2OTI0NDM1ODBVLAkvLyA8MSw2LHUsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDEsNj4sIDx1LDMsMCwxPgorICAyNzEzOTMyNzQzVSwJLy8gPDEsNix1LDQ+OiBDb3N0IDMgdmV4dDMgPDQsdSw1LDE+LCA8Nix1LDQsNT4KKyAgMjYxODcwMTk3OFUsCS8vIDwxLDYsdSw1PjogQ29zdCAzIHZleHQyIDwwLDIsMSw2PiwgUkhTCisgIDI2MjI2ODMzNDRVLAkvLyA8MSw2LHUsNj46IENvc3QgMyB2ZXh0MiA8MCx1LDEsNj4sIDx1LDYsMyw3PgorICAzMDg3ODg2MjY2VSwJLy8gPDEsNix1LDc+OiBDb3N0IDMgdnRybnIgTEhTLCA8Miw2LDMsNz4KKyAgMTY1MjM1NjA3MVUsCS8vIDwxLDYsdSx1PjogQ29zdCAyIHZleHQzIDw2LHUsdSwxPiwgPDYsdSx1LDE+CisgIDI3MjYxNzE2MzJVLAkvLyA8MSw3LDAsMD46IENvc3QgMyB2ZXh0MyA8NywwLDAsMT4sIDw3LDAsMCwxPgorICAyNjI2NjY2NTk4VSwJLy8gPDEsNywwLDE+OiBDb3N0IDMgdmV4dDIgPDEsNSwxLDc+LCBMSFMKKyAgMzY5NTEwMDA2N1UsCS8vIDwxLDcsMCwyPjogQ29zdCA0IHZleHQyIDwwLDYsMSw3PiwgPDAsMiwwLDE+CisgIDM3MDcwNDQxMDJVLAkvLyA8MSw3LDAsMz46IENvc3QgNCB2ZXh0MiA8Miw2LDEsNz4sIDwwLDMsMiwxPgorICAyNzI2NDY2NTgwVSwJLy8gPDEsNywwLDQ+OiBDb3N0IDMgdmV4dDMgPDcsMCw0LDE+LCA8NywwLDQsMT4KKyAgMzY1NDkyMTkzM1UsCS8vIDwxLDcsMCw1PjogQ29zdCA0IHZleHQxIDw1LDEsNywwPiwgPDUsMSw3LDA+CisgIDI2MjEzNTg1ODJVLAkvLyA8MSw3LDAsNj46IENvc3QgMyB2ZXh0MiA8MCw2LDEsNz4sIDwwLDYsMSw3PgorICAyNjIyMDIyMjE1VSwJLy8gPDEsNywwLDc+OiBDb3N0IDMgdmV4dDIgPDAsNywxLDc+LCA8MCw3LDEsNz4KKyAgMjYyNjY2NzE2NVUsCS8vIDwxLDcsMCx1PjogQ29zdCAzIHZleHQyIDwxLDUsMSw3PiwgTEhTCisgIDI1OTMxMjg1NTBVLAkvLyA8MSw3LDEsMD46IENvc3QgMyB2ZXh0MSA8NywxLDcsMT4sIExIUworICAyNjI2NjY3MzE2VSwJLy8gPDEsNywxLDE+OiBDb3N0IDMgdmV4dDIgPDEsNSwxLDc+LCA8MSwxLDEsMT4KKyAgMzcwMDQwOTIzOFUsCS8vIDwxLDcsMSwyPjogQ29zdCA0IHZleHQyIDwxLDUsMSw3PiwgPDEsMiwzLDA+CisgIDIyNTcyOTQ0MjhVLAkvLyA8MSw3LDEsMz46IENvc3QgMyB2cmV2IDw3LDEsMywxPgorICAyNTkzMTMxODMwVSwJLy8gPDEsNywxLDQ+OiBDb3N0IDMgdmV4dDEgPDcsMSw3LDE+LCBSSFMKKyAgMjYyNjY2NzY0NlUsCS8vIDwxLDcsMSw1PjogQ29zdCAzIHZleHQyIDwxLDUsMSw3PiwgPDEsNSwxLDc+CisgIDI2MjczMzEyNzlVLAkvLyA8MSw3LDEsNj46IENvc3QgMyB2ZXh0MiA8MSw2LDEsNz4sIDwxLDYsMSw3PgorICAyNTkzMTMzNjk2VSwJLy8gPDEsNywxLDc+OiBDb3N0IDMgdmV4dDEgPDcsMSw3LDE+LCA8NywxLDcsMT4KKyAgMjYyODY1ODU0NVUsCS8vIDwxLDcsMSx1PjogQ29zdCAzIHZleHQyIDwxLHUsMSw3PiwgPDEsdSwxLDc+CisgIDI1ODcxNjQ3NzRVLAkvLyA8MSw3LDIsMD46IENvc3QgMyB2ZXh0MSA8NiwxLDcsMj4sIExIUworICAzNzAxMDczNDQ1VSwJLy8gPDEsNywyLDE+OiBDb3N0IDQgdmV4dDIgPDEsNiwxLDc+LCA8MiwxLDMsNz4KKyAgMzcwMDQwOTk2MFUsCS8vIDwxLDcsMiwyPjogQ29zdCA0IHZleHQyIDwxLDUsMSw3PiwgPDIsMiwyLDI+CisgIDI2Mzg2MTIxMzRVLAkvLyA8MSw3LDIsMz46IENvc3QgMyB2ZXh0MiA8Myw1LDEsNz4sIDwyLDMsMCwxPgorICAyNTg3MTY4MDU0VSwJLy8gPDEsNywyLDQ+OiBDb3N0IDMgdmV4dDEgPDYsMSw3LDI+LCBSSFMKKyAgMzcwNjM4MjE2N1UsCS8vIDwxLDcsMiw1PjogQ29zdCA0IHZleHQyIDwyLDUsMSw3PiwgPDIsNSwxLDc+CisgIDI1ODcxNjkxOTJVLAkvLyA8MSw3LDIsNj46IENvc3QgMyB2ZXh0MSA8NiwxLDcsMj4sIDw2LDEsNywyPgorICAzNjYwOTExNjEwVSwJLy8gPDEsNywyLDc+OiBDb3N0IDQgdmV4dDEgPDYsMSw3LDI+LCA8NywwLDEsMj4KKyAgMjU4NzE3MDYwNlUsCS8vIDwxLDcsMix1PjogQ29zdCAzIHZleHQxIDw2LDEsNywyPiwgTEhTCisgIDE1MDc0NTkxNzRVLAkvLyA8MSw3LDMsMD46IENvc3QgMiB2ZXh0MSA8NSwxLDcsMz4sIExIUworICAyNTY5MjU3OTg0VSwJLy8gPDEsNywzLDE+OiBDb3N0IDMgdmV4dDEgPDMsMSw3LDM+LCA8MSwzLDUsNz4KKyAgMjU4MTIwMjUzNlUsCS8vIDwxLDcsMywyPjogQ29zdCAzIHZleHQxIDw1LDEsNywzPiwgPDIsMiwyLDI+CisgIDI1NjkyNTkyOTRVLAkvLyA8MSw3LDMsMz46IENvc3QgMyB2ZXh0MSA8MywxLDcsMz4sIDwzLDEsNywzPgorICAxNTA3NDYyNDU0VSwJLy8gPDEsNywzLDQ+OiBDb3N0IDIgdmV4dDEgPDUsMSw3LDM+LCBSSFMKKyAgMTUwNzQ2Mjg2NFUsCS8vIDwxLDcsMyw1PjogQ29zdCAyIHZleHQxIDw1LDEsNywzPiwgPDUsMSw3LDM+CisgIDI1ODEyMDU0OThVLAkvLyA8MSw3LDMsNj46IENvc3QgMyB2ZXh0MSA8NSwxLDcsMz4sIDw2LDIsNywzPgorICAyNTgxMjA2MDEwVSwJLy8gPDEsNywzLDc+OiBDb3N0IDMgdmV4dDEgPDUsMSw3LDM+LCA8NywwLDEsMj4KKyAgMTUwNzQ2NTAwNlUsCS8vIDwxLDcsMyx1PjogQ29zdCAyIHZleHQxIDw1LDEsNywzPiwgTEhTCisgIDI3Mjg4MjYxNjRVLAkvLyA8MSw3LDQsMD46IENvc3QgMyB2ZXh0MyA8Nyw0LDAsMT4sIDw3LDQsMCwxPgorICAzNjU0OTUxNzMyVSwJLy8gPDEsNyw0LDE+OiBDb3N0IDQgdmV4dDEgPDUsMSw3LDQ+LCA8MSwxLDEsMT4KKyAgMzMzMDk4NzA5NFUsCS8vIDwxLDcsNCwyPjogQ29zdCA0IHZyZXYgPDcsMSwyLDQ+CisgIDMzMzEwNjA4MzFVLAkvLyA8MSw3LDQsMz46IENvc3QgNCB2cmV2IDw3LDEsMyw0PgorICAzNzg3Njc0OTcxVSwJLy8gPDEsNyw0LDQ+OiBDb3N0IDQgdmV4dDMgPDQsdSw1LDE+LCA8Nyw0LDQsND4KKyAgMjYyNjY2OTg3OFUsCS8vIDwxLDcsNCw1PjogQ29zdCAzIHZleHQyIDwxLDUsMSw3PiwgUkhTCisgIDM3ODU5NzkyNDFVLAkvLyA8MSw3LDQsNj46IENvc3QgNCB2ZXh0MyA8NCw2LDAsMT4sIDw3LDQsNiwwPgorICAzNzg3MDg1MTc2VSwJLy8gPDEsNyw0LDc+OiBDb3N0IDQgdmV4dDMgPDQsNyw2LDE+LCA8Nyw0LDcsNj4KKyAgMjYyNjY3MDEyMVUsCS8vIDwxLDcsNCx1PjogQ29zdCAzIHZleHQyIDwxLDUsMSw3PiwgUkhTCisgIDI1NjkyNzM0NDZVLAkvLyA8MSw3LDUsMD46IENvc3QgMyB2ZXh0MSA8MywxLDcsNT4sIExIUworICAyNTY5Mjc0MzY4VSwJLy8gPDEsNyw1LDE+OiBDb3N0IDMgdmV4dDEgPDMsMSw3LDU+LCA8MSwzLDUsNz4KKyAgMzY0MzAxNjgwOFUsCS8vIDwxLDcsNSwyPjogQ29zdCA0IHZleHQxIDwzLDEsNyw1PiwgPDIsMiwyLDI+CisgIDI1NjkyNzU2ODBVLAkvLyA8MSw3LDUsMz46IENvc3QgMyB2ZXh0MSA8MywxLDcsNT4sIDwzLDEsNyw1PgorICAyNTY5Mjc2NzI2VSwJLy8gPDEsNyw1LDQ+OiBDb3N0IDMgdmV4dDEgPDMsMSw3LDU+LCBSSFMKKyAgNDEwMjAzNDc5MFUsCS8vIDwxLDcsNSw1PjogQ29zdCA0IHZ0cm5sIDwxLDMsNSw3PiwgPDcsNCw1LDY+CisgIDI2NTEyMjIwNjdVLAkvLyA8MSw3LDUsNj46IENvc3QgMyB2ZXh0MiA8NSw2LDEsNz4sIDw1LDYsMSw3PgorICAzODk5Mzc4OTk4VSwJLy8gPDEsNyw1LDc+OiBDb3N0IDQgdnV6cHIgPDEsMSw1LDc+LCBSSFMKKyAgMjU2OTI3OTI3OFUsCS8vIDwxLDcsNSx1PjogQ29zdCAzIHZleHQxIDwzLDEsNyw1PiwgTEhTCisgIDI3MzAxNTM0MzBVLAkvLyA8MSw3LDYsMD46IENvc3QgMyB2ZXh0MyA8Nyw2LDAsMT4sIDw3LDYsMCwxPgorICAyNzI0ODQ1MDIyVSwJLy8gPDEsNyw2LDE+OiBDb3N0IDMgdmV4dDMgPDYsNywwLDE+LCA8Nyw2LDEsMD4KKyAgMzY0MzAyNTMzOFUsCS8vIDwxLDcsNiwyPjogQ29zdCA0IHZleHQxIDwzLDEsNyw2PiwgPDIsNiwzLDc+CisgIDM2NDMwMjU2OTdVLAkvLyA8MSw3LDYsMz46IENvc3QgNCB2ZXh0MSA8MywxLDcsNj4sIDwzLDEsNyw2PgorICAzNjQzMDI2NzQyVSwJLy8gPDEsNyw2LDQ+OiBDb3N0IDQgdmV4dDEgPDMsMSw3LDY+LCBSSFMKKyAgMzY1NDk3MTA5MVUsCS8vIDwxLDcsNiw1PjogQ29zdCA0IHZleHQxIDw1LDEsNyw2PiwgPDUsMSw3LDY+CisgIDM3ODc2NzUxNTNVLAkvLyA8MSw3LDYsNj46IENvc3QgNCB2ZXh0MyA8NCx1LDUsMT4sIDw3LDYsNiw2PgorICAyNzI0ODQ1MDc2VSwJLy8gPDEsNyw2LDc+OiBDb3N0IDMgdmV4dDMgPDYsNywwLDE+LCA8Nyw2LDcsMD4KKyAgMjcyNTUwODYzN1UsCS8vIDwxLDcsNix1PjogQ29zdCAzIHZleHQzIDw2LHUsMCwxPiwgPDcsNix1LDA+CisgIDI3MzA4MTcwNjNVLAkvLyA8MSw3LDcsMD46IENvc3QgMyB2ZXh0MyA8Nyw3LDAsMT4sIDw3LDcsMCwxPgorICAzNjMxMDg4NDM2VSwJLy8gPDEsNyw3LDE+OiBDb3N0IDQgdmV4dDEgPDEsMSw3LDc+LCA8MSwxLDEsMT4KKyAgMzY2MDk0OTE1OFUsCS8vIDwxLDcsNywyPjogQ29zdCA0IHZleHQxIDw2LDEsNyw3PiwgPDIsMywwLDE+CisgIDM4MDE5MDQ3MDVVLAkvLyA8MSw3LDcsMz46IENvc3QgNCB2ZXh0MyA8NywzLDAsMT4sIDw3LDcsMywwPgorICAzNjMxMDkwOTk4VSwJLy8gPDEsNyw3LDQ+OiBDb3N0IDQgdmV4dDEgPDEsMSw3LDc+LCBSSFMKKyAgMjY2MjUwMzgyOFUsCS8vIDwxLDcsNyw1PjogQ29zdCAzIHZleHQyIDw3LDUsMSw3PiwgPDcsNSwxLDc+CisgIDM2NjA5NTE5ODFVLAkvLyA8MSw3LDcsNj46IENvc3QgNCB2ZXh0MSA8NiwxLDcsNz4sIDw2LDEsNyw3PgorICAyNzEzOTMzNDIwVSwJLy8gPDEsNyw3LDc+OiBDb3N0IDMgdmV4dDMgPDQsdSw1LDE+LCA8Nyw3LDcsNz4KKyAgMjczMTQwNjk1OVUsCS8vIDwxLDcsNyx1PjogQ29zdCAzIHZleHQzIDw3LDcsdSwxPiwgPDcsNyx1LDE+CisgIDE1MDc1MDAxMzRVLAkvLyA8MSw3LHUsMD46IENvc3QgMiB2ZXh0MSA8NSwxLDcsdT4sIExIUworICAyNjI2NjcyNDMwVSwJLy8gPDEsNyx1LDE+OiBDb3N0IDMgdmV4dDIgPDEsNSwxLDc+LCBMSFMKKyAgMjU4MTI0MzQ5NlUsCS8vIDwxLDcsdSwyPjogQ29zdCAzIHZleHQxIDw1LDEsNyx1PiwgPDIsMiwyLDI+CisgIDI1NjkzMDAyNTlVLAkvLyA8MSw3LHUsMz46IENvc3QgMyB2ZXh0MSA8MywxLDcsdT4sIDwzLDEsNyx1PgorICAxNTA3NTAzNDE0VSwJLy8gPDEsNyx1LDQ+OiBDb3N0IDIgdmV4dDEgPDUsMSw3LHU+LCBSSFMKKyAgMTUwNzUwMzgyOVUsCS8vIDwxLDcsdSw1PjogQ29zdCAyIHZleHQxIDw1LDEsNyx1PiwgPDUsMSw3LHU+CisgIDI1ODEyNDY0NThVLAkvLyA8MSw3LHUsNj46IENvc3QgMyB2ZXh0MSA8NSwxLDcsdT4sIDw2LDIsNywzPgorICAyNTgxMjQ2OTcwVSwJLy8gPDEsNyx1LDc+OiBDb3N0IDMgdmV4dDEgPDUsMSw3LHU+LCA8NywwLDEsMj4KKyAgMTUwNzUwNTk2NlUsCS8vIDwxLDcsdSx1PjogQ29zdCAyIHZleHQxIDw1LDEsNyx1PiwgTEhTCisgIDE1NDM2NDMxNTNVLAkvLyA8MSx1LDAsMD46IENvc3QgMiB2ZXh0MiA8MCwwLDEsdT4sIDwwLDAsMSx1PgorICAxNTQ2Mjk3NDQ2VSwJLy8gPDEsdSwwLDE+OiBDb3N0IDIgdmV4dDIgPDAsNCwxLHU+LCBMSFMKKyAgMjgxOTQ0ODg1MlUsCS8vIDwxLHUsMCwyPjogQ29zdCAzIHZ1enByIExIUywgPDAsMCwyLDI+CisgIDI2MTkzNzU4NzZVLAkvLyA8MSx1LDAsMz46IENvc3QgMyB2ZXh0MiA8MCwzLDEsdT4sIDwwLDMsMSx1PgorICAxNTQ2Mjk3Njg1VSwJLy8gPDEsdSwwLDQ+OiBDb3N0IDIgdmV4dDIgPDAsNCwxLHU+LCA8MCw0LDEsdT4KKyAgMTY1ODc3MTE5MFUsCS8vIDwxLHUsMCw1PjogQ29zdCAyIHZleHQzIDx1LDAsNSwxPiwgPHUsMCw1LDE+CisgIDI3MzY3ODkyNDhVLAkvLyA8MSx1LDAsNj46IENvc3QgMyB2ZXh0MyA8dSw3LDAsMT4sIDx1LDAsNiwyPgorICAyNjU5MTg5Mzc2VSwJLy8gPDEsdSwwLDc+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLHU+LCA8MCw3LHUsMT4KKyAgMTU0NjI5ODAxM1UsCS8vIDwxLHUsMCx1PjogQ29zdCAyIHZleHQyIDwwLDQsMSx1PiwgTEhTCisgIDE0ODMxMTI1NTBVLAkvLyA8MSx1LDEsMD46IENvc3QgMiB2ZXh0MSA8MSwxLDEsMT4sIExIUworICAyMDIxNjIyNzhVLAkvLyA8MSx1LDEsMT46IENvc3QgMSB2ZHVwMSBMSFMKKyAgMTYxNjAwOTAwNlUsCS8vIDwxLHUsMSwyPjogQ29zdCAyIHZleHQzIDwwLHUsMSwxPiwgTEhTCisgIDE3NDU3MDcxMTBVLAkvLyA8MSx1LDEsMz46IENvc3QgMiB2dXpwciBMSFMsIExIUworICAxNDgzMTE1ODMwVSwJLy8gPDEsdSwxLDQ+OiBDb3N0IDIgdmV4dDEgPDEsMSwxLDE+LCBSSFMKKyAgMjYyMDA0MDMzNlUsCS8vIDwxLHUsMSw1PjogQ29zdCAzIHZleHQyIDwwLDQsMSx1PiwgPDEsNSwzLDc+CisgIDMwMjY2MjI2MThVLAkvLyA8MSx1LDEsNj46IENvc3QgMyB2dHJubCA8MSwxLDEsMT4sIFJIUworICAyOTU4MTgzNzUyVSwJLy8gPDEsdSwxLDc+OiBDb3N0IDMgdnppcHIgPDAsdSwxLDE+LCBSSFMKKyAgMjAyMTYyMjc4VSwJLy8gPDEsdSwxLHU+OiBDb3N0IDEgdmR1cDEgTEhTCisgIDI4MTk0NDk3NTBVLAkvLyA8MSx1LDIsMD46IENvc3QgMyB2dXpwciBMSFMsIDwxLDIsMywwPgorICAyODkzMjA3MzQyVSwJLy8gPDEsdSwyLDE+OiBDb3N0IDMgdnppcGwgPDEsMiwzLDA+LCBMSFMKKyAgMjgxOTQ0ODk5NlUsCS8vIDwxLHUsMiwyPjogQ29zdCAzIHZ1enByIExIUywgPDAsMiwwLDI+CisgIDI4MTk0NTA0ODJVLAkvLyA8MSx1LDIsMz46IENvc3QgMyB2dXpwciBMSFMsIDwyLDIsMywzPgorICAyODE5NDQ5NzU0VSwJLy8gPDEsdSwyLDQ+OiBDb3N0IDMgdnV6cHIgTEhTLCA8MSwyLDMsND4KKyAgMjg5MzIwNzcwNlUsCS8vIDwxLHUsMiw1PjogQ29zdCAzIHZ6aXBsIDwxLDIsMywwPiwgUkhTCisgIDI4MTk0NDkwMzZVLAkvLyA8MSx1LDIsNj46IENvc3QgMyB2dXpwciBMSFMsIDwwLDIsNCw2PgorICAyOTcwNzk5NDMyVSwJLy8gPDEsdSwyLDc+OiBDb3N0IDMgdnppcHIgPDMsMCwxLDI+LCBSSFMKKyAgMjgxOTQ0OTAwMlUsCS8vIDwxLHUsMix1PjogQ29zdCAzIHZ1enByIExIUywgPDAsMiwwLHU+CisgIDQwMzkzMTI5MlUsCS8vIDwxLHUsMywwPjogQ29zdCAxIHZleHQxIExIUywgTEhTCisgIDE0Nzc2NzM3MThVLAkvLyA8MSx1LDMsMT46IENvc3QgMiB2ZXh0MSBMSFMsIDwxLDAsMywyPgorICAxMTU3MjYxMjZVLAkvLyA8MSx1LDMsMj46IENvc3QgMSB2cmV2IExIUworICAyMDE0MTAyMTczVSwJLy8gPDEsdSwzLDM+OiBDb3N0IDIgdnRybnIgTEhTLCBMSFMKKyAgNDAzOTM0NTE4VSwJLy8gPDEsdSwzLDQ+OiBDb3N0IDEgdmV4dDEgTEhTLCBSSFMKKyAgMTUwNzUzNjYwMVUsCS8vIDwxLHUsMyw1PjogQ29zdCAyIHZleHQxIDw1LDEsdSwzPiwgPDUsMSx1LDM+CisgIDE1MjU0NTMzMDZVLAkvLyA8MSx1LDMsNj46IENvc3QgMiB2ZXh0MSBMSFMsIDw2LDIsNywzPgorICAyMDE0MTA1MTI5VSwJLy8gPDEsdSwzLDc+OiBDb3N0IDIgdnRybnIgTEhTLCBSSFMKKyAgNDAzOTM3MDcwVSwJLy8gPDEsdSwzLHU+OiBDb3N0IDEgdmV4dDEgTEhTLCBMSFMKKyAgMjYyMDA0MjE1N1UsCS8vIDwxLHUsNCwwPjogQ29zdCAzIHZleHQyIDwwLDQsMSx1PiwgPDQsMCx1LDE+CisgIDI2MjAwNDIyMzdVLAkvLyA8MSx1LDQsMT46IENvc3QgMyB2ZXh0MiA8MCw0LDEsdT4sIDw0LDEsdSwwPgorICAyMjYzMjE3OTY3VSwJLy8gPDEsdSw0LDI+OiBDb3N0IDMgdnJldiA8dSwxLDIsND4KKyAgMjU2OTM0MTIyNFUsCS8vIDwxLHUsNCwzPjogQ29zdCAzIHZleHQxIDwzLDEsdSw0PiwgPDMsMSx1LDQ+CisgIDI1NjkzNDIyNjJVLAkvLyA8MSx1LDQsND46IENvc3QgMyB2ZXh0MSA8MywxLHUsND4sIFJIUworICAxNTQ2MzAwNzI2VSwJLy8gPDEsdSw0LDU+OiBDb3N0IDIgdmV4dDIgPDAsNCwxLHU+LCBSSFMKKyAgMjgxOTQ0OTE4MFUsCS8vIDwxLHUsNCw2PjogQ29zdCAzIHZ1enByIExIUywgPDAsNCwyLDY+CisgIDI3MjQ4NDU2NDlVLAkvLyA8MSx1LDQsNz46IENvc3QgMyB2ZXh0MyA8Niw3LDAsMT4sIDx1LDQsNyw2PgorICAxNTQ2MzAwOTY5VSwJLy8gPDEsdSw0LHU+OiBDb3N0IDIgdmV4dDIgPDAsNCwxLHU+LCBSSFMKKyAgMjU1MTQzMTI3MFUsCS8vIDwxLHUsNSwwPjogQ29zdCAzIHZleHQxIDwwLDEsdSw1PiwgTEhTCisgIDI1NTE0MzIxOTJVLAkvLyA8MSx1LDUsMT46IENvc3QgMyB2ZXh0MSA8MCwxLHUsNT4sIDwxLDMsNSw3PgorICAzMDI4MjkzNDIyVSwJLy8gPDEsdSw1LDI+OiBDb3N0IDMgdnRybmwgPDEsMyw1LDc+LCBMSFMKKyAgMjk1NTU1OTA2OFUsCS8vIDwxLHUsNSwzPjogQ29zdCAzIHZ6aXByIDwwLDQsMSw1PiwgTEhTCisgIDI1NTE0MzQ1NTBVLAkvLyA8MSx1LDUsND46IENvc3QgMyB2ZXh0MSA8MCwxLHUsNT4sIFJIUworICAyODk1MjU1NzA2VSwJLy8gPDEsdSw1LDU+OiBDb3N0IDMgdnppcGwgPDEsNSwzLDc+LCBSSFMKKyAgMTYxNjAwOTM3MFUsCS8vIDwxLHUsNSw2PjogQ29zdCAyIHZleHQzIDwwLHUsMSwxPiwgUkhTCisgIDE3NDU3MTAzOTBVLAkvLyA8MSx1LDUsNz46IENvc3QgMiB2dXpwciBMSFMsIFJIUworICAxNzQ1NzEwMzkxVSwJLy8gPDEsdSw1LHU+OiBDb3N0IDIgdnV6cHIgTEhTLCBSSFMKKyAgMjY1MzIyMTE1OVUsCS8vIDwxLHUsNiwwPjogQ29zdCAzIHZleHQyIDw2LDAsMSx1PiwgPDYsMCwxLHU+CisgIDI3MjU1MDkzMDNVLAkvLyA8MSx1LDYsMT46IENvc3QgMyB2ZXh0MyA8Nix1LDAsMT4sIDx1LDYsMSwwPgorICAyNjU5MTkzMzM4VSwJLy8gPDEsdSw2LDI+OiBDb3N0IDMgdmV4dDIgPDcsMCwxLHU+LCA8NiwyLDcsMz4KKyAgMjY4OTc1MTI0OFUsCS8vIDwxLHUsNiwzPjogQ29zdCAzIHZleHQzIDwwLHUsMSwxPiwgPHUsNiwzLDc+CisgIDI4NjcyMjg3NzRVLAkvLyA8MSx1LDYsND46IENvc3QgMyB2dXpwciBMSFMsIDw1LDYsNyw0PgorICAzNzY0ODIwMTk0VSwJLy8gPDEsdSw2LDU+OiBDb3N0IDQgdmV4dDMgPDEsMSwxLDE+LCA8dSw2LDUsNz4KKyAgMjY1NzIwMjk1N1UsCS8vIDwxLHUsNiw2PjogQ29zdCAzIHZleHQyIDw2LDYsMSx1PiwgPDYsNiwxLHU+CisgIDI4MTk0NTA4MTBVLAkvLyA8MSx1LDYsNz46IENvc3QgMyB2dXpwciBMSFMsIDwyLDYsMyw3PgorICAyODE5NDUwODExVSwJLy8gPDEsdSw2LHU+OiBDb3N0IDMgdnV6cHIgTEhTLCA8Miw2LDMsdT4KKyAgMTU4NTQ1MjAzMlUsCS8vIDwxLHUsNywwPjogQ29zdCAyIHZleHQyIDw3LDAsMSx1PiwgPDcsMCwxLHU+CisgIDI1NTc0MjAzNDBVLAkvLyA8MSx1LDcsMT46IENvc3QgMyB2ZXh0MSA8MSwxLHUsNz4sIDwxLDEsMSwxPgorICAyNTY5MzY1MTU4VSwJLy8gPDEsdSw3LDI+OiBDb3N0IDMgdmV4dDEgPDMsMSx1LDc+LCA8MiwzLDAsMT4KKyAgMjU2OTM2NTgwM1UsCS8vIDwxLHUsNywzPjogQ29zdCAzIHZleHQxIDwzLDEsdSw3PiwgPDMsMSx1LDc+CisgIDI1NTc0MjI5MDJVLAkvLyA8MSx1LDcsND46IENvc3QgMyB2ZXh0MSA8MSwxLHUsNz4sIFJIUworICAyNjYyNTEyMDIxVSwJLy8gPDEsdSw3LDU+OiBDb3N0IDMgdmV4dDIgPDcsNSwxLHU+LCA8Nyw1LDEsdT4KKyAgMjcyNDg0NTg4NFUsCS8vIDwxLHUsNyw2PjogQ29zdCAzIHZleHQzIDw2LDcsMCwxPiwgPHUsNyw2LDc+CisgIDI2NTkxOTQ0NzZVLAkvLyA8MSx1LDcsNz46IENvc3QgMyB2ZXh0MiA8NywwLDEsdT4sIDw3LDcsNyw3PgorICAxNTkwNzYxMDk2VSwJLy8gPDEsdSw3LHU+OiBDb3N0IDIgdmV4dDIgPDcsdSwxLHU+LCA8Nyx1LDEsdT4KKyAgNDAzOTcyMjU3VSwJLy8gPDEsdSx1LDA+OiBDb3N0IDEgdmV4dDEgTEhTLCBMSFMKKyAgMjAyMTYyMjc4VSwJLy8gPDEsdSx1LDE+OiBDb3N0IDEgdmR1cDEgTEhTCisgIDExNTc2NzA5MVUsCS8vIDwxLHUsdSwyPjogQ29zdCAxIHZyZXYgTEhTCisgIDE3NDU3MDc2NzdVLAkvLyA8MSx1LHUsMz46IENvc3QgMiB2dXpwciBMSFMsIExIUworICA0MDM5NzU0NzhVLAkvLyA8MSx1LHUsND46IENvc3QgMSB2ZXh0MSBMSFMsIFJIUworICAxNTQ2MzAzNjQyVSwJLy8gPDEsdSx1LDU+OiBDb3N0IDIgdmV4dDIgPDAsNCwxLHU+LCBSSFMKKyAgMTYxNjAwOTYxM1UsCS8vIDwxLHUsdSw2PjogQ29zdCAyIHZleHQzIDwwLHUsMSwxPiwgUkhTCisgIDE3NDU3MTA2MzNVLAkvLyA8MSx1LHUsNz46IENvc3QgMiB2dXpwciBMSFMsIFJIUworICA0MDM5NzgwMzBVLAkvLyA8MSx1LHUsdT46IENvc3QgMSB2ZXh0MSBMSFMsIExIUworICAyNTUxNDYzOTM2VSwJLy8gPDIsMCwwLDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwwLDA+LCA8MCwwLDAsMD4KKyAgMjY4NTY5ODA1OFUsCS8vIDwyLDAsMCwxPjogQ29zdCAzIHZleHQzIDwwLDIsMCwyPiwgPDAsMCwxLDE+CisgIDE2MTA3NzY1OTZVLAkvLyA8MiwwLDAsMj46IENvc3QgMiB2ZXh0MyA8MCwwLDIsMj4sIDwwLDAsMiwyPgorICAyNjE5Mzg0MDY5VSwJLy8gPDIsMCwwLDM+OiBDb3N0IDMgdmV4dDIgPDAsMywyLDA+LCA8MCwzLDIsMD4KKyAgMjU1MTQ2NzMxOFUsCS8vIDwyLDAsMCw0PjogQ29zdCAzIHZleHQxIDwwLDIsMCwwPiwgUkhTCisgIDM4OTk4MzY1OTZVLAkvLyA8MiwwLDAsNT46IENvc3QgNCB2dXpwciA8MSwyLDMsMD4sIDwzLDAsNCw1PgorICAyNjIxMzc0OTY4VSwJLy8gPDIsMCwwLDY+OiBDb3N0IDMgdmV4dDIgPDAsNiwyLDA+LCA8MCw2LDIsMD4KKyAgNDE2ODI3MTMzNFUsCS8vIDwyLDAsMCw3PjogQ29zdCA0IHZ0cm5yIDwxLDIsMywwPiwgPDIsMCw1LDc+CisgIDE2MTEyMTkwMThVLAkvLyA8MiwwLDAsdT46IENvc3QgMiB2ZXh0MyA8MCwwLHUsMj4sIDwwLDAsdSwyPgorICAyNTUxNDcyMTM4VSwJLy8gPDIsMCwxLDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwwLDE+LCA8MCwwLDEsMT4KKyAgMjY5MDU2NDE4NlUsCS8vIDwyLDAsMSwxPjogQ29zdCAzIHZleHQzIDwxLDAsMywyPiwgPDAsMSwxLDA+CisgIDE2MTE5NTYzMjZVLAkvLyA8MiwwLDEsMj46IENvc3QgMiB2ZXh0MyA8MCwyLDAsMj4sIExIUworICAyODI2MDkyNjQ2VSwJLy8gPDIsMCwxLDM+OiBDb3N0IDMgdnV6cHIgPDEsMiwzLDA+LCBMSFMKKyAgMjU1MTQ3NTUxMFUsCS8vIDwyLDAsMSw0PjogQ29zdCAzIHZleHQxIDwwLDIsMCwxPiwgUkhTCisgIDM2OTI0NjMyNDhVLAkvLyA8MiwwLDEsNT46IENvc3QgNCB2ZXh0MiA8MCwyLDIsMD4sIDwxLDUsMyw3PgorICAyNTg3MzA4NDczVSwJLy8gPDIsMCwxLDY+OiBDb3N0IDMgdmV4dDEgPDYsMiwwLDE+LCA8NiwyLDAsMT4KKyAgMzY2MTA1MDg3NFUsCS8vIDwyLDAsMSw3PjogQ29zdCA0IHZleHQxIDw2LDIsMCwxPiwgPDcsMCwxLDI+CisgIDE2MTE5NTYzODBVLAkvLyA8MiwwLDEsdT46IENvc3QgMiB2ZXh0MyA8MCwyLDAsMj4sIExIUworICAxNDc3NzM4NTk4VSwJLy8gPDIsMCwyLDA+OiBDb3N0IDIgdmV4dDEgPDAsMiwwLDI+LCBMSFMKKyAgMjU1MTQ4MTA3OFUsCS8vIDwyLDAsMiwxPjogQ29zdCAzIHZleHQxIDwwLDIsMCwyPiwgPDEsMCwzLDI+CisgIDI1NTE0ODE3OTZVLAkvLyA8MiwwLDIsMj46IENvc3QgMyB2ZXh0MSA8MCwyLDAsMj4sIDwyLDAsMiwwPgorICAyNTUxNDgyNTE4VSwJLy8gPDIsMCwyLDM+OiBDb3N0IDMgdmV4dDEgPDAsMiwwLDI+LCA8MywwLDEsMj4KKyAgMTQ3Nzc0MTg3OFUsCS8vIDwyLDAsMiw0PjogQ29zdCAyIHZleHQxIDwwLDIsMCwyPiwgUkhTCisgIDI1NTE0ODQxMTJVLAkvLyA8MiwwLDIsNT46IENvc3QgMyB2ZXh0MSA8MCwyLDAsMj4sIDw1LDEsNywzPgorICAyNTUxNDg0NzU5VSwJLy8gPDIsMCwyLDY+OiBDb3N0IDMgdmV4dDEgPDAsMiwwLDI+LCA8NiwwLDcsMj4KKyAgMjU1MTQ4NTQzNFUsCS8vIDwyLDAsMiw3PjogQ29zdCAzIHZleHQxIDwwLDIsMCwyPiwgPDcsMCwxLDI+CisgIDE0Nzc3NDQ0MzBVLAkvLyA8MiwwLDIsdT46IENvc3QgMiB2ZXh0MSA8MCwyLDAsMj4sIExIUworICAyOTUzNjI1NjAwVSwJLy8gPDIsMCwzLDA+OiBDb3N0IDMgdnppcHIgTEhTLCA8MCwwLDAsMD4KKyAgMjk1MzYyNzMwMlUsCS8vIDwyLDAsMywxPjogQ29zdCAzIHZ6aXByIExIUywgPDIsMywwLDE+CisgIDI5NTM2MjU3NjRVLAkvLyA8MiwwLDMsMj46IENvc3QgMyB2emlwciBMSFMsIDwwLDIsMCwyPgorICA0MDI3MzY5Njk1VSwJLy8gPDIsMCwzLDM+OiBDb3N0IDQgdnppcHIgTEhTLCA8MywxLDAsMz4KKyAgMzYyNTIzMzcxOFUsCS8vIDwyLDAsMyw0PjogQ29zdCA0IHZleHQxIDwwLDIsMCwzPiwgUkhTCisgIDM4OTk4MzYxMTBVLAkvLyA8MiwwLDMsNT46IENvc3QgNCB2dXpwciA8MSwyLDMsMD4sIDwyLDMsNCw1PgorICA0MDMyMDEyNjE4VSwJLy8gPDIsMCwzLDY+OiBDb3N0IDQgdnppcHIgTEhTLCA8MCw0LDAsNj4KKyAgMzg5OTgzNTM5MlUsCS8vIDwyLDAsMyw3PjogQ29zdCA0IHZ1enByIDwxLDIsMywwPiwgPDEsMyw1LDc+CisgIDI5NTM2MjU3NzBVLAkvLyA8MiwwLDMsdT46IENvc3QgMyB2emlwciBMSFMsIDwwLDIsMCx1PgorICAyNTUxNDk2ODA2VSwJLy8gPDIsMCw0LDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwwLDQ+LCBMSFMKKyAgMjY4NTY5ODM4NlUsCS8vIDwyLDAsNCwxPjogQ29zdCAzIHZleHQzIDwwLDIsMCwyPiwgPDAsNCwxLDU+CisgIDI2ODU2OTgzOTZVLAkvLyA8MiwwLDQsMj46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwwLDQsMiw2PgorICAzNjI1MjQwNzI2VSwJLy8gPDIsMCw0LDM+OiBDb3N0IDQgdmV4dDEgPDAsMiwwLDQ+LCA8MywwLDEsMj4KKyAgMjU1MTUwMDA4NlUsCS8vIDwyLDAsNCw0PjogQ29zdCAzIHZleHQxIDwwLDIsMCw0PiwgUkhTCisgIDI2MTg3MjM2MzhVLAkvLyA8MiwwLDQsNT46IENvc3QgMyB2ZXh0MiA8MCwyLDIsMD4sIFJIUworICAyNzY1NDA5NTkwVSwJLy8gPDIsMCw0LDY+OiBDb3N0IDMgdnV6cGwgPDIsMywwLDE+LCBSSFMKKyAgMzc5OTk5MDY2NFUsCS8vIDwyLDAsNCw3PjogQ29zdCA0IHZleHQzIDw3LDAsMSwyPiwgPDAsNCw3LDU+CisgIDI2ODU2OTg0NTBVLAkvLyA8MiwwLDQsdT46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwwLDQsdSw2PgorICAzNjI1MjQ2ODIyVSwJLy8gPDIsMCw1LDA+OiBDb3N0IDQgdmV4dDEgPDAsMiwwLDU+LCBMSFMKKyAgMzI4OTc3NjMwNFUsCS8vIDwyLDAsNSwxPjogQ29zdCA0IHZyZXYgPDAsMiwxLDU+CisgIDI2OTA1NjQ1MjZVLAkvLyA8MiwwLDUsMj46IENvc3QgMyB2ZXh0MyA8MSwwLDMsMj4sIDwwLDUsMiw3PgorICAzMjg5OTIzNzc4VSwJLy8gPDIsMCw1LDM+OiBDb3N0IDQgdnJldiA8MCwyLDMsNT4KKyAgMjIxNjI1NTY5MVUsCS8vIDwyLDAsNSw0PjogQ29zdCAzIHZyZXYgPDAsMiw0LDU+CisgIDM3MjYzMDczMzJVLAkvLyA8MiwwLDUsNT46IENvc3QgNCB2ZXh0MiA8NSx1LDIsMD4sIDw1LDUsNSw1PgorICAzNzI2MzA3NDI2VSwJLy8gPDIsMCw1LDY+OiBDb3N0IDQgdmV4dDIgPDUsdSwyLDA+LCA8NSw2LDcsMD4KKyAgMjgyNjA5NTkyNlUsCS8vIDwyLDAsNSw3PjogQ29zdCAzIHZ1enByIDwxLDIsMywwPiwgUkhTCisgIDIyMTY1NTA2MzlVLAkvLyA8MiwwLDUsdT46IENvc3QgMyB2cmV2IDwwLDIsdSw1PgorICA0MTYyNDIwNzM2VSwJLy8gPDIsMCw2LDA+OiBDb3N0IDQgdnRybnIgPDAsMiw0LDY+LCA8MCwwLDAsMD4KKyAgMjkwMTg4NTAzMFUsCS8vIDwyLDAsNiwxPjogQ29zdCAzIHZ6aXBsIDwyLDYsMyw3PiwgTEhTCisgIDI2ODU2OTg1NTlVLAkvLyA8MiwwLDYsMj46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwwLDYsMiw3PgorICAzNjQzMTczMTcxVSwJLy8gPDIsMCw2LDM+OiBDb3N0IDQgdmV4dDEgPDMsMiwwLDY+LCA8MywyLDAsNj4KKyAgMjIxNjI2Mzg4NFUsCS8vIDwyLDAsNiw0PjogQ29zdCAzIHZyZXYgPDAsMiw0LDY+CisgIDM3MzAyODkzNDFVLAkvLyA8MiwwLDYsNT46IENvc3QgNCB2ZXh0MiA8Niw1LDIsMD4sIDw2LDUsMiwwPgorICAzNzI2MzA4MTUyVSwJLy8gPDIsMCw2LDY+OiBDb3N0IDQgdmV4dDIgPDUsdSwyLDA+LCA8Niw2LDYsNj4KKyAgMzg5OTgzNjM0NlUsCS8vIDwyLDAsNiw3PjogQ29zdCA0IHZ1enByIDwxLDIsMywwPiwgPDIsNiwzLDc+CisgIDIyMTY1NTg4MzJVLAkvLyA8MiwwLDYsdT46IENvc3QgMyB2cmV2IDwwLDIsdSw2PgorICAyNjU5MjAyMDQ5VSwJLy8gPDIsMCw3LDA+OiBDb3N0IDMgdmV4dDIgPDcsMCwyLDA+LCA8NywwLDIsMD4KKyAgMzcyNjMwODQzN1UsCS8vIDwyLDAsNywxPjogQ29zdCA0IHZleHQyIDw1LHUsMiwwPiwgPDcsMSwyLDM+CisgIDI3MjYyNDkwMzRVLAkvLyA8MiwwLDcsMj46IENvc3QgMyB2ZXh0MyA8NywwLDEsMj4sIDwwLDcsMiwxPgorICAzNzM0OTM0NzcyVSwJLy8gPDIsMCw3LDM+OiBDb3N0IDQgdmV4dDIgPDcsMywyLDA+LCA8NywzLDIsMD4KKyAgMzcyNjMwODcxMFUsCS8vIDwyLDAsNyw0PjogQ29zdCA0IHZleHQyIDw1LHUsMiwwPiwgPDcsNCw1LDY+CisgIDM3MjYzMDg4MTRVLAkvLyA8MiwwLDcsNT46IENvc3QgNCB2ZXh0MiA8NSx1LDIsMD4sIDw3LDUsdSwyPgorICAzNzM2OTI1NjcxVSwJLy8gPDIsMCw3LDY+OiBDb3N0IDQgdmV4dDIgPDcsNiwyLDA+LCA8Nyw2LDIsMD4KKyAgMzcyNjMwODk3MlUsCS8vIDwyLDAsNyw3PjogQ29zdCA0IHZleHQyIDw1LHUsMiwwPiwgPDcsNyw3LDc+CisgIDI2NTkyMDIwNDlVLAkvLyA8MiwwLDcsdT46IENvc3QgMyB2ZXh0MiA8NywwLDIsMD4sIDw3LDAsMiwwPgorICAxNDc3Nzg3NzUwVSwJLy8gPDIsMCx1LDA+OiBDb3N0IDIgdmV4dDEgPDAsMiwwLHU+LCBMSFMKKyAgMjk1MzY2ODI2MlUsCS8vIDwyLDAsdSwxPjogQ29zdCAzIHZ6aXByIExIUywgPDIsMywwLDE+CisgIDE2MTE5NTY4OTNVLAkvLyA8MiwwLHUsMj46IENvc3QgMiB2ZXh0MyA8MCwyLDAsMj4sIExIUworICAyNTUxNTMxNjcwVSwJLy8gPDIsMCx1LDM+OiBDb3N0IDMgdmV4dDEgPDAsMiwwLHU+LCA8MywwLDEsMj4KKyAgMTQ3Nzc5MTAzMFUsCS8vIDwyLDAsdSw0PjogQ29zdCAyIHZleHQxIDwwLDIsMCx1PiwgUkhTCisgIDI2MTg3MjY1NTRVLAkvLyA8MiwwLHUsNT46IENvc3QgMyB2ZXh0MiA8MCwyLDIsMD4sIFJIUworICAyNzY1NDEyNTA2VSwJLy8gPDIsMCx1LDY+OiBDb3N0IDMgdnV6cGwgPDIsMywwLDE+LCBSSFMKKyAgMjgyNjA5NjE2OVUsCS8vIDwyLDAsdSw3PjogQ29zdCAzIHZ1enByIDwxLDIsMywwPiwgUkhTCisgIDE2MTE5NTY5NDdVLAkvLyA8MiwwLHUsdT46IENvc3QgMiB2ZXh0MyA8MCwyLDAsMj4sIExIUworICAyNTY5NDUzNjcwVSwJLy8gPDIsMSwwLDA+OiBDb3N0IDMgdmV4dDEgPDMsMiwxLDA+LCBMSFMKKyAgMjYxOTM5MjEwMlUsCS8vIDwyLDEsMCwxPjogQ29zdCAzIHZleHQyIDwwLDMsMiwxPiwgTEhTCisgIDM3NTk0NDA2MTlVLAkvLyA8MiwxLDAsMj46IENvc3QgNCB2ZXh0MyA8MCwyLDAsMj4sIDwxLDAsMiwwPgorICAxNjE2ODIzMDMwVSwJLy8gPDIsMSwwLDM+OiBDb3N0IDIgdmV4dDMgPDEsMCwzLDI+LCA8MSwwLDMsMj4KKyAgMjU2OTQ1Njk1MFUsCS8vIDwyLDEsMCw0PjogQ29zdCAzIHZleHQxIDwzLDIsMSwwPiwgUkhTCisgIDI2OTA3MTIzMjhVLAkvLyA8MiwxLDAsNT46IENvc3QgMyB2ZXh0MyA8MSwwLDUsMj4sIDwxLDAsNSwyPgorICAzNjYxMTE1ODQxVSwJLy8gPDIsMSwwLDY+OiBDb3N0IDQgdmV4dDEgPDYsMiwxLDA+LCA8NiwyLDEsMD4KKyAgMjYyMjA0Njc5NFUsCS8vIDwyLDEsMCw3PjogQ29zdCAzIHZleHQyIDwwLDcsMiwxPiwgPDAsNywyLDE+CisgIDE2MTcxOTE3MTVVLAkvLyA8MiwxLDAsdT46IENvc3QgMiB2ZXh0MyA8MSwwLHUsMj4sIDwxLDAsdSwyPgorICAyNTUxNTQ1OTU4VSwJLy8gPDIsMSwxLDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwxLDE+LCBMSFMKKyAgMjY4NTY5ODg2OFUsCS8vIDwyLDEsMSwxPjogQ29zdCAzIHZleHQzIDwwLDIsMCwyPiwgPDEsMSwxLDE+CisgIDI2Mjg2ODI2NDZVLAkvLyA8MiwxLDEsMj46IENvc3QgMyB2ZXh0MiA8MSx1LDIsMT4sIDwxLDIsMywwPgorICAyNjg1Njk4ODg4VSwJLy8gPDIsMSwxLDM+OiBDb3N0IDMgdmV4dDMgPDAsMiwwLDI+LCA8MSwxLDMsMz4KKyAgMjU1MTU0OTIzOFUsCS8vIDwyLDEsMSw0PjogQ29zdCAzIHZleHQxIDwwLDIsMSwxPiwgUkhTCisgIDM2OTMxMzQ5OTJVLAkvLyA8MiwxLDEsNT46IENvc3QgNCB2ZXh0MiA8MCwzLDIsMT4sIDwxLDUsMyw3PgorICAzNjYxMTI0MDM0VSwJLy8gPDIsMSwxLDY+OiBDb3N0IDQgdmV4dDEgPDYsMiwxLDE+LCA8NiwyLDEsMT4KKyAgMzYyNTI5Mjc5NFUsCS8vIDwyLDEsMSw3PjogQ29zdCA0IHZleHQxIDwwLDIsMSwxPiwgPDcsMCwxLDI+CisgIDI2ODU2OTg5MzNVLAkvLyA8MiwxLDEsdT46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwxLDEsdSwzPgorICAyNTUxNTU0MTUwVSwJLy8gPDIsMSwyLDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwxLDI+LCBMSFMKKyAgMzg5MzY0OTU3MVUsCS8vIDwyLDEsMiwxPjogQ29zdCA0IHZ1enByIDwwLDIsMCwxPiwgPDAsMiwwLDE+CisgIDI1NTE1NTU2ODhVLAkvLyA8MiwxLDIsMj46IENvc3QgMyB2ZXh0MSA8MCwyLDEsMj4sIDwyLDIsMiwyPgorICAyNjg1Njk4OTY2VSwJLy8gPDIsMSwyLDM+OiBDb3N0IDMgdmV4dDMgPDAsMiwwLDI+LCA8MSwyLDMsMD4KKyAgMjU1MTU1NzQzMFUsCS8vIDwyLDEsMiw0PjogQ29zdCAzIHZleHQxIDwwLDIsMSwyPiwgUkhTCisgIDM3NjM0MjIxMjNVLAkvLyA8MiwxLDIsNT46IENvc3QgNCB2ZXh0MyA8MCx1LDAsMj4sIDwxLDIsNSwzPgorICAzNjkzMTM1ODAyVSwJLy8gPDIsMSwyLDY+OiBDb3N0IDQgdmV4dDIgPDAsMywyLDE+LCA8Miw2LDMsNz4KKyAgMjcyNjI0OTQwMlUsCS8vIDwyLDEsMiw3PjogQ29zdCAzIHZleHQzIDw3LDAsMSwyPiwgPDEsMiw3LDA+CisgIDI2ODU2OTkwMTFVLAkvLyA8MiwxLDIsdT46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwxLDIsdSwwPgorICAyNTUxNTYyMzQyVSwJLy8gPDIsMSwzLDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwxLDM+LCBMSFMKKyAgMjk1MzYyNTYxMFUsCS8vIDwyLDEsMywxPjogQ29zdCAzIHZ6aXByIExIUywgPDAsMCwxLDE+CisgIDI5NTM2Mjc3OThVLAkvLyA8MiwxLDMsMj46IENvc3QgMyB2emlwciBMSFMsIDwzLDAsMSwyPgorICAyOTUzNjI2NTg0VSwJLy8gPDIsMSwzLDM+OiBDb3N0IDMgdnppcHIgTEhTLCA8MSwzLDEsMz4KKyAgMjU1MTU2NTYyMlUsCS8vIDwyLDEsMyw0PjogQ29zdCAzIHZleHQxIDwwLDIsMSwzPiwgUkhTCisgIDI5NTM2MjU5MzhVLAkvLyA8MiwxLDMsNT46IENvc3QgMyB2emlwciBMSFMsIDwwLDQsMSw1PgorICAyNTg3Mzk4NTk2VSwJLy8gPDIsMSwzLDY+OiBDb3N0IDMgdmV4dDEgPDYsMiwxLDM+LCA8NiwyLDEsMz4KKyAgNDAzMjAxMzUxOVUsCS8vIDwyLDEsMyw3PjogQ29zdCA0IHZ6aXByIExIUywgPDEsNiwxLDc+CisgIDI5NTM2MjU2MTdVLAkvLyA8MiwxLDMsdT46IENvc3QgMyB2emlwciBMSFMsIDwwLDAsMSx1PgorICAyNjkwNTY1MTU0VSwJLy8gPDIsMSw0LDA+OiBDb3N0IDMgdmV4dDMgPDEsMCwzLDI+LCA8MSw0LDAsNT4KKyAgMzYyNTMxMzI3MFUsCS8vIDwyLDEsNCwxPjogQ29zdCA0IHZleHQxIDwwLDIsMSw0PiwgPDEsMyw0LDY+CisgIDM3NzE1MzIzNDBVLAkvLyA8MiwxLDQsMj46IENvc3QgNCB2ZXh0MyA8MiwyLDIsMj4sIDwxLDQsMiw1PgorICAxMTQ4NDA0NjM0VSwJLy8gPDIsMSw0LDM+OiBDb3N0IDIgdnJldiA8MSwyLDMsND4KKyAgMzYyNTMxNTYzOFUsCS8vIDwyLDEsNCw0PjogQ29zdCA0IHZleHQxIDwwLDIsMSw0PiwgUkhTCisgIDI2MTkzOTUzODJVLAkvLyA8MiwxLDQsNT46IENvc3QgMyB2ZXh0MiA8MCwzLDIsMT4sIFJIUworICAzODM3MjQyNjc4VSwJLy8gPDIsMSw0LDY+OiBDb3N0IDQgdnV6cGwgPDIsMCwxLDI+LCBSSFMKKyAgMzc5OTk5MTM5NFUsCS8vIDwyLDEsNCw3PjogQ29zdCA0IHZleHQzIDw3LDAsMSwyPiwgPDEsNCw3LDY+CisgIDExNDg3NzMzMTlVLAkvLyA8MiwxLDQsdT46IENvc3QgMiB2cmV2IDwxLDIsdSw0PgorICAyNTUxNTc4NzI2VSwJLy8gPDIsMSw1LDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwxLDU+LCBMSFMKKyAgMjU1MTU3OTY0OFUsCS8vIDwyLDEsNSwxPjogQ29zdCAzIHZleHQxIDwwLDIsMSw1PiwgPDEsMyw1LDc+CisgIDM2MjUzMjE5NTJVLAkvLyA8MiwxLDUsMj46IENvc3QgNCB2ZXh0MSA8MCwyLDEsNT4sIDwyLDAsNSwxPgorICAyNjg1Njk5MjE2VSwJLy8gPDIsMSw1LDM+OiBDb3N0IDMgdmV4dDMgPDAsMiwwLDI+LCA8MSw1LDMsNz4KKyAgMjU1MTU4MjAwNlUsCS8vIDwyLDEsNSw0PjogQ29zdCAzIHZleHQxIDwwLDIsMSw1PiwgUkhTCisgIDM3NDA5MTM2NjhVLAkvLyA8MiwxLDUsNT46IENvc3QgNCB2ZXh0MiA8dSwzLDIsMT4sIDw1LDUsNSw1PgorICAzNjYxMTU2ODA2VSwJLy8gPDIsMSw1LDY+OiBDb3N0IDQgdmV4dDEgPDYsMiwxLDU+LCA8NiwyLDEsNT4KKyAgMzg5MzY1Mjc5MFUsCS8vIDwyLDEsNSw3PjogQ29zdCA0IHZ1enByIDwwLDIsMCwxPiwgUkhTCisgIDI2ODU2OTkyNjFVLAkvLyA8MiwxLDUsdT46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwxLDUsdSw3PgorICAyNTUxNTg2OTE4VSwJLy8gPDIsMSw2LDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwxLDY+LCBMSFMKKyAgMzYyNTMyOTM5OFUsCS8vIDwyLDEsNiwxPjogQ29zdCA0IHZleHQxIDwwLDIsMSw2PiwgPDEsMCwzLDI+CisgIDI1NTE1ODg3OTRVLAkvLyA8MiwxLDYsMj46IENvc3QgMyB2ZXh0MSA8MCwyLDEsNj4sIDwyLDYsMyw3PgorICAzMDg4Njc5MDE0VSwJLy8gPDIsMSw2LDM+OiBDb3N0IDMgdnRybnIgPDAsMiw0LDY+LCBMSFMKKyAgMjU1MTU5MDE5OFUsCS8vIDwyLDEsNiw0PjogQ29zdCAzIHZleHQxIDwwLDIsMSw2PiwgUkhTCisgIDQwMjkzODI5OTRVLAkvLyA8MiwxLDYsNT46IENvc3QgNCB2emlwciA8MCw0LDIsNj4sIDwwLDQsMSw1PgorICAzNjI1MzMzNTYwVSwJLy8gPDIsMSw2LDY+OiBDb3N0IDQgdmV4dDEgPDAsMiwxLDY+LCA8Niw2LDYsNj4KKyAgMzczMTYyNDgwMFUsCS8vIDwyLDEsNiw3PjogQ29zdCA0IHZleHQyIDw2LDcsMiwxPiwgPDYsNywyLDE+CisgIDI1NTE1OTI3NTBVLAkvLyA8MiwxLDYsdT46IENvc3QgMyB2ZXh0MSA8MCwyLDEsNj4sIExIUworICAyNjIyMDUxMzIyVSwJLy8gPDIsMSw3LDA+OiBDb3N0IDMgdmV4dDIgPDAsNywyLDE+LCA8NywwLDEsMj4KKyAgMzczMzYxNTY5OVUsCS8vIDwyLDEsNywxPjogQ29zdCA0IHZleHQyIDw3LDEsMiwxPiwgPDcsMSwyLDE+CisgIDM3OTUxMjU1MzhVLAkvLyA8MiwxLDcsMj46IENvc3QgNCB2ZXh0MyA8NiwxLDcsMj4sIDwxLDcsMiwwPgorICAyMjIyMTcxMDM3VSwJLy8gPDIsMSw3LDM+OiBDb3N0IDMgdnJldiA8MSwyLDMsNz4KKyAgMzc0MDkxNTA0NlUsCS8vIDwyLDEsNyw0PjogQ29zdCA0IHZleHQyIDx1LDMsMiwxPiwgPDcsNCw1LDY+CisgIDMyOTYwNjAzMzVVLAkvLyA8MiwxLDcsNT46IENvc3QgNCB2cmV2IDwxLDIsNSw3PgorICAzNzM2OTMzODY0VSwJLy8gPDIsMSw3LDY+OiBDb3N0IDQgdmV4dDIgPDcsNiwyLDE+LCA8Nyw2LDIsMT4KKyAgMzgwNTMwMDA1NVUsCS8vIDwyLDEsNyw3PjogQ29zdCA0IHZleHQzIDw3LHUsMSwyPiwgPDEsNyw3LHU+CisgIDI2Njk4Mjc3MTRVLAkvLyA8MiwxLDcsdT46IENvc3QgMyB2ZXh0MiA8dSw3LDIsMT4sIDw3LHUsMSwyPgorICAyNTUxNjAzMzAyVSwJLy8gPDIsMSx1LDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwxLHU+LCBMSFMKKyAgMjk1MzY2NjU3MFUsCS8vIDwyLDEsdSwxPjogQ29zdCAzIHZ6aXByIExIUywgPDAsMCwxLDE+CisgIDI5NTM2Njg3NThVLAkvLyA8MiwxLHUsMj46IENvc3QgMyB2emlwciBMSFMsIDwzLDAsMSwyPgorICAxMTQ4NDM3NDA2VSwJLy8gPDIsMSx1LDM+OiBDb3N0IDIgdnJldiA8MSwyLDMsdT4KKyAgMjU1MTYwNjU4MlUsCS8vIDwyLDEsdSw0PjogQ29zdCAzIHZleHQxIDwwLDIsMSx1PiwgUkhTCisgIDI5NTM2NjY4OThVLAkvLyA8MiwxLHUsNT46IENvc3QgMyB2emlwciBMSFMsIDwwLDQsMSw1PgorICAyNTg3Mzk4NTk2VSwJLy8gPDIsMSx1LDY+OiBDb3N0IDMgdmV4dDEgPDYsMiwxLDM+LCA8NiwyLDEsMz4KKyAgMjY2OTgyODM3MFUsCS8vIDwyLDEsdSw3PjogQ29zdCAzIHZleHQyIDx1LDcsMiwxPiwgPHUsNywyLDE+CisgIDExNDg4MDYwOTFVLAkvLyA8MiwxLHUsdT46IENvc3QgMiB2cmV2IDwxLDIsdSx1PgorICAxNTQzNjY3NzMyVSwJLy8gPDIsMiwwLDA+OiBDb3N0IDIgdmV4dDIgPDAsMCwyLDI+LCA8MCwwLDIsMj4KKyAgMTU0ODk3NjIzMFUsCS8vIDwyLDIsMCwxPjogQ29zdCAyIHZleHQyIDwwLHUsMiwyPiwgTEhTCisgIDI2ODU2OTk1MjRVLAkvLyA8MiwyLDAsMj46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwyLDAsMiwwPgorICAyNjg1Njk5NTM1VSwJLy8gPDIsMiwwLDM+OiBDb3N0IDMgdmV4dDMgPDAsMiwwLDI+LCA8MiwwLDMsMj4KKyAgMjU1MTYxNDc3NFUsCS8vIDwyLDIsMCw0PjogQ29zdCAzIHZleHQxIDwwLDIsMiwwPiwgUkhTCisgIDM3MDQ0MjI4MzBVLAkvLyA8MiwyLDAsNT46IENvc3QgNCB2ZXh0MiA8MiwyLDIsMj4sIDwwLDUsMiw3PgorICAzODkzNjU3NjQyVSwJLy8gPDIsMiwwLDY+OiBDb3N0IDQgdnV6cHIgPDAsMiwwLDI+LCA8MCwwLDQsNj4KKyAgMzc3MDU3NDMyM1UsCS8vIDwyLDIsMCw3PjogQ29zdCA0IHZleHQzIDwyLDAsNywyPiwgPDIsMCw3LDI+CisgIDE1NDg5NzY3OTZVLAkvLyA8MiwyLDAsdT46IENvc3QgMiB2ZXh0MiA8MCx1LDIsMj4sIDwwLHUsMiwyPgorICAyNjIyNzE4NzEwVSwJLy8gPDIsMiwxLDA+OiBDb3N0IDMgdmV4dDIgPDAsdSwyLDI+LCA8MSwwLDMsMj4KKyAgMjYyMjcxODc3MlUsCS8vIDwyLDIsMSwxPjogQ29zdCAzIHZleHQyIDwwLHUsMiwyPiwgPDEsMSwxLDE+CisgIDI2MjI3MTg4NzBVLAkvLyA8MiwyLDEsMj46IENvc3QgMyB2ZXh0MiA8MCx1LDIsMj4sIDwxLDIsMywwPgorICAyODE5OTE1ODc4VSwJLy8gPDIsMiwxLDM+OiBDb3N0IDMgdnV6cHIgPDAsMiwwLDI+LCBMSFMKKyAgMzYyNTM2NDc5MFUsCS8vIDwyLDIsMSw0PjogQ29zdCA0IHZleHQxIDwwLDIsMiwxPiwgUkhTCisgIDI2MjI3MTkxMjBVLAkvLyA8MiwyLDEsNT46IENvc3QgMyB2ZXh0MiA8MCx1LDIsMj4sIDwxLDUsMyw3PgorICAzNzYwMDMxMjkyVSwJLy8gPDIsMiwxLDY+OiBDb3N0IDQgdmV4dDMgPDAsMix1LDI+LCA8MiwxLDYsMz4KKyAgMzY2NzE3MDQ2OFUsCS8vIDwyLDIsMSw3PjogQ29zdCA0IHZleHQxIDw3LDIsMiwxPiwgPDcsMiwyLDE+CisgIDI4MTk5MTU4ODNVLAkvLyA8MiwyLDEsdT46IENvc3QgMyB2dXpwciA8MCwyLDAsMj4sIExIUworICAxNDg5ODI5OTkwVSwJLy8gPDIsMiwyLDA+OiBDb3N0IDIgdmV4dDEgPDIsMiwyLDI+LCBMSFMKKyAgMjU2MzU3MjQ3MFUsCS8vIDwyLDIsMiwxPjogQ29zdCAzIHZleHQxIDwyLDIsMiwyPiwgPDEsMCwzLDI+CisgIDI2OTI3MTE0MlUsCS8vIDwyLDIsMiwyPjogQ29zdCAxIHZkdXAyIExIUworICAyNjg1Njk5Njk4VSwJLy8gPDIsMiwyLDM+OiBDb3N0IDMgdmV4dDMgPDAsMiwwLDI+LCA8MiwyLDMsMz4KKyAgMTQ4OTgzMzI3MFUsCS8vIDwyLDIsMiw0PjogQ29zdCAyIHZleHQxIDwyLDIsMiwyPiwgUkhTCisgIDI2ODU2OTk3MjBVLAkvLyA8MiwyLDIsNT46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwyLDIsNSw3PgorICAyNjIyNzE5OTMwVSwJLy8gPDIsMiwyLDY+OiBDb3N0IDMgdmV4dDIgPDAsdSwyLDI+LCA8Miw2LDMsNz4KKyAgMjU5MzQzNjgzN1UsCS8vIDwyLDIsMiw3PjogQ29zdCAzIHZleHQxIDw3LDIsMiwyPiwgPDcsMiwyLDI+CisgIDI2OTI3MTE0MlUsCS8vIDwyLDIsMix1PjogQ29zdCAxIHZkdXAyIExIUworICAyNjg1Njk5NzUwVSwJLy8gPDIsMiwzLDA+OiBDb3N0IDMgdmV4dDMgPDAsMiwwLDI+LCA8MiwzLDAsMT4KKyAgMjY5MDU2NTgwNlUsCS8vIDwyLDIsMywxPjogQ29zdCAzIHZleHQzIDwxLDAsMywyPiwgPDIsMywxLDA+CisgIDI5NTM2MjcyNDBVLAkvLyA8MiwyLDMsMj46IENvc3QgMyB2emlwciBMSFMsIDwyLDIsMiwyPgorICAxODc5ODgzODc4VSwJLy8gPDIsMiwzLDM+OiBDb3N0IDIgdnppcHIgTEhTLCBMSFMKKyAgMjY4NTY5OTc5MFUsCS8vIDwyLDIsMyw0PjogQ29zdCAzIHZleHQzIDwwLDIsMCwyPiwgPDIsMyw0LDU+CisgIDM4OTM2NTkzNDJVLAkvLyA8MiwyLDMsNT46IENvc3QgNCB2dXpwciA8MCwyLDAsMj4sIDwyLDMsNCw1PgorICAyOTU4MjcwODEyVSwJLy8gPDIsMiwzLDY+OiBDb3N0IDMgdnppcHIgTEhTLCA8MCw0LDIsNj4KKyAgMjU5MzQ0NTAzMFUsCS8vIDwyLDIsMyw3PjogQ29zdCAzIHZleHQxIDw3LDIsMiwzPiwgPDcsMiwyLDM+CisgIDE4Nzk4ODM4ODNVLAkvLyA8MiwyLDMsdT46IENvc3QgMiB2emlwciBMSFMsIExIUworICAyNTUxNjQ0MjYyVSwJLy8gPDIsMiw0LDA+OiBDb3N0IDMgdmV4dDEgPDAsMiwyLDQ+LCBMSFMKKyAgMzYyNTM4Njc0MlUsCS8vIDwyLDIsNCwxPjogQ29zdCA0IHZleHQxIDwwLDIsMiw0PiwgPDEsMCwzLDI+CisgIDI1NTE2NDU5MDJVLAkvLyA8MiwyLDQsMj46IENvc3QgMyB2ZXh0MSA8MCwyLDIsND4sIDwyLDMsNCw1PgorICAzNzU5NDQxNjg2VSwJLy8gPDIsMiw0LDM+OiBDb3N0IDQgdmV4dDMgPDAsMiwwLDI+LCA8Miw0LDMsNT4KKyAgMjU1MTY0NzU0MlUsCS8vIDwyLDIsNCw0PjogQ29zdCAzIHZleHQxIDwwLDIsMiw0PiwgUkhTCisgIDE1NDg5Nzk1MTBVLAkvLyA8MiwyLDQsNT46IENvc3QgMiB2ZXh0MiA8MCx1LDIsMj4sIFJIUworICAyNzY0OTAxNjg2VSwJLy8gPDIsMiw0LDY+OiBDb3N0IDMgdnV6cGwgPDIsMiwyLDI+LCBSSFMKKyAgMzY2NzE5NTA0N1UsCS8vIDwyLDIsNCw3PjogQ29zdCA0IHZleHQxIDw3LDIsMiw0PiwgPDcsMiwyLDQ+CisgIDE1NDg5Nzk3NTNVLAkvLyA8MiwyLDQsdT46IENvc3QgMiB2ZXh0MiA8MCx1LDIsMj4sIFJIUworICAzNjk2NDYzNDMyVSwJLy8gPDIsMiw1LDA+OiBDb3N0IDQgdmV4dDIgPDAsdSwyLDI+LCA8NSwwLDEsMj4KKyAgMjYxNzQxMzMyOFUsCS8vIDwyLDIsNSwxPjogQ29zdCAzIHZleHQyIDwwLDAsMiwyPiwgPDUsMSw3LDM+CisgIDI2ODU2OTk5MzZVLAkvLyA8MiwyLDUsMj46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwyLDUsMiw3PgorICA0MDI3MzgzOTEwVSwJLy8gPDIsMiw1LDM+OiBDb3N0IDQgdnppcHIgPDAsMSwyLDU+LCBMSFMKKyAgMjIyODIwMTA4NVUsCS8vIDwyLDIsNSw0PjogQ29zdCAzIHZyZXYgPDIsMiw0LDU+CisgIDI2MTc0MTM2MzZVLAkvLyA8MiwyLDUsNT46IENvc3QgMyB2ZXh0MiA8MCwwLDIsMj4sIDw1LDUsNSw1PgorICAyNjE3NDEzNzMwVSwJLy8gPDIsMiw1LDY+OiBDb3N0IDMgdmV4dDIgPDAsMCwyLDI+LCA8NSw2LDcsMD4KKyAgMjgxOTkxOTE1OFUsCS8vIDwyLDIsNSw3PjogQ29zdCAzIHZ1enByIDwwLDIsMCwyPiwgUkhTCisgIDI4MTk5MTkxNTlVLAkvLyA8MiwyLDUsdT46IENvc3QgMyB2dXpwciA8MCwyLDAsMj4sIFJIUworICAzNjI1NDAyNTU0VSwJLy8gPDIsMiw2LDA+OiBDb3N0IDQgdmV4dDEgPDAsMiwyLDY+LCA8MCwyLDIsNj4KKyAgMzc2MDAzMTY1MlUsCS8vIDwyLDIsNiwxPjogQ29zdCA0IHZleHQzIDwwLDIsdSwyPiwgPDIsNiwxLDM+CisgIDI2MTc0MTQxMzhVLAkvLyA8MiwyLDYsMj46IENvc3QgMyB2ZXh0MiA8MCwwLDIsMj4sIDw2LDIsNywzPgorICAyNjg1NzAwMDI2VSwJLy8gPDIsMiw2LDM+OiBDb3N0IDMgdmV4dDMgPDAsMiwwLDI+LCA8Miw2LDMsNz4KKyAgMzYyNTQwNTc1MFUsCS8vIDwyLDIsNiw0PjogQ29zdCA0IHZleHQxIDwwLDIsMiw2PiwgUkhTCisgIDM3NjAwMzE2OTJVLAkvLyA8MiwyLDYsNT46IENvc3QgNCB2ZXh0MyA8MCwyLHUsMj4sIDwyLDYsNSw3PgorICAzMDg4Njc5MTE2VSwJLy8gPDIsMiw2LDY+OiBDb3N0IDMgdnRybnIgPDAsMiw0LDY+LCA8MCwyLDQsNj4KKyAgMjY1Nzg5MTE2OVUsCS8vIDwyLDIsNiw3PjogQ29zdCAzIHZleHQyIDw2LDcsMiwyPiwgPDYsNywyLDI+CisgIDI2ODU3MDAwNzFVLAkvLyA8MiwyLDYsdT46IENvc3QgMyB2ZXh0MyA8MCwyLDAsMj4sIDwyLDYsdSw3PgorICAyNzI2MjUwNDc0VSwJLy8gPDIsMiw3LDA+OiBDb3N0IDMgdmV4dDMgPDcsMCwxLDI+LCA8Miw3LDAsMT4KKyAgMzcwNDQyNzYxNlUsCS8vIDwyLDIsNywxPjogQ29zdCA0IHZleHQyIDwyLDIsMiwyPiwgPDcsMSwzLDU+CisgIDI2NjA1NDU3MDFVLAkvLyA8MiwyLDcsMj46IENvc3QgMyB2ZXh0MiA8NywyLDIsMj4sIDw3LDIsMiwyPgorICA0MDMwNzE4MDU0VSwJLy8gPDIsMiw3LDM+OiBDb3N0IDQgdnppcHIgPDAsNiwyLDc+LCBMSFMKKyAgMjYxNzQxNTAxNFUsCS8vIDwyLDIsNyw0PjogQ29zdCAzIHZleHQyIDwwLDAsMiwyPiwgPDcsNCw1LDY+CisgIDMzMDIwMzMwMzJVLAkvLyA8MiwyLDcsNT46IENvc3QgNCB2cmV2IDwyLDIsNSw3PgorICAzNjYxMjQ2OTI5VSwJLy8gPDIsMiw3LDY+OiBDb3N0IDQgdmV4dDEgPDYsMiwyLDc+LCA8NiwyLDIsNz4KKyAgMjYxNzQxNTI3NlUsCS8vIDwyLDIsNyw3PjogQ29zdCAzIHZleHQyIDwwLDAsMiwyPiwgPDcsNyw3LDc+CisgIDI3MzE1NTg5NjJVLAkvLyA8MiwyLDcsdT46IENvc3QgMyB2ZXh0MyA8Nyx1LDEsMj4sIDwyLDcsdSwxPgorICAxNDg5ODI5OTkwVSwJLy8gPDIsMix1LDA+OiBDb3N0IDIgdmV4dDEgPDIsMiwyLDI+LCBMSFMKKyAgMTU0ODk4MjA2MlUsCS8vIDwyLDIsdSwxPjogQ29zdCAyIHZleHQyIDwwLHUsMiwyPiwgTEhTCisgIDI2OTI3MTE0MlUsCS8vIDwyLDIsdSwyPjogQ29zdCAxIHZkdXAyIExIUworICAxODc5OTI0ODM4VSwJLy8gPDIsMix1LDM+OiBDb3N0IDIgdnppcHIgTEhTLCBMSFMKKyAgMTQ4OTgzMzI3MFUsCS8vIDwyLDIsdSw0PjogQ29zdCAyIHZleHQxIDwyLDIsMiwyPiwgUkhTCisgIDE1NDg5ODI0MjZVLAkvLyA8MiwyLHUsNT46IENvc3QgMiB2ZXh0MiA8MCx1LDIsMj4sIFJIUworICAyOTUzNjY2OTA4VSwJLy8gPDIsMix1LDY+OiBDb3N0IDMgdnppcHIgTEhTLCA8MCw0LDIsNj4KKyAgMjgxOTkxOTQwMVUsCS8vIDwyLDIsdSw3PjogQ29zdCAzIHZ1enByIDwwLDIsMCwyPiwgUkhTCisgIDI2OTI3MTE0MlUsCS8vIDwyLDIsdSx1PjogQ29zdCAxIHZkdXAyIExIUworICAxNTQ0MzM5NDU2VSwJLy8gPDIsMywwLDA+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MCwwLDAsMD4KKyAgNDcwNTk3NzM0VSwJLy8gPDIsMywwLDE+OiBDb3N0IDEgdmV4dDIgTEhTLCBMSFMKKyAgMTU0ODk4NDQ4NFUsCS8vIDwyLDMsMCwyPjogQ29zdCAyIHZleHQyIExIUywgPDAsMiwwLDI+CisgIDI2MTk0MDg2NDhVLAkvLyA8MiwzLDAsMz46IENvc3QgMyB2ZXh0MiA8MCwzLDIsMz4sIDwwLDMsMiwzPgorICAxNTQ4OTg0NjU4VSwJLy8gPDIsMywwLDQ+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MCw0LDEsNT4KKyAgMjY2NTg1NzQ1NFUsCS8vIDwyLDMsMCw1PjogQ29zdCAzIHZleHQyIExIUywgPDAsNSwyLDc+CisgIDI2MjI3MjY2NTVVLAkvLyA8MiwzLDAsNj46IENvc3QgMyB2ZXh0MiBMSFMsIDwwLDYsMiw3PgorICAyNTkzNDk0MTg4VSwJLy8gPDIsMywwLDc+OiBDb3N0IDMgdmV4dDEgPDcsMiwzLDA+LCA8NywyLDMsMD4KKyAgNDcwNTk4MzAxVSwJLy8gPDIsMywwLHU+OiBDb3N0IDEgdmV4dDIgTEhTLCBMSFMKKyAgMTU0NDM0MDIxNFUsCS8vIDwyLDMsMSwwPjogQ29zdCAyIHZleHQyIExIUywgPDEsMCwzLDI+CisgIDE1NDQzNDAyNzZVLAkvLyA8MiwzLDEsMT46IENvc3QgMiB2ZXh0MiBMSFMsIDwxLDEsMSwxPgorICAxNTQ0MzQwMzc0VSwJLy8gPDIsMywxLDI+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MSwyLDMsMD4KKyAgMTU0ODk4NTMwNFUsCS8vIDwyLDMsMSwzPjogQ29zdCAyIHZleHQyIExIUywgPDEsMywxLDM+CisgIDI1NTE2OTY2OTRVLAkvLyA8MiwzLDEsND46IENvc3QgMyB2ZXh0MSA8MCwyLDMsMT4sIFJIUworICAxNTQ4OTg1NDg4VSwJLy8gPDIsMywxLDU+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MSw1LDMsNz4KKyAgMjYyMjcyNzM3NVUsCS8vIDwyLDMsMSw2PjogQ29zdCAzIHZleHQyIExIUywgPDEsNiwxLDc+CisgIDI2NjU4NTgzNDdVLAkvLyA8MiwzLDEsNz46IENvc3QgMyB2ZXh0MiBMSFMsIDwxLDcsMywwPgorICAxNTQ4OTg1NzA5VSwJLy8gPDIsMywxLHU+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MSx1LDEsMz4KKyAgMjYyMjcyNzYxM1UsCS8vIDwyLDMsMiwwPjogQ29zdCAzIHZleHQyIExIUywgPDIsMCwxLDI+CisgIDI2MjI3Mjc3MTFVLAkvLyA8MiwzLDIsMT46IENvc3QgMyB2ZXh0MiBMSFMsIDwyLDEsMywxPgorICAxNTQ0MzQxMDk2VSwJLy8gPDIsMywyLDI+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MiwyLDIsMj4KKyAgMTU0NDM0MTE1OFUsCS8vIDwyLDMsMiwzPjogQ29zdCAyIHZleHQyIExIUywgPDIsMywwLDE+CisgIDI2MjI3Mjc5NThVLAkvLyA8MiwzLDIsND46IENvc3QgMyB2ZXh0MiBMSFMsIDwyLDQsMyw1PgorICAyNjIyNzI4MDMyVSwJLy8gPDIsMywyLDU+OiBDb3N0IDMgdmV4dDIgTEhTLCA8Miw1LDIsNz4KKyAgMTU0ODk4NjI5OFUsCS8vIDwyLDMsMiw2PjogQ29zdCAyIHZleHQyIExIUywgPDIsNiwzLDc+CisgIDI2NjU4NTkwNTBVLAkvLyA8MiwzLDIsNz46IENvc3QgMyB2ZXh0MiBMSFMsIDwyLDcsMCwxPgorICAxNTQ4OTg2NDI3VSwJLy8gPDIsMywyLHU+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Mix1LDAsMT4KKyAgMTU0ODk4NjUxOFUsCS8vIDwyLDMsMywwPjogQ29zdCAyIHZleHQyIExIUywgPDMsMCwxLDI+CisgIDI2MjI3Mjg0MTVVLAkvLyA8MiwzLDMsMT46IENvc3QgMyB2ZXh0MiBMSFMsIDwzLDEsMCwzPgorICAxNDg5OTEzNDU4VSwJLy8gPDIsMywzLDI+OiBDb3N0IDIgdmV4dDEgPDIsMiwzLDM+LCA8MiwyLDMsMz4KKyAgMTU0NDM0MTkxNlUsCS8vIDwyLDMsMywzPjogQ29zdCAyIHZleHQyIExIUywgPDMsMywzLDM+CisgIDE1NDg5ODY4ODJVLAkvLyA8MiwzLDMsND46IENvc3QgMiB2ZXh0MiBMSFMsIDwzLDQsNSw2PgorICAyNjY1ODU5NjMyVSwJLy8gPDIsMywzLDU+OiBDb3N0IDMgdmV4dDIgTEhTLCA8Myw1LDEsNz4KKyAgMjIzNDMwNDg3MFUsCS8vIDwyLDMsMyw2PjogQ29zdCAzIHZyZXYgPDMsMiw2LDM+CisgIDI5NTgyNzE2MzJVLAkvLyA8MiwzLDMsNz46IENvc3QgMyB2emlwciBMSFMsIDwxLDUsMyw3PgorICAxNTQ4OTg3MTY2VSwJLy8gPDIsMywzLHU+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Myx1LDEsMj4KKyAgMTQ4Mzk0ODEzNFUsCS8vIDwyLDMsNCwwPjogQ29zdCAyIHZleHQxIDwxLDIsMyw0PiwgTEhTCisgIDE0ODM5NDg5NTRVLAkvLyA8MiwzLDQsMT46IENvc3QgMiB2ZXh0MSA8MSwyLDMsND4sIDwxLDIsMyw0PgorICAyNjIyNzI5Mjc2VSwJLy8gPDIsMyw0LDI+OiBDb3N0IDMgdmV4dDIgTEhTLCA8NCwyLDYsMD4KKyAgMjU1NzY5MjA1NFUsCS8vIDwyLDMsNCwzPjogQ29zdCAzIHZleHQxIDwxLDIsMyw0PiwgPDMsMCwxLDI+CisgIDE0ODM5NTE0MTRVLAkvLyA8MiwzLDQsND46IENvc3QgMiB2ZXh0MSA8MSwyLDMsND4sIFJIUworICA0NzA2MDEwMTRVLAkvLyA8MiwzLDQsNT46IENvc3QgMSB2ZXh0MiBMSFMsIFJIUworICAxNTkyMTE4NjQ0VSwJLy8gPDIsMyw0LDY+OiBDb3N0IDIgdmV4dDIgTEhTLCA8NCw2LDQsNj4KKyAgMjU5MzUyNjk2MFUsCS8vIDwyLDMsNCw3PjogQ29zdCAzIHZleHQxIDw3LDIsMyw0PiwgPDcsMiwzLDQ+CisgIDQ3MDYwMTI1N1UsCS8vIDwyLDMsNCx1PjogQ29zdCAxIHZleHQyIExIUywgUkhTCisgIDI1NTE3MjYxODJVLAkvLyA8MiwzLDUsMD46IENvc3QgMyB2ZXh0MSA8MCwyLDMsNT4sIExIUworICAxNTkyMTE4OTkyVSwJLy8gPDIsMyw1LDE+OiBDb3N0IDIgdmV4dDIgTEhTLCA8NSwxLDcsMz4KKyAgMjY2NTg2MDg2MlUsCS8vIDwyLDMsNSwyPjogQ29zdCAzIHZleHQyIExIUywgPDUsMiwzLDQ+CisgIDI1NTE3Mjg2NDJVLAkvLyA8MiwzLDUsMz46IENvc3QgMyB2ZXh0MSA8MCwyLDMsNT4sIDwzLDQsNSw2PgorICAxNTkyMTE5MjM4VSwJLy8gPDIsMyw1LDQ+OiBDb3N0IDIgdmV4dDIgTEhTLCA8NSw0LDcsNj4KKyAgMTU5MjExOTMwMFUsCS8vIDwyLDMsNSw1PjogQ29zdCAyIHZleHQyIExIUywgPDUsNSw1LDU+CisgIDE1OTIxMTkzOTRVLAkvLyA8MiwzLDUsNj46IENvc3QgMiB2ZXh0MiBMSFMsIDw1LDYsNywwPgorICAxNTkyMTE5NDY0VSwJLy8gPDIsMyw1LDc+OiBDb3N0IDIgdmV4dDIgTEhTLCA8NSw3LDUsNz4KKyAgMTU5MjExOTU0NVUsCS8vIDwyLDMsNSx1PjogQ29zdCAyIHZleHQyIExIUywgPDUsdSw1LDc+CisgIDI2MjI3MzA1MjlVLAkvLyA8MiwzLDYsMD46IENvc3QgMyB2ZXh0MiBMSFMsIDw2LDAsMSwyPgorICAyNTU3NzA3MTY0VSwJLy8gPDIsMyw2LDE+OiBDb3N0IDMgdmV4dDEgPDEsMiwzLDY+LCA8MSwyLDMsNj4KKyAgMTU5MjExOTgwMlUsCS8vIDwyLDMsNiwyPjogQ29zdCAyIHZleHQyIExIUywgPDYsMiw3LDM+CisgIDI2NjU4NjE2ODJVLAkvLyA8MiwzLDYsMz46IENvc3QgMyB2ZXh0MiBMSFMsIDw2LDMsNCw1PgorICAyNjIyNzMwODkzVSwJLy8gPDIsMyw2LDQ+OiBDb3N0IDMgdmV4dDIgTEhTLCA8Niw0LDUsNj4KKyAgMjY2NTg2MTgxMFUsCS8vIDwyLDMsNiw1PjogQ29zdCAzIHZleHQyIExIUywgPDYsNSwwLDc+CisgIDE1OTIxMjAxMjBVLAkvLyA8MiwzLDYsNj46IENvc3QgMiB2ZXh0MiBMSFMsIDw2LDYsNiw2PgorICAxNTkyMTIwMTQyVSwJLy8gPDIsMyw2LDc+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Niw3LDAsMT4KKyAgMTU5MjEyMDIyM1UsCS8vIDwyLDMsNix1PjogQ29zdCAyIHZleHQyIExIUywgPDYsdSwwLDE+CisgIDE1OTIxMjAzMTRVLAkvLyA8MiwzLDcsMD46IENvc3QgMiB2ZXh0MiBMSFMsIDw3LDAsMSwyPgorICAyNjU5ODkwMjYxVSwJLy8gPDIsMyw3LDE+OiBDb3N0IDMgdmV4dDIgPDcsMSwyLDM+LCA8NywxLDIsMz4KKyAgMjY2MDU1Mzg5NFUsCS8vIDwyLDMsNywyPjogQ29zdCAzIHZleHQyIDw3LDIsMiwzPiwgPDcsMiwyLDM+CisgIDI2NjU4NjIzNzFVLAkvLyA8MiwzLDcsMz46IENvc3QgMyB2ZXh0MiBMSFMsIDw3LDMsMCwxPgorICAxNTkyMTIwNjc4VSwJLy8gPDIsMyw3LDQ+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Nyw0LDUsNj4KKyAgMjY2NTg2MjUzNFUsCS8vIDwyLDMsNyw1PjogQ29zdCAzIHZleHQyIExIUywgPDcsNSwwLDI+CisgIDI2NjU4NjI2MTRVLAkvLyA8MiwzLDcsNj46IENvc3QgMyB2ZXh0MiBMSFMsIDw3LDYsMCwxPgorICAxNTkyMTIwOTQwVSwJLy8gPDIsMyw3LDc+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Nyw3LDcsNz4KKyAgMTU5MjEyMDk2MlUsCS8vIDwyLDMsNyx1PjogQ29zdCAyIHZleHQyIExIUywgPDcsdSwxLDI+CisgIDE1NDg5OTAxNjNVLAkvLyA8MiwzLHUsMD46IENvc3QgMiB2ZXh0MiBMSFMsIDx1LDAsMSwyPgorICA0NzA2MDM1NjZVLAkvLyA8MiwzLHUsMT46IENvc3QgMSB2ZXh0MiBMSFMsIExIUworICAxNTQ4OTkwMzQxVSwJLy8gPDIsMyx1LDI+OiBDb3N0IDIgdmV4dDIgTEhTLCA8dSwyLDMsMD4KKyAgMTU0ODk5MDM5NlUsCS8vIDwyLDMsdSwzPjogQ29zdCAyIHZleHQyIExIUywgPHUsMywwLDE+CisgIDE1NDg5OTA1MjdVLAkvLyA8MiwzLHUsND46IENvc3QgMiB2ZXh0MiBMSFMsIDx1LDQsNSw2PgorICA0NzA2MDM5MzBVLAkvLyA8MiwzLHUsNT46IENvc3QgMSB2ZXh0MiBMSFMsIFJIUworICAxNTQ4OTkwNjcyVSwJLy8gPDIsMyx1LDY+OiBDb3N0IDIgdmV4dDIgTEhTLCA8dSw2LDMsNz4KKyAgMTU5MjEyMTYwMFUsCS8vIDwyLDMsdSw3PjogQ29zdCAyIHZleHQyIExIUywgPHUsNywwLDE+CisgIDQ3MDYwNDEzM1UsCS8vIDwyLDMsdSx1PjogQ29zdCAxIHZleHQyIExIUywgTEhTCisgIDI2MTc0MjU5NDJVLAkvLyA8Miw0LDAsMD46IENvc3QgMyB2ZXh0MiA8MCwwLDIsND4sIDwwLDAsMiw0PgorICAyNjE4NzUzMTI2VSwJLy8gPDIsNCwwLDE+OiBDb3N0IDMgdmV4dDIgPDAsMiwyLDQ+LCBMSFMKKyAgMjYxODc1MzIwOFUsCS8vIDwyLDQsMCwyPjogQ29zdCAzIHZleHQyIDwwLDIsMiw0PiwgPDAsMiwyLDQ+CisgIDI2MTk0MTY4NDFVLAkvLyA8Miw0LDAsMz46IENvc3QgMyB2ZXh0MiA8MCwzLDIsND4sIDwwLDMsMiw0PgorICAyNTg3NTkzNjI4VSwJLy8gPDIsNCwwLDQ+OiBDb3N0IDMgdmV4dDEgPDYsMiw0LDA+LCA8NCwwLDYsMj4KKyAgMjcxMjgzMjkxNFUsCS8vIDwyLDQsMCw1PjogQ29zdCAzIHZleHQzIDw0LDYsdSwyPiwgPDQsMCw1LDE+CisgIDE2MzQ5NjIzMzJVLAkvLyA8Miw0LDAsNj46IENvc3QgMiB2ZXh0MyA8NCwwLDYsMj4sIDw0LDAsNiwyPgorICAzNzk5OTkzMjUyVSwJLy8gPDIsNCwwLDc+OiBDb3N0IDQgdmV4dDMgPDcsMCwxLDI+LCA8NCwwLDcsMT4KKyAgMTYzNDk2MjMzMlUsCS8vIDwyLDQsMCx1PjogQ29zdCAyIHZleHQzIDw0LDAsNiwyPiwgPDQsMCw2LDI+CisgIDI2MTk0MTczMzRVLAkvLyA8Miw0LDEsMD46IENvc3QgMyB2ZXh0MiA8MCwzLDIsND4sIDwxLDAsMywyPgorICAzNjkyNDk1NjY4VSwJLy8gPDIsNCwxLDE+OiBDb3N0IDQgdmV4dDIgPDAsMiwyLDQ+LCA8MSwxLDEsMT4KKyAgMjYyNTM4OTQ2NlUsCS8vIDwyLDQsMSwyPjogQ29zdCAzIHZleHQyIDwxLDMsMiw0PiwgPDEsMiwzLDQ+CisgIDI4MjYxMjU0MTRVLAkvLyA8Miw0LDEsMz46IENvc3QgMyB2dXpwciA8MSwyLDMsND4sIExIUworICAzNjk5Nzk0OTk1VSwJLy8gPDIsNCwxLDQ+OiBDb3N0IDQgdmV4dDIgPDEsNCwyLDQ+LCA8MSw0LDIsND4KKyAgMzY5MjQ5NjAxNlUsCS8vIDwyLDQsMSw1PjogQ29zdCA0IHZleHQyIDwwLDIsMiw0PiwgPDEsNSwzLDc+CisgIDM3NjM0MjQyMzhVLAkvLyA8Miw0LDEsNj46IENvc3QgNCB2ZXh0MyA8MCx1LDAsMj4sIDw0LDEsNiwzPgorICAzNjY3MzE3OTQyVSwJLy8gPDIsNCwxLDc+OiBDb3N0IDQgdmV4dDEgPDcsMiw0LDE+LCA8NywyLDQsMT4KKyAgMjgyNjEyNTQxOVUsCS8vIDwyLDQsMSx1PjogQ29zdCAzIHZ1enByIDwxLDIsMyw0PiwgTEhTCisgIDI2MjkzNzEzMzZVLAkvLyA8Miw0LDIsMD46IENvc3QgMyB2ZXh0MiA8MiwwLDIsND4sIDwyLDAsMiw0PgorICAzNjk5MTMxOTQ2VSwJLy8gPDIsNCwyLDE+OiBDb3N0IDQgdmV4dDIgPDEsMywyLDQ+LCA8MiwxLDQsMz4KKyAgMjYzMDY5ODYwMlUsCS8vIDwyLDQsMiwyPjogQ29zdCAzIHZleHQyIDwyLDIsMiw0PiwgPDIsMiwyLDQ+CisgIDI2MTg3NTQ3NjZVLAkvLyA8Miw0LDIsMz46IENvc3QgMyB2ZXh0MiA8MCwyLDIsND4sIDwyLDMsNCw1PgorICAyODI2MTI2MjM0VSwJLy8gPDIsNCwyLDQ+OiBDb3N0IDMgdnV6cHIgPDEsMiwzLDQ+LCA8MSwyLDMsND4KKyAgMjg5OTExOTQxNFUsCS8vIDwyLDQsMiw1PjogQ29zdCAzIHZ6aXBsIDwyLDIsMiwyPiwgUkhTCisgIDMwMzMzMzcxNDJVLAkvLyA8Miw0LDIsNj46IENvc3QgMyB2dHJubCA8MiwyLDIsMj4sIFJIUworICAzODAwMjE0NTk3VSwJLy8gPDIsNCwyLDc+OiBDb3N0IDQgdmV4dDMgPDcsMCw0LDI+LCA8NCwyLDcsMD4KKyAgMjg5OTExOTY1N1UsCS8vIDwyLDQsMix1PjogQ29zdCAzIHZ6aXBsIDwyLDIsMiwyPiwgUkhTCisgIDI2MzUzNDQwMzNVLAkvLyA8Miw0LDMsMD46IENvc3QgMyB2ZXh0MiA8MywwLDIsND4sIDwzLDAsMiw0PgorICA0MDMyMDEyMzI1VSwJLy8gPDIsNCwzLDE+OiBDb3N0IDQgdnppcHIgTEhTLCA8MCwwLDQsMT4KKyAgMzY5MjQ5NzIyOFUsCS8vIDwyLDQsMywyPjogQ29zdCA0IHZleHQyIDwwLDIsMiw0PiwgPDMsMiwzLDQ+CisgIDM2OTI0OTczMDhVLAkvLyA8Miw0LDMsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDIsND4sIDwzLDMsMywzPgorICAzMDAxNDA0NjI0VSwJLy8gPDIsNCwzLDQ+OiBDb3N0IDMgdnppcHIgTEhTLCA8NCw0LDQsND4KKyAgMjk1MzYyNzM0MlUsCS8vIDwyLDQsMyw1PjogQ29zdCAzIHZ6aXByIExIUywgPDIsMyw0LDU+CisgIDI5NTM2MjU4MDRVLAkvLyA8Miw0LDMsNj46IENvc3QgMyB2emlwciBMSFMsIDwwLDIsNCw2PgorICAzODk5ODY4MTYwVSwJLy8gPDIsNCwzLDc+OiBDb3N0IDQgdnV6cHIgPDEsMiwzLDQ+LCA8MSwzLDUsNz4KKyAgMjk1MzYyNTgwNlUsCS8vIDwyLDQsMyx1PjogQ29zdCAzIHZ6aXByIExIUywgPDAsMiw0LHU+CisgIDI3MTA5MTYyNjZVLAkvLyA8Miw0LDQsMD46IENvc3QgMyB2ZXh0MyA8NCw0LDAsMj4sIDw0LDQsMCwyPgorICAzODk5ODY5NjQ4VSwJLy8gPDIsNCw0LDE+OiBDb3N0IDQgdnV6cHIgPDEsMiwzLDQ+LCA8Myw0LDAsMT4KKyAgMzg5OTg2OTY1OFUsCS8vIDwyLDQsNCwyPjogQ29zdCA0IHZ1enByIDwxLDIsMyw0PiwgPDMsNCwxLDI+CisgIDM4OTk4Njg5MzBVLAkvLyA8Miw0LDQsMz46IENvc3QgNCB2dXpwciA8MSwyLDMsND4sIDwyLDQsMSwzPgorICAyNzEyODMzMjMyVSwJLy8gPDIsNCw0LDQ+OiBDb3N0IDMgdmV4dDMgPDQsNix1LDI+LCA8NCw0LDQsND4KKyAgMjYxODc1NjQwNlUsCS8vIDwyLDQsNCw1PjogQ29zdCAzIHZleHQyIDwwLDIsMiw0PiwgUkhTCisgIDI3NjU3MzcyNzBVLAkvLyA8Miw0LDQsNj46IENvc3QgMyB2dXpwbCA8MiwzLDQsNT4sIFJIUworICA0MTY4MzA0NDI2VSwJLy8gPDIsNCw0LDc+OiBDb3N0IDQgdnRybnIgPDEsMiwzLDQ+LCA8Miw0LDUsNz4KKyAgMjYxODc1NjY0OVUsCS8vIDwyLDQsNCx1PjogQ29zdCAzIHZleHQyIDwwLDIsMiw0PiwgUkhTCisgIDI1NTE4MDAwMTFVLAkvLyA8Miw0LDUsMD46IENvc3QgMyB2ZXh0MSA8MCwyLDQsNT4sIDwwLDIsNCw1PgorICAyNTY5NzE2NDcwVSwJLy8gPDIsNCw1LDE+OiBDb3N0IDMgdmV4dDEgPDMsMiw0LDU+LCA8MSwwLDMsMj4KKyAgMjU2Mzc0NTQwNVUsCS8vIDwyLDQsNSwyPjogQ29zdCAzIHZleHQxIDwyLDIsNCw1PiwgPDIsMiw0LDU+CisgIDI1Njk3MTgxMDJVLAkvLyA8Miw0LDUsMz46IENvc3QgMyB2ZXh0MSA8MywyLDQsNT4sIDwzLDIsNCw1PgorICAyNTUxODAzMTkwVSwJLy8gPDIsNCw1LDQ+OiBDb3N0IDMgdmV4dDEgPDAsMiw0LDU+LCBSSFMKKyAgMzYyNTU0NTczMlUsCS8vIDwyLDQsNSw1PjogQ29zdCA0IHZleHQxIDwwLDIsNCw1PiwgPDUsNSw1LDU+CisgIDE2MTE5NTk2MDZVLAkvLyA8Miw0LDUsNj46IENvc3QgMiB2ZXh0MyA8MCwyLDAsMj4sIFJIUworICAyODI2MTI4Njk0VSwJLy8gPDIsNCw1LDc+OiBDb3N0IDMgdnV6cHIgPDEsMiwzLDQ+LCBSSFMKKyAgMTYxMTk1OTYyNFUsCS8vIDwyLDQsNSx1PjogQ29zdCAyIHZleHQzIDwwLDIsMCwyPiwgUkhTCisgIDE0NzgwNjYyNzhVLAkvLyA8Miw0LDYsMD46IENvc3QgMiB2ZXh0MSA8MCwyLDQsNj4sIExIUworICAyNTUxODA4NzU4VSwJLy8gPDIsNCw2LDE+OiBDb3N0IDMgdmV4dDEgPDAsMiw0LDY+LCA8MSwwLDMsMj4KKyAgMjU1MTgwOTUxNlUsCS8vIDwyLDQsNiwyPjogQ29zdCAzIHZleHQxIDwwLDIsNCw2PiwgPDIsMCw2LDQ+CisgIDI1NTE4MTAxOThVLAkvLyA8Miw0LDYsMz46IENvc3QgMyB2ZXh0MSA8MCwyLDQsNj4sIDwzLDAsMSwyPgorICAxNDc4MDY5NTU4VSwJLy8gPDIsNCw2LDQ+OiBDb3N0IDIgdmV4dDEgPDAsMiw0LDY+LCBSSFMKKyAgMjkwMTg4ODMxMFUsCS8vIDwyLDQsNiw1PjogQ29zdCAzIHZ6aXBsIDwyLDYsMyw3PiwgUkhTCisgIDI1NTE4MTI5MjBVLAkvLyA8Miw0LDYsNj46IENvc3QgMyB2ZXh0MSA8MCwyLDQsNj4sIDw2LDYsNiw2PgorICAyNzI2MjUxOTE0VSwJLy8gPDIsNCw2LDc+OiBDb3N0IDMgdmV4dDMgPDcsMCwxLDI+LCA8NCw2LDcsMT4KKyAgMTQ3ODA3MjExMFUsCS8vIDwyLDQsNix1PjogQ29zdCAyIHZleHQxIDwwLDIsNCw2PiwgTEhTCisgIDI2NTkyMzQ4MjFVLAkvLyA8Miw0LDcsMD46IENvc3QgMyB2ZXh0MiA8NywwLDIsND4sIDw3LDAsMiw0PgorICAzNzg2NzIyNzI2VSwJLy8gPDIsNCw3LDE+OiBDb3N0IDQgdmV4dDMgPDQsNywxLDI+LCA8NCw3LDEsMj4KKyAgMzczNDMwMzkxMVUsCS8vIDwyLDQsNywyPjogQ29zdCA0IHZleHQyIDw3LDIsMiw0PiwgPDcsMiwyLDQ+CisgIDM3MzQ5Njc1NDRVLAkvLyA8Miw0LDcsMz46IENvc3QgNCB2ZXh0MiA8NywzLDIsND4sIDw3LDMsMiw0PgorICAzNzI3MDA1MDMwVSwJLy8gPDIsNCw3LDQ+OiBDb3N0IDQgdmV4dDIgPDYsMCwyLDQ+LCA8Nyw0LDUsNj4KKyAgMjcyNjI1MTk3NlUsCS8vIDwyLDQsNyw1PjogQ29zdCAzIHZleHQzIDw3LDAsMSwyPiwgPDQsNyw1LDA+CisgIDI3MjYyNTE5ODZVLAkvLyA8Miw0LDcsNj46IENvc3QgMyB2ZXh0MyA8NywwLDEsMj4sIDw0LDcsNiwxPgorICAzNzI3MDA1MjkyVSwJLy8gPDIsNCw3LDc+OiBDb3N0IDQgdmV4dDIgPDYsMCwyLDQ+LCA8Nyw3LDcsNz4KKyAgMjY1OTIzNDgyMVUsCS8vIDwyLDQsNyx1PjogQ29zdCAzIHZleHQyIDw3LDAsMiw0PiwgPDcsMCwyLDQ+CisgIDE0NzgwODI2NjJVLAkvLyA8Miw0LHUsMD46IENvc3QgMiB2ZXh0MSA8MCwyLDQsdT4sIExIUworICAyNjE4NzU4OTU4VSwJLy8gPDIsNCx1LDE+OiBDb3N0IDMgdmV4dDIgPDAsMiwyLDQ+LCBMSFMKKyAgMjU1MTgyNjAyNFUsCS8vIDwyLDQsdSwyPjogQ29zdCAzIHZleHQxIDwwLDIsNCx1PiwgPDIsMiwyLDI+CisgIDI1NTE4MjY1ODJVLAkvLyA8Miw0LHUsMz46IENvc3QgMyB2ZXh0MSA8MCwyLDQsdT4sIDwzLDAsMSwyPgorICAxNDc4MDg1OTQyVSwJLy8gPDIsNCx1LDQ+OiBDb3N0IDIgdmV4dDEgPDAsMiw0LHU+LCBSSFMKKyAgMjk1MzY2ODMwMlUsCS8vIDwyLDQsdSw1PjogQ29zdCAzIHZ6aXByIExIUywgPDIsMyw0LDU+CisgIDE2MTE5NTk4NDlVLAkvLyA8Miw0LHUsNj46IENvc3QgMiB2ZXh0MyA8MCwyLDAsMj4sIFJIUworICAyODI2MTI4OTM3VSwJLy8gPDIsNCx1LDc+OiBDb3N0IDMgdnV6cHIgPDEsMiwzLDQ+LCBSSFMKKyAgMTYxMTk1OTg2N1UsCS8vIDwyLDQsdSx1PjogQ29zdCAyIHZleHQzIDwwLDIsMCwyPiwgUkhTCisgIDM2OTE4Mzk0ODhVLAkvLyA8Miw1LDAsMD46IENvc3QgNCB2ZXh0MiA8MCwxLDIsNT4sIDwwLDAsMCwwPgorICAyNjE4MDk3NzY2VSwJLy8gPDIsNSwwLDE+OiBDb3N0IDMgdmV4dDIgPDAsMSwyLDU+LCBMSFMKKyAgMjYyMDA4ODQ4NFUsCS8vIDwyLDUsMCwyPjogQ29zdCAzIHZleHQyIDwwLDQsMiw1PiwgPDAsMiwwLDI+CisgIDI2MTk0MjUwMzRVLAkvLyA8Miw1LDAsMz46IENvc3QgMyB2ZXh0MiA8MCwzLDIsNT4sIDwwLDMsMiw1PgorICAyNjIwMDg4NjY3VSwJLy8gPDIsNSwwLDQ+OiBDb3N0IDMgdmV4dDIgPDAsNCwyLDU+LCA8MCw0LDIsNT4KKyAgMjYyMDc1MjMwMFUsCS8vIDwyLDUsMCw1PjogQ29zdCAzIHZleHQyIDwwLDUsMiw1PiwgPDAsNSwyLDU+CisgIDM2OTM4MzA2NTVVLAkvLyA8Miw1LDAsNj46IENvc3QgNCB2ZXh0MiA8MCw0LDIsNT4sIDwwLDYsMiw3PgorICAzMDk0NTMxMzgyVSwJLy8gPDIsNSwwLDc+OiBDb3N0IDMgdnRybnIgPDEsMiwzLDA+LCBSSFMKKyAgMjYxODA5ODMzM1UsCS8vIDwyLDUsMCx1PjogQ29zdCAzIHZleHQyIDwwLDEsMiw1PiwgTEhTCisgIDM2OTE4NDAyNDZVLAkvLyA8Miw1LDEsMD46IENvc3QgNCB2ZXh0MiA8MCwxLDIsNT4sIDwxLDAsMywyPgorICAzNjkxODQwMzA4VSwJLy8gPDIsNSwxLDE+OiBDb3N0IDQgdmV4dDIgPDAsMSwyLDU+LCA8MSwxLDEsMT4KKyAgMjYyNjA2MTIwNlUsCS8vIDwyLDUsMSwyPjogQ29zdCAzIHZleHQyIDwxLDQsMiw1PiwgPDEsMiwzLDA+CisgIDI2MTgwOTg2ODhVLAkvLyA8Miw1LDEsMz46IENvc3QgMyB2ZXh0MiA8MCwxLDIsNT4sIDwxLDMsNSw3PgorICAyNjI2MDYxMzY0VSwJLy8gPDIsNSwxLDQ+OiBDb3N0IDMgdmV4dDIgPDEsNCwyLDU+LCA8MSw0LDIsNT4KKyAgMzY5MTg0MDY1NlUsCS8vIDwyLDUsMSw1PjogQ29zdCA0IHZleHQyIDwwLDEsMiw1PiwgPDEsNSwzLDc+CisgIDM3ODkwODIzMTBVLAkvLyA8Miw1LDEsNj46IENvc3QgNCB2ZXh0MyA8NSwxLDYsMj4sIDw1LDEsNiwyPgorICAyNzEyODMzNzQ0VSwJLy8gPDIsNSwxLDc+OiBDb3N0IDMgdmV4dDMgPDQsNix1LDI+LCA8NSwxLDcsMz4KKyAgMjYyODcxNTg5NlUsCS8vIDwyLDUsMSx1PjogQ29zdCAzIHZleHQyIDwxLHUsMiw1PiwgPDEsdSwyLDU+CisgIDM2OTM4MzE2MTNVLAkvLyA8Miw1LDIsMD46IENvc3QgNCB2ZXh0MiA8MCw0LDIsNT4sIDwyLDAsMSwyPgorICA0MDI2Njk4NjQyVSwJLy8gPDIsNSwyLDE+OiBDb3N0IDQgdnppcHIgPDAsMCwyLDI+LCA8NCwwLDUsMT4KKyAgMjYzMjAzMzg5NlUsCS8vIDwyLDUsMiwyPjogQ29zdCAzIHZleHQyIDwyLDQsMiw1PiwgPDIsMiwyLDI+CisgIDM2OTE4NDExOTBVLAkvLyA8Miw1LDIsMz46IENvc3QgNCB2ZXh0MiA8MCwxLDIsNT4sIDwyLDMsMCwxPgorICAyNjMyMDM0MDYxVSwJLy8gPDIsNSwyLDQ+OiBDb3N0IDMgdmV4dDIgPDIsNCwyLDU+LCA8Miw0LDIsNT4KKyAgMzY5MTg0MTM1MlUsCS8vIDwyLDUsMiw1PjogQ29zdCA0IHZleHQyIDwwLDEsMiw1PiwgPDIsNSwwLDE+CisgIDM2OTE4NDE0NjZVLAkvLyA8Miw1LDIsNj46IENvc3QgNCB2ZXh0MiA8MCwxLDIsNT4sIDwyLDYsMyw3PgorICAzMDg4MzU0NjE0VSwJLy8gPDIsNSwyLDc+OiBDb3N0IDMgdnRybnIgPDAsMiwwLDI+LCBSSFMKKyAgMzA4ODM1NDYxNVUsCS8vIDwyLDUsMix1PjogQ29zdCAzIHZ0cm5yIDwwLDIsMCwyPiwgUkhTCisgIDI1NTc4MjkyMjJVLAkvLyA8Miw1LDMsMD46IENvc3QgMyB2ZXh0MSA8MSwyLDUsMz4sIExIUworICAyNTU3ODMwMDU5VSwJLy8gPDIsNSwzLDE+OiBDb3N0IDMgdmV4dDEgPDEsMiw1LDM+LCA8MSwyLDUsMz4KKyAgMjU3NTc0Njc2NlUsCS8vIDwyLDUsMywyPjogQ29zdCAzIHZleHQxIDw0LDIsNSwzPiwgPDIsMyw0LDU+CisgIDM2OTE4NDE5NDhVLAkvLyA8Miw1LDMsMz46IENvc3QgNCB2ZXh0MiA8MCwxLDIsNT4sIDwzLDMsMywzPgorICAyNjE5NDI3MzMwVSwJLy8gPDIsNSwzLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMywyLDU+LCA8Myw0LDUsNj4KKyAgMjU4MTcyMDg0N1UsCS8vIDwyLDUsMyw1PjogQ29zdCAzIHZleHQxIDw1LDIsNSwzPiwgPDUsMiw1LDM+CisgIDI5NTM2MjgxNjJVLAkvLyA8Miw1LDMsNj46IENvc3QgMyB2emlwciBMSFMsIDwzLDQsNSw2PgorICAyOTUzNjI2NjI0VSwJLy8gPDIsNSwzLDc+OiBDb3N0IDMgdnppcHIgTEhTLCA8MSwzLDUsNz4KKyAgMjk1MzYyNjYyNVUsCS8vIDwyLDUsMyx1PjogQ29zdCAzIHZ6aXByIExIUywgPDEsMyw1LHU+CisgIDI1Njk3ODEzNTBVLAkvLyA8Miw1LDQsMD46IENvc3QgMyB2ZXh0MSA8MywyLDUsND4sIExIUworICAzNjMxNTgwMDc2VSwJLy8gPDIsNSw0LDE+OiBDb3N0IDQgdmV4dDEgPDEsMiw1LDQ+LCA8MSwyLDUsND4KKyAgMjU2OTc4Mjk5MFUsCS8vIDwyLDUsNCwyPjogQ29zdCAzIHZleHQxIDwzLDIsNSw0PiwgPDIsMyw0LDU+CisgIDI1Njk3ODM2NDZVLAkvLyA8Miw1LDQsMz46IENvc3QgMyB2ZXh0MSA8MywyLDUsND4sIDwzLDIsNSw0PgorICAyNTY5Nzg0NjMwVSwJLy8gPDIsNSw0LDQ+OiBDb3N0IDMgdmV4dDEgPDMsMiw1LDQ+LCBSSFMKKyAgMjYxODEwMTA0NlUsCS8vIDwyLDUsNCw1PjogQ29zdCAzIHZleHQyIDwwLDEsMiw1PiwgUkhTCisgIDM4OTM5MDU5MjJVLAkvLyA8Miw1LDQsNj46IENvc3QgNCB2dXpwciA8MCwyLDMsNT4sIDwzLDQsNSw2PgorICAzMDk0NTY0MTUwVSwJLy8gPDIsNSw0LDc+OiBDb3N0IDMgdnRybnIgPDEsMiwzLDQ+LCBSSFMKKyAgMjYxODEwMTI4OVUsCS8vIDwyLDUsNCx1PjogQ29zdCAzIHZleHQyIDwwLDEsMiw1PiwgUkhTCisgIDI1NTE4NzM2MzhVLAkvLyA8Miw1LDUsMD46IENvc3QgMyB2ZXh0MSA8MCwyLDUsNT4sIExIUworICAzNjM3NTYwMzIwVSwJLy8gPDIsNSw1LDE+OiBDb3N0IDQgdmV4dDEgPDIsMiw1LDU+LCA8MSwzLDUsNz4KKyAgMzYzNzU2MDk2NlUsCS8vIDwyLDUsNSwyPjogQ29zdCA0IHZleHQxIDwyLDIsNSw1PiwgPDIsMiw1LDU+CisgIDM3MjMwMzAzNDNVLAkvLyA8Miw1LDUsMz46IENvc3QgNCB2ZXh0MiA8NSwzLDIsNT4sIDw1LDMsMiw1PgorICAyNTUxODc2OTE4VSwJLy8gPDIsNSw1LDQ+OiBDb3N0IDMgdmV4dDEgPDAsMiw1LDU+LCBSSFMKKyAgMjcxMjgzNDA1MlUsCS8vIDwyLDUsNSw1PjogQ29zdCAzIHZleHQzIDw0LDYsdSwyPiwgPDUsNSw1LDU+CisgIDQwMjg3MTM0NzRVLAkvLyA8Miw1LDUsNj46IENvc3QgNCB2emlwciA8MCwzLDIsNT4sIDwzLDQsNSw2PgorICAyNzEyODM0MDcyVSwJLy8gPDIsNSw1LDc+OiBDb3N0IDMgdmV4dDMgPDQsNix1LDI+LCA8NSw1LDcsNz4KKyAgMjcxMjgzNDA4MVUsCS8vIDwyLDUsNSx1PjogQ29zdCAzIHZleHQzIDw0LDYsdSwyPiwgPDUsNSx1LDc+CisgIDI1NzU3Njk3MDJVLAkvLyA8Miw1LDYsMD46IENvc3QgMyB2ZXh0MSA8NCwyLDUsNj4sIExIUworICAzNjMxNTk2NDYyVSwJLy8gPDIsNSw2LDE+OiBDb3N0IDQgdmV4dDEgPDEsMiw1LDY+LCA8MSwyLDUsNj4KKyAgMjY1NTkyNDczMFUsCS8vIDwyLDUsNiwyPjogQ29zdCAzIHZleHQyIDw2LDQsMiw1PiwgPDYsMiw3LDM+CisgIDM2NDM1NDE4NTZVLAkvLyA8Miw1LDYsMz46IENvc3QgNCB2ZXh0MSA8MywyLDUsNj4sIDwzLDIsNSw2PgorICAyNjU1OTI0ODQ5VSwJLy8gPDIsNSw2LDQ+OiBDb3N0IDMgdmV4dDIgPDYsNCwyLDU+LCA8Niw0LDIsNT4KKyAgMzc4Nzc1NTYwN1UsCS8vIDwyLDUsNiw1PjogQ29zdCA0IHZleHQzIDw0LHUsNiwyPiwgPDUsNiw1LDc+CisgIDQwMjkzODUyMThVLAkvLyA8Miw1LDYsNj46IENvc3QgNCB2emlwciA8MCw0LDIsNj4sIDwzLDQsNSw2PgorICAzMDg4NjgyMjk0VSwJLy8gPDIsNSw2LDc+OiBDb3N0IDMgdnRybnIgPDAsMiw0LDY+LCBSSFMKKyAgMzA4ODY4MjI5NVUsCS8vIDwyLDUsNix1PjogQ29zdCAzIHZ0cm5yIDwwLDIsNCw2PiwgUkhTCisgIDI1NjM4MzM5NThVLAkvLyA8Miw1LDcsMD46IENvc3QgMyB2ZXh0MSA8MiwyLDUsNz4sIExIUworICAyNTUxODkwNjc4VSwJLy8gPDIsNSw3LDE+OiBDb3N0IDMgdmV4dDEgPDAsMiw1LDc+LCA8MSwwLDMsMj4KKyAgMjU2MzgzNTUyOFUsCS8vIDwyLDUsNywyPjogQ29zdCAzIHZleHQxIDwyLDIsNSw3PiwgPDIsMiw1LDc+CisgIDM2Mzc1Nzc4NzhVLAkvLyA8Miw1LDcsMz46IENvc3QgNCB2ZXh0MSA8MiwyLDUsNz4sIDwzLDAsMSwyPgorICAyNTYzODM3MjM4VSwJLy8gPDIsNSw3LDQ+OiBDb3N0IDMgdmV4dDEgPDIsMiw1LDc+LCBSSFMKKyAgMjcxMjgzNDIxNlUsCS8vIDwyLDUsNyw1PjogQ29zdCAzIHZleHQzIDw0LDYsdSwyPiwgPDUsNyw1LDc+CisgIDI3MTI4MzQyMjBVLAkvLyA8Miw1LDcsNj46IENvc3QgMyB2ZXh0MyA8NCw2LHUsMj4sIDw1LDcsNiwyPgorICA0MTc0NDQ5OTc0VSwJLy8gPDIsNSw3LDc+OiBDb3N0IDQgdnRybnIgPDIsMiw1LDc+LCBSSFMKKyAgMjU2MzgzOTc5MFUsCS8vIDwyLDUsNyx1PjogQ29zdCAzIHZleHQxIDwyLDIsNSw3PiwgTEhTCisgIDI1NjM4NDIxNTBVLAkvLyA8Miw1LHUsMD46IENvc3QgMyB2ZXh0MSA8MiwyLDUsdT4sIExIUworICAyNjE4MTAzNTk4VSwJLy8gPDIsNSx1LDE+OiBDb3N0IDMgdmV4dDIgPDAsMSwyLDU+LCBMSFMKKyAgMjU2Mzg0MzcyMVUsCS8vIDwyLDUsdSwyPjogQ29zdCAzIHZleHQxIDwyLDIsNSx1PiwgPDIsMiw1LHU+CisgIDI1Njk4MTY0MThVLAkvLyA8Miw1LHUsMz46IENvc3QgMyB2ZXh0MSA8MywyLDUsdT4sIDwzLDIsNSx1PgorICAyNjIyNzQ4NzM1VSwJLy8gPDIsNSx1LDQ+OiBDb3N0IDMgdmV4dDIgPDAsdSwyLDU+LCA8dSw0LDUsNj4KKyAgMjYxODEwMzk2MlUsCS8vIDwyLDUsdSw1PjogQ29zdCAzIHZleHQyIDwwLDEsMiw1PiwgUkhTCisgIDI5NTM2NjkxMjJVLAkvLyA8Miw1LHUsNj46IENvc3QgMyB2emlwciBMSFMsIDwzLDQsNSw2PgorICAyOTUzNjY3NTg0VSwJLy8gPDIsNSx1LDc+OiBDb3N0IDMgdnppcHIgTEhTLCA8MSwzLDUsNz4KKyAgMjYxODEwNDE2NVUsCS8vIDwyLDUsdSx1PjogQ29zdCAzIHZleHQyIDwwLDEsMiw1PiwgTEhTCisgIDI2MjAwOTY1MTJVLAkvLyA8Miw2LDAsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDIsNj4sIDwwLDAsMCwwPgorICAxNTQ2MzU0NzkwVSwJLy8gPDIsNiwwLDE+OiBDb3N0IDIgdmV4dDIgPDAsNCwyLDY+LCBMSFMKKyAgMjYyMDA5NjY3NlUsCS8vIDwyLDYsMCwyPjogQ29zdCAzIHZleHQyIDwwLDQsMiw2PiwgPDAsMiwwLDI+CisgIDM2OTM4Mzg1ODhVLAkvLyA8Miw2LDAsMz46IENvc3QgNCB2ZXh0MiA8MCw0LDIsNj4sIDwwLDMsMSwwPgorICAxNTQ2MzU1MDM2VSwJLy8gPDIsNiwwLDQ+OiBDb3N0IDIgdmV4dDIgPDAsNCwyLDY+LCA8MCw0LDIsNj4KKyAgMzY5NDUwMjMxN1UsCS8vIDwyLDYsMCw1PjogQ29zdCA0IHZleHQyIDwwLDUsMiw2PiwgPDAsNSwyLDY+CisgIDI1NTE5MTEyNDZVLAkvLyA8Miw2LDAsNj46IENvc3QgMyB2ZXh0MSA8MCwyLDYsMD4sIDw2LDcsMCwxPgorICAyNzIwNzIzMjg3VSwJLy8gPDIsNiwwLDc+OiBDb3N0IDMgdmV4dDMgPDYsMCw3LDI+LCA8NiwwLDcsMj4KKyAgMTU0NjM1NTM1N1UsCS8vIDwyLDYsMCx1PjogQ29zdCAyIHZleHQyIDwwLDQsMiw2PiwgTEhTCisgIDI2MjAwOTcyNzBVLAkvLyA8Miw2LDEsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDIsNj4sIDwxLDAsMywyPgorICAyNjIwMDk3MzMyVSwJLy8gPDIsNiwxLDE+OiBDb3N0IDMgdmV4dDIgPDAsNCwyLDY+LCA8MSwxLDEsMT4KKyAgMjYyMDA5NzQzMFUsCS8vIDwyLDYsMSwyPjogQ29zdCAzIHZleHQyIDwwLDQsMiw2PiwgPDEsMiwzLDA+CisgIDI4MjAyNDM1NThVLAkvLyA8Miw2LDEsMz46IENvc3QgMyB2dXpwciA8MCwyLDQsNj4sIExIUworICAyNjIwMDk3NTk4VSwJLy8gPDIsNiwxLDQ+OiBDb3N0IDMgdmV4dDIgPDAsNCwyLDY+LCA8MSw0LDMsNj4KKyAgMjYyMDA5NzY4MFUsCS8vIDwyLDYsMSw1PjogQ29zdCAzIHZleHQyIDwwLDQsMiw2PiwgPDEsNSwzLDc+CisgIDM2OTM4Mzk1ODVVLAkvLyA8Miw2LDEsNj46IENvc3QgNCB2ZXh0MiA8MCw0LDIsNj4sIDwxLDYsMyw3PgorICAyNzIxMzg2OTIwVSwJLy8gPDIsNiwxLDc+OiBDb3N0IDMgdmV4dDMgPDYsMSw3LDI+LCA8NiwxLDcsMj4KKyAgMjgyMDI0MzU2M1UsCS8vIDwyLDYsMSx1PjogQ29zdCAzIHZ1enByIDwwLDIsNCw2PiwgTEhTCisgIDI3MTQwMTQxMzdVLAkvLyA8Miw2LDIsMD46IENvc3QgMyB2ZXh0MyA8NCx1LDYsMj4sIDw2LDIsMCwxPgorICAyNzEyODM0NTAwVSwJLy8gPDIsNiwyLDE+OiBDb3N0IDMgdmV4dDMgPDQsNix1LDI+LCA8NiwyLDEsMz4KKyAgMjYyMDA5ODE1MlUsCS8vIDwyLDYsMiwyPjogQ29zdCAzIHZleHQyIDwwLDQsMiw2PiwgPDIsMiwyLDI+CisgIDI2MjAwOTgyMTRVLAkvLyA8Miw2LDIsMz46IENvc3QgMyB2ZXh0MiA8MCw0LDIsNj4sIDwyLDMsMCwxPgorICAyNjMyMDQyMjU0VSwJLy8gPDIsNiwyLDQ+OiBDb3N0IDMgdmV4dDIgPDIsNCwyLDY+LCA8Miw0LDIsNj4KKyAgMjcxMjgzNDU0MFUsCS8vIDwyLDYsMiw1PjogQ29zdCAzIHZleHQzIDw0LDYsdSwyPiwgPDYsMiw1LDc+CisgIDI4MjAyNDM2NjBVLAkvLyA8Miw2LDIsNj46IENvc3QgMyB2dXpwciA8MCwyLDQsNj4sIDwwLDIsNCw2PgorICAyOTU4MjY1NjU0VSwJLy8gPDIsNiwyLDc+OiBDb3N0IDMgdnppcHIgPDAsdSwyLDI+LCBSSFMKKyAgMjYyMDA5ODYxOVUsCS8vIDwyLDYsMix1PjogQ29zdCAzIHZleHQyIDwwLDQsMiw2PiwgPDIsdSwwLDE+CisgIDI2MjAwOTg3MTBVLAkvLyA8Miw2LDMsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDIsNj4sIDwzLDAsMSwyPgorICAzODkzOTg2OTgyVSwJLy8gPDIsNiwzLDE+OiBDb3N0IDQgdnV6cHIgPDAsMiw0LDY+LCA8MiwzLDAsMT4KKyAgMjU2OTg0ODc2MlUsCS8vIDwyLDYsMywyPjogQ29zdCAzIHZleHQxIDwzLDIsNiwzPiwgPDIsNiwzLDc+CisgIDI2MjAwOTg5NzJVLAkvLyA8Miw2LDMsMz46IENvc3QgMyB2ZXh0MiA8MCw0LDIsNj4sIDwzLDMsMywzPgorICAyNjIwMDk5MDc0VSwJLy8gPDIsNiwzLDQ+OiBDb3N0IDMgdmV4dDIgPDAsNCwyLDY+LCA8Myw0LDUsNj4KKyAgMzg5Mzk4NzAyMlUsCS8vIDwyLDYsMyw1PjogQ29zdCA0IHZ1enByIDwwLDIsNCw2PiwgPDIsMyw0LDU+CisgIDMwMDE0MDQ2NDRVLAkvLyA8Miw2LDMsNj46IENvc3QgMyB2emlwciBMSFMsIDw0LDQsNiw2PgorICAxODc5ODg3MTU4VSwJLy8gPDIsNiwzLDc+OiBDb3N0IDIgdnppcHIgTEhTLCBSSFMKKyAgMTg3OTg4NzE1OVUsCS8vIDwyLDYsMyx1PjogQ29zdCAyIHZ6aXByIExIUywgUkhTCisgIDI2MjAwOTk0ODRVLAkvLyA8Miw2LDQsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDIsNj4sIDw0LDAsNiwyPgorICAyNjIwMDk5NTY2VSwJLy8gPDIsNiw0LDE+OiBDb3N0IDMgdmV4dDIgPDAsNCwyLDY+LCA8NCwxLDYsMz4KKyAgMjYyMDA5OTY0NFUsCS8vIDwyLDYsNCwyPjogQ29zdCAzIHZleHQyIDwwLDQsMiw2PiwgPDQsMiw2LDA+CisgIDM2NDM1OTkyMDdVLAkvLyA8Miw2LDQsMz46IENvc3QgNCB2ZXh0MSA8MywyLDYsND4sIDwzLDIsNiw0PgorICAyNTc1ODMwMDgwVSwJLy8gPDIsNiw0LDQ+OiBDb3N0IDMgdmV4dDEgPDQsMiw2LDQ+LCA8NCwyLDYsND4KKyAgMTU0NjM1ODA3MFUsCS8vIDwyLDYsNCw1PjogQ29zdCAyIHZleHQyIDwwLDQsMiw2PiwgUkhTCisgIDI2Njc4NzU3MDBVLAkvLyA8Miw2LDQsNj46IENvc3QgMyB2ZXh0MiA8dSw0LDIsNj4sIDw0LDYsNCw2PgorICA0MDI4MDQyNTUwVSwJLy8gPDIsNiw0LDc+OiBDb3N0IDQgdnppcHIgPDAsMiwyLDQ+LCBSSFMKKyAgMTU0NjM1ODMxM1UsCS8vIDwyLDYsNCx1PjogQ29zdCAyIHZleHQyIDwwLDQsMiw2PiwgUkhTCisgIDM2OTM4NDE5OTJVLAkvLyA8Miw2LDUsMD46IENvc3QgNCB2ZXh0MiA8MCw0LDIsNj4sIDw1LDAsMSwyPgorICAyNjY3ODc2MDQ4VSwJLy8gPDIsNiw1LDE+OiBDb3N0IDMgdmV4dDIgPHUsNCwyLDY+LCA8NSwxLDcsMz4KKyAgMjcxMjgzNDc1NlUsCS8vIDwyLDYsNSwyPjogQ29zdCAzIHZleHQzIDw0LDYsdSwyPiwgPDYsNSwyLDc+CisgIDM2NDM2MDc0MDBVLAkvLyA8Miw2LDUsMz46IENvc3QgNCB2ZXh0MSA8MywyLDYsNT4sIDwzLDIsNiw1PgorICAyMjUyMDkxODczVSwJLy8gPDIsNiw1LDQ+OiBDb3N0IDMgdnJldiA8NiwyLDQsNT4KKyAgMjY2Nzg3NjM1NlUsCS8vIDwyLDYsNSw1PjogQ29zdCAzIHZleHQyIDx1LDQsMiw2PiwgPDUsNSw1LDU+CisgIDI2Njc4NzY0NTBVLAkvLyA8Miw2LDUsNj46IENvc3QgMyB2ZXh0MiA8dSw0LDIsNj4sIDw1LDYsNywwPgorICAyODIwMjQ2ODM4VSwJLy8gPDIsNiw1LDc+OiBDb3N0IDMgdnV6cHIgPDAsMiw0LDY+LCBSSFMKKyAgMjgyMDI0NjgzOVUsCS8vIDwyLDYsNSx1PjogQ29zdCAzIHZ1enByIDwwLDIsNCw2PiwgUkhTCisgIDI1NjM4OTk0OTRVLAkvLyA8Miw2LDYsMD46IENvc3QgMyB2ZXh0MSA8MiwyLDYsNj4sIExIUworICAzODkzOTg4NjgzVSwJLy8gPDIsNiw2LDE+OiBDb3N0IDQgdnV6cHIgPDAsMiw0LDY+LCA8NCw2LDAsMT4KKyAgMjU2MzkwMTA3MlUsCS8vIDwyLDYsNiwyPjogQ29zdCAzIHZleHQxIDwyLDIsNiw2PiwgPDIsMiw2LDY+CisgIDM4OTM5ODcyMzZVLAkvLyA8Miw2LDYsMz46IENvc3QgNCB2dXpwciA8MCwyLDQsNj4sIDwyLDYsMSwzPgorICAyNTYzOTAyNzc0VSwJLy8gPDIsNiw2LDQ+OiBDb3N0IDMgdmV4dDEgPDIsMiw2LDY+LCBSSFMKKyAgMzg5Mzk4ODcyM1UsCS8vIDwyLDYsNiw1PjogQ29zdCA0IHZ1enByIDwwLDIsNCw2PiwgPDQsNiw0LDU+CisgIDI3MTI4MzQ4NzJVLAkvLyA8Miw2LDYsNj46IENvc3QgMyB2ZXh0MyA8NCw2LHUsMj4sIDw2LDYsNiw2PgorICAyOTU1NjQ0MjE0VSwJLy8gPDIsNiw2LDc+OiBDb3N0IDMgdnppcHIgPDAsNCwyLDY+LCBSSFMKKyAgMjk1NTY0NDIxNVUsCS8vIDwyLDYsNix1PjogQ29zdCAzIHZ6aXByIDwwLDQsMiw2PiwgUkhTCisgIDI3MTI4MzQ4OTRVLAkvLyA8Miw2LDcsMD46IENvc3QgMyB2ZXh0MyA8NCw2LHUsMj4sIDw2LDcsMCwxPgorICAyNzI0OTI2Mjk2VSwJLy8gPDIsNiw3LDE+OiBDb3N0IDMgdmV4dDMgPDYsNywxLDI+LCA8Niw3LDEsMj4KKyAgMjcyNTAwMDAzM1UsCS8vIDwyLDYsNywyPjogQ29zdCAzIHZleHQzIDw2LDcsMiwyPiwgPDYsNywyLDI+CisgIDI3MDIzNjU1NDRVLAkvLyA8Miw2LDcsMz46IENvc3QgMyB2ZXh0MyA8MywwLDEsMj4sIDw2LDcsMywwPgorICAyNzEyODM0OTM0VSwJLy8gPDIsNiw3LDQ+OiBDb3N0IDMgdmV4dDMgPDQsNix1LDI+LCA8Niw3LDQsNT4KKyAgMzc3NjEwNzM5M1UsCS8vIDwyLDYsNyw1PjogQ29zdCA0IHZleHQzIDwzLDAsMSwyPiwgPDYsNyw1LDc+CisgIDI3MjUyOTQ5ODFVLAkvLyA8Miw2LDcsNj46IENvc3QgMyB2ZXh0MyA8Niw3LDYsMj4sIDw2LDcsNiwyPgorICAyNzI2MjUzNDUyVSwJLy8gPDIsNiw3LDc+OiBDb3N0IDMgdmV4dDMgPDcsMCwxLDI+LCA8Niw3LDcsMD4KKyAgMjcxMjgzNDk2NlUsCS8vIDwyLDYsNyx1PjogQ29zdCAzIHZleHQzIDw0LDYsdSwyPiwgPDYsNyx1LDE+CisgIDI2MjAxMDIzNTVVLAkvLyA8Miw2LHUsMD46IENvc3QgMyB2ZXh0MiA8MCw0LDIsNj4sIDx1LDAsMSwyPgorICAxNTQ2MzYwNjIyVSwJLy8gPDIsNix1LDE+OiBDb3N0IDIgdmV4dDIgPDAsNCwyLDY+LCBMSFMKKyAgMjYyMDEwMjUzNlUsCS8vIDwyLDYsdSwyPjogQ29zdCAzIHZleHQyIDwwLDQsMiw2PiwgPHUsMiwzLDM+CisgIDI4MjAyNDQxMjVVLAkvLyA8Miw2LHUsMz46IENvc3QgMyB2dXpwciA8MCwyLDQsNj4sIExIUworICAxNTk0MTM2NjEyVSwJLy8gPDIsNix1LDQ+OiBDb3N0IDIgdmV4dDIgPHUsNCwyLDY+LCA8dSw0LDIsNj4KKyAgMTU0NjM2MDk4NlUsCS8vIDwyLDYsdSw1PjogQ29zdCAyIHZleHQyIDwwLDQsMiw2PiwgUkhTCisgIDI2MjAxMDI4NjRVLAkvLyA8Miw2LHUsNj46IENvc3QgMyB2ZXh0MiA8MCw0LDIsNj4sIDx1LDYsMyw3PgorICAxODc5OTI4MTE4VSwJLy8gPDIsNix1LDc+OiBDb3N0IDIgdnppcHIgTEhTLCBSSFMKKyAgMTg3OTkyODExOVUsCS8vIDwyLDYsdSx1PjogQ29zdCAyIHZ6aXByIExIUywgUkhTCisgIDI3MjYxNzk4MjVVLAkvLyA8Miw3LDAsMD46IENvc3QgMyB2ZXh0MyA8NywwLDAsMj4sIDw3LDAsMCwyPgorICAxNjUyNTExNzM4VSwJLy8gPDIsNywwLDE+OiBDb3N0IDIgdmV4dDMgPDcsMCwxLDI+LCA8NywwLDEsMj4KKyAgMjYyMTQzMTk3MlUsCS8vIDwyLDcsMCwyPjogQ29zdCAzIHZleHQyIDwwLDYsMiw3PiwgPDAsMiwwLDI+CisgIDIyNTc5NDk4NjhVLAkvLyA8Miw3LDAsMz46IENvc3QgMyB2cmV2IDw3LDIsMywwPgorICAyNzI2NDc0NzczVSwJLy8gPDIsNywwLDQ+OiBDb3N0IDMgdmV4dDMgPDcsMCw0LDI+LCA8NywwLDQsMj4KKyAgMjYyMDc2ODY4NlUsCS8vIDwyLDcsMCw1PjogQ29zdCAzIHZleHQyIDwwLDUsMiw3PiwgPDAsNSwyLDc+CisgIDI2MjE0MzIzMTlVLAkvLyA8Miw3LDAsNj46IENvc3QgMyB2ZXh0MiA8MCw2LDIsNz4sIDwwLDYsMiw3PgorICAyNTk5NzYwOTUzVSwJLy8gPDIsNywwLDc+OiBDb3N0IDMgdmV4dDEgPHUsMiw3LDA+LCA8NywwLHUsMj4KKyAgMTY1MzAyNzg5N1UsCS8vIDwyLDcsMCx1PjogQ29zdCAyIHZleHQzIDw3LDAsdSwyPiwgPDcsMCx1LDI+CisgIDI2MzkzNDg0NzBVLAkvLyA8Miw3LDEsMD46IENvc3QgMyB2ZXh0MiA8Myw2LDIsNz4sIDwxLDAsMywyPgorICAzNjk1MTc0NDUyVSwJLy8gPDIsNywxLDE+OiBDb3N0IDQgdmV4dDIgPDAsNiwyLDc+LCA8MSwxLDEsMT4KKyAgMzY5NTE3NDU1MFUsCS8vIDwyLDcsMSwyPjogQ29zdCA0IHZleHQyIDwwLDYsMiw3PiwgPDEsMiwzLDA+CisgIDM2OTQ1MTExMDRVLAkvLyA8Miw3LDEsMz46IENvc3QgNCB2ZXh0MiA8MCw1LDIsNz4sIDwxLDMsNSw3PgorICAzNzEzMDkwNTk0VSwJLy8gPDIsNywxLDQ+OiBDb3N0IDQgdmV4dDIgPDMsNiwyLDc+LCA8MSw0LDAsNT4KKyAgMzY5MzE4NDE0NFUsCS8vIDwyLDcsMSw1PjogQ29zdCA0IHZleHQyIDwwLDMsMiw3PiwgPDEsNSwzLDc+CisgIDI2Mjc0MDUwMTZVLAkvLyA8Miw3LDEsNj46IENvc3QgMyB2ZXh0MiA8MSw2LDIsNz4sIDwxLDYsMiw3PgorICAzNzk5OTk1NTE5VSwJLy8gPDIsNywxLDc+OiBDb3N0IDQgdmV4dDMgPDcsMCwxLDI+LCA8NywxLDcsMD4KKyAgMjYzOTM0ODQ3MFUsCS8vIDwyLDcsMSx1PjogQ29zdCAzIHZleHQyIDwzLDYsMiw3PiwgPDEsMCwzLDI+CisgIDM2OTUxNzUxMDFVLAkvLyA8Miw3LDIsMD46IENvc3QgNCB2ZXh0MiA8MCw2LDIsNz4sIDwyLDAsMSwyPgorICAzNjQzNjU1MTY4VSwJLy8gPDIsNywyLDE+OiBDb3N0IDQgdmV4dDEgPDMsMiw3LDI+LCA8MSwzLDUsNz4KKyAgMjI1Nzg5MjUxN1UsCS8vIDwyLDcsMiwyPjogQ29zdCAzIHZyZXYgPDcsMiwyLDI+CisgIDM2OTUxNzUzMzRVLAkvLyA8Miw3LDIsMz46IENvc3QgNCB2ZXh0MiA8MCw2LDIsNz4sIDwyLDMsMCwxPgorICAzNjk1MTc1NDY1VSwJLy8gPDIsNywyLDQ+OiBDb3N0IDQgdmV4dDIgPDAsNiwyLDc+LCA8Miw0LDUsNj4KKyAgMjYzMjcxNDA4MFUsCS8vIDwyLDcsMiw1PjogQ29zdCAzIHZleHQyIDwyLDUsMiw3PiwgPDIsNSwyLDc+CisgIDI2MzMzNzc3MTNVLAkvLyA8Miw3LDIsNj46IENvc3QgMyB2ZXh0MiA8Miw2LDIsNz4sIDwyLDYsMiw3PgorICAzNjk1MTc1NjU4VSwJLy8gPDIsNywyLDc+OiBDb3N0IDQgdmV4dDIgPDAsNiwyLDc+LCA8Miw3LDAsMT4KKyAgMjYzNDcwNDk3OVUsCS8vIDwyLDcsMix1PjogQ29zdCAzIHZleHQyIDwyLHUsMiw3PiwgPDIsdSwyLDc+CisgIDE1MTQwOTQ2OTRVLAkvLyA8Miw3LDMsMD46IENvc3QgMiB2ZXh0MSA8NiwyLDcsMz4sIExIUworICAyNTY5OTIxNjgwVSwJLy8gPDIsNywzLDE+OiBDb3N0IDMgdmV4dDEgPDMsMiw3LDM+LCA8MSw1LDMsNz4KKyAgMjU4NzgzODA1NlUsCS8vIDwyLDcsMywyPjogQ29zdCAzIHZleHQxIDw2LDIsNywzPiwgPDIsMiwyLDI+CisgIDI1Njk5MjI5MjdVLAkvLyA8Miw3LDMsMz46IENvc3QgMyB2ZXh0MSA8MywyLDcsMz4sIDwzLDIsNywzPgorICAxNTE0MDk3OTc0VSwJLy8gPDIsNywzLDQ+OiBDb3N0IDIgdmV4dDEgPDYsMiw3LDM+LCBSSFMKKyAgMjU4MTg2ODMyMVUsCS8vIDwyLDcsMyw1PjogQ29zdCAzIHZleHQxIDw1LDIsNywzPiwgPDUsMiw3LDM+CisgIDE1MTQwOTkxOTRVLAkvLyA8Miw3LDMsNj46IENvc3QgMiB2ZXh0MSA8NiwyLDcsMz4sIDw2LDIsNywzPgorICAyNTg3ODQxNTMwVSwJLy8gPDIsNywzLDc+OiBDb3N0IDMgdmV4dDEgPDYsMiw3LDM+LCA8NywwLDEsMj4KKyAgMTUxNDEwMDUyNlUsCS8vIDwyLDcsMyx1PjogQ29zdCAyIHZleHQxIDw2LDIsNywzPiwgTEhTCisgIDI3MDg3MDY2MTdVLAkvLyA8Miw3LDQsMD46IENvc3QgMyB2ZXh0MyA8NCwwLDYsMj4sIDw3LDQsMCw2PgorICAzNjQ5NjQzNDE4VSwJLy8gPDIsNyw0LDE+OiBDb3N0IDQgdmV4dDEgPDQsMiw3LDQ+LCA8MSwyLDMsND4KKyAgMzY0OTY0NDMzMFUsCS8vIDwyLDcsNCwyPjogQ29zdCA0IHZleHQxIDw0LDIsNyw0PiwgPDIsNCw1LDc+CisgIDIyNTc5ODI2NDBVLAkvLyA8Miw3LDQsMz46IENvc3QgMyB2cmV2IDw3LDIsMyw0PgorICAzNjQ5NjQ1NjQxVSwJLy8gPDIsNyw0LDQ+OiBDb3N0IDQgdmV4dDEgPDQsMiw3LDQ+LCA8NCwyLDcsND4KKyAgMjYyMTQzNTE5MFUsCS8vIDwyLDcsNCw1PjogQ29zdCAzIHZleHQyIDwwLDYsMiw3PiwgUkhTCisgIDI3MTI4MzU0NDFVLAkvLyA8Miw3LDQsNj46IENvc3QgMyB2ZXh0MyA8NCw2LHUsMj4sIDw3LDQsNix1PgorICAzNzk5OTk1NzYyVSwJLy8gPDIsNyw0LDc+OiBDb3N0IDQgdmV4dDMgPDcsMCwxLDI+LCA8Nyw0LDcsMD4KKyAgMjYyMTQzNTQzM1UsCS8vIDwyLDcsNCx1PjogQ29zdCAzIHZleHQyIDwwLDYsMiw3PiwgUkhTCisgIDI3Mjk0OTc5OTBVLAkvLyA8Miw3LDUsMD46IENvc3QgMyB2ZXh0MyA8Nyw1LDAsMj4sIDw3LDUsMCwyPgorICAzNjQzNjc5NzQ0VSwJLy8gPDIsNyw1LDE+OiBDb3N0IDQgdmV4dDEgPDMsMiw3LDU+LCA8MSwzLDUsNz4KKyAgMzYzNzcwODQyNFUsCS8vIDwyLDcsNSwyPjogQ29zdCA0IHZleHQxIDwyLDIsNyw1PiwgPDIsMiw1LDc+CisgIDM2NDM2ODExMzdVLAkvLyA8Miw3LDUsMz46IENvc3QgNCB2ZXh0MSA8MywyLDcsNT4sIDwzLDIsNyw1PgorICAyNTk5ODAwMTE4VSwJLy8gPDIsNyw1LDQ+OiBDb3N0IDMgdmV4dDEgPHUsMiw3LDU+LCBSSFMKKyAgMzc4NjU3NzMzNFUsCS8vIDwyLDcsNSw1PjogQ29zdCA0IHZleHQzIDw0LDYsdSwyPiwgPDcsNSw1LDU+CisgIDM3ODY1NzczNDVVLAkvLyA8Miw3LDUsNj46IENvc3QgNCB2ZXh0MyA8NCw2LHUsMj4sIDw3LDUsNiw3PgorICAyNTk5ODAyMjE0VSwJLy8gPDIsNyw1LDc+OiBDb3N0IDMgdmV4dDEgPHUsMiw3LDU+LCA8Nyw0LDUsNj4KKyAgMjU5OTgwMjY3MFUsCS8vIDwyLDcsNSx1PjogQ29zdCAzIHZleHQxIDx1LDIsNyw1PiwgTEhTCisgIDI1ODE4ODkxMjZVLAkvLyA8Miw3LDYsMD46IENvc3QgMyB2ZXh0MSA8NSwyLDcsNj4sIExIUworICAzNjQzNjg3OTM2VSwJLy8gPDIsNyw2LDE+OiBDb3N0IDQgdmV4dDEgPDMsMiw3LDY+LCA8MSwzLDUsNz4KKyAgMjY2MzI0MDE4NlUsCS8vIDwyLDcsNiwyPjogQ29zdCAzIHZleHQyIDw3LDYsMiw3PiwgPDYsMiw3LDM+CisgIDM2NDM2ODkzMzBVLAkvLyA8Miw3LDYsMz46IENvc3QgNCB2ZXh0MSA8MywyLDcsNj4sIDwzLDIsNyw2PgorICAyNTgxODkyNDA2VSwJLy8gPDIsNyw2LDQ+OiBDb3N0IDMgdmV4dDEgPDUsMiw3LDY+LCBSSFMKKyAgMjU4MTg5MjkwMFUsCS8vIDwyLDcsNiw1PjogQ29zdCAzIHZleHQxIDw1LDIsNyw2PiwgPDUsMiw3LDY+CisgIDI1ODc4NjU1OTdVLAkvLyA8Miw3LDYsNj46IENvc3QgMyB2ZXh0MSA8NiwyLDcsNj4sIDw2LDIsNyw2PgorICAzNzg2NTc3NDI4VSwJLy8gPDIsNyw2LDc+OiBDb3N0IDQgdmV4dDMgPDQsNix1LDI+LCA8Nyw2LDcsMD4KKyAgMjU4MTg5NDk1OFUsCS8vIDwyLDcsNix1PjogQ29zdCAzIHZleHQxIDw1LDIsNyw2PiwgTEhTCisgIDI3MjYyNTQxMTlVLAkvLyA8Miw3LDcsMD46IENvc3QgMyB2ZXh0MyA8NywwLDEsMj4sIDw3LDcsMCwxPgorICAzODA0NjQwODE3VSwJLy8gPDIsNyw3LDE+OiBDb3N0IDQgdmV4dDMgPDcsNywxLDI+LCA8Nyw3LDEsMj4KKyAgMzYzNzcyNDgyNlUsCS8vIDwyLDcsNywyPjogQ29zdCA0IHZleHQxIDwyLDIsNyw3PiwgPDIsMiw3LDc+CisgIDM3MzQ5OTIxMjNVLAkvLyA8Miw3LDcsMz46IENvc3QgNCB2ZXh0MiA8NywzLDIsNz4sIDw3LDMsMiw3PgorICAyNTUyMDQwNzU4VSwJLy8gPDIsNyw3LDQ+OiBDb3N0IDMgdmV4dDEgPDAsMiw3LDc+LCBSSFMKKyAgMzc5OTk5NTk5MlUsCS8vIDwyLDcsNyw1PjogQ29zdCA0IHZleHQzIDw3LDAsMSwyPiwgPDcsNyw1LDU+CisgIDI2NjMyNDExOThVLAkvLyA8Miw3LDcsNj46IENvc3QgMyB2ZXh0MiA8Nyw2LDIsNz4sIDw3LDYsMiw3PgorICAyNzEyODM1NjkyVSwJLy8gPDIsNyw3LDc+OiBDb3N0IDMgdmV4dDMgPDQsNix1LDI+LCA8Nyw3LDcsNz4KKyAgMjczMTU2MjYwN1UsCS8vIDwyLDcsNyx1PjogQ29zdCAzIHZleHQzIDw3LHUsMSwyPiwgPDcsNyx1LDE+CisgIDE1MTQxMzU2NTRVLAkvLyA8Miw3LHUsMD46IENvc3QgMiB2ZXh0MSA8NiwyLDcsdT4sIExIUworICAxNjU3ODIwODAyVSwJLy8gPDIsNyx1LDE+OiBDb3N0IDIgdmV4dDMgPDcsdSwxLDI+LCA8Nyx1LDEsMj4KKyAgMjU4Nzg3OTAxNlUsCS8vIDwyLDcsdSwyPjogQ29zdCAzIHZleHQxIDw2LDIsNyx1PiwgPDIsMiwyLDI+CisgIDI1Njk5NjM4OTJVLAkvLyA8Miw3LHUsMz46IENvc3QgMyB2ZXh0MSA8MywyLDcsdT4sIDwzLDIsNyx1PgorICAxNTE0MTM4OTM0VSwJLy8gPDIsNyx1LDQ+OiBDb3N0IDIgdmV4dDEgPDYsMiw3LHU+LCBSSFMKKyAgMjYyMTQzODEwNlUsCS8vIDwyLDcsdSw1PjogQ29zdCAzIHZleHQyIDwwLDYsMiw3PiwgUkhTCisgIDE1MTQxNDAxNTlVLAkvLyA8Miw3LHUsNj46IENvc3QgMiB2ZXh0MSA8NiwyLDcsdT4sIDw2LDIsNyx1PgorICAyNTg3ODgyNDkwVSwJLy8gPDIsNyx1LDc+OiBDb3N0IDMgdmV4dDEgPDYsMiw3LHU+LCA8NywwLDEsMj4KKyAgMTUxNDE0MTQ4NlUsCS8vIDwyLDcsdSx1PjogQ29zdCAyIHZleHQxIDw2LDIsNyx1PiwgTEhTCisgIDE1NDQzODA0MTZVLAkvLyA8Mix1LDAsMD46IENvc3QgMiB2ZXh0MiBMSFMsIDwwLDAsMCwwPgorICA0NzA2Mzg2OTlVLAkvLyA8Mix1LDAsMT46IENvc3QgMSB2ZXh0MiBMSFMsIExIUworICAxNTQ0MzgwNTgwVSwJLy8gPDIsdSwwLDI+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MCwyLDAsMj4KKyAgMTY1ODYzMTkwOVUsCS8vIDwyLHUsMCwzPjogQ29zdCAyIHZleHQzIDx1LDAsMywyPiwgPHUsMCwzLDI+CisgIDE1NDQzODA3NTRVLAkvLyA8Mix1LDAsND46IENvc3QgMiB2ZXh0MiBMSFMsIDwwLDQsMSw1PgorICAyNjY1ODk4NDE0VSwJLy8gPDIsdSwwLDU+OiBDb3N0IDMgdmV4dDIgTEhTLCA8MCw1LDIsNz4KKyAgMTY1ODg1MzEyMFUsCS8vIDwyLHUsMCw2PjogQ29zdCAyIHZleHQzIDx1LDAsNiwyPiwgPHUsMCw2LDI+CisgIDMwOTQ1MzE2MjVVLAkvLyA8Mix1LDAsNz46IENvc3QgMyB2dHJuciA8MSwyLDMsMD4sIFJIUworICA0NzA2MzkyNjFVLAkvLyA8Mix1LDAsdT46IENvc3QgMSB2ZXh0MiBMSFMsIExIUworICAxNTQ0MzgxMTc0VSwJLy8gPDIsdSwxLDA+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MSwwLDMsMj4KKyAgMTU0NDM4MTIzNlUsCS8vIDwyLHUsMSwxPjogQ29zdCAyIHZleHQyIExIUywgPDEsMSwxLDE+CisgIDE1NDQzODEzMzRVLAkvLyA8Mix1LDEsMj46IENvc3QgMiB2ZXh0MiBMSFMsIDwxLDIsMywwPgorICAxNTQ0MzgxNDAwVSwJLy8gPDIsdSwxLDM+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MSwzLDEsMz4KKyAgMjYxODEyMzMyNVUsCS8vIDwyLHUsMSw0PjogQ29zdCAzIHZleHQyIExIUywgPDEsNCwzLDU+CisgIDE1NDQzODE1ODRVLAkvLyA8Mix1LDEsNT46IENvc3QgMiB2ZXh0MiBMSFMsIDwxLDUsMyw3PgorICAyNjE4MTIzNDg5VSwJLy8gPDIsdSwxLDY+OiBDb3N0IDMgdmV4dDIgTEhTLCA8MSw2LDMsNz4KKyAgMjcyNjI1NDQyN1UsCS8vIDwyLHUsMSw3PjogQ29zdCAzIHZleHQzIDw3LDAsMSwyPiwgPHUsMSw3LDM+CisgIDE1NDQzODE4MjNVLAkvLyA8Mix1LDEsdT46IENvc3QgMiB2ZXh0MiBMSFMsIDwxLHUsMywzPgorICAxNDc4MzI4NDIyVSwJLy8gPDIsdSwyLDA+OiBDb3N0IDIgdmV4dDEgPDAsMix1LDI+LCBMSFMKKyAgMjYxODEyMzgwN1UsCS8vIDwyLHUsMiwxPjogQ29zdCAzIHZleHQyIExIUywgPDIsMSwzLDE+CisgIDI2OTI3MTE0MlUsCS8vIDwyLHUsMiwyPjogQ29zdCAxIHZkdXAyIExIUworICAxNTQ0MzgyMTE4VSwJLy8gPDIsdSwyLDM+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MiwzLDAsMT4KKyAgMTQ3ODMzMTcwMlUsCS8vIDwyLHUsMiw0PjogQ29zdCAyIHZleHQxIDwwLDIsdSwyPiwgUkhTCisgIDI2MTgxMjQxMzZVLAkvLyA8Mix1LDIsNT46IENvc3QgMyB2ZXh0MiBMSFMsIDwyLDUsMyw2PgorICAxNTQ0MzgyMzk0VSwJLy8gPDIsdSwyLDY+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Miw2LDMsNz4KKyAgMzA4ODM1NDg1N1UsCS8vIDwyLHUsMiw3PjogQ29zdCAzIHZ0cm5yIDwwLDIsMCwyPiwgUkhTCisgIDI2OTI3MTE0MlUsCS8vIDwyLHUsMix1PjogQ29zdCAxIHZkdXAyIExIUworICAxNTQ0MzgyNjE0VSwJLy8gPDIsdSwzLDA+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MywwLDEsMj4KKyAgMjk1MzYyNzM3NFUsCS8vIDwyLHUsMywxPjogQ29zdCAzIHZ6aXByIExIUywgPDIsMyx1LDE+CisgIDE0OTAyODIxNDNVLAkvLyA8Mix1LDMsMj46IENvc3QgMiB2ZXh0MSA8MiwyLHUsMz4sIDwyLDIsdSwzPgorICAxODc5ODgzOTMyVSwJLy8gPDIsdSwzLDM+OiBDb3N0IDIgdnppcHIgTEhTLCBMSFMKKyAgMTU0NDM4Mjk3OFUsCS8vIDwyLHUsMyw0PjogQ29zdCAyIHZleHQyIExIUywgPDMsNCw1LDY+CisgIDI5NTM2MjczNzhVLAkvLyA8Mix1LDMsNT46IENvc3QgMyB2emlwciBMSFMsIDwyLDMsdSw1PgorICAxNTE0MTcyOTMxVSwJLy8gPDIsdSwzLDY+OiBDb3N0IDIgdmV4dDEgPDYsMix1LDM+LCA8NiwyLHUsMz4KKyAgMTg3OTg4NzE3NlUsCS8vIDwyLHUsMyw3PjogQ29zdCAyIHZ6aXByIExIUywgUkhTCisgIDE4Nzk4ODM5MzdVLAkvLyA8Mix1LDMsdT46IENvc3QgMiB2emlwciBMSFMsIExIUworICAxNDg0MzE2Nzc0VSwJLy8gPDIsdSw0LDA+OiBDb3N0IDIgdmV4dDEgPDEsMix1LDQ+LCBMSFMKKyAgMTQ4NDMxNzYzOVUsCS8vIDwyLHUsNCwxPjogQ29zdCAyIHZleHQxIDwxLDIsdSw0PiwgPDEsMix1LDQ+CisgIDI1NTIwODgyNzBVLAkvLyA8Mix1LDQsMj46IENvc3QgMyB2ZXh0MSA8MCwyLHUsND4sIDwyLDMsNCw1PgorICAxMTkwMjEzNTEzVSwJLy8gPDIsdSw0LDM+OiBDb3N0IDIgdnJldiA8dSwyLDMsND4KKyAgMTQ4NDMyMDA1NFUsCS8vIDwyLHUsNCw0PjogQ29zdCAyIHZleHQxIDwxLDIsdSw0PiwgUkhTCisgIDQ3MDY0MTk3NFUsCS8vIDwyLHUsNCw1PjogQ29zdCAxIHZleHQyIExIUywgUkhTCisgIDE1OTIxNTk2MDRVLAkvLyA8Mix1LDQsNj46IENvc3QgMiB2ZXh0MiBMSFMsIDw0LDYsNCw2PgorICAzMDk0NTY0MzkzVSwJLy8gPDIsdSw0LDc+OiBDb3N0IDMgdnRybnIgPDEsMiwzLDQ+LCBSSFMKKyAgNDcwNjQyMjE3VSwJLy8gPDIsdSw0LHU+OiBDb3N0IDEgdmV4dDIgTEhTLCBSSFMKKyAgMjU1MjA5NDk1OVUsCS8vIDwyLHUsNSwwPjogQ29zdCAzIHZleHQxIDwwLDIsdSw1PiwgPDAsMix1LDU+CisgIDE1OTIxNTk5NTJVLAkvLyA8Mix1LDUsMT46IENvc3QgMiB2ZXh0MiBMSFMsIDw1LDEsNywzPgorICAyNTY0MDQwMzUzVSwJLy8gPDIsdSw1LDI+OiBDb3N0IDMgdmV4dDEgPDIsMix1LDU+LCA8MiwyLHUsNT4KKyAgMjY5MDI3NTQ1NVUsCS8vIDwyLHUsNSwzPjogQ29zdCAzIHZleHQzIDwwLHUsdSwyPiwgPHUsNSwzLDc+CisgIDE1OTIxNjAxOThVLAkvLyA8Mix1LDUsND46IENvc3QgMiB2ZXh0MiBMSFMsIDw1LDQsNyw2PgorICAxNTkyMTYwMjYwVSwJLy8gPDIsdSw1LDU+OiBDb3N0IDIgdmV4dDIgTEhTLCA8NSw1LDUsNT4KKyAgMTYxMTk2MjUyMlUsCS8vIDwyLHUsNSw2PjogQ29zdCAyIHZleHQzIDwwLDIsMCwyPiwgUkhTCisgIDE1OTIxNjA0MjRVLAkvLyA8Mix1LDUsNz46IENvc3QgMiB2ZXh0MiBMSFMsIDw1LDcsNSw3PgorICAxNjExOTYyNTQwVSwJLy8gPDIsdSw1LHU+OiBDb3N0IDIgdmV4dDMgPDAsMiwwLDI+LCBSSFMKKyAgMTQ3ODM2MTE5MFUsCS8vIDwyLHUsNiwwPjogQ29zdCAyIHZleHQxIDwwLDIsdSw2PiwgTEhTCisgIDI1NTIxMDM2NzBVLAkvLyA8Mix1LDYsMT46IENvc3QgMyB2ZXh0MSA8MCwyLHUsNj4sIDwxLDAsMywyPgorICAxNTkyMTYwNzYyVSwJLy8gPDIsdSw2LDI+OiBDb3N0IDIgdmV4dDIgTEhTLCA8NiwyLDcsMz4KKyAgMjY4NTcwNDQwMFUsCS8vIDwyLHUsNiwzPjogQ29zdCAzIHZleHQzIDwwLDIsMCwyPiwgPHUsNiwzLDc+CisgIDE0NzgzNjQ0NzBVLAkvLyA8Mix1LDYsND46IENvc3QgMiB2ZXh0MSA8MCwyLHUsNj4sIFJIUworICAyOTAxODkxMjI2VSwJLy8gPDIsdSw2LDU+OiBDb3N0IDMgdnppcGwgPDIsNiwzLDc+LCBSSFMKKyAgMTU5MjE2MTA4MFUsCS8vIDwyLHUsNiw2PjogQ29zdCAyIHZleHQyIExIUywgPDYsNiw2LDY+CisgIDE1OTIxNjExMDJVLAkvLyA8Mix1LDYsNz46IENvc3QgMiB2ZXh0MiBMSFMsIDw2LDcsMCwxPgorICAxNDc4MzY3MDIyVSwJLy8gPDIsdSw2LHU+OiBDb3N0IDIgdmV4dDEgPDAsMix1LDY+LCBMSFMKKyAgMTU5MjE2MTI3NFUsCS8vIDwyLHUsNywwPjogQ29zdCAyIHZleHQyIExIUywgPDcsMCwxLDI+CisgIDI2NTk5MzEyMjZVLAkvLyA8Mix1LDcsMT46IENvc3QgMyB2ZXh0MiA8NywxLDIsdT4sIDw3LDEsMix1PgorICAyNTY0MDU2NzM5VSwJLy8gPDIsdSw3LDI+OiBDb3N0IDMgdmV4dDEgPDIsMix1LDc+LCA8MiwyLHUsNz4KKyAgMjY2NTkwMzMzMVUsCS8vIDwyLHUsNywzPjogQ29zdCAzIHZleHQyIExIUywgPDcsMywwLDE+CisgIDE1OTIxNjE2MzhVLAkvLyA8Mix1LDcsND46IENvc3QgMiB2ZXh0MiBMSFMsIDw3LDQsNSw2PgorICAyNjY1OTAzNDk0VSwJLy8gPDIsdSw3LDU+OiBDb3N0IDMgdmV4dDIgTEhTLCA8Nyw1LDAsMj4KKyAgMjU4Nzk0NzUyN1UsCS8vIDwyLHUsNyw2PjogQ29zdCAzIHZleHQxIDw2LDIsdSw3PiwgPDYsMix1LDc+CisgIDE1OTIxNjE5MDBVLAkvLyA8Mix1LDcsNz46IENvc3QgMiB2ZXh0MiBMSFMsIDw3LDcsNyw3PgorICAxNTkyMTYxOTIyVSwJLy8gPDIsdSw3LHU+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Nyx1LDEsMj4KKyAgMTQ3ODM3NzU3NFUsCS8vIDwyLHUsdSwwPjogQ29zdCAyIHZleHQxIDwwLDIsdSx1PiwgTEhTCisgIDQ3MDY0NDUyNlUsCS8vIDwyLHUsdSwxPjogQ29zdCAxIHZleHQyIExIUywgTEhTCisgIDI2OTI3MTE0MlUsCS8vIDwyLHUsdSwyPjogQ29zdCAxIHZkdXAyIExIUworICAxODc5OTI0ODkyVSwJLy8gPDIsdSx1LDM+OiBDb3N0IDIgdnppcHIgTEhTLCBMSFMKKyAgMTQ3ODM4MDg1NFUsCS8vIDwyLHUsdSw0PjogQ29zdCAyIHZleHQxIDwwLDIsdSx1PiwgUkhTCisgIDQ3MDY0NDg5MFUsCS8vIDwyLHUsdSw1PjogQ29zdCAxIHZleHQyIExIUywgUkhTCisgIDE2MTE5NjI3NjVVLAkvLyA8Mix1LHUsNj46IENvc3QgMiB2ZXh0MyA8MCwyLDAsMj4sIFJIUworICAxODc5OTI4MTM2VSwJLy8gPDIsdSx1LDc+OiBDb3N0IDIgdnppcHIgTEhTLCBSSFMKKyAgNDcwNjQ1MDkzVSwJLy8gPDIsdSx1LHU+OiBDb3N0IDEgdmV4dDIgTEhTLCBMSFMKKyAgMTYxMTQ0ODMyMFUsCS8vIDwzLDAsMCwwPjogQ29zdCAyIHZleHQzIExIUywgPDAsMCwwLDA+CisgIDE2MTE4OTA2OThVLAkvLyA8MywwLDAsMT46IENvc3QgMiB2ZXh0MyBMSFMsIDwwLDAsMSwxPgorICAxNjExODkwNzA4VSwJLy8gPDMsMCwwLDI+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MCwwLDIsMj4KKyAgMzc2MzU3Njg2MFUsCS8vIDwzLDAsMCwzPjogQ29zdCA0IHZleHQzIExIUywgPDAsMCwzLDE+CisgIDI2ODk4MzUwNDVVLAkvLyA8MywwLDAsND46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLDAsNCwxPgorICAzNjk4NTA4MjA2VSwJLy8gPDMsMCwwLDU+OiBDb3N0IDQgdmV4dDIgPDEsMiwzLDA+LCA8MCw1LDIsNz4KKyAgMzc2MzU3Njg4N1UsCS8vIDwzLDAsMCw2PjogQ29zdCA0IHZleHQzIExIUywgPDAsMCw2LDE+CisgIDM2Njc2Nzg0MzRVLAkvLyA8MywwLDAsNz46IENvc3QgNCB2ZXh0MSA8NywzLDAsMD4sIDw3LDMsMCwwPgorICAxNjE2MDkzMjU4VSwJLy8gPDMsMCwwLHU+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MCwwLHUsMj4KKyAgMTQ5MDMzNzg5NFUsCS8vIDwzLDAsMSwwPjogQ29zdCAyIHZleHQxIDwyLDMsMCwxPiwgTEhTCisgIDI2ODU2MzI2MDJVLAkvLyA8MywwLDEsMT46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLDEsMSwwPgorICA1Mzc3MDY1OThVLAkvLyA8MywwLDEsMj46IENvc3QgMSB2ZXh0MyBMSFMsIExIUworICAyNjI0NzY2OTM2VSwJLy8gPDMsMCwxLDM+OiBDb3N0IDMgdmV4dDIgPDEsMiwzLDA+LCA8MSwzLDEsMz4KKyAgMTQ5MDM0MTE3NFUsCS8vIDwzLDAsMSw0PjogQ29zdCAyIHZleHQxIDwyLDMsMCwxPiwgUkhTCisgIDI2MjQ3NjcxMjBVLAkvLyA8MywwLDEsNT46IENvc3QgMyB2ZXh0MiA8MSwyLDMsMD4sIDwxLDUsMyw3PgorICAyNzMyOTY2MDMwVSwJLy8gPDMsMCwxLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MCwxLDYsNz4KKyAgMjU5Mzk0NDgwM1UsCS8vIDwzLDAsMSw3PjogQ29zdCAzIHZleHQxIDw3LDMsMCwxPiwgPDcsMywwLDE+CisgIDUzNzcwNjY1MlUsCS8vIDwzLDAsMSx1PjogQ29zdCAxIHZleHQzIExIUywgTEhTCisgIDE2MTE4OTA4NTJVLAkvLyA8MywwLDIsMD46IENvc3QgMiB2ZXh0MyBMSFMsIDwwLDIsMCwyPgorICAyNjg1NjMyNjg0VSwJLy8gPDMsMCwyLDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MCwyLDEsMT4KKyAgMjY4NTYzMjY5MlUsCS8vIDwzLDAsMiwyPjogQ29zdCAzIHZleHQzIExIUywgPDAsMiwyLDA+CisgIDI2ODU2MzI3MDJVLAkvLyA8MywwLDIsMz46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLDIsMywxPgorICAxNjExODkwODkyVSwJLy8gPDMsMCwyLDQ+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MCwyLDQsNj4KKyAgMjczMjk2NjEwMlUsCS8vIDwzLDAsMiw1PjogQ29zdCAzIHZleHQzIExIUywgPDAsMiw1LDc+CisgIDI2MjQ3Njc5MzBVLAkvLyA8MywwLDIsNj46IENvc3QgMyB2ZXh0MiA8MSwyLDMsMD4sIDwyLDYsMyw3PgorICAyNjg1NjMyNzQ0VSwJLy8gPDMsMCwyLDc+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MCwyLDcsNz4KKyAgMTYxMTg5MDkyNFUsCS8vIDwzLDAsMix1PjogQ29zdCAyIHZleHQzIExIUywgPDAsMix1LDI+CisgIDI2MjQ3NjgxNTBVLAkvLyA8MywwLDMsMD46IENvc3QgMyB2ZXh0MiA8MSwyLDMsMD4sIDwzLDAsMSwyPgorICAyNjg1NjMyNzY0VSwJLy8gPDMsMCwzLDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MCwzLDEsMD4KKyAgMjY4NTYzMjc3NFUsCS8vIDwzLDAsMywyPjogQ29zdCAzIHZleHQzIExIUywgPDAsMywyLDE+CisgIDI2MjQ3Njg0MTJVLAkvLyA8MywwLDMsMz46IENvc3QgMyB2ZXh0MiA8MSwyLDMsMD4sIDwzLDMsMywzPgorICAyNjI0NzY4NTE0VSwJLy8gPDMsMCwzLDQ+OiBDb3N0IDMgdmV4dDIgPDEsMiwzLDA+LCA8Myw0LDUsNj4KKyAgMzcwMjQ5MTcxNFUsCS8vIDwzLDAsMyw1PjogQ29zdCA0IHZleHQyIDwxLHUsMywwPiwgPDMsNSwzLDc+CisgIDI2MjQ3Njg2MzJVLAkvLyA8MywwLDMsNj46IENvc3QgMyB2ZXh0MiA8MSwyLDMsMD4sIDwzLDYsMCw3PgorICAzNzAyNDkxODQzVSwJLy8gPDMsMCwzLDc+OiBDb3N0IDQgdmV4dDIgPDEsdSwzLDA+LCA8Myw3LDAsMT4KKyAgMjY4Njk1OTkzNFUsCS8vIDwzLDAsMyx1PjogQ29zdCAzIHZleHQzIDwwLDMsdSwzPiwgPDAsMyx1LDM+CisgIDI2ODk4MzUzMzZVLAkvLyA8MywwLDQsMD46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLDQsMCw0PgorICAxNjExODkxMDI2VSwJLy8gPDMsMCw0LDE+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MCw0LDEsNT4KKyAgMTYxMTg5MTAzNlUsCS8vIDwzLDAsNCwyPjogQ29zdCAyIHZleHQzIExIUywgPDAsNCwyLDY+CisgIDM3NjM1NzcxODRVLAkvLyA8MywwLDQsMz46IENvc3QgNCB2ZXh0MyBMSFMsIDwwLDQsMywxPgorICAyNjg5ODM1Mzc0VSwJLy8gPDMsMCw0LDQ+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MCw0LDQsNj4KKyAgMTU1MTAyNzUxMFUsCS8vIDwzLDAsNCw1PjogQ29zdCAyIHZleHQyIDwxLDIsMywwPiwgUkhTCisgIDI2NjY1NzMxNzJVLAkvLyA8MywwLDQsNj46IENvc3QgMyB2ZXh0MiA8dSwyLDMsMD4sIDw0LDYsNCw2PgorICAzNjY3NzExMjA2VSwJLy8gPDMsMCw0LDc+OiBDb3N0IDQgdmV4dDEgPDcsMywwLDQ+LCA8NywzLDAsND4KKyAgMTYxNjA5MzU4NlUsCS8vIDwzLDAsNCx1PjogQ29zdCAyIHZleHQzIExIUywgPDAsNCx1LDY+CisgIDI2ODUxOTA1NTZVLAkvLyA8MywwLDUsMD46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLDUsMCw3PgorICAyNjY2NTczNTIwVSwJLy8gPDMsMCw1LDE+OiBDb3N0IDMgdmV4dDIgPHUsMiwzLDA+LCA8NSwxLDcsMz4KKyAgMzA0MDg4Njg4NlUsCS8vIDwzLDAsNSwyPjogQ29zdCAzIHZ0cm5sIDwzLDQsNSw2PiwgTEhTCisgIDM2MjU5MTI4MzRVLAkvLyA8MywwLDUsMz46IENvc3QgNCB2ZXh0MSA8MCwzLDAsNT4sIDwzLDQsNSw2PgorICAyNjY2NTczNzY2VSwJLy8gPDMsMCw1LDQ+OiBDb3N0IDMgdmV4dDIgPHUsMiwzLDA+LCA8NSw0LDcsNj4KKyAgMjY2NjU3MzgyOFUsCS8vIDwzLDAsNSw1PjogQ29zdCAzIHZleHQyIDx1LDIsMywwPiwgPDUsNSw1LDU+CisgIDI3MzI5NjYzNTRVLAkvLyA8MywwLDUsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLDUsNiw3PgorICAyNjY2NTczOTkyVSwJLy8gPDMsMCw1LDc+OiBDb3N0IDMgdmV4dDIgPHUsMiwzLDA+LCA8NSw3LDUsNz4KKyAgMzA0MDg4Njk0MFUsCS8vIDwzLDAsNSx1PjogQ29zdCAzIHZ0cm5sIDwzLDQsNSw2PiwgTEhTCisgIDI2ODUxOTA2MzdVLAkvLyA8MywwLDYsMD46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLDYsMCw3PgorICAyNzMyOTY2MzkwVSwJLy8gPDMsMCw2LDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MCw2LDEsNz4KKyAgMjY4OTgzNTUxOVUsCS8vIDwzLDAsNiwyPjogQ29zdCAzIHZleHQzIExIUywgPDAsNiwyLDc+CisgIDM2Njc3MjQ0MzhVLAkvLyA8MywwLDYsMz46IENvc3QgNCB2ZXh0MSA8NywzLDAsNj4sIDwzLDAsMSwyPgorICAzNzYzNTc3MzU1VSwJLy8gPDMsMCw2LDQ+OiBDb3N0IDQgdmV4dDMgTEhTLCA8MCw2LDQsMT4KKyAgMzgwNjcwODI0M1UsCS8vIDwzLDAsNiw1PjogQ29zdCA0IHZleHQzIExIUywgPDAsNiw1LDA+CisgIDI2NjY1NzQ2NDhVLAkvLyA8MywwLDYsNj46IENvc3QgMyB2ZXh0MiA8dSwyLDMsMD4sIDw2LDYsNiw2PgorICAyNjU3OTQ4NTIwVSwJLy8gPDMsMCw2LDc+OiBDb3N0IDMgdmV4dDIgPDYsNywzLDA+LCA8Niw3LDMsMD4KKyAgMjY4OTgzNTU3M1UsCS8vIDwzLDAsNix1PjogQ29zdCAzIHZleHQzIExIUywgPDAsNix1LDc+CisgIDI2NjY1NzQ4NDJVLAkvLyA8MywwLDcsMD46IENvc3QgMyB2ZXh0MiA8dSwyLDMsMD4sIDw3LDAsMSwyPgorICAyNjg1NjMzMDk1VSwJLy8gPDMsMCw3LDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MCw3LDEsNz4KKyAgMjY2MDYwMzA1MlUsCS8vIDwzLDAsNywyPjogQ29zdCAzIHZleHQyIDw3LDIsMywwPiwgPDcsMiwzLDA+CisgIDM2NDM4NDQ5OTdVLAkvLyA8MywwLDcsMz46IENvc3QgNCB2ZXh0MSA8MywzLDAsNz4sIDwzLDMsMCw3PgorICAyNjY2NTc1MjA2VSwJLy8gPDMsMCw3LDQ+OiBDb3N0IDMgdmV4dDIgPHUsMiwzLDA+LCA8Nyw0LDUsNj4KKyAgMzY1NTc5MDM5MVUsCS8vIDwzLDAsNyw1PjogQ29zdCA0IHZleHQxIDw1LDMsMCw3PiwgPDUsMywwLDc+CisgIDM3MzE2OTA5NjhVLAkvLyA8MywwLDcsNj46IENvc3QgNCB2ZXh0MiA8Niw3LDMsMD4sIDw3LDYsMCwzPgorICAyNjY2NTc1NDY4VSwJLy8gPDMsMCw3LDc+OiBDb3N0IDMgdmV4dDIgPHUsMiwzLDA+LCA8Nyw3LDcsNz4KKyAgMjY2NDU4NDg1MFUsCS8vIDwzLDAsNyx1PjogQ29zdCAzIHZleHQyIDw3LHUsMywwPiwgPDcsdSwzLDA+CisgIDE2MTYwOTM4MzRVLAkvLyA8MywwLHUsMD46IENvc3QgMiB2ZXh0MyBMSFMsIDwwLHUsMCwyPgorICAxNjExODkxMzQ2VSwJLy8gPDMsMCx1LDE+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MCx1LDEsMT4KKyAgNTM3NzA3MTY1VSwJLy8gPDMsMCx1LDI+OiBDb3N0IDEgdmV4dDMgTEhTLCBMSFMKKyAgMjY4OTgzNTY4NFUsCS8vIDwzLDAsdSwzPjogQ29zdCAzIHZleHQzIExIUywgPDAsdSwzLDE+CisgIDE2MTYwOTM4NzRVLAkvLyA8MywwLHUsND46IENvc3QgMiB2ZXh0MyBMSFMsIDwwLHUsNCw2PgorICAxNTUxMDMwNDI2VSwJLy8gPDMsMCx1LDU+OiBDb3N0IDIgdmV4dDIgPDEsMiwzLDA+LCBSSFMKKyAgMjYyNDc3MjMwNFUsCS8vIDwzLDAsdSw2PjogQ29zdCAzIHZleHQyIDwxLDIsMywwPiwgPHUsNiwzLDc+CisgIDI1OTQwMDIxNTRVLAkvLyA8MywwLHUsNz46IENvc3QgMyB2ZXh0MSA8NywzLDAsdT4sIDw3LDMsMCx1PgorICA1Mzc3MDcyMTlVLAkvLyA8MywwLHUsdT46IENvc3QgMSB2ZXh0MyBMSFMsIExIUworICAyNTUyMjAxMzE4VSwJLy8gPDMsMSwwLDA+OiBDb3N0IDMgdmV4dDEgPDAsMywxLDA+LCBMSFMKKyAgMjYxODgwMjI3OFUsCS8vIDwzLDEsMCwxPjogQ29zdCAzIHZleHQyIDwwLDIsMywxPiwgTEhTCisgIDI2MTg4MDIzNjZVLAkvLyA8MywxLDAsMj46IENvc3QgMyB2ZXh0MiA8MCwyLDMsMT4sIDwwLDIsMywxPgorICAxNjExNDQ5MDc4VSwJLy8gPDMsMSwwLDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MSwwLDMsMj4KKyAgMjU1MjIwNDU5OFUsCS8vIDwzLDEsMCw0PjogQ29zdCAzIHZleHQxIDwwLDMsMSwwPiwgUkhTCisgIDI3MzI5NjY2NjNVLAkvLyA8MywxLDAsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDAsNSwxPgorICAzOTA2MjU4Mzk2VSwJLy8gPDMsMSwwLDY+OiBDb3N0IDQgdnV6cHIgPDIsMywwLDE+LCA8MiwwLDQsNj4KKyAgMzY2Nzc1MjE3MVUsCS8vIDwzLDEsMCw3PjogQ29zdCA0IHZleHQxIDw3LDMsMSwwPiwgPDcsMywxLDA+CisgIDE2MTE4OTE0OTFVLAkvLyA8MywxLDAsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwxLDAsdSwyPgorICAyNjg5ODM1ODE5VSwJLy8gPDMsMSwxLDA+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MSwxLDAsMT4KKyAgMTYxMTQ0OTE0MFUsCS8vIDwzLDEsMSwxPjogQ29zdCAyIHZleHQzIExIUywgPDEsMSwxLDE+CisgIDI2MjQ3NzUwNjNVLAkvLyA8MywxLDEsMj46IENvc3QgMyB2ZXh0MiA8MSwyLDMsMT4sIDwxLDIsMywxPgorICAxNjExODkxNTI4VSwJLy8gPDMsMSwxLDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MSwxLDMsMz4KKyAgMjY4OTgzNTg1OVUsCS8vIDwzLDEsMSw0PjogQ29zdCAzIHZleHQzIExIUywgPDEsMSw0LDU+CisgIDI2ODk4MzU4NjhVLAkvLyA8MywxLDEsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDEsNSw1PgorICAzNzYzNTc3NzAxVSwJLy8gPDMsMSwxLDY+OiBDb3N0IDQgdmV4dDMgTEhTLCA8MSwxLDYsNT4KKyAgMzc2NTI3MzQ1MlUsCS8vIDwzLDEsMSw3PjogQ29zdCA0IHZleHQzIDwxLDEsNywzPiwgPDEsMSw3LDM+CisgIDE2MTE4OTE1NzNVLAkvLyA8MywxLDEsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwxLDEsdSwzPgorICAyNjI5NDIwNDk0VSwJLy8gPDMsMSwyLDA+OiBDb3N0IDMgdmV4dDIgPDIsMCwzLDE+LCA8MiwwLDMsMT4KKyAgMjY4OTgzNTkxMVUsCS8vIDwzLDEsMiwxPjogQ29zdCAzIHZleHQzIExIUywgPDEsMiwxLDM+CisgIDI1NjQxNjMyNDhVLAkvLyA8MywxLDIsMj46IENvc3QgMyB2ZXh0MSA8MiwzLDEsMj4sIDwyLDMsMSwyPgorICAxNjExNDQ5MjM4VSwJLy8gPDMsMSwyLDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MSwyLDMsMD4KKyAgMjU2NDE2NDkxOFUsCS8vIDwzLDEsMiw0PjogQ29zdCAzIHZleHQxIDwyLDMsMSwyPiwgUkhTCisgIDI2ODk4MzU5NDdVLAkvLyA8MywxLDIsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDIsNSwzPgorICAzNjkyNTQ1OTc4VSwJLy8gPDMsMSwyLDY+OiBDb3N0IDQgdmV4dDIgPDAsMiwzLDE+LCA8Miw2LDMsNz4KKyAgMjczMjk2Njg0MlUsCS8vIDwzLDEsMiw3PjogQ29zdCAzIHZleHQzIExIUywgPDEsMiw3LDA+CisgIDE2MTE4OTE2NTFVLAkvLyA8MywxLDIsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwxLDIsdSwwPgorICAxNDg0NDU2MDM4VSwJLy8gPDMsMSwzLDA+OiBDb3N0IDIgdmV4dDEgPDEsMywxLDM+LCBMSFMKKyAgMTYxMTg5MTY3MlUsCS8vIDwzLDEsMywxPjogQ29zdCAyIHZleHQzIExIUywgPDEsMywxLDM+CisgIDI2ODU2MzM1MDJVLAkvLyA8MywxLDMsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDMsMiwwPgorICAyNjg1NjMzNTEyVSwJLy8gPDMsMSwzLDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MSwzLDMsMT4KKyAgMTQ4NDQ1OTMxOFUsCS8vIDwzLDEsMyw0PjogQ29zdCAyIHZleHQxIDwxLDMsMSwzPiwgUkhTCisgIDE2MTE4OTE3MTJVLAkvLyA8MywxLDMsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDwxLDMsNSw3PgorICAyNjg5ODM2MDQxVSwJLy8gPDMsMSwzLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MSwzLDYsNz4KKyAgMjczMzQwOTI5NFUsCS8vIDwzLDEsMyw3PjogQ29zdCAzIHZleHQzIExIUywgPDEsMyw3LDM+CisgIDE2MTE4OTE3MzVVLAkvLyA8MywxLDMsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwxLDMsdSwzPgorICAyNTUyMjM0MDg2VSwJLy8gPDMsMSw0LDA+OiBDb3N0IDMgdmV4dDEgPDAsMywxLDQ+LCBMSFMKKyAgMjczMjk2Njk1NVUsCS8vIDwzLDEsNCwxPjogQ29zdCAzIHZleHQzIExIUywgPDEsNCwxLDU+CisgIDI3MzI5NjY5NjRVLAkvLyA8MywxLDQsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDQsMiw1PgorICAyNjg1NjMzNTk3VSwJLy8gPDMsMSw0LDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MSw0LDMsNT4KKyAgMjU1MjIzNzM2NlUsCS8vIDwzLDEsNCw0PjogQ29zdCAzIHZleHQxIDwwLDMsMSw0PiwgUkhTCisgIDI2MTg4MDU1NThVLAkvLyA8MywxLDQsNT46IENvc3QgMyB2ZXh0MiA8MCwyLDMsMT4sIFJIUworICAyNzY5NDcyODIyVSwJLy8gPDMsMSw0LDY+OiBDb3N0IDMgdnV6cGwgPDMsMCwxLDI+LCBSSFMKKyAgMzY2Nzc4NDk0M1UsCS8vIDwzLDEsNCw3PjogQ29zdCA0IHZleHQxIDw3LDMsMSw0PiwgPDcsMywxLDQ+CisgIDI2ODU2MzM2NDJVLAkvLyA8MywxLDQsdT46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDQsdSw1PgorICAyNjg5ODM2MTQzVSwJLy8gPDMsMSw1LDA+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MSw1LDAsMT4KKyAgMjU2NDE4NzI4MFUsCS8vIDwzLDEsNSwxPjogQ29zdCAzIHZleHQxIDwyLDMsMSw1PiwgPDEsNSwzLDc+CisgIDI1NjQxODc4MjdVLAkvLyA8MywxLDUsMj46IENvc3QgMyB2ZXh0MSA8MiwzLDEsNT4sIDwyLDMsMSw1PgorICAxNjExODkxODU2VSwJLy8gPDMsMSw1LDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MSw1LDMsNz4KKyAgMjY4OTgzNjE4M1UsCS8vIDwzLDEsNSw0PjogQ29zdCAzIHZleHQzIExIUywgPDEsNSw0LDU+CisgIDM3NTkzNzU1MjJVLAkvLyA8MywxLDUsNT46IENvc3QgNCB2ZXh0MyBMSFMsIDwxLDUsNSw3PgorICAzNzIwNDE3Mzc4VSwJLy8gPDMsMSw1LDY+OiBDb3N0IDQgdmV4dDIgPDQsdSwzLDE+LCA8NSw2LDcsMD4KKyAgMjgzMjUxODQ1NFUsCS8vIDwzLDEsNSw3PjogQ29zdCAzIHZ1enByIDwyLDMsMCwxPiwgUkhTCisgIDE2MTE4OTE5MDFVLAkvLyA8MywxLDUsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwxLDUsdSw3PgorICAzNzYzNTc4MDQ4VSwJLy8gPDMsMSw2LDA+OiBDb3N0IDQgdmV4dDMgTEhTLCA8MSw2LDAsMT4KKyAgMjY4OTgzNjIzOVUsCS8vIDwzLDEsNiwxPjogQ29zdCAzIHZleHQzIExIUywgPDEsNiwxLDc+CisgIDI3MzI5NjcxMjhVLAkvLyA8MywxLDYsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDYsMiw3PgorICAyNjg1NjMzNzYxVSwJLy8gPDMsMSw2LDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MSw2LDMsNz4KKyAgMzc2MzU3ODA4OFUsCS8vIDwzLDEsNiw0PjogQ29zdCA0IHZleHQzIExIUywgPDEsNiw0LDU+CisgIDI2ODk4MzYyNzVVLAkvLyA8MywxLDYsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDYsNSw3PgorICAzNzYzNTc4MTA4VSwJLy8gPDMsMSw2LDY+OiBDb3N0IDQgdmV4dDMgTEhTLCA8MSw2LDYsNz4KKyAgMjczMjk2NzE2NlUsCS8vIDwzLDEsNiw3PjogQ29zdCAzIHZleHQzIExIUywgPDEsNiw3LDA+CisgIDI2ODU2MzM4MDZVLAkvLyA8MywxLDYsdT46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDYsdSw3PgorICAzNjMxOTcyNDU0VSwJLy8gPDMsMSw3LDA+OiBDb3N0IDQgdmV4dDEgPDEsMywxLDc+LCBMSFMKKyAgMjY1OTk0NzYxMlUsCS8vIDwzLDEsNywxPjogQ29zdCAzIHZleHQyIDw3LDEsMywxPiwgPDcsMSwzLDE+CisgIDQwMzYxMDIyOTRVLAkvLyA8MywxLDcsMj46IENvc3QgNCB2emlwciA8MSw1LDMsNz4sIDwzLDAsMSwyPgorICAzMDk1Mzk2NDU0VSwJLy8gPDMsMSw3LDM+OiBDb3N0IDMgdnRybnIgPDEsMyw1LDc+LCBMSFMKKyAgMzYzMTk3NTczNFUsCS8vIDwzLDEsNyw0PjogQ29zdCA0IHZleHQxIDwxLDMsMSw3PiwgUkhTCisgIDIyMjI5ODIxNDRVLAkvLyA8MywxLDcsNT46IENvc3QgMyB2cmV2IDwxLDMsNSw3PgorICAzMjk2Nzk3NzA1VSwJLy8gPDMsMSw3LDY+OiBDb3N0IDQgdnJldiA8MSwzLDYsNz4KKyAgMzcyMDQxODkyNFUsCS8vIDwzLDEsNyw3PjogQ29zdCA0IHZleHQyIDw0LHUsMywxPiwgPDcsNyw3LDc+CisgIDMwOTUzOTY0NTlVLAkvLyA8MywxLDcsdT46IENvc3QgMyB2dHJuciA8MSwzLDUsNz4sIExIUworICAxNDg0NDk2OTk4VSwJLy8gPDMsMSx1LDA+OiBDb3N0IDIgdmV4dDEgPDEsMywxLHU+LCBMSFMKKyAgMTYxMTg5MjA3N1UsCS8vIDwzLDEsdSwxPjogQ29zdCAyIHZleHQzIExIUywgPDEsdSwxLDM+CisgIDI2ODU2MzM5MDdVLAkvLyA8MywxLHUsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLHUsMiwwPgorICAxNjExODkyMDkyVSwJLy8gPDMsMSx1LDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MSx1LDMsMD4KKyAgMTQ4NDUwMDI3OFUsCS8vIDwzLDEsdSw0PjogQ29zdCAyIHZleHQxIDwxLDMsMSx1PiwgUkhTCisgIDE2MTE4OTIxMTdVLAkvLyA8MywxLHUsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDwxLHUsNSw3PgorICAyNjg1NjMzOTUwVSwJLy8gPDMsMSx1LDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MSx1LDYsNz4KKyAgMjgzMjUxODY5N1UsCS8vIDwzLDEsdSw3PjogQ29zdCAzIHZ1enByIDwyLDMsMCwxPiwgUkhTCisgIDE2MTE4OTIxNDBVLAkvLyA8MywxLHUsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwxLHUsdSwzPgorICAyNjIzNDU1MjMyVSwJLy8gPDMsMiwwLDA+OiBDb3N0IDMgdmV4dDIgPDEsMCwzLDI+LCA8MCwwLDAsMD4KKyAgMTU0OTcxMzUxMFUsCS8vIDwzLDIsMCwxPjogQ29zdCAyIHZleHQyIDwxLDAsMywyPiwgTEhTCisgIDI2ODk4MzY0ODRVLAkvLyA8MywyLDAsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDAsMiwwPgorICAyNjg1NjMzOTk3VSwJLy8gPDMsMiwwLDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwwLDMsMD4KKyAgMjYyMzQ1NTU3MFUsCS8vIDwzLDIsMCw0PjogQ29zdCAzIHZleHQyIDwxLDAsMywyPiwgPDAsNCwxLDU+CisgIDI3MzI5NjczOThVLAkvLyA8MywyLDAsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDAsNSw3PgorICAyNjg5ODM2NTI0VSwJLy8gPDMsMiwwLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwwLDYsND4KKyAgMjIyOTA0NDk2NFUsCS8vIDwzLDIsMCw3PjogQ29zdCAzIHZyZXYgPDIsMyw3LDA+CisgIDE1NDk3MTQwNzdVLAkvLyA8MywyLDAsdT46IENvc3QgMiB2ZXh0MiA8MSwwLDMsMj4sIExIUworICAxNTQ5NzE0MTY2VSwJLy8gPDMsMiwxLDA+OiBDb3N0IDIgdmV4dDIgPDEsMCwzLDI+LCA8MSwwLDMsMj4KKyAgMjYyMzQ1NjA1MlUsCS8vIDwzLDIsMSwxPjogQ29zdCAzIHZleHQyIDwxLDAsMywyPiwgPDEsMSwxLDE+CisgIDI2MjM0NTYxNTBVLAkvLyA8MywyLDEsMj46IENvc3QgMyB2ZXh0MiA8MSwwLDMsMj4sIDwxLDIsMywwPgorICAyNjg1NjM0MDc5VSwJLy8gPDMsMiwxLDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwxLDMsMT4KKyAgMjU1MjI4NjUxOFUsCS8vIDwzLDIsMSw0PjogQ29zdCAzIHZleHQxIDwwLDMsMiwxPiwgUkhTCisgIDI2MjM0NTY0MDBVLAkvLyA8MywyLDEsNT46IENvc3QgMyB2ZXh0MiA8MSwwLDMsMj4sIDwxLDUsMyw3PgorICAyNjg5ODM2NjA0VSwJLy8gPDMsMiwxLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwxLDYsMz4KKyAgMzY2NzgzNDEwMVUsCS8vIDwzLDIsMSw3PjogQ29zdCA0IHZleHQxIDw3LDMsMiwxPiwgPDcsMywyLDE+CisgIDExNTUzODUwNzBVLAkvLyA8MywyLDEsdT46IENvc3QgMiB2cmV2IDwyLDMsdSwxPgorICAyNjg5ODM2NjI5VSwJLy8gPDMsMiwyLDA+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwyLDAsMT4KKyAgMjY4OTgzNjY0MFUsCS8vIDwzLDIsMiwxPjogQ29zdCAzIHZleHQzIExIUywgPDIsMiwxLDM+CisgIDE2MTE0NDk5NjBVLAkvLyA8MywyLDIsMj46IENvc3QgMiB2ZXh0MyBMSFMsIDwyLDIsMiwyPgorICAxNjExODkyMzM4VSwJLy8gPDMsMiwyLDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MiwyLDMsMz4KKyAgMjY4OTgzNjY2OVUsCS8vIDwzLDIsMiw0PjogQ29zdCAzIHZleHQzIExIUywgPDIsMiw0LDU+CisgIDI2ODk4MzY2ODBVLAkvLyA8MywyLDIsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDIsNSw3PgorICAyNjg5ODM2Njg4VSwJLy8gPDMsMiwyLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwyLDYsNj4KKyAgMzc2MzU3ODUxOFUsCS8vIDwzLDIsMiw3PjogQ29zdCA0IHZleHQzIExIUywgPDIsMiw3LDM+CisgIDE2MTE4OTIzODNVLAkvLyA8MywyLDIsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwyLDIsdSwzPgorICAxNjExNDUwMDIyVSwJLy8gPDMsMiwzLDA+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MiwzLDAsMT4KKyAgMjY4NTE5MTg1NFUsCS8vIDwzLDIsMywxPjogQ29zdCAzIHZleHQzIExIUywgPDIsMywxLDA+CisgIDI2ODUxOTE4NjVVLAkvLyA8MywyLDMsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDMsMiwyPgorICAyNjg1MTkxODc1VSwJLy8gPDMsMiwzLDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwzLDMsMz4KKyAgMTYxMTQ1MDA2MlUsCS8vIDwzLDIsMyw0PjogQ29zdCAyIHZleHQzIExIUywgPDIsMyw0LDU+CisgIDI3MzI5Njc2MzVVLAkvLyA8MywyLDMsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDMsNSwxPgorICAyNzMyOTY3NjQ1VSwJLy8gPDMsMiwzLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwzLDYsMj4KKyAgMjczMjk2NzY1MlUsCS8vIDwzLDIsMyw3PjogQ29zdCAzIHZleHQzIExIUywgPDIsMyw3LDA+CisgIDE2MTE0NTAwOTRVLAkvLyA8MywyLDMsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwyLDMsdSwxPgorICAyNTU4Mjc5NzgyVSwJLy8gPDMsMiw0LDA+OiBDb3N0IDMgdmV4dDEgPDEsMywyLDQ+LCBMSFMKKyAgMjU1ODI4MDYwMlUsCS8vIDwzLDIsNCwxPjogQ29zdCAzIHZleHQxIDwxLDMsMiw0PiwgPDEsMiwzLDQ+CisgIDI3MzI5Njc2OTJVLAkvLyA8MywyLDQsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDQsMiw0PgorICAyNjg1NjM0MzI2VSwJLy8gPDMsMiw0LDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw0LDMsNT4KKyAgMjU1ODI4MzA2MlUsCS8vIDwzLDIsNCw0PjogQ29zdCAzIHZleHQxIDwxLDMsMiw0PiwgUkhTCisgIDE1NDk3MTY3OTBVLAkvLyA8MywyLDQsNT46IENvc3QgMiB2ZXh0MiA8MSwwLDMsMj4sIFJIUworICAyNjg5ODM2ODQ0VSwJLy8gPDMsMiw0LDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw0LDYsMD4KKyAgMjIyOTA3NzczNlUsCS8vIDwzLDIsNCw3PjogQ29zdCAzIHZyZXYgPDIsMyw3LDQ+CisgIDE1NDk3MTcwMzNVLAkvLyA8MywyLDQsdT46IENvc3QgMiB2ZXh0MiA8MSwwLDMsMj4sIFJIUworICAyNTUyMzE2MDA2VSwJLy8gPDMsMiw1LDA+OiBDb3N0IDMgdmV4dDEgPDAsMywyLDU+LCBMSFMKKyAgMjIyODY0MzUwN1UsCS8vIDwzLDIsNSwxPjogQ29zdCAzIHZyZXYgPDIsMywxLDU+CisgIDI2ODk4MzY4OTZVLAkvLyA8MywyLDUsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDUsMiw3PgorICAyNjg1NjM0NDA4VSwJLy8gPDMsMiw1LDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw1LDMsNj4KKyAgMTE1NTEyMjg5NFUsCS8vIDwzLDIsNSw0PjogQ29zdCAyIHZyZXYgPDIsMyw0LDU+CisgIDI2NjUyNjMxMDhVLAkvLyA8MywyLDUsNT46IENvc3QgMyB2ZXh0MiA8dSwwLDMsMj4sIDw1LDUsNSw1PgorICAyNjg5ODM2OTMyVSwJLy8gPDMsMiw1LDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw1LDYsNz4KKyAgMjY2NTI2MzI3MlUsCS8vIDwzLDIsNSw3PjogQ29zdCAzIHZleHQyIDx1LDAsMywyPiwgPDUsNyw1LDc+CisgIDExNTU0MTc4NDJVLAkvLyA8MywyLDUsdT46IENvc3QgMiB2cmV2IDwyLDMsdSw1PgorICAyNjg5ODM2OTUzVSwJLy8gPDMsMiw2LDA+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw2LDAsMT4KKyAgMjY4OTgzNjk2NFUsCS8vIDwzLDIsNiwxPjogQ29zdCAzIHZleHQzIExIUywgPDIsNiwxLDM+CisgIDI2ODk4MzY5NzZVLAkvLyA8MywyLDYsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDYsMiw2PgorICAxNjExODkyNjY2VSwJLy8gPDMsMiw2LDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8Miw2LDMsNz4KKyAgMjY4OTgzNjk5M1UsCS8vIDwzLDIsNiw0PjogQ29zdCAzIHZleHQzIExIUywgPDIsNiw0LDU+CisgIDI2ODk4MzcwMDRVLAkvLyA8MywyLDYsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDYsNSw3PgorICAyNjg5ODM3MDEzVSwJLy8gPDMsMiw2LDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw2LDYsNz4KKyAgMjY2NTI2Mzk1MFUsCS8vIDwzLDIsNiw3PjogQ29zdCAzIHZleHQyIDx1LDAsMywyPiwgPDYsNywwLDE+CisgIDE2MTE4OTI3MTFVLAkvLyA8MywyLDYsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwyLDYsdSw3PgorICAyNjY1MjY0MTIyVSwJLy8gPDMsMiw3LDA+OiBDb3N0IDMgdmV4dDIgPHUsMCwzLDI+LCA8NywwLDEsMj4KKyAgMjYyMzQ2MDQxOVUsCS8vIDwzLDIsNywxPjogQ29zdCAzIHZleHQyIDwxLDAsMywyPiwgPDcsMSwwLDM+CisgIDQxNjkxMzgzNDBVLAkvLyA8MywyLDcsMj46IENvc3QgNCB2dHJuciA8MSwzLDUsNz4sIDwwLDIsMCwyPgorICAyOTYyMzU4Mzc0VSwJLy8gPDMsMiw3LDM+OiBDb3N0IDMgdnppcHIgPDEsNSwzLDc+LCBMSFMKKyAgMjY2NTI2NDQ4NlUsCS8vIDwzLDIsNyw0PjogQ29zdCAzIHZleHQyIDx1LDAsMywyPiwgPDcsNCw1LDY+CisgIDIyMjg5NTQ4NDFVLAkvLyA8MywyLDcsNT46IENvc3QgMyB2cmV2IDwyLDMsNSw3PgorICAyMjI5MDI4NTc4VSwJLy8gPDMsMiw3LDY+OiBDb3N0IDMgdnJldiA8MiwzLDYsNz4KKyAgMjY2NTI2NDc0OFUsCS8vIDwzLDIsNyw3PjogQ29zdCAzIHZleHQyIDx1LDAsMywyPiwgPDcsNyw3LDc+CisgIDI5NjIzNTgzNzlVLAkvLyA8MywyLDcsdT46IENvc3QgMyB2emlwciA8MSw1LDMsNz4sIExIUworICAxNjExODkyNzk1VSwJLy8gPDMsMix1LDA+OiBDb3N0IDIgdmV4dDMgTEhTLCA8Mix1LDAsMT4KKyAgMTU0OTcxOTM0MlUsCS8vIDwzLDIsdSwxPjogQ29zdCAyIHZleHQyIDwxLDAsMywyPiwgTEhTCisgIDE2MTE0NDk5NjBVLAkvLyA8MywyLHUsMj46IENvc3QgMiB2ZXh0MyBMSFMsIDwyLDIsMiwyPgorICAxNjExODkyODI0VSwJLy8gPDMsMix1LDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8Mix1LDMsMz4KKyAgMTYxMTg5MjgzNVUsCS8vIDwzLDIsdSw0PjogQ29zdCAyIHZleHQzIExIUywgPDIsdSw0LDU+CisgIDE1NDk3MTk3MDZVLAkvLyA8MywyLHUsNT46IENvc3QgMiB2ZXh0MiA8MSwwLDMsMj4sIFJIUworICAyNjg5ODM3MTY4VSwJLy8gPDMsMix1LDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Mix1LDYsMD4KKyAgMjY2NTI2NTQwOFUsCS8vIDwzLDIsdSw3PjogQ29zdCAzIHZleHQyIDx1LDAsMywyPiwgPHUsNywwLDE+CisgIDE2MTE4OTI4NjdVLAkvLyA8MywyLHUsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwyLHUsdSwxPgorICAyNjg1MTkyMzMxVSwJLy8gPDMsMywwLDA+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MywwLDAsMD4KKyAgMTYxMTQ1MDUxOFUsCS8vIDwzLDMsMCwxPjogQ29zdCAyIHZleHQzIExIUywgPDMsMCwxLDI+CisgIDI2ODU2MzQ3MTdVLAkvLyA8MywzLDAsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwzLDAsMiwwPgorICAyNTY0Mjk0ODA2VSwJLy8gPDMsMywwLDM+OiBDb3N0IDMgdmV4dDEgPDIsMywzLDA+LCA8MywwLDEsMj4KKyAgMjY4NTYzNDczNlUsCS8vIDwzLDMsMCw0PjogQ29zdCAzIHZleHQzIExIUywgPDMsMCw0LDE+CisgIDI3MzI5NjgxMjJVLAkvLyA8MywzLDAsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwzLDAsNSwyPgorICAzNzYzNTc5MDc1VSwJLy8gPDMsMywwLDY+OiBDb3N0IDQgdmV4dDMgTEhTLCA8MywwLDYsMj4KKyAgNDAzNDA1MzI2NFUsCS8vIDwzLDMsMCw3PjogQ29zdCA0IHZ6aXByIDwxLDIsMywwPiwgPDEsNSwzLDc+CisgIDE2MTE0NTA1ODFVLAkvLyA8MywzLDAsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwzLDAsdSwyPgorICAyNjg1MTkyNDE1VSwJLy8gPDMsMywxLDA+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MywxLDAsMz4KKyAgMTU1MDM4NTk5MlUsCS8vIDwzLDMsMSwxPjogQ29zdCAyIHZleHQyIDwxLDEsMywzPiwgPDEsMSwzLDM+CisgIDI2ODUxOTI0MzNVLAkvLyA8MywzLDEsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwzLDEsMiwzPgorICAyNjg1NjM0ODA4VSwJLy8gPDMsMywxLDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MywxLDMsMT4KKyAgMjU1ODMzMjIxNFUsCS8vIDwzLDMsMSw0PjogQ29zdCAzIHZleHQxIDwxLDMsMywxPiwgUkhTCisgIDI2ODU2MzQ4MjhVLAkvLyA8MywzLDEsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwzLDEsNSwzPgorICAzNzU5Mzc2NjYxVSwJLy8gPDMsMywxLDY+OiBDb3N0IDQgdmV4dDMgTEhTLCA8MywxLDYsMz4KKyAgMjcwMzQ3NzAyMlUsCS8vIDwzLDMsMSw3PjogQ29zdCAzIHZleHQzIDwzLDEsNywzPiwgPDMsMSw3LDM+CisgIDE1NTUwMzE0MjNVLAkvLyA8MywzLDEsdT46IENvc3QgMiB2ZXh0MiA8MSx1LDMsMz4sIDwxLHUsMywzPgorICAyNTY0MzA5MDk0VSwJLy8gPDMsMywyLDA+OiBDb3N0IDMgdmV4dDEgPDIsMywzLDI+LCBMSFMKKyAgMjYzMDEwMDUxM1UsCS8vIDwzLDMsMiwxPjogQ29zdCAzIHZleHQyIDwyLDEsMywzPiwgPDIsMSwzLDM+CisgIDE1NTcwMjIzMjJVLAkvLyA8MywzLDIsMj46IENvc3QgMiB2ZXh0MiA8MiwyLDMsMz4sIDwyLDIsMywzPgorICAyNjg1MTkyNTIwVSwJLy8gPDMsMywyLDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MywyLDMsMD4KKyAgMjU2NDMxMjM3NFUsCS8vIDwzLDMsMiw0PjogQ29zdCAzIHZleHQxIDwyLDMsMywyPiwgUkhTCisgIDI3MzI5NjgyODZVLAkvLyA8MywzLDIsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwzLDIsNSw0PgorICAyNjg1NjM0OTE4VSwJLy8gPDMsMywyLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MywyLDYsMz4KKyAgMjcwNDE0MDY1NVUsCS8vIDwzLDMsMiw3PjogQ29zdCAzIHZleHQzIDwzLDIsNywzPiwgPDMsMiw3LDM+CisgIDE1NjEwMDQxMjBVLAkvLyA8MywzLDIsdT46IENvc3QgMiB2ZXh0MiA8Mix1LDMsMz4sIDwyLHUsMywzPgorICAxNDk2NTQ3NDMwVSwJLy8gPDMsMywzLDA+OiBDb3N0IDIgdmV4dDEgPDMsMywzLDM+LCBMSFMKKyAgMjYyNDEyOTI1NlUsCS8vIDwzLDMsMywxPjogQ29zdCAzIHZleHQyIDwxLDEsMywzPiwgPDMsMSwxLDM+CisgIDI2MzA3NjQ4NjZVLAkvLyA8MywzLDMsMj46IENvc3QgMyB2ZXh0MiA8MiwyLDMsMz4sIDwzLDIsMiwzPgorICAzMzYzODAwMDZVLAkvLyA8MywzLDMsMz46IENvc3QgMSB2ZHVwMyBMSFMKKyAgMTQ5NjU1MDcxMFUsCS8vIDwzLDMsMyw0PjogQ29zdCAyIHZleHQxIDwzLDMsMywzPiwgUkhTCisgIDI3MzI5NjgzNjhVLAkvLyA8MywzLDMsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwzLDMsNSw1PgorICAyNjI0MTI5NjgzVSwJLy8gPDMsMywzLDY+OiBDb3N0IDMgdmV4dDIgPDEsMSwzLDM+LCA8Myw2LDMsNz4KKyAgMjU5NDE4MjQwMFUsCS8vIDwzLDMsMyw3PjogQ29zdCAzIHZleHQxIDw3LDMsMywzPiwgPDcsMywzLDM+CisgIDMzNjM4MDAwNlUsCS8vIDwzLDMsMyx1PjogQ29zdCAxIHZkdXAzIExIUworICAyNTU4MzUzNTEwVSwJLy8gPDMsMyw0LDA+OiBDb3N0IDMgdmV4dDEgPDEsMywzLDQ+LCBMSFMKKyAgMjU1ODM1NDQxMVUsCS8vIDwzLDMsNCwxPjogQ29zdCAzIHZleHQxIDwxLDMsMyw0PiwgPDEsMywzLDQ+CisgIDI1NjQzMjcxMDhVLAkvLyA8MywzLDQsMj46IENvc3QgMyB2ZXh0MSA8MiwzLDMsND4sIDwyLDMsMyw0PgorICAyNTY0MzI3OTM4VSwJLy8gPDMsMyw0LDM+OiBDb3N0IDMgdmV4dDEgPDIsMywzLDQ+LCA8Myw0LDUsNj4KKyAgMjk2MDM0Mzk2MlUsCS8vIDwzLDMsNCw0PjogQ29zdCAzIHZ6aXByIDwxLDIsMyw0PiwgPDEsMiwzLDQ+CisgIDE2MTE4OTMyNTBVLAkvLyA8MywzLDQsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDwzLDQsNSw2PgorICAyNzcxNjE5MTI2VSwJLy8gPDMsMyw0LDY+OiBDb3N0IDMgdnV6cGwgPDMsMywzLDM+LCBSSFMKKyAgNDAzNDA4NjAzMlUsCS8vIDwzLDMsNCw3PjogQ29zdCA0IHZ6aXByIDwxLDIsMyw0PiwgPDEsNSwzLDc+CisgIDE2MTE4OTMyNzdVLAkvLyA8MywzLDQsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwzLDQsdSw2PgorICAyNTU4MzYxNzAyVSwJLy8gPDMsMyw1LDA+OiBDb3N0IDMgdmV4dDEgPDEsMywzLDU+LCBMSFMKKyAgMjU1ODM2MjYwNFUsCS8vIDwzLDMsNSwxPjogQ29zdCAzIHZleHQxIDwxLDMsMyw1PiwgPDEsMywzLDU+CisgIDI1NTgzNjMzNDJVLAkvLyA8MywzLDUsMj46IENvc3QgMyB2ZXh0MSA8MSwzLDMsNT4sIDwyLDMsNCw1PgorICAyNzMyOTY4NTEyVSwJLy8gPDMsMyw1LDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Myw1LDMsNT4KKyAgMjU1ODM2NDk4MlUsCS8vIDwzLDMsNSw0PjogQ29zdCAzIHZleHQxIDwxLDMsMyw1PiwgUkhTCisgIDMxMDEyNzk5NTBVLAkvLyA8MywzLDUsNT46IENvc3QgMyB2dHJuciA8MiwzLDQsNT4sIDwyLDMsNCw1PgorICAyNjY1OTM0OTQ2VSwJLy8gPDMsMyw1LDY+OiBDb3N0IDMgdmV4dDIgPHUsMSwzLDM+LCA8NSw2LDcsMD4KKyAgMjgyNjYzNjU5OFUsCS8vIDwzLDMsNSw3PjogQ29zdCAzIHZ1enByIDwxLDMsMSwzPiwgUkhTCisgIDI4MjY2MzY1OTlVLAkvLyA8MywzLDUsdT46IENvc3QgMyB2dXpwciA8MSwzLDEsMz4sIFJIUworICAyNzMyOTY4NTY4VSwJLy8gPDMsMyw2LDA+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Myw2LDAsNz4KKyAgMzc2MzU3OTUyMVUsCS8vIDwzLDMsNiwxPjogQ29zdCA0IHZleHQzIExIUywgPDMsNiwxLDc+CisgIDI3MzI5Njg1ODZVLAkvLyA8MywzLDYsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwzLDYsMiw3PgorICAyNzMyOTY4NTk1VSwJLy8gPDMsMyw2LDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Myw2LDMsNz4KKyAgMjczMjk2ODYwNFUsCS8vIDwzLDMsNiw0PjogQ29zdCAzIHZleHQzIExIUywgPDMsNiw0LDc+CisgIDM3NjM1Nzk1NTdVLAkvLyA8MywzLDYsNT46IENvc3QgNCB2ZXh0MyBMSFMsIDwzLDYsNSw3PgorICAyNzMyOTY4NjIxVSwJLy8gPDMsMyw2LDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Myw2LDYsNj4KKyAgMjY1Nzk3MzA5OVUsCS8vIDwzLDMsNiw3PjogQ29zdCAzIHZleHQyIDw2LDcsMywzPiwgPDYsNywzLDM+CisgIDI2NTg2MzY3MzJVLAkvLyA8MywzLDYsdT46IENvc3QgMyB2ZXh0MiA8Nix1LDMsMz4sIDw2LHUsMywzPgorICAyNTU4Mzc4MDg2VSwJLy8gPDMsMyw3LDA+OiBDb3N0IDMgdmV4dDEgPDEsMywzLDc+LCBMSFMKKyAgMjU1ODM3ODk5MFUsCS8vIDwzLDMsNywxPjogQ29zdCAzIHZleHQxIDwxLDMsMyw3PiwgPDEsMywzLDc+CisgIDI1NjQzNTE2ODdVLAkvLyA8MywzLDcsMj46IENvc3QgMyB2ZXh0MSA8MiwzLDMsNz4sIDwyLDMsMyw3PgorICAyNjYxMjkxMjY0VSwJLy8gPDMsMyw3LDM+OiBDb3N0IDMgdmV4dDIgPDcsMywzLDM+LCA8NywzLDMsMz4KKyAgMjU1ODM4MTM2NlUsCS8vIDwzLDMsNyw0PjogQ29zdCAzIHZleHQxIDwxLDMsMyw3PiwgUkhTCisgIDI3MzI5Njg2OTRVLAkvLyA8MywzLDcsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwzLDcsNSw3PgorICAzNzgxMTI2OTA3VSwJLy8gPDMsMyw3LDY+OiBDb3N0IDQgdmV4dDMgPDMsNyw2LDM+LCA8Myw3LDYsMz4KKyAgMzA5NTM5NzM3NlUsCS8vIDwzLDMsNyw3PjogQ29zdCAzIHZ0cm5yIDwxLDMsNSw3PiwgPDEsMyw1LDc+CisgIDI1NTgzODM5MThVLAkvLyA8MywzLDcsdT46IENvc3QgMyB2ZXh0MSA8MSwzLDMsNz4sIExIUworICAxNDk2NTQ3NDMwVSwJLy8gPDMsMyx1LDA+OiBDb3N0IDIgdmV4dDEgPDMsMywzLDM+LCBMSFMKKyAgMTYxMTg5MzUzNFUsCS8vIDwzLDMsdSwxPjogQ29zdCAyIHZleHQzIExIUywgPDMsdSwxLDI+CisgIDE1OTI4NTg1MDRVLAkvLyA8MywzLHUsMj46IENvc3QgMiB2ZXh0MiA8dSwyLDMsMz4sIDx1LDIsMywzPgorICAzMzYzODAwMDZVLAkvLyA8MywzLHUsMz46IENvc3QgMSB2ZHVwMyBMSFMKKyAgMTQ5NjU1MDcxMFUsCS8vIDwzLDMsdSw0PjogQ29zdCAyIHZleHQxIDwzLDMsMywzPiwgUkhTCisgIDE2MTE4OTM1NzRVLAkvLyA8MywzLHUsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDwzLHUsNSw2PgorICAyNjkwMjgwMjY4VSwJLy8gPDMsMyx1LDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Myx1LDYsMz4KKyAgMjgyNjYzNjg0MVUsCS8vIDwzLDMsdSw3PjogQ29zdCAzIHZ1enByIDwxLDMsMSwzPiwgUkhTCisgIDMzNjM4MDAwNlUsCS8vIDwzLDMsdSx1PjogQ29zdCAxIHZkdXAzIExIUworICAyNjI0Nzk4NzIwVSwJLy8gPDMsNCwwLDA+OiBDb3N0IDMgdmV4dDIgPDEsMiwzLDQ+LCA8MCwwLDAsMD4KKyAgMTU1MTA1Njk5OFUsCS8vIDwzLDQsMCwxPjogQ29zdCAyIHZleHQyIDwxLDIsMyw0PiwgTEhTCisgIDI2MjQ3OTg4ODRVLAkvLyA8Myw0LDAsMj46IENvc3QgMyB2ZXh0MiA8MSwyLDMsND4sIDwwLDIsMCwyPgorICAzNjkzMjMyMzg0VSwJLy8gPDMsNCwwLDM+OiBDb3N0IDQgdmV4dDIgPDAsMywzLDQ+LCA8MCwzLDEsND4KKyAgMjYyNDc5OTA1OFUsCS8vIDwzLDQsMCw0PjogQ29zdCAzIHZleHQyIDwxLDIsMyw0PiwgPDAsNCwxLDU+CisgIDE2NTkyMjcwMjZVLAkvLyA8Myw0LDAsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDw0LDAsNSwxPgorICAxNjU5MjI3MDM2VSwJLy8gPDMsNCwwLDY+OiBDb3N0IDIgdmV4dDMgTEhTLCA8NCwwLDYsMj4KKyAgMzY2Nzk3MzM4MlUsCS8vIDwzLDQsMCw3PjogQ29zdCA0IHZleHQxIDw3LDMsNCwwPiwgPDcsMyw0LDA+CisgIDE1NTEwNTc1NjVVLAkvLyA8Myw0LDAsdT46IENvc3QgMiB2ZXh0MiA8MSwyLDMsND4sIExIUworICAyNjI0Nzk5NDc4VSwJLy8gPDMsNCwxLDA+OiBDb3N0IDMgdmV4dDIgPDEsMiwzLDQ+LCA8MSwwLDMsMj4KKyAgMjYyNDc5OTU0MFUsCS8vIDwzLDQsMSwxPjogQ29zdCAzIHZleHQyIDwxLDIsMyw0PiwgPDEsMSwxLDE+CisgIDE1NTEwNTc4MThVLAkvLyA8Myw0LDEsMj46IENvc3QgMiB2ZXh0MiA8MSwyLDMsND4sIDwxLDIsMyw0PgorICAyNjI0Nzk5NzA0VSwJLy8gPDMsNCwxLDM+OiBDb3N0IDMgdmV4dDIgPDEsMiwzLDQ+LCA8MSwzLDEsMz4KKyAgMjU2NDM3NzkxMFUsCS8vIDwzLDQsMSw0PjogQ29zdCAzIHZleHQxIDwyLDMsNCwxPiwgUkhTCisgIDI2ODk4MzgwNTBVLAkvLyA8Myw0LDEsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDw0LDEsNSwwPgorICAyNjg5ODM4MDYyVSwJLy8gPDMsNCwxLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NCwxLDYsMz4KKyAgMjYyODExNzgwN1UsCS8vIDwzLDQsMSw3PjogQ29zdCAzIHZleHQyIDwxLDcsMyw0PiwgPDEsNywzLDQ+CisgIDE1NTUwMzk2MTZVLAkvLyA8Myw0LDEsdT46IENvc3QgMiB2ZXh0MiA8MSx1LDMsND4sIDwxLHUsMyw0PgorICAzNjI2MTgwNzEwVSwJLy8gPDMsNCwyLDA+OiBDb3N0IDQgdmV4dDEgPDAsMyw0LDI+LCBMSFMKKyAgMjYyNDgwMDI5OFUsCS8vIDwzLDQsMiwxPjogQ29zdCAzIHZleHQyIDwxLDIsMyw0PiwgPDIsMSw0LDM+CisgIDI2MjQ4MDAzNjBVLAkvLyA8Myw0LDIsMj46IENvc3QgMyB2ZXh0MiA8MSwyLDMsND4sIDwyLDIsMiwyPgorICAyNjI0ODAwNDIyVSwJLy8gPDMsNCwyLDM+OiBDb3N0IDMgdmV4dDIgPDEsMiwzLDQ+LCA8MiwzLDAsMT4KKyAgMjYyNDgwMDUxNFUsCS8vIDwzLDQsMiw0PjogQ29zdCAzIHZleHQyIDwxLDIsMyw0PiwgPDIsNCwxLDM+CisgIDI3MDk5NjU4NzhVLAkvLyA8Myw0LDIsNT46IENvc3QgMyB2ZXh0MyA8NCwyLDUsMz4sIDw0LDIsNSwzPgorICAyNjg5ODM4MTQwVSwJLy8gPDMsNCwyLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NCwyLDYsMD4KKyAgMjYzNDA5MDUwNFUsCS8vIDwzLDQsMiw3PjogQ29zdCAzIHZleHQyIDwyLDcsMyw0PiwgPDIsNywzLDQ+CisgIDI2ODk4MzgxNThVLAkvLyA8Myw0LDIsdT46IENvc3QgMyB2ZXh0MyBMSFMsIDw0LDIsdSwwPgorICAyNjI0ODAwOTE4VSwJLy8gPDMsNCwzLDA+OiBDb3N0IDMgdmV4dDIgPDEsMiwzLDQ+LCA8MywwLDEsMj4KKyAgMjYzNjA4MTQwM1UsCS8vIDwzLDQsMywxPjogQ29zdCAzIHZleHQyIDwzLDEsMyw0PiwgPDMsMSwzLDQ+CisgIDI2MzY3NDUwMzZVLAkvLyA8Myw0LDMsMj46IENvc3QgMyB2ZXh0MiA8MywyLDMsND4sIDwzLDIsMyw0PgorICAyNjI0ODAxMTgwVSwJLy8gPDMsNCwzLDM+OiBDb3N0IDMgdmV4dDIgPDEsMiwzLDQ+LCA8MywzLDMsMz4KKyAgMjYyNDgwMTIzMlUsCS8vIDwzLDQsMyw0PjogQ29zdCAzIHZleHQyIDwxLDIsMyw0PiwgPDMsNCwwLDE+CisgIDI5MDU4MzY4NTRVLAkvLyA8Myw0LDMsNT46IENvc3QgMyB2emlwbCA8MywzLDMsMz4sIFJIUworICAzMDQwMDU0NTgyVSwJLy8gPDMsNCwzLDY+OiBDb3N0IDMgdnRybmwgPDMsMywzLDM+LCBSSFMKKyAgMzcwMjUyNDYxMVUsCS8vIDwzLDQsMyw3PjogQ29zdCA0IHZleHQyIDwxLHUsMyw0PiwgPDMsNywwLDE+CisgIDI2MjQ4MDE1NjZVLAkvLyA8Myw0LDMsdT46IENvc3QgMyB2ZXh0MiA8MSwyLDMsND4sIDwzLHUsMSwyPgorICAyNTY0Mzk5MjA2VSwJLy8gPDMsNCw0LDA+OiBDb3N0IDMgdmV4dDEgPDIsMyw0LDQ+LCBMSFMKKyAgMjU2NDQwMDAyNlUsCS8vIDwzLDQsNCwxPjogQ29zdCAzIHZleHQxIDwyLDMsNCw0PiwgPDEsMiwzLDQ+CisgIDI1NjQ0MDA4NDVVLAkvLyA8Myw0LDQsMj46IENvc3QgMyB2ZXh0MSA8MiwzLDQsND4sIDwyLDMsNCw0PgorICAyNTcwMzczNTQyVSwJLy8gPDMsNCw0LDM+OiBDb3N0IDMgdmV4dDEgPDMsMyw0LDQ+LCA8MywzLDQsND4KKyAgMTY1OTIyNzM0NFUsCS8vIDwzLDQsNCw0PjogQ29zdCAyIHZleHQzIExIUywgPDQsNCw0LDQ+CisgIDE1NTEwNjAyNzhVLAkvLyA8Myw0LDQsNT46IENvc3QgMiB2ZXh0MiA8MSwyLDMsND4sIFJIUworICAxNjU5MjI3MzY0VSwJLy8gPDMsNCw0LDY+OiBDb3N0IDIgdmV4dDMgTEhTLCA8NCw0LDYsNj4KKyAgMzY2ODAwNjE1NFUsCS8vIDwzLDQsNCw3PjogQ29zdCA0IHZleHQxIDw3LDMsNCw0PiwgPDcsMyw0LDQ+CisgIDE1NTEwNjA1MjFVLAkvLyA8Myw0LDQsdT46IENvc3QgMiB2ZXh0MiA8MSwyLDMsND4sIFJIUworICAxNDkwNjY1NTc0VSwJLy8gPDMsNCw1LDA+OiBDb3N0IDIgdmV4dDEgPDIsMyw0LDU+LCBMSFMKKyAgMjY4OTgzODM0MVUsCS8vIDwzLDQsNSwxPjogQ29zdCAzIHZleHQzIExIUywgPDQsNSwxLDM+CisgIDE0OTA2NjcyMTRVLAkvLyA8Myw0LDUsMj46IENvc3QgMiB2ZXh0MSA8MiwzLDQsNT4sIDwyLDMsNCw1PgorICAyNTY0NDA5NDk0VSwJLy8gPDMsNCw1LDM+OiBDb3N0IDMgdmV4dDEgPDIsMyw0LDU+LCA8MywwLDEsMj4KKyAgMTQ5MDY2ODg1NFUsCS8vIDwzLDQsNSw0PjogQ29zdCAyIHZleHQxIDwyLDMsNCw1PiwgUkhTCisgIDI2ODk4MzgzODFVLAkvLyA8Myw0LDUsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDw0LDUsNSw3PgorICA1Mzc3MDk4NzhVLAkvLyA8Myw0LDUsNj46IENvc3QgMSB2ZXh0MyBMSFMsIFJIUworICAyNTk0MjcyNTIzVSwJLy8gPDMsNCw1LDc+OiBDb3N0IDMgdmV4dDEgPDcsMyw0LDU+LCA8NywzLDQsNT4KKyAgNTM3NzA5ODk2VSwJLy8gPDMsNCw1LHU+OiBDb3N0IDEgdmV4dDMgTEhTLCBSSFMKKyAgMjY4OTgzODQxMVUsCS8vIDwzLDQsNiwwPjogQ29zdCAzIHZleHQzIExIUywgPDQsNiwwLDE+CisgIDI1NTg0NDQ1MzRVLAkvLyA8Myw0LDYsMT46IENvc3QgMyB2ZXh0MSA8MSwzLDQsNj4sIDwxLDMsNCw2PgorICAyNjY2NjA3MDk4VSwJLy8gPDMsNCw2LDI+OiBDb3N0IDMgdmV4dDIgPHUsMiwzLDQ+LCA8NiwyLDcsMz4KKyAgMjU1ODQ0NjA4MlUsCS8vIDwzLDQsNiwzPjogQ29zdCAzIHZleHQxIDwxLDMsNCw2PiwgPDMsNCw1LDY+CisgIDE2NTkyMjc1MDhVLAkvLyA8Myw0LDYsND46IENvc3QgMiB2ZXh0MyBMSFMsIDw0LDYsNCw2PgorICAyNjg5ODM4NDYyVSwJLy8gPDMsNCw2LDU+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NCw2LDUsNz4KKyAgMjY4OTgzODQ3MVUsCS8vIDwzLDQsNiw2PjogQ29zdCAzIHZleHQzIExIUywgPDQsNiw2LDc+CisgIDI2NTc5ODEyOTJVLAkvLyA8Myw0LDYsNz46IENvc3QgMyB2ZXh0MiA8Niw3LDMsND4sIDw2LDcsMyw0PgorICAxNjU5MjI3NTQwVSwJLy8gPDMsNCw2LHU+OiBDb3N0IDIgdmV4dDMgTEhTLCA8NCw2LHUsMj4KKyAgMjY2NjYwNzYxMFUsCS8vIDwzLDQsNywwPjogQ29zdCAzIHZleHQyIDx1LDIsMyw0PiwgPDcsMCwxLDI+CisgIDM3MDI1MjcwNzJVLAkvLyA8Myw0LDcsMT46IENvc3QgNCB2ZXh0MiA8MSx1LDMsND4sIDw3LDEsMyw1PgorICAyNjYwNjM1ODI0VSwJLy8gPDMsNCw3LDI+OiBDb3N0IDMgdmV4dDIgPDcsMiwzLDQ+LCA8NywyLDMsND4KKyAgMzY0NDEzOTk0NVUsCS8vIDwzLDQsNywzPjogQ29zdCA0IHZleHQxIDwzLDMsNCw3PiwgPDMsMyw0LDc+CisgIDI2NjY2MDc5NzRVLAkvLyA8Myw0LDcsND46IENvc3QgMyB2ZXh0MiA8dSwyLDMsND4sIDw3LDQsNSw2PgorICAyNzMyOTY5NDE2VSwJLy8gPDMsNCw3LDU+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NCw3LDUsMD4KKyAgMjczMjk2OTQyNVUsCS8vIDwzLDQsNyw2PjogQ29zdCAzIHZleHQzIExIUywgPDQsNyw2LDA+CisgIDI2NjY2MDgyMzZVLAkvLyA8Myw0LDcsNz46IENvc3QgMyB2ZXh0MiA8dSwyLDMsND4sIDw3LDcsNyw3PgorICAyNjY0NjE3NjIyVSwJLy8gPDMsNCw3LHU+OiBDb3N0IDMgdmV4dDIgPDcsdSwzLDQ+LCA8Nyx1LDMsND4KKyAgMTQ5MDY5MDE1MFUsCS8vIDwzLDQsdSwwPjogQ29zdCAyIHZleHQxIDwyLDMsNCx1PiwgTEhTCisgIDE1NTEwNjI4MzBVLAkvLyA8Myw0LHUsMT46IENvc3QgMiB2ZXh0MiA8MSwyLDMsND4sIExIUworICAxNDkwNjkxNzkzVSwJLy8gPDMsNCx1LDI+OiBDb3N0IDIgdmV4dDEgPDIsMyw0LHU+LCA8MiwzLDQsdT4KKyAgMjYyNDgwNDc5NlUsCS8vIDwzLDQsdSwzPjogQ29zdCAzIHZleHQyIDwxLDIsMyw0PiwgPHUsMywwLDE+CisgIDE0OTA2OTM0MzBVLAkvLyA8Myw0LHUsND46IENvc3QgMiB2ZXh0MSA8MiwzLDQsdT4sIFJIUworICAxNTUxMDYzMTk0VSwJLy8gPDMsNCx1LDU+OiBDb3N0IDIgdmV4dDIgPDEsMiwzLDQ+LCBSSFMKKyAgNTM3NzEwMTIxVSwJLy8gPDMsNCx1LDY+OiBDb3N0IDEgdmV4dDMgTEhTLCBSSFMKKyAgMjU5NDI5NzEwMlUsCS8vIDwzLDQsdSw3PjogQ29zdCAzIHZleHQxIDw3LDMsNCx1PiwgPDcsMyw0LHU+CisgIDUzNzcxMDEzOVUsCS8vIDwzLDQsdSx1PjogQ29zdCAxIHZleHQzIExIUywgUkhTCisgIDM2OTI1NzY3NjhVLAkvLyA8Myw1LDAsMD46IENvc3QgNCB2ZXh0MiA8MCwyLDMsNT4sIDwwLDAsMCwwPgorICAyNjE4ODM1MDQ2VSwJLy8gPDMsNSwwLDE+OiBDb3N0IDMgdmV4dDIgPDAsMiwzLDU+LCBMSFMKKyAgMjYxODgzNTEzOFUsCS8vIDwzLDUsMCwyPjogQ29zdCAzIHZleHQyIDwwLDIsMyw1PiwgPDAsMiwzLDU+CisgIDM2OTI1NzcwMjRVLAkvLyA8Myw1LDAsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDMsNT4sIDwwLDMsMSw0PgorICAyNjg5ODM4NjkwVSwJLy8gPDMsNSwwLDQ+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NSwwLDQsMT4KKyAgMjczMjk2OTU3OVUsCS8vIDwzLDUsMCw1PjogQ29zdCAzIHZleHQzIExIUywgPDUsMCw1LDE+CisgIDI3MzI5Njk1ODhVLAkvLyA8Myw1LDAsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDw1LDAsNiwxPgorICAyMjQ2OTYzMDU1VSwJLy8gPDMsNSwwLDc+OiBDb3N0IDMgdnJldiA8NSwzLDcsMD4KKyAgMjYxODgzNTYxM1UsCS8vIDwzLDUsMCx1PjogQ29zdCAzIHZleHQyIDwwLDIsMyw1PiwgTEhTCisgIDI1OTQzMDgxOThVLAkvLyA8Myw1LDEsMD46IENvc3QgMyB2ZXh0MSA8NywzLDUsMT4sIExIUworICAzNjkyNTc3NTg4VSwJLy8gPDMsNSwxLDE+OiBDb3N0IDQgdmV4dDIgPDAsMiwzLDU+LCA8MSwxLDEsMT4KKyAgMjYyNDgwNzgzNVUsCS8vIDwzLDUsMSwyPjogQ29zdCAzIHZleHQyIDwxLDIsMyw1PiwgPDEsMiwzLDU+CisgIDI2MjU0NzE0NjhVLAkvLyA8Myw1LDEsMz46IENvc3QgMyB2ZXh0MiA8MSwzLDMsNT4sIDwxLDMsMyw1PgorICAyNjI2MTM1MTAxVSwJLy8gPDMsNSwxLDQ+OiBDb3N0IDMgdmV4dDIgPDEsNCwzLDU+LCA8MSw0LDMsNT4KKyAgMjU5NDMxMTg4OFUsCS8vIDwzLDUsMSw1PjogQ29zdCAzIHZleHQxIDw3LDMsNSwxPiwgPDUsMSw3LDM+CisgIDM2OTk4NzcxMDdVLAkvLyA8Myw1LDEsNj46IENvc3QgNCB2ZXh0MiA8MSw0LDMsNT4sIDwxLDYsNSw3PgorICAxNjQxNjgwNTkyVSwJLy8gPDMsNSwxLDc+OiBDb3N0IDIgdmV4dDMgPDUsMSw3LDM+LCA8NSwxLDcsMz4KKyAgMTY0MTc1NDMyOVUsCS8vIDwzLDUsMSx1PjogQ29zdCAyIHZleHQzIDw1LDEsdSwzPiwgPDUsMSx1LDM+CisgIDM2OTI1NzgyNzRVLAkvLyA8Myw1LDIsMD46IENvc3QgNCB2ZXh0MiA8MCwyLDMsNT4sIDwyLDAsNSwzPgorICAyNjMwMTE2ODk5VSwJLy8gPDMsNSwyLDE+OiBDb3N0IDMgdmV4dDIgPDIsMSwzLDU+LCA8MiwxLDMsNT4KKyAgMzY5MjU3ODQwOFUsCS8vIDwzLDUsMiwyPjogQ29zdCA0IHZleHQyIDwwLDIsMyw1PiwgPDIsMiwyLDI+CisgIDI2MjU0NzIyMDZVLAkvLyA8Myw1LDIsMz46IENvc3QgMyB2ZXh0MiA8MSwzLDMsNT4sIDwyLDMsNCw1PgorICAyNjMyMTA3Nzk4VSwJLy8gPDMsNSwyLDQ+OiBDb3N0IDMgdmV4dDIgPDIsNCwzLDU+LCA8Miw0LDMsNT4KKyAgMjcxNTkzODU3NVUsCS8vIDwzLDUsMiw1PjogQ29zdCAzIHZleHQzIDw1LDIsNSwzPiwgPDUsMiw1LDM+CisgIDM2OTI1Nzg3NDZVLAkvLyA8Myw1LDIsNj46IENvc3QgNCB2ZXh0MiA8MCwyLDMsNT4sIDwyLDYsMyw3PgorICAyNzE2MDg2MDQ5VSwJLy8gPDMsNSwyLDc+OiBDb3N0IDMgdmV4dDMgPDUsMiw3LDM+LCA8NSwyLDcsMz4KKyAgMjYzNDc2MjMzMFUsCS8vIDwzLDUsMix1PjogQ29zdCAzIHZleHQyIDwyLHUsMyw1PiwgPDIsdSwzLDU+CisgIDM2OTI1Nzg5NjZVLAkvLyA8Myw1LDMsMD46IENvc3QgNCB2ZXh0MiA8MCwyLDMsNT4sIDwzLDAsMSwyPgorICAyNjM2MDg5NTk2VSwJLy8gPDMsNSwzLDE+OiBDb3N0IDMgdmV4dDIgPDMsMSwzLDU+LCA8MywxLDMsNT4KKyAgMzY5OTIxNDY2OFUsCS8vIDwzLDUsMywyPjogQ29zdCA0IHZleHQyIDwxLDMsMyw1PiwgPDMsMiwzLDQ+CisgIDI2MzgwODA0MTJVLAkvLyA8Myw1LDMsMz46IENvc3QgMyB2ZXh0MiA8Myw0LDMsNT4sIDwzLDMsMywzPgorICAyNjE4ODM3NTA2VSwJLy8gPDMsNSwzLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMiwzLDU+LCA8Myw0LDUsNj4KKyAgMjgzMjg0NDQ5NFUsCS8vIDwzLDUsMyw1PjogQ29zdCAzIHZ1enByIDwyLDMsNCw1PiwgPDIsMyw0LDU+CisgIDQwMzM0MTU2ODJVLAkvLyA8Myw1LDMsNj46IENvc3QgNCB2emlwciA8MSwxLDMsMz4sIDwzLDQsNSw2PgorICAzMDk1MDcyMDU0VSwJLy8gPDMsNSwzLDc+OiBDb3N0IDMgdnRybnIgPDEsMywxLDM+LCBSSFMKKyAgMzA5NTA3MjA1NVUsCS8vIDwzLDUsMyx1PjogQ29zdCAzIHZ0cm5yIDwxLDMsMSwzPiwgUkhTCisgIDI2MDAzMDQ3NDJVLAkvLyA8Myw1LDQsMD46IENvc3QgMyB2ZXh0MSA8dSwzLDUsND4sIExIUworICAzNzYzNTgwODE1VSwJLy8gPDMsNSw0LDE+OiBDb3N0IDQgdmV4dDMgTEhTLCA8NSw0LDEsNT4KKyAgMjU2NDQ3NDU4MlUsCS8vIDwzLDUsNCwyPjogQ29zdCAzIHZleHQxIDwyLDMsNSw0PiwgPDIsMyw1LDQ+CisgIDM2OTk4NzkwNDRVLAkvLyA8Myw1LDQsMz46IENvc3QgNCB2ZXh0MiA8MSw0LDMsNT4sIDw0LDMsNSwwPgorICAyNjAwMzA4MDIyVSwJLy8gPDMsNSw0LDQ+OiBDb3N0IDMgdmV4dDEgPHUsMyw1LDQ+LCBSSFMKKyAgMjYxODgzODMyNlUsCS8vIDwzLDUsNCw1PjogQ29zdCAzIHZleHQyIDwwLDIsMyw1PiwgUkhTCisgIDI3NzI0NTQ3MTBVLAkvLyA8Myw1LDQsNj46IENvc3QgMyB2dXpwbCA8Myw0LDUsNj4sIFJIUworICAxNjU5MjI4MTAyVSwJLy8gPDMsNSw0LDc+OiBDb3N0IDIgdmV4dDMgTEhTLCA8NSw0LDcsNj4KKyAgMTY1OTIyODExMVUsCS8vIDwzLDUsNCx1PjogQ29zdCAyIHZleHQzIExIUywgPDUsNCx1LDY+CisgIDI1NzA0NTMwOTRVLAkvLyA8Myw1LDUsMD46IENvc3QgMyB2ZXh0MSA8MywzLDUsNT4sIExIUworICAyNjI0ODEwNzA0VSwJLy8gPDMsNSw1LDE+OiBDb3N0IDMgdmV4dDIgPDEsMiwzLDU+LCA8NSwxLDcsMz4KKyAgMjU3MDQ1NDczNFUsCS8vIDwzLDUsNSwyPjogQ29zdCAzIHZleHQxIDwzLDMsNSw1PiwgPDIsMyw0LDU+CisgIDI1NzA0NTU0NzJVLAkvLyA8Myw1LDUsMz46IENvc3QgMyB2ZXh0MSA8MywzLDUsNT4sIDwzLDMsNSw1PgorICAyNTcwNDU2Mzc0VSwJLy8gPDMsNSw1LDQ+OiBDb3N0IDMgdmV4dDEgPDMsMyw1LDU+LCBSSFMKKyAgMTY1OTIyODE2NFUsCS8vIDwzLDUsNSw1PjogQ29zdCAyIHZleHQzIExIUywgPDUsNSw1LDU+CisgIDI3MzI5Njk5OThVLAkvLyA8Myw1LDUsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDw1LDUsNiw2PgorICAxNjU5MjI4MTg0VSwJLy8gPDMsNSw1LDc+OiBDb3N0IDIgdmV4dDMgTEhTLCA8NSw1LDcsNz4KKyAgMTY1OTIyODE5M1UsCS8vIDwzLDUsNSx1PjogQ29zdCAyIHZleHQzIExIUywgPDUsNSx1LDc+CisgIDI3MzI5NzAwMjBVLAkvLyA8Myw1LDYsMD46IENvc3QgMyB2ZXh0MyBMSFMsIDw1LDYsMCwxPgorICAyNzMyOTcwMDM1VSwJLy8gPDMsNSw2LDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NSw2LDEsNz4KKyAgMjU2NDQ5MDk2OFUsCS8vIDwzLDUsNiwyPjogQ29zdCAzIHZleHQxIDwyLDMsNSw2PiwgPDIsMyw1LDY+CisgIDI3MzI5NzAwNTBVLAkvLyA8Myw1LDYsMz46IENvc3QgMyB2ZXh0MyBMSFMsIDw1LDYsMyw0PgorICAyNzMyOTcwMDYwVSwJLy8gPDMsNSw2LDQ+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NSw2LDQsNT4KKyAgMjczMjk3MDA3MVUsCS8vIDwzLDUsNiw1PjogQ29zdCAzIHZleHQzIExIUywgPDUsNiw1LDc+CisgIDI3MzI5NzAwODBVLAkvLyA8Myw1LDYsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDw1LDYsNiw3PgorICAxNjU5MjI4MjU4VSwJLy8gPDMsNSw2LDc+OiBDb3N0IDIgdmV4dDMgTEhTLCA8NSw2LDcsMD4KKyAgMTY1OTIyODI2N1UsCS8vIDwzLDUsNix1PjogQ29zdCAyIHZleHQzIExIUywgPDUsNix1LDA+CisgIDE0ODQ3ODM3MThVLAkvLyA8Myw1LDcsMD46IENvc3QgMiB2ZXh0MSA8MSwzLDUsNz4sIExIUworICAxNDg0Nzg0NjQwVSwJLy8gPDMsNSw3LDE+OiBDb3N0IDIgdmV4dDEgPDEsMyw1LDc+LCA8MSwzLDUsNz4KKyAgMjU1ODUyNzA4MFUsCS8vIDwzLDUsNywyPjogQ29zdCAzIHZleHQxIDwxLDMsNSw3PiwgPDIsMiwyLDI+CisgIDI1NTg1Mjc2MzhVLAkvLyA8Myw1LDcsMz46IENvc3QgMyB2ZXh0MSA8MSwzLDUsNz4sIDwzLDAsMSwyPgorICAxNDg0Nzg2OTk4VSwJLy8gPDMsNSw3LDQ+OiBDb3N0IDIgdmV4dDEgPDEsMyw1LDc+LCBSSFMKKyAgMTY1OTIyODMyOFUsCS8vIDwzLDUsNyw1PjogQ29zdCAyIHZleHQzIExIUywgPDUsNyw1LDc+CisgIDI3MzI5NzAxNTRVLAkvLyA8Myw1LDcsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDw1LDcsNiwwPgorICAyNTU4NTMxMTgwVSwJLy8gPDMsNSw3LDc+OiBDb3N0IDMgdmV4dDEgPDEsMyw1LDc+LCA8Nyw3LDcsNz4KKyAgMTQ4NDc4OTU1MFUsCS8vIDwzLDUsNyx1PjogQ29zdCAyIHZleHQxIDwxLDMsNSw3PiwgTEhTCisgIDE0ODQ3OTE5MTBVLAkvLyA8Myw1LHUsMD46IENvc3QgMiB2ZXh0MSA8MSwzLDUsdT4sIExIUworICAxNDg0NzkyODMzVSwJLy8gPDMsNSx1LDE+OiBDb3N0IDIgdmV4dDEgPDEsMyw1LHU+LCA8MSwzLDUsdT4KKyAgMjU1ODUzNTI3MlUsCS8vIDwzLDUsdSwyPjogQ29zdCAzIHZleHQxIDwxLDMsNSx1PiwgPDIsMiwyLDI+CisgIDI1NTg1MzU4MzBVLAkvLyA8Myw1LHUsMz46IENvc3QgMyB2ZXh0MSA8MSwzLDUsdT4sIDwzLDAsMSwyPgorICAxNDg0Nzk1MTkwVSwJLy8gPDMsNSx1LDQ+OiBDb3N0IDIgdmV4dDEgPDEsMyw1LHU+LCBSSFMKKyAgMTY1OTIyODQwOVUsCS8vIDwzLDUsdSw1PjogQ29zdCAyIHZleHQzIExIUywgPDUsdSw1LDc+CisgIDI3NzI0NTc2MjZVLAkvLyA8Myw1LHUsNj46IENvc3QgMyB2dXpwbCA8Myw0LDUsNj4sIFJIUworICAxNjQ2MzI2MDIzVSwJLy8gPDMsNSx1LDc+OiBDb3N0IDIgdmV4dDMgPDUsdSw3LDM+LCA8NSx1LDcsMz4KKyAgMTQ4NDc5Nzc0MlUsCS8vIDwzLDUsdSx1PjogQ29zdCAyIHZleHQxIDwxLDMsNSx1PiwgTEhTCisgIDI1NTg1NDE5MjZVLAkvLyA8Myw2LDAsMD46IENvc3QgMyB2ZXh0MSA8MSwzLDYsMD4sIExIUworICAyNjg5ODM5MzkzVSwJLy8gPDMsNiwwLDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NiwwLDEsMj4KKyAgMjY4OTgzOTQwNFUsCS8vIDwzLDYsMCwyPjogQ29zdCAzIHZleHQzIExIUywgPDYsMCwyLDQ+CisgIDM3MDY1MTk4MDhVLAkvLyA8Myw2LDAsMz46IENvc3QgNCB2ZXh0MiA8Miw1LDMsNj4sIDwwLDMsMSw0PgorICAyNjg5ODM5NDIwVSwJLy8gPDMsNiwwLDQ+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NiwwLDQsMj4KKyAgMjczMjk3MDMxNFUsCS8vIDwzLDYsMCw1PjogQ29zdCAzIHZleHQzIExIUywgPDYsMCw1LDc+CisgIDI3MzI5NzAzMTZVLAkvLyA8Myw2LDAsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDw2LDAsNiwwPgorICAyOTYwMzEzNjU0VSwJLy8gPDMsNiwwLDc+OiBDb3N0IDMgdnppcHIgPDEsMiwzLDA+LCBSSFMKKyAgMjY4OTgzOTQ1NlUsCS8vIDwzLDYsMCx1PjogQ29zdCAzIHZleHQzIExIUywgPDYsMCx1LDI+CisgIDM3NjM1ODEyOTBVLAkvLyA8Myw2LDEsMD46IENvc3QgNCB2ZXh0MyBMSFMsIDw2LDEsMCwzPgorICAzNzYzNTgxMjk3VSwJLy8gPDMsNiwxLDE+OiBDb3N0IDQgdmV4dDMgTEhTLCA8NiwxLDEsMT4KKyAgMjYyNDgxNjAyOFUsCS8vIDwzLDYsMSwyPjogQ29zdCAzIHZleHQyIDwxLDIsMyw2PiwgPDEsMiwzLDY+CisgIDM3NjM1ODEzMTVVLAkvLyA8Myw2LDEsMz46IENvc3QgNCB2ZXh0MyBMSFMsIDw2LDEsMywxPgorICAyNjI2MTQzMjk0VSwJLy8gPDMsNiwxLDQ+OiBDb3N0IDMgdmV4dDIgPDEsNCwzLDY+LCA8MSw0LDMsNj4KKyAgMzc2MzU4MTMzNVUsCS8vIDwzLDYsMSw1PjogQ29zdCA0IHZleHQzIExIUywgPDYsMSw1LDM+CisgIDI3MjEzMjEzNzZVLAkvLyA8Myw2LDEsNj46IENvc3QgMyB2ZXh0MyA8NiwxLDYsMz4sIDw2LDEsNiwzPgorICAyNzIxMzk1MTEzVSwJLy8gPDMsNiwxLDc+OiBDb3N0IDMgdmV4dDMgPDYsMSw3LDM+LCA8NiwxLDcsMz4KKyAgMjYyODc5NzgyNlUsCS8vIDwzLDYsMSx1PjogQ29zdCAzIHZleHQyIDwxLHUsMyw2PiwgPDEsdSwzLDY+CisgIDI1OTQzOTAxMThVLAkvLyA8Myw2LDIsMD46IENvc3QgMyB2ZXh0MSA8NywzLDYsMj4sIExIUworICAyNzIxNjE2MzI0VSwJLy8gPDMsNiwyLDE+OiBDb3N0IDMgdmV4dDMgPDYsMiwxLDM+LCA8NiwyLDEsMz4KKyAgMjYzMDc4ODcyNVUsCS8vIDwzLDYsMiwyPjogQ29zdCAzIHZleHQyIDwyLDIsMyw2PiwgPDIsMiwzLDY+CisgIDM3NjM1ODEzOTVVLAkvLyA8Myw2LDIsMz46IENvc3QgNCB2ZXh0MyBMSFMsIDw2LDIsMywwPgorICAyNjMyMTE1OTkxVSwJLy8gPDMsNiwyLDQ+OiBDb3N0IDMgdmV4dDIgPDIsNCwzLDY+LCA8Miw0LDMsNj4KKyAgMjYzMjc3OTYyNFUsCS8vIDwzLDYsMiw1PjogQ29zdCAzIHZleHQyIDwyLDUsMyw2PiwgPDIsNSwzLDY+CisgIDI1OTQzOTQ2MThVLAkvLyA8Myw2LDIsNj46IENvc3QgMyB2ZXh0MSA8NywzLDYsMj4sIDw2LDIsNywzPgorICAxNjQ4MzE2OTIyVSwJLy8gPDMsNiwyLDc+OiBDb3N0IDIgdmV4dDMgPDYsMiw3LDM+LCA8NiwyLDcsMz4KKyAgMTY0ODM5MDY1OVUsCS8vIDwzLDYsMix1PjogQ29zdCAyIHZleHQzIDw2LDIsdSwzPiwgPDYsMix1LDM+CisgIDM2OTM5MTQyNjJVLAkvLyA8Myw2LDMsMD46IENvc3QgNCB2ZXh0MiA8MCw0LDMsNj4sIDwzLDAsMSwyPgorICAzNjM4MjgxMTc2VSwJLy8gPDMsNiwzLDE+OiBDb3N0IDQgdmV4dDEgPDIsMyw2LDM+LCA8MSwzLDEsMz4KKyAgMzY5NjU2ODY3OFUsCS8vIDwzLDYsMywyPjogQ29zdCA0IHZleHQyIDwwLHUsMyw2PiwgPDMsMiw2LDM+CisgIDI2MzgwODg2MDRVLAkvLyA8Myw2LDMsMz46IENvc3QgMyB2ZXh0MiA8Myw0LDMsNj4sIDwzLDMsMywzPgorICAyNjMyNzgwMjkwVSwJLy8gPDMsNiwzLDQ+OiBDb3N0IDMgdmV4dDIgPDIsNSwzLDY+LCA8Myw0LDUsNj4KKyAgMzcxMjQ5NDE0NVUsCS8vIDwzLDYsMyw1PjogQ29zdCA0IHZleHQyIDwzLDUsMyw2PiwgPDMsNSwzLDY+CisgIDM2OTg1NTk2MTJVLAkvLyA8Myw2LDMsNj46IENvc3QgNCB2ZXh0MiA8MSwyLDMsNj4sIDwzLDYsMSwyPgorICAyOTU5Njc0Njc4VSwJLy8gPDMsNiwzLDc+OiBDb3N0IDMgdnppcHIgPDEsMSwzLDM+LCBSSFMKKyAgMjk1OTY3NDY3OVUsCS8vIDwzLDYsMyx1PjogQ29zdCAzIHZ6aXByIDwxLDEsMywzPiwgUkhTCisgIDM3NjM1ODE1MzZVLAkvLyA8Myw2LDQsMD46IENvc3QgNCB2ZXh0MyBMSFMsIDw2LDQsMCw2PgorICAyNzIyOTQzNTkwVSwJLy8gPDMsNiw0LDE+OiBDb3N0IDMgdmV4dDMgPDYsNCwxLDM+LCA8Niw0LDEsMz4KKyAgMjczMjk3MDYwOVUsCS8vIDwzLDYsNCwyPjogQ29zdCAzIHZleHQzIExIUywgPDYsNCwyLDU+CisgIDM2OTg1NjAxNDdVLAkvLyA8Myw2LDQsMz46IENvc3QgNCB2ZXh0MiA8MSwyLDMsNj4sIDw0LDMsNiw2PgorICAyNzMyOTcwNjI4VSwJLy8gPDMsNiw0LDQ+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Niw0LDQsNj4KKyAgMjY4OTgzOTc1N1UsCS8vIDwzLDYsNCw1PjogQ29zdCAzIHZleHQzIExIUywgPDYsNCw1LDY+CisgIDI3MzI5NzA2NDBVLAkvLyA8Myw2LDQsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDw2LDQsNiwwPgorICAyOTYwMzQ2NDIyVSwJLy8gPDMsNiw0LDc+OiBDb3N0IDMgdnppcHIgPDEsMiwzLDQ+LCBSSFMKKyAgMjY4OTgzOTc4NFUsCS8vIDwzLDYsNCx1PjogQ29zdCAzIHZleHQzIExIUywgPDYsNCx1LDY+CisgIDI1NzY0OTg3OTBVLAkvLyA8Myw2LDUsMD46IENvc3QgMyB2ZXh0MSA8NCwzLDYsNT4sIExIUworICAzNjUwMjQxMjcwVSwJLy8gPDMsNiw1LDE+OiBDb3N0IDQgdmV4dDEgPDQsMyw2LDU+LCA8MSwwLDMsMj4KKyAgMjczMjk3MDY5MlUsCS8vIDwzLDYsNSwyPjogQ29zdCAzIHZleHQzIExIUywgPDYsNSwyLDc+CisgIDI1NzY1MDEyNTBVLAkvLyA8Myw2LDUsMz46IENvc3QgMyB2ZXh0MSA8NCwzLDYsNT4sIDwzLDQsNSw2PgorICAyNTc2NTAxOTA2VSwJLy8gPDMsNiw1LDQ+OiBDb3N0IDMgdmV4dDEgPDQsMyw2LDU+LCA8NCwzLDYsNT4KKyAgMzY1MDI0NDYyMlUsCS8vIDwzLDYsNSw1PjogQ29zdCA0IHZleHQxIDw0LDMsNiw1PiwgPDUsNSw2LDY+CisgIDQxMTQ2MzM1MjhVLAkvLyA8Myw2LDUsNj46IENvc3QgNCB2dHJubCA8Myw0LDUsNj4sIDw2LDYsNiw2PgorICAyNzMyOTcwNzM1VSwJLy8gPDMsNiw1LDc+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Niw1LDcsNT4KKyAgMjU3NjUwNDYyMlUsCS8vIDwzLDYsNSx1PjogQ29zdCAzIHZleHQxIDw0LDMsNiw1PiwgTEhTCisgIDI3MzI5NzA3NDlVLAkvLyA8Myw2LDYsMD46IENvc3QgMyB2ZXh0MyBMSFMsIDw2LDYsMCwxPgorICAyNzI0MjcwODU2VSwJLy8gPDMsNiw2LDE+OiBDb3N0IDMgdmV4dDMgPDYsNiwxLDM+LCA8Niw2LDEsMz4KKyAgMjYyNDgxOTcwNlUsCS8vIDwzLDYsNiwyPjogQ29zdCAzIHZleHQyIDwxLDIsMyw2PiwgPDYsMiw3LDM+CisgIDM2NTYyMjMyMzRVLAkvLyA8Myw2LDYsMz46IENvc3QgNCB2ZXh0MSA8NSwzLDYsNj4sIDwzLDQsNSw2PgorICAyNzMyOTcwNzg4VSwJLy8gPDMsNiw2LDQ+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Niw2LDQsND4KKyAgMjczMjk3MDgwMFUsCS8vIDwzLDYsNiw1PjogQ29zdCAzIHZleHQzIExIUywgPDYsNiw1LDc+CisgIDE2NTkyMjg5ODRVLAkvLyA8Myw2LDYsNj46IENvc3QgMiB2ZXh0MyBMSFMsIDw2LDYsNiw2PgorICAxNjU5MjI4OTk0VSwJLy8gPDMsNiw2LDc+OiBDb3N0IDIgdmV4dDMgTEhTLCA8Niw2LDcsNz4KKyAgMTY1OTIyOTAwM1UsCS8vIDwzLDYsNix1PjogQ29zdCAyIHZleHQzIExIUywgPDYsNix1LDc+CisgIDE2NTkyMjkwMDZVLAkvLyA8Myw2LDcsMD46IENvc3QgMiB2ZXh0MyBMSFMsIDw2LDcsMCwxPgorICAyNTU4NjAwMjAxVSwJLy8gPDMsNiw3LDE+OiBDb3N0IDMgdmV4dDEgPDEsMyw2LDc+LCA8MSwzLDYsNz4KKyAgMjU1ODYwMTE0NlUsCS8vIDwzLDYsNywyPjogQ29zdCAzIHZleHQxIDwxLDMsNiw3PiwgPDIsNiwzLDc+CisgIDI3MjUwODE5NjNVLAkvLyA8Myw2LDcsMz46IENvc3QgMyB2ZXh0MyA8Niw3LDMsMz4sIDw2LDcsMywzPgorICAxNjU5MjI5MDQ2VSwJLy8gPDMsNiw3LDQ+OiBDb3N0IDIgdmV4dDMgTEhTLCA8Niw3LDQsNT4KKyAgMjcxNTQyMzYxMVUsCS8vIDwzLDYsNyw1PjogQ29zdCAzIHZleHQzIDw1LDEsNywzPiwgPDYsNyw1LDE+CisgIDI3MjIwNTkxNDFVLAkvLyA8Myw2LDcsNj46IENvc3QgMyB2ZXh0MyA8NiwyLDcsMz4sIDw2LDcsNiwyPgorICAyOTYyMzYxNjU0VSwJLy8gPDMsNiw3LDc+OiBDb3N0IDMgdnppcHIgPDEsNSwzLDc+LCBSSFMKKyAgMTY1OTIyOTA3OFUsCS8vIDwzLDYsNyx1PjogQ29zdCAyIHZleHQzIExIUywgPDYsNyx1LDE+CisgIDE2NTkyMjkwODdVLAkvLyA8Myw2LHUsMD46IENvc3QgMiB2ZXh0MyBMSFMsIDw2LHUsMCwxPgorICAyNjg5ODQwMDQxVSwJLy8gPDMsNix1LDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Nix1LDEsMj4KKyAgMjU1ODYwOTMzOVUsCS8vIDwzLDYsdSwyPjogQ29zdCAzIHZleHQxIDwxLDMsNix1PiwgPDIsNiwzLHU+CisgIDI1NzY1MjU4NTNVLAkvLyA8Myw2LHUsMz46IENvc3QgMyB2ZXh0MSA8NCwzLDYsdT4sIDwzLDQsdSw2PgorICAxNjU5MjI5MTI3VSwJLy8gPDMsNix1LDQ+OiBDb3N0IDIgdmV4dDMgTEhTLCA8Nix1LDQsNT4KKyAgMjY4OTg0MDA4MVUsCS8vIDwzLDYsdSw1PjogQ29zdCAzIHZleHQzIExIUywgPDYsdSw1LDY+CisgIDE2NTkyMjg5ODRVLAkvLyA8Myw2LHUsNj46IENvc3QgMiB2ZXh0MyBMSFMsIDw2LDYsNiw2PgorICAxNjUyMjk4NzIwVSwJLy8gPDMsNix1LDc+OiBDb3N0IDIgdmV4dDMgPDYsdSw3LDM+LCA8Nix1LDcsMz4KKyAgMTY1OTIyOTE1OVUsCS8vIDwzLDYsdSx1PjogQ29zdCAyIHZleHQzIExIUywgPDYsdSx1LDE+CisgIDI2MjY4MTM5NTJVLAkvLyA8Myw3LDAsMD46IENvc3QgMyB2ZXh0MiA8MSw1LDMsNz4sIDwwLDAsMCwwPgorICAxNTUzMDcyMjMwVSwJLy8gPDMsNywwLDE+OiBDb3N0IDIgdmV4dDIgPDEsNSwzLDc+LCBMSFMKKyAgMjYyNjgxNDExNlUsCS8vIDwzLDcsMCwyPjogQ29zdCAzIHZleHQyIDwxLDUsMyw3PiwgPDAsMiwwLDI+CisgIDM3MDA1NTYwMjhVLAkvLyA8Myw3LDAsMz46IENvc3QgNCB2ZXh0MiA8MSw1LDMsNz4sIDwwLDMsMSwwPgorICAyNjI2ODE0MjkwVSwJLy8gPDMsNywwLDQ+OiBDb3N0IDMgdmV4dDIgPDEsNSwzLDc+LCA8MCw0LDEsNT4KKyAgMjU4MjUwNzM3NVUsCS8vIDwzLDcsMCw1PjogQ29zdCAzIHZleHQxIDw1LDMsNywwPiwgPDUsMyw3LDA+CisgIDI1ODg0ODAwNzJVLAkvLyA8Myw3LDAsNj46IENvc3QgMyB2ZXh0MSA8NiwzLDcsMD4sIDw2LDMsNywwPgorICAyNzMyOTcxMDU1VSwJLy8gPDMsNywwLDc+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NywwLDcsMT4KKyAgMTU1MzA3Mjc5N1UsCS8vIDwzLDcsMCx1PjogQ29zdCAyIHZleHQyIDwxLDUsMyw3PiwgTEhTCisgIDI2MjY4MTQ3MTBVLAkvLyA8Myw3LDEsMD46IENvc3QgMyB2ZXh0MiA8MSw1LDMsNz4sIDwxLDAsMywyPgorICAyNjI2ODE0NzcyVSwJLy8gPDMsNywxLDE+OiBDb3N0IDMgdmV4dDIgPDEsNSwzLDc+LCA8MSwxLDEsMT4KKyAgMjYyNjgxNDg3MFUsCS8vIDwzLDcsMSwyPjogQ29zdCAzIHZleHQyIDwxLDUsMyw3PiwgPDEsMiwzLDA+CisgIDI2MjU0ODc4NTRVLAkvLyA8Myw3LDEsMz46IENvc3QgMyB2ZXh0MiA8MSwzLDMsNz4sIDwxLDMsMyw3PgorICAyNTgyNTE0OTk4VSwJLy8gPDMsNywxLDQ+OiBDb3N0IDMgdmV4dDEgPDUsMyw3LDE+LCBSSFMKKyAgMTU1MzA3MzI5NlUsCS8vIDwzLDcsMSw1PjogQ29zdCAyIHZleHQyIDwxLDUsMyw3PiwgPDEsNSwzLDc+CisgIDI2Mjc0Nzg3NTNVLAkvLyA8Myw3LDEsNj46IENvc3QgMyB2ZXh0MiA8MSw2LDMsNz4sIDwxLDYsMyw3PgorICAyNzI3MzY3ODEwVSwJLy8gPDMsNywxLDc+OiBDb3N0IDMgdmV4dDMgPDcsMSw3LDM+LCA8NywxLDcsMz4KKyAgMTU1NTA2NDE5NVUsCS8vIDwzLDcsMSx1PjogQ29zdCAyIHZleHQyIDwxLHUsMyw3PiwgPDEsdSwzLDc+CisgIDI1ODg0OTE4NzhVLAkvLyA8Myw3LDIsMD46IENvc3QgMyB2ZXh0MSA8NiwzLDcsMj4sIExIUworICAzNzAwNTU3MzE4VSwJLy8gPDMsNywyLDE+OiBDb3N0IDQgdmV4dDIgPDEsNSwzLDc+LCA8MiwxLDAsMz4KKyAgMjYyNjgxNTU5MlUsCS8vIDwzLDcsMiwyPjogQ29zdCAzIHZleHQyIDwxLDUsMyw3PiwgPDIsMiwyLDI+CisgIDI2MjY4MTU2NTRVLAkvLyA8Myw3LDIsMz46IENvc3QgMyB2ZXh0MiA8MSw1LDMsNz4sIDwyLDMsMCwxPgorICAyNTg4NDk1MTU4VSwJLy8gPDMsNywyLDQ+OiBDb3N0IDMgdmV4dDEgPDYsMyw3LDI+LCBSSFMKKyAgMjYzMjc4NzgxN1UsCS8vIDwzLDcsMiw1PjogQ29zdCAzIHZleHQyIDwyLDUsMyw3PiwgPDIsNSwzLDc+CisgIDE1NTk3MDk2MjZVLAkvLyA8Myw3LDIsNj46IENvc3QgMiB2ZXh0MiA8Miw2LDMsNz4sIDwyLDYsMyw3PgorICAyNzI4MDMxNDQzVSwJLy8gPDMsNywyLDc+OiBDb3N0IDMgdmV4dDMgPDcsMiw3LDM+LCA8NywyLDcsMz4KKyAgMTU2MTAzNjg5MlUsCS8vIDwzLDcsMix1PjogQ29zdCAyIHZleHQyIDwyLHUsMyw3PiwgPDIsdSwzLDc+CisgIDI2MjY4MTYxNTBVLAkvLyA8Myw3LDMsMD46IENvc3QgMyB2ZXh0MiA8MSw1LDMsNz4sIDwzLDAsMSwyPgorICAyNjI2ODE2MjY4VSwJLy8gPDMsNywzLDE+OiBDb3N0IDMgdmV4dDIgPDEsNSwzLDc+LCA8MywxLDUsMz4KKyAgMjYzMzQ1MTg3OFUsCS8vIDwzLDcsMywyPjogQ29zdCAzIHZleHQyIDwyLDYsMyw3PiwgPDMsMiw2LDM+CisgIDI2MjY4MTY0MTJVLAkvLyA8Myw3LDMsMz46IENvc3QgMyB2ZXh0MiA8MSw1LDMsNz4sIDwzLDMsMywzPgorICAyNjI2ODE2NTE0VSwJLy8gPDMsNywzLDQ+OiBDb3N0IDMgdmV4dDIgPDEsNSwzLDc+LCA8Myw0LDUsNj4KKyAgMjYzODc2MDUxNFUsCS8vIDwzLDcsMyw1PjogQ29zdCAzIHZleHQyIDwzLDUsMyw3PiwgPDMsNSwzLDc+CisgIDI2Mzk0MjQxNDdVLAkvLyA8Myw3LDMsNj46IENvc3QgMyB2ZXh0MiA8Myw2LDMsNz4sIDwzLDYsMyw3PgorICAyODI2OTYxOTIwVSwJLy8gPDMsNywzLDc+OiBDb3N0IDMgdnV6cHIgPDEsMyw1LDc+LCA8MSwzLDUsNz4KKyAgMjYyNjgxNjc5OFUsCS8vIDwzLDcsMyx1PjogQ29zdCAzIHZleHQyIDwxLDUsMyw3PiwgPDMsdSwxLDI+CisgIDI1ODI1MzYyOTRVLAkvLyA8Myw3LDQsMD46IENvc3QgMyB2ZXh0MSA8NSwzLDcsND4sIExIUworICAyNTgyNTM3MzYwVSwJLy8gPDMsNyw0LDE+OiBDb3N0IDMgdmV4dDEgPDUsMyw3LDQ+LCA8MSw1LDMsNz4KKyAgMjU4ODUxMDEzOFUsCS8vIDwzLDcsNCwyPjogQ29zdCAzIHZleHQxIDw2LDMsNyw0PiwgPDIsNiwzLDc+CisgIDM3MDA1NTg5OTZVLAkvLyA8Myw3LDQsMz46IENvc3QgNCB2ZXh0MiA8MSw1LDMsNz4sIDw0LDMsNiw3PgorICAyNTgyNTM5NTc0VSwJLy8gPDMsNyw0LDQ+OiBDb3N0IDMgdmV4dDEgPDUsMyw3LDQ+LCBSSFMKKyAgMTU1MzA3NTUxMFUsCS8vIDwzLDcsNCw1PjogQ29zdCAyIHZleHQyIDwxLDUsMyw3PiwgUkhTCisgIDI1ODg1MTI4NDRVLAkvLyA8Myw3LDQsNj46IENvc3QgMyB2ZXh0MSA8NiwzLDcsND4sIDw2LDMsNyw0PgorICAyNTY0NjI1NzY2VSwJLy8gPDMsNyw0LDc+OiBDb3N0IDMgdmV4dDEgPDIsMyw3LDQ+LCA8Nyw0LDUsNj4KKyAgMTU1MzA3NTc1M1UsCS8vIDwzLDcsNCx1PjogQ29zdCAyIHZleHQyIDwxLDUsMyw3PiwgUkhTCisgIDI3MzI5NzEzOThVLAkvLyA8Myw3LDUsMD46IENvc3QgMyB2ZXh0MyBMSFMsIDw3LDUsMCwyPgorICAyNjI2ODE3NzQ0VSwJLy8gPDMsNyw1LDE+OiBDb3N0IDMgdmV4dDIgPDEsNSwzLDc+LCA8NSwxLDcsMz4KKyAgMzcwMDU1OTY0OVUsCS8vIDwzLDcsNSwyPjogQ29zdCA0IHZleHQyIDwxLDUsMyw3PiwgPDUsMiw3LDM+CisgIDI2MjY4MTc5MDNVLAkvLyA8Myw3LDUsMz46IENvc3QgMyB2ZXh0MiA8MSw1LDMsNz4sIDw1LDMsNywwPgorICAyMjU4NzI4MjAzVSwJLy8gPDMsNyw1LDQ+OiBDb3N0IDMgdnJldiA8NywzLDQsNT4KKyAgMjczMjk3MTQ0NlUsCS8vIDwzLDcsNSw1PjogQ29zdCAzIHZleHQzIExIUywgPDcsNSw1LDU+CisgIDI3MzI5NzE0NTdVLAkvLyA8Myw3LDUsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDw3LDUsNiw3PgorICAyODI2OTY0Mjc4VSwJLy8gPDMsNyw1LDc+OiBDb3N0IDMgdnV6cHIgPDEsMyw1LDc+LCBSSFMKKyAgMjgyNjk2NDI3OVUsCS8vIDwzLDcsNSx1PjogQ29zdCAzIHZ1enByIDwxLDMsNSw3PiwgUkhTCisgIDI3MzI5NzE0NzhVLAkvLyA8Myw3LDYsMD46IENvc3QgMyB2ZXh0MyBMSFMsIDw3LDYsMCwxPgorICAyNzMyOTcxNDg2VSwJLy8gPDMsNyw2LDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Nyw2LDEsMD4KKyAgMjYzMzQ1NDA3NFUsCS8vIDwzLDcsNiwyPjogQ29zdCAzIHZleHQyIDwyLDYsMyw3PiwgPDYsMiw3LDM+CisgIDI2MzM0NTQxNTJVLAkvLyA8Myw3LDYsMz46IENvc3QgMyB2ZXh0MiA8Miw2LDMsNz4sIDw2LDMsNywwPgorICAyNzMyOTcxNTE4VSwJLy8gPDMsNyw2LDQ+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Nyw2LDQsNT4KKyAgMjczMjk3MTUyNlUsCS8vIDwzLDcsNiw1PjogQ29zdCAzIHZleHQzIExIUywgPDcsNiw1LDQ+CisgIDI3MzI5NzE1MzdVLAkvLyA8Myw3LDYsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDw3LDYsNiw2PgorICAyNzMyOTcxNTQwVSwJLy8gPDMsNyw2LDc+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Nyw2LDcsMD4KKyAgMjcyNjA0MTEyNFUsCS8vIDwzLDcsNix1PjogQ29zdCAzIHZleHQzIDw2LHUsNywzPiwgPDcsNix1LDc+CisgIDI1NzA2MTY5MzRVLAkvLyA8Myw3LDcsMD46IENvc3QgMyB2ZXh0MSA8MywzLDcsNz4sIExIUworICAyNTcwNjE3ODU2VSwJLy8gPDMsNyw3LDE+OiBDb3N0IDMgdmV4dDEgPDMsMyw3LDc+LCA8MSwzLDUsNz4KKyAgMjU2NDY0NjYzNVUsCS8vIDwzLDcsNywyPjogQ29zdCAzIHZleHQxIDwyLDMsNyw3PiwgPDIsMyw3LDc+CisgIDI1NzA2MTkzMzJVLAkvLyA8Myw3LDcsMz46IENvc3QgMyB2ZXh0MSA8MywzLDcsNz4sIDwzLDMsNyw3PgorICAyNTcwNjIwMjE0VSwJLy8gPDMsNyw3LDQ+OiBDb3N0IDMgdmV4dDEgPDMsMyw3LDc+LCBSSFMKKyAgMjU4MjU2NDcyNlUsCS8vIDwzLDcsNyw1PjogQ29zdCAzIHZleHQxIDw1LDMsNyw3PiwgPDUsMyw3LDc+CisgIDI1ODg1Mzc0MjNVLAkvLyA8Myw3LDcsNj46IENvc3QgMyB2ZXh0MSA8NiwzLDcsNz4sIDw2LDMsNyw3PgorICAxNjU5MjI5ODA0VSwJLy8gPDMsNyw3LDc+OiBDb3N0IDIgdmV4dDMgTEhTLCA8Nyw3LDcsNz4KKyAgMTY1OTIyOTgwNFUsCS8vIDwzLDcsNyx1PjogQ29zdCAyIHZleHQzIExIUywgPDcsNyw3LDc+CisgIDI2MjY4MTk3OTVVLAkvLyA8Myw3LHUsMD46IENvc3QgMyB2ZXh0MiA8MSw1LDMsNz4sIDx1LDAsMSwyPgorICAxNTUzMDc4MDYyVSwJLy8gPDMsNyx1LDE+OiBDb3N0IDIgdmV4dDIgPDEsNSwzLDc+LCBMSFMKKyAgMjYyNjgxOTk3M1UsCS8vIDwzLDcsdSwyPjogQ29zdCAzIHZleHQyIDwxLDUsMyw3PiwgPHUsMiwzLDA+CisgIDI4MjY5NjE1NjVVLAkvLyA8Myw3LHUsMz46IENvc3QgMyB2dXpwciA8MSwzLDUsNz4sIExIUworICAyNjI2ODIwMTU5VSwJLy8gPDMsNyx1LDQ+OiBDb3N0IDMgdmV4dDIgPDEsNSwzLDc+LCA8dSw0LDUsNj4KKyAgMTU1MzA3ODQyNlUsCS8vIDwzLDcsdSw1PjogQ29zdCAyIHZleHQyIDwxLDUsMyw3PiwgUkhTCisgIDE1OTU1NDU4MDhVLAkvLyA8Myw3LHUsNj46IENvc3QgMiB2ZXh0MiA8dSw2LDMsNz4sIDx1LDYsMyw3PgorICAxNjU5MjI5ODA0VSwJLy8gPDMsNyx1LDc+OiBDb3N0IDIgdmV4dDMgTEhTLCA8Nyw3LDcsNz4KKyAgMTU1MzA3ODYyOVUsCS8vIDwzLDcsdSx1PjogQ29zdCAyIHZleHQyIDwxLDUsMyw3PiwgTEhTCisgIDE2MTE0NDgzMjBVLAkvLyA8Myx1LDAsMD46IENvc3QgMiB2ZXh0MyBMSFMsIDwwLDAsMCwwPgorICAxNjExODk2NTMxVSwJLy8gPDMsdSwwLDE+OiBDb3N0IDIgdmV4dDMgTEhTLCA8dSwwLDEsMj4KKyAgMTY1OTY3MjI4NFUsCS8vIDwzLHUsMCwyPjogQ29zdCAyIHZleHQzIExIUywgPHUsMCwyLDI+CisgIDE2MTYwOTkwNDVVLAkvLyA8Myx1LDAsMz46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDAsMywyPgorICAyNjg1NjM4MzgxVSwJLy8gPDMsdSwwLDQ+OiBDb3N0IDMgdmV4dDMgTEhTLCA8dSwwLDQsMT4KKyAgMTY2Mzg3NDgwNlUsCS8vIDwzLHUsMCw1PjogQ29zdCAyIHZleHQzIExIUywgPHUsMCw1LDE+CisgIDE2NjM4NzQ4MTZVLAkvLyA8Myx1LDAsNj46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDAsNiwyPgorICAyOTYwMzEzNjcyVSwJLy8gPDMsdSwwLDc+OiBDb3N0IDMgdnppcHIgPDEsMiwzLDA+LCBSSFMKKyAgMTYxMTg5NjU5NFUsCS8vIDwzLHUsMCx1PjogQ29zdCAyIHZleHQzIExIUywgPHUsMCx1LDI+CisgIDE1NDk3NjMzMjRVLAkvLyA8Myx1LDEsMD46IENvc3QgMiB2ZXh0MiA8MSwwLDMsdT4sIDwxLDAsMyx1PgorICAxNTUwNDI2OTU3VSwJLy8gPDMsdSwxLDE+OiBDb3N0IDIgdmV4dDIgPDEsMSwzLHU+LCA8MSwxLDMsdT4KKyAgNTM3NzEyNDMwVSwJLy8gPDMsdSwxLDI+OiBDb3N0IDEgdmV4dDMgTEhTLCBMSFMKKyAgMTYxNjU0MTQ5NVUsCS8vIDwzLHUsMSwzPjogQ29zdCAyIHZleHQzIExIUywgPHUsMSwzLDM+CisgIDE0OTA5MzA5OThVLAkvLyA8Myx1LDEsND46IENvc3QgMiB2ZXh0MSA8MiwzLHUsMT4sIFJIUworICAxNTUzMDgxNDg5VSwJLy8gPDMsdSwxLDU+OiBDb3N0IDIgdmV4dDIgPDEsNSwzLHU+LCA8MSw1LDMsdT4KKyAgMjYyNzQ4Njk0NlUsCS8vIDwzLHUsMSw2PjogQ29zdCAzIHZleHQyIDwxLDYsMyx1PiwgPDEsNiwzLHU+CisgIDE2NTkyMzAwNDNVLAkvLyA8Myx1LDEsNz46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDEsNywzPgorICA1Mzc3MTI0ODRVLAkvLyA8Myx1LDEsdT46IENvc3QgMSB2ZXh0MyBMSFMsIExIUworICAxNjExODkwODUyVSwJLy8gPDMsdSwyLDA+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MCwyLDAsMj4KKyAgMjYyNDgzMzEwMlUsCS8vIDwzLHUsMiwxPjogQ29zdCAzIHZleHQyIDwxLDIsMyx1PiwgPDIsMSx1LDM+CisgIDE1NTcwNjMyODdVLAkvLyA8Myx1LDIsMj46IENvc3QgMiB2ZXh0MiA8MiwyLDMsdT4sIDwyLDIsMyx1PgorICAxNjE2MDk5MjA1VSwJLy8gPDMsdSwyLDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8dSwyLDMsMD4KKyAgMTYxMTg5MDg5MlUsCS8vIDwzLHUsMiw0PjogQ29zdCAyIHZleHQzIExIUywgPDAsMiw0LDY+CisgIDI2ODk4NDEwNTRVLAkvLyA8Myx1LDIsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDx1LDIsNSw3PgorICAxNTU5NzE3ODE5VSwJLy8gPDMsdSwyLDY+OiBDb3N0IDIgdmV4dDIgPDIsNiwzLHU+LCA8Miw2LDMsdT4KKyAgMTY1OTIzMDEyNFUsCS8vIDwzLHUsMiw3PjogQ29zdCAyIHZleHQzIExIUywgPHUsMiw3LDM+CisgIDE2MTY1NDE2MThVLAkvLyA8Myx1LDIsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDIsdSwwPgorICAxNjExODk2NzY0VSwJLy8gPDMsdSwzLDA+OiBDb3N0IDIgdmV4dDMgTEhTLCA8dSwzLDAsMT4KKyAgMTQ4NDk3MzA3OVUsCS8vIDwzLHUsMywxPjogQ29zdCAyIHZleHQxIDwxLDMsdSwzPiwgPDEsMyx1LDM+CisgIDI2ODU2Mzg2MDdVLAkvLyA8Myx1LDMsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDx1LDMsMiwyPgorICAzMzYzODAwMDZVLAkvLyA8Myx1LDMsMz46IENvc3QgMSB2ZHVwMyBMSFMKKyAgMTYxMTg5NjgwNFUsCS8vIDwzLHUsMyw0PjogQ29zdCAyIHZleHQzIExIUywgPHUsMyw0LDU+CisgIDE2MTY1NDE2NzlVLAkvLyA8Myx1LDMsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDMsNSw3PgorICAyNjkwMjgzNTEyVSwJLy8gPDMsdSwzLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8dSwzLDYsNz4KKyAgMjk1OTY3NDY5NlUsCS8vIDwzLHUsMyw3PjogQ29zdCAzIHZ6aXByIDwxLDEsMywzPiwgUkhTCisgIDMzNjM4MDAwNlUsCS8vIDwzLHUsMyx1PjogQ29zdCAxIHZkdXAzIExIUworICAyNTU4NzIyMTUwVSwJLy8gPDMsdSw0LDA+OiBDb3N0IDMgdmV4dDEgPDEsMyx1LDQ+LCBMSFMKKyAgMTY1OTY3MjYwMlUsCS8vIDwzLHUsNCwxPjogQ29zdCAyIHZleHQzIExIUywgPHUsNCwxLDU+CisgIDE2NTk2NzI2MTJVLAkvLyA8Myx1LDQsMj46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDQsMiw2PgorICAyNjg5ODQxMTk2VSwJLy8gPDMsdSw0LDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8dSw0LDMsNT4KKyAgMTY1OTIyNzM0NFUsCS8vIDwzLHUsNCw0PjogQ29zdCAyIHZleHQzIExIUywgPDQsNCw0LDQ+CisgIDE2MTE4OTY4OTVVLAkvLyA8Myx1LDQsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDQsNSw2PgorICAxNjYzODc1MTQ0VSwJLy8gPDMsdSw0LDY+OiBDb3N0IDIgdmV4dDMgTEhTLCA8dSw0LDYsNj4KKyAgMTY1OTIzMDI4OVUsCS8vIDwzLHUsNCw3PjogQ29zdCAyIHZleHQzIExIUywgPHUsNCw3LDY+CisgIDE2MTE4OTY5MjJVLAkvLyA8Myx1LDQsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDQsdSw2PgorICAxNDkwOTYwNDg2VSwJLy8gPDMsdSw1LDA+OiBDb3N0IDIgdmV4dDEgPDIsMyx1LDU+LCBMSFMKKyAgMjY4OTg0MTI2MVUsCS8vIDwzLHUsNSwxPjogQ29zdCAzIHZleHQzIExIUywgPHUsNSwxLDc+CisgIDE0OTA5NjIxNjJVLAkvLyA8Myx1LDUsMj46IENvc3QgMiB2ZXh0MSA8MiwzLHUsNT4sIDwyLDMsdSw1PgorICAxNjE2NTQxODIzVSwJLy8gPDMsdSw1LDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8dSw1LDMsNz4KKyAgMTQ5MDk2Mzc2NlUsCS8vIDwzLHUsNSw0PjogQ29zdCAyIHZleHQxIDwyLDMsdSw1PiwgUkhTCisgIDE2NTkyMjgxNjRVLAkvLyA8Myx1LDUsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDw1LDUsNSw1PgorICA1Mzc3MTI3OTRVLAkvLyA8Myx1LDUsNj46IENvc3QgMSB2ZXh0MyBMSFMsIFJIUworICAxNjU5MjMwMzcxVSwJLy8gPDMsdSw1LDc+OiBDb3N0IDIgdmV4dDMgTEhTLCA8dSw1LDcsNz4KKyAgNTM3NzEyODEyVSwJLy8gPDMsdSw1LHU+OiBDb3N0IDEgdmV4dDMgTEhTLCBSSFMKKyAgMjY4OTg0MTMyN1UsCS8vIDwzLHUsNiwwPjogQ29zdCAzIHZleHQzIExIUywgPHUsNiwwLDE+CisgIDI1NTg3Mzk0ODJVLAkvLyA8Myx1LDYsMT46IENvc3QgMyB2ZXh0MSA8MSwzLHUsNj4sIDwxLDMsdSw2PgorICAyNjg5ODQxMzUxVSwJLy8gPDMsdSw2LDI+OiBDb3N0IDMgdmV4dDMgTEhTLCA8dSw2LDIsNz4KKyAgMTYxNjA5OTUzNlUsCS8vIDwzLHUsNiwzPjogQ29zdCAyIHZleHQzIExIUywgPHUsNiwzLDc+CisgIDE2NTkyMjc1MDhVLAkvLyA8Myx1LDYsND46IENvc3QgMiB2ZXh0MyBMSFMsIDw0LDYsNCw2PgorICAyNjkwMjgzNzQ2VSwJLy8gPDMsdSw2LDU+OiBDb3N0IDMgdmV4dDMgTEhTLCA8dSw2LDUsNz4KKyAgMTY1OTIyODk4NFUsCS8vIDwzLHUsNiw2PjogQ29zdCAyIHZleHQzIExIUywgPDYsNiw2LDY+CisgIDE2NTkyMzA0NDVVLAkvLyA8Myx1LDYsNz46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDYsNywwPgorICAxNjE2MDk5NTgxVSwJLy8gPDMsdSw2LHU+OiBDb3N0IDIgdmV4dDMgTEhTLCA8dSw2LHUsNz4KKyAgMTQ4NTAwNDkwMlUsCS8vIDwzLHUsNywwPjogQ29zdCAyIHZleHQxIDwxLDMsdSw3PiwgTEhTCisgIDE0ODUwMDU4NTFVLAkvLyA8Myx1LDcsMT46IENvc3QgMiB2ZXh0MSA8MSwzLHUsNz4sIDwxLDMsdSw3PgorICAyNTU4NzQ4MjY0VSwJLy8gPDMsdSw3LDI+OiBDb3N0IDMgdmV4dDEgPDEsMyx1LDc+LCA8MiwyLDIsMj4KKyAgMzA5NTM5NzAyMVUsCS8vIDwzLHUsNywzPjogQ29zdCAzIHZ0cm5yIDwxLDMsNSw3PiwgTEhTCisgIDE0ODUwMDgxODJVLAkvLyA8Myx1LDcsND46IENvc3QgMiB2ZXh0MSA8MSwzLHUsNz4sIFJIUworICAxNjU5MjI4MzI4VSwJLy8gPDMsdSw3LDU+OiBDb3N0IDIgdmV4dDMgTEhTLCA8NSw3LDUsNz4KKyAgMjcyMjA2MDU5OVUsCS8vIDwzLHUsNyw2PjogQ29zdCAzIHZleHQzIDw2LDIsNywzPiwgPHUsNyw2LDI+CisgIDE2NTkyMjk4MDRVLAkvLyA8Myx1LDcsNz46IENvc3QgMiB2ZXh0MyBMSFMsIDw3LDcsNyw3PgorICAxNDg1MDEwNzM0VSwJLy8gPDMsdSw3LHU+OiBDb3N0IDIgdmV4dDEgPDEsMyx1LDc+LCBMSFMKKyAgMTYxNjA5OTY2NVUsCS8vIDwzLHUsdSwwPjogQ29zdCAyIHZleHQzIExIUywgPHUsdSwwLDE+CisgIDE2MTE4OTcxNzlVLAkvLyA8Myx1LHUsMT46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LHUsMSwyPgorICA1Mzc3MTI5OTdVLAkvLyA8Myx1LHUsMj46IENvc3QgMSB2ZXh0MyBMSFMsIExIUworICAzMzYzODAwMDZVLAkvLyA8Myx1LHUsMz46IENvc3QgMSB2ZHVwMyBMSFMKKyAgMTYxNjA5OTcwNVUsCS8vIDwzLHUsdSw0PjogQ29zdCAyIHZleHQzIExIUywgPHUsdSw0LDU+CisgIDE2MTE4OTcyMTlVLAkvLyA8Myx1LHUsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LHUsNSw2PgorICA1Mzc3MTMwMzdVLAkvLyA8Myx1LHUsNj46IENvc3QgMSB2ZXh0MyBMSFMsIFJIUworICAxNjU5MjMwNjA3VSwJLy8gPDMsdSx1LDc+OiBDb3N0IDIgdmV4dDMgTEhTLCA8dSx1LDcsMD4KKyAgNTM3NzEzMDUxVSwJLy8gPDMsdSx1LHU+OiBDb3N0IDEgdmV4dDMgTEhTLCBMSFMKKyAgMjY5MTkwNzU4NFUsCS8vIDw0LDAsMCwwPjogQ29zdCAzIHZleHQzIDwxLDIsMyw0PiwgPDAsMCwwLDA+CisgIDI2OTE5MDc1OTRVLAkvLyA8NCwwLDAsMT46IENvc3QgMyB2ZXh0MyA8MSwyLDMsND4sIDwwLDAsMSwxPgorICAyNjkxOTA3NjA0VSwJLy8gPDQsMCwwLDI+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MCwwLDIsMj4KKyAgMzcwOTg2MjE0NFUsCS8vIDw0LDAsMCwzPjogQ29zdCA0IHZleHQyIDwzLDEsNCwwPiwgPDAsMywxLDQ+CisgIDI2ODQ2ODIyODBVLAkvLyA8NCwwLDAsND46IENvc3QgMyB2ZXh0MyA8MCwwLDQsND4sIDwwLDAsNCw0PgorICAzNjk0NjAwNjMzVSwJLy8gPDQsMCwwLDU+OiBDb3N0IDQgdmV4dDIgPDAsNSw0LDA+LCA8MCw1LDQsMD4KKyAgMzI5MTQzMTI5MFUsCS8vIDw0LDAsMCw2PjogQ29zdCA0IHZyZXYgPDAsNCw2LDA+CisgIDM2NjgzNDIwNjdVLAkvLyA8NCwwLDAsNz46IENvc3QgNCB2ZXh0MSA8Nyw0LDAsMD4sIDw3LDQsMCwwPgorICAyNjkxOTA3NjU3VSwJLy8gPDQsMCwwLHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MCwwLHUsMT4KKyAgMjU3MDcxNTIzOFUsCS8vIDw0LDAsMSwwPjogQ29zdCAzIHZleHQxIDwzLDQsMCwxPiwgTEhTCisgIDI1NzA3MTYwNThVLAkvLyA8NCwwLDEsMT46IENvc3QgMyB2ZXh0MSA8Myw0LDAsMT4sIDwxLDIsMyw0PgorICAxNjE4MTY1ODYyVSwJLy8gPDQsMCwxLDI+OiBDb3N0IDIgdmV4dDMgPDEsMiwzLDQ+LCBMSFMKKyAgMjU3MDcxNzY0OFUsCS8vIDw0LDAsMSwzPjogQ29zdCAzIHZleHQxIDwzLDQsMCwxPiwgPDMsNCwwLDE+CisgIDI1NzA3MTg1MThVLAkvLyA8NCwwLDEsND46IENvc3QgMyB2ZXh0MSA8Myw0LDAsMT4sIFJIUworICAyNTk0NjA3MjA2VSwJLy8gPDQsMCwxLDU+OiBDb3N0IDMgdmV4dDEgPDcsNCwwLDE+LCA8NSw2LDcsND4KKyAgMzY2MjM3NzU2M1UsCS8vIDw0LDAsMSw2PjogQ29zdCA0IHZleHQxIDw2LDQsMCwxPiwgPDYsNCwwLDE+CisgIDI1OTQ2MDg0MzZVLAkvLyA8NCwwLDEsNz46IENvc3QgMyB2ZXh0MSA8Nyw0LDAsMT4sIDw3LDQsMCwxPgorICAxNjE4MTY1OTE2VSwJLy8gPDQsMCwxLHU+OiBDb3N0IDIgdmV4dDMgPDEsMiwzLDQ+LCBMSFMKKyAgMjY4NTcxNDU5OFUsCS8vIDw0LDAsMiwwPjogQ29zdCAzIHZleHQzIDwwLDIsMCw0PiwgPDAsMiwwLDQ+CisgIDM3NTk1MzAxNTlVLAkvLyA8NCwwLDIsMT46IENvc3QgNCB2ZXh0MyA8MCwyLDEsND4sIDwwLDIsMSw0PgorICAyNjg1ODYyMDcyVSwJLy8gPDQsMCwyLDI+OiBDb3N0IDMgdmV4dDMgPDAsMiwyLDQ+LCA8MCwyLDIsND4KKyAgMjYzMTQ3NjkzN1UsCS8vIDw0LDAsMiwzPjogQ29zdCAzIHZleHQyIDwyLDMsNCwwPiwgPDIsMyw0LDA+CisgIDI2ODU3MTQ2MzZVLAkvLyA8NCwwLDIsND46IENvc3QgMyB2ZXh0MyA8MCwyLDAsND4sIDwwLDIsNCw2PgorICAzNzY1NjQ5NjIyVSwJLy8gPDQsMCwyLDU+OiBDb3N0IDQgdmV4dDMgPDEsMiwzLDQ+LCA8MCwyLDUsNz4KKyAgMjY4NjE1NzAyMFUsCS8vIDw0LDAsMiw2PjogQ29zdCAzIHZleHQzIDwwLDIsNiw0PiwgPDAsMiw2LDQ+CisgIDM2NjgzNTg0NTNVLAkvLyA8NCwwLDIsNz46IENvc3QgNCB2ZXh0MSA8Nyw0LDAsMj4sIDw3LDQsMCwyPgorICAyNjg2MzA0NDk0VSwJLy8gPDQsMCwyLHU+OiBDb3N0IDMgdmV4dDMgPDAsMix1LDQ+LCA8MCwyLHUsND4KKyAgMzYzMjUyOTUxMFUsCS8vIDw0LDAsMywwPjogQ29zdCA0IHZleHQxIDwxLDQsMCwzPiwgTEhTCisgIDI2ODY0NTE5NjhVLAkvLyA8NCwwLDMsMT46IENvc3QgMyB2ZXh0MyA8MCwzLDEsND4sIDwwLDMsMSw0PgorICAyNjg2NTI1NzA1VSwJLy8gPDQsMCwzLDI+OiBDb3N0IDMgdmV4dDMgPDAsMywyLDQ+LCA8MCwzLDIsND4KKyAgMzc2MDM0MTI2NlUsCS8vIDw0LDAsMywzPjogQ29zdCA0IHZleHQzIDwwLDMsMyw0PiwgPDAsMywzLDQ+CisgIDM2MzI1MzI3OTBVLAkvLyA8NCwwLDMsND46IENvc3QgNCB2ZXh0MSA8MSw0LDAsMz4sIFJIUworICAzOTEzMjU0NjA2VSwJLy8gPDQsMCwzLDU+OiBDb3N0IDQgdnV6cHIgPDMsNCw1LDA+LCA8MiwzLDQsNT4KKyAgMzcwNTIxOTc0MFUsCS8vIDw0LDAsMyw2PjogQ29zdCA0IHZleHQyIDwyLDMsNCwwPiwgPDMsNiw0LDc+CisgIDM3MTM4NDU5OTBVLAkvLyA8NCwwLDMsNz46IENvc3QgNCB2ZXh0MiA8Myw3LDQsMD4sIDwzLDcsNCwwPgorICAyNjg2NDUxOTY4VSwJLy8gPDQsMCwzLHU+OiBDb3N0IDMgdmV4dDMgPDAsMywxLDQ+LCA8MCwzLDEsND4KKyAgMjU1MjgyMzkxMFUsCS8vIDw0LDAsNCwwPjogQ29zdCAzIHZleHQxIDwwLDQsMCw0PiwgTEhTCisgIDI2OTE5MDc5MjJVLAkvLyA8NCwwLDQsMT46IENvc3QgMyB2ZXh0MyA8MSwyLDMsND4sIDwwLDQsMSw1PgorICAyNjkxOTA3OTMyVSwJLy8gPDQsMCw0LDI+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MCw0LDIsNj4KKyAgMzYyNjU2NzgzMFUsCS8vIDw0LDAsNCwzPjogQ29zdCA0IHZleHQxIDwwLDQsMCw0PiwgPDMsMCwxLDI+CisgIDI1NTI4MjcxOTBVLAkvLyA8NCwwLDQsND46IENvc3QgMyB2ZXh0MSA8MCw0LDAsND4sIFJIUworICAyNjMxNDc4NTgyVSwJLy8gPDQsMCw0LDU+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDA+LCBSSFMKKyAgMzYyNjU3MDAxN1UsCS8vIDw0LDAsNCw2PjogQ29zdCA0IHZleHQxIDwwLDQsMCw0PiwgPDYsMCwxLDI+CisgIDM2NjgzNzQ4MzlVLAkvLyA8NCwwLDQsNz46IENvc3QgNCB2ZXh0MSA8Nyw0LDAsND4sIDw3LDQsMCw0PgorICAyNTUyODI5NzQyVSwJLy8gPDQsMCw0LHU+OiBDb3N0IDMgdmV4dDEgPDAsNCwwLDQ+LCBMSFMKKyAgMjU1ODgwNDA3MFUsCS8vIDw0LDAsNSwwPjogQ29zdCAzIHZleHQxIDwxLDQsMCw1PiwgTEhTCisgIDE4Mzk2NDQ3NzRVLAkvLyA8NCwwLDUsMT46IENvc3QgMiB2emlwbCBSSFMsIExIUworICAyOTEzMzg2NjYwVSwJLy8gPDQsMCw1LDI+OiBDb3N0IDMgdnppcGwgUkhTLCA8MCwyLDAsMj4KKyAgMjU3MDc1MDQyMFUsCS8vIDw0LDAsNSwzPjogQ29zdCAzIHZleHQxIDwzLDQsMCw1PiwgPDMsNCwwLDU+CisgIDI1NTg4MDczNTBVLAkvLyA8NCwwLDUsND46IENvc3QgMyB2ZXh0MSA8MSw0LDAsNT4sIFJIUworICAzOTg3MTI4NzUwVSwJLy8gPDQsMCw1LDU+OiBDb3N0IDQgdnppcGwgUkhTLCA8MCw1LDIsNz4KKyAgMzk4NzEyODgyMlUsCS8vIDw0LDAsNSw2PjogQ29zdCA0IHZ6aXBsIFJIUywgPDAsNiwxLDc+CisgIDI1OTQ2NDEyMDhVLAkvLyA8NCwwLDUsNz46IENvc3QgMyB2ZXh0MSA8Nyw0LDAsNT4sIDw3LDQsMCw1PgorICAxODM5NjQ1MzQxVSwJLy8gPDQsMCw1LHU+OiBDb3N0IDIgdnppcGwgUkhTLCBMSFMKKyAgMjU1Mjg0MDI5NFUsCS8vIDw0LDAsNiwwPjogQ29zdCAzIHZleHQxIDwwLDQsMCw2PiwgTEhTCisgIDMwNDc2MDQyMzRVLAkvLyA8NCwwLDYsMT46IENvc3QgMyB2dHJubCBSSFMsIDwwLDAsMSwxPgorICAxOTczODYyNTAyVSwJLy8gPDQsMCw2LDI+OiBDb3N0IDIgdnRybmwgUkhTLCBMSFMKKyAgMjU3MDc1ODYxM1UsCS8vIDw0LDAsNiwzPjogQ29zdCAzIHZleHQxIDwzLDQsMCw2PiwgPDMsNCwwLDY+CisgIDI1NTI4NDM1NzRVLAkvLyA8NCwwLDYsND46IENvc3QgMyB2ZXh0MSA8MCw0LDAsNj4sIFJIUworICAyMjE3NjY0ODg3VSwJLy8gPDQsMCw2LDU+OiBDb3N0IDMgdnJldiA8MCw0LDUsNj4KKyAgMzY2MjQxODUyOFUsCS8vIDw0LDAsNiw2PjogQ29zdCA0IHZleHQxIDw2LDQsMCw2PiwgPDYsNCwwLDY+CisgIDI2NTgwMjIyNTdVLAkvLyA8NCwwLDYsNz46IENvc3QgMyB2ZXh0MiA8Niw3LDQsMD4sIDw2LDcsNCwwPgorICAxOTczODYyNTU2VSwJLy8gPDQsMCw2LHU+OiBDb3N0IDIgdnRybmwgUkhTLCBMSFMKKyAgMzczMTc2NDIxOFUsCS8vIDw0LDAsNywwPjogQ29zdCA0IHZleHQyIDw2LDcsNCwwPiwgPDcsMCwxLDI+CisgIDM5ODgzMjQ0NTRVLAkvLyA8NCwwLDcsMT46IENvc3QgNCB2emlwbCA8NCw3LDUsMD4sIExIUworICA0MTIyMDM0Mjc4VSwJLy8gPDQsMCw3LDI+OiBDb3N0IDQgdnRybmwgPDQsNiw3LDE+LCBMSFMKKyAgMzczNTA4MjI0NlUsCS8vIDw0LDAsNywzPjogQ29zdCA0IHZleHQyIDw3LDMsNCwwPiwgPDcsMyw0LDA+CisgIDM3MzE3NjQ1MzZVLAkvLyA8NCwwLDcsND46IENvc3QgNCB2ZXh0MiA8Niw3LDQsMD4sIDw3LDQsMCw1PgorICAzOTM3MTQ1NzE4VSwJLy8gPDQsMCw3LDU+OiBDb3N0IDQgdnV6cHIgPDcsNCw1LDA+LCA8Niw3LDQsNT4KKyAgMzczNzA3MzE0NVUsCS8vIDw0LDAsNyw2PjogQ29zdCA0IHZleHQyIDw3LDYsNCwwPiwgPDcsNiw0LDA+CisgIDM3MzE3NjQ4NDRVLAkvLyA8NCwwLDcsNz46IENvc3QgNCB2ZXh0MiA8Niw3LDQsMD4sIDw3LDcsNyw3PgorICA0MTIyMDM0MzMyVSwJLy8gPDQsMCw3LHU+OiBDb3N0IDQgdnRybmwgPDQsNiw3LDE+LCBMSFMKKyAgMjU1Mjg1NjY3OFUsCS8vIDw0LDAsdSwwPjogQ29zdCAzIHZleHQxIDwwLDQsMCx1PiwgTEhTCisgIDE4NDE2MzU0MzBVLAkvLyA8NCwwLHUsMT46IENvc3QgMiB2emlwbCBSSFMsIExIUworICAxNjE4MTY2NDI5VSwJLy8gPDQsMCx1LDI+OiBDb3N0IDIgdmV4dDMgPDEsMiwzLDQ+LCBMSFMKKyAgMjU3MDc3NDk5OVUsCS8vIDw0LDAsdSwzPjogQ29zdCAzIHZleHQxIDwzLDQsMCx1PiwgPDMsNCwwLHU+CisgIDI1NTI4NTk5NThVLAkvLyA8NCwwLHUsND46IENvc3QgMyB2ZXh0MSA8MCw0LDAsdT4sIFJIUworICAyNjMxNDgxNDk4VSwJLy8gPDQsMCx1LDU+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDA+LCBSSFMKKyAgMjY4NjE1NzAyMFUsCS8vIDw0LDAsdSw2PjogQ29zdCAzIHZleHQzIDwwLDIsNiw0PiwgPDAsMiw2LDQ+CisgIDI1OTQ2NjU3ODdVLAkvLyA8NCwwLHUsNz46IENvc3QgMyB2ZXh0MSA8Nyw0LDAsdT4sIDw3LDQsMCx1PgorICAxNjE4MTY2NDgzVSwJLy8gPDQsMCx1LHU+OiBDb3N0IDIgdmV4dDMgPDEsMiwzLDQ+LCBMSFMKKyAgMjYxNzU0ODgzN1UsCS8vIDw0LDEsMCwwPjogQ29zdCAzIHZleHQyIDwwLDAsNCwxPiwgPDAsMCw0LDE+CisgIDI2MjI4NTczMThVLAkvLyA8NCwxLDAsMT46IENvc3QgMyB2ZXh0MiA8MCx1LDQsMT4sIExIUworICAzNjkzMjgxNDg0VSwJLy8gPDQsMSwwLDI+OiBDb3N0IDQgdmV4dDIgPDAsMyw0LDE+LCA8MCwyLDQsNj4KKyAgMjY5MTkwODM0MlUsCS8vIDw0LDEsMCwzPjogQ29zdCAzIHZleHQzIDwxLDIsMyw0PiwgPDEsMCwzLDI+CisgIDI2MjI4NTc1NTRVLAkvLyA8NCwxLDAsND46IENvc3QgMyB2ZXh0MiA8MCx1LDQsMT4sIDwwLDQsMSw1PgorICAzNzY0NDcwNTM4VSwJLy8gPDQsMSwwLDU+OiBDb3N0IDQgdmV4dDMgPDEsMCw1LDQ+LCA8MSwwLDUsND4KKyAgMzY5NTI3MjQ1OVUsCS8vIDw0LDEsMCw2PjogQ29zdCA0IHZleHQyIDwwLDYsNCwxPiwgPDAsNiw0LDE+CisgIDM3MzMwOTQ5ODBVLAkvLyA8NCwxLDAsNz46IENvc3QgNCB2ZXh0MiA8NywwLDQsMT4sIDwwLDcsMSw0PgorICAyNjIyODU3ODg1VSwJLy8gPDQsMSwwLHU+OiBDb3N0IDMgdmV4dDIgPDAsdSw0LDE+LCBMSFMKKyAgMzY5NjU5OTc5OFUsCS8vIDw0LDEsMSwwPjogQ29zdCA0IHZleHQyIDwwLHUsNCwxPiwgPDEsMCwzLDI+CisgIDI2OTEwOTczOTlVLAkvLyA8NCwxLDEsMT46IENvc3QgMyB2ZXh0MyA8MSwxLDEsND4sIDwxLDEsMSw0PgorICAyNjMxNDg0MzE0VSwJLy8gPDQsMSwxLDI+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDE+LCA8MSwyLDMsND4KKyAgMjY5MTkwODQyNFUsCS8vIDw0LDEsMSwzPjogQ29zdCAzIHZleHQzIDwxLDIsMyw0PiwgPDEsMSwzLDM+CisgIDM2OTY2MDAxMjVVLAkvLyA8NCwxLDEsND46IENvc3QgNCB2ZXh0MiA8MCx1LDQsMT4sIDwxLDQsMyw1PgorICAzNjk2NjAwMTc1VSwJLy8gPDQsMSwxLDU+OiBDb3N0IDQgdmV4dDIgPDAsdSw0LDE+LCA8MSw1LDAsMT4KKyAgMzY5NjYwMDMwN1UsCS8vIDw0LDEsMSw2PjogQ29zdCA0IHZleHQyIDwwLHUsNCwxPiwgPDEsNiw1LDc+CisgIDM2Njg0MjM5OTdVLAkvLyA8NCwxLDEsNz46IENvc3QgNCB2ZXh0MSA8Nyw0LDEsMT4sIDw3LDQsMSwxPgorICAyNjkxOTA4NDY5VSwJLy8gPDQsMSwxLHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MSwxLHUsMz4KKyAgMjU3MDc5NzE1OFUsCS8vIDw0LDEsMiwwPjogQ29zdCAzIHZleHQxIDwzLDQsMSwyPiwgTEhTCisgIDI1NzA3OTc5NzhVLAkvLyA8NCwxLDIsMT46IENvc3QgMyB2ZXh0MSA8Myw0LDEsMj4sIDwxLDIsMyw0PgorICAzNjk2NjAwNjgwVSwJLy8gPDQsMSwyLDI+OiBDb3N0IDQgdmV4dDIgPDAsdSw0LDE+LCA8MiwyLDIsMj4KKyAgMTYxODE2NjY4MlUsCS8vIDw0LDEsMiwzPjogQ29zdCAyIHZleHQzIDwxLDIsMyw0PiwgPDEsMiwzLDQ+CisgIDI1NzA4MDA0MzhVLAkvLyA8NCwxLDIsND46IENvc3QgMyB2ZXh0MSA8Myw0LDEsMj4sIFJIUworICAzNzY1NjUwMzQ3VSwJLy8gPDQsMSwyLDU+OiBDb3N0IDQgdmV4dDMgPDEsMiwzLDQ+LCA8MSwyLDUsMz4KKyAgMzY5NjYwMTAxOFUsCS8vIDw0LDEsMiw2PjogQ29zdCA0IHZleHQyIDwwLHUsNCwxPiwgPDIsNiwzLDc+CisgIDM2Njg0MzIxOTBVLAkvLyA8NCwxLDIsNz46IENvc3QgNCB2ZXh0MSA8Nyw0LDEsMj4sIDw3LDQsMSwyPgorICAxNjE4NTM1MzY3VSwJLy8gPDQsMSwyLHU+OiBDb3N0IDIgdmV4dDMgPDEsMix1LDQ+LCA8MSwyLHUsND4KKyAgMjU2NDgzMzM4MlUsCS8vIDw0LDEsMywwPjogQ29zdCAzIHZleHQxIDwyLDQsMSwzPiwgTEhTCisgIDI2OTE5MDg1NjhVLAkvLyA8NCwxLDMsMT46IENvc3QgMyB2ZXh0MyA8MSwyLDMsND4sIDwxLDMsMSwzPgorICAyNjkxOTA4NTc4VSwJLy8gPDQsMSwzLDI+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MSwzLDIsND4KKyAgMjY5MjU3MjEzOVUsCS8vIDw0LDEsMywzPjogQ29zdCAzIHZleHQzIDwxLDMsMyw0PiwgPDEsMywzLDQ+CisgIDI1NjQ4MzY2NjJVLAkvLyA8NCwxLDMsND46IENvc3QgMyB2ZXh0MSA8Miw0LDEsMz4sIFJIUworICAyNjkxOTA4NjA4VSwJLy8gPDQsMSwzLDU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MSwzLDUsNz4KKyAgMjU4ODcyNTg2MlUsCS8vIDw0LDEsMyw2PjogQ29zdCAzIHZleHQxIDw2LDQsMSwzPiwgPDYsNCwxLDM+CisgIDM2NjI0NjgwOTBVLAkvLyA8NCwxLDMsNz46IENvc3QgNCB2ZXh0MSA8Niw0LDEsMz4sIDw3LDAsMSwyPgorICAyNjkxOTA4NjMxVSwJLy8gPDQsMSwzLHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MSwzLHUsMz4KKyAgMzc2MDE5NDU5MFUsCS8vIDw0LDEsNCwwPjogQ29zdCA0IHZleHQzIDwwLDMsMSw0PiwgPDEsNCwwLDE+CisgIDM2OTM5NDc4NzRVLAkvLyA8NCwxLDQsMT46IENvc3QgNCB2ZXh0MiA8MCw0LDQsMT4sIDw0LDEsNSwwPgorICAzNzY1NjUwNDg0VSwJLy8gPDQsMSw0LDI+OiBDb3N0IDQgdmV4dDMgPDEsMiwzLDQ+LCA8MSw0LDIsNT4KKyAgMzExMzg3NzYwNlUsCS8vIDw0LDEsNCwzPjogQ29zdCAzIHZ0cm5yIDw0LDQsNCw0PiwgTEhTCisgIDM3NjAxOTQ2MzBVLAkvLyA8NCwxLDQsND46IENvc3QgNCB2ZXh0MyA8MCwzLDEsND4sIDwxLDQsNCw1PgorICAyNjIyODYwNTk4VSwJLy8gPDQsMSw0LDU+OiBDb3N0IDMgdmV4dDIgPDAsdSw0LDE+LCBSSFMKKyAgMzI5NzQzNjc1OVUsCS8vIDw0LDEsNCw2PjogQ29zdCA0IHZyZXYgPDEsNCw2LDQ+CisgIDM4MDAwMDc3NzJVLAkvLyA8NCwxLDQsNz46IENvc3QgNCB2ZXh0MyA8NywwLDEsND4sIDwxLDQsNywwPgorICAyNjIyODYwODQxVSwJLy8gPDQsMSw0LHU+OiBDb3N0IDMgdmV4dDIgPDAsdSw0LDE+LCBSSFMKKyAgMTQ3OTE2NDAwNlUsCS8vIDw0LDEsNSwwPjogQ29zdCAyIHZleHQxIDwwLDQsMSw1PiwgTEhTCisgIDI1NTI5MDY0ODZVLAkvLyA8NCwxLDUsMT46IENvc3QgMyB2ZXh0MSA8MCw0LDEsNT4sIDwxLDAsMywyPgorICAyNTUyOTA3Mjk5VSwJLy8gPDQsMSw1LDI+OiBDb3N0IDMgdmV4dDEgPDAsNCwxLDU+LCA8MiwxLDMsNT4KKyAgMjU1MjkwNzkyNlUsCS8vIDw0LDEsNSwzPjogQ29zdCAzIHZleHQxIDwwLDQsMSw1PiwgPDMsMCwxLDI+CisgIDE0NzkxNjcyODZVLAkvLyA8NCwxLDUsND46IENvc3QgMiB2ZXh0MSA8MCw0LDEsNT4sIFJIUworICAyOTEzMzg3NjY0VSwJLy8gPDQsMSw1LDU+OiBDb3N0IDMgdnppcGwgUkhTLCA8MSw1LDMsNz4KKyAgMjYwMDY4NjA3NFUsCS8vIDw0LDEsNSw2PjogQ29zdCAzIHZleHQxIDx1LDQsMSw1PiwgPDYsMiw3LDM+CisgIDI2MDA2ODY1ODZVLAkvLyA8NCwxLDUsNz46IENvc3QgMyB2ZXh0MSA8dSw0LDEsNT4sIDw3LDAsMSwyPgorICAxNDc5MTY5ODM4VSwJLy8gPDQsMSw1LHU+OiBDb3N0IDIgdmV4dDEgPDAsNCwxLDU+LCBMSFMKKyAgMjU1MjkxNDAyMlUsCS8vIDw0LDEsNiwwPjogQ29zdCAzIHZleHQxIDwwLDQsMSw2PiwgTEhTCisgIDI1NTg4ODY3MDhVLAkvLyA8NCwxLDYsMT46IENvc3QgMyB2ZXh0MSA8MSw0LDEsNj4sIDwxLDEsMSwxPgorICA0MDI4MjA1MjA2VSwJLy8gPDQsMSw2LDI+OiBDb3N0IDQgdnppcHIgPDAsMiw0LDY+LCA8MywwLDEsMj4KKyAgMzA4OTg1ODY2MlUsCS8vIDw0LDEsNiwzPjogQ29zdCAzIHZ0cm5yIDwwLDQsMiw2PiwgTEhTCisgIDI1NTI5MTczMDJVLAkvLyA8NCwxLDYsND46IENvc3QgMyB2ZXh0MSA8MCw0LDEsNj4sIFJIUworICAyMjIzNjM3NTg0VSwJLy8gPDQsMSw2LDU+OiBDb3N0IDMgdnJldiA8MSw0LDUsNj4KKyAgNDEyMTM0NzA4MVUsCS8vIDw0LDEsNiw2PjogQ29zdCA0IHZ0cm5sIFJIUywgPDEsMyw2LDc+CisgIDM3MjExNTU0MDZVLAkvLyA8NCwxLDYsNz46IENvc3QgNCB2ZXh0MiA8NSwwLDQsMT4sIDw2LDcsMCwxPgorICAyNTUyOTE5ODU0VSwJLy8gPDQsMSw2LHU+OiBDb3N0IDMgdmV4dDEgPDAsNCwxLDY+LCBMSFMKKyAgMjY1OTM1NzcxNlUsCS8vIDw0LDEsNywwPjogQ29zdCAzIHZleHQyIDw3LDAsNCwxPiwgPDcsMCw0LDE+CisgIDM3MzM3NjMxNzNVLAkvLyA8NCwxLDcsMT46IENvc3QgNCB2ZXh0MiA8NywxLDQsMT4sIDw3LDEsNCwxPgorICAzNzM0NDI2ODA2VSwJLy8gPDQsMSw3LDI+OiBDb3N0IDQgdmV4dDIgPDcsMiw0LDE+LCA8NywyLDQsMT4KKyAgMjY5NTIyNjY3MVUsCS8vIDw0LDEsNywzPjogQ29zdCAzIHZleHQzIDwxLDcsMyw0PiwgPDEsNywzLDQ+CisgIDM3MjExNTU5NDJVLAkvLyA8NCwxLDcsND46IENvc3QgNCB2ZXh0MiA8NSwwLDQsMT4sIDw3LDQsNSw2PgorICAzNzIxMTU1OTc2VSwJLy8gPDQsMSw3LDU+OiBDb3N0IDQgdmV4dDIgPDUsMCw0LDE+LCA8Nyw1LDAsND4KKyAgMzY2MjUwMDQ1OFUsCS8vIDw0LDEsNyw2PjogQ29zdCA0IHZleHQxIDw2LDQsMSw3PiwgPDYsNCwxLDc+CisgIDM3MjExNTYyMDRVLAkvLyA8NCwxLDcsNz46IENvc3QgNCB2ZXh0MiA8NSwwLDQsMT4sIDw3LDcsNyw3PgorICAyNjU5MzU3NzE2VSwJLy8gPDQsMSw3LHU+OiBDb3N0IDMgdmV4dDIgPDcsMCw0LDE+LCA8NywwLDQsMT4KKyAgMTQ3OTE4ODU4MlUsCS8vIDw0LDEsdSwwPjogQ29zdCAyIHZleHQxIDwwLDQsMSx1PiwgTEhTCisgIDI1NTI5MzEwNjJVLAkvLyA8NCwxLHUsMT46IENvc3QgMyB2ZXh0MSA8MCw0LDEsdT4sIDwxLDAsMywyPgorICAyNTUyOTMxOTQ0VSwJLy8gPDQsMSx1LDI+OiBDb3N0IDMgdmV4dDEgPDAsNCwxLHU+LCA8MiwyLDIsMj4KKyAgMTYyMjE0ODQ4MFUsCS8vIDw0LDEsdSwzPjogQ29zdCAyIHZleHQzIDwxLHUsMyw0PiwgPDEsdSwzLDQ+CisgIDE0NzkxOTE4NjJVLAkvLyA8NCwxLHUsND46IENvc3QgMiB2ZXh0MSA8MCw0LDEsdT4sIFJIUworICAyNjIyODYzNTE0VSwJLy8gPDQsMSx1LDU+OiBDb3N0IDMgdmV4dDIgPDAsdSw0LDE+LCBSSFMKKyAgMjU4ODcyNTg2MlUsCS8vIDw0LDEsdSw2PjogQ29zdCAzIHZleHQxIDw2LDQsMSwzPiwgPDYsNCwxLDM+CisgIDI2MDA2ODY1ODZVLAkvLyA8NCwxLHUsNz46IENvc3QgMyB2ZXh0MSA8dSw0LDEsNT4sIDw3LDAsMSwyPgorICAxNDc5MTk0NDE0VSwJLy8gPDQsMSx1LHU+OiBDb3N0IDIgdmV4dDEgPDAsNCwxLHU+LCBMSFMKKyAgMjYxNzU1NzAzMFUsCS8vIDw0LDIsMCwwPjogQ29zdCAzIHZleHQyIDwwLDAsNCwyPiwgPDAsMCw0LDI+CisgIDI2MjI4NjU1MTBVLAkvLyA8NCwyLDAsMT46IENvc3QgMyB2ZXh0MiA8MCx1LDQsMj4sIExIUworICAyNjIyODY1NjEyVSwJLy8gPDQsMiwwLDI+OiBDb3N0IDMgdmV4dDIgPDAsdSw0LDI+LCA8MCwyLDQsNj4KKyAgMzY5MzI4OTc1M1UsCS8vIDw0LDIsMCwzPjogQ29zdCA0IHZleHQyIDwwLDMsNCwyPiwgPDAsMyw0LDI+CisgIDI2MzU0NzMyNDRVLAkvLyA8NCwyLDAsND46IENvc3QgMyB2ZXh0MiA8MywwLDQsMj4sIDwwLDQsMiw2PgorICAzNzY1NjUwOTE4VSwJLy8gPDQsMiwwLDU+OiBDb3N0IDQgdmV4dDMgPDEsMiwzLDQ+LCA8MiwwLDUsNz4KKyAgMjY5Njc3NTE0OFUsCS8vIDw0LDIsMCw2PjogQ29zdCAzIHZleHQzIDwyLDAsNiw0PiwgPDIsMCw2LDQ+CisgIDM2OTU5NDQyODVVLAkvLyA8NCwyLDAsNz46IENvc3QgNCB2ZXh0MiA8MCw3LDQsMj4sIDwwLDcsNCwyPgorICAyNjIyODY2MDc3VSwJLy8gPDQsMiwwLHU+OiBDb3N0IDMgdmV4dDIgPDAsdSw0LDI+LCBMSFMKKyAgMzY5NjYwNzk5MFUsCS8vIDw0LDIsMSwwPjogQ29zdCA0IHZleHQyIDwwLHUsNCwyPiwgPDEsMCwzLDI+CisgIDM2OTY2MDgwNTJVLAkvLyA8NCwyLDEsMT46IENvc3QgNCB2ZXh0MiA8MCx1LDQsMj4sIDwxLDEsMSwxPgorICAzNjk2NjA4MTUwVSwJLy8gPDQsMiwxLDI+OiBDb3N0IDQgdmV4dDIgPDAsdSw0LDI+LCA8MSwyLDMsMD4KKyAgMzg5NTU3NDYzMFUsCS8vIDw0LDIsMSwzPjogQ29zdCA0IHZ1enByIDwwLDQsdSwyPiwgTEhTCisgIDI2OTE5MDkxNjJVLAkvLyA8NCwyLDEsND46IENvc3QgMyB2ZXh0MyA8MSwyLDMsND4sIDwyLDEsNCwzPgorICAzNjk2NjA4NDAwVSwJLy8gPDQsMiwxLDU+OiBDb3N0IDQgdmV4dDIgPDAsdSw0LDI+LCA8MSw1LDMsNz4KKyAgMzc2MDc4NDk1NlUsCS8vIDw0LDIsMSw2PjogQ29zdCA0IHZleHQzIDwwLDQsMCw0PiwgPDIsMSw2LDM+CisgIDM3NzM5MDg1NDlVLAkvLyA8NCwyLDEsNz46IENvc3QgNSB2ZXh0MyA8Miw1LDcsND4sIDwyLDEsNywzPgorICAyNjkxOTA5MTYyVSwJLy8gPDQsMiwxLHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MiwxLDQsMz4KKyAgMzY5NjYwODc0OFUsCS8vIDw0LDIsMiwwPjogQ29zdCA0IHZleHQyIDwwLHUsNCwyPiwgPDIsMCw2LDQ+CisgIDM2OTY2MDg4MjhVLAkvLyA8NCwyLDIsMT46IENvc3QgNCB2ZXh0MiA8MCx1LDQsMj4sIDwyLDEsNiwzPgorICAyNjkxOTA5MjI0VSwJLy8gPDQsMiwyLDI+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MiwyLDIsMj4KKyAgMjY5MTkwOTIzNFUsCS8vIDw0LDIsMiwzPjogQ29zdCAzIHZleHQzIDwxLDIsMyw0PiwgPDIsMiwzLDM+CisgIDM3NTk2MDUzNjhVLAkvLyA8NCwyLDIsND46IENvc3QgNCB2ZXh0MyA8MCwyLDIsND4sIDwyLDIsNCwwPgorICAzNjk2NjA5MTU2VSwJLy8gPDQsMiwyLDU+OiBDb3N0IDQgdmV4dDIgPDAsdSw0LDI+LCA8Miw1LDYsNz4KKyAgMzc2MDc4NTA0MFUsCS8vIDw0LDIsMiw2PjogQ29zdCA0IHZleHQzIDwwLDQsMCw0PiwgPDIsMiw2LDY+CisgIDM2Njg1MDU5MjdVLAkvLyA8NCwyLDIsNz46IENvc3QgNCB2ZXh0MSA8Nyw0LDIsMj4sIDw3LDQsMiwyPgorICAyNjkxOTA5Mjc5VSwJLy8gPDQsMiwyLHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MiwyLHUsMz4KKyAgMjY5MTkwOTI4NlUsCS8vIDw0LDIsMywwPjogQ29zdCAzIHZleHQzIDwxLDIsMyw0PiwgPDIsMywwLDE+CisgIDM3NjQ4NDAxMTFVLAkvLyA8NCwyLDMsMT46IENvc3QgNCB2ZXh0MyA8MSwxLDEsND4sIDwyLDMsMSwxPgorICAzNzY1NjUxMTI5VSwJLy8gPDQsMiwzLDI+OiBDb3N0IDQgdmV4dDMgPDEsMiwzLDQ+LCA8MiwzLDIsMj4KKyAgMjY5ODU0NDgzNlUsCS8vIDw0LDIsMywzPjogQ29zdCAzIHZleHQzIDwyLDMsMyw0PiwgPDIsMywzLDQ+CisgIDI2ODU4NjM2MzBVLAkvLyA8NCwyLDMsND46IENvc3QgMyB2ZXh0MyA8MCwyLDIsND4sIDwyLDMsNCw1PgorICAyNjk4NjkyMzEwVSwJLy8gPDQsMiwzLDU+OiBDb3N0IDMgdmV4dDMgPDIsMyw1LDQ+LCA8MiwzLDUsND4KKyAgMzc3MjUwNzg3MVUsCS8vIDw0LDIsMyw2PjogQ29zdCA0IHZleHQzIDwyLDMsNiw0PiwgPDIsMyw2LDQ+CisgIDI2OTg4Mzk3ODRVLAkvLyA8NCwyLDMsNz46IENvc3QgMyB2ZXh0MyA8MiwzLDcsND4sIDwyLDMsNyw0PgorICAyNjkxOTA5MzU4VSwJLy8gPDQsMiwzLHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MiwzLHUsMT4KKyAgMjU2NDkxNTMwMlUsCS8vIDw0LDIsNCwwPjogQ29zdCAzIHZleHQxIDwyLDQsMiw0PiwgTEhTCisgIDI1NjQ5MTYxMjJVLAkvLyA8NCwyLDQsMT46IENvc3QgMyB2ZXh0MSA8Miw0LDIsND4sIDwxLDIsMyw0PgorICAyNTY0OTE3MDA0VSwJLy8gPDQsMiw0LDI+OiBDb3N0IDMgdmV4dDEgPDIsNCwyLDQ+LCA8Miw0LDIsND4KKyAgMjY5OTIwODQ2OVUsCS8vIDw0LDIsNCwzPjogQ29zdCAzIHZleHQzIDwyLDQsMyw0PiwgPDIsNCwzLDQ+CisgIDI1NjQ5MTg1ODJVLAkvLyA8NCwyLDQsND46IENvc3QgMyB2ZXh0MSA8Miw0LDIsND4sIFJIUworICAyNjIyODY4NzkwVSwJLy8gPDQsMiw0LDU+OiBDb3N0IDMgdmV4dDIgPDAsdSw0LDI+LCBSSFMKKyAgMjIyOTY2NzYzMlUsCS8vIDw0LDIsNCw2PjogQ29zdCAzIHZyZXYgPDIsNCw2LDQ+CisgIDM4MDAwODIyMjlVLAkvLyA8NCwyLDQsNz46IENvc3QgNCB2ZXh0MyA8NywwLDIsND4sIDwyLDQsNywwPgorICAyNjIyODY5MDMzVSwJLy8gPDQsMiw0LHU+OiBDb3N0IDMgdmV4dDIgPDAsdSw0LDI+LCBSSFMKKyAgMjU1Mjk3OTU1OFUsCS8vIDw0LDIsNSwwPjogQ29zdCAzIHZleHQxIDwwLDQsMiw1PiwgTEhTCisgIDI1NTg5NTIzNDJVLAkvLyA8NCwyLDUsMT46IENvc3QgMyB2ZXh0MSA8MSw0LDIsNT4sIDwxLDIsMywwPgorICAyNTY0OTI1MDMyVSwJLy8gPDQsMiw1LDI+OiBDb3N0IDMgdmV4dDEgPDIsNCwyLDU+LCA8MiwyLDIsMj4KKyAgMjk2NzA2MDU4MlUsCS8vIDw0LDIsNSwzPjogQ29zdCAzIHZ6aXByIDwyLDMsNCw1PiwgTEhTCisgIDI1NTI5ODI4MzhVLAkvLyA8NCwyLDUsND46IENvc3QgMyB2ZXh0MSA8MCw0LDIsNT4sIFJIUworICAzOTg3MTMwMTkwVSwJLy8gPDQsMiw1LDU+OiBDb3N0IDQgdnppcGwgUkhTLCA8Miw1LDAsNz4KKyAgMjkxMzM4ODQ3NFUsCS8vIDw0LDIsNSw2PjogQ29zdCAzIHZ6aXBsIFJIUywgPDIsNiwzLDc+CisgIDM4OTU1Nzc5MTBVLAkvLyA8NCwyLDUsNz46IENvc3QgNCB2dXpwciA8MCw0LHUsMj4sIFJIUworICAyNTUyOTg1MzkwVSwJLy8gPDQsMiw1LHU+OiBDb3N0IDMgdmV4dDEgPDAsNCwyLDU+LCBMSFMKKyAgMTQ3OTI0NTkyNlUsCS8vIDw0LDIsNiwwPjogQ29zdCAyIHZleHQxIDwwLDQsMiw2PiwgTEhTCisgIDI1NTI5ODg0MDZVLAkvLyA8NCwyLDYsMT46IENvc3QgMyB2ZXh0MSA8MCw0LDIsNj4sIDwxLDAsMywyPgorICAyNTUyOTg5Mjg4VSwJLy8gPDQsMiw2LDI+OiBDb3N0IDMgdmV4dDEgPDAsNCwyLDY+LCA8MiwyLDIsMj4KKyAgMjk1NDQ2MTI4NlUsCS8vIDw0LDIsNiwzPjogQ29zdCAzIHZ6aXByIDwwLDIsNCw2PiwgTEhTCisgIDE0NzkyNDkyMDZVLAkvLyA8NCwyLDYsND46IENvc3QgMiB2ZXh0MSA8MCw0LDIsNj4sIFJIUworICAyMjI5NjEwMjgxVSwJLy8gPDQsMiw2LDU+OiBDb3N0IDMgdnJldiA8Miw0LDUsNj4KKyAgMjYwMDc2Nzk5NFUsCS8vIDw0LDIsNiw2PjogQ29zdCAzIHZleHQxIDx1LDQsMiw2PiwgPDYsMiw3LDM+CisgIDI2MDA3Njg1MDZVLAkvLyA8NCwyLDYsNz46IENvc3QgMyB2ZXh0MSA8dSw0LDIsNj4sIDw3LDAsMSwyPgorICAxNDc5MjUxNzU4VSwJLy8gPDQsMiw2LHU+OiBDb3N0IDIgdmV4dDEgPDAsNCwyLDY+LCBMSFMKKyAgMjY1OTM2NTkwOVUsCS8vIDw0LDIsNywwPjogQ29zdCAzIHZleHQyIDw3LDAsNCwyPiwgPDcsMCw0LDI+CisgIDM3MzM3NzEzNjZVLAkvLyA8NCwyLDcsMT46IENvc3QgNCB2ZXh0MiA8NywxLDQsMj4sIDw3LDEsNCwyPgorICAzNzM0NDM0OTk5VSwJLy8gPDQsMiw3LDI+OiBDb3N0IDQgdmV4dDIgPDcsMiw0LDI+LCA8NywyLDQsMj4KKyAgMjcwMTE5OTM2OFUsCS8vIDw0LDIsNywzPjogQ29zdCAzIHZleHQzIDwyLDcsMyw0PiwgPDIsNywzLDQ+CisgIDQxNzU3NzQ2MThVLAkvLyA8NCwyLDcsND46IENvc3QgNCB2dHJuciA8Miw0LDUsNz4sIDwxLDIsMyw0PgorICAzMzAzMzYwMjk4VSwJLy8gPDQsMiw3LDU+OiBDb3N0IDQgdnJldiA8Miw0LDUsNz4KKyAgMzcyNzEzNjIxN1UsCS8vIDw0LDIsNyw2PjogQ29zdCA0IHZleHQyIDw2LDAsNCwyPiwgPDcsNiwwLDQ+CisgIDM3MjcxMzYzNjRVLAkvLyA8NCwyLDcsNz46IENvc3QgNCB2ZXh0MiA8NiwwLDQsMj4sIDw3LDcsNyw3PgorICAyNjU5MzY1OTA5VSwJLy8gPDQsMiw3LHU+OiBDb3N0IDMgdmV4dDIgPDcsMCw0LDI+LCA8NywwLDQsMj4KKyAgMTQ3OTI2MjMxMFUsCS8vIDw0LDIsdSwwPjogQ29zdCAyIHZleHQxIDwwLDQsMix1PiwgTEhTCisgIDI1NTMwMDQ3OTBVLAkvLyA8NCwyLHUsMT46IENvc3QgMyB2ZXh0MSA8MCw0LDIsdT4sIDwxLDAsMywyPgorICAyNTUzMDA1NjcyVSwJLy8gPDQsMix1LDI+OiBDb3N0IDMgdmV4dDEgPDAsNCwyLHU+LCA8MiwyLDIsMj4KKyAgMjk1NDQ3NzY3MFUsCS8vIDw0LDIsdSwzPjogQ29zdCAzIHZ6aXByIDwwLDIsNCx1PiwgTEhTCisgIDE0NzkyNjU1OTBVLAkvLyA8NCwyLHUsND46IENvc3QgMiB2ZXh0MSA8MCw0LDIsdT4sIFJIUworICAyNjIyODcxNzA2VSwJLy8gPDQsMix1LDU+OiBDb3N0IDMgdmV4dDIgPDAsdSw0LDI+LCBSSFMKKyAgMjIyOTcwMDQwNFUsCS8vIDw0LDIsdSw2PjogQ29zdCAzIHZyZXYgPDIsNCw2LHU+CisgIDI2MDA3ODQ4OTBVLAkvLyA8NCwyLHUsNz46IENvc3QgMyB2ZXh0MSA8dSw0LDIsdT4sIDw3LDAsMSwyPgorICAxNDc5MjY4MTQyVSwJLy8gPDQsMix1LHU+OiBDb3N0IDIgdmV4dDEgPDAsNCwyLHU+LCBMSFMKKyAgMzc2NTY1MTU5NVUsCS8vIDw0LDMsMCwwPjogQ29zdCA0IHZleHQzIDwxLDIsMyw0PiwgPDMsMCwwLDA+CisgIDI2OTE5MDk3ODJVLAkvLyA8NCwzLDAsMT46IENvc3QgMyB2ZXh0MyA8MSwyLDMsND4sIDwzLDAsMSwyPgorICAyNzAyNDUyODk3VSwJLy8gPDQsMywwLDI+OiBDb3N0IDMgdmV4dDMgPDMsMCwyLDQ+LCA8MywwLDIsND4KKyAgMzY5MzI5Nzk0NlUsCS8vIDw0LDMsMCwzPjogQ29zdCA0IHZleHQyIDwwLDMsNCwzPiwgPDAsMyw0LDM+CisgIDM3NjA3MTE4NTZVLAkvLyA8NCwzLDAsND46IENvc3QgNCB2ZXh0MyA8MCwzLHUsND4sIDwzLDAsNCwxPgorICAyMjM1NTMzODIwVSwJLy8gPDQsMywwLDU+OiBDb3N0IDMgdnJldiA8Myw0LDUsMD4KKyAgMzMwOTM0OTM4MVUsCS8vIDw0LDMsMCw2PjogQ29zdCA0IHZyZXYgPDMsNCw2LDA+CisgIDM2Njg1NjMyNzhVLAkvLyA8NCwzLDAsNz46IENvc3QgNCB2ZXh0MSA8Nyw0LDMsMD4sIDw3LDQsMywwPgorICAyNjkxOTA5ODQ1VSwJLy8gPDQsMywwLHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MywwLHUsMj4KKyAgMjIzNTE3MzMyOFUsCS8vIDw0LDMsMSwwPjogQ29zdCAzIHZyZXYgPDMsNCwwLDE+CisgIDM3NjQ4NDA2NzhVLAkvLyA8NCwzLDEsMT46IENvc3QgNCB2ZXh0MyA8MSwxLDEsND4sIDwzLDEsMSwxPgorICAyNjMwMTczNTk0VSwJLy8gPDQsMywxLDI+OiBDb3N0IDMgdmV4dDIgPDIsMSw0LDM+LCA8MSwyLDMsND4KKyAgMjcwMzE5MDI2N1UsCS8vIDw0LDMsMSwzPjogQ29zdCAzIHZleHQzIDwzLDEsMyw0PiwgPDMsMSwzLDQ+CisgIDM3NjAxOTU4NDBVLAkvLyA8NCwzLDEsND46IENvc3QgNCB2ZXh0MyA8MCwzLDEsND4sIDwzLDEsNCwwPgorICAzNzY1NjUxNzI0VSwJLy8gPDQsMywxLDU+OiBDb3N0IDQgdmV4dDMgPDEsMiwzLDQ+LCA8MywxLDUsMz4KKyAgMzMwOTM1NzU3NFUsCS8vIDw0LDMsMSw2PjogQ29zdCA0IHZyZXYgPDMsNCw2LDE+CisgIDM3Njk2MzMwNTRVLAkvLyA8NCwzLDEsNz46IENvc3QgNCB2ZXh0MyA8MSx1LDMsND4sIDwzLDEsNywzPgorICAyNzAzNTU4OTUyVSwJLy8gPDQsMywxLHU+OiBDb3N0IDMgdmV4dDMgPDMsMSx1LDQ+LCA8MywxLHUsND4KKyAgMzYyNjc3MDUzNFUsCS8vIDw0LDMsMiwwPjogQ29zdCA0IHZleHQxIDwwLDQsMywyPiwgTEhTCisgIDI2MzAxNzQyNTBVLAkvLyA8NCwzLDIsMT46IENvc3QgMyB2ZXh0MiA8MiwxLDQsMz4sIDwyLDEsNCwzPgorICAzNzY1NjUxNzc3VSwJLy8gPDQsMywyLDI+OiBDb3N0IDQgdmV4dDMgPDEsMiwzLDQ+LCA8MywyLDIsMj4KKyAgMjcwMzg1MzkwMFUsCS8vIDw0LDMsMiwzPjogQ29zdCAzIHZleHQzIDwzLDIsMyw0PiwgPDMsMiwzLDQ+CisgIDM2MjY3NzM4MTRVLAkvLyA8NCwzLDIsND46IENvc3QgNCB2ZXh0MSA8MCw0LDMsMj4sIFJIUworICAyNzA0MDAxMzc0VSwJLy8gPDQsMywyLDU+OiBDb3N0IDMgdmV4dDMgPDMsMiw1LDQ+LCA8MywyLDUsND4KKyAgMzc2NTY1MTgxNFUsCS8vIDw0LDMsMiw2PjogQ29zdCA0IHZleHQzIDwxLDIsMyw0PiwgPDMsMiw2LDM+CisgIDM3Njk2MzMxMzVVLAkvLyA8NCwzLDIsNz46IENvc3QgNCB2ZXh0MyA8MSx1LDMsND4sIDwzLDIsNywzPgorICAyNjM0ODE5NjgxVSwJLy8gPDQsMywyLHU+OiBDb3N0IDMgdmV4dDIgPDIsdSw0LDM+LCA8Mix1LDQsMz4KKyAgMzc2NTY1MTgzOVUsCS8vIDw0LDMsMywwPjogQ29zdCA0IHZleHQzIDwxLDIsMyw0PiwgPDMsMywwLDE+CisgIDM3NjU2NTE4NDhVLAkvLyA8NCwzLDMsMT46IENvc3QgNCB2ZXh0MyA8MSwyLDMsND4sIDwzLDMsMSwxPgorICAzNzEwNTUyNDA0VSwJLy8gPDQsMywzLDI+OiBDb3N0IDQgdmV4dDIgPDMsMiw0LDM+LCA8MywyLDQsMz4KKyAgMjY5MTkxMDA0NFUsCS8vIDw0LDMsMywzPjogQ29zdCAzIHZleHQzIDwxLDIsMyw0PiwgPDMsMywzLDM+CisgIDI3MDQ1OTEyNzBVLAkvLyA8NCwzLDMsND46IENvc3QgMyB2ZXh0MyA8MywzLDQsND4sIDwzLDMsNCw0PgorICAzNzY5NjMzMjAyVSwJLy8gPDQsMywzLDU+OiBDb3N0IDQgdmV4dDMgPDEsdSwzLDQ+LCA8MywzLDUsNz4KKyAgMzcwMzkxNzIxMlUsCS8vIDw0LDMsMyw2PjogQ29zdCA0IHZleHQyIDwyLDEsNCwzPiwgPDMsNiw0LDc+CisgIDM3Njk2MzMyMjBVLAkvLyA8NCwzLDMsNz46IENvc3QgNCB2ZXh0MyA8MSx1LDMsND4sIDwzLDMsNyw3PgorICAyNjkxOTEwMDQ0VSwJLy8gPDQsMywzLHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8MywzLDMsMz4KKyAgMjY5MTkxMDA5NlUsCS8vIDw0LDMsNCwwPjogQ29zdCAzIHZleHQzIDwxLDIsMyw0PiwgPDMsNCwwLDE+CisgIDI2OTE5MTAxMDZVLAkvLyA8NCwzLDQsMT46IENvc3QgMyB2ZXh0MyA8MSwyLDMsND4sIDwzLDQsMSwyPgorICAyNTY0OTkwNzQxVSwJLy8gPDQsMyw0LDI+OiBDb3N0IDMgdmV4dDEgPDIsNCwzLDQ+LCA8Miw0LDMsND4KKyAgMzc2NTY1MTk0NlUsCS8vIDw0LDMsNCwzPjogQ29zdCA0IHZleHQzIDwxLDIsMyw0PiwgPDMsNCwzLDA+CisgIDI2OTE5MTAxMzZVLAkvLyA8NCwzLDQsND46IENvc3QgMyB2ZXh0MyA8MSwyLDMsND4sIDwzLDQsNCw1PgorICAyNjg2NDU0Mjc0VSwJLy8gPDQsMyw0LDU+OiBDb3N0IDMgdmV4dDMgPDAsMywxLDQ+LCA8Myw0LDUsNj4KKyAgMjIzNTY0MDMyOVUsCS8vIDw0LDMsNCw2PjogQ29zdCAzIHZyZXYgPDMsNCw2LDQ+CisgIDM4MDE0ODM3OTJVLAkvLyA8NCwzLDQsNz46IENvc3QgNCB2ZXh0MyA8NywyLDMsND4sIDwzLDQsNywyPgorICAyNjkxOTEwMTY4VSwJLy8gPDQsMyw0LHU+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8Myw0LHUsMT4KKyAgMjU1OTAyNTI1NFUsCS8vIDw0LDMsNSwwPjogQ29zdCAzIHZleHQxIDwxLDQsMyw1PiwgTEhTCisgIDI1NTkwMjYyMzdVLAkvLyA8NCwzLDUsMT46IENvc3QgMyB2ZXh0MSA8MSw0LDMsNT4sIDwxLDQsMyw1PgorICAyNTY0OTk4ODYyVSwJLy8gPDQsMyw1LDI+OiBDb3N0IDMgdmV4dDEgPDIsNCwzLDU+LCA8MiwzLDQsNT4KKyAgMjU3MDk3MTU0OFUsCS8vIDw0LDMsNSwzPjogQ29zdCAzIHZleHQxIDwzLDQsMyw1PiwgPDMsMywzLDM+CisgIDI1NTkwMjg1MzRVLAkvLyA8NCwzLDUsND46IENvc3QgMyB2ZXh0MSA8MSw0LDMsNT4sIFJIUworICA0MTYzNTE5NDc3VSwJLy8gPDQsMyw1LDU+OiBDb3N0IDQgdnRybnIgPDAsNCwxLDU+LCA8MSwzLDQsNT4KKyAgMzMwOTM5MDM0NlUsCS8vIDw0LDMsNSw2PjogQ29zdCA0IHZyZXYgPDMsNCw2LDU+CisgIDI3MDYxMzk3NDdVLAkvLyA8NCwzLDUsNz46IENvc3QgMyB2ZXh0MyA8Myw1LDcsND4sIDwzLDUsNyw0PgorICAyNTU5MDMxMDg2VSwJLy8gPDQsMyw1LHU+OiBDb3N0IDMgdmV4dDEgPDEsNCwzLDU+LCBMSFMKKyAgMjU1OTAzMzQ0NlUsCS8vIDw0LDMsNiwwPjogQ29zdCAzIHZleHQxIDwxLDQsMyw2PiwgTEhTCisgIDI1NTkwMzQ0MzBVLAkvLyA8NCwzLDYsMT46IENvc3QgMyB2ZXh0MSA8MSw0LDMsNj4sIDwxLDQsMyw2PgorICAyNTY1MDA3MTI3VSwJLy8gPDQsMyw2LDI+OiBDb3N0IDMgdmV4dDEgPDIsNCwzLDY+LCA8Miw0LDMsNj4KKyAgMjU3MDk3OTc0MFUsCS8vIDw0LDMsNiwzPjogQ29zdCAzIHZleHQxIDwzLDQsMyw2PiwgPDMsMywzLDM+CisgIDI1NTkwMzY3MjZVLAkvLyA8NCwzLDYsND46IENvc3QgMyB2ZXh0MSA8MSw0LDMsNj4sIFJIUworICAxMTYxODQxMTU0VSwJLy8gPDQsMyw2LDU+OiBDb3N0IDIgdnJldiA8Myw0LDUsNj4KKyAgNDAyODIwMzkzMlUsCS8vIDw0LDMsNiw2PjogQ29zdCA0IHZ6aXByIDwwLDIsNCw2PiwgPDEsMiwzLDY+CisgIDI3MDY4MDMzODBVLAkvLyA8NCwzLDYsNz46IENvc3QgMyB2ZXh0MyA8Myw2LDcsND4sIDwzLDYsNyw0PgorICAxMTYyMDYyMzY1VSwJLy8gPDQsMyw2LHU+OiBDb3N0IDIgdnJldiA8Myw0LHUsNj4KKyAgMzc2OTYzMzQ3NVUsCS8vIDw0LDMsNywwPjogQ29zdCA0IHZleHQzIDwxLHUsMyw0PiwgPDMsNywwLDE+CisgIDM3Njk2MzM0ODhVLAkvLyA8NCwzLDcsMT46IENvc3QgNCB2ZXh0MyA8MSx1LDMsND4sIDwzLDcsMSw1PgorICAzNjM4NzU3MTQ0VSwJLy8gPDQsMyw3LDI+OiBDb3N0IDQgdmV4dDEgPDIsNCwzLDc+LCA8Miw0LDMsNz4KKyAgMzc2OTYzMzUwOFUsCS8vIDw0LDMsNywzPjogQ29zdCA0IHZleHQzIDwxLHUsMyw0PiwgPDMsNywzLDc+CisgIDM3Njk2MzM1MTVVLAkvLyA8NCwzLDcsND46IENvc3QgNCB2ZXh0MyA8MSx1LDMsND4sIDwzLDcsNCw1PgorICAzNzY5NjMzNTI2VSwJLy8gPDQsMyw3LDU+OiBDb3N0IDQgdmV4dDMgPDEsdSwzLDQ+LCA8Myw3LDUsNz4KKyAgMzY2MjY0NzkzMlUsCS8vIDw0LDMsNyw2PjogQ29zdCA0IHZleHQxIDw2LDQsMyw3PiwgPDYsNCwzLDc+CisgIDM3ODEyMDg4MzdVLAkvLyA8NCwzLDcsNz46IENvc3QgNCB2ZXh0MyA8Myw3LDcsND4sIDwzLDcsNyw0PgorICAzNzY5NjMzNTQ3VSwJLy8gPDQsMyw3LHU+OiBDb3N0IDQgdmV4dDMgPDEsdSwzLDQ+LCA8Myw3LHUsMT4KKyAgMjU1OTA0OTgzMFUsCS8vIDw0LDMsdSwwPjogQ29zdCAzIHZleHQxIDwxLDQsMyx1PiwgTEhTCisgIDI2OTE5MTA0MzBVLAkvLyA8NCwzLHUsMT46IENvc3QgMyB2ZXh0MyA8MSwyLDMsND4sIDwzLHUsMSwyPgorICAyNTY1MDIzNTEzVSwJLy8gPDQsMyx1LDI+OiBDb3N0IDMgdmV4dDEgPDIsNCwzLHU+LCA8Miw0LDMsdT4KKyAgMjcwNzgzNTY5OFUsCS8vIDw0LDMsdSwzPjogQ29zdCAzIHZleHQzIDwzLHUsMyw0PiwgPDMsdSwzLDQ+CisgIDI1NTkwNTMxMTBVLAkvLyA8NCwzLHUsND46IENvc3QgMyB2ZXh0MSA8MSw0LDMsdT4sIFJIUworICAxMTYxODU3NTQwVSwJLy8gPDQsMyx1LDU+OiBDb3N0IDIgdnJldiA8Myw0LDUsdT4KKyAgMjIzNTY3MzEwMVUsCS8vIDw0LDMsdSw2PjogQ29zdCAzIHZyZXYgPDMsNCw2LHU+CisgIDI3MDgxMzA2NDZVLAkvLyA8NCwzLHUsNz46IENvc3QgMyB2ZXh0MyA8Myx1LDcsND4sIDwzLHUsNyw0PgorICAxMTYyMDc4NzUxVSwJLy8gPDQsMyx1LHU+OiBDb3N0IDIgdnJldiA8Myw0LHUsdT4KKyAgMjYxNzU3MzQxNlUsCS8vIDw0LDQsMCwwPjogQ29zdCAzIHZleHQyIDwwLDAsNCw0PiwgPDAsMCw0LDQ+CisgIDE1NzAzNzM3MzRVLAkvLyA8NCw0LDAsMT46IENvc3QgMiB2ZXh0MiA8NCw0LDQsND4sIExIUworICAyNzc5Njc2Nzc0VSwJLy8gPDQsNCwwLDI+OiBDb3N0IDMgdnV6cGwgPDQsNiw0LDY+LCBMSFMKKyAgMzc2MDE5NjQ4MFUsCS8vIDw0LDQsMCwzPjogQ29zdCA0IHZleHQzIDwwLDMsMSw0PiwgPDQsMCwzLDE+CisgIDI1NzY5NzcxMDBVLAkvLyA8NCw0LDAsND46IENvc3QgMyB2ZXh0MSA8NCw0LDQsMD4sIDw0LDQsNCwwPgorICAyNzE4NzQ3NTM4VSwJLy8gPDQsNCwwLDU+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDQ+LCA8NCwwLDUsMT4KKyAgMjcxODc0NzU0OFUsCS8vIDw0LDQsMCw2PjogQ29zdCAzIHZleHQzIDw1LDYsNyw0PiwgPDQsMCw2LDI+CisgIDM2Njg2MzcwMTVVLAkvLyA8NCw0LDAsNz46IENvc3QgNCB2ZXh0MSA8Nyw0LDQsMD4sIDw3LDQsNCwwPgorICAxNTcwMzc0MzAxVSwJLy8gPDQsNCwwLHU+OiBDb3N0IDIgdmV4dDIgPDQsNCw0LDQ+LCBMSFMKKyAgMjY0NDExNjIxNFUsCS8vIDw0LDQsMSwwPjogQ29zdCAzIHZleHQyIDw0LDQsNCw0PiwgPDEsMCwzLDI+CisgIDI2NDQxMTYyNzZVLAkvLyA8NCw0LDEsMT46IENvc3QgMyB2ZXh0MiA8NCw0LDQsND4sIDwxLDEsMSwxPgorICAyNjkxOTEwNjAyVSwJLy8gPDQsNCwxLDI+OiBDb3N0IDMgdmV4dDMgPDEsMiwzLDQ+LCA8NCwxLDIsMz4KKyAgMjY0NDExNjQ0MFUsCS8vIDw0LDQsMSwzPjogQ29zdCAzIHZleHQyIDw0LDQsNCw0PiwgPDEsMywxLDM+CisgIDI3MTEyMjczNTZVLAkvLyA8NCw0LDEsND46IENvc3QgMyB2ZXh0MyA8NCw0LDQsND4sIDw0LDEsNCwzPgorICAyNzA5MzEwNDM4VSwJLy8gPDQsNCwxLDU+OiBDb3N0IDMgdmV4dDMgPDQsMSw1LDQ+LCA8NCwxLDUsND4KKyAgMzc2NTY1MjQ2MlUsCS8vIDw0LDQsMSw2PjogQ29zdCA0IHZleHQzIDwxLDIsMyw0PiwgPDQsMSw2LDM+CisgIDM3Njg5NzAyMzFVLAkvLyA8NCw0LDEsNz46IENvc3QgNCB2ZXh0MyA8MSw3LDMsND4sIDw0LDEsNywzPgorICAyNjk1ODkxOTY4VSwJLy8gPDQsNCwxLHU+OiBDb3N0IDMgdmV4dDMgPDEsdSwzLDQ+LCA8NCwxLHUsMz4KKyAgMzcwMzI2MDYzNFUsCS8vIDw0LDQsMiwwPjogQ29zdCA0IHZleHQyIDwyLDAsNCw0PiwgPDIsMCw0LDQ+CisgIDM3NjU2NTI0OTlVLAkvLyA8NCw0LDIsMT46IENvc3QgNCB2ZXh0MyA8MSwyLDMsND4sIDw0LDIsMSw0PgorICAyNjQ0MTE3MDk2VSwJLy8gPDQsNCwyLDI+OiBDb3N0IDMgdmV4dDIgPDQsNCw0LDQ+LCA8MiwyLDIsMj4KKyAgMjYzMTUwOTcwOVUsCS8vIDw0LDQsMiwzPjogQ29zdCAzIHZleHQyIDwyLDMsNCw0PiwgPDIsMyw0LDQ+CisgIDI2NDQxMTcyNjlVLAkvLyA8NCw0LDIsND46IENvc3QgMyB2ZXh0MiA8NCw0LDQsND4sIDwyLDQsMyw0PgorICAzNzA1MjUxNjk4VSwJLy8gPDQsNCwyLDU+OiBDb3N0IDQgdmV4dDIgPDIsMyw0LDQ+LCA8Miw1LDQsNz4KKyAgMjcxMDA0NzgwOFUsCS8vIDw0LDQsMiw2PjogQ29zdCAzIHZleHQzIDw0LDIsNiw0PiwgPDQsMiw2LDQ+CisgIDM3ODM4NjMzNjlVLAkvLyA8NCw0LDIsNz46IENvc3QgNCB2ZXh0MyA8NCwyLDcsND4sIDw0LDIsNyw0PgorICAyNjM0ODI3ODc0VSwJLy8gPDQsNCwyLHU+OiBDb3N0IDMgdmV4dDIgPDIsdSw0LDQ+LCA8Mix1LDQsND4KKyAgMjY0NDExNzY1NFUsCS8vIDw0LDQsMywwPjogQ29zdCAzIHZleHQyIDw0LDQsNCw0PiwgPDMsMCwxLDI+CisgIDM2Mzg3OTcyMTBVLAkvLyA8NCw0LDMsMT46IENvc3QgNCB2ZXh0MSA8Miw0LDQsMz4sIDwxLDIsMyw0PgorICAzNjM4Nzk4MDgyVSwJLy8gPDQsNCwzLDI+OiBDb3N0IDQgdmV4dDEgPDIsNCw0LDM+LCA8Miw0LDEsMz4KKyAgMjYzNzQ4MjQwNlUsCS8vIDw0LDQsMywzPjogQ29zdCAzIHZleHQyIDwzLDMsNCw0PiwgPDMsMyw0LDQ+CisgIDI2MzgxNDYwMzlVLAkvLyA8NCw0LDMsND46IENvc3QgMyB2ZXh0MiA8Myw0LDQsND4sIDwzLDQsNCw0PgorICAzOTEzMjg3Mzc0VSwJLy8gPDQsNCwzLDU+OiBDb3N0IDQgdnV6cHIgPDMsNCw1LDQ+LCA8MiwzLDQsNT4KKyAgMzc2NTY1MjYyNVUsCS8vIDw0LDQsMyw2PjogQ29zdCA0IHZleHQzIDwxLDIsMyw0PiwgPDQsMyw2LDQ+CisgIDM3MTM4Nzg3NjJVLAkvLyA8NCw0LDMsNz46IENvc3QgNCB2ZXh0MiA8Myw3LDQsND4sIDwzLDcsNCw0PgorICAyNjM3NDgyNDA2VSwJLy8gPDQsNCwzLHU+OiBDb3N0IDMgdmV4dDIgPDMsMyw0LDQ+LCA8MywzLDQsND4KKyAgMTUwMzI2NDg3MFUsCS8vIDw0LDQsNCwwPjogQ29zdCAyIHZleHQxIDw0LDQsNCw0PiwgTEhTCisgIDI1NzcwMDc1MTRVLAkvLyA8NCw0LDQsMT46IENvc3QgMyB2ZXh0MSA8NCw0LDQsND4sIDwxLDIsMyw0PgorICAyNTc3MDA4MjMyVSwJLy8gPDQsNCw0LDI+OiBDb3N0IDMgdmV4dDEgPDQsNCw0LDQ+LCA8MiwyLDIsMj4KKyAgMjU3MTAzNzE3NVUsCS8vIDw0LDQsNCwzPjogQ29zdCAzIHZleHQxIDwzLDQsNCw0PiwgPDMsNCw0LDQ+CisgIDE2MTkyNjQ1NFUsCS8vIDw0LDQsNCw0PjogQ29zdCAxIHZkdXAwIFJIUworICAxNTcwMzc3MDE0VSwJLy8gPDQsNCw0LDU+OiBDb3N0IDIgdmV4dDIgPDQsNCw0LDQ+LCBSSFMKKyAgMjc3OTY4MDA1NFUsCS8vIDw0LDQsNCw2PjogQ29zdCAzIHZ1enBsIDw0LDYsNCw2PiwgUkhTCisgIDI1OTQ5Mjc5NjNVLAkvLyA8NCw0LDQsNz46IENvc3QgMyB2ZXh0MSA8Nyw0LDQsND4sIDw3LDQsNCw0PgorICAxNjE5MjY0NTRVLAkvLyA8NCw0LDQsdT46IENvc3QgMSB2ZHVwMCBSSFMKKyAgMjU3MTA0MjkxOFUsCS8vIDw0LDQsNSwwPjogQ29zdCAzIHZleHQxIDwzLDQsNCw1PiwgTEhTCisgIDI1NzEwNDM3MzhVLAkvLyA8NCw0LDUsMT46IENvc3QgMyB2ZXh0MSA8Myw0LDQsNT4sIDwxLDIsMyw0PgorICAzNjM4ODE0NDk1VSwJLy8gPDQsNCw1LDI+OiBDb3N0IDQgdmV4dDEgPDIsNCw0LDU+LCA8Miw0LDQsNT4KKyAgMjU3MTA0NTM2OFUsCS8vIDw0LDQsNSwzPjogQ29zdCAzIHZleHQxIDwzLDQsNCw1PiwgPDMsNCw0LDU+CisgIDI1NzEwNDYxOThVLAkvLyA8NCw0LDUsND46IENvc3QgMyB2ZXh0MSA8Myw0LDQsNT4sIFJIUworICAxODM5NjQ4MDU0VSwJLy8gPDQsNCw1LDU+OiBDb3N0IDIgdnppcGwgUkhTLCBSSFMKKyAgMTYxODE2OTE0MlUsCS8vIDw0LDQsNSw2PjogQ29zdCAyIHZleHQzIDwxLDIsMyw0PiwgUkhTCisgIDI1OTQ5MzYxNTZVLAkvLyA8NCw0LDUsNz46IENvc3QgMyB2ZXh0MSA8Nyw0LDQsNT4sIDw3LDQsNCw1PgorICAxNjE4MTY5MTYwVSwJLy8gPDQsNCw1LHU+OiBDb3N0IDIgdmV4dDMgPDEsMiwzLDQ+LCBSSFMKKyAgMjU1MzEzNTIwNlUsCS8vIDw0LDQsNiwwPjogQ29zdCAzIHZleHQxIDwwLDQsNCw2PiwgTEhTCisgIDM2MjY4Nzc2ODZVLAkvLyA8NCw0LDYsMT46IENvc3QgNCB2ZXh0MSA8MCw0LDQsNj4sIDwxLDAsMywyPgorICAyNTY1MDgwNzgyVSwJLy8gPDQsNCw2LDI+OiBDb3N0IDMgdmV4dDEgPDIsNCw0LDY+LCA8MiwzLDQsNT4KKyAgMjU3MTA1MzU2MVUsCS8vIDw0LDQsNiwzPjogQ29zdCAzIHZleHQxIDwzLDQsNCw2PiwgPDMsNCw0LDY+CisgIDI1NTMxMzg0ODZVLAkvLyA8NCw0LDYsND46IENvc3QgMyB2ZXh0MSA8MCw0LDQsNj4sIFJIUworICAyMjQxNTU1Njc1VSwJLy8gPDQsNCw2LDU+OiBDb3N0IDMgdnJldiA8NCw0LDUsNj4KKyAgMTk3Mzg2NTc4MlUsCS8vIDw0LDQsNiw2PjogQ29zdCAyIHZ0cm5sIFJIUywgUkhTCisgIDI2NTgwNTUwMjlVLAkvLyA8NCw0LDYsNz46IENvc3QgMyB2ZXh0MiA8Niw3LDQsND4sIDw2LDcsNCw0PgorICAxOTczODY1ODAwVSwJLy8gPDQsNCw2LHU+OiBDb3N0IDIgdnRybmwgUkhTLCBSSFMKKyAgMjY0NDEyMDU3MFUsCS8vIDw0LDQsNywwPjogQ29zdCAzIHZleHQyIDw0LDQsNCw0PiwgPDcsMCwxLDI+CisgIDM2Mzg4Mjk5NzhVLAkvLyA8NCw0LDcsMT46IENvc3QgNCB2ZXh0MSA8Miw0LDQsNz4sIDwxLDIsMyw0PgorICAzNjM4ODMwODgxVSwJLy8gPDQsNCw3LDI+OiBDb3N0IDQgdmV4dDEgPDIsNCw0LDc+LCA8Miw0LDQsNz4KKyAgMzczNTExNTAxOFUsCS8vIDw0LDQsNywzPjogQ29zdCA0IHZleHQyIDw3LDMsNCw0PiwgPDcsMyw0LDQ+CisgIDI2NjIwMzY4MjdVLAkvLyA8NCw0LDcsND46IENvc3QgMyB2ZXh0MiA8Nyw0LDQsND4sIDw3LDQsNCw0PgorICAyNzEzMjkyMjM2VSwJLy8gPDQsNCw3LDU+OiBDb3N0IDMgdmV4dDMgPDQsNyw1LDQ+LCA8NCw3LDUsND4KKyAgMjcxMzM2NTk3M1UsCS8vIDw0LDQsNyw2PjogQ29zdCAzIHZleHQzIDw0LDcsNiw0PiwgPDQsNyw2LDQ+CisgIDI2NDQxMjExOTZVLAkvLyA8NCw0LDcsNz46IENvc3QgMyB2ZXh0MiA8NCw0LDQsND4sIDw3LDcsNyw3PgorICAyNjYyMDM2ODI3VSwJLy8gPDQsNCw3LHU+OiBDb3N0IDMgdmV4dDIgPDcsNCw0LDQ+LCA8Nyw0LDQsND4KKyAgMTUwMzI5NzYzOFUsCS8vIDw0LDQsdSwwPjogQ29zdCAyIHZleHQxIDw0LDQsNCx1PiwgTEhTCisgIDE1NzAzNzk1NjZVLAkvLyA8NCw0LHUsMT46IENvc3QgMiB2ZXh0MiA8NCw0LDQsND4sIExIUworICAyNzc5NjgyNjA2VSwJLy8gPDQsNCx1LDI+OiBDb3N0IDMgdnV6cGwgPDQsNiw0LDY+LCBMSFMKKyAgMjU3MTA2OTk0N1UsCS8vIDw0LDQsdSwzPjogQ29zdCAzIHZleHQxIDwzLDQsNCx1PiwgPDMsNCw0LHU+CisgIDE2MTkyNjQ1NFUsCS8vIDw0LDQsdSw0PjogQ29zdCAxIHZkdXAwIFJIUworICAxODQxNjM4NzEwVSwJLy8gPDQsNCx1LDU+OiBDb3N0IDIgdnppcGwgUkhTLCBSSFMKKyAgMTYxODE2OTM4NVUsCS8vIDw0LDQsdSw2PjogQ29zdCAyIHZleHQzIDwxLDIsMyw0PiwgUkhTCisgIDI1OTQ5NjA3MzVVLAkvLyA8NCw0LHUsNz46IENvc3QgMyB2ZXh0MSA8Nyw0LDQsdT4sIDw3LDQsNCx1PgorICAxNjE5MjY0NTRVLAkvLyA8NCw0LHUsdT46IENvc3QgMSB2ZHVwMCBSSFMKKyAgMjYzMTUxNjE2MFUsCS8vIDw0LDUsMCwwPjogQ29zdCAzIHZleHQyIDwyLDMsNCw1PiwgPDAsMCwwLDA+CisgIDE1NTc3NzQ0MzhVLAkvLyA8NCw1LDAsMT46IENvc3QgMiB2ZXh0MiA8MiwzLDQsNT4sIExIUworICAyNjE4OTA4ODc1VSwJLy8gPDQsNSwwLDI+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LDU+LCA8MCwyLDQsNT4KKyAgMjU3MTA3ODE0MFUsCS8vIDw0LDUsMCwzPjogQ29zdCAzIHZleHQxIDwzLDQsNSwwPiwgPDMsNCw1LDA+CisgIDI2MjY4NzE2MzRVLAkvLyA8NCw1LDAsND46IENvc3QgMyB2ZXh0MiA8MSw1LDQsNT4sIDwwLDQsMSw1PgorICAzNzA1MjU4NDE0VSwJLy8gPDQsNSwwLDU+OiBDb3N0IDQgdmV4dDIgPDIsMyw0LDU+LCA8MCw1LDIsNz4KKyAgMjU5NDk2ODQzOFUsCS8vIDw0LDUsMCw2PjogQ29zdCAzIHZleHQxIDw3LDQsNSwwPiwgPDYsNyw0LDU+CisgIDI1OTQ5Njg5MjhVLAkvLyA8NCw1LDAsNz46IENvc3QgMyB2ZXh0MSA8Nyw0LDUsMD4sIDw3LDQsNSwwPgorICAxNTU3Nzc1MDA1VSwJLy8gPDQsNSwwLHU+OiBDb3N0IDIgdmV4dDIgPDIsMyw0LDU+LCBMSFMKKyAgMjYzMTUxNjkxOFUsCS8vIDw0LDUsMSwwPjogQ29zdCAzIHZleHQyIDwyLDMsNCw1PiwgPDEsMCwzLDI+CisgIDI2MjQyMTc5MzlVLAkvLyA8NCw1LDEsMT46IENvc3QgMyB2ZXh0MiA8MSwxLDQsNT4sIDwxLDEsNCw1PgorICAyNjMxNTE3MDc4VSwJLy8gPDQsNSwxLDI+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDU+LCA8MSwyLDMsMD4KKyAgMjgyMTM0MTI4NlUsCS8vIDw0LDUsMSwzPjogQ29zdCAzIHZ1enByIDwwLDQsMSw1PiwgTEhTCisgIDM4OTUwODYwNTRVLAkvLyA8NCw1LDEsND46IENvc3QgNCB2dXpwciA8MCw0LDEsNT4sIDw0LDEsNSw0PgorICAyNjI2ODcyNDcxVSwJLy8gPDQsNSwxLDU+OiBDb3N0IDMgdmV4dDIgPDEsNSw0LDU+LCA8MSw1LDQsNT4KKyAgMzg5NTA4MzEzMVUsCS8vIDw0LDUsMSw2PjogQ29zdCA0IHZ1enByIDwwLDQsMSw1PiwgPDAsMSw0LDY+CisgIDI3MTg3NDgzNjhVLAkvLyA8NCw1LDEsNz46IENvc3QgMyB2ZXh0MyA8NSw2LDcsND4sIDw1LDEsNywzPgorICAyODIxMzQxMjkxVSwJLy8gPDQsNSwxLHU+OiBDb3N0IDMgdnV6cHIgPDAsNCwxLDU+LCBMSFMKKyAgMjU3MTA5MjA3MFUsCS8vIDw0LDUsMiwwPjogQ29zdCAzIHZleHQxIDwzLDQsNSwyPiwgTEhTCisgIDM2OTkyODc1ODVVLAkvLyA8NCw1LDIsMT46IENvc3QgNCB2ZXh0MiA8MSwzLDQsNT4sIDwyLDEsMywzPgorICAyNjMwODU0MjY5VSwJLy8gPDQsNSwyLDI+OiBDb3N0IDMgdmV4dDIgPDIsMiw0LDU+LCA8MiwyLDQsNT4KKyAgMTU1Nzc3NjA3OFUsCS8vIDw0LDUsMiwzPjogQ29zdCAyIHZleHQyIDwyLDMsNCw1PiwgPDIsMyw0LDU+CisgIDI2MzE1MTc5NzRVLAkvLyA8NCw1LDIsND46IENvc3QgMyB2ZXh0MiA8MiwzLDQsNT4sIDwyLDQsMyw1PgorICAzNjkyNjUyMzg0VSwJLy8gPDQsNSwyLDU+OiBDb3N0IDQgdmV4dDIgPDAsMiw0LDU+LCA8Miw1LDIsNz4KKyAgMjYzMTUxODEzOFUsCS8vIDw0LDUsMiw2PjogQ29zdCAzIHZleHQyIDwyLDMsNCw1PiwgPDIsNiwzLDc+CisgIDQxNjQwMTMzNjZVLAkvLyA8NCw1LDIsNz46IENvc3QgNCB2dHJuciA8MCw0LHUsMj4sIFJIUworICAxNTYxMDk0MjQzVSwJLy8gPDQsNSwyLHU+OiBDb3N0IDIgdmV4dDIgPDIsdSw0LDU+LCA8Mix1LDQsNT4KKyAgMjYzMTUxODM1OFUsCS8vIDw0LDUsMywwPjogQ29zdCAzIHZleHQyIDwyLDMsNCw1PiwgPDMsMCwxLDI+CisgIDM4OTUwODQ3MTBVLAkvLyA8NCw1LDMsMT46IENvc3QgNCB2dXpwciA8MCw0LDEsNT4sIDwyLDMsMCwxPgorICAyNjMxNTE4NTQwVSwJLy8gPDQsNSwzLDI+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDU+LCA8MywyLDMsND4KKyAgMjYzMTUxODYyMFUsCS8vIDw0LDUsMywzPjogQ29zdCAzIHZleHQyIDwyLDMsNCw1PiwgPDMsMywzLDM+CisgIDI2MzE1MTg3MTZVLAkvLyA8NCw1LDMsND46IENvc3QgMyB2ZXh0MiA8MiwzLDQsNT4sIDwzLDQsNSwwPgorICAyNjMxNTE4Nzg0VSwJLy8gPDQsNSwzLDU+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDU+LCA8Myw1LDMsNT4KKyAgMjY1ODA2MDk4MFUsCS8vIDw0LDUsMyw2PjogQ29zdCAzIHZleHQyIDw2LDcsNCw1PiwgPDMsNiw3LDQ+CisgIDI2NDAxNDUxMzFVLAkvLyA8NCw1LDMsNz46IENvc3QgMyB2ZXh0MiA8Myw3LDQsNT4sIDwzLDcsNCw1PgorICAyNjMxNTE5MDA2VSwJLy8gPDQsNSwzLHU+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDU+LCA8Myx1LDEsMj4KKyAgMjU3MTEwODQ1NFUsCS8vIDw0LDUsNCwwPjogQ29zdCAzIHZleHQxIDwzLDQsNSw0PiwgTEhTCisgIDM2MzI5MDczNDJVLAkvLyA8NCw1LDQsMT46IENvc3QgNCB2ZXh0MSA8MSw0LDUsND4sIDwxLDQsNSw0PgorICAyNTcxMTEwMDk0VSwJLy8gPDQsNSw0LDI+OiBDb3N0IDMgdmV4dDEgPDMsNCw1LDQ+LCA8MiwzLDQsNT4KKyAgMjU3MTExMDkxMlUsCS8vIDw0LDUsNCwzPjogQ29zdCAzIHZleHQxIDwzLDQsNSw0PiwgPDMsNCw1LDQ+CisgIDI1NzExMTE3MzRVLAkvLyA8NCw1LDQsND46IENvc3QgMyB2ZXh0MSA8Myw0LDUsND4sIFJIUworICAxNTU3Nzc3NzE4VSwJLy8gPDQsNSw0LDU+OiBDb3N0IDIgdmV4dDIgPDIsMyw0LDU+LCBSSFMKKyAgMjY0NTQ1NDE5NVUsCS8vIDw0LDUsNCw2PjogQ29zdCAzIHZleHQyIDw0LDYsNCw1PiwgPDQsNiw0LDU+CisgIDI3MTg3NDg2MTRVLAkvLyA8NCw1LDQsNz46IENvc3QgMyB2ZXh0MyA8NSw2LDcsND4sIDw1LDQsNyw2PgorICAxNTU3Nzc3OTYxVSwJLy8gPDQsNSw0LHU+OiBDb3N0IDIgdmV4dDIgPDIsMyw0LDU+LCBSSFMKKyAgMTUwMzM0Njc5MFUsCS8vIDw0LDUsNSwwPjogQ29zdCAyIHZleHQxIDw0LDQsNSw1PiwgTEhTCisgIDI5MTMzOTg0ODBVLAkvLyA8NCw1LDUsMT46IENvc3QgMyB2emlwbCBSSFMsIDw1LDEsNywzPgorICAyNjMxNTE5OTk4VSwJLy8gPDQsNSw1LDI+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDU+LCA8NSwyLDMsND4KKyAgMjU3NzA5MDcxMFUsCS8vIDw0LDUsNSwzPjogQ29zdCAzIHZleHQxIDw0LDQsNSw1PiwgPDMsMCwxLDI+CisgIDE1MDMzNDk5NzhVLAkvLyA8NCw1LDUsND46IENvc3QgMiB2ZXh0MSA8NCw0LDUsNT4sIDw0LDQsNSw1PgorICAyNjMxNTIwMjYwVSwJLy8gPDQsNSw1LDU+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDU+LCA8NSw1LDUsNT4KKyAgMjkxMzM5MDY5MFUsCS8vIDw0LDUsNSw2PjogQ29zdCAzIHZ6aXBsIFJIUywgPDUsNiw3LDA+CisgIDI4MjEzNDQ1NjZVLAkvLyA8NCw1LDUsNz46IENvc3QgMyB2dXpwciA8MCw0LDEsNT4sIFJIUworICAxNTAzMzUyNjIyVSwJLy8gPDQsNSw1LHU+OiBDb3N0IDIgdmV4dDEgPDQsNCw1LDU+LCBMSFMKKyAgMTQ5NzM4MzAxNFUsCS8vIDw0LDUsNiwwPjogQ29zdCAyIHZleHQxIDwzLDQsNSw2PiwgTEhTCisgIDI1NTkxODE5MDRVLAkvLyA8NCw1LDYsMT46IENvc3QgMyB2ZXh0MSA8MSw0LDUsNj4sIDwxLDQsNSw2PgorICAyNTY1MTU0NjAxVSwJLy8gPDQsNSw2LDI+OiBDb3N0IDMgdmV4dDEgPDIsNCw1LDY+LCA8Miw0LDUsNj4KKyAgMTQ5NzM4NTQ3NFUsCS8vIDw0LDUsNiwzPjogQ29zdCAyIHZleHQxIDwzLDQsNSw2PiwgPDMsNCw1LDY+CisgIDE0OTczODYyOTRVLAkvLyA8NCw1LDYsND46IENvc3QgMiB2ZXh0MSA8Myw0LDUsNj4sIFJIUworICAzMDQ3NjA4MzI0VSwJLy8gPDQsNSw2LDU+OiBDb3N0IDMgdnRybmwgUkhTLCA8NSw1LDUsNT4KKyAgMjU3MTEyOTY1NlUsCS8vIDw0LDUsNiw2PjogQ29zdCAzIHZleHQxIDwzLDQsNSw2PiwgPDYsNiw2LDY+CisgIDI3NzA1MzQ0VSwJLy8gPDQsNSw2LDc+OiBDb3N0IDAgY29weSBSSFMKKyAgMjc3MDUzNDRVLAkvLyA8NCw1LDYsdT46IENvc3QgMCBjb3B5IFJIUworICAyNTY1MTYxMDYyVSwJLy8gPDQsNSw3LDA+OiBDb3N0IDMgdmV4dDEgPDIsNCw1LDc+LCBMSFMKKyAgMjU2NTE2MTg4MlUsCS8vIDw0LDUsNywxPjogQ29zdCAzIHZleHQxIDwyLDQsNSw3PiwgPDEsMiwzLDQ+CisgIDI1NjUxNjI3OTRVLAkvLyA8NCw1LDcsMj46IENvc3QgMyB2ZXh0MSA8Miw0LDUsNz4sIDwyLDQsNSw3PgorICAyNjYxMzgxMzg3VSwJLy8gPDQsNSw3LDM+OiBDb3N0IDMgdmV4dDIgPDcsMyw0LDU+LCA8NywzLDQsNT4KKyAgMjU2NTE2NDM0MlUsCS8vIDw0LDUsNyw0PjogQ29zdCAzIHZleHQxIDwyLDQsNSw3PiwgUkhTCisgIDI3MTg3NDg4NDBVLAkvLyA8NCw1LDcsNT46IENvc3QgMyB2ZXh0MyA8NSw2LDcsND4sIDw1LDcsNSw3PgorICAyNzE4NzQ4ODQ2VSwJLy8gPDQsNSw3LDY+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDQ+LCA8NSw3LDYsND4KKyAgMjcxOTQxMjQwN1UsCS8vIDw0LDUsNyw3PjogQ29zdCAzIHZleHQzIDw1LDcsNyw0PiwgPDUsNyw3LDQ+CisgIDI1NjUxNjY4OTRVLAkvLyA8NCw1LDcsdT46IENvc3QgMyB2ZXh0MSA8Miw0LDUsNz4sIExIUworICAxNDk3Mzk5Mzk4VSwJLy8gPDQsNSx1LDA+OiBDb3N0IDIgdmV4dDEgPDMsNCw1LHU+LCBMSFMKKyAgMTU1Nzc4MDI3MFUsCS8vIDw0LDUsdSwxPjogQ29zdCAyIHZleHQyIDwyLDMsNCw1PiwgTEhTCisgIDI2MzE1MjIxODFVLAkvLyA8NCw1LHUsMj46IENvc3QgMyB2ZXh0MiA8MiwzLDQsNT4sIDx1LDIsMywwPgorICAxNDk3NDAxODYwVSwJLy8gPDQsNSx1LDM+OiBDb3N0IDIgdmV4dDEgPDMsNCw1LHU+LCA8Myw0LDUsdT4KKyAgMTQ5NzQwMjY3OFUsCS8vIDw0LDUsdSw0PjogQ29zdCAyIHZleHQxIDwzLDQsNSx1PiwgUkhTCisgIDE1NTc3ODA2MzRVLAkvLyA8NCw1LHUsNT46IENvc3QgMiB2ZXh0MiA8MiwzLDQsNT4sIFJIUworICAyNjMxNTIyNTEyVSwJLy8gPDQsNSx1LDY+OiBDb3N0IDMgdmV4dDIgPDIsMyw0LDU+LCA8dSw2LDMsNz4KKyAgMjc3MDUzNDRVLAkvLyA8NCw1LHUsNz46IENvc3QgMCBjb3B5IFJIUworICAyNzcwNTM0NFUsCS8vIDw0LDUsdSx1PjogQ29zdCAwIGNvcHkgUkhTCisgIDI2MTg5MTY4NjRVLAkvLyA8NCw2LDAsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDwwLDAsMCwwPgorICAxNTQ1MTc1MTQyVSwJLy8gPDQsNiwwLDE+OiBDb3N0IDIgdmV4dDIgPDAsMiw0LDY+LCBMSFMKKyAgMTU0NTE3NTI0NFUsCS8vIDw0LDYsMCwyPjogQ29zdCAyIHZleHQyIDwwLDIsNCw2PiwgPDAsMiw0LDY+CisgIDM2OTI2NTg5NDBVLAkvLyA8NCw2LDAsMz46IENvc3QgNCB2ZXh0MiA8MCwyLDQsNj4sIDwwLDMsMSwwPgorICAyNjE4OTE3MjAyVSwJLy8gPDQsNiwwLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LDY+LCA8MCw0LDEsNT4KKyAgMzg1MjkxMDgwNlUsCS8vIDw0LDYsMCw1PjogQ29zdCA0IHZ1enBsIFJIUywgPDAsMiw1LDc+CisgIDIyNTM1MjU2NDhVLAkvLyA8NCw2LDAsNj46IENvc3QgMyB2cmV2IDw2LDQsNiwwPgorICA0MDQwNzY0NzI2VSwJLy8gPDQsNiwwLDc+OiBDb3N0IDQgdnppcHIgPDIsMyw0LDA+LCBSSFMKKyAgMTU0NTE3NTcwOVUsCS8vIDw0LDYsMCx1PjogQ29zdCAyIHZleHQyIDwwLDIsNCw2PiwgTEhTCisgIDI2MTg5MTc2MjJVLAkvLyA8NCw2LDEsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDwxLDAsMywyPgorICAyNjE4OTE3Njg0VSwJLy8gPDQsNiwxLDE+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LDY+LCA8MSwxLDEsMT4KKyAgMjYxODkxNzc4MlUsCS8vIDw0LDYsMSwyPjogQ29zdCAzIHZleHQyIDwwLDIsNCw2PiwgPDEsMiwzLDA+CisgIDI2MTg5MTc4NDhVLAkvLyA8NCw2LDEsMz46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDwxLDMsMSwzPgorICAzNjkyNjU5NzczVSwJLy8gPDQsNiwxLDQ+OiBDb3N0IDQgdmV4dDIgPDAsMiw0LDY+LCA8MSw0LDMsNT4KKyAgMjYxODkxODAzMlUsCS8vIDw0LDYsMSw1PjogQ29zdCAzIHZleHQyIDwwLDIsNCw2PiwgPDEsNSwzLDc+CisgIDM2OTI2NTk5MzdVLAkvLyA8NCw2LDEsNj46IENvc3QgNCB2ZXh0MiA8MCwyLDQsNj4sIDwxLDYsMyw3PgorICA0MDMyMTQ2NzQyVSwJLy8gPDQsNiwxLDc+OiBDb3N0IDQgdnppcHIgPDAsdSw0LDE+LCBSSFMKKyAgMjYxODkxODI1M1UsCS8vIDw0LDYsMSx1PjogQ29zdCAzIHZleHQyIDwwLDIsNCw2PiwgPDEsdSwxLDM+CisgIDI2MTg5MTgzODBVLAkvLyA8NCw2LDIsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDwyLDAsNiw0PgorICAyNjE4OTE4NDYwVSwJLy8gPDQsNiwyLDE+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LDY+LCA8MiwxLDYsMz4KKyAgMjYxODkxODUwNFUsCS8vIDw0LDYsMiwyPjogQ29zdCAzIHZleHQyIDwwLDIsNCw2PiwgPDIsMiwyLDI+CisgIDI2MTg5MTg1NjZVLAkvLyA8NCw2LDIsMz46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDwyLDMsMCwxPgorICAyNjE4OTE4Njc5VSwJLy8gPDQsNiwyLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LDY+LCA8Miw0LDMsNj4KKyAgMjYxODkxODc4OFUsCS8vIDw0LDYsMiw1PjogQ29zdCAzIHZleHQyIDwwLDIsNCw2PiwgPDIsNSw2LDc+CisgIDI2MTg5MTg4NDJVLAkvLyA8NCw2LDIsNj46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDwyLDYsMyw3PgorICAyNzE4NzQ5MTc4VSwJLy8gPDQsNiwyLDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDQ+LCA8NiwyLDcsMz4KKyAgMjYxODkxODk3MVUsCS8vIDw0LDYsMix1PjogQ29zdCAzIHZleHQyIDwwLDIsNCw2PiwgPDIsdSwwLDE+CisgIDI2MTg5MTkwNjJVLAkvLyA8NCw2LDMsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDwzLDAsMSwyPgorICAyNjM2MTcxNTI2VSwJLy8gPDQsNiwzLDE+OiBDb3N0IDMgdmV4dDIgPDMsMSw0LDY+LCA8MywxLDQsNj4KKyAgMzY5MjY2MTA1N1UsCS8vIDw0LDYsMywyPjogQ29zdCA0IHZleHQyIDwwLDIsNCw2PiwgPDMsMiwyLDI+CisgIDI2MTg5MTkzMjRVLAkvLyA8NCw2LDMsMz46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDwzLDMsMywzPgorICAyNjE4OTE5NDI2VSwJLy8gPDQsNiwzLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LDY+LCA8Myw0LDUsNj4KKyAgMjYzODgyNjA1OFUsCS8vIDw0LDYsMyw1PjogQ29zdCAzIHZleHQyIDwzLDUsNCw2PiwgPDMsNSw0LDY+CisgIDM5MTMzMDMwMzBVLAkvLyA8NCw2LDMsNj46IENvc3QgNCB2dXpwciA8Myw0LDUsNj4sIDwxLDMsNCw2PgorICAyNzIyNzMwNTcyVSwJLy8gPDQsNiwzLDc+OiBDb3N0IDMgdmV4dDMgPDYsMyw3LDQ+LCA8NiwzLDcsND4KKyAgMjYxODkxOTcxMFUsCS8vIDw0LDYsMyx1PjogQ29zdCAzIHZleHQyIDwwLDIsNCw2PiwgPDMsdSwxLDI+CisgIDI1NjUyMTAyMTRVLAkvLyA8NCw2LDQsMD46IENvc3QgMyB2ZXh0MSA8Miw0LDYsND4sIExIUworICAyNzE4NzQ5Mjg2VSwJLy8gPDQsNiw0LDE+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDQ+LCA8Niw0LDEsMz4KKyAgMjU2NTIxMTk1MlUsCS8vIDw0LDYsNCwyPjogQ29zdCAzIHZleHQxIDwyLDQsNiw0PiwgPDIsNCw2LDQ+CisgIDI1NzExODQ2NDlVLAkvLyA8NCw2LDQsMz46IENvc3QgMyB2ZXh0MSA8Myw0LDYsND4sIDwzLDQsNiw0PgorICAyNTY1MjEzNDk0VSwJLy8gPDQsNiw0LDQ+OiBDb3N0IDMgdmV4dDEgPDIsNCw2LDQ+LCBSSFMKKyAgMTU0NTE3ODQyMlUsCS8vIDw0LDYsNCw1PjogQ29zdCAyIHZleHQyIDwwLDIsNCw2PiwgUkhTCisgIDE3MDU0MzAzMjZVLAkvLyA8NCw2LDQsNj46IENvc3QgMiB2dXpwbCBSSFMsIFJIUworICAyNTk1MDc1NDM3VSwJLy8gPDQsNiw0LDc+OiBDb3N0IDMgdmV4dDEgPDcsNCw2LDQ+LCA8Nyw0LDYsND4KKyAgMTU0NTE3ODY2NVUsCS8vIDw0LDYsNCx1PjogQ29zdCAyIHZleHQyIDwwLDIsNCw2PiwgUkhTCisgIDI1NjUyMTg0MDZVLAkvLyA8NCw2LDUsMD46IENvc3QgMyB2ZXh0MSA8Miw0LDYsNT4sIExIUworICAyNjQ1NDYyNzM2VSwJLy8gPDQsNiw1LDE+OiBDb3N0IDMgdmV4dDIgPDQsNiw0LDY+LCA8NSwxLDcsMz4KKyAgMjkxMzM5OTI5MFUsCS8vIDw0LDYsNSwyPjogQ29zdCAzIHZ6aXBsIFJIUywgPDYsMiw3LDM+CisgIDM5MTMzMDUzOTRVLAkvLyA8NCw2LDUsMz46IENvc3QgNCB2dXpwciA8Myw0LDUsNj4sIDw0LDUsNiwzPgorICAyNjQ1NDYyOTgyVSwJLy8gPDQsNiw1LDQ+OiBDb3N0IDMgdmV4dDIgPDQsNiw0LDY+LCA8NSw0LDcsNj4KKyAgMjc3OTE3Mjg2OFUsCS8vIDw0LDYsNSw1PjogQ29zdCAzIHZ1enBsIFJIUywgPDUsNSw1LDU+CisgIDI5MTMzOTE0MTZVLAkvLyA8NCw2LDUsNj46IENvc3QgMyB2emlwbCBSSFMsIDw2LDYsNiw2PgorICAyODIxNDI2NDg2VSwJLy8gPDQsNiw1LDc+OiBDb3N0IDMgdnV6cHIgPDAsNCwyLDY+LCBSSFMKKyAgMjgyMTQyNjQ4N1UsCS8vIDw0LDYsNSx1PjogQ29zdCAzIHZ1enByIDwwLDQsMiw2PiwgUkhTCisgIDE1MDM0Mjg3MTBVLAkvLyA8NCw2LDYsMD46IENvc3QgMiB2ZXh0MSA8NCw0LDYsNj4sIExIUworICAyNTc3MTcxMTkwVSwJLy8gPDQsNiw2LDE+OiBDb3N0IDMgdmV4dDEgPDQsNCw2LDY+LCA8MSwwLDMsMj4KKyAgMjY0NTQ2MzU0NlUsCS8vIDw0LDYsNiwyPjogQ29zdCAzIHZleHQyIDw0LDYsNCw2PiwgPDYsMiw3LDM+CisgIDI1NzcxNzI2MzBVLAkvLyA8NCw2LDYsMz46IENvc3QgMyB2ZXh0MSA8NCw0LDYsNj4sIDwzLDAsMSwyPgorICAxNTAzNDMxOTA4VSwJLy8gPDQsNiw2LDQ+OiBDb3N0IDIgdmV4dDEgPDQsNCw2LDY+LCA8NCw0LDYsNj4KKyAgMjI1MzUwMTA2OVUsCS8vIDw0LDYsNiw1PjogQ29zdCAzIHZyZXYgPDYsNCw1LDY+CisgIDI2MTg5MjE3ODRVLAkvLyA8NCw2LDYsNj46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDw2LDYsNiw2PgorICAyOTU0NDY0NTY2VSwJLy8gPDQsNiw2LDc+OiBDb3N0IDMgdnppcHIgPDAsMiw0LDY+LCBSSFMKKyAgMTUwMzQzNDU0MlUsCS8vIDw0LDYsNix1PjogQ29zdCAyIHZleHQxIDw0LDQsNiw2PiwgTEhTCisgIDI2NDU0NjQwNThVLAkvLyA8NCw2LDcsMD46IENvc3QgMyB2ZXh0MiA8NCw2LDQsNj4sIDw3LDAsMSwyPgorICAyNzc5MTczODgyVSwJLy8gPDQsNiw3LDE+OiBDb3N0IDMgdnV6cGwgUkhTLCA8NywwLDEsMj4KKyAgMzYzODk3ODM1NVUsCS8vIDw0LDYsNywyPjogQ29zdCA0IHZleHQxIDwyLDQsNiw3PiwgPDIsNCw2LDc+CisgIDI3MjUwOTAxNTZVLAkvLyA8NCw2LDcsMz46IENvc3QgMyB2ZXh0MyA8Niw3LDMsND4sIDw2LDcsMyw0PgorICAyNjQ1NDY0NDIyVSwJLy8gPDQsNiw3LDQ+OiBDb3N0IDMgdmV4dDIgPDQsNiw0LDY+LCA8Nyw0LDUsNj4KKyAgMjc3OTE3NDI0NlUsCS8vIDw0LDYsNyw1PjogQ29zdCAzIHZ1enBsIFJIUywgPDcsNCw1LDY+CisgIDM4NTI5MTU5MTRVLAkvLyA8NCw2LDcsNj46IENvc3QgNCB2dXpwbCBSSFMsIDw3LDIsNiwzPgorICAyNzc5MTc0NTA4VSwJLy8gPDQsNiw3LDc+OiBDb3N0IDMgdnV6cGwgUkhTLCA8Nyw3LDcsNz4KKyAgMjc3OTE3Mzk0NVUsCS8vIDw0LDYsNyx1PjogQ29zdCAzIHZ1enBsIFJIUywgPDcsMCx1LDI+CisgIDE1MDM0NDUwOTRVLAkvLyA8NCw2LHUsMD46IENvc3QgMiB2ZXh0MSA8NCw0LDYsdT4sIExIUworICAxNTQ1MTgwOTc0VSwJLy8gPDQsNix1LDE+OiBDb3N0IDIgdmV4dDIgPDAsMiw0LDY+LCBMSFMKKyAgMTcwNTQzMjg3OFUsCS8vIDw0LDYsdSwyPjogQ29zdCAyIHZ1enBsIFJIUywgTEhTCisgIDI2MTg5MjI5NDBVLAkvLyA8NCw2LHUsMz46IENvc3QgMyB2ZXh0MiA8MCwyLDQsNj4sIDx1LDMsMCwxPgorICAxNTAzNDQ4Mjk0VSwJLy8gPDQsNix1LDQ+OiBDb3N0IDIgdmV4dDEgPDQsNCw2LHU+LCA8NCw0LDYsdT4KKyAgMTU0NTE4MTMzOFUsCS8vIDw0LDYsdSw1PjogQ29zdCAyIHZleHQyIDwwLDIsNCw2PiwgUkhTCisgIDE3MDU0MzMyNDJVLAkvLyA8NCw2LHUsNj46IENvc3QgMiB2dXpwbCBSSFMsIFJIUworICAyOTU0NDgwOTUwVSwJLy8gPDQsNix1LDc+OiBDb3N0IDMgdnppcHIgPDAsMiw0LHU+LCBSSFMKKyAgMTU0NTE4MTU0MVUsCS8vIDw0LDYsdSx1PjogQ29zdCAyIHZleHQyIDwwLDIsNCw2PiwgTEhTCisgIDM3MDY2MDE0NzJVLAkvLyA8NCw3LDAsMD46IENvc3QgNCB2ZXh0MiA8Miw1LDQsNz4sIDwwLDAsMCwwPgorICAyNjMyODU5NzUwVSwJLy8gPDQsNywwLDE+OiBDb3N0IDMgdmV4dDIgPDIsNSw0LDc+LCBMSFMKKyAgMjcyNjM0MzY4NVUsCS8vIDw0LDcsMCwyPjogQ29zdCAzIHZleHQzIDw3LDAsMiw0PiwgPDcsMCwyLDQ+CisgIDM3MDEyOTMzMTJVLAkvLyA8NCw3LDAsMz46IENvc3QgNCB2ZXh0MiA8MSw2LDQsNz4sIDwwLDMsMSw0PgorICAzNzA2NjAxODEwVSwJLy8gPDQsNywwLDQ+OiBDb3N0IDQgdmV4dDIgPDIsNSw0LDc+LCA8MCw0LDEsNT4KKyAgMjI1OTQyNDYwOFUsCS8vIDw0LDcsMCw1PjogQ29zdCAzIHZyZXYgPDcsNCw1LDA+CisgIDM2OTUzMjE2MTdVLAkvLyA8NCw3LDAsNj46IENvc3QgNCB2ZXh0MiA8MCw2LDQsNz4sIDwwLDYsNCw3PgorICAzODAwNDU0MTk0VSwJLy8gPDQsNywwLDc+OiBDb3N0IDQgdmV4dDMgPDcsMCw3LDQ+LCA8NywwLDcsND4KKyAgMjYzMjg2MDMxN1UsCS8vIDw0LDcsMCx1PjogQ29zdCAzIHZleHQyIDwyLDUsNCw3PiwgTEhTCisgIDIyNTkwNjQxMTZVLAkvLyA8NCw3LDEsMD46IENvc3QgMyB2cmV2IDw3LDQsMCwxPgorICAzNzAwNjMwMzI0VSwJLy8gPDQsNywxLDE+OiBDb3N0IDQgdmV4dDIgPDEsNSw0LDc+LCA8MSwxLDEsMT4KKyAgMjYzMjg2MDU3MFUsCS8vIDw0LDcsMSwyPjogQ29zdCAzIHZleHQyIDwyLDUsNCw3PiwgPDEsMiwzLDQ+CisgIDM3Njk2MzU5MzZVLAkvLyA8NCw3LDEsMz46IENvc3QgNCB2ZXh0MyA8MSx1LDMsND4sIDw3LDEsMyw1PgorICAzNjU2OTIwMzc0VSwJLy8gPDQsNywxLDQ+OiBDb3N0IDQgdmV4dDEgPDUsNCw3LDE+LCBSSFMKKyAgMzcwMDYzMDY4MVUsCS8vIDw0LDcsMSw1PjogQ29zdCA0IHZleHQyIDwxLDUsNCw3PiwgPDEsNSw0LDc+CisgIDM3MDEyOTQzMTRVLAkvLyA8NCw3LDEsNj46IENvc3QgNCB2ZXh0MiA8MSw2LDQsNz4sIDwxLDYsNCw3PgorICAzNzkzODE4NzU0VSwJLy8gPDQsNywxLDc+OiBDb3N0IDQgdmV4dDMgPDUsdSw3LDQ+LCA8NywxLDcsMz4KKyAgMjI1OTY1NDAxMlUsCS8vIDw0LDcsMSx1PjogQ29zdCAzIHZyZXYgPDcsNCx1LDE+CisgIDM2NTY5MjUyODZVLAkvLyA8NCw3LDIsMD46IENvc3QgNCB2ZXh0MSA8NSw0LDcsMj4sIExIUworICAzNzA2NjAzMDUwVSwJLy8gPDQsNywyLDE+OiBDb3N0IDQgdmV4dDIgPDIsNSw0LDc+LCA8MiwxLDQsMz4KKyAgMzcwNjYwMzExMlUsCS8vIDw0LDcsMiwyPjogQ29zdCA0IHZleHQyIDwyLDUsNCw3PiwgPDIsMiwyLDI+CisgIDI3Mjc3NDQ2ODhVLAkvLyA8NCw3LDIsMz46IENvc3QgMyB2ZXh0MyA8NywyLDMsND4sIDw3LDIsMyw0PgorICAzNzA1OTM5NzQ1VSwJLy8gPDQsNywyLDQ+OiBDb3N0IDQgdmV4dDIgPDIsNCw0LDc+LCA8Miw0LDQsNz4KKyAgMjYzMjg2MTU1NFUsCS8vIDw0LDcsMiw1PjogQ29zdCAzIHZleHQyIDwyLDUsNCw3PiwgPDIsNSw0LDc+CisgIDM3MDY2MDM0NTBVLAkvLyA8NCw3LDIsNj46IENvc3QgNCB2ZXh0MiA8Miw1LDQsNz4sIDwyLDYsMyw3PgorICAzNzkyNDkxNzMxVSwJLy8gPDQsNywyLDc+OiBDb3N0IDQgdmV4dDMgPDUsNiw3LDQ+LCA8NywyLDcsMz4KKyAgMjYzNDg1MjQ1M1UsCS8vIDw0LDcsMix1PjogQ29zdCAzIHZleHQyIDwyLHUsNCw3PiwgPDIsdSw0LDc+CisgIDM3MDY2MDM2NzBVLAkvLyA8NCw3LDMsMD46IENvc3QgNCB2ZXh0MiA8Miw1LDQsNz4sIDwzLDAsMSwyPgorICAzNjYyOTA2MjY2VSwJLy8gPDQsNywzLDE+OiBDb3N0IDQgdmV4dDEgPDYsNCw3LDM+LCA8MSwyLDMsND4KKyAgMzcyNTE4MzMyNlUsCS8vIDw0LDcsMywyPjogQ29zdCA0IHZleHQyIDw1LDYsNCw3PiwgPDMsMiw1LDQ+CisgIDM3MDY2MDM5MzJVLAkvLyA8NCw3LDMsMz46IENvc3QgNCB2ZXh0MiA8Miw1LDQsNz4sIDwzLDMsMywzPgorICAzNzAxMjk1NjE4VSwJLy8gPDQsNywzLDQ+OiBDb3N0IDQgdmV4dDIgPDEsNiw0LDc+LCA8Myw0LDUsNj4KKyAgMjYzODgzNDI1MVUsCS8vIDw0LDcsMyw1PjogQ29zdCAzIHZleHQyIDwzLDUsNCw3PiwgPDMsNSw0LDc+CisgIDI2Mzk0OTc4ODRVLAkvLyA8NCw3LDMsNj46IENvc3QgMyB2ZXh0MiA8Myw2LDQsNz4sIDwzLDYsNCw3PgorICAzODAyNDQ1MDkzVSwJLy8gPDQsNywzLDc+OiBDb3N0IDQgdmV4dDMgPDcsMyw3LDQ+LCA8NywzLDcsND4KKyAgMjY0MDgyNTE1MFUsCS8vIDw0LDcsMyx1PjogQ29zdCAzIHZleHQyIDwzLHUsNCw3PiwgPDMsdSw0LDc+CisgIDI3MTg3NTAwMDRVLAkvLyA8NCw3LDQsMD46IENvc3QgMyB2ZXh0MyA8NSw2LDcsND4sIDw3LDQsMCwxPgorICAzNzA2NjA0NDkwVSwJLy8gPDQsNyw0LDE+OiBDb3N0IDQgdmV4dDIgPDIsNSw0LDc+LCA8NCwxLDIsMz4KKyAgMzY1Njk0MzQ3NFUsCS8vIDw0LDcsNCwyPjogQ29zdCA0IHZleHQxIDw1LDQsNyw0PiwgPDIsNSw0LDc+CisgIDM3Nzk4ODQzNzFVLAkvLyA8NCw3LDQsMz46IENvc3QgNCB2ZXh0MyA8Myw1LDcsND4sIDw3LDQsMyw1PgorICAyMjU5MzgzNjQzVSwJLy8gPDQsNyw0LDQ+OiBDb3N0IDMgdnJldiA8Nyw0LDQsND4KKyAgMjYzMjg2MzAzMFUsCS8vIDw0LDcsNCw1PjogQ29zdCAzIHZleHQyIDwyLDUsNCw3PiwgUkhTCisgIDIyNTk1MzExMTdVLAkvLyA8NCw3LDQsNj46IENvc3QgMyB2cmV2IDw3LDQsNiw0PgorICAzOTA3MzQwMDc0VSwJLy8gPDQsNyw0LDc+OiBDb3N0IDQgdnV6cHIgPDIsNCw1LDc+LCA8Miw0LDUsNz4KKyAgMjYzMjg2MzI3M1UsCS8vIDw0LDcsNCx1PjogQ29zdCAzIHZleHQyIDwyLDUsNCw3PiwgUkhTCisgIDI5MTMzOTE2MTBVLAkvLyA8NCw3LDUsMD46IENvc3QgMyB2emlwbCBSSFMsIDw3LDAsMSwyPgorICAzNjQ1MDA2ODQ4VSwJLy8gPDQsNyw1LDE+OiBDb3N0IDQgdmV4dDEgPDMsNCw3LDU+LCA8MSwzLDUsNz4KKyAgMjU4OTE4MTY0NlUsCS8vIDw0LDcsNSwyPjogQ29zdCAzIHZleHQxIDw2LDQsNyw1PiwgPDIsMyw0LDU+CisgIDM2NDUwMDg0MDNVLAkvLyA8NCw3LDUsMz46IENvc3QgNCB2ZXh0MSA8Myw0LDcsNT4sIDwzLDQsNyw1PgorICAyOTEzMzkxOTc0VSwJLy8gPDQsNyw1LDQ+OiBDb3N0IDMgdnppcGwgUkhTLCA8Nyw0LDUsNj4KKyAgMjU4MzIxMTk3M1UsCS8vIDw0LDcsNSw1PjogQ29zdCAzIHZleHQxIDw1LDQsNyw1PiwgPDUsNCw3LDU+CisgIDI1ODkxODQ2NzBVLAkvLyA8NCw3LDUsNj46IENvc3QgMyB2ZXh0MSA8Niw0LDcsNT4sIDw2LDQsNyw1PgorICAyOTEzMzkyMjM2VSwJLy8gPDQsNyw1LDc+OiBDb3N0IDMgdnppcGwgUkhTLCA8Nyw3LDcsNz4KKyAgMjkxMzM5MjI1OFUsCS8vIDw0LDcsNSx1PjogQ29zdCAzIHZ6aXBsIFJIUywgPDcsdSwxLDI+CisgIDE1MDk0NzQ0MDZVLAkvLyA8NCw3LDYsMD46IENvc3QgMiB2ZXh0MSA8NSw0LDcsNj4sIExIUworICAzMDQ3NjA5MzM4VSwJLy8gPDQsNyw2LDE+OiBDb3N0IDMgdnRybmwgUkhTLCA8NywwLDEsMj4KKyAgMjU4MzIxNzc2OFUsCS8vIDw0LDcsNiwyPjogQ29zdCAzIHZleHQxIDw1LDQsNyw2PiwgPDIsMiwyLDI+CisgIDI1ODMyMTgzMjZVLAkvLyA8NCw3LDYsMz46IENvc3QgMyB2ZXh0MSA8NSw0LDcsNj4sIDwzLDAsMSwyPgorICAxNTA5NDc3Njg2VSwJLy8gPDQsNyw2LDQ+OiBDb3N0IDIgdmV4dDEgPDUsNCw3LDY+LCBSSFMKKyAgMTUwOTQ3ODM0MlUsCS8vIDw0LDcsNiw1PjogQ29zdCAyIHZleHQxIDw1LDQsNyw2PiwgPDUsNCw3LDY+CisgIDI1ODMyMjA3MzBVLAkvLyA8NCw3LDYsNj46IENvc3QgMyB2ZXh0MSA8NSw0LDcsNj4sIDw2LDIsNywzPgorICAzMDQ3NjA5OTY0VSwJLy8gPDQsNyw2LDc+OiBDb3N0IDMgdnRybmwgUkhTLCA8Nyw3LDcsNz4KKyAgMTUwOTQ4MDIzOFUsCS8vIDw0LDcsNix1PjogQ29zdCAyIHZleHQxIDw1LDQsNyw2PiwgTEhTCisgIDM2NTA5OTQyNzhVLAkvLyA8NCw3LDcsMD46IENvc3QgNCB2ZXh0MSA8NCw0LDcsNz4sIExIUworICAzNjUwOTk1MDk4VSwJLy8gPDQsNyw3LDE+OiBDb3N0IDQgdmV4dDEgPDQsNCw3LDc+LCA8MSwyLDMsND4KKyAgMzY1MDk5NjAxMFUsCS8vIDw0LDcsNywyPjogQ29zdCA0IHZleHQxIDw0LDQsNyw3PiwgPDIsNCw1LDc+CisgIDM4MDQ4MDQ2NzdVLAkvLyA8NCw3LDcsMz46IENvc3QgNCB2ZXh0MyA8Nyw3LDMsND4sIDw3LDcsMyw0PgorICAzNjUwOTk3NDg2VSwJLy8gPDQsNyw3LDQ+OiBDb3N0IDQgdmV4dDEgPDQsNCw3LDc+LCA8NCw0LDcsNz4KKyAgMjY2MjcyNTAzOVUsCS8vIDw0LDcsNyw1PjogQ29zdCAzIHZleHQyIDw3LDUsNCw3PiwgPDcsNSw0LDc+CisgIDM2NjI5NDI4ODBVLAkvLyA8NCw3LDcsNj46IENvc3QgNCB2ZXh0MSA8Niw0LDcsNz4sIDw2LDQsNyw3PgorICAyNzE4NzUwMzE2VSwJLy8gPDQsNyw3LDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDQ+LCA8Nyw3LDcsNz4KKyAgMjY2NDcxNTkzOFUsCS8vIDw0LDcsNyx1PjogQ29zdCAzIHZleHQyIDw3LHUsNCw3PiwgPDcsdSw0LDc+CisgIDE1MDk0OTA3OTBVLAkvLyA8NCw3LHUsMD46IENvc3QgMiB2ZXh0MSA8NSw0LDcsdT4sIExIUworICAyNjMyODY1NTgyVSwJLy8gPDQsNyx1LDE+OiBDb3N0IDMgdmV4dDIgPDIsNSw0LDc+LCBMSFMKKyAgMjU4MzIzNDE1MlUsCS8vIDw0LDcsdSwyPjogQ29zdCAzIHZleHQxIDw1LDQsNyx1PiwgPDIsMiwyLDI+CisgIDI1ODMyMzQ3MTBVLAkvLyA8NCw3LHUsMz46IENvc3QgMyB2ZXh0MSA8NSw0LDcsdT4sIDwzLDAsMSwyPgorICAxNTA5NDk0MDcwVSwJLy8gPDQsNyx1LDQ+OiBDb3N0IDIgdmV4dDEgPDUsNCw3LHU+LCBSSFMKKyAgMTUwOTQ5NDcyOFUsCS8vIDw0LDcsdSw1PjogQ29zdCAyIHZleHQxIDw1LDQsNyx1PiwgPDUsNCw3LHU+CisgIDI1ODMyMzcxMTRVLAkvLyA8NCw3LHUsNj46IENvc3QgMyB2ZXh0MSA8NSw0LDcsdT4sIDw2LDIsNywzPgorICAzMDQ3NzU3NDIwVSwJLy8gPDQsNyx1LDc+OiBDb3N0IDMgdnRybmwgUkhTLCA8Nyw3LDcsNz4KKyAgMTUwOTQ5NjYyMlUsCS8vIDw0LDcsdSx1PjogQ29zdCAyIHZleHQxIDw1LDQsNyx1PiwgTEhTCisgIDI2MTg5MzMyNDhVLAkvLyA8NCx1LDAsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDQsdT4sIDwwLDAsMCwwPgorICAxNTQ1MTkxNTI2VSwJLy8gPDQsdSwwLDE+OiBDb3N0IDIgdmV4dDIgPDAsMiw0LHU+LCBMSFMKKyAgMTU0NTE5MTYzMFUsCS8vIDw0LHUsMCwyPjogQ29zdCAyIHZleHQyIDwwLDIsNCx1PiwgPDAsMiw0LHU+CisgIDI2OTE5MTM0NDVVLAkvLyA8NCx1LDAsMz46IENvc3QgMyB2ZXh0MyA8MSwyLDMsND4sIDx1LDAsMywyPgorICAyNjE4OTMzNTg2VSwJLy8gPDQsdSwwLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LHU+LCA8MCw0LDEsNT4KKyAgMjI2NTM5NzMwNVUsCS8vIDw0LHUsMCw1PjogQ29zdCAzIHZyZXYgPHUsNCw1LDA+CisgIDI1OTUxODk2MjVVLAkvLyA8NCx1LDAsNj46IENvc3QgMyB2ZXh0MSA8Nyw0LHUsMD4sIDw2LDcsNCx1PgorICAyNTk1MTkwMTM5VSwJLy8gPDQsdSwwLDc+OiBDb3N0IDMgdmV4dDEgPDcsNCx1LDA+LCA8Nyw0LHUsMD4KKyAgMTU0NTE5MjA5M1UsCS8vIDw0LHUsMCx1PjogQ29zdCAyIHZleHQyIDwwLDIsNCx1PiwgTEhTCisgIDI2MTg5MzQwMDZVLAkvLyA8NCx1LDEsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDQsdT4sIDwxLDAsMywyPgorICAyNjE4OTM0MDY4VSwJLy8gPDQsdSwxLDE+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LHU+LCA8MSwxLDEsMT4KKyAgMTYxODE3MTY5NFUsCS8vIDw0LHUsMSwyPjogQ29zdCAyIHZleHQzIDwxLDIsMyw0PiwgTEhTCisgIDI2MTg5MzQyMzJVLAkvLyA8NCx1LDEsMz46IENvc3QgMyB2ZXh0MiA8MCwyLDQsdT4sIDwxLDMsMSwzPgorICAyNjk1ODk0ODQ4VSwJLy8gPDQsdSwxLDQ+OiBDb3N0IDMgdmV4dDMgPDEsdSwzLDQ+LCA8dSwxLDQsMz4KKyAgMjYxODkzNDQxNlUsCS8vIDw0LHUsMSw1PjogQ29zdCAzIHZleHQyIDwwLDIsNCx1PiwgPDEsNSwzLDc+CisgIDM2OTI2NzYzMjFVLAkvLyA8NCx1LDEsNj46IENvc3QgNCB2ZXh0MiA8MCwyLDQsdT4sIDwxLDYsMyw3PgorICAyNzE4NzUwNTU1VSwJLy8gPDQsdSwxLDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDQ+LCA8dSwxLDcsMz4KKyAgMTYxODE3MTc0OFUsCS8vIDw0LHUsMSx1PjogQ29zdCAyIHZleHQzIDwxLDIsMyw0PiwgTEhTCisgIDI1NTMzOTczNTBVLAkvLyA8NCx1LDIsMD46IENvc3QgMyB2ZXh0MSA8MCw0LHUsMj4sIExIUworICAyNjMwMjE1MjE1VSwJLy8gPDQsdSwyLDE+OiBDb3N0IDMgdmV4dDIgPDIsMSw0LHU+LCA8MiwxLDQsdT4KKyAgMjYxODkzNDg4OFUsCS8vIDw0LHUsMiwyPjogQ29zdCAzIHZleHQyIDwwLDIsNCx1PiwgPDIsMiwyLDI+CisgIDE1NTc4MDA2NTdVLAkvLyA8NCx1LDIsMz46IENvc3QgMiB2ZXh0MiA8MiwzLDQsdT4sIDwyLDMsNCx1PgorICAyNjE4OTM1MDY1VSwJLy8gPDQsdSwyLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LHU+LCA8Miw0LDMsdT4KKyAgMjczMzg2NDg1OVUsCS8vIDw0LHUsMiw1PjogQ29zdCAzIHZleHQzIDx1LDIsNSw0PiwgPHUsMiw1LDQ+CisgIDI2MTg5MzUyMjZVLAkvLyA8NCx1LDIsNj46IENvc3QgMyB2ZXh0MiA8MCwyLDQsdT4sIDwyLDYsMyw3PgorICAyNzE4NzUwNjM2VSwJLy8gPDQsdSwyLDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDQ+LCA8dSwyLDcsMz4KKyAgMTU2MTExODgyMlUsCS8vIDw0LHUsMix1PjogQ29zdCAyIHZleHQyIDwyLHUsNCx1PiwgPDIsdSw0LHU+CisgIDI2MTg5MzU0NDZVLAkvLyA8NCx1LDMsMD46IENvc3QgMyB2ZXh0MiA8MCwyLDQsdT4sIDwzLDAsMSwyPgorICAyNzc5MzE4NDIyVSwJLy8gPDQsdSwzLDE+OiBDb3N0IDMgdnV6cGwgUkhTLCA8MywwLDEsMj4KKyAgMjYzNjg1MTU0NVUsCS8vIDw0LHUsMywyPjogQ29zdCAzIHZleHQyIDwzLDIsNCx1PiwgPDMsMiw0LHU+CisgIDI2MTg5MzU3MDhVLAkvLyA8NCx1LDMsMz46IENvc3QgMyB2ZXh0MiA8MCwyLDQsdT4sIDwzLDMsMywzPgorICAyNjE4OTM1ODEwVSwJLy8gPDQsdSwzLDQ+OiBDb3N0IDMgdmV4dDIgPDAsMiw0LHU+LCA8Myw0LDUsNj4KKyAgMjY5MTkxMzcxMVUsCS8vIDw0LHUsMyw1PjogQ29zdCAzIHZleHQzIDwxLDIsMyw0PiwgPHUsMyw1LDc+CisgIDI1ODg3MjU4NjJVLAkvLyA8NCx1LDMsNj46IENvc3QgMyB2ZXh0MSA8Niw0LDEsMz4sIDw2LDQsMSwzPgorICAyNjQwMTY5NzEwVSwJLy8gPDQsdSwzLDc+OiBDb3N0IDMgdmV4dDIgPDMsNyw0LHU+LCA8Myw3LDQsdT4KKyAgMjYxODkzNjA5NFUsCS8vIDw0LHUsMyx1PjogQ29zdCAzIHZleHQyIDwwLDIsNCx1PiwgPDMsdSwxLDI+CisgIDE1MDM1NTk3ODJVLAkvLyA8NCx1LDQsMD46IENvc3QgMiB2ZXh0MSA8NCw0LHUsND4sIExIUworICAyNjkyMjgyMzkxVSwJLy8gPDQsdSw0LDE+OiBDb3N0IDMgdmV4dDMgPDEsMix1LDQ+LCA8dSw0LDEsMj4KKyAgMjU2NTM1OTQyNlUsCS8vIDw0LHUsNCwyPjogQ29zdCAzIHZleHQxIDwyLDQsdSw0PiwgPDIsNCx1LDQ+CisgIDI1NzEzMzIxMjNVLAkvLyA8NCx1LDQsMz46IENvc3QgMyB2ZXh0MSA8Myw0LHUsND4sIDwzLDQsdSw0PgorICAxNjE5MjY0NTRVLAkvLyA8NCx1LDQsND46IENvc3QgMSB2ZHVwMCBSSFMKKyAgMTU0NTE5NDgwNlUsCS8vIDw0LHUsNCw1PjogQ29zdCAyIHZleHQyIDwwLDIsNCx1PiwgUkhTCisgIDE3MDU1Nzc3ODJVLAkvLyA8NCx1LDQsNj46IENvc3QgMiB2dXpwbCBSSFMsIFJIUworICAyNzE4NzUwODAxVSwJLy8gPDQsdSw0LDc+OiBDb3N0IDMgdmV4dDMgPDUsNiw3LDQ+LCA8dSw0LDcsNj4KKyAgMTYxOTI2NDU0VSwJLy8gPDQsdSw0LHU+OiBDb3N0IDEgdmR1cDAgUkhTCisgIDE0NzkxNjQwMDZVLAkvLyA8NCx1LDUsMD46IENvc3QgMiB2ZXh0MSA8MCw0LDEsNT4sIExIUworICAxODM5NjUwNjA2VSwJLy8gPDQsdSw1LDE+OiBDb3N0IDIgdnppcGwgUkhTLCBMSFMKKyAgMjU2NTM2NzUwMlUsCS8vIDw0LHUsNSwyPjogQ29zdCAzIHZleHQxIDwyLDQsdSw1PiwgPDIsMyw0LDU+CisgIDMwODk3NzczMDlVLAkvLyA8NCx1LDUsMz46IENvc3QgMyB2dHJuciA8MCw0LDEsNT4sIExIUworICAxNDc5MTY3Mjg2VSwJLy8gPDQsdSw1LDQ+OiBDb3N0IDIgdmV4dDEgPDAsNCwxLDU+LCBSSFMKKyAgMTgzOTY1MDk3MFUsCS8vIDw0LHUsNSw1PjogQ29zdCAyIHZ6aXBsIFJIUywgUkhTCisgIDE2MTgxNzIwNThVLAkvLyA8NCx1LDUsNj46IENvc3QgMiB2ZXh0MyA8MSwyLDMsND4sIFJIUworICAzMDg5NzgwMjY1VSwJLy8gPDQsdSw1LDc+OiBDb3N0IDMgdnRybnIgPDAsNCwxLDU+LCBSSFMKKyAgMTYxODE3MjA3NlUsCS8vIDw0LHUsNSx1PjogQ29zdCAyIHZleHQzIDwxLDIsMyw0PiwgUkhTCisgIDE0Nzk2ODgyOTRVLAkvLyA8NCx1LDYsMD46IENvc3QgMiB2ZXh0MSA8MCw0LHUsNj4sIExIUworICAyNTUzNDMwNzc0VSwJLy8gPDQsdSw2LDE+OiBDb3N0IDMgdmV4dDEgPDAsNCx1LDY+LCA8MSwwLDMsMj4KKyAgMTk3Mzg2ODMzNFUsCS8vIDw0LHUsNiwyPjogQ29zdCAyIHZ0cm5sIFJIUywgTEhTCisgIDE0OTc2MDY2ODVVLAkvLyA8NCx1LDYsMz46IENvc3QgMiB2ZXh0MSA8Myw0LHUsNj4sIDwzLDQsdSw2PgorICAxNDc5NjkxNTc0VSwJLy8gPDQsdSw2LDQ+OiBDb3N0IDIgdmV4dDEgPDAsNCx1LDY+LCBSSFMKKyAgMTUwOTU1MjA3OVUsCS8vIDw0LHUsNiw1PjogQ29zdCAyIHZleHQxIDw1LDQsdSw2PiwgPDUsNCx1LDY+CisgIDE5NzM4Njg2OThVLAkvLyA8NCx1LDYsNj46IENvc3QgMiB2dHJubCBSSFMsIFJIUworICAyNzcwNTM0NFUsCS8vIDw0LHUsNiw3PjogQ29zdCAwIGNvcHkgUkhTCisgIDI3NzA1MzQ0VSwJLy8gPDQsdSw2LHU+OiBDb3N0IDAgY29weSBSSFMKKyAgMjU2NTM4MjI0NlUsCS8vIDw0LHUsNywwPjogQ29zdCAzIHZleHQxIDwyLDQsdSw3PiwgTEhTCisgIDI1NjUzODMwNjZVLAkvLyA8NCx1LDcsMT46IENvc3QgMyB2ZXh0MSA8Miw0LHUsNz4sIDwxLDIsMyw0PgorICAyNTY1Mzg0MDA1VSwJLy8gPDQsdSw3LDI+OiBDb3N0IDMgdmV4dDEgPDIsNCx1LDc+LCA8Miw0LHUsNz4KKyAgMjY2MTQwNTk2NlUsCS8vIDw0LHUsNywzPjogQ29zdCAzIHZleHQyIDw3LDMsNCx1PiwgPDcsMyw0LHU+CisgIDI1NjUzODU1MjZVLAkvLyA8NCx1LDcsND46IENvc3QgMyB2ZXh0MSA8Miw0LHUsNz4sIFJIUworICAyNzc5MzIxNzAyVSwJLy8gPDQsdSw3LDU+OiBDb3N0IDMgdnV6cGwgUkhTLCA8Nyw0LDUsNj4KKyAgMjU4OTI3NDc5M1UsCS8vIDw0LHUsNyw2PjogQ29zdCAzIHZleHQxIDw2LDQsdSw3PiwgPDYsNCx1LDc+CisgIDI3NzkzMjE5NjRVLAkvLyA8NCx1LDcsNz46IENvc3QgMyB2dXpwbCBSSFMsIDw3LDcsNyw3PgorICAyNTY1Mzg4MDc4VSwJLy8gPDQsdSw3LHU+OiBDb3N0IDMgdmV4dDEgPDIsNCx1LDc+LCBMSFMKKyAgMTQ3OTcwNDY3OFUsCS8vIDw0LHUsdSwwPjogQ29zdCAyIHZleHQxIDwwLDQsdSx1PiwgTEhTCisgIDE1NDUxOTczNThVLAkvLyA8NCx1LHUsMT46IENvc3QgMiB2ZXh0MiA8MCwyLDQsdT4sIExIUworICAxNjE4MTcyMjYxVSwJLy8gPDQsdSx1LDI+OiBDb3N0IDIgdmV4dDMgPDEsMiwzLDQ+LCBMSFMKKyAgMTQ5NzYyMzA3MVUsCS8vIDw0LHUsdSwzPjogQ29zdCAyIHZleHQxIDwzLDQsdSx1PiwgPDMsNCx1LHU+CisgIDE2MTkyNjQ1NFUsCS8vIDw0LHUsdSw0PjogQ29zdCAxIHZkdXAwIFJIUworICAxNTQ1MTk3NzIyVSwJLy8gPDQsdSx1LDU+OiBDb3N0IDIgdmV4dDIgPDAsMiw0LHU+LCBSSFMKKyAgMTYxODE3MjMwMVUsCS8vIDw0LHUsdSw2PjogQ29zdCAyIHZleHQzIDwxLDIsMyw0PiwgUkhTCisgIDI3NzA1MzQ0VSwJLy8gPDQsdSx1LDc+OiBDb3N0IDAgY29weSBSSFMKKyAgMjc3MDUzNDRVLAkvLyA8NCx1LHUsdT46IENvc3QgMCBjb3B5IFJIUworICAyNjg3MTIzNDU2VSwJLy8gPDUsMCwwLDA+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MCwwLDAsMD4KKyAgMjY4NzEyMzQ2NlUsCS8vIDw1LDAsMCwxPjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPDAsMCwxLDE+CisgIDI2ODcxMjM0NzZVLAkvLyA8NSwwLDAsMj46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwwLDAsMiwyPgorICAzNzEwNTk5NDM0VSwJLy8gPDUsMCwwLDM+OiBDb3N0IDQgdmV4dDIgPDMsMiw1LDA+LCA8MCwzLDIsNT4KKyAgMjY0MjE2NjA5OFUsCS8vIDw1LDAsMCw0PjogQ29zdCAzIHZleHQyIDw0LDEsNSwwPiwgPDAsNCwxLDU+CisgIDM2NTcwNjAzMDZVLAkvLyA8NSwwLDAsNT46IENvc3QgNCB2ZXh0MSA8NSw1LDAsMD4sIDw1LDUsMCwwPgorICAzMjkyMDk0OTIzVSwJLy8gPDUsMCwwLDY+OiBDb3N0IDQgdnJldiA8MCw1LDYsMD4KKyAgMzY2OTAwNTcwMFUsCS8vIDw1LDAsMCw3PjogQ29zdCA0IHZleHQxIDw3LDUsMCwwPiwgPDcsNSwwLDA+CisgIDI2ODcxMjM1MzBVLAkvLyA8NSwwLDAsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwwLDAsdSwyPgorICAyNTU5NDM0ODU0VSwJLy8gPDUsMCwxLDA+OiBDb3N0IDMgdmV4dDEgPDEsNSwwLDE+LCBMSFMKKyAgMjU1OTQzNTg4N1UsCS8vIDw1LDAsMSwxPjogQ29zdCAzIHZleHQxIDwxLDUsMCwxPiwgPDEsNSwwLDE+CisgIDE2MTMzODE3MzRVLAkvLyA8NSwwLDEsMj46IENvc3QgMiB2ZXh0MyA8MCw0LDEsNT4sIExIUworICAzNjk4NjU2MjU2VSwJLy8gPDUsMCwxLDM+OiBDb3N0IDQgdmV4dDIgPDEsMiw1LDA+LCA8MSwzLDUsNz4KKyAgMjU1OTQzODEzNFUsCS8vIDw1LDAsMSw0PjogQ29zdCAzIHZleHQxIDwxLDUsMCwxPiwgUkhTCisgIDI1ODMzMjY2NzVVLAkvLyA8NSwwLDEsNT46IENvc3QgMyB2ZXh0MSA8NSw1LDAsMT4sIDw1LDUsMCwxPgorICAzNzE1OTA4ODUxVSwJLy8gPDUsMCwxLDY+OiBDb3N0IDQgdmV4dDIgPDQsMSw1LDA+LCA8MSw2LDUsNz4KKyAgMzY1NzA2OTU2MlUsCS8vIDw1LDAsMSw3PjogQ29zdCA0IHZleHQxIDw1LDUsMCwxPiwgPDcsMCwxLDI+CisgIDE2MTMzODE3ODhVLAkvLyA8NSwwLDEsdT46IENvc3QgMiB2ZXh0MyA8MCw0LDEsNT4sIExIUworICAyNjg2MDE3NzAwVSwJLy8gPDUsMCwyLDA+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDU+LCA8MCwyLDAsMj4KKyAgMjY4NTc5NjUyOFUsCS8vIDw1LDAsMiwxPjogQ29zdCAzIHZleHQzIDwwLDIsMSw1PiwgPDAsMiwxLDU+CisgIDI2OTg2MjUyMDhVLAkvLyA8NSwwLDIsMj46IENvc3QgMyB2ZXh0MyA8MiwzLDQsNT4sIDwwLDIsMiw0PgorICAyNjg1OTQ0MDAyVSwJLy8gPDUsMCwyLDM+OiBDb3N0IDMgdmV4dDMgPDAsMiwzLDU+LCA8MCwyLDMsNT4KKyAgMjY4NjAxNzczOVUsCS8vIDw1LDAsMiw0PjogQ29zdCAzIHZleHQzIDwwLDIsNCw1PiwgPDAsMiw0LDU+CisgIDI2ODYwOTE0NzZVLAkvLyA8NSwwLDIsNT46IENvc3QgMyB2ZXh0MyA8MCwyLDUsNT4sIDwwLDIsNSw1PgorICAyNzI1MTY3MzI0VSwJLy8gPDUsMCwyLDY+OiBDb3N0IDMgdmV4dDMgPDYsNyw0LDU+LCA8MCwyLDYsND4KKyAgMjU5NTI4MDIzMFUsCS8vIDw1LDAsMiw3PjogQ29zdCAzIHZleHQxIDw3LDUsMCwyPiwgPDcsNCw1LDY+CisgIDI2ODYzMTI2ODdVLAkvLyA8NSwwLDIsdT46IENvc3QgMyB2ZXh0MyA8MCwyLHUsNT4sIDwwLDIsdSw1PgorICAzNzYwMTI4MjQ4VSwJLy8gPDUsMCwzLDA+OiBDb3N0IDQgdmV4dDMgPDAsMywwLDU+LCA8MCwzLDAsNT4KKyAgMzc1OTY4NTg4OFUsCS8vIDw1LDAsMywxPjogQ29zdCA0IHZleHQzIDwwLDIsMyw1PiwgPDAsMywxLDQ+CisgIDI2ODY1MzM4OThVLAkvLyA8NSwwLDMsMj46IENvc3QgMyB2ZXh0MyA8MCwzLDIsNT4sIDwwLDMsMiw1PgorICAzNzYwMzQ5NDU5VSwJLy8gPDUsMCwzLDM+OiBDb3N0IDQgdmV4dDMgPDAsMywzLDU+LCA8MCwzLDMsNT4KKyAgMjYzODE4NzAwNFUsCS8vIDw1LDAsMyw0PjogQ29zdCAzIHZleHQyIDwzLDQsNSwwPiwgPDMsNCw1LDA+CisgIDM3NzYzNDg0NTJVLAkvLyA8NSwwLDMsNT46IENvc3QgNCB2ZXh0MyA8MywwLDQsNT4sIDwwLDMsNSw0PgorICAzNzEzMjU2MDk0VSwJLy8gPDUsMCwzLDY+OiBDb3N0IDQgdmV4dDIgPDMsNiw1LDA+LCA8Myw2LDUsMD4KKyAgMzkxNDA2NDg5NlUsCS8vIDw1LDAsMyw3PjogQ29zdCA0IHZ1enByIDwzLDUsNywwPiwgPDEsMyw1LDc+CisgIDI2ODY5NzYzMjBVLAkvLyA8NSwwLDMsdT46IENvc3QgMyB2ZXh0MyA8MCwzLHUsNT4sIDwwLDMsdSw1PgorICAyNTU5NDU5NDMwVSwJLy8gPDUsMCw0LDA+OiBDb3N0IDMgdmV4dDEgPDEsNSwwLDQ+LCBMSFMKKyAgMTYxMzM4MTk3MFUsCS8vIDw1LDAsNCwxPjogQ29zdCAyIHZleHQzIDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDI2ODcxMjM4MDRVLAkvLyA8NSwwLDQsMj46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwwLDQsMiw2PgorICAzNzYxMDEzMDkyVSwJLy8gPDUsMCw0LDM+OiBDb3N0IDQgdmV4dDMgPDAsNCwzLDU+LCA8MCw0LDMsNT4KKyAgMjU1OTQ2MjcxMFUsCS8vIDw1LDAsNCw0PjogQ29zdCAzIHZleHQxIDwxLDUsMCw0PiwgUkhTCisgIDI2MzgxODc4MzBVLAkvLyA8NSwwLDQsNT46IENvc3QgMyB2ZXh0MiA8Myw0LDUsMD4sIFJIUworICAzNzYxMjM0MzAzVSwJLy8gPDUsMCw0LDY+OiBDb3N0IDQgdmV4dDMgPDAsNCw2LDU+LCA8MCw0LDYsNT4KKyAgMjY0NjE1MDYwMFUsCS8vIDw1LDAsNCw3PjogQ29zdCAzIHZleHQyIDw0LDcsNSwwPiwgPDQsNyw1LDA+CisgIDE2MTMzODE5NzBVLAkvLyA8NSwwLDQsdT46IENvc3QgMiB2ZXh0MyA8MCw0LDEsNT4sIDwwLDQsMSw1PgorICAzNzY2NzYzOTI2VSwJLy8gPDUsMCw1LDA+OiBDb3N0IDQgdmV4dDMgPDEsNCwwLDU+LCA8MCw1LDAsMT4KKyAgMjkxOTI2ODQ1NFUsCS8vIDw1LDAsNSwxPjogQ29zdCAzIHZ6aXBsIDw1LDUsNSw1PiwgTEhTCisgIDMwNTM0ODYxODJVLAkvLyA8NSwwLDUsMj46IENvc3QgMyB2dHJubCA8NSw1LDUsNT4sIExIUworICAzNzIzMjEwNTg5VSwJLy8gPDUsMCw1LDM+OiBDb3N0IDQgdmV4dDIgPDUsMyw1LDA+LCA8NSwzLDUsMD4KKyAgMzc2Njc2Mzk2NlUsCS8vIDw1LDAsNSw0PjogQ29zdCA0IHZleHQzIDwxLDQsMCw1PiwgPDAsNSw0LDU+CisgIDI2NTA3OTYwMzFVLAkvLyA8NSwwLDUsNT46IENvc3QgMyB2ZXh0MiA8NSw1LDUsMD4sIDw1LDUsNSwwPgorICAzNzE5ODkzMDkwVSwJLy8gPDUsMCw1LDY+OiBDb3N0IDQgdmV4dDIgPDQsNyw1LDA+LCA8NSw2LDcsMD4KKyAgMzkxNDA2NzI1NFUsCS8vIDw1LDAsNSw3PjogQ29zdCA0IHZ1enByIDwzLDUsNywwPiwgUkhTCisgIDI5MTkyNjkwMjFVLAkvLyA8NSwwLDUsdT46IENvc3QgMyB2emlwbCA8NSw1LDUsNT4sIExIUworICA0MDQ3NTE5NzQ0VSwJLy8gPDUsMCw2LDA+OiBDb3N0IDQgdnppcHIgPDMsNCw1LDY+LCA8MCwwLDAsMD4KKyAgMjkyMDAzODUwMlUsCS8vIDw1LDAsNiwxPjogQ29zdCAzIHZ6aXBsIDw1LDYsNywwPiwgTEhTCisgIDM3NTk3NTk4NzFVLAkvLyA8NSwwLDYsMj46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNT4sIDwwLDYsMiw3PgorICAzNjQ1MTY0MDcwVSwJLy8gPDUsMCw2LDM+OiBDb3N0IDQgdmV4dDEgPDMsNSwwLDY+LCA8Myw1LDAsNj4KKyAgMzc2MjQxNDA5NVUsCS8vIDw1LDAsNiw0PjogQ29zdCA0IHZleHQzIDwwLDYsNCw1PiwgPDAsNiw0LDU+CisgIDM5OTM3ODA2OTBVLAkvLyA8NSwwLDYsNT46IENvc3QgNCB2emlwbCA8NSw2LDcsMD4sIDwwLDUsNiw3PgorICAzNzE5ODkzODE2VSwJLy8gPDUsMCw2LDY+OiBDb3N0IDQgdmV4dDIgPDQsNyw1LDA+LCA8Niw2LDYsNj4KKyAgMjY2MjA3NzMwMlUsCS8vIDw1LDAsNiw3PjogQ29zdCAzIHZleHQyIDw3LDQsNSwwPiwgPDYsNyw0LDU+CisgIDI5MjAwMzkwNjlVLAkvLyA8NSwwLDYsdT46IENvc3QgMyB2emlwbCA8NSw2LDcsMD4sIExIUworICAyNTY1NDU1OTc0VSwJLy8gPDUsMCw3LDA+OiBDb3N0IDMgdmV4dDEgPDIsNSwwLDc+LCBMSFMKKyAgMjU2NTQ1Njc5MFUsCS8vIDw1LDAsNywxPjogQ29zdCAzIHZleHQxIDwyLDUsMCw3PiwgPDEsMiwzLDA+CisgIDI1NjU0NTc3NDJVLAkvLyA8NSwwLDcsMj46IENvc3QgMyB2ZXh0MSA8Miw1LDAsNz4sIDwyLDUsMCw3PgorICAzNjM5MTk5ODk0VSwJLy8gPDUsMCw3LDM+OiBDb3N0IDQgdmV4dDEgPDIsNSwwLDc+LCA8MywwLDEsMj4KKyAgMjU2NTQ1OTI1NFUsCS8vIDw1LDAsNyw0PjogQ29zdCAzIHZleHQxIDwyLDUsMCw3PiwgUkhTCisgIDI1ODkzNDc5MzhVLAkvLyA8NSwwLDcsNT46IENvc3QgMyB2ZXh0MSA8Niw1LDAsNz4sIDw1LDYsNywwPgorICAyNTg5MzQ4NTMwVSwJLy8gPDUsMCw3LDY+OiBDb3N0IDMgdmV4dDEgPDYsNSwwLDc+LCA8Niw1LDAsNz4KKyAgNDE4ODQ1NjQyMlUsCS8vIDw1LDAsNyw3PjogQ29zdCA0IHZ0cm5yIFJIUywgPDIsMCw1LDc+CisgIDI1NjU0NjE4MDZVLAkvLyA8NSwwLDcsdT46IENvc3QgMyB2ZXh0MSA8Miw1LDAsNz4sIExIUworICAyNjg3MTI0MTA2VSwJLy8gPDUsMCx1LDA+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MCx1LDAsMj4KKyAgMTYxNjAzNjUwMlUsCS8vIDw1LDAsdSwxPjogQ29zdCAyIHZleHQzIDwwLHUsMSw1PiwgPDAsdSwxLDU+CisgIDE2MTMzODIzMDFVLAkvLyA8NSwwLHUsMj46IENvc3QgMiB2ZXh0MyA8MCw0LDEsNT4sIExIUworICAyNjg5OTI1ODAwVSwJLy8gPDUsMCx1LDM+OiBDb3N0IDMgdmV4dDMgPDAsdSwzLDU+LCA8MCx1LDMsNT4KKyAgMjY4NzEyNDE0NlUsCS8vIDw1LDAsdSw0PjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPDAsdSw0LDY+CisgIDI2MzgxOTA3NDZVLAkvLyA8NSwwLHUsNT46IENvc3QgMyB2ZXh0MiA8Myw0LDUsMD4sIFJIUworICAyNTg5MzU2NzIzVSwJLy8gPDUsMCx1LDY+OiBDb3N0IDMgdmV4dDEgPDYsNSwwLHU+LCA8Niw1LDAsdT4KKyAgMjU5NTI4MDIzMFUsCS8vIDw1LDAsdSw3PjogQ29zdCAzIHZleHQxIDw3LDUsMCwyPiwgPDcsNCw1LDY+CisgIDE2MTMzODIzNTVVLAkvLyA8NSwwLHUsdT46IENvc3QgMiB2ZXh0MyA8MCw0LDEsNT4sIExIUworICAyNjQ2ODE4ODE2VSwJLy8gPDUsMSwwLDA+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDE+LCA8MCwwLDAsMD4KKyAgMTU3MzA3NzA5NFUsCS8vIDw1LDEsMCwxPjogQ29zdCAyIHZleHQyIDw0LHUsNSwxPiwgTEhTCisgIDI2NDY4MTg5ODBVLAkvLyA8NSwxLDAsMj46IENvc3QgMyB2ZXh0MiA8NCx1LDUsMT4sIDwwLDIsMCwyPgorICAyNjg3MTI0MjE0VSwJLy8gPDUsMSwwLDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MSwwLDMsMj4KKyAgMjY0MTUxMDczOFUsCS8vIDw1LDEsMCw0PjogQ29zdCAzIHZleHQyIDw0LDAsNSwxPiwgPDAsNCwxLDU+CisgIDI2NDE1MTA4MTRVLAkvLyA8NSwxLDAsNT46IENvc3QgMyB2ZXh0MiA8NCwwLDUsMT4sIDwwLDUsMSwwPgorICAzNzIwNTYxMTQyVSwJLy8gPDUsMSwwLDY+OiBDb3N0IDQgdmV4dDIgPDQsdSw1LDE+LCA8MCw2LDEsNz4KKyAgMzI5ODE0MTM1N1UsCS8vIDw1LDEsMCw3PjogQ29zdCA0IHZyZXYgPDEsNSw3LDA+CisgIDE1NzMwNzc2NjFVLAkvLyA8NSwxLDAsdT46IENvc3QgMiB2ZXh0MiA8NCx1LDUsMT4sIExIUworICAyMjIzODkxNTY3VSwJLy8gPDUsMSwxLDA+OiBDb3N0IDMgdnJldiA8MSw1LDAsMT4KKyAgMjY4NzEyNDI3NlUsCS8vIDw1LDEsMSwxPjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPDEsMSwxLDE+CisgIDI2NDY4MTk3MzRVLAkvLyA8NSwxLDEsMj46IENvc3QgMyB2ZXh0MiA8NCx1LDUsMT4sIDwxLDIsMywwPgorICAyNjg3MTI0Mjk2VSwJLy8gPDUsMSwxLDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MSwxLDMsMz4KKyAgMjY5MTMyNjgwM1UsCS8vIDw1LDEsMSw0PjogQ29zdCAzIHZleHQzIDwxLDEsNCw1PiwgPDEsMSw0LDU+CisgIDI2OTE0MDA1NDBVLAkvLyA8NSwxLDEsNT46IENvc3QgMyB2ZXh0MyA8MSwxLDUsNT4sIDwxLDEsNSw1PgorICAzNzY1MjE2MTAxVSwJLy8gPDUsMSwxLDY+OiBDb3N0IDQgdmV4dDMgPDEsMSw2LDU+LCA8MSwxLDYsNT4KKyAgMzc2NTI4OTgzOFUsCS8vIDw1LDEsMSw3PjogQ29zdCA0IHZleHQzIDwxLDEsNyw1PiwgPDEsMSw3LDU+CisgIDI2ODcxMjQzNDFVLAkvLyA8NSwxLDEsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwxLDEsdSwzPgorICAzMjk3NjQxNTg0VSwJLy8gPDUsMSwyLDA+OiBDb3N0IDQgdnJldiA8MSw1LDAsMj4KKyAgMzc2MzUyMDM5MVUsCS8vIDw1LDEsMiwxPjogQ29zdCA0IHZleHQzIDwwLHUsMSw1PiwgPDEsMiwxLDM+CisgIDI2NDY4MjA0NTZVLAkvLyA8NSwxLDIsMj46IENvc3QgMyB2ZXh0MiA8NCx1LDUsMT4sIDwyLDIsMiwyPgorICAyNjg3MTI0Mzc0VSwJLy8gPDUsMSwyLDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MSwyLDMsMD4KKyAgMjY5MTk5MDQzNlUsCS8vIDw1LDEsMiw0PjogQ29zdCAzIHZleHQzIDwxLDIsNCw1PiwgPDEsMiw0LDU+CisgIDI2ODcxMjQzOTVVLAkvLyA8NSwxLDIsNT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwxLDIsNSwzPgorICAyNjQ2ODIwNzk0VSwJLy8gPDUsMSwyLDY+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDE+LCA8Miw2LDMsNz4KKyAgMzgwODE5OTYxMFUsCS8vIDw1LDEsMiw3PjogQ29zdCA0IHZleHQzIDx1LDMsNCw1PiwgPDEsMiw3LDA+CisgIDI2ODcxMjQ0MTlVLAkvLyA8NSwxLDIsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwxLDIsdSwwPgorICAyNTc3NDQwODcwVSwJLy8gPDUsMSwzLDA+OiBDb3N0IDMgdmV4dDEgPDQsNSwxLDM+LCBMSFMKKyAgMjY4NzEyNDQ0MFUsCS8vIDw1LDEsMywxPjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPDEsMywxLDM+CisgIDM3NTk2ODY2MjdVLAkvLyA8NSwxLDMsMj46IENvc3QgNCB2ZXh0MyA8MCwyLDMsNT4sIDwxLDMsMiw1PgorICAyNjkyNTgwMzMyVSwJLy8gPDUsMSwzLDM+OiBDb3N0IDMgdmV4dDMgPDEsMywzLDU+LCA8MSwzLDMsNT4KKyAgMjY4NzEyNDQ2OVUsCS8vIDw1LDEsMyw0PjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPDEsMyw0LDU+CisgIDI2ODUyMDc1NTJVLAkvLyA8NSwxLDMsNT46IENvc3QgMyB2ZXh0MyA8MCwxLDIsNT4sIDwxLDMsNSw3PgorICAzNzYwODY2MzEzVSwJLy8gPDUsMSwzLDY+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8MSwzLDYsNz4KKyAgMjY5Mjg3NTI4MFUsCS8vIDw1LDEsMyw3PjogQ29zdCAzIHZleHQzIDwxLDMsNyw1PiwgPDEsMyw3LDU+CisgIDI2ODcxMjQ1MDNVLAkvLyA8NSwxLDMsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwxLDMsdSwzPgorICAxNTY3NzcxNTM4VSwJLy8gPDUsMSw0LDA+OiBDb3N0IDIgdmV4dDIgPDQsMCw1LDE+LCA8NCwwLDUsMT4KKyAgMjY5MzA5NjQ5MVUsCS8vIDw1LDEsNCwxPjogQ29zdCAzIHZleHQzIDwxLDQsMSw1PiwgPDEsNCwxLDU+CisgIDI2OTMxNzAyMjhVLAkvLyA8NSwxLDQsMj46IENvc3QgMyB2ZXh0MyA8MSw0LDIsNT4sIDwxLDQsMiw1PgorICAyNjg3MTI0NTQxVSwJLy8gPDUsMSw0LDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MSw0LDMsNT4KKyAgMjY0NjgyMjA5NlUsCS8vIDw1LDEsNCw0PjogQ29zdCAzIHZleHQyIDw0LHUsNSwxPiwgPDQsNCw0LDQ+CisgIDE1NzMwODAzNzRVLAkvLyA8NSwxLDQsNT46IENvc3QgMiB2ZXh0MiA8NCx1LDUsMT4sIFJIUworICAyNjQ2ODIyMjYwVSwJLy8gPDUsMSw0LDY+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDE+LCA8NCw2LDQsNj4KKyAgMzI5ODE3NDEyOVUsCS8vIDw1LDEsNCw3PjogQ29zdCA0IHZyZXYgPDEsNSw3LDQ+CisgIDE1NzMwODA2MDJVLAkvLyA8NSwxLDQsdT46IENvc3QgMiB2ZXh0MiA8NCx1LDUsMT4sIDw0LHUsNSwxPgorICAyNjg3MTI0NTkxVSwJLy8gPDUsMSw1LDA+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MSw1LDAsMT4KKyAgMjY0NjgyMjU0M1UsCS8vIDw1LDEsNSwxPjogQ29zdCAzIHZleHQyIDw0LHUsNSwxPiwgPDUsMSwwLDE+CisgIDM3NjA4NjY0MzNVLAkvLyA8NSwxLDUsMj46IENvc3QgNCB2ZXh0MyA8MCw0LDEsNT4sIDwxLDUsMiwxPgorICAyNjg3MTI0NjI0VSwJLy8gPDUsMSw1LDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MSw1LDMsNz4KKyAgMjY4NzEyNDYzMVUsCS8vIDw1LDEsNSw0PjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPDEsNSw0LDU+CisgIDI2NDY4MjI5MTZVLAkvLyA8NSwxLDUsNT46IENvc3QgMyB2ZXh0MiA8NCx1LDUsMT4sIDw1LDUsNSw1PgorICAyNjQ2ODIzMDEwVSwJLy8gPDUsMSw1LDY+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDE+LCA8NSw2LDcsMD4KKyAgMjY0NjgyMzA4MFUsCS8vIDw1LDEsNSw3PjogQ29zdCAzIHZleHQyIDw0LHUsNSwxPiwgPDUsNyw1LDc+CisgIDI2ODcxMjQ2NjNVLAkvLyA8NSwxLDUsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwxLDUsdSwxPgorICAyNTUzNTc3NTc0VSwJLy8gPDUsMSw2LDA+OiBDb3N0IDMgdmV4dDEgPDAsNSwxLDY+LCBMSFMKKyAgMzc2MzUyMDcxOVUsCS8vIDw1LDEsNiwxPjogQ29zdCA0IHZleHQzIDwwLHUsMSw1PiwgPDEsNiwxLDc+CisgIDI2NDY4MjM0MThVLAkvLyA8NSwxLDYsMj46IENvc3QgMyB2ZXh0MiA8NCx1LDUsMT4sIDw2LDIsNywzPgorICAzNzYwODY2NTI5VSwJLy8gPDUsMSw2LDM+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8MSw2LDMsNz4KKyAgMjU1MzU4MDg1NFUsCS8vIDw1LDEsNiw0PjogQ29zdCAzIHZleHQxIDwwLDUsMSw2PiwgUkhTCisgIDI2ODcxMjQ3MjNVLAkvLyA8NSwxLDYsNT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwxLDYsNSw3PgorICAyNjQ2ODIzNzM2VSwJLy8gPDUsMSw2LDY+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDE+LCA8Niw2LDYsNj4KKyAgMjY0NjgyMzc1OFUsCS8vIDw1LDEsNiw3PjogQ29zdCAzIHZleHQyIDw0LHUsNSwxPiwgPDYsNywwLDE+CisgIDI2NDY4MjM4MzlVLAkvLyA8NSwxLDYsdT46IENvc3QgMyB2ZXh0MiA8NCx1LDUsMT4sIDw2LHUsMCwxPgorICAyNTU5NTU3NzM0VSwJLy8gPDUsMSw3LDA+OiBDb3N0IDMgdmV4dDEgPDEsNSwxLDc+LCBMSFMKKyAgMjU1OTU1ODQ1MlUsCS8vIDw1LDEsNywxPjogQ29zdCAzIHZleHQxIDwxLDUsMSw3PiwgPDEsMSwxLDE+CisgIDI1NzE1MDMyNzBVLAkvLyA8NSwxLDcsMj46IENvc3QgMyB2ZXh0MSA8Myw1LDEsNz4sIDwyLDMsMCwxPgorICAyMDQwOTcxMzY2VSwJLy8gPDUsMSw3LDM+OiBDb3N0IDIgdnRybnIgUkhTLCBMSFMKKyAgMjU1OTU2MTAxNFUsCS8vIDw1LDEsNyw0PjogQ29zdCAzIHZleHQxIDwxLDUsMSw3PiwgUkhTCisgIDI1OTUzOTMyMzJVLAkvLyA8NSwxLDcsNT46IENvc3QgMyB2ZXh0MSA8Nyw1LDEsNz4sIDw1LDEsNywzPgorICA0MTg4NDU1MDM1VSwJLy8gPDUsMSw3LDY+OiBDb3N0IDQgdnRybnIgUkhTLCA8MCwxLDQsNj4KKyAgMjY0NjgyNDU1NlUsCS8vIDw1LDEsNyw3PjogQ29zdCAzIHZleHQyIDw0LHUsNSwxPiwgPDcsNyw3LDc+CisgIDIwNDA5NzEzNzFVLAkvLyA8NSwxLDcsdT46IENvc3QgMiB2dHJuciBSSFMsIExIUworICAxNTkxNjYyMzI2VSwJLy8gPDUsMSx1LDA+OiBDb3N0IDIgdmV4dDIgPHUsMCw1LDE+LCA8dSwwLDUsMT4KKyAgMTU3MzA4MjkyNlUsCS8vIDw1LDEsdSwxPjogQ29zdCAyIHZleHQyIDw0LHUsNSwxPiwgTEhTCisgIDI2OTU4MjQ3NjBVLAkvLyA8NSwxLHUsMj46IENvc3QgMyB2ZXh0MyA8MSx1LDIsNT4sIDwxLHUsMiw1PgorICAyMDQwOTc5NTU4VSwJLy8gPDUsMSx1LDM+OiBDb3N0IDIgdnRybnIgUkhTLCBMSFMKKyAgMjY4NzEyNDg3NFUsCS8vIDw1LDEsdSw0PjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPDEsdSw0LDU+CisgIDE1NzMwODMyOTBVLAkvLyA8NSwxLHUsNT46IENvc3QgMiB2ZXh0MiA8NCx1LDUsMT4sIFJIUworICAyNjQ2ODI1MTY4VSwJLy8gPDUsMSx1LDY+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDE+LCA8dSw2LDMsNz4KKyAgMjY0NjgyNTIxNlUsCS8vIDw1LDEsdSw3PjogQ29zdCAzIHZleHQyIDw0LHUsNSwxPiwgPHUsNywwLDE+CisgIDIwNDA5Nzk1NjNVLAkvLyA8NSwxLHUsdT46IENvc3QgMiB2dHJuciBSSFMsIExIUworICAzNzAyNjUyOTI4VSwJLy8gPDUsMiwwLDA+OiBDb3N0IDQgdmV4dDIgPDEsdSw1LDI+LCA8MCwwLDAsMD4KKyAgMjYyODkxMTIwNlUsCS8vIDw1LDIsMCwxPjogQ29zdCAzIHZleHQyIDwxLHUsNSwyPiwgTEhTCisgIDI2NDE1MTg3NTZVLAkvLyA8NSwyLDAsMj46IENvc3QgMyB2ZXh0MiA8NCwwLDUsMj4sIDwwLDIsMCwyPgorICAzNzU5NzYwODQ3VSwJLy8gPDUsMiwwLDM+OiBDb3N0IDQgdmV4dDMgPDAsMiw0LDU+LCA8MiwwLDMsMj4KKyAgMzc2MDg2Njc3NVUsCS8vIDw1LDIsMCw0PjogQ29zdCA0IHZleHQzIDwwLDQsMSw1PiwgPDIsMCw0LDE+CisgIDM3NTk1Mzk2ODBVLAkvLyA8NSwyLDAsNT46IENvc3QgNCB2ZXh0MyA8MCwyLDEsNT4sIDwyLDAsNSwxPgorICAzNzYwODY2Nzk2VSwJLy8gPDUsMiwwLDY+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8MiwwLDYsND4KKyAgMzMwNDExNDA1NFUsCS8vIDw1LDIsMCw3PjogQ29zdCA0IHZyZXYgPDIsNSw3LDA+CisgIDI2Mjg5MTE3NzNVLAkvLyA8NSwyLDAsdT46IENvc3QgMyB2ZXh0MiA8MSx1LDUsMj4sIExIUworICAyNjIzNjAzNDY0VSwJLy8gPDUsMiwxLDA+OiBDb3N0IDMgdmV4dDIgPDEsMCw1LDI+LCA8MSwwLDUsMj4KKyAgMzY5ODAwODkyMVUsCS8vIDw1LDIsMSwxPjogQ29zdCA0IHZleHQyIDwxLDEsNSwyPiwgPDEsMSw1LDI+CisgIDM2MzMzMjU2MDNVLAkvLyA8NSwyLDEsMj46IENvc3QgNCB2ZXh0MSA8MSw1LDIsMT4sIDwyLDEsMyw1PgorICAyNjg3MTI1MDI3VSwJLy8gPDUsMiwxLDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MiwxLDMsNT4KKyAgMzYzMzMyNzQxNFUsCS8vIDw1LDIsMSw0PjogQ29zdCA0IHZleHQxIDwxLDUsMiwxPiwgUkhTCisgIDM3NTk1Mzk3NjBVLAkvLyA8NSwyLDEsNT46IENvc3QgNCB2ZXh0MyA8MCwyLDEsNT4sIDwyLDEsNSwwPgorICAzNzYwODY2ODc2VSwJLy8gPDUsMiwxLDY+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8MiwxLDYsMz4KKyAgMzMwNDEyMjI0N1UsCS8vIDw1LDIsMSw3PjogQ29zdCA0IHZyZXYgPDIsNSw3LDE+CisgIDI2ODcxMjUwNzJVLAkvLyA8NSwyLDEsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwyLDEsdSw1PgorICAzNjMzMzMyMzI2VSwJLy8gPDUsMiwyLDA+OiBDb3N0IDQgdmV4dDEgPDEsNSwyLDI+LCBMSFMKKyAgMzc1OTc2MDk5MlUsCS8vIDw1LDIsMiwxPjogQ29zdCA0IHZleHQzIDwwLDIsNCw1PiwgPDIsMiwxLDM+CisgIDI2ODcxMjUwOTZVLAkvLyA8NSwyLDIsMj46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwyLDIsMiwyPgorICAyNjg3MTI1MTA2VSwJLy8gPDUsMiwyLDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MiwyLDMsMz4KKyAgMjY5Nzk2MzEzM1UsCS8vIDw1LDIsMiw0PjogQ29zdCAzIHZleHQzIDwyLDIsNCw1PiwgPDIsMiw0LDU+CisgIDM3NTk0NjYxMjBVLAkvLyA8NSwyLDIsNT46IENvc3QgNCB2ZXh0MyA8MCwyLDAsNT4sIDwyLDIsNSw3PgorICAzNzYwODY2OTYwVSwJLy8gPDUsMiwyLDY+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8MiwyLDYsNj4KKyAgMzc3MTkyNjE2OFUsCS8vIDw1LDIsMiw3PjogQ29zdCA0IHZleHQzIDwyLDIsNyw1PiwgPDIsMiw3LDU+CisgIDI2ODcxMjUxNTFVLAkvLyA8NSwyLDIsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwyLDIsdSwzPgorICAyNjg3MTI1MTU4VSwJLy8gPDUsMiwzLDA+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MiwzLDAsMT4KKyAgMjY5ODQwNTU1NVUsCS8vIDw1LDIsMywxPjogQ29zdCAzIHZleHQzIDwyLDMsMSw1PiwgPDIsMywxLDU+CisgIDI1Nzc1MTYyMzhVLAkvLyA8NSwyLDMsMj46IENvc3QgMyB2ZXh0MSA8NCw1LDIsMz4sIDwyLDMsNCw1PgorICAzNzU5Njg3MzY1VSwJLy8gPDUsMiwzLDM+OiBDb3N0IDQgdmV4dDMgPDAsMiwzLDU+LCA8MiwzLDMsNT4KKyAgMTYyNDg4NDk0MlUsCS8vIDw1LDIsMyw0PjogQ29zdCAyIHZleHQzIDwyLDMsNCw1PiwgPDIsMyw0LDU+CisgIDI2OTg3MDA1MDNVLAkvLyA8NSwyLDMsNT46IENvc3QgMyB2ZXh0MyA8MiwzLDUsNT4sIDwyLDMsNSw1PgorICAzNzcyMzY4NjA4VSwJLy8gPDUsMiwzLDY+OiBDb3N0IDQgdmV4dDMgPDIsMyw0LDU+LCA8MiwzLDYsNT4KKyAgMzcwMjY1NTcxNlUsCS8vIDw1LDIsMyw3PjogQ29zdCA0IHZleHQyIDwxLHUsNSwyPiwgPDMsNywzLDc+CisgIDE2MjUxNzk4OTBVLAkvLyA8NSwyLDMsdT46IENvc3QgMiB2ZXh0MyA8MiwzLHUsNT4sIDwyLDMsdSw1PgorICAyNjQxNTIxNTU1VSwJLy8gPDUsMiw0LDA+OiBDb3N0IDMgdmV4dDIgPDQsMCw1LDI+LCA8NCwwLDUsMj4KKyAgMzc3MjM2ODY0MlUsCS8vIDw1LDIsNCwxPjogQ29zdCA0IHZleHQzIDwyLDMsNCw1PiwgPDIsNCwxLDM+CisgIDI2OTkxNDI5MjVVLAkvLyA8NSwyLDQsMj46IENvc3QgMyB2ZXh0MyA8Miw0LDIsNT4sIDwyLDQsMiw1PgorICAyNjk4NjI2ODM4VSwJLy8gPDUsMiw0LDM+OiBDb3N0IDMgdmV4dDMgPDIsMyw0LDU+LCA8Miw0LDMsNT4KKyAgMjY5ODYyNjg0OFUsCS8vIDw1LDIsNCw0PjogQ29zdCAzIHZleHQzIDwyLDMsNCw1PiwgPDIsNCw0LDY+CisgIDI2Mjg5MTQ0ODZVLAkvLyA8NSwyLDQsNT46IENvc3QgMyB2ZXh0MiA8MSx1LDUsMj4sIFJIUworICAyNjQ1NTAzMzUzVSwJLy8gPDUsMiw0LDY+OiBDb3N0IDMgdmV4dDIgPDQsNiw1LDI+LCA8NCw2LDUsMj4KKyAgMzMwNDE0NjgyNlUsCS8vIDw1LDIsNCw3PjogQ29zdCA0IHZyZXYgPDIsNSw3LDQ+CisgIDI2Mjg5MTQ3MjlVLAkvLyA8NSwyLDQsdT46IENvc3QgMyB2ZXh0MiA8MSx1LDUsMj4sIFJIUworICAyNTUzNjQzMTEwVSwJLy8gPDUsMiw1LDA+OiBDb3N0IDMgdmV4dDEgPDAsNSwyLDU+LCBMSFMKKyAgMzc1ODk1MDIyN1UsCS8vIDw1LDIsNSwxPjogQ29zdCA0IHZleHQzIDwwLDEsMiw1PiwgPDIsNSwxLDM+CisgIDM3NTk3NjEyNDhVLAkvLyA8NSwyLDUsMj46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNT4sIDwyLDUsMiw3PgorICAyOTgyMzk2MDA2VSwJLy8gPDUsMiw1LDM+OiBDb3N0IDMgdnppcHIgPDQsdSw1LDU+LCBMSFMKKyAgMjU1MzY0NjM5MFUsCS8vIDw1LDIsNSw0PjogQ29zdCAzIHZleHQxIDwwLDUsMiw1PiwgUkhTCisgIDI1NTM2NDcxMDhVLAkvLyA8NSwyLDUsNT46IENvc3QgMyB2ZXh0MSA8MCw1LDIsNT4sIDw1LDUsNSw1PgorICAzNzYwODY3MjA0VSwJLy8gPDUsMiw1LDY+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8Miw1LDYsNz4KKyAgMzcwMjY1NzE0MVUsCS8vIDw1LDIsNSw3PjogQ29zdCA0IHZleHQyIDwxLHUsNSwyPiwgPDUsNywwLDE+CisgIDI5ODIzOTYwMTFVLAkvLyA8NSwyLDUsdT46IENvc3QgMyB2emlwciA8NCx1LDUsNT4sIExIUworICAzNjI3MzkzMTI2VSwJLy8gPDUsMiw2LDA+OiBDb3N0IDQgdmV4dDEgPDAsNSwyLDY+LCBMSFMKKyAgMzc2MDg2NzIzNlUsCS8vIDw1LDIsNiwxPjogQ29zdCA0IHZleHQzIDwwLDQsMSw1PiwgPDIsNiwxLDM+CisgIDI2NDU1MDQ1MDZVLAkvLyA8NSwyLDYsMj46IENvc3QgMyB2ZXh0MiA8NCw2LDUsMj4sIDw2LDIsNywzPgorICAyNjg3MTI1NDM0VSwJLy8gPDUsMiw2LDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8Miw2LDMsNz4KKyAgMjcwMDYxNzY2NVUsCS8vIDw1LDIsNiw0PjogQ29zdCAzIHZleHQzIDwyLDYsNCw1PiwgPDIsNiw0LDU+CisgIDM3NjA4NjcyNzZVLAkvLyA8NSwyLDYsNT46IENvc3QgNCB2ZXh0MyA8MCw0LDEsNT4sIDwyLDYsNSw3PgorICAzNzYzNTIxNDkzVSwJLy8gPDUsMiw2LDY+OiBDb3N0IDQgdmV4dDMgPDAsdSwxLDU+LCA8Miw2LDYsNz4KKyAgMzcxOTI0NjY3MFUsCS8vIDw1LDIsNiw3PjogQ29zdCA0IHZleHQyIDw0LDYsNSwyPiwgPDYsNywwLDE+CisgIDI2ODcxMjU0NzlVLAkvLyA8NSwyLDYsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwyLDYsdSw3PgorICAyNTY1NjAzNDMwVSwJLy8gPDUsMiw3LDA+OiBDb3N0IDMgdmV4dDEgPDIsNSwyLDc+LCBMSFMKKyAgMjU1MzY2MDE1MFUsCS8vIDw1LDIsNywxPjogQ29zdCAzIHZleHQxIDwwLDUsMiw3PiwgPDEsMCwzLDI+CisgIDI1NjU2MDUyMTZVLAkvLyA8NSwyLDcsMj46IENvc3QgMyB2ZXh0MSA8Miw1LDIsNz4sIDwyLDUsMiw3PgorICAyOTYxMTc4NzI2VSwJLy8gPDUsMiw3LDM+OiBDb3N0IDMgdnppcHIgPDEsMyw1LDc+LCBMSFMKKyAgMjU2NTYwNjcxMFUsCS8vIDw1LDIsNyw0PjogQ29zdCAzIHZleHQxIDwyLDUsMiw3PiwgUkhTCisgIDQwMzQ5MjA1NTJVLAkvLyA8NSwyLDcsNT46IENvc3QgNCB2emlwciA8MSwzLDUsNz4sIDwwLDEsMiw1PgorICAzMTE0NzEzMjkyVSwJLy8gPDUsMiw3LDY+OiBDb3N0IDMgdnRybnIgUkhTLCA8MCwyLDQsNj4KKyAgMzcwMjY1ODY2OFUsCS8vIDw1LDIsNyw3PjogQ29zdCA0IHZleHQyIDwxLHUsNSwyPiwgPDcsNyw3LDc+CisgIDI5NjExNzg3MzFVLAkvLyA8NSwyLDcsdT46IENvc3QgMyB2emlwciA8MSwzLDUsNz4sIExIUworICAyNjg3MTI1NTYzVSwJLy8gPDUsMix1LDA+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8Mix1LDAsMT4KKyAgMjYyODkxNzAzOFUsCS8vIDw1LDIsdSwxPjogQ29zdCAzIHZleHQyIDwxLHUsNSwyPiwgTEhTCisgIDI1NjU2MTM0MDlVLAkvLyA8NSwyLHUsMj46IENvc3QgMyB2ZXh0MSA8Miw1LDIsdT4sIDwyLDUsMix1PgorICAyNjg3MTI1NTkyVSwJLy8gPDUsMix1LDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8Mix1LDMsMz4KKyAgMTYyODIwMzEwN1UsCS8vIDw1LDIsdSw0PjogQ29zdCAyIHZleHQzIDwyLHUsNCw1PiwgPDIsdSw0LDU+CisgIDI2Mjg5MTc0MDJVLAkvLyA8NSwyLHUsNT46IENvc3QgMyB2ZXh0MiA8MSx1LDUsMj4sIFJIUworICAyNzAyMDkyNDA1VSwJLy8gPDUsMix1LDY+OiBDb3N0IDMgdmV4dDMgPDIsdSw2LDU+LCA8Mix1LDYsNT4KKyAgMzMwNDE3OTU5OFUsCS8vIDw1LDIsdSw3PjogQ29zdCA0IHZyZXYgPDIsNSw3LHU+CisgIDE2Mjg0OTgwNTVVLAkvLyA8NSwyLHUsdT46IENvc3QgMiB2ZXh0MyA8Mix1LHUsNT4sIDwyLHUsdSw1PgorICAzNzYwODY3NDY3VSwJLy8gPDUsMywwLDA+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8MywwLDAsMD4KKyAgMjY4NzEyNTY1NFUsCS8vIDw1LDMsMCwxPjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPDMsMCwxLDI+CisgIDM3NTk3NjE1NjVVLAkvLyA8NSwzLDAsMj46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNT4sIDwzLDAsMiwwPgorICAzNjMzMzkxNzY2VSwJLy8gPDUsMywwLDM+OiBDb3N0IDQgdmV4dDEgPDEsNSwzLDA+LCA8MywwLDEsMj4KKyAgMjY4NzEyNTY4MFUsCS8vIDw1LDMsMCw0PjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPDMsMCw0LDE+CisgIDM3NjAyNzc2OTBVLAkvLyA8NSwzLDAsNT46IENvc3QgNCB2ZXh0MyA8MCwzLDIsNT4sIDwzLDAsNSwyPgorICAzMzEwMDEzMDE0VSwJLy8gPDUsMywwLDY+OiBDb3N0IDQgdnJldiA8Myw1LDYsMD4KKyAgMjIzNjM0NDkyN1UsCS8vIDw1LDMsMCw3PjogQ29zdCAzIHZyZXYgPDMsNSw3LDA+CisgIDI2ODcxMjU3MTdVLAkvLyA8NSwzLDAsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwzLDAsdSwyPgorICAzNzYwODY3NTUxVSwJLy8gPDUsMywxLDA+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8MywxLDAsMz4KKyAgMzc2MDg2NzU1OFUsCS8vIDw1LDMsMSwxPjogQ29zdCA0IHZleHQzIDwwLDQsMSw1PiwgPDMsMSwxLDE+CisgIDI2MjQ5Mzg5MjNVLAkvLyA8NSwzLDEsMj46IENvc3QgMyB2ZXh0MiA8MSwyLDUsMz4sIDwxLDIsNSwzPgorICAyNzAzMTk4NDYwVSwJLy8gPDUsMywxLDM+OiBDb3N0IDMgdmV4dDMgPDMsMSwzLDU+LCA8MywxLDMsNT4KKyAgMzc2MDg2NzU4N1UsCS8vIDw1LDMsMSw0PjogQ29zdCA0IHZleHQzIDwwLDQsMSw1PiwgPDMsMSw0LDM+CisgIDI2MzYyMTk1MzZVLAkvLyA8NSwzLDEsNT46IENvc3QgMyB2ZXh0MiA8MywxLDUsMz4sIDwxLDUsMyw3PgorICAzNjk4NjgxMDc1VSwJLy8gPDUsMywxLDY+OiBDb3N0IDQgdmV4dDIgPDEsMiw1LDM+LCA8MSw2LDUsNz4KKyAgMjcwMzQ5MzQwOFUsCS8vIDw1LDMsMSw3PjogQ29zdCAzIHZleHQzIDwzLDEsNyw1PiwgPDMsMSw3LDU+CisgIDI2Mjg5MjA3MjFVLAkvLyA8NSwzLDEsdT46IENvc3QgMyB2ZXh0MiA8MSx1LDUsMz4sIDwxLHUsNSwzPgorICAzNzY2NzY1ODcwVSwJLy8gPDUsMywyLDA+OiBDb3N0IDQgdmV4dDMgPDEsNCwwLDU+LCA8MywyLDAsMT4KKyAgMzY5ODY4MTM3OVUsCS8vIDw1LDMsMiwxPjogQ29zdCA0IHZleHQyIDwxLDIsNSwzPiwgPDIsMSwzLDU+CisgIDM3NjA4Njc2NDlVLAkvLyA8NSwzLDIsMj46IENvc3QgNCB2ZXh0MyA8MCw0LDEsNT4sIDwzLDIsMiwyPgorICAyNjk4NjI3NDA0VSwJLy8gPDUsMywyLDM+OiBDb3N0IDMgdmV4dDMgPDIsMyw0LDU+LCA8MywyLDMsND4KKyAgMjcwMzkzNTgzMFUsCS8vIDw1LDMsMiw0PjogQ29zdCAzIHZleHQzIDwzLDIsNCw1PiwgPDMsMiw0LDU+CisgIDI2OTg2Mjc0MjJVLAkvLyA8NSwzLDIsNT46IENvc3QgMyB2ZXh0MyA8MiwzLDQsNT4sIDwzLDIsNSw0PgorICAzNzYwODY3Njg2VSwJLy8gPDUsMywyLDY+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8MywyLDYsMz4KKyAgMzc2OTc4ODc4M1UsCS8vIDw1LDMsMiw3PjogQ29zdCA0IHZleHQzIDwxLHUsNSw1PiwgPDMsMiw3LDM+CisgIDI3MDE5NDUyMDlVLAkvLyA8NSwzLDIsdT46IENvc3QgMyB2ZXh0MyA8Mix1LDQsNT4sIDwzLDIsdSw0PgorICAzNzYwODY3NzExVSwJLy8gPDUsMywzLDA+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8MywzLDAsMT4KKyAgMjYzNjIyMDY4NFUsCS8vIDw1LDMsMywxPjogQ29zdCAzIHZleHQyIDwzLDEsNSwzPiwgPDMsMSw1LDM+CisgIDM3NzIzNjkyOThVLAkvLyA8NSwzLDMsMj46IENvc3QgNCB2ZXh0MyA8MiwzLDQsNT4sIDwzLDMsMiwyPgorICAyNjg3MTI1OTE2VSwJLy8gPDUsMywzLDM+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8MywzLDMsMz4KKyAgMjcwNDU5OTQ2M1UsCS8vIDw1LDMsMyw0PjogQ29zdCAzIHZleHQzIDwzLDMsNCw1PiwgPDMsMyw0LDU+CisgIDI3MDQ2NzMyMDBVLAkvLyA8NSwzLDMsNT46IENvc3QgMyB2ZXh0MyA8MywzLDUsNT4sIDwzLDMsNSw1PgorICAzNzA5OTYyOTM1VSwJLy8gPDUsMywzLDY+OiBDb3N0IDQgdmV4dDIgPDMsMSw1LDM+LCA8Myw2LDcsNz4KKyAgMzc3MjM2OTM0NlUsCS8vIDw1LDMsMyw3PjogQ29zdCA0IHZleHQzIDwyLDMsNCw1PiwgPDMsMyw3LDU+CisgIDI3MDQ4OTQ0MTFVLAkvLyA8NSwzLDMsdT46IENvc3QgMyB2ZXh0MyA8MywzLHUsNT4sIDwzLDMsdSw1PgorICAyNzA0OTY4MTQ4VSwJLy8gPDUsMyw0LDA+OiBDb3N0IDMgdmV4dDMgPDMsNCwwLDU+LCA8Myw0LDAsNT4KKyAgMzY5ODY4Mjg1MFUsCS8vIDw1LDMsNCwxPjogQ29zdCA0IHZleHQyIDwxLDIsNSwzPiwgPDQsMSw1LDA+CisgIDI2NDI4NTcwMTRVLAkvLyA8NSwzLDQsMj46IENvc3QgMyB2ZXh0MiA8NCwyLDUsMz4sIDw0LDIsNSwzPgorICAyNzA1MTg5MzU5VSwJLy8gPDUsMyw0LDM+OiBDb3N0IDMgdmV4dDMgPDMsNCwzLDU+LCA8Myw0LDMsNT4KKyAgMjcwNTI2MzA5NlUsCS8vIDw1LDMsNCw0PjogQ29zdCAzIHZleHQzIDwzLDQsNCw1PiwgPDMsNCw0LDU+CisgIDI2ODU5NDYzNzBVLAkvLyA8NSwzLDQsNT46IENvc3QgMyB2ZXh0MyA8MCwyLDMsNT4sIDwzLDQsNSw2PgorICAzNzc5MTUyMzk0VSwJLy8gPDUsMyw0LDY+OiBDb3N0IDQgdmV4dDMgPDMsNCw2LDU+LCA8Myw0LDYsNT4KKyAgMjIzNjM3NzY5OVUsCS8vIDw1LDMsNCw3PjogQ29zdCAzIHZyZXYgPDMsNSw3LDQ+CisgIDI2ODcxMjYwNDVVLAkvLyA8NSwzLDQsdT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwzLDQsdSw2PgorICAyNTcxNjMyNzQyVSwJLy8gPDUsMyw1LDA+OiBDb3N0IDMgdmV4dDEgPDMsNSwzLDU+LCBMSFMKKyAgMjU1OTY4OTg3MFUsCS8vIDw1LDMsNSwxPjogQ29zdCAzIHZleHQxIDwxLDUsMyw1PiwgPDEsNSwzLDU+CisgIDI1NzE2MzQzODJVLAkvLyA8NSwzLDUsMj46IENvc3QgMyB2ZXh0MSA8Myw1LDMsNT4sIDwyLDMsNCw1PgorICAyNTcxNjM1MjY0VSwJLy8gPDUsMyw1LDM+OiBDb3N0IDMgdmV4dDEgPDMsNSwzLDU+LCA8Myw1LDMsNT4KKyAgMjU3MTYzNjAyMlUsCS8vIDw1LDMsNSw0PjogQ29zdCAzIHZleHQxIDwzLDUsMyw1PiwgUkhTCisgIDI1NTk2OTI4MDRVLAkvLyA8NSwzLDUsNT46IENvc3QgMyB2ZXh0MSA8MSw1LDMsNT4sIDw1LDUsNSw1PgorICAzNzIwNTgxMjE4VSwJLy8gPDUsMyw1LDY+OiBDb3N0IDQgdmV4dDIgPDQsdSw1LDM+LCA8NSw2LDcsMD4KKyAgMjIzNjM4NTg5MlUsCS8vIDw1LDMsNSw3PjogQ29zdCAzIHZyZXYgPDMsNSw3LDU+CisgIDI1NzE2Mzg1NzRVLAkvLyA8NSwzLDUsdT46IENvc3QgMyB2ZXh0MSA8Myw1LDMsNT4sIExIUworICAyNTY1NjY4OTY2VSwJLy8gPDUsMyw2LDA+OiBDb3N0IDMgdmV4dDEgPDIsNSwzLDY+LCBMSFMKKyAgMzYzMzQzOTg4N1UsCS8vIDw1LDMsNiwxPjogQ29zdCA0IHZleHQxIDwxLDUsMyw2PiwgPDEsNSwzLDY+CisgIDI1NjU2NzA3NjBVLAkvLyA8NSwzLDYsMj46IENvc3QgMyB2ZXh0MSA8Miw1LDMsNj4sIDwyLDUsMyw2PgorICAyNTY1NjcxNDI2VSwJLy8gPDUsMyw2LDM+OiBDb3N0IDMgdmV4dDEgPDIsNSwzLDY+LCA8Myw0LDUsNj4KKyAgMjU2NTY3MjI0NlUsCS8vIDw1LDMsNiw0PjogQ29zdCAzIHZleHQxIDwyLDUsMyw2PiwgUkhTCisgIDM2Mzk0MTQ2MzBVLAkvLyA8NSwzLDYsNT46IENvc3QgNCB2ZXh0MSA8Miw1LDMsNj4sIDw1LDMsNiwwPgorICA0MDQ3NTIxNjQwVSwJLy8gPDUsMyw2LDY+OiBDb3N0IDQgdnppcHIgPDMsNCw1LDY+LCA8Miw1LDMsNj4KKyAgMjcyNTE2OTg0NFUsCS8vIDw1LDMsNiw3PjogQ29zdCAzIHZleHQzIDw2LDcsNCw1PiwgPDMsNiw3LDQ+CisgIDI1NjU2NzQ3OThVLAkvLyA8NSwzLDYsdT46IENvc3QgMyB2ZXh0MSA8Miw1LDMsNj4sIExIUworICAxNDg1OTYzMzY2VSwJLy8gPDUsMyw3LDA+OiBDb3N0IDIgdmV4dDEgPDEsNSwzLDc+LCBMSFMKKyAgMTQ4NTk2NDQzMlUsCS8vIDw1LDMsNywxPjogQ29zdCAyIHZleHQxIDwxLDUsMyw3PiwgPDEsNSwzLDc+CisgIDI1NTk3MDY3MjhVLAkvLyA8NSwzLDcsMj46IENvc3QgMyB2ZXh0MSA8MSw1LDMsNz4sIDwyLDIsMiwyPgorICAyNTU5NzA3Mjg2VSwJLy8gPDUsMyw3LDM+OiBDb3N0IDMgdmV4dDEgPDEsNSwzLDc+LCA8MywwLDEsMj4KKyAgMTQ4NTk2NjY0NlUsCS8vIDw1LDMsNyw0PjogQ29zdCAyIHZleHQxIDwxLDUsMyw3PiwgUkhTCisgIDI1NTk3MDg4ODBVLAkvLyA8NSwzLDcsNT46IENvc3QgMyB2ZXh0MSA8MSw1LDMsNz4sIDw1LDEsNywzPgorICAyNjAxNTEzNDY2VSwJLy8gPDUsMyw3LDY+OiBDb3N0IDMgdmV4dDEgPHUsNSwzLDc+LCA8NiwyLDcsMz4KKyAgMzExNDcxNDExMlUsCS8vIDw1LDMsNyw3PjogQ29zdCAzIHZ0cm5yIFJIUywgPDEsMyw1LDc+CisgIDE0ODU5NjkxOThVLAkvLyA8NSwzLDcsdT46IENvc3QgMiB2ZXh0MSA8MSw1LDMsNz4sIExIUworICAxNDg1OTcxNTU4VSwJLy8gPDUsMyx1LDA+OiBDb3N0IDIgdmV4dDEgPDEsNSwzLHU+LCBMSFMKKyAgMTQ4NTk3MjYyNVUsCS8vIDw1LDMsdSwxPjogQ29zdCAyIHZleHQxIDwxLDUsMyx1PiwgPDEsNSwzLHU+CisgIDI1NTk3MTQ5MjBVLAkvLyA8NSwzLHUsMj46IENvc3QgMyB2ZXh0MSA8MSw1LDMsdT4sIDwyLDIsMiwyPgorICAyNTU5NzE1NDc4VSwJLy8gPDUsMyx1LDM+OiBDb3N0IDMgdmV4dDEgPDEsNSwzLHU+LCA8MywwLDEsMj4KKyAgMTQ4NTk3NDgzOFUsCS8vIDw1LDMsdSw0PjogQ29zdCAyIHZleHQxIDwxLDUsMyx1PiwgUkhTCisgIDI2ODcxMjYzNDJVLAkvLyA8NSwzLHUsNT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDwzLHUsNSw2PgorICAyNjAxNTIxNjU4VSwJLy8gPDUsMyx1LDY+OiBDb3N0IDMgdmV4dDEgPHUsNSwzLHU+LCA8NiwyLDcsMz4KKyAgMjIzNjQxMDQ3MVUsCS8vIDw1LDMsdSw3PjogQ29zdCAzIHZyZXYgPDMsNSw3LHU+CisgIDE0ODU5NzczOTBVLAkvLyA8NSwzLHUsdT46IENvc3QgMiB2ZXh0MSA8MSw1LDMsdT4sIExIUworICAzNjI3NDkxNDMwVSwJLy8gPDUsNCwwLDA+OiBDb3N0IDQgdmV4dDEgPDAsNSw0LDA+LCBMSFMKKyAgMjYzNjg5MDIxNFUsCS8vIDw1LDQsMCwxPjogQ29zdCAzIHZleHQyIDwzLDIsNSw0PiwgTEhTCisgIDM3MDMzMzMwMjhVLAkvLyA8NSw0LDAsMj46IENvc3QgNCB2ZXh0MiA8MiwwLDUsND4sIDwwLDIsMCwyPgorICAzNzgyMjQ5MzQ4VSwJLy8gPDUsNCwwLDM+OiBDb3N0IDQgdmV4dDMgPDQsMCwzLDU+LCA8NCwwLDMsNT4KKyAgMjY0MjE5ODg2NlUsCS8vIDw1LDQsMCw0PjogQ29zdCAzIHZleHQyIDw0LDEsNSw0PiwgPDAsNCwxLDU+CisgIDI2ODcxMjY0MThVLAkvLyA8NSw0LDAsNT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDw0LDAsNSwxPgorICAyMjQyMjQzODg3VSwJLy8gPDUsNCwwLDY+OiBDb3N0IDMgdnJldiA8NCw1LDYsMD4KKyAgMzMxNjA1OTQ0OFUsCS8vIDw1LDQsMCw3PjogQ29zdCA0IHZyZXYgPDQsNSw3LDA+CisgIDI2MzY4OTA3ODFVLAkvLyA8NSw0LDAsdT46IENvc3QgMyB2ZXh0MiA8MywyLDUsND4sIExIUworICAyMjQxODA5NjU4VSwJLy8gPDUsNCwxLDA+OiBDb3N0IDMgdnJldiA8NCw1LDAsMT4KKyAgMzY5ODAyNTMwN1UsCS8vIDw1LDQsMSwxPjogQ29zdCA0IHZleHQyIDwxLDEsNSw0PiwgPDEsMSw1LDQ+CisgIDM2OTg2ODg5NDBVLAkvLyA8NSw0LDEsMj46IENvc3QgNCB2ZXh0MiA8MSwyLDUsND4sIDwxLDIsNSw0PgorICAzNjk4Njg5MDI0VSwJLy8gPDUsNCwxLDM+OiBDb3N0IDQgdmV4dDIgPDEsMiw1LDQ+LCA8MSwzLDUsNz4KKyAgMzcwMDAxNjIwNlUsCS8vIDw1LDQsMSw0PjogQ29zdCA0IHZleHQyIDwxLDQsNSw0PiwgPDEsNCw1LDQ+CisgIDI2ODcxMjY0OThVLAkvLyA8NSw0LDEsNT46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDw0LDEsNSwwPgorICAzNzYwODY4MzM2VSwJLy8gPDUsNCwxLDY+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8NCwxLDYsNT4KKyAgMzMxNjA2NzY0MVUsCS8vIDw1LDQsMSw3PjogQ29zdCA0IHZyZXYgPDQsNSw3LDE+CisgIDIyNDIzOTk1NTRVLAkvLyA8NSw0LDEsdT46IENvc3QgMyB2cmV2IDw0LDUsdSwxPgorICAzNzAzMzM0MzcxVSwJLy8gPDUsNCwyLDA+OiBDb3N0IDQgdmV4dDIgPDIsMCw1LDQ+LCA8MiwwLDUsND4KKyAgMzcwMzk5ODAwNFUsCS8vIDw1LDQsMiwxPjogQ29zdCA0IHZleHQyIDwyLDEsNSw0PiwgPDIsMSw1LDQ+CisgIDM3MDQ2NjE2MzdVLAkvLyA8NSw0LDIsMj46IENvc3QgNCB2ZXh0MiA8MiwyLDUsND4sIDwyLDIsNSw0PgorICAyNjM2ODkxODU0VSwJLy8gPDUsNCwyLDM+OiBDb3N0IDMgdmV4dDIgPDMsMiw1LDQ+LCA8MiwzLDQsNT4KKyAgMzcwNTk4ODkwM1UsCS8vIDw1LDQsMiw0PjogQ29zdCA0IHZleHQyIDwyLDQsNSw0PiwgPDIsNCw1LDQ+CisgIDI2OTg2MjgxNTBVLAkvLyA8NSw0LDIsNT46IENvc3QgMyB2ZXh0MyA8MiwzLDQsNT4sIDw0LDIsNSwzPgorICAzNzYwODY4NDE1VSwJLy8gPDUsNCwyLDY+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8NCwyLDYsMz4KKyAgMzc4Mzg3MTU2MlUsCS8vIDw1LDQsMiw3PjogQ29zdCA0IHZleHQzIDw0LDIsNyw1PiwgPDQsMiw3LDU+CisgIDI2NjY3NTIwOTlVLAkvLyA8NSw0LDIsdT46IENvc3QgMyB2ZXh0MiA8dSwyLDUsND4sIDwyLHUsNCw1PgorICAzNjM5NDU5OTQyVSwJLy8gPDUsNCwzLDA+OiBDb3N0IDQgdmV4dDEgPDIsNSw0LDM+LCBMSFMKKyAgMzcwOTk3MDcwMVUsCS8vIDw1LDQsMywxPjogQ29zdCA0IHZleHQyIDwzLDEsNSw0PiwgPDMsMSw1LDQ+CisgIDI2MzY4OTI1MTBVLAkvLyA8NSw0LDMsMj46IENvc3QgMyB2ZXh0MiA8MywyLDUsND4sIDwzLDIsNSw0PgorICAzNzEwNjM0Mzk2VSwJLy8gPDUsNCwzLDM+OiBDb3N0IDQgdmV4dDIgPDMsMiw1LDQ+LCA8MywzLDMsMz4KKyAgMjYzODIxOTc3NlUsCS8vIDw1LDQsMyw0PjogQ29zdCAzIHZleHQyIDwzLDQsNSw0PiwgPDMsNCw1LDQ+CisgIDM3NjY5ODc5MDhVLAkvLyA8NSw0LDMsNT46IENvc3QgNCB2ZXh0MyA8MSw0LDMsNT4sIDw0LDMsNSwwPgorICAyNzEwNzE5NjM0VSwJLy8gPDUsNCwzLDY+OiBDb3N0IDMgdmV4dDMgPDQsMyw2LDU+LCA8NCwzLDYsNT4KKyAgMzkxNDA5NzY2NFUsCS8vIDw1LDQsMyw3PjogQ29zdCA0IHZ1enByIDwzLDUsNyw0PiwgPDEsMyw1LDc+CisgIDI2NDA4NzQzMDhVLAkvLyA8NSw0LDMsdT46IENvc3QgMyB2ZXh0MiA8Myx1LDUsND4sIDwzLHUsNSw0PgorICAyNTgzNjQyMjE0VSwJLy8gPDUsNCw0LDA+OiBDb3N0IDMgdmV4dDEgPDUsNSw0LDQ+LCBMSFMKKyAgMjY0MjIwMTU3NFUsCS8vIDw1LDQsNCwxPjogQ29zdCAzIHZleHQyIDw0LDEsNSw0PiwgPDQsMSw1LDQ+CisgIDM3MTA2MzUwNjJVLAkvLyA8NSw0LDQsMj46IENvc3QgNCB2ZXh0MiA8MywyLDUsND4sIDw0LDIsNSwzPgorICAzNzE3MjcwNjY0VSwJLy8gPDUsNCw0LDM+OiBDb3N0IDQgdmV4dDIgPDQsMyw1LDQ+LCA8NCwzLDUsND4KKyAgMjcxMzk2MzcyOFUsCS8vIDw1LDQsNCw0PjogQ29zdCAzIHZleHQzIDw0LHUsNSw1PiwgPDQsNCw0LDQ+CisgIDE2Mzc1Njc3MDZVLAkvLyA8NSw0LDQsNT46IENvc3QgMiB2ZXh0MyA8NCw0LDUsNT4sIDw0LDQsNSw1PgorICAyMjQyMjc2NjU5VSwJLy8gPDUsNCw0LDY+OiBDb3N0IDMgdnJldiA8NCw1LDYsND4KKyAgMjY0NjE4MzM3MlUsCS8vIDw1LDQsNCw3PjogQ29zdCAzIHZleHQyIDw0LDcsNSw0PiwgPDQsNyw1LDQ+CisgIDE2Mzc3ODg5MTdVLAkvLyA8NSw0LDQsdT46IENvc3QgMiB2ZXh0MyA8NCw0LHUsNT4sIDw0LDQsdSw1PgorICAyNTU5NzYyNTM0VSwJLy8gPDUsNCw1LDA+OiBDb3N0IDMgdmV4dDEgPDEsNSw0LDU+LCBMSFMKKyAgMjU1OTc2MzYwN1UsCS8vIDw1LDQsNSwxPjogQ29zdCAzIHZleHQxIDwxLDUsNCw1PiwgPDEsNSw0LDU+CisgIDI2OTg2MjgzNjZVLAkvLyA8NSw0LDUsMj46IENvc3QgMyB2ZXh0MyA8MiwzLDQsNT4sIDw0LDUsMiwzPgorICAzNjMzNTA2NDU0VSwJLy8gPDUsNCw1LDM+OiBDb3N0IDQgdmV4dDEgPDEsNSw0LDU+LCA8MywwLDEsMj4KKyAgMjU1OTc2NTgxNFUsCS8vIDw1LDQsNSw0PjogQ29zdCAzIHZleHQxIDwxLDUsNCw1PiwgUkhTCisgIDI1ODM2NTQzOTVVLAkvLyA8NSw0LDUsNT46IENvc3QgMyB2ZXh0MSA8NSw1LDQsNT4sIDw1LDUsNCw1PgorICAxNjEzMzg1MDE0VSwJLy8gPDUsNCw1LDY+OiBDb3N0IDIgdmV4dDMgPDAsNCwxLDU+LCBSSFMKKyAgMzkwMTYzOTk5MFUsCS8vIDw1LDQsNSw3PjogQ29zdCA0IHZ1enByIDwxLDUsMCw0PiwgUkhTCisgIDE2MTMzODUwMzJVLAkvLyA8NSw0LDUsdT46IENvc3QgMiB2ZXh0MyA8MCw0LDEsNT4sIFJIUworICAyNTU5NzcwNzI2VSwJLy8gPDUsNCw2LDA+OiBDb3N0IDMgdmV4dDEgPDEsNSw0LDY+LCBMSFMKKyAgMjU1OTc3MTY0OFUsCS8vIDw1LDQsNiwxPjogQ29zdCAzIHZleHQxIDwxLDUsNCw2PiwgPDEsMyw1LDc+CisgIDM2MzM1MTQwODhVLAkvLyA8NSw0LDYsMj46IENvc3QgNCB2ZXh0MSA8MSw1LDQsNj4sIDwyLDIsMiwyPgorICAyNTcxNzE3MTIyVSwJLy8gPDUsNCw2LDM+OiBDb3N0IDMgdmV4dDEgPDMsNSw0LDY+LCA8Myw0LDUsNj4KKyAgMjU1OTc3NDAwNlUsCS8vIDw1LDQsNiw0PjogQ29zdCAzIHZleHQxIDwxLDUsNCw2PiwgUkhTCisgIDI3MTI2MzY3OTZVLAkvLyA8NSw0LDYsNT46IENvc3QgMyB2ZXh0MyA8NCw2LDUsNT4sIDw0LDYsNSw1PgorICAzNzYwODY4NzQzVSwJLy8gPDUsNCw2LDY+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDU+LCA8NCw2LDYsNz4KKyAgMjcxMjc4NDI3MFUsCS8vIDw1LDQsNiw3PjogQ29zdCAzIHZleHQzIDw0LDYsNyw1PiwgPDQsNiw3LDU+CisgIDI1NTk3NzY1NThVLAkvLyA8NSw0LDYsdT46IENvc3QgMyB2ZXh0MSA8MSw1LDQsNj4sIExIUworICAyNTY1NzUwODg2VSwJLy8gPDUsNCw3LDA+OiBDb3N0IDMgdmV4dDEgPDIsNSw0LDc+LCBMSFMKKyAgMjU2NTc1MTcwNlUsCS8vIDw1LDQsNywxPjogQ29zdCAzIHZleHQxIDwyLDUsNCw3PiwgPDEsMiwzLDQ+CisgIDI1NjU3NTI2OTBVLAkvLyA8NSw0LDcsMj46IENvc3QgMyB2ZXh0MSA8Miw1LDQsNz4sIDwyLDUsNCw3PgorICAyNTcxNzI1Mzg3VSwJLy8gPDUsNCw3LDM+OiBDb3N0IDMgdmV4dDEgPDMsNSw0LDc+LCA8Myw1LDQsNz4KKyAgMjU2NTc1NDE2NlUsCS8vIDw1LDQsNyw0PjogQ29zdCAzIHZleHQxIDwyLDUsNCw3PiwgUkhTCisgIDMxMTQ3MTM0MjZVLAkvLyA8NSw0LDcsNT46IENvc3QgMyB2dHJuciBSSFMsIDwwLDQsMSw1PgorICA5NDgxNzU5MFUsCS8vIDw1LDQsNyw2PjogQ29zdCAxIHZyZXYgUkhTCisgIDI1OTU2MTYxNzVVLAkvLyA8NSw0LDcsNz46IENvc3QgMyB2ZXh0MSA8Nyw1LDQsNz4sIDw3LDUsNCw3PgorICA5NDk2NTA2NFUsCS8vIDw1LDQsNyx1PjogQ29zdCAxIHZyZXYgUkhTCisgIDI1NTk3ODcxMTBVLAkvLyA8NSw0LHUsMD46IENvc3QgMyB2ZXh0MSA8MSw1LDQsdT4sIExIUworICAyNTU5Nzg4MTg2VSwJLy8gPDUsNCx1LDE+OiBDb3N0IDMgdmV4dDEgPDEsNSw0LHU+LCA8MSw1LDQsdT4KKyAgMjI0MjAxNDQ4M1UsCS8vIDw1LDQsdSwyPjogQ29zdCAzIHZyZXYgPDQsNSwyLHU+CisgIDI2Njc0MTk2MjhVLAkvLyA8NSw0LHUsMz46IENvc3QgMyB2ZXh0MiA8dSwzLDUsND4sIDx1LDMsNSw0PgorICAyNTU5NzkwMzkwVSwJLy8gPDUsNCx1LDQ+OiBDb3N0IDMgdmV4dDEgPDEsNSw0LHU+LCBSSFMKKyAgMTY0MDIyMjIzOFUsCS8vIDw1LDQsdSw1PjogQ29zdCAyIHZleHQzIDw0LHUsNSw1PiwgPDQsdSw1LDU+CisgIDk0ODI1NzgzVSwJLy8gPDUsNCx1LDY+OiBDb3N0IDEgdnJldiBSSFMKKyAgMjcxNDExMTUzNlUsCS8vIDw1LDQsdSw3PjogQ29zdCAzIHZleHQzIDw0LHUsNyw1PiwgPDQsdSw3LDU+CisgIDk0OTczMjU3VSwJLy8gPDUsNCx1LHU+OiBDb3N0IDEgdnJldiBSSFMKKyAgMjY0Njg1MTU4NFUsCS8vIDw1LDUsMCwwPjogQ29zdCAzIHZleHQyIDw0LHUsNSw1PiwgPDAsMCwwLDA+CisgIDE1NzMxMDk4NjJVLAkvLyA8NSw1LDAsMT46IENvc3QgMiB2ZXh0MiA8NCx1LDUsNT4sIExIUworICAyNjQ2ODUxNzQ4VSwJLy8gPDUsNSwwLDI+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDU+LCA8MCwyLDAsMj4KKyAgMzc2MDI3OTEzMFUsCS8vIDw1LDUsMCwzPjogQ29zdCA0IHZleHQzIDwwLDMsMiw1PiwgPDUsMCwzLDI+CisgIDI2ODcxMjcxMzhVLAkvLyA8NSw1LDAsND46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDw1LDAsNCwxPgorICAyMjQ4MTQyODQ3VSwJLy8gPDUsNSwwLDU+OiBDb3N0IDMgdnJldiA8NSw1LDUsMD4KKyAgMzcyMDU5MzkxMFUsCS8vIDw1LDUsMCw2PjogQ29zdCA0IHZleHQyIDw0LHUsNSw1PiwgPDAsNiwxLDc+CisgIDQxODI1MDI3MTBVLAkvLyA8NSw1LDAsNz46IENvc3QgNCB2dHJuciA8Myw1LDcsMD4sIFJIUworICAxNTczMTEwNDI5VSwJLy8gPDUsNSwwLHU+OiBDb3N0IDIgdmV4dDIgPDQsdSw1LDU+LCBMSFMKKyAgMjY0Njg1MjM0MlUsCS8vIDw1LDUsMSwwPjogQ29zdCAzIHZleHQyIDw0LHUsNSw1PiwgPDEsMCwzLDI+CisgIDI2MjQyOTE2NzZVLAkvLyA8NSw1LDEsMT46IENvc3QgMyB2ZXh0MiA8MSwxLDUsNT4sIDwxLDEsNSw1PgorICAyNjQ2ODUyNTAyVSwJLy8gPDUsNSwxLDI+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDU+LCA8MSwyLDMsMD4KKyAgMjY0Njg1MjU2OFUsCS8vIDw1LDUsMSwzPjogQ29zdCAzIHZleHQyIDw0LHUsNSw1PiwgPDEsMywxLDM+CisgIDI3MTUyMTc1OTFVLAkvLyA8NSw1LDEsND46IENvc3QgMyB2ZXh0MyA8NSwxLDQsNT4sIDw1LDEsNCw1PgorICAyNjI4OTM2ODQ4VSwJLy8gPDUsNSwxLDU+OiBDb3N0IDMgdmV4dDIgPDEsdSw1LDU+LCA8MSw1LDMsNz4KKyAgMzY5ODAzMzkwN1UsCS8vIDw1LDUsMSw2PjogQ29zdCA0IHZleHQyIDwxLDEsNSw1PiwgPDEsNiw1LDc+CisgIDI3MTM5NjQyNDBVLAkvLyA8NSw1LDEsNz46IENvc3QgMyB2ZXh0MyA8NCx1LDUsNT4sIDw1LDEsNywzPgorICAyNjI4OTM3MTA3VSwJLy8gPDUsNSwxLHU+OiBDb3N0IDMgdmV4dDIgPDEsdSw1LDU+LCA8MSx1LDUsNT4KKyAgMzY0NTQ5NzQ0NlUsCS8vIDw1LDUsMiwwPjogQ29zdCA0IHZleHQxIDwzLDUsNSwyPiwgTEhTCisgIDM3NjA4NjkwOTlVLAkvLyA8NSw1LDIsMT46IENvc3QgNCB2ZXh0MyA8MCw0LDEsNT4sIDw1LDIsMSwzPgorICAyNjQ2ODUzMjI0VSwJLy8gPDUsNSwyLDI+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDU+LCA8MiwyLDIsMj4KKyAgMjY5ODYyODg2MlUsCS8vIDw1LDUsMiwzPjogQ29zdCAzIHZleHQzIDwyLDMsNCw1PiwgPDUsMiwzLDQ+CisgIDM3NzIzNzA2OTRVLAkvLyA8NSw1LDIsND46IENvc3QgNCB2ZXh0MyA8MiwzLDQsNT4sIDw1LDIsNCwzPgorICAyNzEzOTY0MzAzVSwJLy8gPDUsNSwyLDU+OiBDb3N0IDMgdmV4dDMgPDQsdSw1LDU+LCA8NSwyLDUsMz4KKyAgMjY0Njg1MzU2MlUsCS8vIDw1LDUsMiw2PjogQ29zdCAzIHZleHQyIDw0LHUsNSw1PiwgPDIsNiwzLDc+CisgIDQwMzgxOTgyNzJVLAkvLyA8NSw1LDIsNz46IENvc3QgNCB2emlwciA8MSx1LDUsMj4sIDwxLDMsNSw3PgorICAyNzAxOTQ2NjY3VSwJLy8gPDUsNSwyLHU+OiBDb3N0IDMgdmV4dDMgPDIsdSw0LDU+LCA8NSwyLHUsND4KKyAgMjY0Njg1Mzc4MlUsCS8vIDw1LDUsMywwPjogQ29zdCAzIHZleHQyIDw0LHUsNSw1PiwgPDMsMCwxLDI+CisgIDM2OTgwMzQ5MjJVLAkvLyA8NSw1LDMsMT46IENvc3QgNCB2ZXh0MiA8MSwxLDUsNT4sIDwzLDEsMSw1PgorICAzNzAyNjc5OTE5VSwJLy8gPDUsNSwzLDI+OiBDb3N0IDQgdmV4dDIgPDEsdSw1LDU+LCA8MywyLDcsMz4KKyAgMjYzNzU2NDMzNlUsCS8vIDw1LDUsMywzPjogQ29zdCAzIHZleHQyIDwzLDMsNSw1PiwgPDMsMyw1LDU+CisgIDI2NDY4NTQxNDZVLAkvLyA8NSw1LDMsND46IENvc3QgMyB2ZXh0MiA8NCx1LDUsNT4sIDwzLDQsNSw2PgorICAyNjM4ODkxNjAyVSwJLy8gPDUsNSwzLDU+OiBDb3N0IDMgdmV4dDIgPDMsNSw1LDU+LCA8Myw1LDUsNT4KKyAgMzcwMjY4MDI0N1UsCS8vIDw1LDUsMyw2PjogQ29zdCA0IHZleHQyIDwxLHUsNSw1PiwgPDMsNiw3LDc+CisgIDM3MDI2ODAyNTlVLAkvLyA8NSw1LDMsNz46IENvc3QgNCB2ZXh0MiA8MSx1LDUsNT4sIDwzLDcsMCwxPgorICAyNjQ2ODU0NDMwVSwJLy8gPDUsNSwzLHU+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDU+LCA8Myx1LDEsMj4KKyAgMjY0Njg1NDU0NlUsCS8vIDw1LDUsNCwwPjogQ29zdCAzIHZleHQyIDw0LHUsNSw1PiwgPDQsMCw1LDE+CisgIDI2NDIyMDk3NjdVLAkvLyA8NSw1LDQsMT46IENvc3QgMyB2ZXh0MiA8NCwxLDUsNT4sIDw0LDEsNSw1PgorICAzNzExMzA2ODA2VSwJLy8gPDUsNSw0LDI+OiBDb3N0IDQgdmV4dDIgPDMsMyw1LDU+LCA8NCwyLDUsMz4KKyAgMzY0NTUxNjM2OVUsCS8vIDw1LDUsNCwzPjogQ29zdCA0IHZleHQxIDwzLDUsNSw0PiwgPDMsNSw1LDQ+CisgIDE1NzA0NTg4NDJVLAkvLyA8NSw1LDQsND46IENvc3QgMiB2ZXh0MiA8NCw0LDUsNT4sIDw0LDQsNSw1PgorICAxNTczMTEzMTQyVSwJLy8gPDUsNSw0LDU+OiBDb3N0IDIgdmV4dDIgPDQsdSw1LDU+LCBSSFMKKyAgMjY0NTUyNzkzMlUsCS8vIDw1LDUsNCw2PjogQ29zdCAzIHZleHQyIDw0LDYsNSw1PiwgPDQsNiw1LDU+CisgIDI3MTM5NjQ0ODZVLAkvLyA8NSw1LDQsNz46IENvc3QgMyB2ZXh0MyA8NCx1LDUsNT4sIDw1LDQsNyw2PgorICAxNTczMTEzMzc0VSwJLy8gPDUsNSw0LHU+OiBDb3N0IDIgdmV4dDIgPDQsdSw1LDU+LCA8NCx1LDUsNT4KKyAgMTUwOTk4MjMxMFUsCS8vIDw1LDUsNSwwPjogQ29zdCAyIHZleHQxIDw1LDUsNSw1PiwgTEhTCisgIDI2NDY4NTUzNzZVLAkvLyA8NSw1LDUsMT46IENvc3QgMyB2ZXh0MiA8NCx1LDUsNT4sIDw1LDEsNywzPgorICAyNTgzNzI1NjcyVSwJLy8gPDUsNSw1LDI+OiBDb3N0IDMgdmV4dDEgPDUsNSw1LDU+LCA8MiwyLDIsMj4KKyAgMjU4MzcyNjIzMFUsCS8vIDw1LDUsNSwzPjogQ29zdCAzIHZleHQxIDw1LDUsNSw1PiwgPDMsMCwxLDI+CisgIDE1MDk5ODU1OTBVLAkvLyA8NSw1LDUsND46IENvc3QgMiB2ZXh0MSA8NSw1LDUsNT4sIFJIUworICAyMjkwMzUzMThVLAkvLyA8NSw1LDUsNT46IENvc3QgMSB2ZHVwMSBSSFMKKyAgMjY0Njg1NTc3OFUsCS8vIDw1LDUsNSw2PjogQ29zdCAzIHZleHQyIDw0LHUsNSw1PiwgPDUsNiw3LDA+CisgIDI2NDY4NTU4NDhVLAkvLyA8NSw1LDUsNz46IENvc3QgMyB2ZXh0MiA8NCx1LDUsNT4sIDw1LDcsNSw3PgorICAyMjkwMzUzMThVLAkvLyA8NSw1LDUsdT46IENvc3QgMSB2ZHVwMSBSSFMKKyAgMjU3Nzc2MDM1OFUsCS8vIDw1LDUsNiwwPjogQ29zdCAzIHZleHQxIDw0LDUsNSw2PiwgTEhTCisgIDM2MzM1ODczNjFVLAkvLyA8NSw1LDYsMT46IENvc3QgNCB2ZXh0MSA8MSw1LDUsNj4sIDwxLDUsNSw2PgorICAyNjQ2ODU2MTg2VSwJLy8gPDUsNSw2LDI+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDU+LCA8NiwyLDcsMz4KKyAgMzYzMzU4ODczOFUsCS8vIDw1LDUsNiwzPjogQ29zdCA0IHZleHQxIDwxLDUsNSw2PiwgPDMsNCw1LDY+CisgIDI3MTg1MzU3NTZVLAkvLyA8NSw1LDYsND46IENvc3QgMyB2ZXh0MyA8NSw2LDQsNT4sIDw1LDYsNCw1PgorICAyNjQ0MjAyMjIzVSwJLy8gPDUsNSw2LDU+OiBDb3N0IDMgdmV4dDIgPDQsNCw1LDU+LCA8Niw1LDcsNT4KKyAgMjk3Mzc4MDQ4MlUsCS8vIDw1LDUsNiw2PjogQ29zdCAzIHZ6aXByIDwzLDQsNSw2PiwgPDMsNCw1LDY+CisgIDI2NDY4NTY1MjZVLAkvLyA8NSw1LDYsNz46IENvc3QgMyB2ZXh0MiA8NCx1LDUsNT4sIDw2LDcsMCwxPgorICAyNjQ2ODU2NjA3VSwJLy8gPDUsNSw2LHU+OiBDb3N0IDMgdmV4dDIgPDQsdSw1LDU+LCA8Nix1LDAsMT4KKyAgMjU3MTc5NjU4MlUsCS8vIDw1LDUsNywwPjogQ29zdCAzIHZleHQxIDwzLDUsNSw3PiwgTEhTCisgIDM2MzM1OTUzOTJVLAkvLyA8NSw1LDcsMT46IENvc3QgNCB2ZXh0MSA8MSw1LDUsNz4sIDwxLDMsNSw3PgorICAyNTcxNzk4MjIyVSwJLy8gPDUsNSw3LDI+OiBDb3N0IDMgdmV4dDEgPDMsNSw1LDc+LCA8MiwzLDQsNT4KKyAgMjU3MTc5OTEyNFUsCS8vIDw1LDUsNywzPjogQ29zdCAzIHZleHQxIDwzLDUsNSw3PiwgPDMsNSw1LDc+CisgIDI1NzE3OTk4NjJVLAkvLyA8NSw1LDcsND46IENvc3QgMyB2ZXh0MSA8Myw1LDUsNz4sIFJIUworICAzMTE0NzE3MTg4VSwJLy8gPDUsNSw3LDU+OiBDb3N0IDMgdnRybnIgUkhTLCA8NSw1LDUsNT4KKyAgNDAzNDkyMzAxMFUsCS8vIDw1LDUsNyw2PjogQ29zdCA0IHZ6aXByIDwxLDMsNSw3PiwgPDMsNCw1LDY+CisgIDIwNDA5NzQ2NDZVLAkvLyA8NSw1LDcsNz46IENvc3QgMiB2dHJuciBSSFMsIFJIUworICAyMDQwOTc0NjQ3VSwJLy8gPDUsNSw3LHU+OiBDb3N0IDIgdnRybnIgUkhTLCBSSFMKKyAgMTUwOTk4MjMxMFUsCS8vIDw1LDUsdSwwPjogQ29zdCAyIHZleHQxIDw1LDUsNSw1PiwgTEhTCisgIDE1NzMxMTU2OTRVLAkvLyA8NSw1LHUsMT46IENvc3QgMiB2ZXh0MiA8NCx1LDUsNT4sIExIUworICAyNTcxODA2NDE0VSwJLy8gPDUsNSx1LDI+OiBDb3N0IDMgdmV4dDEgPDMsNSw1LHU+LCA8MiwzLDQsNT4KKyAgMjU3MTgwNzMxN1UsCS8vIDw1LDUsdSwzPjogQ29zdCAzIHZleHQxIDwzLDUsNSx1PiwgPDMsNSw1LHU+CisgIDE1MDk5ODU1OTBVLAkvLyA8NSw1LHUsND46IENvc3QgMiB2ZXh0MSA8NSw1LDUsNT4sIFJIUworICAyMjkwMzUzMThVLAkvLyA8NSw1LHUsNT46IENvc3QgMSB2ZHVwMSBSSFMKKyAgMjY0Njg1NzkzNlUsCS8vIDw1LDUsdSw2PjogQ29zdCAzIHZleHQyIDw0LHUsNSw1PiwgPHUsNiwzLDc+CisgIDIwNDA5ODI4MzhVLAkvLyA8NSw1LHUsNz46IENvc3QgMiB2dHJuciBSSFMsIFJIUworICAyMjkwMzUzMThVLAkvLyA8NSw1LHUsdT46IENvc3QgMSB2ZHVwMSBSSFMKKyAgMjYzODIzMzYwMFUsCS8vIDw1LDYsMCwwPjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDAsMCwwLDA+CisgIDE1NjQ0OTE4NzhVLAkvLyA8NSw2LDAsMT46IENvc3QgMiB2ZXh0MiA8Myw0LDUsNj4sIExIUworICAyNjMyMjYxNzk2VSwJLy8gPDUsNiwwLDI+OiBDb3N0IDMgdmV4dDIgPDIsNCw1LDY+LCA8MCwyLDAsMj4KKyAgMjYzODIzMzg1NlUsCS8vIDw1LDYsMCwzPjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDAsMywxLDQ+CisgIDI2MzgyMzM5MzhVLAkvLyA8NSw2LDAsND46IENvc3QgMyB2ZXh0MiA8Myw0LDUsNj4sIDwwLDQsMSw1PgorICAzNzA2MDAzODg1VSwJLy8gPDUsNiwwLDU+OiBDb3N0IDQgdmV4dDIgPDIsNCw1LDY+LCA8MCw1LDIsNj4KKyAgMzcwNjAwMzk2N1UsCS8vIDw1LDYsMCw2PjogQ29zdCA0IHZleHQyIDwyLDQsNSw2PiwgPDAsNiwyLDc+CisgIDQwNDc0NzM5NzRVLAkvLyA8NSw2LDAsNz46IENvc3QgNCB2emlwciA8Myw0LDUsMD4sIFJIUworICAxNTY0NDkyNDQ1VSwJLy8gPDUsNiwwLHU+OiBDb3N0IDIgdmV4dDIgPDMsNCw1LDY+LCBMSFMKKyAgMjYzODIzNDM1OFUsCS8vIDw1LDYsMSwwPjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDEsMCwzLDI+CisgIDI2MzgyMzQ0MjBVLAkvLyA8NSw2LDEsMT46IENvc3QgMyB2ZXh0MiA8Myw0LDUsNj4sIDwxLDEsMSwxPgorICAyNjM4MjM0NTE4VSwJLy8gPDUsNiwxLDI+OiBDb3N0IDMgdmV4dDIgPDMsNCw1LDY+LCA8MSwyLDMsMD4KKyAgMjYzODIzNDU4NFUsCS8vIDw1LDYsMSwzPjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDEsMywxLDM+CisgIDI2MjYyOTA3NjhVLAkvLyA8NSw2LDEsND46IENvc3QgMyB2ZXh0MiA8MSw0LDUsNj4sIDwxLDQsNSw2PgorICAyNjM4MjM0NzY4VSwJLy8gPDUsNiwxLDU+OiBDb3N0IDMgdmV4dDIgPDMsNCw1LDY+LCA8MSw1LDMsNz4KKyAgMzcwMDAzMjcxOVUsCS8vIDw1LDYsMSw2PjogQ29zdCA0IHZleHQyIDwxLDQsNSw2PiwgPDEsNiwxLDc+CisgIDI5ODIzNjY1MThVLAkvLyA8NSw2LDEsNz46IENvc3QgMyB2emlwciA8NCx1LDUsMT4sIFJIUworICAyNjI4OTQ1MzAwVSwJLy8gPDUsNiwxLHU+OiBDb3N0IDMgdmV4dDIgPDEsdSw1LDY+LCA8MSx1LDUsNj4KKyAgMzcwNjAwNDkyNVUsCS8vIDw1LDYsMiwwPjogQ29zdCA0IHZleHQyIDwyLDQsNSw2PiwgPDIsMCwxLDI+CisgIDM3MTE5NzY5NjZVLAkvLyA8NSw2LDIsMT46IENvc3QgNCB2ZXh0MiA8Myw0LDUsNj4sIDwyLDEsMCwzPgorICAyNjM4MjM1MjQwVSwJLy8gPDUsNiwyLDI+OiBDb3N0IDMgdmV4dDIgPDMsNCw1LDY+LCA8MiwyLDIsMj4KKyAgMjYzODIzNTMwMlUsCS8vIDw1LDYsMiwzPjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDIsMywwLDE+CisgIDI2MzIyNjM0NjVVLAkvLyA8NSw2LDIsND46IENvc3QgMyB2ZXh0MiA8Miw0LDUsNj4sIDwyLDQsNSw2PgorICAyNjM4MjM1NDk2VSwJLy8gPDUsNiwyLDU+OiBDb3N0IDMgdmV4dDIgPDMsNCw1LDY+LCA8Miw1LDMsNj4KKyAgMjYzODIzNTU3OFUsCS8vIDw1LDYsMiw2PjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDIsNiwzLDc+CisgIDI3MTM5NjUwNTBVLAkvLyA8NSw2LDIsNz46IENvc3QgMyB2ZXh0MyA8NCx1LDUsNT4sIDw2LDIsNywzPgorICAyNjM0OTE3OTk3VSwJLy8gPDUsNiwyLHU+OiBDb3N0IDMgdmV4dDIgPDIsdSw1LDY+LCA8Mix1LDUsNj4KKyAgMjYzODIzNTc5OFUsCS8vIDw1LDYsMywwPjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDMsMCwxLDI+CisgIDM3MTE5Nzc2OTVVLAkvLyA8NSw2LDMsMT46IENvc3QgNCB2ZXh0MiA8Myw0LDUsNj4sIDwzLDEsMCwzPgorICAzNzEwNjUwNzIwVSwJLy8gPDUsNiwzLDI+OiBDb3N0IDQgdmV4dDIgPDMsMiw1LDY+LCA8MywyLDUsNj4KKyAgMjYzODIzNjA2MFUsCS8vIDw1LDYsMywzPjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDMsMywzLDM+CisgIDE1NjQ0OTQzMzhVLAkvLyA8NSw2LDMsND46IENvc3QgMiB2ZXh0MiA8Myw0LDUsNj4sIDwzLDQsNSw2PgorICAyNjM4MjM2MjM0VSwJLy8gPDUsNiwzLDU+OiBDb3N0IDMgdmV4dDIgPDMsNCw1LDY+LCA8Myw1LDQsNj4KKyAgMzcxMTk3ODEwNFUsCS8vIDw1LDYsMyw2PjogQ29zdCA0IHZleHQyIDwzLDQsNSw2PiwgPDMsNiwwLDc+CisgIDQwMzQyMjc1MTBVLAkvLyA8NSw2LDMsNz46IENvc3QgNCB2emlwciA8MSwyLDUsMz4sIFJIUworICAxNTY3MTQ4ODcwVSwJLy8gPDUsNiwzLHU+OiBDb3N0IDIgdmV4dDIgPDMsdSw1LDY+LCA8Myx1LDUsNj4KKyAgMjU3NzgxNzcwMlUsCS8vIDw1LDYsNCwwPjogQ29zdCAzIHZleHQxIDw0LDUsNiw0PiwgTEhTCisgIDM3MDAwMzQ1NDRVLAkvLyA8NSw2LDQsMT46IENvc3QgNCB2ZXh0MiA8MSw0LDUsNj4sIDw0LDEsNiw1PgorICAyNzIzMDMzNzEzVSwJLy8gPDUsNiw0LDI+OiBDb3N0IDMgdmV4dDMgPDYsNCwyLDU+LCA8Niw0LDIsNT4KKyAgMjYzODIzNjgxOFUsCS8vIDw1LDYsNCwzPjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDQsMyw2LDU+CisgIDI2NDQyMDg4NTlVLAkvLyA8NSw2LDQsND46IENvc3QgMyB2ZXh0MiA8NCw0LDUsNj4sIDw0LDQsNSw2PgorICAxNTY0NDk1MTU4VSwJLy8gPDUsNiw0LDU+OiBDb3N0IDIgdmV4dDIgPDMsNCw1LDY+LCBSSFMKKyAgMjY0NTUzNjEyNVUsCS8vIDw1LDYsNCw2PjogQ29zdCAzIHZleHQyIDw0LDYsNSw2PiwgPDQsNiw1LDY+CisgIDI3MjM0MDIzOThVLAkvLyA8NSw2LDQsNz46IENvc3QgMyB2ZXh0MyA8Niw0LDcsNT4sIDw2LDQsNyw1PgorICAxNTY0NDk1NDAxVSwJLy8gPDUsNiw0LHU+OiBDb3N0IDIgdmV4dDIgPDMsNCw1LDY+LCBSSFMKKyAgMjU3NzgyNTg5NFUsCS8vIDw1LDYsNSwwPjogQ29zdCAzIHZleHQxIDw0LDUsNiw1PiwgTEhTCisgIDI2NjIxMjUyNjRVLAkvLyA8NSw2LDUsMT46IENvc3QgMyB2ZXh0MiA8Nyw0LDUsNj4sIDw1LDEsNywzPgorICAzNzc1ODM2ODY3VSwJLy8gPDUsNiw1LDI+OiBDb3N0IDQgdmV4dDMgPDIsdSw2LDU+LCA8Niw1LDIsNj4KKyAgMzcxMTk3OTM0M1UsCS8vIDw1LDYsNSwzPjogQ29zdCA0IHZleHQyIDwzLDQsNSw2PiwgPDUsMywzLDQ+CisgIDI2NTAxODE1NTZVLAkvLyA8NSw2LDUsND46IENvc3QgMyB2ZXh0MiA8NSw0LDUsNj4sIDw1LDQsNSw2PgorICAyNjYyMTI1NTcyVSwJLy8gPDUsNiw1LDU+OiBDb3N0IDMgdmV4dDIgPDcsNCw1LDY+LCA8NSw1LDUsNT4KKyAgMjYzODIzNzczMlUsCS8vIDw1LDYsNSw2PjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDUsNiwwLDE+CisgIDI5ODIzOTkyODZVLAkvLyA8NSw2LDUsNz46IENvc3QgMyB2emlwciA8NCx1LDUsNT4sIFJIUworICAyOTgyMzk5Mjg3VSwJLy8gPDUsNiw1LHU+OiBDb3N0IDMgdnppcHIgPDQsdSw1LDU+LCBSSFMKKyAgMjU4MzgwNjA1NFUsCS8vIDw1LDYsNiwwPjogQ29zdCAzIHZleHQxIDw1LDUsNiw2PiwgTEhTCisgIDM3MTE5Nzk5MTBVLAkvLyA8NSw2LDYsMT46IENvc3QgNCB2ZXh0MiA8Myw0LDUsNj4sIDw2LDEsMyw0PgorICAyNjYyMTI2MDc0VSwJLy8gPDUsNiw2LDI+OiBDb3N0IDMgdmV4dDIgPDcsNCw1LDY+LCA8NiwyLDcsMz4KKyAgMjU4MzgwODUxNFUsCS8vIDw1LDYsNiwzPjogQ29zdCAzIHZleHQxIDw1LDUsNiw2PiwgPDMsNCw1LDY+CisgIDI1ODM4MDkzMzRVLAkvLyA8NSw2LDYsND46IENvc3QgMyB2ZXh0MSA8NSw1LDYsNj4sIFJIUworICAyNTgzODEwMDYyVSwJLy8gPDUsNiw2LDU+OiBDb3N0IDMgdmV4dDEgPDUsNSw2LDY+LCA8NSw1LDYsNj4KKyAgMjYzODIzODUyMFUsCS8vIDw1LDYsNiw2PjogQ29zdCAzIHZleHQyIDwzLDQsNSw2PiwgPDYsNiw2LDY+CisgIDI5NzM3ODEzMDJVLAkvLyA8NSw2LDYsNz46IENvc3QgMyB2emlwciA8Myw0LDUsNj4sIFJIUworICAyOTczNzgxMzAzVSwJLy8gPDUsNiw2LHU+OiBDb3N0IDMgdnppcHIgPDMsNCw1LDY+LCBSSFMKKyAgNDMwMzU4NjMwVSwJLy8gPDUsNiw3LDA+OiBDb3N0IDEgdmV4dDEgUkhTLCBMSFMKKyAgMTUwNDEwMTExMFUsCS8vIDw1LDYsNywxPjogQ29zdCAyIHZleHQxIFJIUywgPDEsMCwzLDI+CisgIDE1MDQxMDE5OTJVLAkvLyA8NSw2LDcsMj46IENvc3QgMiB2ZXh0MSBSSFMsIDwyLDIsMiwyPgorICAxNTA0MTAyNTUwVSwJLy8gPDUsNiw3LDM+OiBDb3N0IDIgdmV4dDEgUkhTLCA8MywwLDEsMj4KKyAgNDMwMzYxOTEwVSwJLy8gPDUsNiw3LDQ+OiBDb3N0IDEgdmV4dDEgUkhTLCBSSFMKKyAgMTUwNDEwNDM5MFUsCS8vIDw1LDYsNyw1PjogQ29zdCAyIHZleHQxIFJIUywgPDUsNCw3LDY+CisgIDE1MDQxMDUyNzJVLAkvLyA8NSw2LDcsNj46IENvc3QgMiB2ZXh0MSBSSFMsIDw2LDYsNiw2PgorICAxNTA0MTA2MDkyVSwJLy8gPDUsNiw3LDc+OiBDb3N0IDIgdmV4dDEgUkhTLCA8Nyw3LDcsNz4KKyAgNDMwMzY0NDYyVSwJLy8gPDUsNiw3LHU+OiBDb3N0IDEgdmV4dDEgUkhTLCBMSFMKKyAgNDMwMzY2ODIyVSwJLy8gPDUsNix1LDA+OiBDb3N0IDEgdmV4dDEgUkhTLCBMSFMKKyAgMTU2NDQ5NzcxMFUsCS8vIDw1LDYsdSwxPjogQ29zdCAyIHZleHQyIDwzLDQsNSw2PiwgTEhTCisgIDE1MDQxMTAxODRVLAkvLyA8NSw2LHUsMj46IENvc3QgMiB2ZXh0MSBSSFMsIDwyLDIsMiwyPgorICAxNTA0MTEwNzQyVSwJLy8gPDUsNix1LDM+OiBDb3N0IDIgdmV4dDEgUkhTLCA8MywwLDEsMj4KKyAgNDMwMzcwMTAzVSwJLy8gPDUsNix1LDQ+OiBDb3N0IDEgdmV4dDEgUkhTLCBSSFMKKyAgMTU2NDQ5ODA3NFUsCS8vIDw1LDYsdSw1PjogQ29zdCAyIHZleHQyIDwzLDQsNSw2PiwgUkhTCisgIDE1MDQxMTMxNDZVLAkvLyA8NSw2LHUsNj46IENvc3QgMiB2ZXh0MSBSSFMsIDw2LDIsNywzPgorICAxNTA0MTEzNjU4VSwJLy8gPDUsNix1LDc+OiBDb3N0IDIgdmV4dDEgUkhTLCA8NywwLDEsMj4KKyAgNDMwMzcyNjU0VSwJLy8gPDUsNix1LHU+OiBDb3N0IDEgdmV4dDEgUkhTLCBMSFMKKyAgMjYyNTYzNDMwNFUsCS8vIDw1LDcsMCwwPjogQ29zdCAzIHZleHQyIDwxLDMsNSw3PiwgPDAsMCwwLDA+CisgIDE1NTE4OTI1ODJVLAkvLyA8NSw3LDAsMT46IENvc3QgMiB2ZXh0MiA8MSwzLDUsNz4sIExIUworICAyNjI1NjM0NDY4VSwJLy8gPDUsNywwLDI+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8MCwyLDAsMj4KKyAgMjU3MTg4OTI0N1UsCS8vIDw1LDcsMCwzPjogQ29zdCAzIHZleHQxIDwzLDUsNywwPiwgPDMsNSw3LDA+CisgIDI2MjU2MzQ2NDJVLAkvLyA8NSw3LDAsND46IENvc3QgMyB2ZXh0MiA8MSwzLDUsNz4sIDwwLDQsMSw1PgorICAyNTk1Nzc4NzI4VSwJLy8gPDUsNywwLDU+OiBDb3N0IDMgdmV4dDEgPDcsNSw3LDA+LCA8NSw3LDUsNz4KKyAgMzY5OTM3NjYzOVUsCS8vIDw1LDcsMCw2PjogQ29zdCA0IHZleHQyIDwxLDMsNSw3PiwgPDAsNiwyLDc+CisgIDIyNjAyMzU3MTVVLAkvLyA8NSw3LDAsNz46IENvc3QgMyB2cmV2IDw3LDUsNywwPgorICAxNTUxODkzMTQ5VSwJLy8gPDUsNywwLHU+OiBDb3N0IDIgdmV4dDIgPDEsMyw1LDc+LCBMSFMKKyAgMjYyNTYzNTA2MlUsCS8vIDw1LDcsMSwwPjogQ29zdCAzIHZleHQyIDwxLDMsNSw3PiwgPDEsMCwzLDI+CisgIDI2MjQzMDgwMjBVLAkvLyA8NSw3LDEsMT46IENvc3QgMyB2ZXh0MiA8MSwxLDUsNz4sIDwxLDEsMSwxPgorICAyNjI1NjM1MjIyVSwJLy8gPDUsNywxLDI+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8MSwyLDMsMD4KKyAgMTU1MTg5MzUwNFUsCS8vIDw1LDcsMSwzPjogQ29zdCAyIHZleHQyIDwxLDMsNSw3PiwgPDEsMyw1LDc+CisgIDI1NzE4OTgxNjZVLAkvLyA8NSw3LDEsND46IENvc3QgMyB2ZXh0MSA8Myw1LDcsMT4sIFJIUworICAyNjI1NjM1NDcyVSwJLy8gPDUsNywxLDU+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8MSw1LDMsNz4KKyAgMjYyNzYyNjIyN1UsCS8vIDw1LDcsMSw2PjogQ29zdCAzIHZleHQyIDwxLDYsNSw3PiwgPDEsNiw1LDc+CisgIDM3MDIwMzE2ODRVLAkvLyA8NSw3LDEsNz46IENvc3QgNCB2ZXh0MiA8MSw3LDUsNz4sIDwxLDcsNSw3PgorICAxNTU1MjExNjY5VSwJLy8gPDUsNywxLHU+OiBDb3N0IDIgdmV4dDIgPDEsdSw1LDc+LCA8MSx1LDUsNz4KKyAgMjYyOTYxNzEyNlUsCS8vIDw1LDcsMiwwPjogQ29zdCAzIHZleHQyIDwyLDAsNSw3PiwgPDIsMCw1LDc+CisgIDM2OTkzNzc2NzBVLAkvLyA8NSw3LDIsMT46IENvc3QgNCB2ZXh0MiA8MSwzLDUsNz4sIDwyLDEsMCwzPgorICAyNjI1NjM1OTQ0VSwJLy8gPDUsNywyLDI+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8MiwyLDIsMj4KKyAgMjYyNTYzNjAwNlUsCS8vIDw1LDcsMiwzPjogQ29zdCAzIHZleHQyIDwxLDMsNSw3PiwgPDIsMywwLDE+CisgIDI2MzIyNzE2NThVLAkvLyA8NSw3LDIsND46IENvc3QgMyB2ZXh0MiA8Miw0LDUsNz4sIDwyLDQsNSw3PgorICAyNjI1NjM2MjAxVSwJLy8gPDUsNywyLDU+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8Miw1LDMsNz4KKyAgMjYyNTYzNjI4MlUsCS8vIDw1LDcsMiw2PjogQ29zdCAzIHZleHQyIDwxLDMsNSw3PiwgPDIsNiwzLDc+CisgIDM3MDgwMDQzODFVLAkvLyA8NSw3LDIsNz46IENvc3QgNCB2ZXh0MiA8Miw3LDUsNz4sIDwyLDcsNSw3PgorICAyNjI1NjM2NDExVSwJLy8gPDUsNywyLHU+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8Mix1LDAsMT4KKyAgMjYyNTYzNjUwMlUsCS8vIDw1LDcsMywwPjogQ29zdCAzIHZleHQyIDwxLDMsNSw3PiwgPDMsMCwxLDI+CisgIDI2MjU2MzY2MDRVLAkvLyA8NSw3LDMsMT46IENvc3QgMyB2ZXh0MiA8MSwzLDUsNz4sIDwzLDEsMyw1PgorICAzNjk5Mzc4NDc4VSwJLy8gPDUsNywzLDI+OiBDb3N0IDQgdmV4dDIgPDEsMyw1LDc+LCA8MywyLDAsMT4KKyAgMjYyNTYzNjc2NFUsCS8vIDw1LDcsMywzPjogQ29zdCAzIHZleHQyIDwxLDMsNSw3PiwgPDMsMywzLDM+CisgIDI2MjU2MzY4NjZVLAkvLyA8NSw3LDMsND46IENvc3QgMyB2ZXh0MiA8MSwzLDUsNz4sIDwzLDQsNSw2PgorICAyNjI1NjM2OTU5VSwJLy8gPDUsNywzLDU+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8Myw1LDcsMD4KKyAgMzY5OTM3ODgwOFUsCS8vIDw1LDcsMyw2PjogQ29zdCA0IHZleHQyIDwxLDMsNSw3PiwgPDMsNiwwLDc+CisgIDI2NDAyMzUyNTRVLAkvLyA8NSw3LDMsNz46IENvc3QgMyB2ZXh0MiA8Myw3LDUsNz4sIDwzLDcsNSw3PgorICAyNjI1NjM3MTUwVSwJLy8gPDUsNywzLHU+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8Myx1LDEsMj4KKyAgMjU3MTkxOTQ2MlUsCS8vIDw1LDcsNCwwPjogQ29zdCAzIHZleHQxIDwzLDUsNyw0PiwgTEhTCisgIDI1NzE5MjAzODRVLAkvLyA8NSw3LDQsMT46IENvc3QgMyB2ZXh0MSA8Myw1LDcsND4sIDwxLDMsNSw3PgorICAzNjk5Mzc5MjYwVSwJLy8gPDUsNyw0LDI+OiBDb3N0IDQgdmV4dDIgPDEsMyw1LDc+LCA8NCwyLDYsMD4KKyAgMjU3MTkyMjAxOVUsCS8vIDw1LDcsNCwzPjogQ29zdCAzIHZleHQxIDwzLDUsNyw0PiwgPDMsNSw3LDQ+CisgIDI1NzE5MjI3NDJVLAkvLyA8NSw3LDQsND46IENvc3QgMyB2ZXh0MSA8Myw1LDcsND4sIFJIUworICAxNTUxODk1ODYyVSwJLy8gPDUsNyw0LDU+OiBDb3N0IDIgdmV4dDIgPDEsMyw1LDc+LCBSSFMKKyAgMjg0NjI3Nzk4MFUsCS8vIDw1LDcsNCw2PjogQ29zdCAzIHZ1enByIFJIUywgPDAsNCwyLDY+CisgIDI2NDYyMDc5NTFVLAkvLyA8NSw3LDQsNz46IENvc3QgMyB2ZXh0MiA8NCw3LDUsNz4sIDw0LDcsNSw3PgorICAxNTUxODk2MTA1VSwJLy8gPDUsNyw0LHU+OiBDb3N0IDIgdmV4dDIgPDEsMyw1LDc+LCBSSFMKKyAgMjU4Mzg3MTU5MFUsCS8vIDw1LDcsNSwwPjogQ29zdCAzIHZleHQxIDw1LDUsNyw1PiwgTEhTCisgIDI2NTIxODAxNzZVLAkvLyA8NSw3LDUsMT46IENvc3QgMyB2ZXh0MiA8NSw3LDUsNz4sIDw1LDEsNywzPgorICAyNjI1NjM4MTc3VSwJLy8gPDUsNyw1LDI+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8NSwyLDcsMz4KKyAgMjYyNTYzODI2MlUsCS8vIDw1LDcsNSwzPjogQ29zdCAzIHZleHQyIDwxLDMsNSw3PiwgPDUsMyw3LDc+CisgIDI1ODM4NzQ4NzBVLAkvLyA8NSw3LDUsND46IENvc3QgMyB2ZXh0MSA8NSw1LDcsNT4sIFJIUworICAyODQ2MjgxNzMyVSwJLy8gPDUsNyw1LDU+OiBDb3N0IDMgdnV6cHIgUkhTLCA8NSw1LDUsNT4KKyAgMjY1MTUxNzAxNVUsCS8vIDw1LDcsNSw2PjogQ29zdCAzIHZleHQyIDw1LDYsNSw3PiwgPDUsNiw1LDc+CisgIDE3NzI1MzkxOTBVLAkvLyA8NSw3LDUsNz46IENvc3QgMiB2dXpwciBSSFMsIFJIUworICAxNzcyNTM5MTkxVSwJLy8gPDUsNyw1LHU+OiBDb3N0IDIgdnV6cHIgUkhTLCBSSFMKKyAgMjg0NjI4MTgyNlUsCS8vIDw1LDcsNiwwPjogQ29zdCAzIHZ1enByIFJIUywgPDUsNiw3LDA+CisgIDM2OTkzODA2MTVVLAkvLyA8NSw3LDYsMT46IENvc3QgNCB2ZXh0MiA8MSwzLDUsNz4sIDw2LDEsMyw1PgorICAyODQ2MjgxMTA4VSwJLy8gPDUsNyw2LDI+OiBDb3N0IDMgdnV6cHIgUkhTLCA8NCw2LHUsMj4KKyAgMjU4OTg1NDIxMFUsCS8vIDw1LDcsNiwzPjogQ29zdCAzIHZleHQxIDw2LDUsNyw2PiwgPDMsNCw1LDY+CisgIDI4NDYyODE4MzBVLAkvLyA8NSw3LDYsND46IENvc3QgMyB2dXpwciBSSFMsIDw1LDYsNyw0PgorICAyNzI1NDY3NjU4VSwJLy8gPDUsNyw2LDU+OiBDb3N0IDMgdmV4dDMgPDYsNyx1LDU+LCA8Nyw2LDUsdT4KKyAgMjg0NjI4MTA3NlUsCS8vIDw1LDcsNiw2PjogQ29zdCAzIHZ1enByIFJIUywgPDQsNiw0LDY+CisgIDI4NDYyNzk2MTBVLAkvLyA8NSw3LDYsNz46IENvc3QgMyB2dXpwciBSSFMsIDwyLDYsMyw3PgorICAyODQ2Mjc5NjExVSwJLy8gPDUsNyw2LHU+OiBDb3N0IDMgdnV6cHIgUkhTLCA8Miw2LDMsdT4KKyAgMTUxMDE0NjE1MFUsCS8vIDw1LDcsNywwPjogQ29zdCAyIHZleHQxIDw1LDUsNyw3PiwgTEhTCisgIDI4NDYyODI1NzRVLAkvLyA8NSw3LDcsMT46IENvc3QgMyB2dXpwciBSSFMsIDw2LDcsMCwxPgorICAyNTgzODg5NTEyVSwJLy8gPDUsNyw3LDI+OiBDb3N0IDMgdmV4dDEgPDUsNSw3LDc+LCA8MiwyLDIsMj4KKyAgMjg0NjI4MTkxOVUsCS8vIDw1LDcsNywzPjogQ29zdCAzIHZ1enByIFJIUywgPDUsNyx1LDM+CisgIDE1MTAxNDk0MzBVLAkvLyA8NSw3LDcsND46IENvc3QgMiB2ZXh0MSA8NSw1LDcsNz4sIFJIUworICAxNTEwMTUwMTY4VSwJLy8gPDUsNyw3LDU+OiBDb3N0IDIgdmV4dDEgPDUsNSw3LDc+LCA8NSw1LDcsNz4KKyAgMjU4Mzg5MjQ3NFUsCS8vIDw1LDcsNyw2PjogQ29zdCAzIHZleHQxIDw1LDUsNyw3PiwgPDYsMiw3LDM+CisgIDI2MjU2NDAwNDRVLAkvLyA8NSw3LDcsNz46IENvc3QgMyB2ZXh0MiA8MSwzLDUsNz4sIDw3LDcsNyw3PgorICAxNTEwMTUxOTgyVSwJLy8gPDUsNyw3LHU+OiBDb3N0IDIgdmV4dDEgPDUsNSw3LDc+LCBMSFMKKyAgMTUxMDE1NDM0MlUsCS8vIDw1LDcsdSwwPjogQ29zdCAyIHZleHQxIDw1LDUsNyx1PiwgTEhTCisgIDE1NTE4OTg0MTRVLAkvLyA8NSw3LHUsMT46IENvc3QgMiB2ZXh0MiA8MSwzLDUsNz4sIExIUworICAyNjI1NjQwMzI1VSwJLy8gPDUsNyx1LDI+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LDc+LCA8dSwyLDMsMD4KKyAgMTc3MjUzNjQ3N1UsCS8vIDw1LDcsdSwzPjogQ29zdCAyIHZ1enByIFJIUywgTEhTCisgIDE1MTAxNTc2MjJVLAkvLyA8NSw3LHUsND46IENvc3QgMiB2ZXh0MSA8NSw1LDcsdT4sIFJIUworICAxNTUxODk4Nzc4VSwJLy8gPDUsNyx1LDU+OiBDb3N0IDIgdmV4dDIgPDEsMyw1LDc+LCBSSFMKKyAgMjYyNTY0MDY1NlUsCS8vIDw1LDcsdSw2PjogQ29zdCAzIHZleHQyIDwxLDMsNSw3PiwgPHUsNiwzLDc+CisgIDE3NzI1Mzk0MzNVLAkvLyA8NSw3LHUsNz46IENvc3QgMiB2dXpwciBSSFMsIFJIUworICAxNTUxODk4OTgxVSwJLy8gPDUsNyx1LHU+OiBDb3N0IDIgdmV4dDIgPDEsMyw1LDc+LCBMSFMKKyAgMjYyNTY0MjQ5NlUsCS8vIDw1LHUsMCwwPjogQ29zdCAzIHZleHQyIDwxLDMsNSx1PiwgPDAsMCwwLDA+CisgIDE1NTE5MDA3NzRVLAkvLyA8NSx1LDAsMT46IENvc3QgMiB2ZXh0MiA8MSwzLDUsdT4sIExIUworICAyNjI1NjQyNjYwVSwJLy8gPDUsdSwwLDI+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LHU+LCA8MCwyLDAsMj4KKyAgMjY5ODYzMDg4NVUsCS8vIDw1LHUsMCwzPjogQ29zdCAzIHZleHQzIDwyLDMsNCw1PiwgPHUsMCwzLDI+CisgIDI2ODcxMjkzMjVVLAkvLyA8NSx1LDAsND46IENvc3QgMyB2ZXh0MyA8MCw0LDEsNT4sIDx1LDAsNCwxPgorICAyNjg5NzgzNTQyVSwJLy8gPDUsdSwwLDU+OiBDb3N0IDMgdmV4dDMgPDAsdSwxLDU+LCA8dSwwLDUsMT4KKyAgMjI2NjEzNDY3NVUsCS8vIDw1LHUsMCw2PjogQ29zdCAzIHZyZXYgPHUsNSw2LDA+CisgIDI1OTU4NTM3NzJVLAkvLyA8NSx1LDAsNz46IENvc3QgMyB2ZXh0MSA8Nyw1LHUsMD4sIDw3LDUsdSwwPgorICAxNTUxOTAxMzQxVSwJLy8gPDUsdSwwLHU+OiBDb3N0IDIgdmV4dDIgPDEsMyw1LHU+LCBMSFMKKyAgMjYyNTY0MzI1NFUsCS8vIDw1LHUsMSwwPjogQ29zdCAzIHZleHQyIDwxLDMsNSx1PiwgPDEsMCwzLDI+CisgIDI2MjU2NDMzMTZVLAkvLyA8NSx1LDEsMT46IENvc3QgMyB2ZXh0MiA8MSwzLDUsdT4sIDwxLDEsMSwxPgorICAxNjEzMzg3NTY2VSwJLy8gPDUsdSwxLDI+OiBDb3N0IDIgdmV4dDMgPDAsNCwxLDU+LCBMSFMKKyAgMTU1MTkwMTY5N1UsCS8vIDw1LHUsMSwzPjogQ29zdCAyIHZleHQyIDwxLDMsNSx1PiwgPDEsMyw1LHU+CisgIDI2MjYzMDcxNTRVLAkvLyA8NSx1LDEsND46IENvc3QgMyB2ZXh0MiA8MSw0LDUsdT4sIDwxLDQsNSx1PgorICAyNjg5NzgzNjIyVSwJLy8gPDUsdSwxLDU+OiBDb3N0IDMgdmV4dDMgPDAsdSwxLDU+LCA8dSwxLDUsMD4KKyAgMjYyNzYzNDQyMFUsCS8vIDw1LHUsMSw2PjogQ29zdCAzIHZleHQyIDwxLDYsNSx1PiwgPDEsNiw1LHU+CisgIDI5ODIzNjY1MzZVLAkvLyA8NSx1LDEsNz46IENvc3QgMyB2emlwciA8NCx1LDUsMT4sIFJIUworICAxNjEzMzg3NjIwVSwJLy8gPDUsdSwxLHU+OiBDb3N0IDIgdmV4dDMgPDAsNCwxLDU+LCBMSFMKKyAgMjg0NjI4Njc0MlUsCS8vIDw1LHUsMiwwPjogQ29zdCAzIHZ1enByIFJIUywgPDEsMiwzLDA+CisgIDI2ODU3OTY1MjhVLAkvLyA8NSx1LDIsMT46IENvc3QgMyB2ZXh0MyA8MCwyLDEsNT4sIDwwLDIsMSw1PgorICAyNjI1NjQ0MTM2VSwJLy8gPDUsdSwyLDI+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LHU+LCA8MiwyLDIsMj4KKyAgMjY4NzEyOTQ4MFUsCS8vIDw1LHUsMiwzPjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPHUsMiwzLDM+CisgIDI2MzIyNzk4NTFVLAkvLyA8NSx1LDIsND46IENvc3QgMyB2ZXh0MiA8Miw0LDUsdT4sIDwyLDQsNSx1PgorICAyNjI1NjQ0Mzk0VSwJLy8gPDUsdSwyLDU+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LHU+LCA8Miw1LDMsdT4KKyAgMjYyNTY0NDQ3NFUsCS8vIDw1LHUsMiw2PjogQ29zdCAzIHZleHQyIDwxLDMsNSx1PiwgPDIsNiwzLDc+CisgIDI3MTM5NjY1MDhVLAkvLyA8NSx1LDIsNz46IENvc3QgMyB2ZXh0MyA8NCx1LDUsNT4sIDx1LDIsNywzPgorICAyNjI1NjQ0NjAzVSwJLy8gPDUsdSwyLHU+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LHU+LCA8Mix1LDAsMT4KKyAgMjY4NzEyOTUzMlUsCS8vIDw1LHUsMywwPjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPHUsMywwLDE+CisgIDI2MzYyNjE2NDlVLAkvLyA8NSx1LDMsMT46IENvc3QgMyB2ZXh0MiA8MywxLDUsdT4sIDwzLDEsNSx1PgorICAyNjM2OTI1MjgyVSwJLy8gPDUsdSwzLDI+OiBDb3N0IDMgdmV4dDIgPDMsMiw1LHU+LCA8MywyLDUsdT4KKyAgMjYyNTY0NDk1NlUsCS8vIDw1LHUsMywzPjogQ29zdCAzIHZleHQyIDwxLDMsNSx1PiwgPDMsMywzLDM+CisgIDE1NjQ1MTA3MjRVLAkvLyA8NSx1LDMsND46IENvc3QgMiB2ZXh0MiA8Myw0LDUsdT4sIDwzLDQsNSx1PgorICAyNjI1NjQ1MTYwVSwJLy8gPDUsdSwzLDU+OiBDb3N0IDMgdmV4dDIgPDEsMyw1LHU+LCA8Myw1LHUsMD4KKyAgMjczNDYxMDQyMlUsCS8vIDw1LHUsMyw2PjogQ29zdCAzIHZleHQzIDx1LDMsNiw1PiwgPHUsMyw2LDU+CisgIDI2NDAyNDM0NDdVLAkvLyA8NSx1LDMsNz46IENvc3QgMyB2ZXh0MiA8Myw3LDUsdT4sIDwzLDcsNSx1PgorICAxNTY3MTY1MjU2VSwJLy8gPDUsdSwzLHU+OiBDb3N0IDIgdmV4dDIgPDMsdSw1LHU+LCA8Myx1LDUsdT4KKyAgMTU2NzgyODg4OVUsCS8vIDw1LHUsNCwwPjogQ29zdCAyIHZleHQyIDw0LDAsNSx1PiwgPDQsMCw1LHU+CisgIDE2NjExNjM1NDZVLAkvLyA8NSx1LDQsMT46IENvc3QgMiB2ZXh0MyA8dSw0LDEsNT4sIDx1LDQsMSw1PgorICAyNzM0NDYzMDEyVSwJLy8gPDUsdSw0LDI+OiBDb3N0IDMgdmV4dDMgPHUsMyw0LDU+LCA8dSw0LDIsNj4KKyAgMjY5ODYzMTIxMlUsCS8vIDw1LHUsNCwzPjogQ29zdCAzIHZleHQzIDwyLDMsNCw1PiwgPHUsNCwzLDU+CisgIDE1NzA0NTg4NDJVLAkvLyA8NSx1LDQsND46IENvc3QgMiB2ZXh0MiA8NCw0LDUsNT4sIDw0LDQsNSw1PgorICAxNTUxOTA0MDU0VSwJLy8gPDUsdSw0LDU+OiBDb3N0IDIgdmV4dDIgPDEsMyw1LHU+LCBSSFMKKyAgMjg0NjI4NjE3MlUsCS8vIDw1LHUsNCw2PjogQ29zdCAzIHZ1enByIFJIUywgPDAsNCwyLDY+CisgIDI2NDYyMTYxNDRVLAkvLyA8NSx1LDQsNz46IENvc3QgMyB2ZXh0MiA8NCw3LDUsdT4sIDw0LDcsNSx1PgorICAxNTUxOTA0Mjk3VSwJLy8gPDUsdSw0LHU+OiBDb3N0IDIgdmV4dDIgPDEsMyw1LHU+LCBSSFMKKyAgMTUwOTk4MjMxMFUsCS8vIDw1LHUsNSwwPjogQ29zdCAyIHZleHQxIDw1LDUsNSw1PiwgTEhTCisgIDI1NjAwNTg1NTVVLAkvLyA8NSx1LDUsMT46IENvc3QgMyB2ZXh0MSA8MSw1LHUsNT4sIDwxLDUsdSw1PgorICAyNjk4OTI2MTk0VSwJLy8gPDUsdSw1LDI+OiBDb3N0IDMgdmV4dDMgPDIsMyx1LDU+LCA8dSw1LDIsMz4KKyAgMjY5ODYzMTI5NVUsCS8vIDw1LHUsNSwzPjogQ29zdCAzIHZleHQzIDwyLDMsNCw1PiwgPHUsNSwzLDc+CisgIDE1MDk5ODU1OTBVLAkvLyA8NSx1LDUsND46IENvc3QgMiB2ZXh0MSA8NSw1LDUsNT4sIFJIUworICAyMjkwMzUzMThVLAkvLyA8NSx1LDUsNT46IENvc3QgMSB2ZHVwMSBSSFMKKyAgMTYxMzM4NzkzMFUsCS8vIDw1LHUsNSw2PjogQ29zdCAyIHZleHQzIDwwLDQsMSw1PiwgUkhTCisgIDE3NzI1NDczODJVLAkvLyA8NSx1LDUsNz46IENvc3QgMiB2dXpwciBSSFMsIFJIUworICAyMjkwMzUzMThVLAkvLyA8NSx1LDUsdT46IENvc3QgMSB2ZHVwMSBSSFMKKyAgMjU2NjAzNzYwNlUsCS8vIDw1LHUsNiwwPjogQ29zdCAzIHZleHQxIDwyLDUsdSw2PiwgTEhTCisgIDI5MjAwNDQzMzRVLAkvLyA8NSx1LDYsMT46IENvc3QgMyB2emlwbCA8NSw2LDcsMD4sIExIUworICAyNTY2MDM5NDQ1VSwJLy8gPDUsdSw2LDI+OiBDb3N0IDMgdmV4dDEgPDIsNSx1LDY+LCA8Miw1LHUsNj4KKyAgMjY4NzEyOTgwOFUsCS8vIDw1LHUsNiwzPjogQ29zdCAzIHZleHQzIDwwLDQsMSw1PiwgPHUsNiwzLDc+CisgIDI1NjYwNDA4ODZVLAkvLyA8NSx1LDYsND46IENvc3QgMyB2ZXh0MSA8Miw1LHUsNj4sIFJIUworICAyOTIwMDQ0Njk4VSwJLy8gPDUsdSw2LDU+OiBDb3N0IDMgdnppcGwgPDUsNiw3LDA+LCBSSFMKKyAgMjg0NjI4OTI2OFUsCS8vIDw1LHUsNiw2PjogQ29zdCAzIHZ1enByIFJIUywgPDQsNiw0LDY+CisgIDI5NzM3ODEzMjBVLAkvLyA8NSx1LDYsNz46IENvc3QgMyB2emlwciA8Myw0LDUsNj4sIFJIUworICAyNjg3MTI5ODUzVSwJLy8gPDUsdSw2LHU+OiBDb3N0IDMgdmV4dDMgPDAsNCwxLDU+LCA8dSw2LHUsNz4KKyAgNDMwNTA2MDg2VSwJLy8gPDUsdSw3LDA+OiBDb3N0IDEgdmV4dDEgUkhTLCBMSFMKKyAgMTQ4NjMzMzExN1UsCS8vIDw1LHUsNywxPjogQ29zdCAyIHZleHQxIDwxLDUsdSw3PiwgPDEsNSx1LDc+CisgIDE1MDQyNDk0NDhVLAkvLyA8NSx1LDcsMj46IENvc3QgMiB2ZXh0MSBSSFMsIDwyLDIsMiwyPgorICAyMDQwOTcxOTMzVSwJLy8gPDUsdSw3LDM+OiBDb3N0IDIgdnRybnIgUkhTLCBMSFMKKyAgNDMwNTA5Mzg0VSwJLy8gPDUsdSw3LDQ+OiBDb3N0IDEgdmV4dDEgUkhTLCBSSFMKKyAgMTUwNDI1MTYwMFUsCS8vIDw1LHUsNyw1PjogQ29zdCAyIHZleHQxIFJIUywgPDUsMSw3LDM+CisgIDExODcwODM3OFUsCS8vIDw1LHUsNyw2PjogQ29zdCAxIHZyZXYgUkhTCisgIDIwNDA5NzQ4ODlVLAkvLyA8NSx1LDcsNz46IENvc3QgMiB2dHJuciBSSFMsIFJIUworICA0MzA1MTE5MThVLAkvLyA8NSx1LDcsdT46IENvc3QgMSB2ZXh0MSBSSFMsIExIUworICA0MzA1MTQyNzhVLAkvLyA8NSx1LHUsMD46IENvc3QgMSB2ZXh0MSBSSFMsIExIUworICAxNTUxOTA2NjA2VSwJLy8gPDUsdSx1LDE+OiBDb3N0IDIgdmV4dDIgPDEsMyw1LHU+LCBMSFMKKyAgMTYxMzM4ODEzM1UsCS8vIDw1LHUsdSwyPjogQ29zdCAyIHZleHQzIDwwLDQsMSw1PiwgTEhTCisgIDE3NzI1NDQ2NjlVLAkvLyA8NSx1LHUsMz46IENvc3QgMiB2dXpwciBSSFMsIExIUworICA0MzA1MTc1NzdVLAkvLyA8NSx1LHUsND46IENvc3QgMSB2ZXh0MSBSSFMsIFJIUworICAyMjkwMzUzMThVLAkvLyA8NSx1LHUsNT46IENvc3QgMSB2ZHVwMSBSSFMKKyAgMTE4NzE2NTcxVSwJLy8gPDUsdSx1LDY+OiBDb3N0IDEgdnJldiBSSFMKKyAgMTc3MjU0NzYyNVUsCS8vIDw1LHUsdSw3PjogQ29zdCAyIHZ1enByIFJIUywgUkhTCisgIDQzMDUyMDExMFUsCS8vIDw1LHUsdSx1PjogQ29zdCAxIHZleHQxIFJIUywgTEhTCisgIDI2ODYwMjU3MjhVLAkvLyA8NiwwLDAsMD46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwwLDAsMCwwPgorICAyNjg2MDI1NzM4VSwJLy8gPDYsMCwwLDE+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8MCwwLDEsMT4KKyAgMjY4NjAyNTc0OFUsCS8vIDw2LDAsMCwyPjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDAsMCwyLDI+CisgIDM3NzkwODQzMjBVLAkvLyA8NiwwLDAsMz46IENvc3QgNCB2ZXh0MyA8Myw0LDUsNj4sIDwwLDAsMyw1PgorICAyNjQyOTAzMzg4VSwJLy8gPDYsMCwwLDQ+OiBDb3N0IDMgdmV4dDIgPDQsMiw2LDA+LCA8MCw0LDIsNj4KKyAgMzY1NzcyMzkzOVUsCS8vIDw2LDAsMCw1PjogQ29zdCA0IHZleHQxIDw1LDYsMCwwPiwgPDUsNiwwLDA+CisgIDM5MjY2NzY1MTRVLAkvLyA8NiwwLDAsNj46IENvc3QgNCB2dXpwciA8NSw2LDcsMD4sIDw3LDAsNSw2PgorICAzOTI2Njc1Nzg2VSwJLy8gPDYsMCwwLDc+OiBDb3N0IDQgdnV6cHIgPDUsNiw3LDA+LCA8NiwwLDUsNz4KKyAgMjY4NjAyNTgwMlUsCS8vIDw2LDAsMCx1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDAsMCx1LDI+CisgIDI1NjYwNzAzNzRVLAkvLyA8NiwwLDEsMD46IENvc3QgMyB2ZXh0MSA8Miw2LDAsMT4sIExIUworICAzNzU5NzY3NjQyVSwJLy8gPDYsMCwxLDE+OiBDb3N0IDQgdmV4dDMgPDAsMiw0LDY+LCA8MCwxLDEsMD4KKyAgMTYxMjI4NDAwNlUsCS8vIDw2LDAsMSwyPjogQ29zdCAyIHZleHQzIDwwLDIsNCw2PiwgTEhTCisgIDI1ODM5ODg3MzhVLAkvLyA8NiwwLDEsMz46IENvc3QgMyB2ZXh0MSA8NSw2LDAsMT4sIDwzLDQsNSw2PgorICAyNTY2MDczNjU0VSwJLy8gPDYsMCwxLDQ+OiBDb3N0IDMgdmV4dDEgPDIsNiwwLDE+LCBSSFMKKyAgMjU4Mzk5MDMwOFUsCS8vIDw2LDAsMSw1PjogQ29zdCAzIHZleHQxIDw1LDYsMCwxPiwgPDUsNiwwLDE+CisgIDI1ODk5NjMwMDVVLAkvLyA8NiwwLDEsNj46IENvc3QgMyB2ZXh0MSA8Niw2LDAsMT4sIDw2LDYsMCwxPgorICAyNTk1OTM1NzAyVSwJLy8gPDYsMCwxLDc+OiBDb3N0IDMgdmV4dDEgPDcsNiwwLDE+LCA8Nyw2LDAsMT4KKyAgMTYxMjI4NDA2MFUsCS8vIDw2LDAsMSx1PjogQ29zdCAyIHZleHQzIDwwLDIsNCw2PiwgTEhTCisgIDI2ODYwMjU4OTJVLAkvLyA8NiwwLDIsMD46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwwLDIsMCwyPgorICAyNjg1ODA0NzIxVSwJLy8gPDYsMCwyLDE+OiBDb3N0IDMgdmV4dDMgPDAsMiwxLDY+LCA8MCwyLDEsNj4KKyAgMzc1OTYyMDI4MlUsCS8vIDw2LDAsMiwyPjogQ29zdCA0IHZleHQzIDwwLDIsMiw2PiwgPDAsMiwyLDY+CisgIDI3MDUzNDI2NThVLAkvLyA8NiwwLDIsMz46IENvc3QgMyB2ZXh0MyA8Myw0LDUsNj4sIDwwLDIsMyw1PgorICAxNjEyMjg0MTA4VSwJLy8gPDYsMCwyLDQ+OiBDb3N0IDIgdmV4dDMgPDAsMiw0LDY+LCA8MCwyLDQsNj4KKyAgMzcwNjAyOTk1NlUsCS8vIDw2LDAsMiw1PjogQ29zdCA0IHZleHQyIDwyLDQsNiwwPiwgPDIsNSw2LDc+CisgIDI2ODYxNzM0MDZVLAkvLyA8NiwwLDIsNj46IENvc3QgMyB2ZXh0MyA8MCwyLDYsNj4sIDwwLDIsNiw2PgorICAzNjUxNzY5MzM4VSwJLy8gPDYsMCwyLDc+OiBDb3N0IDQgdmV4dDEgPDQsNiwwLDI+LCA8NywwLDEsMj4KKyAgMTYxMjU3OTA1NlUsCS8vIDw2LDAsMix1PjogQ29zdCAyIHZleHQzIDwwLDIsdSw2PiwgPDAsMix1LDY+CisgIDM3MDYwMzAyMzBVLAkvLyA8NiwwLDMsMD46IENvc3QgNCB2ZXh0MiA8Miw0LDYsMD4sIDwzLDAsMSwyPgorICAyNzA1MzQyNzIwVSwJLy8gPDYsMCwzLDE+OiBDb3N0IDMgdmV4dDMgPDMsNCw1LDY+LCA8MCwzLDEsND4KKyAgMjcwNTM0MjczMFUsCS8vIDw2LDAsMywyPjogQ29zdCAzIHZleHQzIDwzLDQsNSw2PiwgPDAsMywyLDU+CisgIDM3MDYwMzA0OTJVLAkvLyA8NiwwLDMsMz46IENvc3QgNCB2ZXh0MiA8Miw0LDYsMD4sIDwzLDMsMywzPgorICAyNjQ0ODk2MjU4VSwJLy8gPDYsMCwzLDQ+OiBDb3N0IDMgdmV4dDIgPDQsNSw2LDA+LCA8Myw0LDUsNj4KKyAgMzcxODYzODE1NFUsCS8vIDw2LDAsMyw1PjogQ29zdCA0IHZleHQyIDw0LDUsNiwwPiwgPDMsNSw0LDY+CisgIDM3Mjk5MTg2MTlVLAkvLyA8NiwwLDMsNj46IENvc3QgNCB2ZXh0MiA8Niw0LDYsMD4sIDwzLDYsNCw2PgorICAzOTI2NjcyMzg0VSwJLy8gPDYsMCwzLDc+OiBDb3N0IDQgdnV6cHIgPDUsNiw3LDA+LCA8MSwzLDUsNz4KKyAgMjcwNTM0Mjc4NFUsCS8vIDw2LDAsMyx1PjogQ29zdCAzIHZleHQzIDwzLDQsNSw2PiwgPDAsMyx1LDU+CisgIDI2ODcwNTgyNTBVLAkvLyA8NiwwLDQsMD46IENvc3QgMyB2ZXh0MyA8MCw0LDAsNj4sIDwwLDQsMCw2PgorICAyNjg2MDI2MDY2VSwJLy8gPDYsMCw0LDE+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8MCw0LDEsNT4KKyAgMTYxMzQ2MzkwMFUsCS8vIDw2LDAsNCwyPjogQ29zdCAyIHZleHQzIDwwLDQsMiw2PiwgPDAsNCwyLDY+CisgIDM3NjEwMjEyODVVLAkvLyA8NiwwLDQsMz46IENvc3QgNCB2ZXh0MyA8MCw0LDMsNj4sIDwwLDQsMyw2PgorICAyNjg3MzUzMTk4VSwJLy8gPDYsMCw0LDQ+OiBDb3N0IDMgdmV4dDMgPDAsNCw0LDY+LCA8MCw0LDQsNj4KKyAgMjYzMjI4OTU5MFUsCS8vIDw2LDAsNCw1PjogQ29zdCAzIHZleHQyIDwyLDQsNiwwPiwgUkhTCisgIDI2NDU1NjA3MDRVLAkvLyA8NiwwLDQsNj46IENvc3QgMyB2ZXh0MiA8NCw2LDYsMD4sIDw0LDYsNiwwPgorICAyNjQ2MjI0MzM3VSwJLy8gPDYsMCw0LDc+OiBDb3N0IDMgdmV4dDIgPDQsNyw2LDA+LCA8NCw3LDYsMD4KKyAgMTYxMzkwNjMyMlUsCS8vIDw2LDAsNCx1PjogQ29zdCAyIHZleHQzIDwwLDQsdSw2PiwgPDAsNCx1LDY+CisgIDM2NTE3ODg5MDJVLAkvLyA8NiwwLDUsMD46IENvc3QgNCB2ZXh0MSA8NCw2LDAsNT4sIExIUworICAyNjg3Nzk1NjIwVSwJLy8gPDYsMCw1LDE+OiBDb3N0IDMgdmV4dDMgPDAsNSwxLDY+LCA8MCw1LDEsNj4KKyAgMzc2MTYxMTE4MVUsCS8vIDw2LDAsNSwyPjogQ29zdCA0IHZleHQzIDwwLDUsMiw2PiwgPDAsNSwyLDY+CisgIDM3MjMyODQzMjZVLAkvLyA8NiwwLDUsMz46IENvc3QgNCB2ZXh0MiA8NSwzLDYsMD4sIDw1LDMsNiwwPgorICAyNjQ2MjI0ODM4VSwJLy8gPDYsMCw1LDQ+OiBDb3N0IDMgdmV4dDIgPDQsNyw2LDA+LCA8NSw0LDcsNj4KKyAgMzcxODYzOTYzMFUsCS8vIDw2LDAsNSw1PjogQ29zdCA0IHZleHQyIDw0LDUsNiwwPiwgPDUsNSw2LDY+CisgIDI2NTIxOTY5NjJVLAkvLyA8NiwwLDUsNj46IENvc3QgMyB2ZXh0MiA8NSw3LDYsMD4sIDw1LDYsNywwPgorICAyODUyOTMyOTE4VSwJLy8gPDYsMCw1LDc+OiBDb3N0IDMgdnV6cHIgPDUsNiw3LDA+LCBSSFMKKyAgMjg1MjkzMjkxOVUsCS8vIDw2LDAsNSx1PjogQ29zdCAzIHZ1enByIDw1LDYsNywwPiwgUkhTCisgIDI4NTI5MzM3MzBVLAkvLyA8NiwwLDYsMD46IENvc3QgMyB2dXpwciA8NSw2LDcsMD4sIDw1LDYsNywwPgorICAyOTI1OTg1ODk0VSwJLy8gPDYsMCw2LDE+OiBDb3N0IDMgdnppcGwgPDYsNiw2LDY+LCBMSFMKKyAgMzA2MDIwMzYyMlUsCS8vIDw2LDAsNiwyPjogQ29zdCAzIHZ0cm5sIDw2LDYsNiw2PiwgTEhTCisgIDM3MTg2NDAxNzhVLAkvLyA8NiwwLDYsMz46IENvc3QgNCB2ZXh0MiA8NCw1LDYsMD4sIDw2LDMsNCw1PgorICAyNjU2MTc4ODMyVSwJLy8gPDYsMCw2LDQ+OiBDb3N0IDMgdmV4dDIgPDYsNCw2LDA+LCA8Niw0LDYsMD4KKyAgMzcyNTkzOTM3OFUsCS8vIDw2LDAsNiw1PjogQ29zdCA0IHZleHQyIDw1LDcsNiwwPiwgPDYsNSwwLDc+CisgIDI2NTc1MDYwOThVLAkvLyA8NiwwLDYsNj46IENvc3QgMyB2ZXh0MiA8Niw2LDYsMD4sIDw2LDYsNiwwPgorICAyNjE5MDIwMTEwVSwJLy8gPDYsMCw2LDc+OiBDb3N0IDMgdmV4dDIgPDAsMiw2LDA+LCA8Niw3LDAsMT4KKyAgMjkyNTk4NjQ2MVUsCS8vIDw2LDAsNix1PjogQ29zdCAzIHZ6aXBsIDw2LDYsNiw2PiwgTEhTCisgIDI1NzIwOTE0OTRVLAkvLyA8NiwwLDcsMD46IENvc3QgMyB2ZXh0MSA8Myw2LDAsNz4sIExIUworICAyNTcyMDkyMzEwVSwJLy8gPDYsMCw3LDE+OiBDb3N0IDMgdmV4dDEgPDMsNiwwLDc+LCA8MSwyLDMsMD4KKyAgMjk4MDQ5NTUyNFUsCS8vIDw2LDAsNywyPjogQ29zdCAzIHZ6aXByIFJIUywgPDAsMiwwLDI+CisgIDI1NzIwOTQwNzJVLAkvLyA8NiwwLDcsMz46IENvc3QgMyB2ZXh0MSA8Myw2LDAsNz4sIDwzLDYsMCw3PgorICAyNTcyMDk0Nzc0VSwJLy8gPDYsMCw3LDQ+OiBDb3N0IDMgdmV4dDEgPDMsNiwwLDc+LCBSSFMKKyAgNDA1NDIzODI0MlUsCS8vIDw2LDAsNyw1PjogQ29zdCA0IHZ6aXByIFJIUywgPDEsNCwwLDU+CisgIDM2NDU4Mzc2NTNVLAkvLyA8NiwwLDcsNj46IENvc3QgNCB2ZXh0MSA8Myw2LDAsNz4sIDw2LDAsNywwPgorICA0MDU0MjM5MDU0VSwJLy8gPDYsMCw3LDc+OiBDb3N0IDQgdnppcHIgUkhTLCA8Miw1LDAsNz4KKyAgMjU3MjA5NzMyNlUsCS8vIDw2LDAsNyx1PjogQ29zdCAzIHZleHQxIDwzLDYsMCw3PiwgTEhTCisgIDI2ODYwMjYzNzhVLAkvLyA8NiwwLHUsMD46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwwLHUsMCwyPgorICAyNjg2MDI2Mzg2VSwJLy8gPDYsMCx1LDE+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8MCx1LDEsMT4KKyAgMTYxMjI4NDU3M1UsCS8vIDw2LDAsdSwyPjogQ29zdCAyIHZleHQzIDwwLDIsNCw2PiwgTEhTCisgIDI3MDUzNDMxNDRVLAkvLyA8NiwwLHUsMz46IENvc3QgMyB2ZXh0MyA8Myw0LDUsNj4sIDwwLHUsMyw1PgorICAxNjE2MjY1OTA2VSwJLy8gPDYsMCx1LDQ+OiBDb3N0IDIgdmV4dDMgPDAsdSw0LDY+LCA8MCx1LDQsNj4KKyAgMjYzMjI5MjUwNlUsCS8vIDw2LDAsdSw1PjogQ29zdCAzIHZleHQyIDwyLDQsNiwwPiwgUkhTCisgIDI1OTAwMjAzNTZVLAkvLyA8NiwwLHUsNj46IENvc3QgMyB2ZXh0MSA8Niw2LDAsdT4sIDw2LDYsMCx1PgorICAyODUyOTMzMTYxVSwJLy8gPDYsMCx1LDc+OiBDb3N0IDMgdnV6cHIgPDUsNiw3LDA+LCBSSFMKKyAgMTYxMjI4NDYyN1UsCS8vIDw2LDAsdSx1PjogQ29zdCAyIHZleHQzIDwwLDIsNCw2PiwgTEhTCisgIDI1OTU5OTU3NTBVLAkvLyA8NiwxLDAsMD46IENvc3QgMyB2ZXh0MSA8Nyw2LDEsMD4sIExIUworICAyNjQ2MjI5MDk0VSwJLy8gPDYsMSwwLDE+OiBDb3N0IDMgdmV4dDIgPDQsNyw2LDE+LCBMSFMKKyAgMzY5NDA5MjQ5MlUsCS8vIDw2LDEsMCwyPjogQ29zdCA0IHZleHQyIDwwLDQsNiwxPiwgPDAsMiw0LDY+CisgIDI2ODYwMjY0ODZVLAkvLyA8NiwxLDAsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwxLDAsMywyPgorICAyNTk1OTk5MDMwVSwJLy8gPDYsMSwwLDQ+OiBDb3N0IDMgdmV4dDEgPDcsNiwxLDA+LCBSSFMKKyAgMzc2NzczMDk1MlUsCS8vIDw2LDEsMCw1PjogQ29zdCA0IHZleHQzIDwxLDUsNCw2PiwgPDEsMCw1LDI+CisgIDI1OTYwMDA1OTBVLAkvLyA8NiwxLDAsNj46IENvc3QgMyB2ZXh0MSA8Nyw2LDEsMD4sIDw2LDcsMCwxPgorICAyNTk2MDAxMjQ2VSwJLy8gPDYsMSwwLDc+OiBDb3N0IDMgdmV4dDEgPDcsNiwxLDA+LCA8Nyw2LDEsMD4KKyAgMjY4NjAyNjUzMVUsCS8vIDw2LDEsMCx1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsMCx1LDI+CisgIDM3NjM2MDIyMTlVLAkvLyA8NiwxLDEsMD46IENvc3QgNCB2ZXh0MyA8MCx1LDIsNj4sIDwxLDEsMCwxPgorICAyNjg2MDI2NTQ4VSwJLy8gPDYsMSwxLDE+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8MSwxLDEsMT4KKyAgMzc2NDkyOTM0NlUsCS8vIDw2LDEsMSwyPjogQ29zdCA0IHZleHQzIDwxLDEsMiw2PiwgPDEsMSwyLDY+CisgIDI2ODYwMjY1NjhVLAkvLyA8NiwxLDEsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwxLDEsMywzPgorICAyNjkxMzM0OTk2VSwJLy8gPDYsMSwxLDQ+OiBDb3N0IDMgdmV4dDMgPDEsMSw0LDY+LCA8MSwxLDQsNj4KKyAgMzc2MDg3NDMzMlUsCS8vIDw2LDEsMSw1PjogQ29zdCA0IHZleHQzIDwwLDQsMSw2PiwgPDEsMSw1LDU+CisgIDM3NjUyMjQyOTRVLAkvLyA8NiwxLDEsNj46IENvc3QgNCB2ZXh0MyA8MSwxLDYsNj4sIDwxLDEsNiw2PgorICAzNjY5NzUxMjYzVSwJLy8gPDYsMSwxLDc+OiBDb3N0IDQgdmV4dDEgPDcsNiwxLDE+LCA8Nyw2LDEsMT4KKyAgMjY4NjAyNjYxM1UsCS8vIDw2LDEsMSx1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsMSx1LDM+CisgIDI1NTQyMDgzNThVLAkvLyA8NiwxLDIsMD46IENvc3QgMyB2ZXh0MSA8MCw2LDEsMj4sIExIUworICAzNzYzNjAyMzExVSwJLy8gPDYsMSwyLDE+OiBDb3N0IDQgdmV4dDMgPDAsdSwyLDY+LCA8MSwyLDEsMz4KKyAgMzYzOTg5NTk3MVUsCS8vIDw2LDEsMiwyPjogQ29zdCA0IHZleHQxIDwyLDYsMSwyPiwgPDIsNiwxLDI+CisgIDI2ODYwMjY2NDZVLAkvLyA8NiwxLDIsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwxLDIsMywwPgorICAyNTU0MjExNjM4VSwJLy8gPDYsMSwyLDQ+OiBDb3N0IDMgdmV4dDEgPDAsNiwxLDI+LCBSSFMKKyAgMzc2MDg3NDQxMVUsCS8vIDw2LDEsMiw1PjogQ29zdCA0IHZleHQzIDwwLDQsMSw2PiwgPDEsMiw1LDM+CisgIDI1NTQyMTI4NThVLAkvLyA8NiwxLDIsNj46IENvc3QgMyB2ZXh0MSA8MCw2LDEsMj4sIDw2LDIsNywzPgorICAzODAyOTczMTE0VSwJLy8gPDYsMSwyLDc+OiBDb3N0IDQgdmV4dDMgPDcsNCw1LDY+LCA8MSwyLDcsMD4KKyAgMjY4NjAyNjY5MVUsCS8vIDw2LDEsMix1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsMix1LDA+CisgIDI1NjYxNjA0ODZVLAkvLyA8NiwxLDMsMD46IENvc3QgMyB2ZXh0MSA8Miw2LDEsMz4sIExIUworICAyNjg2MDI2NzEyVSwJLy8gPDYsMSwzLDE+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8MSwzLDEsMz4KKyAgMjY4NjAyNjcyNFUsCS8vIDw2LDEsMywyPjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsMywyLDY+CisgIDM3NTk3Njg1NTJVLAkvLyA8NiwxLDMsMz46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNj4sIDwxLDMsMywxPgorICAyNjkyNjYyMjYyVSwJLy8gPDYsMSwzLDQ+OiBDb3N0IDMgdmV4dDMgPDEsMyw0LDY+LCA8MSwzLDQsNj4KKyAgMjY4NjAyNjc1MlUsCS8vIDw2LDEsMyw1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsMyw1LDc+CisgIDI1OTAwNTMxMjhVLAkvLyA8NiwxLDMsNj46IENvc3QgMyB2ZXh0MSA8Niw2LDEsMz4sIDw2LDYsMSwzPgorICAzNjYzNzk1MTk0VSwJLy8gPDYsMSwzLDc+OiBDb3N0IDQgdmV4dDEgPDYsNiwxLDM+LCA8NywwLDEsMj4KKyAgMjY4NjAyNjc3NVUsCS8vIDw2LDEsMyx1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsMyx1LDM+CisgIDI2NDE1ODcwOTlVLAkvLyA8NiwxLDQsMD46IENvc3QgMyB2ZXh0MiA8NCwwLDYsMT4sIDw0LDAsNiwxPgorICAyNjkzMTA0Njg0VSwJLy8gPDYsMSw0LDE+OiBDb3N0IDMgdmV4dDMgPDEsNCwxLDY+LCA8MSw0LDEsNj4KKyAgMzYzOTkxMjM1N1UsCS8vIDw2LDEsNCwyPjogQ29zdCA0IHZleHQxIDwyLDYsMSw0PiwgPDIsNiwxLDQ+CisgIDI2ODcyMDY0NjJVLAkvLyA8NiwxLDQsMz46IENvc3QgMyB2ZXh0MyA8MCw0LDIsNj4sIDwxLDQsMyw2PgorICAzNjMzOTQxODE0VSwJLy8gPDYsMSw0LDQ+OiBDb3N0IDQgdmV4dDEgPDEsNiwxLDQ+LCBSSFMKKyAgMjY5MzM5OTYzMlUsCS8vIDw2LDEsNCw1PjogQ29zdCAzIHZleHQzIDwxLDQsNSw2PiwgPDEsNCw1LDY+CisgIDM3NjUwNzcwNzVVLAkvLyA8NiwxLDQsNj46IENvc3QgNCB2ZXh0MyA8MSwxLDQsNj4sIDwxLDQsNiwwPgorICAyNjQ2MjMyNTMwVSwJLy8gPDYsMSw0LDc+OiBDb3N0IDMgdmV4dDIgPDQsNyw2LDE+LCA8NCw3LDYsMT4KKyAgMjY4NzIwNjUwN1UsCS8vIDw2LDEsNCx1PjogQ29zdCAzIHZleHQzIDwwLDQsMiw2PiwgPDEsNCx1LDY+CisgIDI2NDc1NTk3OTZVLAkvLyA8NiwxLDUsMD46IENvc3QgMyB2ZXh0MiA8NSwwLDYsMT4sIDw1LDAsNiwxPgorICAzNzY1MDc3MTE4VSwJLy8gPDYsMSw1LDE+OiBDb3N0IDQgdmV4dDMgPDEsMSw0LDY+LCA8MSw1LDEsNz4KKyAgMzc2NzU4Mzg3OFUsCS8vIDw2LDEsNSwyPjogQ29zdCA0IHZleHQzIDwxLDUsMiw2PiwgPDEsNSwyLDY+CisgIDI2ODYwMjY4OTZVLAkvLyA8NiwxLDUsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwxLDUsMyw3PgorICAyNjkzOTg5NTI4VSwJLy8gPDYsMSw1LDQ+OiBDb3N0IDMgdmV4dDMgPDEsNSw0LDY+LCA8MSw1LDQsNj4KKyAgMzc2NzgwNTA4OVUsCS8vIDw2LDEsNSw1PjogQ29zdCA0IHZleHQzIDwxLDUsNSw2PiwgPDEsNSw1LDY+CisgIDI2NTI4Njg3MDZVLAkvLyA8NiwxLDUsNj46IENvc3QgMyB2ZXh0MiA8NSx1LDYsMT4sIDw1LDYsNywwPgorICAzOTA4MjUwOTM0VSwJLy8gPDYsMSw1LDc+OiBDb3N0IDQgdnV6cHIgPDIsNiwwLDE+LCBSSFMKKyAgMjY4NjAyNjk0MVUsCS8vIDw2LDEsNSx1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsNSx1LDc+CisgIDI1NTQyNDExMjZVLAkvLyA8NiwxLDYsMD46IENvc3QgMyB2ZXh0MSA8MCw2LDEsNj4sIExIUworICAzNzYzNjAyNjM5VSwJLy8gPDYsMSw2LDE+OiBDb3N0IDQgdmV4dDMgPDAsdSwyLDY+LCA8MSw2LDEsNz4KKyAgMzc1OTU0NzYwN1UsCS8vIDw2LDEsNiwyPjogQ29zdCA0IHZleHQzIDwwLDIsMSw2PiwgPDEsNiwyLDY+CisgIDMxMTUyMjEwOTRVLAkvLyA8NiwxLDYsMz46IENvc3QgMyB2dHJuciA8NCw2LDQsNj4sIExIUworICAyNTU0MjQ0NDA2VSwJLy8gPDYsMSw2LDQ+OiBDb3N0IDMgdmV4dDEgPDAsNiwxLDY+LCBSSFMKKyAgMzc2MDg3NDczOVUsCS8vIDw2LDEsNiw1PjogQ29zdCA0IHZleHQzIDwwLDQsMSw2PiwgPDEsNiw1LDc+CisgIDI1NTQyNDU5NDRVLAkvLyA8NiwxLDYsNj46IENvc3QgMyB2ZXh0MSA8MCw2LDEsNj4sIDw2LDYsNiw2PgorICAzNzE5OTc1NzU4VSwJLy8gPDYsMSw2LDc+OiBDb3N0IDQgdmV4dDIgPDQsNyw2LDE+LCA8Niw3LDAsMT4KKyAgMzExNTIyMTA5OVUsCS8vIDw2LDEsNix1PjogQ29zdCAzIHZ0cm5yIDw0LDYsNCw2PiwgTEhTCisgIDI1NjAyMjEyODZVLAkvLyA8NiwxLDcsMD46IENvc3QgMyB2ZXh0MSA8MSw2LDEsNz4sIExIUworICAyNTYwMjIyNDE1VSwJLy8gPDYsMSw3LDE+OiBDb3N0IDMgdmV4dDEgPDEsNiwxLDc+LCA8MSw2LDEsNz4KKyAgMjk4MDQ5NzU1OFUsCS8vIDw2LDEsNywyPjogQ29zdCAzIHZ6aXByIFJIUywgPDMsMCwxLDI+CisgIDMxMDMyMTE2MjJVLAkvLyA8NiwxLDcsMz46IENvc3QgMyB2dHJuciA8Miw2LDMsNz4sIExIUworICAyNTYwMjI0NTY2VSwJLy8gPDYsMSw3LDQ+OiBDb3N0IDMgdmV4dDEgPDEsNiwxLDc+LCBSSFMKKyAgMjk4MDQ5NTY5OFUsCS8vIDw2LDEsNyw1PjogQ29zdCAzIHZ6aXByIFJIUywgPDAsNCwxLDU+CisgIDM2MzM5Njc1MjZVLAkvLyA8NiwxLDcsNj46IENvc3QgNCB2ZXh0MSA8MSw2LDEsNz4sIDw2LDEsNywwPgorICA0MDU0MjM3Njg2VSwJLy8gPDYsMSw3LDc+OiBDb3N0IDQgdnppcHIgUkhTLCA8MCw2LDEsNz4KKyAgMjU2MDIyNzExOFUsCS8vIDw2LDEsNyx1PjogQ29zdCAzIHZleHQxIDwxLDYsMSw3PiwgTEhTCisgIDI1NjAyMjk0NzhVLAkvLyA8NiwxLHUsMD46IENvc3QgMyB2ZXh0MSA8MSw2LDEsdT4sIExIUworICAyNjg2MDI3MTE3VSwJLy8gPDYsMSx1LDE+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8MSx1LDEsMz4KKyAgMjY4NjAyNzEyOVUsCS8vIDw2LDEsdSwyPjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsdSwyLDY+CisgIDI2ODYwMjcxMzJVLAkvLyA8NiwxLHUsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwxLHUsMywwPgorICAyNjg3MjA2Nzk1VSwJLy8gPDYsMSx1LDQ+OiBDb3N0IDMgdmV4dDMgPDAsNCwyLDY+LCA8MSx1LDQsNj4KKyAgMjY4NjAyNzE1N1UsCS8vIDw2LDEsdSw1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsdSw1LDc+CisgIDI1OTAwOTQwOTNVLAkvLyA8NiwxLHUsNj46IENvc3QgMyB2ZXh0MSA8Niw2LDEsdT4sIDw2LDYsMSx1PgorICAyNTk2MDY2NzkwVSwJLy8gPDYsMSx1LDc+OiBDb3N0IDMgdmV4dDEgPDcsNiwxLHU+LCA8Nyw2LDEsdT4KKyAgMjY4NjAyNzE3N1UsCS8vIDw2LDEsdSx1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDEsdSx1LDA+CisgIDI2NDY5MDA3MzZVLAkvLyA8NiwyLDAsMD46IENvc3QgMyB2ZXh0MiA8NCx1LDYsMj4sIDwwLDAsMCwwPgorICAxNTczMTU5MDE0VSwJLy8gPDYsMiwwLDE+OiBDb3N0IDIgdmV4dDIgPDQsdSw2LDI+LCBMSFMKKyAgMjY0NjkwMDkwMFUsCS8vIDw2LDIsMCwyPjogQ29zdCAzIHZleHQyIDw0LHUsNiwyPiwgPDAsMiwwLDI+CisgIDM3NTk3NjkwMzdVLAkvLyA8NiwyLDAsMz46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNj4sIDwyLDAsMywwPgorICAyNjQxNTkyNjY4VSwJLy8gPDYsMiwwLDQ+OiBDb3N0IDMgdmV4dDIgPDQsMCw2LDI+LCA8MCw0LDIsNj4KKyAgMzc3OTA4NTc5NFUsCS8vIDw2LDIsMCw1PjogQ29zdCA0IHZleHQzIDwzLDQsNSw2PiwgPDIsMCw1LDM+CisgIDI2ODYwMjcyNDRVLAkvLyA8NiwyLDAsNj46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwyLDAsNiw0PgorICAzNjY5ODE2ODA3VSwJLy8gPDYsMiwwLDc+OiBDb3N0IDQgdmV4dDEgPDcsNiwyLDA+LCA8Nyw2LDIsMD4KKyAgMTU3MzE1OTU4MVUsCS8vIDw2LDIsMCx1PjogQ29zdCAyIHZleHQyIDw0LHUsNiwyPiwgTEhTCisgIDIyMzA1Mjc4OTdVLAkvLyA8NiwyLDEsMD46IENvc3QgMyB2cmV2IDwyLDYsMCwxPgorICAyNjQ2OTAxNTU2VSwJLy8gPDYsMiwxLDE+OiBDb3N0IDMgdmV4dDIgPDQsdSw2LDI+LCA8MSwxLDEsMT4KKyAgMjY0NjkwMTY1NFUsCS8vIDw2LDIsMSwyPjogQ29zdCAzIHZleHQyIDw0LHUsNiwyPiwgPDEsMiwzLDA+CisgIDI4NDcwNDc3ODJVLAkvLyA8NiwyLDEsMz46IENvc3QgMyB2dXpwciA8NCw2LHUsMj4sIExIUworICAzNzcxMDQ5NTE3VSwJLy8gPDYsMiwxLDQ+OiBDb3N0IDQgdmV4dDMgPDIsMSw0LDY+LCA8MiwxLDQsNj4KKyAgMjY0NjkwMTkwNFUsCS8vIDw2LDIsMSw1PjogQ29zdCAzIHZleHQyIDw0LHUsNiwyPiwgPDEsNSwzLDc+CisgIDI2ODYwMjczMjRVLAkvLyA8NiwyLDEsNj46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwyLDEsNiwzPgorICAzNjY5ODI1MDAwVSwJLy8gPDYsMiwxLDc+OiBDb3N0IDQgdmV4dDEgPDcsNiwyLDE+LCA8Nyw2LDIsMT4KKyAgMjIzMTExNzc5M1UsCS8vIDw2LDIsMSx1PjogQ29zdCAzIHZyZXYgPDIsNix1LDE+CisgIDM3NjM2MDMwMjlVLAkvLyA8NiwyLDIsMD46IENvc3QgNCB2ZXh0MyA8MCx1LDIsNj4sIDwyLDIsMCwxPgorICAzNzU5NzY5MTg0VSwJLy8gPDYsMiwyLDE+OiBDb3N0IDQgdmV4dDMgPDAsMiw0LDY+LCA8MiwyLDEsMz4KKyAgMjY4NjAyNzM2OFUsCS8vIDw2LDIsMiwyPjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDIsMiwyLDI+CisgIDI2ODYwMjczNzhVLAkvLyA8NiwyLDIsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwyLDIsMywzPgorICAyNjk3OTcxMzI2VSwJLy8gPDYsMiwyLDQ+OiBDb3N0IDMgdmV4dDMgPDIsMiw0LDY+LCA8MiwyLDQsNj4KKyAgMzc1OTc2OTIyNFUsCS8vIDw2LDIsMiw1PjogQ29zdCA0IHZleHQzIDwwLDIsNCw2PiwgPDIsMiw1LDc+CisgIDI2OTgxMTg4MDBVLAkvLyA8NiwyLDIsNj46IENvc3QgMyB2ZXh0MyA8MiwyLDYsNj4sIDwyLDIsNiw2PgorICAzOTIwNzk0MDkyVSwJLy8gPDYsMiwyLDc+OiBDb3N0IDQgdnV6cHIgPDQsNix1LDI+LCA8NiwyLDUsNz4KKyAgMjY4NjAyNzQyM1UsCS8vIDw2LDIsMix1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDIsMix1LDM+CisgIDI2ODYwMjc0MzBVLAkvLyA8NiwyLDMsMD46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwyLDMsMCwxPgorICAzNzU5NzY5MjYyVSwJLy8gPDYsMiwzLDE+OiBDb3N0IDQgdmV4dDMgPDAsMiw0LDY+LCA8MiwzLDEsMD4KKyAgMjY5ODQ4NzQ4NVUsCS8vIDw2LDIsMywyPjogQ29zdCAzIHZleHQzIDwyLDMsMiw2PiwgPDIsMywyLDY+CisgIDI3MDUzNDQxOTZVLAkvLyA8NiwyLDMsMz46IENvc3QgMyB2ZXh0MyA8Myw0LDUsNj4sIDwyLDMsMyw0PgorICAyNjg2MDI3NDcwVSwJLy8gPDYsMiwzLDQ+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8MiwzLDQsNT4KKyAgMjY5ODcwODY5NlUsCS8vIDw2LDIsMyw1PjogQ29zdCAzIHZleHQzIDwyLDMsNSw2PiwgPDIsMyw1LDY+CisgIDI3MjQ2NjA5NjFVLAkvLyA8NiwyLDMsNj46IENvc3QgMyB2ZXh0MyA8Niw2LDYsNj4sIDwyLDMsNiw2PgorICAyNzI5MjMyMTA0VSwJLy8gPDYsMiwzLDc+OiBDb3N0IDMgdmV4dDMgPDcsNCw1LDY+LCA8MiwzLDcsND4KKyAgMjY4NjAyNzUwMlUsCS8vIDw2LDIsMyx1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDIsMyx1LDE+CisgIDE1Njc4NTM0NjhVLAkvLyA8NiwyLDQsMD46IENvc3QgMiB2ZXh0MiA8NCwwLDYsMj4sIDw0LDAsNiwyPgorICAzNzU5NzY5MzUxVSwJLy8gPDYsMiw0LDE+OiBDb3N0IDQgdmV4dDMgPDAsMiw0LDY+LCA8Miw0LDEsdT4KKyAgMjY5OTE1MTExOFUsCS8vIDw2LDIsNCwyPjogQ29zdCAzIHZleHQzIDwyLDQsMiw2PiwgPDIsNCwyLDY+CisgIDI2ODYwMjc1NDNVLAkvLyA8NiwyLDQsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwyLDQsMyw2PgorICAyNjk5Mjk4NTkyVSwJLy8gPDYsMiw0LDQ+OiBDb3N0IDMgdmV4dDMgPDIsNCw0LDY+LCA8Miw0LDQsNj4KKyAgMTU3MzE2MjI5NFUsCS8vIDw2LDIsNCw1PjogQ29zdCAyIHZleHQyIDw0LHUsNiwyPiwgUkhTCisgIDI2ODYwMjc1NjRVLAkvLyA8NiwyLDQsNj46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwyLDQsNiwwPgorICAzNzE5OTgyNTQ3VSwJLy8gPDYsMiw0LDc+OiBDb3N0IDQgdmV4dDIgPDQsNyw2LDI+LCA8NCw3LDYsMj4KKyAgMTU3MzE2MjUzMlUsCS8vIDw2LDIsNCx1PjogQ29zdCAyIHZleHQyIDw0LHUsNiwyPiwgPDQsdSw2LDI+CisgIDM3NzkwODYxNTRVLAkvLyA8NiwyLDUsMD46IENvc3QgNCB2ZXh0MyA8Myw0LDUsNj4sIDwyLDUsMCwzPgorICAyNjQ2OTA0NTI4VSwJLy8gPDYsMiw1LDE+OiBDb3N0IDMgdmV4dDIgPDQsdSw2LDI+LCA8NSwxLDcsMz4KKyAgMzc1OTc2OTQ0MFUsCS8vIDw2LDIsNSwyPjogQ29zdCA0IHZleHQzIDwwLDIsNCw2PiwgPDIsNSwyLDc+CisgIDI2OTk4ODg0ODhVLAkvLyA8NiwyLDUsMz46IENvc3QgMyB2ZXh0MyA8Miw1LDMsNj4sIDwyLDUsMyw2PgorICAyMjMwODU1NjE3VSwJLy8gPDYsMiw1LDQ+OiBDb3N0IDMgdnJldiA8Miw2LDQsNT4KKyAgMjY0NjkwNDgzNlUsCS8vIDw2LDIsNSw1PjogQ29zdCAzIHZleHQyIDw0LHUsNiwyPiwgPDUsNSw1LDU+CisgIDI2NDY5MDQ5MzBVLAkvLyA8NiwyLDUsNj46IENvc3QgMyB2ZXh0MiA8NCx1LDYsMj4sIDw1LDYsNywwPgorICAyODQ3MDUxMDYyVSwJLy8gPDYsMiw1LDc+OiBDb3N0IDMgdnV6cHIgPDQsNix1LDI+LCBSSFMKKyAgMjcwMDI1NzE3M1UsCS8vIDw2LDIsNSx1PjogQ29zdCAzIHZleHQzIDwyLDUsdSw2PiwgPDIsNSx1LDY+CisgIDI2ODcyMDczMjFVLAkvLyA8NiwyLDYsMD46IENvc3QgMyB2ZXh0MyA8MCw0LDIsNj4sIDwyLDYsMCwxPgorICAyNjg2MDI3Njg0VSwJLy8gPDYsMiw2LDE+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8Miw2LDEsMz4KKyAgMjU2NjI2MDY1NlUsCS8vIDw2LDIsNiwyPjogQ29zdCAzIHZleHQxIDwyLDYsMiw2PiwgPDIsNiwyLDY+CisgIDI2ODU4MDY1MjJVLAkvLyA8NiwyLDYsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDEsNj4sIDwyLDYsMyw3PgorICAyNjg3MjA3MzYxVSwJLy8gPDYsMiw2LDQ+OiBDb3N0IDMgdmV4dDMgPDAsNCwyLDY+LCA8Miw2LDQsNT4KKyAgMjY4NjAyNzcyNFUsCS8vIDw2LDIsNiw1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDIsNiw1LDc+CisgIDI2NDY5MDU2NTZVLAkvLyA8NiwyLDYsNj46IENvc3QgMyB2ZXh0MiA8NCx1LDYsMj4sIDw2LDYsNiw2PgorICAyNjQ2OTA1Njc4VSwJLy8gPDYsMiw2LDc+OiBDb3N0IDMgdmV4dDIgPDQsdSw2LDI+LCA8Niw3LDAsMT4KKyAgMjY4NjAyNzc1MVUsCS8vIDw2LDIsNix1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDIsNix1LDc+CisgIDI1NTQzMjMwNDZVLAkvLyA8NiwyLDcsMD46IENvc3QgMyB2ZXh0MSA8MCw2LDIsNz4sIExIUworICAyNTcyMjM5NjA2VSwJLy8gPDYsMiw3LDE+OiBDb3N0IDMgdmV4dDEgPDMsNiwyLDc+LCA8MSwwLDMsMj4KKyAgMjU2NjI2ODg0OVUsCS8vIDw2LDIsNywyPjogQ29zdCAzIHZleHQxIDwyLDYsMiw3PiwgPDIsNiwyLDc+CisgIDE5MDY3NTM2MzhVLAkvLyA8NiwyLDcsMz46IENvc3QgMiB2emlwciBSSFMsIExIUworICAyNTU0MzI2MzI2VSwJLy8gPDYsMiw3LDQ+OiBDb3N0IDMgdmV4dDEgPDAsNiwyLDc+LCBSSFMKKyAgMzMwNDY4NzU2NFUsCS8vIDw2LDIsNyw1PjogQ29zdCA0IHZyZXYgPDIsNiw1LDc+CisgIDI5ODA0OTU3MDhVLAkvLyA8NiwyLDcsNj46IENvc3QgMyB2emlwciBSSFMsIDwwLDQsMiw2PgorICAyNjQ2OTA2NDc2VSwJLy8gPDYsMiw3LDc+OiBDb3N0IDMgdmV4dDIgPDQsdSw2LDI+LCA8Nyw3LDcsNz4KKyAgMTkwNjc1MzY0M1UsCS8vIDw2LDIsNyx1PjogQ29zdCAyIHZ6aXByIFJIUywgTEhTCisgIDE1OTE3NDQyNTZVLAkvLyA8NiwyLHUsMD46IENvc3QgMiB2ZXh0MiA8dSwwLDYsMj4sIDx1LDAsNiwyPgorICAxNTczMTY0ODQ2VSwJLy8gPDYsMix1LDE+OiBDb3N0IDIgdmV4dDIgPDQsdSw2LDI+LCBMSFMKKyAgMjcwMTgwNTY1MFUsCS8vIDw2LDIsdSwyPjogQ29zdCAzIHZleHQzIDwyLHUsMiw2PiwgPDIsdSwyLDY+CisgIDE5MDY3NjE4MzBVLAkvLyA8NiwyLHUsMz46IENvc3QgMiB2emlwciBSSFMsIExIUworICAyNjg2MDI3ODc1VSwJLy8gPDYsMix1LDQ+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8Mix1LDQsNT4KKyAgMTU3MzE2NTIxMFUsCS8vIDw2LDIsdSw1PjogQ29zdCAyIHZleHQyIDw0LHUsNiwyPiwgUkhTCisgIDI2ODYzMjI4MDBVLAkvLyA8NiwyLHUsNj46IENvc3QgMyB2ZXh0MyA8MCwyLHUsNj4sIDwyLHUsNiwwPgorICAyODQ3MDUxMzA1VSwJLy8gPDYsMix1LDc+OiBDb3N0IDMgdnV6cHIgPDQsNix1LDI+LCBSSFMKKyAgMTkwNjc2MTgzNVUsCS8vIDw2LDIsdSx1PjogQ29zdCAyIHZ6aXByIFJIUywgTEhTCisgIDM3NTk3Njk3MzlVLAkvLyA8NiwzLDAsMD46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNj4sIDwzLDAsMCwwPgorICAyNjg2MDI3OTI2VSwJLy8gPDYsMywwLDE+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8MywwLDEsMj4KKyAgMjY4NjAyNzkzN1UsCS8vIDw2LDMsMCwyPjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDMsMCwyLDQ+CisgIDM2NDAwMjcyODZVLAkvLyA8NiwzLDAsMz46IENvc3QgNCB2ZXh0MSA8Miw2LDMsMD4sIDwzLDAsMSwyPgorICAyNjg3MjA3NjAxVSwJLy8gPDYsMywwLDQ+OiBDb3N0IDMgdmV4dDMgPDAsNCwyLDY+LCA8MywwLDQsMj4KKyAgMjcwNTM0NDY5OFUsCS8vIDw2LDMsMCw1PjogQ29zdCAzIHZleHQzIDwzLDQsNSw2PiwgPDMsMCw1LDI+CisgIDM2NjM5MTc4NDdVLAkvLyA8NiwzLDAsNj46IENvc3QgNCB2ZXh0MSA8Niw2LDMsMD4sIDw2LDYsMywwPgorICAyMjM3MDA4NTYwVSwJLy8gPDYsMywwLDc+OiBDb3N0IDMgdnJldiA8Myw2LDcsMD4KKyAgMjY4NjAyNzk4OVUsCS8vIDw2LDMsMCx1PjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDMsMCx1LDI+CisgIDM3NTk3Njk4MjNVLAkvLyA8NiwzLDEsMD46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNj4sIDwzLDEsMCwzPgorICAzNzU5NzY5ODMwVSwJLy8gPDYsMywxLDE+OiBDb3N0IDQgdmV4dDMgPDAsMiw0LDY+LCA8MywxLDEsMT4KKyAgMzc1OTc2OTg0MVUsCS8vIDw2LDMsMSwyPjogQ29zdCA0IHZleHQzIDwwLDIsNCw2PiwgPDMsMSwyLDM+CisgIDM3NTk3Njk4NDhVLAkvLyA8NiwzLDEsMz46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNj4sIDwzLDEsMywxPgorICAyNzAzMjgwMzkwVSwJLy8gPDYsMywxLDQ+OiBDb3N0IDMgdmV4dDMgPDMsMSw0LDY+LCA8MywxLDQsNj4KKyAgMzc1OTc2OTg2OFUsCS8vIDw2LDMsMSw1PjogQ29zdCA0IHZleHQzIDwwLDIsNCw2PiwgPDMsMSw1LDM+CisgIDM3MDQwNjMxOTRVLAkvLyA8NiwzLDEsNj46IENvc3QgNCB2ZXh0MiA8MiwxLDYsMz4sIDwxLDYsMywwPgorICAzNzY3NzMyNTEwVSwJLy8gPDYsMywxLDc+OiBDb3N0IDQgdmV4dDMgPDEsNSw0LDY+LCA8MywxLDcsMz4KKyAgMjcwMzI4MDM5MFUsCS8vIDw2LDMsMSx1PjogQ29zdCAzIHZleHQzIDwzLDEsNCw2PiwgPDMsMSw0LDY+CisgIDM3MDQwNjM0NjhVLAkvLyA8NiwzLDIsMD46IENvc3QgNCB2ZXh0MiA8MiwxLDYsMz4sIDwyLDAsNiw0PgorICAyNjMwMzIxNzI0VSwJLy8gPDYsMywyLDE+OiBDb3N0IDMgdmV4dDIgPDIsMSw2LDM+LCA8MiwxLDYsMz4KKyAgMzc1OTc2OTkyMVUsCS8vIDw2LDMsMiwyPjogQ29zdCA0IHZleHQzIDwwLDIsNCw2PiwgPDMsMiwyLDI+CisgIDM3NTk3Njk5MjhVLAkvLyA8NiwzLDIsMz46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNj4sIDwzLDIsMywwPgorICAzNzA0MDYzNzY3VSwJLy8gPDYsMywyLDQ+OiBDb3N0IDQgdmV4dDIgPDIsMSw2LDM+LCA8Miw0LDMsNj4KKyAgMzcwNDA2Mzg3NlUsCS8vIDw2LDMsMiw1PjogQ29zdCA0IHZleHQyIDwyLDEsNiwzPiwgPDIsNSw2LDc+CisgIDI2MzY5NTc2MjZVLAkvLyA8NiwzLDIsNj46IENvc3QgMyB2ZXh0MiA8MywyLDYsMz4sIDwyLDYsMyw3PgorICAzNzc3OTA3MDU4VSwJLy8gPDYsMywyLDc+OiBDb3N0IDQgdmV4dDMgPDMsMiw3LDY+LCA8MywyLDcsNj4KKyAgMjYzMDMyMTcyNFUsCS8vIDw2LDMsMix1PjogQ29zdCAzIHZleHQyIDwyLDEsNiwzPiwgPDIsMSw2LDM+CisgIDM3NTk3Njk5ODNVLAkvLyA8NiwzLDMsMD46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNj4sIDwzLDMsMCwxPgorICAzNzEwMDM2MjQ1VSwJLy8gPDYsMywzLDE+OiBDb3N0IDQgdmV4dDIgPDMsMSw2LDM+LCA8MywxLDYsMz4KKyAgMjYzNjk1ODA1NFUsCS8vIDw2LDMsMywyPjogQ29zdCAzIHZleHQyIDwzLDIsNiwzPiwgPDMsMiw2LDM+CisgIDI2ODYwMjgxODhVLAkvLyA8NiwzLDMsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDwzLDMsMywzPgorICAyNzA0NjA3NjU2VSwJLy8gPDYsMywzLDQ+OiBDb3N0IDMgdmV4dDMgPDMsMyw0LDY+LCA8MywzLDQsNj4KKyAgMzc3MzA0MTA3MlUsCS8vIDw2LDMsMyw1PjogQ29zdCA0IHZleHQzIDwyLDQsNCw2PiwgPDMsMyw1LDU+CisgIDM3MTEzNjM3MzFVLAkvLyA8NiwzLDMsNj46IENvc3QgNCB2ZXh0MiA8MywzLDYsMz4sIDwzLDYsMyw3PgorICAzNzY3NzMyNjc2VSwJLy8gPDYsMywzLDc+OiBDb3N0IDQgdmV4dDMgPDEsNSw0LDY+LCA8MywzLDcsNz4KKyAgMjcwNzk5OTE3OVUsCS8vIDw2LDMsMyx1PjogQ29zdCAzIHZleHQzIDwzLHUsNSw2PiwgPDMsMyx1LDU+CisgIDI1ODQyMzIwMzhVLAkvLyA8NiwzLDQsMD46IENvc3QgMyB2ZXh0MSA8NSw2LDMsND4sIExIUworICAyNjQyMjY3MTE4VSwJLy8gPDYsMyw0LDE+OiBDb3N0IDMgdmV4dDIgPDQsMSw2LDM+LCA8NCwxLDYsMz4KKyAgMjY0MjkzMDc1MVUsCS8vIDw2LDMsNCwyPjogQ29zdCAzIHZleHQyIDw0LDIsNiwzPiwgPDQsMiw2LDM+CisgIDI3MDUxOTc1NTJVLAkvLyA8NiwzLDQsMz46IENvc3QgMyB2ZXh0MyA8Myw0LDMsNj4sIDwzLDQsMyw2PgorICAyNTg0MjM1MzE4VSwJLy8gPDYsMyw0LDQ+OiBDb3N0IDMgdmV4dDEgPDUsNiwzLDQ+LCBSSFMKKyAgMTYzMTYwMzIwMlUsCS8vIDw2LDMsNCw1PjogQ29zdCAyIHZleHQzIDwzLDQsNSw2PiwgPDMsNCw1LDY+CisgIDI2NTQyMTE0NDRVLAkvLyA8NiwzLDQsNj46IENvc3QgMyB2ZXh0MiA8NiwxLDYsMz4sIDw0LDYsNCw2PgorICAyMjM3MDQxMzMyVSwJLy8gPDYsMyw0LDc+OiBDb3N0IDMgdnJldiA8Myw2LDcsND4KKyAgMTYzMTgyNDQxM1UsCS8vIDw2LDMsNCx1PjogQ29zdCAyIHZleHQzIDwzLDQsdSw2PiwgPDMsNCx1LDY+CisgIDM2NDAwNjYxNTBVLAkvLyA8NiwzLDUsMD46IENvc3QgNCB2ZXh0MSA8Miw2LDMsNT4sIExIUworICAzNzcyNzQ2Mjg4VSwJLy8gPDYsMyw1LDE+OiBDb3N0IDQgdmV4dDMgPDIsNCwwLDY+LCA8Myw1LDEsNz4KKyAgMzY0MDA2Nzc5MFUsCS8vIDw2LDMsNSwyPjogQ29zdCA0IHZleHQxIDwyLDYsMyw1PiwgPDIsMyw0LDU+CisgIDM3NzMwNDEyMTZVLAkvLyA8NiwzLDUsMz46IENvc3QgNCB2ZXh0MyA8Miw0LDQsNj4sIDwzLDUsMyw1PgorICAyNzA1OTM0OTIyVSwJLy8gPDYsMyw1LDQ+OiBDb3N0IDMgdmV4dDMgPDMsNSw0LDY+LCA8Myw1LDQsNj4KKyAgMzc3MzA0MTIzNlUsCS8vIDw2LDMsNSw1PjogQ29zdCA0IHZleHQzIDwyLDQsNCw2PiwgPDMsNSw1LDc+CisgIDM3NzkwODY5NDBVLAkvLyA8NiwzLDUsNj46IENvc3QgNCB2ZXh0MyA8Myw0LDUsNj4sIDwzLDUsNiw2PgorICAzNzY3NzMyODMxVSwJLy8gPDYsMyw1LDc+OiBDb3N0IDQgdmV4dDMgPDEsNSw0LDY+LCA8Myw1LDcsMD4KKyAgMjcwNjIyOTg3MFUsCS8vIDw2LDMsNSx1PjogQ29zdCAzIHZleHQzIDwzLDUsdSw2PiwgPDMsNSx1LDY+CisgIDI2MDIxNjQzMjZVLAkvLyA8NiwzLDYsMD46IENvc3QgMyB2ZXh0MSA8dSw2LDMsNj4sIExIUworICAyNjU0MjEyNTEyVSwJLy8gPDYsMyw2LDE+OiBDb3N0IDMgdmV4dDIgPDYsMSw2LDM+LCA8NiwxLDYsMz4KKyAgMjU2NjMzNDM5M1UsCS8vIDw2LDMsNiwyPjogQ29zdCAzIHZleHQxIDwyLDYsMyw2PiwgPDIsNiwzLDY+CisgIDM3MDQwNjY1ODhVLAkvLyA8NiwzLDYsMz46IENvc3QgNCB2ZXh0MiA8MiwxLDYsMz4sIDw2LDMsMiwxPgorICAyNjAyMTY3NTI0VSwJLy8gPDYsMyw2LDQ+OiBDb3N0IDMgdmV4dDEgPHUsNiwzLDY+LCA8NCw0LDYsNj4KKyAgMzcxMDcwMjMyMVUsCS8vIDw2LDMsNiw1PjogQ29zdCA0IHZleHQyIDwzLDIsNiwzPiwgPDYsNSw3LDc+CisgIDI3MjQ2NjE5MzNVLAkvLyA8NiwzLDYsNj46IENvc3QgMyB2ZXh0MyA8Niw2LDYsNj4sIDwzLDYsNiw2PgorICAzNzEwNzAyNDY1VSwJLy8gPDYsMyw2LDc+OiBDb3N0IDQgdmV4dDIgPDMsMiw2LDM+LCA8Niw3LDUsNz4KKyAgMjYwMjE3MDE1OFUsCS8vIDw2LDMsNix1PjogQ29zdCAzIHZleHQxIDx1LDYsMyw2PiwgTEhTCisgIDE0OTI1OTg4ODZVLAkvLyA8NiwzLDcsMD46IENvc3QgMiB2ZXh0MSA8Miw2LDMsNz4sIExIUworICAyNTYwMzY5ODg5VSwJLy8gPDYsMyw3LDE+OiBDb3N0IDMgdmV4dDEgPDEsNiwzLDc+LCA8MSw2LDMsNz4KKyAgMTQ5MjYwMDc2MlUsCS8vIDw2LDMsNywyPjogQ29zdCAyIHZleHQxIDwyLDYsMyw3PiwgPDIsNiwzLDc+CisgIDI1NjYzNDI4MDZVLAkvLyA8NiwzLDcsMz46IENvc3QgMyB2ZXh0MSA8Miw2LDMsNz4sIDwzLDAsMSwyPgorICAxNDkyNjAyMTY2VSwJLy8gPDYsMyw3LDQ+OiBDb3N0IDIgdmV4dDEgPDIsNiwzLDc+LCBSSFMKKyAgMjYwMjE3NjIwOFUsCS8vIDw2LDMsNyw1PjogQ29zdCAzIHZleHQxIDx1LDYsMyw3PiwgPDUsMSw3LDM+CisgIDI1NjYzNDUyMTBVLAkvLyA8NiwzLDcsNj46IENvc3QgMyB2ZXh0MSA8Miw2LDMsNz4sIDw2LDIsNywzPgorICAyOTgwNDk2NTI4VSwJLy8gPDYsMyw3LDc+OiBDb3N0IDMgdnppcHIgUkhTLCA8MSw1LDMsNz4KKyAgMTQ5MjYwNDcxOFUsCS8vIDw2LDMsNyx1PjogQ29zdCAyIHZleHQxIDwyLDYsMyw3PiwgTEhTCisgIDE0OTI2MDcwNzhVLAkvLyA8NiwzLHUsMD46IENvc3QgMiB2ZXh0MSA8Miw2LDMsdT4sIExIUworICAyNjg2MDI4NTc0VSwJLy8gPDYsMyx1LDE+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8Myx1LDEsMj4KKyAgMTQ5MjYwODk1NVUsCS8vIDw2LDMsdSwyPjogQ29zdCAyIHZleHQxIDwyLDYsMyx1PiwgPDIsNiwzLHU+CisgIDI1NjYzNTA5OThVLAkvLyA8NiwzLHUsMz46IENvc3QgMyB2ZXh0MSA8Miw2LDMsdT4sIDwzLDAsMSwyPgorICAxNDkyNjEwMzU4VSwJLy8gPDYsMyx1LDQ+OiBDb3N0IDIgdmV4dDEgPDIsNiwzLHU+LCBSSFMKKyAgMTYzNDI1NzczNFUsCS8vIDw2LDMsdSw1PjogQ29zdCAyIHZleHQzIDwzLHUsNSw2PiwgPDMsdSw1LDY+CisgIDI1NjYzNTM0ODlVLAkvLyA8NiwzLHUsNj46IENvc3QgMyB2ZXh0MSA8Miw2LDMsdT4sIDw2LDMsdSwwPgorICAyOTgwNTA0NzIwVSwJLy8gPDYsMyx1LDc+OiBDb3N0IDMgdnppcHIgUkhTLCA8MSw1LDMsNz4KKyAgMTQ5MjYxMjkxMFUsCS8vIDw2LDMsdSx1PjogQ29zdCAyIHZleHQxIDwyLDYsMyx1PiwgTEhTCisgIDM3MDM0MDY1OTJVLAkvLyA8Niw0LDAsMD46IENvc3QgNCB2ZXh0MiA8MiwwLDYsND4sIDwwLDAsMCwwPgorICAyNjI5NjY0ODcwVSwJLy8gPDYsNCwwLDE+OiBDb3N0IDMgdmV4dDIgPDIsMCw2LDQ+LCBMSFMKKyAgMjYyOTY2NDk3MlUsCS8vIDw2LDQsMCwyPjogQ29zdCAzIHZleHQyIDwyLDAsNiw0PiwgPDAsMiw0LDY+CisgIDM3NzkwODcyMzJVLAkvLyA8Niw0LDAsMz46IENvc3QgNCB2ZXh0MyA8Myw0LDUsNj4sIDw0LDAsMywxPgorICAyNjQyOTM2MTU2VSwJLy8gPDYsNCwwLDQ+OiBDb3N0IDMgdmV4dDIgPDQsMiw2LDQ+LCA8MCw0LDIsNj4KKyAgMjcxMjU3MDc3MFUsCS8vIDw2LDQsMCw1PjogQ29zdCAzIHZleHQzIDw0LDYsNCw2PiwgPDQsMCw1LDE+CisgIDI2ODcyMDgzNDhVLAkvLyA8Niw0LDAsNj46IENvc3QgMyB2ZXh0MyA8MCw0LDIsNj4sIDw0LDAsNiwyPgorICAzMzE2NzIzMDgxVSwJLy8gPDYsNCwwLDc+OiBDb3N0IDQgdnJldiA8NCw2LDcsMD4KKyAgMjYyOTY2NTQzN1UsCS8vIDw2LDQsMCx1PjogQ29zdCAzIHZleHQyIDwyLDAsNiw0PiwgTEhTCisgIDIyNDI0NzMyOTFVLAkvLyA8Niw0LDEsMD46IENvc3QgMyB2cmV2IDw0LDYsMCwxPgorICAzNzAwMDg5NjUyVSwJLy8gPDYsNCwxLDE+OiBDb3N0IDQgdmV4dDIgPDEsNCw2LDQ+LCA8MSwxLDEsMT4KKyAgMzcwMzQwNzUxMFUsCS8vIDw2LDQsMSwyPjogQ29zdCA0IHZleHQyIDwyLDAsNiw0PiwgPDEsMiwzLDA+CisgIDI4NTI5NjI0MDZVLAkvLyA8Niw0LDEsMz46IENvc3QgMyB2dXpwciA8NSw2LDcsND4sIExIUworICAzNjI4MTY2NDU0VSwJLy8gPDYsNCwxLDQ+OiBDb3N0IDQgdmV4dDEgPDAsNiw0LDE+LCBSSFMKKyAgMzc2MDg3NjUxNFUsCS8vIDw2LDQsMSw1PjogQ29zdCA0IHZleHQzIDwwLDQsMSw2PiwgPDQsMSw1LDA+CisgIDI2ODcyMDg0MzBVLAkvLyA8Niw0LDEsNj46IENvc3QgMyB2ZXh0MyA8MCw0LDIsNj4sIDw0LDEsNiwzPgorICAzMzE2NzMxMjc0VSwJLy8gPDYsNCwxLDc+OiBDb3N0IDQgdnJldiA8NCw2LDcsMT4KKyAgMjI0MzA2MzE4N1UsCS8vIDw2LDQsMSx1PjogQ29zdCAzIHZyZXYgPDQsNix1LDE+CisgIDI2Mjk2NjYyODRVLAkvLyA8Niw0LDIsMD46IENvc3QgMyB2ZXh0MiA8MiwwLDYsND4sIDwyLDAsNiw0PgorICAzNzAzNDA4MTg4VSwJLy8gPDYsNCwyLDE+OiBDb3N0IDQgdmV4dDIgPDIsMCw2LDQ+LCA8MiwxLDYsMz4KKyAgMzcwMzQwODIzMlUsCS8vIDw2LDQsMiwyPjogQ29zdCA0IHZleHQyIDwyLDAsNiw0PiwgPDIsMiwyLDI+CisgIDM3MDM0MDgyOTRVLAkvLyA8Niw0LDIsMz46IENvc3QgNCB2ZXh0MiA8MiwwLDYsND4sIDwyLDMsMCwxPgorICAyNjMyMzIwODE2VSwJLy8gPDYsNCwyLDQ+OiBDb3N0IDMgdmV4dDIgPDIsNCw2LDQ+LCA8Miw0LDYsND4KKyAgMjkyMzM4NDExOFUsCS8vIDw2LDQsMiw1PjogQ29zdCAzIHZ6aXBsIDw2LDIsNywzPiwgUkhTCisgIDI2ODcyMDg1MDhVLAkvLyA8Niw0LDIsNj46IENvc3QgMyB2ZXh0MyA8MCw0LDIsNj4sIDw0LDIsNiwwPgorICAzNzYwOTUwMzQxVSwJLy8gPDYsNCwyLDc+OiBDb3N0IDQgdmV4dDMgPDAsNCwyLDY+LCA8NCwyLDcsMD4KKyAgMjYzNDk3NTM0OFUsCS8vIDw2LDQsMix1PjogQ29zdCAzIHZleHQyIDwyLHUsNiw0PiwgPDIsdSw2LDQ+CisgIDM3MDM0MDg3OTBVLAkvLyA8Niw0LDMsMD46IENvc3QgNCB2ZXh0MiA8MiwwLDYsND4sIDwzLDAsMSwyPgorICAzMzE2MzA1MjM4VSwJLy8gPDYsNCwzLDE+OiBDb3N0IDQgdnJldiA8NCw2LDEsMz4KKyAgMzcwMzQwODk0N1UsCS8vIDw2LDQsMywyPjogQ29zdCA0IHZleHQyIDwyLDAsNiw0PiwgPDMsMiwwLDY+CisgIDM3MDM0MDkwNTJVLAkvLyA8Niw0LDMsMz46IENvc3QgNCB2ZXh0MiA8MiwwLDYsND4sIDwzLDMsMywzPgorICAyNjQ0OTI5MDI2VSwJLy8gPDYsNCwzLDQ+OiBDb3N0IDMgdmV4dDIgPDQsNSw2LDQ+LCA8Myw0LDUsNj4KKyAgMzcxODY3MDkyMlUsCS8vIDw2LDQsMyw1PjogQ29zdCA0IHZleHQyIDw0LDUsNiw0PiwgPDMsNSw0LDY+CisgIDI3MDUzNDU2ODJVLAkvLyA8Niw0LDMsNj46IENvc3QgMyB2ZXh0MyA8Myw0LDUsNj4sIDw0LDMsNiw1PgorICAzOTI2NzA1MTUyVSwJLy8gPDYsNCwzLDc+OiBDb3N0IDQgdnV6cHIgPDUsNiw3LDQ+LCA8MSwzLDUsNz4KKyAgMjY2ODgxNzIyMlUsCS8vIDw2LDQsMyx1PjogQ29zdCAzIHZleHQyIDx1LDUsNiw0PiwgPDMsdSw1LDY+CisgIDI1OTAyNzc3MzRVLAkvLyA8Niw0LDQsMD46IENvc3QgMyB2ZXh0MSA8Niw2LDQsND4sIExIUworICAzNzE2MDE3MTM1VSwJLy8gPDYsNCw0LDE+OiBDb3N0IDQgdmV4dDIgPDQsMSw2LDQ+LCA8NCwxLDYsND4KKyAgMjY0MjkzODk0NFUsCS8vIDw2LDQsNCwyPjogQ29zdCAzIHZleHQyIDw0LDIsNiw0PiwgPDQsMiw2LDQ+CisgIDM3MTczNDQ0MDFVLAkvLyA8Niw0LDQsMz46IENvc3QgNCB2ZXh0MiA8NCwzLDYsND4sIDw0LDMsNiw0PgorICAyNzEyNTcxMDg4VSwJLy8gPDYsNCw0LDQ+OiBDb3N0IDMgdmV4dDMgPDQsNiw0LDY+LCA8NCw0LDQsND4KKyAgMjYyOTY2ODE1MFUsCS8vIDw2LDQsNCw1PjogQ29zdCAzIHZleHQyIDwyLDAsNiw0PiwgUkhTCisgIDE2Mzc2NDk2MzZVLAkvLyA8Niw0LDQsNj46IENvc3QgMiB2ZXh0MyA8NCw0LDYsNj4sIDw0LDQsNiw2PgorICAyNjQ2MjU3MTA5VSwJLy8gPDYsNCw0LDc+OiBDb3N0IDMgdmV4dDIgPDQsNyw2LDQ+LCA8NCw3LDYsND4KKyAgMTYzNzY0OTYzNlUsCS8vIDw2LDQsNCx1PjogQ29zdCAyIHZleHQzIDw0LDQsNiw2PiwgPDQsNCw2LDY+CisgIDI1NjYzOTgwNTRVLAkvLyA8Niw0LDUsMD46IENvc3QgMyB2ZXh0MSA8Miw2LDQsNT4sIExIUworICAzNzYwODc2ODA1VSwJLy8gPDYsNCw1LDE+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDY+LCA8NCw1LDEsMz4KKyAgMjU2NjM5OTkzN1UsCS8vIDw2LDQsNSwyPjogQ29zdCAzIHZleHQxIDwyLDYsNCw1PiwgPDIsNiw0LDU+CisgIDI1ODQzMTY0MThVLAkvLyA8Niw0LDUsMz46IENvc3QgMyB2ZXh0MSA8NSw2LDQsNT4sIDwzLDQsNSw2PgorICAyNTY2NDAxMzM0VSwJLy8gPDYsNCw1LDQ+OiBDb3N0IDMgdmV4dDEgPDIsNiw0LDU+LCBSSFMKKyAgMjU4NDMxODAyOFUsCS8vIDw2LDQsNSw1PjogQ29zdCAzIHZleHQxIDw1LDYsNCw1PiwgPDUsNiw0LDU+CisgIDE2MTIyODcyODZVLAkvLyA8Niw0LDUsNj46IENvc3QgMiB2ZXh0MyA8MCwyLDQsNj4sIFJIUworICAyODUyOTY1Njg2VSwJLy8gPDYsNCw1LDc+OiBDb3N0IDMgdnV6cHIgPDUsNiw3LDQ+LCBSSFMKKyAgMTYxMjI4NzMwNFUsCS8vIDw2LDQsNSx1PjogQ29zdCAyIHZleHQzIDwwLDIsNCw2PiwgUkhTCisgIDE1MDQ2MDgzNThVLAkvLyA8Niw0LDYsMD46IENvc3QgMiB2ZXh0MSA8NCw2LDQsNj4sIExIUworICAyNTc4MzUwODM4VSwJLy8gPDYsNCw2LDE+OiBDb3N0IDMgdmV4dDEgPDQsNiw0LDY+LCA8MSwwLDMsMj4KKyAgMjU3ODM1MTcyMFUsCS8vIDw2LDQsNiwyPjogQ29zdCAzIHZleHQxIDw0LDYsNCw2PiwgPDIsMiwyLDI+CisgIDI1NzgzNTIyNzhVLAkvLyA8Niw0LDYsMz46IENvc3QgMyB2ZXh0MSA8NCw2LDQsNj4sIDwzLDAsMSwyPgorICAxNTA0NjExNjM4VSwJLy8gPDYsNCw2LDQ+OiBDb3N0IDIgdmV4dDEgPDQsNiw0LDY+LCBSSFMKKyAgMjU3ODM1Mzg3MlUsCS8vIDw2LDQsNiw1PjogQ29zdCAzIHZleHQxIDw0LDYsNCw2PiwgPDUsMSw3LDM+CisgIDI1NzgzNTQ2ODJVLAkvLyA8Niw0LDYsNj46IENvc3QgMyB2ZXh0MSA8NCw2LDQsNj4sIDw2LDIsNywzPgorICAyNTc4MzU1MTk0VSwJLy8gPDYsNCw2LDc+OiBDb3N0IDMgdmV4dDEgPDQsNiw0LDY+LCA8NywwLDEsMj4KKyAgMTUwNDYxNDE5MFUsCS8vIDw2LDQsNix1PjogQ29zdCAyIHZleHQxIDw0LDYsNCw2PiwgTEhTCisgIDI1NzIzODY0MDZVLAkvLyA8Niw0LDcsMD46IENvc3QgMyB2ZXh0MSA8Myw2LDQsNz4sIExIUworICAyNTcyMzg3MjI2VSwJLy8gPDYsNCw3LDE+OiBDb3N0IDMgdmV4dDEgPDMsNiw0LDc+LCA8MSwyLDMsND4KKyAgMzY0MDE1NzkwMlUsCS8vIDw2LDQsNywyPjogQ29zdCA0IHZleHQxIDwyLDYsNCw3PiwgPDIsMyw0LDU+CisgIDI1NzIzODkwMjBVLAkvLyA8Niw0LDcsMz46IENvc3QgMyB2ZXh0MSA8Myw2LDQsNz4sIDwzLDYsNCw3PgorICAyNTcyMzg5Njg2VSwJLy8gPDYsNCw3LDQ+OiBDb3N0IDMgdmV4dDEgPDMsNiw0LDc+LCBSSFMKKyAgMjk4MDQ5NzEwMlUsCS8vIDw2LDQsNyw1PjogQ29zdCAzIHZ6aXByIFJIUywgPDIsMyw0LDU+CisgIDI5ODA0OTU1NjRVLAkvLyA8Niw0LDcsNj46IENvc3QgMyB2emlwciBSSFMsIDwwLDIsNCw2PgorICA0MDU0MjM5MDkwVSwJLy8gPDYsNCw3LDc+OiBDb3N0IDQgdnppcHIgUkhTLCA8Miw1LDQsNz4KKyAgMjU3MjM5MjIzOFUsCS8vIDw2LDQsNyx1PjogQ29zdCAzIHZleHQxIDwzLDYsNCw3PiwgTEhTCisgIDE1MDQ2MDgzNThVLAkvLyA8Niw0LHUsMD46IENvc3QgMiB2ZXh0MSA8NCw2LDQsNj4sIExIUworICAyNjI5NjcwNzAyVSwJLy8gPDYsNCx1LDE+OiBDb3N0IDMgdmV4dDIgPDIsMCw2LDQ+LCBMSFMKKyAgMjU2NjQyNDUxNlUsCS8vIDw2LDQsdSwyPjogQ29zdCAzIHZleHQxIDwyLDYsNCx1PiwgPDIsNiw0LHU+CisgIDI1ODQzNDA5OTRVLAkvLyA8Niw0LHUsMz46IENvc3QgMyB2ZXh0MSA8NSw2LDQsdT4sIDwzLDQsNSw2PgorICAxNjQwMTU2Njk0VSwJLy8gPDYsNCx1LDQ+OiBDb3N0IDIgdmV4dDMgPDQsdSw0LDY+LCA8NCx1LDQsNj4KKyAgMjYyOTY3MTA2NlUsCS8vIDw2LDQsdSw1PjogQ29zdCAzIHZleHQyIDwyLDAsNiw0PiwgUkhTCisgIDE2MTIyODc1MjlVLAkvLyA8Niw0LHUsNj46IENvc3QgMiB2ZXh0MyA8MCwyLDQsNj4sIFJIUworICAyODUyOTY1OTI5VSwJLy8gPDYsNCx1LDc+OiBDb3N0IDMgdnV6cHIgPDUsNiw3LDQ+LCBSSFMKKyAgMTYxMjI4NzU0N1UsCS8vIDw2LDQsdSx1PjogQ29zdCAyIHZleHQzIDwwLDIsNCw2PiwgUkhTCisgIDM3MDg3MjMyMDBVLAkvLyA8Niw1LDAsMD46IENvc3QgNCB2ZXh0MiA8Mix1LDYsNT4sIDwwLDAsMCwwPgorICAyNjM0OTgxNDc4VSwJLy8gPDYsNSwwLDE+OiBDb3N0IDMgdmV4dDIgPDIsdSw2LDU+LCBMSFMKKyAgMzY5NDEyNTI2MFUsCS8vIDw2LDUsMCwyPjogQ29zdCA0IHZleHQyIDwwLDQsNiw1PiwgPDAsMiw0LDY+CisgIDM3NzkwODc5NjJVLAkvLyA8Niw1LDAsMz46IENvc3QgNCB2ZXh0MyA8Myw0LDUsNj4sIDw1LDAsMywyPgorICAzNzYwODc3MTU0VSwJLy8gPDYsNSwwLDQ+OiBDb3N0IDQgdmV4dDMgPDAsNCwxLDY+LCA8NSwwLDQsMT4KKyAgNDE5NTExMDkxNlUsCS8vIDw2LDUsMCw1PjogQ29zdCA0IHZ0cm5yIDw1LDYsNywwPiwgPDUsNSw1LDU+CisgIDM2OTY3Nzk3NzVVLAkvLyA8Niw1LDAsNj46IENvc3QgNCB2ZXh0MiA8MCx1LDYsNT4sIDwwLDYsMiw3PgorICAxMTc1MjEyMTMwVSwJLy8gPDYsNSwwLDc+OiBDb3N0IDIgdnJldiA8NSw2LDcsMD4KKyAgMTE3NTI4NTg2N1UsCS8vIDw2LDUsMCx1PjogQ29zdCAyIHZyZXYgPDUsNix1LDA+CisgIDIyNDg0NDU5ODhVLAkvLyA8Niw1LDEsMD46IENvc3QgMyB2cmV2IDw1LDYsMCwxPgorICAzNjk4MTA3MjM3VSwJLy8gPDYsNSwxLDE+OiBDb3N0IDQgdmV4dDIgPDEsMSw2LDU+LCA8MSwxLDYsNT4KKyAgMzcwODcyNDExOFUsCS8vIDw2LDUsMSwyPjogQ29zdCA0IHZleHQyIDwyLHUsNiw1PiwgPDEsMiwzLDA+CisgIDM5MDg1NzUzMzRVLAkvLyA8Niw1LDEsMz46IENvc3QgNCB2dXpwciA8Miw2LDQsNT4sIExIUworICAzNzE2MDIzMzc2VSwJLy8gPDYsNSwxLDQ+OiBDb3N0IDQgdmV4dDIgPDQsMSw2LDU+LCA8MSw0LDUsNj4KKyAgMzcwODcyNDM2OFUsCS8vIDw2LDUsMSw1PjogQ29zdCA0IHZleHQyIDwyLHUsNiw1PiwgPDEsNSwzLDc+CisgIDM3Njc3MzM5NjBVLAkvLyA8Niw1LDEsNj46IENvc3QgNCB2ZXh0MyA8MSw1LDQsNj4sIDw1LDEsNiw0PgorICAyNzEyNTcxNjAwVSwJLy8gPDYsNSwxLDc+OiBDb3N0IDMgdmV4dDMgPDQsNiw0LDY+LCA8NSwxLDcsMz4KKyAgMjcxMjU3MTYwOVUsCS8vIDw2LDUsMSx1PjogQ29zdCAzIHZleHQzIDw0LDYsNCw2PiwgPDUsMSx1LDM+CisgIDI1NzgzOTExNDJVLAkvLyA8Niw1LDIsMD46IENvc3QgMyB2ZXh0MSA8NCw2LDUsMj4sIExIUworICAzNzA0MDc5OTM0VSwJLy8gPDYsNSwyLDE+OiBDb3N0IDQgdmV4dDIgPDIsMSw2LDU+LCA8MiwxLDYsNT4KKyAgMzcwODcyNDg0MFUsCS8vIDw2LDUsMiwyPjogQ29zdCA0IHZleHQyIDwyLHUsNiw1PiwgPDIsMiwyLDI+CisgIDM3MDU0MDcxODJVLAkvLyA8Niw1LDIsMz46IENvc3QgNCB2ZXh0MiA8MiwzLDYsNT4sIDwyLDMsNCw1PgorICAyNTc4Mzk0NDIyVSwJLy8gPDYsNSwyLDQ+OiBDb3N0IDMgdmV4dDEgPDQsNiw1LDI+LCBSSFMKKyAgMzcxNzM1MTI3MlUsCS8vIDw2LDUsMiw1PjogQ29zdCA0IHZleHQyIDw0LDMsNiw1PiwgPDIsNSwzLDY+CisgIDI2MzQ5ODMzNTRVLAkvLyA8Niw1LDIsNj46IENvc3QgMyB2ZXh0MiA8Mix1LDYsNT4sIDwyLDYsMyw3PgorICAzMTE1NDg2NTE4VSwJLy8gPDYsNSwyLDc+OiBDb3N0IDMgdnRybnIgPDQsNix1LDI+LCBSSFMKKyAgMjYzNDk4MzU0MVUsCS8vIDw2LDUsMix1PjogQ29zdCAzIHZleHQyIDwyLHUsNiw1PiwgPDIsdSw2LDU+CisgIDM3MDg3MjUzOThVLAkvLyA8Niw1LDMsMD46IENvc3QgNCB2ZXh0MiA8Mix1LDYsNT4sIDwzLDAsMSwyPgorICAzNzEwMDUyNjMxVSwJLy8gPDYsNSwzLDE+OiBDb3N0IDQgdmV4dDIgPDMsMSw2LDU+LCA8MywxLDYsNT4KKyAgMzcwODcyNTYwNlUsCS8vIDw2LDUsMywyPjogQ29zdCA0IHZleHQyIDwyLHUsNiw1PiwgPDMsMiw2LDM+CisgIDM3MDg3MjU2NjBVLAkvLyA8Niw1LDMsMz46IENvc3QgNCB2ZXh0MiA8Mix1LDYsNT4sIDwzLDMsMywzPgorICAyNjQzNjEwMTE0VSwJLy8gPDYsNSwzLDQ+OiBDb3N0IDMgdmV4dDIgPDQsMyw2LDU+LCA8Myw0LDUsNj4KKyAgMzcxNzM1MjAxMFUsCS8vIDw2LDUsMyw1PjogQ29zdCA0IHZleHQyIDw0LDMsNiw1PiwgPDMsNSw0LDY+CisgIDM3NzM2MzIzNThVLAkvLyA8Niw1LDMsNj46IENvc3QgNCB2ZXh0MyA8Miw1LDMsNj4sIDw1LDMsNiwwPgorICAyMjQ4OTc4NTMzVSwJLy8gPDYsNSwzLDc+OiBDb3N0IDMgdnJldiA8NSw2LDcsMz4KKyAgMjI0OTA1MjI3MFUsCS8vIDw2LDUsMyx1PjogQ29zdCAzIHZyZXYgPDUsNix1LDM+CisgIDI1OTYzMjM0MzBVLAkvLyA8Niw1LDQsMD46IENvc3QgMyB2ZXh0MSA8Nyw2LDUsND4sIExIUworICAzNzE2MDI1MzI4VSwJLy8gPDYsNSw0LDE+OiBDb3N0IDQgdmV4dDIgPDQsMSw2LDU+LCA8NCwxLDYsNT4KKyAgMzcxNjY4ODk2MVUsCS8vIDw2LDUsNCwyPjogQ29zdCA0IHZleHQyIDw0LDIsNiw1PiwgPDQsMiw2LDU+CisgIDI2NDM2MTA3NzBVLAkvLyA8Niw1LDQsMz46IENvc3QgMyB2ZXh0MiA8NCwzLDYsNT4sIDw0LDMsNiw1PgorICAyNTk2MzI2NzEwVSwJLy8gPDYsNSw0LDQ+OiBDb3N0IDMgdmV4dDEgPDcsNiw1LDQ+LCBSSFMKKyAgMjYzNDk4NDc1OFUsCS8vIDw2LDUsNCw1PjogQ29zdCAzIHZleHQyIDwyLHUsNiw1PiwgUkhTCisgIDM3Njc3MzQxOTlVLAkvLyA8Niw1LDQsNj46IENvc3QgNCB2ZXh0MyA8MSw1LDQsNj4sIDw1LDQsNiwwPgorICAxNjQzNjk2MDcwVSwJLy8gPDYsNSw0LDc+OiBDb3N0IDIgdmV4dDMgPDUsNCw3LDY+LCA8NSw0LDcsNj4KKyAgMTY0Mzc2OTgwN1UsCS8vIDw2LDUsNCx1PjogQ29zdCAyIHZleHQzIDw1LDQsdSw2PiwgPDUsNCx1LDY+CisgIDI1Nzg0MTU3MThVLAkvLyA8Niw1LDUsMD46IENvc3QgMyB2ZXh0MSA8NCw2LDUsNT4sIExIUworICAzNjUyMTU4MTk4VSwJLy8gPDYsNSw1LDE+OiBDb3N0IDQgdmV4dDEgPDQsNiw1LDU+LCA8MSwwLDMsMj4KKyAgMzY1MjE1OTA4MFUsCS8vIDw2LDUsNSwyPjogQ29zdCA0IHZleHQxIDw0LDYsNSw1PiwgPDIsMiwyLDI+CisgIDM2NTIxNTk2MzhVLAkvLyA8Niw1LDUsMz46IENvc3QgNCB2ZXh0MSA8NCw2LDUsNT4sIDwzLDAsMSwyPgorICAyNTc4NDE4OTk4VSwJLy8gPDYsNSw1LDQ+OiBDb3N0IDMgdmV4dDEgPDQsNiw1LDU+LCBSSFMKKyAgMjcxMjU3MTkwOFUsCS8vIDw2LDUsNSw1PjogQ29zdCAzIHZleHQzIDw0LDYsNCw2PiwgPDUsNSw1LDU+CisgIDI3MTgwMjc3OTBVLAkvLyA8Niw1LDUsNj46IENvc3QgMyB2ZXh0MyA8NSw1LDYsNj4sIDw1LDUsNiw2PgorICAyNzEyNTcxOTI4VSwJLy8gPDYsNSw1LDc+OiBDb3N0IDMgdmV4dDMgPDQsNiw0LDY+LCA8NSw1LDcsNz4KKyAgMjcxMjU3MTkzN1UsCS8vIDw2LDUsNSx1PjogQ29zdCAzIHZleHQzIDw0LDYsNCw2PiwgPDUsNSx1LDc+CisgIDI3MDUzNDY1OTZVLAkvLyA8Niw1LDYsMD46IENvc3QgMyB2ZXh0MyA8Myw0LDUsNj4sIDw1LDYsMCwxPgorICAzNzY3MTQ0NDk2VSwJLy8gPDYsNSw2LDE+OiBDb3N0IDQgdmV4dDMgPDEsNCw1LDY+LCA8NSw2LDEsND4KKyAgMzc3MzExNjQ3M1UsCS8vIDw2LDUsNiwyPjogQ29zdCA0IHZleHQzIDwyLDQsNSw2PiwgPDUsNiwyLDQ+CisgIDI3MDUzNDY2MjZVLAkvLyA8Niw1LDYsMz46IENvc3QgMyB2ZXh0MyA8Myw0LDUsNj4sIDw1LDYsMyw0PgorICAyNzA1MzQ2NjM2VSwJLy8gPDYsNSw2LDQ+OiBDb3N0IDMgdmV4dDMgPDMsNCw1LDY+LCA8NSw2LDQsNT4KKyAgMzkwODU3NzIxN1UsCS8vIDw2LDUsNiw1PjogQ29zdCA0IHZ1enByIDwyLDYsNCw1PiwgPDIsNiw0LDU+CisgIDI1Nzg0Mjg3MjhVLAkvLyA8Niw1LDYsNj46IENvc3QgMyB2ZXh0MSA8NCw2LDUsNj4sIDw2LDYsNiw2PgorICAyNzEyNTcyMDAyVSwJLy8gPDYsNSw2LDc+OiBDb3N0IDMgdmV4dDMgPDQsNiw0LDY+LCA8NSw2LDcsMD4KKyAgMjcwNTM0NjY2OFUsCS8vIDw2LDUsNix1PjogQ29zdCAzIHZleHQzIDwzLDQsNSw2PiwgPDUsNix1LDE+CisgIDI1NjA1MTYxOThVLAkvLyA8Niw1LDcsMD46IENvc3QgMyB2ZXh0MSA8MSw2LDUsNz4sIExIUworICAyNTYwNTE3MzYzVSwJLy8gPDYsNSw3LDE+OiBDb3N0IDMgdmV4dDEgPDEsNiw1LDc+LCA8MSw2LDUsNz4KKyAgMjU2NjQ5MDA2MFUsCS8vIDw2LDUsNywyPjogQ29zdCAzIHZleHQxIDwyLDYsNSw3PiwgPDIsNiw1LDc+CisgIDM2MzQyNjAxMThVLAkvLyA8Niw1LDcsMz46IENvc3QgNCB2ZXh0MSA8MSw2LDUsNz4sIDwzLDAsMSwyPgorICAyNTYwNTE5NDc4VSwJLy8gPDYsNSw3LDQ+OiBDb3N0IDMgdmV4dDEgPDEsNiw1LDc+LCBSSFMKKyAgMjk4MDQ5ODY1MFUsCS8vIDw2LDUsNyw1PjogQ29zdCAzIHZ6aXByIFJIUywgPDQsNCw1LDU+CisgIDI5ODA0OTc5MjJVLAkvLyA8Niw1LDcsNj46IENvc3QgMyB2emlwciBSSFMsIDwzLDQsNSw2PgorICAzMTAzMjE0OTAyVSwJLy8gPDYsNSw3LDc+OiBDb3N0IDMgdnRybnIgPDIsNiwzLDc+LCBSSFMKKyAgMjU2MDUyMjAzMFUsCS8vIDw2LDUsNyx1PjogQ29zdCAzIHZleHQxIDwxLDYsNSw3PiwgTEhTCisgIDI1NjA1MjQzOTBVLAkvLyA8Niw1LHUsMD46IENvc3QgMyB2ZXh0MSA8MSw2LDUsdT4sIExIUworICAyNTYwNTI1NTU2VSwJLy8gPDYsNSx1LDE+OiBDb3N0IDMgdmV4dDEgPDEsNiw1LHU+LCA8MSw2LDUsdT4KKyAgMjU2NjQ5ODI1M1UsCS8vIDw2LDUsdSwyPjogQ29zdCAzIHZleHQxIDwyLDYsNSx1PiwgPDIsNiw1LHU+CisgIDI2NDY5MzE0MzlVLAkvLyA8Niw1LHUsMz46IENvc3QgMyB2ZXh0MiA8NCx1LDYsNT4sIDx1LDMsNSw3PgorICAyNTYwNTI3NjcwVSwJLy8gPDYsNSx1LDQ+OiBDb3N0IDMgdmV4dDEgPDEsNiw1LHU+LCBSSFMKKyAgMjYzNDk4NzY3NFUsCS8vIDw2LDUsdSw1PjogQ29zdCAzIHZleHQyIDwyLHUsNiw1PiwgUkhTCisgIDI5ODA1MDYxMTRVLAkvLyA8Niw1LHUsNj46IENvc3QgMyB2emlwciBSSFMsIDwzLDQsNSw2PgorICAxMTc1Mjc3Njc0VSwJLy8gPDYsNSx1LDc+OiBDb3N0IDIgdnJldiA8NSw2LDcsdT4KKyAgMTE3NTM1MTQxMVUsCS8vIDw2LDUsdSx1PjogQ29zdCAyIHZyZXYgPDUsNix1LHU+CisgIDI1Nzg0NDg0ODZVLAkvLyA8Niw2LDAsMD46IENvc3QgMyB2ZXh0MSA8NCw2LDYsMD4sIExIUworICAxNTczMTkxNzgyVSwJLy8gPDYsNiwwLDE+OiBDb3N0IDIgdmV4dDIgPDQsdSw2LDY+LCBMSFMKKyAgMjY4NjAzMDEyNFUsCS8vIDw2LDYsMCwyPjogQ29zdCAzIHZleHQzIDwwLDIsNCw2PiwgPDYsMCwyLDQ+CisgIDM3NzkwODg2OTBVLAkvLyA8Niw2LDAsMz46IENvc3QgNCB2ZXh0MyA8Myw0LDUsNj4sIDw2LDAsMywxPgorICAyNjg3MjA5Nzg4VSwJLy8gPDYsNiwwLDQ+OiBDb3N0IDMgdmV4dDMgPDAsNCwyLDY+LCA8NiwwLDQsMj4KKyAgMzY1MjE5NDAwMFUsCS8vIDw2LDYsMCw1PjogQ29zdCA0IHZleHQxIDw0LDYsNiwwPiwgPDUsMSw3LDM+CisgIDIyNTQ4NTI5MTRVLAkvLyA8Niw2LDAsNj46IENvc3QgMyB2cmV2IDw2LDYsNiwwPgorICA0MDQxNTc1NzM0VSwJLy8gPDYsNiwwLDc+OiBDb3N0IDQgdnppcHIgPDIsNCw2LDA+LCBSSFMKKyAgMTU3MzE5MjM0OVUsCS8vIDw2LDYsMCx1PjogQ29zdCAyIHZleHQyIDw0LHUsNiw2PiwgTEhTCisgIDI2NDY5MzQyNjJVLAkvLyA8Niw2LDEsMD46IENvc3QgMyB2ZXh0MiA8NCx1LDYsNj4sIDwxLDAsMywyPgorICAyNjQ2OTM0MzI0VSwJLy8gPDYsNiwxLDE+OiBDb3N0IDMgdmV4dDIgPDQsdSw2LDY+LCA8MSwxLDEsMT4KKyAgMjY0NjkzNDQyMlUsCS8vIDw2LDYsMSwyPjogQ29zdCAzIHZleHQyIDw0LHUsNiw2PiwgPDEsMiwzLDA+CisgIDI4NDY3ODU2MzhVLAkvLyA8Niw2LDEsMz46IENvc3QgMyB2dXpwciA8NCw2LDQsNj4sIExIUworICAzNzYwOTUxNjk0VSwJLy8gPDYsNiwxLDQ+OiBDb3N0IDQgdmV4dDMgPDAsNCwyLDY+LCA8NiwxLDQsMz4KKyAgMjY0NjkzNDY3MlUsCS8vIDw2LDYsMSw1PjogQ29zdCAzIHZleHQyIDw0LHUsNiw2PiwgPDEsNSwzLDc+CisgIDI3MTI1NzIzMjBVLAkvLyA8Niw2LDEsNj46IENvc3QgMyB2ZXh0MyA8NCw2LDQsNj4sIDw2LDEsNiwzPgorICAzNzc1NTQ5ODY1VSwJLy8gPDYsNiwxLDc+OiBDb3N0IDQgdmV4dDMgPDIsdSwyLDY+LCA8NiwxLDcsMz4KKyAgMjg0Njc4NTY0M1UsCS8vIDw2LDYsMSx1PjogQ29zdCAzIHZ1enByIDw0LDYsNCw2PiwgTEhTCisgIDM3NTk3NzIwOTRVLAkvLyA8Niw2LDIsMD46IENvc3QgNCB2ZXh0MyA8MCwyLDQsNj4sIDw2LDIsMCw2PgorICAzNzA0NzUxNjc2VSwJLy8gPDYsNiwyLDE+OiBDb3N0IDQgdmV4dDIgPDIsMiw2LDY+LCA8MiwxLDYsMz4KKyAgMjYzMTAwOTkzNlUsCS8vIDw2LDYsMiwyPjogQ29zdCAzIHZleHQyIDwyLDIsNiw2PiwgPDIsMiw2LDY+CisgIDI2NDY5MzUyMDZVLAkvLyA8Niw2LDIsMz46IENvc3QgMyB2ZXh0MiA8NCx1LDYsNj4sIDwyLDMsMCwxPgorICAzNzU5NzcyMTI3VSwJLy8gPDYsNiwyLDQ+OiBDb3N0IDQgdmV4dDMgPDAsMiw0LDY+LCA8NiwyLDQsMz4KKyAgMzcwNDc1MjAwNFUsCS8vIDw2LDYsMiw1PjogQ29zdCA0IHZleHQyIDwyLDIsNiw2PiwgPDIsNSw2LDc+CisgIDI2NDY5MzU0ODJVLAkvLyA8Niw2LDIsNj46IENvc3QgMyB2ZXh0MiA8NCx1LDYsNj4sIDwyLDYsMyw3PgorICAyNzEyNTcyNDEwVSwJLy8gPDYsNiwyLDc+OiBDb3N0IDMgdmV4dDMgPDQsNiw0LDY+LCA8NiwyLDcsMz4KKyAgMjcxMjU3MjQxOVUsCS8vIDw2LDYsMix1PjogQ29zdCAzIHZleHQzIDw0LDYsNCw2PiwgPDYsMix1LDM+CisgIDI2NDY5MzU3MDJVLAkvLyA8Niw2LDMsMD46IENvc3QgMyB2ZXh0MiA8NCx1LDYsNj4sIDwzLDAsMSwyPgorICAzNzc3MDI0NTM0VSwJLy8gPDYsNiwzLDE+OiBDb3N0IDQgdmV4dDMgPDMsMSw0LDY+LCA8NiwzLDEsND4KKyAgMzcwNDc1MjQ1M1UsCS8vIDw2LDYsMywyPjogQ29zdCA0IHZleHQyIDwyLDIsNiw2PiwgPDMsMiwyLDY+CisgIDI2NDY5MzU5NjRVLAkvLyA8Niw2LDMsMz46IENvc3QgMyB2ZXh0MiA8NCx1LDYsNj4sIDwzLDMsMywzPgorICAyNzA1MzQ3MTIyVSwJLy8gPDYsNiwzLDQ+OiBDb3N0IDMgdmV4dDMgPDMsNCw1LDY+LCA8NiwzLDQsNT4KKyAgMzc3OTY3ODc3OFUsCS8vIDw2LDYsMyw1PjogQ29zdCA0IHZleHQzIDwzLDUsNCw2PiwgPDYsMyw1LDQ+CisgIDI2NTc1NTMwNjlVLAkvLyA8Niw2LDMsNj46IENvc3QgMyB2ZXh0MiA8Niw2LDYsNj4sIDwzLDYsNiw2PgorICA0MDM5NjA5NjU0VSwJLy8gPDYsNiwzLDc+OiBDb3N0IDQgdnppcHIgPDIsMSw2LDM+LCBSSFMKKyAgMjcwODAwMTM2NlUsCS8vIDw2LDYsMyx1PjogQ29zdCAzIHZleHQzIDwzLHUsNSw2PiwgPDYsMyx1LDU+CisgIDI1Nzg0ODEyNTRVLAkvLyA8Niw2LDQsMD46IENvc3QgMyB2ZXh0MSA8NCw2LDYsND4sIExIUworICAzNjUyMjIzNzM0VSwJLy8gPDYsNiw0LDE+OiBDb3N0IDQgdmV4dDEgPDQsNiw2LDQ+LCA8MSwwLDMsMj4KKyAgMzc2MDk1MTkyMlUsCS8vIDw2LDYsNCwyPjogQ29zdCA0IHZleHQzIDwwLDQsMiw2PiwgPDYsNCwyLDY+CisgIDM3NzkwODkwMTlVLAkvLyA8Niw2LDQsMz46IENvc3QgNCB2ZXh0MyA8Myw0LDUsNj4sIDw2LDQsMyw2PgorICAxNTcwNTQwNzcyVSwJLy8gPDYsNiw0LDQ+OiBDb3N0IDIgdmV4dDIgPDQsNCw2LDY+LCA8NCw0LDYsNj4KKyAgMTU3MzE5NTA2MlUsCS8vIDw2LDYsNCw1PjogQ29zdCAyIHZleHQyIDw0LHUsNiw2PiwgUkhTCisgIDI3MTI1NzI1NjBVLAkvLyA8Niw2LDQsNj46IENvc3QgMyB2ZXh0MyA8NCw2LDQsNj4sIDw2LDQsNiwwPgorICAyNzIzNDEwNTkxVSwJLy8gPDYsNiw0LDc+OiBDb3N0IDMgdmV4dDMgPDYsNCw3LDY+LCA8Niw0LDcsNj4KKyAgMTU3MzE5NTMwNFUsCS8vIDw2LDYsNCx1PjogQ29zdCAyIHZleHQyIDw0LHUsNiw2PiwgPDQsdSw2LDY+CisgIDM2NDAyODczMzRVLAkvLyA8Niw2LDUsMD46IENvc3QgNCB2ZXh0MSA8Miw2LDYsNT4sIExIUworICAyNjQ2OTM3Mjk2VSwJLy8gPDYsNiw1LDE+OiBDb3N0IDMgdmV4dDIgPDQsdSw2LDY+LCA8NSwxLDcsMz4KKyAgMzY0MDI4OTIzNVUsCS8vIDw2LDYsNSwyPjogQ29zdCA0IHZleHQxIDwyLDYsNiw1PiwgPDIsNiw2LDU+CisgIDM3MjA2NzkyNzlVLAkvLyA8Niw2LDUsMz46IENvc3QgNCB2ZXh0MiA8NCx1LDYsNj4sIDw1LDMsNywwPgorICAyNjQ2OTM3NTQyVSwJLy8gPDYsNiw1LDQ+OiBDb3N0IDMgdmV4dDIgPDQsdSw2LDY+LCA8NSw0LDcsNj4KKyAgMjY0NjkzNzYwNFUsCS8vIDw2LDYsNSw1PjogQ29zdCAzIHZleHQyIDw0LHUsNiw2PiwgPDUsNSw1LDU+CisgIDI2NDY5Mzc2OThVLAkvLyA8Niw2LDUsNj46IENvc3QgMyB2ZXh0MiA8NCx1LDYsNj4sIDw1LDYsNywwPgorICAyODQ2Nzg4OTE4VSwJLy8gPDYsNiw1LDc+OiBDb3N0IDMgdnV6cHIgPDQsNiw0LDY+LCBSSFMKKyAgMjg0Njc4ODkxOVUsCS8vIDw2LDYsNSx1PjogQ29zdCAzIHZ1enByIDw0LDYsNCw2PiwgUkhTCisgIDE1MTY2OTk3NTBVLAkvLyA8Niw2LDYsMD46IENvc3QgMiB2ZXh0MSA8Niw2LDYsNj4sIExIUworICAyNTkwNDQyMjMwVSwJLy8gPDYsNiw2LDE+OiBDb3N0IDMgdmV4dDEgPDYsNiw2LDY+LCA8MSwwLDMsMj4KKyAgMjY0NjkzODEwNlUsCS8vIDw2LDYsNiwyPjogQ29zdCAzIHZleHQyIDw0LHUsNiw2PiwgPDYsMiw3LDM+CisgIDI1OTA0NDM2NzBVLAkvLyA8Niw2LDYsMz46IENvc3QgMyB2ZXh0MSA8Niw2LDYsNj4sIDwzLDAsMSwyPgorICAxNTE2NzAzMDMwVSwJLy8gPDYsNiw2LDQ+OiBDb3N0IDIgdmV4dDEgPDYsNiw2LDY+LCBSSFMKKyAgMjU5MDQ0NTI2NFUsCS8vIDw2LDYsNiw1PjogQ29zdCAzIHZleHQxIDw2LDYsNiw2PiwgPDUsMSw3LDM+CisgIDI5NjE0NDE4MlUsCS8vIDw2LDYsNiw2PjogQ29zdCAxIHZkdXAyIFJIUworICAyNzEyNTcyNzM4VSwJLy8gPDYsNiw2LDc+OiBDb3N0IDMgdmV4dDMgPDQsNiw0LDY+LCA8Niw2LDcsNz4KKyAgMjk2MTQ0MTgyVSwJLy8gPDYsNiw2LHU+OiBDb3N0IDEgdmR1cDIgUkhTCisgIDI1NjY1NjE4OTRVLAkvLyA8Niw2LDcsMD46IENvc3QgMyB2ZXh0MSA8Miw2LDYsNz4sIExIUworICAzNjM0MzMyOTI0VSwJLy8gPDYsNiw3LDE+OiBDb3N0IDQgdmV4dDEgPDEsNiw2LDc+LCA8MSw2LDYsNz4KKyAgMjU2NjU2Mzc5N1UsCS8vIDw2LDYsNywyPjogQ29zdCAzIHZleHQxIDwyLDYsNiw3PiwgPDIsNiw2LDc+CisgIDI1ODQ0ODAyNThVLAkvLyA8Niw2LDcsMz46IENvc3QgMyB2ZXh0MSA8NSw2LDYsNz4sIDwzLDQsNSw2PgorICAyNTY2NTY1MTc0VSwJLy8gPDYsNiw3LDQ+OiBDb3N0IDMgdmV4dDEgPDIsNiw2LDc+LCBSSFMKKyAgMjcxNzQzODg0NlUsCS8vIDw2LDYsNyw1PjogQ29zdCAzIHZleHQzIDw1LDQsNyw2PiwgPDYsNyw1LDQ+CisgIDI5ODA1MDAyODBVLAkvLyA8Niw2LDcsNj46IENvc3QgMyB2emlwciBSSFMsIDw2LDYsNiw2PgorICAxOTA2NzU2OTE4VSwJLy8gPDYsNiw3LDc+OiBDb3N0IDIgdnppcHIgUkhTLCBSSFMKKyAgMTkwNjc1NjkxOVUsCS8vIDw2LDYsNyx1PjogQ29zdCAyIHZ6aXByIFJIUywgUkhTCisgIDE1MTY2OTk3NTBVLAkvLyA8Niw2LHUsMD46IENvc3QgMiB2ZXh0MSA8Niw2LDYsNj4sIExIUworICAxNTczMTk3NjE0VSwJLy8gPDYsNix1LDE+OiBDb3N0IDIgdmV4dDIgPDQsdSw2LDY+LCBMSFMKKyAgMjU2NjU3MTk5MFUsCS8vIDw2LDYsdSwyPjogQ29zdCAzIHZleHQxIDwyLDYsNix1PiwgPDIsNiw2LHU+CisgIDI4NDY3ODYyMDVVLAkvLyA8Niw2LHUsMz46IENvc3QgMyB2dXpwciA8NCw2LDQsNj4sIExIUworICAxNTE2NzAzMDMwVSwJLy8gPDYsNix1LDQ+OiBDb3N0IDIgdmV4dDEgPDYsNiw2LDY+LCBSSFMKKyAgMTU3MzE5Nzk3OFUsCS8vIDw2LDYsdSw1PjogQ29zdCAyIHZleHQyIDw0LHUsNiw2PiwgUkhTCisgIDI5NjE0NDE4MlUsCS8vIDw2LDYsdSw2PjogQ29zdCAxIHZkdXAyIFJIUworICAxOTA2NzY1MTEwVSwJLy8gPDYsNix1LDc+OiBDb3N0IDIgdnppcHIgUkhTLCBSSFMKKyAgMjk2MTQ0MTgyVSwJLy8gPDYsNix1LHU+OiBDb3N0IDEgdmR1cDIgUkhTCisgIDE1NzEyMDkyMTZVLAkvLyA8Niw3LDAsMD46IENvc3QgMiB2ZXh0MiBSSFMsIDwwLDAsMCwwPgorICA0OTc0Njc0OTRVLAkvLyA8Niw3LDAsMT46IENvc3QgMSB2ZXh0MiBSSFMsIExIUworICAxNTcxMjA5MzgwVSwJLy8gPDYsNywwLDI+OiBDb3N0IDIgdmV4dDIgUkhTLCA8MCwyLDAsMj4KKyAgMjY0NDk1MTI5MlUsCS8vIDw2LDcsMCwzPjogQ29zdCAzIHZleHQyIFJIUywgPDAsMywxLDA+CisgIDE1NzEyMDk1NTRVLAkvLyA8Niw3LDAsND46IENvc3QgMiB2ZXh0MiBSSFMsIDwwLDQsMSw1PgorICAxNTEwNzU2NDUwVSwJLy8gPDYsNywwLDU+OiBDb3N0IDIgdmV4dDEgPDUsNiw3LDA+LCA8NSw2LDcsMD4KKyAgMjY0NDk1MTU0MlUsCS8vIDw2LDcsMCw2PjogQ29zdCAzIHZleHQyIFJIUywgPDAsNiwxLDc+CisgIDI1ODQ0OTkxOTRVLAkvLyA8Niw3LDAsNz46IENvc3QgMyB2ZXh0MSA8NSw2LDcsMD4sIDw3LDAsMSwyPgorICA0OTc0NjgwNjFVLAkvLyA8Niw3LDAsdT46IENvc3QgMSB2ZXh0MiBSSFMsIExIUworICAxNTcxMjA5OTc0VSwJLy8gPDYsNywxLDA+OiBDb3N0IDIgdmV4dDIgUkhTLCA8MSwwLDMsMj4KKyAgMTU3MTIxMDAzNlUsCS8vIDw2LDcsMSwxPjogQ29zdCAyIHZleHQyIFJIUywgPDEsMSwxLDE+CisgIDE1NzEyMTAxMzRVLAkvLyA8Niw3LDEsMj46IENvc3QgMiB2ZXh0MiBSSFMsIDwxLDIsMywwPgorICAxNTcxMjEwMjAwVSwJLy8gPDYsNywxLDM+OiBDb3N0IDIgdmV4dDIgUkhTLCA8MSwzLDEsMz4KKyAgMjY0NDk1MjA5OFUsCS8vIDw2LDcsMSw0PjogQ29zdCAzIHZleHQyIFJIUywgPDEsNCwwLDU+CisgIDE1NzEyMTAzODRVLAkvLyA8Niw3LDEsNT46IENvc3QgMiB2ZXh0MiBSSFMsIDwxLDUsMyw3PgorICAyNjQ0OTUyMjcxVSwJLy8gPDYsNywxLDY+OiBDb3N0IDMgdmV4dDIgUkhTLCA8MSw2LDEsNz4KKyAgMjU3ODUzNTQxOFUsCS8vIDw2LDcsMSw3PjogQ29zdCAzIHZleHQxIDw0LDYsNywxPiwgPDcsMCwxLDI+CisgIDE1NzEyMTA2MDVVLAkvLyA8Niw3LDEsdT46IENvc3QgMiB2ZXh0MiBSSFMsIDwxLHUsMSwzPgorICAyNjQ0OTUyNTA5VSwJLy8gPDYsNywyLDA+OiBDb3N0IDMgdmV4dDIgUkhTLCA8MiwwLDEsMj4KKyAgMjY0NDk1MjU4MlUsCS8vIDw2LDcsMiwxPjogQ29zdCAzIHZleHQyIFJIUywgPDIsMSwwLDM+CisgIDE1NzEyMTA4NTZVLAkvLyA8Niw3LDIsMj46IENvc3QgMiB2ZXh0MiBSSFMsIDwyLDIsMiwyPgorICAxNTcxMjEwOTE4VSwJLy8gPDYsNywyLDM+OiBDb3N0IDIgdmV4dDIgUkhTLCA8MiwzLDAsMT4KKyAgMjY0NDk1MjgyOFUsCS8vIDw2LDcsMiw0PjogQ29zdCAzIHZleHQyIFJIUywgPDIsNCwwLDY+CisgIDI2MzMwMDkwMjhVLAkvLyA8Niw3LDIsNT46IENvc3QgMyB2ZXh0MiA8Miw1LDYsNz4sIDwyLDUsNiw3PgorICAxNTcxMjExMTk0VSwJLy8gPDYsNywyLDY+OiBDb3N0IDIgdmV4dDIgUkhTLCA8Miw2LDMsNz4KKyAgMjY2ODg0MDkzOFUsCS8vIDw2LDcsMiw3PjogQ29zdCAzIHZleHQyIFJIUywgPDIsNywwLDE+CisgIDE1NzEyMTEzMjNVLAkvLyA8Niw3LDIsdT46IENvc3QgMiB2ZXh0MiBSSFMsIDwyLHUsMCwxPgorICAxNTcxMjExNDE0VSwJLy8gPDYsNywzLDA+OiBDb3N0IDIgdmV4dDIgUkhTLCA8MywwLDEsMj4KKyAgMjY0NDk1MzMxMVUsCS8vIDw2LDcsMywxPjogQ29zdCAzIHZleHQyIFJIUywgPDMsMSwwLDM+CisgIDI2NDQ5NTMzOTBVLAkvLyA8Niw3LDMsMj46IENvc3QgMyB2ZXh0MiBSSFMsIDwzLDIsMCwxPgorICAxNTcxMjExNjc2VSwJLy8gPDYsNywzLDM+OiBDb3N0IDIgdmV4dDIgUkhTLCA8MywzLDMsMz4KKyAgMTU3MTIxMTc3OFUsCS8vIDw2LDcsMyw0PjogQ29zdCAyIHZleHQyIFJIUywgPDMsNCw1LDY+CisgIDI2NDQ5NTM2NDhVLAkvLyA8Niw3LDMsNT46IENvc3QgMyB2ZXh0MiBSSFMsIDwzLDUsMSw3PgorICAyNjQ0OTUzNzIwVSwJLy8gPDYsNywzLDY+OiBDb3N0IDMgdmV4dDIgUkhTLCA8Myw2LDAsNz4KKyAgMjY0NDk1Mzc5NVUsCS8vIDw2LDcsMyw3PjogQ29zdCAzIHZleHQyIFJIUywgPDMsNywwLDE+CisgIDE1NzEyMTIwNjJVLAkvLyA8Niw3LDMsdT46IENvc3QgMiB2ZXh0MiBSSFMsIDwzLHUsMSwyPgorICAxNTczMjAyODM0VSwJLy8gPDYsNyw0LDA+OiBDb3N0IDIgdmV4dDIgUkhTLCA8NCwwLDUsMT4KKyAgMjY0NDk1NDA1OFUsCS8vIDw2LDcsNCwxPjogQ29zdCAzIHZleHQyIFJIUywgPDQsMSwyLDM+CisgIDI2NDQ5NTQxNjZVLAkvLyA8Niw3LDQsMj46IENvc3QgMyB2ZXh0MiBSSFMsIDw0LDIsNSwzPgorICAyNjQ0OTU0MjU4VSwJLy8gPDYsNyw0LDM+OiBDb3N0IDMgdmV4dDIgUkhTLCA8NCwzLDYsNT4KKyAgMTU3MTIxMjQ5NlUsCS8vIDw2LDcsNCw0PjogQ29zdCAyIHZleHQyIFJIUywgPDQsNCw0LDQ+CisgIDQ5NzQ3MDc3NFUsCS8vIDw2LDcsNCw1PjogQ29zdCAxIHZleHQyIFJIUywgUkhTCisgIDE1NzMyMDMzMTZVLAkvLyA8Niw3LDQsNj46IENvc3QgMiB2ZXh0MiBSSFMsIDw0LDYsNCw2PgorICAyNjQ2MjgxNjg4VSwJLy8gPDYsNyw0LDc+OiBDb3N0IDMgdmV4dDIgPDQsNyw2LDc+LCA8NCw3LDYsNz4KKyAgNDk3NDcxMDE3VSwJLy8gPDYsNyw0LHU+OiBDb3N0IDEgdmV4dDIgUkhTLCBSSFMKKyAgMjY0NDk1NDY5NlUsCS8vIDw2LDcsNSwwPjogQ29zdCAzIHZleHQyIFJIUywgPDUsMCwxLDI+CisgIDE1NzMyMDM2NjRVLAkvLyA8Niw3LDUsMT46IENvc3QgMiB2ZXh0MiBSSFMsIDw1LDEsNywzPgorICAyNjQ0OTU0ODc4VSwJLy8gPDYsNyw1LDI+OiBDb3N0IDMgdmV4dDIgUkhTLCA8NSwyLDMsND4KKyAgMjY0NDk1NDk5MVUsCS8vIDw2LDcsNSwzPjogQ29zdCAzIHZleHQyIFJIUywgPDUsMyw3LDA+CisgIDE1NzEyMTMyNTRVLAkvLyA8Niw3LDUsND46IENvc3QgMiB2ZXh0MiBSSFMsIDw1LDQsNyw2PgorICAxNTcxMjEzMzE2VSwJLy8gPDYsNyw1LDU+OiBDb3N0IDIgdmV4dDIgUkhTLCA8NSw1LDUsNT4KKyAgMTU3MTIxMzQxMFUsCS8vIDw2LDcsNSw2PjogQ29zdCAyIHZleHQyIFJIUywgPDUsNiw3LDA+CisgIDE1NzMyMDQxMzZVLAkvLyA8Niw3LDUsNz46IENvc3QgMiB2ZXh0MiBSSFMsIDw1LDcsNSw3PgorICAxNTczMjA0MjE3VSwJLy8gPDYsNyw1LHU+OiBDb3N0IDIgdmV4dDIgUkhTLCA8NSx1LDUsNz4KKyAgMjY0NDk1NTQyNVUsCS8vIDw2LDcsNiwwPjogQ29zdCAzIHZleHQyIFJIUywgPDYsMCwxLDI+CisgIDI2NDQ5NTU1NjFVLAkvLyA8Niw3LDYsMT46IENvc3QgMyB2ZXh0MiBSSFMsIDw2LDEsNywzPgorICAxNTczMjA0NDc0VSwJLy8gPDYsNyw2LDI+OiBDb3N0IDIgdmV4dDIgUkhTLCA8NiwyLDcsMz4KKyAgMjY0NDk1NTY5OFUsCS8vIDw2LDcsNiwzPjogQ29zdCAzIHZleHQyIFJIUywgPDYsMyw0LDU+CisgIDI2NDQ5NTU3ODlVLAkvLyA8Niw3LDYsND46IENvc3QgMyB2ZXh0MiBSSFMsIDw2LDQsNSw2PgorICAyNjQ0OTU1ODg5VSwJLy8gPDYsNyw2LDU+OiBDb3N0IDMgdmV4dDIgUkhTLCA8Niw1LDcsNz4KKyAgMTU3MTIxNDEzNlUsCS8vIDw2LDcsNiw2PjogQ29zdCAyIHZleHQyIFJIUywgPDYsNiw2LDY+CisgIDE1NzEyMTQxNThVLAkvLyA8Niw3LDYsNz46IENvc3QgMiB2ZXh0MiBSSFMsIDw2LDcsMCwxPgorICAxNTczMjA0ODk1VSwJLy8gPDYsNyw2LHU+OiBDb3N0IDIgdmV4dDIgUkhTLCA8Nix1LDAsMT4KKyAgMTU3MzIwNDk4NlUsCS8vIDw2LDcsNywwPjogQ29zdCAyIHZleHQyIFJIUywgPDcsMCwxLDI+CisgIDI1NzI2MDg2NTZVLAkvLyA8Niw3LDcsMT46IENvc3QgMyB2ZXh0MSA8Myw2LDcsNz4sIDwxLDUsMyw3PgorICAyNjQ0OTU2MzYyVSwJLy8gPDYsNyw3LDI+OiBDb3N0IDMgdmV4dDIgUkhTLCA8NywyLDYsMz4KKyAgMjU3MjYxMDIzMVUsCS8vIDw2LDcsNywzPjogQ29zdCAzIHZleHQxIDwzLDYsNyw3PiwgPDMsNiw3LDc+CisgIDE1NzMyMDUzNTBVLAkvLyA8Niw3LDcsND46IENvc3QgMiB2ZXh0MiBSSFMsIDw3LDQsNSw2PgorICAyNjQ2OTQ3MjIwVSwJLy8gPDYsNyw3LDU+OiBDb3N0IDMgdmV4dDIgUkhTLCA8Nyw1LDEsNz4KKyAgMTUxNjc4NjQ5OFUsCS8vIDw2LDcsNyw2PjogQ29zdCAyIHZleHQxIDw2LDYsNyw3PiwgPDYsNiw3LDc+CisgIDE1NzEyMTQ5NTZVLAkvLyA8Niw3LDcsNz46IENvc3QgMiB2ZXh0MiBSSFMsIDw3LDcsNyw3PgorICAxNTczMjA1NjM0VSwJLy8gPDYsNyw3LHU+OiBDb3N0IDIgdmV4dDIgUkhTLCA8Nyx1LDEsMj4KKyAgMTU3MTIxNTA1OVUsCS8vIDw2LDcsdSwwPjogQ29zdCAyIHZleHQyIFJIUywgPHUsMCwxLDI+CisgIDQ5NzQ3MzMyNlUsCS8vIDw2LDcsdSwxPjogQ29zdCAxIHZleHQyIFJIUywgTEhTCisgIDE1NzEyMTUyMzdVLAkvLyA8Niw3LHUsMj46IENvc3QgMiB2ZXh0MiBSSFMsIDx1LDIsMywwPgorICAxNTcxMjE1MjkyVSwJLy8gPDYsNyx1LDM+OiBDb3N0IDIgdmV4dDIgUkhTLCA8dSwzLDAsMT4KKyAgMTU3MTIxNTQyM1UsCS8vIDw2LDcsdSw0PjogQ29zdCAyIHZleHQyIFJIUywgPHUsNCw1LDY+CisgIDQ5NzQ3MzY5MFUsCS8vIDw2LDcsdSw1PjogQ29zdCAxIHZleHQyIFJIUywgUkhTCisgIDE1NzEyMTU1NjhVLAkvLyA8Niw3LHUsNj46IENvc3QgMiB2ZXh0MiBSSFMsIDx1LDYsMyw3PgorICAxNTczMjA2MjcyVSwJLy8gPDYsNyx1LDc+OiBDb3N0IDIgdmV4dDIgUkhTLCA8dSw3LDAsMT4KKyAgNDk3NDczODkzVSwJLy8gPDYsNyx1LHU+OiBDb3N0IDEgdmV4dDIgUkhTLCBMSFMKKyAgMTU3MTIxNzQwOFUsCS8vIDw2LHUsMCwwPjogQ29zdCAyIHZleHQyIFJIUywgPDAsMCwwLDA+CisgIDQ5NzQ3NTY4NlUsCS8vIDw2LHUsMCwxPjogQ29zdCAxIHZleHQyIFJIUywgTEhTCisgIDE1NzEyMTc1NzJVLAkvLyA8Nix1LDAsMj46IENvc3QgMiB2ZXh0MiBSSFMsIDwwLDIsMCwyPgorICAyNjg5ODY1NDQ1VSwJLy8gPDYsdSwwLDM+OiBDb3N0IDMgdmV4dDMgPDAsdSwyLDY+LCA8dSwwLDMsMj4KKyAgMTU3MTIxNzc0NlUsCS8vIDw2LHUsMCw0PjogQ29zdCAyIHZleHQyIFJIUywgPDAsNCwxLDU+CisgIDE1MTA4MzAxODdVLAkvLyA8Nix1LDAsNT46IENvc3QgMiB2ZXh0MSA8NSw2LHUsMD4sIDw1LDYsdSwwPgorICAyNjQ0OTU5NzM0VSwJLy8gPDYsdSwwLDY+OiBDb3N0IDMgdmV4dDIgUkhTLCA8MCw2LDEsNz4KKyAgMTE5MzEzMDIyMVUsCS8vIDw2LHUsMCw3PjogQ29zdCAyIHZyZXYgPHUsNiw3LDA+CisgIDQ5NzQ3NjI1M1UsCS8vIDw2LHUsMCx1PjogQ29zdCAxIHZleHQyIFJIUywgTEhTCisgIDE1NzEyMTgxNjZVLAkvLyA8Nix1LDEsMD46IENvc3QgMiB2ZXh0MiBSSFMsIDwxLDAsMywyPgorICAxNTcxMjE4MjI4VSwJLy8gPDYsdSwxLDE+OiBDb3N0IDIgdmV4dDIgUkhTLCA8MSwxLDEsMT4KKyAgMTYxMjI4OTgzOFUsCS8vIDw2LHUsMSwyPjogQ29zdCAyIHZleHQzIDwwLDIsNCw2PiwgTEhTCisgIDE1NzEyMTgzOTJVLAkvLyA8Nix1LDEsMz46IENvc3QgMiB2ZXh0MiBSSFMsIDwxLDMsMSwzPgorICAyNTY2NjYzNDc4VSwJLy8gPDYsdSwxLDQ+OiBDb3N0IDMgdmV4dDEgPDIsNix1LDE+LCBSSFMKKyAgMTU3MTIxODU3NlUsCS8vIDw2LHUsMSw1PjogQ29zdCAyIHZleHQyIFJIUywgPDEsNSwzLDc+CisgIDI2NDQ5NjA0NjNVLAkvLyA8Nix1LDEsNj46IENvc3QgMyB2ZXh0MiBSSFMsIDwxLDYsMSw3PgorICAyNzE3NDM5ODM1VSwJLy8gPDYsdSwxLDc+OiBDb3N0IDMgdmV4dDMgPDUsNCw3LDY+LCA8dSwxLDcsMz4KKyAgMTYxMjI4OTg5MlUsCS8vIDw2LHUsMSx1PjogQ29zdCAyIHZleHQzIDwwLDIsNCw2PiwgTEhTCisgIDE1MDQ4NzA1MDJVLAkvLyA8Nix1LDIsMD46IENvc3QgMiB2ZXh0MSA8NCw2LHUsMj4sIExIUworICAyNjQ0OTYwNzc0VSwJLy8gPDYsdSwyLDE+OiBDb3N0IDMgdmV4dDIgUkhTLCA8MiwxLDAsMz4KKyAgMTU3MTIxOTA0OFUsCS8vIDw2LHUsMiwyPjogQ29zdCAyIHZleHQyIFJIUywgPDIsMiwyLDI+CisgIDE1NzEyMTkxMTBVLAkvLyA8Nix1LDIsMz46IENvc3QgMiB2ZXh0MiBSSFMsIDwyLDMsMCwxPgorICAxNTA0ODczNzgyVSwJLy8gPDYsdSwyLDQ+OiBDb3N0IDIgdmV4dDEgPDQsNix1LDI+LCBSSFMKKyAgMjYzMzAxNzIyMVUsCS8vIDw2LHUsMiw1PjogQ29zdCAzIHZleHQyIDwyLDUsNix1PiwgPDIsNSw2LHU+CisgIDE1NzEyMTkzODZVLAkvLyA8Nix1LDIsNj46IENvc3QgMiB2ZXh0MiBSSFMsIDwyLDYsMyw3PgorICAyNzEyNTczODY4VSwJLy8gPDYsdSwyLDc+OiBDb3N0IDMgdmV4dDMgPDQsNiw0LDY+LCA8dSwyLDcsMz4KKyAgMTU3MTIxOTUxNVUsCS8vIDw2LHUsMix1PjogQ29zdCAyIHZleHQyIFJIUywgPDIsdSwwLDE+CisgIDE1NzEyMTk2MDZVLAkvLyA8Nix1LDMsMD46IENvc3QgMiB2ZXh0MiBSSFMsIDwzLDAsMSwyPgorICAyNjQ0OTYxNTAzVSwJLy8gPDYsdSwzLDE+OiBDb3N0IDMgdmV4dDIgUkhTLCA8MywxLDAsMz4KKyAgMjU2NjY3ODQ5OVUsCS8vIDw2LHUsMywyPjogQ29zdCAzIHZleHQxIDwyLDYsdSwzPiwgPDIsNix1LDM+CisgIDE1NzEyMTk4NjhVLAkvLyA8Nix1LDMsMz46IENvc3QgMiB2ZXh0MiBSSFMsIDwzLDMsMywzPgorICAxNTcxMjE5OTcwVSwJLy8gPDYsdSwzLDQ+OiBDb3N0IDIgdmV4dDIgUkhTLCA8Myw0LDUsNj4KKyAgMjY4OTg2NTcxMVUsCS8vIDw2LHUsMyw1PjogQ29zdCAzIHZleHQzIDwwLHUsMiw2PiwgPHUsMyw1LDc+CisgIDI3MDgwMDI4MDZVLAkvLyA8Nix1LDMsNj46IENvc3QgMyB2ZXh0MyA8Myx1LDUsNj4sIDx1LDMsNiw1PgorICAyNjQ0OTYxOTg3VSwJLy8gPDYsdSwzLDc+OiBDb3N0IDMgdmV4dDIgUkhTLCA8Myw3LDAsMT4KKyAgMTU3MTIyMDI1NFUsCS8vIDw2LHUsMyx1PjogQ29zdCAyIHZleHQyIFJIUywgPDMsdSwxLDI+CisgIDE1NzEyMjAzNzBVLAkvLyA8Nix1LDQsMD46IENvc3QgMiB2ZXh0MiBSSFMsIDw0LDAsNSwxPgorICAyNjQ0OTYyMjUwVSwJLy8gPDYsdSw0LDE+OiBDb3N0IDMgdmV4dDIgUkhTLCA8NCwxLDIsMz4KKyAgMTY2MTI0NTQ3NlUsCS8vIDw2LHUsNCwyPjogQ29zdCAyIHZleHQzIDx1LDQsMiw2PiwgPHUsNCwyLDY+CisgIDI2ODYwMzE5MTdVLAkvLyA8Nix1LDQsMz46IENvc3QgMyB2ZXh0MyA8MCwyLDQsNj4sIDx1LDQsMyw2PgorICAxNTcxMjIwNjg4VSwJLy8gPDYsdSw0LDQ+OiBDb3N0IDIgdmV4dDIgUkhTLCA8NCw0LDQsND4KKyAgNDk3NDc4OTY3VSwJLy8gPDYsdSw0LDU+OiBDb3N0IDEgdmV4dDIgUkhTLCBSSFMKKyAgMTU3MTIyMDg1MlUsCS8vIDw2LHUsNCw2PjogQ29zdCAyIHZleHQyIFJIUywgPDQsNiw0LDY+CisgIDE2NjE2MTQxNjFVLAkvLyA8Nix1LDQsNz46IENvc3QgMiB2ZXh0MyA8dSw0LDcsNj4sIDx1LDQsNyw2PgorICA0OTc0NzkyMDlVLAkvLyA8Nix1LDQsdT46IENvc3QgMSB2ZXh0MiBSSFMsIFJIUworICAyNTY2NjkyOTY2VSwJLy8gPDYsdSw1LDA+OiBDb3N0IDMgdmV4dDEgPDIsNix1LDU+LCBMSFMKKyAgMTU3MTIyMTIwMFUsCS8vIDw2LHUsNSwxPjogQ29zdCAyIHZleHQyIFJIUywgPDUsMSw3LDM+CisgIDI1NjY2OTQ4ODVVLAkvLyA8Nix1LDUsMj46IENvc3QgMyB2ZXh0MSA8Miw2LHUsNT4sIDwyLDYsdSw1PgorICAyNjg5ODY1ODU1VSwJLy8gPDYsdSw1LDM+OiBDb3N0IDMgdmV4dDMgPDAsdSwyLDY+LCA8dSw1LDMsNz4KKyAgMTU3MTIyMTQ0NlUsCS8vIDw2LHUsNSw0PjogQ29zdCAyIHZleHQyIFJIUywgPDUsNCw3LDY+CisgIDE1NzEyMjE1MDhVLAkvLyA8Nix1LDUsNT46IENvc3QgMiB2ZXh0MiBSSFMsIDw1LDUsNSw1PgorICAxNjEyMjkwMjAyVSwJLy8gPDYsdSw1LDY+OiBDb3N0IDIgdmV4dDMgPDAsMiw0LDY+LCBSSFMKKyAgMTU3MTIyMTY3MlUsCS8vIDw2LHUsNSw3PjogQ29zdCAyIHZleHQyIFJIUywgPDUsNyw1LDc+CisgIDE2MTIyOTAyMjBVLAkvLyA8Nix1LDUsdT46IENvc3QgMiB2ZXh0MyA8MCwyLDQsNj4sIFJIUworICAxNTA0OTAzMjcwVSwJLy8gPDYsdSw2LDA+OiBDb3N0IDIgdmV4dDEgPDQsNix1LDY+LCBMSFMKKyAgMjY0NDk2Mzc1MlUsCS8vIDw2LHUsNiwxPjogQ29zdCAzIHZleHQyIFJIUywgPDYsMSw3LDI+CisgIDE1NzEyMjIwMTBVLAkvLyA8Nix1LDYsMj46IENvc3QgMiB2ZXh0MiBSSFMsIDw2LDIsNywzPgorICAyNjg2MDMyMDgwVSwJLy8gPDYsdSw2LDM+OiBDb3N0IDMgdmV4dDMgPDAsMiw0LDY+LCA8dSw2LDMsNz4KKyAgMTUwNDkwNjU1MFUsCS8vIDw2LHUsNiw0PjogQ29zdCAyIHZleHQxIDw0LDYsdSw2PiwgUkhTCisgIDI2NDQ5NjQwNzlVLAkvLyA8Nix1LDYsNT46IENvc3QgMyB2ZXh0MiBSSFMsIDw2LDUsNyw1PgorICAyOTYxNDQxODJVLAkvLyA8Nix1LDYsNj46IENvc3QgMSB2ZHVwMiBSSFMKKyAgMTU3MTIyMjM1MFUsCS8vIDw2LHUsNiw3PjogQ29zdCAyIHZleHQyIFJIUywgPDYsNywwLDE+CisgIDI5NjE0NDE4MlUsCS8vIDw2LHUsNix1PjogQ29zdCAxIHZkdXAyIFJIUworICAxNDkyOTY3NTI2VSwJLy8gPDYsdSw3LDA+OiBDb3N0IDIgdmV4dDEgPDIsNix1LDc+LCBMSFMKKyAgMjU2MDczODU3NFUsCS8vIDw2LHUsNywxPjogQ29zdCAzIHZleHQxIDwxLDYsdSw3PiwgPDEsNix1LDc+CisgIDE0OTI5Njk0NDdVLAkvLyA8Nix1LDcsMj46IENvc3QgMiB2ZXh0MSA8Miw2LHUsNz4sIDwyLDYsdSw3PgorICAxOTA2NzUzNjkyVSwJLy8gPDYsdSw3LDM+OiBDb3N0IDIgdnppcHIgUkhTLCBMSFMKKyAgMTQ5Mjk3MDgwNlUsCS8vIDw2LHUsNyw0PjogQ29zdCAyIHZleHQxIDwyLDYsdSw3PiwgUkhTCisgIDI5ODA0OTU3NjFVLAkvLyA8Nix1LDcsNT46IENvc3QgMyB2emlwciBSSFMsIDwwLDQsdSw1PgorICAxNTE2ODYwMjM1VSwJLy8gPDYsdSw3LDY+OiBDb3N0IDIgdmV4dDEgPDYsNix1LDc+LCA8Niw2LHUsNz4KKyAgMTkwNjc1NjkzNlUsCS8vIDw2LHUsNyw3PjogQ29zdCAyIHZ6aXByIFJIUywgUkhTCisgIDE0OTI5NzMzNThVLAkvLyA8Nix1LDcsdT46IENvc3QgMiB2ZXh0MSA8Miw2LHUsNz4sIExIUworICAxNDkyOTc1NzE4VSwJLy8gPDYsdSx1LDA+OiBDb3N0IDIgdmV4dDEgPDIsNix1LHU+LCBMSFMKKyAgNDk3NDgxNTE4VSwJLy8gPDYsdSx1LDE+OiBDb3N0IDEgdmV4dDIgUkhTLCBMSFMKKyAgMTYxMjI5MDQwNVUsCS8vIDw2LHUsdSwyPjogQ29zdCAyIHZleHQzIDwwLDIsNCw2PiwgTEhTCisgIDE1NzEyMjM0ODRVLAkvLyA8Nix1LHUsMz46IENvc3QgMiB2ZXh0MiBSSFMsIDx1LDMsMCwxPgorICAxNDkyOTc4OTk4VSwJLy8gPDYsdSx1LDQ+OiBDb3N0IDIgdmV4dDEgPDIsNix1LHU+LCBSSFMKKyAgNDk3NDgxODgyVSwJLy8gPDYsdSx1LDU+OiBDb3N0IDEgdmV4dDIgUkhTLCBSSFMKKyAgMjk2MTQ0MTgyVSwJLy8gPDYsdSx1LDY+OiBDb3N0IDEgdmR1cDIgUkhTCisgIDE5MDY3NjUxMjhVLAkvLyA8Nix1LHUsNz46IENvc3QgMiB2emlwciBSSFMsIFJIUworICA0OTc0ODIwODVVLAkvLyA8Nix1LHUsdT46IENvc3QgMSB2ZXh0MiBSSFMsIExIUworICAxNjM4MzE4MDgwVSwJLy8gPDcsMCwwLDA+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MCwwLDAsMD4KKyAgMTYzODMxODA5MFUsCS8vIDw3LDAsMCwxPjogQ29zdCAyIHZleHQzIFJIUywgPDAsMCwxLDE+CisgIDE2MzgzMTgxMDBVLAkvLyA8NywwLDAsMj46IENvc3QgMiB2ZXh0MyBSSFMsIDwwLDAsMiwyPgorICAzNjQ2NDQyMTc4VSwJLy8gPDcsMCwwLDM+OiBDb3N0IDQgdmV4dDEgPDMsNywwLDA+LCA8Myw3LDAsMD4KKyAgMjcxMjA1OTk0MVUsCS8vIDw3LDAsMCw0PjogQ29zdCAzIHZleHQzIFJIUywgPDAsMCw0LDE+CisgIDI2NTE2MDMzNjRVLAkvLyA8NywwLDAsNT46IENvc3QgMyB2ZXh0MiA8NSw2LDcsMD4sIDwwLDUsMSw2PgorICAyNTkwNjE4NDQ1VSwJLy8gPDcsMCwwLDY+OiBDb3N0IDMgdmV4dDEgPDYsNywwLDA+LCA8Niw3LDAsMD4KKyAgMzc4NTgwMTc5OFUsCS8vIDw3LDAsMCw3PjogQ29zdCA0IHZleHQzIFJIUywgPDAsMCw3LDc+CisgIDE2MzgzMTgxNTNVLAkvLyA8NywwLDAsdT46IENvc3QgMiB2ZXh0MyBSSFMsIDwwLDAsdSwxPgorICAxNTE2ODc5OTc0VSwJLy8gPDcsMCwxLDA+OiBDb3N0IDIgdmV4dDEgPDYsNywwLDE+LCBMSFMKKyAgMjY5MzkyMjkxMVUsCS8vIDw3LDAsMSwxPjogQ29zdCAzIHZleHQzIDwxLDUsMyw3PiwgPDAsMSwxLDU+CisgIDU2NDU3NjM1OFUsCS8vIDw3LDAsMSwyPjogQ29zdCAxIHZleHQzIFJIUywgTEhTCisgIDI2Mzg5OTY0ODBVLAkvLyA8NywwLDEsMz46IENvc3QgMyB2ZXh0MiA8Myw1LDcsMD4sIDwxLDMsNSw3PgorICAxNTE2ODgzMjU0VSwJLy8gPDcsMCwxLDQ+OiBDb3N0IDIgdmV4dDEgPDYsNywwLDE+LCBSSFMKKyAgMjY0OTYxMzQ1NlUsCS8vIDw3LDAsMSw1PjogQ29zdCAzIHZleHQyIDw1LDMsNywwPiwgPDEsNSwzLDc+CisgIDE1MTY4ODQ4MTRVLAkvLyA8NywwLDEsNj46IENvc3QgMiB2ZXh0MSA8Niw3LDAsMT4sIDw2LDcsMCwxPgorICAyNTkwNjI2ODA4VSwJLy8gPDcsMCwxLDc+OiBDb3N0IDMgdmV4dDEgPDYsNywwLDE+LCA8NywwLDEsMD4KKyAgNTY0NTc2NDEyVSwJLy8gPDcsMCwxLHU+OiBDb3N0IDEgdmV4dDMgUkhTLCBMSFMKKyAgMTYzODMxODI0NFUsCS8vIDw3LDAsMiwwPjogQ29zdCAyIHZleHQzIFJIUywgPDAsMiwwLDI+CisgIDI2OTI3NDMzNDRVLAkvLyA8NywwLDIsMT46IENvc3QgMyB2ZXh0MyA8MSwzLDUsNz4sIDwwLDIsMSw1PgorICAyNzEyMDYwMDg0VSwJLy8gPDcsMCwyLDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MCwyLDIsMD4KKyAgMjcxMjA2MDA5NFUsCS8vIDw3LDAsMiwzPjogQ29zdCAzIHZleHQzIFJIUywgPDAsMiwzLDE+CisgIDE2MzgzMTgyODRVLAkvLyA8NywwLDIsND46IENvc3QgMiB2ZXh0MyBSSFMsIDwwLDIsNCw2PgorICAyNzEyMDYwMTE4VSwJLy8gPDcsMCwyLDU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MCwyLDUsNz4KKyAgMjY1MTYwNDkyMlUsCS8vIDw3LDAsMiw2PjogQ29zdCAzIHZleHQyIDw1LDYsNywwPiwgPDIsNiwzLDc+CisgIDI2ODYyNTUzMzZVLAkvLyA8NywwLDIsNz46IENvc3QgMyB2ZXh0MyA8MCwyLDcsNz4sIDwwLDIsNyw3PgorICAxNjM4MzE4MzE2VSwJLy8gPDcsMCwyLHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MCwyLHUsMj4KKyAgMjY1MTYwNTE0MlUsCS8vIDw3LDAsMywwPjogQ29zdCAzIHZleHQyIDw1LDYsNywwPiwgPDMsMCwxLDI+CisgIDI3MTIwNjAxNTZVLAkvLyA8NywwLDMsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDwwLDMsMSwwPgorICAyNzEyMDYwMTY1VSwJLy8gPDcsMCwzLDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MCwzLDIsMD4KKyAgMjY1MTYwNTQwNFUsCS8vIDw3LDAsMywzPjogQ29zdCAzIHZleHQyIDw1LDYsNywwPiwgPDMsMywzLDM+CisgIDI2NTE2MDU1MDZVLAkvLyA8NywwLDMsND46IENvc3QgMyB2ZXh0MiA8NSw2LDcsMD4sIDwzLDQsNSw2PgorICAyNjM4OTk4MTExVSwJLy8gPDcsMCwzLDU+OiBDb3N0IDMgdmV4dDIgPDMsNSw3LDA+LCA8Myw1LDcsMD4KKyAgMjYzOTY2MTc0NFUsCS8vIDw3LDAsMyw2PjogQ29zdCAzIHZleHQyIDwzLDYsNywwPiwgPDMsNiw3LDA+CisgIDM3MTI3NDAwNjhVLAkvLyA8NywwLDMsNz46IENvc3QgNCB2ZXh0MiA8Myw1LDcsMD4sIDwzLDcsMyw3PgorICAyNjQwOTg5MDEwVSwJLy8gPDcsMCwzLHU+OiBDb3N0IDMgdmV4dDIgPDMsdSw3LDA+LCA8Myx1LDcsMD4KKyAgMjcxMjA2MDIzMlUsCS8vIDw3LDAsNCwwPjogQ29zdCAzIHZleHQzIFJIUywgPDAsNCwwLDQ+CisgIDE2MzgzMTg0MThVLAkvLyA8NywwLDQsMT46IENvc3QgMiB2ZXh0MyBSSFMsIDwwLDQsMSw1PgorICAxNjM4MzE4NDI4VSwJLy8gPDcsMCw0LDI+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MCw0LDIsNj4KKyAgMzY0NjQ3NDk1MFUsCS8vIDw3LDAsNCwzPjogQ29zdCA0IHZleHQxIDwzLDcsMCw0PiwgPDMsNywwLDQ+CisgIDI3MTIwNjAyNzBVLAkvLyA8NywwLDQsND46IENvc3QgMyB2ZXh0MyBSSFMsIDwwLDQsNCw2PgorICAxNTc3ODY0NTAyVSwJLy8gPDcsMCw0LDU+OiBDb3N0IDIgdmV4dDIgPDUsNiw3LDA+LCBSSFMKKyAgMjY1MTYwNjM4OFUsCS8vIDw3LDAsNCw2PjogQ29zdCAzIHZleHQyIDw1LDYsNywwPiwgPDQsNiw0LDY+CisgIDM3ODc3OTI3NzZVLAkvLyA8NywwLDQsNz46IENvc3QgNCB2ZXh0MyBSSFMsIDwwLDQsNyw1PgorICAxNjM4MzE4NDgxVSwJLy8gPDcsMCw0LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MCw0LHUsNT4KKyAgMjU5MDY1NDU2NlUsCS8vIDw3LDAsNSwwPjogQ29zdCAzIHZleHQxIDw2LDcsMCw1PiwgTEhTCisgIDI2NTE2MDY3MzZVLAkvLyA8NywwLDUsMT46IENvc3QgMyB2ZXh0MiA8NSw2LDcsMD4sIDw1LDEsNywzPgorICAyNzEyMDYwMzM0VSwJLy8gPDcsMCw1LDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MCw1LDIsNz4KKyAgMjY0OTYxNjIzOVUsCS8vIDw3LDAsNSwzPjogQ29zdCAzIHZleHQyIDw1LDMsNywwPiwgPDUsMyw3LDA+CisgIDI2NTE2MDY5ODJVLAkvLyA8NywwLDUsND46IENvc3QgMyB2ZXh0MiA8NSw2LDcsMD4sIDw1LDQsNyw2PgorICAyNjUxNjA3MDQ0VSwJLy8gPDcsMCw1LDU+OiBDb3N0IDMgdmV4dDIgPDUsNiw3LDA+LCA8NSw1LDUsNT4KKyAgMTU3Nzg2NTMxNFUsCS8vIDw3LDAsNSw2PjogQ29zdCAyIHZleHQyIDw1LDYsNywwPiwgPDUsNiw3LDA+CisgIDI2NTE2MDcyMDhVLAkvLyA8NywwLDUsNz46IENvc3QgMyB2ZXh0MiA8NSw2LDcsMD4sIDw1LDcsNSw3PgorICAxNTc5MTkyNTgwVSwJLy8gPDcsMCw1LHU+OiBDb3N0IDIgdmV4dDIgPDUsdSw3LDA+LCA8NSx1LDcsMD4KKyAgMjY4ODM5MzcwOVUsCS8vIDw3LDAsNiwwPjogQ29zdCAzIHZleHQzIDwwLDYsMCw3PiwgPDAsNiwwLDc+CisgIDI3MTIwNjA0MDZVLAkvLyA8NywwLDYsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDwwLDYsMSw3PgorICAyNjg4NTQxMTgzVSwJLy8gPDcsMCw2LDI+OiBDb3N0IDMgdmV4dDMgPDAsNiwyLDc+LCA8MCw2LDIsNz4KKyAgMjY1NTU4ODkzNlUsCS8vIDw3LDAsNiwzPjogQ29zdCAzIHZleHQyIDw2LDMsNywwPiwgPDYsMyw3LDA+CisgIDM3NjI0MzA0ODFVLAkvLyA8NywwLDYsND46IENvc3QgNCB2ZXh0MyA8MCw2LDQsNz4sIDwwLDYsNCw3PgorICAyNjUxNjA3NzMwVSwJLy8gPDcsMCw2LDU+OiBDb3N0IDMgdmV4dDIgPDUsNiw3LDA+LCA8Niw1LDAsNz4KKyAgMjY1MTYwNzg2NFUsCS8vIDw3LDAsNiw2PjogQ29zdCAzIHZleHQyIDw1LDYsNywwPiwgPDYsNiw2LDY+CisgIDI2NTE2MDc4ODZVLAkvLyA8NywwLDYsNz46IENvc3QgMyB2ZXh0MiA8NSw2LDcsMD4sIDw2LDcsMCwxPgorICAyNjg4OTgzNjA1VSwJLy8gPDcsMCw2LHU+OiBDb3N0IDMgdmV4dDMgPDAsNix1LDc+LCA8MCw2LHUsNz4KKyAgMjY1MTYwODA1OFUsCS8vIDw3LDAsNywwPjogQ29zdCAzIHZleHQyIDw1LDYsNywwPiwgPDcsMCwxLDI+CisgIDI5MzI3MDMzMzRVLAkvLyA8NywwLDcsMT46IENvc3QgMyB2emlwbCA8Nyw3LDcsNz4sIExIUworICAzMDY2OTIxMDYyVSwJLy8gPDcsMCw3LDI+OiBDb3N0IDMgdnRybmwgPDcsNyw3LDc+LCBMSFMKKyAgMzcxMjc0MjY3OFUsCS8vIDw3LDAsNywzPjogQ29zdCA0IHZleHQyIDwzLDUsNywwPiwgPDcsMyw1LDc+CisgIDI2NTE2MDg0MjJVLAkvLyA8NywwLDcsND46IENvc3QgMyB2ZXh0MiA8NSw2LDcsMD4sIDw3LDQsNSw2PgorICAyNjUxNjA4NTEzVSwJLy8gPDcsMCw3LDU+OiBDb3N0IDMgdmV4dDIgPDUsNiw3LDA+LCA8Nyw1LDYsNz4KKyAgMjY2MzU1MjUzMlUsCS8vIDw3LDAsNyw2PjogQ29zdCAzIHZleHQyIDw3LDYsNywwPiwgPDcsNiw3LDA+CisgIDI2NTE2MDg2ODRVLAkvLyA8NywwLDcsNz46IENvc3QgMyB2ZXh0MiA8NSw2LDcsMD4sIDw3LDcsNyw3PgorICAyNjUxNjA4NzA2VSwJLy8gPDcsMCw3LHU+OiBDb3N0IDMgdmV4dDIgPDUsNiw3LDA+LCA8Nyx1LDEsMj4KKyAgMTYzODMxODczMFUsCS8vIDw3LDAsdSwwPjogQ29zdCAyIHZleHQzIFJIUywgPDAsdSwwLDI+CisgIDE2MzgzMTg3MzhVLAkvLyA8NywwLHUsMT46IENvc3QgMiB2ZXh0MyBSSFMsIDwwLHUsMSwxPgorICA1NjQ1NzY5MjVVLAkvLyA8NywwLHUsMj46IENvc3QgMSB2ZXh0MyBSSFMsIExIUworICAyNTcyNzY1ODk4VSwJLy8gPDcsMCx1LDM+OiBDb3N0IDMgdmV4dDEgPDMsNywwLHU+LCA8Myw3LDAsdT4KKyAgMTYzODMxODc3MFUsCS8vIDw3LDAsdSw0PjogQ29zdCAyIHZleHQzIFJIUywgPDAsdSw0LDY+CisgIDE1Nzc4Njc0MThVLAkvLyA8NywwLHUsNT46IENvc3QgMiB2ZXh0MiA8NSw2LDcsMD4sIFJIUworICAxNTE2OTQyMTY1VSwJLy8gPDcsMCx1LDY+OiBDb3N0IDIgdmV4dDEgPDYsNywwLHU+LCA8Niw3LDAsdT4KKyAgMjY1MTYwOTM0NFUsCS8vIDw3LDAsdSw3PjogQ29zdCAzIHZleHQyIDw1LDYsNywwPiwgPHUsNywwLDE+CisgIDU2NDU3Njk3OVUsCS8vIDw3LDAsdSx1PjogQ29zdCAxIHZleHQzIFJIUywgTEhTCisgIDI1OTA2ODczMzRVLAkvLyA8NywxLDAsMD46IENvc3QgMyB2ZXh0MSA8Niw3LDEsMD4sIExIUworICAyNjM5MDAzNzUwVSwJLy8gPDcsMSwwLDE+OiBDb3N0IDMgdmV4dDIgPDMsNSw3LDE+LCBMSFMKKyAgMjc5MzM1NzQxNFUsCS8vIDw3LDEsMCwyPjogQ29zdCAzIHZ1enBsIDw3LDAsMSwyPiwgTEhTCisgIDE2MzgzMTg4MzhVLAkvLyA8NywxLDAsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDwxLDAsMywyPgorICAyNTkwNjkwNjE0VSwJLy8gPDcsMSwwLDQ+OiBDb3N0IDMgdmV4dDEgPDYsNywxLDA+LCBSSFMKKyAgMjcxMjA2MDY3OVUsCS8vIDw3LDEsMCw1PjogQ29zdCAzIHZleHQzIFJIUywgPDEsMCw1LDE+CisgIDI1OTA2OTIxODJVLAkvLyA8NywxLDAsNj46IENvc3QgMyB2ZXh0MSA8Niw3LDEsMD4sIDw2LDcsMSwwPgorICAzNzg1ODAyNTIxVSwJLy8gPDcsMSwwLDc+OiBDb3N0IDQgdmV4dDMgUkhTLCA8MSwwLDcsMT4KKyAgMTYzODMxODg4M1UsCS8vIDw3LDEsMCx1PjogQ29zdCAyIHZleHQzIFJIUywgPDEsMCx1LDI+CisgIDI3MTIwNjA3MTVVLAkvLyA8NywxLDEsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwxLDEsMCwxPgorICAxNjM4MzE4OTAwVSwJLy8gPDcsMSwxLDE+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MSwxLDEsMT4KKyAgMzc3NDMwMDk5NFUsCS8vIDw3LDEsMSwyPjogQ29zdCA0IHZleHQzIDwyLDYsMyw3PiwgPDEsMSwyLDY+CisgIDE2MzgzMTg5MjBVLAkvLyA8NywxLDEsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDwxLDEsMywzPgorICAyNzEyMDYwNzU1VSwJLy8gPDcsMSwxLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MSwxLDQsNT4KKyAgMjY5MTQxNjkyNlUsCS8vIDw3LDEsMSw1PjogQ29zdCAzIHZleHQzIDwxLDEsNSw3PiwgPDEsMSw1LDc+CisgIDI1OTA3MDAzNzVVLAkvLyA8NywxLDEsNj46IENvc3QgMyB2ZXh0MSA8Niw3LDEsMT4sIDw2LDcsMSwxPgorICAzNzY1MTU4NzY2VSwJLy8gPDcsMSwxLDc+OiBDb3N0IDQgdmV4dDMgPDEsMSw1LDc+LCA8MSwxLDcsNT4KKyAgMTYzODMxODk2NVUsCS8vIDw3LDEsMSx1PjogQ29zdCAyIHZleHQzIFJIUywgPDEsMSx1LDM+CisgIDI3MTIwNjA3OTZVLAkvLyA8NywxLDIsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwxLDIsMCwxPgorICAyNzEyMDYwODA3VSwJLy8gPDcsMSwyLDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MSwyLDEsMz4KKyAgMzcxMjc0NzExMlUsCS8vIDw3LDEsMiwyPjogQ29zdCA0IHZleHQyIDwzLDUsNywxPiwgPDIsMiwyLDI+CisgIDE2MzgzMTg5OThVLAkvLyA8NywxLDIsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDwxLDIsMywwPgorICAyNzEyMDYwODM2VSwJLy8gPDcsMSwyLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MSwyLDQsNT4KKyAgMjcxMjA2MDg0M1UsCS8vIDw3LDEsMiw1PjogQ29zdCAzIHZleHQzIFJIUywgPDEsMiw1LDM+CisgIDI1OTA3MDg1NjhVLAkvLyA8NywxLDIsNj46IENvc3QgMyB2ZXh0MSA8Niw3LDEsMj4sIDw2LDcsMSwyPgorICAyNzM1OTQ4NzMwVSwJLy8gPDcsMSwyLDc+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MSwyLDcsMD4KKyAgMTYzODMxOTA0M1UsCS8vIDw3LDEsMix1PjogQ29zdCAyIHZleHQzIFJIUywgPDEsMix1LDA+CisgIDI3MTIwNjA4NzZVLAkvLyA8NywxLDMsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwxLDMsMCwwPgorICAxNjM4MzE5MDY0VSwJLy8gPDcsMSwzLDE+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MSwzLDEsMz4KKyAgMjcxMjA2MDg5NFUsCS8vIDw3LDEsMywyPjogQ29zdCAzIHZleHQzIFJIUywgPDEsMywyLDA+CisgIDI2OTI1OTY3MThVLAkvLyA8NywxLDMsMz46IENvc3QgMyB2ZXh0MyA8MSwzLDMsNz4sIDwxLDMsMyw3PgorICAyNzEyMDYwOTE3VSwJLy8gPDcsMSwzLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MSwzLDQsNT4KKyAgMTYxOTAwMjM2OFUsCS8vIDw3LDEsMyw1PjogQ29zdCAyIHZleHQzIDwxLDMsNSw3PiwgPDEsMyw1LDc+CisgIDI2OTI4MTc5MjlVLAkvLyA8NywxLDMsNj46IENvc3QgMyB2ZXh0MyA8MSwzLDYsNz4sIDwxLDMsNiw3PgorICAyNzM1OTQ4ODE0VSwJLy8gPDcsMSwzLDc+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MSwzLDcsMz4KKyAgMTYxOTIyMzU3OVUsCS8vIDw3LDEsMyx1PjogQ29zdCAyIHZleHQzIDwxLDMsdSw3PiwgPDEsMyx1LDc+CisgIDI3MTIwNjA5NjJVLAkvLyA8NywxLDQsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwxLDQsMCw1PgorICAyNzEyMDYwOTcxVSwJLy8gPDcsMSw0LDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MSw0LDEsNT4KKyAgMjcxMjA2MDk4MFUsCS8vIDw3LDEsNCwyPjogQ29zdCAzIHZleHQzIFJIUywgPDEsNCwyLDU+CisgIDI3MTIwNjA5ODlVLAkvLyA8NywxLDQsMz46IENvc3QgMyB2ZXh0MyBSSFMsIDwxLDQsMyw1PgorICAzNzg1ODAyODIyVSwJLy8gPDcsMSw0LDQ+OiBDb3N0IDQgdmV4dDMgUkhTLCA8MSw0LDQsNT4KKyAgMjYzOTAwNzAzMFUsCS8vIDw3LDEsNCw1PjogQ29zdCAzIHZleHQyIDwzLDUsNywxPiwgUkhTCisgIDI2NDU2NDI2MzRVLAkvLyA8NywxLDQsNj46IENvc3QgMyB2ZXh0MiA8NCw2LDcsMT4sIDw0LDYsNywxPgorICAzNzE5Mzg0NTIwVSwJLy8gPDcsMSw0LDc+OiBDb3N0IDQgdmV4dDIgPDQsNiw3LDE+LCA8NCw3LDUsMD4KKyAgMjYzOTAwNzI3M1UsCS8vIDw3LDEsNCx1PjogQ29zdCAzIHZleHQyIDwzLDUsNywxPiwgUkhTCisgIDI1NzI4MTIzOTBVLAkvLyA8NywxLDUsMD46IENvc3QgMyB2ZXh0MSA8Myw3LDEsNT4sIExIUworICAyNjkzNzc2NTEwVSwJLy8gPDcsMSw1LDE+OiBDb3N0IDMgdmV4dDMgPDEsNSwxLDc+LCA8MSw1LDEsNz4KKyAgMzc3NDMwMTMxOFUsCS8vIDw3LDEsNSwyPjogQ29zdCA0IHZleHQzIDwyLDYsMyw3PiwgPDEsNSwyLDY+CisgIDE2MjAxODIxNjBVLAkvLyA8NywxLDUsMz46IENvc3QgMiB2ZXh0MyA8MSw1LDMsNz4sIDwxLDUsMyw3PgorICAyNTcyODE1NjcwVSwJLy8gPDcsMSw1LDQ+OiBDb3N0IDMgdmV4dDEgPDMsNywxLDU+LCBSSFMKKyAgMzc2NjQ4NjE3OFUsCS8vIDw3LDEsNSw1PjogQ29zdCA0IHZleHQzIDwxLDMsNSw3PiwgPDEsNSw1LDc+CisgIDI2NTE2MTUzMzFVLAkvLyA8NywxLDUsNj46IENvc3QgMyB2ZXh0MiA8NSw2LDcsMT4sIDw1LDYsNywxPgorICAyNjUyMjc4OTY0VSwJLy8gPDcsMSw1LDc+OiBDb3N0IDMgdmV4dDIgPDUsNyw3LDE+LCA8NSw3LDcsMT4KKyAgMTYyMDU1MDg0NVUsCS8vIDw3LDEsNSx1PjogQ29zdCAyIHZleHQzIDwxLDUsdSw3PiwgPDEsNSx1LDc+CisgIDM3NjgxMDgyMzBVLAkvLyA8NywxLDYsMD46IENvc3QgNCB2ZXh0MyA8MSw2LDAsNz4sIDwxLDYsMCw3PgorICAyNjk0NDQwMTQzVSwJLy8gPDcsMSw2LDE+OiBDb3N0IDMgdmV4dDMgPDEsNiwxLDc+LCA8MSw2LDEsNz4KKyAgMjcxMjA2MTE0NFUsCS8vIDw3LDEsNiwyPjogQ29zdCAzIHZleHQzIFJIUywgPDEsNiwyLDc+CisgIDI2OTQ1ODc2MTdVLAkvLyA8NywxLDYsMz46IENvc3QgMyB2ZXh0MyA8MSw2LDMsNz4sIDwxLDYsMyw3PgorICAzNzY4NDAzMTc4VSwJLy8gPDcsMSw2LDQ+OiBDb3N0IDQgdmV4dDMgPDEsNiw0LDc+LCA8MSw2LDQsNz4KKyAgMjY5NDczNTA5MVUsCS8vIDw3LDEsNiw1PjogQ29zdCAzIHZleHQzIDwxLDYsNSw3PiwgPDEsNiw1LDc+CisgIDM3Njg1NTA2NTJVLAkvLyA8NywxLDYsNj46IENvc3QgNCB2ZXh0MyA8MSw2LDYsNz4sIDwxLDYsNiw3PgorICAyNjUyMjc5NjMwVSwJLy8gPDcsMSw2LDc+OiBDb3N0IDMgdmV4dDIgPDUsNyw3LDE+LCA8Niw3LDAsMT4KKyAgMjY5NDk1NjMwMlUsCS8vIDw3LDEsNix1PjogQ29zdCAzIHZleHQzIDwxLDYsdSw3PiwgPDEsNix1LDc+CisgIDI2NDU2NDQyODJVLAkvLyA8NywxLDcsMD46IENvc3QgMyB2ZXh0MiA8NCw2LDcsMT4sIDw3LDAsMSwyPgorICAyODU5MDYyMDk0VSwJLy8gPDcsMSw3LDE+OiBDb3N0IDMgdnV6cHIgPDYsNywwLDE+LCA8Niw3LDAsMT4KKyAgMzc3OTQ2MjQzN1UsCS8vIDw3LDEsNywyPjogQ29zdCA0IHZleHQzIDwzLDUsMSw3PiwgPDEsNywyLDM+CisgIDMxMjE5Mzg1MzRVLAkvLyA8NywxLDcsMz46IENvc3QgMyB2dHJuciA8NSw3LDUsNz4sIExIUworICAyNTU0OTE2MTUwVSwJLy8gPDcsMSw3LDQ+OiBDb3N0IDMgdmV4dDEgPDAsNywxLDc+LCBSSFMKKyAgMzc2OTE0MDU0OFUsCS8vIDw3LDEsNyw1PjogQ29zdCA0IHZleHQzIDwxLDcsNSw3PiwgPDEsNyw1LDc+CisgIDM3MjYwMjIxNjRVLAkvLyA8NywxLDcsNj46IENvc3QgNCB2ZXh0MiA8NSw3LDcsMT4sIDw3LDYsNywwPgorICAyNTU0OTE4NTA4VSwJLy8gPDcsMSw3LDc+OiBDb3N0IDMgdmV4dDEgPDAsNywxLDc+LCA8Nyw3LDcsNz4KKyAgMzEyMTkzODUzOVUsCS8vIDw3LDEsNyx1PjogQ29zdCAzIHZ0cm5yIDw1LDcsNSw3PiwgTEhTCisgIDI1NzI4MzY5NjZVLAkvLyA8NywxLHUsMD46IENvc3QgMyB2ZXh0MSA8Myw3LDEsdT4sIExIUworICAxNjM4MzE5NDY5VSwJLy8gPDcsMSx1LDE+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MSx1LDEsMz4KKyAgMjcxMjA2MTI5OVUsCS8vIDw3LDEsdSwyPjogQ29zdCAzIHZleHQzIFJIUywgPDEsdSwyLDA+CisgIDE2MjIxNzMwNTlVLAkvLyA8NywxLHUsMz46IENvc3QgMiB2ZXh0MyA8MSx1LDMsNz4sIDwxLHUsMyw3PgorICAyNTcyODQwMjQ2VSwJLy8gPDcsMSx1LDQ+OiBDb3N0IDMgdmV4dDEgPDMsNywxLHU+LCBSSFMKKyAgMTYyMjMyMDUzM1UsCS8vIDw3LDEsdSw1PjogQ29zdCAyIHZleHQzIDwxLHUsNSw3PiwgPDEsdSw1LDc+CisgIDI2OTYxMzYwOTRVLAkvLyA8NywxLHUsNj46IENvc3QgMyB2ZXh0MyA8MSx1LDYsNz4sIDwxLHUsNiw3PgorICAyODU5MDYwNzc3VSwJLy8gPDcsMSx1LDc+OiBDb3N0IDMgdnV6cHIgPDYsNywwLDE+LCBSSFMKKyAgMTYyMjU0MTc0NFUsCS8vIDw3LDEsdSx1PjogQ29zdCAyIHZleHQzIDwxLHUsdSw3PiwgPDEsdSx1LDc+CisgIDI3MTIwNjEzNjRVLAkvLyA8NywyLDAsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDAsMCwyPgorICAyNzEyMDYxMzczVSwJLy8gPDcsMiwwLDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MiwwLDEsMj4KKyAgMjcxMjA2MTM4MFUsCS8vIDw3LDIsMCwyPjogQ29zdCAzIHZleHQzIFJIUywgPDIsMCwyLDA+CisgIDI3MTIwNjEzODlVLAkvLyA8NywyLDAsMz46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDAsMywwPgorICAyNzEyMDYxNDA0VSwJLy8gPDcsMiwwLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MiwwLDQsNj4KKyAgMjY5NjcyNTk5MFUsCS8vIDw3LDIsMCw1PjogQ29zdCAzIHZleHQzIDwyLDAsNSw3PiwgPDIsMCw1LDc+CisgIDI3MTIwNjE0MTdVLAkvLyA8NywyLDAsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDAsNiwxPgorICAzNzg1ODAzMjUxVSwJLy8gPDcsMiwwLDc+OiBDb3N0IDQgdmV4dDMgUkhTLCA8MiwwLDcsMj4KKyAgMjY5Njk0NzIwMVUsCS8vIDw3LDIsMCx1PjogQ29zdCAzIHZleHQzIDwyLDAsdSw3PiwgPDIsMCx1LDc+CisgIDI3MTIwNjE0NDZVLAkvLyA8NywyLDEsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDEsMCwzPgorICAzNzg1ODAzMjc2VSwJLy8gPDcsMiwxLDE+OiBDb3N0IDQgdmV4dDMgUkhTLCA8MiwxLDEsMD4KKyAgMzc4NTgwMzI4NVUsCS8vIDw3LDIsMSwyPjogQ29zdCA0IHZleHQzIFJIUywgPDIsMSwyLDA+CisgIDI3MTIwNjE0NzFVLAkvLyA8NywyLDEsMz46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDEsMywxPgorICAyNzEyMDYxNDgyVSwJLy8gPDcsMiwxLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MiwxLDQsMz4KKyAgMzc2NjQ4NjU3NlUsCS8vIDw3LDIsMSw1PjogQ29zdCA0IHZleHQzIDwxLDMsNSw3PiwgPDIsMSw1LDA+CisgIDI3MTIwNjE1MDBVLAkvLyA8NywyLDEsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDEsNiwzPgorICAyNjAyNzE4ODUwVSwJLy8gPDcsMiwxLDc+OiBDb3N0IDMgdmV4dDEgPHUsNywyLDE+LCA8Nyx1LDEsMj4KKyAgMjcxMjA2MTUxNlUsCS8vIDw3LDIsMSx1PjogQ29zdCAzIHZleHQzIFJIUywgPDIsMSx1LDE+CisgIDI3MTIwNjE1MjVVLAkvLyA8NywyLDIsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDIsMCwxPgorICAyNzEyMDYxNTM2VSwJLy8gPDcsMiwyLDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MiwyLDEsMz4KKyAgMTYzODMxOTcyMFUsCS8vIDw3LDIsMiwyPjogQ29zdCAyIHZleHQzIFJIUywgPDIsMiwyLDI+CisgIDE2MzgzMTk3MzBVLAkvLyA8NywyLDIsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDwyLDIsMywzPgorICAyNzEyMDYxNTY1VSwJLy8gPDcsMiwyLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MiwyLDQsNT4KKyAgMjY5ODA1MzI1NlUsCS8vIDw3LDIsMiw1PjogQ29zdCAzIHZleHQzIDwyLDIsNSw3PiwgPDIsMiw1LDc+CisgIDI3MTIwNjE1ODRVLAkvLyA8NywyLDIsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDIsNiw2PgorICAzNzcxNzk1MDk2VSwJLy8gPDcsMiwyLDc+OiBDb3N0IDQgdmV4dDMgPDIsMiw1LDc+LCA8MiwyLDcsNT4KKyAgMTYzODMxOTc3NVUsCS8vIDw3LDIsMix1PjogQ29zdCAyIHZleHQzIFJIUywgPDIsMix1LDM+CisgIDE2MzgzMTk3ODJVLAkvLyA8NywyLDMsMD46IENvc3QgMiB2ZXh0MyBSSFMsIDwyLDMsMCwxPgorICAyNjkzOTI0NTMxVSwJLy8gPDcsMiwzLDE+OiBDb3N0IDMgdmV4dDMgPDEsNSwzLDc+LCA8MiwzLDEsNT4KKyAgMjcwMDU2MDA2MVUsCS8vIDw3LDIsMywyPjogQ29zdCAzIHZleHQzIDwyLDYsMyw3PiwgPDIsMywyLDY+CisgIDI2OTM5MjQ1NTFVLAkvLyA8NywyLDMsMz46IENvc3QgMyB2ZXh0MyA8MSw1LDMsNz4sIDwyLDMsMyw3PgorICAxNjM4MzE5ODIyVSwJLy8gPDcsMiwzLDQ+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MiwzLDQsNT4KKyAgMjY5ODcxNjg4OVUsCS8vIDw3LDIsMyw1PjogQ29zdCAzIHZleHQzIDwyLDMsNSw3PiwgPDIsMyw1LDc+CisgIDI3MTIwNjE2NjVVLAkvLyA8NywyLDMsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDMsNiw2PgorICAyNzM1OTQ5NTQwVSwJLy8gPDcsMiwzLDc+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MiwzLDcsMD4KKyAgMTYzODMxOTg1NFUsCS8vIDw3LDIsMyx1PjogQ29zdCAyIHZleHQzIFJIUywgPDIsMyx1LDE+CisgIDI3MTIwNjE2OTJVLAkvLyA8NywyLDQsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDQsMCw2PgorICAyNzEyMDYxNjk4VSwJLy8gPDcsMiw0LDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Miw0LDEsMz4KKyAgMjcxMjA2MTcwOFUsCS8vIDw3LDIsNCwyPjogQ29zdCAzIHZleHQzIFJIUywgPDIsNCwyLDQ+CisgIDI3MTIwNjE3MThVLAkvLyA8NywyLDQsMz46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDQsMyw1PgorICAyNzEyMDYxNzI4VSwJLy8gPDcsMiw0LDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Miw0LDQsNj4KKyAgMjY5OTM4MDUyMlUsCS8vIDw3LDIsNCw1PjogQ29zdCAzIHZleHQzIDwyLDQsNSw3PiwgPDIsNCw1LDc+CisgIDI3MTIwNjE3NDBVLAkvLyA8NywyLDQsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDQsNiwwPgorICAzODA5NjkxNDQ1VSwJLy8gPDcsMiw0LDc+OiBDb3N0IDQgdmV4dDMgUkhTLCA8Miw0LDcsMD4KKyAgMjY5OTYwMTczM1UsCS8vIDw3LDIsNCx1PjogQ29zdCAzIHZleHQzIDwyLDQsdSw3PiwgPDIsNCx1LDc+CisgIDI2OTk2NzU0NzBVLAkvLyA8NywyLDUsMD46IENvc3QgMyB2ZXh0MyA8Miw1LDAsNz4sIDwyLDUsMCw3PgorICAzNzY2NDg2ODY3VSwJLy8gPDcsMiw1LDE+OiBDb3N0IDQgdmV4dDMgPDEsMyw1LDc+LCA8Miw1LDEsMz4KKyAgMjY5OTgyMjk0NFUsCS8vIDw3LDIsNSwyPjogQ29zdCAzIHZleHQzIDwyLDUsMiw3PiwgPDIsNSwyLDc+CisgIDI2OTI3NDUwNjVVLAkvLyA8NywyLDUsMz46IENvc3QgMyB2ZXh0MyA8MSwzLDUsNz4sIDwyLDUsMyw3PgorICAyNjk5OTcwNDE4VSwJLy8gPDcsMiw1LDQ+OiBDb3N0IDMgdmV4dDMgPDIsNSw0LDc+LCA8Miw1LDQsNz4KKyAgMzc2NjQ4NjkwN1UsCS8vIDw3LDIsNSw1PjogQ29zdCA0IHZleHQzIDwxLDMsNSw3PiwgPDIsNSw1LDc+CisgIDI3MDAxMTc4OTJVLAkvLyA8NywyLDUsNj46IENvc3QgMyB2ZXh0MyA8Miw1LDYsNz4sIDwyLDUsNiw3PgorICAzNzcxNzk1MzM0VSwJLy8gPDcsMiw1LDc+OiBDb3N0IDQgdmV4dDMgPDIsMiw1LDc+LCA8Miw1LDcsMD4KKyAgMjY5Mjc0NTExMFUsCS8vIDw3LDIsNSx1PjogQ29zdCAzIHZleHQzIDwxLDMsNSw3PiwgPDIsNSx1LDc+CisgIDI1NzI4OTQzMTBVLAkvLyA8NywyLDYsMD46IENvc3QgMyB2ZXh0MSA8Myw3LDIsNj4sIExIUworICAyNzEyMDYxODYwVSwJLy8gPDcsMiw2LDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Miw2LDEsMz4KKyAgMjcwMDQ4NjU3N1UsCS8vIDw3LDIsNiwyPjogQ29zdCAzIHZleHQzIDwyLDYsMiw3PiwgPDIsNiwyLDc+CisgIDE2MjY4MTg0OTBVLAkvLyA8NywyLDYsMz46IENvc3QgMiB2ZXh0MyA8Miw2LDMsNz4sIDwyLDYsMyw3PgorICAyNTcyODk3NTkwVSwJLy8gPDcsMiw2LDQ+OiBDb3N0IDMgdmV4dDEgPDMsNywyLDY+LCBSSFMKKyAgMjcwMDcwNzc4OFUsCS8vIDw3LDIsNiw1PjogQ29zdCAzIHZleHQzIDwyLDYsNSw3PiwgPDIsNiw1LDc+CisgIDI3MDA3ODE1MjVVLAkvLyA8NywyLDYsNj46IENvc3QgMyB2ZXh0MyA8Miw2LDYsNz4sIDwyLDYsNiw3PgorICAzNzc0NTk3MDg2VSwJLy8gPDcsMiw2LDc+OiBDb3N0IDQgdmV4dDMgPDIsNiw3LDc+LCA8Miw2LDcsNz4KKyAgMTYyNzE4NzE3NVUsCS8vIDw3LDIsNix1PjogQ29zdCAyIHZleHQzIDwyLDYsdSw3PiwgPDIsNix1LDc+CisgIDI3MzU5NDk4MDJVLAkvLyA8NywyLDcsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDcsMCwxPgorICAzNzgwMjAwNDM0VSwJLy8gPDcsMiw3LDE+OiBDb3N0IDQgdmV4dDMgPDMsNiwyLDc+LCA8Miw3LDEsMD4KKyAgMzc3MzU2NDkyOFUsCS8vIDw3LDIsNywyPjogQ29zdCA0IHZleHQzIDwyLDUsMiw3PiwgPDIsNywyLDU+CisgIDI5ODY1NDExNThVLAkvLyA8NywyLDcsMz46IENvc3QgMyB2emlwciA8NSw1LDcsNz4sIExIUworICAyNTU0OTg5ODc4VSwJLy8gPDcsMiw3LDQ+OiBDb3N0IDMgdmV4dDEgPDAsNywyLDc+LCBSSFMKKyAgMzc3NTExMzI0NVUsCS8vIDw3LDIsNyw1PjogQ29zdCA0IHZleHQzIDwyLDcsNSw3PiwgPDIsNyw1LDc+CisgIDQwNjAyODMyMjhVLAkvLyA8NywyLDcsNj46IENvc3QgNCB2emlwciA8NSw1LDcsNz4sIDwwLDQsMiw2PgorICAyNTU0OTkyMjM2VSwJLy8gPDcsMiw3LDc+OiBDb3N0IDMgdmV4dDEgPDAsNywyLDc+LCA8Nyw3LDcsNz4KKyAgMjk4NjU0MTE2M1UsCS8vIDw3LDIsNyx1PjogQ29zdCAzIHZ6aXByIDw1LDUsNyw3PiwgTEhTCisgIDE2MzgzMjAxODdVLAkvLyA8NywyLHUsMD46IENvc3QgMiB2ZXh0MyBSSFMsIDwyLHUsMCwxPgorICAyNjkzOTI0OTM2VSwJLy8gPDcsMix1LDE+OiBDb3N0IDMgdmV4dDMgPDEsNSwzLDc+LCA8Mix1LDEsNT4KKyAgMTYzODMxOTcyMFUsCS8vIDw3LDIsdSwyPjogQ29zdCAyIHZleHQzIFJIUywgPDIsMiwyLDI+CisgIDE2MjgxNDU3NTZVLAkvLyA8NywyLHUsMz46IENvc3QgMiB2ZXh0MyA8Mix1LDMsNz4sIDwyLHUsMyw3PgorICAxNjM4MzIwMjI3VSwJLy8gPDcsMix1LDQ+OiBDb3N0IDIgdmV4dDMgUkhTLCA8Mix1LDQsNT4KKyAgMjcwMjAzNTA1NFUsCS8vIDw3LDIsdSw1PjogQ29zdCAzIHZleHQzIDwyLHUsNSw3PiwgPDIsdSw1LDc+CisgIDI3MDIxMDg3OTFVLAkvLyA8NywyLHUsNj46IENvc3QgMyB2ZXh0MyA8Mix1LDYsNz4sIDwyLHUsNiw3PgorICAyNzM1OTQ5OTQ1VSwJLy8gPDcsMix1LDc+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Mix1LDcsMD4KKyAgMTYyODUxNDQ0MVUsCS8vIDw3LDIsdSx1PjogQ29zdCAyIHZleHQzIDwyLHUsdSw3PiwgPDIsdSx1LDc+CisgIDI3MTIwNjIwOTFVLAkvLyA8NywzLDAsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwzLDAsMCwwPgorICAxNjM4MzIwMjc4VSwJLy8gPDcsMywwLDE+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MywwLDEsMj4KKyAgMjcxMjA2MjEwOVUsCS8vIDw3LDMsMCwyPjogQ29zdCAzIHZleHQzIFJIUywgPDMsMCwyLDA+CisgIDI1OTA4MzY4ODZVLAkvLyA8NywzLDAsMz46IENvc3QgMyB2ZXh0MSA8Niw3LDMsMD4sIDwzLDAsMSwyPgorICAyNzEyMDYyMTI4VSwJLy8gPDcsMywwLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MywwLDQsMT4KKyAgMjcxMjA2MjEzOFUsCS8vIDw3LDMsMCw1PjogQ29zdCAzIHZleHQzIFJIUywgPDMsMCw1LDI+CisgIDI1OTA4Mzk2NTZVLAkvLyA8NywzLDAsNj46IENvc3QgMyB2ZXh0MSA8Niw3LDMsMD4sIDw2LDcsMywwPgorICAzMzExNDE0MDE3VSwJLy8gPDcsMywwLDc+OiBDb3N0IDQgdnJldiA8Myw3LDcsMD4KKyAgMTYzODMyMDM0MVUsCS8vIDw3LDMsMCx1PjogQ29zdCAyIHZleHQzIFJIUywgPDMsMCx1LDI+CisgIDIyMzcxNjQyMjdVLAkvLyA8NywzLDEsMD46IENvc3QgMyB2cmV2IDwzLDcsMCwxPgorICAyNzEyMDYyMTgyVSwJLy8gPDcsMywxLDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MywxLDEsMT4KKyAgMjcxMjA2MjE5M1UsCS8vIDw3LDMsMSwyPjogQ29zdCAzIHZleHQzIFJIUywgPDMsMSwyLDM+CisgIDI2OTI3NDU0NjhVLAkvLyA8NywzLDEsMz46IENvc3QgMyB2ZXh0MyA8MSwzLDUsNz4sIDwzLDEsMyw1PgorICAyNzEyMDYyMjE0VSwJLy8gPDcsMywxLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MywxLDQsNj4KKyAgMjY5MzkyNTEzMlUsCS8vIDw3LDMsMSw1PjogQ29zdCAzIHZleHQzIDwxLDUsMyw3PiwgPDMsMSw1LDM+CisgIDM3NjgxODMwNTlVLAkvLyA8NywzLDEsNj46IENvc3QgNCB2ZXh0MyA8MSw2LDEsNz4sIDwzLDEsNiwxPgorICAyNjkyNzQ1NTA0VSwJLy8gPDcsMywxLDc+OiBDb3N0IDMgdmV4dDMgPDEsMyw1LDc+LCA8MywxLDcsNT4KKyAgMjY5NjA2MzI3M1UsCS8vIDw3LDMsMSx1PjogQ29zdCAzIHZleHQzIDwxLHUsNSw3PiwgPDMsMSx1LDU+CisgIDI3MTIwNjIyNTRVLAkvLyA8NywzLDIsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwzLDIsMCwxPgorICAyNzEyMDYyMjYyVSwJLy8gPDcsMywyLDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MywyLDEsMD4KKyAgMjcxMjA2MjI3M1UsCS8vIDw3LDMsMiwyPjogQ29zdCAzIHZleHQzIFJIUywgPDMsMiwyLDI+CisgIDI3MTIwNjIyODBVLAkvLyA8NywzLDIsMz46IENvc3QgMyB2ZXh0MyBSSFMsIDwzLDIsMywwPgorICAyNzEyMDYyMjk0VSwJLy8gPDcsMywyLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MywyLDQsNT4KKyAgMjcxMjA2MjMwMlUsCS8vIDw3LDMsMiw1PjogQ29zdCAzIHZleHQzIFJIUywgPDMsMiw1LDQ+CisgIDI3MDA1NjA3NDJVLAkvLyA8NywzLDIsNj46IENvc3QgMyB2ZXh0MyA8Miw2LDMsNz4sIDwzLDIsNiwzPgorICAyNzEyMDYyMzE5VSwJLy8gPDcsMywyLDc+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MywyLDcsMz4KKyAgMjcxMjA2MjMyNVUsCS8vIDw3LDMsMix1PjogQ29zdCAzIHZleHQzIFJIUywgPDMsMix1LDA+CisgIDI3MTIwNjIzMzVVLAkvLyA8NywzLDMsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwzLDMsMCwxPgorICAyNjM2MzY4MTU4VSwJLy8gPDcsMywzLDE+OiBDb3N0IDMgdmV4dDIgPDMsMSw3LDM+LCA8MywxLDcsMz4KKyAgMjYzNzAzMTc5MVUsCS8vIDw3LDMsMywyPjogQ29zdCAzIHZleHQyIDwzLDIsNywzPiwgPDMsMiw3LDM+CisgIDE2MzgzMjA1NDBVLAkvLyA8NywzLDMsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDwzLDMsMywzPgorICAyNzEyMDYyMzc0VSwJLy8gPDcsMywzLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MywzLDQsND4KKyAgMjcwNDY4OTU4NlUsCS8vIDw3LDMsMyw1PjogQ29zdCAzIHZleHQzIDwzLDMsNSw3PiwgPDMsMyw1LDc+CisgIDI1OTA4NjQyMzVVLAkvLyA8NywzLDMsNj46IENvc3QgMyB2ZXh0MSA8Niw3LDMsMz4sIDw2LDcsMywzPgorICAyNzA0ODM3MDYwVSwJLy8gPDcsMywzLDc+OiBDb3N0IDMgdmV4dDMgPDMsMyw3LDc+LCA8MywzLDcsNz4KKyAgMTYzODMyMDU0MFUsCS8vIDw3LDMsMyx1PjogQ29zdCAyIHZleHQzIFJIUywgPDMsMywzLDM+CisgIDI3MTIwNjI0MTZVLAkvLyA8NywzLDQsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDwzLDQsMCwxPgorICAyNzEyMDYyNDI2VSwJLy8gPDcsMyw0LDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Myw0LDEsMj4KKyAgMjU2Njk4MTY0MFUsCS8vIDw3LDMsNCwyPjogQ29zdCAzIHZleHQxIDwyLDcsMyw0PiwgPDIsNywzLDQ+CisgIDI3MTIwNjI0NDdVLAkvLyA8NywzLDQsMz46IENvc3QgMyB2ZXh0MyBSSFMsIDwzLDQsMyw1PgorICAyNzEyMDYyNDU2VSwJLy8gPDcsMyw0LDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Myw0LDQsNT4KKyAgMTYzODMyMDY0MlUsCS8vIDw3LDMsNCw1PjogQ29zdCAyIHZleHQzIFJIUywgPDMsNCw1LDY+CisgIDI2NDgzMTMyMDRVLAkvLyA8NywzLDQsNj46IENvc3QgMyB2ZXh0MiA8NSwxLDcsMz4sIDw0LDYsNCw2PgorICAzMzExNDQ2Nzg5VSwJLy8gPDcsMyw0LDc+OiBDb3N0IDQgdnJldiA8Myw3LDcsND4KKyAgMTYzODMyMDY2OVUsCS8vIDw3LDMsNCx1PjogQ29zdCAyIHZleHQzIFJIUywgPDMsNCx1LDY+CisgIDI2MDI4MTk2ODZVLAkvLyA8NywzLDUsMD46IENvc3QgMyB2ZXh0MSA8dSw3LDMsNT4sIExIUworICAxNTc0NTcxNzI4VSwJLy8gPDcsMyw1LDE+OiBDb3N0IDIgdmV4dDIgPDUsMSw3LDM+LCA8NSwxLDcsMz4KKyAgMjY0ODk3NzE4NVUsCS8vIDw3LDMsNSwyPjogQ29zdCAzIHZleHQyIDw1LDIsNywzPiwgPDUsMiw3LDM+CisgIDI3MDU4NjkzNzhVLAkvLyA8NywzLDUsMz46IENvc3QgMyB2ZXh0MyA8Myw1LDMsNz4sIDwzLDUsMyw3PgorICAyMjM3NDkxOTQ3VSwJLy8gPDcsMyw1LDQ+OiBDb3N0IDMgdnJldiA8Myw3LDQsNT4KKyAgMjcwNjAxNjg1MlUsCS8vIDw3LDMsNSw1PjogQ29zdCAzIHZleHQzIDwzLDUsNSw3PiwgPDMsNSw1LDc+CisgIDI2NDgzMTM5NTRVLAkvLyA8NywzLDUsNj46IENvc3QgMyB2ZXh0MiA8NSwxLDcsMz4sIDw1LDYsNywwPgorICAyNjkyNzQ1ODIzVSwJLy8gPDcsMyw1LDc+OiBDb3N0IDMgdmV4dDMgPDEsMyw1LDc+LCA8Myw1LDcsMD4KKyAgMTU3OTIxNzE1OVUsCS8vIDw3LDMsNSx1PjogQ29zdCAyIHZleHQyIDw1LHUsNywzPiwgPDUsdSw3LDM+CisgIDI3MDYzMTE4MDBVLAkvLyA8NywzLDYsMD46IENvc3QgMyB2ZXh0MyA8Myw2LDAsNz4sIDwzLDYsMCw3PgorICAyNjU0Mjg2MjQ5VSwJLy8gPDcsMyw2LDE+OiBDb3N0IDMgdmV4dDIgPDYsMSw3LDM+LCA8NiwxLDcsMz4KKyAgMTU4MTIwODA1OFUsCS8vIDw3LDMsNiwyPjogQ29zdCAyIHZleHQyIDw2LDIsNywzPiwgPDYsMiw3LDM+CisgIDI3MDY1MzMwMTFVLAkvLyA8NywzLDYsMz46IENvc3QgMyB2ZXh0MyA8Myw2LDMsNz4sIDwzLDYsMyw3PgorICAyNzA2NjA2NzQ4VSwJLy8gPDcsMyw2LDQ+OiBDb3N0IDMgdmV4dDMgPDMsNiw0LDc+LCA8Myw2LDQsNz4KKyAgMzc4MDQyMjMwOVUsCS8vIDw3LDMsNiw1PjogQ29zdCA0IHZleHQzIDwzLDYsNSw3PiwgPDMsNiw1LDc+CisgIDI3MTIwNjI2MzdVLAkvLyA8NywzLDYsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDwzLDYsNiw2PgorICAyNzA2ODI3OTU5VSwJLy8gPDcsMyw2LDc+OiBDb3N0IDMgdmV4dDMgPDMsNiw3LDc+LCA8Myw2LDcsNz4KKyAgMTU4NTE4OTg1NlUsCS8vIDw3LDMsNix1PjogQ29zdCAyIHZleHQyIDw2LHUsNywzPiwgPDYsdSw3LDM+CisgIDI2OTM5MjU1NzFVLAkvLyA8NywzLDcsMD46IENvc3QgMyB2ZXh0MyA8MSw1LDMsNz4sIDwzLDcsMCwxPgorICAyNjkzOTI1NTg0VSwJLy8gPDcsMyw3LDE+OiBDb3N0IDMgdmV4dDMgPDEsNSwzLDc+LCA8Myw3LDEsNT4KKyAgMjcwMDU2MTExNFUsCS8vIDw3LDMsNywyPjogQ29zdCAzIHZleHQzIDwyLDYsMyw3PiwgPDMsNywyLDY+CisgIDI1NzI5Nzg5MTZVLAkvLyA8NywzLDcsMz46IENvc3QgMyB2ZXh0MSA8Myw3LDMsNz4sIDwzLDcsMyw3PgorICAyNjkzOTI1NjExVSwJLy8gPDcsMyw3LDQ+OiBDb3N0IDMgdmV4dDMgPDEsNSwzLDc+LCA8Myw3LDQsNT4KKyAgMjcwNzM0NDExOFUsCS8vIDw3LDMsNyw1PjogQ29zdCAzIHZleHQzIDwzLDcsNSw3PiwgPDMsNyw1LDc+CisgIDI2NTQ5NTA4OTRVLAkvLyA8NywzLDcsNj46IENvc3QgMyB2ZXh0MiA8NiwyLDcsMz4sIDw3LDYsMiw3PgorICAyNjQ4MzE1NTAwVSwJLy8gPDcsMyw3LDc+OiBDb3N0IDMgdmV4dDIgPDUsMSw3LDM+LCA8Nyw3LDcsNz4KKyAgMjY5MzkyNTY0M1UsCS8vIDw3LDMsNyx1PjogQ29zdCAzIHZleHQzIDwxLDUsMyw3PiwgPDMsNyx1LDE+CisgIDIyMzcyMjE1NzhVLAkvLyA8NywzLHUsMD46IENvc3QgMyB2cmV2IDwzLDcsMCx1PgorICAxNjM4MzIwOTI2VSwJLy8gPDcsMyx1LDE+OiBDb3N0IDIgdmV4dDMgUkhTLCA8Myx1LDEsMj4KKyAgMTU5MzE1MzQ1MlUsCS8vIDw3LDMsdSwyPjogQ29zdCAyIHZleHQyIDx1LDIsNywzPiwgPHUsMiw3LDM+CisgIDE2MzgzMjA1NDBVLAkvLyA8NywzLHUsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDwzLDMsMywzPgorICAyMjM3NTE2NTI2VSwJLy8gPDcsMyx1LDQ+OiBDb3N0IDMgdnJldiA8Myw3LDQsdT4KKyAgMTYzODMyMDk2NlUsCS8vIDw3LDMsdSw1PjogQ29zdCAyIHZleHQzIFJIUywgPDMsdSw1LDY+CisgIDI3MTIwNjI3OTZVLAkvLyA8NywzLHUsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDwzLHUsNiwzPgorICAyNjkyOTY3MjUwVSwJLy8gPDcsMyx1LDc+OiBDb3N0IDMgdmV4dDMgPDEsMyx1LDc+LCA8Myx1LDcsMD4KKyAgMTYzODMyMDk4OVUsCS8vIDw3LDMsdSx1PjogQ29zdCAyIHZleHQzIFJIUywgPDMsdSx1LDI+CisgIDI2NTE2MzU3MTJVLAkvLyA8Nyw0LDAsMD46IENvc3QgMyB2ZXh0MiA8NSw2LDcsND4sIDwwLDAsMCwwPgorICAxNTc3ODkzOTkwVSwJLy8gPDcsNCwwLDE+OiBDb3N0IDIgdmV4dDIgPDUsNiw3LDQ+LCBMSFMKKyAgMjY1MTYzNTg3NlUsCS8vIDw3LDQsMCwyPjogQ29zdCAzIHZleHQyIDw1LDYsNyw0PiwgPDAsMiwwLDI+CisgIDM3ODU4MDQ2NzJVLAkvLyA8Nyw0LDAsMz46IENvc3QgNCB2ZXh0MyBSSFMsIDw0LDAsMywxPgorICAyNjUxNjM2MDUwVSwJLy8gPDcsNCwwLDQ+OiBDb3N0IDMgdmV4dDIgPDUsNiw3LDQ+LCA8MCw0LDEsNT4KKyAgMTYzODQ2ODQ5OFUsCS8vIDw3LDQsMCw1PjogQ29zdCAyIHZleHQzIFJIUywgPDQsMCw1LDE+CisgIDE2Mzg0Njg1MDhVLAkvLyA8Nyw0LDAsNj46IENvc3QgMiB2ZXh0MyBSSFMsIDw0LDAsNiwyPgorICAzNzg3Nzk1MzY0VSwJLy8gPDcsNCwwLDc+OiBDb3N0IDQgdmV4dDMgUkhTLCA8NCwwLDcsMT4KKyAgMTY0MDQ1OTE4MVUsCS8vIDw3LDQsMCx1PjogQ29zdCAyIHZleHQzIFJIUywgPDQsMCx1LDE+CisgIDI2NTE2MzY0NzBVLAkvLyA8Nyw0LDEsMD46IENvc3QgMyB2ZXh0MiA8NSw2LDcsND4sIDwxLDAsMywyPgorICAyNjUxNjM2NTMyVSwJLy8gPDcsNCwxLDE+OiBDb3N0IDMgdmV4dDIgPDUsNiw3LDQ+LCA8MSwxLDEsMT4KKyAgMjcxMjA2MjkyMlUsCS8vIDw3LDQsMSwyPjogQ29zdCAzIHZleHQzIFJIUywgPDQsMSwyLDM+CisgIDI2MzkwMjkyNDhVLAkvLyA8Nyw0LDEsMz46IENvc3QgMyB2ZXh0MiA8Myw1LDcsND4sIDwxLDMsNSw3PgorICAyNzEyMDYyOTQwVSwJLy8gPDcsNCwxLDQ+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NCwxLDQsMz4KKyAgMjcxMjA2Mjk0NlUsCS8vIDw3LDQsMSw1PjogQ29zdCAzIHZleHQzIFJIUywgPDQsMSw1LDA+CisgIDI3MTIwNjI5NThVLAkvLyA8Nyw0LDEsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDw0LDEsNiwzPgorICAzNzg1ODA0NzkxVSwJLy8gPDcsNCwxLDc+OiBDb3N0IDQgdmV4dDMgUkhTLCA8NCwxLDcsMz4KKyAgMjcxMjA2Mjk3M1UsCS8vIDw3LDQsMSx1PjogQ29zdCAzIHZleHQzIFJIUywgPDQsMSx1LDA+CisgIDM3ODU4MDQ4MDdVLAkvLyA8Nyw0LDIsMD46IENvc3QgNCB2ZXh0MyBSSFMsIDw0LDIsMCwxPgorICAzNzg1ODA0ODE4VSwJLy8gPDcsNCwyLDE+OiBDb3N0IDQgdmV4dDMgUkhTLCA8NCwyLDEsMz4KKyAgMjY1MTYzNzM1MlUsCS8vIDw3LDQsMiwyPjogQ29zdCAzIHZleHQyIDw1LDYsNyw0PiwgPDIsMiwyLDI+CisgIDI2NTE2Mzc0MTRVLAkvLyA8Nyw0LDIsMz46IENvc3QgMyB2ZXh0MiA8NSw2LDcsND4sIDwyLDMsMCwxPgorICAzNzE2NzUzMTk0VSwJLy8gPDcsNCwyLDQ+OiBDb3N0IDQgdmV4dDIgPDQsMiw3LDQ+LCA8Miw0LDUsNz4KKyAgMjcxMjA2MzAzMFUsCS8vIDw3LDQsMiw1PjogQ29zdCAzIHZleHQzIFJIUywgPDQsMiw1LDM+CisgIDI3MTIwNjMwMzZVLAkvLyA8Nyw0LDIsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDw0LDIsNiwwPgorICAzNzczMTIzNjU4VSwJLy8gPDcsNCwyLDc+OiBDb3N0IDQgdmV4dDMgPDIsNCw1LDc+LCA8NCwyLDcsNT4KKyAgMjcxMjA2MzA1NFUsCS8vIDw3LDQsMix1PjogQ29zdCAzIHZleHQzIFJIUywgPDQsMix1LDA+CisgIDI2NTE2Mzc5MTBVLAkvLyA8Nyw0LDMsMD46IENvc3QgMyB2ZXh0MiA8NSw2LDcsND4sIDwzLDAsMSwyPgorICAzNzEyNzcyMzQ4VSwJLy8gPDcsNCwzLDE+OiBDb3N0IDQgdmV4dDIgPDMsNSw3LDQ+LCA8MywxLDMsNT4KKyAgMzc4NTgwNDkwNlUsCS8vIDw3LDQsMywyPjogQ29zdCA0IHZleHQzIFJIUywgPDQsMywyLDE+CisgIDI2NTE2MzgxNzJVLAkvLyA8Nyw0LDMsMz46IENvc3QgMyB2ZXh0MiA8NSw2LDcsND4sIDwzLDMsMywzPgorICAyNjUxNjM4Mjc0VSwJLy8gPDcsNCwzLDQ+OiBDb3N0IDMgdmV4dDIgPDUsNiw3LDQ+LCA8Myw0LDUsNj4KKyAgMjYzOTAzMDg4M1UsCS8vIDw3LDQsMyw1PjogQ29zdCAzIHZleHQyIDwzLDUsNyw0PiwgPDMsNSw3LDQ+CisgIDI3MTIwNjMxMjJVLAkvLyA8Nyw0LDMsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDw0LDMsNiw1PgorICAzNzEyNzcyODM2VSwJLy8gPDcsNCwzLDc+OiBDb3N0IDQgdmV4dDIgPDMsNSw3LDQ+LCA8Myw3LDMsNz4KKyAgMjY0MTAyMTc4MlUsCS8vIDw3LDQsMyx1PjogQ29zdCAzIHZleHQyIDwzLHUsNyw0PiwgPDMsdSw3LDQ+CisgIDI3MTQwNTM4MDJVLAkvLyA8Nyw0LDQsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDw0LDQsMCwyPgorICAzNzg1ODA0OTc4VSwJLy8gPDcsNCw0LDE+OiBDb3N0IDQgdmV4dDMgUkhTLCA8NCw0LDEsMT4KKyAgMzcxNjc1NDUwNVUsCS8vIDw3LDQsNCwyPjogQ29zdCA0IHZleHQyIDw0LDIsNyw0PiwgPDQsMiw3LDQ+CisgIDM3ODU4MDQ5OThVLAkvLyA8Nyw0LDQsMz46IENvc3QgNCB2ZXh0MyBSSFMsIDw0LDQsMywzPgorICAxNjM4MzIxMzYwVSwJLy8gPDcsNCw0LDQ+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NCw0LDQsND4KKyAgMTYzODQ2ODgyNlUsCS8vIDw3LDQsNCw1PjogQ29zdCAyIHZleHQzIFJIUywgPDQsNCw1LDU+CisgIDE2Mzg0Njg4MzZVLAkvLyA8Nyw0LDQsNj46IENvc3QgMiB2ZXh0MyBSSFMsIDw0LDQsNiw2PgorICAzNzg1MjE1MjE0VSwJLy8gPDcsNCw0LDc+OiBDb3N0IDQgdmV4dDMgPDQsNCw3LDc+LCA8NCw0LDcsNz4KKyAgMTY0MDQ1OTUwOVUsCS8vIDw3LDQsNCx1PjogQ29zdCAyIHZleHQzIFJIUywgPDQsNCx1LDU+CisgIDE1MTcyMDc2NTRVLAkvLyA8Nyw0LDUsMD46IENvc3QgMiB2ZXh0MSA8Niw3LDQsNT4sIExIUworICAyNTczMDM0NjQwVSwJLy8gPDcsNCw1LDE+OiBDb3N0IDMgdmV4dDEgPDMsNyw0LDU+LCA8MSw1LDMsNz4KKyAgMjcxMjA2MzI0NlUsCS8vIDw3LDQsNSwyPjogQ29zdCAzIHZleHQzIFJIUywgPDQsNSwyLDM+CisgIDI1NzMwMzYyNjdVLAkvLyA8Nyw0LDUsMz46IENvc3QgMyB2ZXh0MSA8Myw3LDQsNT4sIDwzLDcsNCw1PgorICAxNTE3MjEwOTM0VSwJLy8gPDcsNCw1LDQ+OiBDb3N0IDIgdmV4dDEgPDYsNyw0LDU+LCBSSFMKKyAgMjcxMTk4OTU0OVUsCS8vIDw3LDQsNSw1PjogQ29zdCAzIHZleHQzIDw0LDUsNSw3PiwgPDQsNSw1LDc+CisgIDU2NDU3OTYzOFUsCS8vIDw3LDQsNSw2PjogQ29zdCAxIHZleHQzIFJIUywgUkhTCisgIDI2NTE2Mzk5NzZVLAkvLyA8Nyw0LDUsNz46IENvc3QgMyB2ZXh0MiA8NSw2LDcsND4sIDw1LDcsNSw3PgorICA1NjQ1Nzk2NTZVLAkvLyA8Nyw0LDUsdT46IENvc3QgMSB2ZXh0MyBSSFMsIFJIUworICAyNzEyMDYzMzA3VSwJLy8gPDcsNCw2LDA+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NCw2LDAsMT4KKyAgMzc2NzY2ODA1NlUsCS8vIDw3LDQsNiwxPjogQ29zdCA0IHZleHQzIDwxLDUsMyw3PiwgPDQsNiwxLDU+CisgIDI2NTE2NDAzMTRVLAkvLyA8Nyw0LDYsMj46IENvc3QgMyB2ZXh0MiA8NSw2LDcsND4sIDw2LDIsNywzPgorICAyNjU1NjIxNzA4VSwJLy8gPDcsNCw2LDM+OiBDb3N0IDMgdmV4dDIgPDYsMyw3LDQ+LCA8NiwzLDcsND4KKyAgMTYzODQ2ODk4MFUsCS8vIDw3LDQsNiw0PjogQ29zdCAyIHZleHQzIFJIUywgPDQsNiw0LDY+CisgIDI3MTIwNjMzNThVLAkvLyA8Nyw0LDYsNT46IENvc3QgMyB2ZXh0MyBSSFMsIDw0LDYsNSw3PgorICAyNzEyMDYzMzY3VSwJLy8gPDcsNCw2LDY+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NCw2LDYsNz4KKyAgMjcxMjIxMDgyNlUsCS8vIDw3LDQsNiw3PjogQ29zdCAzIHZleHQzIFJIUywgPDQsNiw3LDE+CisgIDE2Mzg0NjkwMTJVLAkvLyA8Nyw0LDYsdT46IENvc3QgMiB2ZXh0MyBSSFMsIDw0LDYsdSwyPgorICAyNjUxNjQwODI2VSwJLy8gPDcsNCw3LDA+OiBDb3N0IDMgdmV4dDIgPDUsNiw3LDQ+LCA8NywwLDEsMj4KKyAgMzc3MzcxMzgzMFUsCS8vIDw3LDQsNywxPjogQ29zdCA0IHZleHQzIDwyLDUsNCw3PiwgPDQsNywxLDI+CisgIDM3NzM3MTM4NDJVLAkvLyA8Nyw0LDcsMj46IENvc3QgNCB2ZXh0MyA8Miw1LDQsNz4sIDw0LDcsMiw1PgorICAzNzgwMzQ5MzcyVSwJLy8gPDcsNCw3LDM+OiBDb3N0IDQgdmV4dDMgPDMsNiw0LDc+LCA8NCw3LDMsNj4KKyAgMjY1MTY0MTE0MFUsCS8vIDw3LDQsNyw0PjogQ29zdCAzIHZleHQyIDw1LDYsNyw0PiwgPDcsNCwwLDE+CisgIDI3MTIyMTA4ODhVLAkvLyA8Nyw0LDcsNT46IENvc3QgMyB2ZXh0MyBSSFMsIDw0LDcsNSwwPgorICAyNzEyMjEwODk4VSwJLy8gPDcsNCw3LDY+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NCw3LDYsMT4KKyAgMjY1MTY0MTQ1MlUsCS8vIDw3LDQsNyw3PjogQ29zdCAzIHZleHQyIDw1LDYsNyw0PiwgPDcsNyw3LDc+CisgIDI3MTM1MzgwMjZVLAkvLyA8Nyw0LDcsdT46IENvc3QgMyB2ZXh0MyA8NCw3LHUsNz4sIDw0LDcsdSw3PgorICAxNTE3MjMyMjMwVSwJLy8gPDcsNCx1LDA+OiBDb3N0IDIgdmV4dDEgPDYsNyw0LHU+LCBMSFMKKyAgMTU3Nzg5OTgyMlUsCS8vIDw3LDQsdSwxPjogQ29zdCAyIHZleHQyIDw1LDYsNyw0PiwgTEhTCisgIDI3MTIwNjM0ODlVLAkvLyA8Nyw0LHUsMj46IENvc3QgMyB2ZXh0MyBSSFMsIDw0LHUsMiwzPgorICAyNTczMDYwODQ2VSwJLy8gPDcsNCx1LDM+OiBDb3N0IDMgdmV4dDEgPDMsNyw0LHU+LCA8Myw3LDQsdT4KKyAgMTY0MDMxMjM0MlUsCS8vIDw3LDQsdSw0PjogQ29zdCAyIHZleHQzIFJIUywgPDQsdSw0LDY+CisgIDE2Mzg0NjkxNDZVLAkvLyA8Nyw0LHUsNT46IENvc3QgMiB2ZXh0MyBSSFMsIDw0LHUsNSwxPgorICA1NjQ1Nzk4ODFVLAkvLyA8Nyw0LHUsNj46IENvc3QgMSB2ZXh0MyBSSFMsIFJIUworICAyNzE0MDU0MTkyVSwJLy8gPDcsNCx1LDc+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NCx1LDcsNT4KKyAgNTY0NTc5ODk5VSwJLy8gPDcsNCx1LHU+OiBDb3N0IDEgdmV4dDMgUkhTLCBSSFMKKyAgMjU3OTAzODMxMFUsCS8vIDw3LDUsMCwwPjogQ29zdCAzIHZleHQxIDw0LDcsNSwwPiwgTEhTCisgIDI2MzYzODIzMTBVLAkvLyA8Nyw1LDAsMT46IENvc3QgMyB2ZXh0MiA8MywxLDcsNT4sIExIUworICAyNzk2MzM5MzAyVSwJLy8gPDcsNSwwLDI+OiBDb3N0IDMgdnV6cGwgPDcsNCw1LDY+LCBMSFMKKyAgMzY0NjgxMDcxOVUsCS8vIDw3LDUsMCwzPjogQ29zdCA0IHZleHQxIDwzLDcsNSwwPiwgPDMsNSw3LDA+CisgIDI3MTIwNjM1ODZVLAkvLyA8Nyw1LDAsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDAsNCwxPgorICAyNzM1OTUxNDY3VSwJLy8gPDcsNSwwLDU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NSwwLDUsMT4KKyAgMjczNTk1MTQ3NlUsCS8vIDw3LDUsMCw2PjogQ29zdCAzIHZleHQzIFJIUywgPDUsMCw2LDE+CisgIDI1NzkwNDMzMjJVLAkvLyA8Nyw1LDAsNz46IENvc3QgMyB2ZXh0MSA8NCw3LDUsMD4sIDw3LDAsMSwyPgorICAyNjM2MzgyODc3VSwJLy8gPDcsNSwwLHU+OiBDb3N0IDMgdmV4dDIgPDMsMSw3LDU+LCBMSFMKKyAgMjcxMjIxMTA4N1UsCS8vIDw3LDUsMSwwPjogQ29zdCAzIHZleHQzIFJIUywgPDUsMSwwLDE+CisgIDM2OTgxODA5MTZVLAkvLyA8Nyw1LDEsMT46IENvc3QgNCB2ZXh0MiA8MSwxLDcsNT4sIDwxLDEsMSwxPgorICAzNzEwMTI0OTUwVSwJLy8gPDcsNSwxLDI+OiBDb3N0IDQgdmV4dDIgPDMsMSw3LDU+LCA8MSwyLDMsMD4KKyAgMjYzNjM4MzIzMlUsCS8vIDw3LDUsMSwzPjogQ29zdCAzIHZleHQyIDwzLDEsNyw1PiwgPDEsMyw1LDc+CisgIDI3MTIyMTExMjdVLAkvLyA8Nyw1LDEsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDEsNCw1PgorICAyNTkwOTk0MTI4VSwJLy8gPDcsNSwxLDU+OiBDb3N0IDMgdmV4dDEgPDYsNyw1LDE+LCA8NSwxLDcsMz4KKyAgMjU5MDk5NTMyM1UsCS8vIDw3LDUsMSw2PjogQ29zdCAzIHZleHQxIDw2LDcsNSwxPiwgPDYsNyw1LDE+CisgIDE2Mzg0NjkzMjhVLAkvLyA8Nyw1LDEsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw1LDEsNywzPgorICAxNjM4NDY5MzM3VSwJLy8gPDcsNSwxLHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NSwxLHUsMz4KKyAgMzc4NTgwNTUzNlUsCS8vIDw3LDUsMiwwPjogQ29zdCA0IHZleHQzIFJIUywgPDUsMiwwLDE+CisgIDM3ODU4MDU1NDRVLAkvLyA8Nyw1LDIsMT46IENvc3QgNCB2ZXh0MyBSSFMsIDw1LDIsMSwwPgorICAzNzA0ODE3Mjg4VSwJLy8gPDcsNSwyLDI+OiBDb3N0IDQgdmV4dDIgPDIsMiw3LDU+LCA8MiwyLDUsNz4KKyAgMjcxMjA2Mzc0MlUsCS8vIDw3LDUsMiwzPjogQ29zdCAzIHZleHQzIFJIUywgPDUsMiwzLDQ+CisgIDM3MTY3NjEzODZVLAkvLyA8Nyw1LDIsND46IENvc3QgNCB2ZXh0MiA8NCwyLDcsNT4sIDwyLDQsNSw3PgorICAyNzE0MDU0NDE1VSwJLy8gPDcsNSwyLDU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NSwyLDUsMz4KKyAgMzc3NDMwNDAyNFUsCS8vIDw3LDUsMiw2PjogQ29zdCA0IHZleHQzIDwyLDYsMyw3PiwgPDUsMiw2LDM+CisgIDI3MTIwNjM3NzdVLAkvLyA8Nyw1LDIsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDIsNywzPgorICAyNzEyMDYzNzg3VSwJLy8gPDcsNSwyLHU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NSwyLHUsND4KKyAgMzYzNDg4ODgwNlUsCS8vIDw3LDUsMywwPjogQ29zdCA0IHZleHQxIDwxLDcsNSwzPiwgTEhTCisgIDI2MzYzODQ1NDRVLAkvLyA8Nyw1LDMsMT46IENvc3QgMyB2ZXh0MiA8MywxLDcsNT4sIDwzLDEsNyw1PgorICAzNzEwNzkwMDAxVSwJLy8gPDcsNSwzLDI+OiBDb3N0IDQgdmV4dDIgPDMsMiw3LDU+LCA8MywyLDcsNT4KKyAgMzcxMDEyNjQ5MlUsCS8vIDw3LDUsMywzPjogQ29zdCA0IHZleHQyIDwzLDEsNyw1PiwgPDMsMywzLDM+CisgIDM2MzQ4OTIwODZVLAkvLyA8Nyw1LDMsND46IENvc3QgNCB2ZXh0MSA8MSw3LDUsMz4sIFJIUworICAyNjM5MDM5MDc2VSwJLy8gPDcsNSwzLDU+OiBDb3N0IDMgdmV4dDIgPDMsNSw3LDU+LCA8Myw1LDcsNT4KKyAgMzcxMzQ0NDUzM1UsCS8vIDw3LDUsMyw2PjogQ29zdCA0IHZleHQyIDwzLDYsNyw1PiwgPDMsNiw3LDU+CisgIDI2OTM5MjY3NjdVLAkvLyA8Nyw1LDMsNz46IENvc3QgMyB2ZXh0MyA8MSw1LDMsNz4sIDw1LDMsNywwPgorICAyNzEyMDYzODY0VSwJLy8gPDcsNSwzLHU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NSwzLHUsMD4KKyAgMjU3OTA3MTA3OFUsCS8vIDw3LDUsNCwwPjogQ29zdCAzIHZleHQxIDw0LDcsNSw0PiwgTEhTCisgIDM2NDY4NDE4NTZVLAkvLyA8Nyw1LDQsMT46IENvc3QgNCB2ZXh0MSA8Myw3LDUsND4sIDwxLDMsNSw3PgorICAzNzE2NzYyNjk4VSwJLy8gPDcsNSw0LDI+OiBDb3N0IDQgdmV4dDIgPDQsMiw3LDU+LCA8NCwyLDcsNT4KKyAgMzY0Njg0MzQ5MVUsCS8vIDw3LDUsNCwzPjogQ29zdCA0IHZleHQxIDwzLDcsNSw0PiwgPDMsNSw3LDQ+CisgIDI1NzkwNzQzNThVLAkvLyA8Nyw1LDQsND46IENvc3QgMyB2ZXh0MSA8NCw3LDUsND4sIFJIUworICAyNjM2Mzg1NTkwVSwJLy8gPDcsNSw0LDU+OiBDb3N0IDMgdmV4dDIgPDMsMSw3LDU+LCBSSFMKKyAgMjY0NTY3NTQwNlUsCS8vIDw3LDUsNCw2PjogQ29zdCAzIHZleHQyIDw0LDYsNyw1PiwgPDQsNiw3LDU+CisgIDE2MzgzMjIxMThVLAkvLyA8Nyw1LDQsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw1LDQsNyw2PgorICAxNjM4NDY5NTgzVSwJLy8gPDcsNSw0LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NSw0LHUsNj4KKyAgMjcxNDA1NDYxMVUsCS8vIDw3LDUsNSwwPjogQ29zdCAzIHZleHQzIFJIUywgPDUsNSwwLDE+CisgIDI2NTI5NzQ4MDBVLAkvLyA8Nyw1LDUsMT46IENvc3QgMyB2ZXh0MiA8NSx1LDcsNT4sIDw1LDEsNywzPgorICAzNzEwMTI3OTA1VSwJLy8gPDcsNSw1LDI+OiBDb3N0IDQgdmV4dDIgPDMsMSw3LDU+LCA8NSwyLDcsMz4KKyAgMzc4NTgwNTgwOFUsCS8vIDw3LDUsNSwzPjogQ29zdCA0IHZleHQzIFJIUywgPDUsNSwzLDM+CisgIDI3MTIyMTE0NTBVLAkvLyA8Nyw1LDUsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDUsNCw0PgorICAxNjM4MzIyMTgwVSwJLy8gPDcsNSw1LDU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NSw1LDUsNT4KKyAgMjcxMjA2NDAxNFUsCS8vIDw3LDUsNSw2PjogQ29zdCAzIHZleHQzIFJIUywgPDUsNSw2LDY+CisgIDE2Mzg0Njk2NTZVLAkvLyA8Nyw1LDUsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw1LDUsNyw3PgorICAxNjM4NDY5NjY1VSwJLy8gPDcsNSw1LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NSw1LHUsNz4KKyAgMjcxMjA2NDAzNlUsCS8vIDw3LDUsNiwwPjogQ29zdCAzIHZleHQzIFJIUywgPDUsNiwwLDE+CisgIDI3MTQwNTQ3MDdVLAkvLyA8Nyw1LDYsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDYsMSw3PgorICAzNzg1ODA1ODc5VSwJLy8gPDcsNSw2LDI+OiBDb3N0IDQgdmV4dDMgUkhTLCA8NSw2LDIsMj4KKyAgMjcxMjA2NDA2NlUsCS8vIDw3LDUsNiwzPjogQ29zdCAzIHZleHQzIFJIUywgPDUsNiwzLDQ+CisgIDI3MTIwNjQwNzZVLAkvLyA8Nyw1LDYsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDYsNCw1PgorICAyNzE0MDU0NzQzVSwJLy8gPDcsNSw2LDU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NSw2LDUsNz4KKyAgMjcxMjA2NDA5NlUsCS8vIDw3LDUsNiw2PjogQ29zdCAzIHZleHQzIFJIUywgPDUsNiw2LDc+CisgIDE2MzgzMjIyNzRVLAkvLyA8Nyw1LDYsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw1LDYsNywwPgorICAxNjM4NDY5NzM5VSwJLy8gPDcsNSw2LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NSw2LHUsMD4KKyAgMTUxMTMyNTc5OFUsCS8vIDw3LDUsNywwPjogQ29zdCAyIHZleHQxIDw1LDcsNSw3PiwgTEhTCisgIDI2OTI3NDczOTJVLAkvLyA8Nyw1LDcsMT46IENvc3QgMyB2ZXh0MyA8MSwzLDUsNz4sIDw1LDcsMSwzPgorICAyNTg1MDY5MTYwVSwJLy8gPDcsNSw3LDI+OiBDb3N0IDMgdmV4dDEgPDUsNyw1LDc+LCA8MiwyLDIsMj4KKyAgMjU3MzEyNjM5MFUsCS8vIDw3LDUsNywzPjogQ29zdCAzIHZleHQxIDwzLDcsNSw3PiwgPDMsNyw1LDc+CisgIDE1MTEzMjkwNzhVLAkvLyA8Nyw1LDcsND46IENvc3QgMiB2ZXh0MSA8NSw3LDUsNz4sIFJIUworICAxNjM4NDY5ODAwVSwJLy8gPDcsNSw3LDU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NSw3LDUsNz4KKyAgMjcxMjIxMTYyNlUsCS8vIDw3LDUsNyw2PjogQ29zdCAzIHZleHQzIFJIUywgPDUsNyw2LDA+CisgIDI3MTIyMTE2MzZVLAkvLyA8Nyw1LDcsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDcsNywxPgorICAxNjM4NDY5ODIzVSwJLy8gPDcsNSw3LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NSw3LHUsMz4KKyAgMTUxMTMzMzk5MFUsCS8vIDw3LDUsdSwwPjogQ29zdCAyIHZleHQxIDw1LDcsNSx1PiwgTEhTCisgIDI2MzYzODgxNDJVLAkvLyA8Nyw1LHUsMT46IENvc3QgMyB2ZXh0MiA8MywxLDcsNT4sIExIUworICAyNzEyMjExNjcxVSwJLy8gPDcsNSx1LDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NSx1LDIsMD4KKyAgMjU3MzEzNDU4M1UsCS8vIDw3LDUsdSwzPjogQ29zdCAzIHZleHQxIDwzLDcsNSx1PiwgPDMsNyw1LHU+CisgIDE1MTEzMzcyNzBVLAkvLyA8Nyw1LHUsND46IENvc3QgMiB2ZXh0MSA8NSw3LDUsdT4sIFJIUworICAxNjM4NDY5ODgxVSwJLy8gPDcsNSx1LDU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NSx1LDUsNz4KKyAgMjcxMjA2NDI1OFUsCS8vIDw3LDUsdSw2PjogQ29zdCAzIHZleHQzIFJIUywgPDUsdSw2LDc+CisgIDE2Mzg0Njk4OTJVLAkvLyA8Nyw1LHUsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw1LHUsNywwPgorICAxNjM4NDY5OTA0VSwJLy8gPDcsNSx1LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NSx1LHUsMz4KKyAgMjY1MDMyNDk5MlUsCS8vIDw3LDYsMCwwPjogQ29zdCAzIHZleHQyIDw1LDQsNyw2PiwgPDAsMCwwLDA+CisgIDE1NzY1ODMyNzBVLAkvLyA8Nyw2LDAsMT46IENvc3QgMiB2ZXh0MiA8NSw0LDcsNj4sIExIUworICAyNzEyMDY0MzAwVSwJLy8gPDcsNiwwLDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NiwwLDIsND4KKyAgMjI1NTI5NTMzNlUsCS8vIDw3LDYsMCwzPjogQ29zdCAzIHZyZXYgPDYsNywzLDA+CisgIDI3MTIwNjQzMTZVLAkvLyA8Nyw2LDAsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDAsNCwyPgorICAyNTg1MDg4MDk4VSwJLy8gPDcsNiwwLDU+OiBDb3N0IDMgdmV4dDEgPDUsNyw2LDA+LCA8NSw2LDcsMD4KKyAgMjczNTk1MjIwNFUsCS8vIDw3LDYsMCw2PjogQ29zdCAzIHZleHQzIFJIUywgPDYsMCw2LDA+CisgIDI3MTIyMTE3OTlVLAkvLyA8Nyw2LDAsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDAsNywyPgorICAxNTc2NTgzODM3VSwJLy8gPDcsNiwwLHU+OiBDb3N0IDIgdmV4dDIgPDUsNCw3LDY+LCBMSFMKKyAgMTE4MTM0MDQ5NFUsCS8vIDw3LDYsMSwwPjogQ29zdCAyIHZyZXYgPDYsNywwLDE+CisgIDI2NTAzMjU4MTJVLAkvLyA8Nyw2LDEsMT46IENvc3QgMyB2ZXh0MiA8NSw0LDcsNj4sIDwxLDEsMSwxPgorICAyNjUwMzI1OTEwVSwJLy8gPDcsNiwxLDI+OiBDb3N0IDMgdmV4dDIgPDUsNCw3LDY+LCA8MSwyLDMsMD4KKyAgMjY1MDMyNTk3NlUsCS8vIDw3LDYsMSwzPjogQ29zdCAzIHZleHQyIDw1LDQsNyw2PiwgPDEsMywxLDM+CisgIDI1NzkxMjM1MTBVLAkvLyA8Nyw2LDEsND46IENvc3QgMyB2ZXh0MSA8NCw3LDYsMT4sIFJIUworICAyNjUwMzI2MTYwVSwJLy8gPDcsNiwxLDU+OiBDb3N0IDMgdmV4dDIgPDUsNCw3LDY+LCA8MSw1LDMsNz4KKyAgMjcxNDA1NTA3MlUsCS8vIDw3LDYsMSw2PjogQ29zdCAzIHZleHQzIFJIUywgPDYsMSw2LDM+CisgIDI3MTIwNjQ0MjVVLAkvLyA8Nyw2LDEsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDEsNywzPgorICAxMTgxOTMwMzkwVSwJLy8gPDcsNiwxLHU+OiBDb3N0IDIgdnJldiA8Niw3LHUsMT4KKyAgMjcxMjIxMTg5N1UsCS8vIDw3LDYsMiwwPjogQ29zdCAzIHZleHQzIFJIUywgPDYsMiwwLDE+CisgIDI3MTQwNTUxMDhVLAkvLyA8Nyw2LDIsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDIsMSwzPgorICAyNjUwMzI2NjMyVSwJLy8gPDcsNiwyLDI+OiBDb3N0IDMgdmV4dDIgPDUsNCw3LDY+LCA8MiwyLDIsMj4KKyAgMjY1MDMyNjY5NFUsCS8vIDw3LDYsMiwzPjogQ29zdCAzIHZleHQyIDw1LDQsNyw2PiwgPDIsMywwLDE+CisgIDI3MTQwNTUxMzdVLAkvLyA8Nyw2LDIsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDIsNCw1PgorICAyNzE0MDU1MTQ4VSwJLy8gPDcsNiwyLDU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NiwyLDUsNz4KKyAgMjY1MDMyNjk3MFUsCS8vIDw3LDYsMiw2PjogQ29zdCAzIHZleHQyIDw1LDQsNyw2PiwgPDIsNiwzLDc+CisgIDE2Mzg0NzAxMzhVLAkvLyA8Nyw2LDIsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw2LDIsNywzPgorICAxNjM4NDcwMTQ3VSwJLy8gPDcsNiwyLHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NiwyLHUsMz4KKyAgMjY1MDMyNzE5MFUsCS8vIDw3LDYsMywwPjogQ29zdCAzIHZleHQyIDw1LDQsNyw2PiwgPDMsMCwxLDI+CisgIDIyNTUxNzI0NDFVLAkvLyA8Nyw2LDMsMT46IENvc3QgMyB2cmV2IDw2LDcsMSwzPgorICAyMjU1MjQ2MTc4VSwJLy8gPDcsNiwzLDI+OiBDb3N0IDMgdnJldiA8Niw3LDIsMz4KKyAgMjY1MDMyNzQ1MlUsCS8vIDw3LDYsMywzPjogQ29zdCAzIHZleHQyIDw1LDQsNyw2PiwgPDMsMywzLDM+CisgIDI3MTIwNjQ1NjJVLAkvLyA8Nyw2LDMsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDMsNCw1PgorICAyNjUwMzI3NjI3VSwJLy8gPDcsNiwzLDU+OiBDb3N0IDMgdmV4dDIgPDUsNCw3LDY+LCA8Myw1LDQsNz4KKyAgMzcxMzQ1MjcyNlUsCS8vIDw3LDYsMyw2PjogQ29zdCA0IHZleHQyIDwzLDYsNyw2PiwgPDMsNiw3LDY+CisgIDI3MDA1NjMwMTZVLAkvLyA8Nyw2LDMsNz46IENvc3QgMyB2ZXh0MyA8Miw2LDMsNz4sIDw2LDMsNywwPgorICAyNzEyMDY0NTkzVSwJLy8gPDcsNiwzLHU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NiwzLHUsMD4KKyAgMjY1MDMyNzk1NFUsCS8vIDw3LDYsNCwwPjogQ29zdCAzIHZleHQyIDw1LDQsNyw2PiwgPDQsMCw1LDE+CisgIDI3MzU5NTI0ODZVLAkvLyA8Nyw2LDQsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDQsMSwzPgorICAyNzM1OTUyNDk3VSwJLy8gPDcsNiw0LDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Niw0LDIsNT4KKyAgMjI1NTMyODEwOFUsCS8vIDw3LDYsNCwzPjogQ29zdCAzIHZyZXYgPDYsNywzLDQ+CisgIDI3MTIyMTIxMDBVLAkvLyA8Nyw2LDQsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDQsNCw2PgorICAxNTc2NTg2NTUwVSwJLy8gPDcsNiw0LDU+OiBDb3N0IDIgdmV4dDIgPDUsNCw3LDY+LCBSSFMKKyAgMjcxNDA1NTMxMlUsCS8vIDw3LDYsNCw2PjogQ29zdCAzIHZleHQzIFJIUywgPDYsNCw2LDA+CisgIDI3MTIyMTIxMjZVLAkvLyA8Nyw2LDQsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDQsNyw1PgorICAxNTc2NTg2NzkzVSwJLy8gPDcsNiw0LHU+OiBDb3N0IDIgdmV4dDIgPDUsNCw3LDY+LCBSSFMKKyAgMjU3OTE1Mjk5OFUsCS8vIDw3LDYsNSwwPjogQ29zdCAzIHZleHQxIDw0LDcsNiw1PiwgTEhTCisgIDI2NTAzMjg3ODRVLAkvLyA8Nyw2LDUsMT46IENvc3QgMyB2ZXh0MiA8NSw0LDcsNj4sIDw1LDEsNywzPgorICAyNzE0MDU1MzY0VSwJLy8gPDcsNiw1LDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Niw1LDIsNz4KKyAgMzc4NTgwNjUzOFUsCS8vIDw3LDYsNSwzPjogQ29zdCA0IHZleHQzIFJIUywgPDYsNSwzLDQ+CisgIDE1NzY1ODcyMDZVLAkvLyA8Nyw2LDUsND46IENvc3QgMiB2ZXh0MiA8NSw0LDcsNj4sIDw1LDQsNyw2PgorICAyNjUwMzI5MDkyVSwJLy8gPDcsNiw1LDU+OiBDb3N0IDMgdmV4dDIgPDUsNCw3LDY+LCA8NSw1LDUsNT4KKyAgMjY1MDMyOTE4NlUsCS8vIDw3LDYsNSw2PjogQ29zdCAzIHZleHQyIDw1LDQsNyw2PiwgPDUsNiw3LDA+CisgIDI3MTIwNjQ3NTNVLAkvLyA8Nyw2LDUsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDUsNyw3PgorICAxMTgxOTYzMTYyVSwJLy8gPDcsNiw1LHU+OiBDb3N0IDIgdnJldiA8Niw3LHUsNT4KKyAgMjcxNDA1NTQyMVUsCS8vIDw3LDYsNiwwPjogQ29zdCAzIHZleHQzIFJIUywgPDYsNiwwLDE+CisgIDI3MTQwNTU0MzJVLAkvLyA8Nyw2LDYsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDYsMSwzPgorICAyNjUwMzI5NTk0VSwJLy8gPDcsNiw2LDI+OiBDb3N0IDMgdmV4dDIgPDUsNCw3LDY+LCA8NiwyLDcsMz4KKyAgMzc4NTgwNjYxOVUsCS8vIDw3LDYsNiwzPjogQ29zdCA0IHZleHQzIFJIUywgPDYsNiwzLDQ+CisgIDI3MTIyMTIyNjBVLAkvLyA8Nyw2LDYsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDYsNCw0PgorICAyNzE0MDU1NDcyVSwJLy8gPDcsNiw2LDU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Niw2LDUsNz4KKyAgMTYzODMyMzAwMFUsCS8vIDw3LDYsNiw2PjogQ29zdCAyIHZleHQzIFJIUywgPDYsNiw2LDY+CisgIDE2Mzg0NzA0NjZVLAkvLyA8Nyw2LDYsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw2LDYsNyw3PgorICAxNjM4NDcwNDc1VSwJLy8gPDcsNiw2LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8Niw2LHUsNz4KKyAgMTYzODMyMzAyMlUsCS8vIDw3LDYsNywwPjogQ29zdCAyIHZleHQzIFJIUywgPDYsNywwLDE+CisgIDI3MTIwNjQ4NTRVLAkvLyA8Nyw2LDcsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDcsMSwwPgorICAyNzEyMDY0ODY1VSwJLy8gPDcsNiw3LDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Niw3LDIsMj4KKyAgMjcxMjA2NDg3MlUsCS8vIDw3LDYsNywzPjogQ29zdCAzIHZleHQzIFJIUywgPDYsNywzLDA+CisgIDE2MzgzMjMwNjJVLAkvLyA8Nyw2LDcsND46IENvc3QgMiB2ZXh0MyBSSFMsIDw2LDcsNCw1PgorICAyNzEyMDY0ODk0VSwJLy8gPDcsNiw3LDU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Niw3LDUsND4KKyAgMjcxMjA2NDkwNVUsCS8vIDw3LDYsNyw2PjogQ29zdCAzIHZleHQzIFJIUywgPDYsNyw2LDY+CisgIDI3MTIwNjQ5MTVVLAkvLyA8Nyw2LDcsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw2LDcsNyw3PgorICAxNjM4MzIzMDk0VSwJLy8gPDcsNiw3LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8Niw3LHUsMT4KKyAgMTYzODQ3MDU1OVUsCS8vIDw3LDYsdSwwPjogQ29zdCAyIHZleHQzIFJIUywgPDYsdSwwLDE+CisgIDE1NzY1ODkxMDJVLAkvLyA8Nyw2LHUsMT46IENvc3QgMiB2ZXh0MiA8NSw0LDcsNj4sIExIUworICAyNzEyMjEyNDAyVSwJLy8gPDcsNix1LDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Nix1LDIsMj4KKyAgMjcxMjIxMjQwOVUsCS8vIDw3LDYsdSwzPjogQ29zdCAzIHZleHQzIFJIUywgPDYsdSwzLDA+CisgIDE2Mzg0NzA1OTlVLAkvLyA8Nyw2LHUsND46IENvc3QgMiB2ZXh0MyBSSFMsIDw2LHUsNCw1PgorICAxNTc2NTg5NDY2VSwJLy8gPDcsNix1LDU+OiBDb3N0IDIgdmV4dDIgPDUsNCw3LDY+LCBSSFMKKyAgMTYzODMyMzAwMFUsCS8vIDw3LDYsdSw2PjogQ29zdCAyIHZleHQzIFJIUywgPDYsNiw2LDY+CisgIDE2Mzg0NzA2MjRVLAkvLyA8Nyw2LHUsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw2LHUsNywzPgorICAxNjM4NDcwNjMxVSwJLy8gPDcsNix1LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8Nix1LHUsMT4KKyAgMjcxMjA2NTAwN1UsCS8vIDw3LDcsMCwwPjogQ29zdCAzIHZleHQzIFJIUywgPDcsMCwwLDA+CisgIDE2MzgzMjMxOTRVLAkvLyA8Nyw3LDAsMT46IENvc3QgMiB2ZXh0MyBSSFMsIDw3LDAsMSwyPgorICAyNzEyMDY1MDI1VSwJLy8gPDcsNywwLDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NywwLDIsMD4KKyAgMzY0Njk1ODMzN1UsCS8vIDw3LDcsMCwzPjogQ29zdCA0IHZleHQxIDwzLDcsNywwPiwgPDMsNyw3LDA+CisgIDI3MTIwNjUwNDRVLAkvLyA8Nyw3LDAsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDAsNCwxPgorICAyNTg1MTYxOTA3VSwJLy8gPDcsNywwLDU+OiBDb3N0IDMgdmV4dDEgPDUsNyw3LDA+LCA8NSw3LDcsMD4KKyAgMjU5MTEzNDYwNFUsCS8vIDw3LDcsMCw2PjogQ29zdCAzIHZleHQxIDw2LDcsNywwPiwgPDYsNyw3LDA+CisgIDI1OTExMzQ3MTRVLAkvLyA8Nyw3LDAsNz46IENvc3QgMyB2ZXh0MSA8Niw3LDcsMD4sIDw3LDAsMSwyPgorICAxNjM4MzIzMjU3VSwJLy8gPDcsNywwLHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NywwLHUsMj4KKyAgMjcxMjA2NTA5MVUsCS8vIDw3LDcsMSwwPjogQ29zdCAzIHZleHQzIFJIUywgPDcsMSwwLDM+CisgIDI3MTIwNjUwOThVLAkvLyA8Nyw3LDEsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDEsMSwxPgorICAyNzEyMDY1MTA5VSwJLy8gPDcsNywxLDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NywxLDIsMz4KKyAgMjY5Mjc0ODM4NFUsCS8vIDw3LDcsMSwzPjogQ29zdCAzIHZleHQzIDwxLDMsNSw3PiwgPDcsMSwzLDU+CisgIDI1ODUxNjkyMDZVLAkvLyA8Nyw3LDEsND46IENvc3QgMyB2ZXh0MSA8NSw3LDcsMT4sIFJIUworICAyNjkzOTI4MDQ4VSwJLy8gPDcsNywxLDU+OiBDb3N0IDMgdmV4dDMgPDEsNSwzLDc+LCA8NywxLDUsMz4KKyAgMjU4NTE3MDc2NlUsCS8vIDw3LDcsMSw2PjogQ29zdCAzIHZleHQxIDw1LDcsNywxPiwgPDYsNywwLDE+CisgIDI3MzU5NTMwMjRVLAkvLyA8Nyw3LDEsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDEsNywxPgorICAyNjk1OTE4NzMxVSwJLy8gPDcsNywxLHU+OiBDb3N0IDMgdmV4dDMgPDEsdSwzLDc+LCA8NywxLHUsMz4KKyAgMzc3MDQ3MTU3NFUsCS8vIDw3LDcsMiwwPjogQ29zdCA0IHZleHQzIDwyLDAsNSw3PiwgPDcsMiwwLDU+CisgIDM3ODU4MDcwMDJVLAkvLyA8Nyw3LDIsMT46IENvc3QgNCB2ZXh0MyBSSFMsIDw3LDIsMSwwPgorICAyNzEyMDY1MTg5VSwJLy8gPDcsNywyLDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NywyLDIsMj4KKyAgMjcxMjA2NTE5NlUsCS8vIDw3LDcsMiwzPjogQ29zdCAzIHZleHQzIFJIUywgPDcsMiwzLDA+CisgIDM3NzMxMjU4MThVLAkvLyA8Nyw3LDIsND46IENvc3QgNCB2ZXh0MyA8Miw0LDUsNz4sIDw3LDIsNCw1PgorICAzNzY2NDkwMzA1VSwJLy8gPDcsNywyLDU+OiBDb3N0IDQgdmV4dDMgPDEsMyw1LDc+LCA8NywyLDUsMz4KKyAgMjcwMDU2MzY1OFUsCS8vIDw3LDcsMiw2PjogQ29zdCAzIHZleHQzIDwyLDYsMyw3PiwgPDcsMiw2LDM+CisgIDI3MzU5NTMxMDdVLAkvLyA8Nyw3LDIsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDIsNywzPgorICAyNzAxODkwNzgwVSwJLy8gPDcsNywyLHU+OiBDb3N0IDMgdmV4dDMgPDIsdSwzLDc+LCA8NywyLHUsMz4KKyAgMjcxMjA2NTI1MVUsCS8vIDw3LDcsMywwPjogQ29zdCAzIHZleHQzIFJIUywgPDcsMywwLDE+CisgIDM3NjY0OTAzNTBVLAkvLyA8Nyw3LDMsMT46IENvc3QgNCB2ZXh0MyA8MSwzLDUsNz4sIDw3LDMsMSwzPgorICAzNzc0MzA1NTMwVSwJLy8gPDcsNywzLDI+OiBDb3N0IDQgdmV4dDMgPDIsNiwzLDc+LCA8NywzLDIsNj4KKyAgMjYzNzcyODE5NlUsCS8vIDw3LDcsMywzPjogQ29zdCAzIHZleHQyIDwzLDMsNyw3PiwgPDMsMyw3LDc+CisgIDI3MTIwNjUyOTFVLAkvLyA8Nyw3LDMsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDMsNCw1PgorICAyNTg1MTg2NDg2VSwJLy8gPDcsNywzLDU+OiBDb3N0IDMgdmV4dDEgPDUsNyw3LDM+LCA8NSw3LDcsMz4KKyAgMjYzOTcxOTA5NVUsCS8vIDw3LDcsMyw2PjogQ29zdCAzIHZleHQyIDwzLDYsNyw3PiwgPDMsNiw3LDc+CisgIDI2NDAzODI3MjhVLAkvLyA8Nyw3LDMsNz46IENvc3QgMyB2ZXh0MiA8Myw3LDcsNz4sIDwzLDcsNyw3PgorICAyNjQxMDQ2MzYxVSwJLy8gPDcsNywzLHU+OiBDb3N0IDMgdmV4dDIgPDMsdSw3LDc+LCA8Myx1LDcsNz4KKyAgMjcxMjIxMjc5MlUsCS8vIDw3LDcsNCwwPjogQ29zdCAzIHZleHQzIFJIUywgPDcsNCwwLDU+CisgIDM2NDY5ODkzMTJVLAkvLyA8Nyw3LDQsMT46IENvc3QgNCB2ZXh0MSA8Myw3LDcsND4sIDwxLDMsNSw3PgorICAzNzg1ODA3MTc2VSwJLy8gPDcsNyw0LDI+OiBDb3N0IDQgdmV4dDMgUkhTLCA8Nyw0LDIsMz4KKyAgMzY0Njk5MTEwOVUsCS8vIDw3LDcsNCwzPjogQ29zdCA0IHZleHQxIDwzLDcsNyw0PiwgPDMsNyw3LDQ+CisgIDI3MTIwNjUzNzFVLAkvLyA8Nyw3LDQsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDQsNCw0PgorICAxNjM4MzIzNTU4VSwJLy8gPDcsNyw0LDU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8Nyw0LDUsNj4KKyAgMjcxMjIxMjg0NVUsCS8vIDw3LDcsNCw2PjogQ29zdCAzIHZleHQzIFJIUywgPDcsNCw2LDQ+CisgIDI1OTExNjc4NDZVLAkvLyA8Nyw3LDQsNz46IENvc3QgMyB2ZXh0MSA8Niw3LDcsND4sIDw3LDQsNSw2PgorICAxNjM4MzIzNTg1VSwJLy8gPDcsNyw0LHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8Nyw0LHUsNj4KKyAgMjU4NTE5ODY5NFUsCS8vIDw3LDcsNSwwPjogQ29zdCAzIHZleHQxIDw1LDcsNyw1PiwgTEhTCisgIDI3MTIyMTI4ODRVLAkvLyA8Nyw3LDUsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDUsMSw3PgorICAzNzExNDcxMzkzVSwJLy8gPDcsNyw1LDI+OiBDb3N0IDQgdmV4dDIgPDMsMyw3LDc+LCA8NSwyLDcsMz4KKyAgMjY0OTY3MzU5MFUsCS8vIDw3LDcsNSwzPjogQ29zdCAzIHZleHQyIDw1LDMsNyw3PiwgPDUsMyw3LDc+CisgIDI3MTIwNjU0NTVVLAkvLyA8Nyw3LDUsND46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDUsNCw3PgorICAxNTc3MjU5MDMyVSwJLy8gPDcsNyw1LDU+OiBDb3N0IDIgdmV4dDIgPDUsNSw3LDc+LCA8NSw1LDcsNz4KKyAgMjcxMjA2NTQ3M1UsCS8vIDw3LDcsNSw2PjogQ29zdCAzIHZleHQzIFJIUywgPDcsNSw2LDc+CisgIDI3MTIyMTI5MzZVLAkvLyA8Nyw3LDUsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDUsNyw1PgorICAxNTc5MjQ5OTMxVSwJLy8gPDcsNyw1LHU+OiBDb3N0IDIgdmV4dDIgPDUsdSw3LDc+LCA8NSx1LDcsNz4KKyAgMjU5MTE3ODg1NFUsCS8vIDw3LDcsNiwwPjogQ29zdCAzIHZleHQxIDw2LDcsNyw2PiwgTEhTCisgIDI3MzU5NTMzNzRVLAkvLyA8Nyw3LDYsMT46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDYsMSwwPgorICAyNzEyMjEyOTc0VSwJLy8gPDcsNyw2LDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Nyw2LDIsNz4KKyAgMjY1NTY0NjI4N1UsCS8vIDw3LDcsNiwzPjogQ29zdCAzIHZleHQyIDw2LDMsNyw3PiwgPDYsMyw3LDc+CisgIDI1OTExODIxMzRVLAkvLyA8Nyw3LDYsND46IENvc3QgMyB2ZXh0MSA8Niw3LDcsNj4sIFJIUworICAyNjU2OTczNTUzVSwJLy8gPDcsNyw2LDU+OiBDb3N0IDMgdmV4dDIgPDYsNSw3LDc+LCA8Niw1LDcsNz4KKyAgMTU4Mzg5NTM2MlUsCS8vIDw3LDcsNiw2PjogQ29zdCAyIHZleHQyIDw2LDYsNyw3PiwgPDYsNiw3LDc+CisgIDI3MTIwNjU1NTZVLAkvLyA8Nyw3LDYsNz46IENvc3QgMyB2ZXh0MyBSSFMsIDw3LDYsNywwPgorICAxNTg1MjIyNjI4VSwJLy8gPDcsNyw2LHU+OiBDb3N0IDIgdmV4dDIgPDYsdSw3LDc+LCA8Nix1LDcsNz4KKyAgMTUyMzQxNzE5MFUsCS8vIDw3LDcsNywwPjogQ29zdCAyIHZleHQxIDw3LDcsNyw3PiwgTEhTCisgIDI1OTcxNTk2NzBVLAkvLyA8Nyw3LDcsMT46IENvc3QgMyB2ZXh0MSA8Nyw3LDcsNz4sIDwxLDAsMywyPgorICAyNTk3MTYwNTUyVSwJLy8gPDcsNyw3LDI+OiBDb3N0IDMgdmV4dDEgPDcsNyw3LDc+LCA8MiwyLDIsMj4KKyAgMjU5NzE2MTExMFUsCS8vIDw3LDcsNywzPjogQ29zdCAzIHZleHQxIDw3LDcsNyw3PiwgPDMsMCwxLDI+CisgIDE1MjM0MjA0NzBVLAkvLyA8Nyw3LDcsND46IENvc3QgMiB2ZXh0MSA8Nyw3LDcsNz4sIFJIUworICAyNjUxMDAyMjk2VSwJLy8gPDcsNyw3LDU+OiBDb3N0IDMgdmV4dDIgPDUsNSw3LDc+LCA8Nyw1LDUsNz4KKyAgMjY1NzYzNzkwNlUsCS8vIDw3LDcsNyw2PjogQ29zdCAzIHZleHQyIDw2LDYsNyw3PiwgPDcsNiw2LDc+CisgIDM2MzI1MzA0NlUsCS8vIDw3LDcsNyw3PjogQ29zdCAxIHZkdXAzIFJIUworICAzNjMyNTMwNDZVLAkvLyA8Nyw3LDcsdT46IENvc3QgMSB2ZHVwMyBSSFMKKyAgMTUyMzQxNzE5MFUsCS8vIDw3LDcsdSwwPjogQ29zdCAyIHZleHQxIDw3LDcsNyw3PiwgTEhTCisgIDE2Mzg0NzEyOThVLAkvLyA8Nyw3LHUsMT46IENvc3QgMiB2ZXh0MyBSSFMsIDw3LHUsMSwyPgorICAyNzEyMjEzMTMyVSwJLy8gPDcsNyx1LDI+OiBDb3N0IDMgdmV4dDMgUkhTLCA8Nyx1LDIsMz4KKyAgMjcxMjIxMzEzOFUsCS8vIDw3LDcsdSwzPjogQ29zdCAzIHZleHQzIFJIUywgPDcsdSwzLDA+CisgIDE1MjM0MjA0NzBVLAkvLyA8Nyw3LHUsND46IENvc3QgMiB2ZXh0MSA8Nyw3LDcsNz4sIFJIUworICAxNjM4NDcxMzM4VSwJLy8gPDcsNyx1LDU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8Nyx1LDUsNj4KKyAgMTU5NTg0MDc1NlUsCS8vIDw3LDcsdSw2PjogQ29zdCAyIHZleHQyIDx1LDYsNyw3PiwgPHUsNiw3LDc+CisgIDM2MzI1MzA0NlUsCS8vIDw3LDcsdSw3PjogQ29zdCAxIHZkdXAzIFJIUworICAzNjMyNTMwNDZVLAkvLyA8Nyw3LHUsdT46IENvc3QgMSB2ZHVwMyBSSFMKKyAgMTYzODMxODA4MFUsCS8vIDw3LHUsMCwwPjogQ29zdCAyIHZleHQzIFJIUywgPDAsMCwwLDA+CisgIDE2MzgzMjM5MjNVLAkvLyA8Nyx1LDAsMT46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDAsMSwyPgorICAxNjYyMjExODA0VSwJLy8gPDcsdSwwLDI+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSwwLDIsMj4KKyAgMTYzODMyMzk0MVUsCS8vIDw3LHUsMCwzPjogQ29zdCAyIHZleHQzIFJIUywgPHUsMCwzLDI+CisgIDI3MTIwNjU3NzNVLAkvLyA8Nyx1LDAsND46IENvc3QgMyB2ZXh0MyBSSFMsIDx1LDAsNCwxPgorICAxNjYyMzU5Mjg2VSwJLy8gPDcsdSwwLDU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSwwLDUsMT4KKyAgMTY2MjM1OTI5NlUsCS8vIDw3LHUsMCw2PjogQ29zdCAyIHZleHQzIFJIUywgPHUsMCw2LDI+CisgIDI5ODcxNTA2NjRVLAkvLyA8Nyx1LDAsNz46IENvc3QgMyB2emlwciA8NSw2LDcsMD4sIFJIUworICAxNjM4MzIzOTg2VSwJLy8gPDcsdSwwLHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSwwLHUsMj4KKyAgMTUxNzQ2OTc5OFUsCS8vIDw3LHUsMSwwPjogQ29zdCAyIHZleHQxIDw2LDcsdSwxPiwgTEhTCisgIDE2MzgzMTg5MDBVLAkvLyA8Nyx1LDEsMT46IENvc3QgMiB2ZXh0MyBSSFMsIDwxLDEsMSwxPgorICA1NjQ1ODIxOTBVLAkvLyA8Nyx1LDEsMj46IENvc3QgMSB2ZXh0MyBSSFMsIExIUworICAxNjM4MzI0MDIzVSwJLy8gPDcsdSwxLDM+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSwxLDMsMz4KKyAgMTUxNzQ3MzA3OFUsCS8vIDw3LHUsMSw0PjogQ29zdCAyIHZleHQxIDw2LDcsdSwxPiwgUkhTCisgIDI2OTM5Mjg3NzdVLAkvLyA8Nyx1LDEsNT46IENvc3QgMyB2ZXh0MyA8MSw1LDMsNz4sIDx1LDEsNSwzPgorICAxNTE3NDc0NzEwVSwJLy8gPDcsdSwxLDY+OiBDb3N0IDIgdmV4dDEgPDYsNyx1LDE+LCA8Niw3LHUsMT4KKyAgMTY0MDQ2MjE3MVUsCS8vIDw3LHUsMSw3PjogQ29zdCAyIHZleHQzIFJIUywgPHUsMSw3LDM+CisgIDU2NDU4MjI0NFUsCS8vIDw3LHUsMSx1PjogQ29zdCAxIHZleHQzIFJIUywgTEhTCisgIDE2MzgzMTgyNDRVLAkvLyA8Nyx1LDIsMD46IENvc3QgMiB2ZXh0MyBSSFMsIDwwLDIsMCwyPgorICAyNzEyMDY1OTA3VSwJLy8gPDcsdSwyLDE+OiBDb3N0IDMgdmV4dDMgUkhTLCA8dSwyLDEsMD4KKyAgMTYzODMxOTcyMFUsCS8vIDw3LHUsMiwyPjogQ29zdCAyIHZleHQzIFJIUywgPDIsMiwyLDI+CisgIDE2MzgzMjQxMDFVLAkvLyA8Nyx1LDIsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDIsMywwPgorICAxNjM4MzE4Mjg0VSwJLy8gPDcsdSwyLDQ+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MCwyLDQsNj4KKyAgMjcxMjA2NTk0N1UsCS8vIDw3LHUsMiw1PjogQ29zdCAzIHZleHQzIFJIUywgPHUsMiw1LDQ+CisgIDI3MDA1NjQzODdVLAkvLyA8Nyx1LDIsNj46IENvc3QgMyB2ZXh0MyA8Miw2LDMsNz4sIDx1LDIsNiwzPgorICAxNjQwMzE0Nzk2VSwJLy8gPDcsdSwyLDc+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSwyLDcsMz4KKyAgMTYzODMyNDE0NlUsCS8vIDw3LHUsMix1PjogQ29zdCAyIHZleHQzIFJIUywgPHUsMix1LDA+CisgIDE2MzgzMjQxNTZVLAkvLyA8Nyx1LDMsMD46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDMsMCwxPgorICAxNjM4MzE5MDY0VSwJLy8gPDcsdSwzLDE+OiBDb3N0IDIgdmV4dDMgUkhTLCA8MSwzLDEsMz4KKyAgMjcwMDU2NDQzNVUsCS8vIDw3LHUsMywyPjogQ29zdCAzIHZleHQzIDwyLDYsMyw3PiwgPHUsMywyLDY+CisgIDE2MzgzMjA1NDBVLAkvLyA8Nyx1LDMsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDwzLDMsMywzPgorICAxNjM4MzI0MTk2VSwJLy8gPDcsdSwzLDQ+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSwzLDQsNT4KKyAgMTYzODMyNDIwN1UsCS8vIDw3LHUsMyw1PjogQ29zdCAyIHZleHQzIFJIUywgPHUsMyw1LDc+CisgIDI3MDA1NjQ0NzJVLAkvLyA8Nyx1LDMsNj46IENvc3QgMyB2ZXh0MyA8Miw2LDMsNz4sIDx1LDMsNiw3PgorICAyNjk1OTE5NjEwVSwJLy8gPDcsdSwzLDc+OiBDb3N0IDMgdmV4dDMgPDEsdSwzLDc+LCA8dSwzLDcsMD4KKyAgMTYzODMyNDIyOFUsCS8vIDw3LHUsMyx1PjogQ29zdCAyIHZleHQzIFJIUywgPHUsMyx1LDE+CisgIDI3MTIwNjYwNjFVLAkvLyA8Nyx1LDQsMD46IENvc3QgMyB2ZXh0MyBSSFMsIDx1LDQsMCwxPgorICAxNjYyMjEyMTIyVSwJLy8gPDcsdSw0LDE+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSw0LDEsNT4KKyAgMTY2MjIxMjEzMlUsCS8vIDw3LHUsNCwyPjogQ29zdCAyIHZleHQzIFJIUywgPHUsNCwyLDY+CisgIDI3MTIwNjYwOTJVLAkvLyA8Nyx1LDQsMz46IENvc3QgMyB2ZXh0MyBSSFMsIDx1LDQsMyw1PgorICAxNjM4MzIxMzYwVSwJLy8gPDcsdSw0LDQ+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NCw0LDQsND4KKyAgMTYzODMyNDI4N1UsCS8vIDw3LHUsNCw1PjogQ29zdCAyIHZleHQzIFJIUywgPHUsNCw1LDY+CisgIDE2NjIzNTk2MjRVLAkvLyA8Nyx1LDQsNj46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDQsNiw2PgorICAxNjQwMzE0OTYxVSwJLy8gPDcsdSw0LDc+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSw0LDcsNj4KKyAgMTYzODMyNDMxNFUsCS8vIDw3LHUsNCx1PjogQ29zdCAyIHZleHQzIFJIUywgPHUsNCx1LDY+CisgIDE1MTc1MDI1NjZVLAkvLyA8Nyx1LDUsMD46IENvc3QgMiB2ZXh0MSA8Niw3LHUsNT4sIExIUworICAxNTc0NjEyNjkzVSwJLy8gPDcsdSw1LDE+OiBDb3N0IDIgdmV4dDIgPDUsMSw3LHU+LCA8NSwxLDcsdT4KKyAgMjcxMjA2NjE2MlUsCS8vIDw3LHUsNSwyPjogQ29zdCAzIHZleHQzIFJIUywgPHUsNSwyLDM+CisgIDE2MzgzMjQzNTFVLAkvLyA8Nyx1LDUsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDUsMyw3PgorICAxNTc2NjAzNTkyVSwJLy8gPDcsdSw1LDQ+OiBDb3N0IDIgdmV4dDIgPDUsNCw3LHU+LCA8NSw0LDcsdT4KKyAgMTU3NzI2NzIyNVUsCS8vIDw3LHUsNSw1PjogQ29zdCAyIHZleHQyIDw1LDUsNyx1PiwgPDUsNSw3LHU+CisgIDU2NDU4MjU1NFUsCS8vIDw3LHUsNSw2PjogQ29zdCAxIHZleHQzIFJIUywgUkhTCisgIDE2NDA0NjI0OTlVLAkvLyA8Nyx1LDUsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDUsNyw3PgorICA1NjQ1ODI1NzJVLAkvLyA8Nyx1LDUsdT46IENvc3QgMSB2ZXh0MyBSSFMsIFJIUworICAyNzEyMDY2MjIzVSwJLy8gPDcsdSw2LDA+OiBDb3N0IDMgdmV4dDMgUkhTLCA8dSw2LDAsMT4KKyAgMjcxMjA2NjIzOFUsCS8vIDw3LHUsNiwxPjogQ29zdCAzIHZleHQzIFJIUywgPHUsNiwxLDc+CisgIDE1ODEyNDkwMjNVLAkvLyA8Nyx1LDYsMj46IENvc3QgMiB2ZXh0MiA8NiwyLDcsdT4sIDw2LDIsNyx1PgorICAxNjM4MzI0NDMyVSwJLy8gPDcsdSw2LDM+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSw2LDMsNz4KKyAgMTYzODQ2ODk4MFUsCS8vIDw3LHUsNiw0PjogQ29zdCAyIHZleHQzIFJIUywgPDQsNiw0LDY+CisgIDI3MTIwNjYyNzRVLAkvLyA8Nyx1LDYsNT46IENvc3QgMyB2ZXh0MyBSSFMsIDx1LDYsNSw3PgorICAxNTgzOTAzNTU1VSwJLy8gPDcsdSw2LDY+OiBDb3N0IDIgdmV4dDIgPDYsNiw3LHU+LCA8Niw2LDcsdT4KKyAgMTY0MDMxNTExN1UsCS8vIDw3LHUsNiw3PjogQ29zdCAyIHZleHQzIFJIUywgPHUsNiw3LDA+CisgIDE2MzgzMjQ0NzdVLAkvLyA8Nyx1LDYsdT46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDYsdSw3PgorICAxNjM4NDcxOTM2VSwJLy8gPDcsdSw3LDA+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSw3LDAsMT4KKyAgMjY5Mjk3MDc2M1UsCS8vIDw3LHUsNywxPjogQ29zdCAzIHZleHQzIDwxLDMsdSw3PiwgPHUsNywxLDM+CisgIDI3MDA5MzMzOTlVLAkvLyA8Nyx1LDcsMj46IENvc3QgMyB2ZXh0MyA8Miw2LHUsNz4sIDx1LDcsMiw2PgorICAyNTczMzQ3NjAxVSwJLy8gPDcsdSw3LDM+OiBDb3N0IDMgdmV4dDEgPDMsNyx1LDc+LCA8Myw3LHUsNz4KKyAgMTYzODQ3MTk3NlUsCS8vIDw3LHUsNyw0PjogQ29zdCAyIHZleHQzIFJIUywgPHUsNyw0LDU+CisgIDE1MTE1NTExNzFVLAkvLyA8Nyx1LDcsNT46IENvc3QgMiB2ZXh0MSA8NSw3LHUsNz4sIDw1LDcsdSw3PgorICAyNzEyMjEzODE1VSwJLy8gPDcsdSw3LDY+OiBDb3N0IDMgdmV4dDMgUkhTLCA8dSw3LDYsMj4KKyAgMzYzMjUzMDQ2VSwJLy8gPDcsdSw3LDc+OiBDb3N0IDEgdmR1cDMgUkhTCisgIDM2MzI1MzA0NlUsCS8vIDw3LHUsNyx1PjogQ29zdCAxIHZkdXAzIFJIUworICAxNjM4MzI0NTYxVSwJLy8gPDcsdSx1LDA+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSx1LDAsMT4KKyAgMTYzODMyNDU3MVUsCS8vIDw3LHUsdSwxPjogQ29zdCAyIHZleHQzIFJIUywgPHUsdSwxLDI+CisgIDU2NDU4Mjc1N1UsCS8vIDw3LHUsdSwyPjogQ29zdCAxIHZleHQzIFJIUywgTEhTCisgIDE2MzgzMjQ1ODdVLAkvLyA8Nyx1LHUsMz46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LHUsMywwPgorICAxNjM4MzI0NjAxVSwJLy8gPDcsdSx1LDQ+OiBDb3N0IDIgdmV4dDMgUkhTLCA8dSx1LDQsNT4KKyAgMTYzODMyNDYxMVUsCS8vIDw3LHUsdSw1PjogQ29zdCAyIHZleHQzIFJIUywgPHUsdSw1LDY+CisgIDU2NDU4Mjc5N1UsCS8vIDw3LHUsdSw2PjogQ29zdCAxIHZleHQzIFJIUywgUkhTCisgIDM2MzI1MzA0NlUsCS8vIDw3LHUsdSw3PjogQ29zdCAxIHZkdXAzIFJIUworICA1NjQ1ODI4MTFVLAkvLyA8Nyx1LHUsdT46IENvc3QgMSB2ZXh0MyBSSFMsIExIUworICAxMzUwNTM0MTRVLAkvLyA8dSwwLDAsMD46IENvc3QgMSB2ZHVwMCBMSFMKKyAgMTYxMTQ4OTI5MFUsCS8vIDx1LDAsMCwxPjogQ29zdCAyIHZleHQzIExIUywgPDAsMCwxLDE+CisgIDE2MTE0ODkzMDBVLAkvLyA8dSwwLDAsMj46IENvc3QgMiB2ZXh0MyBMSFMsIDwwLDAsMiwyPgorICAyNTY4MDU0OTIzVSwJLy8gPHUsMCwwLDM+OiBDb3N0IDMgdmV4dDEgPDMsMCwwLDA+LCA8MywwLDAsMD4KKyAgMTQ4MTcwNjgwNlUsCS8vIDx1LDAsMCw0PjogQ29zdCAyIHZleHQxIDwwLHUsMCwwPiwgUkhTCisgIDI1NTU0NDkwNDBVLAkvLyA8dSwwLDAsNT46IENvc3QgMyB2ZXh0MSA8MCx1LDAsMD4sIDw1LDEsNywzPgorICAyNTkxMjgyMDc4VSwJLy8gPHUsMCwwLDY+OiBDb3N0IDMgdmV4dDEgPDYsdSwwLDA+LCA8Nix1LDAsMD4KKyAgMjU5MTk0NTcxMVUsCS8vIDx1LDAsMCw3PjogQ29zdCAzIHZleHQxIDw3LDAsMCwwPiwgPDcsMCwwLDA+CisgIDEzNTA1MzQxNFUsCS8vIDx1LDAsMCx1PjogQ29zdCAxIHZkdXAwIExIUworICAxNDkzNjU1NjU0VSwJLy8gPHUsMCwxLDA+OiBDb3N0IDIgdmV4dDEgPDIsdSwwLDE+LCBMSFMKKyAgMTg2MDU1MDc1OFUsCS8vIDx1LDAsMSwxPjogQ29zdCAyIHZ6aXBsIExIUywgTEhTCisgIDUzNzc0NzU2M1UsCS8vIDx1LDAsMSwyPjogQ29zdCAxIHZleHQzIExIUywgTEhTCisgIDI2MjUxMzU1NzZVLAkvLyA8dSwwLDEsMz46IENvc3QgMyB2ZXh0MiA8MSwyLHUsMD4sIDwxLDMsMSwzPgorICAxNDkzNjU4OTM0VSwJLy8gPHUsMCwxLDQ+OiBDb3N0IDIgdmV4dDEgPDIsdSwwLDE+LCBSSFMKKyAgMjYyNTEzNTc2MFUsCS8vIDx1LDAsMSw1PjogQ29zdCAzIHZleHQyIDwxLDIsdSwwPiwgPDEsNSwzLDc+CisgIDE1MTc1NDg0NDdVLAkvLyA8dSwwLDEsNj46IENvc3QgMiB2ZXh0MSA8Nix1LDAsMT4sIDw2LHUsMCwxPgorICAyNTkxMjkwMzYyVSwJLy8gPHUsMCwxLDc+OiBDb3N0IDMgdmV4dDEgPDYsdSwwLDE+LCA8NywwLDEsMj4KKyAgNTM3NzQ3NjEyVSwJLy8gPHUsMCwxLHU+OiBDb3N0IDEgdmV4dDMgTEhTLCBMSFMKKyAgMTYxMTQ4OTQ0NFUsCS8vIDx1LDAsMiwwPjogQ29zdCAyIHZleHQzIExIUywgPDAsMiwwLDI+CisgIDI2ODUyMzEyNzZVLAkvLyA8dSwwLDIsMT46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLDIsMSwxPgorICAxOTk0NzY4NDg2VSwJLy8gPHUsMCwyLDI+OiBDb3N0IDIgdnRybmwgTEhTLCBMSFMKKyAgMjY4NTIzMTI5NFUsCS8vIDx1LDAsMiwzPjogQ29zdCAzIHZleHQzIExIUywgPDAsMiwzLDE+CisgIDE2MTE0ODk0ODRVLAkvLyA8dSwwLDIsND46IENvc3QgMiB2ZXh0MyBMSFMsIDwwLDIsNCw2PgorICAyNzEyMDY4MzEwVSwJLy8gPHUsMCwyLDU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MCwyLDUsNz4KKyAgMjYyNTEzNjU3MFUsCS8vIDx1LDAsMiw2PjogQ29zdCAzIHZleHQyIDwxLDIsdSwwPiwgPDIsNiwzLDc+CisgIDI1OTE5NjIwOTdVLAkvLyA8dSwwLDIsNz46IENvc3QgMyB2ZXh0MSA8NywwLDAsMj4sIDw3LDAsMCwyPgorICAxNjExNDg5NTE2VSwJLy8gPHUsMCwyLHU+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MCwyLHUsMj4KKyAgMjk1NDA2Nzk2OFUsCS8vIDx1LDAsMywwPjogQ29zdCAzIHZ6aXByIExIUywgPDAsMCwwLDA+CisgIDI2ODUyMzEzNTZVLAkvLyA8dSwwLDMsMT46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLDMsMSwwPgorICA3MjU4OTk4MVUsCS8vIDx1LDAsMywyPjogQ29zdCAxIHZyZXYgTEhTCisgIDI2MjUxMzcwNTJVLAkvLyA8dSwwLDMsMz46IENvc3QgMyB2ZXh0MiA8MSwyLHUsMD4sIDwzLDMsMywzPgorICAyNjI1MTM3MTU0VSwJLy8gPHUsMCwzLDQ+OiBDb3N0IDMgdmV4dDIgPDEsMix1LDA+LCA8Myw0LDUsNj4KKyAgMjYzOTA3MTg0OFUsCS8vIDx1LDAsMyw1PjogQ29zdCAzIHZleHQyIDwzLDUsdSwwPiwgPDMsNSx1LDA+CisgIDI2Mzk3MzU0ODFVLAkvLyA8dSwwLDMsNj46IENvc3QgMyB2ZXh0MiA8Myw2LHUsMD4sIDwzLDYsdSwwPgorICAyNTk3Mjc5MzU0VSwJLy8gPHUsMCwzLDc+OiBDb3N0IDMgdmV4dDEgPDcsdSwwLDM+LCA8Nyx1LDAsMz4KKyAgNzMwMzI0MDNVLAkvLyA8dSwwLDMsdT46IENvc3QgMSB2cmV2IExIUworICAyNjg3MDc0NjM2VSwJLy8gPHUsMCw0LDA+OiBDb3N0IDMgdmV4dDMgPDAsNCwwLHU+LCA8MCw0LDAsdT4KKyAgMTYxMTQ4OTYxOFUsCS8vIDx1LDAsNCwxPjogQ29zdCAyIHZleHQzIExIUywgPDAsNCwxLDU+CisgIDE2MTE0ODk2MjhVLAkvLyA8dSwwLDQsMj46IENvc3QgMiB2ZXh0MyBMSFMsIDwwLDQsMiw2PgorICAzNjI5MjIyMDM4VSwJLy8gPHUsMCw0LDM+OiBDb3N0IDQgdmV4dDEgPDAsdSwwLDQ+LCA8MywwLDEsMj4KKyAgMjU1NTQ4MTM5OFUsCS8vIDx1LDAsNCw0PjogQ29zdCAzIHZleHQxIDwwLHUsMCw0PiwgUkhTCisgIDE1NTEzOTYxNTBVLAkvLyA8dSwwLDQsNT46IENvc3QgMiB2ZXh0MiA8MSwyLHUsMD4sIFJIUworICAyNjUxNjgwMTE2VSwJLy8gPHUsMCw0LDY+OiBDb3N0IDMgdmV4dDIgPDUsNix1LDA+LCA8NCw2LDQsNj4KKyAgMjY0NjE1MDYwMFUsCS8vIDx1LDAsNCw3PjogQ29zdCAzIHZleHQyIDw0LDcsNSwwPiwgPDQsNyw1LDA+CisgIDE2MTE5MzIwNTBVLAkvLyA8dSwwLDQsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwwLDQsdSw2PgorICAyNTYxNDU4Mjc4VSwJLy8gPHUsMCw1LDA+OiBDb3N0IDMgdmV4dDEgPDEsdSwwLDU+LCBMSFMKKyAgMTg2MzUzMjY0NlUsCS8vIDx1LDAsNSwxPjogQ29zdCAyIHZ6aXBsIFJIUywgTEhTCisgIDI3MTIwNjg1MjZVLAkvLyA8dSwwLDUsMj46IENvc3QgMyB2ZXh0MyBSSFMsIDwwLDUsMiw3PgorICAyNjQ5Njg5OTc2VSwJLy8gPHUsMCw1LDM+OiBDb3N0IDMgdmV4dDIgPDUsMyx1LDA+LCA8NSwzLHUsMD4KKyAgMjIyMDIzNzQ4OVUsCS8vIDx1LDAsNSw0PjogQ29zdCAzIHZyZXYgPDAsdSw0LDU+CisgIDI2NTE2ODA3NzJVLAkvLyA8dSwwLDUsNT46IENvc3QgMyB2ZXh0MiA8NSw2LHUsMD4sIDw1LDUsNSw1PgorICAxNTc3OTM5MDUxVSwJLy8gPHUsMCw1LDY+OiBDb3N0IDIgdmV4dDIgPDUsNix1LDA+LCA8NSw2LHUsMD4KKyAgMjgzMDA3NzIzOFUsCS8vIDx1LDAsNSw3PjogQ29zdCAzIHZ1enByIDwxLHUsMywwPiwgUkhTCisgIDE1NzkyNjYzMTdVLAkvLyA8dSwwLDUsdT46IENvc3QgMiB2ZXh0MiA8NSx1LHUsMD4sIDw1LHUsdSwwPgorICAyNTU1NDk0NTAyVSwJLy8gPHUsMCw2LDA+OiBDb3N0IDMgdmV4dDEgPDAsdSwwLDY+LCBMSFMKKyAgMjcxMjA2ODU5OFUsCS8vIDx1LDAsNiwxPjogQ29zdCAzIHZleHQzIFJIUywgPDAsNiwxLDc+CisgIDE5OTc3NTAzNzRVLAkvLyA8dSwwLDYsMj46IENvc3QgMiB2dHJubCBSSFMsIExIUworICAyNjU1NjYyNjczVSwJLy8gPHUsMCw2LDM+OiBDb3N0IDMgdmV4dDIgPDYsMyx1LDA+LCA8NiwzLHUsMD4KKyAgMjU1NTQ5Nzc4MlUsCS8vIDx1LDAsNiw0PjogQ29zdCAzIHZleHQxIDwwLHUsMCw2PiwgUkhTCisgIDI2NTE2ODE0NTlVLAkvLyA8dSwwLDYsNT46IENvc3QgMyB2ZXh0MiA8NSw2LHUsMD4sIDw2LDUsMCx1PgorICAyNjUxNjgxNTkyVSwJLy8gPHUsMCw2LDY+OiBDb3N0IDMgdmV4dDIgPDUsNix1LDA+LCA8Niw2LDYsNj4KKyAgMjY1MTY4MTYxNFUsCS8vIDx1LDAsNiw3PjogQ29zdCAzIHZleHQyIDw1LDYsdSwwPiwgPDYsNywwLDE+CisgIDE5OTc3NTA0MjhVLAkvLyA8dSwwLDYsdT46IENvc3QgMiB2dHJubCBSSFMsIExIUworICAyNTY3NDQ2NjMwVSwJLy8gPHUsMCw3LDA+OiBDb3N0IDMgdmV4dDEgPDIsdSwwLDc+LCBMSFMKKyAgMjU2NzQ0NzQ0NlUsCS8vIDx1LDAsNywxPjogQ29zdCAzIHZleHQxIDwyLHUsMCw3PiwgPDEsMiwzLDA+CisgIDI1Njc0NDg2NDFVLAkvLyA8dSwwLDcsMj46IENvc3QgMyB2ZXh0MSA8Mix1LDAsNz4sIDwyLHUsMCw3PgorICAyNTczNDIxMzM4VSwJLy8gPHUsMCw3LDM+OiBDb3N0IDMgdmV4dDEgPDMsdSwwLDc+LCA8Myx1LDAsNz4KKyAgMjU2NzQ0OTkxMFUsCS8vIDx1LDAsNyw0PjogQ29zdCAzIHZleHQxIDwyLHUsMCw3PiwgUkhTCisgIDI2NTE2ODIyNDJVLAkvLyA8dSwwLDcsNT46IENvc3QgMyB2ZXh0MiA8NSw2LHUsMD4sIDw3LDUsNix1PgorICAyNTkxMzM5NDI5VSwJLy8gPHUsMCw3LDY+OiBDb3N0IDMgdmV4dDEgPDYsdSwwLDc+LCA8Nix1LDAsNz4KKyAgMjY1MTY4MjQxMlUsCS8vIDx1LDAsNyw3PjogQ29zdCAzIHZleHQyIDw1LDYsdSwwPiwgPDcsNyw3LDc+CisgIDI1Njc0NTI0NjJVLAkvLyA8dSwwLDcsdT46IENvc3QgMyB2ZXh0MSA8Mix1LDAsNz4sIExIUworICAxMzUwNTM0MTRVLAkvLyA8dSwwLHUsMD46IENvc3QgMSB2ZHVwMCBMSFMKKyAgMTYxMTQ4OTkzOFUsCS8vIDx1LDAsdSwxPjogQ29zdCAyIHZleHQzIExIUywgPDAsdSwxLDE+CisgIDUzNzc0ODEyNVUsCS8vIDx1LDAsdSwyPjogQ29zdCAxIHZleHQzIExIUywgTEhTCisgIDI2ODU2NzQxNDhVLAkvLyA8dSwwLHUsMz46IENvc3QgMyB2ZXh0MyBMSFMsIDwwLHUsMywxPgorICAxNjExOTMyMzM4VSwJLy8gPHUsMCx1LDQ+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MCx1LDQsNj4KKyAgMTU1MTM5OTA2NlUsCS8vIDx1LDAsdSw1PjogQ29zdCAyIHZleHQyIDwxLDIsdSwwPiwgUkhTCisgIDE1MTc2MDU3OThVLAkvLyA8dSwwLHUsNj46IENvc3QgMiB2ZXh0MSA8Nix1LDAsdT4sIDw2LHUsMCx1PgorICAyODMwMDc3NDgxVSwJLy8gPHUsMCx1LDc+OiBDb3N0IDMgdnV6cHIgPDEsdSwzLDA+LCBSSFMKKyAgNTM3NzQ4MTc5VSwJLy8gPHUsMCx1LHU+OiBDb3N0IDEgdmV4dDMgTEhTLCBMSFMKKyAgMTU0NDEwMTk2MVUsCS8vIDx1LDEsMCwwPjogQ29zdCAyIHZleHQyIDwwLDAsdSwxPiwgPDAsMCx1LDE+CisgIDE1NTgwMzY1ODJVLAkvLyA8dSwxLDAsMT46IENvc3QgMiB2ZXh0MiA8MiwzLHUsMT4sIExIUworICAyNjE5MTcxMDUxVSwJLy8gPHUsMSwwLDI+OiBDb3N0IDMgdmV4dDIgPDAsMix1LDE+LCA8MCwyLHUsMT4KKyAgMTYxMTQ5MDAzOFUsCS8vIDx1LDEsMCwzPjogQ29zdCAyIHZleHQzIExIUywgPDEsMCwzLDI+CisgIDI1NTU1MjIzNThVLAkvLyA8dSwxLDAsND46IENvc3QgMyB2ZXh0MSA8MCx1LDEsMD4sIFJIUworICAyNzEyMDY4ODcxVSwJLy8gPHUsMSwwLDU+OiBDb3N0IDMgdmV4dDMgUkhTLCA8MSwwLDUsMT4KKyAgMjU5MTM1NTgxNVUsCS8vIDx1LDEsMCw2PjogQ29zdCAzIHZleHQxIDw2LHUsMSwwPiwgPDYsdSwxLDA+CisgIDI1OTczMjg1MTJVLAkvLyA8dSwxLDAsNz46IENvc3QgMyB2ZXh0MSA8Nyx1LDEsMD4sIDw3LHUsMSwwPgorICAxNjExNDkwMDgzVSwJLy8gPHUsMSwwLHU+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MSwwLHUsMj4KKyAgMTQ4MTc4NTQ0NlUsCS8vIDx1LDEsMSwwPjogQ29zdCAyIHZleHQxIDwwLHUsMSwxPiwgTEhTCisgIDIwMjE2MjI3OFUsCS8vIDx1LDEsMSwxPjogQ29zdCAxIHZkdXAxIExIUworICAyNTU1NTI4ODA4VSwJLy8gPHUsMSwxLDI+OiBDb3N0IDMgdmV4dDEgPDAsdSwxLDE+LCA8MiwyLDIsMj4KKyAgMTYxMTQ5MDEyMFUsCS8vIDx1LDEsMSwzPjogQ29zdCAyIHZleHQzIExIUywgPDEsMSwzLDM+CisgIDE0ODE3ODg3MjZVLAkvLyA8dSwxLDEsND46IENvc3QgMiB2ZXh0MSA8MCx1LDEsMT4sIFJIUworICAyNjg5ODc2ODI4VSwJLy8gPHUsMSwxLDU+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MSwxLDUsNT4KKyAgMjU5MTM2NDAwOFUsCS8vIDx1LDEsMSw2PjogQ29zdCAzIHZleHQxIDw2LHUsMSwxPiwgPDYsdSwxLDE+CisgIDI1OTI2OTEyNzRVLAkvLyA8dSwxLDEsNz46IENvc3QgMyB2ZXh0MSA8NywxLDEsMT4sIDw3LDEsMSwxPgorICAyMDIxNjIyNzhVLAkvLyA8dSwxLDEsdT46IENvc3QgMSB2ZHVwMSBMSFMKKyAgMTQ5OTcwOTU0MlUsCS8vIDx1LDEsMiwwPjogQ29zdCAyIHZleHQxIDwzLHUsMSwyPiwgTEhTCisgIDI2ODk4NzY4NzFVLAkvLyA8dSwxLDIsMT46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDIsMSwzPgorICAyNjMxMTE2NDQ1VSwJLy8gPHUsMSwyLDI+OiBDb3N0IDMgdmV4dDIgPDIsMix1LDE+LCA8MiwyLHUsMT4KKyAgODM1NTg0VSwJLy8gPHUsMSwyLDM+OiBDb3N0IDAgY29weSBMSFMKKyAgMTQ5OTcxMjgyMlUsCS8vIDx1LDEsMiw0PjogQ29zdCAyIHZleHQxIDwzLHUsMSwyPiwgUkhTCisgIDI2ODk4NzY5MDdVLAkvLyA8dSwxLDIsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDIsNSwzPgorICAyNjMxNzgwMjgyVSwJLy8gPHUsMSwyLDY+OiBDb3N0IDMgdmV4dDIgPDIsMyx1LDE+LCA8Miw2LDMsNz4KKyAgMTUyMzYwMzA3NFUsCS8vIDx1LDEsMiw3PjogQ29zdCAyIHZleHQxIDw3LHUsMSwyPiwgPDcsdSwxLDI+CisgIDgzNTU4NFUsCS8vIDx1LDEsMix1PjogQ29zdCAwIGNvcHkgTEhTCisgIDE0ODc3NzM3OThVLAkvLyA8dSwxLDMsMD46IENvc3QgMiB2ZXh0MSA8MSx1LDEsMz4sIExIUworICAxNjExNDkwMjY0VSwJLy8gPHUsMSwzLDE+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MSwzLDEsMz4KKyAgMjY4NTIzMjA5NFUsCS8vIDx1LDEsMywyPjogQ29zdCAzIHZleHQzIExIUywgPDEsMywyLDA+CisgIDIwMTg3NDY0NzBVLAkvLyA8dSwxLDMsMz46IENvc3QgMiB2dHJuciBMSFMsIExIUworICAxNDg3Nzc3MDc4VSwJLy8gPHUsMSwzLDQ+OiBDb3N0IDIgdmV4dDEgPDEsdSwxLDM+LCBSSFMKKyAgMTYxMTQ5MDMwNFUsCS8vIDx1LDEsMyw1PjogQ29zdCAyIHZleHQzIExIUywgPDEsMyw1LDc+CisgIDI2ODU2NzQ1MDVVLAkvLyA8dSwxLDMsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDMsNiw3PgorICAyNjQwNDA3MzA3VSwJLy8gPHUsMSwzLDc+OiBDb3N0IDMgdmV4dDIgPDMsNyx1LDE+LCA8Myw3LHUsMT4KKyAgMTYxMTQ5MDMyN1UsCS8vIDx1LDEsMyx1PjogQ29zdCAyIHZleHQzIExIUywgPDEsMyx1LDM+CisgIDE1Njc5OTI3NDlVLAkvLyA8dSwxLDQsMD46IENvc3QgMiB2ZXh0MiA8NCwwLHUsMT4sIDw0LDAsdSwxPgorICAyNjkzMTIxMDcwVSwJLy8gPHUsMSw0LDE+OiBDb3N0IDMgdmV4dDMgPDEsNCwxLHU+LCA8MSw0LDEsdT4KKyAgMjY5MzE5NDgwN1UsCS8vIDx1LDEsNCwyPjogQ29zdCAzIHZleHQzIDwxLDQsMix1PiwgPDEsNCwyLHU+CisgIDExNTIzODY0MzJVLAkvLyA8dSwxLDQsMz46IENvc3QgMiB2cmV2IDwxLHUsMyw0PgorICAyNTU1NTU1MTI2VSwJLy8gPHUsMSw0LDQ+OiBDb3N0IDMgdmV4dDEgPDAsdSwxLDQ+LCBSSFMKKyAgMTU1ODAzOTg2MlUsCS8vIDx1LDEsNCw1PjogQ29zdCAyIHZleHQyIDwyLDMsdSwxPiwgUkhTCisgIDI2NDU3MTYzNzFVLAkvLyA8dSwxLDQsNj46IENvc3QgMyB2ZXh0MiA8NCw2LHUsMT4sIDw0LDYsdSwxPgorICAyNTk3MzYxMjg0VSwJLy8gPHUsMSw0LDc+OiBDb3N0IDMgdmV4dDEgPDcsdSwxLDQ+LCA8Nyx1LDEsND4KKyAgMTE1Mjc1NTExN1UsCS8vIDx1LDEsNCx1PjogQ29zdCAyIHZyZXYgPDEsdSx1LDQ+CisgIDE0ODE4MTgyMTRVLAkvLyA8dSwxLDUsMD46IENvc3QgMiB2ZXh0MSA8MCx1LDEsNT4sIExIUworICAyNTU1NTYwNjk0VSwJLy8gPHUsMSw1LDE+OiBDb3N0IDMgdmV4dDEgPDAsdSwxLDU+LCA8MSwwLDMsMj4KKyAgMjU1NTU2MTU3NlUsCS8vIDx1LDEsNSwyPjogQ29zdCAzIHZleHQxIDwwLHUsMSw1PiwgPDIsMiwyLDI+CisgIDE2MTE0OTA0NDhVLAkvLyA8dSwxLDUsMz46IENvc3QgMiB2ZXh0MyBMSFMsIDwxLDUsMyw3PgorICAxNDgxODIxNDk0VSwJLy8gPHUsMSw1LDQ+OiBDb3N0IDIgdmV4dDEgPDAsdSwxLDU+LCBSSFMKKyAgMjY1MTAyNTQzNVUsCS8vIDx1LDEsNSw1PjogQ29zdCAzIHZleHQyIDw1LDUsdSwxPiwgPDUsNSx1LDE+CisgIDI2NTE2ODkwNjhVLAkvLyA8dSwxLDUsNj46IENvc3QgMyB2ZXh0MiA8NSw2LHUsMT4sIDw1LDYsdSwxPgorICAyODIzOTY2MDA2VSwJLy8gPHUsMSw1LDc+OiBDb3N0IDMgdnV6cHIgPDAsdSwxLDE+LCBSSFMKKyAgMTYxMTkzMjg2MVUsCS8vIDx1LDEsNSx1PjogQ29zdCAyIHZleHQzIExIUywgPDEsNSx1LDc+CisgIDI1NTU1NjgyMzBVLAkvLyA8dSwxLDYsMD46IENvc3QgMyB2ZXh0MSA8MCx1LDEsNj4sIExIUworICAyNjg5ODc3MTk5VSwJLy8gPHUsMSw2LDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MSw2LDEsNz4KKyAgMjcxMjA2OTMzNlUsCS8vIDx1LDEsNiwyPjogQ29zdCAzIHZleHQzIFJIUywgPDEsNiwyLDc+CisgIDI2ODUyMzIzNTNVLAkvLyA8dSwxLDYsMz46IENvc3QgMyB2ZXh0MyBMSFMsIDwxLDYsMyw3PgorICAyNTU1NTcxNTEwVSwJLy8gPHUsMSw2LDQ+OiBDb3N0IDMgdmV4dDEgPDAsdSwxLDY+LCBSSFMKKyAgMjY4OTg3NzIzNVUsCS8vIDx1LDEsNiw1PjogQ29zdCAzIHZleHQzIExIUywgPDEsNiw1LDc+CisgIDI2NTc2NjE3NjVVLAkvLyA8dSwxLDYsNj46IENvc3QgMyB2ZXh0MiA8Niw2LHUsMT4sIDw2LDYsdSwxPgorICAxNTg0NTgzNTc0VSwJLy8gPHUsMSw2LDc+OiBDb3N0IDIgdmV4dDIgPDYsNyx1LDE+LCA8Niw3LHUsMT4KKyAgMTU4NTI0NzIwN1UsCS8vIDx1LDEsNix1PjogQ29zdCAyIHZleHQyIDw2LHUsdSwxPiwgPDYsdSx1LDE+CisgIDI1NjE1NDgzOTBVLAkvLyA8dSwxLDcsMD46IENvc3QgMyB2ZXh0MSA8MSx1LDEsNz4sIExIUworICAyNTYxNTQ5NjgxVSwJLy8gPHUsMSw3LDE+OiBDb3N0IDMgdmV4dDEgPDEsdSwxLDc+LCA8MSx1LDEsNz4KKyAgMjU3MzQ5MzkyNlUsCS8vIDx1LDEsNywyPjogQ29zdCAzIHZleHQxIDwzLHUsMSw3PiwgPDIsMywwLDE+CisgIDIwNDI5NjIwMjJVLAkvLyA8dSwxLDcsMz46IENvc3QgMiB2dHJuciBSSFMsIExIUworICAyNTYxNTUxNjcwVSwJLy8gPHUsMSw3LDQ+OiBDb3N0IDMgdmV4dDEgPDEsdSwxLDc+LCBSSFMKKyAgMjIyNjMwMDMwOVUsCS8vIDx1LDEsNyw1PjogQ29zdCAzIHZyZXYgPDEsdSw1LDc+CisgIDI2NTgzMjU5OTBVLAkvLyA8dSwxLDcsNj46IENvc3QgMyB2ZXh0MiA8Niw3LHUsMT4sIDw3LDYsMSx1PgorICAyNjU4MzI2MTI0VSwJLy8gPHUsMSw3LDc+OiBDb3N0IDMgdmV4dDIgPDYsNyx1LDE+LCA8Nyw3LDcsNz4KKyAgMjA0Mjk2MjAyN1UsCS8vIDx1LDEsNyx1PjogQ29zdCAyIHZ0cm5yIFJIUywgTEhTCisgIDE0ODE4NDI3OTBVLAkvLyA8dSwxLHUsMD46IENvc3QgMiB2ZXh0MSA8MCx1LDEsdT4sIExIUworICAyMDIxNjIyNzhVLAkvLyA8dSwxLHUsMT46IENvc3QgMSB2ZHVwMSBMSFMKKyAgMjY4NTY3NDg2N1UsCS8vIDx1LDEsdSwyPjogQ29zdCAzIHZleHQzIExIUywgPDEsdSwyLDA+CisgIDgzNTU4NFUsCS8vIDx1LDEsdSwzPjogQ29zdCAwIGNvcHkgTEhTCisgIDE0ODE4NDYwNzBVLAkvLyA8dSwxLHUsND46IENvc3QgMiB2ZXh0MSA8MCx1LDEsdT4sIFJIUworICAxNjExOTMzMDc3VSwJLy8gPHUsMSx1LDU+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MSx1LDUsNz4KKyAgMjY4NTY3NDkxMFUsCS8vIDx1LDEsdSw2PjogQ29zdCAzIHZleHQzIExIUywgPDEsdSw2LDc+CisgIDE1MjM2NTIyMzJVLAkvLyA8dSwxLHUsNz46IENvc3QgMiB2ZXh0MSA8Nyx1LDEsdT4sIDw3LHUsMSx1PgorICA4MzU1ODRVLAkvLyA8dSwxLHUsdT46IENvc3QgMCBjb3B5IExIUworICAxNTQ0MTEwMTU0VSwJLy8gPHUsMiwwLDA+OiBDb3N0IDIgdmV4dDIgPDAsMCx1LDI+LCA8MCwwLHUsMj4KKyAgMTU0NTQzNzI4NlUsCS8vIDx1LDIsMCwxPjogQ29zdCAyIHZleHQyIDwwLDIsdSwyPiwgTEhTCisgIDE1NDU0Mzc0MjBVLAkvLyA8dSwyLDAsMj46IENvc3QgMiB2ZXh0MiA8MCwyLHUsMj4sIDwwLDIsdSwyPgorICAyNjg1MjMyNTg5VSwJLy8gPHUsMiwwLDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwwLDMsMD4KKyAgMjYxOTE3OTM0NlUsCS8vIDx1LDIsMCw0PjogQ29zdCAzIHZleHQyIDwwLDIsdSwyPiwgPDAsNCwxLDU+CisgIDI3MTIwNjk2MDZVLAkvLyA8dSwyLDAsNT46IENvc3QgMyB2ZXh0MyBSSFMsIDwyLDAsNSw3PgorICAyNjg5ODc3NDg0VSwJLy8gPHUsMiwwLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwwLDYsND4KKyAgMjY1OTY1NjI3M1UsCS8vIDx1LDIsMCw3PjogQ29zdCAzIHZleHQyIDw3LDAsdSwyPiwgPDAsNywyLHU+CisgIDE1NDU0Mzc4NTNVLAkvLyA8dSwyLDAsdT46IENvc3QgMiB2ZXh0MiA8MCwyLHUsMj4sIExIUworICAxNTUwMDgyODUxVSwJLy8gPHUsMiwxLDA+OiBDb3N0IDIgdmV4dDIgPDEsMCx1LDI+LCA8MSwwLHUsMj4KKyAgMjYxOTE3OTgyOFUsCS8vIDx1LDIsMSwxPjogQ29zdCAzIHZleHQyIDwwLDIsdSwyPiwgPDEsMSwxLDE+CisgIDI2MTkxNzk5MjZVLAkvLyA8dSwyLDEsMj46IENvc3QgMyB2ZXh0MiA8MCwyLHUsMj4sIDwxLDIsMywwPgorICAyNjg1MjMyNjcxVSwJLy8gPHUsMiwxLDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwxLDMsMT4KKyAgMjU1NTYwNDI3OFUsCS8vIDx1LDIsMSw0PjogQ29zdCAzIHZleHQxIDwwLHUsMiwxPiwgUkhTCisgIDI2MTkxODAxNzZVLAkvLyA8dSwyLDEsNT46IENvc3QgMyB2ZXh0MiA8MCwyLHUsMj4sIDwxLDUsMyw3PgorICAyNjg5ODc3NTY0VSwJLy8gPHUsMiwxLDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8MiwxLDYsMz4KKyAgMjYwMjcxODg1MFUsCS8vIDx1LDIsMSw3PjogQ29zdCAzIHZleHQxIDx1LDcsMiwxPiwgPDcsdSwxLDI+CisgIDExNTg3MDMyMzVVLAkvLyA8dSwyLDEsdT46IENvc3QgMiB2cmV2IDwyLHUsdSwxPgorICAxNDgxODY3MzY2VSwJLy8gPHUsMiwyLDA+OiBDb3N0IDIgdmV4dDEgPDAsdSwyLDI+LCBMSFMKKyAgMjU1NTYwOTg0NlUsCS8vIDx1LDIsMiwxPjogQ29zdCAzIHZleHQxIDwwLHUsMiwyPiwgPDEsMCwzLDI+CisgIDI2OTI3MTE0MlUsCS8vIDx1LDIsMiwyPjogQ29zdCAxIHZkdXAyIExIUworICAxNjExNDkwOTMwVSwJLy8gPHUsMiwyLDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8MiwyLDMsMz4KKyAgMTQ4MTg3MDY0NlUsCS8vIDx1LDIsMiw0PjogQ29zdCAyIHZleHQxIDwwLHUsMiwyPiwgUkhTCisgIDI2ODk4Nzc2NDBVLAkvLyA8dSwyLDIsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDIsNSw3PgorICAyNjE5MTgwOTg2VSwJLy8gPHUsMiwyLDY+OiBDb3N0IDMgdmV4dDIgPDAsMix1LDI+LCA8Miw2LDMsNz4KKyAgMjU5MzQzNjgzN1UsCS8vIDx1LDIsMiw3PjogQ29zdCAzIHZleHQxIDw3LDIsMiwyPiwgPDcsMiwyLDI+CisgIDI2OTI3MTE0MlUsCS8vIDx1LDIsMix1PjogQ29zdCAxIHZkdXAyIExIUworICA0MDgxMzQzMDFVLAkvLyA8dSwyLDMsMD46IENvc3QgMSB2ZXh0MSBMSFMsIExIUworICAxNDgxODc2MjE0VSwJLy8gPHUsMiwzLDE+OiBDb3N0IDIgdmV4dDEgTEhTLCA8MSwwLDMsMj4KKyAgMTQ4MTg3NzA5NlUsCS8vIDx1LDIsMywyPjogQ29zdCAyIHZleHQxIExIUywgPDIsMiwyLDI+CisgIDE4ODAzMjYyNDZVLAkvLyA8dSwyLDMsMz46IENvc3QgMiB2emlwciBMSFMsIExIUworICA0MDgxMzcwMTRVLAkvLyA8dSwyLDMsND46IENvc3QgMSB2ZXh0MSBMSFMsIFJIUworICAxNTI5NjU0OTkyVSwJLy8gPHUsMiwzLDU+OiBDb3N0IDIgdmV4dDEgTEhTLCA8NSwxLDcsMz4KKyAgMTUyOTY1NTgwMlUsCS8vIDx1LDIsMyw2PjogQ29zdCAyIHZleHQxIExIUywgPDYsMiw3LDM+CisgIDE1Mjk2NTYzMTRVLAkvLyA8dSwyLDMsNz46IENvc3QgMiB2ZXh0MSBMSFMsIDw3LDAsMSwyPgorICA0MDgxMzk1NjZVLAkvLyA8dSwyLDMsdT46IENvc3QgMSB2ZXh0MSBMSFMsIExIUworICAxNTY3ODUzNDY4VSwJLy8gPHUsMiw0LDA+OiBDb3N0IDIgdmV4dDIgPDQsMCw2LDI+LCA8NCwwLDYsMj4KKyAgMjU2MTU5ODM2MlUsCS8vIDx1LDIsNCwxPjogQ29zdCAzIHZleHQxIDwxLHUsMiw0PiwgPDEsMiwzLDQ+CisgIDI1NTU2MjcyMTRVLAkvLyA8dSwyLDQsMj46IENvc3QgMyB2ZXh0MSA8MCx1LDIsND4sIDwyLDMsNCw1PgorICAyNjg1MjMyOTE4VSwJLy8gPHUsMiw0LDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw0LDMsNT4KKyAgMjU1NTYyODg1NFUsCS8vIDx1LDIsNCw0PjogQ29zdCAzIHZleHQxIDwwLHUsMiw0PiwgUkhTCisgIDE1NDU0NDA1NjZVLAkvLyA8dSwyLDQsNT46IENvc3QgMiB2ZXh0MiA8MCwyLHUsMj4sIFJIUworICAxNTcxOTgyNzQwVSwJLy8gPHUsMiw0LDY+OiBDb3N0IDIgdmV4dDIgPDQsNix1LDI+LCA8NCw2LHUsMj4KKyAgMjU5MjEyNTk1N1UsCS8vIDx1LDIsNCw3PjogQ29zdCAzIHZleHQxIDw3LDAsMiw0PiwgPDcsMCwyLDQ+CisgIDE1NDU0NDA4MDlVLAkvLyA8dSwyLDQsdT46IENvc3QgMiB2ZXh0MiA8MCwyLHUsMj4sIFJIUworICAyNTU1NjMzNzY2VSwJLy8gPHUsMiw1LDA+OiBDb3N0IDMgdmV4dDEgPDAsdSwyLDU+LCBMSFMKKyAgMjU2MTYwNjU1MFUsCS8vIDx1LDIsNSwxPjogQ29zdCAzIHZleHQxIDwxLHUsMiw1PiwgPDEsMiwzLDA+CisgIDI2ODk4Nzc4NTZVLAkvLyA8dSwyLDUsMj46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDUsMiw3PgorICAyNjg1MjMzMDAwVSwJLy8gPHUsMiw1LDM+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw1LDMsNj4KKyAgMTE1ODQ0MTA1OVUsCS8vIDx1LDIsNSw0PjogQ29zdCAyIHZyZXYgPDIsdSw0LDU+CisgIDI2NDU3MjUxODhVLAkvLyA8dSwyLDUsNT46IENvc3QgMyB2ZXh0MiA8NCw2LHUsMj4sIDw1LDUsNSw1PgorICAyNjg5ODc3ODkyVSwJLy8gPHUsMiw1LDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw1LDYsNz4KKyAgMjgyMzkwMDQ3MFUsCS8vIDx1LDIsNSw3PjogQ29zdCAzIHZ1enByIDwwLHUsMCwyPiwgUkhTCisgIDExNTg3MzYwMDdVLAkvLyA8dSwyLDUsdT46IENvc3QgMiB2cmV2IDwyLHUsdSw1PgorICAxNDgxOTAwMTM0VSwJLy8gPHUsMiw2LDA+OiBDb3N0IDIgdmV4dDEgPDAsdSwyLDY+LCBMSFMKKyAgMjU1NTY0MjYxNFUsCS8vIDx1LDIsNiwxPjogQ29zdCAzIHZleHQxIDwwLHUsMiw2PiwgPDEsMCwzLDI+CisgIDI1NTU2NDM0OTZVLAkvLyA8dSwyLDYsMj46IENvc3QgMyB2ZXh0MSA8MCx1LDIsNj4sIDwyLDIsMiwyPgorICAxNjExNDkxMjU4VSwJLy8gPHUsMiw2LDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8Miw2LDMsNz4KKyAgMTQ4MTkwMzQxNFUsCS8vIDx1LDIsNiw0PjogQ29zdCAyIHZleHQxIDwwLHUsMiw2PiwgUkhTCisgIDI2ODk4Nzc5NjRVLAkvLyA8dSwyLDYsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDwyLDYsNSw3PgorICAyNjg5ODc3OTczVSwJLy8gPHUsMiw2LDY+OiBDb3N0IDMgdmV4dDMgTEhTLCA8Miw2LDYsNz4KKyAgMjY0NTcyNjAzMFUsCS8vIDx1LDIsNiw3PjogQ29zdCAzIHZleHQyIDw0LDYsdSwyPiwgPDYsNywwLDE+CisgIDE2MTE5MzM2NzFVLAkvLyA8dSwyLDYsdT46IENvc3QgMiB2ZXh0MyBMSFMsIDwyLDYsdSw3PgorICAxNTg1OTE5MDMzVSwJLy8gPHUsMiw3LDA+OiBDb3N0IDIgdmV4dDIgPDcsMCx1LDI+LCA8NywwLHUsMj4KKyAgMjU3MzU2NjcxMFUsCS8vIDx1LDIsNywxPjogQ29zdCAzIHZleHQxIDwzLHUsMiw3PiwgPDEsMCwzLDI+CisgIDI1Njc1OTYxMTVVLAkvLyA8dSwyLDcsMj46IENvc3QgMyB2ZXh0MSA8Mix1LDIsNz4sIDwyLHUsMiw3PgorICAxOTA2OTAxMDk0VSwJLy8gPHUsMiw3LDM+OiBDb3N0IDIgdnppcHIgUkhTLCBMSFMKKyAgMjU1NTY1MzQzMFUsCS8vIDx1LDIsNyw0PjogQ29zdCAzIHZleHQxIDwwLHUsMiw3PiwgUkhTCisgIDI4MDAwODAyMzBVLAkvLyA8dSwyLDcsNT46IENvc3QgMyB2dXpwbCBMSFMsIDw3LDQsNSw2PgorICAyOTgwNjQzMTY0VSwJLy8gPHUsMiw3LDY+OiBDb3N0IDMgdnppcHIgUkhTLCA8MCw0LDIsNj4KKyAgMjY0NTcyNjgyOFUsCS8vIDx1LDIsNyw3PjogQ29zdCAzIHZleHQyIDw0LDYsdSwyPiwgPDcsNyw3LDc+CisgIDE5MDY5MDEwOTlVLAkvLyA8dSwyLDcsdT46IENvc3QgMiB2emlwciBSSFMsIExIUworICA0MDgxNzUyNjZVLAkvLyA8dSwyLHUsMD46IENvc3QgMSB2ZXh0MSBMSFMsIExIUworICAxNTQ1NDQzMTE4VSwJLy8gPHUsMix1LDE+OiBDb3N0IDIgdmV4dDIgPDAsMix1LDI+LCBMSFMKKyAgMjY5MjcxMTQyVSwJLy8gPHUsMix1LDI+OiBDb3N0IDEgdmR1cDIgTEhTCisgIDE2MTE0OTE0MTZVLAkvLyA8dSwyLHUsMz46IENvc3QgMiB2ZXh0MyBMSFMsIDwyLHUsMywzPgorICA0MDgxNzc5NzRVLAkvLyA8dSwyLHUsND46IENvc3QgMSB2ZXh0MSBMSFMsIFJIUworICAxNTQ1NDQzNDgyVSwJLy8gPHUsMix1LDU+OiBDb3N0IDIgdmV4dDIgPDAsMix1LDI+LCBSSFMKKyAgMTcyNjMzOTIyNlUsCS8vIDx1LDIsdSw2PjogQ29zdCAyIHZ1enBsIExIUywgUkhTCisgIDE1Mjk2OTcyNzRVLAkvLyA8dSwyLHUsNz46IENvc3QgMiB2ZXh0MSBMSFMsIDw3LDAsMSwyPgorICA0MDgxODA1MjZVLAkvLyA8dSwyLHUsdT46IENvc3QgMSB2ZXh0MSBMSFMsIExIUworICAxNTQ0NzgxODI0VSwJLy8gPHUsMywwLDA+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MCwwLDAsMD4KKyAgNDcxMDQwMTU2VSwJLy8gPHUsMywwLDE+OiBDb3N0IDEgdmV4dDIgTEhTLCBMSFMKKyAgMTU0NDc4MTk4OFUsCS8vIDx1LDMsMCwyPjogQ29zdCAyIHZleHQyIExIUywgPDAsMiwwLDI+CisgIDI2MTg1MjM5MDBVLAkvLyA8dSwzLDAsMz46IENvc3QgMyB2ZXh0MiBMSFMsIDwwLDMsMSwwPgorICAxNTQ0NzgyMTYyVSwJLy8gPHUsMywwLDQ+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MCw0LDEsNT4KKyAgMjIzODE4ODM1MlUsCS8vIDx1LDMsMCw1PjogQ29zdCAzIHZyZXYgPDMsdSw1LDA+CisgIDI2MjMxNjkwMjNVLAkvLyA8dSwzLDAsNj46IENvc3QgMyB2ZXh0MiBMSFMsIDwwLDYsMiw3PgorICAyMjM4MzM1ODI2VSwJLy8gPHUsMywwLDc+OiBDb3N0IDMgdnJldiA8Myx1LDcsMD4KKyAgNDcxMDQwNjY5VSwJLy8gPHUsMywwLHU+OiBDb3N0IDEgdmV4dDIgTEhTLCBMSFMKKyAgMTU0NDc4MjU4MlUsCS8vIDx1LDMsMSwwPjogQ29zdCAyIHZleHQyIExIUywgPDEsMCwzLDI+CisgIDE1NDQ3ODI2NDRVLAkvLyA8dSwzLDEsMT46IENvc3QgMiB2ZXh0MiBMSFMsIDwxLDEsMSwxPgorICAxNTQ0NzgyNzQyVSwJLy8gPHUsMywxLDI+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MSwyLDMsMD4KKyAgMTU0NDc4MjgwOFUsCS8vIDx1LDMsMSwzPjogQ29zdCAyIHZleHQyIExIUywgPDEsMywxLDM+CisgIDI2MTg1MjQ3MzNVLAkvLyA8dSwzLDEsND46IENvc3QgMyB2ZXh0MiBMSFMsIDwxLDQsMyw1PgorICAxNTQ0NzgyOTkyVSwJLy8gPHUsMywxLDU+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MSw1LDMsNz4KKyAgMjYxODUyNDg5N1UsCS8vIDx1LDMsMSw2PjogQ29zdCAzIHZleHQyIExIUywgPDEsNiwzLDc+CisgIDI3MDM1MTc5ODdVLAkvLyA8dSwzLDEsNz46IENvc3QgMyB2ZXh0MyA8MywxLDcsdT4sIDwzLDEsNyx1PgorICAxNTQ0NzgzMjEzVSwJLy8gPHUsMywxLHU+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MSx1LDEsMz4KKyAgMTUyOTcxNjgzOFUsCS8vIDx1LDMsMiwwPjogQ29zdCAyIHZleHQxIDx1LHUsMywyPiwgTEhTCisgIDExNjQxNjc5NjZVLAkvLyA8dSwzLDIsMT46IENvc3QgMiB2cmV2IDwzLHUsMSwyPgorICAxNTQ0NzgzNDY0VSwJLy8gPHUsMywyLDI+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MiwyLDIsMj4KKyAgMTU0NDc4MzUyNlUsCS8vIDx1LDMsMiwzPjogQ29zdCAyIHZleHQyIExIUywgPDIsMywwLDE+CisgIDE1Mjk3MjAxMThVLAkvLyA8dSwzLDIsND46IENvc3QgMiB2ZXh0MSA8dSx1LDMsMj4sIFJIUworICAyNjE4NTI1NTQ0VSwJLy8gPHUsMywyLDU+OiBDb3N0IDMgdmV4dDIgTEhTLCA8Miw1LDMsNj4KKyAgMTU0NDc4MzgwMlUsCS8vIDx1LDMsMiw2PjogQ29zdCAyIHZleHQyIExIUywgPDIsNiwzLDc+CisgIDI3MDQxODE2MjBVLAkvLyA8dSwzLDIsNz46IENvc3QgMyB2ZXh0MyA8MywyLDcsdT4sIDwzLDIsNyx1PgorICAxNTQ0NzgzOTMxVSwJLy8gPHUsMywyLHU+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Mix1LDAsMT4KKyAgMTU0NDc4NDAyMlUsCS8vIDx1LDMsMywwPjogQ29zdCAyIHZleHQyIExIUywgPDMsMCwxLDI+CisgIDE0ODc5MjI1NTlVLAkvLyA8dSwzLDMsMT46IENvc3QgMiB2ZXh0MSA8MSx1LDMsMz4sIDwxLHUsMywzPgorICAxNDkzODk1MjU2VSwJLy8gPHUsMywzLDI+OiBDb3N0IDIgdmV4dDEgPDIsdSwzLDM+LCA8Mix1LDMsMz4KKyAgMzM2MzgwMDA2VSwJLy8gPHUsMywzLDM+OiBDb3N0IDEgdmR1cDMgTEhTCisgIDE1NDQ3ODQzODZVLAkvLyA8dSwzLDMsND46IENvc3QgMiB2ZXh0MiBMSFMsIDwzLDQsNSw2PgorICAyODI0MDU0NDc4VSwJLy8gPHUsMywzLDU+OiBDb3N0IDMgdnV6cHIgTEhTLCA8MiwzLDQsNT4KKyAgMjIzODI4NjY2OFUsCS8vIDx1LDMsMyw2PjogQ29zdCAzIHZyZXYgPDMsdSw2LDM+CisgIDI5NTQwNjkxMzZVLAkvLyA8dSwzLDMsNz46IENvc3QgMyB2emlwciBMSFMsIDwxLDUsMyw3PgorICAzMzYzODAwMDZVLAkvLyA8dSwzLDMsdT46IENvc3QgMSB2ZHVwMyBMSFMKKyAgMTQ4NzkyOTQ0NlUsCS8vIDx1LDMsNCwwPjogQ29zdCAyIHZleHQxIDwxLHUsMyw0PiwgTEhTCisgIDE0ODc5MzA3NTJVLAkvLyA8dSwzLDQsMT46IENvc3QgMiB2ZXh0MSA8MSx1LDMsND4sIDwxLHUsMyw0PgorICAyNjIzMTcxNjQ0VSwJLy8gPHUsMyw0LDI+OiBDb3N0IDMgdmV4dDIgTEhTLCA8NCwyLDYsMD4KKyAgMjU2MTY3MzM2NlUsCS8vIDx1LDMsNCwzPjogQ29zdCAzIHZleHQxIDwxLHUsMyw0PiwgPDMsMCwxLDI+CisgIDE0ODc5MzI3MjZVLAkvLyA8dSwzLDQsND46IENvc3QgMiB2ZXh0MSA8MSx1LDMsND4sIFJIUworICA0NzEwNDMzODJVLAkvLyA8dSwzLDQsNT46IENvc3QgMSB2ZXh0MiBMSFMsIFJIUworICAxNTkyNTYxMDEyVSwJLy8gPHUsMyw0LDY+OiBDb3N0IDIgdmV4dDIgTEhTLCA8NCw2LDQsNj4KKyAgMjIzODM2ODU5OFUsCS8vIDx1LDMsNCw3PjogQ29zdCAzIHZyZXYgPDMsdSw3LDQ+CisgIDQ3MTA0MzYyNVUsCS8vIDx1LDMsNCx1PjogQ29zdCAxIHZleHQyIExIUywgUkhTCisgIDI1NTU3MDc0OTRVLAkvLyA8dSwzLDUsMD46IENvc3QgMyB2ZXh0MSA8MCx1LDMsNT4sIExIUworICAxNTc0NjQ1NDY1VSwJLy8gPHUsMyw1LDE+OiBDb3N0IDIgdmV4dDIgPDUsMSx1LDM+LCA8NSwxLHUsMz4KKyAgMjU2NzY1MzEwNlUsCS8vIDx1LDMsNSwyPjogQ29zdCAzIHZleHQxIDwyLHUsMyw1PiwgPDIsMyx1LDU+CisgIDI1NTU3MDk5NTRVLAkvLyA8dSwzLDUsMz46IENvc3QgMyB2ZXh0MSA8MCx1LDMsNT4sIDwzLDQsNSw2PgorICAxNTkyNTYxNjA2VSwJLy8gPHUsMyw1LDQ+OiBDb3N0IDIgdmV4dDIgTEhTLCA8NSw0LDcsNj4KKyAgMTU5MjU2MTY2OFUsCS8vIDx1LDMsNSw1PjogQ29zdCAyIHZleHQyIExIUywgPDUsNSw1LDU+CisgIDE1OTI1NjE3NjJVLAkvLyA8dSwzLDUsNj46IENvc3QgMiB2ZXh0MiBMSFMsIDw1LDYsNywwPgorICAxNzUwMzE0Mjk0VSwJLy8gPHUsMyw1LDc+OiBDb3N0IDIgdnV6cHIgTEhTLCBSSFMKKyAgMTc1MDMxNDI5NVUsCS8vIDx1LDMsNSx1PjogQ29zdCAyIHZ1enByIExIUywgUkhTCisgIDI2MjMxNzI4OTdVLAkvLyA8dSwzLDYsMD46IENvc3QgMyB2ZXh0MiBMSFMsIDw2LDAsMSwyPgorICAyNTYxNjg4OTYyVSwJLy8gPHUsMyw2LDE+OiBDb3N0IDMgdmV4dDEgPDEsdSwzLDY+LCA8MSx1LDMsNj4KKyAgMTU4MTI4MTc5NVUsCS8vIDx1LDMsNiwyPjogQ29zdCAyIHZleHQyIDw2LDIsdSwzPiwgPDYsMix1LDM+CisgIDI3MDY1NDEyMDRVLAkvLyA8dSwzLDYsMz46IENvc3QgMyB2ZXh0MyA8Myw2LDMsdT4sIDwzLDYsMyx1PgorICAyNjIzMTczMjYxVSwJLy8gPHUsMyw2LDQ+OiBDb3N0IDMgdmV4dDIgTEhTLCA8Niw0LDUsNj4KKyAgMTE2NDQ5NTY4NlUsCS8vIDx1LDMsNiw1PjogQ29zdCAyIHZyZXYgPDMsdSw1LDY+CisgIDE1OTI1NjI0ODhVLAkvLyA8dSwzLDYsNj46IENvc3QgMiB2ZXh0MiBMSFMsIDw2LDYsNiw2PgorICAxNTkyNTYyNTEwVSwJLy8gPHUsMyw2LDc+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Niw3LDAsMT4KKyAgMTE2NDcxNjg5N1UsCS8vIDx1LDMsNix1PjogQ29zdCAyIHZyZXYgPDMsdSx1LDY+CisgIDE0ODc5NTQwMjJVLAkvLyA8dSwzLDcsMD46IENvc3QgMiB2ZXh0MSA8MSx1LDMsNz4sIExIUworICAxNDg3OTU1MzMxVSwJLy8gPHUsMyw3LDE+OiBDb3N0IDIgdmV4dDEgPDEsdSwzLDc+LCA8MSx1LDMsNz4KKyAgMTQ5MzkyODAyOFUsCS8vIDx1LDMsNywyPjogQ29zdCAyIHZleHQxIDwyLHUsMyw3PiwgPDIsdSwzLDc+CisgIDI1NjE2OTc5NDJVLAkvLyA8dSwzLDcsMz46IENvc3QgMyB2ZXh0MSA8MSx1LDMsNz4sIDwzLDAsMSwyPgorICAxNDg3OTU3MzAyVSwJLy8gPHUsMyw3LDQ+OiBDb3N0IDIgdmV4dDEgPDEsdSwzLDc+LCBSSFMKKyAgMjcwNzM1MjMxMVUsCS8vIDx1LDMsNyw1PjogQ29zdCAzIHZleHQzIDwzLDcsNSx1PiwgPDMsNyw1LHU+CisgIDI2NTUwMjQ2MjNVLAkvLyA8dSwzLDcsNj46IENvc3QgMyB2ZXh0MiA8NiwyLHUsMz4sIDw3LDYsMix1PgorICAxNTkyNTYzMzA4VSwJLy8gPHUsMyw3LDc+OiBDb3N0IDIgdmV4dDIgTEhTLCA8Nyw3LDcsNz4KKyAgMTQ4Nzk1OTg1NFUsCS8vIDx1LDMsNyx1PjogQ29zdCAyIHZleHQxIDwxLHUsMyw3PiwgTEhTCisgIDE1NDQ3ODc2NjdVLAkvLyA8dSwzLHUsMD46IENvc3QgMiB2ZXh0MiBMSFMsIDx1LDAsMSwyPgorICA0NzEwNDU5MzRVLAkvLyA8dSwzLHUsMT46IENvc3QgMSB2ZXh0MiBMSFMsIExIUworICAxNTQ5NDMyNzA5VSwJLy8gPHUsMyx1LDI+OiBDb3N0IDIgdmV4dDIgTEhTLCA8dSwyLDMsMD4KKyAgMzM2MzgwMDA2VSwJLy8gPHUsMyx1LDM+OiBDb3N0IDEgdmR1cDMgTEhTCisgIDE1NDQ3ODgwMzFVLAkvLyA8dSwzLHUsND46IENvc3QgMiB2ZXh0MiBMSFMsIDx1LDQsNSw2PgorICA0NzEwNDYyOThVLAkvLyA8dSwzLHUsNT46IENvc3QgMSB2ZXh0MiBMSFMsIFJIUworICAxNTQ5NDMzMDQwVSwJLy8gPHUsMyx1LDY+OiBDb3N0IDIgdmV4dDIgTEhTLCA8dSw2LDMsNz4KKyAgMTc1MDMxNDUzN1UsCS8vIDx1LDMsdSw3PjogQ29zdCAyIHZ1enByIExIUywgUkhTCisgIDQ3MTA0NjUwMVUsCS8vIDx1LDMsdSx1PjogQ29zdCAxIHZleHQyIExIUywgTEhTCisgIDI2MjUxNjczNjBVLAkvLyA8dSw0LDAsMD46IENvc3QgMyB2ZXh0MiA8MSwyLHUsND4sIDwwLDAsMCwwPgorICAxNTUxNDI1NjM4VSwJLy8gPHUsNCwwLDE+OiBDb3N0IDIgdmV4dDIgPDEsMix1LDQ+LCBMSFMKKyAgMjYxOTE5NTYzMFUsCS8vIDx1LDQsMCwyPjogQ29zdCAzIHZleHQyIDwwLDIsdSw0PiwgPDAsMix1LDQ+CisgIDI2MTkzNDMxMDRVLAkvLyA8dSw0LDAsMz46IENvc3QgMyB2ZXh0MiA8MCwzLDEsND4sIDwwLDMsMSw0PgorICAyNjI1MTY3Njk4VSwJLy8gPHUsNCwwLDQ+OiBDb3N0IDMgdmV4dDIgPDEsMix1LDQ+LCA8MCw0LDEsNT4KKyAgMTYzODMyOTIzNFUsCS8vIDx1LDQsMCw1PjogQ29zdCAyIHZleHQzIFJIUywgPDQsMCw1LDE+CisgIDE2MzgzMjkyNDRVLAkvLyA8dSw0LDAsNj46IENvc3QgMiB2ZXh0MyBSSFMsIDw0LDAsNiwyPgorICAzNzg3ODAzNTU2VSwJLy8gPHUsNCwwLDc+OiBDb3N0IDQgdmV4dDMgUkhTLCA8NCwwLDcsMT4KKyAgMTU1MTQyNjIwNVUsCS8vIDx1LDQsMCx1PjogQ29zdCAyIHZleHQyIDwxLDIsdSw0PiwgTEhTCisgIDI1NTU3NDg0NTRVLAkvLyA8dSw0LDEsMD46IENvc3QgMyB2ZXh0MSA8MCx1LDQsMT4sIExIUworICAyNjI1MTY4MTgwVSwJLy8gPHUsNCwxLDE+OiBDb3N0IDMgdmV4dDIgPDEsMix1LDQ+LCA8MSwxLDEsMT4KKyAgMTU1MTQyNjUwM1UsCS8vIDx1LDQsMSwyPjogQ29zdCAyIHZleHQyIDwxLDIsdSw0PiwgPDEsMix1LDQ+CisgIDI2MjUxNjgzNDRVLAkvLyA8dSw0LDEsMz46IENvc3QgMyB2ZXh0MiA8MSwyLHUsND4sIDwxLDMsMSwzPgorICAyNTU1NzUxNzM0VSwJLy8gPHUsNCwxLDQ+OiBDb3N0IDMgdmV4dDEgPDAsdSw0LDE+LCBSSFMKKyAgMTg2MDU1NDAzOFUsCS8vIDx1LDQsMSw1PjogQ29zdCAyIHZ6aXBsIExIUywgUkhTCisgIDI2ODk4NzkwMjJVLAkvLyA8dSw0LDEsNj46IENvc3QgMyB2ZXh0MyBMSFMsIDw0LDEsNiwzPgorICAyNTkyMjQ4ODUyVSwJLy8gPHUsNCwxLDc+OiBDb3N0IDMgdmV4dDEgPDcsMCw0LDE+LCA8NywwLDQsMT4KKyAgMTU1NTQwODMwMVUsCS8vIDx1LDQsMSx1PjogQ29zdCAyIHZleHQyIDwxLHUsdSw0PiwgPDEsdSx1LDQ+CisgIDI1NTU3NTY2NDZVLAkvLyA8dSw0LDIsMD46IENvc3QgMyB2ZXh0MSA8MCx1LDQsMj4sIExIUworICAyNjI1MTY4OTQzVSwJLy8gPHUsNCwyLDE+OiBDb3N0IDMgdmV4dDIgPDEsMix1LDQ+LCA8MiwxLDQsdT4KKyAgMjYyNTE2OTAwMFUsCS8vIDx1LDQsMiwyPjogQ29zdCAzIHZleHQyIDwxLDIsdSw0PiwgPDIsMiwyLDI+CisgIDI2MTkxOTcxMzRVLAkvLyA8dSw0LDIsMz46IENvc3QgMyB2ZXh0MiA8MCwyLHUsND4sIDwyLDMsNCw1PgorICAyNTU1NzU5OTI2VSwJLy8gPHUsNCwyLDQ+OiBDb3N0IDMgdmV4dDEgPDAsdSw0LDI+LCBSSFMKKyAgMjcxMjA3MTIyMlUsCS8vIDx1LDQsMiw1PjogQ29zdCAzIHZleHQzIFJIUywgPDQsMiw1LDM+CisgIDE5OTQ3NzE3NjZVLAkvLyA8dSw0LDIsNj46IENvc3QgMiB2dHJubCBMSFMsIFJIUworICAyNTkyMjU3MDQ1VSwJLy8gPHUsNCwyLDc+OiBDb3N0IDMgdmV4dDEgPDcsMCw0LDI+LCA8NywwLDQsMj4KKyAgMTk5NDc3MTc4NFUsCS8vIDx1LDQsMix1PjogQ29zdCAyIHZ0cm5sIExIUywgUkhTCisgIDI2MjUxNjk1NThVLAkvLyA8dSw0LDMsMD46IENvc3QgMyB2ZXh0MiA8MSwyLHUsND4sIDwzLDAsMSwyPgorICAyNTY3NzA5NTk0VSwJLy8gPHUsNCwzLDE+OiBDb3N0IDMgdmV4dDEgPDIsdSw0LDM+LCA8MSwyLDMsND4KKyAgMjU2NzcxMDgxN1UsCS8vIDx1LDQsMywyPjogQ29zdCAzIHZleHQxIDwyLHUsNCwzPiwgPDIsdSw0LDM+CisgIDI2MjUxNjk4MjBVLAkvLyA8dSw0LDMsMz46IENvc3QgMyB2ZXh0MiA8MSwyLHUsND4sIDwzLDMsMywzPgorICAyNjI1MTY5OTIyVSwJLy8gPHUsNCwzLDQ+OiBDb3N0IDMgdmV4dDIgPDEsMix1LDQ+LCA8Myw0LDUsNj4KKyAgMjk1NDA2OTcxMFUsCS8vIDx1LDQsMyw1PjogQ29zdCAzIHZ6aXByIExIUywgPDIsMyw0LDU+CisgIDI5NTQwNjgxNzJVLAkvLyA8dSw0LDMsNj46IENvc3QgMyB2emlwciBMSFMsIDwwLDIsNCw2PgorICAzOTAzODQ5NDcyVSwJLy8gPHUsNCwzLDc+OiBDb3N0IDQgdnV6cHIgPDEsdSwzLDQ+LCA8MSwzLDUsNz4KKyAgMjk1NDA2ODE3NFUsCS8vIDx1LDQsMyx1PjogQ29zdCAzIHZ6aXByIExIUywgPDAsMiw0LHU+CisgIDE1MDU5MTkwNzhVLAkvLyA8dSw0LDQsMD46IENvc3QgMiB2ZXh0MSA8NCx1LDQsND4sIExIUworICAyNTY3NzE3ODMxVSwJLy8gPHUsNCw0LDE+OiBDb3N0IDMgdmV4dDEgPDIsdSw0LDQ+LCA8MSwyLHUsND4KKyAgMjU2NzcxOTAxMFUsCS8vIDx1LDQsNCwyPjogQ29zdCAzIHZleHQxIDwyLHUsNCw0PiwgPDIsdSw0LDQ+CisgIDI1NzAzNzM1NDJVLAkvLyA8dSw0LDQsMz46IENvc3QgMyB2ZXh0MSA8MywzLDQsND4sIDwzLDMsNCw0PgorICAxNjE5MjY0NTRVLAkvLyA8dSw0LDQsND46IENvc3QgMSB2ZHVwMCBSSFMKKyAgMTU1MTQyODkxOFUsCS8vIDx1LDQsNCw1PjogQ29zdCAyIHZleHQyIDwxLDIsdSw0PiwgUkhTCisgIDE2MzgzMjk1NzJVLAkvLyA8dSw0LDQsNj46IENvc3QgMiB2ZXh0MyBSSFMsIDw0LDQsNiw2PgorICAyNTk0OTI3OTYzVSwJLy8gPHUsNCw0LDc+OiBDb3N0IDMgdmV4dDEgPDcsNCw0LDQ+LCA8Nyw0LDQsND4KKyAgMTYxOTI2NDU0VSwJLy8gPHUsNCw0LHU+OiBDb3N0IDEgdmR1cDAgUkhTCisgIDE0OTM5ODMzMzRVLAkvLyA8dSw0LDUsMD46IENvc3QgMiB2ZXh0MSA8Mix1LDQsNT4sIExIUworICAyNjg5ODc5MzAxVSwJLy8gPHUsNCw1LDE+OiBDb3N0IDMgdmV4dDMgTEhTLCA8NCw1LDEsMz4KKyAgMTQ5Mzk4NTM3OVUsCS8vIDx1LDQsNSwyPjogQ29zdCAyIHZleHQxIDwyLHUsNCw1PiwgPDIsdSw0LDU+CisgIDI1Njc3MjcyNTRVLAkvLyA8dSw0LDUsMz46IENvc3QgMyB2ZXh0MSA8Mix1LDQsNT4sIDwzLDAsMSwyPgorICAxNDkzOTg2NjE0VSwJLy8gPHUsNCw1LDQ+OiBDb3N0IDIgdmV4dDEgPDIsdSw0LDU+LCBSSFMKKyAgMTg2MzUzNTkyNlUsCS8vIDx1LDQsNSw1PjogQ29zdCAyIHZ6aXBsIFJIUywgUkhTCisgIDUzNzc1MDgzOFUsCS8vIDx1LDQsNSw2PjogQ29zdCAxIHZleHQzIExIUywgUkhTCisgIDI4MzAxMTAwMDZVLAkvLyA8dSw0LDUsNz46IENvc3QgMyB2dXpwciA8MSx1LDMsND4sIFJIUworICA1Mzc3NTA4NTZVLAkvLyA8dSw0LDUsdT46IENvc3QgMSB2ZXh0MyBMSFMsIFJIUworICAxNDgyMDQ3NTkwVSwJLy8gPHUsNCw2LDA+OiBDb3N0IDIgdmV4dDEgPDAsdSw0LDY+LCBMSFMKKyAgMjU1NTc5MDA3MFUsCS8vIDx1LDQsNiwxPjogQ29zdCAzIHZleHQxIDwwLHUsNCw2PiwgPDEsMCwzLDI+CisgIDI1NTU3OTA5NTJVLAkvLyA8dSw0LDYsMj46IENvc3QgMyB2ZXh0MSA8MCx1LDQsNj4sIDwyLDIsMiwyPgorICAyNTU1NzkxNTEwVSwJLy8gPHUsNCw2LDM+OiBDb3N0IDMgdmV4dDEgPDAsdSw0LDY+LCA8MywwLDEsMj4KKyAgMTQ4MjA1MDg3MFUsCS8vIDx1LDQsNiw0PjogQ29zdCAyIHZleHQxIDwwLHUsNCw2PiwgUkhTCisgIDI2ODk4Nzk0MjJVLAkvLyA8dSw0LDYsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDw0LDYsNSw3PgorICAxOTk3NzUzNjU0VSwJLy8gPHUsNCw2LDY+OiBDb3N0IDIgdnRybmwgUkhTLCBSSFMKKyAgMjcxMjA3MTU2MlUsCS8vIDx1LDQsNiw3PjogQ29zdCAzIHZleHQzIFJIUywgPDQsNiw3LDE+CisgIDE0ODIwNTM0MjJVLAkvLyA8dSw0LDYsdT46IENvc3QgMiB2ZXh0MSA8MCx1LDQsNj4sIExIUworICAyNTY3NzQxNTQyVSwJLy8gPHUsNCw3LDA+OiBDb3N0IDMgdmV4dDEgPDIsdSw0LDc+LCBMSFMKKyAgMjU2Nzc0MjM2MlUsCS8vIDx1LDQsNywxPjogQ29zdCAzIHZleHQxIDwyLHUsNCw3PiwgPDEsMiwzLDQ+CisgIDI1Njc3NDM1ODlVLAkvLyA8dSw0LDcsMj46IENvc3QgMyB2ZXh0MSA8Mix1LDQsNz4sIDwyLHUsNCw3PgorICAyNTczNzE2Mjg2VSwJLy8gPHUsNCw3LDM+OiBDb3N0IDMgdmV4dDEgPDMsdSw0LDc+LCA8Myx1LDQsNz4KKyAgMjU2Nzc0NDgyMlUsCS8vIDx1LDQsNyw0PjogQ29zdCAzIHZleHQxIDwyLHUsNCw3PiwgUkhTCisgIDI3MTIwNzE2MjRVLAkvLyA8dSw0LDcsNT46IENvc3QgMyB2ZXh0MyBSSFMsIDw0LDcsNSwwPgorICA5NjgwODQ4OVUsCS8vIDx1LDQsNyw2PjogQ29zdCAxIHZyZXYgUkhTCisgIDI2NTE3MTUxODBVLAkvLyA8dSw0LDcsNz46IENvc3QgMyB2ZXh0MiA8NSw2LHUsND4sIDw3LDcsNyw3PgorICA5Njk1NTk2M1UsCS8vIDx1LDQsNyx1PjogQ29zdCAxIHZyZXYgUkhTCisgIDE0ODIwNjM5NzRVLAkvLyA8dSw0LHUsMD46IENvc3QgMiB2ZXh0MSA8MCx1LDQsdT4sIExIUworICAxNTUxNDMxNDcwVSwJLy8gPHUsNCx1LDE+OiBDb3N0IDIgdmV4dDIgPDEsMix1LDQ+LCBMSFMKKyAgMTQ5NDAwOTk1OFUsCS8vIDx1LDQsdSwyPjogQ29zdCAyIHZleHQxIDwyLHUsNCx1PiwgPDIsdSw0LHU+CisgIDI1NTU4MDc4OTRVLAkvLyA8dSw0LHUsMz46IENvc3QgMyB2ZXh0MSA8MCx1LDQsdT4sIDwzLDAsMSwyPgorICAxNjE5MjY0NTRVLAkvLyA8dSw0LHUsND46IENvc3QgMSB2ZHVwMCBSSFMKKyAgMTU1MTQzMTgzNFUsCS8vIDx1LDQsdSw1PjogQ29zdCAyIHZleHQyIDwxLDIsdSw0PiwgUkhTCisgIDUzNzc1MTA4MVUsCS8vIDx1LDQsdSw2PjogQ29zdCAxIHZleHQzIExIUywgUkhTCisgIDI4MzAxMTAyNDlVLAkvLyA8dSw0LHUsNz46IENvc3QgMyB2dXpwciA8MSx1LDMsND4sIFJIUworICA1Mzc3NTEwOTlVLAkvLyA8dSw0LHUsdT46IENvc3QgMSB2ZXh0MyBMSFMsIFJIUworICAyNjMxODExMDcyVSwJLy8gPHUsNSwwLDA+OiBDb3N0IDMgdmV4dDIgPDIsMyx1LDU+LCA8MCwwLDAsMD4KKyAgMTU1ODA2OTM1MFUsCS8vIDx1LDUsMCwxPjogQ29zdCAyIHZleHQyIDwyLDMsdSw1PiwgTEhTCisgIDI2MTkyMDM4MjNVLAkvLyA8dSw1LDAsMj46IENvc3QgMyB2ZXh0MiA8MCwyLHUsNT4sIDwwLDIsdSw1PgorICAyNjE5ODY3NDU2VSwJLy8gPHUsNSwwLDM+OiBDb3N0IDMgdmV4dDIgPDAsMyx1LDU+LCA8MCwzLHUsNT4KKyAgMTU0NjI3MzEwNlUsCS8vIDx1LDUsMCw0PjogQ29zdCAyIHZleHQyIDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDI3MzMwMTA1MzlVLAkvLyA8dSw1LDAsNT46IENvc3QgMyB2ZXh0MyBMSFMsIDw1LDAsNSwxPgorICAyNTk3NjIyNjgyVSwJLy8gPHUsNSwwLDY+OiBDb3N0IDMgdmV4dDEgPDcsdSw1LDA+LCA8Niw3LHUsNT4KKyAgMTE3NjUzOTM5NlUsCS8vIDx1LDUsMCw3PjogQ29zdCAyIHZyZXYgPDUsdSw3LDA+CisgIDE1NTgwNjk5MTdVLAkvLyA8dSw1LDAsdT46IENvc3QgMiB2ZXh0MiA8MiwzLHUsNT4sIExIUworICAxNTA1OTY4MjMwVSwJLy8gPHUsNSwxLDA+OiBDb3N0IDIgdmV4dDEgPDQsdSw1LDE+LCBMSFMKKyAgMjYyNDUxMjg4N1UsCS8vIDx1LDUsMSwxPjogQ29zdCAzIHZleHQyIDwxLDEsdSw1PiwgPDEsMSx1LDU+CisgIDI2MzE4MTE5OTBVLAkvLyA8dSw1LDEsMj46IENvc3QgMyB2ZXh0MiA8MiwzLHUsNT4sIDwxLDIsMywwPgorICAyNjE4NTQxMDU2VSwJLy8gPHUsNSwxLDM+OiBDb3N0IDMgdmV4dDIgPDAsMSx1LDU+LCA8MSwzLDUsNz4KKyAgMTUwNTk3MTUxMFUsCS8vIDx1LDUsMSw0PjogQ29zdCAyIHZleHQxIDw0LHUsNSwxPiwgUkhTCisgIDI2MjcxNjc0MTlVLAkvLyA8dSw1LDEsNT46IENvc3QgMyB2ZXh0MiA8MSw1LHUsNT4sIDwxLDUsdSw1PgorICAyNTc5NzE0NTU0VSwJLy8gPHUsNSwxLDY+OiBDb3N0IDMgdmV4dDEgPDQsdSw1LDE+LCA8NiwyLDcsMz4KKyAgMTYzODMzMDA2NFUsCS8vIDx1LDUsMSw3PjogQ29zdCAyIHZleHQzIFJIUywgPDUsMSw3LDM+CisgIDE2Mzg0Nzc1MjlVLAkvLyA8dSw1LDEsdT46IENvc3QgMiB2ZXh0MyBSSFMsIDw1LDEsdSwzPgorICAyNTYxODAyMzQyVSwJLy8gPHUsNSwyLDA+OiBDb3N0IDMgdmV4dDEgPDEsdSw1LDI+LCBMSFMKKyAgMjU2MTgwMzI2NFUsCS8vIDx1LDUsMiwxPjogQ29zdCAzIHZleHQxIDwxLHUsNSwyPiwgPDEsMyw1LDc+CisgIDI2MzExNDkyMTdVLAkvLyA8dSw1LDIsMj46IENvc3QgMyB2ZXh0MiA8MiwyLHUsNT4sIDwyLDIsdSw1PgorICAxNTU4MDcxMDI2VSwJLy8gPHUsNSwyLDM+OiBDb3N0IDIgdmV4dDIgPDIsMyx1LDU+LCA8MiwzLHUsNT4KKyAgMjU2MTgwNTYyMlUsCS8vIDx1LDUsMiw0PjogQ29zdCAzIHZleHQxIDwxLHUsNSwyPiwgUkhTCisgIDI3MTQwNjI2MDdVLAkvLyA8dSw1LDIsNT46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDIsNSwzPgorICAyNjMxODEzMDUwVSwJLy8gPHUsNSwyLDY+OiBDb3N0IDMgdmV4dDIgPDIsMyx1LDU+LCA8Miw2LDMsNz4KKyAgMzA5MjMzNTkyNlUsCS8vIDx1LDUsMiw3PjogQ29zdCAzIHZ0cm5yIDwwLHUsMCwyPiwgUkhTCisgIDE1NjEzODkxOTFVLAkvLyA8dSw1LDIsdT46IENvc3QgMiB2ZXh0MiA8Mix1LHUsNT4sIDwyLHUsdSw1PgorICAyNTYxODEwNTM0VSwJLy8gPHUsNSwzLDA+OiBDb3N0IDMgdmV4dDEgPDEsdSw1LDM+LCBMSFMKKyAgMjU2MTgxMTg1N1UsCS8vIDx1LDUsMywxPjogQ29zdCAzIHZleHQxIDwxLHUsNSwzPiwgPDEsdSw1LDM+CisgIDI2MzE4MTM0NzRVLAkvLyA8dSw1LDMsMj46IENvc3QgMyB2ZXh0MiA8MiwzLHUsNT4sIDwzLDIsNSx1PgorICAyNjMxODEzNTMyVSwJLy8gPHUsNSwzLDM+OiBDb3N0IDMgdmV4dDIgPDIsMyx1LDU+LCA8MywzLDMsMz4KKyAgMjYxOTg2OTY5OFUsCS8vIDx1LDUsMyw0PjogQ29zdCAzIHZleHQyIDwwLDMsdSw1PiwgPDMsNCw1LDY+CisgIDMwMDE4NDcwMDJVLAkvLyA8dSw1LDMsNT46IENvc3QgMyB2emlwciBMSFMsIDw0LDQsNSw1PgorICAyOTU0MDcwNTMwVSwJLy8gPHUsNSwzLDY+OiBDb3N0IDMgdnppcHIgTEhTLCA8Myw0LDUsNj4KKyAgMjAxODc0OTc1MFUsCS8vIDx1LDUsMyw3PjogQ29zdCAyIHZ0cm5yIExIUywgUkhTCisgIDIwMTg3NDk3NTFVLAkvLyA8dSw1LDMsdT46IENvc3QgMiB2dHJuciBMSFMsIFJIUworICAyNTczNzYyNjYyVSwJLy8gPHUsNSw0LDA+OiBDb3N0IDMgdmV4dDEgPDMsdSw1LDQ+LCBMSFMKKyAgMjYyMDAxNzYzNFUsCS8vIDx1LDUsNCwxPjogQ29zdCAzIHZleHQyIDwwLDQsMSw1PiwgPDQsMSw1LDA+CisgIDI1NzM3NjQzMzhVLAkvLyA8dSw1LDQsMj46IENvc3QgMyB2ZXh0MSA8Myx1LDUsND4sIDwyLDMsdSw1PgorICAyNTczNzY1NDQ0VSwJLy8gPHUsNSw0LDM+OiBDb3N0IDMgdmV4dDEgPDMsdSw1LDQ+LCA8Myx1LDUsND4KKyAgMTU3MDY4MDA1M1UsCS8vIDx1LDUsNCw0PjogQ29zdCAyIHZleHQyIDw0LDQsdSw1PiwgPDQsNCx1LDU+CisgIDE1NTgwNzI2MzBVLAkvLyA8dSw1LDQsNT46IENvc3QgMiB2ZXh0MiA8MiwzLHUsNT4sIFJIUworICAyNjQ1NzQ5MTQzVSwJLy8gPHUsNSw0LDY+OiBDb3N0IDMgdmV4dDIgPDQsNix1LDU+LCA8NCw2LHUsNT4KKyAgMTYzODMzMDMxMFUsCS8vIDx1LDUsNCw3PjogQ29zdCAyIHZleHQzIFJIUywgPDUsNCw3LDY+CisgIDE1NTgwNzI4NzNVLAkvLyA8dSw1LDQsdT46IENvc3QgMiB2ZXh0MiA8MiwzLHUsNT4sIFJIUworICAxNTA2MDAwOTk4VSwJLy8gPHUsNSw1LDA+OiBDb3N0IDIgdmV4dDEgPDQsdSw1LDU+LCBMSFMKKyAgMjU2MTgyNzk4NFUsCS8vIDx1LDUsNSwxPjogQ29zdCAzIHZleHQxIDwxLHUsNSw1PiwgPDEsNSwzLDc+CisgIDI1Nzk3NDQzNjBVLAkvLyA8dSw1LDUsMj46IENvc3QgMyB2ZXh0MSA8NCx1LDUsNT4sIDwyLDIsMiwyPgorICAyNTc5NzQ0OTE4VSwJLy8gPHUsNSw1LDM+OiBDb3N0IDMgdmV4dDEgPDQsdSw1LDU+LCA8MywwLDEsMj4KKyAgMTUwNjAwNDI3OFUsCS8vIDx1LDUsNSw0PjogQ29zdCAyIHZleHQxIDw0LHUsNSw1PiwgUkhTCisgIDIyOTAzNTMxOFUsCS8vIDx1LDUsNSw1PjogQ29zdCAxIHZkdXAxIFJIUworICAyNzEyMDcyMjA2VSwJLy8gPHUsNSw1LDY+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NSw1LDYsNj4KKyAgMTYzODMzMDM5MlUsCS8vIDx1LDUsNSw3PjogQ29zdCAyIHZleHQzIFJIUywgPDUsNSw3LDc+CisgIDIyOTAzNTMxOFUsCS8vIDx1LDUsNSx1PjogQ29zdCAxIHZkdXAxIFJIUworICAxNTAwMDM3MjIyVSwJLy8gPHUsNSw2LDA+OiBDb3N0IDIgdmV4dDEgPDMsdSw1LDY+LCBMSFMKKyAgMjU2MTgzNjQzNlUsCS8vIDx1LDUsNiwxPjogQ29zdCAzIHZleHQxIDwxLHUsNSw2PiwgPDEsdSw1LDY+CisgIDI1Njc4MDkxMzNVLAkvLyA8dSw1LDYsMj46IENvc3QgMyB2ZXh0MSA8Mix1LDUsNj4sIDwyLHUsNSw2PgorICAxNTAwMDQwMDA2VSwJLy8gPHUsNSw2LDM+OiBDb3N0IDIgdmV4dDEgPDMsdSw1LDY+LCA8Myx1LDUsNj4KKyAgMTUwMDA0MDUwMlUsCS8vIDx1LDUsNiw0PjogQ29zdCAyIHZleHQxIDwzLHUsNSw2PiwgUkhTCisgIDI3MTQwNjI5MzVVLAkvLyA8dSw1LDYsNT46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDYsNSw3PgorICAyNzEyMDcyMjg4VSwJLy8gPHUsNSw2LDY+OiBDb3N0IDMgdmV4dDMgUkhTLCA8NSw2LDYsNz4KKyAgMjc3MDUzNDRVLAkvLyA8dSw1LDYsNz46IENvc3QgMCBjb3B5IFJIUworICAyNzcwNTM0NFUsCS8vIDx1LDUsNix1PjogQ29zdCAwIGNvcHkgUkhTCisgIDE0ODgxMDE0NzhVLAkvLyA8dSw1LDcsMD46IENvc3QgMiB2ZXh0MSA8MSx1LDUsNz4sIExIUworICAxNDg4MTAyODA1VSwJLy8gPHUsNSw3LDE+OiBDb3N0IDIgdmV4dDEgPDEsdSw1LDc+LCA8MSx1LDUsNz4KKyAgMjU2MTg0NDg0MFUsCS8vIDx1LDUsNywyPjogQ29zdCAzIHZleHQxIDwxLHUsNSw3PiwgPDIsMiwyLDI+CisgIDI1NjE4NDUzOThVLAkvLyA8dSw1LDcsMz46IENvc3QgMyB2ZXh0MSA8MSx1LDUsNz4sIDwzLDAsMSwyPgorICAxNDg4MTA0NzU4VSwJLy8gPHUsNSw3LDQ+OiBDb3N0IDIgdmV4dDEgPDEsdSw1LDc+LCBSSFMKKyAgMTYzODMzMDUzNlUsCS8vIDx1LDUsNyw1PjogQ29zdCAyIHZleHQzIFJIUywgPDUsNyw1LDc+CisgIDI3MTIwNzIzNjJVLAkvLyA8dSw1LDcsNj46IENvc3QgMyB2ZXh0MyBSSFMsIDw1LDcsNiwwPgorICAyMDQyOTY1MzAyVSwJLy8gPHUsNSw3LDc+OiBDb3N0IDIgdnRybnIgUkhTLCBSSFMKKyAgMTQ4ODEwNzMxMFUsCS8vIDx1LDUsNyx1PjogQ29zdCAyIHZleHQxIDwxLHUsNSw3PiwgTEhTCisgIDE0ODgxMDk2NzBVLAkvLyA8dSw1LHUsMD46IENvc3QgMiB2ZXh0MSA8MSx1LDUsdT4sIExIUworICAxNDg4MTEwOTk4VSwJLy8gPHUsNSx1LDE+OiBDb3N0IDIgdmV4dDEgPDEsdSw1LHU+LCA8MSx1LDUsdT4KKyAgMjU2MTg1MzAzMlUsCS8vIDx1LDUsdSwyPjogQ29zdCAzIHZleHQxIDwxLHUsNSx1PiwgPDIsMiwyLDI+CisgIDE1MDAwNTYzOTJVLAkvLyA8dSw1LHUsMz46IENvc3QgMiB2ZXh0MSA8Myx1LDUsdT4sIDwzLHUsNSx1PgorICAxNDg4MTEyOTUwVSwJLy8gPHUsNSx1LDQ+OiBDb3N0IDIgdmV4dDEgPDEsdSw1LHU+LCBSSFMKKyAgMjI5MDM1MzE4VSwJLy8gPHUsNSx1LDU+OiBDb3N0IDEgdmR1cDEgUkhTCisgIDI5NTQxMTE0OTBVLAkvLyA8dSw1LHUsNj46IENvc3QgMyB2emlwciBMSFMsIDwzLDQsNSw2PgorICAyNzcwNTM0NFUsCS8vIDx1LDUsdSw3PjogQ29zdCAwIGNvcHkgUkhTCisgIDI3NzA1MzQ0VSwJLy8gPHUsNSx1LHU+OiBDb3N0IDAgY29weSBSSFMKKyAgMjYxOTIxMTc3NlUsCS8vIDx1LDYsMCwwPjogQ29zdCAzIHZleHQyIDwwLDIsdSw2PiwgPDAsMCwwLDA+CisgIDE1NDU0NzAwNTRVLAkvLyA8dSw2LDAsMT46IENvc3QgMiB2ZXh0MiA8MCwyLHUsNj4sIExIUworICAxNTQ1NDcwMTkyVSwJLy8gPHUsNiwwLDI+OiBDb3N0IDIgdmV4dDIgPDAsMix1LDY+LCA8MCwyLHUsNj4KKyAgMjI1NTk1ODk2OVUsCS8vIDx1LDYsMCwzPjogQ29zdCAzIHZyZXYgPDYsdSwzLDA+CisgIDE1NDY3OTc0NThVLAkvLyA8dSw2LDAsND46IENvc3QgMiB2ZXh0MiA8MCw0LHUsNj4sIDwwLDQsdSw2PgorICAyNzIwNjI0OTcxVSwJLy8gPHUsNiwwLDU+OiBDb3N0IDMgdmV4dDMgPDYsMCw1LHU+LCA8NiwwLDUsdT4KKyAgMjI1NjE4MDE4MFUsCS8vIDx1LDYsMCw2PjogQ29zdCAzIHZyZXYgPDYsdSw2LDA+CisgIDI5NjA2ODIyOTRVLAkvLyA8dSw2LDAsNz46IENvc3QgMyB2emlwciA8MSwyLHUsMD4sIFJIUworICAxNTQ1NDcwNjIxVSwJLy8gPHUsNiwwLHU+OiBDb3N0IDIgdmV4dDIgPDAsMix1LDY+LCBMSFMKKyAgMTE4MjAwNDEyN1UsCS8vIDx1LDYsMSwwPjogQ29zdCAyIHZyZXYgPDYsdSwwLDE+CisgIDI2MTkyMTI1OTZVLAkvLyA8dSw2LDEsMT46IENvc3QgMyB2ZXh0MiA8MCwyLHUsNj4sIDwxLDEsMSwxPgorICAyNjE5MjEyNjk0VSwJLy8gPHUsNiwxLDI+OiBDb3N0IDMgdmV4dDIgPDAsMix1LDY+LCA8MSwyLDMsMD4KKyAgMjYxOTIxMjc2MFUsCS8vIDx1LDYsMSwzPjogQ29zdCAzIHZleHQyIDwwLDIsdSw2PiwgPDEsMywxLDM+CisgIDI2MjY1MTE5NzlVLAkvLyA8dSw2LDEsND46IENvc3QgMyB2ZXh0MiA8MSw0LHUsNj4sIDwxLDQsdSw2PgorICAyNjE5MjEyOTQ0VSwJLy8gPHUsNiwxLDU+OiBDb3N0IDMgdmV4dDIgPDAsMix1LDY+LCA8MSw1LDMsNz4KKyAgMjcxNDA2MzI2NFUsCS8vIDx1LDYsMSw2PjogQ29zdCAzIHZleHQzIFJIUywgPDYsMSw2LDM+CisgIDI5NjczMjYwMDZVLAkvLyA8dSw2LDEsNz46IENvc3QgMyB2emlwciA8MiwzLHUsMT4sIFJIUworICAxMTgyNTk0MDIzVSwJLy8gPHUsNiwxLHU+OiBDb3N0IDIgdnJldiA8Nix1LHUsMT4KKyAgMTUwNjA1MDE1MFUsCS8vIDx1LDYsMiwwPjogQ29zdCAyIHZleHQxIDw0LHUsNiwyPiwgTEhTCisgIDI1Nzk3OTI2MzBVLAkvLyA8dSw2LDIsMT46IENvc3QgMyB2ZXh0MSA8NCx1LDYsMj4sIDwxLDAsMywyPgorICAyNjE5MjEzNDE2VSwJLy8gPHUsNiwyLDI+OiBDb3N0IDMgdmV4dDIgPDAsMix1LDY+LCA8MiwyLDIsMj4KKyAgMjYxOTIxMzQ3OFUsCS8vIDx1LDYsMiwzPjogQ29zdCAzIHZleHQyIDwwLDIsdSw2PiwgPDIsMywwLDE+CisgIDE1MDYwNTM0MzBVLAkvLyA8dSw2LDIsND46IENvc3QgMiB2ZXh0MSA8NCx1LDYsMj4sIFJIUworICAyNjMzMTQ4MzA5VSwJLy8gPHUsNiwyLDU+OiBDb3N0IDMgdmV4dDIgPDIsNSx1LDY+LCA8Miw1LHUsNj4KKyAgMjYxOTIxMzc1NFUsCS8vIDx1LDYsMiw2PjogQ29zdCAzIHZleHQyIDwwLDIsdSw2PiwgPDIsNiwzLDc+CisgIDE2MzgzMzA4NzRVLAkvLyA8dSw2LDIsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw2LDIsNywzPgorICAxNjM4NDc4MzM5VSwJLy8gPHUsNiwyLHU+OiBDb3N0IDIgdmV4dDMgUkhTLCA8NiwyLHUsMz4KKyAgMjYxOTIxMzk3NFUsCS8vIDx1LDYsMywwPjogQ29zdCAzIHZleHQyIDwwLDIsdSw2PiwgPDMsMCwxLDI+CisgIDIyNTU4MzYwNzRVLAkvLyA8dSw2LDMsMT46IENvc3QgMyB2cmV2IDw2LHUsMSwzPgorICAyMjU1OTA5ODExVSwJLy8gPHUsNiwzLDI+OiBDb3N0IDMgdnJldiA8Nix1LDIsMz4KKyAgMjYxOTIxNDIzNlUsCS8vIDx1LDYsMywzPjogQ29zdCAzIHZleHQyIDwwLDIsdSw2PiwgPDMsMywzLDM+CisgIDE1NjQ3MTU1NDlVLAkvLyA8dSw2LDMsND46IENvc3QgMiB2ZXh0MiA8Myw0LHUsNj4sIDwzLDQsdSw2PgorICAyNjM5MTIxMDA2VSwJLy8gPHUsNiwzLDU+OiBDb3N0IDMgdmV4dDIgPDMsNSx1LDY+LCA8Myw1LHUsNj4KKyAgMzAwMTg0NzAxMlUsCS8vIDx1LDYsMyw2PjogQ29zdCAzIHZ6aXByIExIUywgPDQsNCw2LDY+CisgIDE4ODAzMjk1MjZVLAkvLyA8dSw2LDMsNz46IENvc3QgMiB2emlwciBMSFMsIFJIUworICAxODgwMzI5NTI3VSwJLy8gPHUsNiwzLHU+OiBDb3N0IDIgdnppcHIgTEhTLCBSSFMKKyAgMjU2Nzg2NDQyMlUsCS8vIDx1LDYsNCwwPjogQ29zdCAzIHZleHQxIDwyLHUsNiw0PiwgTEhTCisgIDI3MzMwMTE1NThVLAkvLyA8dSw2LDQsMT46IENvc3QgMyB2ZXh0MyBMSFMsIDw2LDQsMSwzPgorICAyNTY3ODY2NDg0VSwJLy8gPHUsNiw0LDI+OiBDb3N0IDMgdmV4dDEgPDIsdSw2LDQ+LCA8Mix1LDYsND4KKyAgMjYzODQ1ODAwNVUsCS8vIDx1LDYsNCwzPjogQ29zdCAzIHZleHQyIDwzLDQsdSw2PiwgPDQsMyw2LHU+CisgIDE1NzA1NDA3NzJVLAkvLyA8dSw2LDQsND46IENvc3QgMiB2ZXh0MiA8NCw0LDYsNj4sIDw0LDQsNiw2PgorICAxNTQ1NDczMzM0VSwJLy8gPHUsNiw0LDU+OiBDb3N0IDIgdmV4dDIgPDAsMix1LDY+LCBSSFMKKyAgMTU3MjAxNTUxMlUsCS8vIDx1LDYsNCw2PjogQ29zdCAyIHZleHQyIDw0LDYsdSw2PiwgPDQsNix1LDY+CisgIDI5NjA3MTUwNjJVLAkvLyA8dSw2LDQsNz46IENvc3QgMyB2emlwciA8MSwyLHUsND4sIFJIUworICAxNTQ1NDczNTc3VSwJLy8gPHUsNiw0LHU+OiBDb3N0IDIgdmV4dDIgPDAsMix1LDY+LCBSSFMKKyAgMjU2Nzg3MjYxNFUsCS8vIDx1LDYsNSwwPjogQ29zdCAzIHZleHQxIDwyLHUsNiw1PiwgTEhTCisgIDI2NDU3NTc2NDhVLAkvLyA8dSw2LDUsMT46IENvc3QgMyB2ZXh0MiA8NCw2LHUsNj4sIDw1LDEsNywzPgorICAyNTY3ODc0NDkwVSwJLy8gPHUsNiw1LDI+OiBDb3N0IDMgdmV4dDEgPDIsdSw2LDU+LCA8Miw2LDMsNz4KKyAgMjU3NjUwMTI1MFUsCS8vIDx1LDYsNSwzPjogQ29zdCAzIHZleHQxIDw0LDMsNiw1PiwgPDMsNCw1LDY+CisgIDE1NzY2NjA5NDNVLAkvLyA8dSw2LDUsND46IENvc3QgMiB2ZXh0MiA8NSw0LHUsNj4sIDw1LDQsdSw2PgorICAyNjQ1NzU3OTU2VSwJLy8gPHUsNiw1LDU+OiBDb3N0IDMgdmV4dDIgPDQsNix1LDY+LCA8NSw1LDUsNT4KKyAgMjY0NTc1ODA1MFUsCS8vIDx1LDYsNSw2PjogQ29zdCAzIHZleHQyIDw0LDYsdSw2PiwgPDUsNiw3LDA+CisgIDI4MjQwODA2OTRVLAkvLyA8dSw2LDUsNz46IENvc3QgMyB2dXpwciA8MCx1LDIsNj4sIFJIUworICAxMTgyNjI2Nzk1VSwJLy8gPHUsNiw1LHU+OiBDb3N0IDIgdnJldiA8Nix1LHUsNT4KKyAgMTUwNjA4MjkxOFUsCS8vIDx1LDYsNiwwPjogQ29zdCAyIHZleHQxIDw0LHUsNiw2PiwgTEhTCisgIDI1Nzk4MjUzOThVLAkvLyA8dSw2LDYsMT46IENvc3QgMyB2ZXh0MSA8NCx1LDYsNj4sIDwxLDAsMywyPgorICAyNjQ1NzU4NDU4VSwJLy8gPHUsNiw2LDI+OiBDb3N0IDMgdmV4dDIgPDQsNix1LDY+LCA8NiwyLDcsMz4KKyAgMjU3OTgyNjgzOFUsCS8vIDx1LDYsNiwzPjogQ29zdCAzIHZleHQxIDw0LHUsNiw2PiwgPDMsMCwxLDI+CisgIDE1MDYwODYxOThVLAkvLyA8dSw2LDYsND46IENvc3QgMiB2ZXh0MSA8NCx1LDYsNj4sIFJIUworICAyNTc5ODI4NDMyVSwJLy8gPHUsNiw2LDU+OiBDb3N0IDMgdmV4dDEgPDQsdSw2LDY+LCA8NSwxLDcsMz4KKyAgMjk2MTQ0MTgyVSwJLy8gPHUsNiw2LDY+OiBDb3N0IDEgdmR1cDIgUkhTCisgIDE2MzgzMzEyMDJVLAkvLyA8dSw2LDYsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDw2LDYsNyw3PgorICAyOTYxNDQxODJVLAkvLyA8dSw2LDYsdT46IENvc3QgMSB2ZHVwMiBSSFMKKyAgNDMyMzQ5Mjg2VSwJLy8gPHUsNiw3LDA+OiBDb3N0IDEgdmV4dDEgUkhTLCBMSFMKKyAgMTUwNjA5MTc2NlUsCS8vIDx1LDYsNywxPjogQ29zdCAyIHZleHQxIFJIUywgPDEsMCwzLDI+CisgIDE1MDYwOTI2NDhVLAkvLyA8dSw2LDcsMj46IENvc3QgMiB2ZXh0MSBSSFMsIDwyLDIsMiwyPgorICAxNTA2MDkzMjA2VSwJLy8gPHUsNiw3LDM+OiBDb3N0IDIgdmV4dDEgUkhTLCA8MywwLDEsMj4KKyAgNDMyMzUyODA5VSwJLy8gPHUsNiw3LDQ+OiBDb3N0IDEgdmV4dDEgUkhTLCBSSFMKKyAgMTUwNjA5NDgwMFUsCS8vIDx1LDYsNyw1PjogQ29zdCAyIHZleHQxIFJIUywgPDUsMSw3LDM+CisgIDE1MDYwOTU2MTBVLAkvLyA8dSw2LDcsNj46IENvc3QgMiB2ZXh0MSBSSFMsIDw2LDIsNywzPgorICAxOTA2OTA0Mzc0VSwJLy8gPHUsNiw3LDc+OiBDb3N0IDIgdnppcHIgUkhTLCBSSFMKKyAgNDMyMzU1MTE4VSwJLy8gPHUsNiw3LHU+OiBDb3N0IDEgdmV4dDEgUkhTLCBMSFMKKyAgNDMyMzU3NDc4VSwJLy8gPHUsNix1LDA+OiBDb3N0IDEgdmV4dDEgUkhTLCBMSFMKKyAgMTU0NTQ3NTg4NlUsCS8vIDx1LDYsdSwxPjogQ29zdCAyIHZleHQyIDwwLDIsdSw2PiwgTEhTCisgIDE1MDYxMDA4NDBVLAkvLyA8dSw2LHUsMj46IENvc3QgMiB2ZXh0MSBSSFMsIDwyLDIsMiwyPgorICAxNTA2MTAxMzk4VSwJLy8gPHUsNix1LDM+OiBDb3N0IDIgdmV4dDEgUkhTLCA8MywwLDEsMj4KKyAgNDMyMzYxMDAyVSwJLy8gPHUsNix1LDQ+OiBDb3N0IDEgdmV4dDEgUkhTLCBSSFMKKyAgMTU0NTQ3NjI1MFUsCS8vIDx1LDYsdSw1PjogQ29zdCAyIHZleHQyIDwwLDIsdSw2PiwgUkhTCisgIDI5NjE0NDE4MlUsCS8vIDx1LDYsdSw2PjogQ29zdCAxIHZkdXAyIFJIUworICAxODgwMzcwNDg2VSwJLy8gPHUsNix1LDc+OiBDb3N0IDIgdnppcHIgTEhTLCBSSFMKKyAgNDMyMzYzMzEwVSwJLy8gPHUsNix1LHU+OiBDb3N0IDEgdmV4dDEgUkhTLCBMSFMKKyAgMTU3MTM1NjY3MlUsCS8vIDx1LDcsMCwwPjogQ29zdCAyIHZleHQyIFJIUywgPDAsMCwwLDA+CisgIDQ5NzYxNDk1MFUsCS8vIDx1LDcsMCwxPjogQ29zdCAxIHZleHQyIFJIUywgTEhTCisgIDE1NzEzNTY4MzZVLAkvLyA8dSw3LDAsMj46IENvc3QgMiB2ZXh0MiBSSFMsIDwwLDIsMCwyPgorICAyNTczODgwMTQ2VSwJLy8gPHUsNywwLDM+OiBDb3N0IDMgdmV4dDEgPDMsdSw3LDA+LCA8Myx1LDcsMD4KKyAgMTU3MTM1NzAxMFUsCS8vIDx1LDcsMCw0PjogQ29zdCAyIHZleHQyIFJIUywgPDAsNCwxLDU+CisgIDE1MTIwODM3MTZVLAkvLyA8dSw3LDAsNT46IENvc3QgMiB2ZXh0MSA8NSx1LDcsMD4sIDw1LHUsNywwPgorICAyNjIxODc0NzQxVSwJLy8gPHUsNywwLDY+OiBDb3N0IDMgdmV4dDIgPDAsNix1LDc+LCA8MCw2LHUsNz4KKyAgMjU4NTgyNjI5OFUsCS8vIDx1LDcsMCw3PjogQ29zdCAzIHZleHQxIDw1LHUsNywwPiwgPDcsMCwxLDI+CisgIDQ5NzYxNTUxN1UsCS8vIDx1LDcsMCx1PjogQ29zdCAxIHZleHQyIFJIUywgTEhTCisgIDE1NzEzNTc0MzBVLAkvLyA8dSw3LDEsMD46IENvc3QgMiB2ZXh0MiBSSFMsIDwxLDAsMywyPgorICAxNTcxMzU3NDkyVSwJLy8gPHUsNywxLDE+OiBDb3N0IDIgdmV4dDIgUkhTLCA8MSwxLDEsMT4KKyAgMTU3MTM1NzU5MFUsCS8vIDx1LDcsMSwyPjogQ29zdCAyIHZleHQyIFJIUywgPDEsMiwzLDA+CisgIDE1NTIxMTQ3MTVVLAkvLyA8dSw3LDEsMz46IENvc3QgMiB2ZXh0MiA8MSwzLHUsNz4sIDwxLDMsdSw3PgorICAyNTczODg4ODIyVSwJLy8gPHUsNywxLDQ+OiBDb3N0IDMgdmV4dDEgPDMsdSw3LDE+LCBSSFMKKyAgMTU1MzQ0MTk4MVUsCS8vIDx1LDcsMSw1PjogQ29zdCAyIHZleHQyIDwxLDUsdSw3PiwgPDEsNSx1LDc+CisgIDI2Mjc4NDc0MzhVLAkvLyA8dSw3LDEsNj46IENvc3QgMyB2ZXh0MiA8MSw2LHUsNz4sIDwxLDYsdSw3PgorICAyNzI3NDA4Nzc1VSwJLy8gPHUsNywxLDc+OiBDb3N0IDMgdmV4dDMgPDcsMSw3LHU+LCA8NywxLDcsdT4KKyAgMTU1NTQzMjg4MFUsCS8vIDx1LDcsMSx1PjogQ29zdCAyIHZleHQyIDwxLHUsdSw3PiwgPDEsdSx1LDc+CisgIDI2Mjk4MzgzMzdVLAkvLyA8dSw3LDIsMD46IENvc3QgMyB2ZXh0MiA8MiwwLHUsNz4sIDwyLDAsdSw3PgorICAxMTg4MDU4NzU0VSwJLy8gPHUsNywyLDE+OiBDb3N0IDIgdnJldiA8Nyx1LDEsMj4KKyAgMTU3MTM1ODMxMlUsCS8vIDx1LDcsMiwyPjogQ29zdCAyIHZleHQyIFJIUywgPDIsMiwyLDI+CisgIDE1NzEzNTgzNzRVLAkvLyA8dSw3LDIsMz46IENvc3QgMiB2ZXh0MiBSSFMsIDwyLDMsMCwxPgorICAyNjMyNDkyODY5VSwJLy8gPHUsNywyLDQ+OiBDb3N0IDMgdmV4dDIgPDIsNCx1LDc+LCA8Miw0LHUsNz4KKyAgMjYzMzE1NjUwMlUsCS8vIDx1LDcsMiw1PjogQ29zdCAzIHZleHQyIDwyLDUsdSw3PiwgPDIsNSx1LDc+CisgIDE1NjAwNzgzMTFVLAkvLyA8dSw3LDIsNj46IENvc3QgMiB2ZXh0MiA8Miw2LHUsNz4sIDwyLDYsdSw3PgorICAyNzI4MDcyNDA4VSwJLy8gPHUsNywyLDc+OiBDb3N0IDMgdmV4dDMgPDcsMiw3LHU+LCA8NywyLDcsdT4KKyAgMTU2MTQwNTU3N1UsCS8vIDx1LDcsMix1PjogQ29zdCAyIHZleHQyIDwyLHUsdSw3PiwgPDIsdSx1LDc+CisgIDE1NzEzNTg4NzBVLAkvLyA8dSw3LDMsMD46IENvc3QgMiB2ZXh0MiBSSFMsIDwzLDAsMSwyPgorICAyNjI3MTg0OTEzVSwJLy8gPHUsNywzLDE+OiBDb3N0IDMgdmV4dDIgPDEsNSx1LDc+LCA8MywxLDUsdT4KKyAgMjYzMzgyMDUyM1UsCS8vIDx1LDcsMywyPjogQ29zdCAzIHZleHQyIDwyLDYsdSw3PiwgPDMsMiw2LHU+CisgIDE1NzEzNTkxMzJVLAkvLyA8dSw3LDMsMz46IENvc3QgMiB2ZXh0MiBSSFMsIDwzLDMsMywzPgorICAxNTcxMzU5MjM0VSwJLy8gPHUsNywzLDQ+OiBDb3N0IDIgdmV4dDIgUkhTLCA8Myw0LDUsNj4KKyAgMTUxMjEwODI5NVUsCS8vIDx1LDcsMyw1PjogQ29zdCAyIHZleHQxIDw1LHUsNywzPiwgPDUsdSw3LDM+CisgIDE1MTgwODA5OTJVLAkvLyA8dSw3LDMsNj46IENvc3QgMiB2ZXh0MSA8Nix1LDcsMz4sIDw2LHUsNywzPgorICAyNjQwNDU2NDY1VSwJLy8gPHUsNywzLDc+OiBDb3N0IDMgdmV4dDIgPDMsNyx1LDc+LCA8Myw3LHUsNz4KKyAgMTU3MTM1OTUxOFUsCS8vIDx1LDcsMyx1PjogQ29zdCAyIHZleHQyIFJIUywgPDMsdSwxLDI+CisgIDE1NzEzNTk2MzRVLAkvLyA8dSw3LDQsMD46IENvc3QgMiB2ZXh0MiBSSFMsIDw0LDAsNSwxPgorICAyNTczOTExMDY3VSwJLy8gPHUsNyw0LDE+OiBDb3N0IDMgdmV4dDEgPDMsdSw3LDQ+LCA8MSwzLHUsNz4KKyAgMjY0NTEwMTYyMlUsCS8vIDx1LDcsNCwyPjogQ29zdCAzIHZleHQyIFJIUywgPDQsMiw1LDM+CisgIDI1NzM5MTI5MThVLAkvLyA8dSw3LDQsMz46IENvc3QgMyB2ZXh0MSA8Myx1LDcsND4sIDwzLHUsNyw0PgorICAxNTcxMzU5OTUyVSwJLy8gPHUsNyw0LDQ+OiBDb3N0IDIgdmV4dDIgUkhTLCA8NCw0LDQsND4KKyAgNDk3NjE4MjQ4VSwJLy8gPHUsNyw0LDU+OiBDb3N0IDEgdmV4dDIgUkhTLCBSSFMKKyAgMTU3MTM2MDExNlUsCS8vIDx1LDcsNCw2PjogQ29zdCAyIHZleHQyIFJIUywgPDQsNiw0LDY+CisgIDI2NDUxMDIwMjRVLAkvLyA8dSw3LDQsNz46IENvc3QgMyB2ZXh0MiBSSFMsIDw0LDcsNSwwPgorICA0OTc2MTg0NzNVLAkvLyA8dSw3LDQsdT46IENvc3QgMSB2ZXh0MiBSSFMsIFJIUworICAyNjQ1MTAyMTUyVSwJLy8gPHUsNyw1LDA+OiBDb3N0IDMgdmV4dDIgUkhTLCA8NSwwLDEsMj4KKyAgMTU3MTM2MDQ2NFUsCS8vIDx1LDcsNSwxPjogQ29zdCAyIHZleHQyIFJIUywgPDUsMSw3LDM+CisgIDI2NDUxMDIzMzRVLAkvLyA8dSw3LDUsMj46IENvc3QgMyB2ZXh0MiBSSFMsIDw1LDIsMyw0PgorICAyNjQ1MTAyNDQ3VSwJLy8gPHUsNyw1LDM+OiBDb3N0IDMgdmV4dDIgUkhTLCA8NSwzLDcsMD4KKyAgMTU3MTM2MDcxMFUsCS8vIDx1LDcsNSw0PjogQ29zdCAyIHZleHQyIFJIUywgPDUsNCw3LDY+CisgIDE1NzEzNjA3NzJVLAkvLyA8dSw3LDUsNT46IENvc3QgMiB2ZXh0MiBSSFMsIDw1LDUsNSw1PgorICAxNTcxMzYwODY2VSwJLy8gPHUsNyw1LDY+OiBDb3N0IDIgdmV4dDIgUkhTLCA8NSw2LDcsMD4KKyAgMTU3MTM2MDkzNlUsCS8vIDx1LDcsNSw3PjogQ29zdCAyIHZleHQyIFJIUywgPDUsNyw1LDc+CisgIDE1NzEzNjEwMTdVLAkvLyA8dSw3LDUsdT46IENvc3QgMiB2ZXh0MiBSSFMsIDw1LHUsNSw3PgorICAxNTMwMDQ0NTE4VSwJLy8gPHUsNyw2LDA+OiBDb3N0IDIgdmV4dDEgPHUsdSw3LDY+LCBMSFMKKyAgMjY0NTEwMzAxNlUsCS8vIDx1LDcsNiwxPjogQ29zdCAzIHZleHQyIFJIUywgPDYsMSw3LDI+CisgIDE1NzEzNjEyNzRVLAkvLyA8dSw3LDYsMj46IENvc3QgMiB2ZXh0MiBSSFMsIDw2LDIsNywzPgorICAyNjQ1MTAzMTU0VSwJLy8gPHUsNyw2LDM+OiBDb3N0IDMgdmV4dDIgUkhTLCA8NiwzLDQsNT4KKyAgMTUzMDA0Nzc5OFUsCS8vIDx1LDcsNiw0PjogQ29zdCAyIHZleHQxIDx1LHUsNyw2PiwgUkhTCisgIDExODgzODY0NzRVLAkvLyA8dSw3LDYsNT46IENvc3QgMiB2cmV2IDw3LHUsNSw2PgorICAxNTcxMzYxNTkyVSwJLy8gPHUsNyw2LDY+OiBDb3N0IDIgdmV4dDIgUkhTLCA8Niw2LDYsNj4KKyAgMTU3MTM2MTYxNFUsCS8vIDx1LDcsNiw3PjogQ29zdCAyIHZleHQyIFJIUywgPDYsNywwLDE+CisgIDE1NzEzNjE2OTVVLAkvLyA8dSw3LDYsdT46IENvc3QgMiB2ZXh0MiBSSFMsIDw2LHUsMCwxPgorICAxNTcxMzYxNzg2VSwJLy8gPHUsNyw3LDA+OiBDb3N0IDIgdmV4dDIgUkhTLCA8NywwLDEsMj4KKyAgMjU3MzkzNTYxNlUsCS8vIDx1LDcsNywxPjogQ29zdCAzIHZleHQxIDwzLHUsNyw3PiwgPDEsMyw1LDc+CisgIDI2NDUxMDM3ODFVLAkvLyA8dSw3LDcsMj46IENvc3QgMyB2ZXh0MiBSSFMsIDw3LDIsMiwyPgorICAyNTczOTM3NDk3VSwJLy8gPHUsNyw3LDM+OiBDb3N0IDMgdmV4dDEgPDMsdSw3LDc+LCA8Myx1LDcsNz4KKyAgMTU3MTM2MjE1MFUsCS8vIDx1LDcsNyw0PjogQ29zdCAyIHZleHQyIFJIUywgPDcsNCw1LDY+CisgIDE1MTIxNDEwNjdVLAkvLyA8dSw3LDcsNT46IENvc3QgMiB2ZXh0MSA8NSx1LDcsNz4sIDw1LHUsNyw3PgorICAxNTE4MTEzNzY0VSwJLy8gPHUsNyw3LDY+OiBDb3N0IDIgdmV4dDEgPDYsdSw3LDc+LCA8Nix1LDcsNz4KKyAgMzYzMjUzMDQ2VSwJLy8gPHUsNyw3LDc+OiBDb3N0IDEgdmR1cDMgUkhTCisgIDM2MzI1MzA0NlUsCS8vIDx1LDcsNyx1PjogQ29zdCAxIHZkdXAzIFJIUworICAxNTcxMzYyNTE1VSwJLy8gPHUsNyx1LDA+OiBDb3N0IDIgdmV4dDIgUkhTLCA8dSwwLDEsMj4KKyAgNDk3NjIwNzgyVSwJLy8gPHUsNyx1LDE+OiBDb3N0IDEgdmV4dDIgUkhTLCBMSFMKKyAgMTU3MTM2MjY5M1UsCS8vIDx1LDcsdSwyPjogQ29zdCAyIHZleHQyIFJIUywgPHUsMiwzLDA+CisgIDE1NzEzNjI3NDhVLAkvLyA8dSw3LHUsMz46IENvc3QgMiB2ZXh0MiBSSFMsIDx1LDMsMCwxPgorICAxNTcxMzYyODc5VSwJLy8gPHUsNyx1LDQ+OiBDb3N0IDIgdmV4dDIgUkhTLCA8dSw0LDUsNj4KKyAgNDk3NjIxMTQ2VSwJLy8gPHUsNyx1LDU+OiBDb3N0IDEgdmV4dDIgUkhTLCBSSFMKKyAgMTU3MTM2MzAyNFUsCS8vIDx1LDcsdSw2PjogQ29zdCAyIHZleHQyIFJIUywgPHUsNiwzLDc+CisgIDM2MzI1MzA0NlUsCS8vIDx1LDcsdSw3PjogQ29zdCAxIHZkdXAzIFJIUworICA0OTc2MjEzNDlVLAkvLyA8dSw3LHUsdT46IENvc3QgMSB2ZXh0MiBSSFMsIExIUworICAxMzUwNTM0MTRVLAkvLyA8dSx1LDAsMD46IENvc3QgMSB2ZHVwMCBMSFMKKyAgNDcxMDgxMTIxVSwJLy8gPHUsdSwwLDE+OiBDb3N0IDEgdmV4dDIgTEhTLCBMSFMKKyAgMTU0NDgyMjk0OFUsCS8vIDx1LHUsMCwyPjogQ29zdCAyIHZleHQyIExIUywgPDAsMiwwLDI+CisgIDE2MTYxNDAwMDVVLAkvLyA8dSx1LDAsMz46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDAsMywyPgorICAxNTQ0ODIzMTIyVSwJLy8gPHUsdSwwLDQ+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MCw0LDEsNT4KKyAgMTUxMjE1NzQ1M1UsCS8vIDx1LHUsMCw1PjogQ29zdCAyIHZleHQxIDw1LHUsdSwwPiwgPDUsdSx1LDA+CisgIDE2NjIyMjAwMzJVLAkvLyA8dSx1LDAsNj46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDAsNiwyPgorICAxMTk0NDU3NDg3VSwJLy8gPHUsdSwwLDc+OiBDb3N0IDIgdnJldiA8dSx1LDcsMD4KKyAgNDcxMDgxNjI5VSwJLy8gPHUsdSwwLHU+OiBDb3N0IDEgdmV4dDIgTEhTLCBMSFMKKyAgMTU0NDgyMzU0MlUsCS8vIDx1LHUsMSwwPjogQ29zdCAyIHZleHQyIExIUywgPDEsMCwzLDI+CisgIDIwMjE2MjI3OFUsCS8vIDx1LHUsMSwxPjogQ29zdCAxIHZkdXAxIExIUworICA1Mzc3NTMzOTBVLAkvLyA8dSx1LDEsMj46IENvc3QgMSB2ZXh0MyBMSFMsIExIUworICAxNTQ0ODIzNzY4VSwJLy8gPHUsdSwxLDM+OiBDb3N0IDIgdmV4dDIgTEhTLCA8MSwzLDEsMz4KKyAgMTQ5NDI0ODc1OFUsCS8vIDx1LHUsMSw0PjogQ29zdCAyIHZleHQxIDwyLHUsdSwxPiwgUkhTCisgIDE1NDQ4MjM5NTJVLAkvLyA8dSx1LDEsNT46IENvc3QgMiB2ZXh0MiBMSFMsIDwxLDUsMyw3PgorICAxNTE4MTM4MzQzVSwJLy8gPHUsdSwxLDY+OiBDb3N0IDIgdmV4dDEgPDYsdSx1LDE+LCA8Nix1LHUsMT4KKyAgMTY0MDMyMjkwN1UsCS8vIDx1LHUsMSw3PjogQ29zdCAyIHZleHQzIFJIUywgPHUsMSw3LDM+CisgIDUzNzc1MzQ0NFUsCS8vIDx1LHUsMSx1PjogQ29zdCAxIHZleHQzIExIUywgTEhTCisgIDE0ODIzMDk3MzRVLAkvLyA8dSx1LDIsMD46IENvc3QgMiB2ZXh0MSA8MCx1LHUsMj4sIExIUworICAxMTk0MDMxNDUxVSwJLy8gPHUsdSwyLDE+OiBDb3N0IDIgdnJldiA8dSx1LDEsMj4KKyAgMjY5MjcxMTQyVSwJLy8gPHUsdSwyLDI+OiBDb3N0IDEgdmR1cDIgTEhTCisgIDgzNTU4NFUsCS8vIDx1LHUsMiwzPjogQ29zdCAwIGNvcHkgTEhTCisgIDE0ODIzMTMwMTRVLAkvLyA8dSx1LDIsND46IENvc3QgMiB2ZXh0MSA8MCx1LHUsMj4sIFJIUworICAyNjE4NTY2NTA0VSwJLy8gPHUsdSwyLDU+OiBDb3N0IDMgdmV4dDIgTEhTLCA8Miw1LDMsNj4KKyAgMTU0NDgyNDc2MlUsCS8vIDx1LHUsMiw2PjogQ29zdCAyIHZleHQyIExIUywgPDIsNiwzLDc+CisgIDE2Mzg0Nzk3ODhVLAkvLyA8dSx1LDIsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDIsNywzPgorICA4MzU1ODRVLAkvLyA8dSx1LDIsdT46IENvc3QgMCBjb3B5IExIUworICA0MDg1NzY3MjNVLAkvLyA8dSx1LDMsMD46IENvc3QgMSB2ZXh0MSBMSFMsIExIUworICAxNDgyMzE4NTgyVSwJLy8gPHUsdSwzLDE+OiBDb3N0IDIgdmV4dDEgTEhTLCA8MSwwLDMsMj4KKyAgMTIwMzcxNTU3VSwJLy8gPHUsdSwzLDI+OiBDb3N0IDEgdnJldiBMSFMKKyAgMzM2MzgwMDA2VSwJLy8gPHUsdSwzLDM+OiBDb3N0IDEgdmR1cDMgTEhTCisgIDQwODU3OTM4MlUsCS8vIDx1LHUsMyw0PjogQ29zdCAxIHZleHQxIExIUywgUkhTCisgIDE2MTYxNDAyNzFVLAkvLyA8dSx1LDMsNT46IENvc3QgMiB2ZXh0MyBMSFMsIDx1LDMsNSw3PgorICAxNTMwMDk4MTcwVSwJLy8gPHUsdSwzLDY+OiBDb3N0IDIgdmV4dDEgTEhTLCA8NiwyLDcsMz4KKyAgMTg4MDMyOTU0NFUsCS8vIDx1LHUsMyw3PjogQ29zdCAyIHZ6aXByIExIUywgUkhTCisgIDQwODU4MTkzNFUsCS8vIDx1LHUsMyx1PjogQ29zdCAxIHZleHQxIExIUywgTEhTCisgIDE0ODgyOTgwODZVLAkvLyA8dSx1LDQsMD46IENvc3QgMiB2ZXh0MSA8MSx1LHUsND4sIExIUworICAxNDg4Mjk5NDM3VSwJLy8gPHUsdSw0LDE+OiBDb3N0IDIgdmV4dDEgPDEsdSx1LDQ+LCA8MSx1LHUsND4KKyAgMTY1OTI3MTIwNFUsCS8vIDx1LHUsNCwyPjogQ29zdCAyIHZleHQzIExIUywgPHUsNCwyLDY+CisgIDExOTQxOTUzMTFVLAkvLyA8dSx1LDQsMz46IENvc3QgMiB2cmV2IDx1LHUsMyw0PgorICAxNjE5MjY0NTRVLAkvLyA8dSx1LDQsND46IENvc3QgMSB2ZHVwMCBSSFMKKyAgNDcxMDg0MzQyVSwJLy8gPHUsdSw0LDU+OiBDb3N0IDEgdmV4dDIgTEhTLCBSSFMKKyAgMTU3MTM2ODMwOFUsCS8vIDx1LHUsNCw2PjogQ29zdCAyIHZleHQyIFJIUywgPDQsNiw0LDY+CisgIDE2NDAzMjMxNTNVLAkvLyA8dSx1LDQsNz46IENvc3QgMiB2ZXh0MyBSSFMsIDx1LDQsNyw2PgorICA0NzEwODQ1ODVVLAkvLyA8dSx1LDQsdT46IENvc3QgMSB2ZXh0MiBMSFMsIFJIUworICAxNDk0Mjc4MjQ2VSwJLy8gPHUsdSw1LDA+OiBDb3N0IDIgdmV4dDEgPDIsdSx1LDU+LCBMSFMKKyAgMTU3MTM2ODY1NlUsCS8vIDx1LHUsNSwxPjogQ29zdCAyIHZleHQyIFJIUywgPDUsMSw3LDM+CisgIDE0OTQyODAzMjdVLAkvLyA8dSx1LDUsMj46IENvc3QgMiB2ZXh0MSA8Mix1LHUsNT4sIDwyLHUsdSw1PgorICAxNjE2MTQwNDE1VSwJLy8gPHUsdSw1LDM+OiBDb3N0IDIgdmV4dDMgTEhTLCA8dSw1LDMsNz4KKyAgMTQ5NDI4MTUyNlUsCS8vIDx1LHUsNSw0PjogQ29zdCAyIHZleHQxIDwyLHUsdSw1PiwgUkhTCisgIDIyOTAzNTMxOFUsCS8vIDx1LHUsNSw1PjogQ29zdCAxIHZkdXAxIFJIUworICA1Mzc3NTM3NTRVLAkvLyA8dSx1LDUsNj46IENvc3QgMSB2ZXh0MyBMSFMsIFJIUworICAxNzUwMzU1MjU0VSwJLy8gPHUsdSw1LDc+OiBDb3N0IDIgdnV6cHIgTEhTLCBSSFMKKyAgNTM3NzUzNzcyVSwJLy8gPHUsdSw1LHU+OiBDb3N0IDEgdmV4dDMgTEhTLCBSSFMKKyAgMTQ4MjM0MjUwMlUsCS8vIDx1LHUsNiwwPjogQ29zdCAyIHZleHQxIDwwLHUsdSw2PiwgTEhTCisgIDI1NTYwODQ5ODJVLAkvLyA8dSx1LDYsMT46IENvc3QgMyB2ZXh0MSA8MCx1LHUsNj4sIDwxLDAsMywyPgorICAxNTcxMzY5NDY2VSwJLy8gPHUsdSw2LDI+OiBDb3N0IDIgdmV4dDIgUkhTLCA8NiwyLDcsMz4KKyAgMTYxMTkzODAwMFUsCS8vIDx1LHUsNiwzPjogQ29zdCAyIHZleHQzIExIUywgPHUsNiwzLDc+CisgIDE0ODIzNDU3ODJVLAkvLyA8dSx1LDYsND46IENvc3QgMiB2ZXh0MSA8MCx1LHUsNj4sIFJIUworICAxMTk0MzU5MTcxVSwJLy8gPHUsdSw2LDU+OiBDb3N0IDIgdnJldiA8dSx1LDUsNj4KKyAgMjk2MTQ0MTgyVSwJLy8gPHUsdSw2LDY+OiBDb3N0IDEgdmR1cDIgUkhTCisgIDI3NzA1MzQ0VSwJLy8gPHUsdSw2LDc+OiBDb3N0IDAgY29weSBSSFMKKyAgMjc3MDUzNDRVLAkvLyA8dSx1LDYsdT46IENvc3QgMCBjb3B5IFJIUworICA0MzI0OTY3NDJVLAkvLyA8dSx1LDcsMD46IENvc3QgMSB2ZXh0MSBSSFMsIExIUworICAxNDg4MzI0MDE2VSwJLy8gPHUsdSw3LDE+OiBDb3N0IDIgdmV4dDEgPDEsdSx1LDc+LCA8MSx1LHUsNz4KKyAgMTQ5NDI5NjcxM1UsCS8vIDx1LHUsNywyPjogQ29zdCAyIHZleHQxIDwyLHUsdSw3PiwgPDIsdSx1LDc+CisgIDE5MDY5MDExNDhVLAkvLyA8dSx1LDcsMz46IENvc3QgMiB2emlwciBSSFMsIExIUworICA0MzI1MDAyODNVLAkvLyA8dSx1LDcsND46IENvc3QgMSB2ZXh0MSBSSFMsIFJIUworICAxNTA2MjQyMjU2VSwJLy8gPHUsdSw3LDU+OiBDb3N0IDIgdmV4dDEgUkhTLCA8NSwxLDcsMz4KKyAgMTIwNjk5Mjc3VSwJLy8gPHUsdSw3LDY+OiBDb3N0IDEgdnJldiBSSFMKKyAgMzYzMjUzMDQ2VSwJLy8gPHUsdSw3LDc+OiBDb3N0IDEgdmR1cDMgUkhTCisgIDQzMjUwMjU3NFUsCS8vIDx1LHUsNyx1PjogQ29zdCAxIHZleHQxIFJIUywgTEhTCisgIDQwODYxNzY4OFUsCS8vIDx1LHUsdSwwPjogQ29zdCAxIHZleHQxIExIUywgTEhTCisgIDQ3MTA4Njg5NFUsCS8vIDx1LHUsdSwxPjogQ29zdCAxIHZleHQyIExIUywgTEhTCisgIDUzNzc1Mzk1N1UsCS8vIDx1LHUsdSwyPjogQ29zdCAxIHZleHQzIExIUywgTEhTCisgIDgzNTU4NFUsCS8vIDx1LHUsdSwzPjogQ29zdCAwIGNvcHkgTEhTCisgIDQwODYyMDM0MlUsCS8vIDx1LHUsdSw0PjogQ29zdCAxIHZleHQxIExIUywgUkhTCisgIDQ3MTA4NzI1OFUsCS8vIDx1LHUsdSw1PjogQ29zdCAxIHZleHQyIExIUywgUkhTCisgIDUzNzc1Mzk5N1UsCS8vIDx1LHUsdSw2PjogQ29zdCAxIHZleHQzIExIUywgUkhTCisgIDI3NzA1MzQ0VSwJLy8gPHUsdSx1LDc+OiBDb3N0IDAgY29weSBSSFMKKyAgODM1NTg0VSwJLy8gPHUsdSx1LHU+OiBDb3N0IDAgY29weSBMSFMKKyAgMAorfTsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVJlZ2lzdGVySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1SZWdpc3RlckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmMzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1SZWdpc3RlckluZm8uY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LSBBUk1SZWdpc3RlckluZm8uY3BwIC0gQVJNIFJlZ2lzdGVyIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUk0gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAiQVJNQWRkcmVzc2luZ01vZGVzLmgiCisjaW5jbHVkZSAiQVJNQmFzZUluc3RySW5mby5oIgorI2luY2x1ZGUgIkFSTUluc3RySW5mby5oIgorI2luY2x1ZGUgIkFSTU1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJBUk1SZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJBUk1TdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitBUk1SZWdpc3RlckluZm86OkFSTVJlZ2lzdGVySW5mbyhjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZ0aWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgJnN0aSkKKyAgOiBBUk1CYXNlUmVnaXN0ZXJJbmZvKHRpaSwgc3RpKSB7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1SZWdpc3RlckluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVJlZ2lzdGVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGZiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1SZWdpc3RlckluZm8uaApAQCAtMCwwICsxLDMzIEBACisvLz09PS0gQVJNUmVnaXN0ZXJJbmZvLmggLSBBUk0gUmVnaXN0ZXIgSW5mb3JtYXRpb24gSW1wbCAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQVJNIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRSZWdpc3RlckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBUk1SRUdJU1RFUklORk9fSAorI2RlZmluZSBBUk1SRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAiQVJNQmFzZVJlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEFSTVN1YnRhcmdldDsKKyAgY2xhc3MgQVJNQmFzZUluc3RySW5mbzsKKyAgY2xhc3MgVHlwZTsKKworc3RydWN0IEFSTVJlZ2lzdGVySW5mbyA6IHB1YmxpYyBBUk1CYXNlUmVnaXN0ZXJJbmZvIHsKK3B1YmxpYzoKKyAgQVJNUmVnaXN0ZXJJbmZvKGNvbnN0IEFSTUJhc2VJbnN0ckluZm8gJnRpaSwgY29uc3QgQVJNU3VidGFyZ2V0ICZTVEkpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1SZWdpc3RlckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1SZWdpc3RlckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlOGJhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVJlZ2lzdGVySW5mby50ZApAQCAtMCwwICsxLDY1MiBAQAorLy89PT0tIEFSTVJlZ2lzdGVySW5mby50ZCAtIEFSTSBSZWdpc3RlciBkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8NCisvLw0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgRGVjbGFyYXRpb25zIHRoYXQgZGVzY3JpYmUgdGhlIEFSTSByZWdpc3RlciBmaWxlDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBSZWdpc3RlcnMgYXJlIGlkZW50aWZpZWQgd2l0aCA0LWJpdCBJRCBudW1iZXJzLg0KK2NsYXNzIEFSTVJlZzxiaXRzPDQ+IG51bSwgc3RyaW5nIG4sIGxpc3Q8UmVnaXN0ZXI+IHN1YnJlZ3MgPSBbXT4gOiBSZWdpc3RlcjxuPiB7DQorICBmaWVsZCBiaXRzPDQ+IE51bTsNCisgIGxldCBOYW1lc3BhY2UgPSAiQVJNIjsNCisgIGxldCBTdWJSZWdzID0gc3VicmVnczsNCit9DQorDQorY2xhc3MgQVJNRlJlZzxiaXRzPDY+IG51bSwgc3RyaW5nIG4+IDogUmVnaXN0ZXI8bj4gew0KKyAgZmllbGQgYml0czw2PiBOdW07DQorICBsZXQgTmFtZXNwYWNlID0gIkFSTSI7DQorfQ0KKw0KKy8vIFN1YnJlZ2lzdGVyIGluZGljZXMuDQorbGV0IE5hbWVzcGFjZSA9ICJBUk0iIGluIHsNCisvLyBOb3RlOiBDb2RlIGRlcGVuZHMgb24gdGhlc2UgaGF2aW5nIGNvbnNlY3V0aXZlIG51bWJlcnMuDQorZGVmIHNzdWJfMCAgOiBTdWJSZWdJbmRleDsNCitkZWYgc3N1Yl8xICA6IFN1YlJlZ0luZGV4Ow0KK2RlZiBzc3ViXzIgIDogU3ViUmVnSW5kZXg7IC8vIEluIGEgUSByZWcuDQorZGVmIHNzdWJfMyAgOiBTdWJSZWdJbmRleDsNCitkZWYgc3N1Yl80ICA6IFN1YlJlZ0luZGV4OyAvLyBJbiBhIFFRIHJlZy4NCitkZWYgc3N1Yl81ICA6IFN1YlJlZ0luZGV4Ow0KK2RlZiBzc3ViXzYgIDogU3ViUmVnSW5kZXg7DQorZGVmIHNzdWJfNyAgOiBTdWJSZWdJbmRleDsNCitkZWYgc3N1Yl84ICA6IFN1YlJlZ0luZGV4OyAvLyBJbiBhIFFRUVEgcmVnLg0KK2RlZiBzc3ViXzkgIDogU3ViUmVnSW5kZXg7DQorZGVmIHNzdWJfMTAgOiBTdWJSZWdJbmRleDsNCitkZWYgc3N1Yl8xMSA6IFN1YlJlZ0luZGV4Ow0KK2RlZiBzc3ViXzEyIDogU3ViUmVnSW5kZXg7DQorZGVmIHNzdWJfMTMgOiBTdWJSZWdJbmRleDsNCitkZWYgc3N1Yl8xNCA6IFN1YlJlZ0luZGV4Ow0KK2RlZiBzc3ViXzE1IDogU3ViUmVnSW5kZXg7DQorDQorZGVmIGRzdWJfMCA6IFN1YlJlZ0luZGV4Ow0KK2RlZiBkc3ViXzEgOiBTdWJSZWdJbmRleDsNCitkZWYgZHN1Yl8yIDogU3ViUmVnSW5kZXg7DQorZGVmIGRzdWJfMyA6IFN1YlJlZ0luZGV4Ow0KK2RlZiBkc3ViXzQgOiBTdWJSZWdJbmRleDsNCitkZWYgZHN1Yl81IDogU3ViUmVnSW5kZXg7DQorZGVmIGRzdWJfNiA6IFN1YlJlZ0luZGV4Ow0KK2RlZiBkc3ViXzcgOiBTdWJSZWdJbmRleDsNCisNCitkZWYgcXN1Yl8wIDogU3ViUmVnSW5kZXg7DQorZGVmIHFzdWJfMSA6IFN1YlJlZ0luZGV4Ow0KK2RlZiBxc3ViXzIgOiBTdWJSZWdJbmRleDsNCitkZWYgcXN1Yl8zIDogU3ViUmVnSW5kZXg7DQorDQorZGVmIHFxc3ViXzAgOiBTdWJSZWdJbmRleDsNCitkZWYgcXFzdWJfMSA6IFN1YlJlZ0luZGV4Ow0KK30NCisNCisvLyBJbnRlZ2VyIHJlZ2lzdGVycw0KK2RlZiBSMCAgOiBBUk1SZWc8IDAsICJyMCI+LCAgRHdhcmZSZWdOdW08WzBdPjsNCitkZWYgUjEgIDogQVJNUmVnPCAxLCAicjEiPiwgIER3YXJmUmVnTnVtPFsxXT47DQorZGVmIFIyICA6IEFSTVJlZzwgMiwgInIyIj4sICBEd2FyZlJlZ051bTxbMl0+Ow0KK2RlZiBSMyAgOiBBUk1SZWc8IDMsICJyMyI+LCAgRHdhcmZSZWdOdW08WzNdPjsNCitkZWYgUjQgIDogQVJNUmVnPCA0LCAicjQiPiwgIER3YXJmUmVnTnVtPFs0XT47DQorZGVmIFI1ICA6IEFSTVJlZzwgNSwgInI1Ij4sICBEd2FyZlJlZ051bTxbNV0+Ow0KK2RlZiBSNiAgOiBBUk1SZWc8IDYsICJyNiI+LCAgRHdhcmZSZWdOdW08WzZdPjsNCitkZWYgUjcgIDogQVJNUmVnPCA3LCAicjciPiwgIER3YXJmUmVnTnVtPFs3XT47DQorZGVmIFI4ICA6IEFSTVJlZzwgOCwgInI4Ij4sICBEd2FyZlJlZ051bTxbOF0+Ow0KK2RlZiBSOSAgOiBBUk1SZWc8IDksICJyOSI+LCAgRHdhcmZSZWdOdW08WzldPjsNCitkZWYgUjEwIDogQVJNUmVnPDEwLCAicjEwIj4sIER3YXJmUmVnTnVtPFsxMF0+Ow0KK2RlZiBSMTEgOiBBUk1SZWc8MTEsICJyMTEiPiwgRHdhcmZSZWdOdW08WzExXT47DQorZGVmIFIxMiA6IEFSTVJlZzwxMiwgInIxMiI+LCBEd2FyZlJlZ051bTxbMTJdPjsNCitkZWYgU1AgIDogQVJNUmVnPDEzLCAic3AiPiwgIER3YXJmUmVnTnVtPFsxM10+Ow0KK2RlZiBMUiAgOiBBUk1SZWc8MTQsICJsciI+LCAgRHdhcmZSZWdOdW08WzE0XT47DQorZGVmIFBDICA6IEFSTVJlZzwxNSwgInBjIj4sICBEd2FyZlJlZ051bTxbMTVdPjsNCisNCisvLyBGbG9hdCByZWdpc3RlcnMNCitkZWYgUzAgIDogQVJNRlJlZzwgMCwgInMwIj47ICBkZWYgUzEgIDogQVJNRlJlZzwgMSwgInMxIj47DQorZGVmIFMyICA6IEFSTUZSZWc8IDIsICJzMiI+OyAgZGVmIFMzICA6IEFSTUZSZWc8IDMsICJzMyI+Ow0KK2RlZiBTNCAgOiBBUk1GUmVnPCA0LCAiczQiPjsgIGRlZiBTNSAgOiBBUk1GUmVnPCA1LCAiczUiPjsNCitkZWYgUzYgIDogQVJNRlJlZzwgNiwgInM2Ij47ICBkZWYgUzcgIDogQVJNRlJlZzwgNywgInM3Ij47DQorZGVmIFM4ICA6IEFSTUZSZWc8IDgsICJzOCI+OyAgZGVmIFM5ICA6IEFSTUZSZWc8IDksICJzOSI+Ow0KK2RlZiBTMTAgOiBBUk1GUmVnPDEwLCAiczEwIj47IGRlZiBTMTEgOiBBUk1GUmVnPDExLCAiczExIj47DQorZGVmIFMxMiA6IEFSTUZSZWc8MTIsICJzMTIiPjsgZGVmIFMxMyA6IEFSTUZSZWc8MTMsICJzMTMiPjsNCitkZWYgUzE0IDogQVJNRlJlZzwxNCwgInMxNCI+OyBkZWYgUzE1IDogQVJNRlJlZzwxNSwgInMxNSI+Ow0KK2RlZiBTMTYgOiBBUk1GUmVnPDE2LCAiczE2Ij47IGRlZiBTMTcgOiBBUk1GUmVnPDE3LCAiczE3Ij47DQorZGVmIFMxOCA6IEFSTUZSZWc8MTgsICJzMTgiPjsgZGVmIFMxOSA6IEFSTUZSZWc8MTksICJzMTkiPjsNCitkZWYgUzIwIDogQVJNRlJlZzwyMCwgInMyMCI+OyBkZWYgUzIxIDogQVJNRlJlZzwyMSwgInMyMSI+Ow0KK2RlZiBTMjIgOiBBUk1GUmVnPDIyLCAiczIyIj47IGRlZiBTMjMgOiBBUk1GUmVnPDIzLCAiczIzIj47DQorZGVmIFMyNCA6IEFSTUZSZWc8MjQsICJzMjQiPjsgZGVmIFMyNSA6IEFSTUZSZWc8MjUsICJzMjUiPjsNCitkZWYgUzI2IDogQVJNRlJlZzwyNiwgInMyNiI+OyBkZWYgUzI3IDogQVJNRlJlZzwyNywgInMyNyI+Ow0KK2RlZiBTMjggOiBBUk1GUmVnPDI4LCAiczI4Ij47IGRlZiBTMjkgOiBBUk1GUmVnPDI5LCAiczI5Ij47DQorZGVmIFMzMCA6IEFSTUZSZWc8MzAsICJzMzAiPjsgZGVmIFMzMSA6IEFSTUZSZWc8MzEsICJzMzEiPjsNCisNCisvLyBBbGlhc2VzIG9mIHRoZSBGKiByZWdpc3RlcnMgdXNlZCB0byBob2xkIDY0LWJpdCBmcCB2YWx1ZXMgKGRvdWJsZXMpDQorbGV0IFN1YlJlZ0luZGljZXMgPSBbc3N1Yl8wLCBzc3ViXzFdIGluIHsNCitkZWYgRDAgIDogQVJNUmVnPCAwLCAgImQwIiwgW1MwLCAgIFMxXT47DQorZGVmIEQxICA6IEFSTVJlZzwgMSwgICJkMSIsIFtTMiwgICBTM10+Ow0KK2RlZiBEMiAgOiBBUk1SZWc8IDIsICAiZDIiLCBbUzQsICAgUzVdPjsNCitkZWYgRDMgIDogQVJNUmVnPCAzLCAgImQzIiwgW1M2LCAgIFM3XT47DQorZGVmIEQ0ICA6IEFSTVJlZzwgNCwgICJkNCIsIFtTOCwgICBTOV0+Ow0KK2RlZiBENSAgOiBBUk1SZWc8IDUsICAiZDUiLCBbUzEwLCBTMTFdPjsNCitkZWYgRDYgIDogQVJNUmVnPCA2LCAgImQ2IiwgW1MxMiwgUzEzXT47DQorZGVmIEQ3ICA6IEFSTVJlZzwgNywgICJkNyIsIFtTMTQsIFMxNV0+Ow0KK2RlZiBEOCAgOiBBUk1SZWc8IDgsICAiZDgiLCBbUzE2LCBTMTddPjsNCitkZWYgRDkgIDogQVJNUmVnPCA5LCAgImQ5IiwgW1MxOCwgUzE5XT47DQorZGVmIEQxMCA6IEFSTVJlZzwxMCwgImQxMCIsIFtTMjAsIFMyMV0+Ow0KK2RlZiBEMTEgOiBBUk1SZWc8MTEsICJkMTEiLCBbUzIyLCBTMjNdPjsNCitkZWYgRDEyIDogQVJNUmVnPDEyLCAiZDEyIiwgW1MyNCwgUzI1XT47DQorZGVmIEQxMyA6IEFSTVJlZzwxMywgImQxMyIsIFtTMjYsIFMyN10+Ow0KK2RlZiBEMTQgOiBBUk1SZWc8MTQsICJkMTQiLCBbUzI4LCBTMjldPjsNCitkZWYgRDE1IDogQVJNUmVnPDE1LCAiZDE1IiwgW1MzMCwgUzMxXT47DQorfQ0KKw0KKy8vIFZGUDMgZGVmaW5lcyAxNiBhZGRpdGlvbmFsIGRvdWJsZSByZWdpc3RlcnMNCitkZWYgRDE2IDogQVJNRlJlZzwxNiwgImQxNiI+OyBkZWYgRDE3IDogQVJNRlJlZzwxNywgImQxNyI+Ow0KK2RlZiBEMTggOiBBUk1GUmVnPDE4LCAiZDE4Ij47IGRlZiBEMTkgOiBBUk1GUmVnPDE5LCAiZDE5Ij47DQorZGVmIEQyMCA6IEFSTUZSZWc8MjAsICJkMjAiPjsgZGVmIEQyMSA6IEFSTUZSZWc8MjEsICJkMjEiPjsNCitkZWYgRDIyIDogQVJNRlJlZzwyMiwgImQyMiI+OyBkZWYgRDIzIDogQVJNRlJlZzwyMywgImQyMyI+Ow0KK2RlZiBEMjQgOiBBUk1GUmVnPDI0LCAiZDI0Ij47IGRlZiBEMjUgOiBBUk1GUmVnPDI1LCAiZDI1Ij47DQorZGVmIEQyNiA6IEFSTUZSZWc8MjYsICJkMjYiPjsgZGVmIEQyNyA6IEFSTUZSZWc8MjcsICJkMjciPjsNCitkZWYgRDI4IDogQVJNRlJlZzwyOCwgImQyOCI+OyBkZWYgRDI5IDogQVJNRlJlZzwyOSwgImQyOSI+Ow0KK2RlZiBEMzAgOiBBUk1GUmVnPDMwLCAiZDMwIj47IGRlZiBEMzEgOiBBUk1GUmVnPDMxLCAiZDMxIj47DQorDQorLy8gQWR2YW5jZWQgU0lNRCAoTkVPTikgZGVmaW5lcyAxNiBxdWFkLXdvcmQgYWxpYXNlcw0KK2xldCBTdWJSZWdJbmRpY2VzID0gW2RzdWJfMCwgZHN1Yl8xXSwNCisgQ29tcG9zaXRlSW5kaWNlcyA9IFsoc3N1Yl8yIGRzdWJfMSwgc3N1Yl8wKSwNCisgICAgICAgICAgICAgICAgICAgICAoc3N1Yl8zIGRzdWJfMSwgc3N1Yl8xKV0gaW4gew0KK2RlZiBRMCAgOiBBUk1SZWc8IDAsICAicTAiLCBbRDAsICAgRDFdPjsNCitkZWYgUTEgIDogQVJNUmVnPCAxLCAgInExIiwgW0QyLCAgIEQzXT47DQorZGVmIFEyICA6IEFSTVJlZzwgMiwgICJxMiIsIFtENCwgICBENV0+Ow0KK2RlZiBRMyAgOiBBUk1SZWc8IDMsICAicTMiLCBbRDYsICAgRDddPjsNCitkZWYgUTQgIDogQVJNUmVnPCA0LCAgInE0IiwgW0Q4LCAgIEQ5XT47DQorZGVmIFE1ICA6IEFSTVJlZzwgNSwgICJxNSIsIFtEMTAsIEQxMV0+Ow0KK2RlZiBRNiAgOiBBUk1SZWc8IDYsICAicTYiLCBbRDEyLCBEMTNdPjsNCitkZWYgUTcgIDogQVJNUmVnPCA3LCAgInE3IiwgW0QxNCwgRDE1XT47DQorfQ0KK2xldCBTdWJSZWdJbmRpY2VzID0gW2RzdWJfMCwgZHN1Yl8xXSBpbiB7DQorZGVmIFE4ICA6IEFSTVJlZzwgOCwgICJxOCIsIFtEMTYsIEQxN10+Ow0KK2RlZiBROSAgOiBBUk1SZWc8IDksICAicTkiLCBbRDE4LCBEMTldPjsNCitkZWYgUTEwIDogQVJNUmVnPDEwLCAicTEwIiwgW0QyMCwgRDIxXT47DQorZGVmIFExMSA6IEFSTVJlZzwxMSwgInExMSIsIFtEMjIsIEQyM10+Ow0KK2RlZiBRMTIgOiBBUk1SZWc8MTIsICJxMTIiLCBbRDI0LCBEMjVdPjsNCitkZWYgUTEzIDogQVJNUmVnPDEzLCAicTEzIiwgW0QyNiwgRDI3XT47DQorZGVmIFExNCA6IEFSTVJlZzwxNCwgInExNCIsIFtEMjgsIEQyOV0+Ow0KK2RlZiBRMTUgOiBBUk1SZWc8MTUsICJxMTUiLCBbRDMwLCBEMzFdPjsNCit9DQorDQorLy8gUHNldWRvIDI1Ni1iaXQgcmVnaXN0ZXJzIHRvIHJlcHJlc2VudCBwYWlycyBvZiBRIHJlZ2lzdGVycy4gVGhlc2Ugc2hvdWxkDQorLy8gbmV2ZXIgYmUgcHJlc2VudCBpbiB0aGUgZW1pdHRlZCBjb2RlLg0KKy8vIFRoZXNlIGFyZSB1c2VkIGZvciBORU9OIGxvYWQgLyBzdG9yZSBpbnN0cnVjdGlvbnMsIGUuZy4sIHZsZDQsIHZzdDMuDQorLy8gTk9URTogSXQncyBwb3NzaWJsZSB0byBkZWZpbmUgbW9yZSBRUSByZWdpc3RlcnMgc2luY2UgdGVjaG5pY2FsbHkgdGhlDQorLy8gc3RhcnRpbmcgRCByZWdpc3RlciBudW1iZXIgZG9lc24ndCBoYXZlIHRvIGJlIG11bHRpcGxlIG9mIDQsIGUuZy4sDQorLy8gRDEsIEQyLCBEMywgRDQgd291bGQgYmUgYSBsZWdhbCBxdWFkLCBidXQgdGhhdCB3b3VsZCBtYWtlIHRoZSBzdWJyZWdpc3Rlcg0KKy8vIHN0dWZmIHZlcnkgbWVzc3kuDQorbGV0IFN1YlJlZ0luZGljZXMgPSBbcXN1Yl8wLCBxc3ViXzFdIGluIHsNCitsZXQgQ29tcG9zaXRlSW5kaWNlcyA9IFsoZHN1Yl8yIHFzdWJfMSwgZHN1Yl8wKSwgKGRzdWJfMyBxc3ViXzEsIGRzdWJfMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgKHNzdWJfNCBxc3ViXzEsIHNzdWJfMCksIChzc3ViXzUgcXN1Yl8xLCBzc3ViXzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChzc3ViXzYgcXN1Yl8xLCBzc3ViXzIpLCAoc3N1Yl83IHFzdWJfMSwgc3N1Yl8zKV0gaW4gew0KK2RlZiBRUTAgOiBBUk1SZWc8MCwgInFxMCIsIFtRMCwgIFExXT47DQorZGVmIFFRMSA6IEFSTVJlZzwxLCAicXExIiwgW1EyLCAgUTNdPjsNCitkZWYgUVEyIDogQVJNUmVnPDIsICJxcTIiLCBbUTQsICBRNV0+Ow0KK2RlZiBRUTMgOiBBUk1SZWc8MywgInFxMyIsIFtRNiwgIFE3XT47DQorfQ0KK2xldCBDb21wb3NpdGVJbmRpY2VzID0gWyhkc3ViXzIgcXN1Yl8xLCBkc3ViXzApLCAoZHN1Yl8zIHFzdWJfMSwgZHN1Yl8xKV0gaW4gew0KK2RlZiBRUTQgOiBBUk1SZWc8NCwgInFxNCIsIFtROCwgIFE5XT47DQorZGVmIFFRNSA6IEFSTVJlZzw1LCAicXE1IiwgW1ExMCwgUTExXT47DQorZGVmIFFRNiA6IEFSTVJlZzw2LCAicXE2IiwgW1ExMiwgUTEzXT47DQorZGVmIFFRNyA6IEFSTVJlZzw3LCAicXE3IiwgW1ExNCwgUTE1XT47DQorfQ0KK30NCisNCisvLyBQc2V1ZG8gNTEyLWJpdCByZWdpc3RlcnMgdG8gcmVwcmVzZW50IGZvdXIgY29uc2VjdXRpdmUgUSByZWdpc3RlcnMuDQorbGV0IFN1YlJlZ0luZGljZXMgPSBbcXFzdWJfMCwgcXFzdWJfMV0gaW4gew0KK2xldCBDb21wb3NpdGVJbmRpY2VzID0gWyhxc3ViXzIgIHFxc3ViXzEsIHFzdWJfMCksIChxc3ViXzMgIHFxc3ViXzEsIHFzdWJfMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgKGRzdWJfNCAgcXFzdWJfMSwgZHN1Yl8wKSwgKGRzdWJfNSAgcXFzdWJfMSwgZHN1Yl8xKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoZHN1Yl82ICBxcXN1Yl8xLCBkc3ViXzIpLCAoZHN1Yl83ICBxcXN1Yl8xLCBkc3ViXzMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChzc3ViXzggIHFxc3ViXzEsIHNzdWJfMCksIChzc3ViXzkgIHFxc3ViXzEsIHNzdWJfMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgKHNzdWJfMTAgcXFzdWJfMSwgc3N1Yl8yKSwgKHNzdWJfMTEgcXFzdWJfMSwgc3N1Yl8zKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoc3N1Yl8xMiBxcXN1Yl8xLCBzc3ViXzQpLCAoc3N1Yl8xMyBxcXN1Yl8xLCBzc3ViXzUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChzc3ViXzE0IHFxc3ViXzEsIHNzdWJfNiksIChzc3ViXzE1IHFxc3ViXzEsIHNzdWJfNyldIGluDQorew0KK2RlZiBRUVFRMCA6IEFSTVJlZzwwLCAicXFxcTAiLCBbUVEwLCBRUTFdPjsNCitkZWYgUVFRUTEgOiBBUk1SZWc8MSwgInFxcXExIiwgW1FRMiwgUVEzXT47DQorfQ0KK2xldCBDb21wb3NpdGVJbmRpY2VzID0gWyhxc3ViXzIgcXFzdWJfMSwgcXN1Yl8wKSwgKHFzdWJfMyBxcXN1Yl8xLCBxc3ViXzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChkc3ViXzQgcXFzdWJfMSwgZHN1Yl8wKSwgKGRzdWJfNSBxcXN1Yl8xLCBkc3ViXzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChkc3ViXzYgcXFzdWJfMSwgZHN1Yl8yKSwgKGRzdWJfNyBxcXN1Yl8xLCBkc3ViXzMpXSBpbiB7DQorZGVmIFFRUVEyIDogQVJNUmVnPDIsICJxcXFxMiIsIFtRUTQsIFFRNV0+Ow0KK2RlZiBRUVFRMyA6IEFSTVJlZzwzLCAicXFxcTMiLCBbUVE2LCBRUTddPjsNCit9DQorfQ0KKw0KKy8vIEN1cnJlbnQgUHJvZ3JhbSBTdGF0dXMgUmVnaXN0ZXIuDQorZGVmIENQU1IgICAgOiBBUk1SZWc8MCwgImNwc3IiPjsNCitkZWYgRlBTQ1IgICA6IEFSTVJlZzwxLCAiZnBzY3IiPjsNCitkZWYgSVRTVEFURSA6IEFSTVJlZzwyLCAiaXRzdGF0ZSI+Ow0KKw0KKy8vIFJlZ2lzdGVyIGNsYXNzZXMuDQorLy8NCisvLyBwYyAgPT0gUHJvZ3JhbSBDb3VudGVyDQorLy8gbHIgID09IExpbmsgUmVnaXN0ZXINCisvLyBzcCAgPT0gU3RhY2sgUG9pbnRlcg0KKy8vIHIxMiA9PSBpcCAoc2NyYXRjaCkNCisvLyByNyAgPT0gRnJhbWUgUG9pbnRlciAodGh1bWItc3R5bGUgYmFja3RyYWNlcykNCisvLyByOSAgPT0gTWF5IGJlIHJlc2VydmVkIGFzIFRocmVhZCBSZWdpc3Rlcg0KKy8vIHIxMSA9PSBGcmFtZSBQb2ludGVyIChhcm0tc3R5bGUgYmFja3RyYWNlcykNCisvLyByMTAgPT0gU3RhY2sgTGltaXQNCisvLw0KK2RlZiBHUFIgOiBSZWdpc3RlckNsYXNzPCJBUk0iLCBbaTMyXSwgMzIsIFtSMCwgUjEsIFIyLCBSMywgUjQsIFI1LCBSNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUjcsIFI4LCBSOSwgUjEwLCBSMTEsIFIxMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1AsIExSLCBQQ10+IHsNCisgIGxldCBNZXRob2RQcm90b3MgPSBbew0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgIH1dOw0KKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7DQorICAgIC8vIEZQIGlzIFIxMSwgUjkgaXMgYXZhaWxhYmxlLg0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQVJNX0dQUl9BT18xW10gPSB7DQorICAgICAgQVJNOjpSMCwgQVJNOjpSMSwgQVJNOjpSMiwgQVJNOjpSMywNCisgICAgICBBUk06OlIxMixBUk06OkxSLA0KKyAgICAgIEFSTTo6UjQsIEFSTTo6UjUsIEFSTTo6UjYsIEFSTTo6UjcsDQorICAgICAgQVJNOjpSOCwgQVJNOjpSOSwgQVJNOjpSMTAsDQorICAgICAgQVJNOjpSMTEgfTsNCisgICAgLy8gRlAgaXMgUjExLCBSOSBpcyBub3QgYXZhaWxhYmxlLg0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQVJNX0dQUl9BT18yW10gPSB7DQorICAgICAgQVJNOjpSMCwgQVJNOjpSMSwgQVJNOjpSMiwgQVJNOjpSMywNCisgICAgICBBUk06OlIxMixBUk06OkxSLA0KKyAgICAgIEFSTTo6UjQsIEFSTTo6UjUsIEFSTTo6UjYsIEFSTTo6UjcsDQorICAgICAgQVJNOjpSOCwgQVJNOjpSMTAsDQorICAgICAgQVJNOjpSMTEgfTsNCisgICAgLy8gRlAgaXMgUjcsIFI5IGlzIGF2YWlsYWJsZSBhcyBub24tY2FsbGVlLXNhdmVkIHJlZ2lzdGVyLg0KKyAgICAvLyBUaGlzIGlzIHVzZWQgYnkgRGFyd2luLg0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQVJNX0dQUl9BT18zW10gPSB7DQorICAgICAgQVJNOjpSMCwgQVJNOjpSMSwgQVJNOjpSMiwgQVJNOjpSMywNCisgICAgICBBUk06OlI5LCBBUk06OlIxMixBUk06OkxSLA0KKyAgICAgIEFSTTo6UjQsIEFSTTo6UjUsIEFSTTo6UjYsDQorICAgICAgQVJNOjpSOCwgQVJNOjpSMTAsQVJNOjpSMTEsQVJNOjpSNyB9Ow0KKyAgICAvLyBGUCBpcyBSNywgUjkgaXMgbm90IGF2YWlsYWJsZS4NCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEFSTV9HUFJfQU9fNFtdID0gew0KKyAgICAgIEFSTTo6UjAsIEFSTTo6UjEsIEFSTTo6UjIsIEFSTTo6UjMsDQorICAgICAgQVJNOjpSMTIsQVJNOjpMUiwNCisgICAgICBBUk06OlI0LCBBUk06OlI1LCBBUk06OlI2LA0KKyAgICAgIEFSTTo6UjgsIEFSTTo6UjEwLEFSTTo6UjExLA0KKyAgICAgIEFSTTo6UjcgfTsNCisgICAgLy8gRlAgaXMgUjcsIFI5IGlzIGF2YWlsYWJsZSBhcyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIuDQorICAgIC8vIFRoaXMgaXMgdXNlZCBieSBub24tRGFyd2luIHBsYXRmb3JtIGluIFRodW1iIG1vZGUuDQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBBUk1fR1BSX0FPXzVbXSA9IHsNCisgICAgICBBUk06OlIwLCBBUk06OlIxLCBBUk06OlIyLCBBUk06OlIzLA0KKyAgICAgIEFSTTo6UjEyLEFSTTo6TFIsDQorICAgICAgQVJNOjpSNCwgQVJNOjpSNSwgQVJNOjpSNiwNCisgICAgICBBUk06OlI4LCBBUk06OlI5LCBBUk06OlIxMCxBUk06OlIxMSxBUk06OlI3IH07DQorDQorICAgIC8vIEZvciBUaHVtYjEgbW9kZSwgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBoaSByZWdzIGF0IGFsbCwgYXMgd2UNCisgICAgLy8gZG9uJ3Qga25vdyBob3cgdG8gc3BpbGwgdGhlbS4gSWYgd2UgbWFrZSBvdXIgcHJvbG9ndWUvZXBpbG9ndWUgY29kZQ0KKyAgICAvLyBzbWFydGVyIGF0IHNvbWUgcG9pbnQsIHdlIGNhbiBnbyBiYWNrIHRvIHVzaW5nIHRoZSBhYm92ZSBhbGxvY2F0aW9uDQorICAgIC8vIG9yZGVycyBmb3IgdGhlIFRodW1iMSBpbnN0cnVjdGlvbnMgdGhhdCBrbm93IGhvdyB0byB1c2UgaGkgcmVncy4NCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFRIVU1CX0dQUl9BT1tdID0gew0KKyAgICAgIEFSTTo6UjAsIEFSTTo6UjEsIEFSTTo6UjIsIEFSTTo6UjMsDQorICAgICAgQVJNOjpSNCwgQVJNOjpSNSwgQVJNOjpSNiwgQVJNOjpSNyB9Ow0KKw0KKyAgICBHUFJDbGFzczo6aXRlcmF0b3INCisgICAgR1BSQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgQVJNU3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8QVJNU3VidGFyZ2V0PigpOw0KKyAgICAgIGlmIChTdWJ0YXJnZXQuaXNUaHVtYjFPbmx5KCkpDQorICAgICAgICByZXR1cm4gVEhVTUJfR1BSX0FPOw0KKyAgICAgIGlmIChTdWJ0YXJnZXQuaXNUYXJnZXREYXJ3aW4oKSkgew0KKyAgICAgICAgaWYgKFN1YnRhcmdldC5pc1I5UmVzZXJ2ZWQoKSkNCisgICAgICAgICAgcmV0dXJuIEFSTV9HUFJfQU9fNDsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgcmV0dXJuIEFSTV9HUFJfQU9fMzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKFN1YnRhcmdldC5pc1I5UmVzZXJ2ZWQoKSkNCisgICAgICAgICAgcmV0dXJuIEFSTV9HUFJfQU9fMjsNCisgICAgICAgIGVsc2UgaWYgKFN1YnRhcmdldC5pc1RodW1iKCkpDQorICAgICAgICAgIHJldHVybiBBUk1fR1BSX0FPXzU7DQorICAgICAgICBlbHNlDQorICAgICAgICAgIHJldHVybiBBUk1fR1BSX0FPXzE7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIEdQUkNsYXNzOjppdGVyYXRvcg0KKyAgICBHUFJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOw0KKyAgICAgIGNvbnN0IEFSTVN1YnRhcmdldCAmU3VidGFyZ2V0ID0gVE0uZ2V0U3VidGFyZ2V0PEFSTVN1YnRhcmdldD4oKTsNCisgICAgICBHUFJDbGFzczo6aXRlcmF0b3IgSTsNCisNCisgICAgICBpZiAoU3VidGFyZ2V0LmlzVGh1bWIxT25seSgpKSB7DQorICAgICAgICBJID0gVEhVTUJfR1BSX0FPICsgKHNpemVvZihUSFVNQl9HUFJfQU8pL3NpemVvZih1bnNpZ25lZCkpOw0KKyAgICAgICAgcmV0dXJuIFJJLT5oYXNGUChNRikgPyBJLTEgOiBJOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAoU3VidGFyZ2V0LmlzVGFyZ2V0RGFyd2luKCkpIHsNCisgICAgICAgIGlmIChTdWJ0YXJnZXQuaXNSOVJlc2VydmVkKCkpDQorICAgICAgICAgIEkgPSBBUk1fR1BSX0FPXzQgKyAoc2l6ZW9mKEFSTV9HUFJfQU9fNCkvc2l6ZW9mKHVuc2lnbmVkKSk7DQorICAgICAgICBlbHNlDQorICAgICAgICAgIEkgPSBBUk1fR1BSX0FPXzMgKyAoc2l6ZW9mKEFSTV9HUFJfQU9fMykvc2l6ZW9mKHVuc2lnbmVkKSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChTdWJ0YXJnZXQuaXNSOVJlc2VydmVkKCkpDQorICAgICAgICAgIEkgPSBBUk1fR1BSX0FPXzIgKyAoc2l6ZW9mKEFSTV9HUFJfQU9fMikvc2l6ZW9mKHVuc2lnbmVkKSk7DQorICAgICAgICBlbHNlIGlmIChTdWJ0YXJnZXQuaXNUaHVtYigpKQ0KKyAgICAgICAgICBJID0gQVJNX0dQUl9BT181ICsgKHNpemVvZihBUk1fR1BSX0FPXzUpL3NpemVvZih1bnNpZ25lZCkpOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBJID0gQVJNX0dQUl9BT18xICsgKHNpemVvZihBUk1fR1BSX0FPXzEpL3NpemVvZih1bnNpZ25lZCkpOw0KKyAgICAgIH0NCisNCisgICAgICByZXR1cm4gUkktPmhhc0ZQKE1GKSA/IEktMSA6IEk7DQorICAgIH0NCisgIH1dOw0KK30NCisNCisvLyByZXN0cmljdGVkIEdQUiByZWdpc3RlciBjbGFzcy4gTWFueSBUaHVtYjIgaW5zdHJ1Y3Rpb25zIGFsbG93IHRoZSBmdWxsDQorLy8gcmVnaXN0ZXIgcmFuZ2UgZm9yIG9wZXJhbmRzLCBidXQgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3VycyB3aGVuIFBDDQorLy8gb3IgU1AgKFIxMyBvciBSMTUpIGFyZSB1c2VkLiBUaGUgQVJNIEFSTSByZWZlcnMgdG8gdGhlc2Ugb3BlcmFuZHMNCisvLyB2aWEgdGhlIEJhZFJlZygpIHBzZXVkby1jb2RlIGRlc2NyaXB0aW9uLg0KK2RlZiByR1BSIDogUmVnaXN0ZXJDbGFzczwiQVJNIiwgW2kzMl0sIDMyLCBbUjAsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSNywgUjgsIFI5LCBSMTAsIFIxMSwgUjEyLCBMUl0+IHsNCisgIGxldCBNZXRob2RQcm90b3MgPSBbew0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgIH1dOw0KKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7DQorICAgIC8vIEZQIGlzIFIxMSwgUjkgaXMgYXZhaWxhYmxlLg0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQVJNX3JHUFJBT18xW10gPSB7DQorICAgICAgQVJNOjpSMCwgQVJNOjpSMSwgQVJNOjpSMiwgQVJNOjpSMywNCisgICAgICBBUk06OlIxMixBUk06OkxSLA0KKyAgICAgIEFSTTo6UjQsIEFSTTo6UjUsIEFSTTo6UjYsIEFSTTo6UjcsDQorICAgICAgQVJNOjpSOCwgQVJNOjpSOSwgQVJNOjpSMTAsDQorICAgICAgQVJNOjpSMTEgfTsNCisgICAgLy8gRlAgaXMgUjExLCBSOSBpcyBub3QgYXZhaWxhYmxlLg0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQVJNX3JHUFJBT18yW10gPSB7DQorICAgICAgQVJNOjpSMCwgQVJNOjpSMSwgQVJNOjpSMiwgQVJNOjpSMywNCisgICAgICBBUk06OlIxMixBUk06OkxSLA0KKyAgICAgIEFSTTo6UjQsIEFSTTo6UjUsIEFSTTo6UjYsIEFSTTo6UjcsDQorICAgICAgQVJNOjpSOCwgQVJNOjpSMTAsDQorICAgICAgQVJNOjpSMTEgfTsNCisgICAgLy8gRlAgaXMgUjcsIFI5IGlzIGF2YWlsYWJsZSBhcyBub24tY2FsbGVlLXNhdmVkIHJlZ2lzdGVyLg0KKyAgICAvLyBUaGlzIGlzIHVzZWQgYnkgRGFyd2luLg0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQVJNX3JHUFJBT18zW10gPSB7DQorICAgICAgQVJNOjpSMCwgQVJNOjpSMSwgQVJNOjpSMiwgQVJNOjpSMywNCisgICAgICBBUk06OlI5LCBBUk06OlIxMixBUk06OkxSLA0KKyAgICAgIEFSTTo6UjQsIEFSTTo6UjUsIEFSTTo6UjYsDQorICAgICAgQVJNOjpSOCwgQVJNOjpSMTAsQVJNOjpSMTEsQVJNOjpSNyB9Ow0KKyAgICAvLyBGUCBpcyBSNywgUjkgaXMgbm90IGF2YWlsYWJsZS4NCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEFSTV9yR1BSQU9fNFtdID0gew0KKyAgICAgIEFSTTo6UjAsIEFSTTo6UjEsIEFSTTo6UjIsIEFSTTo6UjMsDQorICAgICAgQVJNOjpSMTIsQVJNOjpMUiwNCisgICAgICBBUk06OlI0LCBBUk06OlI1LCBBUk06OlI2LA0KKyAgICAgIEFSTTo6UjgsIEFSTTo6UjEwLEFSTTo6UjExLA0KKyAgICAgIEFSTTo6UjcgfTsNCisgICAgLy8gRlAgaXMgUjcsIFI5IGlzIGF2YWlsYWJsZSBhcyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIuDQorICAgIC8vIFRoaXMgaXMgdXNlZCBieSBub24tRGFyd2luIHBsYXRmb3JtIGluIFRodW1iIG1vZGUuDQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBBUk1fckdQUkFPXzVbXSA9IHsNCisgICAgICBBUk06OlIwLCBBUk06OlIxLCBBUk06OlIyLCBBUk06OlIzLA0KKyAgICAgIEFSTTo6UjEyLEFSTTo6TFIsDQorICAgICAgQVJNOjpSNCwgQVJNOjpSNSwgQVJNOjpSNiwNCisgICAgICBBUk06OlI4LCBBUk06OlI5LCBBUk06OlIxMCxBUk06OlIxMSxBUk06OlI3IH07DQorDQorICAgIC8vIEZvciBUaHVtYjEgbW9kZSwgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBoaSByZWdzIGF0IGFsbCwgYXMgd2UNCisgICAgLy8gZG9uJ3Qga25vdyBob3cgdG8gc3BpbGwgdGhlbS4gSWYgd2UgbWFrZSBvdXIgcHJvbG9ndWUvZXBpbG9ndWUgY29kZQ0KKyAgICAvLyBzbWFydGVyIGF0IHNvbWUgcG9pbnQsIHdlIGNhbiBnbyBiYWNrIHRvIHVzaW5nIHRoZSBhYm92ZSBhbGxvY2F0aW9uDQorICAgIC8vIG9yZGVycyBmb3IgdGhlIFRodW1iMSBpbnN0cnVjdGlvbnMgdGhhdCBrbm93IGhvdyB0byB1c2UgaGkgcmVncy4NCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFRIVU1CX3JHUFJBT1tdID0gew0KKyAgICAgIEFSTTo6UjAsIEFSTTo6UjEsIEFSTTo6UjIsIEFSTTo6UjMsDQorICAgICAgQVJNOjpSNCwgQVJNOjpSNSwgQVJNOjpSNiwgQVJNOjpSNyB9Ow0KKw0KKyAgICByR1BSQ2xhc3M6Oml0ZXJhdG9yDQorICAgIHJHUFJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCk7DQorICAgICAgaWYgKFN1YnRhcmdldC5pc1RodW1iMU9ubHkoKSkNCisgICAgICAgIHJldHVybiBUSFVNQl9yR1BSQU87DQorICAgICAgaWYgKFN1YnRhcmdldC5pc1RhcmdldERhcndpbigpKSB7DQorICAgICAgICBpZiAoU3VidGFyZ2V0LmlzUjlSZXNlcnZlZCgpKQ0KKyAgICAgICAgICByZXR1cm4gQVJNX3JHUFJBT180Ow0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICByZXR1cm4gQVJNX3JHUFJBT18zOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoU3VidGFyZ2V0LmlzUjlSZXNlcnZlZCgpKQ0KKyAgICAgICAgICByZXR1cm4gQVJNX3JHUFJBT18yOw0KKyAgICAgICAgZWxzZSBpZiAoU3VidGFyZ2V0LmlzVGh1bWIoKSkNCisgICAgICAgICAgcmV0dXJuIEFSTV9yR1BSQU9fNTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgcmV0dXJuIEFSTV9yR1BSQU9fMTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgckdQUkNsYXNzOjppdGVyYXRvcg0KKyAgICByR1BSQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOw0KKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsNCisgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCk7DQorICAgICAgR1BSQ2xhc3M6Oml0ZXJhdG9yIEk7DQorDQorICAgICAgaWYgKFN1YnRhcmdldC5pc1RodW1iMU9ubHkoKSkgew0KKyAgICAgICAgSSA9IFRIVU1CX3JHUFJBTyArIChzaXplb2YoVEhVTUJfckdQUkFPKS9zaXplb2YodW5zaWduZWQpKTsNCisgICAgICAgIHJldHVybiBSSS0+aGFzRlAoTUYpID8gSS0xIDogSTsNCisgICAgICB9DQorDQorICAgICAgaWYgKFN1YnRhcmdldC5pc1RhcmdldERhcndpbigpKSB7DQorICAgICAgICBpZiAoU3VidGFyZ2V0LmlzUjlSZXNlcnZlZCgpKQ0KKyAgICAgICAgICBJID0gQVJNX3JHUFJBT180ICsgKHNpemVvZihBUk1fckdQUkFPXzQpL3NpemVvZih1bnNpZ25lZCkpOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBJID0gQVJNX3JHUFJBT18zICsgKHNpemVvZihBUk1fckdQUkFPXzMpL3NpemVvZih1bnNpZ25lZCkpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoU3VidGFyZ2V0LmlzUjlSZXNlcnZlZCgpKQ0KKyAgICAgICAgICBJID0gQVJNX3JHUFJBT18yICsgKHNpemVvZihBUk1fckdQUkFPXzIpL3NpemVvZih1bnNpZ25lZCkpOw0KKyAgICAgICAgZWxzZSBpZiAoU3VidGFyZ2V0LmlzVGh1bWIoKSkNCisgICAgICAgICAgSSA9IEFSTV9yR1BSQU9fNSArIChzaXplb2YoQVJNX3JHUFJBT181KS9zaXplb2YodW5zaWduZWQpKTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgSSA9IEFSTV9yR1BSQU9fMSArIChzaXplb2YoQVJNX3JHUFJBT18xKS9zaXplb2YodW5zaWduZWQpKTsNCisgICAgICB9DQorDQorICAgICAgcmV0dXJuIFJJLT5oYXNGUChNRikgPyBJLTEgOiBJOw0KKyAgICB9DQorICB9XTsNCit9DQorDQorLy8gVGh1bWIgcmVnaXN0ZXJzIGFyZSBSMC1SNyBub3JtYWxseS4gU29tZSBpbnN0cnVjdGlvbnMgY2FuIHN0aWxsIHVzZQ0KKy8vIHRoZSBnZW5lcmFsIEdQUiByZWdpc3RlciBjbGFzcyBhYm92ZSAoTU9WLCBlLmcuKQ0KK2RlZiB0R1BSIDogUmVnaXN0ZXJDbGFzczwiQVJNIiwgW2kzMl0sIDMyLCBbUjAsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjYsIFI3XT4gew0KKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgfV07DQorICBsZXQgTWV0aG9kQm9kaWVzID0gW3sNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFRIVU1CX3RHUFJfQU9bXSA9IHsNCisgICAgICBBUk06OlIwLCBBUk06OlIxLCBBUk06OlIyLCBBUk06OlIzLA0KKyAgICAgIEFSTTo6UjQsIEFSTTo6UjUsIEFSTTo6UjYsIEFSTTo6UjcgfTsNCisNCisgICAgLy8gRlAgaXMgUjcsIG9ubHkgbG93IHJlZ2lzdGVycyBhdmFpbGFibGUuDQorICAgIHRHUFJDbGFzczo6aXRlcmF0b3INCisgICAgdEdQUkNsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICByZXR1cm4gVEhVTUJfdEdQUl9BTzsNCisgICAgfQ0KKw0KKyAgICB0R1BSQ2xhc3M6Oml0ZXJhdG9yDQorICAgIHRHUFJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOw0KKyAgICAgIHRHUFJDbGFzczo6aXRlcmF0b3IgSSA9DQorICAgICAgICBUSFVNQl90R1BSX0FPICsgKHNpemVvZihUSFVNQl90R1BSX0FPKS9zaXplb2YodW5zaWduZWQpKTsNCisgICAgICByZXR1cm4gUkktPmhhc0ZQKE1GKSA/IEktMSA6IEk7DQorICAgIH0NCisgIH1dOw0KK30NCisNCisvLyBGb3IgdGFpbCBjYWxscywgd2UgY2FuJ3QgdXNlIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMsIGFzIHRoZXkgYXJlIHJlc3RvcmVkDQorLy8gdG8gdGhlIHNhdmVkIHZhbHVlIGJlZm9yZSB0aGUgdGFpbCBjYWxsLCB3aGljaCB3b3VsZCBjbG9iYmVyIGEgY2FsbCBhZGRyZXNzLg0KKy8vIE5vdGUsIGdldE1pbmltYWxQaHlzUmVnQ2xhc3MoUjApIHJldHVybnMgdEdQUiBiZWNhdXNlIG9mIHRoZSBuYW1lcyBvZg0KKy8vIHRoaXMgY2xhc3MgYW5kIHRoZSBwcmVjZWRpbmcgb25lKCEpICBUaGlzIGlzIHdoYXQgd2Ugd2FudC4NCitkZWYgdGNHUFIgOiBSZWdpc3RlckNsYXNzPCJBUk0iLCBbaTMyXSwgMzIsIFtSMCwgUjEsIFIyLCBSMywgUjksIFIxMl0+IHsNCisgIGxldCBNZXRob2RQcm90b3MgPSBbew0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgIH1dOw0KKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7DQorICAgIC8vIFI5IGlzIGF2YWlsYWJsZS4NCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEFSTV9HUFJfUjlfVENbXSA9IHsNCisgICAgICBBUk06OlIwLCBBUk06OlIxLCBBUk06OlIyLCBBUk06OlIzLA0KKyAgICAgIEFSTTo6UjksIEFSTTo6UjEyIH07DQorICAgIC8vIFI5IGlzIG5vdCBhdmFpbGFibGUuDQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBBUk1fR1BSX05PUjlfVENbXSA9IHsNCisgICAgICBBUk06OlIwLCBBUk06OlIxLCBBUk06OlIyLCBBUk06OlIzLA0KKyAgICAgIEFSTTo6UjEyIH07DQorDQorICAgIC8vIEZvciBUaHVtYjEgbW9kZSwgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBoaSByZWdzIGF0IGFsbCwgYXMgd2UNCisgICAgLy8gZG9uJ3Qga25vdyBob3cgdG8gc3BpbGwgdGhlbS4gSWYgd2UgbWFrZSBvdXIgcHJvbG9ndWUvZXBpbG9ndWUgY29kZQ0KKyAgICAvLyBzbWFydGVyIGF0IHNvbWUgcG9pbnQsIHdlIGNhbiBnbyBiYWNrIHRvIHVzaW5nIHRoZSBhYm92ZSBhbGxvY2F0aW9uDQorICAgIC8vIG9yZGVycyBmb3IgdGhlIFRodW1iMSBpbnN0cnVjdGlvbnMgdGhhdCBrbm93IGhvdyB0byB1c2UgaGkgcmVncy4NCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFRIVU1CX0dQUl9BT19UQ1tdID0gew0KKyAgICAgIEFSTTo6UjAsIEFSTTo6UjEsIEFSTTo6UjIsIEFSTTo6UjMgfTsNCisNCisgICAgdGNHUFJDbGFzczo6aXRlcmF0b3INCisgICAgdGNHUFJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCk7DQorICAgICAgaWYgKFN1YnRhcmdldC5pc1RodW1iMU9ubHkoKSkNCisgICAgICAgIHJldHVybiBUSFVNQl9HUFJfQU9fVEM7DQorICAgICAgaWYgKFN1YnRhcmdldC5pc1RhcmdldERhcndpbigpKSB7DQorICAgICAgICBpZiAoU3VidGFyZ2V0LmlzUjlSZXNlcnZlZCgpKQ0KKyAgICAgICAgICByZXR1cm4gQVJNX0dQUl9OT1I5X1RDOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICByZXR1cm4gQVJNX0dQUl9SOV9UQzsNCisgICAgICB9IGVsc2UNCisgICAgICAgIC8vIFI5IGlzIGVpdGhlciBjYWxsZWUtc2F2ZWQgb3IgcmVzZXJ2ZWQ7IGNhbid0IHVzZSBpdC4NCisgICAgICAgIHJldHVybiBBUk1fR1BSX05PUjlfVEM7DQorICAgIH0NCisNCisgICAgdGNHUFJDbGFzczo6aXRlcmF0b3INCisgICAgdGNHUFJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgQVJNU3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8QVJNU3VidGFyZ2V0PigpOw0KKyAgICAgIEdQUkNsYXNzOjppdGVyYXRvciBJOw0KKw0KKyAgICAgIGlmIChTdWJ0YXJnZXQuaXNUaHVtYjFPbmx5KCkpIHsNCisgICAgICAgIEkgPSBUSFVNQl9HUFJfQU9fVEMgKyAoc2l6ZW9mKFRIVU1CX0dQUl9BT19UQykvc2l6ZW9mKHVuc2lnbmVkKSk7DQorICAgICAgICByZXR1cm4gSTsNCisgICAgICB9DQorDQorICAgICAgaWYgKFN1YnRhcmdldC5pc1RhcmdldERhcndpbigpKSB7DQorICAgICAgICBpZiAoU3VidGFyZ2V0LmlzUjlSZXNlcnZlZCgpKQ0KKyAgICAgICAgICBJID0gQVJNX0dQUl9OT1I5X1RDICsgKHNpemVvZihBUk1fR1BSX05PUjlfVEMpL3NpemVvZih1bnNpZ25lZCkpOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBJID0gQVJNX0dQUl9SOV9UQyArIChzaXplb2YoQVJNX0dQUl9SOV9UQykvc2l6ZW9mKHVuc2lnbmVkKSk7DQorICAgICAgfSBlbHNlDQorICAgICAgICAvLyBSOSBpcyBlaXRoZXIgY2FsbGVlLXNhdmVkIG9yIHJlc2VydmVkOyBjYW4ndCB1c2UgaXQuDQorICAgICAgICBJID0gQVJNX0dQUl9OT1I5X1RDICsgKHNpemVvZihBUk1fR1BSX05PUjlfVEMpL3NpemVvZih1bnNpZ25lZCkpOw0KKyAgICAgIHJldHVybiBJOw0KKyAgICB9DQorICB9XTsNCit9DQorDQorDQorLy8gU2NhbGFyIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgY2xhc3MuLg0KK2RlZiBTUFIgOiBSZWdpc3RlckNsYXNzPCJBUk0iLCBbZjMyXSwgMzIsIFtTMCwgUzEsIFMyLCBTMywgUzQsIFM1LCBTNiwgUzcsIFM4LA0KKyAgUzksIFMxMCwgUzExLCBTMTIsIFMxMywgUzE0LCBTMTUsIFMxNiwgUzE3LCBTMTgsIFMxOSwgUzIwLCBTMjEsIFMyMiwNCisgIFMyMywgUzI0LCBTMjUsIFMyNiwgUzI3LCBTMjgsIFMyOSwgUzMwLCBTMzFdPjsNCisNCisvLyBTdWJzZXQgb2YgU1BSIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgc291cmNlIG9mIE5FT04gc2NhbGFycyBmb3IgMTYtYml0DQorLy8gb3BlcmF0aW9ucw0KK2RlZiBTUFJfOCA6IFJlZ2lzdGVyQ2xhc3M8IkFSTSIsIFtmMzJdLCAzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtTMCwgUzEsICBTMiwgIFMzLCAgUzQsICBTNSwgIFM2LCAgUzcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUzgsIFM5LCBTMTAsIFMxMSwgUzEyLCBTMTMsIFMxNCwgUzE1XT47DQorDQorLy8gU2NhbGFyIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgLyBnZW5lcmljIDY0LWJpdCB2ZWN0b3IgcmVnaXN0ZXINCisvLyBjbGFzcy4NCisvLyBBUk0gcmVxdWlyZXMgb25seSB3b3JkIGFsaWdubWVudCBmb3IgZG91YmxlLiBJdCdzIG1vcmUgcGVyZm9ybWFudCBpZiBpdA0KKy8vIGlzIGRvdWJsZS13b3JkIGFsaWdubWVudCB0aG91Z2guDQorZGVmIERQUiA6IFJlZ2lzdGVyQ2xhc3M8IkFSTSIsIFtmNjQsIHY4aTgsIHY0aTE2LCB2MmkzMiwgdjFpNjQsIHYyZjMyXSwgNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgW0QwLCAgRDEsICBEMiwgIEQzLCAgRDQsICBENSwgIEQ2LCAgRDcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEQ4LCAgRDksICBEMTAsIEQxMSwgRDEyLCBEMTMsIEQxNCwgRDE1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBEMTYsIEQxNywgRDE4LCBEMTksIEQyMCwgRDIxLCBEMjIsIEQyMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRDI0LCBEMjUsIEQyNiwgRDI3LCBEMjgsIEQyOSwgRDMwLCBEMzFdPiB7DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICAvLyBWRlAyDQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBBUk1fRFBSX1ZGUDJbXSA9IHsNCisgICAgICBBUk06OkQwLCAgQVJNOjpEMSwgIEFSTTo6RDIsICBBUk06OkQzLA0KKyAgICAgIEFSTTo6RDQsICBBUk06OkQ1LCAgQVJNOjpENiwgIEFSTTo6RDcsDQorICAgICAgQVJNOjpEOCwgIEFSTTo6RDksICBBUk06OkQxMCwgQVJNOjpEMTEsDQorICAgICAgQVJNOjpEMTIsIEFSTTo6RDEzLCBBUk06OkQxNCwgQVJNOjpEMTUgfTsNCisgICAgLy8gVkZQMw0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQVJNX0RQUl9WRlAzW10gPSB7DQorICAgICAgQVJNOjpEMCwgIEFSTTo6RDEsICBBUk06OkQyLCAgQVJNOjpEMywNCisgICAgICBBUk06OkQ0LCAgQVJNOjpENSwgIEFSTTo6RDYsICBBUk06OkQ3LA0KKyAgICAgIEFSTTo6RDgsICBBUk06OkQ5LCAgQVJNOjpEMTAsIEFSTTo6RDExLA0KKyAgICAgIEFSTTo6RDEyLCBBUk06OkQxMywgQVJNOjpEMTQsIEFSTTo6RDE1LA0KKyAgICAgIEFSTTo6RDE2LCBBUk06OkQxNywgQVJNOjpEMTgsIEFSTTo6RDE5LA0KKyAgICAgIEFSTTo6RDIwLCBBUk06OkQyMSwgQVJNOjpEMjIsIEFSTTo6RDIzLA0KKyAgICAgIEFSTTo6RDI0LCBBUk06OkQyNSwgQVJNOjpEMjYsIEFSTTo6RDI3LA0KKyAgICAgIEFSTTo6RDI4LCBBUk06OkQyOSwgQVJNOjpEMzAsIEFSTTo6RDMxIH07DQorICAgIERQUkNsYXNzOjppdGVyYXRvcg0KKyAgICBEUFJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCk7DQorICAgICAgaWYgKFN1YnRhcmdldC5oYXNWRlAzKCkpDQorICAgICAgICByZXR1cm4gQVJNX0RQUl9WRlAzOw0KKyAgICAgIHJldHVybiBBUk1fRFBSX1ZGUDI7DQorICAgIH0NCisNCisgICAgRFBSQ2xhc3M6Oml0ZXJhdG9yDQorICAgIERQUkNsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCk7DQorICAgICAgaWYgKFN1YnRhcmdldC5oYXNWRlAzKCkpDQorICAgICAgICByZXR1cm4gQVJNX0RQUl9WRlAzICsgKHNpemVvZihBUk1fRFBSX1ZGUDMpL3NpemVvZih1bnNpZ25lZCkpOw0KKyAgICAgIGVsc2UNCisgICAgICAgIHJldHVybiBBUk1fRFBSX1ZGUDIgKyAoc2l6ZW9mKEFSTV9EUFJfVkZQMikvc2l6ZW9mKHVuc2lnbmVkKSk7DQorICAgIH0NCisgIH1dOw0KK30NCisNCisvLyBTdWJzZXQgb2YgRFBSIHRoYXQgYXJlIGFjY2Vzc2libGUgd2l0aCBWRlAyIChhbmQgc28gdGhhdCBhbHNvIGhhdmUNCisvLyAzMi1iaXQgU1BSIHN1YnJlZ3MpLg0KK2RlZiBEUFJfVkZQMiA6IFJlZ2lzdGVyQ2xhc3M8IkFSTSIsIFtmNjQsIHY4aTgsIHY0aTE2LCB2MmkzMiwgdjFpNjQsIHYyZjMyXSwgNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRDAsICBEMSwgIEQyLCAgRDMsICBENCwgIEQ1LCAgRDYsICBENywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEOCwgIEQ5LCAgRDEwLCBEMTEsIEQxMiwgRDEzLCBEMTQsIEQxNV0+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhTUFIgc3N1Yl8wLCBzc3ViXzEpXTsNCit9DQorDQorLy8gU3Vic2V0IG9mIERQUiB3aGljaCBjYW4gYmUgdXNlZCBhcyBhIHNvdXJjZSBvZiBORU9OIHNjYWxhcnMgZm9yIDE2LWJpdA0KKy8vIG9wZXJhdGlvbnMNCitkZWYgRFBSXzggOiBSZWdpc3RlckNsYXNzPCJBUk0iLCBbZjY0LCB2OGk4LCB2NGkxNiwgdjJpMzIsIHYxaTY0LCB2MmYzMl0sIDY0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0QwLCAgRDEsICBEMiwgIEQzLCAgRDQsICBENSwgIEQ2LCAgRDddPiB7DQorICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoU1BSXzggc3N1Yl8wLCBzc3ViXzEpXTsNCit9DQorDQorLy8gR2VuZXJpYyAxMjgtYml0IHZlY3RvciByZWdpc3RlciBjbGFzcy4NCitkZWYgUVBSIDogUmVnaXN0ZXJDbGFzczwiQVJNIiwgW3YxNmk4LCB2OGkxNiwgdjRpMzIsIHYyaTY0LCB2NGYzMiwgdjJmNjRdLCAxMjgsDQorICAgICAgICAgICAgICAgICAgICAgICAgW1EwLCAgUTEsICBRMiwgIFEzLCAgUTQsICBRNSwgIFE2LCAgUTcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFE4LCAgUTksICBRMTAsIFExMSwgUTEyLCBRMTMsIFExNCwgUTE1XT4gew0KKyAgbGV0IFN1YlJlZ0NsYXNzZXMgPSBbKERQUiBkc3ViXzAsIGRzdWJfMSldOw0KK30NCisNCisvLyBTdWJzZXQgb2YgUVBSIHRoYXQgaGF2ZSAzMi1iaXQgU1BSIHN1YnJlZ3MuDQorZGVmIFFQUl9WRlAyIDogUmVnaXN0ZXJDbGFzczwiQVJNIiwgW3YxNmk4LCB2OGkxNiwgdjRpMzIsIHYyaTY0LCB2NGYzMiwgdjJmNjRdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1EwLCAgUTEsICBRMiwgIFEzLCAgUTQsICBRNSwgIFE2LCAgUTddPiB7DQorICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoU1BSICAgICAgc3N1Yl8wLCBzc3ViXzEsIHNzdWJfMiwgc3N1Yl8zKSwNCisgICAgICAgICAgICAgICAgICAgICAgIChEUFJfVkZQMiBkc3ViXzAsIGRzdWJfMSldOw0KK30NCisNCisvLyBTdWJzZXQgb2YgUVBSIHRoYXQgaGF2ZSBEUFJfOCBhbmQgU1BSXzggc3VicmVncy4NCitkZWYgUVBSXzggOiBSZWdpc3RlckNsYXNzPCJBUk0iLCBbdjE2aTgsIHY4aTE2LCB2NGkzMiwgdjJpNjQsIHY0ZjMyLCB2MmY2NF0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtRMCwgIFExLCAgUTIsICBRM10+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhTUFJfOCBzc3ViXzAsIHNzdWJfMSwgc3N1Yl8yLCBzc3ViXzMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKERQUl84IGRzdWJfMCwgZHN1Yl8xKV07DQorfQ0KKw0KKy8vIFBzZXVkbyAyNTYtYml0IHZlY3RvciByZWdpc3RlciBjbGFzcyB0byBtb2RlbCBwYWlycyBvZiBRIHJlZ2lzdGVycw0KKy8vICg0IGNvbnNlY3V0aXZlIEQgcmVnaXN0ZXJzKS4NCitkZWYgUVFQUiA6IFJlZ2lzdGVyQ2xhc3M8IkFSTSIsIFt2NGk2NF0sDQorICAgICAgICAgICAgICAgICAgICAgICAgIDI1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgW1FRMCwgUVExLCBRUTIsIFFRMywgUVE0LCBRUTUsIFFRNiwgUVE3XT4gew0KKyAgbGV0IFN1YlJlZ0NsYXNzZXMgPSBbKERQUiBkc3ViXzAsIGRzdWJfMSwgZHN1Yl8yLCBkc3ViXzMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKFFQUiBxc3ViXzAsIHFzdWJfMSldOw0KK30NCisNCisvLyBTdWJzZXQgb2YgUVFQUiB0aGF0IGhhdmUgMzItYml0IFNQUiBzdWJyZWdzLg0KK2RlZiBRUVBSX1ZGUDIgOiBSZWdpc3RlckNsYXNzPCJBUk0iLCBbdjRpNjRdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUVEwLCBRUTEsIFFRMiwgUVEzXT4gew0KKyAgbGV0IFN1YlJlZ0NsYXNzZXMgPSBbKFNQUiAgICAgIHNzdWJfMCwgc3N1Yl8xLCBzc3ViXzIsIHNzdWJfMyksDQorICAgICAgICAgICAgICAgICAgICAgICAoRFBSX1ZGUDIgZHN1Yl8wLCBkc3ViXzEsIGRzdWJfMiwgZHN1Yl8zKSwNCisgICAgICAgICAgICAgICAgICAgICAgIChRUFJfVkZQMiBxc3ViXzAsIHFzdWJfMSldOw0KKw0KK30NCisNCisvLyBQc2V1ZG8gNTEyLWJpdCB2ZWN0b3IgcmVnaXN0ZXIgY2xhc3MgdG8gbW9kZWwgNCBjb25zZWN1dGl2ZSBRIHJlZ2lzdGVycw0KKy8vICg4IGNvbnNlY3V0aXZlIEQgcmVnaXN0ZXJzKS4NCitkZWYgUVFRUVBSIDogUmVnaXN0ZXJDbGFzczwiQVJNIiwgW3Y4aTY0XSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgMjU2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbUVFRUTAsIFFRUVExLCBRUVFRMiwgUVFRUTNdPiB7DQorICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoRFBSIGRzdWJfMCwgZHN1Yl8xLCBkc3ViXzIsIGRzdWJfMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN1Yl80LCBkc3ViXzUsIGRzdWJfNiwgZHN1Yl83KSwNCisgICAgICAgICAgICAgICAgICAgICAgIChRUFIgcXN1Yl8wLCBxc3ViXzEsIHFzdWJfMiwgcXN1Yl8zKV07DQorfQ0KKw0KKy8vIENvbmRpdGlvbiBjb2RlIHJlZ2lzdGVycy4NCitkZWYgQ0NSIDogUmVnaXN0ZXJDbGFzczwiQVJNIiwgW2kzMl0sIDMyLCBbQ1BTUl0+Ow0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVJlbG9jYXRpb25zLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1SZWxvY2F0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTcyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1SZWxvY2F0aW9ucy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vPT09LSBBUk1SZWxvY2F0aW9ucy5oIC0gQVJNIENvZGUgUmVsb2NhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFSTSB0YXJnZXQtc3BlY2lmaWMgcmVsb2NhdGlvbiB0eXBlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEFSTVJFTE9DQVRJT05TX0gKKyNkZWZpbmUgQVJNUkVMT0NBVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWxvY2F0aW9uLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgbmFtZXNwYWNlIEFSTSB7CisgICAgZW51bSBSZWxvY2F0aW9uVHlwZSB7CisgICAgICAvLyByZWxvY19hcm1fYWJzb2x1dGUgLSBBYnNvbHV0ZSByZWxvY2F0aW9uLCBqdXN0IGFkZCB0aGUgcmVsb2NhdGVkIHZhbHVlCisgICAgICAvLyB0byB0aGUgdmFsdWUgYWxyZWFkeSBpbiBtZW1vcnkuCisgICAgICByZWxvY19hcm1fYWJzb2x1dGUsCisKKyAgICAgIC8vIHJlbG9jX2FybV9yZWxhdGl2ZSAtIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24sIGFkZCB0aGUgcmVsb2NhdGVkIHZhbHVlIHRvCisgICAgICAvLyB0aGUgdmFsdWUgYWxyZWFkeSBpbiBtZW1vcnksIGFmdGVyIHdlIGFkanVzdCBpdCBmb3Igd2hlcmUgdGhlIFBDIGlzLgorICAgICAgcmVsb2NfYXJtX3JlbGF0aXZlLAorCisgICAgICAvLyByZWxvY19hcm1fY3BfZW50cnkgLSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBjb25zdHBvb2xfZW50cnkncyB3aG9zZQorICAgICAgLy8gYWRkcmVzc2VzIGFyZSBrZXB0IGxvY2FsbHkgaW4gYSBtYXAuCisgICAgICByZWxvY19hcm1fY3BfZW50cnksCisKKyAgICAgIC8vIHJlbG9jX2FybV92ZnBfY3BfZW50cnkgLSBTYW1lIGFzIHJlbG9jX2FybV9jcF9lbnRyeSBleGNlcHQgdGhlIG9mZnNldAorICAgICAgLy8gc2hvdWxkIGJlIGRpdmlkZWQgYnkgNC4KKyAgICAgIHJlbG9jX2FybV92ZnBfY3BfZW50cnksCisKKyAgICAgIC8vIHJlbG9jX2FybV9tYWNoaW5lX2NwX2VudHJ5IC0gUmVsb2NhdGlvbiBvZiBhIEFSTSBtYWNoaW5lIGNvbnN0YW50cG9vbAorICAgICAgLy8gZW50cnkuCisgICAgICByZWxvY19hcm1fbWFjaGluZV9jcF9lbnRyeSwKKworICAgICAgLy8gcmVsb2NfYXJtX2p0X2Jhc2UgLSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBqdW1wIHRhYmxlcyB3aG9zZQorICAgICAgLy8gYWRkcmVzc2VzIGFyZSBrZXB0IGxvY2FsbHkgaW4gYSBtYXAuCisgICAgICByZWxvY19hcm1fanRfYmFzZSwKKworICAgICAgLy8gcmVsb2NfYXJtX3BpY19qdCAtIFBJQyBqdW1wIHRhYmxlIGVudHJ5IHJlbG9jYXRpb246IGRlc3QgYmIgLSBqdCBiYXNlLgorICAgICAgcmVsb2NfYXJtX3BpY19qdCwKKworICAgICAgLy8gcmVsb2NfYXJtX2JyYW5jaCAtIEJyYW5jaCBhZGRyZXNzIHJlbG9jYXRpb24uCisgICAgICByZWxvY19hcm1fYnJhbmNoLAorCisgICAgICAvLyByZWxvY19hcm1fbW92dCAgLSBNT1ZUIGltbWVkaWF0ZSByZWxvY2F0aW9uLgorICAgICAgcmVsb2NfYXJtX21vdnQsCisKKyAgICAgIC8vIHJlbG9jX2FybV9tb3Z3ICAtIE1PVlcgaW1tZWRpYXRlIHJlbG9jYXRpb24uCisgICAgICByZWxvY19hcm1fbW92dworICAgIH07CisgIH0KK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNjaGVkdWxlLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNU2NoZWR1bGUudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwY2NjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNjaGVkdWxlLnRkCkBAIC0wLDAgKzEsMTU5IEBACisvLz09PS0gQVJNU2NoZWR1bGUudGQgLSBBUk0gU2NoZWR1bGluZyBEZWZpbml0aW9ucyAtLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBJdGluZXJhcnkgY2xhc3NlcyB1c2VkIGZvciBBUk0KKy8vCitkZWYgSUlDX2lBTFV4ICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaUFMVWkgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pQUxVciAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lBTFVzaSAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaUFMVXNyICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pVU5BciAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lVTkFzaSAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaVVOQXNyICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pQ01QaSAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lDTVByICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaUNNUHNpICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pQ01Qc3IgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lNT1ZpICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaU1PVnIgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pTU9Wc2kgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lNT1ZzciAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaUNNT1ZpICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pQ01PVnIgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lDTU9Wc2kgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaUNNT1ZzciAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pTVVMMTYgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lNQUMxNiAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaU1VTDMyICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pTUFDMzIgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lNVUw2NCAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaU1BQzY0ICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pTG9hZGkgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lMb2FkciAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaUxvYWRzaSAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pTG9hZGl1ICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lMb2FkcnUgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaUxvYWRzaXUgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pTG9hZG0gICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lTdG9yZWkgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaVN0b3JlciAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pU3RvcmVzaSAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lTdG9yZWl1ICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfaVN0b3JlcnUgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19pU3RvcmVzaXUgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2lTdG9yZW0gICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfQnIgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcFNUQVQgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwVU5BMzIgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBVTkE2NCAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcENNUDMyICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwQ01QNjQgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBDVlRTRCAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcENWVERTICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwQ1ZUU0ggICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBDVlRIUyAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcENWVElTICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwQ1ZUSUQgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBDVlRTSSAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcENWVERJICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwTU9WSVMgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBNT1ZJRCAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcE1PVlNJICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwTU9WREkgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBBTFUzMiAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcEFMVTY0ICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwTVVMMzIgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBNVUw2NCAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcE1BQzMyICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwTUFDNjQgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBESVYzMiAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcERJVjY0ICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwU1FSVDMyICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBTUVJUNjQgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcExvYWQzMiAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwTG9hZDY0ICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBMb2FkbSAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19mcFN0b3JlMzIgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX2ZwU3RvcmU2NCAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfZnBTdG9yZW0gICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WTEQxICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZMRDIgICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVkxEMyAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WTEQ0ICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZTVCAgICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlVOQUQgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WVU5BUSAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZCSU5EICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVkJJTlEgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WTU9WSW1tICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZNT1ZEICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVk1PVlEgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WTU9WSVMgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZNT1ZJRCAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVk1PVklTTCAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WTU9WU0kgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZNT1ZESSAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlBFUk1EICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WUEVSTVEgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZQRVJNUTMgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVk1BQ0QgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WTUFDUSAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZSRUNTRCAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlJFQ1NRICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WQ05UaUQgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZDTlRpUSAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlVOQWlEICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WVU5BaVEgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZRVU5BaUQgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlFVTkFpUSAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WQklOaUQgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZCSU5pUSAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlNVQmlEICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WU1VCaVEgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZCSU5pNEQgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVkJJTmk0USAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WU1VCaTREICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZTVUJpNFEgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVkFCQUQgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WQUJBUSAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZTSExpRCAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlNITGlRICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WU0hMaTREICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZTSExpNFEgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlBBTGlEICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WUEFMaVEgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZNVUxpMTZEICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVk1VTGkzMkQgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WTVVMaTE2USAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZNVUxpMzJRICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVk1BQ2kxNkQgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WTUFDaTMyRCAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZNQUNpMTZRICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVk1BQ2kzMlEgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WRVhURCAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZFWFRRICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlRCMSAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WVEIyICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZUQjMgICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlRCNCAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WVEJYMSAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlDX1ZUQlgyICAgICAgOiBJbnN0ckl0aW5DbGFzczsKK2RlZiBJSUNfVlRCWDMgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQ19WVEJYNCAgICAgIDogSW5zdHJJdGluQ2xhc3M7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gaXRpbmVyYXJpZXMuCisKK2RlZiBHZW5lcmljSXRpbmVyYXJpZXMgOiBQcm9jZXNzb3JJdGluZXJhcmllczxbXSwgW10+OworCitpbmNsdWRlICJBUk1TY2hlZHVsZVY2LnRkIgoraW5jbHVkZSAiQVJNU2NoZWR1bGVBOC50ZCIKK2luY2x1ZGUgIkFSTVNjaGVkdWxlQTkudGQiCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1TY2hlZHVsZUE4LnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNU2NoZWR1bGVBOC50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODJhYmNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNU2NoZWR1bGVBOC50ZApAQCAtMCwwICsxLDYxOCBAQAorLy89LSBBUk1TY2hlZHVsZUE4LnRkIC0gQVJNIENvcnRleC1BOCBTY2hlZHVsaW5nIERlZmluaXRpb25zIC0qLSB0YWJsZWdlbiAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaXRpbmVyYXJ5IGNsYXNzIGRhdGEgZm9yIHRoZSBBUk0gQ29ydGV4IEE4IHByb2Nlc3NvcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8KKy8vIFNjaGVkdWxpbmcgaW5mb3JtYXRpb24gZGVyaXZlZCBmcm9tICJDb3J0ZXgtQTggVGVjaG5pY2FsIFJlZmVyZW5jZSBNYW51YWwiLgorLy8gRnVuY3Rpb25hbCBVbml0cy4KK2RlZiBBOF9Jc3N1ZSAgIDogRnVuY1VuaXQ7IC8vIGlzc3VlCitkZWYgQThfUGlwZTAgICA6IEZ1bmNVbml0OyAvLyBwaXBlbGluZSAwCitkZWYgQThfUGlwZTEgICA6IEZ1bmNVbml0OyAvLyBwaXBlbGluZSAxCitkZWYgQThfTGRTdDAgICA6IEZ1bmNVbml0OyAvLyBwaXBlbGluZSAwIGxvYWQvc3RvcmUKK2RlZiBBOF9MZFN0MSAgIDogRnVuY1VuaXQ7IC8vIHBpcGVsaW5lIDEgbG9hZC9zdG9yZQorZGVmIEE4X05QaXBlICAgOiBGdW5jVW5pdDsgLy8gTkVPTiBBTFUvTVVMIHBpcGUKK2RlZiBBOF9OTFNQaXBlIDogRnVuY1VuaXQ7IC8vIE5FT04gTFMgcGlwZQorLy8KKy8vIER1YWwgaXNzdWUgcGlwZWxpbmUgcmVwcmVzZW50ZWQgYnkgQThfUGlwZTAgfCBBOF9QaXBlMQorLy8KK2RlZiBDb3J0ZXhBOEl0aW5lcmFyaWVzIDogUHJvY2Vzc29ySXRpbmVyYXJpZXM8CisgIFtBOF9Jc3N1ZSwgQThfUGlwZTAsIEE4X1BpcGUxLCBBOF9MZFN0MCwgQThfTGRTdDEsIEE4X05QaXBlLCBBOF9OTFNQaXBlXSwgWworICAvLyBUd28gZnVsbHktcGlwZWxpbmVkIGludGVnZXIgQUxVIHBpcGVsaW5lcworICAvLworICAvLyBObyBvcGVyYW5kIGN5Y2xlcworICBJbnN0ckl0aW5EYXRhPElJQ19pQUxVeCAgICAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0+LAorICAvLworICAvLyBCaW5hcnkgSW5zdHJ1Y3Rpb25zIHRoYXQgcHJvZHVjZSBhIHJlc3VsdAorICBJbnN0ckl0aW5EYXRhPElJQ19pQUxVaSAsW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+XSwgWzIsIDJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUFMVXIgLFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0sIFsyLCAyLCAyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lBTFVzaSxbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT5dLCBbMiwgMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pQUxVc3IsW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+XSwgWzIsIDIsIDEsIDFdPiwKKyAgLy8KKyAgLy8gVW5hcnkgSW5zdHJ1Y3Rpb25zIHRoYXQgcHJvZHVjZSBhIHJlc3VsdAorICBJbnN0ckl0aW5EYXRhPElJQ19pVU5BciAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0sIFsyLCAyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lVTkFzaSwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+XSwgWzIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVVOQXNyLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT5dLCBbMiwgMSwgMV0+LAorICAvLworICAvLyBDb21wYXJlIGluc3RydWN0aW9ucworICBJbnN0ckl0aW5EYXRhPElJQ19pQ01QaSAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0sIFsyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTVByICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+XSwgWzIsIDJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNUHNpLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT5dLCBbMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pQ01Qc3IsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0sIFsyLCAxLCAxXT4sCisgIC8vCisgIC8vIE1vdmUgaW5zdHJ1Y3Rpb25zLCB1bmNvbmRpdGlvbmFsCisgIEluc3RySXRpbkRhdGE8SUlDX2lNT1ZpICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+XSwgWzFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1PVnIgLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT5dLCBbMSwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTU9Wc2ksIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0sIFsxLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lNT1ZzciwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+XSwgWzEsIDEsIDFdPiwKKyAgLy8KKyAgLy8gTW92ZSBpbnN0cnVjdGlvbnMsIGNvbmRpdGlvbmFsCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9WaSAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0sIFsyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9WciAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0sIFsyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9Wc2ksIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0sIFsyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9Wc3IsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPl0sIFsyLCAxLCAxXT4sCisKKyAgLy8gSW50ZWdlciBtdWx0aXBseSBwaXBlbGluZQorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBFNSwgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDYgZm9yIHRob3NlIGNhc2VzCisgIC8vCisgIEluc3RySXRpbkRhdGE8SUlDX2lNVUwxNiAgICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwXT5dLCBbNSwgMSwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTUFDMTYgICAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9QaXBlMF0+XSwgWzYsIDEsIDEsIDRdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1VTDMyICAgLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTFdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQThfUGlwZTBdPl0sIFs2LCAxLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lNQUMzMiAgICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUxXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X1BpcGUwXT5dLCBbNiwgMSwgMSwgNF0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTVVMNjQgICAsIFtJbnN0clN0YWdlPDIsIFtBOF9QaXBlMV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDMsIFtBOF9QaXBlMF0+XSwgWzYsIDYsIDEsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1BQzY0ICAgLCBbSW5zdHJTdGFnZTwyLCBbQThfUGlwZTFdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwzLCBbQThfUGlwZTBdPl0sIFs2LCA2LCAxLCAxXT4sCisKKyAgLy8gSW50ZWdlciBsb2FkIHBpcGVsaW5lCisgIC8vCisgIC8vIGxvYWRzIGhhdmUgYW4gZXh0cmEgY3ljbGUgb2YgbGF0ZW5jeSwgYnV0IGFyZSBmdWxseSBwaXBlbGluZWQKKyAgLy8gdXNlIEE4X0lzc3VlIHRvIGVuZm9yY2UgdGhlIDEgbG9hZC9zdG9yZSBwZXIgY3ljbGUgbGltaXQKKyAgLy8KKyAgLy8gSW1tZWRpYXRlIG9mZnNldAorICBJbnN0ckl0aW5EYXRhPElJQ19pTG9hZGkgICAsIFtJbnN0clN0YWdlPDEsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdPl0sIFszLCAxXT4sCisgIC8vCisgIC8vIFJlZ2lzdGVyIG9mZnNldAorICBJbnN0ckl0aW5EYXRhPElJQ19pTG9hZHIgICAsIFtJbnN0clN0YWdlPDEsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdPl0sIFszLCAxLCAxXT4sCisgIC8vCisgIC8vIFNjYWxlZCByZWdpc3RlciBvZmZzZXQsIGlzc3VlcyBvdmVyIDIgY3ljbGVzCisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2Fkc2kgICwgW0luc3RyU3RhZ2U8MiwgW0E4X0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9MZFN0MF0+XSwgWzQsIDEsIDFdPiwKKyAgLy8KKyAgLy8gSW1tZWRpYXRlIG9mZnNldCB3aXRoIHVwZGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19pTG9hZGl1ICAsIFtJbnN0clN0YWdlPDEsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdPl0sIFszLCAyLCAxXT4sCisgIC8vCisgIC8vIFJlZ2lzdGVyIG9mZnNldCB3aXRoIHVwZGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19pTG9hZHJ1ICAsIFtJbnN0clN0YWdlPDEsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdPl0sIFszLCAyLCAxLCAxXT4sCisgIC8vCisgIC8vIFNjYWxlZCByZWdpc3RlciBvZmZzZXQgd2l0aCB1cGRhdGUsIGlzc3VlcyBvdmVyIDIgY3ljbGVzCisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2Fkc2l1ICwgW0luc3RyU3RhZ2U8MiwgW0E4X0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9MZFN0MF0+XSwgWzQsIDMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gTG9hZCBtdWx0aXBsZQorICBJbnN0ckl0aW5EYXRhPElJQ19pTG9hZG0gICAsIFtJbnN0clN0YWdlPDIsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9QaXBlMF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdPl0+LAorCisgIC8vIEludGVnZXIgc3RvcmUgcGlwZWxpbmUKKyAgLy8KKyAgLy8gdXNlIEE4X0lzc3VlIHRvIGVuZm9yY2UgdGhlIDEgbG9hZC9zdG9yZSBwZXIgY3ljbGUgbGltaXQKKyAgLy8KKyAgLy8gSW1tZWRpYXRlIG9mZnNldAorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVpICAsIFtJbnN0clN0YWdlPDEsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdPl0sIFszLCAxXT4sCisgIC8vCisgIC8vIFJlZ2lzdGVyIG9mZnNldAorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVyICAsIFtJbnN0clN0YWdlPDEsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdPl0sIFszLCAxLCAxXT4sCisgIC8vCisgIC8vIFNjYWxlZCByZWdpc3RlciBvZmZzZXQsIGlzc3VlcyBvdmVyIDIgY3ljbGVzCisgIEluc3RySXRpbkRhdGE8SUlDX2lTdG9yZXNpICwgW0luc3RyU3RhZ2U8MiwgW0E4X0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9MZFN0MF0+XSwgWzMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gSW1tZWRpYXRlIG9mZnNldCB3aXRoIHVwZGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVpdSAsIFtJbnN0clN0YWdlPDEsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdPl0sIFsyLCAzLCAxXT4sCisgIC8vCisgIC8vIFJlZ2lzdGVyIG9mZnNldCB3aXRoIHVwZGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVydSAgLCBbSW5zdHJTdGFnZTwxLCBbQThfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X0xkU3QwXT5dLCBbMiwgMywgMSwgMV0+LAorICAvLworICAvLyBTY2FsZWQgcmVnaXN0ZXIgb2Zmc2V0IHdpdGggdXBkYXRlLCBpc3N1ZXMgb3ZlciAyIGN5Y2xlcworICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVzaXUsIFtJbnN0clN0YWdlPDIsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdPl0sIFszLCAzLCAxLCAxXT4sCisgIC8vCisgIC8vIFN0b3JlIG11bHRpcGxlCisgIEluc3RySXRpbkRhdGE8SUlDX2lTdG9yZW0gICwgW0luc3RyU3RhZ2U8MiwgW0E4X0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X1BpcGUwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9MZFN0MF0+XT4sCisKKyAgLy8gQnJhbmNoCisgIC8vCisgIC8vIG5vIGRlbGF5IHNsb3RzLCBzbyB0aGUgbGF0ZW5jeSBvZiBhIGJyYW5jaCBpcyB1bmltcG9ydGFudAorICBJbnN0ckl0aW5EYXRhPElJQ19CciAgICAgICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+XT4sCisKKyAgLy8gVkZQCisgIC8vIElzc3VlIHRocm91Z2ggaW50ZWdlciBwaXBlbGluZSwgYW5kIGV4ZWN1dGUgaW4gTkVPTiB1bml0LiBXZSBhc3N1bWUKKyAgLy8gUnVuRmFzdCBtb2RlIHNvIHRoYXQgTkZQIHBpcGVsaW5lIGlzIHVzZWQgZm9yIHNpbmdsZS1wcmVjaXNpb24gd2hlbgorICAvLyBwb3NzaWJsZS4KKyAgLy8KKyAgLy8gRlAgU3BlY2lhbCBSZWdpc3RlciB0byBJbnRlZ2VyIFJlZ2lzdGVyIEZpbGUgTW92ZQorICBJbnN0ckl0aW5EYXRhPElJQ19mcFNUQVQgLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT5dPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBVbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19mcFVOQTMyICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNywgMV0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIFVuYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwVU5BNjQgLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw0LCBbQThfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDQsIFtBOF9OTFNQaXBlXT5dLCBbNCwgMV0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIENvbXBhcmUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDTVAzMiAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBDb21wYXJlCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ01QNjQgLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw0LCBbQThfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDQsIFtBOF9OTFNQaXBlXT5dLCBbNCwgMV0+LAorICAvLworICAvLyBTaW5nbGUgdG8gRG91YmxlIEZQIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlRTRCAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOF9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E4X05MU1BpcGVdPl0sIFs3LCAxXT4sCisgIC8vCisgIC8vIERvdWJsZSB0byBTaW5nbGUgRlAgQ29udmVydAorICBJbnN0ckl0aW5EYXRhPElJQ19mcENWVERTICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NSwgW0E4X05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw1LCBbQThfTkxTUGlwZV0+XSwgWzUsIDFdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLVByZWNpc2lvbiBGUCB0byBJbnRlZ2VyIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlRTSSAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzcsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLVByZWNpc2lvbiBGUCB0byBJbnRlZ2VyIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlRESSAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDgsIFtBOF9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8OCwgW0E4X05MU1BpcGVdPl0sIFs4LCAxXT4sCisgIC8vCisgIC8vIEludGVnZXIgdG8gU2luZ2xlLVByZWNpc2lvbiBGUCBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZUSVMgLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTlBpcGVdPl0sIFs3LCAxXT4sCisgIC8vCisgIC8vIEludGVnZXIgdG8gRG91YmxlLVByZWNpc2lvbiBGUCBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZUSUQgLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw4LCBbQThfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDgsIFtBOF9OTFNQaXBlXT5dLCBbOCwgMV0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIEFMVQorICBJbnN0ckl0aW5EYXRhPElJQ19mcEFMVTMyICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNywgMSwgMV0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIEFMVQorICBJbnN0ckl0aW5EYXRhPElJQ19mcEFMVTY0ICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8OSwgW0E4X05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw5LCBbQThfTkxTUGlwZV0+XSwgWzksIDEsIDFdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBNdWx0aXBseQorICBJbnN0ckl0aW5EYXRhPElJQ19mcE1VTDMyICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNywgMSwgMV0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIE11bHRpcGx5CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTVVMNjQgLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxMSwgW0E4X05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxMSwgW0E4X05MU1BpcGVdPl0sIFsxMSwgMSwgMV0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIE1BQworICBJbnN0ckl0aW5EYXRhPElJQ19mcE1BQzMyICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNywgMiwgMSwgMV0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIE1BQworICBJbnN0ckl0aW5EYXRhPElJQ19mcE1BQzY0ICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MTksIFtBOF9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MTksIFtBOF9OTFNQaXBlXT5dLCBbMTksIDIsIDEsIDFdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBESVYKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBESVYzMiAsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIwLCBbQThfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIwLCBbQThfTkxTUGlwZV0+XSwgWzIwLCAxLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgRElWCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwRElWNjQgLCBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyOSwgW0E4X05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyOSwgW0E4X05MU1BpcGVdPl0sIFsyOSwgMSwgMV0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIFNRUlQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBTUVJUMzIsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDE5LCBbQThfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDE5LCBbQThfTkxTUGlwZV0+XSwgWzE5LCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgU1FSVAorICBJbnN0ckl0aW5EYXRhPElJQ19mcFNRUlQ2NCwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MjksIFtBOF9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MjksIFtBOF9OTFNQaXBlXT5dLCBbMjksIDFdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBMb2FkCisgIC8vIHVzZSBBOF9Jc3N1ZSB0byBlbmZvcmNlIHRoZSAxIGxvYWQvc3RvcmUgcGVyIGN5Y2xlIGxpbWl0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTG9hZDMyLCBbSW5zdHJTdGFnZTwxLCBbQThfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9MZFN0MF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05MU1BpcGVdPl0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIExvYWQKKyAgLy8gdXNlIEE4X0lzc3VlIHRvIGVuZm9yY2UgdGhlIDEgbG9hZC9zdG9yZSBwZXIgY3ljbGUgbGltaXQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBMb2FkNjQsIFtJbnN0clN0YWdlPDIsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9MZFN0MF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05MU1BpcGVdPl0+LAorICAvLworICAvLyBGUCBMb2FkIE11bHRpcGxlCisgIC8vIHVzZSBBOF9Jc3N1ZSB0byBlbmZvcmNlIHRoZSAxIGxvYWQvc3RvcmUgcGVyIGN5Y2xlIGxpbWl0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTG9hZG0sICBbSW5zdHJTdGFnZTwzLCBbQThfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9QaXBlMF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT5dPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBTdG9yZQorICAvLyB1c2UgQThfSXNzdWUgdG8gZW5mb3JjZSB0aGUgMSBsb2FkL3N0b3JlIHBlciBjeWNsZSBsaW1pdAorICBJbnN0ckl0aW5EYXRhPElJQ19mcFN0b3JlMzIsW0luc3RyU3RhZ2U8MSwgW0E4X0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT5dPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBTdG9yZQorICAvLyB1c2UgQThfSXNzdWUgdG8gZW5mb3JjZSB0aGUgMSBsb2FkL3N0b3JlIHBlciBjeWNsZSBsaW1pdAorICBJbnN0ckl0aW5EYXRhPElJQ19mcFN0b3JlNjQsW0luc3RyU3RhZ2U8MiwgW0E4X0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfUGlwZTBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X0xkU3QwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTkxTUGlwZV0+XT4sCisgIC8vCisgIC8vIEZQIFN0b3JlIE11bHRpcGxlCisgIC8vIHVzZSBBOF9Jc3N1ZSB0byBlbmZvcmNlIHRoZSAxIGxvYWQvc3RvcmUgcGVyIGN5Y2xlIGxpbWl0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwU3RvcmVtLCBbSW5zdHJTdGFnZTwzLCBbQThfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9QaXBlMF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT5dPiwKKworICAvLyBORU9OCisgIC8vIElzc3VlIHRocm91Z2ggaW50ZWdlciBwaXBlbGluZSwgYW5kIGV4ZWN1dGUgaW4gTkVPTiB1bml0LgorICAvLworICAvLyBWTEQxCisgIC8vIEZJWE1FOiBXZSBkb24ndCBtb2RlbCB0aGlzIGluc3RydWN0aW9uIHByb3Blcmx5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZMRDEsICAgICBbSW5zdHJTdGFnZTwxLCBbQThfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9MZFN0MF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05MU1BpcGVdPl0+LAorICAvLworICAvLyBWTEQyCisgIC8vIEZJWE1FOiBXZSBkb24ndCBtb2RlbCB0aGlzIGluc3RydWN0aW9uIHByb3Blcmx5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZMRDIsICAgICBbSW5zdHJTdGFnZTwxLCBbQThfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9MZFN0MF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05MU1BpcGVdPl0sIFsyLCAyLCAxXT4sCisgIC8vCisgIC8vIFZMRDMKKyAgLy8gRklYTUU6IFdlIGRvbid0IG1vZGVsIHRoaXMgaW5zdHJ1Y3Rpb24gcHJvcGVybHkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkxEMywgICAgIFtJbnN0clN0YWdlPDEsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X0xkU3QwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTkxTUGlwZV0+XSwgWzIsIDIsIDIsIDFdPiwKKyAgLy8KKyAgLy8gVkxENAorICAvLyBGSVhNRTogV2UgZG9uJ3QgbW9kZWwgdGhpcyBpbnN0cnVjdGlvbiBwcm9wZXJseQorICBJbnN0ckl0aW5EYXRhPElJQ19WTEQ0LCAgICAgW0luc3RyU3RhZ2U8MSwgW0E4X0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTGRTdDBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT5dLCBbMiwgMiwgMiwgMiwgMV0+LAorICAvLworICAvLyBWU1QKKyAgLy8gRklYTUU6IFdlIGRvbid0IG1vZGVsIHRoaXMgaW5zdHJ1Y3Rpb24gcHJvcGVybHkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlNULCAgICAgIFtJbnN0clN0YWdlPDEsIFtBOF9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X0xkU3QwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTkxTUGlwZV0+XT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBGUCBVbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19WVU5BRCwgICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNSwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEZQIFVuYXJ5CisgIC8vIFJlc3VsdCB3cml0dGVuIGluIE41LCBidXQgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgbGFzdCBjeWNsZSBvZiBtdWx0aWN5Y2xlLAorICAvLyBzbyB3ZSB1c2UgNiBmb3IgdGhvc2UgY2FzZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlVOQVEsICAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OUGlwZV0+XSwgWzYsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEZQIEJpbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19WQklORCwgICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNSwgMiwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEZQIEJpbmFyeQorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBONSwgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDYgZm9yIHRob3NlIGNhc2VzCisgIEluc3RySXRpbkRhdGE8SUlDX1ZCSU5RLCAgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQThfTlBpcGVdPl0sIFs2LCAyLCAyXT4sCisgIC8vCisgIC8vIE1vdmUgSW1tZWRpYXRlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZJbW0sICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTlBpcGVdPl0sIFszXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBQZXJtdXRlIE1vdmUKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1PVkQsICAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT5dLCBbMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIFBlcm11dGUgTW92ZQorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBOMiwgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDMgZm9yIHRob3NlIGNhc2VzCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZRLCAgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQThfTkxTUGlwZV0+XSwgWzMsIDFdPiwKKyAgLy8KKyAgLy8gSW50ZWdlciB0byBTaW5nbGUtcHJlY2lzaW9uIE1vdmUKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1PVklTICwgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT5dLCBbMiwgMV0+LAorICAvLworICAvLyBJbnRlZ2VyIHRvIERvdWJsZS1wcmVjaXNpb24gTW92ZQorICBJbnN0ckl0aW5EYXRhPElJQ19WTU9WSUQgLCAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05MU1BpcGVdPl0sIFsyLCAxLCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gdG8gSW50ZWdlciBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZTSSAsICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTkxTUGlwZV0+XSwgWzIwLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gdG8gSW50ZWdlciBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZESSAsICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTkxTUGlwZV0+XSwgWzIwLCAyMCwgMV0+LAorICAvLworICAvLyBJbnRlZ2VyIHRvIExhbmUgTW92ZQorICBJbnN0ckl0aW5EYXRhPElJQ19WTU9WSVNMICwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X05MU1BpcGVdPl0sIFszLCAxLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBQZXJtdXRlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZQRVJNRCwgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTkxTUGlwZV0+XSwgWzIsIDIsIDEsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBQZXJtdXRlCisgIC8vIFJlc3VsdCB3cml0dGVuIGluIE4yLCBidXQgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgbGFzdCBjeWNsZSBvZiBtdWx0aWN5Y2xlLAorICAvLyBzbyB3ZSB1c2UgMyBmb3IgdGhvc2UgY2FzZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlBFUk1RLCAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OTFNQaXBlXT5dLCBbMywgMywgMSwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIFBlcm11dGUgKDMgY3ljbGUgaXNzdWUpCisgIC8vIFJlc3VsdCB3cml0dGVuIGluIE4yLCBidXQgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgbGFzdCBjeWNsZSBvZiBtdWx0aWN5Y2xlLAorICAvLyBzbyB3ZSB1c2UgNCBmb3IgdGhvc2UgY2FzZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlBFUk1RMywgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OTFNQaXBlXT5dLCBbNCwgNCwgMSwgMV0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgRlAgTXVsdGlwbGUtQWNjdW11bGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19WTUFDRCwgICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbOSwgMywgMiwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEZQIE11bHRpcGxlLUFjY3VtdWxhdGUKKyAgLy8gUmVzdWx0IHdyaXR0ZW4gaW4gTjksIGJ1dCB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSBsYXN0IGN5Y2xlIG9mIG11bHRpY3ljbGUsCisgIC8vIHNvIHdlIHVzZSAxMCBmb3IgdGhvc2UgY2FzZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1BQ1EsICAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OUGlwZV0+XSwgWzEwLCAzLCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBSZWNpcHJpY2FsIFN0ZXAKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlJFQ1NELCAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzksIDIsIDJdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBSZWNpcHJpY2FsIFN0ZXAKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlJFQ1NRLCAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OUGlwZV0+XSwgWzEwLCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIENvdW50CisgIEluc3RySXRpbkRhdGE8SUlDX1ZDTlRpRCwgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTlBpcGVdPl0sIFszLCAyLCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBDb3VudAorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBOMywgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDQgZm9yIHRob3NlIGNhc2VzCisgIEluc3RySXRpbkRhdGE8SUlDX1ZDTlRpUSwgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQThfTlBpcGVdPl0sIFs0LCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIFVuYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZVTkFpRCwgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTlBpcGVdPl0sIFs0LCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBVbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19WVU5BaVEsICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNCwgMl0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBRLVVuYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZRVU5BaUQsICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTlBpcGVdPl0sIFs0LCAxXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBDb3VudFEtVW5hcnkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlFVTkFpUSwgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzQsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgQmluYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZCSU5pRCwgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTlBpcGVdPl0sIFszLCAyLCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBCaW5hcnkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkJJTmlRLCAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzMsIDIsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgQmluYXJ5ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WQklOaTRELCAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNCwgMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgQmluYXJ5ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WQklOaTRRLCAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNCwgMiwgMV0+LAorCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIFN1YnRyYWN0CisgIEluc3RySXRpbkRhdGE8SUlDX1ZTVUJpRCwgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTlBpcGVdPl0sIFszLCAyLCAxXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBTdWJ0cmFjdAorICBJbnN0ckl0aW5EYXRhPElJQ19WU1VCaVEsICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbMywgMiwgMV0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBTdWJ0cmFjdAorICBJbnN0ckl0aW5EYXRhPElJQ19WU1VCaTRELCAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNCwgMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgU3VidHJhY3QKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlNVQmk0USwgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzQsIDIsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgU2hpZnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlNITGlELCAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIFNoaWZ0CisgIEluc3RySXRpbkRhdGE8SUlDX1ZTSExpUSwgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQThfTlBpcGVdPl0sIFs0LCAxLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIFNoaWZ0ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WU0hMaTRELCAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzQsIDEsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIFNoaWZ0ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WU0hMaTRRLCAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OUGlwZV0+XSwgWzUsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgUGFpciBBZGQgTG9uZworICBJbnN0ckl0aW5EYXRhPElJQ19WUEFMaUQsICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNiwgMywgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgUGFpciBBZGQgTG9uZworICBJbnN0ckl0aW5EYXRhPElJQ19WUEFMaVEsICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X05QaXBlXT5dLCBbNywgMywgMV0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgQWJzb2x1dGUgRGlmZmVyZW5jZSBhbmQgQWNjdW11bGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19WQUJBRCwgICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXT5dLCBbNiwgMywgMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEFic29sdXRlIERpZmZlcmVuY2UgYW5kIEFjY3VtdWxhdGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkFCQVEsICAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OUGlwZV0+XSwgWzYsIDMsIDIsIDFdPiwKKworICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBNdWx0aXBseSAoLjgsIC4xNikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1VTGkxNkQsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzYsIDIsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHkgKC4zMikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1VTGkzMkQsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OUGlwZV0+XSwgWzcsIDIsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIE11bHRpcGx5ICguOCwgLjE2KQorICBJbnN0ckl0aW5EYXRhPElJQ19WTVVMaTE2USwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X05QaXBlXT5dLCBbNywgMiwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHkgKC4zMikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1VTGkzMlEsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X05MU1BpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDMsIFtBOF9OUGlwZV0+XSwgWzksIDIsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHktQWNjdW11bGF0ZSAoLjgsIC4xNikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1BQ2kxNkQsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+XSwgWzYsIDMsIDIsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHktQWNjdW11bGF0ZSAoLjMyKQorICBJbnN0ckl0aW5EYXRhPElJQ19WTUFDaTMyRCwgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X05QaXBlXT5dLCBbNywgMywgMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHktQWNjdW11bGF0ZSAoLjgsIC4xNikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1BQ2kxNlEsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OUGlwZV0+XSwgWzcsIDMsIDIsIDJdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIE11bHRpcGx5LUFjY3VtdWxhdGUgKC4zMikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1BQ2kzMlEsIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X05MU1BpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDMsIFtBOF9OUGlwZV0+XSwgWzksIDMsIDIsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIFZFWFQKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkVYVEQsICAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT5dLCBbMiwgMSwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIFZFWFQKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkVYVFEsICAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OTFNQaXBlXT5dLCBbMywgMSwgMV0+LAorICAvLworICAvLyBWVEIKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCMSwgICAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OTFNQaXBlXT5dLCBbMywgMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19WVEIyLCAgICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X05MU1BpcGVdPl0sIFszLCAyLCAyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX1ZUQjMsICAgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTkxTUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQThfTkxTUGlwZV0+XSwgWzQsIDIsIDIsIDMsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCNCwgICAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OTFNQaXBlXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OTFNQaXBlXT5dLFs0LCAyLCAyLCAzLCAzLCAxXT4sCisgIC8vCisgIC8vIFZUQlgKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCWDEsICAgIFtJbnN0clN0YWdlPDEsIFtBOF9QaXBlMCwgQThfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOF9OTFNQaXBlXT5dLCBbMywgMSwgMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19WVEJYMiwgICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X05MU1BpcGVdPl0sIFszLCAxLCAyLCAyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX1ZUQlgzLCAgICBbSW5zdHJTdGFnZTwxLCBbQThfUGlwZTAsIEE4X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQThfTkxTUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQThfTkxTUGlwZV0+XSxbNCwgMSwgMiwgMiwgMywgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19WVEJYNCwgICAgW0luc3RyU3RhZ2U8MSwgW0E4X1BpcGUwLCBBOF9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E4X05MU1BpcGVdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOF9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E4X05MU1BpcGVdPl0sIFs0LCAxLCAyLCAyLCAzLCAzLCAxXT4KK10+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNU2NoZWR1bGVBOS50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNjaGVkdWxlQTkudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyZjg5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNjaGVkdWxlQTkudGQKQEAgLTAsMCArMSw4NDUgQEAKKy8vPS0gQVJNU2NoZWR1bGVBOS50ZCAtIEFSTSBDb3J0ZXgtQTkgU2NoZWR1bGluZyBEZWZpbml0aW9ucyAtKi0gdGFibGVnZW4gLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGl0aW5lcmFyeSBjbGFzcyBkYXRhIGZvciB0aGUgQVJNIENvcnRleCBBOSBwcm9jZXNzb3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vCisvLyBBZC1ob2Mgc2NoZWR1bGluZyBpbmZvcm1hdGlvbiBkZXJpdmVkIGZyb20gcHJldHR5IHZhZ3VlICJDb3J0ZXgtQTkgVGVjaG5pY2FsCisvLyBSZWZlcmVuY2UgTWFudWFsIi4KKy8vCisvLyBGdW5jdGlvbmFsIHVuaXRzCitkZWYgQTlfUGlwZTAgICA6IEZ1bmNVbml0OyAvLyBwaXBlbGluZSAwCitkZWYgQTlfUGlwZTEgICA6IEZ1bmNVbml0OyAvLyBwaXBlbGluZSAxCitkZWYgQTlfTFNQaXBlICA6IEZ1bmNVbml0OyAvLyBMUyBwaXBlCitkZWYgQTlfTlBpcGUgICA6IEZ1bmNVbml0OyAvLyBORU9OIEFMVS9NVUwgcGlwZQorZGVmIEE5X0RSZWdzVkZQOiBGdW5jVW5pdDsgLy8gRlAgcmVnaXN0ZXIgc2V0LCBWRlAgc2lkZQorZGVmIEE5X0RSZWdzTiAgOiBGdW5jVW5pdDsgLy8gRlAgcmVnaXN0ZXIgc2V0LCBORU9OIHNpZGUKKworLy8gRHVhbCBpc3N1ZSBwaXBlbGluZSByZXByZXNlbnRlZCBieSBBOV9QaXBlMCB8IEE5X1BpcGUxCisvLworZGVmIENvcnRleEE5SXRpbmVyYXJpZXMgOiBQcm9jZXNzb3JJdGluZXJhcmllczwKKyAgW0E5X05QaXBlLCBBOV9EUmVnc04sIEE5X0RSZWdzVkZQLCBBOV9MU1BpcGUsIEE5X1BpcGUwLCBBOV9QaXBlMV0sIFsKKyAgLy8gVHdvIGZ1bGx5LXBpcGVsaW5lZCBpbnRlZ2VyIEFMVSBwaXBlbGluZXMKKyAgLy8gRklYTUU6IFRoZXJlIGFyZSBubyBvcGVyYW5kIGxhdGVuY2llcyBmb3IgdGhlc2UgaW5zdHJ1Y3Rpb25zIGF0IGFsbCEKKyAgLy8KKyAgLy8gTW92ZSBpbnN0cnVjdGlvbnMsIHVuY29uZGl0aW9uYWwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1PVmkgICAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMCwgQTlfUGlwZTFdPl0sIFsxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lNT1ZyICAgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTAsIEE5X1BpcGUxXT5dLCBbMSwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTU9Wc2kgICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUwLCBBOV9QaXBlMV0+XSwgWzEsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1PVnNyICAsIFtJbnN0clN0YWdlPDIsIFtBOV9QaXBlMCwgQTlfUGlwZTFdPl0sIFsyLCAyLCAxXT4sCisgIC8vCisgIC8vIE5vIG9wZXJhbmQgY3ljbGVzCisgIEluc3RySXRpbkRhdGE8SUlDX2lBTFV4ICAgICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUwLCBBOV9QaXBlMV0+XT4sCisgIC8vCisgIC8vIEJpbmFyeSBJbnN0cnVjdGlvbnMgdGhhdCBwcm9kdWNlIGEgcmVzdWx0CisgIEluc3RySXRpbkRhdGE8SUlDX2lBTFVpICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUwLCBBOV9QaXBlMV0+XSwgWzIsIDJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUFMVXIgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTAsIEE5X1BpcGUxXT5dLCBbMiwgMiwgMl0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pQUxVc2ksIFtJbnN0clN0YWdlPDIsIFtBOV9QaXBlMCwgQTlfUGlwZTFdPl0sIFsyLCAyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lBTFVzcixbSW5zdHJTdGFnZTwzLCBbQTlfUGlwZTAsIEE5X1BpcGUxXT5dLCBbMiwgMiwgMSwgMV0+LAorICAvLworICAvLyBVbmFyeSBJbnN0cnVjdGlvbnMgdGhhdCBwcm9kdWNlIGEgcmVzdWx0CisgIEluc3RySXRpbkRhdGE8SUlDX2lVTkFyICAgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTAsIEE5X1BpcGUxXT5dLCBbMiwgMl0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pVU5Bc2kgICwgW0luc3RyU3RhZ2U8MiwgW0E5X1BpcGUwLCBBOV9QaXBlMV0+XSwgWzIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVVOQXNyICAsIFtJbnN0clN0YWdlPDMsIFtBOV9QaXBlMCwgQTlfUGlwZTFdPl0sIFsyLCAxLCAxXT4sCisgIC8vCisgIC8vIENvbXBhcmUgaW5zdHJ1Y3Rpb25zCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTVBpICAgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTAsIEE5X1BpcGUxXT5dLCBbMl0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pQ01QciAgICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUwLCBBOV9QaXBlMV0+XSwgWzIsIDJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNUHNpICAsIFtJbnN0clN0YWdlPDIsIFtBOV9QaXBlMCwgQTlfUGlwZTFdPl0sIFsyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTVBzciAgLCBbSW5zdHJTdGFnZTwzLCBbQTlfUGlwZTAsIEE5X1BpcGUxXT5dLCBbMiwgMSwgMV0+LAorICAvLworICAvLyBNb3ZlIGluc3RydWN0aW9ucywgY29uZGl0aW9uYWwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNT1ZpICAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMCwgQTlfUGlwZTFdPl0sIFsyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9WciAgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTAsIEE5X1BpcGUxXT5dLCBbMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pQ01PVnNpICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUwLCBBOV9QaXBlMV0+XSwgWzIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNT1ZzciAsIFtJbnN0clN0YWdlPDIsIFtBOV9QaXBlMCwgQTlfUGlwZTFdPl0sIFsyLCAxLCAxXT4sCisKKyAgLy8gSW50ZWdlciBtdWx0aXBseSBwaXBlbGluZQorICAvLworICBJbnN0ckl0aW5EYXRhPElJQ19pTVVMMTYgICAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9QaXBlMF0+XSwgWzQsIDEsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1BQzE2ICAgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfUGlwZTBdPl0sIFs0LCAxLCAxLCAyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lNVUwzMiAgICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X1BpcGUwXT5dLCBbNCwgMSwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTUFDMzIgICAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9QaXBlMF0+XSwgWzQsIDEsIDEsIDJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1VTDY0ICAgLCBbSW5zdHJTdGFnZTwyLCBbQTlfUGlwZTFdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwzLCBbQTlfUGlwZTBdPl0sIFs0LCA1LCAxLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lNQUM2NCAgICwgW0luc3RyU3RhZ2U8MiwgW0E5X1BpcGUxXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0E5X1BpcGUwXT5dLCBbNCwgNSwgMSwgMV0+LAorICAvLyBJbnRlZ2VyIGxvYWQgcGlwZWxpbmUKKyAgLy8gRklYTUU6IFRoZSB0aW1pbmdzIGFyZSBzb21lIHJvdWdoIGFwcHJveGltYXRpb25zCisgIC8vCisgIC8vIEltbWVkaWF0ZSBvZmZzZXQKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUxvYWRpICAgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTFNQaXBlXT5dLCBbMywgMV0+LAorICAvLworICAvLyBSZWdpc3RlciBvZmZzZXQKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUxvYWRyICAgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTFNQaXBlXT5dLCBbMywgMSwgMV0+LAorICAvLworICAvLyBTY2FsZWQgcmVnaXN0ZXIgb2Zmc2V0CisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2Fkc2kgICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X0xTUGlwZV0+XSwgWzQsIDEsIDFdPiwKKyAgLy8KKyAgLy8gSW1tZWRpYXRlIG9mZnNldCB3aXRoIHVwZGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19pTG9hZGl1ICAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9MU1BpcGVdPl0sIFszLCAyLCAxXT4sCisgIC8vCisgIC8vIFJlZ2lzdGVyIG9mZnNldCB3aXRoIHVwZGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19pTG9hZHJ1ICAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9MU1BpcGVdPl0sIFszLCAyLCAxLCAxXT4sCisgIC8vCisgIC8vIFNjYWxlZCByZWdpc3RlciBvZmZzZXQgd2l0aCB1cGRhdGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUxvYWRzaXUgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTFNQaXBlXT5dLCBbNCwgMywgMSwgMV0+LAorICAvLworICAvLyBMb2FkIG11bHRpcGxlCisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2FkbSAgICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X0xTUGlwZV0+XT4sCisKKyAgLy8gSW50ZWdlciBzdG9yZSBwaXBlbGluZQorICAvLy8KKyAgLy8gSW1tZWRpYXRlIG9mZnNldAorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVpICAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9MU1BpcGVdPl0sIFszLCAxXT4sCisgIC8vCisgIC8vIFJlZ2lzdGVyIG9mZnNldAorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVyICAsIFtJbnN0clN0YWdlPDEsIFsgQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTFNQaXBlXT5dLCBbMywgMSwgMV0+LAorICAvLworICAvLyBTY2FsZWQgcmVnaXN0ZXIgb2Zmc2V0CisgIEluc3RySXRpbkRhdGE8SUlDX2lTdG9yZXNpICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X0xTUGlwZV0+XSwgWzMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gSW1tZWRpYXRlIG9mZnNldCB3aXRoIHVwZGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVpdSAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9MU1BpcGVdPl0sIFsyLCAzLCAxXT4sCisgIC8vCisgIC8vIFJlZ2lzdGVyIG9mZnNldCB3aXRoIHVwZGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVydSAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9MU1BpcGVdPl0sIFsyLCAzLCAxLCAxXT4sCisgIC8vCisgIC8vIFNjYWxlZCByZWdpc3RlciBvZmZzZXQgd2l0aCB1cGRhdGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVN0b3Jlc2l1LCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTFNQaXBlXT5dLCBbMywgMywgMSwgMV0+LAorICAvLworICAvLyBTdG9yZSBtdWx0aXBsZQorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVtICAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9MU1BpcGVdPl0+LAorICAvLyBCcmFuY2gKKyAgLy8KKyAgLy8gbm8gZGVsYXkgc2xvdHMsIHNvIHRoZSBsYXRlbmN5IG9mIGEgYnJhbmNoIGlzIHVuaW1wb3J0YW50CisgIEluc3RySXRpbkRhdGE8SUlDX0JyICAgICAgICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUwLCBBOV9QaXBlMV0+XT4sCisKKyAgLy8gVkZQIGFuZCBORU9OIHNoYXJlcyB0aGUgc2FtZSByZWdpc3RlciBmaWxlLiBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgVkZQCisgIC8vIGluc3RydWN0aW9uIHNob3VsZCB3YWl0IGZvciBmdWxsIGNvbXBsZXRpb24gb2YgdGhlIGNvbnNlY3V0aXZlIE5FT04KKyAgLy8gaW5zdHJ1Y3Rpb24gYW5kIHZpY2UtdmVyc2EuIFdlIG1vZGVsIHRoaXMgYmVoYXZpb3Igd2l0aCB0d28gYXJ0aWZpY2lhbCBGVXM6CisgIC8vIERSZWdzVkZQIGFuZCBEUmVnc1ZGUC4KKyAgLy8KKyAgLy8gRXZlcnkgVkZQIGluc3RydWN0aW9uOgorICAvLyAgLSBBY3F1aXJlcyBEUmVnc1ZGUCByZXNvdXJjZSBmb3IgMSBjeWNsZQorICAvLyAgLSBSZXNlcnZlcyBEUmVnc04gcmVzb3VyY2UgZm9yIHRoZSB3aG9sZSBkdXJhdGlvbiAoaW5jbHVkaW5nIHRpbWUgdG8KKyAgLy8gICAgcmVnaXN0ZXIgZmlsZSB3cml0ZWJhY2shKS4KKyAgLy8gRXZlcnkgTkVPTiBpbnN0cnVjdGlvbiBkb2VzIHRoZSBzYW1lIGJ1dCB3aXRoIEZVcyBzd2FwcGVkLgorICAvLworICAvLyBTaW5jZSB0aGUgcmVzZXJ2ZWQgRlUgY2Fubm90IGJlIGFjcXVpcmVkLCB0aGlzIG1vZGVscyBwcmVjaXNlbHkKKyAgLy8gImNyb3NzLWRvbWFpbiIgc3RhbGxzLgorCisgIC8vIFZGUAorICAvLyBJc3N1ZSB0aHJvdWdoIGludGVnZXIgcGlwZWxpbmUsIGFuZCBleGVjdXRlIGluIE5FT04gdW5pdC4KKworICAvLyBGUCBTcGVjaWFsIFJlZ2lzdGVyIHRvIEludGVnZXIgUmVnaXN0ZXIgRmlsZSBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwU1RBVCAsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X0RSZWdzTl0sICAgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBVbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19mcFVOQTMyICwgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzVkZQXSwgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgMiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDMsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbMSwgMV0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIFVuYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwVU5BNjQgLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyAyIGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0E5X0RSZWdzTl0sICAgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFsxLCAxXT4sCisKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBDb21wYXJlCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ01QMzIgLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA0IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NSwgW0E5X0RSZWdzTl0sICAgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFsxLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgQ29tcGFyZQorICBJbnN0ckl0aW5EYXRhPElJQ19mcENNUDY0ICwgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzVkZQXSwgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNCBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDUsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbMSwgMV0+LAorICAvLworICAvLyBTaW5nbGUgdG8gRG91YmxlIEZQIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlRTRCAsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDUsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMV0+LAorICAvLworICAvLyBEb3VibGUgdG8gU2luZ2xlIEZQIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlREUyAsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDUsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMV0+LAorCisgIC8vCisgIC8vIFNpbmdsZSB0byBIYWxmIEZQIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlRTSCAsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDUsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMV0+LAorICAvLworICAvLyBIYWxmIHRvIFNpbmdsZSBGUCBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZUSFMgLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwzLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzIsIDFdPiwKKworICAvLworICAvLyBTaW5nbGUtUHJlY2lzaW9uIEZQIHRvIEludGVnZXIgQ29udmVydAorICBJbnN0ckl0aW5EYXRhPElJQ19mcENWVFNJICwgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzVkZQXSwgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NSwgW0E5X0RSZWdzTl0sICAgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFs0LCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1QcmVjaXNpb24gRlAgdG8gSW50ZWdlciBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZUREkgLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw1LCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzQsIDFdPiwKKyAgLy8KKyAgLy8gSW50ZWdlciB0byBTaW5nbGUtUHJlY2lzaW9uIEZQIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlRJUyAsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDUsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMV0+LAorICAvLworICAvLyBJbnRlZ2VyIHRvIERvdWJsZS1QcmVjaXNpb24gRlAgQ29udmVydAorICBJbnN0ckl0aW5EYXRhPElJQ19mcENWVElEICwgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzVkZQXSwgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NSwgW0E5X0RSZWdzTl0sICAgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFs0LCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gRlAgQUxVCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQUxVMzIgLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw1LCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzQsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBBTFUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBBTFU2NCAsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDUsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMSwgMV0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIE11bHRpcGx5CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTVVMMzIgLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw2LCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzUsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBNdWx0aXBseQorICBJbnN0ckl0aW5EYXRhPElJQ19mcE1VTDY0ICwgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzVkZQXSwgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzTl0sICAgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTlBpcGVdPl0sIFs2LCAxLCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gRlAgTUFDCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTUFDMzIgLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw5LCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzgsIDAsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBNQUMKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBNQUM2NCAsIFtJbnN0clN0YWdlPDEsICBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxMCwgW0E5X0RSZWdzTl0sICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCAgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCAgW0E5X05QaXBlXT5dLCBbOSwgMCwgMSwgMV0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIERJVgorICBJbnN0ckl0aW5EYXRhPElJQ19mcERJVjMyICwgW0luc3RyU3RhZ2U8MSwgIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDE2LCBbQTlfRFJlZ3NOXSwgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsICBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEwLCBbQTlfTlBpcGVdPl0sIFsxNSwgMSwgMV0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIERJVgorICBJbnN0ckl0aW5EYXRhPElJQ19mcERJVjY0ICwgW0luc3RyU3RhZ2U8MSwgIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDI2LCBbQTlfRFJlZ3NOXSwgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsICBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIwLCBbQTlfTlBpcGVdPl0sIFsyNSwgMSwgMV0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIFNRUlQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBTUVJUMzIsIFtJbnN0clN0YWdlPDEsICBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxOCwgW0E5X0RSZWdzTl0sICAgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MTMsIFtBOV9OUGlwZV0+XSwgWzE3LCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgU1FSVAorICBJbnN0ckl0aW5EYXRhPElJQ19mcFNRUlQ2NCwgW0luc3RyU3RhZ2U8MSwgIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDMzLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCAgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyOCwgW0E5X05QaXBlXT5dLCBbMzIsIDFdPiwKKworICAvLworICAvLyBJbnRlZ2VyIHRvIFNpbmdsZS1wcmVjaXNpb24gTW92ZQorICBJbnN0ckl0aW5EYXRhPElJQ19mcE1PVklTLCAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzVkZQXSwgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIDEgbGF0ZW5jeSBjeWNsZSBzaW5jZSB3YmNrIGlzIDIgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwzLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzEsIDFdPiwKKyAgLy8KKyAgLy8gSW50ZWdlciB0byBEb3VibGUtcHJlY2lzaW9uIE1vdmUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBNT1ZJRCwgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSAxIGxhdGVuY3kgY3ljbGUgc2luY2Ugd2JjayBpcyAyIGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0E5X0RSZWdzTl0sICAgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFsxLCAxLCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gdG8gSW50ZWdlciBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTU9WU0ksICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiB0byBJbnRlZ2VyIE1vdmUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBNT1ZESSwgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbMSwgMSwgMV0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIExvYWQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBMb2FkMzIsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X0xTUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBMb2FkCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTG9hZDY0LCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9MU1BpcGVdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XT4sCisgIC8vCisgIC8vIEZQIExvYWQgTXVsdGlwbGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBMb2FkbSwgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9EUmVnc05dLCAgIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X0xTUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBTdG9yZQorICBJbnN0ckl0aW5EYXRhPElJQ19mcFN0b3JlMzIsW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzVkZQXSwgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X0RSZWdzTl0sICAgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTFNQaXBlXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIFN0b3JlCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwU3RvcmU2NCxbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9MU1BpcGVdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XT4sCisgIC8vCisgIC8vIEZQIFN0b3JlIE11bHRpcGxlCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwU3RvcmVtLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9MU1BpcGVdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XT4sCisgIC8vIE5FT04KKyAgLy8gSXNzdWUgdGhyb3VnaCBpbnRlZ2VyIHBpcGVsaW5lLCBhbmQgZXhlY3V0ZSBpbiBORU9OIHVuaXQuCisgIC8vIEZJWE1FOiBOZW9uIHBpcGVsaW5lIGFuZCBMZFN0IHVuaXQgYXJlIG11bHRpcGxleGVkLgorICAvLyAgICAgICAgQWRkIHNvbWUgc3ludGFjdGljIHN1Z2FyIHRvIG1vZGVsIHRoaXMhCisgIC8vIFZMRDEKKyAgLy8gRklYTUU6IFdlIGRvbid0IG1vZGVsIHRoaXMgaW5zdHJ1Y3Rpb24gcHJvcGVybHkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkxEMSwgICAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X0xTUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dPiwKKyAgLy8KKyAgLy8gVkxEMgorICAvLyBGSVhNRTogV2UgZG9uJ3QgbW9kZWwgdGhpcyBpbnN0cnVjdGlvbiBwcm9wZXJseQorICBJbnN0ckl0aW5EYXRhPElJQ19WTEQyLCAgICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X0xTUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbMiwgMiwgMV0+LAorICAvLworICAvLyBWTEQzCisgIC8vIEZJWE1FOiBXZSBkb24ndCBtb2RlbCB0aGlzIGluc3RydWN0aW9uIHByb3Blcmx5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZMRDMsICAgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTFNQaXBlXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFsyLCAyLCAyLCAxXT4sCisgIC8vCisgIC8vIFZMRDQKKyAgLy8gRklYTUU6IFdlIGRvbid0IG1vZGVsIHRoaXMgaW5zdHJ1Y3Rpb24gcHJvcGVybHkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkxENCwgICAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDYgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw3LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9MU1BpcGVdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzIsIDIsIDIsIDIsIDFdPiwKKyAgLy8KKyAgLy8gVlNUCisgIC8vIEZJWE1FOiBXZSBkb24ndCBtb2RlbCB0aGlzIGluc3RydWN0aW9uIHByb3Blcmx5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZTVCwgICAgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTFNQaXBlXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBVbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19WVU5BaUQsICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgVW5hcnkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlVOQWlRLCAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDYgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw3LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzQsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgUS1VbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19WUVVOQWlELCAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgQ291bnRRLVVuYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZRVU5BaVEsICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFs0LCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIEJpbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19WQklOaUQsICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbMywgMiwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgQmluYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZCSU5pUSwgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFszLCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIFN1YnRyYWN0CisgIEluc3RySXRpbkRhdGE8SUlDX1ZTVUJpRCwgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFszLCAyLCAxXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBTdWJ0cmFjdAorICBJbnN0ckl0aW5EYXRhPElJQ19WU1VCaVEsICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbMywgMiwgMV0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBTaGlmdAorICBJbnN0ckl0aW5EYXRhPElJQ19WU0hMaUQsICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbMywgMSwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgU2hpZnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlNITGlRLCAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDYgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw3LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgU2hpZnQgKDQgY3ljbGUpCisgIEluc3RySXRpbkRhdGE8SUlDX1ZTSExpNEQsICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFs0LCAxLCAxXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBTaGlmdCAoNCBjeWNsZSkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlNITGk0USwgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDYgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw3LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzQsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgQmluYXJ5ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WQklOaTRELCAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMiwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgQmluYXJ5ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WQklOaTRRLCAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMiwgMl0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBTdWJ0cmFjdCAoNCBjeWNsZSkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlNVQmlELCAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDYgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw3LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzQsIDIsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIFN1YnRyYWN0ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WU1VCaVEsICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbNCwgMiwgMV0+LAorCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIENvdW50CisgIEluc3RySXRpbkRhdGE8SUlDX1ZDTlRpRCwgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFszLCAyLCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBDb3VudAorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBOMywgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDQgZm9yIHRob3NlIGNhc2VzCisgIEluc3RySXRpbkRhdGE8SUlDX1ZDTlRpUSwgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA3IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8OCwgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTlBpcGVdPl0sIFs0LCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBBYnNvbHV0ZSBEaWZmZXJlbmNlIGFuZCBBY2N1bXVsYXRlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZBQkFELCAgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFs2LCAzLCAyLCAxXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgQWJzb2x1dGUgRGlmZmVyZW5jZSBhbmQgQWNjdW11bGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19WQUJBUSwgICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X05QaXBlXT5dLCBbNiwgMywgMiwgMV0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBQYWlyIEFkZCBMb25nCisgIEluc3RySXRpbkRhdGE8SUlDX1ZQQUxpRCwgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFs2LCAzLCAxXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBQYWlyIEFkZCBMb25nCisgIEluc3RySXRpbkRhdGE8SUlDX1ZQQUxpUSwgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTlBpcGVdPl0sIFs2LCAzLCAxXT4sCisKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHkgKC44LCAuMTYpCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNVUxpMTZELCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFs2LCAyLCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBNdWx0aXBseSAoLjgsIC4xNikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1VTGkxNlEsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDcgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw4LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9OUGlwZV0+XSwgWzcsIDIsIDJdPiwKKworICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBNdWx0aXBseSAoLjMyKQorICBJbnN0ckl0aW5EYXRhPElJQ19WTVVMaTMyRCwgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNyBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDgsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X05QaXBlXT5dLCBbNywgMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHkgKC4zMikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1VTGkzMlEsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDkgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxMCwgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw0LCBbQTlfTlBpcGVdPl0sIFs5LCAyLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIE11bHRpcGx5LUFjY3VtdWxhdGUgKC44LCAuMTYpCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNQUNpMTZELCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFs2LCAzLCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIE11bHRpcGx5LUFjY3VtdWxhdGUgKC4zMikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1BQ2kzMkQsIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDcgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw4LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9OUGlwZV0+XSwgWzcsIDMsIDIsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIE11bHRpcGx5LUFjY3VtdWxhdGUgKC44LCAuMTYpCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNQUNpMTZRLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA3IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8OCwgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTlBpcGVdPl0sIFs3LCAzLCAyLCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBNdWx0aXBseS1BY2N1bXVsYXRlICguMzIpCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNQUNpMzJRLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA5IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MTAsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NCwgW0E5X05QaXBlXT5dLCBbOSwgMywgMiwgMV0+LAorICAvLworICAvLyBNb3ZlIEltbWVkaWF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19WTU9WSW1tLCAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNiBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X05QaXBlXT5dLCBbM10+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgUGVybXV0ZSBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZELCAgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgIC8vIEZJWE1FOiBhbGwgbGF0ZW5jaWVzIGFyZSBhcmJpdHJhcnksIG5vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTFNQaXBlXT5dLCBbMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIFBlcm11dGUgTW92ZQorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBOMiwgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDMgZm9yIHRob3NlIGNhc2VzCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZRLCAgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgIC8vIEZJWE1FOiBhbGwgbGF0ZW5jaWVzIGFyZSBhcmJpdHJhcnksIG5vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NCwgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTlBpcGVdPl0sIFszLCAxXT4sCisgIC8vCisgIC8vIEludGVnZXIgdG8gU2luZ2xlLXByZWNpc2lvbiBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZJUyAsICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgIC8vIEZJWE1FOiBhbGwgbGF0ZW5jaWVzIGFyZSBhcmJpdHJhcnksIG5vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFsyLCAxXT4sCisgIC8vCisgIC8vIEludGVnZXIgdG8gRG91YmxlLXByZWNpc2lvbiBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZJRCAsICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgIC8vIEZJWE1FOiBhbGwgbGF0ZW5jaWVzIGFyZSBhcmJpdHJhcnksIG5vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFsyLCAxLCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gdG8gSW50ZWdlciBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZTSSAsICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgIC8vIEZJWE1FOiBhbGwgbGF0ZW5jaWVzIGFyZSBhcmJpdHJhcnksIG5vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFsyLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gdG8gSW50ZWdlciBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZESSAsICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgIC8vIEZJWE1FOiBhbGwgbGF0ZW5jaWVzIGFyZSBhcmJpdHJhcnksIG5vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFsyLCAyLCAxXT4sCisgIC8vCisgIC8vIEludGVnZXIgdG8gTGFuZSBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZJU0wgLCBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgIC8vIEZJWE1FOiBhbGwgbGF0ZW5jaWVzIGFyZSBhcmJpdHJhcnksIG5vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NCwgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTlBpcGVdPl0sIFszLCAxLCAxXT4sCisKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEZQIFVuYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZVTkFELCAgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA2IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFs1LCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgRlAgVW5hcnkKKyAgLy8gUmVzdWx0IHdyaXR0ZW4gaW4gTjUsIGJ1dCB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSBsYXN0IGN5Y2xlIG9mIG11bHRpY3ljbGUsCisgIC8vIHNvIHdlIHVzZSA2IGZvciB0aG9zZSBjYXNlcworICBJbnN0ckl0aW5EYXRhPElJQ19WVU5BUSwgICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNyBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDgsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X05QaXBlXT5dLCBbNiwgMl0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgRlAgQmluYXJ5CisgIC8vIEZJWE1FOiBXZSdyZSB1c2luZyB0aGlzIGl0aW4gZm9yIG1hbnkgaW5zdHJ1Y3Rpb25zIGFuZCBbMiwgMl0gaGVyZSBpcyB0b28KKyAgLy8gb3B0aW1pc3RpYy4KKyAgSW5zdHJJdGluRGF0YTxJSUNfVkJJTkQsICAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDcgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw3LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzUsIDIsIDJdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBGUCBCaW5hcnkKKyAgLy8gUmVzdWx0IHdyaXR0ZW4gaW4gTjUsIGJ1dCB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSBsYXN0IGN5Y2xlIG9mIG11bHRpY3ljbGUsCisgIC8vIHNvIHdlIHVzZSA2IGZvciB0aG9zZSBjYXNlcworICAvLyBGSVhNRTogV2UncmUgdXNpbmcgdGhpcyBpdGluIGZvciBtYW55IGluc3RydWN0aW9ucyBhbmQgWzIsIDJdIGhlcmUgaXMgdG9vCisgIC8vIG9wdGltaXN0aWMuCisgIEluc3RySXRpbkRhdGE8SUlDX1ZCSU5RLCAgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA4IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8OCwgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTlBpcGVdPl0sIFs2LCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBGUCBNdWx0aXBsZS1BY2N1bXVsYXRlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNQUNELCAgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA3IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8OCwgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTlBpcGVdPl0sIFs2LCAzLCAyLCAxXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgRlAgTXVsdGlwbGUtQWNjdW11bGF0ZQorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBOOSwgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDEwIGZvciB0aG9zZSBjYXNlcworICBJbnN0ckl0aW5EYXRhPElJQ19WTUFDUSwgICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgOSBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEwLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDQsIFtBOV9OUGlwZV0+XSwgWzgsIDQsIDIsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIFJlY2lwcmljYWwgU3RlcAorICBJbnN0ckl0aW5EYXRhPElJQ19WUkVDU0QsICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNyBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDgsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X05QaXBlXT5dLCBbNiwgMiwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIFJlY2lwcmljYWwgU3RlcAorICBJbnN0ckl0aW5EYXRhPElJQ19WUkVDU1EsICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgOSBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEwLCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDQsIFtBOV9OUGlwZV0+XSwgWzgsIDIsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIFBlcm11dGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlBFUk1ELCAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDYgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw3LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9OUGlwZV0+XSwgWzIsIDIsIDEsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBQZXJtdXRlCisgIC8vIFJlc3VsdCB3cml0dGVuIGluIE4yLCBidXQgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgbGFzdCBjeWNsZSBvZiBtdWx0aWN5Y2xlLAorICAvLyBzbyB3ZSB1c2UgMyBmb3IgdGhvc2UgY2FzZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlBFUk1RLCAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDcgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw4LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9OUGlwZV0+XSwgWzMsIDMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBQZXJtdXRlICgzIGN5Y2xlIGlzc3VlKQorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBOMiwgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDQgZm9yIHRob3NlIGNhc2VzCisgIEluc3RySXRpbkRhdGE8SUlDX1ZQRVJNUTMsICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA4IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8OSwgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwzLCBbQTlfTFNQaXBlXT5dLCBbNCwgNCwgMSwgMV0+LAorCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBWRVhUCisgIEluc3RySXRpbkRhdGE8SUlDX1ZFWFRELCAgICBbSW5zdHJTdGFnZTwxLCBbQTlfRFJlZ3NOXSwgICAwLCBSZXF1aXJlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgbGF0ZW5jeSBjeWNsZXMgc2luY2Ugd2JjayBpcyA3IGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NywgW0E5X0RSZWdzVkZQXSwgMCwgUmVzZXJ2ZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfTlBpcGVdPl0sIFsyLCAxLCAxXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgVkVYVAorICBJbnN0ckl0aW5EYXRhPElJQ19WRVhUUSwgICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgOSBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDgsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X05QaXBlXT5dLCBbMywgMSwgMV0+LAorICAvLworICAvLyBWVEIKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCMSwgICAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDcgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw4LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9OUGlwZV0+XSwgWzMsIDIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCMiwgICAgIFtJbnN0clN0YWdlPDIsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDcgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw4LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtBOV9OUGlwZV0+XSwgWzMsIDIsIDIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCMywgICAgIFtJbnN0clN0YWdlPDIsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDggY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw5LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDMsIFtBOV9OUGlwZV0+XSwgWzQsIDIsIDIsIDMsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCNCwgICAgIFtJbnN0clN0YWdlPDEsIFtBOV9EUmVnc05dLCAgIDAsIFJlcXVpcmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYSBsYXRlbmN5IGN5Y2xlcyBzaW5jZSB3YmNrIGlzIDggY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw5LCBbQTlfRFJlZ3NWRlBdLCAwLCBSZXNlcnZlZD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDMsIFtBOV9OUGlwZV0+XSwgWzQsIDIsIDIsIDMsIDMsIDFdPiwKKyAgLy8KKyAgLy8gVlRCWAorICBJbnN0ckl0aW5EYXRhPElJQ19WVEJYMSwgICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNyBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDgsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X05QaXBlXT5dLCBbMywgMSwgMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19WVEJYMiwgICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgNyBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDgsIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0E5X05QaXBlXT5dLCBbMywgMSwgMiwgMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19WVEJYMywgICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgOCBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDksIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0E5X05QaXBlXT5dLCBbNCwgMSwgMiwgMiwgMywgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19WVEJYNCwgICAgW0luc3RyU3RhZ2U8MSwgW0E5X0RSZWdzTl0sICAgMCwgUmVxdWlyZWQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGxhdGVuY3kgY3ljbGVzIHNpbmNlIHdiY2sgaXMgOCBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDksIFtBOV9EUmVnc1ZGUF0sIDAsIFJlc2VydmVkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbQTlfTlBpcGVdPl0sIFs0LCAxLCAyLCAyLCAzLCAzLCAxXT4KK10+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNU2NoZWR1bGVWNi50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNjaGVkdWxlVjYudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiNTYwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNjaGVkdWxlVjYudGQKQEAgLTAsMCArMSwyMDQgQEAKKy8vPT09LSBBUk1TY2hlZHVsZVY2LnRkIC0gQVJNIHY2IFNjaGVkdWxpbmcgRGVmaW5pdGlvbnMgLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaXRpbmVyYXJ5IGNsYXNzIGRhdGEgZm9yIHRoZSBBUk0gdjYgcHJvY2Vzc29ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBNb2RlbCBiYXNlZCBvbiBBUk0xMTc2CisvLworLy8gRnVuY3Rpb25hbCBVbml0cworZGVmIFY2X1BpcGUgOiBGdW5jVW5pdDsgLy8gcGlwZWxpbmUKKworLy8gU2NoZWR1bGluZyBpbmZvcm1hdGlvbiBkZXJpdmVkIGZyb20gIkFSTTExNzZKWkYtUyBUZWNobmljYWwgUmVmZXJlbmNlIE1hbnVhbCIKKy8vCitkZWYgQVJNVjZJdGluZXJhcmllcyA6IFByb2Nlc3Nvckl0aW5lcmFyaWVzPAorICBbVjZfUGlwZV0sIFsKKyAgLy8KKyAgLy8gTm8gb3BlcmFuZCBjeWNsZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUFMVXggICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XT4sCisgIC8vCisgIC8vIEJpbmFyeSBJbnN0cnVjdGlvbnMgdGhhdCBwcm9kdWNlIGEgcmVzdWx0CisgIEluc3RySXRpbkRhdGE8SUlDX2lBTFVpICAgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFsyLCAyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lBTFVyICAgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFsyLCAyLCAyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lBTFVzaSAgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFsyLCAyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lBTFVzciAgICwgW0luc3RyU3RhZ2U8MiwgW1Y2X1BpcGVdPl0sIFszLCAzLCAyLCAxXT4sCisgIC8vCisgIC8vIFVuYXJ5IEluc3RydWN0aW9ucyB0aGF0IHByb2R1Y2UgYSByZXN1bHQKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVVOQXIgICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVVOQXNpICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVVOQXNyICAgLCBbSW5zdHJTdGFnZTwyLCBbVjZfUGlwZV0+XSwgWzMsIDIsIDFdPiwKKyAgLy8KKyAgLy8gQ29tcGFyZSBpbnN0cnVjdGlvbnMKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNUGkgICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNUHIgICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNUHNpICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNUHNyICAgLCBbSW5zdHJTdGFnZTwyLCBbVjZfUGlwZV0+XSwgWzMsIDIsIDFdPiwKKyAgLy8KKyAgLy8gTW92ZSBpbnN0cnVjdGlvbnMsIHVuY29uZGl0aW9uYWwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1PVmkgICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1PVnIgICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1PVnNpICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1PVnNyICAgLCBbSW5zdHJTdGFnZTwyLCBbVjZfUGlwZV0+XSwgWzMsIDIsIDFdPiwKKyAgLy8KKyAgLy8gTW92ZSBpbnN0cnVjdGlvbnMsIGNvbmRpdGlvbmFsCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9WaSAgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFszXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9WciAgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFszLCAyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9Wc2kgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFszLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9Wc3IgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFs0LCAyLCAxXT4sCisKKyAgLy8gSW50ZWdlciBtdWx0aXBseSBwaXBlbGluZQorICAvLworICBJbnN0ckl0aW5EYXRhPElJQ19pTVVMMTYgICAsIFtJbnN0clN0YWdlPDEsIFtWNl9QaXBlXT5dLCBbNCwgMSwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTUFDMTYgICAsIFtJbnN0clN0YWdlPDEsIFtWNl9QaXBlXT5dLCBbNCwgMSwgMSwgMl0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTVVMMzIgICAsIFtJbnN0clN0YWdlPDIsIFtWNl9QaXBlXT5dLCBbNSwgMSwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTUFDMzIgICAsIFtJbnN0clN0YWdlPDIsIFtWNl9QaXBlXT5dLCBbNSwgMSwgMSwgMl0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTVVMNjQgICAsIFtJbnN0clN0YWdlPDMsIFtWNl9QaXBlXT5dLCBbNiwgMSwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTUFDNjQgICAsIFtJbnN0clN0YWdlPDMsIFtWNl9QaXBlXT5dLCBbNiwgMSwgMSwgMl0+LAorICAKKyAgLy8gSW50ZWdlciBsb2FkIHBpcGVsaW5lCisgIC8vCisgIC8vIEltbWVkaWF0ZSBvZmZzZXQKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUxvYWRpICAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzQsIDFdPiwKKyAgLy8KKyAgLy8gUmVnaXN0ZXIgb2Zmc2V0CisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2FkciAgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFs0LCAxLCAxXT4sCisgIC8vCisgIC8vIFNjYWxlZCByZWdpc3RlciBvZmZzZXQsIGlzc3VlcyBvdmVyIDIgY3ljbGVzCisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2Fkc2kgICwgW0luc3RyU3RhZ2U8MiwgW1Y2X1BpcGVdPl0sIFs1LCAyLCAxXT4sCisgIC8vCisgIC8vIEltbWVkaWF0ZSBvZmZzZXQgd2l0aCB1cGRhdGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUxvYWRpdSAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzQsIDIsIDFdPiwKKyAgLy8KKyAgLy8gUmVnaXN0ZXIgb2Zmc2V0IHdpdGggdXBkYXRlCisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2FkcnUgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFs0LCAyLCAxLCAxXT4sCisgIC8vCisgIC8vIFNjYWxlZCByZWdpc3RlciBvZmZzZXQgd2l0aCB1cGRhdGUsIGlzc3VlcyBvdmVyIDIgY3ljbGVzCisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2Fkc2l1ICwgW0luc3RyU3RhZ2U8MiwgW1Y2X1BpcGVdPl0sIFs1LCAyLCAyLCAxXT4sCisKKyAgLy8KKyAgLy8gTG9hZCBtdWx0aXBsZQorICBJbnN0ckl0aW5EYXRhPElJQ19pTG9hZG0gICAsIFtJbnN0clN0YWdlPDMsIFtWNl9QaXBlXT5dPiwKKworICAvLyBJbnRlZ2VyIHN0b3JlIHBpcGVsaW5lCisgIC8vCisgIC8vIEltbWVkaWF0ZSBvZmZzZXQKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVN0b3JlaSAgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDFdPiwKKyAgLy8KKyAgLy8gUmVnaXN0ZXIgb2Zmc2V0CisgIEluc3RySXRpbkRhdGE8SUlDX2lTdG9yZXIgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFsyLCAxLCAxXT4sCisKKyAgLy8KKyAgLy8gU2NhbGVkIHJlZ2lzdGVyIG9mZnNldCwgaXNzdWVzIG92ZXIgMiBjeWNsZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVN0b3Jlc2kgLCBbSW5zdHJTdGFnZTwyLCBbVjZfUGlwZV0+XSwgWzIsIDIsIDFdPiwKKyAgLy8KKyAgLy8gSW1tZWRpYXRlIG9mZnNldCB3aXRoIHVwZGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19pU3RvcmVpdSAsIFtJbnN0clN0YWdlPDEsIFtWNl9QaXBlXT5dLCBbMiwgMiwgMV0+LAorICAvLworICAvLyBSZWdpc3RlciBvZmZzZXQgd2l0aCB1cGRhdGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVN0b3JlcnUgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDIsIDEsIDFdPiwKKyAgLy8KKyAgLy8gU2NhbGVkIHJlZ2lzdGVyIG9mZnNldCB3aXRoIHVwZGF0ZSwgaXNzdWVzIG92ZXIgMiBjeWNsZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVN0b3Jlc2l1LCBbSW5zdHJTdGFnZTwyLCBbVjZfUGlwZV0+XSwgWzIsIDIsIDIsIDFdPiwKKyAgLy8KKyAgLy8gU3RvcmUgbXVsdGlwbGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVN0b3JlbSAgICwgW0luc3RyU3RhZ2U8MywgW1Y2X1BpcGVdPl0+LAorICAKKyAgLy8gQnJhbmNoCisgIC8vCisgIC8vIG5vIGRlbGF5IHNsb3RzLCBzbyB0aGUgbGF0ZW5jeSBvZiBhIGJyYW5jaCBpcyB1bmltcG9ydGFudAorICBJbnN0ckl0aW5EYXRhPElJQ19CciAgICAgICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0+LAorCisgIC8vIFZGUAorICAvLyBJc3N1ZSB0aHJvdWdoIGludGVnZXIgcGlwZWxpbmUsIGFuZCBleGVjdXRlIGluIE5FT04gdW5pdC4gV2UgYXNzdW1lCisgIC8vIFJ1bkZhc3QgbW9kZSBzbyB0aGF0IE5GUCBwaXBlbGluZSBpcyB1c2VkIGZvciBzaW5nbGUtcHJlY2lzaW9uIHdoZW4KKyAgLy8gcG9zc2libGUuCisgIC8vCisgIC8vIEZQIFNwZWNpYWwgUmVnaXN0ZXIgdG8gSW50ZWdlciBSZWdpc3RlciBGaWxlIE1vdmUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBTVEFUICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFszXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gRlAgVW5hcnkKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBVTkEzMiAsIFtJbnN0clN0YWdlPDEsIFtWNl9QaXBlXT5dLCBbNSwgMl0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIFVuYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwVU5BNjQgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzUsIDJdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBDb21wYXJlCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ01QMzIgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBDb21wYXJlCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ01QNjQgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDJdPiwKKyAgLy8KKyAgLy8gU2luZ2xlIHRvIERvdWJsZSBGUCBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZUU0QgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzUsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlIHRvIFNpbmdsZSBGUCBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZURFMgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzUsIDJdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLVByZWNpc2lvbiBGUCB0byBJbnRlZ2VyIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlRTSSAsIFtJbnN0clN0YWdlPDEsIFtWNl9QaXBlXT5dLCBbOSwgMl0+LAorICAvLworICAvLyBEb3VibGUtUHJlY2lzaW9uIEZQIHRvIEludGVnZXIgQ29udmVydAorICBJbnN0ckl0aW5EYXRhPElJQ19mcENWVERJICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFs5LCAyXT4sCisgIC8vCisgIC8vIEludGVnZXIgdG8gU2luZ2xlLVByZWNpc2lvbiBGUCBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZUSVMgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzksIDJdPiwKKyAgLy8KKyAgLy8gSW50ZWdlciB0byBEb3VibGUtUHJlY2lzaW9uIEZQIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlRJRCAsIFtJbnN0clN0YWdlPDEsIFtWNl9QaXBlXT5dLCBbOSwgMl0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIEFMVQorICBJbnN0ckl0aW5EYXRhPElJQ19mcEFMVTMyICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFs5LCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgQUxVCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQUxVNjQgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzksIDIsIDJdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBNdWx0aXBseQorICBJbnN0ckl0aW5EYXRhPElJQ19mcE1VTDMyICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFs5LCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgTXVsdGlwbHkKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBNVUw2NCAsIFtJbnN0clN0YWdlPDIsIFtWNl9QaXBlXT5dLCBbOSwgMiwgMl0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIE1BQworICBJbnN0ckl0aW5EYXRhPElJQ19mcE1BQzMyICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFs5LCAyLCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgTUFDCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTUFDNjQgLCBbSW5zdHJTdGFnZTwyLCBbVjZfUGlwZV0+XSwgWzksIDIsIDIsIDJdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBESVYKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBESVYzMiAsIFtJbnN0clN0YWdlPDE1LCBbVjZfUGlwZV0+XSwgWzIwLCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgRElWCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwRElWNjQgLCBbSW5zdHJTdGFnZTwyOSwgW1Y2X1BpcGVdPl0sIFszNCwgMiwgMl0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIFNRUlQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBTUVJUMzIgLCBbSW5zdHJTdGFnZTwxNSwgW1Y2X1BpcGVdPl0sIFsyMCwgMiwgMl0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIFNRUlQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBTUVJUNjQgLCBbSW5zdHJTdGFnZTwyOSwgW1Y2X1BpcGVdPl0sIFszNCwgMiwgMl0+LAorICAvLworICAvLyBTaW5nbGUtcHJlY2lzaW9uIEZQIExvYWQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBMb2FkMzIgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzUsIDIsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBMb2FkCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTG9hZDY0ICwgW0luc3RyU3RhZ2U8MSwgW1Y2X1BpcGVdPl0sIFs1LCAyLCAyXT4sCisgIC8vCisgIC8vIEZQIExvYWQgTXVsdGlwbGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBMb2FkbSAsIFtJbnN0clN0YWdlPDMsIFtWNl9QaXBlXT5dPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBTdG9yZQorICBJbnN0ckl0aW5EYXRhPElJQ19mcFN0b3JlMzIgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDIsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBTdG9yZQorICAvLyB1c2UgRlVfSXNzdWUgdG8gZW5mb3JjZSB0aGUgMSBsb2FkL3N0b3JlIHBlciBjeWNsZSBsaW1pdAorICBJbnN0ckl0aW5EYXRhPElJQ19mcFN0b3JlNjQgLCBbSW5zdHJTdGFnZTwxLCBbVjZfUGlwZV0+XSwgWzIsIDIsIDJdPiwKKyAgLy8KKyAgLy8gRlAgU3RvcmUgTXVsdGlwbGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBTdG9yZW0gLCBbSW5zdHJTdGFnZTwzLCBbVjZfUGlwZV0+XT4KK10+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNU2NoZWR1bGVWNy50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNjaGVkdWxlVjcudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiZjQxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNjaGVkdWxlVjcudGQKQEAgLTAsMCArMSw1ODcgQEAKKy8vPT09LSBBUk1TY2hlZHVsZVY3LnRkIC0gQVJNIHY3IFNjaGVkdWxpbmcgRGVmaW5pdGlvbnMgLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaXRpbmVyYXJ5IGNsYXNzIGRhdGEgZm9yIHRoZSBBUk0gdjcgcHJvY2Vzc29ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLworLy8gU2NoZWR1bGluZyBpbmZvcm1hdGlvbiBkZXJpdmVkIGZyb20gIkNvcnRleC1BOCBUZWNobmljYWwgUmVmZXJlbmNlIE1hbnVhbCIuCisvLworLy8gRHVhbCBpc3N1ZSBwaXBlbGluZSByZXByZXNlbnRlZCBieSBGVV9QaXBlMCB8IEZVX1BpcGUxCisvLworZGVmIENvcnRleEE4SXRpbmVyYXJpZXMgOiBQcm9jZXNzb3JJdGluZXJhcmllczxbCisKKyAgLy8gVHdvIGZ1bGx5LXBpcGVsaW5lZCBpbnRlZ2VyIEFMVSBwaXBlbGluZXMKKyAgLy8KKyAgLy8gTm8gb3BlcmFuZCBjeWNsZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUFMVXggICAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT5dPiwKKyAgLy8KKyAgLy8gQmluYXJ5IEluc3RydWN0aW9ucyB0aGF0IHByb2R1Y2UgYSByZXN1bHQKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUFMVWkgICAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT5dLCBbMiwgMl0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pQUxVciAgICAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPl0sIFsyLCAyLCAyXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lBTFVzaSAgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+XSwgWzIsIDIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUFMVXNyICAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT5dLCBbMiwgMiwgMSwgMV0+LAorICAvLworICAvLyBVbmFyeSBJbnN0cnVjdGlvbnMgdGhhdCBwcm9kdWNlIGEgcmVzdWx0CisgIEluc3RySXRpbkRhdGE8SUlDX2lVTkFyICAgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+XSwgWzIsIDJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVVOQXNpICAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT5dLCBbMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pVU5Bc3IgICAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPl0sIFsyLCAxLCAxXT4sCisgIC8vCisgIC8vIENvbXBhcmUgaW5zdHJ1Y3Rpb25zCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTVBpICAgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+XSwgWzJdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNUHIgICAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT5dLCBbMiwgMl0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pQ01Qc2kgICAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPl0sIFsyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTVBzciAgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+XSwgWzIsIDEsIDFdPiwKKyAgLy8KKyAgLy8gTW92ZSBpbnN0cnVjdGlvbnMsIHVuY29uZGl0aW9uYWwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1PVmkgICAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT5dLCBbMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTU9WciAgICAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPl0sIFsxLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lNT1ZzaSAgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+XSwgWzEsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1PVnNyICAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT5dLCBbMSwgMSwgMV0+LAorICAvLworICAvLyBNb3ZlIGluc3RydWN0aW9ucywgY29uZGl0aW9uYWwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNT1ZpICAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT5dLCBbMl0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pQ01PVnIgICAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPl0sIFsyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lDTU9Wc2kgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+XSwgWzIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUNNT1ZzciAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT5dLCBbMiwgMSwgMV0+LAorCisgIC8vIEludGVnZXIgbXVsdGlwbHkgcGlwZWxpbmUKKyAgLy8gUmVzdWx0IHdyaXR0ZW4gaW4gRTUsIGJ1dCB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSBsYXN0IGN5Y2xlIG9mIG11bHRpY3ljbGUsCisgIC8vIHNvIHdlIHVzZSA2IGZvciB0aG9zZSBjYXNlcworICAvLworICBJbnN0ckl0aW5EYXRhPElJQ19pTVVMMTYgICAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMF0+XSwgWzUsIDEsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1BQzE2ICAgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTFdLCAwPiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX1BpcGUwXT5dLCBbNiwgMSwgMSwgNF0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTVVMMzIgICAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMV0sIDA+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfUGlwZTBdPl0sIFs2LCAxLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX2lNQUMzMiAgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUxXSwgMD4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9QaXBlMF0+XSwgWzYsIDEsIDEsIDRdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfaU1VTDY0ICAgLCBbSW5zdHJTdGFnZTwyLCBbRlVfUGlwZTFdLCAwPiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MywgW0ZVX1BpcGUwXT5dLCBbNiwgNiwgMSwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19pTUFDNjQgICAsIFtJbnN0clN0YWdlPDIsIFtGVV9QaXBlMV0sIDA+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwzLCBbRlVfUGlwZTBdPl0sIFs2LCA2LCAxLCAxXT4sCisgIAorICAvLyBJbnRlZ2VyIGxvYWQgcGlwZWxpbmUKKyAgLy8KKyAgLy8gbG9hZHMgaGF2ZSBhbiBleHRyYSBjeWNsZSBvZiBsYXRlbmN5LCBidXQgYXJlIGZ1bGx5IHBpcGVsaW5lZAorICAvLyB1c2UgRlVfSXNzdWUgdG8gZW5mb3JjZSB0aGUgMSBsb2FkL3N0b3JlIHBlciBjeWNsZSBsaW1pdAorICAvLworICAvLyBJbW1lZGlhdGUgb2Zmc2V0CisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2FkaSAgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0+XSwgWzMsIDFdPiwKKyAgLy8KKyAgLy8gUmVnaXN0ZXIgb2Zmc2V0CisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2FkciAgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0+XSwgWzMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gU2NhbGVkIHJlZ2lzdGVyIG9mZnNldCwgaXNzdWVzIG92ZXIgMiBjeWNsZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUxvYWRzaSAgLCBbSW5zdHJTdGFnZTwyLCBbRlVfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXT5dLCBbNCwgMSwgMV0+LAorICAvLworICAvLyBJbW1lZGlhdGUgb2Zmc2V0IHdpdGggdXBkYXRlCisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2FkaXUgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0+XSwgWzMsIDIsIDFdPiwKKyAgLy8KKyAgLy8gUmVnaXN0ZXIgb2Zmc2V0IHdpdGggdXBkYXRlCisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2FkcnUgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0+XSwgWzMsIDIsIDEsIDFdPiwKKyAgLy8KKyAgLy8gU2NhbGVkIHJlZ2lzdGVyIG9mZnNldCB3aXRoIHVwZGF0ZSwgaXNzdWVzIG92ZXIgMiBjeWNsZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfaUxvYWRzaXUgLCBbSW5zdHJTdGFnZTwyLCBbRlVfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXT5dLCBbNCwgMywgMSwgMV0+LAorICAvLworICAvLyBMb2FkIG11bHRpcGxlCisgIEluc3RySXRpbkRhdGE8SUlDX2lMb2FkbSAgICwgW0luc3RyU3RhZ2U8MiwgW0ZVX0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX1BpcGUwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0+XT4sCisKKyAgLy8gSW50ZWdlciBzdG9yZSBwaXBlbGluZQorICAvLworICAvLyB1c2UgRlVfSXNzdWUgdG8gZW5mb3JjZSB0aGUgMSBsb2FkL3N0b3JlIHBlciBjeWNsZSBsaW1pdAorICAvLworICAvLyBJbW1lZGlhdGUgb2Zmc2V0CisgIEluc3RySXRpbkRhdGE8SUlDX2lTdG9yZWkgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0+XSwgWzMsIDFdPiwKKyAgLy8KKyAgLy8gUmVnaXN0ZXIgb2Zmc2V0CisgIEluc3RySXRpbkRhdGE8SUlDX2lTdG9yZXIgICwgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0+XSwgWzMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gU2NhbGVkIHJlZ2lzdGVyIG9mZnNldCwgaXNzdWVzIG92ZXIgMiBjeWNsZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVN0b3Jlc2kgLCBbSW5zdHJTdGFnZTwyLCBbRlVfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXT5dLCBbMywgMSwgMV0+LAorICAvLworICAvLyBJbW1lZGlhdGUgb2Zmc2V0IHdpdGggdXBkYXRlCisgIEluc3RySXRpbkRhdGE8SUlDX2lTdG9yZWl1ICwgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0+XSwgWzIsIDMsIDFdPiwKKyAgLy8KKyAgLy8gUmVnaXN0ZXIgb2Zmc2V0IHdpdGggdXBkYXRlCisgIEluc3RySXRpbkRhdGE8SUlDX2lTdG9yZXJ1ICAsIFtJbnN0clN0YWdlPDEsIFtGVV9Jc3N1ZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTGRTdDBdPl0sIFsyLCAzLCAxLCAxXT4sCisgIC8vCisgIC8vIFNjYWxlZCByZWdpc3RlciBvZmZzZXQgd2l0aCB1cGRhdGUsIGlzc3VlcyBvdmVyIDIgY3ljbGVzCisgIEluc3RySXRpbkRhdGE8SUlDX2lTdG9yZXNpdSwgW0luc3RyU3RhZ2U8MiwgW0ZVX0lzc3VlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0+XSwgWzMsIDMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gU3RvcmUgbXVsdGlwbGUKKyAgSW5zdHJJdGluRGF0YTxJSUNfaVN0b3JlbSAgLCBbSW5zdHJTdGFnZTwyLCBbRlVfSXNzdWVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfUGlwZTBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXT5dPiwKKyAgCisgIC8vIEJyYW5jaAorICAvLworICAvLyBubyBkZWxheSBzbG90cywgc28gdGhlIGxhdGVuY3kgb2YgYSBicmFuY2ggaXMgdW5pbXBvcnRhbnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfQnIgICAgICAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPl0+LAorCisgIC8vIFZGUAorICAvLyBJc3N1ZSB0aHJvdWdoIGludGVnZXIgcGlwZWxpbmUsIGFuZCBleGVjdXRlIGluIE5FT04gdW5pdC4gV2UgYXNzdW1lCisgIC8vIFJ1bkZhc3QgbW9kZSBzbyB0aGF0IE5GUCBwaXBlbGluZSBpcyB1c2VkIGZvciBzaW5nbGUtcHJlY2lzaW9uIHdoZW4KKyAgLy8gcG9zc2libGUuCisgIC8vCisgIC8vIEZQIFNwZWNpYWwgUmVnaXN0ZXIgdG8gSW50ZWdlciBSZWdpc3RlciBGaWxlIE1vdmUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBTVEFUICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gRlAgVW5hcnkKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBVTkEzMiAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzcsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBVbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19mcFVOQTY0ICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NCwgW0ZVX05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw0LCBbRlVfTkxTUGlwZV0+XSwgWzQsIDFdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBDb21wYXJlCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ01QMzIgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTlBpcGVdPl0sIFsxLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgQ29tcGFyZQorICBJbnN0ckl0aW5EYXRhPElJQ19mcENNUDY0ICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NCwgW0ZVX05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw0LCBbRlVfTkxTUGlwZV0+XSwgWzQsIDFdPiwKKyAgLy8KKyAgLy8gU2luZ2xlIHRvIERvdWJsZSBGUCBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZUU0QgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw3LCBbRlVfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDcsIFtGVV9OTFNQaXBlXT5dLCBbNywgMV0+LAorICAvLworICAvLyBEb3VibGUgdG8gU2luZ2xlIEZQIENvbnZlcnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBDVlREUyAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDUsIFtGVV9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8NSwgW0ZVX05MU1BpcGVdPl0sIFs1LCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1QcmVjaXNpb24gRlAgdG8gSW50ZWdlciBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZUU0kgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTlBpcGVdPl0sIFs3LCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1QcmVjaXNpb24gRlAgdG8gSW50ZWdlciBDb252ZXJ0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwQ1ZUREkgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw4LCBbRlVfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDgsIFtGVV9OTFNQaXBlXT5dLCBbOCwgMV0+LAorICAvLworICAvLyBJbnRlZ2VyIHRvIFNpbmdsZS1QcmVjaXNpb24gRlAgQ29udmVydAorICBJbnN0ckl0aW5EYXRhPElJQ19mcENWVElTICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXT5dLCBbNywgMV0+LAorICAvLworICAvLyBJbnRlZ2VyIHRvIERvdWJsZS1QcmVjaXNpb24gRlAgQ29udmVydAorICBJbnN0ckl0aW5EYXRhPElJQ19mcENWVElEICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8OCwgW0ZVX05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTw4LCBbRlVfTkxTUGlwZV0+XSwgWzgsIDFdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBBTFUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBBTFUzMiAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzcsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBBTFUKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBBTFU2NCAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDksIFtGVV9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8OSwgW0ZVX05MU1BpcGVdPl0sIFs5LCAxLCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gRlAgTXVsdGlwbHkKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBNVUwzMiAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzcsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBNdWx0aXBseQorICBJbnN0ckl0aW5EYXRhPElJQ19mcE1VTDY0ICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MTEsIFtGVV9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MTEsIFtGVV9OTFNQaXBlXT5dLCBbMTEsIDEsIDFdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBNQUMKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBNQUMzMiAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzcsIDIsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXByZWNpc2lvbiBGUCBNQUMKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBNQUM2NCAsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDE5LCBbRlVfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDE5LCBbRlVfTkxTUGlwZV0+XSwgWzE5LCAyLCAxLCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gRlAgRElWCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwRElWMzIgLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyMCwgW0ZVX05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyMCwgW0ZVX05MU1BpcGVdPl0sIFsyMCwgMSwgMV0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIERJVgorICBJbnN0ckl0aW5EYXRhPElJQ19mcERJVjY0ICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MjksIFtGVV9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MjksIFtGVV9OTFNQaXBlXT5dLCBbMjksIDEsIDFdPiwKKyAgLy8KKyAgLy8gU2luZ2xlLXByZWNpc2lvbiBGUCBTUVJUCisgIEluc3RySXRpbkRhdGE8SUlDX2ZwU1FSVDMyLCBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxOSwgW0ZVX05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxOSwgW0ZVX05MU1BpcGVdPl0sIFsxOSwgMV0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIFNRUlQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBTUVJUNjQsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDI5LCBbRlVfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDI5LCBbRlVfTkxTUGlwZV0+XSwgWzI5LCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gRlAgTG9hZAorICAvLyB1c2UgRlVfSXNzdWUgdG8gZW5mb3JjZSB0aGUgMSBsb2FkL3N0b3JlIHBlciBjeWNsZSBsaW1pdAorICBJbnN0ckl0aW5EYXRhPElJQ19mcExvYWQzMiwgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gRlAgTG9hZAorICAvLyB1c2UgRlVfSXNzdWUgdG8gZW5mb3JjZSB0aGUgMSBsb2FkL3N0b3JlIHBlciBjeWNsZSBsaW1pdAorICBJbnN0ckl0aW5EYXRhPElJQ19mcExvYWQ2NCwgW0luc3RyU3RhZ2U8MiwgW0ZVX0lzc3VlXSwgMD4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05MU1BpcGVdPl0+LAorICAvLworICAvLyBGUCBMb2FkIE11bHRpcGxlCisgIC8vIHVzZSBGVV9Jc3N1ZSB0byBlbmZvcmNlIHRoZSAxIGxvYWQvc3RvcmUgcGVyIGN5Y2xlIGxpbWl0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwTG9hZG0sICBbSW5zdHJTdGFnZTwzLCBbRlVfSXNzdWVdLCAwPiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfUGlwZTBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gRlAgU3RvcmUKKyAgLy8gdXNlIEZVX0lzc3VlIHRvIGVuZm9yY2UgdGhlIDEgbG9hZC9zdG9yZSBwZXIgY3ljbGUgbGltaXQKKyAgSW5zdHJJdGluRGF0YTxJSUNfZnBTdG9yZTMyLFtJbnN0clN0YWdlPDEsIFtGVV9Jc3N1ZV0sIDA+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05MU1BpcGVdPl0+LAorICAvLworICAvLyBEb3VibGUtcHJlY2lzaW9uIEZQIFN0b3JlCisgIC8vIHVzZSBGVV9Jc3N1ZSB0byBlbmZvcmNlIHRoZSAxIGxvYWQvc3RvcmUgcGVyIGN5Y2xlIGxpbWl0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwU3RvcmU2NCxbSW5zdHJTdGFnZTwyLCBbRlVfSXNzdWVdLCAwPiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XT4sCisgIC8vCisgIC8vIEZQIFN0b3JlIE11bHRpcGxlCisgIC8vIHVzZSBGVV9Jc3N1ZSB0byBlbmZvcmNlIHRoZSAxIGxvYWQvc3RvcmUgcGVyIGN5Y2xlIGxpbWl0CisgIEluc3RySXRpbkRhdGE8SUlDX2ZwU3RvcmVtLCBbSW5zdHJTdGFnZTwzLCBbRlVfSXNzdWVdLCAwPiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfUGlwZTBdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XT4sCisKKyAgLy8gTkVPTgorICAvLyBJc3N1ZSB0aHJvdWdoIGludGVnZXIgcGlwZWxpbmUsIGFuZCBleGVjdXRlIGluIE5FT04gdW5pdC4KKyAgLy8KKyAgLy8gVkxEMQorICBJbnN0ckl0aW5EYXRhPElJQ19WTEQxLCAgICAgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XT4sCisgIC8vCisgIC8vIFZMRDIKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkxEMiwgICAgIFtJbnN0clN0YWdlPDEsIFtGVV9Jc3N1ZV0sIDA+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05MU1BpcGVdPl0sIFsyLCAyLCAxXT4sCisgIC8vCisgIC8vIFZMRDMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkxEMywgICAgIFtJbnN0clN0YWdlPDEsIFtGVV9Jc3N1ZV0sIDA+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05MU1BpcGVdPl0sIFsyLCAyLCAyLCAxXT4sCisgIC8vCisgIC8vIFZMRDQKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkxENCwgICAgIFtJbnN0clN0YWdlPDEsIFtGVV9Jc3N1ZV0sIDA+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9MZFN0MF0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05MU1BpcGVdPl0sIFsyLCAyLCAyLCAyLCAxXT4sCisgIC8vCisgIC8vIFZTVAorICBJbnN0ckl0aW5EYXRhPElJQ19WU1QsICAgICAgW0luc3RyU3RhZ2U8MSwgW0ZVX0lzc3VlXSwgMD4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX0xkU3QwXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBGUCBVbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19WVU5BRCwgICAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXT5dLCBbNSwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEZQIFVuYXJ5CisgIC8vIFJlc3VsdCB3cml0dGVuIGluIE41LCBidXQgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgbGFzdCBjeWNsZSBvZiBtdWx0aWN5Y2xlLAorICAvLyBzbyB3ZSB1c2UgNiBmb3IgdGhvc2UgY2FzZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlVOQVEsICAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OUGlwZV0+XSwgWzYsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEZQIEJpbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19WQklORCwgICAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXT5dLCBbNSwgMiwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEZQIEJpbmFyeQorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBONSwgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDYgZm9yIHRob3NlIGNhc2VzCisgIEluc3RySXRpbkRhdGE8SUlDX1ZCSU5RLCAgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfTlBpcGVdPl0sIFs2LCAyLCAyXT4sCisgIC8vCisgIC8vIE1vdmUgSW1tZWRpYXRlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZJbW0sICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTlBpcGVdPl0sIFszXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBQZXJtdXRlIE1vdmUKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1PVkQsICAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OTFNQaXBlXT5dLCBbMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIFBlcm11dGUgTW92ZQorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBOMiwgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDMgZm9yIHRob3NlIGNhc2VzCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZRLCAgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfTkxTUGlwZV0+XSwgWzMsIDFdPiwKKyAgLy8KKyAgLy8gSW50ZWdlciB0byBTaW5nbGUtcHJlY2lzaW9uIE1vdmUKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1PVklTICwgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OTFNQaXBlXT5dLCBbMiwgMV0+LAorICAvLworICAvLyBJbnRlZ2VyIHRvIERvdWJsZS1wcmVjaXNpb24gTW92ZQorICBJbnN0ckl0aW5EYXRhPElJQ19WTU9WSUQgLCAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05MU1BpcGVdPl0sIFsyLCAxLCAxXT4sCisgIC8vCisgIC8vIFNpbmdsZS1wcmVjaXNpb24gdG8gSW50ZWdlciBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZTSSAsICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XSwgWzIwLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1wcmVjaXNpb24gdG8gSW50ZWdlciBNb3ZlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZNT1ZESSAsICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XSwgWzIwLCAyMCwgMV0+LAorICAvLworICAvLyBJbnRlZ2VyIHRvIExhbmUgTW92ZQorICBJbnN0ckl0aW5EYXRhPElJQ19WTU9WSVNMICwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX05MU1BpcGVdPl0sIFszLCAxLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBQZXJtdXRlCisgIEluc3RySXRpbkRhdGE8SUlDX1ZQRVJNRCwgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+XSwgWzIsIDIsIDEsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBQZXJtdXRlCisgIC8vIFJlc3VsdCB3cml0dGVuIGluIE4yLCBidXQgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgbGFzdCBjeWNsZSBvZiBtdWx0aWN5Y2xlLAorICAvLyBzbyB3ZSB1c2UgMyBmb3IgdGhvc2UgY2FzZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlBFUk1RLCAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OTFNQaXBlXT5dLCBbMywgMywgMSwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIFBlcm11dGUgKDMgY3ljbGUgaXNzdWUpCisgIC8vIFJlc3VsdCB3cml0dGVuIGluIE4yLCBidXQgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgbGFzdCBjeWNsZSBvZiBtdWx0aWN5Y2xlLAorICAvLyBzbyB3ZSB1c2UgNCBmb3IgdGhvc2UgY2FzZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlBFUk1RMywgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OTFNQaXBlXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OTFNQaXBlXT5dLCBbNCwgNCwgMSwgMV0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgRlAgTXVsdGlwbGUtQWNjdW11bGF0ZQorICBJbnN0ckl0aW5EYXRhPElJQ19WTUFDRCwgICAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXT5dLCBbOSwgMiwgMiwgM10+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEZQIE11bHRpcGxlLUFjY3VtdWxhdGUKKyAgLy8gUmVzdWx0IHdyaXR0ZW4gaW4gTjksIGJ1dCB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSBsYXN0IGN5Y2xlIG9mIG11bHRpY3ljbGUsCisgIC8vIHNvIHdlIHVzZSAxMCBmb3IgdGhvc2UgY2FzZXMKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1BQ1EsICAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OUGlwZV0+XSwgWzEwLCAyLCAyLCAzXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBSZWNpcHJpY2FsIFN0ZXAKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlJFQ1NELCAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzksIDIsIDJdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBSZWNpcHJpY2FsIFN0ZXAKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlJFQ1NRLCAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OUGlwZV0+XSwgWzEwLCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIENvdW50CisgIEluc3RySXRpbkRhdGE8SUlDX1ZDTlRpRCwgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTlBpcGVdPl0sIFszLCAyLCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBDb3VudAorICAvLyBSZXN1bHQgd3JpdHRlbiBpbiBOMywgYnV0IHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxhc3QgY3ljbGUgb2YgbXVsdGljeWNsZSwKKyAgLy8gc28gd2UgdXNlIDQgZm9yIHRob3NlIGNhc2VzCisgIEluc3RySXRpbkRhdGE8SUlDX1ZDTlRpUSwgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfTlBpcGVdPl0sIFs0LCAyLCAyXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIFVuYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZVTkFpRCwgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTlBpcGVdPl0sIFs0LCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBVbmFyeQorICBJbnN0ckl0aW5EYXRhPElJQ19WVU5BaVEsICAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXT5dLCBbNCwgMl0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBRLVVuYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZRVU5BaUQsICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTlBpcGVdPl0sIFs0LCAxXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBDb3VudFEtVW5hcnkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlFVTkFpUSwgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzQsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgQmluYXJ5CisgIEluc3RySXRpbkRhdGE8SUlDX1ZCSU5pRCwgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTlBpcGVdPl0sIFszLCAyLCAyXT4sCisgIC8vCisgIC8vIFF1YWQtcmVnaXN0ZXIgSW50ZWdlciBCaW5hcnkKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkJJTmlRLCAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzMsIDIsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgQmluYXJ5ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WQklOaTRELCAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXT5dLCBbNCwgMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgQmluYXJ5ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WQklOaTRRLCAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXT5dLCBbNCwgMiwgMV0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBTdWJ0cmFjdAorICBJbnN0ckl0aW5EYXRhPElJQ19WU1VCaUQsICAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXT5dLCBbMywgMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgU3VidHJhY3QKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlNVQmlRLCAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzMsIDIsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgU2hpZnQKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlNITGlELCAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzMsIDEsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIFNoaWZ0CisgIEluc3RySXRpbkRhdGE8SUlDX1ZTSExpUSwgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfTlBpcGVdPl0sIFs0LCAxLCAxXT4sCisgIC8vCisgIC8vIERvdWJsZS1yZWdpc3RlciBJbnRlZ2VyIFNoaWZ0ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WU0hMaTRELCAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzQsIDEsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIFNoaWZ0ICg0IGN5Y2xlKQorICBJbnN0ckl0aW5EYXRhPElJQ19WU0hMaTRRLCAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OUGlwZV0+XSwgWzUsIDEsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgUGFpciBBZGQgTG9uZworICBJbnN0ckl0aW5EYXRhPElJQ19WUEFMaUQsICAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXT5dLCBbNiwgMywgMiwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgUGFpciBBZGQgTG9uZworICBJbnN0ckl0aW5EYXRhPElJQ19WUEFMaVEsICAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX05QaXBlXT5dLCBbNywgMywgMiwgMV0+LAorICAvLworICAvLyBEb3VibGUtcmVnaXN0ZXIgSW50ZWdlciBNdWx0aXBseSAoLjgsIC4xNikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1VTGkxNkQsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzYsIDIsIDJdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHkgKC4zMikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1VTGkzMkQsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OUGlwZV0+XSwgWzcsIDIsIDFdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIE11bHRpcGx5ICguOCwgLjE2KQorICBJbnN0ckl0aW5EYXRhPElJQ19WTVVMaTE2USwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX05QaXBlXT5dLCBbNywgMiwgMl0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHkgKC4zMikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1VTGkzMlEsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX05MU1BpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDMsIFtGVV9OUGlwZV0+XSwgWzksIDIsIDFdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHktQWNjdW11bGF0ZSAoLjgsIC4xNikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1BQ2kxNkQsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+XSwgWzYsIDIsIDIsIDNdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHktQWNjdW11bGF0ZSAoLjMyKQorICBJbnN0ckl0aW5EYXRhPElJQ19WTUFDaTMyRCwgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX05QaXBlXT5dLCBbNywgMiwgMSwgM10+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIEludGVnZXIgTXVsdGlwbHktQWNjdW11bGF0ZSAoLjgsIC4xNikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1BQ2kxNlEsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OUGlwZV0+XSwgWzcsIDIsIDIsIDNdPiwKKyAgLy8KKyAgLy8gUXVhZC1yZWdpc3RlciBJbnRlZ2VyIE11bHRpcGx5LUFjY3VtdWxhdGUgKC4zMikKKyAgSW5zdHJJdGluRGF0YTxJSUNfVk1BQ2kzMlEsIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX05MU1BpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDMsIFtGVV9OUGlwZV0+XSwgWzksIDIsIDEsIDNdPiwKKyAgLy8KKyAgLy8gRG91YmxlLXJlZ2lzdGVyIFZFWFQKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkVYVEQsICAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OTFNQaXBlXT5dLCBbMiwgMSwgMV0+LAorICAvLworICAvLyBRdWFkLXJlZ2lzdGVyIFZFWFQKKyAgSW5zdHJJdGluRGF0YTxJSUNfVkVYVFEsICAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OTFNQaXBlXT5dLCBbMywgMSwgMV0+LAorICAvLworICAvLyBWVEIKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCMSwgICAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OTFNQaXBlXT5dLCBbMywgMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19WVEIyLCAgICAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX05MU1BpcGVdPl0sIFszLCAyLCAyLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX1ZUQjMsICAgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfTkxTUGlwZV0+XSwgWzQsIDIsIDIsIDMsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCNCwgICAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OTFNQaXBlXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTlBpcGVdLCAwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OTFNQaXBlXT5dLCBbNCwgMiwgMiwgMywgMywgMV0+LAorICAvLworICAvLyBWVEJYCisgIEluc3RySXRpbkRhdGE8SUlDX1ZUQlgxLCAgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfTkxTUGlwZV0+XSwgWzMsIDEsIDIsIDFdPiwKKyAgSW5zdHJJdGluRGF0YTxJSUNfVlRCWDIsICAgIFtJbnN0clN0YWdlPDEsIFtGVV9QaXBlMCwgRlVfUGlwZTFdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDIsIFtGVV9OTFNQaXBlXT5dLCBbMywgMSwgMiwgMiwgMV0+LAorICBJbnN0ckl0aW5EYXRhPElJQ19WVEJYMywgICAgW0luc3RyU3RhZ2U8MSwgW0ZVX1BpcGUwLCBGVV9QaXBlMV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05MU1BpcGVdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtGVV9OUGlwZV0sIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MiwgW0ZVX05MU1BpcGVdPl0sIFs0LCAxLCAyLCAyLCAzLCAxXT4sCisgIEluc3RySXRpbkRhdGE8SUlDX1ZUQlg0LCAgICBbSW5zdHJTdGFnZTwxLCBbRlVfUGlwZTAsIEZVX1BpcGUxXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwxLCBbRlVfTkxTUGlwZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0ZVX05QaXBlXSwgMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJTdGFnZTwyLCBbRlVfTkxTUGlwZV0+XSwgWzQsIDEsIDIsIDIsIDMsIDMsIDFdPgorXT47CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1TZWxlY3Rpb25EQUdJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNlbGVjdGlvbkRBR0luZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyODk0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1TZWxlY3Rpb25EQUdJbmZvLmNwcApAQCAtMCwwICsxLDEzNCBAQAorLy89PT0tLSBBUk1TZWxlY3Rpb25EQUdJbmZvLmNwcCAtIEFSTSBTZWxlY3Rpb25EQUcgSW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQVJNU2VsZWN0aW9uREFHSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFybS1zZWxlY3Rpb25kYWctaW5mbyIKKyNpbmNsdWRlICJBUk1UYXJnZXRNYWNoaW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworQVJNU2VsZWN0aW9uREFHSW5mbzo6QVJNU2VsZWN0aW9uREFHSW5mbyhjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkKKyAgOiBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvKFRNKSwKKyAgICBTdWJ0YXJnZXQoJlRNLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCkpIHsKK30KKworQVJNU2VsZWN0aW9uREFHSW5mbzo6fkFSTVNlbGVjdGlvbkRBR0luZm8oKSB7Cit9CisKK1NEVmFsdWUKK0FSTVNlbGVjdGlvbkRBR0luZm86OkVtaXRUYXJnZXRDb2RlRm9yTWVtY3B5KFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIERzdCwgU0RWYWx1ZSBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNpemUsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlLCBib29sIEFsd2F5c0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpEc3RTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERzdFNWT2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNyY1NWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU3JjU1ZPZmYpIGNvbnN0IHsKKyAgLy8gRG8gcmVwZWF0ZWQgNC1ieXRlIGxvYWRzIGFuZCBzdG9yZXMuIFRvIGJlIGltcHJvdmVkLgorICAvLyBUaGlzIHJlcXVpcmVzIDQtYnl0ZSBhbGlnbm1lbnQuCisgIGlmICgoQWxpZ24gJiAzKSAhPSAwKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIC8vIFRoaXMgcmVxdWlyZXMgdGhlIGNvcHkgc2l6ZSB0byBiZSBhIGNvbnN0YW50LCBwcmVmZXJyYWJseQorICAvLyB3aXRoaW4gYSBzdWJ0YXJnZXQtc3BlY2lmaWMgbGltaXQuCisgIENvbnN0YW50U0ROb2RlICpDb25zdGFudFNpemUgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oU2l6ZSk7CisgIGlmICghQ29uc3RhbnRTaXplKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIHVpbnQ2NF90IFNpemVWYWwgPSBDb25zdGFudFNpemUtPmdldFpFeHRWYWx1ZSgpOworICBpZiAoIUFsd2F5c0lubGluZSAmJiBTaXplVmFsID4gU3VidGFyZ2V0LT5nZXRNYXhJbmxpbmVTaXplVGhyZXNob2xkKCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICB1bnNpZ25lZCBCeXRlc0xlZnQgPSBTaXplVmFsICYgMzsKKyAgdW5zaWduZWQgTnVtTWVtT3BzID0gU2l6ZVZhbCA+PiAyOworICB1bnNpZ25lZCBFbWl0dGVkTnVtTWVtT3BzID0gMDsKKyAgRVZUIFZUID0gTVZUOjppMzI7CisgIHVuc2lnbmVkIFZUU2l6ZSA9IDQ7CisgIHVuc2lnbmVkIGkgPSAwOworICBjb25zdCB1bnNpZ25lZCBNQVhfTE9BRFNfSU5fTERNID0gNjsKKyAgU0RWYWx1ZSBURk9wc1tNQVhfTE9BRFNfSU5fTERNXTsKKyAgU0RWYWx1ZSBMb2Fkc1tNQVhfTE9BRFNfSU5fTERNXTsKKyAgdWludDY0X3QgU3JjT2ZmID0gMCwgRHN0T2ZmID0gMDsKKworICAvLyBFbWl0IHVwIHRvIE1BWF9MT0FEU19JTl9MRE0gbG9hZHMsIHRoZW4gYSBUb2tlbkZhY3RvciBiYXJyaWVyLCB0aGVuIHRoZQorICAvLyBzYW1lIG51bWJlciBvZiBzdG9yZXMuICBUaGUgbG9hZHMgYW5kIHN0b3JlcyB3aWxsIGdldCBjb21iaW5lZCBpbnRvCisgIC8vIGxkbS9zdG0gbGF0ZXIgb24uCisgIHdoaWxlIChFbWl0dGVkTnVtTWVtT3BzIDwgTnVtTWVtT3BzKSB7CisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCBNQVhfTE9BRFNfSU5fTERNICYmIEVtaXR0ZWROdW1NZW1PcHMgKyBpIDwgTnVtTWVtT3BzOyArK2kpIHsKKyAgICAgIExvYWRzW2ldID0gREFHLmdldExvYWQoVlQsIGRsLCBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoU3JjT2ZmLCBNVlQ6OmkzMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNTViwgU3JjU1ZPZmYgKyBTcmNPZmYsIGlzVm9sYXRpbGUsIGZhbHNlLCAwKTsKKyAgICAgIFRGT3BzW2ldID0gTG9hZHNbaV0uZ2V0VmFsdWUoMSk7CisgICAgICBTcmNPZmYgKz0gVlRTaXplOworICAgIH0KKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCAmVEZPcHNbMF0sIGkpOworCisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCBNQVhfTE9BRFNfSU5fTERNICYmIEVtaXR0ZWROdW1NZW1PcHMgKyBpIDwgTnVtTWVtT3BzOyArK2kpIHsKKyAgICAgIFRGT3BzW2ldID0gREFHLmdldFN0b3JlKENoYWluLCBkbCwgTG9hZHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoRHN0T2ZmLCBNVlQ6OmkzMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0U1YsIERzdFNWT2ZmICsgRHN0T2ZmLCBpc1ZvbGF0aWxlLCBmYWxzZSwgMCk7CisgICAgICBEc3RPZmYgKz0gVlRTaXplOworICAgIH0KKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCAmVEZPcHNbMF0sIGkpOworCisgICAgRW1pdHRlZE51bU1lbU9wcyArPSBpOworICB9CisKKyAgaWYgKEJ5dGVzTGVmdCA9PSAwKQorICAgIHJldHVybiBDaGFpbjsKKworICAvLyBJc3N1ZSBsb2FkcyAvIHN0b3JlcyBmb3IgdGhlIHRyYWlsaW5nICgxIC0gMykgYnl0ZXMuCisgIHVuc2lnbmVkIEJ5dGVzTGVmdFNhdmUgPSBCeXRlc0xlZnQ7CisgIGkgPSAwOworICB3aGlsZSAoQnl0ZXNMZWZ0KSB7CisgICAgaWYgKEJ5dGVzTGVmdCA+PSAyKSB7CisgICAgICBWVCA9IE1WVDo6aTE2OworICAgICAgVlRTaXplID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgVlQgPSBNVlQ6Omk4OworICAgICAgVlRTaXplID0gMTsKKyAgICB9CisKKyAgICBMb2Fkc1tpXSA9IERBRy5nZXRMb2FkKFZULCBkbCwgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoU3JjT2ZmLCBNVlQ6OmkzMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjU1YsIFNyY1NWT2ZmICsgU3JjT2ZmLCBmYWxzZSwgZmFsc2UsIDApOworICAgIFRGT3BzW2ldID0gTG9hZHNbaV0uZ2V0VmFsdWUoMSk7CisgICAgKytpOworICAgIFNyY09mZiArPSBWVFNpemU7CisgICAgQnl0ZXNMZWZ0IC09IFZUU2l6ZTsKKyAgfQorICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCAmVEZPcHNbMF0sIGkpOworCisgIGkgPSAwOworICBCeXRlc0xlZnQgPSBCeXRlc0xlZnRTYXZlOworICB3aGlsZSAoQnl0ZXNMZWZ0KSB7CisgICAgaWYgKEJ5dGVzTGVmdCA+PSAyKSB7CisgICAgICBWVCA9IE1WVDo6aTE2OworICAgICAgVlRTaXplID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgVlQgPSBNVlQ6Omk4OworICAgICAgVlRTaXplID0gMTsKKyAgICB9CisKKyAgICBURk9wc1tpXSA9IERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIExvYWRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppMzIsIERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoRHN0T2ZmLCBNVlQ6OmkzMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERzdFNWLCBEc3RTVk9mZiArIERzdE9mZiwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICArK2k7CisgICAgRHN0T2ZmICs9IFZUU2l6ZTsKKyAgICBCeXRlc0xlZnQgLT0gVlRTaXplOworICB9CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgJlRGT3BzWzBdLCBpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNlbGVjdGlvbkRBR0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVNlbGVjdGlvbkRBR0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2QwMGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNU2VsZWN0aW9uREFHSW5mby5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vPT09LS0gQVJNU2VsZWN0aW9uREFHSW5mby5oIC0gQVJNIFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFSTSBzdWJjbGFzcyBmb3IgVGFyZ2V0U2VsZWN0aW9uREFHSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEFSTVNFTEVDVElPTkRBR0lORk9fSAorI2RlZmluZSBBUk1TRUxFQ1RJT05EQUdJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBR0luZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBUk1TZWxlY3Rpb25EQUdJbmZvIDogcHVibGljIFRhcmdldFNlbGVjdGlvbkRBR0luZm8geworICAvLy8gU3VidGFyZ2V0IC0gS2VlcCBhIHBvaW50ZXIgdG8gdGhlIEFSTVN1YnRhcmdldCBhcm91bmQgc28gdGhhdCB3ZSBjYW4KKyAgLy8vIG1ha2UgdGhlIHJpZ2h0IGRlY2lzaW9uIHdoZW4gZ2VuZXJhdGluZyBjb2RlIGZvciBkaWZmZXJlbnQgdGFyZ2V0cy4KKyAgY29uc3QgQVJNU3VidGFyZ2V0ICpTdWJ0YXJnZXQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQVJNU2VsZWN0aW9uREFHSW5mbyhjb25zdCBUYXJnZXRNYWNoaW5lICZUTSk7CisgIH5BUk1TZWxlY3Rpb25EQUdJbmZvKCk7CisKKyAgdmlydHVhbAorICBTRFZhbHVlIEVtaXRUYXJnZXRDb2RlRm9yTWVtY3B5KFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgRHN0LCBTRFZhbHVlIFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNpemUsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSwgYm9vbCBBbHdheXNJbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkRzdFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERzdFNWT2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpTcmNTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTcmNTVk9mZikgY29uc3Q7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNU3VidGFyZ2V0LmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVN1YnRhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5MTNlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVN1YnRhcmdldC5jcHAKQEAgLTAsMCArMSwxODIgQEAKKy8vPT09LS0gQVJNU3VidGFyZ2V0LmNwcCAtIEFSTSBTdWJ0YXJnZXQgSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEFSTSBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkFSTVN1YnRhcmdldC5oIgorI2luY2x1ZGUgIkFSTUdlblN1YnRhcmdldC5pbmMiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitSZXNlcnZlUjkoImFybS1yZXNlcnZlLXI5IiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICBjbDo6ZGVzYygiUmVzZXJ2ZSBSOSwgbWFraW5nIGl0IHVuYXZhaWxhYmxlIGFzIEdQUiIpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK1VzZU1PVlQoImFybS11c2UtbW92dCIsCisgICAgICAgIGNsOjppbml0KHRydWUpLCBjbDo6SGlkZGVuKTsKKworQVJNU3VidGFyZ2V0OjpBUk1TdWJ0YXJnZXQoY29uc3Qgc3RkOjpzdHJpbmcgJlRULCBjb25zdCBzdGQ6OnN0cmluZyAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVCkKKyAgOiBBUk1BcmNoVmVyc2lvbihWNCkKKyAgLCBBUk1GUFVUeXBlKE5vbmUpCisgICwgVXNlTkVPTkZvclNpbmdsZVByZWNpc2lvbkZQKGZhbHNlKQorICAsIFNsb3dWTUx4KGZhbHNlKQorICAsIFNsb3dGUEJyY2MoZmFsc2UpCisgICwgSXNUaHVtYihpc1QpCisgICwgVGh1bWJNb2RlKFRodW1iMSkKKyAgLCBQb3N0UkFTY2hlZHVsZXIoZmFsc2UpCisgICwgSXNSOVJlc2VydmVkKFJlc2VydmVSOSkKKyAgLCBVc2VNb3Z0KFVzZU1PVlQpCisgICwgSGFzRlAxNihmYWxzZSkKKyAgLCBIYXNIYXJkd2FyZURpdmlkZShmYWxzZSkKKyAgLCBIYXNUMkV4dHJhY3RQYWNrKGZhbHNlKQorICAsIFByZWYzMkJpdFRodW1iKGZhbHNlKQorICAsIHN0YWNrQWxpZ25tZW50KDQpCisgICwgQ1BVU3RyaW5nKCJnZW5lcmljIikKKyAgLCBUYXJnZXRUeXBlKGlzRUxGKSAvLyBEZWZhdWx0IHRvIEVMRiB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4KKyAgLCBUYXJnZXRBQkkoQVJNX0FCSV9BUENTKSB7CisgIC8vIGRlZmF1bHQgdG8gc29mdCBmbG9hdCBBQkkKKyAgaWYgKEZsb2F0QUJJVHlwZSA9PSBGbG9hdEFCSTo6RGVmYXVsdCkKKyAgICBGbG9hdEFCSVR5cGUgPSBGbG9hdEFCSTo6U29mdDsKKworICAvLyBEZXRlcm1pbmUgZGVmYXVsdCBhbmQgdXNlciBzcGVjaWZpZWQgY2hhcmFjdGVyaXN0aWNzCisKKyAgLy8gUGFyc2UgZmVhdHVyZXMgc3RyaW5nLgorICBDUFVTdHJpbmcgPSBQYXJzZVN1YnRhcmdldEZlYXR1cmVzKEZTLCBDUFVTdHJpbmcpOworCisgIC8vIFdoZW4gbm8gYXJjaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IENQVSBvciBieSBhdHRyaWJ1dGVzLCBtYWtlIHRoZSBkZWZhdWx0CisgIC8vIEFSTXY0VC4KKyAgaWYgKENQVVN0cmluZyA9PSAiZ2VuZXJpYyIgJiYgKEZTLmVtcHR5KCkgfHwgRlMgPT0gImdlbmVyaWMiKSkKKyAgICBBUk1BcmNoVmVyc2lvbiA9IFY0VDsKKworICAvLyBTZXQgdGhlIGJvb2xlYW4gY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCB0YXJnZXQgdHJpcGxlLCBvciB0aGUgZGVmYXVsdAorICAvLyBpZiBvbmUgY2Fubm90IGJlIGRldGVybWluZWQsIHRvIHRydWUuCisgIHVuc2lnbmVkIExlbiA9IFRULmxlbmd0aCgpOworICB1bnNpZ25lZCBJZHggPSAwOworCisgIGlmIChMZW4gPj0gNSAmJiBUVC5zdWJzdHIoMCwgNCkgPT0gImFybXYiKQorICAgIElkeCA9IDQ7CisgIGVsc2UgaWYgKExlbiA+PSA2ICYmIFRULnN1YnN0cigwLCA1KSA9PSAidGh1bWIiKSB7CisgICAgSXNUaHVtYiA9IHRydWU7CisgICAgaWYgKExlbiA+PSA3ICYmIFRUWzVdID09ICd2JykKKyAgICAgIElkeCA9IDY7CisgIH0KKyAgaWYgKElkeCkgeworICAgIHVuc2lnbmVkIFN1YlZlciA9IFRUW0lkeF07CisgICAgaWYgKFN1YlZlciA+PSAnNycgJiYgU3ViVmVyIDw9ICc5JykgeworICAgICAgQVJNQXJjaFZlcnNpb24gPSBWN0E7CisgICAgICBpZiAoTGVuID49IElkeCsyICYmIFRUW0lkeCsxXSA9PSAnbScpCisgICAgICAgIEFSTUFyY2hWZXJzaW9uID0gVjdNOworICAgIH0gZWxzZSBpZiAoU3ViVmVyID09ICc2JykgeworICAgICAgQVJNQXJjaFZlcnNpb24gPSBWNjsKKyAgICAgIGlmIChMZW4gPj0gSWR4KzMgJiYgVFRbSWR4KzFdID09ICd0JyAmJiBUVFtJZHgrMl0gPT0gJzInKQorICAgICAgICBBUk1BcmNoVmVyc2lvbiA9IFY2VDI7CisgICAgfSBlbHNlIGlmIChTdWJWZXIgPT0gJzUnKSB7CisgICAgICBBUk1BcmNoVmVyc2lvbiA9IFY1VDsKKyAgICAgIGlmIChMZW4gPj0gSWR4KzMgJiYgVFRbSWR4KzFdID09ICd0JyAmJiBUVFtJZHgrMl0gPT0gJ2UnKQorICAgICAgICBBUk1BcmNoVmVyc2lvbiA9IFY1VEU7CisgICAgfSBlbHNlIGlmIChTdWJWZXIgPT0gJzQnKSB7CisgICAgICBpZiAoTGVuID49IElkeCsyICYmIFRUW0lkeCsxXSA9PSAndCcpCisgICAgICAgIEFSTUFyY2hWZXJzaW9uID0gVjRUOworICAgICAgZWxzZQorICAgICAgICBBUk1BcmNoVmVyc2lvbiA9IFY0OworICAgIH0KKyAgfQorCisgIC8vIFRodW1iMiBpbXBsaWVzIGF0IGxlYXN0IFY2VDIuCisgIGlmIChBUk1BcmNoVmVyc2lvbiA+PSBWNlQyKQorICAgIFRodW1iTW9kZSA9IFRodW1iMjsKKyAgZWxzZSBpZiAoVGh1bWJNb2RlID49IFRodW1iMikKKyAgICBBUk1BcmNoVmVyc2lvbiA9IFY2VDI7CisKKyAgaWYgKExlbiA+PSAxMCkgeworICAgIGlmIChUVC5maW5kKCItZGFyd2luIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAvLyBhcm0tZGFyd2luCisgICAgICBUYXJnZXRUeXBlID0gaXNEYXJ3aW47CisgIH0KKworICBpZiAoVFQuZmluZCgiZWFiaSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIFRhcmdldEFCSSA9IEFSTV9BQklfQUFQQ1M7CisKKyAgaWYgKGlzQUFQQ1NfQUJJKCkpCisgICAgc3RhY2tBbGlnbm1lbnQgPSA4OworCisgIGlmIChpc1RhcmdldERhcndpbigpKQorICAgIElzUjlSZXNlcnZlZCA9IFJlc2VydmVSOSB8IChBUk1BcmNoVmVyc2lvbiA8IFY2KTsKKworICBpZiAoIWlzVGh1bWIoKSB8fCBoYXNUaHVtYjIoKSkKKyAgICBQb3N0UkFTY2hlZHVsZXIgPSB0cnVlOworfQorCisvLy8gR1ZJc0luZGlyZWN0U3ltYm9sIC0gdHJ1ZSBpZiB0aGUgR1Ygd2lsbCBiZSBhY2Nlc3NlZCB2aWEgYW4gaW5kaXJlY3Qgc3ltYm9sLgorYm9vbAorQVJNU3VidGFyZ2V0OjpHVklzSW5kaXJlY3RTeW1ib2woY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2M6Ok1vZGVsIFJlbG9jTSkgY29uc3QgeworICBpZiAoUmVsb2NNID09IFJlbG9jOjpTdGF0aWMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE1hdGVyaWFsaXphYmxlIEdWcyAoaW4gSklUIGxhenkgY29tcGlsYXRpb24gbW9kZSkgZG8gbm90IHJlcXVpcmUgYW4gZXh0cmEKKyAgLy8gbG9hZCBmcm9tIHN0dWIuCisgIGJvb2wgaXNEZWNsID0gR1YtPmlzRGVjbGFyYXRpb24oKSAmJiAhR1YtPmlzTWF0ZXJpYWxpemFibGUoKTsKKworICBpZiAoIWlzVGFyZ2V0RGFyd2luKCkpIHsKKyAgICAvLyBFeHRyYSBsb2FkIGlzIG5lZWRlZCBmb3IgYWxsIGV4dGVybmFsbHkgdmlzaWJsZS4KKyAgICBpZiAoR1YtPmhhc0xvY2FsTGlua2FnZSgpIHx8IEdWLT5oYXNIaWRkZW5WaXNpYmlsaXR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgaWYgKFJlbG9jTSA9PSBSZWxvYzo6UElDXykgeworICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gYSBkZWZpbml0aW9uLCBpdCBpcyBkZWZpbml0ZWx5IG5vdAorICAgICAgLy8gdGhyb3VnaCBhIHN0dWIuCisgICAgICBpZiAoIWlzRGVjbCAmJiAhR1YtPmlzV2Vha0ZvckxpbmtlcigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8vIFVubGVzcyB3ZSBoYXZlIGEgc3ltYm9sIHdpdGggaGlkZGVuIHZpc2liaWxpdHksIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCBhCisgICAgICAvLyBub3JtYWwgJG5vbl9sYXp5X3B0ciBzdHViIGJlY2F1c2UgdGhpcyBzeW1ib2wgbWlnaHQgYmUgcmVzb2x2ZWQgbGF0ZS4KKyAgICAgIGlmICghR1YtPmhhc0hpZGRlblZpc2liaWxpdHkoKSkgIC8vIE5vbi1oaWRkZW4gJG5vbl9sYXp5X3B0ciByZWZlcmVuY2UuCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAvLyBJZiBzeW1ib2wgdmlzaWJpbGl0eSBpcyBoaWRkZW4sIHdlIGhhdmUgYSBzdHViIGZvciBjb21tb24gc3ltYm9sCisgICAgICAvLyByZWZlcmVuY2VzIGFuZCBleHRlcm5hbCBkZWNsYXJhdGlvbnMuCisgICAgICBpZiAoaXNEZWNsIHx8IEdWLT5oYXNDb21tb25MaW5rYWdlKCkpCisgICAgICAgIC8vIEhpZGRlbiAkbm9uX2xhenlfcHRyIHJlZmVyZW5jZS4KKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gYSBkZWZpbml0aW9uLCBpdCBpcyBkZWZpbml0ZWx5IG5vdAorICAgICAgLy8gdGhyb3VnaCBhIHN0dWIuCisgICAgICBpZiAoIWlzRGVjbCAmJiAhR1YtPmlzV2Vha0ZvckxpbmtlcigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAvLyBVbmxlc3Mgd2UgaGF2ZSBhIHN5bWJvbCB3aXRoIGhpZGRlbiB2aXNpYmlsaXR5LCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggYQorICAgICAgLy8gbm9ybWFsICRub25fbGF6eV9wdHIgc3R1YiBiZWNhdXNlIHRoaXMgc3ltYm9sIG1pZ2h0IGJlIHJlc29sdmVkIGxhdGUuCisgICAgICBpZiAoIUdWLT5oYXNIaWRkZW5WaXNpYmlsaXR5KCkpICAvLyBOb24taGlkZGVuICRub25fbGF6eV9wdHIgcmVmZXJlbmNlLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQVJNU3VidGFyZ2V0OjplbmFibGVQb3N0UkFTY2hlZHVsZXIoCisgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgICAgICBUYXJnZXRTdWJ0YXJnZXQ6OkFudGlEZXBCcmVha01vZGUmIE1vZGUsCisgICAgICAgICAgIFJlZ0NsYXNzVmVjdG9yJiBDcml0aWNhbFBhdGhSQ3MpIGNvbnN0IHsKKyAgTW9kZSA9IFRhcmdldFN1YnRhcmdldDo6QU5USURFUF9DUklUSUNBTDsKKyAgQ3JpdGljYWxQYXRoUkNzLmNsZWFyKCk7CisgIENyaXRpY2FsUGF0aFJDcy5wdXNoX2JhY2soJkFSTTo6R1BSUmVnQ2xhc3MpOworICByZXR1cm4gUG9zdFJBU2NoZWR1bGVyICYmIE9wdExldmVsID49IENvZGVHZW5PcHQ6OkRlZmF1bHQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1TdWJ0YXJnZXQuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVN1YnRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjQ1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1TdWJ0YXJnZXQuaApAQCAtMCwwICsxLDE4NSBAQAorLy89PT09PS0tLS0gQVJNU3VidGFyZ2V0LmggLSBEZWZpbmUgU3VidGFyZ2V0IGZvciB0aGUgQVJNIC0tLS0tKi0gQysrIC0qLS09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEFSTSBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBUk1TVUJUQVJHRVRfSAorI2RlZmluZSBBUk1TVUJUQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJdGluZXJhcmllcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJBUk1CYXNlUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBHbG9iYWxWYWx1ZTsKKworY2xhc3MgQVJNU3VidGFyZ2V0IDogcHVibGljIFRhcmdldFN1YnRhcmdldCB7Citwcm90ZWN0ZWQ6CisgIGVudW0gQVJNQXJjaEVudW0geworICAgIFY0LCBWNFQsIFY1VCwgVjVURSwgVjYsIFY2VDIsIFY3QSwgVjdNCisgIH07CisKKyAgZW51bSBBUk1GUEVudW0geworICAgIE5vbmUsIFZGUHYyLCBWRlB2MywgTkVPTgorICB9OworCisgIGVudW0gVGh1bWJUeXBlRW51bSB7CisgICAgVGh1bWIxLAorICAgIFRodW1iMgorICB9OworCisgIC8vLyBBUk1BcmNoVmVyc2lvbiAtIEFSTSBhcmNoaXRlY3R1cmUgdmVyc2lvbjogVjQsIFY0VCAoYmFzZSksIFY1VCwgVjVURSwKKyAgLy8vIFY2LCBWNlQyLCBWN0EsIFY3TS4KKyAgQVJNQXJjaEVudW0gQVJNQXJjaFZlcnNpb247CisKKyAgLy8vIEFSTUZQVVR5cGUgLSBGbG9hdGluZyBQb2ludCBVbml0IHR5cGUuCisgIEFSTUZQRW51bSBBUk1GUFVUeXBlOworCisgIC8vLyBVc2VORU9ORm9yU2luZ2xlUHJlY2lzaW9uRlAgLSBpZiB0aGUgTkVPTkZQIGF0dHJpYnV0ZSBoYXMgYmVlbgorICAvLy8gc3BlY2lmaWVkLiBVc2UgdGhlIG1ldGhvZCB1c2VORU9ORm9yU2luZ2xlUHJlY2lzaW9uRlAoKSB0bworICAvLy8gZGV0ZXJtaW5lIGlmIE5FT04gc2hvdWxkIGFjdHVhbGx5IGJlIHVzZWQuCisgIGJvb2wgVXNlTkVPTkZvclNpbmdsZVByZWNpc2lvbkZQOworCisgIC8vLyBTbG93Vk1MeCAtIElmIHRoZSBWRlAyIGluc3RydWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBpbmRpY2F0ZXMgd2hldGhlcgorICAvLy8gdGhlIFZNTFtBU10gaW5zdHJ1Y3Rpb25zIGFyZSBzbG93IChpZiBzbywgZG9uJ3QgdXNlIHRoZW0pLgorICBib29sIFNsb3dWTUx4OworCisgIC8vLyBTbG93RlBCcmNjIC0gVHJ1ZSBpZiBmbG9hdGluZyBwb2ludCBjb21wYXJlICsgYnJhbmNoIGlzIHNsb3cuCisgIGJvb2wgU2xvd0ZQQnJjYzsKKworICAvLy8gSXNUaHVtYiAtIFRydWUgaWYgd2UgYXJlIGluIHRodW1iIG1vZGUsIGZhbHNlIGlmIGluIEFSTSBtb2RlLgorICBib29sIElzVGh1bWI7CisKKyAgLy8vIFRodW1iTW9kZSAtIEluZGljYXRlcyBzdXBwb3J0ZWQgVGh1bWIgdmVyc2lvbi4KKyAgVGh1bWJUeXBlRW51bSBUaHVtYk1vZGU7CisKKyAgLy8vIFBvc3RSQVNjaGVkdWxlciAtIFRydWUgaWYgdXNpbmcgcG9zdC1yZWdpc3Rlci1hbGxvY2F0aW9uIHNjaGVkdWxlci4KKyAgYm9vbCBQb3N0UkFTY2hlZHVsZXI7CisKKyAgLy8vIElzUjlSZXNlcnZlZCAtIFRydWUgaWYgUjkgaXMgYSBub3QgYXZhaWxhYmxlIGFzIGdlbmVyYWwgcHVycG9zZSByZWdpc3Rlci4KKyAgYm9vbCBJc1I5UmVzZXJ2ZWQ7CisKKyAgLy8vIFVzZU1vdnQgLSBUcnVlIGlmIE1PVlQgLyBNT1ZXIHBhaXJzIGFyZSB1c2VkIGZvciBtYXRlcmlhbGl6YXRpb24gb2YgMzItYml0CisgIC8vLyBpbW1zIChpbmNsdWRpbmcgZ2xvYmFsIGFkZHJlc3NlcykuCisgIGJvb2wgVXNlTW92dDsKKworICAvLy8gSGFzRlAxNiAtIFRydWUgaWYgc3VidGFyZ2V0IHN1cHBvcnRzIGhhbGYtcHJlY2lzaW9uIEZQIChXZSBzdXBwb3J0IFZGUCtIRgorICAvLy8gb25seSBzbyBmYXIpCisgIGJvb2wgSGFzRlAxNjsKKworICAvLy8gSGFzSGFyZHdhcmVEaXZpZGUgLSBUcnVlIGlmIHN1YnRhcmdldCBzdXBwb3J0cyBbc3VdZGl2CisgIGJvb2wgSGFzSGFyZHdhcmVEaXZpZGU7CisKKyAgLy8vIEhhc1QyRXh0cmFjdFBhY2sgLSBUcnVlIGlmIHN1YnRhcmdldCBzdXBwb3J0cyB0aHVtYjIgZXh0cmFjdC9wYWNrCisgIC8vLyBpbnN0cnVjdGlvbnMuCisgIGJvb2wgSGFzVDJFeHRyYWN0UGFjazsKKworICAvLy8gUHJlZjMyQml0VGh1bWIgLSBJZiB0cnVlLCBjb2RlZ2VuIHdvdWxkIHByZWZlciAzMi1iaXQgVGh1bWIgaW5zdHJ1Y3Rpb25zCisgIC8vLyBvdmVyIDE2LWJpdCBvbmVzLgorICBib29sIFByZWYzMkJpdFRodW1iOworCisgIC8vLyBzdGFja0FsaWdubWVudCAtIFRoZSBtaW5pbXVtIGFsaWdubWVudCBrbm93biB0byBob2xkIG9mIHRoZSBzdGFjayBmcmFtZSBvbgorICAvLy8gZW50cnkgdG8gdGhlIGZ1bmN0aW9uIGFuZCB3aGljaCBtdXN0IGJlIG1haW50YWluZWQgYnkgZXZlcnkgZnVuY3Rpb24uCisgIHVuc2lnbmVkIHN0YWNrQWxpZ25tZW50OworCisgIC8vLyBDUFVTdHJpbmcgLSBTdHJpbmcgbmFtZSBvZiB1c2VkIENQVS4KKyAgc3RkOjpzdHJpbmcgQ1BVU3RyaW5nOworCisgIC8vLyBTZWxlY3RlZCBpbnN0cnVjdGlvbiBpdGluZXJhcmllcyAob25lIGVudHJ5IHBlciBpdGluZXJhcnkgY2xhc3MuKQorICBJbnN0ckl0aW5lcmFyeURhdGEgSW5zdHJJdGluczsKKworIHB1YmxpYzoKKyAgZW51bSB7CisgICAgaXNFTEYsIGlzRGFyd2luCisgIH0gVGFyZ2V0VHlwZTsKKworICBlbnVtIHsKKyAgICBBUk1fQUJJX0FQQ1MsCisgICAgQVJNX0FCSV9BQVBDUyAvLyBBUk0gRUFCSQorICB9IFRhcmdldEFCSTsKKworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgZGF0YSBtZW1iZXJzIHRvIG1hdGNoIHRoYXQKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgdHJpcGxlLgorICAvLy8KKyAgQVJNU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTLCBib29sIGlzVGh1bWIpOworCisgIC8vLyBnZXRNYXhJbmxpbmVTaXplVGhyZXNob2xkIC0gUmV0dXJucyB0aGUgbWF4aW11bSBtZW1zZXQgLyBtZW1jcHkgc2l6ZQorICAvLy8gdGhhdCBzdGlsbCBtYWtlcyBpdCBwcm9maXRhYmxlIHRvIGlubGluZSB0aGUgY2FsbC4KKyAgdW5zaWduZWQgZ2V0TWF4SW5saW5lU2l6ZVRocmVzaG9sZCgpIGNvbnN0IHsKKyAgICAvLyBGSVhNRTogRm9yIG5vdywgd2UgZG9uJ3QgbG93ZXIgbWVtY3B5J3MgdG8gbG9hZHMgLyBzdG9yZXMgZm9yIFRodW1iMS4KKyAgICAvLyBDaGFuZ2UgdGhpcyBvbmNlIFRodW1iMSBsZG1pYSAvIHN0bWlhIHN1cHBvcnQgaXMgYWRkZWQuCisgICAgcmV0dXJuIGlzVGh1bWIxT25seSgpID8gMCA6IDY0OworICB9CisgIC8vLyBQYXJzZVN1YnRhcmdldEZlYXR1cmVzIC0gUGFyc2VzIGZlYXR1cmVzIHN0cmluZyBzZXR0aW5nIHNwZWNpZmllZAorICAvLy8gc3VidGFyZ2V0IG9wdGlvbnMuICBEZWZpbml0aW9uIG9mIGZ1bmN0aW9uIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRibGdlbi4KKyAgc3RkOjpzdHJpbmcgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhjb25zdCBzdGQ6OnN0cmluZyAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkNQVSk7CisKKyAgYm9vbCBoYXNWNFRPcHMoKSAgY29uc3QgeyByZXR1cm4gQVJNQXJjaFZlcnNpb24gPj0gVjRUOyAgfQorICBib29sIGhhc1Y1VE9wcygpICBjb25zdCB7IHJldHVybiBBUk1BcmNoVmVyc2lvbiA+PSBWNVQ7ICB9CisgIGJvb2wgaGFzVjVURU9wcygpIGNvbnN0IHsgcmV0dXJuIEFSTUFyY2hWZXJzaW9uID49IFY1VEU7IH0KKyAgYm9vbCBoYXNWNk9wcygpICAgY29uc3QgeyByZXR1cm4gQVJNQXJjaFZlcnNpb24gPj0gVjY7ICAgfQorICBib29sIGhhc1Y2VDJPcHMoKSBjb25zdCB7IHJldHVybiBBUk1BcmNoVmVyc2lvbiA+PSBWNlQyOyB9CisgIGJvb2wgaGFzVjdPcHMoKSAgIGNvbnN0IHsgcmV0dXJuIEFSTUFyY2hWZXJzaW9uID49IFY3QTsgIH0KKworICBib29sIGhhc1ZGUDIoKSBjb25zdCB7IHJldHVybiBBUk1GUFVUeXBlID49IFZGUHYyOyB9CisgIGJvb2wgaGFzVkZQMygpIGNvbnN0IHsgcmV0dXJuIEFSTUZQVVR5cGUgPj0gVkZQdjM7IH0KKyAgYm9vbCBoYXNORU9OKCkgY29uc3QgeyByZXR1cm4gQVJNRlBVVHlwZSA+PSBORU9OOyAgfQorICBib29sIHVzZU5FT05Gb3JTaW5nbGVQcmVjaXNpb25GUCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzTkVPTigpICYmIFVzZU5FT05Gb3JTaW5nbGVQcmVjaXNpb25GUDsgfQorICBib29sIGhhc0RpdmlkZSgpIGNvbnN0IHsgcmV0dXJuIEhhc0hhcmR3YXJlRGl2aWRlOyB9CisgIGJvb2wgaGFzVDJFeHRyYWN0UGFjaygpIGNvbnN0IHsgcmV0dXJuIEhhc1QyRXh0cmFjdFBhY2s7IH0KKyAgYm9vbCB1c2VWTUx4KCkgY29uc3Qge3JldHVybiBoYXNWRlAyKCkgJiYgIVNsb3dWTUx4OyB9CisgIGJvb2wgaXNGUEJyY2NTbG93KCkgY29uc3QgeyByZXR1cm4gU2xvd0ZQQnJjYzsgfQorICBib29sIHByZWZlcnMzMkJpdFRodW1iKCkgY29uc3QgeyByZXR1cm4gUHJlZjMyQml0VGh1bWI7IH0KKworICBib29sIGhhc0ZQMTYoKSBjb25zdCB7IHJldHVybiBIYXNGUDE2OyB9CisKKyAgYm9vbCBpc1RhcmdldERhcndpbigpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFR5cGUgPT0gaXNEYXJ3aW47IH0KKyAgYm9vbCBpc1RhcmdldEVMRigpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFR5cGUgPT0gaXNFTEY7IH0KKworICBib29sIGlzQVBDU19BQkkoKSBjb25zdCB7IHJldHVybiBUYXJnZXRBQkkgPT0gQVJNX0FCSV9BUENTOyB9CisgIGJvb2wgaXNBQVBDU19BQkkoKSBjb25zdCB7IHJldHVybiBUYXJnZXRBQkkgPT0gQVJNX0FCSV9BQVBDUzsgfQorCisgIGJvb2wgaXNUaHVtYigpIGNvbnN0IHsgcmV0dXJuIElzVGh1bWI7IH0KKyAgYm9vbCBpc1RodW1iMU9ubHkoKSBjb25zdCB7IHJldHVybiBJc1RodW1iICYmIChUaHVtYk1vZGUgPT0gVGh1bWIxKTsgfQorICBib29sIGlzVGh1bWIyKCkgY29uc3QgeyByZXR1cm4gSXNUaHVtYiAmJiAoVGh1bWJNb2RlID09IFRodW1iMik7IH0KKyAgYm9vbCBoYXNUaHVtYjIoKSBjb25zdCB7IHJldHVybiBUaHVtYk1vZGUgPj0gVGh1bWIyOyB9CisKKyAgYm9vbCBpc1I5UmVzZXJ2ZWQoKSBjb25zdCB7IHJldHVybiBJc1I5UmVzZXJ2ZWQ7IH0KKworICBib29sIHVzZU1vdnQoKSBjb25zdCB7IHJldHVybiBVc2VNb3Z0ICYmIGhhc1Y2VDJPcHMoKTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nICYgZ2V0Q1BVU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gQ1BVU3RyaW5nOyB9CisKKyAgLy8vIGVuYWJsZVBvc3RSQVNjaGVkdWxlciAtIFRydWUgYXQgJ01vcmUnIG9wdGltaXphdGlvbi4KKyAgYm9vbCBlbmFibGVQb3N0UkFTY2hlZHVsZXIoQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFN1YnRhcmdldDo6QW50aURlcEJyZWFrTW9kZSYgTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnQ2xhc3NWZWN0b3ImIENyaXRpY2FsUGF0aFJDcykgY29uc3Q7CisKKyAgLy8vIGdldEluc3RySXRpbnMgLSBSZXR1cm4gdGhlIGluc3RydWN0aW9uIGl0aW5lcmFpZXMgYmFzZWQgb24gc3VidGFyZ2V0CisgIC8vLyBzZWxlY3Rpb24uCisgIGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAmZ2V0SW5zdHJJdGluZXJhcnlEYXRhKCkgY29uc3QgeyByZXR1cm4gSW5zdHJJdGluczsgfQorCisgIC8vLyBnZXRTdGFja0FsaWdubWVudCAtIFJldHVybnMgdGhlIG1pbmltdW0gYWxpZ25tZW50IGtub3duIHRvIGhvbGQgb2YgdGhlCisgIC8vLyBzdGFjayBmcmFtZSBvbiBlbnRyeSB0byB0aGUgZnVuY3Rpb24gYW5kIHdoaWNoIG11c3QgYmUgbWFpbnRhaW5lZCBieSBldmVyeQorICAvLy8gZnVuY3Rpb24gZm9yIHRoaXMgc3VidGFyZ2V0LgorICB1bnNpZ25lZCBnZXRTdGFja0FsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIHN0YWNrQWxpZ25tZW50OyB9CisKKyAgLy8vIEdWSXNJbmRpcmVjdFN5bWJvbCAtIHRydWUgaWYgdGhlIEdWIHdpbGwgYmUgYWNjZXNzZWQgdmlhIGFuIGluZGlyZWN0CisgIC8vLyBzeW1ib2wuCisgIGJvb2wgR1ZJc0luZGlyZWN0U3ltYm9sKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgUmVsb2M6Ok1vZGVsIFJlbG9jTSkgY29uc3Q7Cit9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmICAvLyBBUk1TVUJUQVJHRVRfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNVGFyZ2V0TWFjaGluZS5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1UYXJnZXRNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzliNmJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQVJNVGFyZ2V0TWFjaGluZS5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8vPT09LS0gQVJNVGFyZ2V0TWFjaGluZS5jcHAgLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgQVJNIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJBUk1UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiQVJNTUNBc21JbmZvLmgiCisjaW5jbHVkZSAiQVJNRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIE1DQXNtSW5mbyAqY3JlYXRlTUNBc21JbmZvKGNvbnN0IFRhcmdldCAmVCwgU3RyaW5nUmVmIFRUKSB7CisgIFRyaXBsZSBUaGVUcmlwbGUoVFQpOworICBzd2l0Y2ggKFRoZVRyaXBsZS5nZXRPUygpKSB7CisgIGNhc2UgVHJpcGxlOjpEYXJ3aW46CisgICAgcmV0dXJuIG5ldyBBUk1NQ0FzbUluZm9EYXJ3aW4oKTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gbmV3IEFSTUVMRk1DQXNtSW5mbygpOworICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUFSTVRhcmdldCgpIHsKKyAgLy8gUmVnaXN0ZXIgdGhlIHRhcmdldC4KKyAgUmVnaXN0ZXJUYXJnZXRNYWNoaW5lPEFSTVRhcmdldE1hY2hpbmU+IFgoVGhlQVJNVGFyZ2V0KTsKKyAgUmVnaXN0ZXJUYXJnZXRNYWNoaW5lPFRodW1iVGFyZ2V0TWFjaGluZT4gWShUaGVUaHVtYlRhcmdldCk7CisKKyAgLy8gUmVnaXN0ZXIgdGhlIHRhcmdldCBhc20gaW5mby4KKyAgUmVnaXN0ZXJBc21JbmZvRm4gQShUaGVBUk1UYXJnZXQsIGNyZWF0ZU1DQXNtSW5mbyk7CisgIFJlZ2lzdGVyQXNtSW5mb0ZuIEIoVGhlVGh1bWJUYXJnZXQsIGNyZWF0ZU1DQXNtSW5mbyk7Cit9CisKKy8vLyBUYXJnZXRNYWNoaW5lIGN0b3IgLSBDcmVhdGUgYW4gQVJNIGFyY2hpdGVjdHVyZSBtb2RlbC4KKy8vLworQVJNQmFzZVRhcmdldE1hY2hpbmU6OkFSTUJhc2VUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUaHVtYikKKyAgOiBMTFZNVGFyZ2V0TWFjaGluZShULCBUVCksCisgICAgU3VidGFyZ2V0KFRULCBGUywgaXNUaHVtYiksCisgICAgRnJhbWVJbmZvKFN1YnRhcmdldCksCisgICAgSklUSW5mbygpLAorICAgIEluc3RySXRpbnMoU3VidGFyZ2V0LmdldEluc3RySXRpbmVyYXJ5RGF0YSgpKSB7CisgIERlZlJlbG9jTW9kZWwgPSBnZXRSZWxvY2F0aW9uTW9kZWwoKTsKK30KKworQVJNVGFyZ2V0TWFjaGluZTo6QVJNVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKQorICA6IEFSTUJhc2VUYXJnZXRNYWNoaW5lKFQsIFRULCBGUywgZmFsc2UpLCBJbnN0ckluZm8oU3VidGFyZ2V0KSwKKyAgICBEYXRhTGF5b3V0KFN1YnRhcmdldC5pc0FQQ1NfQUJJKCkgPworICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoImUtcDozMjozMi1mNjQ6MzI6MzItaTY0OjMyOjMyLSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2MTI4OjMyOjEyOC12NjQ6MzI6NjQtbjMyIikgOgorICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoImUtcDozMjozMi1mNjQ6NjQ6NjQtaTY0OjY0OjY0LSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2MTI4OjY0OjEyOC12NjQ6NjQ6NjQtbjMyIikpLAorICAgIFRMSW5mbygqdGhpcyksCisgICAgVFNJbmZvKCp0aGlzKSB7Cit9CisKK1RodW1iVGFyZ2V0TWFjaGluZTo6VGh1bWJUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKQorICA6IEFSTUJhc2VUYXJnZXRNYWNoaW5lKFQsIFRULCBGUywgdHJ1ZSksCisgICAgSW5zdHJJbmZvKFN1YnRhcmdldC5oYXNUaHVtYjIoKQorICAgICAgICAgICAgICA/ICgoQVJNQmFzZUluc3RySW5mbyopbmV3IFRodW1iMkluc3RySW5mbyhTdWJ0YXJnZXQpKQorICAgICAgICAgICAgICA6ICgoQVJNQmFzZUluc3RySW5mbyopbmV3IFRodW1iMUluc3RySW5mbyhTdWJ0YXJnZXQpKSksCisgICAgRGF0YUxheW91dChTdWJ0YXJnZXQuaXNBUENTX0FCSSgpID8KKyAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJlLXA6MzI6MzItZjY0OjMyOjMyLWk2NDozMjozMi0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTE2OjE2OjMyLWk4Ojg6MzItaTE6ODozMi0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidjEyODozMjoxMjgtdjY0OjMyOjY0LWE6MDozMi1uMzIiKSA6CisgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiZS1wOjMyOjMyLWY2NDo2NDo2NC1pNjQ6NjQ6NjQtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImkxNjoxNjozMi1pODo4OjMyLWkxOjg6MzItIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInYxMjg6NjQ6MTI4LXY2NDo2NDo2NC1hOjA6MzItbjMyIikpLAorICAgIFRMSW5mbygqdGhpcyksCisgICAgVFNJbmZvKCp0aGlzKSB7Cit9CisKKy8vIFBhc3MgUGlwZWxpbmUgQ29uZmlndXJhdGlvbgorYm9vbCBBUk1CYXNlVGFyZ2V0TWFjaGluZTo6YWRkUHJlSVNlbChQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICBpZiAoT3B0TGV2ZWwgIT0gQ29kZUdlbk9wdDo6Tm9uZSkKKyAgICBQTS5hZGQoY3JlYXRlQVJNR2xvYmFsTWVyZ2VQYXNzKGdldFRhcmdldExvd2VyaW5nKCkpKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQVJNQmFzZVRhcmdldE1hY2hpbmU6OmFkZEluc3RTZWxlY3RvcihQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIFBNLmFkZChjcmVhdGVBUk1JU2VsRGFnKCp0aGlzLCBPcHRMZXZlbCkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQVJNQmFzZVRhcmdldE1hY2hpbmU6OmFkZFByZVJlZ0FsbG9jKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICBpZiAoU3VidGFyZ2V0Lmhhc05FT04oKSkKKyAgICBQTS5hZGQoY3JlYXRlTkVPTlByZUFsbG9jUGFzcygpKTsKKworICAvLyBGSVhNRTogdGVtcG9yYXJpbHkgZGlzYWJsaW5nIGxvYWQgLyBzdG9yZSBvcHRpbWl6YXRpb24gcGFzcyBmb3IgVGh1bWIxLgorICBpZiAoT3B0TGV2ZWwgIT0gQ29kZUdlbk9wdDo6Tm9uZSAmJiAhU3VidGFyZ2V0LmlzVGh1bWIxT25seSgpKQorICAgIFBNLmFkZChjcmVhdGVBUk1Mb2FkU3RvcmVPcHRpbWl6YXRpb25QYXNzKHRydWUpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBUk1CYXNlVGFyZ2V0TWFjaGluZTo6YWRkUHJlU2NoZWQyKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgLy8gRklYTUU6IHRlbXBvcmFyaWx5IGRpc2FibGluZyBsb2FkIC8gc3RvcmUgb3B0aW1pemF0aW9uIHBhc3MgZm9yIFRodW1iMS4KKyAgaWYgKE9wdExldmVsICE9IENvZGVHZW5PcHQ6Ok5vbmUpIHsKKyAgICBpZiAoIVN1YnRhcmdldC5pc1RodW1iMU9ubHkoKSkKKyAgICAgIFBNLmFkZChjcmVhdGVBUk1Mb2FkU3RvcmVPcHRpbWl6YXRpb25QYXNzKCkpOworICAgIGlmIChTdWJ0YXJnZXQuaGFzTkVPTigpKQorICAgICAgUE0uYWRkKGNyZWF0ZU5FT05Nb3ZlRml4UGFzcygpKTsKKyAgfQorCisgIC8vIEV4cGFuZCBzb21lIHBzZXVkbyBpbnN0cnVjdGlvbnMgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMgdG8gYWxsb3cKKyAgLy8gcHJvcGVyIHNjaGVkdWxpbmcuCisgIFBNLmFkZChjcmVhdGVBUk1FeHBhbmRQc2V1ZG9QYXNzKCkpOworCisgIGlmIChPcHRMZXZlbCAhPSBDb2RlR2VuT3B0OjpOb25lKSB7CisgICAgaWYgKCFTdWJ0YXJnZXQuaXNUaHVtYjFPbmx5KCkpCisgICAgICBQTS5hZGQoY3JlYXRlSWZDb252ZXJ0ZXJQYXNzKCkpOworICB9CisgIGlmIChTdWJ0YXJnZXQuaXNUaHVtYjIoKSkKKyAgICBQTS5hZGQoY3JlYXRlVGh1bWIySVRCbG9ja1Bhc3MoKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQVJNQmFzZVRhcmdldE1hY2hpbmU6OmFkZFByZUVtaXRQYXNzKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICBpZiAoU3VidGFyZ2V0LmlzVGh1bWIyKCkgJiYgIVN1YnRhcmdldC5wcmVmZXJzMzJCaXRUaHVtYigpKQorICAgIFBNLmFkZChjcmVhdGVUaHVtYjJTaXplUmVkdWN0aW9uUGFzcygpKTsKKworICBQTS5hZGQoY3JlYXRlQVJNQ29uc3RhbnRJc2xhbmRQYXNzKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBUk1CYXNlVGFyZ2V0TWFjaGluZTo6YWRkQ29kZUVtaXR0ZXIoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJkpDRSkgeworICAvLyBGSVhNRTogTW92ZSB0aGlzIHRvIFRhcmdldEpJVEluZm8hCisgIGlmIChEZWZSZWxvY01vZGVsID09IFJlbG9jOjpEZWZhdWx0KQorICAgIHNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6U3RhdGljKTsKKworICAvLyBNYWNoaW5lIGNvZGUgZW1pdHRlciBwYXNzIGZvciBBUk0uCisgIFBNLmFkZChjcmVhdGVBUk1KSVRDb2RlRW1pdHRlclBhc3MoKnRoaXMsIEpDRSkpOworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1UYXJnZXRNYWNoaW5lLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1UYXJnZXRNYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlNTQyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVRhcmdldE1hY2hpbmUuaApAQCAtMCwwICsxLDEyNSBAQAorLy89PT0tLSBBUk1UYXJnZXRNYWNoaW5lLmggLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgQVJNIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEFSTSBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRNYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQVJNVEFSR0VUTUFDSElORV9ICisjZGVmaW5lIEFSTVRBUkdFVE1BQ0hJTkVfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJBUk1JbnN0ckluZm8uaCIKKyNpbmNsdWRlICJBUk1GcmFtZUluZm8uaCIKKyNpbmNsdWRlICJBUk1KSVRJbmZvLmgiCisjaW5jbHVkZSAiQVJNU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiQVJNSVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiQVJNU2VsZWN0aW9uREFHSW5mby5oIgorI2luY2x1ZGUgIlRodW1iMUluc3RySW5mby5oIgorI2luY2x1ZGUgIlRodW1iMkluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFSTUJhc2VUYXJnZXRNYWNoaW5lIDogcHVibGljIExMVk1UYXJnZXRNYWNoaW5lIHsKK3Byb3RlY3RlZDoKKyAgQVJNU3VidGFyZ2V0ICAgICAgICBTdWJ0YXJnZXQ7CisKK3ByaXZhdGU6CisgIEFSTUZyYW1lSW5mbyAgICAgICAgRnJhbWVJbmZvOworICBBUk1KSVRJbmZvICAgICAgICAgIEpJVEluZm87CisgIEluc3RySXRpbmVyYXJ5RGF0YSAgSW5zdHJJdGluczsKKyAgUmVsb2M6Ok1vZGVsICAgICAgICBEZWZSZWxvY01vZGVsOyAgICAvLyBSZWxvYyBtb2RlbCBiZWZvcmUgaXQncyBvdmVycmlkZGVuLgorCitwdWJsaWM6CisgIEFSTUJhc2VUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMsIGJvb2wgaXNUaHVtYik7CisKKyAgdmlydHVhbCBjb25zdCBBUk1GcmFtZUluZm8gICAgICpnZXRGcmFtZUluZm8oKSBjb25zdCB7IHJldHVybiAmRnJhbWVJbmZvOyB9CisgIHZpcnR1YWwgICAgICAgQVJNSklUSW5mbyAgICAgICAqZ2V0SklUSW5mbygpICAgICAgICAgeyByZXR1cm4gJkpJVEluZm87IH0KKyAgdmlydHVhbCBjb25zdCBBUk1TdWJ0YXJnZXQgICpnZXRTdWJ0YXJnZXRJbXBsKCkgY29uc3QgeyByZXR1cm4gJlN1YnRhcmdldDsgfQorICB2aXJ0dWFsIGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSBnZXRJbnN0ckl0aW5lcmFyeURhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIEluc3RySXRpbnM7CisgIH0KKworICAvLyBQYXNzIFBpcGVsaW5lIENvbmZpZ3VyYXRpb24KKyAgdmlydHVhbCBib29sIGFkZFByZUlTZWwoUGFzc01hbmFnZXJCYXNlICZQTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworICB2aXJ0dWFsIGJvb2wgYWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKyAgdmlydHVhbCBib29sIGFkZFByZVJlZ0FsbG9jKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKyAgdmlydHVhbCBib29sIGFkZFByZVNjaGVkMihQYXNzTWFuYWdlckJhc2UgJlBNLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisgIHZpcnR1YWwgYm9vbCBhZGRQcmVFbWl0UGFzcyhQYXNzTWFuYWdlckJhc2UgJlBNLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisgIHZpcnR1YWwgYm9vbCBhZGRDb2RlRW1pdHRlcihQYXNzTWFuYWdlckJhc2UgJlBNLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZNQ0UpOworfTsKKworLy8vIEFSTVRhcmdldE1hY2hpbmUgLSBBUk0gdGFyZ2V0IG1hY2hpbmUuCisvLy8KK2NsYXNzIEFSTVRhcmdldE1hY2hpbmUgOiBwdWJsaWMgQVJNQmFzZVRhcmdldE1hY2hpbmUgeworICBBUk1JbnN0ckluZm8gICAgICAgIEluc3RySW5mbzsKKyAgY29uc3QgVGFyZ2V0RGF0YSAgICBEYXRhTGF5b3V0OyAgICAgICAvLyBDYWxjdWxhdGVzIHR5cGUgc2l6ZSAmIGFsaWdubWVudAorICBBUk1UYXJnZXRMb3dlcmluZyAgIFRMSW5mbzsKKyAgQVJNU2VsZWN0aW9uREFHSW5mbyBUU0luZm87CitwdWJsaWM6CisgIEFSTVRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKKworICB2aXJ0dWFsIGNvbnN0IEFSTVJlZ2lzdGVySW5mbyAgKmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gJkluc3RySW5mby5nZXRSZWdpc3RlckluZm8oKTsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgQVJNVGFyZ2V0TG93ZXJpbmcgKmdldFRhcmdldExvd2VyaW5nKCkgY29uc3QgeworICAgIHJldHVybiAmVExJbmZvOworICB9CisKKyAgdmlydHVhbCBjb25zdCBBUk1TZWxlY3Rpb25EQUdJbmZvKiBnZXRTZWxlY3Rpb25EQUdJbmZvKCkgY29uc3QgeworICAgIHJldHVybiAmVFNJbmZvOworICB9CisKKyAgdmlydHVhbCBjb25zdCBBUk1JbnN0ckluZm8gICAgICpnZXRJbnN0ckluZm8oKSBjb25zdCB7IHJldHVybiAmSW5zdHJJbmZvOyB9CisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0RGF0YSAgICAgICAqZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuICZEYXRhTGF5b3V0OyB9Cit9OworCisvLy8gVGh1bWJUYXJnZXRNYWNoaW5lIC0gVGh1bWIgdGFyZ2V0IG1hY2hpbmUuCisvLy8gRHVlIHRvIHRoZSB3YXkgYXJjaGl0ZWN0dXJlcyBhcmUgaGFuZGxlZCwgdGhpcyByZXByZXNlbnRzIGJvdGgKKy8vLyAgIFRodW1iLTEgYW5kIFRodW1iLTIuCisvLy8KK2NsYXNzIFRodW1iVGFyZ2V0TWFjaGluZSA6IHB1YmxpYyBBUk1CYXNlVGFyZ2V0TWFjaGluZSB7CisgIC8vIEVpdGhlciBUaHVtYjFJbnN0ckluZm8gb3IgVGh1bWIySW5zdHJJbmZvLgorICBPd25pbmdQdHI8QVJNQmFzZUluc3RySW5mbz4gSW5zdHJJbmZvOworICBjb25zdCBUYXJnZXREYXRhICAgIERhdGFMYXlvdXQ7ICAgLy8gQ2FsY3VsYXRlcyB0eXBlIHNpemUgJiBhbGlnbm1lbnQKKyAgQVJNVGFyZ2V0TG93ZXJpbmcgICBUTEluZm87CisgIEFSTVNlbGVjdGlvbkRBR0luZm8gVFNJbmZvOworcHVibGljOgorICBUaHVtYlRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpOworCisgIC8vLyByZXR1cm5zIGVpdGhlciBUaHVtYjFSZWdpc3RlckluZm8gb3IgVGh1bWIyUmVnaXN0ZXJJbmZvCisgIHZpcnR1YWwgY29uc3QgQVJNQmFzZVJlZ2lzdGVySW5mbyAqZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeworICAgIHJldHVybiAmSW5zdHJJbmZvLT5nZXRSZWdpc3RlckluZm8oKTsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgQVJNVGFyZ2V0TG93ZXJpbmcgKmdldFRhcmdldExvd2VyaW5nKCkgY29uc3QgeworICAgIHJldHVybiAmVExJbmZvOworICB9CisKKyAgdmlydHVhbCBjb25zdCBBUk1TZWxlY3Rpb25EQUdJbmZvICpnZXRTZWxlY3Rpb25EQUdJbmZvKCkgY29uc3QgeworICAgIHJldHVybiAmVFNJbmZvOworICB9CisKKyAgLy8vIHJldHVybnMgZWl0aGVyIFRodW1iMUluc3RySW5mbyBvciBUaHVtYjJJbnN0ckluZm8KKyAgdmlydHVhbCBjb25zdCBBUk1CYXNlSW5zdHJJbmZvICpnZXRJbnN0ckluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIEluc3RySW5mby5nZXQoKTsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IFRhcmdldERhdGEgICAgICAgKmdldFRhcmdldERhdGEoKSBjb25zdCB7IHJldHVybiAmRGF0YUxheW91dDsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1UYXJnZXRPYmplY3RGaWxlLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVRhcmdldE9iamVjdEZpbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MWEzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1UYXJnZXRPYmplY3RGaWxlLmNwcApAQCAtMCwwICsxLDM5IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L0FSTVRhcmdldE9iamVjdEZpbGUuY3BwIC0gQVJNIE9iamVjdCBJbmZvIEltcGwgLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNVGFyZ2V0T2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgIkFSTVN1YnRhcmdldC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25FTEYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIG5hbWVzcGFjZSBkd2FyZjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRiBUYXJnZXQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgQVJNRWxmVGFyZ2V0T2JqZWN0RmlsZTo6SW5pdGlhbGl6ZShNQ0NvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgeworICBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEY6OkluaXRpYWxpemUoQ3R4LCBUTSk7CisKKyAgaWYgKFRNLmdldFN1YnRhcmdldDxBUk1TdWJ0YXJnZXQ+KCkuaXNBQVBDU19BQkkoKSkgeworICAgIFN0YXRpY0N0b3JTZWN0aW9uID0KKyAgICAgIGdldENvbnRleHQoKS5nZXRFTEZTZWN0aW9uKCIuaW5pdF9hcnJheSIsIE1DU2VjdGlvbkVMRjo6U0hUX0lOSVRfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9XUklURSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9BTExPQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kOjpnZXREYXRhUmVsKCkpOworICAgIFN0YXRpY0R0b3JTZWN0aW9uID0KKyAgICAgIGdldENvbnRleHQoKS5nZXRFTEZTZWN0aW9uKCIuZmluaV9hcnJheSIsIE1DU2VjdGlvbkVMRjo6U0hUX0ZJTklfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9XUklURSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9BTExPQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kOjpnZXREYXRhUmVsKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1UYXJnZXRPYmplY3RGaWxlLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9BUk1UYXJnZXRPYmplY3RGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3ZmMyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FSTVRhcmdldE9iamVjdEZpbGUuaApAQCAtMCwwICsxLDI5IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L0FSTVRhcmdldE9iamVjdEZpbGUuaCAtIEFSTSBPYmplY3QgSW5mbyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX0FSTV9UQVJHRVRPQkpFQ1RGSUxFX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfQVJNX1RBUkdFVE9CSkVDVEZJTEVfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZUltcGwuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCitjbGFzcyBBUk1FbGZUYXJnZXRPYmplY3RGaWxlIDogcHVibGljIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRiB7CitwdWJsaWM6CisgIEFSTUVsZlRhcmdldE9iamVjdEZpbGUoKSA6IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRigpIHt9CisKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoTUNDb250ZXh0ICZDdHgsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUGFyc2VyL0FSTUFzbUxleGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVBhcnNlci9BUk1Bc21MZXhlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1OWQxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVBhcnNlci9BUk1Bc21MZXhlci5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8vPT09LS0gQVJNQXNtTGV4ZXIuY3BwIC0gVG9rZW5pemUgQVJNIGFzc2VtYmx5IHRvIEFzbVRva2VucyAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1UYXJnZXRNYWNoaW5lLmgiCisKKyNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DUGFyc2VkQXNtT3BlcmFuZC5oIgorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICAKKyAgY2xhc3MgQVJNQmFzZUFzbUxleGVyIDogcHVibGljIFRhcmdldEFzbUxleGVyIHsKKyAgICBjb25zdCBNQ0FzbUluZm8gJkFzbUluZm87CisgICAgCisgICAgY29uc3QgQXNtVG9rZW4gJmxleERlZmluaXRlKCkgeworICAgICAgcmV0dXJuIGdldExleGVyKCktPkxleCgpOworICAgIH0KKyAgICAKKyAgICBBc21Ub2tlbiBMZXhUb2tlblVBTCgpOworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBzdGQ6Om1hcCA8c3RkOjpzdHJpbmcsIHVuc2lnbmVkPiBybWFwX3R5OworICAgIAorICAgIHJtYXBfdHkgUmVnaXN0ZXJNYXA7CisgICAgCisgICAgdm9pZCBJbml0UmVnaXN0ZXJNYXAoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICppbmZvKSB7CisgICAgICB1bnNpZ25lZCBudW1SZWdzID0gaW5mby0+Z2V0TnVtUmVncygpOworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtUmVnczsgKytpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnJlZ05hbWUgPSBpbmZvLT5nZXROYW1lKGkpOworICAgICAgICBpZiAocmVnTmFtZSkKKyAgICAgICAgICBSZWdpc3Rlck1hcFtyZWdOYW1lXSA9IGk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIE1hdGNoUmVnaXN0ZXJOYW1lKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgICBybWFwX3R5OjppdGVyYXRvciBpdGVyID0gUmVnaXN0ZXJNYXAuZmluZChOYW1lLnN0cigpKTsKKyAgICAgIGlmIChpdGVyICE9IFJlZ2lzdGVyTWFwLmVuZCgpKQorICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgQXNtVG9rZW4gTGV4VG9rZW4oKSB7CisgICAgICBpZiAoIUxleGVyKSB7CisgICAgICAgIFNldEVycm9yKFNNTG9jKCksICJObyBNQ0FzbUxleGVyIGluc3RhbGxlZCIpOworICAgICAgICByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OkVycm9yLCAiIiwgMCk7CisgICAgICB9CisgICAgICAKKyAgICAgIHN3aXRjaCAoQXNtSW5mby5nZXRBc3NlbWJsZXJEaWFsZWN0KCkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIFNldEVycm9yKFNNTG9jKCksICJVbmhhbmRsZWQgZGlhbGVjdCIpOworICAgICAgICByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OkVycm9yLCAiIiwgMCk7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBMZXhUb2tlblVBTCgpOworICAgICAgfQorICAgIH0KKyAgcHVibGljOgorICAgIEFSTUJhc2VBc21MZXhlcihjb25zdCBUYXJnZXQgJlQsIGNvbnN0IE1DQXNtSW5mbyAmTUFJKQorICAgICAgOiBUYXJnZXRBc21MZXhlcihUKSwgQXNtSW5mbyhNQUkpIHsKKyAgICB9CisgIH07CisgIAorICBjbGFzcyBBUk1Bc21MZXhlciA6IHB1YmxpYyBBUk1CYXNlQXNtTGV4ZXIgeworICBwdWJsaWM6CisgICAgQVJNQXNtTGV4ZXIoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBNQ0FzbUluZm8gJk1BSSkKKyAgICAgIDogQVJNQmFzZUFzbUxleGVyKFQsIE1BSSkgeworICAgICAgc3RkOjpzdHJpbmcgdHJpcGxlU3RyaW5nKCJhcm0tdW5rbm93bi11bmtub3duIik7CisgICAgICBzdGQ6OnN0cmluZyBmZWF0dXJlU3RyaW5nOworICAgICAgT3duaW5nUHRyPGNvbnN0IFRhcmdldE1hY2hpbmU+IAorICAgICAgICB0YXJnZXRNYWNoaW5lKFQuY3JlYXRlVGFyZ2V0TWFjaGluZSh0cmlwbGVTdHJpbmcsIGZlYXR1cmVTdHJpbmcpKTsKKyAgICAgIEluaXRSZWdpc3Rlck1hcCh0YXJnZXRNYWNoaW5lLT5nZXRSZWdpc3RlckluZm8oKSk7CisgICAgfQorICB9OworICAKKyAgY2xhc3MgVGh1bWJBc21MZXhlciA6IHB1YmxpYyBBUk1CYXNlQXNtTGV4ZXIgeworICBwdWJsaWM6CisgICAgVGh1bWJBc21MZXhlcihjb25zdCBUYXJnZXQgJlQsIGNvbnN0IE1DQXNtSW5mbyAmTUFJKQorICAgICAgOiBBUk1CYXNlQXNtTGV4ZXIoVCwgTUFJKSB7CisgICAgICBzdGQ6OnN0cmluZyB0cmlwbGVTdHJpbmcoInRodW1iLXVua25vd24tdW5rbm93biIpOworICAgICAgc3RkOjpzdHJpbmcgZmVhdHVyZVN0cmluZzsKKyAgICAgIE93bmluZ1B0cjxjb25zdCBUYXJnZXRNYWNoaW5lPiAKKyAgICAgICAgdGFyZ2V0TWFjaGluZShULmNyZWF0ZVRhcmdldE1hY2hpbmUodHJpcGxlU3RyaW5nLCBmZWF0dXJlU3RyaW5nKSk7CisgICAgICBJbml0UmVnaXN0ZXJNYXAodGFyZ2V0TWFjaGluZS0+Z2V0UmVnaXN0ZXJJbmZvKCkpOworICAgIH0KKyAgfTsKK30KKworQXNtVG9rZW4gQVJNQmFzZUFzbUxleGVyOjpMZXhUb2tlblVBTCgpIHsKKyAgY29uc3QgQXNtVG9rZW4gJmxleGVkVG9rZW4gPSBsZXhEZWZpbml0ZSgpOworICAKKyAgc3dpdGNoIChsZXhlZFRva2VuLmdldEtpbmQoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBBc21Ub2tlbihsZXhlZFRva2VuKTsKKyAgY2FzZSBBc21Ub2tlbjo6RXJyb3I6CisgICAgU2V0RXJyb3IoTGV4ZXItPmdldEVyckxvYygpLCBMZXhlci0+Z2V0RXJyKCkpOworICAgIHJldHVybiBBc21Ub2tlbihsZXhlZFRva2VuKTsKKyAgY2FzZSBBc21Ub2tlbjo6SWRlbnRpZmllcjoKKyAgeworICAgIHN0ZDo6c3RyaW5nIHVwcGVyQ2FzZSA9IGxleGVkVG9rZW4uZ2V0U3RyaW5nKCkuc3RyKCk7CisgICAgc3RkOjpzdHJpbmcgbG93ZXJDYXNlID0gTG93ZXJjYXNlU3RyaW5nKHVwcGVyQ2FzZSk7CisgICAgU3RyaW5nUmVmIGxvd2VyUmVmKGxvd2VyQ2FzZSk7CisgICAgCisgICAgdW5zaWduZWQgcmVnSUQgPSBNYXRjaFJlZ2lzdGVyTmFtZShsb3dlclJlZik7CisgICAgCisgICAgaWYgKHJlZ0lEKSB7CisgICAgICByZXR1cm4gQXNtVG9rZW4oQXNtVG9rZW46OlJlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGxleGVkVG9rZW4uZ2V0U3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmVnSUQpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEFzbVRva2VuKGxleGVkVG9rZW4pOworICAgIH0KKyAgfQorICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUFSTUFzbUxleGVyKCkgeworICBSZWdpc3RlckFzbUxleGVyPEFSTUFzbUxleGVyPiBYKFRoZUFSTVRhcmdldCk7CisgIFJlZ2lzdGVyQXNtTGV4ZXI8VGh1bWJBc21MZXhlcj4gWShUaGVUaHVtYlRhcmdldCk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVBhcnNlci9BUk1Bc21QYXJzZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUGFyc2VyL0FSTUFzbVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwZWY2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVBhcnNlci9BUk1Bc21QYXJzZXIuY3BwCkBAIC0wLDAgKzEsODEyIEBACisvLz09PS0tIEFSTUFzbVBhcnNlci5jcHAgLSBQYXJzZSBBUk0gYXNzZW1ibHkgdG8gTUNJbnN0IGluc3RydWN0aW9ucyAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNQYXJzZWRBc21PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtUGFyc2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2Ugeworc3RydWN0IEFSTU9wZXJhbmQ7CisKKy8vIFRoZSBzaGlmdCB0eXBlcyBmb3IgcmVnaXN0ZXIgY29udHJvbGxlZCBzaGlmdHMgaW4gYXJtIG1lbW9yeSBhZGRyZXNzaW5nCitlbnVtIFNoaWZ0VHlwZSB7CisgIExzbCwKKyAgTHNyLAorICBBc3IsCisgIFJvciwKKyAgUnJ4Cit9OworCitjbGFzcyBBUk1Bc21QYXJzZXIgOiBwdWJsaWMgVGFyZ2V0QXNtUGFyc2VyIHsKKyAgTUNBc21QYXJzZXIgJlBhcnNlcjsKKyAgVGFyZ2V0TWFjaGluZSAmVE07CisKK3ByaXZhdGU6CisgIE1DQXNtUGFyc2VyICZnZXRQYXJzZXIoKSBjb25zdCB7IHJldHVybiBQYXJzZXI7IH0KKworICBNQ0FzbUxleGVyICZnZXRMZXhlcigpIGNvbnN0IHsgcmV0dXJuIFBhcnNlci5nZXRMZXhlcigpOyB9CisKKyAgdm9pZCBXYXJuaW5nKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2cpIHsgUGFyc2VyLldhcm5pbmcoTCwgTXNnKTsgfQorCisgIGJvb2wgRXJyb3IoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1zZykgeyByZXR1cm4gUGFyc2VyLkVycm9yKEwsIE1zZyk7IH0KKworICBib29sIE1heWJlUGFyc2VSZWdpc3RlcihPd25pbmdQdHI8QVJNT3BlcmFuZD4gJk9wLCBib29sIFBhcnNlV3JpdGVCYWNrKTsKKworICBib29sIFBhcnNlUmVnaXN0ZXJMaXN0KE93bmluZ1B0cjxBUk1PcGVyYW5kPiAmT3ApOworCisgIGJvb2wgUGFyc2VNZW1vcnkoT3duaW5nUHRyPEFSTU9wZXJhbmQ+ICZPcCk7CisKKyAgYm9vbCBQYXJzZU1lbW9yeU9mZnNldFJlZyhib29sICZOZWdhdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZPZmZzZXRSZWdTaGlmdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gU2hpZnRUeXBlICZTaGlmdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByIComU2hpZnRBbW91bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByIComT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJk9mZnNldElzUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmT2Zmc2V0UmVnTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jICZFKTsKKworICBib29sIFBhcnNlU2hpZnQoZW51bSBTaGlmdFR5cGUgJlN0LCBjb25zdCBNQ0V4cHIgKiZTaGlmdEFtb3VudCwgU01Mb2MgJkUpOworCisgIGJvb2wgUGFyc2VPcGVyYW5kKE93bmluZ1B0cjxBUk1PcGVyYW5kPiAmT3ApOworCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVXb3JkKHVuc2lnbmVkIFNpemUsIFNNTG9jIEwpOworCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVUaHVtYihTTUxvYyBMKTsKKworICBib29sIFBhcnNlRGlyZWN0aXZlVGh1bWJGdW5jKFNNTG9jIEwpOworCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVDb2RlKFNNTG9jIEwpOworCisgIGJvb2wgUGFyc2VEaXJlY3RpdmVTeW50YXgoU01Mb2MgTCk7CisKKyAgLy8gVE9ETyAtIEZvciBub3cgaGFja2VkIHZlcnNpb25zIG9mIHRoZSBuZXh0IHR3byBhcmUgaW4gaGVyZSBpbiB0aGlzIGZpbGUgdG8KKyAgLy8gYWxsb3cgc29tZSBwYXJzZXIgdGVzdGluZyB1bnRpbCB0aGUgdGFibGUgZ2VuIHZlcnNpb25zIGFyZSBpbXBsZW1lbnRlZC4KKworICAvLy8gQG5hbWUgQXV0by1nZW5lcmF0ZWQgTWF0Y2ggRnVuY3Rpb25zCisgIC8vLyB7CisgIGJvb2wgTWF0Y2hJbnN0cnVjdGlvbihjb25zdCBTbWFsbFZlY3RvckltcGw8TUNQYXJzZWRBc21PcGVyYW5kKj4gJk9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTUNJbnN0ICZJbnN0KTsKKworICAvLy8gTWF0Y2hSZWdpc3Rlck5hbWUgLSBNYXRjaCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIGEgcmVnaXN0ZXIgbmFtZSBhbmQgcmV0dXJuCisgIC8vLyBpdHMgcmVnaXN0ZXIgbnVtYmVyLCBvciAtMSBpZiB0aGVyZSBpcyBubyBtYXRjaC4gIFRvIGFsbG93IHJldHVybiB2YWx1ZXMKKyAgLy8vIHRvIGJlIHVzZWQgZGlyZWN0bHkgaW4gcmVnaXN0ZXIgbGlzdHMsIGFybSByZWdpc3RlcnMgaGF2ZSB2YWx1ZXMgYmV0d2VlbgorICAvLy8gMCBhbmQgMTUuCisgIGludCBNYXRjaFJlZ2lzdGVyTmFtZShTdHJpbmdSZWYgTmFtZSk7CisKKyAgLy8vIH0KKworCitwdWJsaWM6CisgIEFSTUFzbVBhcnNlcihjb25zdCBUYXJnZXQgJlQsIE1DQXNtUGFyc2VyICZfUGFyc2VyLCBUYXJnZXRNYWNoaW5lICZfVE0pCisgICAgOiBUYXJnZXRBc21QYXJzZXIoVCksIFBhcnNlcihfUGFyc2VyKSwgVE0oX1RNKSB7fQorCisgIHZpcnR1YWwgYm9vbCBQYXJzZUluc3RydWN0aW9uKFN0cmluZ1JlZiBOYW1lLCBTTUxvYyBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TUNQYXJzZWRBc21PcGVyYW5kKj4gJk9wZXJhbmRzKTsKKworICB2aXJ0dWFsIGJvb2wgUGFyc2VEaXJlY3RpdmUoQXNtVG9rZW4gRGlyZWN0aXZlSUQpOworfTsKKyAgCisvLy8gQVJNT3BlcmFuZCAtIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHBhcnNlZCBBUk0gbWFjaGluZQorLy8vIGluc3RydWN0aW9uLgorc3RydWN0IEFSTU9wZXJhbmQgOiBwdWJsaWMgTUNQYXJzZWRBc21PcGVyYW5kIHsKK3ByaXZhdGU6CisgIEFSTU9wZXJhbmQoKSB7fQorcHVibGljOgorICBlbnVtIEtpbmRUeSB7CisgICAgVG9rZW4sCisgICAgUmVnaXN0ZXIsCisgICAgSW1tZWRpYXRlLAorICAgIE1lbW9yeQorICB9IEtpbmQ7CisKKyAgU01Mb2MgU3RhcnRMb2MsIEVuZExvYzsKKworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIGNvbnN0IGNoYXIgKkRhdGE7CisgICAgICB1bnNpZ25lZCBMZW5ndGg7CisgICAgfSBUb2s7CisKKyAgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgUmVnTnVtOworICAgICAgYm9vbCBXcml0ZWJhY2s7CisgICAgfSBSZWc7CisKKyAgICBzdHJ1Y3QgeworICAgICAgY29uc3QgTUNFeHByICpWYWw7CisgICAgfSBJbW07CisgICAgCisgICAgLy8gVGhpcyBpcyBmb3IgYWxsIGZvcm1zIG9mIEFSTSBhZGRyZXNzIGV4cHJlc3Npb25zCisgICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIEJhc2VSZWdOdW07CisgICAgICB1bnNpZ25lZCBPZmZzZXRSZWdOdW07IC8vIHVzZWQgd2hlbiBPZmZzZXRJc1JlZyBpcyB0cnVlCisgICAgICBjb25zdCBNQ0V4cHIgKk9mZnNldDsgLy8gdXNlZCB3aGVuIE9mZnNldElzUmVnIGlzIGZhbHNlCisgICAgICBjb25zdCBNQ0V4cHIgKlNoaWZ0QW1vdW50OyAvLyB1c2VkIHdoZW4gT2Zmc2V0UmVnU2hpZnRlZCBpcyB0cnVlCisgICAgICBlbnVtIFNoaWZ0VHlwZSBTaGlmdFR5cGU7ICAvLyB1c2VkIHdoZW4gT2Zmc2V0UmVnU2hpZnRlZCBpcyB0cnVlCisgICAgICB1bnNpZ25lZAorICAgICAgICBPZmZzZXRSZWdTaGlmdGVkIDogMSwgLy8gb25seSB1c2VkIHdoZW4gT2Zmc2V0SXNSZWcgaXMgdHJ1ZQorICAgICAgICBQcmVpbmRleGVkIDogMSwKKyAgICAgICAgUG9zdGluZGV4ZWQgOiAxLAorICAgICAgICBPZmZzZXRJc1JlZyA6IDEsCisgICAgICAgIE5lZ2F0aXZlIDogMSwgLy8gb25seSB1c2VkIHdoZW4gT2Zmc2V0SXNSZWcgaXMgdHJ1ZQorICAgICAgICBXcml0ZWJhY2sgOiAxOworICAgIH0gTWVtOworCisgIH07CisgIAorICBBUk1PcGVyYW5kKEtpbmRUeSBLLCBTTUxvYyBTLCBTTUxvYyBFKQorICAgIDogS2luZChLKSwgU3RhcnRMb2MoUyksIEVuZExvYyhFKSB7fQorICAKKyAgQVJNT3BlcmFuZChjb25zdCBBUk1PcGVyYW5kICZvKSA6IE1DUGFyc2VkQXNtT3BlcmFuZCgpIHsKKyAgICBLaW5kID0gby5LaW5kOworICAgIFN0YXJ0TG9jID0gby5TdGFydExvYzsKKyAgICBFbmRMb2MgPSBvLkVuZExvYzsKKyAgICBzd2l0Y2ggKEtpbmQpIHsKKyAgICBjYXNlIFRva2VuOgorICAgIFRvayA9IG8uVG9rOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSZWdpc3RlcjoKKyAgICAgIFJlZyA9IG8uUmVnOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbW1lZGlhdGU6CisgICAgICBJbW0gPSBvLkltbTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWVtb3J5OgorICAgICAgTWVtID0gby5NZW07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgCisgIC8vLyBnZXRTdGFydExvYyAtIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHRva2VuIG9mIHRoaXMgb3BlcmFuZC4KKyAgU01Mb2MgZ2V0U3RhcnRMb2MoKSBjb25zdCB7IHJldHVybiBTdGFydExvYzsgfQorICAvLy8gZ2V0RW5kTG9jIC0gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCB0b2tlbiBvZiB0aGlzIG9wZXJhbmQuCisgIFNNTG9jIGdldEVuZExvYygpIGNvbnN0IHsgcmV0dXJuIEVuZExvYzsgfQorCisgIFN0cmluZ1JlZiBnZXRUb2tlbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBUb2tlbiAmJiAiSW52YWxpZCBhY2Nlc3MhIik7CisgICAgcmV0dXJuIFN0cmluZ1JlZihUb2suRGF0YSwgVG9rLkxlbmd0aCk7CisgIH0KKworICB1bnNpZ25lZCBnZXRSZWcoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gUmVnaXN0ZXIgJiYgIkludmFsaWQgYWNjZXNzISIpOworICAgIHJldHVybiBSZWcuUmVnTnVtOworICB9CisKKyAgY29uc3QgTUNFeHByICpnZXRJbW0oKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gSW1tZWRpYXRlICYmICJJbnZhbGlkIGFjY2VzcyEiKTsKKyAgICByZXR1cm4gSW1tLlZhbDsKKyAgfQorCisgIGJvb2wgaXNUb2tlbigpIGNvbnN0IHtyZXR1cm4gS2luZCA9PSBUb2tlbjsgfQorCisgIGJvb2wgaXNSZWcoKSBjb25zdCB7IHJldHVybiBLaW5kID09IFJlZ2lzdGVyOyB9CisKKyAgdm9pZCBhZGRSZWdPcGVyYW5kcyhNQ0luc3QgJkluc3QsIHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoTiA9PSAxICYmICJJbnZhbGlkIG51bWJlciBvZiBvcGVyYW5kcyEiKTsKKyAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnKCkpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIENyZWF0ZVRva2VuKE93bmluZ1B0cjxBUk1PcGVyYW5kPiAmT3AsIFN0cmluZ1JlZiBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIFMpIHsKKyAgICBPcC5yZXNldChuZXcgQVJNT3BlcmFuZCk7CisgICAgT3AtPktpbmQgPSBUb2tlbjsKKyAgICBPcC0+VG9rLkRhdGEgPSBTdHIuZGF0YSgpOworICAgIE9wLT5Ub2suTGVuZ3RoID0gU3RyLnNpemUoKTsKKyAgICBPcC0+U3RhcnRMb2MgPSBTOworICAgIE9wLT5FbmRMb2MgPSBTOworICB9CisKKyAgc3RhdGljIHZvaWQgQ3JlYXRlUmVnKE93bmluZ1B0cjxBUk1PcGVyYW5kPiAmT3AsIHVuc2lnbmVkIFJlZ051bSwgCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIFdyaXRlYmFjaywgU01Mb2MgUywgU01Mb2MgRSkgeworICAgIE9wLnJlc2V0KG5ldyBBUk1PcGVyYW5kKTsKKyAgICBPcC0+S2luZCA9IFJlZ2lzdGVyOworICAgIE9wLT5SZWcuUmVnTnVtID0gUmVnTnVtOworICAgIE9wLT5SZWcuV3JpdGViYWNrID0gV3JpdGViYWNrOworICAgIAorICAgIE9wLT5TdGFydExvYyA9IFM7CisgICAgT3AtPkVuZExvYyA9IEU7CisgIH0KKworICBzdGF0aWMgdm9pZCBDcmVhdGVJbW0oT3duaW5nUHRyPEFSTU9wZXJhbmQ+ICZPcCwgY29uc3QgTUNFeHByICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBTLCBTTUxvYyBFKSB7CisgICAgT3AucmVzZXQobmV3IEFSTU9wZXJhbmQpOworICAgIE9wLT5LaW5kID0gSW1tZWRpYXRlOworICAgIE9wLT5JbW0uVmFsID0gVmFsOworICAgIAorICAgIE9wLT5TdGFydExvYyA9IFM7CisgICAgT3AtPkVuZExvYyA9IEU7CisgIH0KKworICBzdGF0aWMgdm9pZCBDcmVhdGVNZW0oT3duaW5nUHRyPEFSTU9wZXJhbmQ+ICZPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJhc2VSZWdOdW0sIGJvb2wgT2Zmc2V0SXNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0V4cHIgKk9mZnNldCwgdW5zaWduZWQgT2Zmc2V0UmVnTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPZmZzZXRSZWdTaGlmdGVkLCBlbnVtIFNoaWZ0VHlwZSBTaGlmdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0V4cHIgKlNoaWZ0QW1vdW50LCBib29sIFByZWluZGV4ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBvc3RpbmRleGVkLCBib29sIE5lZ2F0aXZlLCBib29sIFdyaXRlYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIFMsIFNNTG9jIEUpIHsKKyAgICBPcC5yZXNldChuZXcgQVJNT3BlcmFuZCk7CisgICAgT3AtPktpbmQgPSBNZW1vcnk7CisgICAgT3AtPk1lbS5CYXNlUmVnTnVtID0gQmFzZVJlZ051bTsKKyAgICBPcC0+TWVtLk9mZnNldElzUmVnID0gT2Zmc2V0SXNSZWc7CisgICAgT3AtPk1lbS5PZmZzZXQgPSBPZmZzZXQ7CisgICAgT3AtPk1lbS5PZmZzZXRSZWdOdW0gPSBPZmZzZXRSZWdOdW07CisgICAgT3AtPk1lbS5PZmZzZXRSZWdTaGlmdGVkID0gT2Zmc2V0UmVnU2hpZnRlZDsKKyAgICBPcC0+TWVtLlNoaWZ0VHlwZSA9IFNoaWZ0VHlwZTsKKyAgICBPcC0+TWVtLlNoaWZ0QW1vdW50ID0gU2hpZnRBbW91bnQ7CisgICAgT3AtPk1lbS5QcmVpbmRleGVkID0gUHJlaW5kZXhlZDsKKyAgICBPcC0+TWVtLlBvc3RpbmRleGVkID0gUG9zdGluZGV4ZWQ7CisgICAgT3AtPk1lbS5OZWdhdGl2ZSA9IE5lZ2F0aXZlOworICAgIE9wLT5NZW0uV3JpdGViYWNrID0gV3JpdGViYWNrOworICAgIAorICAgIE9wLT5TdGFydExvYyA9IFM7CisgICAgT3AtPkVuZExvYyA9IEU7CisgIH0KK307CisKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKKy8vLyBUcnkgdG8gcGFyc2UgYSByZWdpc3RlciBuYW1lLiAgVGhlIHRva2VuIG11c3QgYmUgYW4gSWRlbnRpZmllciB3aGVuIGNhbGxlZCwKKy8vLyBhbmQgaWYgaXQgaXMgYSByZWdpc3RlciBuYW1lIGEgUmVnIG9wZXJhbmQgaXMgY3JlYXRlZCwgdGhlIHRva2VuIGlzIGVhdGVuCisvLy8gYW5kIGZhbHNlIGlzIHJldHVybmVkLiAgRWxzZSB0cnVlIGlzIHJldHVybmVkIGFuZCBubyB0b2tlbiBpcyBlYXRlbi4KKy8vLyBUT0RPIHRoaXMgaXMgbGlrZWx5IHRvIGNoYW5nZSB0byBhbGxvdyBkaWZmZXJlbnQgcmVnaXN0ZXIgdHlwZXMgYW5kIG9yIHRvCisvLy8gcGFyc2UgZm9yIGEgc3BlY2lmaWMgcmVnaXN0ZXIgdHlwZS4KK2Jvb2wgQVJNQXNtUGFyc2VyOjpNYXliZVBhcnNlUmVnaXN0ZXIKKyAgKE93bmluZ1B0cjxBUk1PcGVyYW5kPiAmT3AsIGJvb2wgUGFyc2VXcml0ZUJhY2spIHsKKyAgU01Mb2MgUywgRTsKKyAgY29uc3QgQXNtVG9rZW4gJlRvayA9IFBhcnNlci5nZXRUb2soKTsKKyAgYXNzZXJ0KFRvay5pcyhBc21Ub2tlbjo6SWRlbnRpZmllcikgJiYgIlRva2VuIGlzIG5vdCBhbiBJZGVudGlmaWVyIik7CisKKyAgLy8gRklYTUU6IFZhbGlkYXRlIHJlZ2lzdGVyIGZvciB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmU7IHdlIGhhdmUgdG8gZG8KKyAgLy8gdmFsaWRhdGlvbiBsYXRlciwgc28gbWF5YmUgdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhpcyBoZXJlLgorICBpbnQgUmVnTnVtOworCisgIFJlZ051bSA9IE1hdGNoUmVnaXN0ZXJOYW1lKFRvay5nZXRTdHJpbmcoKSk7CisgIGlmIChSZWdOdW0gPT0gLTEpCisgICAgcmV0dXJuIHRydWU7CisgIAorICBTID0gVG9rLmdldExvYygpOworICAKKyAgUGFyc2VyLkxleCgpOyAvLyBFYXQgaWRlbnRpZmllciB0b2tlbi4KKyAgICAKKyAgRSA9IFBhcnNlci5nZXRUb2soKS5nZXRMb2MoKTsKKworICBib29sIFdyaXRlYmFjayA9IGZhbHNlOworICBpZiAoUGFyc2VXcml0ZUJhY2spIHsKKyAgICBjb25zdCBBc21Ub2tlbiAmRXhjbGFpbVRvayA9IFBhcnNlci5nZXRUb2soKTsKKyAgICBpZiAoRXhjbGFpbVRvay5pcyhBc21Ub2tlbjo6RXhjbGFpbSkpIHsKKyAgICAgIEUgPSBFeGNsYWltVG9rLmdldExvYygpOworICAgICAgV3JpdGViYWNrID0gdHJ1ZTsKKyAgICAgIFBhcnNlci5MZXgoKTsgLy8gRWF0IGV4Y2xhaW0gdG9rZW4KKyAgICB9CisgIH0KKworICBBUk1PcGVyYW5kOjpDcmVhdGVSZWcoT3AsIFJlZ051bSwgV3JpdGViYWNrLCBTLCBFKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZSBhIHJlZ2lzdGVyIGxpc3QsIHJldHVybiBmYWxzZSBpZiBzdWNjZXNzZnVsIGVsc2UgcmV0dXJuIHRydWUgb3IgYW4gCisvLy8gZXJyb3IuICBUaGUgZmlyc3QgdG9rZW4gbXVzdCBiZSBhICd7JyB3aGVuIGNhbGxlZC4KK2Jvb2wgQVJNQXNtUGFyc2VyOjpQYXJzZVJlZ2lzdGVyTGlzdChPd25pbmdQdHI8QVJNT3BlcmFuZD4gJk9wKSB7CisgIFNNTG9jIFMsIEU7CisgIGFzc2VydChQYXJzZXIuZ2V0VG9rKCkuaXMoQXNtVG9rZW46OkxDdXJseSkgJiYKKyAgICAgICAgICJUb2tlbiBpcyBub3QgYW4gTGVmdCBDdXJseSBCcmFjZSIpOworICBTID0gUGFyc2VyLmdldFRvaygpLmdldExvYygpOworICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBsZWZ0IGN1cmx5IGJyYWNlIHRva2VuLgorCisgIGNvbnN0IEFzbVRva2VuICZSZWdUb2sgPSBQYXJzZXIuZ2V0VG9rKCk7CisgIFNNTG9jIFJlZ0xvYyA9IFJlZ1Rvay5nZXRMb2MoKTsKKyAgaWYgKFJlZ1Rvay5pc05vdChBc21Ub2tlbjo6SWRlbnRpZmllcikpCisgICAgcmV0dXJuIEVycm9yKFJlZ0xvYywgInJlZ2lzdGVyIGV4cGVjdGVkIik7CisgIGludCBSZWdOdW0gPSBNYXRjaFJlZ2lzdGVyTmFtZShSZWdUb2suZ2V0U3RyaW5nKCkpOworICBpZiAoUmVnTnVtID09IC0xKQorICAgIHJldHVybiBFcnJvcihSZWdMb2MsICJyZWdpc3RlciBleHBlY3RlZCIpOworICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBpZGVudGlmaWVyIHRva2VuLgorICB1bnNpZ25lZCBSZWdMaXN0ID0gMSA8PCBSZWdOdW07CisKKyAgaW50IEhpZ2hSZWdOdW0gPSBSZWdOdW07CisgIC8vIFRPRE8gcmFuZ2VzIGxpa2UgIntSbi1SbX0iCisgIHdoaWxlIChQYXJzZXIuZ2V0VG9rKCkuaXMoQXNtVG9rZW46OkNvbW1hKSkgeworICAgIFBhcnNlci5MZXgoKTsgLy8gRWF0IGNvbW1hIHRva2VuLgorCisgICAgY29uc3QgQXNtVG9rZW4gJlJlZ1RvayA9IFBhcnNlci5nZXRUb2soKTsKKyAgICBTTUxvYyBSZWdMb2MgPSBSZWdUb2suZ2V0TG9jKCk7CisgICAgaWYgKFJlZ1Rvay5pc05vdChBc21Ub2tlbjo6SWRlbnRpZmllcikpCisgICAgICByZXR1cm4gRXJyb3IoUmVnTG9jLCAicmVnaXN0ZXIgZXhwZWN0ZWQiKTsKKyAgICBpbnQgUmVnTnVtID0gTWF0Y2hSZWdpc3Rlck5hbWUoUmVnVG9rLmdldFN0cmluZygpKTsKKyAgICBpZiAoUmVnTnVtID09IC0xKQorICAgICAgcmV0dXJuIEVycm9yKFJlZ0xvYywgInJlZ2lzdGVyIGV4cGVjdGVkIik7CisKKyAgICBpZiAoUmVnTGlzdCAmICgxIDw8IFJlZ051bSkpCisgICAgICBXYXJuaW5nKFJlZ0xvYywgInJlZ2lzdGVyIGR1cGxpY2F0ZWQgaW4gcmVnaXN0ZXIgbGlzdCIpOworICAgIGVsc2UgaWYgKFJlZ051bSA8PSBIaWdoUmVnTnVtKQorICAgICAgV2FybmluZyhSZWdMb2MsICJyZWdpc3RlciBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIGluIHJlZ2lzdGVyIGxpc3QiKTsKKyAgICBSZWdMaXN0IHw9IDEgPDwgUmVnTnVtOworICAgIEhpZ2hSZWdOdW0gPSBSZWdOdW07CisKKyAgICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBpZGVudGlmaWVyIHRva2VuLgorICB9CisgIGNvbnN0IEFzbVRva2VuICZSQ3VybHlUb2sgPSBQYXJzZXIuZ2V0VG9rKCk7CisgIGlmIChSQ3VybHlUb2suaXNOb3QoQXNtVG9rZW46OlJDdXJseSkpCisgICAgcmV0dXJuIEVycm9yKFJDdXJseVRvay5nZXRMb2MoKSwgIid9JyBleHBlY3RlZCIpOworICBFID0gUkN1cmx5VG9rLmdldExvYygpOworICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBsZWZ0IGN1cmx5IGJyYWNlIHRva2VuLgorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlIGFuIGFybSBtZW1vcnkgZXhwcmVzc2lvbiwgcmV0dXJuIGZhbHNlIGlmIHN1Y2Nlc3NmdWwgZWxzZSByZXR1cm4gdHJ1ZQorLy8vIG9yIGFuIGVycm9yLiAgVGhlIGZpcnN0IHRva2VuIG11c3QgYmUgYSAnWycgd2hlbiBjYWxsZWQuCisvLy8gVE9ETyBPbmx5IHByZWluZGV4aW5nIGFuZCBwb3N0aW5kZXhpbmcgYWRkcmVzc2luZyBhcmUgc3RhcnRlZCwgdW5pbmRleGVkCisvLy8gd2l0aCBvcHRpb24sIGV0YyBhcmUgc3RpbGwgdG8gZG8uCitib29sIEFSTUFzbVBhcnNlcjo6UGFyc2VNZW1vcnkoT3duaW5nUHRyPEFSTU9wZXJhbmQ+ICZPcCkgeworICBTTUxvYyBTLCBFOworICBhc3NlcnQoUGFyc2VyLmdldFRvaygpLmlzKEFzbVRva2VuOjpMQnJhYykgJiYKKyAgICAgICAgICJUb2tlbiBpcyBub3QgYW4gTGVmdCBCcmFja2V0Iik7CisgIFMgPSBQYXJzZXIuZ2V0VG9rKCkuZ2V0TG9jKCk7CisgIFBhcnNlci5MZXgoKTsgLy8gRWF0IGxlZnQgYnJhY2tldCB0b2tlbi4KKworICBjb25zdCBBc21Ub2tlbiAmQmFzZVJlZ1RvayA9IFBhcnNlci5nZXRUb2soKTsKKyAgaWYgKEJhc2VSZWdUb2suaXNOb3QoQXNtVG9rZW46OklkZW50aWZpZXIpKQorICAgIHJldHVybiBFcnJvcihCYXNlUmVnVG9rLmdldExvYygpLCAicmVnaXN0ZXIgZXhwZWN0ZWQiKTsKKyAgaWYgKE1heWJlUGFyc2VSZWdpc3RlcihPcCwgZmFsc2UpKQorICAgIHJldHVybiBFcnJvcihCYXNlUmVnVG9rLmdldExvYygpLCAicmVnaXN0ZXIgZXhwZWN0ZWQiKTsKKyAgaW50IEJhc2VSZWdOdW0gPSBPcC0+Z2V0UmVnKCk7CisKKyAgYm9vbCBQcmVpbmRleGVkID0gZmFsc2U7CisgIGJvb2wgUG9zdGluZGV4ZWQgPSBmYWxzZTsKKyAgYm9vbCBPZmZzZXRJc1JlZyA9IGZhbHNlOworICBib29sIE5lZ2F0aXZlID0gZmFsc2U7CisgIGJvb2wgV3JpdGViYWNrID0gZmFsc2U7CisKKyAgLy8gRmlyc3QgbG9vayBmb3IgcHJlaW5kZXhlZCBhZGRyZXNzIGZvcm1zLCB0aGF0IGlzIGFmdGVyIHRoZSAiW1JuIiB3ZSBub3cKKyAgLy8gaGF2ZSB0byBzZWUgaWYgdGhlIG5leHQgdG9rZW4gaXMgYSBjb21tYS4KKyAgY29uc3QgQXNtVG9rZW4gJlRvayA9IFBhcnNlci5nZXRUb2soKTsKKyAgaWYgKFRvay5pcyhBc21Ub2tlbjo6Q29tbWEpKSB7CisgICAgUHJlaW5kZXhlZCA9IHRydWU7CisgICAgUGFyc2VyLkxleCgpOyAvLyBFYXQgY29tbWEgdG9rZW4uCisgICAgaW50IE9mZnNldFJlZ051bTsKKyAgICBib29sIE9mZnNldFJlZ1NoaWZ0ZWQ7CisgICAgZW51bSBTaGlmdFR5cGUgU2hpZnRUeXBlOworICAgIGNvbnN0IE1DRXhwciAqU2hpZnRBbW91bnQ7CisgICAgY29uc3QgTUNFeHByICpPZmZzZXQ7CisgICAgaWYoUGFyc2VNZW1vcnlPZmZzZXRSZWcoTmVnYXRpdmUsIE9mZnNldFJlZ1NoaWZ0ZWQsIFNoaWZ0VHlwZSwgU2hpZnRBbW91bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LCBPZmZzZXRJc1JlZywgT2Zmc2V0UmVnTnVtLCBFKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNvbnN0IEFzbVRva2VuICZSQnJhY1RvayA9IFBhcnNlci5nZXRUb2soKTsKKyAgICBpZiAoUkJyYWNUb2suaXNOb3QoQXNtVG9rZW46OlJCcmFjKSkKKyAgICAgIHJldHVybiBFcnJvcihSQnJhY1Rvay5nZXRMb2MoKSwgIiddJyBleHBlY3RlZCIpOworICAgIEUgPSBSQnJhY1Rvay5nZXRMb2MoKTsKKyAgICBQYXJzZXIuTGV4KCk7IC8vIEVhdCByaWdodCBicmFja2V0IHRva2VuLgorCisgICAgY29uc3QgQXNtVG9rZW4gJkV4Y2xhaW1Ub2sgPSBQYXJzZXIuZ2V0VG9rKCk7CisgICAgaWYgKEV4Y2xhaW1Ub2suaXMoQXNtVG9rZW46OkV4Y2xhaW0pKSB7CisgICAgICBFID0gRXhjbGFpbVRvay5nZXRMb2MoKTsKKyAgICAgIFdyaXRlYmFjayA9IHRydWU7CisgICAgICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBleGNsYWltIHRva2VuCisgICAgfQorICAgIEFSTU9wZXJhbmQ6OkNyZWF0ZU1lbShPcCwgQmFzZVJlZ051bSwgT2Zmc2V0SXNSZWcsIE9mZnNldCwgT2Zmc2V0UmVnTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXRSZWdTaGlmdGVkLCBTaGlmdFR5cGUsIFNoaWZ0QW1vdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVpbmRleGVkLCBQb3N0aW5kZXhlZCwgTmVnYXRpdmUsIFdyaXRlYmFjaywgUywgRSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIFRoZSAiW1JuIiB3ZSBoYXZlIHNvIGZhciB3YXMgbm90IGZvbGxvd2VkIGJ5IGEgY29tbWEuCisgIGVsc2UgaWYgKFRvay5pcyhBc21Ub2tlbjo6UkJyYWMpKSB7CisgICAgLy8gVGhpcyBpcyBhIHBvc3QgaW5kZXhpbmcgYWRkcmVzc2luZyBmb3JtcywgdGhhdCBpcyBhICddJyBmb2xsb3dzIGFmdGVyCisgICAgLy8gdGhlICJbUm4iLgorICAgIFBvc3RpbmRleGVkID0gdHJ1ZTsKKyAgICBXcml0ZWJhY2sgPSB0cnVlOworICAgIEUgPSBUb2suZ2V0TG9jKCk7CisgICAgUGFyc2VyLkxleCgpOyAvLyBFYXQgcmlnaHQgYnJhY2tldCB0b2tlbi4KKworICAgIGludCBPZmZzZXRSZWdOdW0gPSAwOworICAgIGJvb2wgT2Zmc2V0UmVnU2hpZnRlZCA9IGZhbHNlOworICAgIGVudW0gU2hpZnRUeXBlIFNoaWZ0VHlwZTsKKyAgICBjb25zdCBNQ0V4cHIgKlNoaWZ0QW1vdW50OworICAgIGNvbnN0IE1DRXhwciAqT2Zmc2V0OworCisgICAgY29uc3QgQXNtVG9rZW4gJk5leHRUb2sgPSBQYXJzZXIuZ2V0VG9rKCk7CisgICAgaWYgKE5leHRUb2suaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkgeworICAgICAgaWYgKE5leHRUb2suaXNOb3QoQXNtVG9rZW46OkNvbW1hKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKE5leHRUb2suZ2V0TG9jKCksICInLCcgZXhwZWN0ZWQiKTsKKyAgICAgIFBhcnNlci5MZXgoKTsgLy8gRWF0IGNvbW1hIHRva2VuLgorICAgICAgaWYoUGFyc2VNZW1vcnlPZmZzZXRSZWcoTmVnYXRpdmUsIE9mZnNldFJlZ1NoaWZ0ZWQsIFNoaWZ0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoaWZ0QW1vdW50LCBPZmZzZXQsIE9mZnNldElzUmVnLCBPZmZzZXRSZWdOdW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEFSTU9wZXJhbmQ6OkNyZWF0ZU1lbShPcCwgQmFzZVJlZ051bSwgT2Zmc2V0SXNSZWcsIE9mZnNldCwgT2Zmc2V0UmVnTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXRSZWdTaGlmdGVkLCBTaGlmdFR5cGUsIFNoaWZ0QW1vdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVpbmRleGVkLCBQb3N0aW5kZXhlZCwgTmVnYXRpdmUsIFdyaXRlYmFjaywgUywgRSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBQYXJzZSB0aGUgb2Zmc2V0IG9mIGEgbWVtb3J5IG9wZXJhbmQgYWZ0ZXIgd2UgaGF2ZSBzZWVuICJbUm4sIiBvciAiW1JuXSwiCisvLy8gd2Ugd2lsbCBwYXJzZSB0aGUgZm9sbG93aW5nICh3ZXJlICsvLSBtZWFucyB0aGF0IGEgcGx1cyBvciBtaW51cyBpcworLy8vIG9wdGlvbmFsKToKKy8vLyAgICsvLVJtCisvLy8gICArLy1SbSwgc2hpZnQKKy8vLyAgICNvZmZzZXQKKy8vLyB3ZSByZXR1cm4gZmFsc2Ugb24gc3VjY2VzcyBvciBhbiBlcnJvciBvdGhlcndpc2UuCitib29sIEFSTUFzbVBhcnNlcjo6UGFyc2VNZW1vcnlPZmZzZXRSZWcoYm9vbCAmTmVnYXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmT2Zmc2V0UmVnU2hpZnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFNoaWZ0VHlwZSAmU2hpZnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqJlNoaWZ0QW1vdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZPZmZzZXRJc1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJk9mZnNldFJlZ051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyAmRSkgeworICBPd25pbmdQdHI8QVJNT3BlcmFuZD4gT3A7CisgIE5lZ2F0aXZlID0gZmFsc2U7CisgIE9mZnNldFJlZ1NoaWZ0ZWQgPSBmYWxzZTsKKyAgT2Zmc2V0SXNSZWcgPSBmYWxzZTsKKyAgT2Zmc2V0UmVnTnVtID0gLTE7CisgIGNvbnN0IEFzbVRva2VuICZOZXh0VG9rID0gUGFyc2VyLmdldFRvaygpOworICBFID0gTmV4dFRvay5nZXRMb2MoKTsKKyAgaWYgKE5leHRUb2suaXMoQXNtVG9rZW46OlBsdXMpKQorICAgIFBhcnNlci5MZXgoKTsgLy8gRWF0IHBsdXMgdG9rZW4uCisgIGVsc2UgaWYgKE5leHRUb2suaXMoQXNtVG9rZW46Ok1pbnVzKSkgeworICAgIE5lZ2F0aXZlID0gdHJ1ZTsKKyAgICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBtaW51cyB0b2tlbgorICB9CisgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIHJlZ2lzdGVyIGZvbGxvd2luZyB0aGUgIltSbiwiIG9yICJbUm5dLCIgd2UgaGF2ZSBzbyBmYXIuCisgIGNvbnN0IEFzbVRva2VuICZPZmZzZXRSZWdUb2sgPSBQYXJzZXIuZ2V0VG9rKCk7CisgIGlmIChPZmZzZXRSZWdUb2suaXMoQXNtVG9rZW46OklkZW50aWZpZXIpKSB7CisgICAgT2Zmc2V0SXNSZWcgPSAhTWF5YmVQYXJzZVJlZ2lzdGVyKE9wLCBmYWxzZSk7CisgICAgaWYgKE9mZnNldElzUmVnKSB7CisgICAgICBFID0gT3AtPmdldEVuZExvYygpOworICAgICAgT2Zmc2V0UmVnTnVtID0gT3AtPmdldFJlZygpOworICAgIH0KKyAgfQorICAvLyBJZiB3ZSBwYXJzZWQgYSByZWdpc3RlciBhcyB0aGUgb2Zmc2V0IHRoZW4gdGhlaXIgY2FuIGJlIGEgc2hpZnQgYWZ0ZXIgdGhhdAorICBpZiAoT2Zmc2V0UmVnTnVtICE9IC0xKSB7CisgICAgLy8gTG9vayBmb3IgYSBjb21tYSB0aGVuIGEgc2hpZnQKKyAgICBjb25zdCBBc21Ub2tlbiAmVG9rID0gUGFyc2VyLmdldFRvaygpOworICAgIGlmIChUb2suaXMoQXNtVG9rZW46OkNvbW1hKSkgeworICAgICAgUGFyc2VyLkxleCgpOyAvLyBFYXQgY29tbWEgdG9rZW4uCisKKyAgICAgIGNvbnN0IEFzbVRva2VuICZUb2sgPSBQYXJzZXIuZ2V0VG9rKCk7CisgICAgICBpZiAoUGFyc2VTaGlmdChTaGlmdFR5cGUsIFNoaWZ0QW1vdW50LCBFKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKFRvay5nZXRMb2MoKSwgInNoaWZ0IGV4cGVjdGVkIik7CisgICAgICBPZmZzZXRSZWdTaGlmdGVkID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZWxzZSB7IC8vIHRoZSAiW1JuLCIgb3IgIltSbixdIiB3ZSBoYXZlIHNvIGZhciB3YXMgbm90IGZvbGxvd2VkIGJ5ICJSbSIKKyAgICAvLyBMb29rIGZvciAjb2Zmc2V0IGZvbGxvd2luZyB0aGUgIltSbiwiIG9yICJbUm5dLCIKKyAgICBjb25zdCBBc21Ub2tlbiAmSGFzaFRvayA9IFBhcnNlci5nZXRUb2soKTsKKyAgICBpZiAoSGFzaFRvay5pc05vdChBc21Ub2tlbjo6SGFzaCkpCisgICAgICByZXR1cm4gRXJyb3IoSGFzaFRvay5nZXRMb2MoKSwgIicjJyBleHBlY3RlZCIpOworICAgIAorICAgIFBhcnNlci5MZXgoKTsgLy8gRWF0IGhhc2ggdG9rZW4uCisKKyAgICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VFeHByZXNzaW9uKE9mZnNldCkpCisgICAgIHJldHVybiB0cnVlOworICAgIEUgPSBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoUGFyc2VyLmdldFRvaygpLmdldExvYygpLmdldFBvaW50ZXIoKSAtIDEpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlU2hpZnQgYXMgb25lIG9mIHRoZXNlIHR3bzoKKy8vLyAgICggbHNsIHwgbHNyIHwgYXNyIHwgcm9yICkgLCAjIHNoaWZ0X2Ftb3VudAorLy8vICAgcnJ4CisvLy8gYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCBwYXJzZXMgYSBzaGlmdCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KK2Jvb2wgQVJNQXNtUGFyc2VyOjpQYXJzZVNoaWZ0KFNoaWZ0VHlwZSAmU3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByIComU2hpZnRBbW91bnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgJkUpIHsKKyAgY29uc3QgQXNtVG9rZW4gJlRvayA9IFBhcnNlci5nZXRUb2soKTsKKyAgaWYgKFRvay5pc05vdChBc21Ub2tlbjo6SWRlbnRpZmllcikpCisgICAgcmV0dXJuIHRydWU7CisgIFN0cmluZ1JlZiBTaGlmdE5hbWUgPSBUb2suZ2V0U3RyaW5nKCk7CisgIGlmIChTaGlmdE5hbWUgPT0gImxzbCIgfHwgU2hpZnROYW1lID09ICJMU0wiKQorICAgIFN0ID0gTHNsOworICBlbHNlIGlmIChTaGlmdE5hbWUgPT0gImxzciIgfHwgU2hpZnROYW1lID09ICJMU1IiKQorICAgIFN0ID0gTHNyOworICBlbHNlIGlmIChTaGlmdE5hbWUgPT0gImFzciIgfHwgU2hpZnROYW1lID09ICJBU1IiKQorICAgIFN0ID0gQXNyOworICBlbHNlIGlmIChTaGlmdE5hbWUgPT0gInJvciIgfHwgU2hpZnROYW1lID09ICJST1IiKQorICAgIFN0ID0gUm9yOworICBlbHNlIGlmIChTaGlmdE5hbWUgPT0gInJyeCIgfHwgU2hpZnROYW1lID09ICJSUlgiKQorICAgIFN0ID0gUnJ4OworICBlbHNlCisgICAgcmV0dXJuIHRydWU7CisgIFBhcnNlci5MZXgoKTsgLy8gRWF0IHNoaWZ0IHR5cGUgdG9rZW4uCisKKyAgLy8gUnJ4IHN0YW5kcyBhbG9uZS4KKyAgaWYgKFN0ID09IFJyeCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gT3RoZXJ3aXNlLCB0aGVyZSBtdXN0IGJlIGEgJyMnIGFuZCBhIHNoaWZ0IGFtb3VudC4KKyAgY29uc3QgQXNtVG9rZW4gJkhhc2hUb2sgPSBQYXJzZXIuZ2V0VG9rKCk7CisgIGlmIChIYXNoVG9rLmlzTm90KEFzbVRva2VuOjpIYXNoKSkKKyAgICByZXR1cm4gRXJyb3IoSGFzaFRvay5nZXRMb2MoKSwgIicjJyBleHBlY3RlZCIpOworICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBoYXNoIHRva2VuLgorCisgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUV4cHJlc3Npb24oU2hpZnRBbW91bnQpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEEgaGFjayB0byBhbGxvdyBzb21lIHRlc3RpbmcsIHRvIGJlIHJlcGxhY2VkIGJ5IGEgcmVhbCB0YWJsZSBnZW4gdmVyc2lvbi4KK2ludCBBUk1Bc21QYXJzZXI6Ok1hdGNoUmVnaXN0ZXJOYW1lKFN0cmluZ1JlZiBOYW1lKSB7CisgIGlmIChOYW1lID09ICJyMCIgfHwgTmFtZSA9PSAiUjAiKQorICAgIHJldHVybiAwOworICBlbHNlIGlmIChOYW1lID09ICJyMSIgfHwgTmFtZSA9PSAiUjEiKQorICAgIHJldHVybiAxOworICBlbHNlIGlmIChOYW1lID09ICJyMiIgfHwgTmFtZSA9PSAiUjIiKQorICAgIHJldHVybiAyOworICBlbHNlIGlmIChOYW1lID09ICJyMyIgfHwgTmFtZSA9PSAiUjMiKQorICAgIHJldHVybiAzOworICBlbHNlIGlmIChOYW1lID09ICJyMyIgfHwgTmFtZSA9PSAiUjMiKQorICAgIHJldHVybiAzOworICBlbHNlIGlmIChOYW1lID09ICJyNCIgfHwgTmFtZSA9PSAiUjQiKQorICAgIHJldHVybiA0OworICBlbHNlIGlmIChOYW1lID09ICJyNSIgfHwgTmFtZSA9PSAiUjUiKQorICAgIHJldHVybiA1OworICBlbHNlIGlmIChOYW1lID09ICJyNiIgfHwgTmFtZSA9PSAiUjYiKQorICAgIHJldHVybiA2OworICBlbHNlIGlmIChOYW1lID09ICJyNyIgfHwgTmFtZSA9PSAiUjciKQorICAgIHJldHVybiA3OworICBlbHNlIGlmIChOYW1lID09ICJyOCIgfHwgTmFtZSA9PSAiUjgiKQorICAgIHJldHVybiA4OworICBlbHNlIGlmIChOYW1lID09ICJyOSIgfHwgTmFtZSA9PSAiUjkiKQorICAgIHJldHVybiA5OworICBlbHNlIGlmIChOYW1lID09ICJyMTAiIHx8IE5hbWUgPT0gIlIxMCIpCisgICAgcmV0dXJuIDEwOworICBlbHNlIGlmIChOYW1lID09ICJyMTEiIHx8IE5hbWUgPT0gIlIxMSIgfHwgTmFtZSA9PSAiZnAiKQorICAgIHJldHVybiAxMTsKKyAgZWxzZSBpZiAoTmFtZSA9PSAicjEyIiB8fCBOYW1lID09ICJSMTIiIHx8IE5hbWUgPT0gImlwIikKKyAgICByZXR1cm4gMTI7CisgIGVsc2UgaWYgKE5hbWUgPT0gInIxMyIgfHwgTmFtZSA9PSAiUjEzIiB8fCBOYW1lID09ICJzcCIpCisgICAgcmV0dXJuIDEzOworICBlbHNlIGlmIChOYW1lID09ICJyMTQiIHx8IE5hbWUgPT0gIlIxNCIgfHwgTmFtZSA9PSAibHIiKQorICAgICAgcmV0dXJuIDE0OworICBlbHNlIGlmIChOYW1lID09ICJyMTUiIHx8IE5hbWUgPT0gIlIxNSIgfHwgTmFtZSA9PSAicGMiKQorICAgIHJldHVybiAxNTsKKyAgcmV0dXJuIC0xOworfQorCisvLy8gQSBoYWNrIHRvIGFsbG93IHNvbWUgdGVzdGluZywgdG8gYmUgcmVwbGFjZWQgYnkgYSByZWFsIHRhYmxlIGdlbiB2ZXJzaW9uLgorYm9vbCBBUk1Bc21QYXJzZXI6OgorTWF0Y2hJbnN0cnVjdGlvbihjb25zdCBTbWFsbFZlY3RvckltcGw8TUNQYXJzZWRBc21PcGVyYW5kKj4gJk9wZXJhbmRzLAorICAgICAgICAgICAgICAgICBNQ0luc3QgJkluc3QpIHsKKyAgQVJNT3BlcmFuZCAmT3AwID0gKihBUk1PcGVyYW5kKilPcGVyYW5kc1swXTsKKyAgYXNzZXJ0KE9wMC5LaW5kID09IEFSTU9wZXJhbmQ6OlRva2VuICYmICJGaXJzdCBvcGVyYW5kIG5vdCBhIFRva2VuIik7CisgIFN0cmluZ1JlZiBNbmVtb25pYyA9IE9wMC5nZXRUb2tlbigpOworICBpZiAoTW5lbW9uaWMgPT0gImFkZCIgfHwKKyAgICAgIE1uZW1vbmljID09ICJzdG1mZCIgfHwKKyAgICAgIE1uZW1vbmljID09ICJzdHIiIHx8CisgICAgICBNbmVtb25pYyA9PSAibGRtZmQiIHx8CisgICAgICBNbmVtb25pYyA9PSAibGRyIiB8fAorICAgICAgTW5lbW9uaWMgPT0gIm1vdiIgfHwKKyAgICAgIE1uZW1vbmljID09ICJzdWIiIHx8CisgICAgICBNbmVtb25pYyA9PSAiYmwiIHx8CisgICAgICBNbmVtb25pYyA9PSAicHVzaCIgfHwKKyAgICAgIE1uZW1vbmljID09ICJibHgiIHx8CisgICAgICBNbmVtb25pYyA9PSAicG9wIikgeworICAgIC8vIEhhcmQtY29kZWQgdG8gYSB2YWxpZCBpbnN0cnVjdGlvbiwgdGlsbCB3ZSBoYXZlIGEgcmVhbCBtYXRjaGVyLgorICAgIEluc3QgPSBNQ0luc3QoKTsKKyAgICBJbnN0LnNldE9wY29kZShBUk06Ok1PVnIpOworICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygyKSk7CisgICAgSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKDIpKTsKKyAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oMCkpOworICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbSgwKSk7CisgICAgSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKDApKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFBhcnNlIGEgYXJtIGluc3RydWN0aW9uIG9wZXJhbmQuICBGb3Igbm93IHRoaXMgcGFyc2VzIHRoZSBvcGVyYW5kIHJlZ2FyZGxlc3MKKy8vLyBvZiB0aGUgbW5lbW9uaWMuCitib29sIEFSTUFzbVBhcnNlcjo6UGFyc2VPcGVyYW5kKE93bmluZ1B0cjxBUk1PcGVyYW5kPiAmT3ApIHsKKyAgU01Mb2MgUywgRTsKKyAgCisgIHN3aXRjaCAoZ2V0TGV4ZXIoKS5nZXRLaW5kKCkpIHsKKyAgY2FzZSBBc21Ub2tlbjo6SWRlbnRpZmllcjoKKyAgICBpZiAoIU1heWJlUGFyc2VSZWdpc3RlcihPcCwgdHJ1ZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gVGhpcyB3YXMgbm90IGEgcmVnaXN0ZXIgc28gcGFyc2Ugb3RoZXIgb3BlcmFuZHMgdGhhdCBzdGFydCB3aXRoIGFuCisgICAgLy8gaWRlbnRpZmllciAobGlrZSBsYWJlbHMpIGFzIGV4cHJlc3Npb25zIGFuZCBjcmVhdGUgdGhlbSBhcyBpbW1lZGlhdGVzLgorICAgIGNvbnN0IE1DRXhwciAqSWRWYWw7CisgICAgUyA9IFBhcnNlci5nZXRUb2soKS5nZXRMb2MoKTsKKyAgICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VFeHByZXNzaW9uKElkVmFsKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIEUgPSBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoUGFyc2VyLmdldFRvaygpLmdldExvYygpLmdldFBvaW50ZXIoKSAtIDEpOworICAgIEFSTU9wZXJhbmQ6OkNyZWF0ZUltbShPcCwgSWRWYWwsIFMsIEUpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBBc21Ub2tlbjo6TEJyYWM6CisgICAgcmV0dXJuIFBhcnNlTWVtb3J5KE9wKTsKKyAgY2FzZSBBc21Ub2tlbjo6TEN1cmx5OgorICAgIHJldHVybiBQYXJzZVJlZ2lzdGVyTGlzdChPcCk7CisgIGNhc2UgQXNtVG9rZW46Okhhc2g6CisgICAgLy8gIzQyIC0+IGltbWVkaWF0ZS4KKyAgICAvLyBUT0RPOiAiOmxvd2VyMTY6IiBhbmQgIjp1cHBlcjE2OiIgbW9kaWZpZXJzIGFmdGVyICMgYmVmb3JlIGltbWVkaWF0ZQorICAgIFMgPSBQYXJzZXIuZ2V0VG9rKCkuZ2V0TG9jKCk7CisgICAgUGFyc2VyLkxleCgpOworICAgIGNvbnN0IE1DRXhwciAqSW1tVmFsOworICAgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUV4cHJlc3Npb24oSW1tVmFsKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIEUgPSBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoUGFyc2VyLmdldFRvaygpLmdldExvYygpLmdldFBvaW50ZXIoKSAtIDEpOworICAgIEFSTU9wZXJhbmQ6OkNyZWF0ZUltbShPcCwgSW1tVmFsLCBTLCBFKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIEVycm9yKFBhcnNlci5nZXRUb2soKS5nZXRMb2MoKSwgInVuZXhwZWN0ZWQgdG9rZW4gaW4gb3BlcmFuZCIpOworICB9Cit9CisKKy8vLyBQYXJzZSBhbiBhcm0gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgZm9sbG93ZWQgYnkgaXRzIG9wZXJhbmRzLgorYm9vbCBBUk1Bc21QYXJzZXI6OlBhcnNlSW5zdHJ1Y3Rpb24oU3RyaW5nUmVmIE5hbWUsIFNNTG9jIE5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1DUGFyc2VkQXNtT3BlcmFuZCo+ICZPcGVyYW5kcykgeworICBPd25pbmdQdHI8QVJNT3BlcmFuZD4gT3A7CisgIEFSTU9wZXJhbmQ6OkNyZWF0ZVRva2VuKE9wLCBOYW1lLCBOYW1lTG9jKTsKKyAgCisgIE9wZXJhbmRzLnB1c2hfYmFjayhPcC50YWtlKCkpOworCisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpIHsKKworICAgIC8vIFJlYWQgdGhlIGZpcnN0IG9wZXJhbmQuCisgICAgT3duaW5nUHRyPEFSTU9wZXJhbmQ+IE9wOworICAgIGlmIChQYXJzZU9wZXJhbmQoT3ApKSByZXR1cm4gdHJ1ZTsKKyAgICBPcGVyYW5kcy5wdXNoX2JhY2soT3AudGFrZSgpKTsKKworICAgIHdoaWxlIChnZXRMZXhlcigpLmlzKEFzbVRva2VuOjpDb21tYSkpIHsKKyAgICAgIFBhcnNlci5MZXgoKTsgIC8vIEVhdCB0aGUgY29tbWEuCisKKyAgICAgIC8vIFBhcnNlIGFuZCByZW1lbWJlciB0aGUgb3BlcmFuZC4KKyAgICAgIGlmIChQYXJzZU9wZXJhbmQoT3ApKSByZXR1cm4gdHJ1ZTsKKyAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhPcC50YWtlKCkpOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZURpcmVjdGl2ZSBwYXJzZXMgdGhlIGFybSBzcGVjaWZpYyBkaXJlY3RpdmVzCitib29sIEFSTUFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmUoQXNtVG9rZW4gRGlyZWN0aXZlSUQpIHsKKyAgU3RyaW5nUmVmIElEVmFsID0gRGlyZWN0aXZlSUQuZ2V0SWRlbnRpZmllcigpOworICBpZiAoSURWYWwgPT0gIi53b3JkIikKKyAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVXb3JkKDQsIERpcmVjdGl2ZUlELmdldExvYygpKTsKKyAgZWxzZSBpZiAoSURWYWwgPT0gIi50aHVtYiIpCisgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlVGh1bWIoRGlyZWN0aXZlSUQuZ2V0TG9jKCkpOworICBlbHNlIGlmIChJRFZhbCA9PSAiLnRodW1iX2Z1bmMiKQorICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZVRodW1iRnVuYyhEaXJlY3RpdmVJRC5nZXRMb2MoKSk7CisgIGVsc2UgaWYgKElEVmFsID09ICIuY29kZSIpCisgICAgcmV0dXJuIFBhcnNlRGlyZWN0aXZlQ29kZShEaXJlY3RpdmVJRC5nZXRMb2MoKSk7CisgIGVsc2UgaWYgKElEVmFsID09ICIuc3ludGF4IikKKyAgICByZXR1cm4gUGFyc2VEaXJlY3RpdmVTeW50YXgoRGlyZWN0aXZlSUQuZ2V0TG9jKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlV29yZAorLy8vICA6Oj0gLndvcmQgWyBleHByZXNzaW9uICgsIGV4cHJlc3Npb24pKiBdCitib29sIEFSTUFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVXb3JkKHVuc2lnbmVkIFNpemUsIFNNTG9jIEwpIHsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkgeworICAgIGZvciAoOzspIHsKKyAgICAgIGNvbnN0IE1DRXhwciAqVmFsdWU7CisgICAgICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VFeHByZXNzaW9uKFZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGdldFBhcnNlcigpLmdldFN0cmVhbWVyKCkuRW1pdFZhbHVlKFZhbHVlLCBTaXplLCAwLyphZGRyc3BhY2UqLyk7CisKKyAgICAgIGlmIChnZXRMZXhlcigpLmlzKEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAvLyBGSVhNRTogSW1wcm92ZSBkaWFnbm9zdGljLgorICAgICAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkNvbW1hKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKEwsICJ1bmV4cGVjdGVkIHRva2VuIGluIGRpcmVjdGl2ZSIpOworICAgICAgUGFyc2VyLkxleCgpOworICAgIH0KKyAgfQorCisgIFBhcnNlci5MZXgoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVUaHVtYgorLy8vICA6Oj0gLnRodW1iCitib29sIEFSTUFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVUaHVtYihTTUxvYyBMKSB7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudCkpCisgICAgcmV0dXJuIEVycm9yKEwsICJ1bmV4cGVjdGVkIHRva2VuIGluIGRpcmVjdGl2ZSIpOworICBQYXJzZXIuTGV4KCk7CisKKyAgLy8gVE9ETzogc2V0IHRodW1iIG1vZGUKKyAgLy8gVE9ETzogdGVsbCB0aGUgTUMgc3RyZWFtZXIgdGhlIG1vZGUKKyAgLy8gZ2V0UGFyc2VyKCkuZ2V0U3RyZWFtZXIoKS5FbWl0Pz8/KCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlVGh1bWJGdW5jCisvLy8gIDo6PSAudGh1bWJmdW5jIHN5bWJvbF9uYW1lCitib29sIEFSTUFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVUaHVtYkZ1bmMoU01Mb2MgTCkgeworICBjb25zdCBBc21Ub2tlbiAmVG9rID0gUGFyc2VyLmdldFRvaygpOworICBpZiAoVG9rLmlzTm90KEFzbVRva2VuOjpJZGVudGlmaWVyKSAmJiBUb2suaXNOb3QoQXNtVG9rZW46OlN0cmluZykpCisgICAgcmV0dXJuIEVycm9yKEwsICJ1bmV4cGVjdGVkIHRva2VuIGluIC5zeW50YXggZGlyZWN0aXZlIik7CisgIFN0cmluZ1JlZiBBVFRSSUJVVEVfVU5VU0VEIFN5bWJvbE5hbWUgPSBQYXJzZXIuZ2V0VG9rKCkuZ2V0SWRlbnRpZmllcigpOworICBQYXJzZXIuTGV4KCk7IC8vIENvbnN1bWUgdGhlIGlkZW50aWZpZXIgdG9rZW4uCisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkKKyAgICByZXR1cm4gRXJyb3IoTCwgInVuZXhwZWN0ZWQgdG9rZW4gaW4gZGlyZWN0aXZlIik7CisgIFBhcnNlci5MZXgoKTsKKworICAvLyBUT0RPOiBtYXJrIHN5bWJvbCBhcyBhIHRodW1iIHN5bWJvbAorICAvLyBnZXRQYXJzZXIoKS5nZXRTdHJlYW1lcigpLkVtaXQ/Pz8oKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVTeW50YXgKKy8vLyAgOjo9IC5zeW50YXggdW5pZmllZCB8IGRpdmlkZWQKK2Jvb2wgQVJNQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZVN5bnRheChTTUxvYyBMKSB7CisgIGNvbnN0IEFzbVRva2VuICZUb2sgPSBQYXJzZXIuZ2V0VG9rKCk7CisgIGlmIChUb2suaXNOb3QoQXNtVG9rZW46OklkZW50aWZpZXIpKQorICAgIHJldHVybiBFcnJvcihMLCAidW5leHBlY3RlZCB0b2tlbiBpbiAuc3ludGF4IGRpcmVjdGl2ZSIpOworICBTdHJpbmdSZWYgTW9kZSA9IFRvay5nZXRTdHJpbmcoKTsKKyAgaWYgKE1vZGUgPT0gInVuaWZpZWQiIHx8IE1vZGUgPT0gIlVOSUZJRUQiKQorICAgIFBhcnNlci5MZXgoKTsKKyAgZWxzZSBpZiAoTW9kZSA9PSAiZGl2aWRlZCIgfHwgTW9kZSA9PSAiRElWSURFRCIpCisgICAgUGFyc2VyLkxleCgpOworICBlbHNlCisgICAgcmV0dXJuIEVycm9yKEwsICJ1bnJlY29nbml6ZWQgc3ludGF4IG1vZGUgaW4gLnN5bnRheCBkaXJlY3RpdmUiKTsKKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgIHJldHVybiBFcnJvcihQYXJzZXIuZ2V0VG9rKCkuZ2V0TG9jKCksICJ1bmV4cGVjdGVkIHRva2VuIGluIGRpcmVjdGl2ZSIpOworICBQYXJzZXIuTGV4KCk7CisKKyAgLy8gVE9ETyB0ZWxsIHRoZSBNQyBzdHJlYW1lciB0aGUgbW9kZQorICAvLyBnZXRQYXJzZXIoKS5nZXRTdHJlYW1lcigpLkVtaXQ/Pz8oKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEaXJlY3RpdmVDb2RlCisvLy8gIDo6PSAuY29kZSAxNiB8IDMyCitib29sIEFSTUFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVDb2RlKFNNTG9jIEwpIHsKKyAgY29uc3QgQXNtVG9rZW4gJlRvayA9IFBhcnNlci5nZXRUb2soKTsKKyAgaWYgKFRvay5pc05vdChBc21Ub2tlbjo6SW50ZWdlcikpCisgICAgcmV0dXJuIEVycm9yKEwsICJ1bmV4cGVjdGVkIHRva2VuIGluIC5jb2RlIGRpcmVjdGl2ZSIpOworICBpbnQ2NF90IFZhbCA9IFBhcnNlci5nZXRUb2soKS5nZXRJbnRWYWwoKTsKKyAgaWYgKFZhbCA9PSAxNikKKyAgICBQYXJzZXIuTGV4KCk7CisgIGVsc2UgaWYgKFZhbCA9PSAzMikKKyAgICBQYXJzZXIuTGV4KCk7CisgIGVsc2UKKyAgICByZXR1cm4gRXJyb3IoTCwgImludmFsaWQgb3BlcmFuZCB0byAuY29kZSBkaXJlY3RpdmUiKTsKKworICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgIHJldHVybiBFcnJvcihQYXJzZXIuZ2V0VG9rKCkuZ2V0TG9jKCksICJ1bmV4cGVjdGVkIHRva2VuIGluIGRpcmVjdGl2ZSIpOworICBQYXJzZXIuTGV4KCk7CisKKyAgLy8gVE9ETyB0ZWxsIHRoZSBNQyBzdHJlYW1lciB0aGUgbW9kZQorICAvLyBnZXRQYXJzZXIoKS5nZXRTdHJlYW1lcigpLkVtaXQ/Pz8oKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVBUk1Bc21MZXhlcigpOworCisvLy8gRm9yY2Ugc3RhdGljIGluaXRpYWxpemF0aW9uLgorZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplQVJNQXNtUGFyc2VyKCkgeworICBSZWdpc3RlckFzbVBhcnNlcjxBUk1Bc21QYXJzZXI+IFgoVGhlQVJNVGFyZ2V0KTsKKyAgUmVnaXN0ZXJBc21QYXJzZXI8QVJNQXNtUGFyc2VyPiBZKFRoZVRodW1iVGFyZ2V0KTsKKyAgTExWTUluaXRpYWxpemVBUk1Bc21MZXhlcigpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUGFyc2VyL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUGFyc2VyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTdjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9Bc21QYXJzZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw3IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uICkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNQVJNQXNtUGFyc2VyCisgIEFSTUFzbUxleGVyLmNwcAorICBBUk1Bc21QYXJzZXIuY3BwCisgICkKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUGFyc2VyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUGFyc2VyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MTUxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9Bc21QYXJzZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvQVJNL0FzbVBhcnNlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUFSTUFzbVBhcnNlcgorCisjIEhhY2s6IHdlIG5lZWQgdG8gaW5jbHVkZSAnbWFpbicgQVJNIHRhcmdldCBkaXJlY3RvcnkgdG8gZ3JhYiBwcml2YXRlIGhlYWRlcnMKK0NQUC5GbGFncyArPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUHJpbnRlci9BUk1JbnN0UHJpbnRlci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9Bc21QcmludGVyL0FSTUluc3RQcmludGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQyODUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUHJpbnRlci9BUk1JbnN0UHJpbnRlci5jcHAKQEAgLTAsMCArMSw3ODUgQEAKKy8vPT09LS0gQVJNSW5zdFByaW50ZXIuY3BwIC0gQ29udmVydCBBUk0gTUNJbnN0IHRvIGFzc2VtYmx5IHN5bnRheCAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyBwcmludHMgYW4gQVJNIE1DSW5zdCB0byBhIC5zIGZpbGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJhc20tcHJpbnRlciIKKyNpbmNsdWRlICJBUk0uaCIgLy8gRklYTUU6IEZBQ1RPUiBFTlVNUyBCRVRURVIuCisjaW5jbHVkZSAiQVJNSW5zdFByaW50ZXIuaCIKKyNpbmNsdWRlICJBUk1BZGRyZXNzaW5nTW9kZXMuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBJbmNsdWRlIHRoZSBhdXRvLWdlbmVyYXRlZCBwb3J0aW9uIG9mIHRoZSBhc3NlbWJseSB3cml0ZXIuCisjZGVmaW5lIE1hY2hpbmVJbnN0ciBNQ0luc3QKKyNkZWZpbmUgQVJNQXNtUHJpbnRlciBBUk1JbnN0UHJpbnRlciAgLy8gRklYTUU6IFJFTU9WRS4KKyNpbmNsdWRlICJBUk1HZW5Bc21Xcml0ZXIuaW5jIgorI3VuZGVmIE1hY2hpbmVJbnN0cgorI3VuZGVmIEFSTUFzbVByaW50ZXIKKworc3RhdGljIHVuc2lnbmVkIE5leHRSZWcodW5zaWduZWQgUmVnKSB7CisgIHN3aXRjaCAoUmVnKSB7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIlVuZXhwZWN0ZWQgcmVnaXN0ZXIgZW51bSIpOworCisgIGNhc2UgQVJNOjpEMDoKKyAgICByZXR1cm4gQVJNOjpEMTsKKyAgY2FzZSBBUk06OkQxOgorICAgIHJldHVybiBBUk06OkQyOworICBjYXNlIEFSTTo6RDI6CisgICAgcmV0dXJuIEFSTTo6RDM7CisgIGNhc2UgQVJNOjpEMzoKKyAgICByZXR1cm4gQVJNOjpENDsKKyAgY2FzZSBBUk06OkQ0OgorICAgIHJldHVybiBBUk06OkQ1OworICBjYXNlIEFSTTo6RDU6CisgICAgcmV0dXJuIEFSTTo6RDY7CisgIGNhc2UgQVJNOjpENjoKKyAgICByZXR1cm4gQVJNOjpENzsKKyAgY2FzZSBBUk06OkQ3OgorICAgIHJldHVybiBBUk06OkQ4OworICBjYXNlIEFSTTo6RDg6CisgICAgcmV0dXJuIEFSTTo6RDk7CisgIGNhc2UgQVJNOjpEOToKKyAgICByZXR1cm4gQVJNOjpEMTA7CisgIGNhc2UgQVJNOjpEMTA6CisgICAgcmV0dXJuIEFSTTo6RDExOworICBjYXNlIEFSTTo6RDExOgorICAgIHJldHVybiBBUk06OkQxMjsKKyAgY2FzZSBBUk06OkQxMjoKKyAgICByZXR1cm4gQVJNOjpEMTM7CisgIGNhc2UgQVJNOjpEMTM6CisgICAgcmV0dXJuIEFSTTo6RDE0OworICBjYXNlIEFSTTo6RDE0OgorICAgIHJldHVybiBBUk06OkQxNTsKKyAgY2FzZSBBUk06OkQxNToKKyAgICByZXR1cm4gQVJNOjpEMTY7CisgIGNhc2UgQVJNOjpEMTY6CisgICAgcmV0dXJuIEFSTTo6RDE3OworICBjYXNlIEFSTTo6RDE3OgorICAgIHJldHVybiBBUk06OkQxODsKKyAgY2FzZSBBUk06OkQxODoKKyAgICByZXR1cm4gQVJNOjpEMTk7CisgIGNhc2UgQVJNOjpEMTk6CisgICAgcmV0dXJuIEFSTTo6RDIwOworICBjYXNlIEFSTTo6RDIwOgorICAgIHJldHVybiBBUk06OkQyMTsKKyAgY2FzZSBBUk06OkQyMToKKyAgICByZXR1cm4gQVJNOjpEMjI7CisgIGNhc2UgQVJNOjpEMjI6CisgICAgcmV0dXJuIEFSTTo6RDIzOworICBjYXNlIEFSTTo6RDIzOgorICAgIHJldHVybiBBUk06OkQyNDsKKyAgY2FzZSBBUk06OkQyNDoKKyAgICByZXR1cm4gQVJNOjpEMjU7CisgIGNhc2UgQVJNOjpEMjU6CisgICAgcmV0dXJuIEFSTTo6RDI2OworICBjYXNlIEFSTTo6RDI2OgorICAgIHJldHVybiBBUk06OkQyNzsKKyAgY2FzZSBBUk06OkQyNzoKKyAgICByZXR1cm4gQVJNOjpEMjg7CisgIGNhc2UgQVJNOjpEMjg6CisgICAgcmV0dXJuIEFSTTo6RDI5OworICBjYXNlIEFSTTo6RDI5OgorICAgIHJldHVybiBBUk06OkQzMDsKKyAgY2FzZSBBUk06OkQzMDoKKyAgICByZXR1cm4gQVJNOjpEMzE7CisgIH0KK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRJbnN0KGNvbnN0IE1DSW5zdCAqTUksIHJhd19vc3RyZWFtICZPKSB7CisgIC8vIENoZWNrIGZvciBNT1ZzIGFuZCBwcmludCBjYW5vbmljYWwgZm9ybXMsIGluc3RlYWQuCisgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpNT1ZzKSB7CisgICAgY29uc3QgTUNPcGVyYW5kICZEc3QgPSBNSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBjb25zdCBNQ09wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKDEpOworICAgIGNvbnN0IE1DT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoMik7CisgICAgY29uc3QgTUNPcGVyYW5kICZNTzMgPSBNSS0+Z2V0T3BlcmFuZCgzKTsKKworICAgIE8gPDwgJ1x0JyA8PCBBUk1fQU06OmdldFNoaWZ0T3BjU3RyKEFSTV9BTTo6Z2V0U09SZWdTaE9wKE1PMy5nZXRJbW0oKSkpOworICAgIHByaW50U0JpdE1vZGlmaWVyT3BlcmFuZChNSSwgNiwgTyk7CisgICAgcHJpbnRQcmVkaWNhdGVPcGVyYW5kKE1JLCA0LCBPKTsKKworICAgIE8gPDwgJ1x0JyA8PCBnZXRSZWdpc3Rlck5hbWUoRHN0LmdldFJlZygpKQorICAgICAgPDwgIiwgIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKworICAgIGlmIChBUk1fQU06OmdldFNPUmVnU2hPcChNTzMuZ2V0SW1tKCkpID09IEFSTV9BTTo6cnJ4KQorICAgICAgcmV0dXJuOworCisgICAgTyA8PCAiLCAiOworCisgICAgaWYgKE1PMi5nZXRSZWcoKSkgeworICAgICAgTyA8PCBnZXRSZWdpc3Rlck5hbWUoTU8yLmdldFJlZygpKTsKKyAgICAgIGFzc2VydChBUk1fQU06OmdldFNPUmVnT2Zmc2V0KE1PMy5nZXRJbW0oKSkgPT0gMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE8gPDwgIiMiIDw8IEFSTV9BTTo6Z2V0U09SZWdPZmZzZXQoTU8zLmdldEltbSgpKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQTguNi4xMjMgUFVTSAorICBpZiAoKE1JLT5nZXRPcGNvZGUoKSA9PSBBUk06OlNUTV9VUEQgfHwgTUktPmdldE9wY29kZSgpID09IEFSTTo6dDJTVE1fVVBEKSAmJgorICAgICAgTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgPT0gQVJNOjpTUCkgeworICAgIGNvbnN0IE1DT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoMik7CisgICAgaWYgKEFSTV9BTTo6Z2V0QU00U3ViTW9kZShNTzEuZ2V0SW1tKCkpID09IEFSTV9BTTo6ZGIpIHsKKyAgICAgIE8gPDwgJ1x0JyA8PCAicHVzaCI7CisgICAgICBwcmludFByZWRpY2F0ZU9wZXJhbmQoTUksIDMsIE8pOworICAgICAgTyA8PCAnXHQnOworICAgICAgcHJpbnRSZWdpc3Rlckxpc3QoTUksIDUsIE8pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIEE4LjYuMTIyIFBPUAorICBpZiAoKE1JLT5nZXRPcGNvZGUoKSA9PSBBUk06OkxETV9VUEQgfHwgTUktPmdldE9wY29kZSgpID09IEFSTTo6dDJMRE1fVVBEKSAmJgorICAgICAgTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgPT0gQVJNOjpTUCkgeworICAgIGNvbnN0IE1DT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoMik7CisgICAgaWYgKEFSTV9BTTo6Z2V0QU00U3ViTW9kZShNTzEuZ2V0SW1tKCkpID09IEFSTV9BTTo6aWEpIHsKKyAgICAgIE8gPDwgJ1x0JyA8PCAicG9wIjsKKyAgICAgIHByaW50UHJlZGljYXRlT3BlcmFuZChNSSwgMywgTyk7CisgICAgICBPIDw8ICdcdCc7CisgICAgICBwcmludFJlZ2lzdGVyTGlzdChNSSwgNSwgTyk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gQTguNi4zNTUgVlBVU0gKKyAgaWYgKChNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpWU1RNU19VUEQgfHwgTUktPmdldE9wY29kZSgpID09QVJNOjpWU1RNRF9VUEQpICYmCisgICAgICBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBBUk06OlNQKSB7CisgICAgY29uc3QgTUNPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZCgyKTsKKyAgICBpZiAoQVJNX0FNOjpnZXRBTTVTdWJNb2RlKE1PMS5nZXRJbW0oKSkgPT0gQVJNX0FNOjpkYikgeworICAgICAgTyA8PCAnXHQnIDw8ICJ2cHVzaCI7CisgICAgICBwcmludFByZWRpY2F0ZU9wZXJhbmQoTUksIDMsIE8pOworICAgICAgTyA8PCAnXHQnOworICAgICAgcHJpbnRSZWdpc3Rlckxpc3QoTUksIDUsIE8pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIEE4LjYuMzU0IFZQT1AKKyAgaWYgKChNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpWTERNU19VUEQgfHwgTUktPmdldE9wY29kZSgpID09QVJNOjpWTERNRF9VUEQpICYmCisgICAgICBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBBUk06OlNQKSB7CisgICAgY29uc3QgTUNPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZCgyKTsKKyAgICBpZiAoQVJNX0FNOjpnZXRBTTVTdWJNb2RlKE1PMS5nZXRJbW0oKSkgPT0gQVJNX0FNOjppYSkgeworICAgICAgTyA8PCAnXHQnIDw8ICJ2cG9wIjsKKyAgICAgIHByaW50UHJlZGljYXRlT3BlcmFuZChNSSwgMywgTyk7CisgICAgICBPIDw8ICdcdCc7CisgICAgICBwcmludFJlZ2lzdGVyTGlzdChNSSwgNSwgTyk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgcHJpbnRJbnN0cnVjdGlvbihNSSwgTyk7CisgfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludE9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywgY29uc3QgY2hhciAqTW9kaWZpZXIpIHsKKyAgY29uc3QgTUNPcGVyYW5kICZPcCA9IE1JLT5nZXRPcGVyYW5kKE9wTm8pOworICBpZiAoT3AuaXNSZWcoKSkgeworICAgIHVuc2lnbmVkIFJlZyA9IE9wLmdldFJlZygpOworICAgIGlmIChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJkcmVncGFpciIpID09IDApIHsKKyAgICAgIE8gPDwgJ3snIDw8IGdldFJlZ2lzdGVyTmFtZShSZWcpIDw8ICIsICIKKyAgICAgICAgICAgICAgIDw8IGdldFJlZ2lzdGVyTmFtZShOZXh0UmVnKFJlZykpIDw8ICd9JzsKKyNpZiAwCisgICAgICAvLyBGSVhNRTogQnJlYWtzIGUuZy4gQVJNL3ZtdWwubGwuCisgICAgICBhc3NlcnQoMCk7CisgICAgICAvKgorICAgICAgdW5zaWduZWQgRFJlZ0xvID0gVFJJLT5nZXRTdWJSZWcoUmVnLCBBUk06OmRzdWJfMCk7CisgICAgICB1bnNpZ25lZCBEUmVnSGkgPSBUUkktPmdldFN1YlJlZyhSZWcsIEFSTTo6ZHN1Yl8xKTsKKyAgICAgIE8gPDwgJ3snCisgICAgICA8PCBnZXRSZWdpc3Rlck5hbWUoRFJlZ0xvKSA8PCAnLCcgPDwgZ2V0UmVnaXN0ZXJOYW1lKERSZWdIaSkKKyAgICAgIDw8ICd9JzsqLworI2VuZGlmCisgICAgfSBlbHNlIGlmIChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJsYW5lIikgPT0gMCkgeworICAgICAgYXNzZXJ0KDApOworICAgICAgLyoKKyAgICAgIHVuc2lnbmVkIFJlZ051bSA9IEFSTVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoUmVnKTsKKyAgICAgIHVuc2lnbmVkIERSZWcgPSBUUkktPmdldE1hdGNoaW5nU3VwZXJSZWcoUmVnLCBSZWdOdW0gJiAxID8gMiA6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBUk06OkRQUl9WRlAyUmVnQ2xhc3MpOworICAgICAgTyA8PCBnZXRSZWdpc3Rlck5hbWUoRFJlZykgPDwgJ1snIDw8IChSZWdOdW0gJiAxKSA8PCAnXSc7CisgICAgICAgKi8KKyAgICB9IGVsc2UgeworICAgICAgTyA8PCBnZXRSZWdpc3Rlck5hbWUoUmVnKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoT3AuaXNJbW0oKSkgeworICAgIGFzc2VydCgoTW9kaWZpZXIgJiYgIXN0cmNtcChNb2RpZmllciwgImNhbGwiKSkgfHwKKyAgICAgICAgICAgKChNb2RpZmllciA9PSAwIHx8IE1vZGlmaWVyWzBdID09IDApICYmICJObyBtb2RpZmllcnMgc3VwcG9ydGVkIikpOworICAgIE8gPDwgJyMnIDw8IE9wLmdldEltbSgpOworICB9IGVsc2UgeworICAgIGlmIChNb2RpZmllciAmJiBNb2RpZmllclswXSAhPSAwICYmIHN0cmNtcChNb2RpZmllciwgImNhbGwiKSAhPSAwKQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgbW9kaWZpZXIiKTsKKyAgICBhc3NlcnQoT3AuaXNFeHByKCkgJiYgInVua25vd24gb3BlcmFuZCBraW5kIGluIHByaW50T3BlcmFuZCIpOworICAgIE8gPDwgKk9wLmdldEV4cHIoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBwcmludFNPSW1tKHJhd19vc3RyZWFtICZPLCBpbnQ2NF90IFYsIGJvb2wgVmVyYm9zZUFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICpNQUkpIHsKKyAgLy8gQnJlYWsgaXQgdXAgaW50byB0d28gcGFydHMgdGhhdCBtYWtlIHVwIGEgc2hpZnRlciBpbW1lZGlhdGUuCisgIFYgPSBBUk1fQU06OmdldFNPSW1tVmFsKFYpOworICBhc3NlcnQoViAhPSAtMSAmJiAiTm90IGEgdmFsaWQgc29faW1tIHZhbHVlISIpOworICAKKyAgdW5zaWduZWQgSW1tID0gQVJNX0FNOjpnZXRTT0ltbVZhbEltbShWKTsKKyAgdW5zaWduZWQgUm90ID0gQVJNX0FNOjpnZXRTT0ltbVZhbFJvdChWKTsKKyAgCisgIC8vIFByaW50IGxvdy1sZXZlbCBpbW1lZGlhdGUgZm9ybWF0aW9uIGluZm8sIHBlcgorICAvLyBBNS4xLjM6ICJEYXRhLXByb2Nlc3Npbmcgb3BlcmFuZHMgLSBJbW1lZGlhdGUiLgorICBpZiAoUm90KSB7CisgICAgTyA8PCAiIyIgPDwgSW1tIDw8ICIsICIgPDwgUm90OworICAgIC8vIFByZXR0eSBwcmludGVkIHZlcnNpb24uCisgICAgaWYgKFZlcmJvc2VBc20pCisgICAgICBPIDw8ICcgJyA8PCBNQUktPmdldENvbW1lbnRTdHJpbmcoKQorICAgICAgPDwgJyAnIDw8IChpbnQpQVJNX0FNOjpyb3RyMzIoSW1tLCBSb3QpOworICB9IGVsc2UgeworICAgIE8gPDwgIiMiIDw8IEltbTsKKyAgfQorfQorCisKKy8vLyBwcmludFNPSW1tT3BlcmFuZCAtIFNPSW1tIGlzIDQtYml0IHJvdGF0ZSBhbW91bnQgaW4gYml0cyA4LTExIHdpdGggOC1iaXQKKy8vLyBpbW1lZGlhdGUgaW4gYml0cyAwLTcuCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludFNPSW1tT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIGFzc2VydChNTy5pc0ltbSgpICYmICJOb3QgYSB2YWxpZCBzb19pbW0gdmFsdWUhIik7CisgIHByaW50U09JbW0oTywgTU8uZ2V0SW1tKCksIFZlcmJvc2VBc20sICZNQUkpOworfQorCisvLy8gcHJpbnRTT0ltbTJQYXJ0T3BlcmFuZCAtIFNPSW1tIGlzIGJyb2tlbiBpbnRvIHR3byBwaWVjZXMgdXNpbmcgYSAnbW92JworLy8vIGZvbGxvd2VkIGJ5IGFuICdvcnInIHRvIG1hdGVyaWFsaXplLgordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRTT0ltbTJQYXJ0T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgLy8gRklYTUU6IFJFTU9WRSB0aGlzIG1ldGhvZC4KKyAgYWJvcnQoKTsKK30KKworLy8gc29fcmVnIGlzIGEgNC1vcGVyYW5kIHVuaXQgY29ycmVzcG9uZGluZyB0byByZWdpc3RlciBmb3JtcyBvZiB0aGUgQTUuMQorLy8gIkFkZHJlc3NpbmcgTW9kZSAxIC0gRGF0YS1wcm9jZXNzaW5nIG9wZXJhbmRzIiBmb3Jtcy4gIFRoaXMgaW5jbHVkZXM6CisvLyAgICBSRUcgMCAgIDAgICAgICAgICAgIC0gZS5nLiBSNQorLy8gICAgUkVHIFJFRyAwLFNIX09QQyAgICAtIGUuZy4gUjUsIFJPUiBSMworLy8gICAgUkVHIDAgICBJTU0sU0hfT1BDICAtIGUuZy4gUjUsIExTTCAjMwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRTT1JlZ09wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSsxKTsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzMgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSsyKTsKKyAgCisgIE8gPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisgIAorICAvLyBQcmludCB0aGUgc2hpZnQgb3BjLgorICBBUk1fQU06OlNoaWZ0T3BjIFNoT3BjID0gQVJNX0FNOjpnZXRTT1JlZ1NoT3AoTU8zLmdldEltbSgpKTsKKyAgTyA8PCAiLCAiIDw8IEFSTV9BTTo6Z2V0U2hpZnRPcGNTdHIoU2hPcGMpOworICBpZiAoTU8yLmdldFJlZygpKSB7CisgICAgTyA8PCAnICcgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMi5nZXRSZWcoKSk7CisgICAgYXNzZXJ0KEFSTV9BTTo6Z2V0U09SZWdPZmZzZXQoTU8zLmdldEltbSgpKSA9PSAwKTsKKyAgfSBlbHNlIGlmIChTaE9wYyAhPSBBUk1fQU06OnJyeCkgeworICAgIE8gPDwgIiAjIiA8PCBBUk1fQU06OmdldFNPUmVnT2Zmc2V0KE1PMy5nZXRJbW0oKSk7CisgIH0KK30KKworCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludEFkZHJNb2RlMk9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcCk7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3ArMSk7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8zID0gTUktPmdldE9wZXJhbmQoT3ArMik7CisgIAorICBpZiAoIU1PMS5pc1JlZygpKSB7ICAgLy8gRklYTUU6IFRoaXMgaXMgZm9yIENQIGVudHJpZXMsIGJ1dCBpc24ndCByaWdodC4KKyAgICBwcmludE9wZXJhbmQoTUksIE9wLCBPKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIE8gPDwgIlsiIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpOworICAKKyAgaWYgKCFNTzIuZ2V0UmVnKCkpIHsKKyAgICBpZiAoQVJNX0FNOjpnZXRBTTJPZmZzZXQoTU8zLmdldEltbSgpKSkgLy8gRG9uJ3QgcHJpbnQgKzAuCisgICAgICBPIDw8ICIsICMiCisgICAgICAgIDw8IEFSTV9BTTo6Z2V0QWRkck9wY1N0cihBUk1fQU06OmdldEFNMk9wKE1PMy5nZXRJbW0oKSkpCisgICAgICAgIDw8IEFSTV9BTTo6Z2V0QU0yT2Zmc2V0KE1PMy5nZXRJbW0oKSk7CisgICAgTyA8PCAiXSI7CisgICAgcmV0dXJuOworICB9CisgIAorICBPIDw8ICIsICIKKyAgICA8PCBBUk1fQU06OmdldEFkZHJPcGNTdHIoQVJNX0FNOjpnZXRBTTJPcChNTzMuZ2V0SW1tKCkpKQorICAgIDw8IGdldFJlZ2lzdGVyTmFtZShNTzIuZ2V0UmVnKCkpOworICAKKyAgaWYgKHVuc2lnbmVkIFNoSW1tID0gQVJNX0FNOjpnZXRBTTJPZmZzZXQoTU8zLmdldEltbSgpKSkKKyAgICBPIDw8ICIsICIKKyAgICA8PCBBUk1fQU06OmdldFNoaWZ0T3BjU3RyKEFSTV9BTTo6Z2V0QU0yU2hpZnRPcGMoTU8zLmdldEltbSgpKSkKKyAgICA8PCAiICMiIDw8IFNoSW1tOworICBPIDw8ICJdIjsKK30gIAorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludEFkZHJNb2RlMk9mZnNldE9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSsxKTsKKyAgCisgIGlmICghTU8xLmdldFJlZygpKSB7CisgICAgdW5zaWduZWQgSW1tT2ZmcyA9IEFSTV9BTTo6Z2V0QU0yT2Zmc2V0KE1PMi5nZXRJbW0oKSk7CisgICAgTyA8PCAnIycKKyAgICAgIDw8IEFSTV9BTTo6Z2V0QWRkck9wY1N0cihBUk1fQU06OmdldEFNMk9wKE1PMi5nZXRJbW0oKSkpCisgICAgICA8PCBJbW1PZmZzOworICAgIHJldHVybjsKKyAgfQorICAKKyAgTyA8PCBBUk1fQU06OmdldEFkZHJPcGNTdHIoQVJNX0FNOjpnZXRBTTJPcChNTzIuZ2V0SW1tKCkpKQorICAgIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpOworICAKKyAgaWYgKHVuc2lnbmVkIFNoSW1tID0gQVJNX0FNOjpnZXRBTTJPZmZzZXQoTU8yLmdldEltbSgpKSkKKyAgICBPIDw8ICIsICIKKyAgICA8PCBBUk1fQU06OmdldFNoaWZ0T3BjU3RyKEFSTV9BTTo6Z2V0QU0yU2hpZnRPcGMoTU8yLmdldEltbSgpKSkKKyAgICA8PCAiICMiIDw8IFNoSW1tOworfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludEFkZHJNb2RlM09wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8zID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMik7CisgIAorICBPIDw8ICdbJyA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKyAgCisgIGlmIChNTzIuZ2V0UmVnKCkpIHsKKyAgICBPIDw8ICIsICIgPDwgKGNoYXIpQVJNX0FNOjpnZXRBTTNPcChNTzMuZ2V0SW1tKCkpCisgICAgICA8PCBnZXRSZWdpc3Rlck5hbWUoTU8yLmdldFJlZygpKSA8PCAnXSc7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZiAodW5zaWduZWQgSW1tT2ZmcyA9IEFSTV9BTTo6Z2V0QU0zT2Zmc2V0KE1PMy5nZXRJbW0oKSkpCisgICAgTyA8PCAiLCAjIgorICAgICAgPDwgQVJNX0FNOjpnZXRBZGRyT3BjU3RyKEFSTV9BTTo6Z2V0QU0zT3AoTU8zLmdldEltbSgpKSkKKyAgICAgIDw8IEltbU9mZnM7CisgIE8gPDwgJ10nOworfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludEFkZHJNb2RlM09mZnNldE9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSsxKTsKKyAgCisgIGlmIChNTzEuZ2V0UmVnKCkpIHsKKyAgICBPIDw8IChjaGFyKUFSTV9BTTo6Z2V0QU0zT3AoTU8yLmdldEltbSgpKQorICAgIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgdW5zaWduZWQgSW1tT2ZmcyA9IEFSTV9BTTo6Z2V0QU0zT2Zmc2V0KE1PMi5nZXRJbW0oKSk7CisgIE8gPDwgJyMnCisgICAgPDwgQVJNX0FNOjpnZXRBZGRyT3BjU3RyKEFSTV9BTTo6Z2V0QU0zT3AoTU8yLmdldEltbSgpKSkKKyAgICA8PCBJbW1PZmZzOworfQorCisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50QWRkck1vZGU0T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllcikgeworICBjb25zdCBNQ09wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKzEpOworICBBUk1fQU06OkFNU3ViTW9kZSBNb2RlID0gQVJNX0FNOjpnZXRBTTRTdWJNb2RlKE1PMi5nZXRJbW0oKSk7CisgIGlmIChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJzdWJtb2RlIikgPT0gMCkgeworICAgIE8gPDwgQVJNX0FNOjpnZXRBTVN1Yk1vZGVTdHIoTW9kZSk7CisgIH0gZWxzZSBpZiAoTW9kaWZpZXIgJiYgc3RyY21wKE1vZGlmaWVyLCAid2lkZSIpID09IDApIHsKKyAgICBBUk1fQU06OkFNU3ViTW9kZSBNb2RlID0gQVJNX0FNOjpnZXRBTTRTdWJNb2RlKE1PMi5nZXRJbW0oKSk7CisgICAgaWYgKE1vZGUgPT0gQVJNX0FNOjppYSkKKyAgICAgIE8gPDwgIi53IjsKKyAgfSBlbHNlIHsKKyAgICBwcmludE9wZXJhbmQoTUksIE9wTnVtLCBPKTsKKyAgfQorfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludEFkZHJNb2RlNU9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXIpIHsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7CisgIAorICBpZiAoIU1PMS5pc1JlZygpKSB7ICAgLy8gRklYTUU6IFRoaXMgaXMgZm9yIENQIGVudHJpZXMsIGJ1dCBpc24ndCByaWdodC4KKyAgICBwcmludE9wZXJhbmQoTUksIE9wTnVtLCBPKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIGlmIChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJzdWJtb2RlIikgPT0gMCkgeworICAgIEFSTV9BTTo6QU1TdWJNb2RlIE1vZGUgPSBBUk1fQU06OmdldEFNNVN1Yk1vZGUoTU8yLmdldEltbSgpKTsKKyAgICBPIDw8IEFSTV9BTTo6Z2V0QU1TdWJNb2RlU3RyKE1vZGUpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChNb2RpZmllciAmJiBzdHJjbXAoTW9kaWZpZXIsICJiYXNlIikgPT0gMCkgeworICAgIC8vIFVzZWQgZm9yIEZTVE17RHxTfSBhbmQgTFNUTXtEfFN9IG9wZXJhdGlvbnMuCisgICAgTyA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIE8gPDwgIlsiIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpOworICAKKyAgaWYgKHVuc2lnbmVkIEltbU9mZnMgPSBBUk1fQU06OmdldEFNNU9mZnNldChNTzIuZ2V0SW1tKCkpKSB7CisgICAgTyA8PCAiLCAjIgorICAgICAgPDwgQVJNX0FNOjpnZXRBZGRyT3BjU3RyKEFSTV9BTTo6Z2V0QU01T3AoTU8yLmdldEltbSgpKSkKKyAgICAgIDw8IEltbU9mZnMqNDsKKyAgfQorICBPIDw8ICJdIjsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRBZGRyTW9kZTZPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBjb25zdCBNQ09wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKzEpOworICAKKyAgTyA8PCAiWyIgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisgIGlmIChNTzIuZ2V0SW1tKCkpIHsKKyAgICAvLyBGSVhNRTogQm90aCBkYXJ3aW4gYXMgYW5kIEdOVSBhcyB2aW9sYXRlIEFSTSBkb2NzIGhlcmUuCisgICAgTyA8PCAiLCA6IiA8PCAoTU8yLmdldEltbSgpIDw8IDMpOworICB9CisgIE8gPDwgIl0iOworfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludEFkZHJNb2RlNk9mZnNldE9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBpZiAoTU8uZ2V0UmVnKCkgPT0gMCkKKyAgICBPIDw8ICIhIjsKKyAgZWxzZQorICAgIE8gPDwgIiwgIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8uZ2V0UmVnKCkpOworfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludEFkZHJNb2RlUENPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXIpIHsKKyAgYXNzZXJ0KDAgJiYgIkZJWE1FOiBJbXBsZW1lbnQgcHJpbnRBZGRyTW9kZVBDT3BlcmFuZCIpOworfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludEJpdGZpZWxkSW52TWFza0ltbU9wZXJhbmQgKGNvbnN0IE1DSW5zdCAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICB1aW50MzJfdCB2ID0gfk1PLmdldEltbSgpOworICBpbnQzMl90IGxzYiA9IENvdW50VHJhaWxpbmdaZXJvc18zMih2KTsKKyAgaW50MzJfdCB3aWR0aCA9ICgzMiAtIENvdW50TGVhZGluZ1plcm9zXzMyICh2KSkgLSBsc2I7CisgIGFzc2VydChNTy5pc0ltbSgpICYmICJOb3QgYSB2YWxpZCBiZl9pbnZfbWFza19pbW0gdmFsdWUhIik7CisgIE8gPDwgJyMnIDw8IGxzYiA8PCAiLCAjIiA8PCB3aWR0aDsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRSZWdpc3Rlckxpc3QoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBPIDw8ICJ7IjsKKyAgZm9yICh1bnNpZ25lZCBpID0gT3BOdW0sIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoaSAhPSBPcE51bSkgTyA8PCAiLCAiOworICAgIE8gPDwgZ2V0UmVnaXN0ZXJOYW1lKE1JLT5nZXRPcGVyYW5kKGkpLmdldFJlZygpKTsKKyAgfQorICBPIDw8ICJ9IjsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRDUFNPcHRpb25PcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1DT3BlcmFuZCAmT3AgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIHVuc2lnbmVkIG9wdGlvbiA9IE9wLmdldEltbSgpOworICB1bnNpZ25lZCBtb2RlID0gb3B0aW9uICYgMzE7CisgIGJvb2wgY2hhbmdlbW9kZSA9IG9wdGlvbiA+PiA1ICYgMTsKKyAgdW5zaWduZWQgQUlGID0gb3B0aW9uID4+IDYgJiA3OworICB1bnNpZ25lZCBpbW9kID0gb3B0aW9uID4+IDkgJiAzOworICBpZiAoaW1vZCA9PSAyKQorICAgIE8gPDwgImllIjsKKyAgZWxzZSBpZiAoaW1vZCA9PSAzKQorICAgIE8gPDwgImlkIjsKKyAgTyA8PCAnXHQnOworICBpZiAoaW1vZCA+IDEpIHsKKyAgICBpZiAoQUlGICYgNCkgTyA8PCAnYSc7CisgICAgaWYgKEFJRiAmIDIpIE8gPDwgJ2knOworICAgIGlmIChBSUYgJiAxKSBPIDw8ICdmJzsKKyAgICBpZiAoQUlGID4gMCAmJiBjaGFuZ2Vtb2RlKSBPIDw8ICIsICI7CisgIH0KKyAgaWYgKGNoYW5nZW1vZGUpCisgICAgTyA8PCAnIycgPDwgbW9kZTsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRNU1JNYXNrT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTUNPcGVyYW5kICZPcCA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgdW5zaWduZWQgTWFzayA9IE9wLmdldEltbSgpOworICBpZiAoTWFzaykgeworICAgIE8gPDwgJ18nOworICAgIGlmIChNYXNrICYgOCkgTyA8PCAnZic7CisgICAgaWYgKE1hc2sgJiA0KSBPIDw8ICdzJzsKKyAgICBpZiAoTWFzayAmIDIpIE8gPDwgJ3gnOworICAgIGlmIChNYXNrICYgMSkgTyA8PCAnYyc7CisgIH0KK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnROZWdaZXJvT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTUNPcGVyYW5kICZPcCA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgTyA8PCAnIyc7CisgIGlmIChPcC5nZXRJbW0oKSA8IDApCisgICAgTyA8PCAnLScgPDwgKC1PcC5nZXRJbW0oKSAtIDEpOworICBlbHNlCisgICAgTyA8PCBPcC5nZXRJbW0oKTsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRQcmVkaWNhdGVPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIEFSTUNDOjpDb25kQ29kZXMgQ0MgPSAoQVJNQ0M6OkNvbmRDb2RlcylNSS0+Z2V0T3BlcmFuZChPcE51bSkuZ2V0SW1tKCk7CisgIGlmIChDQyAhPSBBUk1DQzo6QUwpCisgICAgTyA8PCBBUk1Db25kQ29kZVRvU3RyaW5nKENDKTsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRNYW5kYXRvcnlQcmVkaWNhdGVPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIEFSTUNDOjpDb25kQ29kZXMgQ0MgPSAoQVJNQ0M6OkNvbmRDb2RlcylNSS0+Z2V0T3BlcmFuZChPcE51bSkuZ2V0SW1tKCk7CisgIE8gPDwgQVJNQ29uZENvZGVUb1N0cmluZyhDQyk7Cit9CisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50U0JpdE1vZGlmaWVyT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBpZiAoTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldFJlZygpKSB7CisgICAgYXNzZXJ0KE1JLT5nZXRPcGVyYW5kKE9wTnVtKS5nZXRSZWcoKSA9PSBBUk06OkNQU1IgJiYKKyAgICAgICAgICAgIkV4cGVjdCBBUk0gQ1BTUiByZWdpc3RlciEiKTsKKyAgICBPIDw8ICdzJzsKKyAgfQorfQorCisKKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRDUEluc3RPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyKSB7CisgIC8vIEZJWE1FOiByZW1vdmUgdGhpcy4KKyAgYWJvcnQoKTsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnROb0hhc2hJbW1lZGlhdGUoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBPIDw8IE1JLT5nZXRPcGVyYW5kKE9wTnVtKS5nZXRJbW0oKTsKK30KKworCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludFBDTGFiZWwoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgLy8gRklYTUU6IHJlbW92ZSB0aGlzLgorICBhYm9ydCgpOworfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludFRodW1iUzRJbW1PcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBPIDw8ICIjIiA8PCAgTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldEltbSgpICogNDsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRUaHVtYklUTWFzayhjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgLy8gKDMgLSB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zKSBpcyB0aGUgbnVtYmVyIG9mIHRoZW4gLyBlbHNlLgorICB1bnNpZ25lZCBNYXNrID0gTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldEltbSgpOworICB1bnNpZ25lZCBDb25kQml0MCA9IE1hc2sgPj4gNCAmIDE7CisgIHVuc2lnbmVkIE51bVRaID0gQ291bnRUcmFpbGluZ1plcm9zXzMyKE1hc2spOworICBhc3NlcnQoTnVtVFogPD0gMyAmJiAiSW52YWxpZCBJVCBtYXNrISIpOworICBmb3IgKHVuc2lnbmVkIFBvcyA9IDMsIGUgPSBOdW1UWjsgUG9zID4gZTsgLS1Qb3MpIHsKKyAgICBib29sIFQgPSAoKE1hc2sgPj4gUG9zKSAmIDEpID09IENvbmRCaXQwOworICAgIGlmIChUKQorICAgICAgTyA8PCAndCc7CisgICAgZWxzZQorICAgICAgTyA8PCAnZSc7CisgIH0KK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRUaHVtYkFkZHJNb2RlUlJPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3ApOworICBjb25zdCBNQ09wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wKzEpOworICBPIDw8ICJbIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKyAgTyA8PCAiLCAiIDw8IGdldFJlZ2lzdGVyTmFtZShNTzIuZ2V0UmVnKCkpIDw8ICJdIjsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRUaHVtYkFkZHJNb2RlUkk1T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNjYWxlKSB7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3ApOworICBjb25zdCBNQ09wZXJhbmQgJk1PMiA9IE1JLT5nZXRPcGVyYW5kKE9wKzEpOworICBjb25zdCBNQ09wZXJhbmQgJk1PMyA9IE1JLT5nZXRPcGVyYW5kKE9wKzIpOworCisgIGlmICghTU8xLmlzUmVnKCkpIHsgICAvLyBGSVhNRTogVGhpcyBpcyBmb3IgQ1AgZW50cmllcywgYnV0IGlzbid0IHJpZ2h0LgorICAgIHByaW50T3BlcmFuZChNSSwgT3AsIE8pOworICAgIHJldHVybjsKKyAgfQorCisgIE8gPDwgIlsiIDw8IGdldFJlZ2lzdGVyTmFtZShNTzEuZ2V0UmVnKCkpOworICBpZiAoTU8zLmdldFJlZygpKQorICAgIE8gPDwgIiwgIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8zLmdldFJlZygpKTsKKyAgZWxzZSBpZiAodW5zaWduZWQgSW1tT2ZmcyA9IE1PMi5nZXRJbW0oKSkKKyAgICBPIDw8ICIsICMiIDw8IEltbU9mZnMgKiBTY2FsZTsKKyAgTyA8PCAiXSI7Cit9CisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50VGh1bWJBZGRyTW9kZVMxT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBwcmludFRodW1iQWRkck1vZGVSSTVPcGVyYW5kKE1JLCBPcCwgTywgMSk7Cit9CisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50VGh1bWJBZGRyTW9kZVMyT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBwcmludFRodW1iQWRkck1vZGVSSTVPcGVyYW5kKE1JLCBPcCwgTywgMik7Cit9CisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50VGh1bWJBZGRyTW9kZVM0T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBwcmludFRodW1iQWRkck1vZGVSSTVPcGVyYW5kKE1JLCBPcCwgTywgNCk7Cit9CisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50VGh1bWJBZGRyTW9kZVNQT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wKTsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcCsxKTsKKyAgTyA8PCAiWyIgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisgIGlmICh1bnNpZ25lZCBJbW1PZmZzID0gTU8yLmdldEltbSgpKQorICAgIE8gPDwgIiwgIyIgPDwgSW1tT2Zmcyo0OworICBPIDw8ICJdIjsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRUQkFkZHJNb2RlKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIE8gPDwgIltwYywgIiA8PCBnZXRSZWdpc3Rlck5hbWUoTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldFJlZygpKTsKKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBBUk06OnQyVEJIKQorICAgIE8gPDwgIiwgbHNsICMxIjsKKyAgTyA8PCAnXSc7Cit9CisKKy8vIENvbnN0YW50IHNoaWZ0cyB0Ml9zb19yZWcgaXMgYSAyLW9wZXJhbmQgdW5pdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBUaHVtYjIKKy8vIHJlZ2lzdGVyIHdpdGggc2hpZnQgZm9ybXMuCisvLyBSRUcgMCAgIDAgICAgICAgICAgIC0gZS5nLiBSNQorLy8gUkVHIElNTSwgU0hfT1BDICAgICAtIGUuZy4gUjUsIExTTCAjMwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRUMlNPT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7CisKKyAgdW5zaWduZWQgUmVnID0gTU8xLmdldFJlZygpOworICBPIDw8IGdldFJlZ2lzdGVyTmFtZShSZWcpOworCisgIC8vIFByaW50IHRoZSBzaGlmdCBvcGMuCisgIGFzc2VydChNTzIuaXNJbW0oKSAmJiAiTm90IGEgdmFsaWQgdDJfc29fcmVnIHZhbHVlISIpOworICBBUk1fQU06OlNoaWZ0T3BjIFNoT3BjID0gQVJNX0FNOjpnZXRTT1JlZ1NoT3AoTU8yLmdldEltbSgpKTsKKyAgTyA8PCAiLCAiIDw8IEFSTV9BTTo6Z2V0U2hpZnRPcGNTdHIoU2hPcGMpOworICBpZiAoU2hPcGMgIT0gQVJNX0FNOjpycngpCisgICAgTyA8PCAiICMiIDw8IEFSTV9BTTo6Z2V0U09SZWdPZmZzZXQoTU8yLmdldEltbSgpKTsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRUMkFkZHJNb2RlSW1tMTJPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7CisKKyAgTyA8PCAiWyIgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisKKyAgdW5zaWduZWQgT2ZmSW1tID0gTU8yLmdldEltbSgpOworICBpZiAoT2ZmSW1tKSAgLy8gRG9uJ3QgcHJpbnQgKzAuCisgICAgTyA8PCAiLCAjIiA8PCBPZmZJbW07CisgIE8gPDwgIl0iOworfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludFQyQWRkck1vZGVJbW04T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSsxKTsKKworICBPIDw8ICJbIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKworICBpbnQzMl90IE9mZkltbSA9IChpbnQzMl90KU1PMi5nZXRJbW0oKTsKKyAgLy8gRG9uJ3QgcHJpbnQgKzAuCisgIGlmIChPZmZJbW0gPCAwKQorICAgIE8gPDwgIiwgIy0iIDw8IC1PZmZJbW07CisgIGVsc2UgaWYgKE9mZkltbSA+IDApCisgICAgTyA8PCAiLCAjIiA8PCBPZmZJbW07CisgIE8gPDwgIl0iOworfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludFQyQWRkck1vZGVJbW04czRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzIgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSsxKTsKKworICBPIDw8ICJbIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8xLmdldFJlZygpKTsKKworICBpbnQzMl90IE9mZkltbSA9IChpbnQzMl90KU1PMi5nZXRJbW0oKSAvIDQ7CisgIC8vIERvbid0IHByaW50ICswLgorICBpZiAoT2ZmSW1tIDwgMCkKKyAgICBPIDw8ICIsICMtIiA8PCAtT2ZmSW1tICogNDsKKyAgZWxzZSBpZiAoT2ZmSW1tID4gMCkKKyAgICBPIDw8ICIsICMiIDw8IE9mZkltbSAqIDQ7CisgIE8gPDwgIl0iOworfQorCit2b2lkIEFSTUluc3RQcmludGVyOjpwcmludFQyQWRkck1vZGVJbW04T2Zmc2V0T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk1PMSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKyAgaW50MzJfdCBPZmZJbW0gPSAoaW50MzJfdClNTzEuZ2V0SW1tKCk7CisgIC8vIERvbid0IHByaW50ICswLgorICBpZiAoT2ZmSW1tIDwgMCkKKyAgICBPIDw8ICIjLSIgPDwgLU9mZkltbTsKKyAgZWxzZSBpZiAoT2ZmSW1tID4gMCkKKyAgICBPIDw8ICIjIiA8PCBPZmZJbW07Cit9CisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50VDJBZGRyTW9kZUltbThzNE9mZnNldE9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBpbnQzMl90IE9mZkltbSA9IChpbnQzMl90KU1PMS5nZXRJbW0oKSAvIDQ7CisgIC8vIERvbid0IHByaW50ICswLgorICBpZiAoT2ZmSW1tIDwgMCkKKyAgICBPIDw8ICIjLSIgPDwgLU9mZkltbSAqIDQ7CisgIGVsc2UgaWYgKE9mZkltbSA+IDApCisgICAgTyA8PCAiIyIgPDwgT2ZmSW1tICogNDsKK30KKwordm9pZCBBUk1JbnN0UHJpbnRlcjo6cHJpbnRUMkFkZHJNb2RlU29SZWdPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTUNPcGVyYW5kICZNTzEgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8yID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7CisgIGNvbnN0IE1DT3BlcmFuZCAmTU8zID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMik7CisKKyAgTyA8PCAiWyIgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PMS5nZXRSZWcoKSk7CisKKyAgYXNzZXJ0KE1PMi5nZXRSZWcoKSAmJiAiSW52YWxpZCBzb19yZWcgbG9hZCAvIHN0b3JlIGFkZHJlc3MhIik7CisgIE8gPDwgIiwgIiA8PCBnZXRSZWdpc3Rlck5hbWUoTU8yLmdldFJlZygpKTsKKworICB1bnNpZ25lZCBTaEFtdCA9IE1PMy5nZXRJbW0oKTsKKyAgaWYgKFNoQW10KSB7CisgICAgYXNzZXJ0KFNoQW10IDw9IDMgJiYgIk5vdCBhIHZhbGlkIFRodW1iMiBhZGRyZXNzaW5nIG1vZGUhIik7CisgICAgTyA8PCAiLCBsc2wgIyIgPDwgU2hBbXQ7CisgIH0KKyAgTyA8PCAiXSI7Cit9CisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50VkZQZjMySW1tT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBPIDw8ICcjJyA8PCBNSS0+Z2V0T3BlcmFuZChPcE51bSkuZ2V0SW1tKCk7Cit9CisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50VkZQZjY0SW1tT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBPIDw8ICcjJyA8PCBNSS0+Z2V0T3BlcmFuZChPcE51bSkuZ2V0SW1tKCk7Cit9CisKK3ZvaWQgQVJNSW5zdFByaW50ZXI6OnByaW50TkVPTk1vZEltbU9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIHVuc2lnbmVkIEVuY29kZWRJbW0gPSBNSS0+Z2V0T3BlcmFuZChPcE51bSkuZ2V0SW1tKCk7CisgIHVuc2lnbmVkIEVsdEJpdHM7CisgIHVpbnQ2NF90IFZhbCA9IEFSTV9BTTo6ZGVjb2RlTkVPTk1vZEltbShFbmNvZGVkSW1tLCBFbHRCaXRzKTsKKyAgTyA8PCAiIzB4IiA8PCB1dG9oZXhzdHIoVmFsKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVByaW50ZXIvQVJNSW5zdFByaW50ZXIuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVByaW50ZXIvQVJNSW5zdFByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGY1MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUHJpbnRlci9BUk1JbnN0UHJpbnRlci5oCkBAIC0wLDAgKzEsMTE2IEBACisvLz09PS0tIEFSTUluc3RQcmludGVyLmggLSBDb252ZXJ0IEFSTSBNQ0luc3QgdG8gYXNzZW1ibHkgc3ludGF4IC0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgcHJpbnRzIGFuIEFSTSBNQ0luc3QgdG8gYSAucyBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQVJNSU5TVFBSSU5URVJfSAorI2RlZmluZSBBUk1JTlNUUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdFByaW50ZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNQ09wZXJhbmQ7CisgIAorY2xhc3MgQVJNSW5zdFByaW50ZXIgOiBwdWJsaWMgTUNJbnN0UHJpbnRlciB7CisgIGJvb2wgVmVyYm9zZUFzbTsKK3B1YmxpYzoKKyAgQVJNSW5zdFByaW50ZXIoY29uc3QgTUNBc21JbmZvICZNQUksIGJvb2wgdmVyYm9zZUFzbSkKKyAgICA6IE1DSW5zdFByaW50ZXIoTUFJKSwgVmVyYm9zZUFzbSh2ZXJib3NlQXNtKSB7fQorCisgIHZpcnR1YWwgdm9pZCBwcmludEluc3QoY29uc3QgTUNJbnN0ICpNSSwgcmF3X29zdHJlYW0gJk8pOworICAKKyAgLy8gQXV0b2dlbmVyYXRlZCBieSB0YmxnZW4uCisgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgKk1JLCByYXdfb3N0cmVhbSAmTyk7CisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRSZWdpc3Rlck5hbWUodW5zaWduZWQgUmVnTm8pOworCisKKyAgdm9pZCBwcmludE9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyID0gMCk7CisgICAgCisgIHZvaWQgcHJpbnRTT0ltbU9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludFNPSW1tMlBhcnRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgIAorICB2b2lkIHByaW50U09SZWdPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgIHZvaWQgcHJpbnRBZGRyTW9kZTJPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgIHZvaWQgcHJpbnRBZGRyTW9kZTJPZmZzZXRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgIHZvaWQgcHJpbnRBZGRyTW9kZTNPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgIHZvaWQgcHJpbnRBZGRyTW9kZTNPZmZzZXRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgIHZvaWQgcHJpbnRBZGRyTW9kZTRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLCByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXIgPSAwKTsKKyAgdm9pZCBwcmludEFkZHJNb2RlNU9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllciA9IDApOworICB2b2lkIHByaW50QWRkck1vZGU2T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50QWRkck1vZGU2T2Zmc2V0T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50QWRkck1vZGVQQ09wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXIgPSAwKTsKKworICB2b2lkIHByaW50Qml0ZmllbGRJbnZNYXNrSW1tT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworCisgIHZvaWQgcHJpbnRUaHVtYlM0SW1tT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50VGh1bWJJVE1hc2soY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludFRodW1iQWRkck1vZGVSUk9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludFRodW1iQWRkck1vZGVSSTVPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8sIHVuc2lnbmVkIFNjYWxlKTsKKyAgdm9pZCBwcmludFRodW1iQWRkck1vZGVTMU9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludFRodW1iQWRkck1vZGVTMk9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludFRodW1iQWRkck1vZGVTNE9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludFRodW1iQWRkck1vZGVTUE9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgCisgIHZvaWQgcHJpbnRUMlNPT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50VDJBZGRyTW9kZUltbTEyT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50VDJBZGRyTW9kZUltbThPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludFQyQWRkck1vZGVJbW04czRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50VDJBZGRyTW9kZUltbThPZmZzZXRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludFQyQWRkck1vZGVJbW04czRPZmZzZXRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50VDJBZGRyTW9kZVNvUmVnT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAKKyAgdm9pZCBwcmludENQU09wdGlvbk9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludE1TUk1hc2tPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgIHZvaWQgcHJpbnROZWdaZXJvT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50UHJlZGljYXRlT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50TWFuZGF0b3J5UHJlZGljYXRlT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50U0JpdE1vZGlmaWVyT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50UmVnaXN0ZXJMaXN0KGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgIHZvaWQgcHJpbnRDUEluc3RPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLCByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXIpOworICB2b2lkIHByaW50SlRCbG9ja09wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sIHJhd19vc3RyZWFtICZPKSB7fQorICB2b2lkIHByaW50SlQyQmxvY2tPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTnVtLCByYXdfb3N0cmVhbSAmTykge30KKyAgdm9pZCBwcmludFRCQWRkck1vZGUoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludE5vSGFzaEltbWVkaWF0ZShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50VkZQZjMySW1tT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50VkZQZjY0SW1tT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwgcmF3X29zdHJlYW0gJk8pOworICB2b2lkIHByaW50TkVPTk1vZEltbU9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKworICB2b2lkIHByaW50UENMYWJlbChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE51bSwgcmF3X29zdHJlYW0gJk8pOyAgCisgIC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgIHZvaWQgUHJpbnRTcGVjaWFsKGNvbnN0IE1DSW5zdCAqTUksIHJhd19vc3RyZWFtICZPLCBjb25zdCBjaGFyICpLaW5kKSB7fQorfTsKKyAgCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2NDVjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uICkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNQVJNQXNtUHJpbnRlcgorICBBUk1JbnN0UHJpbnRlci5jcHAKKyAgKQorYWRkX2RlcGVuZGVuY2llcyhMTFZNQVJNQXNtUHJpbnRlciBBUk1Db2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQXNtUHJpbnRlci9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVByaW50ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkMzcyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0FzbVByaW50ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvQVJNL0FzbVByaW50ZXIvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUFSTUFzbVByaW50ZXIKKworIyBIYWNrOiB3ZSBuZWVkIHRvIGluY2x1ZGUgJ21haW4nIGFybSB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFAuRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2NTU3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDkgQEAKK3NldChMTFZNX1RBUkdFVF9ERUZJTklUSU9OUyBBUk0udGQpCisKK3RhYmxlZ2VuKEFSTUdlblJlZ2lzdGVySW5mby5oLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MtaGVhZGVyKQordGFibGVnZW4oQVJNR2VuUmVnaXN0ZXJOYW1lcy5pbmMgLWdlbi1yZWdpc3Rlci1lbnVtcykKK3RhYmxlZ2VuKEFSTUdlblJlZ2lzdGVySW5mby5pbmMgLWdlbi1yZWdpc3Rlci1kZXNjKQordGFibGVnZW4oQVJNR2VuSW5zdHJOYW1lcy5pbmMgLWdlbi1pbnN0ci1lbnVtcykKK3RhYmxlZ2VuKEFSTUdlbkluc3RySW5mby5pbmMgLWdlbi1pbnN0ci1kZXNjKQordGFibGVnZW4oQVJNR2VuQ29kZUVtaXR0ZXIuaW5jIC1nZW4tZW1pdHRlcikKK3RhYmxlZ2VuKEFSTUdlbkFzbVdyaXRlci5pbmMgLWdlbi1hc20td3JpdGVyKQordGFibGVnZW4oQVJNR2VuREFHSVNlbC5pbmMgLWdlbi1kYWctaXNlbCkKK3RhYmxlZ2VuKEFSTUdlbkNhbGxpbmdDb252LmluYyAtZ2VuLWNhbGxpbmdjb252KQordGFibGVnZW4oQVJNR2VuU3VidGFyZ2V0LmluYyAtZ2VuLXN1YnRhcmdldCkKK3RhYmxlZ2VuKEFSTUdlbkVESW5mby5pbmMgLWdlbi1lbmhhbmNlZC1kaXNhc3NlbWJseS1pbmZvKQordGFibGVnZW4oQVJNR2VuRmFzdElTZWwuaW5jIC1nZW4tZmFzdC1pc2VsKQorCithZGRfbGx2bV90YXJnZXQoQVJNQ29kZUdlbgorICBBUk1Bc21QcmludGVyLmNwcAorICBBUk1CYXNlSW5zdHJJbmZvLmNwcAorICBBUk1CYXNlUmVnaXN0ZXJJbmZvLmNwcAorICBBUk1Db2RlRW1pdHRlci5jcHAKKyAgQVJNQ29uc3RhbnRJc2xhbmRQYXNzLmNwcAorICBBUk1Db25zdGFudFBvb2xWYWx1ZS5jcHAKKyAgQVJNRXhwYW5kUHNldWRvSW5zdHMuY3BwCisgIEFSTUZhc3RJU2VsLmNwcAorICBBUk1HbG9iYWxNZXJnZS5jcHAKKyAgQVJNSVNlbERBR1RvREFHLmNwcAorICBBUk1JU2VsTG93ZXJpbmcuY3BwCisgIEFSTUluc3RySW5mby5jcHAKKyAgQVJNSklUSW5mby5jcHAKKyAgQVJNTG9hZFN0b3JlT3B0aW1pemVyLmNwcAorICBBUk1NQ0FzbUluZm8uY3BwCisgIEFSTU1DSW5zdExvd2VyLmNwcAorICBBUk1SZWdpc3RlckluZm8uY3BwCisgIEFSTVNlbGVjdGlvbkRBR0luZm8uY3BwCisgIEFSTVN1YnRhcmdldC5jcHAKKyAgQVJNVGFyZ2V0TWFjaGluZS5jcHAKKyAgQVJNVGFyZ2V0T2JqZWN0RmlsZS5jcHAKKyAgTkVPTk1vdmVGaXguY3BwCisgIE5FT05QcmVBbGxvY1Bhc3MuY3BwCisgIFRodW1iMUluc3RySW5mby5jcHAKKyAgVGh1bWIxUmVnaXN0ZXJJbmZvLmNwcAorICBUaHVtYjJIYXphcmRSZWNvZ25pemVyLmNwcAorICBUaHVtYjJJVEJsb2NrUGFzcy5jcHAKKyAgVGh1bWIySW5zdHJJbmZvLmNwcAorICBUaHVtYjJSZWdpc3RlckluZm8uY3BwCisgIFRodW1iMlNpemVSZWR1Y3Rpb24uY3BwCisgICkKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChMTFZNQVJNQ29kZUdlbiBMTFZNQVJNQXNtUHJpbnRlciBMTFZNU2VsZWN0aW9uREFHKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL0FSTURpc2Fzc2VtYmxlci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9EaXNhc3NlbWJsZXIvQVJNRGlzYXNzZW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGU2OTdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL0FSTURpc2Fzc2VtYmxlci5jcHAKQEAgLTAsMCArMSw1NzggQEAKKy8vPT09LSBBUk1EaXNhc3NlbWJsZXIuY3BwIC0gRGlzYXNzZW1ibGVyIGZvciBBUk0vVGh1bWIgSVNBIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFSTSBEaXNhc3NlbWJsZXIuCisvLyBJdCBjb250YWlucyBjb2RlIHRvIGltcGxlbWVudCB0aGUgcHVibGljIGludGVyZmFjZXMgb2YgQVJNRGlzYXNzZW1ibGVyIGFuZAorLy8gVGh1bWJEaXNhc3NlbWJsZXIsIGJvdGggb2Ygd2hpY2ggYXJlIGluc3RhbmNlcyBvZiBNQ0Rpc2Fzc2VtYmxlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFybS1kaXNhc3NlbWJsZXIiCisKKyNpbmNsdWRlICJBUk1EaXNhc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJBUk1EaXNhc3NlbWJsZXJDb3JlLmgiCisKKyNpbmNsdWRlICJsbHZtL01DL0VESW5zdEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeU9iamVjdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKKy8vLyBBUk1HZW5EZWNvZGVyVGFibGVzLmluYyAtIEFSTURlY29kZXJUYWJsZXMuaW5jIGlzIHRibGdlbidlZCBmcm9tCisvLy8gQVJNRGVjb2RlckVtaXR0ZXIuY3BwIFRhYmxlR2VuIGJhY2tlbmQuICBJdCBjb250YWluczoKKy8vLworLy8vIG8gTWFwcGluZ3MgZnJvbSBvcGNvZGUgdG8gQVJNL1RodW1iIGluc3RydWN0aW9uIGZvcm1hdAorLy8vCisvLy8gbyBzdGF0aWMgdWludDE2X3QgZGVjb2RlSW5zdHJ1Y3Rpb24odWludDMyX3QgaW5zbikgLSB0aGUgZGVjb2RpbmcgZnVuY3Rpb24KKy8vLyBmb3IgYW4gQVJNIGluc3RydWN0aW9uLgorLy8vCisvLy8gbyBzdGF0aWMgdWludDE2X3QgZGVjb2RlVGh1bWJJbnN0cnVjdGlvbihmaWVsZF90IGluc24pIC0gdGhlIGRlY29kaW5nCisvLy8gZnVuY3Rpb24gZm9yIGEgVGh1bWIgaW5zdHJ1Y3Rpb24uCisvLy8KKyNpbmNsdWRlICIuLi9BUk1HZW5EZWNvZGVyVGFibGVzLmluYyIKKworI2luY2x1ZGUgIi4uL0FSTUdlbkVESW5mby5pbmMiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gc2hvd0JpdFZlY3RvciAtIFVzZSB0aGUgcmF3X29zdHJlYW0gdG8gbG9nIGEgZGlhZ25vc3RpYyBtZXNzYWdlIGRlc2NyaWJpbmcKKy8vLyB0aGUgaW5pZGl2aWR1YWwgYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisvLy8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzaG93Qml0VmVjdG9yKHJhd19vc3RyZWFtICZvcywgY29uc3QgdWludDMyX3QgJmluc24pIHsKKyAgLy8gU3BsaXQgdGhlIGJpdCBwb3NpdGlvbiBtYXJrZXJzIGludG8gbW9yZSB0aGFuIG9uZSBsaW5lcyB0byBmaXQgODAgY29sdW1ucy4KKyAgb3MgPDwgIiAzMSAzMCAyOSAyOCAyNyAyNiAyNSAyNCAyMyAyMiAyMSAyMCAxOSAxOCAxNyAxNiAxNSAxNCAxMyAxMiAxMSIKKyAgICAgPDwgIiAxMCAgOSAgOCAgNyAgNiAgNSAgNCAgMyAgMiAgMSAgMCBcbiI7CisgIG9zIDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgIDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICBvcyA8PCAnfCc7CisgIGZvciAodW5zaWduZWQgaSA9IDMyOyBpICE9IDA7IC0taSkgeworICAgIGlmIChpbnNuID4+IChpIC0gMSkgJiAweDAxKQorICAgICAgb3MgPDwgIiAxIjsKKyAgICBlbHNlCisgICAgICBvcyA8PCAiIDAiOworICAgIG9zIDw8IChpJTQgPT0gMSA/ICd8JyA6ICc6Jyk7CisgIH0KKyAgb3MgPDwgJ1xuJzsKKyAgLy8gU3BsaXQgdGhlIGJpdCBwb3NpdGlvbiBtYXJrZXJzIGludG8gbW9yZSB0aGFuIG9uZSBsaW5lcyB0byBmaXQgODAgY29sdW1ucy4KKyAgb3MgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgIG9zIDw8ICdcbic7Cit9CisKKy8vLyBkZWNvZGVBUk1JbnN0cnVjdGlvbiBpcyBhIGRlY29yYXRvciBmdW5jdGlvbiB3aGljaCB0cmllcyBzcGVjaWFsIGNhc2VzIG9mCisvLy8gaW5zdHJ1Y3Rpb24gbWF0Y2hpbmcgYmVmb3JlIGNhbGxpbmcgdGhlIGF1dG8tZ2VuZXJhdGVkIGRlY29kZXIgZnVuY3Rpb24uCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlQVJNSW5zdHJ1Y3Rpb24odWludDMyX3QgJmluc24pIHsKKyAgaWYgKHNsaWNlKGluc24sIDMxLCAyOCkgPT0gMTUpCisgICAgZ290byBBdXRvR2VuZWREZWNvZGVyOworCisgIC8vIFNwZWNpYWwgY2FzZSBwcm9jZXNzaW5nLCBpZiBhbnksIGdvZXMgaGVyZS4uLi4KKworICAvLyBMTFZNIGNvbWJpbmVzIHRoZSBvZmZzZXQgbW9kZSBvZiBBOC42LjE5NyAmIEE4LjYuMTk4IGludG8gU1RSQi4KKyAgLy8gVGhlIGluc3VmZmljaWVudCBlbmNvZGluZyBpbmZvcm1hdGlvbiBvZiB0aGUgY29tYmluZWQgaW5zdHJ1Y3Rpb24gY29uZnVzZXMKKyAgLy8gdGhlIGRlY29kZXIgd3J0IEJGQy9CRkkuICBUaGVyZWZvcmUsIHdlIHRyeSB0byByZWNvdmVyIGhlcmUuCisgIC8vIEZvciBCRkMsIEluc3R7MjctMjF9ID0gMGIwMTExMTEwICYgSW5zdHs2LTB9ID0gMGIwMDExMTExLgorICAvLyBGb3IgQkZJLCBJbnN0ezI3LTIxfSA9IDBiMDExMTExMCAmIEluc3R7Ni00fSA9IDBiMDAxICYgSW5zdHszLTB9ID0hIDBiMTExMS4KKyAgaWYgKHNsaWNlKGluc24sIDI3LCAyMSkgPT0gMHgzZSAmJiBzbGljZShpbnNuLCA2LCA0KSA9PSAxKSB7CisgICAgaWYgKHNsaWNlKGluc24sIDMsIDApID09IDE1KQorICAgICAgcmV0dXJuIEFSTTo6QkZDOworICAgIGVsc2UKKyAgICAgIHJldHVybiBBUk06OkJGSTsKKyAgfQorCisgIC8vIERpdHRvIGZvciBBRERTcnMsIHdoaWNoIGlzIGEgc3VwZXItaW5zdHJ1Y3Rpb24gZm9yIEE4LjYuNyAmIEE4LjYuOC4KKyAgLy8gQXMgYSByZXN1bHQsIHRoZSBkZWNvZGVyIGZhaWxzIHRvIGRlY29kZSBVTVVMTCBwcm9wZXJseS4KKyAgaWYgKHNsaWNlKGluc24sIDI3LCAyMSkgPT0gMHgwNCAmJiBzbGljZShpbnNuLCA3LCA0KSA9PSA5KSB7CisgICAgcmV0dXJuIEFSTTo6VU1VTEw7CisgIH0KKworICAvLyBEaXR0byBmb3IgU1RSX1BSRSwgd2hpY2ggaXMgYSBzdXBlci1pbnN0cnVjdGlvbiBmb3IgQTguNi4xOTQgJiBBOC42LjE5NS4KKyAgLy8gQXMgYSByZXN1bHQsIHRoZSBkZWNvZGVyIGZhaWxzIHRvIGRlY29kZSBTQkZYIHByb3Blcmx5LgorICBpZiAoc2xpY2UoaW5zbiwgMjcsIDIxKSA9PSAweDNkICYmIHNsaWNlKGluc24sIDYsIDQpID09IDUpCisgICAgcmV0dXJuIEFSTTo6U0JGWDsKKworICAvLyBBbmQgU1RSQl9QUkUsIHdoaWNoIGlzIGEgc3VwZXItaW5zdHJ1Y3Rpb24gZm9yIEE4LjYuMTk3ICYgQTguNi4xOTguCisgIC8vIEFzIGEgcmVzdWx0LCB0aGUgZGVjb2RlciBmYWlscyB0byBkZWNvZGUgVUJGWCBwcm9wZXJseS4KKyAgaWYgKHNsaWNlKGluc24sIDI3LCAyMSkgPT0gMHgzZiAmJiBzbGljZShpbnNuLCA2LCA0KSA9PSA1KQorICAgIHJldHVybiBBUk06OlVCRlg7CisKKyAgLy8gRGl0dG8gZm9yIFNUUlQsIHdoaWNoIGlzIGEgc3VwZXItaW5zdHJ1Y3Rpb24gZm9yIEE4LjYuMjEwIEVuY29kaW5nIEExICYgQTIuCisgIC8vIEFzIGEgcmVzdWx0LCB0aGUgZGVjb2RlciBmYWlscyB0byBkZW9jb2RlIFNTQVQgcHJvcGVybHkuCisgIGlmIChzbGljZShpbnNuLCAyNywgMjEpID09IDB4MzUgJiYgc2xpY2UoaW5zbiwgNSwgNCkgPT0gMSkKKyAgICByZXR1cm4gc2xpY2UoaW5zbiwgNiwgNikgPT0gMCA/IEFSTTo6U1NBVGxzbCA6IEFSTTo6U1NBVGFzcjsKKworICAvLyBEaXR0byBmb3IgUlNDcnMsIHdoaWNoIGlzIGEgc3VwZXItaW5zdHJ1Y3Rpb24gZm9yIEE4LjYuMTQ2ICYgQTguNi4xNDcuCisgIC8vIEFzIGEgcmVzdWx0LCB0aGUgZGVjb2RlciBmYWlscyB0byBkZWNvZGUgU1RSSFQvTERSSFQvTERSU0hUL0xEUlNCVC4KKyAgaWYgKHNsaWNlKGluc24sIDI3LCAyNCkgPT0gMCkgeworICAgIHN3aXRjaCAoc2xpY2UoaW5zbiwgMjEsIDIwKSkgeworICAgIGNhc2UgMjoKKyAgICAgIHN3aXRjaCAoc2xpY2UoaW5zbiwgNywgNCkpIHsKKyAgICAgIGNhc2UgMTE6CisgICAgICAgIHJldHVybiBBUk06OlNUUkhUOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7IC8vIGZhbGx0aHJvdWdoCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBzd2l0Y2ggKHNsaWNlKGluc24sIDcsIDQpKSB7CisgICAgICBjYXNlIDExOgorICAgICAgICByZXR1cm4gQVJNOjpMRFJIVDsKKyAgICAgIGNhc2UgMTM6CisgICAgICAgIHJldHVybiBBUk06OkxEUlNCVDsKKyAgICAgIGNhc2UgMTU6CisgICAgICAgIHJldHVybiBBUk06OkxEUlNIVDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOyAvLyBmYWxsdGhyb3VnaAorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOyAgIC8vIGZhbGx0aHJvdWdoCisgICAgfQorICB9CisKKyAgLy8gRGl0dG8gZm9yIFNCQ3JzLCB3aGljaCBpcyBhIHN1cGVyLWluc3RydWN0aW9uIGZvciBBOC42LjE1MiAmIEE4LjYuMTUzLgorICAvLyBBcyBhIHJlc3VsdCwgdGhlIGRlY29kZXIgZmFpbHMgdG8gZGVjb2RlIFNUUkhfUG9zdC9MRFJEX1BPU1QvU1RSRF9QT1NUCisgIC8vIHByb3Blcmx5LgorICBpZiAoc2xpY2UoaW5zbiwgMjcsIDI1KSA9PSAwICYmIHNsaWNlKGluc24sIDIwLCAyMCkgPT0gMCkgeworICAgIHVuc2lnbmVkIFBXID0gc2xpY2UoaW5zbiwgMjQsIDI0KSA8PCAxIHwgc2xpY2UoaW5zbiwgMjEsIDIxKTsKKyAgICBzd2l0Y2ggKHNsaWNlKGluc24sIDcsIDQpKSB7CisgICAgY2FzZSAxMToKKyAgICAgIHN3aXRjaCAoUFcpIHsKKyAgICAgIGNhc2UgMjogLy8gT2Zmc2V0CisgICAgICAgIHJldHVybiBBUk06OlNUUkg7CisgICAgICBjYXNlIDM6IC8vIFByZS1pbmRleGVkCisgICAgICAgIHJldHVybiBBUk06OlNUUkhfUFJFOworICAgICAgY2FzZSAwOiAvLyBQb3N0LWluZGV4ZWQKKyAgICAgICAgcmV0dXJuIEFSTTo6U1RSSF9QT1NUOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7IC8vIGZhbGx0aHJvdWdoCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgc3dpdGNoIChQVykgeworICAgICAgY2FzZSAyOiAvLyBPZmZzZXQKKyAgICAgICAgcmV0dXJuIEFSTTo6TERSRDsKKyAgICAgIGNhc2UgMzogLy8gUHJlLWluZGV4ZWQKKyAgICAgICAgcmV0dXJuIEFSTTo6TERSRF9QUkU7CisgICAgICBjYXNlIDA6IC8vIFBvc3QtaW5kZXhlZAorICAgICAgICByZXR1cm4gQVJNOjpMRFJEX1BPU1Q7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsgLy8gZmFsbHRocm91Z2gKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTU6CisgICAgICBzd2l0Y2ggKFBXKSB7CisgICAgICBjYXNlIDI6IC8vIE9mZnNldAorICAgICAgICByZXR1cm4gQVJNOjpTVFJEOworICAgICAgY2FzZSAzOiAvLyBQcmUtaW5kZXhlZAorICAgICAgICByZXR1cm4gQVJNOjpTVFJEX1BSRTsKKyAgICAgIGNhc2UgMDogLy8gUG9zdC1pbmRleGVkCisgICAgICAgIHJldHVybiBBUk06OlNUUkRfUE9TVDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOyAvLyBmYWxsdGhyb3VnaAorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOyAvLyBmYWxsdGhyb3VnaAorICAgIH0KKyAgfQorCisgIC8vIERpdHRvIGZvciBTQkNTU3JzLCB3aGljaCBpcyBhIHN1cGVyLWluc3RydWN0aW9uIGZvciBBOC42LjE1MiAmIEE4LjYuMTUzLgorICAvLyBBcyBhIHJlc3VsdCwgdGhlIGRlY29kZXIgZmFpbHMgdG8gZGVjb2RlIExEUkhfUE9TVC9MRFJTQl9QT1NUL0xEUlNIX1BPU1QKKyAgLy8gcHJvcGVybHkuCisgIGlmIChzbGljZShpbnNuLCAyNywgMjUpID09IDAgJiYgc2xpY2UoaW5zbiwgMjAsIDIwKSA9PSAxKSB7CisgICAgdW5zaWduZWQgUFcgPSBzbGljZShpbnNuLCAyNCwgMjQpIDw8IDEgfCBzbGljZShpbnNuLCAyMSwgMjEpOworICAgIHN3aXRjaCAoc2xpY2UoaW5zbiwgNywgNCkpIHsKKyAgICBjYXNlIDExOgorICAgICAgc3dpdGNoIChQVykgeworICAgICAgY2FzZSAyOiAvLyBPZmZzZXQKKyAgICAgICAgcmV0dXJuIEFSTTo6TERSSDsKKyAgICAgIGNhc2UgMzogLy8gUHJlLWluZGV4ZWQKKyAgICAgICAgcmV0dXJuIEFSTTo6TERSSF9QUkU7CisgICAgICBjYXNlIDA6IC8vIFBvc3QtaW5kZXhlZAorICAgICAgICByZXR1cm4gQVJNOjpMRFJIX1BPU1Q7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsgLy8gZmFsbHRocm91Z2gKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICBzd2l0Y2ggKFBXKSB7CisgICAgICBjYXNlIDI6IC8vIE9mZnNldAorICAgICAgICByZXR1cm4gQVJNOjpMRFJTQjsKKyAgICAgIGNhc2UgMzogLy8gUHJlLWluZGV4ZWQKKyAgICAgICAgcmV0dXJuIEFSTTo6TERSU0JfUFJFOworICAgICAgY2FzZSAwOiAvLyBQb3N0LWluZGV4ZWQKKyAgICAgICAgcmV0dXJuIEFSTTo6TERSU0JfUE9TVDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOyAvLyBmYWxsdGhyb3VnaAorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxNToKKyAgICAgIHN3aXRjaCAoUFcpIHsKKyAgICAgIGNhc2UgMjogLy8gT2Zmc2V0CisgICAgICAgIHJldHVybiBBUk06OkxEUlNIOworICAgICAgY2FzZSAzOiAvLyBQcmUtaW5kZXhlZAorICAgICAgICByZXR1cm4gQVJNOjpMRFJTSF9QUkU7CisgICAgICBjYXNlIDA6IC8vIFBvc3QtaW5kZXhlZAorICAgICAgICByZXR1cm4gQVJNOjpMRFJTSF9QT1NUOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7IC8vIGZhbGx0aHJvdWdoCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7IC8vIGZhbGx0aHJvdWdoCisgICAgfQorICB9CisKK0F1dG9HZW5lZERlY29kZXI6CisgIC8vIENhbGxpbmcgdGhlIGF1dG8tZ2VuZXJhdGVkIGRlY29kZXIgZnVuY3Rpb24uCisgIHJldHVybiBkZWNvZGVJbnN0cnVjdGlvbihpbnNuKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBzcGVjaWFsIGNhc2UgaGFuZGxpbmcgb2YgTERSIChsaXRlcmFsKSBhbmQgZnJpZW5kcy4KKy8vIFNlZSwgZm9yIGV4YW1wbGUsIEE2LjMuNyBMb2FkIHdvcmQ6IFRhYmxlIEE2LTE4IExvYWQgd29yZC4KKy8vIFNlZSBBOC42LjU3IFQzLCBUNCAmIEE4LjYuNjAgVDIgYW5kIGZyaWVuZHMgZm9yIHdoeSB3ZSBtb3JwaGVkIHRoZSBvcGNvZGUKKy8vIGJlZm9yZSByZXR1cm5pbmcgaXQuCitzdGF0aWMgdW5zaWduZWQgVDJNb3JwaDJMb2FkTGl0ZXJhbCh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gT3Bjb2RlOyAvLyBSZXR1cm4gdW5tb3JwaGVkIG9wY29kZS4KKworICBjYXNlIEFSTTo6dDJMRFJEaTg6CisgICAgcmV0dXJuIEFSTTo6dDJMRFJEcGNpOworCisgIGNhc2UgQVJNOjp0MkxEUl9QT1NUOiAgIGNhc2UgQVJNOjp0MkxEUl9QUkU6CisgIGNhc2UgQVJNOjp0MkxEUmkxMjogICAgIGNhc2UgQVJNOjp0MkxEUmk4OgorICBjYXNlIEFSTTo6dDJMRFJzOiAgICAgICBjYXNlIEFSTTo6dDJMRFJUOgorICAgIHJldHVybiBBUk06OnQyTERScGNpOworCisgIGNhc2UgQVJNOjp0MkxEUkJfUE9TVDogIGNhc2UgQVJNOjp0MkxEUkJfUFJFOgorICBjYXNlIEFSTTo6dDJMRFJCaTEyOiAgICBjYXNlIEFSTTo6dDJMRFJCaTg6CisgIGNhc2UgQVJNOjp0MkxEUkJzOiAgICAgIGNhc2UgQVJNOjp0MkxEUkJUOgorICAgIHJldHVybiBBUk06OnQyTERSQnBjaTsKKworICBjYXNlIEFSTTo6dDJMRFJIX1BPU1Q6ICBjYXNlIEFSTTo6dDJMRFJIX1BSRToKKyAgY2FzZSBBUk06OnQyTERSSGkxMjogICAgY2FzZSBBUk06OnQyTERSSGk4OgorICBjYXNlIEFSTTo6dDJMRFJIczogICAgICBjYXNlIEFSTTo6dDJMRFJIVDoKKyAgICByZXR1cm4gQVJNOjp0MkxEUkhwY2k7CisKKyAgY2FzZSBBUk06OnQyTERSU0JfUE9TVDogIGNhc2UgQVJNOjp0MkxEUlNCX1BSRToKKyAgY2FzZSBBUk06OnQyTERSU0JpMTI6ICAgIGNhc2UgQVJNOjp0MkxEUlNCaTg6CisgIGNhc2UgQVJNOjp0MkxEUlNCczogICAgICBjYXNlIEFSTTo6dDJMRFJTQlQ6CisgICAgcmV0dXJuIEFSTTo6dDJMRFJTQnBjaTsKKworICBjYXNlIEFSTTo6dDJMRFJTSF9QT1NUOiAgY2FzZSBBUk06OnQyTERSU0hfUFJFOgorICBjYXNlIEFSTTo6dDJMRFJTSGkxMjogICAgY2FzZSBBUk06OnQyTERSU0hpODoKKyAgY2FzZSBBUk06OnQyTERSU0hzOiAgICAgIGNhc2UgQVJNOjp0MkxEUlNIVDoKKyAgICByZXR1cm4gQVJNOjp0MkxEUlNIcGNpOworICB9Cit9CisKKy8vLyBkZWNvZGVUaHVtYlNpZGVFZmZlY3QgaXMgYSBkZWNvcmF0b3IgZnVuY3Rpb24gd2hpY2ggY2FuIHBvdGVudGlhbGx5IHR3aWRkbGUKKy8vLyB0aGUgaW5zdHJ1Y3Rpb24gb3IgbW9ycGggdGhlIHJldHVybmVkIG9wY29kZSB1bmRlciBUaHVtYjIuCisvLy8KKy8vLyBGaXJzdCBpdCBjaGVja3Mgd2hldGhlciB0aGUgaW5zbiBpcyBhIE5FT04gb3IgVkZQIGluc3RyOyBpZiB0cnVlLCBiaXQKKy8vLyB0d2lkZGxpbmcgY291bGQgYmUgcGVyZm9ybWVkIG9uIGluc24gdG8gdHVybiBpdCBpbnRvIGFuIEFSTSBORU9OL1ZGUAorLy8vIGVxdWl2YWxlbnQgaW5zdHJ1Y3Rpb24gYW5kIGRlY29kZUluc3RydWN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSB0cmFuc2Zvcm1lZAorLy8vIGluc24uCisvLy8KKy8vLyBOZXh0LCB0aGVyZSBpcyBzcGVjaWFsIGhhbmRsaW5nIGZvciBMb2FkIGJ5dGUvaGFsZndvcmQvd29yZCBpbnN0cnVjdGlvbiBieQorLy8vIGNoZWNraW5nIHdoZXRoZXIgUm49MGIxMTExIGFuZCBjYWxsIFQyTW9ycGgyTG9hZExpdGVyYWwoKSBvbiB0aGUgZGVjb2RlZAorLy8vIFRodW1iMiBpbnN0cnVjdGlvbi4gIFNlZSBjb21tZW50cyBiZWxvdyBmb3IgZnVydGhlciBkZXRhaWxzLgorLy8vCisvLy8gRmluYWxseSwgb25lIGxhc3QgY2hlY2sgaXMgbWFkZSB0byBzZWUgd2hldGhlciB0aGUgaW5zbiBpcyBhIE5FT04vVkZQIGFuZAorLy8vIGRlY29kZUluc3RydWN0aW9uKGluc24pIGlzIGludm9rZWQgb24gdGhlIG9yaWdpbmFsIGluc24uCisvLy8KKy8vLyBPdGhlcndpc2UsIGRlY29kZVRodW1iSW5zdHJ1Y3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIG9yaWdpbmFsIGluc24uCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlVGh1bWJTaWRlRWZmZWN0KGJvb2wgSXNUaHVtYjIsIHVpbnQzMl90ICZpbnNuKSB7CisgIGlmIChJc1RodW1iMikgeworICAgIHVpbnQxNl90IG9wMSA9IHNsaWNlKGluc24sIDI4LCAyNyk7CisgICAgdWludDE2X3Qgb3AyID0gc2xpY2UoaW5zbiwgMjYsIDIwKTsKKworICAgIC8vIEE2LjMgMzItYml0IFRodW1iIGluc3RydWN0aW9uIGVuY29kaW5nCisgICAgLy8gVGFibGUgQTYtOSAzMi1iaXQgVGh1bWIgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcKKworICAgIC8vIFRoZSBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgb2YgaW50ZXJlc3QgYXJlIHRyYW5zZm9ybWVkIHRvIHRoZWlyIEFSTQorICAgIC8vIGVxdWl2YWxlbnRzLgorCisgICAgLy8gLS0tLS0tLS0tIFRyYW5zZm9ybSBCZWdpbiBNYXJrZXIgLS0tLS0tLS0tCisgICAgaWYgKChvcDEgPT0gMSB8fCBvcDEgPT0gMykgJiYgc2xpY2Uob3AyLCA2LCA0KSA9PSA3KSB7CisgICAgICAvLyBBNy40IEFkdmFuY2VkIFNJTUQgZGF0YS1wcm9jZXNzaW5nIGluc3RydWN0aW9ucworICAgICAgLy8gVSBiaXQgb2YgVGh1bWIgY29ycmVzcG9uZHMgdG8gSW5zdHsyNH0gb2YgQVJNLgorICAgICAgdWludDE2X3QgVSA9IHNsaWNlKG9wMSwgMSwgMSk7CisKKyAgICAgIC8vIEluc3R7MjgtMjR9IG9mIEFSTSA9IHsxLDAsMCwxLFV9OworICAgICAgdWludDE2X3QgYml0czI4XzI0ID0gOSA8PCAxIHwgVTsKKyAgICAgIERFQlVHKHNob3dCaXRWZWN0b3IoZXJycygpLCBpbnNuKSk7CisgICAgICBzZXRTbGljZShpbnNuLCAyOCwgMjQsIGJpdHMyOF8yNCk7CisgICAgICByZXR1cm4gZGVjb2RlSW5zdHJ1Y3Rpb24oaW5zbik7CisgICAgfQorCisgICAgaWYgKG9wMSA9PSAzICYmIHNsaWNlKG9wMiwgNiwgNCkgPT0gMSAmJiBzbGljZShvcDIsIDAsIDApID09IDApIHsKKyAgICAgIC8vIEE3LjcgQWR2YW5jZWQgU0lNRCBlbGVtZW50IG9yIHN0cnVjdHVyZSBsb2FkL3N0b3JlIGluc3RydWN0aW9ucworICAgICAgLy8gSW5zdHsyNy0yNH0gb2YgVGh1bWIgPSAwYjEwMDEKKyAgICAgIC8vIEluc3R7MjctMjR9IG9mIEFSTSAgID0gMGIwMTAwCisgICAgICBERUJVRyhzaG93Qml0VmVjdG9yKGVycnMoKSwgaW5zbikpOworICAgICAgc2V0U2xpY2UoaW5zbiwgMjcsIDI0LCA0KTsKKyAgICAgIHJldHVybiBkZWNvZGVJbnN0cnVjdGlvbihpbnNuKTsKKyAgICB9CisgICAgLy8gLS0tLS0tLS0tIFRyYW5zZm9ybSBFbmQgTWFya2VyIC0tLS0tLS0tLQorCisgICAgLy8gU2VlLCBmb3IgZXhhbXBsZSwgQTYuMy43IExvYWQgd29yZDogVGFibGUgQTYtMTggTG9hZCB3b3JkLgorICAgIC8vIFNlZSBBOC42LjU3IFQzLCBUNCAmIEE4LjYuNjAgVDIgYW5kIGZyaWVuZHMgZm9yIHdoeSB3ZSBtb3JwaGVkIHRoZSBvcGNvZGUKKyAgICAvLyBiZWZvcmUgcmV0dXJuaW5nIGl0IHRvIG91ciBjYWxsZXIuCisgICAgaWYgKG9wMSA9PSAzICYmIHNsaWNlKG9wMiwgNiwgNSkgPT0gMCAmJiBzbGljZShvcDIsIDAsIDApID09IDEKKyAgICAgICAgJiYgc2xpY2UoaW5zbiwgMTksIDE2KSA9PSAxNSkKKyAgICAgIHJldHVybiBUMk1vcnBoMkxvYWRMaXRlcmFsKGRlY29kZVRodW1iSW5zdHJ1Y3Rpb24oaW5zbikpOworCisgICAgLy8gT25lIGxhc3QgY2hlY2sgZm9yIE5FT04vVkZQIGluc3RydWN0aW9ucy4KKyAgICBpZiAoKG9wMSA9PSAxIHx8IG9wMSA9PSAzKSAmJiBzbGljZShvcDIsIDYsIDYpID09IDEpCisgICAgICByZXR1cm4gZGVjb2RlSW5zdHJ1Y3Rpb24oaW5zbik7CisKKyAgICAvLyBGYWxsIHRocm91Z2guCisgIH0KKworICByZXR1cm4gZGVjb2RlVGh1bWJJbnN0cnVjdGlvbihpbnNuKTsKK30KKworc3RhdGljIGlubGluZSBib29sIFRodW1iMlByZWxvYWRPcGNvZGVOb1BDSSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgQVJNOjp0MlBMRGkxMjogICBjYXNlIEFSTTo6dDJQTERpODoKKyAgY2FzZSBBUk06OnQyUExEcjogICAgIGNhc2UgQVJNOjp0MlBMRHM6CisgIGNhc2UgQVJNOjp0MlBMRFdpMTI6ICBjYXNlIEFSTTo6dDJQTERXaTg6CisgIGNhc2UgQVJNOjp0MlBMRFdyOiAgICBjYXNlIEFSTTo6dDJQTERXczoKKyAgY2FzZSBBUk06OnQyUExJaTEyOiAgIGNhc2UgQVJNOjp0MlBMSWk4OgorICBjYXNlIEFSTTo6dDJQTElyOiAgICAgY2FzZSBBUk06OnQyUExJczoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIFQyTW9ycGgyUHJlbG9hZDJQQ0kodW5zaWduZWQgT3Bjb2RlKSB7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisgIGNhc2UgQVJNOjp0MlBMRGkxMjogICBjYXNlIEFSTTo6dDJQTERpODoKKyAgY2FzZSBBUk06OnQyUExEcjogICAgIGNhc2UgQVJNOjp0MlBMRHM6CisgICAgcmV0dXJuIEFSTTo6dDJQTERwY2k7CisgIGNhc2UgQVJNOjp0MlBMRFdpMTI6ICBjYXNlIEFSTTo6dDJQTERXaTg6CisgIGNhc2UgQVJNOjp0MlBMRFdyOiAgICBjYXNlIEFSTTo6dDJQTERXczoKKyAgICByZXR1cm4gQVJNOjp0MlBMRFdwY2k7CisgIGNhc2UgQVJNOjp0MlBMSWkxMjogICBjYXNlIEFSTTo6dDJQTElpODoKKyAgY2FzZSBBUk06OnQyUExJcjogICAgIGNhc2UgQVJNOjp0MlBMSXM6CisgICAgcmV0dXJuIEFSTTo6dDJQTElwY2k7CisgIH0KK30KKworLy8KKy8vIFB1YmxpYyBpbnRlcmZhY2UgZm9yIHRoZSBkaXNhc3NlbWJsZXIKKy8vCisKK2Jvb2wgQVJNRGlzYXNzZW1ibGVyOjpnZXRJbnN0cnVjdGlvbihNQ0luc3QgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeU9iamVjdCAmUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJm9zKSBjb25zdCB7CisgIC8vIFRoZSBtYWNoaW5lIGluc3RydWN0aW9uLgorICB1aW50MzJfdCBpbnNuOworICB1aW50OF90IGJ5dGVzWzRdOworCisgIC8vIFdlIHdhbnQgdG8gcmVhZCBleGFjdGx5IDQgYnl0ZXMgb2YgZGF0YS4KKyAgaWYgKFJlZ2lvbi5yZWFkQnl0ZXMoQWRkcmVzcywgNCwgKHVpbnQ4X3QqKWJ5dGVzLCBOVUxMKSA9PSAtMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRW5jb2RlZCBhcyBhIHNtYWxsLWVuZGlhbiAzMi1iaXQgd29yZCBpbiB0aGUgc3RyZWFtLgorICBpbnNuID0gKGJ5dGVzWzNdIDw8IDI0KSB8CisgICAgICAgICAoYnl0ZXNbMl0gPDwgMTYpIHwKKyAgICAgICAgIChieXRlc1sxXSA8PCAgOCkgfAorICAgICAgICAgKGJ5dGVzWzBdIDw8ICAwKTsKKworICB1bnNpZ25lZCBPcGNvZGUgPSBkZWNvZGVBUk1JbnN0cnVjdGlvbihpbnNuKTsKKyAgQVJNRm9ybWF0IEZvcm1hdCA9IEFSTUZvcm1hdHNbT3Bjb2RlXTsKKyAgU2l6ZSA9IDQ7CisKKyAgREVCVUcoeworICAgICAgZXJycygpIDw8ICJPcGNvZGU9IiA8PCBPcGNvZGUgPDwgIiBOYW1lPSIgPDwgQVJNVXRpbHM6Ok9wY29kZU5hbWUoT3Bjb2RlKQorICAgICAgICAgICAgIDw8ICIgRm9ybWF0PSIgPDwgc3RyaW5nRm9yQVJNRm9ybWF0KEZvcm1hdCkgPDwgJygnIDw8IChpbnQpRm9ybWF0CisgICAgICAgICAgICAgPDwgIilcbiI7CisgICAgICBzaG93Qml0VmVjdG9yKGVycnMoKSwgaW5zbik7CisgICAgfSk7CisKKyAgQVJNQmFzaWNNQ0J1aWxkZXIgKkJ1aWxkZXIgPSBDcmVhdGVNQ0J1aWxkZXIoT3Bjb2RlLCBGb3JtYXQpOworICBpZiAoIUJ1aWxkZXIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghQnVpbGRlci0+QnVpbGQoTUksIGluc24pKQorICAgIHJldHVybiBmYWxzZTsKKworICBkZWxldGUgQnVpbGRlcjsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUaHVtYkRpc2Fzc2VtYmxlcjo6Z2V0SW5zdHJ1Y3Rpb24oTUNJbnN0ICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5T2JqZWN0ICZSZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJm9zKSBjb25zdCB7CisgIC8vIFRoZSBUaHVtYiBpbnN0cnVjdGlvbiBzdHJlYW0gaXMgYSBzZXF1ZW5jZSBvZiBoYWxod29yZHMuCisKKyAgLy8gVGhpcyByZXByZXNlbnRzIHRoZSBmaXJzdCBoYWxmd29yZCBhcyB3ZWxsIGFzIHRoZSBtYWNoaW5lIGluc3RydWN0aW9uCisgIC8vIHBhc3NlZCB0byBkZWNvZGVUaHVtYkluc3RydWN0aW9uKCkuICBGb3IgMTYtYml0IFRodW1iIGluc3RydWN0aW9uLCB0aGUgdG9wCisgIC8vIGhhbGZ3b3JkIG9mIGluc24gaXMgMHgwMCAweDAwOyBvdGhlcndpc2UsIHRoZSBmaXJzdCBoYWxmd29yZCBpcyBtb3ZlZCB0bworICAvLyB0aGUgdG9wIGhhbGYgZm9sbG93ZWQgYnkgdGhlIHNlY29uZCBoYWxmd29yZC4KKyAgdWludDMyX3QgaW5zbiA9IDA7CisgIC8vIFBvc3NpYmxlIHNlY29uZCBoYWxmd29yZC4KKyAgdWludDE2X3QgaW5zbjEgPSAwOworCisgIC8vIEE2LjEgVGh1bWIgaW5zdHJ1Y3Rpb24gc2V0IGVuY29kaW5nCisgIC8vCisgIC8vIElmIGJpdHMgWzE1OjExXSBvZiB0aGUgaGFsZndvcmQgYmVpbmcgZGVjb2RlZCB0YWtlIGFueSBvZiB0aGUgZm9sbG93aW5nCisgIC8vIHZhbHVlcywgdGhlIGhhbGZ3b3JkIGlzIHRoZSBmaXJzdCBoYWxmd29yZCBvZiBhIDMyLWJpdCBpbnN0cnVjdGlvbjoKKyAgLy8gbyAwYjExMTAxCisgIC8vIG8gMGIxMTExMAorICAvLyBvIDBiMTExMTEuCisgIC8vCisgIC8vIE90aGVyd2lzZSwgdGhlIGhhbGZ3b3JkIGlzIGEgMTYtYml0IGluc3RydWN0aW9uLgorCisgIC8vIFJlYWQgMiBieXRlcyBvZiBkYXRhIGZpcnN0LgorICB1aW50OF90IGJ5dGVzWzJdOworICBpZiAoUmVnaW9uLnJlYWRCeXRlcyhBZGRyZXNzLCAyLCAodWludDhfdCopYnl0ZXMsIE5VTEwpID09IC0xKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBFbmNvZGVkIGFzIGEgc21hbGwtZW5kaWFuIDE2LWJpdCBoYWxmd29yZCBpbiB0aGUgc3RyZWFtLgorICBpbnNuID0gKGJ5dGVzWzFdIDw8IDgpIHwgYnl0ZXNbMF07CisgIHVuc2lnbmVkIGJpdHMxNV8xMSA9IHNsaWNlKGluc24sIDE1LCAxMSk7CisgIGJvb2wgSXNUaHVtYjIgPSBmYWxzZTsKKworICAvLyAzMi1iaXQgaW5zdHJ1Y3Rpb25zIGlmIHRoZSBiaXRzIFsxNToxMV0gb2YgdGhlIGhhbGZ3b3JkIG1hdGNoZXMKKyAgLy8geyAwYjExMTAxIC8qIDB4MUQgKi8sIDBiMTExMTAgLyogMHgxRSAqLywgb2IxMTExMSAvKiAweDFGICovIH0uCisgIGlmIChiaXRzMTVfMTEgPT0gMHgxRCB8fCBiaXRzMTVfMTEgPT0gMHgxRSB8fCBiaXRzMTVfMTEgPT0gMHgxRikgeworICAgIElzVGh1bWIyID0gdHJ1ZTsKKyAgICBpZiAoUmVnaW9uLnJlYWRCeXRlcyhBZGRyZXNzICsgMiwgMiwgKHVpbnQ4X3QqKWJ5dGVzLCBOVUxMKSA9PSAtMSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBFbmNvZGVkIGFzIGEgc21hbGwtZW5kaWFuIDE2LWJpdCBoYWxmd29yZCBpbiB0aGUgc3RyZWFtLgorICAgIGluc24xID0gKGJ5dGVzWzFdIDw8IDgpIHwgYnl0ZXNbMF07CisgICAgaW5zbiA9IChpbnNuIDw8IDE2IHwgaW5zbjEpOworICB9CisKKyAgLy8gVGhlIGluc24gY291bGQgcG90ZW50aWFsbHkgYmUgYml0LXR3aWRkbGVkIGluIG9yZGVyIHRvIGJlIGRlY29kZWQgYXMgYW4gQVJNCisgIC8vIE5FT04vVkZQIG9wY29kZS4gIEluIHN1Y2ggY2FzZSwgdGhlIG1vZGlmaWVkIGluc24gaXMgbGF0ZXIgZGlzYXNzZW1ibGVkIGFzCisgIC8vIGFuIEFSTSBORU9OL1ZGUCBpbnN0cnVjdGlvbi4KKyAgLy8KKyAgLy8gVGhpcyBpcyBhIHNob3J0IHRlcm0gc29sdXRpb24gZm9yIGxhY2sgb2YgZW5jb2RpbmcgYml0cyBzcGVjaWZpZWQgZm9yIHRoZQorICAvLyBUaHVtYjIgTkVPTi9WRlAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGxvbmcgdGVybSBzb2x1dGlvbiBjb3VsZCBiZSBhZGRpbmcgc29tZQorICAvLyBpbmZyYXN0cnVjdHVyZSB0byBoYXZlIGVhY2ggaW5zdHJ1Y3Rpb24gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGVuY29kaW5ncy4KKyAgLy8gV2hpY2ggZW5jb2RpbmcgaXMgdXNlZCB3b3VsZCBiZSBiYXNlZCBvbiB3aGljaCBzdWJ0YXJnZXQgdGhlIGNvbXBpbGVyLworICAvLyBkaXNhc3NlbWJsZXIgaXMgd29ya2luZyB3aXRoIGF0IHRoZSB0aW1lLiAgVGhpcyB3b3VsZCBhbGxvdyB0aGUgc2hhcmluZyBvZgorICAvLyB0aGUgTkVPTiBwYXR0ZXJucyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIyLCBhcyB3ZWxsIGFzIHBvdGVudGlhbCBncmVhdGVyCisgIC8vIHNoYXJpbmcgYmV0d2VlbiB0aGUgcmVndWxhciBBUk0gaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgMzItYml0IHdpZGUgVGh1bWIyCisgIC8vIGluc3RydWN0aW9ucyBhcyB3ZWxsLgorICB1bnNpZ25lZCBPcGNvZGUgPSBkZWNvZGVUaHVtYlNpZGVFZmZlY3QoSXNUaHVtYjIsIGluc24pOworCisgIC8vIEE4LjYuMTE3LzExOS8xMjAvMTIxLgorICAvLyBQTEQvUExEVy9QTEkgaW5zdHJ1Y3Rpb25zIHdpdGggUm49PTE1IGlzIHRyYW5zZm9ybWVkIHRvIHRoZSBwY2kgdmFyaWFudC4KKyAgaWYgKFRodW1iMlByZWxvYWRPcGNvZGVOb1BDSShPcGNvZGUpICYmIHNsaWNlKGluc24sIDE5LCAxNikgPT0gMTUpCisgICAgT3Bjb2RlID0gVDJNb3JwaDJQcmVsb2FkMlBDSShPcGNvZGUpOworCisgIEFSTUZvcm1hdCBGb3JtYXQgPSBBUk1Gb3JtYXRzW09wY29kZV07CisgIFNpemUgPSBJc1RodW1iMiA/IDQgOiAyOworCisgIERFQlVHKHsKKyAgICAgIGVycnMoKSA8PCAiT3Bjb2RlPSIgPDwgT3Bjb2RlIDw8ICIgTmFtZT0iIDw8IEFSTVV0aWxzOjpPcGNvZGVOYW1lKE9wY29kZSkKKyAgICAgICAgICAgICA8PCAiIEZvcm1hdD0iIDw8IHN0cmluZ0ZvckFSTUZvcm1hdChGb3JtYXQpIDw8ICcoJyA8PCAoaW50KUZvcm1hdAorICAgICAgICAgICAgIDw8ICIpXG4iOworICAgICAgc2hvd0JpdFZlY3RvcihlcnJzKCksIGluc24pOworICAgIH0pOworCisgIEFSTUJhc2ljTUNCdWlsZGVyICpCdWlsZGVyID0gQ3JlYXRlTUNCdWlsZGVyKE9wY29kZSwgRm9ybWF0KTsKKyAgaWYgKCFCdWlsZGVyKQorICAgIHJldHVybiBmYWxzZTsKKworICBCdWlsZGVyLT5TZXRTZXNzaW9uKGNvbnN0X2Nhc3Q8U2Vzc2lvbiAqPigmU08pKTsKKworICBpZiAoIUJ1aWxkZXItPkJ1aWxkKE1JLCBpbnNuKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZGVsZXRlIEJ1aWxkZXI7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEE4LjYuNTAKKy8vIFZhbGlkIHJldHVybiB2YWx1ZXMgYXJlIHsxLCAyLCAzLCA0fSwgd2l0aCAwIHNpZ25pZnlpbmcgYW4gZXJyb3IgY29uZGl0aW9uLgorc3RhdGljIHVuc2lnbmVkIHNob3J0IENvdW50SVRTaXplKHVuc2lnbmVkIElUTWFzaykgeworICAvLyBGaXJzdCBjb3VudCB0aGUgdHJhaWxpbmcgemVyb3Mgb2YgdGhlIElUIG1hc2suCisgIHVuc2lnbmVkIFRaID0gQ291bnRUcmFpbGluZ1plcm9zXzMyKElUTWFzayk7CisgIGlmIChUWiA+IDMpIHsKKyAgICBERUJVRyhlcnJzKCkgPDwgIkVuY29kaW5nIGVycm9yOiBJVCBNYXNrICcwMDAwJyIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAoNCAtIFRaKTsKK30KKworLy8vIEluaXQgSVRTdGF0ZS4gIE5vdGUgdGhhdCBhdCBsZWFzdCBvbmUgYml0IGlzIGFsd2F5cyAxIGluIG1hc2suCitib29sIFNlc3Npb246OkluaXRJVCh1bnNpZ25lZCBzaG9ydCBiaXRzN18wKSB7CisgIElUQ291bnRlciA9IENvdW50SVRTaXplKHNsaWNlKGJpdHM3XzAsIDMsIDApKTsKKyAgaWYgKElUQ291bnRlciA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBBOC42LjUwIElUCisgIHVuc2lnbmVkIHNob3J0IEZpcnN0Q29uZCA9IHNsaWNlKGJpdHM3XzAsIDcsIDQpOworICBpZiAoRmlyc3RDb25kID09IDB4RikgeworICAgIERFQlVHKGVycnMoKSA8PCAiRW5jb2RpbmcgZXJyb3I6IElUIEZpcnN0Q29uZCAnMTExMSciKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKEZpcnN0Q29uZCA9PSAweEUgJiYgSVRDb3VudGVyICE9IDEpIHsKKyAgICBERUJVRyhlcnJzKCkgPDwgIkVuY29kaW5nIGVycm9yOiBJVCBGaXJzdENvbmQgJzExMTAnICYmIE1hc2sgIT0gJzEwMDAnIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgSVRTdGF0ZSA9IGJpdHM3XzA7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBVcGRhdGUgSVRTdGF0ZSBpZiBuZWNlc3NhcnkuCit2b2lkIFNlc3Npb246OlVwZGF0ZUlUKCkgeworICBhc3NlcnQoSVRDb3VudGVyKTsKKyAgLS1JVENvdW50ZXI7CisgIGlmIChJVENvdW50ZXIgPT0gMCkKKyAgICBJVFN0YXRlID0gMDsKKyAgZWxzZSB7CisgICAgdW5zaWduZWQgc2hvcnQgTmV3SVRTdGF0ZTRfMCA9IHNsaWNlKElUU3RhdGUsIDQsIDApIDw8IDE7CisgICAgc2V0U2xpY2UoSVRTdGF0ZSwgNCwgMCwgTmV3SVRTdGF0ZTRfMCk7CisgIH0KK30KKworc3RhdGljIE1DRGlzYXNzZW1ibGVyICpjcmVhdGVBUk1EaXNhc3NlbWJsZXIoY29uc3QgVGFyZ2V0ICZUKSB7CisgIHJldHVybiBuZXcgQVJNRGlzYXNzZW1ibGVyOworfQorCitzdGF0aWMgTUNEaXNhc3NlbWJsZXIgKmNyZWF0ZVRodW1iRGlzYXNzZW1ibGVyKGNvbnN0IFRhcmdldCAmVCkgeworICByZXR1cm4gbmV3IFRodW1iRGlzYXNzZW1ibGVyOworfQorCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVBUk1EaXNhc3NlbWJsZXIoKSB7IAorICAvLyBSZWdpc3RlciB0aGUgZGlzYXNzZW1ibGVyLgorICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0Rpc2Fzc2VtYmxlcihUaGVBUk1UYXJnZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVBUk1EaXNhc3NlbWJsZXIpOworICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0Rpc2Fzc2VtYmxlcihUaGVUaHVtYlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlVGh1bWJEaXNhc3NlbWJsZXIpOworfQorCitFREluc3RJbmZvICpBUk1EaXNhc3NlbWJsZXI6OmdldEVESW5mbygpIGNvbnN0IHsKKyAgcmV0dXJuIGluc3RJbmZvQVJNOworfQorCitFREluc3RJbmZvICpUaHVtYkRpc2Fzc2VtYmxlcjo6Z2V0RURJbmZvKCkgY29uc3QgeworICByZXR1cm4gaW5zdEluZm9BUk07Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9EaXNhc3NlbWJsZXIvQVJNRGlzYXNzZW1ibGVyLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9EaXNhc3NlbWJsZXIvQVJNRGlzYXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE3NGEzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL0Rpc2Fzc2VtYmxlci9BUk1EaXNhc3NlbWJsZXIuaApAQCAtMCwwICsxLDk5IEBACisvLz09PS0gQVJNRGlzYXNzZW1ibGVyLmggLSBEaXNhc3NlbWJsZXIgZm9yIEFSTS9UaHVtYiBJU0EgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBUk0gRGlzYXNzZW1ibGVyLgorLy8gSXQgY29udGFpbnMgdGhlIGhlYWRlciBmb3IgQVJNRGlzYXNzZW1ibGVyIGFuZCBUaHVtYkRpc2Fzc2VtYmxlciwgYm90aCBhcmUKKy8vIHN1YmNsYXNzZXMgb2YgTUNEaXNhc3NlbWJsZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBUk1ESVNBU1NFTUJMRVJfSAorI2RlZmluZSBBUk1ESVNBU1NFTUJMRVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIAorY2xhc3MgTUNJbnN0OworY2xhc3MgTWVtb3J5T2JqZWN0OworY2xhc3MgcmF3X29zdHJlYW07CisgIAorc3RydWN0IEVESW5zdEluZm87CisgIAorLy8vIEFSTURpc2Fzc2VtYmxlciAtIEFSTSBkaXNhc3NlbWJsZXIgZm9yIGFsbCBBUk0gcGxhdGZvcm1zLgorY2xhc3MgQVJNRGlzYXNzZW1ibGVyIDogcHVibGljIE1DRGlzYXNzZW1ibGVyIHsKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yICAgICAtIEluaXRpYWxpemVzIHRoZSBkaXNhc3NlbWJsZXIuCisgIC8vLworICBBUk1EaXNhc3NlbWJsZXIoKSA6CisgICAgTUNEaXNhc3NlbWJsZXIoKSB7CisgIH0KKworICB+QVJNRGlzYXNzZW1ibGVyKCkgeworICB9CisKKyAgLy8vIGdldEluc3RydWN0aW9uIC0gU2VlIE1DRGlzYXNzZW1ibGVyLgorICBib29sIGdldEluc3RydWN0aW9uKE1DSW5zdCAmaW5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5T2JqZWN0ICZyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmdlN0cmVhbSkgY29uc3Q7CisgIAorICAvLy8gZ2V0RURJbmZvIC0gU2VlIE1DRGlzYXNzZW1ibGVyLgorICBFREluc3RJbmZvICpnZXRFREluZm8oKSBjb25zdDsKK3ByaXZhdGU6Cit9OworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uLgorY2xhc3MgQVJNQmFzaWNNQ0J1aWxkZXI7CisKKy8vLyBTZXNzaW9uIC0gS2VlcCB0cmFjayBvZiB0aGUgSVQgQmxvY2sgcHJvZ3Jlc3Npb24uCitjbGFzcyBTZXNzaW9uIHsKKyAgZnJpZW5kIGNsYXNzIEFSTUJhc2ljTUNCdWlsZGVyOworcHVibGljOgorICBTZXNzaW9uKCkgOiBJVENvdW50ZXIoMCksIElUU3RhdGUoMCkge30KKyAgflNlc3Npb24oKSB7fQorICAvLy8gSW5pdElUIC0gSW5pdGlhbGl6ZXMgSVRDb3VudGVyL0lUU3RhdGUuCisgIGJvb2wgSW5pdElUKHVuc2lnbmVkIHNob3J0IGJpdHM3XzApOworICAvLy8gVXBkYXRlSVQgLSBVcGRhdGVzIElUQ291bnRlci9JVFN0YXRlIGFzIElUIEJsb2NrIHByb2dyZXNzZXMuCisgIHZvaWQgVXBkYXRlSVQoKTsKKworcHJpdmF0ZToKKyAgdW5zaWduZWQgSVRDb3VudGVyOyAvLyBQb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIDIsIDMsIDQuCisgIHVuc2lnbmVkIElUU3RhdGU7ICAgLy8gQTIuNS4yIENvbnNpc3RzIG9mIElUWzc6NV0gYW5kIElUWzQ6MF0gaW5pdGlhbGx5LgorfTsKKworLy8vIFRodW1iRGlzYXNzZW1ibGVyIC0gVGh1bWIgZGlzYXNzZW1ibGVyIGZvciBhbGwgQVJNIHBsYXRmb3Jtcy4KK2NsYXNzIFRodW1iRGlzYXNzZW1ibGVyIDogcHVibGljIE1DRGlzYXNzZW1ibGVyIHsKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yICAgICAtIEluaXRpYWxpemVzIHRoZSBkaXNhc3NlbWJsZXIuCisgIC8vLworICBUaHVtYkRpc2Fzc2VtYmxlcigpIDoKKyAgICBNQ0Rpc2Fzc2VtYmxlcigpLCBTTygpIHsKKyAgfQorCisgIH5UaHVtYkRpc2Fzc2VtYmxlcigpIHsKKyAgfQorCisgIC8vLyBnZXRJbnN0cnVjdGlvbiAtIFNlZSBNQ0Rpc2Fzc2VtYmxlci4KKyAgYm9vbCBnZXRJbnN0cnVjdGlvbihNQ0luc3QgJmluc3RyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeU9iamVjdCAmcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJnZTdHJlYW0pIGNvbnN0OworICAKKyAgLy8vIGdldEVESW5mbyAtIFNlZSBNQ0Rpc2Fzc2VtYmxlci4KKyAgRURJbnN0SW5mbyAqZ2V0RURJbmZvKCkgY29uc3Q7Citwcml2YXRlOgorICBTZXNzaW9uIFNPOworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorICAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL0FSTURpc2Fzc2VtYmxlckNvcmUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL0FSTURpc2Fzc2VtYmxlckNvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzU3NjM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL0FSTURpc2Fzc2VtYmxlckNvcmUuY3BwCkBAIC0wLDAgKzEsMzI5NyBAQAorLy89PT0tIEFSTURpc2Fzc2VtYmxlckNvcmUuY3BwIC0gQVJNIGRpc2Fzc2VtYmxlciBoZWxwZXJzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQVJNIERpc2Fzc2VtYmxlci4KKy8vIEl0IGNvbnRhaW5zIGNvZGUgdG8gcmVwcmVzZW50IHRoZSBjb3JlIGNvbmNlcHRzIG9mIEJ1aWxkZXIgYW5kIERpc2Fzc2VtYmxlRlAKKy8vIHRvIHNvbHZlIHRoZSBwcm9ibGVtIG9mIGRpc2Fzc2VtYmxpbmcgYW4gQVJNIGluc3RyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXJtLWRpc2Fzc2VtYmxlciIKKworI2luY2x1ZGUgIkFSTURpc2Fzc2VtYmxlckNvcmUuaCIKKyNpbmNsdWRlICJBUk1BZGRyZXNzaW5nTW9kZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworLy8vIEFSTUdlbkluc3RySW5mby5pbmMgLSBBUk1HZW5JbnN0ckluZm8uaW5jIGNvbnRhaW5zIHRoZSBzdGF0aWMgY29uc3QKKy8vLyBUYXJnZXRJbnN0ckRlc2MgQVJNSW5zdHNbXSBkZWZpbml0aW9uIGFuZCB0aGUgVGFyZ2V0T3BlcmFuZEluZm9bXSdzCisvLy8gZGVzY3JpYmluZyB0aGUgb3BlcmFuZCBpbmZvIGZvciBlYWNoIEFSTUluc3RzW2ldLgorLy8vCisvLy8gVG9nZXRoZXIgd2l0aCBhbiBpbnN0cnVjdGlvbidzIGVuY29kaW5nIGZvcm1hdCwgd2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZQorLy8vIE51bU9wZXJhbmRzIGFuZCB0aGUgT3BJbmZvIGZpZWxkcyBvZiB0aGUgdGFyZ2V0IGluc3RydWN0aW9uIGRlc2NyaXB0aW9uIGluCisvLy8gdGhlIHF1ZXN0IHRvIGJ1aWxkIG91dCB0aGUgTUNPcGVyYW5kIGxpc3QgZm9yIGFuIE1DSW5zdC4KKy8vLworLy8vIFRoZSBnZW5lcmFsIGd1aWRlbGluZSBpcyB0aGF0IHdpdGggYSBrbm93biBmb3JtYXQsIHRoZSBudW1iZXIgb2YgZHN0IGFuZCBzcmMKKy8vLyBvcGVyYW5kcyBhcmUgd2VsbC1rbm93bi4gIFRoZSBkc3QgaXMgYnVpbHQgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBzcmMKKy8vLyBvcGVyYW5kKHMpLiAgVGhlIG9wZXJhbmRzIG5vdCB5ZXQgdXNlZCBhdCB0aGlzIHBvaW50IGFyZSBmb3IgdGhlIEltcGxpY2l0CisvLy8gVXNlcyBhbmQgRGVmcyBieSB0aGlzIGluc3RyLiAgRm9yIHRoZSBVc2VzIHBhcnQsIHRoZSBwcmVkOiRwIG9wZXJhbmQgaXMKKy8vLyBkZWZpbmVkIHdpdGggdHdvIGNvbXBvbmVudHM6CisvLy8KKy8vLyBkZWYgcHJlZCB7IC8vIE9wZXJhbmQgUHJlZGljYXRlT3BlcmFuZAorLy8vICAgVmFsdWVUeXBlIFR5cGUgPSBPdGhlclZUOworLy8vICAgc3RyaW5nIFByaW50TWV0aG9kID0gInByaW50UHJlZGljYXRlT3BlcmFuZCI7CisvLy8gICBzdHJpbmcgQXNtT3BlcmFuZExvd2VyTWV0aG9kID0gPzsKKy8vLyAgIGRhZyBNSU9wZXJhbmRJbmZvID0gKG9wcyBpMzJpbW0sIENDUik7CisvLy8gICBBc21PcGVyYW5kQ2xhc3MgUGFyc2VyTWF0Y2hDbGFzcyA9IEltbUFzbU9wZXJhbmQ7CisvLy8gICBkYWcgRGVmYXVsdE9wcyA9IChvcHMgKGkzMiAxNCksIChpMzIgemVyb19yZWcpKTsKKy8vLyB9CisvLy8KKy8vLyB3aGljaCBpcyBtYW5pZmVzdGVkIGJ5IHRoZSBUYXJnZXRPcGVyYW5kSW5mb1tdIG9mOgorLy8vCisvLy8geyAwLCAwfCgxPDxUT0k6OlByZWRpY2F0ZSksIDAgfSwKKy8vLyB7IEFSTTo6Q0NSUmVnQ2xhc3NJRCwgMHwoMTw8VE9JOjpQcmVkaWNhdGUpLCAwIH0KKy8vLworLy8vIFNvIHRoZSBmaXJzdCBwcmVkaWNhdGUgTUNPcGVyYW5kIGNvcnJlc3BvbmRzIHRvIHRoZSBpbW1lZGlhdGUgcGFydCBvZiB0aGUKKy8vLyBBUk0gY29uZGl0aW9uIGZpZWxkIChJbnN0ezMxLTI4fSksIGFuZCB0aGUgc2Vjb25kIHByZWRpY2F0ZSBNQ09wZXJhbmQKKy8vLyBjb3JyZXNwb25kcyB0byBhIHJlZ2lzdGVyIGtpbmQgb2YgQVJNOjpDUFNSLgorLy8vCisvLy8gRm9yIHRoZSBEZWZzIHBhcnQsIGluIHRoZSBzaW1wbGUgY2FzZSBvZiBvbmx5IGNjX291dDokcywgd2UgaGF2ZToKKy8vLworLy8vIGRlZiBjY19vdXQgeyAvLyBPcGVyYW5kIE9wdGlvbmFsRGVmT3BlcmFuZAorLy8vICAgVmFsdWVUeXBlIFR5cGUgPSBPdGhlclZUOworLy8vICAgc3RyaW5nIFByaW50TWV0aG9kID0gInByaW50U0JpdE1vZGlmaWVyT3BlcmFuZCI7CisvLy8gICBzdHJpbmcgQXNtT3BlcmFuZExvd2VyTWV0aG9kID0gPzsKKy8vLyAgIGRhZyBNSU9wZXJhbmRJbmZvID0gKG9wcyBDQ1IpOworLy8vICAgQXNtT3BlcmFuZENsYXNzIFBhcnNlck1hdGNoQ2xhc3MgPSBJbW1Bc21PcGVyYW5kOworLy8vICAgZGFnIERlZmF1bHRPcHMgPSAob3BzIChpMzIgemVyb19yZWcpKTsKKy8vLyB9CisvLy8KKy8vLyB3aGljaCBpcyBtYW5pZmVzdGVkIGJ5IHRoZSBvbmUgVGFyZ2V0T3BlcmFuZEluZm8gb2Y6CisvLy8KKy8vLyB7IEFSTTo6Q0NSUmVnQ2xhc3NJRCwgMHwoMTw8VE9JOjpPcHRpb25hbERlZiksIDAgfQorLy8vCisvLy8gQW5kIHRoaXMgbWFwcyB0byBvbmUgTUNPcGVyYW5kIHdpdGggdGhlIHJlZ3NpdGVyIGtpbmQgb2YgQVJNOjpDUFNSLgorI2luY2x1ZGUgIkFSTUdlbkluc3RySW5mby5pbmMiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitjb25zdCBjaGFyICpBUk1VdGlsczo6T3Bjb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgcmV0dXJuIEFSTUluc3RzW09wY29kZV0uTmFtZTsKK30KKworLy8gUmV0dXJuIHRoZSByZWdpc3RlciBlbnVtIEJhc2VkIG9uIFJlZ0NsYXNzIGFuZCB0aGUgcmF3IHJlZ2lzdGVyIG51bWJlci4KKy8vIEZvciBEUmVnUGFpciwgc2VlIGNvbW1lbnRzIGJlbG93LgorLy8gRklYTUU6IEF1dG8tZ2VuZWQ/CitzdGF0aWMgdW5zaWduZWQgZ2V0UmVnaXN0ZXJFbnVtKEJPIEIsIHVuc2lnbmVkIFJlZ0NsYXNzSUQsIHVuc2lnbmVkIFJhd1JlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERSZWdQYWlyID0gZmFsc2UpIHsKKworICBpZiAoRFJlZ1BhaXIgJiYgUmVnQ2xhc3NJRCA9PSBBUk06OlFQUlJlZ0NsYXNzSUQpIHsKKyAgICAvLyBMTFZNIGV4cGVjdHMgeyBEZCwgRGQrMSB9IHRvIGZvcm0gYSBzdXBlciByZWdpc3RlcjsgdGhpcyBpcyBub3Qgc3BlY2lmaWVkCisgICAgLy8gaW4gdGhlIEFSTSBBcmNoaXRlY3R1cmUgTWFudWFsIGFzIGZhciBhcyBJIHVuZGVyc3RhbmQgaXQgKEE4LjYuMzA3KS4KKyAgICAvLyBUaGVyZWZvcmUsIHdlIG1vcnBoIHRoZSBSZWdDbGFzc0lEIHRvIGJlIHRoZSBzdWIgcmVnaXN0ZXIgY2xhc3MgYW5kIGRvbid0CisgICAgLy8gc3Vic2VxdWVudGx5IHRyYW5zZm9ybSB0aGUgUmF3UmVnaXN0ZXIgZW5jb2Rpbmcgd2hlbiBjYWxjdWxhdGluZyBSZWdOdW0uCisgICAgLy8KKyAgICAvLyBTZWUgYWxzbyBBUk1pbnN0UHJpbnRlcjo6cHJpbnRPcGVyYW5kKCkgd3J0ICJkcmVncGFpciIgbW9kaWZpZXIgcGFydAorICAgIC8vIHdoZXJlIHRoaXMgd29ya2Fyb3VuZCBpcyBtZWFudCBmb3IuCisgICAgUmVnQ2xhc3NJRCA9IEFSTTo6RFBSUmVnQ2xhc3NJRDsKKyAgfQorCisgIC8vIEZvciB0aGlzIHB1cnBvc2UsIHdlIGNhbiB0cmVhdCByR1BSIGFzIGlmIGl0IHdlcmUgR1BSLgorICBpZiAoUmVnQ2xhc3NJRCA9PSBBUk06OnJHUFJSZWdDbGFzc0lEKSBSZWdDbGFzc0lEID0gQVJNOjpHUFJSZWdDbGFzc0lEOworCisgIC8vIFNlZSBhbHNvIGRlY29kZU5FT05SZCgpLCBkZWNvZGVORU9OUm4oKSwgZGVjb2RlTkVPTlJtKCkuCisgIHVuc2lnbmVkIFJlZ051bSA9CisgICAgUmVnQ2xhc3NJRCA9PSBBUk06OlFQUlJlZ0NsYXNzSUQgPyBSYXdSZWdpc3RlciA+PiAxIDogUmF3UmVnaXN0ZXI7CisKKyAgc3dpdGNoIChSZWdOdW0pIHsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgY2FzZSAwOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6dEdQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlIwOworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6RFBSXzhSZWdDbGFzc0lEOgorICAgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgICAgICByZXR1cm4gQVJNOjpEMDsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlFQUl84UmVnQ2xhc3NJRDoKKyAgICBjYXNlIEFSTTo6UVBSX1ZGUDJSZWdDbGFzc0lEOgorICAgICAgcmV0dXJuIEFSTTo6UTA7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpTUFJfOFJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMwOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6dEdQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlIxOworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6RFBSXzhSZWdDbGFzc0lEOgorICAgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgICAgICByZXR1cm4gQVJNOjpEMTsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlFQUl84UmVnQ2xhc3NJRDoKKyAgICBjYXNlIEFSTTo6UVBSX1ZGUDJSZWdDbGFzc0lEOgorICAgICAgcmV0dXJuIEFSTTo6UTE7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpTUFJfOFJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMxOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6dEdQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlIyOworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6RFBSXzhSZWdDbGFzc0lEOgorICAgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgICAgICByZXR1cm4gQVJNOjpEMjsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlFQUl84UmVnQ2xhc3NJRDoKKyAgICBjYXNlIEFSTTo6UVBSX1ZGUDJSZWdDbGFzc0lEOgorICAgICAgcmV0dXJuIEFSTTo6UTI7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpTUFJfOFJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMyOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6dEdQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlIzOworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6RFBSXzhSZWdDbGFzc0lEOgorICAgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgICAgICByZXR1cm4gQVJNOjpEMzsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlFQUl84UmVnQ2xhc3NJRDoKKyAgICBjYXNlIEFSTTo6UVBSX1ZGUDJSZWdDbGFzc0lEOgorICAgICAgcmV0dXJuIEFSTTo6UTM7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpTUFJfOFJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMzOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA0OgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6dEdQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlI0OworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6RFBSXzhSZWdDbGFzc0lEOgorICAgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgICAgICByZXR1cm4gQVJNOjpENDsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlFQUl9WRlAyUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UTQ7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpTUFJfOFJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlM0OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA1OgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6dEdQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlI1OworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6RFBSXzhSZWdDbGFzc0lEOgorICAgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgICAgICByZXR1cm4gQVJNOjpENTsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlFQUl9WRlAyUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UTU7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpTUFJfOFJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlM1OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA2OgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6dEdQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlI2OworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6RFBSXzhSZWdDbGFzc0lEOgorICAgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgICAgICByZXR1cm4gQVJNOjpENjsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlFQUl9WRlAyUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UTY7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpTUFJfOFJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlM2OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA3OgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6dEdQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlI3OworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6RFBSXzhSZWdDbGFzc0lEOgorICAgIGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6CisgICAgICByZXR1cm4gQVJNOjpENzsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlFQUl9WRlAyUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UTc7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpTUFJfOFJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlM3OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA4OgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpSODsKKyAgICBjYXNlIEFSTTo6RFBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OkRQUl9WRlAyUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6RDg7CisgICAgY2FzZSBBUk06OlFQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlE4OworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6U1BSXzhSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTODsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgOToKKyAgICBzd2l0Y2ggKFJlZ0NsYXNzSUQpIHsKKyAgICBjYXNlIEFSTTo6R1BSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6Ujk7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQ5OworICAgIGNhc2UgQVJNOjpRUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpROTsKKyAgICBjYXNlIEFSTTo6U1BSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlNQUl84UmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6Uzk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDEwOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpSMTA7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQxMDsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UTEwOworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6U1BSXzhSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTMTA7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDExOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpSMTE7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQxMTsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UTExOworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6U1BSXzhSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTMTE7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDEyOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpSMTI7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQxMjsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UTEyOworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6U1BSXzhSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTMTI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDEzOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTUDsKKyAgICBjYXNlIEFSTTo6RFBSUmVnQ2xhc3NJRDogY2FzZSBBUk06OkRQUl9WRlAyUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6RDEzOworICAgIGNhc2UgQVJNOjpRUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpRMTM7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpTUFJfOFJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMxMzsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTQ6CisgICAgc3dpdGNoIChSZWdDbGFzc0lEKSB7CisgICAgY2FzZSBBUk06OkdQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkxSOworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6RFBSX1ZGUDJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpEMTQ7CisgICAgY2FzZSBBUk06OlFQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlExNDsKKyAgICBjYXNlIEFSTTo6U1BSUmVnQ2xhc3NJRDogY2FzZSBBUk06OlNQUl84UmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UzE0OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxNToKKyAgICBzd2l0Y2ggKFJlZ0NsYXNzSUQpIHsKKyAgICBjYXNlIEFSTTo6R1BSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UEM7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IGNhc2UgQVJNOjpEUFJfVkZQMlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQxNTsKKyAgICBjYXNlIEFSTTo6UVBSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UTE1OworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiBjYXNlIEFSTTo6U1BSXzhSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTMTU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDE2OgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpEMTY7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMxNjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTc6CisgICAgc3dpdGNoIChSZWdDbGFzc0lEKSB7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQxNzsKKyAgICBjYXNlIEFSTTo6U1BSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UzE3OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxODoKKyAgICBzd2l0Y2ggKFJlZ0NsYXNzSUQpIHsKKyAgICBjYXNlIEFSTTo6RFBSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6RDE4OworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTMTg7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDE5OgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpEMTk7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMxOTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjA6CisgICAgc3dpdGNoIChSZWdDbGFzc0lEKSB7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQyMDsKKyAgICBjYXNlIEFSTTo6U1BSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UzIwOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyMToKKyAgICBzd2l0Y2ggKFJlZ0NsYXNzSUQpIHsKKyAgICBjYXNlIEFSTTo6RFBSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6RDIxOworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTMjE7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDIyOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpEMjI7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMyMjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjM6CisgICAgc3dpdGNoIChSZWdDbGFzc0lEKSB7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQyMzsKKyAgICBjYXNlIEFSTTo6U1BSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UzIzOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyNDoKKyAgICBzd2l0Y2ggKFJlZ0NsYXNzSUQpIHsKKyAgICBjYXNlIEFSTTo6RFBSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6RDI0OworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTMjQ7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDI1OgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpEMjU7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMyNTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjY6CisgICAgc3dpdGNoIChSZWdDbGFzc0lEKSB7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQyNjsKKyAgICBjYXNlIEFSTTo6U1BSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UzI2OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyNzoKKyAgICBzd2l0Y2ggKFJlZ0NsYXNzSUQpIHsKKyAgICBjYXNlIEFSTTo6RFBSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6RDI3OworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTMjc7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDI4OgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpEMjg7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMyODsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjk6CisgICAgc3dpdGNoIChSZWdDbGFzc0lEKSB7CisgICAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OkQyOTsKKyAgICBjYXNlIEFSTTo6U1BSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6UzI5OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAzMDoKKyAgICBzd2l0Y2ggKFJlZ0NsYXNzSUQpIHsKKyAgICBjYXNlIEFSTTo6RFBSUmVnQ2xhc3NJRDogcmV0dXJuIEFSTTo6RDMwOworICAgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpTMzA7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDMxOgorICAgIHN3aXRjaCAoUmVnQ2xhc3NJRCkgeworICAgIGNhc2UgQVJNOjpEUFJSZWdDbGFzc0lEOiByZXR1cm4gQVJNOjpEMzE7CisgICAgY2FzZSBBUk06OlNQUlJlZ0NsYXNzSUQ6IHJldHVybiBBUk06OlMzMTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgREVCVUcoZXJycygpIDw8ICJJbnZhbGlkIChSZWdDbGFzc0lELCBSYXdSZWdpc3RlcikgY29tYmluYXRpb25cbiIpOworICAvLyBFbmNvZGluZyBlcnJvci4gIE1hcmsgdGhlIGJ1aWxkZXIgd2l0aCBlcnJvciBjb2RlICE9IDAuCisgIEItPlNldEVycigtMSk7CisgIHJldHVybiAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgVXRpbGl0eSBGdW5jdGlvbnMgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIEV4dHJhY3QvRGVjb2RlIFJkOiBJbnN0ezE1LTEyfS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZGVjb2RlUmQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gKGluc24gPj4gQVJNSUk6OlJlZ1JkU2hpZnQpICYgQVJNSUk6OkdQUlJlZ01hc2s7Cit9CisKKy8vIEV4dHJhY3QvRGVjb2RlIFJuOiBJbnN0ezE5LTE2fS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZGVjb2RlUm4odWludDMyX3QgaW5zbikgeworICByZXR1cm4gKGluc24gPj4gQVJNSUk6OlJlZ1JuU2hpZnQpICYgQVJNSUk6OkdQUlJlZ01hc2s7Cit9CisKKy8vIEV4dHJhY3QvRGVjb2RlIFJtOiBJbnN0ezMtMH0uCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRlY29kZVJtKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIChpbnNuICYgQVJNSUk6OkdQUlJlZ01hc2spOworfQorCisvLyBFeHRyYWN0L0RlY29kZSBSczogSW5zdHsxMS04fS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZGVjb2RlUnModWludDMyX3QgaW5zbikgeworICByZXR1cm4gKGluc24gPj4gQVJNSUk6OlJlZ1JzU2hpZnQpICYgQVJNSUk6OkdQUlJlZ01hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0Q29uZEZpZWxkKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIChpbnNuID4+IEFSTUlJOjpDb25kU2hpZnQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldElCaXQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gKGluc24gPj4gQVJNSUk6OklfQml0U2hpZnQpICYgMTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRBTTNJQml0KHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIChpbnNuID4+IEFSTUlJOjpBTTNfSV9CaXRTaGlmdCkgJiAxOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFBCaXQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gKGluc24gPj4gQVJNSUk6OlBfQml0U2hpZnQpICYgMTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRVQml0KHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIChpbnNuID4+IEFSTUlJOjpVX0JpdFNoaWZ0KSAmIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0UFVCaXRzKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIChpbnNuID4+IEFSTUlJOjpVX0JpdFNoaWZ0KSAmIDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0U0JpdCh1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiAoaW5zbiA+PiBBUk1JSTo6U19CaXRTaGlmdCkgJiAxOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFdCaXQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gKGluc24gPj4gQVJNSUk6OldfQml0U2hpZnQpICYgMTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXREQml0KHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIChpbnNuID4+IEFSTUlJOjpEX0JpdFNoaWZ0KSAmIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0TkJpdCh1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiAoaW5zbiA+PiBBUk1JSTo6Tl9CaXRTaGlmdCkgJiAxOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldE1CaXQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gKGluc24gPj4gQVJNSUk6Ok1fQml0U2hpZnQpICYgMTsKK30KKworLy8gU2VlIEE4LjQgU2hpZnRzIGFwcGxpZWQgdG8gYSByZWdpc3Rlci4KKy8vICAgICBBOC40LjIgUmVnaXN0ZXIgY29udHJvbGxlZCBzaGlmdHMuCisvLworLy8gZ2V0U2hpZnRPcGNGb3JCaXRzIC0gZ2V0U2hpZnRPcGNGb3JCaXRzIHRyYW5zbGF0ZXMgZnJvbSB0aGUgQVJNIGVuY29kaW5nIGJpdHMKKy8vIGludG8gbGx2bSBlbnVtcyBmb3Igc2hpZnQgb3Bjb2RlLiAgVGhlIEFQSSBjbGllbnRzIHNob3VsZCBwYXNzIGluIHRoZSB2YWx1ZQorLy8gZW5jb2RlZCB3aXRoIHR3byBiaXRzLCBzbyB0aGUgYXNzZXJ0IHN0YXlzIHRvIHNpZ25hbCBhIHdyb25nIEFQSSB1c2FnZS4KKy8vCisvLyBBOC0xMjogRGVjb2RlUmVnU2hpZnQoKQorc3RhdGljIGlubGluZSBBUk1fQU06OlNoaWZ0T3BjIGdldFNoaWZ0T3BjRm9yQml0cyh1bnNpZ25lZCBiaXRzKSB7CisgIHN3aXRjaCAoYml0cykgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiTm8gc3VjaCB2YWx1ZSIpOyByZXR1cm4gQVJNX0FNOjpub19zaGlmdDsKKyAgY2FzZSAwOiAgcmV0dXJuIEFSTV9BTTo6bHNsOworICBjYXNlIDE6ICByZXR1cm4gQVJNX0FNOjpsc3I7CisgIGNhc2UgMjogIHJldHVybiBBUk1fQU06OmFzcjsKKyAgY2FzZSAzOiAgcmV0dXJuIEFSTV9BTTo6cm9yOworICB9Cit9CisKKy8vIFNlZSBBOC40IFNoaWZ0cyBhcHBsaWVkIHRvIGEgcmVnaXN0ZXIuCisvLyAgICAgQTguNC4xIENvbnN0YW50IHNoaWZ0cy4KKy8vCisvLyBnZXRJbW1TaGlmdFNFIC0gZ2V0SW1tU2hpZnRTRSB0cmFuc2xhdGVzIGZyb20gdGhlIHJhdyBTaGlmdE9wYyBhbmQgcmF3IEltbTUKKy8vIGVuY29kaW5ncyBpbnRvIHRoZSBpbnRlbmRlZCBTaGlmdE9wYyBhbmQgc2hpZnQgYW1vdW50LgorLy8KKy8vIEE4LTExOiBEZWNvZGVJbW1TaGlmdCgpCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0SW1tU2hpZnRTRShBUk1fQU06OlNoaWZ0T3BjICZTaE9wLCB1bnNpZ25lZCAmU2hJbW0pIHsKKyAgLy8gSWYgdHlwZSA9PSAwYjExIGFuZCBpbW01ID09IDAsIHdlIGhhdmUgYW4gcnJ4LCBpbnN0ZWFkLgorICBpZiAoU2hPcCA9PSBBUk1fQU06OnJvciAmJiBTaEltbSA9PSAwKQorICAgIFNoT3AgPSBBUk1fQU06OnJyeDsKKyAgLy8gSWYgKGxzciBvciBhc3IpIGFuZCBpbW01ID09IDAsIHNoaWZ0IGFtb3VudCBpcyAzMi4KKyAgaWYgKChTaE9wID09IEFSTV9BTTo6bHNyIHx8IFNoT3AgPT0gQVJNX0FNOjphc3IpICYmIFNoSW1tID09IDApCisgICAgU2hJbW0gPSAzMjsKK30KKworLy8gZ2V0QU1TdWJNb2RlRm9yQml0cyAtIGdldEFNU3ViTW9kZUZvckJpdHMgdHJhbnNsYXRlcyBmcm9tIHRoZSBBUk0gZW5jb2RpbmcKKy8vIGJpdHMgSW5zdHsyNC0yM30gKFAoMjQpIGFuZCBVKDIzKSkgaW50byBsbHZtIGVudW1zIGZvciBBTVN1Yk1vZGUuICBUaGUgQVBJCisvLyBjbGllbnRzIHNob3VsZCBwYXNzIGluIHRoZSB2YWx1ZSBlbmNvZGVkIHdpdGggdHdvIGJpdHMsIHNvIHRoZSBhc3NlcnQgc3RheXMKKy8vIHRvIHNpZ25hbCBhIHdyb25nIEFQSSB1c2FnZS4KK3N0YXRpYyBpbmxpbmUgQVJNX0FNOjpBTVN1Yk1vZGUgZ2V0QU1TdWJNb2RlRm9yQml0cyh1bnNpZ25lZCBiaXRzKSB7CisgIHN3aXRjaCAoYml0cykgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiTm8gc3VjaCB2YWx1ZSIpOyByZXR1cm4gQVJNX0FNOjpiYWRfYW1fc3VibW9kZTsKKyAgY2FzZSAxOiAgcmV0dXJuIEFSTV9BTTo6aWE7ICAgLy8gUD0wIFU9MQorICBjYXNlIDM6ICByZXR1cm4gQVJNX0FNOjppYjsgICAvLyBQPTEgVT0xCisgIGNhc2UgMDogIHJldHVybiBBUk1fQU06OmRhOyAgIC8vIFA9MCBVPTAKKyAgY2FzZSAyOiAgcmV0dXJuIEFSTV9BTTo6ZGI7ICAgLy8gUD0xIFU9MAorICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgRGlzYXNzZW1ibGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLy8gVGhlcmUgaXMgYSBzZXBhcmF0ZSBEaXNhc3NlbWJsZSpGcm0gZnVuY3Rpb24gZW50cnkgZm9yIGRpc2Fzc2VtYmx5IG9mIGFuIEFSTQorLy8vIGluc3RyIGludG8gYSBsaXN0IG9mIE1DT3BlcmFuZHMgaW4gdGhlIGFwcHJvcHJpYXRlIG9yZGVyLCB3aXRoIHBvc3NpYmxlIGRzdCwKKy8vLyBmb2xsb3dlZCBieSBwb3NzaWJsZSBzcmMocykuCisvLy8KKy8vLyBUaGUgcHJvY2Vzc2luZyBvZiB0aGUgcHJlZGljYXRlLCBhbmQgdGhlICdTJyBtb2RpZmllciBiaXQsIGlmIE1JIG1vZGlmaWVzCisvLy8gdGhlIENQU1IsIGlzIGZhY3RvcmVkIGludG8gQVJNQmFzaWNNQ0J1aWxkZXIncyBtZXRob2QgbmFtZWQKKy8vLyBUcnlQcmVkaWNhdGVBbmRTQml0TW9kaWZpZXIuCisKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlUHNldWRvKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8pIHsKKworICBpZiAoT3Bjb2RlID09IEFSTTo6SW50X01lbUJhcnJpZXJWNyB8fCBPcGNvZGUgPT0gQVJNOjpJbnRfU3luY0JhcnJpZXJWNykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBhc3NlcnQoMCAmJiAiVW5leHBlY3RlZCBwc2V1ZG8gaW5zdHJ1Y3Rpb24hIik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gTXVsdGlwbHkgSW5zdHJ1Y3Rpb25zLgorLy8gTUxBLCBNTFMsIFNNTEFCQiwgU01MQUJULCBTTUxBVEIsIFNNTEFUVCwgU01MQVdCLCBTTUxBV1QsIFNNTUxBLCBTTU1MUzoKKy8vICAgICBSZHsxOS0xNn0gUm57My0wfSBSbXsxMS04fSBSYXsxNS0xMn0KKy8vCisvLyBNVUwsIFNNTVVMLCBTTVVMQkIsIFNNVUxCVCwgU01VTFRCLCBTTVVMVFQsIFNNVUxXQiwgU01VTFdUOgorLy8gICAgIFJkezE5LTE2fSBSbnszLTB9IFJtezExLTh9CisvLworLy8gU01MQUwsIFNNVUxMLCBVTUFBTCwgVU1MQUwsIFVNVUxMLCBTTUxBTEJCLCBTTUxBTEJULCBTTUxBTFRCLCBTTUxBTFRUOgorLy8gICAgIFJkTG97MTUtMTJ9IFJkSGl7MTktMTZ9IFJuezMtMH0gUm17MTEtOH0KKy8vCisvLyBUaGUgbWFwcGluZyBvZiB0aGUgbXVsdGlwbHkgcmVnaXN0ZXJzIHRvIHRoZSAicmVndWxhciIgQVJNIHJlZ2lzdGVycywgd2hlcmUKKy8vIHRoZXJlIGFyZSBjb252ZW5pZW5jZSBkZWNvZGVyIGZ1bmN0aW9ucywgaXM6CisvLworLy8gSW5zdHsxNS0xMn0gPT4gUmQKKy8vIEluc3R7MTktMTZ9ID0+IFJuCisvLyBJbnN0ezMtMH0gPT4gUm0KKy8vIEluc3R7MTEtOH0gPT4gUnMKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTXVsRnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gQVJNSW5zdHNbT3Bjb2RlXTsKKyAgdW5zaWduZWQgc2hvcnQgTnVtRGVmcyA9IFRJRC5nZXROdW1EZWZzKCk7CisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBUSUQuT3BJbmZvOworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgYXNzZXJ0KE51bURlZnMgPiAwICYmICJOdW1EZWZzIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMCBmb3IgTXVsRnJtIik7CisgIGFzc2VydChOdW1PcHMgPj0gMworICAgICAgICAgJiYgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgT3BJbmZvWzFdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgT3BJbmZvWzJdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgIkV4cGVjdCB0aHJlZSByZWdpc3RlciBvcGVyYW5kcyIpOworCisgIC8vIEluc3RydWN0aW9ucyB3aXRoIHR3byBkZXN0aW5hdGlvbiByZWdpc3RlcnMgaGF2ZSBSZExvezE1LTEyfSBmaXJzdC4KKyAgaWYgKE51bURlZnMgPT0gMikgeworICAgIGFzc2VydChOdW1PcHMgPj0gNCAmJiBPcEluZm9bM10uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAgICJFeHBlY3QgNHRoIHJlZ2lzdGVyIG9wZXJhbmQiKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmQoaW5zbikpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIC8vIFRoZSBkZXN0aW5hdGlvbiByZWdpc3RlcjogUmRIaXsxOS0xNn0gb3IgUmR7MTktMTZ9LgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworCisgIC8vIFRoZSB0d28gc3JjIHJlZ3NpdGVyczogUm57My0wfSwgdGhlbiBSbXsxMS04fS4KKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbShpbnNuKSkpKTsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVScyhpbnNuKSkpKTsKKyAgT3BJZHggKz0gMzsKKworICAvLyBNYW55IG11bHRpcGx5IGluc3RydWN0aW9ucyAoZS5nLiwgTUxBKSBoYXZlIHRocmVlIHNyYyByZWdpc3RlcnMuCisgIC8vIFRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIGlzIFJhezE1LTEyfS4KKyAgaWYgKE9wSWR4IDwgTnVtT3BzICYmIE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJkKGluc24pKSkpOworICAgICsrT3BJZHg7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gSGVscGVyIHJvdXRpbmVzIGZvciBkaXNhc3NlbWJseSBvZiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuCisKK3N0YXRpYyBib29sIExkU3RDb3BPcGNvZGUodW5zaWduZWQgT3Bjb2RlKSB7CisgIGlmICgoT3Bjb2RlID49IEFSTTo6TERDMkxfT0ZGU0VUICYmIE9wY29kZSA8PSBBUk06OkxEQ19QUkUpIHx8CisgICAgICAoT3Bjb2RlID49IEFSTTo6U1RDMkxfT0ZGU0VUICYmIE9wY29kZSA8PSBBUk06OlNUQ19QUkUpKQorICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CitzdGF0aWMgYm9vbCBDb3Byb2Nlc3Nvck9wY29kZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgaWYgKExkU3RDb3BPcGNvZGUoT3Bjb2RlKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBBUk06OkNEUDogIGNhc2UgQVJNOjpDRFAyOgorICBjYXNlIEFSTTo6TUNSOiAgY2FzZSBBUk06Ok1DUjI6ICBjYXNlIEFSTTo6TVJDOiAgY2FzZSBBUk06Ok1SQzI6CisgIGNhc2UgQVJNOjpNQ1JSOiBjYXNlIEFSTTo6TUNSUjI6IGNhc2UgQVJNOjpNUlJDOiBjYXNlIEFSTTo6TVJSQzI6CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgR2V0Q29wcm9jZXNzb3IodWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgMTEsIDgpOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBHZXRDb3BPcGMxKHVpbnQzMl90IGluc24sIGJvb2wgQ0RQKSB7CisgIHJldHVybiBDRFAgPyBzbGljZShpbnNuLCAyMywgMjApIDogc2xpY2UoaW5zbiwgMjMsIDIxKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgR2V0Q29wT3BjMih1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiBzbGljZShpbnNuLCA3LCA1KTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgR2V0Q29wT3BjKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIHNsaWNlKGluc24sIDcsIDQpOworfQorLy8gTW9zdCBvZiB0aGUgb3BlcmFuZHMgYXJlIGluIGltbWVkaWF0ZSBmb3JtcywgZXhjZXB0IFJkIGFuZCBSbiwgd2hpY2ggYXJlIEFSTQorLy8gY29yZSByZWdpc3RlcnMuCisvLworLy8gQ0RQLCBDRFAyOiAgICAgICAgICAgICAgICBjb3Agb3BjMSBDUmQgQ1JuIENSbSBvcGMyCisvLworLy8gTUNSLCBNQ1IyLCBNUkMsIE1SQzI6ICAgICBjb3Agb3BjMSBSZCBDUm4gQ1JtIG9wYzIKKy8vCisvLyBNQ1JSLCBNQ1JSMiwgTVJSQywgTVJSYzI6IGNvcCBvcGMgUmQgUm4gQ1JtCisvLworLy8gTERDX09GRlNFVCwgTERDX1BSRSwgTERDX1BPU1Q6IGNvcCBDUmQgUm4gUjAgWysvLV1pbW04OjAwCisvLyBhbmQgZnJpZW5kcworLy8gU1RDX09GRlNFVCwgU1RDX1BSRSwgU1RDX1BPU1Q6IGNvcCBDUmQgUm4gUjAgWysvLV1pbW04OjAwCisvLyBhbmQgZnJpZW5kcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tIGFkZHJtb2RlMiAtLT4KKy8vCisvLyBMRENfT1BUSU9OOiAgICAgICAgICAgICAgICAgICAgY29wIENSZCBSbiBpbW04CisvLyBhbmQgZnJpZW5kcworLy8gU1RDX09QVElPTjogICAgICAgICAgICAgICAgICAgIGNvcCBDUmQgUm4gaW1tOAorLy8gYW5kIGZyaWVuZHMKKy8vCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZUNvcHJvY2Vzc29yKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGFzc2VydChOdW1PcHMgPj0gNSAmJiAiTnVtIG9mIG9wZXJhbmRzID49IDUgZm9yIGNvcHJvY2Vzc29yIGluc3RyIik7CisKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisgIGJvb2wgT25lQ29wT3BjID0gKE9wY29kZSA9PSBBUk06Ok1DUlIgfHwgT3Bjb2RlID09IEFSTTo6TUNSUjIgfHwKKyAgICAgICAgICAgICAgICAgICAgT3Bjb2RlID09IEFSTTo6TVJSQyB8fCBPcGNvZGUgPT0gQVJNOjpNUlJDMik7CisgIC8vIENEUC9DRFAyIGhhcyBubyBHUFIgb3BlcmFuZDsgdGhlIG9wYzEgb3BlcmFuZCBpcyBhbHNvIHdpZGVyIChJbnN0ezIzLTIwfSkuCisgIGJvb2wgTm9HUFIgPSAoT3Bjb2RlID09IEFSTTo6Q0RQIHx8IE9wY29kZSA9PSBBUk06OkNEUDIpOworICBib29sIExkU3RDb3AgPSBMZFN0Q29wT3Bjb2RlKE9wY29kZSk7CisKKyAgT3BJZHggPSAwOworCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oR2V0Q29wcm9jZXNzb3IoaW5zbikpKTsKKworICBpZiAoTGRTdENvcCkgeworICAgIC8vIFVuaW5kZXggaWYgUDpXID0gMGIwMCAtLT4gX09QVElPTiB2YXJpYW50CisgICAgdW5zaWduZWQgUFcgPSBnZXRQQml0KGluc24pIDw8IDEgfCBnZXRXQml0KGluc24pOworCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShkZWNvZGVSZChpbnNuKSkpOworCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworCisgICAgaWYgKFBXKSB7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKDApKTsKKyAgICAgIEFSTV9BTTo6QWRkck9wYyBBZGRyT3Bjb2RlID0gZ2V0VUJpdChpbnNuKSA/IEFSTV9BTTo6YWRkIDogQVJNX0FNOjpzdWI7CisgICAgICB1bnNpZ25lZCBPZmZzZXQgPSBBUk1fQU06OmdldEFNMk9wYyhBZGRyT3Bjb2RlLCBzbGljZShpbnNuLCA3LCAwKSA8PCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNX0FNOjpub19zaGlmdCk7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKE9mZnNldCkpOworICAgICAgT3BJZHggPSA1OworICAgIH0gZWxzZSB7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKHNsaWNlKGluc24sIDcsIDApKSk7CisgICAgICBPcElkeCA9IDQ7CisgICAgfQorICB9IGVsc2UgeworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oT25lQ29wT3BjID8gR2V0Q29wT3BjKGluc24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRDb3BPcGMxKGluc24sIE5vR1BSKSkpOworCisgICAgTUkuYWRkT3BlcmFuZChOb0dQUiA/IE1DT3BlcmFuZDo6Q3JlYXRlSW1tKGRlY29kZVJkKGluc24pKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBNQ09wZXJhbmQ6OkNyZWF0ZVJlZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSZChpbnNuKSkpKTsKKworICAgIE1JLmFkZE9wZXJhbmQoT25lQ29wT3BjID8gTUNPcGVyYW5kOjpDcmVhdGVSZWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNQ09wZXJhbmQ6OkNyZWF0ZUltbShkZWNvZGVSbihpbnNuKSkpOworCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShkZWNvZGVSbShpbnNuKSkpOworCisgICAgT3BJZHggPSA1OworCisgICAgaWYgKCFPbmVDb3BPcGMpIHsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oR2V0Q29wT3BjMihpbnNuKSkpOworICAgICAgKytPcElkeDsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQnJhbmNoIEluc3RydWN0aW9ucy4KKy8vIEJMcjk6IFNpZ25FeHRlbmQoSW1tMjQ6JzAwJywgMzIpCisvLyBCY2MsIEJMcjlfcHJlZDogU2lnbkV4dGVuZChJbW0yNDonMDAnLCAzMikgUHJlZDAgUHJlZDEKKy8vIFNNQzogWmVyb0V4dGVuZChpbW00LCAzMikKKy8vIFNWQzogWmVyb0V4dGVuZChJbW0yNCwgMzIpCisvLworLy8gVmFyaW91cyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgYXJlIGFzc2lnbmVkIEJyRnJtIGFyYml0cmFyaWx5LgorLy8gRGVsZWdhdGVzIHRvIERpc2Fzc2VtYmxlQ29wcm9jZXNzb3IoKSBoZWxwZXIgZnVuY3Rpb24uCisvLworLy8gTVJTL01SU3N5czogUmQKKy8vIE1TUi9NU1JzeXM6IFJtIG1hc2s9SW5zdHsxOS0xNn0KKy8vIEJYSjogICAgICAgIFJtCisvLyBNU1JpL01TUnN5c2k6IHNvX2ltbQorLy8gU1JTVy9TUlM6IGFkZHJtb2RlNDokYWRkciBtb2RlX2ltbQorLy8gUkZFVy9SRkU6IGFkZHJtb2RlNDokYWRkciBSbgorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVCckZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBpZiAoQ29wcm9jZXNzb3JPcGNvZGUoT3Bjb2RlKSkKKyAgICByZXR1cm4gRGlzYXNzZW1ibGVDb3Byb2Nlc3NvcihNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLCBCKTsKKworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gQVJNSW5zdHNbT3Bjb2RlXS5PcEluZm87CisgIGlmICghT3BJbmZvKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gTVJTIGFuZCBNUlNzeXMgdGFrZSBvbmUgR1BSIHJlZyBSZC4KKyAgaWYgKE9wY29kZSA9PSBBUk06Ok1SUyB8fCBPcGNvZGUgPT0gQVJNOjpNUlNzeXMpIHsKKyAgICBhc3NlcnQoTnVtT3BzID49IDEgJiYgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgICAiUmVnIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmQoaW5zbikpKSk7CisgICAgTnVtT3BzQWRkZWQgPSAxOworICAgIHJldHVybiB0cnVlOworICB9CisgIC8vIEJYSiB0YWtlcyBvbmUgR1BSIHJlZyBSbS4KKyAgaWYgKE9wY29kZSA9PSBBUk06OkJYSikgeworICAgIGFzc2VydChOdW1PcHMgPj0gMSAmJiBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAgICJSZWcgb3BlcmFuZCBleHBlY3RlZCIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbShpbnNuKSkpKTsKKyAgICBOdW1PcHNBZGRlZCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gTVNSIGFuZCBNU1JzeXMgdGFrZSBvbmUgR1BSIHJlZyBSbSwgZm9sbG93ZWQgYnkgdGhlIG1hc2suCisgIGlmIChPcGNvZGUgPT0gQVJNOjpNU1IgfHwgT3Bjb2RlID09IEFSTTo6TVNSc3lzKSB7CisgICAgYXNzZXJ0KE51bU9wcyA+PSAxICYmIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgICAgIlJlZyBvcGVyYW5kIGV4cGVjdGVkIik7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJtKGluc24pKSkpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oc2xpY2UoaW5zbiwgMTksIDE2KSkpOworICAgIE51bU9wc0FkZGVkID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAvLyBNU1JpIGFuZCBNU1JzeXNpIHRha2Ugb25lIHNvX2ltbSBvcGVyYW5kLCBmb2xsb3dlZCBieSB0aGUgbWFzay4KKyAgaWYgKE9wY29kZSA9PSBBUk06Ok1TUmkgfHwgT3Bjb2RlID09IEFSTTo6TVNSc3lzaSkgeworICAgIC8vIFNPSW1tIGlzIDQtYml0IHJvdGF0ZSBhbW91bnQgaW4gYml0cyAxMS04IHdpdGggOC1iaXQgaW1tIGluIGJpdHMgNy0wLgorICAgIC8vIEE1LjIuNCBSb3RhdGUgYW1vdW50IGlzIHR3aWNlIHRoZSBudW1lcmljIHZhbHVlIG9mIEluc3R7MTEtOH0uCisgICAgLy8gU2VlIGFsc28gQVJNQWRkcmVzc2luZ01vZGVzLmg6IGdldFNPSW1tVmFsSW1tKCkgYW5kIGdldFNPSW1tVmFsUm90KCkuCisgICAgdW5zaWduZWQgUm90ID0gKGluc24gPj4gQVJNSUk6OlNvUm90SW1tU2hpZnQpICYgMHhGOworICAgIHVuc2lnbmVkIEltbSA9IGluc24gJiAweEZGOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oQVJNX0FNOjpyb3RyMzIoSW1tLCAyKlJvdCkpKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKHNsaWNlKGluc24sIDE5LCAxNikpKTsKKyAgICBOdW1PcHNBZGRlZCA9IDI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gU1JTVyBhbmQgU1JTIHJlcXVpcmVzIGFkZHJtb2RlNDokYWRkciBmb3IgJHthZGRyOnN1Ym1vZGV9LCBmb2xsb3dlZCBieSB0aGUKKyAgLy8gbW9kZSBpbW1lZGlhdGUgKEluc3R7NC0wfSkuCisgIGlmIChPcGNvZGUgPT0gQVJNOjpTUlNXIHx8IE9wY29kZSA9PSBBUk06OlNSUyB8fAorICAgICAgT3Bjb2RlID09IEFSTTo6UkZFVyB8fCBPcGNvZGUgPT0gQVJNOjpSRkUpIHsKKyAgICAvLyBBUk1JbnN0UHJpbnRlcjo6cHJpbnRBZGRyTW9kZTRPcGVyYW5kKCkgcHJpbnRzIHNwZWNpYWwgbW9kZSBzdHJpbmcKKyAgICAvLyBpZiB0aGUgYmFzZSByZWdpc3RlciBpcyBTUDsgc28gZG9uJ3Qgc2V0IEFSTTo6U1AuCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKSk7CisgICAgQVJNX0FNOjpBTVN1Yk1vZGUgU3ViTW9kZSA9IGdldEFNU3ViTW9kZUZvckJpdHMoZ2V0UFVCaXRzKGluc24pKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEFSTV9BTTo6Z2V0QU00TW9kZUltbShTdWJNb2RlKSkpOworCisgICAgaWYgKE9wY29kZSA9PSBBUk06OlNSU1cgfHwgT3Bjb2RlID09IEFSTTo6U1JTKQorICAgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShzbGljZShpbnNuLCA0LCAwKSkpOworICAgIGVsc2UKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworICAgIE51bU9wc0FkZGVkID0gMzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGFzc2VydCgoT3Bjb2RlID09IEFSTTo6QmNjIHx8IE9wY29kZSA9PSBBUk06OkJMcjkgfHwgT3Bjb2RlID09IEFSTTo6QkxyOV9wcmVkCisgICAgICAgICAgfHwgT3Bjb2RlID09IEFSTTo6U01DIHx8IE9wY29kZSA9PSBBUk06OlNWQykgJiYKKyAgICAgICAgICJVbmV4cGVjdGVkIE9wY29kZSIpOworCisgIGFzc2VydChOdW1PcHMgPj0gMSAmJiBPcEluZm9bMF0uUmVnQ2xhc3MgPCAwICYmICJSZWcgb3BlcmFuZCBleHBlY3RlZCIpOworCisgIGludCBJbW0zMiA9IDA7CisgIGlmIChPcGNvZGUgPT0gQVJNOjpTTUMpIHsKKyAgICAvLyBaZXJvRXh0ZW5kKGltbTQsIDMyKSB3aGVyZSBpbW0yNCA9IEluc3R7My0wfS4KKyAgICBJbW0zMiA9IHNsaWNlKGluc24sIDMsIDApOworICB9IGVsc2UgaWYgKE9wY29kZSA9PSBBUk06OlNWQykgeworICAgIC8vIFplcm9FeHRlbmQoaW1tMjQsIDMyKSB3aGVyZSBpbW0yNCA9IEluc3R7MjMtMH0uCisgICAgSW1tMzIgPSBzbGljZShpbnNuLCAyMywgMCk7CisgIH0gZWxzZSB7CisgICAgLy8gU2lnbkV4dGVuZChpbW0yNDonMDAnLCAzMikgd2hlcmUgaW1tMjQgPSBJbnN0ezIzLTB9LgorICAgIHVuc2lnbmVkIEltbTI2ID0gc2xpY2UoaW5zbiwgMjMsIDApIDw8IDI7CisgICAgLy9JbW0zMiA9IHNpZ25leHRlbmQ8c2lnbmVkIGludCwgMjY+KEltbTI2KTsKKyAgICBJbW0zMiA9IFNpZ25FeHRlbmQzMjwyNj4oSW1tMjYpOworCisgICAgLy8gV2hlbiBleGVjdXRpbmcgYW4gQVJNIGluc3RydWN0aW9uLCBQQyByZWFkcyBhcyB0aGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudAorICAgIC8vIGluc3RydWN0aW9uIHBsdXMgOC4gIFRoZSBhc3NlbWJsZXIgc3VidHJhY3RzIDggZnJvbSB0aGUgZGlmZmVyZW5jZQorICAgIC8vIGJldHdlZW4gdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiBhbmQgdGhlIHRhcmdldCBhZGRyZXNzLCBkaXNhc3NlbWJsZXIgaGFzCisgICAgLy8gdG8gYWRkIDggdG8gY29tcGVuc2F0ZS4KKyAgICBJbW0zMiArPSA4OworICB9CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShJbW0zMikpOworICBOdW1PcHNBZGRlZCA9IDE7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIE1pc2MuIEJyYW5jaCBJbnN0cnVjdGlvbnMuCisvLyBCUl9KVGFkZCwgQlJfSlRyLCBCUl9KVG0KKy8vIEJMWHI5LCBCWHI5CisvLyBCUklORCwgQlhfUkVUCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZUJyTWlzY0ZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gQVJNSW5zdHNbT3Bjb2RlXS5PcEluZm87CisgIGlmICghT3BJbmZvKSByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgT3BJZHggPSAwOworCisgIC8vIEJYX1JFVCBoYXMgb25seSB0d28gcHJlZGljYXRlIG9wZXJhbmRzLCBkbyBhbiBlYXJseSByZXR1cm4uCisgIGlmIChPcGNvZGUgPT0gQVJNOjpCWF9SRVQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gQkxYcjkgYW5kIEJSSU5EIHRha2Ugb25lIEdQUiByZWcuCisgIGlmIChPcGNvZGUgPT0gQVJNOjpCTFhyOSB8fCBPcGNvZGUgPT0gQVJNOjpCUklORCkgeworICAgIGFzc2VydChOdW1PcHMgPj0gMSAmJiBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgICAiUmVnIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisgICAgT3BJZHggPSAxOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQlJfSlRhZGQgaXMgYW4gQUREIHdpdGggUmQgPSBQQywgKFJuLCBSbSkgYXMgdGhlIHRhcmdldCBhbmQgaW5kZXggcmVncy4KKyAgaWYgKE9wY29kZSA9PSBBUk06OkJSX0pUYWRkKSB7CisgICAgLy8gSW5PcGVyYW5kTGlzdCB3aXRoIEdQUjokdGFyZ2V0IGFuZCBHUFI6JGlkeCByZWdzLgorCisgICAgYXNzZXJ0KE51bU9wcyA9PSA0ICYmICJFeHBlY3QgNCBvcGVyYW5kcyIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisKKyAgICAvLyBGaWxsIGluIHRoZSB0d28gcmVtYWluaW5nIGltbSBvcGVyYW5kcyB0byBzaWduaWZ5IGJ1aWxkIGNvbXBsZXRpb24uCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbSgwKSk7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbSgwKSk7CisKKyAgICBPcElkeCA9IDQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBCUl9KVHIgaXMgYSBNT1Ygd2l0aCBSZCA9IFBDLCBhbmQgUm0gYXMgdGhlIHNvdXJjZSByZWdpc3Rlci4KKyAgaWYgKE9wY29kZSA9PSBBUk06OkJSX0pUcikgeworICAgIC8vIEluT3BlcmFuZExpc3Qgd2l0aCBHUFI6OiR0YXJnZXQgcmVnLgorCisgICAgYXNzZXJ0KE51bU9wcyA9PSAzICYmICJFeHBlY3QgMyBvcGVyYW5kcyIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbShpbnNuKSkpKTsKKworICAgIC8vIEZpbGwgaW4gdGhlIHR3byByZW1haW5pbmcgaW1tIG9wZXJhbmRzIHRvIHNpZ25pZnkgYnVpbGQgY29tcGxldGlvbi4KKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKDApKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKDApKTsKKworICAgIE9wSWR4ID0gMzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEJSX0pUbSBpcyBhbiBMRFIgd2l0aCBSdCA9IFBDLgorICBpZiAoT3Bjb2RlID09IEFSTTo6QlJfSlRtKSB7CisgICAgLy8gVGhpcyBpcyB0aGUgcmVnL3JlZyBmb3JtLCB3aXRoIGJhc2UgcmVnIGZvbGxvd2VkIGJ5ICsvLSByZWcgc2hvcCBpbW0uCisgICAgLy8gU2VlIGFsc28gQVJNQWRkcmVzc2luZ01vZGVzLmggKEFkZHJlc3NpbmcgTW9kZSAjMikuCisKKyAgICBhc3NlcnQoTnVtT3BzID09IDUgJiYgZ2V0SUJpdChpbnNuKSA9PSAxICYmICJFeHBlY3QgNSBvcGVyYW5kcyAmJiBJLWJpdD0xIik7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworCisgICAgQVJNX0FNOjpBZGRyT3BjIEFkZHJPcGNvZGUgPSBnZXRVQml0KGluc24pID8gQVJNX0FNOjphZGQgOiBBUk1fQU06OnN1YjsKKworICAgIC8vIERpc2Fzc2VtYmxlIHRoZSBvZmZzZXQgcmVnIChSbSksIHNoaWZ0IHR5cGUsIGFuZCBpbW1lZGlhdGUgc2hpZnQgbGVuZ3RoLgorICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbShpbnNuKSkpKTsKKyAgICAvLyBJbnN0ezYtNX0gZW5jb2RlcyB0aGUgc2hpZnQgb3Bjb2RlLgorICAgIEFSTV9BTTo6U2hpZnRPcGMgU2hPcCA9IGdldFNoaWZ0T3BjRm9yQml0cyhzbGljZShpbnNuLCA2LCA1KSk7CisgICAgLy8gSW5zdHsxMS03fSBlbmNvZGVzIHRoZSBpbW01IHNoaWZ0IGFtb3VudC4KKyAgICB1bnNpZ25lZCBTaEltbSA9IHNsaWNlKGluc24sIDExLCA3KTsKKworICAgIC8vIEE4LjQuMS4gIFBvc3NpYmxlIHJyeCBvciBzaGlmdCBhbW91bnQgb2YgMzIuLi4KKyAgICBnZXRJbW1TaGlmdFNFKFNoT3AsIFNoSW1tKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKAorICAgICAgICAgICAgICAgICAgICBBUk1fQU06OmdldEFNMk9wYyhBZGRyT3Bjb2RlLCBTaEltbSwgU2hPcCkpKTsKKworICAgIC8vIEZpbGwgaW4gdGhlIHR3byByZW1haW5pbmcgaW1tIG9wZXJhbmRzIHRvIHNpZ25pZnkgYnVpbGQgY29tcGxldGlvbi4KKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKDApKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKDApKTsKKworICAgIE9wSWR4ID0gNTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGdldEJGQ0ludk1hc2sodWludDMyX3QgaW5zbiwgdWludDMyX3QgJm1hc2spIHsKKyAgdWludDMyX3QgbHNiID0gc2xpY2UoaW5zbiwgMTEsIDcpOworICB1aW50MzJfdCBtc2IgPSBzbGljZShpbnNuLCAyMCwgMTYpOworICB1aW50MzJfdCBWYWwgPSAwOworICBpZiAobXNiIDwgbHNiKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJFbmNvZGluZyBlcnJvcjogbXNiIDwgbHNiXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmb3IgKHVpbnQzMl90IGkgPSBsc2I7IGkgPD0gbXNiOyArK2kpCisgICAgVmFsIHw9ICgxIDw8IGkpOworICBtYXNrID0gflZhbDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEEgbWFqb3IgY29tcGxpY2F0aW9uIGlzIHRoZSBmYWN0IHRoYXQgc29tZSBvZiB0aGUgc2F0dXJhdGluZyBhZGQvc3VidHJhY3QKKy8vIG9wZXJhdGlvbnMgaGF2ZSBSZCBSbSBSbiwgaW5zdGVhZCBvZiB0aGUgIm5vcm1hbCIgUmQgUm4gUm0uCisvLyBUaGV5IGFyZSBRQURELCBRREFERCwgUURTVUIsIGFuZCBRU1VCLgorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVEUEZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IEFSTUluc3RzW09wY29kZV07CisgIHVuc2lnbmVkIHNob3J0IE51bURlZnMgPSBUSUQuZ2V0TnVtRGVmcygpOworICBib29sIGlzVW5hcnkgPSBpc1VuYXJ5RFAoVElELlRTRmxhZ3MpOworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gVElELk9wSW5mbzsKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgT3BJZHggPSAwOworCisgIC8vIERpc2Fzc2VtYmxlIHJlZ2lzdGVyIGRlZiBpZiB0aGVyZSBpcyBvbmUuCisgIGlmIChOdW1EZWZzICYmIChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCkpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmQoaW5zbikpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIC8vIE5vdyBkaXNhc3NlbWJsZSB0aGUgc3JjIG9wZXJhbmRzLgorICBpZiAoT3BJZHggPj0gTnVtT3BzKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBTcGVjaWFsLWNhc2UgaGFuZGxpbmcgb2YgQkZDL0JGSS9TQkZYL1VCRlguCisgIGlmIChPcGNvZGUgPT0gQVJNOjpCRkMgfHwgT3Bjb2RlID09IEFSTTo6QkZJKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKSk7CisgICAgaWYgKE9wY29kZSA9PSBBUk06OkJGSSkgeworICAgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisgICAgICArK09wSWR4OworICAgIH0KKyAgICB1aW50MzJfdCBtYXNrID0gMDsKKyAgICBpZiAoIWdldEJGQ0ludk1hc2soaW5zbiwgbWFzaykpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKG1hc2spKTsKKyAgICBPcElkeCArPSAyOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChPcGNvZGUgPT0gQVJNOjpTQkZYIHx8IE9wY29kZSA9PSBBUk06OlVCRlgpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShzbGljZShpbnNuLCAxMSwgNykpKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKHNsaWNlKGluc24sIDIwLCAxNikgKyAxKSk7CisgICAgT3BJZHggKz0gMzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgUm1SbiA9IChPcGNvZGUgPT0gQVJNOjpRQUREIHx8IE9wY29kZSA9PSBBUk06OlFEQUREIHx8CisgICAgICAgICAgICAgICBPcGNvZGUgPT0gQVJNOjpRRFNVQiB8fCBPcGNvZGUgPT0gQVJNOjpRU1VCKTsKKworICAvLyBCaW5hcnlEUCBoYXMgYW4gUm4gb3BlcmFuZC4KKyAgaWYgKCFpc1VuYXJ5KSB7CisgICAgYXNzZXJ0KE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAgICJSZWcgb3BlcmFuZCBleHBlY3RlZCIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoCisgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSbVJuID8gZGVjb2RlUm0oaW5zbikgOiBkZWNvZGVSbihpbnNuKSkpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgLy8gSWYgdGhpcyBpcyBhIHR3by1hZGRyZXNzIG9wZXJhbmQsIHNraXAgaXQsIGUuZy4sIE1PVkNDciBvcGVyYW5kIDEuCisgIGlmIChpc1VuYXJ5ICYmIChUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoT3BJZHgsIFRPSTo6VElFRF9UTykgIT0gLTEpKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIC8vIE5vdyBkaXNhc3NlbWJsZSBvcGVyYW5kIDIuCisgIGlmIChPcElkeCA+PSBOdW1PcHMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCkgeworICAgIC8vIFdlIGhhdmUgYSByZWcvcmVnIGZvcm0uCisgICAgLy8gQXNzZXJ0IGRpc2FibGVkIGJlY2F1c2Ugc2F0dXJhdGluZyBvcGVyYXRpb25zLCBlLmcuLCBBOC42LjEyNyBRQVNYLCBhcmUKKyAgICAvLyByb3V0ZWQgaGVyZSBhcyB3ZWxsLgorICAgIC8vIGFzc2VydChnZXRJQml0KGluc24pID09IDAgJiYgIklfQml0ICE9ICcwJyByZWcvcmVnIGZvcm0iKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKAorICAgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm1Sbj8gZGVjb2RlUm4oaW5zbikgOiBkZWNvZGVSbShpbnNuKSkpKTsKKyAgICArK09wSWR4OworICB9IGVsc2UgaWYgKE9wY29kZSA9PSBBUk06Ok1PVmkxNiB8fCBPcGNvZGUgPT0gQVJNOjpNT1ZUaTE2KSB7CisgICAgLy8gV2UgaGF2ZSBhbiBpbW0xNiA9IGltbTQ6aW1tMTIgKGltbTQ9SW5zdHsxOToxNn0sIGltbTEyID0gSW5zdHsxMTowfSkuCisgICAgYXNzZXJ0KGdldElCaXQoaW5zbikgPT0gMSAmJiAiSV9CaXQgIT0gJzEnIHJlZy9pbW0gZm9ybSIpOworICAgIHVuc2lnbmVkIEltbTE2ID0gc2xpY2UoaW5zbiwgMTksIDE2KSA8PCAxMiB8IHNsaWNlKGluc24sIDExLCAwKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEltbTE2KSk7CisgICAgKytPcElkeDsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSBoYXZlIGEgcmVnL2ltbSBmb3JtLgorICAgIC8vIFNPSW1tIGlzIDQtYml0IHJvdGF0ZSBhbW91bnQgaW4gYml0cyAxMS04IHdpdGggOC1iaXQgaW1tIGluIGJpdHMgNy0wLgorICAgIC8vIEE1LjIuNCBSb3RhdGUgYW1vdW50IGlzIHR3aWNlIHRoZSBudW1lcmljIHZhbHVlIG9mIEluc3R7MTEtOH0uCisgICAgLy8gU2VlIGFsc28gQVJNQWRkcmVzc2luZ01vZGVzLmg6IGdldFNPSW1tVmFsSW1tKCkgYW5kIGdldFNPSW1tVmFsUm90KCkuCisgICAgYXNzZXJ0KGdldElCaXQoaW5zbikgPT0gMSAmJiAiSV9CaXQgIT0gJzEnIHJlZy9pbW0gZm9ybSIpOworICAgIHVuc2lnbmVkIFJvdCA9IChpbnNuID4+IEFSTUlJOjpTb1JvdEltbVNoaWZ0KSAmIDB4RjsKKyAgICB1bnNpZ25lZCBJbW0gPSBpbnNuICYgMHhGRjsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEFSTV9BTTo6cm90cjMyKEltbSwgMipSb3QpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZURQU29SZWdGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBBUk1JbnN0c1tPcGNvZGVdOworICB1bnNpZ25lZCBzaG9ydCBOdW1EZWZzID0gVElELmdldE51bURlZnMoKTsKKyAgYm9vbCBpc1VuYXJ5ID0gaXNVbmFyeURQKFRJRC5UU0ZsYWdzKTsKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IFRJRC5PcEluZm87CisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICAvLyBEaXNhc3NlbWJsZSByZWdpc3RlciBkZWYgaWYgdGhlcmUgaXMgb25lLgorICBpZiAoTnVtRGVmcyAmJiAoT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQpKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJkKGluc24pKSkpOworICAgICsrT3BJZHg7CisgIH0KKworICAvLyBEaXNhc3NlbWJsZSB0aGUgc3JjIG9wZXJhbmRzLgorICBpZiAoT3BJZHggPj0gTnVtT3BzKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBCaW5hcnlEUCBoYXMgYW4gUm4gb3BlcmFuZC4KKyAgaWYgKCFpc1VuYXJ5KSB7CisgICAgYXNzZXJ0KE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAgICJSZWcgb3BlcmFuZCBleHBlY3RlZCIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgLy8gSWYgdGhpcyBpcyBhIHR3by1hZGRyZXNzIG9wZXJhbmQsIHNraXAgaXQsIGUuZy4sIE1PVkNDcyBvcGVyYW5kIDEuCisgIGlmIChpc1VuYXJ5ICYmIChUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoT3BJZHgsIFRPSTo6VElFRF9UTykgIT0gLTEpKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIC8vIERpc2Fzc2VtYmxlIG9wZXJhbmQgMiwgd2hpY2ggY29uc2lzdHMgb2YgdGhyZWUgY29tcG9uZW50cy4KKyAgaWYgKE9wSWR4ICsgMiA+PSBOdW1PcHMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGFzc2VydCgoT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQpICYmCisgICAgICAgICAoT3BJbmZvW09wSWR4KzFdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCkgJiYKKyAgICAgICAgIChPcEluZm9bT3BJZHgrMl0uUmVnQ2xhc3MgPCAwKSAmJgorICAgICAgICAgIkV4cGVjdCAzIHJlZyBvcGVyYW5kcyIpOworCisgIC8vIFJlZ2lzdGVyLWNvbnRyb2xsZWQgc2hpZnRzIGhhdmUgSW5zdHs3fSA9IDAgYW5kIEluc3R7NH0gPSAxLgorICB1bnNpZ25lZCBScyA9IHNsaWNlKGluc24sIDQsIDQpOworCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisgIGlmIChScykgeworICAgIC8vIFJlZ2lzdGVyLWNvbnRyb2xsZWQgc2hpZnRzOiBbUm0sIFJzLCBzaGlmdF0uCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJzKGluc24pKSkpOworICAgIC8vIEluc3R7Ni01fSBlbmNvZGVzIHRoZSBzaGlmdCBvcGNvZGUuCisgICAgQVJNX0FNOjpTaGlmdE9wYyBTaE9wID0gZ2V0U2hpZnRPcGNGb3JCaXRzKHNsaWNlKGluc24sIDYsIDUpKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEFSTV9BTTo6Z2V0U09SZWdPcGMoU2hPcCwgMCkpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBDb25zdGFudCBzaGlmdHM6IFtSbSwgcmVnMCwgc2hpZnRfaW1tXS4KKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKDApKTsgLy8gTm9SZWdpc3RlcgorICAgIC8vIEluc3R7Ni01fSBlbmNvZGVzIHRoZSBzaGlmdCBvcGNvZGUuCisgICAgQVJNX0FNOjpTaGlmdE9wYyBTaE9wID0gZ2V0U2hpZnRPcGNGb3JCaXRzKHNsaWNlKGluc24sIDYsIDUpKTsKKyAgICAvLyBJbnN0ezExLTd9IGVuY29kZXMgdGhlIGltbTUgc2hpZnQgYW1vdW50LgorICAgIHVuc2lnbmVkIFNoSW1tID0gc2xpY2UoaW5zbiwgMTEsIDcpOworCisgICAgLy8gQTguNC4xLiAgUG9zc2libGUgcnJ4IG9yIHNoaWZ0IGFtb3VudCBvZiAzMi4uLgorICAgIGdldEltbVNoaWZ0U0UoU2hPcCwgU2hJbW0pOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oQVJNX0FNOjpnZXRTT1JlZ09wYyhTaE9wLCBTaEltbSkpKTsKKyAgfQorICBPcElkeCArPSAzOworCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZUxkU3RGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBib29sIGlzU3RvcmUsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IEFSTUluc3RzW09wY29kZV07CisgIGJvb2wgaXNQcmVQb3N0ID0gaXNQcmVQb3N0TGRTdChUSUQuVFNGbGFncyk7CisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBUSUQuT3BJbmZvOworICBpZiAoIU9wSW5mbykgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICBhc3NlcnQoKCghaXNTdG9yZSAmJiBUSUQuZ2V0TnVtRGVmcygpID4gMCkgfHwKKyAgICAgICAgICAoaXNTdG9yZSAmJiAoVElELmdldE51bURlZnMoKSA9PSAwIHx8IGlzUHJlUG9zdCkpKQorICAgICAgICAgJiYgIkludmFsaWQgYXJndW1lbnRzIik7CisKKyAgLy8gT3BlcmFuZCAwIG9mIGEgcHJlLSBhbmQgcG9zdC1pbmRleGVkIHN0b3JlIGlzIHRoZSBhZGRyZXNzIGJhc2Ugd3JpdGViYWNrLgorICBpZiAoaXNQcmVQb3N0ICYmIGlzU3RvcmUpIHsKKyAgICBhc3NlcnQoT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgICAgIlJlZyBvcGVyYW5kIGV4cGVjdGVkIik7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworICAgICsrT3BJZHg7CisgIH0KKworICAvLyBEaXNhc3NlbWJsZSB0aGUgZHN0L3NyYyBvcGVyYW5kLgorICBpZiAoT3BJZHggPj0gTnVtT3BzKQorICAgIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgICJSZWcgb3BlcmFuZCBleHBlY3RlZCIpOworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJkKGluc24pKSkpOworICArK09wSWR4OworCisgIC8vIEFmdGVyIGRzdCBvZiBhIHByZS0gYW5kIHBvc3QtaW5kZXhlZCBsb2FkIGlzIHRoZSBhZGRyZXNzIGJhc2Ugd3JpdGViYWNrLgorICBpZiAoaXNQcmVQb3N0ICYmICFpc1N0b3JlKSB7CisgICAgYXNzZXJ0KE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAgICJSZWcgb3BlcmFuZCBleHBlY3RlZCIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgLy8gRGlzYXNzZW1ibGUgdGhlIGJhc2Ugb3BlcmFuZC4KKyAgaWYgKE9wSWR4ID49IE51bU9wcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXNzZXJ0KE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAiUmVnIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgYXNzZXJ0KCghaXNQcmVQb3N0IHx8IChUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoT3BJZHgsIFRPSTo6VElFRF9UTykgIT0gLTEpKQorICAgICAgICAgJiYgIkluZGV4IG1vZGUgb3IgdGllZF90byBvcGVyYW5kIGV4cGVjdGVkIik7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gRm9yIHJlZy9yZWcgZm9ybSwgYmFzZSByZWcgaXMgZm9sbG93ZWQgYnkgKy8tIHJlZyBzaG9wIGltbS4KKyAgLy8gRm9yIGltbWVkaWF0ZSBmb3JtLCBpdCBpcyBmb2xsb3dlZCBieSArLy0gaW1tMTIuCisgIC8vIFNlZSBhbHNvIEFSTUFkZHJlc3NpbmdNb2Rlcy5oIChBZGRyZXNzaW5nIE1vZGUgIzIpLgorICBpZiAoT3BJZHggKyAxID49IE51bU9wcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXNzZXJ0KChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCkgJiYKKyAgICAgICAgIChPcEluZm9bT3BJZHgrMV0uUmVnQ2xhc3MgPCAwKSAmJgorICAgICAgICAgIkV4cGVjdCAxIHJlZyBvcGVyYW5kIGZvbGxvd2VkIGJ5IDEgaW1tIG9wZXJhbmQiKTsKKworICBBUk1fQU06OkFkZHJPcGMgQWRkck9wY29kZSA9IGdldFVCaXQoaW5zbikgPyBBUk1fQU06OmFkZCA6IEFSTV9BTTo6c3ViOworICBpZiAoZ2V0SUJpdChpbnNuKSA9PSAwKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKSk7CisKKyAgICAvLyBEaXNhc3NlbWJsZSB0aGUgMTItYml0IGltbWVkaWF0ZSBvZmZzZXQuCisgICAgdW5zaWduZWQgSW1tMTIgPSBzbGljZShpbnNuLCAxMSwgMCk7CisgICAgdW5zaWduZWQgT2Zmc2V0ID0gQVJNX0FNOjpnZXRBTTJPcGMoQWRkck9wY29kZSwgSW1tMTIsIEFSTV9BTTo6bm9fc2hpZnQpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oT2Zmc2V0KSk7CisgIH0gZWxzZSB7CisgICAgLy8gRGlzYXNzZW1ibGUgdGhlIG9mZnNldCByZWcgKFJtKSwgc2hpZnQgdHlwZSwgYW5kIGltbWVkaWF0ZSBzaGlmdCBsZW5ndGguCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJtKGluc24pKSkpOworICAgIC8vIEluc3R7Ni01fSBlbmNvZGVzIHRoZSBzaGlmdCBvcGNvZGUuCisgICAgQVJNX0FNOjpTaGlmdE9wYyBTaE9wID0gZ2V0U2hpZnRPcGNGb3JCaXRzKHNsaWNlKGluc24sIDYsIDUpKTsKKyAgICAvLyBJbnN0ezExLTd9IGVuY29kZXMgdGhlIGltbTUgc2hpZnQgYW1vdW50LgorICAgIHVuc2lnbmVkIFNoSW1tID0gc2xpY2UoaW5zbiwgMTEsIDcpOworCisgICAgLy8gQTguNC4xLiAgUG9zc2libGUgcnJ4IG9yIHNoaWZ0IGFtb3VudCBvZiAzMi4uLgorICAgIGdldEltbVNoaWZ0U0UoU2hPcCwgU2hJbW0pOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oCisgICAgICAgICAgICAgICAgICAgIEFSTV9BTTo6Z2V0QU0yT3BjKEFkZHJPcGNvZGUsIFNoSW1tLCBTaE9wKSkpOworICB9CisgIE9wSWR4ICs9IDI7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTGRGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisgIHJldHVybiBEaXNhc3NlbWJsZUxkU3RGcm0oTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwgZmFsc2UsIEIpOworfQorCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVN0RnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworICByZXR1cm4gRGlzYXNzZW1ibGVMZFN0RnJtKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIHRydWUsIEIpOworfQorCitzdGF0aWMgYm9vbCBIYXNEdWFsUmVnKHVuc2lnbmVkIE9wY29kZSkgeworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBBUk06OkxEUkQ6IGNhc2UgQVJNOjpMRFJEX1BSRTogY2FzZSBBUk06OkxEUkRfUE9TVDoKKyAgY2FzZSBBUk06OlNUUkQ6IGNhc2UgQVJNOjpTVFJEX1BSRTogY2FzZSBBUk06OlNUUkRfUE9TVDoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSAgCit9CisKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTGRTdE1pc2NGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBib29sIGlzU3RvcmUsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IEFSTUluc3RzW09wY29kZV07CisgIGJvb2wgaXNQcmVQb3N0ID0gaXNQcmVQb3N0TGRTdChUSUQuVFNGbGFncyk7CisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBUSUQuT3BJbmZvOworICBpZiAoIU9wSW5mbykgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICBhc3NlcnQoKCghaXNTdG9yZSAmJiBUSUQuZ2V0TnVtRGVmcygpID4gMCkgfHwKKyAgICAgICAgICAoaXNTdG9yZSAmJiAoVElELmdldE51bURlZnMoKSA9PSAwIHx8IGlzUHJlUG9zdCkpKQorICAgICAgICAgJiYgIkludmFsaWQgYXJndW1lbnRzIik7CisKKyAgLy8gT3BlcmFuZCAwIG9mIGEgcHJlLSBhbmQgcG9zdC1pbmRleGVkIHN0b3JlIGlzIHRoZSBhZGRyZXNzIGJhc2Ugd3JpdGViYWNrLgorICBpZiAoaXNQcmVQb3N0ICYmIGlzU3RvcmUpIHsKKyAgICBhc3NlcnQoT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgICAgIlJlZyBvcGVyYW5kIGV4cGVjdGVkIik7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworICAgICsrT3BJZHg7CisgIH0KKworICBib29sIER1YWxSZWcgPSBIYXNEdWFsUmVnKE9wY29kZSk7CisKKyAgLy8gRGlzYXNzZW1ibGUgdGhlIGRzdC9zcmMgb3BlcmFuZC4KKyAgaWYgKE9wSWR4ID49IE51bU9wcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXNzZXJ0KE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAiUmVnIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSZChpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICAvLyBGaWxsIGluIExEUkQgYW5kIFNUUkQncyBzZWNvbmQgb3BlcmFuZC4KKyAgaWYgKER1YWxSZWcpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmQoaW5zbikgKyAxKSkpOworICAgICsrT3BJZHg7CisgIH0KKworICAvLyBBZnRlciBkc3Qgb2YgYSBwcmUtIGFuZCBwb3N0LWluZGV4ZWQgbG9hZCBpcyB0aGUgYWRkcmVzcyBiYXNlIHdyaXRlYmFjay4KKyAgaWYgKGlzUHJlUG9zdCAmJiAhaXNTdG9yZSkgeworICAgIGFzc2VydChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgICAiUmVnIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIC8vIERpc2Fzc2VtYmxlIHRoZSBiYXNlIG9wZXJhbmQuCisgIGlmIChPcElkeCA+PSBOdW1PcHMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGFzc2VydChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgIlJlZyBvcGVyYW5kIGV4cGVjdGVkIik7CisgIGFzc2VydCgoIWlzUHJlUG9zdCB8fCAoVElELmdldE9wZXJhbmRDb25zdHJhaW50KE9wSWR4LCBUT0k6OlRJRURfVE8pICE9IC0xKSkKKyAgICAgICAgICYmICJJbmRleCBtb2RlIG9yIHRpZWRfdG8gb3BlcmFuZCBleHBlY3RlZCIpOworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworICArK09wSWR4OworCisgIC8vIEZvciByZWcvcmVnIGZvcm0sIGJhc2UgcmVnIGlzIGZvbGxvd2VkIGJ5ICsvLSByZWcuCisgIC8vIEZvciBpbW1lZGlhdGUgZm9ybSwgaXQgaXMgZm9sbG93ZWQgYnkgKy8tIGltbTguCisgIC8vIFNlZSBhbHNvIEFSTUFkZHJlc3NpbmdNb2Rlcy5oIChBZGRyZXNzaW5nIE1vZGUgIzMpLgorICBpZiAoT3BJZHggKyAxID49IE51bU9wcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXNzZXJ0KChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCkgJiYKKyAgICAgICAgIChPcEluZm9bT3BJZHgrMV0uUmVnQ2xhc3MgPCAwKSAmJgorICAgICAgICAgIkV4cGVjdCAxIHJlZyBvcGVyYW5kIGZvbGxvd2VkIGJ5IDEgaW1tIG9wZXJhbmQiKTsKKworICBBUk1fQU06OkFkZHJPcGMgQWRkck9wY29kZSA9IGdldFVCaXQoaW5zbikgPyBBUk1fQU06OmFkZCA6IEFSTV9BTTo6c3ViOworICBpZiAoZ2V0QU0zSUJpdChpbnNuKSA9PSAxKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKSk7CisKKyAgICAvLyBEaXNhc3NlbWJsZSB0aGUgOC1iaXQgaW1tZWRpYXRlIG9mZnNldC4KKyAgICB1bnNpZ25lZCBJbW00SCA9IChpbnNuID4+IEFSTUlJOjpJbW1IaVNoaWZ0KSAmIDB4RjsKKyAgICB1bnNpZ25lZCBJbW00TCA9IGluc24gJiAweEY7CisgICAgdW5zaWduZWQgT2Zmc2V0ID0gQVJNX0FNOjpnZXRBTTNPcGMoQWRkck9wY29kZSwgKEltbTRIIDw8IDQpIHwgSW1tNEwpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oT2Zmc2V0KSk7CisgIH0gZWxzZSB7CisgICAgLy8gRGlzYXNzZW1ibGUgdGhlIG9mZnNldCByZWcgKFJtKS4KKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisgICAgdW5zaWduZWQgT2Zmc2V0ID0gQVJNX0FNOjpnZXRBTTNPcGMoQWRkck9wY29kZSwgMCk7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShPZmZzZXQpKTsKKyAgfQorICBPcElkeCArPSAyOworCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZUxkTWlzY0ZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKyAgcmV0dXJuIERpc2Fzc2VtYmxlTGRTdE1pc2NGcm0oTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIpOworfQorCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVN0TWlzY0ZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKyAgcmV0dXJuIERpc2Fzc2VtYmxlTGRTdE1pc2NGcm0oTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwgdHJ1ZSwgQik7Cit9CisKKy8vIFRoZSBhbGdvcml0aG0gZm9yIGRpc2Fzc2VtYmx5IG9mIExkU3RNdWxGcm0gaXMgZGlmZmVyZW50IGZyb20gb3RoZXJzIGJlY2F1c2UKKy8vIGl0IGV4cGxpY2l0bHkgcG9wdWxhdGVzIHRoZSB0d28gcHJlZGljYXRlIG9wZXJhbmRzIGFmdGVyIG9wZXJhbmQgMCAodGhlIGJhc2UpCisvLyBhbmQgb3BlcmFuZCAxICh0aGUgQU00IG1vZGUgaW1tKS4gIEFmdGVyIG9wZXJhbmQgMywgd2UgbmVlZCB0byBwb3B1bGF0ZSB0aGUKKy8vIHJlZ2xpc3Qgd2l0aCBlYWNoIGFmZmVjdGVkIHJlZ2lzdGVyIGVuY29kZWQgYXMgYW4gTUNPcGVyYW5kLgorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVMZFN0TXVsRnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGFzc2VydChOdW1PcHMgPj0gNSAmJiAiTGRTdE11bEZybSBleHBlY3RzIE51bU9wcyA+PSA1Iik7CisKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgT3BJZHggPSAwOworCisgIHVuc2lnbmVkIEJhc2UgPSBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELCBkZWNvZGVSbihpbnNuKSk7CisKKyAgLy8gV3JpdGViYWNrIHRvIGJhc2UsIGlmIG5lY2Vzc2FyeS4KKyAgaWYgKE9wY29kZSA9PSBBUk06OkxETV9VUEQgfHwgT3Bjb2RlID09IEFSTTo6U1RNX1VQRCkgeworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoQmFzZSkpOworICAgICsrT3BJZHg7CisgIH0KKworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKEJhc2UpKTsKKworICBBUk1fQU06OkFNU3ViTW9kZSBTdWJNb2RlID0gZ2V0QU1TdWJNb2RlRm9yQml0cyhnZXRQVUJpdHMoaW5zbikpOworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEFSTV9BTTo6Z2V0QU00TW9kZUltbShTdWJNb2RlKSkpOworCisgIC8vIEhhbmRsaW5nIHRoZSB0d28gcHJlZGljYXRlIG9wZXJhbmRzIGJlZm9yZSB0aGUgcmVnbGlzdC4KKyAgaW50NjRfdCBDb25kVmFsID0gaW5zbiA+PiBBUk1JSTo6Q29uZFNoaWZ0OworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKENvbmRWYWwgPT0gMHhGID8gMHhFIDogQ29uZFZhbCkpOworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKEFSTTo6Q1BTUikpOworCisgIE9wSWR4ICs9IDQ7CisKKyAgLy8gRmlsbCB0aGUgdmFyaWFkaWMgcGFydCBvZiByZWdsaXN0LgorICB1bnNpZ25lZCBSZWdMaXN0Qml0cyA9IGluc24gJiAoKDEgPDwgMTYpIC0gMSk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgaWYgKChSZWdMaXN0Qml0cyA+PiBpKSAmIDEpIHsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpKSk7CisgICAgICArK09wSWR4OworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBMRFJFWCwgTERSRVhCLCBMRFJFWEg6IFJkIFJuCisvLyBMRFJFWEQ6ICAgICAgICAgICAgICAgIFJkIFJkKzEgUm4KKy8vIFNUUkVYLCBTVFJFWEIsIFNUUkVYSDogUmQgUm0gUm4KKy8vIFNUUkVYRDogICAgICAgICAgICAgICAgUmQgUm0gUm0rMSBSbgorLy8KKy8vIFNXUCwgU1dQQjogICAgICAgICAgICAgUmQgUm0gUm4KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTGRTdEV4RnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgaWYgKCFPcEluZm8pIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAyCisgICAgICAgICAmJiBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lECisgICAgICAgICAmJiBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lECisgICAgICAgICAmJiAiRXhwZWN0IDIgcmVnIG9wZXJhbmRzIik7CisKKyAgYm9vbCBpc1N0b3JlID0gc2xpY2UoaW5zbiwgMjAsIDIwKSA9PSAwOworICBib29sIGlzRFcgPSAoT3Bjb2RlID09IEFSTTo6TERSRVhEIHx8IE9wY29kZSA9PSBBUk06OlNUUkVYRCk7CisKKyAgLy8gQWRkIHRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kLgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJkKGluc24pKSkpOworICArK09wSWR4OworCisgIC8vIFN0b3JlIHJlZ2lzdGVyIEV4Y2x1c2l2ZSBuZWVkcyBhIHNvdXJjZSBvcGVyYW5kLgorICBpZiAoaXNTdG9yZSkgeworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbShpbnNuKSkpKTsKKyAgICArK09wSWR4OworCisgICAgaWYgKGlzRFcpIHsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJtKGluc24pKzEpKSk7CisgICAgICArK09wSWR4OworICAgIH0KKyAgfSBlbHNlIGlmIChpc0RXKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJkKGluc24pKzEpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIC8vIEZpbmFsbHkgYWRkIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIE1pc2MuIEFyaXRobWV0aWMgSW5zdHJ1Y3Rpb25zLgorLy8gQ0xaOiBSZCBSbQorLy8gUEtIQlQsIFBLSFRCOiBSZCBSbiBSbSAsIExTTC9BU1IgI2ltbTUKKy8vIFJCSVQsIFJFViwgUkVWMTYsIFJFVlNIOiBSZCBSbQorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVBcml0aE1pc2NGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IEFSTUluc3RzW09wY29kZV0uT3BJbmZvOworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAyCisgICAgICAgICAmJiBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lECisgICAgICAgICAmJiBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lECisgICAgICAgICAmJiAiRXhwZWN0IDIgcmVnIG9wZXJhbmRzIik7CisKKyAgYm9vbCBUaHJlZVJlZyA9IE51bU9wcyA+IDIgJiYgT3BJbmZvWzJdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRDsKKworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJkKGluc24pKSkpOworICArK09wSWR4OworCisgIGlmIChUaHJlZVJlZykgeworICAgIGFzc2VydChOdW1PcHMgPj0gNCAmJiAiRXhwZWN0ID49IDQgb3BlcmFuZHMiKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYW4gb3BlcmFuZCBpbmZvIGxlZnQgd2hpY2ggaXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQsIGFkZAorICAvLyBhbiBhZGRpdGlvbmFsIGltbTUgTFNML0FTUiBvcGVyYW5kLgorICBpZiAoVGhyZWVSZWcgJiYgT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA8IDAKKyAgICAgICYmICFPcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkgJiYgIU9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpKSB7CisgICAgLy8gRXh0cmFjdCB0aGUgNS1iaXQgaW1tZWRpYXRlIGZpZWxkIEluc3R7MTEtN30uCisgICAgdW5zaWduZWQgU2hpZnRBbXQgPSAoaW5zbiA+PiBBUk1JSTo6U2hpZnRTaGlmdCkgJiAweDFGOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oU2hpZnRBbXQpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBEaXNhc3NlbWJsZVNhdEZybSAtIERpc2Fzc2VtYmxlIHNhdHVyYXRlIGluc3RydWN0aW9uczoKKy8vLyBTU0FULCBTU0FUMTYsIFVTQVQsIGFuZCBVU0FUMTYuCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVNhdEZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IEFSTUluc3RzW09wY29kZV07CisgIE51bU9wc0FkZGVkID0gVElELmdldE51bU9wZXJhbmRzKCkgLSAyOyAvLyBpZ25vcmUgcHJlZGljYXRlIG9wZXJhbmRzCisKKyAgLy8gRGlzYXNzZW1ibGUgcmVnaXN0ZXIgZGVmLgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJkKGluc24pKSkpOworCisgIHVuc2lnbmVkIFBvcyA9IHNsaWNlKGluc24sIDIwLCAxNik7CisgIGlmIChPcGNvZGUgPT0gQVJNOjpTU0FUbHNsIHx8CisgICAgICBPcGNvZGUgPT0gQVJNOjpTU0FUYXNyIHx8CisgICAgICBPcGNvZGUgPT0gQVJNOjpTU0FUMTYpCisgICAgUG9zICs9IDE7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oUG9zKSk7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbShpbnNuKSkpKTsKKworICBpZiAoTnVtT3BzQWRkZWQgPT0gNCkgeworICAgIC8vIEluc3R7MTEtN30gZW5jb2RlcyB0aGUgaW1tNSBzaGlmdCBhbW91bnQuCisgICAgdW5zaWduZWQgU2hBbXQgPSBzbGljZShpbnNuLCAxMSwgNyk7CisgICAgLy8gQTguNi4xODMuICBQb3NzaWJsZSBBU1Igc2hpZnQgYW1vdW50IG9mIDMyLi4uCisgICAgaWYgKChPcGNvZGUgPT0gQVJNOjpTU0FUYXNyIHx8IE9wY29kZSA9PSBBUk06OlVTQVRhc3IpICYmIFNoQW10ID09IDApCisgICAgICBTaEFtdCA9IDMyOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oU2hBbXQpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRXh0ZW5kIGluc3RydWN0aW9ucy4KKy8vIFNYVCogYW5kIFVYVCo6IFJkIFtSbl0gUm0gW3JvdF9pbW1dLgorLy8gVGhlIDJuZCBvcGVyYW5kIHJlZ2lzdGVyIGlzIFJuIGFuZCB0aGUgM3JkIG9wZXJhbmQgcmVnc2l0ZXIgaXMgUm0gZm9yIHRoZQorLy8gdGhyZWUgcmVnaXN0ZXIgb3BlcmFuZCBmb3JtLiAgT3RoZXJ3aXNlLCBSbj0wYjExMTEgYW5kIG9ubHkgUm0gaXMgdXNlZC4KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlRXh0RnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgT3BJZHggPSAwOworCisgIGFzc2VydChOdW1PcHMgPj0gMgorICAgICAgICAgJiYgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgT3BJbmZvWzFdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgIkV4cGVjdCAyIHJlZyBvcGVyYW5kcyIpOworCisgIGJvb2wgVGhyZWVSZWcgPSBOdW1PcHMgPiAyICYmIE9wSW5mb1syXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQ7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSZChpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICBpZiAoVGhyZWVSZWcpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYW4gb3BlcmFuZCBpbmZvIGxlZnQgd2hpY2ggaXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQsIGFkZAorICAvLyBhbiBhZGRpdGlvbmFsIHJvdGF0ZSBpbW1lZGlhdGUgb3BlcmFuZC4KKyAgaWYgKE9wSWR4IDwgTnVtT3BzICYmIE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPCAwCisgICAgICAmJiAhT3BJbmZvW09wSWR4XS5pc1ByZWRpY2F0ZSgpICYmICFPcEluZm9bT3BJZHhdLmlzT3B0aW9uYWxEZWYoKSkgeworICAgIC8vIEV4dHJhY3QgdGhlIDItYml0IHJvdGF0ZSBmaWVsZCBJbnN0ezExLTEwfS4KKyAgICB1bnNpZ25lZCByb3QgPSAoaW5zbiA+PiBBUk1JSTo6RXh0Um90SW1tU2hpZnQpICYgMzsKKyAgICAvLyBSb3RhdGlvbiBieSA4LCAxNiwgb3IgMjQgYml0cy4KKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKHJvdCA8PCAzKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICBVdGlsaXR5IEZ1bmN0aW9ucyBGb3IgVkZQICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIEV4dHJhY3QvRGVjb2RlIERkL1NkOgorLy8KKy8vIFNQID0+IGQgPSBVSW50KFZkOkQpCisvLyBEUCA9PiBkID0gVUludChEOlZkKQorc3RhdGljIHVuc2lnbmVkIGRlY29kZVZGUFJkKHVpbnQzMl90IGluc24sIGJvb2wgaXNTUFZGUCkgeworICByZXR1cm4gaXNTUFZGUCA/IChkZWNvZGVSZChpbnNuKSA8PCAxIHwgZ2V0REJpdChpbnNuKSkKKyAgICAgICAgICAgICAgICAgOiAoZGVjb2RlUmQoaW5zbikgfCBnZXREQml0KGluc24pIDw8IDQpOworfQorCisvLyBFeHRyYWN0L0RlY29kZSBEbi9TbjoKKy8vCisvLyBTUCA9PiBuID0gVUludChWbjpOKQorLy8gRFAgPT4gbiA9IFVJbnQoTjpWbikKK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVWRlBSbih1aW50MzJfdCBpbnNuLCBib29sIGlzU1BWRlApIHsKKyAgcmV0dXJuIGlzU1BWRlAgPyAoZGVjb2RlUm4oaW5zbikgPDwgMSB8IGdldE5CaXQoaW5zbikpCisgICAgICAgICAgICAgICAgIDogKGRlY29kZVJuKGluc24pIHwgZ2V0TkJpdChpbnNuKSA8PCA0KTsKK30KKworLy8gRXh0cmFjdC9EZWNvZGUgRG0vU206CisvLworLy8gU1AgPT4gbSA9IFVJbnQoVm06TSkKKy8vIERQID0+IG0gPSBVSW50KE06Vm0pCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlVkZQUm0odWludDMyX3QgaW5zbiwgYm9vbCBpc1NQVkZQKSB7CisgIHJldHVybiBpc1NQVkZQID8gKGRlY29kZVJtKGluc24pIDw8IDEgfCBnZXRNQml0KGluc24pKQorICAgICAgICAgICAgICAgICA6IChkZWNvZGVSbShpbnNuKSB8IGdldE1CaXQoaW5zbikgPDwgNCk7Cit9CisKKy8vIEE3LjUuMQorI2lmIDAKK3N0YXRpYyB1aW50NjRfdCBWRlBFeHBhbmRJbW0odW5zaWduZWQgY2hhciBieXRlLCB1bnNpZ25lZCBOKSB7CisgIGFzc2VydChOID09IDMyIHx8IE4gPT0gNjQpOworCisgIHVpbnQ2NF90IFJlc3VsdDsKKyAgdW5zaWduZWQgYml0NiA9IHNsaWNlKGJ5dGUsIDYsIDYpOworICBpZiAoTiA9PSAzMikgeworICAgIFJlc3VsdCA9IHNsaWNlKGJ5dGUsIDcsIDcpIDw8IDMxIHwgc2xpY2UoYnl0ZSwgNSwgMCkgPDwgMTk7CisgICAgaWYgKGJpdDYpCisgICAgICBSZXN1bHQgfD0gMHgxZiA8PCAyNTsKKyAgICBlbHNlCisgICAgICBSZXN1bHQgfD0gMHgxIDw8IDMwOworICB9IGVsc2UgeworICAgIFJlc3VsdCA9ICh1aW50NjRfdClzbGljZShieXRlLCA3LCA3KSA8PCA2MyB8CisgICAgICAgICAgICAgKHVpbnQ2NF90KXNsaWNlKGJ5dGUsIDUsIDApIDw8IDQ4OworICAgIGlmIChiaXQ2KQorICAgICAgUmVzdWx0IHw9IDB4ZmZMIDw8IDU0OworICAgIGVsc2UKKyAgICAgIFJlc3VsdCB8PSAweDFMIDw8IDYyOworICB9CisgIHJldHVybiBSZXN1bHQ7Cit9CisjZW5kaWYKKworLy8gVkZQIFVuYXJ5IEZvcm1hdCBJbnN0cnVjdGlvbnM6CisvLworLy8gVkNNUFtFXVpELCBWQ01QW0VdWlM6IGNvbXBhcmVzIG9uZSBmbG9hdGluZy1wb2ludCByZWdpc3RlciB3aXRoIHplcm8KKy8vIFZDVlREUywgVkNWVFNEOiBjb252ZXJ0cyBiZXR3ZWVuIGRvdWJsZS1wcmVjaXNpb24gYW5kIHNpbmdsZS1wcmVjaXNpb24KKy8vIFRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbnMgaGF2ZSBob21vZ2VuZW91cyBbVkZQXVJkIGFuZCBbVkZQXVJtIHJlZ2lzdGVycy4KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVkZQVW5hcnlGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAxICYmICJWRlBVbmFyeUZybSBleHBlY3RzIE51bU9wcyA+PSAxIik7CisKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IEFSTUluc3RzW09wY29kZV0uT3BJbmZvOworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgdW5zaWduZWQgUmVnQ2xhc3MgPSBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzOworICBhc3NlcnQoKFJlZ0NsYXNzID09IEFSTTo6U1BSUmVnQ2xhc3NJRCB8fCBSZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQpICYmCisgICAgICAgICAiUmVnIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgYm9vbCBpc1NQID0gKFJlZ0NsYXNzID09IEFSTTo6U1BSUmVnQ2xhc3NJRCk7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygKKyAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyRW51bShCLCBSZWdDbGFzcywgZGVjb2RlVkZQUmQoaW5zbiwgaXNTUCkpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gRWFybHkgcmV0dXJuIGZvciBjb21wYXJlIHdpdGggemVybyBpbnN0cnVjdGlvbnMuCisgIGlmIChPcGNvZGUgPT0gQVJNOjpWQ01QRVpEIHx8IE9wY29kZSA9PSBBUk06OlZDTVBFWlMKKyAgICAgIHx8IE9wY29kZSA9PSBBUk06OlZDTVBaRCB8fCBPcGNvZGUgPT0gQVJNOjpWQ01QWlMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgUmVnQ2xhc3MgPSBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzOworICBhc3NlcnQoKFJlZ0NsYXNzID09IEFSTTo6U1BSUmVnQ2xhc3NJRCB8fCBSZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQpICYmCisgICAgICAgICAiUmVnIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgaXNTUCA9IChSZWdDbGFzcyA9PSBBUk06OlNQUlJlZ0NsYXNzSUQpOworCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoCisgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgUmVnQ2xhc3MsIGRlY29kZVZGUFJtKGluc24sIGlzU1ApKSkpOworICArK09wSWR4OworCisgIHJldHVybiB0cnVlOworfQorCisvLyBBbGwgdGhlIGluc3RydWN0aW9ucyBoYXZlIGhvbW9nZW5lb3VzIFtWRlBdUmQsIFtWRlBdUm4sIGFuZCBbVkZQXVJtIHJlZ3MuCisvLyBTb21lIG9mIHRoZW0gaGF2ZSBvcGVyYW5kIGNvbnN0cmFpbnRzIHdoaWNoIHRpZSB0aGUgZmlyc3Qgb3BlcmFuZCBpbiB0aGUKKy8vIEluT3BlcmFuZExpc3QgdG8gdGhhdCBvZiB0aGUgZHN0LiAgQXMgZmFyIGFzIGFzbSBwcmludGluZyBpcyBjb25jZXJuZWQsIHRoaXMKKy8vIHRpZWRfdG8gb3BlcmFuZCBpcyBzaW1wbHkgc2tpcHBlZC4KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVkZQQmluYXJ5RnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGFzc2VydChOdW1PcHMgPj0gMyAmJiAiVkZQQmluYXJ5RnJtIGV4cGVjdHMgTnVtT3BzID49IDMiKTsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IEFSTUluc3RzW09wY29kZV07CisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBUSUQuT3BJbmZvOworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgdW5zaWduZWQgUmVnQ2xhc3MgPSBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzOworICBhc3NlcnQoKFJlZ0NsYXNzID09IEFSTTo6U1BSUmVnQ2xhc3NJRCB8fCBSZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQpICYmCisgICAgICAgICAiUmVnIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgYm9vbCBpc1NQID0gKFJlZ0NsYXNzID09IEFSTTo6U1BSUmVnQ2xhc3NJRCk7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygKKyAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyRW51bShCLCBSZWdDbGFzcywgZGVjb2RlVkZQUmQoaW5zbiwgaXNTUCkpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gU2tpcCB0aWVkX3RvIG9wZXJhbmQgY29uc3RyYWludC4KKyAgaWYgKFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChPcElkeCwgVE9JOjpUSUVEX1RPKSAhPSAtMSkgeworICAgIGFzc2VydChOdW1PcHMgPj0gNCAmJiAiRXhwZWN0ID49NCBvcGVyYW5kcyIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCkpOworICAgICsrT3BJZHg7CisgIH0KKworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKAorICAgICAgICAgICAgICAgICAgZ2V0UmVnaXN0ZXJFbnVtKEIsIFJlZ0NsYXNzLCBkZWNvZGVWRlBSbihpbnNuLCBpc1NQKSkpKTsKKyAgKytPcElkeDsKKworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKAorICAgICAgICAgICAgICAgICAgZ2V0UmVnaXN0ZXJFbnVtKEIsIFJlZ0NsYXNzLCBkZWNvZGVWRlBSbShpbnNuLCBpc1NQKSkpKTsKKyAgKytPcElkeDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQTguNi4yOTUgdmN2dCAoZmxvYXRpbmctcG9pbnQgPC0+IGludGVnZXIpCisvLyBJbnQgdG8gRlA6IFZTSVRPRCwgVlNJVE9TLCBWVUlUT0QsIFZVSVRPUworLy8gRlAgdG8gSW50OiBWVE9TSVtafFJdRCwgVlRPU0lbWnxSXVMsIFZUT1VJW1p8Ul1ELCBWVE9VSVtafFJdUworLy8gCisvLyBBOC42LjI5NyB2Y3Z0IChmbG9hdGluZy1wb2ludCBhbmQgZml4ZWQtcG9pbnQpCisvLyBEZHxTZCBEZHxTZChUSUVEX1RPKSAjZmJpdHMoPSAxNnwzMiAtIFVJbnQoaW1tNDppKSkKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVkZQQ29udjFGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAyICYmICJWRlBDb252MUZybSBleHBlY3RzIE51bU9wcyA+PSAyIik7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBBUk1JbnN0c1tPcGNvZGVdOworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gVElELk9wSW5mbzsKKyAgaWYgKCFPcEluZm8pIHJldHVybiBmYWxzZTsKKworICBib29sIFNQID0gc2xpY2UoaW5zbiwgOCwgOCkgPT0gMDsgLy8gQTguNi4yOTUgJiBBOC42LjI5NworICBib29sIGZpeGVkX3BvaW50ID0gc2xpY2UoaW5zbiwgMTcsIDE3KSA9PSAxOyAvLyBBOC42LjI5NworICB1bnNpZ25lZCBSZWdDbGFzc0lEID0gU1AgPyBBUk06OlNQUlJlZ0NsYXNzSUQgOiBBUk06OkRQUlJlZ0NsYXNzSUQ7CisKKyAgaWYgKGZpeGVkX3BvaW50KSB7CisgICAgLy8gQTguNi4yOTcKKyAgICBhc3NlcnQoTnVtT3BzID49IDMgJiYgIkV4cGVjdCA+PSAzIG9wZXJhbmRzIik7CisgICAgaW50IHNpemUgPSBzbGljZShpbnNuLCA3LCA3KSA9PSAwID8gMTYgOiAzMjsKKyAgICBpbnQgZmJpdHMgPSBzaXplIC0gKHNsaWNlKGluc24sMywwKSA8PCAxIHwgc2xpY2UoaW5zbiw1LDUpKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKAorICAgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVZGUFJkKGluc24sIFNQKSkpKTsKKworICAgIGFzc2VydChUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoMSwgVE9JOjpUSUVEX1RPKSAhPSAtMSAmJgorICAgICAgICAgICAiVGllZCB0byBvcGVyYW5kIGV4cGVjdGVkIik7CisgICAgTUkuYWRkT3BlcmFuZChNSS5nZXRPcGVyYW5kKDApKTsKKworICAgIGFzc2VydChPcEluZm9bMl0uUmVnQ2xhc3MgPCAwICYmICFPcEluZm9bMl0uaXNQcmVkaWNhdGUoKSAmJgorICAgICAgICAgICAhT3BJbmZvWzJdLmlzT3B0aW9uYWxEZWYoKSAmJiAiSW1tIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKGZiaXRzKSk7CisKKyAgICBOdW1PcHNBZGRlZCA9IDM7CisgIH0gZWxzZSB7CisgICAgLy8gQTguNi4yOTUKKyAgICAvLyBUaGUgUmQgKGRlc3RpbmF0aW9uKSBhbmQgUm0gKHNvdXJjZSkgYml0cyBoYXZlIGRpZmZlcmVudCBpbnRlcnByZXRhdGlvbnMKKyAgICAvLyBkZXBlbmRpbmcgb24gdGhlaXIgc2luZ2xlLXByZWNpc29ubmVzcy4KKyAgICB1bnNpZ25lZCBkLCBtOworICAgIGlmIChzbGljZShpbnNuLCAxOCwgMTgpID09IDEpIHsgLy8gdG9faW50ZWdlciBvcGVyYXRpb24KKyAgICAgIGQgPSBkZWNvZGVWRlBSZChpbnNuLCB0cnVlIC8qIElzIFNpbmdsZSBQcmVjaXNpb24gKi8pOworICAgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygKKyAgICAgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpTUFJSZWdDbGFzc0lELCBkKSkpOworICAgICAgbSA9IGRlY29kZVZGUFJtKGluc24sIFNQKTsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIFJlZ0NsYXNzSUQsIG0pKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGQgPSBkZWNvZGVWRlBSZChpbnNuLCBTUCk7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBSZWdDbGFzc0lELCBkKSkpOworICAgICAgbSA9IGRlY29kZVZGUFJtKGluc24sIHRydWUgLyogSXMgU2luZ2xlIFByZWNpc2lvbiAqLyk7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKAorICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyRW51bShCLCBBUk06OlNQUlJlZ0NsYXNzSUQsIG0pKSk7CisgICAgfQorICAgIE51bU9wc0FkZGVkID0gMjsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBWTU9WUlMgLSBBOC42LjMzMAorLy8gUnQgPT4gUmQ7IFNuID0+IFVJbnQoVm46TikKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVkZQQ29udjJGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAyICYmICJWRlBDb252MkZybSBleHBlY3RzIE51bU9wcyA+PSAyIik7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSZChpbnNuKSkpKTsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpTUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVWRlBSbihpbnNuLCB0cnVlKSkpKTsKKyAgTnVtT3BzQWRkZWQgPSAyOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVk1PVlJSRCAtIEE4LjYuMzMyCisvLyBSdCA9PiBSZDsgUnQyID0+IFJuOyBEbSA9PiBVSW50KE06Vm0pCisvLworLy8gVk1PVlJSUyAtIEE4LjYuMzMxCisvLyBSdCA9PiBSZDsgUnQyID0+IFJuOyBTbSA9PiBVSW50KFZtOk0pOyBTbTEgPSBTbSsxCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVZGUENvbnYzRnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGFzc2VydChOdW1PcHMgPj0gMyAmJiAiVkZQQ29udjNGcm0gZXhwZWN0cyBOdW1PcHMgPj0gMyIpOworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSZChpbnNuKSkpKTsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgT3BJZHggPSAyOworCisgIGlmIChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6U1BSUmVnQ2xhc3NJRCkgeworICAgIHVuc2lnbmVkIFNtID0gZGVjb2RlVkZQUm0oaW5zbiwgdHJ1ZSk7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpTUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtKSkpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6U1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbSsxKSkpOworICAgIE9wSWR4ICs9IDI7CisgIH0gZWxzZSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygKKyAgICAgICAgICAgICAgICAgICAgZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6RFBSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVZGUFJtKGluc24sIGZhbHNlKSkpKTsKKyAgICArK09wSWR4OworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBWTU9WU1IgLSBBOC42LjMzMAorLy8gUnQgPT4gUmQ7IFNuID0+IFVJbnQoVm46TikKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVkZQQ29udjRGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAyICYmICJWRlBDb252NEZybSBleHBlY3RzIE51bU9wcyA+PSAyIik7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpTUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVWRlBSbihpbnNuLCB0cnVlKSkpKTsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSZChpbnNuKSkpKTsKKyAgTnVtT3BzQWRkZWQgPSAyOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVk1PVkRSUiAtIEE4LjYuMzMyCisvLyBSdCA9PiBSZDsgUnQyID0+IFJuOyBEbSA9PiBVSW50KE06Vm0pCisvLworLy8gVk1PVlJSUyAtIEE4LjYuMzMxCisvLyBSdCA9PiBSZDsgUnQyID0+IFJuOyBTbSA9PiBVSW50KFZtOk0pOyBTbTEgPSBTbSsxCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVZGUENvbnY1RnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGFzc2VydChOdW1PcHMgPj0gMyAmJiAiVkZQQ29udjVGcm0gZXhwZWN0cyBOdW1PcHMgPj0gMyIpOworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgT3BJZHggPSAwOworCisgIGlmIChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6U1BSUmVnQ2xhc3NJRCkgeworICAgIHVuc2lnbmVkIFNtID0gZGVjb2RlVkZQUm0oaW5zbiwgdHJ1ZSk7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpTUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtKSkpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6U1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbSsxKSkpOworICAgIE9wSWR4ICs9IDI7CisgIH0gZWxzZSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygKKyAgICAgICAgICAgICAgICAgICAgZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6RFBSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVZGUFJtKGluc24sIGZhbHNlKSkpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSZChpbnNuKSkpKTsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgT3BJZHggKz0gMjsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFZGUCBMb2FkL1N0b3JlIEluc3RydWN0aW9ucy4KKy8vIFZMRFJELCBWTERSUywgVlNUUkQsIFZTVFJTCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVZGUExkU3RGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAzICYmICJWRlBMZFN0RnJtIGV4cGVjdHMgTnVtT3BzID49IDMiKTsKKworICBib29sIGlzU1BWRlAgPSAoT3Bjb2RlID09IEFSTTo6VkxEUlMgfHwgT3Bjb2RlID09IEFSTTo6VlNUUlMpID8gdHJ1ZSA6IGZhbHNlOworICB1bnNpZ25lZCBSZWdDbGFzc0lEID0gaXNTUFZGUCA/IEFSTTo6U1BSUmVnQ2xhc3NJRCA6IEFSTTo6RFBSUmVnQ2xhc3NJRDsKKworICAvLyBFeHRyYWN0IERkL1NkIGZvciBvcGVyYW5kIDAuCisgIHVuc2lnbmVkIFJlZ0QgPSBkZWNvZGVWRlBSZChpbnNuLCBpc1NQVkZQKTsKKworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBSZWdDbGFzc0lELCBSZWdEKSkpOworCisgIHVuc2lnbmVkIEJhc2UgPSBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELCBkZWNvZGVSbihpbnNuKSk7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoQmFzZSkpOworCisgIC8vIE5leHQgY29tZXMgdGhlIEFNNSBPcGNvZGUuCisgIEFSTV9BTTo6QWRkck9wYyBBZGRyT3Bjb2RlID0gZ2V0VUJpdChpbnNuKSA/IEFSTV9BTTo6YWRkIDogQVJNX0FNOjpzdWI7CisgIHVuc2lnbmVkIGNoYXIgSW1tOCA9IGluc24gJiAweEZGOworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEFSTV9BTTo6Z2V0QU01T3BjKEFkZHJPcGNvZGUsIEltbTgpKSk7CisKKyAgTnVtT3BzQWRkZWQgPSAzOworCisgIHJldHVybiB0cnVlOworfQorCisvLyBWRlAgTG9hZC9TdG9yZSBNdWx0aXBsZSBJbnN0cnVjdGlvbnMuCisvLyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGFsZ29yaXRobSBmb3IgTERNL1NUTSBpbiB0aGF0IG9wZXJhbmQgMCAodGhlIGJhc2UpIGFuZAorLy8gb3BlcmFuZCAxICh0aGUgQU01IG1vZGUgaW1tKSBpcyBmb2xsb3dlZCBieSB0d28gcHJlZGljYXRlIG9wZXJhbmRzLiAgSXQgaXMKKy8vIGZvbGxvd2VkIGJ5IGEgcmVnbGlzdCBvZiBlaXRoZXIgRFBSKHMpIG9yIFNQUihzKS4KKy8vCisvLyBWTERNRFtfVVBEXSwgVkxETVNbX1VQRF0sIFZTVE1EW19VUERdLCBWU1RNU1tfVVBEXQorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVWRlBMZFN0TXVsRnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGFzc2VydChOdW1PcHMgPj0gNSAmJiAiVkZQTGRTdE11bEZybSBleHBlY3RzIE51bU9wcyA+PSA1Iik7CisKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgT3BJZHggPSAwOworCisgIHVuc2lnbmVkIEJhc2UgPSBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELCBkZWNvZGVSbihpbnNuKSk7CisKKyAgLy8gV3JpdGViYWNrIHRvIGJhc2UsIGlmIG5lY2Vzc2FyeS4KKyAgaWYgKE9wY29kZSA9PSBBUk06OlZMRE1EX1VQRCB8fCBPcGNvZGUgPT0gQVJNOjpWTERNU19VUEQgfHwKKyAgICAgIE9wY29kZSA9PSBBUk06OlZTVE1EX1VQRCB8fCBPcGNvZGUgPT0gQVJNOjpWU1RNU19VUEQpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKEJhc2UpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhCYXNlKSk7CisKKyAgLy8gTmV4dCBjb21lcyB0aGUgQU01IE9wY29kZS4KKyAgQVJNX0FNOjpBTVN1Yk1vZGUgU3ViTW9kZSA9IGdldEFNU3ViTW9kZUZvckJpdHMoZ2V0UFVCaXRzKGluc24pKTsKKyAgLy8gTXVzdCBiZSBlaXRoZXIgImlhIiBvciAiZGIiIHN1Ym1vZGUuCisgIGlmIChTdWJNb2RlICE9IEFSTV9BTTo6aWEgJiYgU3ViTW9kZSAhPSBBUk1fQU06OmRiKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJJbGxlZ2FsIGFkZHJlc3NpbmcgbW9kZSA1IHN1Yi1tb2RlIVxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdW5zaWduZWQgY2hhciBJbW04ID0gaW5zbiAmIDB4RkY7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oQVJNX0FNOjpnZXRBTTVPcGMoU3ViTW9kZSwgSW1tOCkpKTsKKworICAvLyBIYW5kbGluZyB0aGUgdHdvIHByZWRpY2F0ZSBvcGVyYW5kcyBiZWZvcmUgdGhlIHJlZ2xpc3QuCisgIGludDY0X3QgQ29uZFZhbCA9IGluc24gPj4gQVJNSUk6OkNvbmRTaGlmdDsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShDb25kVmFsID09IDB4RiA/IDB4RSA6IENvbmRWYWwpKTsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhBUk06OkNQU1IpKTsKKworICBPcElkeCArPSA0OworCisgIGJvb2wgaXNTUFZGUCA9IChPcGNvZGUgPT0gQVJNOjpWTERNUyB8fCBPcGNvZGUgPT0gQVJNOjpWTERNU19VUEQgfHwKKyAgICAgT3Bjb2RlID09IEFSTTo6VlNUTVMgfHwgT3Bjb2RlID09IEFSTTo6VlNUTVNfVVBEKSA/IHRydWUgOiBmYWxzZTsKKyAgdW5zaWduZWQgUmVnQ2xhc3NJRCA9IGlzU1BWRlAgPyBBUk06OlNQUlJlZ0NsYXNzSUQgOiBBUk06OkRQUlJlZ0NsYXNzSUQ7CisKKyAgLy8gRXh0cmFjdCBEZC9TZC4KKyAgdW5zaWduZWQgUmVnRCA9IGRlY29kZVZGUFJkKGluc24sIGlzU1BWRlApOworCisgIC8vIEZpbGwgdGhlIHZhcmlhZGljIHBhcnQgb2YgcmVnbGlzdC4KKyAgdW5zaWduZWQgUmVncyA9IGlzU1BWRlAgPyBJbW04IDogSW1tOC8yOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUmVnczsgKytpKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdEICsgaSkpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIE1pc2MuIFZGUCBJbnN0cnVjdGlvbnMuCisvLyBGTVNUQVQgKHZtcnMgd2l0aCBSdD0wYjExMTEsIGkuZS4sIHRvIGFwc3JfbnpjdiBhbmQgbm8gcmVnaXN0ZXIgb3BlcmFuZCkKKy8vIEZDT05TVEQgKERQUiBhbmQgYSBWRlBmNjRJbW0gb3BlcmFuZCkKKy8vIEZDT05TVFMgKFNQUiBhbmQgYSBWRlBmMzJJbW0gb3BlcmFuZCkKKy8vIFZNUlMvVk1TUiAoR1BSIG9wZXJhbmQpCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVZGUE1pc2NGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IEFSTUluc3RzW09wY29kZV0uT3BJbmZvOworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgaWYgKE9wY29kZSA9PSBBUk06OkZNU1RBVCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBhc3NlcnQoTnVtT3BzID49IDIgJiYgIlZGUE1pc2NGcm0gZXhwZWN0cyA+PTIgb3BlcmFuZHMiKTsKKworICB1bnNpZ25lZCBSZWdFbnVtID0gMDsKKyAgc3dpdGNoIChPcEluZm9bMF0uUmVnQ2xhc3MpIHsKKyAgY2FzZSBBUk06OkRQUlJlZ0NsYXNzSUQ6CisgICAgUmVnRW51bSA9IGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkRQUlJlZ0NsYXNzSUQsIGRlY29kZVZGUFJkKGluc24sIGZhbHNlKSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpTUFJSZWdDbGFzc0lEOgorICAgIFJlZ0VudW0gPSBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpTUFJSZWdDbGFzc0lELCBkZWNvZGVWRlBSZChpbnNuLCB0cnVlKSk7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpHUFJSZWdDbGFzc0lEOgorICAgIFJlZ0VudW0gPSBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELCBkZWNvZGVSZChpbnNuKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIkludmFsaWQgcmVnIGNsYXNzIGlkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhSZWdFbnVtKSk7CisgICsrT3BJZHg7CisKKyAgLy8gRXh0cmFjdC9kZWNvZGUgdGhlIGY2NC9mMzIgaW1tZWRpYXRlLgorICBpZiAoT3BJZHggPCBOdW1PcHMgJiYgT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA8IDAKKyAgICAgICAgJiYgIU9wSW5mb1tPcElkeF0uaXNQcmVkaWNhdGUoKSAmJiAhT3BJbmZvW09wSWR4XS5pc09wdGlvbmFsRGVmKCkpIHsKKyAgICAvLyBUaGUgYXNtIHN5bnRheCBzcGVjaWZpZXMgdGhlIGJlZm9yZS1leHBhbmRlZCA8aW1tPi4KKyAgICAvLyBOb3QgVkZQRXhwYW5kSW1tKHNsaWNlKGluc24sMTksMTYpIDw8IDQgfCBzbGljZShpbnNuLCAzLCAwKSwKKyAgICAvLyAgICAgICAgICAgICAgICAgIE9wY29kZSA9PSBBUk06OkZDT05TVEQgPyA2NCA6IDMyKQorICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oc2xpY2UoaW5zbiwxOSwxNik8PDQgfCBzbGljZShpbnNuLDMsMCkpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIERpc2Fzc2VtYmxlVGh1bWJGcm0oKSBpcyBkZWZpbmVkIGluIFRodW1iRGlzYXNzZW1ibGVyQ29yZS5oIGZpbGUuCisjaW5jbHVkZSAiVGh1bWJEaXNhc3NlbWJsZXJDb3JlLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgIFV0aWxpdHkgRnVuY3Rpb25zIEZvciBBUk0gQWR2YW5jZWQgU0lNRCAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBUaGUgZm9sbG93aW5nIE5FT04gbmFtaW5ncyBhcmUgYmFzZWQgb24gQTguNi4yNjYgVkFCQSwgVkFCQUwuICBOb3RpY2UgdGhhdAorLy8gQTguNi4zMDMgVkRVUCAoQVJNIGNvcmUgcmVnaXN0ZXIpJ3MgRC9WZCBwYWlyIGlzIHRoZSBOL1ZuIHBhaXIgb2YgVkFCQS9WQUJBTC4KKworLy8gQTcuMyBSZWdpc3RlciBlbmNvZGluZworCisvLyBFeHRyYWN0L0RlY29kZSBORU9OIEQvVmQ6CisvLworLy8gTm90ZSB0aGF0IGZvciBxdWFkd29yZCwgUWQgPSBVSW50KEQ6VmQ8MzoxPikgPSBJbnN0ezIyOjE1LTEzfSwgd2hlcmVhcyBmb3IKKy8vIGRvdWJsZXdvcmQsIERkID0gVUludChEOlZkKS4gIFdlIGNvbXBlbnNhdGUgZm9yIHRoaXMgZGlmZmVyZW5jZSBieQorLy8gaGFuZGxpbmcgaXQgaW4gdGhlIGdldFJlZ2lzdGVyRW51bSgpIHV0aWxpdHkgZnVuY3Rpb24uCisvLyBEID0gSW5zdHsyMn0sIFZkID0gSW5zdHsxNS0xMn0KK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVORU9OUmQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gKChpbnNuID4+IEFSTUlJOjpORU9OX0RfQml0U2hpZnQpICYgMSkgPDwgNAorICAgIHwgKChpbnNuID4+IEFSTUlJOjpORU9OX1JlZ1JkU2hpZnQpICYgQVJNSUk6Ok5FT05SZWdNYXNrKTsKK30KKworLy8gRXh0cmFjdC9EZWNvZGUgTkVPTiBOL1ZuOgorLy8KKy8vIE5vdGUgdGhhdCBmb3IgcXVhZHdvcmQsIFFuID0gVUludChOOlZuPDM6MT4pID0gSW5zdHs3OjE5LTE3fSwgd2hlcmVhcyBmb3IKKy8vIGRvdWJsZXdvcmQsIERuID0gVUludChOOlZuKS4gIFdlIGNvbXBlbnNhdGUgZm9yIHRoaXMgZGlmZmVyZW5jZSBieQorLy8gaGFuZGxpbmcgaXQgaW4gdGhlIGdldFJlZ2lzdGVyRW51bSgpIHV0aWxpdHkgZnVuY3Rpb24uCisvLyBOID0gSW5zdHs3fSwgVm4gPSBJbnN0ezE5LTE2fQorc3RhdGljIHVuc2lnbmVkIGRlY29kZU5FT05Sbih1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiAoKGluc24gPj4gQVJNSUk6Ok5FT05fTl9CaXRTaGlmdCkgJiAxKSA8PCA0CisgICAgfCAoKGluc24gPj4gQVJNSUk6Ok5FT05fUmVnUm5TaGlmdCkgJiBBUk1JSTo6TkVPTlJlZ01hc2spOworfQorCisvLyBFeHRyYWN0L0RlY29kZSBORU9OIE0vVm06CisvLworLy8gTm90ZSB0aGF0IGZvciBxdWFkd29yZCwgUW0gPSBVSW50KE06Vm08MzoxPikgPSBJbnN0ezU6My0xfSwgd2hlcmVhcyBmb3IKKy8vIGRvdWJsZXdvcmQsIERtID0gVUludChNOlZtKS4gIFdlIGNvbXBlbnNhdGUgZm9yIHRoaXMgZGlmZmVyZW5jZSBieQorLy8gaGFuZGxpbmcgaXQgaW4gdGhlIGdldFJlZ2lzdGVyRW51bSgpIHV0aWxpdHkgZnVuY3Rpb24uCisvLyBNID0gSW5zdHs1fSwgVm0gPSBJbnN0ezMtMH0KK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVORU9OUm0odWludDMyX3QgaW5zbikgeworICByZXR1cm4gKChpbnNuID4+IEFSTUlJOjpORU9OX01fQml0U2hpZnQpICYgMSkgPDwgNAorICAgIHwgKChpbnNuID4+IEFSTUlJOjpORU9OX1JlZ1JtU2hpZnQpICYgQVJNSUk6Ok5FT05SZWdNYXNrKTsKK30KKworbmFtZXNwYWNlIHsKK2VudW0gRWxlbVNpemUgeworICBFU2l6ZU5BID0gMCwKKyAgRVNpemU4ID0gOCwKKyAgRVNpemUxNiA9IDE2LAorICBFU2l6ZTMyID0gMzIsCisgIEVTaXplNjQgPSA2NAorfTsKK30gLy8gRW5kIG9mIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIHNpemUgICAgICAgIGZpZWxkIC0+IEluc3R7MTEtMTB9CisvLyBpbmRleF9hbGlnbiBmaWVsZCAtPiBJbnN0ezctNH0KKy8vCisvLyBUaGUgTGFuZSBJbmRleCBpbnRlcnByZXRhdGlvbiBkZXBlbmRzIG9uIHRoZSBEYXRhIFNpemU6CisvLyAgIDggIChlbmNvZGVkIGFzIHNpemUgPSAwYjAwKSAtPiBJbmRleCA9IGluZGV4X2FsaWduWzM6MV0KKy8vICAgMTYgKGVuY29kZWQgYXMgc2l6ZSA9IDBiMDEpIC0+IEluZGV4ID0gaW5kZXhfYWxpZ25bMzoyXQorLy8gICAzMiAoZW5jb2RlZCBhcyBzaXplID0gMGIxMCkgLT4gSW5kZXggPSBpbmRleF9hbGlnblszXQorLy8KKy8vIFJlZjogQTguNi4zMTcgVkxENCAoc2luZ2xlIDQtZWxlbWVudCBzdHJ1Y3R1cmUgdG8gb25lIGxhbmUpLgorc3RhdGljIHVuc2lnbmVkIGRlY29kZUxhbmVJbmRleCh1aW50MzJfdCBpbnNuKSB7CisgIHVuc2lnbmVkIHNpemUgPSBpbnNuID4+IDEwICYgMzsKKyAgYXNzZXJ0KChzaXplID09IDAgfHwgc2l6ZSA9PSAxIHx8IHNpemUgPT0gMikgJiYKKyAgICAgICAgICJFbmNvZGluZyBlcnJvcjogc2l6ZSBzaG91bGQgYmUgZWl0aGVyIDAsIDEsIG9yIDIiKTsKKworICB1bnNpZ25lZCBpbmRleF9hbGlnbiA9IGluc24gPj4gNCAmIDB4RjsKKyAgcmV0dXJuIChpbmRleF9hbGlnbiA+PiAxKSA+PiBzaXplOworfQorCisvLyBpbW02NCA9IEFkdlNJTURFeHBhbmRJbW0ob3AsIGNtb2RlLCBpOmltbTM6aW1tNCkKKy8vIG9wID0gSW5zdHs1fSwgY21vZGUgPSBJbnN0ezExLTh9CisvLyBpID0gSW5zdHsyNH0gKEFSTSBhcmNoaXRlY3R1cmUpCisvLyBpbW0zID0gSW5zdHsxOC0xNn0sIGltbTQgPSBJbnN0ezMtMH0KKy8vIFJlZjogVGFibGUgQTctMTUgTW9kaWZpZWQgaW1tZWRpYXRlIHZhbHVlcyBmb3IgQWR2YW5jZWQgU0lNRCBpbnN0cnVjdGlvbnMuCitzdGF0aWMgdWludDY0X3QgZGVjb2RlTjFWSW1tKHVpbnQzMl90IGluc24sIEVsZW1TaXplIGVzaXplKSB7CisgIHVuc2lnbmVkIGNoYXIgb3AgPSAoaW5zbiA+PiA1KSAmIDE7CisgIHVuc2lnbmVkIGNoYXIgY21vZGUgPSAoaW5zbiA+PiA4KSAmIDB4RjsKKyAgdW5zaWduZWQgY2hhciBJbW04ID0gKChpbnNuID4+IDI0KSAmIDEpIDw8IDcgfAorICAgICAgICAgICAgICAgICAgICAgICAoKGluc24gPj4gMTYpICYgNykgPDwgNCB8CisgICAgICAgICAgICAgICAgICAgICAgIChpbnNuICYgMHhGKTsKKyAgcmV0dXJuIChvcCA8PCAxMikgfCAoY21vZGUgPDwgOCkgfCBJbW04OworfQorCisvLyBBOC42LjMzOSBWTVVMLCBWTVVMTCAoYnkgc2NhbGFyKQorLy8gRVNpemUxNiA9PiBtID0gSW5zdHsyLTB9IChWbTwyOjA+KSBEMC1ENworLy8gRVNpemUzMiA9PiBtID0gSW5zdHszLTB9IChWbTwzOjA+KSBEMC1EMTUKK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVSZXN0cmljdGVkRG0odWludDMyX3QgaW5zbiwgRWxlbVNpemUgZXNpemUpIHsKKyAgc3dpdGNoIChlc2l6ZSkgeworICBjYXNlIEVTaXplMTY6CisgICAgcmV0dXJuIGluc24gJiA3OworICBjYXNlIEVTaXplMzI6CisgICAgcmV0dXJuIGluc24gJiAweEY7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIlVucmVhY2hhYmxlIGNvZGUhIik7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworLy8gQTguNi4zMzkgVk1VTCwgVk1VTEwgKGJ5IHNjYWxhcikKKy8vIEVTaXplMTYgPT4gaW5kZXggPSBJbnN0ezU6M30gKE06Vm08Mz4pIEQwLUQ3CisvLyBFU2l6ZTMyID0+IGluZGV4ID0gSW5zdHs1fSAgIChNKSAgICAgICBEMC1EMTUKK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVSZXN0cmljdGVkRG1JbmRleCh1aW50MzJfdCBpbnNuLCBFbGVtU2l6ZSBlc2l6ZSkgeworICBzd2l0Y2ggKGVzaXplKSB7CisgIGNhc2UgRVNpemUxNjoKKyAgICByZXR1cm4gKCgoaW5zbiA+PiA1KSAmIDEpIDw8IDEpIHwgKChpbnNuID4+IDMpICYgMSk7CisgIGNhc2UgRVNpemUzMjoKKyAgICByZXR1cm4gKGluc24gPj4gNSkgJiAxOworICBkZWZhdWx0OgorICAgIGFzc2VydCgwICYmICJVbnJlYWNoYWJsZSBjb2RlISIpOworICAgIHJldHVybiAwOworICB9Cit9CisKKy8vIEE4LjYuMjk2IFZDVlQgKGJldHdlZW4gZmxvYXRpbmctcG9pbnQgYW5kIGZpeGVkLXBvaW50LCBBZHZhbmNlZCBTSU1EKQorLy8gKDY0IC0gPGZiaXRzPikgaXMgZW5jb2RlZCBhcyBpbW02LCBpLmUuLCBJbnN0ezIxLTE2fS4KK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVWQ1ZURnJhY3Rpb25CaXRzKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIDY0IC0gKChpbnNuID4+IDE2KSAmIDB4M0YpOworfQorCisvLyBBOC42LjMwMiBWRFVQIChzY2FsYXIpCisvLyBFU2l6ZTggID0+IGluZGV4ID0gSW5zdHsxOS0xN30KKy8vIEVTaXplMTYgPT4gaW5kZXggPSBJbnN0ezE5LTE4fQorLy8gRVNpemUzMiA9PiBpbmRleCA9IEluc3R7MTl9CitzdGF0aWMgdW5zaWduZWQgZGVjb2RlTlZMYW5lRHVwSW5kZXgodWludDMyX3QgaW5zbiwgRWxlbVNpemUgZXNpemUpIHsKKyAgc3dpdGNoIChlc2l6ZSkgeworICBjYXNlIEVTaXplODoKKyAgICByZXR1cm4gKGluc24gPj4gMTcpICYgNzsKKyAgY2FzZSBFU2l6ZTE2OgorICAgIHJldHVybiAoaW5zbiA+PiAxOCkgJiAzOworICBjYXNlIEVTaXplMzI6CisgICAgcmV0dXJuIChpbnNuID4+IDE5KSAmIDE7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIlVuc3BlY2lmaWVkIGVsZW1lbnQgc2l6ZSEiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvLyBBOC42LjMyOCBWTU9WIChBUk0gY29yZSByZWdpc3RlciB0byBzY2FsYXIpCisvLyBBOC42LjMyOSBWTU9WIChzY2FsYXIgdG8gQVJNIGNvcmUgcmVnaXN0ZXIpCisvLyBFU2l6ZTggID0+IGluZGV4ID0gSW5zdHsyMTo2LTV9CisvLyBFU2l6ZTE2ID0+IGluZGV4ID0gSW5zdHsyMTo2fQorLy8gRVNpemUzMiA9PiBpbmRleCA9IEluc3R7MjF9CitzdGF0aWMgdW5zaWduZWQgZGVjb2RlTlZMYW5lT3BJbmRleCh1aW50MzJfdCBpbnNuLCBFbGVtU2l6ZSBlc2l6ZSkgeworICBzd2l0Y2ggKGVzaXplKSB7CisgIGNhc2UgRVNpemU4OgorICAgIHJldHVybiAoKGluc24gPj4gMjEpICYgMSkgPDwgMiB8ICgoaW5zbiA+PiA1KSAmIDMpOworICBjYXNlIEVTaXplMTY6CisgICAgcmV0dXJuICgoaW5zbiA+PiAyMSkgJiAxKSA8PCAxIHwgKChpbnNuID4+IDYpICYgMSk7CisgIGNhc2UgRVNpemUzMjoKKyAgICByZXR1cm4gKChpbnNuID4+IDIxKSAmIDEpOworICBkZWZhdWx0OgorICAgIGFzc2VydCgwICYmICJVbnNwZWNpZmllZCBlbGVtZW50IHNpemUhIik7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworLy8gSW1tNiA9IEluc3R7MjEtMTZ9LCBMID0gSW5zdHs3fQorLy8KKy8vIExlZnRTaGlmdCA9PSB0cnVlIChBOC42LjM2NyBWUVNITCwgQTguNi4zODcgVlNMSSk6CisvLyBjYXNlIEw6aW1tNiBvZgorLy8gICAnMDAwMXh4eCcgPT4gZXNpemUgPSA4OyBzaGlmdF9hbW91bnQgPSBpbW02IC0gOAorLy8gICAnMDAxeHh4eCcgPT4gZXNpemUgPSAxNjsgc2hpZnRfYW1vdW50ID0gaW1tNiAtIDE2CisvLyAgICcwMXh4eHh4JyA9PiBlc2l6ZSA9IDMyOyBzaGlmdF9hbW91bnQgPSBpbW02IC0gMzIKKy8vICAgJzF4eHh4eHgnID0+IGVzaXplID0gNjQ7IHNoaWZ0X2Ftb3VudCA9IGltbTYKKy8vCisvLyBMZWZ0U2hpZnQgPT0gZmFsc2UgKEE4LjYuMzc2IFZSU0hSLCBBOC42LjM2OCBWUVNIUk4pOgorLy8gY2FzZSBMOmltbTYgb2YKKy8vICAgJzAwMDF4eHgnID0+IGVzaXplID0gODsgc2hpZnRfYW1vdW50ID0gMTYgLSBpbW02CisvLyAgICcwMDF4eHh4JyA9PiBlc2l6ZSA9IDE2OyBzaGlmdF9hbW91bnQgPSAzMiAtIGltbTYKKy8vICAgJzAxeHh4eHgnID0+IGVzaXplID0gMzI7IHNoaWZ0X2Ftb3VudCA9IDY0IC0gaW1tNgorLy8gICAnMXh4eHh4eCcgPT4gZXNpemUgPSA2NDsgc2hpZnRfYW1vdW50ID0gNjQgLSBpbW02CisvLworc3RhdGljIHVuc2lnbmVkIGRlY29kZU5WU0FtdCh1aW50MzJfdCBpbnNuLCBib29sIExlZnRTaGlmdCkgeworICBFbGVtU2l6ZSBlc2l6ZSA9IEVTaXplTkE7CisgIHVuc2lnbmVkIEwgPSAoaW5zbiA+PiA3KSAmIDE7CisgIHVuc2lnbmVkIGltbTYgPSAoaW5zbiA+PiAxNikgJiAweDNGOworICBpZiAoTCA9PSAwKSB7CisgICAgaWYgKGltbTYgPj4gMyA9PSAxKQorICAgICAgZXNpemUgPSBFU2l6ZTg7CisgICAgZWxzZSBpZiAoaW1tNiA+PiA0ID09IDEpCisgICAgICBlc2l6ZSA9IEVTaXplMTY7CisgICAgZWxzZSBpZiAoaW1tNiA+PiA1ID09IDEpCisgICAgICBlc2l6ZSA9IEVTaXplMzI7CisgICAgZWxzZQorICAgICAgYXNzZXJ0KDAgJiYgIldyb25nIGVuY29kaW5nIG9mIEluc3R7NzoyMS0xNn0hIik7CisgIH0gZWxzZQorICAgIGVzaXplID0gRVNpemU2NDsKKworICBpZiAoTGVmdFNoaWZ0KQorICAgIHJldHVybiBlc2l6ZSA9PSBFU2l6ZTY0ID8gaW1tNiA6IChpbW02IC0gZXNpemUpOworICBlbHNlCisgICAgcmV0dXJuIGVzaXplID09IEVTaXplNjQgPyAoZXNpemUgLSBpbW02KSA6ICgyKmVzaXplIC0gaW1tNik7Cit9CisKKy8vIEE4LjYuMzA1IFZFWFQKKy8vIEltbTQgPSBJbnN0ezExLTh9CitzdGF0aWMgdW5zaWduZWQgZGVjb2RlTjNWSW1tKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIChpbnNuID4+IDgpICYgMHhGOworfQorCitzdGF0aWMgYm9vbCBVc2VEUmVnUGFpcih1bnNpZ25lZCBPcGNvZGUpIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgQVJNOjpWTEQxcThfVVBEOgorICBjYXNlIEFSTTo6VkxEMXExNl9VUEQ6CisgIGNhc2UgQVJNOjpWTEQxcTMyX1VQRDoKKyAgY2FzZSBBUk06OlZMRDFxNjRfVVBEOgorICBjYXNlIEFSTTo6VlNUMXE4X1VQRDoKKyAgY2FzZSBBUk06OlZTVDFxMTZfVVBEOgorICBjYXNlIEFSTTo6VlNUMXEzMl9VUEQ6CisgIGNhc2UgQVJNOjpWU1QxcTY0X1VQRDoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCisvLyBWTEQqCisvLyAgIERbZF0gRFtkMl0gLi4uIFJuIFtUSUVEX1RPIFJuXSBhbGlnbiBbUm1dCisvLyBWTEQqTE4qCisvLyAgIERbZF0gRFtkMl0gLi4uIFJuIFtUSUVEX1RPIFJuXSBhbGlnbiBbUm1dIFRJRURfVE8gLi4uIGltbShpZHgpCisvLyBWU1QqCisvLyAgIFJuIFtUSUVEX1RPIFJuXSBhbGlnbiBbUm1dIERbZF0gRFtkMl0gLi4uCisvLyBWU1QqTE4qCisvLyAgIFJuIFtUSUVEX1RPIFJuXSBhbGlnbiBbUm1dIERbZF0gRFtkMl0gLi4uIFtpbW0oaWR4KV0KKy8vCisvLyBDb3JyZWN0bHkgc2V0IFZMRCovVlNUKidzIFRJRURfVE8gR1BSLCBhcyB0aGUgYXNtIHByaW50ZXIgbmVlZHMgaXQuCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZU5MZFN0MChNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIGJvb2wgU3RvcmUsIGJvb2wgRGJsU3BhY2VkLAorICAgIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IEFSTUluc3RzW09wY29kZV07CisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBUSUQuT3BJbmZvOworCisgIC8vIEF0IGxlYXN0IG9uZSBEUFIgcmVnaXN0ZXIgcGx1cyBhZGRyZXNzaW5nIG1vZGUgIzYuCisgIGFzc2VydChOdW1PcHMgPj0gMyAmJiAiRXhwZWN0ID49IDMgb3BlcmFuZHMiKTsKKworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgLy8gV2UgaGF2ZSBob21vZ2VuZW91cyBORU9OIHJlZ2lzdGVycyBmb3IgTG9hZC9TdG9yZS4KKyAgdW5zaWduZWQgUmVnQ2xhc3MgPSAwOworICBib29sIERSZWdQYWlyID0gVXNlRFJlZ1BhaXIoT3Bjb2RlKTsKKworICAvLyBEb3VibGUtc3BhY2VkIHJlZ2lzdGVycyBoYXZlIGluY3JlbWVudHMgb2YgMi4KKyAgdW5zaWduZWQgSW5jID0gKERibFNwYWNlZCB8fCBEUmVnUGFpcikgPyAyIDogMTsKKworICB1bnNpZ25lZCBSbiA9IGRlY29kZVJuKGluc24pOworICB1bnNpZ25lZCBSbSA9IGRlY29kZVJtKGluc24pOworICB1bnNpZ25lZCBSZCA9IGRlY29kZU5FT05SZChpbnNuKTsKKworICAvLyBBNy43LjEgQWR2YW5jZWQgU0lNRCBhZGRyZXNzaW5nIG1vZGUuCisgIGJvb2wgV0IgPSBSbSAhPSAxNTsKKworICAvLyBMTFZNIEFkZHJlc3NpbmcgTW9kZSAjNi4KKyAgdW5zaWduZWQgUm1FbnVtID0gMDsKKyAgaWYgKFdCICYmIFJtICE9IDEzKQorICAgIFJtRW51bSA9IGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsIFJtKTsKKworICBpZiAoU3RvcmUpIHsKKyAgICAvLyBDb25zdW1lIHBvc3NpYmxlIFdCLCBBZGRyTW9kZTYsIHBvc3NpYmxlIGluY3JlbWVudCByZWcsIHRoZSBEUFIvUVBSJ3MsCisgICAgLy8gdGhlbiBwb3NzaWJsZSBsYW5lIGluZGV4LgorICAgIGFzc2VydChPcElkeCA8IE51bU9wcyAmJiBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAgICJSZWcgb3BlcmFuZCBleHBlY3RlZCIpOworCisgICAgaWYgKFdCKSB7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSbikpKTsKKyAgICAgICsrT3BJZHg7CisgICAgfQorCisgICAgYXNzZXJ0KChPcElkeCsxKSA8IE51bU9wcyAmJiBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgICBPcEluZm9bT3BJZHggKyAxXS5SZWdDbGFzcyA8IDAgJiYgIkFkZHJtb2RlICM2IE9wZXJhbmRzIGV4cGVjdGVkIik7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJuKSkpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oMCkpOyAvLyBBbGlnbm1lbnQgaWdub3JlZD8KKyAgICBPcElkeCArPSAyOworCisgICAgaWYgKFdCKSB7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKFJtRW51bSkpOworICAgICAgKytPcElkeDsKKyAgICB9CisKKyAgICBhc3NlcnQoT3BJZHggPCBOdW1PcHMgJiYKKyAgICAgICAgICAgKE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpEUFJSZWdDbGFzc0lEIHx8CisgICAgICAgICAgICBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6UVBSUmVnQ2xhc3NJRCkgJiYKKyAgICAgICAgICAgIlJlZyBvcGVyYW5kIGV4cGVjdGVkIik7CisKKyAgICBSZWdDbGFzcyA9IE9wSW5mb1tPcElkeF0uUmVnQ2xhc3M7CisgICAgd2hpbGUgKE9wSWR4IDwgTnVtT3BzICYmICh1bnNpZ25lZClPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IFJlZ0NsYXNzKSB7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKAorICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyRW51bShCLCBSZWdDbGFzcywgUmQsIERSZWdQYWlyKSkpOworICAgICAgUmQgKz0gSW5jOworICAgICAgKytPcElkeDsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgcG9zc2libGUgbGFuZSBpbmRleC4KKyAgICBpZiAoT3BJZHggPCBOdW1PcHMgJiYgT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA8IDAKKyAgICAgICAgJiYgIU9wSW5mb1tPcElkeF0uaXNQcmVkaWNhdGUoKSAmJiAhT3BJbmZvW09wSWR4XS5pc09wdGlvbmFsRGVmKCkpIHsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZGVjb2RlTGFuZUluZGV4KGluc24pKSk7CisgICAgICArK09wSWR4OworICAgIH0KKworICB9IGVsc2UgeworICAgIC8vIENvbnN1bWUgdGhlIERQUi9RUFIncywgcG9zc2libGUgV0IsIEFkZHJNb2RlNiwgcG9zc2libGUgaW5jcm1lbnQgcmVnLAorICAgIC8vIHBvc3NpYmxlIFRJRURfVE8gRFBSL1FQUidzIChpZ25vcmVkKSwgdGhlbiBwb3NzaWJsZSBsYW5lIGluZGV4LgorICAgIFJlZ0NsYXNzID0gT3BJbmZvWzBdLlJlZ0NsYXNzOworCisgICAgd2hpbGUgKE9wSWR4IDwgTnVtT3BzICYmICh1bnNpZ25lZClPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IFJlZ0NsYXNzKSB7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKAorICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyRW51bShCLCBSZWdDbGFzcywgUmQsIERSZWdQYWlyKSkpOworICAgICAgUmQgKz0gSW5jOworICAgICAgKytPcElkeDsKKyAgICB9CisKKyAgICBpZiAoV0IpIHsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJuKSkpOworICAgICAgKytPcElkeDsKKyAgICB9CisKKyAgICBhc3NlcnQoKE9wSWR4KzEpIDwgTnVtT3BzICYmIE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAgIE9wSW5mb1tPcElkeCArIDFdLlJlZ0NsYXNzIDwgMCAmJiAiQWRkcm1vZGUgIzYgT3BlcmFuZHMgZXhwZWN0ZWQiKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm4pKSk7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbSgwKSk7IC8vIEFsaWdubWVudCBpZ25vcmVkPworICAgIE9wSWR4ICs9IDI7CisKKyAgICBpZiAoV0IpIHsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoUm1FbnVtKSk7CisgICAgICArK09wSWR4OworICAgIH0KKworICAgIHdoaWxlIChPcElkeCA8IE51bU9wcyAmJiAodW5zaWduZWQpT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBSZWdDbGFzcykgeworICAgICAgYXNzZXJ0KFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChPcElkeCwgVE9JOjpUSUVEX1RPKSAhPSAtMSAmJgorICAgICAgICAgICAgICJUaWVkIHRvIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCkpOworICAgICAgKytPcElkeDsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgcG9zc2libGUgbGFuZSBpbmRleC4KKyAgICBpZiAoT3BJZHggPCBOdW1PcHMgJiYgT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA8IDAKKyAgICAgICAgJiYgIU9wSW5mb1tPcElkeF0uaXNQcmVkaWNhdGUoKSAmJiAhT3BJbmZvW09wSWR4XS5pc09wdGlvbmFsRGVmKCkpIHsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZGVjb2RlTGFuZUluZGV4KGluc24pKSk7CisgICAgICArK09wSWR4OworICAgIH0KKyAgfQorCisgIC8vIEFjY2Vzc2luZyByZWdpc3RlcnMgcGFzdCB0aGUgZW5kIG9mIHRoZSBORU9OIHJlZ2lzdGVyIGZpbGUgaXMgbm90CisgIC8vIGRlZmluZWQuCisgIGlmIChSZCA+IDMyKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQTcuNworLy8gSWYgTCAoSW5zdHsyMX0pID09IDAsIHN0b3JlIGluc3RydWN0aW9ucy4KKy8vIEZpbmQgb3V0IGFib3V0IGRvdWJsZS1zcGFjZWQtbmVzcyBvZiB0aGUgT3Bjb2RlIGFuZCBwYXNzIGl0IG9uIHRvCisvLyBEaXNhc3NlbWJsZU5MZFN0MCgpLgorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVOTGRTdChNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBjb25zdCBTdHJpbmdSZWYgTmFtZSA9IEFSTUluc3RzW09wY29kZV0uTmFtZTsKKyAgYm9vbCBEYmxTcGFjZWQgPSBmYWxzZTsKKworICBpZiAoTmFtZS5maW5kKCJMTiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgLy8gVG8gb25lIGxhbmUgaW5zdHJ1Y3Rpb25zLgorICAgIC8vIFNlZSwgZm9yIGV4YW1wbGUsIDguNi4zMTcgVkxENCAoc2luZ2xlIDQtZWxlbWVudCBzdHJ1Y3R1cmUgdG8gb25lIGxhbmUpLgorCisgICAgLy8gPHNpemU+ID09IDE2ICYmIEluc3R7NX0gPT0gMSAtLT4gRGJsU3BhY2VkID0gdHJ1ZQorICAgIGlmIChOYW1lLmVuZHN3aXRoKCIxNiIpIHx8IE5hbWUuZW5kc3dpdGgoIjE2X1VQRCIpKQorICAgICAgRGJsU3BhY2VkID0gc2xpY2UoaW5zbiwgNSwgNSkgPT0gMTsKKworICAgIC8vIDxzaXplPiA9PSAzMiAmJiBJbnN0ezZ9ID09IDEgLS0+IERibFNwYWNlZCA9IHRydWUKKyAgICBpZiAoTmFtZS5lbmRzd2l0aCgiMzIiKSB8fCBOYW1lLmVuZHN3aXRoKCIzMl9VUEQiKSkKKyAgICAgIERibFNwYWNlZCA9IHNsaWNlKGluc24sIDYsIDYpID09IDE7CisKKyAgfSBlbHNlIHsKKyAgICAvLyBNdWx0aXBsZSBuLWVsZW1lbnQgc3RydWN0dXJlcyB3aXRoIHR5cGUgZW5jb2RlZCBhcyBJbnN0ezExLTh9LgorICAgIC8vIFNlZSwgZm9yIGV4YW1wbGUsIEE4LjYuMzE2IFZMRDQgKG11bHRpcGxlIDQtZWxlbWVudCBzdHJ1Y3R1cmVzKS4KKworICAgIC8vIG4gPT0gMiAmJiB0eXBlID09IDBiMTAwMSAtPiBEYmxTcGFjZWQgPSB0cnVlCisgICAgaWYgKE5hbWUuc3RhcnRzd2l0aCgiVlNUMiIpIHx8IE5hbWUuc3RhcnRzd2l0aCgiVkxEMiIpKQorICAgICAgRGJsU3BhY2VkID0gc2xpY2UoaW5zbiwgMTEsIDgpID09IDk7CisgICAgCisgICAgLy8gbiA9PSAzICYmIHR5cGUgPT0gMGIwMTAxIC0+IERibFNwYWNlZCA9IHRydWUKKyAgICBpZiAoTmFtZS5zdGFydHN3aXRoKCJWU1QzIikgfHwgTmFtZS5zdGFydHN3aXRoKCJWTEQzIikpCisgICAgICBEYmxTcGFjZWQgPSBzbGljZShpbnNuLCAxMSwgOCkgPT0gNTsKKyAgICAKKyAgICAvLyBuID09IDQgJiYgdHlwZSA9PSAwYjAwMDEgLT4gRGJsU3BhY2VkID0gdHJ1ZQorICAgIGlmIChOYW1lLnN0YXJ0c3dpdGgoIlZTVDQiKSB8fCBOYW1lLnN0YXJ0c3dpdGgoIlZMRDQiKSkKKyAgICAgIERibFNwYWNlZCA9IHNsaWNlKGluc24sIDExLCA4KSA9PSAxOworICAgIAorICB9CisgIHJldHVybiBEaXNhc3NlbWJsZU5MZFN0MChNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UoaW5zbiwgMjEsIDIxKSA9PSAwLCBEYmxTcGFjZWQsIEIpOworfQorCisvLyBWTU9WIChpbW1lZGlhdGUpCisvLyAgIFFkL0RkIGltbQorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVOMVJlZ01vZEltbUZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsCisgICAgdWludDMyX3QgaW5zbiwgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IEFSTUluc3RzW09wY29kZV07CisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBUSUQuT3BJbmZvOworCisgIGFzc2VydChOdW1PcHMgPj0gMiAmJgorICAgICAgICAgKE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQgfHwKKyAgICAgICAgICBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpRUFJSZWdDbGFzc0lEKSAmJgorICAgICAgICAgKE9wSW5mb1sxXS5SZWdDbGFzcyA8IDApICYmCisgICAgICAgICAiRXhwZWN0IDEgcmVnIG9wZXJhbmQgZm9sbG93ZWQgYnkgMSBpbW0gb3BlcmFuZCIpOworCisgIC8vIFFkL0RkID0gSW5zdHsyMjoxNS0xMn0gPT4gTkVPTiBSZAorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBPcEluZm9bMF0uUmVnQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZU5FT05SZChpbnNuKSkpKTsKKworICBFbGVtU2l6ZSBlc2l6ZSA9IEVTaXplTkE7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGNhc2UgQVJNOjpWTU9WdjhpODoKKyAgY2FzZSBBUk06OlZNT1Z2MTZpODoKKyAgICBlc2l6ZSA9IEVTaXplODsKKyAgICBicmVhazsKKyAgY2FzZSBBUk06OlZNT1Z2NGkxNjoKKyAgY2FzZSBBUk06OlZNT1Z2OGkxNjoKKyAgY2FzZSBBUk06OlZNVk52NGkxNjoKKyAgY2FzZSBBUk06OlZNVk52OGkxNjoKKyAgICBlc2l6ZSA9IEVTaXplMTY7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpWTU9WdjJpMzI6CisgIGNhc2UgQVJNOjpWTU9WdjRpMzI6CisgIGNhc2UgQVJNOjpWTVZOdjJpMzI6CisgIGNhc2UgQVJNOjpWTVZOdjRpMzI6CisgICAgZXNpemUgPSBFU2l6ZTMyOworICAgIGJyZWFrOworICBjYXNlIEFSTTo6Vk1PVnYxaTY0OgorICBjYXNlIEFSTTo6Vk1PVnYyaTY0OgorICAgIGVzaXplID0gRVNpemU2NDsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoMCAmJiAiVW5yZWFjaGFibGUgY29kZSEiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBPbmUgcmVnaXN0ZXIgYW5kIGEgbW9kaWZpZWQgaW1tZWRpYXRlIHZhbHVlLgorICAvLyBBZGQgdGhlIGltbSBvcGVyYW5kLgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKGRlY29kZU4xVkltbShpbnNuLCBlc2l6ZSkpKTsKKworICBOdW1PcHNBZGRlZCA9IDI7CisgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgeworZW51bSBOMlZGbGFnIHsKKyAgTjJWX05vbmUsCisgIE4yVl9WZWN0b3JEdXBMYW5lLAorICBOMlZfVmVjdG9yQ29udmVydF9CZXR3ZWVuX0Zsb2F0X0ZpeGVkCit9OworfSAvLyBFbmQgb2YgdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gVmVjdG9yIENvbnZlcnQgW2JldHdlZW4gZmxvYXRpbmctcG9pbnQgYW5kIGZpeGVkLXBvaW50XQorLy8gICBRZC9EZCBRbS9EbSBbZmJpdHNdCisvLworLy8gVmVjdG9yIER1cGxpY2F0ZSBMYW5lIChmcm9tIHNjYWxhciB0byBhbGwgZWxlbWVudHMpIEluc3RydWN0aW9ucy4KKy8vIFZEVVBMTjE2ZCwgVkRVUExOMTZxLCBWRFVQTE4zMmQsIFZEVVBMTjMycSwgVkRVUExOOGQsIFZEVVBMTjhxOgorLy8gICBRZC9EZCBEbSBpbmRleAorLy8KKy8vIFZlY3RvciBNb3ZlIExvbmc6CisvLyAgIFFkIERtCisvLyAKKy8vIFZlY3RvciBNb3ZlIE5hcnJvdzoKKy8vICAgRGQgUW0KKy8vCisvLyBPdGhlcnMKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTlZkVm1PcHRJbW0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3BjLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBOMlZGbGFnIEZsYWcsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IEFSTUluc3RzW09wY107CisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBUSUQuT3BJbmZvOworCisgIGFzc2VydChOdW1PcHMgPj0gMiAmJgorICAgICAgICAgKE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQgfHwKKyAgICAgICAgICBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpRUFJSZWdDbGFzc0lEKSAmJgorICAgICAgICAgKE9wSW5mb1sxXS5SZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQgfHwKKyAgICAgICAgICBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpRUFJSZWdDbGFzc0lEKSAmJgorICAgICAgICAgIkV4cGVjdCA+PSAyIG9wZXJhbmRzIGFuZCBmaXJzdCAyIGFzIHJlZyBvcGVyYW5kcyIpOworCisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICBFbGVtU2l6ZSBlc2l6ZSA9IEVTaXplTkE7CisgIGlmIChGbGFnID09IE4yVl9WZWN0b3JEdXBMYW5lKSB7CisgICAgLy8gVkRVUExOIGhhcyBpdHMgaW5kZXggZW1iZWRkZWQuICBJdHMgc2l6ZSBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgT3Bjb2RlLgorICAgIGFzc2VydChPcGMgPj0gQVJNOjpWRFVQTE4xNmQgJiYgT3BjIDw9IEFSTTo6VkRVUExOOHEgJiYKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQgT3Bjb2RlIik7CisgICAgZXNpemUgPSAoT3BjID09IEFSTTo6VkRVUExOOGQgfHwgT3BjID09IEFSTTo6VkRVUExOOHEpID8gRVNpemU4CisgICAgICAgOiAoKE9wYyA9PSBBUk06OlZEVVBMTjE2ZCB8fCBPcGMgPT0gQVJNOjpWRFVQTE4xNnEpID8gRVNpemUxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVTaXplMzIpOworICB9CisKKyAgLy8gUWQvRGQgPSBJbnN0ezIyOjE1LTEyfSA9PiBORU9OIFJkCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZU5FT05SZChpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICAvLyBWUEFEQUwuLi4KKyAgaWYgKFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChPcElkeCwgVE9JOjpUSUVEX1RPKSAhPSAtMSkgeworICAgIC8vIFRJRURfVE8gb3BlcmFuZC4KKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKDApKTsKKyAgICArK09wSWR4OworICB9CisKKyAgLy8gRG0gPSBJbnN0ezU6My0wfSA9PiBORU9OIFJtCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZU5FT05SbShpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICAvLyBWWklQIGFuZCBvdGhlcnMgaGF2ZSB0d28gVElFRF9UTyByZWcgb3BlcmFuZHMuCisgIGludCBJZHg7CisgIHdoaWxlIChPcElkeCA8IE51bU9wcyAmJgorICAgICAgICAgKElkeCA9IFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChPcElkeCwgVE9JOjpUSUVEX1RPKSkgIT0gLTEpIHsKKyAgICAvLyBBZGQgVElFRF9UTyBvcGVyYW5kLgorICAgIE1JLmFkZE9wZXJhbmQoTUkuZ2V0T3BlcmFuZChJZHgpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgLy8gQWRkIHRoZSBpbW0gb3BlcmFuZCwgaWYgcmVxdWlyZWQuCisgIGlmIChPcElkeCA8IE51bU9wcyAmJiBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzIDwgMAorICAgICAgJiYgIU9wSW5mb1tPcElkeF0uaXNQcmVkaWNhdGUoKSAmJiAhT3BJbmZvW09wSWR4XS5pc09wdGlvbmFsRGVmKCkpIHsKKworICAgIHVuc2lnbmVkIGltbSA9IDB4RkZGRkZGRkY7CisKKyAgICBpZiAoRmxhZyA9PSBOMlZfVmVjdG9yRHVwTGFuZSkKKyAgICAgIGltbSA9IGRlY29kZU5WTGFuZUR1cEluZGV4KGluc24sIGVzaXplKTsKKyAgICBpZiAoRmxhZyA9PSBOMlZfVmVjdG9yQ29udmVydF9CZXR3ZWVuX0Zsb2F0X0ZpeGVkKQorICAgICAgaW1tID0gZGVjb2RlVkNWVEZyYWN0aW9uQml0cyhpbnNuKTsKKworICAgIGFzc2VydChpbW0gIT0gMHhGRkZGRkZGRiAmJiAiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKGltbSkpOworICAgICsrT3BJZHg7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVOMlJlZ0ZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGMsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICByZXR1cm4gRGlzYXNzZW1ibGVOVmRWbU9wdEltbShNSSwgT3BjLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMlZfTm9uZSwgQik7Cit9CitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZU5WQ1ZURnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wYywgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIHJldHVybiBEaXNhc3NlbWJsZU5WZFZtT3B0SW1tKE1JLCBPcGMsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4yVl9WZWN0b3JDb252ZXJ0X0JldHdlZW5fRmxvYXRfRml4ZWQsIEIpOworfQorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVOVmVjRHVwTG5Gcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3BjLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgcmV0dXJuIERpc2Fzc2VtYmxlTlZkVm1PcHRJbW0oTUksIE9wYywgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjJWX1ZlY3RvckR1cExhbmUsIEIpOworfQorCisvLyBWZWN0b3IgU2hpZnQgW0FjY3VtdWxhdGVdIEluc3RydWN0aW9ucy4KKy8vIFFkL0RkIFtRZC9EZCAoVElFRF9UTyldIFFtL0RtIFNoaWZ0QW10CisvLworLy8gVmVjdG9yIFNoaWZ0IExlZnQgTG9uZyAod2l0aCBtYXhpbXVtIHNoaWZ0IGNvdW50KSBJbnN0cnVjdGlvbnMuCisvLyBWU0hMTGkxNiwgVlNITExpMzIsIFZTSExMaTg6IFFkIERtIGltbSAoPT0gc2l6ZSkKKy8vCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZU5WZWN0b3JTaGlmdChNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIGJvb2wgTGVmdFNoaWZ0LCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBBUk1JbnN0c1tPcGNvZGVdOworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gVElELk9wSW5mbzsKKworICBhc3NlcnQoTnVtT3BzID49IDMgJiYKKyAgICAgICAgIChPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpEUFJSZWdDbGFzc0lEIHx8CisgICAgICAgICAgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6UVBSUmVnQ2xhc3NJRCkgJiYKKyAgICAgICAgIChPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpEUFJSZWdDbGFzc0lEIHx8CisgICAgICAgICAgT3BJbmZvWzFdLlJlZ0NsYXNzID09IEFSTTo6UVBSUmVnQ2xhc3NJRCkgJiYKKyAgICAgICAgICJFeHBlY3QgPj0gMyBvcGVyYW5kcyBhbmQgZmlyc3QgMiBhcyByZWcgb3BlcmFuZHMiKTsKKworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgLy8gUWQvRGQgPSBJbnN0ezIyOjE1LTEyfSA9PiBORU9OIFJkCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZU5FT05SZChpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICBpZiAoVElELmdldE9wZXJhbmRDb25zdHJhaW50KE9wSWR4LCBUT0k6OlRJRURfVE8pICE9IC0xKSB7CisgICAgLy8gVElFRF9UTyBvcGVyYW5kLgorICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCkpOworICAgICsrT3BJZHg7CisgIH0KKworICBhc3NlcnQoKE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpEUFJSZWdDbGFzc0lEIHx8CisgICAgICAgICAgT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBBUk06OlFQUlJlZ0NsYXNzSUQpICYmCisgICAgICAgICAiUmVnIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKworICAvLyBRbS9EbSA9IEluc3R7NTozLTB9ID0+IE5FT04gUm0KKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgT3BJbmZvW09wSWR4XS5SZWdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlTkVPTlJtKGluc24pKSkpOworICArK09wSWR4OworCisgIGFzc2VydChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzIDwgMCAmJiAiSW1tIG9wZXJhbmQgZXhwZWN0ZWQiKTsKKworICAvLyBBZGQgdGhlIGltbSBvcGVyYW5kLgorICAKKyAgLy8gVlNITEwgaGFzIG1heGltdW0gc2hpZnQgY291bnQgYXMgdGhlIGltbSwgaW5mZXJyZWQgZnJvbSBpdHMgc2l6ZS4KKyAgdW5zaWduZWQgSW1tOworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OgorICAgIEltbSA9IGRlY29kZU5WU0FtdChpbnNuLCBMZWZ0U2hpZnQpOworICAgIGJyZWFrOworICBjYXNlIEFSTTo6VlNITExpODoKKyAgICBJbW0gPSA4OworICAgIGJyZWFrOworICBjYXNlIEFSTTo6VlNITExpMTY6CisgICAgSW1tID0gMTY7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjpWU0hMTGkzMjoKKyAgICBJbW0gPSAzMjsKKyAgICBicmVhazsKKyAgfQorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEltbSkpOworICArK09wSWR4OworCisgIHJldHVybiB0cnVlOworfQorCisvLyBMZWZ0IHNoaWZ0IGluc3RydWN0aW9ucy4KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTjJSZWdWZWNTaExGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLAorICAgIHVpbnQzMl90IGluc24sIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgcmV0dXJuIERpc2Fzc2VtYmxlTlZlY3RvclNoaWZ0KE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCKTsKK30KKy8vIFJpZ2h0IHNoaWZ0IGluc3RydWN0aW9ucyBoYXZlIGRpZmZlcmVudCBzaGlmdCBhbW91bnQgaW50ZXJwcmV0YXRpb24uCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZU4yUmVnVmVjU2hSRnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwKKyAgICB1aW50MzJfdCBpbnNuLCB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIHJldHVybiBEaXNhc3NlbWJsZU5WZWN0b3JTaGlmdChNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIpOworfQorCituYW1lc3BhY2UgeworZW51bSBOM1ZGbGFnIHsKKyAgTjNWX05vbmUsCisgIE4zVl9WZWN0b3JFeHRyYWN0LAorICBOM1ZfVmVjdG9yU2hpZnQsCisgIE4zVl9NdWx0aXBseV9CeV9TY2FsYXIKK307Cit9IC8vIEVuZCBvZiB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBORU9OIFRocmVlIFJlZ2lzdGVyIEluc3RydWN0aW9ucyB3aXRoIE9wdGlvbmFsIEltbWVkaWF0ZSBPcGVyYW5kCisvLworLy8gVmVjdG9yIEV4dHJhY3QgSW5zdHJ1Y3Rpb25zLgorLy8gUWQvRGQgUW4vRG4gUW0vRG0gaW1tNAorLy8KKy8vIFZlY3RvciBTaGlmdCAoUmVnaXN0ZXIpIEluc3RydWN0aW9ucy4KKy8vIFFkL0RkIFFtL0RtIFFuL0RuIChub3RpY2UgdGhlIG9yZGVyIG9mIG0sIG4pCisvLworLy8gVmVjdG9yIE11bHRpcGx5IFtBY2N1bXVsYXRlL1N1YnRyYWN0XSBbTG9uZ10gQnkgU2NhbGFyIEluc3RydWN0aW9ucy4KKy8vIFFkL0RkIFFuL0RuIFJlc3RyaWN0ZWREbSBpbmRleAorLy8KKy8vIE90aGVycworc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVOVmRWblZtT3B0SW1tKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgTjNWRmxhZyBGbGFnLCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBBUk1JbnN0c1tPcGNvZGVdOworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gVElELk9wSW5mbzsKKworICAvLyBObyBjaGVja2luZyBmb3IgT3BJbmZvWzJdIGJlY2F1c2Ugb2YgTU9WRG5lb24vTU9WUSB3aXRoIG9ubHkgdHdvIHJlZ3MuCisgIGFzc2VydChOdW1PcHMgPj0gMyAmJgorICAgICAgICAgKE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQgfHwKKyAgICAgICAgICBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpRUFJSZWdDbGFzc0lEKSAmJgorICAgICAgICAgKE9wSW5mb1sxXS5SZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQgfHwKKyAgICAgICAgICBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpRUFJSZWdDbGFzc0lEKSAmJgorICAgICAgICAgIkV4cGVjdCA+PSAzIG9wZXJhbmRzIGFuZCBmaXJzdCAyIGFzIHJlZyBvcGVyYW5kcyIpOworCisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICBib29sIFZkVm5WbSA9IEZsYWcgPT0gTjNWX1ZlY3RvclNoaWZ0ID8gZmFsc2UgOiB0cnVlOworICBib29sIElzSW1tNCA9IEZsYWcgPT0gTjNWX1ZlY3RvckV4dHJhY3QgPyB0cnVlIDogZmFsc2U7CisgIGJvb2wgSXNEbVJlc3RyaWN0ZWQgPSBGbGFnID09IE4zVl9NdWx0aXBseV9CeV9TY2FsYXIgPyB0cnVlIDogZmFsc2U7CisgIEVsZW1TaXplIGVzaXplID0gRVNpemVOQTsKKyAgaWYgKEZsYWcgPT0gTjNWX011bHRpcGx5X0J5X1NjYWxhcikgeworICAgIHVuc2lnbmVkIHNpemUgPSAoaW5zbiA+PiAyMCkgJiAzOworICAgIGlmIChzaXplID09IDEpIGVzaXplID0gRVNpemUxNjsKKyAgICBpZiAoc2l6ZSA9PSAyKSBlc2l6ZSA9IEVTaXplMzI7CisgICAgYXNzZXJ0IChlc2l6ZSA9PSBFU2l6ZTE2IHx8IGVzaXplID09IEVTaXplMzIpOworICB9CisKKyAgLy8gUWQvRGQgPSBJbnN0ezIyOjE1LTEyfSA9PiBORU9OIFJkCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZU5FT05SZChpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICAvLyBWQUJBLCBWQUJBTCwgVkJTTGQsIFZCU0xxLCAuLi4KKyAgaWYgKFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChPcElkeCwgVE9JOjpUSUVEX1RPKSAhPSAtMSkgeworICAgIC8vIFRJRURfVE8gb3BlcmFuZC4KKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKDApKTsKKyAgICArK09wSWR4OworICB9CisKKyAgLy8gRG4gPSBJbnN0ezc6MTktMTZ9ID0+IE5FT04gUm4KKyAgLy8gb3IKKyAgLy8gRG0gPSBJbnN0ezU6My0wfSA9PiBORU9OIFJtCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoCisgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgT3BJbmZvW09wSWR4XS5SZWdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZFZuVm0gPyBkZWNvZGVORU9OUm4oaW5zbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWNvZGVORU9OUm0oaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciBWTU9WRG5lb24gYW5kIFZNT1ZRIGJlY2F1c2UgdGhleSBhcmUgbWFya2VkIGFzCisgIC8vIE4zUmVnRnJtLgorICBpZiAoT3Bjb2RlID09IEFSTTo6Vk1PVkRuZW9uIHx8IE9wY29kZSA9PSBBUk06OlZNT1ZRKQorICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gRG0gPSBJbnN0ezU6My0wfSA9PiBORU9OIFJtCisgIC8vIG9yCisgIC8vIERtIGlzIHJlc3RyaWN0ZWQgdG8gRDAtRDcgaWYgc2l6ZSBpcyAxNiwgRDAtRDE1IG90aGVyd2lzZQorICAvLyBvcgorICAvLyBEbiA9IEluc3R7NzoxOS0xNn0gPT4gTkVPTiBSbgorICB1bnNpZ25lZCBtID0gVmRWblZtID8gKElzRG1SZXN0cmljdGVkID8gZGVjb2RlUmVzdHJpY3RlZERtKGluc24sIGVzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVjb2RlTkVPTlJtKGluc24pKQorICAgICAgICAgICAgICAgICAgICAgIDogZGVjb2RlTkVPTlJuKGluc24pOworCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoCisgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgT3BJbmZvW09wSWR4XS5SZWdDbGFzcywgbSkpKTsKKyAgKytPcElkeDsKKworICBpZiAoT3BJZHggPCBOdW1PcHMgJiYgT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA8IDAKKyAgICAgICYmICFPcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkgJiYgIU9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpKSB7CisgICAgLy8gQWRkIHRoZSBpbW0gb3BlcmFuZC4KKyAgICB1bnNpZ25lZCBJbW0gPSAwOworICAgIGlmIChJc0ltbTQpCisgICAgICBJbW0gPSBkZWNvZGVOM1ZJbW0oaW5zbik7CisgICAgZWxzZSBpZiAoSXNEbVJlc3RyaWN0ZWQpCisgICAgICBJbW0gPSBkZWNvZGVSZXN0cmljdGVkRG1JbmRleChpbnNuLCBlc2l6ZSk7CisgICAgZWxzZSB7CisgICAgICBhc3NlcnQoMCAmJiAiSW50ZXJuYWwgZXJyb3I6IHVucmVhY2hhYmxlIGNvZGUhIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShJbW0pKTsKKyAgICArK09wSWR4OworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTjNSZWdGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgcmV0dXJuIERpc2Fzc2VtYmxlTlZkVm5WbU9wdEltbShNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zVl9Ob25lLCBCKTsKK30KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTjNSZWdWZWNTaEZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsCisgICAgdWludDMyX3QgaW5zbiwgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICByZXR1cm4gRGlzYXNzZW1ibGVOVmRWblZtT3B0SW1tKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjNWX1ZlY3RvclNoaWZ0LCBCKTsKK30KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTlZlY0V4dHJhY3RGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgcmV0dXJuIERpc2Fzc2VtYmxlTlZkVm5WbU9wdEltbShNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zVl9WZWN0b3JFeHRyYWN0LCBCKTsKK30KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTlZlY011bFNjYWxhckZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsCisgICAgdWludDMyX3QgaW5zbiwgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICByZXR1cm4gRGlzYXNzZW1ibGVOVmRWblZtT3B0SW1tKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjNWX011bHRpcGx5X0J5X1NjYWxhciwgQik7Cit9CisKKy8vIFZlY3RvciBUYWJsZSBMb29rdXAKKy8vCisvLyBWVEJMMSwgVlRCWDE6IERkIFtEZChUSUVEX1RPKV0gRG4gRG0KKy8vIFZUQkwyLCBWVEJYMjogRGQgW0RkKFRJRURfVE8pXSBEbiBEbisxIERtCisvLyBWVEJMMywgVlRCWDM6IERkIFtEZChUSUVEX1RPKV0gRG4gRG4rMSBEbisyIERtCisvLyBWVEJMNCwgVlRCWDQ6IERkIFtEZChUSUVEX1RPKV0gRG4gRG4rMSBEbisyIERuKzMgRG0KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTlZUQkxGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBBUk1JbnN0c1tPcGNvZGVdOworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gVElELk9wSW5mbzsKKyAgaWYgKCFPcEluZm8pIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoTnVtT3BzID49IDMgJiYKKyAgICAgICAgIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgIE9wSW5mb1sxXS5SZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgIE9wSW5mb1syXS5SZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgICJFeHBlY3QgPj0gMyBvcGVyYW5kcyBhbmQgZmlyc3QgMyBhcyByZWcgb3BlcmFuZHMiKTsKKworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgdW5zaWduZWQgUm4gPSBkZWNvZGVORU9OUm4oaW5zbik7CisKKyAgLy8ge0RufSBlbmNvZGVkIGFzIGxlbiA9IDBiMDAKKyAgLy8ge0RuIERuKzF9IGVuY29kZWQgYXMgbGVuID0gMGIwMQorICAvLyB7RG4gRG4rMSBEbisyIH0gZW5jb2RlZCBhcyBsZW4gPSAwYjEwCisgIC8vIHtEbiBEbisxIERuKzIgRG4rM30gZW5jb2RlZCBhcyBsZW4gPSAwYjExCisgIHVuc2lnbmVkIExlbiA9IHNsaWNlKGluc24sIDksIDgpICsgMTsKKworICAvLyBEZCAodGhlIGRlc3RpbmF0aW9uIHZlY3RvcikKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpEUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVORU9OUmQoaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gUHJvY2VzcyB0aWVkX3RvIG9wZXJhbmQgY29uc3RyYWludC4KKyAgaW50IElkeDsKKyAgaWYgKChJZHggPSBUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoT3BJZHgsIFRPSTo6VElFRF9UTykpICE9IC0xKSB7CisgICAgTUkuYWRkT3BlcmFuZChNSS5nZXRPcGVyYW5kKElkeCkpOworICAgICsrT3BJZHg7CisgIH0KKworICAvLyBEbyB0aGUgPGxpc3Q+IG5vdy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IExlbjsgKytpKSB7CisgICAgYXNzZXJ0KE9wSWR4IDwgTnVtT3BzICYmIE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpEUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAgICJSZWcgb3BlcmFuZCBleHBlY3RlZCIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6RFBSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSbiArIGkpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIC8vIERtICh0aGUgaW5kZXggdmVjdG9yKQorICBhc3NlcnQoT3BJZHggPCBOdW1PcHMgJiYgT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBBUk06OkRQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgICJSZWcgb3BlcmFuZCAoaW5kZXggdmVjdG9yKSBleHBlY3RlZCIpOworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkRQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZU5FT05SbShpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVmVjdG9yIEdldCBMYW5lIChtb3ZlIHNjYWxhciB0byBBUk0gY29yZSByZWdpc3RlcikgSW5zdHJ1Y3Rpb25zLgorLy8gVkdFVExOaTMyLCBWR0VUTE5zMTYsIFZHRVRMTnM4LCBWR0VUTE51MTYsIFZHRVRMTnU4OiBSdCBEbiBpbmRleAorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVOR2V0TG5Gcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBBUk1JbnN0c1tPcGNvZGVdOworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gVElELk9wSW5mbzsKKyAgaWYgKCFPcEluZm8pIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoVElELmdldE51bURlZnMoKSA9PSAxICYmIE51bU9wcyA+PSAzICYmCisgICAgICAgICBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpEUFJSZWdDbGFzc0lEICYmCisgICAgICAgICBPcEluZm9bMl0uUmVnQ2xhc3MgPCAwICYmCisgICAgICAgICAiRXhwZWN0ID49IDMgb3BlcmFuZHMgd2l0aCBvbmUgZHN0IG9wZXJhbmQiKTsKKworICBFbGVtU2l6ZSBlc2l6ZSA9CisgICAgT3Bjb2RlID09IEFSTTo6VkdFVExOaTMyID8gRVNpemUzMgorICAgICAgOiAoKE9wY29kZSA9PSBBUk06OlZHRVRMTnMxNiB8fCBPcGNvZGUgPT0gQVJNOjpWR0VUTE51MTYpID8gRVNpemUxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRVNpemUzMik7CisKKyAgLy8gUnQgPSBJbnN0ezE1LTEyfSA9PiBBUk0gUmQKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSZChpbnNuKSkpKTsKKworICAvLyBEbiA9IEluc3R7NzoxOS0xNn0gPT4gTkVPTiBSbgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkRQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZU5FT05SbihpbnNuKSkpKTsKKworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKGRlY29kZU5WTGFuZU9wSW5kZXgoaW5zbiwgZXNpemUpKSk7CisKKyAgTnVtT3BzQWRkZWQgPSAzOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVmVjdG9yIFNldCBMYW5lIChtb3ZlIEFSTSBjb3JlIHJlZ2lzdGVyIHRvIHNjYWxhcikgSW5zdHJ1Y3Rpb25zLgorLy8gVlNFVExOaTE2LCBWU0VUTE5pMzIsIFZTRVRMTmk4OiBEZCBEZCAoVElFRF9UTykgUnQgaW5kZXgKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTlNldExuRnJtKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gQVJNSW5zdHNbT3Bjb2RlXTsKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IFRJRC5PcEluZm87CisgIGlmICghT3BJbmZvKSByZXR1cm4gZmFsc2U7CisKKyAgYXNzZXJ0KFRJRC5nZXROdW1EZWZzKCkgPT0gMSAmJiBOdW1PcHMgPj0gMyAmJgorICAgICAgICAgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6RFBSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgT3BJbmZvWzFdLlJlZ0NsYXNzID09IEFSTTo6RFBSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgVElELmdldE9wZXJhbmRDb25zdHJhaW50KDEsIFRPSTo6VElFRF9UTykgIT0gLTEgJiYKKyAgICAgICAgIE9wSW5mb1syXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgIE9wSW5mb1szXS5SZWdDbGFzcyA8IDAgJiYKKyAgICAgICAgICJFeHBlY3QgPj0gMyBvcGVyYW5kcyB3aXRoIG9uZSBkc3Qgb3BlcmFuZCIpOworCisgIEVsZW1TaXplIGVzaXplID0KKyAgICBPcGNvZGUgPT0gQVJNOjpWU0VUTE5pOCA/IEVTaXplOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKE9wY29kZSA9PSBBUk06OlZTRVRMTmkxNiA/IEVTaXplMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFU2l6ZTMyKTsKKworICAvLyBEZCA9IEluc3R7NzoxOS0xNn0gPT4gTkVPTiBSbgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkRQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZU5FT05SbihpbnNuKSkpKTsKKworICAvLyBUSUVEX1RPIG9wZXJhbmQuCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCkpOworCisgIC8vIFJ0ID0gSW5zdHsxNS0xMn0gPT4gQVJNIFJkCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmQoaW5zbikpKSk7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShkZWNvZGVOVkxhbmVPcEluZGV4KGluc24sIGVzaXplKSkpOworCisgIE51bU9wc0FkZGVkID0gNDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFZlY3RvciBEdXBsaWNhdGUgSW5zdHJ1Y3Rpb25zIChmcm9tIEFSTSBjb3JlIHJlZ2lzdGVyIHRvIGFsbCBlbGVtZW50cykuCisvLyBWRFVQOGQsIFZEVVAxNmQsIFZEVVAzMmQsIFZEVVA4cSwgVkRVUDE2cSwgVkRVUDMycTogUWQvRGQgUnQKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTkR1cEZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gQVJNSW5zdHNbT3Bjb2RlXS5PcEluZm87CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAyICYmCisgICAgICAgICAoT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6RFBSUmVnQ2xhc3NJRCB8fAorICAgICAgICAgIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OlFQUlJlZ0NsYXNzSUQpICYmCisgICAgICAgICBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAiRXhwZWN0ID49IDIgb3BlcmFuZHMgYW5kIGZpcnN0IDIgYXMgcmVnIG9wZXJhbmQiKTsKKworICB1bnNpZ25lZCBSZWdDbGFzcyA9IE9wSW5mb1swXS5SZWdDbGFzczsKKworICAvLyBRZC9EZCA9IEluc3R7NzoxOS0xNn0gPT4gTkVPTiBSbgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBSZWdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlTkVPTlJuKGluc24pKSkpOworCisgIC8vIFJ0ID0gSW5zdHsxNS0xMn0gPT4gQVJNIFJkCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmQoaW5zbikpKSk7CisKKyAgTnVtT3BzQWRkZWQgPSAyOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQTguNi40MSBETUIKKy8vIEE4LjYuNDIgRFNCCisvLyBBOC42LjQ5IElTQgorc3RhdGljIGlubGluZSBib29sIE1lbUJhcnJpZXJJbnN0cih1aW50MzJfdCBpbnNuKSB7CisgIHVuc2lnbmVkIG9wN180ID0gc2xpY2UoaW5zbiwgNywgNCk7CisgIGlmIChzbGljZShpbnNuLCAzMSwgMjApID09IDB4ZjU3ICYmIChvcDdfNCA+PSA0ICYmIG9wN180IDw9IDYpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIFByZUxvYWRPcGNvZGUodW5zaWduZWQgT3Bjb2RlKSB7CisgIHN3aXRjaChPcGNvZGUpIHsKKyAgY2FzZSBBUk06OlBMRGk6ICBjYXNlIEFSTTo6UExEcjoKKyAgY2FzZSBBUk06OlBMRFdpOiBjYXNlIEFSTTo6UExEV3I6CisgIGNhc2UgQVJNOjpQTElpOiAgY2FzZSBBUk06OlBMSXI6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlUHJlTG9hZEZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICAvLyBQcmVsb2FkIERhdGEvSW5zdHJ1Y3Rpb24gcmVxdWlyZXMgZWl0aGVyIDIgb3IgNCBvcGVyYW5kcy4KKyAgLy8gUExEaSwgUExEV2ksIFBMSWk6ICAgICAgICAgICAgICAgIFJuIFsrLy1daW1tMTIgYWRkID0gKFUgPT0gJzEnKQorICAvLyBQTERyW2F8bV0sIFBMRFdyW2F8bV0sIFBMSXJbYXxtXTogUm4gUm0gYWRkcm1vZGUyX29wYworCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisKKyAgaWYgKE9wY29kZSA9PSBBUk06OlBMRGkgfHwgT3Bjb2RlID09IEFSTTo6UExEV2kgfHwgT3Bjb2RlID09IEFSTTo6UExJaSkgeworICAgIHVuc2lnbmVkIEltbTEyID0gc2xpY2UoaW5zbiwgMTEsIDApOworICAgIGJvb2wgTmVnYXRpdmUgPSBnZXRVQml0KGluc24pID09IDA7CisgICAgaW50IE9mZnNldCA9IE5lZ2F0aXZlID8gLTEgLSBJbW0xMiA6IDEgKiBJbW0xMjsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKE9mZnNldCkpOworICAgIE51bU9wc0FkZGVkID0gMjsKKyAgfSBlbHNlIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisKKyAgICBBUk1fQU06OkFkZHJPcGMgQWRkck9wY29kZSA9IGdldFVCaXQoaW5zbikgPyBBUk1fQU06OmFkZCA6IEFSTV9BTTo6c3ViOworCisgICAgLy8gSW5zdHs2LTV9IGVuY29kZXMgdGhlIHNoaWZ0IG9wY29kZS4KKyAgICBBUk1fQU06OlNoaWZ0T3BjIFNoT3AgPSBnZXRTaGlmdE9wY0ZvckJpdHMoc2xpY2UoaW5zbiwgNiwgNSkpOworICAgIC8vIEluc3R7MTEtN30gZW5jb2RlcyB0aGUgaW1tNSBzaGlmdCBhbW91bnQuCisgICAgdW5zaWduZWQgU2hJbW0gPSBzbGljZShpbnNuLCAxMSwgNyk7CisKKyAgICAvLyBBOC40LjEuICBQb3NzaWJsZSBycnggb3Igc2hpZnQgYW1vdW50IG9mIDMyLi4uCisgICAgZ2V0SW1tU2hpZnRTRShTaE9wLCBTaEltbSk7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbSgKKyAgICAgICAgICAgICAgICAgICAgQVJNX0FNOjpnZXRBTTJPcGMoQWRkck9wY29kZSwgU2hJbW0sIFNoT3ApKSk7CisgICAgTnVtT3BzQWRkZWQgPSAzOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlTWlzY0ZybShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBpZiAoTWVtQmFycmllckluc3RyKGluc24pKQorICAgIHJldHVybiB0cnVlOworCisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGNhc2UgQVJNOjpDTFJFWDoKKyAgY2FzZSBBUk06Ok5PUDoKKyAgY2FzZSBBUk06OlRSQVA6CisgIGNhc2UgQVJNOjpZSUVMRDoKKyAgY2FzZSBBUk06OldGRToKKyAgY2FzZSBBUk06OldGSToKKyAgY2FzZSBBUk06OlNFVjoKKyAgY2FzZSBBUk06OlNFVEVOREJFOgorICBjYXNlIEFSTTo6U0VURU5ETEU6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICAvLyBDUFMgaGFzIGEgc2luZ2xldG9uICRvcHQgb3BlcmFuZCB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgIC8vIG9wdHs0LTB9ID0gbW9kZSBmcm9tIEluc3R7NC0wfQorICAvLyBvcHR7NX0gPSBjaGFuZ2Vtb2RlIGZyb20gSW5zdHsxN30KKyAgLy8gb3B0ezgtNn0gPSBBSUYgZnJvbSBJbnN0ezgtNn0KKyAgLy8gb3B0ezEwLTl9ID0gaW1vZCBmcm9tIEluc3R7MTktMTh9IHdpdGggMGIxMCBhcyBlbmFibGUgYW5kIDBiMTEgYXMgZGlzYWJsZQorICBpZiAoT3Bjb2RlID09IEFSTTo6Q1BTKSB7CisgICAgdW5zaWduZWQgT3B0aW9uID0gc2xpY2UoaW5zbiwgNCwgMCkgfCBzbGljZShpbnNuLCAxNywgMTcpIDw8IDUgfAorICAgICAgc2xpY2UoaW5zbiwgOCwgNikgPDwgNiB8IHNsaWNlKGluc24sIDE5LCAxOCkgPDwgOTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKE9wdGlvbikpOworICAgIE51bU9wc0FkZGVkID0gMTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIERCRyBoYXMgaXRzIG9wdGlvbiBzcGVjaWZpZWQgaW4gSW5zdHszLTB9LgorICBpZiAoT3Bjb2RlID09IEFSTTo6REJHKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShzbGljZShpbnNuLCAzLCAwKSkpOworICAgIE51bU9wc0FkZGVkID0gMTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEJLUFQgdGFrZXMgYW4gaW1tMzIgdmFsIGVxdWFsIHRvIFplcm9FeHRlbmQoSW5zdHsxOS04OjMtMH0pLgorICBpZiAoT3Bjb2RlID09IEFSTTo6QktQVCkgeworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oc2xpY2UoaW5zbiwgMTksIDgpIDw8IDQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UoaW5zbiwgMywgMCkpKTsKKyAgICBOdW1PcHNBZGRlZCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoUHJlTG9hZE9wY29kZShPcGNvZGUpKQorICAgIHJldHVybiBEaXNhc3NlbWJsZVByZUxvYWRGcm0oTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwgQik7CisKKyAgYXNzZXJ0KDAgJiYgIlVuZXhwZWN0ZWQgbWlzYyBpbnN0cnVjdGlvbiEiKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gRnVuY1B0cnMgLSBGdW5jUHRycyBtYXBzIEFSTUZvcm1hdCB0byBpdHMgY29ycmVzcG9uZGluZyBEaXNhc3NlbWJsZUZQLgorLy8vIFdlIGRpdmlkZSB0aGUgZGlzYXNzZW1ibHkgdGFzayBpbnRvIGRpZmZlcmVudCBjYXRlZ29yaWVzLCB3aXRoIGVhY2ggb25lCisvLy8gY29ycmVzcG9uZGluZyB0byBhIHNwZWNpZmljIGluc3RydWN0aW9uIGVuY29kaW5nIGZvcm1hdC4gIFRoZXJlIGNvdWxkIGJlCisvLy8gZXhjZXB0aW9ucyB3aGVuIGhhbmRsaW5nIGEgc3BlY2lmaWMgZm9ybWF0LCBhbmQgdGhhdCBpcyB3aHkgdGhlIE9wY29kZSBpcworLy8vIGFsc28gcHJlc2VudCBpbiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlLgorc3RhdGljIGNvbnN0IERpc2Fzc2VtYmxlRlAgRnVuY1B0cnNbXSA9IHsKKyAgJkRpc2Fzc2VtYmxlUHNldWRvLAorICAmRGlzYXNzZW1ibGVNdWxGcm0sCisgICZEaXNhc3NlbWJsZUJyRnJtLAorICAmRGlzYXNzZW1ibGVCck1pc2NGcm0sCisgICZEaXNhc3NlbWJsZURQRnJtLAorICAmRGlzYXNzZW1ibGVEUFNvUmVnRnJtLAorICAmRGlzYXNzZW1ibGVMZEZybSwKKyAgJkRpc2Fzc2VtYmxlU3RGcm0sCisgICZEaXNhc3NlbWJsZUxkTWlzY0ZybSwKKyAgJkRpc2Fzc2VtYmxlU3RNaXNjRnJtLAorICAmRGlzYXNzZW1ibGVMZFN0TXVsRnJtLAorICAmRGlzYXNzZW1ibGVMZFN0RXhGcm0sCisgICZEaXNhc3NlbWJsZUFyaXRoTWlzY0ZybSwKKyAgJkRpc2Fzc2VtYmxlU2F0RnJtLAorICAmRGlzYXNzZW1ibGVFeHRGcm0sCisgICZEaXNhc3NlbWJsZVZGUFVuYXJ5RnJtLAorICAmRGlzYXNzZW1ibGVWRlBCaW5hcnlGcm0sCisgICZEaXNhc3NlbWJsZVZGUENvbnYxRnJtLAorICAmRGlzYXNzZW1ibGVWRlBDb252MkZybSwKKyAgJkRpc2Fzc2VtYmxlVkZQQ29udjNGcm0sCisgICZEaXNhc3NlbWJsZVZGUENvbnY0RnJtLAorICAmRGlzYXNzZW1ibGVWRlBDb252NUZybSwKKyAgJkRpc2Fzc2VtYmxlVkZQTGRTdEZybSwKKyAgJkRpc2Fzc2VtYmxlVkZQTGRTdE11bEZybSwKKyAgJkRpc2Fzc2VtYmxlVkZQTWlzY0ZybSwKKyAgJkRpc2Fzc2VtYmxlVGh1bWJGcm0sCisgICZEaXNhc3NlbWJsZU1pc2NGcm0sCisgICZEaXNhc3NlbWJsZU5HZXRMbkZybSwKKyAgJkRpc2Fzc2VtYmxlTlNldExuRnJtLAorICAmRGlzYXNzZW1ibGVORHVwRnJtLAorCisgIC8vIFZMRCBhbmQgVlNUIChpbmNsdWRpbmcgb25lIGxhbmUpIEluc3RydWN0aW9ucy4KKyAgJkRpc2Fzc2VtYmxlTkxkU3QsCisKKyAgLy8gQTcuNC42IE9uZSByZWdpc3RlciBhbmQgYSBtb2RpZmllZCBpbW1lZGlhdGUgdmFsdWUKKyAgLy8gMS1SZWdpc3RlciBJbnN0cnVjdGlvbnMgd2l0aCBpbW0uCisgIC8vIExMVk0gb25seSBkZWZpbmVzIFZNT1Z2IGluc3RydWN0aW9ucy4KKyAgJkRpc2Fzc2VtYmxlTjFSZWdNb2RJbW1Gcm0sCisKKyAgLy8gMi1SZWdpc3RlciBJbnN0cnVjdGlvbnMgd2l0aCBubyBpbW0uCisgICZEaXNhc3NlbWJsZU4yUmVnRnJtLAorCisgIC8vIDItUmVnaXN0ZXIgSW5zdHJ1Y3Rpb25zIHdpdGggaW1tICh2ZWN0b3IgY29udmVydCBmbG9hdC9maXhlZCBwb2ludCkuCisgICZEaXNhc3NlbWJsZU5WQ1ZURnJtLAorCisgIC8vIDItUmVnaXN0ZXIgSW5zdHJ1Y3Rpb25zIHdpdGggaW1tICh2ZWN0b3IgZHVwIGxhbmUpLgorICAmRGlzYXNzZW1ibGVOVmVjRHVwTG5Gcm0sCisKKyAgLy8gVmVjdG9yIFNoaWZ0IExlZnQgSW5zdHJ1Y3Rpb25zLgorICAmRGlzYXNzZW1ibGVOMlJlZ1ZlY1NoTEZybSwKKworICAvLyBWZWN0b3IgU2hpZnQgUmlnaCBJbnN0cnVjdGlvbnMsIHdoaWNoIGhhcyBkaWZmZXJlbnQgaW50ZXJwcmV0YXRpb24gb2YgdGhlCisgIC8vIHNoaWZ0IGFtb3VudCBmcm9tIHRoZSBpbW02IGZpZWxkLgorICAmRGlzYXNzZW1ibGVOMlJlZ1ZlY1NoUkZybSwKKworICAvLyAzLVJlZ2lzdGVyIERhdGEtUHJvY2Vzc2luZyBJbnN0cnVjdGlvbnMuCisgICZEaXNhc3NlbWJsZU4zUmVnRnJtLAorCisgIC8vIFZlY3RvciBTaGlmdCAoUmVnaXN0ZXIpIEluc3RydWN0aW9ucy4KKyAgLy8gRDpWZCBNOlZtIE46Vm4gKG5vdGljZSB0aGF0IE06Vm0gaXMgdGhlIGZpcnN0IG9wZXJhbmQpCisgICZEaXNhc3NlbWJsZU4zUmVnVmVjU2hGcm0sCisKKyAgLy8gVmVjdG9yIEV4dHJhY3QgSW5zdHJ1Y3Rpb25zLgorICAmRGlzYXNzZW1ibGVOVmVjRXh0cmFjdEZybSwKKworICAvLyBWZWN0b3IgW1NhdHVyYXRpbmcgUm91bmRpbmcgRG91YmxpbmddIE11bHRpcGx5IFtBY2N1bXVsYXRlL1N1YnRyYWN0XSBbTG9uZ10KKyAgLy8gQnkgU2NhbGFyIEluc3RydWN0aW9ucy4KKyAgJkRpc2Fzc2VtYmxlTlZlY011bFNjYWxhckZybSwKKworICAvLyBWZWN0b3IgVGFibGUgTG9va3VwIHVzZXMgYnl0ZSBpbmRleGVzIGluIGEgY29udHJvbCB2ZWN0b3IgdG8gbG9vayB1cCBieXRlCisgIC8vIHZhbHVlcyBpbiBhIHRhYmxlIGFuZCBnZW5lcmF0ZSBhIG5ldyB2ZWN0b3IuCisgICZEaXNhc3NlbWJsZU5WVEJMRnJtLAorCisgIE5VTEwKK307CisKKy8vLyBCdWlsZEl0IC0gQnVpbGRJdCBwZXJmb3JtcyB0aGUgYnVpbGQgc3RlcCBmb3IgdGhpcyBBUk0gQmFzaWMgTUMgQnVpbGRlci4KKy8vLyBUaGUgZ2VuZXJhbCBpZGVhIGlzIHRvIHNldCB0aGUgT3Bjb2RlIGZvciB0aGUgTUNJbnN0LCBmb2xsb3dlZCBieSBhZGRpbmcKKy8vLyB0aGUgYXBwcm9wcmlhdGUgTUNPcGVyYW5kcyB0byB0aGUgTUNJbnN0LiAgQVJNIEJhc2ljIE1DIEJ1aWxkZXIgZGVsZWdhdGVzCisvLy8gdG8gdGhlIEZvcm1hdC1zcGVjaWZpYyBkaXNhc3NlbWJsZSBmdW5jdGlvbiBmb3IgZGlzYXNzZW1ibHksIGZvbGxvd2VkIGJ5CisvLy8gVHJ5UHJlZGljYXRlQW5kU0JpdE1vZGlmaWVyKCkgdG8gZG8gUHJlZGljYXRlT3BlcmFuZCBhbmQgT3B0aW9uYWxEZWZPcGVyYW5kCisvLy8gd2hpY2ggZm9sbG93IHRoZSBEc3QvU3JjIE9wZXJhbmRzLgorYm9vbCBBUk1CYXNpY01DQnVpbGRlcjo6QnVpbGRJdChNQ0luc3QgJk1JLCB1aW50MzJfdCBpbnNuKSB7CisgIC8vIFN0YWdlIDEgc2V0cyB0aGUgT3Bjb2RlLgorICBNSS5zZXRPcGNvZGUoT3Bjb2RlKTsKKyAgLy8gSWYgdGhlIG51bWJlciBvZiBvcGVyYW5kcyBpcyB6ZXJvLCB3ZSdyZSBkb25lIQorICBpZiAoTnVtT3BzID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gU3RhZ2UgMiBjYWxscyB0aGUgZm9ybWF0LXNwZWNpZmljIGRpc2Fzc2VtYmxlIGZ1bmN0aW9uIHRvIGJ1aWxkIHRoZSBvcGVyYW5kCisgIC8vIGxpc3QuCisgIGlmIChEaXNhc20gPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHVuc2lnbmVkIE51bU9wc0FkZGVkID0gMDsKKyAgYm9vbCBPSyA9ICgqRGlzYXNtKShNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLCB0aGlzKTsKKworICBpZiAoIU9LIHx8IHRoaXMtPkVyciAhPSAwKSByZXR1cm4gZmFsc2U7CisgIGlmIChOdW1PcHNBZGRlZCA+PSBOdW1PcHMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gU3RhZ2UgMyBkZWFscyB3aXRoIG9wZXJhbmRzIHVuYWNjb3VudGVkIGZvciBhZnRlciBzdGFnZSAyIGlzIGZpbmlzaGVkLgorICAvLyBGSVhNRTogU2hvdWxkIHRoaXMgYmUgZG9uZSBzZWxlY3RpdmVseT8KKyAgcmV0dXJuIFRyeVByZWRpY2F0ZUFuZFNCaXRNb2RpZmllcihNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMgLSBOdW1PcHNBZGRlZCk7Cit9CisKKy8vIEE4LjMgQ29uZGl0aW9uYWwgZXhlY3V0aW9uCisvLyBBOC4zLjEgUHNldWRvY29kZSBkZXRhaWxzIG9mIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgorLy8gQ29uZGl0aW9uIGJpdHMgJzExMXgnIGluZGljYXRlIHRoZSBpbnN0cnVjdGlvbiBpcyBhbHdheXMgZXhlY3V0ZWQuCitzdGF0aWMgdWludDMyX3QgQ29uZENvZGUodWludDMyX3QgQ29uZEZpZWxkKSB7CisgIGlmIChDb25kRmllbGQgPT0gMHhGKQorICAgIHJldHVybiBBUk1DQzo6QUw7CisgIHJldHVybiBDb25kRmllbGQ7Cit9CisKKy8vLyBEb1ByZWRpY2F0ZU9wZXJhbmRzIC0gRG9QcmVkaWNhdGVPcGVyYW5kcyBwcm9jZXNzIHRoZSBwcmVkaWNhdGUgb3BlcmFuZHMKKy8vLyBvZiBzb21lIFRodW1iIGluc3RydWN0aW9ucyB3aGljaCBjb21lIGJlZm9yZSB0aGUgcmVnbGlzdCBvcGVyYW5kcy4gIEl0CisvLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcHJlZGljYXRlIG9wZXJhbmRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCitib29sIEFSTUJhc2ljTUNCdWlsZGVyOjpEb1ByZWRpY2F0ZU9wZXJhbmRzKE1DSW5zdCYgTUksIHVuc2lnbmVkIE9wY29kZSwKKyAgICB1aW50MzJfdCAvKiBpbnNuICovLCB1bnNpZ25lZCBzaG9ydCBOdW1PcHNSZW1haW5pbmcpIHsKKworICBhc3NlcnQoTnVtT3BzUmVtYWluaW5nID4gMCAmJiAiSW52YWxpZCBhcmd1bWVudCIpOworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgdW5zaWduZWQgSWR4ID0gTUkuZ2V0TnVtT3BlcmFuZHMoKTsKKworICAvLyBGaXJzdCwgd2UgY2hlY2sgd2hldGhlciB0aGlzIGluc3RyIHNwZWNpZmllcyB0aGUgUHJlZGljYXRlT3BlcmFuZCB0aHJvdWdoCisgIC8vIGEgcGFpciBvZiBUYXJnZXRPcGVyYW5kSW5mb3Mgd2l0aCBpc1ByZWRpY2F0ZSgpIHByb3BlcnR5LgorICBpZiAoTnVtT3BzUmVtYWluaW5nID49IDIgJiYKKyAgICAgIE9wSW5mb1tJZHhdLmlzUHJlZGljYXRlKCkgJiYgT3BJbmZvW0lkeCsxXS5pc1ByZWRpY2F0ZSgpICYmCisgICAgICBPcEluZm9bSWR4XS5SZWdDbGFzcyA8IDAgJiYKKyAgICAgIE9wSW5mb1tJZHgrMV0uUmVnQ2xhc3MgPT0gQVJNOjpDQ1JSZWdDbGFzc0lEKQorICB7CisgICAgLy8gSWYgd2UgYXJlIGluc2lkZSBhbiBJVCBibG9jaywgZ2V0IHRoZSBJVCBjb25kaXRpb24gYml0cyBtYWludGFpbmVkIHZpYQorICAgIC8vIEFSTUJhc2ljTUNCdWlsZGVyOjpJVFN0YXRlWzc6MF0sIHRocm91Z2ggQVJNQmFzaWNNQ0J1aWxkZXI6OkdldElUQ29uZCgpLgorICAgIC8vIFNlZSBhbHNvIEEyLjUuMi4KKyAgICBpZiAoSW5JVEJsb2NrKCkpCisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEdldElUQ29uZCgpKSk7CisgICAgZWxzZQorICAgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShBUk1DQzo6QUwpKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKEFSTTo6Q1BTUikpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorICAKKy8vLyBUcnlQcmVkaWNhdGVBbmRTQml0TW9kaWZpZXIgLSBUcnlQcmVkaWNhdGVBbmRTQml0TW9kaWZpZXIgdHJpZXMgdG8gcHJvY2VzcworLy8vIHRoZSBwb3NzaWJsZSBQcmVkaWNhdGUgYW5kIFNCaXRNb2RpZmllciwgdG8gYnVpbGQgdGhlIHJlbWFpbmluZyBNQ09wZXJhbmQKKy8vLyBjb25zdGl0dWVudHMuCitib29sIEFSTUJhc2ljTUNCdWlsZGVyOjpUcnlQcmVkaWNhdGVBbmRTQml0TW9kaWZpZXIoTUNJbnN0JiBNSSwgdW5zaWduZWQgT3Bjb2RlLAorICAgIHVpbnQzMl90IGluc24sIHVuc2lnbmVkIHNob3J0IE51bU9wc1JlbWFpbmluZykgeworCisgIGFzc2VydChOdW1PcHNSZW1haW5pbmcgPiAwICYmICJJbnZhbGlkIGFyZ3VtZW50Iik7CisKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IEFSTUluc3RzW09wY29kZV0uT3BJbmZvOworICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSA9IEFSTUluc3RzW09wY29kZV0uTmFtZTsKKyAgdW5zaWduZWQgSWR4ID0gTUkuZ2V0TnVtT3BlcmFuZHMoKTsKKworICAvLyBGaXJzdCwgd2UgY2hlY2sgd2hldGhlciB0aGlzIGluc3RyIHNwZWNpZmllcyB0aGUgUHJlZGljYXRlT3BlcmFuZCB0aHJvdWdoCisgIC8vIGEgcGFpciBvZiBUYXJnZXRPcGVyYW5kSW5mb3Mgd2l0aCBpc1ByZWRpY2F0ZSgpIHByb3BlcnR5LgorICBpZiAoTnVtT3BzUmVtYWluaW5nID49IDIgJiYKKyAgICAgIE9wSW5mb1tJZHhdLmlzUHJlZGljYXRlKCkgJiYgT3BJbmZvW0lkeCsxXS5pc1ByZWRpY2F0ZSgpICYmCisgICAgICBPcEluZm9bSWR4XS5SZWdDbGFzcyA8IDAgJiYKKyAgICAgIE9wSW5mb1tJZHgrMV0uUmVnQ2xhc3MgPT0gQVJNOjpDQ1JSZWdDbGFzc0lEKQorICB7CisgICAgLy8gSWYgd2UgYXJlIGluc2lkZSBhbiBJVCBibG9jaywgZ2V0IHRoZSBJVCBjb25kaXRpb24gYml0cyBtYWludGFpbmVkIHZpYQorICAgIC8vIEFSTUJhc2ljTUNCdWlsZGVyOjpJVFN0YXRlWzc6MF0sIHRocm91Z2ggQVJNQmFzaWNNQ0J1aWxkZXI6OkdldElUQ29uZCgpLgorICAgIC8vIFNlZSBhbHNvIEEyLjUuMi4KKyAgICBpZiAoSW5JVEJsb2NrKCkpCisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEdldElUQ29uZCgpKSk7CisgICAgZWxzZSB7CisgICAgICBpZiAoTmFtZS5sZW5ndGgoKSA+IDEgJiYgTmFtZVswXSA9PSAndCcpIHsKKyAgICAgICAgLy8gVGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9ucyBoYXZlIHRoZWlyIGNvbmQgZmllbGQgZW1iZWRkZWQsCisgICAgICAgIC8vIGxpa2UgQVJNLgorICAgICAgICAvLworICAgICAgICAvLyBBOC42LjE2IEIKKyAgICAgICAgaWYgKE5hbWUgPT0gInQyQmNjIikKKyAgICAgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKENvbmRDb2RlKHNsaWNlKGluc24sIDI1LCAyMikpKSk7CisgICAgICAgIGVsc2UgaWYgKE5hbWUgPT0gInRCY2MiKQorICAgICAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oQ29uZENvZGUoc2xpY2UoaW5zbiwgMTEsIDgpKSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShBUk1DQzo6QUwpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFSTSBpbnN0cnVjdGlvbnMgZ2V0IHRoZWlyIGNvbmRpdGlvbiBmaWVsZCBmcm9tIEluc3R7MzEtMjh9LgorICAgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKENvbmRDb2RlKGdldENvbmRGaWVsZChpbnNuKSkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhBUk06OkNQU1IpKTsKKyAgICBJZHggKz0gMjsKKyAgICBOdW1PcHNSZW1haW5pbmcgLT0gMjsKKyAgfQorCisgIGlmIChOdW1PcHNSZW1haW5pbmcgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBOZXh0LCBpZiBPcHRpb25hbERlZk9wZXJhbmQgZXhpc3RzLCB3ZSBjaGVjayB3aGV0aGVyIHRoZSAnUycgYml0IGlzIHNldC4KKyAgaWYgKE9wSW5mb1tJZHhdLmlzT3B0aW9uYWxEZWYoKSAmJiBPcEluZm9bSWR4XS5SZWdDbGFzcz09QVJNOjpDQ1JSZWdDbGFzc0lEKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRTQml0KGluc24pID09IDEgPyBBUk06OkNQU1IgOiAwKSk7CisgICAgLS1OdW1PcHNSZW1haW5pbmc7CisgIH0KKworICBpZiAoTnVtT3BzUmVtYWluaW5nID09IDApCisgICAgcmV0dXJuIHRydWU7CisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBSdW5CdWlsZEFmdGVySG9vayAtIFJ1bkJ1aWxkQWZ0ZXJIb29rIHBlcmZvcm1zIG9wZXJhdGlvbnMgZGVlbWVkIG5lY2Vzc2FyeQorLy8vIGFmdGVyIEJ1aWxkSXQgaXMgZmluaXNoZWQuCitib29sIEFSTUJhc2ljTUNCdWlsZGVyOjpSdW5CdWlsZEFmdGVySG9vayhib29sIFN0YXR1cywgTUNJbnN0ICZNSSwKKyAgICB1aW50MzJfdCBpbnNuKSB7CisKKyAgaWYgKCFTUCkgcmV0dXJuIFN0YXR1czsKKworICBpZiAoT3Bjb2RlID09IEFSTTo6dDJJVCkKKyAgICBTdGF0dXMgPSBTUC0+SW5pdElUKHNsaWNlKGluc24sIDcsIDApKSA/IFN0YXR1cyA6IGZhbHNlOworICBlbHNlIGlmIChJbklUQmxvY2soKSkKKyAgICBTUC0+VXBkYXRlSVQoKTsKKworICByZXR1cm4gU3RhdHVzOworfQorCisvLy8gT3Bjb2RlLCBGb3JtYXQsIGFuZCBOdW1PcGVyYW5kcyBtYWtlIHVwIGFuIEFSTSBCYXNpYyBNQ0J1aWxkZXIuCitBUk1CYXNpY01DQnVpbGRlcjo6QVJNQmFzaWNNQ0J1aWxkZXIodW5zaWduZWQgb3BjLCBBUk1Gb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IG51bSkKKyAgOiBPcGNvZGUob3BjKSwgRm9ybWF0KGZvcm1hdCksIE51bU9wcyhudW0pLCBTUCgwKSwgRXJyKDApIHsKKyAgdW5zaWduZWQgSWR4ID0gKHVuc2lnbmVkKWZvcm1hdDsKKyAgYXNzZXJ0KElkeCA8IChhcnJheV9sZW5ndGhvZihGdW5jUHRycykgLSAxKSAmJiAiVW5rbm93biBmb3JtYXQiKTsKKyAgRGlzYXNtID0gRnVuY1B0cnNbSWR4XTsKK30KKworLy8vIENyZWF0ZU1DQnVpbGRlciAtIFJldHVybiBhbiBBUk1CYXNpY01DQnVpbGRlciB0aGF0IGNhbiBidWlsZCB1cCB0aGUgTUMKKy8vLyBpbmZyYXN0cnVjdHVyZSBvZiBhbiBNQ0luc3QgZ2l2ZW4gdGhlIE9wY29kZSBhbmQgRm9ybWF0IG9mIHRoZSBpbnN0ci4KKy8vLyBSZXR1cm4gTlVMTCBpZiBpdCBmYWlscyB0byBjcmVhdGUvcmV0dXJuIGEgcHJvcGVyIGJ1aWxkZXIuICBBUEkgY2xpZW50cworLy8vIGFyZSByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB1cCBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gIENhY2hlaW5nIGNhbiBiZQorLy8vIHBlcmZvcm1lZCBieSB0aGUgQVBJIGNsaWVudHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KK0FSTUJhc2ljTUNCdWlsZGVyICpsbHZtOjpDcmVhdGVNQ0J1aWxkZXIodW5zaWduZWQgT3Bjb2RlLCBBUk1Gb3JtYXQgRm9ybWF0KSB7CisgIC8vIEZvciAiVW5rbm93biBmb3JtYXQiLCBmYWlsIGJ5IHJldHVybmluZyBhIE5VTEwgcG9pbnRlci4KKyAgaWYgKCh1bnNpZ25lZClGb3JtYXQgPj0gKGFycmF5X2xlbmd0aG9mKEZ1bmNQdHJzKSAtIDEpKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJVbmtub3duIGZvcm1hdFxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gbmV3IEFSTUJhc2ljTUNCdWlsZGVyKE9wY29kZSwgRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUluc3RzW09wY29kZV0uZ2V0TnVtT3BlcmFuZHMoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9EaXNhc3NlbWJsZXIvQVJNRGlzYXNzZW1ibGVyQ29yZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL0FSTURpc2Fzc2VtYmxlckNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmNkNWEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL0FSTURpc2Fzc2VtYmxlckNvcmUuaApAQCAtMCwwICsxLDI2MiBAQAorLy89PT0tIEFSTURpc2Fzc2VtYmxlckNvcmUuaCAtIEFSTSBkaXNhc3NlbWJsZXIgaGVscGVycyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQVJNIERpc2Fzc2VtYmxlci4KKy8vCisvLyBUaGUgZmlyc3QgcGFydCBkZWZpbmVzIHRoZSBlbnVtZXJhdGlvbiB0eXBlIG9mIEFSTSBpbnN0cnVjdGlvbiBmb3JtYXQsIHdoaWNoCisvLyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgYnkgdGhlIGluc3RydWN0aW9uLCBhcyB3ZWxsIGFzIGEgaGVscGVyIGZ1bmN0aW9uCisvLyB0byBjb252ZXJ0IHRoZSBlbnVtcyB0byBwcmludGFibGUgY2hhciBzdHJpbmdzLgorLy8KKy8vIEl0IGFsc28gY29udGFpbnMgY29kZSB0byByZXByZXNlbnQgdGhlIGNvbmNlcHRzIG9mIEJ1aWxkZXIgYW5kIERpc2Fzc2VtYmxlRlAKKy8vIHRvIHNvbHZlIHRoZSBwcm9ibGVtIG9mIGRpc2Fzc2VtYmxpbmcgYW4gQVJNIGluc3RyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQVJNRElTQVNTRU1CTEVSQ09SRV9ICisjZGVmaW5lIEFSTURJU0FTU0VNQkxFUkNPUkVfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJBUk1CYXNlSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiQVJNUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAiQVJNRGlzYXNzZW1ibGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVJNVXRpbHMgeworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciAqT3Bjb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgRW51bXMgYW5kIFV0aWxpdGllcyBmb3IgQVJNIEluc3RydWN0aW9uIEZvcm1hdCAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgQVJNX0ZPUk1BVFMgICAgICAgICAgICAgICAgICAgXAorICBFTlRSWShBUk1fRk9STUFUX1BTRVVETywgICAgICAgICAwKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTVVMRlJNLCAgICAgICAgIDEpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9CUkZSTSwgICAgICAgICAgMikgXAorICBFTlRSWShBUk1fRk9STUFUX0JSTUlTQ0ZSTSwgICAgICAzKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfRFBGUk0sICAgICAgICAgIDQpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9EUFNPUkVHRlJNLCAgICAgNSkgXAorICBFTlRSWShBUk1fRk9STUFUX0xERlJNLCAgICAgICAgICA2KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfU1RGUk0sICAgICAgICAgIDcpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9MRE1JU0NGUk0sICAgICAgOCkgXAorICBFTlRSWShBUk1fRk9STUFUX1NUTUlTQ0ZSTSwgICAgICA5KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTERTVE1VTEZSTSwgICAgMTApIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9MRFNURVhGUk0sICAgICAxMSkgXAorICBFTlRSWShBUk1fRk9STUFUX0FSSVRITUlTQ0ZSTSwgIDEyKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfU0FURlJNLCAgICAgICAgMTMpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9FWFRGUk0sICAgICAgICAxNCkgXAorICBFTlRSWShBUk1fRk9STUFUX1ZGUFVOQVJZRlJNLCAgIDE1KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfVkZQQklOQVJZRlJNLCAgMTYpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9WRlBDT05WMUZSTSwgICAxNykgXAorICBFTlRSWShBUk1fRk9STUFUX1ZGUENPTlYyRlJNLCAgIDE4KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfVkZQQ09OVjNGUk0sICAgMTkpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9WRlBDT05WNEZSTSwgICAyMCkgXAorICBFTlRSWShBUk1fRk9STUFUX1ZGUENPTlY1RlJNLCAgIDIxKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfVkZQTERTVEZSTSwgICAgMjIpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9WRlBMRFNUTVVMRlJNLCAyMykgXAorICBFTlRSWShBUk1fRk9STUFUX1ZGUE1JU0NGUk0sICAgIDI0KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfVEhVTUJGUk0sICAgICAgMjUpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9NSVNDRlJNLCAgICAgICAyNikgXAorICBFTlRSWShBUk1fRk9STUFUX05FT05HRVRMTkZSTSwgIDI3KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTkVPTlNFVExORlJNLCAgMjgpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9ORU9ORFVQRlJNLCAgICAyOSkgXAorICBFTlRSWShBUk1fRk9STUFUX05MZFN0LCAgICAgICAgIDMwKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTjFSZWdNb2RJbW0sICAgMzEpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9OMlJlZywgICAgICAgICAzMikgXAorICBFTlRSWShBUk1fRk9STUFUX05WQ1ZULCAgICAgICAgIDMzKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTlZlY0R1cExuLCAgICAgMzQpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9OMlJlZ1ZlY1NoTCwgICAzNSkgXAorICBFTlRSWShBUk1fRk9STUFUX04yUmVnVmVjU2hSLCAgIDM2KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTjNSZWcsICAgICAgICAgMzcpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9OM1JlZ1ZlY1NoLCAgICAzOCkgXAorICBFTlRSWShBUk1fRk9STUFUX05WZWNFeHRyYWN0LCAgIDM5KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTlZlY011bFNjYWxhciwgNDApIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9OVlRCTCwgICAgICAgICA0MSkKKworLy8gQVJNIGluc3RydWN0aW9uIGZvcm1hdCBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgYnkgdGhlIGluc3RydWN0aW9uLgorI2RlZmluZSBFTlRSWShuLCB2KSBuID0gdiwKK3R5cGVkZWYgZW51bSB7CisgIEFSTV9GT1JNQVRTCisgIEFSTV9GT1JNQVRfTkEKK30gQVJNRm9ybWF0OworI3VuZGVmIEVOVFJZCisKKy8vIENvbnZlcnRzIGVudW0gdG8gY29uc3QgY2hhciouCitzdGF0aWMgY29uc3QgaW5saW5lIGNoYXIgKnN0cmluZ0ZvckFSTUZvcm1hdChBUk1Gb3JtYXQgZm9ybSkgeworI2RlZmluZSBFTlRSWShuLCB2KSBjYXNlIG46IHJldHVybiAjbjsKKyAgc3dpdGNoKGZvcm0pIHsKKyAgICBBUk1fRk9STUFUUworICBjYXNlIEFSTV9GT1JNQVRfTkE6CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICIiOworICB9CisjdW5kZWYgRU5UUlkKK30KKworLy8vIEV4cGFuZHMgb24gdGhlIGVudW0gZGVmaW5pdGlvbnMgZnJvbSBBUk1CYXNlSW5zdHJJbmZvLmguCisvLy8gVGhleSBhcmUgYmVpbmcgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLgorbmFtZXNwYWNlIEFSTUlJIHsKKyAgZW51bSB7CisgICAgTkVPTlJlZ01hc2sgPSAxNSwKKyAgICBHUFJSZWdNYXNrID0gMTUsCisgICAgTkVPTl9SZWdSZFNoaWZ0ID0gMTIsCisgICAgTkVPTl9EX0JpdFNoaWZ0ID0gMjIsCisgICAgTkVPTl9SZWdSblNoaWZ0ID0gMTYsCisgICAgTkVPTl9OX0JpdFNoaWZ0ID0gNywKKyAgICBORU9OX1JlZ1JtU2hpZnQgPSAwLAorICAgIE5FT05fTV9CaXRTaGlmdCA9IDUKKyAgfTsKK30KKworLy8vIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgW0Zyb20sIFRvXSBiaXRzIGZyb20gYSB1aW50MzJfdC4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2xpY2UodWludDMyX3QgQml0cywgdW5zaWduZWQgRnJvbSwgdW5zaWduZWQgVG8pIHsKKyAgYXNzZXJ0KEZyb20gPCAzMiAmJiBUbyA8IDMyICYmIEZyb20gPj0gVG8pOworICByZXR1cm4gKEJpdHMgPj4gVG8pICYgKCgxIDw8IChGcm9tIC0gVG8gKyAxKSkgLSAxKTsKK30KKworLy8vIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHNldHRpbmcgW0Zyb20sIFRvXSBiaXRzIHRvIFZhbCBmb3IgYSB1aW50MzJfdC4KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRTbGljZSh1aW50MzJfdCAmQml0cywgdW5zaWduZWQgRnJvbSwgdW5zaWduZWQgVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVmFsKSB7CisgIGFzc2VydChGcm9tIDwgMzIgJiYgVG8gPCAzMiAmJiBGcm9tID49IFRvKTsKKyAgdWludDMyX3QgTWFzayA9ICgoMSA8PCAoRnJvbSAtIFRvICsgMSkpIC0gMSk7CisgIEJpdHMgJj0gfihNYXNrIDw8IFRvKTsKKyAgQml0cyB8PSAoVmFsICYgTWFzaykgPDwgVG87Cit9CisKKy8vLyBWYXJpb3VzIHV0aWxpdGllcyBmb3IgY2hlY2tpbmcgdGhlIHRhcmdldCBzcGVjaWZpYyBmbGFncy4KKworLy8vIEEgdW5hcnkgZGF0YSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGRvZXNuJ3QgaGF2ZSBhbiBSbiBvcGVyYW5kLgorc3RhdGljIGlubGluZSBib29sIGlzVW5hcnlEUCh1aW50NjRfdCBUU0ZsYWdzKSB7CisgIHJldHVybiAoVFNGbGFncyAmIEFSTUlJOjpVbmFyeURQKTsKK30KKworLy8vIFRoaXMgZm91ci1iaXQgZmllbGQgZGVzY3JpYmVzIHRoZSBhZGRyZXNzaW5nIG1vZGUgdXNlZC4KKy8vLyBTZWUgYWxzbyBBUk1CYXNlSW5zdHJJbmZvLmguCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldEFkZHJNb2RlKHVpbnQ2NF90IFRTRmxhZ3MpIHsKKyAgcmV0dXJuIChUU0ZsYWdzICYgQVJNSUk6OkFkZHJNb2RlTWFzayk7Cit9CisKKy8vLyB7SW5kZXhNb2RlUHJlLCBJbmRleE1vZGVQb3N0fQorLy8vIE9ubHkgdmFsaWQgZm9yIGxvYWQgYW5kIHN0b3JlIG9wcy4KKy8vLyBTZWUgYWxzbyBBUk1CYXNlSW5zdHJJbmZvLmguCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldEluZGV4TW9kZSh1aW50NjRfdCBUU0ZsYWdzKSB7CisgIHJldHVybiAoVFNGbGFncyAmIEFSTUlJOjpJbmRleE1vZGVNYXNrKSA+PiBBUk1JSTo6SW5kZXhNb2RlU2hpZnQ7Cit9CisKKy8vLyBQcmUtL3Bvc3QtaW5kZXhlZCBvcGVyYXRpb25zIGRlZmluZSBhbiBleHRyYSAkYmFzZV93YiBpbiB0aGUgT3V0T3BlcmFuZExpc3QuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNQcmVQb3N0TGRTdCh1aW50NjRfdCBUU0ZsYWdzKSB7CisgIHJldHVybiAoVFNGbGFncyAmIEFSTUlJOjpJbmRleE1vZGVNYXNrKSAhPSAwOworfQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uLgorY2xhc3MgQVJNQmFzaWNNQ0J1aWxkZXI7CisKKy8vIEJ1aWxkZXIgT2JqZWN0IGlzIG1vc3RseSBpZ25vcmVkIGV4Y2VwdCBpbiBzb21lIFRodW1iIGRpc2Fzc2VtYmxlIGZ1bmN0aW9ucy4KK3R5cGVkZWYgQVJNQmFzaWNNQ0J1aWxkZXIgKkJPOworCisvLy8gRGlzYXNzZW1ibGVGUCAtIERpc2Fzc2VtYmxlRlAgcG9pbnRzIHRvIGEgZnVuY3Rpb24gdGhhdCBkaXNhc3NlbWJsZXMgYW4gaW5zbgorLy8vIGFuZCBidWlsZHMgdGhlIE1DT3BlcmFuZCBsaXN0IHVwb24gZGlzYXNzZW1ibHkuICBJdCByZXR1cm5zIGZhbHNlIG9uIGZhaWx1cmUKKy8vLyBvciB0cnVlIG9uIHN1Y2Nlc3MuICBUaGUgbnVtYmVyIG9mIG9wZXJhbmRzIGFkZGVkIGlzIHVwZGF0ZWQgdXBvbiBzdWNjZXNzLgordHlwZWRlZiBib29sICgqRGlzYXNzZW1ibGVGUCkoTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCdWlsZGVyKTsKKworLy8vIENyZWF0ZU1DQnVpbGRlciAtIFJldHVybiBhbiBBUk1CYXNpY01DQnVpbGRlciB0aGF0IGNhbiBidWlsZCB1cCB0aGUgTUMKKy8vLyBpbmZyYXN0cnVjdHVyZSBvZiBhbiBNQ0luc3QgZ2l2ZW4gdGhlIE9wY29kZSBhbmQgRm9ybWF0IG9mIHRoZSBpbnN0ci4KKy8vLyBSZXR1cm4gTlVMTCBpZiBpdCBmYWlscyB0byBjcmVhdGUvcmV0dXJuIGEgcHJvcGVyIGJ1aWxkZXIuICBBUEkgY2xpZW50cworLy8vIGFyZSByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB1cCBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gIENhY2hlaW5nIGNhbiBiZQorLy8vIHBlcmZvcm1lZCBieSB0aGUgQVBJIGNsaWVudHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KK2V4dGVybiBBUk1CYXNpY01DQnVpbGRlciAqQ3JlYXRlTUNCdWlsZGVyKHVuc2lnbmVkIE9wY29kZSwgQVJNRm9ybWF0IEZvcm1hdCk7CisKKy8vLyBBUk1CYXNpY01DQnVpbGRlciAtIEFSTUJhc2ljTUNCdWlsZGVyIHJlcHJlc2VudHMgYW4gQVJNIE1DSW5zdCBidWlsZGVyIHRoYXQKKy8vLyBrbm93cyBob3cgdG8gYnVpbGQgdXAgdGhlIE1DT3BlcmFuZCBsaXN0LgorY2xhc3MgQVJNQmFzaWNNQ0J1aWxkZXIgeworICBmcmllbmQgQVJNQmFzaWNNQ0J1aWxkZXIgKkNyZWF0ZU1DQnVpbGRlcih1bnNpZ25lZCBPcGNvZGUsIEFSTUZvcm1hdCBGb3JtYXQpOworICB1bnNpZ25lZCBPcGNvZGU7CisgIEFSTUZvcm1hdCBGb3JtYXQ7CisgIHVuc2lnbmVkIHNob3J0IE51bU9wczsKKyAgRGlzYXNzZW1ibGVGUCBEaXNhc207CisgIFNlc3Npb24gKlNQOworICBpbnQgRXJyOyAvLyAhPTAgaWYgdGhlIGJ1aWxkZXIgZW5jb3VudGVycyBzb21lIGVycm9yIGNvbmRpdGlvbiBkdXJpbmcgYnVpbGQuCisKK3ByaXZhdGU6CisgIC8vLyBPcGNvZGUsIEZvcm1hdCwgYW5kIE51bU9wZXJhbmRzIG1ha2UgdXAgYW4gQVJNIEJhc2ljIE1DQnVpbGRlci4KKyAgQVJNQmFzaWNNQ0J1aWxkZXIodW5zaWduZWQgb3BjLCBBUk1Gb3JtYXQgZm9ybWF0LCB1bnNpZ25lZCBzaG9ydCBudW0pOworCitwdWJsaWM6CisgIEFSTUJhc2ljTUNCdWlsZGVyKEFSTUJhc2ljTUNCdWlsZGVyICZCKQorICAgIDogT3Bjb2RlKEIuT3Bjb2RlKSwgRm9ybWF0KEIuRm9ybWF0KSwgTnVtT3BzKEIuTnVtT3BzKSwgRGlzYXNtKEIuRGlzYXNtKSwKKyAgICAgIFNQKEIuU1ApIHsKKyAgICBFcnIgPSAwOworICB9CisKKyAgdmlydHVhbCB+QVJNQmFzaWNNQ0J1aWxkZXIoKSB7fQorCisgIHZvaWQgU2V0U2Vzc2lvbihTZXNzaW9uICpzcCkgeworICAgIFNQID0gc3A7CisgIH0KKworICB2b2lkIFNldEVycihpbnQgRXJyQ29kZSkgeworICAgIEVyciA9IEVyckNvZGU7CisgIH0KKworICAvLy8gRG9QcmVkaWNhdGVPcGVyYW5kcyAtIERvUHJlZGljYXRlT3BlcmFuZHMgcHJvY2VzcyB0aGUgcHJlZGljYXRlIG9wZXJhbmRzCisgIC8vLyBvZiBzb21lIFRodW1iIGluc3RydWN0aW9ucyB3aGljaCBjb21lIGJlZm9yZSB0aGUgcmVnbGlzdCBvcGVyYW5kcy4gIEl0CisgIC8vLyByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBwcmVkaWNhdGUgb3BlcmFuZHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KKyAgYm9vbCBEb1ByZWRpY2F0ZU9wZXJhbmRzKE1DSW5zdCYgTUksIHVuc2lnbmVkIE9wY29kZSwKKyAgICAgIHVpbnQzMl90IGluc24sIHVuc2lnbmVkIHNob3J0IE51bU9wc1JlbWFuaW5nKTsKKyAgCisgIC8vLyBUcnlQcmVkaWNhdGVBbmRTQml0TW9kaWZpZXIgLSBUcnlQcmVkaWNhdGVBbmRTQml0TW9kaWZpZXIgdHJpZXMgdG8gcHJvY2VzcworICAvLy8gdGhlIHBvc3NpYmxlIFByZWRpY2F0ZSBhbmQgU0JpdE1vZGlmaWVyLCB0byBidWlsZCB0aGUgcmVtYWluaW5nIE1DT3BlcmFuZAorICAvLy8gY29uc3RpdHVlbnRzLgorICBib29sIFRyeVByZWRpY2F0ZUFuZFNCaXRNb2RpZmllcihNQ0luc3QmIE1JLCB1bnNpZ25lZCBPcGNvZGUsCisgICAgICB1aW50MzJfdCBpbnNuLCB1bnNpZ25lZCBzaG9ydCBOdW1PcHNSZW1hbmluZyk7CisKKyAgLy8vIEluSVRCbG9jayAtIEluSVRCbG9jayByZXR1cm5zIHRydWUgaWYgd2UgYXJlIGluc2lkZSBhbiBJVCBibG9jay4KKyAgYm9vbCBJbklUQmxvY2soKSB7CisgICAgaWYgKFNQKQorICAgICAgcmV0dXJuIFNQLT5JVENvdW50ZXIgPiAwOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEJ1aWxkIC0gQnVpbGQgZGVsZWdhdGVzIHRvIEJ1aWxkSXQgdG8gcGVyZm9ybSB0aGUgaGVhdnkgbGlmdGxpbmcuICBBZnRlcgorICAvLy8gdGhhdCwgaXQgaW52b2tlcyBSdW5CdWlsZEFmdGVySG9vayB3aGVyZSBzb21lIGhvdXNla2VlcGluZ3MgY2FuIGJlIGRvbmUuCisgIHZpcnR1YWwgYm9vbCBCdWlsZChNQ0luc3QgJk1JLCB1aW50MzJfdCBpbnNuKSB7CisgICAgYm9vbCBTdGF0dXMgPSBCdWlsZEl0KE1JLCBpbnNuKTsKKyAgICByZXR1cm4gUnVuQnVpbGRBZnRlckhvb2soU3RhdHVzLCBNSSwgaW5zbik7CisgIH0KKworICAvLy8gQnVpbGRJdCAtIEJ1aWxkSXQgcGVyZm9ybXMgdGhlIGJ1aWxkIHN0ZXAgZm9yIHRoaXMgQVJNIEJhc2ljIE1DIEJ1aWxkZXIuCisgIC8vLyBUaGUgZ2VuZXJhbCBpZGVhIGlzIHRvIHNldCB0aGUgT3Bjb2RlIGZvciB0aGUgTUNJbnN0LCBmb2xsb3dlZCBieSBhZGRpbmcKKyAgLy8vIHRoZSBhcHByb3ByaWF0ZSBNQ09wZXJhbmRzIHRvIHRoZSBNQ0luc3QuICBBUk0gQmFzaWMgTUMgQnVpbGRlciBkZWxlZ2F0ZXMKKyAgLy8vIHRvIHRoZSBGb3JtYXQtc3BlY2lmaWMgZGlzYXNzZW1ibGUgZnVuY3Rpb24gZm9yIGRpc2Fzc2VtYmx5LCBmb2xsb3dlZCBieQorICAvLy8gVHJ5UHJlZGljYXRlQW5kU0JpdE1vZGlmaWVyKCkgZm9yIFByZWRpY2F0ZU9wZXJhbmQgYW5kIE9wdGlvbmFsRGVmT3BlcmFuZAorICAvLy8gd2hpY2ggZm9sbG93IHRoZSBEc3QvU3JjIE9wZXJhbmRzLgorICB2aXJ0dWFsIGJvb2wgQnVpbGRJdChNQ0luc3QgJk1JLCB1aW50MzJfdCBpbnNuKTsKKworICAvLy8gUnVuQnVpbGRBZnRlckhvb2sgLSBSdW5CdWlsZEFmdGVySG9vayBwZXJmb3JtcyBvcGVyYXRpb25zIGRlZW1lZCBuZWNlc3NhcnkKKyAgLy8vIGFmdGVyIEJ1aWxkSXQgaXMgZmluaXNoZWQuCisgIHZpcnR1YWwgYm9vbCBSdW5CdWlsZEFmdGVySG9vayhib29sIFN0YXR1cywgTUNJbnN0ICZNSSwgdWludDMyX3QgaW5zbik7CisKK3ByaXZhdGU6CisgIC8vLyBHZXQgY29uZGl0aW9uIG9mIHRoZSBjdXJyZW50IElUIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBHZXRJVENvbmQoKSB7CisgICAgYXNzZXJ0KFNQKTsKKyAgICByZXR1cm4gc2xpY2UoU1AtPklUU3RhdGUsIDcsIDQpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMWI2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9EaXNhc3NlbWJsZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIyM9PT0tIGxpYi9UYXJnZXQvQVJNL0Rpc2Fzc2VtYmxlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNQVJNRGlzYXNzZW1ibGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBhcm0gdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQRkxBR1MgPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL1RodW1iRGlzYXNzZW1ibGVyQ29yZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vRGlzYXNzZW1ibGVyL1RodW1iRGlzYXNzZW1ibGVyQ29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZGIxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9EaXNhc3NlbWJsZXIvVGh1bWJEaXNhc3NlbWJsZXJDb3JlLmgKQEAgLTAsMCArMSwyMjU5IEBACisvLz09PS0gVGh1bWJEaXNhc3NlbWJsZXJDb3JlLmggLSBUaHVtYiBkaXNhc3NlbWJsZXIgaGVscGVycyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBUk0gRGlzYXNzZW1ibGVyLgorLy8gSXQgY29udGFpbnMgY29kZSBmb3IgZGlzYXNzZW1ibGluZyBhIFRodW1iIGluc3RyLiAgSXQgaXMgdG8gYmUgaW5jbHVkZWQgYnkKKy8vIEFSTURpc2Fzc2VtYmxlckNvcmUuY3BwIGJlY2F1c2UgaXQgY29udGFpbnMgdGhlIHN0YXRpYyBEaXNhc3NlbWJsZVRodW1iRnJtKCkKKy8vIGZ1bmN0aW9uIHdoaWNoIGFjdHMgYXMgdGhlIGRpc3BhdGNoZXIgdG8gZGlzYXNzZW1ibGUgYSBUaHVtYiBpbnN0cnVjdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgVXRpbGl0eSBGdW5jdGlvbnMgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFV0aWxpdGllcyBmb3IgMTYtYml0IFRodW1iIGluc3RydWN0aW9ucy4KKy8qCisxNSAxNCAxMyAxMiAxMSAxMCAgOSAgOCAgNyAgNiAgNSAgNCAgMyAgMiAgMSAgMAorICAgICAgICAgICAgICAgWyAgdFJ0IF0KKyAgICAgICAgICAgICAgICAgICAgICBbIHRSbSBdICBbIHRSbiBdICBbIHRSZCBdCisgICAgICAgICAgICAgICAgICAgICAgICAgRCAgWyAgIFJtICAgXSAgWyAgUmQgXQorCisgICAgICAgICAgICAgICAgICAgICAgWyBpbW0zXQorICAgICAgICAgICAgICAgWyAgICBpbW01ICAgIF0KKyAgICAgICAgICAgICAgICAgICBpICAgICBbICAgIGltbTUgICBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAgICAgICBpbW03ICAgICAgXQorICAgICAgICAgICAgICAgICAgICAgICAgIFsgICAgICAgaW1tOCAgICAgICAgIF0KKyAgICAgICAgICAgICAgIFsgICAgICAgICAgICAgaW1tMTEgICAgICAgICAgICBdCisKKyAgICAgICAgICAgIFsgICBjb25kICBdCisqLworCisvLyBFeHRyYWN0IHRSdDogSW5zdHsxMC04fS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0VDF0UnQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgMTAsIDgpOworfQorCisvLyBFeHRyYWN0IHRSbTogSW5zdHs4LTZ9Lgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRUMXRSbSh1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiBzbGljZShpbnNuLCA4LCA2KTsKK30KKworLy8gRXh0cmFjdCB0Um46IEluc3R7NS0zfS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0VDF0Um4odWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgNSwgMyk7Cit9CisKKy8vIEV4dHJhY3QgdFJkOiBJbnN0ezItMH0uCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFQxdFJkKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIHNsaWNlKGluc24sIDIsIDApOworfQorCisvLyBFeHRyYWN0IFtEOlJkXTogSW5zdHs3OjItMH0uCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFQxUmQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgNywgNykgPDwgMyB8IHNsaWNlKGluc24sIDIsIDApOworfQorCisvLyBFeHRyYWN0IFJtOiBJbnN0ezYtM30uCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFQxUm0odWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgNiwgMyk7Cit9CisKKy8vIEV4dHJhY3QgaW1tMzogSW5zdHs4LTZ9Lgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRUMUltbTModWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgOCwgNik7Cit9CisKKy8vIEV4dHJhY3QgaW1tNTogSW5zdHsxMC02fS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0VDFJbW01KHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIHNsaWNlKGluc24sIDEwLCA2KTsKK30KKworLy8gRXh0cmFjdCBpOmltbTU6IEluc3R7OTo3LTN9Lgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRUMUltbTYodWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgOSwgOSkgPDwgNSB8IHNsaWNlKGluc24sIDcsIDMpOworfQorCisvLyBFeHRyYWN0IGltbTc6IEluc3R7Ni0wfS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0VDFJbW03KHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIHNsaWNlKGluc24sIDYsIDApOworfQorCisvLyBFeHRyYWN0IGltbTg6IEluc3R7Ny0wfS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0VDFJbW04KHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIHNsaWNlKGluc24sIDcsIDApOworfQorCisvLyBFeHRyYWN0IGltbTExOiBJbnN0ezEwLTB9Lgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRUMUltbTExKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIHNsaWNlKGluc24sIDEwLCAwKTsKK30KKworLy8gRXh0cmFjdCBjb25kOiBJbnN0ezExLTh9Lgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRUMUNvbmQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgMTEsIDgpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgSXNHUFIodW5zaWduZWQgUmVnQ2xhc3MpIHsKKyAgcmV0dXJuIFJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCB8fCBSZWdDbGFzcyA9PSBBUk06OnJHUFJSZWdDbGFzc0lEOworfQorCisvLyBVdGlsaXRpZXMgZm9yIDMyLWJpdCBUaHVtYiBpbnN0cnVjdGlvbnMuCisKKy8vIEV4dHJhY3QgaW1tNDogSW5zdHsxOS0xNn0uCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldEltbTQodWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgMTksIDE2KTsKK30KKworLy8gRXh0cmFjdCBpbW0zOiBJbnN0ezE0LTEyfS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0SW1tMyh1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiBzbGljZShpbnNuLCAxNCwgMTIpOworfQorCisvLyBFeHRyYWN0IGltbTg6IEluc3R7Ny0wfS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0SW1tOCh1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiBzbGljZShpbnNuLCA3LCAwKTsKK30KKworLy8gQTguNi42MSBMRFJCIChpbW1lZGlhdGUsIFRodW1iKSBhbmQgZnJpZW5kcworLy8gKy8tOiBJbnN0ezl9CisvLyBpbW04OiBJbnN0ezctMH0KK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZUltbTgodWludDMyX3QgaW5zbikgeworICBpbnQgT2Zmc2V0ID0gZ2V0SW1tOChpbnNuKTsKKyAgcmV0dXJuIHNsaWNlKGluc24sIDksIDkpID8gT2Zmc2V0IDogLU9mZnNldDsKK30KKworLy8gRXh0cmFjdCBpbW0xMjogSW5zdHsxMS0wfS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0SW1tMTIodWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgMTEsIDApOworfQorCisvLyBBOC42LjYzIExEUkIgKGxpdGVyYWwpIGFuZCBmcmllbmRzCisvLyArLy06IEluc3R7MjN9CisvLyBpbW0xMjogSW5zdHsxMS0wfQorc3RhdGljIGlubGluZSBpbnQgZGVjb2RlSW1tMTIodWludDMyX3QgaW5zbikgeworICBpbnQgT2Zmc2V0ID0gZ2V0SW1tMTIoaW5zbik7CisgIHJldHVybiBzbGljZShpbnNuLCAyMywgMjMpID8gT2Zmc2V0IDogLU9mZnNldDsKK30KKworLy8gRXh0cmFjdCBpbW0yOiBJbnN0ezctNn0uCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldEltbTIodWludDMyX3QgaW5zbikgeworICByZXR1cm4gc2xpY2UoaW5zbiwgNywgNik7Cit9CisKKy8vIEZvciBCRkksIEJGQywgdDJTQkZYLCBhbmQgdDJVQkZYLgorLy8gRXh0cmFjdCBsc2I6IEluc3R7MTQtMTI6Ny02fS4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0THNiKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIGdldEltbTMoaW5zbikgPDwgMiB8IGdldEltbTIoaW5zbik7Cit9CisKKy8vIEZvciBCRkkgYW5kIEJGQy4KKy8vIEV4dHJhY3QgbXNiOiBJbnN0ezQtMH0uCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldE1zYih1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiBzbGljZShpbnNuLCA0LCAwKTsKK30KKworLy8gRm9yIHQyU0JGWCBhbmQgdDJVQkZYLgorLy8gRXh0cmFjdCB3aWR0aG1pbnVzMTogSW5zdHs0LTB9Lgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRXaWR0aE1pbnVzMSh1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiBzbGljZShpbnNuLCA0LCAwKTsKK30KKworLy8gRm9yIHQyQUREcmkxMiBhbmQgdDJTVUJyaTEyLgorLy8gaW1tMTIgPSBpOmltbTM6aW1tODsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0SUltbTNJbW04KHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIHNsaWNlKGluc24sIDI2LCAyNikgPDwgMTEgfCBnZXRJbW0zKGluc24pIDw8IDggfCBnZXRJbW04KGluc24pOworfQorCisvLyBGb3IgdDJNT1ZpMTYgYW5kIHQyTU9WVGkxNi4KKy8vIGltbTE2ID0gaW1tNDppOmltbTM6aW1tODsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0SW1tMTYodWludDMyX3QgaW5zbikgeworICByZXR1cm4gZ2V0SW1tNChpbnNuKSA8PCAxMiB8IHNsaWNlKGluc24sIDI2LCAyNikgPDwgMTEgfAorICAgIGdldEltbTMoaW5zbikgPDwgOCB8IGdldEltbTgoaW5zbik7Cit9CisKKy8vIEluc3R7NS00fSBlbmNvZGVzIHRoZSBzaGlmdCB0eXBlLgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRTaGlmdFR5cGVCaXRzKHVpbnQzMl90IGluc24pIHsKKyAgcmV0dXJuIHNsaWNlKGluc24sIDUsIDQpOworfQorCisvLyBJbnN0ezE0LTEyfTpJbnN0ezctNn0gZW5jb2RlcyB0aGUgaW1tNSBzaGlmdCBhbW91bnQuCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFNoaWZ0QW10Qml0cyh1aW50MzJfdCBpbnNuKSB7CisgIHJldHVybiBnZXRJbW0zKGluc24pIDw8IDIgfCBnZXRJbW0yKGluc24pOworfQorCisvLyBBOC42LjE3IEJGQworLy8gRW5jb2RpbmcgVDEgQVJNdjZUMiwgQVJNdjcKKy8vIExMVk0tc3BlY2lmaWMgZW5jb2RpbmcgZm9yICM8bHNiPiBhbmQgIzx3aWR0aD4KK3N0YXRpYyBpbmxpbmUgYm9vbCBnZXRCaXRmaWVsZEludk1hc2sodWludDMyX3QgaW5zbiwgdWludDMyX3QgJm1hc2spIHsKKyAgdWludDMyX3QgbHNiID0gZ2V0SW1tMyhpbnNuKSA8PCAyIHwgZ2V0SW1tMihpbnNuKTsKKyAgdWludDMyX3QgbXNiID0gZ2V0TXNiKGluc24pOworICB1aW50MzJfdCBWYWwgPSAwOworICBpZiAobXNiIDwgbHNiKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJFbmNvZGluZyBlcnJvcjogbXNiIDwgbHNiXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yICh1aW50MzJfdCBpID0gbHNiOyBpIDw9IG1zYjsgKytpKQorICAgIFZhbCB8PSAoMSA8PCBpKTsKKyAgbWFzayA9IH5WYWw7CisgIHJldHVybiB0cnVlOworfQorCisvLyBBOC40IFNoaWZ0cyBhcHBsaWVkIHRvIGEgcmVnaXN0ZXIKKy8vIEE4LjQuMSBDb25zdGFudCBzaGlmdHMKKy8vIEE4LjQuMyBQc2V1ZG9jb2RlIGRldGFpbHMgb2YgaW5zdHJ1Y3Rpb24tc3BlY2lmaWVkIHNoaWZ0cyBhbmQgcm90YXRlcworLy8KKy8vIGRlY29kZUltbVNoaWZ0KCkgcmV0dXJucyB0aGUgc2hpZnQgYW1vdW50IGFuZCB0aGUgdGhlIHNoaWZ0IG9wY29kZS4KKy8vIE5vdGUgdGhhdCwgYXMgb2YgSmFuLTA2LTIwMTAsIExMVk0gZG9lcyBub3Qgc3VwcG9ydCBycnggc2hpZnRlZCBvcGVyYW5kcyB5ZXQuCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRlY29kZUltbVNoaWZ0KHVuc2lnbmVkIGJpdHMyLCB1bnNpZ25lZCBpbW01LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1fQU06OlNoaWZ0T3BjICZTaE9wKSB7CisKKyAgYXNzZXJ0KGltbTUgPCAzMiAmJiAiSW52YWxpZCBpbW01IGFyZ3VtZW50Iik7CisgIHN3aXRjaCAoYml0czIpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIk5vIHN1Y2ggdmFsdWUiKTsKKyAgY2FzZSAwOgorICAgIFNoT3AgPSBBUk1fQU06OmxzbDsKKyAgICByZXR1cm4gaW1tNTsKKyAgY2FzZSAxOgorICAgIFNoT3AgPSBBUk1fQU06OmxzcjsKKyAgICByZXR1cm4gKGltbTUgPT0gMCA/IDMyIDogaW1tNSk7CisgIGNhc2UgMjoKKyAgICBTaE9wID0gQVJNX0FNOjphc3I7CisgICAgcmV0dXJuIChpbW01ID09IDAgPyAzMiA6IGltbTUpOworICBjYXNlIDM6CisgICAgU2hPcCA9IChpbW01ID09IDAgPyBBUk1fQU06OnJyeCA6IEFSTV9BTTo6cm9yKTsKKyAgICByZXR1cm4gKGltbTUgPT0gMCA/IDEgOiBpbW01KTsKKyAgfQorfQorCisvLyBBNi4zLjIgTW9kaWZpZWQgaW1tZWRpYXRlIGNvbnN0YW50cyBpbiBUaHVtYiBpbnN0cnVjdGlvbnMKKy8vCisvLyBUaHVtYkV4cGFuZEltbSgpIHJldHVybnMgdGhlIG1vZGlmaWVkIGltbWVkaWF0ZSBjb25zdGFudCBnaXZlbiBhbiBpbW0xMiBmb3IKKy8vIFRodW1iIGRhdGEtcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgd2l0aCBtb2RpZmllZCBpbW1lZGlhdGUuCisvLyBTZWUgYWxzbyBBNi4zLjEgRGF0YS1wcm9jZXNzaW5nIChtb2RpZmllZCBpbW1lZGlhdGUpLgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBUaHVtYkV4cGFuZEltbSh1bnNpZ25lZCBpbW0xMikgeworICBhc3NlcnQoaW1tMTIgPD0gMHhGRkYgJiYgIkludmFsaWQgaW1tMTIgYXJndW1lbnQiKTsKKworICAvLyBJZiB0aGUgbGVhZGluZyB0d28gYml0cyBpcyAwYjAwLCB0aGUgbW9kaWZpZWQgaW1tZWRpYXRlIGNvbnN0YW50IGlzCisgIC8vIG9idGFpbmVkIGJ5IHNwbGF0dGluZyB0aGUgbG93IDggYml0cyBpbnRvIHRoZSBmaXJzdCBieXRlLCBldmVyeSBvdGhlciBieXRlLAorICAvLyBvciBldmVyeSBieXRlIG9mIGEgMzItYml0IHZhbHVlLgorICAvLworICAvLyBPdGhlcndpc2UsIGEgcm90YXRlIHJpZ2h0IG9mICcxJzppbW0xMjw2OjA+IGJ5IHRoZSBhbW91bnQgaW1tMTI8MTE6Nz4gaXMKKyAgLy8gcGVyZm9ybWVkLgorCisgIGlmIChzbGljZShpbW0xMiwgMTEsIDEwKSA9PSAwKSB7CisgICAgdW5zaWduZWQgc2hvcnQgY29udHJvbCA9IHNsaWNlKGltbTEyLCA5LCA4KTsKKyAgICB1bnNpZ25lZCBpbW04ID0gc2xpY2UoaW1tMTIsIDcsIDApOworICAgIHN3aXRjaCAoY29udHJvbCkgeworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoMCAmJiAiTm8gc3VjaCB2YWx1ZSIpOworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIGltbTg7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIGltbTggPDwgMTYgfCBpbW04OworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiBpbW04IDw8IDI0IHwgaW1tOCA8PCA4OworICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiBpbW04IDw8IDI0IHwgaW1tOCA8PCAxNiB8IGltbTggPDwgOCB8IGltbTg7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIEEgcm90YXRlIGlzIHJlcXVpcmVkLgorICAgIHVuc2lnbmVkIFZhbCA9IDEgPDwgNyB8IHNsaWNlKGltbTEyLCA2LCAwKTsKKyAgICB1bnNpZ25lZCBBbXQgPSBzbGljZShpbW0xMiwgMTEsIDcpOworICAgIHJldHVybiBBUk1fQU06OnJvdHIzMihWYWwsIEFtdCk7CisgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlSW1tMzJfQl9FbmNvZGluZ1QzKHVpbnQzMl90IGluc24pIHsKKyAgYm9vbCBTID0gc2xpY2UoaW5zbiwgMjYsIDI2KTsKKyAgYm9vbCBKMSA9IHNsaWNlKGluc24sIDEzLCAxMyk7CisgIGJvb2wgSjIgPSBzbGljZShpbnNuLCAxMSwgMTEpOworICB1bnNpZ25lZCBJbW0yMSA9IHNsaWNlKGluc24sIDIxLCAxNikgPDwgMTIgfCBzbGljZShpbnNuLCAxMCwgMCkgPDwgMTsKKyAgaWYgKFMpIEltbTIxIHw9IDEgPDwgMjA7CisgIGlmIChKMikgSW1tMjEgfD0gMSA8PCAxOTsKKyAgaWYgKEoxKSBJbW0yMSB8PSAxIDw8IDE4OworCisgIHJldHVybiBTaWduRXh0ZW5kMzI8MjE+KEltbTIxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlSW1tMzJfQl9FbmNvZGluZ1Q0KHVpbnQzMl90IGluc24pIHsKKyAgdW5zaWduZWQgUyA9IHNsaWNlKGluc24sIDI2LCAyNik7CisgIGJvb2wgSTEgPSBzbGljZShpbnNuLCAxMywgMTMpID09IFM7CisgIGJvb2wgSTIgPSBzbGljZShpbnNuLCAxMSwgMTEpID09IFM7CisgIHVuc2lnbmVkIEltbTI1ID0gc2xpY2UoaW5zbiwgMjUsIDE2KSA8PCAxMiB8IHNsaWNlKGluc24sIDEwLCAwKSA8PCAxOworICBpZiAoUykgSW1tMjUgfD0gMSA8PCAyNDsKKyAgaWYgKEkxKSBJbW0yNSB8PSAxIDw8IDIzOworICBpZiAoSTIpIEltbTI1IHw9IDEgPDwgMjI7CisKKyAgcmV0dXJuIFNpZ25FeHRlbmQzMjwyNT4oSW1tMjUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVJbW0zMl9CTCh1aW50MzJfdCBpbnNuKSB7CisgIHVuc2lnbmVkIFMgPSBzbGljZShpbnNuLCAyNiwgMjYpOworICBib29sIEkxID0gc2xpY2UoaW5zbiwgMTMsIDEzKSA9PSBTOworICBib29sIEkyID0gc2xpY2UoaW5zbiwgMTEsIDExKSA9PSBTOworICB1bnNpZ25lZCBJbW0yNSA9IHNsaWNlKGluc24sIDI1LCAxNikgPDwgMTIgfCBzbGljZShpbnNuLCAxMCwgMCkgPDwgMTsKKyAgaWYgKFMpIEltbTI1IHw9IDEgPDwgMjQ7CisgIGlmIChJMSkgSW1tMjUgfD0gMSA8PCAyMzsKKyAgaWYgKEkyKSBJbW0yNSB8PSAxIDw8IDIyOworCisgIHJldHVybiBTaWduRXh0ZW5kMzI8MjU+KEltbTI1KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlSW1tMzJfQkxYKHVpbnQzMl90IGluc24pIHsKKyAgdW5zaWduZWQgUyA9IHNsaWNlKGluc24sIDI2LCAyNik7CisgIGJvb2wgSTEgPSBzbGljZShpbnNuLCAxMywgMTMpID09IFM7CisgIGJvb2wgSTIgPSBzbGljZShpbnNuLCAxMSwgMTEpID09IFM7CisgIHVuc2lnbmVkIEltbTI1ID0gc2xpY2UoaW5zbiwgMjUsIDE2KSA8PCAxMiB8IHNsaWNlKGluc24sIDEwLCAxKSA8PCAyOworICBpZiAoUykgSW1tMjUgfD0gMSA8PCAyNDsKKyAgaWYgKEkxKSBJbW0yNSB8PSAxIDw8IDIzOworICBpZiAoSTIpIEltbTI1IHw9IDEgPDwgMjI7CisKKyAgcmV0dXJuIFNpZ25FeHRlbmQzMjwyNT4oSW1tMjUpOworfQorCisvLyBTZWUsIGZvciBleGFtcGxlLCBBOC42LjIyMSBTWFRBQjE2Lgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBkZWNvZGVSb3RhdGUodWludDMyX3QgaW5zbikgeworICB1bnNpZ25lZCByb3RhdGUgPSBzbGljZShpbnNuLCA1LCA0KTsKKyAgcmV0dXJuIHJvdGF0ZSA8PCAzOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vIFRodW1iMSBpbnN0cnVjdGlvbiBkaXNhc3NlbWJseSBmdW5jdGlvbnMuIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gU2VlICJVdGlsaXRpZXMgZm9yIDE2LWJpdCBUaHVtYiBpbnN0cnVjdGlvbnMiIGZvciByZWdpc3RlciBuYW1pbmcgY29udmVudGlvbi4KKworLy8gQTYuMi4xIFNoaWZ0IChpbW1lZGlhdGUpLCBhZGQsIHN1YnRyYWN0LCBtb3ZlLCBhbmQgY29tcGFyZQorLy8KKy8vIHNoaWZ0IGltbWVkaWF0ZTogICAgICAgICB0UmQgQ1BTUiB0Um4gaW1tNQorLy8gYWRkL3N1YiByZWdpc3RlcjogICAgICAgIHRSZCBDUFNSIHRSbiB0Um0KKy8vIGFkZC9zdWIgMy1iaXQgaW1tZWRpYXRlOiB0UmQgQ1BTUiB0Um4gaW1tMworLy8gYWRkL3N1YiA4LWJpdCBpbW1lZGlhdGU6IHRSdCBDUFNSIHRSdChUSUVEX1RPKSBpbW04CisvLyBtb3YvY21wIGltbWVkaWF0ZTogICAgICAgdFJ0IFtDUFNSXSBpbW04IChDUFNSIHByZXNlbnQgZm9yIG1vdikKKy8vCisvLyBTcGVjaWFsIGNhc2U6CisvLyB0TU9WU3I6ICAgICAgICAgICAgICAgICAgdFJkIHRSbgorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVUaHVtYjFHZW5lcmFsKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgT3BJZHggPSAwOworCisgIGFzc2VydChOdW1PcHMgPj0gMiAmJiBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjp0R1BSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgIkludmFsaWQgYXJndW1lbnRzIik7CisKKyAgYm9vbCBJbW0zID0gKE9wY29kZSA9PSBBUk06OnRBRERpMyB8fCBPcGNvZGUgPT0gQVJNOjp0U1VCaTMpOworCisgIC8vIFVzZSBSdCBpbXBsaWVzIHVzZSBpbW04LgorICBib29sIFVzZVJ0ID0gKE9wY29kZSA9PSBBUk06OnRBRERpOCB8fCBPcGNvZGUgPT0gQVJNOjp0U1VCaTggfHwKKyAgICAgICAgICAgICAgICBPcGNvZGUgPT0gQVJNOjp0TU9WaTggfHwgT3Bjb2RlID09IEFSTTo6dENNUGk4KTsKKworICAvLyBBZGQgdGhlIGRlc3RpbmF0aW9uIG9wZXJhbmQuCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoCisgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjp0R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VSdCA/IGdldFQxdFJ0KGluc24pIDogZ2V0VDF0UmQoaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgbmV4dCBvcGVyYW5kIHRvIGJlIGFkZGVkIGlzIGEgQ0NSIFJlZ2lzdGVyLgorICBpZiAoT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBBUk06OkNDUlJlZ0NsYXNzSUQpIHsKKyAgICBhc3NlcnQoT3BJbmZvW09wSWR4XS5pc09wdGlvbmFsRGVmKCkgJiYgIk9wdGlvbmFsIGRlZiBvcGVyYW5kIGV4cGVjdGVkIik7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhCLT5JbklUQmxvY2soKSA/IDAgOiBBUk06OkNQU1IpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgbmV4dCBvcGVyYW5kIHRvIGJlIGFkZGVkIGlzIGEgVGh1bWIxIFJlZ2lzdGVyLgorICBhc3NlcnQoT3BJZHggPCBOdW1PcHMgJiYgIk1vcmUgb3BlcmFuZHMgZXhwZWN0ZWQiKTsKKyAgaWYgKE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjp0R1BSUmVnQ2xhc3NJRCkgeworICAgIC8vIEZvciBVc2VSdCwgdGhlIHJlZyBvcGVyYW5kIGlzIHRpZWQgdG8gdGhlIGZpcnN0IHJlZyBvcGVyYW5kLgorICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoCisgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyRW51bShCLCBBUk06OnRHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlUnQgPyBnZXRUMXRSdChpbnNuKSA6IGdldFQxdFJuKGluc24pKSkpOworICAgICsrT3BJZHg7CisgIH0KKworICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRNT1ZTci4KKyAgaWYgKE9wSWR4ID09IE51bU9wcykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBUaGUgbmV4dCBhdmFpbGFibGUgb3BlcmFuZCBpcyBlaXRoZXIgYSByZWcgb3BlcmFuZCBvciBhbiBpbW0gb3BlcmFuZC4KKyAgaWYgKE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjp0R1BSUmVnQ2xhc3NJRCkgeworICAgIC8vIFRocmVlIHJlZ2lzdGVyIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLgorICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6dEdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VDF0Um0oaW5zbikpKSk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPCAwICYmCisgICAgICAgICAgICFPcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkgJiYgIU9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpCisgICAgICAgICAgICYmICJQdXJlIGltbSBvcGVyYW5kIGV4cGVjdGVkIik7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShVc2VSdCA/IGdldFQxSW1tOChpbnNuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoSW1tMyA/IGdldFQxSW1tMyhpbnNuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFQxSW1tNShpbnNuKSkpKTsKKyAgfQorICArK09wSWR4OworCisgIHJldHVybiB0cnVlOworfQorCisvLyBBNi4yLjIgRGF0YS1wcm9jZXNzaW5nCisvLworLy8gdENNUHIsIHRUU1QsIHRDTU46IHRSZCB0Um4KKy8vIHRNVk4sIHRSU0I6ICAgICAgICB0UmQgQ1BTUiB0Um4KKy8vIE90aGVyczogICAgICAgICAgICB0UmQgQ1BTUiB0UmQoVElFRF9UTykgdFJuCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMURQKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gQVJNSW5zdHNbT3Bjb2RlXTsKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IFRJRC5PcEluZm87CisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICBhc3NlcnQoTnVtT3BzID49IDIgJiYgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6dEdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgIChPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpDQ1JSZWdDbGFzc0lECisgICAgICAgICAgfHwgT3BJbmZvWzFdLlJlZ0NsYXNzID09IEFSTTo6dEdQUlJlZ0NsYXNzSUQpCisgICAgICAgICAmJiAiSW52YWxpZCBhcmd1bWVudHMiKTsKKworICAvLyBBZGQgdGhlIGRlc3RpbmF0aW9uIG9wZXJhbmQuCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6dEdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFQxdFJkKGluc24pKSkpOworICArK09wSWR4OworCisgIC8vIENoZWNrIHdoZXRoZXIgdGhlIG5leHQgb3BlcmFuZCB0byBiZSBhZGRlZCBpcyBhIENDUiBSZWdpc3Rlci4KKyAgaWYgKE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPT0gQVJNOjpDQ1JSZWdDbGFzc0lEKSB7CisgICAgYXNzZXJ0KE9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpICYmICJPcHRpb25hbCBkZWYgb3BlcmFuZCBleHBlY3RlZCIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoQi0+SW5JVEJsb2NrKCkgPyAwIDogQVJNOjpDUFNSKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIC8vIFdlIGhhdmUgZWl0aGVyIHsgdFJkKFRJRURfVE8pLCB0Um4gfSBvciB7IHRSbiB9IHJlbWFpbmluZy4KKyAgLy8gUHJvY2VzcyB0aGUgVElFRF9UTyBvcGVyYW5kIGZpcnN0LgorCisgIGFzc2VydChPcElkeCA8IE51bU9wcyAmJiBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6dEdQUlJlZ0NsYXNzSUQKKyAgICAgICAgICYmICJUaHVtYiByZWcgb3BlcmFuZCBleHBlY3RlZCIpOworICBpbnQgSWR4OworICBpZiAoKElkeCA9IFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChPcElkeCwgVE9JOjpUSUVEX1RPKSkgIT0gLTEpIHsKKyAgICAvLyBUaGUgcmVnIG9wZXJhbmQgaXMgdGllZCB0byB0aGUgZmlyc3QgcmVnIG9wZXJhbmQuCisgICAgTUkuYWRkT3BlcmFuZChNSS5nZXRPcGVyYW5kKElkeCkpOworICAgICsrT3BJZHg7CisgIH0KKworICAvLyBQcm9jZXNzIHBvc3NpYmxlIG5leHQgcmVnIG9wZXJhbmQuCisgIGlmIChPcElkeCA8IE51bU9wcyAmJiBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6dEdQUlJlZ0NsYXNzSUQpIHsKKyAgICAvLyBBZGQgdFJuIG9wZXJhbmQuCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjp0R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUMXRSbihpbnNuKSkpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEE2LjIuMyBTcGVjaWFsIGRhdGEgaW5zdHJ1Y3Rpb25zIGFuZCBicmFuY2ggYW5kIGV4Y2hhbmdlCisvLworLy8gdEFERGhpcnI6IFJkIFJkKFRJRURfVE8pIFJtCisvLyB0Q01QaGlyOiAgUmQgUm0KKy8vIHRNT1ZyLCB0TU9WZ3ByMmdwciwgdE1PVmdwcjJ0Z3ByLCB0TU9WdGdwcjJncHI6IFJkfHRSZCBSbXx0Um4KKy8vIHRCWF9SRVQ6IDAgb3BlcmFuZAorLy8gdEJYX1JFVF92YXJhcmc6IFJtCisvLyB0QkxYcl9yOTogUm0KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIxU3BlY2lhbChNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICAvLyB0QlhfUkVUIGhhcyAwIG9wZXJhbmQuCisgIGlmIChOdW1PcHMgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBCWC9CTFggaGFzIDEgcmVnIG9wZXJhbmQ6IFJtLgorICBpZiAoTnVtT3BzID09IDEpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VDFSbShpbnNuKSkpKTsKKyAgICBOdW1PcHNBZGRlZCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IEFSTUluc3RzW09wY29kZV07CisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBUSUQuT3BJbmZvOworICB1bnNpZ25lZCAmT3BJZHggPSBOdW1PcHNBZGRlZDsKKworICBPcElkeCA9IDA7CisKKyAgLy8gQWRkIHRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kLgorICB1bnNpZ25lZCBSZWdDbGFzcyA9IE9wSW5mb1tPcElkeF0uUmVnQ2xhc3M7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoCisgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgUmVnQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNHUFIoUmVnQ2xhc3MpID8gZ2V0VDFSZChpbnNuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFQxdFJkKGluc24pKSkpOworICArK09wSWR4OworCisgIC8vIFdlIGhhdmUgZWl0aGVyIHsgUmQoVElFRF9UTyksIFJtIH0gb3IgeyBSbXx0Um4gfSByZW1haW5pbmcuCisgIC8vIFByb2Nlc3MgdGhlIFRJRURfVE8gb3BlcmFuZCBmaXJzdC4KKworICBhc3NlcnQoT3BJZHggPCBOdW1PcHMgJiYgIk1vcmUgb3BlcmFuZHMgZXhwZWN0ZWQiKTsKKyAgaW50IElkeDsKKyAgaWYgKChJZHggPSBUSUQuZ2V0T3BlcmFuZENvbnN0cmFpbnQoT3BJZHgsIFRPSTo6VElFRF9UTykpICE9IC0xKSB7CisgICAgLy8gVGhlIHJlZyBvcGVyYW5kIGlzIHRpZWQgdG8gdGhlIGZpcnN0IHJlZyBvcGVyYW5kLgorICAgIE1JLmFkZE9wZXJhbmQoTUkuZ2V0T3BlcmFuZChJZHgpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgLy8gVGhlIG5leHQgcmVnIG9wZXJhbmQgaXMgZWl0aGVyIFJtIG9yIHRSbi4KKyAgYXNzZXJ0KE9wSWR4IDwgTnVtT3BzICYmICJNb3JlIG9wZXJhbmRzIGV4cGVjdGVkIik7CisgIFJlZ0NsYXNzID0gT3BJbmZvW09wSWR4XS5SZWdDbGFzczsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygKKyAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyRW51bShCLCBSZWdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0dQUihSZWdDbGFzcykgPyBnZXRUMVJtKGluc24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0VDF0Um4oaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEE4LjYuNTkgTERSIChsaXRlcmFsKQorLy8KKy8vIHRMRFJwY2k6IHRSdCBpbW04KjQKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIxTGRQQyhNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gQVJNSW5zdHNbT3Bjb2RlXS5PcEluZm87CisgIGlmICghT3BJbmZvKSByZXR1cm4gZmFsc2U7CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAyICYmIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OnRHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAoT3BJbmZvWzFdLlJlZ0NsYXNzIDwgMCAmJgorICAgICAgICAgICFPcEluZm9bMV0uaXNQcmVkaWNhdGUoKSAmJgorICAgICAgICAgICFPcEluZm9bMV0uaXNPcHRpb25hbERlZigpKQorICAgICAgICAgJiYgIkludmFsaWQgYXJndW1lbnRzIik7CisKKyAgLy8gQWRkIHRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kLgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OnRHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUMXRSdChpbnNuKSkpKTsKKworICAvLyBBbmQgdGhlIChpbW04IDw8IDIpIG9wZXJhbmQuCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZ2V0VDFJbW04KGluc24pIDw8IDIpKTsKKworICBOdW1PcHNBZGRlZCA9IDI7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRodW1iIHNwZWNpZmljIGFkZHJlc3NpbmcgbW9kZXMgKHNlZSBBUk1JbnN0clRodW1iLnRkKToKKy8vCisvLyB0X2FkZHJtb2RlX3JyIDo9IHJlZyArIHJlZworLy8KKy8vIHRfYWRkcm1vZGVfczQgOj0gcmVnICsgcmVnCisvLyAgICAgICAgICAgICAgICAgIHJlZyArIGltbTUgKiA0CisvLworLy8gdF9hZGRybW9kZV9zMiA6PSByZWcgKyByZWcKKy8vICAgICAgICAgICAgICAgICAgcmVnICsgaW1tNSAqIDIKKy8vCisvLyB0X2FkZHJtb2RlX3MxIDo9IHJlZyArIHJlZworLy8gICAgICAgICAgICAgICAgICByZWcgKyBpbW01CisvLworLy8gdF9hZGRybW9kZV9zcCA6PSBzcCArIGltbTggKiA0CisvLworCisvLyBBNi4yLjQgTG9hZC9zdG9yZSBzaW5nbGUgZGF0YSBpdGVtCisvLworLy8gTG9hZC9TdG9yZSBSZWdpc3RlciAocmVnfGltbSk6ICAgICAgdFJkIHRSbiBpbW01IHRSbQorLy8gTG9hZCBSZWdpc3RlciBTaWduZWQgQnl0ZXxIYWxmd29yZDogdFJkIHRSbiB0Um0KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIxTGRTdCh1bnNpZ25lZCBvcEEsIE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwKKyAgICB1aW50MzJfdCBpbnNuLCB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gQVJNSW5zdHNbT3Bjb2RlXTsKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IFRJRC5PcEluZm87CisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIC8vIFRhYmxlIEE2LTUgMTYtYml0IFRodW1iIExvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zCisgIC8vIG9wQSA9IDBiMDEwMSBmb3IgU1RSL0xEUiAocmVnaXN0ZXIpIGFuZCBmcmllbmRzLgorICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgU1RSL0xEUiAoaW1tZWRpYXRlKSBhbmQgZnJpZW5kcy4KKyAgYm9vbCBJbW01ID0gKG9wQSAhPSA1KTsKKworICBhc3NlcnQoTnVtT3BzID49IDIKKyAgICAgICAgICYmIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OnRHUFJSZWdDbGFzc0lECisgICAgICAgICAmJiBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjp0R1BSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgIkV4cGVjdCA+PSAyIG9wZXJhbmRzIGFuZCBmaXJzdCB0d28gYXMgdGh1bWIgcmVnIG9wZXJhbmRzIik7CisKKyAgLy8gQWRkIHRoZSBkZXN0aW5hdGlvbiByZWcgYW5kIHRoZSBiYXNlIHJlZy4KKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjp0R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VDF0UmQoaW5zbikpKSk7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6dEdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFQxdFJuKGluc24pKSkpOworICBPcElkeCA9IDI7CisKKyAgLy8gV2UgaGF2ZSBlaXRoZXIgeyBpbW01LCB0Um0gfSBvciB7IHRSbSB9IHJlbWFpbmluZy4KKyAgLy8gUHJvY2VzcyB0aGUgaW1tNSBmaXJzdC4gIE5vdGUgdGhhdCBTVFIvTERSIChyZWdpc3Rlcikgc2hvdWxkIHNraXAgdGhlIGltbTUKKyAgLy8gb2Zmc2V0IG9wZXJhbmQgZm9yIHRfYWRkcm1vZGVfc1sxfDJ8NF0uCisKKyAgYXNzZXJ0KE9wSWR4IDwgTnVtT3BzICYmICJNb3JlIG9wZXJhbmRzIGV4cGVjdGVkIik7CisKKyAgaWYgKE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPCAwICYmICFPcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkgJiYKKyAgICAgICFPcEluZm9bT3BJZHhdLmlzT3B0aW9uYWxEZWYoKSkgeworCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShJbW01ID8gZ2V0VDFJbW01KGluc24pIDogMCkpOworICAgICsrT3BJZHg7CisgIH0KKworICAvLyBUaGUgbmV4dCByZWcgb3BlcmFuZCBpcyB0Um0sIHRoZSBvZmZzZXQuCisgIGFzc2VydChPcElkeCA8IE51bU9wcyAmJiBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzID09IEFSTTo6dEdQUlJlZ0NsYXNzSUQKKyAgICAgICAgICYmICJUaHVtYiByZWcgb3BlcmFuZCBleHBlY3RlZCIpOworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKAorICAgICAgICAgICAgICAgICAgSW1tNSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjp0R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VDF0Um0oaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEE2LjIuNCBMb2FkL3N0b3JlIHNpbmdsZSBkYXRhIGl0ZW0KKy8vCisvLyBMb2FkL1N0b3JlIFJlZ2lzdGVyIFNQIHJlbGF0aXZlOiB0UnQgQVJNOjpTUCBpbW04CitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMUxkU3RTUChNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBhc3NlcnQoKE9wY29kZSA9PSBBUk06OnRMRFJzcGkgfHwgT3Bjb2RlID09IEFSTTo6dFNUUnNwaSkKKyAgICAgICAgICYmICJVbmV4cGVjdGVkIG9wY29kZSIpOworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgaWYgKCFPcEluZm8pIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoTnVtT3BzID49IDMgJiYKKyAgICAgICAgIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OnRHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAoT3BJbmZvWzJdLlJlZ0NsYXNzIDwgMCAmJgorICAgICAgICAgICFPcEluZm9bMl0uaXNQcmVkaWNhdGUoKSAmJgorICAgICAgICAgICFPcEluZm9bMl0uaXNPcHRpb25hbERlZigpKQorICAgICAgICAgJiYgIkludmFsaWQgYXJndW1lbnRzIik7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjp0R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VDF0UnQoaW5zbikpKSk7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoQVJNOjpTUCkpOworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKGdldFQxSW1tOChpbnNuKSkpOworICBOdW1PcHNBZGRlZCA9IDM7CisgIHJldHVybiB0cnVlOworfQorCisvLyBUYWJsZSBBNi0xIDE2LWJpdCBUaHVtYiBpbnN0cnVjdGlvbiBlbmNvZGluZworLy8gQTguNi4xMCBBRFIKKy8vCisvLyB0QUREclBDaTogdFJ0IGltbTgKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIxQWRkUENpKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGFzc2VydChPcGNvZGUgPT0gQVJNOjp0QUREclBDaSAmJiAiVW5leHBlY3RlZCBvcGNvZGUiKTsKKworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gQVJNSW5zdHNbT3Bjb2RlXS5PcEluZm87CisgIGlmICghT3BJbmZvKSByZXR1cm4gZmFsc2U7CisKKyAgYXNzZXJ0KE51bU9wcyA+PSAyICYmIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OnRHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAoT3BJbmZvWzFdLlJlZ0NsYXNzIDwgMCAmJgorICAgICAgICAgICFPcEluZm9bMV0uaXNQcmVkaWNhdGUoKSAmJgorICAgICAgICAgICFPcEluZm9bMV0uaXNPcHRpb25hbERlZigpKQorICAgICAgICAgJiYgIkludmFsaWQgYXJndW1lbnRzIik7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjp0R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VDF0UnQoaW5zbikpKSk7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZ2V0VDFJbW04KGluc24pKSk7CisgIE51bU9wc0FkZGVkID0gMjsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRhYmxlIEE2LTEgMTYtYml0IFRodW1iIGluc3RydWN0aW9uIGVuY29kaW5nCisvLyBBOC42LjggQUREIChTUCBwbHVzIGltbWVkaWF0ZSkKKy8vCisvLyB0QUREclNQaTogdFJ0IEFSTTo6U1AgaW1tOAorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVUaHVtYjFBZGRTUGkoTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgYXNzZXJ0KE9wY29kZSA9PSBBUk06OnRBRERyU1BpICYmICJVbmV4cGVjdGVkIG9wY29kZSIpOworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgaWYgKCFPcEluZm8pIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoTnVtT3BzID49IDMgJiYKKyAgICAgICAgIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OnRHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICAoT3BJbmZvWzJdLlJlZ0NsYXNzIDwgMCAmJgorICAgICAgICAgICFPcEluZm9bMl0uaXNQcmVkaWNhdGUoKSAmJgorICAgICAgICAgICFPcEluZm9bMl0uaXNPcHRpb25hbERlZigpKQorICAgICAgICAgJiYgIkludmFsaWQgYXJndW1lbnRzIik7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjp0R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VDF0UnQoaW5zbikpKSk7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoQVJNOjpTUCkpOworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKGdldFQxSW1tOChpbnNuKSkpOworICBOdW1PcHNBZGRlZCA9IDM7CisgIHJldHVybiB0cnVlOworfQorCisvLyB0UFVTSCwgdFBPUDogUHJlZC1JbW0gUHJlZC1DQ1IgcmVnaXN0ZXJfbGlzdAorLy8KKy8vIHdoZXJlIHJlZ2lzdGVyX2xpc3QgPSBsb3cgcmVnaXN0ZXJzICsgW2xyXSBmb3IgUFVTSCBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgIGxvdyByZWdpc3RlcnMgKyBbcGNdIGZvciBQT1AKKy8vCisvLyAibG93IHJlZ2lzdGVycyIgaXMgc3BlY2lmaWVkIGJ5IEluc3R7Ny0wfQorLy8gbHJ8cGMgaXMgc3BlY2lmaWVkIGJ5IEluc3R7OH0KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIxUHVzaFBvcChNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBhc3NlcnQoKE9wY29kZSA9PSBBUk06OnRQVVNIIHx8IE9wY29kZSA9PSBBUk06OnRQT1ApICYmICJVbmV4cGVjdGVkIG9wY29kZSIpOworCisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIC8vIEhhbmRsaW5nIHRoZSB0d28gcHJlZGljYXRlIG9wZXJhbmRzIGJlZm9yZSB0aGUgcmVnbGlzdC4KKyAgaWYgKEItPkRvUHJlZGljYXRlT3BlcmFuZHMoTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzKSkKKyAgICBPcElkeCArPSAyOworICBlbHNlIHsKKyAgICBERUJVRyhlcnJzKCkgPDwgIkV4cGVjdGVkIHByZWRpY2F0ZSBvcGVyYW5kcyBub3QgZm91bmQuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB1bnNpZ25lZCBSZWdMaXN0Qml0cyA9IHNsaWNlKGluc24sIDgsIDgpIDw8IChPcGNvZGUgPT0gQVJNOjp0UFVTSCA/IDE0IDogMTUpCisgICAgfCBzbGljZShpbnNuLCA3LCAwKTsKKworICAvLyBGaWxsIHRoZSB2YXJpYWRpYyBwYXJ0IG9mIHJlZ2xpc3QuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgaWYgKChSZWdMaXN0Qml0cyA+PiBpKSAmIDEpIHsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpKSk7CisgICAgICArK09wSWR4OworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBBNi4yLjUgTWlzY2VsbGFuZW91cyAxNi1iaXQgaW5zdHJ1Y3Rpb25zCisvLyBEZWxlZ2F0ZSB0byBEaXNhc3NlbWJsZVRodW1iMVB1c2hQb3AoKSBmb3IgdFBVU0ggJiB0UE9QLgorLy8KKy8vIHRBRERzcGksIHRTVUJzcGk6IEFSTTo6U1AgQVJNOjpTUChUSUVEX1RPKSBpbW03CisvLyB0MklUOiAgICAgICAgICAgICBmaXJzdGNvbmQ9SW5zdHs3LTR9IG1hc2s9SW5zdHszLTB9CisvLyB0Q0JOWiwgdENCWjogICAgICB0UmQgaW1tNioyCisvLyB0QktQVDogICAgICAgICAgICBpbW04CisvLyB0Tk9QLCB0U0VWLCB0WUlFTEQsIHRXRkUsIHRXRkk6CisvLyAgIG5vIG9wZXJhbmQgKGV4Y2VwdCBwcmVkaWNhdGUgcGFpcikKKy8vIHRTRVRFTkRCRSwgdFNFVEVORExFLCA6CisvLyAgIG5vIG9wZXJhbmQKKy8vIE90aGVyczogICAgICAgICAgIHRSZCB0Um4KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIxTWlzYyhNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBpZiAoTnVtT3BzID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKE9wY29kZSA9PSBBUk06OnRQVVNIIHx8IE9wY29kZSA9PSBBUk06OnRQT1ApCisgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIxUHVzaFBvcChNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLCBCKTsKKworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gQVJNSW5zdHNbT3Bjb2RlXS5PcEluZm87CisKKyAgLy8gUHJlZGljYXRlIG9wZXJhbmRzIGFyZSBoYW5kbGVkIGVsc2V3aGVyZS4KKyAgaWYgKE51bU9wcyA9PSAyICYmCisgICAgICBPcEluZm9bMF0uaXNQcmVkaWNhdGUoKSAmJiBPcEluZm9bMV0uaXNQcmVkaWNhdGUoKSAmJgorICAgICAgT3BJbmZvWzBdLlJlZ0NsYXNzIDwgMCAmJiBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpDQ1JSZWdDbGFzc0lEKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoT3Bjb2RlID09IEFSTTo6dEFERHNwaSB8fCBPcGNvZGUgPT0gQVJNOjp0U1VCc3BpKSB7CisgICAgLy8gU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciB0QUREc3BpIGFuZCB0U1VCc3BpLgorICAgIC8vIEE4LjYuOCBBREQgKFNQIHBsdXMgaW1tZWRpYXRlKSAmIEE4LjYuMjE1IFNVQiAoU1AgbWludXMgaW1tZWRpYXRlKQorICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoQVJNOjpTUCkpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoQVJNOjpTUCkpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZ2V0VDFJbW03KGluc24pKSk7CisgICAgTnVtT3BzQWRkZWQgPSAzOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKE9wY29kZSA9PSBBUk06OnQySVQpIHsKKyAgICAvLyBTcGVjaWFsIGNhc2UgaGFuZGxpbmcgZm9yIElmLVRoZW4uCisgICAgLy8gQTguNi41MCBJVAorICAgIC8vIFRhZyB0aGUgKGZpcnN0Y29uZFswXSBiaXQgPDwgNCkgYWxvbmcgd2l0aCBtYXNrLgorCisgICAgLy8gZmlyc3Rjb25kCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShzbGljZShpbnNuLCA3LCA0KSkpOworCisgICAgLy8gZmlyc3Rjb25kWzBdIGFuZCBtYXNrCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShzbGljZShpbnNuLCA0LCAwKSkpOworICAgIE51bU9wc0FkZGVkID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChPcGNvZGUgPT0gQVJNOjp0QktQVCkgeworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZ2V0VDFJbW04KGluc24pKSk7IC8vIGJyZWFrcG9pbnQgdmFsdWUKKyAgICBOdW1PcHNBZGRlZCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDUFMgaGFzIGEgc2luZ2xldG9uICRvcHQgb3BlcmFuZCB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgIC8vIG9wdHs0LTB9ID0gZG9uJ3QgY2FyZQorICAvLyBvcHR7NX0gPSAwIChmYWxzZSkKKyAgLy8gb3B0ezgtNn0gPSBBSUYgZnJvbSBJbnN0ezItMH0KKyAgLy8gb3B0ezEwLTl9ID0gMTppbW9kIGZyb20gSW5zdHs0fSB3aXRoIDBiMTAgYXMgZW5hYmxlIGFuZCAwYjExIGFzIGRpc2FibGUKKyAgaWYgKE9wY29kZSA9PSBBUk06OnRDUFMpIHsKKyAgICB1bnNpZ25lZCBPcHRpb24gPSBzbGljZShpbnNuLCAyLCAwKSA8PCA2IHwgc2xpY2UoaW5zbiwgNCwgNCkgPDwgOSB8IDEgPDwgMTA7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShPcHRpb24pKTsKKyAgICBOdW1PcHNBZGRlZCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBhc3NlcnQoTnVtT3BzID49IDIgJiYgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6dEdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgIChPcEluZm9bMV0uUmVnQ2xhc3MgPCAwIHx8IE9wSW5mb1sxXS5SZWdDbGFzcz09QVJNOjp0R1BSUmVnQ2xhc3NJRCkKKyAgICAgICAgICYmICJFeHBlY3QgPj0yIG9wZXJhbmRzIik7CisKKyAgLy8gQWRkIHRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kLgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OnRHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUMXRSZChpbnNuKSkpKTsKKworICBpZiAoT3BJbmZvWzFdLlJlZ0NsYXNzID09IEFSTTo6dEdQUlJlZ0NsYXNzSUQpIHsKKyAgICAvLyBUd28gcmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zLgorICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6dEdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VDF0Um4oaW5zbikpKSk7CisgIH0gZWxzZSB7CisgICAgLy8gQ0JOWiwgQ0JaCisgICAgYXNzZXJ0KChPcGNvZGUgPT0gQVJNOjp0Q0JOWiB8fCBPcGNvZGUgPT0gQVJNOjp0Q0JaKSAmJiJVbmV4cGVjdGVkIG9wY29kZSIpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZ2V0VDFJbW02KGluc24pICogMikpOworICB9CisKKyAgTnVtT3BzQWRkZWQgPSAyOworCisgIHJldHVybiB0cnVlOworfQorCisvLyBBOC42LjUzICBMRE0gLyBMRE1JQQorLy8gQTguNi4xODkgU1RNIC8gU1RNSUEKKy8vCisvLyB0TERNX1VQRC90U1RNX1VQRDogdFJ0IHRSdCBBTTRNb2RlSW1tIFByZWQtSW1tIFByZWQtQ0NSIHJlZ2lzdGVyX2xpc3QKKy8vIHRMRE06ICAgICAgICAgICAgICB0UnQgQU00TW9kZUltbSBQcmVkLUltbSBQcmVkLUNDUiByZWdpc3Rlcl9saXN0CitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMUxkU3RNdWwoYm9vbCBMZCwgTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLAorICAgIHVpbnQzMl90IGluc24sIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgYXNzZXJ0KChPcGNvZGUgPT0gQVJNOjp0TERNIHx8IE9wY29kZSA9PSBBUk06OnRMRE1fVVBEIHx8CisgICAgICAgICAgT3Bjb2RlID09IEFSTTo6dFNUTV9VUEQpICYmICJVbmV4cGVjdGVkIG9wY29kZSIpOworCisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIHVuc2lnbmVkIHRSdCA9IGdldFQxdFJ0KGluc24pOworCisgIE9wSWR4ID0gMDsKKworICAvLyBXQiByZWdpc3RlciwgaWYgbmVjZXNzYXJ5LgorICBpZiAoT3Bjb2RlID09IEFSTTo6dExETV9VUEQgfHwgT3Bjb2RlID09IEFSTTo6dFNUTV9VUEQpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFJ0KSkpOworICAgICsrT3BJZHg7CisgIH0KKworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRSdCkpKTsKKyAgKytPcElkeDsKKworICAvLyBBOC42LjUzIExETSAvIExETUlBIC8gTERNRkQgLSBFbmNvZGluZyBUMQorICAvLyBBOC42LjUzIFNUTSAvIFNUTUlBIC8gU1RNRUEgLSBFbmNvZGluZyBUMQorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKEFSTV9BTTo6Z2V0QU00TW9kZUltbShBUk1fQU06OmlhKSkpOworICArK09wSWR4OworCisgIC8vIEhhbmRsaW5nIHRoZSB0d28gcHJlZGljYXRlIG9wZXJhbmRzIGJlZm9yZSB0aGUgcmVnbGlzdC4KKyAgaWYgKEItPkRvUHJlZGljYXRlT3BlcmFuZHMoTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzKSkKKyAgICBPcElkeCArPSAyOworICBlbHNlIHsKKyAgICBERUJVRyhlcnJzKCkgPDwgIkV4cGVjdGVkIHByZWRpY2F0ZSBvcGVyYW5kcyBub3QgZm91bmQuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB1bnNpZ25lZCBSZWdMaXN0Qml0cyA9IHNsaWNlKGluc24sIDcsIDApOworCisgIC8vIEZpbGwgdGhlIHZhcmlhZGljIHBhcnQgb2YgcmVnbGlzdC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGlmICgoUmVnTGlzdEJpdHMgPj4gaSkgJiAxKSB7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OnRHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSkpKTsKKyAgICAgICsrT3BJZHg7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIxTGRNdWwoTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMUxkU3RNdWwodHJ1ZSwgTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCKTsKK30KKworc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVUaHVtYjFTdE11bChNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKyAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIxTGRTdE11bChmYWxzZSwgTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCKTsKK30KKworLy8gQTguNi4xNiBCIEVuY29kaW5nIFQxCisvLyBjb25kID0gSW5zdHsxMS04fSAmIGltbTggPSBJbnN0ezctMH0KKy8vIGltbTMyID0gU2lnbkV4dGVuZChpbW04OicwJywgMzIpCisvLworLy8gdEJjYzogb2Zmc2V0IFByZWQtSW1tIFByZWQtQ0NSCisvLyB0U1ZDOiBpbW04IFByZWQtSW1tIFByZWQtQ0NSCisvLyB0VFJBUDogMCBvcGVyYW5kIChlYXJseSByZXR1cm4pCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMUNvbmRCcihNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPKSB7CisKKyAgaWYgKE9wY29kZSA9PSBBUk06OnRUUkFQKQorICAgIHJldHVybiB0cnVlOworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgaWYgKCFPcEluZm8pIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoTnVtT3BzID09IDMgJiYgT3BJbmZvWzBdLlJlZ0NsYXNzIDwgMCAmJgorICAgICAgICAgT3BJbmZvWzFdLmlzUHJlZGljYXRlKCkgJiYgT3BJbmZvWzJdLlJlZ0NsYXNzID09IEFSTTo6Q0NSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgIkV4YWN0bHkgMyBvcGVyYW5kcyBleHBlY3RlZCIpOworCisgIHVuc2lnbmVkIEltbTggPSBnZXRUMUltbTgoaW5zbik7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oCisgICAgICAgICAgICAgICAgICBPcGNvZGUgPT0gQVJNOjp0QmNjID8gU2lnbkV4dGVuZDMyPDk+KEltbTggPDwgMSkgKyA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludClJbW04KSk7CisKKyAgLy8gUHJlZGljYXRlIG9wZXJhbmRzIGJ5IEFSTUJhc2ljTUNCdWlsZGVyOjpUcnlQcmVkaWNhdGVBbmRTQml0TW9kaWZpZXIoKS4KKyAgTnVtT3BzQWRkZWQgPSAxOworCisgIHJldHVybiB0cnVlOworfQorCisvLyBBOC42LjE2IEIgRW5jb2RpbmcgVDIKKy8vIGltbTExID0gSW5zdHsxMC0wfQorLy8gaW1tMzIgPSBTaWduRXh0ZW5kKGltbTExOicwJywgMzIpCisvLworLy8gdEI6IG9mZnNldAorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVUaHVtYjFCcihNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPKSB7CisKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IEFSTUluc3RzW09wY29kZV0uT3BJbmZvOworICBpZiAoIU9wSW5mbykgcmV0dXJuIGZhbHNlOworCisgIGFzc2VydChOdW1PcHMgPT0gMSAmJiBPcEluZm9bMF0uUmVnQ2xhc3MgPCAwICYmICIxIGltbSBvcGVyYW5kIGV4cGVjdGVkIik7CisKKyAgdW5zaWduZWQgSW1tMTEgPSBnZXRUMUltbTExKGluc24pOworCisgIC8vIFdoZW4gZXhlY3V0aW5nIGEgVGh1bWIgaW5zdHJ1Y3Rpb24sIFBDIHJlYWRzIGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50CisgIC8vIGluc3RydWN0aW9uIHBsdXMgNC4gIFRoZSBhc3NlbWJsZXIgc3VidHJhY3RzIDQgZnJvbSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgIC8vIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gYW5kIHRoZSB0YXJnZXQgYWRkcmVzcywgZGlzYXNzZW1ibGVyIGhhcyB0byBhZGQgNCB0bworICAvLyB0byBjb21wZW5zYXRlLgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKFNpZ25FeHRlbmQzMjwxMj4oSW1tMTEgPDwgMSkgKyA0KSk7CisKKyAgTnVtT3BzQWRkZWQgPSAxOworCisgIHJldHVybiB0cnVlOworCit9CisKKy8vIFNlZSBBNi4yIDE2LWJpdCBUaHVtYiBpbnN0cnVjdGlvbiBlbmNvZGluZyBmb3IgaW5zdHJ1Y3Rpb24gY2xhc3NlcworLy8gY29ycmVzcG9uZGluZyB0byBvcC4KKy8vCisvLyBUYWJsZSBBNi0xIDE2LWJpdCBUaHVtYiBpbnN0cnVjdGlvbiBlbmNvZGluZyAoYWJyaWRnZWQpCisvLyBvcAkJSW5zdHJ1Y3Rpb24gb3IgaW5zdHJ1Y3Rpb24gY2xhc3MKKy8vIC0tLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMDB4eHh4CVNoaWZ0IChpbW1lZGlhdGUpLCBhZGQsIHN1YnRyYWN0LCBtb3ZlLCBhbmQgY29tcGFyZSBvbiBwYWdlIEE2LTcKKy8vIDAxMDAwMAlEYXRhLXByb2Nlc3Npbmcgb24gcGFnZSBBNi04CisvLyAwMTAwMDEJU3BlY2lhbCBkYXRhIGluc3RydWN0aW9ucyBhbmQgYnJhbmNoIGFuZCBleGNoYW5nZSBvbiBwYWdlIEE2LTkKKy8vIDAxMDAxeAlMb2FkIGZyb20gTGl0ZXJhbCBQb29sLCBzZWUgTERSIChsaXRlcmFsKSBvbiBwYWdlIEE4LTEyMgorLy8gMDEwMXh4CUxvYWQvc3RvcmUgc2luZ2xlIGRhdGEgaXRlbSBvbiBwYWdlIEE2LTEwCisvLyAwMTF4eHgKKy8vIDEwMHh4eAorLy8gMTAxMDB4CUdlbmVyYXRlIFBDLXJlbGF0aXZlIGFkZHJlc3MsIHNlZSBBRFIgb24gcGFnZSBBOC0zMgorLy8gMTAxMDF4CUdlbmVyYXRlIFNQLXJlbGF0aXZlIGFkZHJlc3MsIHNlZSBBREQgKFNQIHBsdXMgaW1tZWRpYXRlKSBvbiBwYWdlIEE4LTI4CisvLyAxMDExeHgJTWlzY2VsbGFuZW91cyAxNi1iaXQgaW5zdHJ1Y3Rpb25zIG9uIHBhZ2UgQTYtMTEKKy8vIDExMDAweAlTdG9yZSBtdWx0aXBsZSByZWdpc3RlcnMsIHNlZSBTVE0gLyBTVE1JQSAvIFNUTUVBIG9uIHBhZ2UgQTgtMzc0CisvLyAxMTAwMXgJTG9hZCBtdWx0aXBsZSByZWdpc3RlcnMsIHNlZSBMRE0gLyBMRE1JQSAvIExETUZEIG9uIHBhZ2UgQTgtMTEwIGEKKy8vIDExMDF4eAlDb25kaXRpb25hbCBicmFuY2gsIGFuZCBTdXBlcnZpc29yIENhbGwgb24gcGFnZSBBNi0xMworLy8gMTExMDB4CVVuY29uZGl0aW9uYWwgQnJhbmNoLCBzZWUgQiBvbiBwYWdlIEE4LTQ0CisvLworc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVUaHVtYjEodWludDE2X3Qgb3AsIE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwKKyAgICB1aW50MzJfdCBpbnNuLCB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIHVuc2lnbmVkIG9wMSA9IHNsaWNlKG9wLCA1LCA0KTsKKyAgdW5zaWduZWQgb3AyID0gc2xpY2Uob3AsIDMsIDIpOworICB1bnNpZ25lZCBvcDMgPSBzbGljZShvcCwgMSwgMCk7CisgIHVuc2lnbmVkIG9wQSA9IHNsaWNlKG9wLCA1LCAyKTsKKyAgc3dpdGNoIChvcDEpIHsKKyAgY2FzZSAwOgorICAgIC8vIEE2LjIuMSBTaGlmdCAoaW1tZWRpYXRlKSwgYWRkLCBzdWJ0cmFjdCwgbW92ZSwgYW5kIGNvbXBhcmUKKyAgICByZXR1cm4gRGlzYXNzZW1ibGVUaHVtYjFHZW5lcmFsKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIEIpOworICBjYXNlIDE6CisgICAgc3dpdGNoIChvcDIpIHsKKyAgICBjYXNlIDA6CisgICAgICBzd2l0Y2ggKG9wMykgeworICAgICAgY2FzZSAwOgorICAgICAgICAvLyBBNi4yLjIgRGF0YS1wcm9jZXNzaW5nCisgICAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMURQKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIEIpOworICAgICAgY2FzZSAxOgorICAgICAgICAvLyBBNi4yLjMgU3BlY2lhbCBkYXRhIGluc3RydWN0aW9ucyBhbmQgYnJhbmNoIGFuZCBleGNoYW5nZQorICAgICAgICByZXR1cm4gRGlzYXNzZW1ibGVUaHVtYjFTcGVjaWFsKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQik7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBBOC42LjU5IExEUiAobGl0ZXJhbCkKKyAgICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIxTGRQQyhNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLCBCKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvLyBBNi4yLjQgTG9hZC9zdG9yZSBzaW5nbGUgZGF0YSBpdGVtCisgICAgICByZXR1cm4gRGlzYXNzZW1ibGVUaHVtYjFMZFN0KG9wQSwgTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBzd2l0Y2ggKG9wMikgeworICAgIGNhc2UgMDoKKyAgICAgIC8vIEE2LjIuNCBMb2FkL3N0b3JlIHNpbmdsZSBkYXRhIGl0ZW0KKyAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMUxkU3Qob3BBLCBNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCKTsKKyAgICBjYXNlIDE6CisgICAgICAvLyBBNi4yLjQgTG9hZC9zdG9yZSBzaW5nbGUgZGF0YSBpdGVtCisgICAgICByZXR1cm4gRGlzYXNzZW1ibGVUaHVtYjFMZFN0U1AoTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwgQik7CisgICAgY2FzZSAyOgorICAgICAgaWYgKG9wMyA8PSAxKSB7CisgICAgICAgIC8vIEE4LjYuMTAgQURSCisgICAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMUFkZFBDaShNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBBOC42LjggQUREIChTUCBwbHVzIGltbWVkaWF0ZSkKKyAgICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIxQWRkU1BpKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCKTsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgLy8gQTYuMi41IE1pc2NlbGxhbmVvdXMgMTYtYml0IGluc3RydWN0aW9ucworICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIxTWlzYyhNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLCBCKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMzoKKyAgICBzd2l0Y2ggKG9wMikgeworICAgIGNhc2UgMDoKKyAgICAgIGlmIChvcDMgPD0gMSkgeworICAgICAgICAvLyBBOC42LjE4OSBTVE0gLyBTVE1JQSAvIFNUTUVBCisgICAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMVN0TXVsKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIEIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQTguNi41MyBMRE0gLyBMRE1JQSAvIExETUZECisgICAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMUxkTXVsKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIEIpOworICAgICAgfQorICAgIGNhc2UgMToKKyAgICAgIC8vIEE2LjIuNiBDb25kaXRpb25hbCBicmFuY2gsIGFuZCBTdXBlcnZpc29yIENhbGwKKyAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMUNvbmRCcihNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLCBCKTsKKyAgICBjYXNlIDI6CisgICAgICAvLyBVbmNvbmRpdGlvbmFsIEJyYW5jaCwgc2VlIEIgb24gcGFnZSBBOC00NAorICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIxQnIoTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwgQik7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwICYmICJVbnJlYWNoYWJsZSBjb2RlIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIlVucmVhY2hhYmxlIGNvZGUiKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyBUaHVtYjIgaW5zdHJ1Y3Rpb24gZGlzYXNzZW1ibHkgZnVuY3Rpb25zLiAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gTm90ZTogdGhlIHJlZ2lzdGVyIG5hbWluZyBmb2xsb3dzIHRoZSBBUk0gY29udmVudGlvbiEgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgaW5saW5lIGJvb2wgVGh1bWIyU1JTT3Bjb2RlKHVuc2lnbmVkIE9wY29kZSkgeworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBBUk06OnQyU1JTREJXOiBjYXNlIEFSTTo6dDJTUlNEQjoKKyAgY2FzZSBBUk06OnQyU1JTSUFXOiBjYXNlIEFSTTo6dDJTUlNJQToKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgVGh1bWIyUkZFT3Bjb2RlKHVuc2lnbmVkIE9wY29kZSkgeworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBBUk06OnQyUkZFREJXOiBjYXNlIEFSTTo6dDJSRkVEQjoKKyAgY2FzZSBBUk06OnQyUkZFSUFXOiBjYXNlIEFSTTo6dDJSRkVJQToKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCisvLyB0MlNSU1tJQXxEQl1XL3QyU1JTW0lBfERCXTogbW9kZV9pbW0gPSBJbnN0ezQtMH0KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIyU1JTKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCkgeworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKHNsaWNlKGluc24sIDQsIDApKSk7CisgIE51bU9wc0FkZGVkID0gMTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHQyUkZFW0lBfERCXVcvdDJSRkVbSUF8REJdOiBSbgorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVUaHVtYjJSRkUoTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisgIE51bU9wc0FkZGVkID0gMTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIyTGRTdE11bChNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBpZiAoVGh1bWIyU1JTT3Bjb2RlKE9wY29kZSkpCisgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIyU1JTKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQpOworCisgIGlmIChUaHVtYjJSRkVPcGNvZGUoT3Bjb2RlKSkKKyAgICByZXR1cm4gRGlzYXNzZW1ibGVUaHVtYjJSRkUoTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwgQik7CisKKyAgYXNzZXJ0KChPcGNvZGUgPT0gQVJNOjp0MkxETSB8fCBPcGNvZGUgPT0gQVJNOjp0MkxETV9VUEQgfHwKKyAgICAgICAgICBPcGNvZGUgPT0gQVJNOjp0MlNUTSB8fCBPcGNvZGUgPT0gQVJNOjp0MlNUTV9VUEQpCisgICAgICAgICAmJiAiVW5leHBlY3RlZCBvcGNvZGUiKTsKKyAgYXNzZXJ0KE51bU9wcyA+PSA1ICYmICJUaHVtYjIgTGRTdE11bCBleHBlY3RzIE51bU9wcyA+PSA1Iik7CisKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgT3BJZHggPSAwOworCisgIHVuc2lnbmVkIEJhc2UgPSBnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELCBkZWNvZGVSbihpbnNuKSk7CisKKyAgLy8gV3JpdGViYWNrIHRvIGJhc2UuCisgIGlmIChPcGNvZGUgPT0gQVJNOjp0MkxETV9VUEQgfHwgT3Bjb2RlID09IEFSTTo6dDJTVE1fVVBEKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhCYXNlKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoQmFzZSkpOworICArK09wSWR4OworCisgIEFSTV9BTTo6QU1TdWJNb2RlIFN1Yk1vZGUgPSBnZXRBTVN1Yk1vZGVGb3JCaXRzKGdldFBVQml0cyhpbnNuKSk7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oQVJNX0FNOjpnZXRBTTRNb2RlSW1tKFN1Yk1vZGUpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gSGFuZGxpbmcgdGhlIHR3byBwcmVkaWNhdGUgb3BlcmFuZHMgYmVmb3JlIHRoZSByZWdsaXN0LgorICBpZiAoQi0+RG9QcmVkaWNhdGVPcGVyYW5kcyhNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMpKQorICAgIE9wSWR4ICs9IDI7CisgIGVsc2UgeworICAgIERFQlVHKGVycnMoKSA8PCAiRXhwZWN0ZWQgcHJlZGljYXRlIG9wZXJhbmRzIG5vdCBmb3VuZC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHVuc2lnbmVkIFJlZ0xpc3RCaXRzID0gaW5zbiAmICgoMSA8PCAxNikgLSAxKTsKKworICAvLyBGaWxsIHRoZSB2YXJpYWRpYyBwYXJ0IG9mIHJlZ2xpc3QuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgaWYgKChSZWdMaXN0Qml0cyA+PiBpKSAmIDEpIHsKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpKSk7CisgICAgICArK09wSWR4OworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyB0MkxEUkVYOiBSZCBSbgorLy8gdDJMRFJFWEQ6IFJkIFJzIFJuCisvLyB0MkxEUkVYQiwgdDJMRFJFWEg6IFJkIFJuCisvLyB0MlNUUkVYOiBScyBSZCBSbgorLy8gdDJTVFJFWEQ6IFJtIFJkIFJzIFJuCisvLyB0MlNUUkVYQiwgdDJTVFJFWEg6IFJtIFJkIFJuCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMkxkU3RFeChNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sCisgICAgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gQVJNSW5zdHNbT3Bjb2RlXS5PcEluZm87CisgIGlmICghT3BJbmZvKSByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgT3BJZHggPSAwOworCisgIGFzc2VydChOdW1PcHMgPj0gMgorICAgICAgICAgJiYgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgT3BJbmZvWzFdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRAorICAgICAgICAgJiYgIkV4cGVjdCA+PTIgb3BlcmFuZHMgYW5kIGZpcnN0IHR3byBhcyByZWcgb3BlcmFuZHMiKTsKKworICBib29sIGlzU3RvcmUgPSAoQVJNOjp0MlNUUkVYIDw9IE9wY29kZSAmJiBPcGNvZGUgPD0gQVJNOjp0MlNUUkVYSCk7CisgIGJvb2wgaXNTVyA9IChPcGNvZGUgPT0gQVJNOjp0MkxEUkVYIHx8IE9wY29kZSA9PSBBUk06OnQyU1RSRVgpOworICBib29sIGlzRFcgPSAoT3Bjb2RlID09IEFSTTo6dDJMRFJFWEQgfHwgT3Bjb2RlID09IEFSTTo6dDJTVFJFWEQpOworCisgIC8vIEFkZCB0aGUgZGVzdGluYXRpb24gb3BlcmFuZCBmb3Igc3RvcmUuCisgIGlmIChpc1N0b3JlKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygKKyAgICAgICAgICAgICAgICAgICAgZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU1cgPyBkZWNvZGVScyhpbnNuKSA6IGRlY29kZVJtKGluc24pKSkpOworICAgICsrT3BJZHg7CisgIH0KKworICAvLyBTb3VyY2Ugb3BlcmFuZCBmb3Igc3RvcmUgYW5kIGRlc3RpbmF0aW9uIG9wZXJhbmQgZm9yIGxvYWQuCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmQoaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gVGh1bWIyIGRvdWJsZXdvcmQgY29tcGxpY2F0aW9uOiB3aXRoIGFuIGV4dHJhIHNvdXJjZS9kZXN0aW5hdGlvbiBvcGVyYW5kLgorICBpZiAoaXNEVykgeworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVScyhpbnNuKSkpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgLy8gRmluYWxseSBhZGQgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gTExWTSwgYXMgb2YgSmFuLTA1LTIwMTAsIGRvZXMgbm90IG91dHB1dCA8UnQyPiwgaS5lLiwgUnMsIGluIHRoZSBhc20uCisvLyBXaGVyZWFzIHRoZSBBUk0gQXJjaC4gTWFudWFsIGRvZXMgbm90IHJlcXVpcmUgdGhhdCB0MiA9IHQrMSBsaWtlIGluIEFSTSBJU0EuCisvLworLy8gdDJMRFJEaTg6IFJkIFJzIFJuIGltbThzNCAob2Zmc2V0IG1vZGUpCisvLyB0MkxEUkRwY2k6IFJkIFJzIGltbThzNCAoTm90IGRlY29kZWQsIHByZWZlciB0aGUgZ2VuZXJpYyB0MkxEUkRpOCB2ZXJzaW9uKQorLy8gdDJTVFJEaTg6IFJkIFJzIFJuIGltbThzNCAob2Zmc2V0IG1vZGUpCisvLworLy8gRGl0dG8gZm9yIHQyTERSRF9QUkUsIHQyTERSRF9QT1NULCB0MlNUUkRfUFJFLCB0MlNUUkRfUE9TVCwgd2hpY2ggYXJlIGZvcgorLy8gZGlzYXNzZW1ibHkgb25seSBhbmQgZG8gbm90IGhhdmUgYSB0aWVkX3RvIHdyaXRlYmFjayBiYXNlIHJlZ2lzdGVyIG9wZXJhbmQuCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMkxkU3REdWFsKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwKKyAgICB1aW50MzJfdCBpbnNuLCB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKyAgaWYgKCFPcEluZm8pIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoTnVtT3BzID49IDQKKyAgICAgICAgICYmIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQKKyAgICAgICAgICYmIE9wSW5mb1sxXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQKKyAgICAgICAgICYmIE9wSW5mb1syXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQKKyAgICAgICAgICYmIE9wSW5mb1szXS5SZWdDbGFzcyA8IDAKKyAgICAgICAgICYmICJFeHBlY3QgPj0gNCBvcGVyYW5kcyBhbmQgZmlyc3QgMyBhcyByZWcgb3BlcmFuZHMiKTsKKworICAvLyBBZGQgdGhlIDxSdD4gPFJ0Mj4gb3BlcmFuZHMuCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmQoaW5zbikpKSk7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUnMoaW5zbikpKSk7CisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisKKyAgLy8gRmluYWxseSBhZGQgKCsvLSlpbW04KjQsIGRlcGVuZGluZyBvbiB0aGUgVSBiaXQuCisgIGludCBPZmZzZXQgPSBnZXRJbW04KGluc24pICogNDsKKyAgaWYgKGdldFVCaXQoaW5zbikgPT0gMCkKKyAgICBPZmZzZXQgPSAtT2Zmc2V0OworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKE9mZnNldCkpOworICBOdW1PcHNBZGRlZCA9IDQ7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBDLWJhc2VkIGRlZmluZWQgZm9yIENvZGVnZW4sIHdoaWNoIGRvIG5vdCBnZXQgZGVjb2RlZCBieSBkZXNpZ246CisvLworLy8gdDJUQkIsIHQyVEJIOiBSbSBpbW1Eb250Q2FyZSBpbW1Eb250Q2FyZQorLy8KKy8vIEdlbmVyaWMgdmVyc2lvbiBkZWZpbmVkIGZvciBkaXNhc3NlbWJseToKKy8vCisvLyB0MlRCQmdlbiwgdDJUQkhnZW46IFJuIFJtIFByZWQtSW1tIFByZWQtQ0NSCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMlRCKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwKKyAgICB1aW50MzJfdCBpbnNuLCB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGFzc2VydChOdW1PcHMgPj0gMiAmJiAiRXhwZWN0ID49IDIgb3BlcmFuZHMiKTsKKworICAvLyBUaGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIFRCQi9UQkggbmVlZHMgYSBiYXNlIHJlZ2lzdGVyLgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworICAvLyBBZGQgdGhlIGluZGV4IHJlZ2lzdGVyLgorICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJtKGluc24pKSkpOworICBOdW1PcHNBZGRlZCA9IDI7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBUaHVtYjJTaGlmdE9wY29kZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgQVJNOjp0Mk1PVkNDbHNsOiBjYXNlIEFSTTo6dDJNT1ZDQ2xzcjoKKyAgY2FzZSBBUk06OnQyTU9WQ0Nhc3I6IGNhc2UgQVJNOjp0Mk1PVkNDcm9yOgorICBjYXNlIEFSTTo6dDJMU0xyaTogICAgY2FzZSBBUk06OnQyTFNScmk6CisgIGNhc2UgQVJNOjp0MkFTUnJpOiAgICBjYXNlIEFSTTo6dDJST1JyaToKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCisvLyBBNi4zLjExIERhdGEtcHJvY2Vzc2luZyAoc2hpZnRlZCByZWdpc3RlcikKKy8vCisvLyBUd28gcmVnaXN0ZXIgb3BlcmFuZHMgKFJuPTBiMTExMSBubyAxc3Qgb3BlcmFuZCByZWcpOiBScyBSbQorLy8gVHdvIHJlZ2lzdGVyIG9wZXJhbmRzIChScz0wYjExMTEgbm8gZHN0IG9wZXJhbmQgcmVnKTogUm4gUm0KKy8vIFRocmVlIHJlZ2lzdGVyIG9wZXJhbmRzOiBScyBSbiBSbQorLy8gVGhyZWUgcmVnaXN0ZXIgb3BlcmFuZHM6IChSbj0wYjExMTEgQ29uZGl0aW9uYWwgTW92ZSkgUnMgUm8oVElFRF9UTykgUm0KKy8vCisvLyBDb25zdGFudCBzaGlmdHMgdDJfc29fcmVnIGlzIGEgMi1vcGVyYW5kIHVuaXQgY29ycmVzcG9uZGluZyB0byB0aGUgVGh1bWIyCisvLyByZWdpc3RlciB3aXRoIHNoaWZ0IGZvcm1zOiAoUm0sIENvbnN0YW50U2hpZnRTcGVjaWZpZXIpLgorLy8gQ29uc3RhbnQgc2hpZnQgc3BlY2lmaWVyOiBJbW0gPSAoU2hPcCB8IFNoQW10PDwzKS4KKy8vCisvLyBUaGVyZSBhcmUgc3BlY2lhbCBpbnN0cnVjdGlvbnMsIGxpa2UgdDJNT1ZzcmFfZmxhZyBhbmQgdDJNT1ZzcmxfZmxhZywgd2hpY2gKKy8vIG9ubHkgcmVxdWlyZSB0d28gcmVnaXN0ZXIgb3BlcmFuZHM6IFJkLCBSbSBpbiBBUk0gUmVmZXJlbmNlIE1hbnVhbCB0ZXJtcywgYW5kCisvLyBub3RoaW5nIGVsc2UsIGJlY2F1c2UgdGhlIHNoaWZ0IGFtb3VudCBpcyBhbHJlYWR5IHNwZWNpZmllZC4KKy8vIFNpbWlsYXIgY2FzZSBob2xkcyBmb3IgdDJNT1ZyeCwgdDJBRERyciwgLi4uLCBldGMuCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMkRQU29SZWcoTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBBUk1JbnN0c1tPcGNvZGVdOworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gVElELk9wSW5mbzsKKyAgdW5zaWduZWQgJk9wSWR4ID0gTnVtT3BzQWRkZWQ7CisKKyAgLy8gU3BlY2lhbCBjYXNlIGhhbmRsaW5nLgorICBpZiAoT3Bjb2RlID09IEFSTTo6dDJCUl9KVCkgeworICAgIGFzc2VydChOdW1PcHMgPT0gNAorICAgICAgICAgICAmJiBPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lECisgICAgICAgICAgICYmIE9wSW5mb1sxXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQKKyAgICAgICAgICAgJiYgT3BJbmZvWzJdLlJlZ0NsYXNzIDwgMAorICAgICAgICAgICAmJiBPcEluZm9bM10uUmVnQ2xhc3MgPCAwCisgICAgICAgICAgICYmICJFeGFjdGx5IDQgb3BlcmFuZHMgZXhwZWN0IGFuZCBmaXJzdCB0d28gYXMgcmVnIG9wZXJhbmRzIik7CisgICAgLy8gT25seSBuZWVkIHRvIHBvcHVsYXRlIHRoZSBzcmMgcmVnIG9wZXJhbmQuCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJtKGluc24pKSkpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCkpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oMCkpOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oMCkpOworICAgIE51bU9wc0FkZGVkID0gNDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE9wSWR4ID0gMDsKKworICBhc3NlcnQoTnVtT3BzID49IDIKKyAgICAgICAgICYmIChPcEluZm9bMF0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEIHx8CisgICAgICAgICAgICAgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6ckdQUlJlZ0NsYXNzSUQpCisgICAgICAgICAmJiAoT3BJbmZvWzFdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCB8fAorICAgICAgICAgICAgIE9wSW5mb1sxXS5SZWdDbGFzcyA9PSBBUk06OnJHUFJSZWdDbGFzc0lEKQorICAgICAgICAgJiYgIkV4cGVjdCA+PSAyIG9wZXJhbmRzIGFuZCBmaXJzdCB0d28gYXMgcmVnIG9wZXJhbmRzIik7CisKKyAgYm9vbCBUaHJlZVJlZyA9IChOdW1PcHMgPiAyICYmIChPcEluZm9bMl0uUmVnQ2xhc3MgPT0gQVJNOjpHUFJSZWdDbGFzc0lEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BJbmZvWzJdLlJlZ0NsYXNzID09IEFSTTo6ckdQUlJlZ0NsYXNzSUQpKTsKKyAgYm9vbCBOb0RzdFJlZyA9IChkZWNvZGVScyhpbnNuKSA9PSAweEYpOworCisgIC8vIEJ1aWxkIHRoZSByZWdpc3RlciBvcGVyYW5kcywgZm9sbG93ZWQgYnkgdGhlIGNvbnN0YW50IHNoaWZ0IHNwZWNpZmllci4KKworICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKAorICAgICAgICAgICAgICAgICAgZ2V0UmVnaXN0ZXJFbnVtKEIsIE9wSW5mb1swXS5SZWdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb0RzdFJlZyA/IGRlY29kZVJuKGluc24pIDogZGVjb2RlUnMoaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgaWYgKFRocmVlUmVnKSB7CisgICAgaW50IElkeDsKKyAgICBpZiAoKElkeCA9IFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChPcElkeCwgVE9JOjpUSUVEX1RPKSkgIT0gLTEpIHsKKyAgICAgIC8vIFByb2Nlc3MgdGllZF90byBvcGVyYW5kIGNvbnN0cmFpbnQuCisgICAgICBNSS5hZGRPcGVyYW5kKE1JLmdldE9wZXJhbmQoSWR4KSk7CisgICAgICArK09wSWR4OworICAgIH0gZWxzZSBpZiAoIU5vRHN0UmVnKSB7CisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBPcEluZm9bMV0uUmVnQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgICAgICsrT3BJZHg7CisgICAgfSBlbHNlIHsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiVGh1bWIyIGVuY29kaW5nIGVycm9yOiBkPT0xNSBmb3IgdGhyZWUtcmVnIG9wZXJhbmRzLlxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgT3BJbmZvW09wSWR4XS5SZWdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgaWYgKE51bU9wcyA9PSBPcElkeCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA8IDAgJiYgIU9wSW5mb1tPcElkeF0uaXNQcmVkaWNhdGUoKQorICAgICAgJiYgIU9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpKSB7CisKKyAgICBpZiAoVGh1bWIyU2hpZnRPcGNvZGUoT3Bjb2RlKSkKKyAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZ2V0U2hpZnRBbXRCaXRzKGluc24pKSk7CisgICAgZWxzZSB7CisgICAgICAvLyBCdWlsZCB0aGUgY29uc3RhbnQgc2hpZnQgc3BlY2lmaWVyIG9wZXJhbmQuCisgICAgICB1bnNpZ25lZCBiaXRzMiA9IGdldFNoaWZ0VHlwZUJpdHMoaW5zbik7CisgICAgICB1bnNpZ25lZCBpbW01ID0gZ2V0U2hpZnRBbXRCaXRzKGluc24pOworICAgICAgQVJNX0FNOjpTaGlmdE9wYyBTaE9wID0gQVJNX0FNOjpub19zaGlmdDsKKyAgICAgIHVuc2lnbmVkIFNoQW10ID0gZGVjb2RlSW1tU2hpZnQoYml0czIsIGltbTUsIFNoT3ApOworCisgICAgICAvLyBQS0hCVC9QS0hUQiBhcmUgc3BlY2lhbCBpbiB0aGF0IHdlIG5lZWQgdGhlIGRlY29kZUltbVNoaWZ0KCkgY2FsbCB0bworICAgICAgLy8gZGVjb2RlIHRoZSBzaGlmdCBhbW91bnQgZnJvbSByYXcgaW1tNSBhbmQgYml0czIsIGJ1dCB3ZSBETyBOT1QgbmVlZAorICAgICAgLy8gdG8gZW5jb2RlIHRoZSBTaE9wLCBhcyBpdCdzIGluIHRoZSBhc20gc3RyaW5nIGFscmVhZHkuCisgICAgICBpZiAoT3Bjb2RlID09IEFSTTo6dDJQS0hCVCB8fCBPcGNvZGUgPT0gQVJNOjp0MlBLSFRCKQorICAgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKFNoQW10KSk7CisgICAgICBlbHNlCisgICAgICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oQVJNX0FNOjpnZXRTT1JlZ09wYyhTaE9wLCBTaEFtdCkpKTsKKyAgICB9CisgICAgKytPcElkeDsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBBNi4zLjEgRGF0YS1wcm9jZXNzaW5nIChtb2RpZmllZCBpbW1lZGlhdGUpCisvLworLy8gVHdvIHJlZ2lzdGVyIG9wZXJhbmRzOiBScyBSbiBNb2RJbW0KKy8vIE9uZSByZWdpc3RlciBvcGVyYW5kcyAoUnM9MGIxMTExIG5vIGV4cGxpY2l0IGRlc3QgcmVnKTogUm4gTW9kSW1tCisvLyBPbmUgcmVnaXN0ZXIgb3BlcmFuZHMgKFJuPTBiMTExMSBubyBleHBsaWNpdCBzcmMgcmVnKTogUnMgTW9kSW1tIC0ge3QyTU9WaSwgdDJNVk5pfQorLy8KKy8vIE1vZEltbSA9IFRodW1iRXhwYW5kSW1tKGk6aW1tMzppbW04KQorc3RhdGljIGJvb2wgRGlzYXNzZW1ibGVUaHVtYjJEUE1vZEltbShNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsCisgICAgdWludDMyX3QgaW5zbiwgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAqT3BJbmZvID0gQVJNSW5zdHNbT3Bjb2RlXS5PcEluZm87CisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICB1bnNpZ25lZCBSZFJlZ0NsYXNzSUQgPSBPcEluZm9bMF0uUmVnQ2xhc3M7CisgIGFzc2VydChOdW1PcHMgPj0gMiAmJiAoUmRSZWdDbGFzc0lEID09IEFSTTo6R1BSUmVnQ2xhc3NJRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIFJkUmVnQ2xhc3NJRCA9PSBBUk06OnJHUFJSZWdDbGFzc0lEKQorICAgICAgICAgJiYgIkV4cGVjdCA+PSAyIG9wZXJhbmRzIGFuZCBmaXJzdCBvbmUgYXMgcmVnIG9wZXJhbmQiKTsKKworICB1bnNpZ25lZCBSblJlZ0NsYXNzSUQgPSBPcEluZm9bMV0uUmVnQ2xhc3M7CisgIGJvb2wgVHdvUmVnID0gKFJuUmVnQ2xhc3NJRCA9PSBBUk06OkdQUlJlZ0NsYXNzSUQKKyAgICAgICAgICAgICAgICAgfHwgUm5SZWdDbGFzc0lEID09IEFSTTo6ckdQUlJlZ0NsYXNzSUQpOworICBib29sIE5vRHN0UmVnID0gKGRlY29kZVJzKGluc24pID09IDB4Rik7CisKKyAgLy8gQnVpbGQgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzLCBmb2xsb3dlZCBieSB0aGUgbW9kaWZpZWQgaW1tZWRpYXRlLgorCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoCisgICAgICAgICAgICAgICAgICBnZXRSZWdpc3RlckVudW0oQiwgUmRSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vRHN0UmVnID8gZGVjb2RlUm4oaW5zbikgOiBkZWNvZGVScyhpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICBpZiAoVHdvUmVnKSB7CisgICAgaWYgKE5vRHN0UmVnKSB7CisgICAgICBERUJVRyhlcnJzKCk8PCJUaHVtYjIgZW5jb2RpbmcgZXJyb3I6IGQ9PTE1IGZvciBEUE1vZEltbSAyLXJlZyBpbnN0ci5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBSblJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIC8vIFRoZSBtb2RpZmllZCBpbW1lZGlhdGUgb3BlcmFuZCBzaG91bGQgY29tZSBuZXh0LgorICBhc3NlcnQoT3BJZHggPCBOdW1PcHMgJiYgT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA8IDAgJiYKKyAgICAgICAgICFPcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkgJiYgIU9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpCisgICAgICAgICAmJiAiUHVyZSBpbW0gb3BlcmFuZCBleHBlY3RlZCIpOworCisgIC8vIGk6aW1tMzppbW04CisgIC8vIEE2LjMuMiBNb2RpZmllZCBpbW1lZGlhdGUgY29uc3RhbnRzIGluIFRodW1iIGluc3RydWN0aW9ucworICB1bnNpZ25lZCBpbW0xMiA9IGdldElJbW0zSW1tOChpbnNuKTsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShUaHVtYkV4cGFuZEltbShpbW0xMikpKTsKKyAgKytPcElkeDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIFRodW1iMlNhdHVyYXRlT3Bjb2RlKHVuc2lnbmVkIE9wY29kZSkgeworICBzd2l0Y2ggKE9wY29kZSkgeworICBjYXNlIEFSTTo6dDJTU0FUbHNsOiBjYXNlIEFSTTo6dDJTU0FUYXNyOiBjYXNlIEFSTTo6dDJTU0FUMTY6CisgIGNhc2UgQVJNOjp0MlVTQVRsc2w6IGNhc2UgQVJNOjp0MlVTQVRhc3I6IGNhc2UgQVJNOjp0MlVTQVQxNjoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkZWNvZGVUaHVtYjJTYXR1cmF0ZVBvcyh1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24pIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgY2FzZSBBUk06OnQyU1NBVGxzbDoKKyAgY2FzZSBBUk06OnQyU1NBVGFzcjoKKyAgICByZXR1cm4gc2xpY2UoaW5zbiwgNCwgMCkgKyAxOworICBjYXNlIEFSTTo6dDJTU0FUMTY6CisgICAgcmV0dXJuIHNsaWNlKGluc24sIDMsIDApICsgMTsKKyAgY2FzZSBBUk06OnQyVVNBVGxzbDoKKyAgY2FzZSBBUk06OnQyVVNBVGFzcjoKKyAgICByZXR1cm4gc2xpY2UoaW5zbiwgNCwgMCk7CisgIGNhc2UgQVJNOjp0MlVTQVQxNjoKKyAgICByZXR1cm4gc2xpY2UoaW5zbiwgMywgMCk7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIlVuZXhwZWN0ZWQgb3Bjb2RlIik7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworLy8gQTYuMy4zIERhdGEtcHJvY2Vzc2luZyAocGxhaW4gYmluYXJ5IGltbWVkaWF0ZSkKKy8vCisvLyBvIHQyQUREcmkxMiwgdDJTVUJyaTEyOiBScyBSbiBpbW0xMgorLy8gbyB0MkxFQXBjcmVsIChBRFIpOiBScyBpbW0xMgorLy8gbyB0MkJGQyAoQkZDKTogUnMgUm8oVElFRF9UTykgYmZfaW52X21hc2tfaW1tCisvLyBvIHQyQkZJIChCRkkpIChDdXJyZW50bHkgbm90IGRlZmluZWQgaW4gTExWTSBhcyBvZiBKYW4tMDctMjAxMCkKKy8vIG8gdDJNT1ZpMTY6IFJzIGltbTE2CisvLyBvIHQyTU9WVGkxNjogUnMgaW1tMTYKKy8vIG8gdDJTQkZYIChTQkZYKTogUnMgUm4gbHNiIHdpZHRoCisvLyBvIHQyVUJGWCAoVUJGWCk6IFJzIFJuIGxzYiB3aWR0aAorLy8gbyB0MkJGSSAoQkZJKTogUnMgUm4gbHNiIHdpZHRoCisvLworLy8gW1NpZ25lZHxVbnNpZ25lZF0gU2F0dXJhdGUgWzE2XQorLy8KKy8vIG8gdDJTU0FUW2xzbHxhc3JdLCB0MlVTQVRbbHNsfGFzcl06IFJzIHNhdF9wb3MgUm4gc2hhbXQKKy8vIG8gdDJTU0FUMTYsIHQyVVNBVDE2OiBScyBzYXRfcG9zIFJuCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMkRQQmluSW1tKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwKKyAgICB1aW50MzJfdCBpbnNuLCB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gQVJNSW5zdHNbT3Bjb2RlXTsKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IFRJRC5PcEluZm87CisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICB1bnNpZ25lZCBSZFJlZ0NsYXNzSUQgPSBPcEluZm9bMF0uUmVnQ2xhc3M7CisgIGFzc2VydChOdW1PcHMgPj0gMiAmJiAoUmRSZWdDbGFzc0lEID09IEFSTTo6R1BSUmVnQ2xhc3NJRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIFJkUmVnQ2xhc3NJRCA9PSBBUk06OnJHUFJSZWdDbGFzc0lEKQorICAgICAgICAgJiYgIkV4cGVjdCA+PSAyIG9wZXJhbmRzIGFuZCBmaXJzdCBvbmUgYXMgcmVnIG9wZXJhbmQiKTsKKworICB1bnNpZ25lZCBSblJlZ0NsYXNzSUQgPSBPcEluZm9bMV0uUmVnQ2xhc3M7CisgIGJvb2wgVHdvUmVnID0gKFJuUmVnQ2xhc3NJRCA9PSBBUk06OkdQUlJlZ0NsYXNzSUQKKyAgICAgICAgICAgICAgICAgfHwgUm5SZWdDbGFzc0lEID09IEFSTTo6ckdQUlJlZ0NsYXNzSUQpOworCisgIC8vIEJ1aWxkIHRoZSByZWdpc3RlciBvcGVyYW5kKHMpLCBmb2xsb3dlZCBieSB0aGUgaW1tZWRpYXRlKHMpLgorCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIFJkUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUnMoaW5zbikpKSk7CisgICsrT3BJZHg7CisKKyAgLy8gdDJTU0FUL3QyU1NBVDE2L3QyVVNBVC90MlVTQVQxNiBoYXMgaW1tIG9wZXJhbmQgYWZ0ZXIgUmQuCisgIGlmIChUaHVtYjJTYXR1cmF0ZU9wY29kZShPcGNvZGUpKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShkZWNvZGVUaHVtYjJTYXR1cmF0ZVBvcyhPcGNvZGUsIGluc24pKSk7CisKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBSblJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisKKyAgICBpZiAoT3Bjb2RlID09IEFSTTo6dDJTU0FUMTYgfHwgT3Bjb2RlID09IEFSTTo6dDJVU0FUMTYpIHsKKyAgICAgIE9wSWR4ICs9IDI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBGb3IgU1NBVCBvcGVyYW5kIHJlZyAoUm4pIGhhcyBiZWVuIGRpc2Fzc2VtYmxlZCBhYm92ZS4KKyAgICAvLyBOb3cgZGlzYXNzZW1ibGUgdGhlIHNoaWZ0IGFtb3VudC4KKworICAgIC8vIEluc3R7MTQtMTI6Ny02fSBlbmNvZGVzIHRoZSBpbW01IHNoaWZ0IGFtb3VudC4KKyAgICB1bnNpZ25lZCBTaEFtdCA9IHNsaWNlKGluc24sIDE0LCAxMikgPDwgMiB8IHNsaWNlKGluc24sIDcsIDYpOworCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShTaEFtdCkpOworCisgICAgT3BJZHggKz0gMzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChUd29SZWcpIHsKKyAgICBhc3NlcnQoTnVtT3BzID49IDMgJiYgIkV4cGVjdCA+PSAzIG9wZXJhbmRzIik7CisgICAgaW50IElkeDsKKyAgICBpZiAoKElkeCA9IFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludChPcElkeCwgVE9JOjpUSUVEX1RPKSkgIT0gLTEpIHsKKyAgICAgIC8vIFByb2Nlc3MgdGllZF90byBvcGVyYW5kIGNvbnN0cmFpbnQuCisgICAgICBNSS5hZGRPcGVyYW5kKE1JLmdldE9wZXJhbmQoSWR4KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEFkZCBzcmMgcmVnIG9wZXJhbmQuCisgICAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBSblJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgICB9CisgICAgKytPcElkeDsKKyAgfQorCisgIGlmIChPcGNvZGUgPT0gQVJNOjp0MkJGSSkgeworICAgIC8vIEFkZCB2YWwgcmVnIG9wZXJhbmQuCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgUm5SZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworICAgICsrT3BJZHg7CisgIH0KKworICBhc3NlcnQoT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA8IDAgJiYgIU9wSW5mb1tPcElkeF0uaXNQcmVkaWNhdGUoKQorICAgICAgICAgJiYgIU9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpCisgICAgICAgICAmJiAiUHVyZSBpbW0gb3BlcmFuZCBleHBlY3RlZCIpOworCisgIC8vIFByZS1pbmNyZW1lbnQgT3BJZHguCisgICsrT3BJZHg7CisKKyAgaWYgKE9wY29kZSA9PSBBUk06OnQyQUREcmkxMiB8fCBPcGNvZGUgPT0gQVJNOjp0MlNVQnJpMTIKKyAgICAgIHx8IE9wY29kZSA9PSBBUk06OnQyTEVBcGNyZWwpCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShnZXRJSW1tM0ltbTgoaW5zbikpKTsKKyAgZWxzZSBpZiAoT3Bjb2RlID09IEFSTTo6dDJNT1ZpMTYgfHwgT3Bjb2RlID09IEFSTTo6dDJNT1ZUaTE2KQorICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZ2V0SW1tMTYoaW5zbikpKTsKKyAgZWxzZSBpZiAoT3Bjb2RlID09IEFSTTo6dDJCRkMgfHwgT3Bjb2RlID09IEFSTTo6dDJCRkkpIHsKKyAgICB1aW50MzJfdCBtYXNrID0gMDsKKyAgICBpZiAoZ2V0Qml0ZmllbGRJbnZNYXNrKGluc24sIG1hc2spKQorICAgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShtYXNrKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIC8vIEhhbmRsZSB0aGUgY2FzZSBvZjogbHNiIHdpZHRoCisgICAgYXNzZXJ0KChPcGNvZGUgPT0gQVJNOjp0MlNCRlggfHwgT3Bjb2RlID09IEFSTTo6dDJVQkZYKQorICAgICAgICAgICAgJiYgIlVuZXhwZWN0ZWQgb3Bjb2RlIik7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShnZXRMc2IoaW5zbikpKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKGdldFdpZHRoTWludXMxKGluc24pICsgMSkpOworCisgICAgKytPcElkeDsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBBNi4zLjQgVGFibGUgQTYtMTUgTWlzY2VsbGFuZW91cyBjb250cm9sIGluc3RydWN0aW9ucworLy8gQTguNi40MSBETUIKKy8vIEE4LjYuNDIgRFNCCisvLyBBOC42LjQ5IElTQgorc3RhdGljIGlubGluZSBib29sIHQyTWlzY0N0cmxJbnN0cih1aW50MzJfdCBpbnNuKSB7CisgIGlmIChzbGljZShpbnNuLCAzMSwgMjApID09IDB4ZjNiICYmIHNsaWNlKGluc24sIDE1LCAxNCkgPT0gMiAmJgorICAgICAgc2xpY2UoaW5zbiwgMTIsIDEyKSA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8gQTYuMy40IEJyYW5jaGVzIGFuZCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wKKy8vCisvLyBBOC42LjE2IEIKKy8vIEJyYW5jaGVzOiB0MkIsIHQyQmNjIC0+IGltbSBvcGVyYW5kCisvLworLy8gQnJhbmNoZXM6IHQyVFBzb2Z0IC0+IG5vIG9wZXJhbmQKKy8vCisvLyBBOC42LjIzIEJMLCBCTFggKGltbWVkaWF0ZSkKKy8vIEJyYW5jaGVzIChkZWZpbmVkIGluIEFSTUluc3RyVGh1bWIudGQpOiB0QkxyOSwgdEJMWGlfcjkgLT4gaW1tIG9wZXJhbmQKKy8vCisvLyBBOC42LjI2CisvLyB0MkJYSiAtPiBSbgorLy8KKy8vIE1pc2NlbGxhbmVvdXMgY29udHJvbDogdDJJbnRfTWVtQmFycmllclY3IChhbmQgaXRzIHQyRE1CIHZhcmlhbnRzKSwKKy8vIHQySW50X1N5bmNCYXJyaWVyVjcgKGFuZCBpdHMgdDJEU0IgdmFyaWFuc3QpLCB0MklTQnN5LCB0MkNMUkVYCisvLyAgIC0+IG5vIG9wZXJhbmQgKGV4Y2VwdCBwcmVkLWltbSBwcmVkLWNjciBmb3IgQ0xSRVgsIG1lbW9yeSBiYXJyaWVyIHZhcmlhbnRzKQorLy8KKy8vIEhpbnQ6IHQyTk9QLCB0MllJRUxELCB0MldGRSwgdDJXRkksIHQyU0VWCisvLyAgIC0+IG5vIG9wZXJhbmQgKGV4Y2VwdCBwcmVkLWltbSBwcmVkLWNjcikKKy8vCisvLyB0MkRCRyAtPiBpbW00ID0gSW5zdHszLTB9CisvLworLy8gdDJNUlMvdDJNUlNzeXMgLT4gUnMKKy8vIHQyTVNSL3QyTVNSc3lzIC0+IFJuIG1hc2s9SW5zdHsxMS04fQorLy8gdDJTTUMgLT4gaW1tNCA9IEluc3R7MTktMTZ9CitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMkJyTWlzY0N0cmwoTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLAorICAgIHVpbnQzMl90IGluc24sIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgaWYgKE51bU9wcyA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICh0Mk1pc2NDdHJsSW5zdHIoaW5zbikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgY2FzZSBBUk06OnQyQ0xSRVg6CisgIGNhc2UgQVJNOjp0Mk5PUDoKKyAgY2FzZSBBUk06OnQyWUlFTEQ6CisgIGNhc2UgQVJNOjp0MldGRToKKyAgY2FzZSBBUk06OnQyV0ZJOgorICBjYXNlIEFSTTo6dDJTRVY6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICAvLyBDUFMgaGFzIGEgc2luZ2xldG9uICRvcHQgb3BlcmFuZCB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgIC8vIG9wdHs0LTB9ID0gbW9kZSBmcm9tIEluc3R7NC0wfQorICAvLyBvcHR7NX0gPSBjaGFuZ2Vtb2RlIGZyb20gSW5zdHs4fQorICAvLyBvcHR7OC02fSA9IEFJRiBmcm9tIEluc3R7Ny01fQorICAvLyBvcHR7MTAtOX0gPSBpbW9kIGZyb20gSW5zdHsxMC05fSB3aXRoIDBiMTAgYXMgZW5hYmxlIGFuZCAwYjExIGFzIGRpc2FibGUKKyAgaWYgKE9wY29kZSA9PSBBUk06OnQyQ1BTKSB7CisgICAgdW5zaWduZWQgT3B0aW9uID0gc2xpY2UoaW5zbiwgNCwgMCkgfCBzbGljZShpbnNuLCA4LCA4KSA8PCA1IHwKKyAgICAgIHNsaWNlKGluc24sIDcsIDUpIDw8IDYgfCBzbGljZShpbnNuLCAxMCwgOSkgPDwgOTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKE9wdGlvbikpOworICAgIE51bU9wc0FkZGVkID0gMTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIERCRyBoYXMgaXRzIG9wdGlvbiBzcGVjaWZpZWQgaW4gSW5zdHszLTB9LgorICBpZiAoT3Bjb2RlID09IEFSTTo6dDJEQkcpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKHNsaWNlKGluc24sIDMsIDApKSk7CisgICAgTnVtT3BzQWRkZWQgPSAxOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gTVJTIGFuZCBNUlNzeXMgdGFrZSBvbmUgR1BSIHJlZyBScy4KKyAgaWYgKE9wY29kZSA9PSBBUk06OnQyTVJTIHx8IE9wY29kZSA9PSBBUk06OnQyTVJTc3lzKSB7CisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJzKGluc24pKSkpOworICAgIE51bU9wc0FkZGVkID0gMTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAvLyBCWEogdGFrZXMgb25lIEdQUiByZWcgUm4uCisgIGlmIChPcGNvZGUgPT0gQVJNOjp0MkJYSikgeworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgICBOdW1PcHNBZGRlZCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gTVNSIGFuZCBNU1JzeXMgdGFrZSBvbmUgR1BSIHJlZyBSbiwgZm9sbG93ZWQgYnkgdGhlIG1hc2suCisgIGlmIChPcGNvZGUgPT0gQVJNOjp0Mk1TUiB8fCBPcGNvZGUgPT0gQVJNOjp0Mk1TUnN5cyB8fCBPcGNvZGUgPT0gQVJNOjp0MkJYSikgeworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKHNsaWNlKGluc24sIDExLCA4KSkpOworICAgIE51bU9wc0FkZGVkID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAvLyBTTUMgdGFrZSBpbW00LgorICBpZiAoT3Bjb2RlID09IEFSTTo6dDJTTUMpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKHNsaWNlKGluc24sIDE5LCAxNikpKTsKKyAgICBOdW1PcHNBZGRlZCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBBZGQgdGhlIGltbSBvcGVyYW5kLgorICBpbnQgT2Zmc2V0ID0gMDsKKworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OgorICAgIGFzc2VydCgwICYmICJVbmV4cGVjdGVkIG9wY29kZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBBUk06OnQyQjoKKyAgICBPZmZzZXQgPSBkZWNvZGVJbW0zMl9CX0VuY29kaW5nVDQoaW5zbik7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjp0MkJjYzoKKyAgICBPZmZzZXQgPSBkZWNvZGVJbW0zMl9CX0VuY29kaW5nVDMoaW5zbik7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjp0QkxyOToKKyAgICBPZmZzZXQgPSBkZWNvZGVJbW0zMl9CTChpbnNuKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk06OnRCTFhpX3I5OgorICAgIE9mZnNldCA9IGRlY29kZUltbTMyX0JMWChpbnNuKTsKKyAgICBicmVhazsKKyAgfQorICAvLyBXaGVuIGV4ZWN1dGluZyBhIFRodW1iIGluc3RydWN0aW9uLCBQQyByZWFkcyBhcyB0aGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudAorICAvLyBpbnN0cnVjdGlvbiBwbHVzIDQuICBUaGUgYXNzZW1ibGVyIHN1YnRyYWN0cyA0IGZyb20gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAvLyB0aGUgYnJhbmNoIGluc3RydWN0aW9uIGFuZCB0aGUgdGFyZ2V0IGFkZHJlc3MsIGRpc2Fzc2VtYmxlciBoYXMgdG8gYWRkIDQgdG8KKyAgLy8gdG8gY29tcGVuc2F0ZS4KKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShPZmZzZXQgKyA0KSk7CisKKyAgTnVtT3BzQWRkZWQgPSAxOworCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgVGh1bWIyUHJlbG9hZE9wY29kZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgQVJNOjp0MlBMRGkxMjogICBjYXNlIEFSTTo6dDJQTERpODogICBjYXNlIEFSTTo6dDJQTERwY2k6CisgIGNhc2UgQVJNOjp0MlBMRHI6ICAgICBjYXNlIEFSTTo6dDJQTERzOgorICBjYXNlIEFSTTo6dDJQTERXaTEyOiAgY2FzZSBBUk06OnQyUExEV2k4OiAgY2FzZSBBUk06OnQyUExEV3BjaToKKyAgY2FzZSBBUk06OnQyUExEV3I6ICAgIGNhc2UgQVJNOjp0MlBMRFdzOgorICBjYXNlIEFSTTo6dDJQTElpMTI6ICAgY2FzZSBBUk06OnQyUExJaTg6ICAgY2FzZSBBUk06OnQyUExJcGNpOgorICBjYXNlIEFSTTo6dDJQTElyOiAgICAgY2FzZSBBUk06OnQyUExJczoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMlByZUxvYWQoTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgLy8gUHJlbG9hZCBEYXRhL0luc3RydWN0aW9uIHJlcXVpcmVzIGVpdGhlciAyIG9yIDMgb3BlcmFuZHMuCisgIC8vIHQyUExEaTEyLCB0MlBMRGk4LCB0MlBMRHBjaTogUm4gWysvLV1pbW0xMi9pbW04CisgIC8vIHQyUExEcjogICAgICAgICAgICAgICAgICAgICAgUm4gUm0KKyAgLy8gdDJQTERzOiAgICAgICAgICAgICAgICAgICAgICBSbiBSbSBpbW0yPUluc3R7NS00fQorICAvLyBTYW1lIHBhdHRlcm4gYXBwbGllcyBmb3IgdDJQTERXKiBhbmQgdDJQTEkqLgorCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gQVJNSW5zdHNbT3Bjb2RlXTsKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IFRJRC5PcEluZm87CisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICBhc3NlcnQoTnVtT3BzID49IDIgJiYKKyAgICAgICAgIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgICJFeHBlY3QgPj0gMiBvcGVyYW5kcyBhbmQgZmlyc3Qgb25lIGFzIHJlZyBvcGVyYW5kIik7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSbihpbnNuKSkpKTsKKyAgKytPcElkeDsKKworICBpZiAoT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KE9wSW5mb1tPcElkeF0uUmVnQ2xhc3MgPCAwICYmICFPcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkKKyAgICAgICAgICAgJiYgIU9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpCisgICAgICAgICAgICYmICJQdXJlIGltbSBvcGVyYW5kIGV4cGVjdGVkIik7CisgICAgaW50IE9mZnNldCA9IDA7CisgICAgaWYgKE9wY29kZSA9PSBBUk06OnQyUExEcGNpIHx8IE9wY29kZSA9PSBBUk06OnQyUExEV3BjaSB8fAorICAgICAgICAgICAgIE9wY29kZSA9PSBBUk06OnQyUExJcGNpKSB7CisgICAgICBib29sIE5lZ2F0aXZlID0gc2xpY2UoaW5zbiwgMjMsIDIzKSA9PSAwOworICAgICAgdW5zaWduZWQgSW1tMTIgPSBnZXRJbW0xMihpbnNuKTsKKyAgICAgIE9mZnNldCA9IE5lZ2F0aXZlID8gLTEgLSBJbW0xMiA6IDEgKiBJbW0xMjsgICAgICAKKyAgICB9IGVsc2UgaWYgKE9wY29kZSA9PSBBUk06OnQyUExEaTggfHwgT3Bjb2RlID09IEFSTTo6dDJQTERXaTggfHwKKyAgICAgICAgICAgICAgIE9wY29kZSA9PSBBUk06OnQyUExJaTgpIHsKKyAgICAgIC8vIEE4LjYuMTE3IEVuY29kaW5nIFQyOiBhZGQgPSBGQUxTRQorICAgICAgdW5zaWduZWQgSW1tOCA9IGdldEltbTgoaW5zbik7CisgICAgICBPZmZzZXQgPSAtMSAtIEltbTg7CisgICAgfSBlbHNlIC8vIFRoZSBpMTIgZm9ybXMuICBTZWUsIGZvciBleGFtcGxlLCBBOC42LjExNyBFbmNvZGluZyBUMS4KKyAgICAgIE9mZnNldCA9IGRlY29kZUltbTEyKGluc24pOworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oT2Zmc2V0KSk7CisgIH0KKyAgKytPcElkeDsKKworICBpZiAoT3BJZHggPCBOdW1PcHMgJiYgT3BJbmZvW09wSWR4XS5SZWdDbGFzcyA8IDAgJiYKKyAgICAgICFPcEluZm9bT3BJZHhdLmlzUHJlZGljYXRlKCkgJiYgIU9wSW5mb1tPcElkeF0uaXNPcHRpb25hbERlZigpKSB7CisgICAgLy8gRmlsbHMgaW4gdGhlIHNoaWZ0IGFtb3VudCBmb3IgdDJQTERzLCB0MlBMRFdzLCB0MlBMSXMuCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShzbGljZShpbnNuLCA1LCA0KSkpOworICAgICsrT3BJZHg7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQTguNi42MyBMRFJCIChsaXRlcmFsKQorLy8gQTguNi43OSBMRFJTQiAobGl0ZXJhbCkKKy8vIEE4LjYuNzUgTERSSCAobGl0ZXJhbCkKKy8vIEE4LjYuODMgTERSU0ggKGxpdGVyYWwpCisvLyBBOC42LjU5IExEUiAobGl0ZXJhbCkKKy8vCisvLyBUaGVzZSBpbnN0cnMgY2FsY3VsYXRlIGFuIGFkZHJlc3MgZnJvbSB0aGUgUEMgdmFsdWUgYW5kIGFuIGltbWVkaWF0ZSBvZmZzZXQuCisvLyBSZCBSbj1QQyAoKy8tKWltbTEyICgrIGlmIEluc3R7MjN9ID09IDBiMSkKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIyTGRwY2koTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLAorICAgIHVpbnQzMl90IGluc24sIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IEFSTUluc3RzW09wY29kZV0uT3BJbmZvOworICBpZiAoIU9wSW5mbykgcmV0dXJuIGZhbHNlOworCisgIGFzc2VydChOdW1PcHMgPj0gMiAmJgorICAgICAgICAgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgT3BJbmZvWzFdLlJlZ0NsYXNzIDwgMCAmJgorICAgICAgICAgIkV4cGVjdCA+PSAyIG9wZXJhbmRzLCBmaXJzdCBhcyByZWcsIGFuZCBzZWNvbmQgYXMgaW1tIG9wZXJhbmQiKTsKKworICAvLyBCdWlsZCB0aGUgcmVnaXN0ZXIgb3BlcmFuZCwgZm9sbG93ZWQgYnkgdGhlICgrLy0paW1tMTIgaW1tZWRpYXRlLgorCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6R1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmQoaW5zbikpKSk7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShkZWNvZGVJbW0xMihpbnNuKSkpOworCisgIE51bU9wc0FkZGVkID0gMjsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQTYuMy4xMCBTdG9yZSBzaW5nbGUgZGF0YSBpdGVtCisvLyBBNi4zLjkgTG9hZCBieXRlLCBtZW1vcnkgaGludHMKKy8vIEE2LjMuOCBMb2FkIGhhbGZ3b3JkLCBtZW1vcnkgaGludHMKKy8vIEE2LjMuNyBMb2FkIHdvcmQKKy8vCisvLyBGb3IgZXhhbXBsZSwKKy8vCisvLyB0MkxEUmkxMjogICBSZCBSbiAoKylpbW0xMgorLy8gdDJMRFJpODogICAgUmQgUm4gKCsvLSlpbW04ICgrIGlmIEluc3R7OX0gPT0gMGIxKQorLy8gdDJMRFJzOiAgICAgUmQgUm4gUm0gQ29uc3RhbnRTaGlmdFNwZWNpZmllciAoc2VlIGFsc28gRGlzYXNzZW1ibGVUaHVtYjJEUFNvUmVnKQorLy8gdDJMRFJfUE9TVDogUmQgUm4gUm4oVElFRF9UTykgKCsvLSlpbW04ICgrIGlmIEluc3R7OX0gPT0gMGIxKQorLy8gdDJMRFJfUFJFOiAgUmQgUm4gUm4oVElFRF9UTykgKCsvLSlpbW04ICgrIGlmIEluc3R7OX0gPT0gMGIxKQorLy8KKy8vIHQyU1RSaTEyOiAgIFJkIFJuICgrKWltbTEyCisvLyB0MlNUUmk4OiAgICBSZCBSbiAoKy8tKWltbTggKCsgaWYgSW5zdHs5fSA9PSAwYjEpCisvLyB0MlNUUnM6ICAgICBSZCBSbiBSbSBDb25zdGFudFNoaWZ0U3BlY2lmaWVyIChzZWUgYWxzbyBEaXNhc3NlbWJsZVRodW1iMkRQU29SZWcpCisvLyB0MlNUUl9QT1NUOiBSbiBSZCBSbihUSUVEX1RPKSAoKy8tKWltbTggKCsgaWYgSW5zdHs5fSA9PSAwYjEpCisvLyB0MlNUUl9QUkU6ICBSbiBSZCBSbihUSUVEX1RPKSAoKy8tKWltbTggKCsgaWYgSW5zdHs5fSA9PSAwYjEpCisvLworLy8gTm90ZSB0aGF0IGZvciBpbmRleGVkIG1vZGVzLCB0aGUgUm4oVElFRF9UTykgb3BlcmFuZCBuZWVkcyB0byBiZSBwb3B1bGF0ZWQKKy8vIGNvcnJlY3RseSwgYXMgTExWTSBBc21QcmludGVyIGRlcGVuZHMgb24gaXQuICBGb3IgaW5kZXhlZCBzdG9yZXMsIHRoZSBmaXJzdAorLy8gb3BlcmFuZCBpcyBSbjsgZm9yIGFsbCB0aGUgb3RoZXIgaW5zdHJ1Y3Rpb25zLCBSZCBpcyB0aGUgZmlyc3Qgb3BlcmFuZC4KKy8vCisvLyBEZWxlZ2F0ZXMgdG8gRGlzYXNzZW1ibGVUaHVtYjJQcmVMb2FkKCkgZm9yIHByZWxvYWQgZGF0YS9pbnN0cnVjdGlvbi4KKy8vIERlbGVnYXRlcyB0byBEaXNhc3NlbWJsZVRodW1iMkxkcGNpKCkgZm9yIGxvYWQgKiBsaXRlcmFsIG9wZXJhdGlvbnMuCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMkxkU3QoYm9vbCBMb2FkLCBNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsCisgICAgdWludDMyX3QgaW5zbiwgdW5zaWduZWQgc2hvcnQgTnVtT3BzLCB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICB1bnNpZ25lZCBSbiA9IGRlY29kZVJuKGluc24pOworCisgIGlmIChUaHVtYjJQcmVsb2FkT3Bjb2RlKE9wY29kZSkpCisgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIyUHJlTG9hZChNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLCBCKTsKKworICAvLyBTZWUsIGZvciBleGFtcGxlLCBBNi4zLjcgTG9hZCB3b3JkOiBUYWJsZSBBNi0xOCBMb2FkIHdvcmQuCisgIGlmIChMb2FkICYmIFJuID09IDE1KQorICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMkxkcGNpKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIEIpOworCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gQVJNSW5zdHNbT3Bjb2RlXTsKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IFRJRC5PcEluZm87CisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICBhc3NlcnQoTnVtT3BzID49IDMgJiYKKyAgICAgICAgIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgIE9wSW5mb1sxXS5SZWdDbGFzcyA9PSBBUk06OkdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgICJFeHBlY3QgPj0gMyBvcGVyYW5kcyBhbmQgZmlyc3QgdHdvIGFzIHJlZyBvcGVyYW5kcyIpOworCisgIGJvb2wgVGhyZWVSZWcgPSAoT3BJbmZvWzJdLlJlZ0NsYXNzID09IEFSTTo6R1BSUmVnQ2xhc3NJRCk7CisgIGJvb2wgVElFRF9UTyA9IFRocmVlUmVnICYmIFRJRC5nZXRPcGVyYW5kQ29uc3RyYWludCgyLCBUT0k6OlRJRURfVE8pICE9IC0xOworICBib29sIEltbTEyID0gIVRocmVlUmVnICYmIHNsaWNlKGluc24sIDIzLCAyMykgPT0gMTsgLy8gQVJNSW5zdHJUaHVtYjIudGQKKworICAvLyBCdWlsZCB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMsIGZvbGxvd2VkIGJ5IHRoZSBpbW1lZGlhdGUuCisgIHVuc2lnbmVkIFIwLCBSMSwgUjIgPSAwOworICB1bnNpZ25lZCBSZCA9IGRlY29kZVJkKGluc24pOworICBpbnQgSW1tID0gMDsKKworICBpZiAoIUxvYWQgJiYgVElFRF9UTykgeworICAgIFIwID0gUm47CisgICAgUjEgPSBSZDsKKyAgfSBlbHNlIHsKKyAgICBSMCA9IFJkOworICAgIFIxID0gUm47CisgIH0KKyAgaWYgKFRocmVlUmVnKSB7CisgICAgaWYgKFRJRURfVE8pIHsKKyAgICAgIFIyID0gUm47CisgICAgICBJbW0gPSBkZWNvZGVJbW04KGluc24pOworICAgIH0gZWxzZSB7CisgICAgICBSMiA9IGRlY29kZVJtKGluc24pOworICAgICAgLy8gU2VlLCBmb3IgZXhhbXBsZSwgQTguNi42NCBMRFJCIChyZWdpc3RlcikuCisgICAgICAvLyBBbmQgQVJNQXNtUHJpbnRlcjo6cHJpbnRUMkFkZHJNb2RlU29SZWdPcGVyYW5kKCkuCisgICAgICAvLyBMU0wgaXMgdGhlIGRlZmF1bHQgc2hpZnQgb3BjLCBhbmQgTExWTSBkb2VzIG5vdCBleHBlY3QgaXQgdG8gYmUgZW5jb2RlZAorICAgICAgLy8gYXMgcGFydCBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQuCisgICAgICAvLyBJbW0gPSBBUk1fQU06OmdldFNPUmVnT3BjKEFSTV9BTTo6bHNsLCBzbGljZShpbnNuLCA1LCA0KSk7CisgICAgICBJbW0gPSBzbGljZShpbnNuLCA1LCA0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKEltbTEyKQorICAgICAgSW1tID0gZ2V0SW1tMTIoaW5zbik7CisgICAgZWxzZQorICAgICAgSW1tID0gZGVjb2RlSW1tOChpbnNuKTsKKyAgfQorICAKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSMCkpKTsKKyAgKytPcElkeDsKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSMSkpKTsKKyAgKytPcElkeDsKKworICBpZiAoVGhyZWVSZWcpIHsKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OkdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUjIpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIGFzc2VydChPcEluZm9bT3BJZHhdLlJlZ0NsYXNzIDwgMCAmJiAhT3BJbmZvW09wSWR4XS5pc1ByZWRpY2F0ZSgpCisgICAgICAgICAmJiAhT3BJbmZvW09wSWR4XS5pc09wdGlvbmFsRGVmKCkKKyAgICAgICAgICYmICJQdXJlIGltbSBvcGVyYW5kIGV4cGVjdGVkIik7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShJbW0pKTsKKyAgKytPcElkeDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQTYuMy4xMiBEYXRhLXByb2Nlc3NpbmcgKHJlZ2lzdGVyKQorLy8KKy8vIFR3byByZWdpc3RlciBvcGVyYW5kcyBbcm90YXRlXTogICBScyBSbSBbcm90YXRpb24oPSAocm90YXRlOicwMDAnKSldCisvLyBUaHJlZSByZWdpc3RlciBvcGVyYW5kcyBvbmx5OiAgICAgUnMgUm4gUm0KKy8vIFRocmVlIHJlZ2lzdGVyIG9wZXJhbmRzIFtyb3RhdGVdOiBScyBSbiBSbSBbcm90YXRpb24oPSAocm90YXRlOicwMDAnKSldCisvLworLy8gUGFyYWxsZWwgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uIDMyLWJpdCBUaHVtYiBpbnN0cnVjdGlvbnM6IFJzIFJuIFJtCisvLworLy8gTWlzY2VsbGFuZW91cyBvcGVyYXRpb25zOiBScyBbUm5dIFJtCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMkRQUmVnKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gQVJNSW5zdHNbT3Bjb2RlXTsKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IFRJRC5PcEluZm87CisgIHVuc2lnbmVkICZPcElkeCA9IE51bU9wc0FkZGVkOworCisgIE9wSWR4ID0gMDsKKworICBhc3NlcnQoTnVtT3BzID49IDIgJiYKKyAgICAgICAgIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OnJHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpyR1BSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgIkV4cGVjdCA+PSAyIG9wZXJhbmRzIGFuZCBmaXJzdCB0d28gYXMgcmVnIG9wZXJhbmRzIik7CisKKyAgLy8gQnVpbGQgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzLCBmb2xsb3dlZCBieSB0aGUgb3B0aW9uYWwgcm90YXRpb24gYW1vdW50LgorCisgIGJvb2wgVGhyZWVSZWcgPSBOdW1PcHMgPiAyICYmIE9wSW5mb1syXS5SZWdDbGFzcyA9PSBBUk06OnJHUFJSZWdDbGFzc0lEOworCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6ckdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJzKGluc24pKSkpOworICArK09wSWR4OworCisgIGlmIChUaHJlZVJlZykgeworICAgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6ckdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisgICAgKytPcElkeDsKKyAgfQorCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6ckdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJtKGluc24pKSkpOworICArK09wSWR4OworCisgIGlmIChPcElkeCA8IE51bU9wcyAmJiBPcEluZm9bT3BJZHhdLlJlZ0NsYXNzIDwgMAorICAgICAgJiYgIU9wSW5mb1tPcElkeF0uaXNQcmVkaWNhdGUoKSAmJiAhT3BJbmZvW09wSWR4XS5pc09wdGlvbmFsRGVmKCkpIHsKKyAgICAvLyBBZGQgdGhlIHJvdGF0aW9uIGFtb3VudCBpbW1lZGlhdGUuCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUltbShkZWNvZGVSb3RhdGUoaW5zbikpKTsKKyAgICArK09wSWR4OworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEE2LjMuMTYgTXVsdGlwbHksIG11bHRpcGx5IGFjY3VtdWxhdGUsIGFuZCBhYnNvbHV0ZSBkaWZmZXJlbmNlCisvLworLy8gdDJNTEEsIHQyTUxTLCB0MlNNTUxBLCB0MlNNTUxTOiBScyBSbiBSbSBSYT1JbnN0ezE1LTEyfQorLy8gdDJNVUwsIHQyU01NVUw6ICAgICAgICAgICAgICAgICBScyBSbiBSbQorLy8gdDJTTUxBW0JCfEJUfFRCfFRUfFdCfFdUXTogICAgICBScyBSbiBSbSBSYT1JbnN0ezE1LTEyfQorLy8gdDJTTVVMW0JCfEJUfFRCfFRUfFdCfFdUXTogICAgICBScyBSbiBSbQorLy8KKy8vIER1YWwgaGFsZndvcmQgbXVsdGlwbHk6IHQyU01VQURbWF0sIHQyU01VU0RbWF0sIHQyU01MQURbWF0sIHQyU01MU0RbWF06CisvLyAgIFJzIFJuIFJtIFJhPUluc3R7MTUtMTJ9CisvLworLy8gVW5zaWduZWQgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIFthbmQgQWNjdW11bGF0ZV0KKy8vICAgIFJzIFJuIFJtIFtSYT1JbnN0ezE1LTEyfV0KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIyTXVsKE1DSW5zdCAmTUksIHVuc2lnbmVkIE9wY29kZSwgdWludDMyX3QgaW5zbiwKKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1PcHMsIHVuc2lnbmVkICZOdW1PcHNBZGRlZCwgQk8gQikgeworCisgIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvICpPcEluZm8gPSBBUk1JbnN0c1tPcGNvZGVdLk9wSW5mbzsKKworICBhc3NlcnQoTnVtT3BzID49IDMgJiYKKyAgICAgICAgIE9wSW5mb1swXS5SZWdDbGFzcyA9PSBBUk06OnJHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICBPcEluZm9bMV0uUmVnQ2xhc3MgPT0gQVJNOjpyR1BSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgT3BJbmZvWzJdLlJlZ0NsYXNzID09IEFSTTo6ckdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgICJFeHBlY3QgPj0gMyBvcGVyYW5kcyBhbmQgZmlyc3QgdGhyZWUgYXMgcmVnIG9wZXJhbmRzIik7CisKKyAgLy8gQnVpbGQgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzLgorCisgIGJvb2wgRm91clJlZyA9IE51bU9wcyA+IDMgJiYgT3BJbmZvWzNdLlJlZ0NsYXNzID09IEFSTTo6ckdQUlJlZ0NsYXNzSUQ7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpyR1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUnMoaW5zbikpKSk7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpyR1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm4oaW5zbikpKSk7CisKKyAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpyR1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlUm0oaW5zbikpKSk7CisKKyAgaWYgKEZvdXJSZWcpCisgICAgTUkuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRSZWdpc3RlckVudW0oQiwgQVJNOjpyR1BSUmVnQ2xhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVSZChpbnNuKSkpKTsKKworICBOdW1PcHNBZGRlZCA9IEZvdXJSZWcgPyA0IDogMzsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQTYuMy4xNyBMb25nIG11bHRpcGx5LCBsb25nIG11bHRpcGx5IGFjY3VtdWxhdGUsIGFuZCBkaXZpZGUKKy8vCisvLyB0MlNNVUxMLCB0MlVNVUxMLCB0MlNNTEFMLCB0MlVNTEFMLCB0MlVNQUFMOiBSZExvIFJkSGkgUm4gUm0KKy8vIHdoZXJlIFJkTG8gPSBJbnN0ezE1LTEyfSBhbmQgUmRIaSA9IEluc3R7MTEtOH0KKy8vCisvLyBIYWxmd29yZCBtdWx0aXBsZSBhY2N1bXVsYXRlIGxvbmc6IHQyU01MQUw8eD48eT46IFJkTG8gUmRIaSBSbiBSbQorLy8gd2hlcmUgUmRMbyA9IEluc3R7MTUtMTJ9IGFuZCBSZEhpID0gSW5zdHsxMS04fQorLy8KKy8vIER1YWwgaGFsZndvcmQgbXVsdGlwbGU6IHQyU01MQUxEW1hdLCB0MlNNTFNMRFtYXTogUmRMbyBSZEhpIFJuIFJtCisvLyB3aGVyZSBSZExvID0gSW5zdHsxNS0xMn0gYW5kIFJkSGkgPSBJbnN0ezExLTh9CisvLworLy8gU2lnbmVkL1Vuc2lnbmVkIGRpdmlkZTogdDJTRElWLCB0MlVESVY6IFJzIFJuIFJtCitzdGF0aWMgYm9vbCBEaXNhc3NlbWJsZVRodW1iMkxvbmdNdWwoTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCKSB7CisKKyAgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gKk9wSW5mbyA9IEFSTUluc3RzW09wY29kZV0uT3BJbmZvOworCisgIGFzc2VydChOdW1PcHMgPj0gMyAmJgorICAgICAgICAgT3BJbmZvWzBdLlJlZ0NsYXNzID09IEFSTTo6ckdQUlJlZ0NsYXNzSUQgJiYKKyAgICAgICAgIE9wSW5mb1sxXS5SZWdDbGFzcyA9PSBBUk06OnJHUFJSZWdDbGFzc0lEICYmCisgICAgICAgICBPcEluZm9bMl0uUmVnQ2xhc3MgPT0gQVJNOjpyR1BSUmVnQ2xhc3NJRCAmJgorICAgICAgICAgIkV4cGVjdCA+PSAzIG9wZXJhbmRzIGFuZCBmaXJzdCB0aHJlZSBhcyByZWcgb3BlcmFuZHMiKTsKKworICBib29sIEZvdXJSZWcgPSBOdW1PcHMgPiAzICYmIE9wSW5mb1szXS5SZWdDbGFzcyA9PSBBUk06OnJHUFJSZWdDbGFzc0lEOworCisgIC8vIEJ1aWxkIHRoZSByZWdpc3RlciBvcGVyYW5kcy4KKworICBpZiAoRm91clJlZykKKyAgICBNSS5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZ2lzdGVyRW51bShCLCBBUk06OnJHUFJSZWdDbGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJkKGluc24pKSkpOworCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6ckdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJzKGluc24pKSkpOworCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6ckdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJuKGluc24pKSkpOworCisgIE1JLmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0UmVnaXN0ZXJFbnVtKEIsIEFSTTo6ckdQUlJlZ0NsYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVJtKGluc24pKSkpOworCisgIGlmIChGb3VyUmVnKQorICAgIE51bU9wc0FkZGVkID0gNDsKKyAgZWxzZQorICAgIE51bU9wc0FkZGVkID0gMzsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU2VlIEE2LjMgMzItYml0IFRodW1iIGluc3RydWN0aW9uIGVuY29kaW5nIGZvciBpbnN0cnVjdGlvbiBjbGFzc2VzCisvLyBjb3JyZXNwb25kaW5nIHRvIChvcDEsIG9wMiwgb3ApLgorLy8KKy8vIFRhYmxlIEE2LTkgMzItYml0IFRodW1iIGluc3RydWN0aW9uIGVuY29kaW5nCisvLyBvcDEJb3AyCQlvcAlJbnN0cnVjdGlvbiBjbGFzcywgc2VlCisvLyAtLS0JLS0tLS0tLQktLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDAxCTAweHgweHgJLQlMb2FkL3N0b3JlIG11bHRpcGxlIG9uIHBhZ2UgQTYtMjMKKy8vIAkJMDB4eDF4eAktCUxvYWQvc3RvcmUgZHVhbCwgbG9hZC9zdG9yZSBleGNsdXNpdmUsIHRhYmxlIGJyYW5jaCBvbiBwYWdlIEE2LTI0CisvLyAJCTAxeHh4eHgJLQlEYXRhLXByb2Nlc3NpbmcgKHNoaWZ0ZWQgcmVnaXN0ZXIpIG9uIHBhZ2UgQTYtMzEKKy8vIAkJMXh4eHh4eAktCUNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyBvbiBwYWdlIEE2LTQwCisvLyAxMAl4MHh4eHh4CTAJRGF0YS1wcm9jZXNzaW5nIChtb2RpZmllZCBpbW1lZGlhdGUpIG9uIHBhZ2UgQTYtMTUKKy8vIAkJeDF4eHh4eAkwCURhdGEtcHJvY2Vzc2luZyAocGxhaW4gYmluYXJ5IGltbWVkaWF0ZSkgb24gcGFnZSBBNi0xOQorLy8gCQktCQkxCUJyYW5jaGVzIGFuZCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wgb24gcGFnZSBBNi0yMAorLy8gMTEJMDAweHh4MAktCVN0b3JlIHNpbmdsZSBkYXRhIGl0ZW0gb24gcGFnZSBBNi0zMAorLy8gCQkwMDF4eHgwCS0JQWR2YW5jZWQgU0lNRCBlbGVtZW50IG9yIHN0cnVjdHVyZSBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyBvbiBwYWdlIEE3LTI3CisvLyAJCTAweHgwMDEgLQlMb2FkIGJ5dGUsIG1lbW9yeSBoaW50cyBvbiBwYWdlIEE2LTI4CisvLyAJCTAweHgwMTEJLQlMb2FkIGhhbGZ3b3JkLCBtZW1vcnkgaGludHMgb24gcGFnZSBBNi0yNgorLy8gCQkwMHh4MTAxCS0JTG9hZCB3b3JkIG9uIHBhZ2UgQTYtMjUKKy8vIAkJMDB4eDExMQktCVVOREVGSU5FRAorLy8gCQkwMTB4eHh4CS0JRGF0YS1wcm9jZXNzaW5nIChyZWdpc3Rlcikgb24gcGFnZSBBNi0zMworLy8gCQkwMTEweHh4CS0JTXVsdGlwbHksIG11bHRpcGx5IGFjY3VtdWxhdGUsIGFuZCBhYnNvbHV0ZSBkaWZmZXJlbmNlIG9uIHBhZ2UgQTYtMzgKKy8vIAkJMDExMXh4eAktCUxvbmcgbXVsdGlwbHksIGxvbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSwgYW5kIGRpdmlkZSBvbiBwYWdlIEE2LTM5CisvLyAJCTF4eHh4eHgJLQlDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgb24gcGFnZSBBNi00MAorLy8KK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWIyKHVpbnQxNl90IG9wMSwgdWludDE2X3Qgb3AyLCB1aW50MTZfdCBvcCwKKyAgICBNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQzMl90IGluc24sIHVuc2lnbmVkIHNob3J0IE51bU9wcywKKyAgICB1bnNpZ25lZCAmTnVtT3BzQWRkZWQsIEJPIEIpIHsKKworICBzd2l0Y2ggKG9wMSkgeworICBjYXNlIDE6CisgICAgaWYgKHNsaWNlKG9wMiwgNiwgNSkgPT0gMCkgeworICAgICAgaWYgKHNsaWNlKG9wMiwgMiwgMikgPT0gMCkgeworICAgICAgICAvLyBMb2FkL3N0b3JlIG11bHRpcGxlLgorICAgICAgICByZXR1cm4gRGlzYXNzZW1ibGVUaHVtYjJMZFN0TXVsKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQik7CisgICAgICB9CisKKyAgICAgIC8vIExvYWQvc3RvcmUgZHVhbCwgbG9hZC9zdG9yZSBleGNsdXNpdmUsIHRhYmxlIGJyYW5jaCwgb3RoZXJ3aXNlLgorICAgICAgYXNzZXJ0KHNsaWNlKG9wMiwgMiwgMikgPT0gMSAmJiAiVGh1bWIyIGVuY29kaW5nIGVycm9yISIpOworICAgICAgaWYgKChBUk06OnQyTERSRVggPD0gT3Bjb2RlICYmIE9wY29kZSA8PSBBUk06OnQyTERSRVhIKSB8fAorICAgICAgICAgIChBUk06OnQyU1RSRVggPD0gT3Bjb2RlICYmIE9wY29kZSA8PSBBUk06OnQyU1RSRVhIKSkgeworICAgICAgICAvLyBMb2FkL3N0b3JlIGV4Y2x1c2l2ZS4KKyAgICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIyTGRTdEV4KE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCKTsKKyAgICAgIH0KKyAgICAgIGlmIChPcGNvZGUgPT0gQVJNOjp0MkxEUkRpOCB8fAorICAgICAgICAgIE9wY29kZSA9PSBBUk06OnQyTERSRF9QUkUgfHwgT3Bjb2RlID09IEFSTTo6dDJMRFJEX1BPU1QgfHwKKyAgICAgICAgICBPcGNvZGUgPT0gQVJNOjp0MlNUUkRpOCB8fAorICAgICAgICAgIE9wY29kZSA9PSBBUk06OnQyU1RSRF9QUkUgfHwgT3Bjb2RlID09IEFSTTo6dDJTVFJEX1BPU1QpIHsKKyAgICAgICAgLy8gTG9hZC9zdG9yZSBkdWFsLgorICAgICAgICByZXR1cm4gRGlzYXNzZW1ibGVUaHVtYjJMZFN0RHVhbChNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCKTsKKyAgICAgIH0KKyAgICAgIGlmIChPcGNvZGUgPT0gQVJNOjp0MlRCQmdlbiB8fCBPcGNvZGUgPT0gQVJNOjp0MlRCSGdlbikgeworICAgICAgICAvLyBUYWJsZSBicmFuY2guCisgICAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMlRCKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIEIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2xpY2Uob3AyLCA2LCA1KSA9PSAxKSB7CisgICAgICAvLyBEYXRhLXByb2Nlc3NpbmcgKHNoaWZ0ZWQgcmVnaXN0ZXIpLgorICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIyRFBTb1JlZyhNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLCBCKTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogQTYuMy4xOCBDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMKKyAgICAvLyBCdXQgc2VlIFRodW1iRGlzYXNzZW1ibGVyOjpnZXRJbnN0cnVjdGlvbigpLgorCisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBpZiAob3AgPT0gMCkgeworICAgICAgaWYgKHNsaWNlKG9wMiwgNSwgNSkgPT0gMCkgeworICAgICAgICAvLyBEYXRhLXByb2Nlc3NpbmcgKG1vZGlmaWVkIGltbWVkaWF0ZSkKKyAgICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIyRFBNb2RJbW0oTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBEYXRhLXByb2Nlc3NpbmcgKHBsYWluIGJpbmFyeSBpbW1lZGlhdGUpCisgICAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMkRQQmluSW1tKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBCcmFuY2hlcyBhbmQgbWlzY2VsbGFuZW91cyBjb250cm9sIG9uIHBhZ2UgQTYtMjAuCisgICAgICByZXR1cm4gRGlzYXNzZW1ibGVUaHVtYjJCck1pc2NDdHJsKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIpOworICAgIH0KKworICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgc3dpdGNoIChzbGljZShvcDIsIDYsIDUpKSB7CisgICAgY2FzZSAwOgorICAgICAgLy8gTG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMuLi4KKyAgICAgIGlmIChzbGljZShvcDIsIDAsIDApID09IDApIHsKKyAgICAgICAgaWYgKHNsaWNlKG9wMiwgNCwgNCkgPT0gMCkgeworICAgICAgICAgIC8vIFN0b3JlIHNpbmdsZSBkYXRhIGl0ZW0gb24gcGFnZSBBNi0zMAorICAgICAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMkxkU3QoZmFsc2UsIE1JLE9wY29kZSxpbnNuLE51bU9wcyxOdW1PcHNBZGRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEZJWE1FOiBBZHZhbmNlZCBTSU1EIGVsZW1lbnQgb3Igc3RydWN0dXJlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLgorICAgICAgICAgIC8vIEJ1dCBzZWUgVGh1bWJEaXNhc3NlbWJsZXI6OmdldEluc3RydWN0aW9uKCkuCisgICAgICAgICAgOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBUYWJsZSBBNi05IDMyLWJpdCBUaHVtYiBpbnN0cnVjdGlvbiBlbmNvZGluZzogTG9hZCBieXRlfGhhbGZ3b3JkfHdvcmQKKyAgICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIyTGRTdCh0cnVlLCBNSSxPcGNvZGUsaW5zbixOdW1PcHMsTnVtT3BzQWRkZWQsIEIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgaWYgKHNsaWNlKG9wMiwgNCwgNCkgPT0gMCkgeworICAgICAgICAvLyBBNi4zLjEyIERhdGEtcHJvY2Vzc2luZyAocmVnaXN0ZXIpCisgICAgICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMkRQUmVnKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIEIpOworICAgICAgfSBlbHNlIGlmIChzbGljZShvcDIsIDMsIDMpID09IDApIHsKKyAgICAgICAgLy8gQTYuMy4xNiBNdWx0aXBseSwgbXVsdGlwbHkgYWNjdW11bGF0ZSwgYW5kIGFic29sdXRlIGRpZmZlcmVuY2UKKyAgICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIyTXVsKE1JLCBPcGNvZGUsIGluc24sIE51bU9wcywgTnVtT3BzQWRkZWQsIEIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQTYuMy4xNyBMb25nIG11bHRpcGx5LCBsb25nIG11bHRpcGx5IGFjY3VtdWxhdGUsIGFuZCBkaXZpZGUKKyAgICAgICAgcmV0dXJuIERpc2Fzc2VtYmxlVGh1bWIyTG9uZ011bChNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vIEZJWE1FOiBBNi4zLjE4IENvcHJvY2Vzc29yIGluc3RydWN0aW9ucworICAgICAgLy8gQnV0IHNlZSBUaHVtYkRpc2Fzc2VtYmxlcjo6Z2V0SW5zdHJ1Y3Rpb24oKS4KKyAgICAgIDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGFzc2VydCgwICYmICJUaHVtYjIgZW5jb2RpbmcgZXJyb3IhIik7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIERpc2Fzc2VtYmxlVGh1bWJGcm0oTUNJbnN0ICZNSSwgdW5zaWduZWQgT3Bjb2RlLCB1aW50MzJfdCBpbnNuLAorICAgIHVuc2lnbmVkIHNob3J0IE51bU9wcywgdW5zaWduZWQgJk51bU9wc0FkZGVkLCBCTyBCdWlsZGVyKSB7CisKKyAgdWludDE2X3QgSGFsZldvcmQgPSBzbGljZShpbnNuLCAzMSwgMTYpOworCisgIGlmIChIYWxmV29yZCA9PSAwKSB7CisgICAgLy8gQTYuMiAxNi1iaXQgVGh1bWIgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcKKyAgICAvLyBvcCA9IGJpdHNbMTU6MTBdCisgICAgdWludDE2X3Qgb3AgPSBzbGljZShpbnNuLCAxNSwgMTApOworICAgIHJldHVybiBEaXNhc3NlbWJsZVRodW1iMShvcCwgTUksIE9wY29kZSwgaW5zbiwgTnVtT3BzLCBOdW1PcHNBZGRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlcik7CisgIH0KKworICB1bnNpZ25lZCBiaXRzMTVfMTEgPSBzbGljZShIYWxmV29yZCwgMTUsIDExKTsKKworICAvLyBBNi4xIFRodW1iIGluc3RydWN0aW9uIHNldCBlbmNvZGluZworICBpZiAoIShiaXRzMTVfMTEgPT0gMHgxRCB8fCBiaXRzMTVfMTEgPT0gMHgxRSB8fCBiaXRzMTVfMTEgPT0gMHgxRikpIHsKKyAgICBhc3NlcnQoIkJpdHNbMTU6MTFdIGZpcnN0IGhhbGZ3b3JkIG9mIFRodW1iMiBpbnN0cnVjdGlvbiBpcyBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBBNi4zIDMyLWJpdCBUaHVtYiBpbnN0cnVjdGlvbiBlbmNvZGluZworICAKKyAgdWludDE2X3Qgb3AxID0gc2xpY2UoSGFsZldvcmQsIDEyLCAxMSk7CisgIHVpbnQxNl90IG9wMiA9IHNsaWNlKEhhbGZXb3JkLCAxMCwgNCk7CisgIHVpbnQxNl90IG9wID0gc2xpY2UoaW5zbiwgMTUsIDE1KTsKKworICByZXR1cm4gRGlzYXNzZW1ibGVUaHVtYjIob3AxLCBvcDIsIG9wLCBNSSwgT3Bjb2RlLCBpbnNuLCBOdW1PcHMsIE51bU9wc0FkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzYxODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9NYWtlZmlsZQpAQCAtMCwwICsxLDI1IEBACisjIz09PS0gbGliL1RhcmdldC9BUk0vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1BUk1Db2RlR2VuCitUQVJHRVQgPSBBUk0KKworIyBNYWtlIHN1cmUgdGhhdCB0YmxnZW4gaXMgcnVuLCBmaXJzdCB0aGluZy4KK0JVSUxUX1NPVVJDRVMgPSBBUk1HZW5SZWdpc3RlckluZm8uaC5pbmMgQVJNR2VuUmVnaXN0ZXJOYW1lcy5pbmMgXAorICAgICAgICAgICAgICAgIEFSTUdlblJlZ2lzdGVySW5mby5pbmMgQVJNR2VuSW5zdHJOYW1lcy5pbmMgXAorICAgICAgICAgICAgICAgIEFSTUdlbkluc3RySW5mby5pbmMgQVJNR2VuQXNtV3JpdGVyLmluYyBcCisgICAgICAgICAgICAgICAgQVJNR2VuREFHSVNlbC5pbmMgQVJNR2VuU3VidGFyZ2V0LmluYyBcCisgICAgICAgICAgICAgICAgQVJNR2VuQ29kZUVtaXR0ZXIuaW5jIEFSTUdlbkNhbGxpbmdDb252LmluYyBcCisgICAgICAgICAgICAgICAgQVJNR2VuRGVjb2RlclRhYmxlcy5pbmMgQVJNR2VuRURJbmZvLmluYyBcCisgICAgICAgICAgICAgICAgQVJNR2VuRmFzdElTZWwuaW5jCisKK0RJUlMgPSBBc21QcmludGVyIEFzbVBhcnNlciBEaXNhc3NlbWJsZXIgVGFyZ2V0SW5mbworCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vTkVPTk1vdmVGaXguY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vTkVPTk1vdmVGaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTU0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9ORU9OTW92ZUZpeC5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8vPT09LS0gTkVPTk1vdmVGaXguY3BwIC0gQ29udmVydCB2ZnAgcmVnLXJlZyBtb3ZlcyBpbnRvIG5lb24gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibmVvbi1tb3YtZml4IgorI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTU1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJBUk1JbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1WTW92cywgIk51bWJlciBvZiByZWctcmVnIG1vdmVzIGNvbnZlcnRlZCIpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgTkVPTk1vdmVGaXhQYXNzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOworICAgIE5FT05Nb3ZlRml4UGFzcygpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIk5FT04gcmVnLXJlZyBtb3ZlIGNvbnZlcnNpb24iOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICAgIGNvbnN0IEFSTUJhc2VJbnN0ckluZm8gKlRJSTsKKworICAgIHR5cGVkZWYgRGVuc2VNYXA8dW5zaWduZWQsIGNvbnN0IE1hY2hpbmVJbnN0cio+IFJlZ01hcDsKKworICAgIGJvb2wgSW5zZXJ0TW92ZXMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisgIH07CisgIGNoYXIgTkVPTk1vdmVGaXhQYXNzOjpJRCA9IDA7Cit9CisKK2Jvb2wgTkVPTk1vdmVGaXhQYXNzOjpJbnNlcnRNb3ZlcyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSB7CisgIFJlZ01hcCBEZWZzOworICBib29sIE1vZGlmaWVkID0gZmFsc2U7CisKKyAgLy8gV2FsayBvdmVyIE1CQiB0cmFja2luZyB0aGUgZGVmIHBvaW50cyBvZiB0aGUgcmVnaXN0ZXJzLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUlJID0gTUJCLmJlZ2luKCksIEUgPSBNQkIuZW5kKCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBOZXh0TUlJOworICBmb3IgKDsgTUlJICE9IEU7IE1JSSA9IE5leHRNSUkpIHsKKyAgICBOZXh0TUlJID0gbGx2bTo6bmV4dChNSUkpOworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSAmKk1JSTsKKworICAgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjpWTU9WRCAmJgorICAgICAgICAhVElJLT5pc1ByZWRpY2F0ZWQoTUkpKSB7CisgICAgICB1bnNpZ25lZCBTcmNSZWcgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICAgIC8vIElmIHdlIGRvIG5vdCBmaW5kIGFuIGluc3RydWN0aW9uIGRlZmluaW5nIHRoZSByZWcsIHRoaXMgbWVhbnMgdGhlCisgICAgICAvLyByZWdpc3RlciBzaG91bGQgYmUgbGl2ZS1pbiBmb3IgdGhpcyBCQi4gSXQncyBhbHdheXMgdG8gYmV0dGVyIHRvIHVzZQorICAgICAgLy8gTkVPTiByZWctcmVnIG1vdmVzLgorICAgICAgdW5zaWduZWQgRG9tYWluID0gQVJNSUk6OkRvbWFpbk5FT047CisgICAgICBSZWdNYXA6Oml0ZXJhdG9yIERlZk1JID0gRGVmcy5maW5kKFNyY1JlZyk7CisgICAgICBpZiAoRGVmTUkgIT0gRGVmcy5lbmQoKSkgeworICAgICAgICBEb21haW4gPSBEZWZNSS0+c2Vjb25kLT5nZXREZXNjKCkuVFNGbGFncyAmIEFSTUlJOjpEb21haW5NYXNrOworICAgICAgICAvLyBJbnN0cnVjdGlvbnMgaW4gZ2VuZXJhbCBkb21haW4gYXJlIHN1YnJlZyBhY2Nlc3Nlcy4KKyAgICAgICAgLy8gTWFwIHRoZW0gdG8gTkVPTiByZWctcmVnIG1vdmVzLgorICAgICAgICBpZiAoRG9tYWluID09IEFSTUlJOjpEb21haW5HZW5lcmFsKQorICAgICAgICAgIERvbWFpbiA9IEFSTUlJOjpEb21haW5ORU9OOworICAgICAgfQorCisgICAgICBpZiAoRG9tYWluICYgQVJNSUk6OkRvbWFpbk5FT04pIHsKKyAgICAgICAgLy8gQ29udmVydCBWTU9WRCB0byBWTU9WRG5lb24KKyAgICAgICAgdW5zaWduZWQgRGVzdFJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworCisgICAgICAgIERFQlVHKHtlcnJzKCkgPDwgInZtb3YgY29udmVydDogIjsgTUktPmR1bXAoKTt9KTsKKworICAgICAgICAvLyBJdCdzIHNhZmUgdG8gaWdub3JlIGltcC1kZWZzIC8gaW1wLXVzZXMgaGVyZSwgc2luY2U6CisgICAgICAgIC8vICAtIFdlJ3JlIHJ1bm5pbmcgbGF0ZSwgbm8gaW50ZWxsaWdlbnQgY29uZGVnZW4gcGFzc2VzIHNob3VsZCBiZSBydW4KKyAgICAgICAgLy8gICAgYWZ0ZXJ3YXJkcworICAgICAgICAvLyAgLSBUaGUgaW1wLWRlZnMgLyBpbXAtdXNlcyBhcmUgc3VwZXJyZWdzIG9ubHksIHdlIGRvbid0IGNhcmUgYWJvdXQKKyAgICAgICAgLy8gICAgdGhlbS4KKyAgICAgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsICpNSSwgTUktPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJSS0+Z2V0KEFSTTo6Vk1PVkRuZW9uKSwgRGVzdFJlZykuYWRkUmVnKFNyY1JlZykpOworICAgICAgICBNQkIuZXJhc2UoTUkpOworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IHByaW9yKE5leHRNSUkpOworICAgICAgICBNSSA9ICYqSTsKKworICAgICAgICBERUJVRyh7ZXJycygpIDw8ICIgICAgICAgIGludG86ICI7IE1JLT5kdW1wKCk7fSk7CisKKyAgICAgICAgTW9kaWZpZWQgPSB0cnVlOworICAgICAgICArK051bVZNb3ZzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KChEb21haW4gJiBBUk1JSTo6RG9tYWluVkZQKSAmJiAiSW52YWxpZCBkb21haW4hIik7CisgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICB9CisgICAgfQorCisgICAgLy8gVXBkYXRlIGRlZiBpbmZvcm1hdGlvbi4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCYgTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNEZWYoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICB1bnNpZ25lZCBNT1JlZyA9IE1PLmdldFJlZygpOworCisgICAgICBEZWZzW01PUmVnXSA9IE1JOworICAgICAgLy8gQ2F0Y2ggYWxpYXNlcyBhcyB3ZWxsLgorICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqUiA9IFRSSS0+Z2V0QWxpYXNTZXQoTU9SZWcpOyAqUjsgKytSKQorICAgICAgICBEZWZzWypSXSA9IE1JOworICAgIH0KKyAgfQorCisgIHJldHVybiBNb2RpZmllZDsKK30KKworYm9vbCBORU9OTW92ZUZpeFBhc3M6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRm4pIHsKKyAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBGbi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBGbi5nZXRUYXJnZXQoKTsKKworICBpZiAoQUZJLT5pc1RodW1iMU9ubHlGdW5jdGlvbigpKQorICAgIHJldHVybiBmYWxzZTsKKworICBUUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKyAgVElJID0gc3RhdGljX2Nhc3Q8Y29uc3QgQVJNQmFzZUluc3RySW5mbyo+KFRNLmdldEluc3RySW5mbygpKTsKKworICBib29sIE1vZGlmaWVkID0gZmFsc2U7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNRkkgPSBGbi5iZWdpbigpLCBFID0gRm4uZW5kKCk7IE1GSSAhPSBFOworICAgICAgICsrTUZJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9ICpNRkk7CisgICAgTW9kaWZpZWQgfD0gSW5zZXJ0TW92ZXMoTUJCKTsKKyAgfQorCisgIHJldHVybiBNb2RpZmllZDsKK30KKworLy8vIGNyZWF0ZU5FT05Nb3ZlRml4UGFzcyAtIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5FT04gcmVnLXJlZyBtb3ZlcyBmaXgKKy8vLyBwYXNzLgorRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVORU9OTW92ZUZpeFBhc3MoKSB7CisgIHJldHVybiBuZXcgTkVPTk1vdmVGaXhQYXNzKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9ORU9OUHJlQWxsb2NQYXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL05FT05QcmVBbGxvY1Bhc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmEyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9ORU9OUHJlQWxsb2NQYXNzLmNwcApAQCAtMCwwICsxLDQ5NSBAQAorLy89PT0tLSBORU9OUHJlQWxsb2NQYXNzLmNwcCAtIEFsbG9jYXRlIGFkamFjZW50IE5FT04gcmVnaXN0ZXJzLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJuZW9uLXByZWFsbG9jIgorI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTUluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBjbGFzcyBORU9OUHJlQWxsb2NQYXNzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgTkVPTlByZUFsbG9jUGFzcygpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIk5FT04gcmVnaXN0ZXIgcHJlLWFsbG9jYXRpb24gcGFzcyI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBGb3Jtc1JlZ1NlcXVlbmNlKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpcnN0T3BuZCwgdW5zaWduZWQgTnVtUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT2Zmc2V0LCB1bnNpZ25lZCBTdHJpZGUpIGNvbnN0OworICAgIGJvb2wgUHJlQWxsb2NORU9OUmVnaXN0ZXJzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworICB9OworCisgIGNoYXIgTkVPTlByZUFsbG9jUGFzczo6SUQgPSAwOworfQorCitzdGF0aWMgYm9vbCBpc05FT05NdWx0aVJlZ09wKGludCBPcGNvZGUsIHVuc2lnbmVkICZGaXJzdE9wbmQsIHVuc2lnbmVkICZOdW1SZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmT2Zmc2V0LCB1bnNpZ25lZCAmU3RyaWRlKSB7CisgIC8vIERlZmF1bHQgdG8gdW5pdCBzdHJpZGUgd2l0aCBubyBvZmZzZXQuCisgIFN0cmlkZSA9IDE7CisgIE9mZnNldCA9IDA7CisKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKworICBjYXNlIEFSTTo6VkxEMXE4OgorICBjYXNlIEFSTTo6VkxEMXExNjoKKyAgY2FzZSBBUk06OlZMRDFxMzI6CisgIGNhc2UgQVJNOjpWTEQxcTY0OgorICBjYXNlIEFSTTo6VkxEMmQ4OgorICBjYXNlIEFSTTo6VkxEMmQxNjoKKyAgY2FzZSBBUk06OlZMRDJkMzI6CisgIGNhc2UgQVJNOjpWTEQyTE5kODoKKyAgY2FzZSBBUk06OlZMRDJMTmQxNjoKKyAgY2FzZSBBUk06OlZMRDJMTmQzMjoKKyAgICBGaXJzdE9wbmQgPSAwOworICAgIE51bVJlZ3MgPSAyOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWTEQycTg6CisgIGNhc2UgQVJNOjpWTEQycTE2OgorICBjYXNlIEFSTTo6VkxEMnEzMjoKKyAgICBGaXJzdE9wbmQgPSAwOworICAgIE51bVJlZ3MgPSA0OworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWTEQyTE5xMTY6CisgIGNhc2UgQVJNOjpWTEQyTE5xMzI6CisgICAgRmlyc3RPcG5kID0gMDsKKyAgICBOdW1SZWdzID0gMjsKKyAgICBPZmZzZXQgPSAwOworICAgIFN0cmlkZSA9IDI7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZMRDJMTnExNm9kZDoKKyAgY2FzZSBBUk06OlZMRDJMTnEzMm9kZDoKKyAgICBGaXJzdE9wbmQgPSAwOworICAgIE51bVJlZ3MgPSAyOworICAgIE9mZnNldCA9IDE7CisgICAgU3RyaWRlID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIEFSTTo6VkxEM2Q4OgorICBjYXNlIEFSTTo6VkxEM2QxNjoKKyAgY2FzZSBBUk06OlZMRDNkMzI6CisgIGNhc2UgQVJNOjpWTEQxZDY0VDoKKyAgY2FzZSBBUk06OlZMRDNMTmQ4OgorICBjYXNlIEFSTTo6VkxEM0xOZDE2OgorICBjYXNlIEFSTTo6VkxEM0xOZDMyOgorICAgIEZpcnN0T3BuZCA9IDA7CisgICAgTnVtUmVncyA9IDM7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZMRDNxOF9VUEQ6CisgIGNhc2UgQVJNOjpWTEQzcTE2X1VQRDoKKyAgY2FzZSBBUk06OlZMRDNxMzJfVVBEOgorICAgIEZpcnN0T3BuZCA9IDA7CisgICAgTnVtUmVncyA9IDM7CisgICAgT2Zmc2V0ID0gMDsKKyAgICBTdHJpZGUgPSAyOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWTEQzcThvZGRfVVBEOgorICBjYXNlIEFSTTo6VkxEM3ExNm9kZF9VUEQ6CisgIGNhc2UgQVJNOjpWTEQzcTMyb2RkX1VQRDoKKyAgICBGaXJzdE9wbmQgPSAwOworICAgIE51bVJlZ3MgPSAzOworICAgIE9mZnNldCA9IDE7CisgICAgU3RyaWRlID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIEFSTTo6VkxEM0xOcTE2OgorICBjYXNlIEFSTTo6VkxEM0xOcTMyOgorICAgIEZpcnN0T3BuZCA9IDA7CisgICAgTnVtUmVncyA9IDM7CisgICAgT2Zmc2V0ID0gMDsKKyAgICBTdHJpZGUgPSAyOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWTEQzTE5xMTZvZGQ6CisgIGNhc2UgQVJNOjpWTEQzTE5xMzJvZGQ6CisgICAgRmlyc3RPcG5kID0gMDsKKyAgICBOdW1SZWdzID0gMzsKKyAgICBPZmZzZXQgPSAxOworICAgIFN0cmlkZSA9IDI7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZMRDRkODoKKyAgY2FzZSBBUk06OlZMRDRkMTY6CisgIGNhc2UgQVJNOjpWTEQ0ZDMyOgorICBjYXNlIEFSTTo6VkxEMWQ2NFE6CisgIGNhc2UgQVJNOjpWTEQ0TE5kODoKKyAgY2FzZSBBUk06OlZMRDRMTmQxNjoKKyAgY2FzZSBBUk06OlZMRDRMTmQzMjoKKyAgICBGaXJzdE9wbmQgPSAwOworICAgIE51bVJlZ3MgPSA0OworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWTEQ0cThfVVBEOgorICBjYXNlIEFSTTo6VkxENHExNl9VUEQ6CisgIGNhc2UgQVJNOjpWTEQ0cTMyX1VQRDoKKyAgICBGaXJzdE9wbmQgPSAwOworICAgIE51bVJlZ3MgPSA0OworICAgIE9mZnNldCA9IDA7CisgICAgU3RyaWRlID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIEFSTTo6VkxENHE4b2RkX1VQRDoKKyAgY2FzZSBBUk06OlZMRDRxMTZvZGRfVVBEOgorICBjYXNlIEFSTTo6VkxENHEzMm9kZF9VUEQ6CisgICAgRmlyc3RPcG5kID0gMDsKKyAgICBOdW1SZWdzID0gNDsKKyAgICBPZmZzZXQgPSAxOworICAgIFN0cmlkZSA9IDI7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZMRDRMTnExNjoKKyAgY2FzZSBBUk06OlZMRDRMTnEzMjoKKyAgICBGaXJzdE9wbmQgPSAwOworICAgIE51bVJlZ3MgPSA0OworICAgIE9mZnNldCA9IDA7CisgICAgU3RyaWRlID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIEFSTTo6VkxENExOcTE2b2RkOgorICBjYXNlIEFSTTo6VkxENExOcTMyb2RkOgorICAgIEZpcnN0T3BuZCA9IDA7CisgICAgTnVtUmVncyA9IDQ7CisgICAgT2Zmc2V0ID0gMTsKKyAgICBTdHJpZGUgPSAyOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWU1QxcTg6CisgIGNhc2UgQVJNOjpWU1QxcTE2OgorICBjYXNlIEFSTTo6VlNUMXEzMjoKKyAgY2FzZSBBUk06OlZTVDFxNjQ6CisgIGNhc2UgQVJNOjpWU1QyZDg6CisgIGNhc2UgQVJNOjpWU1QyZDE2OgorICBjYXNlIEFSTTo6VlNUMmQzMjoKKyAgY2FzZSBBUk06OlZTVDJMTmQ4OgorICBjYXNlIEFSTTo6VlNUMkxOZDE2OgorICBjYXNlIEFSTTo6VlNUMkxOZDMyOgorICAgIEZpcnN0T3BuZCA9IDI7CisgICAgTnVtUmVncyA9IDI7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZTVDJxODoKKyAgY2FzZSBBUk06OlZTVDJxMTY6CisgIGNhc2UgQVJNOjpWU1QycTMyOgorICAgIEZpcnN0T3BuZCA9IDI7CisgICAgTnVtUmVncyA9IDQ7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZTVDJMTnExNjoKKyAgY2FzZSBBUk06OlZTVDJMTnEzMjoKKyAgICBGaXJzdE9wbmQgPSAyOworICAgIE51bVJlZ3MgPSAyOworICAgIE9mZnNldCA9IDA7CisgICAgU3RyaWRlID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIEFSTTo6VlNUMkxOcTE2b2RkOgorICBjYXNlIEFSTTo6VlNUMkxOcTMyb2RkOgorICAgIEZpcnN0T3BuZCA9IDI7CisgICAgTnVtUmVncyA9IDI7CisgICAgT2Zmc2V0ID0gMTsKKyAgICBTdHJpZGUgPSAyOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWU1QzZDg6CisgIGNhc2UgQVJNOjpWU1QzZDE2OgorICBjYXNlIEFSTTo6VlNUM2QzMjoKKyAgY2FzZSBBUk06OlZTVDFkNjRUOgorICBjYXNlIEFSTTo6VlNUM0xOZDg6CisgIGNhc2UgQVJNOjpWU1QzTE5kMTY6CisgIGNhc2UgQVJNOjpWU1QzTE5kMzI6CisgICAgRmlyc3RPcG5kID0gMjsKKyAgICBOdW1SZWdzID0gMzsKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIEFSTTo6VlNUM3E4X1VQRDoKKyAgY2FzZSBBUk06OlZTVDNxMTZfVVBEOgorICBjYXNlIEFSTTo6VlNUM3EzMl9VUEQ6CisgICAgRmlyc3RPcG5kID0gNDsKKyAgICBOdW1SZWdzID0gMzsKKyAgICBPZmZzZXQgPSAwOworICAgIFN0cmlkZSA9IDI7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZTVDNxOG9kZF9VUEQ6CisgIGNhc2UgQVJNOjpWU1QzcTE2b2RkX1VQRDoKKyAgY2FzZSBBUk06OlZTVDNxMzJvZGRfVVBEOgorICAgIEZpcnN0T3BuZCA9IDQ7CisgICAgTnVtUmVncyA9IDM7CisgICAgT2Zmc2V0ID0gMTsKKyAgICBTdHJpZGUgPSAyOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWU1QzTE5xMTY6CisgIGNhc2UgQVJNOjpWU1QzTE5xMzI6CisgICAgRmlyc3RPcG5kID0gMjsKKyAgICBOdW1SZWdzID0gMzsKKyAgICBPZmZzZXQgPSAwOworICAgIFN0cmlkZSA9IDI7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZTVDNMTnExNm9kZDoKKyAgY2FzZSBBUk06OlZTVDNMTnEzMm9kZDoKKyAgICBGaXJzdE9wbmQgPSAyOworICAgIE51bVJlZ3MgPSAzOworICAgIE9mZnNldCA9IDE7CisgICAgU3RyaWRlID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIEFSTTo6VlNUNGQ4OgorICBjYXNlIEFSTTo6VlNUNGQxNjoKKyAgY2FzZSBBUk06OlZTVDRkMzI6CisgIGNhc2UgQVJNOjpWU1QxZDY0UToKKyAgY2FzZSBBUk06OlZTVDRMTmQ4OgorICBjYXNlIEFSTTo6VlNUNExOZDE2OgorICBjYXNlIEFSTTo6VlNUNExOZDMyOgorICAgIEZpcnN0T3BuZCA9IDI7CisgICAgTnVtUmVncyA9IDQ7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZTVDRxOF9VUEQ6CisgIGNhc2UgQVJNOjpWU1Q0cTE2X1VQRDoKKyAgY2FzZSBBUk06OlZTVDRxMzJfVVBEOgorICAgIEZpcnN0T3BuZCA9IDQ7CisgICAgTnVtUmVncyA9IDQ7CisgICAgT2Zmc2V0ID0gMDsKKyAgICBTdHJpZGUgPSAyOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWU1Q0cThvZGRfVVBEOgorICBjYXNlIEFSTTo6VlNUNHExNm9kZF9VUEQ6CisgIGNhc2UgQVJNOjpWU1Q0cTMyb2RkX1VQRDoKKyAgICBGaXJzdE9wbmQgPSA0OworICAgIE51bVJlZ3MgPSA0OworICAgIE9mZnNldCA9IDE7CisgICAgU3RyaWRlID0gMjsKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIEFSTTo6VlNUNExOcTE2OgorICBjYXNlIEFSTTo6VlNUNExOcTMyOgorICAgIEZpcnN0T3BuZCA9IDI7CisgICAgTnVtUmVncyA9IDQ7CisgICAgT2Zmc2V0ID0gMDsKKyAgICBTdHJpZGUgPSAyOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgQVJNOjpWU1Q0TE5xMTZvZGQ6CisgIGNhc2UgQVJNOjpWU1Q0TE5xMzJvZGQ6CisgICAgRmlyc3RPcG5kID0gMjsKKyAgICBOdW1SZWdzID0gNDsKKyAgICBPZmZzZXQgPSAxOworICAgIFN0cmlkZSA9IDI7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZUQkwyOgorICAgIEZpcnN0T3BuZCA9IDE7CisgICAgTnVtUmVncyA9IDI7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZUQkwzOgorICAgIEZpcnN0T3BuZCA9IDE7CisgICAgTnVtUmVncyA9IDM7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZUQkw0OgorICAgIEZpcnN0T3BuZCA9IDE7CisgICAgTnVtUmVncyA9IDQ7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZUQlgyOgorICAgIEZpcnN0T3BuZCA9IDI7CisgICAgTnVtUmVncyA9IDI7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZUQlgzOgorICAgIEZpcnN0T3BuZCA9IDI7CisgICAgTnVtUmVncyA9IDM7CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBBUk06OlZUQlg0OgorICAgIEZpcnN0T3BuZCA9IDI7CisgICAgTnVtUmVncyA9IDQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wKK05FT05QcmVBbGxvY1Bhc3M6OkZvcm1zUmVnU2VxdWVuY2UoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmlyc3RPcG5kLCB1bnNpZ25lZCBOdW1SZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPZmZzZXQsIHVuc2lnbmVkIFN0cmlkZSkgY29uc3QgeworICBNYWNoaW5lT3BlcmFuZCAmRk1PID0gTUktPmdldE9wZXJhbmQoRmlyc3RPcG5kKTsKKyAgYXNzZXJ0KEZNTy5pc1JlZygpICYmIEZNTy5nZXRTdWJSZWcoKSA9PSAwICYmICJ1bmV4cGVjdGVkIG9wZXJhbmQiKTsKKyAgdW5zaWduZWQgVmlydFJlZyA9IEZNTy5nZXRSZWcoKTsKKyAgKHZvaWQpVmlydFJlZzsKKyAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoVmlydFJlZykgJiYKKyAgICAgICAgICJleHBlY3RlZCBhIHZpcnR1YWwgcmVnaXN0ZXIiKTsKKworICB1bnNpZ25lZCBMYXN0U3ViSWR4ID0gMDsKKyAgaWYgKEZNTy5pc0RlZigpKSB7CisgICAgTWFjaGluZUluc3RyICpSZWdTZXEgPSAwOworICAgIGZvciAodW5zaWduZWQgUiA9IDA7IFIgPCBOdW1SZWdzOyArK1IpIHsKKyAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKEZpcnN0T3BuZCArIFIpOworICAgICAgYXNzZXJ0KE1PLmlzUmVnKCkgJiYgTU8uZ2V0U3ViUmVnKCkgPT0gMCAmJiAidW5leHBlY3RlZCBvcGVyYW5kIik7CisgICAgICB1bnNpZ25lZCBWaXJ0UmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihWaXJ0UmVnKSAmJgorICAgICAgICAgICAgICJleHBlY3RlZCBhIHZpcnR1YWwgcmVnaXN0ZXIiKTsKKyAgICAgIC8vIEZlZWRpbmcgaW50byBhIFJFR19TRVFVRU5DRS4KKyAgICAgIGlmICghTVJJLT5oYXNPbmVOb25EQkdVc2UoVmlydFJlZykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIE1hY2hpbmVJbnN0ciAqVXNlTUkgPSAmKk1SSS0+dXNlX25vZGJnX2JlZ2luKFZpcnRSZWcpOworICAgICAgaWYgKCFVc2VNSS0+aXNSZWdTZXF1ZW5jZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoUmVnU2VxICYmIFJlZ1NlcSAhPSBVc2VNSSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgdW5zaWduZWQgT3BJZHggPSAxICsgKE9mZnNldCArIFIgKiBTdHJpZGUpICogMjsKKyAgICAgIGlmIChVc2VNSS0+Z2V0T3BlcmFuZChPcElkeCkuZ2V0UmVnKCkgIT0gVmlydFJlZykKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiTWFsZm9ybWVkIFJFR19TRVFVRU5DRSBpbnN0cnVjdGlvbiEiKTsKKyAgICAgIHVuc2lnbmVkIFN1YklkeCA9IFVzZU1JLT5nZXRPcGVyYW5kKE9wSWR4ICsgMSkuZ2V0SW1tKCk7CisgICAgICBpZiAoTGFzdFN1YklkeCkgeworICAgICAgICBpZiAoTGFzdFN1YklkeCAhPSBTdWJJZHgtU3RyaWRlKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE11c3Qgc3RhcnQgZnJvbSBkc3ViXzAgb3IgcXN1Yl8wLgorICAgICAgICBpZiAoU3ViSWR4ICE9IChBUk06OmRzdWJfMCtPZmZzZXQpICYmCisgICAgICAgICAgICBTdWJJZHggIT0gKEFSTTo6cXN1Yl8wK09mZnNldCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgUmVnU2VxID0gVXNlTUk7CisgICAgICBMYXN0U3ViSWR4ID0gU3ViSWR4OworICAgIH0KKworICAgIC8vIEluIHRoZSBjYXNlIG9mIHZsZDMsIGV0Yy4sIG1ha2Ugc3VyZSB0aGUgdHJhaWxpbmcgb3BlcmFuZCBvZgorICAgIC8vIFJFR19TRVFVRU5DRSBpcyBhbiB1bmRlZi4KKyAgICBpZiAoTnVtUmVncyA9PSAzKSB7CisgICAgICB1bnNpZ25lZCBPcElkeCA9IDEgKyAoT2Zmc2V0ICsgMyAqIFN0cmlkZSkgKiAyOworICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gUmVnU2VxLT5nZXRPcGVyYW5kKE9wSWR4KTsKKyAgICAgIHVuc2lnbmVkIFZpcnRSZWcgPSBNTy5nZXRSZWcoKTsKKyAgICAgIE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBNUkktPmdldFZSZWdEZWYoVmlydFJlZyk7CisgICAgICBpZiAoIURlZk1JIHx8ICFEZWZNSS0+aXNJbXBsaWNpdERlZigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdW5zaWduZWQgTGFzdFNyY1JlZyA9IDA7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBTdWJJZHM7CisgIGZvciAodW5zaWduZWQgUiA9IDA7IFIgPCBOdW1SZWdzOyArK1IpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChGaXJzdE9wbmQgKyBSKTsKKyAgICBhc3NlcnQoTU8uaXNSZWcoKSAmJiBNTy5nZXRTdWJSZWcoKSA9PSAwICYmICJ1bmV4cGVjdGVkIG9wZXJhbmQiKTsKKyAgICB1bnNpZ25lZCBWaXJ0UmVnID0gTU8uZ2V0UmVnKCk7CisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoVmlydFJlZykgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGEgdmlydHVhbCByZWdpc3RlciIpOworICAgIC8vIEV4dHJhY3RpbmcgZnJvbSBhIFEgb3IgUVEgcmVnaXN0ZXIuCisgICAgTWFjaGluZUluc3RyICpEZWZNSSA9IE1SSS0+Z2V0VlJlZ0RlZihWaXJ0UmVnKTsKKyAgICBpZiAoIURlZk1JIHx8ICFEZWZNSS0+aXNDb3B5KCkgfHwgIURlZk1JLT5nZXRPcGVyYW5kKDEpLmdldFN1YlJlZygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFZpcnRSZWcgPSBEZWZNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICBpZiAoTGFzdFNyY1JlZyAmJiBMYXN0U3JjUmVnICE9IFZpcnRSZWcpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgTGFzdFNyY1JlZyA9IFZpcnRSZWc7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBNUkktPmdldFJlZ0NsYXNzKFZpcnRSZWcpOworICAgIGlmIChSQyAhPSBBUk06OlFQUlJlZ2lzdGVyQ2xhc3MgJiYKKyAgICAgICAgUkMgIT0gQVJNOjpRUVBSUmVnaXN0ZXJDbGFzcyAmJgorICAgICAgICBSQyAhPSBBUk06OlFRUVFQUlJlZ2lzdGVyQ2xhc3MpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgdW5zaWduZWQgU3ViSWR4ID0gRGVmTUktPmdldE9wZXJhbmQoMSkuZ2V0U3ViUmVnKCk7CisgICAgaWYgKExhc3RTdWJJZHgpIHsKKyAgICAgIGlmIChMYXN0U3ViSWR4ICE9IFN1YklkeC1TdHJpZGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTXVzdCBzdGFydCBmcm9tIGRzdWJfMCBvciBxc3ViXzAuCisgICAgICBpZiAoU3ViSWR4ICE9IChBUk06OmRzdWJfMCtPZmZzZXQpICYmCisgICAgICAgICAgU3ViSWR4ICE9IChBUk06OnFzdWJfMCtPZmZzZXQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFN1Yklkcy5wdXNoX2JhY2soU3ViSWR4KTsKKyAgICBMYXN0U3ViSWR4ID0gU3ViSWR4OworICB9CisKKyAgLy8gRklYTUU6IFVwZGF0ZSB0aGUgdXNlcyBvZiBFWFRSQUNUX1NVQlJFRyBmcm9tIFJFR19TRVFVRU5DRSBpcworICAvLyBjdXJyZW50bHkgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiBlLmcuCisgIC8vICAlcmVnMTA0MTxkZWY+ID0gUkVHX1NFUVVFTkNFICVyZWcxMDQwPGtpbGw+LCA1LCAlcmVnMTAzNTxraWxsPiwgNgorICAvLyAgJXJlZzEwNDI8ZGVmPiA9IEVYVFJBQ1RfU1VCUkVHICVyZWcxMDQxLCA2CisgIC8vICAlcmVnMTA0MzxkZWY+ID0gRVhUUkFDVF9TVUJSRUcgJXJlZzEwNDEsIDUKKyAgLy8gIFZTVDFxMTYgJXJlZzEwMjU8a2lsbD4sIDAsICVyZWcxMDQzPGtpbGw+LCAlcmVnMTA0MjxraWxsPiwKKyAgLy8gcmVnMTA0MiBhbmQgcmVnMTA0MyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCByZWcxMDQxOjYgYW5kIHJlZzEwNDE6NQorICAvLyByZXNwZWN0aXZlbHkuCisgIC8vIFdlIG5lZWQgdG8gY2hhbmdlIGhvdyB3ZSBtb2RlbCB1c2VzIG9mIFJFR19TRVFVRU5DRS4KKyAgZm9yICh1bnNpZ25lZCBSID0gMDsgUiA8IE51bVJlZ3M7ICsrUikgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKEZpcnN0T3BuZCArIFIpOworICAgIHVuc2lnbmVkIE9sZFJlZyA9IE1PLmdldFJlZygpOworICAgIE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBNUkktPmdldFZSZWdEZWYoT2xkUmVnKTsKKyAgICBhc3NlcnQoRGVmTUktPmlzQ29weSgpKTsKKyAgICBNTy5zZXRSZWcoTGFzdFNyY1JlZyk7CisgICAgTU8uc2V0U3ViUmVnKFN1Yklkc1tSXSk7CisgICAgTU8uc2V0SXNLaWxsKGZhbHNlKTsKKyAgICAvLyBEZWxldGUgdGhlIEVYVFJBQ1RfU1VCUkVHIGlmIGl0cyByZXN1bHQgaXMgbm93IGRlYWQuCisgICAgaWYgKE1SSS0+dXNlX2VtcHR5KE9sZFJlZykpCisgICAgICBEZWZNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBORU9OUHJlQWxsb2NQYXNzOjpQcmVBbGxvY05FT05SZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgeworICBib29sIE1vZGlmaWVkID0gZmFsc2U7CisKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBNQkIuYmVnaW4oKSwgRSA9IE1CQi5lbmQoKTsKKyAgZm9yICg7IE1CQkkgIT0gRTsgKytNQkJJKSB7CisgICAgTWFjaGluZUluc3RyICpNSSA9ICYqTUJCSTsKKyAgICB1bnNpZ25lZCBGaXJzdE9wbmQsIE51bVJlZ3MsIE9mZnNldCwgU3RyaWRlOworICAgIGlmICghaXNORU9OTXVsdGlSZWdPcChNSS0+Z2V0T3Bjb2RlKCksIEZpcnN0T3BuZCwgTnVtUmVncywgT2Zmc2V0LCBTdHJpZGUpKQorICAgICAgY29udGludWU7CisgICAgaWYgKEZvcm1zUmVnU2VxdWVuY2UoTUksIEZpcnN0T3BuZCwgTnVtUmVncywgT2Zmc2V0LCBTdHJpZGUpKQorICAgICAgY29udGludWU7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiZXhwZWN0ZWQgYSBSRUdfU0VRVUVOQ0UiKTsKKyAgfQorCisgIHJldHVybiBNb2RpZmllZDsKK30KKworYm9vbCBORU9OUHJlQWxsb2NQYXNzOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIFRJSSA9IE1GLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworICBNUkkgPSAmTUYuZ2V0UmVnSW5mbygpOworCisgIGJvb2wgTW9kaWZpZWQgPSBmYWxzZTsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1GSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsgTUZJICE9IEU7CisgICAgICAgKytNRkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1GSTsKKyAgICBNb2RpZmllZCB8PSBQcmVBbGxvY05FT05SZWdpc3RlcnMoTUJCKTsKKyAgfQorCisgIHJldHVybiBNb2RpZmllZDsKK30KKworLy8vIGNyZWF0ZU5FT05QcmVBbGxvY1Bhc3MgLSByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBORU9OIHJlZ2lzdGVyCisvLy8gcHJlLWFsbG9jYXRpb24gcGFzcy4KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlTkVPTlByZUFsbG9jUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBORU9OUHJlQWxsb2NQYXNzKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9SRUFETUUtVGh1bWIudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vUkVBRE1FLVRodW1iLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjYwNWJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vUkVBRE1FLVRodW1iLnR4dApAQCAtMCwwICsxLDI0OCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmFuZG9tIGlkZWFzIGZvciB0aGUgQVJNIGJhY2tlbmQgKFRodW1iIHNwZWNpZmljKS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworKiBBZGQgc3VwcG9ydCBmb3IgY29tcGlsaW5nIGZ1bmN0aW9ucyBpbiBib3RoIEFSTSBhbmQgVGh1bWIgbW9kZSwgdGhlbiB0YWtpbmcKKyAgdGhlIHNtYWxsZXN0LgorCisqIEFkZCBzdXBwb3J0IGZvciBjb21waWxpbmcgaW5kaXZpZHVhbCBiYXNpYyBibG9ja3MgaW4gdGh1bWIgbW9kZSwgd2hlbiBpbiBhIAorICBsYXJnZXIgQVJNIGZ1bmN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgcHJlc3VtZWQgY29sZCBjb2RlLCBsaWtlIHBhdGhzCisgIHRvIGFib3J0IChmYWlsdXJlIHBhdGggb2YgYXNzZXJ0cyksIEVIIGhhbmRsaW5nIGNvZGUsIGV0Yy4KKworKiBUaHVtYiBkb2Vzbid0IGhhdmUgbm9ybWFsIHByZS9wb3N0IGluY3JlbWVudCBhZGRyZXNzaW5nIG1vZGVzLCBidXQgeW91IGNhbgorICBsb2FkL3N0b3JlIDMyLWJpdCBpbnRlZ2VycyB3aXRoIHByZS9wb3N0aW5jIGJ5IHVzaW5nIGxvYWQvc3RvcmUgbXVsdGlwbGUKKyAgaW5zdHJzIHdpdGggYSBzaW5nbGUgcmVnaXN0ZXIuCisKKyogTWFrZSBiZXR0ZXIgdXNlIG9mIGhpZ2ggcmVnaXN0ZXJzIHI4LCByMTAsIHIxMSwgcjEyIChpcCkuIFNvbWUgdmFyaWFudHMgb2YgYWRkCisgIGFuZCBjbXAgaW5zdHJ1Y3Rpb25zIGNhbiB1c2UgaGlnaCByZWdpc3RlcnMuIEFsc28sIHdlIGNhbiB1c2UgdGhlbSBhcworICB0ZW1wb3JhcmllcyB0byBzcGlsbCB2YWx1ZXMgaW50by4KKworKiBJbiB0aHVtYiBtb2RlLCBzaG9ydCwgYnl0ZSwgYW5kIGJvb2wgcHJlZmVycmVkIGFsaWdubWVudHMgYXJlIGN1cnJlbnRseSBzZXQKKyAgdG8gNCB0byBhY2NvbW1vZGF0ZSBJU0EgcmVzdHJpY3Rpb24gKGkuZS4gYWRkIHNwLCAjaW1tLCBpbW0gbXVzdCBiZSBtdWx0aXBsZQorICBvZiA0KS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitQb3RlbnRpYWwganVtcHRhYmxlIGltcHJvdmVtZW50czoKKworKiBJZiB3ZSBrbm93IGZ1bmN0aW9uIHNpemUgaXMgbGVzcyB0aGFuICgxIDw8IDE2KSAqIDIgYnl0ZXMsIHdlIGNhbiB1c2UgMTYtYml0CisgIGp1bXB0YWJsZSBlbnRyaWVzIChlLmcuIChMMSAtIEwyKSA+PiAxKS4gT3IgZXZlbiBzbWFsbGVyIGVudHJpZXMgaWYgdGhlCisgIGZ1bmN0aW9uIGlzIGV2ZW4gc21hbGxlci4gVGhpcyBhbHNvIGFwcGxpZXMgdG8gQVJNLgorCisqIFRodW1iIGp1bXB0YWJsZSBjb2RlZ2VuIGNhbiBpbXByb3ZlIGdpdmVuIHNvbWUgaGVscCBmcm9tIHRoZSBhc3NlbWJsZXIuIFRoaXMKKyAgaXMgd2hhdCB3ZSBnZW5lcmF0ZSByaWdodCBub3c6CisKKwkuc2V0IFBDUkVMVjAsIChMSlRJMV8wXzAtKExQQ1JFTEwwKzQpKQorTFBDUkVMTDA6CisJbW92IHIxLCAjUENSRUxWMAorCWFkZCByMSwgcGMKKwlsZHIgcjAsIFtyMCwgcjFdCisJbW92IHBjLCByMCAKKwkuYWxpZ24JMgorTEpUSTFfMF8wOgorCS5sb25nCSBMQkIxXzMKKyAgICAgICAgLi4uCisKK05vdGUgdGhlcmUgaXMgYW5vdGhlciBwYyByZWxhdGl2ZSBhZGQgdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YuCisgICAgIGFkZCByMSwgcGMsICNpbW1fOCAqIDQKKworV2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2VuZXJhdGU6CisKK0xQQ1JFTEwwOgorCWFkZCByMSwgTEpUSTFfMF8wCisJbGRyIHIwLCBbcjAsIHIxXQorCW1vdiBwYywgcjAgCisJLmFsaWduCTIKK0xKVEkxXzBfMDoKKwkubG9uZwkgTEJCMV8zCisKK2lmIHRoZSBhc3NlbWJsZXIgY2FuIHRyYW5zbGF0ZSB0aGUgYWRkIHRvOgorICAgICAgIGFkZCByMSwgcGMsICMoKExKVEkxXzBfMC0oTFBDUkVMTDArNCkpJjB4ZmZmZmZmZmMpCisKK05vdGUgdGhlIGFzc2VtYmxlciBhbHNvIGRvZXMgc29tZXRoaW5nIHNpbWlsYXIgdG8gY29uc3Rwb29sIGxvYWQ6CitMUENSRUxMMDoKKyAgICAgbGRyIHIwLCBMQ1BJMV8wCis9PgorICAgICBsZHIgcjAsIHBjLCAjKChMQ1BJMV8wLShMUENSRUxMMCs0KSkmMHhmZmZmZmZmYykKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIGNvbXBpbGVzIHRoZSBmb2xsb3dpbmc6CisKK2RlZmluZSBpMTYgQGZ1bmNfZW50cnlfMkVfY2UoaTMyICVpKSB7CisgICAgICAgIHN3aXRjaCBpMzIgJWksIGxhYmVsICViYjEyLmV4aXRTdHViIFsKKyAgICAgICAgICAgICAgICAgaTMyIDAsIGxhYmVsICViYjQuZXhpdFN0dWIKKyAgICAgICAgICAgICAgICAgaTMyIDEsIGxhYmVsICViYjkuZXhpdFN0dWIKKyAgICAgICAgICAgICAgICAgaTMyIDIsIGxhYmVsICViYjQuZXhpdFN0dWIKKyAgICAgICAgICAgICAgICAgaTMyIDMsIGxhYmVsICViYjQuZXhpdFN0dWIKKyAgICAgICAgICAgICAgICAgaTMyIDcsIGxhYmVsICViYjkuZXhpdFN0dWIKKyAgICAgICAgICAgICAgICAgaTMyIDgsIGxhYmVsICViYi5leGl0U3R1YgorICAgICAgICAgICAgICAgICBpMzIgOSwgbGFiZWwgJWJiOS5leGl0U3R1YgorICAgICAgICBdCisKK2JiMTIuZXhpdFN0dWI6CisgICAgICAgIHJldCBpMTYgMAorCitiYjQuZXhpdFN0dWI6CisgICAgICAgIHJldCBpMTYgMQorCitiYjkuZXhpdFN0dWI6CisgICAgICAgIHJldCBpMTYgMgorCitiYi5leGl0U3R1YjoKKyAgICAgICAgcmV0IGkxNiAzCit9CisKK2ludG86CisKK19mdW5jX2VudHJ5XzJFX2NlOgorICAgICAgICBtb3YgcjIsICMxCisgICAgICAgIGxzbCByMiwgcjAKKyAgICAgICAgY21wIHIwLCAjOQorICAgICAgICBiaGkgTEJCMV80ICAgICAgQGJiMTIuZXhpdFN0dWIKK0xCQjFfMTogQG5ld0Z1bmNSb290CisgICAgICAgIG1vdiByMSwgIzEzCisgICAgICAgIHRzdCByMiwgcjEKKyAgICAgICAgYm5lIExCQjFfNSAgICAgIEBiYjQuZXhpdFN0dWIKK0xCQjFfMjogQG5ld0Z1bmNSb290CisgICAgICAgIGxkciByMSwgTENQSTFfMAorICAgICAgICB0c3QgcjIsIHIxCisgICAgICAgIGJuZSBMQkIxXzYgICAgICBAYmI5LmV4aXRTdHViCitMQkIxXzM6IEBuZXdGdW5jUm9vdAorICAgICAgICBtb3YgcjEsICMxCisgICAgICAgIGxzbCByMSwgcjEsICM4CisgICAgICAgIHRzdCByMiwgcjEKKyAgICAgICAgYm5lIExCQjFfNyAgICAgIEBiYi5leGl0U3R1YgorTEJCMV80OiBAYmIxMi5leGl0U3R1YgorICAgICAgICBtb3YgcjAsICMwCisgICAgICAgIGJ4IGxyCitMQkIxXzU6IEBiYjQuZXhpdFN0dWIKKyAgICAgICAgbW92IHIwLCAjMQorICAgICAgICBieCBscgorTEJCMV82OiBAYmI5LmV4aXRTdHViCisgICAgICAgIG1vdiByMCwgIzIKKyAgICAgICAgYnggbHIKK0xCQjFfNzogQGJiLmV4aXRTdHViCisgICAgICAgIG1vdiByMCwgIzMKKyAgICAgICAgYnggbHIKK0xCQjFfODoKKyAgICAgICAgLmFsaWduICAyCitMQ1BJMV8wOgorICAgICAgICAubG9uZyAgIDY0MgorCisKK2djYyBjb21waWxlcyB0bzoKKworCWNtcAlyMCwgIzkKKwlAIGxyIG5lZWRlZCBmb3IgcHJvbG9ndWUKKwliaGkJTDIKKwlsZHIJcjMsIEwxMQorCW1vdglyMiwgIzEKKwltb3YJcjEsIHIyLCBhc2wgcjAKKwlhbmRzCXIwLCByMywgcjIsIGFzbCByMAorCW1vdm5lCXIwLCAjMgorCWJ4bmUJbHIKKwl0c3QJcjEsICMxMworCWJlcQlMOQorTDM6CisJbW92CXIwLCByMgorCWJ4CWxyCitMOToKKwl0c3QJcjEsICMyNTYKKwltb3ZuZQlyMCwgIzMKKwlieG5lCWxyCitMMjoKKwltb3YJcjAsICMwCisJYngJbHIKK0wxMjoKKwkuYWxpZ24gMgorTDExOgorCS5sb25nCTY0MgorICAgICAgICAKKworR0NDIGlzIGRvaW5nIGEgY291cGxlIG9mIGNsZXZlciB0aGluZ3MgaGVyZToKKyAgMS4gSXQgaXMgcHJlZGljYXRpbmcgb25lIG9mIHRoZSByZXR1cm5zLiAgVGhpcyBpc24ndCBhIGNsZWFyIHdpbiB0aG91Z2g6IGluCisgICAgIGNhc2VzIHdoZXJlIHRoYXQgcmV0dXJuIGlzbid0IHRha2VuLCBpdCBpcyByZXBsYWNpbmcgb25lIGNvbmRicmFuY2ggd2l0aAorICAgICB0d28gJ25lJyBwcmVkaWNhdGVkIGluc3RydWN0aW9ucy4KKyAgMi4gSXQgaXMgc2lua2luZyB0aGUgc2hpZnQgb2YgIjEgPDwgaSIgaW50byB0aGUgdHN0LCBhbmQgdXNpbmcgYW5kcyBpbnN0ZWFkIG9mCisgICAgIHRzdC4gIFRoaXMgd2lsbCBwcm9iYWJseSByZXF1aXJlIHdob2xlIGZ1bmN0aW9uIGlzZWwuCisgIDMuIEdDQyBlbWl0czoKKyAgCXRzdAlyMSwgIzI1NgorICAgICB3ZSBlbWl0OgorICAgICAgICBtb3YgcjEsICMxCisgICAgICAgIGxzbCByMSwgcjEsICM4CisgICAgICAgIHRzdCByMiwgcjEKKyAgCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2hlbiBzcGlsbGluZyBpbiB0aHVtYiBtb2RlIGFuZCB0aGUgc3Agb2Zmc2V0IGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gdGhlIGxkciAvCitzdHIgb2Zmc2V0IGZpZWxkLCB3ZSBsb2FkIHRoZSBvZmZzZXQgZnJvbSBhIGNvbnN0cG9vbCBlbnRyeSBhbmQgYWRkIGl0IHRvIHNwOgorCitsZHIgcjIsIExDUEkKK2FkZCByMiwgc3AKK2xkciByMiwgW3IyXQorCitUaGVzZSBpbnN0cnVjdGlvbnMgcHJlc2VydmUgdGhlIGNvbmRpdGlvbiBjb2RlIHdoaWNoIGlzIGltcG9ydGFudCBpZiB0aGUgc3BpbGwKK2lzIGJldHdlZW4gYSBjbXAgYW5kIGEgYmNjIGluc3RydWN0aW9uLiBIb3dldmVyLCB3ZSBjYW4gdXNlIHRoZSAocG90ZW50aWFsbHkpCitjaGVhcGVyIHNlcXVuY2UgaWYgd2Uga25vdyBpdCdzIG9rIHRvIGNsb2JiZXIgdGhlIGNvbmRpdGlvbiByZWdpc3Rlci4KKworYWRkIHIyLCBzcCwgIzI1NSAqIDQKK2FkZCByMiwgIzEzMgorbGRyIHIyLCBbcjIsICM3ICogNF0KKworVGhpcyBpcyBlc3BlY2lhbGx5IGJhZCB3aGVuIGR5bmFtaWMgYWxsb2NhIGlzIHVzZWQuIFRoZSBhbGwgZml4ZWQgc2l6ZSBzdGFjaworb2JqZWN0cyBhcmUgcmVmZXJlbmNlZCBvZmYgdGhlIGZyYW1lIHBvaW50ZXIgd2l0aCBuZWdhdGl2ZSBvZmZzZXRzLiBTZWUKK29nZ2VuYyBmb3IgYW4gZXhhbXBsZS4KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1Bvb3IgY29kZWdlbiB0ZXN0L0NvZGVHZW4vQVJNL3NlbGVjdC5sbCBmNzoKKworCWxkciByNSwgTENQSTFfMAorTFBDMDoKKwlhZGQgcjUsIHBjCisJbGRyIHI2LCBMQ1BJMV8xCisJbGRyIHIyLCBMQ1BJMV8yCisJbW92IHIzLCByNgorCW1vdiBsciwgcGMKKwlieCByNQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK01ha2UgcmVnaXN0ZXIgYWxsb2NhdG9yIC8gc3BpbGxlciBzbWFydGVyIHNvIHdlIGNhbiByZS1tYXRlcmlhbGl6ZSAibW92IHIsIGltbSIsCitldGMuIEFsbW9zdCBhbGwgVGh1bWIgaW5zdHJ1Y3Rpb25zIGNsb2JiZXIgY29uZGl0aW9uIGNvZGUuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQWRkIGxkbWlhLCBzdG1pYSBzdXBwb3J0LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RodW1iIGxvYWQgLyBzdG9yZSBhZGRyZXNzIG1vZGUgb2Zmc2V0cyBhcmUgc2NhbGVkLiBUaGUgdmFsdWVzIGtlcHQgaW4gdGhlCitpbnN0cnVjdGlvbiBvcGVyYW5kcyBhcmUgcHJlLXNjYWxlIHZhbHVlcy4gVGhpcyBwcm9iYWJseSBvdWdodCB0byBiZSBjaGFuZ2VkCit0byBhdm9pZCBleHRyYSB3b3JrIHdoZW4gd2UgY29udmVydCBUaHVtYjIgaW5zdHJ1Y3Rpb25zIHRvIFRodW1iMSBpbnN0cnVjdGlvbnMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2UgbmVlZCB0byBtYWtlIChzb21lIG9mIHRoZSkgVGh1bWIxIGluc3RydWN0aW9ucyBwcmVkaWNhYmxlLiBUaGF0IHdpbGwgYWxsb3cKK3Nocmlua2luZyBvZiBwcmVkaWNhdGVkIFRodW1iMiBpbnN0cnVjdGlvbnMuIFRvIGFsbG93IHRoaXMsIHdlIG5lZWQgdG8gYmUgYWJsZQordG8gdG9nZ2xlIHRoZSAncycgYml0IHNpbmNlIHRoZXkgZG8gbm90IHNldCBDUFNSIHdoZW4gdGhleSBhcmUgaW5zaWRlIElUIGJsb2Nrcy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNYWtlIHVzZSBvZiBoaSByZWdpc3RlciB2YXJpYW50cyBvZiBjbXA6IHRDTVBoaXIgLyB0Q01QWmhpci4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaHVtYjEgaW1tZWRpYXRlIGZpZWxkIHNvbWV0aW1lcyBrZWVwIHByZS1zY2FsZWQgdmFsdWVzLiBTZWUKK1RodW1iMVJlZ2lzdGVySW5mbzo6ZWxpbWluYXRlRnJhbWVJbmRleC4gVGhpcyBpcyBpbmNvbnNpc3RlbnQgZnJvbSBBUk0gYW5kCitUaHVtYjIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworUmF0aGVyIHRoYW4gaGF2aW5nIHRCUl9KVHIgcHJpbnQgYSAiLmFsaWduIDIiIGFuZCBjb25zdGFudCBpc2xhbmQgcGFzcyBwYWQgaXQsCithZGQgYSB0YXJnZXQgc3BlY2lmaWMgQUxJR04gaW5zdHJ1Y3Rpb24gaW5zdGVhZC4gVGhhdCB3YXksIEdldEluc3RTaXplSW5CeXRlcword29uJ3QgaGF2ZSB0byBvdmVyLWVzdGltYXRlLiBJdCBjYW4gYWxzbyBiZSB1c2VkIGZvciBsb29wIGFsaWdubWVudCBwYXNzLgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vUkVBRE1FLVRodW1iMi50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9SRUFETUUtVGh1bWIyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2MyNTUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vUkVBRE1FLVRodW1iMi50eHQKQEAgLTAsMCArMSw2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSYW5kb20gaWRlYXMgZm9yIHRoZSBBUk0gYmFja2VuZCAoVGh1bWIyIHNwZWNpZmljKS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworTWFrZSBzdXJlIGp1bXB0YWJsZSBkZXN0aW5hdGlvbnMgYXJlIGJlbG93IHRoZSBqdW1wdGFibGUgaW4gb3JkZXIgdG8gbWFrZSB1c2UKK29mIHRiYiAvIHRiaC4KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1JFQURNRS50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzNmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9SRUFETUUudHh0CkBAIC0wLDAgKzEsNjU5IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSYW5kb20gaWRlYXMgZm9yIHRoZSBBUk0gYmFja2VuZC4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworUmVpbXBsZW1lbnQgJ3NlbGVjdCcgaW4gdGVybXMgb2YgJ1NFTCcuCisKKyogV2Ugd291bGQgcmVhbGx5IGxpa2UgdG8gc3VwcG9ydCBVWFRBQjE2LCBidXQgd2UgbmVlZCB0byBwcm92ZSB0aGF0IHRoZQorICBhZGQgZG9lc24ndCBuZWVkIHRvIG92ZXJmbG93IGJldHdlZW4gdGhlIHR3byAxNi1iaXQgY2h1bmtzLgorCisqIEltcGxlbWVudCBwcmUvcG9zdCBpbmNyZW1lbnQgc3VwcG9ydC4gIChlLmcuIFBSOTM1KQorKiBJbXBsZW1lbnQgc21hcnRlciBjb25zdGFudCBnZW5lcmF0aW9uIGZvciBiaW5vcHMgd2l0aCBsYXJnZSBpbW1lZGlhdGVzLgorCitBIGZldyBBUk12NlQyIG9wcyBzaG91bGQgYmUgcGF0dGVybiBtYXRjaGVkOiBCRkksIFNCRlgsIGFuZCBVQkZYCisKK0ludGVyZXN0aW5nIG9wdGltaXphdGlvbiBmb3IgUElDIGNvZGVnZW4gb24gYXJtLWxpbnV4OgoraHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MzEyOQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0NyYXp5IGlkZWE6ICBDb25zaWRlciBjb2RlIHRoYXQgdXNlcyBsb3RzIG9mIDgtYml0IG9yIDE2LWJpdCB2YWx1ZXMuICBCeSB0aGUKK3RpbWUgcmVnYWxsb2MgaGFwcGVucywgdGhlc2UgdmFsdWVzIGFyZSBub3cgaW4gYSAzMi1iaXQgcmVnaXN0ZXIsIHVzdWFsbHkgd2l0aAordGhlIHRvcC1iaXRzIGtub3duIHRvIGJlIHNpZ24gb3IgemVybyBleHRlbmRlZC4gIElmIHNwaWxsZWQsIHdlIHNob3VsZCBiZSBhYmxlCit0byBzcGlsbCB0aGVzZSB0byBhIDgtYml0IG9yIDE2LWJpdCBzdGFjayBzbG90LCB6ZXJvIG9yIHNpZ24gZXh0ZW5kaW5nIGFzIHBhcnQKK29mIHRoZSByZWxvYWQuCisKK0RvaW5nIHRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sgZnJhbWUgKGltcG9ydGFudCBmb3IgdGh1bWIgZXRjKSwgYW5kCithbHNvIGluY3JlYXNlcyB0aGUgbGlrZWxpaG9vZCB0aGF0IHdlIHdpbGwgYmUgYWJsZSB0byByZWxvYWQgbXVsdGlwbGUgdmFsdWVzCitmcm9tIHRoZSBzdGFjayB3aXRoIGEgc2luZ2xlIGxvYWQuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlIGNvbnN0YW50IGlzbGFuZCBwYXNzIGlzIGluIGdvb2Qgc2hhcGUuICBTb21lIGNsZWFudXBzIG1pZ2h0IGJlIGRlc2lyYWJsZSwKK2J1dCB0aGVyZSBpcyB1bmxpa2VseSB0byBiZSBtdWNoIGltcHJvdmVtZW50IGluIHRoZSBnZW5lcmF0ZWQgY29kZS4KKworMS4gIFRoZXJlIG1heSBiZSBzb21lIGFkdmFudGFnZSB0byB0cnlpbmcgdG8gYmUgc21hcnRlciBhYm91dCB0aGUgaW5pdGlhbAorcGxhY2VtZW50LCByYXRoZXIgdGhhbiBwdXR0aW5nIGV2ZXJ5dGhpbmcgYXQgdGhlIGVuZC4KKworMi4gIFRoZXJlIG1pZ2h0IGJlIHNvbWUgY29tcGlsZS10aW1lIGVmZmljaWVuY3kgdG8gYmUgaGFkIGJ5IHJlcHJlc2VudGluZworY29uc2VjdXRpdmUgaXNsYW5kcyBhcyBhIHNpbmdsZSBibG9jayByYXRoZXIgdGhhbiBtdWx0aXBsZSBibG9ja3MuCisKKzMuICBVc2UgYSBwcmlvcml0eSBxdWV1ZSB0byBzb3J0IGNvbnN0YW50IHBvb2wgdXNlcnMgaW4gaW52ZXJzZSBvcmRlciBvZgorICAgIHBvc2l0aW9uIHNvIHdlIGFsd2F5cyBwcm9jZXNzIHRoZSBvbmUgY2xvc2VkIHRvIHRoZSBlbmQgb2YgZnVuY3Rpb25zCisgICAgZmlyc3QuIFRoaXMgbWF5IHNpbXBseSBDcmVhdGVOZXdXYXRlci4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitFbGltaW5hdGUgY29weXNpZ24gY3VzdG9tIGV4cGFuc2lvbi4gV2UgYXJlIHN0aWxsIGdlbmVyYXRpbmcgY3JhcHB5IGNvZGUgd2l0aAorZGVmYXVsdCBleHBhbnNpb24gKyBpZi1jb252ZXJzaW9uLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0VsaW1pbmF0ZSBvbmUgaW5zdHJ1Y3Rpb24gZnJvbToKKworZGVmaW5lIGkzMiBAX1o2c2xvdzRiaWkoaTMyICV4LCBpMzIgJXkpIHsKKyAgICAgICAgJXRtcCA9IGljbXAgc2d0IGkzMiAleCwgJXkKKyAgICAgICAgJXJldHZhbCA9IHNlbGVjdCBpMSAldG1wLCBpMzIgJXgsIGkzMiAleQorICAgICAgICByZXQgaTMyICVyZXR2YWwKK30KKworX19aNnNsb3c0YmlpOgorICAgICAgICBjbXAgcjAsIHIxCisgICAgICAgIG1vdmd0IHIxLCByMAorICAgICAgICBtb3YgcjAsIHIxCisgICAgICAgIGJ4IGxyCis9PgorCitfX1o2c2xvdzRiaWk6CisgICAgICAgIGNtcCByMCwgcjEKKyAgICAgICAgbW92bGUgcjAsIHIxCisgICAgICAgIGJ4IGxyCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSW1wbGVtZW50IGxvbmcgbG9uZyAiWC0zIiB3aXRoIGluc3RydWN0aW9ucyB0aGF0IGZvbGQgdGhlIGltbWVkaWF0ZSBpbi4gIFRoZXNlCit3ZXJlIGRpc2FibGVkIGR1ZSB0byBiYWRuZXNzIHdpdGggdGhlIEFSTSBjYXJyeSBmbGFnIG9uIHN1YnRyYWN0cy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNb3JlIGxvYWQgLyBzdG9yZSBvcHRpbWl6YXRpb25zOgorMSkgQmV0dGVyIHJlcHJlc2VudGF0aW9uIGZvciBibG9jayB0cmFuc2Zlcj8gVGhpcyBpcyBmcm9tIE9sZGVuL3Bvd2VyOgorCisJZmxkZCBkMCwgW3I0XQorCWZzdGQgZDAsIFtyNCwgIyszMl0KKwlmbGRkIGQwLCBbcjQsICMrOF0KKwlmc3RkIGQwLCBbcjQsICMrNDBdCisJZmxkZCBkMCwgW3I0LCAjKzE2XQorCWZzdGQgZDAsIFtyNCwgIys0OF0KKwlmbGRkIGQwLCBbcjQsICMrMjRdCisJZnN0ZCBkMCwgW3I0LCAjKzU2XQorCitJZiB3ZSBjYW4gc3BhcmUgdGhlIHJlZ2lzdGVycywgaXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBmbGRtIGFuZCBmc3RtIGhlcmUuCitOZWVkIG1ham9yIHJlZ2lzdGVyIGFsbG9jYXRvciBlbmhhbmNlbWVudCB0aG91Z2guCisKKzIpIENhbiB3ZSByZWNvZ25pemUgdGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIGNvbnN0YW50cG9vbCBlbnRyaWVzPyBpLmUuIFRyZWF0CisKKwlsZHIgcjAsIExDUEkxN18zCisJbGRyIHIxLCBMQ1BJMTdfNAorCWxkciByMiwgTENQSTE3XzUKKworICAgYXMKKwlsZHIgcjAsIExDUEkxNworCWxkciByMSwgTENQSTE3KzQKKwlsZHIgcjIsIExDUEkxNys4CisKKyAgIFRoZW4gdGhlIGxkcidzIGNhbiBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGxkbS4gU2VlIE9sZGVuL3Bvd2VyLgorCitOb3RlIGZvciBBUk0gdjQgZ2NjIHVzZXMgbGRtaWEgdG8gbG9hZCBhIHBhaXIgb2YgMzItYml0IHZhbHVlcyB0byByZXByZXNlbnQgYQorZG91YmxlIDY0LWJpdCBGUCBjb25zdGFudDoKKworCWFkcglyMCwgTDYKKwlsZG1pYQlyMCwge3IwLXIxfQorCisJLmFsaWduIDIKK0w2OgorCS5sb25nCS04NTg5OTM0NTkKKwkubG9uZwkxMDc0MzE4NTQwCisKKzMpIHN0cnVjdCBjb3BpZXMgYXBwZWFyIHRvIGJlIGRvbmUgZmllbGQgYnkgZmllbGQgCitpbnN0ZWFkIG9mIGJ5IHdvcmRzLCBhdCBsZWFzdCBzb21ldGltZXM6CisKK3N0cnVjdCBmb28geyBpbnQgeDsgc2hvcnQgczsgY2hhciBjMTsgY2hhciBjMjsgfTsKK3ZvaWQgY3B5KHN0cnVjdCBmb28qYSwgc3RydWN0IGZvbypiKSB7ICphID0gKmI7IH0KKworbGx2bSBjb2RlICgtTzIpCisgICAgICAgIGxkcmIgcjMsIFtyMSwgIys2XQorICAgICAgICBsZHIgcjIsIFtyMV0KKyAgICAgICAgbGRyYiByMTIsIFtyMSwgIys3XQorICAgICAgICBsZHJoIHIxLCBbcjEsICMrNF0KKyAgICAgICAgc3RyIHIyLCBbcjBdCisgICAgICAgIHN0cmggcjEsIFtyMCwgIys0XQorICAgICAgICBzdHJiIHIzLCBbcjAsICMrNl0KKyAgICAgICAgc3RyYiByMTIsIFtyMCwgIys3XQorZ2NjIGNvZGUgKC1PMikKKyAgICAgICAgbGRtaWEgICByMSwge3IxLXIyfQorICAgICAgICBzdG1pYSAgIHIwLCB7cjEtcjJ9CisKK0luIHRoaXMgYmVuY2htYXJrIHBvb3IgaGFuZGxpbmcgb2YgYWdncmVnYXRlIGNvcGllcyBoYXMgc2hvd24gdXAgYXMKK2hhdmluZyBhIGxhcmdlIGVmZmVjdCBvbiBzaXplLCBhbmQgcG9zc2libHkgc3BlZWQgYXMgd2VsbCAod2UgZG9uJ3QgaGF2ZQorYSBnb29kIHdheSB0byBtZWFzdXJlIG9uIEFSTSkuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworKiBDb25zaWRlciB0aGlzIHNpbGx5IGV4YW1wbGU6CisKK2RvdWJsZSBiYXIoZG91YmxlIHgpIHsgIAorICBkb3VibGUgciA9IGZvbygzLjEpOworICByZXR1cm4geCtyOworfQorCitfYmFyOgorICAgICAgICBzdG1mZCBzcCEsIHtyNCwgcjUsIHI3LCBscn0KKyAgICAgICAgYWRkIHI3LCBzcCwgIzgKKyAgICAgICAgbW92IHI0LCByMAorICAgICAgICBtb3YgcjUsIHIxCisgICAgICAgIGZsZGQgZDAsIExDUEkxXzAKKyAgICAgICAgZm1ycmQgcjAsIHIxLCBkMAorICAgICAgICBibCBfZm9vCisgICAgICAgIGZtZHJyIGQwLCByNCwgcjUKKyAgICAgICAgZm1zciBzMiwgcjAKKyAgICAgICAgZnNpdG9kIGQxLCBzMgorICAgICAgICBmYWRkZCBkMCwgZDEsIGQwCisgICAgICAgIGZtcnJkIHIwLCByMSwgZDAKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQsIHI1LCByNywgcGN9CisKK0lnbm9yZSB0aGUgcHJvbG9ndWUgYW5kIGVwaWxvZ3VlIHN0dWZmIGZvciBhIHNlY29uZC4gTm90ZSAKKwltb3YgcjQsIHIwCisJbW92IHI1LCByMQordGhlIGNvcHlzIHRvIGNhbGxlZS1zYXZlIHJlZ2lzdGVycyBhbmQgdGhlIGZhY3QgdGhleSBhcmUgb25seSBiZWluZyB1c2VkIGJ5IHRoZQorZm1kcnIgaW5zdHJ1Y3Rpb24uIEl0IHdvdWxkIGhhdmUgYmVlbiBiZXR0ZXIgaGFkIHRoZSBmbWRyciBiZWVuIHNjaGVkdWxlZAorYmVmb3JlIHRoZSBjYWxsIGFuZCBwbGFjZSB0aGUgcmVzdWx0IGluIGEgY2FsbGVlLXNhdmUgRFBSIHJlZ2lzdGVyLiBUaGUgdHdvCittb3Ygb3BzIHdvdWxkIG5vdCBoYXZlIGJlZW4gbmVjZXNzYXJ5LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0NhbGxpbmcgY29udmVudGlvbiByZWxhdGVkIHN0dWZmOgorCisqIGdjYydzIHBhcmFtZXRlciBwYXNzaW5nIGltcGxlbWVudGF0aW9uIGlzIHRlcnJpYmxlIGFuZCB3ZSBzdWZmZXIgYXMgYSByZXN1bHQ6CisKK2UuZy4KK3N0cnVjdCBzIHsKKyAgZG91YmxlIGQxOworICBpbnQgczE7Cit9OworCit2b2lkIGZvbyhzdHJ1Y3QgcyBTKSB7CisgIHByaW50ZigiJWcsICVkXG4iLCBTLmQxLCBTLnMxKTsKK30KKworJ1MnIGlzIHBhc3NlZCB2aWEgcmVnaXN0ZXJzIHIwLCByMSwgcjIuIEJ1dCBnY2Mgc3RvcmVzIHRoZW0gdG8gdGhlIHN0YWNrLCBhbmQKK3RoZW4gcmVsb2FkIHRoZW0gdG8gcjEsIHIyLCBhbmQgcjMgYmVmb3JlIGlzc3VpbmcgdGhlIGNhbGwgKHIwIGNvbnRhaW5zIHRoZQorYWRkcmVzcyBvZiB0aGUgZm9ybWF0IHN0cmluZyk6CisKKwlzdG1mZAlzcCEsIHtyNywgbHJ9CisJYWRkCXI3LCBzcCwgIzAKKwlzdWIJc3AsIHNwLCAjMTIKKwlzdG1pYQlzcCwge3IwLCByMSwgcjJ9CisJbGRtaWEJc3AsIHtyMS1yMn0KKwlsZHIJcjAsIEw1CisJbGRyCXIzLCBbc3AsICM4XQorTDI6CisJYWRkCXIwLCBwYywgcjAKKwlibAlMX3ByaW50ZiRzdHViCisKK0luc3RlYWQgb2YgYSBzdG1pYSwgbGRtaWEsIGFuZCBhIGxkciwgd291bGRuJ3QgaXQgYmUgYmV0dGVyIHRvIGRvIHRocmVlIG1vdmVzPworCisqIFJldHVybiBhbiBhZ2dyZWdhdGUgdHlwZSBpcyBldmVuIHdvcnNlOgorCitlLmcuCitzdHJ1Y3QgcyBmb28odm9pZCkgeworICBzdHJ1Y3QgcyBTID0gezEuMSwgMn07CisgIHJldHVybiBTOworfQorCisJbW92CWlwLCByMAorCWxkcglyMCwgTDUKKwlzdWIJc3AsIHNwLCAjMTIKK0wyOgorCWFkZAlyMCwgcGMsIHIwCisJQCBsciBuZWVkZWQgZm9yIHByb2xvZ3VlCisJbGRtaWEJcjAsIHtyMCwgcjEsIHIyfQorCXN0bWlhCXNwLCB7cjAsIHIxLCByMn0KKwlzdG1pYQlpcCwge3IwLCByMSwgcjJ9CisJbW92CXIwLCBpcAorCWFkZAlzcCwgc3AsICMxMgorCWJ4CWxyCisKK3IwIChhbmQgbGF0ZXIgaXApIGlzIHRoZSBoaWRkZW4gcGFyYW1ldGVyIGZyb20gY2FsbGVyIHRvIHN0b3JlIHRoZSB2YWx1ZSBpbi4gVGhlCitmaXJzdCBsZG1pYSBsb2FkcyB0aGUgY29uc3RhbnRzIGludG8gcjAsIHIxLCByMi4gVGhlIGxhc3Qgc3RtaWEgc3RvcmVzIHIwLCByMSwKK3IyIGludG8gdGhlIGFkZHJlc3MgcGFzc2VkIGluLiBIb3dldmVyLCB0aGVyZSBpcyBvbmUgYWRkaXRpb25hbCBzdG1pYSB0aGF0CitzdG9yZXMgcjAsIHIxLCBhbmQgcjIgdG8gc29tZSBzdGFjayBsb2NhdGlvbi4gVGhlIHN0b3JlIGlzIGRlYWQuCisKK1RoZSBsbHZtLWdjYyBnZW5lcmF0ZWQgY29kZSBsb29rcyBsaWtlIHRoaXM6CisKK2NzcmV0Y2Mgdm9pZCAlZm9vKCVzdHJ1Y3QucyogJWFnZy5yZXN1bHQpIHsKK2VudHJ5OgorCSVTID0gYWxsb2NhICVzdHJ1Y3QucywgYWxpZ24gNAkJOyA8JXN0cnVjdC5zKj4gWyN1c2VzPTFdCisJJW1lbXRtcCA9IGFsbG9jYSAlc3RydWN0LnMJCTsgPCVzdHJ1Y3Qucyo+IFsjdXNlcz0xXQorCWNhc3QgJXN0cnVjdC5zKiAlUyB0byBzYnl0ZSoJCTsgPHNieXRlKj46MCBbI3VzZXM9Ml0KKwljYWxsIHZvaWQgJWxsdm0ubWVtY3B5LmkzMiggc2J5dGUqICUwLCBzYnl0ZSogY2FzdCAoeyBkb3VibGUsIGludCB9KiAlQy4wLjkwNCB0byBzYnl0ZSopLCB1aW50IDEyLCB1aW50IDQgKQorCWNhc3QgJXN0cnVjdC5zKiAlYWdnLnJlc3VsdCB0byBzYnl0ZSoJCTsgPHNieXRlKj46MSBbI3VzZXM9Ml0KKwljYWxsIHZvaWQgJWxsdm0ubWVtY3B5LmkzMiggc2J5dGUqICUxLCBzYnl0ZSogJTAsIHVpbnQgMTIsIHVpbnQgMCApCisJY2FzdCAlc3RydWN0LnMqICVtZW10bXAgdG8gc2J5dGUqCQk7IDxzYnl0ZSo+OjIgWyN1c2VzPTFdCisJY2FsbCB2b2lkICVsbHZtLm1lbWNweS5pMzIoIHNieXRlKiAlMiwgc2J5dGUqICUxLCB1aW50IDEyLCB1aW50IDAgKQorCXJldCB2b2lkCit9CisKK2xsYyBlbmRzIHVwIGlzc3VpbmcgdHdvIG1lbWNweSdzICh0aGUgZmlyc3QgbWVtY3B5IGJlY29tZXMgMyBsb2FkcyBmcm9tCitjb25zdGFudHBvb2wpLiBQZXJoYXBzIHdlIHNob3VsZCAxKSBmaXggbGx2bS1nY2Mgc28gdGhlIG1lbWNweSBpcyB0cmFuc2xhdGVkCitpbnRvIGEgbnVtYmVyIG9mIGxvYWQgYW5kIHN0b3Jlcywgb3IgMikgY3VzdG9tIGxvd2VyIG1lbWNweSAob2Ygc21hbGwgc2l6ZSkgdG8KK2JlIGxkbWlhIC8gc3RtaWEuIEkgdGhpbmsgb3B0aW9uIDIgaXMgYmV0dGVyIGJ1dCB0aGUgY3VycmVudCByZWdpc3RlcgorYWxsb2NhdG9yIGNhbm5vdCBhbGxvY2F0ZSBhIGNodW5rIG9mIHJlZ2lzdGVycyBhdCBhIHRpbWUuCisKK0EgZmVhc2libGUgdGVtcG9yYXJ5IHNvbHV0aW9uIGlzIHRvIHVzZSBzcGVjaWZpYyBwaHlzaWNhbCByZWdpc3RlcnMgYXQgdGhlCitsb3dlcmluZyB0aW1lIGZvciBzbWFsbCAoPD0gNCB3b3Jkcz8pIHRyYW5zZmVyIHNpemUuCisKKyogQVJNIENTUmV0IGNhbGxpbmcgY29udmVudGlvbiByZXF1aXJlcyB0aGUgaGlkZGVuIGFyZ3VtZW50IHRvIGJlIHJldHVybmVkIGJ5Cit0aGUgY2FsbGVlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIGNhbiBkZWZpbml0ZWx5IGRvIGEgYmV0dGVyIGpvYiBvbiBCQiBwbGFjZW1lbnRzIHRvIGVsaW1pbmF0ZSBzb21lIGJyYW5jaGVzLgorSXQncyB2ZXJ5IGNvbW1vbiB0byBzZWUgbGx2bSBnZW5lcmF0ZWQgYXNzZW1ibHkgY29kZSB0aGF0IGxvb2tzIGxpa2UgdGhpczoKKworTEJCMzoKKyAuLi4KK0xCQjQ6CisuLi4KKyAgYmVxIExCQjMKKyAgYiBMQkIyCisKK0lmIEJCNCBpcyB0aGUgb25seSBwcmVkZWNlc3NvciBvZiBCQjMsIHRoZW4gd2UgY2FuIGVtaXQgQkIzIGFmdGVyIEJCNC4gV2UgY2FuCit0aGVuIGVsaW1pbmF0ZSBiZXEgYW5kIGFuZCB0dXJuIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byBMQkIyIHRvIGEgYm5lLgorCitTZWUgTWNDYXQvMTgtaW1wL0NvbXB1dGVCb3VuZGluZ0JveGVzIGZvciBhbiBleGFtcGxlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1ByZS0vcG9zdC0gaW5kZXhlZCBsb2FkIC8gc3RvcmVzOgorCisxKSBXZSBzaG91bGQgbm90IG1ha2UgdGhlIHByZS9wb3N0LSBpbmRleGVkIGxvYWQvc3RvcmUgdHJhbnNmb3JtIGlmIHRoZSBiYXNlIHB0cgoraXMgZ3VhcmFudGVlZCB0byBiZSBsaXZlIGJleW9uZCB0aGUgbG9hZC9zdG9yZS4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBiYXNlCitwdHIgaXMgbGl2ZSBvdXQgb2YgdGhlIGJsb2NrIHdlIGFyZSBwZXJmb3JtaW5nIHRoZSBvcHRpbWl6YXRpb24uIGUuZy4KKworbW92IHIxLCByMgorbGRyIHIzLCBbcjFdLCAjNAorLi4uCisKK3ZzLgorCitsZHIgcjMsIFtyMl0KK2FkZCByMSwgcjIsICM0CisuLi4KKworSW4gbW9zdCBjYXNlcywgdGhpcyBpcyBqdXN0IGEgd2FzdGVkIG9wdGltaXphdGlvbi4gSG93ZXZlciwgc29tZXRpbWVzIGl0IGNhbgorbmVnYXRpdmVseSBpbXBhY3QgdGhlIHBlcmZvcm1hbmNlIGJlY2F1c2UgdHdvLWFkZHJlc3MgY29kZSBpcyBtb3JlIHJlc3RyaWN0aXZlCit3aGVuIGl0IGNvbWVzIHRvIHNjaGVkdWxpbmcuCisKK1VuZm9ydHVuYXRlbHksIGxpdmVvdXQgaW5mb3JtYXRpb24gaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIGR1cmluZyBEQUcgY29tYmluZQordGltZS4KKworMikgQ29uc2lkZXIgc3BsaXRpbmcgYSBpbmRleGVkIGxvYWQgLyBzdG9yZSBpbnRvIGEgcGFpciBvZiBhZGQvc3ViICsgbG9hZC9zdG9yZQorICAgdG8gc29sdmUgIzEgKGluIFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3MuY3BwKS4KKworMykgRW5oYW5jZSBMU1IgdG8gZ2VuZXJhdGUgbW9yZSBvcHBvcnR1bml0aWVzIGZvciBpbmRleGVkIG9wcy4KKworNCkgT25jZSB3ZSBhZGRlZCBzdXBwb3J0IGZvciBtdWx0aXBsZSByZXN1bHQgcGF0dGVybnMsIHdyaXRlIGluZGV4ZWQgbG9hZHMKKyAgIHBhdHRlcm5zIGluc3RlYWQgb2YgQysrIGluc3RydWN0aW9uIHNlbGVjdGlvbiBjb2RlLgorCis1KSBVc2UgVkxETSAvIFZTVE0gdG8gZW11bGF0ZSBpbmRleGVkIEZQIGxvYWQgLyBzdG9yZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbXBsZW1lbnQgc3VwcG9ydCBmb3Igc29tZSBtb3JlIHRyaWNreSB3YXlzIHRvIG1hdGVyaWFsaXplIGltbWVkaWF0ZXMuICBGb3IKK2V4YW1wbGUsIHRvIGdldCAweGZmZmY4MDAwLCB3ZSBjYW4gdXNlOgorCittb3YgcjksICMmM2Y4MDAwCitzdWIgcjksIHI5LCAjJjQwMDAwMAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIHNvbWV0aW1lcyBnZW5lcmF0ZSBtdWx0aXBsZSBhZGQgLyBzdWIgaW5zdHJ1Y3Rpb25zIHRvIHVwZGF0ZSBzcCBpbiBwcm9sb2d1ZQorYW5kIGVwaWxvZ3VlIGlmIHRoZSBpbmMgLyBkZWMgdmFsdWUgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbiBhIHNpbmdsZSBpbW1lZGlhdGUKK29wZXJhbmQuIEluIHNvbWUgY2FzZXMsIHBlcmhhcHMgaXQgbWlnaHQgYmUgYmV0dGVyIHRvIGxvYWQgdGhlIHZhbHVlIGZyb20gYQorY29uc3RhbnRwb29sIGluc3RlYWQuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworR0NDIGdlbmVyYXRlcyBzaWduaWZpY2FudGx5IGJldHRlciBjb2RlIGZvciB0aGlzIGZ1bmN0aW9uLgorCitpbnQgZm9vKGludCBTdGFja1B0ciwgdW5zaWduZWQgY2hhciAqTGluZSwgdW5zaWduZWQgY2hhciAqU3RhY2ssIGludCBMaW5lTGVuKSB7CisgICAgaW50IGkgPSAwOworCisgICAgaWYgKFN0YWNrUHRyICE9IDApIHsKKyAgICAgICB3aGlsZSAoU3RhY2tQdHIgIT0gMCAmJiBpIDwgKCgoTGluZUxlbikgPCAoMzI3NjgpKT8gKExpbmVMZW4pIDogKDMyNzY4KSkpCisgICAgICAgICAgTGluZVtpKytdID0gU3RhY2tbLS1TdGFja1B0cl07CisgICAgICAgIGlmIChMaW5lTGVuID4gMzI3NjgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChTdGFja1B0ciAhPSAwICYmIGkgPCBMaW5lTGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAtLVN0YWNrUHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGFja1B0cjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGlzIHNob3VsZCBjb21waWxlIHRvIHRoZSBtbGFzIGluc3RydWN0aW9uOgoraW50IG1sYXMoaW50IHgsIGludCB5LCBpbnQgeikgeyByZXR1cm4gKCh4ICogeSArIHopIDwgMCkgPyA3IDogMTM7IH0KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitBdCBzb21lIHBvaW50LCB3ZSBzaG91bGQgdHJpYWdlIHRoZXNlIHRvIHNlZSBpZiB0aGV5IHN0aWxsIGFwcGx5IHRvIHVzOgorCitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE5NTk4CitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE4NTYwCitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI3MDE2CisKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTE4MzEKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTE4MjYKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTE4MjUKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTE4MjQKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTE4MjMKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTE4MjAKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTA5ODIKKworaHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMDI0MgoraHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD05ODMxCitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTk3NjAKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9OTc1OQoraHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD05NzAzCitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTk3MDIKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9OTY2MworCitodHRwOi8vd3d3LmluZi51LXN6ZWdlZC5odS9nY2MtYXJtLworaHR0cDovL2NpdGVzZWVyLmlzdC5wc3UuZWR1L2RlYnVzMDRsaW5rdGltZS5odG1sCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZ2NjIGdlbmVyYXRlcyBzbWFsbGVyIGNvZGUgZm9yIHRoaXMgZnVuY3Rpb24gYXQgLU8yIG9yIC1PczoKKwordm9pZCBmb28oc2lnbmVkIGNoYXIqIHApIHsKKyAgaWYgKCpwID09IDMpCisgICAgIGJhcigpOworICAgZWxzZSBpZiAoKnAgPT0gNCkKKyAgICBiYXooKTsKKyAgZWxzZSBpZiAoKnAgPT0gNSkKKyAgICBxdXV4KCk7Cit9CisKK2xsdm0gZGVjaWRlcyBpdCdzIGEgZ29vZCBpZGVhIHRvIHR1cm4gdGhlIHJlcGVhdGVkIGlmLi4uZWxzZSBpbnRvIGEKK2JpbmFyeSB0cmVlLCBhcyBpZiBpdCB3ZXJlIGEgc3dpdGNoOyB0aGUgcmVzdWx0aW5nIGNvZGUgcmVxdWlyZXMgLTEgCitjb21wYXJlLWFuZC1icmFuY2hlcyB3aGVuICpwPD0yIG9yICpwPT01LCB0aGUgc2FtZSBudW1iZXIgaWYgKnA9PTQKK29yICpwPjYsIGFuZCArMSBpZiAqcD09My4gIFNvIGl0IHNob3VsZCBiZSBhIHNwZWVkIHdpbgorKG9uIGJhbGFuY2UpLiAgSG93ZXZlciwgdGhlIHJldmlzZWQgY29kZSBpcyBsYXJnZXIsIHdpdGggNCBjb25kaXRpb25hbCAKK2JyYW5jaGVzIGluc3RlYWQgb2YgMy4KKworTW9yZSBzZXJpb3VzbHksIHRoZXJlIGlzIGEgYnl0ZS0+d29yZCBleHRlbmQgYmVmb3JlCitlYWNoIGNvbXBhcmlzb24sIHdoZXJlIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSwgYW5kIHRoZSBjb25kaXRpb24gY29kZXMKK2FyZSBub3QgcmVtZW1iZXJlZCB3aGVuIHRoZSBzYW1lIHR3byB2YWx1ZXMgYXJlIGNvbXBhcmVkIHR3aWNlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK01vcmUgTFNSIGVuaGFuY2VtZW50cyBwb3NzaWJsZToKKworMS4gVGVhY2ggTFNSIGFib3V0IHByZS0gYW5kIHBvc3QtIGluZGV4ZWQgb3BzIHRvIGFsbG93IGl2IGluY3JlbWVudCBiZSBtZXJnZWQKKyAgIGluIGEgbG9hZCAvIHN0b3JlLgorMi4gQWxsb3cgaXYgcmV1c2UgZXZlbiB3aGVuIGEgdHlwZSBjb252ZXJzaW9uIGlzIHJlcXVpcmVkLiBGb3IgZXhhbXBsZSwgaTgKKyAgIGFuZCBpMzIgbG9hZCAvIHN0b3JlIGFkZHJlc3NpbmcgbW9kZXMgYXJlIGlkZW50aWNhbC4KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoaXM6CisKK2ludCBmb28oaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKKyAgbG9uZyBsb25nIGFjYyA9IChsb25nIGxvbmcpYSAqIChsb25nIGxvbmcpYjsKKyAgYWNjICs9IChsb25nIGxvbmcpYyAqIChsb25nIGxvbmcpZDsKKyAgcmV0dXJuIChpbnQpKGFjYyA+PiAzMik7Cit9CisKK1Nob3VsZCBjb21waWxlIHRvIHVzZSBTTUxBTCAoU2lnbmVkIE11bHRpcGx5IEFjY3VtdWxhdGUgTG9uZykgd2hpY2ggbXVsdGlwbGllcyAKK3R3byBzaWduZWQgMzItYml0IHZhbHVlcyB0byBwcm9kdWNlIGEgNjQtYml0IHZhbHVlLCBhbmQgYWNjdW11bGF0ZXMgdGhpcyB3aXRoIAorYSA2NC1iaXQgdmFsdWUuCisKK1dlIGN1cnJlbnRseSBnZXQgdGhpcyB3aXRoIGJvdGggdjQgYW5kIHY2OgorCitfZm9vOgorICAgICAgICBzbXVsbCByMSwgcjAsIHIxLCByMAorICAgICAgICBzbXVsbCByMywgcjIsIHIzLCByMgorICAgICAgICBhZGRzIHIzLCByMywgcjEKKyAgICAgICAgYWRjIHIwLCByMiwgcjAKKyAgICAgICAgYnggbHIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGlzOgorICAgICAgICAjaW5jbHVkZSA8YWxnb3JpdGhtPgorICAgICAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIGJvb2w+IGZ1bGxfYWRkKHVuc2lnbmVkIGEsIHVuc2lnbmVkIGIpCisgICAgICAgIHsgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGEgKyBiLCBhICsgYiA8IGEpOyB9CisgICAgICAgIGJvb2wgbm9fb3ZlcmZsb3codW5zaWduZWQgYSwgdW5zaWduZWQgYikKKyAgICAgICAgeyByZXR1cm4gIWZ1bGxfYWRkKGEsIGIpLnNlY29uZDsgfQorCitTaG91bGQgY29tcGlsZSB0bzoKKworX1o4ZnVsbF9hZGRqajoKKwlhZGRzCXIyLCByMSwgcjIKKwltb3ZjYwlyMSwgIzAKKwltb3ZjcwlyMSwgIzEKKwlzdHIJcjIsIFtyMCwgIzBdCisJc3RyYglyMSwgW3IwLCAjNF0KKwltb3YJcGMsIGxyCisKK19aMTFub19vdmVyZmxvd2pqOgorCWNtbglyMCwgcjEKKwltb3ZjcwlyMCwgIzAKKwltb3ZjYwlyMCwgIzEKKwltb3YJcGMsIGxyCisKK25vdDoKKworX19aOGZ1bGxfYWRkamo6CisgICAgICAgIGFkZCByMywgcjIsIHIxCisgICAgICAgIHN0ciByMywgW3IwXQorICAgICAgICBtb3YgcjIsICMxCisgICAgICAgIG1vdiByMTIsICMwCisgICAgICAgIGNtcCByMywgcjEKKyAgICAgICAgbW92bG8gcjEyLCByMgorICAgICAgICBzdHIgcjEyLCBbcjAsICMrNF0KKyAgICAgICAgYnggbHIKK19fWjExbm9fb3ZlcmZsb3dqajoKKyAgICAgICAgYWRkIHIzLCByMSwgcjAKKyAgICAgICAgbW92IHIyLCAjMQorICAgICAgICBtb3YgcjEsICMwCisgICAgICAgIGNtcCByMywgcjAKKyAgICAgICAgbW92aHMgcjEsIHIyCisgICAgICAgIG1vdiByMCwgcjEKKyAgICAgICAgYnggbHIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTb21lIG9mIHRoZSBORU9OIGludHJpbnNpY3MgbWF5IGJlIGFwcHJvcHJpYXRlIGZvciBtb3JlIGdlbmVyYWwgdXNlLCBlaXRoZXIKK2FzIHRhcmdldC1pbmRlcGVuZGVudCBpbnRyaW5zaWNzIG9yIHBlcmhhcHMgZWxzZXdoZXJlIGluIHRoZSBBUk0gYmFja2VuZC4KK1NvbWUgb2YgdGhlbSBtYXkgYWxzbyBiZSBsb3dlcmVkIHRvIHRhcmdldC1pbmRlcGVuZGVudCBTRE5vZGVzLCBhbmQgcGVyaGFwcworc29tZSBuZXcgU0ROb2RlcyBjb3VsZCBiZSBhZGRlZC4KKworRm9yIGV4YW1wbGUsIG1heGltdW0sIG1pbmltdW0sIGFuZCBhYnNvbHV0ZSB2YWx1ZSBvcGVyYXRpb25zIGFyZSB3ZWxsLWRlZmluZWQKK2FuZCBzdGFuZGFyZCBvcGVyYXRpb25zLCBib3RoIGZvciB2ZWN0b3IgYW5kIHNjYWxhciB0eXBlcy4KKworVGhlIGN1cnJlbnQgTkVPTi1zcGVjaWZpYyBpbnRyaW5zaWNzIGZvciBjb3VudCBsZWFkaW5nIHplcm9zIGFuZCBjb3VudCBvbmUKK2JpdHMgY291bGQgcGVyaGFwcyBiZSByZXBsYWNlZCBieSB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IGN0bHogYW5kIGN0cG9wCitpbnRyaW5zaWNzLiAgSXQgbWF5IGFsc28gbWFrZSBzZW5zZSB0byBhZGQgYSB0YXJnZXQtaW5kZXBlbmRlbnQgImN0bHMiCitpbnRyaW5zaWMgZm9yICJjb3VudCBsZWFkaW5nIHNpZ24gYml0cyIuICBMaWtld2lzZSwgdGhlIGJhY2tlbmQgY291bGQgdXNlCit0aGUgdGFyZ2V0LWluZGVwZW5kZW50IFNETm9kZXMgZm9yIHRoZXNlIG9wZXJhdGlvbnMuCisKK0FSTXY2IGhhcyBzY2FsYXIgc2F0dXJhdGluZyBhbmQgaGFsdmluZyBhZGRzIGFuZCBzdWJ0cmFjdHMuICBUaGUgc2FtZQoraW50cmluc2ljcyBjb3VsZCBwb3NzaWJseSBiZSB1c2VkIGZvciBib3RoIE5FT04ncyB2ZWN0b3IgaW1wbGVtZW50YXRpb25zIG9mCit0aG9zZSBvcGVyYXRpb25zIGFuZCB0aGUgQVJNdjYgc2NhbGFyIHZlcnNpb25zLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0FSTTo6TU9WQ0NyIGlzIGNvbW11dGFibGUgKGJ5IGZsaXBwaW5nIHRoZSBjb25kaXRpb24pLiBCdXQgd2UgbmVlZCB0byBpbXBsZW1lbnQKK0FSTUluc3RySW5mbzo6Y29tbXV0ZUluc3RydWN0aW9uKCkgdG8gc3VwcG9ydCBpdC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTcGxpdCBvdXQgTERSIChsaXRlcmFsKSBmcm9tIG5vcm1hbCBBUk0gTERSIGluc3RydWN0aW9uLiBBbHNvIGNvbnNpZGVyIHNwbGl0aW5nCitMRFIgaW50byBpbW0xMiBhbmQgc29fcmVnIGZvcm1zLiBUaGlzIGFsbG93cyB1cyB0byBjbGVhbiB1cCBzb21lIGNvZGUuIGUuZy4KK0FSTUxvYWRTdG9yZU9wdGltaXplciBkb2VzIG5vdCBuZWVkIHRvIGxvb2sgYXQgTERSIChsaXRlcmFsKSBhbmQgTERSIChzb19yZWcpCit3aGlsZSBBUk1Db25zdGFudElzbGFuZFBhc3Mgb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IExEUiAobGl0ZXJhbCkuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQ29uc3RhbnQgaXNsYW5kIHBhc3Mgc2hvdWxkIG1ha2UgdXNlIG9mIGZ1bGwgcmFuZ2UgU29JbW0gdmFsdWVzIGZvciBMRUFwY3JlbC4KK0JlIGNhcmVmdWwgdGhvdWdoIGFzIHRoZSBsYXN0IGF0dGVtcHQgY2F1c2VkIGluZmluaXRlIGxvb3Bpbmcgb24gbGVuY29kLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1ByZWRpY2F0aW9uIGlzc3VlLiBUaGlzIGZ1bmN0aW9uOiAgIAorCitleHRlcm4gdW5zaWduZWQgYXJyYXlbIDEyOCBdOworaW50ICAgICBmb28oIGludCB4ICkgeworICBpbnQgICAgIHk7CisgIHkgPSBhcnJheVsgeCAmIDEyNyBdOworICBpZiAoIHggJiAxMjggKQorICAgICB5ID0gMTIzNDU2Nzg5ICYgKCB5ID4+IDIgKTsKKyAgZWxzZQorICAgICB5ID0gMTIzNDU2Nzg5ICYgeTsKKyAgcmV0dXJuIHk7Cit9CisKK2NvbXBpbGVzIHRvOgorCitfZm9vOgorCWFuZCByMSwgcjAsICMxMjcKKwlsZHIgcjIsIExDUEkxXzAKKwlsZHIgcjIsIFtyMl0KKwlsZHIgcjEsIFtyMiwgK3IxLCBsc2wgIzJdCisJbW92IHIyLCByMSwgbHNyICMyCisJdHN0IHIwLCAjMTI4CisJbW92ZXEgcjIsIHIxCisJbGRyIHIwLCBMQ1BJMV8xCisJYW5kIHIwLCByMiwgcjAKKwlieCBscgorCitJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcywgdG8gZm9sZCB0aGUgc2hpZnQgaW50byB0aGUKK2NvbmRpdGlvbmFsIG1vdmU6CisKKwlhbmQgcjEsIHIwLCAjMTI3CisJbGRyIHIyLCBMQ1BJMV8wCisJbGRyIHIyLCBbcjJdCisJbGRyIHIxLCBbcjIsICtyMSwgbHNsICMyXQorCXRzdCByMCwgIzEyOAorCW1vdm5lIHIxLCByMSwgbHNyICMyCisJbGRyIHIwLCBMQ1BJMV8xCisJYW5kIHIwLCByMSwgcjAKKwlieCBscgorCitpdCBzYXZlcyBhbiBpbnN0cnVjdGlvbiBhbmQgYSByZWdpc3Rlci4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJdCBtaWdodCBiZSBwcm9maXRhYmxlIHRvIGNzZSBNT1ZpMTYgaWYgdGhlcmUgYXJlIGxvdHMgb2YgMzItYml0IGltbWVkaWF0ZXMKK3dpdGggdGhlIHNhbWUgYm90dG9tIGhhbGYuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworUm9iZXJ0IE11dGggc3RhcnRlZCB3b3JraW5nIG9uIGFuIGFsdGVybmF0ZSBqdW1wIHRhYmxlIGltcGxlbWVudGF0aW9uIHRoYXQKK2RvZXMgbm90IHB1dCB0aGUgdGFibGVzIGluLWxpbmUgaW4gdGhlIHRleHQuICBUaGlzIGlzIG1vcmUgbGlrZSB0aGUgbGx2bQorZGVmYXVsdCBqdW1wIHRhYmxlIGltcGxlbWVudGF0aW9uLiAgVGhpcyBtaWdodCBiZSB1c2VmdWwgc29tZXRpbWUuICBTZXZlcmFsCityZXZpc2lvbnMgb2YgcGF0Y2hlcyBhcmUgb24gdGhlIG1haWxpbmcgbGlzdCwgYmVnaW5uaW5nIGF0OgoraHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L3BpcGVybWFpbC9sbHZtZGV2LzIwMDktSnVuZS8wMjI3NjMuaHRtbAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK01ha2UgdXNlIG9mIHRoZSAicmJpdCIgaW5zdHJ1Y3Rpb24uCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGFrZSBhIGxvb2sgYXQgdGVzdC9Db2RlR2VuL1RodW1iMi9tYWNoaW5lLWxpY20ubGwuIEFSTSBzaG91bGQgYmUgdGF1Z2h0IGhvdwordG8gbGljbSBhbmQgY3NlIHRoZSB1bm5lY2Vzc2FyeSBsb2FkIGZyb20gY3AjMS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGUgQ01OIGluc3RydWN0aW9uIHNldHMgdGhlIGZsYWdzIGxpa2UgYW4gQUREIGluc3RydWN0aW9uLCB3aGlsZSBDTVAgc2V0cwordGhlbSBsaWtlIGEgc3VidHJhY3QuIFRoZXJlZm9yZSB0byBiZSBhYmxlIHRvIHVzZSBDTU4gZm9yIGNvbXBhcmlzb25zIG90aGVyCit0aGFuIHRoZSBaIGJpdCwgd2UnbGwgbmVlZCBhZGRpdGlvbmFsIGxvZ2ljIHRvIHJldmVyc2UgdGhlIGNvbmRpdGlvbmFscworYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21wYXJpc29uLiBQZXJoYXBzIGEgcHNldWRvLWluc3RydWN0aW9uIGZvciB0aGUgY29tcGFyaXNvbiwKK3dpdGggYSBwb3N0LWNvZGVnZW4gcGFzcyB0byBjbGVhbiB1cCBhbmQgaGFuZGxlIHRoZSBjb25kaXRpb24gY29kZXM/CitTZWUgUFI1Njk0IGZvciB0ZXN0Y2FzZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitHaXZlbiB0aGUgZm9sbG93aW5nIG9uIGFybXY1OgoraW50IHRlc3QxKGludCBBLCBpbnQgQikgeworICByZXR1cm4gKEEmLTgzODg0ODEpfChCJjgzODg0ODApOworfQorCitXZSBjdXJyZW50bHkgZ2VuZXJhdGU6CisJbGRyCXIyLCAuTENQSTBfMAorCWFuZAlyMCwgcjAsIHIyCisJbGRyCXIyLCAuTENQSTBfMQorCWFuZAlyMSwgcjEsIHIyCisJb3JyCXIwLCByMSwgcjAKKwlieAlscgorCitXZSBzaG91bGQgYmUgYWJsZSB0byByZXBsYWNlIHRoZSBzZWNvbmQgbGRyK2FuZCB3aXRoIGEgYmljIChpLmUuIHJldXNlIHRoZQorY29uc3RhbnQgd2hpY2ggd2FzIGFscmVhZHkgbG9hZGVkKS4gIE5vdCBzdXJlIHdoYXQncyBuZWNlc3NhcnkgdG8gZG8gdGhhdC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGUgY29kZSBnZW5lcmF0ZWQgZm9yIGJzd2FwIG9uIGFybXY0LzUgKENQVXMgd2l0aG91dCByZXYpIGlzIGxlc3MgdGhhbiBpZGVhbDoKKworaW50IGEoaW50IHgpIHsgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDMyKHgpOyB9CisKK2E6CisJbW92CXIxLCAjMjU1LCAyNAorCW1vdglyMiwgIzI1NSwgMTYKKwlhbmQJcjEsIHIxLCByMCwgbHNyICM4CisJYW5kCXIyLCByMiwgcjAsIGxzbCAjOAorCW9ycglyMSwgcjEsIHIwLCBsc3IgIzI0CisJb3JyCXIwLCByMiwgcjAsIGxzbCAjMjQKKwlvcnIJcjAsIHIwLCByMQorCWJ4CWxyCisKK1NvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgYmV0dGVyIChmZXdlciBpbnN0cnVjdGlvbnMvcmVnaXN0ZXJzKToKKwllb3IgICAgIHIxLCByMCwgcjAsIHJvciAjMTYKKwliaWMgICAgIHIxLCByMSwgIzB4ZmYwMDAwCisJbW92ICAgICByMSwgcjEsIGxzciAjOAorCWVvciAgICAgcjAsIHIxLCByMCwgcm9yICM4CisJYngJbHIKKworQSBjdXN0b20gVGh1bWIgdmVyc2lvbiB3b3VsZCBhbHNvIGJlIGEgc2xpZ2h0IGltcHJvdmVtZW50IG92ZXIgdGhlIGdlbmVyaWMKK3ZlcnNpb24uCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBzaW1wbGUgQyBjb2RlOgorCit2b2lkIGZvbyh1bnNpZ25lZCBjaGFyICphLCB1bnNpZ25lZCBjaGFyICpiLCBpbnQgKmMpIHsKKyBpZiAoKCphIHwgKmIpID09IDApICpjID0gMDsKK30KKworY3VycmVudGx5IGxsdm0tZ2NjIGdlbmVyYXRlcyBzb21ldGhpbmcgbGlrZSB0aGlzIChuaWNlIGJyYW5jaGxlc3MgY29kZSBJJ2Qgc2F5KToKKworICAgICAgIGxkcmIgICAgcjAsIFtyMF0KKyAgICAgICBsZHJiICAgIHIxLCBbcjFdCisgICAgICAgb3JyICAgICByMCwgcjEsIHIwCisgICAgICAgdHN0ICAgICByMCwgIzI1NQorICAgICAgIG1vdmVxICAgcjAsICMwCisgICAgICAgc3RyZXEgICByMCwgW3IyXQorICAgICAgIGJ4ICAgICAgbHIKKworTm90ZSB0aGF0IGJvdGggInRzdCIgYW5kICJtb3ZlcSIgYXJlIHJlZHVuZGFudC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UYXJnZXRJbmZvL0FSTVRhcmdldEluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGFyZ2V0SW5mby9BUk1UYXJnZXRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjNhMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGFyZ2V0SW5mby9BUk1UYXJnZXRJbmZvLmNwcApAQCAtMCwwICsxLDIzIEBACisvLz09PS0tIEFSTVRhcmdldEluZm8uY3BwIC0gQVJNIFRhcmdldCBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1RhcmdldCBsbHZtOjpUaGVBUk1UYXJnZXQsIGxsdm06OlRoZVRodW1iVGFyZ2V0OworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVBUk1UYXJnZXRJbmZvKCkgeyAKKyAgUmVnaXN0ZXJUYXJnZXQ8VHJpcGxlOjphcm0sIC8qSGFzSklUPSovdHJ1ZT4KKyAgICBYKFRoZUFSTVRhcmdldCwgImFybSIsICJBUk0iKTsKKworICBSZWdpc3RlclRhcmdldDxUcmlwbGU6OnRodW1iLCAvKkhhc0pJVD0qL3RydWU+CisgICAgWShUaGVUaHVtYlRhcmdldCwgInRodW1iIiwgIlRodW1iIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTEwYmIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDcgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4gKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1BUk1JbmZvCisgIEFSTVRhcmdldEluZm8uY3BwCisgICkKKworYWRkX2RlcGVuZGVuY2llcyhMTFZNQVJNSW5mbyBBUk1Db2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGFyZ2V0SW5mby9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RhcmdldEluZm8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5MmFiMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RhcmdldEluZm8vTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvQVJNL1RhcmdldEluZm8vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUFSTUluZm8KKworIyBIYWNrOiB3ZSBuZWVkIHRvIGluY2x1ZGUgJ21haW4nIHRhcmdldCBkaXJlY3RvcnkgdG8gZ3JhYiBwcml2YXRlIGhlYWRlcnMKK0NQUEZMQUdTID0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMUluc3RySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjFJbnN0ckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjMwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjFJbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsMTgzIEBACisvLz09PS0gVGh1bWIxSW5zdHJJbmZvLmNwcCAtIFRodW1iLTEgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgVGh1bWItMSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJUaHVtYjFJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1HZW5JbnN0ckluZm8uaW5jIgorI2luY2x1ZGUgIkFSTU1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1lbU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgIlRodW1iMUluc3RySW5mby5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGh1bWIxSW5zdHJJbmZvOjpUaHVtYjFJbnN0ckluZm8oY29uc3QgQVJNU3VidGFyZ2V0ICZTVEkpCisgIDogQVJNQmFzZUluc3RySW5mbyhTVEkpLCBSSSgqdGhpcywgU1RJKSB7Cit9CisKK3Vuc2lnbmVkIFRodW1iMUluc3RySW5mbzo6Z2V0VW5pbmRleGVkT3Bjb2RlKHVuc2lnbmVkIE9wYykgY29uc3QgeworICByZXR1cm4gMDsKK30KKwordm9pZCBUaHVtYjFJbnN0ckluZm86OmNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0IHsKKyAgYm9vbCB0RGVzdCA9IEFSTTo6dEdQUlJlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcpOworICBib29sIHRTcmMgID0gQVJNOjp0R1BSUmVnQ2xhc3MuY29udGFpbnMoU3JjUmVnKTsKKyAgdW5zaWduZWQgT3BjID0gQVJNOjp0TU9WZ3ByMmdwcjsKKyAgaWYgKHREZXN0ICYmIHRTcmMpCisgICAgT3BjID0gQVJNOjp0TU9WcjsKKyAgZWxzZSBpZiAodFNyYykKKyAgICBPcGMgPSBBUk06OnRNT1Z0Z3ByMmdwcjsKKyAgZWxzZSBpZiAodERlc3QpCisgICAgT3BjID0gQVJNOjp0TU9WZ3ByMnRncHI7CisKKyAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoT3BjKSwgRGVzdFJlZykKKyAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgYXNzZXJ0KEFSTTo6R1BSUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSAmJgorICAgICAgICAgIlRodW1iMSBjYW4gb25seSBjb3B5IEdQUiByZWdpc3RlcnMiKTsKK30KKwordm9pZCBUaHVtYjFJbnN0ckluZm86Ogorc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZJLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgYXNzZXJ0KChSQyA9PSBBUk06OnRHUFJSZWdpc3RlckNsYXNzIHx8CisgICAgICAgICAgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFNyY1JlZykgJiYKKyAgICAgICAgICAgaXNBUk1Mb3dSZWdpc3RlcihTcmNSZWcpKSkgJiYgIlVua25vd24gcmVnY2xhc3MhIik7CisKKyAgaWYgKFJDID09IEFSTTo6dEdQUlJlZ2lzdGVyQ2xhc3MgfHwKKyAgICAgIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihTcmNSZWcpICYmCisgICAgICAgaXNBUk1Mb3dSZWdpc3RlcihTcmNSZWcpKSkgeworICAgIERlYnVnTG9jIERMOworICAgIGlmIChJICE9IE1CQi5lbmQoKSkgREwgPSBJLT5nZXREZWJ1Z0xvYygpOworCisgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgICAgTWFjaGluZUZyYW1lSW5mbyAmTUZJID0gKk1GLmdldEZyYW1lSW5mbygpOworICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8gPQorICAgICAgTUYuZ2V0TWFjaGluZU1lbU9wZXJhbmQoUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQ6Ok1PU3RvcmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkkuZ2V0T2JqZWN0U2l6ZShGSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkkuZ2V0T2JqZWN0QWxpZ25tZW50KEZJKSk7CisgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjp0U3BpbGwpKQorICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAgICAgICAgICAgICAgICAuYWRkRnJhbWVJbmRleChGSSkuYWRkSW1tKDApLmFkZE1lbU9wZXJhbmQoTU1PKSk7CisgIH0KK30KKwordm9pZCBUaHVtYjFJbnN0ckluZm86OgorbG9hZFJlZ0Zyb21TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRkksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGFzc2VydCgoUkMgPT0gQVJNOjp0R1BSUmVnaXN0ZXJDbGFzcyB8fAorICAgICAgICAgIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihEZXN0UmVnKSAmJgorICAgICAgICAgICBpc0FSTUxvd1JlZ2lzdGVyKERlc3RSZWcpKSkgJiYgIlVua25vd24gcmVnY2xhc3MhIik7CisKKyAgaWYgKFJDID09IEFSTTo6dEdQUlJlZ2lzdGVyQ2xhc3MgfHwKKyAgICAgIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihEZXN0UmVnKSAmJgorICAgICAgIGlzQVJNTG93UmVnaXN0ZXIoRGVzdFJlZykpKSB7CisgICAgRGVidWdMb2MgREw7CisgICAgaWYgKEkgIT0gTUJCLmVuZCgpKSBETCA9IEktPmdldERlYnVnTG9jKCk7CisKKyAgICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgICBNYWNoaW5lRnJhbWVJbmZvICZNRkkgPSAqTUYuZ2V0RnJhbWVJbmZvKCk7CisgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgICBNRi5nZXRNYWNoaW5lTWVtT3BlcmFuZChQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhGSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Mb2FkLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZJLmdldE9iamVjdFNpemUoRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZJLmdldE9iamVjdEFsaWdubWVudChGSSkpOworICAgIEFkZERlZmF1bHRQcmVkKEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEFSTTo6dFJlc3RvcmUpLCBEZXN0UmVnKQorICAgICAgICAgICAgICAgICAgIC5hZGRGcmFtZUluZGV4KEZJKS5hZGRJbW0oMCkuYWRkTWVtT3BlcmFuZChNTU8pKTsKKyAgfQorfQorCitib29sIFRodW1iMUluc3RySW5mbzo6CitzcGlsbENhbGxlZVNhdmVkUmVnaXN0ZXJzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICBpZiAoQ1NJLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIERlYnVnTG9jIERMOworICBpZiAoTUkgIT0gTUJCLmVuZCgpKSBETCA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KEFSTTo6dFBVU0gpKTsKKyAgQWRkRGVmYXVsdFByZWQoTUlCKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gQ1NJLnNpemUoKTsgaSAhPSAwOyAtLWkpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaS0xXS5nZXRSZWcoKTsKKyAgICBib29sIGlzS2lsbCA9IHRydWU7CisKKyAgICAvLyBBZGQgdGhlIGNhbGxlZS1zYXZlZCByZWdpc3RlciBhcyBsaXZlLWluIHVubGVzcyBpdCdzIExSIGFuZAorICAgIC8vIEBsbHZtLnJldHVybmFkZHJlc3MgaXMgY2FsbGVkLiBJZiBMUiBpcyByZXR1cm5lZCBmb3IgQGxsdm0ucmV0dXJuYWRkcmVzcworICAgIC8vIHRoZW4gaXQncyBhbHJlYWR5IGFkZGVkIHRvIHRoZSBmdW5jdGlvbiBhbmQgZW50cnkgYmxvY2sgbGl2ZS1pbiBzZXRzLgorICAgIGlmIChSZWcgPT0gQVJNOjpMUikgeworICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgICAgICBpZiAoTUYuZ2V0RnJhbWVJbmZvKCktPmlzUmV0dXJuQWRkcmVzc1Rha2VuKCkgJiYKKyAgICAgICAgICBNRi5nZXRSZWdJbmZvKCkuaXNMaXZlSW4oUmVnKSkKKyAgICAgICAgaXNLaWxsID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlzS2lsbCkKKyAgICAgIE1CQi5hZGRMaXZlSW4oUmVnKTsKKworICAgIE1JQi5hZGRSZWcoUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVGh1bWIxSW5zdHJJbmZvOjoKK3Jlc3RvcmVDYWxsZWVTYXZlZFJlZ2lzdGVycyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZDU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgIEFSTUZ1bmN0aW9uSW5mbyAqQUZJID0gTUYuZ2V0SW5mbzxBUk1GdW5jdGlvbkluZm8+KCk7CisgIGlmIChDU0kuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBpc1ZhckFyZyA9IEFGSS0+Z2V0VmFyQXJnc1JlZ1NhdmVTaXplKCkgPiAwOworICBEZWJ1Z0xvYyBETCA9IE1JLT5nZXREZWJ1Z0xvYygpOworICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQiA9IEJ1aWxkTUkoTUYsIERMLCBnZXQoQVJNOjp0UE9QKSk7CisgIEFkZERlZmF1bHRQcmVkKE1JQik7CisKKyAgYm9vbCBOdW1SZWdzID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IENTSS5zaXplKCk7IGkgIT0gMDsgLS1pKSB7CisgICAgdW5zaWduZWQgUmVnID0gQ1NJW2ktMV0uZ2V0UmVnKCk7CisgICAgaWYgKFJlZyA9PSBBUk06OkxSKSB7CisgICAgICAvLyBTcGVjaWFsIGVwaWxvZ3VlIGZvciB2YXJhcmcgZnVuY3Rpb25zLiBTZWUgZW1pdEVwaWxvZ3VlCisgICAgICBpZiAoaXNWYXJBcmcpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgUmVnID0gQVJNOjpQQzsKKyAgICAgICgqTUlCKS5zZXREZXNjKGdldChBUk06OnRQT1BfUkVUKSk7CisgICAgICBNSSA9IE1CQi5lcmFzZShNSSk7CisgICAgfQorICAgIE1JQi5hZGRSZWcoUmVnLCBnZXREZWZSZWdTdGF0ZSh0cnVlKSk7CisgICAgTnVtUmVncyA9IHRydWU7CisgIH0KKworICAvLyBJdCdzIGlsbGVnYWwgdG8gZW1pdCBwb3AgaW5zdHJ1Y3Rpb24gd2l0aG91dCBvcGVyYW5kcy4KKyAgaWYgKE51bVJlZ3MpCisgICAgTUJCLmluc2VydChNSSwgJipNSUIpOworICBlbHNlCisgICAgTUYuRGVsZXRlTWFjaGluZUluc3RyKE1JQik7CisKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjFJbnN0ckluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMUluc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTEzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjFJbnN0ckluZm8uaApAQCAtMCwwICsxLDY4IEBACisvLz09PS0gVGh1bWIxSW5zdHJJbmZvLmggLSBUaHVtYi0xIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgVGh1bWItMSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVEhVTUIxSU5TVFJVQ1RJT05JTkZPX0gKKyNkZWZpbmUgVEhVTUIxSU5TVFJVQ1RJT05JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTUluc3RySW5mby5oIgorI2luY2x1ZGUgIlRodW1iMVJlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEFSTVN1YnRhcmdldDsKKworY2xhc3MgVGh1bWIxSW5zdHJJbmZvIDogcHVibGljIEFSTUJhc2VJbnN0ckluZm8geworICBUaHVtYjFSZWdpc3RlckluZm8gUkk7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRodW1iMUluc3RySW5mbyhjb25zdCBBUk1TdWJ0YXJnZXQgJlNUSSk7CisKKyAgLy8gUmV0dXJuIHRoZSBub24tcHJlL3Bvc3QgaW5jcmVtZW50aW5nIHZlcnNpb24gb2YgJ09wYycuIFJldHVybiAwCisgIC8vIGlmIHRoZXJlIGlzIG5vdCBzdWNoIGFuIG9wY29kZS4KKyAgdW5zaWduZWQgZ2V0VW5pbmRleGVkT3Bjb2RlKHVuc2lnbmVkIE9wYykgY29uc3Q7CisKKyAgLy8vIGdldFJlZ2lzdGVySW5mbyAtIFRhcmdldEluc3RySW5mbyBpcyBhIHN1cGVyc2V0IG9mIE1SZWdpc3RlciBpbmZvLiAgQXMKKyAgLy8vIHN1Y2gsIHdoZW5ldmVyIGEgY2xpZW50IGhhcyBhbiBpbnN0YW5jZSBvZiBpbnN0cnVjdGlvbiBpbmZvLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBiZSBhYmxlIHRvIGdldCByZWdpc3RlciBpbmZvIGFzIHdlbGwgKHRocm91Z2ggdGhpcyBtZXRob2QpLgorICAvLy8KKyAgY29uc3QgVGh1bWIxUmVnaXN0ZXJJbmZvICZnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBSSTsgfQorCisgIGJvb2wgc3BpbGxDYWxsZWVTYXZlZFJlZ2lzdGVycyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworICBib29sIHJlc3RvcmVDYWxsZWVTYXZlZFJlZ2lzdGVycyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgIHZvaWQgY29weVBoeXNSZWcoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgIGJvb2wgS2lsbFNyYykgY29uc3Q7CisgIHZvaWQgc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICB2b2lkIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworfTsKK30KKworI2VuZGlmIC8vIFRIVU1CMUlOU1RSVUNUSU9OSU5GT19ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjFSZWdpc3RlckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGh1bWIxUmVnaXN0ZXJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMyOGUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGh1bWIxUmVnaXN0ZXJJbmZvLmNwcApAQCAtMCwwICsxLDg3MSBAQAorLy89PT0tIFRodW1iMVJlZ2lzdGVySW5mby5jcHAgLSBUaHVtYi0xIFJlZ2lzdGVyIEluZm9ybWF0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFRodW1iLTEgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbworLy8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTUFkZHJlc3NpbmdNb2Rlcy5oIgorI2luY2x1ZGUgIkFSTUJhc2VJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJBUk1NYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAiQVJNU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiVGh1bWIxSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiVGh1bWIxUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2V4dGVybiBjbDo6b3B0PGJvb2w+IFJldXNlRnJhbWVJbmRleFZhbHM7Cit9CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitUaHVtYjFSZWdpc3RlckluZm86OlRodW1iMVJlZ2lzdGVySW5mbyhjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZ0aWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1TdWJ0YXJnZXQgJnN0aSkKKyAgOiBBUk1CYXNlUmVnaXN0ZXJJbmZvKHRpaSwgc3RpKSB7Cit9CisKKy8vLyBlbWl0TG9hZENvbnN0UG9vbCAtIEVtaXRzIGEgbG9hZCBmcm9tIGNvbnN0cG9vbCB0byBtYXRlcmlhbGl6ZSB0aGUKKy8vLyBzcGVjaWZpZWQgaW1tZWRpYXRlLgordm9pZCBUaHVtYjFSZWdpc3RlckluZm86OmVtaXRMb2FkQ29uc3RQb29sKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQcmVkUmVnKSBjb25zdCB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICBNYWNoaW5lQ29uc3RhbnRQb29sICpDb25zdGFudFBvb2wgPSBNRi5nZXRDb25zdGFudFBvb2woKTsKKyAgY29uc3QgQ29uc3RhbnQgKkMgPSBDb25zdGFudEludDo6Z2V0KAorICAgICAgICAgIFR5cGU6OmdldEludDMyVHkoTUJCLmdldFBhcmVudCgpLT5nZXRGdW5jdGlvbigpLT5nZXRDb250ZXh0KCkpLCBWYWwpOworICB1bnNpZ25lZCBJZHggPSBDb25zdGFudFBvb2wtPmdldENvbnN0YW50UG9vbEluZGV4KEMsIDQpOworCisgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBUk06OnRMRFJjcCkpCisgICAgICAgICAgLmFkZFJlZyhEZXN0UmVnLCBnZXREZWZSZWdTdGF0ZSh0cnVlKSwgU3ViSWR4KQorICAgICAgICAgIC5hZGRDb25zdGFudFBvb2xJbmRleChJZHgpLmFkZEltbShQcmVkKS5hZGRSZWcoUHJlZFJlZyk7Cit9CisKK2Jvb2wgVGh1bWIxUmVnaXN0ZXJJbmZvOjpoYXNSZXNlcnZlZENhbGxGcmFtZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKkZGSSA9IE1GLmdldEZyYW1lSW5mbygpOworICB1bnNpZ25lZCBDRlNpemUgPSBGRkktPmdldE1heENhbGxGcmFtZVNpemUoKTsKKyAgLy8gSXQncyBub3QgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIGluY2x1ZGUgdGhlIGNhbGwgZnJhbWUgYXMgcGFydCBvZiB0aGUKKyAgLy8gc3RhY2sgZnJhbWUuIEFSTSAoZXNwZWNpYWxseSBUaHVtYikgaGFzIHNtYWxsIGltbWVkaWF0ZSBvZmZzZXQgdG8KKyAgLy8gYWRkcmVzcyB0aGUgc3RhY2sgZnJhbWUuIFNvIGEgbGFyZ2UgY2FsbCBmcmFtZSBjYW4gY2F1c2UgcG9vciBjb2RlZ2VuCisgIC8vIGFuZCBtYXkgZXZlbiBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHNjYXZlbmdlIGEgcmVnaXN0ZXIuCisgIGlmIChDRlNpemUgPj0gKCgxIDw8IDgpIC0gMSkgKiA0IC8gMikgLy8gSGFsZiBvZiBpbW04ICogNAorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gIU1GLmdldEZyYW1lSW5mbygpLT5oYXNWYXJTaXplZE9iamVjdHMoKTsKK30KKworCisvLy8gZW1pdFRodW1iUmVnUGx1c0ltbUluUmVnIC0gRW1pdHMgYSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zIHRvIG1hdGVyaWFsaXplCisvLy8gYSBkZXN0cmVnID0gYmFzZXJlZyArIGltbWVkaWF0ZSBpbiBUaHVtYiBjb2RlLiBNYXRlcmlhbGl6ZSB0aGUgaW1tZWRpYXRlCisvLy8gaW4gYSByZWdpc3RlciB1c2luZyBtb3YgLyBtdm4gc2VxdWVuY2VzIG9yIGxvYWQgdGhlIGltbWVkaWF0ZSBmcm9tIGEKKy8vLyBjb25zdHBvb2wgZW50cnkuCitzdGF0aWMKK3ZvaWQgZW1pdFRodW1iUmVnUGx1c0ltbUluUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE51bUJ5dGVzLCBib29sIENhbkNoYW5nZUNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHVtYjFSZWdpc3RlckluZm8mIE1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgICAgYm9vbCBpc0hpZ2ggPSAhaXNBUk1Mb3dSZWdpc3RlcihEZXN0UmVnKSB8fAorICAgICAgICAgICAgICAgICAgKEJhc2VSZWcgIT0gMCAmJiAhaXNBUk1Mb3dSZWdpc3RlcihCYXNlUmVnKSk7CisgICAgYm9vbCBpc1N1YiA9IGZhbHNlOworICAgIC8vIFN1YnRyYWN0IGRvZXNuJ3QgaGF2ZSBoaWdoIHJlZ2lzdGVyIHZlcnNpb24uIExvYWQgdGhlIG5lZ2F0aXZlIHZhbHVlCisgICAgLy8gaWYgZWl0aGVyIGJhc2Ugb3IgZGVzdCByZWdpc3RlciBpcyBhIGhpZ2ggcmVnaXN0ZXIuIEFsc28sIGlmIGRvIG5vdAorICAgIC8vIGlzc3VlIHN1YiBhcyBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSBpZiBjb25kaXRpb24gcmVnaXN0ZXIgaXMgdG8gYmUKKyAgICAvLyBwcmVzZXJ2ZWQuCisgICAgaWYgKE51bUJ5dGVzIDwgMCAmJiAhaXNIaWdoICYmIENhbkNoYW5nZUNDKSB7CisgICAgICBpc1N1YiA9IHRydWU7CisgICAgICBOdW1CeXRlcyA9IC1OdW1CeXRlczsKKyAgICB9CisgICAgdW5zaWduZWQgTGRSZWcgPSBEZXN0UmVnOworICAgIGlmIChEZXN0UmVnID09IEFSTTo6U1ApIHsKKyAgICAgIGFzc2VydChCYXNlUmVnID09IEFSTTo6U1AgJiYgIlVuZXhwZWN0ZWQhIik7CisgICAgICBMZFJlZyA9IE1GLmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoQVJNOjp0R1BSUmVnaXN0ZXJDbGFzcyk7CisgICAgfQorCisgICAgaWYgKE51bUJ5dGVzIDw9IDI1NSAmJiBOdW1CeXRlcyA+PSAwKQorICAgICAgQWRkRGVmYXVsdFQxQ0MoQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dE1PVmk4KSwgTGRSZWcpKQorICAgICAgICAuYWRkSW1tKE51bUJ5dGVzKTsKKyAgICBlbHNlIGlmIChOdW1CeXRlcyA8IDAgJiYgTnVtQnl0ZXMgPj0gLTI1NSkgeworICAgICAgQWRkRGVmYXVsdFQxQ0MoQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dE1PVmk4KSwgTGRSZWcpKQorICAgICAgICAuYWRkSW1tKE51bUJ5dGVzKTsKKyAgICAgIEFkZERlZmF1bHRUMUNDKEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBUk06OnRSU0IpLCBMZFJlZykpCisgICAgICAgIC5hZGRSZWcoTGRSZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgICB9IGVsc2UKKyAgICAgIE1SSS5lbWl0TG9hZENvbnN0UG9vbChNQkIsIE1CQkksIGRsLCBMZFJlZywgMCwgTnVtQnl0ZXMpOworCisgICAgLy8gRW1pdCBhZGQgLyBzdWIuCisgICAgaW50IE9wYyA9IChpc1N1YikgPyBBUk06OnRTVUJyciA6IChpc0hpZ2ggPyBBUk06OnRBRERoaXJyIDogQVJNOjp0QUREcnIpOworICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0KKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChPcGMpLCBEZXN0UmVnKTsKKyAgICBpZiAoT3BjICE9IEFSTTo6dEFERGhpcnIpCisgICAgICBNSUIgPSBBZGREZWZhdWx0VDFDQyhNSUIpOworICAgIGlmIChEZXN0UmVnID09IEFSTTo6U1AgfHwgaXNTdWIpCisgICAgICBNSUIuYWRkUmVnKEJhc2VSZWcpLmFkZFJlZyhMZFJlZywgUmVnU3RhdGU6OktpbGwpOworICAgIGVsc2UKKyAgICAgIE1JQi5hZGRSZWcoTGRSZWcpLmFkZFJlZyhCYXNlUmVnLCBSZWdTdGF0ZTo6S2lsbCk7CisgICAgQWRkRGVmYXVsdFByZWQoTUlCKTsKK30KKworLy8vIGNhbGNOdW1NSSAtIFJldHVybnMgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgcmVxdWlyZWQgdG8gbWF0ZXJpYWxpemUKKy8vLyB0aGUgc3BlY2lmaWMgYWRkIC8gc3ViIHIsIGMgaW5zdHJ1Y3Rpb24uCitzdGF0aWMgdW5zaWduZWQgY2FsY051bU1JKGludCBPcGMsIGludCBFeHRyYU9wYywgdW5zaWduZWQgQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUJpdHMsIHVuc2lnbmVkIFNjYWxlKSB7CisgIHVuc2lnbmVkIE51bU1JcyA9IDA7CisgIHVuc2lnbmVkIENodW5rID0gKCgxIDw8IE51bUJpdHMpIC0gMSkgKiBTY2FsZTsKKworICBpZiAoT3BjID09IEFSTTo6dEFERHJTUGkpIHsKKyAgICB1bnNpZ25lZCBUaGlzVmFsID0gKEJ5dGVzID4gQ2h1bmspID8gQ2h1bmsgOiBCeXRlczsKKyAgICBCeXRlcyAtPSBUaGlzVmFsOworICAgIE51bU1JcysrOworICAgIE51bUJpdHMgPSA4OworICAgIFNjYWxlID0gMTsgIC8vIEZvbGxvd2VkIGJ5IGEgbnVtYmVyIG9mIHRBRERpOC4KKyAgICBDaHVuayA9ICgoMSA8PCBOdW1CaXRzKSAtIDEpICogU2NhbGU7CisgIH0KKworICBOdW1NSXMgKz0gQnl0ZXMgLyBDaHVuazsKKyAgaWYgKChCeXRlcyAlIENodW5rKSAhPSAwKQorICAgIE51bU1JcysrOworICBpZiAoRXh0cmFPcGMpCisgICAgTnVtTUlzKys7CisgIHJldHVybiBOdW1NSXM7Cit9CisKKy8vLyBlbWl0VGh1bWJSZWdQbHVzSW1tZWRpYXRlIC0gRW1pdHMgYSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zIHRvIG1hdGVyaWFsaXplCisvLy8gYSBkZXN0cmVnID0gYmFzZXJlZyArIGltbWVkaWF0ZSBpbiBUaHVtYiBjb2RlLgorc3RhdGljCit2b2lkIGVtaXRUaHVtYlJlZ1BsdXNJbW1lZGlhdGUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTnVtQnl0ZXMsIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRodW1iMVJlZ2lzdGVySW5mbyYgTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIGJvb2wgaXNTdWIgPSBOdW1CeXRlcyA8IDA7CisgIHVuc2lnbmVkIEJ5dGVzID0gKHVuc2lnbmVkKU51bUJ5dGVzOworICBpZiAoaXNTdWIpIEJ5dGVzID0gLU51bUJ5dGVzOworICBib29sIGlzTXVsNCA9IChCeXRlcyAmIDMpID09IDA7CisgIGJvb2wgaXNUd29BZGRyID0gZmFsc2U7CisgIGJvb2wgRHN0Tm90RXFCYXNlID0gZmFsc2U7CisgIHVuc2lnbmVkIE51bUJpdHMgPSAxOworICB1bnNpZ25lZCBTY2FsZSA9IDE7CisgIGludCBPcGMgPSAwOworICBpbnQgRXh0cmFPcGMgPSAwOworICBib29sIE5lZWRDQyA9IGZhbHNlOworICBib29sIE5lZWRQcmVkID0gZmFsc2U7CisKKyAgaWYgKERlc3RSZWcgPT0gQmFzZVJlZyAmJiBCYXNlUmVnID09IEFSTTo6U1ApIHsKKyAgICBhc3NlcnQoaXNNdWw0ICYmICJUaHVtYiBzcCBpbmMgLyBkZWMgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDQhIik7CisgICAgTnVtQml0cyA9IDc7CisgICAgU2NhbGUgPSA0OworICAgIE9wYyA9IGlzU3ViID8gQVJNOjp0U1VCc3BpIDogQVJNOjp0QUREc3BpOworICAgIGlzVHdvQWRkciA9IHRydWU7CisgIH0gZWxzZSBpZiAoIWlzU3ViICYmIEJhc2VSZWcgPT0gQVJNOjpTUCkgeworICAgIC8vIHIxID0gYWRkIHNwLCA0MDMKKyAgICAvLyA9PgorICAgIC8vIHIxID0gYWRkIHNwLCAxMDAgKiA0CisgICAgLy8gcjEgPSBhZGQgcjEsIDMKKyAgICBpZiAoIWlzTXVsNCkgeworICAgICAgQnl0ZXMgJj0gfjM7CisgICAgICBFeHRyYU9wYyA9IEFSTTo6dEFERGkzOworICAgIH0KKyAgICBOdW1CaXRzID0gODsKKyAgICBTY2FsZSA9IDQ7CisgICAgT3BjID0gQVJNOjp0QUREclNQaTsKKyAgfSBlbHNlIHsKKyAgICAvLyBzcCA9IHN1YiBzcCwgYworICAgIC8vIHIxID0gc3ViIHNwLCBjCisgICAgLy8gcjggPSBzdWIgc3AsIGMKKyAgICBpZiAoRGVzdFJlZyAhPSBCYXNlUmVnKQorICAgICAgRHN0Tm90RXFCYXNlID0gdHJ1ZTsKKyAgICBOdW1CaXRzID0gODsKKyAgICBpZiAoRGVzdFJlZyA9PSBBUk06OlNQKSB7CisgICAgICBPcGMgPSBpc1N1YiA/IEFSTTo6dFNVQnNwaSA6IEFSTTo6dEFERHNwaTsKKyAgICAgIGFzc2VydChpc011bDQgJiYgIlRodW1iIHNwIGluYyAvIGRlYyBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgNCEiKTsKKyAgICAgIE51bUJpdHMgPSA3OworICAgICAgU2NhbGUgPSA0OworICAgIH0gZWxzZSB7CisgICAgICBPcGMgPSBpc1N1YiA/IEFSTTo6dFNVQmk4IDogQVJNOjp0QUREaTg7CisgICAgICBOdW1CaXRzID0gODsKKyAgICAgIE5lZWRQcmVkID0gTmVlZENDID0gdHJ1ZTsKKyAgICB9CisgICAgaXNUd29BZGRyID0gdHJ1ZTsKKyAgfQorCisgIHVuc2lnbmVkIE51bU1JcyA9IGNhbGNOdW1NSShPcGMsIEV4dHJhT3BjLCBCeXRlcywgTnVtQml0cywgU2NhbGUpOworICB1bnNpZ25lZCBUaHJlc2hvbGQgPSAoRGVzdFJlZyA9PSBBUk06OlNQKSA/IDMgOiAyOworICBpZiAoTnVtTUlzID4gVGhyZXNob2xkKSB7CisgICAgLy8gVGhpcyB3aWxsIGV4cGFuZCBpbnRvIHRvbyBtYW55IGluc3RydWN0aW9ucy4gTG9hZCB0aGUgaW1tZWRpYXRlIGZyb20gYQorICAgIC8vIGNvbnN0cG9vbCBlbnRyeS4KKyAgICBlbWl0VGh1bWJSZWdQbHVzSW1tSW5SZWcoTUJCLCBNQkJJLCBEZXN0UmVnLCBCYXNlUmVnLCBOdW1CeXRlcywgdHJ1ZSwgVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUkksIGRsKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoRHN0Tm90RXFCYXNlKSB7CisgICAgaWYgKGlzQVJNTG93UmVnaXN0ZXIoRGVzdFJlZykgJiYgaXNBUk1Mb3dSZWdpc3RlcihCYXNlUmVnKSkgeworICAgICAgLy8gSWYgYm90aCBhcmUgbG93IHJlZ2lzdGVycywgZW1pdCBEZXN0UmVnID0gYWRkIEJhc2VSZWcsIG1heChJbW0sIDcpCisgICAgICB1bnNpZ25lZCBDaHVuayA9ICgxIDw8IDMpIC0gMTsKKyAgICAgIHVuc2lnbmVkIFRoaXNWYWwgPSAoQnl0ZXMgPiBDaHVuaykgPyBDaHVuayA6IEJ5dGVzOworICAgICAgQnl0ZXMgLT0gVGhpc1ZhbDsKKyAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gVElJLmdldChpc1N1YiA/IEFSTTo6dFNVQmkzIDogQVJNOjp0QUREaTMpOworICAgICAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPQorICAgICAgICBBZGREZWZhdWx0VDFDQyhCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJRCwgRGVzdFJlZykpOworICAgICAgQWRkRGVmYXVsdFByZWQoTUlCLmFkZFJlZyhCYXNlUmVnLCBSZWdTdGF0ZTo6S2lsbCkuYWRkSW1tKFRoaXNWYWwpKTsKKyAgICB9IGVsc2UgeworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dE1PVnIpLCBEZXN0UmVnKQorICAgICAgICAuYWRkUmVnKEJhc2VSZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgICB9CisgICAgQmFzZVJlZyA9IERlc3RSZWc7CisgIH0KKworICB1bnNpZ25lZCBDaHVuayA9ICgoMSA8PCBOdW1CaXRzKSAtIDEpICogU2NhbGU7CisgIHdoaWxlIChCeXRlcykgeworICAgIHVuc2lnbmVkIFRoaXNWYWwgPSAoQnl0ZXMgPiBDaHVuaykgPyBDaHVuayA6IEJ5dGVzOworICAgIEJ5dGVzIC09IFRoaXNWYWw7CisgICAgVGhpc1ZhbCAvPSBTY2FsZTsKKyAgICAvLyBCdWlsZCB0aGUgbmV3IHRBREQgLyB0U1VCLgorICAgIGlmIChpc1R3b0FkZHIpIHsKKyAgICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KE9wYyksIERlc3RSZWcpOworICAgICAgaWYgKE5lZWRDQykKKyAgICAgICAgTUlCID0gQWRkRGVmYXVsdFQxQ0MoTUlCKTsKKyAgICAgIE1JQiAuYWRkUmVnKERlc3RSZWcpLmFkZEltbShUaGlzVmFsKTsKKyAgICAgIGlmIChOZWVkUHJlZCkKKyAgICAgICAgTUlCID0gQWRkRGVmYXVsdFByZWQoTUlCKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBib29sIGlzS2lsbCA9IEJhc2VSZWcgIT0gQVJNOjpTUDsKKyAgICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KE9wYyksIERlc3RSZWcpOworICAgICAgaWYgKE5lZWRDQykKKyAgICAgICAgTUlCID0gQWRkRGVmYXVsdFQxQ0MoTUlCKTsKKyAgICAgIE1JQi5hZGRSZWcoQmFzZVJlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpLmFkZEltbShUaGlzVmFsKTsKKyAgICAgIGlmIChOZWVkUHJlZCkKKyAgICAgICAgTUlCID0gQWRkRGVmYXVsdFByZWQoTUlCKTsKKyAgICAgIEJhc2VSZWcgPSBEZXN0UmVnOworCisgICAgICBpZiAoT3BjID09IEFSTTo6dEFERHJTUGkpIHsKKyAgICAgICAgLy8gcjQgPSBhZGQgc3AsIGltbQorICAgICAgICAvLyByNCA9IGFkZCByNCwgaW1tCisgICAgICAgIC8vIC4uLgorICAgICAgICBOdW1CaXRzID0gODsKKyAgICAgICAgU2NhbGUgPSAxOworICAgICAgICBDaHVuayA9ICgoMSA8PCBOdW1CaXRzKSAtIDEpICogU2NhbGU7CisgICAgICAgIE9wYyA9IGlzU3ViID8gQVJNOjp0U1VCaTggOiBBUk06OnRBRERpODsKKyAgICAgICAgTmVlZFByZWQgPSBOZWVkQ0MgPSBpc1R3b0FkZHIgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChFeHRyYU9wYykgeworICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gVElJLmdldChFeHRyYU9wYyk7CisgICAgQWRkRGVmYXVsdFByZWQoQWRkRGVmYXVsdFQxQ0MoQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUQsIERlc3RSZWcpKQorICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoRGVzdFJlZywgUmVnU3RhdGU6OktpbGwpCisgICAgICAgICAgICAgICAgICAgLmFkZEltbSgoKHVuc2lnbmVkKU51bUJ5dGVzKSAmIDMpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBlbWl0U1BVcGRhdGUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUksIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRodW1iMVJlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBOdW1CeXRlcykgeworICBlbWl0VGh1bWJSZWdQbHVzSW1tZWRpYXRlKE1CQiwgTUJCSSwgQVJNOjpTUCwgQVJNOjpTUCwgTnVtQnl0ZXMsIFRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUkksIGRsKTsKK30KKwordm9pZCBUaHVtYjFSZWdpc3RlckluZm86OgorZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdCB7CisgIGlmICghaGFzUmVzZXJ2ZWRDYWxsRnJhbWUoTUYpKSB7CisgICAgLy8gSWYgd2UgaGF2ZSBhbGxvY2EsIGNvbnZlcnQgYXMgZm9sbG93czoKKyAgICAvLyBBREpDQUxMU1RBQ0tET1dOIC0+IHN1Yiwgc3AsIHNwLCBhbW91bnQKKyAgICAvLyBBREpDQUxMU1RBQ0tVUCAgIC0+IGFkZCwgc3AsIHNwLCBhbW91bnQKKyAgICBNYWNoaW5lSW5zdHIgKk9sZCA9IEk7CisgICAgRGVidWdMb2MgZGwgPSBPbGQtPmdldERlYnVnTG9jKCk7CisgICAgdW5zaWduZWQgQW1vdW50ID0gT2xkLT5nZXRPcGVyYW5kKDApLmdldEltbSgpOworICAgIGlmIChBbW91bnQgIT0gMCkgeworICAgICAgLy8gV2UgbmVlZCB0byBrZWVwIHRoZSBzdGFjayBhbGlnbmVkIHByb3Blcmx5LiAgVG8gZG8gdGhpcywgd2Ugcm91bmQgdGhlCisgICAgICAvLyBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGZvciB0aGUgb3V0Z29pbmcgYXJndW1lbnRzIHVwIHRvIHRoZSBuZXh0CisgICAgICAvLyBhbGlnbm1lbnQgYm91bmRhcnkuCisgICAgICB1bnNpZ25lZCBBbGlnbiA9IE1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja0FsaWdubWVudCgpOworICAgICAgQW1vdW50ID0gKEFtb3VudCtBbGlnbi0xKS9BbGlnbipBbGlnbjsKKworICAgICAgLy8gUmVwbGFjZSB0aGUgcHNldWRvIGluc3RydWN0aW9uIHdpdGggYSBuZXcgaW5zdHJ1Y3Rpb24uLi4KKyAgICAgIHVuc2lnbmVkIE9wYyA9IE9sZC0+Z2V0T3Bjb2RlKCk7CisgICAgICBpZiAoT3BjID09IEFSTTo6QURKQ0FMTFNUQUNLRE9XTiB8fCBPcGMgPT0gQVJNOjp0QURKQ0FMTFNUQUNLRE9XTikgeworICAgICAgICBlbWl0U1BVcGRhdGUoTUJCLCBJLCBUSUksIGRsLCAqdGhpcywgLUFtb3VudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoT3BjID09IEFSTTo6QURKQ0FMTFNUQUNLVVAgfHwgT3BjID09IEFSTTo6dEFESkNBTExTVEFDS1VQKTsKKyAgICAgICAgZW1pdFNQVXBkYXRlKE1CQiwgSSwgVElJLCBkbCwgKnRoaXMsIEFtb3VudCk7CisgICAgICB9CisgICAgfQorICB9CisgIE1CQi5lcmFzZShJKTsKK30KKworLy8vIGVtaXRUaHVtYkNvbnN0YW50IC0gRW1pdCBhIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMgdG8gbWF0ZXJpYWxpemUgYQorLy8vIGNvbnN0YW50Lgorc3RhdGljIHZvaWQgZW1pdFRodW1iQ29uc3RhbnQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRodW1iMVJlZ2lzdGVySW5mbyYgTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgYm9vbCBpc1N1YiA9IEltbSA8IDA7CisgIGlmIChpc1N1YikgSW1tID0gLUltbTsKKworICBpbnQgQ2h1bmsgPSAoMSA8PCA4KSAtIDE7CisgIGludCBUaGlzVmFsID0gKEltbSA+IENodW5rKSA/IENodW5rIDogSW1tOworICBJbW0gLT0gVGhpc1ZhbDsKKyAgQWRkRGVmYXVsdFByZWQoQWRkRGVmYXVsdFQxQ0MoQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dE1PVmk4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0UmVnKSkKKyAgICAgICAgICAgICAgICAgLmFkZEltbShUaGlzVmFsKSk7CisgIGlmIChJbW0gPiAwKQorICAgIGVtaXRUaHVtYlJlZ1BsdXNJbW1lZGlhdGUoTUJCLCBNQkJJLCBEZXN0UmVnLCBEZXN0UmVnLCBJbW0sIFRJSSwgTVJJLCBkbCk7CisgIGlmIChpc1N1YikgeworICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gVElJLmdldChBUk06OnRSU0IpOworICAgIEFkZERlZmF1bHRQcmVkKEFkZERlZmF1bHRUMUNDKEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElELCBEZXN0UmVnKSkKKyAgICAgICAgICAgICAgICAgICAuYWRkUmVnKERlc3RSZWcsIFJlZ1N0YXRlOjpLaWxsKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlT3BlcmFuZHMoTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgaSkgeworICB1bnNpZ25lZCBPcCA9IGk7CisgIGZvciAodW5zaWduZWQgZSA9IE1JLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgIE1JLlJlbW92ZU9wZXJhbmQoT3ApOworfQorCitpbnQgVGh1bWIxUmVnaXN0ZXJJbmZvOjoKK3Jld3JpdGVGcmFtZUluZGV4KE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIEZyYW1lUmVnSWR4LAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRnJhbWVSZWcsIGludCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNT1ZPcGMsIHVuc2lnbmVkIEFERHJpT3BjLCB1bnNpZ25lZCBTVUJyaU9wYykgY29uc3QKK3sKKyAgLy8gaWYvd2hlbiBlbGltaW5hdGVGcmFtZUluZGV4KCkgY29uZm9ybXMgd2l0aCBBUk1CYXNlUmVnaXN0ZXJJbmZvCisgIC8vIHZlcnNpb24gdGhlbiBjYW4gcHVsbCBvdXQgVGh1bWIxIHNwZWNpZmljIHBhcnRzIGhlcmUKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBzYXZlU2NhdmVuZ2VyUmVnaXN0ZXIgLSBTcGlsbCB0aGUgcmVnaXN0ZXIgc28gaXQgY2FuIGJlIHVzZWQgYnkgdGhlCisvLy8gcmVnaXN0ZXIgc2NhdmVuZ2VyLiBSZXR1cm4gdHJ1ZS4KK2Jvb2wKK1RodW1iMVJlZ2lzdGVySW5mbzo6c2F2ZVNjYXZlbmdlclJlZ2lzdGVyKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmVXNlTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZykgY29uc3QgeworICAvLyBUaHVtYjEgY2FuJ3QgdXNlIHRoZSBlbWVyZ2VuY3kgc3BpbGwgc2xvdCBvbiB0aGUgc3RhY2sgYmVjYXVzZQorICAvLyBsZHIvc3RyIGltbWVkaWF0ZSBvZmZzZXRzIG11c3QgYmUgcG9zaXRpdmUsIGFuZCBpZiB3ZSdyZSByZWZlcmVuY2luZworICAvLyBvZmYgdGhlIGZyYW1lIHBvaW50ZXIgKGlmLCBmb3IgZXhhbXBsZSwgdGhlcmUgYXJlIGFsbG9jYSgpIGNhbGxzIGluCisgIC8vIHRoZSBmdW5jdGlvbiwgdGhlIG9mZnNldCB3aWxsIGJlIG5lZ2F0aXZlLiBVc2UgUjEyIGluc3RlYWQgc2luY2UgdGhhdCdzCisgIC8vIGEgY2FsbCBjbG9iYmVyZWQgcmVnaXN0ZXIgdGhhdCB3ZSBrbm93IHdvbid0IGJlIHVzZWQgaW4gVGh1bWIxIG1vZGUuCisgIERlYnVnTG9jIERMOworICBCdWlsZE1JKE1CQiwgSSwgREwsIFRJSS5nZXQoQVJNOjp0TU9WdGdwcjJncHIpKS4KKyAgICBhZGRSZWcoQVJNOjpSMTIsIFJlZ1N0YXRlOjpEZWZpbmUpLmFkZFJlZyhSZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKworICAvLyBUaGUgVXNlTUkgaXMgd2hlcmUgd2Ugd291bGQgbGlrZSB0byByZXN0b3JlIHRoZSByZWdpc3Rlci4gSWYgdGhlcmUncworICAvLyBpbnRlcmZlcmVuY2Ugd2l0aCBSMTIgYmVmb3JlIHRoZW4sIGhvd2V2ZXIsIHdlJ2xsIG5lZWQgdG8gcmVzdG9yZSBpdAorICAvLyBiZWZvcmUgdGhhdCBpbnN0ZWFkIGFuZCBhZGp1c3QgdGhlIFVzZU1JLgorICBib29sIGRvbmUgPSBmYWxzZTsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUkgPSBJOyAhZG9uZSAmJiBJSSAhPSBVc2VNSSA7ICsrSUkpIHsKKyAgICBpZiAoSUktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisgICAgLy8gSWYgdGhpcyBpbnN0cnVjdGlvbiBhZmZlY3RzIFIxMiwgYWRqdXN0IG91ciByZXN0b3JlIHBvaW50LgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IElJLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmlzVW5kZWYoKSB8fCAhTU8uZ2V0UmVnKCkgfHwKKyAgICAgICAgICBUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKE1PLmdldFJlZygpKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoTU8uZ2V0UmVnKCkgPT0gQVJNOjpSMTIpIHsKKyAgICAgICAgVXNlTUkgPSBJSTsKKyAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBSZXN0b3JlIHRoZSByZWdpc3RlciBmcm9tIFIxMgorICBCdWlsZE1JKE1CQiwgVXNlTUksIERMLCBUSUkuZ2V0KEFSTTo6dE1PVmdwcjJ0Z3ByKSkuCisgICAgYWRkUmVnKFJlZywgUmVnU3RhdGU6OkRlZmluZSkuYWRkUmVnKEFSTTo6UjEyLCBSZWdTdGF0ZTo6S2lsbCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3Vuc2lnbmVkCitUaHVtYjFSZWdpc3RlckluZm86OmVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUEFkaiwgRnJhbWVJbmRleFZhbHVlICpWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTKSBjb25zdHsKKyAgdW5zaWduZWQgVlJlZyA9IDA7CisgIHVuc2lnbmVkIGkgPSAwOworICBNYWNoaW5lSW5zdHIgJk1JID0gKklJOworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1JLmdldFBhcmVudCgpOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgRGVidWdMb2MgZGwgPSBNSS5nZXREZWJ1Z0xvYygpOworCisgIHdoaWxlICghTUkuZ2V0T3BlcmFuZChpKS5pc0ZJKCkpIHsKKyAgICArK2k7CisgICAgYXNzZXJ0KGkgPCBNSS5nZXROdW1PcGVyYW5kcygpICYmICJJbnN0ciBkb2Vzbid0IGhhdmUgRnJhbWVJbmRleCBvcGVyYW5kISIpOworICB9CisKKyAgdW5zaWduZWQgRnJhbWVSZWcgPSBBUk06OlNQOworICBpbnQgRnJhbWVJbmRleCA9IE1JLmdldE9wZXJhbmQoaSkuZ2V0SW5kZXgoKTsKKyAgaW50IE9mZnNldCA9IE1GLmdldEZyYW1lSW5mbygpLT5nZXRPYmplY3RPZmZzZXQoRnJhbWVJbmRleCkgKworICAgICAgICAgICAgICAgTUYuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrU2l6ZSgpICsgU1BBZGo7CisKKyAgaWYgKEFGSS0+aXNHUFJDYWxsZWVTYXZlZEFyZWExRnJhbWUoRnJhbWVJbmRleCkpCisgICAgT2Zmc2V0IC09IEFGSS0+Z2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMU9mZnNldCgpOworICBlbHNlIGlmIChBRkktPmlzR1BSQ2FsbGVlU2F2ZWRBcmVhMkZyYW1lKEZyYW1lSW5kZXgpKQorICAgIE9mZnNldCAtPSBBRkktPmdldEdQUkNhbGxlZVNhdmVkQXJlYTJPZmZzZXQoKTsKKyAgZWxzZSBpZiAoTUYuZ2V0RnJhbWVJbmZvKCktPmhhc1ZhclNpemVkT2JqZWN0cygpKSB7CisgICAgYXNzZXJ0KFNQQWRqID09IDAgJiYgaGFzRlAoTUYpICYmICJVbmV4cGVjdGVkIik7CisgICAgLy8gVGhlcmUgYXJlIGFsbG9jYSgpJ3MgaW4gdGhpcyBmdW5jdGlvbiwgbXVzdCByZWZlcmVuY2Ugb2ZmIHRoZSBmcmFtZQorICAgIC8vIHBvaW50ZXIgaW5zdGVhZC4KKyAgICBGcmFtZVJlZyA9IGdldEZyYW1lUmVnaXN0ZXIoTUYpOworICAgIE9mZnNldCAtPSBBRkktPmdldEZyYW1lUHRyU3BpbGxPZmZzZXQoKTsKKyAgfQorCisgIC8vIFNwZWNpYWwgaGFuZGxpbmcgb2YgZGJnX3ZhbHVlIGluc3RydWN0aW9ucy4KKyAgaWYgKE1JLmlzRGVidWdWYWx1ZSgpKSB7CisgICAgTUkuZ2V0T3BlcmFuZChpKS4gIENoYW5nZVRvUmVnaXN0ZXIoRnJhbWVSZWcsIGZhbHNlIC8qaXNEZWYqLyk7CisgICAgTUkuZ2V0T3BlcmFuZChpKzEpLkNoYW5nZVRvSW1tZWRpYXRlKE9mZnNldCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1bnNpZ25lZCBPcGNvZGUgPSBNSS5nZXRPcGNvZGUoKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZEZXNjID0gTUkuZ2V0RGVzYygpOworICB1bnNpZ25lZCBBZGRyTW9kZSA9IChEZXNjLlRTRmxhZ3MgJiBBUk1JSTo6QWRkck1vZGVNYXNrKTsKKworICBpZiAoT3Bjb2RlID09IEFSTTo6dEFERHJTUGkpIHsKKyAgICBPZmZzZXQgKz0gTUkuZ2V0T3BlcmFuZChpKzEpLmdldEltbSgpOworCisgICAgLy8gQ2FuJ3QgdXNlIHRBRERyU1BpIGlmIGl0J3MgYmFzZWQgb2ZmIHRoZSBmcmFtZSBwb2ludGVyLgorICAgIHVuc2lnbmVkIE51bUJpdHMgPSAwOworICAgIHVuc2lnbmVkIFNjYWxlID0gMTsKKyAgICBpZiAoRnJhbWVSZWcgIT0gQVJNOjpTUCkgeworICAgICAgT3Bjb2RlID0gQVJNOjp0QUREaTM7CisgICAgICBNSS5zZXREZXNjKFRJSS5nZXQoT3Bjb2RlKSk7CisgICAgICBOdW1CaXRzID0gMzsKKyAgICB9IGVsc2UgeworICAgICAgTnVtQml0cyA9IDg7CisgICAgICBTY2FsZSA9IDQ7CisgICAgICBhc3NlcnQoKE9mZnNldCAmIDMpID09IDAgJiYKKyAgICAgICAgICAgICAiVGh1bWIgYWRkL3N1YiBzcCwgI2ltbSBpbW1lZGlhdGUgbXVzdCBiZSBtdWx0aXBsZSBvZiA0ISIpOworICAgIH0KKworICAgIHVuc2lnbmVkIFByZWRSZWc7CisgICAgaWYgKE9mZnNldCA9PSAwICYmIGdldEluc3RyUHJlZGljYXRlKCZNSSwgUHJlZFJlZykgPT0gQVJNQ0M6OkFMKSB7CisgICAgICAvLyBUdXJuIGl0IGludG8gYSBtb3ZlLgorICAgICAgTUkuc2V0RGVzYyhUSUkuZ2V0KEFSTTo6dE1PVmdwcjJ0Z3ByKSk7CisgICAgICBNSS5nZXRPcGVyYW5kKGkpLkNoYW5nZVRvUmVnaXN0ZXIoRnJhbWVSZWcsIGZhbHNlKTsKKyAgICAgIC8vIFJlbW92ZSBvZmZzZXQgYW5kIHJlbWFpbmluZyBleHBsaWNpdCBwcmVkaWNhdGUgb3BlcmFuZHMuCisgICAgICBkbyBNSS5SZW1vdmVPcGVyYW5kKGkrMSk7CisgICAgICB3aGlsZSAoTUkuZ2V0TnVtT3BlcmFuZHMoKSA+IGkrMSAmJgorICAgICAgICAgICAgICghTUkuZ2V0T3BlcmFuZChpKzEpLmlzUmVnKCkgfHwgIU1JLmdldE9wZXJhbmQoaSsxKS5pc0ltbSgpKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBDb21tb24gY2FzZTogc21hbGwgb2Zmc2V0LCBmaXRzIGludG8gaW5zdHJ1Y3Rpb24uCisgICAgdW5zaWduZWQgTWFzayA9ICgxIDw8IE51bUJpdHMpIC0gMTsKKyAgICBpZiAoKChPZmZzZXQgLyBTY2FsZSkgJiB+TWFzaykgPT0gMCkgeworICAgICAgLy8gUmVwbGFjZSB0aGUgRnJhbWVJbmRleCB3aXRoIHNwIC8gZnAKKyAgICAgIGlmIChPcGNvZGUgPT0gQVJNOjp0QUREaTMpIHsKKyAgICAgICAgcmVtb3ZlT3BlcmFuZHMoTUksIGkpOworICAgICAgICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQigmTUkpOworICAgICAgICBBZGREZWZhdWx0UHJlZChBZGREZWZhdWx0VDFDQyhNSUIpLmFkZFJlZyhGcmFtZVJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgLmFkZEltbShPZmZzZXQgLyBTY2FsZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTUkuZ2V0T3BlcmFuZChpKS5DaGFuZ2VUb1JlZ2lzdGVyKEZyYW1lUmVnLCBmYWxzZSk7CisgICAgICAgIE1JLmdldE9wZXJhbmQoaSsxKS5DaGFuZ2VUb0ltbWVkaWF0ZShPZmZzZXQgLyBTY2FsZSk7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBEZXN0UmVnID0gTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBCeXRlcyA9IChPZmZzZXQgPiAwKSA/IE9mZnNldCA6IC1PZmZzZXQ7CisgICAgdW5zaWduZWQgTnVtTUlzID0gY2FsY051bU1JKE9wY29kZSwgMCwgQnl0ZXMsIE51bUJpdHMsIFNjYWxlKTsKKyAgICAvLyBNSSB3b3VsZCBleHBhbmQgaW50byBhIGxhcmdlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuIERvbid0IHRyeSB0bworICAgIC8vIHNpbXBsaWZ5IHRoZSBpbW1lZGlhdGUuCisgICAgaWYgKE51bU1JcyA+IDIpIHsKKyAgICAgIGVtaXRUaHVtYlJlZ1BsdXNJbW1lZGlhdGUoTUJCLCBJSSwgRGVzdFJlZywgRnJhbWVSZWcsIE9mZnNldCwgVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhpcywgZGwpOworICAgICAgTUJCLmVyYXNlKElJKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChPZmZzZXQgPiAwKSB7CisgICAgICAvLyBUcmFuc2xhdGUgcjAgPSBhZGQgc3AsIGltbSB0bworICAgICAgLy8gcjAgPSBhZGQgc3AsIDI1NSo0CisgICAgICAvLyByMCA9IGFkZCByMCwgKGltbSAtIDI1NSo0KQorICAgICAgaWYgKE9wY29kZSA9PSBBUk06OnRBRERpMykgeworICAgICAgICByZW1vdmVPcGVyYW5kcyhNSSwgaSk7CisgICAgICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCKCZNSSk7CisgICAgICAgIEFkZERlZmF1bHRQcmVkKEFkZERlZmF1bHRUMUNDKE1JQikuYWRkUmVnKEZyYW1lUmVnKS5hZGRJbW0oTWFzaykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTUkuZ2V0T3BlcmFuZChpKS5DaGFuZ2VUb1JlZ2lzdGVyKEZyYW1lUmVnLCBmYWxzZSk7CisgICAgICAgIE1JLmdldE9wZXJhbmQoaSsxKS5DaGFuZ2VUb0ltbWVkaWF0ZShNYXNrKTsKKyAgICAgIH0KKyAgICAgIE9mZnNldCA9IChPZmZzZXQgLSBNYXNrICogU2NhbGUpOworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE5JSSA9IGxsdm06Om5leHQoSUkpOworICAgICAgZW1pdFRodW1iUmVnUGx1c0ltbWVkaWF0ZShNQkIsIE5JSSwgRGVzdFJlZywgRGVzdFJlZywgT2Zmc2V0LCBUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aGlzLCBkbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRyYW5zbGF0ZSByMCA9IGFkZCBzcCwgLWltbSB0bworICAgICAgLy8gcjAgPSAtaW1tICh0aGlzIGlzIHRoZW4gdHJhbnNsYXRlZCBpbnRvIGEgc2VyaWVzIG9mIGluc3RydWN0b25zKQorICAgICAgLy8gcjAgPSBhZGQgcjAsIHNwCisgICAgICBlbWl0VGh1bWJDb25zdGFudChNQkIsIElJLCBEZXN0UmVnLCBPZmZzZXQsIFRJSSwgKnRoaXMsIGRsKTsKKworICAgICAgTUkuc2V0RGVzYyhUSUkuZ2V0KEFSTTo6dEFERGhpcnIpKTsKKyAgICAgIE1JLmdldE9wZXJhbmQoaSkuQ2hhbmdlVG9SZWdpc3RlcihEZXN0UmVnLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgTUkuZ2V0T3BlcmFuZChpKzEpLkNoYW5nZVRvUmVnaXN0ZXIoRnJhbWVSZWcsIGZhbHNlKTsKKyAgICAgIGlmIChPcGNvZGUgPT0gQVJNOjp0QUREaTMpIHsKKyAgICAgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIoJk1JKTsKKyAgICAgICAgQWRkRGVmYXVsdFByZWQoTUlCKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgdW5zaWduZWQgSW1tSWR4ID0gMDsKKyAgICBpbnQgSW5zdHJPZmZzID0gMDsKKyAgICB1bnNpZ25lZCBOdW1CaXRzID0gMDsKKyAgICB1bnNpZ25lZCBTY2FsZSA9IDE7CisgICAgc3dpdGNoIChBZGRyTW9kZSkgeworICAgIGNhc2UgQVJNSUk6OkFkZHJNb2RlVDFfczogeworICAgICAgSW1tSWR4ID0gaSsxOworICAgICAgSW5zdHJPZmZzID0gTUkuZ2V0T3BlcmFuZChJbW1JZHgpLmdldEltbSgpOworICAgICAgTnVtQml0cyA9IChGcmFtZVJlZyA9PSBBUk06OlNQKSA/IDggOiA1OworICAgICAgU2NhbGUgPSA0OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBhZGRyZXNzaW5nIG1vZGUhIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBPZmZzZXQgKz0gSW5zdHJPZmZzICogU2NhbGU7CisgICAgYXNzZXJ0KChPZmZzZXQgJiAoU2NhbGUtMSkpID09IDAgJiYgIkNhbid0IGVuY29kZSB0aGlzIG9mZnNldCEiKTsKKworICAgIC8vIENvbW1vbiBjYXNlOiBzbWFsbCBvZmZzZXQsIGZpdHMgaW50byBpbnN0cnVjdGlvbi4KKyAgICBNYWNoaW5lT3BlcmFuZCAmSW1tT3AgPSBNSS5nZXRPcGVyYW5kKEltbUlkeCk7CisgICAgaW50IEltbWVkT2Zmc2V0ID0gT2Zmc2V0IC8gU2NhbGU7CisgICAgdW5zaWduZWQgTWFzayA9ICgxIDw8IE51bUJpdHMpIC0gMTsKKyAgICBpZiAoKHVuc2lnbmVkKU9mZnNldCA8PSBNYXNrICogU2NhbGUpIHsKKyAgICAgIC8vIFJlcGxhY2UgdGhlIEZyYW1lSW5kZXggd2l0aCBzcAorICAgICAgTUkuZ2V0T3BlcmFuZChpKS5DaGFuZ2VUb1JlZ2lzdGVyKEZyYW1lUmVnLCBmYWxzZSk7CisgICAgICBJbW1PcC5DaGFuZ2VUb0ltbWVkaWF0ZShJbW1lZE9mZnNldCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBib29sIGlzVGh1bVNwaWxsUmVzdG9yZSA9IE9wY29kZSA9PSBBUk06OnRSZXN0b3JlIHx8IE9wY29kZSA9PSBBUk06OnRTcGlsbDsKKyAgICBpZiAoQWRkck1vZGUgPT0gQVJNSUk6OkFkZHJNb2RlVDFfcykgeworICAgICAgLy8gVGh1bWIgdExEUnNwaSwgdFNUUnNwaS4gVGhlc2Ugd2lsbCBjaGFuZ2UgdG8gaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlCisgICAgICAvLyBhIGRpZmZlcmVudCBiYXNlIHJlZ2lzdGVyLgorICAgICAgTnVtQml0cyA9IDU7CisgICAgICBNYXNrID0gKDEgPDwgTnVtQml0cykgLSAxOworICAgIH0KKyAgICAvLyBJZiB0aGlzIGlzIGEgdGh1bWIgc3BpbGwgLyByZXN0b3JlLCB3ZSB3aWxsIGJlIHVzaW5nIGEgY29uc3Rwb29sIGxvYWQgdG8KKyAgICAvLyBtYXRlcmlhbGl6ZSB0aGUgb2Zmc2V0LgorICAgIGlmIChBZGRyTW9kZSA9PSBBUk1JSTo6QWRkck1vZGVUMV9zICYmIGlzVGh1bVNwaWxsUmVzdG9yZSkKKyAgICAgIEltbU9wLkNoYW5nZVRvSW1tZWRpYXRlKDApOworICAgIGVsc2UgeworICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBkaWRuJ3QgZml0LiBQdWxsIGluIHdoYXQgd2UgY2FuIHRvIHNpbXBsaWZ5IHRoZSBpbW1lZC4KKyAgICAgIEltbWVkT2Zmc2V0ID0gSW1tZWRPZmZzZXQgJiBNYXNrOworICAgICAgSW1tT3AuQ2hhbmdlVG9JbW1lZGlhdGUoSW1tZWRPZmZzZXQpOworICAgICAgT2Zmc2V0ICY9IH4oTWFzaypTY2FsZSk7CisgICAgfQorICB9CisKKyAgLy8gSWYgd2UgZ2V0IGhlcmUsIHRoZSBpbW1lZGlhdGUgZG9lc24ndCBmaXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICBXZSBmb2xkZWQKKyAgLy8gYXMgbXVjaCBhcyBwb3NzaWJsZSBhYm92ZSwgaGFuZGxlIHRoZSByZXN0LCBwcm92aWRpbmcgYSByZWdpc3RlciB0aGF0IGlzCisgIC8vIFNQK0xhcmdlSW1tLgorICBhc3NlcnQoT2Zmc2V0ICYmICJUaGlzIGNvZGUgaXNuJ3QgbmVlZGVkIGlmIG9mZnNldCBhbHJlYWR5IGhhbmRsZWQhIik7CisKKyAgLy8gUmVtb3ZlIHByZWRpY2F0ZSBmaXJzdC4KKyAgaW50IFBJZHggPSBNSS5maW5kRmlyc3RQcmVkT3BlcmFuZElkeCgpOworICBpZiAoUElkeCAhPSAtMSkKKyAgICByZW1vdmVPcGVyYW5kcyhNSSwgUElkeCk7CisKKyAgaWYgKERlc2MubWF5TG9hZCgpKSB7CisgICAgLy8gVXNlIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciB0byBtYXRlcmlhbGl6ZSBzcCArIG9mZnNldC4KKyAgICB1bnNpZ25lZCBUbXBSZWcgPSBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIGJvb2wgVXNlUlIgPSBmYWxzZTsKKyAgICBpZiAoT3Bjb2RlID09IEFSTTo6dFJlc3RvcmUpIHsKKyAgICAgIGlmIChGcmFtZVJlZyA9PSBBUk06OlNQKQorICAgICAgICBlbWl0VGh1bWJSZWdQbHVzSW1tSW5SZWcoTUJCLCBJSSwgVG1wUmVnLCBGcmFtZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwgZmFsc2UsIFRJSSwgKnRoaXMsIGRsKTsKKyAgICAgIGVsc2UgeworICAgICAgICBlbWl0TG9hZENvbnN0UG9vbChNQkIsIElJLCBkbCwgVG1wUmVnLCAwLCBPZmZzZXQpOworICAgICAgICBVc2VSUiA9IHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGVtaXRUaHVtYlJlZ1BsdXNJbW1lZGlhdGUoTUJCLCBJSSwgVG1wUmVnLCBGcmFtZVJlZywgT2Zmc2V0LCBUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aGlzLCBkbCk7CisgICAgfQorCisgICAgTUkuc2V0RGVzYyhUSUkuZ2V0KEFSTTo6dExEUikpOworICAgIE1JLmdldE9wZXJhbmQoaSkuQ2hhbmdlVG9SZWdpc3RlcihUbXBSZWcsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgaWYgKFVzZVJSKQorICAgICAgLy8gVXNlIFtyZWcsIHJlZ10gYWRkcm1vZGUuCisgICAgICBNSS5hZGRPcGVyYW5kKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWcoRnJhbWVSZWcsIGZhbHNlKSk7CisgICAgZWxzZSAgLy8gdExEUiBoYXMgYW4gZXh0cmEgcmVnaXN0ZXIgb3BlcmFuZC4KKyAgICAgIE1JLmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZygwLCBmYWxzZSkpOworICB9IGVsc2UgaWYgKERlc2MubWF5U3RvcmUoKSkgeworICAgICAgVlJlZyA9IE1GLmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoQVJNOjp0R1BSUmVnaXN0ZXJDbGFzcyk7CisgICAgICBhc3NlcnQgKFZhbHVlICYmICJGcmFtZSBpbmRleCB2aXJ0dWFsIGFsbG9jYXRlZCwgYnV0IFZhbHVlIGFyZyBpcyBOVUxMISIpOworICAgICAgYm9vbCBVc2VSUiA9IGZhbHNlOworICAgICAgYm9vbCBUcmFja1ZSZWcgPSB0cnVlOworICAgICAgVmFsdWUtPmZpcnN0ID0gRnJhbWVSZWc7IC8vIHVzZSB0aGUgZnJhbWUgcmVnaXN0ZXIgYXMgYSBraW5kIGluZGljYXRvcgorICAgICAgVmFsdWUtPnNlY29uZCA9IE9mZnNldDsKKworICAgICAgaWYgKE9wY29kZSA9PSBBUk06OnRTcGlsbCkgeworICAgICAgICBpZiAoRnJhbWVSZWcgPT0gQVJNOjpTUCkKKyAgICAgICAgICBlbWl0VGh1bWJSZWdQbHVzSW1tSW5SZWcoTUJCLCBJSSwgVlJlZywgRnJhbWVSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwgZmFsc2UsIFRJSSwgKnRoaXMsIGRsKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZW1pdExvYWRDb25zdFBvb2woTUJCLCBJSSwgZGwsIFZSZWcsIDAsIE9mZnNldCk7CisgICAgICAgICAgVXNlUlIgPSB0cnVlOworICAgICAgICAgIFRyYWNrVlJlZyA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9IGVsc2UKKyAgICAgICAgZW1pdFRodW1iUmVnUGx1c0ltbWVkaWF0ZShNQkIsIElJLCBWUmVnLCBGcmFtZVJlZywgT2Zmc2V0LCBUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRoaXMsIGRsKTsKKyAgICAgIE1JLnNldERlc2MoVElJLmdldChBUk06OnRTVFIpKTsKKyAgICAgIE1JLmdldE9wZXJhbmQoaSkuQ2hhbmdlVG9SZWdpc3RlcihWUmVnLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgaWYgKFVzZVJSKSAgLy8gVXNlIFtyZWcsIHJlZ10gYWRkcm1vZGUuCisgICAgICAgIE1JLmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhGcmFtZVJlZywgZmFsc2UpKTsKKyAgICAgIGVsc2UgLy8gdFNUUiBoYXMgYW4gZXh0cmEgcmVnaXN0ZXIgb3BlcmFuZC4KKyAgICAgICAgTUkuYWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKDAsIGZhbHNlKSk7CisgICAgICBpZiAoIVJldXNlRnJhbWVJbmRleFZhbHMgfHwgIVRyYWNrVlJlZykKKyAgICAgICAgVlJlZyA9IDA7CisgIH0gZWxzZQorICAgIGFzc2VydChmYWxzZSAmJiAiVW5leHBlY3RlZCBvcGNvZGUhIik7CisKKyAgLy8gQWRkIHByZWRpY2F0ZSBiYWNrIGlmIGl0J3MgbmVlZGVkLgorICBpZiAoTUkuZ2V0RGVzYygpLmlzUHJlZGljYWJsZSgpKSB7CisgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIoJk1JKTsKKyAgICBBZGREZWZhdWx0UHJlZChNSUIpOworICB9CisgIHJldHVybiBWUmVnOworfQorCit2b2lkIFRodW1iMVJlZ2lzdGVySW5mbzo6ZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9IE1GLmZyb250KCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gTUJCLmJlZ2luKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgQVJNRnVuY3Rpb25JbmZvICpBRkkgPSBNRi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgdW5zaWduZWQgVkFSZWdTYXZlU2l6ZSA9IEFGSS0+Z2V0VmFyQXJnc1JlZ1NhdmVTaXplKCk7CisgIHVuc2lnbmVkIE51bUJ5dGVzID0gTUZJLT5nZXRTdGFja1NpemUoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJID0gTUZJLT5nZXRDYWxsZWVTYXZlZEluZm8oKTsKKyAgRGVidWdMb2MgZGwgPSBNQkJJICE9IE1CQi5lbmQoKSA/IE1CQkktPmdldERlYnVnTG9jKCkgOiBEZWJ1Z0xvYygpOworCisgIC8vIFRodW1iIGFkZC9zdWIgc3AsIGltbTggaW5zdHJ1Y3Rpb25zIGltcGxpY2l0bHkgbXVsdGlwbHkgdGhlIG9mZnNldCBieSA0LgorICBOdW1CeXRlcyA9IChOdW1CeXRlcyArIDMpICYgfjM7CisgIE1GSS0+c2V0U3RhY2tTaXplKE51bUJ5dGVzKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIHNpemVzIG9mIGVhY2ggY2FsbGVlLXNhdmUgc3BpbGwgYXJlYXMgYW5kIHJlY29yZCB3aGljaCBmcmFtZQorICAvLyBiZWxvbmdzIHRvIHdoaWNoIGNhbGxlZS1zYXZlIHNwaWxsIGFyZWFzLgorICB1bnNpZ25lZCBHUFJDUzFTaXplID0gMCwgR1BSQ1MyU2l6ZSA9IDAsIERQUkNTU2l6ZSA9IDA7CisgIGludCBGcmFtZVB0clNwaWxsRkkgPSAwOworCisgIGlmIChWQVJlZ1NhdmVTaXplKQorICAgIGVtaXRTUFVwZGF0ZShNQkIsIE1CQkksIFRJSSwgZGwsICp0aGlzLCAtVkFSZWdTYXZlU2l6ZSk7CisKKyAgaWYgKCFBRkktPmhhc1N0YWNrRnJhbWUoKSkgeworICAgIGlmIChOdW1CeXRlcyAhPSAwKQorICAgICAgZW1pdFNQVXBkYXRlKE1CQiwgTUJCSSwgVElJLCBkbCwgKnRoaXMsIC1OdW1CeXRlcyk7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gQ1NJW2ldLmdldFJlZygpOworICAgIGludCBGSSA9IENTSVtpXS5nZXRGcmFtZUlkeCgpOworICAgIHN3aXRjaCAoUmVnKSB7CisgICAgY2FzZSBBUk06OlI0OgorICAgIGNhc2UgQVJNOjpSNToKKyAgICBjYXNlIEFSTTo6UjY6CisgICAgY2FzZSBBUk06OlI3OgorICAgIGNhc2UgQVJNOjpMUjoKKyAgICAgIGlmIChSZWcgPT0gRnJhbWVQdHIpCisgICAgICAgIEZyYW1lUHRyU3BpbGxGSSA9IEZJOworICAgICAgQUZJLT5hZGRHUFJDYWxsZWVTYXZlZEFyZWExRnJhbWUoRkkpOworICAgICAgR1BSQ1MxU2l6ZSArPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUk06OlI4OgorICAgIGNhc2UgQVJNOjpSOToKKyAgICBjYXNlIEFSTTo6UjEwOgorICAgIGNhc2UgQVJNOjpSMTE6CisgICAgICBpZiAoUmVnID09IEZyYW1lUHRyKQorICAgICAgICBGcmFtZVB0clNwaWxsRkkgPSBGSTsKKyAgICAgIGlmIChTVEkuaXNUYXJnZXREYXJ3aW4oKSkgeworICAgICAgICBBRkktPmFkZEdQUkNhbGxlZVNhdmVkQXJlYTJGcmFtZShGSSk7CisgICAgICAgIEdQUkNTMlNpemUgKz0gNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFGSS0+YWRkR1BSQ2FsbGVlU2F2ZWRBcmVhMUZyYW1lKEZJKTsKKyAgICAgICAgR1BSQ1MxU2l6ZSArPSA0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEFGSS0+YWRkRFBSQ2FsbGVlU2F2ZWRBcmVhRnJhbWUoRkkpOworICAgICAgRFBSQ1NTaXplICs9IDg7CisgICAgfQorICB9CisKKyAgaWYgKE1CQkkgIT0gTUJCLmVuZCgpICYmIE1CQkktPmdldE9wY29kZSgpID09IEFSTTo6dFBVU0gpIHsKKyAgICArK01CQkk7CisgICAgaWYgKE1CQkkgIT0gTUJCLmVuZCgpKQorICAgICAgZGwgPSBNQkJJLT5nZXREZWJ1Z0xvYygpOworICB9CisKKyAgLy8gQWRqdXN0IEZQIHNvIGl0IHBvaW50IHRvIHRoZSBzdGFjayBzbG90IHRoYXQgY29udGFpbnMgdGhlIHByZXZpb3VzIEZQLgorICBpZiAoaGFzRlAoTUYpKSB7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dEFERHJTUGkpLCBGcmFtZVB0cikKKyAgICAgIC5hZGRGcmFtZUluZGV4KEZyYW1lUHRyU3BpbGxGSSkuYWRkSW1tKDApOworICAgIEFGSS0+c2V0U2hvdWxkUmVzdG9yZVNQRnJvbUZQKHRydWUpOworICB9CisKKyAgLy8gRGV0ZXJtaW5lIHN0YXJ0aW5nIG9mZnNldHMgb2Ygc3BpbGwgYXJlYXMuCisgIHVuc2lnbmVkIERQUkNTT2Zmc2V0ICA9IE51bUJ5dGVzIC0gKEdQUkNTMVNpemUgKyBHUFJDUzJTaXplICsgRFBSQ1NTaXplKTsKKyAgdW5zaWduZWQgR1BSQ1MyT2Zmc2V0ID0gRFBSQ1NPZmZzZXQgKyBEUFJDU1NpemU7CisgIHVuc2lnbmVkIEdQUkNTMU9mZnNldCA9IEdQUkNTMk9mZnNldCArIEdQUkNTMlNpemU7CisgIEFGSS0+c2V0RnJhbWVQdHJTcGlsbE9mZnNldChNRkktPmdldE9iamVjdE9mZnNldChGcmFtZVB0clNwaWxsRkkpICsgTnVtQnl0ZXMpOworICBBRkktPnNldEdQUkNhbGxlZVNhdmVkQXJlYTFPZmZzZXQoR1BSQ1MxT2Zmc2V0KTsKKyAgQUZJLT5zZXRHUFJDYWxsZWVTYXZlZEFyZWEyT2Zmc2V0KEdQUkNTMk9mZnNldCk7CisgIEFGSS0+c2V0RFBSQ2FsbGVlU2F2ZWRBcmVhT2Zmc2V0KERQUkNTT2Zmc2V0KTsKKworICBOdW1CeXRlcyA9IERQUkNTT2Zmc2V0OworICBpZiAoTnVtQnl0ZXMpIHsKKyAgICAvLyBJbnNlcnQgaXQgYWZ0ZXIgYWxsIHRoZSBjYWxsZWUtc2F2ZSBzcGlsbHMuCisgICAgZW1pdFNQVXBkYXRlKE1CQiwgTUJCSSwgVElJLCBkbCwgKnRoaXMsIC1OdW1CeXRlcyk7CisgIH0KKworICBpZiAoU1RJLmlzVGFyZ2V0RUxGKCkgJiYgaGFzRlAoTUYpKQorICAgIE1GSS0+c2V0T2Zmc2V0QWRqdXN0bWVudChNRkktPmdldE9mZnNldEFkanVzdG1lbnQoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGSS0+Z2V0RnJhbWVQdHJTcGlsbE9mZnNldCgpKTsKKworICBBRkktPnNldEdQUkNhbGxlZVNhdmVkQXJlYTFTaXplKEdQUkNTMVNpemUpOworICBBRkktPnNldEdQUkNhbGxlZVNhdmVkQXJlYTJTaXplKEdQUkNTMlNpemUpOworICBBRkktPnNldERQUkNhbGxlZVNhdmVkQXJlYVNpemUoRFBSQ1NTaXplKTsKK30KKworc3RhdGljIGJvb2wgaXNDYWxsZWVTYXZlZFJlZ2lzdGVyKHVuc2lnbmVkIFJlZywgY29uc3QgdW5zaWduZWQgKkNTUmVncykgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBDU1JlZ3NbaV07ICsraSkKKyAgICBpZiAoUmVnID09IENTUmVnc1tpXSkKKyAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzQ1NSZXN0b3JlKE1hY2hpbmVJbnN0ciAqTUksIGNvbnN0IHVuc2lnbmVkICpDU1JlZ3MpIHsKKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBBUk06OnRSZXN0b3JlICYmCisgICAgICBNSS0+Z2V0T3BlcmFuZCgxKS5pc0ZJKCkgJiYKKyAgICAgIGlzQ2FsbGVlU2F2ZWRSZWdpc3RlcihNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSwgQ1NSZWdzKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZSBpZiAoTUktPmdldE9wY29kZSgpID09IEFSTTo6dFBPUCkgeworICAgIC8vIFRoZSBmaXJzdCB0d28gb3BlcmFuZHMgYXJlIHByZWRpY2F0ZXMuIFRoZSBsYXN0IHR3byBhcmUKKyAgICAvLyBpbXAtZGVmIGFuZCBpbXAtdXNlIG9mIFNQLiBDaGVjayBldmVyeXRoaW5nIGluIGJldHdlZW4uCisgICAgZm9yIChpbnQgaSA9IDIsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKSAtIDI7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKCFpc0NhbGxlZVNhdmVkUmVnaXN0ZXIoTUktPmdldE9wZXJhbmQoaSkuZ2V0UmVnKCksIENTUmVncykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVGh1bWIxUmVnaXN0ZXJJbmZvOjplbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgeworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IHByaW9yKE1CQi5lbmQoKSk7CisgIGFzc2VydCgoTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0QlhfUkVUIHx8CisgICAgICAgICAgTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0UE9QX1JFVCkgJiYKKyAgICAgICAgICJDYW4gb25seSBpbnNlcnQgZXBpbG9nIGludG8gcmV0dXJuaW5nIGJsb2NrcyIpOworICBEZWJ1Z0xvYyBkbCA9IE1CQkktPmdldERlYnVnTG9jKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1GLmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICB1bnNpZ25lZCBWQVJlZ1NhdmVTaXplID0gQUZJLT5nZXRWYXJBcmdzUmVnU2F2ZVNpemUoKTsKKyAgaW50IE51bUJ5dGVzID0gKGludClNRkktPmdldFN0YWNrU2l6ZSgpOworICBjb25zdCB1bnNpZ25lZCAqQ1NSZWdzID0gZ2V0Q2FsbGVlU2F2ZWRSZWdzKCk7CisKKyAgaWYgKCFBRkktPmhhc1N0YWNrRnJhbWUoKSkgeworICAgIGlmIChOdW1CeXRlcyAhPSAwKQorICAgICAgZW1pdFNQVXBkYXRlKE1CQiwgTUJCSSwgVElJLCBkbCwgKnRoaXMsIE51bUJ5dGVzKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBVbndpbmQgTUJCSSB0byBwb2ludCB0byBmaXJzdCBMRFIgLyBWTERSRC4KKyAgICBpZiAoTUJCSSAhPSBNQkIuYmVnaW4oKSkgeworICAgICAgZG8KKyAgICAgICAgLS1NQkJJOworICAgICAgd2hpbGUgKE1CQkkgIT0gTUJCLmJlZ2luKCkgJiYgaXNDU1Jlc3RvcmUoTUJCSSwgQ1NSZWdzKSk7CisgICAgICBpZiAoIWlzQ1NSZXN0b3JlKE1CQkksIENTUmVncykpCisgICAgICAgICsrTUJCSTsKKyAgICB9CisKKyAgICAvLyBNb3ZlIFNQIHRvIHN0YXJ0IG9mIEZQIGNhbGxlZSBzYXZlIHNwaWxsIGFyZWEuCisgICAgTnVtQnl0ZXMgLT0gKEFGSS0+Z2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMVNpemUoKSArCisgICAgICAgICAgICAgICAgIEFGSS0+Z2V0R1BSQ2FsbGVlU2F2ZWRBcmVhMlNpemUoKSArCisgICAgICAgICAgICAgICAgIEFGSS0+Z2V0RFBSQ2FsbGVlU2F2ZWRBcmVhU2l6ZSgpKTsKKworICAgIGlmIChBRkktPnNob3VsZFJlc3RvcmVTUEZyb21GUCgpKSB7CisgICAgICBOdW1CeXRlcyA9IEFGSS0+Z2V0RnJhbWVQdHJTcGlsbE9mZnNldCgpIC0gTnVtQnl0ZXM7CisgICAgICAvLyBSZXNldCBTUCBiYXNlZCBvbiBmcmFtZSBwb2ludGVyIG9ubHkgaWYgdGhlIHN0YWNrIGZyYW1lIGV4dGVuZHMgYmV5b25kCisgICAgICAvLyBmcmFtZSBwb2ludGVyIHN0YWNrIHNsb3Qgb3IgdGFyZ2V0IGlzIEVMRiBhbmQgdGhlIGZ1bmN0aW9uIGhhcyBGUC4KKyAgICAgIGlmIChOdW1CeXRlcykKKyAgICAgICAgZW1pdFRodW1iUmVnUGx1c0ltbWVkaWF0ZShNQkIsIE1CQkksIEFSTTo6U1AsIEZyYW1lUHRyLCAtTnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLCAqdGhpcywgZGwpOworICAgICAgZWxzZQorICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQVJNOjp0TU9WdGdwcjJncHIpLCBBUk06OlNQKQorICAgICAgICAgIC5hZGRSZWcoRnJhbWVQdHIpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0QlhfUkVUICYmCisgICAgICAgICAgJk1CQi5mcm9udCgpICE9IE1CQkkgJiYKKyAgICAgICAgICBwcmlvcihNQkJJKS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0UE9QKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBQTUJCSSA9IHByaW9yKE1CQkkpOworICAgICAgICBlbWl0U1BVcGRhdGUoTUJCLCBQTUJCSSwgVElJLCBkbCwgKnRoaXMsIE51bUJ5dGVzKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBlbWl0U1BVcGRhdGUoTUJCLCBNQkJJLCBUSUksIGRsLCAqdGhpcywgTnVtQnl0ZXMpOworICAgIH0KKyAgfQorCisgIGlmIChWQVJlZ1NhdmVTaXplKSB7CisgICAgLy8gVW5saWtlIFQyIGFuZCBBUk0gbW9kZSwgdGhlIFQxIHBvcCBpbnN0cnVjdGlvbiBjYW5ub3QgcmVzdG9yZQorICAgIC8vIHRvIExSLCBhbmQgd2UgY2FuJ3QgcG9wIHRoZSB2YWx1ZSBkaXJlY3RseSB0byB0aGUgUEMgc2luY2UKKyAgICAvLyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgU1AgYWZ0ZXIgcG9wcGluZyB0aGUgdmFsdWUuIFRoZXJlZm9yZSwgd2UKKyAgICAvLyBwb3AgdGhlIG9sZCBMUiBpbnRvIFIzIGFzIGEgdGVtcG9yYXJ5LgorCisgICAgLy8gTW92ZSBiYWNrIHBhc3QgdGhlIGNhbGxlZS1zYXZlZCByZWdpc3RlciByZXN0b3JhdGlvbgorICAgIHdoaWxlIChNQkJJICE9IE1CQi5lbmQoKSAmJiBpc0NTUmVzdG9yZShNQkJJLCBDU1JlZ3MpKQorICAgICAgKytNQkJJOworICAgIC8vIEVwaWxvZ3VlIGZvciB2YXJhcmcgZnVuY3Rpb25zOiBwb3AgTFIgdG8gUjMgYW5kIGJyYW5jaCBvZmYgaXQuCisgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dFBPUCkpKQorICAgICAgLmFkZFJlZyhBUk06OlIzLCBSZWdTdGF0ZTo6RGVmaW5lKTsKKworICAgIGVtaXRTUFVwZGF0ZShNQkIsIE1CQkksIFRJSSwgZGwsICp0aGlzLCBWQVJlZ1NhdmVTaXplKTsKKworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBUk06OnRCWF9SRVRfdmFyYXJnKSkKKyAgICAgIC5hZGRSZWcoQVJNOjpSMywgUmVnU3RhdGU6OktpbGwpOworICAgIC8vIGVyYXNlIHRoZSBvbGQgdEJYX1JFVCBpbnN0cnVjdGlvbgorICAgIE1CQi5lcmFzZShNQkJJKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGh1bWIxUmVnaXN0ZXJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjFSZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzY1MzI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGh1bWIxUmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSw2OCBAQAorLy89PT0tIFRodW1iMVJlZ2lzdGVySW5mby5oIC0gVGh1bWItMSBSZWdpc3RlciBJbmZvcm1hdGlvbiBJbXBsIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFRodW1iLTEgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbworLy8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBUSFVNQjFSRUdJU1RFUklORk9fSAorI2RlZmluZSBUSFVNQjFSRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAiQVJNUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQVJNU3VidGFyZ2V0OworICBjbGFzcyBBUk1CYXNlSW5zdHJJbmZvOworICBjbGFzcyBUeXBlOworCitzdHJ1Y3QgVGh1bWIxUmVnaXN0ZXJJbmZvIDogcHVibGljIEFSTUJhc2VSZWdpc3RlckluZm8geworcHVibGljOgorICBUaHVtYjFSZWdpc3RlckluZm8oY29uc3QgQVJNQmFzZUluc3RySW5mbyAmdGlpLCBjb25zdCBBUk1TdWJ0YXJnZXQgJlNUSSk7CisKKyAgLy8vIGVtaXRMb2FkQ29uc3RQb29sIC0gRW1pdHMgYSBsb2FkIGZyb20gY29uc3Rwb29sIHRvIG1hdGVyaWFsaXplIHRoZQorICAvLy8gc3BlY2lmaWVkIGltbWVkaWF0ZS4KKyB2b2lkIGVtaXRMb2FkQ29uc3RQb29sKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFN1YklkeCwgaW50IFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCA9IEFSTUNDOjpBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByZWRSZWcgPSAwKSBjb25zdDsKKworICAvLy8gQ29kZSBHZW5lcmF0aW9uIHZpcnR1YWwgbWV0aG9kcy4uLgorICBib29sIGhhc1Jlc2VydmVkQ2FsbEZyYW1lKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIHZvaWQgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdDsKKworICAvLyByZXdyaXRlIE1JIHRvIGFjY2VzcyAnT2Zmc2V0JyBieXRlcyBmcm9tIHRoZSBGUC4gUmV0dXJuIHRoZSBvZmZzZXQgdGhhdAorICAvLyBjb3VsZCBub3QgYmUgaGFuZGxlZCBkaXJlY3RseSBpbiBNSS4KKyAgaW50IHJld3JpdGVGcmFtZUluZGV4KE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIEZyYW1lUmVnSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRnJhbWVSZWcsIGludCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNT1ZPcGMsIHVuc2lnbmVkIEFERHJpT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU1VCcmlPcGMpIGNvbnN0OworCisgIGJvb2wgc2F2ZVNjYXZlbmdlclJlZ2lzdGVyKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJlVzZU1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnKSBjb25zdDsKKyAgdW5zaWduZWQgZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gTlVMTCkgY29uc3Q7CisKKyAgdm9pZCBlbWl0UHJvbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIHZvaWQgZW1pdEVwaWxvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0OworfTsKK30KKworI2VuZGlmIC8vIFRIVU1CMVJFR0lTVEVSSU5GT19ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJIYXphcmRSZWNvZ25pemVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMkhhemFyZFJlY29nbml6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MjkwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJIYXphcmRSZWNvZ25pemVyLmNwcApAQCAtMCwwICsxLDUzIEBACisvLz09PS0tIFRodW1iMkhhemFyZFJlY29nbml6ZXIuY3BwIC0gVGh1bWIyIHBvc3RyYSBoYXphcmQgcmVjb2duaXplciAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQVJNLmgiCisjaW5jbHVkZSAiVGh1bWIySGF6YXJkUmVjb2duaXplci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTY2hlZHVsZUhhemFyZFJlY29nbml6ZXI6OkhhemFyZFR5cGUKK1RodW1iMkhhemFyZFJlY29nbml6ZXI6OmdldEhhemFyZFR5cGUoU1VuaXQgKlNVKSB7CisgIGlmIChJVEJsb2NrU2l6ZSkgeworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBTVS0+Z2V0SW5zdHIoKTsKKyAgICBpZiAoIU1JLT5pc0RlYnVnVmFsdWUoKSAmJiBNSSAhPSBJVEJsb2NrTUlzW0lUQmxvY2tTaXplLTFdKQorICAgICAgcmV0dXJuIEhhemFyZDsKKyAgfQorCisgIHJldHVybiBQb3N0UkFIYXphcmRSZWNvZ25pemVyOjpnZXRIYXphcmRUeXBlKFNVKTsKK30KKwordm9pZCBUaHVtYjJIYXphcmRSZWNvZ25pemVyOjpSZXNldCgpIHsKKyAgSVRCbG9ja1NpemUgPSAwOworICBQb3N0UkFIYXphcmRSZWNvZ25pemVyOjpSZXNldCgpOworfQorCit2b2lkIFRodW1iMkhhemFyZFJlY29nbml6ZXI6OkVtaXRJbnN0cnVjdGlvbihTVW5pdCAqU1UpIHsKKyAgTWFjaGluZUluc3RyICpNSSA9IFNVLT5nZXRJbnN0cigpOworICB1bnNpZ25lZCBPcGNvZGUgPSBNSS0+Z2V0T3Bjb2RlKCk7CisgIGlmIChJVEJsb2NrU2l6ZSkgeworICAgIC0tSVRCbG9ja1NpemU7CisgIH0gZWxzZSBpZiAoT3Bjb2RlID09IEFSTTo6dDJJVCkgeworICAgIHVuc2lnbmVkIE1hc2sgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKTsKKyAgICB1bnNpZ25lZCBOdW1UWiA9IENvdW50VHJhaWxpbmdaZXJvc18zMihNYXNrKTsKKyAgICBhc3NlcnQoTnVtVFogPD0gMyAmJiAiSW52YWxpZCBJVCBtYXNrISIpOworICAgIElUQmxvY2tTaXplID0gNCAtIE51bVRaOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IElUQmxvY2tTaXplOyArK2kpIHsKKyAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHNraXBwaW5nIGFueSBkYmdfdmFsdWUgaW5zdHJ1Y3Rpb25zLgorICAgICAgZG8geworICAgICAgICArK0k7CisgICAgICB9IHdoaWxlIChJLT5pc0RlYnVnVmFsdWUoKSk7CisgICAgICBJVEJsb2NrTUlzW0lUQmxvY2tTaXplLTEtaV0gPSAmKkk7CisgICAgfQorICB9CisKKyAgUG9zdFJBSGF6YXJkUmVjb2duaXplcjo6RW1pdEluc3RydWN0aW9uKFNVKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMkhhemFyZFJlY29nbml6ZXIuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMkhhemFyZFJlY29nbml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzI2NjU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGh1bWIySGF6YXJkUmVjb2duaXplci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LS0gVGh1bWIySGF6YXJkUmVjb2duaXplci5oIC0gVGh1bWIyIEhhemFyZCBSZWNvZ25pemVycyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgaGF6YXJkIHJlY29nbml6ZXJzIGZvciBzY2hlZHVsaW5nIFRodW1iMiBmdW5jdGlvbnMgb24KKy8vIEFSTSBwcm9jZXNzb3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVEhVTUIySEFaQVJEUkVDT0dOSVpFUl9ICisjZGVmaW5lIFRIVU1CMkhBWkFSRFJFQ09HTklaRVJfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bvc3RSQUhhemFyZFJlY29nbml6ZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lSW5zdHI7CisKK2NsYXNzIFRodW1iMkhhemFyZFJlY29nbml6ZXIgOiBwdWJsaWMgUG9zdFJBSGF6YXJkUmVjb2duaXplciB7CisgIHVuc2lnbmVkIElUQmxvY2tTaXplOyAgLy8gTm8uIG9mIE1JcyBpbiBjdXJyZW50IElUIGJsb2NrIHlldCB0byBiZSBzY2hlZHVsZWQuCisgIE1hY2hpbmVJbnN0ciAqSVRCbG9ja01Jc1s0XTsKKworcHVibGljOgorICBUaHVtYjJIYXphcmRSZWNvZ25pemVyKGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAmSXRpbkRhdGEpIDoKKyAgICBQb3N0UkFIYXphcmRSZWNvZ25pemVyKEl0aW5EYXRhKSB7fQorCisgIHZpcnR1YWwgSGF6YXJkVHlwZSBnZXRIYXphcmRUeXBlKFNVbml0ICpTVSk7CisgIHZpcnR1YWwgdm9pZCBSZXNldCgpOworICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKFNVbml0ICpTVSk7Cit9OworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBUSFVNQjJIQVpBUkRSRUNPR05JWkVSX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMklUQmxvY2tQYXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMklUQmxvY2tQYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU2OTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGh1bWIySVRCbG9ja1Bhc3MuY3BwCkBAIC0wLDAgKzEsMjU1IEBACisvLz09PS0tIFRodW1iMklUQmxvY2tQYXNzLmNwcCAtIEluc2VydCBUaHVtYiBJVCBibG9ja3MgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInRodW1iMi1pdCIKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1NYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAiVGh1bWIySW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1JVHMsICAgICAgICAiTnVtYmVyIG9mIElUIGJsb2NrcyBpbnNlcnRlZCIpOworU1RBVElTVElDKE51bU1vdmVkSW5zdHMsICJOdW1iZXIgb2YgcHJlZGljYXRlZCBpbnN0cnVjdGlvbnMgbW92ZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgVGh1bWIySVRCbG9ja1Bhc3MgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgYm9vbCBQcmVSZWdBbGxvYzsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgVGh1bWIySVRCbG9ja1Bhc3MoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICBjb25zdCBUaHVtYjJJbnN0ckluZm8gKlRJSTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgICBBUk1GdW5jdGlvbkluZm8gKkFGSTsKKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIlRodW1iIElUIGJsb2NrcyBpbnNlcnRpb24gcGFzcyI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBNb3ZlQ29weU91dE9mSVRCbG9jayhNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBDQywgQVJNQ0M6OkNvbmRDb2RlcyBPQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDx1bnNpZ25lZCwgND4gJkRlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDx1bnNpZ25lZCwgND4gJlVzZXMpOworICAgIGJvb2wgSW5zZXJ0SVRJbnN0cnVjdGlvbnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisgIH07CisgIGNoYXIgVGh1bWIySVRCbG9ja1Bhc3M6OklEID0gMDsKK30KKworLy8vIFRyYWNrRGVmVXNlcyAtIFRyYWNraW5nIHdoYXQgcmVnaXN0ZXJzIGFyZSBiZWluZyBkZWZpbmVkIGFuZCB1c2VkIGJ5CisvLy8gaW5zdHJ1Y3Rpb25zIGluIHRoZSBJVCBibG9jay4gVGhpcyBhbHNvIHRyYWNrcyAiZGVwZW5kZW5jaWVzIiwgaS5lLiB1c2VzCisvLy8gaW4gdGhlIElUIGJsb2NrIHRoYXQgYXJlIGRlZmluZWQgYmVmb3JlIHRoZSBJVCBpbnN0cnVjdGlvbi4KK3N0YXRpYyB2b2lkIFRyYWNrRGVmVXNlcyhNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiAmRGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldDx1bnNpZ25lZCwgND4gJlVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIHsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IExvY2FsRGVmczsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IExvY2FsVXNlczsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKCFSZWcgfHwgUmVnID09IEFSTTo6SVRTVEFURSB8fCBSZWcgPT0gQVJNOjpTUCkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChNTy5pc1VzZSgpKQorICAgICAgTG9jYWxVc2VzLnB1c2hfYmFjayhSZWcpOworICAgIGVsc2UKKyAgICAgIExvY2FsRGVmcy5wdXNoX2JhY2soUmVnKTsKKyAgfQorCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMb2NhbFVzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIFJlZyA9IExvY2FsVXNlc1tpXTsKKyAgICBVc2VzLmluc2VydChSZWcpOworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKlN1YnJlZyA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKFJlZyk7CisgICAgICAgICAqU3VicmVnOyArK1N1YnJlZykKKyAgICAgIFVzZXMuaW5zZXJ0KCpTdWJyZWcpOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExvY2FsRGVmcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gTG9jYWxEZWZzW2ldOworICAgIERlZnMuaW5zZXJ0KFJlZyk7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqU3VicmVnID0gVFJJLT5nZXRTdWJSZWdpc3RlcnMoUmVnKTsKKyAgICAgICAgICpTdWJyZWc7ICsrU3VicmVnKQorICAgICAgRGVmcy5pbnNlcnQoKlN1YnJlZyk7CisgICAgaWYgKFJlZyA9PSBBUk06OkNQU1IpCisgICAgICBjb250aW51ZTsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBpc0NvcHkoTWFjaGluZUluc3RyICpNSSkgeworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBBUk06Ok1PVnI6CisgIGNhc2UgQVJNOjpNT1ZyX1RDOgorICBjYXNlIEFSTTo6dE1PVnI6CisgIGNhc2UgQVJNOjp0TU9WZ3ByMnRncHI6CisgIGNhc2UgQVJNOjp0TU9WdGdwcjJncHI6CisgIGNhc2UgQVJNOjp0TU9WZ3ByMmdwcjoKKyAgY2FzZSBBUk06OnQyTU9WcjoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitib29sCitUaHVtYjJJVEJsb2NrUGFzczo6TW92ZUNvcHlPdXRPZklUQmxvY2soTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNQ0M6OkNvbmRDb2RlcyBDQywgQVJNQ0M6OkNvbmRDb2RlcyBPQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxTZXQ8dW5zaWduZWQsIDQ+ICZEZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiAmVXNlcykgeworICBpZiAoIWlzQ29weShNSSkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBsbHZtIG1vZGVscyBzZWxlY3QncyBhcyB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbnMuIFRoYXQgbWVhbnMgYSBjb3B5CisgIC8vIGlzIGluc2VydGVkIGJlZm9yZSBhIHQyTU9WY2NyLCBldGMuIElmIHRoZSBjb3B5IGlzIHNjaGVkdWxlZCBpbgorICAvLyBiZXR3ZWVuIHNlbGVjdHMgd2Ugd291bGQgZW5kIHVwIGNyZWF0aW5nIG11bHRpcGxlIElUIGJsb2Nrcy4KKyAgYXNzZXJ0KE1JLT5nZXRPcGVyYW5kKDApLmdldFN1YlJlZygpID09IDAgJiYKKyAgICAgICAgIE1JLT5nZXRPcGVyYW5kKDEpLmdldFN1YlJlZygpID09IDAgJiYKKyAgICAgICAgICJTdWItcmVnaXN0ZXIgaW5kaWNlcyBzdGlsbCBhcm91bmQ/Iik7CisKKyAgdW5zaWduZWQgRHN0UmVnID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIFNyY1JlZyA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworCisgIC8vIEZpcnN0IGNoZWNrIGlmIGl0J3Mgc2FmZSB0byBtb3ZlIGl0LgorICBpZiAoVXNlcy5jb3VudChEc3RSZWcpIHx8IERlZnMuY291bnQoU3JjUmVnKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVGhlbiBwZWVrIGF0IHRoZSBuZXh0IGluc3RydWN0aW9uIHRvIHNlZSBpZiBpdCdzIHByZWRpY2F0ZWQgb24gQ0Mgb3IgT0NDLgorICAvLyBJZiBub3QsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBiZSBnYWluZWQgYnkgbW92aW5nIHRoZSBjb3B5LgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1JOyArK0k7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFID0gTUktPmdldFBhcmVudCgpLT5lbmQoKTsKKyAgd2hpbGUgKEkgIT0gRSAmJiBJLT5pc0RlYnVnVmFsdWUoKSkKKyAgICArK0k7CisgIGlmIChJICE9IEUpIHsKKyAgICB1bnNpZ25lZCBOUHJlZFJlZyA9IDA7CisgICAgQVJNQ0M6OkNvbmRDb2RlcyBOQ0MgPSBsbHZtOjpnZXRJVEluc3RyUHJlZGljYXRlKEksIE5QcmVkUmVnKTsKKyAgICBpZiAoTkNDID09IENDIHx8IE5DQyA9PSBPQ0MpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGh1bWIySVRCbG9ja1Bhc3M6Okluc2VydElUSW5zdHJ1Y3Rpb25zKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIHsKKyAgYm9vbCBNb2RpZmllZCA9IGZhbHNlOworCisgIFNtYWxsU2V0PHVuc2lnbmVkLCA0PiBEZWZzOworICBTbWFsbFNldDx1bnNpZ25lZCwgND4gVXNlczsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBNQkIuYmVnaW4oKSwgRSA9IE1CQi5lbmQoKTsKKyAgd2hpbGUgKE1CQkkgIT0gRSkgeworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSAmKk1CQkk7CisgICAgRGVidWdMb2MgZGwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgICB1bnNpZ25lZCBQcmVkUmVnID0gMDsKKyAgICBBUk1DQzo6Q29uZENvZGVzIENDID0gbGx2bTo6Z2V0SVRJbnN0clByZWRpY2F0ZShNSSwgUHJlZFJlZyk7CisgICAgaWYgKENDID09IEFSTUNDOjpBTCkgeworICAgICAgKytNQkJJOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgRGVmcy5jbGVhcigpOworICAgIFVzZXMuY2xlYXIoKTsKKyAgICBUcmFja0RlZlVzZXMoTUksIERlZnMsIFVzZXMsIFRSSSk7CisKKyAgICAvLyBJbnNlcnQgYW4gSVQgaW5zdHJ1Y3Rpb24uCisgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS0+Z2V0KEFSTTo6dDJJVCkpCisgICAgICAuYWRkSW1tKENDKTsKKworICAgIC8vIEFkZCBpbXBsaWNpdCB1c2Ugb2YgSVRTVEFURSB0byBJVCBibG9jayBpbnN0cnVjdGlvbnMuCisgICAgTUktPmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhBUk06OklUU1RBVEUsIGZhbHNlLyppZkRlZiovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZS8qaXNJbXAqLywgZmFsc2UvKmlzS2lsbCovKSk7CisKKyAgICBNYWNoaW5lSW5zdHIgKkxhc3RJVE1JID0gTUk7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFBvcyA9IE1JQjsKKyAgICArK01CQkk7CisKKyAgICAvLyBGb3JtIElUIGJsb2NrLgorICAgIEFSTUNDOjpDb25kQ29kZXMgT0NDID0gQVJNQ0M6OmdldE9wcG9zaXRlQ29uZGl0aW9uKENDKTsKKyAgICB1bnNpZ25lZCBNYXNrID0gMCwgUG9zID0gMzsKKyAgICAvLyBCcmFuY2hlcywgaW5jbHVkaW5nIHRyaWNreSBvbmVzIGxpa2UgTERNX1JFVCwgbmVlZCB0byBlbmQgYW4gSVQKKyAgICAvLyBibG9jayBzbyBjaGVjayB0aGUgaW5zdHJ1Y3Rpb24gd2UganVzdCBwdXQgaW4gdGhlIGJsb2NrLgorICAgIGZvciAoOyBNQkJJICE9IEUgJiYgUG9zICYmCisgICAgICAgICAgICghTUktPmdldERlc2MoKS5pc0JyYW5jaCgpICYmICFNSS0+Z2V0RGVzYygpLmlzUmV0dXJuKCkpIDsgKytNQkJJKSB7CisgICAgICBpZiAoTUJCSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBNYWNoaW5lSW5zdHIgKk5NSSA9ICYqTUJCSTsKKyAgICAgIE1JID0gTk1JOworCisgICAgICB1bnNpZ25lZCBOUHJlZFJlZyA9IDA7CisgICAgICBBUk1DQzo6Q29uZENvZGVzIE5DQyA9IGxsdm06OmdldElUSW5zdHJQcmVkaWNhdGUoTk1JLCBOUHJlZFJlZyk7CisgICAgICBpZiAoTkNDID09IENDIHx8IE5DQyA9PSBPQ0MpIHsKKyAgICAgICAgTWFzayB8PSAoTkNDICYgMSkgPDwgUG9zOworICAgICAgICAvLyBBZGQgaW1wbGljaXQgdXNlIG9mIElUU1RBVEUuCisgICAgICAgIE5NSS0+YWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKEFSTTo6SVRTVEFURSwgZmFsc2UvKmlmRGVmKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUvKmlzSW1wKi8sIGZhbHNlLyppc0tpbGwqLykpOworICAgICAgICBMYXN0SVRNSSA9IE5NSTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChOQ0MgPT0gQVJNQ0M6OkFMICYmCisgICAgICAgICAgICBNb3ZlQ29weU91dE9mSVRCbG9jayhOTUksIENDLCBPQ0MsIERlZnMsIFVzZXMpKSB7CisgICAgICAgICAgLS1NQkJJOworICAgICAgICAgIE1CQi5yZW1vdmUoTk1JKTsKKyAgICAgICAgICBNQkIuaW5zZXJ0KEluc2VydFBvcywgTk1JKTsKKyAgICAgICAgICArK051bU1vdmVkSW5zdHM7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBUcmFja0RlZlVzZXMoTk1JLCBEZWZzLCBVc2VzLCBUUkkpOworICAgICAgLS1Qb3M7CisgICAgfQorCisgICAgLy8gRmluYWxpemUgSVQgbWFzay4KKyAgICBNYXNrIHw9ICgxIDw8IFBvcyk7CisgICAgLy8gVGFnIGFsb25nIChmaXJzdGNvbmRbMF0gPDwgNCkgd2l0aCB0aGUgbWFzay4KKyAgICBNYXNrIHw9IChDQyAmIDEpIDw8IDQ7CisgICAgTUlCLmFkZEltbShNYXNrKTsKKworICAgIC8vIExhc3QgaW5zdHJ1Y3Rpb24gaW4gSVQgYmxvY2sga2lsbHMgSVRTVEFURS4KKyAgICBMYXN0SVRNSS0+ZmluZFJlZ2lzdGVyVXNlT3BlcmFuZChBUk06OklUU1RBVEUpLT5zZXRJc0tpbGwoKTsKKworICAgIE1vZGlmaWVkID0gdHJ1ZTsKKyAgICArK051bUlUczsKKyAgfQorCisgIHJldHVybiBNb2RpZmllZDsKK30KKworYm9vbCBUaHVtYjJJVEJsb2NrUGFzczo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGbikgeworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IEZuLmdldFRhcmdldCgpOworICBBRkkgPSBGbi5nZXRJbmZvPEFSTUZ1bmN0aW9uSW5mbz4oKTsKKyAgVElJID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGh1bWIySW5zdHJJbmZvKj4oVE0uZ2V0SW5zdHJJbmZvKCkpOworICBUUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKworICBpZiAoIUFGSS0+aXNUaHVtYkZ1bmN0aW9uKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgTW9kaWZpZWQgPSBmYWxzZTsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1GSSA9IEZuLmJlZ2luKCksIEUgPSBGbi5lbmQoKTsgTUZJICE9IEU7ICkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIgPSAqTUZJOworICAgICsrTUZJOworICAgIE1vZGlmaWVkIHw9IEluc2VydElUSW5zdHJ1Y3Rpb25zKE1CQik7CisgIH0KKworICBpZiAoTW9kaWZpZWQpCisgICAgQUZJLT5zZXRIYXNJVEJsb2Nrcyh0cnVlKTsKKworICByZXR1cm4gTW9kaWZpZWQ7Cit9CisKKy8vLyBjcmVhdGVUaHVtYjJJVEJsb2NrUGFzcyAtIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIFRodW1iMiBJVCBibG9ja3MKKy8vLyBpbnNlcnRpb24gcGFzcy4KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlVGh1bWIySVRCbG9ja1Bhc3MoKSB7CisgIHJldHVybiBuZXcgVGh1bWIySVRCbG9ja1Bhc3MoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMkluc3RySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJJbnN0ckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmY0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJJbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsNjQwIEBACisvLz09PS0gVGh1bWIySW5zdHJJbmZvLmNwcCAtIFRodW1iLTIgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgVGh1bWItMiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJUaHVtYjJJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1Db25zdGFudFBvb2xWYWx1ZS5oIgorI2luY2x1ZGUgIkFSTUFkZHJlc3NpbmdNb2Rlcy5oIgorI2luY2x1ZGUgIkFSTUdlbkluc3RySW5mby5pbmMiCisjaW5jbHVkZSAiQVJNTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIlRodW1iMkhhemFyZFJlY29nbml6ZXIuaCIKKyNpbmNsdWRlICJUaHVtYjJJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PHVuc2lnbmVkPgorSWZDdnRMaW1pdCgidGh1bWIyLWlmY3Z0LWxpbWl0IiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICAgY2w6OmRlc2MoIlRodW1iMiBpZi1jb252ZXJzaW9uIGxpbWl0IChkZWZhdWx0IDMpIiksCisgICAgICAgICAgIGNsOjppbml0KDMpKTsKKworc3RhdGljIGNsOjpvcHQ8dW5zaWduZWQ+CitJZkN2dERpYW1vbmRMaW1pdCgidGh1bWIyLWlmY3Z0LWRpYW1vbmQtbGltaXQiLCBjbDo6SGlkZGVuLAorICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIlRodW1iMiBkaWFtb25kIGlmLWNvbnZlcnNpb24gbGltaXQgKGRlZmF1bHQgMykiKSwKKyAgICAgICAgICAgICAgICAgIGNsOjppbml0KDMpKTsKKworVGh1bWIySW5zdHJJbmZvOjpUaHVtYjJJbnN0ckluZm8oY29uc3QgQVJNU3VidGFyZ2V0ICZTVEkpCisgIDogQVJNQmFzZUluc3RySW5mbyhTVEkpLCBSSSgqdGhpcywgU1RJKSB7Cit9CisKK3Vuc2lnbmVkIFRodW1iMkluc3RySW5mbzo6Z2V0VW5pbmRleGVkT3Bjb2RlKHVuc2lnbmVkIE9wYykgY29uc3QgeworICAvLyBGSVhNRQorICByZXR1cm4gMDsKK30KKwordm9pZAorVGh1bWIySW5zdHJJbmZvOjpSZXBsYWNlVGFpbFdpdGhCcmFuY2hUbyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgVGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk5ld0Rlc3QpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IFRhaWwtPmdldFBhcmVudCgpOworICBBUk1GdW5jdGlvbkluZm8gKkFGSSA9IE1CQi0+Z2V0UGFyZW50KCktPmdldEluZm88QVJNRnVuY3Rpb25JbmZvPigpOworICBpZiAoIUFGSS0+aGFzSVRCbG9ja3MoKSkgeworICAgIFRhcmdldEluc3RySW5mb0ltcGw6OlJlcGxhY2VUYWlsV2l0aEJyYW5jaFRvKFRhaWwsIE5ld0Rlc3QpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiBUYWlsIGlzIHByZWRpY2F0ZWQsIHdlIG1heSBoYXZlIHRvIHVwZGF0ZQorICAvLyB0aGUgSVQgaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIFByZWRSZWcgPSAwOworICBBUk1DQzo6Q29uZENvZGVzIENDID0gbGx2bTo6Z2V0SW5zdHJQcmVkaWNhdGUoVGFpbCwgUHJlZFJlZyk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gVGFpbDsKKyAgaWYgKENDICE9IEFSTUNDOjpBTCkKKyAgICAvLyBFeHBlY3RpbmcgYXQgbGVhc3QgdGhlIHQySVQgaW5zdHJ1Y3Rpb24gYmVmb3JlIGl0LgorICAgIC0tTUJCSTsKKworICAvLyBBY3R1YWxseSByZXBsYWNlIHRoZSB0YWlsLgorICBUYXJnZXRJbnN0ckluZm9JbXBsOjpSZXBsYWNlVGFpbFdpdGhCcmFuY2hUbyhUYWlsLCBOZXdEZXN0KTsKKworICAvLyBGaXggdXAgSVQuCisgIGlmIChDQyAhPSBBUk1DQzo6QUwpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRSA9IE1CQi0+YmVnaW4oKTsKKyAgICB1bnNpZ25lZCBDb3VudCA9IDQ7IC8vIEF0IG1vc3QgNCBpbnN0cnVjdGlvbnMgaW4gYW4gSVQgYmxvY2suCisgICAgd2hpbGUgKENvdW50ICYmIE1CQkkgIT0gRSkgeworICAgICAgaWYgKE1CQkktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgICAgIC0tTUJCSTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gQVJNOjp0MklUKSB7CisgICAgICAgIHVuc2lnbmVkIE1hc2sgPSBNQkJJLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpOworICAgICAgICBpZiAoQ291bnQgPT0gNCkKKyAgICAgICAgICBNQkJJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdW5zaWduZWQgTWFza09uID0gMSA8PCBDb3VudDsKKyAgICAgICAgICB1bnNpZ25lZCBNYXNrT2ZmID0gfihNYXNrT24gLSAxKTsKKyAgICAgICAgICBNQkJJLT5nZXRPcGVyYW5kKDEpLnNldEltbSgoTWFzayAmIE1hc2tPZmYpIHwgTWFza09uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAtLU1CQkk7CisgICAgICAtLUNvdW50OworICAgIH0KKworICAgIC8vIEN0cmwgZmxvdyBjYW4gcmVhY2ggaGVyZSBpZiBicmFuY2ggZm9sZGluZyBpcyBydW4gYmVmb3JlIElUIGJsb2NrCisgICAgLy8gZm9ybWF0aW9uIHBhc3MuCisgIH0KK30KKworYm9vbAorVGh1bWIySW5zdHJJbmZvOjppc0xlZ2FsVG9TcGxpdE1CQkF0KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkpIGNvbnN0IHsKKyAgdW5zaWduZWQgUHJlZFJlZyA9IDA7CisgIHJldHVybiBsbHZtOjpnZXRJVEluc3RyUHJlZGljYXRlKE1CQkksIFByZWRSZWcpID09IEFSTUNDOjpBTDsKK30KKworYm9vbCBUaHVtYjJJbnN0ckluZm86OmlzUHJvZml0YWJsZVRvSWZDdnQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUluc3RycykgY29uc3QgeworICByZXR1cm4gTnVtSW5zdHJzICYmIE51bUluc3RycyA8PSBJZkN2dExpbWl0OworfQorICAKK2Jvb2wgVGh1bWIySW5zdHJJbmZvOjoKK2lzUHJvZml0YWJsZVRvSWZDdnQoTWFjaGluZUJhc2ljQmxvY2sgJlRNQkIsIHVuc2lnbmVkIE51bVQsCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZGTUJCLCB1bnNpZ25lZCBOdW1GKSBjb25zdCB7CisgIC8vIEZJWE1FOiBDYXRjaCBvcHRpbWl6YXRpb24gc3VjaCBhczoKKyAgLy8gICAgICAgIHIwID0gbW92bmUKKyAgLy8gICAgICAgIHIwID0gbW92ZXEKKyAgcmV0dXJuIE51bVQgJiYgTnVtRiAmJgorICAgIE51bVQgPD0gKElmQ3Z0RGlhbW9uZExpbWl0KSAmJiBOdW1GIDw9IChJZkN2dERpYW1vbmRMaW1pdCk7Cit9CisKK3ZvaWQgVGh1bWIySW5zdHJJbmZvOjpjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLCBEZWJ1Z0xvYyBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdCB7CisgIC8vIEhhbmRsZSBTUFIsIERQUiwgYW5kIFFQUiBjb3BpZXMuCisgIGlmICghQVJNOjpHUFJSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIHJldHVybiBBUk1CYXNlSW5zdHJJbmZvOjpjb3B5UGh5c1JlZyhNQkIsIEksIERMLCBEZXN0UmVnLCBTcmNSZWcsIEtpbGxTcmMpOworCisgIGJvb2wgdERlc3QgPSBBUk06OnRHUFJSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnKTsKKyAgYm9vbCB0U3JjICA9IEFSTTo6dEdQUlJlZ0NsYXNzLmNvbnRhaW5zKFNyY1JlZyk7CisgIHVuc2lnbmVkIE9wYyA9IEFSTTo6dE1PVmdwcjJncHI7CisgIGlmICh0RGVzdCAmJiB0U3JjKQorICAgIE9wYyA9IEFSTTo6dE1PVnI7CisgIGVsc2UgaWYgKHRTcmMpCisgICAgT3BjID0gQVJNOjp0TU9WdGdwcjJncHI7CisgIGVsc2UgaWYgKHREZXN0KQorICAgIE9wYyA9IEFSTTo6dE1PVmdwcjJ0Z3ByOworCisgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE9wYyksIERlc3RSZWcpCisgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSk7Cit9CisKK3ZvaWQgVGh1bWIySW5zdHJJbmZvOjoKK3N0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGlmIChSQyA9PSBBUk06OkdQUlJlZ2lzdGVyQ2xhc3MgICB8fCBSQyA9PSBBUk06OnRHUFJSZWdpc3RlckNsYXNzIHx8CisgICAgICBSQyA9PSBBUk06OnRjR1BSUmVnaXN0ZXJDbGFzcyB8fCBSQyA9PSBBUk06OnJHUFJSZWdpc3RlckNsYXNzKSB7CisgICAgRGVidWdMb2MgREw7CisgICAgaWYgKEkgIT0gTUJCLmVuZCgpKSBETCA9IEktPmdldERlYnVnTG9jKCk7CisKKyAgICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgICBNYWNoaW5lRnJhbWVJbmZvICZNRkkgPSAqTUYuZ2V0RnJhbWVJbmZvKCk7CisgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgICBNRi5nZXRNYWNoaW5lTWVtT3BlcmFuZChQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhGSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZDo6TU9TdG9yZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RTaXplKEZJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RBbGlnbm1lbnQoRkkpKTsKKyAgICBBZGREZWZhdWx0UHJlZChCdWlsZE1JKE1CQiwgSSwgREwsIGdldChBUk06OnQyU1RSaTEyKSkKKyAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpCisgICAgICAgICAgICAgICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpLmFkZEltbSgwKS5hZGRNZW1PcGVyYW5kKE1NTykpOworICAgIHJldHVybjsKKyAgfQorCisgIEFSTUJhc2VJbnN0ckluZm86OnN0b3JlUmVnVG9TdGFja1Nsb3QoTUJCLCBJLCBTcmNSZWcsIGlzS2lsbCwgRkksIFJDLCBUUkkpOworfQorCit2b2lkIFRodW1iMkluc3RySW5mbzo6Citsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgaWYgKFJDID09IEFSTTo6R1BSUmVnaXN0ZXJDbGFzcyAgIHx8IFJDID09IEFSTTo6dEdQUlJlZ2lzdGVyQ2xhc3MgfHwKKyAgICAgIFJDID09IEFSTTo6dGNHUFJSZWdpc3RlckNsYXNzIHx8IFJDID09IEFSTTo6ckdQUlJlZ2lzdGVyQ2xhc3MpIHsKKyAgICBEZWJ1Z0xvYyBETDsKKyAgICBpZiAoSSAhPSBNQkIuZW5kKCkpIERMID0gSS0+Z2V0RGVidWdMb2MoKTsKKworICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICAgIE1hY2hpbmVGcmFtZUluZm8gJk1GSSA9ICpNRi5nZXRGcmFtZUluZm8oKTsKKyAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PID0KKyAgICAgIE1GLmdldE1hY2hpbmVNZW1PcGVyYW5kKFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKEZJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kOjpNT0xvYWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkkuZ2V0T2JqZWN0U2l6ZShGSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkkuZ2V0T2JqZWN0QWxpZ25tZW50KEZJKSk7CisgICAgQWRkRGVmYXVsdFByZWQoQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQVJNOjp0MkxEUmkxMiksIERlc3RSZWcpCisgICAgICAgICAgICAgICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpLmFkZEltbSgwKS5hZGRNZW1PcGVyYW5kKE1NTykpOworICAgIHJldHVybjsKKyAgfQorCisgIEFSTUJhc2VJbnN0ckluZm86OmxvYWRSZWdGcm9tU3RhY2tTbG90KE1CQiwgSSwgRGVzdFJlZywgRkksIFJDLCBUUkkpOworfQorCitTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgKlRodW1iMkluc3RySW5mbzo6CitDcmVhdGVUYXJnZXRQb3N0UkFIYXphcmRSZWNvZ25pemVyKGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAmSUkpIGNvbnN0IHsKKyAgcmV0dXJuIChTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgKiluZXcgVGh1bWIySGF6YXJkUmVjb2duaXplcihJSSk7Cit9CisKK3ZvaWQgbGx2bTo6ZW1pdFQyUmVnUGx1c0ltbWVkaWF0ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUJCSSwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgQmFzZVJlZywgaW50IE51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCwgdW5zaWduZWQgUHJlZFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZUSUkpIHsKKyAgYm9vbCBpc1N1YiA9IE51bUJ5dGVzIDwgMDsKKyAgaWYgKGlzU3ViKSBOdW1CeXRlcyA9IC1OdW1CeXRlczsKKworICAvLyBJZiBwcm9maXRhYmxlLCB1c2UgYSBtb3Z3IG9yIG1vdnQgdG8gbWF0ZXJpYWxpemUgdGhlIG9mZnNldC4KKyAgLy8gRklYTUU6IFVzZSB0aGUgc2NhdmVuZ2VyIHRvIGdyYWIgYSBzY3JhdGNoIHJlZ2lzdGVyLgorICBpZiAoRGVzdFJlZyAhPSBBUk06OlNQICYmIERlc3RSZWcgIT0gQmFzZVJlZyAmJgorICAgICAgTnVtQnl0ZXMgPj0gNDA5NiAmJgorICAgICAgQVJNX0FNOjpnZXRUMlNPSW1tVmFsKE51bUJ5dGVzKSA9PSAtMSkgeworICAgIGJvb2wgRml0cyA9IGZhbHNlOworICAgIGlmIChOdW1CeXRlcyA8IDY1NTM2KSB7CisgICAgICAvLyBVc2UgYSBtb3Z3IHRvIG1hdGVyaWFsaXplIHRoZSAxNi1iaXQgY29uc3RhbnQuCisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQVJNOjp0Mk1PVmkxNiksIERlc3RSZWcpCisgICAgICAgIC5hZGRJbW0oTnVtQnl0ZXMpCisgICAgICAgIC5hZGRJbW0oKHVuc2lnbmVkKVByZWQpLmFkZFJlZyhQcmVkUmVnKTsKKyAgICAgIEZpdHMgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoKE51bUJ5dGVzICYgMHhmZmZmKSA9PSAwKSB7CisgICAgICAvLyBVc2UgYSBtb3Z0IHRvIG1hdGVyaWFsaXplIHRoZSAzMi1iaXQgY29uc3RhbnQuCisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQVJNOjp0Mk1PVlRpMTYpLCBEZXN0UmVnKQorICAgICAgICAuYWRkUmVnKERlc3RSZWcpCisgICAgICAgIC5hZGRJbW0oTnVtQnl0ZXMgPj4gMTYpCisgICAgICAgIC5hZGRJbW0oKHVuc2lnbmVkKVByZWQpLmFkZFJlZyhQcmVkUmVnKTsKKyAgICAgIEZpdHMgPSB0cnVlOworICAgIH0KKworICAgIGlmIChGaXRzKSB7CisgICAgICBpZiAoaXNTdWIpIHsKKyAgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dDJTVUJyciksIERlc3RSZWcpCisgICAgICAgICAgLmFkZFJlZyhCYXNlUmVnLCBSZWdTdGF0ZTo6S2lsbCkKKyAgICAgICAgICAuYWRkUmVnKERlc3RSZWcsIFJlZ1N0YXRlOjpLaWxsKQorICAgICAgICAgIC5hZGRJbW0oKHVuc2lnbmVkKVByZWQpLmFkZFJlZyhQcmVkUmVnKS5hZGRSZWcoMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQVJNOjp0MkFERHJyKSwgRGVzdFJlZykKKyAgICAgICAgICAuYWRkUmVnKERlc3RSZWcsIFJlZ1N0YXRlOjpLaWxsKQorICAgICAgICAgIC5hZGRSZWcoQmFzZVJlZywgUmVnU3RhdGU6OktpbGwpCisgICAgICAgIC5hZGRJbW0oKHVuc2lnbmVkKVByZWQpLmFkZFJlZyhQcmVkUmVnKS5hZGRSZWcoMCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgd2hpbGUgKE51bUJ5dGVzKSB7CisgICAgdW5zaWduZWQgVGhpc1ZhbCA9IE51bUJ5dGVzOworICAgIHVuc2lnbmVkIE9wYyA9IDA7CisgICAgaWYgKERlc3RSZWcgPT0gQVJNOjpTUCAmJiBCYXNlUmVnICE9IEFSTTo6U1ApIHsKKyAgICAgIC8vIG1vdiBzcCwgcm4uIE5vdGUgdDJNT1ZyIGNhbm5vdCBiZSB1c2VkLgorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dE1PVmdwcjJncHIpLERlc3RSZWcpLmFkZFJlZyhCYXNlUmVnKTsKKyAgICAgIEJhc2VSZWcgPSBBUk06OlNQOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgYm9vbCBIYXNDQ091dCA9IHRydWU7CisgICAgaWYgKEJhc2VSZWcgPT0gQVJNOjpTUCkgeworICAgICAgLy8gc3ViIHNwLCBzcCwgI2ltbTcKKyAgICAgIGlmIChEZXN0UmVnID09IEFSTTo6U1AgJiYgKFRoaXNWYWwgPCAoKDEgPDwgNyktMSkgKiA0KSkgeworICAgICAgICBhc3NlcnQoKFRoaXNWYWwgJiAzKSA9PSAwICYmICJTdGFjayB1cGRhdGUgaXMgbm90IG11bHRpcGxlIG9mIDQ/Iik7CisgICAgICAgIE9wYyA9IGlzU3ViID8gQVJNOjp0U1VCc3BpIDogQVJNOjp0QUREc3BpOworICAgICAgICAvLyBGSVhNRTogRml4IFRodW1iMSBpbW1lZGlhdGUgZW5jb2RpbmcuCisgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChPcGMpLCBEZXN0UmVnKQorICAgICAgICAgIC5hZGRSZWcoQmFzZVJlZykuYWRkSW1tKFRoaXNWYWwvNCk7CisgICAgICAgIE51bUJ5dGVzID0gMDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIHN1YiByZCwgc3AsIHNvX2ltbQorICAgICAgT3BjID0gaXNTdWIgPyBBUk06OnQyU1VCclNQaSA6IEFSTTo6dDJBRERyU1BpOworICAgICAgaWYgKEFSTV9BTTo6Z2V0VDJTT0ltbVZhbChOdW1CeXRlcykgIT0gLTEpIHsKKyAgICAgICAgTnVtQnl0ZXMgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRklYTUU6IE1vdmUgdGhpcyB0byBBUk1BZGRyZXNzaW5nTW9kZXMuaD8KKyAgICAgICAgdW5zaWduZWQgUm90QW10ID0gQ291bnRMZWFkaW5nWmVyb3NfMzIoVGhpc1ZhbCk7CisgICAgICAgIFRoaXNWYWwgPSBUaGlzVmFsICYgQVJNX0FNOjpyb3RyMzIoMHhmZjAwMDAwMFUsIFJvdEFtdCk7CisgICAgICAgIE51bUJ5dGVzICY9IH5UaGlzVmFsOworICAgICAgICBhc3NlcnQoQVJNX0FNOjpnZXRUMlNPSW1tVmFsKFRoaXNWYWwpICE9IC0xICYmCisgICAgICAgICAgICAgICAiQml0IGV4dHJhY3Rpb24gZGlkbid0IHdvcms/Iik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChEZXN0UmVnICE9IEFSTTo6U1AgJiYgQmFzZVJlZyAhPSBBUk06OlNQKTsKKyAgICAgIE9wYyA9IGlzU3ViID8gQVJNOjp0MlNVQnJpIDogQVJNOjp0MkFERHJpOworICAgICAgaWYgKEFSTV9BTTo6Z2V0VDJTT0ltbVZhbChOdW1CeXRlcykgIT0gLTEpIHsKKyAgICAgICAgTnVtQnl0ZXMgPSAwOworICAgICAgfSBlbHNlIGlmIChUaGlzVmFsIDwgNDA5NikgeworICAgICAgICBPcGMgPSBpc1N1YiA/IEFSTTo6dDJTVUJyaTEyIDogQVJNOjp0MkFERHJpMTI7CisgICAgICAgIEhhc0NDT3V0ID0gZmFsc2U7CisgICAgICAgIE51bUJ5dGVzID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZJWE1FOiBNb3ZlIHRoaXMgdG8gQVJNQWRkcmVzc2luZ01vZGVzLmg/CisgICAgICAgIHVuc2lnbmVkIFJvdEFtdCA9IENvdW50TGVhZGluZ1plcm9zXzMyKFRoaXNWYWwpOworICAgICAgICBUaGlzVmFsID0gVGhpc1ZhbCAmIEFSTV9BTTo6cm90cjMyKDB4ZmYwMDAwMDBVLCBSb3RBbXQpOworICAgICAgICBOdW1CeXRlcyAmPSB+VGhpc1ZhbDsKKyAgICAgICAgYXNzZXJ0KEFSTV9BTTo6Z2V0VDJTT0ltbVZhbChUaGlzVmFsKSAhPSAtMSAmJgorICAgICAgICAgICAgICAgIkJpdCBleHRyYWN0aW9uIGRpZG4ndCB3b3JrPyIpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEJ1aWxkIHRoZSBuZXcgQUREIC8gU1VCLgorICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0KKyAgICAgIEFkZERlZmF1bHRQcmVkKEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChPcGMpLCBEZXN0UmVnKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhCYXNlUmVnLCBSZWdTdGF0ZTo6S2lsbCkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRJbW0oVGhpc1ZhbCkpOworICAgIGlmIChIYXNDQ091dCkKKyAgICAgIEFkZERlZmF1bHRDQyhNSUIpOworCisgICAgQmFzZVJlZyA9IERlc3RSZWc7CisgIH0KK30KKworc3RhdGljIHVuc2lnbmVkCituZWdhdGl2ZU9mZnNldE9wY29kZSh1bnNpZ25lZCBvcGNvZGUpCit7CisgIHN3aXRjaCAob3Bjb2RlKSB7CisgIGNhc2UgQVJNOjp0MkxEUmkxMjogICByZXR1cm4gQVJNOjp0MkxEUmk4OworICBjYXNlIEFSTTo6dDJMRFJIaTEyOiAgcmV0dXJuIEFSTTo6dDJMRFJIaTg7CisgIGNhc2UgQVJNOjp0MkxEUkJpMTI6ICByZXR1cm4gQVJNOjp0MkxEUkJpODsKKyAgY2FzZSBBUk06OnQyTERSU0hpMTI6IHJldHVybiBBUk06OnQyTERSU0hpODsKKyAgY2FzZSBBUk06OnQyTERSU0JpMTI6IHJldHVybiBBUk06OnQyTERSU0JpODsKKyAgY2FzZSBBUk06OnQyU1RSaTEyOiAgIHJldHVybiBBUk06OnQyU1RSaTg7CisgIGNhc2UgQVJNOjp0MlNUUkJpMTI6ICByZXR1cm4gQVJNOjp0MlNUUkJpODsKKyAgY2FzZSBBUk06OnQyU1RSSGkxMjogIHJldHVybiBBUk06OnQyU1RSSGk4OworCisgIGNhc2UgQVJNOjp0MkxEUmk4OgorICBjYXNlIEFSTTo6dDJMRFJIaTg6CisgIGNhc2UgQVJNOjp0MkxEUkJpODoKKyAgY2FzZSBBUk06OnQyTERSU0hpODoKKyAgY2FzZSBBUk06OnQyTERSU0JpODoKKyAgY2FzZSBBUk06OnQyU1RSaTg6CisgIGNhc2UgQVJNOjp0MlNUUkJpODoKKyAgY2FzZSBBUk06OnQyU1RSSGk4OgorICAgIHJldHVybiBvcGNvZGU7CisKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQKK3Bvc2l0aXZlT2Zmc2V0T3Bjb2RlKHVuc2lnbmVkIG9wY29kZSkKK3sKKyAgc3dpdGNoIChvcGNvZGUpIHsKKyAgY2FzZSBBUk06OnQyTERSaTg6ICAgcmV0dXJuIEFSTTo6dDJMRFJpMTI7CisgIGNhc2UgQVJNOjp0MkxEUkhpODogIHJldHVybiBBUk06OnQyTERSSGkxMjsKKyAgY2FzZSBBUk06OnQyTERSQmk4OiAgcmV0dXJuIEFSTTo6dDJMRFJCaTEyOworICBjYXNlIEFSTTo6dDJMRFJTSGk4OiByZXR1cm4gQVJNOjp0MkxEUlNIaTEyOworICBjYXNlIEFSTTo6dDJMRFJTQmk4OiByZXR1cm4gQVJNOjp0MkxEUlNCaTEyOworICBjYXNlIEFSTTo6dDJTVFJpODogICByZXR1cm4gQVJNOjp0MlNUUmkxMjsKKyAgY2FzZSBBUk06OnQyU1RSQmk4OiAgcmV0dXJuIEFSTTo6dDJTVFJCaTEyOworICBjYXNlIEFSTTo6dDJTVFJIaTg6ICByZXR1cm4gQVJNOjp0MlNUUkhpMTI7CisKKyAgY2FzZSBBUk06OnQyTERSaTEyOgorICBjYXNlIEFSTTo6dDJMRFJIaTEyOgorICBjYXNlIEFSTTo6dDJMRFJCaTEyOgorICBjYXNlIEFSTTo6dDJMRFJTSGkxMjoKKyAgY2FzZSBBUk06OnQyTERSU0JpMTI6CisgIGNhc2UgQVJNOjp0MlNUUmkxMjoKKyAgY2FzZSBBUk06OnQyU1RSQmkxMjoKKyAgY2FzZSBBUk06OnQyU1RSSGkxMjoKKyAgICByZXR1cm4gb3Bjb2RlOworCisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkCitpbW1lZGlhdGVPZmZzZXRPcGNvZGUodW5zaWduZWQgb3Bjb2RlKQoreworICBzd2l0Y2ggKG9wY29kZSkgeworICBjYXNlIEFSTTo6dDJMRFJzOiAgIHJldHVybiBBUk06OnQyTERSaTEyOworICBjYXNlIEFSTTo6dDJMRFJIczogIHJldHVybiBBUk06OnQyTERSSGkxMjsKKyAgY2FzZSBBUk06OnQyTERSQnM6ICByZXR1cm4gQVJNOjp0MkxEUkJpMTI7CisgIGNhc2UgQVJNOjp0MkxEUlNIczogcmV0dXJuIEFSTTo6dDJMRFJTSGkxMjsKKyAgY2FzZSBBUk06OnQyTERSU0JzOiByZXR1cm4gQVJNOjp0MkxEUlNCaTEyOworICBjYXNlIEFSTTo6dDJTVFJzOiAgIHJldHVybiBBUk06OnQyU1RSaTEyOworICBjYXNlIEFSTTo6dDJTVFJCczogIHJldHVybiBBUk06OnQyU1RSQmkxMjsKKyAgY2FzZSBBUk06OnQyU1RSSHM6ICByZXR1cm4gQVJNOjp0MlNUUkhpMTI7CisKKyAgY2FzZSBBUk06OnQyTERSaTEyOgorICBjYXNlIEFSTTo6dDJMRFJIaTEyOgorICBjYXNlIEFSTTo6dDJMRFJCaTEyOgorICBjYXNlIEFSTTo6dDJMRFJTSGkxMjoKKyAgY2FzZSBBUk06OnQyTERSU0JpMTI6CisgIGNhc2UgQVJNOjp0MlNUUmkxMjoKKyAgY2FzZSBBUk06OnQyU1RSQmkxMjoKKyAgY2FzZSBBUk06OnQyU1RSSGkxMjoKKyAgY2FzZSBBUk06OnQyTERSaTg6CisgIGNhc2UgQVJNOjp0MkxEUkhpODoKKyAgY2FzZSBBUk06OnQyTERSQmk4OgorICBjYXNlIEFSTTo6dDJMRFJTSGk4OgorICBjYXNlIEFSTTo6dDJMRFJTQmk4OgorICBjYXNlIEFSTTo6dDJTVFJpODoKKyAgY2FzZSBBUk06OnQyU1RSQmk4OgorICBjYXNlIEFSTTo6dDJTVFJIaTg6CisgICAgcmV0dXJuIG9wY29kZTsKKworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgbGx2bTo6cmV3cml0ZVQyRnJhbWVJbmRleChNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBGcmFtZVJlZ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGcmFtZVJlZywgaW50ICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVJNQmFzZUluc3RySW5mbyAmVElJKSB7CisgIHVuc2lnbmVkIE9wY29kZSA9IE1JLmdldE9wY29kZSgpOworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJkRlc2MgPSBNSS5nZXREZXNjKCk7CisgIHVuc2lnbmVkIEFkZHJNb2RlID0gKERlc2MuVFNGbGFncyAmIEFSTUlJOjpBZGRyTW9kZU1hc2spOworICBib29sIGlzU3ViID0gZmFsc2U7CisKKyAgLy8gTWVtb3J5IG9wZXJhbmRzIGluIGlubGluZSBhc3NlbWJseSBhbHdheXMgdXNlIEFkZHJNb2RlVDJfaTEyLgorICBpZiAoT3Bjb2RlID09IEFSTTo6SU5MSU5FQVNNKQorICAgIEFkZHJNb2RlID0gQVJNSUk6OkFkZHJNb2RlVDJfaTEyOyAvLyBGSVhNRS4gbW9kZSBmb3IgdGh1bWIyPworCisgIGlmIChPcGNvZGUgPT0gQVJNOjp0MkFERHJpIHx8IE9wY29kZSA9PSBBUk06OnQyQUREcmkxMikgeworICAgIE9mZnNldCArPSBNSS5nZXRPcGVyYW5kKEZyYW1lUmVnSWR4KzEpLmdldEltbSgpOworCisgICAgdW5zaWduZWQgUHJlZFJlZzsKKyAgICBpZiAoT2Zmc2V0ID09IDAgJiYgZ2V0SW5zdHJQcmVkaWNhdGUoJk1JLCBQcmVkUmVnKSA9PSBBUk1DQzo6QUwpIHsKKyAgICAgIC8vIFR1cm4gaXQgaW50byBhIG1vdmUuCisgICAgICBNSS5zZXREZXNjKFRJSS5nZXQoQVJNOjp0TU9WZ3ByMmdwcikpOworICAgICAgTUkuZ2V0T3BlcmFuZChGcmFtZVJlZ0lkeCkuQ2hhbmdlVG9SZWdpc3RlcihGcmFtZVJlZywgZmFsc2UpOworICAgICAgLy8gUmVtb3ZlIG9mZnNldCBhbmQgcmVtYWluaW5nIGV4cGxpY2l0IHByZWRpY2F0ZSBvcGVyYW5kcy4KKyAgICAgIGRvIE1JLlJlbW92ZU9wZXJhbmQoRnJhbWVSZWdJZHgrMSk7CisgICAgICB3aGlsZSAoTUkuZ2V0TnVtT3BlcmFuZHMoKSA+IEZyYW1lUmVnSWR4KzEgJiYKKyAgICAgICAgICAgICAoIU1JLmdldE9wZXJhbmQoRnJhbWVSZWdJZHgrMSkuaXNSZWcoKSB8fAorICAgICAgICAgICAgICAhTUkuZ2V0T3BlcmFuZChGcmFtZVJlZ0lkeCsxKS5pc0ltbSgpKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGlzU1AgPSBGcmFtZVJlZyA9PSBBUk06OlNQOworICAgIGJvb2wgSGFzQ0NPdXQgPSBPcGNvZGUgIT0gQVJNOjp0MkFERHJpMTI7CisKKyAgICBpZiAoT2Zmc2V0IDwgMCkgeworICAgICAgT2Zmc2V0ID0gLU9mZnNldDsKKyAgICAgIGlzU3ViID0gdHJ1ZTsKKyAgICAgIE1JLnNldERlc2MoVElJLmdldChpc1NQID8gQVJNOjp0MlNVQnJTUGkgOiBBUk06OnQyU1VCcmkpKTsKKyAgICB9IGVsc2UgeworICAgICAgTUkuc2V0RGVzYyhUSUkuZ2V0KGlzU1AgPyBBUk06OnQyQUREclNQaSA6IEFSTTo6dDJBRERyaSkpOworICAgIH0KKworICAgIC8vIENvbW1vbiBjYXNlOiBzbWFsbCBvZmZzZXQsIGZpdHMgaW50byBpbnN0cnVjdGlvbi4KKyAgICBpZiAoQVJNX0FNOjpnZXRUMlNPSW1tVmFsKE9mZnNldCkgIT0gLTEpIHsKKyAgICAgIE1JLmdldE9wZXJhbmQoRnJhbWVSZWdJZHgpLkNoYW5nZVRvUmVnaXN0ZXIoRnJhbWVSZWcsIGZhbHNlKTsKKyAgICAgIE1JLmdldE9wZXJhbmQoRnJhbWVSZWdJZHgrMSkuQ2hhbmdlVG9JbW1lZGlhdGUoT2Zmc2V0KTsKKyAgICAgIC8vIEFkZCBjY19vdXQgb3BlcmFuZCBpZiB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gZGlkIG5vdCBoYXZlIG9uZS4KKyAgICAgIGlmICghSGFzQ0NPdXQpCisgICAgICAgIE1JLmFkZE9wZXJhbmQoTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZygwLCBmYWxzZSkpOworICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBBbm90aGVyIGNvbW1vbiBjYXNlOiBpbW0xMi4KKyAgICBpZiAoT2Zmc2V0IDwgNDA5NiAmJgorICAgICAgICAoIUhhc0NDT3V0IHx8IE1JLmdldE9wZXJhbmQoTUkuZ2V0TnVtT3BlcmFuZHMoKS0xKS5nZXRSZWcoKSA9PSAwKSkgeworICAgICAgdW5zaWduZWQgTmV3T3BjID0gaXNTUAorICAgICAgICA/IChpc1N1YiA/IEFSTTo6dDJTVUJyU1BpMTIgOiBBUk06OnQyQUREclNQaTEyKQorICAgICAgICA6IChpc1N1YiA/IEFSTTo6dDJTVUJyaTEyICAgOiBBUk06OnQyQUREcmkxMik7CisgICAgICBNSS5zZXREZXNjKFRJSS5nZXQoTmV3T3BjKSk7CisgICAgICBNSS5nZXRPcGVyYW5kKEZyYW1lUmVnSWR4KS5DaGFuZ2VUb1JlZ2lzdGVyKEZyYW1lUmVnLCBmYWxzZSk7CisgICAgICBNSS5nZXRPcGVyYW5kKEZyYW1lUmVnSWR4KzEpLkNoYW5nZVRvSW1tZWRpYXRlKE9mZnNldCk7CisgICAgICAvLyBSZW1vdmUgdGhlIGNjX291dCBvcGVyYW5kLgorICAgICAgaWYgKEhhc0NDT3V0KQorICAgICAgICBNSS5SZW1vdmVPcGVyYW5kKE1JLmdldE51bU9wZXJhbmRzKCktMSk7CisgICAgICBPZmZzZXQgPSAwOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBleHRyYWN0IDggYWRqYWNlbnQgYml0cyBmcm9tIHRoZSBpbW1lZGlhdGUgaW50byB0aGlzCisgICAgLy8gdDJBRERyaS90MlNVQnJpLgorICAgIHVuc2lnbmVkIFJvdEFtdCA9IENvdW50TGVhZGluZ1plcm9zXzMyKE9mZnNldCk7CisgICAgdW5zaWduZWQgVGhpc0ltbVZhbCA9IE9mZnNldCAmIEFSTV9BTTo6cm90cjMyKDB4ZmYwMDAwMDBVLCBSb3RBbXQpOworCisgICAgLy8gV2Ugd2lsbCBoYW5kbGUgdGhlc2UgYml0cyBmcm9tIG9mZnNldCwgY2xlYXIgdGhlbS4KKyAgICBPZmZzZXQgJj0gflRoaXNJbW1WYWw7CisKKyAgICBhc3NlcnQoQVJNX0FNOjpnZXRUMlNPSW1tVmFsKFRoaXNJbW1WYWwpICE9IC0xICYmCisgICAgICAgICAgICJCaXQgZXh0cmFjdGlvbiBkaWRuJ3Qgd29yaz8iKTsKKyAgICBNSS5nZXRPcGVyYW5kKEZyYW1lUmVnSWR4KzEpLkNoYW5nZVRvSW1tZWRpYXRlKFRoaXNJbW1WYWwpOworICAgIC8vIEFkZCBjY19vdXQgb3BlcmFuZCBpZiB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gZGlkIG5vdCBoYXZlIG9uZS4KKyAgICBpZiAoIUhhc0NDT3V0KQorICAgICAgTUkuYWRkT3BlcmFuZChNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKDAsIGZhbHNlKSk7CisKKyAgfSBlbHNlIHsKKworICAgIC8vIEFkZHJNb2RlNCBhbmQgQWRkck1vZGU2IGNhbm5vdCBoYW5kbGUgYW55IG9mZnNldC4KKyAgICBpZiAoQWRkck1vZGUgPT0gQVJNSUk6OkFkZHJNb2RlNCB8fCBBZGRyTW9kZSA9PSBBUk1JSTo6QWRkck1vZGU2KQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQWRkck1vZGVUMl9zbyBjYW5ub3QgaGFuZGxlIGFueSBvZmZzZXQuIElmIHRoZXJlIGlzIG5vIG9mZnNldAorICAgIC8vIHJlZ2lzdGVyIHRoZW4gd2UgY2hhbmdlIHRvIGFuIGltbWVkaWF0ZSB2ZXJzaW9uLgorICAgIHVuc2lnbmVkIE5ld09wYyA9IE9wY29kZTsKKyAgICBpZiAoQWRkck1vZGUgPT0gQVJNSUk6OkFkZHJNb2RlVDJfc28pIHsKKyAgICAgIHVuc2lnbmVkIE9mZnNldFJlZyA9IE1JLmdldE9wZXJhbmQoRnJhbWVSZWdJZHgrMSkuZ2V0UmVnKCk7CisgICAgICBpZiAoT2Zmc2V0UmVnICE9IDApIHsKKyAgICAgICAgTUkuZ2V0T3BlcmFuZChGcmFtZVJlZ0lkeCkuQ2hhbmdlVG9SZWdpc3RlcihGcmFtZVJlZywgZmFsc2UpOworICAgICAgICByZXR1cm4gT2Zmc2V0ID09IDA7CisgICAgICB9CisKKyAgICAgIE1JLlJlbW92ZU9wZXJhbmQoRnJhbWVSZWdJZHgrMSk7CisgICAgICBNSS5nZXRPcGVyYW5kKEZyYW1lUmVnSWR4KzEpLkNoYW5nZVRvSW1tZWRpYXRlKDApOworICAgICAgTmV3T3BjID0gaW1tZWRpYXRlT2Zmc2V0T3Bjb2RlKE9wY29kZSk7CisgICAgICBBZGRyTW9kZSA9IEFSTUlJOjpBZGRyTW9kZVQyX2kxMjsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBOdW1CaXRzID0gMDsKKyAgICB1bnNpZ25lZCBTY2FsZSA9IDE7CisgICAgaWYgKEFkZHJNb2RlID09IEFSTUlJOjpBZGRyTW9kZVQyX2k4IHx8IEFkZHJNb2RlID09IEFSTUlJOjpBZGRyTW9kZVQyX2kxMikgeworICAgICAgLy8gaTggc3VwcG9ydHMgb25seSBuZWdhdGl2ZSwgYW5kIGkxMiBzdXBwb3J0cyBvbmx5IHBvc2l0aXZlLCBzbworICAgICAgLy8gYmFzZWQgb24gT2Zmc2V0IHNpZ24gY29udmVydCBPcGNvZGUgdG8gdGhlIGFwcHJvcHJpYXRlCisgICAgICAvLyBpbnN0cnVjdGlvbgorICAgICAgT2Zmc2V0ICs9IE1JLmdldE9wZXJhbmQoRnJhbWVSZWdJZHgrMSkuZ2V0SW1tKCk7CisgICAgICBpZiAoT2Zmc2V0IDwgMCkgeworICAgICAgICBOZXdPcGMgPSBuZWdhdGl2ZU9mZnNldE9wY29kZShPcGNvZGUpOworICAgICAgICBOdW1CaXRzID0gODsKKyAgICAgICAgaXNTdWIgPSB0cnVlOworICAgICAgICBPZmZzZXQgPSAtT2Zmc2V0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTmV3T3BjID0gcG9zaXRpdmVPZmZzZXRPcGNvZGUoT3Bjb2RlKTsKKyAgICAgICAgTnVtQml0cyA9IDEyOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoQWRkck1vZGUgPT0gQVJNSUk6OkFkZHJNb2RlNSkgeworICAgICAgLy8gVkZQIGFkZHJlc3MgbW9kZS4KKyAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZPZmZPcCA9IE1JLmdldE9wZXJhbmQoRnJhbWVSZWdJZHgrMSk7CisgICAgICBpbnQgSW5zdHJPZmZzID0gQVJNX0FNOjpnZXRBTTVPZmZzZXQoT2ZmT3AuZ2V0SW1tKCkpOworICAgICAgaWYgKEFSTV9BTTo6Z2V0QU01T3AoT2ZmT3AuZ2V0SW1tKCkpID09IEFSTV9BTTo6c3ViKQorICAgICAgICBJbnN0ck9mZnMgKj0gLTE7CisgICAgICBOdW1CaXRzID0gODsKKyAgICAgIFNjYWxlID0gNDsKKyAgICAgIE9mZnNldCArPSBJbnN0ck9mZnMgKiA0OworICAgICAgYXNzZXJ0KChPZmZzZXQgJiAoU2NhbGUtMSkpID09IDAgJiYgIkNhbid0IGVuY29kZSB0aGlzIG9mZnNldCEiKTsKKyAgICAgIGlmIChPZmZzZXQgPCAwKSB7CisgICAgICAgIE9mZnNldCA9IC1PZmZzZXQ7CisgICAgICAgIGlzU3ViID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgYWRkcmVzc2luZyBtb2RlISIpOworICAgIH0KKworICAgIGlmIChOZXdPcGMgIT0gT3Bjb2RlKQorICAgICAgTUkuc2V0RGVzYyhUSUkuZ2V0KE5ld09wYykpOworCisgICAgTWFjaGluZU9wZXJhbmQgJkltbU9wID0gTUkuZ2V0T3BlcmFuZChGcmFtZVJlZ0lkeCsxKTsKKworICAgIC8vIEF0dGVtcHQgdG8gZm9sZCBhZGRyZXNzIGNvbXB1dGF0aW9uCisgICAgLy8gQ29tbW9uIGNhc2U6IHNtYWxsIG9mZnNldCwgZml0cyBpbnRvIGluc3RydWN0aW9uLgorICAgIGludCBJbW1lZE9mZnNldCA9IE9mZnNldCAvIFNjYWxlOworICAgIHVuc2lnbmVkIE1hc2sgPSAoMSA8PCBOdW1CaXRzKSAtIDE7CisgICAgaWYgKCh1bnNpZ25lZClPZmZzZXQgPD0gTWFzayAqIFNjYWxlKSB7CisgICAgICAvLyBSZXBsYWNlIHRoZSBGcmFtZUluZGV4IHdpdGggZnAvc3AKKyAgICAgIE1JLmdldE9wZXJhbmQoRnJhbWVSZWdJZHgpLkNoYW5nZVRvUmVnaXN0ZXIoRnJhbWVSZWcsIGZhbHNlKTsKKyAgICAgIGlmIChpc1N1YikgeworICAgICAgICBpZiAoQWRkck1vZGUgPT0gQVJNSUk6OkFkZHJNb2RlNSkKKyAgICAgICAgICAvLyBGSVhNRTogTm90IGNvbnNpc3RlbnQuCisgICAgICAgICAgSW1tZWRPZmZzZXQgfD0gMSA8PCBOdW1CaXRzOworICAgICAgICBlbHNlCisgICAgICAgICAgSW1tZWRPZmZzZXQgPSAtSW1tZWRPZmZzZXQ7CisgICAgICB9CisgICAgICBJbW1PcC5DaGFuZ2VUb0ltbWVkaWF0ZShJbW1lZE9mZnNldCk7CisgICAgICBPZmZzZXQgPSAwOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBvZmZzZXQgZG9lc24ndCBmaXQuIFB1bGwgaW4gd2hhdCB3ZSBjYW4gdG8gc2ltcGxpZnkKKyAgICBJbW1lZE9mZnNldCA9IEltbWVkT2Zmc2V0ICYgTWFzazsKKyAgICBpZiAoaXNTdWIpIHsKKyAgICAgIGlmIChBZGRyTW9kZSA9PSBBUk1JSTo6QWRkck1vZGU1KQorICAgICAgICAvLyBGSVhNRTogTm90IGNvbnNpc3RlbnQuCisgICAgICAgIEltbWVkT2Zmc2V0IHw9IDEgPDwgTnVtQml0czsKKyAgICAgIGVsc2UgeworICAgICAgICBJbW1lZE9mZnNldCA9IC1JbW1lZE9mZnNldDsKKyAgICAgICAgaWYgKEltbWVkT2Zmc2V0ID09IDApCisgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBvcGNvZGUgYmFjayBpZiB0aGUgZW5jb2RlZCBvZmZzZXQgaXMgemVyby4KKyAgICAgICAgICBNSS5zZXREZXNjKFRJSS5nZXQocG9zaXRpdmVPZmZzZXRPcGNvZGUoTmV3T3BjKSkpOworICAgICAgfQorICAgIH0KKyAgICBJbW1PcC5DaGFuZ2VUb0ltbWVkaWF0ZShJbW1lZE9mZnNldCk7CisgICAgT2Zmc2V0ICY9IH4oTWFzaypTY2FsZSk7CisgIH0KKworICBPZmZzZXQgPSAoaXNTdWIpID8gLU9mZnNldCA6IE9mZnNldDsKKyAgcmV0dXJuIE9mZnNldCA9PSAwOworfQorCisvLy8gc2NoZWR1bGVUd29BZGRyU291cmNlIC0gU2NoZWR1bGUgdGhlIGNvcHkgLyByZS1tYXQgb2YgdGhlIHNvdXJjZSBvZiB0aGUKKy8vLyB0d28tYWRkcnNzIGluc3RydWN0aW9uIGluc2VydGVkIGJ5IHR3by1hZGRyZXNzIHBhc3MuCit2b2lkCitUaHVtYjJJbnN0ckluZm86OnNjaGVkdWxlVHdvQWRkclNvdXJjZShNYWNoaW5lSW5zdHIgKlNyY01JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpVc2VNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdCB7CisgIGlmIChTcmNNSS0+Z2V0T3Bjb2RlKCkgIT0gQVJNOjp0TU9WZ3ByMmdwciB8fAorICAgICAgU3JjTUktPmdldE9wZXJhbmQoMSkuaXNLaWxsKCkpCisgICAgcmV0dXJuOworCisgIHVuc2lnbmVkIFByZWRSZWcgPSAwOworICBBUk1DQzo6Q29uZENvZGVzIENDID0gbGx2bTo6Z2V0SW5zdHJQcmVkaWNhdGUoVXNlTUksIFByZWRSZWcpOworICBpZiAoQ0MgPT0gQVJNQ0M6OkFMIHx8IFByZWRSZWcgIT0gQVJNOjpDUFNSKQorICAgIHJldHVybjsKKworICAvLyBTY2hlZHVsZSB0aGUgY29weSBzbyBpdCBkb2Vzbid0IGNvbWUgYmV0d2VlbiBwcmV2aW91cyBpbnN0cnVjdGlvbnMKKyAgLy8gYW5kIFVzZU1JIHdoaWNoIGNhbiBmb3JtIGFuIElUIGJsb2NrLgorICB1bnNpZ25lZCBTcmNSZWcgPSBTcmNNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgQVJNQ0M6OkNvbmRDb2RlcyBPQ0MgPSBBUk1DQzo6Z2V0T3Bwb3NpdGVDb25kaXRpb24oQ0MpOworICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gVXNlTUktPmdldFBhcmVudCgpOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IFNyY01JOworICB1bnNpZ25lZCBOdW1JbnN0cyA9IDA7CisgIHdoaWxlICgtLU1CQkkgIT0gTUJCLT5iZWdpbigpKSB7CisgICAgaWYgKE1CQkktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisKKyAgICBNYWNoaW5lSW5zdHIgKk5NSSA9ICYqTUJCSTsKKyAgICBBUk1DQzo6Q29uZENvZGVzIE5DQyA9IGxsdm06OmdldEluc3RyUHJlZGljYXRlKE5NSSwgUHJlZFJlZyk7CisgICAgaWYgKCEoTkNDID09IENDIHx8IE5DQyA9PSBPQ0MpIHx8CisgICAgICAgIE5NSS0+bW9kaWZpZXNSZWdpc3RlcihTcmNSZWcsICZUUkkpIHx8CisgICAgICAgIE5NSS0+ZGVmaW5lc1JlZ2lzdGVyKEFSTTo6Q1BTUikpCisgICAgICBicmVhazsKKyAgICBpZiAoKytOdW1JbnN0cyA9PSA0KQorICAgICAgLy8gVG9vIG1hbnkgaW4gYSByb3chCisgICAgICByZXR1cm47CisgIH0KKworICBpZiAoTnVtSW5zdHMpIHsKKyAgICBNQkItPnJlbW92ZShTcmNNSSk7CisgICAgTUJCLT5pbnNlcnQoKytNQkJJLCBTcmNNSSk7CisgIH0KK30KKworQVJNQ0M6OkNvbmRDb2RlcworbGx2bTo6Z2V0SVRJbnN0clByZWRpY2F0ZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCAmUHJlZFJlZykgeworICB1bnNpZ25lZCBPcGMgPSBNSS0+Z2V0T3Bjb2RlKCk7CisgIGlmIChPcGMgPT0gQVJNOjp0QmNjIHx8IE9wYyA9PSBBUk06OnQyQmNjKQorICAgIHJldHVybiBBUk1DQzo6QUw7CisgIHJldHVybiBsbHZtOjpnZXRJbnN0clByZWRpY2F0ZShNSSwgUHJlZFJlZyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJJbnN0ckluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMkluc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOWY4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJJbnN0ckluZm8uaApAQCAtMCwwICsxLDg2IEBACisvLz09PS0gVGh1bWIySW5zdHJJbmZvLmggLSBUaHVtYi0yIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgVGh1bWItMiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVEhVTUIySU5TVFJVQ1RJT05JTkZPX0gKKyNkZWZpbmUgVEhVTUIySU5TVFJVQ1RJT05JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTUluc3RySW5mby5oIgorI2luY2x1ZGUgIlRodW1iMlJlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBBUk1TdWJ0YXJnZXQ7CitjbGFzcyBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXI7CisKK2NsYXNzIFRodW1iMkluc3RySW5mbyA6IHB1YmxpYyBBUk1CYXNlSW5zdHJJbmZvIHsKKyAgVGh1bWIyUmVnaXN0ZXJJbmZvIFJJOworcHVibGljOgorICBleHBsaWNpdCBUaHVtYjJJbnN0ckluZm8oY29uc3QgQVJNU3VidGFyZ2V0ICZTVEkpOworCisgIC8vIFJldHVybiB0aGUgbm9uLXByZS9wb3N0IGluY3JlbWVudGluZyB2ZXJzaW9uIG9mICdPcGMnLiBSZXR1cm4gMAorICAvLyBpZiB0aGVyZSBpcyBub3Qgc3VjaCBhbiBvcGNvZGUuCisgIHVuc2lnbmVkIGdldFVuaW5kZXhlZE9wY29kZSh1bnNpZ25lZCBPcGMpIGNvbnN0OworCisgIHZvaWQgUmVwbGFjZVRhaWxXaXRoQnJhbmNoVG8oTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk5ld0Rlc3QpIGNvbnN0OworCisgIGJvb2wgaXNMZWdhbFRvU3BsaXRNQkJBdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkpIGNvbnN0OworCisgIGJvb2wgaXNQcm9maXRhYmxlVG9JZkN2dChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCB1bnNpZ25lZCBOdW1JbnN0cnMpIGNvbnN0OworICAKKyAgYm9vbCBpc1Byb2ZpdGFibGVUb0lmQ3Z0KE1hY2hpbmVCYXNpY0Jsb2NrICZUTUJCLCB1bnNpZ25lZCBOdW1USW5zdHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJkZNQkIsIHVuc2lnbmVkIE51bUZJbnN0cnMpIGNvbnN0OworCisgIHZvaWQgY29weVBoeXNSZWcoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgIGJvb2wgS2lsbFNyYykgY29uc3Q7CisKKyAgdm9pZCBzdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgdm9pZCBsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICAvLy8gc2NoZWR1bGVUd29BZGRyU291cmNlIC0gU2NoZWR1bGUgdGhlIGNvcHkgLyByZS1tYXQgb2YgdGhlIHNvdXJjZSBvZiB0aGUKKyAgLy8vIHR3by1hZGRyc3MgaW5zdHJ1Y3Rpb24gaW5zZXJ0ZWQgYnkgdHdvLWFkZHJlc3MgcGFzcy4KKyAgdm9pZCBzY2hlZHVsZVR3b0FkZHJTb3VyY2UoTWFjaGluZUluc3RyICpTcmNNSSwgTWFjaGluZUluc3RyICpVc2VNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIGNvbnN0OworCisgIC8vLyBnZXRSZWdpc3RlckluZm8gLSBUYXJnZXRJbnN0ckluZm8gaXMgYSBzdXBlcnNldCBvZiBNUmVnaXN0ZXIgaW5mby4gIEFzCisgIC8vLyBzdWNoLCB3aGVuZXZlciBhIGNsaWVudCBoYXMgYW4gaW5zdGFuY2Ugb2YgaW5zdHJ1Y3Rpb24gaW5mbywgaXQgc2hvdWxkCisgIC8vLyBhbHdheXMgYmUgYWJsZSB0byBnZXQgcmVnaXN0ZXIgaW5mbyBhcyB3ZWxsICh0aHJvdWdoIHRoaXMgbWV0aG9kKS4KKyAgLy8vCisgIGNvbnN0IFRodW1iMlJlZ2lzdGVySW5mbyAmZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeyByZXR1cm4gUkk7IH0KKworICBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgKgorICBDcmVhdGVUYXJnZXRQb3N0UkFIYXphcmRSZWNvZ25pemVyKGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAmSUkpIGNvbnN0OworfTsKKworLy8vIGdldElUSW5zdHJQcmVkaWNhdGUgLSBWYWxpZCBvbmx5IGluIFRodW1iMiBtb2RlLiBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbAorLy8vIHRvIGxsdm06OmdldEluc3RyUHJlZGljYXRlIGV4Y2VwdCBpdCByZXR1cm5zIEFMIGZvciBjb25kaXRpb25hbCBicmFuY2gKKy8vLyBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlICJwcmVkaWNhdGVkIiwgYnV0IGFyZSBub3QgaW4gSVQgYmxvY2tzLgorQVJNQ0M6OkNvbmRDb2RlcyBnZXRJVEluc3RyUHJlZGljYXRlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkICZQcmVkUmVnKTsKKworCit9CisKKyNlbmRpZiAvLyBUSFVNQjJJTlNUUlVDVElPTklORk9fSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BUk0vVGh1bWIyUmVnaXN0ZXJJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMlJlZ2lzdGVySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkZDBiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMlJlZ2lzdGVySW5mby5jcHAKQEAgLTAsMCArMSw2MiBAQAorLy89PT0tIFRodW1iMlJlZ2lzdGVySW5mby5jcHAgLSBUaHVtYi0yIFJlZ2lzdGVyIEluZm9ybWF0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFRodW1iLTIgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbworLy8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkFSTS5oIgorI2luY2x1ZGUgIkFSTUFkZHJlc3NpbmdNb2Rlcy5oIgorI2luY2x1ZGUgIkFSTUJhc2VJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJBUk1NYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAiQVJNU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiVGh1bWIySW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiVGh1bWIyUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGh1bWIyUmVnaXN0ZXJJbmZvOjpUaHVtYjJSZWdpc3RlckluZm8oY29uc3QgQVJNQmFzZUluc3RySW5mbyAmdGlpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVJNU3VidGFyZ2V0ICZzdGkpCisgIDogQVJNQmFzZVJlZ2lzdGVySW5mbyh0aWksIHN0aSkgeworfQorCisvLy8gZW1pdExvYWRDb25zdFBvb2wgLSBFbWl0cyBhIGxvYWQgZnJvbSBjb25zdHBvb2wgdG8gbWF0ZXJpYWxpemUgdGhlCisvLy8gc3BlY2lmaWVkIGltbWVkaWF0ZS4KK3ZvaWQgVGh1bWIyUmVnaXN0ZXJJbmZvOjplbWl0TG9hZENvbnN0UG9vbChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTdWJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Q29uZENvZGVzIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHJlZFJlZykgY29uc3QgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUNvbnN0YW50UG9vbCAqQ29uc3RhbnRQb29sID0gTUYuZ2V0Q29uc3RhbnRQb29sKCk7CisgIGNvbnN0IENvbnN0YW50ICpDID0gQ29uc3RhbnRJbnQ6OmdldCgKKyAgICAgICAgICAgVHlwZTo6Z2V0SW50MzJUeShNQkIuZ2V0UGFyZW50KCktPmdldEZ1bmN0aW9uKCktPmdldENvbnRleHQoKSksIFZhbCk7CisgIHVuc2lnbmVkIElkeCA9IENvbnN0YW50UG9vbC0+Z2V0Q29uc3RhbnRQb29sSW5kZXgoQywgNCk7CisKKyAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFSTTo6dDJMRFJwY2kpKQorICAgIC5hZGRSZWcoRGVzdFJlZywgZ2V0RGVmUmVnU3RhdGUodHJ1ZSksIFN1YklkeCkKKyAgICAuYWRkQ29uc3RhbnRQb29sSW5kZXgoSWR4KS5hZGRJbW0oKGludDY0X3QpQVJNQ0M6OkFMKS5hZGRSZWcoMCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJSZWdpc3RlckluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMlJlZ2lzdGVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzY2YyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJSZWdpc3RlckluZm8uaApAQCAtMCwwICsxLDQyIEBACisvLz09PS0gVGh1bWIyUmVnaXN0ZXJJbmZvLmggLSBUaHVtYi0yIFJlZ2lzdGVyIEluZm9ybWF0aW9uIEltcGwgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgVGh1bWItMiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvCisvLyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFRIVU1CMlJFR0lTVEVSSU5GT19ICisjZGVmaW5lIFRIVU1CMlJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1SZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBUk1TdWJ0YXJnZXQ7CisgIGNsYXNzIEFSTUJhc2VJbnN0ckluZm87CisgIGNsYXNzIFR5cGU7CisKK3N0cnVjdCBUaHVtYjJSZWdpc3RlckluZm8gOiBwdWJsaWMgQVJNQmFzZVJlZ2lzdGVySW5mbyB7CitwdWJsaWM6CisgIFRodW1iMlJlZ2lzdGVySW5mbyhjb25zdCBBUk1CYXNlSW5zdHJJbmZvICZ0aWksIGNvbnN0IEFSTVN1YnRhcmdldCAmU1RJKTsKKworICAvLy8gZW1pdExvYWRDb25zdFBvb2wgLSBFbWl0cyBhIGxvYWQgZnJvbSBjb25zdHBvb2wgdG8gbWF0ZXJpYWxpemUgdGhlCisgIC8vLyBzcGVjaWZpZWQgaW1tZWRpYXRlLgorICB2b2lkIGVtaXRMb2FkQ29uc3RQb29sKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFN1YklkeCwgaW50IFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBUk1DQzo6Q29uZENvZGVzIFByZWQgPSBBUk1DQzo6QUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHJlZFJlZyA9IDApIGNvbnN0OworfTsKK30KKworI2VuZGlmIC8vIFRIVU1CMlJFR0lTVEVSSU5GT19ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJTaXplUmVkdWN0aW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQVJNL1RodW1iMlNpemVSZWR1Y3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTFjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FSTS9UaHVtYjJTaXplUmVkdWN0aW9uLmNwcApAQCAtMCwwICsxLDcyOSBAQAorLy89PT0tLSBUaHVtYjJTaXplUmVkdWN0aW9uLmNwcCAtIFRodW1iMiBjb2RlIHNpemUgcmVkdWN0aW9uIHBhc3MgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJ0Mi1yZWR1Y2Utc2l6ZSIKKyNpbmNsdWRlICJBUk0uaCIKKyNpbmNsdWRlICJBUk1BZGRyZXNzaW5nTW9kZXMuaCIKKyNpbmNsdWRlICJBUk1CYXNlUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAiQVJNQmFzZUluc3RySW5mby5oIgorI2luY2x1ZGUgIlRodW1iMkluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtTmFycm93cywgICJOdW1iZXIgb2YgMzItYml0IGluc3RycyByZWR1Y2VkIHRvIDE2LWJpdCBvbmVzIik7CitTVEFUSVNUSUMoTnVtMkFkZHJzLCAgICJOdW1iZXIgb2YgMzItYml0IGluc3RycyByZWR1Y2VkIHRvIDJhZGRyIDE2LWJpdCBvbmVzIik7CitTVEFUSVNUSUMoTnVtTGRTdHMsICAgICJOdW1iZXIgb2YgMzItYml0IGxvYWQgLyBzdG9yZSByZWR1Y2VkIHRvIDE2LWJpdCBvbmVzIik7CisKK3N0YXRpYyBjbDo6b3B0PGludD4gUmVkdWNlTGltaXQoInQyLXJlZHVjZS1saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KC0xKSwgY2w6OkhpZGRlbik7CitzdGF0aWMgY2w6Om9wdDxpbnQ+IFJlZHVjZUxpbWl0MkFkZHIoInQyLXJlZHVjZS1saW1pdDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KC0xKSwgY2w6OkhpZGRlbik7CitzdGF0aWMgY2w6Om9wdDxpbnQ+IFJlZHVjZUxpbWl0TGRTdCgidDItcmVkdWNlLWxpbWl0MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoLTEpLCBjbDo6SGlkZGVuKTsKKworbmFtZXNwYWNlIHsKKyAgLy8vIFJlZHVjZVRhYmxlIC0gQSBzdGF0aWMgdGFibGUgd2l0aCBpbmZvcm1hdGlvbiBvbiBtYXBwaW5nIGZyb20gd2lkZQorICAvLy8gb3Bjb2RlcyB0byBuYXJyb3cKKyAgc3RydWN0IFJlZHVjZUVudHJ5IHsKKyAgICB1bnNpZ25lZCBXaWRlT3BjOyAgICAgIC8vIFdpZGUgb3Bjb2RlCisgICAgdW5zaWduZWQgTmFycm93T3BjMTsgICAvLyBOYXJyb3cgb3Bjb2RlIHRvIHRyYW5zZm9ybSB0bworICAgIHVuc2lnbmVkIE5hcnJvd09wYzI7ICAgLy8gTmFycm93IG9wY29kZSB3aGVuIGl0J3MgdHdvLWFkZHJlc3MKKyAgICB1aW50OF90ICBJbW0xTGltaXQ7ICAgIC8vIExpbWl0IG9mIGltbWVkaWF0ZSBmaWVsZCAoYml0cykKKyAgICB1aW50OF90ICBJbW0yTGltaXQ7ICAgIC8vIExpbWl0IG9mIGltbWVkaWF0ZSBmaWVsZCB3aGVuIGl0J3MgdHdvLWFkZHJlc3MKKyAgICB1bnNpZ25lZCBMb3dSZWdzMSA6IDE7IC8vIE9ubHkgcG9zc2libGUgaWYgbG93LXJlZ2lzdGVycyBhcmUgdXNlZAorICAgIHVuc2lnbmVkIExvd1JlZ3MyIDogMTsgLy8gT25seSBwb3NzaWJsZSBpZiBsb3ctcmVnaXN0ZXJzIGFyZSB1c2VkICgyYWRkcikKKyAgICB1bnNpZ25lZCBQcmVkQ0MxICA6IDI7IC8vIDAgLSBJZiBwcmVkaWNhdGVkLCBjYyBpcyBvbiBhbmQgdmljZSB2ZXJzYS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSBObyBjYyBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgLSBBbHdheXMgc2V0IENQU1IuCisgICAgdW5zaWduZWQgUHJlZENDMiAgOiAyOworICAgIHVuc2lnbmVkIFNwZWNpYWwgIDogMTsgLy8gTmVlZHMgdG8gYmUgZGVhbHQgd2l0aCBzcGVjaWFsbHkKKyAgfTsKKworICBzdGF0aWMgY29uc3QgUmVkdWNlRW50cnkgUmVkdWNlVGFibGVbXSA9IHsKKyAgICAvLyBXaWRlLCAgICAgICAgTmFycm93MSwgICAgICBOYXJyb3cyLCAgICAgaW1tMSxpbW0yLCAgbG8xLCBsbzIsIFAvQywgUworICAgIHsgQVJNOjp0MkFEQ3JyLCAwLCAgICAgICAgICAgIEFSTTo6dEFEQywgICAgIDAsICAgMCwgICAgMCwgICAxLCAgMCwwLCAwIH0sCisgICAgeyBBUk06OnQyQUREcmksIEFSTTo6dEFERGkzLCAgQVJNOjp0QUREaTgsICAgMywgICA4LCAgICAxLCAgIDEsICAwLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJBRERyciwgQVJNOjp0QUREcnIsICBBUk06OnRBRERoaXJyLCAwLCAgIDAsICAgIDEsICAgMCwgIDAsMSwgMCB9LAorICAgIC8vIE5vdGU6IGltbWVkaWF0ZSBzY2FsZSBpcyA0LgorICAgIHsgQVJNOjp0MkFERHJTUGksQVJNOjp0QUREclNQaSwwLCAgICAgICAgICAgIDgsICAgMCwgICAgMSwgICAwLCAgMSwwLCAwIH0sCisgICAgeyBBUk06OnQyQUREU3JpLEFSTTo6dEFERGkzLCAgQVJNOjp0QUREaTgsICAgMywgICA4LCAgICAxLCAgIDEsICAyLDIsIDEgfSwKKyAgICB7IEFSTTo6dDJBRERTcnIsQVJNOjp0QUREcnIsICAwLCAgICAgICAgICAgICAwLCAgIDAsICAgIDEsICAgMCwgIDIsMCwgMSB9LAorICAgIHsgQVJNOjp0MkFORHJyLCAwLCAgICAgICAgICAgIEFSTTo6dEFORCwgICAgIDAsICAgMCwgICAgMCwgICAxLCAgMCwwLCAwIH0sCisgICAgeyBBUk06OnQyQVNScmksIEFSTTo6dEFTUnJpLCAgMCwgICAgICAgICAgICAgNSwgICAwLCAgICAxLCAgIDAsICAwLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJBU1JyciwgMCwgICAgICAgICAgICBBUk06OnRBU1JyciwgICAwLCAgIDAsICAgIDAsICAgMSwgIDAsMCwgMCB9LAorICAgIHsgQVJNOjp0MkJJQ3JyLCAwLCAgICAgICAgICAgIEFSTTo6dEJJQywgICAgIDAsICAgMCwgICAgMCwgICAxLCAgMCwwLCAwIH0sCisgICAgLy9GSVhNRTogRGlzYWJsZSBDTU4sIGFzIENDb2RlcyBhcmUgYmFja3dhcmRzIGZyb20gY29tcGFyZSBleHBlY3RhdGlvbnMKKyAgICAvL3sgQVJNOjp0MkNNTnJyLCBBUk06OnRDTU4sICAgIDAsICAgICAgICAgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMiwwLCAwIH0sCisgICAgeyBBUk06OnQyQ01QcmksIEFSTTo6dENNUGk4LCAgMCwgICAgICAgICAgICAgOCwgICAwLCAgICAxLCAgIDAsICAyLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJDTVByciwgQVJNOjp0Q01QaGlyLCAwLCAgICAgICAgICAgICAwLCAgIDAsICAgIDAsICAgMCwgIDIsMCwgMCB9LAorICAgIHsgQVJNOjp0MkNNUHpyaSxBUk06OnRDTVB6aTgsIDAsICAgICAgICAgICAgIDgsICAgMCwgICAgMSwgICAwLCAgMiwwLCAwIH0sCisgICAgeyBBUk06OnQyQ01QenJyLEFSTTo6dENNUHpoaXIsMCwgICAgICAgICAgICAgMCwgICAwLCAgICAwLCAgIDAsICAyLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJFT1JyciwgMCwgICAgICAgICAgICBBUk06OnRFT1IsICAgICAwLCAgIDAsICAgIDAsICAgMSwgIDAsMCwgMCB9LAorICAgIC8vIEZJWE1FOiBhZHIubiBpbW1lZGlhdGUgb2Zmc2V0IG11c3QgYmUgbXVsdGlwbGUgb2YgNC4KKyAgICAvL3sgQVJNOjp0MkxFQXBjcmVsSlQsQVJNOjp0TEVBcGNyZWxKVCwgMCwgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMSwwLCAwIH0sCisgICAgeyBBUk06OnQyTFNMcmksIEFSTTo6dExTTHJpLCAgMCwgICAgICAgICAgICAgNSwgICAwLCAgICAxLCAgIDAsICAwLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJMU0xyciwgMCwgICAgICAgICAgICBBUk06OnRMU0xyciwgICAwLCAgIDAsICAgIDAsICAgMSwgIDAsMCwgMCB9LAorICAgIHsgQVJNOjp0MkxTUnJpLCBBUk06OnRMU1JyaSwgIDAsICAgICAgICAgICAgIDUsICAgMCwgICAgMSwgICAwLCAgMCwwLCAwIH0sCisgICAgeyBBUk06OnQyTFNScnIsIDAsICAgICAgICAgICAgQVJNOjp0TFNScnIsICAgMCwgICAwLCAgICAwLCAgIDEsICAwLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJNT1ZpLCAgQVJNOjp0TU9WaTgsICAwLCAgICAgICAgICAgICA4LCAgIDAsICAgIDEsICAgMCwgIDAsMCwgMCB9LAorICAgIHsgQVJNOjp0Mk1PVmkxNixBUk06OnRNT1ZpOCwgIDAsICAgICAgICAgICAgIDgsICAgMCwgICAgMSwgICAwLCAgMCwwLCAxIH0sCisgICAgLy8gRklYTUU6IERvIHdlIG5lZWQgdGhlIDE2LWJpdCAnUycgdmFyaWFudD8KKyAgICB7IEFSTTo6dDJNT1ZyLEFSTTo6dE1PVmdwcjJncHIsMCwgICAgICAgICAgICAwLCAgIDAsICAgIDAsICAgMCwgIDEsMCwgMCB9LAorICAgIHsgQVJNOjp0Mk1PVkNDciwwLCAgICAgICAgICAgIEFSTTo6dE1PVkNDciwgIDAsICAgMCwgICAgMCwgICAwLCAgMCwxLCAwIH0sCisgICAgeyBBUk06OnQyTU9WQ0NpLDAsICAgICAgICAgICAgQVJNOjp0TU9WQ0NpLCAgMCwgICA4LCAgICAwLCAgIDEsICAwLDEsIDAgfSwKKyAgICB7IEFSTTo6dDJNVUwsICAgMCwgICAgICAgICAgICBBUk06OnRNVUwsICAgICAwLCAgIDAsICAgIDAsICAgMSwgIDAsMCwgMCB9LAorICAgIHsgQVJNOjp0Mk1WTnIsICBBUk06OnRNVk4sICAgIDAsICAgICAgICAgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMCwwLCAwIH0sCisgICAgeyBBUk06OnQyT1JScnIsIDAsICAgICAgICAgICAgQVJNOjp0T1JSLCAgICAgMCwgICAwLCAgICAwLCAgIDEsICAwLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJSRVYsICAgQVJNOjp0UkVWLCAgICAwLCAgICAgICAgICAgICAwLCAgIDAsICAgIDEsICAgMCwgIDEsMCwgMCB9LAorICAgIHsgQVJNOjp0MlJFVjE2LCBBUk06OnRSRVYxNiwgIDAsICAgICAgICAgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMSwwLCAwIH0sCisgICAgeyBBUk06OnQyUkVWU0gsIEFSTTo6dFJFVlNILCAgMCwgICAgICAgICAgICAgMCwgICAwLCAgICAxLCAgIDAsICAxLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJST1JyciwgMCwgICAgICAgICAgICBBUk06OnRST1IsICAgICAwLCAgIDAsICAgIDAsICAgMSwgIDAsMCwgMCB9LAorICAgIHsgQVJNOjp0MlJTQnJpLCBBUk06OnRSU0IsICAgIDAsICAgICAgICAgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMCwwLCAxIH0sCisgICAgeyBBUk06OnQyUlNCU3JpLEFSTTo6dFJTQiwgICAgMCwgICAgICAgICAgICAgMCwgICAwLCAgICAxLCAgIDAsICAyLDAsIDEgfSwKKyAgICB7IEFSTTo6dDJTQkNyciwgMCwgICAgICAgICAgICBBUk06OnRTQkMsICAgICAwLCAgIDAsICAgIDAsICAgMSwgIDAsMCwgMCB9LAorICAgIHsgQVJNOjp0MlNVQnJpLCBBUk06OnRTVUJpMywgIEFSTTo6dFNVQmk4LCAgIDMsICAgOCwgICAgMSwgICAxLCAgMCwwLCAwIH0sCisgICAgeyBBUk06OnQyU1VCcnIsIEFSTTo6dFNVQnJyLCAgMCwgICAgICAgICAgICAgMCwgICAwLCAgICAxLCAgIDAsICAwLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJTVUJTcmksQVJNOjp0U1VCaTMsICBBUk06OnRTVUJpOCwgICAzLCAgIDgsICAgIDEsICAgMSwgIDIsMiwgMCB9LAorICAgIHsgQVJNOjp0MlNVQlNycixBUk06OnRTVUJyciwgIDAsICAgICAgICAgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMiwwLCAwIH0sCisgICAgeyBBUk06OnQyU1hUQnIsIEFSTTo6dFNYVEIsICAgMCwgICAgICAgICAgICAgMCwgICAwLCAgICAxLCAgIDAsICAxLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJTWFRIciwgQVJNOjp0U1hUSCwgICAwLCAgICAgICAgICAgICAwLCAgIDAsICAgIDEsICAgMCwgIDEsMCwgMCB9LAorICAgIHsgQVJNOjp0MlRTVHJyLCBBUk06OnRUU1QsICAgIDAsICAgICAgICAgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMiwwLCAwIH0sCisgICAgeyBBUk06OnQyVVhUQnIsIEFSTTo6dFVYVEIsICAgMCwgICAgICAgICAgICAgMCwgICAwLCAgICAxLCAgIDAsICAxLDAsIDAgfSwKKyAgICB7IEFSTTo6dDJVWFRIciwgQVJNOjp0VVhUSCwgICAwLCAgICAgICAgICAgICAwLCAgIDAsICAgIDEsICAgMCwgIDEsMCwgMCB9LAorCisgICAgLy8gRklYTUU6IENsZWFuIHRoaXMgdXAgYWZ0ZXIgc3BsaXR0aW5nIGVhY2ggVGh1bWIgbG9hZCAvIHN0b3JlIG9wY29kZQorICAgIC8vIGludG8gbXVsdGlwbGUgb25lcy4KKyAgICB7IEFSTTo6dDJMRFJpMTIsQVJNOjp0TERSLCAgICBBUk06OnRMRFJzcGksICA1LCAgIDgsICAgIDEsICAgMCwgIDAsMCwgMSB9LAorICAgIHsgQVJNOjp0MkxEUnMsICBBUk06OnRMRFIsICAgIDAsICAgICAgICAgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMCwwLCAxIH0sCisgICAgeyBBUk06OnQyTERSQmkxMixBUk06OnRMRFJCLCAgMCwgICAgICAgICAgICAgNSwgICAwLCAgICAxLCAgIDAsICAwLDAsIDEgfSwKKyAgICB7IEFSTTo6dDJMRFJCcywgQVJNOjp0TERSQiwgICAwLCAgICAgICAgICAgICAwLCAgIDAsICAgIDEsICAgMCwgIDAsMCwgMSB9LAorICAgIHsgQVJNOjp0MkxEUkhpMTIsQVJNOjp0TERSSCwgIDAsICAgICAgICAgICAgIDUsICAgMCwgICAgMSwgICAwLCAgMCwwLCAxIH0sCisgICAgeyBBUk06OnQyTERSSHMsIEFSTTo6dExEUkgsICAgMCwgICAgICAgICAgICAgMCwgICAwLCAgICAxLCAgIDAsICAwLDAsIDEgfSwKKyAgICB7IEFSTTo6dDJMRFJTQnMsQVJNOjp0TERSU0IsICAwLCAgICAgICAgICAgICAwLCAgIDAsICAgIDEsICAgMCwgIDAsMCwgMSB9LAorICAgIHsgQVJNOjp0MkxEUlNIcyxBUk06OnRMRFJTSCwgIDAsICAgICAgICAgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMCwwLCAxIH0sCisgICAgeyBBUk06OnQyU1RSaTEyLEFSTTo6dFNUUiwgICAgQVJNOjp0U1RSc3BpLCAgNSwgICA4LCAgICAxLCAgIDAsICAwLDAsIDEgfSwKKyAgICB7IEFSTTo6dDJTVFJzLCAgQVJNOjp0U1RSLCAgICAwLCAgICAgICAgICAgICAwLCAgIDAsICAgIDEsICAgMCwgIDAsMCwgMSB9LAorICAgIHsgQVJNOjp0MlNUUkJpMTIsQVJNOjp0U1RSQiwgIDAsICAgICAgICAgICAgIDUsICAgMCwgICAgMSwgICAwLCAgMCwwLCAxIH0sCisgICAgeyBBUk06OnQyU1RSQnMsIEFSTTo6dFNUUkIsICAgMCwgICAgICAgICAgICAgMCwgICAwLCAgICAxLCAgIDAsICAwLDAsIDEgfSwKKyAgICB7IEFSTTo6dDJTVFJIaTEyLEFSTTo6dFNUUkgsICAwLCAgICAgICAgICAgICA1LCAgIDAsICAgIDEsICAgMCwgIDAsMCwgMSB9LAorICAgIHsgQVJNOjp0MlNUUkhzLCBBUk06OnRTVFJILCAgIDAsICAgICAgICAgICAgIDAsICAgMCwgICAgMSwgICAwLCAgMCwwLCAxIH0sCisKKyAgICB7IEFSTTo6dDJMRE0sICAgQVJNOjp0TERNLCAgICAwLCAgICAgICAgICAgICAwLCAgIDAsICAgIDEsICAgMSwgIDEsMSwgMSB9LAorICAgIHsgQVJNOjp0MkxETV9SRVQsMCwgICAgICAgICAgIEFSTTo6dFBPUF9SRVQsIDAsICAgMCwgICAgMSwgICAxLCAgMSwxLCAxIH0sCisgICAgeyBBUk06OnQyTERNX1VQRCxBUk06OnRMRE1fVVBELEFSTTo6dFBPUCwgICAgMCwgICAwLCAgICAxLCAgIDEsICAxLDEsIDEgfSwKKyAgICAvLyBBUk06OnQyU1RNICh3aXRoIG5vIGJhc2VyZWcgd3JpdGViYWNrKSBoYXMgbm8gVGh1bWIxIGVxdWl2YWxlbnQKKyAgICB7IEFSTTo6dDJTVE1fVVBELEFSTTo6dFNUTV9VUEQsQVJNOjp0UFVTSCwgICAwLCAgIDAsICAgIDEsICAgMSwgIDEsMSwgMSB9LAorICB9OworCisgIGNsYXNzIFRodW1iMlNpemVSZWR1Y2UgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBUaHVtYjJTaXplUmVkdWNlKCk7CisKKyAgICBjb25zdCBUaHVtYjJJbnN0ckluZm8gKlRJSTsKKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIlRodW1iMiBpbnN0cnVjdGlvbiBzaXplIHJlZHVjdGlvbiBwYXNzIjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gUmVkdWNlT3Bjb2RlTWFwIC0gTWFwcyB3aWRlIG9wY29kZSB0byBpbmRleCBvZiBlbnRyeSBpbiBSZWR1Y2VUYWJsZS4KKyAgICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+IFJlZHVjZU9wY29kZU1hcDsKKworICAgIGJvb2wgVmVyaWZ5UHJlZEFuZENDKE1hY2hpbmVJbnN0ciAqTUksIGNvbnN0IFJlZHVjZUVudHJ5ICZFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzMkFkZHIsIEFSTUNDOjpDb25kQ29kZXMgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExpdmVDUFNSLCBib29sICZIYXNDQywgYm9vbCAmQ0NEZWFkKTsKKworICAgIGJvb2wgUmVkdWNlTG9hZFN0b3JlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVkdWNlRW50cnkgJkVudHJ5KTsKKworICAgIGJvb2wgUmVkdWNlU3BlY2lhbChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWR1Y2VFbnRyeSAmRW50cnksIGJvb2wgTGl2ZUNQU1IpOworCisgICAgLy8vIFJlZHVjZVRvMkFkZHIgLSBSZWR1Y2UgYSAzMi1iaXQgaW5zdHJ1Y3Rpb24gdG8gYSAxNi1iaXQgdHdvLWFkZHJlc3MKKyAgICAvLy8gaW5zdHJ1Y3Rpb24uCisgICAgYm9vbCBSZWR1Y2VUbzJBZGRyKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZHVjZUVudHJ5ICZFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMaXZlQ1BTUik7CisKKyAgICAvLy8gUmVkdWNlVG9OYXJyb3cgLSBSZWR1Y2UgYSAzMi1iaXQgaW5zdHJ1Y3Rpb24gdG8gYSAxNi1iaXQKKyAgICAvLy8gbm9uLXR3by1hZGRyZXNzIGluc3RydWN0aW9uLgorICAgIGJvb2wgUmVkdWNlVG9OYXJyb3coTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZHVjZUVudHJ5ICZFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTGl2ZUNQU1IpOworCisgICAgLy8vIFJlZHVjZU1CQiAtIFJlZHVjZSB3aWR0aCBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jay4KKyAgICBib29sIFJlZHVjZU1CQihNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKyAgfTsKKyAgY2hhciBUaHVtYjJTaXplUmVkdWNlOjpJRCA9IDA7Cit9CisKK1RodW1iMlNpemVSZWR1Y2U6OlRodW1iMlNpemVSZWR1Y2UoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGFycmF5X2xlbmd0aG9mKFJlZHVjZVRhYmxlKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBGcm9tT3BjID0gUmVkdWNlVGFibGVbaV0uV2lkZU9wYzsKKyAgICBpZiAoIVJlZHVjZU9wY29kZU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoRnJvbU9wYywgaSkpLnNlY29uZCkKKyAgICAgIGFzc2VydChmYWxzZSAmJiAiRHVwbGljYXRlZCBlbnRyaWVzPyIpOworICB9Cit9CisKK3N0YXRpYyBib29sIEhhc0ltcGxpY2l0Q1BTUkRlZihjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCkgeworICBmb3IgKGNvbnN0IHVuc2lnbmVkICpSZWdzID0gVElELkltcGxpY2l0RGVmczsgKlJlZ3M7ICsrUmVncykKKyAgICBpZiAoKlJlZ3MgPT0gQVJNOjpDUFNSKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbAorVGh1bWIyU2l6ZVJlZHVjZTo6VmVyaWZ5UHJlZEFuZENDKE1hY2hpbmVJbnN0ciAqTUksIGNvbnN0IFJlZHVjZUVudHJ5ICZFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzMkFkZHIsIEFSTUNDOjpDb25kQ29kZXMgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExpdmVDUFNSLCBib29sICZIYXNDQywgYm9vbCAmQ0NEZWFkKSB7CisgIGlmICgoaXMyQWRkciAgJiYgRW50cnkuUHJlZENDMiA9PSAwKSB8fAorICAgICAgKCFpczJBZGRyICYmIEVudHJ5LlByZWRDQzEgPT0gMCkpIHsKKyAgICBpZiAoUHJlZCA9PSBBUk1DQzo6QUwpIHsKKyAgICAgIC8vIE5vdCBwcmVkaWNhdGVkLCBtdXN0IHNldCBDUFNSLgorICAgICAgaWYgKCFIYXNDQykgeworICAgICAgICAvLyBPcmlnaW5hbCBpbnN0cnVjdGlvbiB3YXMgbm90IHNldHRpbmcgQ1BTUiwgYnV0IENQU1IgaXMgbm90CisgICAgICAgIC8vIGN1cnJlbnRseSBsaXZlIGFueXdheS4gSXQncyBvayB0byBzZXQgaXQuIFRoZSBDUFNSIGRlZiBpcworICAgICAgICAvLyBkZWFkIHRob3VnaC4KKyAgICAgICAgaWYgKCFMaXZlQ1BTUikgeworICAgICAgICAgIEhhc0NDID0gdHJ1ZTsKKyAgICAgICAgICBDQ0RlYWQgPSB0cnVlOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gUHJlZGljYXRlZCwgbXVzdCBub3Qgc2V0IENQU1IuCisgICAgICBpZiAoSGFzQ0MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoKGlzMkFkZHIgICYmIEVudHJ5LlByZWRDQzIgPT0gMikgfHwKKyAgICAgICAgICAgICAoIWlzMkFkZHIgJiYgRW50cnkuUHJlZENDMSA9PSAyKSkgeworICAgIC8vLyBPbGQgb3Bjb2RlIGhhcyBhbiBvcHRpb25hbCBkZWYgb2YgQ1BTUi4KKyAgICBpZiAoSGFzQ0MpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBJZiBib3RoIG9sZCBvcGNvZGUgZG9lcyBub3QgaW1wbGljaXQgQ1BTUiBkZWYsIHRoZW4gaXQncyBub3Qgb2sgc2luY2UKKyAgICAvLyB0aGVzZSBuZXcgb3Bjb2RlcyBDUFNSIGRlZiBpcyBub3QgbWVhbnQgdG8gYmUgdGhyb3duIGF3YXkuIGUuZy4gQ01QLgorICAgIGlmICghSGFzSW1wbGljaXRDUFNSRGVmKE1JLT5nZXREZXNjKCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIEhhc0NDID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICAvLyAxNi1iaXQgaW5zdHJ1Y3Rpb24gZG9lcyBub3Qgc2V0IENQU1IuCisgICAgaWYgKEhhc0NDKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFZlcmlmeUxvd1JlZ3MoTWFjaGluZUluc3RyICpNSSkgeworICB1bnNpZ25lZCBPcGMgPSBNSS0+Z2V0T3Bjb2RlKCk7CisgIGJvb2wgaXNQQ09rID0gKE9wYyA9PSBBUk06OnQyTERNX1JFVCB8fCBPcGMgPT0gQVJNOjp0MkxETSB8fAorICAgICAgICAgICAgICAgICBPcGMgPT0gQVJNOjp0MkxETV9VUEQpOworICBib29sIGlzTFJPayA9IChPcGMgPT0gQVJNOjp0MlNUTV9VUEQpOworICBib29sIGlzU1BPayA9IGlzUENPayB8fCBpc0xST2sgfHwgKE9wYyA9PSBBUk06OnQyQUREclNQaSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgTU8uaXNJbXBsaWNpdCgpKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKFJlZyA9PSAwIHx8IFJlZyA9PSBBUk06OkNQU1IpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoaXNQQ09rICYmIFJlZyA9PSBBUk06OlBDKQorICAgICAgY29udGludWU7CisgICAgaWYgKGlzTFJPayAmJiBSZWcgPT0gQVJNOjpMUikKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChSZWcgPT0gQVJNOjpTUCkgeworICAgICAgaWYgKGlzU1BPaykKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoaSA9PSAxICYmIChPcGMgPT0gQVJNOjp0MkxEUmkxMiB8fCBPcGMgPT0gQVJNOjp0MlNUUmkxMikpCisgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlc2UgbGRyIC8gc3RyIHdpdGggc3AgYXMgYmFzZSByZWdpc3Rlci4KKyAgICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghaXNBUk1Mb3dSZWdpc3RlcihSZWcpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sCitUaHVtYjJTaXplUmVkdWNlOjpSZWR1Y2VMb2FkU3RvcmUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWR1Y2VFbnRyeSAmRW50cnkpIHsKKyAgaWYgKFJlZHVjZUxpbWl0TGRTdCAhPSAtMSAmJiAoKGludClOdW1MZFN0cyA+PSBSZWR1Y2VMaW1pdExkU3QpKQorICAgIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCBTY2FsZSA9IDE7CisgIGJvb2wgSGFzSW1tT2Zmc2V0ID0gZmFsc2U7CisgIGJvb2wgSGFzU2hpZnQgPSBmYWxzZTsKKyAgYm9vbCBIYXNPZmZSZWcgPSB0cnVlOworICBib29sIGlzTGRTdE11bCA9IGZhbHNlOworICB1bnNpZ25lZCBPcGMgPSBFbnRyeS5OYXJyb3dPcGMxOworICB1bnNpZ25lZCBPcE51bSA9IDM7IC8vIEZpcnN0ICdyZXN0JyBvZiBvcGVyYW5kcy4KKyAgdWludDhfdCAgSW1tTGltaXQgPSBFbnRyeS5JbW0xTGltaXQ7CisgIHN3aXRjaCAoRW50cnkuV2lkZU9wYykgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgVGh1bWIyIGxvYWQgLyBzdG9yZSBvcGNvZGUhIik7CisgIGNhc2UgQVJNOjp0MkxEUmkxMjoKKyAgY2FzZSBBUk06OnQyU1RSaTEyOiB7CisgICAgdW5zaWduZWQgQmFzZVJlZyA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgIGlmIChCYXNlUmVnID09IEFSTTo6U1ApIHsKKyAgICAgIE9wYyA9IEVudHJ5Lk5hcnJvd09wYzI7CisgICAgICBJbW1MaW1pdCA9IEVudHJ5LkltbTJMaW1pdDsKKyAgICAgIEhhc09mZlJlZyA9IGZhbHNlOworICAgIH0KKyAgICBTY2FsZSA9IDQ7CisgICAgSGFzSW1tT2Zmc2V0ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFSTTo6dDJMRFJCaTEyOgorICBjYXNlIEFSTTo6dDJTVFJCaTEyOgorICAgIEhhc0ltbU9mZnNldCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjp0MkxEUkhpMTI6CisgIGNhc2UgQVJNOjp0MlNUUkhpMTI6CisgICAgU2NhbGUgPSAyOworICAgIEhhc0ltbU9mZnNldCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgQVJNOjp0MkxEUnM6CisgIGNhc2UgQVJNOjp0MkxEUkJzOgorICBjYXNlIEFSTTo6dDJMRFJIczoKKyAgY2FzZSBBUk06OnQyTERSU0JzOgorICBjYXNlIEFSTTo6dDJMRFJTSHM6CisgIGNhc2UgQVJNOjp0MlNUUnM6CisgIGNhc2UgQVJNOjp0MlNUUkJzOgorICBjYXNlIEFSTTo6dDJTVFJIczoKKyAgICBIYXNTaGlmdCA9IHRydWU7CisgICAgT3BOdW0gPSA0OworICAgIGJyZWFrOworICBjYXNlIEFSTTo6dDJMRE06IHsKKyAgICB1bnNpZ25lZCBCYXNlUmVnID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgQVJNX0FNOjpBTVN1Yk1vZGUgTW9kZSA9IEFSTV9BTTo6Z2V0QU00U3ViTW9kZShNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKSk7CisgICAgaWYgKCFpc0FSTUxvd1JlZ2lzdGVyKEJhc2VSZWcpIHx8IE1vZGUgIT0gQVJNX0FNOjppYSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBPcE51bSA9IDA7CisgICAgaXNMZFN0TXVsID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFSTTo6dDJMRE1fUkVUOiB7CisgICAgdW5zaWduZWQgQmFzZVJlZyA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgIGlmIChCYXNlUmVnICE9IEFSTTo6U1ApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgT3BjID0gRW50cnkuTmFycm93T3BjMjsgLy8gdFBPUF9SRVQKKyAgICBPcE51bSA9IDM7CisgICAgaXNMZFN0TXVsID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFSTTo6dDJMRE1fVVBEOgorICBjYXNlIEFSTTo6dDJTVE1fVVBEOiB7CisgICAgT3BOdW0gPSAwOworICAgIHVuc2lnbmVkIEJhc2VSZWcgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICBBUk1fQU06OkFNU3ViTW9kZSBNb2RlID0gQVJNX0FNOjpnZXRBTTRTdWJNb2RlKE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpKTsKKyAgICBpZiAoQmFzZVJlZyA9PSBBUk06OlNQICYmCisgICAgICAgICgoRW50cnkuV2lkZU9wYyA9PSBBUk06OnQyTERNX1VQRCAmJiBNb2RlID09IEFSTV9BTTo6aWEpIHx8CisgICAgICAgICAoRW50cnkuV2lkZU9wYyA9PSBBUk06OnQyU1RNX1VQRCAmJiBNb2RlID09IEFSTV9BTTo6ZGIpKSkgeworICAgICAgT3BjID0gRW50cnkuTmFycm93T3BjMjsgLy8gdFBPUCBvciB0UFVTSAorICAgICAgT3BOdW0gPSAzOworICAgIH0gZWxzZSBpZiAoIWlzQVJNTG93UmVnaXN0ZXIoQmFzZVJlZykgfHwgTW9kZSAhPSBBUk1fQU06OmlhKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlzTGRTdE11bCA9IHRydWU7CisgICAgYnJlYWs7CisgIH0KKyAgfQorCisgIHVuc2lnbmVkIE9mZnNldFJlZyA9IDA7CisgIGJvb2wgT2Zmc2V0S2lsbCA9IGZhbHNlOworICBpZiAoSGFzU2hpZnQpIHsKKyAgICBPZmZzZXRSZWcgID0gTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCk7CisgICAgT2Zmc2V0S2lsbCA9IE1JLT5nZXRPcGVyYW5kKDIpLmlzS2lsbCgpOworICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgzKS5nZXRJbW0oKSkKKyAgICAgIC8vIFRodW1iMSBhZGRyZXNzaW5nIG1vZGUgZG9lc24ndCBzdXBwb3J0IHNoaWZ0LgorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdW5zaWduZWQgT2Zmc2V0SW1tID0gMDsKKyAgaWYgKEhhc0ltbU9mZnNldCkgeworICAgIE9mZnNldEltbSA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgIHVuc2lnbmVkIE1heE9mZnNldCA9ICgoMSA8PCBJbW1MaW1pdCkgLSAxKSAqIFNjYWxlOworICAgIGlmICgoT2Zmc2V0SW1tICYgKFNjYWxlLTEpKSB8fCBPZmZzZXRJbW0gPiBNYXhPZmZzZXQpCisgICAgICAvLyBNYWtlIHN1cmUgdGhlIGltbWVkaWF0ZSBmaWVsZCBmaXRzLgorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQWRkIHRoZSAxNi1iaXQgbG9hZCAvIHN0b3JlIGluc3RydWN0aW9uLgorICAvLyBGSVhNRTogVGh1bWIxIGFkZHJlc3NpbmcgbW9kZSBlbmNvZGUgYm90aCBpbW1lZGlhdGUgYW5kIHJlZ2lzdGVyIG9mZnNldC4KKyAgRGVidWdMb2MgZGwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKE1CQiwgKk1JLCBkbCwgVElJLT5nZXQoT3BjKSk7CisgIGlmICghaXNMZFN0TXVsKSB7CisgICAgTUlCLmFkZE9wZXJhbmQoTUktPmdldE9wZXJhbmQoMCkpLmFkZE9wZXJhbmQoTUktPmdldE9wZXJhbmQoMSkpOworICAgIGlmIChPcGMgIT0gQVJNOjp0TERSU0IgJiYgT3BjICE9IEFSTTo6dExEUlNIKSB7CisgICAgICAvLyB0TERSU0IgYW5kIHRMRFJTSCBkbyBub3QgaGF2ZSBhbiBpbW1lZGlhdGUgb2Zmc2V0IGZpZWxkLiBPbiB0aGUgb3RoZXIKKyAgICAgIC8vIGhhbmQsIGl0IG11c3QgaGF2ZSBhbiBvZmZzZXQgcmVnaXN0ZXIuCisgICAgICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlLgorICAgICAgTUlCLmFkZEltbShPZmZzZXRJbW0vU2NhbGUpOworICAgIH0KKyAgICBhc3NlcnQoKCFIYXNTaGlmdCB8fCBPZmZzZXRSZWcpICYmICJJbnZhbGlkIHNvX3JlZyBsb2FkIC8gc3RvcmUgYWRkcmVzcyEiKTsKKworICAgIGlmIChIYXNPZmZSZWcpCisgICAgICBNSUIuYWRkUmVnKE9mZnNldFJlZywgZ2V0S2lsbFJlZ1N0YXRlKE9mZnNldEtpbGwpKTsKKyAgfQorCisgIC8vIFRyYW5zZmVyIHRoZSByZXN0IG9mIG9wZXJhbmRzLgorICBmb3IgKHVuc2lnbmVkIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgT3BOdW0gIT0gZTsgKytPcE51bSkKKyAgICBNSUIuYWRkT3BlcmFuZChNSS0+Z2V0T3BlcmFuZChPcE51bSkpOworCisgIC8vIFRyYW5zZmVyIG1lbW9wZXJhbmRzLgorICAoKk1JQikuc2V0TWVtUmVmcyhNSS0+bWVtb3BlcmFuZHNfYmVnaW4oKSwgTUktPm1lbW9wZXJhbmRzX2VuZCgpKTsKKworICBERUJVRyhlcnJzKCkgPDwgIkNvbnZlcnRlZCAzMi1iaXQ6ICIgPDwgKk1JIDw8ICIgICAgICAgdG8gMTYtYml0OiAiIDw8ICpNSUIpOworCisgIE1CQi5lcmFzZShNSSk7CisgICsrTnVtTGRTdHM7CisgIHJldHVybiB0cnVlOworfQorCitib29sCitUaHVtYjJTaXplUmVkdWNlOjpSZWR1Y2VTcGVjaWFsKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZHVjZUVudHJ5ICZFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMaXZlQ1BTUikgeworICBpZiAoRW50cnkuTG93UmVnczEgJiYgIVZlcmlmeUxvd1JlZ3MoTUkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgIGlmIChUSUQubWF5TG9hZCgpIHx8IFRJRC5tYXlTdG9yZSgpKQorICAgIHJldHVybiBSZWR1Y2VMb2FkU3RvcmUoTUJCLCBNSSwgRW50cnkpOworCisgIHVuc2lnbmVkIE9wYyA9IE1JLT5nZXRPcGNvZGUoKTsKKyAgc3dpdGNoIChPcGMpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgQVJNOjp0MkFERFNyaTogCisgIGNhc2UgQVJNOjp0MkFERFNycjogeworICAgIHVuc2lnbmVkIFByZWRSZWcgPSAwOworICAgIGlmIChnZXRJbnN0clByZWRpY2F0ZShNSSwgUHJlZFJlZykgPT0gQVJNQ0M6OkFMKSB7CisgICAgICBzd2l0Y2ggKE9wYykgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlIEFSTTo6dDJBRERTcmk6IHsKKyAgICAgICAgaWYgKFJlZHVjZVRvMkFkZHIoTUJCLCBNSSwgRW50cnksIExpdmVDUFNSKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJNOjp0MkFERFNycjoKKyAgICAgICAgcmV0dXJuIFJlZHVjZVRvTmFycm93KE1CQiwgTUksIEVudHJ5LCBMaXZlQ1BTUik7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgQVJNOjp0MlJTQnJpOgorICBjYXNlIEFSTTo6dDJSU0JTcmk6CisgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpID09IDApCisgICAgICByZXR1cm4gUmVkdWNlVG9OYXJyb3coTUJCLCBNSSwgRW50cnksIExpdmVDUFNSKTsKKyAgICBicmVhazsKKyAgY2FzZSBBUk06OnQyTU9WaTE2OgorICAgIC8vIENhbiBjb252ZXJ0IG9ubHkgJ3B1cmUnIGltbWVkaWF0ZSBvcGVyYW5kcywgbm90IGltbWVkaWF0ZXMgb2J0YWluZWQgYXMKKyAgICAvLyBnbG9iYWxzJyBhZGRyZXNzZXMuCisgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDEpLmlzSW1tKCkpCisgICAgICByZXR1cm4gUmVkdWNlVG9OYXJyb3coTUJCLCBNSSwgRW50cnksIExpdmVDUFNSKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wKK1RodW1iMlNpemVSZWR1Y2U6OlJlZHVjZVRvMkFkZHIoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVkdWNlRW50cnkgJkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExpdmVDUFNSKSB7CisKKyAgaWYgKFJlZHVjZUxpbWl0MkFkZHIgIT0gLTEgJiYgKChpbnQpTnVtMkFkZHJzID49IFJlZHVjZUxpbWl0MkFkZHIpKQorICAgIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCBSZWcwID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIFJlZzEgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgaWYgKFJlZzAgIT0gUmVnMSkgeworICAgIC8vIFRyeSB0byBjb21tdXRlIHRoZSBvcGVyYW5kcyB0byBtYWtlIGl0IGEgMi1hZGRyZXNzIGluc3RydWN0aW9uLgorICAgIHVuc2lnbmVkIENvbW1PcElkeDEsIENvbW1PcElkeDI7CisgICAgaWYgKCFUSUktPmZpbmRDb21tdXRlZE9wSW5kaWNlcyhNSSwgQ29tbU9wSWR4MSwgQ29tbU9wSWR4MikgfHwKKyAgICAgICAgQ29tbU9wSWR4MSAhPSAxIHx8IE1JLT5nZXRPcGVyYW5kKENvbW1PcElkeDIpLmdldFJlZygpICE9IFJlZzApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgTWFjaGluZUluc3RyICpDb21tdXRlZE1JID0gVElJLT5jb21tdXRlSW5zdHJ1Y3Rpb24oTUkpOworICAgIGlmICghQ29tbXV0ZWRNSSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoRW50cnkuTG93UmVnczIgJiYgIWlzQVJNTG93UmVnaXN0ZXIoUmVnMCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoRW50cnkuSW1tMkxpbWl0KSB7CisgICAgdW5zaWduZWQgSW1tID0gTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCk7CisgICAgdW5zaWduZWQgTGltaXQgPSAoMSA8PCBFbnRyeS5JbW0yTGltaXQpIC0gMTsKKyAgICBpZiAoSW1tID4gTGltaXQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgdW5zaWduZWQgUmVnMiA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpOworICAgIGlmIChFbnRyeS5Mb3dSZWdzMiAmJiAhaXNBUk1Mb3dSZWdpc3RlcihSZWcyKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIENoZWNrIGlmIGl0J3MgcG9zc2libGUgLyBuZWNlc3NhcnkgdG8gdHJhbnNmZXIgdGhlIHByZWRpY2F0ZS4KKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZOZXdUSUQgPSBUSUktPmdldChFbnRyeS5OYXJyb3dPcGMyKTsKKyAgdW5zaWduZWQgUHJlZFJlZyA9IDA7CisgIEFSTUNDOjpDb25kQ29kZXMgUHJlZCA9IGdldEluc3RyUHJlZGljYXRlKE1JLCBQcmVkUmVnKTsKKyAgYm9vbCBTa2lwUHJlZCA9IGZhbHNlOworICBpZiAoUHJlZCAhPSBBUk1DQzo6QUwpIHsKKyAgICBpZiAoIU5ld1RJRC5pc1ByZWRpY2FibGUoKSkKKyAgICAgIC8vIENhbid0IHRyYW5zZmVyIHByZWRpY2F0ZSwgZmFpbC4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBTa2lwUHJlZCA9ICFOZXdUSUQuaXNQcmVkaWNhYmxlKCk7CisgIH0KKworICBib29sIEhhc0NDID0gZmFsc2U7CisgIGJvb2wgQ0NEZWFkID0gZmFsc2U7CisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUktPmdldERlc2MoKTsKKyAgaWYgKFRJRC5oYXNPcHRpb25hbERlZigpKSB7CisgICAgdW5zaWduZWQgTnVtT3BzID0gVElELmdldE51bU9wZXJhbmRzKCk7CisgICAgSGFzQ0MgPSAoTUktPmdldE9wZXJhbmQoTnVtT3BzLTEpLmdldFJlZygpID09IEFSTTo6Q1BTUik7CisgICAgaWYgKEhhc0NDICYmIE1JLT5nZXRPcGVyYW5kKE51bU9wcy0xKS5pc0RlYWQoKSkKKyAgICAgIENDRGVhZCA9IHRydWU7CisgIH0KKyAgaWYgKCFWZXJpZnlQcmVkQW5kQ0MoTUksIEVudHJ5LCB0cnVlLCBQcmVkLCBMaXZlQ1BTUiwgSGFzQ0MsIENDRGVhZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEFkZCB0aGUgMTYtYml0IGluc3RydWN0aW9uLgorICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQiA9IEJ1aWxkTUkoTUJCLCAqTUksIGRsLCBOZXdUSUQpOworICBNSUIuYWRkT3BlcmFuZChNSS0+Z2V0T3BlcmFuZCgwKSk7CisgIGlmIChOZXdUSUQuaGFzT3B0aW9uYWxEZWYoKSkgeworICAgIGlmIChIYXNDQykKKyAgICAgIEFkZERlZmF1bHRUMUNDKE1JQiwgQ0NEZWFkKTsKKyAgICBlbHNlCisgICAgICBBZGROb1QxQ0MoTUlCKTsKKyAgfQorCisgIC8vIFRyYW5zZmVyIHRoZSByZXN0IG9mIG9wZXJhbmRzLgorICB1bnNpZ25lZCBOdW1PcHMgPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChpIDwgTnVtT3BzICYmIFRJRC5PcEluZm9baV0uaXNPcHRpb25hbERlZigpKQorICAgICAgY29udGludWU7CisgICAgaWYgKFNraXBQcmVkICYmIFRJRC5PcEluZm9baV0uaXNQcmVkaWNhdGUoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIE1JQi5hZGRPcGVyYW5kKE1JLT5nZXRPcGVyYW5kKGkpKTsKKyAgfQorCisgIERFQlVHKGVycnMoKSA8PCAiQ29udmVydGVkIDMyLWJpdDogIiA8PCAqTUkgPDwgIiAgICAgICB0byAxNi1iaXQ6ICIgPDwgKk1JQik7CisKKyAgTUJCLmVyYXNlKE1JKTsKKyAgKytOdW0yQWRkcnM7CisgIHJldHVybiB0cnVlOworfQorCitib29sCitUaHVtYjJTaXplUmVkdWNlOjpSZWR1Y2VUb05hcnJvdyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVkdWNlRW50cnkgJkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMaXZlQ1BTUikgeworICBpZiAoUmVkdWNlTGltaXQgIT0gLTEgJiYgKChpbnQpTnVtTmFycm93cyA+PSBSZWR1Y2VMaW1pdCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIExpbWl0ID0gfjBVOworICB1bnNpZ25lZCBTY2FsZSA9IChFbnRyeS5XaWRlT3BjID09IEFSTTo6dDJBRERyU1BpKSA/IDQgOiAxOworICBpZiAoRW50cnkuSW1tMUxpbWl0KQorICAgIExpbWl0ID0gKCgxIDw8IEVudHJ5LkltbTFMaW1pdCkgLSAxKSAqIFNjYWxlOworCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gTUktPmdldERlc2MoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRJRC5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChUSUQuT3BJbmZvW2ldLmlzUHJlZGljYXRlKCkpCisgICAgICBjb250aW51ZTsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoTU8uaXNSZWcoKSkgeworICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICBpZiAoIVJlZyB8fCBSZWcgPT0gQVJNOjpDUFNSKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChFbnRyeS5XaWRlT3BjID09IEFSTTo6dDJBRERyU1BpICYmIFJlZyA9PSBBUk06OlNQKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChFbnRyeS5Mb3dSZWdzMSAmJiAhaXNBUk1Mb3dSZWdpc3RlcihSZWcpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChNTy5pc0ltbSgpICYmCisgICAgICAgICAgICAgICAhVElELk9wSW5mb1tpXS5pc1ByZWRpY2F0ZSgpKSB7CisgICAgICBpZiAoKCh1bnNpZ25lZClNTy5nZXRJbW0oKSkgPiBMaW1pdCB8fCAoTU8uZ2V0SW1tKCkgJiAoU2NhbGUtMSkpICE9IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBpZiBpdCdzIHBvc3NpYmxlIC8gbmVjZXNzYXJ5IHRvIHRyYW5zZmVyIHRoZSBwcmVkaWNhdGUuCisgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmTmV3VElEID0gVElJLT5nZXQoRW50cnkuTmFycm93T3BjMSk7CisgIHVuc2lnbmVkIFByZWRSZWcgPSAwOworICBBUk1DQzo6Q29uZENvZGVzIFByZWQgPSBnZXRJbnN0clByZWRpY2F0ZShNSSwgUHJlZFJlZyk7CisgIGJvb2wgU2tpcFByZWQgPSBmYWxzZTsKKyAgaWYgKFByZWQgIT0gQVJNQ0M6OkFMKSB7CisgICAgaWYgKCFOZXdUSUQuaXNQcmVkaWNhYmxlKCkpCisgICAgICAvLyBDYW4ndCB0cmFuc2ZlciBwcmVkaWNhdGUsIGZhaWwuCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgU2tpcFByZWQgPSAhTmV3VElELmlzUHJlZGljYWJsZSgpOworICB9CisKKyAgYm9vbCBIYXNDQyA9IGZhbHNlOworICBib29sIENDRGVhZCA9IGZhbHNlOworICBpZiAoVElELmhhc09wdGlvbmFsRGVmKCkpIHsKKyAgICB1bnNpZ25lZCBOdW1PcHMgPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgICBIYXNDQyA9IChNSS0+Z2V0T3BlcmFuZChOdW1PcHMtMSkuZ2V0UmVnKCkgPT0gQVJNOjpDUFNSKTsKKyAgICBpZiAoSGFzQ0MgJiYgTUktPmdldE9wZXJhbmQoTnVtT3BzLTEpLmlzRGVhZCgpKQorICAgICAgQ0NEZWFkID0gdHJ1ZTsKKyAgfQorICBpZiAoIVZlcmlmeVByZWRBbmRDQyhNSSwgRW50cnksIGZhbHNlLCBQcmVkLCBMaXZlQ1BTUiwgSGFzQ0MsIENDRGVhZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEFkZCB0aGUgMTYtYml0IGluc3RydWN0aW9uLgorICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQiA9IEJ1aWxkTUkoTUJCLCAqTUksIGRsLCBOZXdUSUQpOworICBNSUIuYWRkT3BlcmFuZChNSS0+Z2V0T3BlcmFuZCgwKSk7CisgIGlmIChOZXdUSUQuaGFzT3B0aW9uYWxEZWYoKSkgeworICAgIGlmIChIYXNDQykKKyAgICAgIEFkZERlZmF1bHRUMUNDKE1JQiwgQ0NEZWFkKTsKKyAgICBlbHNlCisgICAgICBBZGROb1QxQ0MoTUlCKTsKKyAgfQorCisgIC8vIFRyYW5zZmVyIHRoZSByZXN0IG9mIG9wZXJhbmRzLgorICB1bnNpZ25lZCBOdW1PcHMgPSBUSUQuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChpIDwgTnVtT3BzICYmIFRJRC5PcEluZm9baV0uaXNPcHRpb25hbERlZigpKQorICAgICAgY29udGludWU7CisgICAgaWYgKChUSUQuZ2V0T3Bjb2RlKCkgPT0gQVJNOjp0MlJTQlNyaSB8fAorICAgICAgICAgVElELmdldE9wY29kZSgpID09IEFSTTo6dDJSU0JyaSkgJiYgaSA9PSAyKQorICAgICAgLy8gU2tpcCB0aGUgemVybyBpbW1lZGlhdGUgb3BlcmFuZCwgaXQncyBub3cgaW1wbGljaXQuCisgICAgICBjb250aW51ZTsKKyAgICBib29sIGlzUHJlZCA9IChpIDwgTnVtT3BzICYmIFRJRC5PcEluZm9baV0uaXNQcmVkaWNhdGUoKSk7CisgICAgaWYgKFNraXBQcmVkICYmIGlzUHJlZCkKKyAgICAgICAgY29udGludWU7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKFNjYWxlID4gMSAmJiAhaXNQcmVkICYmIE1PLmlzSW1tKCkpCisgICAgICBNSUIuYWRkSW1tKE1PLmdldEltbSgpIC8gU2NhbGUpOworICAgIGVsc2UgeworICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNJbXBsaWNpdCgpICYmIE1PLmdldFJlZygpID09IEFSTTo6Q1BTUikKKyAgICAgICAgLy8gU2tpcCBpbXBsaWNpdCBkZWYgb2YgQ1BTUi4gRWl0aGVyIGl0J3MgbW9kZWxlZCBhcyBhbiBvcHRpb25hbAorICAgICAgICAvLyBkZWYgbm93IG9yIGl0J3MgYWxyZWFkeSBhbiBpbXBsaWNpdCBkZWYgb24gdGhlIG5ldyBpbnN0cnVjdGlvbi4KKyAgICAgICAgY29udGludWU7CisgICAgICBNSUIuYWRkT3BlcmFuZChNTyk7CisgICAgfQorICB9CisgIGlmICghVElELmlzUHJlZGljYWJsZSgpICYmIE5ld1RJRC5pc1ByZWRpY2FibGUoKSkKKyAgICBBZGREZWZhdWx0UHJlZChNSUIpOworCisgIERFQlVHKGVycnMoKSA8PCAiQ29udmVydGVkIDMyLWJpdDogIiA8PCAqTUkgPDwgIiAgICAgICB0byAxNi1iaXQ6ICIgPDwgKk1JQik7CisKKyAgTUJCLmVyYXNlKE1JKTsKKyAgKytOdW1OYXJyb3dzOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgVXBkYXRlQ1BTUkRlZihNYWNoaW5lSW5zdHIgJk1JLCBib29sIExpdmVDUFNSKSB7CisgIGJvb2wgSGFzRGVmID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmlzVW5kZWYoKSB8fCBNTy5pc1VzZSgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKE1PLmdldFJlZygpICE9IEFSTTo6Q1BTUikKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghTU8uaXNEZWFkKCkpCisgICAgICBIYXNEZWYgPSB0cnVlOworICB9CisKKyAgcmV0dXJuIEhhc0RlZiB8fCBMaXZlQ1BTUjsKK30KKworc3RhdGljIGJvb2wgVXBkYXRlQ1BTUlVzZShNYWNoaW5lSW5zdHIgJk1JLCBib29sIExpdmVDUFNSKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8IE1PLmlzVW5kZWYoKSB8fCBNTy5pc0RlZigpKQorICAgICAgY29udGludWU7CisgICAgaWYgKE1PLmdldFJlZygpICE9IEFSTTo6Q1BTUikKKyAgICAgIGNvbnRpbnVlOworICAgIGFzc2VydChMaXZlQ1BTUiAmJiAiQ1BTUiBsaXZlbmVzcyB0cmFja2luZyBpcyB3cm9uZyEiKTsKKyAgICBpZiAoTU8uaXNLaWxsKCkpIHsKKyAgICAgIExpdmVDUFNSID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gTGl2ZUNQU1I7Cit9CisKK2Jvb2wgVGh1bWIyU2l6ZVJlZHVjZTo6UmVkdWNlTUJCKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIHsKKyAgYm9vbCBNb2RpZmllZCA9IGZhbHNlOworCisgIC8vIFllcywgQ1BTUiBjb3VsZCBiZSBsaXZlaW4uCisgIGJvb2wgTGl2ZUNQU1IgPSBNQkIuaXNMaXZlSW4oQVJNOjpDUFNSKTsKKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUlJID0gTUJCLmJlZ2luKCksIEUgPSBNQkIuZW5kKCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBOZXh0TUlJOworICBmb3IgKDsgTUlJICE9IEU7IE1JSSA9IE5leHRNSUkpIHsKKyAgICBOZXh0TUlJID0gbGx2bTo6bmV4dChNSUkpOworCisgICAgTWFjaGluZUluc3RyICpNSSA9ICYqTUlJOworICAgIExpdmVDUFNSID0gVXBkYXRlQ1BTUlVzZSgqTUksIExpdmVDUFNSKTsKKworICAgIHVuc2lnbmVkIE9wY29kZSA9IE1JLT5nZXRPcGNvZGUoKTsKKyAgICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+OjppdGVyYXRvciBPUEkgPSBSZWR1Y2VPcGNvZGVNYXAuZmluZChPcGNvZGUpOworICAgIGlmIChPUEkgIT0gUmVkdWNlT3Bjb2RlTWFwLmVuZCgpKSB7CisgICAgICBjb25zdCBSZWR1Y2VFbnRyeSAmRW50cnkgPSBSZWR1Y2VUYWJsZVtPUEktPnNlY29uZF07CisgICAgICAvLyBJZ25vcmUgInNwZWNpYWwiIGNhc2VzIGZvciBub3cuCisgICAgICBpZiAoRW50cnkuU3BlY2lhbCkgeworICAgICAgICBpZiAoUmVkdWNlU3BlY2lhbChNQkIsIE1JLCBFbnRyeSwgTGl2ZUNQU1IpKSB7CisgICAgICAgICAgTW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gcHJpb3IoTmV4dE1JSSk7CisgICAgICAgICAgTUkgPSAmKkk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBQcm9jZXNzTmV4dDsKKyAgICAgIH0KKworICAgICAgLy8gVHJ5IHRvIHRyYW5zZm9ybSB0byBhIDE2LWJpdCB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbi4KKyAgICAgIGlmIChFbnRyeS5OYXJyb3dPcGMyICYmIFJlZHVjZVRvMkFkZHIoTUJCLCBNSSwgRW50cnksIExpdmVDUFNSKSkgeworICAgICAgICBNb2RpZmllZCA9IHRydWU7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gcHJpb3IoTmV4dE1JSSk7CisgICAgICAgIE1JID0gJipJOworICAgICAgICBnb3RvIFByb2Nlc3NOZXh0OworICAgICAgfQorCisgICAgICAvLyBUcnkgdG8gdHJhbnNmb3JtIHRvIGEgMTYtYml0IG5vbi10d28tYWRkcmVzcyBpbnN0cnVjdGlvbi4KKyAgICAgIGlmIChFbnRyeS5OYXJyb3dPcGMxICYmIFJlZHVjZVRvTmFycm93KE1CQiwgTUksIEVudHJ5LCBMaXZlQ1BTUikpIHsKKyAgICAgICAgTW9kaWZpZWQgPSB0cnVlOworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IHByaW9yKE5leHRNSUkpOworICAgICAgICBNSSA9ICYqSTsKKyAgICAgIH0KKyAgICB9CisKKyAgUHJvY2Vzc05leHQ6CisgICAgTGl2ZUNQU1IgPSBVcGRhdGVDUFNSRGVmKCpNSSwgTGl2ZUNQU1IpOworICB9CisKKyAgcmV0dXJuIE1vZGlmaWVkOworfQorCitib29sIFRodW1iMlNpemVSZWR1Y2U6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsKKyAgVElJID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGh1bWIySW5zdHJJbmZvKj4oVE0uZ2V0SW5zdHJJbmZvKCkpOworCisgIGJvb2wgTW9kaWZpZWQgPSBmYWxzZTsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIE1vZGlmaWVkIHw9IFJlZHVjZU1CQigqSSk7CisgIHJldHVybiBNb2RpZmllZDsKK30KKworLy8vIGNyZWF0ZVRodW1iMlNpemVSZWR1Y3Rpb25QYXNzIC0gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgVGh1bWIyIHNpemUKKy8vLyByZWR1Y3Rpb24gcGFzcy4KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlVGh1bWIyU2l6ZVJlZHVjdGlvblBhc3MoKSB7CisgIHJldHVybiBuZXcgVGh1bWIyU2l6ZVJlZHVjZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZjQ4NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhLmgKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tLSBBbHBoYS5oIC0gVG9wLWxldmVsIGludGVyZmFjZSBmb3IgQWxwaGEgcmVwcmVzZW50YXRpb24gLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGVudHJ5IHBvaW50cyBmb3IgZ2xvYmFsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBMTFZNCisvLyBBbHBoYSBiYWNrLWVuZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFRBUkdFVF9BTFBIQV9ICisjZGVmaW5lIFRBUkdFVF9BTFBIQV9ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBBbHBoYVRhcmdldE1hY2hpbmU7CisgIGNsYXNzIEZ1bmN0aW9uUGFzczsKKyAgY2xhc3MgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOworCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlQWxwaGFJU2VsRGFnKEFscGhhVGFyZ2V0TWFjaGluZSAmVE0pOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUFscGhhUGF0dGVybkluc3RydWN0aW9uU2VsZWN0b3IoVGFyZ2V0TWFjaGluZSAmVE0pOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUFscGhhSklUQ29kZUVtaXR0ZXJQYXNzKEFscGhhVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJkpDRSk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlQWxwaGFMTFJQUGFzcyhBbHBoYVRhcmdldE1hY2hpbmUgJnRtKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVBbHBoYUJyYW5jaFNlbGVjdGlvblBhc3MoKTsKKworICBleHRlcm4gVGFyZ2V0IFRoZUFscGhhVGFyZ2V0OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bTsKKworLy8gRGVmaW5lcyBzeW1ib2xpYyBuYW1lcyBmb3IgQWxwaGEgcmVnaXN0ZXJzLiAgVGhpcyBkZWZpbmVzIGEgbWFwcGluZyBmcm9tCisvLyByZWdpc3RlciBuYW1lIHRvIHJlZ2lzdGVyIG51bWJlci4KKy8vCisjaW5jbHVkZSAiQWxwaGFHZW5SZWdpc3Rlck5hbWVzLmluYyIKKworLy8gRGVmaW5lcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIEFscGhhIGluc3RydWN0aW9ucy4KKy8vCisjaW5jbHVkZSAiQWxwaGFHZW5JbnN0ck5hbWVzLmluYyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWU2NTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYS50ZApAQCAtMCwwICsxLDY4IEBACisvLz09PS0gQWxwaGEudGQgLSBEZXNjcmliZSB0aGUgQWxwaGEgVGFyZ2V0IE1hY2hpbmUgLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIEdldCB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMgd2hpY2ggd2UgYXJlIGltcGxlbWVudGluZy4uLg0KKy8vDQoraW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0LnRkIg0KKw0KKy8vQWxwaGEgaXMgbGl0dGxlIGVuZGlhbg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU3VidGFyZ2V0IEZlYXR1cmVzDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitkZWYgRmVhdHVyZUNJWCA6IFN1YnRhcmdldEZlYXR1cmU8ImNpeCIsICJIYXNDVCIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBDSVggZXh0ZW50aW9ucyI+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gUmVnaXN0ZXIgRmlsZSBEZXNjcmlwdGlvbg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQoraW5jbHVkZSAiQWxwaGFSZWdpc3RlckluZm8udGQiDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBDYWxsaW5nIENvbnZlbnRpb24gRGVzY3JpcHRpb24NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIkFscGhhQ2FsbGluZ0NvbnYudGQiDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTY2hlZHVsZSBEZXNjcmlwdGlvbg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQoraW5jbHVkZSAiQWxwaGFTY2hlZHVsZS50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEluc3RydWN0aW9uIERlc2NyaXB0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQoraW5jbHVkZSAiQWxwaGFJbnN0ckluZm8udGQiDQorDQorZGVmIEFscGhhSW5zdHJJbmZvIDogSW5zdHJJbmZvOw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQWxwaGEgUHJvY2Vzc29yIERlZmluaXRpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitkZWYgOiBQcm9jZXNzb3I8ImdlbmVyaWMiLCBBbHBoYTIxMjY0SXRpbmVyYXJpZXMsIFtdPjsNCitkZWYgOiBQcm9jZXNzb3I8ImV2NiIgICAgLCBBbHBoYTIxMjY0SXRpbmVyYXJpZXMsIFtdPjsNCitkZWYgOiBQcm9jZXNzb3I8ImV2NjciICAgLCBBbHBoYTIxMjY0SXRpbmVyYXJpZXMsIFtGZWF0dXJlQ0lYXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBUaGUgQWxwaGEgVGFyZ2V0DQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisNCitkZWYgQWxwaGEgOiBUYXJnZXQgew0KKyAgLy8gUHVsbCBpbiBJbnN0cnVjdGlvbiBJbmZvOg0KKyAgbGV0IEluc3RydWN0aW9uU2V0ID0gQWxwaGFJbnN0ckluZm87DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFCcmFuY2hTZWxlY3Rvci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhQnJhbmNoU2VsZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjgxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhQnJhbmNoU2VsZWN0b3IuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8vPT09LS0gQWxwaGFCcmFuY2hTZWxlY3Rvci5jcHAgLSBDb252ZXJ0IFBzZXVkbyBicmFuY2hzIC0tLS0tLS0tLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUmVwbGFjZSBQc2V1ZG8gQ09ORF9CUkFOQ0hfKiB3aXRoIHRoZWlyIGFwcHJvcHJpYXRlIHJlYWwgYnJhbmNoCisvLyBTaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIFBQQyBCcmFuY2ggU2VsZWN0b3IKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQWxwaGEuaCIKKyNpbmNsdWRlICJBbHBoYUluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEFscGhhQlNlbCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBBbHBoYUJTZWwoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGbik7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJBbHBoYSBCcmFuY2ggU2VsZWN0aW9uIjsKKyAgICB9CisgIH07CisgIGNoYXIgQWxwaGFCU2VsOjpJRCA9IDA7Cit9CisKKy8vLyBjcmVhdGVBbHBoYUJyYW5jaFNlbGVjdGlvblBhc3MgLSByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBCcmFuY2ggU2VsZWN0aW9uCisvLy8gUGFzcworLy8vCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUFscGhhQnJhbmNoU2VsZWN0aW9uUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBBbHBoYUJTZWwoKTsKK30KKworYm9vbCBBbHBoYUJTZWw6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRm4pIHsKKworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUZJID0gRm4uYmVnaW4oKSwgRSA9IEZuLmVuZCgpOyBNRkkgIT0gRTsKKyAgICAgICArK01GSSkgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNRkk7CisgICAgCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IE1CQi0+YmVnaW4oKSwgRUUgPSBNQkItPmVuZCgpOworICAgICAgICAgTUJCSSAhPSBFRTsgKytNQkJJKSB7CisgICAgICBpZiAoTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gQWxwaGE6OkNPTkRfQlJBTkNIX0kgfHwKKyAgICAgICAgICBNQkJJLT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6Q09ORF9CUkFOQ0hfRikgeworICAgICAgICAKKyAgICAgICAgLy8gY29uZGJyYW5jaCBvcGVyYW5kczoKKyAgICAgICAgLy8gMC4gYmMgb3Bjb2RlCisgICAgICAgIC8vIDEuIHJlZworICAgICAgICAvLyAyLiB0YXJnZXQgTUJCCisgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gRm4uZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgICAgICAgIE1CQkktPnNldERlc2MoVElJLT5nZXQoTUJCSS0+Z2V0T3BlcmFuZCgwKS5nZXRJbW0oKSkpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIHRydWU7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFDYWxsaW5nQ29udi50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFDYWxsaW5nQ29udi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGU4ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYUNhbGxpbmdDb252LnRkCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LSBBbHBoYUNhbGxpbmdDb252LnRkIC0gQ2FsbGluZyBDb252ZW50aW9ucyBmb3IgQWxwaGEgLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUaGlzIGRlc2NyaWJlcyB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgQWxwaGEgYXJjaGl0ZWN0dXJlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFscGhhIFJldHVybiBWYWx1ZSBDYWxsaW5nIENvbnZlbnRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgUmV0Q0NfQWxwaGEgOiBDYWxsaW5nQ29udjxbCisgIC8vIGk2NCBpcyByZXR1cm5lZCBpbiByZWdpc3RlciBSMAorICAvLyBSMSBpcyBhbiBsbHZtIGV4dGVuc2lvbiwgSSBkb24ndCBrbm93IHdoYXQgZ2NjIGRvZXMKKyAgQ0NJZlR5cGU8W2k2NF0sIENDQXNzaWduVG9SZWc8W1IwLFIxXT4+LAorCisgIC8vIGYzMiAvIGY2NCBhcmUgcmV0dXJuZWQgaW4gRjAvRjEKKyAgQ0NJZlR5cGU8W2YzMiwgZjY0XSwgQ0NBc3NpZ25Ub1JlZzxbRjAsIEYxXT4+CitdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFscGhhIEFyZ3VtZW50IENhbGxpbmcgQ29udmVudGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgQ0NfQWxwaGEgOiBDYWxsaW5nQ29udjxbCisgIC8vIFRoZSBmaXJzdCA2IGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIHJlZ2lzdGVycywgd2hldGhlciBpbnRlZ2VyIG9yCisgIC8vIGZsb2F0aW5nLXBvaW50CisgIENDSWZUeXBlPFtpNjRdLCBDQ0Fzc2lnblRvUmVnV2l0aFNoYWRvdzxbUjE2LCBSMTcsIFIxOCwgUjE5LCBSMjAsIFIyMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRjE2LCBGMTcsIEYxOCwgRjE5LCBGMjAsIEYyMV0+PiwKKworICBDQ0lmVHlwZTxbZjMyLCBmNjRdLCBDQ0Fzc2lnblRvUmVnV2l0aFNoYWRvdzxbRjE2LCBGMTcsIEYxOCwgRjE5LCBGMjAsIEYyMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSMTYsIFIxNywgUjE4LCBSMTksIFIyMCwgUjIxXT4+LAorCisgIC8vIFN0YWNrIHNsb3RzIGFyZSA4IGJ5dGVzIGluIHNpemUgYW5kIDgtYnl0ZSBhbGlnbmVkLgorICBDQ0lmVHlwZTxbaTY0LCBmMzIsIGY2NF0sIENDQXNzaWduVG9TdGFjazw4LCA4Pj4KK10+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYUNvZGVFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFDb2RlRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlYzA3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFDb2RlRW1pdHRlci5jcHAKQEAgLTAsMCArMSwyMjIgQEAKKy8vPT09LS0gQWxwaGEvQWxwaGFDb2RlRW1pdHRlci5jcHAgLSBDb252ZXJ0IEFscGhhIGNvZGUgdG8gbWFjaGluZSBjb2RlIC0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwYXNzIHRoYXQgdHJhbnNmb3JtcyB0aGUgQWxwaGEgbWFjaGluZSBpbnN0cnVjdGlvbnMKKy8vIGludG8gcmVsb2NhdGFibGUgbWFjaGluZSBjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYWxwaGEtZW1pdHRlciIKKyNpbmNsdWRlICJBbHBoYVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJBbHBoYVJlbG9jYXRpb25zLmgiCisjaW5jbHVkZSAiQWxwaGEuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0pJVENvZGVFbWl0dGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIEFscGhhQ29kZUVtaXR0ZXIgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgSklUQ29kZUVtaXR0ZXIgJk1DRTsKKyAgICBjb25zdCBBbHBoYUluc3RySW5mbyAqSUk7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKworICAgIEFscGhhQ29kZUVtaXR0ZXIoSklUQ29kZUVtaXR0ZXIgJm1jZSkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwKKyAgICBNQ0UobWNlKSB7fQorCisgICAgLy8vIGdldEJpbmFyeUNvZGVGb3JJbnN0ciAtIFRoaXMgZnVuY3Rpb24sIGdlbmVyYXRlZCBieSB0aGUKKyAgICAvLy8gQ29kZUVtaXR0ZXJHZW5lcmF0b3IgdXNpbmcgVGFibGVHZW4sIHByb2R1Y2VzIHRoZSBiaW5hcnkgZW5jb2RpbmcgZm9yCisgICAgLy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorCisgICAgdW5zaWduZWQgZ2V0QmluYXJ5Q29kZUZvckluc3RyKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgICAgLy8vIGdldE1hY2hpbmVPcFZhbHVlIC0gZXZhbHVhdGVzIHRoZSBNYWNoaW5lT3BlcmFuZCBvZiBhIGdpdmVuIE1hY2hpbmVJbnN0cgorCisgICAgdW5zaWduZWQgZ2V0TWFjaGluZU9wVmFsdWUoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pOworICAgIAorICAgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiQWxwaGEgTWFjaGluZSBDb2RlIEVtaXR0ZXIiOworICAgIH0KKyAgICAKKyAgcHJpdmF0ZToKKyAgICB2b2lkIGVtaXRCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworICB9OworfQorCitjaGFyIEFscGhhQ29kZUVtaXR0ZXI6OklEID0gMDsKKworCisvLy8gY3JlYXRlQWxwaGFDb2RlRW1pdHRlclBhc3MgLSBSZXR1cm4gYSBwYXNzIHRoYXQgZW1pdHMgdGhlIGNvbGxlY3RlZCBBbHBoYQorLy8vIGNvZGUgdG8gdGhlIHNwZWNpZmllZCBNQ0Ugb2JqZWN0LgorCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUFscGhhSklUQ29kZUVtaXR0ZXJQYXNzKEFscGhhVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpIHsKKyAgcmV0dXJuIG5ldyBBbHBoYUNvZGVFbWl0dGVyKEpDRSk7Cit9CisKK2Jvb2wgQWxwaGFDb2RlRW1pdHRlcjo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBJSSA9ICgoQWxwaGFUYXJnZXRNYWNoaW5lJilNRi5nZXRUYXJnZXQoKSkuZ2V0SW5zdHJJbmZvKCk7CisKKyAgZG8geworICAgIE1DRS5zdGFydEZ1bmN0aW9uKE1GKTsKKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBlbWl0QmFzaWNCbG9jaygqSSk7CisgIH0gd2hpbGUgKE1DRS5maW5pc2hGdW5jdGlvbihNRikpOworCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBbHBoYUNvZGVFbWl0dGVyOjplbWl0QmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSB7CisgIE1DRS5TdGFydE1hY2hpbmVCYXNpY0Jsb2NrKCZNQkIpOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLmJlZ2luKCksIEUgPSBNQkIuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBNYWNoaW5lSW5zdHIgJk1JID0gKkk7CisgICAgTUNFLnByb2Nlc3NEZWJ1Z0xvYyhNSS5nZXREZWJ1Z0xvYygpLCB0cnVlKTsKKyAgICBzd2l0Y2goTUkuZ2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgTUNFLmVtaXRXb3JkTEUoZ2V0QmluYXJ5Q29kZUZvckluc3RyKCpJKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFscGhhOjpBTFRFTlQ6CisgICAgY2FzZSBBbHBoYTo6UENMQUJFTDoKKyAgICBjYXNlIEFscGhhOjpNRU1MQUJFTDoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpLSUxMOgorICAgICAgYnJlYWs7IC8vc2tpcCB0aGVzZQorICAgIH0KKyAgICBNQ0UucHJvY2Vzc0RlYnVnTG9jKE1JLmdldERlYnVnTG9jKCksIGZhbHNlKTsKKyAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0QWxwaGFSZWdOdW1iZXIodW5zaWduZWQgUmVnKSB7CisgIHN3aXRjaCAoUmVnKSB7CisgIGNhc2UgQWxwaGE6OlIwICA6IGNhc2UgQWxwaGE6OkYwICA6IHJldHVybiAwOworICBjYXNlIEFscGhhOjpSMSAgOiBjYXNlIEFscGhhOjpGMSAgOiByZXR1cm4gMTsKKyAgY2FzZSBBbHBoYTo6UjIgIDogY2FzZSBBbHBoYTo6RjIgIDogcmV0dXJuIDI7CisgIGNhc2UgQWxwaGE6OlIzICA6IGNhc2UgQWxwaGE6OkYzICA6IHJldHVybiAzOworICBjYXNlIEFscGhhOjpSNCAgOiBjYXNlIEFscGhhOjpGNCAgOiByZXR1cm4gNDsKKyAgY2FzZSBBbHBoYTo6UjUgIDogY2FzZSBBbHBoYTo6RjUgIDogcmV0dXJuIDU7CisgIGNhc2UgQWxwaGE6OlI2ICA6IGNhc2UgQWxwaGE6OkY2ICA6IHJldHVybiA2OworICBjYXNlIEFscGhhOjpSNyAgOiBjYXNlIEFscGhhOjpGNyAgOiByZXR1cm4gNzsKKyAgY2FzZSBBbHBoYTo6UjggIDogY2FzZSBBbHBoYTo6RjggIDogcmV0dXJuIDg7CisgIGNhc2UgQWxwaGE6OlI5ICA6IGNhc2UgQWxwaGE6OkY5ICA6IHJldHVybiA5OworICBjYXNlIEFscGhhOjpSMTAgOiBjYXNlIEFscGhhOjpGMTAgOiByZXR1cm4gMTA7CisgIGNhc2UgQWxwaGE6OlIxMSA6IGNhc2UgQWxwaGE6OkYxMSA6IHJldHVybiAxMTsKKyAgY2FzZSBBbHBoYTo6UjEyIDogY2FzZSBBbHBoYTo6RjEyIDogcmV0dXJuIDEyOworICBjYXNlIEFscGhhOjpSMTMgOiBjYXNlIEFscGhhOjpGMTMgOiByZXR1cm4gMTM7CisgIGNhc2UgQWxwaGE6OlIxNCA6IGNhc2UgQWxwaGE6OkYxNCA6IHJldHVybiAxNDsKKyAgY2FzZSBBbHBoYTo6UjE1IDogY2FzZSBBbHBoYTo6RjE1IDogcmV0dXJuIDE1OworICBjYXNlIEFscGhhOjpSMTYgOiBjYXNlIEFscGhhOjpGMTYgOiByZXR1cm4gMTY7CisgIGNhc2UgQWxwaGE6OlIxNyA6IGNhc2UgQWxwaGE6OkYxNyA6IHJldHVybiAxNzsKKyAgY2FzZSBBbHBoYTo6UjE4IDogY2FzZSBBbHBoYTo6RjE4IDogcmV0dXJuIDE4OworICBjYXNlIEFscGhhOjpSMTkgOiBjYXNlIEFscGhhOjpGMTkgOiByZXR1cm4gMTk7CisgIGNhc2UgQWxwaGE6OlIyMCA6IGNhc2UgQWxwaGE6OkYyMCA6IHJldHVybiAyMDsKKyAgY2FzZSBBbHBoYTo6UjIxIDogY2FzZSBBbHBoYTo6RjIxIDogcmV0dXJuIDIxOworICBjYXNlIEFscGhhOjpSMjIgOiBjYXNlIEFscGhhOjpGMjIgOiByZXR1cm4gMjI7CisgIGNhc2UgQWxwaGE6OlIyMyA6IGNhc2UgQWxwaGE6OkYyMyA6IHJldHVybiAyMzsKKyAgY2FzZSBBbHBoYTo6UjI0IDogY2FzZSBBbHBoYTo6RjI0IDogcmV0dXJuIDI0OworICBjYXNlIEFscGhhOjpSMjUgOiBjYXNlIEFscGhhOjpGMjUgOiByZXR1cm4gMjU7CisgIGNhc2UgQWxwaGE6OlIyNiA6IGNhc2UgQWxwaGE6OkYyNiA6IHJldHVybiAyNjsKKyAgY2FzZSBBbHBoYTo6UjI3IDogY2FzZSBBbHBoYTo6RjI3IDogcmV0dXJuIDI3OworICBjYXNlIEFscGhhOjpSMjggOiBjYXNlIEFscGhhOjpGMjggOiByZXR1cm4gMjg7CisgIGNhc2UgQWxwaGE6OlIyOSA6IGNhc2UgQWxwaGE6OkYyOSA6IHJldHVybiAyOTsKKyAgY2FzZSBBbHBoYTo6UjMwIDogY2FzZSBBbHBoYTo6RjMwIDogcmV0dXJuIDMwOworICBjYXNlIEFscGhhOjpSMzEgOiBjYXNlIEFscGhhOjpGMzEgOiByZXR1cm4gMzE7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIHJlZyIpOworICB9Cit9CisKK3Vuc2lnbmVkIEFscGhhQ29kZUVtaXR0ZXI6OmdldE1hY2hpbmVPcFZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIHsKKworICB1bnNpZ25lZCBydiA9IDA7IC8vIFJldHVybiB2YWx1ZTsgZGVmYXVsdHMgdG8gMCBmb3IgdW5oYW5kbGVkIGNhc2VzCisgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhpbmdzIHRoYXQgZ2V0IGZpeGVkIHVwIGxhdGVyIGJ5IHRoZSBKSVQuCisKKyAgaWYgKE1PLmlzUmVnKCkpIHsKKyAgICBydiA9IGdldEFscGhhUmVnTnVtYmVyKE1PLmdldFJlZygpKTsKKyAgfSBlbHNlIGlmIChNTy5pc0ltbSgpKSB7CisgICAgcnYgPSBNTy5nZXRJbW0oKTsKKyAgfSBlbHNlIGlmIChNTy5pc0dsb2JhbCgpIHx8IE1PLmlzU3ltYm9sKCkgfHwgTU8uaXNDUEkoKSkgeworICAgIERFQlVHKGVycnMoKSA8PCBNTyA8PCAiIGlzIGEgcmVsb2NhdGVkIG9wIGZvciAiIDw8IE1JIDw8ICJcbiIpOworICAgIHVuc2lnbmVkIFJlbG9jID0gMDsKKyAgICBpbnQgT2Zmc2V0ID0gMDsKKyAgICBib29sIHVzZUdPVCA9IGZhbHNlOworICAgIHN3aXRjaCAoTUkuZ2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIEFscGhhOjpCU1I6CisgICAgICBSZWxvYyA9IEFscGhhOjpyZWxvY19ic3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFscGhhOjpMRExyOgorICAgIGNhc2UgQWxwaGE6OkxEUXI6CisgICAgY2FzZSBBbHBoYTo6TERCVXI6CisgICAgY2FzZSBBbHBoYTo6TERXVXI6CisgICAgY2FzZSBBbHBoYTo6TERTcjoKKyAgICBjYXNlIEFscGhhOjpMRFRyOgorICAgIGNhc2UgQWxwaGE6OkxEQXI6CisgICAgY2FzZSBBbHBoYTo6U1RRcjoKKyAgICBjYXNlIEFscGhhOjpTVExyOgorICAgIGNhc2UgQWxwaGE6OlNUV3I6CisgICAgY2FzZSBBbHBoYTo6U1RCcjoKKyAgICBjYXNlIEFscGhhOjpTVFNyOgorICAgIGNhc2UgQWxwaGE6OlNUVHI6CisgICAgICBSZWxvYyA9IEFscGhhOjpyZWxvY19ncHJlbGxvdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQWxwaGE6OkxEQUhyOgorICAgICAgUmVsb2MgPSBBbHBoYTo6cmVsb2NfZ3ByZWxoaWdoOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBbHBoYTo6TERRbDoKKyAgICAgIFJlbG9jID0gQWxwaGE6OnJlbG9jX2xpdGVyYWw7CisgICAgICB1c2VHT1QgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBbHBoYTo6TERBZzoKKyAgICBjYXNlIEFscGhhOjpMREFIZzoKKyAgICAgIFJlbG9jID0gQWxwaGE6OnJlbG9jX2dwZGlzdDsKKyAgICAgIE9mZnNldCA9IE1JLmdldE9wZXJhbmQoMykuZ2V0SW1tKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgidW5rbm93biByZWxvY2F0YWJsZSBpbnN0cnVjdGlvbiIpOworICAgIH0KKyAgICBpZiAoTU8uaXNHbG9iYWwoKSkKKyAgICAgIE1DRS5hZGRSZWxvY2F0aW9uKE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRHVigKKyAgICAgICAgICAgIE1DRS5nZXRDdXJyZW50UENPZmZzZXQoKSwKKyAgICAgICAgICAgIFJlbG9jLAorICAgICAgICAgICAgY29uc3RfY2FzdDxHbG9iYWxWYWx1ZSAqPihNTy5nZXRHbG9iYWwoKSksCisgICAgICAgICAgICBPZmZzZXQsCisgICAgICAgICAgICBpc2E8RnVuY3Rpb24+KE1PLmdldEdsb2JhbCgpKSwKKyAgICAgICAgICAgIHVzZUdPVCkpOworICAgIGVsc2UgaWYgKE1PLmlzU3ltYm9sKCkpCisgICAgICBNQ0UuYWRkUmVsb2NhdGlvbihNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0RXh0U3ltKE1DRS5nZXRDdXJyZW50UENPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2MsIE1PLmdldFN5bWJvbE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LCB0cnVlKSk7CisgICAgZWxzZQorICAgICBNQ0UuYWRkUmVsb2NhdGlvbihNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0Q29uc3RQb29sKE1DRS5nZXRDdXJyZW50UENPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbG9jLCBNTy5nZXRJbmRleCgpLCBPZmZzZXQpKTsKKyAgfSBlbHNlIGlmIChNTy5pc01CQigpKSB7CisgICAgTUNFLmFkZFJlbG9jYXRpb24oTWFjaGluZVJlbG9jYXRpb246OmdldEJCKE1DRS5nZXRDdXJyZW50UENPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OnJlbG9jX2JzciwgTU8uZ2V0TUJCKCkpKTsKKyAgfSBlbHNlIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgZXJycygpIDw8ICJFUlJPUjogVW5rbm93biB0eXBlIG9mIE1hY2hpbmVPcGVyYW5kOiAiIDw8IE1PIDw8ICJcbiI7CisjZW5kaWYKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9CisKKyAgcmV0dXJuIHJ2OworfQorCisjaW5jbHVkZSAiQWxwaGFHZW5Db2RlRW1pdHRlci5pbmMiCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSVNlbERBR1RvREFHLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJU2VsREFHVG9EQUcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTdiZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSVNlbERBR1RvREFHLmNwcApAQCAtMCwwICsxLDQzOSBAQAorLy89PT0tLSBBbHBoYUlTZWxEQUdUb0RBRy5jcHAgLSBBbHBoYSBwYXR0ZXJuIG1hdGNoaW5nIGluc3Qgc2VsZWN0b3IgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHBhdHRlcm4gbWF0Y2hpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgZm9yIEFscGhhLAorLy8gY29udmVydGluZyBmcm9tIGEgbGVnYWxpemVkIGRhZyB0byBhIEFscGhhIGRhZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQWxwaGEuaCIKKyNpbmNsdWRlICJBbHBoYVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIEFscGhhREFHVG9EQUdJU2VsIC0gQWxwaGEgc3BlY2lmaWMgY29kZSB0byBzZWxlY3QgQWxwaGEgbWFjaGluZQorICAvLy8gaW5zdHJ1Y3Rpb25zIGZvciBTZWxlY3Rpb25EQUcgb3BlcmF0aW9ucy4KKyAgY2xhc3MgQWxwaGFEQUdUb0RBR0lTZWwgOiBwdWJsaWMgU2VsZWN0aW9uREFHSVNlbCB7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgSU1NX0xPVyAgPSAtMzI3Njg7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgSU1NX0hJR0ggPSAzMjc2NzsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBJTU1fTVVMVCA9IDY1NTM2OworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IElNTV9GVUxMSElHSCA9IElNTV9ISUdIICsgSU1NX0hJR0ggKiBJTU1fTVVMVDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBJTU1fRlVMTExPVyA9IElNTV9MT1cgKyBJTU1fTE9XICAqIElNTV9NVUxUOworCisgICAgc3RhdGljIGludDY0X3QgZ2V0X2xkYWgxNihpbnQ2NF90IHgpIHsKKyAgICAgIGludDY0X3QgeSA9IHggLyBJTU1fTVVMVDsKKyAgICAgIGlmICh4ICUgSU1NX01VTFQgPiBJTU1fSElHSCkKKyAgICAgICAgKyt5OworICAgICAgcmV0dXJuIHk7CisgICAgfQorCisgICAgc3RhdGljIGludDY0X3QgZ2V0X2xkYTE2KGludDY0X3QgeCkgeworICAgICAgcmV0dXJuIHggLSBnZXRfbGRhaDE2KHgpICogSU1NX01VTFQ7CisgICAgfQorCisgICAgLy8vIGdldF96YXBJbW0gLSBSZXR1cm4gYSB6YXAgbWFzayBpZiBYIGlzIGEgdmFsaWQgaW1tZWRpYXRlIGZvciBhIHphcG5vdAorICAgIC8vLyBpbnN0cnVjdGlvbiAoaWYgbm90LCByZXR1cm4gMCkuICBOb3RlIHRoYXQgdGhpcyBjb2RlIGFjY2VwdHMgcGFydGlhbAorICAgIC8vLyB6YXAgbWFza3MuICBGb3IgZXhhbXBsZSAoYW5kIExIUywgMSkgaXMgYSB2YWxpZCB6YXAsIGFzIGxvbmcgd2Uga25vdworICAgIC8vLyB0aGF0IHRoZSBiaXRzIDEtNyBvZiBMSFMgYXJlIGFscmVhZHkgemVyby4gIElmIExIUyBpcyBub24tbnVsbCwgd2UgYXJlCisgICAgLy8vIGluIGNoZWNraW5nIG1vZGUuICBJZiBMSFMgaXMgbnVsbCwgd2UgYXNzdW1lIHRoYXQgdGhlIG1hc2sgaGFzIGFscmVhZHkKKyAgICAvLy8gYmVlbiB2YWxpZGF0ZWQgYmVmb3JlLgorICAgIHVpbnQ2NF90IGdldF96YXBJbW0oU0RWYWx1ZSBMSFMsIHVpbnQ2NF90IENvbnN0YW50KSBjb25zdCB7CisgICAgICB1aW50NjRfdCBCaXRzVG9DaGVjayA9IDA7CisgICAgICB1bnNpZ25lZCBSZXN1bHQgPSAwOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSA4OyArK2kpIHsKKyAgICAgICAgaWYgKCgoQ29uc3RhbnQgPj4gOCppKSAmIDB4RkYpID09IDApIHsKKyAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFJlc3VsdCB8PSAxIDw8IGk7CisgICAgICAgICAgaWYgKCgoQ29uc3RhbnQgPj4gOCppKSAmIDB4RkYpID09IDB4RkYpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBlbnRpcmUgYnl0ZSBpcyBzZXQsIHphcG5vdCB0aGUgYnl0ZS4KKyAgICAgICAgICB9IGVsc2UgaWYgKExIUy5nZXROb2RlKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGUgbWFzayB3YXMgcHJldmlvdXNseSB2YWxpZGF0ZWQsIHdlIGtub3cgaXRzIG9rYXkKKyAgICAgICAgICAgIC8vIHRvIHphcG5vdCB0aGlzIGVudGlyZSBieXRlIGV2ZW4gdGhvdWdoIGFsbCB0aGUgYml0cyBhcmVuJ3Qgc2V0LgorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgZG9uJ3Qga25vdyB0aGF0IHRoZSBpdCdzIG9rYXkgdG8gemFwbm90IHRoaXMgZW50aXJlCisgICAgICAgICAgICAvLyBieXRlLiAgT25seSBkbyB0aGlzIGlmZiB3ZSBjYW4gcHJvdmUgdGhhdCB0aGUgbWlzc2luZyBiaXRzIGFyZQorICAgICAgICAgICAgLy8gYWxyZWFkeSBudWxsLCBzbyB0aGUgYnl0ZXphcCBkb2Vzbid0IG5lZWQgdG8gcmVhbGx5IG51bGwgdGhlbS4KKyAgICAgICAgICAgIEJpdHNUb0NoZWNrIHw9IH5Db25zdGFudCAmICgweEZGIDw8IDgqaSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIElmIHRoZXJlIGFyZSBtaXNzaW5nIGJpdHMgaW4gYSBieXRlIChmb3IgZXhhbXBsZSwgWCAmIDB4RUYwMCksIGNoZWNrIHRvCisgICAgICAvLyBzZWUgaWYgdGhlIG1pc3NpbmcgYml0cyAoMHgxMDAwKSBhcmUgYWxyZWFkeSBrbm93biB6ZXJvIGlmIG5vdCwgdGhlIHphcAorICAgICAgLy8gaXNuJ3Qgb2theSB0byBkbywgYXMgaXQgd29uJ3QgY2xlYXIgYWxsIHRoZSByZXF1aXJlZCBiaXRzLgorICAgICAgaWYgKEJpdHNUb0NoZWNrICYmCisgICAgICAgICAgIUN1ckRBRy0+TWFza2VkVmFsdWVJc1plcm8oTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50KExIUy5nZXRWYWx1ZVNpemVJbkJpdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzVG9DaGVjaykpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIAorICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHVpbnQ2NF90IGdldF96YXBJbW0odWludDY0X3QgeCkgeworICAgICAgdW5zaWduZWQgYnVpbGQgPSAwOworICAgICAgZm9yKGludCBpID0gMDsgaSAhPSA4OyArK2kpIHsKKyAgICAgICAgaWYgKCh4ICYgMHgwMEZGKSA9PSAweDAwRkYpCisgICAgICAgICAgYnVpbGQgfD0gMSA8PCBpOworICAgICAgICBlbHNlIGlmICgoeCAmIDB4MDBGRikgIT0gMCkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgeCA+Pj0gODsKKyAgICAgIH0KKyAgICAgIHJldHVybiBidWlsZDsKKyAgICB9CisgICAgICAKKyAgICAKKyAgICBzdGF0aWMgdWludDY0X3QgZ2V0TmVhclBvd2VyMih1aW50NjRfdCB4KSB7CisgICAgICBpZiAoIXgpIHJldHVybiAwOworICAgICAgdW5zaWduZWQgYXQgPSBDb3VudExlYWRpbmdaZXJvc182NCh4KTsKKyAgICAgIHVpbnQ2NF90IGNvbXBsb3cgPSAxVUxMIDw8ICg2MyAtIGF0KTsKKyAgICAgIHVpbnQ2NF90IGNvbXBoaWdoID0gMVVMTCA8PCAoNjQgLSBhdCk7CisgICAgICAvL2NlcnIgPDwgeCA8PCAiOiIgPDwgY29tcGxvdyA8PCAiOiIgPDwgY29tcGhpZ2ggPDwgIlxuIjsKKyAgICAgIGlmIChhYnM2NChjb21wbG93IC0geCkgPD0gYWJzNjQoY29tcGhpZ2ggLSB4KSkKKyAgICAgICAgcmV0dXJuIGNvbXBsb3c7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBjb21waGlnaDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjaGtSZW1OZWFyUG93ZXIyKHVpbnQ2NF90IHgsIHVpbnQ2NF90IHIsIGJvb2wgc3dhcCkgeworICAgICAgdWludDY0X3QgeSA9IGdldE5lYXJQb3dlcjIoeCk7CisgICAgICBpZiAoc3dhcCkKKyAgICAgICAgcmV0dXJuICh5IC0geCkgPT0gcjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICh4IC0geSkgPT0gcjsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0ZQWihTRFZhbHVlIE4pIHsKKyAgICAgIENvbnN0YW50RlBTRE5vZGUgKkNOID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTik7CisgICAgICByZXR1cm4gKENOICYmIChDTi0+Z2V0VmFsdWVBUEYoKS5pc1plcm8oKSkpOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBpc0ZQWm4oU0RWYWx1ZSBOKSB7CisgICAgICBDb25zdGFudEZQU0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4pOworICAgICAgcmV0dXJuIChDTiAmJiBDTi0+Z2V0VmFsdWVBUEYoKS5pc05lZ1plcm8oKSk7CisgICAgfQorICAgIHN0YXRpYyBib29sIGlzRlBacChTRFZhbHVlIE4pIHsKKyAgICAgIENvbnN0YW50RlBTRE5vZGUgKkNOID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTik7CisgICAgICByZXR1cm4gKENOICYmIENOLT5nZXRWYWx1ZUFQRigpLmlzUG9zWmVybygpKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEFscGhhREFHVG9EQUdJU2VsKEFscGhhVGFyZ2V0TWFjaGluZSAmVE0pCisgICAgICA6IFNlbGVjdGlvbkRBR0lTZWwoVE0pCisgICAge30KKworICAgIC8vLyBnZXRJNjRJbW0gLSBSZXR1cm4gYSB0YXJnZXQgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLCBvZiB0eXBlCisgICAgLy8vIGk2NC4KKyAgICBpbmxpbmUgU0RWYWx1ZSBnZXRJNjRJbW0oaW50NjRfdCBJbW0pIHsKKyAgICAgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEltbSwgTVZUOjppNjQpOworICAgIH0KKworICAgIC8vIFNlbGVjdCAtIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGZyb20gYSB0YXJnZXQtaW5kZXBlbmRlbnQgdG8gYQorICAgIC8vIHRhcmdldC1zcGVjaWZpYyBub2RlIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gY2hhbmdlZC4KKyAgICBTRE5vZGUgKlNlbGVjdChTRE5vZGUgKk4pOworICAgIAorICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIkFscGhhIERBRy0+REFHIFBhdHRlcm4gSW5zdHJ1Y3Rpb24gU2VsZWN0aW9uIjsKKyAgICB9IAorCisgICAgLy8vIFNlbGVjdElubGluZUFzbU1lbW9yeU9wZXJhbmQgLSBJbXBsZW1lbnQgYWRkcmVzc2luZyBtb2RlIHNlbGVjdGlvbiBmb3IKKyAgICAvLy8gaW5saW5lIGFzbSBleHByZXNzaW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wgU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChjb25zdCBTRFZhbHVlICZPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbnN0cmFpbnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPdXRPcHMpIHsKKyAgICAgIFNEVmFsdWUgT3AwOworICAgICAgc3dpdGNoIChDb25zdHJhaW50Q29kZSkgeworICAgICAgZGVmYXVsdDogcmV0dXJuIHRydWU7CisgICAgICBjYXNlICdtJzogICAvLyBtZW1vcnkKKyAgICAgICAgT3AwID0gT3A7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBPdXRPcHMucHVzaF9iYWNrKE9wMCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorLy8gSW5jbHVkZSB0aGUgcGllY2VzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0aW9uLgorI2luY2x1ZGUgIkFscGhhR2VuREFHSVNlbC5pbmMiCisgICAgCitwcml2YXRlOgorICAgIC8vLyBnZXRUYXJnZXRNYWNoaW5lIC0gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBUYXJnZXRNYWNoaW5lLCBjYXN0ZWQKKyAgICAvLy8gdG8gdGhlIHRhcmdldC1zcGVjaWZpYyB0eXBlLgorICAgIGNvbnN0IEFscGhhVGFyZ2V0TWFjaGluZSAmZ2V0VGFyZ2V0TWFjaGluZSgpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBBbHBoYVRhcmdldE1hY2hpbmUgJj4oVE0pOworICAgIH0KKworICAgIC8vLyBnZXRJbnN0ckluZm8gLSBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIFRhcmdldEluc3RySW5mbywgY2FzdGVkCisgICAgLy8vIHRvIHRoZSB0YXJnZXQtc3BlY2lmaWMgdHlwZS4KKyAgICBjb25zdCBBbHBoYUluc3RySW5mbyAqZ2V0SW5zdHJJbmZvKCkgeworICAgICAgcmV0dXJuIGdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKyAgICB9CisKKyAgICBTRE5vZGUgKmdldEdsb2JhbEJhc2VSZWcoKTsKKyAgICBTRE5vZGUgKmdldEdsb2JhbFJldEFkZHIoKTsKKyAgICB2b2lkIFNlbGVjdENBTEwoU0ROb2RlICpPcCk7CisKKyAgfTsKK30KKworLy8vIGdldEdsb2JhbEJhc2VSZWcgLSBPdXRwdXQgdGhlIGluc3RydWN0aW9ucyByZXF1aXJlZCB0byBwdXQgdGhlCisvLy8gR09UIGFkZHJlc3MgaW50byBhIHJlZ2lzdGVyLgorLy8vCitTRE5vZGUgKkFscGhhREFHVG9EQUdJU2VsOjpnZXRHbG9iYWxCYXNlUmVnKCkgeworICB1bnNpZ25lZCBHbG9iYWxCYXNlUmVnID0gZ2V0SW5zdHJJbmZvKCktPmdldEdsb2JhbEJhc2VSZWcoTUYpOworICByZXR1cm4gQ3VyREFHLT5nZXRSZWdpc3RlcihHbG9iYWxCYXNlUmVnLCBUTEkuZ2V0UG9pbnRlclR5KCkpLmdldE5vZGUoKTsKK30KKworLy8vIGdldEdsb2JhbFJldEFkZHIgLSBHcmFiIHRoZSByZXR1cm4gYWRkcmVzcy4KKy8vLworU0ROb2RlICpBbHBoYURBR1RvREFHSVNlbDo6Z2V0R2xvYmFsUmV0QWRkcigpIHsKKyAgdW5zaWduZWQgR2xvYmFsUmV0QWRkciA9IGdldEluc3RySW5mbygpLT5nZXRHbG9iYWxSZXRBZGRyKE1GKTsKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0UmVnaXN0ZXIoR2xvYmFsUmV0QWRkciwgVExJLmdldFBvaW50ZXJUeSgpKS5nZXROb2RlKCk7Cit9CisKKy8vIFNlbGVjdCAtIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGZyb20gYSB0YXJnZXQtaW5kZXBlbmRlbnQgdG8gYQorLy8gdGFyZ2V0LXNwZWNpZmljIG5vZGUgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBjaGFuZ2VkLgorU0ROb2RlICpBbHBoYURBR1RvREFHSVNlbDo6U2VsZWN0KFNETm9kZSAqTikgeworICBpZiAoTi0+aXNNYWNoaW5lT3Bjb2RlKCkpCisgICAgcmV0dXJuIE5VTEw7ICAgLy8gQWxyZWFkeSBzZWxlY3RlZC4KKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgQWxwaGFJU0Q6OkNBTEw6CisgICAgU2VsZWN0Q0FMTChOKTsKKyAgICByZXR1cm4gTlVMTDsKKworICBjYXNlIElTRDo6RnJhbWVJbmRleDogeworICAgIGludCBGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oTiktPmdldEluZGV4KCk7CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIEFscGhhOjpMREEsIE1WVDo6aTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRkksIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0STY0SW1tKDApKTsKKyAgfQorICBjYXNlIElTRDo6R0xPQkFMX09GRlNFVF9UQUJMRToKKyAgICByZXR1cm4gZ2V0R2xvYmFsQmFzZVJlZygpOworICBjYXNlIEFscGhhSVNEOjpHbG9iYWxSZXRBZGRyOgorICAgIHJldHVybiBnZXRHbG9iYWxSZXRBZGRyKCk7CisgIAorICBjYXNlIEFscGhhSVNEOjpEaXZDYWxsOiB7CisgICAgU0RWYWx1ZSBDaGFpbiA9IEN1ckRBRy0+Z2V0RW50cnlOb2RlKCk7CisgICAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBOMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgICAgU0RWYWx1ZSBOMiA9IE4tPmdldE9wZXJhbmQoMik7CisgICAgQ2hhaW4gPSBDdXJEQUctPmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIEFscGhhOjpSMjQsIE4xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoMCwwKSk7CisgICAgQ2hhaW4gPSBDdXJEQUctPmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIEFscGhhOjpSMjUsIE4yLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWluLmdldFZhbHVlKDEpKTsKKyAgICBDaGFpbiA9IEN1ckRBRy0+Z2V0Q29weVRvUmVnKENoYWluLCBkbCwgQWxwaGE6OlIyNywgTjAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW4uZ2V0VmFsdWUoMSkpOworICAgIFNETm9kZSAqQ05vZGUgPQorICAgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShBbHBoYTo6SlNScywgZGwsIE1WVDo6T3RoZXIsIE1WVDo6RmxhZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWluLCBDaGFpbi5nZXRWYWx1ZSgxKSk7CisgICAgQ2hhaW4gPSBDdXJEQUctPmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgQWxwaGE6OlIyNywgTVZUOjppNjQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKENOb2RlLCAxKSk7CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIEFscGhhOjpCSVNyLCBNVlQ6Omk2NCwgQ2hhaW4sIENoYWluKTsKKyAgfQorCisgIGNhc2UgSVNEOjpSRUFEQ1lDTEVDT1VOVEVSOiB7CisgICAgU0RWYWx1ZSBDaGFpbiA9IE4tPmdldE9wZXJhbmQoMCk7CisgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoQWxwaGE6OlJQQ0MsIGRsLCBNVlQ6Omk2NCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbik7CisgIH0KKworICBjYXNlIElTRDo6Q29uc3RhbnQ6IHsKKyAgICB1aW50NjRfdCB1dmFsID0gY2FzdDxDb25zdGFudFNETm9kZT4oTiktPmdldFpFeHRWYWx1ZSgpOworICAgIAorICAgIGlmICh1dmFsID09IDApIHsKKyAgICAgIFNEVmFsdWUgUmVzdWx0ID0gQ3VyREFHLT5nZXRDb3B5RnJvbVJlZyhDdXJEQUctPmdldEVudHJ5Tm9kZSgpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSMzEsIE1WVDo6aTY0KTsKKyAgICAgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTiwgMCksIFJlc3VsdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXV2YWw7CisgICAgaW50MzJfdCB2YWwzMiA9IChpbnQzMl90KXZhbDsKKyAgICBpZiAodmFsIDw9IElNTV9ISUdIICsgSU1NX0hJR0ggKiBJTU1fTVVMVCAmJgorICAgICAgICB2YWwgPj0gSU1NX0xPVyAgKyBJTU1fTE9XICAqIElNTV9NVUxUKQorICAgICAgYnJlYWs7IC8vKExEQUggKExEQSkpCisgICAgaWYgKCh1dmFsID4+IDMyKSA9PSAwICYmIC8vZW1wdHkgdXBwZXIgYml0cworICAgICAgICB2YWwzMiA8PSBJTU1fSElHSCArIElNTV9ISUdIICogSU1NX01VTFQpCisgICAgICAvLyB2YWwzMiA+PSBJTU1fTE9XICArIElNTV9MT1cgICogSU1NX01VTFQpIC8vYWx3YXlzIHRydWUKKyAgICAgIGJyZWFrOyAvLyh6ZXh0IChMREFIIChMREEpKSkKKyAgICAvL0Vsc2UgdXNlIHRoZSBjb25zdGFudCBwb29sCisgICAgQ29uc3RhbnRJbnQgKkMgPSBDb25zdGFudEludDo6Z2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQ2NFR5KCpDdXJEQUctPmdldENvbnRleHQoKSksIHV2YWwpOworICAgIFNEVmFsdWUgQ1BJID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudFBvb2woQywgTVZUOjppNjQpOworICAgIFNETm9kZSAqVG1wID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShBbHBoYTo6TERBSHIsIGRsLCBNVlQ6Omk2NCwgQ1BJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKGdldEdsb2JhbEJhc2VSZWcoKSwgMCkpOworICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBBbHBoYTo6TERRciwgTVZUOjppNjQsIE1WVDo6T3RoZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUEksIFNEVmFsdWUoVG1wLCAwKSwgQ3VyREFHLT5nZXRFbnRyeU5vZGUoKSk7CisgIH0KKyAgY2FzZSBJU0Q6OlRhcmdldENvbnN0YW50RlA6CisgIGNhc2UgSVNEOjpDb25zdGFudEZQOiB7CisgICAgQ29uc3RhbnRGUFNETm9kZSAqQ04gPSBjYXN0PENvbnN0YW50RlBTRE5vZGU+KE4pOworICAgIGJvb2wgaXNEb3VibGUgPSBOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjpmNjQ7CisgICAgRVZUIFQgPSBpc0RvdWJsZSA/IE1WVDo6ZjY0IDogTVZUOjpmMzI7CisgICAgaWYgKENOLT5nZXRWYWx1ZUFQRigpLmlzUG9zWmVybygpKSB7CisgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgaXNEb3VibGUgPyBBbHBoYTo6Q1BZU1QgOiBBbHBoYTo6Q1BZU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCwgQ3VyREFHLT5nZXRSZWdpc3RlcihBbHBoYTo6RjMxLCBUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFJlZ2lzdGVyKEFscGhhOjpGMzEsIFQpKTsKKyAgICB9IGVsc2UgaWYgKENOLT5nZXRWYWx1ZUFQRigpLmlzTmVnWmVybygpKSB7CisgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgaXNEb3VibGUgPyBBbHBoYTo6Q1BZU05UIDogQWxwaGE6OkNQWVNOUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULCBDdXJEQUctPmdldFJlZ2lzdGVyKEFscGhhOjpGMzEsIFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0UmVnaXN0ZXIoQWxwaGE6OkYzMSwgVCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlVuaGFuZGxlZCBGUCBjb25zdGFudCB0eXBlIik7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBJU0Q6OlNFVENDOgorICAgIGlmIChOLT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKS0+Z2V0VmFsdWVUeXBlKDApLmlzRmxvYXRpbmdQb2ludCgpKSB7CisgICAgICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oTi0+Z2V0T3BlcmFuZCgyKSktPmdldCgpOworCisgICAgICB1bnNpZ25lZCBPcGMgPSBBbHBoYTo6V1RGOworICAgICAgYm9vbCByZXYgPSBmYWxzZTsKKyAgICAgIGJvb2wgaW52ID0gZmFsc2U7CisgICAgICBzd2l0Y2goQ0MpIHsKKyAgICAgIGRlZmF1bHQ6IERFQlVHKE4tPmR1bXAoQ3VyREFHKSk7IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gRlAgY29tcGFyaXNvbiEiKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRFUTogY2FzZSBJU0Q6OlNFVE9FUTogY2FzZSBJU0Q6OlNFVFVFUToKKyAgICAgICAgT3BjID0gQWxwaGE6OkNNUFRFUTsgYnJlYWs7CisgICAgICBjYXNlIElTRDo6U0VUTFQ6IGNhc2UgSVNEOjpTRVRPTFQ6IGNhc2UgSVNEOjpTRVRVTFQ6IAorICAgICAgICBPcGMgPSBBbHBoYTo6Q01QVExUOyBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTRVRMRTogY2FzZSBJU0Q6OlNFVE9MRTogY2FzZSBJU0Q6OlNFVFVMRTogCisgICAgICAgIE9wYyA9IEFscGhhOjpDTVBUTEU7IGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVEdUOiBjYXNlIElTRDo6U0VUT0dUOiBjYXNlIElTRDo6U0VUVUdUOiAKKyAgICAgICAgT3BjID0gQWxwaGE6OkNNUFRMVDsgcmV2ID0gdHJ1ZTsgYnJlYWs7CisgICAgICBjYXNlIElTRDo6U0VUR0U6IGNhc2UgSVNEOjpTRVRPR0U6IGNhc2UgSVNEOjpTRVRVR0U6IAorICAgICAgICBPcGMgPSBBbHBoYTo6Q01QVExFOyByZXYgPSB0cnVlOyBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTRVRORTogY2FzZSBJU0Q6OlNFVE9ORTogY2FzZSBJU0Q6OlNFVFVORToKKyAgICAgICAgT3BjID0gQWxwaGE6OkNNUFRFUTsgaW52ID0gdHJ1ZTsgYnJlYWs7CisgICAgICBjYXNlIElTRDo6U0VUTzoKKyAgICAgICAgT3BjID0gQWxwaGE6OkNNUFRVTjsgaW52ID0gdHJ1ZTsgYnJlYWs7CisgICAgICBjYXNlIElTRDo6U0VUVU86CisgICAgICAgIE9wYyA9IEFscGhhOjpDTVBUVU47IGJyZWFrOworICAgICAgfTsKKyAgICAgIFNEVmFsdWUgdG1wMSA9IE4tPmdldE9wZXJhbmQocmV2PzE6MCk7CisgICAgICBTRFZhbHVlIHRtcDIgPSBOLT5nZXRPcGVyYW5kKHJldj8wOjEpOworICAgICAgU0ROb2RlICpjbXAgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wYywgZGwsIE1WVDo6ZjY0LCB0bXAxLCB0bXAyKTsKKyAgICAgIGlmIChpbnYpIAorICAgICAgICBjbXAgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKEFscGhhOjpDTVBURVEsIGRsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmY2NCwgU0RWYWx1ZShjbXAsIDApLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFJlZ2lzdGVyKEFscGhhOjpGMzEsIE1WVDo6ZjY0KSk7CisgICAgICBzd2l0Y2goQ0MpIHsKKyAgICAgIGNhc2UgSVNEOjpTRVRVRVE6IGNhc2UgSVNEOjpTRVRVTFQ6IGNhc2UgSVNEOjpTRVRVTEU6CisgICAgICBjYXNlIElTRDo6U0VUVU5FOiBjYXNlIElTRDo6U0VUVUdUOiBjYXNlIElTRDo6U0VUVUdFOgorICAgICAgIHsKKyAgICAgICAgIFNETm9kZSogY21wMiA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoQWxwaGE6OkNNUFRVTiwgZGwsIE1WVDo6ZjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAxLCB0bXAyKTsKKyAgICAgICAgIGNtcCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoQWxwaGE6OkFERFQsIGRsLCBNVlQ6OmY2NCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoY21wMiwgMCksIFNEVmFsdWUoY21wLCAwKSk7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKworICAgICAgU0ROb2RlKiBMRCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoQWxwaGE6OkZUT0lULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTY0LCBTRFZhbHVlKGNtcCwgMCkpOworICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoQWxwaGE6OkNNUFVMVCwgZGwsIE1WVDo6aTY0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0UmVnaXN0ZXIoQWxwaGE6OlIzMSwgTVZUOjppNjQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShMRCwwKSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgSVNEOjpBTkQ6IHsKKyAgICBDb25zdGFudFNETm9kZSogU0MgPSBOVUxMOworICAgIENvbnN0YW50U0ROb2RlKiBNQyA9IE5VTEw7CisgICAgaWYgKE4tPmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkwgJiYKKyAgICAgICAgKE1DID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpKSAmJgorICAgICAgICAoU0MgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDEpKSkpIHsKKyAgICAgIHVpbnQ2NF90IHN2YWwgPSBTQy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICB1aW50NjRfdCBtdmFsID0gTUMtPmdldFpFeHRWYWx1ZSgpOworICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBhIHphcCwgbGV0IHRoZSBhdXRvZ2VuZWQgc3R1ZmYgaGFuZGxlIGl0LgorICAgICAgaWYgKGdldF96YXBJbW0oTi0+Z2V0T3BlcmFuZCgwKSwgbXZhbCkpCisgICAgICAgIGJyZWFrOworICAgICAgLy8gZ2l2ZW4gbWFzayBYLCBhbmQgc2hpZnQgUywgd2Ugd2FudCB0byBzZWUgaWYgdGhlcmUgaXMgYW55IHphcCBpbiB0aGUKKyAgICAgIC8vIG1hc2sgaWYgd2UgcGxheSBhcm91bmQgd2l0aCB0aGUgYm90dG9uIFMgYml0cworICAgICAgdWludDY0X3QgZG9udGNhcmUgPSAofjBVTEwpID4+ICg2NCAtIHN2YWwpOworICAgICAgdWludDY0X3QgbWFzayA9IG12YWwgPDwgc3ZhbDsKKyAgICAgIAorICAgICAgaWYgKGdldF96YXBJbW0obWFzayB8IGRvbnRjYXJlKSkKKyAgICAgICAgbWFzayA9IG1hc2sgfCBkb250Y2FyZTsKKyAgICAgIAorICAgICAgaWYgKGdldF96YXBJbW0obWFzaykpIHsKKyAgICAgICAgU0RWYWx1ZSBaID0gCisgICAgICAgICAgU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKEFscGhhOjpaQVBOT1RpLCBkbCwgTVZUOjppNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0STY0SW1tKGdldF96YXBJbW0obWFzaykpKSwgMCk7CisgICAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKEFscGhhOjpTUkxyLCBkbCwgTVZUOjppNjQsIFosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJNjRJbW0oc3ZhbCkpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIH0KKworICByZXR1cm4gU2VsZWN0Q29kZShOKTsKK30KKwordm9pZCBBbHBoYURBR1RvREFHSVNlbDo6U2VsZWN0Q0FMTChTRE5vZGUgKk4pIHsKKyAgLy9UT0RPOiBhZGQgZmxhZyBzdHVmZiB0byBwcmV2ZW50IG5vbmRldHVybWluaXN0aWMgYnJlYWthZ2UhCisKKyAgU0RWYWx1ZSBDaGFpbiA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgQWRkciA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgSW5GbGFnID0gTi0+Z2V0T3BlcmFuZChOLT5nZXROdW1PcGVyYW5kcygpIC0gMSk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAgaWYgKEFkZHIuZ2V0T3Bjb2RlKCkgPT0gQWxwaGFJU0Q6OkdQUmVsTG8pIHsKKyAgICAgU0RWYWx1ZSBHT1QgPSBTRFZhbHVlKGdldEdsb2JhbEJhc2VSZWcoKSwgMCk7CisgICAgIENoYWluID0gQ3VyREFHLT5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBBbHBoYTo6UjI5LCBHT1QsIEluRmxhZyk7CisgICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICAgICBDaGFpbiA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShBbHBoYTo6QlNSLCBkbCwgTVZUOjpPdGhlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6RmxhZywgQWRkci5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbiwgSW5GbGFnKSwgMCk7CisgICB9IGVsc2UgeworICAgICBDaGFpbiA9IEN1ckRBRy0+Z2V0Q29weVRvUmVnKENoYWluLCBkbCwgQWxwaGE6OlIyNywgQWRkciwgSW5GbGFnKTsKKyAgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgICAgIENoYWluID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKEFscGhhOjpKU1IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OkZsYWcsIENoYWluLCBJbkZsYWcpLCAwKTsKKyAgIH0KKyAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTiwgMCksIENoYWluKTsKKyAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCAxKSwgSW5GbGFnKTsKK30KKworCisvLy8gY3JlYXRlQWxwaGFJU2VsRGFnIC0gVGhpcyBwYXNzIGNvbnZlcnRzIGEgbGVnYWxpemVkIERBRyBpbnRvIGEgCisvLy8gQWxwaGEtc3BlY2lmaWMgREFHLCByZWFkeSBmb3IgaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZy4KKy8vLworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVBbHBoYUlTZWxEYWcoQWxwaGFUYXJnZXRNYWNoaW5lICZUTSkgeworICByZXR1cm4gbmV3IEFscGhhREFHVG9EQUdJU2VsKFRNKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJU2VsTG93ZXJpbmcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYUlTZWxMb3dlcmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3OGJmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJU2VsTG93ZXJpbmcuY3BwCkBAIC0wLDAgKzEsOTQxIEBACisvLz09PS0tIEFscGhhSVNlbExvd2VyaW5nLmNwcCAtIEFscGhhIERBRyBMb3dlcmluZyBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBbHBoYUlTZWxMb3dlcmluZyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQWxwaGFJU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJBbHBoYVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJBbHBoYU1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlSW1wbC5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gQWRkTGl2ZUluIC0gVGhpcyBoZWxwZXIgZnVuY3Rpb24gYWRkcyB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyIHRvIHRoZQorLy8vIE1hY2hpbmVGdW5jdGlvbiBhcyBhIGxpdmUgaW4gdmFsdWUuICBJdCBhbHNvIGNyZWF0ZXMgYSBjb3JyZXNwb25kaW5nIHZpcnR1YWwKKy8vLyByZWdpc3RlciBmb3IgaXQuCitzdGF0aWMgdW5zaWduZWQgQWRkTGl2ZUluKE1hY2hpbmVGdW5jdGlvbiAmTUYsIHVuc2lnbmVkIFBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSB7CisgIGFzc2VydChSQy0+Y29udGFpbnMoUFJlZykgJiYgIk5vdCB0aGUgY29ycmVjdCByZWdjbGFzcyEiKTsKKyAgdW5zaWduZWQgVlJlZyA9IE1GLmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICBNRi5nZXRSZWdJbmZvKCkuYWRkTGl2ZUluKFBSZWcsIFZSZWcpOworICByZXR1cm4gVlJlZzsKK30KKworQWxwaGFUYXJnZXRMb3dlcmluZzo6QWxwaGFUYXJnZXRMb3dlcmluZyhUYXJnZXRNYWNoaW5lICZUTSkKKyAgOiBUYXJnZXRMb3dlcmluZyhUTSwgbmV3IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRigpKSB7CisgIC8vIFNldCB1cCB0aGUgVGFyZ2V0TG93ZXJpbmcgb2JqZWN0LgorICAvL0kgYW0gaGF2aW5nIHByb2JsZW1zIHdpdGggc2hyIG4gaTggMQorICBzZXRTaGlmdEFtb3VudFR5cGUoTVZUOjppNjQpOworICBzZXRCb29sZWFuQ29udGVudHMoWmVyb09yT25lQm9vbGVhbkNvbnRlbnQpOworCisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppNjQsIEFscGhhOjpHUFJDUmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjpmNjQsIEFscGhhOjpGOFJDUmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjpmMzIsIEFscGhhOjpGNFJDUmVnaXN0ZXJDbGFzcyk7CisKKyAgLy8gV2Ugd2FudCB0byBjdXN0b20gbG93ZXIgc29tZSBvZiBvdXIgaW50cmluc2ljcy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBNVlQ6Ok90aGVyLCBDdXN0b20pOworCisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCBNVlQ6OmkxLCAgUHJvbW90ZSk7CisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6WkVYVExPQUQsIE1WVDo6aTEsICBQcm9tb3RlKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlpFWFRMT0FELCBNVlQ6OmkzMiwgRXhwYW5kKTsKKworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6U0VYVExPQUQsIE1WVDo6aTEsICBQcm9tb3RlKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlNFWFRMT0FELCBNVlQ6Omk4LCAgRXhwYW5kKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlNFWFRMT0FELCBNVlQ6OmkxNiwgRXhwYW5kKTsKKworICBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVDo6ZjY0LCBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICAvLyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJJTkQsICAgICAgICBNVlQ6Ok90aGVyLCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0pULCAgICAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJfQ0MsICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTEsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlJFTSwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSRU0sIE1WVDo6ZjY0LCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVJTlRfVE9fRlAsIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCwgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQsIE1WVDo6aTY0LCBDdXN0b20pOworCisgIGlmICghVE0uZ2V0U3VidGFyZ2V0PEFscGhhU3VidGFyZ2V0PigpLmhhc0NUKCkpIHsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFBPUCAgICAsIE1WVDo6aTY0ICAsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RUWiAgICAgLCBNVlQ6Omk2NCAgLCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUTFogICAgICwgTVZUOjppNjQgICwgRXhwYW5kKTsKKyAgfQorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCU1dBUCAgICAsIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RMICAgICAsIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RSICAgICAsIE1WVDo6aTY0LCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSRU0gICAgICwgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVSRU0gICAgICwgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYgICAgICwgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVYgICAgICwgTVZUOjppNjQsIEN1c3RvbSk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QUREQyAgICAgLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURERSAgICAgLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1VCQyAgICAgLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1VCRSAgICAgLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVTVVMX0xPSEksIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTTVVMX0xPSEksIE1WVDo6aTY0LCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTF9QQVJUUywgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQV9QQVJUUywgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITF9QQVJUUywgTVZUOjppNjQsIEV4cGFuZCk7CisKKyAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBzaW4vY29zL3NxcnQvcG93CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTSU4gLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUyAsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU0lOICwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1MgLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU1FSVCwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTUVJULCBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUE9XICwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQT1cgLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRVRDQywgTVZUOjpmMzIsIFByb21vdGUpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJULCBNVlQ6OmYzMiwgUHJvbW90ZSk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RUhfTEFCRUwsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisKKyAgLy8gTm90IGltcGxlbWVudGVkIHlldC4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RBQ0tTQVZFLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVEFDS1JFU1RPUkUsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkRZTkFNSUNfU1RBQ0tBTExPQywgTVZUOjppNjQsIEV4cGFuZCk7CisKKyAgLy8gV2Ugd2FudCB0byBsZWdhbGl6ZSBHbG9iYWxBZGRyZXNzIGFuZCBDb25zdGFudFBvb2wgYW5kCisgIC8vIEV4dGVybmFsU3ltYm9scyBub2RlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbnMgdG8KKyAgLy8gbWF0ZXJpYWxpemUgdGhlIGFkZHJlc3MuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbEFkZHJlc3MsICBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q29uc3RhbnRQb29sLCAgIE1WVDo6aTY0LCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFeHRlcm5hbFN5bWJvbCwgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbFRMU0FkZHJlc3MsIE1WVDo6aTY0LCBDdXN0b20pOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBU1RBUlQsIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBRU5ELCAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBQ09QWSwgIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBQVJHLCAgIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBQVJHLCAgIE1WVDo6aTMyLCAgIEN1c3RvbSk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SnVtcFRhYmxlLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SnVtcFRhYmxlLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKworICBzZXRTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUoQWxwaGE6OlIzMCk7CisKKyAgc2V0SnVtcEJ1ZlNpemUoMjcyKTsKKyAgc2V0SnVtcEJ1ZkFsaWdubWVudCgxNik7CisKKyAgY29tcHV0ZVJlZ2lzdGVyUHJvcGVydGllcygpOworfQorCitNVlQ6OlNpbXBsZVZhbHVlVHlwZSBBbHBoYVRhcmdldExvd2VyaW5nOjpnZXRTZXRDQ1Jlc3VsdFR5cGUoRVZUIFZUKSBjb25zdCB7CisgIHJldHVybiBNVlQ6Omk2NDsKK30KKworY29uc3QgY2hhciAqQWxwaGFUYXJnZXRMb3dlcmluZzo6Z2V0VGFyZ2V0Tm9kZU5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdCB7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGRlZmF1bHQ6IHJldHVybiAwOworICBjYXNlIEFscGhhSVNEOjpDVlRRVF86IHJldHVybiAiQWxwaGE6OkNWVFFUXyI7CisgIGNhc2UgQWxwaGFJU0Q6OkNWVFFTXzogcmV0dXJuICJBbHBoYTo6Q1ZUUVNfIjsKKyAgY2FzZSBBbHBoYUlTRDo6Q1ZUVFFfOiByZXR1cm4gIkFscGhhOjpDVlRUUV8iOworICBjYXNlIEFscGhhSVNEOjpHUFJlbEhpOiByZXR1cm4gIkFscGhhOjpHUFJlbEhpIjsKKyAgY2FzZSBBbHBoYUlTRDo6R1BSZWxMbzogcmV0dXJuICJBbHBoYTo6R1BSZWxMbyI7CisgIGNhc2UgQWxwaGFJU0Q6OlJlbExpdDogcmV0dXJuICJBbHBoYTo6UmVsTGl0IjsKKyAgY2FzZSBBbHBoYUlTRDo6R2xvYmFsUmV0QWRkcjogcmV0dXJuICJBbHBoYTo6R2xvYmFsUmV0QWRkciI7CisgIGNhc2UgQWxwaGFJU0Q6OkNBTEw6ICAgcmV0dXJuICJBbHBoYTo6Q0FMTCI7CisgIGNhc2UgQWxwaGFJU0Q6OkRpdkNhbGw6IHJldHVybiAiQWxwaGE6OkRpdkNhbGwiOworICBjYXNlIEFscGhhSVNEOjpSRVRfRkxBRzogcmV0dXJuICJBbHBoYTo6UkVUX0ZMQUciOworICBjYXNlIEFscGhhSVNEOjpDT05EX0JSQU5DSF9JOiByZXR1cm4gIkFscGhhOjpDT05EX0JSQU5DSF9JIjsKKyAgY2FzZSBBbHBoYUlTRDo6Q09ORF9CUkFOQ0hfRjogcmV0dXJuICJBbHBoYTo6Q09ORF9CUkFOQ0hfRiI7CisgIH0KK30KKworLy8vIGdldEZ1bmN0aW9uQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBMb2cyIGFsaWdubWVudCBvZiB0aGlzIGZ1bmN0aW9uLgordW5zaWduZWQgQWxwaGFUYXJnZXRMb3dlcmluZzo6Z2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0IHsKKyAgcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBTRFZhbHVlIExvd2VySnVtcFRhYmxlKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIEVWVCBQdHJWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBKdW1wVGFibGVTRE5vZGUgKkpUID0gY2FzdDxKdW1wVGFibGVTRE5vZGU+KE9wKTsKKyAgU0RWYWx1ZSBKVEkgPSBEQUcuZ2V0VGFyZ2V0SnVtcFRhYmxlKEpULT5nZXRJbmRleCgpLCBQdHJWVCk7CisgIC8vIEZJWE1FIHRoZXJlIGlzbid0IHJlYWxseSBhbnkgZGVidWcgaW5mbyBoZXJlCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBTRFZhbHVlIEhpID0gREFHLmdldE5vZGUoQWxwaGFJU0Q6OkdQUmVsSGksICBkbCwgTVZUOjppNjQsIEpUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEdMT0JBTF9PRkZTRVRfVEFCTEUoTVZUOjppNjQpKTsKKyAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKEFscGhhSVNEOjpHUFJlbExvLCBkbCwgTVZUOjppNjQsIEpUSSwgSGkpOworICByZXR1cm4gTG87Cit9CisKKy8vaHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS9jb21wdXRlci5oZWxwL3BvbGljeS9ESUdJVEFMX3VuaXgvCisvL0FBLVBZOEFDLVRFVDFfaHRtbC9jYWxsQ0gzLmh0bWwjQkxPQ0syMQorCisvL0ZvciBub3csIGp1c3QgdXNlIHZhcmlhYmxlIHNpemUgc3RhY2sgZnJhbWUgZm9ybWF0CisKKy8vSW4gYSBzdGFuZGFyZCBjYWxsLCB0aGUgZmlyc3Qgc2l4IGl0ZW1zIGFyZSBwYXNzZWQgaW4gcmVnaXN0ZXJzICQxNgorLy8tICQyMSBhbmQvb3IgcmVnaXN0ZXJzICRmMTYgLSAkZjIxLiAoU2VlIFNlY3Rpb24gNC4xLjIgZm9yIGRldGFpbHMKKy8vb2YgYXJndW1lbnQtdG8tcmVnaXN0ZXIgY29ycmVzcG9uZGVuY2UuKSBUaGUgcmVtYWluaW5nIGl0ZW1zIGFyZQorLy9jb2xsZWN0ZWQgaW4gYSBtZW1vcnkgYXJndW1lbnQgbGlzdCB0aGF0IGlzIGEgbmF0dXJhbGx5IGFsaWduZWQKKy8vYXJyYXkgb2YgcXVhZHdvcmRzLiBJbiBhIHN0YW5kYXJkIGNhbGwsIHRoaXMgbGlzdCwgaWYgcHJlc2VudCwgbXVzdAorLy9iZSBwYXNzZWQgYXQgMChTUCkuCisvLzcgLi4uIG4gICAgICAgICAwKFNQKSAuLi4gKG4tNykqOChTUCkKKworLy8gLy8jZGVmaW5lIEZQICAgICQxNQorLy8gLy8jZGVmaW5lIFJBICAgICQyNgorLy8gLy8jZGVmaW5lIFBWICAgICQyNworLy8gLy8jZGVmaW5lIEdQICAgICQyOQorLy8gLy8jZGVmaW5lIFNQICAgICQzMAorCisjaW5jbHVkZSAiQWxwaGFHZW5DYWxsaW5nQ29udi5pbmMiCisKK1NEVmFsdWUKK0FscGhhVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgLy8gQWxwaGEgdGFyZ2V0IGRvZXMgbm90IHlldCBzdXBwb3J0IHRhaWwgY2FsbCBvcHRpbWl6YXRpb24uCisgIGlzVGFpbENhbGwgPSBmYWxzZTsKKworICAvLyBBbmFseXplIG9wZXJhbmRzIG9mIHRoZSBjYWxsLCBhc3NpZ25pbmcgbG9jYXRpb25zIHRvIGVhY2ggb3BlcmFuZC4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgQXJnTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIENDSW5mby5BbmFseXplQ2FsbE9wZXJhbmRzKE91dHMsIENDX0FscGhhKTsKKworICAgIC8vIEdldCBhIGNvdW50IG9mIGhvdyBtYW55IGJ5dGVzIGFyZSB0byBiZSBwdXNoZWQgb24gdGhlIHN0YWNrLgorICB1bnNpZ25lZCBOdW1CeXRlcyA9IENDSW5mby5nZXROZXh0U3RhY2tPZmZzZXQoKTsKKworICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX1NUQVJUKENoYWluLCBEQUcuZ2V0Q29uc3RhbnQoTnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSwgdHJ1ZSkpOworCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgU0RWYWx1ZT4sIDQ+IFJlZ3NUb1Bhc3M7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDEyPiBNZW1PcENoYWluczsKKyAgU0RWYWx1ZSBTdGFja1B0cjsKKworICAvLyBXYWxrIHRoZSByZWdpc3Rlci9tZW1sb2MgYXNzaWdubWVudHMsIGluc2VydGluZyBjb3BpZXMvbG9hZHMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBBcmdMb2NzW2ldOworCisgICAgU0RWYWx1ZSBBcmcgPSBPdXRWYWxzW2ldOworCisgICAgLy8gUHJvbW90ZSB0aGUgdmFsdWUgaWYgbmVlZGVkLgorICAgIHN3aXRjaCAoVkEuZ2V0TG9jSW5mbygpKSB7CisgICAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biBsb2MgaW5mbyEiKTsKKyAgICAgIGNhc2UgQ0NWYWxBc3NpZ246OkZ1bGw6IGJyZWFrOworICAgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6U0V4dDoKKyAgICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgZGwsIFZBLmdldExvY1ZUKCksIEFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6WkV4dDoKKyAgICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZGwsIFZBLmdldExvY1ZUKCksIEFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6QUV4dDoKKyAgICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwgVkEuZ2V0TG9jVlQoKSwgQXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gQXJndW1lbnRzIHRoYXQgY2FuIGJlIHBhc3NlZCBvbiByZWdpc3RlciBtdXN0IGJlIGtlcHQgYXQgUmVnc1RvUGFzcworICAgIC8vIHZlY3RvcgorICAgIGlmIChWQS5pc1JlZ0xvYygpKSB7CisgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWQS5nZXRMb2NSZWcoKSwgQXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChWQS5pc01lbUxvYygpKTsKKworICAgICAgaWYgKFN0YWNrUHRyLmdldE5vZGUoKSA9PSAwKQorICAgICAgICBTdGFja1B0ciA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIEFscGhhOjpSMzAsIE1WVDo6aTY0KTsKKworICAgICAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIGdldFBvaW50ZXJUeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFja1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KFZBLmdldExvY01lbU9mZnNldCgpKSk7CisKKyAgICAgIE1lbU9wQ2hhaW5zLnB1c2hfYmFjayhEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBBcmcsIFB0ck9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldFN0YWNrKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCkpOworICAgIH0KKyAgfQorCisgIC8vIFRyYW5zZm9ybSBhbGwgc3RvcmUgbm9kZXMgaW50byBvbmUgc2luZ2xlIG5vZGUgYmVjYXVzZSBhbGwgc3RvcmUgbm9kZXMgYXJlCisgIC8vIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuCisgIGlmICghTWVtT3BDaGFpbnMuZW1wdHkoKSkKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJk1lbU9wQ2hhaW5zWzBdLCBNZW1PcENoYWlucy5zaXplKCkpOworCisgIC8vIEJ1aWxkIGEgc2VxdWVuY2Ugb2YgY29weS10by1yZWcgbm9kZXMgY2hhaW5lZCB0b2dldGhlciB3aXRoIHRva2VuIGNoYWluIGFuZAorICAvLyBmbGFnIG9wZXJhbmRzIHdoaWNoIGNvcHkgdGhlIG91dGdvaW5nIGFyZ3MgaW50byByZWdpc3RlcnMuICBUaGUgSW5GbGFnIGluCisgIC8vIG5lY2Vzc2FyeSBzaW5jZSBhbGwgZW1pdGVkIGluc3RydWN0aW9ucyBtdXN0IGJlIHN0dWNrIHRvZ2V0aGVyLgorICBTRFZhbHVlIEluRmxhZzsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3NUb1Bhc3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFJlZ3NUb1Bhc3NbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3NUb1Bhc3NbaV0uc2Vjb25kLCBJbkZsYWcpOworICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisKKyAgLy8gUmV0dXJucyBhIGNoYWluICYgYSBmbGFnIGZvciByZXR2YWwgY29weSB0byB1c2UuCisgIFNEVlRMaXN0IE5vZGVUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wczsKKyAgT3BzLnB1c2hfYmFjayhDaGFpbik7CisgIE9wcy5wdXNoX2JhY2soQ2FsbGVlKTsKKworICAvLyBBZGQgYXJndW1lbnQgcmVnaXN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gdGhhdCB0aGV5IGFyZQorICAvLyBrbm93biBsaXZlIGludG8gdGhlIGNhbGwuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzVG9QYXNzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0UmVnaXN0ZXIoUmVnc1RvUGFzc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdzVG9QYXNzW2ldLnNlY29uZC5nZXRWYWx1ZVR5cGUoKSkpOworCisgIGlmIChJbkZsYWcuZ2V0Tm9kZSgpKQorICAgIE9wcy5wdXNoX2JhY2soSW5GbGFnKTsKKworICBDaGFpbiA9IERBRy5nZXROb2RlKEFscGhhSVNEOjpDQUxMLCBkbCwgTm9kZVR5cywgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIENyZWF0ZSB0aGUgQ0FMTFNFUV9FTkQgbm9kZS4KKyAgQ2hhaW4gPSBEQUcuZ2V0Q0FMTFNFUV9FTkQoQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOdW1CeXRlcywgZ2V0UG9pbnRlclR5KCksIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgZ2V0UG9pbnRlclR5KCksIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkZsYWcpOworICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKworICAvLyBIYW5kbGUgcmVzdWx0IHZhbHVlcywgY29weWluZyB0aGVtIG91dCBvZiBwaHlzcmVncyBpbnRvIHZyZWdzIHRoYXQgd2UKKyAgLy8gcmV0dXJuLgorICByZXR1cm4gTG93ZXJDYWxsUmVzdWx0KENoYWluLCBJbkZsYWcsIENhbGxDb252LCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnMsIGRsLCBEQUcsIEluVmFscyk7Cit9CisKKy8vLyBMb3dlckNhbGxSZXN1bHQgLSBMb3dlciB0aGUgcmVzdWx0IHZhbHVlcyBvZiBhIGNhbGwgaW50byB0aGUKKy8vLyBhcHByb3ByaWF0ZSBjb3BpZXMgb3V0IG9mIGFwcHJvcHJpYXRlIHBoeXNpY2FsIHJlZ2lzdGVycy4KKy8vLworU0RWYWx1ZQorQWxwaGFUYXJnZXRMb3dlcmluZzo6TG93ZXJDYWxsUmVzdWx0KFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKworICAvLyBBc3NpZ24gbG9jYXRpb25zIHRvIGVhY2ggdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBjYWxsLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksIFJWTG9jcywKKyAgICAgICAgICAgICAgICAgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIENDSW5mby5BbmFseXplQ2FsbFJlc3VsdChJbnMsIFJldENDX0FscGhhKTsKKworICAvLyBDb3B5IGFsbCBvZiB0aGUgcmVzdWx0IHJlZ2lzdGVycyBvdXQgb2YgdGhlaXIgc3BlY2lmaWVkIHBoeXNyZWcuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUlZMb2NzLnNpemUoKTsgKytpKSB7CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gUlZMb2NzW2ldOworCisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQS5nZXRMb2NWVCgpLCBJbkZsYWcpLmdldFZhbHVlKDEpOworICAgIFNEVmFsdWUgUmV0VmFsdWUgPSBDaGFpbi5nZXRWYWx1ZSgwKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgyKTsKKworICAgIC8vIElmIHRoaXMgaXMgYW4gOC8xNi8zMi1iaXQgdmFsdWUsIGl0IGlzIHJlYWxseSBwYXNzZWQgcHJvbW90ZWQgdG8gNjQKKyAgICAvLyBiaXRzLiBJbnNlcnQgYW4gYXNzZXJ0W3N6XWV4dCB0byBjYXB0dXJlIHRoaXMsIHRoZW4gdHJ1bmNhdGUgdG8gdGhlCisgICAgLy8gcmlnaHQgc2l6ZS4KKyAgICBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpTRXh0KQorICAgICAgUmV0VmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFNleHQsIGRsLCBWQS5nZXRMb2NWVCgpLCBSZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShWQS5nZXRWYWxWVCgpKSk7CisgICAgZWxzZSBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpaRXh0KQorICAgICAgUmV0VmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFpleHQsIGRsLCBWQS5nZXRMb2NWVCgpLCBSZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShWQS5nZXRWYWxWVCgpKSk7CisKKyAgICBpZiAoVkEuZ2V0TG9jSW5mbygpICE9IENDVmFsQXNzaWduOjpGdWxsKQorICAgICAgUmV0VmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgVkEuZ2V0VmFsVlQoKSwgUmV0VmFsdWUpOworCisgICAgSW5WYWxzLnB1c2hfYmFjayhSZXRWYWx1ZSk7CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKK1NEVmFsdWUKK0FscGhhVGFyZ2V0TG93ZXJpbmc6Okxvd2VyRm9ybWFsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIEFscGhhTWFjaGluZUZ1bmN0aW9uSW5mbyAqRnVuY0luZm8gPSBNRi5nZXRJbmZvPEFscGhhTWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKworICB1bnNpZ25lZCBhcmdzX2ludFtdID0geworICAgIEFscGhhOjpSMTYsIEFscGhhOjpSMTcsIEFscGhhOjpSMTgsIEFscGhhOjpSMTksIEFscGhhOjpSMjAsIEFscGhhOjpSMjF9OworICB1bnNpZ25lZCBhcmdzX2Zsb2F0W10gPSB7CisgICAgQWxwaGE6OkYxNiwgQWxwaGE6OkYxNywgQWxwaGE6OkYxOCwgQWxwaGE6OkYxOSwgQWxwaGE6OkYyMCwgQWxwaGE6OkYyMX07CisKKyAgZm9yICh1bnNpZ25lZCBBcmdObyA9IDAsIGUgPSBJbnMuc2l6ZSgpOyBBcmdObyAhPSBlOyArK0FyZ05vKSB7CisgICAgU0RWYWx1ZSBhcmd0OworICAgIEVWVCBPYmplY3RWVCA9IEluc1tBcmdOb10uVlQ7CisgICAgU0RWYWx1ZSBBcmdWYWw7CisKKyAgICBpZiAoQXJnTm8gIDwgNikgeworICAgICAgc3dpdGNoIChPYmplY3RWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoZmFsc2UgJiYgIkludmFsaWQgdmFsdWUgdHlwZSEiKTsKKyAgICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICAgIGFyZ3NfZmxvYXRbQXJnTm9dID0gQWRkTGl2ZUluKE1GLCBhcmdzX2Zsb2F0W0FyZ05vXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFscGhhOjpGOFJDUmVnQ2xhc3MpOworICAgICAgICBBcmdWYWwgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBhcmdzX2Zsb2F0W0FyZ05vXSwgT2JqZWN0VlQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjpmMzI6CisgICAgICAgIGFyZ3NfZmxvYXRbQXJnTm9dID0gQWRkTGl2ZUluKE1GLCBhcmdzX2Zsb2F0W0FyZ05vXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFscGhhOjpGNFJDUmVnQ2xhc3MpOworICAgICAgICBBcmdWYWwgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBhcmdzX2Zsb2F0W0FyZ05vXSwgT2JqZWN0VlQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppNjQ6CisgICAgICAgIGFyZ3NfaW50W0FyZ05vXSA9IEFkZExpdmVJbihNRiwgYXJnc19pbnRbQXJnTm9dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFscGhhOjpHUFJDUmVnQ2xhc3MpOworICAgICAgICBBcmdWYWwgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBhcmdzX2ludFtBcmdOb10sIE1WVDo6aTY0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsgLy9tb3JlIGFyZ3MKKyAgICAgIC8vIENyZWF0ZSB0aGUgZnJhbWUgaW5kZXggb2JqZWN0IGZvciB0aGlzIGluY29taW5nIHBhcmFtZXRlci4uLgorICAgICAgaW50IEZJID0gTUZJLT5DcmVhdGVGaXhlZE9iamVjdCg4LCA4ICogKEFyZ05vIC0gNiksIHRydWUpOworCisgICAgICAvLyBDcmVhdGUgdGhlIFNlbGVjdGlvbkRBRyBub2RlcyBjb3JyZXNwb25kaW5nIHRvIGEgbG9hZAorICAgICAgLy9mcm9tIHRoaXMgcGFyYW1ldGVyCisgICAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZJLCBNVlQ6Omk2NCk7CisgICAgICBBcmdWYWwgPSBEQUcuZ2V0TG9hZChPYmplY3RWVCwgZGwsIENoYWluLCBGSU4sIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgIH0KKyAgICBJblZhbHMucHVzaF9iYWNrKEFyZ1ZhbCk7CisgIH0KKworICAvLyBJZiB0aGUgZnVuY3Rpb25zIHRha2VzIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIGNvcHkgYWxsIHJlZ3MgdG8gc3RhY2sKKyAgaWYgKGlzVmFyQXJnKSB7CisgICAgRnVuY0luZm8tPnNldFZhckFyZ3NPZmZzZXQoSW5zLnNpemUoKSAqIDgpOworICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+IExTOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoYXJnc19pbnRbaV0pKQorICAgICAgICBhcmdzX2ludFtpXSA9IEFkZExpdmVJbihNRiwgYXJnc19pbnRbaV0sICZBbHBoYTo6R1BSQ1JlZ0NsYXNzKTsKKyAgICAgIFNEVmFsdWUgYXJndCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIGFyZ3NfaW50W2ldLCBNVlQ6Omk2NCk7CisgICAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KDgsIC04ICogKDYgLSBpKSwgdHJ1ZSk7CisgICAgICBpZiAoaSA9PSAwKSBGdW5jSW5mby0+c2V0VmFyQXJnc0Jhc2UoRkkpOworICAgICAgU0RWYWx1ZSBTREZJID0gREFHLmdldEZyYW1lSW5kZXgoRkksIE1WVDo6aTY0KTsKKyAgICAgIExTLnB1c2hfYmFjayhEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBhcmd0LCBTREZJLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApKTsKKworICAgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKGFyZ3NfZmxvYXRbaV0pKQorICAgICAgICBhcmdzX2Zsb2F0W2ldID0gQWRkTGl2ZUluKE1GLCBhcmdzX2Zsb2F0W2ldLCAmQWxwaGE6OkY4UkNSZWdDbGFzcyk7CisgICAgICBhcmd0ID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgYXJnc19mbG9hdFtpXSwgTVZUOjpmNjQpOworICAgICAgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KDgsIC0gOCAqICgxMiAtIGkpLCB0cnVlKTsKKyAgICAgIFNERkkgPSBEQUcuZ2V0RnJhbWVJbmRleChGSSwgTVZUOjppNjQpOworICAgICAgTFMucHVzaF9iYWNrKERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIGFyZ3QsIFNERkksIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCkpOworICAgIH0KKworICAgIC8vU2V0IHVwIGEgdG9rZW4gZmFjdG9yIHdpdGggYWxsIHRoZSBzdGFjayB0cmFmZmljCisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgJkxTWzBdLCBMUy5zaXplKCkpOworICB9CisKKyAgcmV0dXJuIENoYWluOworfQorCitTRFZhbHVlCitBbHBoYVRhcmdldExvd2VyaW5nOjpMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworCisgIFNEVmFsdWUgQ29weSA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBBbHBoYTo6UjI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKEFscGhhSVNEOjpHbG9iYWxSZXRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jKCksIE1WVDo6aTY0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKCkpOworICBzd2l0Y2ggKE91dHMuc2l6ZSgpKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiRG8gbm90IGtub3cgaG93IHRvIHJldHVybiB0aGlzIG1hbnkgYXJndW1lbnRzISIpOworICBjYXNlIDA6CisgICAgYnJlYWs7CisgICAgLy9yZXR1cm4gU0RWYWx1ZSgpOyAvLyByZXQgdm9pZCBpcyBsZWdhbAorICBjYXNlIDE6IHsKKyAgICBFVlQgQXJnVlQgPSBPdXRzWzBdLlZUOworICAgIHVuc2lnbmVkIEFyZ1JlZzsKKyAgICBpZiAoQXJnVlQuaXNJbnRlZ2VyKCkpCisgICAgICBBcmdSZWcgPSBBbHBoYTo6UjA7CisgICAgZWxzZSB7CisgICAgICBhc3NlcnQoQXJnVlQuaXNGbG9hdGluZ1BvaW50KCkpOworICAgICAgQXJnUmVnID0gQWxwaGE6OkYwOworICAgIH0KKyAgICBDb3B5ID0gREFHLmdldENvcHlUb1JlZyhDb3B5LCBkbCwgQXJnUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dFZhbHNbMF0sIENvcHkuZ2V0VmFsdWUoMSkpOworICAgIGlmIChEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0UmVnSW5mbygpLmxpdmVvdXRfZW1wdHkoKSkKKyAgICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkuYWRkTGl2ZU91dChBcmdSZWcpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMjogeworICAgIEVWVCBBcmdWVCA9IE91dHNbMF0uVlQ7CisgICAgdW5zaWduZWQgQXJnUmVnMSwgQXJnUmVnMjsKKyAgICBpZiAoQXJnVlQuaXNJbnRlZ2VyKCkpIHsKKyAgICAgIEFyZ1JlZzEgPSBBbHBoYTo6UjA7CisgICAgICBBcmdSZWcyID0gQWxwaGE6OlIxOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoQXJnVlQuaXNGbG9hdGluZ1BvaW50KCkpOworICAgICAgQXJnUmVnMSA9IEFscGhhOjpGMDsKKyAgICAgIEFyZ1JlZzIgPSBBbHBoYTo6RjE7CisgICAgfQorICAgIENvcHkgPSBEQUcuZ2V0Q29weVRvUmVnKENvcHksIGRsLCBBcmdSZWcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dFZhbHNbMF0sIENvcHkuZ2V0VmFsdWUoMSkpOworICAgIGlmIChzdGQ6OmZpbmQoREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5saXZlb3V0X2JlZ2luKCksCisgICAgICAgICAgICAgICAgICBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0UmVnSW5mbygpLmxpdmVvdXRfZW5kKCksIEFyZ1JlZzEpCisgICAgICAgID09IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkubGl2ZW91dF9lbmQoKSkKKyAgICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkuYWRkTGl2ZU91dChBcmdSZWcxKTsKKyAgICBDb3B5ID0gREFHLmdldENvcHlUb1JlZyhDb3B5LCBkbCwgQXJnUmVnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRWYWxzWzFdLCBDb3B5LmdldFZhbHVlKDEpKTsKKyAgICBpZiAoc3RkOjpmaW5kKERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkubGl2ZW91dF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkubGl2ZW91dF9lbmQoKSwgQXJnUmVnMikKKyAgICAgICAgPT0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5saXZlb3V0X2VuZCgpKQorICAgICAgREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5hZGRMaXZlT3V0KEFyZ1JlZzIpOworICAgIGJyZWFrOworICB9CisgIH0KKyAgcmV0dXJuIERBRy5nZXROb2RlKEFscGhhSVNEOjpSRVRfRkxBRywgZGwsCisgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBDb3B5LCBDb3B5LmdldFZhbHVlKDEpKTsKK30KKwordm9pZCBBbHBoYVRhcmdldExvd2VyaW5nOjpMb3dlclZBQVJHKFNETm9kZSAqTiwgU0RWYWx1ZSAmQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmRGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBDaGFpbiA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgVkFMaXN0UCA9IE4tPmdldE9wZXJhbmQoMSk7CisgIGNvbnN0IFZhbHVlICpWQUxpc3RTID0gY2FzdDxTcmNWYWx1ZVNETm9kZT4oTi0+Z2V0T3BlcmFuZCgyKSktPmdldFZhbHVlKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBTRFZhbHVlIEJhc2UgPSBEQUcuZ2V0TG9hZChNVlQ6Omk2NCwgZGwsIENoYWluLCBWQUxpc3RQLCBWQUxpc3RTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICBTRFZhbHVlIFRtcCA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppNjQsIFZBTGlzdFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoOCwgTVZUOjppNjQpKTsKKyAgU0RWYWx1ZSBPZmZzZXQgPSBEQUcuZ2V0RXh0TG9hZChJU0Q6OlNFWFRMT0FELCBNVlQ6Omk2NCwgZGwsIEJhc2UuZ2V0VmFsdWUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wLCBOVUxMLCAwLCBNVlQ6OmkzMiwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgRGF0YVB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppNjQsIEJhc2UsIE9mZnNldCk7CisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkuaXNGbG9hdGluZ1BvaW50KCkpCisgIHsKKyAgICAvL2lmIGZwICYmIE9mZnNldCA8IDYqOCwgdGhlbiBzdWJ0cmFjdCA2KjggZnJvbSBEYXRhUHRyCisgICAgU0RWYWx1ZSBGUERhdGFQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIE1WVDo6aTY0LCBEYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoOCo2LCBNVlQ6Omk2NCkpOworICAgIFNEVmFsdWUgQ0MgPSBEQUcuZ2V0U2V0Q0MoZGwsIE1WVDo6aTY0LCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCg4KjYsIE1WVDo6aTY0KSwgSVNEOjpTRVRMVCk7CisgICAgRGF0YVB0ciA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgTVZUOjppNjQsIENDLCBGUERhdGFQdHIsIERhdGFQdHIpOworICB9CisKKyAgU0RWYWx1ZSBOZXdPZmZzZXQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTY0LCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoOCwgTVZUOjppNjQpKTsKKyAgQ2hhaW4gPSBEQUcuZ2V0VHJ1bmNTdG9yZShPZmZzZXQuZ2V0VmFsdWUoMSksIGRsLCBOZXdPZmZzZXQsIFRtcCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMiwgZmFsc2UsIGZhbHNlLCAwKTsKK30KKworLy8vIExvd2VyT3BlcmF0aW9uIC0gUHJvdmlkZSBjdXN0b20gbG93ZXJpbmcgaG9va3MgZm9yIHNvbWUgb3BlcmF0aW9ucy4KKy8vLworU0RWYWx1ZSBBbHBoYVRhcmdldExvd2VyaW5nOjpMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIHN3aXRjaCAoT3AuZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiV2Fzbid0IGV4cGVjdGluZyB0byBiZSBhYmxlIHRvIGxvd2VyIHRoaXMhIik7CisgIGNhc2UgSVNEOjpKdW1wVGFibGU6IHJldHVybiBMb3dlckp1bXBUYWJsZShPcCwgREFHKTsKKworICBjYXNlIElTRDo6SU5UUklOU0lDX1dPX0NIQUlOOiB7CisgICAgdW5zaWduZWQgSW50Tm8gPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDApKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgc3dpdGNoIChJbnRObykgeworICAgIGRlZmF1bHQ6IGJyZWFrOyAgICAvLyBEb24ndCBjdXN0b20gbG93ZXIgbW9zdCBpbnRyaW5zaWNzLgorICAgIGNhc2UgSW50cmluc2ljOjphbHBoYV91bXVsaDoKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTEhVLCBkbCwgTVZUOjppNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgxKSwgT3AuZ2V0T3BlcmFuZCgyKSk7CisgICAgfQorICB9CisKKyAgY2FzZSBJU0Q6OlNSTF9QQVJUUzogeworICAgIFNEVmFsdWUgU2hPcExvID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIFNoT3BIaSA9IE9wLmdldE9wZXJhbmQoMSk7CisgICAgU0RWYWx1ZSBTaEFtdCAgPSBPcC5nZXRPcGVyYW5kKDIpOworICAgIFNEVmFsdWUgYm0gPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIE1WVDo6aTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoNjQsIE1WVDo6aTY0KSwgU2hBbXQpOworICAgIFNEVmFsdWUgQk1DQyA9IERBRy5nZXRTZXRDQyhkbCwgTVZUOjppNjQsIGJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppNjQpLCBJU0Q6OlNFVExFKTsKKyAgICAvLyBpZiA2NCAtIHNoQW10IDw9IDAKKyAgICBTRFZhbHVlIEhpX05lZyA9IERBRy5nZXRDb25zdGFudCgwLCBNVlQ6Omk2NCk7CisgICAgU0RWYWx1ZSBTaEFtdF9OZWcgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIE1WVDo6aTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTY0KSwgYm0pOworICAgIFNEVmFsdWUgTG9fTmVnID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBNVlQ6Omk2NCwgU2hPcEhpLCBTaEFtdF9OZWcpOworICAgIC8vIGVsc2UKKyAgICBTRFZhbHVlIGNhcnJpZXMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIE1WVDo6aTY0LCBTaE9wSGksIGJtKTsKKyAgICBTRFZhbHVlIEhpX1BvcyA9ICBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE1WVDo6aTY0LCBTaE9wSGksIFNoQW10KTsKKyAgICBTRFZhbHVlIExvX1BvcyA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTVZUOjppNjQsIFNoT3BMbywgU2hBbXQpOworICAgIExvX1BvcyA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBNVlQ6Omk2NCwgTG9fUG9zLCBjYXJyaWVzKTsKKyAgICAvLyBNZXJnZQorICAgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFTEVDVCwgZGwsIE1WVDo6aTY0LCBCTUNDLCBIaV9OZWcsIEhpX1Bvcyk7CisgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgTVZUOjppNjQsIEJNQ0MsIExvX05lZywgTG9fUG9zKTsKKyAgICBTRFZhbHVlIE9wc1syXSA9IHsgTG8sIEhpIH07CisgICAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPcHMsIDIsIGRsKTsKKyAgfQorICAgIC8vICBjYXNlIElTRDo6U1JBX1BBUlRTOgorCisgICAgLy8gIGNhc2UgSVNEOjpTSExfUEFSVFM6CisKKworICBjYXNlIElTRDo6U0lOVF9UT19GUDogeworICAgIGFzc2VydChPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTY0ICYmCisgICAgICAgICAgICJVbmhhbmRsZWQgU0lOVF9UT19GUCB0eXBlIGluIGN1c3RvbSBleHBhbmRlciEiKTsKKyAgICBTRFZhbHVlIExEOworICAgIGJvb2wgaXNEb3VibGUgPSBPcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmY2NDsKKyAgICBMRCA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmY2NCwgT3AuZ2V0T3BlcmFuZCgwKSk7CisgICAgU0RWYWx1ZSBGUCA9IERBRy5nZXROb2RlKGlzRG91YmxlP0FscGhhSVNEOjpDVlRRVF86QWxwaGFJU0Q6OkNWVFFTXywgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEb3VibGU/TVZUOjpmNjQ6TVZUOjpmMzIsIExEKTsKKyAgICByZXR1cm4gRlA7CisgIH0KKyAgY2FzZSBJU0Q6OkZQX1RPX1NJTlQ6IHsKKyAgICBib29sIGlzRG91YmxlID0gT3AuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmY2NDsKKyAgICBTRFZhbHVlIHNyYyA9IE9wLmdldE9wZXJhbmQoMCk7CisKKyAgICBpZiAoIWlzRG91YmxlKSAvL1Byb21vdGUKKyAgICAgIHNyYyA9IERBRy5nZXROb2RlKElTRDo6RlBfRVhURU5ELCBkbCwgTVZUOjpmNjQsIHNyYyk7CisKKyAgICBzcmMgPSBEQUcuZ2V0Tm9kZShBbHBoYUlTRDo6Q1ZUVFFfLCBkbCwgTVZUOjpmNjQsIHNyYyk7CisKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6aTY0LCBzcmMpOworICB9CisgIGNhc2UgSVNEOjpDb25zdGFudFBvb2w6IHsKKyAgICBDb25zdGFudFBvb2xTRE5vZGUgKkNQID0gY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KE9wKTsKKyAgICBjb25zdCBDb25zdGFudCAqQyA9IENQLT5nZXRDb25zdFZhbCgpOworICAgIFNEVmFsdWUgQ1BJID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDLCBNVlQ6Omk2NCwgQ1AtPmdldEFsaWdubWVudCgpKTsKKyAgICAvLyBGSVhNRSB0aGVyZSBpc24ndCByZWFsbHkgYW55IGRlYnVnIGluZm8gaGVyZQorCisgICAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKEFscGhhSVNEOjpHUFJlbEhpLCAgZGwsIE1WVDo6aTY0LCBDUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEdMT0JBTF9PRkZTRVRfVEFCTEUoTVZUOjppNjQpKTsKKyAgICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoQWxwaGFJU0Q6OkdQUmVsTG8sIGRsLCBNVlQ6Omk2NCwgQ1BJLCBIaSk7CisgICAgcmV0dXJuIExvOworICB9CisgIGNhc2UgSVNEOjpHbG9iYWxUTFNBZGRyZXNzOgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlRMUyBub3QgaW1wbGVtZW50ZWQgZm9yIEFscGhhLiIpOworICBjYXNlIElTRDo6R2xvYmFsQWRkcmVzczogeworICAgIEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdTRE4gPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKTsKKyAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBHU0ROLT5nZXRHbG9iYWwoKTsKKyAgICBTRFZhbHVlIEdBID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoR1YsIGRsLCBNVlQ6Omk2NCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTRE4tPmdldE9mZnNldCgpKTsKKyAgICAvLyBGSVhNRSB0aGVyZSBpc24ndCByZWFsbHkgYW55IGRlYnVnIGluZm8gaGVyZQorCisgICAgLy8gICAgaWYgKCFHVi0+aGFzV2Vha0xpbmthZ2UoKSAmJiAhR1YtPmlzRGVjbGFyYXRpb24oKSAKKyAgICAvLyAgICAgICAgJiYgIUdWLT5oYXNMaW5rT25jZUxpbmthZ2UoKSkgeworICAgIGlmIChHVi0+aGFzTG9jYWxMaW5rYWdlKCkpIHsKKyAgICAgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShBbHBoYUlTRDo6R1BSZWxIaSwgIGRsLCBNVlQ6Omk2NCwgR0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRHTE9CQUxfT0ZGU0VUX1RBQkxFKE1WVDo6aTY0KSk7CisgICAgICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoQWxwaGFJU0Q6OkdQUmVsTG8sIGRsLCBNVlQ6Omk2NCwgR0EsIEhpKTsKKyAgICAgIHJldHVybiBMbzsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBbHBoYUlTRDo6UmVsTGl0LCBkbCwgTVZUOjppNjQsIEdBLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRHTE9CQUxfT0ZGU0VUX1RBQkxFKE1WVDo6aTY0KSk7CisgIH0KKyAgY2FzZSBJU0Q6OkV4dGVybmFsU3ltYm9sOiB7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKEFscGhhSVNEOjpSZWxMaXQsIGRsLCBNVlQ6Omk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKGNhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KE9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRTeW1ib2woKSwgTVZUOjppNjQpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0R0xPQkFMX09GRlNFVF9UQUJMRShNVlQ6Omk2NCkpOworICB9CisKKyAgY2FzZSBJU0Q6OlVSRU06CisgIGNhc2UgSVNEOjpTUkVNOgorICAgIC8vRXhwYW5kIG9ubHkgb24gY29uc3RhbnQgY2FzZQorICAgIGlmIChPcC5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpIHsKKyAgICAgIEVWVCBWVCA9IE9wLmdldE5vZGUoKS0+Z2V0VmFsdWVUeXBlKDApOworICAgICAgU0RWYWx1ZSBUbXAxID0gT3AuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVSRU0gPworICAgICAgICBCdWlsZFVESVYoT3AuZ2V0Tm9kZSgpLCBEQUcsIE5VTEwpIDoKKyAgICAgICAgQnVpbGRTRElWKE9wLmdldE5vZGUoKSwgREFHLCBOVUxMKTsKKyAgICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZGwsIFZULCBUbXAxLCBPcC5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIFZULCBPcC5nZXRPcGVyYW5kKDApLCBUbXAxKTsKKyAgICAgIHJldHVybiBUbXAxOworICAgIH0KKyAgICAvL2ZhbGwgdGhyb3VnaAorICBjYXNlIElTRDo6U0RJVjoKKyAgY2FzZSBJU0Q6OlVESVY6CisgICAgaWYgKE9wLmdldFZhbHVlVHlwZSgpLmlzSW50ZWdlcigpKSB7CisgICAgICBpZiAoT3AuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50KQorICAgICAgICByZXR1cm4gT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRElWID8gQnVpbGRTRElWKE9wLmdldE5vZGUoKSwgREFHLCBOVUxMKQorICAgICAgICAgIDogQnVpbGRVRElWKE9wLmdldE5vZGUoKSwgREFHLCBOVUxMKTsKKyAgICAgIGNvbnN0IGNoYXIqIG9wc3RyID0gMDsKKyAgICAgIHN3aXRjaCAoT3AuZ2V0T3Bjb2RlKCkpIHsKKyAgICAgIGNhc2UgSVNEOjpVUkVNOiBvcHN0ciA9ICJfX3JlbXF1IjsgYnJlYWs7CisgICAgICBjYXNlIElTRDo6U1JFTTogb3BzdHIgPSAiX19yZW1xIjsgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlVESVY6IG9wc3RyID0gIl9fZGl2cXUiOyBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTRElWOiBvcHN0ciA9ICJfX2RpdnEiOyAgYnJlYWs7CisgICAgICB9CisgICAgICBTRFZhbHVlIFRtcDEgPSBPcC5nZXRPcGVyYW5kKDApLAorICAgICAgICBUbXAyID0gT3AuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgQWRkciA9IERBRy5nZXRFeHRlcm5hbFN5bWJvbChvcHN0ciwgTVZUOjppNjQpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKEFscGhhSVNEOjpEaXZDYWxsLCBkbCwgTVZUOjppNjQsIEFkZHIsIFRtcDEsIFRtcDIpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIElTRDo6VkFBUkc6IHsKKyAgICBTRFZhbHVlIENoYWluLCBEYXRhUHRyOworICAgIExvd2VyVkFBUkcoT3AuZ2V0Tm9kZSgpLCBDaGFpbiwgRGF0YVB0ciwgREFHKTsKKworICAgIFNEVmFsdWUgUmVzdWx0OworICAgIGlmIChPcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmkzMikKKyAgICAgIFJlc3VsdCA9IERBRy5nZXRFeHRMb2FkKElTRDo6U0VYVExPQUQsIE1WVDo6aTY0LCBkbCwgQ2hhaW4sIERhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBNVlQ6OmkzMiwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICBlbHNlCisgICAgICBSZXN1bHQgPSBEQUcuZ2V0TG9hZChPcC5nZXRWYWx1ZVR5cGUoKSwgZGwsIENoYWluLCBEYXRhUHRyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisgIGNhc2UgSVNEOjpWQUNPUFk6IHsKKyAgICBTRFZhbHVlIENoYWluID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIERlc3RQID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgICBTRFZhbHVlIFNyY1AgPSBPcC5nZXRPcGVyYW5kKDIpOworICAgIGNvbnN0IFZhbHVlICpEZXN0UyA9IGNhc3Q8U3JjVmFsdWVTRE5vZGU+KE9wLmdldE9wZXJhbmQoMykpLT5nZXRWYWx1ZSgpOworICAgIGNvbnN0IFZhbHVlICpTcmNTID0gY2FzdDxTcmNWYWx1ZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCg0KSktPmdldFZhbHVlKCk7CisKKyAgICBTRFZhbHVlIFZhbCA9IERBRy5nZXRMb2FkKGdldFBvaW50ZXJUeSgpLCBkbCwgQ2hhaW4sIFNyY1AsIFNyY1MsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgIFNEVmFsdWUgUmVzdWx0ID0gREFHLmdldFN0b3JlKFZhbC5nZXRWYWx1ZSgxKSwgZGwsIFZhbCwgRGVzdFAsIERlc3RTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgU0RWYWx1ZSBOUCA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppNjQsIFNyY1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDgsIE1WVDo6aTY0KSk7CisgICAgVmFsID0gREFHLmdldEV4dExvYWQoSVNEOjpTRVhUTE9BRCwgTVZUOjppNjQsIGRsLCBSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlAsIE5VTEwsMCwgTVZUOjppMzIsIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgU0RWYWx1ZSBOUEQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTY0LCBEZXN0UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDgsIE1WVDo6aTY0KSk7CisgICAgcmV0dXJuIERBRy5nZXRUcnVuY1N0b3JlKFZhbC5nZXRWYWx1ZSgxKSwgZGwsIFZhbCwgTlBELCBOVUxMLCAwLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgfQorICBjYXNlIElTRDo6VkFTVEFSVDogeworICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgICAgQWxwaGFNYWNoaW5lRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88QWxwaGFNYWNoaW5lRnVuY3Rpb25JbmZvPigpOworCisgICAgU0RWYWx1ZSBDaGFpbiA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBWQUxpc3RQID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgICBjb25zdCBWYWx1ZSAqVkFMaXN0UyA9IGNhc3Q8U3JjVmFsdWVTRE5vZGU+KE9wLmdldE9wZXJhbmQoMikpLT5nZXRWYWx1ZSgpOworCisgICAgLy8gdmFzdGFydCBzdG9yZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFZhckFyZ3NCYXNlIGFuZCBWYXJBcmdzT2Zmc2V0CisgICAgU0RWYWx1ZSBGUiAgPSBEQUcuZ2V0RnJhbWVJbmRleChGdW5jSW5mby0+Z2V0VmFyQXJnc0Jhc2UoKSwgTVZUOjppNjQpOworICAgIFNEVmFsdWUgUzEgID0gREFHLmdldFN0b3JlKENoYWluLCBkbCwgRlIsIFZBTGlzdFAsIFZBTGlzdFMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICBTRFZhbHVlIFNBMiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppNjQsIFZBTGlzdFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCg4LCBNVlQ6Omk2NCkpOworICAgIHJldHVybiBEQUcuZ2V0VHJ1bmNTdG9yZShTMSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChGdW5jSW5mby0+Z2V0VmFyQXJnc09mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppNjQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQTIsIE5VTEwsIDAsIE1WVDo6aTMyLCBmYWxzZSwgZmFsc2UsIDApOworICB9CisgIGNhc2UgSVNEOjpSRVRVUk5BRERSOgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShBbHBoYUlTRDo6R2xvYmFsUmV0QWRkciwgRGVidWdMb2MoKSwgTVZUOjppNjQpOworICAgICAgLy9GSVhNRTogaW1wbGVtZW50CisgIGNhc2UgSVNEOjpGUkFNRUFERFI6ICAgICAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKwordm9pZCBBbHBoYVRhcmdldExvd2VyaW5nOjpSZXBsYWNlTm9kZVJlc3VsdHMoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+JlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIGFzc2VydChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIgJiYKKyAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VkFBUkcgJiYKKyAgICAgICAgICJVbmtub3duIG5vZGUgdG8gY3VzdG9tIHByb21vdGUhIik7CisKKyAgU0RWYWx1ZSBDaGFpbiwgRGF0YVB0cjsKKyAgTG93ZXJWQUFSRyhOLCBDaGFpbiwgRGF0YVB0ciwgREFHKTsKKyAgU0RWYWx1ZSBSZXMgPSBEQUcuZ2V0TG9hZChOLT5nZXRWYWx1ZVR5cGUoMCksIGRsLCBDaGFpbiwgRGF0YVB0ciwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICBSZXN1bHRzLnB1c2hfYmFjayhSZXMpOworICBSZXN1bHRzLnB1c2hfYmFjayhTRFZhbHVlKFJlcy5nZXROb2RlKCksIDEpKTsKK30KKworCisvL0lubGluZSBBc20KKworLy8vIGdldENvbnN0cmFpbnRUeXBlIC0gR2l2ZW4gYSBjb25zdHJhaW50IGxldHRlciwgcmV0dXJuIHRoZSB0eXBlIG9mCisvLy8gY29uc3RyYWludCBpdCBpcyBmb3IgdGhpcyB0YXJnZXQuCitBbHBoYVRhcmdldExvd2VyaW5nOjpDb25zdHJhaW50VHlwZQorQWxwaGFUYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQpIGNvbnN0IHsKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdyJzoKKyAgICAgIHJldHVybiBDX1JlZ2lzdGVyQ2xhc3M7CisgICAgfQorICB9CisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoQ29uc3RyYWludCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVuc2lnbmVkPiBBbHBoYVRhcmdldExvd2VyaW5nOjoKK2dldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0IHsKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsgIC8vIFVua25vd24gY29uc3RyaWFudCBsZXR0ZXIKKyAgICBjYXNlICdmJzoKKyAgICAgIHJldHVybiBtYWtlX3ZlY3Rvcjx1bnNpZ25lZD4oQWxwaGE6OkYwICwgQWxwaGE6OkYxICwgQWxwaGE6OkYyICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkYzICwgQWxwaGE6OkY0ICwgQWxwaGE6OkY1ICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkY2ICwgQWxwaGE6OkY3ICwgQWxwaGE6OkY4ICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkY5ICwgQWxwaGE6OkYxMCwgQWxwaGE6OkYxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkYxMiwgQWxwaGE6OkYxMywgQWxwaGE6OkYxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkYxNSwgQWxwaGE6OkYxNiwgQWxwaGE6OkYxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkYxOCwgQWxwaGE6OkYxOSwgQWxwaGE6OkYyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkYyMSwgQWxwaGE6OkYyMiwgQWxwaGE6OkYyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkYyNCwgQWxwaGE6OkYyNSwgQWxwaGE6OkYyNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkYyNywgQWxwaGE6OkYyOCwgQWxwaGE6OkYyOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwaGE6OkYzMCwgQWxwaGE6OkYzMSwgMCk7CisgICAgY2FzZSAncic6CisgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KEFscGhhOjpSMCAsIEFscGhhOjpSMSAsIEFscGhhOjpSMiAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSMyAsIEFscGhhOjpSNCAsIEFscGhhOjpSNSAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSNiAsIEFscGhhOjpSNyAsIEFscGhhOjpSOCAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSOSAsIEFscGhhOjpSMTAsIEFscGhhOjpSMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSMTIsIEFscGhhOjpSMTMsIEFscGhhOjpSMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSMTUsIEFscGhhOjpSMTYsIEFscGhhOjpSMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSMTgsIEFscGhhOjpSMTksIEFscGhhOjpSMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSMjEsIEFscGhhOjpSMjIsIEFscGhhOjpSMjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSMjQsIEFscGhhOjpSMjUsIEFscGhhOjpSMjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSMjcsIEFscGhhOjpSMjgsIEFscGhhOjpSMjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhOjpSMzAsIEFscGhhOjpSMzEsIDApOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKK30KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgT3RoZXIgTG93ZXJpbmcgQ29kZQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworTWFjaGluZUJhc2ljQmxvY2sgKgorQWxwaGFUYXJnZXRMb3dlcmluZzo6RW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICBhc3NlcnQoKE1JLT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6Q0FTMzIgfHwKKyAgICAgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gQWxwaGE6OkNBUzY0IHx8CisgICAgICAgICAgTUktPmdldE9wY29kZSgpID09IEFscGhhOjpMQVMzMiB8fAorICAgICAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6TEFTNjQgfHwKKyAgICAgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gQWxwaGE6OlNXQVAzMiB8fAorICAgICAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6U1dBUDY0KSAmJgorICAgICAgICAgIlVuZXhwZWN0ZWQgaW5zdHIgdHlwZSB0byBpbnNlcnQiKTsKKworICBib29sIGlzMzIgPSBNSS0+Z2V0T3Bjb2RlKCkgPT0gQWxwaGE6OkNBUzMyIHx8CisgICAgTUktPmdldE9wY29kZSgpID09IEFscGhhOjpMQVMzMiB8fAorICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6U1dBUDMyOworCisgIC8vTG9hZCBsb2NrZWQgc3RvcmUgY29uZGl0aW9uYWwgZm9yIGF0b21pYyBvcHMgdGFrZSBvbiB0aGUgc2FtZSBmb3JtCisgIC8vc3RhcnQ6CisgIC8vbGwKKyAgLy9kbyBzdHVmZiAobWF5YmUgYnJhbmNoIHRvIGV4aXQpCisgIC8vc2MKKyAgLy90ZXN0IHNjIGFuZCBtYXliZSBicmFuY2sgdG8gc3RhcnQKKyAgLy9leGl0OgorICBjb25zdCBCYXNpY0Jsb2NrICpMTFZNX0JCID0gQkItPmdldEJhc2ljQmxvY2soKTsKKyAgRGVidWdMb2MgZGwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJdCA9IEJCOworICArK0l0OworCisgIE1hY2hpbmVCYXNpY0Jsb2NrICp0aGlzTUJCID0gQkI7CisgIE1hY2hpbmVGdW5jdGlvbiAqRiA9IEJCLT5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmxsc2NNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKnNpbmtNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKworICBzaW5rTUJCLT5zcGxpY2Uoc2lua01CQi0+YmVnaW4oKSwgdGhpc01CQiwKKyAgICAgICAgICAgICAgICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKE1JKSksCisgICAgICAgICAgICAgICAgICB0aGlzTUJCLT5lbmQoKSk7CisgIHNpbmtNQkItPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXModGhpc01CQik7CisKKyAgRi0+aW5zZXJ0KEl0LCBsbHNjTUJCKTsKKyAgRi0+aW5zZXJ0KEl0LCBzaW5rTUJCKTsKKworICBCdWlsZE1JKHRoaXNNQkIsIGRsLCBUSUktPmdldChBbHBoYTo6QlIpKS5hZGRNQkIobGxzY01CQik7CisKKyAgdW5zaWduZWQgcmVnX3JlcyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpLAorICAgIHJlZ19wdHIgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSwKKyAgICByZWdfdjIgPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSwKKyAgICByZWdfc3RvcmUgPSBGLT5nZXRSZWdJbmZvKCkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKCZBbHBoYTo6R1BSQ1JlZ0NsYXNzKTsKKworICBCdWlsZE1JKGxsc2NNQkIsIGRsLCBUSUktPmdldChpczMyID8gQWxwaGE6OkxETF9MIDogQWxwaGE6OkxEUV9MKSwKKyAgICAgICAgICByZWdfcmVzKS5hZGRJbW0oMCkuYWRkUmVnKHJlZ19wdHIpOworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBjYXNlIEFscGhhOjpDQVMzMjoKKyAgY2FzZSBBbHBoYTo6Q0FTNjQ6IHsKKyAgICB1bnNpZ25lZCByZWdfY21wCisgICAgICA9IEYtPmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoJkFscGhhOjpHUFJDUmVnQ2xhc3MpOworICAgIEJ1aWxkTUkobGxzY01CQiwgZGwsIFRJSS0+Z2V0KEFscGhhOjpDTVBFUSksIHJlZ19jbXApCisgICAgICAuYWRkUmVnKHJlZ192MikuYWRkUmVnKHJlZ19yZXMpOworICAgIEJ1aWxkTUkobGxzY01CQiwgZGwsIFRJSS0+Z2V0KEFscGhhOjpCRVEpKQorICAgICAgLmFkZEltbSgwKS5hZGRSZWcocmVnX2NtcCkuYWRkTUJCKHNpbmtNQkIpOworICAgIEJ1aWxkTUkobGxzY01CQiwgZGwsIFRJSS0+Z2V0KEFscGhhOjpCSVNyKSwgcmVnX3N0b3JlKQorICAgICAgLmFkZFJlZyhBbHBoYTo6UjMxKS5hZGRSZWcoTUktPmdldE9wZXJhbmQoMykuZ2V0UmVnKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQWxwaGE6OkxBUzMyOgorICBjYXNlIEFscGhhOjpMQVM2NDogeworICAgIEJ1aWxkTUkobGxzY01CQiwgZGwsVElJLT5nZXQoaXMzMiA/IEFscGhhOjpBRERMciA6IEFscGhhOjpBRERRciksIHJlZ19zdG9yZSkKKyAgICAgIC5hZGRSZWcocmVnX3JlcykuYWRkUmVnKHJlZ192Mik7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBbHBoYTo6U1dBUDMyOgorICBjYXNlIEFscGhhOjpTV0FQNjQ6IHsKKyAgICBCdWlsZE1JKGxsc2NNQkIsIGRsLCBUSUktPmdldChBbHBoYTo6QklTciksIHJlZ19zdG9yZSkKKyAgICAgIC5hZGRSZWcocmVnX3YyKS5hZGRSZWcocmVnX3YyKTsKKyAgICBicmVhazsKKyAgfQorICB9CisgIEJ1aWxkTUkobGxzY01CQiwgZGwsIFRJSS0+Z2V0KGlzMzIgPyBBbHBoYTo6U1RMX0MgOiBBbHBoYTo6U1RRX0MpLCByZWdfc3RvcmUpCisgICAgLmFkZFJlZyhyZWdfc3RvcmUpLmFkZEltbSgwKS5hZGRSZWcocmVnX3B0cik7CisgIEJ1aWxkTUkobGxzY01CQiwgZGwsIFRJSS0+Z2V0KEFscGhhOjpCRVEpKQorICAgIC5hZGRJbW0oMCkuYWRkUmVnKHJlZ19zdG9yZSkuYWRkTUJCKGxsc2NNQkIpOworICBCdWlsZE1JKGxsc2NNQkIsIGRsLCBUSUktPmdldChBbHBoYTo6QlIpKS5hZGRNQkIoc2lua01CQik7CisKKyAgdGhpc01CQi0+YWRkU3VjY2Vzc29yKGxsc2NNQkIpOworICBsbHNjTUJCLT5hZGRTdWNjZXNzb3IobGxzY01CQik7CisgIGxsc2NNQkItPmFkZFN1Y2Nlc3NvcihzaW5rTUJCKTsKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisKKyAgcmV0dXJuIHNpbmtNQkI7Cit9CisKK2Jvb2wKK0FscGhhVGFyZ2V0TG93ZXJpbmc6OmlzT2Zmc2V0Rm9sZGluZ0xlZ2FsKGNvbnN0IEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBKSBjb25zdCB7CisgIC8vIFRoZSBBbHBoYSB0YXJnZXQgaXNuJ3QgeWV0IGF3YXJlIG9mIG9mZnNldHMuCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBbHBoYVRhcmdldExvd2VyaW5nOjppc0ZQSW1tTGVnYWwoY29uc3QgQVBGbG9hdCAmSW1tLCBFVlQgVlQpIGNvbnN0IHsKKyAgaWYgKFZUICE9IE1WVDo6ZjMyICYmIFZUICE9IE1WVDo6ZjY0KQorICAgIHJldHVybiBmYWxzZTsKKyAgLy8gKzAuMCAgIEYzMQorICAvLyArMC4wZiAgRjMxCisgIC8vIC0wLjAgIC1GMzEKKyAgLy8gLTAuMGYgLUYzMQorICByZXR1cm4gSW1tLmlzWmVybygpIHx8IEltbS5pc05lZ1plcm8oKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJU2VsTG93ZXJpbmcuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJU2VsTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmUwYzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYUlTZWxMb3dlcmluZy5oCkBAIC0wLDAgKzEsMTM4IEBACisvLz09PS0tIEFscGhhSVNlbExvd2VyaW5nLmggLSBBbHBoYSBEQUcgTG93ZXJpbmcgSW50ZXJmYWNlIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgQWxwaGEgdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50byBhCisvLyBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfQUxQSEFfQUxQSEFJU0VMTE9XRVJJTkdfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9BTFBIQV9BTFBIQUlTRUxMT1dFUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9WZWN0b3JFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaCIKKyNpbmNsdWRlICJBbHBoYS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgbmFtZXNwYWNlIEFscGhhSVNEIHsKKyAgICBlbnVtIE5vZGVUeXBlIHsKKyAgICAgIC8vIFN0YXJ0IHRoZSBudW1iZXJpbmcgd2hlcmUgdGhlIGJ1aWx0aW5nIG9wcyBhbmQgdGFyZ2V0IG9wcyBsZWF2ZSBvZmYuCisgICAgICBGSVJTVF9OVU1CRVIgPSBJU0Q6OkJVSUxUSU5fT1BfRU5ELAorICAgICAgLy9UaGVzZSBjb3Jyb3Nwb25kIHRvIHRoZSBpZGVudGljYWwgSW5zdHJ1Y3Rpb24KKyAgICAgIENWVFFUXywgQ1ZUUVNfLCBDVlRUUV8sCisKKyAgICAgIC8vLyBHUFJlbEhpL0dQUmVsTG8gLSBUaGVzZSByZXByZXNlbnQgdGhlIGhpZ2ggYW5kIGxvdyAxNi1iaXQKKyAgICAgIC8vLyBwYXJ0cyBvZiBhIGdsb2JhbCBhZGRyZXNzIHJlc3BlY3RpdmVseS4KKyAgICAgIEdQUmVsSGksIEdQUmVsTG8sIAorCisgICAgICAvLy8gUmV0TGl0IC0gTGl0ZXJhbCBSZWxvY2F0aW9uIG9mIGEgR2xvYmFsCisgICAgICBSZWxMaXQsCisKKyAgICAgIC8vLyBHbG9iYWxSZXRBZGRyIC0gdXNlZCB0byByZXN0b3JlIHRoZSByZXR1cm4gYWRkcmVzcworICAgICAgR2xvYmFsUmV0QWRkciwKKyAgICAgIAorICAgICAgLy8vIENBTEwgLSBOb3JtYWwgY2FsbC4KKyAgICAgIENBTEwsCisKKyAgICAgIC8vLyBESVZDQUxMIC0gdXNlZCBmb3Igc3BlY2lhbCBsaWJyYXJ5IGNhbGxzIGZvciBkaXYgYW5kIHJlbQorICAgICAgRGl2Q2FsbCwKKyAgICAgIAorICAgICAgLy8vIHJldHVybiBmbGFnIG9wZXJhbmQKKyAgICAgIFJFVF9GTEFHLAorCisgICAgICAvLy8gQ0hBSU4gPSBDT05EX0JSQU5DSCBDSEFJTiwgT1BDLCAoR3xGKVBSQywgREVTVEJCIFssIElORkxBR10gLSBUaGlzCisgICAgICAvLy8gY29ycmVzcG9uZHMgdG8gdGhlIENPTkRfQlJBTkNIIHBzZXVkbyBpbnN0cnVjdGlvbi4gIAorICAgICAgLy8vICpQUkMgaXMgdGhlIGlucHV0IHJlZ2lzdGVyIHRvIGNvbXBhcmUgdG8gemVybywKKyAgICAgIC8vLyBPUEMgaXMgdGhlIGJyYW5jaCBvcGNvZGUgdG8gdXNlIChlLmcuIEFscGhhOjpCRVEpLAorICAgICAgLy8vIERFU1RCQiBpcyB0aGUgZGVzdGluYXRpb24gYmxvY2sgdG8gYnJhbmNoIHRvLCBhbmQgSU5GTEFHIGlzCisgICAgICAvLy8gYW4gb3B0aW9uYWwgaW5wdXQgZmxhZyBhcmd1bWVudC4KKyAgICAgIENPTkRfQlJBTkNIX0ksIENPTkRfQlJBTkNIX0YKKworICAgIH07CisgIH0KKworICBjbGFzcyBBbHBoYVRhcmdldExvd2VyaW5nIDogcHVibGljIFRhcmdldExvd2VyaW5nIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEFscGhhVGFyZ2V0TG93ZXJpbmcoVGFyZ2V0TWFjaGluZSAmVE0pOworICAgIAorICAgIC8vLyBnZXRTZXRDQ1Jlc3VsdFR5cGUgLSBHZXQgdGhlIFNFVENDIHJlc3VsdCBWYWx1ZVR5cGUKKyAgICB2aXJ0dWFsIE1WVDo6U2ltcGxlVmFsdWVUeXBlIGdldFNldENDUmVzdWx0VHlwZShFVlQgVlQpIGNvbnN0OworCisgICAgLy8vIExvd2VyT3BlcmF0aW9uIC0gUHJvdmlkZSBjdXN0b20gbG93ZXJpbmcgaG9va3MgZm9yIHNvbWUgb3BlcmF0aW9ucy4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIFNEVmFsdWUgTG93ZXJPcGVyYXRpb24oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgLy8vIFJlcGxhY2VOb2RlUmVzdWx0cyAtIFJlcGxhY2UgdGhlIHJlc3VsdHMgb2Ygbm9kZSB3aXRoIGFuIGlsbGVnYWwgcmVzdWx0CisgICAgLy8vIHR5cGUgd2l0aCBuZXcgdmFsdWVzIGJ1aWx0IG91dCBvZiBjdXN0b20gY29kZS4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgUmVwbGFjZU5vZGVSZXN1bHRzKFNETm9kZSAqTiwgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+JlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLyBGcmllbmRseSBuYW1lcyBmb3IgZHVtcHMKKyAgICBjb25zdCBjaGFyICpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworCisgICAgU0RWYWx1ZSBMb3dlckNhbGxSZXN1bHQoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBJbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICBDb25zdHJhaW50VHlwZSBnZXRDb25zdHJhaW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCkgY29uc3Q7CisKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gCisgICAgICBnZXRSZWdDbGFzc0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdDsKKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICoKKyAgICAgIEVtaXRJbnN0cldpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZzZXRGb2xkaW5nTGVnYWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EpIGNvbnN0OworCisgICAgLy8vIGdldEZ1bmN0aW9uQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBMb2cyIGFsaWdubWVudCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0OworCisgICAgLy8vIGlzRlBJbW1MZWdhbCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGNhbiBpbnN0cnVjdGlvbiBzZWxlY3QgdGhlCisgICAgLy8vIHNwZWNpZmllZCBGUCBpbW1lZGlhdGUgbmF0aXZlbHkuIElmIGZhbHNlLCB0aGUgbGVnYWxpemVyIHdpbGwKKyAgICAvLy8gbWF0ZXJpYWxpemUgdGhlIEZQIGltbWVkaWF0ZSBhcyBhIGxvYWQgZnJvbSBhIGNvbnN0YW50IHBvb2wuCisgICAgdmlydHVhbCBib29sIGlzRlBJbW1MZWdhbChjb25zdCBBUEZsb2F0ICZJbW0sIEVWVCBWVCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBIZWxwZXJzIGZvciBjdXN0b20gbG93ZXJpbmcuCisgICAgdm9pZCBMb3dlclZBQVJHKFNETm9kZSAqTiwgU0RWYWx1ZSAmQ2hhaW4sIFNEVmFsdWUgJkRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJGb3JtYWxBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlckNhbGwoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLCBib29sICZpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyUmV0dXJuKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgfTsKK30KKworI2VuZGlmICAgLy8gTExWTV9UQVJHRVRfQUxQSEFfQUxQSEFJU0VMTE9XRVJJTkdfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RyRm9ybWF0cy50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJbnN0ckZvcm1hdHMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyMjkxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJbnN0ckZvcm1hdHMudGQKQEAgLTAsMCArMSwyNjggQEAKKy8vPT09LSBBbHBoYUluc3RyRm9ybWF0cy50ZCAtIEFscGhhIEluc3RydWN0aW9uIEZvcm1hdHMgLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8zLjM6DQorLy9NZW1vcnkNCisvL0JyYW5jaA0KKy8vT3BlcmF0ZQ0KKy8vRmxvYXRpbmctcG9pbnQNCisvL1BBTGNvZGUNCisNCitkZWYgdThpbW0gICA6IE9wZXJhbmQ8aTY0PjsNCitkZWYgczE0aW1tICA6IE9wZXJhbmQ8aTY0PjsNCitkZWYgczE2aW1tICA6IE9wZXJhbmQ8aTY0PjsNCitkZWYgczIxaW1tICA6IE9wZXJhbmQ8aTY0PjsNCitkZWYgczY0aW1tICA6IE9wZXJhbmQ8aTY0PjsNCitkZWYgdTY0aW1tICA6IE9wZXJhbmQ8aTY0PjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEluc3RydWN0aW9uIGZvcm1hdCBzdXBlcmNsYXNzDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBBbHBoYSBpbnN0cnVjdGlvbiBiYXNlbGluZQ0KK2NsYXNzIEluc3RBbHBoYTxiaXRzPDY+IG9wLCBzdHJpbmcgYXNtc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluPiA6IEluc3RydWN0aW9uIHsNCisgIGZpZWxkIGJpdHM8MzI+IEluc3Q7DQorICBsZXQgTmFtZXNwYWNlID0gIkFscGhhIjsNCisgIGxldCBBc21TdHJpbmcgPSBhc21zdHI7DQorICBsZXQgSW5zdHszMS0yNn0gPSBvcDsNCisgIGxldCBJdGluZXJhcnkgPSBpdGluOw0KK30NCisNCisNCisvLzMuMy4xDQorY2xhc3MgTUZvcm08Yml0czw2PiBvcGNvZGUsIGJpdCBsb2FkLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICAgICAgICA6IEluc3RBbHBoYTxvcGNvZGUsIGFzbXN0ciwgaXRpbj4gew0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgbGV0IGNhbkZvbGRBc0xvYWQgPSBsb2FkOw0KKyAgbGV0IERlZnMgPSBbUjI4XTsgLy9XZSBtYXkgdXNlIHRoaXMgZm9yIGZyYW1lIGluZGV4IGNhbGN1bGF0aW9ucywgc28gcmVzZXJ2ZSBpdCBoZXJlDQorDQorICBiaXRzPDU+IFJhOw0KKyAgYml0czwxNj4gZGlzcDsNCisgIGJpdHM8NT4gUmI7DQorDQorICBsZXQgSW5zdHsyNS0yMX0gPSBSYTsNCisgIGxldCBJbnN0ezIwLTE2fSA9IFJiOw0KKyAgbGV0IEluc3R7MTUtMH0gPSBkaXNwOw0KK30NCitjbGFzcyBNZmNGb3JtPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDE2PiBmYywgc3RyaW5nIGFzbXN0ciwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICAgICAgICA6IEluc3RBbHBoYTxvcGNvZGUsIGFzbXN0ciwgaXRpbj4geyAgICANCisgIGJpdHM8NT4gUmE7DQorDQorICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBHUFJDOiRSQSk7DQorICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMpOw0KKyAgbGV0IEluc3R7MjUtMjF9ID0gUmE7DQorICBsZXQgSW5zdHsyMC0xNn0gPSAwOw0KKyAgbGV0IEluc3R7MTUtMH0gPSBmYzsNCit9DQorY2xhc3MgTWZjUEZvcm08Yml0czw2PiBvcGNvZGUsIGJpdHM8MTY+IGZjLCBzdHJpbmcgYXNtc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluPiANCisgICAgICAgIDogSW5zdEFscGhhPG9wY29kZSwgYXNtc3RyLCBpdGluPiB7ICAgIA0KKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOw0KKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zKTsNCisgIGxldCBJbnN0ezI1LTIxfSA9IDA7DQorICBsZXQgSW5zdHsyMC0xNn0gPSAwOw0KKyAgbGV0IEluc3R7MTUtMH0gPSBmYzsNCit9DQorDQorY2xhc3MgTWJyRm9ybTxiaXRzPDY+IG9wY29kZSwgYml0czwyPiBUQiwgZGFnIE9MLCBzdHJpbmcgYXNtc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluPg0KKyAgICA6IEluc3RBbHBoYTxvcGNvZGUsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw1PiBSYTsNCisgIGJpdHM8NT4gUmI7DQorICBiaXRzPDE0PiBkaXNwOw0KKw0KKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOw0KKyAgbGV0IEluT3BlcmFuZExpc3QgPSBPTDsNCisNCisgIGxldCBJbnN0ezI1LTIxfSA9IFJhOw0KKyAgbGV0IEluc3R7MjAtMTZ9ID0gUmI7DQorICBsZXQgSW5zdHsxNS0xNH0gPSBUQjsNCisgIGxldCBJbnN0ezEzLTB9ID0gZGlzcDsNCit9DQorY2xhc3MgTWJycEZvcm08Yml0czw2PiBvcGNvZGUsIGJpdHM8Mj4gVEIsIGRhZyBPTCwgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4sIEluc3RySXRpbkNsYXNzIGl0aW4+DQorICAgIDogSW5zdEFscGhhPG9wY29kZSwgYXNtc3RyLCBpdGluPiB7DQorICBsZXQgUGF0dGVybj1wYXR0ZXJuOw0KKyAgYml0czw1PiBSYTsNCisgIGJpdHM8NT4gUmI7DQorICBiaXRzPDE0PiBkaXNwOw0KKw0KKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOw0KKyAgbGV0IEluT3BlcmFuZExpc3QgPSBPTDsNCisNCisgIGxldCBJbnN0ezI1LTIxfSA9IFJhOw0KKyAgbGV0IEluc3R7MjAtMTZ9ID0gUmI7DQorICBsZXQgSW5zdHsxNS0xNH0gPSBUQjsNCisgIGxldCBJbnN0ezEzLTB9ID0gZGlzcDsNCit9DQorDQorLy8zLjMuMg0KK2RlZiB0YXJnZXQgOiBPcGVyYW5kPE90aGVyVlQ+IHt9DQorDQorbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaGFzQ3RybERlcCA9IDEgaW4gew0KK2NsYXNzIEJGb3JtTjxiaXRzPDY+IG9wY29kZSwgZGFnIE9MLCBzdHJpbmcgYXNtc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluPg0KKyAgIDogSW5zdEFscGhhPG9wY29kZSwgYXNtc3RyLCBpdGluPiB7DQorICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7DQorICBsZXQgSW5PcGVyYW5kTGlzdCA9IE9MOw0KKyAgYml0czw2ND4gT3BjOyAvL2R1bW15DQorICBiaXRzPDU+IFJhOw0KKyAgYml0czwyMT4gZGlzcDsNCisNCisgIGxldCBJbnN0ezI1LTIxfSA9IFJhOw0KKyAgbGV0IEluc3R7MjAtMH0gPSBkaXNwOw0KK30NCit9DQorDQorbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSBpbg0KK2NsYXNzIEJGb3JtRDxiaXRzPDY+IG9wY29kZSwgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4sIEluc3RySXRpbkNsYXNzIGl0aW4+IA0KKyAgICA6IEluc3RBbHBoYTxvcGNvZGUsIGFzbXN0ciwgaXRpbj4gew0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOw0KKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHRhcmdldDokRElTUCk7DQorICBiaXRzPDU+IFJhOw0KKyAgYml0czwyMT4gZGlzcDsNCisNCisgIGxldCBJbnN0ezI1LTIxfSA9IFJhOw0KKyAgbGV0IEluc3R7MjAtMH0gPSBkaXNwOw0KK30NCisNCisvLzMuMy4zDQorY2xhc3MgT0Zvcm08Yml0czw2PiBvcGNvZGUsIGJpdHM8Nz4gZnVuLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICAgIDogSW5zdEFscGhhPG9wY29kZSwgYXNtc3RyLCBpdGluPiB7DQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBHUFJDOiRSQyk7DQorICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgR1BSQzokUkEsIEdQUkM6JFJCKTsNCisNCisgIGJpdHM8NT4gUmM7DQorICBiaXRzPDU+IFJhOw0KKyAgYml0czw1PiBSYjsNCisgIGJpdHM8Nz4gRnVuY3Rpb24gPSBmdW47DQorDQorICBsZXQgSW5zdHsyNS0yMX0gPSBSYTsNCisgIGxldCBJbnN0ezIwLTE2fSA9IFJiOw0KKyAgbGV0IEluc3R7MTUtMTN9ID0gMDsNCisgIGxldCBJbnN0ezEyfSA9IDA7DQorICBsZXQgSW5zdHsxMS01fSA9IEZ1bmN0aW9uOw0KKyAgbGV0IEluc3R7NC0wfSA9IFJjOw0KK30NCisNCitjbGFzcyBPRm9ybTI8Yml0czw2PiBvcGNvZGUsIGJpdHM8Nz4gZnVuLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICAgIDogSW5zdEFscGhhPG9wY29kZSwgYXNtc3RyLCBpdGluPiB7DQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBHUFJDOiRSQyk7DQorICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgR1BSQzokUkIpOw0KKw0KKyAgYml0czw1PiBSYzsNCisgIGJpdHM8NT4gUmI7DQorICBiaXRzPDc+IEZ1bmN0aW9uID0gZnVuOw0KKw0KKyAgbGV0IEluc3R7MjUtMjF9ID0gMzE7DQorICBsZXQgSW5zdHsyMC0xNn0gPSBSYjsNCisgIGxldCBJbnN0ezE1LTEzfSA9IDA7DQorICBsZXQgSW5zdHsxMn0gPSAwOw0KKyAgbGV0IEluc3R7MTEtNX0gPSBGdW5jdGlvbjsNCisgIGxldCBJbnN0ezQtMH0gPSBSYzsNCit9DQorDQorY2xhc3MgT0Zvcm00PGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDc+IGZ1biwgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4sIEluc3RySXRpbkNsYXNzIGl0aW4+IA0KKyAgICA6IEluc3RBbHBoYTxvcGNvZGUsIGFzbXN0ciwgaXRpbj4gew0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgR1BSQzokUkRFU1QpOw0KKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIEdQUkM6JFJDT05ELCBHUFJDOiRSVFJVRSwgR1BSQzokUkZBTFNFKTsNCisgIGxldCBDb25zdHJhaW50cyA9ICIkUkZBTFNFID0gJFJERVNUIjsNCisgIGxldCBEaXNhYmxlRW5jb2RpbmcgPSAiJFJGQUxTRSI7DQorDQorICBiaXRzPDU+IFJjOw0KKyAgYml0czw1PiBSYTsNCisgIGJpdHM8NT4gUmI7DQorICBiaXRzPDc+IEZ1bmN0aW9uID0gZnVuOw0KKw0KKy8vICBsZXQgQ29uc3RyYWludHMgPSAiJFJGQUxTRSA9ICRSREVTVCI7DQorICBsZXQgSW5zdHsyNS0yMX0gPSBSYTsNCisgIGxldCBJbnN0ezIwLTE2fSA9IFJiOw0KKyAgbGV0IEluc3R7MTUtMTN9ID0gMDsNCisgIGxldCBJbnN0ezEyfSA9IDA7DQorICBsZXQgSW5zdHsxMS01fSA9IEZ1bmN0aW9uOw0KKyAgbGV0IEluc3R7NC0wfSA9IFJjOw0KK30NCisNCisNCitjbGFzcyBPRm9ybUw8Yml0czw2PiBvcGNvZGUsIGJpdHM8Nz4gZnVuLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICAgIDogSW5zdEFscGhhPG9wY29kZSwgYXNtc3RyLCBpdGluPiB7DQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBHUFJDOiRSQyk7DQorICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgR1BSQzokUkEsIHU4aW1tOiRMKTsNCisNCisgIGJpdHM8NT4gUmM7DQorICBiaXRzPDU+IFJhOw0KKyAgYml0czw4PiBMSVQ7DQorICBiaXRzPDc+IEZ1bmN0aW9uID0gZnVuOw0KKw0KKyAgbGV0IEluc3R7MjUtMjF9ID0gUmE7DQorICBsZXQgSW5zdHsyMC0xM30gPSBMSVQ7DQorICBsZXQgSW5zdHsxMn0gPSAxOw0KKyAgbGV0IEluc3R7MTEtNX0gPSBGdW5jdGlvbjsNCisgIGxldCBJbnN0ezQtMH0gPSBSYzsNCit9DQorDQorY2xhc3MgT0Zvcm00TDxiaXRzPDY+IG9wY29kZSwgYml0czw3PiBmdW4sIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuLCBJbnN0ckl0aW5DbGFzcyBpdGluPiANCisgICAgOiBJbnN0QWxwaGE8b3Bjb2RlLCBhc21zdHIsIGl0aW4+IHsNCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIEdQUkM6JFJERVNUKTsNCisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBHUFJDOiRSQ09ORCwgczY0aW1tOiRSVFJVRSwgR1BSQzokUkZBTFNFKTsNCisgIGxldCBDb25zdHJhaW50cyA9ICIkUkZBTFNFID0gJFJERVNUIjsNCisgIGxldCBEaXNhYmxlRW5jb2RpbmcgPSAiJFJGQUxTRSI7DQorDQorICBiaXRzPDU+IFJjOw0KKyAgYml0czw1PiBSYTsNCisgIGJpdHM8OD4gTElUOw0KKyAgYml0czw3PiBGdW5jdGlvbiA9IGZ1bjsNCisNCisvLyAgbGV0IENvbnN0cmFpbnRzID0gIiRSRkFMU0UgPSAkUkRFU1QiOw0KKyAgbGV0IEluc3R7MjUtMjF9ID0gUmE7DQorICBsZXQgSW5zdHsyMC0xM30gPSBMSVQ7DQorICBsZXQgSW5zdHsxMn0gPSAxOw0KKyAgbGV0IEluc3R7MTEtNX0gPSBGdW5jdGlvbjsNCisgIGxldCBJbnN0ezQtMH0gPSBSYzsNCit9DQorDQorLy8zLjMuNA0KK2NsYXNzIEZQRm9ybTxiaXRzPDY+IG9wY29kZSwgYml0czwxMT4gZnVuLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICAgIDogSW5zdEFscGhhPG9wY29kZSwgYXNtc3RyLCBpdGluPiB7DQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorDQorICBiaXRzPDU+IEZjOw0KKyAgYml0czw1PiBGYTsNCisgIGJpdHM8NT4gRmI7DQorICBiaXRzPDExPiBGdW5jdGlvbiA9IGZ1bjsNCisNCisgIGxldCBJbnN0ezI1LTIxfSA9IEZhOw0KKyAgbGV0IEluc3R7MjAtMTZ9ID0gRmI7DQorICBsZXQgSW5zdHsxNS01fSA9IEZ1bmN0aW9uOw0KKyAgbGV0IEluc3R7NC0wfSA9IEZjOw0KK30NCisNCisvLzMuMy41DQorY2xhc3MgUEFMRm9ybTxiaXRzPDY+IG9wY29kZSwgZGFnIE9MLCBzdHJpbmcgYXNtc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluPg0KKyAgICA6IEluc3RBbHBoYTxvcGNvZGUsIGFzbXN0ciwgaXRpbj4gew0KKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOw0KKyAgbGV0IEluT3BlcmFuZExpc3QgPSBPTDsNCisgIGJpdHM8MjY+IEZ1bmN0aW9uOw0KKw0KKyAgbGV0IEluc3R7MjUtMH0gPSBGdW5jdGlvbjsNCit9DQorDQorDQorLy8gUHNldWRvIGluc3RydWN0aW9ucy4NCitjbGFzcyBQc2V1ZG9JbnN0QWxwaGE8ZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIG5tLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICAgIDogSW5zdEFscGhhPDAsIG5tLCBpdGluPiAgew0KKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gT09MOw0KKyAgbGV0IEluT3BlcmFuZExpc3QgPSBJT0w7DQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJbnN0ckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyZjU2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsMzc5IEBACisvLz09PS0gQWxwaGFJbnN0ckluZm8uY3BwIC0gQWxwaGEgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQWxwaGEgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQWxwaGEuaCIKKyNpbmNsdWRlICJBbHBoYUluc3RySW5mby5oIgorI2luY2x1ZGUgIkFscGhhTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIkFscGhhR2VuSW5zdHJJbmZvLmluYyIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK0FscGhhSW5zdHJJbmZvOjpBbHBoYUluc3RySW5mbygpCisgIDogVGFyZ2V0SW5zdHJJbmZvSW1wbChBbHBoYUluc3RzLCBhcnJheV9sZW5ndGhvZihBbHBoYUluc3RzKSksCisgICAgUkkoKnRoaXMpIHsgfQorCisKK3Vuc2lnbmVkIAorQWxwaGFJbnN0ckluZm86OmlzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBjYXNlIEFscGhhOjpMREw6CisgIGNhc2UgQWxwaGE6OkxEUToKKyAgY2FzZSBBbHBoYTo6TERCVToKKyAgY2FzZSBBbHBoYTo6TERXVToKKyAgY2FzZSBBbHBoYTo6TERTOgorICBjYXNlIEFscGhhOjpMRFQ6CisgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDEpLmlzRkkoKSkgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCit1bnNpZ25lZCAKK0FscGhhSW5zdHJJbmZvOjppc1N0b3JlVG9TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGNhc2UgQWxwaGE6OlNUTDoKKyAgY2FzZSBBbHBoYTo6U1RROgorICBjYXNlIEFscGhhOjpTVEI6CisgIGNhc2UgQWxwaGE6OlNUVzoKKyAgY2FzZSBBbHBoYTo6U1RTOgorICBjYXNlIEFscGhhOjpTVFQ6CisgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDEpLmlzRkkoKSkgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBpc0FscGhhSW50Q29uZENvZGUodW5zaWduZWQgT3Bjb2RlKSB7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGNhc2UgQWxwaGE6OkJFUTogCisgIGNhc2UgQWxwaGE6OkJORTogCisgIGNhc2UgQWxwaGE6OkJHRTogCisgIGNhc2UgQWxwaGE6OkJHVDogCisgIGNhc2UgQWxwaGE6OkJMRTogCisgIGNhc2UgQWxwaGE6OkJMVDogCisgIGNhc2UgQWxwaGE6OkJMQkM6IAorICBjYXNlIEFscGhhOjpCTEJTOgorICAgIHJldHVybiB0cnVlOworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit1bnNpZ25lZCBBbHBoYUluc3RySW5mbzo6SW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdCB7CisgIGFzc2VydChUQkIgJiYgIkluc2VydEJyYW5jaCBtdXN0IG5vdCBiZSB0b2xkIHRvIGluc2VydCBhIGZhbGx0aHJvdWdoIik7CisgIGFzc2VydCgoQ29uZC5zaXplKCkgPT0gMiB8fCBDb25kLnNpemUoKSA9PSAwKSAmJiAKKyAgICAgICAgICJBbHBoYSBicmFuY2ggY29uZGl0aW9ucyBoYXZlIHR3byBjb21wb25lbnRzISIpOworCisgIC8vIE9uZS13YXkgYnJhbmNoLgorICBpZiAoRkJCID09IDApIHsKKyAgICBpZiAoQ29uZC5lbXB0eSgpKSAgIC8vIFVuY29uZGl0aW9uYWwgYnJhbmNoCisgICAgICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoQWxwaGE6OkJSKSkuYWRkTUJCKFRCQik7CisgICAgZWxzZSAgICAgICAgICAgICAgICAvLyBDb25kaXRpb25hbCBicmFuY2gKKyAgICAgIGlmIChpc0FscGhhSW50Q29uZENvZGUoQ29uZFswXS5nZXRJbW0oKSkpCisgICAgICAgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChBbHBoYTo6Q09ORF9CUkFOQ0hfSSkpCisgICAgICAgICAgLmFkZEltbShDb25kWzBdLmdldEltbSgpKS5hZGRSZWcoQ29uZFsxXS5nZXRSZWcoKSkuYWRkTUJCKFRCQik7CisgICAgICBlbHNlCisgICAgICAgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChBbHBoYTo6Q09ORF9CUkFOQ0hfRikpCisgICAgICAgICAgLmFkZEltbShDb25kWzBdLmdldEltbSgpKS5hZGRSZWcoQ29uZFsxXS5nZXRSZWcoKSkuYWRkTUJCKFRCQik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIC8vIFR3by13YXkgQ29uZGl0aW9uYWwgQnJhbmNoLgorICBpZiAoaXNBbHBoYUludENvbmRDb2RlKENvbmRbMF0uZ2V0SW1tKCkpKQorICAgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChBbHBoYTo6Q09ORF9CUkFOQ0hfSSkpCisgICAgICAuYWRkSW1tKENvbmRbMF0uZ2V0SW1tKCkpLmFkZFJlZyhDb25kWzFdLmdldFJlZygpKS5hZGRNQkIoVEJCKTsKKyAgZWxzZQorICAgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChBbHBoYTo6Q09ORF9CUkFOQ0hfRikpCisgICAgICAuYWRkSW1tKENvbmRbMF0uZ2V0SW1tKCkpLmFkZFJlZyhDb25kWzFdLmdldFJlZygpKS5hZGRNQkIoVEJCKTsKKyAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KEFscGhhOjpCUikpLmFkZE1CQihGQkIpOworICByZXR1cm4gMjsKK30KKwordm9pZCBBbHBoYUluc3RySW5mbzo6Y29weVBoeXNSZWcoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0IHsKKyAgaWYgKEFscGhhOjpHUFJDUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkgeworICAgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChBbHBoYTo6QklTciksIERlc3RSZWcpCisgICAgICAuYWRkUmVnKFNyY1JlZykKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICB9IGVsc2UgaWYgKEFscGhhOjpGNFJDUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkgeworICAgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChBbHBoYTo6Q1BZU1MpLCBEZXN0UmVnKQorICAgICAgLmFkZFJlZyhTcmNSZWcpCisgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgfSBlbHNlIGlmIChBbHBoYTo6RjhSQ1JlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpIHsKKyAgICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoQWxwaGE6OkNQWVNUKSwgRGVzdFJlZykKKyAgICAgIC5hZGRSZWcoU3JjUmVnKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSk7CisgIH0gZWxzZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQXR0ZW1wdCB0byBjb3B5IHJlZ2lzdGVyIHRoYXQgaXMgbm90IEdQUiBvciBGUFIiKTsKKyAgfQorfQorCit2b2lkCitBbHBoYUluc3RySW5mbzo6c3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICAvL2NlcnIgPDwgIlRyeWluZyB0byBzdG9yZSAiIDw8IGdldFByZXR0eU5hbWUoU3JjUmVnKSA8PCAiIHRvICIKKyAgLy8gICAgIDw8IEZyYW1lSWR4IDw8ICJcbiI7CisgIC8vQnVpbGRNSShNQkIsIE1JLCBBbHBoYTo6V1RGLCAwKS5hZGRSZWcoU3JjUmVnKTsKKworICBEZWJ1Z0xvYyBETDsKKyAgaWYgKE1JICE9IE1CQi5lbmQoKSkgREwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKworICBpZiAoUkMgPT0gQWxwaGE6OkY0UkNSZWdpc3RlckNsYXNzKQorICAgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChBbHBoYTo6U1RTKSkKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAgIC5hZGRGcmFtZUluZGV4KEZyYW1lSWR4KS5hZGRSZWcoQWxwaGE6OkYzMSk7CisgIGVsc2UgaWYgKFJDID09IEFscGhhOjpGOFJDUmVnaXN0ZXJDbGFzcykKKyAgICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoQWxwaGE6OlNUVCkpCisgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpCisgICAgICAuYWRkRnJhbWVJbmRleChGcmFtZUlkeCkuYWRkUmVnKEFscGhhOjpGMzEpOworICBlbHNlIGlmIChSQyA9PSBBbHBoYTo6R1BSQ1JlZ2lzdGVyQ2xhc3MpCisgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KEFscGhhOjpTVFEpKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKQorICAgICAgLmFkZEZyYW1lSW5kZXgoRnJhbWVJZHgpLmFkZFJlZyhBbHBoYTo6RjMxKTsKKyAgZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCByZWdpc3RlciBjbGFzcyIpOworfQorCit2b2lkCitBbHBoYUluc3RySW5mbzo6bG9hZFJlZ0Zyb21TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIC8vY2VyciA8PCAiVHJ5aW5nIHRvIGxvYWQgIiA8PCBnZXRQcmV0dHlOYW1lKERlc3RSZWcpIDw8ICIgdG8gIgorICAvLyAgICAgPDwgRnJhbWVJZHggPDwgIlxuIjsKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgaWYgKFJDID09IEFscGhhOjpGNFJDUmVnaXN0ZXJDbGFzcykKKyAgICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoQWxwaGE6OkxEUyksIERlc3RSZWcpCisgICAgICAuYWRkRnJhbWVJbmRleChGcmFtZUlkeCkuYWRkUmVnKEFscGhhOjpGMzEpOworICBlbHNlIGlmIChSQyA9PSBBbHBoYTo6RjhSQ1JlZ2lzdGVyQ2xhc3MpCisgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KEFscGhhOjpMRFQpLCBEZXN0UmVnKQorICAgICAgLmFkZEZyYW1lSW5kZXgoRnJhbWVJZHgpLmFkZFJlZyhBbHBoYTo6RjMxKTsKKyAgZWxzZSBpZiAoUkMgPT0gQWxwaGE6OkdQUkNSZWdpc3RlckNsYXNzKQorICAgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChBbHBoYTo6TERRKSwgRGVzdFJlZykKKyAgICAgIC5hZGRGcmFtZUluZGV4KEZyYW1lSWR4KS5hZGRSZWcoQWxwaGE6OkYzMSk7CisgIGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgcmVnaXN0ZXIgY2xhc3MiKTsKK30KKworc3RhdGljIHVuc2lnbmVkIEFscGhhUmV2Q29uZENvZGUodW5zaWduZWQgT3Bjb2RlKSB7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGNhc2UgQWxwaGE6OkJFUTogcmV0dXJuIEFscGhhOjpCTkU7CisgIGNhc2UgQWxwaGE6OkJORTogcmV0dXJuIEFscGhhOjpCRVE7CisgIGNhc2UgQWxwaGE6OkJHRTogcmV0dXJuIEFscGhhOjpCTFQ7CisgIGNhc2UgQWxwaGE6OkJHVDogcmV0dXJuIEFscGhhOjpCTEU7CisgIGNhc2UgQWxwaGE6OkJMRTogcmV0dXJuIEFscGhhOjpCR1Q7CisgIGNhc2UgQWxwaGE6OkJMVDogcmV0dXJuIEFscGhhOjpCR0U7CisgIGNhc2UgQWxwaGE6OkJMQkM6IHJldHVybiBBbHBoYTo6QkxCUzsKKyAgY2FzZSBBbHBoYTo6QkxCUzogcmV0dXJuIEFscGhhOjpCTEJDOworICBjYXNlIEFscGhhOjpGQkVROiByZXR1cm4gQWxwaGE6OkZCTkU7CisgIGNhc2UgQWxwaGE6OkZCTkU6IHJldHVybiBBbHBoYTo6RkJFUTsKKyAgY2FzZSBBbHBoYTo6RkJHRTogcmV0dXJuIEFscGhhOjpGQkxUOworICBjYXNlIEFscGhhOjpGQkdUOiByZXR1cm4gQWxwaGE6OkZCTEU7CisgIGNhc2UgQWxwaGE6OkZCTEU6IHJldHVybiBBbHBoYTo6RkJHVDsKKyAgY2FzZSBBbHBoYTo6RkJMVDogcmV0dXJuIEFscGhhOjpGQkdFOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gb3Bjb2RlIik7CisgIH0KKyAgcmV0dXJuIDA7IC8vIE5vdCByZWFjaGVkCit9CisKKy8vIEJyYW5jaCBhbmFseXNpcy4KK2Jvb2wgQWxwaGFJbnN0ckluZm86OkFuYWx5emVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQixNYWNoaW5lQmFzaWNCbG9jayAqJlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dNb2RpZnkpIGNvbnN0IHsKKyAgLy8gSWYgdGhlIGJsb2NrIGhhcyBubyB0ZXJtaW5hdG9ycywgaXQganVzdCBmYWxscyBpbnRvIHRoZSBibG9jayBhZnRlciBpdC4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuZW5kKCk7CisgIGlmIChJID09IE1CQi5iZWdpbigpKQorICAgIHJldHVybiBmYWxzZTsKKyAgLS1JOworICB3aGlsZSAoSS0+aXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAtLUk7CisgIH0KKyAgaWYgKCFpc1VucHJlZGljYXRlZFRlcm1pbmF0b3IoSSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEdldCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGUgYmxvY2suCisgIE1hY2hpbmVJbnN0ciAqTGFzdEluc3QgPSBJOworICAKKyAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgdGVybWluYXRvciBpbnN0cnVjdGlvbiwgcHJvY2VzcyBpdC4KKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkgfHwgIWlzVW5wcmVkaWNhdGVkVGVybWluYXRvcigtLUkpKSB7CisgICAgaWYgKExhc3RJbnN0LT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6QlIpIHsKKyAgICAgIFRCQiA9IExhc3RJbnN0LT5nZXRPcGVyYW5kKDApLmdldE1CQigpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoTGFzdEluc3QtPmdldE9wY29kZSgpID09IEFscGhhOjpDT05EX0JSQU5DSF9JIHx8CisgICAgICAgICAgICAgICBMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkgPT0gQWxwaGE6OkNPTkRfQlJBTkNIX0YpIHsKKyAgICAgIC8vIEJsb2NrIGVuZHMgd2l0aCBmYWxsLXRocm91Z2ggY29uZGJyYW5jaC4KKyAgICAgIFRCQiA9IExhc3RJbnN0LT5nZXRPcGVyYW5kKDIpLmdldE1CQigpOworICAgICAgQ29uZC5wdXNoX2JhY2soTGFzdEluc3QtPmdldE9wZXJhbmQoMCkpOworICAgICAgQ29uZC5wdXNoX2JhY2soTGFzdEluc3QtPmdldE9wZXJhbmQoMSkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBPdGhlcndpc2UsIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzLgorICAgIHJldHVybiB0cnVlOworICB9CisgIAorICAvLyBHZXQgdGhlIGluc3RydWN0aW9uIGJlZm9yZSBpdCBpZiBpdCdzIGEgdGVybWluYXRvci4KKyAgTWFjaGluZUluc3RyICpTZWNvbmRMYXN0SW5zdCA9IEk7CisKKyAgLy8gSWYgdGhlcmUgYXJlIHRocmVlIHRlcm1pbmF0b3JzLCB3ZSBkb24ndCBrbm93IHdoYXQgc29ydCBvZiBibG9jayB0aGlzIGlzLgorICBpZiAoU2Vjb25kTGFzdEluc3QgJiYgSSAhPSBNQkIuYmVnaW4oKSAmJgorICAgICAgaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKC0tSSkpCisgICAgcmV0dXJuIHRydWU7CisgIAorICAvLyBJZiB0aGUgYmxvY2sgZW5kcyB3aXRoIEFscGhhOjpCUiBhbmQgQWxwaGE6OkNPTkRfQlJBTkNIXyosIGhhbmRsZSBpdC4KKyAgaWYgKChTZWNvbmRMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkgPT0gQWxwaGE6OkNPTkRfQlJBTkNIX0kgfHwKKyAgICAgIFNlY29uZExhc3RJbnN0LT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6Q09ORF9CUkFOQ0hfRikgJiYgCisgICAgICBMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkgPT0gQWxwaGE6OkJSKSB7CisgICAgVEJCID0gIFNlY29uZExhc3RJbnN0LT5nZXRPcGVyYW5kKDIpLmdldE1CQigpOworICAgIENvbmQucHVzaF9iYWNrKFNlY29uZExhc3RJbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgICBDb25kLnB1c2hfYmFjayhTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgRkJCID0gTGFzdEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLyBJZiB0aGUgYmxvY2sgZW5kcyB3aXRoIHR3byBBbHBoYTo6QlJzLCBoYW5kbGUgaXQuICBUaGUgc2Vjb25kIG9uZSBpcyBub3QKKyAgLy8gZXhlY3V0ZWQsIHNvIHJlbW92ZSBpdC4KKyAgaWYgKFNlY29uZExhc3RJbnN0LT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6QlIgJiYgCisgICAgICBMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkgPT0gQWxwaGE6OkJSKSB7CisgICAgVEJCID0gU2Vjb25kTGFzdEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgSSA9IExhc3RJbnN0OworICAgIGlmIChBbGxvd01vZGlmeSkKKyAgICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgY2FuJ3QgaGFuZGxlIHRoaXMuCisgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBBbHBoYUluc3RySW5mbzo6UmVtb3ZlQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuZW5kKCk7CisgIGlmIChJID09IE1CQi5iZWdpbigpKSByZXR1cm4gMDsKKyAgLS1JOworICB3aGlsZSAoSS0+aXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkKKyAgICAgIHJldHVybiAwOworICAgIC0tSTsKKyAgfQorICBpZiAoSS0+Z2V0T3Bjb2RlKCkgIT0gQWxwaGE6OkJSICYmIAorICAgICAgSS0+Z2V0T3Bjb2RlKCkgIT0gQWxwaGE6OkNPTkRfQlJBTkNIX0kgJiYKKyAgICAgIEktPmdldE9wY29kZSgpICE9IEFscGhhOjpDT05EX0JSQU5DSF9GKQorICAgIHJldHVybiAwOworICAKKyAgLy8gUmVtb3ZlIHRoZSBicmFuY2guCisgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAKKyAgSSA9IE1CQi5lbmQoKTsKKworICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkgcmV0dXJuIDE7CisgIC0tSTsKKyAgaWYgKEktPmdldE9wY29kZSgpICE9IEFscGhhOjpDT05EX0JSQU5DSF9JICYmIAorICAgICAgSS0+Z2V0T3Bjb2RlKCkgIT0gQWxwaGE6OkNPTkRfQlJBTkNIX0YpCisgICAgcmV0dXJuIDE7CisgIAorICAvLyBSZW1vdmUgdGhlIGJyYW5jaC4KKyAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIHJldHVybiAyOworfQorCit2b2lkIEFscGhhSW5zdHJJbmZvOjppbnNlcnROb29wKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpIGNvbnN0IHsKKyAgRGVidWdMb2MgREw7CisgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChBbHBoYTo6QklTciksIEFscGhhOjpSMzEpCisgICAgLmFkZFJlZyhBbHBoYTo6UjMxKQorICAgIC5hZGRSZWcoQWxwaGE6OlIzMSk7Cit9CisKK2Jvb2wgQWxwaGFJbnN0ckluZm86OgorUmV2ZXJzZUJyYW5jaENvbmRpdGlvbihTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kKSBjb25zdCB7CisgIGFzc2VydChDb25kLnNpemUoKSA9PSAyICYmICJJbnZhbGlkIEFscGhhIGJyYW5jaCBvcGNvZGUhIik7CisgIENvbmRbMF0uc2V0SW1tKEFscGhhUmV2Q29uZENvZGUoQ29uZFswXS5nZXRJbW0oKSkpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBnZXRHbG9iYWxCYXNlUmVnIC0gUmV0dXJuIGEgdmlydHVhbCByZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZQorLy8vIHRoZSBnbG9iYWwgYmFzZSByZWdpc3RlciB2YWx1ZS4gT3V0cHV0IGluc3RydWN0aW9ucyByZXF1aXJlZCB0bworLy8vIGluaXRpYWxpemUgdGhlIHJlZ2lzdGVyIGluIHRoZSBmdW5jdGlvbiBlbnRyeSBibG9jaywgaWYgbmVjZXNzYXJ5LgorLy8vCit1bnNpZ25lZCBBbHBoYUluc3RySW5mbzo6Z2V0R2xvYmFsQmFzZVJlZyhNYWNoaW5lRnVuY3Rpb24gKk1GKSBjb25zdCB7CisgIEFscGhhTWFjaGluZUZ1bmN0aW9uSW5mbyAqQWxwaGFGSSA9IE1GLT5nZXRJbmZvPEFscGhhTWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKyAgdW5zaWduZWQgR2xvYmFsQmFzZVJlZyA9IEFscGhhRkktPmdldEdsb2JhbEJhc2VSZWcoKTsKKyAgaWYgKEdsb2JhbEJhc2VSZWcgIT0gMCkKKyAgICByZXR1cm4gR2xvYmFsQmFzZVJlZzsKKworICAvLyBJbnNlcnQgdGhlIHNldCBvZiBHbG9iYWxCYXNlUmVnIGludG8gdGhlIGZpcnN0IE1CQiBvZiB0aGUgZnVuY3Rpb24KKyAgTWFjaGluZUJhc2ljQmxvY2sgJkZpcnN0TUJCID0gTUYtPmZyb250KCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gRmlyc3RNQkIuYmVnaW4oKTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmUmVnSW5mbyA9IE1GLT5nZXRSZWdJbmZvKCk7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gTUYtPmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworCisgIEdsb2JhbEJhc2VSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcigmQWxwaGE6OkdQUkNSZWdDbGFzcyk7CisgIEJ1aWxkTUkoRmlyc3RNQkIsIE1CQkksIERlYnVnTG9jKCksIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksCisgICAgICAgICAgR2xvYmFsQmFzZVJlZykuYWRkUmVnKEFscGhhOjpSMjkpOworICBSZWdJbmZvLmFkZExpdmVJbihBbHBoYTo6UjI5KTsKKworICBBbHBoYUZJLT5zZXRHbG9iYWxCYXNlUmVnKEdsb2JhbEJhc2VSZWcpOworICByZXR1cm4gR2xvYmFsQmFzZVJlZzsKK30KKworLy8vIGdldEdsb2JhbFJldEFkZHIgLSBSZXR1cm4gYSB2aXJ0dWFsIHJlZ2lzdGVyIGluaXRpYWxpemVkIHdpdGggdGhlCisvLy8gdGhlIGdsb2JhbCBiYXNlIHJlZ2lzdGVyIHZhbHVlLiBPdXRwdXQgaW5zdHJ1Y3Rpb25zIHJlcXVpcmVkIHRvCisvLy8gaW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZ1bmN0aW9uIGVudHJ5IGJsb2NrLCBpZiBuZWNlc3NhcnkuCisvLy8KK3Vuc2lnbmVkIEFscGhhSW5zdHJJbmZvOjpnZXRHbG9iYWxSZXRBZGRyKE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0IHsKKyAgQWxwaGFNYWNoaW5lRnVuY3Rpb25JbmZvICpBbHBoYUZJID0gTUYtPmdldEluZm88QWxwaGFNYWNoaW5lRnVuY3Rpb25JbmZvPigpOworICB1bnNpZ25lZCBHbG9iYWxSZXRBZGRyID0gQWxwaGFGSS0+Z2V0R2xvYmFsUmV0QWRkcigpOworICBpZiAoR2xvYmFsUmV0QWRkciAhPSAwKQorICAgIHJldHVybiBHbG9iYWxSZXRBZGRyOworCisgIC8vIEluc2VydCB0aGUgc2V0IG9mIEdsb2JhbFJldEFkZHIgaW50byB0aGUgZmlyc3QgTUJCIG9mIHRoZSBmdW5jdGlvbgorICBNYWNoaW5lQmFzaWNCbG9jayAmRmlyc3RNQkIgPSBNRi0+ZnJvbnQoKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBGaXJzdE1CQi5iZWdpbigpOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZSZWdJbmZvID0gTUYtPmdldFJlZ0luZm8oKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBNRi0+Z2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisKKyAgR2xvYmFsUmV0QWRkciA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKCZBbHBoYTo6R1BSQ1JlZ0NsYXNzKTsKKyAgQnVpbGRNSShGaXJzdE1CQiwgTUJCSSwgRGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICAgICAgICBHbG9iYWxSZXRBZGRyKS5hZGRSZWcoQWxwaGE6OlIyNik7CisgIFJlZ0luZm8uYWRkTGl2ZUluKEFscGhhOjpSMjYpOworCisgIEFscGhhRkktPnNldEdsb2JhbFJldEFkZHIoR2xvYmFsUmV0QWRkcik7CisgIHJldHVybiBHbG9iYWxSZXRBZGRyOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjA3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSW5zdHJJbmZvLmgKQEAgLTAsMCArMSw4MiBAQAorLy89PT0tIEFscGhhSW5zdHJJbmZvLmggLSBBbHBoYSBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbiAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFscGhhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBTFBIQUlOU1RSVUNUSU9OSU5GT19ICisjZGVmaW5lIEFMUEhBSU5TVFJVQ1RJT05JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgIkFscGhhUmVnaXN0ZXJJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxwaGFJbnN0ckluZm8gOiBwdWJsaWMgVGFyZ2V0SW5zdHJJbmZvSW1wbCB7CisgIGNvbnN0IEFscGhhUmVnaXN0ZXJJbmZvIFJJOworcHVibGljOgorICBBbHBoYUluc3RySW5mbygpOworCisgIC8vLyBnZXRSZWdpc3RlckluZm8gLSBUYXJnZXRJbnN0ckluZm8gaXMgYSBzdXBlcnNldCBvZiBNUmVnaXN0ZXIgaW5mby4gIEFzCisgIC8vLyBzdWNoLCB3aGVuZXZlciBhIGNsaWVudCBoYXMgYW4gaW5zdGFuY2Ugb2YgaW5zdHJ1Y3Rpb24gaW5mbywgaXQgc2hvdWxkCisgIC8vLyBhbHdheXMgYmUgYWJsZSB0byBnZXQgcmVnaXN0ZXIgaW5mbyBhcyB3ZWxsICh0aHJvdWdoIHRoaXMgbWV0aG9kKS4KKyAgLy8vCisgIHZpcnR1YWwgY29uc3QgQWxwaGFSZWdpc3RlckluZm8gJmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIFJJOyB9CisKKyAgdmlydHVhbCB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworICB2aXJ0dWFsIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworICAKKyAgdmlydHVhbCB1bnNpZ25lZCBJbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgY29weVBoeXNSZWcoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisgIAorICBib29sIEFuYWx5emVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQixNYWNoaW5lQmFzaWNCbG9jayAqJlRCQiwKKyAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComRkJCLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dNb2RpZnkpIGNvbnN0OworICB1bnNpZ25lZCBSZW1vdmVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisgIHZvaWQgaW5zZXJ0Tm9vcChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCAKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSkgY29uc3Q7CisgIGJvb2wgUmV2ZXJzZUJyYW5jaENvbmRpdGlvbihTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kKSBjb25zdDsKKworICAvLy8gZ2V0R2xvYmFsQmFzZVJlZyAtIFJldHVybiBhIHZpcnR1YWwgcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUKKyAgLy8vIHRoZSBnbG9iYWwgYmFzZSByZWdpc3RlciB2YWx1ZS4gT3V0cHV0IGluc3RydWN0aW9ucyByZXF1aXJlZCB0bworICAvLy8gaW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZ1bmN0aW9uIGVudHJ5IGJsb2NrLCBpZiBuZWNlc3NhcnkuCisgIC8vLworICB1bnNpZ25lZCBnZXRHbG9iYWxCYXNlUmVnKE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0OworCisgIC8vLyBnZXRHbG9iYWxSZXRBZGRyIC0gUmV0dXJuIGEgdmlydHVhbCByZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZQorICAvLy8gdGhlIGdsb2JhbCByZXR1cm4gYWRkcmVzcyByZWdpc3RlciB2YWx1ZS4gT3V0cHV0IGluc3RydWN0aW9ucyByZXF1aXJlZCB0bworICAvLy8gaW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZ1bmN0aW9uIGVudHJ5IGJsb2NrLCBpZiBuZWNlc3NhcnkuCisgIC8vLworICB1bnNpZ25lZCBnZXRHbG9iYWxSZXRBZGRyKE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0OworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJbnN0ckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSW5zdHJJbmZvLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMWFmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSW5zdHJJbmZvLnRkCkBAIC0wLDAgKzEsMTE1NyBAQAorLy89PT0tIEFscGhhSW5zdHJJbmZvLnRkIC0gVGhlIEFscGhhIEluc3RydWN0aW9uIFNldCAtLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitpbmNsdWRlICJBbHBoYUluc3RyRm9ybWF0cy50ZCINCisNCisvLyoqKioqKioqKioqKioqKioqKioqDQorLy9DdXN0b20gREFHIE5vZGVzDQorLy8qKioqKioqKioqKioqKioqKioqKg0KKw0KK2RlZiBTRFRGUFVuYXJ5T3BVbkMgIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbDQorICBTRFRDaXNGUDwxPiwgU0RUQ2lzRlA8MD4NCitdPjsNCitkZWYgQWxwaGFfY3Z0cXQgICA6IFNETm9kZTwiQWxwaGFJU0Q6OkNWVFFUXyIsICAgIFNEVEZQVW5hcnlPcFVuQywgW10+Ow0KK2RlZiBBbHBoYV9jdnRxcyAgIDogU0ROb2RlPCJBbHBoYUlTRDo6Q1ZUUVNfIiwgICAgU0RURlBVbmFyeU9wVW5DLCBbXT47DQorZGVmIEFscGhhX2N2dHRxICAgOiBTRE5vZGU8IkFscGhhSVNEOjpDVlRUUV8iICAsICBTRFRGUFVuYXJ5T3AsIFtdPjsNCitkZWYgQWxwaGFfZ3ByZWxsbyA6IFNETm9kZTwiQWxwaGFJU0Q6OkdQUmVsTG8iLCAgIFNEVEludEJpbk9wLCBbXT47DQorZGVmIEFscGhhX2dwcmVsaGkgOiBTRE5vZGU8IkFscGhhSVNEOjpHUFJlbEhpIiwgICBTRFRJbnRCaW5PcCwgW10+Ow0KK2RlZiBBbHBoYV9yZWxsaXQgIDogU0ROb2RlPCJBbHBoYUlTRDo6UmVsTGl0IiwgICAgU0RUSW50QmluT3AsIFtTRE5QTWF5TG9hZF0+Ow0KKw0KK2RlZiByZXRmbGFnICAgICAgIDogU0ROb2RlPCJBbHBoYUlTRDo6UkVUX0ZMQUciLCBTRFROb25lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWddPjsNCisNCisvLyBUaGVzZSBhcmUgdGFyZ2V0LWluZGVwZW5kZW50IG5vZGVzLCBidXQgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgZm9ybWF0cy4NCitkZWYgU0RUX0FscGhhQ2FsbFNlcVN0YXJ0IDogU0RDYWxsU2VxU3RhcnQ8WyBTRFRDaXNWVDwwLCBpNjQ+IF0+Ow0KK2RlZiBTRFRfQWxwaGFDYWxsU2VxRW5kICAgOiBTRENhbGxTZXFFbmQ8WyBTRFRDaXNWVDwwLCBpNjQ+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwxLCBpNjQ+IF0+Ow0KKw0KK2RlZiBjYWxsc2VxX3N0YXJ0IDogU0ROb2RlPCJJU0Q6OkNBTExTRVFfU1RBUlQiLCBTRFRfQWxwaGFDYWxsU2VxU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE91dEZsYWddPjsNCitkZWYgY2FsbHNlcV9lbmQgICA6IFNETm9kZTwiSVNEOjpDQUxMU0VRX0VORCIsICAgU0RUX0FscGhhQ2FsbFNlcUVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZ10+Ow0KKw0KKy8vKioqKioqKioqKioqKioqKioqKioNCisvL1BhdGVybnMgZm9yIG1hdGNoaW5nDQorLy8qKioqKioqKioqKioqKioqKioqKg0KK2RlZiBpbnZYIDogU0ROb2RlWEZvcm08aW1tLCBbeyAvL2ludmVydA0KKyAgcmV0dXJuIGdldEk2NEltbSh+Ti0+Z2V0WkV4dFZhbHVlKCkpOw0KK31dPjsNCitkZWYgbmVnWCA6IFNETm9kZVhGb3JtPGltbSwgW3sgLy9uZWdhdGUNCisgIHJldHVybiBnZXRJNjRJbW0ofk4tPmdldFpFeHRWYWx1ZSgpICsgMSk7DQorfV0+Ow0KK2RlZiBTRXh0MzIgOiBTRE5vZGVYRm9ybTxpbW0sIFt7IC8vc2lnbmVkIGV4dGVuZCBpbnQgdG8gbG9uZw0KKyAgcmV0dXJuIGdldEk2NEltbSgoKGludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkgPDwgMzIpID4+IDMyKTsNCit9XT47DQorZGVmIFNFeHQxNiA6IFNETm9kZVhGb3JtPGltbSwgW3sgLy9zaWduZWQgZXh0ZW5kIGludCB0byBsb25nDQorICByZXR1cm4gZ2V0STY0SW1tKCgoaW50NjRfdClOLT5nZXRaRXh0VmFsdWUoKSA8PCA0OCkgPj4gNDgpOw0KK31dPjsNCitkZWYgTEwxNiA6IFNETm9kZVhGb3JtPGltbSwgW3sgLy9sZGEgcGFydCBvZiBjb25zdGFudA0KKyAgcmV0dXJuIGdldEk2NEltbShnZXRfbGRhMTYoTi0+Z2V0WkV4dFZhbHVlKCkpKTsNCit9XT47DQorZGVmIExIMTYgOiBTRE5vZGVYRm9ybTxpbW0sIFt7IC8vbGRhaCBwYXJ0IG9mIGNvbnN0YW50IChvciBtb3JlIGlmIHRvbyBiaWcpDQorICByZXR1cm4gZ2V0STY0SW1tKGdldF9sZGFoMTYoTi0+Z2V0WkV4dFZhbHVlKCkpKTsNCit9XT47DQorZGVmIGlaQVBYIDogU0ROb2RlWEZvcm08YW5kLCBbeyAvLyBnZXQgaW1tIHRvIFpBUGkNCisgIENvbnN0YW50U0ROb2RlICpSSFMgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKTsNCisgIHJldHVybiBnZXRJNjRJbW0oZ2V0X3phcEltbShTRFZhbHVlKCksIFJIUy0+Z2V0WkV4dFZhbHVlKCkpKTsNCit9XT47DQorZGVmIG5lYXJQMlggOiBTRE5vZGVYRm9ybTxpbW0sIFt7DQorICByZXR1cm4gZ2V0STY0SW1tKExvZzJfNjQoZ2V0TmVhclBvd2VyMigodWludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkpKSk7DQorfV0+Ow0KK2RlZiBuZWFyUDJSZW1YIDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgdWludDY0X3QgeCA9DQorICAgIGFiczY0KE4tPmdldFpFeHRWYWx1ZSgpIC0gZ2V0TmVhclBvd2VyMigodWludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkpKTsNCisgIHJldHVybiBnZXRJNjRJbW0oTG9nMl82NCh4KSk7DQorfV0+Ow0KKw0KK2RlZiBpbW1VRXh0OCAgOiBQYXRMZWFmPChpbW0pLCBbeyAvL2ltbSBmaXRzIGluIDggYml0IHplcm8gZXh0ZW5kZWQgZmllbGQNCisgIHJldHVybiAodWludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkgPT0gKHVpbnQ4X3QpTi0+Z2V0WkV4dFZhbHVlKCk7DQorfV0+Ow0KK2RlZiBpbW1VRXh0OGludiAgOiBQYXRMZWFmPChpbW0pLCBbeyAvL2ludmVydGVkIGltbSBmaXRzIGluIDggYml0IHplcm8gZXh0ZW5kZWQgZmllbGQNCisgIHJldHVybiAodWludDY0X3Qpfk4tPmdldFpFeHRWYWx1ZSgpID09ICh1aW50OF90KX5OLT5nZXRaRXh0VmFsdWUoKTsNCit9XSwgaW52WD47DQorZGVmIGltbVVFeHQ4bmVnICA6IFBhdExlYWY8KGltbSksIFt7IC8vbmVnYXRlZCBpbW0gZml0cyBpbiA4IGJpdCB6ZXJvIGV4dGVuZGVkIGZpZWxkDQorICByZXR1cm4gKCh1aW50NjRfdCl+Ti0+Z2V0WkV4dFZhbHVlKCkgKyAxKSA9PQ0KKyAgICAgICAgICh1aW50OF90KSgodWludDY0X3Qpfk4tPmdldFpFeHRWYWx1ZSgpICsgMSk7DQorfV0sIG5lZ1g+Ow0KK2RlZiBpbW1TRXh0MTYgIDogUGF0TGVhZjwoaW1tKSwgW3sgLy9pbW0gZml0cyBpbiAxNiBiaXQgc2lnbiBleHRlbmRlZCBmaWVsZA0KKyAgcmV0dXJuICgoaW50NjRfdClOLT5nZXRaRXh0VmFsdWUoKSA8PCA0OCkgPj4gNDggPT0NCisgICAgICAgICAoaW50NjRfdClOLT5nZXRaRXh0VmFsdWUoKTsNCit9XT47DQorZGVmIGltbVNFeHQxNmludCAgOiBQYXRMZWFmPChpbW0pLCBbeyAvLyhpbnQpaW1tIGZpdHMgaW4gYSAxNiBiaXQgc2lnbiBleHRlbmRlZCBmaWVsZA0KKyAgcmV0dXJuICgoaW50NjRfdClOLT5nZXRaRXh0VmFsdWUoKSA8PCA0OCkgPj4gNDggPT0NCisgICAgICAgICAoKGludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkgPDwgMzIpID4+IDMyOw0KK31dLCBTRXh0MTY+Ow0KKw0KK2RlZiB6YXBwYXQgOiBQYXRGcmFnPChvcHMgbm9kZTokTEhTKSwgKGFuZCBub2RlOiRMSFMsIGltbSksIFt7DQorICBDb25zdGFudFNETm9kZSAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpOw0KKyAgaWYgKCFSSFMpIHJldHVybiAwOw0KKyAgdWludDY0X3QgYnVpbGQgPSBnZXRfemFwSW1tKE4tPmdldE9wZXJhbmQoMCksICh1aW50NjRfdClSSFMtPmdldFpFeHRWYWx1ZSgpKTsNCisgIHJldHVybiBidWlsZCAhPSAwOw0KK31dPjsNCisNCitkZWYgaW1tRlBaICA6IFBhdExlYWY8KGZwaW1tKSwgW3sgLy90aGUgb25seSBmcGNvbnN0YW50IG5vZGVzIGFyZSArLy0gMC4wDQorICAodm9pZClOOyAvLyBzaWxlbmNlIHdhcm5pbmcuDQorICByZXR1cm4gdHJ1ZTsNCit9XT47DQorDQorZGVmIGltbVJlbTEgOlBhdExlYWY8KGltbSksW3tyZXR1cm4gY2hrUmVtTmVhclBvd2VyMihOLT5nZXRaRXh0VmFsdWUoKSwxLDApO31dPjsNCitkZWYgaW1tUmVtMiA6UGF0TGVhZjwoaW1tKSxbe3JldHVybiBjaGtSZW1OZWFyUG93ZXIyKE4tPmdldFpFeHRWYWx1ZSgpLDIsMCk7fV0+Ow0KK2RlZiBpbW1SZW0zIDpQYXRMZWFmPChpbW0pLFt7cmV0dXJuIGNoa1JlbU5lYXJQb3dlcjIoTi0+Z2V0WkV4dFZhbHVlKCksMywwKTt9XT47DQorZGVmIGltbVJlbTQgOlBhdExlYWY8KGltbSksW3tyZXR1cm4gY2hrUmVtTmVhclBvd2VyMihOLT5nZXRaRXh0VmFsdWUoKSw0LDApO31dPjsNCitkZWYgaW1tUmVtNSA6UGF0TGVhZjwoaW1tKSxbe3JldHVybiBjaGtSZW1OZWFyUG93ZXIyKE4tPmdldFpFeHRWYWx1ZSgpLDUsMCk7fV0+Ow0KK2RlZiBpbW1SZW0xbjpQYXRMZWFmPChpbW0pLFt7cmV0dXJuIGNoa1JlbU5lYXJQb3dlcjIoTi0+Z2V0WkV4dFZhbHVlKCksMSwxKTt9XT47DQorZGVmIGltbVJlbTJuOlBhdExlYWY8KGltbSksW3tyZXR1cm4gY2hrUmVtTmVhclBvd2VyMihOLT5nZXRaRXh0VmFsdWUoKSwyLDEpO31dPjsNCitkZWYgaW1tUmVtM246UGF0TGVhZjwoaW1tKSxbe3JldHVybiBjaGtSZW1OZWFyUG93ZXIyKE4tPmdldFpFeHRWYWx1ZSgpLDMsMSk7fV0+Ow0KK2RlZiBpbW1SZW00bjpQYXRMZWFmPChpbW0pLFt7cmV0dXJuIGNoa1JlbU5lYXJQb3dlcjIoTi0+Z2V0WkV4dFZhbHVlKCksNCwxKTt9XT47DQorZGVmIGltbVJlbTVuOlBhdExlYWY8KGltbSksW3tyZXR1cm4gY2hrUmVtTmVhclBvd2VyMihOLT5nZXRaRXh0VmFsdWUoKSw1LDEpO31dPjsNCisNCitkZWYgaW1tUmVtUDJuIDogUGF0TGVhZjwoaW1tKSwgW3sNCisgIHJldHVybiBpc1Bvd2VyT2YyXzY0KGdldE5lYXJQb3dlcjIoKHVpbnQ2NF90KU4tPmdldFpFeHRWYWx1ZSgpKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFpFeHRWYWx1ZSgpKTsNCit9XT47DQorZGVmIGltbVJlbVAyIDogUGF0TGVhZjwoaW1tKSwgW3sNCisgIHJldHVybiBpc1Bvd2VyT2YyXzY0KE4tPmdldFpFeHRWYWx1ZSgpIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmVhclBvd2VyMigodWludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkpKTsNCit9XT47DQorZGVmIGltbVVFeHQ4TUUgOiBQYXRMZWFmPChpbW0pLCBbeyAvL3VzZSB0aGlzIGltbSBmb3IgbXVscWkNCisgIGludDY0X3QgZCA9ICBhYnM2NCgoaW50NjRfdClOLT5nZXRaRXh0VmFsdWUoKSAtDQorICAgICAgICAgICAgICAgKGludDY0X3QpZ2V0TmVhclBvd2VyMigodWludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkpKTsNCisgIGlmIChpc1Bvd2VyT2YyXzY0KGQpKSByZXR1cm4gZmFsc2U7DQorICBzd2l0Y2ggKGQpIHsNCisgICAgY2FzZSAxOiBjYXNlIDM6IGNhc2UgNTogcmV0dXJuIGZhbHNlOyANCisgICAgZGVmYXVsdDogcmV0dXJuICh1aW50NjRfdClOLT5nZXRaRXh0VmFsdWUoKSA9PSAodWludDhfdClOLT5nZXRaRXh0VmFsdWUoKTsNCisgIH07DQorfV0+Ow0KKw0KK2RlZiBpbnRvcCA6IFBhdEZyYWc8KG9wcyBub2RlOiRvcCksIChzZXh0X2lucmVnIG5vZGU6JG9wLCBpMzIpPjsNCitkZWYgYWRkNCAgOiBQYXRGcmFnPChvcHMgbm9kZTokb3AxLCBub2RlOiRvcDIpLA0KKyAgICAgICAgICAgICAgICAgICAgKGFkZCAoc2hsIG5vZGU6JG9wMSwgMiksIG5vZGU6JG9wMik+Ow0KK2RlZiBzdWI0ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRvcDEsIG5vZGU6JG9wMiksDQorICAgICAgICAgICAgICAgICAgICAoc3ViIChzaGwgbm9kZTokb3AxLCAyKSwgbm9kZTokb3AyKT47DQorZGVmIGFkZDggIDogUGF0RnJhZzwob3BzIG5vZGU6JG9wMSwgbm9kZTokb3AyKSwNCisgICAgICAgICAgICAgICAgICAgIChhZGQgKHNobCBub2RlOiRvcDEsIDMpLCBub2RlOiRvcDIpPjsNCitkZWYgc3ViOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokb3AxLCBub2RlOiRvcDIpLA0KKyAgICAgICAgICAgICAgICAgICAgKHN1YiAoc2hsIG5vZGU6JG9wMSwgMyksIG5vZGU6JG9wMik+Ow0KK2NsYXNzIEJpbk9wRnJhZzxkYWcgcmVzPiA6IFBhdEZyYWc8KG9wcyBub2RlOiRMSFMsIG5vZGU6JFJIUyksIHJlcz47DQorY2xhc3MgQ21wT3BGcmFnPGRhZyByZXM+IDogUGF0RnJhZzwob3BzIG5vZGU6JFIpLCByZXM+Ow0KKw0KKy8vUHNldWRvIG9wcyBmb3Igc2VsZWN0aW9uDQorDQorZGVmIFdURiA6IFBzZXVkb0luc3RBbHBoYTwob3V0cyksIChpbnMgdmFyaWFibGVfb3BzKSwgIiN3dGYiLCBbXSwgc19wc2V1ZG8+Ow0KKw0KK2xldCBoYXNDdHJsRGVwID0gMSwgRGVmcyA9IFtSMzBdLCBVc2VzID0gW1IzMF0gaW4gew0KK2RlZiBBREpVU1RTVEFDS1VQIDogUHNldWRvSW5zdEFscGhhPChvdXRzKSwgKGlucyBzNjRpbW06JGFtdCksDQorICAgICAgICAgICAgICAgICI7IEFESlVQICRhbXQiLCANCisgICAgICAgICAgICAgICAgWyhjYWxsc2VxX3N0YXJ0IHRpbW06JGFtdCldLCBzX3BzZXVkbz47DQorZGVmIEFESlVTVFNUQUNLRE9XTiA6IFBzZXVkb0luc3RBbHBoYTwob3V0cyksIChpbnMgczY0aW1tOiRhbXQxLCBzNjRpbW06JGFtdDIpLA0KKyAgICAgICAgICAgICAgICAiOyBBREpET1dOICRhbXQxIiwNCisgICAgICAgICAgICAgICAgWyhjYWxsc2VxX2VuZCB0aW1tOiRhbXQxLCB0aW1tOiRhbXQyKV0sIHNfcHNldWRvPjsNCit9DQorDQorZGVmIEFMVEVOVCA6IFBzZXVkb0luc3RBbHBoYTwob3V0cyksIChpbnMgczY0aW1tOiRUQVJHRVQpLCAiJCQkVEFSR0VULi5uZzpcbiIsIFtdLCBzX3BzZXVkbz47DQorZGVmIFBDTEFCRUwgOiBQc2V1ZG9JbnN0QWxwaGE8KG91dHMpLCAoaW5zIHM2NGltbTokbnVtKSwgIlBDTUFSS0VSXyRudW06XG4iLFtdLCBzX3BzZXVkbz47DQorZGVmIE1FTUxBQkVMIDogUHNldWRvSW5zdEFscGhhPChvdXRzKSwgKGlucyBzNjRpbW06JGksIHM2NGltbTokaiwgczY0aW1tOiRrLCBzNjRpbW06JG0pLA0KKyAgICAgICAgICJMU01BUktFUiQkJGkkJCRqJCQkayQkJG06IiwgW10sIHNfcHNldWRvPjsNCisNCisNCitsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMSBpbiB7ICAgLy8gRXhwYW5kZWQgYWZ0ZXIgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLg0KK2RlZiBDQVMzMiA6IFBzZXVkb0luc3RBbHBoYTwob3V0cyBHUFJDOiRkc3QpLCAoaW5zIEdQUkM6JHB0ciwgR1BSQzokY21wLCBHUFJDOiRzd3ApLCAiIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfY21wX3N3YXBfMzIgR1BSQzokcHRyLCBHUFJDOiRjbXAsIEdQUkM6JHN3cCkpXSwgc19wc2V1ZG8+Ow0KK2RlZiBDQVM2NCA6IFBzZXVkb0luc3RBbHBoYTwob3V0cyBHUFJDOiRkc3QpLCAoaW5zIEdQUkM6JHB0ciwgR1BSQzokY21wLCBHUFJDOiRzd3ApLCAiIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfY21wX3N3YXBfNjQgR1BSQzokcHRyLCBHUFJDOiRjbXAsIEdQUkM6JHN3cCkpXSwgc19wc2V1ZG8+Ow0KKw0KK2RlZiBMQVMzMiA6IFBzZXVkb0luc3RBbHBoYTwob3V0cyBHUFJDOiRkc3QpLCAoaW5zIEdQUkM6JHB0ciwgR1BSQzokc3dwKSwgIiIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX2xvYWRfYWRkXzMyIEdQUkM6JHB0ciwgR1BSQzokc3dwKSldLCBzX3BzZXVkbz47DQorZGVmIExBUzY0IDpQc2V1ZG9JbnN0QWxwaGE8KG91dHMgR1BSQzokZHN0KSwgKGlucyBHUFJDOiRwdHIsIEdQUkM6JHN3cCksICIiLA0KKyAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKGF0b21pY19sb2FkX2FkZF82NCBHUFJDOiRwdHIsIEdQUkM6JHN3cCkpXSwgc19wc2V1ZG8+Ow0KKw0KK2RlZiBTV0FQMzIgOiBQc2V1ZG9JbnN0QWxwaGE8KG91dHMgR1BSQzokZHN0KSwgKGlucyBHUFJDOiRwdHIsIEdQUkM6JHN3cCksICIiLA0KKyAgICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX3N3YXBfMzIgR1BSQzokcHRyLCBHUFJDOiRzd3ApKV0sIHNfcHNldWRvPjsNCitkZWYgU1dBUDY0IDpQc2V1ZG9JbnN0QWxwaGE8KG91dHMgR1BSQzokZHN0KSwgKGlucyBHUFJDOiRwdHIsIEdQUkM6JHN3cCksICIiLA0KKyAgICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX3N3YXBfNjQgR1BSQzokcHRyLCBHUFJDOiRzd3ApKV0sIHNfcHNldWRvPjsNCit9DQorDQorLy8qKioqKioqKioqKioqKioqKioqKioqKg0KKy8vUmVhbCBpbnN0cnVjdGlvbnMNCisvLyoqKioqKioqKioqKioqKioqKioqKioqDQorDQorLy9PcGVyYXRpb24gRm9ybToNCisNCisvL2NvbmRpdGlvbmFsIG1vdmVzLCBpbnQNCisNCittdWx0aWNsYXNzIGNtb3ZfaW5zdDxiaXRzPDc+IGZ1biwgc3RyaW5nIGFzbXN0ciwgUGF0RnJhZyBPcE5vZGU+IHsNCitkZWYgciA6IE9Gb3JtNDwweDExLCBmdW4sICFzdHJjb25jYXQoYXNtc3RyLCAiICRSQ09ORCwkUlRSVUUsJFJERVNUIiksDQorICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJERVNULCAoc2VsZWN0IChPcE5vZGUgR1BSQzokUkNPTkQpLCBHUFJDOiRSVFJVRSwgR1BSQzokUkZBTFNFKSldLCBzX2Ntb3Y+Ow0KK2RlZiBpIDogT0Zvcm00TDwweDExLCBmdW4sICFzdHJjb25jYXQoYXNtc3RyLCAiICRSQ09ORCwkUlRSVUUsJFJERVNUIiksDQorICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJERVNULCAoc2VsZWN0IChPcE5vZGUgR1BSQzokUkNPTkQpLCBpbW1VRXh0ODokUlRSVUUsIEdQUkM6JFJGQUxTRSkpXSwgc19jbW92PjsNCit9DQorDQorZGVmbSBDTU9WRVEgIDogY21vdl9pbnN0PDB4MjQsICJjbW92ZXEiLCAgQ21wT3BGcmFnPChzZXRlcSBub2RlOiRSLCAwKT4+Ow0KK2RlZm0gQ01PVk5FICA6IGNtb3ZfaW5zdDwweDI2LCAiY21vdm5lIiwgIENtcE9wRnJhZzwoc2V0bmUgbm9kZTokUiwgMCk+PjsNCitkZWZtIENNT1ZMVCAgOiBjbW92X2luc3Q8MHg0NCwgImNtb3ZsdCIsICBDbXBPcEZyYWc8KHNldGx0IG5vZGU6JFIsIDApPj47DQorZGVmbSBDTU9WTEUgIDogY21vdl9pbnN0PDB4NjQsICJjbW92bGUiLCAgQ21wT3BGcmFnPChzZXRsZSBub2RlOiRSLCAwKT4+Ow0KK2RlZm0gQ01PVkdUICA6IGNtb3ZfaW5zdDwweDY2LCAiY21vdmd0IiwgIENtcE9wRnJhZzwoc2V0Z3Qgbm9kZTokUiwgMCk+PjsNCitkZWZtIENNT1ZHRSAgOiBjbW92X2luc3Q8MHg0NiwgImNtb3ZnZSIsICBDbXBPcEZyYWc8KHNldGdlIG5vZGU6JFIsIDApPj47DQorZGVmbSBDTU9WTEJDIDogY21vdl9pbnN0PDB4MTYsICJjbW92bGJjIiwgQ21wT3BGcmFnPCh4b3IgICBub2RlOiRSLCAxKT4+Ow0KK2RlZm0gQ01PVkxCUyA6IGNtb3ZfaW5zdDwweDE0LCAiY21vdmxicyIsIENtcE9wRnJhZzwoYW5kICAgbm9kZTokUiwgMSk+PjsNCisNCisvL0dlbmVyYWwgcGF0dGVybiBmb3IgY21vdg0KK2RlZiA6IFBhdDwoc2VsZWN0IEdQUkM6JHdoaWNoLCBHUFJDOiRzcmMxLCBHUFJDOiRzcmMyKSwNCisgICAgICAoQ01PVk5FciBHUFJDOiRzcmMyLCBHUFJDOiRzcmMxLCBHUFJDOiR3aGljaCk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IEdQUkM6JHdoaWNoLCBHUFJDOiRzcmMxLCBpbW1VRXh0ODokc3JjMiksDQorICAgICAgKENNT1ZFUWkgR1BSQzokc3JjMSwgaW1tVUV4dDg6JHNyYzIsIEdQUkM6JHdoaWNoKT47DQorDQorLy9JbnZlcnQgc2Vuc2Ugd2hlbiB3ZSBjYW4gZm9yIGNvbnN0YW50czoNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0bmUgR1BSQzokUkNPTkQsIDApLCBHUFJDOiRSVFJVRSwgaW1tVUV4dDg6JFJGQUxTRSksDQorICAgICAgICAgIChDTU9WRVFpIEdQUkM6JFJDT05ELCBpbW1VRXh0ODokUkZBTFNFLCBHUFJDOiRSVFJVRSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRndCBHUFJDOiRSQ09ORCwgMCksIEdQUkM6JFJUUlVFLCBpbW1VRXh0ODokUkZBTFNFKSwNCisgICAgICAgICAgKENNT1ZMRWkgR1BSQzokUkNPTkQsIGltbVVFeHQ4OiRSRkFMU0UsIEdQUkM6JFJUUlVFKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldGdlIEdQUkM6JFJDT05ELCAwKSwgR1BSQzokUlRSVUUsIGltbVVFeHQ4OiRSRkFMU0UpLA0KKyAgICAgICAgICAoQ01PVkxUaSBHUFJDOiRSQ09ORCwgaW1tVUV4dDg6JFJGQUxTRSwgR1BSQzokUlRSVUUpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0bHQgR1BSQzokUkNPTkQsIDApLCBHUFJDOiRSVFJVRSwgaW1tVUV4dDg6JFJGQUxTRSksDQorICAgICAgICAgIChDTU9WR0VpIEdQUkM6JFJDT05ELCBpbW1VRXh0ODokUkZBTFNFLCBHUFJDOiRSVFJVRSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRsZSBHUFJDOiRSQ09ORCwgMCksIEdQUkM6JFJUUlVFLCBpbW1VRXh0ODokUkZBTFNFKSwNCisgICAgICAgICAgKENNT1ZHVGkgR1BSQzokUkNPTkQsIGltbVVFeHQ4OiRSRkFMU0UsIEdQUkM6JFJUUlVFKT47DQorDQorbXVsdGljbGFzcyBhbGxfaW5zdDxiaXRzPDY+IG9wYywgYml0czw3PiBmdW5sLCBiaXRzPDc+IGZ1bnEsIA0KKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFzbXN0ciwgUGF0RnJhZyBPcE5vZGUsIEluc3RySXRpbkNsYXNzIGl0aW4+IHsNCisgIGRlZiBMciA6IE9Gb3JtPCBvcGMsIGZ1bmwsICFzdHJjb25jYXQoYXNtc3RyLCAibCAkUkEsJFJCLCRSQyIpLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoaW50b3AgKE9wTm9kZSBHUFJDOiRSQSwgR1BSQzokUkIpKSldLCBpdGluPjsNCisgIGRlZiBMaSA6IE9Gb3JtTDxvcGMsIGZ1bmwsICFzdHJjb25jYXQoYXNtc3RyLCAibCAkUkEsJEwsJFJDIiksDQorICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkMsIChpbnRvcCAoT3BOb2RlIEdQUkM6JFJBLCBpbW1VRXh0ODokTCkpKV0sIGl0aW4+Ow0KKyAgZGVmIFFyIDogT0Zvcm08IG9wYywgZnVucSwgIXN0cmNvbmNhdChhc21zdHIsICJxICRSQSwkUkIsJFJDIiksDQorICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkMsIChPcE5vZGUgR1BSQzokUkEsIEdQUkM6JFJCKSldLCBpdGluPjsNCisgIGRlZiBRaSA6IE9Gb3JtTDxvcGMsIGZ1bnEsICFzdHJjb25jYXQoYXNtc3RyLCAicSAkUkEsJEwsJFJDIiksDQorICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkMsIChPcE5vZGUgR1BSQzokUkEsIGltbVVFeHQ4OiRMKSldLCBpdGluPjsNCit9DQorDQorZGVmbSBNVUwgICA6IGFsbF9pbnN0PDB4MTMsIDB4MDAsIDB4MjAsICJtdWwiLCAgIEJpbk9wRnJhZzwobXVsIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIHNfaW11bD47DQorZGVmbSBBREQgICA6IGFsbF9pbnN0PDB4MTAsIDB4MDAsIDB4MjAsICJhZGQiLCAgIEJpbk9wRnJhZzwoYWRkIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIHNfaWFkZD47DQorZGVmbSBTNEFERCA6IGFsbF9pbnN0PDB4MTAsIDB4MDIsIDB4MjIsICJzNGFkZCIsIGFkZDQsIHNfaWFkZD47DQorZGVmbSBTOEFERCA6IGFsbF9pbnN0PDB4MTAsIDB4MTIsIDB4MzIsICJzOGFkZCIsIGFkZDgsIHNfaWFkZD47DQorZGVmbSBTNFNVQiA6IGFsbF9pbnN0PDB4MTAsIDB4MEIsIDB4MkIsICJzNHN1YiIsIHN1YjQsIHNfaWFkZD47DQorZGVmbSBTOFNVQiA6IGFsbF9pbnN0PDB4MTAsIDB4MUIsIDB4M0IsICJzOHN1YiIsIHN1YjgsIHNfaWFkZD47DQorZGVmbSBTVUIgICA6IGFsbF9pbnN0PDB4MTAsIDB4MDksIDB4MjksICJzdWIiLCAgIEJpbk9wRnJhZzwoc3ViIG5vZGU6JExIUywgbm9kZTokUkhTKT4sIHNfaWFkZD47DQorLy9Db25zdCBjYXNlcyBzaW5jZSBsZWdhbGl6ZSBkb2VzIHN1YiB4LCBpbnQgLT4gYWRkIHgsIGludihpbnQpICsgMQ0KK2RlZiA6IFBhdDwoaW50b3AgKGFkZCBHUFJDOiRSQSwgaW1tVUV4dDhuZWc6JEwpKSwgKFNVQkxpIEdQUkM6JFJBLCBpbW1VRXh0OG5lZzokTCk+Ow0KK2RlZiA6IFBhdDwoYWRkIEdQUkM6JFJBLCBpbW1VRXh0OG5lZzokTCksIChTVUJRaSBHUFJDOiRSQSwgaW1tVUV4dDhuZWc6JEwpPjsNCitkZWYgOiBQYXQ8KGludG9wIChhZGQ0IEdQUkM6JFJBLCBpbW1VRXh0OG5lZzokTCkpLCAoUzRTVUJMaSBHUFJDOiRSQSwgaW1tVUV4dDhuZWc6JEwpPjsNCitkZWYgOiBQYXQ8KGFkZDQgR1BSQzokUkEsIGltbVVFeHQ4bmVnOiRMKSwgKFM0U1VCUWkgR1BSQzokUkEsIGltbVVFeHQ4bmVnOiRMKT47DQorZGVmIDogUGF0PChpbnRvcCAoYWRkOCBHUFJDOiRSQSwgaW1tVUV4dDhuZWc6JEwpKSwgKFM4U1VCTGkgR1BSQzokUkEsIGltbVVFeHQ4bmVnOiRMKT47DQorZGVmIDogUGF0PChhZGQ4IEdQUkM6JFJBLCBpbW1VRXh0OG5lZzokTCksIChTOFNVQlFpIEdQUkM6JFJBLCBpbW1VRXh0OG5lZzokTCk+Ow0KKw0KK211bHRpY2xhc3MgbG9nX2luc3Q8Yml0czw2PiBvcGMsIGJpdHM8Nz4gZnVuLCBzdHJpbmcgYXNtc3RyLCBTRE5vZGUgT3BOb2RlLCBJbnN0ckl0aW5DbGFzcyBpdGluPiB7DQorZGVmIHIgOiBPRm9ybTxvcGMsIGZ1biwgIXN0cmNvbmNhdChhc21zdHIsICIgJFJBLCRSQiwkUkMiKSwNCisgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoT3BOb2RlIEdQUkM6JFJBLCBHUFJDOiRSQikpXSwgaXRpbj47DQorZGVmIGkgOiBPRm9ybUw8b3BjLCBmdW4sICFzdHJjb25jYXQoYXNtc3RyLCAiICRSQSwkTCwkUkMiKSwNCisgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoT3BOb2RlIEdQUkM6JFJBLCBpbW1VRXh0ODokTCkpXSwgaXRpbj47DQorfQ0KK211bHRpY2xhc3MgaW52X2luc3Q8Yml0czw2PiBvcGMsIGJpdHM8Nz4gZnVuLCBzdHJpbmcgYXNtc3RyLCBTRE5vZGUgT3BOb2RlLCBJbnN0ckl0aW5DbGFzcyBpdGluPiB7DQorZGVmIHIgOiBPRm9ybTxvcGMsIGZ1biwgIXN0cmNvbmNhdChhc21zdHIsICIgJFJBLCRSQiwkUkMiKSwNCisgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoT3BOb2RlIEdQUkM6JFJBLCAobm90IEdQUkM6JFJCKSkpXSwgaXRpbj47DQorZGVmIGkgOiBPRm9ybUw8b3BjLCBmdW4sICFzdHJjb25jYXQoYXNtc3RyLCAiICRSQSwkTCwkUkMiKSwNCisgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoT3BOb2RlIEdQUkM6JFJBLCBpbW1VRXh0OGludjokTCkpXSwgaXRpbj47DQorfQ0KKw0KK2RlZm0gQU5EICAgOiBsb2dfaW5zdDwweDExLCAweDAwLCAiYW5kIiwgICBhbmQsICAgc19pbG9nPjsNCitkZWZtIEJJQyAgIDogaW52X2luc3Q8MHgxMSwgMHgwOCwgImJpYyIsICAgYW5kLCAgIHNfaWxvZz47DQorZGVmbSBCSVMgICA6IGxvZ19pbnN0PDB4MTEsIDB4MjAsICJiaXMiLCAgIG9yLCAgICBzX2lsb2c+Ow0KK2RlZm0gT1JOT1QgOiBpbnZfaW5zdDwweDExLCAweDI4LCAib3Jub3QiLCBvciwgICAgc19pbG9nPjsNCitkZWZtIFhPUiAgIDogbG9nX2luc3Q8MHgxMSwgMHg0MCwgInhvciIsICAgeG9yLCAgIHNfaWxvZz47DQorZGVmbSBFUVYgICA6IGludl9pbnN0PDB4MTEsIDB4NDgsICJlcXYiLCAgIHhvciwgICBzX2lsb2c+Ow0KKw0KK2RlZm0gU0wgICAgOiBsb2dfaW5zdDwweDEyLCAweDM5LCAic2xsIiwgICBzaGwsICAgc19pc2hmPjsNCitkZWZtIFNSQSAgIDogbG9nX2luc3Q8MHgxMiwgMHgzYywgInNyYSIsICAgc3JhLCAgIHNfaXNoZj47DQorZGVmbSBTUkwgICA6IGxvZ19pbnN0PDB4MTIsIDB4MzQsICJzcmwiLCAgIHNybCwgICBzX2lzaGY+Ow0KK2RlZm0gVU1VTEggOiBsb2dfaW5zdDwweDEzLCAweDMwLCAidW11bGgiLCBtdWxodSwgc19pbXVsPjsNCisNCitkZWYgQ1RMWiAgICAgOiBPRm9ybTI8MHgxQywgMHgzMiwgIkNUTFogJFJCLCRSQyIsIA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQywgKGN0bHogR1BSQzokUkIpKV0sIHNfaW1pc2M+Ow0KK2RlZiBDVFBPUCAgICA6IE9Gb3JtMjwweDFDLCAweDMwLCAiQ1RQT1AgJFJCLCRSQyIsIA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQywgKGN0cG9wIEdQUkM6JFJCKSldLCBzX2ltaXNjPjsNCitkZWYgQ1RUWiAgICAgOiBPRm9ybTI8MHgxQywgMHgzMywgIkNUVFogJFJCLCRSQyIsIA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQywgKGN0dHogR1BSQzokUkIpKV0sIHNfaW1pc2M+Ow0KK2RlZiBFWFRCTCAgICA6IE9Gb3JtPCAweDEyLCAweDA2LCAiRVhUQkwgJFJBLCRSQiwkUkMiLCANCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkMsIChhbmQgKHNybCBHUFJDOiRSQSwgKHNobCBHUFJDOiRSQiwgMykpLCAyNTUpKV0sIHNfaXNoZj47DQorZGVmIEVYVFdMICAgIDogT0Zvcm08IDB4MTIsIDB4MTYsICJFWFRXTCAkUkEsJFJCLCRSQyIsIA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQywgKGFuZCAoc3JsIEdQUkM6JFJBLCAoc2hsIEdQUkM6JFJCLCAzKSksIDY1NTM1KSldLCBzX2lzaGY+Ow0KK2RlZiBFWFRMTCAgICA6IE9Gb3JtPCAweDEyLCAweDI2LCAiRVhUTEwgJFJBLCRSQiwkUkMiLCANCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkMsIChhbmQgKHNybCBHUFJDOiRSQSwgKHNobCBHUFJDOiRSQiwgMykpLCA0Mjk0OTY3Mjk1KSldLCBzX2lzaGY+Ow0KK2RlZiBTRVhUQiAgICA6IE9Gb3JtMjwweDFDLCAweDAwLCAic2V4dGIgJFJCLCRSQyIsIA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQywgKHNleHRfaW5yZWcgR1BSQzokUkIsIGk4KSldLCBzX2lzaGY+Ow0KK2RlZiBTRVhUVyAgICA6IE9Gb3JtMjwweDFDLCAweDAxLCAic2V4dHcgJFJCLCRSQyIsIA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQywgKHNleHRfaW5yZWcgR1BSQzokUkIsIGkxNikpXSwgc19pc2hmPjsNCisNCisvL2RlZiBFWFRCTGkgICA6IE9Gb3JtTDwweDEyLCAweDA2LCAiRVhUQkwgJFJBLCRMLCRSQyIsIFtdPjsgLy9FeHRyYWN0IGJ5dGUgbG93DQorLy9kZWYgRVhUTEggICAgOiBPRm9ybTwgMHgxMiwgMHg2QSwgIkVYVExIICRSQSwkUkIsJFJDIiwgW10+OyAvL0V4dHJhY3QgbG9uZ3dvcmQgaGlnaA0KKy8vZGVmIEVYVExIaSAgIDogT0Zvcm1MPDB4MTIsIDB4NkEsICJFWFRMSCAkUkEsJEwsJFJDIiwgW10+OyAvL0V4dHJhY3QgbG9uZ3dvcmQgaGlnaA0KKy8vZGVmIEVYVExMaSAgIDogT0Zvcm1MPDB4MTIsIDB4MjYsICJFWFRMTCAkUkEsJEwsJFJDIiwgW10+OyAvL0V4dHJhY3QgbG9uZ3dvcmQgbG93DQorLy9kZWYgRVhUUUggICAgOiBPRm9ybTwgMHgxMiwgMHg3QSwgIkVYVFFIICRSQSwkUkIsJFJDIiwgW10+OyAvL0V4dHJhY3QgcXVhZHdvcmQgaGlnaA0KKy8vZGVmIEVYVFFIaSAgIDogT0Zvcm1MPDB4MTIsIDB4N0EsICJFWFRRSCAkUkEsJEwsJFJDIiwgW10+OyAvL0V4dHJhY3QgcXVhZHdvcmQgaGlnaA0KKy8vZGVmIEVYVFEgICAgIDogT0Zvcm08IDB4MTIsIDB4MzYsICJFWFRRICRSQSwkUkIsJFJDIiwgW10+OyAvL0V4dHJhY3QgcXVhZHdvcmQgbG93DQorLy9kZWYgRVhUUWkgICAgOiBPRm9ybUw8MHgxMiwgMHgzNiwgIkVYVFEgJFJBLCRMLCRSQyIsIFtdPjsgLy9FeHRyYWN0IHF1YWR3b3JkIGxvdw0KKy8vZGVmIEVYVFdIICAgIDogT0Zvcm08IDB4MTIsIDB4NUEsICJFWFRXSCAkUkEsJFJCLCRSQyIsIFtdPjsgLy9FeHRyYWN0IHdvcmQgaGlnaA0KKy8vZGVmIEVYVFdIaSAgIDogT0Zvcm1MPDB4MTIsIDB4NUEsICJFWFRXSCAkUkEsJEwsJFJDIiwgW10+OyAvL0V4dHJhY3Qgd29yZCBoaWdoDQorLy9kZWYgRVhUV0xpICAgOiBPRm9ybUw8MHgxMiwgMHgxNiwgIkVYVFdMICRSQSwkTCwkUkMiLCBbXT47IC8vRXh0cmFjdCB3b3JkIGxvdw0KKw0KKy8vZGVmIElOU0JMICAgIDogT0Zvcm08IDB4MTIsIDB4MEIsICJJTlNCTCAkUkEsJFJCLCRSQyIsIFtdPjsgLy9JbnNlcnQgYnl0ZSBsb3cNCisvL2RlZiBJTlNCTGkgICA6IE9Gb3JtTDwweDEyLCAweDBCLCAiSU5TQkwgJFJBLCRMLCRSQyIsIFtdPjsgLy9JbnNlcnQgYnl0ZSBsb3cNCisvL2RlZiBJTlNMSCAgICA6IE9Gb3JtPCAweDEyLCAweDY3LCAiSU5TTEggJFJBLCRSQiwkUkMiLCBbXT47IC8vSW5zZXJ0IGxvbmd3b3JkIGhpZ2gNCisvL2RlZiBJTlNMSGkgICA6IE9Gb3JtTDwweDEyLCAweDY3LCAiSU5TTEggJFJBLCRMLCRSQyIsIFtdPjsgLy9JbnNlcnQgbG9uZ3dvcmQgaGlnaA0KKy8vZGVmIElOU0xMICAgIDogT0Zvcm08IDB4MTIsIDB4MkIsICJJTlNMTCAkUkEsJFJCLCRSQyIsIFtdPjsgLy9JbnNlcnQgbG9uZ3dvcmQgbG93DQorLy9kZWYgSU5TTExpICAgOiBPRm9ybUw8MHgxMiwgMHgyQiwgIklOU0xMICRSQSwkTCwkUkMiLCBbXT47IC8vSW5zZXJ0IGxvbmd3b3JkIGxvdw0KKy8vZGVmIElOU1FIICAgIDogT0Zvcm08IDB4MTIsIDB4NzcsICJJTlNRSCAkUkEsJFJCLCRSQyIsIFtdPjsgLy9JbnNlcnQgcXVhZHdvcmQgaGlnaA0KKy8vZGVmIElOU1FIaSAgIDogT0Zvcm1MPDB4MTIsIDB4NzcsICJJTlNRSCAkUkEsJEwsJFJDIiwgW10+OyAvL0luc2VydCBxdWFkd29yZCBoaWdoDQorLy9kZWYgSU5TUUwgICAgOiBPRm9ybTwgMHgxMiwgMHgzQiwgIklOU1FMICRSQSwkUkIsJFJDIiwgW10+OyAvL0luc2VydCBxdWFkd29yZCBsb3cNCisvL2RlZiBJTlNRTGkgICA6IE9Gb3JtTDwweDEyLCAweDNCLCAiSU5TUUwgJFJBLCRMLCRSQyIsIFtdPjsgLy9JbnNlcnQgcXVhZHdvcmQgbG93DQorLy9kZWYgSU5TV0ggICAgOiBPRm9ybTwgMHgxMiwgMHg1NywgIklOU1dIICRSQSwkUkIsJFJDIiwgW10+OyAvL0luc2VydCB3b3JkIGhpZ2gNCisvL2RlZiBJTlNXSGkgICA6IE9Gb3JtTDwweDEyLCAweDU3LCAiSU5TV0ggJFJBLCRMLCRSQyIsIFtdPjsgLy9JbnNlcnQgd29yZCBoaWdoDQorLy9kZWYgSU5TV0wgICAgOiBPRm9ybTwgMHgxMiwgMHgxQiwgIklOU1dMICRSQSwkUkIsJFJDIiwgW10+OyAvL0luc2VydCB3b3JkIGxvdw0KKy8vZGVmIElOU1dMaSAgIDogT0Zvcm1MPDB4MTIsIDB4MUIsICJJTlNXTCAkUkEsJEwsJFJDIiwgW10+OyAvL0luc2VydCB3b3JkIGxvdw0KKw0KKy8vZGVmIE1TS0JMICAgIDogT0Zvcm08IDB4MTIsIDB4MDIsICJNU0tCTCAkUkEsJFJCLCRSQyIsIFtdPjsgLy9NYXNrIGJ5dGUgbG93DQorLy9kZWYgTVNLQkxpICAgOiBPRm9ybUw8MHgxMiwgMHgwMiwgIk1TS0JMICRSQSwkTCwkUkMiLCBbXT47IC8vTWFzayBieXRlIGxvdw0KKy8vZGVmIE1TS0xIICAgIDogT0Zvcm08IDB4MTIsIDB4NjIsICJNU0tMSCAkUkEsJFJCLCRSQyIsIFtdPjsgLy9NYXNrIGxvbmd3b3JkIGhpZ2gNCisvL2RlZiBNU0tMSGkgICA6IE9Gb3JtTDwweDEyLCAweDYyLCAiTVNLTEggJFJBLCRMLCRSQyIsIFtdPjsgLy9NYXNrIGxvbmd3b3JkIGhpZ2gNCisvL2RlZiBNU0tMTCAgICA6IE9Gb3JtPCAweDEyLCAweDIyLCAiTVNLTEwgJFJBLCRSQiwkUkMiLCBbXT47IC8vTWFzayBsb25nd29yZCBsb3cNCisvL2RlZiBNU0tMTGkgICA6IE9Gb3JtTDwweDEyLCAweDIyLCAiTVNLTEwgJFJBLCRMLCRSQyIsIFtdPjsgLy9NYXNrIGxvbmd3b3JkIGxvdw0KKy8vZGVmIE1TS1FIICAgIDogT0Zvcm08IDB4MTIsIDB4NzIsICJNU0tRSCAkUkEsJFJCLCRSQyIsIFtdPjsgLy9NYXNrIHF1YWR3b3JkIGhpZ2gNCisvL2RlZiBNU0tRSGkgICA6IE9Gb3JtTDwweDEyLCAweDcyLCAiTVNLUUggJFJBLCRMLCRSQyIsIFtdPjsgLy9NYXNrIHF1YWR3b3JkIGhpZ2gNCisvL2RlZiBNU0tRTCAgICA6IE9Gb3JtPCAweDEyLCAweDMyLCAiTVNLUUwgJFJBLCRSQiwkUkMiLCBbXT47IC8vTWFzayBxdWFkd29yZCBsb3cNCisvL2RlZiBNU0tRTGkgICA6IE9Gb3JtTDwweDEyLCAweDMyLCAiTVNLUUwgJFJBLCRMLCRSQyIsIFtdPjsgLy9NYXNrIHF1YWR3b3JkIGxvdw0KKy8vZGVmIE1TS1dIICAgIDogT0Zvcm08IDB4MTIsIDB4NTIsICJNU0tXSCAkUkEsJFJCLCRSQyIsIFtdPjsgLy9NYXNrIHdvcmQgaGlnaA0KKy8vZGVmIE1TS1dIaSAgIDogT0Zvcm1MPDB4MTIsIDB4NTIsICJNU0tXSCAkUkEsJEwsJFJDIiwgW10+OyAvL01hc2sgd29yZCBoaWdoDQorLy9kZWYgTVNLV0wgICAgOiBPRm9ybTwgMHgxMiwgMHgxMiwgIk1TS1dMICRSQSwkUkIsJFJDIiwgW10+OyAvL01hc2sgd29yZCBsb3cNCisvL2RlZiBNU0tXTGkgICA6IE9Gb3JtTDwweDEyLCAweDEyLCAiTVNLV0wgJFJBLCRMLCRSQyIsIFtdPjsgLy9NYXNrIHdvcmQgbG93DQorICAgICAgICAgICAgICAgICAgICAgIA0KK2RlZiBaQVBOT1RpICA6IE9Gb3JtTDwweDEyLCAweDMxLCAiemFwbm90ICRSQSwkTCwkUkMiLCBbXSwgc19pc2hmPjsNCisNCisvLyBEZWZpbmUgdGhlIHBhdHRlcm4gdGhhdCBwcm9kdWNlcyBaQVBOT1RpLg0KK2RlZiA6IFBhdDwoemFwcGF0OiRpbW0gR1BSQzokUkEpLA0KKyAgICAgICAgICAoWkFQTk9UaSBHUFJDOiRSQSwgKGlaQVBYIEdQUkM6JGltbSkpPjsNCisNCisNCisvL0NvbXBhcmlzb24sIGludA0KKy8vU28gdGhpcyBpcyBhIHdhc3RlIG9mIHdoYXQgdGhpcyBpbnN0cnVjdGlvbiBjYW4gZG8sIGJ1dCBpdCBzdGlsbCBzYXZlcyBzb21ldGhpbmcNCitkZWYgQ01QQkdFICA6IE9Gb3JtPCAweDEwLCAweDBGLCAiY21wYmdlICRSQSwkUkIsJFJDIiwgDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkMsIChzZXR1Z2UgKGFuZCBHUFJDOiRSQSwgMjU1KSwgKGFuZCBHUFJDOiRSQiwgMjU1KSkpXSwgc19pbG9nPjsNCitkZWYgQ01QQkdFaSA6IE9Gb3JtTDwweDEwLCAweDBGLCAiY21wYmdlICRSQSwkTCwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoc2V0dWdlIChhbmQgR1BSQzokUkEsIDI1NSksIGltbVVFeHQ4OiRMKSldLCBzX2lsb2c+Ow0KK2RlZiBDTVBFUSAgIDogT0Zvcm08IDB4MTAsIDB4MkQsICJjbXBlcSAkUkEsJFJCLCRSQyIsIA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoc2V0ZXEgR1BSQzokUkEsIEdQUkM6JFJCKSldLCBzX2lhZGQ+Ow0KK2RlZiBDTVBFUWkgIDogT0Zvcm1MPDB4MTAsIDB4MkQsICJjbXBlcSAkUkEsJEwsJFJDIiwgDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkMsIChzZXRlcSBHUFJDOiRSQSwgaW1tVUV4dDg6JEwpKV0sIHNfaWFkZD47DQorZGVmIENNUExFICAgOiBPRm9ybTwgMHgxMCwgMHg2RCwgImNtcGxlICRSQSwkUkIsJFJDIiwgDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkMsIChzZXRsZSBHUFJDOiRSQSwgR1BSQzokUkIpKV0sIHNfaWFkZD47DQorZGVmIENNUExFaSAgOiBPRm9ybUw8MHgxMCwgMHg2RCwgImNtcGxlICRSQSwkTCwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoc2V0bGUgR1BSQzokUkEsIGltbVVFeHQ4OiRMKSldLCBzX2lhZGQ+Ow0KK2RlZiBDTVBMVCAgIDogT0Zvcm08IDB4MTAsIDB4NEQsICJjbXBsdCAkUkEsJFJCLCRSQyIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkMsIChzZXRsdCBHUFJDOiRSQSwgR1BSQzokUkIpKV0sIHNfaWFkZD47DQorZGVmIENNUExUaSAgOiBPRm9ybUw8MHgxMCwgMHg0RCwgImNtcGx0ICRSQSwkTCwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoc2V0bHQgR1BSQzokUkEsIGltbVVFeHQ4OiRMKSldLCBzX2lhZGQ+Ow0KK2RlZiBDTVBVTEUgIDogT0Zvcm08IDB4MTAsIDB4M0QsICJjbXB1bGUgJFJBLCRSQiwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoc2V0dWxlIEdQUkM6JFJBLCBHUFJDOiRSQikpXSwgc19pYWRkPjsNCitkZWYgQ01QVUxFaSA6IE9Gb3JtTDwweDEwLCAweDNELCAiY21wdWxlICRSQSwkTCwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoc2V0dWxlIEdQUkM6JFJBLCBpbW1VRXh0ODokTCkpXSwgc19pYWRkPjsNCitkZWYgQ01QVUxUICA6IE9Gb3JtPCAweDEwLCAweDFELCAiY21wdWx0ICRSQSwkUkIsJFJDIiwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQywgKHNldHVsdCBHUFJDOiRSQSwgR1BSQzokUkIpKV0sIHNfaWFkZD47DQorZGVmIENNUFVMVGkgOiBPRm9ybUw8MHgxMCwgMHgxRCwgImNtcHVsdCAkUkEsJEwsJFJDIiwgDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoc2V0dWx0IEdQUkM6JFJBLCBpbW1VRXh0ODokTCkpXSwgc19pYWRkPjsNCisNCisvL1BhdHRlcm5zIGZvciB1bnN1cHBvcnRlZCBpbnQgY29tcGFyaXNvbnMNCitkZWYgOiBQYXQ8KHNldHVlcSBHUFJDOiRYLCBHUFJDOiRZKSwgKENNUEVRIEdQUkM6JFgsIEdQUkM6JFkpPjsNCitkZWYgOiBQYXQ8KHNldHVlcSBHUFJDOiRYLCBpbW1VRXh0ODokWSksIChDTVBFUWkgR1BSQzokWCwgaW1tVUV4dDg6JFkpPjsNCisNCitkZWYgOiBQYXQ8KHNldHVndCBHUFJDOiRYLCBHUFJDOiRZKSwgKENNUFVMVCBHUFJDOiRZLCBHUFJDOiRYKT47DQorZGVmIDogUGF0PChzZXR1Z3QgaW1tVUV4dDg6JFgsIEdQUkM6JFkpLCAoQ01QVUxUaSBHUFJDOiRZLCBpbW1VRXh0ODokWCk+Ow0KKw0KK2RlZiA6IFBhdDwoc2V0dWdlIEdQUkM6JFgsIEdQUkM6JFkpLCAoQ01QVUxFIEdQUkM6JFksIEdQUkM6JFgpPjsNCitkZWYgOiBQYXQ8KHNldHVnZSBpbW1VRXh0ODokWCwgR1BSQzokWSksIChDTVBVTEVpIEdQUkM6JFksIGltbVVFeHQ4OiRYKT47DQorDQorZGVmIDogUGF0PChzZXRndCBHUFJDOiRYLCBHUFJDOiRZKSwgKENNUExUIEdQUkM6JFksIEdQUkM6JFgpPjsNCitkZWYgOiBQYXQ8KHNldGd0IGltbVVFeHQ4OiRYLCBHUFJDOiRZKSwgKENNUExUaSBHUFJDOiRZLCBpbW1VRXh0ODokWCk+Ow0KKw0KK2RlZiA6IFBhdDwoc2V0Z2UgR1BSQzokWCwgR1BSQzokWSksIChDTVBMRSBHUFJDOiRZLCBHUFJDOiRYKT47DQorZGVmIDogUGF0PChzZXRnZSBpbW1VRXh0ODokWCwgR1BSQzokWSksIChDTVBMRWkgR1BSQzokWSwgaW1tVUV4dDg6JFgpPjsNCisNCitkZWYgOiBQYXQ8KHNldG5lIEdQUkM6JFgsIEdQUkM6JFkpLCAoQ01QRVFpIChDTVBFUSBHUFJDOiRYLCBHUFJDOiRZKSwgMCk+Ow0KK2RlZiA6IFBhdDwoc2V0bmUgR1BSQzokWCwgaW1tVUV4dDg6JFkpLCAoQ01QRVFpIChDTVBFUWkgR1BSQzokWCwgaW1tVUV4dDg6JFkpLCAwKT47DQorDQorZGVmIDogUGF0PChzZXR1bmUgR1BSQzokWCwgR1BSQzokWSksIChDTVBFUWkgKENNUEVRIEdQUkM6JFgsIEdQUkM6JFkpLCAwKT47DQorZGVmIDogUGF0PChzZXR1bmUgR1BSQzokWCwgaW1tVUV4dDg6JFkpLCAoQ01QRVFpIChDTVBFUSBHUFJDOiRYLCBpbW1VRXh0ODokWSksIDApPjsNCisNCisNCitsZXQgaXNSZXR1cm4gPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBpc0JhcnJpZXIgPSAxLCBSYSA9IDMxLCBSYiA9IDI2LCBkaXNwID0gMSwgVXNlcyA9IFtSMjZdIGluIHsNCisgIGRlZiBSRVREQUcgOiBNYnJGb3JtPCAweDFBLCAweDAyLCAoaW5zKSwgInJldCAkJDMxLCgkJDI2KSwxIiwgc19qc3I+OyAvL1JldHVybiBmcm9tIHN1YnJvdXRpbmUNCisgIGRlZiBSRVREQUdwIDogTWJycEZvcm08IDB4MUEsIDB4MDIsIChpbnMpLCAicmV0ICQkMzEsKCQkMjYpLDEiLCBbKHJldGZsYWcpXSwgc19qc3I+OyAvL1JldHVybiBmcm9tIHN1YnJvdXRpbmUNCit9DQorDQorbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSwgaXNJbmRpcmVjdEJyYW5jaCA9IDEsIFJhID0gMzEsIGRpc3AgPSAwIGluDQorZGVmIEpNUCA6IE1icnBGb3JtPCAweDFBLCAweDAwLCAoaW5zIEdQUkM6JFJTKSwgImptcCAkJDMxLCgkUlMpLDAiLCANCisgICAgICAgICAgWyhicmluZCBHUFJDOiRSUyldLCBzX2pzcj47IC8vSnVtcA0KKw0KK2xldCBpc0NhbGwgPSAxLCBSYSA9IDI2LA0KKyAgICBEZWZzID0gW1IwLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFIxNiwgUjE3LCBSMTgsIFIxOSwNCisgICAgICAgICAgICBSMjAsIFIyMSwgUjIyLCBSMjMsIFIyNCwgUjI1LCBSMjYsIFIyNywgUjI4LCBSMjksDQorICAgICAgICAgICAgRjAsIEYxLA0KKyAgICAgICAgICAgIEYxMCwgRjExLCBGMTIsIEYxMywgRjE0LCBGMTUsIEYxNiwgRjE3LCBGMTgsIEYxOSwNCisgICAgICAgICAgICBGMjAsIEYyMSwgRjIyLCBGMjMsIEYyNCwgRjI1LCBGMjYsIEYyNywgRjI4LCBGMjksIEYzMF0sIFVzZXMgPSBbUjI5XSBpbiB7DQorICAgIGRlZiBCU1IgOiBCRm9ybUQ8MHgzNCwgImJzciAkJDI2LCQkJERJU1AuLm5nIiwgW10sIHNfanNyPjsgLy9CcmFuY2ggdG8gc3Vicm91dGluZQ0KK30NCitsZXQgaXNDYWxsID0gMSwgUmEgPSAyNiwgUmIgPSAyNywgZGlzcCA9IDAsDQorICAgIERlZnMgPSBbUjAsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjYsIFI3LCBSOCwgUjE2LCBSMTcsIFIxOCwgUjE5LA0KKyAgICAgICAgICAgIFIyMCwgUjIxLCBSMjIsIFIyMywgUjI0LCBSMjUsIFIyNiwgUjI3LCBSMjgsIFIyOSwNCisgICAgICAgICAgICBGMCwgRjEsDQorICAgICAgICAgICAgRjEwLCBGMTEsIEYxMiwgRjEzLCBGMTQsIEYxNSwgRjE2LCBGMTcsIEYxOCwgRjE5LA0KKyAgICAgICAgICAgIEYyMCwgRjIxLCBGMjIsIEYyMywgRjI0LCBGMjUsIEYyNiwgRjI3LCBGMjgsIEYyOSwgRjMwXSwgVXNlcyA9IFtSMjcsIFIyOV0gaW4gew0KKyAgICBkZWYgSlNSIDogTWJyRm9ybTwgMHgxQSwgMHgwMSwgKGlucyksICJqc3IgJCQyNiwoJCQyNyksMCIsIHNfanNyPjsgLy9KdW1wIHRvIHN1YnJvdXRpbmUNCit9DQorDQorbGV0IGlzQ2FsbCA9IDEsIFJhID0gMjMsIFJiID0gMjcsIGRpc3AgPSAwLA0KKyAgICBEZWZzID0gW1IyMywgUjI0LCBSMjUsIFIyNywgUjI4XSwgVXNlcyA9IFtSMjQsIFIyNSwgUjI3XSBpbg0KKyAgZGVmIEpTUnMgOiBNYnJGb3JtPCAweDFBLCAweDAxLCAoaW5zKSwgImpzciAkJDIzLCgkJDI3KSwwIiwgc19qc3I+OyAvL0p1bXAgdG8gZGl2IG9yIHJlbQ0KKw0KKw0KK2RlZiBKU1JfQ09ST1VUSU5FIDogTWJyRm9ybTwgMHgxQSwgMHgwMywgKGlucyBHUFJDOiRSRCwgR1BSQzokUlMsIHMxNGltbTokRElTUCksICJqc3JfY29yb3V0aW5lICRSRCwoJFJTKSwkRElTUCIsIHNfanNyPjsgLy9KdW1wIHRvIHN1YnJvdXRpbmUgcmV0dXJuDQorDQorDQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgR1BSQzokUkEpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBzNjRpbW06JERJU1AsIEdQUkM6JFJCKSBpbiB7DQorZGVmIExEUSAgIDogTUZvcm08MHgyOSwgMSwgImxkcSAkUkEsJERJU1AoJFJCKSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQSwgKGxvYWQgKGFkZCBHUFJDOiRSQiwgaW1tU0V4dDE2OiRESVNQKSkpXSwgc19pbGQ+Ow0KK2RlZiBMRFFyICA6IE1Gb3JtPDB4MjksIDEsICJsZHEgJFJBLCRESVNQKCRSQilcdFx0IWdwcmVsbG93IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJBLCAobG9hZCAoQWxwaGFfZ3ByZWxsbyB0Z2xvYmFsYWRkcjokRElTUCwgR1BSQzokUkIpKSldLCBzX2lsZD47DQorZGVmIExETCAgIDogTUZvcm08MHgyOCwgMSwgImxkbCAkUkEsJERJU1AoJFJCKSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQSwgKHNleHRsb2FkaTMyIChhZGQgR1BSQzokUkIsIGltbVNFeHQxNjokRElTUCkpKV0sIHNfaWxkPjsNCitkZWYgTERMciAgOiBNRm9ybTwweDI4LCAxLCAibGRsICRSQSwkRElTUCgkUkIpXHRcdCFncHJlbGxvdyIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQSwgKHNleHRsb2FkaTMyIChBbHBoYV9ncHJlbGxvIHRnbG9iYWxhZGRyOiRESVNQLCBHUFJDOiRSQikpKV0sIHNfaWxkPjsNCitkZWYgTERCVSAgOiBNRm9ybTwweDBBLCAxLCAibGRidSAkUkEsJERJU1AoJFJCKSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQSwgKHpleHRsb2FkaTggKGFkZCBHUFJDOiRSQiwgaW1tU0V4dDE2OiRESVNQKSkpXSwgc19pbGQ+Ow0KK2RlZiBMREJVciA6IE1Gb3JtPDB4MEEsIDEsICJsZGJ1ICRSQSwkRElTUCgkUkIpXHRcdCFncHJlbGxvdyIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQSwgKHpleHRsb2FkaTggKEFscGhhX2dwcmVsbG8gdGdsb2JhbGFkZHI6JERJU1AsIEdQUkM6JFJCKSkpXSwgc19pbGQ+Ow0KK2RlZiBMRFdVICA6IE1Gb3JtPDB4MEMsIDEsICJsZHd1ICRSQSwkRElTUCgkUkIpIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJBLCAoemV4dGxvYWRpMTYgKGFkZCBHUFJDOiRSQiwgaW1tU0V4dDE2OiRESVNQKSkpXSwgc19pbGQ+Ow0KK2RlZiBMRFdVciA6IE1Gb3JtPDB4MEMsIDEsICJsZHd1ICRSQSwkRElTUCgkUkIpXHRcdCFncHJlbGxvdyIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRSQSwgKHpleHRsb2FkaTE2IChBbHBoYV9ncHJlbGxvIHRnbG9iYWxhZGRyOiRESVNQLCBHUFJDOiRSQikpKV0sIHNfaWxkPjsNCit9DQorDQorDQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBHUFJDOiRSQSwgczY0aW1tOiRESVNQLCBHUFJDOiRSQikgaW4gew0KK2RlZiBTVEIgICA6IE1Gb3JtPDB4MEUsIDAsICJzdGIgJFJBLCRESVNQKCRSQikiLA0KKyAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTggR1BSQzokUkEsIChhZGQgR1BSQzokUkIsIGltbVNFeHQxNjokRElTUCkpXSwgc19pc3Q+Ow0KK2RlZiBTVEJyICA6IE1Gb3JtPDB4MEUsIDAsICJzdGIgJFJBLCRESVNQKCRSQilcdFx0IWdwcmVsbG93IiwNCisgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWk4IEdQUkM6JFJBLCAoQWxwaGFfZ3ByZWxsbyB0Z2xvYmFsYWRkcjokRElTUCwgR1BSQzokUkIpKV0sIHNfaXN0PjsNCitkZWYgU1RXICAgOiBNRm9ybTwweDBELCAwLCAic3R3ICRSQSwkRElTUCgkUkIpIiwNCisgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWkxNiBHUFJDOiRSQSwgKGFkZCBHUFJDOiRSQiwgaW1tU0V4dDE2OiRESVNQKSldLCBzX2lzdD47DQorZGVmIFNUV3IgIDogTUZvcm08MHgwRCwgMCwgInN0dyAkUkEsJERJU1AoJFJCKVx0XHQhZ3ByZWxsb3ciLA0KKyAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTE2IEdQUkM6JFJBLCAoQWxwaGFfZ3ByZWxsbyB0Z2xvYmFsYWRkcjokRElTUCwgR1BSQzokUkIpKV0sIHNfaXN0PjsNCitkZWYgU1RMICAgOiBNRm9ybTwweDJDLCAwLCAic3RsICRSQSwkRElTUCgkUkIpIiwNCisgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWkzMiBHUFJDOiRSQSwgKGFkZCBHUFJDOiRSQiwgaW1tU0V4dDE2OiRESVNQKSldLCBzX2lzdD47DQorZGVmIFNUTHIgIDogTUZvcm08MHgyQywgMCwgInN0bCAkUkEsJERJU1AoJFJCKVx0XHQhZ3ByZWxsb3ciLA0KKyAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTMyIEdQUkM6JFJBLCAoQWxwaGFfZ3ByZWxsbyB0Z2xvYmFsYWRkcjokRElTUCwgR1BSQzokUkIpKV0sIHNfaXN0PjsNCitkZWYgU1RRICAgOiBNRm9ybTwweDJELCAwLCAic3RxICRSQSwkRElTUCgkUkIpIiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgR1BSQzokUkEsIChhZGQgR1BSQzokUkIsIGltbVNFeHQxNjokRElTUCkpXSwgc19pc3Q+Ow0KK2RlZiBTVFFyICA6IE1Gb3JtPDB4MkQsIDAsICJzdHEgJFJBLCRESVNQKCRSQilcdFx0IWdwcmVsbG93IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgR1BSQzokUkEsIChBbHBoYV9ncHJlbGxvIHRnbG9iYWxhZGRyOiRESVNQLCBHUFJDOiRSQikpXSwgc19pc3Q+Ow0KK30NCisNCisvL0xvYWQgYWRkcmVzcw0KK2xldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIEdQUkM6JFJBKSwgSW5PcGVyYW5kTGlzdCA9IChpbnMgczY0aW1tOiRESVNQLCBHUFJDOiRSQikgaW4gew0KK2RlZiBMREEgICA6IE1Gb3JtPDB4MDgsIDAsICJsZGEgJFJBLCRESVNQKCRSQikiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkEsIChhZGQgR1BSQzokUkIsIGltbVNFeHQxNjokRElTUCkpXSwgc19sZGE+Ow0KK2RlZiBMREFyICA6IE1Gb3JtPDB4MDgsIDAsICJsZGEgJFJBLCRESVNQKCRSQilcdFx0IWdwcmVsbG93IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJBLCAoQWxwaGFfZ3ByZWxsbyB0Z2xvYmFsYWRkcjokRElTUCwgR1BSQzokUkIpKV0sIHNfbGRhPjsgIC8vTG9hZCBhZGRyZXNzDQorZGVmIExEQUggIDogTUZvcm08MHgwOSwgMCwgImxkYWggJFJBLCRESVNQKCRSQikiLA0KKyAgICAgICAgICAgICAgICAgW10sIHNfbGRhPjsgIC8vTG9hZCBhZGRyZXNzIGhpZ2gNCitkZWYgTERBSHIgOiBNRm9ybTwweDA5LCAwLCAibGRhaCAkUkEsJERJU1AoJFJCKVx0XHQhZ3ByZWxoaWdoIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JFJBLCAoQWxwaGFfZ3ByZWxoaSB0Z2xvYmFsYWRkcjokRElTUCwgR1BSQzokUkIpKV0sIHNfbGRhPjsgIC8vTG9hZCBhZGRyZXNzIGhpZ2gNCit9DQorDQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBGNFJDOiRSQSwgczY0aW1tOiRESVNQLCBHUFJDOiRSQikgaW4gew0KK2RlZiBTVFMgIDogTUZvcm08MHgyNiwgMCwgInN0cyAkUkEsJERJU1AoJFJCKSIsDQorICAgICAgICAgICAgICAgIFsoc3RvcmUgRjRSQzokUkEsIChhZGQgR1BSQzokUkIsIGltbVNFeHQxNjokRElTUCkpXSwgc19mc3Q+Ow0KK2RlZiBTVFNyIDogTUZvcm08MHgyNiwgMCwgInN0cyAkUkEsJERJU1AoJFJCKVx0XHQhZ3ByZWxsb3ciLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIEY0UkM6JFJBLCAoQWxwaGFfZ3ByZWxsbyB0Z2xvYmFsYWRkcjokRElTUCwgR1BSQzokUkIpKV0sIHNfZnN0PjsNCit9DQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgRjRSQzokUkEpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBzNjRpbW06JERJU1AsIEdQUkM6JFJCKSBpbiB7DQorZGVmIExEUyAgOiBNRm9ybTwweDIyLCAxLCAibGRzICRSQSwkRElTUCgkUkIpIiwNCisgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokUkEsIChsb2FkIChhZGQgR1BSQzokUkIsIGltbVNFeHQxNjokRElTUCkpKV0sIHNfZmxkPjsNCitkZWYgTERTciA6IE1Gb3JtPDB4MjIsIDEsICJsZHMgJFJBLCRESVNQKCRSQilcdFx0IWdwcmVsbG93IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokUkEsIChsb2FkIChBbHBoYV9ncHJlbGxvIHRnbG9iYWxhZGRyOiRESVNQLCBHUFJDOiRSQikpKV0sIHNfZmxkPjsNCit9DQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBGOFJDOiRSQSwgczY0aW1tOiRESVNQLCBHUFJDOiRSQikgaW4gew0KK2RlZiBTVFQgIDogTUZvcm08MHgyNywgMCwgInN0dCAkUkEsJERJU1AoJFJCKSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIEY4UkM6JFJBLCAoYWRkIEdQUkM6JFJCLCBpbW1TRXh0MTY6JERJU1ApKV0sIHNfZnN0PjsNCitkZWYgU1RUciA6IE1Gb3JtPDB4MjcsIDAsICJzdHQgJFJBLCRESVNQKCRSQilcdFx0IWdwcmVsbG93IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgRjhSQzokUkEsIChBbHBoYV9ncHJlbGxvIHRnbG9iYWxhZGRyOiRESVNQLCBHUFJDOiRSQikpXSwgc19mc3Q+Ow0KK30NCitsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBGOFJDOiRSQSksIEluT3BlcmFuZExpc3QgPSAoaW5zIHM2NGltbTokRElTUCwgR1BSQzokUkIpIGluIHsNCitkZWYgTERUICA6IE1Gb3JtPDB4MjMsIDEsICJsZHQgJFJBLCRESVNQKCRSQikiLA0KKyAgICAgICAgICAgICAgICBbKHNldCBGOFJDOiRSQSwgKGxvYWQgKGFkZCBHUFJDOiRSQiwgaW1tU0V4dDE2OiRESVNQKSkpXSwgc19mbGQ+Ow0KK2RlZiBMRFRyIDogTUZvcm08MHgyMywgMSwgImxkdCAkUkEsJERJU1AoJFJCKVx0XHQhZ3ByZWxsb3ciLA0KKyAgICAgICAgICAgICAgICBbKHNldCBGOFJDOiRSQSwgKGxvYWQgKEFscGhhX2dwcmVsbG8gdGdsb2JhbGFkZHI6JERJU1AsIEdQUkM6JFJCKSkpXSwgc19mbGQ+Ow0KK30NCisNCisNCisvL2NvbnN0cG9vbCByZWxzDQorZGVmIDogUGF0PChpNjQgKGxvYWQgKEFscGhhX2dwcmVsbG8gdGNvbnN0cG9vbDokRElTUCwgR1BSQzokUkIpKSksDQorICAgICAgICAgIChMRFFyIHRjb25zdHBvb2w6JERJU1AsIEdQUkM6JFJCKT47DQorZGVmIDogUGF0PChpNjQgKHNleHRsb2FkaTMyIChBbHBoYV9ncHJlbGxvIHRjb25zdHBvb2w6JERJU1AsIEdQUkM6JFJCKSkpLA0KKyAgICAgICAgICAoTERMciB0Y29uc3Rwb29sOiRESVNQLCBHUFJDOiRSQik+Ow0KK2RlZiA6IFBhdDwoaTY0ICh6ZXh0bG9hZGk4IChBbHBoYV9ncHJlbGxvIHRjb25zdHBvb2w6JERJU1AsIEdQUkM6JFJCKSkpLA0KKyAgICAgICAgICAoTERCVXIgdGNvbnN0cG9vbDokRElTUCwgR1BSQzokUkIpPjsNCitkZWYgOiBQYXQ8KGk2NCAoemV4dGxvYWRpMTYgKEFscGhhX2dwcmVsbG8gdGNvbnN0cG9vbDokRElTUCwgR1BSQzokUkIpKSksDQorICAgICAgICAgIChMRFdVciB0Y29uc3Rwb29sOiRESVNQLCBHUFJDOiRSQik+Ow0KK2RlZiA6IFBhdDwoaTY0IChBbHBoYV9ncHJlbGxvIHRjb25zdHBvb2w6JERJU1AsIEdQUkM6JFJCKSksDQorICAgICAgICAgIChMREFyIHRjb25zdHBvb2w6JERJU1AsIEdQUkM6JFJCKT47DQorZGVmIDogUGF0PChpNjQgKEFscGhhX2dwcmVsaGkgdGNvbnN0cG9vbDokRElTUCwgR1BSQzokUkIpKSwNCisgICAgICAgICAgKExEQUhyIHRjb25zdHBvb2w6JERJU1AsIEdQUkM6JFJCKT47DQorZGVmIDogUGF0PChmMzIgKGxvYWQgKEFscGhhX2dwcmVsbG8gdGNvbnN0cG9vbDokRElTUCwgR1BSQzokUkIpKSksDQorICAgICAgICAgIChMRFNyIHRjb25zdHBvb2w6JERJU1AsIEdQUkM6JFJCKT47DQorZGVmIDogUGF0PChmNjQgKGxvYWQgKEFscGhhX2dwcmVsbG8gdGNvbnN0cG9vbDokRElTUCwgR1BSQzokUkIpKSksDQorICAgICAgICAgIChMRFRyIHRjb25zdHBvb2w6JERJU1AsIEdQUkM6JFJCKT47DQorDQorLy9qdW1wdGFibGUgcmVscw0KK2RlZiA6IFBhdDwoaTY0IChBbHBoYV9ncHJlbGhpIHRqdW1wdGFibGU6JERJU1AsIEdQUkM6JFJCKSksDQorICAgICAgICAgIChMREFIciB0anVtcHRhYmxlOiRESVNQLCBHUFJDOiRSQik+Ow0KK2RlZiA6IFBhdDwoaTY0IChBbHBoYV9ncHJlbGxvIHRqdW1wdGFibGU6JERJU1AsIEdQUkM6JFJCKSksDQorICAgICAgICAgIChMREFyIHRqdW1wdGFibGU6JERJU1AsIEdQUkM6JFJCKT47DQorDQorDQorLy9taXNjIGV4dCBwYXR0ZXJucw0KK2RlZiA6IFBhdDwoaTY0IChleHRsb2FkaTggKGFkZCBHUFJDOiRSQiwgaW1tU0V4dDE2OiRESVNQKSkpLA0KKyAgICAgICAgICAoTERCVSAgIGltbVNFeHQxNjokRElTUCwgR1BSQzokUkIpPjsNCitkZWYgOiBQYXQ8KGk2NCAoZXh0bG9hZGkxNiAoYWRkIEdQUkM6JFJCLCBpbW1TRXh0MTY6JERJU1ApKSksDQorICAgICAgICAgIChMRFdVICBpbW1TRXh0MTY6JERJU1AsIEdQUkM6JFJCKT47DQorZGVmIDogUGF0PChpNjQgKGV4dGxvYWRpMzIgKGFkZCBHUFJDOiRSQiwgaW1tU0V4dDE2OiRESVNQKSkpLA0KKyAgICAgICAgICAoTERMICAgaW1tU0V4dDE2OiRESVNQLCBHUFJDOiRSQik+Ow0KKw0KKy8vMCBkaXNwIHBhdHRlcm5zDQorZGVmIDogUGF0PChpNjQgKGxvYWQgR1BSQzokYWRkcikpLA0KKyAgICAgICAgICAoTERRICAwLCBHUFJDOiRhZGRyKT47DQorZGVmIDogUGF0PChmNjQgKGxvYWQgR1BSQzokYWRkcikpLA0KKyAgICAgICAgICAoTERUICAwLCBHUFJDOiRhZGRyKT47DQorZGVmIDogUGF0PChmMzIgKGxvYWQgR1BSQzokYWRkcikpLA0KKyAgICAgICAgICAoTERTICAwLCBHUFJDOiRhZGRyKT47DQorZGVmIDogUGF0PChpNjQgKHNleHRsb2FkaTMyIEdQUkM6JGFkZHIpKSwNCisgICAgICAgICAgKExETCAgMCwgR1BSQzokYWRkcik+Ow0KK2RlZiA6IFBhdDwoaTY0ICh6ZXh0bG9hZGkxNiBHUFJDOiRhZGRyKSksDQorICAgICAgICAgIChMRFdVIDAsIEdQUkM6JGFkZHIpPjsNCitkZWYgOiBQYXQ8KGk2NCAoemV4dGxvYWRpOCBHUFJDOiRhZGRyKSksDQorICAgICAgICAgIChMREJVIDAsIEdQUkM6JGFkZHIpPjsNCitkZWYgOiBQYXQ8KGk2NCAoZXh0bG9hZGk4IEdQUkM6JGFkZHIpKSwNCisgICAgICAgICAgKExEQlUgMCwgR1BSQzokYWRkcik+Ow0KK2RlZiA6IFBhdDwoaTY0IChleHRsb2FkaTE2IEdQUkM6JGFkZHIpKSwNCisgICAgICAgICAgKExEV1UgMCwgR1BSQzokYWRkcik+Ow0KK2RlZiA6IFBhdDwoaTY0IChleHRsb2FkaTMyIEdQUkM6JGFkZHIpKSwNCisgICAgICAgICAgKExETCAgMCwgR1BSQzokYWRkcik+Ow0KKw0KK2RlZiA6IFBhdDwoc3RvcmUgR1BSQzokREFUQSwgR1BSQzokYWRkciksDQorICAgICAgICAgIChTVFEgIEdQUkM6JERBVEEsIDAsIEdQUkM6JGFkZHIpPjsNCitkZWYgOiBQYXQ8KHN0b3JlIEY4UkM6JERBVEEsIEdQUkM6JGFkZHIpLA0KKyAgICAgICAgICAoU1RUICBGOFJDOiREQVRBLCAwLCBHUFJDOiRhZGRyKT47DQorZGVmIDogUGF0PChzdG9yZSBGNFJDOiREQVRBLCBHUFJDOiRhZGRyKSwNCisgICAgICAgICAgKFNUUyAgRjRSQzokREFUQSwgMCwgR1BSQzokYWRkcik+Ow0KK2RlZiA6IFBhdDwodHJ1bmNzdG9yZWkzMiBHUFJDOiREQVRBLCBHUFJDOiRhZGRyKSwNCisgICAgICAgICAgKFNUTCAgR1BSQzokREFUQSwgMCwgR1BSQzokYWRkcik+Ow0KK2RlZiA6IFBhdDwodHJ1bmNzdG9yZWkxNiBHUFJDOiREQVRBLCBHUFJDOiRhZGRyKSwNCisgICAgICAgICAgKFNUVyBHUFJDOiREQVRBLCAwLCBHUFJDOiRhZGRyKT47DQorZGVmIDogUGF0PCh0cnVuY3N0b3JlaTggR1BSQzokREFUQSwgR1BSQzokYWRkciksDQorICAgICAgICAgIChTVEIgR1BSQzokREFUQSwgMCwgR1BSQzokYWRkcik+Ow0KKw0KKw0KKy8vbG9hZCBhZGRyZXNzLCByZWxsb2NhdGVkIGdwZGlzdCBmb3JtDQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgR1BSQzokUkEpLA0KKyAgICBJbk9wZXJhbmRMaXN0ID0gKGlucyBzMTZpbW06JERJU1AsIEdQUkM6JFJCLCBzMTZpbW06JE5VTSksDQorICAgIG1heUxvYWQgPSAxIGluIHsNCitkZWYgTERBZyAgOiBNRm9ybTwweDA4LCAxLCAibGRhICRSQSwwKCRSQilcdFx0IWdwZGlzcCEkTlVNIiwgW10sIHNfbGRhPjsgIC8vTG9hZCBhZGRyZXNzDQorZGVmIExEQUhnIDogTUZvcm08MHgwOSwgMSwgImxkYWggJFJBLDAoJFJCKVx0XHQhZ3BkaXNwISROVU0iLCBbXSwgc19sZGE+OyAgLy9Mb2FkIGFkZHJlc3MNCit9DQorDQorLy9Mb2FkIHF1YWQsIHJlbGxvY2F0ZWQgbGl0ZXJhbCBmb3JtDQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgR1BSQzokUkEpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBzNjRpbW06JERJU1AsIEdQUkM6JFJCKSBpbiANCitkZWYgTERRbCA6IE1Gb3JtPDB4MjksIDEsICJsZHEgJFJBLCRESVNQKCRSQilcdFx0IWxpdGVyYWwiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokUkEsIChBbHBoYV9yZWxsaXQgdGdsb2JhbGFkZHI6JERJU1AsIEdQUkM6JFJCKSldLCBzX2lsZD47DQorZGVmIDogUGF0PChBbHBoYV9yZWxsaXQgdGV4dGVybmFsc3ltOiRleHQsIEdQUkM6JFJCKSwNCisgICAgICAgICAgKExEUWwgdGV4dGVybmFsc3ltOiRleHQsIEdQUkM6JFJCKT47DQorDQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgR1BSQzokUlIpLA0KKyAgICBJbk9wZXJhbmRMaXN0ID0gKGlucyBHUFJDOiRSQSwgczY0aW1tOiRESVNQLCBHUFJDOiRSQiksDQorICAgIENvbnN0cmFpbnRzID0gIiRSQSA9ICRSUiIsDQorICAgIERpc2FibGVFbmNvZGluZyA9ICIkUlIiIGluIHsNCitkZWYgU1RRX0MgOiBNRm9ybTwweDJGLCAwLCAic3RxX2wgJFJBLCRESVNQKCRSQikiLCBbXSwgc19pc3Q+Ow0KK2RlZiBTVExfQyA6IE1Gb3JtPDB4MkUsIDAsICJzdGxfbCAkUkEsJERJU1AoJFJCKSIsIFtdLCBzX2lzdD47DQorfQ0KK2xldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIEdQUkM6JFJBKSwNCisgICAgSW5PcGVyYW5kTGlzdCA9IChpbnMgczY0aW1tOiRESVNQLCBHUFJDOiRSQiksDQorICAgIG1heUxvYWQgPSAxIGluIHsNCitkZWYgTERRX0wgOiBNRm9ybTwweDJCLCAxLCAibGRxX2wgJFJBLCRESVNQKCRSQikiLCBbXSwgc19pbGQ+Ow0KK2RlZiBMRExfTCA6IE1Gb3JtPDB4MkEsIDEsICJsZGxfbCAkUkEsJERJU1AoJFJCKSIsIFtdLCBzX2lsZD47DQorfQ0KKw0KK2RlZiBSUENDIDogTWZjRm9ybTwweDE4LCAweEMwMDAsICJycGNjICRSQSIsIHNfcnBjYz47IC8vUmVhZCBwcm9jZXNzIGN5Y2xlIGNvdW50ZXINCitkZWYgTUIgIDogTWZjUEZvcm08MHgxOCwgMHg0MDAwLCAibWIiLCAgc19pbWlzYz47IC8vbWVtb3J5IGJhcnJpZXINCitkZWYgV01CIDogTWZjUEZvcm08MHgxOCwgMHg0NDAwLCAid21iIiwgc19pbWlzYz47IC8vd3JpdGUgbWVtb3J5IGJhcnJpZXINCisNCitkZWYgOiBQYXQ8KG1lbWJhcnJpZXIgKGk2NCBpbW0pLCAoaTY0IGltbSksIChpNjQgaW1tKSwgKGk2NCAxKSwgKGk2NCBpbW0pKSwNCisgICAgICAgICAgKFdNQik+Ow0KK2RlZiA6IFBhdDwobWVtYmFycmllciAoaTY0IGltbSksIChpNjQgaW1tKSwgKGk2NCBpbW0pLCAoaTY0IGltbSksIChpNjQgaW1tKSksDQorICAgICAgICAgIChNQik+Ow0KKw0KKy8vQmFzaWMgRmxvYXRpbmcgcG9pbnQgb3BzDQorDQorLy9GbG9hdHMNCisNCitsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBGNFJDOiRSQyksIEluT3BlcmFuZExpc3QgPSAoaW5zIEY0UkM6JFJCKSwgRmEgPSAzMSBpbiANCitkZWYgU1FSVFMgOiBGUEZvcm08MHgxNCwgMHg1OEIsICJzcXJ0cy9zdSAkUkIsJFJDIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokUkMsIChmc3FydCBGNFJDOiRSQikpXSwgc19mc3FydHM+Ow0KKw0KK2xldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIEY0UkM6JFJDKSwgSW5PcGVyYW5kTGlzdCA9IChpbnMgRjRSQzokUkEsIEY0UkM6JFJCKSBpbiB7DQorZGVmIEFERFMgIDogRlBGb3JtPDB4MTYsIDB4NTgwLCAiYWRkcy9zdSAkUkEsJFJCLCRSQyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JFJDLCAoZmFkZCBGNFJDOiRSQSwgRjRSQzokUkIpKV0sIHNfZmFkZD47DQorZGVmIFNVQlMgIDogRlBGb3JtPDB4MTYsIDB4NTgxLCAic3Vicy9zdSAkUkEsJFJCLCRSQyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JFJDLCAoZnN1YiBGNFJDOiRSQSwgRjRSQzokUkIpKV0sIHNfZmFkZD47DQorZGVmIERJVlMgIDogRlBGb3JtPDB4MTYsIDB4NTgzLCAiZGl2cy9zdSAkUkEsJFJCLCRSQyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JFJDLCAoZmRpdiBGNFJDOiRSQSwgRjRSQzokUkIpKV0sIHNfZmRpdnM+Ow0KK2RlZiBNVUxTICA6IEZQRm9ybTwweDE2LCAweDU4MiwgIm11bHMvc3UgJFJBLCRSQiwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBGNFJDOiRSQywgKGZtdWwgRjRSQzokUkEsIEY0UkM6JFJCKSldLCBzX2ZtdWw+Ow0KKw0KK2RlZiBDUFlTUyAgOiBGUEZvcm08MHgxNywgMHgwMjAsICJjcHlzICRSQSwkUkIsJFJDIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokUkMsIChmY29weXNpZ24gRjRSQzokUkIsIEY0UkM6JFJBKSldLCBzX2ZhZGQ+Ow0KK2RlZiBDUFlTRVMgOiBGUEZvcm08MHgxNywgMHgwMjIsICJjcHlzZSAkUkEsJFJCLCRSQyIsW10sIHNfZmFkZD47IC8vQ29weSBzaWduIGFuZCBleHBvbmVudA0KK2RlZiBDUFlTTlMgOiBGUEZvcm08MHgxNywgMHgwMjEsICJjcHlzbiAkUkEsJFJCLCRSQyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JFJDLCAoZm5lZyAoZmNvcHlzaWduIEY0UkM6JFJCLCBGNFJDOiRSQSkpKV0sIHNfZmFkZD47DQorfQ0KKw0KKy8vRG91Ymxlcw0KKw0KK2xldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIEY4UkM6JFJDKSwgSW5PcGVyYW5kTGlzdCA9IChpbnMgRjhSQzokUkIpLCBGYSA9IDMxIGluIA0KK2RlZiBTUVJUVCA6IEZQRm9ybTwweDE0LCAweDVBQiwgInNxcnR0L3N1ICRSQiwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBGOFJDOiRSQywgKGZzcXJ0IEY4UkM6JFJCKSldLCBzX2ZzcXJ0dD47DQorDQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgRjhSQzokUkMpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBGOFJDOiRSQSwgRjhSQzokUkIpIGluIHsNCitkZWYgQUREVCAgOiBGUEZvcm08MHgxNiwgMHg1QTAsICJhZGR0L3N1ICRSQSwkUkIsJFJDIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokUkMsIChmYWRkIEY4UkM6JFJBLCBGOFJDOiRSQikpXSwgc19mYWRkPjsNCitkZWYgU1VCVCAgOiBGUEZvcm08MHgxNiwgMHg1QTEsICJzdWJ0L3N1ICRSQSwkUkIsJFJDIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokUkMsIChmc3ViIEY4UkM6JFJBLCBGOFJDOiRSQikpXSwgc19mYWRkPjsNCitkZWYgRElWVCAgOiBGUEZvcm08MHgxNiwgMHg1QTMsICJkaXZ0L3N1ICRSQSwkUkIsJFJDIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokUkMsIChmZGl2IEY4UkM6JFJBLCBGOFJDOiRSQikpXSwgc19mZGl2dD47DQorZGVmIE1VTFQgIDogRlBGb3JtPDB4MTYsIDB4NUEyLCAibXVsdC9zdSAkUkEsJFJCLCRSQyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JFJDLCAoZm11bCBGOFJDOiRSQSwgRjhSQzokUkIpKV0sIHNfZm11bD47DQorDQorZGVmIENQWVNUICA6IEZQRm9ybTwweDE3LCAweDAyMCwgImNweXMgJFJBLCRSQiwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBGOFJDOiRSQywgKGZjb3B5c2lnbiBGOFJDOiRSQiwgRjhSQzokUkEpKV0sIHNfZmFkZD47DQorZGVmIENQWVNFVCA6IEZQRm9ybTwweDE3LCAweDAyMiwgImNweXNlICRSQSwkUkIsJFJDIixbXSwgc19mYWRkPjsgLy9Db3B5IHNpZ24gYW5kIGV4cG9uZW50DQorZGVmIENQWVNOVCA6IEZQRm9ybTwweDE3LCAweDAyMSwgImNweXNuICRSQSwkUkIsJFJDIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokUkMsIChmbmVnIChmY29weXNpZ24gRjhSQzokUkIsIEY4UkM6JFJBKSkpXSwgc19mYWRkPjsNCisNCitkZWYgQ01QVEVRIDogRlBGb3JtPDB4MTYsIDB4NUE1LCAiY21wdGVxL3N1ICRSQSwkUkIsJFJDIiwgW10sIHNfZmFkZD47DQorLy8gICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JFJDLCAoc2V0ZXEgRjhSQzokUkEsIEY4UkM6JFJCKSldPjsNCitkZWYgQ01QVExFIDogRlBGb3JtPDB4MTYsIDB4NUE3LCAiY21wdGxlL3N1ICRSQSwkUkIsJFJDIiwgW10sIHNfZmFkZD47DQorLy8gICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JFJDLCAoc2V0bGUgRjhSQzokUkEsIEY4UkM6JFJCKSldPjsNCitkZWYgQ01QVExUIDogRlBGb3JtPDB4MTYsIDB4NUE2LCAiY21wdGx0L3N1ICRSQSwkUkIsJFJDIiwgW10sIHNfZmFkZD47DQorLy8gICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JFJDLCAoc2V0bHQgRjhSQzokUkEsIEY4UkM6JFJCKSldPjsNCitkZWYgQ01QVFVOIDogRlBGb3JtPDB4MTYsIDB4NUE0LCAiY21wdHVuL3N1ICRSQSwkUkIsJFJDIiwgW10sIHNfZmFkZD47DQorLy8gICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JFJDLCAoc2V0dW8gRjhSQzokUkEsIEY4UkM6JFJCKSldPjsNCit9DQorDQorLy9Nb3JlIENQWVMgZm9ybXM6DQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgRjhSQzokUkMpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBGNFJDOiRSQSwgRjhSQzokUkIpIGluIHsNCitkZWYgQ1BZU1RzICA6IEZQRm9ybTwweDE3LCAweDAyMCwgImNweXMgJFJBLCRSQiwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBGOFJDOiRSQywgKGZjb3B5c2lnbiBGOFJDOiRSQiwgRjRSQzokUkEpKV0sIHNfZmFkZD47DQorZGVmIENQWVNOVHMgOiBGUEZvcm08MHgxNywgMHgwMjEsICJjcHlzbiAkUkEsJFJCLCRSQyIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JFJDLCAoZm5lZyAoZmNvcHlzaWduIEY4UkM6JFJCLCBGNFJDOiRSQSkpKV0sIHNfZmFkZD47DQorfQ0KK2xldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIEY0UkM6JFJDKSwgSW5PcGVyYW5kTGlzdCA9IChpbnMgRjhSQzokUkEsIEY0UkM6JFJCKSBpbiB7DQorZGVmIENQWVNTdCAgOiBGUEZvcm08MHgxNywgMHgwMjAsICJjcHlzICRSQSwkUkIsJFJDIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokUkMsIChmY29weXNpZ24gRjRSQzokUkIsIEY4UkM6JFJBKSldLCBzX2ZhZGQ+Ow0KK2RlZiBDUFlTRVN0IDogRlBGb3JtPDB4MTcsIDB4MDIyLCAiY3B5c2UgJFJBLCRSQiwkUkMiLFtdLCBzX2ZhZGQ+OyAvL0NvcHkgc2lnbiBhbmQgZXhwb25lbnQNCitkZWYgQ1BZU05TdCA6IEZQRm9ybTwweDE3LCAweDAyMSwgImNweXNuICRSQSwkUkIsJFJDIiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokUkMsIChmbmVnIChmY29weXNpZ24gRjRSQzokUkIsIEY4UkM6JFJBKSkpXSwgc19mYWRkPjsNCit9DQorDQorLy9jb25kaXRpb25hbCBtb3ZlcywgZmxvYXRzDQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgRjRSQzokUkRFU1QpLA0KKyAgICBJbk9wZXJhbmRMaXN0ID0gKGlucyBGNFJDOiRSRkFMU0UsIEY0UkM6JFJUUlVFLCBGOFJDOiRSQ09ORCksDQorICAgIENvbnN0cmFpbnRzID0gIiRSVFJVRSA9ICRSREVTVCIgaW4gew0KK2RlZiBGQ01PVkVRUyA6IEZQRm9ybTwweDE3LCAweDAyQSwgDQorICAgICAgICAgICAgICAgICAgICAgICJmY21vdmVxICRSQ09ORCwkUlRSVUUsJFJERVNUIiwNCisgICAgICAgICAgICAgICAgICAgICAgW10sIHNfZmNtb3Y+OyAvL0ZDTU9WRSBpZiA9IHplcm8NCitkZWYgRkNNT1ZHRVMgOiBGUEZvcm08MHgxNywgMHgwMkQsIA0KKyAgICAgICAgICAgICAgICAgICAgICAiZmNtb3ZnZSAkUkNPTkQsJFJUUlVFLCRSREVTVCIsDQorICAgICAgICAgICAgICAgICAgICAgIFtdLCBzX2ZjbW92PjsgLy9GQ01PVkUgaWYgPj0gemVybw0KK2RlZiBGQ01PVkdUUyA6IEZQRm9ybTwweDE3LCAweDAyRiwgDQorICAgICAgICAgICAgICAgICAgICAgICJmY21vdmd0ICRSQ09ORCwkUlRSVUUsJFJERVNUIiwNCisgICAgICAgICAgICAgICAgICAgICAgW10sIHNfZmNtb3Y+OyAvL0ZDTU9WRSBpZiA+IHplcm8NCitkZWYgRkNNT1ZMRVMgOiBGUEZvcm08MHgxNywgMHgwMkUsIA0KKyAgICAgICAgICAgICAgICAgICAgICAiZmNtb3ZsZSAkUkNPTkQsJFJUUlVFLCRSREVTVCIsDQorICAgICAgICAgICAgICAgICAgICAgIFtdLCBzX2ZjbW92PjsgLy9GQ01PVkUgaWYgPD0gemVybw0KK2RlZiBGQ01PVkxUUyA6IEZQRm9ybTwweDE3LCAweDAyQywNCisgICAgICAgICAgICAgICAgICAgICAgImZjbW92bHQgJFJDT05ELCRSVFJVRSwkUkRFU1QiLA0KKyAgICAgICAgICAgICAgICAgICAgICBbXSwgc19mY21vdj47IC8vIEZDTU9WRSBpZiA8IHplcm8NCitkZWYgRkNNT1ZORVMgOiBGUEZvcm08MHgxNywgMHgwMkIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAiZmNtb3ZuZSAkUkNPTkQsJFJUUlVFLCRSREVTVCIsDQorICAgICAgICAgICAgICAgICAgICAgIFtdLCBzX2ZjbW92PjsgLy9GQ01PVkUgaWYgIT0gemVybw0KK30NCisvL2NvbmRpdGlvbmFsIG1vdmVzLCBkb3VibGVzDQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgRjhSQzokUkRFU1QpLCANCisgICAgSW5PcGVyYW5kTGlzdCA9IChpbnMgRjhSQzokUkZBTFNFLCBGOFJDOiRSVFJVRSwgRjhSQzokUkNPTkQpLA0KKyAgICBDb25zdHJhaW50cyA9ICIkUlRSVUUgPSAkUkRFU1QiIGluIHsNCitkZWYgRkNNT1ZFUVQgOiBGUEZvcm08MHgxNywgMHgwMkEsICJmY21vdmVxICRSQ09ORCwkUlRSVUUsJFJERVNUIiwgW10sIHNfZmNtb3Y+Ow0KK2RlZiBGQ01PVkdFVCA6IEZQRm9ybTwweDE3LCAweDAyRCwgImZjbW92Z2UgJFJDT05ELCRSVFJVRSwkUkRFU1QiLCBbXSwgc19mY21vdj47DQorZGVmIEZDTU9WR1RUIDogRlBGb3JtPDB4MTcsIDB4MDJGLCAiZmNtb3ZndCAkUkNPTkQsJFJUUlVFLCRSREVTVCIsIFtdLCBzX2ZjbW92PjsNCitkZWYgRkNNT1ZMRVQgOiBGUEZvcm08MHgxNywgMHgwMkUsICJmY21vdmxlICRSQ09ORCwkUlRSVUUsJFJERVNUIiwgW10sIHNfZmNtb3Y+Ow0KK2RlZiBGQ01PVkxUVCA6IEZQRm9ybTwweDE3LCAweDAyQywgImZjbW92bHQgJFJDT05ELCRSVFJVRSwkUkRFU1QiLCBbXSwgc19mY21vdj47DQorZGVmIEZDTU9WTkVUIDogRlBGb3JtPDB4MTcsIDB4MDJCLCAiZmNtb3ZuZSAkUkNPTkQsJFJUUlVFLCRSREVTVCIsIFtdLCBzX2ZjbW92PjsNCit9DQorDQorLy9taXNjIEZQIHNlbGVjdHMNCisvL1NlbGVjdCBkb3VibGUNCisNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0ZXEgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjhSQzokc3QsIEY4UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVQgRjhSQzokc2YsIEY4UkM6JHN0LCAoQ01QVEVRIEY4UkM6JFJBLCBGOFJDOiRSQikpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0b2VxIEY4UkM6JFJBLCBGOFJDOiRSQiksIEY4UkM6JHN0LCBGOFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVUIEY4UkM6JHNmLCBGOFJDOiRzdCwgKENNUFRFUSBGOFJDOiRSQSwgRjhSQzokUkIpKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldHVlcSBGOFJDOiRSQSwgRjhSQzokUkIpLCBGOFJDOiRzdCwgRjhSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FVCBGOFJDOiRzZiwgRjhSQzokc3QsIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSk+Ow0KKw0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRuZSBGOFJDOiRSQSwgRjhSQzokUkIpLCBGOFJDOiRzdCwgRjhSQzokc2YpLA0KKyAgICAgIChGQ01PVkVRVCBGOFJDOiRzZiwgRjhSQzokc3QsIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRvbmUgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjhSQzokc3QsIEY4UkM6JHNmKSwNCisgICAgICAoRkNNT1ZFUVQgRjhSQzokc2YsIEY4UkM6JHN0LCAoQ01QVEVRIEY4UkM6JFJBLCBGOFJDOiRSQikpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0dW5lIEY4UkM6JFJBLCBGOFJDOiRSQiksIEY4UkM6JHN0LCBGOFJDOiRzZiksDQorICAgICAgKEZDTU9WRVFUIEY4UkM6JHNmLCBGOFJDOiRzdCwgKENNUFRFUSBGOFJDOiRSQSwgRjhSQzokUkIpKT47DQorDQorZGVmIDogUGF0PChzZWxlY3QgKHNldGd0IEY4UkM6JFJBLCBGOFJDOiRSQiksIEY4UkM6JHN0LCBGOFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVUIEY4UkM6JHNmLCBGOFJDOiRzdCwgKENNUFRMVCBGOFJDOiRSQiwgRjhSQzokUkEpKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldG9ndCBGOFJDOiRSQSwgRjhSQzokUkIpLCBGOFJDOiRzdCwgRjhSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FVCBGOFJDOiRzZiwgRjhSQzokc3QsIChDTVBUTFQgRjhSQzokUkIsIEY4UkM6JFJBKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXR1Z3QgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjhSQzokc3QsIEY4UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVQgRjhSQzokc2YsIEY4UkM6JHN0LCAoQ01QVExUIEY4UkM6JFJCLCBGOFJDOiRSQSkpPjsNCisNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0Z2UgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjhSQzokc3QsIEY4UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVQgRjhSQzokc2YsIEY4UkM6JHN0LCAoQ01QVExFIEY4UkM6JFJCLCBGOFJDOiRSQSkpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0b2dlIEY4UkM6JFJBLCBGOFJDOiRSQiksIEY4UkM6JHN0LCBGOFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVUIEY4UkM6JHNmLCBGOFJDOiRzdCwgKENNUFRMRSBGOFJDOiRSQiwgRjhSQzokUkEpKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldHVnZSBGOFJDOiRSQSwgRjhSQzokUkIpLCBGOFJDOiRzdCwgRjhSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FVCBGOFJDOiRzZiwgRjhSQzokc3QsIChDTVBUTEUgRjhSQzokUkIsIEY4UkM6JFJBKSk+Ow0KKw0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRsdCBGOFJDOiRSQSwgRjhSQzokUkIpLCBGOFJDOiRzdCwgRjhSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FVCBGOFJDOiRzZiwgRjhSQzokc3QsIChDTVBUTFQgRjhSQzokUkEsIEY4UkM6JFJCKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRvbHQgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjhSQzokc3QsIEY4UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVQgRjhSQzokc2YsIEY4UkM6JHN0LCAoQ01QVExUIEY4UkM6JFJBLCBGOFJDOiRSQikpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0dWx0IEY4UkM6JFJBLCBGOFJDOiRSQiksIEY4UkM6JHN0LCBGOFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVUIEY4UkM6JHNmLCBGOFJDOiRzdCwgKENNUFRMVCBGOFJDOiRSQSwgRjhSQzokUkIpKT47DQorDQorZGVmIDogUGF0PChzZWxlY3QgKHNldGxlIEY4UkM6JFJBLCBGOFJDOiRSQiksIEY4UkM6JHN0LCBGOFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVUIEY4UkM6JHNmLCBGOFJDOiRzdCwgKENNUFRMRSBGOFJDOiRSQSwgRjhSQzokUkIpKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldG9sZSBGOFJDOiRSQSwgRjhSQzokUkIpLCBGOFJDOiRzdCwgRjhSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FVCBGOFJDOiRzZiwgRjhSQzokc3QsIChDTVBUTEUgRjhSQzokUkEsIEY4UkM6JFJCKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXR1bGUgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjhSQzokc3QsIEY4UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVQgRjhSQzokc2YsIEY4UkM6JHN0LCAoQ01QVExFIEY4UkM6JFJBLCBGOFJDOiRSQikpPjsNCisNCisvL1NlbGVjdCBzaW5nbGUNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0ZXEgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjRSQzokc3QsIEY0UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVMgRjRSQzokc2YsIEY0UkM6JHN0LCAoQ01QVEVRIEY4UkM6JFJBLCBGOFJDOiRSQikpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0b2VxIEY4UkM6JFJBLCBGOFJDOiRSQiksIEY0UkM6JHN0LCBGNFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVTIEY0UkM6JHNmLCBGNFJDOiRzdCwgKENNUFRFUSBGOFJDOiRSQSwgRjhSQzokUkIpKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldHVlcSBGOFJDOiRSQSwgRjhSQzokUkIpLCBGNFJDOiRzdCwgRjRSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FUyBGNFJDOiRzZiwgRjRSQzokc3QsIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSk+Ow0KKw0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRuZSBGOFJDOiRSQSwgRjhSQzokUkIpLCBGNFJDOiRzdCwgRjRSQzokc2YpLA0KKyAgICAgIChGQ01PVkVRUyBGNFJDOiRzZiwgRjRSQzokc3QsIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRvbmUgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjRSQzokc3QsIEY0UkM6JHNmKSwNCisgICAgICAoRkNNT1ZFUVMgRjRSQzokc2YsIEY0UkM6JHN0LCAoQ01QVEVRIEY4UkM6JFJBLCBGOFJDOiRSQikpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0dW5lIEY4UkM6JFJBLCBGOFJDOiRSQiksIEY0UkM6JHN0LCBGNFJDOiRzZiksDQorICAgICAgKEZDTU9WRVFTIEY0UkM6JHNmLCBGNFJDOiRzdCwgKENNUFRFUSBGOFJDOiRSQSwgRjhSQzokUkIpKT47DQorDQorZGVmIDogUGF0PChzZWxlY3QgKHNldGd0IEY4UkM6JFJBLCBGOFJDOiRSQiksIEY0UkM6JHN0LCBGNFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVTIEY0UkM6JHNmLCBGNFJDOiRzdCwgKENNUFRMVCBGOFJDOiRSQiwgRjhSQzokUkEpKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldG9ndCBGOFJDOiRSQSwgRjhSQzokUkIpLCBGNFJDOiRzdCwgRjRSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FUyBGNFJDOiRzZiwgRjRSQzokc3QsIChDTVBUTFQgRjhSQzokUkIsIEY4UkM6JFJBKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXR1Z3QgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjRSQzokc3QsIEY0UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVMgRjRSQzokc2YsIEY0UkM6JHN0LCAoQ01QVExUIEY4UkM6JFJCLCBGOFJDOiRSQSkpPjsNCisNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0Z2UgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjRSQzokc3QsIEY0UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVMgRjRSQzokc2YsIEY0UkM6JHN0LCAoQ01QVExFIEY4UkM6JFJCLCBGOFJDOiRSQSkpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0b2dlIEY4UkM6JFJBLCBGOFJDOiRSQiksIEY0UkM6JHN0LCBGNFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVTIEY0UkM6JHNmLCBGNFJDOiRzdCwgKENNUFRMRSBGOFJDOiRSQiwgRjhSQzokUkEpKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldHVnZSBGOFJDOiRSQSwgRjhSQzokUkIpLCBGNFJDOiRzdCwgRjRSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FUyBGNFJDOiRzZiwgRjRSQzokc3QsIChDTVBUTEUgRjhSQzokUkIsIEY4UkM6JFJBKSk+Ow0KKw0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRsdCBGOFJDOiRSQSwgRjhSQzokUkIpLCBGNFJDOiRzdCwgRjRSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FUyBGNFJDOiRzZiwgRjRSQzokc3QsIChDTVBUTFQgRjhSQzokUkEsIEY4UkM6JFJCKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRvbHQgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjRSQzokc3QsIEY0UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVMgRjRSQzokc2YsIEY0UkM6JHN0LCAoQ01QVExUIEY4UkM6JFJBLCBGOFJDOiRSQikpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0dWx0IEY4UkM6JFJBLCBGOFJDOiRSQiksIEY0UkM6JHN0LCBGNFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVTIEY0UkM6JHNmLCBGNFJDOiRzdCwgKENNUFRMVCBGOFJDOiRSQSwgRjhSQzokUkIpKT47DQorDQorZGVmIDogUGF0PChzZWxlY3QgKHNldGxlIEY4UkM6JFJBLCBGOFJDOiRSQiksIEY0UkM6JHN0LCBGNFJDOiRzZiksDQorICAgICAgKEZDTU9WTkVTIEY0UkM6JHNmLCBGNFJDOiRzdCwgKENNUFRMRSBGOFJDOiRSQSwgRjhSQzokUkIpKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldG9sZSBGOFJDOiRSQSwgRjhSQzokUkIpLCBGNFJDOiRzdCwgRjRSQzokc2YpLA0KKyAgICAgIChGQ01PVk5FUyBGNFJDOiRzZiwgRjRSQzokc3QsIChDTVBUTEUgRjhSQzokUkEsIEY4UkM6JFJCKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXR1bGUgRjhSQzokUkEsIEY4UkM6JFJCKSwgRjRSQzokc3QsIEY0UkM6JHNmKSwNCisgICAgICAoRkNNT1ZORVMgRjRSQzokc2YsIEY0UkM6JHN0LCAoQ01QVExFIEY4UkM6JFJBLCBGOFJDOiRSQikpPjsNCisNCisNCisNCitsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBHUFJDOiRSQyksIEluT3BlcmFuZExpc3QgPSAoaW5zIEY0UkM6JFJBKSwgRmIgPSAzMSBpbiANCitkZWYgRlRPSVMgOiBGUEZvcm08MHgxQywgMHgwNzgsICJmdG9pcyAkUkEsJFJDIiwNCisgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoYml0Y29udmVydCBGNFJDOiRSQSkpXSwgc19mdG9pPjsgLy9GbG9hdGluZyB0byBpbnRlZ2VyIG1vdmUsIFNfZmxvYXRpbmcNCitsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBHUFJDOiRSQyksIEluT3BlcmFuZExpc3QgPSAoaW5zIEY4UkM6JFJBKSwgRmIgPSAzMSBpbiANCitkZWYgRlRPSVQgOiBGUEZvcm08MHgxQywgMHgwNzAsICJmdG9pdCAkUkEsJFJDIiwNCisgICAgICAgIFsoc2V0IEdQUkM6JFJDLCAoYml0Y29udmVydCBGOFJDOiRSQSkpXSwgc19mdG9pPjsgLy9GbG9hdGluZyB0byBpbnRlZ2VyIG1vdmUNCitsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBGNFJDOiRSQyksIEluT3BlcmFuZExpc3QgPSAoaW5zIEdQUkM6JFJBKSwgRmIgPSAzMSBpbiANCitkZWYgSVRPRlMgOiBGUEZvcm08MHgxNCwgMHgwMDQsICJpdG9mcyAkUkEsJFJDIiwNCisgICAgCVsoc2V0IEY0UkM6JFJDLCAoYml0Y29udmVydCBHUFJDOiRSQSkpXSwgc19pdG9mPjsgLy9JbnRlZ2VyIHRvIGZsb2F0aW5nIG1vdmUsIFNfZmxvYXRpbmcNCitsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBGOFJDOiRSQyksIEluT3BlcmFuZExpc3QgPSAoaW5zIEdQUkM6JFJBKSwgRmIgPSAzMSBpbiANCitkZWYgSVRPRlQgOiBGUEZvcm08MHgxNCwgMHgwMjQsICJpdG9mdCAkUkEsJFJDIiwNCisgICAgICAgIFsoc2V0IEY4UkM6JFJDLCAoYml0Y29udmVydCBHUFJDOiRSQSkpXSwgc19pdG9mPjsgLy9JbnRlZ2VyIHRvIGZsb2F0aW5nIG1vdmUNCisNCisNCitsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBGNFJDOiRSQyksIEluT3BlcmFuZExpc3QgPSAoaW5zIEY4UkM6JFJCKSwgRmEgPSAzMSBpbiANCitkZWYgQ1ZUUVMgOiBGUEZvcm08MHgxNiwgMHg3QkMsICJjdnRxcy9zdWkgJFJCLCRSQyIsDQorICAgICAgICBbKHNldCBGNFJDOiRSQywgKEFscGhhX2N2dHFzIEY4UkM6JFJCKSldLCBzX2ZhZGQ+Ow0KK2xldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIEY4UkM6JFJDKSwgSW5PcGVyYW5kTGlzdCA9IChpbnMgRjhSQzokUkIpLCBGYSA9IDMxIGluIA0KK2RlZiBDVlRRVCA6IEZQRm9ybTwweDE2LCAweDdCRSwgImN2dHF0L3N1aSAkUkIsJFJDIiwNCisgICAgICAgIFsoc2V0IEY4UkM6JFJDLCAoQWxwaGFfY3Z0cXQgRjhSQzokUkIpKV0sIHNfZmFkZD47DQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgRjhSQzokUkMpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBGOFJDOiRSQiksIEZhID0gMzEgaW4gDQorZGVmIENWVFRRIDogRlBGb3JtPDB4MTYsIDB4NTJGLCAiY3Z0dHEvc3ZjICRSQiwkUkMiLA0KKyAgICAgICAgWyhzZXQgRjhSQzokUkMsIChBbHBoYV9jdnR0cSBGOFJDOiRSQikpXSwgc19mYWRkPjsNCitsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBGOFJDOiRSQyksIEluT3BlcmFuZExpc3QgPSAoaW5zIEY0UkM6JFJCKSwgRmEgPSAzMSBpbiANCitkZWYgQ1ZUU1QgOiBGUEZvcm08MHgxNiwgMHg2QUMsICJjdnRzdC9zICRSQiwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBGOFJDOiRSQywgKGZleHRlbmQgRjRSQzokUkIpKV0sIHNfZmFkZD47DQorbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgRjRSQzokUkMpLCBJbk9wZXJhbmRMaXN0ID0gKGlucyBGOFJDOiRSQiksIEZhID0gMzEgaW4gDQorZGVmIENWVFRTIDogRlBGb3JtPDB4MTYsIDB4N0FDLCAiY3Z0dHMvc3VpICRSQiwkUkMiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBGNFJDOiRSQywgKGZyb3VuZCBGOFJDOiRSQikpXSwgc19mYWRkPjsNCisNCitkZWYgOiAgUGF0PChzZWxlY3QgR1BSQzokUkMsIEY4UkM6JHN0LCBGOFJDOiRzZiksDQorICAgICAgIChmNjQgKEZDTU9WRVFUICBGOFJDOiRzdCwgRjhSQzokc2YsIChJVE9GVCBHUFJDOiRSQykpKT47IA0KK2RlZiA6ICBQYXQ8KHNlbGVjdCBHUFJDOiRSQywgRjRSQzokc3QsIEY0UkM6JHNmKSwNCisgICAgICAgKGYzMiAoRkNNT1ZFUVMgIEY0UkM6JHN0LCBGNFJDOiRzZiwgKElUT0ZUIEdQUkM6JFJDKSkpPjsgDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy9CcmFuY2hpbmcNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCitjbGFzcyBicl9pY2M8Yml0czw2PiBvcGMsIHN0cmluZyBhc21zdHI+DQorICA6IEJGb3JtTjxvcGMsIChpbnMgdTY0aW1tOiRvcGMsIEdQUkM6JFIsIHRhcmdldDokZHN0KSwgDQorICAgICFzdHJjb25jYXQoYXNtc3RyLCAiICRSLCRkc3QiKSwgIHNfaWNicj47DQorY2xhc3MgYnJfZmNjPGJpdHM8Nj4gb3BjLCBzdHJpbmcgYXNtc3RyPg0KKyAgOiBCRm9ybU48b3BjLCAoaW5zIHU2NGltbTokb3BjLCBGOFJDOiRSLCB0YXJnZXQ6JGRzdCksIA0KKyAgICAhc3RyY29uY2F0KGFzbXN0ciwgIiAkUiwkZHN0IiksICBzX2Zicj47DQorDQorbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaGFzQ3RybERlcCA9IDEgaW4gew0KK2xldCBSYSA9IDMxLCBpc0JhcnJpZXIgPSAxIGluDQorZGVmIEJSIDogQkZvcm1EPDB4MzAsICJiciAkJDMxLCRESVNQIiwgWyhiciBiYjokRElTUCldLCBzX3Vicj47DQorDQorZGVmIENPTkRfQlJBTkNIX0kgOiBCRm9ybU48MCwgKGlucyB1NjRpbW06JG9wYywgR1BSQzokUiwgdGFyZ2V0OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgICJ7OmNvbW1lbnR9IENPTkRfQlJBTkNIIGltbTokb3BjLCBHUFJDOiRSLCBiYjokZHN0IiwgDQorICAgICAgICAgICAgICAgICAgICBzX2ljYnI+Ow0KK2RlZiBDT05EX0JSQU5DSF9GIDogQkZvcm1OPDAsIChpbnMgdTY0aW1tOiRvcGMsIEY4UkM6JFIsIHRhcmdldDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAiezpjb21tZW50fSBDT05EX0JSQU5DSCBpbW06JG9wYywgRjhSQzokUiwgYmI6JGRzdCIsDQorICAgICAgICAgICAgICAgICAgICBzX2Zicj47DQorLy9CcmFuY2hlcywgaW50DQorZGVmIEJFUSAgOiBicl9pY2M8MHgzOSwgImJlcSI+Ow0KK2RlZiBCR0UgIDogYnJfaWNjPDB4M0UsICJiZ2UiPjsNCitkZWYgQkdUICA6IGJyX2ljYzwweDNGLCAiYmd0Ij47DQorZGVmIEJMQkMgOiBicl9pY2M8MHgzOCwgImJsYmMiPjsNCitkZWYgQkxCUyA6IGJyX2ljYzwweDNDLCAiYmxicyI+Ow0KK2RlZiBCTEUgIDogYnJfaWNjPDB4M0IsICJibGUiPjsNCitkZWYgQkxUICA6IGJyX2ljYzwweDNBLCAiYmx0Ij47DQorZGVmIEJORSAgOiBicl9pY2M8MHgzRCwgImJuZSI+Ow0KKw0KKy8vQnJhbmNoZXMsIGZsb2F0DQorZGVmIEZCRVEgOiBicl9mY2M8MHgzMSwgImZiZXEiPjsNCitkZWYgRkJHRSA6IGJyX2ZjYzwweDM2LCAiZmJnZSI+Ow0KK2RlZiBGQkdUIDogYnJfZmNjPDB4MzcsICJmYmd0Ij47DQorZGVmIEZCTEUgOiBicl9mY2M8MHgzMywgImZibGUiPjsNCitkZWYgRkJMVCA6IGJyX2ZjYzwweDMyLCAiZmJsdCI+Ow0KK2RlZiBGQk5FIDogYnJfZmNjPDB4MzYsICJmYm5lIj47DQorfQ0KKw0KKy8vQW4gdWdseSB0cmljayB0byBnZXQgdGhlIG9wY29kZSBhcyBhbiBpbW0gSSBjYW4gdXNlDQorZGVmIGltbUJSQ29uZCA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIHN3aXRjaCgodWludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkpIHsNCisgICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gYnJhbmNoIHR5cGUiKTsNCisgICAgY2FzZSAwOiAgcmV0dXJuIGdldEk2NEltbShBbHBoYTo6QkVRKTsNCisgICAgY2FzZSAxOiAgcmV0dXJuIGdldEk2NEltbShBbHBoYTo6Qk5FKTsNCisgICAgY2FzZSAyOiAgcmV0dXJuIGdldEk2NEltbShBbHBoYTo6QkdFKTsNCisgICAgY2FzZSAzOiAgcmV0dXJuIGdldEk2NEltbShBbHBoYTo6QkdUKTsNCisgICAgY2FzZSA0OiAgcmV0dXJuIGdldEk2NEltbShBbHBoYTo6QkxFKTsNCisgICAgY2FzZSA1OiAgcmV0dXJuIGdldEk2NEltbShBbHBoYTo6QkxUKTsNCisgICAgY2FzZSA2OiAgcmV0dXJuIGdldEk2NEltbShBbHBoYTo6QkxCUyk7DQorICAgIGNhc2UgNzogIHJldHVybiBnZXRJNjRJbW0oQWxwaGE6OkJMQkMpOw0KKyAgICBjYXNlIDIwOiByZXR1cm4gZ2V0STY0SW1tKEFscGhhOjpGQkVRKTsNCisgICAgY2FzZSAyMTogcmV0dXJuIGdldEk2NEltbShBbHBoYTo6RkJORSk7DQorICAgIGNhc2UgMjI6IHJldHVybiBnZXRJNjRJbW0oQWxwaGE6OkZCR0UpOw0KKyAgICBjYXNlIDIzOiByZXR1cm4gZ2V0STY0SW1tKEFscGhhOjpGQkdUKTsNCisgICAgY2FzZSAyNDogcmV0dXJuIGdldEk2NEltbShBbHBoYTo6RkJMRSk7DQorICAgIGNhc2UgMjU6IHJldHVybiBnZXRJNjRJbW0oQWxwaGE6OkZCTFQpOw0KKyAgfQ0KK31dPjsNCisNCisvL0ludCBjb25kIHBhdHRlcm5zDQorZGVmIDogUGF0PChicmNvbmQgKHNldGVxIEdQUkM6JFJBLCAwKSwgYmI6JERJU1ApLCANCisgICAgICAoQ09ORF9CUkFOQ0hfSSAoaW1tQlJDb25kIDApLCAgR1BSQzokUkEsIGJiOiRESVNQKT47DQorZGVmIDogUGF0PChicmNvbmQgKHNldGdlIEdQUkM6JFJBLCAwKSwgYmI6JERJU1ApLCANCisgICAgICAoQ09ORF9CUkFOQ0hfSSAoaW1tQlJDb25kIDIpLCAgR1BSQzokUkEsIGJiOiRESVNQKT47DQorZGVmIDogUGF0PChicmNvbmQgKHNldGd0IEdQUkM6JFJBLCAwKSwgYmI6JERJU1ApLCANCisgICAgICAoQ09ORF9CUkFOQ0hfSSAoaW1tQlJDb25kIDMpLCAgR1BSQzokUkEsIGJiOiRESVNQKT47DQorZGVmIDogUGF0PChicmNvbmQgKGFuZCBHUFJDOiRSQSwgMSksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0kgKGltbUJSQ29uZCA2KSwgIEdQUkM6JFJBLCBiYjokRElTUCk+Ow0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXRsZSBHUFJDOiRSQSwgMCksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0kgKGltbUJSQ29uZCA0KSwgIEdQUkM6JFJBLCBiYjokRElTUCk+Ow0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXRsdCBHUFJDOiRSQSwgMCksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0kgKGltbUJSQ29uZCA1KSwgIEdQUkM6JFJBLCBiYjokRElTUCk+Ow0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXRuZSBHUFJDOiRSQSwgMCksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0kgKGltbUJSQ29uZCAxKSwgIEdQUkM6JFJBLCBiYjokRElTUCk+Ow0KKw0KK2RlZiA6IFBhdDwoYnJjb25kIEdQUkM6JFJBLCBiYjokRElTUCksIA0KKyAgICAgIChDT05EX0JSQU5DSF9JIChpbW1CUkNvbmQgMSksIEdQUkM6JFJBLCBiYjokRElTUCk+Ow0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXRuZSBHUFJDOiRSQSwgR1BSQzokUkIpLCBiYjokRElTUCksIA0KKyAgICAgIChDT05EX0JSQU5DSF9JIChpbW1CUkNvbmQgMCksIChDTVBFUSBHUFJDOiRSQSwgR1BSQzokUkIpLCBiYjokRElTUCk+Ow0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXRuZSBHUFJDOiRSQSwgaW1tVUV4dDg6JEwpLCBiYjokRElTUCksIA0KKyAgICAgIChDT05EX0JSQU5DSF9JIChpbW1CUkNvbmQgMCksIChDTVBFUWkgR1BSQzokUkEsIGltbVVFeHQ4OiRMKSwgYmI6JERJU1ApPjsNCisNCisvL0ZQIGNvbmQgcGF0dGVybnMNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0ZXEgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMCksICBGOFJDOiRSQSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0bmUgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksICBGOFJDOiRSQSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0Z2UgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMiksICBGOFJDOiRSQSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0Z3QgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMyksICBGOFJDOiRSQSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0bGUgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyNCksICBGOFJDOiRSQSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0bHQgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyNSksICBGOFJDOiRSQSwgYmI6JERJU1ApPjsNCisNCisNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0ZXEgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApLCAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0b2VxIEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dWVxIEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCisNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0bHQgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApLCAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTFQgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0b2x0IEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTFQgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dWx0IEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTFQgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCisNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0bGUgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApLCAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTEUgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0b2xlIEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTEUgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dWxlIEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTEUgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCisNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0Z3QgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApLCAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTFQgRjhSQzokUkIsIEY4UkM6JFJBKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0b2d0IEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTFQgRjhSQzokUkIsIEY4UkM6JFJBKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dWd0IEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTFQgRjhSQzokUkIsIEY4UkM6JFJBKSwgYmI6JERJU1ApPjsNCisNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0Z2UgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApLCAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTEUgRjhSQzokUkIsIEY4UkM6JFJBKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0b2dlIEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTEUgRjhSQzokUkIsIEY4UkM6JFJBKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dWdlIEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMSksIChDTVBUTEUgRjhSQzokUkIsIEY4UkM6JFJBKSwgYmI6JERJU1ApPjsNCisNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0bmUgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApLCAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMCksIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0b25lIEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMCksIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dW5lIEY4UkM6JFJBLCBGOFJDOiRSQiksIGJiOiRESVNQKSwgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMCksIChDTVBURVEgRjhSQzokUkEsIEY4UkM6JFJCKSwgYmI6JERJU1ApPjsNCisNCisNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0b2VxIEY4UkM6JFJBLCBpbW1GUFopLCBiYjokRElTUCksICAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMCksIEY4UkM6JFJBLGJiOiRESVNQKT47DQorZGVmIDogUGF0PChicmNvbmQgKHNldHVlcSBGOFJDOiRSQSwgaW1tRlBaKSwgYmI6JERJU1ApLCAgIA0KKyAgICAgIChDT05EX0JSQU5DSF9GIChpbW1CUkNvbmQgMjApLCBGOFJDOiRSQSxiYjokRElTUCk+Ow0KKw0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXRvZ2UgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgICANCisgICAgICAoQ09ORF9CUkFOQ0hfRiAoaW1tQlJDb25kIDIyKSwgRjhSQzokUkEsYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dWdlIEY4UkM6JFJBLCBpbW1GUFopLCBiYjokRElTUCksICAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyMiksIEY4UkM6JFJBLGJiOiRESVNQKT47DQorDQorZGVmIDogUGF0PChicmNvbmQgKHNldG9ndCBGOFJDOiRSQSwgaW1tRlBaKSwgYmI6JERJU1ApLCAgIA0KKyAgICAgIChDT05EX0JSQU5DSF9GIChpbW1CUkNvbmQgMjMpLCBGOFJDOiRSQSxiYjokRElTUCk+Ow0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXR1Z3QgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgICANCisgICAgICAoQ09ORF9CUkFOQ0hfRiAoaW1tQlJDb25kIDIzKSwgRjhSQzokUkEsYmI6JERJU1ApPjsNCisNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0b2xlIEY4UkM6JFJBLCBpbW1GUFopLCBiYjokRElTUCksICAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyNCksIEY4UkM6JFJBLGJiOiRESVNQKT47DQorZGVmIDogUGF0PChicmNvbmQgKHNldHVsZSBGOFJDOiRSQSwgaW1tRlBaKSwgYmI6JERJU1ApLCAgIA0KKyAgICAgIChDT05EX0JSQU5DSF9GIChpbW1CUkNvbmQgMjQpLCBGOFJDOiRSQSxiYjokRElTUCk+Ow0KKw0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXRvbHQgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgICANCisgICAgICAoQ09ORF9CUkFOQ0hfRiAoaW1tQlJDb25kIDI1KSwgRjhSQzokUkEsYmI6JERJU1ApPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dWx0IEY4UkM6JFJBLCBpbW1GUFopLCBiYjokRElTUCksICAgDQorICAgICAgKENPTkRfQlJBTkNIX0YgKGltbUJSQ29uZCAyNSksIEY4UkM6JFJBLGJiOiRESVNQKT47DQorDQorZGVmIDogUGF0PChicmNvbmQgKHNldG9uZSBGOFJDOiRSQSwgaW1tRlBaKSwgYmI6JERJU1ApLCAgIA0KKyAgICAgIChDT05EX0JSQU5DSF9GIChpbW1CUkNvbmQgMjEpLCBGOFJDOiRSQSxiYjokRElTUCk+Ow0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXR1bmUgRjhSQzokUkEsIGltbUZQWiksIGJiOiRESVNQKSwgICANCisgICAgICAoQ09ORF9CUkFOQ0hfRiAoaW1tQlJDb25kIDIxKSwgRjhSQzokUkEsYmI6JERJU1ApPjsNCisNCisvL0VuZCBCcmFuY2hlcw0KKw0KKy8vU19mbG9hdGluZyA6IElFRUUgU2luZ2xlDQorLy9UX2Zsb2F0aW5nIDogSUVFRSBEb3VibGUNCisNCisvL1VudXNlZCBpbnN0cnVjdGlvbnMNCisvL01uZW1vbmljIEZvcm1hdCBPcGNvZGUgRGVzY3JpcHRpb24NCisvL0NBTExfUEFMIFBjZCAwMCBUcmFwIHRvIFBBTGNvZGUNCisvL0VDQiBNZmMgMTguRTgwMCBFdmljdCBjYWNoZSBibG9jaw0KKy8vRVhDQiBNZmMgMTguMDQwMCBFeGNlcHRpb24gYmFycmllcg0KKy8vRkVUQ0ggTWZjIDE4LjgwMDAgUHJlZmV0Y2ggZGF0YQ0KKy8vRkVUQ0hfTSBNZmMgMTguQTAwMCBQcmVmZXRjaCBkYXRhLCBtb2RpZnkgaW50ZW50DQorLy9MRFFfVSBNZW0gMEIgTG9hZCB1bmFsaWduZWQgcXVhZHdvcmQNCisvL01CIE1mYyAxOC40MDAwIE1lbW9yeSBiYXJyaWVyDQorLy9TVFFfVSBNZW0gMEYgU3RvcmUgdW5hbGlnbmVkIHF1YWR3b3JkDQorLy9UUkFQQiBNZmMgMTguMDAwMCBUcmFwIGJhcnJpZXINCisvL1dINjQgTWZjIDE4LkY4MDAgV3JpdGUgaGludCAUIDY0IGJ5dGVzDQorLy9XTUIgTWZjIDE4LjQ0MDAgV3JpdGUgbWVtb3J5IGJhcnJpZXINCisvL01GX0ZQQ1IgRi1QIDE3LjAyNSBNb3ZlIGZyb20gRlBDUg0KKy8vTVRfRlBDUiBGLVAgMTcuMDI0IE1vdmUgdG8gRlBDUg0KKy8vVGhlcmUgYXJlIGluIHRoZSBNdWx0aW1lZGlhIGV4dGVudGlvbnMsIHNvIGxldCdzIG5vdCB1c2UgdGhlbSB5ZXQNCisvL2RlZiBNQVhTQjggIDogT0Zvcm08MHgxQywgMHgzRSwgIk1BWFNCOCAkUkEsJFJCLCRSQyI+OyAvL1ZlY3RvciBzaWduZWQgYnl0ZSBtYXhpbXVtDQorLy9kZWYgTUFYU1c0IDogT0Zvcm08IDB4MUMsIDB4M0YsICJNQVhTVzQgJFJBLCRSQiwkUkMiPjsgLy9WZWN0b3Igc2lnbmVkIHdvcmQgbWF4aW11bQ0KKy8vZGVmIE1BWFVCOCAgOiBPRm9ybTwweDFDLCAweDNDLCAiTUFYVUI4ICRSQSwkUkIsJFJDIj47IC8vVmVjdG9yIHVuc2lnbmVkIGJ5dGUgbWF4aW11bQ0KKy8vZGVmIE1BWFVXNCA6IE9Gb3JtPCAweDFDLCAweDNELCAiTUFYVVc0ICRSQSwkUkIsJFJDIj47IC8vVmVjdG9yIHVuc2lnbmVkIHdvcmQgbWF4aW11bQ0KKy8vZGVmIE1JTlNCOCA6IE9Gb3JtPCAweDFDLCAweDM4LCAiTUlOU0I4ICRSQSwkUkIsJFJDIj47IC8vVmVjdG9yIHNpZ25lZCBieXRlIG1pbmltdW0NCisvL2RlZiBNSU5TVzQgOiBPRm9ybTwgMHgxQywgMHgzOSwgIk1JTlNXNCAkUkEsJFJCLCRSQyI+OyAvL1ZlY3RvciBzaWduZWQgd29yZCBtaW5pbXVtDQorLy9kZWYgTUlOVUI4IDogT0Zvcm08IDB4MUMsIDB4M0EsICJNSU5VQjggJFJBLCRSQiwkUkMiPjsgLy9WZWN0b3IgdW5zaWduZWQgYnl0ZSBtaW5pbXVtDQorLy9kZWYgTUlOVVc0IDogT0Zvcm08IDB4MUMsIDB4M0IsICJNSU5VVzQgJFJBLCRSQiwkUkMiPjsgLy9WZWN0b3IgdW5zaWduZWQgd29yZCBtaW5pbXVtDQorLy9kZWYgUEVSUiA6IE9Gb3JtPCAweDFDLCAweDMxLCAiUEVSUiAkUkEsJFJCLCRSQyI+OyAvL1BpeGVsIGVycm9yDQorLy9kZWYgUEtMQiA6IE9Gb3JtPCAweDFDLCAweDM3LCAiUEtMQiAkUkEsJFJCLCRSQyI+OyAvL1BhY2sgbG9uZ3dvcmRzIHRvIGJ5dGVzDQorLy9kZWYgUEtXQiAgOiBPRm9ybTwweDFDLCAweDM2LCAiUEtXQiAkUkEsJFJCLCRSQyI+OyAvL1BhY2sgd29yZHMgdG8gYnl0ZXMNCisvL2RlZiBVTlBLQkwgOiBPRm9ybTwgMHgxQywgMHgzNSwgIlVOUEtCTCAkUkEsJFJCLCRSQyI+OyAvL1VucGFjayBieXRlcyB0byBsb25nd29yZHMNCisvL2RlZiBVTlBLQlcgOiBPRm9ybTwgMHgxQywgMHgzNCwgIlVOUEtCVyAkUkEsJFJCLCRSQyI+OyAvL1VucGFjayBieXRlcyB0byB3b3Jkcw0KKy8vQ1ZUTFEgRi1QIDE3LjAxMCBDb252ZXJ0IGxvbmd3b3JkIHRvIHF1YWR3b3JkDQorLy9DVlRRTCBGLVAgMTcuMDMwIENvbnZlcnQgcXVhZHdvcmQgdG8gbG9uZ3dvcmQNCisNCisNCisvL0NvbnN0YW50IGhhbmRsaW5nDQorDQorZGVmIGltbUNvbnN0MlBhcnQgIDogUGF0TGVhZjwoaW1tKSwgW3sNCisgIC8vdHJ1ZSBpZiBpbW0gZml0cyBpbiBhIExEQUggTERBIHBhaXINCisgIGludDY0X3QgdmFsID0gKGludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCk7DQorICByZXR1cm4gKHZhbCA8PSBJTU1fRlVMTEhJR0ggICYmIHZhbCA+PSBJTU1fRlVMTExPVyk7DQorfV0+Ow0KK2RlZiBpbW1Db25zdDJQYXJ0SW50ICA6IFBhdExlYWY8KGltbSksIFt7DQorICAvL3RydWUgaWYgaW1tIGZpdHMgaW4gYSBMREFIIExEQSBwYWlyIHdpdGggemVyb2V4dA0KKyAgdWludDY0X3QgdXZhbCA9IE4tPmdldFpFeHRWYWx1ZSgpOw0KKyAgaW50MzJfdCB2YWwzMiA9IChpbnQzMl90KXV2YWw7DQorICByZXR1cm4gKCh1dmFsID4+IDMyKSA9PSAwICYmIC8vZW1wdHkgdXBwZXIgYml0cw0KKyAgICAgICAgICB2YWwzMiA8PSBJTU1fRlVMTEhJR0gpOw0KKy8vICAgICAgICAgIHZhbDMyID49IElNTV9GVUxMTE9XICArIElNTV9MT1cgICogSU1NX01VTFQpOyAvL0Fsd2F5cyBUcnVlDQorfV0sIFNFeHQzMj47DQorDQorZGVmIDogUGF0PChpNjQgaW1tQ29uc3QyUGFydDokaW1tKSwNCisgICAgICAgICAgKExEQSAoTEwxNiBpbW1Db25zdDJQYXJ0OiRpbW0pLCAoTERBSCAoTEgxNiBpbW1Db25zdDJQYXJ0OiRpbW0pLCBSMzEpKT47DQorDQorZGVmIDogUGF0PChpNjQgaW1tU0V4dDE2OiRpbW0pLA0KKyAgICAgICAgICAoTERBIGltbVNFeHQxNjokaW1tLCBSMzEpPjsNCisNCitkZWYgOiBQYXQ8KGk2NCBpbW1TRXh0MTZpbnQ6JGltbSksDQorICAgICAgICAgIChaQVBOT1RpIChMREEgKFNFeHQxNiBpbW1TRXh0MTZpbnQ6JGltbSksIFIzMSksIDE1KT47DQorZGVmIDogUGF0PChpNjQgaW1tQ29uc3QyUGFydEludDokaW1tKSwNCisgICAgICAgICAgKFpBUE5PVGkgKExEQSAoTEwxNiAoaTY0IChTRXh0MzIgaW1tQ29uc3QyUGFydEludDokaW1tKSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChMREFIIChMSDE2IChpNjQgKFNFeHQzMiBpbW1Db25zdDJQYXJ0SW50OiRpbW0pKSksIFIzMSkpLCAxNSk+Ow0KKw0KKw0KKy8vVE9ETzogSSB3YW50IHRvIGp1c3QgZGVmaW5lIHRoZXNlIGxpa2UgdGhpcyENCisvL2RlZiA6IFBhdDwoaTY0IDApLA0KKy8vICAgICAgICAgIChSMzEpPjsNCisvL2RlZiA6IFBhdDwoZjY0IDAuMCksDQorLy8gICAgICAgICAgKEYzMSk+Ow0KKy8vZGVmIDogUGF0PChmNjQgLTAuMCksDQorLy8gICAgICAgICAgKENQWVNOVCBGMzEsIEYzMSk+Ow0KKy8vZGVmIDogUGF0PChmMzIgMC4wKSwNCisvLyAgICAgICAgICAoRjMxKT47DQorLy9kZWYgOiBQYXQ8KGYzMiAtMC4wKSwNCisvLyAgICAgICAgICAoQ1BZU05TIEYzMSwgRjMxKT47DQorDQorLy9NaXNjIFBhdHRlcm5zOg0KKw0KK2RlZiA6IFBhdDwoc2V4dF9pbnJlZyBHUFJDOiRSQiwgaTMyKSwNCisgICAgICAgICAgKEFERExpIEdQUkM6JFJCLCAwKT47DQorDQorZGVmIDogUGF0PChmYWJzIEY4UkM6JFJCKSwNCisgICAgICAgICAgKENQWVNUIEYzMSwgRjhSQzokUkIpPjsNCitkZWYgOiBQYXQ8KGZhYnMgRjRSQzokUkIpLA0KKyAgICAgICAgICAoQ1BZU1MgRjMxLCBGNFJDOiRSQik+Ow0KK2RlZiA6IFBhdDwoZm5lZyBGOFJDOiRSQiksDQorICAgICAgICAgIChDUFlTTlQgRjhSQzokUkIsIEY4UkM6JFJCKT47DQorZGVmIDogUGF0PChmbmVnIEY0UkM6JFJCKSwNCisgICAgICAgICAgKENQWVNOUyBGNFJDOiRSQiwgRjRSQzokUkIpPjsNCisNCitkZWYgOiBQYXQ8KGZjb3B5c2lnbiBGNFJDOiRBLCAoZm5lZyBGNFJDOiRCKSksDQorICAgICAgICAgIChDUFlTTlMgRjRSQzokQiwgRjRSQzokQSk+Ow0KK2RlZiA6IFBhdDwoZmNvcHlzaWduIEY4UkM6JEEsIChmbmVnIEY4UkM6JEIpKSwNCisgICAgICAgICAgKENQWVNOVCBGOFJDOiRCLCBGOFJDOiRBKT47DQorZGVmIDogUGF0PChmY29weXNpZ24gRjRSQzokQSwgKGZuZWcgRjhSQzokQikpLA0KKyAgICAgICAgICAoQ1BZU05TdCBGOFJDOiRCLCBGNFJDOiRBKT47DQorZGVmIDogUGF0PChmY29weXNpZ24gRjhSQzokQSwgKGZuZWcgRjRSQzokQikpLA0KKyAgICAgICAgICAoQ1BZU05UcyBGNFJDOiRCLCBGOFJDOiRBKT47DQorDQorLy9ZZXMsIHNpZ25lZCBtdWx0aXBseSBoaWdoIGlzIHVnbHkNCitkZWYgOiBQYXQ8KG11bGhzIEdQUkM6JFJBLCBHUFJDOiRSQiksDQorICAgICAgICAgIChTVUJRciAoVU1VTEhyIEdQUkM6JFJBLCBHUFJDOiRSQiksIChBRERRciAoQ01PVkdFciBHUFJDOiRSQiwgUjMxLCBHUFJDOiRSQSksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENNT1ZHRXIgR1BSQzokUkEsIFIzMSwgR1BSQzokUkIpKSk+Ow0KKw0KKy8vU3R1cGlkIGNyYXp5IGFyaXRobWV0aWMgc3R1ZmY6DQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDEgaW4gew0KK2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCA1KSwgKFM0QUREUXIgR1BSQzokUkEsIEdQUkM6JFJBKT47DQorZGVmIDogUGF0PChtdWwgR1BSQzokUkEsIDkpLCAoUzhBRERRciBHUFJDOiRSQSwgR1BSQzokUkEpPjsNCitkZWYgOiBQYXQ8KG11bCBHUFJDOiRSQSwgMyksIChTNFNVQlFyIEdQUkM6JFJBLCBHUFJDOiRSQSk+Ow0KK2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCA3KSwgKFM4U1VCUXIgR1BSQzokUkEsIEdQUkM6JFJBKT47DQorDQorLy9zbGlnaHQgdHJlZSBleHBhbnNpb24gaWYgd2UgYXJlIG11bHRpcGx5aW5nIG5lYXIgdG8gYSBwb3dlciBvZiAyDQorLy9uIGlzIGFib3ZlIGEgcG93ZXIgb2YgMg0KK2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCBpbW1SZW0xOiRpbW0pLCANCisgICAgICAgICAgKEFERFFyIChTTHIgR1BSQzokUkEsIChuZWFyUDJYIGltbVJlbTE6JGltbSkpLCBHUFJDOiRSQSk+Ow0KK2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCBpbW1SZW0yOiRpbW0pLCANCisgICAgICAgICAgKEFERFFyIChTTHIgR1BSQzokUkEsIChuZWFyUDJYIGltbVJlbTI6JGltbSkpLCAoQUREUXIgR1BSQzokUkEsIEdQUkM6JFJBKSk+Ow0KK2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCBpbW1SZW0zOiRpbW0pLA0KKyAgICAgICAgICAoQUREUXIgKFNMciBHUFJDOiRSQSwgKG5lYXJQMlggaW1tUmVtMzokaW1tKSksIChTNFNVQlFyIEdQUkM6JFJBLCBHUFJDOiRSQSkpPjsNCitkZWYgOiBQYXQ8KG11bCBHUFJDOiRSQSwgaW1tUmVtNDokaW1tKSwNCisgICAgICAgICAgKFM0QUREUXIgR1BSQzokUkEsIChTTHIgR1BSQzokUkEsIChuZWFyUDJYIGltbVJlbTQ6JGltbSkpKT47DQorZGVmIDogUGF0PChtdWwgR1BSQzokUkEsIGltbVJlbTU6JGltbSksDQorICAgICAgICAgIChBRERRciAoU0xyIEdQUkM6JFJBLCAobmVhclAyWCBpbW1SZW01OiRpbW0pKSwgKFM0QUREUXIgR1BSQzokUkEsIEdQUkM6JFJBKSk+Ow0KK2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCBpbW1SZW1QMjokaW1tKSwNCisgICAgICAgICAgKEFERFFyIChTTHIgR1BSQzokUkEsIChuZWFyUDJYIGltbVJlbVAyOiRpbW0pKSwgKFNMaSBHUFJDOiRSQSwgKG5lYXJQMlJlbVggaW1tUmVtUDI6JGltbSkpKT47DQorDQorLy9uIGlzIGJlbG93IGEgcG93ZXIgb2YgMg0KKy8vRklYTUU6IGZpZ3VyZSBvdXQgd2h5IHNvbWV0aGluZyBpcyB0cnVuY2F0aW5nIHRoZSBpbW0gdG8gMzJiaXRzDQorLy8gdGhpcyB3aWxsIGZpeCAyMDA3LTExLTI3LW11bG5lZzMNCisvL2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCBpbW1SZW0xbjokaW1tKSwgDQorLy8gICAgICAgICAgKFNVQlFyIChTTHIgR1BSQzokUkEsIChuZWFyUDJYIGltbVJlbTFuOiRpbW0pKSwgR1BSQzokUkEpPjsNCisvL2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCBpbW1SZW0ybjokaW1tKSwgDQorLy8gICAgICAgICAgKFNVQlFyIChTTHIgR1BSQzokUkEsIChuZWFyUDJYIGltbVJlbTJuOiRpbW0pKSwgKEFERFFyIEdQUkM6JFJBLCBHUFJDOiRSQSkpPjsNCisvL2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCBpbW1SZW0zbjokaW1tKSwNCisvLyAgICAgICAgICAoU1VCUXIgKFNMciBHUFJDOiRSQSwgKG5lYXJQMlggaW1tUmVtM246JGltbSkpLCAoUzRTVUJRciBHUFJDOiRSQSwgR1BSQzokUkEpKT47DQorLy9kZWYgOiBQYXQ8KG11bCBHUFJDOiRSQSwgaW1tUmVtNG46JGltbSksDQorLy8gICAgICAgICAgKFNVQlFyIChTTHIgR1BSQzokUkEsIChuZWFyUDJYIGltbVJlbTRuOiRpbW0pKSwgKFNMaSBHUFJDOiRSQSwgMikpPjsNCisvL2RlZiA6IFBhdDwobXVsIEdQUkM6JFJBLCBpbW1SZW01bjokaW1tKSwNCisvLyAgICAgICAgICAoU1VCUXIgKFNMciBHUFJDOiRSQSwgKG5lYXJQMlggaW1tUmVtNW46JGltbSkpLCAoUzRBRERRciBHUFJDOiRSQSwgR1BSQzokUkEpKT47DQorLy9kZWYgOiBQYXQ8KG11bCBHUFJDOiRSQSwgaW1tUmVtUDJuOiRpbW0pLA0KKy8vICAgICAgICAgIChTVUJRciAoU0xyIEdQUkM6JFJBLCAobmVhclAyWCBpbW1SZW1QMm46JGltbSkpLCAoU0xpIEdQUkM6JFJBLCAobmVhclAyUmVtWCBpbW1SZW1QMm46JGltbSkpKT47DQorfSAvL0FkZGVkIGNvbXBsZXhpdHkNCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSklUSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSklUSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2ODVlZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFKSVRJbmZvLmNwcApAQCAtMCwwICsxLDMxMCBAQAorLy89PT0tLSBBbHBoYUpJVEluZm8uY3BwIC0gSW1wbGVtZW50IHRoZSBKSVQgaW50ZXJmYWNlcyBmb3IgdGhlIEFscGhhIC0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEpJVCBpbnRlcmZhY2VzIGZvciB0aGUgQWxwaGEgdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiaml0IgorI2luY2x1ZGUgIkFscGhhSklUSW5mby5oIgorI2luY2x1ZGUgIkFscGhhUmVsb2NhdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0pJVENvZGVFbWl0dGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjc3RkbGliPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKyNkZWZpbmUgQlVJTERfT0Zvcm1hdEkoT3AsIFJBLCBMSVQsIEZVTiwgUkMpIFwKKyAgKChPcCA8PCAyNikgfCAoUkEgPDwgMjEpIHwgKExJVCA8PCAxMykgfCAoMSA8PCAxMikgfCAoRlVOIDw8IDUpIHwgKFJDKSkKKyNkZWZpbmUgQlVJTERfT0Zvcm1hdChPcCwgUkEsIFJCLCBGVU4sIFJDKSBcCisgICgoT3AgPDwgMjYpIHwgKFJBIDw8IDIxKSB8IChSQiA8PCAxNikgfCAoRlVOIDw8IDUpIHwgKFJDKSkKKworI2RlZmluZSBCVUlMRF9MREEoUkQsIFJTLCBJTU0xNikgXAorICAoKDB4MDggPDwgMjYpIHwgKChSRCkgPDwgMjEpIHwgKChSUykgPDwgMTYpIHwgKChJTU0xNikgJiA2NTUzNSkpCisjZGVmaW5lIEJVSUxEX0xEQUgoUkQsIFJTLCBJTU0xNikgXAorICAoKDB4MDkgPDwgMjYpIHwgKChSRCkgPDwgMjEpIHwgKChSUykgPDwgMTYpIHwgKChJTU0xNikgJiA2NTUzNSkpCisKKyNkZWZpbmUgQlVJTERfTERRKFJELCBSUywgSU1NMTYpIFwKKyAgKCgweDI5IDw8IDI2KSB8ICgoUkQpIDw8IDIxKSB8ICgoUlMpIDw8IDE2KSB8ICgoSU1NMTYpICYgMHhGRkZGKSkKKworI2RlZmluZSBCVUlMRF9KTVAoUkQsIFJTLCBJTU0xNikgXAorICAoKDB4MUEgPDwgMjYpIHwgKChSRCkgPDwgMjEpIHwgKChSUykgPDwgMTYpIHwgKDB4MDAgPDwgMTQpIHwgKChJTU0xNikgJiAweDNGRkYpKQorI2RlZmluZSBCVUlMRF9KU1IoUkQsIFJTLCBJTU0xNikgXAorICAoKDB4MUEgPDwgMjYpIHwgKChSRCkgPDwgMjEpIHwgKChSUykgPDwgMTYpIHwgKDB4MDEgPDwgMTQpIHwgKChJTU0xNikgJiAweDNGRkYpKQorCisjZGVmaW5lIEJVSUxEX1NMTGkoUkQsIFJTLCBJTU04KSBcCisgIChCVUlMRF9PRm9ybWF0SSgweDEyLCBSUywgSU1NOCwgMHgzOSwgUkQpKQorCisjZGVmaW5lIEJVSUxEX09SaShSRCwgUlMsIElNTTgpIFwKKyAgKEJVSUxEX09Gb3JtYXRJKDB4MTEsIFJTLCBJTU04LCAweDIwLCBSRCkpCisKKyNkZWZpbmUgQlVJTERfT1IoUkQsIFJTLCBSVCkgXAorICAoQlVJTERfT0Zvcm1hdCgweDExLCBSUywgUlQsIDB4MjAsIFJEKSkKKworCisKK3N0YXRpYyB2b2lkIEVtaXRCcmFuY2hUb0F0KHZvaWQgKkF0LCB2b2lkICpUbykgeworICB1bnNpZ25lZCBsb25nIEZuID0gKHVuc2lnbmVkIGxvbmcpVG87CisKKyAgdW5zaWduZWQgKkF0SSA9ICh1bnNpZ25lZCopQXQ7CisKKyAgQXRJWzBdID0gQlVJTERfT1IoMCwgMjcsIDI3KTsKKworICBERUJVRyhlcnJzKCkgPDwgIlN0dWIgdGFyZ2V0aW5nICIgPDwgVG8gPDwgIlxuIik7CisKKyAgZm9yIChpbnQgeCA9IDE7IHggPD0gODsgKyt4KSB7CisgICAgQXRJWzIqeCAtIDFdID0gQlVJTERfU0xMaSgyNywyNyw4KTsKKyAgICB1bnNpZ25lZCBkID0gKEZuID4+ICg2NCAtIDggKiB4KSkgJiAweDAwRkY7CisgICAgLy9ERUJVRyhlcnJzKCkgPDwgIm91dHB1dGluZyAiIDw8IGhleCA8PCBkIDw8IGRlYyA8PCAiXG4iKTsKKyAgICBBdElbMip4XSA9IEJVSUxEX09SaSgyNywgMjcsIGQpOworICB9CisgIEF0SVsxN10gPSBCVUlMRF9KTVAoMzEsMjcsMCk7IC8vanVtcCwgcHJlc2VydmluZyByYSwgYW5kIHNldHRpbmcgcHYKKyAgQXRJWzE4XSA9IDB4MDBGRkZGRkY7IC8vbWFyayB0aGlzIGFzIGEgc3R1YgorfQorCit2b2lkIEFscGhhSklUSW5mbzo6cmVwbGFjZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24odm9pZCAqT2xkLCB2b2lkICpOZXcpIHsKKyAgLy9GSVhNRQorICBsbHZtX3VucmVhY2hhYmxlKDApOworfQorCitzdGF0aWMgVGFyZ2V0SklUSW5mbzo6SklUQ29tcGlsZXJGbiBKSVRDb21waWxlckZ1bmN0aW9uOworLy9zdGF0aWMgQWxwaGFKSVRJbmZvKiBBbHBoYUpUSTsKKworZXh0ZXJuICJDIiB7CisjaWZkZWYgX19hbHBoYQorCisgIHZvaWQgQWxwaGFDb21waWxhdGlvbkNhbGxiYWNrQyhsb25nKiBvbGRwdiwgdm9pZCogQ2FtZUZyb21TdHViKQorICB7CisgICAgdm9pZCogVGFyZ2V0ID0gSklUQ29tcGlsZXJGdW5jdGlvbihDYW1lRnJvbVN0dWIpOworCisgICAgLy9yZXdyaXRlIHRoZSBzdHViIHRvIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoCisgICAgaWYgKCgodW5zaWduZWQqKUNhbWVGcm9tU3R1YilbMThdID09IDB4MDBGRkZGRkYpIHsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiQ2FtZSBmcm9tIGEgc3R1YiwgcmV3cml0aW5nXG4iKTsKKyAgICAgIEVtaXRCcmFuY2hUb0F0KENhbWVGcm9tU3R1YiwgVGFyZ2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgREVCVUcoZXJycygpIDw8ICJjb25mdXNlZCwgZGlkbid0IGNvbWUgZnJvbSBzdHViIGF0ICIgPDwgQ2FtZUZyb21TdHViCisgICAgICAgICAgICAgICAgICAgPDwgIiBvbGQganVtcCB2ZWN0b3IgIiA8PCBvbGRwdgorICAgICAgICAgICAgICAgICAgIDw8ICIgbmV3IGp1bXAgdmVjdG9yICIgPDwgVGFyZ2V0IDw8ICJcbiIpOworICAgIH0KKworICAgIC8vQ2hhbmdlIHB2IHRvIG5ldyBUYXJnZXQKKyAgICAqb2xkcHYgPSAobG9uZylUYXJnZXQ7CisgIH0KKworICB2b2lkIEFscGhhQ29tcGlsYXRpb25DYWxsYmFjayh2b2lkKTsKKworICBhc20oCisgICAgICAiLnRleHRcbiIKKyAgICAgICIuZ2xvYmwgQWxwaGFDb21waWxhdGlvbkNhbGxiYWNrQ1xuIgorICAgICAgIi5hbGlnbiA0XG4iCisgICAgICAiLmdsb2JsIEFscGhhQ29tcGlsYXRpb25DYWxsYmFja1xuIgorICAgICAgIi5lbnQgQWxwaGFDb21waWxhdGlvbkNhbGxiYWNrXG4iCisiQWxwaGFDb21waWxhdGlvbkNhbGxiYWNrOlxuIgorICAgICAgLy8gICAgICAvL2dldCBKSVQncyBHT1QKKyAgICAgICJsZGdwICQyOSwgMCgkMjcpXG4iCisgICAgICAvL1NhdmUgYXJncywgY2FsbGVlIHNhdmVkLCBhbmQgcGVyaGFwcyBvdGhlcnM/CisgICAgICAvL2FyZ3M6ICQxNi0kMjEgJGYxNi0kZjIxICAgICAoMTIpCisgICAgICAvL2NhbGxlZTogJDktJDE0ICRmMi0kZjkgICAgICAoMTQpCisgICAgICAvL290aGVyczogZnA6JDE1IHJhOiQyNiBwdjokMjcgKDMpCisgICAgICAibGRhICQzMCwgLTIzMigkMzApXG4iCisgICAgICAic3RxICQxNiwgICAwKCQzMClcbiIKKyAgICAgICJzdHEgJDE3LCAgIDgoJDMwKVxuIgorICAgICAgInN0cSAkMTgsICAxNigkMzApXG4iCisgICAgICAic3RxICQxOSwgIDI0KCQzMClcbiIKKyAgICAgICJzdHEgJDIwLCAgMzIoJDMwKVxuIgorICAgICAgInN0cSAkMjEsICA0MCgkMzApXG4iCisgICAgICAic3R0ICRmMTYsIDQ4KCQzMClcbiIKKyAgICAgICJzdHQgJGYxNywgNTYoJDMwKVxuIgorICAgICAgInN0dCAkZjE4LCA2NCgkMzApXG4iCisgICAgICAic3R0ICRmMTksIDcyKCQzMClcbiIKKyAgICAgICJzdHQgJGYyMCwgODAoJDMwKVxuIgorICAgICAgInN0dCAkZjIxLCA4OCgkMzApXG4iCisgICAgICAic3RxICQ5LCAgIDk2KCQzMClcbiIKKyAgICAgICJzdHEgJDEwLCAxMDQoJDMwKVxuIgorICAgICAgInN0cSAkMTEsIDExMigkMzApXG4iCisgICAgICAic3RxICQxMiwgMTIwKCQzMClcbiIKKyAgICAgICJzdHEgJDEzLCAxMjgoJDMwKVxuIgorICAgICAgInN0cSAkMTQsIDEzNigkMzApXG4iCisgICAgICAic3R0ICRmMiwgMTQ0KCQzMClcbiIKKyAgICAgICJzdHQgJGYzLCAxNTIoJDMwKVxuIgorICAgICAgInN0dCAkZjQsIDE2MCgkMzApXG4iCisgICAgICAic3R0ICRmNSwgMTY4KCQzMClcbiIKKyAgICAgICJzdHQgJGY2LCAxNzYoJDMwKVxuIgorICAgICAgInN0dCAkZjcsIDE4NCgkMzApXG4iCisgICAgICAic3R0ICRmOCwgMTkyKCQzMClcbiIKKyAgICAgICJzdHQgJGY5LCAyMDAoJDMwKVxuIgorICAgICAgInN0cSAkMTUsIDIwOCgkMzApXG4iCisgICAgICAic3RxICQyNiwgMjE2KCQzMClcbiIKKyAgICAgICJzdHEgJDI3LCAyMjQoJDMwKVxuIgorCisgICAgICAiYWRkcSAkMzAsIDIyNCwgJDE2XG4iIC8vcGFzcyB0aGUgYWRkciBvZiBzYXZlZCBwdiBhcyB0aGUgZmlyc3QgYXJnCisgICAgICAiYmlzICQwLCAkMCwgJDE3XG4iIC8vcGFzcyB0aGUgcm91Z2hseSBzdHViIGFkZHIgaW4gc2Vjb25kIGFyZworICAgICAgImpzciAkMjYsIEFscGhhQ29tcGlsYXRpb25DYWxsYmFja0NcbiIgLy9jYWxsIHdpdGhvdXQgc2F2aW5nIHJhCisKKyAgICAgICJsZHEgJDE2LCAgIDAoJDMwKVxuIgorICAgICAgImxkcSAkMTcsICAgOCgkMzApXG4iCisgICAgICAibGRxICQxOCwgIDE2KCQzMClcbiIKKyAgICAgICJsZHEgJDE5LCAgMjQoJDMwKVxuIgorICAgICAgImxkcSAkMjAsICAzMigkMzApXG4iCisgICAgICAibGRxICQyMSwgIDQwKCQzMClcbiIKKyAgICAgICJsZHQgJGYxNiwgNDgoJDMwKVxuIgorICAgICAgImxkdCAkZjE3LCA1NigkMzApXG4iCisgICAgICAibGR0ICRmMTgsIDY0KCQzMClcbiIKKyAgICAgICJsZHQgJGYxOSwgNzIoJDMwKVxuIgorICAgICAgImxkdCAkZjIwLCA4MCgkMzApXG4iCisgICAgICAibGR0ICRmMjEsIDg4KCQzMClcbiIKKyAgICAgICJsZHEgJDksICAgOTYoJDMwKVxuIgorICAgICAgImxkcSAkMTAsIDEwNCgkMzApXG4iCisgICAgICAibGRxICQxMSwgMTEyKCQzMClcbiIKKyAgICAgICJsZHEgJDEyLCAxMjAoJDMwKVxuIgorICAgICAgImxkcSAkMTMsIDEyOCgkMzApXG4iCisgICAgICAibGRxICQxNCwgMTM2KCQzMClcbiIKKyAgICAgICJsZHQgJGYyLCAxNDQoJDMwKVxuIgorICAgICAgImxkdCAkZjMsIDE1MigkMzApXG4iCisgICAgICAibGR0ICRmNCwgMTYwKCQzMClcbiIKKyAgICAgICJsZHQgJGY1LCAxNjgoJDMwKVxuIgorICAgICAgImxkdCAkZjYsIDE3NigkMzApXG4iCisgICAgICAibGR0ICRmNywgMTg0KCQzMClcbiIKKyAgICAgICJsZHQgJGY4LCAxOTIoJDMwKVxuIgorICAgICAgImxkdCAkZjksIDIwMCgkMzApXG4iCisgICAgICAibGRxICQxNSwgMjA4KCQzMClcbiIKKyAgICAgICJsZHEgJDI2LCAyMTYoJDMwKVxuIgorICAgICAgImxkcSAkMjcsIDIyNCgkMzApXG4iIC8vdGhpcyB3YXMgdXBkYXRlZCBpbiB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgdGFyZ2V0CisKKyAgICAgICJsZGEgJDMwLCAyMzIoJDMwKVxuIiAvL3Jlc3RvcmUgc3AKKyAgICAgICJqbXAgJDMxLCAoJDI3KVxuIiAvL2p1bXAgdG8gdGhlIG5ldyBmdW5jdGlvbgorICAgICAgIi5lbmQgQWxwaGFDb21waWxhdGlvbkNhbGxiYWNrXG4iCisgICAgICApOworI2Vsc2UKKyAgdm9pZCBBbHBoYUNvbXBpbGF0aW9uQ2FsbGJhY2soKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ2Fubm90IGNhbGwgQWxwaGFDb21waWxhdGlvbkNhbGxiYWNrKCkgb24gYSBub24tQWxwaGEgYXJjaCEiKTsKKyAgfQorI2VuZGlmCit9CisKK1RhcmdldEpJVEluZm86OlN0dWJMYXlvdXQgQWxwaGFKSVRJbmZvOjpnZXRTdHViTGF5b3V0KCkgeworICAvLyBUaGUgc3R1YiBjb250YWlucyAxOSA0LWJ5dGUgaW5zdHJ1Y3Rpb25zLCBhbGlnbmVkIGF0IDQgYnl0ZXM6CisgIC8vIFIwID0gUjI3CisgIC8vIDggeCAiUjI3IDw8PSA4OyBSMjcgfD0gOC1iaXRzLW9mLVRhcmdldCIgID09IDE2IGluc3RydWN0aW9ucworICAvLyBKTVAgUjI3CisgIC8vIE1hZ2ljIG51bWJlciBzbyB0aGUgY29tcGlsYXRpb24gY2FsbGJhY2sgY2FuIHJlY29nbml6ZSB0aGUgc3R1Yi4KKyAgU3R1YkxheW91dCBSZXN1bHQgPSB7MTkgKiA0LCA0fTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKwordm9pZCAqQWxwaGFKSVRJbmZvOjplbWl0RnVuY3Rpb25TdHViKGNvbnN0IEZ1bmN0aW9uKiBGLCB2b2lkICpGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRDb2RlRW1pdHRlciAmSkNFKSB7CisgIC8vYXNzZXJ0KEZuID09IEFscGhhQ29tcGlsYXRpb25DYWxsYmFjayAmJiAiV2hlcmUgYXJlIHlvdSBnb2luZz9cbiIpOworICAvL0RvIHRoaW5ncyBpbiBhIHN0dXBpZCBzbG93IHdheSEKKyAgdm9pZCogQWRkciA9ICh2b2lkKikoaW50cHRyX3QpSkNFLmdldEN1cnJlbnRQQ1ZhbHVlKCk7CisgIGZvciAoaW50IHggPSAwOyB4IDwgMTk7ICsrIHgpCisgICAgSkNFLmVtaXRXb3JkTEUoMCk7CisgIEVtaXRCcmFuY2hUb0F0KEFkZHIsIEZuKTsKKyAgREVCVUcoZXJycygpIDw8ICJFbWl0dGluZyBTdHViIHRvICIgPDwgRm4gPDwgIiBhdCBbIiA8PCBBZGRyIDw8ICJdXG4iKTsKKyAgcmV0dXJuIEFkZHI7Cit9CisKK1RhcmdldEpJVEluZm86OkxhenlSZXNvbHZlckZuCitBbHBoYUpJVEluZm86OmdldExhenlSZXNvbHZlckZ1bmN0aW9uKEpJVENvbXBpbGVyRm4gRikgeworICBKSVRDb21waWxlckZ1bmN0aW9uID0gRjsKKyAgLy8gIHNldFplcm90aEdPVEVudHJ5KCh2b2lkKilBbHBoYUNvbXBpbGF0aW9uQ2FsbGJhY2spOworICByZXR1cm4gQWxwaGFDb21waWxhdGlvbkNhbGxiYWNrOworfQorCisvL1RoZXNlIGRlc2NyaWJlIExEQXgKK3N0YXRpYyBjb25zdCBpbnQgSU1NX0xPVyAgPSAtMzI3Njg7CitzdGF0aWMgY29uc3QgaW50IElNTV9ISUdIID0gMzI3Njc7CitzdGF0aWMgY29uc3QgaW50IElNTV9NVUxUID0gNjU1MzY7CisKK3N0YXRpYyBsb25nIGdldFVwcGVyMTYobG9uZyBsKQoreworICBsb25nIHkgPSBsIC8gSU1NX01VTFQ7CisgIGlmIChsICUgSU1NX01VTFQgPiBJTU1fSElHSCkKKyAgICArK3k7CisgIGlmIChsICUgSU1NX01VTFQgPCBJTU1fTE9XKQorICAgIC0teTsKKyAgYXNzZXJ0KChzaG9ydCl5ID09IHkgJiYgImRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UiKTsKKyAgcmV0dXJuIHk7Cit9CisKK3N0YXRpYyBsb25nIGdldExvd2VyMTYobG9uZyBsKQoreworICBsb25nIGggPSBnZXRVcHBlcjE2KGwpOworICBsb25nIHkgPSBsIC0gaCAqIElNTV9NVUxUOworICBhc3NlcnQoeSA9PSAoc2hvcnQpeSAmJiAiRGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIpOworICByZXR1cm4geTsKK30KKwordm9pZCBBbHBoYUpJVEluZm86OnJlbG9jYXRlKHZvaWQgKkZ1bmN0aW9uLCBNYWNoaW5lUmVsb2NhdGlvbiAqTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVsb2NzLCB1bnNpZ25lZCBjaGFyKiBHT1RCYXNlKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUmVsb2NzOyArK2ksICsrTVIpIHsKKyAgICB1bnNpZ25lZCAqUmVsb2NQb3MgPSAodW5zaWduZWQqKUZ1bmN0aW9uICsgTVItPmdldE1hY2hpbmVDb2RlT2Zmc2V0KCkvNDsKKyAgICBsb25nIGlkeCA9IDA7CisgICAgYm9vbCBkb0NvbW1vbiA9IHRydWU7CisgICAgc3dpdGNoICgoQWxwaGE6OlJlbG9jYXRpb25UeXBlKU1SLT5nZXRSZWxvY2F0aW9uVHlwZSgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biByZWxvY2F0aW9uIHR5cGUhIik7CisgICAgY2FzZSBBbHBoYTo6cmVsb2NfbGl0ZXJhbDoKKyAgICAgIC8vVGhpcyBpcyBhIExEUWwKKyAgICAgIGlkeCA9IE1SLT5nZXRHT1RJbmRleCgpOworICAgICAgREVCVUcoZXJycygpIDw8ICJMaXRlcmFsIHJlbG9jYXRpb24gdG8gc2xvdCAiIDw8IGlkeCk7CisgICAgICBpZHggPSAoaWR4IC0gR09Ub2Zmc2V0KSAqIDg7CisgICAgICBERUJVRyhlcnJzKCkgPDwgIiBvZmZzZXQgIiA8PCBpZHggPDwgIlxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFscGhhOjpyZWxvY19ncHJlbGxvdzoKKyAgICAgIGlkeCA9ICh1bnNpZ25lZCBjaGFyKilNUi0+Z2V0UmVzdWx0UG9pbnRlcigpIC0gJkdPVEJhc2VbR09Ub2Zmc2V0ICogOF07CisgICAgICBpZHggPSBnZXRMb3dlcjE2KGlkeCk7CisgICAgICBERUJVRyhlcnJzKCkgPDwgImdwcmVsbG93IHJlbG9jYXRpb24gb2Zmc2V0ICIgPDwgaWR4IDw8ICJcbiIpOworICAgICAgREVCVUcoZXJycygpIDw8ICIgUG9pbnRlciBpcyAiIDw8ICh2b2lkKilNUi0+Z2V0UmVzdWx0UG9pbnRlcigpCisgICAgICAgICAgIDw8ICIgR09UIGlzICIgPDwgKHZvaWQqKSZHT1RCYXNlW0dPVG9mZnNldCAqIDhdIDw8ICJcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBbHBoYTo6cmVsb2NfZ3ByZWxoaWdoOgorICAgICAgaWR4ID0gKHVuc2lnbmVkIGNoYXIqKU1SLT5nZXRSZXN1bHRQb2ludGVyKCkgLSAmR09UQmFzZVtHT1RvZmZzZXQgKiA4XTsKKyAgICAgIGlkeCA9IGdldFVwcGVyMTYoaWR4KTsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiZ3ByZWxoaWdoIHJlbG9jYXRpb24gb2Zmc2V0ICIgPDwgaWR4IDw8ICJcbiIpOworICAgICAgREVCVUcoZXJycygpIDw8ICIgUG9pbnRlciBpcyAiIDw8ICh2b2lkKilNUi0+Z2V0UmVzdWx0UG9pbnRlcigpCisgICAgICAgICAgICA8PCAiIEdPVCBpcyAiIDw8ICh2b2lkKikmR09UQmFzZVtHT1RvZmZzZXQgKiA4XSA8PCAiXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQWxwaGE6OnJlbG9jX2dwZGlzdDoKKyAgICAgIHN3aXRjaCAoKlJlbG9jUG9zID4+IDI2KSB7CisgICAgICBjYXNlIDB4MDk6IC8vTERBSAorICAgICAgICBpZHggPSAmR09UQmFzZVtHT1RvZmZzZXQgKiA4XSAtICh1bnNpZ25lZCBjaGFyKilSZWxvY1BvczsKKyAgICAgICAgaWR4ID0gZ2V0VXBwZXIxNihpZHgpOworICAgICAgICBERUJVRyhlcnJzKCkgPDwgIkxEQUg6ICIgPDwgaWR4IDw8ICJcbiIpOworICAgICAgICAvL2FkZCB0aGUgcmVsb2NhdGlvbiB0byB0aGUgbWFwCisgICAgICAgIGdwZGlzdG1hcFtzdGQ6Om1ha2VfcGFpcihGdW5jdGlvbiwgTVItPmdldENvbnN0YW50VmFsKCkpXSA9IFJlbG9jUG9zOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHgwODogLy9MREEKKyAgICAgICAgYXNzZXJ0KGdwZGlzdG1hcFtzdGQ6Om1ha2VfcGFpcihGdW5jdGlvbiwgTVItPmdldENvbnN0YW50VmFsKCkpXSAmJgorICAgICAgICAgICAgICAgIkxEQWcgd2l0aG91dCBzZWVpbmcgTERBSGciKTsKKyAgICAgICAgaWR4ID0gJkdPVEJhc2VbR09Ub2Zmc2V0ICogOF0gLQorICAgICAgICAgICh1bnNpZ25lZCBjaGFyKilncGRpc3RtYXBbc3RkOjptYWtlX3BhaXIoRnVuY3Rpb24sIE1SLT5nZXRDb25zdGFudFZhbCgpKV07CisgICAgICAgIGlkeCA9IGdldExvd2VyMTYoaWR4KTsKKyAgICAgICAgREVCVUcoZXJycygpIDw8ICJMREE6ICIgPDwgaWR4IDw8ICJcbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkNhbm5vdCBoYW5kbGUgZ3BkaXN0IHlldCIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBbHBoYTo6cmVsb2NfYnNyOiB7CisgICAgICBpZHggPSAoKCh1bnNpZ25lZCBjaGFyKilNUi0+Z2V0UmVzdWx0UG9pbnRlcigpIC0KKyAgICAgICAgICAgICAodW5zaWduZWQgY2hhciopUmVsb2NQb3MpID4+IDIpICsgMTsgLy9za2lwIGZpcnN0IDIgaW5zdCBvZiBmdW4KKyAgICAgICpSZWxvY1BvcyB8PSAoaWR4ICYgKCgxIDw8IDIxKS0xKSk7CisgICAgICBkb0NvbW1vbiA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICBpZiAoZG9Db21tb24pIHsKKyAgICAgIHNob3J0IHggPSAoc2hvcnQpaWR4OworICAgICAgYXNzZXJ0KHggPT0gaWR4KTsKKyAgICAgICooc2hvcnQqKVJlbG9jUG9zID0geDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFKSVRJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSklUSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzU4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSklUSW5mby5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vPT09LSBBbHBoYUpJVEluZm8uaCAtIEFscGhhIGltcGwuIG9mIHRoZSBKSVQgaW50ZXJmYWNlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFscGhhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRKSVRJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQUxQSEFfSklUSU5GT19ICisjZGVmaW5lIEFMUEhBX0pJVElORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SklUSW5mby5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBUYXJnZXRNYWNoaW5lOworCisgIGNsYXNzIEFscGhhSklUSW5mbyA6IHB1YmxpYyBUYXJnZXRKSVRJbmZvIHsKKyAgcHJvdGVjdGVkOgorICAgIFRhcmdldE1hY2hpbmUgJlRNOworICAgIAorICAgIC8vYmVjYXVzZSBncGRpc3QgYXJlIHBhaXJlZCBhbmQgcmVsYXRpdmUgdG8gdGhlIHBjIG9mIHRoZSBmaXJzdCBpbnN0LAorICAgIC8vd2UgbmVlZCB0byBoYXZlIHNvbWUgc3RhdGUKKyAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8dm9pZCosIGludD4sIHZvaWQqPiBncGRpc3RtYXA7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBbHBoYUpJVEluZm8oVGFyZ2V0TWFjaGluZSAmdG0pIDogVE0odG0pCisgICAgeyB1c2VHT1QgPSB0cnVlOyB9CisKKyAgICB2aXJ0dWFsIFN0dWJMYXlvdXQgZ2V0U3R1YkxheW91dCgpOworICAgIHZpcnR1YWwgdm9pZCAqZW1pdEZ1bmN0aW9uU3R1Yihjb25zdCBGdW5jdGlvbiogRiwgdm9pZCAqRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpOworICAgIHZpcnR1YWwgTGF6eVJlc29sdmVyRm4gZ2V0TGF6eVJlc29sdmVyRnVuY3Rpb24oSklUQ29tcGlsZXJGbik7CisgICAgdmlydHVhbCB2b2lkIHJlbG9jYXRlKHZvaWQgKkZ1bmN0aW9uLCBNYWNoaW5lUmVsb2NhdGlvbiAqTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlbG9jcywgdW5zaWduZWQgY2hhciogR09UQmFzZSk7CisKKyAgICAvLy8gcmVwbGFjZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24gLSBNYWtlIGl0IHNvIHRoYXQgY2FsbGluZyB0aGUgZnVuY3Rpb24KKyAgICAvLy8gd2hvc2UgbWFjaGluZSBjb2RlIGlzIGF0IE9MRCB0dXJucyBpbnRvIGEgY2FsbCB0byBORVcsIHBlcmhhcHMgYnkKKyAgICAvLy8gb3ZlcndyaXRpbmcgT0xEIHdpdGggYSBicmFuY2ggdG8gTkVXLiAgVGhpcyBpcyB1c2VkIGZvciBzZWxmLW1vZGlmeWluZworICAgIC8vLyBjb2RlLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCByZXBsYWNlTWFjaGluZUNvZGVGb3JGdW5jdGlvbih2b2lkICpPbGQsIHZvaWQgKk5ldyk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdPVG9mZnNldCA9IDQwOTY7CisKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhTExSUC5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhTExSUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmYmZkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFMTFJQLmNwcApAQCAtMCwwICsxLDE1OCBAQAorLy89PT0tLSBBbHBoYUxMUlAuY3BwIC0gQWxwaGEgTG9hZCBMb2FkIFJlcGxheSBUcmFwIGVsaW1pbmF0aW9uIHBhc3MuIC0tIC0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBIZXJlIHdlIGNoZWNrIGZvciBwb3RlbnRpYWwgcmVwbGF5IHRyYXBzIGludHJvZHVjZWQgYnkgdGhlIHNwaWxsZXIKKy8vIFdlIGFsc28gYWxpZ24gc29tZSBicmFuY2ggdGFyZ2V0cyBpZiB3ZSBjYW4gZG8gc28gZm9yIGZyZWUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJhbHBoYS1ub3BzIgorI2luY2x1ZGUgIkFscGhhLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRPcGVyYXRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKG5vcGludHJvLCAiTnVtYmVyIG9mIG5vcHMgaW5zZXJ0ZWQiKTsKK1NUQVRJU1RJQyhub3BhbGlnbiwgIk51bWJlciBvZiBub3BzIGluc2VydGVkIGZvciBhbGlnbm1lbnQiKTsKKworbmFtZXNwYWNlIHsKKyAgY2w6Om9wdDxib29sPgorICBBbGlnbkFsbCgiYWxwaGEtYWxpZ24tYWxsIiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiQWxpZ24gYWxsIGJsb2NrcyIpKTsKKworICBzdHJ1Y3QgQWxwaGFMTFJQUGFzcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICAvLy8gVGFyZ2V0IG1hY2hpbmUgZGVzY3JpcHRpb24gd2hpY2ggd2UgcXVlcnkgZm9yIHJlZy4gbmFtZXMsIGRhdGEKKyAgICAvLy8gbGF5b3V0LCBldGMuCisgICAgLy8vCisgICAgQWxwaGFUYXJnZXRNYWNoaW5lICZUTTsKKworICAgIHN0YXRpYyBjaGFyIElEOworICAgIEFscGhhTExSUFBhc3MoQWxwaGFUYXJnZXRNYWNoaW5lICZ0bSkgCisgICAgICA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpLCBUTSh0bSkgeyB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJBbHBoYSBOT1AgaW5zZXJ0ZXIiOworICAgIH0KKworICAgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSB7CisgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IEYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgICAgICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgICAgIE1hY2hpbmVJbnN0ciogcHJldlszXSA9IHswLDAsMH07CisgICAgICBEZWJ1Z0xvYyBkbDsKKyAgICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgICAgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBGSSA9IEYuYmVnaW4oKSwgRkUgPSBGLmVuZCgpOworICAgICAgICAgICBGSSAhPSBGRTsgKytGSSkgeworICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayYgTUJCID0gKkZJOworICAgICAgICBib29sIHViID0gZmFsc2U7CisgICAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuYmVnaW4oKTsgSSAhPSBNQkIuZW5kKCk7ICkgeworICAgICAgICAgIGlmIChjb3VudCU0ID09IDApCisgICAgICAgICAgICBwcmV2WzBdID0gcHJldlsxXSA9IHByZXZbMl0gPSAwOyAvL1Nsb3RzIGNsZWFyZWQgYXQgZmV0Y2ggYm91bmRhcnkKKyAgICAgICAgICArK2NvdW50OworICAgICAgICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBJKys7CisgICAgICAgICAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgICAgICBjYXNlIEFscGhhOjpMRFE6ICBjYXNlIEFscGhhOjpMREw6CisgICAgICAgICAgY2FzZSBBbHBoYTo6TERXVTogY2FzZSBBbHBoYTo6TERCVToKKyAgICAgICAgICBjYXNlIEFscGhhOjpMRFQ6IGNhc2UgQWxwaGE6OkxEUzoKKyAgICAgICAgICBjYXNlIEFscGhhOjpTVFE6ICBjYXNlIEFscGhhOjpTVEw6CisgICAgICAgICAgY2FzZSBBbHBoYTo6U1RXOiAgY2FzZSBBbHBoYTo6U1RCOgorICAgICAgICAgIGNhc2UgQWxwaGE6OlNUVDogY2FzZSBBbHBoYTo6U1RTOgorICAgICAgICAgICBpZiAoTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCkgPT0gQWxwaGE6OlIzMCkgeworICAgICAgICAgICAgIGlmIChwcmV2WzBdICYmIAorICAgICAgICAgICAgICAgICBwcmV2WzBdLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpID09IE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpJiYKKyAgICAgICAgICAgICAgICAgcHJldlswXS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKSA9PSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKSl7CisgICAgICAgICAgICAgICBwcmV2WzBdID0gcHJldlsxXTsKKyAgICAgICAgICAgICAgIHByZXZbMV0gPSBwcmV2WzJdOworICAgICAgICAgICAgICAgcHJldlsyXSA9IDA7CisgICAgICAgICAgICAgICBCdWlsZE1JKE1CQiwgTUksIGRsLCBUSUktPmdldChBbHBoYTo6QklTciksIEFscGhhOjpSMzEpCisgICAgICAgICAgICAgICAgIC5hZGRSZWcoQWxwaGE6OlIzMSkKKyAgICAgICAgICAgICAgICAgLmFkZFJlZyhBbHBoYTo6UjMxKTsgCisgICAgICAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsgbm9waW50cm8gKz0gMTsKKyAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2WzFdIAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcHJldlsxXS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSA9PSAKKyAgICAgICAgICAgICAgICAgICAgICAgIE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcmV2WzFdLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpID09IAorICAgICAgICAgICAgICAgICAgICAgICAgTUktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkpIHsKKyAgICAgICAgICAgICAgIHByZXZbMF0gPSBwcmV2WzJdOworICAgICAgICAgICAgICAgcHJldlsxXSA9IHByZXZbMl0gPSAwOworICAgICAgICAgICAgICAgQnVpbGRNSShNQkIsIE1JLCBkbCwgVElJLT5nZXQoQWxwaGE6OkJJU3IpLCBBbHBoYTo6UjMxKQorICAgICAgICAgICAgICAgICAuYWRkUmVnKEFscGhhOjpSMzEpCisgICAgICAgICAgICAgICAgIC5hZGRSZWcoQWxwaGE6OlIzMSk7IAorICAgICAgICAgICAgICAgQnVpbGRNSShNQkIsIE1JLCBkbCwgVElJLT5nZXQoQWxwaGE6OkJJU3IpLCBBbHBoYTo6UjMxKQorICAgICAgICAgICAgICAgICAuYWRkUmVnKEFscGhhOjpSMzEpCisgICAgICAgICAgICAgICAgIC5hZGRSZWcoQWxwaGE6OlIzMSk7CisgICAgICAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsgbm9waW50cm8gKz0gMjsKKyAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2WzJdIAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcHJldlsyXS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSA9PSAKKyAgICAgICAgICAgICAgICAgICAgICAgIE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcmV2WzJdLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpID09IAorICAgICAgICAgICAgICAgICAgICAgICAgTUktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkpIHsKKyAgICAgICAgICAgICAgIHByZXZbMF0gPSBwcmV2WzFdID0gcHJldlsyXSA9IDA7CisgICAgICAgICAgICAgICBCdWlsZE1JKE1CQiwgTUksIGRsLCBUSUktPmdldChBbHBoYTo6QklTciksIEFscGhhOjpSMzEpCisgICAgICAgICAgICAgICAgIC5hZGRSZWcoQWxwaGE6OlIzMSkuYWRkUmVnKEFscGhhOjpSMzEpOworICAgICAgICAgICAgICAgQnVpbGRNSShNQkIsIE1JLCBkbCwgVElJLT5nZXQoQWxwaGE6OkJJU3IpLCBBbHBoYTo6UjMxKQorICAgICAgICAgICAgICAgICAuYWRkUmVnKEFscGhhOjpSMzEpLmFkZFJlZyhBbHBoYTo6UjMxKTsKKyAgICAgICAgICAgICAgIEJ1aWxkTUkoTUJCLCBNSSwgZGwsIFRJSS0+Z2V0KEFscGhhOjpCSVNyKSwgQWxwaGE6OlIzMSkKKyAgICAgICAgICAgICAgICAgLmFkZFJlZyhBbHBoYTo6UjMxKS5hZGRSZWcoQWxwaGE6OlIzMSk7CisgICAgICAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsgbm9waW50cm8gKz0gMzsKKyAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHByZXZbMF0gPSBwcmV2WzFdOworICAgICAgICAgICAgIHByZXZbMV0gPSBwcmV2WzJdOworICAgICAgICAgICAgIHByZXZbMl0gPSBNSTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICAgICBwcmV2WzBdID0gcHJldlsxXTsKKyAgICAgICAgICAgcHJldlsxXSA9IHByZXZbMl07CisgICAgICAgICAgIHByZXZbMl0gPSAwOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEFscGhhOjpBTFRFTlQ6CisgICAgICAgICAgY2FzZSBBbHBoYTo6TUVNTEFCRUw6CisgICAgICAgICAgY2FzZSBBbHBoYTo6UENMQUJFTDoKKyAgICAgICAgICAgIC0tY291bnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEFscGhhOjpCUjoKKyAgICAgICAgICBjYXNlIEFscGhhOjpKTVA6CisgICAgICAgICAgICB1YiA9IHRydWU7CisgICAgICAgICAgICAvL2ZhbGwgdGhyb3VnaAorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmV2WzBdID0gcHJldlsxXTsKKyAgICAgICAgICAgIHByZXZbMV0gPSBwcmV2WzJdOworICAgICAgICAgICAgcHJldlsyXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHViIHx8IEFsaWduQWxsKSB7CisgICAgICAgICAgLy93ZSBjYW4gYWxpZ24gc3R1ZmYgZm9yIGZyZWUgYXQgdGhpcyBwb2ludAorICAgICAgICAgIHdoaWxlIChjb3VudCAlIDQpIHsKKyAgICAgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkIuZW5kKCksIGRsLCBUSUktPmdldChBbHBoYTo6QklTciksIEFscGhhOjpSMzEpCisgICAgICAgICAgICAgIC5hZGRSZWcoQWxwaGE6OlIzMSkuYWRkUmVnKEFscGhhOjpSMzEpOworICAgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgICAgICsrbm9wYWxpZ247CisgICAgICAgICAgICBwcmV2WzBdID0gcHJldlsxXTsKKyAgICAgICAgICAgIHByZXZbMV0gPSBwcmV2WzJdOworICAgICAgICAgICAgcHJldlsyXSA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gQ2hhbmdlZDsKKyAgICB9CisgIH07CisgIGNoYXIgQWxwaGFMTFJQUGFzczo6SUQgPSAwOworfSAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUFscGhhTExSUFBhc3MoQWxwaGFUYXJnZXRNYWNoaW5lICZ0bSkgeworICByZXR1cm4gbmV3IEFscGhhTExSUFBhc3ModG0pOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYU1DQXNtSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhTUNBc21JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzVlODg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYU1DQXNtSW5mby5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy89PT0tLSBBbHBoYU1DQXNtSW5mby5jcHAgLSBBbHBoYSBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiB0aGUgQWxwaGFNQ0FzbUluZm8gcHJvcGVydGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQWxwaGFNQ0FzbUluZm8uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitBbHBoYU1DQXNtSW5mbzo6QWxwaGFNQ0FzbUluZm8oY29uc3QgVGFyZ2V0ICZULCBTdHJpbmdSZWYgVFQpIHsKKyAgQWxpZ25tZW50SXNJbkJ5dGVzID0gZmFsc2U7CisgIFByaXZhdGVHbG9iYWxQcmVmaXggPSAiJCI7CisgIEdQUmVsMzJEaXJlY3RpdmUgPSAiLmdwcmVsMzIiOworICBXZWFrUmVmRGlyZWN0aXZlID0gIlx0LndlYWtcdCI7CisgIEhhc1NldERpcmVjdGl2ZSA9IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYU1DQXNtSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYU1DQXNtSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzg0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhTUNBc21JbmZvLmgKQEAgLTAsMCArMSwyOSBAQAorLy89PT09PS0tIEFscGhhTUNBc21JbmZvLmggLSBBbHBoYSBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLS09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBBbHBoYU1DQXNtSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEFMUEhBVEFSR0VUQVNNSU5GT19ICisjZGVmaW5lIEFMUEhBVEFSR0VUQVNNSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFRhcmdldDsKKworICBzdHJ1Y3QgQWxwaGFNQ0FzbUluZm8gOiBwdWJsaWMgTUNBc21JbmZvIHsKKyAgICBleHBsaWNpdCBBbHBoYU1DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCk7CisgIH07CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhTWFjaGluZUZ1bmN0aW9uSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYU1hY2hpbmVGdW5jdGlvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY3MzhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYU1hY2hpbmVGdW5jdGlvbkluZm8uaApAQCAtMCwwICsxLDYyIEBACisvLz09PT0tIEFscGhhTWFjaGluZUZ1Y3Rpb25JbmZvLmggLSBBbHBoYSBtYWNoaW5lIGZ1bmN0aW9uIGluZm8gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBBbHBoYS1zcGVjaWZpYyBwZXItbWFjaGluZS1mdW5jdGlvbiBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEFMUEhBTUFDSElORUZVTkNUSU9OSU5GT19ICisjZGVmaW5lIEFMUEhBTUFDSElORUZVTkNUSU9OSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEFscGhhTWFjaGluZUZ1bmN0aW9uSW5mbyAtIFRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIE1hY2hpbmVGdW5jdGlvbgorLy8vIHByaXZhdGUgQWxwaGEgdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBlYWNoIE1hY2hpbmVGdW5jdGlvbi4KK2NsYXNzIEFscGhhTWFjaGluZUZ1bmN0aW9uSW5mbyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25JbmZvIHsKKyAgLy8vIEdsb2JhbEJhc2VSZWcgLSBrZWVwcyB0cmFjayBvZiB0aGUgdmlydHVhbCByZWdpc3RlciBpbml0aWFsaXplZCBmb3IKKyAgLy8vIHVzZSBhcyB0aGUgZ2xvYmFsIGJhc2UgcmVnaXN0ZXIuIFRoaXMgaXMgdXNlZCBmb3IgUElDIGluIHNvbWUgUElDCisgIC8vLyByZWxvY2F0aW9uIG1vZGVscy4KKyAgdW5zaWduZWQgR2xvYmFsQmFzZVJlZzsKKworICAvLy8gR2xvYmFsUmV0QWRkciA9IGtlZXBzIHRyYWNrIG9mIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGluaXRpYWxpemVkIGZvcgorICAvLy8gdGhlIHJldHVybiBhZGRyZXNzIHZhbHVlLgorICB1bnNpZ25lZCBHbG9iYWxSZXRBZGRyOworCisgIC8vLyBWYXJBcmdzT2Zmc2V0IC0gV2hhdCBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCB2YWFyZworICBpbnQgVmFyQXJnc09mZnNldDsKKyAgLy8vIFZhckFyZ3NCYXNlIC0gV2hhdCBpcyB0aGUgYmFzZSBGcmFtZUluZGV4CisgIGludCBWYXJBcmdzQmFzZTsKKworcHVibGljOgorICBBbHBoYU1hY2hpbmVGdW5jdGlvbkluZm8oKSA6IEdsb2JhbEJhc2VSZWcoMCksIEdsb2JhbFJldEFkZHIoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyQXJnc09mZnNldCgwKSwgVmFyQXJnc0Jhc2UoMCkge30KKworICBleHBsaWNpdCBBbHBoYU1hY2hpbmVGdW5jdGlvbkluZm8oTWFjaGluZUZ1bmN0aW9uICZNRikgOiBHbG9iYWxCYXNlUmVnKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxSZXRBZGRyKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJBcmdzT2Zmc2V0KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJBcmdzQmFzZSgwKSB7fQorCisgIHVuc2lnbmVkIGdldEdsb2JhbEJhc2VSZWcoKSBjb25zdCB7IHJldHVybiBHbG9iYWxCYXNlUmVnOyB9CisgIHZvaWQgc2V0R2xvYmFsQmFzZVJlZyh1bnNpZ25lZCBSZWcpIHsgR2xvYmFsQmFzZVJlZyA9IFJlZzsgfQorCisgIHVuc2lnbmVkIGdldEdsb2JhbFJldEFkZHIoKSBjb25zdCB7IHJldHVybiBHbG9iYWxSZXRBZGRyOyB9CisgIHZvaWQgc2V0R2xvYmFsUmV0QWRkcih1bnNpZ25lZCBSZWcpIHsgR2xvYmFsUmV0QWRkciA9IFJlZzsgfQorCisgIGludCBnZXRWYXJBcmdzT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gVmFyQXJnc09mZnNldDsgfQorICB2b2lkIHNldFZhckFyZ3NPZmZzZXQoaW50IE9mZnNldCkgeyBWYXJBcmdzT2Zmc2V0ID0gT2Zmc2V0OyB9CisKKyAgaW50IGdldFZhckFyZ3NCYXNlKCkgY29uc3QgeyByZXR1cm4gVmFyQXJnc0Jhc2U7IH0KKyAgdm9pZCBzZXRWYXJBcmdzQmFzZShpbnQgQmFzZSkgeyBWYXJBcmdzQmFzZSA9IEJhc2U7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYVJlZ2lzdGVySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhUmVnaXN0ZXJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzlkOTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYVJlZ2lzdGVySW5mby5jcHAKQEAgLTAsMCArMSwzMTkgQEAKKy8vPT09LSBBbHBoYVJlZ2lzdGVySW5mby5jcHAgLSBBbHBoYSBSZWdpc3RlciBJbmZvcm1hdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBbHBoYSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicmVnaW5mbyIKKyNpbmNsdWRlICJBbHBoYS5oIgorI2luY2x1ZGUgIkFscGhhUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvL1RoZXNlIGRlc2NyaWJlIExEQXgKK3N0YXRpYyBjb25zdCBpbnQgSU1NX0xPVyAgPSAtMzI3Njg7CitzdGF0aWMgY29uc3QgaW50IElNTV9ISUdIID0gMzI3Njc7CitzdGF0aWMgY29uc3QgaW50IElNTV9NVUxUID0gNjU1MzY7CisKK3N0YXRpYyBsb25nIGdldFVwcGVyMTYobG9uZyBsKQoreworICBsb25nIHkgPSBsIC8gSU1NX01VTFQ7CisgIGlmIChsICUgSU1NX01VTFQgPiBJTU1fSElHSCkKKyAgICArK3k7CisgIHJldHVybiB5OworfQorCitzdGF0aWMgbG9uZyBnZXRMb3dlcjE2KGxvbmcgbCkKK3sKKyAgbG9uZyBoID0gZ2V0VXBwZXIxNihsKTsKKyAgcmV0dXJuIGwgLSBoICogSU1NX01VTFQ7Cit9CisKK0FscGhhUmVnaXN0ZXJJbmZvOjpBbHBoYVJlZ2lzdGVySW5mbyhjb25zdCBUYXJnZXRJbnN0ckluZm8gJnRpaSkKKyAgOiBBbHBoYUdlblJlZ2lzdGVySW5mbyhBbHBoYTo6QURKVVNUU1RBQ0tET1dOLCBBbHBoYTo6QURKVVNUU1RBQ0tVUCksCisgICAgVElJKHRpaSksIGN1cmdwZGlzdCgwKQoreworfQorCitjb25zdCB1bnNpZ25lZCogQWxwaGFSZWdpc3RlckluZm86OmdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIENhbGxlZVNhdmVkUmVnc1tdID0geworICAgIEFscGhhOjpSOSwgQWxwaGE6OlIxMCwKKyAgICBBbHBoYTo6UjExLCBBbHBoYTo6UjEyLAorICAgIEFscGhhOjpSMTMsIEFscGhhOjpSMTQsCisgICAgQWxwaGE6OkYyLCBBbHBoYTo6RjMsCisgICAgQWxwaGE6OkY0LCBBbHBoYTo6RjUsCisgICAgQWxwaGE6OkY2LCBBbHBoYTo6RjcsCisgICAgQWxwaGE6OkY4LCBBbHBoYTo6RjksICAwCisgIH07CisgIHJldHVybiBDYWxsZWVTYXZlZFJlZ3M7Cit9CisKK0JpdFZlY3RvciBBbHBoYVJlZ2lzdGVySW5mbzo6Z2V0UmVzZXJ2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgQml0VmVjdG9yIFJlc2VydmVkKGdldE51bVJlZ3MoKSk7CisgIFJlc2VydmVkLnNldChBbHBoYTo6UjE1KTsKKyAgUmVzZXJ2ZWQuc2V0KEFscGhhOjpSMzApOworICBSZXNlcnZlZC5zZXQoQWxwaGE6OlIzMSk7CisgIHJldHVybiBSZXNlcnZlZDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFN0YWNrIEZyYW1lIFByb2Nlc3NpbmcgbWV0aG9kcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gaGFzRlAgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGEgZGVkaWNhdGVkIGZyYW1lCisvLyBwb2ludGVyIHJlZ2lzdGVyLiAgVGhpcyBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBoYXMgdmFyaWFibGUgc2l6ZWQgYWxsb2NhcyBvcgorLy8gaWYgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbiBpcyBkaXNhYmxlZC4KKy8vCitib29sIEFscGhhUmVnaXN0ZXJJbmZvOjpoYXNGUChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICByZXR1cm4gTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKTsKK30KKwordm9pZCBBbHBoYVJlZ2lzdGVySW5mbzo6CitlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIGNvbnN0IHsKKyAgaWYgKGhhc0ZQKE1GKSkgeworICAgIC8vIElmIHdlIGhhdmUgYSBmcmFtZSBwb2ludGVyLCB0dXJuIHRoZSBhZGpjYWxsc3RhY2t1cCBpbnN0cnVjdGlvbiBpbnRvIGEKKyAgICAvLyAnc3ViIEVTUCwgPGFtdD4nIGFuZCB0aGUgYWRqY2FsbHN0YWNrZG93biBpbnN0cnVjdGlvbiBpbnRvICdhZGQgRVNQLAorICAgIC8vIDxhbXQ+JworICAgIE1hY2hpbmVJbnN0ciAqT2xkID0gSTsKKyAgICB1aW50NjRfdCBBbW91bnQgPSBPbGQtPmdldE9wZXJhbmQoMCkuZ2V0SW1tKCk7CisgICAgaWYgKEFtb3VudCAhPSAwKSB7CisgICAgICAvLyBXZSBuZWVkIHRvIGtlZXAgdGhlIHN0YWNrIGFsaWduZWQgcHJvcGVybHkuICBUbyBkbyB0aGlzLCB3ZSByb3VuZCB0aGUKKyAgICAgIC8vIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRoZSBvdXRnb2luZyBhcmd1bWVudHMgdXAgdG8gdGhlIG5leHQKKyAgICAgIC8vIGFsaWdubWVudCBib3VuZGFyeS4KKyAgICAgIHVuc2lnbmVkIEFsaWduID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrQWxpZ25tZW50KCk7CisgICAgICBBbW91bnQgPSAoQW1vdW50K0FsaWduLTEpL0FsaWduKkFsaWduOworCisgICAgICBNYWNoaW5lSW5zdHIgKk5ldzsKKyAgICAgIGlmIChPbGQtPmdldE9wY29kZSgpID09IEFscGhhOjpBREpVU1RTVEFDS0RPV04pIHsKKyAgICAgICAgTmV3PUJ1aWxkTUkoTUYsIE9sZC0+Z2V0RGVidWdMb2MoKSwgVElJLmdldChBbHBoYTo6TERBKSwgQWxwaGE6OlIzMCkKKyAgICAgICAgICAuYWRkSW1tKC1BbW91bnQpLmFkZFJlZyhBbHBoYTo6UjMwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBhc3NlcnQoT2xkLT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6QURKVVNUU1RBQ0tVUCk7CisgICAgICAgICBOZXc9QnVpbGRNSShNRiwgT2xkLT5nZXREZWJ1Z0xvYygpLCBUSUkuZ2V0KEFscGhhOjpMREEpLCBBbHBoYTo6UjMwKQorICAgICAgICAgIC5hZGRJbW0oQW1vdW50KS5hZGRSZWcoQWxwaGE6OlIzMCk7CisgICAgICB9CisKKyAgICAgIC8vIFJlcGxhY2UgdGhlIHBzZXVkbyBpbnN0cnVjdGlvbiB3aXRoIGEgbmV3IGluc3RydWN0aW9uLi4uCisgICAgICBNQkIuaW5zZXJ0KEksIE5ldyk7CisgICAgfQorICB9CisKKyAgTUJCLmVyYXNlKEkpOworfQorCisvL0FscGhhIGhhcyBhIHNsaWdodGx5IGZ1bm55IHN0YWNrOgorLy9BcmdzCisvLzwtIGluY29taW5nIFNQCisvL2ZpeGVkIGxvY2FscyAoYW5kIHNwaWxscywgY2FsbGVlIHNhdmVkLCBldGMpCisvLzwtIEZQCisvL3ZhcmlhYmxlIGxvY2FscworLy88LSBTUAorCit1bnNpZ25lZAorQWxwaGFSZWdpc3RlckluZm86OmVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3QgeworICBhc3NlcnQoU1BBZGogPT0gMCAmJiAiVW5leHBlY3RlZCIpOworCisgIHVuc2lnbmVkIGkgPSAwOworICBNYWNoaW5lSW5zdHIgJk1JID0gKklJOworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1JLmdldFBhcmVudCgpOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgYm9vbCBGUCA9IGhhc0ZQKE1GKTsKKworICB3aGlsZSAoIU1JLmdldE9wZXJhbmQoaSkuaXNGSSgpKSB7CisgICAgKytpOworICAgIGFzc2VydChpIDwgTUkuZ2V0TnVtT3BlcmFuZHMoKSAmJiAiSW5zdHIgZG9lc24ndCBoYXZlIEZyYW1lSW5kZXggb3BlcmFuZCEiKTsKKyAgfQorCisgIGludCBGcmFtZUluZGV4ID0gTUkuZ2V0T3BlcmFuZChpKS5nZXRJbmRleCgpOworCisgIC8vIEFkZCB0aGUgYmFzZSByZWdpc3RlciBvZiBSMzAgKFNQKSBvciBSMTUgKEZQKS4KKyAgTUkuZ2V0T3BlcmFuZChpICsgMSkuQ2hhbmdlVG9SZWdpc3RlcihGUCA/IEFscGhhOjpSMTUgOiBBbHBoYTo6UjMwLCBmYWxzZSk7CisKKyAgLy8gTm93IGFkZCB0aGUgZnJhbWUgb2JqZWN0IG9mZnNldCB0byB0aGUgb2Zmc2V0IGZyb20gdGhlIHZpcnR1YWwgZnJhbWUgaW5kZXguCisgIGludCBPZmZzZXQgPSBNRi5nZXRGcmFtZUluZm8oKS0+Z2V0T2JqZWN0T2Zmc2V0KEZyYW1lSW5kZXgpOworCisgIERFQlVHKGVycnMoKSA8PCAiRkk6ICIgPDwgRnJhbWVJbmRleCA8PCAiIE9mZnNldDogIiA8PCBPZmZzZXQgPDwgIlxuIik7CisKKyAgT2Zmc2V0ICs9IE1GLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja1NpemUoKTsKKworICBERUJVRyhlcnJzKCkgPDwgIkNvcnJlY3RlZCBPZmZzZXQgIiA8PCBPZmZzZXQKKyAgICAgICA8PCAiIGZvciBzdGFjayBzaXplOiAiIDw8IE1GLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja1NpemUoKSA8PCAiXG4iKTsKKworICBpZiAoT2Zmc2V0ID4gSU1NX0hJR0ggfHwgT2Zmc2V0IDwgSU1NX0xPVykgeworICAgIERFQlVHKGVycnMoKSA8PCAiVW5jb25kaXRpb25hbGx5IHVzaW5nIFIyOCBmb3IgZXZpbCBwdXJwb3NlcyBPZmZzZXQ6ICIKKyAgICAgICAgICA8PCBPZmZzZXQgPDwgIlxuIik7CisgICAgLy9zbyBpbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gdXNlIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLCBhbmQgbW92ZSB0aGUKKyAgICAvL29yaWdpbmFsIGluc3Qgb2ZmIHRoZSBTUC9GUAorICAgIC8vZml4IHVwIHRoZSBvbGQ6CisgICAgTUkuZ2V0T3BlcmFuZChpICsgMSkuQ2hhbmdlVG9SZWdpc3RlcihBbHBoYTo6UjI4LCBmYWxzZSk7CisgICAgTUkuZ2V0T3BlcmFuZChpKS5DaGFuZ2VUb0ltbWVkaWF0ZShnZXRMb3dlcjE2KE9mZnNldCkpOworICAgIC8vaW5zZXJ0IHRoZSBuZXcKKyAgICBNYWNoaW5lSW5zdHIqIG5NST1CdWlsZE1JKE1GLCBNSS5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLmdldChBbHBoYTo6TERBSCksIEFscGhhOjpSMjgpCisgICAgICAuYWRkSW1tKGdldFVwcGVyMTYoT2Zmc2V0KSkuYWRkUmVnKEZQID8gQWxwaGE6OlIxNSA6IEFscGhhOjpSMzApOworICAgIE1CQi5pbnNlcnQoSUksIG5NSSk7CisgIH0gZWxzZSB7CisgICAgTUkuZ2V0T3BlcmFuZChpKS5DaGFuZ2VUb0ltbWVkaWF0ZShPZmZzZXQpOworICB9CisgIHJldHVybiAwOworfQorCisKK3ZvaWQgQWxwaGFSZWdpc3RlckluZm86OmVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIgPSBNRi5mcm9udCgpOyAgIC8vIFByb2xvZyBnb2VzIGluIGVudHJ5IEJCCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gTUJCLmJlZ2luKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBEZWJ1Z0xvYyBkbCA9IChNQkJJICE9IE1CQi5lbmQoKSA/IE1CQkktPmdldERlYnVnTG9jKCkgOiBEZWJ1Z0xvYygpKTsKKyAgYm9vbCBGUCA9IGhhc0ZQKE1GKTsKKworICAvL2hhbmRsZSBHT1Agb2Zmc2V0CisgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBbHBoYTo6TERBSGcpLCBBbHBoYTo6UjI5KQorICAgIC5hZGRHbG9iYWxBZGRyZXNzKE1GLmdldEZ1bmN0aW9uKCkpCisgICAgLmFkZFJlZyhBbHBoYTo6UjI3KS5hZGRJbW0oKytjdXJncGRpc3QpOworICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQWxwaGE6OkxEQWcpLCBBbHBoYTo6UjI5KQorICAgIC5hZGRHbG9iYWxBZGRyZXNzKE1GLmdldEZ1bmN0aW9uKCkpCisgICAgLmFkZFJlZyhBbHBoYTo6UjI5KS5hZGRJbW0oY3VyZ3BkaXN0KTsKKworICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQWxwaGE6OkFMVEVOVCkpCisgICAgLmFkZEdsb2JhbEFkZHJlc3MoTUYuZ2V0RnVuY3Rpb24oKSk7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgRnJhbWVJbmZvCisgIGxvbmcgTnVtQnl0ZXMgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworCisgIGlmIChGUCkKKyAgICBOdW1CeXRlcyArPSA4OyAvL3Jlc2VydmUgc3BhY2UgZm9yIHRoZSBvbGQgRlAKKworICAvLyBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjaz8KKyAgaWYgKE51bUJ5dGVzID09IDApIHJldHVybjsKKworICB1bnNpZ25lZCBBbGlnbiA9IE1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja0FsaWdubWVudCgpOworICBOdW1CeXRlcyA9IChOdW1CeXRlcytBbGlnbi0xKS9BbGlnbipBbGlnbjsKKworICAvLyBVcGRhdGUgZnJhbWUgaW5mbyB0byBwcmV0ZW5kIHRoYXQgdGhpcyBpcyBwYXJ0IG9mIHRoZSBzdGFjay4uLgorICBNRkktPnNldFN0YWNrU2l6ZShOdW1CeXRlcyk7CisKKyAgLy8gYWRqdXN0IHN0YWNrIHBvaW50ZXI6IHIzMCAtPSBudW1ieXRlcworICBOdW1CeXRlcyA9IC1OdW1CeXRlczsKKyAgaWYgKE51bUJ5dGVzID49IElNTV9MT1cpIHsKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQWxwaGE6OkxEQSksIEFscGhhOjpSMzApLmFkZEltbShOdW1CeXRlcykKKyAgICAgIC5hZGRSZWcoQWxwaGE6OlIzMCk7CisgIH0gZWxzZSBpZiAoZ2V0VXBwZXIxNihOdW1CeXRlcykgPj0gSU1NX0xPVykgeworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBbHBoYTo6TERBSCksIEFscGhhOjpSMzApCisgICAgICAuYWRkSW1tKGdldFVwcGVyMTYoTnVtQnl0ZXMpKS5hZGRSZWcoQWxwaGE6OlIzMCk7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFscGhhOjpMREEpLCBBbHBoYTo6UjMwKQorICAgICAgLmFkZEltbShnZXRMb3dlcjE2KE51bUJ5dGVzKSkuYWRkUmVnKEFscGhhOjpSMzApOworICB9IGVsc2UgeworICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiVG9vIGJpZyBhIHN0YWNrIGZyYW1lIGF0ICIgKyBUd2luZShOdW1CeXRlcykpOworICB9CisKKyAgLy9ub3cgaWYgd2UgbmVlZCB0bywgc2F2ZSB0aGUgb2xkIEZQIGFuZCBzZXQgdGhlIG5ldworICBpZiAoRlApCisgIHsKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQWxwaGE6OlNUUSkpCisgICAgICAuYWRkUmVnKEFscGhhOjpSMTUpLmFkZEltbSgwKS5hZGRSZWcoQWxwaGE6OlIzMCk7CisgICAgLy90aGlzIG11c3QgYmUgdGhlIGxhc3QgaW5zdHIgaW4gdGhlIHByb2xvZworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBbHBoYTo6QklTciksIEFscGhhOjpSMTUpCisgICAgICAuYWRkUmVnKEFscGhhOjpSMzApLmFkZFJlZyhBbHBoYTo6UjMwKTsKKyAgfQorCit9CisKK3ZvaWQgQWxwaGFSZWdpc3RlckluZm86OmVtaXRFcGlsb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0IHsKKyAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gcHJpb3IoTUJCLmVuZCgpKTsKKyAgYXNzZXJ0KChNQkJJLT5nZXRPcGNvZGUoKSA9PSBBbHBoYTo6UkVUREFHIHx8CisgICAgICAgICAgTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gQWxwaGE6OlJFVERBR3ApCisgICAgICAgICAmJiAiQ2FuIG9ubHkgaW5zZXJ0IGVwaWxvZyBpbnRvIHJldHVybmluZyBibG9ja3MiKTsKKyAgRGVidWdMb2MgZGwgPSBNQkJJLT5nZXREZWJ1Z0xvYygpOworCisgIGJvb2wgRlAgPSBoYXNGUChNRik7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZyb20gdGhlIEZyYW1lSW5mby4uLgorICBsb25nIE51bUJ5dGVzID0gTUZJLT5nZXRTdGFja1NpemUoKTsKKworICAvL25vdyBpZiB3ZSBuZWVkIHRvLCByZXN0b3JlIHRoZSBvbGQgRlAKKyAgaWYgKEZQKSB7CisgICAgLy9jb3B5IHRoZSBGUCBpbnRvIHRoZSBTUCAoZGlzY2FyZHMgYWxsb2NhcykKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQWxwaGE6OkJJU3IpLCBBbHBoYTo6UjMwKS5hZGRSZWcoQWxwaGE6OlIxNSkKKyAgICAgIC5hZGRSZWcoQWxwaGE6OlIxNSk7CisgICAgLy9yZXN0b3JlIHRoZSBGUAorICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBbHBoYTo6TERRKSwgQWxwaGE6OlIxNSkKKyAgICAgIC5hZGRJbW0oMCkuYWRkUmVnKEFscGhhOjpSMTUpOworICB9CisKKyAgaWYgKE51bUJ5dGVzICE9IDApIHsKKyAgICBpZiAoTnVtQnl0ZXMgPD0gSU1NX0hJR0gpIHsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBbHBoYTo6TERBKSwgQWxwaGE6OlIzMCkuYWRkSW1tKE51bUJ5dGVzKQorICAgICAgICAuYWRkUmVnKEFscGhhOjpSMzApOworICAgIH0gZWxzZSBpZiAoZ2V0VXBwZXIxNihOdW1CeXRlcykgPD0gSU1NX0hJR0gpIHsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBbHBoYTo6TERBSCksIEFscGhhOjpSMzApCisgICAgICAgIC5hZGRJbW0oZ2V0VXBwZXIxNihOdW1CeXRlcykpLmFkZFJlZyhBbHBoYTo6UjMwKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChBbHBoYTo6TERBKSwgQWxwaGE6OlIzMCkKKyAgICAgICAgLmFkZEltbShnZXRMb3dlcjE2KE51bUJ5dGVzKSkuYWRkUmVnKEFscGhhOjpSMzApOworICAgIH0gZWxzZSB7CisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlRvbyBiaWcgYSBzdGFjayBmcmFtZSBhdCAiICsgVHdpbmUoTnVtQnl0ZXMpKTsKKyAgICB9CisgIH0KK30KKwordW5zaWduZWQgQWxwaGFSZWdpc3RlckluZm86OmdldFJBUmVnaXN0ZXIoKSBjb25zdCB7CisgIHJldHVybiBBbHBoYTo6UjI2OworfQorCit1bnNpZ25lZCBBbHBoYVJlZ2lzdGVySW5mbzo6Z2V0RnJhbWVSZWdpc3Rlcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIHJldHVybiBoYXNGUChNRikgPyBBbHBoYTo6UjE1IDogQWxwaGE6OlIzMDsKK30KKwordW5zaWduZWQgQWxwaGFSZWdpc3RlckluZm86OmdldEVIRXhjZXB0aW9uUmVnaXN0ZXIoKSBjb25zdCB7CisgIGxsdm1fdW5yZWFjaGFibGUoIldoYXQgaXMgdGhlIGV4Y2VwdGlvbiByZWdpc3RlciIpOworICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgQWxwaGFSZWdpc3RlckluZm86OmdldEVISGFuZGxlclJlZ2lzdGVyKCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJXaGF0IGlzIHRoZSBleGNlcHRpb24gaGFuZGxlciByZWdpc3RlciIpOworICByZXR1cm4gMDsKK30KKworaW50IEFscGhhUmVnaXN0ZXJJbmZvOjpnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJXaGF0IGlzIHRoZSBkd2FyZiByZWdpc3RlciBudW1iZXIiKTsKKyAgcmV0dXJuIC0xOworfQorCisjaW5jbHVkZSAiQWxwaGFHZW5SZWdpc3RlckluZm8uaW5jIgorCitzdGQ6OnN0cmluZyBBbHBoYVJlZ2lzdGVySW5mbzo6Z2V0UHJldHR5TmFtZSh1bnNpZ25lZCByZWcpCit7CisgIHN0ZDo6c3RyaW5nIHMoUmVnaXN0ZXJEZXNjcmlwdG9yc1tyZWddLk5hbWUpOworICByZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFSZWdpc3RlckluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFSZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWZkODdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYVJlZ2lzdGVySW5mby5oCkBAIC0wLDAgKzEsNjggQEAKKy8vPT09LSBBbHBoYVJlZ2lzdGVySW5mby5oIC0gQWxwaGEgUmVnaXN0ZXIgSW5mb3JtYXRpb24gSW1wbCAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBbHBoYSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQUxQSEFSRUdJU1RFUklORk9fSAorI2RlZmluZSBBTFBIQVJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJBbHBoYUdlblJlZ2lzdGVySW5mby5oLmluYyIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUeXBlOworCitzdHJ1Y3QgQWxwaGFSZWdpc3RlckluZm8gOiBwdWJsaWMgQWxwaGFHZW5SZWdpc3RlckluZm8geworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSTsKKworICBBbHBoYVJlZ2lzdGVySW5mbyhjb25zdCBUYXJnZXRJbnN0ckluZm8gJnRpaSk7CisKKyAgLy8vIENvZGUgR2VuZXJhdGlvbiB2aXJ0dWFsIG1ldGhvZHMuLi4KKyAgY29uc3QgdW5zaWduZWQgKmdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gMCkgY29uc3Q7CisKKyAgQml0VmVjdG9yIGdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICBib29sIGhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIHZvaWQgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdDsKKworICB1bnNpZ25lZCBlbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGosIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMgPSBOVUxMKSBjb25zdDsKKworICAvL3ZvaWQgcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlRnJhbWVGaW5hbGl6ZWQoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgdm9pZCBlbWl0UHJvbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIHZvaWQgZW1pdEVwaWxvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0OworCisgIC8vIERlYnVnIGluZm9ybWF0aW9uIHF1ZXJpZXMuCisgIHVuc2lnbmVkIGdldFJBUmVnaXN0ZXIoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0RnJhbWVSZWdpc3Rlcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLyBFeGNlcHRpb24gaGFuZGxpbmcgcXVlcmllcy4KKyAgdW5zaWduZWQgZ2V0RUhFeGNlcHRpb25SZWdpc3RlcigpIGNvbnN0OworICB1bnNpZ25lZCBnZXRFSEhhbmRsZXJSZWdpc3RlcigpIGNvbnN0OworCisgIGludCBnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3Q7CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFByZXR0eU5hbWUodW5zaWduZWQgcmVnKTsKKyAgCitwcml2YXRlOgorICBtdXRhYmxlIGludCBjdXJncGRpc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFSZWdpc3RlckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhUmVnaXN0ZXJJbmZvLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzAxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhUmVnaXN0ZXJJbmZvLnRkCkBAIC0wLDAgKzEsMTcxIEBACisvLz09PS0gQWxwaGFSZWdpc3RlckluZm8udGQgLSBUaGUgQWxwaGEgUmVnaXN0ZXIgRmlsZSAtLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgQWxwaGEgcmVnaXN0ZXIgc2V0Lg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitjbGFzcyBBbHBoYVJlZzxzdHJpbmcgbj4gOiBSZWdpc3RlcjxuPiB7DQorICBmaWVsZCBiaXRzPDU+IE51bTsNCisgIGxldCBOYW1lc3BhY2UgPSAiQWxwaGEiOw0KK30NCisNCisvLyBXZSBpZGVudGlmeSBhbGwgb3VyIHJlZ2lzdGVycyB3aXRoIGEgNS1iaXQgSUQsIGZvciBjb25zaXN0ZW5jeSdzIHNha2UuDQorDQorLy8gR1BSIC0gT25lIG9mIHRoZSAzMiAzMi1iaXQgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycw0KK2NsYXNzIEdQUjxiaXRzPDU+IG51bSwgc3RyaW5nIG4+IDogQWxwaGFSZWc8bj4gew0KKyAgbGV0IE51bSA9IG51bTsNCit9DQorDQorLy8gRlBSIC0gT25lIG9mIHRoZSAzMiA2NC1iaXQgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzDQorY2xhc3MgRlBSPGJpdHM8NT4gbnVtLCBzdHJpbmcgbj4gOiBBbHBoYVJlZzxuPiB7DQorICBsZXQgTnVtID0gbnVtOw0KK30NCisNCisvLyNkZWZpbmUgRlAgICAgJDE1DQorLy8jZGVmaW5lIFJBICAgICQyNg0KKy8vI2RlZmluZSBQViAgICAkMjcNCisvLyNkZWZpbmUgR1AgICAgJDI5DQorLy8jZGVmaW5lIFNQICAgICQzMA0KKw0KKy8vIEdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMNCitkZWYgUjAgIDogR1BSPCAwLCAgIiQwIj4sIER3YXJmUmVnTnVtPFswXT47DQorZGVmIFIxICA6IEdQUjwgMSwgICIkMSI+LCBEd2FyZlJlZ051bTxbMV0+Ow0KK2RlZiBSMiAgOiBHUFI8IDIsICAiJDIiPiwgRHdhcmZSZWdOdW08WzJdPjsNCitkZWYgUjMgIDogR1BSPCAzLCAgIiQzIj4sIER3YXJmUmVnTnVtPFszXT47DQorZGVmIFI0ICA6IEdQUjwgNCwgICIkNCI+LCBEd2FyZlJlZ051bTxbNF0+Ow0KK2RlZiBSNSAgOiBHUFI8IDUsICAiJDUiPiwgRHdhcmZSZWdOdW08WzVdPjsNCitkZWYgUjYgIDogR1BSPCA2LCAgIiQ2Ij4sIER3YXJmUmVnTnVtPFs2XT47DQorZGVmIFI3ICA6IEdQUjwgNywgICIkNyI+LCBEd2FyZlJlZ051bTxbN10+Ow0KK2RlZiBSOCAgOiBHUFI8IDgsICAiJDgiPiwgRHdhcmZSZWdOdW08WzhdPjsNCitkZWYgUjkgIDogR1BSPCA5LCAgIiQ5Ij4sIER3YXJmUmVnTnVtPFs5XT47DQorZGVmIFIxMCA6IEdQUjwxMCwgIiQxMCI+LCBEd2FyZlJlZ051bTxbMTBdPjsNCitkZWYgUjExIDogR1BSPDExLCAiJDExIj4sIER3YXJmUmVnTnVtPFsxMV0+Ow0KK2RlZiBSMTIgOiBHUFI8MTIsICIkMTIiPiwgRHdhcmZSZWdOdW08WzEyXT47DQorZGVmIFIxMyA6IEdQUjwxMywgIiQxMyI+LCBEd2FyZlJlZ051bTxbMTNdPjsNCitkZWYgUjE0IDogR1BSPDE0LCAiJDE0Ij4sIER3YXJmUmVnTnVtPFsxNF0+Ow0KK2RlZiBSMTUgOiBHUFI8MTUsICIkMTUiPiwgRHdhcmZSZWdOdW08WzE1XT47DQorZGVmIFIxNiA6IEdQUjwxNiwgIiQxNiI+LCBEd2FyZlJlZ051bTxbMTZdPjsNCitkZWYgUjE3IDogR1BSPDE3LCAiJDE3Ij4sIER3YXJmUmVnTnVtPFsxN10+Ow0KK2RlZiBSMTggOiBHUFI8MTgsICIkMTgiPiwgRHdhcmZSZWdOdW08WzE4XT47DQorZGVmIFIxOSA6IEdQUjwxOSwgIiQxOSI+LCBEd2FyZlJlZ051bTxbMTldPjsNCitkZWYgUjIwIDogR1BSPDIwLCAiJDIwIj4sIER3YXJmUmVnTnVtPFsyMF0+Ow0KK2RlZiBSMjEgOiBHUFI8MjEsICIkMjEiPiwgRHdhcmZSZWdOdW08WzIxXT47DQorZGVmIFIyMiA6IEdQUjwyMiwgIiQyMiI+LCBEd2FyZlJlZ051bTxbMjJdPjsNCitkZWYgUjIzIDogR1BSPDIzLCAiJDIzIj4sIER3YXJmUmVnTnVtPFsyM10+Ow0KK2RlZiBSMjQgOiBHUFI8MjQsICIkMjQiPiwgRHdhcmZSZWdOdW08WzI0XT47DQorZGVmIFIyNSA6IEdQUjwyNSwgIiQyNSI+LCBEd2FyZlJlZ051bTxbMjVdPjsNCitkZWYgUjI2IDogR1BSPDI2LCAiJDI2Ij4sIER3YXJmUmVnTnVtPFsyNl0+Ow0KK2RlZiBSMjcgOiBHUFI8MjcsICIkMjciPiwgRHdhcmZSZWdOdW08WzI3XT47DQorZGVmIFIyOCA6IEdQUjwyOCwgIiQyOCI+LCBEd2FyZlJlZ051bTxbMjhdPjsNCitkZWYgUjI5IDogR1BSPDI5LCAiJDI5Ij4sIER3YXJmUmVnTnVtPFsyOV0+Ow0KK2RlZiBSMzAgOiBHUFI8MzAsICIkMzAiPiwgRHdhcmZSZWdOdW08WzMwXT47DQorZGVmIFIzMSA6IEdQUjwzMSwgIiQzMSI+LCBEd2FyZlJlZ051bTxbMzFdPjsNCisNCisvLyBGbG9hdGluZy1wb2ludCByZWdpc3RlcnMNCitkZWYgRjAgIDogRlBSPCAwLCAgIiRmMCI+LCBEd2FyZlJlZ051bTxbMzNdPjsNCitkZWYgRjEgIDogRlBSPCAxLCAgIiRmMSI+LCBEd2FyZlJlZ051bTxbMzRdPjsNCitkZWYgRjIgIDogRlBSPCAyLCAgIiRmMiI+LCBEd2FyZlJlZ051bTxbMzVdPjsNCitkZWYgRjMgIDogRlBSPCAzLCAgIiRmMyI+LCBEd2FyZlJlZ051bTxbMzZdPjsNCitkZWYgRjQgIDogRlBSPCA0LCAgIiRmNCI+LCBEd2FyZlJlZ051bTxbMzddPjsNCitkZWYgRjUgIDogRlBSPCA1LCAgIiRmNSI+LCBEd2FyZlJlZ051bTxbMzhdPjsNCitkZWYgRjYgIDogRlBSPCA2LCAgIiRmNiI+LCBEd2FyZlJlZ051bTxbMzldPjsNCitkZWYgRjcgIDogRlBSPCA3LCAgIiRmNyI+LCBEd2FyZlJlZ051bTxbNDBdPjsNCitkZWYgRjggIDogRlBSPCA4LCAgIiRmOCI+LCBEd2FyZlJlZ051bTxbNDFdPjsNCitkZWYgRjkgIDogRlBSPCA5LCAgIiRmOSI+LCBEd2FyZlJlZ051bTxbNDJdPjsNCitkZWYgRjEwIDogRlBSPDEwLCAiJGYxMCI+LCBEd2FyZlJlZ051bTxbNDNdPjsNCitkZWYgRjExIDogRlBSPDExLCAiJGYxMSI+LCBEd2FyZlJlZ051bTxbNDRdPjsNCitkZWYgRjEyIDogRlBSPDEyLCAiJGYxMiI+LCBEd2FyZlJlZ051bTxbNDVdPjsNCitkZWYgRjEzIDogRlBSPDEzLCAiJGYxMyI+LCBEd2FyZlJlZ051bTxbNDZdPjsNCitkZWYgRjE0IDogRlBSPDE0LCAiJGYxNCI+LCBEd2FyZlJlZ051bTxbNDddPjsNCitkZWYgRjE1IDogRlBSPDE1LCAiJGYxNSI+LCBEd2FyZlJlZ051bTxbNDhdPjsNCitkZWYgRjE2IDogRlBSPDE2LCAiJGYxNiI+LCBEd2FyZlJlZ051bTxbNDldPjsNCitkZWYgRjE3IDogRlBSPDE3LCAiJGYxNyI+LCBEd2FyZlJlZ051bTxbNTBdPjsNCitkZWYgRjE4IDogRlBSPDE4LCAiJGYxOCI+LCBEd2FyZlJlZ051bTxbNTFdPjsNCitkZWYgRjE5IDogRlBSPDE5LCAiJGYxOSI+LCBEd2FyZlJlZ051bTxbNTJdPjsNCitkZWYgRjIwIDogRlBSPDIwLCAiJGYyMCI+LCBEd2FyZlJlZ051bTxbNTNdPjsNCitkZWYgRjIxIDogRlBSPDIxLCAiJGYyMSI+LCBEd2FyZlJlZ051bTxbNTRdPjsNCitkZWYgRjIyIDogRlBSPDIyLCAiJGYyMiI+LCBEd2FyZlJlZ051bTxbNTVdPjsNCitkZWYgRjIzIDogRlBSPDIzLCAiJGYyMyI+LCBEd2FyZlJlZ051bTxbNTZdPjsNCitkZWYgRjI0IDogRlBSPDI0LCAiJGYyNCI+LCBEd2FyZlJlZ051bTxbNTddPjsNCitkZWYgRjI1IDogRlBSPDI1LCAiJGYyNSI+LCBEd2FyZlJlZ051bTxbNThdPjsNCitkZWYgRjI2IDogRlBSPDI2LCAiJGYyNiI+LCBEd2FyZlJlZ051bTxbNTldPjsNCitkZWYgRjI3IDogRlBSPDI3LCAiJGYyNyI+LCBEd2FyZlJlZ051bTxbNjBdPjsNCitkZWYgRjI4IDogRlBSPDI4LCAiJGYyOCI+LCBEd2FyZlJlZ051bTxbNjFdPjsNCitkZWYgRjI5IDogRlBSPDI5LCAiJGYyOSI+LCBEd2FyZlJlZ051bTxbNjJdPjsNCitkZWYgRjMwIDogRlBSPDMwLCAiJGYzMCI+LCBEd2FyZlJlZ051bTxbNjNdPjsNCitkZWYgRjMxIDogRlBSPDMxLCAiJGYzMSI+LCBEd2FyZlJlZ051bTxbNjRdPjsNCisNCisgIC8vIC8vI2RlZmluZSBGUCAgICAkMTUNCisgIC8vIC8vI2RlZmluZSBSQSAgICAkMjYNCisgIC8vIC8vI2RlZmluZSBQViAgICAkMjcNCisgIC8vIC8vI2RlZmluZSBHUCAgICAkMjkNCisgIC8vIC8vI2RlZmluZSBTUCAgICAkMzANCisgIC8vICQyOCBpcyB1bmRlZmluZWQgYWZ0ZXIgYW55IGFuZCBhbGwgY2FsbHMNCisNCisvLy8gUmVnaXN0ZXIgY2xhc3Nlcw0KK2RlZiBHUFJDIDogUmVnaXN0ZXJDbGFzczwiQWxwaGEiLCBbaTY0XSwgNjQsDQorICAgICAvLyBWb2xhdGlsZQ0KKyAgICAgW1IwLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFIxNiwgUjE3LCBSMTgsIFIxOSwgUjIwLCBSMjEsIFIyMiwNCisgICAgICBSMjMsIFIyNCwgUjI1LCBSMjgsIA0KKyAgICAgLy9TcGVjaWFsIG1lYW5pbmcsIGJ1dCB2b2xhdGlsZQ0KKyAgICAgUjI3LCAvL3Byb2NlZHVyZSBhZGRyZXNzDQorICAgICBSMjYsIC8vcmV0dXJuIGFkZHJlc3MNCisgICAgIFIyOSwgLy9nbG9iYWwgb2Zmc2V0IHRhYmxlIGFkZHJlc3MNCisgICAgIC8vIE5vbi12b2xhdGlsZQ0KKyAgICAgUjksIFIxMCwgUjExLCBSMTIsIFIxMywgUjE0LA0KKy8vIERvbid0IGFsbG9jYXRlIDE1LCAzMCwgMzENCisgICAgIFIxNSwgUjMwLCBSMzEgXT4gLy96ZXJvDQorew0KKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgfV07DQorICBsZXQgTWV0aG9kQm9kaWVzID0gW3sNCisgICAgR1BSQ0NsYXNzOjppdGVyYXRvcg0KKyAgICBHUFJDQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICAgIHJldHVybiBlbmQoKS0zOw0KKyAgICB9DQorICB9XTsNCit9DQorDQorZGVmIEY0UkMgOiBSZWdpc3RlckNsYXNzPCJBbHBoYSIsIFtmMzJdLCA2NCwgW0YwLCBGMSwgDQorICAgICAgICBGMTAsIEYxMSwgRjEyLCBGMTMsIEYxNCwgRjE1LCBGMTYsIEYxNywgRjE4LCBGMTksDQorICAgICAgICBGMjAsIEYyMSwgRjIyLCBGMjMsIEYyNCwgRjI1LCBGMjYsIEYyNywgRjI4LCBGMjksIEYzMCwNCisgICAgICAgIC8vIFNhdmVkOg0KKyAgICAgICAgRjIsIEYzLCBGNCwgRjUsIEY2LCBGNywgRjgsIEY5LA0KKyAgICAgICAgRjMxIF0+IC8vemVybw0KK3sNCisgIGxldCBNZXRob2RQcm90b3MgPSBbew0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgIH1dOw0KKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7DQorICAgIEY0UkNDbGFzczo6aXRlcmF0b3INCisgICAgRjRSQ0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgICByZXR1cm4gZW5kKCktMTsNCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KK2RlZiBGOFJDIDogUmVnaXN0ZXJDbGFzczwiQWxwaGEiLCBbZjY0XSwgNjQsIFtGMCwgRjEsIA0KKyAgICAgICAgRjEwLCBGMTEsIEYxMiwgRjEzLCBGMTQsIEYxNSwgRjE2LCBGMTcsIEYxOCwgRjE5LA0KKyAgICAgICAgRjIwLCBGMjEsIEYyMiwgRjIzLCBGMjQsIEYyNSwgRjI2LCBGMjcsIEYyOCwgRjI5LCBGMzAsDQorICAgICAgICAvLyBTYXZlZDoNCisgICAgICAgIEYyLCBGMywgRjQsIEY1LCBGNiwgRjcsIEY4LCBGOSwNCisgICAgICAgIEYzMSBdPiAvL3plcm8NCit7DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBGOFJDQ2xhc3M6Oml0ZXJhdG9yDQorICAgIEY4UkNDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgICAgcmV0dXJuIGVuZCgpLTE7DQorICAgIH0NCisgIH1dOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhUmVsb2NhdGlvbnMuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFSZWxvY2F0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTIwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhUmVsb2NhdGlvbnMuaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0gQWxwaGFSZWxvY2F0aW9ucy5oIC0gQWxwaGEgQ29kZSBSZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBBbHBoYSB0YXJnZXQtc3BlY2lmaWMgcmVsb2NhdGlvbiB0eXBlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEFMUEhBUkVMT0NBVElPTlNfSAorI2RlZmluZSBBTFBIQVJFTE9DQVRJT05TX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVsb2NhdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIG5hbWVzcGFjZSBBbHBoYSB7CisgICAgZW51bSBSZWxvY2F0aW9uVHlwZSB7CisgICAgICByZWxvY19saXRlcmFsLAorICAgICAgcmVsb2NfZ3ByZWxsb3csCisgICAgICByZWxvY19ncHJlbGhpZ2gsCisgICAgICByZWxvY19ncGRpc3QsCisgICAgICByZWxvY19ic3IKKyAgICB9OworICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYVNjaGVkdWxlLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYVNjaGVkdWxlLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTE2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhU2NoZWR1bGUudGQKQEAgLTAsMCArMSw4NSBAQAorLy89PT0tIEFscGhhU2NoZWR1bGUudGQgLSBBbHBoYSBTY2hlZHVsaW5nIERlZmluaXRpb25zIC0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvL1RoaXMgaXMgdGFibGUgMi0yIGZyb20gdGhlIDIxMjY0IGNvbXBpbGVyIHdyaXRlcnMgZ3VpZGUNCisvL21vZGlmaWVkIHNvbWUNCisNCisvL1BpcGVsaW5lcw0KKw0KK2RlZiBMMCAgIDogRnVuY1VuaXQ7DQorZGVmIEwxICAgOiBGdW5jVW5pdDsNCitkZWYgRlNUMCA6IEZ1bmNVbml0Ow0KK2RlZiBGU1QxIDogRnVuY1VuaXQ7DQorZGVmIFUwICAgOiBGdW5jVW5pdDsNCitkZWYgVTEgICA6IEZ1bmNVbml0Ow0KK2RlZiBGQSAgIDogRnVuY1VuaXQ7DQorZGVmIEZNICAgOiBGdW5jVW5pdDsNCisNCitkZWYgc19pbGQgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBzX2ZsZCAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIHNfaXN0ICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgc19mc3QgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBzX2xkYSAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIHNfcnBjYyAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgc19yeCAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBzX214cHIgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIHNfaWNiciAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgc191YnIgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBzX2pzciAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIHNfaWFkZCAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgc19pbG9nICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBzX2lzaGYgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIHNfY21vdiAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgc19pbXVsICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBzX2ltaXNjIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIHNfZmJyICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgc19mYWRkICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBzX2ZtdWwgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIHNfZmNtb3YgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgc19mZGl2dCA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBzX2ZkaXZzIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIHNfZnNxcnRzOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgc19mc3FydHQ6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBzX2Z0b2kgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIHNfaXRvZiAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgc19wc2V1ZG8gOiBJbnN0ckl0aW5DbGFzczsNCisNCisvL1RhYmxlIDKtNCBJbnN0cnVjdGlvbiBDbGFzcyBMYXRlbmN5IGluIEN5Y2xlcw0KKy8vbW9kaWZpZWQgc29tZQ0KKw0KK2RlZiBBbHBoYTIxMjY0SXRpbmVyYXJpZXMgOiBQcm9jZXNzb3JJdGluZXJhcmllczwNCisgIFtMMCwgTDEsIEZTVDAsIEZTVDEsIFUwLCBVMSwgRkEsIEZNXSwgWw0KKyAgSW5zdHJJdGluRGF0YTxzX2lsZCAgICAsIFtJbnN0clN0YWdlPDMsIFtMMCwgTDFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2ZsZCAgICAsIFtJbnN0clN0YWdlPDQsIFtMMCwgTDFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2lzdCAgICAsIFtJbnN0clN0YWdlPDAsIFtMMCwgTDFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2ZzdCAgICAsIFtJbnN0clN0YWdlPDAsIFtGU1QwLCBGU1QxLCBMMCwgTDFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2xkYSAgICAsIFtJbnN0clN0YWdlPDEsIFtMMCwgTDEsIFUwLCBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfcnBjYyAgICwgW0luc3RyU3RhZ2U8MSwgW0wxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8c19yeCAgICAgLCBbSW5zdHJTdGFnZTwxLCBbTDFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX214cHIgICAsIFtJbnN0clN0YWdlPDEsIFtMMCwgTDFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2ljYnIgICAsIFtJbnN0clN0YWdlPDAsIFtVMCwgVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX3ViciAgICAsIFtJbnN0clN0YWdlPDMsIFtVMCwgVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2pzciAgICAsIFtJbnN0clN0YWdlPDMsIFtMMF0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfaWFkZCAgICwgW0luc3RyU3RhZ2U8MSwgW0wwLCBVMCwgTDEsIFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8c19pbG9nICAgLCBbSW5zdHJTdGFnZTwxLCBbTDAsIFUwLCBMMSwgVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2lzaGYgICAsIFtJbnN0clN0YWdlPDEsIFtVMCwgVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2Ntb3YgICAsIFtJbnN0clN0YWdlPDEsIFtMMCwgVTAsIEwxLCBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfaW11bCAgICwgW0luc3RyU3RhZ2U8NywgW1UxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8c19pbWlzYyAgLCBbSW5zdHJTdGFnZTwzLCBbVTBdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2ZiciAgICAsIFtJbnN0clN0YWdlPDAsIFtGQV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfZmFkZCAgICwgW0luc3RyU3RhZ2U8NiwgW0ZBXT5dPiwNCisgIEluc3RySXRpbkRhdGE8c19mbXVsICAgLCBbSW5zdHJTdGFnZTw2LCBbRk1dPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxzX2ZjbW92ICAsIFtJbnN0clN0YWdlPDYsIFtGQV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfZmRpdnMgICwgW0luc3RyU3RhZ2U8MTIsIFtGQV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfZmRpdnQgICwgW0luc3RyU3RhZ2U8MTUsIFtGQV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfZnNxcnRzICwgW0luc3RyU3RhZ2U8MTgsIFtGQV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfZnNxcnR0ICwgW0luc3RyU3RhZ2U8MzMsIFtGQV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfZnRvaSAgICwgW0luc3RyU3RhZ2U8MywgW0ZTVDAsIEZTVDEsIEwwLCBMMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPHNfaXRvZiAgICwgW0luc3RyU3RhZ2U8NCwgW0wwLCBMMV0+XT4NCitdPjsNCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhU2VsZWN0aW9uREFHSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhU2VsZWN0aW9uREFHSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5NThmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFTZWxlY3Rpb25EQUdJbmZvLmNwcApAQCAtMCwwICsxLDIzIEBACisvLz09PS0tIEFscGhhU2VsZWN0aW9uREFHSW5mby5jcHAgLSBBbHBoYSBTZWxlY3Rpb25EQUcgSW5mbyAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBbHBoYVNlbGVjdGlvbkRBR0luZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJhbHBoYS1zZWxlY3Rpb25kYWctaW5mbyIKKyNpbmNsdWRlICJBbHBoYVRhcmdldE1hY2hpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitBbHBoYVNlbGVjdGlvbkRBR0luZm86OkFscGhhU2VsZWN0aW9uREFHSW5mbyhjb25zdCBBbHBoYVRhcmdldE1hY2hpbmUgJlRNKQorICA6IFRhcmdldFNlbGVjdGlvbkRBR0luZm8oVE0pIHsKK30KKworQWxwaGFTZWxlY3Rpb25EQUdJbmZvOjp+QWxwaGFTZWxlY3Rpb25EQUdJbmZvKCkgeworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYVNlbGVjdGlvbkRBR0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFTZWxlY3Rpb25EQUdJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwNWNjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFTZWxlY3Rpb25EQUdJbmZvLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tLSBBbHBoYVNlbGVjdGlvbkRBR0luZm8uaCAtIEFscGhhIFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQWxwaGEgc3ViY2xhc3MgZm9yIFRhcmdldFNlbGVjdGlvbkRBR0luZm8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBTFBIQVNFTEVDVElPTkRBR0lORk9fSAorI2RlZmluZSBBTFBIQVNFTEVDVElPTkRBR0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFscGhhVGFyZ2V0TWFjaGluZTsKKworY2xhc3MgQWxwaGFTZWxlY3Rpb25EQUdJbmZvIDogcHVibGljIFRhcmdldFNlbGVjdGlvbkRBR0luZm8geworcHVibGljOgorICBleHBsaWNpdCBBbHBoYVNlbGVjdGlvbkRBR0luZm8oY29uc3QgQWxwaGFUYXJnZXRNYWNoaW5lICZUTSk7CisgIH5BbHBoYVNlbGVjdGlvbkRBR0luZm8oKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhU3VidGFyZ2V0LmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFTdWJ0YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYTcxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhU3VidGFyZ2V0LmNwcApAQCAtMCwwICsxLDI1IEBACisvLz09PS0gQWxwaGFTdWJ0YXJnZXQuY3BwIC0gQWxwaGEgU3VidGFyZ2V0IEluZm9ybWF0aW9uIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBbHBoYSBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkFscGhhU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiQWxwaGEuaCIKKyNpbmNsdWRlICJBbHBoYUdlblN1YnRhcmdldC5pbmMiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworQWxwaGFTdWJ0YXJnZXQ6OkFscGhhU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKQorICA6IEhhc0NUKGZhbHNlKSB7CisgIHN0ZDo6c3RyaW5nIENQVSA9ICJnZW5lcmljIjsKKworICAvLyBQYXJzZSBmZWF0dXJlcyBzdHJpbmcuCisgIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoRlMsIENQVSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhU3VidGFyZ2V0LmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhU3VidGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlYjkzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFTdWJ0YXJnZXQuaApAQCAtMCwwICsxLDQ2IEBACisvLz09PT09LS0gQWxwaGFTdWJ0YXJnZXQuaCAtIERlZmluZSBTdWJ0YXJnZXQgZm9yIHRoZSBBbHBoYSAtLSotIEMrKyAtKi0tPT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBBbHBoYSBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBTFBIQVNVQlRBUkdFVF9ICisjZGVmaW5lIEFMUEhBU1VCVEFSR0VUX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySXRpbmVyYXJpZXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbHBoYVN1YnRhcmdldCA6IHB1YmxpYyBUYXJnZXRTdWJ0YXJnZXQgeworcHJvdGVjdGVkOgorCisgIGJvb2wgSGFzQ1Q7CisKKyAgSW5zdHJJdGluZXJhcnlEYXRhIEluc3RySXRpbnM7CisKK3B1YmxpYzoKKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIGRhdGEgbWVtYmVycyB0byBtYXRjaCB0aGF0CisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHRyaXBsZS4KKyAgLy8vCisgIEFscGhhU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKKyAgCisgIC8vLyBQYXJzZVN1YnRhcmdldEZlYXR1cmVzIC0gUGFyc2VzIGZlYXR1cmVzIHN0cmluZyBzZXR0aW5nIHNwZWNpZmllZCAKKyAgLy8vIHN1YnRhcmdldCBvcHRpb25zLiAgRGVmaW5pdGlvbiBvZiBmdW5jdGlvbiBpcyBhdXRvIGdlbmVyYXRlZCBieSB0YmxnZW4uCisgIHN0ZDo6c3RyaW5nIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcgJkZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZDUFUpOworCisgIGJvb2wgaGFzQ1QoKSBjb25zdCB7IHJldHVybiBIYXNDVDsgfQorfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYVRhcmdldE1hY2hpbmUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYVRhcmdldE1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOWJlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FscGhhVGFyZ2V0TWFjaGluZS5jcHAKQEAgLTAsMCArMSw2MiBAQAorLy89PT0tLSBBbHBoYVRhcmdldE1hY2hpbmUuY3BwIC0gRGVmaW5lIFRhcmdldE1hY2hpbmUgZm9yIEFscGhhIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkFscGhhLmgiCisjaW5jbHVkZSAiQWxwaGFKSVRJbmZvLmgiCisjaW5jbHVkZSAiQWxwaGFNQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJBbHBoYVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplQWxwaGFUYXJnZXQoKSB7IAorICAvLyBSZWdpc3RlciB0aGUgdGFyZ2V0LgorICBSZWdpc3RlclRhcmdldE1hY2hpbmU8QWxwaGFUYXJnZXRNYWNoaW5lPiBYKFRoZUFscGhhVGFyZ2V0KTsKKyAgUmVnaXN0ZXJBc21JbmZvPEFscGhhTUNBc21JbmZvPiBZKFRoZUFscGhhVGFyZ2V0KTsKK30KKworQWxwaGFUYXJnZXRNYWNoaW5lOjpBbHBoYVRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpCisgIDogTExWTVRhcmdldE1hY2hpbmUoVCwgVFQpLAorICAgIERhdGFMYXlvdXQoImUtZjEyODoxMjg6MTI4LW42NCIpLAorICAgIEZyYW1lSW5mbyhUYXJnZXRGcmFtZUluZm86OlN0YWNrR3Jvd3NEb3duLCAxNiwgMCksCisgICAgSklUSW5mbygqdGhpcyksCisgICAgU3VidGFyZ2V0KFRULCBGUyksCisgICAgVExJbmZvKCp0aGlzKSwKKyAgICBUU0luZm8oKnRoaXMpIHsKKyAgc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpQSUNfKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFzcyBQaXBlbGluZSBDb25maWd1cmF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitib29sIEFscGhhVGFyZ2V0TWFjaGluZTo6YWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIFBNLmFkZChjcmVhdGVBbHBoYUlTZWxEYWcoKnRoaXMpKTsKKyAgcmV0dXJuIGZhbHNlOworfQorYm9vbCBBbHBoYVRhcmdldE1hY2hpbmU6OmFkZFByZUVtaXRQYXNzKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgLy8gTXVzdCBydW4gYnJhbmNoIHNlbGVjdGlvbiBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGFzbSBwcmludGVyCisgIFBNLmFkZChjcmVhdGVBbHBoYUJyYW5jaFNlbGVjdGlvblBhc3MoKSk7CisgIFBNLmFkZChjcmVhdGVBbHBoYUxMUlBQYXNzKCp0aGlzKSk7CisgIHJldHVybiBmYWxzZTsKK30KK2Jvb2wgQWxwaGFUYXJnZXRNYWNoaW5lOjphZGRDb2RlRW1pdHRlcihQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpIHsKKyAgUE0uYWRkKGNyZWF0ZUFscGhhSklUQ29kZUVtaXR0ZXJQYXNzKCp0aGlzLCBKQ0UpKTsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9BbHBoYVRhcmdldE1hY2hpbmUuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFUYXJnZXRNYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzOTQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFUYXJnZXRNYWNoaW5lLmgKQEAgLTAsMCArMSw2OSBAQAorLy89PT0tLSBBbHBoYVRhcmdldE1hY2hpbmUuaCAtIERlZmluZSBUYXJnZXRNYWNoaW5lIGZvciBBbHBoYSAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEFscGhhLXNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldE1hY2hpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBTFBIQV9UQVJHRVRNQUNISU5FX0gKKyNkZWZpbmUgQUxQSEFfVEFSR0VUTUFDSElORV9ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIgorI2luY2x1ZGUgIkFscGhhSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiQWxwaGFKSVRJbmZvLmgiCisjaW5jbHVkZSAiQWxwaGFJU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJBbHBoYVNlbGVjdGlvbkRBR0luZm8uaCIKKyNpbmNsdWRlICJBbHBoYVN1YnRhcmdldC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEdsb2JhbFZhbHVlOworCitjbGFzcyBBbHBoYVRhcmdldE1hY2hpbmUgOiBwdWJsaWMgTExWTVRhcmdldE1hY2hpbmUgeworICBjb25zdCBUYXJnZXREYXRhIERhdGFMYXlvdXQ7ICAgICAgIC8vIENhbGN1bGF0ZXMgdHlwZSBzaXplICYgYWxpZ25tZW50CisgIEFscGhhSW5zdHJJbmZvIEluc3RySW5mbzsKKyAgVGFyZ2V0RnJhbWVJbmZvIEZyYW1lSW5mbzsKKyAgQWxwaGFKSVRJbmZvIEpJVEluZm87CisgIEFscGhhU3VidGFyZ2V0IFN1YnRhcmdldDsKKyAgQWxwaGFUYXJnZXRMb3dlcmluZyBUTEluZm87CisgIEFscGhhU2VsZWN0aW9uREFHSW5mbyBUU0luZm87CisKK3B1YmxpYzoKKyAgQWxwaGFUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKKworICB2aXJ0dWFsIGNvbnN0IEFscGhhSW5zdHJJbmZvICpnZXRJbnN0ckluZm8oKSBjb25zdCB7IHJldHVybiAmSW5zdHJJbmZvOyB9CisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0RnJhbWVJbmZvICAqZ2V0RnJhbWVJbmZvKCkgY29uc3QgeyByZXR1cm4gJkZyYW1lSW5mbzsgfQorICB2aXJ0dWFsIGNvbnN0IEFscGhhU3VidGFyZ2V0ICAgKmdldFN1YnRhcmdldEltcGwoKSBjb25zdHsgcmV0dXJuICZTdWJ0YXJnZXQ7IH0KKyAgdmlydHVhbCBjb25zdCBBbHBoYVJlZ2lzdGVySW5mbyAqZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeworICAgIHJldHVybiAmSW5zdHJJbmZvLmdldFJlZ2lzdGVySW5mbygpOworICB9CisgIHZpcnR1YWwgY29uc3QgQWxwaGFUYXJnZXRMb3dlcmluZyogZ2V0VGFyZ2V0TG93ZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICZUTEluZm87CisgIH0KKyAgdmlydHVhbCBjb25zdCBBbHBoYVNlbGVjdGlvbkRBR0luZm8qIGdldFNlbGVjdGlvbkRBR0luZm8oKSBjb25zdCB7CisgICAgcmV0dXJuICZUU0luZm87CisgIH0KKyAgdmlydHVhbCBjb25zdCBUYXJnZXREYXRhICAgICAgICpnZXRUYXJnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gJkRhdGFMYXlvdXQ7IH0KKyAgdmlydHVhbCBBbHBoYUpJVEluZm8qIGdldEpJVEluZm8oKSB7CisgICAgcmV0dXJuICZKSVRJbmZvOworICB9CisKKyAgLy8gUGFzcyBQaXBlbGluZSBDb25maWd1cmF0aW9uCisgIHZpcnR1YWwgYm9vbCBhZGRJbnN0U2VsZWN0b3IoUGFzc01hbmFnZXJCYXNlICZQTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworICB2aXJ0dWFsIGJvb2wgYWRkUHJlRW1pdFBhc3MoUGFzc01hbmFnZXJCYXNlICZQTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworICB2aXJ0dWFsIGJvb2wgYWRkQ29kZUVtaXR0ZXIoUGFzc01hbmFnZXJCYXNlICZQTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRDb2RlRW1pdHRlciAmSkNFKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9Bc21QcmludGVyL0FscGhhQXNtUHJpbnRlci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FzbVByaW50ZXIvQWxwaGFBc21QcmludGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjRhZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9Bc21QcmludGVyL0FscGhhQXNtUHJpbnRlci5jcHAKQEAgLTAsMCArMSwxNjggQEAKKy8vPT09LS0gQWxwaGFBc21QcmludGVyLmNwcCAtIEFscGhhIExMVk0gYXNzZW1ibHkgd3JpdGVyIC0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgcHJpbnRlciB0aGF0IGNvbnZlcnRzIGZyb20gb3VyIGludGVybmFsIHJlcHJlc2VudGF0aW9uCisvLyBvZiBtYWNoaW5lLWRlcGVuZGVudCBMTFZNIGNvZGUgdG8gR0FTLWZvcm1hdCBBbHBoYSBhc3NlbWJseSBsYW5ndWFnZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFzbS1wcmludGVyIgorI2luY2x1ZGUgIkFscGhhLmgiCisjaW5jbHVkZSAiQWxwaGFJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJBbHBoYVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3RyZWFtZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9NYW5nbGVyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgQWxwaGFBc21QcmludGVyIDogcHVibGljIEFzbVByaW50ZXIgeworICAgIC8vLyBVbmlxdWUgaW5jcmVtZW50ZXIgZm9yIGxhYmVsIHZhbHVlcyBmb3IgcmVmZXJlbmNpbmcgR2xvYmFsIHZhbHVlcy4KKyAgICAvLy8KKworICAgIGV4cGxpY2l0IEFscGhhQXNtUHJpbnRlcihUYXJnZXRNYWNoaW5lICZ0bSwgTUNTdHJlYW1lciAmU3RyZWFtZXIpCisgICAgICA6IEFzbVByaW50ZXIodG0sIFN0cmVhbWVyKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiQWxwaGEgQXNzZW1ibHkgUHJpbnRlciI7CisgICAgfQorICAgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSkgeworICAgICAgU21hbGxTdHJpbmc8MTI4PiBTdHI7CisgICAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtIE9TKFN0cik7CisgICAgICBwcmludEluc3RydWN0aW9uKE1JLCBPUyk7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChPUy5zdHIoKSk7CisgICAgfQorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRSZWdpc3Rlck5hbWUodW5zaWduZWQgUmVnTm8pOworCisgICAgdm9pZCBwcmludE9wKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRCYXNlT2Zmc2V0UGFpcihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgaSwgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYnJhY2tldHM9dHJ1ZSk7CisgICAgdmlydHVhbCB2b2lkIEVtaXRGdW5jdGlvbkJvZHlTdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBFbWl0RnVuY3Rpb25Cb2R5RW5kKCk7IAorICAgIHZvaWQgRW1pdFN0YXJ0T2ZBc21GaWxlKE1vZHVsZSAmTSk7CisKKyAgICBib29sIFByaW50QXNtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgYm9vbCBQcmludEFzbU1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcE5vLCB1bnNpZ25lZCBBc21WYXJpYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwgcmF3X29zdHJlYW0gJk8pOworICB9OworfSAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisjaW5jbHVkZSAiQWxwaGFHZW5Bc21Xcml0ZXIuaW5jIgorCit2b2lkIEFscGhhQXNtUHJpbnRlcjo6cHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQob3BOdW0pOworICBpZiAoTU8uaXNSZWcoKSkgeworICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihNTy5nZXRSZWcoKSkgJiYKKyAgICAgICAgICAgIk5vdCBwaHlzcmVnPz8iKTsKKyAgICBPIDw8IGdldFJlZ2lzdGVyTmFtZShNTy5nZXRSZWcoKSk7CisgIH0gZWxzZSBpZiAoTU8uaXNJbW0oKSkgeworICAgIE8gPDwgTU8uZ2V0SW1tKCk7CisgICAgYXNzZXJ0KE1PLmdldEltbSgpIDwgKDEgPDwgMzApKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludE9wKE1PLCBPKTsKKyAgfQorfQorCisKK3ZvaWQgQWxwaGFBc21QcmludGVyOjpwcmludE9wKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywgcmF3X29zdHJlYW0gJk8pIHsKKyAgc3dpdGNoIChNTy5nZXRUeXBlKCkpIHsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fUmVnaXN0ZXI6CisgICAgTyA8PCBnZXRSZWdpc3Rlck5hbWUoTU8uZ2V0UmVnKCkpOworICAgIHJldHVybjsKKworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgbGx2bV91bnJlYWNoYWJsZSgicHJpbnRPcCgpIGRvZXMgbm90IGhhbmRsZSBpbW1lZGlhdGUgdmFsdWVzIik7CisgICAgcmV0dXJuOworCisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrOgorICAgIE8gPDwgKk1PLmdldE1CQigpLT5nZXRTeW1ib2woKTsKKyAgICByZXR1cm47CisKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fQ29uc3RhbnRQb29sSW5kZXg6CisgICAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSA8PCAiQ1BJIiA8PCBnZXRGdW5jdGlvbk51bWJlcigpIDw8ICJfIgorICAgICAgPDwgTU8uZ2V0SW5kZXgoKTsKKyAgICByZXR1cm47CisKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fRXh0ZXJuYWxTeW1ib2w6CisgICAgTyA8PCBNTy5nZXRTeW1ib2xOYW1lKCk7CisgICAgcmV0dXJuOworCisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0dsb2JhbEFkZHJlc3M6CisgICAgTyA8PCAqTWFuZy0+Z2V0U3ltYm9sKE1PLmdldEdsb2JhbCgpKTsKKyAgICByZXR1cm47CisKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSA8PCAiSlRJIiA8PCBnZXRGdW5jdGlvbk51bWJlcigpCisgICAgICA8PCAnXycgPDwgTU8uZ2V0SW5kZXgoKTsKKyAgICByZXR1cm47CisKKyAgZGVmYXVsdDoKKyAgICBPIDw8ICI8dW5rbm93biBvcGVyYW5kIHR5cGU6ICIgPDwgTU8uZ2V0VHlwZSgpIDw8ICI+IjsKKyAgICByZXR1cm47CisgIH0KK30KKworLy8vIEVtaXRGdW5jdGlvbkJvZHlTdGFydCAtIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZW1pdCBzdHVmZiBiZWZvcmUKKy8vLyB0aGUgZmlyc3QgYmFzaWMgYmxvY2sgaW4gdGhlIGZ1bmN0aW9uLgordm9pZCBBbHBoYUFzbVByaW50ZXI6OkVtaXRGdW5jdGlvbkJvZHlTdGFydCgpIHsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LmVudCAiICsgVHdpbmUoQ3VycmVudEZuU3ltLT5nZXROYW1lKCkpKTsKK30KKworLy8vIEVtaXRGdW5jdGlvbkJvZHlFbmQgLSBUYXJnZXRzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGVtaXQgc3R1ZmYgYWZ0ZXIKKy8vLyB0aGUgbGFzdCBiYXNpYyBibG9jayBpbiB0aGUgZnVuY3Rpb24uCit2b2lkIEFscGhhQXNtUHJpbnRlcjo6RW1pdEZ1bmN0aW9uQm9keUVuZCgpIHsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LmVuZCAiICsgVHdpbmUoQ3VycmVudEZuU3ltLT5nZXROYW1lKCkpKTsKK30KKwordm9pZCBBbHBoYUFzbVByaW50ZXI6OkVtaXRTdGFydE9mQXNtRmlsZShNb2R1bGUgJk0pIHsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5hcmNoIGV2NiIpKTsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5zZXQgbm9hdCIpKTsKK30KKworLy8vIFByaW50QXNtT3BlcmFuZCAtIFByaW50IG91dCBhbiBvcGVyYW5kIGZvciBhbiBpbmxpbmUgYXNtIGV4cHJlc3Npb24uCisvLy8KK2Jvb2wgQWxwaGFBc21QcmludGVyOjpQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXNtVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRXh0cmFDb2RlLCByYXdfb3N0cmVhbSAmTykgeworICBwcmludE9wZXJhbmQoTUksIE9wTm8sIE8pOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQWxwaGFBc21QcmludGVyOjpQcmludEFzbU1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BObywgdW5zaWduZWQgQXNtVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRXh0cmFDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBpZiAoRXh0cmFDb2RlICYmIEV4dHJhQ29kZVswXSkKKyAgICByZXR1cm4gdHJ1ZTsgLy8gVW5rbm93biBtb2RpZmllci4KKyAgTyA8PCAiMCgiOworICBwcmludE9wZXJhbmQoTUksIE9wTm8sIE8pOworICBPIDw8ICIpIjsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBGb3JjZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVBbHBoYUFzbVByaW50ZXIoKSB7IAorICBSZWdpc3RlckFzbVByaW50ZXI8QWxwaGFBc21QcmludGVyPiBYKFRoZUFscGhhVGFyZ2V0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJjMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9Bc21QcmludGVyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTUFscGhhQXNtUHJpbnRlcgorICBBbHBoYUFzbVByaW50ZXIuY3BwCisgICkKK2FkZF9kZXBlbmRlbmNpZXMoTExWTUFscGhhQXNtUHJpbnRlciBBbHBoYUNvZGVHZW5UYWJsZV9nZW4pCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FzbVByaW50ZXIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0FzbVByaW50ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExM2MzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQXNtUHJpbnRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RhcmdldC9BbHBoYS9Bc21QcmludGVyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNQWxwaGFBc21QcmludGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBhbHBoYSB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFAuRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjdmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjkgQEAKK3NldChMTFZNX1RBUkdFVF9ERUZJTklUSU9OUyBBbHBoYS50ZCkKKwordGFibGVnZW4oQWxwaGFHZW5SZWdpc3RlckluZm8uaC5pbmMgLWdlbi1yZWdpc3Rlci1kZXNjLWhlYWRlcikKK3RhYmxlZ2VuKEFscGhhR2VuUmVnaXN0ZXJOYW1lcy5pbmMgLWdlbi1yZWdpc3Rlci1lbnVtcykKK3RhYmxlZ2VuKEFscGhhR2VuUmVnaXN0ZXJJbmZvLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MpCit0YWJsZWdlbihBbHBoYUdlbkluc3RyTmFtZXMuaW5jIC1nZW4taW5zdHItZW51bXMpCit0YWJsZWdlbihBbHBoYUdlbkluc3RySW5mby5pbmMgLWdlbi1pbnN0ci1kZXNjKQordGFibGVnZW4oQWxwaGFHZW5Db2RlRW1pdHRlci5pbmMgLWdlbi1lbWl0dGVyKQordGFibGVnZW4oQWxwaGFHZW5Bc21Xcml0ZXIuaW5jIC1nZW4tYXNtLXdyaXRlcikKK3RhYmxlZ2VuKEFscGhhR2VuREFHSVNlbC5pbmMgLWdlbi1kYWctaXNlbCkKK3RhYmxlZ2VuKEFscGhhR2VuQ2FsbGluZ0NvbnYuaW5jIC1nZW4tY2FsbGluZ2NvbnYpCit0YWJsZWdlbihBbHBoYUdlblN1YnRhcmdldC5pbmMgLWdlbi1zdWJ0YXJnZXQpCisKK2FkZF9sbHZtX3RhcmdldChBbHBoYUNvZGVHZW4KKyAgQWxwaGFCcmFuY2hTZWxlY3Rvci5jcHAKKyAgQWxwaGFDb2RlRW1pdHRlci5jcHAKKyAgQWxwaGFJbnN0ckluZm8uY3BwCisgIEFscGhhSVNlbERBR1RvREFHLmNwcAorICBBbHBoYUlTZWxMb3dlcmluZy5jcHAKKyAgQWxwaGFKSVRJbmZvLmNwcAorICBBbHBoYUxMUlAuY3BwCisgIEFscGhhTUNBc21JbmZvLmNwcAorICBBbHBoYVJlZ2lzdGVySW5mby5jcHAKKyAgQWxwaGFTdWJ0YXJnZXQuY3BwCisgIEFscGhhVGFyZ2V0TWFjaGluZS5jcHAKKyAgQWxwaGFTZWxlY3Rpb25EQUdJbmZvLmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoTExWTUFscGhhQ29kZUdlbiBMTFZNU2VsZWN0aW9uREFHKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkNTNhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvTWFrZWZpbGUKQEAgLTAsMCArMSwyMyBAQAorIyM9PT0tIGxpYi9UYXJnZXQvQWxwaGEvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUFscGhhQ29kZUdlbgorVEFSR0VUID0gQWxwaGEKKworIyBNYWtlIHN1cmUgdGhhdCB0YmxnZW4gaXMgcnVuLCBmaXJzdCB0aGluZy4KK0JVSUxUX1NPVVJDRVMgPSBBbHBoYUdlblJlZ2lzdGVySW5mby5oLmluYyBBbHBoYUdlblJlZ2lzdGVyTmFtZXMuaW5jIFwKKyAgICAgICAgICAgICAgICBBbHBoYUdlblJlZ2lzdGVySW5mby5pbmMgQWxwaGFHZW5JbnN0ck5hbWVzLmluYyBcCisgICAgICAgICAgICAgICAgQWxwaGFHZW5JbnN0ckluZm8uaW5jIEFscGhhR2VuQ29kZUVtaXR0ZXIuaW5jIFwKKyAgICAgICAgICAgICAgICBBbHBoYUdlbkFzbVdyaXRlci5pbmMgQWxwaGFHZW5EQUdJU2VsLmluYyBcCisgICAgICAgICAgICAgICAgQWxwaGFHZW5DYWxsaW5nQ29udi5pbmMgQWxwaGFHZW5TdWJ0YXJnZXQuaW5jCisKK0RJUlMgPSBBc21QcmludGVyIFRhcmdldEluZm8KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvUkVBRE1FLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWUxNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9BbHBoYS9SRUFETUUudHh0CkBAIC0wLDAgKzEsNDIgQEAKKyoqKgorCithZGQgZ2NjIGJ1aWx0aW5zIGZvciBhbHBoYSBpbnN0cnVjdGlvbnMKKworCisqKioKKworY3VzdG9tIGV4cGFuZCBieXRlc3dhcCBpbnRvIG5pZnR5IAorZXh0cmFjdC9pbnNlcnQvbWFzayBieXRlL3dvcmQvbG9uZ3dvcmQvcXVhZHdvcmQgbG93L2hpZ2gKK3NlcXVlbmNlcworCisqKioKKworc2VlIGlmIGFueSBvZiB0aGUgZXh0cmFjdC9pbnNlcnQvbWFzayBvcGVyYXRpb25zIGNhbiBiZSBhZGRlZAorCisqKioKKworbWF0Y2ggbW9yZSBpbnRlcmVzdGluZyB0aGluZ3MgZm9yIGNtb3ZsYmMgY21vdmxicyAobW92ZSBpZiBsb3cgYml0IGNsZWFyL3NldCkKKworKioqCisKK2xvd2VyIHNyZW0gYW5kIHVyZW0KKworcmVtcShpLGopOiAgaSAtIChqICogZGl2cShpLGopKSBpZiBqICE9IDAKK3JlbXF1KGksaik6IGkgLSAoaiAqIGRpdnF1KGksaikpIGlmIGogIT0gMAorcmVtbChpLGopOiAgaSAtIChqICogZGl2bChpLGopKSBpZiBqICE9IDAKK3JlbWx1KGksaik6IGkgLSAoaiAqIGRpdmx1KGksaikpIGlmIGogIT0gMAorCisqKioKKworYWRkIGNyYXp5IHZlY3RvciBpbnN0cnVjdGlvbnMgKE1WSSk6CisKKyhNSU58TUFYKShVfFMpKEI4fFc0KSBtaW4gYW5kIG1heCwgc2lnbmVkIGFuZCB1bnNpZ25lZCwgYnl0ZSBhbmQgd29yZAorUEtXQiwgVU5QS0JXIHBhY2svdW5wYWNrIHdvcmQgdG8gYnl0ZQorUEtMQiBVTlBLQkwgcGFjay91bnBhY2sgbG9uZyB0byBieXRlCitQRVJSIHBpeGVsIGVycm9yIChzdW0gYWNjcm9zcyBieXRlcyBvZiBieXRld2lzZSBhYnMoaTh2OCBhIC0gaTh2OCBiKSkKKworY21wYnl0ZXMgYnl0ZXdpc2UgY21wZXEgb2YgaTh2OCBhIGFuZCBpOHY4IGIgKG5vdCBwYXJ0IG9mIE1WSSBleHRlbnRpb25zKQorCit0aGlzIGhhcyBzb21lIGdvb2QgZXhhbXBsZXMgZm9yIG90aGVyIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgc3ludGhlc2lzZWQgd2VsbCAKK2Zyb20gdGhlc2UgcmF0aGVyIG1lYWdlciB2ZWN0b3Igb3BzIChzdWNoIGFzIHNhdHVyYXRpbmcgYWRkKS4KK2h0dHA6Ly93d3cuYWxwaGFsaW51eC5vcmcvZG9jcy9NVkktZnVsbC5odG1sCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL1RhcmdldEluZm8vQWxwaGFUYXJnZXRJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvVGFyZ2V0SW5mby9BbHBoYVRhcmdldEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDk5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL1RhcmdldEluZm8vQWxwaGFUYXJnZXRJbmZvLmNwcApAQCAtMCwwICsxLDIwIEBACisvLz09PS0tIEFscGhhVGFyZ2V0SW5mby5jcHAgLSBBbHBoYSBUYXJnZXQgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQWxwaGEuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbGx2bTo6VGFyZ2V0IGxsdm06OlRoZUFscGhhVGFyZ2V0OworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVBbHBoYVRhcmdldEluZm8oKSB7IAorICBSZWdpc3RlclRhcmdldDxUcmlwbGU6OmFscGhhLCAvKkhhc0pJVD0qL3RydWU+CisgICAgWChUaGVBbHBoYVRhcmdldCwgImFscGhhIiwgIkFscGhhIFtleHBlcmltZW50YWxdIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MjkxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDcgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4gKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1BbHBoYUluZm8KKyAgQWxwaGFUYXJnZXRJbmZvLmNwcAorICApCisKK2FkZF9kZXBlbmRlbmNpZXMoTExWTUFscGhhSW5mbyBBbHBoYUNvZGVHZW5UYWJsZV9nZW4pCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL1RhcmdldEluZm8vTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0FscGhhL1RhcmdldEluZm8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwMWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQWxwaGEvVGFyZ2V0SW5mby9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RhcmdldC9BbHBoYS9UYXJnZXRJbmZvL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNQWxwaGFJbmZvCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFBGTEFHUyA9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0FzbVByaW50ZXIvQmxhY2tmaW5Bc21QcmludGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQXNtUHJpbnRlci9CbGFja2ZpbkFzbVByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTI1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0FzbVByaW50ZXIvQmxhY2tmaW5Bc21QcmludGVyLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLy89PT0tLSBCbGFja2ZpbkFzbVByaW50ZXIuY3BwIC0gQmxhY2tmaW4gTExWTSBhc3NlbWJseSB3cml0ZXIgLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBwcmludGVyIHRoYXQgY29udmVydHMgZnJvbSBvdXIgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KKy8vIG9mIG1hY2hpbmUtZGVwZW5kZW50IExMVk0gY29kZSB0byBHQVMtZm9ybWF0IEJMQUNLRklOIGFzc2VtYmx5IGxhbmd1YWdlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXNtLXByaW50ZXIiCisjaW5jbHVkZSAiQmxhY2tmaW4uaCIKKyNpbmNsdWRlICJCbGFja2Zpbkluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Bc21QcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3RyZWFtZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L01hbmdsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgQmxhY2tmaW5Bc21QcmludGVyIDogcHVibGljIEFzbVByaW50ZXIgeworICBwdWJsaWM6CisgICAgQmxhY2tmaW5Bc21QcmludGVyKFRhcmdldE1hY2hpbmUgJlRNLCBNQ1N0cmVhbWVyICZTdHJlYW1lcikKKyAgICAgIDogQXNtUHJpbnRlcihUTSwgU3RyZWFtZXIpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJCbGFja2ZpbiBBc3NlbWJseSBQcmludGVyIjsKKyAgICB9CisKKyAgICB2b2lkIHByaW50T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50TWVtb3J5T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSwgcmF3X29zdHJlYW0gJk8pOy8vIGF1dG9nZW4nZC4KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0UmVnaXN0ZXJOYW1lKHVuc2lnbmVkIFJlZ05vKTsKKworICAgIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgICAgIFNtYWxsU3RyaW5nPDEyOD4gU3RyOworICAgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhTdHIpOworICAgICAgcHJpbnRJbnN0cnVjdGlvbihNSSwgT1MpOworICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoT1Muc3RyKCkpOworICAgIH0KKyAgICBib29sIFByaW50QXNtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgYm9vbCBQcmludEFzbU1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICB9OworfSAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisjaW5jbHVkZSAiQmxhY2tmaW5HZW5Bc21Xcml0ZXIuaW5jIgorCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVCbGFja2ZpbkFzbVByaW50ZXIoKSB7CisgIFJlZ2lzdGVyQXNtUHJpbnRlcjxCbGFja2ZpbkFzbVByaW50ZXI+IFgoVGhlQmxhY2tmaW5UYXJnZXQpOworfQorCit2b2lkIEJsYWNrZmluQXNtUHJpbnRlcjo6cHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQob3BOdW0pOworICBzd2l0Y2ggKE1PLmdldFR5cGUoKSkgeworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19SZWdpc3RlcjoKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoTU8uZ2V0UmVnKCkpICYmCisgICAgICAgICAgICJWaXJ0dWFsIHJlZ2lzdGVycyBzaG91bGQgYmUgYWxyZWFkeSBtYXBwZWQhIik7CisgICAgTyA8PCBnZXRSZWdpc3Rlck5hbWUoTU8uZ2V0UmVnKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ltbWVkaWF0ZToKKyAgICBPIDw8IE1PLmdldEltbSgpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19NYWNoaW5lQmFzaWNCbG9jazoKKyAgICBPIDw8ICpNTy5nZXRNQkIoKS0+Z2V0U3ltYm9sKCk7CisgICAgcmV0dXJuOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOgorICAgIE8gPDwgKk1hbmctPmdldFN5bWJvbChNTy5nZXRHbG9iYWwoKSk7CisgICAgcHJpbnRPZmZzZXQoTU8uZ2V0T2Zmc2V0KCksIE8pOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19FeHRlcm5hbFN5bWJvbDoKKyAgICBPIDw8ICpHZXRFeHRlcm5hbFN5bWJvbFN5bWJvbChNTy5nZXRTeW1ib2xOYW1lKCkpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19Db25zdGFudFBvb2xJbmRleDoKKyAgICBPIDw8IE1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJDUEkiIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkgPDwgIl8iCisgICAgICA8PCBNTy5nZXRJbmRleCgpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19KdW1wVGFibGVJbmRleDoKKyAgICBPIDw8IE1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJKVEkiIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkKKyAgICAgIDw8ICdfJyA8PCBNTy5nZXRJbmRleCgpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIjx1bmtub3duIG9wZXJhbmQgdHlwZT4iKTsKKyAgICBicmVhazsKKyAgfQorfQorCit2b2lkIEJsYWNrZmluQXNtUHJpbnRlcjo6cHJpbnRNZW1vcnlPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgcHJpbnRPcGVyYW5kKE1JLCBvcE51bSwgTyk7CisKKyAgaWYgKE1JLT5nZXRPcGVyYW5kKG9wTnVtKzEpLmlzSW1tKCkgJiYgTUktPmdldE9wZXJhbmQob3BOdW0rMSkuZ2V0SW1tKCkgPT0gMCkKKyAgICByZXR1cm47CisKKyAgTyA8PCAiICsgIjsKKyAgcHJpbnRPcGVyYW5kKE1JLCBvcE51bSsxLCBPKTsKK30KKworLy8vIFByaW50QXNtT3BlcmFuZCAtIFByaW50IG91dCBhbiBvcGVyYW5kIGZvciBhbiBpbmxpbmUgYXNtIGV4cHJlc3Npb24uCisvLy8KK2Jvb2wgQmxhY2tmaW5Bc21QcmludGVyOjpQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BObywgdW5zaWduZWQgQXNtVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRXh0cmFDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBpZiAoRXh0cmFDb2RlICYmIEV4dHJhQ29kZVswXSkgeworICAgIGlmIChFeHRyYUNvZGVbMV0gIT0gMCkgcmV0dXJuIHRydWU7IC8vIFVua25vd24gbW9kaWZpZXIuCisKKyAgICBzd2l0Y2ggKEV4dHJhQ29kZVswXSkgeworICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlOyAgLy8gVW5rbm93biBtb2RpZmllci4KKyAgICBjYXNlICdyJzoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHByaW50T3BlcmFuZChNSSwgT3BObywgTyk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJsYWNrZmluQXNtUHJpbnRlcjo6UHJpbnRBc21NZW1vcnlPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgaWYgKEV4dHJhQ29kZSAmJiBFeHRyYUNvZGVbMF0pCisgICAgcmV0dXJuIHRydWU7ICAvLyBVbmtub3duIG1vZGlmaWVyCisKKyAgTyA8PCAnWyc7CisgIHByaW50T3BlcmFuZChNSSwgT3BObywgTyk7CisgIE8gPDwgJ10nOworCisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTVhZWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9Bc21QcmludGVyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTUJsYWNrZmluQXNtUHJpbnRlcgorICBCbGFja2ZpbkFzbVByaW50ZXIuY3BwCisgICkKK2FkZF9kZXBlbmRlbmNpZXMoTExWTUJsYWNrZmluQXNtUHJpbnRlciBCbGFja2ZpbkNvZGVHZW5UYWJsZV9nZW4pCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0FzbVByaW50ZXIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0FzbVByaW50ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwNmEyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQXNtUHJpbnRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjIz09PS0gbGliL1RhcmdldC9CbGFja2Zpbi9Bc21QcmludGVyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNQmxhY2tmaW5Bc21QcmludGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBCbGFja2ZpbiB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZQorIyBoZWFkZXJzCitDUFAuRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW4uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFmYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2Zpbi5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09IEJsYWNrZmluLmggLSBUb3AtbGV2ZWwgaW50ZXJmYWNlIGZvciBCbGFja2ZpbiBiYWNrZW5kIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBlbnRyeSBwb2ludHMgZm9yIGdsb2JhbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgTExWTQorLy8gQmxhY2tmaW4gYmFjay1lbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBUQVJHRVRfQkxBQ0tGSU5fSAorI2RlZmluZSBUQVJHRVRfQkxBQ0tGSU5fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBjbGFzcyBCbGFja2ZpblRhcmdldE1hY2hpbmU7CisKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVCbGFja2ZpbklTZWxEYWcoQmxhY2tmaW5UYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworICBleHRlcm4gVGFyZ2V0IFRoZUJsYWNrZmluVGFyZ2V0OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciBCbGFja2ZpbiByZWdpc3RlcnMuICBUaGlzIGRlZmluZXMgYSBtYXBwaW5nIGZyb20KKy8vIHJlZ2lzdGVyIG5hbWUgdG8gcmVnaXN0ZXIgbnVtYmVyLgorI2luY2x1ZGUgIkJsYWNrZmluR2VuUmVnaXN0ZXJOYW1lcy5pbmMiCisKKy8vIERlZmluZXMgc3ltYm9saWMgbmFtZXMgZm9yIHRoZSBCbGFja2ZpbiBpbnN0cnVjdGlvbnMuCisjaW5jbHVkZSAiQmxhY2tmaW5HZW5JbnN0ck5hbWVzLmluYyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2Zpbi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDkwOTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2Zpbi50ZApAQCAtMCwwICsxLDIwMiBAQAorLy89PT0tIEJsYWNrZmluLnRkIC0gRGVzY3JpYmUgdGhlIEJsYWNrZmluIFRhcmdldCBNYWNoaW5lIC0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHdoaWNoIHdlIGFyZSBpbXBsZW1lbnRpbmcKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldC50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJsYWNrZmluIFN1YnRhcmdldCBmZWF0dXJlcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiBGZWF0dXJlU0RSQU0gOiBTdWJ0YXJnZXRGZWF0dXJlPCJzZHJhbSIsICJzZHJhbSIsICJ0cnVlIiwKKyAgICAiQnVpbGQgZm9yIFNEUkFNIj47CisKK2RlZiBGZWF0dXJlSUNQTEIgOiBTdWJ0YXJnZXRGZWF0dXJlPCJpY3BsYiIsICJpY3BsYiIsICJ0cnVlIiwKKyAgICAiQXNzdW1lIGluc3RydWN0aW9uIGNhY2hlIGxvb2thc2lkZSBidWZmZXJzIGFyZSBlbmFibGVkIGF0IHJ1bnRpbWUiPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJ1Z3MgaW4gdGhlIHNpbGljb24gYmVjb21lcyB3b3JrYXJvdW5kcyBpbiB0aGUgY29tcGlsZXIuCisvLyBTZWUgaHR0cDovL3d3dy5hbmFsb2cuY29tLyBmb3IgdGhlIGZ1bGwgbGlzdCBvZiBJQyBhbm9tYWxpZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgV0FfTUlfU0hJRlQgOiBTdWJ0YXJnZXRGZWF0dXJlPCJtaS1zaGlmdC1hbm9tYWx5Iiwid2FfbWlfc2hpZnQiLCAidHJ1ZSIsCisgICAgIldvcmsgYXJvdW5kIDA1MDAwMDc0IC0gIgorICAgICJNdWx0aS1Jc3N1ZSBJbnN0cnVjdGlvbiB3aXRoIGRzcDMyc2hpZnRpbW0gYW5kIFAtcmVnIFN0b3JlIj47CisKK2RlZiBXQV9DU1lOQyA6IFN1YnRhcmdldEZlYXR1cmU8ImNzeW5jLWFub21hbHkiLCJ3YV9jc3luYyIsICJ0cnVlIiwKKyAgICAiV29yayBhcm91bmQgMDUwMDAyNDQgLSAiCisgICAgIklmIEktQ2FjaGUgSXMgT24sIENTWU5DL1NTWU5DL0lETEUgQXJvdW5kIENoYW5nZSBvZiBDb250cm9sIj47CisKK2RlZiBXQV9TUEVDTEQgOiBTdWJ0YXJnZXRGZWF0dXJlPCJzcGVjbGQtYW5vbWFseSIsIndhX3NwZWNsZCIsICJ0cnVlIiwKKyAgICAiV29yayBhcm91bmQgMDUwMDAyNDUgLSAiCisgICAgIkFjY2VzcyBpbiB0aGUgU2hhZG93IG9mIGEgQ29uZGl0aW9uYWwgQnJhbmNoIj47CisKK2RlZiBXQV9IV0xPT1AgOiBTdWJ0YXJnZXRGZWF0dXJlPCJod2xvb3AtYW5vbWFseSIsIndhX2h3bG9vcCIsICJ0cnVlIiwKKyAgICAiV29yayBhcm91bmQgMDUwMDAyNTcgLSAiCisgICAgIkludGVycnVwdC9FeGNlcHRpb24gRHVyaW5nIFNob3J0IEhhcmR3YXJlIExvb3AiPjsKKworZGVmIFdBX01NUl9TVEFMTCA6IFN1YnRhcmdldEZlYXR1cmU8Im1tci1zdGFsbC1hbm9tYWx5Iiwid2FfbW1yX3N0YWxsIiwgInRydWUiLAorICAgICJXb3JrIGFyb3VuZCAwNTAwMDI4MyAtICIKKyAgICAiU3lzdGVtIE1NUiBXcml0ZSBJcyBTdGFsbGVkIEluZGVmaW5pdGVseSB3aGVuIEtpbGxlZCI+OworCitkZWYgV0FfTENSRUdTIDogU3VidGFyZ2V0RmVhdHVyZTwibGNyZWdzLWFub21hbHkiLCJ3YV9sY3JlZ3MiLCAidHJ1ZSIsCisgICAgIldvcmsgYXJvdW5kIDA1MDAwMzEyIC0gIgorICAgICJTU1lOQywgQ1NZTkMsIG9yIExvYWRzIHRvIExULCBMQiBhbmQgTEMgUmVnaXN0ZXJzIEFyZSBJbnRlcnJ1cHRlZCI+OworCitkZWYgV0FfS0lMTEVEX01NUiA6IFN1YnRhcmdldEZlYXR1cmU8ImtpbGxlZC1tbXItYW5vbWFseSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhX2tpbGxlZF9tbXIiLCAidHJ1ZSIsCisgICAgIldvcmsgYXJvdW5kIDA1MDAwMzE1IC0gIgorICAgICJLaWxsZWQgU3lzdGVtIE1NUiBXcml0ZSBDb21wbGV0ZXMgRXJyb25lb3VzbHkgb24gTmV4dCBTeXN0ZW0gTU1SIEFjY2VzcyI+OworCitkZWYgV0FfUkVUUyA6IFN1YnRhcmdldEZlYXR1cmU8InJldHMtYW5vbWFseSIsICJ3YV9yZXRzIiwgInRydWUiLAorICAgICJXb3JrIGFyb3VuZCAwNTAwMDM3MSAtICIKKyAgICAiUG9zc2libGUgUkVUUyBSZWdpc3RlciBDb3JydXB0aW9uIHdoZW4gU3Vicm91dGluZSBJcyB1bmRlciA1IEN5Y2xlcyI+OworCitkZWYgV0FfSU5EX0NBTEwgOiBTdWJ0YXJnZXRGZWF0dXJlPCJpbmQtY2FsbC1hbm9tYWx5IiwgIndhX2luZF9jYWxsIiwgInRydWUiLAorICAgICJXb3JrIGFyb3VuZCAwNTAwMDQyNiAtICIKKyAgICAiU3BlY3VsYXRpdmUgRmV0Y2hlcyBvZiBJbmRpcmVjdC1Qb2ludGVyIEluc3RydWN0aW9ucyI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmVnaXN0ZXIgRmlsZSwgQ2FsbGluZyBDb252LCBJbnN0cnVjdGlvbiBEZXNjcmlwdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgIkJsYWNrZmluUmVnaXN0ZXJJbmZvLnRkIgoraW5jbHVkZSAiQmxhY2tmaW5DYWxsaW5nQ29udi50ZCIKK2luY2x1ZGUgIkJsYWNrZmluSW50cmluc2ljcy50ZCIKK2luY2x1ZGUgIkJsYWNrZmluSW5zdHJJbmZvLnRkIgorCitkZWYgQmxhY2tmaW5JbnN0ckluZm8gOiBJbnN0ckluZm8ge30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJsYWNrZmluIHByb2Nlc3NvcnMgc3VwcG9ydGVkLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgUHJvYzxzdHJpbmcgTmFtZSwgc3RyaW5nIFN1ZmZpeCwgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBGZWF0dXJlcz4KKyA6IFByb2Nlc3Nvcjwhc3RyY29uY2F0KE5hbWUsIFN1ZmZpeCksIE5vSXRpbmVyYXJpZXMsIEZlYXR1cmVzPjsKKworZGVmIDogUHJvYzwiZ2VuZXJpYyIsICIiLCBbXT47CisKK211bHRpY2xhc3MgQ29yZTxzdHJpbmcgTmFtZSxzdHJpbmcgU3VmZml4LAorICAgICAgICAgICAgICAgIGxpc3Q8U3VidGFyZ2V0RmVhdHVyZT4gRmVhdHVyZXM+IHsKKyAgZGVmIDogUHJvYzxOYW1lLCBTdWZmaXgsIEZlYXR1cmVzPjsKKyAgZGVmIDogUHJvYzxOYW1lLCAiIiwgRmVhdHVyZXM+OworICBkZWYgOiBQcm9jPE5hbWUsICItbm9uZSIsIFtdPjsKK30KKworbXVsdGljbGFzcyBDb3JlRWRpbmJ1cmdoPHN0cmluZyBOYW1lPgorICAgICAgOiBDb3JlPE5hbWUsICItMC42IiwgW1dBX01JX1NISUZULCBXQV9TUEVDTEQsIFdBX0xDUkVHU10+IHsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLTAuNSIsCisgICAgICAgIFtXQV9NSV9TSElGVCwgV0FfU1BFQ0xELCBXQV9NTVJfU1RBTEwsIFdBX0xDUkVHUywgV0FfS0lMTEVEX01NUiwKKyAgICAgICAgIFdBX1JFVFNdPjsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLTAuNCIsCisgICAgICAgIFtXQV9NSV9TSElGVCwgV0FfQ1NZTkMsIFdBX1NQRUNMRCwgV0FfSFdMT09QLCBXQV9NTVJfU1RBTEwsIFdBX0xDUkVHUywKKyAgICAgICAgIFdBX0tJTExFRF9NTVIsIFdBX1JFVFNdPjsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLTAuMyIsCisgICAgICAgIFtXQV9NSV9TSElGVCwgV0FfQ1NZTkMsIFdBX1NQRUNMRCwgV0FfSFdMT09QLCBXQV9NTVJfU1RBTEwsIFdBX0xDUkVHUywKKyAgICAgICAgIFdBX0tJTExFRF9NTVIsIFdBX1JFVFNdPjsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLWFueSIsCisgICAgICAgIFtXQV9NSV9TSElGVCwgV0FfQ1NZTkMsIFdBX1NQRUNMRCwgV0FfSFdMT09QLCBXQV9NTVJfU1RBTEwsIFdBX0xDUkVHUywKKyAgICAgICAgIFdBX0tJTExFRF9NTVIsIFdBX1JFVFNdPjsKK30KK211bHRpY2xhc3MgQ29yZUJyYWVtYXI8c3RyaW5nIE5hbWU+CisgICAgICAgOiBDb3JlPE5hbWUsICItMC4zIiwKKyAgICAgICAgIFtXQV9NSV9TSElGVCwgV0FfU1BFQ0xELCBXQV9MQ1JFR1MsIFdBX1JFVFMsIFdBX0lORF9DQUxMXT4geworICBkZWYgIDogUHJvYzxOYW1lLCAiLTAuMiIsCisgICAgICAgICBbV0FfTUlfU0hJRlQsIFdBX0NTWU5DLCBXQV9TUEVDTEQsIFdBX0hXTE9PUCwgV0FfTU1SX1NUQUxMLCBXQV9MQ1JFR1MsCisgICAgICAgICAgV0FfS0lMTEVEX01NUiwgV0FfUkVUUywgV0FfSU5EX0NBTExdPjsKKyAgZGVmICA6IFByb2M8TmFtZSwgIi1hbnkiLAorICAgICAgICAgW1dBX01JX1NISUZULCBXQV9DU1lOQywgV0FfU1BFQ0xELCBXQV9IV0xPT1AsIFdBX01NUl9TVEFMTCwgV0FfTENSRUdTLAorICAgICAgICAgIFdBX0tJTExFRF9NTVIsIFdBX1JFVFMsIFdBX0lORF9DQUxMXT47Cit9CittdWx0aWNsYXNzIENvcmVTdGlybGluZzxzdHJpbmcgTmFtZT4KKyAgICAgIDogQ29yZTxOYW1lLCAiLTAuNSIsIFtXQV9NSV9TSElGVCwgV0FfU1BFQ0xELCBXQV9JTkRfQ0FMTF0+IHsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLTAuNCIsCisgICAgICAgIFtXQV9NSV9TSElGVCwgV0FfU1BFQ0xELCBXQV9MQ1JFR1MsIFdBX1JFVFMsIFdBX0lORF9DQUxMXT47CisgIGRlZiA6IFByb2M8TmFtZSwgIi0wLjMiLAorICAgICAgICBbV0FfTUlfU0hJRlQsIFdBX1NQRUNMRCwgV0FfTU1SX1NUQUxMLCBXQV9MQ1JFR1MsIFdBX0tJTExFRF9NTVIsCisgICAgICAgICBXQV9SRVRTLCBXQV9JTkRfQ0FMTF0+OworICBkZWYgOiBQcm9jPE5hbWUsICItYW55IiwKKyAgICAgICAgW1dBX01JX1NISUZULCBXQV9TUEVDTEQsIFdBX01NUl9TVEFMTCwgV0FfTENSRUdTLCBXQV9LSUxMRURfTU1SLAorICAgICAgICAgV0FfUkVUUywgV0FfSU5EX0NBTExdPjsKK30KK211bHRpY2xhc3MgQ29yZU1vYWI8c3RyaW5nIE5hbWU+CisgICAgICA6IENvcmU8TmFtZSwgIi0wLjMiLCBbV0FfTUlfU0hJRlQsIFdBX1NQRUNMRCwgV0FfSU5EX0NBTExdPiB7CisgIGRlZiA6IFByb2M8TmFtZSwgIi0wLjIiLCBbV0FfTUlfU0hJRlQsIFdBX1NQRUNMRCwgV0FfSU5EX0NBTExdPjsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLTAuMSIsIFtXQV9NSV9TSElGVCwgV0FfU1BFQ0xELCBXQV9SRVRTLCBXQV9JTkRfQ0FMTF0+OworICBkZWYgOiBQcm9jPE5hbWUsICItMC4wIiwKKyAgICAgICAgW1dBX01JX1NISUZULCBXQV9TUEVDTEQsIFdBX0xDUkVHUywgV0FfUkVUUywgV0FfSU5EX0NBTExdPjsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLWFueSIsCisgICAgICAgIFtXQV9NSV9TSElGVCwgV0FfU1BFQ0xELCBXQV9MQ1JFR1MsIFdBX1JFVFMsIFdBX0lORF9DQUxMXT47Cit9CittdWx0aWNsYXNzIENvcmVUZXRvbjxzdHJpbmcgTmFtZT4KKyAgICAgIDogQ29yZTxOYW1lLCAiLTAuNSIsCisgICAgICAgIFtXQV9NSV9TSElGVCwgV0FfU1BFQ0xELCBXQV9NTVJfU1RBTEwsIFdBX0xDUkVHUywgV0FfS0lMTEVEX01NUiwKKyAgICAgICAgIFdBX1JFVFMsIFdBX0lORF9DQUxMXT4geworICBkZWYgOiBQcm9jPE5hbWUsICItMC4zIiwKKyAgICAgICAgW1dBX01JX1NISUZULCBXQV9DU1lOQywgV0FfU1BFQ0xELCBXQV9IV0xPT1AsIFdBX01NUl9TVEFMTCwgV0FfTENSRUdTLAorICAgICAgICAgV0FfS0lMTEVEX01NUiwgV0FfUkVUUywgV0FfSU5EX0NBTExdPjsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLWFueSIsCisgICAgICAgIFtXQV9NSV9TSElGVCwgV0FfQ1NZTkMsIFdBX1NQRUNMRCwgV0FfSFdMT09QLCBXQV9NTVJfU1RBTEwsIFdBX0xDUkVHUywKKyAgICAgICAgIFdBX0tJTExFRF9NTVIsIFdBX1JFVFMsIFdBX0lORF9DQUxMXT47Cit9CittdWx0aWNsYXNzIENvcmVLb29rYWJ1cnJhPHN0cmluZyBOYW1lPgorICAgICAgOiBDb3JlPE5hbWUsICItMC4yIiwgW1dBX01JX1NISUZULCBXQV9TUEVDTEQsIFdBX0lORF9DQUxMXT4geworICBkZWYgOiBQcm9jPE5hbWUsICItMC4xIiwgW1dBX01JX1NISUZULCBXQV9TUEVDTEQsIFdBX1JFVFMsIFdBX0lORF9DQUxMXT47CisgIGRlZiA6IFByb2M8TmFtZSwgIi0wLjAiLCBbV0FfTUlfU0hJRlQsIFdBX1NQRUNMRCwgV0FfUkVUUywgV0FfSU5EX0NBTExdPjsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLWFueSIsIFtXQV9NSV9TSElGVCwgV0FfU1BFQ0xELCBXQV9SRVRTLCBXQV9JTkRfQ0FMTF0+OworfQorbXVsdGljbGFzcyBDb3JlTW9ja2luZ2JpcmQ8c3RyaW5nIE5hbWU+CisgICAgICA6IENvcmU8TmFtZSwgIi0wLjEiLCBbV0FfTUlfU0hJRlQsIFdBX1NQRUNMRCwgV0FfSU5EX0NBTExdPiB7CisgIGRlZiA6IFByb2M8TmFtZSwgIi0wLjAiLCBbV0FfTUlfU0hJRlQsIFdBX1NQRUNMRCwgV0FfSU5EX0NBTExdPjsKKyAgZGVmIDogUHJvYzxOYW1lLCAiLWFueSIsIFtXQV9NSV9TSElGVCwgV0FfU1BFQ0xELCBXQV9JTkRfQ0FMTF0+OworfQorbXVsdGljbGFzcyBDb3JlQnJvZGllPHN0cmluZyBOYW1lPgorICAgICAgOiBDb3JlPE5hbWUsICItMC4xIiwgW1dBX01JX1NISUZULCBXQV9TUEVDTEQsIFdBX0lORF9DQUxMXT4geworICBkZWYgOiBQcm9jPE5hbWUsICItMC4wIiwgW1dBX01JX1NISUZULCBXQV9TUEVDTEQsIFdBX0lORF9DQUxMXT47CisgIGRlZiA6IFByb2M8TmFtZSwgIi1hbnkiLCBbV0FfTUlfU0hJRlQsIFdBX1NQRUNMRCwgV0FfSU5EX0NBTExdPjsKK30KKworZGVmbSBCRjUxMiA6IENvcmVCcm9kaWU8ImJmNTEyIj47CitkZWZtIEJGNTE0IDogQ29yZUJyb2RpZTwiYmY1MTQiPjsKK2RlZm0gQkY1MTYgOiBDb3JlQnJvZGllPCJiZjUxNiI+OworZGVmbSBCRjUxOCA6IENvcmVCcm9kaWU8ImJmNTE4Ij47CitkZWZtIEJGNTIyIDogQ29yZU1vY2tpbmdiaXJkPCJiZjUyMiI+OworZGVmbSBCRjUyMyA6IENvcmVLb29rYWJ1cnJhPCJiZjUyMyI+OworZGVmbSBCRjUyNCA6IENvcmVNb2NraW5nYmlyZDwiYmY1MjQiPjsKK2RlZm0gQkY1MjUgOiBDb3JlS29va2FidXJyYTwiYmY1MjUiPjsKK2RlZm0gQkY1MjYgOiBDb3JlTW9ja2luZ2JpcmQ8ImJmNTI2Ij47CitkZWZtIEJGNTI3IDogQ29yZUtvb2thYnVycmE8ImJmNTI3Ij47CitkZWZtIEJGNTMxIDogQ29yZUVkaW5idXJnaDwiYmY1MzEiPjsKK2RlZm0gQkY1MzIgOiBDb3JlRWRpbmJ1cmdoPCJiZjUzMiI+OworZGVmbSBCRjUzMyA6IENvcmVFZGluYnVyZ2g8ImJmNTMzIj47CitkZWZtIEJGNTM0IDogQ29yZUJyYWVtYXI8ImJmNTM0Ij47CitkZWZtIEJGNTM2IDogQ29yZUJyYWVtYXI8ImJmNTM2Ij47CitkZWZtIEJGNTM3IDogQ29yZUJyYWVtYXI8ImJmNTM3Ij47CitkZWZtIEJGNTM4IDogQ29yZVN0aXJsaW5nPCJiZjUzOCI+OworZGVmbSBCRjUzOSA6IENvcmVTdGlybGluZzwiYmY1MzkiPjsKK2RlZm0gQkY1NDIgOiBDb3JlTW9hYjwiYmY1NDIiPjsKK2RlZm0gQkY1NDQgOiBDb3JlTW9hYjwiYmY1NDQiPjsKK2RlZm0gQkY1NDggOiBDb3JlTW9hYjwiYmY1NDgiPjsKK2RlZm0gQkY1NDkgOiBDb3JlTW9hYjwiYmY1NDkiPjsKK2RlZm0gQkY1NjEgOiBDb3JlVGV0b248ImJmNTYxIj47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWNsYXJlIHRoZSB0YXJnZXQgd2hpY2ggd2UgYXJlIGltcGxlbWVudGluZworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIEJsYWNrZmluIDogVGFyZ2V0IHsKKyAgLy8gUHVsbCBpbiBJbnN0cnVjdGlvbiBJbmZvOgorICBsZXQgSW5zdHJ1Y3Rpb25TZXQgPSBCbGFja2Zpbkluc3RySW5mbzsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5DYWxsaW5nQ29udi50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5DYWxsaW5nQ29udi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWJjODRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpbkNhbGxpbmdDb252LnRkCkBAIC0wLDAgKzEsMzAgQEAKKy8vPT09LS0tIEJsYWNrZmluQ2FsbGluZ0NvbnYudGQgLSBDYWxsaW5nIENvbnZlbnRpb25zIC0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBkZXNjcmliZXMgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIHRoZSBCbGFja2ZpbiBhcmNoaXRlY3R1cmVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEJsYWNrZmluIEMgQ2FsbGluZyBjb252ZW50aW9uLgorZGVmIENDX0JsYWNrZmluIDogQ2FsbGluZ0NvbnY8WworICBDQ0lmVHlwZTxbaTE2XSwgQ0NQcm9tb3RlVG9UeXBlPGkzMj4+LAorICBDQ0lmU1JldDxDQ0Fzc2lnblRvUmVnPFtQMF0+PiwKKyAgQ0NBc3NpZ25Ub1JlZzxbUjAsIFIxLCBSMl0+LAorICBDQ0Fzc2lnblRvU3RhY2s8NCwgND4KK10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmV0dXJuIFZhbHVlIENhbGxpbmcgQ29udmVudGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEJsYWNrZmluIEMgcmV0dXJuLXZhbHVlIGNvbnZlbnRpb24uCitkZWYgUmV0Q0NfQmxhY2tmaW4gOiBDYWxsaW5nQ29udjxbCisgIENDSWZUeXBlPFtpMTZdLCBDQ1Byb21vdGVUb1R5cGU8aTMyPj4sCisgIENDQXNzaWduVG9SZWc8W1IwLCBSMV0+CitdPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JU2VsREFHVG9EQUcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpbklTZWxEQUdUb0RBRy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlZTEwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JU2VsREFHVG9EQUcuY3BwCkBAIC0wLDAgKzEsMTgyIEBACisvLz09PS0gQmxhY2tmaW5JU2VsREFHVG9EQUcuY3BwIC0gQSBkYWcgdG8gZGFnIGluc3Qgc2VsZWN0b3IgZm9yIEJsYWNrZmluIC09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGluc3RydWN0aW9uIHNlbGVjdG9yIGZvciB0aGUgQmxhY2tmaW4gdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJCbGFja2Zpbi5oIgorI2luY2x1ZGUgIkJsYWNrZmluVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIkJsYWNrZmluUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gU2VsZWN0b3IgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQmxhY2tmaW5EQUdUb0RBR0lTZWwgLSBCbGFja2ZpbiBzcGVjaWZpYyBjb2RlIHRvIHNlbGVjdCBibGFja2ZpbiBtYWNoaW5lCisvLy8gaW5zdHJ1Y3Rpb25zIGZvciBTZWxlY3Rpb25EQUcgb3BlcmF0aW9ucy4KK25hbWVzcGFjZSB7CisgIGNsYXNzIEJsYWNrZmluREFHVG9EQUdJU2VsIDogcHVibGljIFNlbGVjdGlvbkRBR0lTZWwgeworICAgIC8vLyBTdWJ0YXJnZXQgLSBLZWVwIGEgcG9pbnRlciB0byB0aGUgQmxhY2tmaW4gU3VidGFyZ2V0IGFyb3VuZCBzbyB0aGF0IHdlCisgICAgLy8vIGNhbiBtYWtlIHRoZSByaWdodCBkZWNpc2lvbiB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgZGlmZmVyZW50IHRhcmdldHMuCisgICAgLy9jb25zdCBCbGFja2ZpblN1YnRhcmdldCAmU3VidGFyZ2V0OworICBwdWJsaWM6CisgICAgQmxhY2tmaW5EQUdUb0RBR0lTZWwoQmxhY2tmaW5UYXJnZXRNYWNoaW5lICZUTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpCisgICAgICA6IFNlbGVjdGlvbkRBR0lTZWwoVE0sIE9wdExldmVsKSB7fQorCisgICAgdmlydHVhbCB2b2lkIFBvc3Rwcm9jZXNzSVNlbERBRygpOworCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiQmxhY2tmaW4gREFHLT5EQUcgUGF0dGVybiBJbnN0cnVjdGlvbiBTZWxlY3Rpb24iOworICAgIH0KKworICAgIC8vIEluY2x1ZGUgdGhlIHBpZWNlcyBhdXRvZ2VuZXJhdGVkIGZyb20gdGhlIHRhcmdldCBkZXNjcmlwdGlvbi4KKyNpbmNsdWRlICJCbGFja2ZpbkdlbkRBR0lTZWwuaW5jIgorCisgIHByaXZhdGU6CisgICAgU0ROb2RlICpTZWxlY3QoU0ROb2RlICpOKTsKKyAgICBib29sIFNlbGVjdEFERFJzcGlpKFNETm9kZSAqT3AsIFNEVmFsdWUgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJk9mZnNldCk7CisKKyAgICAvLyBXYWxrIHRoZSBEQUcgYWZ0ZXIgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLCBmaXhpbmcgcmVnaXN0ZXIgY2xhc3MgaXNzdWVzLgorICAgIHZvaWQgRml4UmVnaXN0ZXJDbGFzc2VzKFNlbGVjdGlvbkRBRyAmREFHKTsKKworICAgIGNvbnN0IEJsYWNrZmluSW5zdHJJbmZvICZnZXRJbnN0ckluZm8oKSB7CisgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IEJsYWNrZmluVGFyZ2V0TWFjaGluZSY+KFRNKS5nZXRJbnN0ckluZm8oKTsKKyAgICB9CisgICAgY29uc3QgQmxhY2tmaW5SZWdpc3RlckluZm8gKmdldFJlZ2lzdGVySW5mbygpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBCbGFja2ZpblRhcmdldE1hY2hpbmUmPihUTSkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgfQorICB9OworfSAgLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVCbGFja2ZpbklTZWxEYWcoQmxhY2tmaW5UYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIHJldHVybiBuZXcgQmxhY2tmaW5EQUdUb0RBR0lTZWwoVE0sIE9wdExldmVsKTsKK30KKwordm9pZCBCbGFja2ZpbkRBR1RvREFHSVNlbDo6UG9zdHByb2Nlc3NJU2VsREFHKCkgeworICBGaXhSZWdpc3RlckNsYXNzZXMoKkN1ckRBRyk7Cit9CisKK1NETm9kZSAqQmxhY2tmaW5EQUdUb0RBR0lTZWw6OlNlbGVjdChTRE5vZGUgKk4pIHsKKyAgaWYgKE4tPmlzTWFjaGluZU9wY29kZSgpKQorICAgIHJldHVybiBOVUxMOyAgIC8vIEFscmVhZHkgc2VsZWN0ZWQuCisKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6OkZyYW1lSW5kZXg6IHsKKyAgICAvLyBTZWxlY3RzIHRvIEFERHBwIEZJLCAwIHdoaWNoIGluIHR1cm4gd2lsbCBiZWNvbWUgQUREaW1tNyBTUCwgaW1tIG9yIEFERHBwCisgICAgLy8gU1AsIFB4CisgICAgaW50IEZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOKS0+Z2V0SW5kZXgoKTsKKyAgICBTRFZhbHVlIFRGSSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSSwgTVZUOjppMzIpOworICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBCRjo6QUREcHAsIE1WVDo6aTMyLCBURkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpKTsKKyAgfQorICB9CisKKyAgcmV0dXJuIFNlbGVjdENvZGUoTik7Cit9CisKK2Jvb2wgQmxhY2tmaW5EQUdUb0RBR0lTZWw6OlNlbGVjdEFERFJzcGlpKFNETm9kZSAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2Zmc2V0KSB7CisgIEZyYW1lSW5kZXhTRE5vZGUgKkZJTiA9IDA7CisgIGlmICgoRklOID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4oQWRkcikpKSB7CisgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSU4tPmdldEluZGV4KCksIE1WVDo6aTMyKTsKKyAgICBPZmZzZXQgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoQWRkci5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIENvbnN0YW50U0ROb2RlICpDTiA9IDA7CisgICAgaWYgKChGSU4gPSBkeW5fY2FzdDxGcmFtZUluZGV4U0ROb2RlPihBZGRyLmdldE9wZXJhbmQoMCkpKSAmJgorICAgICAgICAoQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oQWRkci5nZXRPcGVyYW5kKDEpKSkgJiYKKyAgICAgICAgKENOLT5nZXRTRXh0VmFsdWUoKSAlIDQgPT0gMCAmJiBDTi0+Z2V0U0V4dFZhbHVlKCkgPj0gMCkpIHsKKyAgICAgIC8vIENvbnN0YW50IHBvc2l0aXZlIHdvcmQgb2Zmc2V0IGZyb20gZnJhbWUgaW5kZXgKKyAgICAgIEJhc2UgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRklOLT5nZXRJbmRleCgpLCBNVlQ6OmkzMik7CisgICAgICBPZmZzZXQgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KENOLT5nZXRTRXh0VmFsdWUoKSwgTVZUOjppMzIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzQ0MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIHsKKyAgcmV0dXJuIFJDID09ICZCRjo6QW55Q0NSZWdDbGFzcyB8fCBCRjo6QW55Q0NSZWdDbGFzcy5oYXNTdWJDbGFzcyhSQyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0RDQyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgeworICByZXR1cm4gUkMgPT0gJkJGOjpEUmVnQ2xhc3MgfHwgQkY6OkRSZWdDbGFzcy5oYXNTdWJDbGFzcyhSQykgfHwgaXNDQyhSQyk7Cit9CisKK3N0YXRpYyB2b2lkIFVwZGF0ZU5vZGVPcGVyYW5kKFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBWYWwpIHsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gb3BzKE4tPm9wX2JlZ2luKCksIE4tPm9wX2VuZCgpKTsKKyAgb3BzW051bV0gPSBWYWw7CisgIFNETm9kZSAqTmV3ID0gREFHLlVwZGF0ZU5vZGVPcGVyYW5kcyhOLCBvcHMuZGF0YSgpLCBvcHMuc2l6ZSgpKTsKKyAgREFHLlJlcGxhY2VBbGxVc2VzV2l0aChOLCBOZXcpOworfQorCisvLyBBZnRlciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24sIGluc2VydCBDT1BZX1RPX1JFR0NMQVNTIG5vZGVzIHRvIGhlbHAgaW4KKy8vIGNob29zaW5nIHRoZSBwcm9wZXIgcmVnaXN0ZXIgY2xhc3Nlcy4KK3ZvaWQgQmxhY2tmaW5EQUdUb0RBR0lTZWw6OkZpeFJlZ2lzdGVyQ2xhc3NlcyhTZWxlY3Rpb25EQUcgJkRBRykgeworICBjb25zdCBCbGFja2Zpbkluc3RySW5mbyAmVElJID0gZ2V0SW5zdHJJbmZvKCk7CisgIGNvbnN0IEJsYWNrZmluUmVnaXN0ZXJJbmZvICpUUkkgPSBnZXRSZWdpc3RlckluZm8oKTsKKyAgREFHLkFzc2lnblRvcG9sb2dpY2FsT3JkZXIoKTsKKyAgSGFuZGxlU0ROb2RlIER1bW15KERBRy5nZXRSb290KCkpOworCisgIGZvciAoU2VsZWN0aW9uREFHOjphbGxub2Rlc19pdGVyYXRvciBOSSA9IERBRy5hbGxub2Rlc19iZWdpbigpOworICAgICAgIE5JICE9IERBRy5hbGxub2Rlc19lbmQoKTsgKytOSSkgeworICAgIGlmIChOSS0+dXNlX2VtcHR5KCkgfHwgIU5JLT5pc01hY2hpbmVPcGNvZGUoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmRGVmVElEID0gVElJLmdldChOSS0+Z2V0TWFjaGluZU9wY29kZSgpKTsKKyAgICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIFVJID0gTkktPnVzZV9iZWdpbigpOyAhVUkuYXRFbmQoKTsgKytVSSkgeworICAgICAgaWYgKCFVSS0+aXNNYWNoaW5lT3Bjb2RlKCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoVUkuZ2V0VXNlKCkuZ2V0UmVzTm8oKSA+PSBEZWZUSUQuZ2V0TnVtRGVmcygpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkRlZlJDID0KKyAgICAgICAgRGVmVElELk9wSW5mb1tVSS5nZXRVc2UoKS5nZXRSZXNObygpXS5nZXRSZWdDbGFzcyhUUkkpOworCisgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlVzZVRJRCA9IFRJSS5nZXQoVUktPmdldE1hY2hpbmVPcGNvZGUoKSk7CisgICAgICBpZiAoVXNlVElELmdldE51bURlZnMoKStVSS5nZXRPcGVyYW5kTm8oKSA+PSBVc2VUSUQuZ2V0TnVtT3BlcmFuZHMoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpVc2VSQyA9CisgICAgICAgIFVzZVRJRC5PcEluZm9bVXNlVElELmdldE51bURlZnMoKStVSS5nZXRPcGVyYW5kTm8oKV0uZ2V0UmVnQ2xhc3MoVFJJKTsKKyAgICAgIGlmICghRGVmUkMgfHwgIVVzZVJDKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIFdlIGNhbm5vdCBjb3B5IENDIDwtPiAhKENDL0QpCisgICAgICBpZiAoKGlzQ0MoRGVmUkMpICYmICFpc0RDQyhVc2VSQykpIHx8IChpc0NDKFVzZVJDKSAmJiAhaXNEQ0MoRGVmUkMpKSkgeworICAgICAgICBTRE5vZGUgKkNvcHkgPQorICAgICAgICAgIERBRy5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OkNPUFlfVE9fUkVHQ0xBU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUkuZ2V0VXNlKCkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRUYXJnZXRDb25zdGFudChCRjo6RFJlZ0NsYXNzSUQsIE1WVDo6aTMyKSk7CisgICAgICAgIFVwZGF0ZU5vZGVPcGVyYW5kKERBRywgKlVJLCBVSS5nZXRPcGVyYW5kTm8oKSwgU0RWYWx1ZShDb3B5LCAwKSk7CisgICAgICB9CisgICAgfQorICB9CisgIERBRy5zZXRSb290KER1bW15LmdldFZhbHVlKCkpOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSVNlbExvd2VyaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JU2VsTG93ZXJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODI4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSVNlbExvd2VyaW5nLmNwcApAQCAtMCwwICsxLDYxOCBAQAorLy89PT0tIEJsYWNrZmluSVNlbExvd2VyaW5nLmNwcCAtIEJsYWNrZmluIERBRyBMb3dlcmluZyBJbXBsZW1lbnRhdGlvbiAtLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlcyB0aGF0IEJsYWNrZmluIHVzZXMgdG8gbG93ZXIgTExWTSBjb2RlCisvLyBpbnRvIGEgc2VsZWN0aW9uIERBRy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQmxhY2tmaW5JU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJCbGFja2ZpblRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVJbXBsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVmVjdG9yRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ2FsbGluZyBDb252ZW50aW9uIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQmxhY2tmaW5HZW5DYWxsaW5nQ29udi5pbmMiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYXJnZXRMb3dlcmluZyBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQmxhY2tmaW5UYXJnZXRMb3dlcmluZzo6QmxhY2tmaW5UYXJnZXRMb3dlcmluZyhUYXJnZXRNYWNoaW5lICZUTSkKKyAgOiBUYXJnZXRMb3dlcmluZyhUTSwgbmV3IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRigpKSB7CisgIHNldFNoaWZ0QW1vdW50VHlwZShNVlQ6OmkxNik7CisgIHNldEJvb2xlYW5Db250ZW50cyhaZXJvT3JPbmVCb29sZWFuQ29udGVudCk7CisgIHNldFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZShCRjo6U1ApOworICBzZXRJbnREaXZJc0NoZWFwKGZhbHNlKTsKKworICAvLyBTZXQgdXAgdGhlIGxlZ2FsIHJlZ2lzdGVyIGNsYXNzZXMuCisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppMzIsIEJGOjpEUmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppMTYsIEJGOjpEMTZSZWdpc3RlckNsYXNzKTsKKworICBjb21wdXRlUmVnaXN0ZXJQcm9wZXJ0aWVzKCk7CisKKyAgLy8gQmxhY2tmaW4gZG9lc24ndCBoYXZlIGkxIGxvYWRzIG9yIHN0b3JlcworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6RVhUTE9BRCwgIE1WVDo6aTEsIFByb21vdGUpOworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6WkVYVExPQUQsIE1WVDo6aTEsIFByb21vdGUpOworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6U0VYVExPQUQsIE1WVDo6aTEsIFByb21vdGUpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbEFkZHJlc3MsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpKdW1wVGFibGUsICAgICBNVlQ6OmkzMiwgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0pULCAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJfQ0MsICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworCisgIC8vIGkxNiByZWdpc3RlcnMgZG9uJ3QgZG8gbXVjaAorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBTkQsICAgTVZUOjppMTYsIFByb21vdGUpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpPUiwgICAgTVZUOjppMTYsIFByb21vdGUpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpYT1IsICAgTVZUOjppMTYsIFByb21vdGUpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFBPUCwgTVZUOjppMTYsIFByb21vdGUpOworICAvLyBUaGUgZXhwYW5zaW9uIG9mIENUTFovQ1RUWiB1c2VzIEFORC9PUiwgc28gd2UgbWlnaHQgYXMgd2VsbCBwcm9tb3RlCisgIC8vIGltbWVkaWF0ZWx5LgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaLCAgTVZUOjppMTYsIFByb21vdGUpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFRaLCAgTVZUOjppMTYsIFByb21vdGUpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRVRDQywgTVZUOjppMTYsIFByb21vdGUpOworCisgIC8vIEJsYWNrZmluIGhhcyBubyBkaXZpc2lvbgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWLCAgICBNVlQ6OmkxNiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0RJViwgICAgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVZSRU0sIE1WVDo6aTE2LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgICAgTVZUOjppMTYsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSRU0sICAgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWLCAgICBNVlQ6OmkxNiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgICAgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVZSRU0sIE1WVDo6aTE2LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWUkVNLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VVJFTSwgICAgTVZUOjppMTYsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVSRU0sICAgIE1WVDo6aTMyLCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNNVUxfTE9ISSwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVNVUxfTE9ISSwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTEhVLCAgICAgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTEhTLCAgICAgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgLy8gTm8gY2FycnktaW4gb3BlcmF0aW9ucy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURERSwgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNVQkUsIE1WVDo6aTMyLCBDdXN0b20pOworCisgIC8vIEJsYWNrZmluIGhhcyBubyBpbnRyaW5zaWNzIGZvciB0aGVzZSBwYXJ0aWN1bGFyIG9wZXJhdGlvbnMuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1FTUJBUlJJRVIsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJTV0FQLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSExfUEFSVFMsIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkFfUEFSVFMsIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkxfUEFSVFMsIE1WVDo6aTMyLCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBNVlQ6OmkxLCBFeHBhbmQpOworCisgIC8vIGkzMiBoYXMgbmF0aXZlIENUUE9QLCBidXQgbm90IENUTFovQ1RUWgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RUWiwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgLy8gUkVBRENZQ0xFQ09VTlRFUiBuZWVkcyBzcGVjaWFsIHR5cGUgbGVnYWxpemF0aW9uLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpSRUFEQ1lDTEVDT1VOVEVSLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFSF9MQUJFTCwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKworICAvLyBVc2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBQ09QWSwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFFTkQsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUQUNLU0FWRSwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RBQ0tSRVNUT1JFLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworfQorCitjb25zdCBjaGFyICpCbGFja2ZpblRhcmdldExvd2VyaW5nOjpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogcmV0dXJuIDA7CisgIGNhc2UgQkZJU0Q6OkNBTEw6ICAgICByZXR1cm4gIkJGSVNEOjpDQUxMIjsKKyAgY2FzZSBCRklTRDo6UkVUX0ZMQUc6IHJldHVybiAiQkZJU0Q6OlJFVF9GTEFHIjsKKyAgY2FzZSBCRklTRDo6V3JhcHBlcjogIHJldHVybiAiQkZJU0Q6OldyYXBwZXIiOworICB9Cit9CisKK01WVDo6U2ltcGxlVmFsdWVUeXBlIEJsYWNrZmluVGFyZ2V0TG93ZXJpbmc6OmdldFNldENDUmVzdWx0VHlwZShFVlQgVlQpIGNvbnN0IHsKKyAgLy8gU0VUQ0MgYWx3YXlzIHNldHMgdGhlIENDIHJlZ2lzdGVyLiBUZWNobmljYWxseSB0aGF0IGlzIGFuIGkxIHJlZ2lzdGVyLCBidXQKKyAgLy8gdGhhdCB0eXBlIGlzIG5vdCBsZWdhbCwgc28gd2UgdHJlYXQgaXQgYXMgYW4gaTMyIHJlZ2lzdGVyLgorICByZXR1cm4gTVZUOjppMzI7Cit9CisKK1NEVmFsdWUgQmxhY2tmaW5UYXJnZXRMb3dlcmluZzo6TG93ZXJHbG9iYWxBZGRyZXNzKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBETCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGNhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oT3ApLT5nZXRHbG9iYWwoKTsKKworICBPcCA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEdWLCBETCwgTVZUOjppMzIpOworICByZXR1cm4gREFHLmdldE5vZGUoQkZJU0Q6OldyYXBwZXIsIERMLCBNVlQ6OmkzMiwgT3ApOworfQorCitTRFZhbHVlIEJsYWNrZmluVGFyZ2V0TG93ZXJpbmc6Okxvd2VySnVtcFRhYmxlKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIERMID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgaW50IEpUSSA9IGNhc3Q8SnVtcFRhYmxlU0ROb2RlPihPcCktPmdldEluZGV4KCk7CisKKyAgT3AgPSBEQUcuZ2V0VGFyZ2V0SnVtcFRhYmxlKEpUSSwgTVZUOjppMzIpOworICByZXR1cm4gREFHLmdldE5vZGUoQkZJU0Q6OldyYXBwZXIsIERMLCBNVlQ6OmkzMiwgT3ApOworfQorCitTRFZhbHVlCitCbGFja2ZpblRhcmdldExvd2VyaW5nOjpMb3dlckZvcm1hbEFyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisKKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgQXJnTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworICBDQ0luZm8uQWxsb2NhdGVTdGFjaygxMiwgNCk7ICAvLyBBQkkgcmVxdWlyZXMgMTIgYnl0ZXMgc3RhY2sgc3BhY2UKKyAgQ0NJbmZvLkFuYWx5emVGb3JtYWxBcmd1bWVudHMoSW5zLCBDQ19CbGFja2Zpbik7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ0xvY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENDVmFsQXNzaWduICZWQSA9IEFyZ0xvY3NbaV07CisKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgRVZUIFJlZ1ZUID0gVkEuZ2V0TG9jVlQoKTsKKyAgICAgIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gVkEuZ2V0TG9jUmVnKCkgPT0gQkY6OlAwID8KKyAgICAgICAgQkY6OlBSZWdpc3RlckNsYXNzIDogQkY6OkRSZWdpc3RlckNsYXNzOworICAgICAgYXNzZXJ0KFJDLT5jb250YWlucyhWQS5nZXRMb2NSZWcoKSkgJiYgIlVuZXhwZWN0ZWQgcmVnY2xhc3MgaW4gQ0NTdGF0ZSIpOworICAgICAgYXNzZXJ0KFJDLT5oYXNUeXBlKFJlZ1ZUKSAmJiAiVW5leHBlY3RlZCByZWdjbGFzcyBpbiBDQ1N0YXRlIik7CisKKyAgICAgIHVuc2lnbmVkIFJlZyA9IE1GLmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgICAgTUYuZ2V0UmVnSW5mbygpLmFkZExpdmVJbihWQS5nZXRMb2NSZWcoKSwgUmVnKTsKKyAgICAgIFNEVmFsdWUgQXJnVmFsdWUgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBSZWcsIFJlZ1ZUKTsKKworICAgICAgLy8gSWYgdGhpcyBpcyBhbiA4IG9yIDE2LWJpdCB2YWx1ZSwgaXQgaXMgcmVhbGx5IHBhc3NlZCBwcm9tb3RlZCB0byAzMgorICAgICAgLy8gYml0cy4gIEluc2VydCBhbiBhc3NlcnRbc3pdZXh0IHRvIGNhcHR1cmUgdGhpcywgdGhlbiB0cnVuY2F0ZSB0byB0aGUKKyAgICAgIC8vIHJpZ2h0IHNpemUuCisgICAgICBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpTRXh0KQorICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0U2V4dCwgZGwsIFJlZ1ZULCBBcmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKFZBLmdldFZhbFZUKCkpKTsKKyAgICAgIGVsc2UgaWYgKFZBLmdldExvY0luZm8oKSA9PSBDQ1ZhbEFzc2lnbjo6WkV4dCkKKyAgICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFpleHQsIGRsLCBSZWdWVCwgQXJnVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShWQS5nZXRWYWxWVCgpKSk7CisKKyAgICAgIGlmIChWQS5nZXRMb2NJbmZvKCkgIT0gQ0NWYWxBc3NpZ246OkZ1bGwpCisgICAgICAgIEFyZ1ZhbHVlID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFZBLmdldFZhbFZUKCksIEFyZ1ZhbHVlKTsKKworICAgICAgSW5WYWxzLnB1c2hfYmFjayhBcmdWYWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChWQS5pc01lbUxvYygpICYmICJDQ1ZhbEFzc2lnbiBtdXN0IGJlIFJlZ0xvYyBvciBNZW1Mb2MiKTsKKyAgICAgIHVuc2lnbmVkIE9ialNpemUgPSBWQS5nZXRMb2NWVCgpLmdldFN0b3JlU2l6ZSgpOworICAgICAgaW50IEZJID0gTUZJLT5DcmVhdGVGaXhlZE9iamVjdChPYmpTaXplLCBWQS5nZXRMb2NNZW1PZmZzZXQoKSwgdHJ1ZSk7CisgICAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZJLCBNVlQ6OmkzMik7CisgICAgICBJblZhbHMucHVzaF9iYWNrKERBRy5nZXRMb2FkKFZBLmdldFZhbFZUKCksIGRsLCBDaGFpbiwgRklOLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKK1NEVmFsdWUKK0JsYWNrZmluVGFyZ2V0TG93ZXJpbmc6Okxvd2VyUmV0dXJuKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisKKyAgLy8gQ0NWYWxBc3NpZ24gLSByZXByZXNlbnQgdGhlIGFzc2lnbm1lbnQgb2YgdGhlIHJldHVybiB2YWx1ZSB0byBsb2NhdGlvbnMuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gUlZMb2NzOworCisgIC8vIENDU3RhdGUgLSBJbmZvIGFib3V0IHRoZSByZWdpc3RlcnMgYW5kIHN0YWNrIHNsb3QuCisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgREFHLmdldFRhcmdldCgpLAorICAgICAgICAgICAgICAgICBSVkxvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKworICAvLyBBbmFsaXplIHJldHVybiB2YWx1ZXMuCisgIENDSW5mby5BbmFseXplUmV0dXJuKE91dHMsIFJldENDX0JsYWNrZmluKTsKKworICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXR1cm4gbG93ZXJlZCBmb3IgdGhpcyBmdW5jdGlvbiwgYWRkIHRoZSByZWdzIHRvIHRoZQorICAvLyBsaXZlb3V0IHNldCBmb3IgdGhlIGZ1bmN0aW9uLgorICBpZiAoREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5saXZlb3V0X2VtcHR5KCkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkKKyAgICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkuYWRkTGl2ZU91dChSVkxvY3NbaV0uZ2V0TG9jUmVnKCkpOworICB9CisKKyAgU0RWYWx1ZSBGbGFnOworCisgIC8vIENvcHkgdGhlIHJlc3VsdCB2YWx1ZXMgaW50byB0aGUgb3V0cHV0IHJlZ2lzdGVycy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBSVkxvY3NbaV07CisgICAgYXNzZXJ0KFZBLmlzUmVnTG9jKCkgJiYgIkNhbiBvbmx5IHJldHVybiBpbiByZWdpc3RlcnMhIik7CisgICAgU0RWYWx1ZSBPcGkgPSBPdXRWYWxzW2ldOworCisgICAgLy8gRXhwYW5kIHRvIGkzMiBpZiBuZWNlc3NhcnkKKyAgICBzd2l0Y2ggKFZBLmdldExvY0luZm8oKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbG9jIGluZm8hIik7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6RnVsbDogYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6U0V4dDoKKyAgICAgIE9waSA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBPcGkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6WkV4dDoKKyAgICAgIE9waSA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBPcGkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6QUV4dDoKKyAgICAgIE9waSA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIFZBLmdldExvY1ZUKCksIE9waSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgVkEuZ2V0TG9jUmVnKCksIE9waSwgU0RWYWx1ZSgpKTsKKyAgICAvLyBHdWFyYW50ZWUgdGhhdCBhbGwgZW1pdHRlZCBjb3BpZXMgYXJlIHN0dWNrIHRvZ2V0aGVyIHdpdGggZmxhZ3MuCisgICAgRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisKKyAgaWYgKEZsYWcuZ2V0Tm9kZSgpKSB7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKEJGSVNEOjpSRVRfRkxBRywgZGwsIE1WVDo6T3RoZXIsIENoYWluLCBGbGFnKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoQkZJU0Q6OlJFVF9GTEFHLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4pOworICB9Cit9CisKK1NEVmFsdWUKK0JsYWNrZmluVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgLy8gQmxhY2tmaW4gdGFyZ2V0IGRvZXMgbm90IHlldCBzdXBwb3J0IHRhaWwgY2FsbCBvcHRpbWl6YXRpb24uCisgIGlzVGFpbENhbGwgPSBmYWxzZTsKKworICAvLyBBbmFseXplIG9wZXJhbmRzIG9mIHRoZSBjYWxsLCBhc3NpZ25pbmcgbG9jYXRpb25zIHRvIGVhY2ggb3BlcmFuZC4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIERBRy5nZXRUYXJnZXQoKSwgQXJnTG9jcywKKyAgICAgICAgICAgICAgICAgKkRBRy5nZXRDb250ZXh0KCkpOworICBDQ0luZm8uQWxsb2NhdGVTdGFjaygxMiwgNCk7ICAvLyBBQkkgcmVxdWlyZXMgMTIgYnl0ZXMgc3RhY2sgc3BhY2UKKyAgQ0NJbmZvLkFuYWx5emVDYWxsT3BlcmFuZHMoT3V0cywgQ0NfQmxhY2tmaW4pOworCisgIC8vIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0Z29pbmcgYXJndW1lbnRzIHN0YWNrIHNwYWNlIHJlcXVpcmVtZW50LgorICB1bnNpZ25lZCBBcmdzU2l6ZSA9IENDSW5mby5nZXROZXh0U3RhY2tPZmZzZXQoKTsKKworICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX1NUQVJUKENoYWluLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoQXJnc1NpemUsIHRydWUpKTsKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBTRFZhbHVlPiwgOD4gUmVnc1RvUGFzczsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gTWVtT3BDaGFpbnM7CisKKyAgLy8gV2FsayB0aGUgcmVnaXN0ZXIvbWVtbG9jIGFzc2lnbm1lbnRzLCBpbnNlcnRpbmcgY29waWVzL2xvYWRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tpXTsKKyAgICBTRFZhbHVlIEFyZyA9IE91dFZhbHNbaV07CisKKyAgICAvLyBQcm9tb3RlIHRoZSB2YWx1ZSBpZiBuZWVkZWQuCisgICAgc3dpdGNoIChWQS5nZXRMb2NJbmZvKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGxvYyBpbmZvISIpOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OkZ1bGw6IGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OlNFeHQ6CisgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBkbCwgVkEuZ2V0TG9jVlQoKSwgQXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OlpFeHQ6CisgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwgVkEuZ2V0TG9jVlQoKSwgQXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OkFFeHQ6CisgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gQXJndW1lbnRzIHRoYXQgY2FuIGJlIHBhc3NlZCBvbiByZWdpc3RlciBtdXN0IGJlIGtlcHQgYXQKKyAgICAvLyBSZWdzVG9QYXNzIHZlY3RvcgorICAgIGlmIChWQS5pc1JlZ0xvYygpKSB7CisgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWQS5nZXRMb2NSZWcoKSwgQXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChWQS5pc01lbUxvYygpICYmICJDQ1ZhbEFzc2lnbiBtdXN0IGJlIFJlZ0xvYyBvciBNZW1Mb2MiKTsKKyAgICAgIGludCBPZmZzZXQgPSBWQS5nZXRMb2NNZW1PZmZzZXQoKTsKKyAgICAgIGFzc2VydChPZmZzZXQlNCA9PSAwICYmICJVbmFsaWduZWQgTG9jTWVtT2Zmc2V0Iik7CisgICAgICBhc3NlcnQoVkEuZ2V0TG9jVlQoKT09TVZUOjppMzIgJiYgIklsbGVnYWwgQ0NWYWxBc3NpZ24gdHlwZSIpOworICAgICAgU0RWYWx1ZSBTUE4gPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBCRjo6U1AsIE1WVDo6aTMyKTsKKyAgICAgIFNEVmFsdWUgT2Zmc2V0TiA9IERBRy5nZXRJbnRQdHJDb25zdGFudChPZmZzZXQpOworICAgICAgT2Zmc2V0TiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppMzIsIFNQTiwgT2Zmc2V0Tik7CisgICAgICBNZW1PcENoYWlucy5wdXNoX2JhY2soREFHLmdldFN0b3JlKENoYWluLCBkbCwgQXJnLCBPZmZzZXROLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0U3RhY2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LCBmYWxzZSwgZmFsc2UsIDApKTsKKyAgICB9CisgIH0KKworICAvLyBUcmFuc2Zvcm0gYWxsIHN0b3JlIG5vZGVzIGludG8gb25lIHNpbmdsZSBub2RlIGJlY2F1c2UKKyAgLy8gYWxsIHN0b3JlIG5vZGVzIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyLgorICBpZiAoIU1lbU9wQ2hhaW5zLmVtcHR5KCkpCisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZNZW1PcENoYWluc1swXSwgTWVtT3BDaGFpbnMuc2l6ZSgpKTsKKworICAvLyBCdWlsZCBhIHNlcXVlbmNlIG9mIGNvcHktdG8tcmVnIG5vZGVzIGNoYWluZWQgdG9nZXRoZXIgd2l0aCB0b2tlbgorICAvLyBjaGFpbiBhbmQgZmxhZyBvcGVyYW5kcyB3aGljaCBjb3B5IHRoZSBvdXRnb2luZyBhcmdzIGludG8gcmVnaXN0ZXJzLgorICAvLyBUaGUgSW5GbGFnIGluIG5lY2Vzc2FyeSBzaW5jZSBhbGwgZW1pdGVkIGluc3RydWN0aW9ucyBtdXN0IGJlCisgIC8vIHN0dWNrIHRvZ2V0aGVyLgorICBTRFZhbHVlIEluRmxhZzsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3NUb1Bhc3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFJlZ3NUb1Bhc3NbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3NUb1Bhc3NbaV0uc2Vjb25kLCBJbkZsYWcpOworICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisKKyAgLy8gSWYgdGhlIGNhbGxlZSBpcyBhIEdsb2JhbEFkZHJlc3Mgbm9kZSAocXVpdGUgY29tbW9uLCBldmVyeSBkaXJlY3QgY2FsbCBpcykKKyAgLy8gdHVybiBpdCBpbnRvIGEgVGFyZ2V0R2xvYmFsQWRkcmVzcyBub2RlIHNvIHRoYXQgbGVnYWxpemUgZG9lc24ndCBoYWNrIGl0LgorICAvLyBMaWtld2lzZSBFeHRlcm5hbFN5bWJvbCAtPiBUYXJnZXRFeHRlcm5hbFN5bWJvbC4KKyAgaWYgKEdsb2JhbEFkZHJlc3NTRE5vZGUgKkcgPSBkeW5fY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihDYWxsZWUpKQorICAgIENhbGxlZSA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEctPmdldEdsb2JhbCgpLCBkbCwgTVZUOjppMzIpOworICBlbHNlIGlmIChFeHRlcm5hbFN5bWJvbFNETm9kZSAqRSA9IGR5bl9jYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPihDYWxsZWUpKQorICAgIENhbGxlZSA9IERBRy5nZXRUYXJnZXRFeHRlcm5hbFN5bWJvbChFLT5nZXRTeW1ib2woKSwgTVZUOjppMzIpOworCisgIHN0ZDo6dmVjdG9yPEVWVD4gTm9kZVR5czsKKyAgTm9kZVR5cy5wdXNoX2JhY2soTVZUOjpPdGhlcik7ICAgLy8gUmV0dXJucyBhIGNoYWluCisgIE5vZGVUeXMucHVzaF9iYWNrKE1WVDo6RmxhZyk7ICAgIC8vIFJldHVybnMgYSBmbGFnIGZvciByZXR2YWwgY29weSB0byB1c2UuCisgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBDYWxsZWUsIEluRmxhZyB9OworICBDaGFpbiA9IERBRy5nZXROb2RlKEJGSVNEOjpDQUxMLCBkbCwgTm9kZVR5cywgT3BzLAorICAgICAgICAgICAgICAgICAgICAgIEluRmxhZy5nZXROb2RlKCkgPyAzIDogMik7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIENoYWluID0gREFHLmdldENBTExTRVFfRU5EKENoYWluLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoQXJnc1NpemUsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCwgdHJ1ZSksIEluRmxhZyk7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIEFzc2lnbiBsb2NhdGlvbnMgdG8gZWFjaCB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGNhbGwuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gUlZMb2NzOworICBDQ1N0YXRlIFJWSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIERBRy5nZXRUYXJnZXQoKSwgUlZMb2NzLAorICAgICAgICAgICAgICAgICAqREFHLmdldENvbnRleHQoKSk7CisKKyAgUlZJbmZvLkFuYWx5emVDYWxsUmVzdWx0KElucywgUmV0Q0NfQmxhY2tmaW4pOworCisgIC8vIENvcHkgYWxsIG9mIHRoZSByZXN1bHQgcmVnaXN0ZXJzIG91dCBvZiB0aGVpciBzcGVjaWZpZWQgcGh5c3JlZy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmUlYgPSBSVkxvY3NbaV07CisgICAgdW5zaWduZWQgUmVnID0gUlYuZ2V0TG9jUmVnKCk7CisKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVkxvY3NbaV0uZ2V0TG9jVlQoKSwgSW5GbGFnKTsKKyAgICBTRFZhbHVlIFZhbCA9IENoYWluLmdldFZhbHVlKDApOworICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDIpOworICAgIENoYWluID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisKKyAgICAvLyBDYWxsZWUgaXMgcmVzcG9uc2libGUgZm9yIGV4dGVuZGluZyBhbnkgaTE2IHJldHVybiB2YWx1ZXMuCisgICAgc3dpdGNoIChSVi5nZXRMb2NJbmZvKCkpIHsKKyAgICBjYXNlIENDVmFsQXNzaWduOjpTRXh0OgorICAgICAgVmFsID0gREFHLmdldE5vZGUoSVNEOjpBc3NlcnRTZXh0LCBkbCwgUlYuZ2V0TG9jVlQoKSwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShSVi5nZXRWYWxWVCgpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENDVmFsQXNzaWduOjpaRXh0OgorICAgICAgVmFsID0gREFHLmdldE5vZGUoSVNEOjpBc3NlcnRaZXh0LCBkbCwgUlYuZ2V0TG9jVlQoKSwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShSVi5nZXRWYWxWVCgpKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gVHJ1bmNhdGUgdG8gdmFsdHlwZQorICAgIGlmIChSVi5nZXRMb2NJbmZvKCkgIT0gQ0NWYWxBc3NpZ246OkZ1bGwpCisgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgUlYuZ2V0VmFsVlQoKSwgVmFsKTsKKyAgICBJblZhbHMucHVzaF9iYWNrKFZhbCk7CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKKy8vIEV4cGFuc2lvbiBvZiBBRERFIC8gU1VCRS4gVGhpcyBpcyBhIGJpdCBpbnZvbHZlZCBzaW5jZSBibGFja2ZpbiBkb2Vzbid0IGhhdmUKKy8vIGFkZC13aXRoLWNhcnJ5IGluc3RydWN0aW9ucy4KK1NEVmFsdWUgQmxhY2tmaW5UYXJnZXRMb3dlcmluZzo6TG93ZXJBRERFKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIE9wZXJhbmRzOiBsaHMsIHJocywgY2FycnktaW4gKEFDMCBmbGFnKQorICAvLyBSZXN1bHRzOiBzdW0sIGNhcnJ5LW91dCAoQUMwIGZsYWcpCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICB1bnNpZ25lZCBPcGNvZGUgPSBPcC5nZXRPcGNvZGUoKT09SVNEOjpBRERFID8gQkY6OkFERCA6IEJGOjpTVUI7CisKKyAgLy8gemV4dCBpbmNvbWluZyBjYXJyeSBmbGFnIGluIEFDMCB0byAzMiBiaXRzCisgIFNETm9kZSogQ2FycnlJbiA9IERBRy5nZXRNYWNoaW5lTm9kZShCRjo6TU9WRV9jY19hYzAsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWc9ICovIE9wLmdldE9wZXJhbmQoMikpOworICBDYXJyeUluID0gREFHLmdldE1hY2hpbmVOb2RlKEJGOjpNT1ZFQ0NfemV4dCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoQ2FycnlJbiwgMCkpOworCisgIC8vIEFkZCBvcGVyYW5kcywgcHJvZHVjZSBzdW0gYW5kIGNhcnJ5IGZsYWcKKyAgU0ROb2RlICpTdW0gPSBEQUcuZ2V0TWFjaGluZU5vZGUoT3Bjb2RlLCBkbCwgTVZUOjppMzIsIE1WVDo6RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgwKSwgT3AuZ2V0T3BlcmFuZCgxKSk7CisKKyAgLy8gU3RvcmUgaW50ZXJtZWRpYXRlIGNhcnJ5IGZyb20gU3VtCisgIFNETm9kZSogQ2FycnkxID0gREFHLmdldE1hY2hpbmVOb2RlKEJGOjpNT1ZFX2NjX2FjMCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnPSAqLyBTRFZhbHVlKFN1bSwgMSkpOworCisgIC8vIEFkZCBpbmNvbWluZyBjYXJyeSwgYWdhaW4gcHJvZHVjaW5nIGFuIG91dHB1dCBmbGFnCisgIFN1bSA9IERBRy5nZXRNYWNoaW5lTm9kZShPcGNvZGUsIGRsLCBNVlQ6OmkzMiwgTVZUOjpGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShTdW0sIDApLCBTRFZhbHVlKENhcnJ5SW4sIDApKTsKKworICAvLyBVcGRhdGUgQUMwIHdpdGggdGhlIGludGVybWVkaWF0ZSBjYXJyeSwgcHJvZHVjaW5nIGEgZmxhZy4KKyAgU0ROb2RlICpDYXJyeU91dCA9IERBRy5nZXRNYWNoaW5lTm9kZShCRjo6T1JfYWMwX2NjLCBkbCwgTVZUOjpGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoQ2FycnkxLCAwKSk7CisKKyAgLy8gQ29tcG9zZSAoaTMyLCBmbGFnKSBwYWlyCisgIFNEVmFsdWUgb3BzWzJdID0geyBTRFZhbHVlKFN1bSwgMCksIFNEVmFsdWUoQ2FycnlPdXQsIDApIH07CisgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMob3BzLCAyLCBkbCk7Cit9CisKK1NEVmFsdWUgQmxhY2tmaW5UYXJnZXRMb3dlcmluZzo6TG93ZXJPcGVyYXRpb24oU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIE9wLmdldE5vZGUoKS0+ZHVtcCgpOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlNob3VsZCBub3QgY3VzdG9tIGxvd2VyIHRoaXMhIik7CisgIGNhc2UgSVNEOjpHbG9iYWxBZGRyZXNzOiAgICAgIHJldHVybiBMb3dlckdsb2JhbEFkZHJlc3MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpHbG9iYWxUTFNBZGRyZXNzOgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlRMUyBub3QgaW1wbGVtZW50ZWQgZm9yIEJsYWNrZmluLiIpOworICBjYXNlIElTRDo6SnVtcFRhYmxlOiAgICAgICAgICByZXR1cm4gTG93ZXJKdW1wVGFibGUoT3AsIERBRyk7CisgICAgLy8gRnJhbWUgJiBSZXR1cm4gYWRkcmVzcy4gIEN1cnJlbnRseSB1bmltcGxlbWVudGVkCisgIGNhc2UgSVNEOjpGUkFNRUFERFI6ICAgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgIGNhc2UgSVNEOjpSRVRVUk5BRERSOiAgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgIGNhc2UgSVNEOjpBRERFOgorICBjYXNlIElTRDo6U1VCRTogICAgICAgICAgICAgICByZXR1cm4gTG93ZXJBRERFKE9wLCBEQUcpOworICB9Cit9CisKK3ZvaWQKK0JsYWNrZmluVGFyZ2V0TG93ZXJpbmc6OlJlcGxhY2VOb2RlUmVzdWx0cyhTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkRvIG5vdCBrbm93IGhvdyB0byBjdXN0b20gdHlwZSBsZWdhbGl6ZSB0aGlzIG9wZXJhdGlvbiEiKTsKKyAgICByZXR1cm47CisgIGNhc2UgSVNEOjpSRUFEQ1lDTEVDT1VOVEVSOiB7CisgICAgLy8gVGhlIGxvdyBwYXJ0IG9mIHRoZSBjeWNsZSBjb3VudGVyIGlzIGluIENZQ0xFUywgdGhlIGhpZ2ggcGFydCBpbgorICAgIC8vIENZQ0xFUzIuIFJlYWRpbmcgQ1lDTEVTIHdpbGwgbGF0Y2ggdGhlIHZhbHVlIG9mIENZQ0xFUzIsIHNvIHdlIG11c3QgcmVhZAorICAgIC8vIENZQ0xFUzIgbGFzdC4KKyAgICBTRFZhbHVlIFRoZUNoYWluID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIGxvID0gREFHLmdldENvcHlGcm9tUmVnKFRoZUNoYWluLCBkbCwgQkY6OkNZQ0xFUywgTVZUOjppMzIpOworICAgIFNEVmFsdWUgaGkgPSBEQUcuZ2V0Q29weUZyb21SZWcobG8uZ2V0VmFsdWUoMSksIGRsLCBCRjo6Q1lDTEVTMiwgTVZUOjppMzIpOworICAgIC8vIFVzZSBhIGJ1aWxkcGFpciB0byBtZXJnZSB0aGUgdHdvIDMyLWJpdCB2YWx1ZXMgaW50byBhIDY0LWJpdCBvbmUuCisgICAgUmVzdWx0cy5wdXNoX2JhY2soREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgTVZUOjppNjQsIGxvLCBoaSkpOworICAgIC8vIE91dGdvaW5nIGNoYWluLiBJZiB3ZSB3ZXJlIHRvIHVzZSB0aGUgY2hhaW4gZnJvbSBsbyBpbnN0ZWFkLCBpdCB3b3VsZCBiZQorICAgIC8vIHBvc3NpYmxlIHRvIGVudGlyZWx5IGVsaW1pbmF0ZSB0aGUgQ1lDTEVTMiByZWFkIGluIChpMzIgKHRydW5jCisgICAgLy8gcmVhZGN5Y2xlY291bnRlcikpLiBVbmZvcnR1bmF0ZWx5IHRoaXMgY291bGQgcG9zc2libHkgZGVsYXkgdGhlIENZQ0xFUzIKKyAgICAvLyByZWFkIGJleW9uZCB0aGUgbmV4dCBDWUNMRVMgcmVhZCwgbGVhZGluZyB0byBpbnZhbGlkIHJlc3VsdHMuCisgICAgUmVzdWx0cy5wdXNoX2JhY2soaGkuZ2V0VmFsdWUoMSkpOworICAgIHJldHVybjsKKyAgfQorICB9Cit9CisKKy8vLyBnZXRGdW5jdGlvbkFsaWdubWVudCAtIFJldHVybiB0aGUgTG9nMiBhbGlnbm1lbnQgb2YgdGhpcyBmdW5jdGlvbi4KK3Vuc2lnbmVkIEJsYWNrZmluVGFyZ2V0TG93ZXJpbmc6OmdldEZ1bmN0aW9uQWxpZ25tZW50KGNvbnN0IEZ1bmN0aW9uICpGKSBjb25zdCB7CisgIHJldHVybiAyOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgQmxhY2tmaW4gSW5saW5lIEFzc2VtYmx5IFN1cHBvcnQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBnZXRDb25zdHJhaW50VHlwZSAtIEdpdmVuIGEgY29uc3RyYWludCBsZXR0ZXIsIHJldHVybiB0aGUgdHlwZSBvZgorLy8vIGNvbnN0cmFpbnQgaXQgaXMgZm9yIHRoaXMgdGFyZ2V0LgorQmxhY2tmaW5UYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUKK0JsYWNrZmluVGFyZ2V0TG93ZXJpbmc6OmdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdCB7CisgIGlmIChDb25zdHJhaW50LnNpemUoKSAhPSAxKQorICAgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoQ29uc3RyYWludCk7CisKKyAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgLy8gU3RhbmRhcmQgY29uc3RyYWludHMKKyAgY2FzZSAncic6CisgICAgcmV0dXJuIENfUmVnaXN0ZXJDbGFzczsKKworICAgIC8vIEJsYWNrZmluLXNwZWNpZmljIGNvbnN0cmFpbnRzCisgIGNhc2UgJ2EnOgorICBjYXNlICdkJzoKKyAgY2FzZSAneic6CisgIGNhc2UgJ0QnOgorICBjYXNlICdXJzoKKyAgY2FzZSAnZSc6CisgIGNhc2UgJ2InOgorICBjYXNlICd2JzoKKyAgY2FzZSAnZic6CisgIGNhc2UgJ2MnOgorICBjYXNlICd0JzoKKyAgY2FzZSAndSc6CisgIGNhc2UgJ2snOgorICBjYXNlICd4JzoKKyAgY2FzZSAneSc6CisgIGNhc2UgJ3cnOgorICAgIHJldHVybiBDX1JlZ2lzdGVyQ2xhc3M7CisgIGNhc2UgJ0EnOgorICBjYXNlICdCJzoKKyAgY2FzZSAnQyc6CisgIGNhc2UgJ1onOgorICBjYXNlICdZJzoKKyAgICByZXR1cm4gQ19SZWdpc3RlcjsKKyAgfQorCisgIC8vIE5vdCBpbXBsZW1lbnRlZDogcTAtcTcsIHFBLiBVc2Uge1IyfSBldGMgaW5zdGVhZAorCisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoQ29uc3RyYWludCk7Cit9CisKKy8vLyBnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50IC0gUmV0dXJuIHJlZ2lzdGVyIG5vIGFuZCBjbGFzcyBmb3IgYSBDX1JlZ2lzdGVyCisvLy8gY29uc3RyYWludC4KK3N0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+IEJsYWNrZmluVGFyZ2V0TG93ZXJpbmc6OgorZ2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwgRVZUIFZUKSBjb25zdCB7CisgIHR5cGVkZWYgc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4gUGFpcjsKKyAgdXNpbmcgbmFtZXNwYWNlIEJGOworCisgIGlmIChDb25zdHJhaW50LnNpemUoKSAhPSAxKQorICAgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChDb25zdHJhaW50LCBWVCk7CisKKyAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgLy8gU3RhbmRhcmQgY29uc3RyYWludHMKKyAgY2FzZSAncic6CisgICAgcmV0dXJuIFBhaXIoMFUsIFZUID09IE1WVDo6aTE2ID8gRDE2UmVnaXN0ZXJDbGFzcyA6IERQUmVnaXN0ZXJDbGFzcyk7CisKKyAgICAvLyBCbGFja2Zpbi1zcGVjaWZpYyBjb25zdHJhaW50cworICBjYXNlICdhJzogcmV0dXJuIFBhaXIoMFUsIFBSZWdpc3RlckNsYXNzKTsKKyAgY2FzZSAnZCc6IHJldHVybiBQYWlyKDBVLCBEUmVnaXN0ZXJDbGFzcyk7CisgIGNhc2UgJ2UnOiByZXR1cm4gUGFpcigwVSwgQWNjdVJlZ2lzdGVyQ2xhc3MpOworICBjYXNlICdBJzogcmV0dXJuIFBhaXIoQTAsIEFjY3VSZWdpc3RlckNsYXNzKTsKKyAgY2FzZSAnQic6IHJldHVybiBQYWlyKEExLCBBY2N1UmVnaXN0ZXJDbGFzcyk7CisgIGNhc2UgJ2InOiByZXR1cm4gUGFpcigwVSwgSVJlZ2lzdGVyQ2xhc3MpOworICBjYXNlICd2JzogcmV0dXJuIFBhaXIoMFUsIEJSZWdpc3RlckNsYXNzKTsKKyAgY2FzZSAnZic6IHJldHVybiBQYWlyKDBVLCBNUmVnaXN0ZXJDbGFzcyk7CisgIGNhc2UgJ0MnOiByZXR1cm4gUGFpcihDQywgSnVzdENDUmVnaXN0ZXJDbGFzcyk7CisgIGNhc2UgJ3gnOiByZXR1cm4gUGFpcigwVSwgR1JSZWdpc3RlckNsYXNzKTsKKyAgY2FzZSAndyc6IHJldHVybiBQYWlyKDBVLCBBTExSZWdpc3RlckNsYXNzKTsKKyAgY2FzZSAnWic6IHJldHVybiBQYWlyKFAzLCBQUmVnaXN0ZXJDbGFzcyk7CisgIGNhc2UgJ1knOiByZXR1cm4gUGFpcihQMSwgUFJlZ2lzdGVyQ2xhc3MpOworICB9CisKKyAgLy8gTm90IGltcGxlbWVudGVkOiBxMC1xNywgcUEuIFVzZSB7UjJ9IGV0YyBpbnN0ZWFkLgorICAvLyBDb25zdHJhaW50cyB6LCBELCBXLCBjLCB0LCB1LCBrLCBhbmQgeSB1c2Ugbm9uLWV4aXN0aW5nIGNsYXNzZXMsIGRlZmVyIHRvCisgIC8vIGdldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludCgpCisKKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjpnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KENvbnN0cmFpbnQsIFZUKTsKK30KKworc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IEJsYWNrZmluVGFyZ2V0TG93ZXJpbmc6OgorZ2V0UmVnQ2xhc3NGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LCBFVlQgVlQpIGNvbnN0IHsKKyAgdXNpbmcgbmFtZXNwYWNlIEJGOworCisgIGlmIChDb25zdHJhaW50LnNpemUoKSAhPSAxKQorICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKKworICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgY2FzZSAneic6IHJldHVybiBtYWtlX3ZlY3Rvcjx1bnNpZ25lZD4oUDAsIFAxLCBQMiwgMCk7CisgIGNhc2UgJ0QnOiByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KFIwLCBSMiwgUjQsIFI2LCAwKTsKKyAgY2FzZSAnVyc6IHJldHVybiBtYWtlX3ZlY3Rvcjx1bnNpZ25lZD4oUjEsIFIzLCBSNSwgUjcsIDApOworICBjYXNlICdjJzogcmV0dXJuIG1ha2VfdmVjdG9yPHVuc2lnbmVkPihJMCwgSTEsIEkyLCBJMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQjAsIEIxLCBCMiwgQjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwwLCBMMSwgTDIsIEwzLCAwKTsKKyAgY2FzZSAndCc6IHJldHVybiBtYWtlX3ZlY3Rvcjx1bnNpZ25lZD4oTFQwLCBMVDEsIDApOworICBjYXNlICd1JzogcmV0dXJuIG1ha2VfdmVjdG9yPHVuc2lnbmVkPihMQjAsIExCMSwgMCk7CisgIGNhc2UgJ2snOiByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KExDMCwgTEMxLCAwKTsKKyAgY2FzZSAneSc6IHJldHVybiBtYWtlX3ZlY3Rvcjx1bnNpZ25lZD4oUkVUUywgUkVUTiwgUkVUSSwgUkVUWCwgUkVURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUQVQsIFNFUVNUQVQsIFVTUCwgMCk7CisgIH0KKworICByZXR1cm4gc3RkOjp2ZWN0b3I8dW5zaWduZWQ+KCk7Cit9CisKK2Jvb2wgQmxhY2tmaW5UYXJnZXRMb3dlcmluZzo6Citpc09mZnNldEZvbGRpbmdMZWdhbChjb25zdCBHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSkgY29uc3QgeworICAvLyBUaGUgQmxhY2tmaW4gdGFyZ2V0IGlzbid0IHlldCBhd2FyZSBvZiBvZmZzZXRzLgorICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSVNlbExvd2VyaW5nLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSVNlbExvd2VyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlYmNjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JU2VsTG93ZXJpbmcuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0gQmxhY2tmaW5JU2VsTG93ZXJpbmcuaCAtIEJsYWNrZmluIERBRyBMb3dlcmluZyBJbnRlcmZhY2UgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgQmxhY2tmaW4gdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50byBhCisvLyBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQkxBQ0tGSU5fSVNFTExPV0VSSU5HX0gKKyNkZWZpbmUgQkxBQ0tGSU5fSVNFTExPV0VSSU5HX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAiQmxhY2tmaW4uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIG5hbWVzcGFjZSBCRklTRCB7CisgICAgZW51bSB7CisgICAgICBGSVJTVF9OVU1CRVIgPSBJU0Q6OkJVSUxUSU5fT1BfRU5ELAorICAgICAgQ0FMTCwgICAgICAgICAgICAgICAgICAgICAvLyBBIGNhbGwgaW5zdHJ1Y3Rpb24uCisgICAgICBSRVRfRkxBRywgICAgICAgICAgICAgICAgIC8vIFJldHVybiB3aXRoIGEgZmxhZyBvcGVyYW5kLgorICAgICAgV3JhcHBlciAgICAgICAgICAgICAgICAgICAvLyBBZGRyZXNzIHdyYXBwZXIKKyAgICB9OworICB9CisKKyAgY2xhc3MgQmxhY2tmaW5UYXJnZXRMb3dlcmluZyA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZyB7CisgIHB1YmxpYzoKKyAgICBCbGFja2ZpblRhcmdldExvd2VyaW5nKFRhcmdldE1hY2hpbmUgJlRNKTsKKyAgICB2aXJ0dWFsIE1WVDo6U2ltcGxlVmFsdWVUeXBlIGdldFNldENDUmVzdWx0VHlwZShFVlQgVlQpIGNvbnN0OworICAgIHZpcnR1YWwgU0RWYWx1ZSBMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIFJlcGxhY2VOb2RlUmVzdWx0cyhTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICBDb25zdHJhaW50VHlwZSBnZXRDb25zdHJhaW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCkgY29uc3Q7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4KKyAgICBnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LCBFVlQgVlQpIGNvbnN0OworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPgorICAgIGdldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZzZXRGb2xkaW5nTGVnYWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EpIGNvbnN0OworICAgIGNvbnN0IGNoYXIgKmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisgICAgdW5zaWduZWQgZ2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgU0RWYWx1ZSBMb3dlckdsb2JhbEFkZHJlc3MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJKdW1wVGFibGUoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJBRERFKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJGb3JtYWxBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJDYWxsKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgICAgLy8gQkxBQ0tGSU5fSVNFTExPV0VSSU5HX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JbnN0ckZvcm1hdHMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW5zdHJGb3JtYXRzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZTZlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW5zdHJGb3JtYXRzLnRkCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LS0tIEJsYWNrZmluSW5zdHJGb3JtYXRzLnRkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBmb3JtYXQgc3VwZXJjbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgSW5zdEJmaW48ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEluc3RydWN0aW9uIHsKKyAgZmllbGQgYml0czwzMj4gSW5zdDsKKworICBsZXQgTmFtZXNwYWNlID0gIkJGIjsKKworICBkYWcgT3V0T3BlcmFuZExpc3QgPSBvdXRzOworICBkYWcgSW5PcGVyYW5kTGlzdCA9IGluczsKKyAgbGV0IEFzbVN0cmluZyAgID0gYXNtc3RyOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47Cit9CisKKy8vIFNpbmdsZS13b3JkICgxNi1iaXQpIGluc3RydWN0aW9ucworY2xhc3MgRjE8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgIDogSW5zdEJmaW48b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKK30KKworLy8gRG91YmxlLXdvcmQgKDMyLWJpdCkgaW5zdHJ1Y3Rpb25zCitjbGFzcyBGMjxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0QmZpbjxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj4geworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2Zpbkluc3RySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW5zdHJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTBkNTdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2Zpbkluc3RySW5mby5jcHAKQEAgLTAsMCArMSwyNTMgQEAKKy8vPT09LSBCbGFja2Zpbkluc3RySW5mby5jcHAgLSBCbGFja2ZpbiBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBCbGFja2ZpbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJCbGFja2Zpbkluc3RySW5mby5oIgorI2luY2x1ZGUgIkJsYWNrZmluU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiQmxhY2tmaW4uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgIkJsYWNrZmluR2VuSW5zdHJJbmZvLmluYyIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK0JsYWNrZmluSW5zdHJJbmZvOjpCbGFja2Zpbkluc3RySW5mbyhCbGFja2ZpblN1YnRhcmdldCAmU1QpCisgIDogVGFyZ2V0SW5zdHJJbmZvSW1wbChCbGFja2Zpbkluc3RzLCBhcnJheV9sZW5ndGhvZihCbGFja2Zpbkluc3RzKSksCisgICAgUkkoU1QsICp0aGlzKSwKKyAgICBTdWJ0YXJnZXQoU1QpIHt9CisKKy8vLyBpc0xvYWRGcm9tU3RhY2tTbG90IC0gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGEgZGlyZWN0CisvLy8gbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorLy8vIHRoZSBkZXN0aW5hdGlvbiBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4IG9mIHRoZSBsb2FkZWQgc3RhY2sgc2xvdC4gIElmCisvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBsb2FkaW5nIGZyb20gdGhlIHN0YWNrIHNsb3QuCit1bnNpZ25lZCBCbGFja2Zpbkluc3RySW5mbzo6aXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIEJGOjpMT0FEMzJmaToKKyAgY2FzZSBCRjo6TE9BRDE2Zmk6CisgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDEpLmlzRkkoKSAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5pc0ltbSgpICYmCisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpID09IDApIHsKKyAgICAgIEZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOworICAgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGlzU3RvcmVUb1N0YWNrU2xvdCAtIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBhIGRpcmVjdAorLy8vIHN0b3JlIHRvIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorLy8vIHRoZSBzb3VyY2UgcmVnIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKy8vLyBub3QsIHJldHVybiAwLiAgVGhpcyBwcmVkaWNhdGUgbXVzdCByZXR1cm4gMCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzCisvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIHN0b3JpbmcgdG8gdGhlIHN0YWNrIHNsb3QuCit1bnNpZ25lZCBCbGFja2Zpbkluc3RySW5mbzo6aXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBCRjo6U1RPUkUzMmZpOgorICBjYXNlIEJGOjpTVE9SRTE2Zmk6CisgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDEpLmlzRkkoKSAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5pc0ltbSgpICYmCisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpID09IDApIHsKKyAgICAgIEZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOworICAgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgQmxhY2tmaW5JbnN0ckluZm86OgorSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0IHsKKyAgLy8gU2hvdWxkbid0IGJlIGEgZmFsbCB0aHJvdWdoLgorICBhc3NlcnQoVEJCICYmICJJbnNlcnRCcmFuY2ggbXVzdCBub3QgYmUgdG9sZCB0byBpbnNlcnQgYSBmYWxsdGhyb3VnaCIpOworICBhc3NlcnQoKENvbmQuc2l6ZSgpID09IDEgfHwgQ29uZC5zaXplKCkgPT0gMCkgJiYKKyAgICAgICAgICJCcmFuY2ggY29uZGl0aW9ucyBoYXZlIG9uZSBjb21wb25lbnQhIik7CisKKyAgaWYgKENvbmQuZW1wdHkoKSkgeworICAgIC8vIFVuY29uZGl0aW9uYWwgYnJhbmNoPworICAgIGFzc2VydCghRkJCICYmICJVbmNvbmRpdGlvbmFsIGJyYW5jaCB3aXRoIG11bHRpcGxlIHN1Y2Nlc3NvcnMhIik7CisgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KEJGOjpKVU1QYSkpLmFkZE1CQihUQkIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gQ29uZGl0aW9uYWwgYnJhbmNoLgorICBsbHZtX3VucmVhY2hhYmxlKCJJbXBsZW1lbnQgY29uZGl0aW9uYWwgYnJhbmNoZXMhIik7Cit9CisKK3ZvaWQgQmxhY2tmaW5JbnN0ckluZm86OmNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0IHsKKyAgaWYgKEJGOjpBTExSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKSB7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQkY6Ok1PVkUpLCBEZXN0UmVnKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKEJGOjpEMTZSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKSB7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQkY6OlNMTDE2aSksIERlc3RSZWcpCisgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKQorICAgICAgLmFkZEltbSgwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoQkY6OkRSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnKSkgeworICAgIGlmIChTcmNSZWcgPT0gQkY6Ok5DQykgeworICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQkY6Ok1PVkVOQ0NfeiksIERlc3RSZWcpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQkY6OkJJVFRHTCksIERlc3RSZWcpLmFkZFJlZyhEZXN0UmVnKS5hZGRJbW0oMCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChTcmNSZWcgPT0gQkY6OkNDKSB7CisgICAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChCRjo6TU9WRUNDX3pleHQpLCBEZXN0UmVnKQorICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpZiAoQkY6OkRSZWdDbGFzcy5jb250YWlucyhTcmNSZWcpKSB7CisgICAgaWYgKERlc3RSZWcgPT0gQkY6Ok5DQykgeworICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQkY6OlNFVEVRcmlfbm90KSwgRGVzdFJlZykKKyAgICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSkuYWRkSW1tKDApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoRGVzdFJlZyA9PSBCRjo6Q0MpIHsKKyAgICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEJGOjpNT1ZFQ0NfbnopLCBEZXN0UmVnKQorICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworCisgIGlmIChEZXN0UmVnID09IEJGOjpOQ0MgJiYgU3JjUmVnID09IEJGOjpDQykgeworICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEJGOjpNT1ZFX25jY2NjKSwgRGVzdFJlZykKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChEZXN0UmVnID09IEJGOjpDQyAmJiBTcmNSZWcgPT0gQkY6Ok5DQykgeworICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEJGOjpNT1ZFX2NjbmNjKSwgRGVzdFJlZykKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICAgIHJldHVybjsKKyAgfQorCisgIGxsdm1fdW5yZWFjaGFibGUoIkJhZCByZWctdG8tcmVnIGNvcHkiKTsKK30KKworc3RhdGljIGJvb2wgaW5DbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZUZXN0LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSB7CisgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWcpKQorICAgIHJldHVybiBUZXN0LmNvbnRhaW5zKFJlZyk7CisgIGVsc2UKKyAgICByZXR1cm4gJlRlc3Q9PVJDIHx8IFRlc3QuaGFzU3ViQ2xhc3MoUkMpOworfQorCit2b2lkCitCbGFja2Zpbkluc3RySW5mbzo6c3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgRGVidWdMb2MgREwgPSBJICE9IE1CQi5lbmQoKSA/IEktPmdldERlYnVnTG9jKCkgOiBEZWJ1Z0xvYygpOworCisgIGlmIChpbkNsYXNzKEJGOjpEUFJlZ0NsYXNzLCBTcmNSZWcsIFJDKSkgeworICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KEJGOjpTVE9SRTMyZmkpKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKQorICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpCisgICAgICAuYWRkSW1tKDApOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChpbkNsYXNzKEJGOjpEMTZSZWdDbGFzcywgU3JjUmVnLCBSQykpIHsKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChCRjo6U1RPUkUxNmZpKSkKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAgIC5hZGRGcmFtZUluZGV4KEZJKQorICAgICAgLmFkZEltbSgwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoaW5DbGFzcyhCRjo6QW55Q0NSZWdDbGFzcywgU3JjUmVnLCBSQykpIHsKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChCRjo6U1RPUkU4ZmkpKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKQorICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpCisgICAgICAuYWRkSW1tKDApOworICAgIHJldHVybjsKKyAgfQorCisgIGxsdm1fdW5yZWFjaGFibGUoKHN0ZDo6c3RyaW5nKCJDYW5ub3Qgc3RvcmUgcmVnY2xhc3MgdG8gc3RhY2sgc2xvdDogIikrCisgICAgICAgICAgICAgICAgICAgIFJDLT5nZXROYW1lKCkpLmNfc3RyKCkpOworfQorCit2b2lkIEJsYWNrZmluSW5zdHJJbmZvOjoKK3N0b3JlUmVnVG9BZGRyKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICBib29sIGlzS2lsbCwKKyAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkFkZHIsCisgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAmTmV3TUlzKSBjb25zdCB7CisgIGxsdm1fdW5yZWFjaGFibGUoInN0b3JlUmVnVG9BZGRyIG5vdCBpbXBsZW1lbnRlZCIpOworfQorCit2b2lkCitCbGFja2Zpbkluc3RySW5mbzo6bG9hZFJlZ0Zyb21TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICBEZWJ1Z0xvYyBETCA9IEkgIT0gTUJCLmVuZCgpID8gSS0+Z2V0RGVidWdMb2MoKSA6IERlYnVnTG9jKCk7CisgIGlmIChpbkNsYXNzKEJGOjpEUFJlZ0NsYXNzLCBEZXN0UmVnLCBSQykpIHsKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChCRjo6TE9BRDMyZmkpLCBEZXN0UmVnKQorICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpCisgICAgICAuYWRkSW1tKDApOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChpbkNsYXNzKEJGOjpEMTZSZWdDbGFzcywgRGVzdFJlZywgUkMpKSB7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQkY6OkxPQUQxNmZpKSwgRGVzdFJlZykKKyAgICAgIC5hZGRGcmFtZUluZGV4KEZJKQorICAgICAgLmFkZEltbSgwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoaW5DbGFzcyhCRjo6QW55Q0NSZWdDbGFzcywgRGVzdFJlZywgUkMpKSB7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoQkY6OkxPQUQ4ZmkpLCBEZXN0UmVnKQorICAgICAgLmFkZEZyYW1lSW5kZXgoRkkpCisgICAgICAuYWRkSW1tKDApOworICAgIHJldHVybjsKKyAgfQorCisgIGxsdm1fdW5yZWFjaGFibGUoIkNhbm5vdCBsb2FkIHJlZ2NsYXNzIGZyb20gc3RhY2sgc2xvdCIpOworfQorCit2b2lkIEJsYWNrZmluSW5zdHJJbmZvOjoKK2xvYWRSZWdGcm9tQWRkcihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQWRkciwKKyAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyKj4gJk5ld01JcykgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJsb2FkUmVnRnJvbUFkZHIgbm90IGltcGxlbWVudGVkIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW5zdHJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW5zdHJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMTAyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JbnN0ckluZm8uaApAQCAtMCwwICsxLDc4IEBACisvLz09PS0gQmxhY2tmaW5JbnN0ckluZm8uaCAtIEJsYWNrZmluIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQmxhY2tmaW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEJMQUNLRklOSU5TVFJVQ1RJT05JTkZPX0gKKyNkZWZpbmUgQkxBQ0tGSU5JTlNUUlVDVElPTklORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiQmxhY2tmaW5SZWdpc3RlckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIEJsYWNrZmluSW5zdHJJbmZvIDogcHVibGljIFRhcmdldEluc3RySW5mb0ltcGwgeworICAgIGNvbnN0IEJsYWNrZmluUmVnaXN0ZXJJbmZvIFJJOworICAgIGNvbnN0IEJsYWNrZmluU3VidGFyZ2V0JiBTdWJ0YXJnZXQ7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCbGFja2Zpbkluc3RySW5mbyhCbGFja2ZpblN1YnRhcmdldCAmU1QpOworCisgICAgLy8vIGdldFJlZ2lzdGVySW5mbyAtIFRhcmdldEluc3RySW5mbyBpcyBhIHN1cGVyc2V0IG9mIE1SZWdpc3RlciBpbmZvLiAgQXMKKyAgICAvLy8gc3VjaCwgd2hlbmV2ZXIgYSBjbGllbnQgaGFzIGFuIGluc3RhbmNlIG9mIGluc3RydWN0aW9uIGluZm8sIGl0IHNob3VsZAorICAgIC8vLyBhbHdheXMgYmUgYWJsZSB0byBnZXQgcmVnaXN0ZXIgaW5mbyBhcyB3ZWxsICh0aHJvdWdoIHRoaXMgbWV0aG9kKS4KKyAgICB2aXJ0dWFsIGNvbnN0IEJsYWNrZmluUmVnaXN0ZXJJbmZvICZnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBSSTsgfQorCisgICAgdmlydHVhbCB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHVuc2lnbmVkCisgICAgSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgS2lsbFNyYykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHN0b3JlUmVnVG9BZGRyKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyKj4gJk5ld01JcykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgbG9hZFJlZ0Zyb21TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGxvYWRSZWdGcm9tQWRkcihNYWNoaW5lRnVuY3Rpb24gJk1GLCB1bnNpZ25lZCBEZXN0UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICZOZXdNSXMpIGNvbnN0OworICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JbnN0ckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW5zdHJJbmZvLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMzRhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW5zdHJJbmZvLnRkCkBAIC0wLDAgKzEsODYyIEBACisvLz09PS0gQmxhY2tmaW5JbnN0ckluZm8udGQgLSBUYXJnZXQgRGVzY3JpcHRpb24gZm9yIEJsYWNrZmluIFRhcmdldCAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIEJsYWNrZmluIGluc3RydWN0aW9ucyBpbiBUYWJsZUdlbiBmb3JtYXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGZvcm1hdCBzdXBlcmNsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitpbmNsdWRlICJCbGFja2Zpbkluc3RyRm9ybWF0cy50ZCIKKworLy8gVGhlc2UgYXJlIHRhcmdldC1pbmRlcGVuZGVudCBub2RlcywgYnV0IGhhdmUgdGFyZ2V0LXNwZWNpZmljIGZvcm1hdHMuCitkZWYgU0RUX0JmaW5DYWxsU2VxU3RhcnQgOiBTRENhbGxTZXFTdGFydDxbIFNEVENpc1ZUPDAsIGkzMj4gXT47CitkZWYgU0RUX0JmaW5DYWxsU2VxRW5kICAgOiBTRENhbGxTZXFFbmQ8WyBTRFRDaXNWVDwwLCBpMzI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDEsIGkzMj4gXT47CisKK2RlZiBCZmluQ2FsbHNlcVN0YXJ0IDogU0ROb2RlPCJJU0Q6OkNBTExTRVFfU1RBUlQiLCBTRFRfQmZpbkNhbGxTZXFTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPdXRGbGFnXT47CitkZWYgQmZpbkNhbGxzZXFFbmQgICA6IFNETm9kZTwiSVNEOjpDQUxMU0VRX0VORCIsICAgU0RUX0JmaW5DYWxsU2VxRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZywgU0ROUE91dEZsYWddPjsKKworZGVmIFNEVF9CZmluQ2FsbCAgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFtTRFRDaXNQdHJUeTwwPl0+OworZGVmIEJmaW5DYWxsICAgICAgOiBTRE5vZGU8IkJGSVNEOjpDQUxMIiwgU0RUX0JmaW5DYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZywgU0ROUE91dEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUFZhcmlhZGljXT47CisKK2RlZiBCZmluUmV0OiBTRE5vZGU8IkJGSVNEOjpSRVRfRkxBRyIsIFNEVE5vbmUsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWddPjsKKworZGVmIEJmaW5XcmFwcGVyOiBTRE5vZGU8IkJGSVNEOjpXcmFwcGVyIiwgU0RUSW50VW5hcnlPcD47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUcmFuc2Zvcm1hdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiB0cmFpbGluZ1plcm9zX3hmb3JtIDogU0ROb2RlWEZvcm08aW1tLCBbeworICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChOLT5nZXRBUEludFZhbHVlKCkuY291bnRUcmFpbGluZ1plcm9zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTMyKTsKK31dPjsKKworZGVmIHRyYWlsaW5nT25lc194Zm9ybSA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoTi0+Z2V0QVBJbnRWYWx1ZSgpLmNvdW50VHJhaWxpbmdPbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTMyKTsKK31dPjsKKworZGVmIExPMTYgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KCh1bnNpZ25lZCBzaG9ydClOLT5nZXRaRXh0VmFsdWUoKSwgTVZUOjppMTYpOworfV0+OworCitkZWYgSEkxNiA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IHNoaWZ0IHRoZSBpbW1lZGlhdGUgdmFsdWUgZG93biBpbnRvIHRoZSBsb3cgYml0cy4KKyAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoKHVuc2lnbmVkKU4tPmdldFpFeHRWYWx1ZSgpID4+IDE2LCBNVlQ6OmkxNik7Cit9XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbW1lZGlhdGVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgaW1tMyAgOiBQYXRMZWFmPChpbW0pLCBbe3JldHVybiBpc0ludDwzPihOLT5nZXRTRXh0VmFsdWUoKSk7fV0+OworZGVmIHVpbW0zIDogUGF0TGVhZjwoaW1tKSwgW3tyZXR1cm4gaXNVSW50PDM+KE4tPmdldFpFeHRWYWx1ZSgpKTt9XT47CitkZWYgdWltbTQgOiBQYXRMZWFmPChpbW0pLCBbe3JldHVybiBpc1VJbnQ8ND4oTi0+Z2V0WkV4dFZhbHVlKCkpO31dPjsKK2RlZiB1aW1tNSA6IFBhdExlYWY8KGltbSksIFt7cmV0dXJuIGlzVUludDw1PihOLT5nZXRaRXh0VmFsdWUoKSk7fV0+OworCitkZWYgdWltbTVtMiA6IFBhdExlYWY8KGltbSksIFt7CisgICAgdWludDY0X3QgdmFsdWUgPSBOLT5nZXRaRXh0VmFsdWUoKTsKKyAgICByZXR1cm4gdmFsdWUgJSAyID09IDAgJiYgaXNVSW50PDU+KHZhbHVlKTsKK31dPjsKKworZGVmIHVpbW02bTQgOiBQYXRMZWFmPChpbW0pLCBbeworICAgIHVpbnQ2NF90IHZhbHVlID0gTi0+Z2V0WkV4dFZhbHVlKCk7CisgICAgcmV0dXJuIHZhbHVlICUgNCA9PSAwICYmIGlzVUludDw2Pih2YWx1ZSk7Cit9XT47CisKK2RlZiBpbW03ICAgOiBQYXRMZWFmPChpbW0pLCBbe3JldHVybiBpc0ludDw3PihOLT5nZXRTRXh0VmFsdWUoKSk7fV0+OworZGVmIGltbTE2ICA6IFBhdExlYWY8KGltbSksIFt7cmV0dXJuIGlzSW50PDE2PihOLT5nZXRTRXh0VmFsdWUoKSk7fV0+OworZGVmIHVpbW0xNiA6IFBhdExlYWY8KGltbSksIFt7cmV0dXJuIGlzVUludDwxNj4oTi0+Z2V0WkV4dFZhbHVlKCkpO31dPjsKKworZGVmIHhpbW0xNiA6IFBhdExlYWY8KGltbSksIFt7CisgICAgaW50NjRfdCB2YWx1ZSA9IE4tPmdldFNFeHRWYWx1ZSgpOworICAgIHJldHVybiB2YWx1ZSA8ICgxPDwxNikgJiYgdmFsdWUgPj0gLSgxPDwxNSk7Cit9XT47CisKK2RlZiBpbW0xN20yIDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgICBpbnQ2NF90IHZhbHVlID0gTi0+Z2V0U0V4dFZhbHVlKCk7CisgICAgcmV0dXJuIHZhbHVlICUgMiA9PSAwICYmIGlzSW50PDE3Pih2YWx1ZSk7Cit9XT47CisKK2RlZiBpbW0xOG00IDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgICBpbnQ2NF90IHZhbHVlID0gTi0+Z2V0U0V4dFZhbHVlKCk7CisgICAgcmV0dXJuIHZhbHVlICUgNCA9PSAwICYmIGlzSW50PDE4Pih2YWx1ZSk7Cit9XT47CisKKy8vIDMyLWJpdCBiaXRtYXNrIHRyYW5zZm9ybWVkIHRvIGEgYml0IG51bWJlcgorZGVmIHVpbW01bWFzayA6IE9wZXJhbmQ8aTMyPiwgUGF0TGVhZjwoaW1tKSwgW3sKKyAgICByZXR1cm4gaXNQb3dlck9mMl8zMihOLT5nZXRaRXh0VmFsdWUoKSk7Cit9XSwgdHJhaWxpbmdaZXJvc194Zm9ybT47CisKKy8vIDMyLWJpdCBpbnZlcnNlIGJpdG1hc2sgdHJhbnNmb3JtZWQgdG8gYSBiaXQgbnVtYmVyCitkZWYgdWltbTVpbWFzayA6IE9wZXJhbmQ8aTMyPiwgUGF0TGVhZjwoaW1tKSwgW3sKKyAgICByZXR1cm4gaXNQb3dlck9mMl8zMih+Ti0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIHRyYWlsaW5nT25lc194Zm9ybT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPcGVyYW5kcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIGNhbGx0YXJnZXQgOiBPcGVyYW5kPGlQVFI+OworCitkZWYgYnJ0YXJnZXQgOiBPcGVyYW5kPE90aGVyVlQ+OworCisvLyBBZGRyZXNzaW5nIG1vZGVzCitkZWYgQUREUnNwaWkgOiBDb21wbGV4UGF0dGVybjxpMzIsIDIsICJTZWxlY3RBRERSc3BpaSIsIFthZGQsIGZyYW1laW5kZXhdLCBbXT47CisKKy8vIEFkZHJlc3Mgb3BlcmFuZHMKK2RlZiBNRU1paSA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludE1lbW9yeU9wZXJhbmQiOworICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgaTMyaW1tLCBpMzJpbW0pOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBQc2V1ZG8gaW5zdHJ1Y3Rpb25zLgorY2xhc3MgUHNldWRvPGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgIDogSW5zdEJmaW48b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitsZXQgRGVmcyA9IFtTUF0sIFVzZXMgPSBbU1BdIGluIHsKK2RlZiBBREpDQUxMU1RBQ0tET1dOIDogUHNldWRvPChvdXRzKSwgKGlucyBpMzJpbW06JGFtdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH1BREpDQUxMU1RBQ0tET1dOICRhbXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhCZmluQ2FsbHNlcVN0YXJ0IHRpbW06JGFtdCldPjsKK2RlZiBBREpDQUxMU1RBQ0tVUCA6IFBzZXVkbzwob3V0cyksIChpbnMgaTMyaW1tOiRhbXQxLCBpMzJpbW06JGFtdDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkezpjb21tZW50fUFESkNBTExTVEFDS1VQICRhbXQxICRhbXQyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKEJmaW5DYWxsc2VxRW5kIHRpbW06JGFtdDEsIHRpbW06JGFtdDIpXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYWJsZSBDLTkuIFByb2dyYW0gRmxvdyBDb250cm9sIEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSBpbiB7CisKK2xldCBpc0luZGlyZWN0QnJhbmNoID0gMSBpbgorZGVmIEpVTVBwIDogRjE8KG91dHMpLCAoaW5zIFA6JHRhcmdldCksCisgICAgICAgICAgICAgICAiSlVNUCAoJHRhcmdldCk7IiwKKyAgICAgICAgICAgICAgIFsoYnJpbmQgUDokdGFyZ2V0KV0+OworCisvLyBUT0RPIEpVTVAgKFBDLVApCisKKy8vIE5PVEU6IGFzc2VtYmxlciBjaG9vc2VzIGJldHdlZW4gSlVNUC5TIGFuZCBKVU1QLkwKK2RlZiBKVU1QYSA6IEYxPChvdXRzKSwgKGlucyBicnRhcmdldDokdGFyZ2V0KSwKKyAgICAgICAgICAgICAgICJqdW1wICR0YXJnZXQ7IiwKKyAgICAgICAgICAgICAgIFsoYnIgYmI6JHRhcmdldCldPjsKKworZGVmIEpVTVBjYyA6IEYxPChvdXRzKSwgKGlucyBBbnlDQzokY2MsIGJydGFyZ2V0OiR0YXJnZXQpLAorICAgICAgICAgICAgICAgImlmICRjYyBqdW1wICR0YXJnZXQ7IiwKKyAgICAgICAgICAgICAgIFsoYnJjb25kIEFueUNDOiRjYywgYmI6JHRhcmdldCldPjsKK30KKworbGV0IGlzQ2FsbCA9IDEsCisgICAgRGVmcyAgID0gW1IwLCBSMSwgUjIsIFIzLCBQMCwgUDEsIFAyLCBMQjAsIExCMSwgTEMwLCBMQzEsIFJFVFMsIEFTVEFUXSBpbiB7CitkZWYgQ0FMTGE6IEYxPChvdXRzKSwgKGlucyBjYWxsdGFyZ2V0OiRmdW5jLCB2YXJpYWJsZV9vcHMpLAorICAgICAgICAgICAgICAiY2FsbCAkZnVuYzsiLCBbXT47CitkZWYgQ0FMTHA6IEYxPChvdXRzKSwgKGlucyBQOiRmdW5jLCB2YXJpYWJsZV9vcHMpLAorICAgICAgICAgICAgICAiY2FsbCAoJGZ1bmMpOyIsIFsoQmZpbkNhbGwgUDokZnVuYyldPjsKK30KKworbGV0IGlzUmV0dXJuICAgICA9IDEsCisgICAgaXNUZXJtaW5hdG9yID0gMSwKKyAgICBpc0JhcnJpZXIgICAgPSAxLAorICAgIFVzZXMgICAgICAgICA9IFtSRVRTXSBpbgorZGVmIFJUUzogRjE8KG91dHMpLCAoaW5zKSwgInJ0czsiLCBbKEJmaW5SZXQpXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYWJsZSBDLTEwLiBMb2FkIC8gU3RvcmUgSW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBJbW1lZGlhdGUgY29uc3RhbnQgbG9hZHMKKworLy8gc2V4dCBpbW1lZGlhdGUsIGkzMiBEL1AgcmVncworZGVmIExPQURpbW03OiBGMTwob3V0cyBEUDokZHN0KSwgKGlucyBpMzJpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICIkZHN0ID0gJHNyYyAoeCk7IiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgRFA6JGRzdCwgaW1tNzokc3JjKV0+OworCisvLyB6ZXh0IGltbWVkaWF0ZSwgaTMyIHJlZyBncm91cHMgMC0zCitkZWYgTE9BRHVpbW0xNjogRjI8KG91dHMgR1I6JGRzdCksIChpbnMgaTMyaW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICIkZHN0ID0gJHNyYyAoeik7IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjokZHN0LCB1aW1tMTY6JHNyYyldPjsKKworLy8gc2V4dCBpbW1lZGlhdGUsIGkzMiByZWcgZ3JvdXBzIDAtMworZGVmIExPQURpbW0xNjogRjI8KG91dHMgR1I6JGRzdCksIChpbnMgaTMyaW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgIiRkc3QgPSAkc3JjICh4KTsiLAorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I6JGRzdCwgaW1tMTY6JHNyYyldPjsKKworLy8gUHNldWRvLWluc3RydWN0aW9uIGZvciBsb2FkaW5nIGEgZ2VuZXJhbCAzMi1iaXQgY29uc3RhbnQuCitkZWYgTE9BRDMyaW1tOiBQc2V1ZG88KG91dHMgR1I6JGRzdCksIChpbnMgaTMyaW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICIkZHN0LmggPSAoJHNyYyA+PiAxNik7ICRkc3QubCA9ICgkc3JjICYgMHhmZmZmKTsiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSOiRkc3QsIGltbTokc3JjKV0+OworCitkZWYgTE9BRDMyc3ltOiBQc2V1ZG88KG91dHMgR1I6JGRzdCksIChpbnMgaTMyaW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICIkZHN0LmggPSAkc3JjOyAkZHN0LmwgPSAkc3JjOyIsIFtdPjsKKworCisvLyAxNi1iaXQgaW1tZWRpYXRlLCBpMTYgcmVnIGdyb3VwcyAwLTMKK2RlZiBMT0FEMTZpOiBGMjwob3V0cyBHUjE2OiRkc3QpLCAoaW5zIGkxNmltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgIiRkc3QgPSAkc3JjOyIsIFtdPjsKKworZGVmIDogUGF0PChCZmluV3JhcHBlciAoaTMyIHRnbG9iYWxhZGRyOiRhZGRyKSksCisgICAgICAgICAgKExPQUQzMnN5bSB0Z2xvYmFsYWRkcjokYWRkcik+OworCitkZWYgOiBQYXQ8KEJmaW5XcmFwcGVyIChpMzIgdGp1bXB0YWJsZTokYWRkcikpLAorICAgICAgICAgIChMT0FEMzJzeW0gdGp1bXB0YWJsZTokYWRkcik+OworCisvLyBXZSBjYW5ub3QgY29weSBmcm9tIEdSMTYgdG8gRDE2LCBhbmQgY29kZWdlbiB3YW50cyB0byBpbnNlcnQgY29waWVzIGlmIHdlCisvLyBlbWl0IEdSMTYgaW5zdHJ1Y3Rpb25zLiBBcyBhIGhhY2ssIHdlIHVzZSB0aGlzIGZha2UgaW5zdHJ1Y3Rpb24gaW5zdGVhZC4KK2RlZiBMT0FEMTZpX2QxNjogRjI8KG91dHMgRDE2OiRkc3QpLCAoaW5zIGkxNmltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgIiRkc3QgPSAkc3JjOyIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEQxNjokZHN0LCB4aW1tMTY6JHNyYyldPjsKKworLy8gTWVtb3J5IGxvYWRzIHdpdGggcGF0dGVybnMKKworZGVmIExPQUQzMnA6IEYxPChvdXRzIERQOiRkc3QpLCAoaW5zIFA6JHB0ciksCisgICAgICAgICAgICAgICAgIiRkc3QgPSBbJHB0cl07IiwKKyAgICAgICAgICAgICAgICBbKHNldCBEUDokZHN0LCAobG9hZCBQOiRwdHIpKV0+OworCisvLyBQc2V1ZG8taW5zdHJ1Y3Rpb24gZm9yIGxvYWRpbmcgYSBzdGFjayBzbG90CitkZWYgTE9BRDMyZmk6IFBzZXVkbzwob3V0cyBEUDokZHN0KSwgKGlucyBNRU1paTokbWVtKSwKKyAgICAgICAgICAgICAgICAgICAgICIkezpjb21tZW50fUZJICRkc3QgPSBbJG1lbV07IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IERQOiRkc3QsIChsb2FkIEFERFJzcGlpOiRtZW0pKV0+OworCisvLyBOb3RlOiBFeHBhbmRzIHRvIG11bHRpcGxlIGluc25zCitkZWYgTE9BRDE2Zmk6IFBzZXVkbzwob3V0cyBEMTY6JGRzdCksIChpbnMgTUVNaWk6JG1lbSksCisgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH1GSSAkZHN0ID0gWyRtZW1dOyIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBEMTY6JGRzdCwgKGxvYWQgQUREUnNwaWk6JG1lbSkpXT47CisKKy8vIFBzZXVkby1pbnN0cnVjdGlvbiBmb3IgbG9hZGluZyBhIHN0YWNrIHNsb3QsIHVzZWQgZm9yIEFueUNDIHJlZ3MuCisvLyBSZXBsYWNlZCB3aXRoIExvYWQgRCArIENDPUQKK2RlZiBMT0FEOGZpOiBQc2V1ZG88KG91dHMgQW55Q0M6JGRzdCksIChpbnMgTUVNaWk6JG1lbSksCisgICAgICAgICAgICAgICAgICAgICIkezpjb21tZW50fUZJICRkc3QgPSBCWyRtZW1dOyIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEFueUNDOiRkc3QsIChsb2FkIEFERFJzcGlpOiRtZW0pKV0+OworCitkZWYgTE9BRDMycF91aW1tNm00OiBGMTwob3V0cyBEUDokZHN0KSwgKGlucyBQOiRwdHIsIGkzMmltbTokb2ZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkZHN0ID0gWyRwdHIgKyAkb2ZmXTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRFA6JGRzdCwgKGxvYWQgKGFkZCBQOiRwdHIsIHVpbW02bTQ6JG9mZikpKV0+OworCitkZWYgTE9BRDMycF9pbW0xOG00OiBGMjwob3V0cyBEUDokZHN0KSwgKGlucyBQOiRwdHIsIGkzMmltbTokb2ZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJGRzdCA9IFskcHRyICsgJG9mZl07IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEUDokZHN0LCAobG9hZCAoYWRkIFA6JHB0ciwgaW1tMThtNDokb2ZmKSkpXT47CisKK2RlZiBMT0FEMzJwXzE2ejogRjE8KG91dHMgRDokZHN0KSwgKGlucyBQOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAiJGRzdCA9IFdbJHB0cl0gKHopOyIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwgKHpleHRsb2FkaTE2IFA6JHB0cikpXT47CisKK2RlZiA6IFBhdDwoaTMyIChleHRsb2FkaTE2IFA6JHB0cikpLChMT0FEMzJwXzE2eiBQOiRwdHIpPjsKKworZGVmIExPQUQzMnBfdWltbTVtMl8xNno6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgUDokcHRyLCBpMzJpbW06JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRkc3QgPSB3WyRwdHIgKyAkb2ZmXSAoeik7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsICh6ZXh0bG9hZGkxNiAoYWRkIFA6JHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWltbTVtMjokb2ZmKSkpXT47CisKK2RlZiA6IFBhdDwoaTMyIChleHRsb2FkaTE2IChhZGQgUDokcHRyLCB1aW1tNW0yOiRvZmYpKSksCisgICAgICAgICAgKExPQUQzMnBfdWltbTVtMl8xNnogUDokcHRyLCBpbW06JG9mZik+OworCitkZWYgTE9BRDMycF9pbW0xN20yXzE2ejogRjE8KG91dHMgRDokZHN0KSwgKGlucyBQOiRwdHIsIGkzMmltbTokb2ZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGRzdCA9IHdbJHB0ciArICRvZmZdICh6KTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoemV4dGxvYWRpMTYgKGFkZCBQOiRwdHIsIGltbTE3bTI6JG9mZikpKV0+OworCitkZWYgOiBQYXQ8KGkzMiAoZXh0bG9hZGkxNiAoYWRkIFA6JHB0ciwgaW1tMTdtMjokb2ZmKSkpLAorICAgICAgICAgIChMT0FEMzJwX2ltbTE3bTJfMTZ6IFA6JHB0ciwgaW1tOiRvZmYpPjsKKworZGVmIExPQUQzMnBfMTZzOiBGMTwob3V0cyBEOiRkc3QpLCAoaW5zIFA6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICIkZHN0ID0gd1skcHRyXSAoeCk7IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRDokZHN0LCAoc2V4dGxvYWRpMTYgUDokcHRyKSldPjsKKworZGVmIExPQUQzMnBfdWltbTVtMl8xNnM6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgUDokcHRyLCBpMzJpbW06JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRkc3QgPSB3WyRwdHIgKyAkb2ZmXSAoeCk7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNleHRsb2FkaTE2IChhZGQgUDokcHRyLCB1aW1tNW0yOiRvZmYpKSldPjsKKworZGVmIExPQUQzMnBfaW1tMTdtMl8xNnM6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgUDokcHRyLCBpMzJpbW06JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRkc3QgPSB3WyRwdHIgKyAkb2ZmXSAoeCk7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNleHRsb2FkaTE2IChhZGQgUDokcHRyLCBpbW0xN20yOiRvZmYpKSldPjsKKworZGVmIExPQUQxNnBpOiBGMTwob3V0cyBEMTY6JGRzdCksIChpbnMgUEk6JHB0ciksCisgICAgICAgICAgICAgICAgIiRkc3QgPSB3WyRwdHJdOyIsCisgICAgICAgICAgICAgICAgWyhzZXQgRDE2OiRkc3QsIChsb2FkIFBJOiRwdHIpKV0+OworCitkZWYgTE9BRDMycF84ejogRjE8KG91dHMgRDokZHN0KSwgKGlucyBQOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICIkZHN0ID0gQlskcHRyXSAoeik7IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsICh6ZXh0bG9hZGk4IFA6JHB0cikpXT47CisKK2RlZiA6IFBhdDwoaTMyIChleHRsb2FkaTggUDokcHRyKSksIChMT0FEMzJwXzh6IFA6JHB0cik+OworZGVmIDogUGF0PChpMTYgKGV4dGxvYWRpOCBQOiRwdHIpKSwKKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKExPQUQzMnBfOHogUDokcHRyKSwgbG8xNik+OworZGVmIDogUGF0PChpMTYgKHpleHRsb2FkaTggUDokcHRyKSksCisgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChMT0FEMzJwXzh6IFA6JHB0ciksIGxvMTYpPjsKKworZGVmIExPQUQzMnBfaW1tMTZfOHo6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgUDokcHRyLCBpMzJpbW06JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiRkc3QgPSBiWyRwdHIgKyAkb2ZmXSAoeik7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsICh6ZXh0bG9hZGk4IChhZGQgUDokcHRyLCBpbW0xNjokb2ZmKSkpXT47CisKK2RlZiA6IFBhdDwoaTMyIChleHRsb2FkaTggKGFkZCBQOiRwdHIsIGltbTE2OiRvZmYpKSksCisgICAgICAgICAgKExPQUQzMnBfaW1tMTZfOHogUDokcHRyLCBpbW06JG9mZik+OworZGVmIDogUGF0PChpMTYgKGV4dGxvYWRpOCAoYWRkIFA6JHB0ciwgaW1tMTY6JG9mZikpKSwKKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKExPQUQzMnBfaW1tMTZfOHogUDokcHRyLCBpbW06JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbzE2KT47CitkZWYgOiBQYXQ8KGkxNiAoemV4dGxvYWRpOCAoYWRkIFA6JHB0ciwgaW1tMTY6JG9mZikpKSwKKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKExPQUQzMnBfaW1tMTZfOHogUDokcHRyLCBpbW06JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbzE2KT47CisKK2RlZiBMT0FEMzJwXzhzOiBGMTwob3V0cyBEOiRkc3QpLCAoaW5zIFA6JHB0ciksCisgICAgICAgICAgICAgICAgICAgIiRkc3QgPSBiWyRwdHJdICh4KTsiLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwgKHNleHRsb2FkaTggUDokcHRyKSldPjsKKworZGVmIDogUGF0PChpMTYgKHNleHRsb2FkaTggUDokcHRyKSksCisgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChMT0FEMzJwXzhzIFA6JHB0ciksIGxvMTYpPjsKKworZGVmIExPQUQzMnBfaW1tMTZfOHM6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgUDokcHRyLCBpMzJpbW06JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiRkc3QgPSBiWyRwdHIgKyAkb2ZmXSAoeCk7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChzZXh0bG9hZGk4IChhZGQgUDokcHRyLCBpbW0xNjokb2ZmKSkpXT47CisKK2RlZiA6IFBhdDwoaTE2IChzZXh0bG9hZGk4IChhZGQgUDokcHRyLCBpbW0xNjokb2ZmKSkpLAorICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyAoTE9BRDMycF9pbW0xNl84cyBQOiRwdHIsIGltbTokb2ZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvMTYpPjsKKy8vIE1lbW9yeSBsb2FkcyB3aXRob3V0IHBhdHRlcm5zCisKK2xldCBtYXlMb2FkID0gMSBpbiB7CisKK211bHRpY2xhc3MgTE9BRF9pbmNkZWM8UmVnaXN0ZXJDbGFzcyBkcmMsIFJlZ2lzdGVyQ2xhc3MgcHJjLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWVtPSIiLCBzdHJpbmcgc3VmPSI7Ij4geworICBkZWYgX2luYyA6IEYxPChvdXRzIGRyYzokZHN0LCBwcmM6JHB0cl93YiksIChpbnMgcHJjOiRwdHIpLAorICAgICAgICAgICAgICAgICFzdHJjb25jYXQoIXN1YnN0KCJNIiwgbWVtLCAiJGRzdCA9IE1bJHB0cisrXSIpLCBzdWYpLCBbXT47CisgIGRlZiBfZGVjIDogRjE8KG91dHMgZHJjOiRkc3QsIHByYzokcHRyX3diKSwgKGlucyBwcmM6JHB0ciksCisgICAgICAgICAgICAgICAgIXN0cmNvbmNhdCghc3Vic3QoIk0iLCBtZW0sICIkZHN0ID0gTVskcHRyLS1dIiksIHN1ZiksIFtdPjsKK30KK211bHRpY2xhc3MgTE9BRF9pbmNkZWNwb3N0PFJlZ2lzdGVyQ2xhc3MgZHJjLCBSZWdpc3RlckNsYXNzIHByYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtZW09IiIsIHN0cmluZyBzdWY9IjsiPgorICAgICAgICAgOiBMT0FEX2luY2RlYzxkcmMsIHByYywgbWVtLCBzdWY+IHsKKyAgZGVmIF9wb3N0IDogRjE8KG91dHMgZHJjOiRkc3QsIHByYzokcHRyX3diKSwgKGlucyBwcmM6JHB0ciwgcHJjOiRvZmYpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KCFzdWJzdCgiTSIsIG1lbSwgIiRkc3QgPSBNWyRwdHIrKyRvZmZdIiksIHN1ZiksIFtdPjsKK30KKworZGVmbSBMT0FEMzJwOiAgICBMT0FEX2luY2RlYzxEUCwgUD47CitkZWZtIExPQUQzMmk6ICAgIExPQURfaW5jZGVjPEQsIEk+OworZGVmbSBMT0FEOHozMnA6ICBMT0FEX2luY2RlYzxELCBQLCAiYiIsICIgKHopOyI+OworZGVmbSBMT0FEOHMzMnA6ICBMT0FEX2luY2RlYzxELCBQLCAiYiIsICIgKHgpOyI+OworZGVmbSBMT0FEaGk6ICAgICBMT0FEX2luY2RlYzxEMTYsIEksICJ3Ij47CitkZWZtIExPQUQxNnozMnA6IExPQURfaW5jZGVjcG9zdDxELCBQLCAidyIsICIgKHopOyI+OworZGVmbSBMT0FEMTZzMzJwOiBMT0FEX2luY2RlY3Bvc3Q8RCwgUCwgInciLCAiICh4KTsiPjsKKworZGVmIExPQUQzMnBfcG9zdDogRjE8KG91dHMgRDokZHN0LCBQOiRwdHJfd2IpLCAoaW5zIFA6JHB0ciwgUDokb2ZmKSwKKyAgICAgICAgICAgICAgICAgICAgICIkZHN0ID0gWyRwdHIgKysgJG9mZl07IiwgW10+OworCisvLyBOb3RlOiAkZnAgTVVTVCBiZSBGUAorZGVmIExPQUQzMmZwX25pbW03bTQ6IEYxPChvdXRzIERQOiRkc3QpLCAoaW5zIFA6JGZwLCBpMzJpbW06JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiRkc3QgPSBbJGZwIC0gJG9mZl07IiwgW10+OworCitkZWYgTE9BRDMyaTogICAgICBGMTwob3V0cyBEOiRkc3QpLCAoaW5zIEk6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAiJGRzdCA9IFskcHRyXTsiLCBbXT47CitkZWYgTE9BRDMyaV9wb3N0OiBGMTwob3V0cyBEOiRkc3QsIEk6JHB0cl93YiksIChpbnMgSTokcHRyLCBNOiRvZmYpLAorICAgICAgICAgICAgICAgICAgICAgIiRkc3QgPSBbJHB0ciArKyAkb2ZmXTsiLCBbXT47CisKKworCitkZWYgTE9BRGhwX3Bvc3Q6IEYxPChvdXRzIEQxNjokZHN0LCBQOiRwdHJfd2IpLCAoaW5zIFA6JHB0ciwgUDokb2ZmKSwKKyAgICAgICAgICAgICAgICAgICAgIiRkc3QgPSB3WyRwdHIgKysgJG9mZl07IiwgW10+OworCisKK30KKworLy8gTWVtb3J5IHN0b3JlcyB3aXRoIHBhdHRlcm5zCitkZWYgU1RPUkUzMnA6IEYxPChvdXRzKSwgKGlucyBEUDokdmFsLCBQOiRwdHIpLAorICAgICAgICAgICAgICAgICAiWyRwdHJdID0gJHZhbDsiLAorICAgICAgICAgICAgICAgICBbKHN0b3JlIERQOiR2YWwsIFA6JHB0cildPjsKKworLy8gUHNldWRvLWluc3RydWN0aW9ucyBmb3Igc3RvcmluZyB0byBhIHN0YWNrIHNsb3QKK2RlZiBTVE9SRTMyZmk6IFBzZXVkbzwob3V0cyksIChpbnMgRFA6JHZhbCwgTUVNaWk6JG1lbSksCisgICAgICAgICAgICAgICAgICAgICAgIiR7OmNvbW1lbnR9RkkgWyRtZW1dID0gJHZhbDsiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgRFA6JHZhbCwgQUREUnNwaWk6JG1lbSldPjsKKworLy8gTm90ZTogVGhpcyBzdGFjay1zdG9yaW5nIHBzZXVkby1pbnN0cnVjdGlvbiBpcyBleHBhbmRlZCB0byBtdWx0aXBsZSBpbnNucworZGVmIFNUT1JFMTZmaTogUHNldWRvPChvdXRzKSwgKGlucyBEMTY6JHZhbCwgTUVNaWk6JG1lbSksCisgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH1GSSBbJG1lbV0gPSAkdmFsOyIsCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIEQxNjokdmFsLCBBRERSc3BpaTokbWVtKV0+OworCisvLyBQc2V1ZG8taW5zdHJ1Y3Rpb25zIGZvciBzdG9yaW5nIEFueUNDIHJlZ2lzdGVyIHRvIGEgc3RhY2sgc2xvdC4KKy8vIFJlcGxhY2VkIHdpdGggRD1DQyArIFNUT1JFIGJ5dGUKK2RlZiBTVE9SRThmaTogUHNldWRvPChvdXRzKSwgKGlucyBBbnlDQzokdmFsLCBNRU1paTokbWVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH1GSSBiWyRtZW1dID0gJHZhbDsiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgQW55Q0M6JHZhbCwgQUREUnNwaWk6JG1lbSldPjsKKworZGVmIFNUT1JFMzJwX3VpbW02bTQ6IEYxPChvdXRzKSwgKGlucyBEUDokdmFsLCBQOiRwdHIsIGkzMmltbTokb2ZmKSwKKyAgICAgICAgICAgICAgICAgIlskcHRyICsgJG9mZl0gPSAkdmFsOyIsCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgRFA6JHZhbCwgKGFkZCBQOiRwdHIsIHVpbW02bTQ6JG9mZikpXT47CisKK2RlZiBTVE9SRTMycF9pbW0xOG00OiBGMTwob3V0cyksIChpbnMgRFA6JHZhbCwgUDokcHRyLCBpMzJpbW06JG9mZiksCisgICAgICAgICAgICAgICAgICJbJHB0ciArICRvZmZdID0gJHZhbDsiLAorICAgICAgICAgICAgICAgICBbKHN0b3JlIERQOiR2YWwsIChhZGQgUDokcHRyLCBpbW0xOG00OiRvZmYpKV0+OworCitkZWYgU1RPUkUxNnBpOiBGMTwob3V0cyksIChpbnMgRDE2OiR2YWwsIFBJOiRwdHIpLAorICAgICAgICAgICAgICAgICAgIndbJHB0cl0gPSAkdmFsOyIsCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIEQxNjokdmFsLCBQSTokcHRyKV0+OworCitkZWYgU1RPUkU4cDogRjE8KG91dHMpLCAoaW5zIEQ6JHZhbCwgUDokcHRyKSwKKyAgICAgICAgICAgICAgICAiYlskcHRyXSA9ICR2YWw7IiwKKyAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpOCBEOiR2YWwsIFA6JHB0cildPjsKKworZGVmIFNUT1JFOHBfaW1tMTY6IEYxPChvdXRzKSwgKGlucyBEOiR2YWwsIFA6JHB0ciwgaTMyaW1tOiRvZmYpLAorICAgICAgICAgICAgICAgICAiYlskcHRyICsgJG9mZl0gPSAkdmFsOyIsCisgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWk4IEQ6JHZhbCwgKGFkZCBQOiRwdHIsIGltbTE2OiRvZmYpKV0+OworCitsZXQgQ29uc3RyYWludHMgPSAiJHB0ciA9ICRwdHJfd2IiIGluIHsKKworbXVsdGljbGFzcyBTVE9SRV9pbmNkZWM8UmVnaXN0ZXJDbGFzcyBkcmMsIFJlZ2lzdGVyQ2xhc3MgcHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZj00LCBzdHJpbmcgcHJlPSIiPiB7CisgIGRlZiBfaW5jIDogRjE8KG91dHMgcHJjOiRwdHJfd2IpLCAoaW5zIGRyYzokdmFsLCBwcmM6JHB0ciksCisgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChwcmUsICJbJHB0cisrXSA9ICR2YWw7IiksCisgICAgICAgICAgICAgICAgWyhzZXQgcHJjOiRwdHJfd2IsIChwb3N0X3N0b3JlIGRyYzokdmFsLCBwcmM6JHB0ciwgb2ZmKSldPjsKKyAgZGVmIF9kZWMgOiBGMTwob3V0cyBwcmM6JHB0cl93YiksIChpbnMgZHJjOiR2YWwsIHByYzokcHRyKSwKKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KHByZSwgIlskcHRyLS1dID0gJHZhbDsiKSwKKyAgICAgICAgICAgICAgICBbKHNldCBwcmM6JHB0cl93YiwgKHBvc3Rfc3RvcmUgZHJjOiR2YWwsIHByYzokcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5lZyBvZmYpKSldPjsKK30KKworZGVmbSBTVE9SRTMycDogU1RPUkVfaW5jZGVjPERQLCBQPjsKK2RlZm0gU1RPUkUxNmk6IFNUT1JFX2luY2RlYzxEMTYsIEksIDIsICJ3Ij47CitkZWZtIFNUT1JFOHA6ICBTVE9SRV9pbmNkZWM8RCwgUCwgMSwgImIiPjsKKworZGVmIFNUT1JFMzJwX3Bvc3Q6IEYxPChvdXRzIFA6JHB0cl93YiksIChpbnMgRDokdmFsLCBQOiRwdHIsIFA6JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgIlskcHRyICsrICRvZmZdID0gJHZhbDsiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFA6JHB0cl93YiwgKHBvc3Rfc3RvcmUgRDokdmFsLCBQOiRwdHIsIFA6JG9mZikpXT47CisKK2RlZiBTVE9SRTE2cF9wb3N0OiBGMTwob3V0cyBQOiRwdHJfd2IpLCAoaW5zIEQxNjokdmFsLCBQOiRwdHIsIFA6JG9mZiksCisgICAgICAgICAgICAgICAgICAgICAgIndbJHB0ciArKyAkb2ZmXSA9ICR2YWw7IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBQOiRwdHJfd2IsIChwb3N0X3N0b3JlIEQxNjokdmFsLCBQOiRwdHIsIFA6JG9mZikpXT47Cit9CisKKy8vIE1lbW9yeSBzdG9yZXMgd2l0aG91dCBwYXR0ZXJucworCitsZXQgbWF5U3RvcmUgPSAxIGluIHsKKworLy8gTm90ZTogb25seSB3b3JrcyBmb3IgJGZwID09IEZQCitkZWYgU1RPUkUzMmZwX25pbW03bTQ6IEYxPChvdXRzKSwgKGlucyBEUDokdmFsLCBQOiRmcCwgaTMyaW1tOiRvZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbJGZwIC0gJG9mZl0gPSAkdmFsOyIsIFtdPjsKKworZGVmIFNUT1JFMzJpOiBGMTwob3V0cyksIChpbnMgRDokdmFsLCBJOiRwdHIpLAorICAgICAgICAgICAgICAgICAiWyRwdHJdID0gJHZhbDsiLCBbXT47CisKK2RlZiBTVE9SRTMyaV9pbmM6IEYxPChvdXRzIEk6JHB0cl93YiksIChpbnMgRDokdmFsLCBJOiRwdHIpLAorICAgICAgICAgICAgICAgICAiWyRwdHIrK10gPSAkdmFsOyIsIFtdPjsKKworZGVmIFNUT1JFMzJpX2RlYzogRjE8KG91dHMgSTokcHRyX3diKSwgKGlucyBEOiR2YWwsIEk6JHB0ciksCisgICAgICAgICAgICAgICAgICJbJHB0ci0tXSA9ICR2YWw7IiwgW10+OworCitkZWYgU1RPUkUzMmlfcG9zdDogRjE8KG91dHMgSTokcHRyX3diKSwgKGlucyBEOiR2YWwsIEk6JHB0ciwgTTokb2ZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiWyRwdHIgKysgJG9mZl0gPSAkdmFsOyIsIFtdPjsKK30KKworZGVmIDogUGF0PCh0cnVuY3N0b3JlaTE2IEQ6JHZhbCwgUEk6JHB0ciksCisgICAgICAgICAgKFNUT1JFMTZwaSAoRVhUUkFDVF9TVUJSRUcgKGkzMiAoQ09QWV9UT19SRUdDTEFTUyBEOiR2YWwsIEQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbzE2KSwgUEk6JHB0cik+OworCitkZWYgOiBQYXQ8KHRydW5jc3RvcmVpMTYgKHNybCBEOiR2YWwsIChpMTYgMTYpKSwgUEk6JHB0ciksCisgICAgICAgICAgKFNUT1JFMTZwaSAoRVhUUkFDVF9TVUJSRUcgKGkzMiAoQ09QWV9UT19SRUdDTEFTUyBEOiR2YWwsIEQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaTE2KSwgUEk6JHB0cik+OworCitkZWYgOiBQYXQ8KHRydW5jc3RvcmVpOCBEMTZMOiR2YWwsIFA6JHB0ciksCisgICAgICAgICAgKFNUT1JFOHAgKElOU0VSVF9TVUJSRUcgKGkzMiAoSU1QTElDSVRfREVGKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkxNiAoQ09QWV9UT19SRUdDTEFTUyBEMTZMOiR2YWwsIEQxNkwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbzE2KSwKKyAgICAgICAgICAgICAgICAgICBQOiRwdHIpPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhYmxlIEMtMTEuIE1vdmUgSW5zdHJ1Y3Rpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIE1PVkU6IEYxPChvdXRzIEFMTDokZHN0KSwgKGlucyBBTEw6JHNyYyksCisgICAgICAgICAgICAgIiRkc3QgPSAkc3JjOyIsCisgICAgICAgICAgICAgW10+OworCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbgorZGVmIE1PVkVjYzogRjE8KG91dHMgRFA6JGRzdCksIChpbnMgRFA6JHNyYzEsIERQOiRzcmMyLCBBbnlDQzokY2MpLAorICAgICAgICAgICAgICAgImlmICRjYyAkZHN0ID0gJHNyYzI7IiwKKyAgICAgICAgICAgICAgIFsoc2V0IERQOiRkc3QsIChzZWxlY3QgQW55Q0M6JGNjLCBEUDokc3JjMiwgRFA6JHNyYzEpKV0+OworCitsZXQgRGVmcyA9IFtBWiwgQU4sIEFDMCwgVl0gaW4geworZGVmIE1PVkV6ZXh0OiBGMTwob3V0cyBEOiRkc3QpLCAoaW5zIEQxNkw6JHNyYyksCisgICAgICAgICAgICAgICAgICIkZHN0ID0gJHNyYyAoeik7IiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgRDokZHN0LCAoemV4dCBEMTZMOiRzcmMpKV0+OworCitkZWYgTU9WRXNleHQ6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgRDE2TDokc3JjKSwKKyAgICAgICAgICAgICAgICAgIiRkc3QgPSAkc3JjICh4KTsiLAorICAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChzZXh0IEQxNkw6JHNyYykpXT47CisKK2RlZiBNT1ZFemV4dDg6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgRDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICIkZHN0ID0gJHNyYy5iICh6KTsiLAorICAgICAgICAgICAgICAgICAgWyhzZXQgRDokZHN0LCAoYW5kIEQ6JHNyYywgMHhmZikpXT47CisKK2RlZiBNT1ZFc2V4dDg6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgRDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICIkZHN0ID0gJHNyYy5iICh4KTsiLAorICAgICAgICAgICAgICAgICAgWyhzZXQgRDokZHN0LCAoc2V4dF9pbnJlZyBEOiRzcmMsIGk4KSldPjsKKworfQorCitkZWYgOiBQYXQ8KHNleHRfaW5yZWcgRDE2TDokc3JjLCBpOCksCisgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChNT1ZFc2V4dDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlNFUlRfU1VCUkVHIChpMzIgKElNUExJQ0lUX0RFRikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDE2TDokc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG8xNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbzE2KT47CisKK2RlZiA6IFBhdDwoc2V4dF9pbnJlZyBEOiRzcmMsIGkxNiksCisgICAgICAgICAgKE1PVkVzZXh0IChFWFRSQUNUX1NVQlJFRyBEOiRzcmMsIGxvMTYpKT47CisKK2RlZiA6IFBhdDwoYW5kIEQ6JHNyYywgMHhmZmZmKSwKKyAgICAgICAgICAoTU9WRXpleHQgKEVYVFJBQ1RfU1VCUkVHIEQ6JHNyYywgbG8xNikpPjsKKworZGVmIDogUGF0PChpMzIgKGFueWV4dCBEMTZMOiRzcmMpKSwKKyAgICAgICAgICAoSU5TRVJUX1NVQlJFRyAoaTMyIChJTVBMSUNJVF9ERUYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaTE2IChDT1BZX1RPX1JFR0NMQVNTIEQxNkw6JHNyYywgRDE2TCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvMTYpPjsKKworLy8gVE9ETyBEcmVnID0gRHJlZ19ieXRlIChYL1opCisKKy8vIFRPRE8gQWNjdW11bGF0b3IgbW92ZXMKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhYmxlIEMtMTIuIFN0YWNrIENvbnRyb2wgSW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgVXNlcyA9IFtTUF0sIERlZnMgPSBbU1BdIGluIHsKK2RlZiBQVVNIOiBGMTwob3V0cyksIChpbnMgQUxMOiRzcmMpLAorICAgICAgICAgICAgICJbLS1zcF0gPSAkc3JjOyIsIFtdPiB7IGxldCBtYXlTdG9yZSA9IDE7IH0KKworLy8gTk9URTogUE9QIGRvZXMgbm90IHdvcmsgZm9yIERQIHJlZ3MsIHVzZSBMT0FEIGluc3RlYWQKK2RlZiBQT1A6ICBGMTwob3V0cyBBTEw6JGRzdCksIChpbnMpLAorICAgICAgICAgICAgICIkZHN0ID0gW3NwKytdOyIsIFtdPiB7IGxldCBtYXlMb2FkID0gMTsgfQorfQorCisvLyBUT0RPOiBwdXNoL3BvcCBtdWx0aXBsZQorCitkZWYgTElOSzogRjI8KG91dHMpLCAoaW5zIGkzMmltbTokYW1vdW50KSwKKyAgICAgICAgICAgICAibGluayAkYW1vdW50OyIsIFtdPjsKKworZGVmIFVOTElOSzogRjI8KG91dHMpLCAoaW5zKSwKKyAgICAgICAgICAgICAgICJ1bmxpbms7IiwgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGFibGUgQy0xMy4gQ29udHJvbCBDb2RlIEJpdCBNYW5hZ2VtZW50IEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbXVsdGljbGFzcyBTRVRDQzxQYXRGcmFnIG9wbm9kZSwgUGF0RnJhZyBpbnZub2RlLCBzdHJpbmcgY29uZCwgc3RyaW5nIHN1Zj0iOyI+IHsKKyAgZGVmIGRkIDogRjE8KG91dHMgSnVzdENDOiRjYyksIChpbnMgRDokYSwgRDokYiksCisgICAgICAgICAgICAgICFzdHJjb25jYXQoIXN1YnN0KCJYWCIsIGNvbmQsICJjYyA9ICRhIFhYICRiIiksIHN1ZiksCisgICAgICAgICAgICAgIFsoc2V0IEp1c3RDQzokY2MsIChvcG5vZGUgIEQ6JGEsIEQ6JGIpKV0+OworCisgIGRlZiByaSA6IEYxPChvdXRzIEp1c3RDQzokY2MpLCAoaW5zIERQOiRhLCBpMzJpbW06JGIpLAorICAgICAgICAgICAgICAhc3RyY29uY2F0KCFzdWJzdCgiWFgiLCBjb25kLCAiY2MgPSAkYSBYWCAkYiIpLCBzdWYpLAorICAgICAgICAgICAgICBbKHNldCBKdXN0Q0M6JGNjLCAob3Bub2RlICBEUDokYSwgaW1tMzokYikpXT47CisKKyAgZGVmIHBwIDogRjE8KG91dHMgSnVzdENDOiRjYyksIChpbnMgUDokYSwgUDokYiksCisgICAgICAgICAgICAgICFzdHJjb25jYXQoIXN1YnN0KCJYWCIsIGNvbmQsICJjYyA9ICRhIFhYICRiIiksIHN1ZiksCisgICAgICAgICAgICAgIFtdPjsKKworICBkZWYgcmlfbm90IDogRjE8KG91dHMgTm90Q0M6JGNjKSwgKGlucyBEUDokYSwgaTMyaW1tOiRiKSwKKyAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoIXN1YnN0KCJYWCIsIGNvbmQsICJjYyA9ICRhIFhYICRiIiksIHN1ZiksCisgICAgICAgICAgICAgICAgICBbKHNldCBOb3RDQzokY2MsIChpbnZub2RlICBEUDokYSwgaW1tMzokYikpXT47Cit9CisKK2RlZm0gU0VURVEgIDogU0VUQ0M8c2V0ZXEsICBzZXRuZSwgICI9PSI+OworZGVmbSBTRVRMVCAgOiBTRVRDQzxzZXRsdCwgIHNldGdlLCAgIjwiPjsKK2RlZm0gU0VUTEUgIDogU0VUQ0M8c2V0bGUsICBzZXRndCwgICI8PSI+OworZGVmbSBTRVRVTFQgOiBTRVRDQzxzZXR1bHQsIHNldHVnZSwgIjwiLCAgIiAoaXUpOyI+OworZGVmbSBTRVRVTEUgOiBTRVRDQzxzZXR1bGUsIHNldHVndCwgIjw9IiwgIiAoaXUpOyI+OworCitkZWYgU0VUTkVkZCA6IEYxPChvdXRzIE5vdENDOiRjYyksIChpbnMgRDokYSwgRDokYiksCisgICAgICAgICAgICAgICAgICJjYyA9ICRhID09ICRiOyIsCisgICAgICAgICAgICAgICAgIFsoc2V0IE5vdENDOiRjYywgKHNldG5lICBEOiRhLCBEOiRiKSldPjsKKworZGVmIDogUGF0PChzZXRndCAgRDokYSwgRDokYiksIChTRVRMVGRkICBEOiRiLCBEOiRhKT47CitkZWYgOiBQYXQ8KHNldGdlICBEOiRhLCBEOiRiKSwgKFNFVExFZGQgIEQ6JGIsIEQ6JGEpPjsKK2RlZiA6IFBhdDwoc2V0dWd0IEQ6JGEsIEQ6JGIpLCAoU0VUVUxUZGQgRDokYiwgRDokYSk+OworZGVmIDogUGF0PChzZXR1Z2UgRDokYSwgRDokYiksIChTRVRVTEVkZCBEOiRiLCBEOiRhKT47CisKKy8vIFRPRE86IGNvbXBhcmUgcG9pbnRlciBmb3IgUC1QIGNvbXBhcmlzb25zCisvLyBUT0RPOiBjb21wYXJlIGFjY3VtdWxhdG9yCisKK2xldCBEZWZzID0gW0FDMF0gaW4KK2RlZiBPUl9hYzBfY2MgOiBGMTwob3V0cyksIChpbnMgSnVzdENDOiRjYyksCisgICAgICAgICAgICAgICAgICAgImFjMCBcXHw9IGNjOyIsIFtdPjsKKworbGV0IFVzZXMgPSBbQUMwXSBpbgorZGVmIE1PVkVfY2NfYWMwIDogRjE8KG91dHMgSnVzdENDOiRjYyksIChpbnMpLAorICAgICAgICAgICAgICAgICAgICJjYyA9IGFjMDsiLCBbXT47CisKK2RlZiBNT1ZFX2NjbmNjIDogRjE8KG91dHMgSnVzdENDOiRjYyksIChpbnMgTm90Q0M6JHNiKSwKKyAgICAgICAgICAgICAgICAgICAgImNjID0gIWNjOyIsIFtdPjsKKworZGVmIE1PVkVfbmNjY2MgOiBGMTwob3V0cyBOb3RDQzokY2MpLCAoaW5zIEp1c3RDQzokc2IpLAorICAgICAgICAgICAgICAgICAgICAiY2MgPSAhY2M7IiwgW10+OworCitkZWYgTU9WRUNDX3pleHQgOiBGMTwob3V0cyBEOiRkc3QpLCAoaW5zIEp1c3RDQzokY2MpLAorICAgICAgICAgICAgICAgICAgICAgICIkZHN0ID0gJGNjOyIsIFtdPjsKKworZGVmIE1PVkVOQ0NfeiA6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgTm90Q0M6JGNjKSwKKyAgICAgICAgICAgICAgICAgICAiJGRzdCA9IGNjOyIsIFtdPjsKKworZGVmIE1PVkVDQ19ueiA6IEYxPChvdXRzIEFueUNDOiRjYyksIChpbnMgRDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAiY2MgPSAkc3JjOyIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgQW55Q0M6JGNjLCAoc2V0bmUgRDokc3JjLCAwKSldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhYmxlIEMtMTQuIExvZ2ljYWwgT3BlcmF0aW9ucyBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiBBTkQ6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgRDokc3JjMSwgRDokc3JjMiksCisgICAgICAgICAgICAiJGRzdCA9ICRzcmMxICYgJHNyYzI7IiwKKyAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwgKGFuZCBEOiRzcmMxLCBEOiRzcmMyKSldPjsKKworZGVmIE5PVDogRjE8KG91dHMgRDokZHN0KSwgKGlucyBEOiRzcmMpLAorICAgICAgICAgICAgIiRkc3QgPSB+JHNyYzsiLAorICAgICAgICAgICAgWyhzZXQgRDokZHN0LCAobm90IEQ6JHNyYykpXT47CisKK2RlZiBPUjogRjE8KG91dHMgRDokZHN0KSwgKGlucyBEOiRzcmMxLCBEOiRzcmMyKSwKKyAgICAgICAgICAgIiRkc3QgPSAkc3JjMSBcXHwgJHNyYzI7IiwKKyAgICAgICAgICAgWyhzZXQgRDokZHN0LCAob3IgRDokc3JjMSwgRDokc3JjMikpXT47CisKK2RlZiBYT1I6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgRDokc3JjMSwgRDokc3JjMiksCisgICAgICAgICAgICAiJGRzdCA9ICRzcmMxIF4gJHNyYzI7IiwKKyAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwgKHhvciBEOiRzcmMxLCBEOiRzcmMyKSldPjsKKworLy8gbWlzc2luZzogQlhPUiwgQlhPUlNISUZUCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYWJsZSBDLTE1LiBCaXQgT3BlcmF0aW9ucyBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsKK2RlZiBCSVRDTFI6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgRDokc3JjMSwgdWltbTVpbWFzazokc3JjMiksCisgICAgICAgICAgICAgICJiaXRjbHIoJGRzdCwgJHNyYzIpOyIsCisgICAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwgKGFuZCBEOiRzcmMxLCB1aW1tNWltYXNrOiRzcmMyKSldPjsKKworZGVmIEJJVFNFVDogRjE8KG91dHMgRDokZHN0KSwgKGlucyBEOiRzcmMxLCB1aW1tNW1hc2s6JHNyYzIpLAorICAgICAgICAgICAgICAiYml0c2V0KCRkc3QsICRzcmMyKTsiLAorICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChvciBEOiRzcmMxLCB1aW1tNW1hc2s6JHNyYzIpKV0+OworCitkZWYgQklUVEdMOiBGMTwob3V0cyBEOiRkc3QpLCAoaW5zIEQ6JHNyYzEsIHVpbW01bWFzazokc3JjMiksCisgICAgICAgICAgICAgICJiaXR0Z2woJGRzdCwgJHNyYzIpOyIsCisgICAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwgKHhvciBEOiRzcmMxLCB1aW1tNW1hc2s6JHNyYzIpKV0+OworfQorCitkZWYgQklUVFNUOiBGMTwob3V0cyBKdXN0Q0M6JGNjKSwgKGlucyBEOiRzcmMxLCB1aW1tNW1hc2s6JHNyYzIpLAorICAgICAgICAgICAgICAiY2MgPSBiaXR0c3QoJHNyYzEsICRzcmMyKTsiLAorICAgICAgICAgICAgICBbKHNldCBKdXN0Q0M6JGNjLCAoc2V0bmUgKGFuZCBEOiRzcmMxLCB1aW1tNW1hc2s6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMiAwKSkpXT47CisKK2RlZiBOQklUVFNUOiBGMTwob3V0cyBKdXN0Q0M6JGNjKSwgKGlucyBEOiRzcmMxLCB1aW1tNW1hc2s6JHNyYzIpLAorICAgICAgICAgICAgICAgImNjID0gIWJpdHRzdCgkc3JjMSwgJHNyYzIpOyIsCisgICAgICAgICAgICAgICBbKHNldCBKdXN0Q0M6JGNjLCAoc2V0ZXEgKGFuZCBEOiRzcmMxLCB1aW1tNW1hc2s6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIgMCkpKV0+OworCisvLyBUT0RPOiBERVBPU0lULCBFWFRSQUNULCBCSVRNVVgKKworZGVmIE9ORVM6IEYyPChvdXRzIEQxNkw6JGRzdCksIChpbnMgRDokc3JjKSwKKyAgICAgICAgICAgICAgIiRkc3QgPSBvbmVzICRzcmM7IiwKKyAgICAgICAgICAgICAgWyhzZXQgRDE2TDokZHN0LCAodHJ1bmMgKGN0cG9wIEQ6JHNyYykpKV0+OworCitkZWYgOiBQYXQ8KGN0cG9wIEQ6JHNyYyksIChNT1ZFemV4dCAoT05FUyBEOiRzcmMpKT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYWJsZSBDLTE2LiBTaGlmdCAvIFJvdGF0ZSBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK211bHRpY2xhc3MgU0hJRlQzMjxTRE5vZGUgb3Bub2RlLCBzdHJpbmcgb3BzPiB7CisgIGRlZiBpIDogRjE8KG91dHMgRDokZHN0KSwgKGlucyBEOiRzcmMsIGkxNmltbTokYW1vdW50KSwKKyAgICAgICAgICAgICAhc3Vic3QoIlhYIiwgb3BzLCAiJGRzdCBYWD0gJGFtb3VudDsiKSwKKyAgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChvcG5vZGUgRDokc3JjLCAoaTE2IHVpbW01OiRhbW91bnQpKSldPjsKKyAgZGVmIHIgOiBGMTwob3V0cyBEOiRkc3QpLCAoaW5zIEQ6JHNyYywgRDokYW1vdW50KSwKKyAgICAgICAgICAgICAhc3Vic3QoIlhYIiwgb3BzLCAiJGRzdCBYWD0gJGFtb3VudDsiKSwKKyAgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChvcG5vZGUgRDokc3JjLCBEOiRhbW91bnQpKV0+OworfQorCitsZXQgRGVmcyA9IFtBWiwgQU4sIFYsIFZTXSwKKyAgICBDb25zdHJhaW50cyA9ICIkc3JjID0gJGRzdCIgaW4geworZGVmbSBTUkEgOiBTSElGVDMyPHNyYSwgIj4+PiI+OworZGVmbSBTUkwgOiBTSElGVDMyPHNybCwgIj4+Ij47CitkZWZtIFNMTCA6IFNISUZUMzI8c2hsLCAiPDwiPjsKK30KKworLy8gVE9ETzogYXV0b21hdGljIHN3aXRjaGluZyBiZXR3ZWVuIDItYWRkciBhbmQgMy1hZGRyICg/KQorCitsZXQgRGVmcyA9IFtBWiwgQU4sIFYsIFZTXSBpbiB7CitkZWYgU0xMcjE2OiBGMjwob3V0cyBEOiRkc3QpLCAoaW5zIEQ6JHNyYywgRDE2TDokYW1vdW50KSwKKyAgICAgICAgICAgICAiJGRzdCA9IGxzaGlmdCAkc3JjIGJ5ICRhbW91bnQ7IiwKKyAgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChzaGwgRDokc3JjLCBEMTZMOiRhbW91bnQpKV0+OworCisvLyBBcml0aG1ldGljIGxlZnQtc2hpZnQgPSBzYXR1cmluZyBvdmVyZmxvdy4KK2RlZiBTTEFyMTY6IEYyPChvdXRzIEQ6JGRzdCksIChpbnMgRDokc3JjLCBEMTZMOiRhbW91bnQpLAorICAgICAgICAgICAgICIkZHN0ID0gYXNoaWZ0ICRzcmMgYnkgJGFtb3VudDsiLAorICAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwgKHNyYSBEOiRzcmMsIChpbmVnIEQxNkw6JGFtb3VudCkpKV0+OworCitkZWYgU1JBMTZpOiBGMTwob3V0cyBEMTY6JGRzdCksIChpbnMgRDE2OiRzcmMsIGkxNmltbTokYW1vdW50KSwKKyAgICAgICAgICAgICAgIiRkc3QgPSAkc3JjID4+PiAkYW1vdW50OyIsCisgICAgICAgICAgICAgIFsoc2V0IEQxNjokZHN0LCAoc3JhIEQxNjokc3JjLCAoaTE2IHVpbW00OiRhbW91bnQpKSldPjsKKworZGVmIFNSTDE2aTogRjE8KG91dHMgRDE2OiRkc3QpLCAoaW5zIEQxNjokc3JjLCBpMTZpbW06JGFtb3VudCksCisgICAgICAgICAgICAgICIkZHN0ID0gJHNyYyA+PiAkYW1vdW50OyIsCisgICAgICAgICAgICAgIFsoc2V0IEQxNjokZHN0LCAoc3JsIEQxNjokc3JjLCAoaTE2IHVpbW00OiRhbW91bnQpKSldPjsKKworLy8gQXJpdGhtZXRpYyBsZWZ0LXNoaWZ0ID0gc2F0dXJpbmcgb3ZlcmZsb3cuCitkZWYgU0xBMTZyOiBGMTwob3V0cyBEMTY6JGRzdCksIChpbnMgRDE2OiRzcmMsIEQxNkw6JGFtb3VudCksCisgICAgICAgICAgICAgICIkZHN0ID0gYXNoaWZ0ICRzcmMgQlkgJGFtb3VudDsiLAorICAgICAgICAgICAgICBbKHNldCBEMTY6JGRzdCwgKHNybCBEMTY6JHNyYywgKGluZWcgRDE2TDokYW1vdW50KSkpXT47CisKK2RlZiBTTEwxNmk6IEYxPChvdXRzIEQxNjokZHN0KSwgKGlucyBEMTY6JHNyYywgaTE2aW1tOiRhbW91bnQpLAorICAgICAgICAgICAgICAiJGRzdCA9ICRzcmMgPDwgJGFtb3VudDsiLAorICAgICAgICAgICAgICBbKHNldCBEMTY6JGRzdCwgKHNobCBEMTY6JHNyYywgKGkxNiB1aW1tNDokYW1vdW50KSkpXT47CisKK2RlZiBTTEwxNnI6IEYxPChvdXRzIEQxNjokZHN0KSwgKGlucyBEMTY6JHNyYywgRDE2TDokYW1vdW50KSwKKyAgICAgICAgICAgICAgIiRkc3QgPSBsc2hpZnQgJHNyYyBieSAkYW1vdW50OyIsCisgICAgICAgICAgICAgIFsoc2V0IEQxNjokZHN0LCAoc2hsIEQxNjokc3JjLCBEMTZMOiRhbW91bnQpKV0+OworCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYWJsZSBDLTE3LiBBcml0aG1ldGljIE9wZXJhdGlvbnMgSW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUT0RPOiBBQlMKKworbGV0IERlZnMgPSBbQVosIEFOLCBBQzAsIFYsIFZTXSBpbiB7CisKK2RlZiBBREQ6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgRDokc3JjMSwgRDokc3JjMiksCisgICAgICAgICAgICAiJGRzdCA9ICRzcmMxICsgJHNyYzI7IiwKKyAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwgKGFkZCBEOiRzcmMxLCBEOiRzcmMyKSldPjsKKworZGVmIEFERDE2OiBGMjwob3V0cyBEMTY6JGRzdCksIChpbnMgRDE2OiRzcmMxLCBEMTY6JHNyYzIpLAorICAgICAgICAgICAgICAiJGRzdCA9ICRzcmMxICsgJHNyYzI7IiwKKyAgICAgICAgICAgICAgWyhzZXQgRDE2OiRkc3QsIChhZGQgRDE2OiRzcmMxLCBEMTY6JHNyYzIpKV0+OworCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbgorZGVmIEFERGltbTc6IEYxPChvdXRzIEQ6JGRzdCksIChpbnMgRDokc3JjMSwgaTMyaW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAiJGRzdCArPSAkc3JjMjsiLAorICAgICAgICAgICAgICAgIFsoc2V0IEQ6JGRzdCwgKGFkZCBEOiRzcmMxLCBpbW03OiRzcmMyKSldPjsKKworZGVmIFNVQjogRjE8KG91dHMgRDokZHN0KSwgKGlucyBEOiRzcmMxLCBEOiRzcmMyKSwKKyAgICAgICAgICAgICIkZHN0ID0gJHNyYzEgLSAkc3JjMjsiLAorICAgICAgICAgICAgWyhzZXQgRDokZHN0LCAoc3ViIEQ6JHNyYzEsIEQ6JHNyYzIpKV0+OworCitkZWYgU1VCMTY6IEYyPChvdXRzIEQxNjokZHN0KSwgKGlucyBEMTY6JHNyYzEsIEQxNjokc3JjMiksCisgICAgICAgICAgICAgICIkZHN0ID0gJHNyYzEgLSAkc3JjMjsiLAorICAgICAgICAgICAgICBbKHNldCBEMTY6JGRzdCwgKHN1YiBEMTY6JHNyYzEsIEQxNjokc3JjMikpXT47CisKK30KKworZGVmIDogUGF0PChhZGRjIEQ6JHNyYzEsIEQ6JHNyYzIpLCAoQUREIEQ6JHNyYzEsIEQ6JHNyYzIpPjsKK2RlZiA6IFBhdDwoc3ViYyBEOiRzcmMxLCBEOiRzcmMyKSwgKFNVQiBEOiRzcmMxLCBEOiRzcmMyKT47CisKK2xldCBEZWZzID0gW0FaLCBBTiwgViwgVlNdIGluCitkZWYgTkVHOiBGMTwob3V0cyBEOiRkc3QpLCAoaW5zIEQ6JHNyYyksCisgICAgICAgICAgICAiJGRzdCA9IC0kc3JjOyIsCisgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChpbmVnIEQ6JHNyYykpXT47CisKKy8vIE5vIHBhdHRlcm4sIGl0IHdvdWxkIGNvbmZ1c2UgaXNlbCB0byBoYXZlIHR3byBpMzIgPSBpMzIraTMyIHBhdHRlcm5zCitkZWYgQUREcHA6IEYxPChvdXRzIFA6JGRzdCksIChpbnMgUDokc3JjMSwgUDokc3JjMiksCisgICAgICAgICAgICAgICIkZHN0ID0gJHNyYzEgKyAkc3JjMjsiLCBbXT47CisKK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluCitkZWYgQUREcHBfaW1tNzogRjE8KG91dHMgUDokZHN0KSwgKGlucyBQOiRzcmMxLCBpMzJpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICIkZHN0ICs9ICRzcmMyOyIsIFtdPjsKKworbGV0IERlZnMgPSBbQVosIEFOLCBWXSBpbgorZGVmIEFERF9STkQyMDogRjI8KG91dHMgRDE2OiRkc3QpLCAoaW5zIEQ6JHNyYzEsIEQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgIiRkc3QgPSAkc3JjMSArICRzcmMyIChybmQyMCk7IiwgW10+OworCitsZXQgRGVmcyA9IFtWLCBWU10gaW4geworZGVmIE1VTDE2OiBGMjwob3V0cyBEMTY6JGRzdCksIChpbnMgRDE2OiRzcmMxLCBEMTY6JHNyYzIpLAorICAgICAgICAgICAgICAiJGRzdCA9ICRzcmMxICogJHNyYzIgKGlzKTsiLAorICAgICAgICAgICAgICBbKHNldCBEMTY6JGRzdCwgKG11bCBEMTY6JHNyYzEsIEQxNjokc3JjMikpXT47CisKK2RlZiBNVUxIUzE2OiBGMjwob3V0cyBEMTY6JGRzdCksIChpbnMgRDE2OiRzcmMxLCBEMTY6JHNyYzIpLAorICAgICAgICAgICAgICAgICIkZHN0ID0gJHNyYzEgKiAkc3JjMiAoaWgpOyIsCisgICAgICAgICAgICAgICAgWyhzZXQgRDE2OiRkc3QsIChtdWxocyBEMTY6JHNyYzEsIEQxNjokc3JjMikpXT47CisKK2RlZiBNVUxoaDMyczogRjI8KG91dHMgRDokZHN0KSwgKGlucyBEMTY6JHNyYzEsIEQxNjokc3JjMiksCisgICAgICAgICAgICAgICAgIiRkc3QgPSAkc3JjMSAqICRzcmMyIChpcyk7IiwKKyAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChtdWwgKHNleHQgRDE2OiRzcmMxKSwgKHNleHQgRDE2OiRzcmMyKSkpXT47CisKK2RlZiBNVUxoaDMydTogRjI8KG91dHMgRDokZHN0KSwgKGlucyBEMTY6JHNyYzEsIEQxNjokc3JjMiksCisgICAgICAgICAgICAgICAgIiRkc3QgPSAkc3JjMSAqICRzcmMyIChpcyk7IiwKKyAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChtdWwgKHpleHQgRDE2OiRzcmMxKSwgKHpleHQgRDE2OiRzcmMyKSkpXT47Cit9CisKKworbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4KK2RlZiBNVUwzMjogRjE8KG91dHMgRDokZHN0KSwgKGlucyBEOiRzcmMxLCBEOiRzcmMyKSwKKyAgICAgICAgICAgICIkZHN0ICo9ICRzcmMyOyIsCisgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChtdWwgRDokc3JjMSwgRDokc3JjMikpXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYWJsZSBDLTE4LiBFeHRlcm5hbCBFeGVudCBNYW5hZ2VtZW50IEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIElETEUgOiBGMTwob3V0cyksIChpbnMpLCAiaWRsZTsiLCBbKGludF9iZmluX2lkbGUpXT47CitkZWYgQ1NZTkMgOiBGMTwob3V0cyksIChpbnMpLCAiY3N5bmM7IiwgWyhpbnRfYmZpbl9jc3luYyldPjsKK2RlZiBTU1lOQyA6IEYxPChvdXRzKSwgKGlucyksICJzc3luYzsiLCBbKGludF9iZmluX3NzeW5jKV0+OworZGVmIEVNVUVYQ1BUIDogRjE8KG91dHMpLCAoaW5zKSwgImVtdWV4Y3B0OyIsIFtdPjsKK2RlZiBDTEkgOiBGMTwob3V0cyBEOiRtYXNrKSwgKGlucyksICJjbGkgJG1hc2s7IiwgW10+OworZGVmIFNUSSA6IEYxPChvdXRzKSwgKGlucyBEOiRtYXNrKSwgInN0aSAkbWFzazsiLCBbXT47CitkZWYgUkFJU0UgOiBGMTwob3V0cyksIChpbnMgaTMyaW1tOiRpdHIpLCAicmFpc2UgJGl0cjsiLCBbXT47CitkZWYgRVhDUFQgOiBGMTwob3V0cyksIChpbnMgaTMyaW1tOiRleGMpLCAiZXhjcHQgJGV4YzsiLCBbXT47CitkZWYgTk9QIDogRjE8KG91dHMpLCAoaW5zKSwgIm5vcDsiLCBbXT47CitkZWYgTU5PUCA6IEYyPChvdXRzKSwgKGlucyksICJtbm9wOyIsIFtdPjsKK2RlZiBBQk9SVCA6IEYxPChvdXRzKSwgKGlucyksICJhYm9ydDsiLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYWJsZSBDLTE5LiBDYWNoZSBDb250cm9sIEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhYmxlIEMtMjAuIFZpZGVvIFBpeGVsIE9wZXJhdGlvbnMgSW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgQUxJR044IDogRjI8KG91dHMgRDokZHN0KSwgKGlucyBEOiRzcmMxLCBEOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAiJGRzdCA9IGFsaWduOCgkc3JjMSwgJHNyYzIpOyIsCisgICAgICAgICAgICAgICAgWyhzZXQgRDokZHN0LCAob3IgKHNobCBEOiRzcmMxLCAoaTMyIDI0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNybCBEOiRzcmMyLCAoaTMyIDgpKSkpXT47CisKK2RlZiBBTElHTjE2IDogRjI8KG91dHMgRDokZHN0KSwgKGlucyBEOiRzcmMxLCBEOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgIiRkc3QgPSBhbGlnbjE2KCRzcmMxLCAkc3JjMik7IiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgRDokZHN0LCAob3IgKHNobCBEOiRzcmMxLCAoaTMyIDE2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmwgRDokc3JjMiwgKGkzMiAxNikpKSldPjsKKworZGVmIEFMSUdOMjQgOiBGMjwob3V0cyBEOiRkc3QpLCAoaW5zIEQ6JHNyYzEsIEQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAiJGRzdCA9IGFsaWduMTYoJHNyYzEsICRzcmMyKTsiLAorICAgICAgICAgICAgICAgICBbKHNldCBEOiRkc3QsIChvciAoc2hsIEQ6JHNyYzEsIChpMzIgOCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JsIEQ6JHNyYzIsIChpMzIgMjQpKSkpXT47CisKK2RlZiBESVNBTEdORVhDUFQgOiBGMjwob3V0cyksIChpbnMpLCAiZGlzYWxpZ25leGNwdDsiLCBbXT47CisKKy8vIFRPRE86IEJZVEVPUDNQLCBCWVRFT1AxNlAsIEJZVEVPUDFQLCBCWVRFT1AyUCwgQllURU9QMTZNLCBTQUEsCisvLyAgICAgICBCWVRFUEFDSywgQllURVVOUEFDSworCisvLyBUYWJsZSBDLTIxLiBWZWN0b3IgT3BlcmF0aW9ucyBJbnN0cnVjdGlvbnMKKworLy8gUGF0dGVybnMKK2RlZiA6IFBhdDwoQmZpbkNhbGwgKGkzMiB0Z2xvYmFsYWRkcjokZHN0KSksCisgICAgICAgICAgKENBTExhIHRnbG9iYWxhZGRyOiRkc3QpPjsKK2RlZiA6IFBhdDwoQmZpbkNhbGwgKGkzMiB0ZXh0ZXJuYWxzeW06JGRzdCkpLAorICAgICAgICAgIChDQUxMYSB0ZXh0ZXJuYWxzeW06JGRzdCk+OworZGVmIDogUGF0PChpMTYgKHRydW5jIEQ6JHNyYykpLAorICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyAoaTMyIChDT1BZX1RPX1JFR0NMQVNTIEQ6JHNyYywgRCkpLCBsbzE2KT47CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW50cmluc2ljSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW50cmluc2ljSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhOGQzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JbnRyaW5zaWNJbmZvLmNwcApAQCAtMCwwICsxLDEwNCBAQAorLy89PT0tIEJsYWNrZmluSW50cmluc2ljSW5mby5jcHAgLSBJbnRyaW5zaWMgSW5mb3JtYXRpb24gLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEJsYWNrZmluIGltcGxlbWVudGF0aW9uIG9mIFRhcmdldEludHJpbnNpY0luZm8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkJsYWNrZmluSW50cmluc2ljSW5mby5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSBiZmluSW50cmluc2ljIHsKKworICBlbnVtIElEIHsKKyAgICBsYXN0X25vbl9iZmluX2ludHJpbnNpYyA9IEludHJpbnNpYzo6bnVtX2ludHJpbnNpY3MtMSwKKyNkZWZpbmUgR0VUX0lOVFJJTlNJQ19FTlVNX1ZBTFVFUworI2luY2x1ZGUgIkJsYWNrZmluR2VuSW50cmluc2ljcy5pbmMiCisjdW5kZWYgR0VUX0lOVFJJTlNJQ19FTlVNX1ZBTFVFUworICAgICwgbnVtX2JmaW5faW50cmluc2ljcworICB9OworCit9CisKK3N0ZDo6c3RyaW5nIEJsYWNrZmluSW50cmluc2ljSW5mbzo6Z2V0TmFtZSh1bnNpZ25lZCBJbnRySUQsIGNvbnN0IFR5cGUgKipUeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtVHlzKSBjb25zdCB7CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1tdID0geworI2RlZmluZSBHRVRfSU5UUklOU0lDX05BTUVfVEFCTEUKKyNpbmNsdWRlICJCbGFja2ZpbkdlbkludHJpbnNpY3MuaW5jIgorI3VuZGVmIEdFVF9JTlRSSU5TSUNfTkFNRV9UQUJMRQorICB9OworCisgIGFzc2VydCghaXNPdmVybG9hZGVkKEludHJJRCkgJiYgIkJsYWNrZmluIGludHJpbnNpY3MgYXJlIG5vdCBvdmVybG9hZGVkIik7CisgIGlmIChJbnRySUQgPCBJbnRyaW5zaWM6Om51bV9pbnRyaW5zaWNzKQorICAgIHJldHVybiAwOworICBhc3NlcnQoSW50cklEIDwgYmZpbkludHJpbnNpYzo6bnVtX2JmaW5faW50cmluc2ljcyAmJiAiSW52YWxpZCBpbnRyaW5zaWMgSUQiKTsKKworICBzdGQ6OnN0cmluZyBSZXN1bHQobmFtZXNbSW50cklEIC0gSW50cmluc2ljOjpudW1faW50cmluc2ljc10pOworICByZXR1cm4gUmVzdWx0OworfQorCit1bnNpZ25lZAorQmxhY2tmaW5JbnRyaW5zaWNJbmZvOjpsb29rdXBOYW1lKGNvbnN0IGNoYXIgKk5hbWUsIHVuc2lnbmVkIExlbikgY29uc3QgeworICBpZiAoTGVuIDwgNSB8fCBOYW1lWzRdICE9ICcuJyB8fCBOYW1lWzBdICE9ICdsJyB8fCBOYW1lWzFdICE9ICdsJworICAgICAgfHwgTmFtZVsyXSAhPSAndicgfHwgTmFtZVszXSAhPSAnbScpCisgICAgcmV0dXJuIDA7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICdsbHZtLicKKworI2RlZmluZSBHRVRfRlVOQ1RJT05fUkVDT0dOSVpFUgorI2luY2x1ZGUgIkJsYWNrZmluR2VuSW50cmluc2ljcy5pbmMiCisjdW5kZWYgR0VUX0ZVTkNUSU9OX1JFQ09HTklaRVIKKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgQmxhY2tmaW5JbnRyaW5zaWNJbmZvOjppc092ZXJsb2FkZWQodW5zaWduZWQgSW50cklEKSBjb25zdCB7CisgIC8vIE92ZXJsb2FkIFRhYmxlCisgIGNvbnN0IGJvb2wgT1RhYmxlW10gPSB7CisjZGVmaW5lIEdFVF9JTlRSSU5TSUNfT1ZFUkxPQURfVEFCTEUKKyNpbmNsdWRlICJCbGFja2ZpbkdlbkludHJpbnNpY3MuaW5jIgorI3VuZGVmIEdFVF9JTlRSSU5TSUNfT1ZFUkxPQURfVEFCTEUKKyAgfTsKKyAgaWYgKEludHJJRCA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgZWxzZQorICAgIHJldHVybiBPVGFibGVbSW50cklEIC0gSW50cmluc2ljOjpudW1faW50cmluc2ljc107Cit9CisKKy8vLyBUaGlzIGRlZmluZXMgdGhlICJnZXRBdHRyaWJ1dGVzKElEIGlkKSIgbWV0aG9kLgorI2RlZmluZSBHRVRfSU5UUklOU0lDX0FUVFJJQlVURVMKKyNpbmNsdWRlICJCbGFja2ZpbkdlbkludHJpbnNpY3MuaW5jIgorI3VuZGVmIEdFVF9JTlRSSU5TSUNfQVRUUklCVVRFUworCitzdGF0aWMgY29uc3QgRnVuY3Rpb25UeXBlICpnZXRUeXBlKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBpZCkgeworICBjb25zdCBUeXBlICpSZXN1bHRUeSA9IE5VTEw7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBBcmdUeXM7CisgIGJvb2wgSXNWYXJBcmcgPSBmYWxzZTsKKyAgCisjZGVmaW5lIEdFVF9JTlRSSU5TSUNfR0VORVJBVE9SCisjaW5jbHVkZSAiQmxhY2tmaW5HZW5JbnRyaW5zaWNzLmluYyIKKyN1bmRlZiBHRVRfSU5UUklOU0lDX0dFTkVSQVRPUgorCisgIHJldHVybiBGdW5jdGlvblR5cGU6OmdldChSZXN1bHRUeSwgQXJnVHlzLCBJc1ZhckFyZyk7IAorfQorCitGdW5jdGlvbiAqQmxhY2tmaW5JbnRyaW5zaWNJbmZvOjpnZXREZWNsYXJhdGlvbihNb2R1bGUgKk0sIHVuc2lnbmVkIEludHJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKipUeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1UeSkgY29uc3QgeworICBhc3NlcnQoIWlzT3ZlcmxvYWRlZChJbnRySUQpICYmICJCbGFja2ZpbiBpbnRyaW5zaWNzIGFyZSBub3Qgb3ZlcmxvYWRlZCIpOworICBBdHRyTGlzdFB0ciBBTGlzdCA9IGdldEF0dHJpYnV0ZXMoKGJmaW5JbnRyaW5zaWM6OklEKSBJbnRySUQpOworICByZXR1cm4gY2FzdDxGdW5jdGlvbj4oTS0+Z2V0T3JJbnNlcnRGdW5jdGlvbihnZXROYW1lKEludHJJRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoTS0+Z2V0Q29udGV4dCgpLCBJbnRySUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTGlzdCkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpbkludHJpbnNpY0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JbnRyaW5zaWNJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0YjVhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JbnRyaW5zaWNJbmZvLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tIEJsYWNrZmluSW50cmluc2ljSW5mby5oIC0gQmxhY2tmaW4gSW50cmluc2ljIEluZm9ybWF0aW9uIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEJsYWNrZmluIGltcGxlbWVudGF0aW9uIG9mIFRhcmdldEludHJpbnNpY0luZm8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgQkxBQ0tGSU5JTlRSSU5TSUNTX0gKKyNkZWZpbmUgQkxBQ0tGSU5JTlRSSU5TSUNTX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEludHJpbnNpY0luZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIEJsYWNrZmluSW50cmluc2ljSW5mbyA6IHB1YmxpYyBUYXJnZXRJbnRyaW5zaWNJbmZvIHsKKyAgcHVibGljOgorICAgIHN0ZDo6c3RyaW5nIGdldE5hbWUodW5zaWduZWQgSW50cklELCBjb25zdCBUeXBlICoqVHlzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bVR5cyA9IDApIGNvbnN0OworICAgIHVuc2lnbmVkIGxvb2t1cE5hbWUoY29uc3QgY2hhciAqTmFtZSwgdW5zaWduZWQgTGVuKSBjb25zdDsKKyAgICBib29sIGlzT3ZlcmxvYWRlZCh1bnNpZ25lZCBJSUQpIGNvbnN0OworICAgIEZ1bmN0aW9uICpnZXREZWNsYXJhdGlvbihNb2R1bGUgKk0sIHVuc2lnbmVkIElELCBjb25zdCBUeXBlICoqVHlzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtVHlzID0gMCkgY29uc3Q7CisgIH07CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW50cmluc2ljcy50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5JbnRyaW5zaWNzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjFiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluSW50cmluc2ljcy50ZApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gQmxhY2tmaW5JbnRyaW5zaWNzLnRkIC0gRGVmaW5lcyBCbGFja2ZpbiBpbnRyaW5zaWNzIC0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgYmxhY2tmaW4tc3BlY2lmaWMgaW50cmluc2ljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgVGFyZ2V0UHJlZml4ID0gImJmaW4iLCBpc1RhcmdldCA9IDEgaW4geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29yZSBzeW5jaHJvbmlzYXRpb24gZXRjLgorLy8KKy8vIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBzaWRlZWZmZWN0cy4gRWFjaCByZXByZXNlbnQgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24sIGJ1dAorLy8gd29ya2Fyb3VuZHMgYXJlIHNvbWV0aW1lcyByZXF1aXJlZCBkZXBlbmRpbmcgb24gdGhlIGNwdS4KKworLy8gRXhlY3V0ZSBjc3luYyBpbnN0cnVjdGlvbiB3aXRoIHdvcmthcm91bmRzCitkZWYgaW50X2JmaW5fY3N5bmMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYmZpbl9jc3luYyI+LAorICAgICAgICBJbnRyaW5zaWM8W10+OworCisvLyBFeGVjdXRlIHNzeW5jIGluc3RydWN0aW9uIHdpdGggd29ya2Fyb3VuZHMKK2RlZiBpbnRfYmZpbl9zc3luYyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9iZmluX3NzeW5jIj4sCisgICAgICAgIEludHJpbnNpYzxbXT47CisKKy8vIEV4ZWN1dGUgaWRsZSBpbnN0cnVjdGlvbiB3aXRoIHdvcmthcm91bmRzCitkZWYgaW50X2JmaW5faWRsZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9iZmluX2lkbGUiPiwKKyAgICAgICAgSW50cmluc2ljPFtdPjsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2Zpbk1DQXNtSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluTUNBc21JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjlkNGEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2Zpbk1DQXNtSW5mby5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy89PT0tLSBCbGFja2Zpbk1DQXNtSW5mby5jcHAgLSBCbGFja2ZpbiBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiB0aGUgQmxhY2tmaW5NQ0FzbUluZm8gcHJvcGVydGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQmxhY2tmaW5NQ0FzbUluZm8uaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK0JsYWNrZmluTUNBc21JbmZvOjpCbGFja2Zpbk1DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCkgeworICBHbG9iYWxQcmVmaXggPSAiXyI7CisgIENvbW1lbnRTdHJpbmcgPSAiLy8iOworICBIYXNTZXREaXJlY3RpdmUgPSBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5NQ0FzbUluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5NQ0FzbUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzcyYWEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2Zpbk1DQXNtSW5mby5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LS0gQmxhY2tmaW5NQ0FzbUluZm8uaCAtIEJsYWNrZmluIGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLSotIEMrKyAtKi0tPT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgQmxhY2tmaW5NQ0FzbUluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBCTEFDS0ZJTlRBUkdFVEFTTUlORk9fSAorI2RlZmluZSBCTEFDS0ZJTlRBUkdFVEFTTUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBUYXJnZXQ7CisKKyAgc3RydWN0IEJsYWNrZmluTUNBc21JbmZvIDogcHVibGljIE1DQXNtSW5mbyB7CisgICAgZXhwbGljaXQgQmxhY2tmaW5NQ0FzbUluZm8oY29uc3QgVGFyZ2V0ICZULCBTdHJpbmdSZWYgVFQpOworICB9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblJlZ2lzdGVySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluUmVnaXN0ZXJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTdhYTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblJlZ2lzdGVySW5mby5jcHAKQEAgLTAsMCArMSw0MzkgQEAKKy8vPT09LSBCbGFja2ZpblJlZ2lzdGVySW5mby5jcHAgLSBCbGFja2ZpbiBSZWdpc3RlciBJbmZvcm1hdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBCbGFja2ZpbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvCisvLyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQmxhY2tmaW4uaCIKKyNpbmNsdWRlICJCbGFja2ZpblJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgIkJsYWNrZmluU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUmVnaXN0ZXJTY2F2ZW5naW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitCbGFja2ZpblJlZ2lzdGVySW5mbzo6QmxhY2tmaW5SZWdpc3RlckluZm8oQmxhY2tmaW5TdWJ0YXJnZXQgJnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpKQorICA6IEJsYWNrZmluR2VuUmVnaXN0ZXJJbmZvKEJGOjpBREpDQUxMU1RBQ0tET1dOLCBCRjo6QURKQ0FMTFNUQUNLVVApLAorICAgIFN1YnRhcmdldChzdCksCisgICAgVElJKHRpaSkge30KKworY29uc3QgdW5zaWduZWQqCitCbGFja2ZpblJlZ2lzdGVySW5mbzo6Z2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0IHsKKyAgdXNpbmcgbmFtZXNwYWNlIEJGOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ2FsbGVlU2F2ZWRSZWdzW10gPSB7CisgICAgRlAsCisgICAgUjQsIFI1LCBSNiwgUjcsCisgICAgUDMsIFA0LCBQNSwKKyAgICAwIH07CisgIHJldHVybiAgQ2FsbGVlU2F2ZWRSZWdzOworfQorCitCaXRWZWN0b3IKK0JsYWNrZmluUmVnaXN0ZXJJbmZvOjpnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICB1c2luZyBuYW1lc3BhY2UgQkY7CisgIEJpdFZlY3RvciBSZXNlcnZlZChnZXROdW1SZWdzKCkpOworICBSZXNlcnZlZC5zZXQoQVopOworICBSZXNlcnZlZC5zZXQoQU4pOworICBSZXNlcnZlZC5zZXQoQVEpOworICBSZXNlcnZlZC5zZXQoQUMwKTsKKyAgUmVzZXJ2ZWQuc2V0KEFDMSk7CisgIFJlc2VydmVkLnNldChBVjApOworICBSZXNlcnZlZC5zZXQoQVYwUyk7CisgIFJlc2VydmVkLnNldChBVjEpOworICBSZXNlcnZlZC5zZXQoQVYxUyk7CisgIFJlc2VydmVkLnNldChWKTsKKyAgUmVzZXJ2ZWQuc2V0KFZTKTsKKyAgUmVzZXJ2ZWQuc2V0KENZQ0xFUykuc2V0KENZQ0xFUzIpOworICBSZXNlcnZlZC5zZXQoTDApOworICBSZXNlcnZlZC5zZXQoTDEpOworICBSZXNlcnZlZC5zZXQoTDIpOworICBSZXNlcnZlZC5zZXQoTDMpOworICBSZXNlcnZlZC5zZXQoU1ApOworICBSZXNlcnZlZC5zZXQoUkVUUyk7CisgIGlmIChoYXNGUChNRikpCisgICAgUmVzZXJ2ZWQuc2V0KEZQKTsKKyAgcmV0dXJuIFJlc2VydmVkOworfQorCisvLyBoYXNGUCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gc2hvdWxkIGhhdmUgYSBkZWRpY2F0ZWQgZnJhbWUKKy8vIHBvaW50ZXIgcmVnaXN0ZXIuICBUaGlzIGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGhhcyB2YXJpYWJsZSBzaXplZCBhbGxvY2FzIG9yCisvLyBpZiBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uIGlzIGRpc2FibGVkLgorYm9vbCBCbGFja2ZpblJlZ2lzdGVySW5mbzo6aGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgcmV0dXJuIERpc2FibGVGcmFtZVBvaW50ZXJFbGltKE1GKSB8fAorICAgIE1GSS0+YWRqdXN0c1N0YWNrKCkgfHwgTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKTsKK30KKworYm9vbCBCbGFja2ZpblJlZ2lzdGVySW5mbzo6CityZXF1aXJlc1JlZ2lzdGVyU2NhdmVuZ2luZyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCisvLyBFbWl0IGluc3RydWN0aW9ucyB0byBhZGQgZGVsdGEgdG8gRC9QIHJlZ2lzdGVyLiBTY3JhdGNoUmVnIG11c3QgYmUgb2YgdGhlCisvLyBzYW1lIGNsYXNzIGFzIFJlZyAoUCkuCit2b2lkIEJsYWNrZmluUmVnaXN0ZXJJbmZvOjphZGp1c3RSZWdpc3RlcihNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNjcmF0Y2hSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpIGNvbnN0IHsKKyAgaWYgKCFkZWx0YSkKKyAgICByZXR1cm47CisgIGlmIChpc0ludDw3PihkZWx0YSkpIHsKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIFRJSS5nZXQoQkY6OkFERHBwX2ltbTcpLCBSZWcpCisgICAgICAuYWRkUmVnKFJlZykgICAgICAgICAgICAgIC8vIE5vIGtpbGwgb24gdHdvLWFkZHIgb3BlcmFuZAorICAgICAgLmFkZEltbShkZWx0YSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gV2UgbXVzdCBsb2FkIGRlbHRhIGludG8gU2NyYXRjaFJlZyBhbmQgYWRkIHRoYXQuCisgIGxvYWRDb25zdGFudChNQkIsIEksIERMLCBTY3JhdGNoUmVnLCBkZWx0YSk7CisgIGlmIChCRjo6UFJlZ0NsYXNzLmNvbnRhaW5zKFJlZykpIHsKKyAgICBhc3NlcnQoQkY6OlBSZWdDbGFzcy5jb250YWlucyhTY3JhdGNoUmVnKSAmJgorICAgICAgICAgICAiU2NyYXRjaFJlZyBtdXN0IGJlIGEgUCByZWdpc3RlciIpOworICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgVElJLmdldChCRjo6QUREcHApLCBSZWcpCisgICAgICAuYWRkUmVnKFJlZywgUmVnU3RhdGU6OktpbGwpCisgICAgICAuYWRkUmVnKFNjcmF0Y2hSZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoQkY6OkRSZWdDbGFzcy5jb250YWlucyhSZWcpICYmICJSZWcgbXVzdCBiZSBhIEQgb3IgUCByZWdpc3RlciIpOworICAgIGFzc2VydChCRjo6RFJlZ0NsYXNzLmNvbnRhaW5zKFNjcmF0Y2hSZWcpICYmCisgICAgICAgICAgICJTY3JhdGNoUmVnIG11c3QgYmUgYSBEIHJlZ2lzdGVyIik7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBUSUkuZ2V0KEJGOjpBREQpLCBSZWcpCisgICAgICAuYWRkUmVnKFJlZywgUmVnU3RhdGU6OktpbGwpCisgICAgICAuYWRkUmVnKFNjcmF0Y2hSZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgfQorfQorCisvLyBFbWl0IGluc3RydWN0aW9ucyB0byBsb2FkIGEgY29uc3RhbnQgaW50byBEL1AgcmVnaXN0ZXIKK3ZvaWQgQmxhY2tmaW5SZWdpc3RlckluZm86OmxvYWRDb25zdGFudChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0IHsKKyAgaWYgKGlzSW50PDc+KHZhbHVlKSkgeworICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgVElJLmdldChCRjo6TE9BRGltbTcpLCBSZWcpLmFkZEltbSh2YWx1ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGlzVUludDwxNj4odmFsdWUpKSB7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBUSUkuZ2V0KEJGOjpMT0FEdWltbTE2KSwgUmVnKS5hZGRJbW0odmFsdWUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChpc0ludDwxNj4odmFsdWUpKSB7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBUSUkuZ2V0KEJGOjpMT0FEaW1tMTYpLCBSZWcpLmFkZEltbSh2YWx1ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gV2UgbXVzdCBzcGxpdCBpbnRvIGhhbHZlcworICBCdWlsZE1JKE1CQiwgSSwgREwsCisgICAgICAgICAgVElJLmdldChCRjo6TE9BRDE2aSksIGdldFN1YlJlZyhSZWcsIEJGOjpoaTE2KSkKKyAgICAuYWRkSW1tKCh2YWx1ZSA+PiAxNikgJiAweGZmZmYpCisgICAgLmFkZFJlZyhSZWcsIFJlZ1N0YXRlOjpJbXBsaWNpdERlZmluZSk7CisgIEJ1aWxkTUkoTUJCLCBJLCBETCwKKyAgICAgICAgICBUSUkuZ2V0KEJGOjpMT0FEMTZpKSwgZ2V0U3ViUmVnKFJlZywgQkY6OmxvMTYpKQorICAgIC5hZGRJbW0odmFsdWUgJiAweGZmZmYpCisgICAgLmFkZFJlZyhSZWcsIFJlZ1N0YXRlOjpJbXBsaWNpdEtpbGwpCisgICAgLmFkZFJlZyhSZWcsIFJlZ1N0YXRlOjpJbXBsaWNpdERlZmluZSk7Cit9CisKK3ZvaWQgQmxhY2tmaW5SZWdpc3RlckluZm86OgorZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgY29uc3QgeworICBpZiAoIWhhc1Jlc2VydmVkQ2FsbEZyYW1lKE1GKSkgeworICAgIGludDY0X3QgQW1vdW50ID0gSS0+Z2V0T3BlcmFuZCgwKS5nZXRJbW0oKTsKKyAgICBpZiAoQW1vdW50ICE9IDApIHsKKyAgICAgIGFzc2VydChBbW91bnQlNCA9PSAwICYmICJVbmFsaWduZWQgY2FsbCBmcmFtZSBzaXplIik7CisgICAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gQkY6OkFESkNBTExTVEFDS0RPV04pIHsKKyAgICAgICAgYWRqdXN0UmVnaXN0ZXIoTUJCLCBJLCBJLT5nZXREZWJ1Z0xvYygpLCBCRjo6U1AsIEJGOjpQMSwgLUFtb3VudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoSS0+Z2V0T3Bjb2RlKCkgPT0gQkY6OkFESkNBTExTVEFDS1VQICYmCisgICAgICAgICAgICAgICAiVW5rbm93biBjYWxsIGZyYW1lIHBzZXVkbyBpbnN0cnVjdGlvbiIpOworICAgICAgICBhZGp1c3RSZWdpc3RlcihNQkIsIEksIEktPmdldERlYnVnTG9jKCksIEJGOjpTUCwgQkY6OlAxLCBBbW91bnQpOworICAgICAgfQorICAgIH0KKyAgfQorICBNQkIuZXJhc2UoSSk7Cit9CisKKy8vLyBmaW5kU2NyYXRjaFJlZ2lzdGVyIC0gRmluZCBhICdmcmVlJyByZWdpc3Rlci4gVHJ5IGZvciBhIGNhbGwtY2xvYmJlcmVkCisvLy8gcmVnaXN0ZXIgZmlyc3QgYW5kIHRoZW4gYSBzcGlsbGVkIGNhbGxlZS1zYXZlZCByZWdpc3RlciBpZiB0aGF0IGZhaWxzLgorc3RhdGljIHVuc2lnbmVkIGZpbmRTY3JhdGNoUmVnaXN0ZXIoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqKSB7CisgIGFzc2VydChSUyAmJiAiUmVnaXN0ZXIgc2NhdmVuZ2luZyBtdXN0IGJlIG9uIik7CisgIHVuc2lnbmVkIFJlZyA9IFJTLT5GaW5kVW51c2VkUmVnKFJDKTsKKyAgaWYgKFJlZyA9PSAwKQorICAgIFJlZyA9IFJTLT5zY2F2ZW5nZVJlZ2lzdGVyKFJDLCBJSSwgU1BBZGopOworICByZXR1cm4gUmVnOworfQorCit1bnNpZ25lZAorQmxhY2tmaW5SZWdpc3RlckluZm86OmVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3QgeworICBNYWNoaW5lSW5zdHIgJk1JID0gKklJOworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1JLmdldFBhcmVudCgpOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgRGVidWdMb2MgREwgPSBNSS5nZXREZWJ1Z0xvYygpOworCisgIHVuc2lnbmVkIEZJUG9zOworICBmb3IgKEZJUG9zPTA7ICFNSS5nZXRPcGVyYW5kKEZJUG9zKS5pc0ZJKCk7ICsrRklQb3MpIHsKKyAgICBhc3NlcnQoRklQb3MgPCBNSS5nZXROdW1PcGVyYW5kcygpICYmCisgICAgICAgICAgICJJbnN0ciBkb2Vzbid0IGhhdmUgRnJhbWVJbmRleCBvcGVyYW5kISIpOworICB9CisgIGludCBGcmFtZUluZGV4ID0gTUkuZ2V0T3BlcmFuZChGSVBvcykuZ2V0SW5kZXgoKTsKKyAgYXNzZXJ0KEZJUG9zKzEgPCBNSS5nZXROdW1PcGVyYW5kcygpICYmIE1JLmdldE9wZXJhbmQoRklQb3MrMSkuaXNJbW0oKSk7CisgIGludCBPZmZzZXQgPSBNRi5nZXRGcmFtZUluZm8oKS0+Z2V0T2JqZWN0T2Zmc2V0KEZyYW1lSW5kZXgpCisgICAgKyBNSS5nZXRPcGVyYW5kKEZJUG9zKzEpLmdldEltbSgpOworICB1bnNpZ25lZCBCYXNlUmVnID0gQkY6OkZQOworICBpZiAoaGFzRlAoTUYpKSB7CisgICAgYXNzZXJ0KFNQQWRqPT0wICYmICJVbmV4cGVjdGVkIFNQIGFkanVzdCBpbiBmdW5jdGlvbiB3aXRoIGZyYW1lIHBvaW50ZXIiKTsKKyAgfSBlbHNlIHsKKyAgICBCYXNlUmVnID0gQkY6OlNQOworICAgIE9mZnNldCArPSBNRi5nZXRGcmFtZUluZm8oKS0+Z2V0U3RhY2tTaXplKCkgKyBTUEFkajsKKyAgfQorCisgIGJvb2wgaXNTdG9yZSA9IGZhbHNlOworCisgIHN3aXRjaCAoTUkuZ2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBCRjo6U1RPUkUzMmZpOgorICAgIGlzU3RvcmUgPSB0cnVlOworICBjYXNlIEJGOjpMT0FEMzJmaTogeworICAgIGFzc2VydChPZmZzZXQlNCA9PSAwICYmICJVbmFsaWduZWQgaTMyIHN0YWNrIGFjY2VzcyIpOworICAgIGFzc2VydChGSVBvcz09MSAmJiAiQmFkIGZyYW1lIGluZGV4IG9wZXJhbmQiKTsKKyAgICBNSS5nZXRPcGVyYW5kKEZJUG9zKS5DaGFuZ2VUb1JlZ2lzdGVyKEJhc2VSZWcsIGZhbHNlKTsKKyAgICBNSS5nZXRPcGVyYW5kKEZJUG9zKzEpLnNldEltbShPZmZzZXQpOworICAgIGlmIChpc1VJbnQ8Nj4oT2Zmc2V0KSkgeworICAgICAgTUkuc2V0RGVzYyhUSUkuZ2V0KGlzU3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEJGOjpTVE9SRTMycF91aW1tNm00CisgICAgICAgICAgICAgICAgICAgICAgICAgOiBCRjo6TE9BRDMycF91aW1tNm00KSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKEJhc2VSZWcgPT0gQkY6OkZQICYmIGlzVUludDw3PigtT2Zmc2V0KSkgeworICAgICAgTUkuc2V0RGVzYyhUSUkuZ2V0KGlzU3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEJGOjpTVE9SRTMyZnBfbmltbTdtNAorICAgICAgICAgICAgICAgICAgICAgICAgIDogQkY6OkxPQUQzMmZwX25pbW03bTQpKTsKKyAgICAgIE1JLmdldE9wZXJhbmQoRklQb3MrMSkuc2V0SW1tKC1PZmZzZXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChpc0ludDwxOD4oT2Zmc2V0KSkgeworICAgICAgTUkuc2V0RGVzYyhUSUkuZ2V0KGlzU3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEJGOjpTVE9SRTMycF9pbW0xOG00CisgICAgICAgICAgICAgICAgICAgICAgICAgOiBCRjo6TE9BRDMycF9pbW0xOG00KSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gVXNlIFJlZ1NjYXZlbmdlciB0byBjYWxjdWxhdGUgcHJvcGVyIG9mZnNldC4uLgorICAgIE1JLmR1bXAoKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJTdGFjayBmcmFtZSBvZmZzZXQgdG9vIGJpZyIpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQkY6OkFERHBwOiB7CisgICAgYXNzZXJ0KE1JLmdldE9wZXJhbmQoMCkuaXNSZWcoKSAmJiAiQUREIGluc3RydWN0aW9uIG5lZWRzIGEgcmVnaXN0ZXIiKTsKKyAgICB1bnNpZ25lZCBEZXN0UmVnID0gTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAvLyBXZSBuZWVkIHRvIHByb2R1Y2UgYSBzdGFjayBvZmZzZXQgaW4gYSBQIHJlZ2lzdGVyLiBXZSBlbWl0OgorICAgIC8vIFAwID0gb2Zmc2V0OworICAgIC8vIFAwID0gQlIgKyBQMDsKKyAgICBhc3NlcnQoRklQb3M9PTEgJiYgIkJhZCBmcmFtZSBpbmRleCBvcGVyYW5kIik7CisgICAgbG9hZENvbnN0YW50KE1CQiwgSUksIERMLCBEZXN0UmVnLCBPZmZzZXQpOworICAgIE1JLmdldE9wZXJhbmQoMSkuQ2hhbmdlVG9SZWdpc3RlcihEZXN0UmVnLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgIE1JLmdldE9wZXJhbmQoMikuQ2hhbmdlVG9SZWdpc3RlcihCYXNlUmVnLCBmYWxzZSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBCRjo6U1RPUkUxNmZpOgorICAgIGlzU3RvcmUgPSB0cnVlOworICBjYXNlIEJGOjpMT0FEMTZmaTogeworICAgIGFzc2VydChPZmZzZXQlMiA9PSAwICYmICJVbmFsaWduZWQgaTE2IHN0YWNrIGFjY2VzcyIpOworICAgIGFzc2VydChGSVBvcz09MSAmJiAiQmFkIGZyYW1lIGluZGV4IG9wZXJhbmQiKTsKKyAgICAvLyBXZSBuZWVkIGEgUCByZWdpc3RlciB0byB1c2UgYXMgYW4gYWRkcmVzcworICAgIHVuc2lnbmVkIFNjcmF0Y2hSZWcgPSBmaW5kU2NyYXRjaFJlZ2lzdGVyKElJLCBSUywgJkJGOjpQUmVnQ2xhc3MsIFNQQWRqKTsKKyAgICBhc3NlcnQoU2NyYXRjaFJlZyAmJiAiQ291bGQgbm90IHNjYXZlbmdlIHJlZ2lzdGVyIik7CisgICAgbG9hZENvbnN0YW50KE1CQiwgSUksIERMLCBTY3JhdGNoUmVnLCBPZmZzZXQpOworICAgIEJ1aWxkTUkoTUJCLCBJSSwgREwsIFRJSS5nZXQoQkY6OkFERHBwKSwgU2NyYXRjaFJlZykKKyAgICAgIC5hZGRSZWcoU2NyYXRjaFJlZywgUmVnU3RhdGU6OktpbGwpCisgICAgICAuYWRkUmVnKEJhc2VSZWcpOworICAgIE1JLnNldERlc2MoVElJLmdldChpc1N0b3JlID8gQkY6OlNUT1JFMTZwaSA6IEJGOjpMT0FEMTZwaSkpOworICAgIE1JLmdldE9wZXJhbmQoMSkuQ2hhbmdlVG9SZWdpc3RlcihTY3JhdGNoUmVnLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgIE1JLlJlbW92ZU9wZXJhbmQoMik7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBCRjo6U1RPUkU4Zmk6IHsKKyAgICAvLyBUaGlzIGlzIGFuIEFueUNDIHNwaWxsLCB3ZSBuZWVkIGEgc2NyYXRjaCByZWdpc3Rlci4KKyAgICBhc3NlcnQoRklQb3M9PTEgJiYgIkJhZCBmcmFtZSBpbmRleCBvcGVyYW5kIik7CisgICAgTWFjaGluZU9wZXJhbmQgU3BpbGxSZWcgPSBNSS5nZXRPcGVyYW5kKDApOworICAgIHVuc2lnbmVkIFNjcmF0Y2hSZWcgPSBmaW5kU2NyYXRjaFJlZ2lzdGVyKElJLCBSUywgJkJGOjpEUmVnQ2xhc3MsIFNQQWRqKTsKKyAgICBhc3NlcnQoU2NyYXRjaFJlZyAmJiAiQ291bGQgbm90IHNjYXZlbmdlIHJlZ2lzdGVyIik7CisgICAgaWYgKFNwaWxsUmVnLmdldFJlZygpPT1CRjo6TkNDKSB7CisgICAgICBCdWlsZE1JKE1CQiwgSUksIERMLCBUSUkuZ2V0KEJGOjpNT1ZFTkNDX3opLCBTY3JhdGNoUmVnKQorICAgICAgICAuYWRkT3BlcmFuZChTcGlsbFJlZyk7CisgICAgICBCdWlsZE1JKE1CQiwgSUksIERMLCBUSUkuZ2V0KEJGOjpCSVRUR0wpLCBTY3JhdGNoUmVnKQorICAgICAgICAuYWRkUmVnKFNjcmF0Y2hSZWcpLmFkZEltbSgwKTsKKyAgICB9IGVsc2UgeworICAgICAgQnVpbGRNSShNQkIsIElJLCBETCwgVElJLmdldChCRjo6TU9WRUNDX3pleHQpLCBTY3JhdGNoUmVnKQorICAgICAgICAuYWRkT3BlcmFuZChTcGlsbFJlZyk7CisgICAgfQorICAgIC8vIFNUT1JFIEQKKyAgICBNSS5zZXREZXNjKFRJSS5nZXQoQkY6OlNUT1JFOHBfaW1tMTYpKTsKKyAgICBNSS5nZXRPcGVyYW5kKDApLkNoYW5nZVRvUmVnaXN0ZXIoU2NyYXRjaFJlZywgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICBNSS5nZXRPcGVyYW5kKEZJUG9zKS5DaGFuZ2VUb1JlZ2lzdGVyKEJhc2VSZWcsIGZhbHNlKTsKKyAgICBNSS5nZXRPcGVyYW5kKEZJUG9zKzEpLnNldEltbShPZmZzZXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQkY6OkxPQUQ4Zmk6IHsKKyAgICAvLyBUaGlzIGlzIGFuIHJlc3RvcmUsIHdlIG5lZWQgYSBzY3JhdGNoIHJlZ2lzdGVyLgorICAgIGFzc2VydChGSVBvcz09MSAmJiAiQmFkIGZyYW1lIGluZGV4IG9wZXJhbmQiKTsKKyAgICBNYWNoaW5lT3BlcmFuZCBTcGlsbFJlZyA9IE1JLmdldE9wZXJhbmQoMCk7CisgICAgdW5zaWduZWQgU2NyYXRjaFJlZyA9IGZpbmRTY3JhdGNoUmVnaXN0ZXIoSUksIFJTLCAmQkY6OkRSZWdDbGFzcywgU1BBZGopOworICAgIGFzc2VydChTY3JhdGNoUmVnICYmICJDb3VsZCBub3Qgc2NhdmVuZ2UgcmVnaXN0ZXIiKTsKKyAgICBNSS5zZXREZXNjKFRJSS5nZXQoQkY6OkxPQUQzMnBfaW1tMTZfOHopKTsKKyAgICBNSS5nZXRPcGVyYW5kKDApLkNoYW5nZVRvUmVnaXN0ZXIoU2NyYXRjaFJlZywgdHJ1ZSk7CisgICAgTUkuZ2V0T3BlcmFuZChGSVBvcykuQ2hhbmdlVG9SZWdpc3RlcihCYXNlUmVnLCBmYWxzZSk7CisgICAgTUkuZ2V0T3BlcmFuZChGSVBvcysxKS5zZXRJbW0oT2Zmc2V0KTsKKyAgICArK0lJOworICAgIGlmIChTcGlsbFJlZy5nZXRSZWcoKT09QkY6OkNDKSB7CisgICAgICAvLyBDQyA9IEQKKyAgICAgIEJ1aWxkTUkoTUJCLCBJSSwgREwsIFRJSS5nZXQoQkY6Ok1PVkVDQ19ueiksIEJGOjpDQykKKyAgICAgICAgLmFkZFJlZyhTY3JhdGNoUmVnLCBSZWdTdGF0ZTo6S2lsbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFJlc3RvcmUgTkNDIChDQyA9IEQ9PTApCisgICAgICBCdWlsZE1JKE1CQiwgSUksIERMLCBUSUkuZ2V0KEJGOjpTRVRFUXJpX25vdCksIEJGOjpOQ0MpCisgICAgICAgIC5hZGRSZWcoU2NyYXRjaFJlZywgUmVnU3RhdGU6OktpbGwpCisgICAgICAgIC5hZGRJbW0oMCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ2Fubm90IGVsaW1pbmF0ZSBmcmFtZSBpbmRleCIpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIEJsYWNrZmluUmVnaXN0ZXJJbmZvOjoKK3Byb2Nlc3NGdW5jdGlvbkJlZm9yZUNhbGxlZVNhdmVkU2NhbihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMpIGNvbnN0IHsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gQkY6OkRQUmVnaXN0ZXJDbGFzczsKKyAgaWYgKHJlcXVpcmVzUmVnaXN0ZXJTY2F2ZW5naW5nKE1GKSkgeworICAgIC8vIFJlc2VydmUgYSBzbG90IGNsb3NlIHRvIFNQIG9yIGZyYW1lIHBvaW50ZXIuCisgICAgUlMtPnNldFNjYXZlbmdpbmdGcmFtZUluZGV4KE1GSS0+Q3JlYXRlU3RhY2tPYmplY3QoUkMtPmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQy0+Z2V0QWxpZ25tZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKTsKKyAgfQorfQorCisvLyBFbWl0IGEgcHJvbG9ndWUgdGhhdCBzZXRzIHVwIGEgc3RhY2sgZnJhbWUuCisvLyBPbiBmdW5jdGlvbiBlbnRyeSwgUjAtUjIgYW5kIFAwIG1heSBob2xkIGFyZ3VtZW50cy4KKy8vIFIzLCBQMSwgYW5kIFAyIG1heSBiZSB1c2VkIGFzIHNjcmF0Y2ggcmVnaXN0ZXJzCit2b2lkIEJsYWNrZmluUmVnaXN0ZXJJbmZvOjplbWl0UHJvbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gTUYuZnJvbnQoKTsgICAvLyBQcm9sb2cgZ29lcyBpbiBlbnRyeSBCQgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IE1CQi5iZWdpbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgRGVidWdMb2MgZGwgPSBNQkJJICE9IE1CQi5lbmQoKSA/IE1CQkktPmdldERlYnVnTG9jKCkgOiBEZWJ1Z0xvYygpOworCisgIGludCBGcmFtZVNpemUgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworICBpZiAoRnJhbWVTaXplJTQpIHsKKyAgICBGcmFtZVNpemUgPSAoRnJhbWVTaXplKzMpICYgfjM7CisgICAgTUZJLT5zZXRTdGFja1NpemUoRnJhbWVTaXplKTsKKyAgfQorCisgIGlmICghaGFzRlAoTUYpKSB7CisgICAgYXNzZXJ0KCFNRkktPmFkanVzdHNTdGFjaygpICYmCisgICAgICAgICAgICJGUCBlbGltaW5hdGlvbiBvbiBhIG5vbi1sZWFmIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBhZGp1c3RSZWdpc3RlcihNQkIsIE1CQkksIGRsLCBCRjo6U1AsIEJGOjpQMSwgLUZyYW1lU2l6ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZW1pdCBhIExJTksgaW5zdHJ1Y3Rpb24KKyAgaWYgKEZyYW1lU2l6ZSA8PSAweDNmZmZmKSB7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEJGOjpMSU5LKSkuYWRkSW1tKEZyYW1lU2l6ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRnJhbWUgaXMgdG9vIGJpZywgZG8gYSBtYW51YWwgTElOSzoKKyAgLy8gWy0tU1BdID0gUkVUUzsKKyAgLy8gWy0tU1BdID0gRlA7CisgIC8vIEZQID0gU1A7CisgIC8vIFAxID0gLUZyYW1lU2l6ZTsKKyAgLy8gU1AgPSBTUCArIFAxOworICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQkY6OlBVU0gpKQorICAgIC5hZGRSZWcoQkY6OlJFVFMsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEJGOjpQVVNIKSkKKyAgICAuYWRkUmVnKEJGOjpGUCwgUmVnU3RhdGU6OktpbGwpOworICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQkY6Ok1PVkUpLCBCRjo6RlApCisgICAgLmFkZFJlZyhCRjo6U1ApOworICBsb2FkQ29uc3RhbnQoTUJCLCBNQkJJLCBkbCwgQkY6OlAxLCAtRnJhbWVTaXplKTsKKyAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEJGOjpBRERwcCksIEJGOjpTUCkKKyAgICAuYWRkUmVnKEJGOjpTUCwgUmVnU3RhdGU6OktpbGwpCisgICAgLmFkZFJlZyhCRjo6UDEsIFJlZ1N0YXRlOjpLaWxsKTsKKworfQorCit2b2lkIEJsYWNrZmluUmVnaXN0ZXJJbmZvOjplbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCB7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IHByaW9yKE1CQi5lbmQoKSk7CisgIERlYnVnTG9jIGRsID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKworICBpbnQgRnJhbWVTaXplID0gTUZJLT5nZXRTdGFja1NpemUoKTsKKyAgYXNzZXJ0KEZyYW1lU2l6ZSU0ID09IDAgJiYgIk1pc2FsaWduZWQgZnJhbWUgc2l6ZSIpOworCisgIGlmICghaGFzRlAoTUYpKSB7CisgICAgYXNzZXJ0KCFNRkktPmFkanVzdHNTdGFjaygpICYmCisgICAgICAgICAgICJGUCBlbGltaW5hdGlvbiBvbiBhIG5vbi1sZWFmIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBhZGp1c3RSZWdpc3RlcihNQkIsIE1CQkksIGRsLCBCRjo6U1AsIEJGOjpQMSwgRnJhbWVTaXplKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBlbWl0IGFuIFVOTElOSyBpbnN0cnVjdGlvbgorICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQkY6OlVOTElOSykpOworfQorCit1bnNpZ25lZCBCbGFja2ZpblJlZ2lzdGVySW5mbzo6Z2V0UkFSZWdpc3RlcigpIGNvbnN0IHsKKyAgcmV0dXJuIEJGOjpSRVRTOworfQorCit1bnNpZ25lZAorQmxhY2tmaW5SZWdpc3RlckluZm86OmdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICByZXR1cm4gaGFzRlAoTUYpID8gQkY6OkZQIDogQkY6OlNQOworfQorCit1bnNpZ25lZCBCbGFja2ZpblJlZ2lzdGVySW5mbzo6Z2V0RUhFeGNlcHRpb25SZWdpc3RlcigpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiV2hhdCBpcyB0aGUgZXhjZXB0aW9uIHJlZ2lzdGVyIik7CisgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBCbGFja2ZpblJlZ2lzdGVySW5mbzo6Z2V0RUhIYW5kbGVyUmVnaXN0ZXIoKSBjb25zdCB7CisgIGxsdm1fdW5yZWFjaGFibGUoIldoYXQgaXMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIHJlZ2lzdGVyIik7CisgIHJldHVybiAwOworfQorCitpbnQgQmxhY2tmaW5SZWdpc3RlckluZm86OmdldER3YXJmUmVnTnVtKHVuc2lnbmVkIFJlZ051bSwgYm9vbCBpc0VIKSBjb25zdCB7CisgIGxsdm1fdW5yZWFjaGFibGUoIldoYXQgaXMgdGhlIGR3YXJmIHJlZ2lzdGVyIG51bWJlciIpOworICByZXR1cm4gLTE7Cit9CisKKyNpbmNsdWRlICJCbGFja2ZpbkdlblJlZ2lzdGVySW5mby5pbmMiCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5SZWdpc3RlckluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5SZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTVkMWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblJlZ2lzdGVySW5mby5oCkBAIC0wLDAgKzEsODkgQEAKKy8vPT09LSBCbGFja2ZpblJlZ2lzdGVySW5mby5oIC0gQmxhY2tmaW4gUmVnaXN0ZXIgSW5mb3JtYXRpb24gLi4tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBCbGFja2ZpbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvCisvLyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEJMQUNLRklOUkVHSVNURVJJTkZPX0gKKyNkZWZpbmUgQkxBQ0tGSU5SRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAiQmxhY2tmaW5HZW5SZWdpc3RlckluZm8uaC5pbmMiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBCbGFja2ZpblN1YnRhcmdldDsKKyAgY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworICBjbGFzcyBUeXBlOworCisgIHN0cnVjdCBCbGFja2ZpblJlZ2lzdGVySW5mbyA6IHB1YmxpYyBCbGFja2ZpbkdlblJlZ2lzdGVySW5mbyB7CisgICAgQmxhY2tmaW5TdWJ0YXJnZXQgJlN1YnRhcmdldDsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSTsKKworICAgIEJsYWNrZmluUmVnaXN0ZXJJbmZvKEJsYWNrZmluU3VidGFyZ2V0ICZzdCwgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpOworCisgICAgLy8vIENvZGUgR2VuZXJhdGlvbiB2aXJ0dWFsIG1ldGhvZHMuLi4KKyAgICBjb25zdCB1bnNpZ25lZCAqZ2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYgPSAwKSBjb25zdDsKKworICAgIEJpdFZlY3RvciBnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgICAvLyBnZXRTdWJSZWcgaW1wbGVtZW50ZWQgYnkgdGFibGVnZW4KKworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldFBvaW50ZXJSZWdDbGFzcyh1bnNpZ25lZCBLaW5kID0gMCkgY29uc3QgeworICAgICAgcmV0dXJuICZCRjo6UFJlZ0NsYXNzOworICAgIH0KKworICAgIGJvb2wgaGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgICAvLyBib29sIGhhc1Jlc2VydmVkQ2FsbEZyYW1lKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgICAgYm9vbCByZXF1aXJlc1JlZ2lzdGVyU2NhdmVuZ2luZyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAgIHZvaWQgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBlbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUEFkaiwgRnJhbWVJbmRleFZhbHVlICpWYWx1ZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gTlVMTCkgY29uc3Q7CisKKyAgICB2b2lkIHByb2Nlc3NGdW5jdGlvbkJlZm9yZUNhbGxlZVNhdmVkU2NhbihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMpIGNvbnN0OworCisgICAgdm9pZCBlbWl0UHJvbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgICAgdm9pZCBlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIHVuc2lnbmVkIGdldFJBUmVnaXN0ZXIoKSBjb25zdDsKKworICAgIC8vIEV4Y2VwdGlvbiBoYW5kbGluZyBxdWVyaWVzLgorICAgIHVuc2lnbmVkIGdldEVIRXhjZXB0aW9uUmVnaXN0ZXIoKSBjb25zdDsKKyAgICB1bnNpZ25lZCBnZXRFSEhhbmRsZXJSZWdpc3RlcigpIGNvbnN0OworCisgICAgaW50IGdldER3YXJmUmVnTnVtKHVuc2lnbmVkIFJlZ051bSwgYm9vbCBpc0VIKSBjb25zdDsKKworICAgIC8vIFV0aWxpdHkgZnVuY3Rpb25zCisgICAgdm9pZCBhZGp1c3RSZWdpc3RlcihNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNjcmF0Y2hSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpIGNvbnN0OworICAgIHZvaWQgbG9hZENvbnN0YW50KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3Q7CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblJlZ2lzdGVySW5mby50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5SZWdpc3RlckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjZmFlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5SZWdpc3RlckluZm8udGQKQEAgLTAsMCArMSwzNjUgQEAKKy8vPT09LSBCbGFja2ZpblJlZ2lzdGVySW5mby50ZCAtIEJsYWNrZmluIFJlZ2lzdGVyIGRlZnMgLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRGVjbGFyYXRpb25zIHRoYXQgZGVzY3JpYmUgdGhlIEJsYWNrZmluIHJlZ2lzdGVyIGZpbGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFN1YnJlZ3MgYXJlOgorLy8gMTogLkwKKy8vIDI6IC5ICisvLyAzOiAuVyAoMzIgbG93IGJpdHMgb2YgNDAtYml0IGFjY3UpCitsZXQgTmFtZXNwYWNlID0gIkJGIiBpbiB7CitkZWYgbG8xNiA6IFN1YlJlZ0luZGV4OworZGVmIGhpMTYgOiBTdWJSZWdJbmRleDsKK2RlZiBsbzMyIDogU3ViUmVnSW5kZXg7CitkZWYgaGkzMiA6IFN1YlJlZ0luZGV4OworfQorCisvLyBSZWdpc3RlcnMgYXJlIGlkZW50aWZpZWQgd2l0aCAzLWJpdCBncm91cCBhbmQgMy1iaXQgSUQgbnVtYmVycy4KK2NsYXNzIEJsYWNrZmluUmVnPHN0cmluZyBuPiA6IFJlZ2lzdGVyPG4+IHsKKyAgZmllbGQgYml0czwzPiBHcm91cDsKKyAgZmllbGQgYml0czwzPiBOdW07CisgIGxldCBOYW1lc3BhY2UgPSAiQkYiOworfQorCisvLyBSYyAtIDEtYml0IHJlZ2lzdGVycworY2xhc3MgUmM8Yml0czw1PiBiaXRubywgc3RyaW5nIG4+IDogQmxhY2tmaW5SZWc8bj4geworICBmaWVsZCBiaXRzPDU+IEJpdE51bSA9IGJpdG5vOworfQorCisvLyBScyAtIDE2LWJpdCBpbnRlZ2VyIHJlZ2lzdGVycworY2xhc3MgUnM8Yml0czwzPiBncm91cCwgYml0czwzPiBudW0sIGJpdHM8MT4gaGksIHN0cmluZyBuPiA6IEJsYWNrZmluUmVnPG4+IHsKKyAgbGV0IEdyb3VwID0gZ3JvdXA7CisgIGxldCBOdW0gPSBudW07CisgIGZpZWxkIGJpdHM8MT4gSGlnaCA9IGhpOworfQorCisvLyBSaSAtIDMyLWJpdCBpbnRlZ2VyIHJlZ2lzdGVycyB3aXRoIHN1YnJlZ3MKK2NsYXNzIFJpPGJpdHM8Mz4gZ3JvdXAsIGJpdHM8Mz4gbnVtLCBzdHJpbmcgbj4gOiBCbGFja2ZpblJlZzxuPiB7CisgIGxldCBHcm91cCA9IGdyb3VwOworICBsZXQgTnVtID0gbnVtOworfQorCisvLyBSYSA0MC1iaXQgYWNjdW11bGF0b3IgcmVnaXN0ZXJzCitjbGFzcyBSYTxiaXRzPDM+IG51bSwgc3RyaW5nIG4sIGxpc3Q8UmVnaXN0ZXI+IHN1YnM+IDogQmxhY2tmaW5SZWc8bj4geworICBsZXQgU3ViUmVncyA9IHN1YnM7CisgIGxldCBTdWJSZWdJbmRpY2VzID0gW2hpMzIsIGxvMzJdOworICBsZXQgR3JvdXAgPSA0OworICBsZXQgTnVtID0gbnVtOworfQorCisvLyBUd28gaGFsdmVzIG9mIDMyLWJpdCByZWdpc3RlcgorbXVsdGljbGFzcyBSc3M8Yml0czwzPiBncm91cCwgYml0czwzPiBudW0sIHN0cmluZyBuPiB7CisgIGRlZiBIIDogUnM8Z3JvdXAsIG51bSwgMSwgIXN0cmNvbmNhdChuLCAiLmgiKT47CisgIGRlZiBMIDogUnM8Z3JvdXAsIG51bSwgMCwgIXN0cmNvbmNhdChuLCAiLmwiKT47Cit9CisKKy8vIFJpaSAtIDMyLWJpdCBpbnRlZ2VyIHJlZ2lzdGVycyB3aXRoIHN1YnJlZ3MKK2NsYXNzIFJpaTxiaXRzPDM+IGdyb3VwLCBiaXRzPDM+IG51bSwgc3RyaW5nIG4sIGxpc3Q8UmVnaXN0ZXI+IHN1YnM+CisgICAgICA6IEJsYWNrZmluUmVnPG4+IHsKKyAgbGV0IFN1YlJlZ3MgPSBzdWJzOworICBsZXQgU3ViUmVnSW5kaWNlcyA9IFtoaTE2LCBsbzE2XTsKKyAgbGV0IEdyb3VwID0gZ3JvdXA7CisgIGxldCBOdW0gPSBudW07Cit9CisKKy8vIFN0YXR1cyBiaXRzIGFyZSBhbGwgcGFydCBvZiBBU1RBVAorZGVmIEFaICAgOiBSYzwwLCAgImF6Ij47CitkZWYgQU4gICA6IFJjPDEsICAiYW4iPjsKK2RlZiBDQyAgIDogUmM8NSwgICJjYyI+LCBEd2FyZlJlZ051bTxbMzRdPjsKK2RlZiBOQ0MgIDogUmM8NSwgICIhY2MiPiB7IGxldCBBbGlhc2VzID0gW0NDXTsgfQorZGVmIEFRICAgOiBSYzw2LCAgImFxIj47CitkZWYgQUMwICA6IFJjPDEyLCAiYWMwIj47CitkZWYgQUMxICA6IFJjPDEzLCAiYWMxIj47CitkZWYgQVYwICA6IFJjPDE2LCAiYXYwIj47CitkZWYgQVYwUyA6IFJjPDE3LCAiYXYwcyI+OworZGVmIEFWMSAgOiBSYzwxOCwgImF2MSI+OworZGVmIEFWMVMgOiBSYzwxOSwgImF2MXMiPjsKK2RlZiBWICAgIDogUmM8MjQsICJ2Ij47CitkZWYgVlMgICA6IFJjPDI1LCAidnMiPjsKKy8vIFNraXBwZWQgbm9uLXN0YXR1cyBiaXRzOiBBQzBfQ09QWSwgVl9DT1BZLCBSTkRfTU9ECisKKy8vIEdyb3VwIDA6IEludGVnZXIgcmVnaXN0ZXJzCitkZWZtIFIwIDogUnNzPDAsIDAsICJyMCI+OworZGVmICBSMCA6IFJpaTwwLCAwLCAicjAiLCBbUjBILCBSMExdPiwgRHdhcmZSZWdOdW08WzBdPjsKK2RlZm0gUjEgOiBSc3M8MCwgMSwgInIxIj47CitkZWYgIFIxIDogUmlpPDAsIDEsICJyMSIsIFtSMUgsIFIxTF0+LCBEd2FyZlJlZ051bTxbMV0+OworZGVmbSBSMiA6IFJzczwwLCAyLCAicjIiPjsKK2RlZiAgUjIgOiBSaWk8MCwgMiwgInIyIiwgW1IySCwgUjJMXT4sIER3YXJmUmVnTnVtPFsyXT47CitkZWZtIFIzIDogUnNzPDAsIDMsICJyMyI+OworZGVmICBSMyA6IFJpaTwwLCAzLCAicjMiLCBbUjNILCBSM0xdPiwgRHdhcmZSZWdOdW08WzNdPjsKK2RlZm0gUjQgOiBSc3M8MCwgNCwgInI0Ij47CitkZWYgIFI0IDogUmlpPDAsIDQsICJyNCIsIFtSNEgsIFI0TF0+LCBEd2FyZlJlZ051bTxbNF0+OworZGVmbSBSNSA6IFJzczwwLCA1LCAicjUiPjsKK2RlZiAgUjUgOiBSaWk8MCwgNSwgInI1IiwgW1I1SCwgUjVMXT4sIER3YXJmUmVnTnVtPFs1XT47CitkZWZtIFI2IDogUnNzPDAsIDYsICJyNiI+OworZGVmICBSNiA6IFJpaTwwLCA2LCAicjYiLCBbUjZILCBSNkxdPiwgRHdhcmZSZWdOdW08WzZdPjsKK2RlZm0gUjcgOiBSc3M8MCwgNywgInI3Ij47CitkZWYgIFI3IDogUmlpPDAsIDcsICJyNyIsIFtSN0gsIFI3TF0+LCBEd2FyZlJlZ051bTxbN10+OworCisvLyBHcm91cCAxOiBQb2ludGVyIHJlZ2lzdGVycworZGVmbSBQMCA6IFJzczwxLCAwLCAicDAiPjsKK2RlZiAgUDAgOiBSaWk8MSwgMCwgInAwIiwgW1AwSCwgUDBMXT4sIER3YXJmUmVnTnVtPFs4XT47CitkZWZtIFAxIDogUnNzPDEsIDEsICJwMSI+OworZGVmICBQMSA6IFJpaTwxLCAxLCAicDEiLCBbUDFILCBQMUxdPiwgRHdhcmZSZWdOdW08WzldPjsKK2RlZm0gUDIgOiBSc3M8MSwgMiwgInAyIj47CitkZWYgIFAyIDogUmlpPDEsIDIsICJwMiIsIFtQMkgsIFAyTF0+LCBEd2FyZlJlZ051bTxbMTBdPjsKK2RlZm0gUDMgOiBSc3M8MSwgMywgInAzIj47CitkZWYgIFAzIDogUmlpPDEsIDMsICJwMyIsIFtQM0gsIFAzTF0+LCBEd2FyZlJlZ051bTxbMTFdPjsKK2RlZm0gUDQgOiBSc3M8MSwgNCwgInA0Ij47CitkZWYgIFA0IDogUmlpPDEsIDQsICJwNCIsIFtQNEgsIFA0TF0+LCBEd2FyZlJlZ051bTxbMTJdPjsKK2RlZm0gUDUgOiBSc3M8MSwgNSwgInA1Ij47CitkZWYgIFA1IDogUmlpPDEsIDUsICJwNSIsIFtQNUgsIFA1TF0+LCBEd2FyZlJlZ051bTxbMTNdPjsKK2RlZm0gU1AgOiBSc3M8MSwgNiwgInNwIj47CitkZWYgIFNQIDogUmlpPDEsIDYsICJzcCIsIFtTUEgsIFNQTF0+LCBEd2FyZlJlZ051bTxbMTRdPjsKK2RlZm0gRlAgOiBSc3M8MSwgNywgImZwIj47CitkZWYgIEZQIDogUmlpPDEsIDcsICJmcCIsIFtGUEgsIEZQTF0+LCBEd2FyZlJlZ051bTxbMTVdPjsKKworLy8gR3JvdXAgMjogSW5kZXggcmVnaXN0ZXJzCitkZWZtIEkwIDogUnNzPDIsIDAsICJpMCI+OworZGVmICBJMCA6IFJpaTwyLCAwLCAiaTAiLCBbSTBILCBJMExdPiwgRHdhcmZSZWdOdW08WzE2XT47CitkZWZtIEkxIDogUnNzPDIsIDEsICJpMSI+OworZGVmICBJMSA6IFJpaTwyLCAxLCAiaTEiLCBbSTFILCBJMUxdPiwgRHdhcmZSZWdOdW08WzE3XT47CitkZWZtIEkyIDogUnNzPDIsIDIsICJpMiI+OworZGVmICBJMiA6IFJpaTwyLCAyLCAiaTIiLCBbSTJILCBJMkxdPiwgRHdhcmZSZWdOdW08WzE4XT47CitkZWZtIEkzIDogUnNzPDIsIDMsICJpMyI+OworZGVmICBJMyA6IFJpaTwyLCAzLCAiaTMiLCBbSTNILCBJM0xdPiwgRHdhcmZSZWdOdW08WzE5XT47CitkZWZtIE0wIDogUnNzPDIsIDQsICJtMCI+OworZGVmICBNMCA6IFJpaTwyLCA0LCAibTAiLCBbTTBILCBNMExdPiwgRHdhcmZSZWdOdW08WzIwXT47CitkZWZtIE0xIDogUnNzPDIsIDUsICJtMSI+OworZGVmICBNMSA6IFJpaTwyLCA1LCAibTEiLCBbTTFILCBNMUxdPiwgRHdhcmZSZWdOdW08WzIxXT47CitkZWZtIE0yIDogUnNzPDIsIDYsICJtMiI+OworZGVmICBNMiA6IFJpaTwyLCA2LCAibTIiLCBbTTJILCBNMkxdPiwgRHdhcmZSZWdOdW08WzIyXT47CitkZWZtIE0zIDogUnNzPDIsIDcsICJtMyI+OworZGVmICBNMyA6IFJpaTwyLCA3LCAibTMiLCBbTTNILCBNM0xdPiwgRHdhcmZSZWdOdW08WzIzXT47CisKKy8vIEdyb3VwIDM6IEN5Y2xpYyBpbmRleGluZyByZWdpc3RlcnMKK2RlZm0gQjAgOiBSc3M8MywgMCwgImIwIj47CitkZWYgIEIwIDogUmlpPDMsIDAsICJiMCIsIFtCMEgsIEIwTF0+LCBEd2FyZlJlZ051bTxbMjRdPjsKK2RlZm0gQjEgOiBSc3M8MywgMSwgImIxIj47CitkZWYgIEIxIDogUmlpPDMsIDEsICJiMSIsIFtCMUgsIEIxTF0+LCBEd2FyZlJlZ051bTxbMjVdPjsKK2RlZm0gQjIgOiBSc3M8MywgMiwgImIyIj47CitkZWYgIEIyIDogUmlpPDMsIDIsICJiMiIsIFtCMkgsIEIyTF0+LCBEd2FyZlJlZ051bTxbMjZdPjsKK2RlZm0gQjMgOiBSc3M8MywgMywgImIzIj47CitkZWYgIEIzIDogUmlpPDMsIDMsICJiMyIsIFtCM0gsIEIzTF0+LCBEd2FyZlJlZ051bTxbMjddPjsKK2RlZm0gTDAgOiBSc3M8MywgNCwgImwwIj47CitkZWYgIEwwIDogUmlpPDMsIDQsICJsMCIsIFtMMEgsIEwwTF0+LCBEd2FyZlJlZ051bTxbMjhdPjsKK2RlZm0gTDEgOiBSc3M8MywgNSwgImwxIj47CitkZWYgIEwxIDogUmlpPDMsIDUsICJsMSIsIFtMMUgsIEwxTF0+LCBEd2FyZlJlZ051bTxbMjldPjsKK2RlZm0gTDIgOiBSc3M8MywgNiwgImwyIj47CitkZWYgIEwyIDogUmlpPDMsIDYsICJsMiIsIFtMMkgsIEwyTF0+LCBEd2FyZlJlZ051bTxbMzBdPjsKK2RlZm0gTDMgOiBSc3M8MywgNywgImwzIj47CitkZWYgIEwzIDogUmlpPDMsIDcsICJsMyIsIFtMM0gsIEwzTF0+LCBEd2FyZlJlZ051bTxbMzFdPjsKKworLy8gQWNjdW11bGF0b3JzCitkZWYgIEEwWCA6IFJpIDw0LCAwLCAiYTAueCI+OworZGVmbSBBMCAgOiBSc3M8NCwgMSwgImEwIj47CitkZWYgIEEwVyA6IFJpaTw0LCAxLCAiYTAudyIsIFtBMEgsIEEwTF0+LCBEd2FyZlJlZ051bTxbMzJdPjsKK2RlZiAgQTAgIDogUmEgPDAsICJhMCIsIFtBMFgsIEEwV10+OworCitkZWYgIEExWCA6IFJpIDw0LCAyLCAiYTEueCI+OworZGVmbSBBMSAgOiBSc3M8NCwgMywgImExIj47CitkZWYgIEExVyA6IFJpaTw0LCAzLCAiYTEudyIsIFtBMUgsIEExTF0+LCBEd2FyZlJlZ051bTxbMzNdPjsKK2RlZiAgQTEgIDogUmEgPDIsICJhMSIsIFtBMVgsIEExV10+OworCitkZWYgUkVUUyA6IFJpPDQsIDcsICJyZXRzIj4sICBEd2FyZlJlZ051bTxbMzVdPjsKK2RlZiBSRVRJIDogUmk8NywgMywgInJldGkiPiwgIER3YXJmUmVnTnVtPFszNl0+OworZGVmIFJFVFggOiBSaTw3LCA0LCAicmV0eCI+LCAgRHdhcmZSZWdOdW08WzM3XT47CitkZWYgUkVUTiA6IFJpPDcsIDUsICJyZXRuIj4sICBEd2FyZlJlZ051bTxbMzhdPjsKK2RlZiBSRVRFIDogUmk8NywgNiwgInJldGUiPiwgIER3YXJmUmVnTnVtPFszOV0+OworCitkZWYgQVNUQVQgICA6IFJpPDQsIDYsICJhc3RhdCI+LCAgIER3YXJmUmVnTnVtPFs0MF0+IHsKKyAgbGV0IEFsaWFzZXMgPSBbQVosIEFOLCBDQywgTkNDLCBBUSwgQUMwLCBBQzEsIEFWMCwgQVYwUywgQVYxLCBBVjFTLCBWLCBWU107Cit9CisKK2RlZiBTRVFTVEFUIDogUmk8NywgMSwgInNlcXN0YXQiPiwgRHdhcmZSZWdOdW08WzQxXT47CitkZWYgVVNQICAgICA6IFJpPDcsIDAsICJ1c3AiPiwgICAgIER3YXJmUmVnTnVtPFs0Ml0+OworZGVmIEVNVURBVCAgOiBSaTw3LCA3LCAiZW11ZGF0Ij4sICBEd2FyZlJlZ051bTxbNDNdPjsKK2RlZiBTWVNDRkcgIDogUmk8NywgMiwgInN5c2NmZyI+OworZGVmIENZQ0xFUyAgOiBSaTw2LCA2LCAiY3ljbGVzIj47CitkZWYgQ1lDTEVTMiA6IFJpPDYsIDcsICJjeWNsZXMyIj47CisKKy8vIEhhcmR3YXJlIGxvb3BzCitkZWYgTFQwIDogUmk8NiwgMSwgImx0MCI+LCBEd2FyZlJlZ051bTxbNDRdPjsKK2RlZiBMVDEgOiBSaTw2LCA0LCAibHQxIj4sIER3YXJmUmVnTnVtPFs0NV0+OworZGVmIExDMCA6IFJpPDYsIDAsICJsYzAiPiwgRHdhcmZSZWdOdW08WzQ2XT47CitkZWYgTEMxIDogUmk8NiwgMywgImxjMSI+LCBEd2FyZlJlZ051bTxbNDddPjsKK2RlZiBMQjAgOiBSaTw2LCAyLCAibGIwIj4sIER3YXJmUmVnTnVtPFs0OF0+OworZGVmIExCMSA6IFJpPDYsIDUsICJsYjEiPiwgRHdhcmZSZWdOdW08WzQ5XT47CisKKy8vIFJlZ2lzdGVyIGNsYXNzZXMuCitkZWYgRDE2IDogUmVnaXN0ZXJDbGFzczwiQkYiLCBbaTE2XSwgMTYsCisgICAgW1IwSCwgUjBMLCBSMUgsIFIxTCwgUjJILCBSMkwsIFIzSCwgUjNMLAorICAgICBSNEgsIFI0TCwgUjVILCBSNUwsIFI2SCwgUjZMLCBSN0gsIFI3TF0+OworCitkZWYgRDE2TCA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kxNl0sIDE2LAorICAgIFtSMEwsIFIxTCwgUjJMLCBSM0wsIFI0TCwgUjVMLCBSNkwsIFI3TF0+OworCitkZWYgRDE2SCA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kxNl0sIDE2LAorICAgIFtSMEgsIFIxSCwgUjJILCBSM0gsIFI0SCwgUjVILCBSNkgsIFI3SF0+OworCitkZWYgUDE2IDogUmVnaXN0ZXJDbGFzczwiQkYiLCBbaTE2XSwgMTYsCisgICAgW1AwSCwgUDBMLCBQMUgsIFAxTCwgUDJILCBQMkwsIFAzSCwgUDNMLAorICAgICBQNEgsIFA0TCwgUDVILCBQNUwsIFNQSCwgU1BMLCBGUEgsIEZQTF0+OworCitkZWYgUDE2TCA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kxNl0sIDE2LAorICAgIFtQMEwsIFAxTCwgUDJMLCBQM0wsIFA0TCwgUDVMLCBTUEwsIEZQTF0+OworCitkZWYgUDE2SCA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kxNl0sIDE2LAorICAgIFtQMEgsIFAxSCwgUDJILCBQM0gsIFA0SCwgUDVILCBTUEgsIEZQSF0+OworCitkZWYgRFAxNiA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kxNl0sIDE2LAorICAgIFtSMEgsIFIwTCwgUjFILCBSMUwsIFIySCwgUjJMLCBSM0gsIFIzTCwKKyAgICAgUjRILCBSNEwsIFI1SCwgUjVMLCBSNkgsIFI2TCwgUjdILCBSN0wsCisgICAgIFAwSCwgUDBMLCBQMUgsIFAxTCwgUDJILCBQMkwsIFAzSCwgUDNMLAorICAgICBQNEgsIFA0TCwgUDVILCBQNUwsIFNQSCwgU1BMLCBGUEgsIEZQTF0+OworCitkZWYgRFAxNkwgOiBSZWdpc3RlckNsYXNzPCJCRiIsIFtpMTZdLCAxNiwKKyAgICBbUjBMLCBSMUwsIFIyTCwgUjNMLCBSNEwsIFI1TCwgUjZMLCBSN0wsCisgICAgIFAwTCwgUDFMLCBQMkwsIFAzTCwgUDRMLCBQNUwsIFNQTCwgRlBMXT47CisKK2RlZiBEUDE2SCA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kxNl0sIDE2LAorICAgIFtSMEgsIFIxSCwgUjJILCBSM0gsIFI0SCwgUjVILCBSNkgsIFI3SCwKKyAgICAgUDBILCBQMUgsIFAySCwgUDNILCBQNEgsIFA1SCwgU1BILCBGUEhdPjsKKworZGVmIEdSMTYgOiBSZWdpc3RlckNsYXNzPCJCRiIsIFtpMTZdLCAxNiwKKyAgICBbUjBILCBSMEwsIFIxSCwgUjFMLCBSMkgsIFIyTCwgUjNILCBSM0wsCisgICAgIFI0SCwgUjRMLCBSNUgsIFI1TCwgUjZILCBSNkwsIFI3SCwgUjdMLAorICAgICBQMEgsIFAwTCwgUDFILCBQMUwsIFAySCwgUDJMLCBQM0gsIFAzTCwKKyAgICAgUDRILCBQNEwsIFA1SCwgUDVMLCBTUEgsIFNQTCwgRlBILCBGUEwsCisgICAgIEkwSCwgSTBMLCBJMUgsIEkxTCwgSTJILCBJMkwsIEkzSCwgSTNMLAorICAgICBNMEgsIE0wTCwgTTFILCBNMUwsIE0ySCwgTTJMLCBNM0gsIE0zTCwKKyAgICAgQjBILCBCMEwsIEIxSCwgQjFMLCBCMkgsIEIyTCwgQjNILCBCM0wsCisgICAgIEwwSCwgTDBMLCBMMUgsIEwxTCwgTDJILCBMMkwsIEwzSCwgTDNMXT47CisKK2RlZiBEIDogUmVnaXN0ZXJDbGFzczwiQkYiLCBbaTMyXSwgMzIsIFtSMCwgUjEsIFIyLCBSMywgUjQsIFI1LCBSNiwgUjddPiB7CisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhEMTZMIGxvMTYpLCAoRDE2SCBoaTE2KV07Cit9CisKK2RlZiBQIDogUmVnaXN0ZXJDbGFzczwiQkYiLCBbaTMyXSwgMzIsIFtQMCwgUDEsIFAyLCBQMywgUDQsIFA1LCBGUCwgU1BdPiB7CisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhQMTZMIGxvMTYpLCAoUDE2SCBoaTE2KV07CisgIGxldCBNZXRob2RQcm90b3MgPSBbeworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB9XTsKKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7CisgICAgUENsYXNzOjppdGVyYXRvcgorICAgIFBDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKyAgICAgIHJldHVybiBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKE1GKQorICAgICAgICAgICAgICsgKFJJLT5oYXNGUChNRikgPyA3IDogNik7CisgICAgfQorICB9XTsKK30KKworZGVmIEkgOiBSZWdpc3RlckNsYXNzPCJCRiIsIFtpMzJdLCAzMiwgW0kwLCBJMSwgSTIsIEkzXT47CitkZWYgTSA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kzMl0sIDMyLCBbTTAsIE0xLCBNMiwgTTNdPjsKK2RlZiBCIDogUmVnaXN0ZXJDbGFzczwiQkYiLCBbaTMyXSwgMzIsIFtCMCwgQjEsIEIyLCBCM10+OworZGVmIEwgOiBSZWdpc3RlckNsYXNzPCJCRiIsIFtpMzJdLCAzMiwgW0wwLCBMMSwgTDIsIEwzXT47CisKK2RlZiBEUCA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kzMl0sIDMyLAorICAgIFtSMCwgUjEsIFIyLCBSMywgUjQsIFI1LCBSNiwgUjcsCisgICAgIFAwLCBQMSwgUDIsIFAzLCBQNCwgUDUsIEZQLCBTUF0+IHsKKyAgbGV0IFN1YlJlZ0NsYXNzZXMgPSBbKERQMTZMIGxvMTYpLCAoRFAxNkggaGkxNildOworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIERQQ2xhc3M6Oml0ZXJhdG9yCisgICAgRFBDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKyAgICAgIHJldHVybiBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKE1GKQorICAgICAgICAgICAgICsgKFJJLT5oYXNGUChNRikgPyAxNSA6IDE0KTsKKyAgICB9CisgIH1dOworfQorCitkZWYgR1IgOiBSZWdpc3RlckNsYXNzPCJCRiIsIFtpMzJdLCAzMiwKKyAgICBbUjAsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjYsIFI3LAorICAgICBQMCwgUDEsIFAyLCBQMywgUDQsIFA1LAorICAgICBJMCwgSTEsIEkyLCBJMywgTTAsIE0xLCBNMiwgTTMsCisgICAgIEIwLCBCMSwgQjIsIEIzLCBMMCwgTDEsIEwyLCBMMywKKyAgICAgRlAsIFNQXT4geworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIEdSQ2xhc3M6Oml0ZXJhdG9yCisgICAgR1JDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKyAgICAgIHJldHVybiBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKE1GKQorICAgICAgICAgICAgICsgKFJJLT5oYXNGUChNRikgPyAzMSA6IDMwKTsKKyAgICB9CisgIH1dOworfQorCitkZWYgQUxMIDogUmVnaXN0ZXJDbGFzczwiQkYiLCBbaTMyXSwgMzIsCisgICAgW1IwLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2LCBSNywKKyAgICAgUDAsIFAxLCBQMiwgUDMsIFA0LCBQNSwKKyAgICAgSTAsIEkxLCBJMiwgSTMsIE0wLCBNMSwgTTIsIE0zLAorICAgICBCMCwgQjEsIEIyLCBCMywgTDAsIEwxLCBMMiwgTDMsCisgICAgIEZQLCBTUCwKKyAgICAgQTBYLCBBMFcsIEExWCwgQTFXLCBBU1RBVCwgUkVUUywKKyAgICAgTEMwLCBMVDAsIExCMCwgTEMxLCBMVDEsIExCMSwgQ1lDTEVTLCBDWUNMRVMyLAorICAgICBVU1AsIFNFUVNUQVQsIFNZU0NGRywgUkVUSSwgUkVUWCwgUkVUTiwgUkVURSwgRU1VREFUXT4geworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIEFMTENsYXNzOjppdGVyYXRvcgorICAgIEFMTENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICAgICAgcmV0dXJuIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oTUYpCisgICAgICAgICAgICAgKyAoUkktPmhhc0ZQKE1GKSA/IDMxIDogMzApOworICAgIH0KKyAgfV07Cit9CisKK2RlZiBQSSA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kzMl0sIDMyLAorICAgIFtQMCwgUDEsIFAyLCBQMywgUDQsIFA1LCBJMCwgSTEsIEkyLCBJMywgRlAsIFNQXT4geworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIFBJQ2xhc3M6Oml0ZXJhdG9yCisgICAgUElDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsKKyAgICAgIHJldHVybiBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKE1GKQorICAgICAgICAgICAgICsgKFJJLT5oYXNGUChNRikgPyAxMSA6IDEwKTsKKyAgICB9CisgIH1dOworfQorCisvLyBXZSBhcmUgZ29pbmcgdG8gcHJldGVuZCB0aGF0IENDIGFuZCAhQ0MgYXJlIDMyLWJpdCByZWdpc3RlcnMsIGV2ZW4gdGhvdWdoCisvLyB0aGV5IG9ubHkgY2FuIGhvbGQgMSBiaXQuCitsZXQgQ29weUNvc3QgPSAtMSwgU2l6ZSA9IDggaW4geworZGVmIEp1c3RDQyAgOiBSZWdpc3RlckNsYXNzPCJCRiIsIFtpMzJdLCA4LCBbQ0NdPjsKK2RlZiBOb3RDQyAgIDogUmVnaXN0ZXJDbGFzczwiQkYiLCBbaTMyXSwgOCwgW05DQ10+OworZGVmIEFueUNDICAgOiBSZWdpc3RlckNsYXNzPCJCRiIsIFtpMzJdLCA4LCBbQ0MsIE5DQ10+IHsKKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIH1dOworICBsZXQgTWV0aG9kQm9kaWVzID0gW3sKKyAgICBBbnlDQ0NsYXNzOjppdGVyYXRvcgorICAgIEFueUNDQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKE1GKSsxOworICAgIH0KKyAgfV07Cit9CitkZWYgU3RhdEJpdCA6IFJlZ2lzdGVyQ2xhc3M8IkJGIiwgW2kxXSwgOCwKKyAgICBbQVosIEFOLCBDQywgQVEsIEFDMCwgQUMxLCBBVjAsIEFWMFMsIEFWMSwgQVYxUywgViwgVlNdPjsKK30KKworLy8gU2hvdWxkIGJlIGk0MCwgYnV0IHRoYXQgaXNuJ3QgZGVmaW5lZC4gSXQgaXMgbm90IGEgbGVnYWwgdHlwZSB5ZXQgYW55d2F5LgorZGVmIEFjY3UgOiBSZWdpc3RlckNsYXNzPCJCRiIsIFtpNjRdLCA2NCwgW0EwLCBBMV0+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblNlbGVjdGlvbkRBR0luZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblNlbGVjdGlvbkRBR0luZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMWY2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluU2VsZWN0aW9uREFHSW5mby5jcHAKQEAgLTAsMCArMSwyNCBAQAorLy89PT0tLSBCbGFja2ZpblNlbGVjdGlvbkRBR0luZm8uY3BwIC0gQmxhY2tmaW4gU2VsZWN0aW9uREFHIEluZm8gLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQmxhY2tmaW5TZWxlY3Rpb25EQUdJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYmxhY2tmaW4tc2VsZWN0aW9uZGFnLWluZm8iCisjaW5jbHVkZSAiQmxhY2tmaW5UYXJnZXRNYWNoaW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworQmxhY2tmaW5TZWxlY3Rpb25EQUdJbmZvOjpCbGFja2ZpblNlbGVjdGlvbkRBR0luZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxhY2tmaW5UYXJnZXRNYWNoaW5lICZUTSkKKyAgOiBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvKFRNKSB7Cit9CisKK0JsYWNrZmluU2VsZWN0aW9uREFHSW5mbzo6fkJsYWNrZmluU2VsZWN0aW9uREFHSW5mbygpIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5TZWxlY3Rpb25EQUdJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluU2VsZWN0aW9uREFHSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxY2UzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluU2VsZWN0aW9uREFHSW5mby5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LS0gQmxhY2tmaW5TZWxlY3Rpb25EQUdJbmZvLmggLSBCbGFja2ZpbiBTZWxlY3Rpb25EQUcgSW5mbyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEJsYWNrZmluIHN1YmNsYXNzIGZvciBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQkxBQ0tGSU5TRUxFQ1RJT05EQUdJTkZPX0gKKyNkZWZpbmUgQkxBQ0tGSU5TRUxFQ1RJT05EQUdJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBR0luZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCbGFja2ZpblRhcmdldE1hY2hpbmU7CisKK2NsYXNzIEJsYWNrZmluU2VsZWN0aW9uREFHSW5mbyA6IHB1YmxpYyBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQmxhY2tmaW5TZWxlY3Rpb25EQUdJbmZvKGNvbnN0IEJsYWNrZmluVGFyZ2V0TWFjaGluZSAmVE0pOworICB+QmxhY2tmaW5TZWxlY3Rpb25EQUdJbmZvKCk7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblN1YnRhcmdldC5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluU3VidGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTA0YzUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblN1YnRhcmdldC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tIEJsYWNrZmluU3VidGFyZ2V0LmNwcCAtIEJMQUNLRklOIFN1YnRhcmdldCBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgYmxhY2tmaW4gc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0U3VidGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJCbGFja2ZpblN1YnRhcmdldC5oIgorI2luY2x1ZGUgIkJsYWNrZmluR2VuU3VidGFyZ2V0LmluYyIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK0JsYWNrZmluU3VidGFyZ2V0OjpCbGFja2ZpblN1YnRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKQorICA6IHNkcmFtKGZhbHNlKSwKKyAgICBpY3BsYihmYWxzZSksCisgICAgd2FfbWlfc2hpZnQoZmFsc2UpLAorICAgIHdhX2NzeW5jKGZhbHNlKSwKKyAgICB3YV9zcGVjbGQoZmFsc2UpLAorICAgIHdhX21tcl9zdGFsbChmYWxzZSksCisgICAgd2FfbGNyZWdzKGZhbHNlKSwKKyAgICB3YV9od2xvb3AoZmFsc2UpLAorICAgIHdhX2luZF9jYWxsKGZhbHNlKSwKKyAgICB3YV9raWxsZWRfbW1yKGZhbHNlKSwKKyAgICB3YV9yZXRzKGZhbHNlKQoreworICBzdGQ6OnN0cmluZyBDUFUgPSAiZ2VuZXJpYyI7CisgIC8vIFBhcnNlIGZlYXR1cmVzIHN0cmluZy4KKyAgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhGUywgQ1BVKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5TdWJ0YXJnZXQuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5TdWJ0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjY3ZmUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblN1YnRhcmdldC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LSBCbGFja2ZpblN1YnRhcmdldC5oIC0gRGVmaW5lIFN1YnRhcmdldCBmb3IgdGhlIEJsYWNrZmluIC0qLSBDKysgLSotPT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBCTEFDS0ZJTiBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBCTEFDS0ZJTl9TVUJUQVJHRVRfSAorI2RlZmluZSBCTEFDS0ZJTl9TVUJUQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgQmxhY2tmaW5TdWJ0YXJnZXQgOiBwdWJsaWMgVGFyZ2V0U3VidGFyZ2V0IHsKKyAgICBib29sIHNkcmFtOworICAgIGJvb2wgaWNwbGI7CisgICAgYm9vbCB3YV9taV9zaGlmdDsKKyAgICBib29sIHdhX2NzeW5jOworICAgIGJvb2wgd2Ffc3BlY2xkOworICAgIGJvb2wgd2FfbW1yX3N0YWxsOworICAgIGJvb2wgd2FfbGNyZWdzOworICAgIGJvb2wgd2FfaHdsb29wOworICAgIGJvb2wgd2FfaW5kX2NhbGw7CisgICAgYm9vbCB3YV9raWxsZWRfbW1yOworICAgIGJvb2wgd2FfcmV0czsKKyAgcHVibGljOgorICAgIEJsYWNrZmluU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKKworICAgIC8vLyBQYXJzZVN1YnRhcmdldEZlYXR1cmVzIC0gUGFyc2VzIGZlYXR1cmVzIHN0cmluZyBzZXR0aW5nIHNwZWNpZmllZAorICAgIC8vLyBzdWJ0YXJnZXQgb3B0aW9ucy4gIERlZmluaXRpb24gb2YgZnVuY3Rpb24gaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGJsZ2VuLgorICAgIHN0ZDo6c3RyaW5nIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcgJkZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkNQVSk7CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblRhcmdldE1hY2hpbmUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9CbGFja2ZpblRhcmdldE1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTJmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluVGFyZ2V0TWFjaGluZS5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tLSBCbGFja2ZpblRhcmdldE1hY2hpbmUuY3BwIC0gRGVmaW5lIFRhcmdldE1hY2hpbmUgZm9yIEJsYWNrZmluIC0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkJsYWNrZmluVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIkJsYWNrZmluLmgiCisjaW5jbHVkZSAiQmxhY2tmaW5NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUJsYWNrZmluVGFyZ2V0KCkgeworICBSZWdpc3RlclRhcmdldE1hY2hpbmU8QmxhY2tmaW5UYXJnZXRNYWNoaW5lPiBYKFRoZUJsYWNrZmluVGFyZ2V0KTsKKyAgUmVnaXN0ZXJBc21JbmZvPEJsYWNrZmluTUNBc21JbmZvPiBZKFRoZUJsYWNrZmluVGFyZ2V0KTsKKworfQorCitCbGFja2ZpblRhcmdldE1hY2hpbmU6OkJsYWNrZmluVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpCisgIDogTExWTVRhcmdldE1hY2hpbmUoVCwgVFQpLAorICAgIERhdGFMYXlvdXQoImUtcDozMjozMi1pNjQ6MzItZjY0OjMyLW4zMiIpLAorICAgIFN1YnRhcmdldChUVCwgRlMpLAorICAgIFRMSW5mbygqdGhpcyksCisgICAgVFNJbmZvKCp0aGlzKSwKKyAgICBJbnN0ckluZm8oU3VidGFyZ2V0KSwKKyAgICBGcmFtZUluZm8oVGFyZ2V0RnJhbWVJbmZvOjpTdGFja0dyb3dzRG93biwgNCwgMCkgeworfQorCitib29sIEJsYWNrZmluVGFyZ2V0TWFjaGluZTo6YWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIFBNLmFkZChjcmVhdGVCbGFja2ZpbklTZWxEYWcoKnRoaXMsIE9wdExldmVsKSk7CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQmxhY2tmaW5UYXJnZXRNYWNoaW5lLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluVGFyZ2V0TWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2M2FhNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL0JsYWNrZmluVGFyZ2V0TWFjaGluZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vPT09LS0gQmxhY2tmaW5UYXJnZXRNYWNoaW5lLmggLSBUYXJnZXRNYWNoaW5lIGZvciBCbGFja2ZpbiAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBCbGFja2ZpbiBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRNYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQkxBQ0tGSU5UQVJHRVRNQUNISU5FX0gKKyNkZWZpbmUgQkxBQ0tGSU5UQVJHRVRNQUNISU5FX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAiQmxhY2tmaW5JbnN0ckluZm8uaCIKKyNpbmNsdWRlICJCbGFja2ZpblN1YnRhcmdldC5oIgorI2luY2x1ZGUgIkJsYWNrZmluSVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiQmxhY2tmaW5TZWxlY3Rpb25EQUdJbmZvLmgiCisjaW5jbHVkZSAiQmxhY2tmaW5JbnRyaW5zaWNJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBCbGFja2ZpblRhcmdldE1hY2hpbmUgOiBwdWJsaWMgTExWTVRhcmdldE1hY2hpbmUgeworICAgIGNvbnN0IFRhcmdldERhdGEgRGF0YUxheW91dDsKKyAgICBCbGFja2ZpblN1YnRhcmdldCBTdWJ0YXJnZXQ7CisgICAgQmxhY2tmaW5UYXJnZXRMb3dlcmluZyBUTEluZm87CisgICAgQmxhY2tmaW5TZWxlY3Rpb25EQUdJbmZvIFRTSW5mbzsKKyAgICBCbGFja2Zpbkluc3RySW5mbyBJbnN0ckluZm87CisgICAgVGFyZ2V0RnJhbWVJbmZvIEZyYW1lSW5mbzsKKyAgICBCbGFja2ZpbkludHJpbnNpY0luZm8gSW50cmluc2ljSW5mbzsKKyAgcHVibGljOgorICAgIEJsYWNrZmluVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKKworICAgIHZpcnR1YWwgY29uc3QgQmxhY2tmaW5JbnN0ckluZm8gKmdldEluc3RySW5mbygpIGNvbnN0IHsgcmV0dXJuICZJbnN0ckluZm87IH0KKyAgICB2aXJ0dWFsIGNvbnN0IFRhcmdldEZyYW1lSW5mbyAqZ2V0RnJhbWVJbmZvKCkgY29uc3QgeyByZXR1cm4gJkZyYW1lSW5mbzsgfQorICAgIHZpcnR1YWwgY29uc3QgQmxhY2tmaW5TdWJ0YXJnZXQgKmdldFN1YnRhcmdldEltcGwoKSBjb25zdCB7CisgICAgICByZXR1cm4gJlN1YnRhcmdldDsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBCbGFja2ZpblJlZ2lzdGVySW5mbyAqZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeworICAgICAgcmV0dXJuICZJbnN0ckluZm8uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgQmxhY2tmaW5UYXJnZXRMb3dlcmluZyogZ2V0VGFyZ2V0TG93ZXJpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gJlRMSW5mbzsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBCbGFja2ZpblNlbGVjdGlvbkRBR0luZm8qIGdldFNlbGVjdGlvbkRBR0luZm8oKSBjb25zdCB7CisgICAgICByZXR1cm4gJlRTSW5mbzsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBUYXJnZXREYXRhICpnZXRUYXJnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gJkRhdGFMYXlvdXQ7IH0KKyAgICB2aXJ0dWFsIGJvb2wgYWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisgICAgY29uc3QgVGFyZ2V0SW50cmluc2ljSW5mbyAqZ2V0SW50cmluc2ljSW5mbygpIGNvbnN0IHsKKyAgICAgIHJldHVybiAmSW50cmluc2ljSW5mbzsKKyAgICB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4NDdkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNCBAQAorc2V0KExMVk1fVEFSR0VUX0RFRklOSVRJT05TIEJsYWNrZmluLnRkKQorCit0YWJsZWdlbihCbGFja2ZpbkdlblJlZ2lzdGVySW5mby5oLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MtaGVhZGVyKQordGFibGVnZW4oQmxhY2tmaW5HZW5SZWdpc3Rlck5hbWVzLmluYyAtZ2VuLXJlZ2lzdGVyLWVudW1zKQordGFibGVnZW4oQmxhY2tmaW5HZW5SZWdpc3RlckluZm8uaW5jIC1nZW4tcmVnaXN0ZXItZGVzYykKK3RhYmxlZ2VuKEJsYWNrZmluR2VuSW5zdHJOYW1lcy5pbmMgLWdlbi1pbnN0ci1lbnVtcykKK3RhYmxlZ2VuKEJsYWNrZmluR2VuSW5zdHJJbmZvLmluYyAtZ2VuLWluc3RyLWRlc2MpCit0YWJsZWdlbihCbGFja2ZpbkdlbkFzbVdyaXRlci5pbmMgLWdlbi1hc20td3JpdGVyKQordGFibGVnZW4oQmxhY2tmaW5HZW5EQUdJU2VsLmluYyAtZ2VuLWRhZy1pc2VsKQordGFibGVnZW4oQmxhY2tmaW5HZW5TdWJ0YXJnZXQuaW5jIC1nZW4tc3VidGFyZ2V0KQordGFibGVnZW4oQmxhY2tmaW5HZW5DYWxsaW5nQ29udi5pbmMgLWdlbi1jYWxsaW5nY29udikKK3RhYmxlZ2VuKEJsYWNrZmluR2VuSW50cmluc2ljcy5pbmMgLWdlbi10Z3QtaW50cmluc2ljKQorCithZGRfbGx2bV90YXJnZXQoQmxhY2tmaW5Db2RlR2VuCisgIEJsYWNrZmluSW5zdHJJbmZvLmNwcAorICBCbGFja2ZpbkludHJpbnNpY0luZm8uY3BwCisgIEJsYWNrZmluSVNlbERBR1RvREFHLmNwcAorICBCbGFja2ZpbklTZWxMb3dlcmluZy5jcHAKKyAgQmxhY2tmaW5NQ0FzbUluZm8uY3BwCisgIEJsYWNrZmluUmVnaXN0ZXJJbmZvLmNwcAorICBCbGFja2ZpblN1YnRhcmdldC5jcHAKKyAgQmxhY2tmaW5UYXJnZXRNYWNoaW5lLmNwcAorICBCbGFja2ZpblNlbGVjdGlvbkRBR0luZm8uY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWJlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L0JsYWNrZmluL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUJsYWNrZmluQ29kZUdlbgorVEFSR0VUID0gQmxhY2tmaW4KKworIyBNYWtlIHN1cmUgdGhhdCB0YmxnZW4gaXMgcnVuLCBmaXJzdCB0aGluZy4KK0JVSUxUX1NPVVJDRVMgPSBCbGFja2ZpbkdlblJlZ2lzdGVySW5mby5oLmluYyBCbGFja2ZpbkdlblJlZ2lzdGVyTmFtZXMuaW5jIFwKKyAgICAgICAgICAgICAgICBCbGFja2ZpbkdlblJlZ2lzdGVySW5mby5pbmMgQmxhY2tmaW5HZW5JbnN0ck5hbWVzLmluYyBcCisgICAgICAgICAgICAgICAgQmxhY2tmaW5HZW5JbnN0ckluZm8uaW5jIEJsYWNrZmluR2VuQXNtV3JpdGVyLmluYyBcCisgICAgICAgICAgICAgICAgQmxhY2tmaW5HZW5EQUdJU2VsLmluYyBCbGFja2ZpbkdlblN1YnRhcmdldC5pbmMgXAorCQlCbGFja2ZpbkdlbkNhbGxpbmdDb252LmluYyBCbGFja2ZpbkdlbkludHJpbnNpY3MuaW5jCisKK0RJUlMgPSBBc21QcmludGVyIFRhcmdldEluZm8KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9SRUFETUUudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YzgyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL1JFQURNRS50eHQKQEAgLTAsMCArMSwyNDQgQEAKKy8vPT09LS0gUkVBRE1FLnR4dCAtIE5vdGVzIGZvciBCbGFja2ZpbiBUYXJnZXQgLS0tLS0tLS0tLS0tLS0tLS0tKi0gb3JnIC0qLT09PS8vCisKKyogQ29uZGl0aW9uIGNvZGVzCisqKiBET05FIFByb2JsZW0gd2l0aCBhc3ltbWV0cmljIFNFVENDIG9wZXJhdGlvbnMKK1RoZSBpbnN0cnVjdGlvbgorCisgIENDID0gUjAgPCAyCisKK2lzIG5vdCBzeW1tZXRyaWMgLSB0aGVyZSBpcyBubyBSMCA+IDIgaW5zdHJ1Y3Rpb24uIE9uIHRoZSBvdGhlciBoYW5kLCBJRiBDQworSlVNUCBjYW4gdGFrZSBib3RoIENDIGFuZCAhQ0MgYXMgYSBjb25kaXRpb24uIFdlIGNhbm5vdCBwYXR0ZXJuLW1hdGNoIChicmNvbmQKKyhub3QgY2MpLCB0YXJnZXQpLCB0aGUgREFHIG9wdGltaXplciByZW1vdmVzIHRoYXQga2luZCBvZiB0aGluZy4KKworVGhpcyBpcyBoYW5kbGVkIGJ5IGNyZWF0aW5nIGEgcHNldWRvLXJlZ2lzdGVyIE5DQyB0aGF0IGFsaWFzZXMgQ0MuIFJlZ2lzdGVyCitjbGFzc2VzIEp1c3RDQyBhbmQgTm90Q0MgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgaW52ZXJzaW9uIG9mIENDLgorCisqKiBET05FIENDIGFzIGFuIGkzMiByZWdpc3RlcgorVGhlIEFueUNDIHJlZ2lzdGVyIGNsYXNzIHByZXRlbmRzIHRvIGhvbGQgaTMyIHZhbHVlcy4gSXQgY2FuIG9ubHkgcmVwcmVzZW50IHRoZQordmFsdWVzIDAgYW5kIDEsIGJ1dCB3ZSBjYW4gY29weSB0byBhbmQgZnJvbSB0aGUgRCBjbGFzcy4gVGhpcyBoYWNrIG1ha2VzIGl0Citwb3NzaWJsZSB0byByZXByZXNlbnQgdGhlIHNldGNjIGluc3RydWN0aW9uIHdpdGhvdXQgaGF2aW5nIGkxIGFzIGEgbGVnYWwgdHlwZS4KKworSW4gbW9zdCBjYXNlcywgdGhlIENDIHJlZ2lzdGVyIGlzIHNldCBieSBhICJDQyA9IC4uIiBvciBCSVRUU1QgaW5zdHJ1Y3Rpb24sIGFuZAordGhlbiB1c2VkIGluIGEgY29uZGl0aW9uYWwgYnJhbmNoIG9yIG1vdmUuIFRoZSBjb2RlIGdlbmVyYXRvciB0aGlua3MgaXQgaXMKK21vdmluZyAzMiBiaXRzLCBidXQgdGhlIHZhbHVlIHN0YXlzIGluIENDLiBJbiBvdGhlciBjYXNlcywgdGhlIHJlc3VsdCBvZiBhCitjb21wYXJpc29uIGlzIGFjdHVhbGx5IHVzZWQgYXMgYW0gaTMyIG51bWJlciwgYW5kIENDIHdpbGwgYmUgY29waWVkIHRvIGEgRAorcmVnaXN0ZXIuCisKKyogU3RhY2sgZnJhbWVzCisqKiBUT0RPIFVzZSBQdXNoL1BvcCBpbnN0cnVjdGlvbnMKK1dlIHNob3VsZCB1c2UgdGhlIHB1c2gvcG9wIGluc3RydWN0aW9ucyB3aGVuIHNhdmluZyBjYWxsZWUtc2F2ZWQKK3JlZ2lzdGVycy4gVGhlIGFyZSBzbWFsbGVyLCBhbmQgd2UgbWF5IGV2ZW4gdXNlIHB1c2ggbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zLgorCisqKiBUT0RPIHJlcXVpcmVzUmVnaXN0ZXJTY2F2ZW5naW5nCitXZSBuZWVkIG1vcmUgaW50ZWxsaWdlbmNlIGluIGRldGVybWluaW5nIHdoZW4gdGhlIHNjYXZlbmdlciBpcyBuZWVkZWQuIFdlCitzaG91bGQga2VlcCB0cmFjayBvZjoKKy0gU3BpbGxpbmcgRDE2IHJlZ2lzdGVycworLSBTcGlsbGluZyBBbnlDQyByZWdpc3RlcnMKKworKiBBc3NlbWJsZXIKKyoqIFRPRE8gSW1wbGVtZW50IFByaW50R2xvYmFsVmFyaWFibGUKKyoqIFRPRE8gUmVtb3ZlIExPQUQzMnN5bQorSXQncyBhIGhhY2sgY29tYmluaW5nIHR3byBpbnN0cnVjdGlvbnMgYnkgY29uY2F0ZW5hdGlvbi4KKworKiBJbmxpbmUgQXNzZW1ibHkKKworVGhlc2UgYXJlIHRoZSBHQ0MgY29uc3RyYWludHMgZnJvbSBiZmluL2NvbnN0cmFpbnRzLm1kOgorCit8IENvZGUgIHwgUmVnaXN0ZXIgY2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTFZNIHwKK3wtLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tfAorfCBhICAgICB8IFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQyAgICB8Cit8IGQgICAgIHwgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDICAgIHwKK3wgeiAgICAgfCBDYWxsIGNsb2JiZXJlZCBQIChQMCwgUDEsIFAyKSAgICAgICAgICAgICB8IFggICAgfAorfCBEICAgICB8IEV2ZW5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWCAgICB8Cit8IFcgICAgIHwgT2RkRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYICAgIHwKK3wgZSAgICAgfCBBY2N1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEMgICAgfAorfCBBICAgICB8IEEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUyAgICB8Cit8IEIgICAgIHwgQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTICAgIHwKK3wgYiAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEMgICAgfAorfCB2ICAgICB8IEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQyAgICB8Cit8IGYgICAgIHwgTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDICAgIHwKK3wgYyAgICAgfCBDaXJjdWxhciBJLCBCLCBMICAgICAgICAgICAgICAgICAgICAgICAgICB8IFggICAgfAorfCBDICAgICB8IEp1c3RDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUyAgICB8Cit8IHQgICAgIHwgTG9vcFRvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYICAgIHwKK3wgdSAgICAgfCBMb29wQm90dG9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFggICAgfAorfCBrICAgICB8IExvb3BDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWCAgICB8Cit8IHggICAgIHwgR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDICAgIHwKK3wgeSAgICAgfCBSRVQqLCBBU1RBVCwgU0VRU1RBVCwgVVNQICAgICAgICAgICAgICAgICB8IFggICAgfAorfCB3ICAgICB8IEFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQyAgICB8Cit8IFogICAgIHwgVGhlIEZELVBJQyBHT1QgcG9pbnRlciAoUDMpICAgICAgICAgICAgICAgfCBTICAgIHwKK3wgWSAgICAgfCBUaGUgRkQtUElDIGZ1bmN0aW9uIHBvaW50ZXIgcmVnaXN0ZXIgKFAxKSB8IFMgICAgfAorfCBxMC1xNyB8IFIwLVI3IGluZGl2aWR1YWxseSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8Cit8IHFBICAgIHwgUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwKK3wtLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tfAorfCBDb2RlICB8IENvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8Cit8LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLXwKK3wgSiAgICAgfCAxPDxOLCBOPDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfAorfCBLczMgICB8IGltbTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8Cit8IEt1MyAgIHwgdWltbTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwKK3wgS3M0ICAgfCBpbW00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfAorfCBLdTQgICB8IHVpbW00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8Cit8IEtzNSAgIHwgaW1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwKK3wgS3U1ICAgfCB1aW1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfAorfCBLczcgICB8IGltbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8Cit8IEtONyAgIHwgLWltbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwKK3wgS3NoICAgfCBpbW0xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfAorfCBLdWggICB8IHVpbW0xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8Cit8IEwgICAgIHwgfigxPDxOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwKK3wgTTEgICAgfCAweGZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfAorfCBNMiAgICB8IDB4ZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8Cit8IFAwLVA0IHwgMC00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwKK3wgUEEgICAgfCBNYWNmbGFnLCBub3QgTSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfAorfCBQQiAgICB8IE1hY2ZsYWcsIG9ubHkgTSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8Cit8IFEgICAgIHwgU3ltYm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwKKworKiogVE9ETyBTdXBwb3J0IGFsbCByZWdpc3RlciBjbGFzc2VzCisqIERBRyBjb21iaW5lcgorKiogQ3JlYXRlIHRlc3QgY2FzZSBmb3IgZWFjaCBJbGxlZ2FsIFNFVENDIGNhc2UKK1RoZSBEQUcgY29tYmluZXIgbWF5IHNvbWVpbWVzIHByb2R1Y2UgaWxsZWdhbCBpMTYgU0VUQ0MgaW5zdHJ1Y3Rpb25zLgorCisqKiogVE9ETyBTRVRDQyAoY3RseiB4KSwgNSkgPT0gY29uc3QKKyoqKiBUT0RPIFNFVENDIChhbmQgbG9hZCwgY29uc3QpID09IGNvbnN0CisqKiogRE9ORSBTRVRDQyAoemV4dCB4KSA9PSBjb25zdAorKioqIFRPRE8gU0VUQ0MgKHNleHQgeCkgPT0gY29uc3QKKworKiBJbnN0cnVjdGlvbiBzZWxlY3Rpb24KKyoqIFRPRE8gQmV0dGVyIGltZWRpYXRlIGNvbnN0YW50cworTGlrZSBBUk0sIGJ1aWxkIGNvbnN0YW50cyBhcyBzbWFsbCBpbW0gKyBzaGlmdC4KKworKiogVE9ETyBJbXBsZW1lbnQgY3ljbGUgY291bnRlcgorV2UgaGF2ZSBDWUNMRVMgYW5kIENZQ0xFUzIgcmVnaXN0ZXJzLCBidXQgdGhlIHJlYWRjeWNsZWNvdW50ZXIgaW50cmluc2ljIHdhbnRzCit0byByZXR1cm4gaTY0LCBhbmQgdGhlIGNvZGUgZ2VuZXJhdG9yIGRvZXNuJ3Qga25vdyBob3cgdG8gbGVnYWxpemUgdGhhdC4KKworKiogVE9ETyBJbnN0cnVjdGlvbiBhbHRlcm5hdGl2ZXMKK1NvbWUgaW5zdHJ1Y3Rpb25zIGNvbWUgaW4gZGlmZmVyZW50IHZhcmlhbnRzIGZvciBleGFtcGxlOgorCisgIEQgPSBEICsgRAorICBQID0gUCArIFAKKworQ3Jvc3MgY29tYmluYXRpb25zIGFyZSBub3QgYWxsb3dlZDoKKworICBQID0gRCArIEQgKGJhZCkKKworU2ltaWxhcmx5IGZvciB0aGUgc3VicmVnIHBzZXVkby1pbnN0cnVjdGlvbnM6CisKKyBEMTZMID0gRVhUUkFDVF9TVUJSRUcgRDE2LCBiZmluX3N1YnJlZ19sbzE2CisgUDE2TCA9IEVYVFJBQ1RfU1VCUkVHIFAxNiwgYmZpbl9zdWJyZWdfbG8xNgorCitXZSB3YW50IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBhbHRlcm5hdGl2ZSBpbnN0cnVjdGlvbnMuIFRoaXMgY291bGQgYmUgZG9uZSBieQorY2hhbmdpbmcgdGhlIERBRyBhZnRlciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisKKworKiogTXVsdGlwYXR0ZXJucyBmb3IgbG9hZC9zdG9yZQorV2Ugc2hvdWxkIHRyeSB0byBpZGVudGlmeSBtdWx0aXBhdHRlcm5zIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMuIFRoZQorYXZhaWxhYmxlIGluc3RydWN0aW9uIG1hdHJpeCBpcyBhIGJpdCBpcnJlZ3VsYXIuCisKK0xvYWRzOgorCit8IEFkZHIgICAgICAgfCBEIHwgUCB8IEQgMTZ6IHwgRCAxNnMgfCBEMTYgfCBEIDh6IHwgRCA4cyB8Cit8LS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLS18Cit8IFAgICAgICAgICAgfCAqIHwgKiB8ICogICAgIHwgKiAgICAgfCAqICAgfCAqICAgIHwgKiAgICB8Cit8IFArKyAgICAgICAgfCAqIHwgKiB8ICogICAgIHwgKiAgICAgfCAgICAgfCAqICAgIHwgKiAgICB8Cit8IFAtLSAgICAgICAgfCAqIHwgKiB8ICogICAgIHwgKiAgICAgfCAgICAgfCAqICAgIHwgKiAgICB8Cit8IFArdWltbTVtMiAgfCAgIHwgICB8ICogICAgIHwgKiAgICAgfCAgICAgfCAgICAgIHwgICAgICB8Cit8IFArdWltbTZtNCAgfCAqIHwgKiB8ICAgICAgIHwgICAgICAgfCAgICAgfCAgICAgIHwgICAgICB8Cit8IFAraW1tMTYgICAgfCAgIHwgICB8ICAgICAgIHwgICAgICAgfCAgICAgfCAqICAgIHwgKiAgICB8Cit8IFAraW1tMTdtMiAgfCAgIHwgICB8ICogICAgIHwgKiAgICAgfCAgICAgfCAgICAgIHwgICAgICB8Cit8IFAraW1tMThtNCAgfCAqIHwgKiB8ICAgICAgIHwgICAgICAgfCAgICAgfCAgICAgIHwgICAgICB8Cit8IFArK1AgICAgICAgfCAqIHwgICB8ICogICAgIHwgKiAgICAgfCAqICAgfCAgICAgIHwgICAgICB8Cit8IEZQLXVpbW03bTQgfCAqIHwgKiB8ICAgICAgIHwgICAgICAgfCAgICAgfCAgICAgIHwgICAgICB8Cit8IEkgICAgICAgICAgfCAqIHwgICB8ICAgICAgIHwgICAgICAgfCAqICAgfCAgICAgIHwgICAgICB8Cit8IEkrKyAgICAgICAgfCAqIHwgICB8ICAgICAgIHwgICAgICAgfCAqICAgfCAgICAgIHwgICAgICB8Cit8IEktLSAgICAgICAgfCAqIHwgICB8ICAgICAgIHwgICAgICAgfCAqICAgfCAgICAgIHwgICAgICB8Cit8IEkrK00gICAgICAgfCAqIHwgICB8ICAgICAgIHwgICAgICAgfCAgICAgfCAgICAgIHwgICAgICB8CisKK1N0b3JlczoKKworfCBBZGRyICAgICAgIHwgRCB8IFAgfCBEMTZIIHwgRDE2TCB8IEQgOCB8Cit8LS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tLS0tKy0tLS0tLSstLS0tLXwKK3wgUCAgICAgICAgICB8ICogfCAqIHwgKiAgICB8ICogICAgfCAqICAgfAorfCBQKysgICAgICAgIHwgKiB8ICogfCAgICAgIHwgKiAgICB8ICogICB8Cit8IFAtLSAgICAgICAgfCAqIHwgKiB8ICAgICAgfCAqICAgIHwgKiAgIHwKK3wgUCt1aW1tNW0yICB8ICAgfCAgIHwgICAgICB8ICogICAgfCAgICAgfAorfCBQK3VpbW02bTQgIHwgKiB8ICogfCAgICAgIHwgICAgICB8ICAgICB8Cit8IFAraW1tMTYgICAgfCAgIHwgICB8ICAgICAgfCAgICAgIHwgKiAgIHwKK3wgUCtpbW0xN20yICB8ICAgfCAgIHwgICAgICB8ICogICAgfCAgICAgfAorfCBQK2ltbTE4bTQgIHwgKiB8ICogfCAgICAgIHwgICAgICB8ICAgICB8Cit8IFArK1AgICAgICAgfCAqIHwgICB8ICogICAgfCAqICAgIHwgICAgIHwKK3wgRlAtdWltbTdtNCB8ICogfCAqIHwgICAgICB8ICAgICAgfCAgICAgfAorfCBJICAgICAgICAgIHwgKiB8ICAgfCAqICAgIHwgKiAgICB8ICAgICB8Cit8IEkrKyAgICAgICAgfCAqIHwgICB8ICogICAgfCAqICAgIHwgICAgIHwKK3wgSS0tICAgICAgICB8ICogfCAgIHwgKiAgICB8ICogICAgfCAgICAgfAorfCBJKytNICAgICAgIHwgKiB8ICAgfCAgICAgIHwgICAgICB8ICAgICB8CisKKyogV29ya2Fyb3VuZHMgYW5kIGZlYXR1cmVzCitCbGFja2ZpbiBDUFVzIGhhdmUgYnVncy4gRWFjaCBtb2RlbCBjb21lcyBpbiBhIG51bWJlciBvZiBzaWxpY29uIHJldmlzaW9ucyB3aXRoCitkaWZmZXJlbnQgYnVncy4gV2UgbGVhcm4gYWJvdXQgdGhlIENQVSBtb2RlbCBmcm9tIHRoZSAtbWNwdSBzd2l0Y2guCisKKyoqIEludGVycHJldGF0aW9uIG9mIC1tY3B1IHZhbHVlCistIC1tY3B1PWJmNTI3IHJlZmVycyB0byB0aGUgbGF0ZXN0IGtub3duIEJGNTI3IHJldmlzaW9uCistIC1tY3B1PWJmNTI3LTAuMiByZWZlcnMgdG8gc2lsaWNvbiByZXYuIDAuMgorLSAtbWNwdT1iZjUyNy1hbnkgcmVmZXJzIHRvIGFsbCBrbm93biByZXZpc2lvbnMKKy0gLW1jcHU9YmY1Mjctbm9uZSBkaXNhYmxlcyBhbGwgd29ya2Fyb3VuZHMKKworVGhlIC1tY3B1IHNldHRpbmcgYWZmZWN0cyB0aGUgX19TSUxJQ09OX1JFVklTSU9OX18gbWFjcm8gYW5kIGVuYWJsZWQgd29ya2Fyb3VuZHM6CisKK3wgLW1jcHUgICAgICB8IF9fU0lMSUNPTl9SRVZJU0lPTl9fIHwgV29ya2Fyb3VuZHMgICAgICAgIHwKK3wtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYmY1MjcgICAgICB8IERlZiBMYXRlc3QgICAgICAgICAgIHwgU3BlY2lmaWMgdG8gbGF0ZXN0IHwKK3wgYmY1MjctMS4zICB8IERlZiAweDAxMDMgICAgICAgICAgIHwgU3BlY2lmaWMgdG8gMS4zICAgIHwKK3wgYmY1MjctYW55ICB8IERlZiAweGZmZmYgICAgICAgICAgIHwgQWxsIGJmNTI3LXgueSAgICAgIHwKK3wgYmY1Mjctbm9uZSB8IFVuZGVmaW5lZCAgICAgICAgICAgIHwgTm9uZSAgICAgICAgICAgICAgIHwKKworVGhlc2UgYXJlIHRoZSBrbm93biBjb3JlcyBhbmQgcmV2aXNpb25zOgorCit8IENvcmUgICAgICAgIHwgU2lsaWNvbiAgICAgICAgICAgIHwgUHJvY2Vzc29ycyAgICAgICAgICAgICAgfAorfC0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgRWRpbmJ1cmdoICAgfCAwLjMsIDAuNCwgMC41LCAwLjYgfCBCRjUzMSBCRjUzMiBCRjUzMyAgICAgICB8Cit8IEJyYWVtYXIgICAgIHwgMC4yLCAwLjMgICAgICAgICAgIHwgQkY1MzQgQkY1MzYgQkY1MzcgICAgICAgfAorfCBTdGlybGluZyAgICB8IDAuMywgMC40LCAwLjUgICAgICB8IEJGNTM4IEJGNTM5ICAgICAgICAgICAgIHwKK3wgTW9hYiAgICAgICAgfCAwLjAsIDAuMSwgMC4yICAgICAgfCBCRjU0MiBCRjU0NCBCRjU0OCBCRjU0OSB8Cit8IFRldG9uICAgICAgIHwgMC4zLCAwLjUgICAgICAgICAgIHwgQkY1NjEgICAgICAgICAgICAgICAgICAgfAorfCBLb29rYWJ1cnJhICB8IDAuMCwgMC4xLCAwLjIgICAgICB8IEJGNTIzIEJGNTI1IEJGNTI3ICAgICAgIHwKK3wgTW9ja2luZ2JpcmQgfCAwLjAsIDAuMSAgICAgICAgICAgfCBCRjUyMiBCRjUyNCBCRjUyNiAgICAgICB8Cit8IEJyb2RpZSAgICAgIHwgMC4wLCAwLjEgICAgICAgICAgIHwgQkY1MTIgQkY1MTQgQkY1MTYgQkY1MTggfAorCisKKyoqIENvbXBpbGVyIGltcGxlbWVudGVkIHdvcmthcm91bmRzCitNb3N0IHdvcmthcm91bmRzIGFyZSBpbXBsZW1lbnRlZCBpbiBoZWFkZXIgZmlsZXMgYW5kIHNvdXJjZSBjb2RlIHVzaW5nIHRoZQorX19BRFNQQkY1MjdfXyBtYWNyb3MuIEEgZmV3IHdvcmthcm91bmRzIHJlcXVpcmUgY29tcGlsZXIgc3VwcG9ydC4KKworfCAgQW5vbWFseSB8IE1hY3JvICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdDQyBTd2l0Y2ggICAgICAgfAorfC0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tfAorfCAgICAgIEFueSB8IF9fV09SS0FST1VORFNfRU5BQkxFRCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorfCAwNTAwMDA3NCB8IFdBXzA1MDAwMDc0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorfCAwNTAwMDI0NCB8IF9fV09SS0FST1VORF9TUEVDVUxBVElWRV9TWU5DUyB8IC1tY3N5bmMtYW5vbWFseSAgfAorfCAwNTAwMDI0NSB8IF9fV09SS0FST1VORF9TUEVDVUxBVElWRV9MT0FEUyB8IC1tc3BlY2xkLWFub21hbHkgfAorfCAwNTAwMDI1NyB8IFdBXzA1MDAwMjU3ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorfCAwNTAwMDI4MyB8IFdBXzA1MDAwMjgzICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorfCAwNTAwMDMxMiB8IFdBX0xPQURfTENSRUdTICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorfCAwNTAwMDMxNSB8IFdBXzA1MDAwMzE1ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorfCAwNTAwMDM3MSB8IF9fV09SS0FST1VORF9SRVRTICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorfCAwNTAwMDQyNiB8IF9fV09SS0FST1VORF9JTkRJUkVDVF9DQUxMUyAgICB8IE5vdCAtbWljcGxiICAgICAgfAorCisqKiBHQ0MgZmVhdHVyZSBzd2l0Y2hlcworfCBTd2l0Y2ggICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCAtbXNpbSAgICAgICAgICAgICAgICAgICAgIHwgVXNlIHNpbXVsYXRvciBydW50aW1lICAgICAgICAgICAgICAgICAgfAorfCAtbW9taXQtbGVhZi1mcmFtZS1wb2ludGVyIHwgT21pdCBmcmFtZSBwb2ludGVyIGZvciBsZWFmIGZ1bmN0aW9ucyAgfAorfCAtbWxvdzY0ayAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbWNzeW5jLWFub21hbHkgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbXNwZWNsZC1hbm9tYWx5ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbWlkLXNoYXJlZC1saWJyYXJ5ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbWxlYWYtaWQtc2hhcmVkLWxpYnJhcnkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbXNoYXJlZC1saWJyYXJ5LWlkPSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbXNlcC1kYXRhICAgICAgICAgICAgICAgIHwgRW5hYmxlIHNlcGFyYXRlIGRhdGEgc2VnbWVudCAgICAgICAgICAgfAorfCAtbWxvbmctY2FsbHMgICAgICAgICAgICAgIHwgVXNlIGluZGlyZWN0IGNhbGxzICAgICAgICAgICAgICAgICAgICAgfAorfCAtbWZhc3QtZnAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbWZkcGljICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbWlubGluZS1wbHQgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbXN0YWNrLWNoZWNrLWwxICAgICAgICAgIHwgRG8gc3RhY2sgY2hlY2tpbmcgaW4gTDEgc2NyYXRjaCBtZW1vcnkgfAorfCAtbW11bHRpY29yZSAgICAgICAgICAgICAgIHwgRW5hYmxlIG11bHRpY29yZSBzdXBwb3J0ICAgICAgICAgICAgICAgfAorfCAtbWNvcmVhICAgICAgICAgICAgICAgICAgIHwgQnVpbGQgZm9yIENvcmUgQSAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbWNvcmViICAgICAgICAgICAgICAgICAgIHwgQnVpbGQgZm9yIENvcmUgQiAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbXNkcmFtICAgICAgICAgICAgICAgICAgIHwgQnVpbGQgZm9yIFNEUkFNICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtbWljcGxiICAgICAgICAgICAgICAgICAgIHwgQXNzdW1lIElDUExCcyBhcmUgZW5hYmxlZCBhdCBydW50aW1lLiAgfApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9UYXJnZXRJbmZvL0JsYWNrZmluVGFyZ2V0SW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL1RhcmdldEluZm8vQmxhY2tmaW5UYXJnZXRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJlMGFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9CbGFja2Zpbi9UYXJnZXRJbmZvL0JsYWNrZmluVGFyZ2V0SW5mby5jcHAKQEAgLTAsMCArMSwyMSBAQAorLy89PT0tLSBCbGFja2ZpblRhcmdldEluZm8uY3BwIC0gQmxhY2tmaW4gVGFyZ2V0IEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkJsYWNrZmluLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGFyZ2V0IGxsdm06OlRoZUJsYWNrZmluVGFyZ2V0OworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVCbGFja2ZpblRhcmdldEluZm8oKSB7CisgIFJlZ2lzdGVyVGFyZ2V0PFRyaXBsZTo6YmZpbj4gWChUaGVCbGFja2ZpblRhcmdldCwgImJmaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuYWxvZyBEZXZpY2VzIEJsYWNrZmluIFtleHBlcmltZW50YWxdIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhODA2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDcgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4gKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1CbGFja2ZpbkluZm8KKyAgQmxhY2tmaW5UYXJnZXRJbmZvLmNwcAorICApCisKK2FkZF9kZXBlbmRlbmNpZXMoTExWTUJsYWNrZmluSW5mbyBCbGFja2ZpbkNvZGVHZW5UYWJsZV9nZW4pCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL1RhcmdldEluZm8vTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0JsYWNrZmluL1RhcmdldEluZm8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5Y2ZiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQmxhY2tmaW4vVGFyZ2V0SW5mby9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RhcmdldC9CbGFja2Zpbi9UYXJnZXRJbmZvL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNQmxhY2tmaW5JbmZvCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFBGTEFHUyA9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NCYWNrZW5kL0NCYWNrZW5kLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ0JhY2tlbmQvQ0JhY2tlbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjU4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NCYWNrZW5kL0NCYWNrZW5kLmNwcApAQCAtMCwwICsxLDM1ODEgQEAKKy8vPT09LS0gQ0JhY2tlbmQuY3BwIC0gTGlicmFyeSBmb3IgY29udmVydGluZyBMTFZNIGNvZGUgdG8gQyAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBsaWJyYXJ5IGNvbnZlcnRzIExMVk0gY29kZSB0byBDIGNvZGUsIGNvbXBpbGFibGUgYnkgR0NDIGFuZCBvdGhlciBDCisvLyBjb21waWxlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkNUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHlwZVN5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ29uc3RhbnRzU2Nhbm5lci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRmluZFVzZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0ludHJpbnNpY0xvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9JbnN0VmlzaXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vSG9zdC5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVDQmFja2VuZFRhcmdldCgpIHsgCisgIC8vIFJlZ2lzdGVyIHRoZSB0YXJnZXQuCisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxDVGFyZ2V0TWFjaGluZT4gWChUaGVDQmFja2VuZFRhcmdldCk7Cit9CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIENCRU1DQXNtSW5mbyA6IHB1YmxpYyBNQ0FzbUluZm8geworICBwdWJsaWM6CisgICAgQ0JFTUNBc21JbmZvKCkgeworICAgICAgR2xvYmFsUHJlZml4ID0gIiI7CisgICAgICBQcml2YXRlR2xvYmFsUHJlZml4ID0gIiI7CisgICAgfQorICB9OworICAvLy8gQ0JhY2tlbmROYW1lQWxsVXNlZFN0cnVjdHNBbmRNZXJnZUZ1bmN0aW9ucyAtIFRoaXMgcGFzcyBpbnNlcnRzIG5hbWVzIGZvcgorICAvLy8gYW55IHVubmFtZWQgc3RydWN0dXJlIHR5cGVzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIHByb2dyYW0sIGFuZCBtZXJnZXMKKyAgLy8vIGV4dGVybmFsIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUuCisgIC8vLworICBjbGFzcyBDQmFja2VuZE5hbWVBbGxVc2VkU3RydWN0c0FuZE1lcmdlRnVuY3Rpb25zIDogcHVibGljIE1vZHVsZVBhc3MgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgQ0JhY2tlbmROYW1lQWxsVXNlZFN0cnVjdHNBbmRNZXJnZUZ1bmN0aW9ucygpIAorICAgICAgOiBNb2R1bGVQYXNzKElEKSB7fQorICAgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuYWRkUmVxdWlyZWQ8RmluZFVzZWRUeXBlcz4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJDIGJhY2tlbmQgdHlwZSBjYW5vbmljYWxpemVyIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKyAgfTsKKworICBjaGFyIENCYWNrZW5kTmFtZUFsbFVzZWRTdHJ1Y3RzQW5kTWVyZ2VGdW5jdGlvbnM6OklEID0gMDsKKworICAvLy8gQ1dyaXRlciAtIFRoaXMgY2xhc3MgaXMgdGhlIG1haW4gY2h1bmsgb2YgY29kZSB0aGF0IGNvbnZlcnRzIGFuIExMVk0KKyAgLy8vIG1vZHVsZSB0byBhIEMgdHJhbnNsYXRpb24gdW5pdC4KKyAgY2xhc3MgQ1dyaXRlciA6IHB1YmxpYyBGdW5jdGlvblBhc3MsIHB1YmxpYyBJbnN0VmlzaXRvcjxDV3JpdGVyPiB7CisgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZPdXQ7CisgICAgSW50cmluc2ljTG93ZXJpbmcgKklMOworICAgIE1hbmdsZXIgKk1hbmc7CisgICAgTG9vcEluZm8gKkxJOworICAgIGNvbnN0IE1vZHVsZSAqVGhlTW9kdWxlOworICAgIGNvbnN0IE1DQXNtSW5mbyogVEFzbTsKKyAgICBNQ0NvbnRleHQgKlRDdHg7CisgICAgY29uc3QgVGFyZ2V0RGF0YSogVEQ7CisgICAgc3RkOjptYXA8Y29uc3QgVHlwZSAqLCBzdGQ6OnN0cmluZz4gVHlwZU5hbWVzOworICAgIHN0ZDo6bWFwPGNvbnN0IENvbnN0YW50RlAgKiwgdW5zaWduZWQ+IEZQQ29uc3RhbnRNYXA7CisgICAgc3RkOjpzZXQ8RnVuY3Rpb24qPiBpbnRyaW5zaWNQcm90b3R5cGVzQWxyZWFkeUdlbmVyYXRlZDsKKyAgICBzdGQ6OnNldDxjb25zdCBBcmd1bWVudCo+IEJ5VmFsUGFyYW1zOworICAgIHVuc2lnbmVkIEZQQ291bnRlcjsKKyAgICB1bnNpZ25lZCBPcGFxdWVDb3VudGVyOworICAgIERlbnNlTWFwPGNvbnN0IFZhbHVlKiwgdW5zaWduZWQ+IEFub25WYWx1ZU51bWJlcnM7CisgICAgdW5zaWduZWQgTmV4dEFub25WYWx1ZU51bWJlcjsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgZXhwbGljaXQgQ1dyaXRlcihmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJm8pCisgICAgICA6IEZ1bmN0aW9uUGFzcyhJRCksIE91dChvKSwgSUwoMCksIE1hbmcoMCksIExJKDApLCAKKyAgICAgICAgVGhlTW9kdWxlKDApLCBUQXNtKDApLCBUQ3R4KDApLCBURCgwKSwgT3BhcXVlQ291bnRlcigwKSwKKyAgICAgICAgTmV4dEFub25WYWx1ZU51bWJlcigwKSB7CisgICAgICBGUENvdW50ZXIgPSAwOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7IHJldHVybiAiQyBiYWNrZW5kIjsgfQorCisgICAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5hZGRSZXF1aXJlZDxMb29wSW5mbz4oKTsKKyAgICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSk7CisKKyAgICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgICAgLy8gRG8gbm90IGNvZGVnZW4gYW55ICdhdmFpbGFibGVfZXh0ZXJuYWxseScgZnVuY3Rpb25zIGF0IGFsbCwgdGhleSBoYXZlCisgICAgIC8vIGRlZmluaXRpb25zIG91dHNpZGUgdGhlIHRyYW5zbGF0aW9uIHVuaXQuCisgICAgIGlmIChGLmhhc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKCkpCisgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBMSSA9ICZnZXRBbmFseXNpczxMb29wSW5mbz4oKTsKKworICAgICAgLy8gR2V0IHJpZCBvZiBpbnRyaW5zaWNzIHdlIGNhbid0IGhhbmRsZS4KKyAgICAgIGxvd2VySW50cmluc2ljcyhGKTsKKworICAgICAgLy8gT3V0cHV0IGFsbCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMgdGhhdCBjYW5ub3QgYmUgcHJpbnRlZCBhY2N1cmF0ZWx5LgorICAgICAgcHJpbnRGbG9hdGluZ1BvaW50Q29uc3RhbnRzKEYpOworCisgICAgICBwcmludEZ1bmN0aW9uKEYpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIHsKKyAgICAgIC8vIEZyZWUgbWVtb3J5Li4uCisgICAgICBkZWxldGUgSUw7CisgICAgICBkZWxldGUgVEQ7CisgICAgICBkZWxldGUgTWFuZzsKKyAgICAgIGRlbGV0ZSBUQ3R4OworICAgICAgZGVsZXRlIFRBc207CisgICAgICBGUENvbnN0YW50TWFwLmNsZWFyKCk7CisgICAgICBUeXBlTmFtZXMuY2xlYXIoKTsKKyAgICAgIEJ5VmFsUGFyYW1zLmNsZWFyKCk7CisgICAgICBpbnRyaW5zaWNQcm90b3R5cGVzQWxyZWFkeUdlbmVyYXRlZC5jbGVhcigpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJhd19vc3RyZWFtICZwcmludFR5cGUocmF3X29zdHJlYW0gJk91dCwgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVmFyaWFibGVOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZU5hbWUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJMaXN0UHRyICZQQUwgPSBBdHRyTGlzdFB0cigpKTsKKyAgICByYXdfb3N0cmVhbSAmcHJpbnRTaW1wbGVUeXBlKHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lU29GYXIgPSAiIik7CisKKyAgICB2b2lkIHByaW50U3RydWN0UmV0dXJuUG9pbnRlckZ1bmN0aW9uVHlwZShyYXdfb3N0cmVhbSAmT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJMaXN0UHRyICZQQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlclR5cGUgKlR5KTsKKworICAgIC8vLyB3cml0ZU9wZXJhbmREZXJlZiAtIFByaW50IHRoZSByZXN1bHQgb2YgZGVyZWZlcmVuY2luZyB0aGUgc3BlY2lmaWVkCisgICAgLy8vIG9wZXJhbmQgd2l0aCAnKicuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gcHJpbnRpbmcgJyonIHRoZW4gdXNpbmcKKyAgICAvLy8gd3JpdGVPcGVyYW5kLCBidXQgYXZvaWRzIGV4Y2VzcyBzeW50YXggaW4gc29tZSBjYXNlcy4KKyAgICB2b2lkIHdyaXRlT3BlcmFuZERlcmVmKFZhbHVlICpPcGVyYW5kKSB7CisgICAgICBpZiAoaXNBZGRyZXNzRXhwb3NlZChPcGVyYW5kKSkgeworICAgICAgICAvLyBBbHJlYWR5IHNvbWV0aGluZyB3aXRoIGFuIGFkZHJlc3MgZXhwb3NlZC4KKyAgICAgICAgd3JpdGVPcGVyYW5kSW50ZXJuYWwoT3BlcmFuZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBPdXQgPDwgIiooIjsKKyAgICAgICAgd3JpdGVPcGVyYW5kKE9wZXJhbmQpOworICAgICAgICBPdXQgPDwgIikiOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHdyaXRlT3BlcmFuZChWYWx1ZSAqT3BlcmFuZCwgYm9vbCBTdGF0aWMgPSBmYWxzZSk7CisgICAgdm9pZCB3cml0ZUluc3RDb21wdXRhdGlvbklubGluZShJbnN0cnVjdGlvbiAmSSk7CisgICAgdm9pZCB3cml0ZU9wZXJhbmRJbnRlcm5hbChWYWx1ZSAqT3BlcmFuZCwgYm9vbCBTdGF0aWMgPSBmYWxzZSk7CisgICAgdm9pZCB3cml0ZU9wZXJhbmRXaXRoQ2FzdChWYWx1ZSogT3BlcmFuZCwgdW5zaWduZWQgT3Bjb2RlKTsKKyAgICB2b2lkIHdyaXRlT3BlcmFuZFdpdGhDYXN0KFZhbHVlKiBPcGVyYW5kLCBjb25zdCBJQ21wSW5zdCAmSSk7CisgICAgYm9vbCB3cml0ZUluc3RydWN0aW9uQ2FzdChjb25zdCBJbnN0cnVjdGlvbiAmSSk7CisKKyAgICB2b2lkIHdyaXRlTWVtb3J5QWNjZXNzKFZhbHVlICpPcGVyYW5kLCBjb25zdCBUeXBlICpPcGVyYW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNWb2xhdGlsZSwgdW5zaWduZWQgQWxpZ25tZW50KTsKKworICBwcml2YXRlIDoKKyAgICBzdGQ6OnN0cmluZyBJbnRlcnByZXRBU01Db25zdHJhaW50KElubGluZUFzbTo6Q29uc3RyYWludEluZm8mIGMpOworCisgICAgdm9pZCBsb3dlckludHJpbnNpY3MoRnVuY3Rpb24gJkYpOworCisgICAgdm9pZCBwcmludE1vZHVsZShNb2R1bGUgKk0pOworICAgIHZvaWQgcHJpbnRNb2R1bGVUeXBlcyhjb25zdCBUeXBlU3ltYm9sVGFibGUgJlNUKTsKKyAgICB2b2lkIHByaW50Q29udGFpbmVkU3RydWN0cyhjb25zdCBUeXBlICpUeSwgc3RkOjpzZXQ8Y29uc3QgVHlwZSAqPiAmKTsKKyAgICB2b2lkIHByaW50RmxvYXRpbmdQb2ludENvbnN0YW50cyhGdW5jdGlvbiAmRik7CisgICAgdm9pZCBwcmludEZsb2F0aW5nUG9pbnRDb25zdGFudHMoY29uc3QgQ29uc3RhbnQgKkMpOworICAgIHZvaWQgcHJpbnRGdW5jdGlvblNpZ25hdHVyZShjb25zdCBGdW5jdGlvbiAqRiwgYm9vbCBQcm90b3R5cGUpOworCisgICAgdm9pZCBwcmludEZ1bmN0aW9uKEZ1bmN0aW9uICYpOworICAgIHZvaWQgcHJpbnRCYXNpY0Jsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKyAgICB2b2lkIHByaW50TG9vcChMb29wICpMKTsKKworICAgIHZvaWQgcHJpbnRDYXN0KHVuc2lnbmVkIG9wY29kZSwgY29uc3QgVHlwZSAqU3JjVHksIGNvbnN0IFR5cGUgKkRzdFR5KTsKKyAgICB2b2lkIHByaW50Q29uc3RhbnQoQ29uc3RhbnQgKkNQViwgYm9vbCBTdGF0aWMpOworICAgIHZvaWQgcHJpbnRDb25zdGFudFdpdGhDYXN0KENvbnN0YW50ICpDUFYsIHVuc2lnbmVkIE9wY29kZSk7CisgICAgYm9vbCBwcmludENvbnN0RXhwckNhc3QoY29uc3QgQ29uc3RhbnRFeHByICpDRSwgYm9vbCBTdGF0aWMpOworICAgIHZvaWQgcHJpbnRDb25zdGFudEFycmF5KENvbnN0YW50QXJyYXkgKkNQQSwgYm9vbCBTdGF0aWMpOworICAgIHZvaWQgcHJpbnRDb25zdGFudFZlY3RvcihDb25zdGFudFZlY3RvciAqQ1YsIGJvb2wgU3RhdGljKTsKKworICAgIC8vLyBpc0FkZHJlc3NFeHBvc2VkIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSdzIG5hbWUgbmVlZHMgdG8KKyAgICAvLy8gaGF2ZSBpdHMgYWRkcmVzcyB0YWtlbiBpbiBvcmRlciB0byBnZXQgYSBDIHZhbHVlIG9mIHRoZSBjb3JyZWN0IHR5cGUuCisgICAgLy8vIFRoaXMgaGFwcGVucyBmb3IgZ2xvYmFsIHZhcmlhYmxlcywgYnl2YWwgcGFyYW1ldGVycywgYW5kIGRpcmVjdCBhbGxvY2FzLgorICAgIGJvb2wgaXNBZGRyZXNzRXhwb3NlZChjb25zdCBWYWx1ZSAqVikgY29uc3QgeworICAgICAgaWYgKGNvbnN0IEFyZ3VtZW50ICpBID0gZHluX2Nhc3Q8QXJndW1lbnQ+KFYpKQorICAgICAgICByZXR1cm4gQnlWYWxQYXJhbXMuY291bnQoQSk7CisgICAgICByZXR1cm4gaXNhPEdsb2JhbFZhcmlhYmxlPihWKSB8fCBpc0RpcmVjdEFsbG9jYShWKTsKKyAgICB9CisgICAgCisgICAgLy8gaXNJbmxpbmFibGVJbnN0IC0gQXR0ZW1wdCB0byBpbmxpbmUgaW5zdHJ1Y3Rpb25zIGludG8gdGhlaXIgdXNlcyB0byBidWlsZAorICAgIC8vIHRyZWVzIGFzIG11Y2ggYXMgcG9zc2libGUuICBUbyBkbyB0aGlzLCB3ZSBoYXZlIHRvIGNvbnNpc3RlbnRseSBkZWNpZGUKKyAgICAvLyB3aGF0IGlzIGFjY2VwdGFibGUgdG8gaW5saW5lLCBzbyB0aGF0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBkb24ndCBnZXQKKyAgICAvLyBwcmludGVkIGFuZCBhbiBleHRyYSBjb3B5IG9mIHRoZSBleHByIGlzIG5vdCBlbWl0dGVkLgorICAgIC8vCisgICAgc3RhdGljIGJvb2wgaXNJbmxpbmFibGVJbnN0KGNvbnN0IEluc3RydWN0aW9uICZJKSB7CisgICAgICAvLyBBbHdheXMgaW5saW5lIGNtcCBpbnN0cnVjdGlvbnMsIGV2ZW4gaWYgdGhleSBhcmUgc2hhcmVkIGJ5IG11bHRpcGxlCisgICAgICAvLyBleHByZXNzaW9ucy4gIEdDQyBnZW5lcmF0ZXMgaG9ycmlibGUgY29kZSBpZiB3ZSBkb24ndC4KKyAgICAgIGlmIChpc2E8Q21wSW5zdD4oSSkpIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gTXVzdCBiZSBhbiBleHByZXNzaW9uLCBtdXN0IGJlIHVzZWQgZXhhY3RseSBvbmNlLiAgSWYgaXQgaXMgZGVhZCwgd2UKKyAgICAgIC8vIGVtaXQgaXQgaW5saW5lIHdoZXJlIGl0IHdvdWxkIGdvLgorICAgICAgaWYgKEkuZ2V0VHlwZSgpID09IFR5cGU6OmdldFZvaWRUeShJLmdldENvbnRleHQoKSkgfHwgIUkuaGFzT25lVXNlKCkgfHwKKyAgICAgICAgICBpc2E8VGVybWluYXRvckluc3Q+KEkpIHx8IGlzYTxDYWxsSW5zdD4oSSkgfHwgaXNhPFBISU5vZGU+KEkpIHx8CisgICAgICAgICAgaXNhPExvYWRJbnN0PihJKSB8fCBpc2E8VkFBcmdJbnN0PihJKSB8fCBpc2E8SW5zZXJ0RWxlbWVudEluc3Q+KEkpIHx8CisgICAgICAgICAgaXNhPEluc2VydFZhbHVlSW5zdD4oSSkpCisgICAgICAgIC8vIERvbid0IGlubGluZSBhIGxvYWQgYWNyb3NzIGEgc3RvcmUgb3Igb3RoZXIgYmFkIHRoaW5ncyEKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBNdXN0IG5vdCBiZSB1c2VkIGluIGlubGluZSBhc20sIGV4dHJhY3RlbGVtZW50LCBvciBzaHVmZmxldmVjdG9yLgorICAgICAgaWYgKEkuaGFzT25lVXNlKCkpIHsKKyAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gJlVzZXIgPSBjYXN0PEluc3RydWN0aW9uPigqSS51c2VfYmFjaygpKTsKKyAgICAgICAgaWYgKGlzSW5saW5lQXNtKFVzZXIpIHx8IGlzYTxFeHRyYWN0RWxlbWVudEluc3Q+KFVzZXIpIHx8CisgICAgICAgICAgICBpc2E8U2h1ZmZsZVZlY3Rvckluc3Q+KFVzZXIpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gT25seSBpbmxpbmUgaW5zdHJ1Y3Rpb24gaXQgaWYgaXQncyB1c2UgaXMgaW4gdGhlIHNhbWUgQkIgYXMgdGhlIGluc3QuCisgICAgICByZXR1cm4gSS5nZXRQYXJlbnQoKSA9PSBjYXN0PEluc3RydWN0aW9uPihJLnVzZV9iYWNrKCkpLT5nZXRQYXJlbnQoKTsKKyAgICB9CisKKyAgICAvLyBpc0RpcmVjdEFsbG9jYSAtIERlZmluZSBmaXhlZCBzaXplZCBhbGxvY2FzIGluIHRoZSBlbnRyeSBibG9jayBhcyBkaXJlY3QKKyAgICAvLyB2YXJpYWJsZXMgd2hpY2ggYXJlIGFjY2Vzc2VkIHdpdGggdGhlICYgb3BlcmF0b3IuICBUaGlzIGNhdXNlcyBHQ0MgdG8KKyAgICAvLyBnZW5lcmF0ZSBzaWduaWZpY2FudGx5IGJldHRlciBjb2RlIHRoYW4gdG8gZW1pdCBhbGxvY2EgY2FsbHMgZGlyZWN0bHkuCisgICAgLy8KKyAgICBzdGF0aWMgY29uc3QgQWxsb2NhSW5zdCAqaXNEaXJlY3RBbGxvY2EoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIGNvbnN0IEFsbG9jYUluc3QgKkFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oVik7CisgICAgICBpZiAoIUFJKSByZXR1cm4gMDsKKyAgICAgIGlmIChBSS0+aXNBcnJheUFsbG9jYXRpb24oKSkKKyAgICAgICAgcmV0dXJuIDA7ICAgLy8gRklYTUU6IHdlIGNhbiBhbHNvIGlubGluZSBmaXhlZCBzaXplIGFycmF5IGFsbG9jYXMhCisgICAgICBpZiAoQUktPmdldFBhcmVudCgpICE9ICZBSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXRFbnRyeUJsb2NrKCkpCisgICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIEFJOworICAgIH0KKyAgICAKKyAgICAvLyBpc0lubGluZUFzbSAtIENoZWNrIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIGNhbGwgdG8gYW4gaW5saW5lIGFzbSBjaHVuaworICAgIHN0YXRpYyBib29sIGlzSW5saW5lQXNtKGNvbnN0IEluc3RydWN0aW9uJiBJKSB7CisgICAgICBpZiAoY29uc3QgQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KCZJKSkKKyAgICAgICAgcmV0dXJuIGlzYTxJbmxpbmVBc20+KENJLT5nZXRDYWxsZWRWYWx1ZSgpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgLy8gSW5zdHJ1Y3Rpb24gdmlzaXRhdGlvbiBmdW5jdGlvbnMKKyAgICBmcmllbmQgY2xhc3MgSW5zdFZpc2l0b3I8Q1dyaXRlcj47CisKKyAgICB2b2lkIHZpc2l0UmV0dXJuSW5zdChSZXR1cm5JbnN0ICZJKTsKKyAgICB2b2lkIHZpc2l0QnJhbmNoSW5zdChCcmFuY2hJbnN0ICZJKTsKKyAgICB2b2lkIHZpc2l0U3dpdGNoSW5zdChTd2l0Y2hJbnN0ICZJKTsKKyAgICB2b2lkIHZpc2l0SW5kaXJlY3RCckluc3QoSW5kaXJlY3RCckluc3QgJkkpOworICAgIHZvaWQgdmlzaXRJbnZva2VJbnN0KEludm9rZUluc3QgJkkpIHsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkxvd2VyaW52b2tlIHBhc3MgZGlkbid0IHdvcmshIik7CisgICAgfQorCisgICAgdm9pZCB2aXNpdFVud2luZEluc3QoVW53aW5kSW5zdCAmSSkgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiTG93ZXJpbnZva2UgcGFzcyBkaWRuJ3Qgd29yayEiKTsKKyAgICB9CisgICAgdm9pZCB2aXNpdFVucmVhY2hhYmxlSW5zdChVbnJlYWNoYWJsZUluc3QgJkkpOworCisgICAgdm9pZCB2aXNpdFBISU5vZGUoUEhJTm9kZSAmSSk7CisgICAgdm9pZCB2aXNpdEJpbmFyeU9wZXJhdG9yKEluc3RydWN0aW9uICZJKTsKKyAgICB2b2lkIHZpc2l0SUNtcEluc3QoSUNtcEluc3QgJkkpOworICAgIHZvaWQgdmlzaXRGQ21wSW5zdChGQ21wSW5zdCAmSSk7CisKKyAgICB2b2lkIHZpc2l0Q2FzdEluc3QgKENhc3RJbnN0ICZJKTsKKyAgICB2b2lkIHZpc2l0U2VsZWN0SW5zdChTZWxlY3RJbnN0ICZJKTsKKyAgICB2b2lkIHZpc2l0Q2FsbEluc3QgKENhbGxJbnN0ICZJKTsKKyAgICB2b2lkIHZpc2l0SW5saW5lQXNtKENhbGxJbnN0ICZJKTsKKyAgICBib29sIHZpc2l0QnVpbHRpbkNhbGwoQ2FsbEluc3QgJkksIEludHJpbnNpYzo6SUQgSUQsIGJvb2wgJldyb3RlQ2FsbGVlKTsKKworICAgIHZvaWQgdmlzaXRBbGxvY2FJbnN0KEFsbG9jYUluc3QgJkkpOworICAgIHZvaWQgdmlzaXRMb2FkSW5zdCAgKExvYWRJbnN0ICAgJkkpOworICAgIHZvaWQgdmlzaXRTdG9yZUluc3QgKFN0b3JlSW5zdCAgJkkpOworICAgIHZvaWQgdmlzaXRHZXRFbGVtZW50UHRySW5zdChHZXRFbGVtZW50UHRySW5zdCAmSSk7CisgICAgdm9pZCB2aXNpdFZBQXJnSW5zdCAoVkFBcmdJbnN0ICZJKTsKKyAgICAKKyAgICB2b2lkIHZpc2l0SW5zZXJ0RWxlbWVudEluc3QoSW5zZXJ0RWxlbWVudEluc3QgJkkpOworICAgIHZvaWQgdmlzaXRFeHRyYWN0RWxlbWVudEluc3QoRXh0cmFjdEVsZW1lbnRJbnN0ICZJKTsKKyAgICB2b2lkIHZpc2l0U2h1ZmZsZVZlY3Rvckluc3QoU2h1ZmZsZVZlY3Rvckluc3QgJlNWSSk7CisKKyAgICB2b2lkIHZpc2l0SW5zZXJ0VmFsdWVJbnN0KEluc2VydFZhbHVlSW5zdCAmSSk7CisgICAgdm9pZCB2aXNpdEV4dHJhY3RWYWx1ZUluc3QoRXh0cmFjdFZhbHVlSW5zdCAmSSk7CisKKyAgICB2b2lkIHZpc2l0SW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gJkkpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICBlcnJzKCkgPDwgIkMgV3JpdGVyIGRvZXMgbm90IGtub3cgYWJvdXQgIiA8PCBJOworI2VuZGlmCisgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgIH0KKworICAgIHZvaWQgb3V0cHV0TFZhbHVlKEluc3RydWN0aW9uICpJKSB7CisgICAgICBPdXQgPDwgIiAgIiA8PCBHZXRWYWx1ZU5hbWUoSSkgPDwgIiA9ICI7CisgICAgfQorCisgICAgYm9vbCBpc0dvdG9Db2RlTmVjZXNzYXJ5KEJhc2ljQmxvY2sgKkZyb20sIEJhc2ljQmxvY2sgKlRvKTsKKyAgICB2b2lkIHByaW50UEhJQ29waWVzRm9yU3VjY2Vzc29yKEJhc2ljQmxvY2sgKkN1ckJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqU3VjY2Vzc29yLCB1bnNpZ25lZCBJbmRlbnQpOworICAgIHZvaWQgcHJpbnRCcmFuY2hUb0Jsb2NrKEJhc2ljQmxvY2sgKkN1ckJsb2NrLCBCYXNpY0Jsb2NrICpTdWNjQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50KTsKKyAgICB2b2lkIHByaW50R0VQRXhwcmVzc2lvbihWYWx1ZSAqUHRyLCBnZXBfdHlwZV9pdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlcF90eXBlX2l0ZXJhdG9yIEUsIGJvb2wgU3RhdGljKTsKKworICAgIHN0ZDo6c3RyaW5nIEdldFZhbHVlTmFtZShjb25zdCBWYWx1ZSAqT3BlcmFuZCk7CisgIH07Cit9CisKK2NoYXIgQ1dyaXRlcjo6SUQgPSAwOworCisKK3N0YXRpYyBzdGQ6OnN0cmluZyBDQkVNYW5nbGUoY29uc3Qgc3RkOjpzdHJpbmcgJlMpIHsKKyAgc3RkOjpzdHJpbmcgUmVzdWx0OworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoaXNhbG51bShTW2ldKSB8fCBTW2ldID09ICdfJykgeworICAgICAgUmVzdWx0ICs9IFNbaV07CisgICAgfSBlbHNlIHsKKyAgICAgIFJlc3VsdCArPSAnXyc7CisgICAgICBSZXN1bHQgKz0gJ0EnKyhTW2ldJjE1KTsKKyAgICAgIFJlc3VsdCArPSAnQScrKChTW2ldPj40KSYxNSk7CisgICAgICBSZXN1bHQgKz0gJ18nOworICAgIH0KKyAgcmV0dXJuIFJlc3VsdDsKK30KKworCisvLy8gVGhpcyBtZXRob2QgaW5zZXJ0cyBuYW1lcyBmb3IgYW55IHVubmFtZWQgc3RydWN0dXJlIHR5cGVzIHRoYXQgYXJlIHVzZWQgYnkKKy8vLyB0aGUgcHJvZ3JhbSwgYW5kIHJlbW92ZXMgbmFtZXMgZnJvbSBzdHJ1Y3R1cmUgdHlwZXMgdGhhdCBhcmUgbm90IHVzZWQgYnkgdGhlCisvLy8gcHJvZ3JhbS4KKy8vLworYm9vbCBDQmFja2VuZE5hbWVBbGxVc2VkU3RydWN0c0FuZE1lcmdlRnVuY3Rpb25zOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgLy8gR2V0IGEgc2V0IG9mIHR5cGVzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIHByb2dyYW0uLi4KKyAgc3RkOjpzZXQ8Y29uc3QgVHlwZSAqPiBVVCA9IGdldEFuYWx5c2lzPEZpbmRVc2VkVHlwZXM+KCkuZ2V0VHlwZXMoKTsKKworICAvLyBMb29wIG92ZXIgdGhlIG1vZHVsZSBzeW1ib2wgdGFibGUsIHJlbW92aW5nIHR5cGVzIGZyb20gVVQgdGhhdCBhcmUKKyAgLy8gYWxyZWFkeSBuYW1lZCwgYW5kIHJlbW92aW5nIG5hbWVzIGZvciB0eXBlcyB0aGF0IGFyZSBub3QgdXNlZC4KKyAgLy8KKyAgVHlwZVN5bWJvbFRhYmxlICZUU1QgPSBNLmdldFR5cGVTeW1ib2xUYWJsZSgpOworICBmb3IgKFR5cGVTeW1ib2xUYWJsZTo6aXRlcmF0b3IgVEkgPSBUU1QuYmVnaW4oKSwgVEUgPSBUU1QuZW5kKCk7CisgICAgICAgVEkgIT0gVEU7ICkgeworICAgIFR5cGVTeW1ib2xUYWJsZTo6aXRlcmF0b3IgSSA9IFRJKys7CisgICAgCisgICAgLy8gSWYgdGhpcyBpc24ndCBhIHN0cnVjdCBvciBhcnJheSB0eXBlLCByZW1vdmUgaXQgZnJvbSBvdXIgc2V0IG9mIHR5cGVzCisgICAgLy8gdG8gbmFtZS4gVGhpcyBzaW1wbGlmaWVzIGVtaXNzaW9uIGxhdGVyLgorICAgIGlmICghSS0+c2Vjb25kLT5pc1N0cnVjdFR5KCkgJiYgIUktPnNlY29uZC0+aXNPcGFxdWVUeSgpICYmCisgICAgICAgICFJLT5zZWNvbmQtPmlzQXJyYXlUeSgpKSB7CisgICAgICBUU1QucmVtb3ZlKEkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB1c2VkLCByZW1vdmUgaXQgZnJvbSB0aGUgc3ltYm9sIHRhYmxlLgorICAgICAgc3RkOjpzZXQ8Y29uc3QgVHlwZSAqPjo6aXRlcmF0b3IgVVRJID0gVVQuZmluZChJLT5zZWNvbmQpOworICAgICAgaWYgKFVUSSA9PSBVVC5lbmQoKSkKKyAgICAgICAgVFNULnJlbW92ZShJKTsKKyAgICAgIGVsc2UKKyAgICAgICAgVVQuZXJhc2UoVVRJKTsgICAgLy8gT25seSBrZWVwIG9uZSBuYW1lIGZvciB0aGlzIHR5cGUuCisgICAgfQorICB9CisKKyAgLy8gVVQgbm93IGNvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIG5vdCBuYW1lZC4gIExvb3Agb3ZlciBpdCwgbmFtaW5nCisgIC8vIHN0cnVjdHVyZSB0eXBlcy4KKyAgLy8KKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIHVuc2lnbmVkIFJlbmFtZUNvdW50ZXIgPSAwOworICBmb3IgKHN0ZDo6c2V0PGNvbnN0IFR5cGUgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBVVC5iZWdpbigpLCBFID0gVVQuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgaWYgKCgqSSktPmlzU3RydWN0VHkoKSB8fCAoKkkpLT5pc0FycmF5VHkoKSkgeworICAgICAgd2hpbGUgKE0uYWRkVHlwZU5hbWUoInVubmFtZWQiK3V0b3N0cihSZW5hbWVDb3VudGVyKSwgKkkpKQorICAgICAgICArK1JlbmFtZUNvdW50ZXI7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgICAKKyAgICAgIAorICAvLyBMb29wIG92ZXIgYWxsIGV4dGVybmFsIGZ1bmN0aW9ucyBhbmQgZ2xvYmFscy4gIElmIHdlIGhhdmUgdHdvIHdpdGgKKyAgLy8gaWRlbnRpY2FsIG5hbWVzLCBtZXJnZSB0aGVtLgorICAvLyBGSVhNRTogVGhpcyBjb2RlIHNob3VsZCBkaXNhcHBlYXIgd2hlbiB3ZSBkb24ndCBhbGxvdyB2YWx1ZXMgd2l0aCB0aGUgc2FtZQorICAvLyBuYW1lcyB3aGVuIHRoZXkgaGF2ZSBkaWZmZXJlbnQgdHlwZXMhCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBHbG9iYWxWYWx1ZSo+IEV4dFN5bWJvbHM7CisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgSSAhPSBFOykgeworICAgIEZ1bmN0aW9uICpHViA9IEkrKzsKKyAgICBpZiAoR1YtPmlzRGVjbGFyYXRpb24oKSAmJiBHVi0+aGFzTmFtZSgpKSB7CisgICAgICBzdGQ6OnBhaXI8c3RkOjptYXA8c3RkOjpzdHJpbmcsIEdsb2JhbFZhbHVlKj46Oml0ZXJhdG9yLCBib29sPiBYCisgICAgICAgID0gRXh0U3ltYm9scy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoR1YtPmdldE5hbWUoKSwgR1YpKTsKKyAgICAgIGlmICghWC5zZWNvbmQpIHsKKyAgICAgICAgLy8gRm91bmQgYSBjb25mbGljdCwgcmVwbGFjZSB0aGlzIGdsb2JhbCB3aXRoIHRoZSBwcmV2aW91cyBvbmUuCisgICAgICAgIEdsb2JhbFZhbHVlICpPbGRHViA9IFguZmlyc3QtPnNlY29uZDsKKyAgICAgICAgR1YtPnJlcGxhY2VBbGxVc2VzV2l0aChDb25zdGFudEV4cHI6OmdldEJpdENhc3QoT2xkR1YsIEdWLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgR1YtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gRG8gdGhlIHNhbWUgZm9yIGdsb2JhbHMuCisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICBJICE9IEU7KSB7CisgICAgR2xvYmFsVmFyaWFibGUgKkdWID0gSSsrOworICAgIGlmIChHVi0+aXNEZWNsYXJhdGlvbigpICYmIEdWLT5oYXNOYW1lKCkpIHsKKyAgICAgIHN0ZDo6cGFpcjxzdGQ6Om1hcDxzdGQ6OnN0cmluZywgR2xvYmFsVmFsdWUqPjo6aXRlcmF0b3IsIGJvb2w+IFgKKyAgICAgICAgPSBFeHRTeW1ib2xzLmluc2VydChzdGQ6Om1ha2VfcGFpcihHVi0+Z2V0TmFtZSgpLCBHVikpOworICAgICAgaWYgKCFYLnNlY29uZCkgeworICAgICAgICAvLyBGb3VuZCBhIGNvbmZsaWN0LCByZXBsYWNlIHRoaXMgZ2xvYmFsIHdpdGggdGhlIHByZXZpb3VzIG9uZS4KKyAgICAgICAgR2xvYmFsVmFsdWUgKk9sZEdWID0gWC5maXJzdC0+c2Vjb25kOworICAgICAgICBHVi0+cmVwbGFjZUFsbFVzZXNXaXRoKENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChPbGRHViwgR1YtPmdldFR5cGUoKSkpOworICAgICAgICBHVi0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBwcmludFN0cnVjdFJldHVyblBvaW50ZXJGdW5jdGlvblR5cGUgLSBUaGlzIGlzIGxpa2UgcHJpbnRUeXBlIGZvciBhIHN0cnVjdAorLy8vIHJldHVybiB0eXBlLCBleGNlcHQsIGluc3RlYWQgb2YgcHJpbnRpbmcgdGhlIHR5cGUgYXMgdm9pZCAoKikoU3RydWN0KiwgLi4uKQorLy8vIHByaW50IGl0IGFzICJTdHJ1Y3QgKCopKC4uLikiLCBmb3Igc3RydWN0IHJldHVybiBmdW5jdGlvbnMuCit2b2lkIENXcml0ZXI6OnByaW50U3RydWN0UmV0dXJuUG9pbnRlckZ1bmN0aW9uVHlwZShyYXdfb3N0cmVhbSAmT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0ckxpc3RQdHIgJlBBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJUeXBlICpUaGVUeSkgeworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IGNhc3Q8RnVuY3Rpb25UeXBlPihUaGVUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIHN0ZDo6c3RyaW5nIHRzdHI7CisgIHJhd19zdHJpbmdfb3N0cmVhbSBGdW5jdGlvbklubmFyZHModHN0cik7CisgIEZ1bmN0aW9uSW5uYXJkcyA8PCAiICgqKSAoIjsKKyAgYm9vbCBQcmludGVkVHlwZSA9IGZhbHNlOworCisgIEZ1bmN0aW9uVHlwZTo6cGFyYW1faXRlcmF0b3IgSSA9IEZUeS0+cGFyYW1fYmVnaW4oKSwgRSA9IEZUeS0+cGFyYW1fZW5kKCk7CisgIGNvbnN0IFR5cGUgKlJldFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oSS0+Z2V0KCkpLT5nZXRFbGVtZW50VHlwZSgpOworICB1bnNpZ25lZCBJZHggPSAxOworICBmb3IgKCsrSSwgKytJZHg7IEkgIT0gRTsgKytJLCArK0lkeCkgeworICAgIGlmIChQcmludGVkVHlwZSkKKyAgICAgIEZ1bmN0aW9uSW5uYXJkcyA8PCAiLCAiOworICAgIGNvbnN0IFR5cGUgKkFyZ1R5ID0gKkk7CisgICAgaWYgKFBBTC5wYXJhbUhhc0F0dHIoSWR4LCBBdHRyaWJ1dGU6OkJ5VmFsKSkgeworICAgICAgYXNzZXJ0KEFyZ1R5LT5pc1BvaW50ZXJUeSgpKTsKKyAgICAgIEFyZ1R5ID0gY2FzdDxQb2ludGVyVHlwZT4oQXJnVHkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgIH0KKyAgICBwcmludFR5cGUoRnVuY3Rpb25Jbm5hcmRzLCBBcmdUeSwKKyAgICAgICAgLyppc1NpZ25lZD0qL1BBTC5wYXJhbUhhc0F0dHIoSWR4LCBBdHRyaWJ1dGU6OlNFeHQpLCAiIik7CisgICAgUHJpbnRlZFR5cGUgPSB0cnVlOworICB9CisgIGlmIChGVHktPmlzVmFyQXJnKCkpIHsKKyAgICBpZiAoIVByaW50ZWRUeXBlKQorICAgICAgRnVuY3Rpb25Jbm5hcmRzIDw8ICIgaW50IjsgLy9kdW1teSBhcmd1bWVudCBmb3IgZW1wdHkgdmFyYXJnIGZ1bmN0cworICAgIEZ1bmN0aW9uSW5uYXJkcyA8PCAiLCAuLi4iOworICB9IGVsc2UgaWYgKCFQcmludGVkVHlwZSkgeworICAgIEZ1bmN0aW9uSW5uYXJkcyA8PCAidm9pZCI7CisgIH0KKyAgRnVuY3Rpb25Jbm5hcmRzIDw8ICcpJzsKKyAgcHJpbnRUeXBlKE91dCwgUmV0VHksIAorICAgICAgLyppc1NpZ25lZD0qL1BBTC5wYXJhbUhhc0F0dHIoMCwgQXR0cmlidXRlOjpTRXh0KSwgRnVuY3Rpb25Jbm5hcmRzLnN0cigpKTsKK30KKworcmF3X29zdHJlYW0gJgorQ1dyaXRlcjo6cHJpbnRTaW1wbGVUeXBlKHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IFR5cGUgKlR5LCBib29sIGlzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lU29GYXIpIHsKKyAgYXNzZXJ0KChUeS0+aXNQcmltaXRpdmVUeXBlKCkgfHwgVHktPmlzSW50ZWdlclR5KCkgfHwgVHktPmlzVmVjdG9yVHkoKSkgJiYgCisgICAgICAgICAiSW52YWxpZCB0eXBlIGZvciBwcmludFNpbXBsZVR5cGUiKTsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgY2FzZSBUeXBlOjpWb2lkVHlJRDogICByZXR1cm4gT3V0IDw8ICJ2b2lkICIgPDwgTmFtZVNvRmFyOworICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOiB7CisgICAgdW5zaWduZWQgTnVtQml0cyA9IGNhc3Q8SW50ZWdlclR5cGU+KFR5KS0+Z2V0Qml0V2lkdGgoKTsKKyAgICBpZiAoTnVtQml0cyA9PSAxKSAKKyAgICAgIHJldHVybiBPdXQgPDwgImJvb2wgIiA8PCBOYW1lU29GYXI7CisgICAgZWxzZSBpZiAoTnVtQml0cyA8PSA4KQorICAgICAgcmV0dXJuIE91dCA8PCAoaXNTaWduZWQ/InNpZ25lZCI6InVuc2lnbmVkIikgPDwgIiBjaGFyICIgPDwgTmFtZVNvRmFyOworICAgIGVsc2UgaWYgKE51bUJpdHMgPD0gMTYpCisgICAgICByZXR1cm4gT3V0IDw8IChpc1NpZ25lZD8ic2lnbmVkIjoidW5zaWduZWQiKSA8PCAiIHNob3J0ICIgPDwgTmFtZVNvRmFyOworICAgIGVsc2UgaWYgKE51bUJpdHMgPD0gMzIpCisgICAgICByZXR1cm4gT3V0IDw8IChpc1NpZ25lZD8ic2lnbmVkIjoidW5zaWduZWQiKSA8PCAiIGludCAiIDw8IE5hbWVTb0ZhcjsKKyAgICBlbHNlIGlmIChOdW1CaXRzIDw9IDY0KQorICAgICAgcmV0dXJuIE91dCA8PCAoaXNTaWduZWQ/InNpZ25lZCI6InVuc2lnbmVkIikgPDwgIiBsb25nIGxvbmcgIjw8IE5hbWVTb0ZhcjsKKyAgICBlbHNlIHsgCisgICAgICBhc3NlcnQoTnVtQml0cyA8PSAxMjggJiYgIkJpdCB3aWR0aHMgPiAxMjggbm90IGltcGxlbWVudGVkIHlldCIpOworICAgICAgcmV0dXJuIE91dCA8PCAoaXNTaWduZWQ/Imxsdm1JbnQxMjgiOiJsbHZtVUludDEyOCIpIDw8ICIgIiA8PCBOYW1lU29GYXI7CisgICAgfQorICB9CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOiAgcmV0dXJuIE91dCA8PCAiZmxvYXQgIiAgIDw8IE5hbWVTb0ZhcjsKKyAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOiByZXR1cm4gT3V0IDw8ICJkb3VibGUgIiAgPDwgTmFtZVNvRmFyOworICAvLyBMYWNraW5nIGVtdWxhdGlvbiBvZiBGUDgwIG9uIFBQQywgZXRjLiwgd2UgYXNzdW1lIHdoaWNoZXZlciBvZiB0aGVzZSBpcworICAvLyBwcmVzZW50IG1hdGNoZXMgaG9zdCAnbG9uZyBkb3VibGUnLgorICBjYXNlIFR5cGU6Olg4Nl9GUDgwVHlJRDoKKyAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOgorICBjYXNlIFR5cGU6OkZQMTI4VHlJRDogIHJldHVybiBPdXQgPDwgImxvbmcgZG91YmxlICIgPDwgTmFtZVNvRmFyOworICAgICAgCisgIGNhc2UgVHlwZTo6VmVjdG9yVHlJRDogeworICAgIGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGNhc3Q8VmVjdG9yVHlwZT4oVHkpOworICAgIHJldHVybiBwcmludFNpbXBsZVR5cGUoT3V0LCBWVHktPmdldEVsZW1lbnRUeXBlKCksIGlzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgIiBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgiICsKKyAgICAgICAgICAgICAgICAgICAgIHV0b3N0cihURC0+Z2V0VHlwZUFsbG9jU2l6ZShWVHkpKSArICIgKSkpICIgKyBOYW1lU29GYXIpOworICB9CisgICAgCisgIGRlZmF1bHQ6CisjaWZuZGVmIE5ERUJVRworICAgIGVycnMoKSA8PCAiVW5rbm93biBwcmltaXRpdmUgdHlwZTogIiA8PCAqVHkgPDwgIlxuIjsKKyNlbmRpZgorICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KK30KKworLy8gUGFzcyB0aGUgVHlwZSogYW5kIHRoZSB2YXJpYWJsZSBuYW1lIGFuZCB0aGlzIHByaW50cyBvdXQgdGhlIHZhcmlhYmxlCisvLyBkZWNsYXJhdGlvbi4KKy8vCityYXdfb3N0cmVhbSAmQ1dyaXRlcjo6cHJpbnRUeXBlKHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZVNvRmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZU5hbWUsIGNvbnN0IEF0dHJMaXN0UHRyICZQQUwpIHsKKyAgaWYgKFR5LT5pc1ByaW1pdGl2ZVR5cGUoKSB8fCBUeS0+aXNJbnRlZ2VyVHkoKSB8fCBUeS0+aXNWZWN0b3JUeSgpKSB7CisgICAgcHJpbnRTaW1wbGVUeXBlKE91dCwgVHksIGlzU2lnbmVkLCBOYW1lU29GYXIpOworICAgIHJldHVybiBPdXQ7CisgIH0KKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHR5cGUgaXMgbmFtZWQuCisgIGlmICghSWdub3JlTmFtZSB8fCBUeS0+aXNPcGFxdWVUeSgpKSB7CisgICAgc3RkOjptYXA8Y29uc3QgVHlwZSAqLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIEkgPSBUeXBlTmFtZXMuZmluZChUeSk7CisgICAgaWYgKEkgIT0gVHlwZU5hbWVzLmVuZCgpKSByZXR1cm4gT3V0IDw8IEktPnNlY29uZCA8PCAnICcgPDwgTmFtZVNvRmFyOworICB9CisKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgY2FzZSBUeXBlOjpGdW5jdGlvblR5SUQ6IHsKKyAgICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IGNhc3Q8RnVuY3Rpb25UeXBlPihUeSk7CisgICAgc3RkOjpzdHJpbmcgdHN0cjsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gRnVuY3Rpb25Jbm5hcmRzKHRzdHIpOworICAgIEZ1bmN0aW9uSW5uYXJkcyA8PCAiICgiIDw8IE5hbWVTb0ZhciA8PCAiKSAoIjsKKyAgICB1bnNpZ25lZCBJZHggPSAxOworICAgIGZvciAoRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBJID0gRlR5LT5wYXJhbV9iZWdpbigpLAorICAgICAgICAgICBFID0gRlR5LT5wYXJhbV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGNvbnN0IFR5cGUgKkFyZ1R5ID0gKkk7CisgICAgICBpZiAoUEFMLnBhcmFtSGFzQXR0cihJZHgsIEF0dHJpYnV0ZTo6QnlWYWwpKSB7CisgICAgICAgIGFzc2VydChBcmdUeS0+aXNQb2ludGVyVHkoKSk7CisgICAgICAgIEFyZ1R5ID0gY2FzdDxQb2ludGVyVHlwZT4oQXJnVHkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgfQorICAgICAgaWYgKEkgIT0gRlR5LT5wYXJhbV9iZWdpbigpKQorICAgICAgICBGdW5jdGlvbklubmFyZHMgPDwgIiwgIjsKKyAgICAgIHByaW50VHlwZShGdW5jdGlvbklubmFyZHMsIEFyZ1R5LAorICAgICAgICAvKmlzU2lnbmVkPSovUEFMLnBhcmFtSGFzQXR0cihJZHgsIEF0dHJpYnV0ZTo6U0V4dCksICIiKTsKKyAgICAgICsrSWR4OworICAgIH0KKyAgICBpZiAoRlR5LT5pc1ZhckFyZygpKSB7CisgICAgICBpZiAoIUZUeS0+Z2V0TnVtUGFyYW1zKCkpCisgICAgICAgIEZ1bmN0aW9uSW5uYXJkcyA8PCAiIGludCI7IC8vZHVtbXkgYXJndW1lbnQgZm9yIGVtcHR5IHZhYXJnIGZ1bmN0cworICAgICAgRnVuY3Rpb25Jbm5hcmRzIDw8ICIsIC4uLiI7CisgICAgfSBlbHNlIGlmICghRlR5LT5nZXROdW1QYXJhbXMoKSkgeworICAgICAgRnVuY3Rpb25Jbm5hcmRzIDw8ICJ2b2lkIjsKKyAgICB9CisgICAgRnVuY3Rpb25Jbm5hcmRzIDw8ICcpJzsKKyAgICBwcmludFR5cGUoT3V0LCBGVHktPmdldFJldHVyblR5cGUoKSwgCisgICAgICAvKmlzU2lnbmVkPSovUEFMLnBhcmFtSGFzQXR0cigwLCBBdHRyaWJ1dGU6OlNFeHQpLCBGdW5jdGlvbklubmFyZHMuc3RyKCkpOworICAgIHJldHVybiBPdXQ7CisgIH0KKyAgY2FzZSBUeXBlOjpTdHJ1Y3RUeUlEOiB7CisgICAgY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gY2FzdDxTdHJ1Y3RUeXBlPihUeSk7CisgICAgT3V0IDw8IE5hbWVTb0ZhciArICIge1xuIjsKKyAgICB1bnNpZ25lZCBJZHggPSAwOworICAgIGZvciAoU3RydWN0VHlwZTo6ZWxlbWVudF9pdGVyYXRvciBJID0gU1R5LT5lbGVtZW50X2JlZ2luKCksCisgICAgICAgICAgIEUgPSBTVHktPmVsZW1lbnRfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBPdXQgPDwgIiAgIjsKKyAgICAgIHByaW50VHlwZShPdXQsICpJLCBmYWxzZSwgImZpZWxkIiArIHV0b3N0cihJZHgrKykpOworICAgICAgT3V0IDw8ICI7XG4iOworICAgIH0KKyAgICBPdXQgPDwgJ30nOworICAgIGlmIChTVHktPmlzUGFja2VkKCkpCisgICAgICBPdXQgPDwgIiBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkiOworICAgIHJldHVybiBPdXQ7CisgIH0KKworICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOiB7CisgICAgY29uc3QgUG9pbnRlclR5cGUgKlBUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KFR5KTsKKyAgICBzdGQ6OnN0cmluZyBwdHJOYW1lID0gIioiICsgTmFtZVNvRmFyOworCisgICAgaWYgKFBUeS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNBcnJheVR5KCkgfHwKKyAgICAgICAgUFR5LT5nZXRFbGVtZW50VHlwZSgpLT5pc1ZlY3RvclR5KCkpCisgICAgICBwdHJOYW1lID0gIigiICsgcHRyTmFtZSArICIpIjsKKworICAgIGlmICghUEFMLmlzRW1wdHkoKSkKKyAgICAgIC8vIE11c3QgYmUgYSBmdW5jdGlvbiBwdHIgY2FzdCEKKyAgICAgIHJldHVybiBwcmludFR5cGUoT3V0LCBQVHktPmdldEVsZW1lbnRUeXBlKCksIGZhbHNlLCBwdHJOYW1lLCB0cnVlLCBQQUwpOworICAgIHJldHVybiBwcmludFR5cGUoT3V0LCBQVHktPmdldEVsZW1lbnRUeXBlKCksIGZhbHNlLCBwdHJOYW1lKTsKKyAgfQorCisgIGNhc2UgVHlwZTo6QXJyYXlUeUlEOiB7CisgICAgY29uc3QgQXJyYXlUeXBlICpBVHkgPSBjYXN0PEFycmF5VHlwZT4oVHkpOworICAgIHVuc2lnbmVkIE51bUVsZW1lbnRzID0gQVR5LT5nZXROdW1FbGVtZW50cygpOworICAgIGlmIChOdW1FbGVtZW50cyA9PSAwKSBOdW1FbGVtZW50cyA9IDE7CisgICAgLy8gQXJyYXlzIGFyZSB3cmFwcGVkIGluIHN0cnVjdHMgdG8gYWxsb3cgdGhlbSB0byBoYXZlIG5vcm1hbAorICAgIC8vIHZhbHVlIHNlbWFudGljcyAoYXZvaWRpbmcgdGhlIGFycmF5ICJkZWNheSIpLgorICAgIE91dCA8PCBOYW1lU29GYXIgPDwgIiB7ICI7CisgICAgcHJpbnRUeXBlKE91dCwgQVR5LT5nZXRFbGVtZW50VHlwZSgpLCBmYWxzZSwKKyAgICAgICAgICAgICAgImFycmF5WyIgKyB1dG9zdHIoTnVtRWxlbWVudHMpICsgIl0iKTsKKyAgICByZXR1cm4gT3V0IDw8ICI7IH0iOworICB9CisKKyAgY2FzZSBUeXBlOjpPcGFxdWVUeUlEOiB7CisgICAgc3RkOjpzdHJpbmcgVHlOYW1lID0gInN0cnVjdCBvcGFxdWVfIiArIGl0b3N0cihPcGFxdWVDb3VudGVyKyspOworICAgIGFzc2VydChUeXBlTmFtZXMuZmluZChUeSkgPT0gVHlwZU5hbWVzLmVuZCgpKTsKKyAgICBUeXBlTmFtZXNbVHldID0gVHlOYW1lOworICAgIHJldHVybiBPdXQgPDwgVHlOYW1lIDw8ICcgJyA8PCBOYW1lU29GYXI7CisgIH0KKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgY2FzZSBpbiBnZXRUeXBlUHJvcHMhIik7CisgIH0KKworICByZXR1cm4gT3V0OworfQorCit2b2lkIENXcml0ZXI6OnByaW50Q29uc3RhbnRBcnJheShDb25zdGFudEFycmF5ICpDUEEsIGJvb2wgU3RhdGljKSB7CisKKyAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIHByaW50IHRoZSBhcnJheSBhcyBhIHN0cmluZyBpZiBpdCBpcyBhbiBhcnJheSBvZgorICAvLyB1Ynl0ZXMgb3IgYW4gYXJyYXkgb2Ygc2J5dGVzIHdpdGggcG9zaXRpdmUgdmFsdWVzLgorICAvLworICBjb25zdCBUeXBlICpFVHkgPSBDUEEtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgYm9vbCBpc1N0cmluZyA9IChFVHkgPT0gVHlwZTo6Z2V0SW50OFR5KENQQS0+Z2V0Q29udGV4dCgpKSB8fAorICAgICAgICAgICAgICAgICAgIEVUeSA9PSBUeXBlOjpnZXRJbnQ4VHkoQ1BBLT5nZXRDb250ZXh0KCkpKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgbnVsbCBjaGFyLCBhcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IEMKKyAgaWYgKGlzU3RyaW5nICYmIChDUEEtPmdldE51bU9wZXJhbmRzKCkgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICFjYXN0PENvbnN0YW50PigqKENQQS0+b3BfZW5kKCktMSkpLT5pc051bGxWYWx1ZSgpKSkKKyAgICBpc1N0cmluZyA9IGZhbHNlOworCisgIGlmIChpc1N0cmluZykgeworICAgIE91dCA8PCAnXCInOworICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgbGFzdCBudW1iZXIgd2FzIGEgaGV4YWRlY2ltYWwgZXNjYXBlCisgICAgYm9vbCBMYXN0V2FzSGV4ID0gZmFsc2U7CisKKyAgICAvLyBEbyBub3QgaW5jbHVkZSB0aGUgbGFzdCBjaGFyYWN0ZXIsIHdoaWNoIHdlIGtub3cgaXMgbnVsbAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUEEtPmdldE51bU9wZXJhbmRzKCktMTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgQyA9IGNhc3Q8Q29uc3RhbnRJbnQ+KENQQS0+Z2V0T3BlcmFuZChpKSktPmdldFpFeHRWYWx1ZSgpOworCisgICAgICAvLyBQcmludCBpdCBvdXQgbGl0ZXJhbGx5IGlmIGl0IGlzIGEgcHJpbnRhYmxlIGNoYXJhY3Rlci4gIFRoZSBvbmx5IHRoaW5nCisgICAgICAvLyB0byBiZSBjYXJlZnVsIGFib3V0IGlzIHdoZW4gdGhlIGxhc3QgbGV0dGVyIG91dHB1dCB3YXMgYSBoZXggZXNjYXBlCisgICAgICAvLyBjb2RlLCBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBub3QgdG8gcHJpbnQgb3V0IGhleCBkaWdpdHMKKyAgICAgIC8vIGV4cGxpY2l0bHkgKHRoZSBDIGNvbXBpbGVyIHRoaW5rcyBpdCBpcyBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgcHJldmlvdXMKKyAgICAgIC8vIGNoYXJhY3Rlciwgc2hlZXNoLi4uKQorICAgICAgLy8KKyAgICAgIGlmIChpc3ByaW50KEMpICYmICghTGFzdFdhc0hleCB8fCAhaXN4ZGlnaXQoQykpKSB7CisgICAgICAgIExhc3RXYXNIZXggPSBmYWxzZTsKKyAgICAgICAgaWYgKEMgPT0gJyInIHx8IEMgPT0gJ1xcJykKKyAgICAgICAgICBPdXQgPDwgIlxcIiA8PCAoY2hhcilDOworICAgICAgICBlbHNlCisgICAgICAgICAgT3V0IDw8IChjaGFyKUM7CisgICAgICB9IGVsc2UgeworICAgICAgICBMYXN0V2FzSGV4ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoQykgeworICAgICAgICBjYXNlICdcbic6IE91dCA8PCAiXFxuIjsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1x0JzogT3V0IDw8ICJcXHQiOyBicmVhazsKKyAgICAgICAgY2FzZSAnXHInOiBPdXQgPDwgIlxcciI7IGJyZWFrOworICAgICAgICBjYXNlICdcdic6IE91dCA8PCAiXFx2IjsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xhJzogT3V0IDw8ICJcXGEiOyBicmVhazsKKyAgICAgICAgY2FzZSAnXCInOiBPdXQgPDwgIlxcXCIiOyBicmVhazsKKyAgICAgICAgY2FzZSAnXCcnOiBPdXQgPDwgIlxcXCciOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBPdXQgPDwgIlxceCI7CisgICAgICAgICAgT3V0IDw8IChjaGFyKSgoIEMvMTYgIDwgMTApID8gKCBDLzE2ICsnMCcpIDogKCBDLzE2IC0xMCsnQScpKTsKKyAgICAgICAgICBPdXQgPDwgKGNoYXIpKCgoQyYxNSkgPCAxMCkgPyAoKEMmMTUpKycwJykgOiAoKEMmMTUpLTEwKydBJykpOworICAgICAgICAgIExhc3RXYXNIZXggPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIE91dCA8PCAnXCInOworICB9IGVsc2UgeworICAgIE91dCA8PCAneyc7CisgICAgaWYgKENQQS0+Z2V0TnVtT3BlcmFuZHMoKSkgeworICAgICAgT3V0IDw8ICcgJzsKKyAgICAgIHByaW50Q29uc3RhbnQoY2FzdDxDb25zdGFudD4oQ1BBLT5nZXRPcGVyYW5kKDApKSwgU3RhdGljKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBDUEEtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIE91dCA8PCAiLCAiOworICAgICAgICBwcmludENvbnN0YW50KGNhc3Q8Q29uc3RhbnQ+KENQQS0+Z2V0T3BlcmFuZChpKSksIFN0YXRpYyk7CisgICAgICB9CisgICAgfQorICAgIE91dCA8PCAiIH0iOworICB9Cit9CisKK3ZvaWQgQ1dyaXRlcjo6cHJpbnRDb25zdGFudFZlY3RvcihDb25zdGFudFZlY3RvciAqQ1AsIGJvb2wgU3RhdGljKSB7CisgIE91dCA8PCAneyc7CisgIGlmIChDUC0+Z2V0TnVtT3BlcmFuZHMoKSkgeworICAgIE91dCA8PCAnICc7CisgICAgcHJpbnRDb25zdGFudChjYXN0PENvbnN0YW50PihDUC0+Z2V0T3BlcmFuZCgwKSksIFN0YXRpYyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IENQLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgT3V0IDw8ICIsICI7CisgICAgICBwcmludENvbnN0YW50KGNhc3Q8Q29uc3RhbnQ+KENQLT5nZXRPcGVyYW5kKGkpKSwgU3RhdGljKTsKKyAgICB9CisgIH0KKyAgT3V0IDw8ICIgfSI7Cit9CisKKy8vIGlzRlBDU2FmZVRvUHJpbnQgLSBSZXR1cm5zIHRydWUgaWYgd2UgbWF5IGFzc3VtZSB0aGF0IENGUCBtYXkgYmUgd3JpdHRlbiBvdXQKKy8vIHRleHR1YWxseSBhcyBhIGRvdWJsZSAocmF0aGVyIHRoYW4gYXMgYSByZWZlcmVuY2UgdG8gYSBzdGFjay1hbGxvY2F0ZWQKKy8vIHZhcmlhYmxlKS4gV2UgZGVjaWRlIHRoaXMgYnkgY29udmVydGluZyBDRlAgdG8gYSBzdHJpbmcgYW5kIGJhY2sgaW50byBhCisvLyBkb3VibGUsIGFuZCB0aGVuIGNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnZlcnNpb24gcmVzdWx0cyBpbiBhIGJpdC1lcXVhbAorLy8gZG91YmxlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBDRlAuIFRoaXMgZGVwZW5kcyBvbiB1cyBhbmQgdGhlIHRhcmdldCBDCisvLyBjb21waWxlciBhZ3JlZWluZyBvbiB0aGUgY29udmVyc2lvbiBwcm9jZXNzICh3aGljaCBpcyBwcmV0dHkgbGlrZWx5IHNpbmNlIHdlCisvLyBvbmx5IGRlYWwgaW4gSUVFRSBGUCkuCisvLworc3RhdGljIGJvb2wgaXNGUENTYWZlVG9QcmludChjb25zdCBDb25zdGFudEZQICpDRlApIHsKKyAgYm9vbCBpZ25vcmVkOworICAvLyBEbyBsb25nIGRvdWJsZXMgaW4gaGV4IGZvciBub3cuCisgIGlmIChDRlAtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRGbG9hdFR5KENGUC0+Z2V0Q29udGV4dCgpKSAmJgorICAgICAgQ0ZQLT5nZXRUeXBlKCkgIT0gVHlwZTo6Z2V0RG91YmxlVHkoQ0ZQLT5nZXRDb250ZXh0KCkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgQVBGbG9hdCBBUEYgPSBBUEZsb2F0KENGUC0+Z2V0VmFsdWVBUEYoKSk7ICAvLyBjb3B5CisgIGlmIChDRlAtPmdldFR5cGUoKSA9PSBUeXBlOjpnZXRGbG9hdFR5KENGUC0+Z2V0Q29udGV4dCgpKSkKKyAgICBBUEYuY29udmVydChBUEZsb2F0OjpJRUVFZG91YmxlLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuLCAmaWdub3JlZCk7CisjaWYgSEFWRV9QUklOVEZfQSAmJiBFTkFCTEVfQ0JFX1BSSU5URl9BCisgIGNoYXIgQnVmZmVyWzEwMF07CisgIHNwcmludGYoQnVmZmVyLCAiJWEiLCBBUEYuY29udmVydFRvRG91YmxlKCkpOworICBpZiAoIXN0cm5jbXAoQnVmZmVyLCAiMHgiLCAyKSB8fAorICAgICAgIXN0cm5jbXAoQnVmZmVyLCAiLTB4IiwgMykgfHwKKyAgICAgICFzdHJuY21wKEJ1ZmZlciwgIisweCIsIDMpKQorICAgIHJldHVybiBBUEYuYml0d2lzZUlzRXF1YWwoQVBGbG9hdChhdG9mKEJ1ZmZlcikpKTsKKyAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgc3RkOjpzdHJpbmcgU3RyVmFsID0gZnRvc3RyKEFQRik7CisKKyAgd2hpbGUgKFN0clZhbFswXSA9PSAnICcpCisgICAgU3RyVmFsLmVyYXNlKFN0clZhbC5iZWdpbigpKTsKKworICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3RyaW5naXplZCBudW1iZXIgaXMgbm90IHNvbWUgc3RyaW5nIGxpa2UgIkluZiIKKyAgLy8gb3IgTmFOLiAgQ2hlY2sgdGhhdCB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlICJbLStdP1swLTldIiByZWdleC4KKyAgaWYgKChTdHJWYWxbMF0gPj0gJzAnICYmIFN0clZhbFswXSA8PSAnOScpIHx8CisgICAgICAoKFN0clZhbFswXSA9PSAnLScgfHwgU3RyVmFsWzBdID09ICcrJykgJiYKKyAgICAgICAoU3RyVmFsWzFdID49ICcwJyAmJiBTdHJWYWxbMV0gPD0gJzknKSkpCisgICAgLy8gUmVwYXJzZSBzdHJpbmdpemVkIHZlcnNpb24hCisgICAgcmV0dXJuIEFQRi5iaXR3aXNlSXNFcXVhbChBUEZsb2F0KGF0b2YoU3RyVmFsLmNfc3RyKCkpKSk7CisgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCisvLy8gUHJpbnQgb3V0IHRoZSBjYXN0aW5nIGZvciBhIGNhc3Qgb3BlcmF0aW9uLiBUaGlzIGRvZXMgdGhlIGRvdWJsZSBjYXN0aW5nCisvLy8gbmVjZXNzYXJ5IGZvciBjb252ZXJzaW9uIHRvIHRoZSBkZXN0aW5hdGlvbiB0eXBlLCBpZiBuZWNlc3NhcnkuIAorLy8vIEBicmllZiBQcmludCBhIGNhc3QKK3ZvaWQgQ1dyaXRlcjo6cHJpbnRDYXN0KHVuc2lnbmVkIG9wYywgY29uc3QgVHlwZSAqU3JjVHksIGNvbnN0IFR5cGUgKkRzdFR5KSB7CisgIC8vIFByaW50IHRoZSBkZXN0aW5hdGlvbiB0eXBlIGNhc3QKKyAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVSVRvRlA6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzogLy8gRm9yIHRoZXNlIHRoZSBEc3RUeSBzaWduIGRvZXNuJ3QgbWF0dGVyCisgICAgICBPdXQgPDwgJygnOworICAgICAgcHJpbnRUeXBlKE91dCwgRHN0VHkpOworICAgICAgT3V0IDw8ICcpJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlpFeHQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJOiAvLyBGb3IgdGhlc2UsIG1ha2Ugc3VyZSB3ZSBnZXQgYW4gdW5zaWduZWQgZGVzdAorICAgICAgT3V0IDw8ICcoJzsKKyAgICAgIHByaW50U2ltcGxlVHlwZShPdXQsIERzdFR5LCBmYWxzZSk7CisgICAgICBPdXQgPDwgJyknOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDogCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1NJOiAvLyBGb3IgdGhlc2UsIG1ha2Ugc3VyZSB3ZSBnZXQgYSBzaWduZWQgZGVzdAorICAgICAgT3V0IDw8ICcoJzsKKyAgICAgIHByaW50U2ltcGxlVHlwZShPdXQsIERzdFR5LCB0cnVlKTsKKyAgICAgIE91dCA8PCAnKSc7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBjYXN0IG9wY29kZSIpOworICB9CisKKyAgLy8gUHJpbnQgdGhlIHNvdXJjZSB0eXBlIGNhc3QKKyAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVSVRvRlA6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDoKKyAgICAgIE91dCA8PCAnKCc7CisgICAgICBwcmludFNpbXBsZVR5cGUoT3V0LCBTcmNUeSwgZmFsc2UpOworICAgICAgT3V0IDw8ICcpJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNJVG9GUDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OgorICAgICAgT3V0IDw8ICcoJzsKKyAgICAgIHByaW50U2ltcGxlVHlwZShPdXQsIFNyY1R5LCB0cnVlKTsgCisgICAgICBPdXQgPDwgJyknOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6SW50VG9QdHI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ6CisgICAgICAvLyBBdm9pZCAiY2FzdCB0byBwb2ludGVyIGZyb20gaW50ZWdlciBvZiBkaWZmZXJlbnQgc2l6ZSIgd2FybmluZ3MKKyAgICAgIE91dCA8PCAiKHVuc2lnbmVkIGxvbmcpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUFRvU0k6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJOgorICAgICAgYnJlYWs7IC8vIFRoZXNlIGRvbid0IG5lZWQgYSBzb3VyY2UgY2FzdC4KKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBjYXN0IG9wY29kZSIpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLy8gcHJpbnRDb25zdGFudCAtIFRoZSBMTFZNIENvbnN0YW50IHRvIEMgQ29uc3RhbnQgY29udmVydGVyLgordm9pZCBDV3JpdGVyOjpwcmludENvbnN0YW50KENvbnN0YW50ICpDUFYsIGJvb2wgU3RhdGljKSB7CisgIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDUFYpKSB7CisgICAgc3dpdGNoIChDRS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUEV4dDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVSVRvRlA6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9VSToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUFRvU0k6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6SW50VG9QdHI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICAgIE91dCA8PCAiKCI7CisgICAgICBwcmludENhc3QoQ0UtPmdldE9wY29kZSgpLCBDRS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLCBDRS0+Z2V0VHlwZSgpKTsKKyAgICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNFeHQgJiYKKyAgICAgICAgICBDRS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IFR5cGU6OmdldEludDFUeShDUFYtPmdldENvbnRleHQoKSkpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHJlYWxseSBzZXh0IGZyb20gYm9vbCBoZXJlIGJ5IHN1YnRyYWN0aW5nIGZyb20gMAorICAgICAgICBPdXQgPDwgIjAtIjsKKyAgICAgIH0KKyAgICAgIHByaW50Q29uc3RhbnQoQ0UtPmdldE9wZXJhbmQoMCksIFN0YXRpYyk7CisgICAgICBpZiAoQ0UtPmdldFR5cGUoKSA9PSBUeXBlOjpnZXRJbnQxVHkoQ1BWLT5nZXRDb250ZXh0KCkpICYmCisgICAgICAgICAgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6VHJ1bmMgfHwKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpGUFRvVUkgfHwKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpGUFRvU0kgfHwKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpQdHJUb0ludCkpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHJlYWxseSB0cnVuY2F0ZSB0byBib29sIGhlcmUgYnkgYW5kaW5nIHdpdGggMQorICAgICAgICBPdXQgPDwgIiYxdSI7CisgICAgICB9CisgICAgICBPdXQgPDwgJyknOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cjoKKyAgICAgIE91dCA8PCAiKCI7CisgICAgICBwcmludEdFUEV4cHJlc3Npb24oQ0UtPmdldE9wZXJhbmQoMCksIGdlcF90eXBlX2JlZ2luKENQViksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VwX3R5cGVfZW5kKENQViksIFN0YXRpYyk7CisgICAgICBPdXQgPDwgIikiOworICAgICAgcmV0dXJuOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNlbGVjdDoKKyAgICAgIE91dCA8PCAnKCc7CisgICAgICBwcmludENvbnN0YW50KENFLT5nZXRPcGVyYW5kKDApLCBTdGF0aWMpOworICAgICAgT3V0IDw8ICc/JzsKKyAgICAgIHByaW50Q29uc3RhbnQoQ0UtPmdldE9wZXJhbmQoMSksIFN0YXRpYyk7CisgICAgICBPdXQgPDwgJzonOworICAgICAgcHJpbnRDb25zdGFudChDRS0+Z2V0T3BlcmFuZCgyKSwgU3RhdGljKTsKKyAgICAgIE91dCA8PCAnKSc7CisgICAgICByZXR1cm47CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZTdWI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZNdWw6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0RpdjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZEaXY6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZSZW06CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QW5kOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpJQ21wOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6CisgICAgeworICAgICAgT3V0IDw8ICcoJzsKKyAgICAgIGJvb2wgTmVlZHNDbG9zaW5nUGFyZW5zID0gcHJpbnRDb25zdEV4cHJDYXN0KENFLCBTdGF0aWMpOyAKKyAgICAgIHByaW50Q29uc3RhbnRXaXRoQ2FzdChDRS0+Z2V0T3BlcmFuZCgwKSwgQ0UtPmdldE9wY29kZSgpKTsKKyAgICAgIHN3aXRjaCAoQ0UtPmdldE9wY29kZSgpKSB7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpGQWRkOiBPdXQgPDwgIiArICI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlN1YjogT3V0IDw8ICIgLSAiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZNdWw6IE91dCA8PCAiICogIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbTogCisgICAgICBjYXNlIEluc3RydWN0aW9uOjpGUmVtOiBPdXQgPDwgIiAlICI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjogCisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OiAKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZEaXY6IE91dCA8PCAiIC8gIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6IE91dCA8PCAiICYgIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpPcjogIE91dCA8PCAiIHwgIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpYb3I6IE91dCA8PCAiIF4gIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTaGw6IE91dCA8PCAiIDw8ICI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6IE91dCA8PCAiID4+ICI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6SUNtcDoKKyAgICAgICAgc3dpdGNoIChDRS0+Z2V0UHJlZGljYXRlKCkpIHsKKyAgICAgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiBPdXQgPDwgIiA9PSAiOyBicmVhazsKKyAgICAgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiBPdXQgPDwgIiAhPSAiOyBicmVhazsKKyAgICAgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogCisgICAgICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6IE91dCA8PCAiIDwgIjsgYnJlYWs7CisgICAgICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6CisgICAgICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTEU6IE91dCA8PCAiIDw9ICI7IGJyZWFrOworICAgICAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOgorICAgICAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiBPdXQgPDwgIiA+ICI7IGJyZWFrOworICAgICAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOgorICAgICAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOiBPdXQgPDwgIiA+PSAiOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIElDbXAgcHJlZGljYXRlIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIG9wY29kZSBoZXJlISIpOworICAgICAgfQorICAgICAgcHJpbnRDb25zdGFudFdpdGhDYXN0KENFLT5nZXRPcGVyYW5kKDEpLCBDRS0+Z2V0T3Bjb2RlKCkpOworICAgICAgaWYgKE5lZWRzQ2xvc2luZ1BhcmVucykKKyAgICAgICAgT3V0IDw8ICIpKSI7CisgICAgICBPdXQgPDwgJyknOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIEluc3RydWN0aW9uOjpGQ21wOiB7CisgICAgICBPdXQgPDwgJygnOyAKKyAgICAgIGJvb2wgTmVlZHNDbG9zaW5nUGFyZW5zID0gcHJpbnRDb25zdEV4cHJDYXN0KENFLCBTdGF0aWMpOyAKKyAgICAgIGlmIChDRS0+Z2V0UHJlZGljYXRlKCkgPT0gRkNtcEluc3Q6OkZDTVBfRkFMU0UpCisgICAgICAgIE91dCA8PCAiMCI7CisgICAgICBlbHNlIGlmIChDRS0+Z2V0UHJlZGljYXRlKCkgPT0gRkNtcEluc3Q6OkZDTVBfVFJVRSkKKyAgICAgICAgT3V0IDw8ICIxIjsKKyAgICAgIGVsc2UgeworICAgICAgICBjb25zdCBjaGFyKiBvcCA9IDA7CisgICAgICAgIHN3aXRjaCAoQ0UtPmdldFByZWRpY2F0ZSgpKSB7CisgICAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgRkNtcCBwcmVkaWNhdGUiKTsKKyAgICAgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PUkQ6IG9wID0gIm9yZCI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VOTzogb3AgPSAidW5vIjsgYnJlYWs7CisgICAgICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUVROiBvcCA9ICJ1ZXEiOyBicmVhazsKKyAgICAgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTkU6IG9wID0gInVuZSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMVDogb3AgPSAidWx0IjsgYnJlYWs7CisgICAgICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxFOiBvcCA9ICJ1bGUiOyBicmVhazsKKyAgICAgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VR1Q6IG9wID0gInVndCI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHRTogb3AgPSAidWdlIjsgYnJlYWs7CisgICAgICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0VROiBvcCA9ICJvZXEiOyBicmVhazsKKyAgICAgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTkU6IG9wID0gIm9uZSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MVDogb3AgPSAib2x0IjsgYnJlYWs7CisgICAgICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xFOiBvcCA9ICJvbGUiOyBicmVhazsKKyAgICAgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PR1Q6IG9wID0gIm9ndCI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRTogb3AgPSAib2dlIjsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgT3V0IDw8ICJsbHZtX2ZjbXBfIiA8PCBvcCA8PCAiKCI7CisgICAgICAgIHByaW50Q29uc3RhbnRXaXRoQ2FzdChDRS0+Z2V0T3BlcmFuZCgwKSwgQ0UtPmdldE9wY29kZSgpKTsKKyAgICAgICAgT3V0IDw8ICIsICI7CisgICAgICAgIHByaW50Q29uc3RhbnRXaXRoQ2FzdChDRS0+Z2V0T3BlcmFuZCgxKSwgQ0UtPmdldE9wY29kZSgpKTsKKyAgICAgICAgT3V0IDw8ICIpIjsKKyAgICAgIH0KKyAgICAgIGlmIChOZWVkc0Nsb3NpbmdQYXJlbnMpCisgICAgICAgIE91dCA8PCAiKSkiOworICAgICAgT3V0IDw8ICcpJzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVmYXVsdDoKKyNpZm5kZWYgTkRFQlVHCisgICAgICBlcnJzKCkgPDwgIkNXcml0ZXIgRXJyb3I6IFVuaGFuZGxlZCBjb25zdGFudCBleHByZXNzaW9uOiAiCisgICAgICAgICAgIDw8ICpDRSA8PCAiXG4iOworI2VuZGlmCisgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgIH0KKyAgfSBlbHNlIGlmIChpc2E8VW5kZWZWYWx1ZT4oQ1BWKSAmJiBDUFYtPmdldFR5cGUoKS0+aXNTaW5nbGVWYWx1ZVR5cGUoKSkgeworICAgIE91dCA8PCAiKCgiOworICAgIHByaW50VHlwZShPdXQsIENQVi0+Z2V0VHlwZSgpKTsgLy8gc2lnbiBkb2Vzbid0IG1hdHRlcgorICAgIE91dCA8PCAiKS8qVU5ERUYqLyI7CisgICAgaWYgKCFDUFYtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICBPdXQgPDwgIjApIjsKKyAgICB9IGVsc2UgeworICAgICAgT3V0IDw8ICJ7fSkiOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENQVikpIHsKKyAgICBjb25zdCBUeXBlKiBUeSA9IENJLT5nZXRUeXBlKCk7CisgICAgaWYgKFR5ID09IFR5cGU6OmdldEludDFUeShDUFYtPmdldENvbnRleHQoKSkpCisgICAgICBPdXQgPDwgKENJLT5nZXRaRXh0VmFsdWUoKSA/ICcxJyA6ICcwJyk7CisgICAgZWxzZSBpZiAoVHkgPT0gVHlwZTo6Z2V0SW50MzJUeShDUFYtPmdldENvbnRleHQoKSkpCisgICAgICBPdXQgPDwgQ0ktPmdldFpFeHRWYWx1ZSgpIDw8ICd1JzsKKyAgICBlbHNlIGlmIChUeS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpID4gMzIpCisgICAgICBPdXQgPDwgQ0ktPmdldFpFeHRWYWx1ZSgpIDw8ICJ1bGwiOworICAgIGVsc2UgeworICAgICAgT3V0IDw8ICIoKCI7CisgICAgICBwcmludFNpbXBsZVR5cGUoT3V0LCBUeSwgZmFsc2UpIDw8ICcpJzsKKyAgICAgIGlmIChDSS0+aXNNaW5WYWx1ZSh0cnVlKSkgCisgICAgICAgIE91dCA8PCBDSS0+Z2V0WkV4dFZhbHVlKCkgPDwgJ3UnOworICAgICAgZWxzZQorICAgICAgICBPdXQgPDwgQ0ktPmdldFNFeHRWYWx1ZSgpOworICAgICAgT3V0IDw8ICcpJzsKKyAgICB9CisgICAgcmV0dXJuOworICB9IAorCisgIHN3aXRjaCAoQ1BWLT5nZXRUeXBlKCktPmdldFR5cGVJRCgpKSB7CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOgorICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6IAorICBjYXNlIFR5cGU6Olg4Nl9GUDgwVHlJRDoKKyAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOgorICBjYXNlIFR5cGU6OkZQMTI4VHlJRDogeworICAgIENvbnN0YW50RlAgKkZQQyA9IGNhc3Q8Q29uc3RhbnRGUD4oQ1BWKTsKKyAgICBzdGQ6Om1hcDxjb25zdCBDb25zdGFudEZQKiwgdW5zaWduZWQ+OjppdGVyYXRvciBJID0gRlBDb25zdGFudE1hcC5maW5kKEZQQyk7CisgICAgaWYgKEkgIT0gRlBDb25zdGFudE1hcC5lbmQoKSkgeworICAgICAgLy8gQmVjYXVzZSBvZiBGUCBwcmVjaXNpb24gcHJvYmxlbXMgd2UgbXVzdCBsb2FkIGZyb20gYSBzdGFjayBhbGxvY2F0ZWQKKyAgICAgIC8vIHZhbHVlIHRoYXQgaG9sZHMgdGhlIHZhbHVlIGluIGhleC4KKyAgICAgIE91dCA8PCAiKCooIiA8PCAoRlBDLT5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0RmxvYXRUeShDUFYtPmdldENvbnRleHQoKSkgPworICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQiIDogCisgICAgICAgICAgICAgICAgICAgICAgIEZQQy0+Z2V0VHlwZSgpID09IFR5cGU6OmdldERvdWJsZVR5KENQVi0+Z2V0Q29udGV4dCgpKSA/IAorICAgICAgICAgICAgICAgICAgICAgICAiZG91YmxlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICJsb25nIGRvdWJsZSIpCisgICAgICAgICAgPDwgIiopJkZQQ29uc3RhbnQiIDw8IEktPnNlY29uZCA8PCAnKSc7CisgICAgfSBlbHNlIHsKKyAgICAgIGRvdWJsZSBWOworICAgICAgaWYgKEZQQy0+Z2V0VHlwZSgpID09IFR5cGU6OmdldEZsb2F0VHkoQ1BWLT5nZXRDb250ZXh0KCkpKQorICAgICAgICBWID0gRlBDLT5nZXRWYWx1ZUFQRigpLmNvbnZlcnRUb0Zsb2F0KCk7CisgICAgICBlbHNlIGlmIChGUEMtPmdldFR5cGUoKSA9PSBUeXBlOjpnZXREb3VibGVUeShDUFYtPmdldENvbnRleHQoKSkpCisgICAgICAgIFYgPSBGUEMtPmdldFZhbHVlQVBGKCkuY29udmVydFRvRG91YmxlKCk7CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gTG9uZyBkb3VibGUuICBDb252ZXJ0IHRoZSBudW1iZXIgdG8gZG91YmxlLCBkaXNjYXJkaW5nIHByZWNpc2lvbi4KKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYXdlc29tZSwgYnV0IGl0IGF0IGxlYXN0IG1ha2VzIHRoZSBDQkUgb3V0cHV0IHNvbWV3aGF0CisgICAgICAgIC8vIHVzZWZ1bC4KKyAgICAgICAgQVBGbG9hdCBUbXAgPSBGUEMtPmdldFZhbHVlQVBGKCk7CisgICAgICAgIGJvb2wgTG9zZXNJbmZvOworICAgICAgICBUbXAuY29udmVydChBUEZsb2F0OjpJRUVFZG91YmxlLCBBUEZsb2F0OjpybVRvd2FyZFplcm8sICZMb3Nlc0luZm8pOworICAgICAgICBWID0gVG1wLmNvbnZlcnRUb0RvdWJsZSgpOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoSXNOQU4oVikpIHsKKyAgICAgICAgLy8gVGhlIHZhbHVlIGlzIE5hTgorCisgICAgICAgIC8vIEZJWE1FIHRoZSBhY3R1YWwgTmFOIGJpdHMgc2hvdWxkIGJlIGVtaXR0ZWQuCisgICAgICAgIC8vIFRoZSBwcmVmaXggZm9yIGEgcXVpZXQgTmFOIGlzIDB4N0ZGOC4gRm9yIGEgc2lnbmFsbGluZyBOYU4sCisgICAgICAgIC8vIGl0J3MgMHg3ZmY0LgorICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIFF1aWV0TmFOID0gMHg3ZmY4VUw7CisgICAgICAgIC8vY29uc3QgdW5zaWduZWQgbG9uZyBTaWduYWxOYU4gPSAweDdmZjRVTDsKKworICAgICAgICAvLyBXZSBuZWVkIHRvIGdyYWIgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIEZQICMKKyAgICAgICAgY2hhciBCdWZmZXJbMTAwXTsKKworICAgICAgICB1aW50NjRfdCBsbCA9IERvdWJsZVRvQml0cyhWKTsKKyAgICAgICAgc3ByaW50ZihCdWZmZXIsICIweCVsbHgiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KGxsKSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgTnVtKCZCdWZmZXJbMF0sICZCdWZmZXJbNl0pOworICAgICAgICB1bnNpZ25lZCBsb25nIFZhbCA9IHN0cnRvdWwoTnVtLmNfc3RyKCksIDAsIDE2KTsKKworICAgICAgICBpZiAoRlBDLT5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0RmxvYXRUeShGUEMtPmdldENvbnRleHQoKSkpCisgICAgICAgICAgT3V0IDw8ICJMTFZNX05BTiIgPDwgKFZhbCA9PSBRdWlldE5hTiA/ICIiIDogIlMiKSA8PCAiRihcIiIKKyAgICAgICAgICAgICAgPDwgQnVmZmVyIDw8ICJcIikgLypuYW4qLyAiOworICAgICAgICBlbHNlCisgICAgICAgICAgT3V0IDw8ICJMTFZNX05BTiIgPDwgKFZhbCA9PSBRdWlldE5hTiA/ICIiIDogIlMiKSA8PCAiKFwiIgorICAgICAgICAgICAgICA8PCBCdWZmZXIgPDwgIlwiKSAvKm5hbiovICI7CisgICAgICB9IGVsc2UgaWYgKElzSW5mKFYpKSB7CisgICAgICAgIC8vIFRoZSB2YWx1ZSBpcyBJbmYKKyAgICAgICAgaWYgKFYgPCAwKSBPdXQgPDwgJy0nOworICAgICAgICBPdXQgPDwgIkxMVk1fSU5GIiA8PAorICAgICAgICAgICAgKEZQQy0+Z2V0VHlwZSgpID09IFR5cGU6OmdldEZsb2F0VHkoRlBDLT5nZXRDb250ZXh0KCkpID8gIkYiIDogIiIpCisgICAgICAgICAgICA8PCAiIC8qaW5mKi8gIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIE51bTsKKyNpZiBIQVZFX1BSSU5URl9BICYmIEVOQUJMRV9DQkVfUFJJTlRGX0EKKyAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSBjb25zdGFudCBhcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4KKyAgICAgICAgY2hhciBCdWZmZXJbMTAwXTsKKyAgICAgICAgc3ByaW50ZihCdWZmZXIsICIlYSIsIFYpOworICAgICAgICBOdW0gPSBCdWZmZXI7CisjZWxzZQorICAgICAgICBOdW0gPSBmdG9zdHIoRlBDLT5nZXRWYWx1ZUFQRigpKTsKKyNlbmRpZgorICAgICAgIE91dCA8PCBOdW07CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBUeXBlOjpBcnJheVR5SUQ6CisgICAgLy8gVXNlIEM5OSBjb21wb3VuZCBleHByZXNzaW9uIGxpdGVyYWwgaW5pdGlhbGl6ZXIgc3ludGF4LgorICAgIGlmICghU3RhdGljKSB7CisgICAgICBPdXQgPDwgIigiOworICAgICAgcHJpbnRUeXBlKE91dCwgQ1BWLT5nZXRUeXBlKCkpOworICAgICAgT3V0IDw8ICIpIjsKKyAgICB9CisgICAgT3V0IDw8ICJ7ICI7IC8vIEFycmF5cyBhcmUgd3JhcHBlZCBpbiBzdHJ1Y3QgdHlwZXMuCisgICAgaWYgKENvbnN0YW50QXJyYXkgKkNBID0gZHluX2Nhc3Q8Q29uc3RhbnRBcnJheT4oQ1BWKSkgeworICAgICAgcHJpbnRDb25zdGFudEFycmF5KENBLCBTdGF0aWMpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oQ1BWKSB8fCBpc2E8VW5kZWZWYWx1ZT4oQ1BWKSk7CisgICAgICBjb25zdCBBcnJheVR5cGUgKkFUID0gY2FzdDxBcnJheVR5cGU+KENQVi0+Z2V0VHlwZSgpKTsKKyAgICAgIE91dCA8PCAneyc7CisgICAgICBpZiAoQVQtPmdldE51bUVsZW1lbnRzKCkpIHsKKyAgICAgICAgT3V0IDw8ICcgJzsKKyAgICAgICAgQ29uc3RhbnQgKkNaID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShBVC0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICAgIHByaW50Q29uc3RhbnQoQ1osIFN0YXRpYyk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBBVC0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBPdXQgPDwgIiwgIjsKKyAgICAgICAgICBwcmludENvbnN0YW50KENaLCBTdGF0aWMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBPdXQgPDwgIiB9IjsKKyAgICB9CisgICAgT3V0IDw8ICIgfSI7IC8vIEFycmF5cyBhcmUgd3JhcHBlZCBpbiBzdHJ1Y3QgdHlwZXMuCisgICAgYnJlYWs7CisKKyAgY2FzZSBUeXBlOjpWZWN0b3JUeUlEOgorICAgIC8vIFVzZSBDOTkgY29tcG91bmQgZXhwcmVzc2lvbiBsaXRlcmFsIGluaXRpYWxpemVyIHN5bnRheC4KKyAgICBpZiAoIVN0YXRpYykgeworICAgICAgT3V0IDw8ICIoIjsKKyAgICAgIHByaW50VHlwZShPdXQsIENQVi0+Z2V0VHlwZSgpKTsKKyAgICAgIE91dCA8PCAiKSI7CisgICAgfQorICAgIGlmIChDb25zdGFudFZlY3RvciAqQ1YgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oQ1BWKSkgeworICAgICAgcHJpbnRDb25zdGFudFZlY3RvcihDViwgU3RhdGljKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KENQVikgfHwgaXNhPFVuZGVmVmFsdWU+KENQVikpOworICAgICAgY29uc3QgVmVjdG9yVHlwZSAqVlQgPSBjYXN0PFZlY3RvclR5cGU+KENQVi0+Z2V0VHlwZSgpKTsKKyAgICAgIE91dCA8PCAieyAiOworICAgICAgQ29uc3RhbnQgKkNaID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShWVC0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICBwcmludENvbnN0YW50KENaLCBTdGF0aWMpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFZULT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBPdXQgPDwgIiwgIjsKKyAgICAgICAgcHJpbnRDb25zdGFudChDWiwgU3RhdGljKTsKKyAgICAgIH0KKyAgICAgIE91dCA8PCAiIH0iOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIFR5cGU6OlN0cnVjdFR5SUQ6CisgICAgLy8gVXNlIEM5OSBjb21wb3VuZCBleHByZXNzaW9uIGxpdGVyYWwgaW5pdGlhbGl6ZXIgc3ludGF4LgorICAgIGlmICghU3RhdGljKSB7CisgICAgICBPdXQgPDwgIigiOworICAgICAgcHJpbnRUeXBlKE91dCwgQ1BWLT5nZXRUeXBlKCkpOworICAgICAgT3V0IDw8ICIpIjsKKyAgICB9CisgICAgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KENQVikgfHwgaXNhPFVuZGVmVmFsdWU+KENQVikpIHsKKyAgICAgIGNvbnN0IFN0cnVjdFR5cGUgKlNUID0gY2FzdDxTdHJ1Y3RUeXBlPihDUFYtPmdldFR5cGUoKSk7CisgICAgICBPdXQgPDwgJ3snOworICAgICAgaWYgKFNULT5nZXROdW1FbGVtZW50cygpKSB7CisgICAgICAgIE91dCA8PCAnICc7CisgICAgICAgIHByaW50Q29uc3RhbnQoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShTVC0+Z2V0RWxlbWVudFR5cGUoMCkpLCBTdGF0aWMpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gU1QtPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgT3V0IDw8ICIsICI7CisgICAgICAgICAgcHJpbnRDb25zdGFudChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFNULT5nZXRFbGVtZW50VHlwZShpKSksIFN0YXRpYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIE91dCA8PCAiIH0iOworICAgIH0gZWxzZSB7CisgICAgICBPdXQgPDwgJ3snOworICAgICAgaWYgKENQVi0+Z2V0TnVtT3BlcmFuZHMoKSkgeworICAgICAgICBPdXQgPDwgJyAnOworICAgICAgICBwcmludENvbnN0YW50KGNhc3Q8Q29uc3RhbnQ+KENQVi0+Z2V0T3BlcmFuZCgwKSksIFN0YXRpYyk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBDUFYtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgT3V0IDw8ICIsICI7CisgICAgICAgICAgcHJpbnRDb25zdGFudChjYXN0PENvbnN0YW50PihDUFYtPmdldE9wZXJhbmQoaSkpLCBTdGF0aWMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBPdXQgPDwgIiB9IjsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICBpZiAoaXNhPENvbnN0YW50UG9pbnRlck51bGw+KENQVikpIHsKKyAgICAgIE91dCA8PCAiKCgiOworICAgICAgcHJpbnRUeXBlKE91dCwgQ1BWLT5nZXRUeXBlKCkpOyAvLyBzaWduIGRvZXNuJ3QgbWF0dGVyCisgICAgICBPdXQgPDwgIikvKk5VTEwqLzApIjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KENQVikpIHsKKyAgICAgIHdyaXRlT3BlcmFuZChHViwgU3RhdGljKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBGQUxMIFRIUk9VR0gKKyAgZGVmYXVsdDoKKyNpZm5kZWYgTkRFQlVHCisgICAgZXJycygpIDw8ICJVbmtub3duIGNvbnN0YW50IHR5cGU6ICIgPDwgKkNQViA8PCAiXG4iOworI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorfQorCisvLyBTb21lIGNvbnN0YW50IGV4cHJlc3Npb25zIG5lZWQgdG8gYmUgY2FzdGVkIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHR5cGVzCisvLyBiZWNhdXNlIHRoZWlyIG9wZXJhbmRzIHdlcmUgY2FzdGVkIHRvIHRoZSBleHBlY3RlZCB0eXBlLiBUaGlzIGZ1bmN0aW9uIHRha2VzCisvLyBjYXJlIG9mIGRldGVjdGluZyB0aGF0IGNhc2UgYW5kIHByaW50aW5nIHRoZSBjYXN0IGZvciB0aGUgQ29uc3RhbnRFeHByLgorYm9vbCBDV3JpdGVyOjpwcmludENvbnN0RXhwckNhc3QoY29uc3QgQ29uc3RhbnRFeHByKiBDRSwgYm9vbCBTdGF0aWMpIHsKKyAgYm9vbCBOZWVkc0V4cGxpY2l0Q2FzdCA9IGZhbHNlOworICBjb25zdCBUeXBlICpUeSA9IENFLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgIGJvb2wgVHlwZUlzU2lnbmVkID0gZmFsc2U7CisgIHN3aXRjaCAoQ0UtPmdldE9wY29kZSgpKSB7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgICAgLy8gV2UgbmVlZCB0byBjYXN0IGludGVnZXIgYXJpdGhtZXRpYyBzbyB0aGF0IGl0IGlzIGFsd2F5cyBwZXJmb3JtZWQKKyAgICAvLyBhcyB1bnNpZ25lZCwgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW9yIG9uIG92ZXJmbG93LgorICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOgorICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOiAKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjogTmVlZHNFeHBsaWNpdENhc3QgPSB0cnVlOyBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbTogCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNEaXY6IE5lZWRzRXhwbGljaXRDYXN0ID0gdHJ1ZTsgVHlwZUlzU2lnbmVkID0gdHJ1ZTsgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6CisgICAgVHkgPSBDRS0+Z2V0VHlwZSgpOworICAgIE5lZWRzRXhwbGljaXRDYXN0ID0gdHJ1ZTsKKyAgICBUeXBlSXNTaWduZWQgPSB0cnVlOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICBjYXNlIEluc3RydWN0aW9uOjpGUFRvVUk6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSToKKyAgY2FzZSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOgorICBjYXNlIEluc3RydWN0aW9uOjpCaXRDYXN0OgorICAgIFR5ID0gQ0UtPmdldFR5cGUoKTsKKyAgICBOZWVkc0V4cGxpY2l0Q2FzdCA9IHRydWU7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIGlmIChOZWVkc0V4cGxpY2l0Q2FzdCkgeworICAgIE91dCA8PCAiKCgiOworICAgIGlmIChUeS0+aXNJbnRlZ2VyVHkoKSAmJiBUeSAhPSBUeXBlOjpnZXRJbnQxVHkoVHktPmdldENvbnRleHQoKSkpCisgICAgICBwcmludFNpbXBsZVR5cGUoT3V0LCBUeSwgVHlwZUlzU2lnbmVkKTsKKyAgICBlbHNlCisgICAgICBwcmludFR5cGUoT3V0LCBUeSk7IC8vIG5vdCBpbnRlZ2VyLCBzaWduIGRvZXNuJ3QgbWF0dGVyCisgICAgT3V0IDw8ICIpKCI7CisgIH0KKyAgcmV0dXJuIE5lZWRzRXhwbGljaXRDYXN0OworfQorCisvLyAgUHJpbnQgYSBjb25zdGFudCBhc3N1bWluZyB0aGF0IGl0IGlzIHRoZSBvcGVyYW5kIGZvciBhIGdpdmVuIE9wY29kZS4gVGhlCisvLyAgb3Bjb2RlcyB0aGF0IGNhcmUgYWJvdXQgc2lnbiBuZWVkIHRvIGNhc3QgdGhlaXIgb3BlcmFuZHMgdG8gdGhlIGV4cGVjdGVkCisvLyAgdHlwZSBiZWZvcmUgdGhlIG9wZXJhdGlvbiBwcm9jZWVkcy4gVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBjYXN0aW5nLgordm9pZCBDV3JpdGVyOjpwcmludENvbnN0YW50V2l0aENhc3QoQ29uc3RhbnQqIENQViwgdW5zaWduZWQgT3Bjb2RlKSB7CisKKyAgLy8gRXh0cmFjdCB0aGUgb3BlcmFuZCdzIHR5cGUsIHdlJ2xsIG5lZWQgaXQuCisgIGNvbnN0IFR5cGUqIE9wVHkgPSBDUFYtPmdldFR5cGUoKTsKKworICAvLyBJbmRpY2F0ZSB3aGV0aGVyIHRvIGRvIHRoZSBjYXN0IG9yIG5vdC4KKyAgYm9vbCBzaG91bGRDYXN0ID0gZmFsc2U7CisgIGJvb2wgdHlwZUlzU2lnbmVkID0gZmFsc2U7CisKKyAgLy8gQmFzZWQgb24gdGhlIE9wY29kZSBmb3Igd2hpY2ggdGhpcyBDb25zdGFudCBpcyBiZWluZyB3cml0dGVuLCBkZXRlcm1pbmUKKyAgLy8gdGhlIG5ldyB0eXBlIHRvIHdoaWNoIHRoZSBvcGVyYW5kIHNob3VsZCBiZSBjYXN0ZWQgYnkgc2V0dGluZyB0aGUgdmFsdWUKKyAgLy8gb2YgT3BUeS4gSWYgd2UgY2hhbmdlIE9wVHksIGFsc28gc2V0IHNob3VsZENhc3QgdG8gdHJ1ZSBzbyBpdCBnZXRzCisgIC8vIGNhc3RlZCBiZWxvdy4KKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gZm9yIG1vc3QgaW5zdHJ1Y3Rpb25zLCBpdCBkb2Vzbid0IG1hdHRlcgorICAgICAgYnJlYWs7IAorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTdWI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICAgICAgLy8gV2UgbmVlZCB0byBjYXN0IGludGVnZXIgYXJpdGhtZXRpYyBzbyB0aGF0IGl0IGlzIGFsd2F5cyBwZXJmb3JtZWQKKyAgICAgIC8vIGFzIHVuc2lnbmVkLCB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3Igb24gb3ZlcmZsb3cuCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgICBzaG91bGRDYXN0ID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0RpdjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOgorICAgICAgc2hvdWxkQ2FzdCA9IHRydWU7CisgICAgICB0eXBlSXNTaWduZWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgIH0KKworICAvLyBXcml0ZSBvdXQgdGhlIGNhc3RlZCBjb25zdGFudCBpZiB3ZSBzaG91bGQsIG90aGVyd2lzZSBqdXN0IHdyaXRlIHRoZQorICAvLyBvcGVyYW5kLgorICBpZiAoc2hvdWxkQ2FzdCkgeworICAgIE91dCA8PCAiKCgiOworICAgIHByaW50U2ltcGxlVHlwZShPdXQsIE9wVHksIHR5cGVJc1NpZ25lZCk7CisgICAgT3V0IDw8ICIpIjsKKyAgICBwcmludENvbnN0YW50KENQViwgZmFsc2UpOworICAgIE91dCA8PCAiKSI7CisgIH0gZWxzZSAKKyAgICBwcmludENvbnN0YW50KENQViwgZmFsc2UpOworfQorCitzdGQ6OnN0cmluZyBDV3JpdGVyOjpHZXRWYWx1ZU5hbWUoY29uc3QgVmFsdWUgKk9wZXJhbmQpIHsKKworICAvLyBSZXNvbHZlIHBvdGVudGlhbCBhbGlhcy4KKyAgaWYgKGNvbnN0IEdsb2JhbEFsaWFzICpHQSA9IGR5bl9jYXN0PEdsb2JhbEFsaWFzPihPcGVyYW5kKSkgeworICAgIGlmIChjb25zdCBWYWx1ZSAqViA9IEdBLT5yZXNvbHZlQWxpYXNlZEdsb2JhbChmYWxzZSkpCisgICAgICBPcGVyYW5kID0gVjsKKyAgfQorCisgIC8vIE1hbmdsZSBnbG9iYWxzIHdpdGggdGhlIHN0YW5kYXJkIG1hbmdsZXIgaW50ZXJmYWNlIGZvciBMTEMgY29tcGF0aWJpbGl0eS4KKyAgaWYgKGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhbHVlPihPcGVyYW5kKSkgeworICAgIFNtYWxsU3RyaW5nPDEyOD4gU3RyOworICAgIE1hbmctPmdldE5hbWVXaXRoUHJlZml4KFN0ciwgR1YsIGZhbHNlKTsKKyAgICByZXR1cm4gQ0JFTWFuZ2xlKFN0ci5zdHIoKS5zdHIoKSk7CisgIH0KKyAgICAKKyAgc3RkOjpzdHJpbmcgTmFtZSA9IE9wZXJhbmQtPmdldE5hbWUoKTsKKyAgICAKKyAgaWYgKE5hbWUuZW1wdHkoKSkgeyAvLyBBc3NpZ24gdW5pcXVlIG5hbWVzIHRvIGxvY2FsIHRlbXBvcmFyaWVzLgorICAgIHVuc2lnbmVkICZObyA9IEFub25WYWx1ZU51bWJlcnNbT3BlcmFuZF07CisgICAgaWYgKE5vID09IDApCisgICAgICBObyA9ICsrTmV4dEFub25WYWx1ZU51bWJlcjsKKyAgICBOYW1lID0gInRtcF9fIiArIHV0b3N0cihObyk7CisgIH0KKyAgICAKKyAgc3RkOjpzdHJpbmcgVmFyTmFtZTsKKyAgVmFyTmFtZS5yZXNlcnZlKE5hbWUuY2FwYWNpdHkoKSk7CisKKyAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgSSA9IE5hbWUuYmVnaW4oKSwgRSA9IE5hbWUuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBjaGFyIGNoID0gKkk7CisKKyAgICBpZiAoISgoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHx8CisgICAgICAgICAgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8IGNoID09ICdfJykpIHsKKyAgICAgIGNoYXIgYnVmZmVyWzVdOworICAgICAgc3ByaW50ZihidWZmZXIsICJfJXhfIiwgY2gpOworICAgICAgVmFyTmFtZSArPSBidWZmZXI7CisgICAgfSBlbHNlCisgICAgICBWYXJOYW1lICs9IGNoOworICB9CisKKyAgcmV0dXJuICJsbHZtX2NiZV8iICsgVmFyTmFtZTsKK30KKworLy8vIHdyaXRlSW5zdENvbXB1dGF0aW9uSW5saW5lIC0gRW1pdCB0aGUgY29tcHV0YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQKKy8vLyBpbnN0cnVjdGlvbiBpbmxpbmUsIHdpdGggbm8gZGVzdGluYXRpb24gcHJvdmlkZWQuCit2b2lkIENXcml0ZXI6OndyaXRlSW5zdENvbXB1dGF0aW9uSW5saW5lKEluc3RydWN0aW9uICZJKSB7CisgIC8vIFdlIGNhbid0IGN1cnJlbnRseSBzdXBwb3J0IGludGVnZXIgdHlwZXMgb3RoZXIgdGhhbiAxLCA4LCAxNiwgMzIsIDY0LgorICAvLyBWYWxpZGF0ZSB0aGlzLgorICBjb25zdCBUeXBlICpUeSA9IEkuZ2V0VHlwZSgpOworICBpZiAoVHktPmlzSW50ZWdlclR5KCkgJiYgKFR5IT1UeXBlOjpnZXRJbnQxVHkoSS5nZXRDb250ZXh0KCkpICYmCisgICAgICAgIFR5IT1UeXBlOjpnZXRJbnQ4VHkoSS5nZXRDb250ZXh0KCkpICYmIAorICAgICAgICBUeSE9VHlwZTo6Z2V0SW50MTZUeShJLmdldENvbnRleHQoKSkgJiYKKyAgICAgICAgVHkhPVR5cGU6OmdldEludDMyVHkoSS5nZXRDb250ZXh0KCkpICYmCisgICAgICAgIFR5IT1UeXBlOjpnZXRJbnQ2NFR5KEkuZ2V0Q29udGV4dCgpKSkpIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiVGhlIEMgYmFja2VuZCBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBpbnRlZ2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlcyBvZiB3aWR0aHMgb3RoZXIgdGhhbiAxLCA4LCAxNiwgMzIsIDY0LlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYmVpbmcgdHJhY2tlZCBhcyBQUiA0MTU4LiIpOworICB9CisKKyAgLy8gSWYgdGhpcyBpcyBhIG5vbi10cml2aWFsIGJvb2wgY29tcHV0YXRpb24sIG1ha2Ugc3VyZSB0byB0cnVuY2F0ZSBkb3duIHRvCisgIC8vIGEgMSBiaXQgdmFsdWUuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHdlIHdhbnQgImFkZCBpMSB4LCB5IiB0byByZXR1cm4KKyAgLy8gIjAiIHdoZW4geCBhbmQgeSBhcmUgdHJ1ZSwgbm90ICIyIiBmb3IgZXhhbXBsZS4KKyAgYm9vbCBOZWVkQm9vbFRydW5jID0gZmFsc2U7CisgIGlmIChJLmdldFR5cGUoKSA9PSBUeXBlOjpnZXRJbnQxVHkoSS5nZXRDb250ZXh0KCkpICYmCisgICAgICAhaXNhPElDbXBJbnN0PihJKSAmJiAhaXNhPEZDbXBJbnN0PihJKSkKKyAgICBOZWVkQm9vbFRydW5jID0gdHJ1ZTsKKyAgCisgIGlmIChOZWVkQm9vbFRydW5jKQorICAgIE91dCA8PCAiKCgiOworICAKKyAgdmlzaXQoSSk7CisgIAorICBpZiAoTmVlZEJvb2xUcnVuYykKKyAgICBPdXQgPDwgIikmMSkiOworfQorCisKK3ZvaWQgQ1dyaXRlcjo6d3JpdGVPcGVyYW5kSW50ZXJuYWwoVmFsdWUgKk9wZXJhbmQsIGJvb2wgU3RhdGljKSB7CisgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihPcGVyYW5kKSkKKyAgICAvLyBTaG91bGQgd2UgaW5saW5lIHRoaXMgaW5zdHJ1Y3Rpb24gdG8gYnVpbGQgYSB0cmVlPworICAgIGlmIChpc0lubGluYWJsZUluc3QoKkkpICYmICFpc0RpcmVjdEFsbG9jYShJKSkgeworICAgICAgT3V0IDw8ICcoJzsKKyAgICAgIHdyaXRlSW5zdENvbXB1dGF0aW9uSW5saW5lKCpJKTsKKyAgICAgIE91dCA8PCAnKSc7CisgICAgICByZXR1cm47CisgICAgfQorCisgIENvbnN0YW50KiBDUFYgPSBkeW5fY2FzdDxDb25zdGFudD4oT3BlcmFuZCk7CisKKyAgaWYgKENQViAmJiAhaXNhPEdsb2JhbFZhbHVlPihDUFYpKQorICAgIHByaW50Q29uc3RhbnQoQ1BWLCBTdGF0aWMpOworICBlbHNlCisgICAgT3V0IDw8IEdldFZhbHVlTmFtZShPcGVyYW5kKTsKK30KKwordm9pZCBDV3JpdGVyOjp3cml0ZU9wZXJhbmQoVmFsdWUgKk9wZXJhbmQsIGJvb2wgU3RhdGljKSB7CisgIGJvb2wgaXNBZGRyZXNzSW1wbGljaXQgPSBpc0FkZHJlc3NFeHBvc2VkKE9wZXJhbmQpOworICBpZiAoaXNBZGRyZXNzSW1wbGljaXQpCisgICAgT3V0IDw8ICIoJiI7ICAvLyBHbG9iYWwgdmFyaWFibGVzIGFyZSByZWZlcmVuY2VkIGFzIHRoZWlyIGFkZHJlc3NlcyBieSBsbHZtCisKKyAgd3JpdGVPcGVyYW5kSW50ZXJuYWwoT3BlcmFuZCwgU3RhdGljKTsKKworICBpZiAoaXNBZGRyZXNzSW1wbGljaXQpCisgICAgT3V0IDw8ICcpJzsKK30KKworLy8gU29tZSBpbnN0cnVjdGlvbnMgbmVlZCB0byBoYXZlIHRoZWlyIHJlc3VsdCB2YWx1ZSBjYXN0ZWQgYmFjayB0byB0aGUgCisvLyBvcmlnaW5hbCB0eXBlcyBiZWNhdXNlIHRoZWlyIG9wZXJhbmRzIHdlcmUgY2FzdGVkIHRvIHRoZSBleHBlY3RlZCB0eXBlLiAKKy8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBkZXRlY3RpbmcgdGhhdCBjYXNlIGFuZCBwcmludGluZyB0aGUgY2FzdCAKKy8vIGZvciB0aGUgSW5zdHJ1Y3Rpb24uCitib29sIENXcml0ZXI6OndyaXRlSW5zdHJ1Y3Rpb25DYXN0KGNvbnN0IEluc3RydWN0aW9uICZJKSB7CisgIGNvbnN0IFR5cGUgKlR5ID0gSS5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgIHN3aXRjaCAoSS5nZXRPcGNvZGUoKSkgeworICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICAgIC8vIFdlIG5lZWQgdG8gY2FzdCBpbnRlZ2VyIGFyaXRobWV0aWMgc28gdGhhdCBpdCBpcyBhbHdheXMgcGVyZm9ybWVkCisgICAgLy8gYXMgdW5zaWduZWQsIHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvciBvbiBvdmVyZmxvdy4KKyAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbTogCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVEaXY6IAorICAgIE91dCA8PCAiKCgiOworICAgIHByaW50U2ltcGxlVHlwZShPdXQsIFR5LCBmYWxzZSk7CisgICAgT3V0IDw8ICIpKCI7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNSZW06IAorICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OiAKKyAgICBPdXQgPDwgIigoIjsKKyAgICBwcmludFNpbXBsZVR5cGUoT3V0LCBUeSwgdHJ1ZSk7CisgICAgT3V0IDw8ICIpKCI7CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gV3JpdGUgdGhlIG9wZXJhbmQgd2l0aCBhIGNhc3QgdG8gYW5vdGhlciB0eXBlIGJhc2VkIG9uIHRoZSBPcGNvZGUgYmVpbmcgdXNlZC4KKy8vIFRoaXMgd2lsbCBiZSB1c2VkIGluIGNhc2VzIHdoZXJlIGFuIGluc3RydWN0aW9uIGhhcyBzcGVjaWZpYyB0eXBlCisvLyByZXF1aXJlbWVudHMgKHVzdWFsbHkgc2lnbmVkbmVzcykgZm9yIGl0cyBvcGVyYW5kcy4gCit2b2lkIENXcml0ZXI6OndyaXRlT3BlcmFuZFdpdGhDYXN0KFZhbHVlKiBPcGVyYW5kLCB1bnNpZ25lZCBPcGNvZGUpIHsKKworICAvLyBFeHRyYWN0IHRoZSBvcGVyYW5kJ3MgdHlwZSwgd2UnbGwgbmVlZCBpdC4KKyAgY29uc3QgVHlwZSogT3BUeSA9IE9wZXJhbmQtPmdldFR5cGUoKTsKKworICAvLyBJbmRpY2F0ZSB3aGV0aGVyIHRvIGRvIHRoZSBjYXN0IG9yIG5vdC4KKyAgYm9vbCBzaG91bGRDYXN0ID0gZmFsc2U7CisKKyAgLy8gSW5kaWNhdGUgd2hldGhlciB0aGUgY2FzdCBzaG91bGQgYmUgdG8gYSBzaWduZWQgdHlwZSBvciBub3QuCisgIGJvb2wgY2FzdElzU2lnbmVkID0gZmFsc2U7CisKKyAgLy8gQmFzZWQgb24gdGhlIE9wY29kZSBmb3Igd2hpY2ggdGhpcyBPcGVyYW5kIGlzIGJlaW5nIHdyaXR0ZW4sIGRldGVybWluZQorICAvLyB0aGUgbmV3IHR5cGUgdG8gd2hpY2ggdGhlIG9wZXJhbmQgc2hvdWxkIGJlIGNhc3RlZCBieSBzZXR0aW5nIHRoZSB2YWx1ZQorICAvLyBvZiBPcFR5LiBJZiB3ZSBjaGFuZ2UgT3BUeSwgYWxzbyBzZXQgc2hvdWxkQ2FzdCB0byB0cnVlLgorICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGRlZmF1bHQ6CisgICAgICAvLyBmb3IgbW9zdCBpbnN0cnVjdGlvbnMsIGl0IGRvZXNuJ3QgbWF0dGVyCisgICAgICBicmVhazsgCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgICAgICAvLyBXZSBuZWVkIHRvIGNhc3QgaW50ZWdlciBhcml0aG1ldGljIHNvIHRoYXQgaXQgaXMgYWx3YXlzIHBlcmZvcm1lZAorICAgICAgLy8gYXMgdW5zaWduZWQsIHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvciBvbiBvdmVyZmxvdy4KKyAgICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVEaXY6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbTogLy8gQ2FzdCB0byB1bnNpZ25lZCBmaXJzdAorICAgICAgc2hvdWxkQ2FzdCA9IHRydWU7CisgICAgICBjYXN0SXNTaWduZWQgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNSZW06IC8vIENhc3QgdG8gc2lnbmVkIGZpcnN0CisgICAgICBzaG91bGRDYXN0ID0gdHJ1ZTsKKyAgICAgIGNhc3RJc1NpZ25lZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgfQorCisgIC8vIFdyaXRlIG91dCB0aGUgY2FzdGVkIG9wZXJhbmQgaWYgd2Ugc2hvdWxkLCBvdGhlcndpc2UganVzdCB3cml0ZSB0aGUKKyAgLy8gb3BlcmFuZC4KKyAgaWYgKHNob3VsZENhc3QpIHsKKyAgICBPdXQgPDwgIigoIjsKKyAgICBwcmludFNpbXBsZVR5cGUoT3V0LCBPcFR5LCBjYXN0SXNTaWduZWQpOworICAgIE91dCA8PCAiKSI7CisgICAgd3JpdGVPcGVyYW5kKE9wZXJhbmQpOworICAgIE91dCA8PCAiKSI7CisgIH0gZWxzZSAKKyAgICB3cml0ZU9wZXJhbmQoT3BlcmFuZCk7Cit9CisKKy8vIFdyaXRlIHRoZSBvcGVyYW5kIHdpdGggYSBjYXN0IHRvIGFub3RoZXIgdHlwZSBiYXNlZCBvbiB0aGUgaWNtcCBwcmVkaWNhdGUgCisvLyBiZWluZyB1c2VkLiAKK3ZvaWQgQ1dyaXRlcjo6d3JpdGVPcGVyYW5kV2l0aENhc3QoVmFsdWUqIE9wZXJhbmQsIGNvbnN0IElDbXBJbnN0ICZDbXApIHsKKyAgLy8gVGhpcyBoYXMgdG8gZG8gYSBjYXN0IHRvIGVuc3VyZSB0aGUgb3BlcmFuZCBoYXMgdGhlIHJpZ2h0IHNpZ25lZG5lc3MuIAorICAvLyBBbHNvLCBpZiB0aGUgb3BlcmFuZCBpcyBhIHBvaW50ZXIsIHdlIG1ha2Ugc3VyZSB0byBjYXN0IHRvIGFuIGludGVnZXIgd2hlbgorICAvLyBkb2luZyB0aGUgY29tcGFyaXNvbiBib3RoIGZvciBzaWduZWRuZXNzIGFuZCBzbyB0aGF0IHRoZSBDIGNvbXBpbGVyIGRvZXNuJ3QKKyAgLy8gb3B0aW1pemUgdGhpbmdzIGxpa2UgInAgPCBOVUxMIiB0byBmYWxzZSAocCBtYXkgY29udGFpbiBhbiBpbnRlZ2VyIHZhbHVlCisgIC8vIGYuZS4pLgorICBib29sIHNob3VsZENhc3QgPSBDbXAuaXNSZWxhdGlvbmFsKCk7CisKKyAgLy8gV3JpdGUgb3V0IHRoZSBjYXN0ZWQgb3BlcmFuZCBpZiB3ZSBzaG91bGQsIG90aGVyd2lzZSBqdXN0IHdyaXRlIHRoZQorICAvLyBvcGVyYW5kLgorICBpZiAoIXNob3VsZENhc3QpIHsKKyAgICB3cml0ZU9wZXJhbmQoT3BlcmFuZCk7CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBTaG91bGQgdGhpcyBiZSBhIHNpZ25lZCBjb21wYXJpc29uPyAgSWYgc28sIGNvbnZlcnQgdG8gc2lnbmVkLgorICBib29sIGNhc3RJc1NpZ25lZCA9IENtcC5pc1NpZ25lZCgpOworCisgIC8vIElmIHRoZSBvcGVyYW5kIHdhcyBhIHBvaW50ZXIsIGNvbnZlcnQgdG8gYSBsYXJnZSBpbnRlZ2VyIHR5cGUuCisgIGNvbnN0IFR5cGUqIE9wVHkgPSBPcGVyYW5kLT5nZXRUeXBlKCk7CisgIGlmIChPcFR5LT5pc1BvaW50ZXJUeSgpKQorICAgIE9wVHkgPSBURC0+Z2V0SW50UHRyVHlwZShPcGVyYW5kLT5nZXRDb250ZXh0KCkpOworICAKKyAgT3V0IDw8ICIoKCI7CisgIHByaW50U2ltcGxlVHlwZShPdXQsIE9wVHksIGNhc3RJc1NpZ25lZCk7CisgIE91dCA8PCAiKSI7CisgIHdyaXRlT3BlcmFuZChPcGVyYW5kKTsKKyAgT3V0IDw8ICIpIjsKK30KKworLy8gZ2VuZXJhdGVDb21waWxlclNwZWNpZmljQ29kZSAtIFRoaXMgaXMgd2hlcmUgd2UgYWRkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uCisvLyBkaXJlY3RpdmVzIHRvIGNhdGVyIHRvIHNwZWNpZmljIGNvbXBpbGVycyBhcyBuZWVkIGJlLgorLy8KK3N0YXRpYyB2b2lkIGdlbmVyYXRlQ29tcGlsZXJTcGVjaWZpY0NvZGUoZm9ybWF0dGVkX3Jhd19vc3RyZWFtJiBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIC8vIEFsbG9jYSBpcyBoYXJkIHRvIGdldCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBzdGRsaWIuaCBoZXJlLgorICBPdXQgPDwgIi8qIGdldCBhIGRlY2xhcmF0aW9uIGZvciBhbGxvY2EgKi9cbiIKKyAgICAgIDw8ICIjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKVxuIgorICAgICAgPDwgIiNkZWZpbmUgIGFsbG9jYSh4KSBfX2J1aWx0aW5fYWxsb2NhKCh4KSlcbiIKKyAgICAgIDw8ICIjZGVmaW5lIF9hbGxvY2EoeCkgX19idWlsdGluX2FsbG9jYSgoeCkpXG4iCisgICAgICA8PCAiI2VsaWYgZGVmaW5lZChfX0FQUExFX18pXG4iCisgICAgICA8PCAiZXh0ZXJuIHZvaWQgKl9fYnVpbHRpbl9hbGxvY2EodW5zaWduZWQgbG9uZyk7XG4iCisgICAgICA8PCAiI2RlZmluZSBhbGxvY2EoeCkgX19idWlsdGluX2FsbG9jYSh4KVxuIgorICAgICAgPDwgIiNkZWZpbmUgbG9uZ2ptcCBfbG9uZ2ptcFxuIgorICAgICAgPDwgIiNkZWZpbmUgc2V0am1wIF9zZXRqbXBcbiIKKyAgICAgIDw8ICIjZWxpZiBkZWZpbmVkKF9fc3VuX18pXG4iCisgICAgICA8PCAiI2lmIGRlZmluZWQoX19zcGFyY3Y5KVxuIgorICAgICAgPDwgImV4dGVybiB2b2lkICpfX2J1aWx0aW5fYWxsb2NhKHVuc2lnbmVkIGxvbmcpO1xuIgorICAgICAgPDwgIiNlbHNlXG4iCisgICAgICA8PCAiZXh0ZXJuIHZvaWQgKl9fYnVpbHRpbl9hbGxvY2EodW5zaWduZWQgaW50KTtcbiIKKyAgICAgIDw8ICIjZW5kaWZcbiIKKyAgICAgIDw8ICIjZGVmaW5lIGFsbG9jYSh4KSBfX2J1aWx0aW5fYWxsb2NhKHgpXG4iCisgICAgICA8PCAiI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pIHx8IGRlZmluZWQoX19hcm1fXylcbiIKKyAgICAgIDw8ICIjZGVmaW5lIGFsbG9jYSh4KSBfX2J1aWx0aW5fYWxsb2NhKHgpXG4iCisgICAgICA8PCAiI2VsaWYgZGVmaW5lZChfTVNDX1ZFUilcbiIKKyAgICAgIDw8ICIjZGVmaW5lIGlubGluZSBfaW5saW5lXG4iCisgICAgICA8PCAiI2RlZmluZSBhbGxvY2EoeCkgX2FsbG9jYSh4KVxuIgorICAgICAgPDwgIiNlbHNlXG4iCisgICAgICA8PCAiI2luY2x1ZGUgPGFsbG9jYS5oPlxuIgorICAgICAgPDwgIiNlbmRpZlxuXG4iOworCisgIC8vIFdlIG91dHB1dCBHQ0Mgc3BlY2lmaWMgYXR0cmlidXRlcyB0byBwcmVzZXJ2ZSAnbGlua29uY2UnbmVzcyBvbiBnbG9iYWxzLgorICAvLyBJZiB3ZSBhcmVuJ3QgYmVpbmcgY29tcGlsZWQgd2l0aCBHQ0MsIGp1c3QgZHJvcCB0aGVzZSBhdHRyaWJ1dGVzLgorICBPdXQgPDwgIiNpZm5kZWYgX19HTlVDX18gIC8qIENhbiBvbmx5IHN1cHBvcnQgXCJsaW5rb25jZVwiIHZhcnMgd2l0aCBHQ0MgKi9cbiIKKyAgICAgIDw8ICIjZGVmaW5lIF9fYXR0cmlidXRlX18oWClcbiIKKyAgICAgIDw8ICIjZW5kaWZcblxuIjsKKworICAvLyBPbiBNYWMgT1MgWCwgImV4dGVybmFsIHdlYWsiIGlzIHNwZWxsZWQgIl9fYXR0cmlidXRlX18oKHdlYWtfaW1wb3J0KSkiLgorICBPdXQgPDwgIiNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXylcbiIKKyAgICAgIDw8ICIjZGVmaW5lIF9fRVhURVJOQUxfV0VBS19fIF9fYXR0cmlidXRlX18oKHdlYWtfaW1wb3J0KSlcbiIKKyAgICAgIDw8ICIjZWxpZiBkZWZpbmVkKF9fR05VQ19fKVxuIgorICAgICAgPDwgIiNkZWZpbmUgX19FWFRFUk5BTF9XRUFLX18gX19hdHRyaWJ1dGVfXygod2VhaykpXG4iCisgICAgICA8PCAiI2Vsc2VcbiIKKyAgICAgIDw8ICIjZGVmaW5lIF9fRVhURVJOQUxfV0VBS19fXG4iCisgICAgICA8PCAiI2VuZGlmXG5cbiI7CisKKyAgLy8gRm9yIG5vdywgdHVybiBvZmYgdGhlIHdlYWsgbGlua2FnZSBhdHRyaWJ1dGUgb24gTWFjIE9TIFguIChTZWUgYWJvdmUuKQorICBPdXQgPDwgIiNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXylcbiIKKyAgICAgIDw8ICIjZGVmaW5lIF9fQVRUUklCVVRFX1dFQUtfX1xuIgorICAgICAgPDwgIiNlbGlmIGRlZmluZWQoX19HTlVDX18pXG4iCisgICAgICA8PCAiI2RlZmluZSBfX0FUVFJJQlVURV9XRUFLX18gX19hdHRyaWJ1dGVfXygod2VhaykpXG4iCisgICAgICA8PCAiI2Vsc2VcbiIKKyAgICAgIDw8ICIjZGVmaW5lIF9fQVRUUklCVVRFX1dFQUtfX1xuIgorICAgICAgPDwgIiNlbmRpZlxuXG4iOworCisgIC8vIEFkZCBoaWRkZW4gdmlzaWJpbGl0eSBzdXBwb3J0LiBGSVhNRTogQVBQTEVfQ0M/CisgIE91dCA8PCAiI2lmIGRlZmluZWQoX19HTlVDX18pXG4iCisgICAgICA8PCAiI2RlZmluZSBfX0hJRERFTl9fIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJoaWRkZW5cIikpKVxuIgorICAgICAgPDwgIiNlbmRpZlxuXG4iOworICAgIAorICAvLyBEZWZpbmUgTmFOIGFuZCBJbmYgYXMgR0NDIGJ1aWx0aW5zIGlmIHVzaW5nIEdDQywgYXMgMCBvdGhlcndpc2UKKyAgLy8gRnJvbSB0aGUgR0NDIGRvY3VtZW50YXRpb246CisgIC8vCisgIC8vICAgZG91YmxlIF9fYnVpbHRpbl9uYW4gKGNvbnN0IGNoYXIgKnN0cikKKyAgLy8KKyAgLy8gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVNPIEM5OSBmdW5jdGlvbiBuYW4uCisgIC8vCisgIC8vIFNpbmNlIElTTyBDOTkgZGVmaW5lcyB0aGlzIGZ1bmN0aW9uIGluIHRlcm1zIG9mIHN0cnRvZCwgd2hpY2ggd2UgZG8KKyAgLy8gbm90IGltcGxlbWVudCwgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyc2luZyBpcyBpbiBvcmRlci4gVGhlIHN0cmluZyBpcworICAvLyBwYXJzZWQgYXMgYnkgc3RydG9sOyB0aGF0IGlzLCB0aGUgYmFzZSBpcyByZWNvZ25pemVkIGJ5IGxlYWRpbmcgMCBvcgorICAvLyAweCBwcmVmaXhlcy4gVGhlIG51bWJlciBwYXJzZWQgaXMgcGxhY2VkIGluIHRoZSBzaWduaWZpY2FuZCBzdWNoIHRoYXQKKyAgLy8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbnVtYmVyIGlzIGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudAorICAvLyBiaXQgb2YgdGhlIHNpZ25pZmljYW5kLiBUaGUgbnVtYmVyIGlzIHRydW5jYXRlZCB0byBmaXQgdGhlIHNpZ25pZmljYW5kCisgIC8vIGZpZWxkIHByb3ZpZGVkLiBUaGUgc2lnbmlmaWNhbmQgaXMgZm9yY2VkIHRvIGJlIGEgcXVpZXQgTmFOLgorICAvLworICAvLyBUaGlzIGZ1bmN0aW9uLCBpZiBnaXZlbiBhIHN0cmluZyBsaXRlcmFsLCBpcyBldmFsdWF0ZWQgZWFybHkgZW5vdWdoCisgIC8vIHRoYXQgaXQgaXMgY29uc2lkZXJlZCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KKyAgLy8KKyAgLy8gICBmbG9hdCBfX2J1aWx0aW5fbmFuZiAoY29uc3QgY2hhciAqc3RyKQorICAvLworICAvLyBTaW1pbGFyIHRvIF9fYnVpbHRpbl9uYW4sIGV4Y2VwdCB0aGUgcmV0dXJuIHR5cGUgaXMgZmxvYXQuCisgIC8vCisgIC8vICAgZG91YmxlIF9fYnVpbHRpbl9pbmYgKHZvaWQpCisgIC8vCisgIC8vIFNpbWlsYXIgdG8gX19idWlsdGluX2h1Z2VfdmFsLCBleGNlcHQgYSB3YXJuaW5nIGlzIGdlbmVyYXRlZCBpZiB0aGUKKyAgLy8gdGFyZ2V0IGZsb2F0aW5nLXBvaW50IGZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IGluZmluaXRpZXMuIFRoaXMKKyAgLy8gZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIGltcGxlbWVudGluZyB0aGUgSVNPIEM5OSBtYWNybyBJTkZJTklUWS4KKyAgLy8KKyAgLy8gICBmbG9hdCBfX2J1aWx0aW5faW5mZiAodm9pZCkKKyAgLy8KKyAgLy8gU2ltaWxhciB0byBfX2J1aWx0aW5faW5mLCBleGNlcHQgdGhlIHJldHVybiB0eXBlIGlzIGZsb2F0LgorICBPdXQgPDwgIiNpZmRlZiBfX0dOVUNfX1xuIgorICAgICAgPDwgIiNkZWZpbmUgTExWTV9OQU4oTmFuU3RyKSAgIF9fYnVpbHRpbl9uYW4oTmFuU3RyKSAgIC8qIERvdWJsZSAqL1xuIgorICAgICAgPDwgIiNkZWZpbmUgTExWTV9OQU5GKE5hblN0cikgIF9fYnVpbHRpbl9uYW5mKE5hblN0cikgIC8qIEZsb2F0ICovXG4iCisgICAgICA8PCAiI2RlZmluZSBMTFZNX05BTlMoTmFuU3RyKSAgX19idWlsdGluX25hbnMoTmFuU3RyKSAgLyogRG91YmxlICovXG4iCisgICAgICA8PCAiI2RlZmluZSBMTFZNX05BTlNGKE5hblN0cikgX19idWlsdGluX25hbnNmKE5hblN0cikgLyogRmxvYXQgKi9cbiIKKyAgICAgIDw8ICIjZGVmaW5lIExMVk1fSU5GICAgICAgICAgICBfX2J1aWx0aW5faW5mKCkgICAgICAgICAvKiBEb3VibGUgKi9cbiIKKyAgICAgIDw8ICIjZGVmaW5lIExMVk1fSU5GRiAgICAgICAgICBfX2J1aWx0aW5faW5mZigpICAgICAgICAvKiBGbG9hdCAqL1xuIgorICAgICAgPDwgIiNkZWZpbmUgTExWTV9QUkVGRVRDSChhZGRyLHJ3LGxvY2FsaXR5KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19idWlsdGluX3ByZWZldGNoKGFkZHIscncsbG9jYWxpdHkpXG4iCisgICAgICA8PCAiI2RlZmluZSBfX0FUVFJJQlVURV9DVE9SX18gX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKVxuIgorICAgICAgPDwgIiNkZWZpbmUgX19BVFRSSUJVVEVfRFRPUl9fIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKVxuIgorICAgICAgPDwgIiNkZWZpbmUgTExWTV9BU00gICAgICAgICAgIF9fYXNtX19cbiIKKyAgICAgIDw8ICIjZWxzZVxuIgorICAgICAgPDwgIiNkZWZpbmUgTExWTV9OQU4oTmFuU3RyKSAgICgoZG91YmxlKTAuMCkgICAgICAgICAgIC8qIERvdWJsZSAqL1xuIgorICAgICAgPDwgIiNkZWZpbmUgTExWTV9OQU5GKE5hblN0cikgIDAuMEYgICAgICAgICAgICAgICAgICAgIC8qIEZsb2F0ICovXG4iCisgICAgICA8PCAiI2RlZmluZSBMTFZNX05BTlMoTmFuU3RyKSAgKChkb3VibGUpMC4wKSAgICAgICAgICAgLyogRG91YmxlICovXG4iCisgICAgICA8PCAiI2RlZmluZSBMTFZNX05BTlNGKE5hblN0cikgMC4wRiAgICAgICAgICAgICAgICAgICAgLyogRmxvYXQgKi9cbiIKKyAgICAgIDw8ICIjZGVmaW5lIExMVk1fSU5GICAgICAgICAgICAoKGRvdWJsZSkwLjApICAgICAgICAgICAvKiBEb3VibGUgKi9cbiIKKyAgICAgIDw8ICIjZGVmaW5lIExMVk1fSU5GRiAgICAgICAgICAwLjBGICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdCAqL1xuIgorICAgICAgPDwgIiNkZWZpbmUgTExWTV9QUkVGRVRDSChhZGRyLHJ3LGxvY2FsaXR5KSAgICAgICAgICAgIC8qIFBSRUZFVENIICovXG4iCisgICAgICA8PCAiI2RlZmluZSBfX0FUVFJJQlVURV9DVE9SX19cbiIKKyAgICAgIDw8ICIjZGVmaW5lIF9fQVRUUklCVVRFX0RUT1JfX1xuIgorICAgICAgPDwgIiNkZWZpbmUgTExWTV9BU00oWClcbiIKKyAgICAgIDw8ICIjZW5kaWZcblxuIjsKKyAgCisgIE91dCA8PCAiI2lmIF9fR05VQ19fIDwgNCAvKiBPbGQgR0NDJ3MsIG9yIGNvbXBpbGVycyBub3QgR0NDICovIFxuIgorICAgICAgPDwgIiNkZWZpbmUgX19idWlsdGluX3N0YWNrX3NhdmUoKSAwICAgLyogbm90IGltcGxlbWVudGVkICovXG4iCisgICAgICA8PCAiI2RlZmluZSBfX2J1aWx0aW5fc3RhY2tfcmVzdG9yZShYKSAvKiBub29wICovXG4iCisgICAgICA8PCAiI2VuZGlmXG5cbiI7CisKKyAgLy8gT3V0cHV0IHR5cGVkZWZzIGZvciAxMjgtYml0IGludGVnZXJzLiBJZiB0aGVzZSBhcmUgbmVlZGVkIHdpdGggYQorICAvLyAzMi1iaXQgdGFyZ2V0IG9yIHdpdGggYSBDIGNvbXBpbGVyIHRoYXQgZG9lc24ndCBzdXBwb3J0IG1vZGUoVEkpLAorICAvLyBtb3JlIGRyYXN0aWMgbWVhc3VyZXMgd2lsbCBiZSBuZWVkZWQuCisgIE91dCA8PCAiI2lmIF9fR05VQ19fICYmIF9fTFA2NF9fIC8qIDEyOC1iaXQgaW50ZWdlciB0eXBlcyAqL1xuIgorICAgICAgPDwgInR5cGVkZWYgaW50IF9fYXR0cmlidXRlX18oKG1vZGUoVEkpKSkgbGx2bUludDEyODtcbiIKKyAgICAgIDw8ICJ0eXBlZGVmIHVuc2lnbmVkIF9fYXR0cmlidXRlX18oKG1vZGUoVEkpKSkgbGx2bVVJbnQxMjg7XG4iCisgICAgICA8PCAiI2VuZGlmXG5cbiI7CisKKyAgLy8gT3V0cHV0IHRhcmdldC1zcGVjaWZpYyBjb2RlIHRoYXQgc2hvdWxkIGJlIGluc2VydGVkIGludG8gbWFpbi4KKyAgT3V0IDw8ICIjZGVmaW5lIENPREVfRk9SX01BSU4oKSAvKiBBbnkgdGFyZ2V0LXNwZWNpZmljIGNvZGUgZm9yIG1haW4oKSovXG4iOworfQorCisvLy8gRmluZFN0YXRpY1RvcnMgLSBHaXZlbiBhIHN0YXRpYyBjdG9yL2R0b3IgbGlzdCwgdW5wYWNrIGl0cyBjb250ZW50cyBpbnRvCisvLy8gdGhlIFN0YXRpY1RvcnMgc2V0Lgorc3RhdGljIHZvaWQgRmluZFN0YXRpY1RvcnMoR2xvYmFsVmFyaWFibGUgKkdWLCBzdGQ6OnNldDxGdW5jdGlvbio+ICZTdGF0aWNUb3JzKXsKKyAgQ29uc3RhbnRBcnJheSAqSW5pdExpc3QgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihHVi0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgIGlmICghSW5pdExpc3QpIHJldHVybjsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbml0TGlzdC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKENvbnN0YW50U3RydWN0ICpDUyA9IGR5bl9jYXN0PENvbnN0YW50U3RydWN0PihJbml0TGlzdC0+Z2V0T3BlcmFuZChpKSkpeworICAgICAgaWYgKENTLT5nZXROdW1PcGVyYW5kcygpICE9IDIpIHJldHVybjsgIC8vIE5vdCBhcnJheSBvZiAyLWVsZW1lbnQgc3RydWN0cy4KKyAgICAgIAorICAgICAgaWYgKENTLT5nZXRPcGVyYW5kKDEpLT5pc051bGxWYWx1ZSgpKQorICAgICAgICByZXR1cm47ICAvLyBGb3VuZCBhIG51bGwgdGVybWluYXRvciwgZXhpdCBwcmludGluZy4KKyAgICAgIENvbnN0YW50ICpGUCA9IENTLT5nZXRPcGVyYW5kKDEpOworICAgICAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KEZQKSkKKyAgICAgICAgaWYgKENFLT5pc0Nhc3QoKSkKKyAgICAgICAgICBGUCA9IENFLT5nZXRPcGVyYW5kKDApOworICAgICAgaWYgKEZ1bmN0aW9uICpGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KEZQKSkKKyAgICAgICAgU3RhdGljVG9ycy5pbnNlcnQoRik7CisgICAgfQorfQorCitlbnVtIFNwZWNpYWxHbG9iYWxDbGFzcyB7CisgIE5vdFNwZWNpYWwgPSAwLAorICBHbG9iYWxDdG9ycywgR2xvYmFsRHRvcnMsCisgIE5vdFByaW50ZWQKK307CisKKy8vLyBnZXRHbG9iYWxWYXJpYWJsZUNsYXNzIC0gSWYgdGhpcyBpcyBhIGdsb2JhbCB0aGF0IGlzIHNwZWNpYWxseSByZWNvZ25pemVkCisvLy8gYnkgTExWTSwgcmV0dXJuIGEgY29kZSB0aGF0IGluZGljYXRlcyBob3cgd2Ugc2hvdWxkIGhhbmRsZSBpdC4KK3N0YXRpYyBTcGVjaWFsR2xvYmFsQ2xhc3MgZ2V0R2xvYmFsVmFyaWFibGVDbGFzcyhjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIHsKKyAgLy8gSWYgdGhpcyBpcyBhIGdsb2JhbCBjdG9ycy9kdG9ycyBsaXN0LCBoYW5kbGUgaXQgbm93LgorICBpZiAoR1YtPmhhc0FwcGVuZGluZ0xpbmthZ2UoKSAmJiBHVi0+dXNlX2VtcHR5KCkpIHsKKyAgICBpZiAoR1YtPmdldE5hbWUoKSA9PSAibGx2bS5nbG9iYWxfY3RvcnMiKQorICAgICAgcmV0dXJuIEdsb2JhbEN0b3JzOworICAgIGVsc2UgaWYgKEdWLT5nZXROYW1lKCkgPT0gImxsdm0uZ2xvYmFsX2R0b3JzIikKKyAgICAgIHJldHVybiBHbG9iYWxEdG9yczsKKyAgfQorICAKKyAgLy8gT3RoZXJ3aXNlLCBpZiBpdCBpcyBvdGhlciBtZXRhZGF0YSwgZG9uJ3QgcHJpbnQgaXQuICBUaGlzIGNhdGNoZXMgdGhpbmdzCisgIC8vIGxpa2UgZGVidWcgaW5mb3JtYXRpb24uCisgIGlmIChHVi0+Z2V0U2VjdGlvbigpID09ICJsbHZtLm1ldGFkYXRhIikKKyAgICByZXR1cm4gTm90UHJpbnRlZDsKKyAgCisgIHJldHVybiBOb3RTcGVjaWFsOworfQorCisvLyBQcmludEVzY2FwZWRTdHJpbmcgLSBQcmludCBlYWNoIGNoYXJhY3RlciBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZywgZXNjYXBpbmcKKy8vIGl0IGlmIGl0IGlzIG5vdCBwcmludGFibGUgb3IgaWYgaXQgaXMgYW4gZXNjYXBlIGNoYXIuCitzdGF0aWMgdm9pZCBQcmludEVzY2FwZWRTdHJpbmcoY29uc3QgY2hhciAqU3RyLCB1bnNpZ25lZCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IExlbmd0aDsgKytpKSB7CisgICAgdW5zaWduZWQgY2hhciBDID0gU3RyW2ldOworICAgIGlmIChpc3ByaW50KEMpICYmIEMgIT0gJ1xcJyAmJiBDICE9ICciJykKKyAgICAgIE91dCA8PCBDOworICAgIGVsc2UgaWYgKEMgPT0gJ1xcJykKKyAgICAgIE91dCA8PCAiXFxcXCI7CisgICAgZWxzZSBpZiAoQyA9PSAnXCInKQorICAgICAgT3V0IDw8ICJcXFwiIjsKKyAgICBlbHNlIGlmIChDID09ICdcdCcpCisgICAgICBPdXQgPDwgIlxcdCI7CisgICAgZWxzZQorICAgICAgT3V0IDw8ICJcXHgiIDw8IGhleGRpZ2l0KEMgPj4gNCkgPDwgaGV4ZGlnaXQoQyAmIDB4MEYpOworICB9Cit9CisKKy8vIFByaW50RXNjYXBlZFN0cmluZyAtIFByaW50IGVhY2ggY2hhcmFjdGVyIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCBlc2NhcGluZworLy8gaXQgaWYgaXQgaXMgbm90IHByaW50YWJsZSBvciBpZiBpdCBpcyBhbiBlc2NhcGUgY2hhci4KK3N0YXRpYyB2b2lkIFByaW50RXNjYXBlZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmU3RyLCByYXdfb3N0cmVhbSAmT3V0KSB7CisgIFByaW50RXNjYXBlZFN0cmluZyhTdHIuY19zdHIoKSwgU3RyLnNpemUoKSwgT3V0KTsKK30KKworYm9vbCBDV3JpdGVyOjpkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSkgeworICBGdW5jdGlvblBhc3M6OmRvSW5pdGlhbGl6YXRpb24oTSk7CisgIAorICAvLyBJbml0aWFsaXplCisgIFRoZU1vZHVsZSA9ICZNOworCisgIFREID0gbmV3IFRhcmdldERhdGEoJk0pOworICBJTCA9IG5ldyBJbnRyaW5zaWNMb3dlcmluZygqVEQpOworICBJTC0+QWRkUHJvdG90eXBlcyhNKTsKKworI2lmIDAKKyAgc3RkOjpzdHJpbmcgVHJpcGxlID0gVGhlTW9kdWxlLT5nZXRUYXJnZXRUcmlwbGUoKTsKKyAgaWYgKFRyaXBsZS5lbXB0eSgpKQorICAgIFRyaXBsZSA9IGxsdm06OnN5czo6Z2V0SG9zdFRyaXBsZSgpOworICAKKyAgc3RkOjpzdHJpbmcgRTsKKyAgaWYgKGNvbnN0IFRhcmdldCAqTWF0Y2ggPSBUYXJnZXRSZWdpc3RyeTo6bG9va3VwVGFyZ2V0KFRyaXBsZSwgRSkpCisgICAgVEFzbSA9IE1hdGNoLT5jcmVhdGVBc21JbmZvKFRyaXBsZSk7CisjZW5kaWYgICAgCisgIFRBc20gPSBuZXcgQ0JFTUNBc21JbmZvKCk7CisgIFRDdHggPSBuZXcgTUNDb250ZXh0KCpUQXNtKTsKKyAgTWFuZyA9IG5ldyBNYW5nbGVyKCpUQ3R4LCAqVEQpOworCisgIC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZnVuY3Rpb25zIGFyZSBzdGF0aWMgY3RvcnMvZHRvcnMgc28gdGhleSBjYW4gaGF2ZQorICAvLyBhbiBhdHRyaWJ1dGUgYWRkZWQgdG8gdGhlaXIgcHJvdG90eXBlcy4KKyAgc3RkOjpzZXQ8RnVuY3Rpb24qPiBTdGF0aWNDdG9ycywgU3RhdGljRHRvcnM7CisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIHN3aXRjaCAoZ2V0R2xvYmFsVmFyaWFibGVDbGFzcyhJKSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgR2xvYmFsQ3RvcnM6CisgICAgICBGaW5kU3RhdGljVG9ycyhJLCBTdGF0aWNDdG9ycyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdsb2JhbER0b3JzOgorICAgICAgRmluZFN0YXRpY1RvcnMoSSwgU3RhdGljRHRvcnMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIAorICAvLyBnZXQgZGVjbGFyYXRpb24gZm9yIGFsbG9jYQorICBPdXQgPDwgIi8qIFByb3ZpZGUgRGVjbGFyYXRpb25zICovXG4iOworICBPdXQgPDwgIiNpbmNsdWRlIDxzdGRhcmcuaD5cbiI7ICAgICAgLy8gVmFyYXJncyBzdXBwb3J0CisgIE91dCA8PCAiI2luY2x1ZGUgPHNldGptcC5oPlxuIjsgICAgICAvLyBVbndpbmQgc3VwcG9ydAorICBnZW5lcmF0ZUNvbXBpbGVyU3BlY2lmaWNDb2RlKE91dCwgVEQpOworCisgIC8vIFByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBgYm9vbCcgaWYgbm90IGNvbXBpbGluZyB3aXRoIGEgQysrIGNvbXBpbGVyLgorICBPdXQgPDwgIlxuIgorICAgICAgPDwgIiNpZm5kZWYgX19jcGx1c3BsdXNcbnR5cGVkZWYgdW5zaWduZWQgY2hhciBib29sO1xuI2VuZGlmXG4iCisKKyAgICAgIDw8ICJcblxuLyogU3VwcG9ydCBmb3IgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzICovXG4iCisgICAgICA8PCAidHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQ29uc3RhbnREb3VibGVUeTtcbiIKKyAgICAgIDw8ICJ0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgQ29uc3RhbnRGbG9hdFR5O1xuIgorICAgICAgPDwgInR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBsb25nIGYxOyB1bnNpZ25lZCBzaG9ydCBmMjsgIgorICAgICAgICAgInVuc2lnbmVkIHNob3J0IHBhZFszXTsgfSBDb25zdGFudEZQODBUeTtcbiIKKyAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgYm90aCBraW5kcyBvZiAxMjgtYml0IGxvbmcgZG91YmxlOyBtZWFuaW5nIGRpZmZlcnMuCisgICAgICA8PCAidHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIGxvbmcgZjE7IHVuc2lnbmVkIGxvbmcgbG9uZyBmMjsgfSIKKyAgICAgICAgICIgQ29uc3RhbnRGUDEyOFR5O1xuIgorICAgICAgPDwgIlxuXG4vKiBHbG9iYWwgRGVjbGFyYXRpb25zICovXG4iOworCisgIC8vIEZpcnN0IG91dHB1dCBhbGwgdGhlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHByb2dyYW0sIGJlY2F1c2UgQyByZXF1aXJlcworICAvLyBGdW5jdGlvbnMgJiBnbG9iYWxzIHRvIGJlIGRlY2xhcmVkIGJlZm9yZSB0aGV5IGFyZSB1c2VkLgorICAvLworICBpZiAoIU0uZ2V0TW9kdWxlSW5saW5lQXNtKCkuZW1wdHkoKSkgeworICAgIE91dCA8PCAiLyogTW9kdWxlIGFzbSBzdGF0ZW1lbnRzICovXG4iCisgICAgICAgIDw8ICJhc20oIjsKKworICAgIC8vIFNwbGl0IHRoZSBzdHJpbmcgaW50byBsaW5lcywgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgLmxsIGZpbGUuCisgICAgc3RkOjpzdHJpbmcgQXNtID0gTS5nZXRNb2R1bGVJbmxpbmVBc20oKTsKKyAgICBzaXplX3QgQ3VyUG9zID0gMDsKKyAgICBzaXplX3QgTmV3TGluZSA9IEFzbS5maW5kX2ZpcnN0X29mKCdcbicsIEN1clBvcyk7CisgICAgd2hpbGUgKE5ld0xpbmUgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIC8vIFdlIGZvdW5kIGEgbmV3bGluZSwgcHJpbnQgdGhlIHBvcnRpb24gb2YgdGhlIGFzbSBzdHJpbmcgZnJvbSB0aGUKKyAgICAgIC8vIGxhc3QgbmV3bGluZSB1cCB0byB0aGlzIG5ld2xpbmUuCisgICAgICBPdXQgPDwgIlwiIjsKKyAgICAgIFByaW50RXNjYXBlZFN0cmluZyhzdGQ6OnN0cmluZyhBc20uYmVnaW4oKStDdXJQb3MsIEFzbS5iZWdpbigpK05ld0xpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE91dCk7CisgICAgICBPdXQgPDwgIlxcblwiXG4iOworICAgICAgQ3VyUG9zID0gTmV3TGluZSsxOworICAgICAgTmV3TGluZSA9IEFzbS5maW5kX2ZpcnN0X29mKCdcbicsIEN1clBvcyk7CisgICAgfQorICAgIE91dCA8PCAiXCIiOworICAgIFByaW50RXNjYXBlZFN0cmluZyhzdGQ6OnN0cmluZyhBc20uYmVnaW4oKStDdXJQb3MsIEFzbS5lbmQoKSksIE91dCk7CisgICAgT3V0IDw8ICJcIik7XG4iCisgICAgICAgIDw8ICIvKiBFbmQgTW9kdWxlIGFzbSBzdGF0ZW1lbnRzICovXG4iOworICB9CisKKyAgLy8gTG9vcCBvdmVyIHRoZSBzeW1ib2wgdGFibGUsIGVtaXR0aW5nIGFsbCBuYW1lZCBjb25zdGFudHMuLi4KKyAgcHJpbnRNb2R1bGVUeXBlcyhNLmdldFR5cGVTeW1ib2xUYWJsZSgpKTsKKworICAvLyBHbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zLi4uCisgIGlmICghTS5nbG9iYWxfZW1wdHkoKSkgeworICAgIE91dCA8PCAiXG4vKiBFeHRlcm5hbCBHbG9iYWwgVmFyaWFibGUgRGVjbGFyYXRpb25zICovXG4iOworICAgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisKKyAgICAgIGlmIChJLT5oYXNFeHRlcm5hbExpbmthZ2UoKSB8fCBJLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkgfHwgCisgICAgICAgICAgSS0+aGFzQ29tbW9uTGlua2FnZSgpKQorICAgICAgICBPdXQgPDwgImV4dGVybiAiOworICAgICAgZWxzZSBpZiAoSS0+aGFzRExMSW1wb3J0TGlua2FnZSgpKQorICAgICAgICBPdXQgPDwgIl9fZGVjbHNwZWMoZGxsaW1wb3J0KSAiOworICAgICAgZWxzZQorICAgICAgICBjb250aW51ZTsgLy8gSW50ZXJuYWwgR2xvYmFsCisKKyAgICAgIC8vIFRocmVhZCBMb2NhbCBTdG9yYWdlCisgICAgICBpZiAoSS0+aXNUaHJlYWRMb2NhbCgpKQorICAgICAgICBPdXQgPDwgIl9fdGhyZWFkICI7CisKKyAgICAgIHByaW50VHlwZShPdXQsIEktPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSwgZmFsc2UsIEdldFZhbHVlTmFtZShJKSk7CisKKyAgICAgIGlmIChJLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkpCisgICAgICAgICBPdXQgPDwgIiBfX0VYVEVSTkFMX1dFQUtfXyI7CisgICAgICBPdXQgPDwgIjtcbiI7CisgICAgfQorICB9CisKKyAgLy8gRnVuY3Rpb24gZGVjbGFyYXRpb25zCisgIE91dCA8PCAiXG4vKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi9cbiI7CisgIE91dCA8PCAiZG91YmxlIGZtb2QoZG91YmxlLCBkb3VibGUpO1xuIjsgICAvLyBTdXBwb3J0IGZvciBGUCByZW0KKyAgT3V0IDw8ICJmbG9hdCBmbW9kZihmbG9hdCwgZmxvYXQpO1xuIjsKKyAgT3V0IDw8ICJsb25nIGRvdWJsZSBmbW9kbChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpO1xuIjsKKyAgCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAvLyBEb24ndCBwcmludCBkZWNsYXJhdGlvbnMgZm9yIGludHJpbnNpYyBmdW5jdGlvbnMuCisgICAgaWYgKCFJLT5pc0ludHJpbnNpYygpICYmIEktPmdldE5hbWUoKSAhPSAic2V0am1wIiAmJgorICAgICAgICBJLT5nZXROYW1lKCkgIT0gImxvbmdqbXAiICYmIEktPmdldE5hbWUoKSAhPSAiX3NldGptcCIpIHsKKyAgICAgIGlmIChJLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkpCisgICAgICAgIE91dCA8PCAiZXh0ZXJuICI7CisgICAgICBwcmludEZ1bmN0aW9uU2lnbmF0dXJlKEksIHRydWUpOworICAgICAgaWYgKEktPmhhc1dlYWtMaW5rYWdlKCkgfHwgSS0+aGFzTGlua09uY2VMaW5rYWdlKCkpIAorICAgICAgICBPdXQgPDwgIiBfX0FUVFJJQlVURV9XRUFLX18iOworICAgICAgaWYgKEktPmhhc0V4dGVybmFsV2Vha0xpbmthZ2UoKSkKKyAgICAgICAgT3V0IDw8ICIgX19FWFRFUk5BTF9XRUFLX18iOworICAgICAgaWYgKFN0YXRpY0N0b3JzLmNvdW50KEkpKQorICAgICAgICBPdXQgPDwgIiBfX0FUVFJJQlVURV9DVE9SX18iOworICAgICAgaWYgKFN0YXRpY0R0b3JzLmNvdW50KEkpKQorICAgICAgICBPdXQgPDwgIiBfX0FUVFJJQlVURV9EVE9SX18iOworICAgICAgaWYgKEktPmhhc0hpZGRlblZpc2liaWxpdHkoKSkKKyAgICAgICAgT3V0IDw8ICIgX19ISURERU5fXyI7CisgICAgICAKKyAgICAgIGlmIChJLT5oYXNOYW1lKCkgJiYgSS0+Z2V0TmFtZSgpWzBdID09IDEpCisgICAgICAgIE91dCA8PCAiIExMVk1fQVNNKFwiIiA8PCBJLT5nZXROYW1lKCkuc3Vic3RyKDEpIDw8ICJcIikiOworICAgICAgICAgIAorICAgICAgT3V0IDw8ICI7XG4iOworICAgIH0KKyAgfQorCisgIC8vIE91dHB1dCB0aGUgZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucworICBpZiAoIU0uZ2xvYmFsX2VtcHR5KCkpIHsKKyAgICBPdXQgPDwgIlxuXG4vKiBHbG9iYWwgVmFyaWFibGUgRGVjbGFyYXRpb25zICovXG4iOworICAgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgaWYgKCFJLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgICAgLy8gSWdub3JlIHNwZWNpYWwgZ2xvYmFscywgc3VjaCBhcyBkZWJ1ZyBpbmZvLgorICAgICAgICBpZiAoZ2V0R2xvYmFsVmFyaWFibGVDbGFzcyhJKSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoSS0+aGFzTG9jYWxMaW5rYWdlKCkpCisgICAgICAgICAgT3V0IDw8ICJzdGF0aWMgIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIE91dCA8PCAiZXh0ZXJuICI7CisKKyAgICAgICAgLy8gVGhyZWFkIExvY2FsIFN0b3JhZ2UKKyAgICAgICAgaWYgKEktPmlzVGhyZWFkTG9jYWwoKSkKKyAgICAgICAgICBPdXQgPDwgIl9fdGhyZWFkICI7CisKKyAgICAgICAgcHJpbnRUeXBlKE91dCwgSS0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpLCBmYWxzZSwgCisgICAgICAgICAgICAgICAgICBHZXRWYWx1ZU5hbWUoSSkpOworCisgICAgICAgIGlmIChJLT5oYXNMaW5rT25jZUxpbmthZ2UoKSkKKyAgICAgICAgICBPdXQgPDwgIiBfX2F0dHJpYnV0ZV9fKChjb21tb24pKSI7CisgICAgICAgIGVsc2UgaWYgKEktPmhhc0NvbW1vbkxpbmthZ2UoKSkgICAgIC8vIEZJWE1FIGlzIHRoaXMgcmlnaHQ/CisgICAgICAgICAgT3V0IDw8ICIgX19BVFRSSUJVVEVfV0VBS19fIjsKKyAgICAgICAgZWxzZSBpZiAoSS0+aGFzV2Vha0xpbmthZ2UoKSkKKyAgICAgICAgICBPdXQgPDwgIiBfX0FUVFJJQlVURV9XRUFLX18iOworICAgICAgICBlbHNlIGlmIChJLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkpCisgICAgICAgICAgT3V0IDw8ICIgX19FWFRFUk5BTF9XRUFLX18iOworICAgICAgICBpZiAoSS0+aGFzSGlkZGVuVmlzaWJpbGl0eSgpKQorICAgICAgICAgIE91dCA8PCAiIF9fSElEREVOX18iOworICAgICAgICBPdXQgPDwgIjtcbiI7CisgICAgICB9CisgIH0KKworICAvLyBPdXRwdXQgdGhlIGdsb2JhbCB2YXJpYWJsZSBkZWZpbml0aW9ucyBhbmQgY29udGVudHMuLi4KKyAgaWYgKCFNLmdsb2JhbF9lbXB0eSgpKSB7CisgICAgT3V0IDw8ICJcblxuLyogR2xvYmFsIFZhcmlhYmxlIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbiAqL1xuIjsKKyAgICBmb3IgKE1vZHVsZTo6Z2xvYmFsX2l0ZXJhdG9yIEkgPSBNLmdsb2JhbF9iZWdpbigpLCBFID0gTS5nbG9iYWxfZW5kKCk7IAorICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBpZiAoIUktPmlzRGVjbGFyYXRpb24oKSkgeworICAgICAgICAvLyBJZ25vcmUgc3BlY2lhbCBnbG9iYWxzLCBzdWNoIGFzIGRlYnVnIGluZm8uCisgICAgICAgIGlmIChnZXRHbG9iYWxWYXJpYWJsZUNsYXNzKEkpKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChJLT5oYXNMb2NhbExpbmthZ2UoKSkKKyAgICAgICAgICBPdXQgPDwgInN0YXRpYyAiOworICAgICAgICBlbHNlIGlmIChJLT5oYXNETExJbXBvcnRMaW5rYWdlKCkpCisgICAgICAgICAgT3V0IDw8ICJfX2RlY2xzcGVjKGRsbGltcG9ydCkgIjsKKyAgICAgICAgZWxzZSBpZiAoSS0+aGFzRExMRXhwb3J0TGlua2FnZSgpKQorICAgICAgICAgIE91dCA8PCAiX19kZWNsc3BlYyhkbGxleHBvcnQpICI7CisKKyAgICAgICAgLy8gVGhyZWFkIExvY2FsIFN0b3JhZ2UKKyAgICAgICAgaWYgKEktPmlzVGhyZWFkTG9jYWwoKSkKKyAgICAgICAgICBPdXQgPDwgIl9fdGhyZWFkICI7CisKKyAgICAgICAgcHJpbnRUeXBlKE91dCwgSS0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpLCBmYWxzZSwgCisgICAgICAgICAgICAgICAgICBHZXRWYWx1ZU5hbWUoSSkpOworICAgICAgICBpZiAoSS0+aGFzTGlua09uY2VMaW5rYWdlKCkpCisgICAgICAgICAgT3V0IDw8ICIgX19hdHRyaWJ1dGVfXygoY29tbW9uKSkiOworICAgICAgICBlbHNlIGlmIChJLT5oYXNXZWFrTGlua2FnZSgpKQorICAgICAgICAgIE91dCA8PCAiIF9fQVRUUklCVVRFX1dFQUtfXyI7CisgICAgICAgIGVsc2UgaWYgKEktPmhhc0NvbW1vbkxpbmthZ2UoKSkKKyAgICAgICAgICBPdXQgPDwgIiBfX0FUVFJJQlVURV9XRUFLX18iOworCisgICAgICAgIGlmIChJLT5oYXNIaWRkZW5WaXNpYmlsaXR5KCkpCisgICAgICAgICAgT3V0IDw8ICIgX19ISURERU5fXyI7CisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGUgaW5pdGlhbGl6ZXIgaXMgbm90IG51bGwsIGVtaXQgdGhlIGluaXRpYWxpemVyLiAgSWYgaXQgaXMgbnVsbCwKKyAgICAgICAgLy8gd2UgdHJ5IHRvIGF2b2lkIGVtaXR0aW5nIGxhcmdlIGFtb3VudHMgb2YgemVyb3MuICBUaGUgcHJvYmxlbSB3aXRoCisgICAgICAgIC8vIHRoaXMsIGhvd2V2ZXIsIG9jY3VycyB3aGVuIHRoZSB2YXJpYWJsZSBoYXMgd2VhayBsaW5rYWdlLiAgSW4gdGhpcworICAgICAgICAvLyBjYXNlLCB0aGUgYXNzZW1ibGVyIHdpbGwgY29tcGxhaW4gYWJvdXQgdGhlIHZhcmlhYmxlIGJlaW5nIGJvdGggd2VhaworICAgICAgICAvLyBhbmQgY29tbW9uLCBzbyB3ZSBkaXNhYmxlIHRoaXMgb3B0aW1pemF0aW9uLgorICAgICAgICAvLyBGSVhNRSBjb21tb24gbGlua2FnZSBzaG91bGQgYXZvaWQgdGhpcyBwcm9ibGVtLgorICAgICAgICBpZiAoIUktPmdldEluaXRpYWxpemVyKCktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgICBPdXQgPDwgIiA9ICIgOworICAgICAgICAgIHdyaXRlT3BlcmFuZChJLT5nZXRJbml0aWFsaXplcigpLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChJLT5oYXNXZWFrTGlua2FnZSgpKSB7CisgICAgICAgICAgLy8gV2UgaGF2ZSB0byBzcGVjaWZ5IGFuIGluaXRpYWxpemVyLCBidXQgaXQgZG9lc24ndCBoYXZlIHRvIGJlCisgICAgICAgICAgLy8gY29tcGxldGUuICBJZiB0aGUgdmFsdWUgaXMgYW4gYWdncmVnYXRlLCBwcmludCBvdXQgeyAwIH0sIGFuZCBsZXQKKyAgICAgICAgICAvLyB0aGUgY29tcGlsZXIgZmlndXJlIG91dCB0aGUgcmVzdCBvZiB0aGUgemVyb3MuCisgICAgICAgICAgT3V0IDw8ICIgPSAiIDsKKyAgICAgICAgICBpZiAoSS0+Z2V0SW5pdGlhbGl6ZXIoKS0+Z2V0VHlwZSgpLT5pc1N0cnVjdFR5KCkgfHwKKyAgICAgICAgICAgICAgSS0+Z2V0SW5pdGlhbGl6ZXIoKS0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgICAgICAgIE91dCA8PCAieyAwIH0iOworICAgICAgICAgIH0gZWxzZSBpZiAoSS0+Z2V0SW5pdGlhbGl6ZXIoKS0+Z2V0VHlwZSgpLT5pc0FycmF5VHkoKSkgeworICAgICAgICAgICAgLy8gQXMgd2l0aCBzdHJ1Y3RzIGFuZCB2ZWN0b3JzLCBidXQgd2l0aCBhbiBleHRyYSBzZXQgb2YgYnJhY2VzCisgICAgICAgICAgICAvLyBiZWNhdXNlIGFycmF5cyBhcmUgd3JhcHBlZCBpbiBzdHJ1Y3RzLgorICAgICAgICAgICAgT3V0IDw8ICJ7IHsgMCB9IH0iOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBKdXN0IHByaW50IGl0IG91dCBub3JtYWxseS4KKyAgICAgICAgICAgIHdyaXRlT3BlcmFuZChJLT5nZXRJbml0aWFsaXplcigpLCB0cnVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgT3V0IDw8ICI7XG4iOworICAgICAgfQorICB9CisKKyAgaWYgKCFNLmVtcHR5KCkpCisgICAgT3V0IDw8ICJcblxuLyogRnVuY3Rpb24gQm9kaWVzICovXG4iOworCisgIC8vIEVtaXQgc29tZSBoZWxwZXIgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggRkNNUCBpbnN0cnVjdGlvbidzIAorICAvLyBwcmVkaWNhdGVzCisgIE91dCA8PCAic3RhdGljIGlubGluZSBpbnQgbGx2bV9mY21wX29yZChkb3VibGUgWCwgZG91YmxlIFkpIHsgIjsKKyAgT3V0IDw8ICJyZXR1cm4gWCA9PSBYICYmIFkgPT0gWTsgfVxuIjsKKyAgT3V0IDw8ICJzdGF0aWMgaW5saW5lIGludCBsbHZtX2ZjbXBfdW5vKGRvdWJsZSBYLCBkb3VibGUgWSkgeyAiOworICBPdXQgPDwgInJldHVybiBYICE9IFggfHwgWSAhPSBZOyB9XG4iOworICBPdXQgPDwgInN0YXRpYyBpbmxpbmUgaW50IGxsdm1fZmNtcF91ZXEoZG91YmxlIFgsIGRvdWJsZSBZKSB7ICI7CisgIE91dCA8PCAicmV0dXJuIFggPT0gWSB8fCBsbHZtX2ZjbXBfdW5vKFgsIFkpOyB9XG4iOworICBPdXQgPDwgInN0YXRpYyBpbmxpbmUgaW50IGxsdm1fZmNtcF91bmUoZG91YmxlIFgsIGRvdWJsZSBZKSB7ICI7CisgIE91dCA8PCAicmV0dXJuIFggIT0gWTsgfVxuIjsKKyAgT3V0IDw8ICJzdGF0aWMgaW5saW5lIGludCBsbHZtX2ZjbXBfdWx0KGRvdWJsZSBYLCBkb3VibGUgWSkgeyAiOworICBPdXQgPDwgInJldHVybiBYIDwgIFkgfHwgbGx2bV9mY21wX3VubyhYLCBZKTsgfVxuIjsKKyAgT3V0IDw8ICJzdGF0aWMgaW5saW5lIGludCBsbHZtX2ZjbXBfdWd0KGRvdWJsZSBYLCBkb3VibGUgWSkgeyAiOworICBPdXQgPDwgInJldHVybiBYID4gIFkgfHwgbGx2bV9mY21wX3VubyhYLCBZKTsgfVxuIjsKKyAgT3V0IDw8ICJzdGF0aWMgaW5saW5lIGludCBsbHZtX2ZjbXBfdWxlKGRvdWJsZSBYLCBkb3VibGUgWSkgeyAiOworICBPdXQgPDwgInJldHVybiBYIDw9IFkgfHwgbGx2bV9mY21wX3VubyhYLCBZKTsgfVxuIjsKKyAgT3V0IDw8ICJzdGF0aWMgaW5saW5lIGludCBsbHZtX2ZjbXBfdWdlKGRvdWJsZSBYLCBkb3VibGUgWSkgeyAiOworICBPdXQgPDwgInJldHVybiBYID49IFkgfHwgbGx2bV9mY21wX3VubyhYLCBZKTsgfVxuIjsKKyAgT3V0IDw8ICJzdGF0aWMgaW5saW5lIGludCBsbHZtX2ZjbXBfb2VxKGRvdWJsZSBYLCBkb3VibGUgWSkgeyAiOworICBPdXQgPDwgInJldHVybiBYID09IFkgOyB9XG4iOworICBPdXQgPDwgInN0YXRpYyBpbmxpbmUgaW50IGxsdm1fZmNtcF9vbmUoZG91YmxlIFgsIGRvdWJsZSBZKSB7ICI7CisgIE91dCA8PCAicmV0dXJuIFggIT0gWSAmJiBsbHZtX2ZjbXBfb3JkKFgsIFkpOyB9XG4iOworICBPdXQgPDwgInN0YXRpYyBpbmxpbmUgaW50IGxsdm1fZmNtcF9vbHQoZG91YmxlIFgsIGRvdWJsZSBZKSB7ICI7CisgIE91dCA8PCAicmV0dXJuIFggPCAgWSA7IH1cbiI7CisgIE91dCA8PCAic3RhdGljIGlubGluZSBpbnQgbGx2bV9mY21wX29ndChkb3VibGUgWCwgZG91YmxlIFkpIHsgIjsKKyAgT3V0IDw8ICJyZXR1cm4gWCA+ICBZIDsgfVxuIjsKKyAgT3V0IDw8ICJzdGF0aWMgaW5saW5lIGludCBsbHZtX2ZjbXBfb2xlKGRvdWJsZSBYLCBkb3VibGUgWSkgeyAiOworICBPdXQgPDwgInJldHVybiBYIDw9IFkgOyB9XG4iOworICBPdXQgPDwgInN0YXRpYyBpbmxpbmUgaW50IGxsdm1fZmNtcF9vZ2UoZG91YmxlIFgsIGRvdWJsZSBZKSB7ICI7CisgIE91dCA8PCAicmV0dXJuIFggPj0gWSA7IH1cbiI7CisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gT3V0cHV0IGFsbCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMgdGhhdCBjYW5ub3QgYmUgcHJpbnRlZCBhY2N1cmF0ZWx5Li4uCit2b2lkIENXcml0ZXI6OnByaW50RmxvYXRpbmdQb2ludENvbnN0YW50cyhGdW5jdGlvbiAmRikgeworICAvLyBTY2FuIHRoZSBtb2R1bGUgZm9yIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4gIElmIGFueSBGUCBjb25zdGFudCBpcyB1c2VkCisgIC8vIGluIHRoZSBmdW5jdGlvbiwgd2Ugd2FudCB0byByZWRpcmVjdCBpdCBoZXJlIHNvIHRoYXQgd2UgZG8gbm90IGRlcGVuZCBvbgorICAvLyB0aGUgcHJlY2lzaW9uIG9mIHRoZSBwcmludGVkIGZvcm0sIHVubGVzcyB0aGUgcHJpbnRlZCBmb3JtIHByZXNlcnZlcworICAvLyBwcmVjaXNpb24uCisgIC8vCisgIGZvciAoY29uc3RhbnRfaXRlcmF0b3IgSSA9IGNvbnN0YW50X2JlZ2luKCZGKSwgRSA9IGNvbnN0YW50X2VuZCgmRik7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgcHJpbnRGbG9hdGluZ1BvaW50Q29uc3RhbnRzKCpJKTsKKworICBPdXQgPDwgJ1xuJzsKK30KKwordm9pZCBDV3JpdGVyOjpwcmludEZsb2F0aW5nUG9pbnRDb25zdGFudHMoY29uc3QgQ29uc3RhbnQgKkMpIHsKKyAgLy8gSWYgdGhpcyBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24sIHJlY3Vyc2l2ZWx5IGNoZWNrIGZvciBjb25zdGFudCBmcCB2YWx1ZXMuCisgIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDKSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDRS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBwcmludEZsb2F0aW5nUG9pbnRDb25zdGFudHMoQ0UtPmdldE9wZXJhbmQoaSkpOworICAgIHJldHVybjsKKyAgfQorICAgIAorICAvLyBPdGhlcndpc2UsIGNoZWNrIGZvciBhIEZQIGNvbnN0YW50IHRoYXQgd2UgbmVlZCB0byBwcmludC4KKyAgY29uc3QgQ29uc3RhbnRGUCAqRlBDID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oQyk7CisgIGlmIChGUEMgPT0gMCB8fAorICAgICAgLy8gRG8gbm90IHB1dCBpbiBGUENvbnN0YW50TWFwIGlmIHNhZmUuCisgICAgICBpc0ZQQ1NhZmVUb1ByaW50KEZQQykgfHwKKyAgICAgIC8vIEFscmVhZHkgcHJpbnRlZCB0aGlzIGNvbnN0YW50PworICAgICAgRlBDb25zdGFudE1hcC5jb3VudChGUEMpKQorICAgIHJldHVybjsKKworICBGUENvbnN0YW50TWFwW0ZQQ10gPSBGUENvdW50ZXI7ICAvLyBOdW1iZXIgdGhlIEZQIGNvbnN0YW50cworICAKKyAgaWYgKEZQQy0+Z2V0VHlwZSgpID09IFR5cGU6OmdldERvdWJsZVR5KEZQQy0+Z2V0Q29udGV4dCgpKSkgeworICAgIGRvdWJsZSBWYWwgPSBGUEMtPmdldFZhbHVlQVBGKCkuY29udmVydFRvRG91YmxlKCk7CisgICAgdWludDY0X3QgaSA9IEZQQy0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpLmdldFpFeHRWYWx1ZSgpOworICAgIE91dCA8PCAic3RhdGljIGNvbnN0IENvbnN0YW50RG91YmxlVHkgRlBDb25zdGFudCIgPDwgRlBDb3VudGVyKysKKyAgICA8PCAiID0gMHgiIDw8IHV0b2hleHN0cihpKQorICAgIDw8ICJVTEw7ICAgIC8qICIgPDwgVmFsIDw8ICIgKi9cbiI7CisgIH0gZWxzZSBpZiAoRlBDLT5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0RmxvYXRUeShGUEMtPmdldENvbnRleHQoKSkpIHsKKyAgICBmbG9hdCBWYWwgPSBGUEMtPmdldFZhbHVlQVBGKCkuY29udmVydFRvRmxvYXQoKTsKKyAgICB1aW50MzJfdCBpID0gKHVpbnQzMl90KUZQQy0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpLgorICAgIGdldFpFeHRWYWx1ZSgpOworICAgIE91dCA8PCAic3RhdGljIGNvbnN0IENvbnN0YW50RmxvYXRUeSBGUENvbnN0YW50IiA8PCBGUENvdW50ZXIrKworICAgIDw8ICIgPSAweCIgPDwgdXRvaGV4c3RyKGkpCisgICAgPDwgIlU7ICAgIC8qICIgPDwgVmFsIDw8ICIgKi9cbiI7CisgIH0gZWxzZSBpZiAoRlBDLT5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0WDg2X0ZQODBUeShGUEMtPmdldENvbnRleHQoKSkpIHsKKyAgICAvLyBhcGkgbmVlZGVkIHRvIHByZXZlbnQgcHJlbWF0dXJlIGRlc3RydWN0aW9uCisgICAgQVBJbnQgYXBpID0gRlBDLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCk7CisgICAgY29uc3QgdWludDY0X3QgKnAgPSBhcGkuZ2V0UmF3RGF0YSgpOworICAgIE91dCA8PCAic3RhdGljIGNvbnN0IENvbnN0YW50RlA4MFR5IEZQQ29uc3RhbnQiIDw8IEZQQ291bnRlcisrCisgICAgPDwgIiA9IHsgMHgiIDw8IHV0b2hleHN0cihwWzBdKSAKKyAgICA8PCAiVUxMLCAweCIgPDwgdXRvaGV4c3RyKCh1aW50MTZfdClwWzFdKSA8PCAiLHswLDAsMH0iCisgICAgPDwgIn07IC8qIExvbmcgZG91YmxlIGNvbnN0YW50ICovXG4iOworICB9IGVsc2UgaWYgKEZQQy0+Z2V0VHlwZSgpID09IFR5cGU6OmdldFBQQ19GUDEyOFR5KEZQQy0+Z2V0Q29udGV4dCgpKSB8fAorICAgICAgICAgICAgIEZQQy0+Z2V0VHlwZSgpID09IFR5cGU6OmdldEZQMTI4VHkoRlBDLT5nZXRDb250ZXh0KCkpKSB7CisgICAgQVBJbnQgYXBpID0gRlBDLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCk7CisgICAgY29uc3QgdWludDY0X3QgKnAgPSBhcGkuZ2V0UmF3RGF0YSgpOworICAgIE91dCA8PCAic3RhdGljIGNvbnN0IENvbnN0YW50RlAxMjhUeSBGUENvbnN0YW50IiA8PCBGUENvdW50ZXIrKworICAgIDw8ICIgPSB7IDB4IgorICAgIDw8IHV0b2hleHN0cihwWzBdKSA8PCAiLCAweCIgPDwgdXRvaGV4c3RyKHBbMV0pCisgICAgPDwgIn07IC8qIExvbmcgZG91YmxlIGNvbnN0YW50ICovXG4iOworICAgIAorICB9IGVsc2UgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gZmxvYXQgdHlwZSEiKTsKKyAgfQorfQorCisKKworLy8vIHByaW50U3ltYm9sVGFibGUgLSBSdW4gdGhyb3VnaCBzeW1ib2wgdGFibGUgbG9va2luZyBmb3IgdHlwZSBuYW1lcy4gIElmIGEKKy8vLyB0eXBlIG5hbWUgaXMgZm91bmQsIGVtaXQgaXRzIGRlY2xhcmF0aW9uLi4uCisvLy8KK3ZvaWQgQ1dyaXRlcjo6cHJpbnRNb2R1bGVUeXBlcyhjb25zdCBUeXBlU3ltYm9sVGFibGUgJlRTVCkgeworICBPdXQgPDwgIi8qIEhlbHBlciB1bmlvbiBmb3IgYml0Y2FzdHMgKi9cbiI7CisgIE91dCA8PCAidHlwZWRlZiB1bmlvbiB7XG4iOworICBPdXQgPDwgIiAgdW5zaWduZWQgaW50IEludDMyO1xuIjsKKyAgT3V0IDw8ICIgIHVuc2lnbmVkIGxvbmcgbG9uZyBJbnQ2NDtcbiI7CisgIE91dCA8PCAiICBmbG9hdCBGbG9hdDtcbiI7CisgIE91dCA8PCAiICBkb3VibGUgRG91YmxlO1xuIjsKKyAgT3V0IDw8ICJ9IGxsdm1CaXRDYXN0VW5pb247XG4iOworCisgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIHR5cGUgcGxhbmUgb2YgdGhlIHN5bWJvbCB0YWJsZS4KKyAgVHlwZVN5bWJvbFRhYmxlOjpjb25zdF9pdGVyYXRvciBJICAgPSBUU1QuYmVnaW4oKTsKKyAgVHlwZVN5bWJvbFRhYmxlOjpjb25zdF9pdGVyYXRvciBFbmQgPSBUU1QuZW5kKCk7CisKKyAgLy8gSWYgdGhlcmUgYXJlIG5vIHR5cGUgbmFtZXMsIGV4aXQgZWFybHkuCisgIGlmIChJID09IEVuZCkgcmV0dXJuOworCisgIC8vIFByaW50IG91dCBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3Igc3RydWN0dXJlIHR5cGVzIGJlZm9yZSBhbnl0aGluZyBlbHNlIQorICBPdXQgPDwgIi8qIFN0cnVjdHVyZSBmb3J3YXJkIGRlY2xzICovXG4iOworICBmb3IgKDsgSSAhPSBFbmQ7ICsrSSkgeworICAgIHN0ZDo6c3RyaW5nIE5hbWUgPSAic3RydWN0ICIgKyBDQkVNYW5nbGUoImxfIitJLT5maXJzdCk7CisgICAgT3V0IDw8IE5hbWUgPDwgIjtcbiI7CisgICAgVHlwZU5hbWVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihJLT5zZWNvbmQsIE5hbWUpKTsKKyAgfQorCisgIE91dCA8PCAnXG4nOworCisgIC8vIE5vdyB3ZSBjYW4gcHJpbnQgb3V0IHR5cGVkZWZzLiAgQWJvdmUsIHdlIGd1YXJhbnRlZWQgdGhhdCB0aGlzIGNhbiBvbmx5IGJlCisgIC8vIGZvciBzdHJ1Y3Qgb3Igb3BhcXVlIHR5cGVzLgorICBPdXQgPDwgIi8qIFR5cGVkZWZzICovXG4iOworICBmb3IgKEkgPSBUU1QuYmVnaW4oKTsgSSAhPSBFbmQ7ICsrSSkgeworICAgIHN0ZDo6c3RyaW5nIE5hbWUgPSBDQkVNYW5nbGUoImxfIitJLT5maXJzdCk7CisgICAgT3V0IDw8ICJ0eXBlZGVmICI7CisgICAgcHJpbnRUeXBlKE91dCwgSS0+c2Vjb25kLCBmYWxzZSwgTmFtZSk7CisgICAgT3V0IDw8ICI7XG4iOworICB9CisKKyAgT3V0IDw8ICdcbic7CisKKyAgLy8gS2VlcCB0cmFjayBvZiB3aGljaCBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiBwcmludGVkIHNvIGZhci4uLgorICBzdGQ6OnNldDxjb25zdCBUeXBlICo+IFN0cnVjdFByaW50ZWQ7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBzdHJ1Y3R1cmVzIHRoZW4gcHVzaCB0aGVtIGludG8gdGhlIHN0YWNrIHNvIHRoZXkgYXJlCisgIC8vIHByaW50ZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisgIC8vCisgIE91dCA8PCAiLyogU3RydWN0dXJlIGNvbnRlbnRzICovXG4iOworICBmb3IgKEkgPSBUU1QuYmVnaW4oKTsgSSAhPSBFbmQ7ICsrSSkKKyAgICBpZiAoSS0+c2Vjb25kLT5pc1N0cnVjdFR5KCkgfHwgSS0+c2Vjb25kLT5pc0FycmF5VHkoKSkKKyAgICAgIC8vIE9ubHkgcHJpbnQgb3V0IHVzZWQgdHlwZXMhCisgICAgICBwcmludENvbnRhaW5lZFN0cnVjdHMoSS0+c2Vjb25kLCBTdHJ1Y3RQcmludGVkKTsKK30KKworLy8gUHVzaCB0aGUgc3RydWN0IG9udG8gdGhlIHN0YWNrIGFuZCByZWN1cnNpdmVseSBwdXNoIGFsbCBzdHJ1Y3RzCisvLyB0aGlzIG9uZSBkZXBlbmRzIG9uLgorLy8KKy8vIFRPRE86ICBNYWtlIHRoaXMgd29yayBwcm9wZXJseSB3aXRoIHZlY3RvciB0eXBlcworLy8KK3ZvaWQgQ1dyaXRlcjo6cHJpbnRDb250YWluZWRTdHJ1Y3RzKGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Y29uc3QgVHlwZSo+ICZTdHJ1Y3RQcmludGVkKSB7CisgIC8vIERvbid0IHdhbGsgdGhyb3VnaCBwb2ludGVycy4KKyAgaWYgKFR5LT5pc1BvaW50ZXJUeSgpIHx8IFR5LT5pc1ByaW1pdGl2ZVR5cGUoKSB8fCBUeS0+aXNJbnRlZ2VyVHkoKSkKKyAgICByZXR1cm47CisgIAorICAvLyBQcmludCBhbGwgY29udGFpbmVkIHR5cGVzIGZpcnN0LgorICBmb3IgKFR5cGU6OnN1YnR5cGVfaXRlcmF0b3IgSSA9IFR5LT5zdWJ0eXBlX2JlZ2luKCksCisgICAgICAgRSA9IFR5LT5zdWJ0eXBlX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBwcmludENvbnRhaW5lZFN0cnVjdHMoKkksIFN0cnVjdFByaW50ZWQpOworICAKKyAgaWYgKFR5LT5pc1N0cnVjdFR5KCkgfHwgVHktPmlzQXJyYXlUeSgpKSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBwcmludGVkIHRoaXMgc3RydWN0LgorICAgIGlmIChTdHJ1Y3RQcmludGVkLmluc2VydChUeSkuc2Vjb25kKSB7CisgICAgICAvLyBQcmludCBzdHJ1Y3R1cmUgdHlwZSBvdXQuCisgICAgICBzdGQ6OnN0cmluZyBOYW1lID0gVHlwZU5hbWVzW1R5XTsKKyAgICAgIHByaW50VHlwZShPdXQsIFR5LCBmYWxzZSwgTmFtZSwgdHJ1ZSk7CisgICAgICBPdXQgPDwgIjtcblxuIjsKKyAgICB9CisgIH0KK30KKwordm9pZCBDV3JpdGVyOjpwcmludEZ1bmN0aW9uU2lnbmF0dXJlKGNvbnN0IEZ1bmN0aW9uICpGLCBib29sIFByb3RvdHlwZSkgeworICAvLy8gaXNTdHJ1Y3RSZXR1cm4gLSBTaG91bGQgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSByZXR1cm4gYSBzdHJ1Y3QgYnktdmFsdWU/CisgIGJvb2wgaXNTdHJ1Y3RSZXR1cm4gPSBGLT5oYXNTdHJ1Y3RSZXRBdHRyKCk7CisgIAorICBpZiAoRi0+aGFzTG9jYWxMaW5rYWdlKCkpIE91dCA8PCAic3RhdGljICI7CisgIGlmIChGLT5oYXNETExJbXBvcnRMaW5rYWdlKCkpIE91dCA8PCAiX19kZWNsc3BlYyhkbGxpbXBvcnQpICI7CisgIGlmIChGLT5oYXNETExFeHBvcnRMaW5rYWdlKCkpIE91dCA8PCAiX19kZWNsc3BlYyhkbGxleHBvcnQpICI7ICAKKyAgc3dpdGNoIChGLT5nZXRDYWxsaW5nQ29udigpKSB7CisgICBjYXNlIENhbGxpbmdDb252OjpYODZfU3RkQ2FsbDoKKyAgICBPdXQgPDwgIl9fYXR0cmlidXRlX18oKHN0ZGNhbGwpKSAiOworICAgIGJyZWFrOworICAgY2FzZSBDYWxsaW5nQ29udjo6WDg2X0Zhc3RDYWxsOgorICAgIE91dCA8PCAiX19hdHRyaWJ1dGVfXygoZmFzdGNhbGwpKSAiOworICAgIGJyZWFrOworICAgY2FzZSBDYWxsaW5nQ29udjo6WDg2X1RoaXNDYWxsOgorICAgIE91dCA8PCAiX19hdHRyaWJ1dGVfXygodGhpc2NhbGwpKSAiOworICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgLy8gTG9vcCBvdmVyIHRoZSBhcmd1bWVudHMsIHByaW50aW5nIHRoZW0uLi4KKyAgY29uc3QgRnVuY3Rpb25UeXBlICpGVCA9IGNhc3Q8RnVuY3Rpb25UeXBlPihGLT5nZXRGdW5jdGlvblR5cGUoKSk7CisgIGNvbnN0IEF0dHJMaXN0UHRyICZQQUwgPSBGLT5nZXRBdHRyaWJ1dGVzKCk7CisKKyAgc3RkOjpzdHJpbmcgdHN0cjsKKyAgcmF3X3N0cmluZ19vc3RyZWFtIEZ1bmN0aW9uSW5uYXJkcyh0c3RyKTsKKworICAvLyBQcmludCBvdXQgdGhlIG5hbWUuLi4KKyAgRnVuY3Rpb25Jbm5hcmRzIDw8IEdldFZhbHVlTmFtZShGKSA8PCAnKCc7CisKKyAgYm9vbCBQcmludGVkQXJnID0gZmFsc2U7CisgIGlmICghRi0+aXNEZWNsYXJhdGlvbigpKSB7CisgICAgaWYgKCFGLT5hcmdfZW1wdHkoKSkgeworICAgICAgRnVuY3Rpb246OmNvbnN0X2FyZ19pdGVyYXRvciBJID0gRi0+YXJnX2JlZ2luKCksIEUgPSBGLT5hcmdfZW5kKCk7CisgICAgICB1bnNpZ25lZCBJZHggPSAxOworICAgICAgCisgICAgICAvLyBJZiB0aGlzIGlzIGEgc3RydWN0LXJldHVybiBmdW5jdGlvbiwgZG9uJ3QgcHJpbnQgdGhlIGhpZGRlbgorICAgICAgLy8gc3RydWN0LXJldHVybiBhcmd1bWVudC4KKyAgICAgIGlmIChpc1N0cnVjdFJldHVybikgeworICAgICAgICBhc3NlcnQoSSAhPSBFICYmICJJbnZhbGlkIHN0cnVjdCByZXR1cm4gZnVuY3Rpb24hIik7CisgICAgICAgICsrSTsKKyAgICAgICAgKytJZHg7CisgICAgICB9CisgICAgICAKKyAgICAgIHN0ZDo6c3RyaW5nIEFyZ05hbWU7CisgICAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgaWYgKFByaW50ZWRBcmcpIEZ1bmN0aW9uSW5uYXJkcyA8PCAiLCAiOworICAgICAgICBpZiAoSS0+aGFzTmFtZSgpIHx8ICFQcm90b3R5cGUpCisgICAgICAgICAgQXJnTmFtZSA9IEdldFZhbHVlTmFtZShJKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEFyZ05hbWUgPSAiIjsKKyAgICAgICAgY29uc3QgVHlwZSAqQXJnVHkgPSBJLT5nZXRUeXBlKCk7CisgICAgICAgIGlmIChQQUwucGFyYW1IYXNBdHRyKElkeCwgQXR0cmlidXRlOjpCeVZhbCkpIHsKKyAgICAgICAgICBBcmdUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KEFyZ1R5KS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgICBCeVZhbFBhcmFtcy5pbnNlcnQoSSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRUeXBlKEZ1bmN0aW9uSW5uYXJkcywgQXJnVHksCisgICAgICAgICAgICAvKmlzU2lnbmVkPSovUEFMLnBhcmFtSGFzQXR0cihJZHgsIEF0dHJpYnV0ZTo6U0V4dCksCisgICAgICAgICAgICBBcmdOYW1lKTsKKyAgICAgICAgUHJpbnRlZEFyZyA9IHRydWU7CisgICAgICAgICsrSWR4OworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBMb29wIG92ZXIgdGhlIGFyZ3VtZW50cywgcHJpbnRpbmcgdGhlbS4KKyAgICBGdW5jdGlvblR5cGU6OnBhcmFtX2l0ZXJhdG9yIEkgPSBGVC0+cGFyYW1fYmVnaW4oKSwgRSA9IEZULT5wYXJhbV9lbmQoKTsKKyAgICB1bnNpZ25lZCBJZHggPSAxOworICAgIAorICAgIC8vIElmIHRoaXMgaXMgYSBzdHJ1Y3QtcmV0dXJuIGZ1bmN0aW9uLCBkb24ndCBwcmludCB0aGUgaGlkZGVuCisgICAgLy8gc3RydWN0LXJldHVybiBhcmd1bWVudC4KKyAgICBpZiAoaXNTdHJ1Y3RSZXR1cm4pIHsKKyAgICAgIGFzc2VydChJICE9IEUgJiYgIkludmFsaWQgc3RydWN0IHJldHVybiBmdW5jdGlvbiEiKTsKKyAgICAgICsrSTsKKyAgICAgICsrSWR4OworICAgIH0KKyAgICAKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChQcmludGVkQXJnKSBGdW5jdGlvbklubmFyZHMgPDwgIiwgIjsKKyAgICAgIGNvbnN0IFR5cGUgKkFyZ1R5ID0gKkk7CisgICAgICBpZiAoUEFMLnBhcmFtSGFzQXR0cihJZHgsIEF0dHJpYnV0ZTo6QnlWYWwpKSB7CisgICAgICAgIGFzc2VydChBcmdUeS0+aXNQb2ludGVyVHkoKSk7CisgICAgICAgIEFyZ1R5ID0gY2FzdDxQb2ludGVyVHlwZT4oQXJnVHkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgfQorICAgICAgcHJpbnRUeXBlKEZ1bmN0aW9uSW5uYXJkcywgQXJnVHksCisgICAgICAgICAgICAgLyppc1NpZ25lZD0qL1BBTC5wYXJhbUhhc0F0dHIoSWR4LCBBdHRyaWJ1dGU6OlNFeHQpKTsKKyAgICAgIFByaW50ZWRBcmcgPSB0cnVlOworICAgICAgKytJZHg7CisgICAgfQorICB9CisKKyAgaWYgKCFQcmludGVkQXJnICYmIEZULT5pc1ZhckFyZygpKSB7CisgICAgRnVuY3Rpb25Jbm5hcmRzIDw8ICJpbnQgdmFyYXJnX2R1bW15X2FyZyI7CisgICAgUHJpbnRlZEFyZyA9IHRydWU7CisgIH0KKworICAvLyBGaW5pc2ggcHJpbnRpbmcgYXJndW1lbnRzLi4uIGlmIHRoaXMgaXMgYSB2YXJhcmcgZnVuY3Rpb24sIHByaW50IHRoZSAuLi4sCisgIC8vIHVubGVzcyB0aGVyZSBhcmUgbm8ga25vd24gdHlwZXMsIGluIHdoaWNoIGNhc2UsIHdlIGp1c3QgZW1pdCAoKS4KKyAgLy8KKyAgaWYgKEZULT5pc1ZhckFyZygpICYmIFByaW50ZWRBcmcpIHsKKyAgICBGdW5jdGlvbklubmFyZHMgPDwgIiwuLi4iOyAgLy8gT3V0cHV0IHZhcmFyZ3MgcG9ydGlvbiBvZiBzaWduYXR1cmUhCisgIH0gZWxzZSBpZiAoIUZULT5pc1ZhckFyZygpICYmICFQcmludGVkQXJnKSB7CisgICAgRnVuY3Rpb25Jbm5hcmRzIDw8ICJ2b2lkIjsgLy8gcmV0KCkgLT4gcmV0KHZvaWQpIGluIEMuCisgIH0KKyAgRnVuY3Rpb25Jbm5hcmRzIDw8ICcpJzsKKyAgCisgIC8vIEdldCB0aGUgcmV0dXJuIHRwZSBmb3IgdGhlIGZ1bmN0aW9uLgorICBjb25zdCBUeXBlICpSZXRUeTsKKyAgaWYgKCFpc1N0cnVjdFJldHVybikKKyAgICBSZXRUeSA9IEYtPmdldFJldHVyblR5cGUoKTsKKyAgZWxzZSB7CisgICAgLy8gSWYgdGhpcyBpcyBhIHN0cnVjdC1yZXR1cm4gZnVuY3Rpb24sIHByaW50IHRoZSBzdHJ1Y3QtcmV0dXJuIHR5cGUuCisgICAgUmV0VHkgPSBjYXN0PFBvaW50ZXJUeXBlPihGVC0+Z2V0UGFyYW1UeXBlKDApKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgfQorICAgIAorICAvLyBQcmludCBvdXQgdGhlIHJldHVybiB0eXBlIGFuZCB0aGUgc2lnbmF0dXJlIGJ1aWx0IGFib3ZlLgorICBwcmludFR5cGUoT3V0LCBSZXRUeSwgCisgICAgICAgICAgICAvKmlzU2lnbmVkPSovUEFMLnBhcmFtSGFzQXR0cigwLCBBdHRyaWJ1dGU6OlNFeHQpLAorICAgICAgICAgICAgRnVuY3Rpb25Jbm5hcmRzLnN0cigpKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzRlBJbnRCaXRDYXN0KGNvbnN0IEluc3RydWN0aW9uICZJKSB7CisgIGlmICghaXNhPEJpdENhc3RJbnN0PihJKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGNvbnN0IFR5cGUgKlNyY1R5ID0gSS5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgIGNvbnN0IFR5cGUgKkRzdFR5ID0gSS5nZXRUeXBlKCk7CisgIHJldHVybiAoU3JjVHktPmlzRmxvYXRpbmdQb2ludFR5KCkgJiYgRHN0VHktPmlzSW50ZWdlclR5KCkpIHx8CisgICAgICAgICAoRHN0VHktPmlzRmxvYXRpbmdQb2ludFR5KCkgJiYgU3JjVHktPmlzSW50ZWdlclR5KCkpOworfQorCit2b2lkIENXcml0ZXI6OnByaW50RnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgLy8vIGlzU3RydWN0UmV0dXJuIC0gU2hvdWxkIHRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgcmV0dXJuIGEgc3RydWN0IGJ5LXZhbHVlPworICBib29sIGlzU3RydWN0UmV0dXJuID0gRi5oYXNTdHJ1Y3RSZXRBdHRyKCk7CisKKyAgcHJpbnRGdW5jdGlvblNpZ25hdHVyZSgmRiwgZmFsc2UpOworICBPdXQgPDwgIiB7XG4iOworICAKKyAgLy8gSWYgdGhpcyBpcyBhIHN0cnVjdCByZXR1cm4gZnVuY3Rpb24sIGhhbmRsZSB0aGUgcmVzdWx0IHdpdGggbWFnaWMuCisgIGlmIChpc1N0cnVjdFJldHVybikgeworICAgIGNvbnN0IFR5cGUgKlN0cnVjdFR5ID0KKyAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KEYuYXJnX2JlZ2luKCktPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgT3V0IDw8ICIgICI7CisgICAgcHJpbnRUeXBlKE91dCwgU3RydWN0VHksIGZhbHNlLCAiU3RydWN0UmV0dXJuIik7CisgICAgT3V0IDw8ICI7ICAvKiBTdHJ1Y3QgcmV0dXJuIHRlbXBvcmFyeSAqL1xuIjsKKworICAgIE91dCA8PCAiICAiOworICAgIHByaW50VHlwZShPdXQsIEYuYXJnX2JlZ2luKCktPmdldFR5cGUoKSwgZmFsc2UsIAorICAgICAgICAgICAgICBHZXRWYWx1ZU5hbWUoRi5hcmdfYmVnaW4oKSkpOworICAgIE91dCA8PCAiID0gJlN0cnVjdFJldHVybjtcbiI7CisgIH0KKworICBib29sIFByaW50ZWRWYXIgPSBmYWxzZTsKKyAgCisgIC8vIHByaW50IGxvY2FsIHZhcmlhYmxlIGluZm9ybWF0aW9uIGZvciB0aGUgZnVuY3Rpb24KKyAgZm9yIChpbnN0X2l0ZXJhdG9yIEkgPSBpbnN0X2JlZ2luKCZGKSwgRSA9IGluc3RfZW5kKCZGKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoY29uc3QgQWxsb2NhSW5zdCAqQUkgPSBpc0RpcmVjdEFsbG9jYSgmKkkpKSB7CisgICAgICBPdXQgPDwgIiAgIjsKKyAgICAgIHByaW50VHlwZShPdXQsIEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCksIGZhbHNlLCBHZXRWYWx1ZU5hbWUoQUkpKTsKKyAgICAgIE91dCA8PCAiOyAgICAvKiBBZGRyZXNzLWV4cG9zZWQgbG9jYWwgKi9cbiI7CisgICAgICBQcmludGVkVmFyID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKEktPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRWb2lkVHkoRi5nZXRDb250ZXh0KCkpICYmIAorICAgICAgICAgICAgICAgIWlzSW5saW5hYmxlSW5zdCgqSSkpIHsKKyAgICAgIE91dCA8PCAiICAiOworICAgICAgcHJpbnRUeXBlKE91dCwgSS0+Z2V0VHlwZSgpLCBmYWxzZSwgR2V0VmFsdWVOYW1lKCYqSSkpOworICAgICAgT3V0IDw8ICI7XG4iOworCisgICAgICBpZiAoaXNhPFBISU5vZGU+KCpJKSkgeyAgLy8gUHJpbnQgb3V0IFBISSBub2RlIHRlbXBvcmFyaWVzIGFzIHdlbGwuLi4KKyAgICAgICAgT3V0IDw8ICIgICI7CisgICAgICAgIHByaW50VHlwZShPdXQsIEktPmdldFR5cGUoKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICBHZXRWYWx1ZU5hbWUoJipJKSsiX19QSElfVEVNUE9SQVJZIik7CisgICAgICAgIE91dCA8PCAiO1xuIjsKKyAgICAgIH0KKyAgICAgIFByaW50ZWRWYXIgPSB0cnVlOworICAgIH0KKyAgICAvLyBXZSBuZWVkIGEgdGVtcG9yYXJ5IGZvciB0aGUgQml0Q2FzdCB0byB1c2Ugc28gaXQgY2FuIHBsdWNrIGEgdmFsdWUgb3V0CisgICAgLy8gb2YgYSB1bmlvbiB0byBkbyB0aGUgQml0Q2FzdC4gVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBuZWVkIGZvciBhCisgICAgLy8gdmFyaWFibGUgdG8gaG9sZCB0aGUgcmVzdWx0IG9mIHRoZSBCaXRDYXN0LiAKKyAgICBpZiAoaXNGUEludEJpdENhc3QoKkkpKSB7CisgICAgICBPdXQgPDwgIiAgbGx2bUJpdENhc3RVbmlvbiAiIDw8IEdldFZhbHVlTmFtZSgmKkkpCisgICAgICAgICAgPDwgIl9fQklUQ0FTVF9URU1QT1JBUlk7XG4iOworICAgICAgUHJpbnRlZFZhciA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKFByaW50ZWRWYXIpCisgICAgT3V0IDw8ICdcbic7CisKKyAgaWYgKEYuaGFzRXh0ZXJuYWxMaW5rYWdlKCkgJiYgRi5nZXROYW1lKCkgPT0gIm1haW4iKQorICAgIE91dCA8PCAiICBDT0RFX0ZPUl9NQUlOKCk7XG4iOworCisgIC8vIHByaW50IHRoZSBiYXNpYyBibG9ja3MKKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBCQiAhPSBFOyArK0JCKSB7CisgICAgaWYgKExvb3AgKkwgPSBMSS0+Z2V0TG9vcEZvcihCQikpIHsKKyAgICAgIGlmIChMLT5nZXRIZWFkZXIoKSA9PSBCQiAmJiBMLT5nZXRQYXJlbnRMb29wKCkgPT0gMCkKKyAgICAgICAgcHJpbnRMb29wKEwpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludEJhc2ljQmxvY2soQkIpOworICAgIH0KKyAgfQorCisgIE91dCA8PCAifVxuXG4iOworfQorCit2b2lkIENXcml0ZXI6OnByaW50TG9vcChMb29wICpMKSB7CisgIE91dCA8PCAiICBkbyB7ICAgICAvKiBTeW50YWN0aWMgbG9vcCAnIiA8PCBMLT5nZXRIZWFkZXIoKS0+Z2V0TmFtZSgpCisgICAgICA8PCAiJyB0byBtYWtlIEdDQyBoYXBweSAqL1xuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEwtPmdldEJsb2NrcygpLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBCYXNpY0Jsb2NrICpCQiA9IEwtPmdldEJsb2NrcygpW2ldOworICAgIExvb3AgKkJCTG9vcCA9IExJLT5nZXRMb29wRm9yKEJCKTsKKyAgICBpZiAoQkJMb29wID09IEwpCisgICAgICBwcmludEJhc2ljQmxvY2soQkIpOworICAgIGVsc2UgaWYgKEJCID09IEJCTG9vcC0+Z2V0SGVhZGVyKCkgJiYgQkJMb29wLT5nZXRQYXJlbnRMb29wKCkgPT0gTCkKKyAgICAgIHByaW50TG9vcChCQkxvb3ApOworICB9CisgIE91dCA8PCAiICB9IHdoaWxlICgxKTsgLyogZW5kIG9mIHN5bnRhY3RpYyBsb29wICciCisgICAgICA8PCBMLT5nZXRIZWFkZXIoKS0+Z2V0TmFtZSgpIDw8ICInICovXG4iOworfQorCit2b2lkIENXcml0ZXI6OnByaW50QmFzaWNCbG9jayhCYXNpY0Jsb2NrICpCQikgeworCisgIC8vIERvbid0IHByaW50IHRoZSBsYWJlbCBmb3IgdGhlIGJhc2ljIGJsb2NrIGlmIHRoZXJlIGFyZSBubyB1c2VzLCBvciBpZgorICAvLyB0aGUgb25seSB0ZXJtaW5hdG9yIHVzZSBpcyB0aGUgcHJlZGVjZXNzb3IgYmFzaWMgYmxvY2sncyB0ZXJtaW5hdG9yLgorICAvLyBXZSBoYXZlIHRvIHNjYW4gdGhlIHVzZSBsaXN0IGJlY2F1c2UgUEhJIG5vZGVzIHVzZSBiYXNpYyBibG9ja3MgdG9vIGJ1dAorICAvLyBkbyBub3QgcmVxdWlyZSBhIGxhYmVsIHRvIGJlIGdlbmVyYXRlZC4KKyAgLy8KKyAgYm9vbCBOZWVkc0xhYmVsID0gZmFsc2U7CisgIGZvciAocHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oQkIpLCBFID0gcHJlZF9lbmQoQkIpOyBQSSAhPSBFOyArK1BJKQorICAgIGlmIChpc0dvdG9Db2RlTmVjZXNzYXJ5KCpQSSwgQkIpKSB7CisgICAgICBOZWVkc0xhYmVsID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoTmVlZHNMYWJlbCkgT3V0IDw8IEdldFZhbHVlTmFtZShCQikgPDwgIjpcbiI7CisKKyAgLy8gT3V0cHV0IGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBiYXNpYyBibG9jay4uLgorICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gQkItPmJlZ2luKCksIEUgPSAtLUJCLT5lbmQoKTsgSUkgIT0gRTsKKyAgICAgICArK0lJKSB7CisgICAgaWYgKCFpc0lubGluYWJsZUluc3QoKklJKSAmJiAhaXNEaXJlY3RBbGxvY2EoSUkpKSB7CisgICAgICBpZiAoSUktPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRWb2lkVHkoQkItPmdldENvbnRleHQoKSkgJiYKKyAgICAgICAgICAhaXNJbmxpbmVBc20oKklJKSkKKyAgICAgICAgb3V0cHV0TFZhbHVlKElJKTsKKyAgICAgIGVsc2UKKyAgICAgICAgT3V0IDw8ICIgICI7CisgICAgICB3cml0ZUluc3RDb21wdXRhdGlvbklubGluZSgqSUkpOworICAgICAgT3V0IDw8ICI7XG4iOworICAgIH0KKyAgfQorCisgIC8vIERvbid0IGVtaXQgcHJlZml4IG9yIHN1ZmZpeCBmb3IgdGhlIHRlcm1pbmF0b3IuCisgIHZpc2l0KCpCQi0+Z2V0VGVybWluYXRvcigpKTsKK30KKworCisvLyBTcGVjaWZpYyBJbnN0cnVjdGlvbiB0eXBlIGNsYXNzZXMuLi4gbm90ZSB0aGF0IGFsbCBvZiB0aGUgY2FzdHMgYXJlCisvLyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB1c2UgdGhlIGluc3RydWN0aW9uIGNsYXNzZXMgYXMgb3BhcXVlIHR5cGVzLi4uCisvLwordm9pZCBDV3JpdGVyOjp2aXNpdFJldHVybkluc3QoUmV0dXJuSW5zdCAmSSkgeworICAvLyBJZiB0aGlzIGlzIGEgc3RydWN0IHJldHVybiBmdW5jdGlvbiwgcmV0dXJuIHRoZSB0ZW1wb3Jhcnkgc3RydWN0LgorICBib29sIGlzU3RydWN0UmV0dXJuID0gSS5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmhhc1N0cnVjdFJldEF0dHIoKTsKKworICBpZiAoaXNTdHJ1Y3RSZXR1cm4pIHsKKyAgICBPdXQgPDwgIiAgcmV0dXJuIFN0cnVjdFJldHVybjtcbiI7CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBEb24ndCBvdXRwdXQgYSB2b2lkIHJldHVybiBpZiB0aGlzIGlzIHRoZSBsYXN0IGJhc2ljIGJsb2NrIGluIHRoZSBmdW5jdGlvbgorICBpZiAoSS5nZXROdW1PcGVyYW5kcygpID09IDAgJiYKKyAgICAgICYqLS1JLmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+ZW5kKCkgPT0gSS5nZXRQYXJlbnQoKSAmJgorICAgICAgIUkuZ2V0UGFyZW50KCktPnNpemUoKSA9PSAxKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKEkuZ2V0TnVtT3BlcmFuZHMoKSA+IDEpIHsKKyAgICBPdXQgPDwgIiAge1xuIjsKKyAgICBPdXQgPDwgIiAgICAiOworICAgIHByaW50VHlwZShPdXQsIEkuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXRSZXR1cm5UeXBlKCkpOworICAgIE91dCA8PCAiICAgbGx2bV9jYmVfbXJ2X3RlbXAgPSB7XG4iOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBPdXQgPDwgIiAgICAgICI7CisgICAgICB3cml0ZU9wZXJhbmQoSS5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIGlmIChpICE9IGUgLSAxKQorICAgICAgICBPdXQgPDwgIiwiOworICAgICAgT3V0IDw8ICJcbiI7CisgICAgfQorICAgIE91dCA8PCAiICAgIH07XG4iOworICAgIE91dCA8PCAiICAgIHJldHVybiBsbHZtX2NiZV9tcnZfdGVtcDtcbiI7CisgICAgT3V0IDw8ICIgIH1cbiI7CisgICAgcmV0dXJuOworICB9CisKKyAgT3V0IDw8ICIgIHJldHVybiI7CisgIGlmIChJLmdldE51bU9wZXJhbmRzKCkpIHsKKyAgICBPdXQgPDwgJyAnOworICAgIHdyaXRlT3BlcmFuZChJLmdldE9wZXJhbmQoMCkpOworICB9CisgIE91dCA8PCAiO1xuIjsKK30KKwordm9pZCBDV3JpdGVyOjp2aXNpdFN3aXRjaEluc3QoU3dpdGNoSW5zdCAmU0kpIHsKKworICBPdXQgPDwgIiAgc3dpdGNoICgiOworICB3cml0ZU9wZXJhbmQoU0kuZ2V0T3BlcmFuZCgwKSk7CisgIE91dCA8PCAiKSB7XG4gIGRlZmF1bHQ6XG4iOworICBwcmludFBISUNvcGllc0ZvclN1Y2Nlc3NvciAoU0kuZ2V0UGFyZW50KCksIFNJLmdldERlZmF1bHREZXN0KCksIDIpOworICBwcmludEJyYW5jaFRvQmxvY2soU0kuZ2V0UGFyZW50KCksIFNJLmdldERlZmF1bHREZXN0KCksIDIpOworICBPdXQgPDwgIjtcbiI7CisgIGZvciAodW5zaWduZWQgaSA9IDIsIGUgPSBTSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7IGkgKz0gMikgeworICAgIE91dCA8PCAiICBjYXNlICI7CisgICAgd3JpdGVPcGVyYW5kKFNJLmdldE9wZXJhbmQoaSkpOworICAgIE91dCA8PCAiOlxuIjsKKyAgICBCYXNpY0Jsb2NrICpTdWNjID0gY2FzdDxCYXNpY0Jsb2NrPihTSS5nZXRPcGVyYW5kKGkrMSkpOworICAgIHByaW50UEhJQ29waWVzRm9yU3VjY2Vzc29yIChTSS5nZXRQYXJlbnQoKSwgU3VjYywgMik7CisgICAgcHJpbnRCcmFuY2hUb0Jsb2NrKFNJLmdldFBhcmVudCgpLCBTdWNjLCAyKTsKKyAgICBpZiAoRnVuY3Rpb246Oml0ZXJhdG9yKFN1Y2MpID09IGxsdm06Om5leHQoRnVuY3Rpb246Oml0ZXJhdG9yKFNJLmdldFBhcmVudCgpKSkpCisgICAgICBPdXQgPDwgIiAgICBicmVhaztcbiI7CisgIH0KKyAgT3V0IDw8ICIgIH1cbiI7Cit9CisKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRJbmRpcmVjdEJySW5zdChJbmRpcmVjdEJySW5zdCAmSUJJKSB7CisgIE91dCA8PCAiICBnb3RvICoodm9pZCopKCI7CisgIHdyaXRlT3BlcmFuZChJQkkuZ2V0T3BlcmFuZCgwKSk7CisgIE91dCA8PCAiKTtcbiI7Cit9CisKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRVbnJlYWNoYWJsZUluc3QoVW5yZWFjaGFibGVJbnN0ICZJKSB7CisgIE91dCA8PCAiICAvKlVOUkVBQ0hBQkxFKi87XG4iOworfQorCitib29sIENXcml0ZXI6OmlzR290b0NvZGVOZWNlc3NhcnkoQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8pIHsKKyAgLy8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSByZWVuYWJsZWQsIGJ1dCBsb29wIHJlb3JkZXJpbmcgc2FmZSEhCisgIHJldHVybiB0cnVlOworCisgIGlmIChsbHZtOjpuZXh0KEZ1bmN0aW9uOjppdGVyYXRvcihGcm9tKSkgIT0gRnVuY3Rpb246Oml0ZXJhdG9yKFRvKSkKKyAgICByZXR1cm4gdHJ1ZTsgIC8vIE5vdCB0aGUgZGlyZWN0IHN1Y2Nlc3Nvciwgd2UgbmVlZCBhIGdvdG8uCisKKyAgLy9pc2E8U3dpdGNoSW5zdD4oRnJvbS0+Z2V0VGVybWluYXRvcigpKQorCisgIGlmIChMSS0+Z2V0TG9vcEZvcihGcm9tKSAhPSBMSS0+Z2V0TG9vcEZvcihUbykpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDV3JpdGVyOjpwcmludFBISUNvcGllc0ZvclN1Y2Nlc3NvciAoQmFzaWNCbG9jayAqQ3VyQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpTdWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnQpIHsKKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gU3VjY2Vzc29yLT5iZWdpbigpOyBpc2E8UEhJTm9kZT4oSSk7ICsrSSkgeworICAgIFBISU5vZGUgKlBOID0gY2FzdDxQSElOb2RlPihJKTsKKyAgICAvLyBOb3cgd2UgaGF2ZSB0byBkbyB0aGUgcHJpbnRpbmcuCisgICAgVmFsdWUgKklWID0gUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhDdXJCbG9jayk7CisgICAgaWYgKCFpc2E8VW5kZWZWYWx1ZT4oSVYpKSB7CisgICAgICBPdXQgPDwgc3RkOjpzdHJpbmcoSW5kZW50LCAnICcpOworICAgICAgT3V0IDw8ICIgICIgPDwgR2V0VmFsdWVOYW1lKEkpIDw8ICJfX1BISV9URU1QT1JBUlkgPSAiOworICAgICAgd3JpdGVPcGVyYW5kKElWKTsKKyAgICAgIE91dCA8PCAiOyAgIC8qIGZvciBQSEkgbm9kZSAqL1xuIjsKKyAgICB9CisgIH0KK30KKwordm9pZCBDV3JpdGVyOjpwcmludEJyYW5jaFRvQmxvY2soQmFzaWNCbG9jayAqQ3VyQkIsIEJhc2ljQmxvY2sgKlN1Y2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnQpIHsKKyAgaWYgKGlzR290b0NvZGVOZWNlc3NhcnkoQ3VyQkIsIFN1Y2MpKSB7CisgICAgT3V0IDw8IHN0ZDo6c3RyaW5nKEluZGVudCwgJyAnKSA8PCAiICBnb3RvICI7CisgICAgd3JpdGVPcGVyYW5kKFN1Y2MpOworICAgIE91dCA8PCAiO1xuIjsKKyAgfQorfQorCisvLyBCcmFuY2ggaW5zdHJ1Y3Rpb24gcHJpbnRpbmcgLSBBdm9pZCBwcmludGluZyBvdXQgYSBicmFuY2ggdG8gYSBiYXNpYyBibG9jaworLy8gdGhhdCBpbW1lZGlhdGVseSBzdWNjZWVkcyB0aGUgY3VycmVudCBvbmUuCisvLwordm9pZCBDV3JpdGVyOjp2aXNpdEJyYW5jaEluc3QoQnJhbmNoSW5zdCAmSSkgeworCisgIGlmIChJLmlzQ29uZGl0aW9uYWwoKSkgeworICAgIGlmIChpc0dvdG9Db2RlTmVjZXNzYXJ5KEkuZ2V0UGFyZW50KCksIEkuZ2V0U3VjY2Vzc29yKDApKSkgeworICAgICAgT3V0IDw8ICIgIGlmICgiOworICAgICAgd3JpdGVPcGVyYW5kKEkuZ2V0Q29uZGl0aW9uKCkpOworICAgICAgT3V0IDw8ICIpIHtcbiI7CisKKyAgICAgIHByaW50UEhJQ29waWVzRm9yU3VjY2Vzc29yIChJLmdldFBhcmVudCgpLCBJLmdldFN1Y2Nlc3NvcigwKSwgMik7CisgICAgICBwcmludEJyYW5jaFRvQmxvY2soSS5nZXRQYXJlbnQoKSwgSS5nZXRTdWNjZXNzb3IoMCksIDIpOworCisgICAgICBpZiAoaXNHb3RvQ29kZU5lY2Vzc2FyeShJLmdldFBhcmVudCgpLCBJLmdldFN1Y2Nlc3NvcigxKSkpIHsKKyAgICAgICAgT3V0IDw8ICIgIH0gZWxzZSB7XG4iOworICAgICAgICBwcmludFBISUNvcGllc0ZvclN1Y2Nlc3NvciAoSS5nZXRQYXJlbnQoKSwgSS5nZXRTdWNjZXNzb3IoMSksIDIpOworICAgICAgICBwcmludEJyYW5jaFRvQmxvY2soSS5nZXRQYXJlbnQoKSwgSS5nZXRTdWNjZXNzb3IoMSksIDIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBGaXJzdCBnb3RvIG5vdCBuZWNlc3NhcnksIGFzc3VtZSBzZWNvbmQgb25lIGlzLi4uCisgICAgICBPdXQgPDwgIiAgaWYgKCEiOworICAgICAgd3JpdGVPcGVyYW5kKEkuZ2V0Q29uZGl0aW9uKCkpOworICAgICAgT3V0IDw8ICIpIHtcbiI7CisKKyAgICAgIHByaW50UEhJQ29waWVzRm9yU3VjY2Vzc29yIChJLmdldFBhcmVudCgpLCBJLmdldFN1Y2Nlc3NvcigxKSwgMik7CisgICAgICBwcmludEJyYW5jaFRvQmxvY2soSS5nZXRQYXJlbnQoKSwgSS5nZXRTdWNjZXNzb3IoMSksIDIpOworICAgIH0KKworICAgIE91dCA8PCAiICB9XG4iOworICB9IGVsc2UgeworICAgIHByaW50UEhJQ29waWVzRm9yU3VjY2Vzc29yIChJLmdldFBhcmVudCgpLCBJLmdldFN1Y2Nlc3NvcigwKSwgMCk7CisgICAgcHJpbnRCcmFuY2hUb0Jsb2NrKEkuZ2V0UGFyZW50KCksIEkuZ2V0U3VjY2Vzc29yKDApLCAwKTsKKyAgfQorICBPdXQgPDwgIlxuIjsKK30KKworLy8gUEhJIG5vZGVzIGdldCBjb3BpZWQgaW50byB0ZW1wb3JhcnkgdmFsdWVzIGF0IHRoZSBlbmQgb2YgcHJlZGVjZXNzb3IgYmFzaWMKKy8vIGJsb2Nrcy4gIFdlIG5vdyBuZWVkIHRvIGNvcHkgdGhlc2UgdGVtcG9yYXJ5IHZhbHVlcyBpbnRvIHRoZSBSRUFMIHZhbHVlIGZvcgorLy8gdGhlIFBISS4KK3ZvaWQgQ1dyaXRlcjo6dmlzaXRQSElOb2RlKFBISU5vZGUgJkkpIHsKKyAgd3JpdGVPcGVyYW5kKCZJKTsKKyAgT3V0IDw8ICJfX1BISV9URU1QT1JBUlkiOworfQorCisKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRCaW5hcnlPcGVyYXRvcihJbnN0cnVjdGlvbiAmSSkgeworICAvLyBiaW5hcnkgaW5zdHJ1Y3Rpb25zLCBzaGlmdCBpbnN0cnVjdGlvbnMsIHNldENvbmQgaW5zdHJ1Y3Rpb25zLgorICBhc3NlcnQoIUkuZ2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKTsKKworICAvLyBXZSBtdXN0IGNhc3QgdGhlIHJlc3VsdHMgb2YgYmluYXJ5IG9wZXJhdGlvbnMgd2hpY2ggbWlnaHQgYmUgcHJvbW90ZWQuCisgIGJvb2wgbmVlZHNDYXN0ID0gZmFsc2U7CisgIGlmICgoSS5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0SW50OFR5KEkuZ2V0Q29udGV4dCgpKSkgfHwKKyAgICAgIChJLmdldFR5cGUoKSA9PSBUeXBlOjpnZXRJbnQxNlR5KEkuZ2V0Q29udGV4dCgpKSkgCisgICAgICB8fCAoSS5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0RmxvYXRUeShJLmdldENvbnRleHQoKSkpKSB7CisgICAgbmVlZHNDYXN0ID0gdHJ1ZTsKKyAgICBPdXQgPDwgIigoIjsKKyAgICBwcmludFR5cGUoT3V0LCBJLmdldFR5cGUoKSwgZmFsc2UpOworICAgIE91dCA8PCAiKSgiOworICB9CisKKyAgLy8gSWYgdGhpcyBpcyBhIG5lZ2F0aW9uIG9wZXJhdGlvbiwgcHJpbnQgaXQgb3V0IGFzIHN1Y2guICBGb3IgRlAsIHdlIGRvbid0CisgIC8vIHdhbnQgdG8gcHJpbnQgIi0wLjAgLSBYIi4KKyAgaWYgKEJpbmFyeU9wZXJhdG9yOjppc05lZygmSSkpIHsKKyAgICBPdXQgPDwgIi0oIjsKKyAgICB3cml0ZU9wZXJhbmQoQmluYXJ5T3BlcmF0b3I6OmdldE5lZ0FyZ3VtZW50KGNhc3Q8QmluYXJ5T3BlcmF0b3I+KCZJKSkpOworICAgIE91dCA8PCAiKSI7CisgIH0gZWxzZSBpZiAoQmluYXJ5T3BlcmF0b3I6OmlzRk5lZygmSSkpIHsKKyAgICBPdXQgPDwgIi0oIjsKKyAgICB3cml0ZU9wZXJhbmQoQmluYXJ5T3BlcmF0b3I6OmdldEZOZWdBcmd1bWVudChjYXN0PEJpbmFyeU9wZXJhdG9yPigmSSkpKTsKKyAgICBPdXQgPDwgIikiOworICB9IGVsc2UgaWYgKEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZSZW0pIHsKKyAgICAvLyBPdXRwdXQgYSBjYWxsIHRvIGZtb2QvZm1vZGYgaW5zdGVhZCBvZiBlbWl0dGluZyBhJWIKKyAgICBpZiAoSS5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0RmxvYXRUeShJLmdldENvbnRleHQoKSkpCisgICAgICBPdXQgPDwgImZtb2RmKCI7CisgICAgZWxzZSBpZiAoSS5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0RG91YmxlVHkoSS5nZXRDb250ZXh0KCkpKQorICAgICAgT3V0IDw8ICJmbW9kKCI7CisgICAgZWxzZSAgLy8gYWxsIDMgZmxhdm9ycyBvZiBsb25nIGRvdWJsZQorICAgICAgT3V0IDw8ICJmbW9kbCgiOworICAgIHdyaXRlT3BlcmFuZChJLmdldE9wZXJhbmQoMCkpOworICAgIE91dCA8PCAiLCAiOworICAgIHdyaXRlT3BlcmFuZChJLmdldE9wZXJhbmQoMSkpOworICAgIE91dCA8PCAiKSI7CisgIH0gZWxzZSB7CisKKyAgICAvLyBXcml0ZSBvdXQgdGhlIGNhc3Qgb2YgdGhlIGluc3RydWN0aW9uJ3MgdmFsdWUgYmFjayB0byB0aGUgcHJvcGVyIHR5cGUKKyAgICAvLyBpZiBuZWNlc3NhcnkuCisgICAgYm9vbCBOZWVkc0Nsb3NpbmdQYXJlbnMgPSB3cml0ZUluc3RydWN0aW9uQ2FzdChJKTsKKworICAgIC8vIENlcnRhaW4gaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgdGhlIG9wZXJhbmQgdG8gYmUgZm9yY2VkIHRvIGEgc3BlY2lmaWMgdHlwZQorICAgIC8vIHNvIHdlIHVzZSB3cml0ZU9wZXJhbmRXaXRoQ2FzdCBoZXJlIGluc3RlYWQgb2Ygd3JpdGVPcGVyYW5kLiBTaW1pbGFybHkKKyAgICAvLyBiZWxvdyBmb3Igb3BlcmFuZCAxCisgICAgd3JpdGVPcGVyYW5kV2l0aENhc3QoSS5nZXRPcGVyYW5kKDApLCBJLmdldE9wY29kZSgpKTsKKworICAgIHN3aXRjaCAoSS5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGQWRkOiBPdXQgPDwgIiArICI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGU3ViOiBPdXQgPDwgIiAtICI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGTXVsOiBPdXQgPDwgIiAqICI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUmVtOiBPdXQgPDwgIiAlICI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVEaXY6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0RpdjogCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RkRpdjogT3V0IDw8ICIgLyAiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6ICBPdXQgPDwgIiAmICI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOiAgIE91dCA8PCAiIHwgIjsgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOiAgT3V0IDw8ICIgXiAiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTaGwgOiBPdXQgPDwgIiA8PCAiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6IE91dCA8PCAiID4+ICI7IGJyZWFrOworICAgIGRlZmF1bHQ6IAorI2lmbmRlZiBOREVCVUcKKyAgICAgICBlcnJzKCkgPDwgIkludmFsaWQgb3BlcmF0b3IgdHlwZSEiIDw8IEk7CisjZW5kaWYKKyAgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgIH0KKworICAgIHdyaXRlT3BlcmFuZFdpdGhDYXN0KEkuZ2V0T3BlcmFuZCgxKSwgSS5nZXRPcGNvZGUoKSk7CisgICAgaWYgKE5lZWRzQ2xvc2luZ1BhcmVucykKKyAgICAgIE91dCA8PCAiKSkiOworICB9CisKKyAgaWYgKG5lZWRzQ2FzdCkgeworICAgIE91dCA8PCAiKSkiOworICB9Cit9CisKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRJQ21wSW5zdChJQ21wSW5zdCAmSSkgeworICAvLyBXZSBtdXN0IGNhc3QgdGhlIHJlc3VsdHMgb2YgaWNtcCB3aGljaCBtaWdodCBiZSBwcm9tb3RlZC4KKyAgYm9vbCBuZWVkc0Nhc3QgPSBmYWxzZTsKKworICAvLyBXcml0ZSBvdXQgdGhlIGNhc3Qgb2YgdGhlIGluc3RydWN0aW9uJ3MgdmFsdWUgYmFjayB0byB0aGUgcHJvcGVyIHR5cGUKKyAgLy8gaWYgbmVjZXNzYXJ5LgorICBib29sIE5lZWRzQ2xvc2luZ1BhcmVucyA9IHdyaXRlSW5zdHJ1Y3Rpb25DYXN0KEkpOworCisgIC8vIENlcnRhaW4gaWNtcCBwcmVkaWNhdGUgcmVxdWlyZSB0aGUgb3BlcmFuZCB0byBiZSBmb3JjZWQgdG8gYSBzcGVjaWZpYyB0eXBlCisgIC8vIHNvIHdlIHVzZSB3cml0ZU9wZXJhbmRXaXRoQ2FzdCBoZXJlIGluc3RlYWQgb2Ygd3JpdGVPcGVyYW5kLiBTaW1pbGFybHkKKyAgLy8gYmVsb3cgZm9yIG9wZXJhbmQgMQorICB3cml0ZU9wZXJhbmRXaXRoQ2FzdChJLmdldE9wZXJhbmQoMCksIEkpOworCisgIHN3aXRjaCAoSS5nZXRQcmVkaWNhdGUoKSkgeworICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiAgT3V0IDw8ICIgPT0gIjsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6ICBPdXQgPDwgIiAhPSAiOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTEU6CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xFOiBPdXQgPDwgIiA8PSAiOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOiBPdXQgPDwgIiA+PSAiOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiBPdXQgPDwgIiA8ICI7IGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDoKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6IE91dCA8PCAiID4gIjsgYnJlYWs7CisgIGRlZmF1bHQ6CisjaWZuZGVmIE5ERUJVRworICAgIGVycnMoKSA8PCAiSW52YWxpZCBpY21wIHByZWRpY2F0ZSEiIDw8IEk7IAorI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorCisgIHdyaXRlT3BlcmFuZFdpdGhDYXN0KEkuZ2V0T3BlcmFuZCgxKSwgSSk7CisgIGlmIChOZWVkc0Nsb3NpbmdQYXJlbnMpCisgICAgT3V0IDw8ICIpKSI7CisKKyAgaWYgKG5lZWRzQ2FzdCkgeworICAgIE91dCA8PCAiKSkiOworICB9Cit9CisKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRGQ21wSW5zdChGQ21wSW5zdCAmSSkgeworICBpZiAoSS5nZXRQcmVkaWNhdGUoKSA9PSBGQ21wSW5zdDo6RkNNUF9GQUxTRSkgeworICAgIE91dCA8PCAiMCI7CisgICAgcmV0dXJuOworICB9CisgIGlmIChJLmdldFByZWRpY2F0ZSgpID09IEZDbXBJbnN0OjpGQ01QX1RSVUUpIHsKKyAgICBPdXQgPDwgIjEiOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IGNoYXIqIG9wID0gMDsKKyAgc3dpdGNoIChJLmdldFByZWRpY2F0ZSgpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgRkNtcCBwcmVkaWNhdGUiKTsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PUkQ6IG9wID0gIm9yZCI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VOTzogb3AgPSAidW5vIjsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUVROiBvcCA9ICJ1ZXEiOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTkU6IG9wID0gInVuZSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMVDogb3AgPSAidWx0IjsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxFOiBvcCA9ICJ1bGUiOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VR1Q6IG9wID0gInVndCI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHRTogb3AgPSAidWdlIjsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0VROiBvcCA9ICJvZXEiOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTkU6IG9wID0gIm9uZSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MVDogb3AgPSAib2x0IjsgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xFOiBvcCA9ICJvbGUiOyBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PR1Q6IG9wID0gIm9ndCI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRTogb3AgPSAib2dlIjsgYnJlYWs7CisgIH0KKworICBPdXQgPDwgImxsdm1fZmNtcF8iIDw8IG9wIDw8ICIoIjsKKyAgLy8gV3JpdGUgdGhlIGZpcnN0IG9wZXJhbmQKKyAgd3JpdGVPcGVyYW5kKEkuZ2V0T3BlcmFuZCgwKSk7CisgIE91dCA8PCAiLCAiOworICAvLyBXcml0ZSB0aGUgc2Vjb25kIG9wZXJhbmQKKyAgd3JpdGVPcGVyYW5kKEkuZ2V0T3BlcmFuZCgxKSk7CisgIE91dCA8PCAiKSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogZ2V0RmxvYXRCaXRDYXN0RmllbGQoY29uc3QgVHlwZSAqVHkpIHsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIFR5cGUiKTsKKyAgICBjYXNlIFR5cGU6OkZsb2F0VHlJRDogIHJldHVybiAiRmxvYXQiOworICAgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDogcmV0dXJuICJEb3VibGUiOworICAgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6IHsKKyAgICAgIHVuc2lnbmVkIE51bUJpdHMgPSBjYXN0PEludGVnZXJUeXBlPihUeSktPmdldEJpdFdpZHRoKCk7CisgICAgICBpZiAoTnVtQml0cyA8PSAzMikKKyAgICAgICAgcmV0dXJuICJJbnQzMiI7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAiSW50NjQiOworICAgIH0KKyAgfQorfQorCit2b2lkIENXcml0ZXI6OnZpc2l0Q2FzdEluc3QoQ2FzdEluc3QgJkkpIHsKKyAgY29uc3QgVHlwZSAqRHN0VHkgPSBJLmdldFR5cGUoKTsKKyAgY29uc3QgVHlwZSAqU3JjVHkgPSBJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsKKyAgaWYgKGlzRlBJbnRCaXRDYXN0KEkpKSB7CisgICAgT3V0IDw8ICcoJzsKKyAgICAvLyBUaGVzZSBpbnQ8LT5mbG9hdCBhbmQgbG9uZzwtPmRvdWJsZSBjYXN0cyBuZWVkIHRvIGJlIGhhbmRsZWQgc3BlY2lhbGx5CisgICAgT3V0IDw8IEdldFZhbHVlTmFtZSgmSSkgPDwgIl9fQklUQ0FTVF9URU1QT1JBUlkuIiAKKyAgICAgICAgPDwgZ2V0RmxvYXRCaXRDYXN0RmllbGQoSS5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpIDw8ICIgPSAiOworICAgIHdyaXRlT3BlcmFuZChJLmdldE9wZXJhbmQoMCkpOworICAgIE91dCA8PCAiLCAiIDw8IEdldFZhbHVlTmFtZSgmSSkgPDwgIl9fQklUQ0FTVF9URU1QT1JBUlkuIgorICAgICAgICA8PCBnZXRGbG9hdEJpdENhc3RGaWVsZChJLmdldFR5cGUoKSk7CisgICAgT3V0IDw8ICcpJzsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIE91dCA8PCAnKCc7CisgIHByaW50Q2FzdChJLmdldE9wY29kZSgpLCBTcmNUeSwgRHN0VHkpOworCisgIC8vIE1ha2UgYSBzZXh0IGZyb20gaTEgd29yayBieSBzdWJ0cmFjdGluZyB0aGUgaTEgZnJvbSAwIChhbiBpbnQpLgorICBpZiAoU3JjVHkgPT0gVHlwZTo6Z2V0SW50MVR5KEkuZ2V0Q29udGV4dCgpKSAmJgorICAgICAgSS5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U0V4dCkKKyAgICBPdXQgPDwgIjAtIjsKKyAgCisgIHdyaXRlT3BlcmFuZChJLmdldE9wZXJhbmQoMCkpOworICAgIAorICBpZiAoRHN0VHkgPT0gVHlwZTo6Z2V0SW50MVR5KEkuZ2V0Q29udGV4dCgpKSAmJiAKKyAgICAgIChJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpUcnVuYyB8fAorICAgICAgIEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZQVG9VSSB8fAorICAgICAgIEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZQVG9TSSB8fAorICAgICAgIEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlB0clRvSW50KSkgeworICAgIC8vIE1ha2Ugc3VyZSB3ZSByZWFsbHkgZ2V0IGEgdHJ1bmMgdG8gYm9vbCBieSBhbmRpbmcgdGhlIG9wZXJhbmQgd2l0aCAxIAorICAgIE91dCA8PCAiJjF1IjsKKyAgfQorICBPdXQgPDwgJyknOworfQorCit2b2lkIENXcml0ZXI6OnZpc2l0U2VsZWN0SW5zdChTZWxlY3RJbnN0ICZJKSB7CisgIE91dCA8PCAiKCgiOworICB3cml0ZU9wZXJhbmQoSS5nZXRDb25kaXRpb24oKSk7CisgIE91dCA8PCAiKSA/ICgiOworICB3cml0ZU9wZXJhbmQoSS5nZXRUcnVlVmFsdWUoKSk7CisgIE91dCA8PCAiKSA6ICgiOworICB3cml0ZU9wZXJhbmQoSS5nZXRGYWxzZVZhbHVlKCkpOworICBPdXQgPDwgIikpIjsKK30KKworCit2b2lkIENXcml0ZXI6Omxvd2VySW50cmluc2ljcyhGdW5jdGlvbiAmRikgeworICAvLyBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBpbnRyaW5zaWNzIHRoYXQgZ2V0IGdlbmVyYXRlZCB0byBhIGxvd2VyZWQKKyAgLy8gZnVuY3Rpb24uIFdlIG11c3QgZ2VuZXJhdGUgdGhlIHByb3RvdHlwZXMgYmVmb3JlIHRoZSBmdW5jdGlvbiBib2R5IHdoaWNoCisgIC8vIHdpbGwgb25seSBiZSBleHBhbmRlZCBvbiBmaXJzdCB1c2UgKGJ5IHRoZSBsb29wIGJlbG93KS4KKyAgc3RkOjp2ZWN0b3I8RnVuY3Rpb24qPiBwcm90b3R5cGVzVG9HZW47CisKKyAgLy8gRXhhbWluZSBhbGwgdGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGludHJpbnNpY3MgdGhhdAorICAvLyBuZWVkIHRvIGJlIGxvd2VyZWQuCisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEJCID0gRi5iZWdpbigpLCBFRSA9IEYuZW5kKCk7IEJCICE9IEVFOyArK0JCKQorICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBJICE9IEU7ICkKKyAgICAgIGlmIChDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oSSsrKSkKKyAgICAgICAgaWYgKEZ1bmN0aW9uICpGID0gQ0ktPmdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICAgICAgc3dpdGNoIChGLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICAgICAgICAgY2FzZSBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWM6CisgICAgICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbW9yeV9iYXJyaWVyOgorICAgICAgICAgIGNhc2UgSW50cmluc2ljOjp2YXN0YXJ0OgorICAgICAgICAgIGNhc2UgSW50cmluc2ljOjp2YWNvcHk6CisgICAgICAgICAgY2FzZSBJbnRyaW5zaWM6OnZhZW5kOgorICAgICAgICAgIGNhc2UgSW50cmluc2ljOjpyZXR1cm5hZGRyZXNzOgorICAgICAgICAgIGNhc2UgSW50cmluc2ljOjpmcmFtZWFkZHJlc3M6CisgICAgICAgICAgY2FzZSBJbnRyaW5zaWM6OnNldGptcDoKKyAgICAgICAgICBjYXNlIEludHJpbnNpYzo6bG9uZ2ptcDoKKyAgICAgICAgICBjYXNlIEludHJpbnNpYzo6cHJlZmV0Y2g6CisgICAgICAgICAgY2FzZSBJbnRyaW5zaWM6OnBvd2k6CisgICAgICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfY21wX3NzOgorICAgICAgICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX2NtcF9wczoKKyAgICAgICAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfY21wX3NkOgorICAgICAgICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9jbXBfcGQ6CisgICAgICAgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2x2c2w6CisgICAgICAgICAgICAgIC8vIFdlIGRpcmVjdGx5IGltcGxlbWVudCB0aGVzZSBpbnRyaW5zaWNzCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBpbnRyaW5zaWMgdGhhdCBkaXJlY3RseSBjb3JyZXNwb25kcyB0byBhIEdDQworICAgICAgICAgICAgLy8gYnVpbHRpbiwgd2UgaGFuZGxlIGl0LgorICAgICAgICAgICAgY29uc3QgY2hhciAqQnVpbHRpbk5hbWUgPSAiIjsKKyNkZWZpbmUgR0VUX0dDQ19CVUlMVElOX05BTUUKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuZ2VuIgorI3VuZGVmIEdFVF9HQ0NfQlVJTFRJTl9OQU1FCisgICAgICAgICAgICAvLyBJZiB3ZSBoYW5kbGUgaXQsIGRvbid0IGxvd2VyIGl0LgorICAgICAgICAgICAgaWYgKEJ1aWx0aW5OYW1lWzBdKSBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQWxsIG90aGVyIGludHJpbnNpYyBjYWxscyB3ZSBtdXN0IGxvd2VyLgorICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkJlZm9yZSA9IDA7CisgICAgICAgICAgICBpZiAoQ0kgIT0gJkJCLT5mcm9udCgpKQorICAgICAgICAgICAgICBCZWZvcmUgPSBwcmlvcihCYXNpY0Jsb2NrOjppdGVyYXRvcihDSSkpOworCisgICAgICAgICAgICBJTC0+TG93ZXJJbnRyaW5zaWNDYWxsKENJKTsKKyAgICAgICAgICAgIGlmIChCZWZvcmUpIHsgICAgICAgIC8vIE1vdmUgaXRlcmF0b3IgdG8gaW5zdHJ1Y3Rpb24gYWZ0ZXIgY2FsbAorICAgICAgICAgICAgICBJID0gQmVmb3JlOyArK0k7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBJID0gQkItPmJlZ2luKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGUgaW50cmluc2ljIGdvdCBsb3dlcmVkIHRvIGFub3RoZXIgY2FsbCwgYW5kIHRoYXQgY2FsbCBoYXMKKyAgICAgICAgICAgIC8vIGEgZGVmaW5pdGlvbiB0aGVuIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGl0cyBwcm90b3R5cGUgaXMgZW1pdHRlZAorICAgICAgICAgICAgLy8gYmVmb3JlIGFueSBjYWxscyB0byBpdC4KKyAgICAgICAgICAgIGlmIChDYWxsSW5zdCAqQ2FsbCA9IGR5bl9jYXN0PENhbGxJbnN0PihJKSkKKyAgICAgICAgICAgICAgaWYgKEZ1bmN0aW9uICpOZXdGID0gQ2FsbC0+Z2V0Q2FsbGVkRnVuY3Rpb24oKSkKKyAgICAgICAgICAgICAgICBpZiAoIU5ld0YtPmlzRGVjbGFyYXRpb24oKSkKKyAgICAgICAgICAgICAgICAgIHByb3RvdHlwZXNUb0dlbi5wdXNoX2JhY2soTmV3Rik7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAvLyBXZSBtYXkgaGF2ZSBjb2xsZWN0ZWQgc29tZSBwcm90b3R5cGVzIHRvIGVtaXQgaW4gdGhlIGxvb3AgYWJvdmUuIAorICAvLyBFbWl0IHRoZW0gbm93LCBiZWZvcmUgdGhlIGZ1bmN0aW9uIHRoYXQgdXNlcyB0aGVtIGlzIGVtaXR0ZWQuIEJ1dCwKKyAgLy8gYmUgY2FyZWZ1bCBub3QgdG8gZW1pdCB0aGVtIHR3aWNlLgorICBzdGQ6OnZlY3RvcjxGdW5jdGlvbio+OjppdGVyYXRvciBJID0gcHJvdG90eXBlc1RvR2VuLmJlZ2luKCk7CisgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uKj46Oml0ZXJhdG9yIEUgPSBwcm90b3R5cGVzVG9HZW4uZW5kKCk7CisgIGZvciAoIDsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoaW50cmluc2ljUHJvdG90eXBlc0FscmVhZHlHZW5lcmF0ZWQuaW5zZXJ0KCpJKS5zZWNvbmQpIHsKKyAgICAgIE91dCA8PCAnXG4nOworICAgICAgcHJpbnRGdW5jdGlvblNpZ25hdHVyZSgqSSwgdHJ1ZSk7CisgICAgICBPdXQgPDwgIjtcbiI7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRDYWxsSW5zdChDYWxsSW5zdCAmSSkgeworICBpZiAoaXNhPElubGluZUFzbT4oSS5nZXRDYWxsZWRWYWx1ZSgpKSkKKyAgICByZXR1cm4gdmlzaXRJbmxpbmVBc20oSSk7CisKKyAgYm9vbCBXcm90ZUNhbGxlZSA9IGZhbHNlOworCisgIC8vIEhhbmRsZSBpbnRyaW5zaWMgZnVuY3Rpb24gY2FsbHMgZmlyc3QuLi4KKyAgaWYgKEZ1bmN0aW9uICpGID0gSS5nZXRDYWxsZWRGdW5jdGlvbigpKQorICAgIGlmIChJbnRyaW5zaWM6OklEIElEID0gKEludHJpbnNpYzo6SUQpRi0+Z2V0SW50cmluc2ljSUQoKSkKKyAgICAgIGlmICh2aXNpdEJ1aWx0aW5DYWxsKEksIElELCBXcm90ZUNhbGxlZSkpCisgICAgICAgIHJldHVybjsKKworICBWYWx1ZSAqQ2FsbGVlID0gSS5nZXRDYWxsZWRWYWx1ZSgpOworCisgIGNvbnN0IFBvaW50ZXJUeXBlICAqUFR5ICAgPSBjYXN0PFBvaW50ZXJUeXBlPihDYWxsZWUtPmdldFR5cGUoKSk7CisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlR5ICAgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oUFR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKworICAvLyBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIHN0cnVjdC1yZXR1cm4gZnVuY3Rpb24sIGFzc2lnbiB0byB0aGUgZmlyc3QKKyAgLy8gcGFyYW1ldGVyIGluc3RlYWQgb2YgcGFzc2luZyBpdCB0byB0aGUgY2FsbC4KKyAgY29uc3QgQXR0ckxpc3RQdHIgJlBBTCA9IEkuZ2V0QXR0cmlidXRlcygpOworICBib29sIGhhc0J5VmFsID0gSS5oYXNCeVZhbEFyZ3VtZW50KCk7CisgIGJvb2wgaXNTdHJ1Y3RSZXQgPSBJLmhhc1N0cnVjdFJldEF0dHIoKTsKKyAgaWYgKGlzU3RydWN0UmV0KSB7CisgICAgd3JpdGVPcGVyYW5kRGVyZWYoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBPdXQgPDwgIiA9ICI7CisgIH0KKyAgCisgIGlmIChJLmlzVGFpbENhbGwoKSkgT3V0IDw8ICIgLyp0YWlsKi8gIjsKKyAgCisgIGlmICghV3JvdGVDYWxsZWUpIHsKKyAgICAvLyBJZiB0aGlzIGlzIGFuIGluZGlyZWN0IGNhbGwgdG8gYSBzdHJ1Y3QgcmV0dXJuIGZ1bmN0aW9uLCB3ZSBuZWVkIHRvIGNhc3QKKyAgICAvLyB0aGUgcG9pbnRlci4gRGl0dG8gZm9yIGluZGlyZWN0IGNhbGxzIHdpdGggYnl2YWwgYXJndW1lbnRzLgorICAgIGJvb2wgTmVlZHNDYXN0ID0gKGhhc0J5VmFsIHx8IGlzU3RydWN0UmV0KSAmJiAhaXNhPEZ1bmN0aW9uPihDYWxsZWUpOworCisgICAgLy8gR0NDIGlzIGEgcmVhbCBQSVRBLiAgSXQgZG9lcyBub3QgcGVybWl0IGNvZGVnZW5pbmcgY2FzdHMgb2YgZnVuY3Rpb25zIHRvCisgICAgLy8gZnVuY3Rpb24gcG9pbnRlcnMgaWYgdGhleSBhcmUgaW4gYSBjYWxsIChpdCBnZW5lcmF0ZXMgYSB0cmFwIGluc3RydWN0aW9uCisgICAgLy8gaW5zdGVhZCEpLiAgV2Ugd29yayBhcm91bmQgdGhpcyBieSBpbnNlcnRpbmcgYSBjYXN0IHRvIHZvaWQqIGluIGJldHdlZW4KKyAgICAvLyB0aGUgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBwb2ludGVyIGNhc3QuICBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW4ndCBqdXN0CisgICAgLy8gZm9ybSB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbiBoZXJlLCBiZWNhdXNlIHRoZSBmb2xkZXIgd2lsbCBpbW1lZGlhdGVseQorICAgIC8vIG51a2UgaXQuCisgICAgLy8KKyAgICAvLyBOb3RlIGZpbmFsbHksIHRoYXQgdGhpcyBpcyBjb21wbGV0ZWx5IHVuc2FmZS4gIEFOU0kgQyBkb2VzIG5vdCBndWFyYW50ZWUKKyAgICAvLyB0aGF0IHZvaWQqIGFuZCBmdW5jdGlvbiBwb2ludGVycyBoYXZlIHRoZSBzYW1lIHNpemUuIDooIFRvIGRlYWwgd2l0aCB0aGlzCisgICAgLy8gaW4gdGhlIGNvbW1vbiBjYXNlLCB3ZSBoYW5kbGUgY2FzdHMgd2hlcmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkCisgICAgLy8gbWF0Y2ggZXhhY3RseS4KKyAgICAvLworICAgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDYWxsZWUpKQorICAgICAgaWYgKENFLT5pc0Nhc3QoKSkKKyAgICAgICAgaWYgKEZ1bmN0aW9uICpSRiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihDRS0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgICBOZWVkc0Nhc3QgPSB0cnVlOworICAgICAgICAgIENhbGxlZSA9IFJGOworICAgICAgICB9CisgIAorICAgIGlmIChOZWVkc0Nhc3QpIHsKKyAgICAgIC8vIE9rLCBqdXN0IGNhc3QgdGhlIHBvaW50ZXIgdHlwZS4KKyAgICAgIE91dCA8PCAiKCgiOworICAgICAgaWYgKGlzU3RydWN0UmV0KQorICAgICAgICBwcmludFN0cnVjdFJldHVyblBvaW50ZXJGdW5jdGlvblR5cGUoT3V0LCBQQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KEkuZ2V0Q2FsbGVkVmFsdWUoKS0+Z2V0VHlwZSgpKSk7CisgICAgICBlbHNlIGlmIChoYXNCeVZhbCkKKyAgICAgICAgcHJpbnRUeXBlKE91dCwgSS5nZXRDYWxsZWRWYWx1ZSgpLT5nZXRUeXBlKCksIGZhbHNlLCAiIiwgdHJ1ZSwgUEFMKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRUeXBlKE91dCwgSS5nZXRDYWxsZWRWYWx1ZSgpLT5nZXRUeXBlKCkpOworICAgICAgT3V0IDw8ICIpKHZvaWQqKSI7CisgICAgfQorICAgIHdyaXRlT3BlcmFuZChDYWxsZWUpOworICAgIGlmIChOZWVkc0Nhc3QpIE91dCA8PCAnKSc7CisgIH0KKworICBPdXQgPDwgJygnOworCisgIGJvb2wgUHJpbnRlZEFyZyA9IGZhbHNlOworICBpZihGVHktPmlzVmFyQXJnKCkgJiYgIUZUeS0+Z2V0TnVtUGFyYW1zKCkpIHsKKyAgICBPdXQgPDwgIjAgLypkdW1teSBhcmcqLyI7CisgICAgUHJpbnRlZEFyZyA9IHRydWU7CisgIH0KKworICB1bnNpZ25lZCBOdW1EZWNsYXJlZFBhcmFtcyA9IEZUeS0+Z2V0TnVtUGFyYW1zKCk7CisgIENhbGxTaXRlIENTKCZJKTsKKyAgQ2FsbFNpdGU6OmFyZ19pdGVyYXRvciBBSSA9IENTLmFyZ19iZWdpbigpLCBBRSA9IENTLmFyZ19lbmQoKTsKKyAgdW5zaWduZWQgQXJnTm8gPSAwOworICBpZiAoaXNTdHJ1Y3RSZXQpIHsgICAvLyBTa2lwIHN0cnVjdCByZXR1cm4gYXJndW1lbnQuCisgICAgKytBSTsKKyAgICArK0FyZ05vOworICB9CisgICAgICAKKworICBmb3IgKDsgQUkgIT0gQUU7ICsrQUksICsrQXJnTm8pIHsKKyAgICBpZiAoUHJpbnRlZEFyZykgT3V0IDw8ICIsICI7CisgICAgaWYgKEFyZ05vIDwgTnVtRGVjbGFyZWRQYXJhbXMgJiYKKyAgICAgICAgKCpBSSktPmdldFR5cGUoKSAhPSBGVHktPmdldFBhcmFtVHlwZShBcmdObykpIHsKKyAgICAgIE91dCA8PCAnKCc7CisgICAgICBwcmludFR5cGUoT3V0LCBGVHktPmdldFBhcmFtVHlwZShBcmdObyksIAorICAgICAgICAgICAgLyppc1NpZ25lZD0qL1BBTC5wYXJhbUhhc0F0dHIoQXJnTm8rMSwgQXR0cmlidXRlOjpTRXh0KSk7CisgICAgICBPdXQgPDwgJyknOworICAgIH0KKyAgICAvLyBDaGVjayBpZiB0aGUgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlLgorICAgIGlmIChJLnBhcmFtSGFzQXR0cihBcmdObysxLCBBdHRyaWJ1dGU6OkJ5VmFsKSkKKyAgICAgIHdyaXRlT3BlcmFuZERlcmVmKCpBSSk7CisgICAgZWxzZQorICAgICAgd3JpdGVPcGVyYW5kKCpBSSk7CisgICAgUHJpbnRlZEFyZyA9IHRydWU7CisgIH0KKyAgT3V0IDw8ICcpJzsKK30KKworLy8vIHZpc2l0QnVpbHRpbkNhbGwgLSBIYW5kbGUgdGhlIGNhbGwgdG8gdGhlIHNwZWNpZmllZCBidWlsdGluLiAgUmV0dXJucyB0cnVlCisvLy8gaWYgdGhlIGVudGlyZSBjYWxsIGlzIGhhbmRsZWQsIHJldHVybiBmYWxzZSBpZiBpdCB3YXNuJ3QgaGFuZGxlZCwgYW5kCisvLy8gb3B0aW9uYWxseSBzZXQgJ1dyb3RlQ2FsbGVlJyBpZiB0aGUgY2FsbGVlIGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZCBvdXQuCitib29sIENXcml0ZXI6OnZpc2l0QnVpbHRpbkNhbGwoQ2FsbEluc3QgJkksIEludHJpbnNpYzo6SUQgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmV3JvdGVDYWxsZWUpIHsKKyAgc3dpdGNoIChJRCkgeworICBkZWZhdWx0OiB7CisgICAgLy8gSWYgdGhpcyBpcyBhbiBpbnRyaW5zaWMgdGhhdCBkaXJlY3RseSBjb3JyZXNwb25kcyB0byBhIEdDQworICAgIC8vIGJ1aWx0aW4sIHdlIGVtaXQgaXQgaGVyZS4KKyAgICBjb25zdCBjaGFyICpCdWlsdGluTmFtZSA9ICIiOworICAgIEZ1bmN0aW9uICpGID0gSS5nZXRDYWxsZWRGdW5jdGlvbigpOworI2RlZmluZSBHRVRfR0NDX0JVSUxUSU5fTkFNRQorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5nZW4iCisjdW5kZWYgR0VUX0dDQ19CVUlMVElOX05BTUUKKyAgICBhc3NlcnQoQnVpbHRpbk5hbWVbMF0gJiYgIlVua25vd24gTExWTSBpbnRyaW5zaWMhIik7CisgICAgCisgICAgT3V0IDw8IEJ1aWx0aW5OYW1lOworICAgIFdyb3RlQ2FsbGVlID0gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY2FzZSBJbnRyaW5zaWM6Om1lbW9yeV9iYXJyaWVyOgorICAgIE91dCA8PCAiX19zeW5jX3N5bmNocm9uaXplKCkiOworICAgIHJldHVybiB0cnVlOworICBjYXNlIEludHJpbnNpYzo6dmFzdGFydDoKKyAgICBPdXQgPDwgIjA7ICI7CisgICAgICAKKyAgICBPdXQgPDwgInZhX3N0YXJ0KCoodmFfbGlzdCopIjsKKyAgICB3cml0ZU9wZXJhbmQoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBPdXQgPDwgIiwgIjsKKyAgICAvLyBPdXRwdXQgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlIGVuY2xvc2luZyBmdW5jdGlvbi4KKyAgICBpZiAoSS5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmFyZ19lbXB0eSgpKQorICAgICAgT3V0IDw8ICJ2YXJhcmdfZHVtbXlfYXJnIjsKKyAgICBlbHNlCisgICAgICB3cml0ZU9wZXJhbmQoLS1JLmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+YXJnX2VuZCgpKTsKKyAgICBPdXQgPDwgJyknOworICAgIHJldHVybiB0cnVlOworICBjYXNlIEludHJpbnNpYzo6dmFlbmQ6CisgICAgaWYgKCFpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oSS5nZXRBcmdPcGVyYW5kKDApKSkgeworICAgICAgT3V0IDw8ICIwOyB2YV9lbmQoKih2YV9saXN0KikiOworICAgICAgd3JpdGVPcGVyYW5kKEkuZ2V0QXJnT3BlcmFuZCgwKSk7CisgICAgICBPdXQgPDwgJyknOworICAgIH0gZWxzZSB7CisgICAgICBPdXQgPDwgInZhX2VuZCgqKHZhX2xpc3QqKTApIjsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgSW50cmluc2ljOjp2YWNvcHk6CisgICAgT3V0IDw8ICIwOyAiOworICAgIE91dCA8PCAidmFfY29weSgqKHZhX2xpc3QqKSI7CisgICAgd3JpdGVPcGVyYW5kKEkuZ2V0QXJnT3BlcmFuZCgwKSk7CisgICAgT3V0IDw8ICIsICoodmFfbGlzdCopIjsKKyAgICB3cml0ZU9wZXJhbmQoSS5nZXRBcmdPcGVyYW5kKDEpKTsKKyAgICBPdXQgPDwgJyknOworICAgIHJldHVybiB0cnVlOworICBjYXNlIEludHJpbnNpYzo6cmV0dXJuYWRkcmVzczoKKyAgICBPdXQgPDwgIl9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygiOworICAgIHdyaXRlT3BlcmFuZChJLmdldEFyZ09wZXJhbmQoMCkpOworICAgIE91dCA8PCAnKSc7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgSW50cmluc2ljOjpmcmFtZWFkZHJlc3M6CisgICAgT3V0IDw8ICJfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygiOworICAgIHdyaXRlT3BlcmFuZChJLmdldEFyZ09wZXJhbmQoMCkpOworICAgIE91dCA8PCAnKSc7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgSW50cmluc2ljOjpwb3dpOgorICAgIE91dCA8PCAiX19idWlsdGluX3Bvd2koIjsKKyAgICB3cml0ZU9wZXJhbmQoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBPdXQgPDwgIiwgIjsKKyAgICB3cml0ZU9wZXJhbmQoSS5nZXRBcmdPcGVyYW5kKDEpKTsKKyAgICBPdXQgPDwgJyknOworICAgIHJldHVybiB0cnVlOworICBjYXNlIEludHJpbnNpYzo6c2V0am1wOgorICAgIE91dCA8PCAic2V0am1wKCooam1wX2J1ZiopIjsKKyAgICB3cml0ZU9wZXJhbmQoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBPdXQgPDwgJyknOworICAgIHJldHVybiB0cnVlOworICBjYXNlIEludHJpbnNpYzo6bG9uZ2ptcDoKKyAgICBPdXQgPDwgImxvbmdqbXAoKihqbXBfYnVmKikiOworICAgIHdyaXRlT3BlcmFuZChJLmdldEFyZ09wZXJhbmQoMCkpOworICAgIE91dCA8PCAiLCAiOworICAgIHdyaXRlT3BlcmFuZChJLmdldEFyZ09wZXJhbmQoMSkpOworICAgIE91dCA8PCAnKSc7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgSW50cmluc2ljOjpwcmVmZXRjaDoKKyAgICBPdXQgPDwgIkxMVk1fUFJFRkVUQ0goKGNvbnN0IHZvaWQgKikiOworICAgIHdyaXRlT3BlcmFuZChJLmdldEFyZ09wZXJhbmQoMCkpOworICAgIE91dCA8PCAiLCAiOworICAgIHdyaXRlT3BlcmFuZChJLmdldEFyZ09wZXJhbmQoMSkpOworICAgIE91dCA8PCAiLCAiOworICAgIHdyaXRlT3BlcmFuZChJLmdldEFyZ09wZXJhbmQoMikpOworICAgIE91dCA8PCAiKSI7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgSW50cmluc2ljOjpzdGFja3NhdmU6CisgICAgLy8gRW1pdCB0aGlzIGFzOiBWYWwgPSAwOyAqKCh2b2lkKiopJlZhbCkgPSBfX2J1aWx0aW5fc3RhY2tfc2F2ZSgpCisgICAgLy8gdG8gd29yayBhcm91bmQgR0NDIGJ1Z3MgKHNlZSBQUjE4MDkpLgorICAgIE91dCA8PCAiMDsgKigodm9pZCoqKSYiIDw8IEdldFZhbHVlTmFtZSgmSSkKKyAgICAgICAgPDwgIikgPSBfX2J1aWx0aW5fc3RhY2tfc2F2ZSgpIjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfY21wX3NzOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9jbXBfcHM6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9jbXBfc2Q6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9jbXBfcGQ6CisgICAgT3V0IDw8ICcoJzsKKyAgICBwcmludFR5cGUoT3V0LCBJLmdldFR5cGUoKSk7CisgICAgT3V0IDw8ICcpJzsgIAorICAgIC8vIE11bHRpcGxlIEdDQyBidWlsdGlucyBtdWx0aXBsZXggb250byB0aGlzIGludHJpbnNpYy4KKyAgICBzd2l0Y2ggKGNhc3Q8Q29uc3RhbnRJbnQ+KEkuZ2V0QXJnT3BlcmFuZCgyKSktPmdldFpFeHRWYWx1ZSgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBsbHZtLng4Ni5zc2UuY21wISIpOworICAgIGNhc2UgMDogT3V0IDw8ICJfX2J1aWx0aW5faWEzMl9jbXBlcSI7IGJyZWFrOworICAgIGNhc2UgMTogT3V0IDw8ICJfX2J1aWx0aW5faWEzMl9jbXBsdCI7IGJyZWFrOworICAgIGNhc2UgMjogT3V0IDw8ICJfX2J1aWx0aW5faWEzMl9jbXBsZSI7IGJyZWFrOworICAgIGNhc2UgMzogT3V0IDw8ICJfX2J1aWx0aW5faWEzMl9jbXB1bm9yZCI7IGJyZWFrOworICAgIGNhc2UgNDogT3V0IDw8ICJfX2J1aWx0aW5faWEzMl9jbXBuZXEiOyBicmVhazsKKyAgICBjYXNlIDU6IE91dCA8PCAiX19idWlsdGluX2lhMzJfY21wbmx0IjsgYnJlYWs7CisgICAgY2FzZSA2OiBPdXQgPDwgIl9fYnVpbHRpbl9pYTMyX2NtcG5sZSI7IGJyZWFrOworICAgIGNhc2UgNzogT3V0IDw8ICJfX2J1aWx0aW5faWEzMl9jbXBvcmQiOyBicmVhazsKKyAgICB9CisgICAgaWYgKElEID09IEludHJpbnNpYzo6eDg2X3NzZV9jbXBfcHMgfHwgSUQgPT0gSW50cmluc2ljOjp4ODZfc3NlMl9jbXBfcGQpCisgICAgICBPdXQgPDwgJ3AnOworICAgIGVsc2UKKyAgICAgIE91dCA8PCAncyc7CisgICAgaWYgKElEID09IEludHJpbnNpYzo6eDg2X3NzZV9jbXBfc3MgfHwgSUQgPT0gSW50cmluc2ljOjp4ODZfc3NlX2NtcF9wcykKKyAgICAgIE91dCA8PCAncyc7CisgICAgZWxzZQorICAgICAgT3V0IDw8ICdkJzsKKyAgICAgIAorICAgIE91dCA8PCAiKCI7CisgICAgd3JpdGVPcGVyYW5kKEkuZ2V0QXJnT3BlcmFuZCgwKSk7CisgICAgT3V0IDw8ICIsICI7CisgICAgd3JpdGVPcGVyYW5kKEkuZ2V0QXJnT3BlcmFuZCgxKSk7CisgICAgT3V0IDw8ICIpIjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2x2c2w6CisgICAgT3V0IDw8ICcoJzsKKyAgICBwcmludFR5cGUoT3V0LCBJLmdldFR5cGUoKSk7CisgICAgT3V0IDw8ICcpJzsgIAorICAgIE91dCA8PCAiX19idWlsdGluX2FsdGl2ZWNfbHZzbCgwLCAodm9pZCopIjsKKyAgICB3cml0ZU9wZXJhbmQoSS5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBPdXQgPDwgIikiOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKKy8vVGhpcyBjb252ZXJ0cyB0aGUgbGx2bSBjb25zdHJhaW50IHN0cmluZyB0byBzb21ldGhpbmcgZ2NjIGlzIGV4cGVjdGluZy4KKy8vVE9ETzogd29yayBvdXQgcGxhdGZvcm0gaW5kZXBlbmRlbnQgY29uc3RyYWludHMgYW5kIGZhY3RvciB0aG9zZSBvdXQKKy8vICAgICAgb2YgdGhlIHBlciB0YXJnZXQgdGFibGVzCisvLyAgICAgIGhhbmRsZSBtdWx0aXBsZSBjb25zdHJhaW50IGNvZGVzCitzdGQ6OnN0cmluZyBDV3JpdGVyOjpJbnRlcnByZXRBU01Db25zdHJhaW50KElubGluZUFzbTo6Q29uc3RyYWludEluZm8mIGMpIHsKKyAgYXNzZXJ0KGMuQ29kZXMuc2l6ZSgpID09IDEgJiYgIlRvbyBtYW55IGFzbSBjb25zdHJhaW50IGNvZGVzIHRvIGhhbmRsZSIpOworCisgIC8vIEdyYWIgdGhlIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gTUNBc21JbmZvIGlmIGl0IGV4aXN0cy4KKyAgY29uc3QgTUNBc21JbmZvICpUYXJnZXRBc207CisgIHN0ZDo6c3RyaW5nIFRyaXBsZSA9IFRoZU1vZHVsZS0+Z2V0VGFyZ2V0VHJpcGxlKCk7CisgIGlmIChUcmlwbGUuZW1wdHkoKSkKKyAgICBUcmlwbGUgPSBsbHZtOjpzeXM6OmdldEhvc3RUcmlwbGUoKTsKKyAgCisgIHN0ZDo6c3RyaW5nIEU7CisgIGlmIChjb25zdCBUYXJnZXQgKk1hdGNoID0gVGFyZ2V0UmVnaXN0cnk6Omxvb2t1cFRhcmdldChUcmlwbGUsIEUpKQorICAgIFRhcmdldEFzbSA9IE1hdGNoLT5jcmVhdGVBc21JbmZvKFRyaXBsZSk7CisgIGVsc2UKKyAgICByZXR1cm4gYy5Db2Rlc1swXTsKKyAgCisgIGNvbnN0IGNoYXIgKmNvbnN0ICp0YWJsZSA9IFRhcmdldEFzbS0+Z2V0QXNtQ0JFKCk7CisKKyAgLy8gU2VhcmNoIHRoZSB0cmFuc2xhdGlvbiB0YWJsZSBpZiBpdCBleGlzdHMuCisgIGZvciAoaW50IGkgPSAwOyB0YWJsZSAmJiB0YWJsZVtpXTsgaSArPSAyKQorICAgIGlmIChjLkNvZGVzWzBdID09IHRhYmxlW2ldKSB7CisgICAgICBkZWxldGUgVGFyZ2V0QXNtOworICAgICAgcmV0dXJuIHRhYmxlW2krMV07CisgICAgfQorCisgIC8vIERlZmF1bHQgaXMgaWRlbnRpdHkuCisgIGRlbGV0ZSBUYXJnZXRBc207CisgIHJldHVybiBjLkNvZGVzWzBdOworfQorCisvL1RPRE86IGltcG9ydCBsb2dpYyBmcm9tIEFzbVByaW50ZXIuY3BwCitzdGF0aWMgc3RkOjpzdHJpbmcgZ2NjaWZ5QXNtKHN0ZDo6c3RyaW5nIGFzbXN0cikgeworICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgIT0gYXNtc3RyLnNpemUoKTsgKytpKQorICAgIGlmIChhc21zdHJbaV0gPT0gJ1xuJykKKyAgICAgIGFzbXN0ci5yZXBsYWNlKGksIDEsICJcXG4iKTsKKyAgICBlbHNlIGlmIChhc21zdHJbaV0gPT0gJ1x0JykKKyAgICAgIGFzbXN0ci5yZXBsYWNlKGksIDEsICJcXHQiKTsKKyAgICBlbHNlIGlmIChhc21zdHJbaV0gPT0gJyQnKSB7CisgICAgICBpZiAoYXNtc3RyW2kgKyAxXSA9PSAneycpIHsKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBhID0gYXNtc3RyLmZpbmRfZmlyc3Rfb2YoJzonLCBpICsgMSk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgYiA9IGFzbXN0ci5maW5kX2ZpcnN0X29mKCd9JywgaSArIDEpOworICAgICAgICBzdGQ6OnN0cmluZyBuID0gIiUiICsgCisgICAgICAgICAgYXNtc3RyLnN1YnN0cihhICsgMSwgYiAtIGEgLSAxKSArCisgICAgICAgICAgYXNtc3RyLnN1YnN0cihpICsgMiwgYSAtIGkgLSAyKTsKKyAgICAgICAgYXNtc3RyLnJlcGxhY2UoaSwgYiAtIGkgKyAxLCBuKTsKKyAgICAgICAgaSArPSBuLnNpemUoKSAtIDE7CisgICAgICB9IGVsc2UKKyAgICAgICAgYXNtc3RyLnJlcGxhY2UoaSwgMSwgIiUiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYXNtc3RyW2ldID09ICclJykvL2dycgorICAgICAgeyBhc21zdHIucmVwbGFjZShpLCAxLCAiJSUiKTsgKytpO30KKyAgCisgIHJldHVybiBhc21zdHI7Cit9CisKKy8vVE9ETzogYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCBjb25zdW1lIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsIGFyZSBsaWtlbHkgd3JvbmcKKy8vICAgICAgaGFuZGxlIGNvbW11bml0aXZpdHkKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRJbmxpbmVBc20oQ2FsbEluc3QgJkNJKSB7CisgIElubGluZUFzbSogYXMgPSBjYXN0PElubGluZUFzbT4oQ0kuZ2V0Q2FsbGVkVmFsdWUoKSk7CisgIHN0ZDo6dmVjdG9yPElubGluZUFzbTo6Q29uc3RyYWludEluZm8+IENvbnN0cmFpbnRzID0gYXMtPlBhcnNlQ29uc3RyYWludHMoKTsKKyAgCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxWYWx1ZSosIGludD4gPiBSZXN1bHRWYWxzOworICBpZiAoQ0kuZ2V0VHlwZSgpID09IFR5cGU6OmdldFZvaWRUeShDSS5nZXRDb250ZXh0KCkpKQorICAgIDsKKyAgZWxzZSBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1QgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihDSS5nZXRUeXBlKCkpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNULT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkKKyAgICAgIFJlc3VsdFZhbHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCZDSSwgKGludClpKSk7CisgIH0gZWxzZSB7CisgICAgUmVzdWx0VmFscy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoJkNJLCAtMSkpOworICB9CisgIAorICAvLyBGaXggdXAgdGhlIGFzbSBzdHJpbmcgZm9yIGdjYyBhbmQgZW1pdCBpdC4KKyAgT3V0IDw8ICJfX2FzbV9fIHZvbGF0aWxlIChcIiIgPDwgZ2NjaWZ5QXNtKGFzLT5nZXRBc21TdHJpbmcoKSkgPDwgIlwiXG4iOworICBPdXQgPDwgIiAgICAgICAgOiI7CisKKyAgdW5zaWduZWQgVmFsdWVDb3VudCA9IDA7CisgIGJvb2wgSXNGaXJzdCA9IHRydWU7CisgIAorICAvLyBDb252ZXJ0IG92ZXIgYWxsIHRoZSBvdXRwdXQgY29uc3RyYWludHMuCisgIGZvciAoc3RkOjp2ZWN0b3I8SW5saW5lQXNtOjpDb25zdHJhaW50SW5mbz46Oml0ZXJhdG9yIEkgPSBDb25zdHJhaW50cy5iZWdpbigpLAorICAgICAgIEUgPSBDb25zdHJhaW50cy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAKKyAgICBpZiAoSS0+VHlwZSAhPSBJbmxpbmVBc206OmlzT3V0cHV0KSB7CisgICAgICArK1ZhbHVlQ291bnQ7CisgICAgICBjb250aW51ZTsgIC8vIElnbm9yZSBub24tb3V0cHV0IGNvbnN0cmFpbnRzLgorICAgIH0KKyAgICAKKyAgICBhc3NlcnQoSS0+Q29kZXMuc2l6ZSgpID09IDEgJiYgIlRvbyBtYW55IGFzbSBjb25zdHJhaW50IGNvZGVzIHRvIGhhbmRsZSIpOworICAgIHN0ZDo6c3RyaW5nIEMgPSBJbnRlcnByZXRBU01Db25zdHJhaW50KCpJKTsKKyAgICBpZiAoQy5lbXB0eSgpKSBjb250aW51ZTsKKyAgICAKKyAgICBpZiAoIUlzRmlyc3QpIHsKKyAgICAgIE91dCA8PCAiLCAiOworICAgICAgSXNGaXJzdCA9IGZhbHNlOworICAgIH0KKworICAgIC8vIFVucGFjayB0aGUgZGVzdC4KKyAgICBWYWx1ZSAqRGVzdFZhbDsKKyAgICBpbnQgRGVzdFZhbE5vID0gLTE7CisgICAgCisgICAgaWYgKFZhbHVlQ291bnQgPCBSZXN1bHRWYWxzLnNpemUoKSkgeworICAgICAgRGVzdFZhbCA9IFJlc3VsdFZhbHNbVmFsdWVDb3VudF0uZmlyc3Q7CisgICAgICBEZXN0VmFsTm8gPSBSZXN1bHRWYWxzW1ZhbHVlQ291bnRdLnNlY29uZDsKKyAgICB9IGVsc2UKKyAgICAgIERlc3RWYWwgPSBDSS5nZXRBcmdPcGVyYW5kKFZhbHVlQ291bnQtUmVzdWx0VmFscy5zaXplKCkpOworCisgICAgaWYgKEktPmlzRWFybHlDbG9iYmVyKQorICAgICAgQyA9ICImIitDOworICAgICAgCisgICAgT3V0IDw8ICJcIj0iIDw8IEMgPDwgIlwiKCIgPDwgR2V0VmFsdWVOYW1lKERlc3RWYWwpOworICAgIGlmIChEZXN0VmFsTm8gIT0gLTEpCisgICAgICBPdXQgPDwgIi5maWVsZCIgPDwgRGVzdFZhbE5vOyAvLyBNdWx0aXBsZSByZXR2YWxzLgorICAgIE91dCA8PCAiKSI7CisgICAgKytWYWx1ZUNvdW50OworICB9CisgIAorICAKKyAgLy8gQ29udmVydCBvdmVyIGFsbCB0aGUgaW5wdXQgY29uc3RyYWludHMuCisgIE91dCA8PCAiXG4gICAgICAgIDoiOworICBJc0ZpcnN0ID0gdHJ1ZTsKKyAgVmFsdWVDb3VudCA9IDA7CisgIGZvciAoc3RkOjp2ZWN0b3I8SW5saW5lQXNtOjpDb25zdHJhaW50SW5mbz46Oml0ZXJhdG9yIEkgPSBDb25zdHJhaW50cy5iZWdpbigpLAorICAgICAgIEUgPSBDb25zdHJhaW50cy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+VHlwZSAhPSBJbmxpbmVBc206OmlzSW5wdXQpIHsKKyAgICAgICsrVmFsdWVDb3VudDsKKyAgICAgIGNvbnRpbnVlOyAgLy8gSWdub3JlIG5vbi1pbnB1dCBjb25zdHJhaW50cy4KKyAgICB9CisgICAgCisgICAgYXNzZXJ0KEktPkNvZGVzLnNpemUoKSA9PSAxICYmICJUb28gbWFueSBhc20gY29uc3RyYWludCBjb2RlcyB0byBoYW5kbGUiKTsKKyAgICBzdGQ6OnN0cmluZyBDID0gSW50ZXJwcmV0QVNNQ29uc3RyYWludCgqSSk7CisgICAgaWYgKEMuZW1wdHkoKSkgY29udGludWU7CisgICAgCisgICAgaWYgKCFJc0ZpcnN0KSB7CisgICAgICBPdXQgPDwgIiwgIjsKKyAgICAgIElzRmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgYXNzZXJ0KFZhbHVlQ291bnQgPj0gUmVzdWx0VmFscy5zaXplKCkgJiYgIklucHV0IGNhbid0IHJlZmVyIHRvIHJlc3VsdCIpOworICAgIFZhbHVlICpTcmNWYWwgPSBDSS5nZXRBcmdPcGVyYW5kKFZhbHVlQ291bnQtUmVzdWx0VmFscy5zaXplKCkpOworICAgIAorICAgIE91dCA8PCAiXCIiIDw8IEMgPDwgIlwiKCI7CisgICAgaWYgKCFJLT5pc0luZGlyZWN0KQorICAgICAgd3JpdGVPcGVyYW5kKFNyY1ZhbCk7CisgICAgZWxzZQorICAgICAgd3JpdGVPcGVyYW5kRGVyZWYoU3JjVmFsKTsKKyAgICBPdXQgPDwgIikiOworICB9CisgIAorICAvLyBDb252ZXJ0IG92ZXIgdGhlIGNsb2JiZXIgY29uc3RyYWludHMuCisgIElzRmlyc3QgPSB0cnVlOworICBmb3IgKHN0ZDo6dmVjdG9yPElubGluZUFzbTo6Q29uc3RyYWludEluZm8+OjppdGVyYXRvciBJID0gQ29uc3RyYWludHMuYmVnaW4oKSwKKyAgICAgICBFID0gQ29uc3RyYWludHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPlR5cGUgIT0gSW5saW5lQXNtOjppc0Nsb2JiZXIpCisgICAgICBjb250aW51ZTsgIC8vIElnbm9yZSBub24taW5wdXQgY29uc3RyYWludHMuCisKKyAgICBhc3NlcnQoSS0+Q29kZXMuc2l6ZSgpID09IDEgJiYgIlRvbyBtYW55IGFzbSBjb25zdHJhaW50IGNvZGVzIHRvIGhhbmRsZSIpOworICAgIHN0ZDo6c3RyaW5nIEMgPSBJbnRlcnByZXRBU01Db25zdHJhaW50KCpJKTsKKyAgICBpZiAoQy5lbXB0eSgpKSBjb250aW51ZTsKKyAgICAKKyAgICBpZiAoIUlzRmlyc3QpIHsKKyAgICAgIE91dCA8PCAiLCAiOworICAgICAgSXNGaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBPdXQgPDwgJ1wiJyA8PCBDIDw8ICciJzsKKyAgfQorICAKKyAgT3V0IDw8ICIpIjsKK30KKwordm9pZCBDV3JpdGVyOjp2aXNpdEFsbG9jYUluc3QoQWxsb2NhSW5zdCAmSSkgeworICBPdXQgPDwgJygnOworICBwcmludFR5cGUoT3V0LCBJLmdldFR5cGUoKSk7CisgIE91dCA8PCAiKSBhbGxvY2Eoc2l6ZW9mKCI7CisgIHByaW50VHlwZShPdXQsIEkuZ2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgT3V0IDw8ICcpJzsKKyAgaWYgKEkuaXNBcnJheUFsbG9jYXRpb24oKSkgeworICAgIE91dCA8PCAiICogIiA7CisgICAgd3JpdGVPcGVyYW5kKEkuZ2V0T3BlcmFuZCgwKSk7CisgIH0KKyAgT3V0IDw8ICcpJzsKK30KKwordm9pZCBDV3JpdGVyOjpwcmludEdFUEV4cHJlc3Npb24oVmFsdWUgKlB0ciwgZ2VwX3R5cGVfaXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlcF90eXBlX2l0ZXJhdG9yIEUsIGJvb2wgU3RhdGljKSB7CisgIAorICAvLyBJZiB0aGVyZSBhcmUgbm8gaW5kaWNlcywganVzdCBwcmludCBvdXQgdGhlIHBvaW50ZXIuCisgIGlmIChJID09IEUpIHsKKyAgICB3cml0ZU9wZXJhbmQoUHRyKTsKKyAgICByZXR1cm47CisgIH0KKyAgICAKKyAgLy8gRmluZCBvdXQgaWYgdGhlIGxhc3QgaW5kZXggaXMgaW50byBhIHZlY3Rvci4gIElmIHNvLCB3ZSBoYXZlIHRvIHByaW50IHRoaXMKKyAgLy8gc3BlY2lhbGx5LiAgU2luY2UgdmVjdG9ycyBjYW4ndCBoYXZlIGVsZW1lbnRzIG9mIGluZGV4YWJsZSB0eXBlLCBvbmx5IHRoZQorICAvLyBsYXN0IGluZGV4IGNvdWxkIHBvc3NpYmx5IGJlIG9mIGEgdmVjdG9yIGVsZW1lbnQuCisgIGNvbnN0IFZlY3RvclR5cGUgKkxhc3RJbmRleElzVmVjdG9yID0gMDsKKyAgeworICAgIGZvciAoZ2VwX3R5cGVfaXRlcmF0b3IgVG1wSSA9IEk7IFRtcEkgIT0gRTsgKytUbXBJKQorICAgICAgTGFzdEluZGV4SXNWZWN0b3IgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPigqVG1wSSk7CisgIH0KKyAgCisgIE91dCA8PCAiKCI7CisgIAorICAvLyBJZiB0aGUgbGFzdCBpbmRleCBpcyBpbnRvIGEgdmVjdG9yLCB3ZSBjYW4ndCBwcmludCBpdCBhcyAmYVtpXVtqXSBiZWNhdXNlCisgIC8vIHdlIGNhbid0IGluZGV4IGludG8gYSB2ZWN0b3Igd2l0aCBqIGluIEdDQy4gIEluc3RlYWQsIGVtaXQgdGhpcyBhcworICAvLyAoKChmbG9hdCopJmFbaV0pK2opCisgIGlmIChMYXN0SW5kZXhJc1ZlY3RvcikgeworICAgIE91dCA8PCAiKCgiOworICAgIHByaW50VHlwZShPdXQsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoTGFzdEluZGV4SXNWZWN0b3ItPmdldEVsZW1lbnRUeXBlKCkpKTsKKyAgICBPdXQgPDwgIikoIjsKKyAgfQorICAKKyAgT3V0IDw8ICcmJzsKKworICAvLyBJZiB0aGUgZmlyc3QgaW5kZXggaXMgMCAodmVyeSB0eXBpY2FsKSB3ZSBjYW4gZG8gYSBudW1iZXIgb2YKKyAgLy8gc2ltcGxpZmljYXRpb25zIHRvIGNsZWFuIHVwIHRoZSBjb2RlLgorICBWYWx1ZSAqRmlyc3RPcCA9IEkuZ2V0T3BlcmFuZCgpOworICBpZiAoIWlzYTxDb25zdGFudD4oRmlyc3RPcCkgfHwgIWNhc3Q8Q29uc3RhbnQ+KEZpcnN0T3ApLT5pc051bGxWYWx1ZSgpKSB7CisgICAgLy8gRmlyc3QgaW5kZXggaXNuJ3Qgc2ltcGxlLCBwcmludCBpdCB0aGUgaGFyZCB3YXkuCisgICAgd3JpdGVPcGVyYW5kKFB0cik7CisgIH0gZWxzZSB7CisgICAgKytJOyAgLy8gU2tpcCB0aGUgemVybyBpbmRleC4KKworICAgIC8vIE9rYXksIGVtaXQgdGhlIGZpcnN0IG9wZXJhbmQuIElmIFB0ciBpcyBzb21ldGhpbmcgdGhhdCBpcyBhbHJlYWR5IGFkZHJlc3MKKyAgICAvLyBleHBvc2VkLCBsaWtlIGEgZ2xvYmFsLCBhdm9pZCBlbWl0dGluZyAoJmZvbylbMF0sIGp1c3QgZW1pdCBmb28gaW5zdGVhZC4KKyAgICBpZiAoaXNBZGRyZXNzRXhwb3NlZChQdHIpKSB7CisgICAgICB3cml0ZU9wZXJhbmRJbnRlcm5hbChQdHIsIFN0YXRpYyk7CisgICAgfSBlbHNlIGlmIChJICE9IEUgJiYgKCpJKS0+aXNTdHJ1Y3RUeSgpKSB7CisgICAgICAvLyBJZiB3ZSBkaWRuJ3QgYWxyZWFkeSBlbWl0IHRoZSBmaXJzdCBvcGVyYW5kLCBzZWUgaWYgd2UgY2FuIHByaW50IGl0IGFzCisgICAgICAvLyBQLT5mIGluc3RlYWQgb2YgIlBbMF0uZiIKKyAgICAgIHdyaXRlT3BlcmFuZChQdHIpOworICAgICAgT3V0IDw8ICItPmZpZWxkIiA8PCBjYXN0PENvbnN0YW50SW50PihJLmdldE9wZXJhbmQoKSktPmdldFpFeHRWYWx1ZSgpOworICAgICAgKytJOyAgLy8gZWF0IHRoZSBzdHJ1Y3QgaW5kZXggYXMgd2VsbC4KKyAgICB9IGVsc2UgeworICAgICAgLy8gSW5zdGVhZCBvZiBlbWl0dGluZyBQWzBdWzFdLCBlbWl0ICgqUClbMV0sIHdoaWNoIGlzIG1vcmUgaWRpb21hdGljLgorICAgICAgT3V0IDw8ICIoKiI7CisgICAgICB3cml0ZU9wZXJhbmQoUHRyKTsKKyAgICAgIE91dCA8PCAiKSI7CisgICAgfQorICB9CisKKyAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKCgqSSktPmlzU3RydWN0VHkoKSkgeworICAgICAgT3V0IDw8ICIuZmllbGQiIDw8IGNhc3Q8Q29uc3RhbnRJbnQ+KEkuZ2V0T3BlcmFuZCgpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgfSBlbHNlIGlmICgoKkkpLT5pc0FycmF5VHkoKSkgeworICAgICAgT3V0IDw8ICIuYXJyYXlbIjsKKyAgICAgIHdyaXRlT3BlcmFuZFdpdGhDYXN0KEkuZ2V0T3BlcmFuZCgpLCBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cik7CisgICAgICBPdXQgPDwgJ10nOworICAgIH0gZWxzZSBpZiAoISgqSSktPmlzVmVjdG9yVHkoKSkgeworICAgICAgT3V0IDw8ICdbJzsKKyAgICAgIHdyaXRlT3BlcmFuZFdpdGhDYXN0KEkuZ2V0T3BlcmFuZCgpLCBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cik7CisgICAgICBPdXQgPDwgJ10nOworICAgIH0gZWxzZSB7CisgICAgICAvLyBJZiB0aGUgbGFzdCBpbmRleCBpcyBpbnRvIGEgdmVjdG9yLCB0aGVuIHByaW50IGl0IG91dCBhcyAiK2opIi4gIFRoaXMKKyAgICAgIC8vIHdvcmtzIHdpdGggdGhlICdMYXN0SW5kZXhJc1ZlY3RvcicgY29kZSBhYm92ZS4KKyAgICAgIGlmIChpc2E8Q29uc3RhbnQ+KEkuZ2V0T3BlcmFuZCgpKSAmJgorICAgICAgICAgIGNhc3Q8Q29uc3RhbnQ+KEkuZ2V0T3BlcmFuZCgpKS0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICBPdXQgPDwgIikpIjsgIC8vIGF2b2lkICIrMCIuCisgICAgICB9IGVsc2UgeworICAgICAgICBPdXQgPDwgIikrKCI7CisgICAgICAgIHdyaXRlT3BlcmFuZFdpdGhDYXN0KEkuZ2V0T3BlcmFuZCgpLCBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cik7CisgICAgICAgIE91dCA8PCAiKSkiOworICAgICAgfQorICAgIH0KKyAgfQorICBPdXQgPDwgIikiOworfQorCit2b2lkIENXcml0ZXI6OndyaXRlTWVtb3J5QWNjZXNzKFZhbHVlICpPcGVyYW5kLCBjb25zdCBUeXBlICpPcGVyYW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1ZvbGF0aWxlLCB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKworICBib29sIElzVW5hbGlnbmVkID0gQWxpZ25tZW50ICYmCisgICAgQWxpZ25tZW50IDwgVEQtPmdldEFCSVR5cGVBbGlnbm1lbnQoT3BlcmFuZFR5cGUpOworCisgIGlmICghSXNVbmFsaWduZWQpCisgICAgT3V0IDw8ICcqJzsKKyAgaWYgKElzVm9sYXRpbGUgfHwgSXNVbmFsaWduZWQpIHsKKyAgICBPdXQgPDwgIigoIjsKKyAgICBpZiAoSXNVbmFsaWduZWQpCisgICAgICBPdXQgPDwgInN0cnVjdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKCIgPDwgQWxpZ25tZW50IDw8ICIpKSkgeyI7CisgICAgcHJpbnRUeXBlKE91dCwgT3BlcmFuZFR5cGUsIGZhbHNlLCBJc1VuYWxpZ25lZCA/ICJkYXRhIiA6ICJ2b2xhdGlsZSoiKTsKKyAgICBpZiAoSXNVbmFsaWduZWQpIHsKKyAgICAgIE91dCA8PCAiOyB9ICI7CisgICAgICBpZiAoSXNWb2xhdGlsZSkgT3V0IDw8ICJ2b2xhdGlsZSAiOworICAgICAgT3V0IDw8ICIqIjsKKyAgICB9CisgICAgT3V0IDw8ICIpIjsKKyAgfQorCisgIHdyaXRlT3BlcmFuZChPcGVyYW5kKTsKKworICBpZiAoSXNWb2xhdGlsZSB8fCBJc1VuYWxpZ25lZCkgeworICAgIE91dCA8PCAnKSc7CisgICAgaWYgKElzVW5hbGlnbmVkKQorICAgICAgT3V0IDw8ICItPmRhdGEiOworICB9Cit9CisKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRMb2FkSW5zdChMb2FkSW5zdCAmSSkgeworICB3cml0ZU1lbW9yeUFjY2VzcyhJLmdldE9wZXJhbmQoMCksIEkuZ2V0VHlwZSgpLCBJLmlzVm9sYXRpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgSS5nZXRBbGlnbm1lbnQoKSk7CisKK30KKwordm9pZCBDV3JpdGVyOjp2aXNpdFN0b3JlSW5zdChTdG9yZUluc3QgJkkpIHsKKyAgd3JpdGVNZW1vcnlBY2Nlc3MoSS5nZXRQb2ludGVyT3BlcmFuZCgpLCBJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgSS5pc1ZvbGF0aWxlKCksIEkuZ2V0QWxpZ25tZW50KCkpOworICBPdXQgPDwgIiA9ICI7CisgIFZhbHVlICpPcGVyYW5kID0gSS5nZXRPcGVyYW5kKDApOworICBDb25zdGFudCAqQml0TWFzayA9IDA7CisgIGlmIChjb25zdCBJbnRlZ2VyVHlwZSogSVR5ID0gZHluX2Nhc3Q8SW50ZWdlclR5cGU+KE9wZXJhbmQtPmdldFR5cGUoKSkpCisgICAgaWYgKCFJVHktPmlzUG93ZXJPZjJCeXRlV2lkdGgoKSkKKyAgICAgIC8vIFdlIGhhdmUgYSBiaXQgd2lkdGggdGhhdCBkb2Vzbid0IG1hdGNoIGFuIGV2ZW4gcG93ZXItb2YtMiBieXRlCisgICAgICAvLyBzaXplLiBDb25zZXF1ZW50bHkgd2UgbXVzdCAmIHRoZSB2YWx1ZSB3aXRoIHRoZSB0eXBlJ3MgYml0IG1hc2sKKyAgICAgIEJpdE1hc2sgPSBDb25zdGFudEludDo6Z2V0KElUeSwgSVR5LT5nZXRCaXRNYXNrKCkpOworICBpZiAoQml0TWFzaykKKyAgICBPdXQgPDwgIigoIjsKKyAgd3JpdGVPcGVyYW5kKE9wZXJhbmQpOworICBpZiAoQml0TWFzaykgeworICAgIE91dCA8PCAiKSAmICI7CisgICAgcHJpbnRDb25zdGFudChCaXRNYXNrLCBmYWxzZSk7CisgICAgT3V0IDw8ICIpIjsgCisgIH0KK30KKwordm9pZCBDV3JpdGVyOjp2aXNpdEdldEVsZW1lbnRQdHJJbnN0KEdldEVsZW1lbnRQdHJJbnN0ICZJKSB7CisgIHByaW50R0VQRXhwcmVzc2lvbihJLmdldFBvaW50ZXJPcGVyYW5kKCksIGdlcF90eXBlX2JlZ2luKEkpLAorICAgICAgICAgICAgICAgICAgICAgZ2VwX3R5cGVfZW5kKEkpLCBmYWxzZSk7Cit9CisKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRWQUFyZ0luc3QoVkFBcmdJbnN0ICZJKSB7CisgIE91dCA8PCAidmFfYXJnKCoodmFfbGlzdCopIjsKKyAgd3JpdGVPcGVyYW5kKEkuZ2V0T3BlcmFuZCgwKSk7CisgIE91dCA8PCAiLCAiOworICBwcmludFR5cGUoT3V0LCBJLmdldFR5cGUoKSk7CisgIE91dCA8PCAiKTtcbiAiOworfQorCit2b2lkIENXcml0ZXI6OnZpc2l0SW5zZXJ0RWxlbWVudEluc3QoSW5zZXJ0RWxlbWVudEluc3QgJkkpIHsKKyAgY29uc3QgVHlwZSAqRWx0VHkgPSBJLmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgd3JpdGVPcGVyYW5kKEkuZ2V0T3BlcmFuZCgwKSk7CisgIE91dCA8PCAiO1xuICAiOworICBPdXQgPDwgIigoIjsKKyAgcHJpbnRUeXBlKE91dCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChFbHRUeSkpOworICBPdXQgPDwgIikoJiIgPDwgR2V0VmFsdWVOYW1lKCZJKSA8PCAiKSlbIjsKKyAgd3JpdGVPcGVyYW5kKEkuZ2V0T3BlcmFuZCgyKSk7CisgIE91dCA8PCAiXSA9ICgiOworICB3cml0ZU9wZXJhbmQoSS5nZXRPcGVyYW5kKDEpKTsKKyAgT3V0IDw8ICIpIjsKK30KKwordm9pZCBDV3JpdGVyOjp2aXNpdEV4dHJhY3RFbGVtZW50SW5zdChFeHRyYWN0RWxlbWVudEluc3QgJkkpIHsKKyAgLy8gV2Uga25vdyB0aGF0IG91ciBvcGVyYW5kIGlzIG5vdCBpbmxpbmVkLgorICBPdXQgPDwgIigoIjsKKyAgY29uc3QgVHlwZSAqRWx0VHkgPSAKKyAgICBjYXN0PFZlY3RvclR5cGU+KEkuZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgcHJpbnRUeXBlKE91dCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChFbHRUeSkpOworICBPdXQgPDwgIikoJiIgPDwgR2V0VmFsdWVOYW1lKEkuZ2V0T3BlcmFuZCgwKSkgPDwgIikpWyI7CisgIHdyaXRlT3BlcmFuZChJLmdldE9wZXJhbmQoMSkpOworICBPdXQgPDwgIl0iOworfQorCit2b2lkIENXcml0ZXI6OnZpc2l0U2h1ZmZsZVZlY3Rvckluc3QoU2h1ZmZsZVZlY3Rvckluc3QgJlNWSSkgeworICBPdXQgPDwgIigiOworICBwcmludFR5cGUoT3V0LCBTVkkuZ2V0VHlwZSgpKTsKKyAgT3V0IDw8ICIpeyAiOworICBjb25zdCBWZWN0b3JUeXBlICpWVCA9IFNWSS5nZXRUeXBlKCk7CisgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgY29uc3QgVHlwZSAqRWx0VHkgPSBWVC0+Z2V0RWxlbWVudFR5cGUoKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUVsdHM7ICsraSkgeworICAgIGlmIChpKSBPdXQgPDwgIiwgIjsKKyAgICBpbnQgU3JjVmFsID0gU1ZJLmdldE1hc2tWYWx1ZShpKTsKKyAgICBpZiAoKHVuc2lnbmVkKVNyY1ZhbCA+PSBOdW1FbHRzKjIpIHsKKyAgICAgIE91dCA8PCAiIDAvKnVuZGVmKi8gIjsKKyAgICB9IGVsc2UgeworICAgICAgVmFsdWUgKk9wID0gU1ZJLmdldE9wZXJhbmQoKHVuc2lnbmVkKVNyY1ZhbCA+PSBOdW1FbHRzKTsKKyAgICAgIGlmIChpc2E8SW5zdHJ1Y3Rpb24+KE9wKSkgeworICAgICAgICAvLyBEbyBhbiBleHRyYWN0ZWxlbWVudCBvZiB0aGlzIHZhbHVlIGZyb20gdGhlIGFwcHJvcHJpYXRlIGlucHV0LgorICAgICAgICBPdXQgPDwgIigoIjsKKyAgICAgICAgcHJpbnRUeXBlKE91dCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChFbHRUeSkpOworICAgICAgICBPdXQgPDwgIikoJiIgPDwgR2V0VmFsdWVOYW1lKE9wKQorICAgICAgICAgICAgPDwgIikpWyIgPDwgKFNyY1ZhbCAmIChOdW1FbHRzLTEpKSA8PCAiXSI7CisgICAgICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KE9wKSB8fCBpc2E8VW5kZWZWYWx1ZT4oT3ApKSB7CisgICAgICAgIE91dCA8PCAiMCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludENvbnN0YW50KGNhc3Q8Q29uc3RhbnRWZWN0b3I+KE9wKS0+Z2V0T3BlcmFuZChTcmNWYWwgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTnVtRWx0cy0xKSksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgfQorICAgIH0KKyAgfQorICBPdXQgPDwgIn0iOworfQorCit2b2lkIENXcml0ZXI6OnZpc2l0SW5zZXJ0VmFsdWVJbnN0KEluc2VydFZhbHVlSW5zdCAmSVZJKSB7CisgIC8vIFN0YXJ0IGJ5IGNvcHlpbmcgdGhlIGVudGlyZSBhZ2dyZWdhdGUgdmFsdWUgaW50byB0aGUgcmVzdWx0IHZhcmlhYmxlLgorICB3cml0ZU9wZXJhbmQoSVZJLmdldE9wZXJhbmQoMCkpOworICBPdXQgPDwgIjtcbiAgIjsKKworICAvLyBUaGVuIGRvIHRoZSBpbnNlcnQgdG8gdXBkYXRlIHRoZSBmaWVsZC4KKyAgT3V0IDw8IEdldFZhbHVlTmFtZSgmSVZJKTsKKyAgZm9yIChjb25zdCB1bnNpZ25lZCAqYiA9IElWSS5pZHhfYmVnaW4oKSwgKmkgPSBiLCAqZSA9IElWSS5pZHhfZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBUeXBlICpJbmRleGVkVHkgPQorICAgICAgRXh0cmFjdFZhbHVlSW5zdDo6Z2V0SW5kZXhlZFR5cGUoSVZJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSwgYiwgaSsxKTsKKyAgICBpZiAoSW5kZXhlZFR5LT5pc0FycmF5VHkoKSkKKyAgICAgIE91dCA8PCAiLmFycmF5WyIgPDwgKmkgPDwgIl0iOworICAgIGVsc2UKKyAgICAgIE91dCA8PCAiLmZpZWxkIiA8PCAqaTsKKyAgfQorICBPdXQgPDwgIiA9ICI7CisgIHdyaXRlT3BlcmFuZChJVkkuZ2V0T3BlcmFuZCgxKSk7Cit9CisKK3ZvaWQgQ1dyaXRlcjo6dmlzaXRFeHRyYWN0VmFsdWVJbnN0KEV4dHJhY3RWYWx1ZUluc3QgJkVWSSkgeworICBPdXQgPDwgIigiOworICBpZiAoaXNhPFVuZGVmVmFsdWU+KEVWSS5nZXRPcGVyYW5kKDApKSkgeworICAgIE91dCA8PCAiKCI7CisgICAgcHJpbnRUeXBlKE91dCwgRVZJLmdldFR5cGUoKSk7CisgICAgT3V0IDw8ICIpIDAvKlVOREVGKi8iOworICB9IGVsc2UgeworICAgIE91dCA8PCBHZXRWYWx1ZU5hbWUoRVZJLmdldE9wZXJhbmQoMCkpOworICAgIGZvciAoY29uc3QgdW5zaWduZWQgKmIgPSBFVkkuaWR4X2JlZ2luKCksICppID0gYiwgKmUgPSBFVkkuaWR4X2VuZCgpOworICAgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IFR5cGUgKkluZGV4ZWRUeSA9CisgICAgICAgIEV4dHJhY3RWYWx1ZUluc3Q6OmdldEluZGV4ZWRUeXBlKEVWSS5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCksIGIsIGkrMSk7CisgICAgICBpZiAoSW5kZXhlZFR5LT5pc0FycmF5VHkoKSkKKyAgICAgICAgT3V0IDw8ICIuYXJyYXlbIiA8PCAqaSA8PCAiXSI7CisgICAgICBlbHNlCisgICAgICAgIE91dCA8PCAiLmZpZWxkIiA8PCAqaTsKKyAgICB9CisgIH0KKyAgT3V0IDw8ICIpIjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBJbnRlcmZhY2UgZGVjbGFyYXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2Jvb2wgQ1RhcmdldE1hY2hpbmU6OmFkZFBhc3Nlc1RvRW1pdEZpbGUoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRmlsZVR5cGUgRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVWZXJpZnkpIHsKKyAgaWYgKEZpbGVUeXBlICE9IFRhcmdldE1hY2hpbmU6OkNHRlRfQXNzZW1ibHlGaWxlKSByZXR1cm4gdHJ1ZTsKKworICBQTS5hZGQoY3JlYXRlR0NMb3dlcmluZ1Bhc3MoKSk7CisgIFBNLmFkZChjcmVhdGVMb3dlckludm9rZVBhc3MoKSk7CisgIFBNLmFkZChjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKSk7ICAgLy8gY2xlYW4gdXAgYWZ0ZXIgbG93ZXIgaW52b2tlLgorICBQTS5hZGQobmV3IENCYWNrZW5kTmFtZUFsbFVzZWRTdHJ1Y3RzQW5kTWVyZ2VGdW5jdGlvbnMoKSk7CisgIFBNLmFkZChuZXcgQ1dyaXRlcihvKSk7CisgIFBNLmFkZChjcmVhdGVHQ0luZm9EZWxldGVyKCkpOworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NCYWNrZW5kL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9DQmFja2VuZC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTI0MzM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DQmFja2VuZC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDMgQEAKK2FkZF9sbHZtX3RhcmdldChDQmFja2VuZAorICBDQmFja2VuZC5jcHAKKyAgKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DQmFja2VuZC9DVGFyZ2V0TWFjaGluZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DQmFja2VuZC9DVGFyZ2V0TWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWQxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NCYWNrZW5kL0NUYXJnZXRNYWNoaW5lLmgKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tLSBDVGFyZ2V0TWFjaGluZS5oIC0gVGFyZ2V0TWFjaGluZSBmb3IgdGhlIEMgYmFja2VuZCAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFRhcmdldE1hY2hpbmUgdGhhdCBpcyB1c2VkIGJ5IHRoZSBDIGJhY2tlbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBDVEFSR0VUTUFDSElORV9ICisjZGVmaW5lIENUQVJHRVRNQUNISU5FX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IENUYXJnZXRNYWNoaW5lIDogcHVibGljIFRhcmdldE1hY2hpbmUgeworICBDVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKQorICAgIDogVGFyZ2V0TWFjaGluZShUKSB7fQorCisgIHZpcnR1YWwgYm9vbCBhZGRQYXNzZXNUb0VtaXRGaWxlKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRmlsZVR5cGUgRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVWZXJpZnkpOworICAKKyAgdmlydHVhbCBjb25zdCBUYXJnZXREYXRhICpnZXRUYXJnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gMDsgfQorfTsKKworZXh0ZXJuIFRhcmdldCBUaGVDQmFja2VuZFRhcmdldDsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ0JhY2tlbmQvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NCYWNrZW5kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTk0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NCYWNrZW5kL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L0NCYWNrZW5kL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUNCYWNrZW5kCitESVJTID0gVGFyZ2V0SW5mbworCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCitDb21waWxlQ29tbW9uT3B0cyArPSAtV25vLWZvcm1hdApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DQmFja2VuZC9UYXJnZXRJbmZvL0NCYWNrZW5kVGFyZ2V0SW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NCYWNrZW5kL1RhcmdldEluZm8vQ0JhY2tlbmRUYXJnZXRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U4ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DQmFja2VuZC9UYXJnZXRJbmZvL0NCYWNrZW5kVGFyZ2V0SW5mby5jcHAKQEAgLTAsMCArMSwxOSBAQAorLy89PT0tLSBDQmFja2VuZFRhcmdldEluZm8uY3BwIC0gQ0JhY2tlbmQgVGFyZ2V0IEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkNUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1RhcmdldCBsbHZtOjpUaGVDQmFja2VuZFRhcmdldDsKKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplQ0JhY2tlbmRUYXJnZXRJbmZvKCkgeyAKKyAgUmVnaXN0ZXJUYXJnZXQ8PiBYKFRoZUNCYWNrZW5kVGFyZ2V0LCAiYyIsICJDIGJhY2tlbmQiKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ0JhY2tlbmQvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ0JhY2tlbmQvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjM1ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DQmFja2VuZC9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTUNCYWNrZW5kSW5mbworICBDQmFja2VuZFRhcmdldEluZm8uY3BwCisgICkKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DQmFja2VuZC9UYXJnZXRJbmZvL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DQmFja2VuZC9UYXJnZXRJbmZvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZDVlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NCYWNrZW5kL1RhcmdldEluZm8vTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvQ0JhY2tlbmQvVGFyZ2V0SW5mby9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUNCYWNrZW5kSW5mbworCisjIEhhY2s6IHdlIG5lZWQgdG8gaW5jbHVkZSAnbWFpbicgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQRkxBR1MgPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlYmRhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNSBAQAorYWRkX2xsdm1fbGlicmFyeShMTFZNVGFyZ2V0CisgIE1hbmdsZXIuY3BwCisgIFN1YnRhcmdldEZlYXR1cmUuY3BwCisgIFRhcmdldC5jcHAKKyAgVGFyZ2V0QXNtTGV4ZXIuY3BwCisgIFRhcmdldERhdGEuY3BwCisgIFRhcmdldEVMRldyaXRlckluZm8uY3BwCisgIFRhcmdldEZyYW1lSW5mby5jcHAKKyAgVGFyZ2V0SW5zdHJJbmZvLmNwcAorICBUYXJnZXRJbnRyaW5zaWNJbmZvLmNwcAorICBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUuY3BwCisgIFRhcmdldE1hY2hpbmUuY3BwCisgIFRhcmdldFJlZ2lzdGVySW5mby5jcHAKKyAgVGFyZ2V0U3VidGFyZ2V0LmNwcAorICApCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9Bc21QcmludGVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMmI1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLgorICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4KKyAgKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1DZWxsU1BVQXNtUHJpbnRlcgorICBTUFVBc21QcmludGVyLmNwcAorICApCithZGRfZGVwZW5kZW5jaWVzKExMVk1DZWxsU1BVQXNtUHJpbnRlciBDZWxsU1BVQ29kZUdlblRhYmxlX2dlbikKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9Bc21QcmludGVyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL0FzbVByaW50ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjOWQwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9Bc21QcmludGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L0NlbGxTUFUvQXNtUHJpbnRlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUNlbGxTUFVBc21QcmludGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBDZWxsU1BVIHRhcmdldCBkaXJlY3RvcnkgdG8gZ3JhYgorIyBwcml2YXRlIGhlYWRlcnMKK0NQUC5GbGFncyArPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL0FzbVByaW50ZXIvU1BVQXNtUHJpbnRlci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvQXNtUHJpbnRlci9TUFVBc21QcmludGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTk1NTMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL0FzbVByaW50ZXIvU1BVQXNtUHJpbnRlci5jcHAKQEAgLTAsMCArMSwzNjQgQEAKKy8vPT09LS0gU1BVQXNtUHJpbnRlci5jcHAgLSBQcmludCBtYWNoaW5lIGluc3RycyB0byBDZWxsIFNQVSBhc3NlbWJseSAtLS0tLS0tPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgcHJpbnRlciB0aGF0IGNvbnZlcnRzIGZyb20gb3VyIGludGVybmFsIHJlcHJlc2VudGF0aW9uCisvLyBvZiBtYWNoaW5lLWRlcGVuZGVudCBMTFZNIGNvZGUgdG8gQ2VsbCBTUFUgYXNzZW1ibHkgbGFuZ3VhZ2UuIFRoaXMgcHJpbnRlcgorLy8gaXMgdGhlIG91dHB1dCBtZWNoYW5pc20gdXNlZCBieSBgbGxjJy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFzbXByaW50ZXIiCisjaW5jbHVkZSAiU1BVLmgiCisjaW5jbHVkZSAiU1BVVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Bc21QcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBjbGFzcyBTUFVBc21QcmludGVyIDogcHVibGljIEFzbVByaW50ZXIgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgU1BVQXNtUHJpbnRlcihUYXJnZXRNYWNoaW5lICZUTSwgTUNTdHJlYW1lciAmU3RyZWFtZXIpIDoKKyAgICAgIEFzbVByaW50ZXIoVE0sIFN0cmVhbWVyKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiU1RJIENCRUEgU1BVIEFzc2VtYmx5IFByaW50ZXIiOworICAgIH0KKworICAgIFNQVVRhcmdldE1hY2hpbmUgJmdldFRNKCkgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNQVVRhcmdldE1hY2hpbmUmPihUTSk7CisgICAgfQorCisgICAgLy8vIHByaW50SW5zdHJ1Y3Rpb24gLSBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0YWJsZWdlbgorICAgIC8vLyBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzZXQgZGVzY3JpcHRpb24uCisgICAgdm9pZCBwcmludEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHJhd19vc3RyZWFtICZPUyk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFJlZ2lzdGVyTmFtZSh1bnNpZ25lZCBSZWdObyk7CisKKworICAgIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgICAgIFNtYWxsU3RyaW5nPDEyOD4gU3RyOworICAgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhTdHIpOworICAgICAgcHJpbnRJbnN0cnVjdGlvbihNSSwgT1MpOworICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoT1Muc3RyKCkpOworICAgIH0KKyAgICB2b2lkIHByaW50T3AoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLCByYXdfb3N0cmVhbSAmT1MpOworCisgICAgLy8vIHByaW50UmVnaXN0ZXIgLSBQcmludCByZWdpc3RlciBhY2NvcmRpbmcgdG8gdGFyZ2V0IHJlcXVpcmVtZW50cy4KKyAgICAvLy8KKyAgICB2b2lkIHByaW50UmVnaXN0ZXIoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLCBib29sIFIwQXNaZXJvLCByYXdfb3N0cmVhbSAmTyl7CisgICAgICB1bnNpZ25lZCBSZWdObyA9IE1PLmdldFJlZygpOworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFJlZ05vKSAmJgorICAgICAgICAgICAgICJOb3QgcGh5c3JlZz8/Iik7CisgICAgICBPIDw8IGdldFJlZ2lzdGVyTmFtZShSZWdObyk7CisgICAgfQorCisgICAgdm9pZCBwcmludE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKE9wTm8pOworICAgICAgaWYgKE1PLmlzUmVnKCkpIHsKKyAgICAgICAgTyA8PCBnZXRSZWdpc3Rlck5hbWUoTU8uZ2V0UmVnKCkpOworICAgICAgfSBlbHNlIGlmIChNTy5pc0ltbSgpKSB7CisgICAgICAgIE8gPDwgTU8uZ2V0SW1tKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludE9wKE1PLCBPKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBib29sIFByaW50QXNtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgYm9vbCBQcmludEFzbU1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworCisKKyAgICB2b2lkCisgICAgcHJpbnRTN0ltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pCisgICAgeworICAgICAgaW50IHZhbHVlID0gTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCk7CisgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCAoMzIgLSA3KSkgPj4gKDMyIC0gNyk7CisKKyAgICAgIGFzc2VydCgodmFsdWUgPj0gLSgxIDw8IDgpICYmIHZhbHVlIDw9ICgxIDw8IDcpIC0gMSkKKyAgICAgICAgICAgICAmJiAiSW52YWxpZCBzNyBhcmd1bWVudCIpOworICAgICAgTyA8PCB2YWx1ZTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcHJpbnRVN0ltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCk7CisgICAgICBhc3NlcnQodmFsdWUgPCAoMSA8PCA4KSAmJiAiSW52YWxpZCB1NyBhcmd1bWVudCIpOworICAgICAgTyA8PCB2YWx1ZTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcHJpbnRTaHVmQWRkcihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykKKyAgICB7CisgICAgICBjaGFyIHZhbHVlID0gTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCk7CisgICAgICBPIDw8IChpbnQpIHZhbHVlOworICAgICAgTyA8PCAiKCI7CisgICAgICBwcmludE9wZXJhbmQoTUksIE9wTm8rMSwgTyk7CisgICAgICBPIDw8ICIpIjsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcHJpbnRTMTZJbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKQorICAgIHsKKyAgICAgIE8gPDwgKHNob3J0KSBNSS0+Z2V0T3BlcmFuZChPcE5vKS5nZXRJbW0oKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcHJpbnRVMTZJbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKQorICAgIHsKKyAgICAgIE8gPDwgKHVuc2lnbmVkIHNob3J0KU1JLT5nZXRPcGVyYW5kKE9wTm8pLmdldEltbSgpOworICAgIH0KKworICAgIHZvaWQKKyAgICBwcmludFUzMkltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pCisgICAgeworICAgICAgTyA8PCAodW5zaWduZWQpTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCk7CisgICAgfQorCisgICAgdm9pZAorICAgIHByaW50TWVtUmVnUmVnKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgICAvLyBXaGVuIHVzZWQgYXMgdGhlIGJhc2UgcmVnaXN0ZXIsIHIwIHJlYWRzIGNvbnN0YW50IHplcm8gcmF0aGVyIHRoYW4KKyAgICAgIC8vIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlZ2lzdGVyLiAgRm9yIHRoaXMgcmVhc29uLCB0aGUgZGFyd2luCisgICAgICAvLyBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCB3ZSBwcmludCByMCBhcyAwIChubyByKSB3aGVuIHVzZWQgYXMgdGhlIGJhc2UuCisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChPcE5vKTsKKyAgICAgIE8gPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PLmdldFJlZygpKSA8PCAiLCAiOworICAgICAgcHJpbnRPcGVyYW5kKE1JLCBPcE5vKzEsIE8pOworICAgIH0KKworICAgIHZvaWQKKyAgICBwcmludFUxOEltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCk7CisgICAgICBhc3NlcnQodmFsdWUgPD0gKDEgPDwgMTkpIC0gMSAmJiAiSW52YWxpZCB1MTggYXJndW1lbnQiKTsKKyAgICAgIE8gPDwgdmFsdWU7CisgICAgfQorCisgICAgdm9pZAorICAgIHByaW50UzEwSW1tT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykKKyAgICB7CisgICAgICBzaG9ydCB2YWx1ZSA9IChzaG9ydCkgKCgoaW50KSBNSS0+Z2V0T3BlcmFuZChPcE5vKS5nZXRJbW0oKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gMTYpOworICAgICAgYXNzZXJ0KCh2YWx1ZSA+PSAtKDEgPDwgOSkgJiYgdmFsdWUgPD0gKDEgPDwgOSkgLSAxKQorICAgICAgICAgICAgICYmICJJbnZhbGlkIHMxMCBhcmd1bWVudCIpOworICAgICAgTyA8PCB2YWx1ZTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcHJpbnRVMTBJbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKQorICAgIHsKKyAgICAgIHNob3J0IHZhbHVlID0gKHNob3J0KSAoKChpbnQpIE1JLT5nZXRPcGVyYW5kKE9wTm8pLmdldEltbSgpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAxNik7CisgICAgICBhc3NlcnQoKHZhbHVlIDw9ICgxIDw8IDEwKSAtIDEpICYmICJJbnZhbGlkIHUxMCBhcmd1bWVudCIpOworICAgICAgTyA8PCB2YWx1ZTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcHJpbnRERm9ybUFkZHIoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pCisgICAgeworICAgICAgYXNzZXJ0KE1JLT5nZXRPcGVyYW5kKE9wTm8pLmlzSW1tKCkgJiYKKyAgICAgICAgICAgICAicHJpbnRERm9ybUFkZHIgZmlyc3Qgb3BlcmFuZCBpcyBub3QgaW1tZWRpYXRlIik7CisgICAgICBpbnQ2NF90IHZhbHVlID0gaW50NjRfdChNSS0+Z2V0T3BlcmFuZChPcE5vKS5nZXRJbW0oKSk7CisgICAgICBpbnQxNl90IHZhbHVlMTYgPSBpbnQxNl90KHZhbHVlKTsKKyAgICAgIGFzc2VydCgodmFsdWUxNiA+PSAtKDEgPDwgKDkrNCkpICYmIHZhbHVlMTYgPD0gKDEgPDwgKDkrNCkpIC0gMSkKKyAgICAgICAgICAgICAmJiAiSW52YWxpZCBkZm9ybSBzMTAgb2Zmc2V0IGFyZ3VtZW50Iik7CisgICAgICBPIDw8ICh2YWx1ZTE2ICYgfjB4ZikgPDwgIigiOworICAgICAgcHJpbnRPcGVyYW5kKE1JLCBPcE5vKzEsIE8pOworICAgICAgTyA8PCAiKSI7CisgICAgfQorCisgICAgdm9pZAorICAgIHByaW50QWRkcjI1NksoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pCisgICAgeworICAgICAgLyogTm90ZTogb3BlcmFuZCAxIGlzIGFuIG9mZnNldCBvciBzeW1ib2wgbmFtZS4gKi8KKyAgICAgIGlmIChNSS0+Z2V0T3BlcmFuZChPcE5vKS5pc0ltbSgpKSB7CisgICAgICAgIHByaW50UzE2SW1tT3BlcmFuZChNSSwgT3BObywgTyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludE9wKE1JLT5nZXRPcGVyYW5kKE9wTm8pLCBPKTsKKyAgICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKE9wTm8rMSkuaXNJbW0oKSkgeworICAgICAgICAgIGludCBkaXNwbCA9IGludChNSS0+Z2V0T3BlcmFuZChPcE5vKzEpLmdldEltbSgpKTsKKyAgICAgICAgICBpZiAoZGlzcGwgPiAwKQorICAgICAgICAgICAgTyA8PCAiKyIgPDwgZGlzcGw7CisgICAgICAgICAgZWxzZSBpZiAoZGlzcGwgPCAwKQorICAgICAgICAgICAgTyA8PCBkaXNwbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcHJpbnRDYWxsT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgICAgcHJpbnRPcChNSS0+Z2V0T3BlcmFuZChPcE5vKSwgTyk7CisgICAgfQorCisgICAgdm9pZCBwcmludFBDUmVsYXRpdmVPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgICAvLyBVc2VkIHRvIGdlbmVyYXRlIGEgIi4tPHRhcmdldD4iLCBidXQgaXQgdHVybnMgb3V0IHRoYXQgdGhlIGFzc2VtYmxlcgorICAgICAgLy8gcmVhbGx5IHdhbnRzIHRoZSB0YXJnZXQuCisgICAgICAvLworICAgICAgLy8gTi5CLjogVGhpcyBvcGVyYW5kIGlzIHVzZWQgZm9yIGNhbGwgdGFyZ2V0cy4gQnJhbmNoIGhpbnRzIGFyZSBhbm90aGVyCisgICAgICAvLyBhbmltYWwgZW50aXJlbHkuCisgICAgICBwcmludE9wKE1JLT5nZXRPcGVyYW5kKE9wTm8pLCBPKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50SEJST3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgICAgLy8gSEJSIG9wZXJhbmRzIGFyZSBnZW5lcmF0ZWQgaW4gZnJvbnQgb2YgYnJhbmNoZXMsIGhlbmNlLCB0aGUKKyAgICAgIC8vIHByb2dyYW0gY291bnRlciBwbHVzIHRoZSB0YXJnZXQuCisgICAgICBPIDw8ICIuKyI7CisgICAgICBwcmludE9wKE1JLT5nZXRPcGVyYW5kKE9wTm8pLCBPKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50U3ltYm9sSGkoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIGlmIChNSS0+Z2V0T3BlcmFuZChPcE5vKS5pc0ltbSgpKSB7CisgICAgICAgIHByaW50UzE2SW1tT3BlcmFuZChNSSwgT3BObywgTyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludE9wKE1JLT5nZXRPcGVyYW5kKE9wTm8pLCBPKTsKKyAgICAgICAgTyA8PCAiQGgiOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcHJpbnRTeW1ib2xMbyhjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKE9wTm8pLmlzSW1tKCkpIHsKKyAgICAgICAgcHJpbnRTMTZJbW1PcGVyYW5kKE1JLCBPcE5vLCBPKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50T3AoTUktPmdldE9wZXJhbmQoT3BObyksIE8pOworICAgICAgICBPIDw8ICJAbCI7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIFByaW50IGxvY2FsIHN0b3JlIGFkZHJlc3MKKyAgICB2b2lkIHByaW50U3ltYm9sTFNBKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgICBwcmludE9wKE1JLT5nZXRPcGVyYW5kKE9wTm8pLCBPKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50Uk9USE5lZzdJbW0oY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIGlmIChNSS0+Z2V0T3BlcmFuZChPcE5vKS5pc0ltbSgpKSB7CisgICAgICAgIGludCB2YWx1ZSA9IChpbnQpIE1JLT5nZXRPcGVyYW5kKE9wTm8pLmdldEltbSgpOworICAgICAgICBhc3NlcnQoKHZhbHVlID49IDAgJiYgdmFsdWUgPCAxNikKKyAgICAgICAgICAgICAgICYmICJJbnZhbGlkIG5lZ2F0ZWQgaW1tZWRpYXRlIHJvdGF0ZSA3LWJpdCBhcmd1bWVudCIpOworICAgICAgICBPIDw8IC12YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQvbm9uLWltbWVkaWF0ZSByb3RhdGUgYW1vdW50IGluIHByaW50Um90YXRlTmVnN0ltbSIpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcHJpbnRST1ROZWc3SW1tKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKXsKKyAgICAgIGFzc2VydChNSS0+Z2V0T3BlcmFuZChPcE5vKS5pc0ltbSgpICYmCisgICAgICAgICAgICAgIkludmFsaWQvbm9uLWltbWVkaWF0ZSByb3RhdGUgYW1vdW50IGluIHByaW50Um90YXRlTmVnN0ltbSIpOworICAgICAgaW50IHZhbHVlID0gKGludCkgTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCk7CisgICAgICBhc3NlcnQoKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMzIpCisgICAgICAgICAgICAgJiYgIkludmFsaWQgbmVnYXRlZCBpbW1lZGlhdGUgcm90YXRlIDctYml0IGFyZ3VtZW50Iik7CisgICAgICBPIDw8IC12YWx1ZTsKKyAgICB9CisgIH07Cit9IC8vIGVuZCBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIEluY2x1ZGUgdGhlIGF1dG8tZ2VuZXJhdGVkIHBvcnRpb24gb2YgdGhlIGFzc2VtYmx5IHdyaXRlcgorI2luY2x1ZGUgIlNQVUdlbkFzbVdyaXRlci5pbmMiCisKK3ZvaWQgU1BVQXNtUHJpbnRlcjo6cHJpbnRPcChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8sIHJhd19vc3RyZWFtICZPKSB7CisgIHN3aXRjaCAoTU8uZ2V0VHlwZSgpKSB7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ltbWVkaWF0ZToKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoInByaW50T3AoKSBkb2VzIG5vdCBoYW5kbGUgaW1tZWRpYXRlIHZhbHVlcyIpOworICAgIHJldHVybjsKKworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19NYWNoaW5lQmFzaWNCbG9jazoKKyAgICBPIDw8ICpNTy5nZXRNQkIoKS0+Z2V0U3ltYm9sKCk7CisgICAgcmV0dXJuOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19KdW1wVGFibGVJbmRleDoKKyAgICBPIDw8IE1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJKVEkiIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkKKyAgICAgIDw8ICdfJyA8PCBNTy5nZXRJbmRleCgpOworICAgIHJldHVybjsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fQ29uc3RhbnRQb29sSW5kZXg6CisgICAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSA8PCAiQ1BJIiA8PCBnZXRGdW5jdGlvbk51bWJlcigpCisgICAgICA8PCAnXycgPDwgTU8uZ2V0SW5kZXgoKTsKKyAgICByZXR1cm47CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOgorICAgIC8vIENvbXB1dGluZyB0aGUgYWRkcmVzcyBvZiBhbiBleHRlcm5hbCBzeW1ib2wsIG5vdCBjYWxsaW5nIGl0LgorICAgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSAhPSBSZWxvYzo6U3RhdGljKSB7CisgICAgICBPIDw8ICJMIiA8PCBNQUktPmdldEdsb2JhbFByZWZpeCgpIDw8IE1PLmdldFN5bWJvbE5hbWUoKQorICAgICAgICA8PCAiJG5vbl9sYXp5X3B0ciI7CisgICAgICByZXR1cm47CisgICAgfQorICAgIE8gPDwgKkdldEV4dGVybmFsU3ltYm9sU3ltYm9sKE1PLmdldFN5bWJvbE5hbWUoKSk7CisgICAgcmV0dXJuOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOgorICAgIC8vIEV4dGVybmFsIG9yIHdlYWtseSBsaW5rZWQgZ2xvYmFsIHZhcmlhYmxlcyBuZWVkIG5vbi1sYXppbHktcmVzb2x2ZWQKKyAgICAvLyBzdHVicworICAgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSAhPSBSZWxvYzo6U3RhdGljKSB7CisgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBNTy5nZXRHbG9iYWwoKTsKKyAgICAgIGlmICgoKEdWLT5pc0RlY2xhcmF0aW9uKCkgfHwgR1YtPmhhc1dlYWtMaW5rYWdlKCkgfHwKKyAgICAgICAgICAgIEdWLT5oYXNMaW5rT25jZUxpbmthZ2UoKSB8fCBHVi0+aGFzQ29tbW9uTGlua2FnZSgpKSkpIHsKKyAgICAgICAgTyA8PCAqR2V0U3ltYm9sV2l0aEdsb2JhbFZhbHVlQmFzZShHViwgIiRub25fbGF6eV9wdHIiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBPIDw8ICpNYW5nLT5nZXRTeW1ib2woTU8uZ2V0R2xvYmFsKCkpOworICAgIHJldHVybjsKKyAgZGVmYXVsdDoKKyAgICBPIDw8ICI8dW5rbm93biBvcGVyYW5kIHR5cGU6ICIgPDwgTU8uZ2V0VHlwZSgpIDw8ICI+IjsKKyAgICByZXR1cm47CisgIH0KK30KKworLy8vIFByaW50QXNtT3BlcmFuZCAtIFByaW50IG91dCBhbiBvcGVyYW5kIGZvciBhbiBpbmxpbmUgYXNtIGV4cHJlc3Npb24uCisvLy8KK2Jvb2wgU1BVQXNtUHJpbnRlcjo6UHJpbnRBc21PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRXh0cmFDb2RlLCByYXdfb3N0cmVhbSAmTykgeworICAvLyBEb2VzIHRoaXMgYXNtIG9wZXJhbmQgaGF2ZSBhIHNpbmdsZSBsZXR0ZXIgb3BlcmFuZCBtb2RpZmllcj8KKyAgaWYgKEV4dHJhQ29kZSAmJiBFeHRyYUNvZGVbMF0pIHsKKyAgICBpZiAoRXh0cmFDb2RlWzFdICE9IDApIHJldHVybiB0cnVlOyAvLyBVbmtub3duIG1vZGlmaWVyLgorCisgICAgc3dpdGNoIChFeHRyYUNvZGVbMF0pIHsKKyAgICBkZWZhdWx0OiByZXR1cm4gdHJ1ZTsgIC8vIFVua25vd24gbW9kaWZpZXIuCisgICAgY2FzZSAnTCc6IC8vIFdyaXRlIHNlY29uZCB3b3JkIG9mIERJbW9kZSByZWZlcmVuY2UuCisgICAgICAvLyBWZXJpZnkgdGhhdCB0aGlzIG9wZXJhbmQgaGFzIHR3byBjb25zZWN1dGl2ZSByZWdpc3RlcnMuCisgICAgICBpZiAoIU1JLT5nZXRPcGVyYW5kKE9wTm8pLmlzUmVnKCkgfHwKKyAgICAgICAgICBPcE5vKzEgPT0gTUktPmdldE51bU9wZXJhbmRzKCkgfHwKKyAgICAgICAgICAhTUktPmdldE9wZXJhbmQoT3BObysxKS5pc1JlZygpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICsrT3BObzsgICAvLyBSZXR1cm4gdGhlIGhpZ2gtcGFydC4KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHByaW50T3BlcmFuZChNSSwgT3BObywgTyk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTUFVBc21QcmludGVyOjpQcmludEFzbU1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wTm8sIHVuc2lnbmVkIEFzbVZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBpZiAoRXh0cmFDb2RlICYmIEV4dHJhQ29kZVswXSkKKyAgICByZXR1cm4gdHJ1ZTsgLy8gVW5rbm93biBtb2RpZmllci4KKyAgcHJpbnRNZW1SZWdSZWcoTUksIE9wTm8sIE8pOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEZvcmNlIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUNlbGxTUFVBc21QcmludGVyKCkgeyAKKyAgUmVnaXN0ZXJBc21QcmludGVyPFNQVUFzbVByaW50ZXI+IFgoVGhlQ2VsbFNQVVRhcmdldCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmY2EzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI3IEBACitzZXQoTExWTV9UQVJHRVRfREVGSU5JVElPTlMgU1BVLnRkKQorCit0YWJsZWdlbihTUFVHZW5JbnN0ck5hbWVzLmluYyAtZ2VuLWluc3RyLWVudW1zKQordGFibGVnZW4oU1BVR2VuUmVnaXN0ZXJOYW1lcy5pbmMgLWdlbi1yZWdpc3Rlci1lbnVtcykKK3RhYmxlZ2VuKFNQVUdlbkFzbVdyaXRlci5pbmMgLWdlbi1hc20td3JpdGVyKQordGFibGVnZW4oU1BVR2VuQ29kZUVtaXR0ZXIuaW5jIC1nZW4tZW1pdHRlcikKK3RhYmxlZ2VuKFNQVUdlblJlZ2lzdGVySW5mby5oLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MtaGVhZGVyKQordGFibGVnZW4oU1BVR2VuUmVnaXN0ZXJJbmZvLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MpCit0YWJsZWdlbihTUFVHZW5JbnN0ckluZm8uaW5jIC1nZW4taW5zdHItZGVzYykKK3RhYmxlZ2VuKFNQVUdlbkRBR0lTZWwuaW5jIC1nZW4tZGFnLWlzZWwpCit0YWJsZWdlbihTUFVHZW5TdWJ0YXJnZXQuaW5jIC1nZW4tc3VidGFyZ2V0KQordGFibGVnZW4oU1BVR2VuQ2FsbGluZ0NvbnYuaW5jIC1nZW4tY2FsbGluZ2NvbnYpCisKK2FkZF9sbHZtX3RhcmdldChDZWxsU1BVQ29kZUdlbgorICBTUFVGcmFtZUluZm8uY3BwCisgIFNQVUhhemFyZFJlY29nbml6ZXJzLmNwcAorICBTUFVJbnN0ckluZm8uY3BwCisgIFNQVUlTZWxEQUdUb0RBRy5jcHAKKyAgU1BVSVNlbExvd2VyaW5nLmNwcAorICBTUFVNQ0FzbUluZm8uY3BwCisgIFNQVVJlZ2lzdGVySW5mby5jcHAKKyAgU1BVU3VidGFyZ2V0LmNwcAorICBTUFVUYXJnZXRNYWNoaW5lLmNwcAorICBTUFVTZWxlY3Rpb25EQUdJbmZvLmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoTExWTUNlbGxTUFVDb2RlR2VuIExMVk1TZWxlY3Rpb25EQUcpCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvQ2VsbFNES0ludHJpbnNpY3MudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvQ2VsbFNES0ludHJpbnNpY3MudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2OGFlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9DZWxsU0RLSW50cmluc2ljcy50ZApAQCAtMCwwICsxLDQ0OSBAQAorLy89PT0tLSBDZWxsU0RLSW50cmluc2ljcy50ZCAtIENlbGwgU0RLIEludHJpbnNpY3MgLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLy0tPT0tLSBBcml0aG1ldGljIG9wcyBpbnRyaW5zaWNzIC0tPT0tLQorZGVmIENlbGxTREthaDoKKyAgICBSUl9JbnRfdjhpMTY8MGIwMDAxMDAxMTAwMCwgImFoIiwgSW50ZWdlck9wLCBpbnRfc3B1X3NpX2FoPjsKK2RlZiBDZWxsU0RLYWhpOgorICAgIFJJMTBfSW50X3Y4aTE2PDBiMDAwMTAwMTEwMDAsICJhaGkiLCBJbnRlZ2VyT3AsIGludF9zcHVfc2lfYWhpPjsKK2RlZiBDZWxsU0RLYToKKyAgICBSUl9JbnRfdjRpMzI8MGIwMDAwMDAxMTAwMCwgImEiLCBJbnRlZ2VyT3AsIGludF9zcHVfc2lfYT47CitkZWYgQ2VsbFNES2FpOgorICAgIFJJMTBfSW50X3Y0aTMyPDBiMDAxMTEwMDAsICJhaSIsIEludGVnZXJPcCwgaW50X3NwdV9zaV9haT47CitkZWYgQ2VsbFNES3NmaDoKKyAgICBSUl9JbnRfdjhpMTY8MGIwMDAxMDAxMDAwMCwgInNmaCIsIEludGVnZXJPcCwgaW50X3NwdV9zaV9zZmg+OworZGVmIENlbGxTREtzZmhpOgorICAgIFJJMTBfSW50X3Y4aTE2PDBiMTAxMTAwMDAsICJzZmhpIiwgSW50ZWdlck9wLCBpbnRfc3B1X3NpX3NmaGk+OworZGVmIENlbGxTREtzZjoKKyAgICBSUl9JbnRfdjRpMzI8MGIwMDAwMDAxMDAwMCwgInNmIiwgSW50ZWdlck9wLCBpbnRfc3B1X3NpX3NmPjsKK2RlZiBDZWxsU0RLc2ZpOgorICAgIFJJMTBfSW50X3Y0aTMyPDBiMDAxMTAwMDAsICJzZmkiLCBJbnRlZ2VyT3AsIGludF9zcHVfc2lfc2ZpPjsKK2RlZiBDZWxsU0RLYWRkeDoKKyAgICBSUl9JbnRfdjRpMzI8MGIwMDAwMDAxMDExMCwgImFkZHgiLCBJbnRlZ2VyT3AsIGludF9zcHVfc2lfYWRkeD47CitkZWYgQ2VsbFNES2NnOgorICAgIFJSX0ludF92NGkzMjwwYjAxMDAwMDExMDAsICJjZyIsIEludGVnZXJPcCwgaW50X3NwdV9zaV9jZz47CitkZWYgQ2VsbFNES2NneDoKKyAgICBSUl9JbnRfdjRpMzI8MGIwMTAwMDAxMDExMCwgImNneCIsIEludGVnZXJPcCwgaW50X3NwdV9zaV9jZ3g+OworZGVmIENlbGxTREtzZng6CisgICAgUlJfSW50X3Y0aTMyPDBiMTAwMDAwMTAxMTAsICJzZngiLCBJbnRlZ2VyT3AsIGludF9zcHVfc2lfc2Z4PjsKK2RlZiBDZWxsU0RLYmc6CisgICAgUlJfSW50X3Y0aTMyPDBiMDEwMDAwMTAwMDAsICJiZyIsIEludGVnZXJPcCwgaW50X3NwdV9zaV9iZz47CitkZWYgQ2VsbFNES2JneDoKKyAgICBSUl9JbnRfdjRpMzI8MGIxMTAwMDAxMDExMCwgImJneCIsIEludGVnZXJPcCwgaW50X3NwdV9zaV9iZ3g+OworCitkZWYgQ2VsbFNES21weToKKyAgICBSUkZvcm08MGIwMDEwMDAxMTExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAibXB5ICRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyTXVsRGl2LAorICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9tcHkgKHY4aTE2IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2IFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREttcHl1OgorICAgIFJSRm9ybTwwYjAwMTEwMDExMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICJtcHl1ICRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyTXVsRGl2LAorICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9tcHl1ICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYgVkVDUkVHOiRyQikpKV0gPjsKKworZGVmIENlbGxTREttcHlpOgorICAgIFJJMTBGb3JtPDBiMDAxMDExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICJtcHlpICRyVCwgJHJBLCAkdmFsIiwgSW50ZWdlck11bERpdiwKKyAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfbXB5aSAodjhpMTYgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE2SW1tU0V4dDEwOiR2YWwpKV0+OworCitkZWYgQ2VsbFNES21weXVpOgorICAgIFJJMTBGb3JtPDBiMTAxMDExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICJtcHl1aSAkclQsICRyQSwgJHZhbCIsIEludGVnZXJNdWxEaXYsCisgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksIChpbnRfc3B1X3NpX21weXVpICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE2SW1tU0V4dDEwOiR2YWwpKV0+OworCitkZWYgQ2VsbFNES21weWE6CisgICAgUlJSRm9ybTwwYjAwMTEsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIsIFZFQ1JFRzokckMpLAorICAgICAgIm1weWEgJHJULCAkckEsICRyQiwgJHJDIiwgSW50ZWdlck11bERpdiwKKyAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfbXB5YSAodjhpMTYgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2IFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiBWRUNSRUc6JHJDKSkpXT47CisKK2RlZiBDZWxsU0RLbXB5aDoKKyAgICBSUkZvcm08MGIxMDEwMDAxMTExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAibXB5aCAkclQsICRyQSwgJHJCIiwgSW50ZWdlck11bERpdiwKKyAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfbXB5aCAodjRpMzIgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2IFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREttcHlzOgorICAgIFJSRm9ybTwwYjExMTAwMDExMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICJtcHlzICRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyTXVsRGl2LAorICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9tcHlzICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES21weWhoOgorICAgIFJSRm9ybTwwYjAxMTAwMDExMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICJtcHloaCAkclQsICRyQSwgJHJCIiwgSW50ZWdlck11bERpdiwKKyAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfbXB5aGggKHY4aTE2IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES21weWhoYToKKyAgICBSUkZvcm08MGIwMTEwMDAxMDExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAibXB5aGhhICRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyTXVsRGl2LAorICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9tcHloaGEgKHY4aTE2IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2IFZFQ1JFRzokckIpKSldPjsKKworLy8gTm90IHN1cmUgaG93IHRvIG1hdGNoIGEgKHNldCAkclQsIChhZGQgJHJUIChtcHloaCAkckEsICRyQikpKS4uLiBzbyBsZWF2ZQorLy8gYXMgYW4gaW50cmluc2ljIGZvciB0aGUgdGltZSBiZWluZworZGVmIENlbGxTREttcHloaHU6CisgICAgUlJGb3JtPDBiMDExMTAwMTExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgIm1weWhodSAkclQsICRyQSwgJHJCIiwgSW50ZWdlck11bERpdiwKKyAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfbXB5aGh1ICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLbXB5aGhhdToKKyAgICBSUkZvcm08MGIwMTExMDAxMDExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAibXB5aGhhdSAkclQsICRyQSwgJHJCIiwgSW50ZWdlck11bERpdiwKKyAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfbXB5aGhhdSAodjhpMTYgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2IFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREthbmQ6CisgICAgICAgIFJSRm9ybTwwYjEwMDAwMTEwMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICJhbmRcdCAkclQsICRyQSwgJHJCIiwgSW50ZWdlck9wLAorICAgICAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAoaW50X3NwdV9zaV9hbmQgKHY0aTMyIFZFQ1JFRzokckEpLCAodjRpMzIgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2FuZGM6CisgICAgICAgIFJSRm9ybTwwYjEwMDAwMDExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAiYW5kY1x0ICRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyT3AsCisgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgIChpbnRfc3B1X3NpX2FuZGMgKHY0aTMyIFZFQ1JFRzokckEpLCAodjRpMzIgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2FuZGJpOgorICAgICBSSTEwRm9ybTwwYjAxMTAxMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCB1MTBpbW1faTg6JHZhbCksCisgICAgICAgImFuZGJpXHQgJHJULCAkckEsICR2YWwiLCBCcmFuY2hSZXNvbHYsCisgICAgICAgWyhzZXQgKHYxNmk4IFZFQ1JFRzokclQpLAorICAgICAgICAgICAgIChpbnRfc3B1X3NpX2FuZGJpICh2MTZpOCBWRUNSRUc6JHJBKSwgaW1tVTg6JHZhbCkpXT47CisKK2RlZiBDZWxsU0RLYW5kaGk6CisgICAgIFJJMTBGb3JtPDBiMTAxMDEwMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgICAgImFuZGhpXHQgJHJULCAkckEsICR2YWwiLCBCcmFuY2hSZXNvbHYsCisgICAgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLAorICAgICAgICAgICAgIChpbnRfc3B1X3NpX2FuZGhpICh2OGkxNiBWRUNSRUc6JHJBKSwgaTE2SW1tU0V4dDEwOiR2YWwpKV0+OworCitkZWYgQ2VsbFNES2FuZGk6CisgICAgIFJJMTBGb3JtPDBiMDAxMDEwMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgICAgImFuZGlcdCAkclQsICRyQSwgJHZhbCIsIEJyYW5jaFJlc29sdiwKKyAgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgKGludF9zcHVfc2lfYW5kaSAodjRpMzIgVkVDUkVHOiRyQSksIGkzMkltbVNFeHQxMDokdmFsKSldPjsKKworZGVmIENlbGxTREtvcjoKKyAgICAgICAgUlJGb3JtPDBiMTAwMDAwMTAwMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICJvclx0ICRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyT3AsCisgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgIChpbnRfc3B1X3NpX29yICh2NGkzMiBWRUNSRUc6JHJBKSwgKHY0aTMyIFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREtvcmM6CisgICAgICAgIFJSRm9ybTwwYjEwMDEwMDExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAiYWRkY1x0ICRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyT3AsCisgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgIChpbnRfc3B1X3NpX29yYyAodjRpMzIgVkVDUkVHOiRyQSksICh2NGkzMiBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLb3JiaToKKyAgICAgUkkxMEZvcm08MGIwMTEwMDAwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgdTEwaW1tX2k4OiR2YWwpLAorICAgICAgICJvcmJpXHQgJHJULCAkckEsICR2YWwiLCBCcmFuY2hSZXNvbHYsCisgICAgICAgWyhzZXQgKHYxNmk4IFZFQ1JFRzokclQpLAorICAgICAgICAgICAgIChpbnRfc3B1X3NpX29yYmkgKHYxNmk4IFZFQ1JFRzokckEpLCBpbW1VODokdmFsKSldPjsKKworZGVmIENlbGxTREtvcmhpOgorICAgICBSSTEwRm9ybTwwYjEwMTAwMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgICJvcmhpXHQgJHJULCAkckEsICR2YWwiLCBCcmFuY2hSZXNvbHYsCisgICAgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLAorICAgICAgICAgICAgIChpbnRfc3B1X3NpX29yaGkgKHY4aTE2IFZFQ1JFRzokckEpLCBpMTZJbW1TRXh0MTA6JHZhbCkpXT47CisKK2RlZiBDZWxsU0RLb3JpOgorICAgICBSSTEwRm9ybTwwYjAwMTAwMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgICJvcmlcdCAkclQsICRyQSwgJHZhbCIsIEJyYW5jaFJlc29sdiwKKyAgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgKGludF9zcHVfc2lfb3JpICh2NGkzMiBWRUNSRUc6JHJBKSwgaTMySW1tU0V4dDEwOiR2YWwpKV0+OworCitkZWYgQ2VsbFNES3hvcjoKKyAgICAgICAgUlJGb3JtPDBiMTAwMDAwMTAwMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICJ4b3JcdCAkclQsICRyQSwgJHJCIiwgSW50ZWdlck9wLAorICAgICAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgCisgICAgICAgICAgICAgICAgKGludF9zcHVfc2lfeG9yICh2NGkzMiBWRUNSRUc6JHJBKSwgKHY0aTMyIFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREt4b3JiaToKKyAgICAgUkkxMEZvcm08MGIwMTEwMDAwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgdTEwaW1tX2k4OiR2YWwpLAorICAgICAgICJ4b3JiaVx0ICRyVCwgJHJBLCAkdmFsIiwgQnJhbmNoUmVzb2x2LAorICAgICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfeG9yYmkgKHYxNmk4IFZFQ1JFRzokckEpLCBpbW1VODokdmFsKSldPjsKKworZGVmIENlbGxTREt4b3JoaToKKyAgICAgUkkxMEZvcm08MGIxMDEwMDAwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgICJ4b3JoaVx0ICRyVCwgJHJBLCAkdmFsIiwgQnJhbmNoUmVzb2x2LAorICAgICAgIFsoc2V0ICh2OGkxNiBWRUNSRUc6JHJUKSwgCisgICAgICAgICAgICAgKGludF9zcHVfc2lfeG9yaGkgKHY4aTE2IFZFQ1JFRzokckEpLCBpMTZJbW1TRXh0MTA6JHZhbCkpXT47CisKK2RlZiBDZWxsU0RLeG9yaToKKyAgICAgUkkxMEZvcm08MGIwMDEwMDAwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgICAgICAieG9yaVx0ICRyVCwgJHJBLCAkdmFsIiwgQnJhbmNoUmVzb2x2LAorICAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgCisgICAgICAgICAgICAgKGludF9zcHVfc2lfeG9yaSAodjRpMzIgVkVDUkVHOiRyQSksIGkzMkltbVNFeHQxMDokdmFsKSldPjsKKworZGVmIENlbGxTREtub3I6CisgICAgICAgIFJSRm9ybTwwYjEwMDAwMDEwMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAibm9yXHQgJHJULCAkckEsICRyQiIsIEludGVnZXJPcCwKKyAgICAgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksIAorICAgICAgICAgICAgICAgIChpbnRfc3B1X3NpX25vciAodjRpMzIgVkVDUkVHOiRyQSksICh2NGkzMiBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLbmFuZDoKKyAgICAgICAgUlJGb3JtPDBiMTAwMDAwMTAwMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICJuYW5kXHQgJHJULCAkckEsICRyQiIsIEludGVnZXJPcCwKKyAgICAgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksIAorICAgICAgICAgICAgICAgIChpbnRfc3B1X3NpX25hbmQgKHY0aTMyIFZFQ1JFRzokckEpLCAodjRpMzIgVkVDUkVHOiRyQikpKV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2hpZnQvcm90YXRlIGludHJpbnNpY3M6CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgQ2VsbFNES3NobGk6CisgIFBhdDwoaW50X3NwdV9zaV9zaGxpICh2NGkzMiBWRUNSRUc6JHJBKSwgdWltbTc6JHZhbCksCisgICAgICAoU0hMSXY0aTMyIFZFQ1JFRzokckEsIChUT19JTU0zMiBpbW06JHZhbCkpPjsKKworZGVmIENlbGxTREtzaGxxYmk6CisgIFBhdDwoaW50X3NwdV9zaV9zaGxxYmkgVkVDUkVHOiRyQSwgUjMyQzokckIpLAorICAgICAgKFNITFFCSXYxNmk4IFZFQ1JFRzokckEsIFIzMkM6JHJCKT47CisKK2RlZiBDZWxsU0RLc2hscWlpOgorICBQYXQ8KGludF9zcHVfc2lfc2hscWJpaSBWRUNSRUc6JHJBLCB1aW1tNzokdmFsKSwKKyAgICAgIChTSExRQklJdjE2aTggVkVDUkVHOiRyQSwgKFRPX0lNTTMyIGltbTokdmFsKSk+OworCitkZWYgQ2VsbFNES3NobHFieToKKyAgUGF0PChpbnRfc3B1X3NpX3NobHFieSBWRUNSRUc6JHJBLCBSMzJDOiRyQiksCisgICAgICAoU0hMUUJZdjE2aTggVkVDUkVHOiRyQSwgUjMyQzokckIpPjsKKworZGVmIENlbGxTREtzaGxxYnlpOgorICBQYXQ8KGludF9zcHVfc2lfc2hscWJ5aSBWRUNSRUc6JHJBLCB1aW1tNzokdmFsKSwKKyAgICAgIChTSExRQllJdjE2aTggVkVDUkVHOiRyQSwgKFRPX0lNTTMyIGltbTokdmFsKSk+OworCisgICAgICAgICAgCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQnJhbmNoL2NvbXBhcmUgaW50cmluc2ljczoKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiBDZWxsU0RLY2VxOgorICBSUkZvcm08MGIwMDAwMDAxMTExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICJjZXFcdCAkclQsICRyQSwgJHJCIiwgQnJhbmNoUmVzb2x2LAorICAgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksIAorICAgICAgICAgICAgICAoaW50X3NwdV9zaV9jZXEgKHY0aTMyIFZFQ1JFRzokckEpLCAodjRpMzIgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2NlcWk6CisgIFJJMTBGb3JtPDBiMDAxMTExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgImNlcWlcdCAkclQsICRyQSwgJHZhbCIsIEJyYW5jaFJlc29sdiwKKyAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksIAorICAgICAgICAgIChpbnRfc3B1X3NpX2NlcWkgKHY0aTMyIFZFQ1JFRzokckEpLCBpMzJJbW1TRXh0MTA6JHZhbCkpXT47CisKK2RlZiBDZWxsU0RLY2VxYjoKKyAgUlJGb3JtPDBiMDAwMDEwMTExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAiY2VxYlx0ICRyVCwgJHJBLCAkckIiLCBCcmFuY2hSZXNvbHYsCisgICAgICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwgCisgICAgICAgICAgICAgIChpbnRfc3B1X3NpX2NlcWIgKHYxNmk4IFZFQ1JFRzokckEpLCAodjE2aTggVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2NlcWJpOgorICBSSTEwRm9ybTwwYjAxMTExMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCB1MTBpbW1faTg6JHZhbCksCisgICAgICAgICJjZXFiaVx0ICRyVCwgJHJBLCAkdmFsIiwgQnJhbmNoUmVzb2x2LAorICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfY2VxYmkgKHYxNmk4IFZFQ1JFRzokckEpLCBpbW1VODokdmFsKSldPjsKKworZGVmIENlbGxTREtjZXFoOgorICBSUkZvcm08MGIwMDAxMDAxMTExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICJjZXFoXHQgJHJULCAkckEsICRyQiIsIEJyYW5jaFJlc29sdiwKKyAgICAgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLCAKKyAgICAgICAgICAgICAgKGludF9zcHVfc2lfY2VxaCAodjhpMTYgVkVDUkVHOiRyQSksICh2OGkxNiBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLY2VxaGk6CisgIFJJMTBGb3JtPDBiMTAxMTExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgImNlcWhpXHQgJHJULCAkckEsICR2YWwiLCBCcmFuY2hSZXNvbHYsCisgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLCAKKyAgICAgICAgICAoaW50X3NwdV9zaV9jZXFoaSAodjhpMTYgVkVDUkVHOiRyQSksIGkxNkltbVNFeHQxMDokdmFsKSldPjsKK2RlZiBDZWxsU0RLY2d0aDoKKyAgUlJGb3JtPDBiMDAwMTAwMTExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICJjZ3RoXHQgJHJULCAkckEsICRyQiIsIEJyYW5jaFJlc29sdiwKKyAgICAgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAoaW50X3NwdV9zaV9jZ3RoICh2OGkxNiBWRUNSRUc6JHJBKSwgKHY4aTE2IFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREtjZ3RoaToKKyAgUkkxMEZvcm08MGIxMDExMTExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICJjZ3RoaVx0ICRyVCwgJHJBLCAkdmFsIiwgQnJhbmNoUmVzb2x2LAorICAgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIAorICAgICAgICAgICAgICAoaW50X3NwdV9zaV9jZ3RoaSAodjhpMTYgVkVDUkVHOiRyQSksIGkxNkltbVNFeHQxMDokdmFsKSldPjsKKworZGVmIENlbGxTREtjZ3Q6CisgIFJSRm9ybTwwYjAwMDAwMDEwMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAiY2d0XHQgJHJULCAkckEsICRyQiIsIEJyYW5jaFJlc29sdiwKKyAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAKKyAgICAgICAgICAgICAgKGludF9zcHVfc2lfY2d0ICh2NGkzMiBWRUNSRUc6JHJBKSwgKHY0aTMyIFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREtjZ3RpOgorICBSSTEwRm9ybTwwYjAwMTEwMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgImNndGlcdCAkclQsICRyQSwgJHZhbCIsIEJyYW5jaFJlc29sdiwKKyAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAKKyAgICAgICAgICAgICAgKGludF9zcHVfc2lfY2d0aSAodjRpMzIgVkVDUkVHOiRyQSksIGkzMkltbVNFeHQxMDokdmFsKSldPjsKKworZGVmIENlbGxTREtjZ3RiOgorICBSUkZvcm08MGIwMDAwMTAxMDAxMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgImNndGJcdCAkclQsICRyQSwgJHJCIiwgQnJhbmNoUmVzb2x2LAorICAgICAgICBbKHNldCAodjE2aTggVkVDUkVHOiRyVCksIAorICAgICAgICAgICAgICAoaW50X3NwdV9zaV9jZ3RiICh2MTZpOCBWRUNSRUc6JHJBKSwgKHYxNmk4IFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREtjZ3RiaToKKyAgUkkxMEZvcm08MGIwMTExMDAxMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgdTEwaW1tX2k4OiR2YWwpLAorICAgICJjZ3RiaVx0ICRyVCwgJHJBLCAkdmFsIiwgQnJhbmNoUmVzb2x2LAorICAgICAgICBbKHNldCAodjE2aTggVkVDUkVHOiRyVCksIChpbnRfc3B1X3NpX2NndGJpICh2MTZpOCBWRUNSRUc6JHJBKSwgaW1tVTg6JHZhbCkpXT47CisKK2RlZiBDZWxsU0RLY2xndGg6CisgIFJSRm9ybTwwYjAwMDEwMDExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAiY2xndGhcdCAkclQsICRyQSwgJHJCIiwgQnJhbmNoUmVzb2x2LAorICAgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIAorICAgICAgICAgICAgICAoaW50X3NwdV9zaV9jbGd0aCAodjhpMTYgVkVDUkVHOiRyQSksICh2OGkxNiBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLY2xndGhpOgorICBSSTEwRm9ybTwwYjEwMTExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgImNsZ3RoaVx0ICRyVCwgJHJBLCAkdmFsIiwgQnJhbmNoUmVzb2x2LAorICAgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIAorICAgICAgICAgICAgICAoaW50X3NwdV9zaV9jbGd0aGkgKHY4aTE2IFZFQ1JFRzokckEpLCBpMTZJbW1TRXh0MTA6JHZhbCkpXT47CisKK2RlZiBDZWxsU0RLY2xndDoKKyAgUlJGb3JtPDBiMDAwMDAwMTEwMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICJjbGd0XHQgJHJULCAkckEsICRyQiIsIEJyYW5jaFJlc29sdiwKKyAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAKKyAgICAgICAgICAgICAgKGludF9zcHVfc2lfY2xndCAodjRpMzIgVkVDUkVHOiRyQSksICh2NGkzMiBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLY2xndGk6CisgIFJJMTBGb3JtPDBiMDAxMTEwMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAiY2xndGlcdCAkclQsICRyQSwgJHZhbCIsIEJyYW5jaFJlc29sdiwKKyAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAKKyAgICAgICAgICAgICAgKGludF9zcHVfc2lfY2xndGkgKHY0aTMyIFZFQ1JFRzokckEpLCBpMzJJbW1TRXh0MTA6JHZhbCkpXT47CisKK2RlZiBDZWxsU0RLY2xndGI6CisgIFJSRm9ybTwwYjAwMDAxMDExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAiY2xndGJcdCAkclQsICRyQSwgJHJCIiwgQnJhbmNoUmVzb2x2LAorICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAoaW50X3NwdV9zaV9jbGd0YiAodjE2aTggVkVDUkVHOiRyQSksICh2MTZpOCBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLY2xndGJpOgorICBSSTEwRm9ybTwwYjAxMTExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCB1MTBpbW1faTg6JHZhbCksCisgICAgImNsZ3RiaVx0ICRyVCwgJHJBLCAkdmFsIiwgQnJhbmNoUmVzb2x2LAorICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAoaW50X3NwdV9zaV9jbGd0YmkgKHYxNmk4IFZFQ1JFRzokckEpLCBpbW1VODokdmFsKSldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZsb2F0aW5nLXBvaW50IGludHJpbnNpY3M6CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgQ2VsbFNES2ZhOgorICBSUkZvcm08MGIwMDEwMDAxMTAxMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgImZhXHQgJHJULCAkckEsICRyQiIsIFNQcmVjRlAsCisgICAgICAgIFsoc2V0ICh2NGYzMiBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfZmEgKHY0ZjMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLZnM6CisgIFJSRm9ybTwwYjEwMTAwMDExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAiZnNcdCAkclQsICRyQSwgJHJCIiwgU1ByZWNGUCwKKyAgICAgICAgWyhzZXQgKHY0ZjMyIFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9mcyAodjRmMzIgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREtmbToKKyAgUlJGb3JtPDBiMDExMDAwMTEwMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICJmbVx0ICRyVCwgJHJBLCAkckIiLCBTUHJlY0ZQLAorICAgICAgICBbKHNldCAodjRmMzIgVkVDUkVHOiRyVCksIChpbnRfc3B1X3NpX2ZtICh2NGYzMiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRmMzIgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2ZjZXE6CisgIFJSRm9ybTwwYjAxMDAwMDExMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAiZmNlcVx0ICRyVCwgJHJBLCAkckIiLCBTUHJlY0ZQLAorICAgICAgICBbKHNldCAodjRmMzIgVkVDUkVHOiRyVCksIChpbnRfc3B1X3NpX2ZjZXEgKHY0ZjMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREtmY2d0OgorICBSUkZvcm08MGIwMTAwMDAxMTAxMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgImZjZ3RcdCAkclQsICRyQSwgJHJCIiwgU1ByZWNGUCwKKyAgICAgICAgWyhzZXQgKHY0ZjMyIFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9mY2d0ICh2NGYzMiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLZmNtZXE6CisgIFJSRm9ybTwwYjAxMDEwMDExMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAiZmNtZXFcdCAkclQsICRyQSwgJHJCIiwgU1ByZWNGUCwKKyAgICAgICAgWyhzZXQgKHY0ZjMyIFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9mY21lcSAodjRmMzIgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREtmY21ndDoKKyAgUlJGb3JtPDBiMDEwMTAwMTEwMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICJmY21ndFx0ICRyVCwgJHJBLCAkckIiLCBTUHJlY0ZQLAorICAgICAgICBbKHNldCAodjRmMzIgVkVDUkVHOiRyVCksIChpbnRfc3B1X3NpX2ZjbWd0ICh2NGYzMiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRmMzIgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2ZtYToKKyAgUlJSRm9ybTwwYjAxMTEsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIsIFZFQ1JFRzokckMpLAorICAgICJmbWFcdCAkclQsICRyQSwgJHJCLCAkckMiLCBTUHJlY0ZQLAorICAgICAgICBbKHNldCAodjRmMzIgVkVDUkVHOiRyVCksIChpbnRfc3B1X3NpX2ZtYSAodjRmMzIgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIFZFQ1JFRzokckMpKSldPjsKKworZGVmIENlbGxTREtmbm1zOgorICBSUlJGb3JtPDBiMTAxMSwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiwgVkVDUkVHOiRyQyksCisgICAgImZubXNcdCAkclQsICRyQSwgJHJCLCAkckMiLCBTUHJlY0ZQLAorICAgICAgICBbKHNldCAodjRmMzIgVkVDUkVHOiRyVCksIChpbnRfc3B1X3NpX2ZubXMgKHY0ZjMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIFZFQ1JFRzokckMpKSldPjsKKworZGVmIENlbGxTREtmbXM6CisgIFJSUkZvcm08MGIxMTExLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAiZm1zXHQgJHJULCAkckEsICRyQiwgJHJDIiwgU1ByZWNGUCwKKyAgICAgICAgWyhzZXQgKHY0ZjMyIFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9mbXMgKHY0ZjMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRmMzIgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiBWRUNSRUc6JHJDKSkpXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGludHJpbnNpY3M6CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgQ2VsbFNES2RmYToKKyAgUlJGb3JtPDBiMDAxMTAwMTEwMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICJkZmFcdCAkclQsICRyQSwgJHJCIiwgRFByZWNGUCwKKyAgICAgICAgWyhzZXQgKHYyZjY0IFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9kZmEgKHYyZjY0IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJmNjQgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2RmczoKKyAgUlJGb3JtPDBiMTAxMTAwMTEwMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICJkZnNcdCAkclQsICRyQSwgJHJCIiwgRFByZWNGUCwKKyAgICAgICAgWyhzZXQgKHYyZjY0IFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9kZnMgKHYyZjY0IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJmNjQgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2RmbToKKyAgUlJGb3JtPDBiMDExMTAwMTEwMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICJkZm1cdCAkclQsICRyQSwgJHJCIiwgRFByZWNGUCwKKyAgICAgICAgWyhzZXQgKHYyZjY0IFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9kZm0gKHYyZjY0IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJmNjQgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2RmbWE6CisgIFJSRm9ybTwwYjAwMTExMDEwMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAiZGZtYVx0ICRyVCwgJHJBLCAkckIiLCBEUHJlY0ZQLAorICAgICAgICBbKHNldCAodjJmNjQgVkVDUkVHOiRyVCksIChpbnRfc3B1X3NpX2RmbWEgKHYyZjY0IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyZjY0IFZFQ1JFRzokckIpKSldPjsKKworZGVmIENlbGxTREtkZm5tYToKKyAgUlJGb3JtPDBiMTExMTEwMTAxMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICJkZm5tYVx0ICRyVCwgJHJBLCAkckIiLCBEUHJlY0ZQLAorICAgICAgICBbKHNldCAodjJmNjQgVkVDUkVHOiRyVCksIChpbnRfc3B1X3NpX2Rmbm1hICh2MmY2NCBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJmNjQgVkVDUkVHOiRyQikpKV0+OworCitkZWYgQ2VsbFNES2Rmbm1zOgorICBSUkZvcm08MGIwMTExMTAxMDExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgImRmbm1zXHQgJHJULCAkckEsICRyQiIsIERQcmVjRlAsCisgICAgICAgIFsoc2V0ICh2MmY2NCBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfZGZubXMgKHYyZjY0IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MmY2NCBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBDZWxsU0RLZGZtczoKKyAgUlJGb3JtPDBiMTAxMTEwMTAxMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICJkZm1zXHQgJHJULCAkckEsICRyQiIsIERQcmVjRlAsCisgICAgICAgIFsoc2V0ICh2MmY2NCBWRUNSRUc6JHJUKSwgKGludF9zcHVfc2lfZGZtcyAodjJmNjQgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJmNjQgVkVDUkVHOiRyQikpKV0+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGJkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvTWFrZWZpbGUKQEAgLTAsMCArMSwyMSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvQ2VsbFNQVS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNQ2VsbFNQVUNvZGVHZW4KK1RBUkdFVCA9IFNQVQorQlVJTFRfU09VUkNFUyA9IFNQVUdlbkluc3RyTmFtZXMuaW5jIFNQVUdlblJlZ2lzdGVyTmFtZXMuaW5jIFwKKwkJU1BVR2VuQXNtV3JpdGVyLmluYyBTUFVHZW5Db2RlRW1pdHRlci5pbmMgXAorCQlTUFVHZW5SZWdpc3RlckluZm8uaC5pbmMgU1BVR2VuUmVnaXN0ZXJJbmZvLmluYyBcCisJCVNQVUdlbkluc3RySW5mby5pbmMgU1BVR2VuREFHSVNlbC5pbmMgXAorCQlTUFVHZW5TdWJ0YXJnZXQuaW5jIFNQVUdlbkNhbGxpbmdDb252LmluYworCitESVJTID0gQXNtUHJpbnRlciBUYXJnZXRJbmZvCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvUkVBRE1FLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlN2FkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDkyIEBACisvLz09PS0gUkVBRE1FLnR4dCAtIE5vdGVzIGZvciBpbXByb3ZpbmcgQ2VsbFNQVS1zcGVjaWZpYyBjb2RlIGdlbiAtLS0tLS0tLS09PT0vLworCitUaGlzIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IGEgdGVhbSBmcm9tIHRoZSBDb21wdXRlciBTeXN0ZW1zIFJlc2VhcmNoCitEZXBhcnRtZW50IGluIFRoZSBBZXJvc3BhY2UgQ29ycG9yYXRpb246CisKKy0gU2NvdHQgTWljaGVsIChoZWFkIGJvdHRsZSB3YXNoZXIgYW5kIG11Y2ggb2YgdGhlIG5vbi1mbG9hdGluZyBwb2ludAorICBpbnN0cnVjdGlvbnMpCistIE1hcmsgVGhvbWFzIChmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMpCistIE1pY2hhZWwgQXVZZXVuZyAoaW50cmluc2ljcykKKy0gQ2hhbmRsZXIgQ2FycnV0aCAoTExWTSBleHBlcnRpc2UpCistIE5laGFsIERlc2FpIChkZWJ1Z2dpbmcsIGkzMiBvcGVyYXRpb25zLCBSb2FkUnVubmVyIFNQVSBleHBlcnRpc2UpCisKK1NvbWUgbWlub3IgZml4ZXMgYWRkZWQgYnkgS2FsbGUgUmFpc2tpbGEuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTk9OSU5GUklOR0VNRU5ULCBPUgorT1RIRVJXSVNFLiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFFUk9TUEFDRSBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIERBTUFHRVMKK09GIEFOWSBLSU5EIE9SIE5BVFVSRSBXSEVUSEVSIEJBU0VEIElOIENPTlRSQUNULCBUT1JULCBPUiBPVEhFUldJU0UgQVJJU0lORworT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSBJTkNMVURJTkcsIFdJVEhPVVQKK0xJTUlUQVRJT04sIERBTUFHRVMgUkVTVUxUSU5HIEZST00gTE9TVCBPUiBDT05UQU1JTkFURUQgREFUQSwgTE9TVCBQUk9GSVRTIE9SCitSRVZFTlVFLCBDT01QVVRFUiBNQUxGVU5DVElPTiwgT1IgRk9SIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBDT05TRVFVRU5USUFMLAorT1IgUFVOSVRJVkUgIERBTUFHRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTIE9SCitTVUNIIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tV0FSTklORy0tOgorLS1XQVJOSU5HLS06IFRoZSBDZWxsU1BVIHdvcmsgaXMgd29yay1pbi1wcm9ncmVzcyBhbmQgImFscGhhIiBxdWFsaXR5IGNvZGUuCistLVdBUk5JTkctLToKKworSWYgeW91IGFyZSBicmF2ZSBlbm91Z2ggdG8gdHJ5IHRoaXMgY29kZSBvciBoZWxwIHRvIGhhY2sgb24gaXQsIGJlIHN1cmUKK3RvIGFkZCAnc3B1JyB0byBjb25maWd1cmUncyAtLWVuYWJsZS10YXJnZXRzIG9wdGlvbiwgZS5nLjoKKworICAgICAgICAuL2NvbmZpZ3VyZSA8eW91cl9jb25maWd1cmVfZmxhZ3NfaGVyZT4gXAorICAgICAgICAgICAtLWVuYWJsZS10YXJnZXRzPXg4Nix4ODZfNjQscG93ZXJwYyxzcHUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RPRE86CisqIENyZWF0ZSBhIG1hY2hpbmUgcGFzcyBmb3IgcGVyZm9ybWluZyBkdWFsLXBpcGVsaW5lIHNjaGVkdWxpbmcgc3BlY2lmaWNhbGx5CisgIGZvciBDZWxsU1BVLCBhbmQgaW5zZXJ0IGJyYW5jaCBwcmVkaWN0aW9uIGluc3RydWN0aW9ucyBhcyBuZWVkZWQuCisKKyogaTMyIGluc3RydWN0aW9uczoKKworICAqIGkzMiBkaXZpc2lvbiAod29yay1pbi1wcm9ncmVzcykKKworKiBpNjQgc3VwcG9ydCAoc2VlIGk2NG9wZXJhdGlvbnMuYyB0ZXN0IGhhcm5lc3MpOgorCisgICogc2hpZnRzIGFuZCBjb21wYXJpc29uIG9wZXJhdG9yczogZG9uZQorICAqIHNpZ24gYW5kIHplcm8gZXh0ZW5zaW9uOiBkb25lCisgICogYWRkaXRpb246IGRvbmUKKyAgKiBzdWJ0cmFjdGlvbjogbmVlZGVkCisgICogbXVsdGlwbGljYXRpb246IGRvbmUKKworKiBpMTI4IHN1cHBvcnQ6CisKKyAgKiB6ZXJvIGV4dGVuc2lvbiwgYW55IGV4dGVuc2lvbjogZG9uZQorICAqIHNpZ24gZXh0ZW5zaW9uOiBuZWVkZWQKKyAgKiBhcml0aG1ldGljIG9wZXJhdG9ycyAoYWRkLCBzdWIsIG11bCwgZGl2KTogbmVlZGVkCisgICogbG9naWNhbCBvcGVyYXRpb25zIChhbmQsIG9yLCBzaGwsIHNybCwgc3JhLCB4b3IsIG5vciwgbmFuZCk6IG5lZWRlZAorCisgICAgKiBvcjogZG9uZQorCisqIGY2NCBzdXBwb3J0CisKKyAgKiBDb21wYXJpc29uIG9wZXJhdG9yczoKKyAgICBTRVRPRVEgICAgICAgICAgICAgIHVuaW1wbGVtZW50ZWQKKyAgICBTRVRPR1QgICAgICAgICAgICAgIHVuaW1wbGVtZW50ZWQKKyAgICBTRVRPR0UgICAgICAgICAgICAgIHVuaW1wbGVtZW50ZWQKKyAgICBTRVRPTFQgICAgICAgICAgICAgIHVuaW1wbGVtZW50ZWQKKyAgICBTRVRPTEUgICAgICAgICAgICAgIHVuaW1wbGVtZW50ZWQKKyAgICBTRVRPTkUgICAgICAgICAgICAgIHVuaW1wbGVtZW50ZWQKKyAgICBTRVRPICAgICAgICAgICAgICAgIGRvbmUgKGxvd2VyZWQpCisgICAgU0VUVU8gICAgICAgICAgICAgICBkb25lIChsb3dlcmVkKQorICAgIFNFVFVFUSAgICAgICAgICAgICAgdW5pbXBsZW1lbnRlZAorICAgIFNFVFVHVCAgICAgICAgICAgICAgdW5pbXBsZW1lbnRlZAorICAgIFNFVFVHRSAgICAgICAgICAgICAgdW5pbXBsZW1lbnRlZAorICAgIFNFVFVMVCAgICAgICAgICAgICAgdW5pbXBsZW1lbnRlZAorICAgIFNFVFVMRSAgICAgICAgICAgICAgdW5pbXBsZW1lbnRlZAorICAgIFNFVFVORSAgICAgICAgICAgICAgdW5pbXBsZW1lbnRlZAorCisqIExMVk0gdmVjdG9yIHN1cG9ydAorCisgICogVlNFVENDIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkLiBJdCdzIHByZXR0eSBzdHJhaWdodGZvcndhcmQgdG8gY29kZSwgYnV0CisgICAgbmVlZHMgaW1wbGVtZW50YXRpb24uCisKKyogSW50cmluc2ljcworCisgICogc3B1LmggaW5zdHJpbnNpY3MgYWRkZWQgYnV0IG5vdCB0ZXN0ZWQuIE5lZWQgdG8gaGF2ZSBhbiBvcGVyYXRpb25hbAorICAgIGxsdm0tc3B1LWdjYyBpbiBvcmRlciB0byB3cml0ZSBhIHVuaXQgdGVzdCBoYXJuZXNzLgorCis9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMTUxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFUuaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0tIFNQVS5oIC0gVG9wLWxldmVsIGludGVyZmFjZSBmb3IgQ2VsbCBTUFUgVGFyZ2V0IC0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZW50cnkgcG9pbnRzIGZvciBnbG9iYWwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIExMVk0KKy8vIENlbGwgU1BVIGJhY2stZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfSUJNQ0VMTFNQVV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX0lCTUNFTExTUFVfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFNQVVRhcmdldE1hY2hpbmU7CisgIGNsYXNzIEZ1bmN0aW9uUGFzczsKKyAgY2xhc3MgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOworCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlU1BVSVNlbERhZyhTUFVUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgZXh0ZXJuIFRhcmdldCBUaGVDZWxsU1BVVGFyZ2V0OworfQorCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciB0aGUgU1BVIGluc3RydWN0aW9ucy4KKy8vCisjaW5jbHVkZSAiU1BVR2VuSW5zdHJOYW1lcy5pbmMiCisKKyNlbmRpZiAvKiBMTFZNX1RBUkdFVF9JQk1DRUxMU1BVX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFUudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjdmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVLnRkCkBAIC0wLDAgKzEsNjYgQEAKKy8vPT09LSBTUFUudGQgLSBEZXNjcmliZSB0aGUgU1RJIENlbGwgU1BVIFRhcmdldCBNYWNoaW5lIC0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgZW50cnkgcG9pbnQgZm9yIHRoZSBTVEkgQ2VsbCBTUFUgdGFyZ2V0IG1hY2hpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gR2V0IHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgaW50ZXJmYWNlcyB3aGljaCB3ZSBhcmUgaW1wbGVtZW50aW5nLgorLy8KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldC50ZCIKKworLy8gSG9sZGVyIG9mIGNvZGUgZnJhZ21lbnRzICh5b3UnZCB0aGluayB0aGlzJ2QgYWxyZWFkeSBiZSBpbgorLy8gYSB0ZCBmaWxlIHNvbWV3aGVyZS4uLiA6LSkKKworY2xhc3MgQ29kZUZyYWc8ZGFnIGZyYWc+IHsKKyAgZGFnIEZyYWdtZW50ID0gZnJhZzsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJlZ2lzdGVyIEZpbGUgRGVzY3JpcHRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgIlNQVVJlZ2lzdGVySW5mby50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGZvcm1hdHMsIGluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW5jbHVkZSAiU1BVTm9kZXMudGQiCitpbmNsdWRlICJTUFVPcGVyYW5kcy50ZCIKK2luY2x1ZGUgIlNQVVNjaGVkdWxlLnRkIgoraW5jbHVkZSAiU1BVSW5zdHJGb3JtYXRzLnRkIgoraW5jbHVkZSAiU1BVSW5zdHJJbmZvLnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3VidGFyZ2V0IGZlYXR1cmVzOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIERlZmF1bHRQcm9jOiBTdWJ0YXJnZXRGZWF0dXJlPCIiLCAiUHJvY0RpcmVjdGl2ZSIsICJTUFU6OkRFRkFVTFRfUFJPQyIsICIiPjsKK2RlZiBMYXJnZU1lbUZlYXR1cmU6CisgIFN1YnRhcmdldEZlYXR1cmU8ImxhcmdlX21lbSIsIlVzZUxhcmdlTWVtIiwgInRydWUiLAorICAgICAgICAgICAgICAgICAgICJVc2UgbGFyZ2UgKD4yNTYpIExTQSBtZW1vcnkgYWRkcmVzc2luZyBbZGVmYXVsdCA9IGZhbHNlXSI+OworCitkZWYgU1BVUmV2MCA6IFByb2Nlc3NvcjwidjAiLCBTUFVJdGluZXJhcmllcywgW0RlZmF1bHRQcm9jXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDYWxsaW5nIGNvbnZlbnRpb246CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitpbmNsdWRlICJTUFVDYWxsaW5nQ29udi50ZCIKKworLy8gVGFyZ2V0OgorCitkZWYgU1BVSW5zdHJJbmZvIDogSW5zdHJJbmZvIHsKKyAgbGV0IGlzTGl0dGxlRW5kaWFuRW5jb2RpbmcgPSAxOworfQorCitkZWYgU1BVIDogVGFyZ2V0IHsKKyAgbGV0IEluc3RydWN0aW9uU2V0ID0gU1BVSW5zdHJJbmZvOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVTEyOEluc3RySW5mby50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFUxMjhJbnN0ckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzMWZkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFUxMjhJbnN0ckluZm8udGQKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tLS0gU1BVMTI4SW5zdHJJbmZvLnRkIC0gQ2VsbCBTUFUgMTI4LWJpdCBvcGVyYXRpb25zIC0qLSB0YWJsZWdlbiAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIENlbGwgU1BVIDEyOC1iaXQgb3BlcmF0aW9ucworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvLyB6ZXh0IDMyLT4xMjg6IFplcm8gZXh0ZW5kIDMyLWJpdCB0byAxMjgtYml0CitkZWYgOiBQYXQ8KGkxMjggKHpleHQgUjMyQzokclNyYykpLAorICAgICAgICAgIChST1RRTUJZSXIxMjhfemV4dF9yMzIgUjMyQzokclNyYywgMTIpPjsKKworLy8gemV4dCA2NC0+MTI4OiBaZXJvIGV4dGVuZCA2NC1iaXQgdG8gMTI4LWJpdAorZGVmIDogUGF0PChpMTI4ICh6ZXh0IFI2NEM6JHJTcmMpKSwKKyAgICAgICAgICAoUk9UUU1CWUlyMTI4X3pleHRfcjY0IFI2NEM6JHJTcmMsIDgpPjsKKworLy8gemV4dCAxNi0+MTI4OiBaZXJvIGV4dGVuZCAxNi1iaXQgdG8gMTI4LWJpdAorZGVmIDogUGF0PChpMTI4ICh6ZXh0IFIxNkM6JHJTcmMpKSwKKyAgICAgICAgICAoUk9UUU1CWUlyMTI4X3pleHRfcjMyIChBTkRpMTZpMzIgUjE2QzokclNyYywgKElMQXIzMiAweGZmZmYpKSwgMTIpPjsKKworLy8gemV4dCA4LT4xMjg6IFplcm8gZXh0ZW5kIDgtYml0IHRvIDEyOC1iaXQKK2RlZiA6IFBhdDwoaTEyOCAoemV4dCBSOEM6JHJTcmMpKSwKKyAgICAgICAgICAoUk9UUU1CWUlyMTI4X3pleHRfcjMyIChBTkRJaThpMzIgUjhDOiRyU3JjLCAweGYpLCAxMik+OworCisvLyBhbnlleHQgMzItPjEyODogWmVybyBleHRlbmQgMzItYml0IHRvIDEyOC1iaXQKK2RlZiA6IFBhdDwoaTEyOCAoYW55ZXh0IFIzMkM6JHJTcmMpKSwKKyAgICAgICAgICAoUk9UUU1CWUlyMTI4X3pleHRfcjMyIFIzMkM6JHJTcmMsIDEyKT47CisKKy8vIGFueWV4dCA2NC0+MTI4OiBaZXJvIGV4dGVuZCA2NC1iaXQgdG8gMTI4LWJpdAorZGVmIDogUGF0PChpMTI4IChhbnlleHQgUjY0QzokclNyYykpLAorICAgICAgICAgIChST1RRTUJZSXIxMjhfemV4dF9yNjQgUjY0QzokclNyYywgOCk+OworCisvLyBhbnlleHQgMTYtPjEyODogWmVybyBleHRlbmQgMTYtYml0IHRvIDEyOC1iaXQKK2RlZiA6IFBhdDwoaTEyOCAoYW55ZXh0IFIxNkM6JHJTcmMpKSwKKyAgICAgICAgICAoUk9UUU1CWUlyMTI4X3pleHRfcjMyIChBTkRpMTZpMzIgUjE2QzokclNyYywgKElMQXIzMiAweGZmZmYpKSwgMTIpPjsKKworLy8gYW55ZXh0IDgtPjEyODogWmVybyBleHRlbmQgOC1iaXQgdG8gMTI4LWJpdAorZGVmIDogUGF0PChpMTI4IChhbnlleHQgUjhDOiRyU3JjKSksCisgICAgICAgICAgKFJPVFFNQllJcjEyOF96ZXh0X3IzMiAoQU5ESWk4aTMyIFI4QzokclNyYywgMHhmKSwgMTIpPjsKKworLy8gU2hpZnQgbGVmdAorZGVmIDogUGF0PChzaGwgR1BSQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAoU0hMUUJZQklyMTI4IChTSExRQklyMTI4IEdQUkM6JHJBLCBSMzJDOiRyQiksIFIzMkM6JHJCKT47CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVNjRJbnN0ckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVNjRJbnN0ckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5YTE4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFU2NEluc3RySW5mby50ZApAQCAtMCwwICsxLDM5NSBAQAorLy89PT09LS0tIFNQVTY0SW5zdHJJbmZvLnRkIC0gQ2VsbCBTUFUgNjQtYml0IG9wZXJhdGlvbnMgLSotIHRhYmxlZ2VuIC0qLS09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIENlbGwgU1BVIDY0LWJpdCBvcGVyYXRpb25zCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIDY0LWJpdCBjb21wYXJpc29uczoKKy8vCisvLyAxLiBUaGUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzIGZvciB2ZWN0b3IgdmljZSBzY2FsYXIgZGlmZmVyIGJ5IGEKKy8vICAgIGNvbnN0YW50LiBJbiB0aGUgc2NhbGFyIGNhc2UsIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUKKy8vICAgIHRvcCB0d28gMzItYml0IHNsb3RzLCB3aGVyZWFzIHdlJ3JlIGludGVyZXN0ZWQgaW4gYW4gZXhhY3QKKy8vICAgIGFsbC1mb3VyLXNsb3QgbWF0Y2ggaW4gdGhlIHZlY3RvciBjYXNlLgorLy8KKy8vIDIuIFRoZXJlIGFyZSBubyAiaW1tZWRpYXRlIiBmb3Jtcywgc2luY2UgbG9hZGluZyA2NC1iaXQgY29uc3RhbnRzCisvLyAgICBjb3VsZCBiZSBhIGNvbnN0YW50IHBvb2wgbG9hZC4KKy8vCisvLyAzLiBpNjQgc2V0Y2MgcmVzdWx0cyBhcmUgaTMyLCB3aGljaCBhcmUgc3Vic2VxdWVudGx5IGNvbnZlcnRlZCB0byBhIEZTTQorLy8gICAgbWFzayB3aGVuIHVzZWQgaW4gYSBzZWxlY3QgcGF0dGVybi4KKy8vCisvLyA0LiB2Mmk2NCBzZXRjYyByZXN1bHRzIGFyZSB2NGkzMiwgd2hpY2ggY2FuIGJlIGNvbnZlcnRlZCB0byBhIEZTTSBtYXNrIChUT0RPKQorLy8gICAgW05vdGU6IHRoaXMgbWF5IGJlIG1vb3QsIHNpbmNlIGdiIHByb2R1Y2VzIHY0aTMyIG9yIHIzMi5dCisvLworLy8gNS4gVGhlIGNvZGUgc2VxdWVuY2VzIGZvciByNjQgYW5kIHYyaTY0IGFyZSBwcm9iYWJseSBvdmVybHkgY29uc2VydmF0aXZlLAorLy8gICAgY29tcGFyZWQgdG8gdGhlIGNvZGUgdGhhdCBnY2MgcHJvZHVjZXMuCisvLworLy8gTTAwJEUgQiF0ZXMgS2FuIGJlIFByZXR0eSBOQHNUaSEhISEhIChhcHBvbG9naWVzIHRvIE1vbnR5ISkKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisKKy8vIHNlbGIgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbiBmb3IgaTY0LiBOb3RlIHRoYXQgdGhlIHNlbGVjdGlvbiBtYXNrIGlzCisvLyBhIHZlY3RvciwgcHJvZHVjZWQgYnkgdmFyaW91cyBmb3JtcyBvZiBGU006CitkZWYgU0VMQnI2NF9jb25kOgorICBTRUxCSW5zdDwob3V0cyBSNjRDOiRyVCksIChpbnMgUjY0QzokckEsIFI2NEM6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworLy8gVGhlIGdlbmVyaWMgaTY0IHNlbGVjdCBwYXR0ZXJuLCB3aGljaCBhc3N1bWVzIHRoYXQgdGhlIGNvbXBhcmlzb24gcmVzdWx0CisvLyBpcyBpbiBhIDMyLWJpdCByZWdpc3RlciB0aGF0IGNvbnRhaW5zIGEgc2VsZWN0IG1hc2sgcGF0dGVybiAoaS5lLiwgZ2F0aGVyCisvLyBiaXRzIHJlc3VsdCk6CisKK2RlZiA6IFBhdDwoc2VsZWN0IFIzMkM6JHJDb25kLCBSNjRDOiRyRmFsc2UsIFI2NEM6JHJUcnVlKSwKKyAgICAgICAgICAoU0VMQnI2NF9jb25kIFI2NEM6JHJUcnVlLCBSNjRDOiRyRmFsc2UsIChGU01yMzIgUjMyQzokckNvbmQpKT47CisKKy8vIHNlbGVjdCB0aGUgbmVnYXRpdmUgY29uZGl0aW9uOgorY2xhc3MgSTY0U0VMRUNUTmVnQ29uZDxQYXRGcmFnIGNvbmQsIENvZGVGcmFnIGNvbXBhcmU+OgorICBQYXQ8KHNlbGVjdCAoaTMyIChjb25kIFI2NEM6JHJBLCBSNjRDOiRyQikpLCBSNjRDOiRyVHJ1ZSwgUjY0QzokckZhbHNlKSwKKyAgICAgIChTRUxCcjY0X2NvbmQgUjY0QzokclRydWUsIFI2NEM6JHJGYWxzZSwgKEZTTXIzMiBjb21wYXJlLkZyYWdtZW50KSk+OworCisvLyBzZXRjYyB0aGUgbmVnYXRpdmUgY29uZGl0aW9uOgorY2xhc3MgSTY0U0VUQ0NOZWdDb25kPFBhdEZyYWcgY29uZCwgQ29kZUZyYWcgY29tcGFyZT46CisgIFBhdDwoY29uZCBSNjRDOiRyQSwgUjY0QzokckIpLAorICAgICAgKFhPUklyMzIgY29tcGFyZS5GcmFnbWVudCwgLTEpPjsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIFRoZSBpNjQgc2V0ZXEgZnJhZ21lbnQgdGhhdCBkb2VzIHRoZSBzY2FsYXItPnZlY3RvciBjb252ZXJzaW9uIGFuZAorLy8gY29tcGFyaXNvbjoKK2RlZiBDRVFyNjRjb21wYXJlOgorICAgIENvZGVGcmFnPChDR1RJdjRpMzIgKEdCdjRpMzIgKENFUXY0aTMyIChPUnYyaTY0X2k2NCBSNjRDOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9SdjJpNjRfaTY0IFI2NEM6JHJCKSkpLCAweGIpPjsKKworLy8gVGhlIGk2NCBzZXRlcSBmcmFnbWVudCB0aGF0IGRvZXMgdGhlIHZlY3RvciBjb21wYXJpc29uCitkZWYgQ0VRdjJpNjRjb21wYXJlOgorICAgIENvZGVGcmFnPChDRVFJdjRpMzIgKEdCdjRpMzIgKENFUXY0aTMyIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpKSwgMHhmKT47CisKKy8vIGk2NCBzZXRlcSAoZXF1YWxpdHkpOiB0aGUgc2V0Y2MgcmVzdWx0IGlzIGkzMiwgd2hpY2ggaXMgY29udmVydGVkIHRvIGEKKy8vIHZlY3RvciBGU00gbWFzayB3aGVuIHVzZWQgaW4gYSBzZWxlY3QgcGF0dGVybi4KKy8vCisvLyB2Mmk2NCBzZXRlcSAoZXF1YWxpdHkpOiB0aGUgc2V0Y2MgcmVzdWx0IGlzIHY0aTMyCittdWx0aWNsYXNzIENvbXBhcmVFcXVhbDY0IHsKKyAgLy8gUGxhaW4gb2xkIGNvbXBhcmlzb24sIGNvbnZlcnRzIGJhY2sgdG8gaTMyIHNjYWxhcgorICBkZWYgcjY0OiBDb2RlRnJhZzwoT1JpMzJfdjRpMzIgQ0VRcjY0Y29tcGFyZS5GcmFnbWVudCk+OworICBkZWYgdjJpNjQ6IENvZGVGcmFnPChPUmkzMl92NGkzMiBDRVF2Mmk2NGNvbXBhcmUuRnJhZ21lbnQpPjsKKworICAvLyBTRUxCIG1hc2sgZnJvbSBGU006CisgIGRlZiByNjRtYXNrOiBDb2RlRnJhZzwoT1JpMzJfdjRpMzIgKEZTTXY0aTMyIENFUXI2NGNvbXBhcmUuRnJhZ21lbnQpKT47CisgIGRlZiB2Mmk2NG1hc2s6IENvZGVGcmFnPChPUmkzMl92NGkzMiAoRlNNdjRpMzIgQ0VRdjJpNjRjb21wYXJlLkZyYWdtZW50KSk+OworfQorCitkZWZtIEk2NEVROiBDb21wYXJlRXF1YWw2NDsKKworZGVmIDogUGF0PChzZXRlcSBSNjRDOiRyQSwgUjY0QzokckIpLCBJNjRFUXI2NC5GcmFnbWVudD47CitkZWYgOiBQYXQ8KHNldGVxICh2Mmk2NCBWRUNSRUc6JHJBKSwgKHYyaTY0IFZFQ1JFRzokckIpKSwgSTY0RVF2Mmk2NC5GcmFnbWVudD47CisKKy8vIGk2NCBzZXRuZToKK2RlZiA6IEk2NFNFVENDTmVnQ29uZDxzZXRuZSwgSTY0RVFyNjQ+OworZGVmIDogSTY0U0VMRUNUTmVnQ29uZDxzZXRuZSwgSTY0RVFyNjQ+OworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorLy8gaTY0IHNldHVndC9zZXR1bGU6CisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitkZWYgQ0xHVHI2NHVndDoKKyAgICBDb2RlRnJhZzwoQ0xHVHY0aTMyIChPUnYyaTY0X2k2NCBSNjRDOiRyQSksIChPUnYyaTY0X2k2NCBSNjRDOiRyQikpPjsKKworZGVmIENMR1RyNjRlcToKKyAgICBDb2RlRnJhZzwoQ0VRdjRpMzIgKE9SdjJpNjRfaTY0IFI2NEM6JHJBKSwgKE9SdjJpNjRfaTY0IFI2NEM6JHJCKSk+OworICAgIAorZGVmIENMR1RyNjRjb21wYXJlOgorICAgIENvZGVGcmFnPChTRUxCdjJpNjQgQ0xHVHI2NHVndC5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChYU1dEdjJpNjQgQ0xHVHI2NHVndC5GcmFnbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICBDTEdUcjY0ZXEuRnJhZ21lbnQpPjsKKworZGVmIENMR1R2Mmk2NHVndDoKKyAgICBDb2RlRnJhZzwoQ0xHVHY0aTMyIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpPjsKKworZGVmIENMR1R2Mmk2NGVxOgorICAgIENvZGVGcmFnPChDRVF2NGkzMiBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKT47CisgICAgCitkZWYgQ0xHVHYyaTY0Y29tcGFyZToKKyAgICBDb2RlRnJhZzwoU0VMQnYyaTY0IENMR1R2Mmk2NHVndC5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChYU1dEdjJpNjQgQ0xHVHI2NHVndC5GcmFnbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICBDTEdUdjJpNjRlcS5GcmFnbWVudCk+OworCittdWx0aWNsYXNzIENvbXBhcmVMb2dpY2FsR3JlYXRlclRoYW42NCB7CisgIC8vIFBsYWluIG9sZCBjb21wYXJpc29uLCBjb252ZXJ0cyBiYWNrIHRvIGkzMiBzY2FsYXIKKyAgZGVmIHI2NDogQ29kZUZyYWc8KE9SaTMyX3Y0aTMyIENMR1RyNjRjb21wYXJlLkZyYWdtZW50KT47CisgIGRlZiB2Mmk2NDogQ29kZUZyYWc8Q0xHVHYyaTY0Y29tcGFyZS5GcmFnbWVudD47CisKKyAgLy8gU0VMQiBtYXNrIGZyb20gRlNNOgorICBkZWYgcjY0bWFzazogQ29kZUZyYWc8KE9SaTMyX3Y0aTMyIChGU012NGkzMiBDTEdUcjY0Y29tcGFyZS5GcmFnbWVudCkpPjsKKyAgZGVmIHYyaTY0bWFzazogQ29kZUZyYWc8KE9SaTMyX3Y0aTMyIChGU012NGkzMiBDTEdUdjJpNjRjb21wYXJlLkZyYWdtZW50KSk+OworfQorCitkZWZtIEk2NExHVDogQ29tcGFyZUxvZ2ljYWxHcmVhdGVyVGhhbjY0OworCitkZWYgOiBQYXQ8KHNldHVndCBSNjRDOiRyQSwgUjY0QzokckIpLCBJNjRMR1RyNjQuRnJhZ21lbnQ+OworLy9kZWYgOiBQYXQ8KHNldHVndCAodjJpNjQgVkVDUkVHOiRyQSksICh2Mmk2NCBWRUNSRUc6JHJCKSksCisvLyAgICAgICAgICBJNjRMR1R2Mmk2NC5GcmFnbWVudD47CisKKy8vIGk2NCBzZXR1bHQ6CitkZWYgOiBJNjRTRVRDQ05lZ0NvbmQ8c2V0dWxlLCBJNjRMR1RyNjQ+OworZGVmIDogSTY0U0VMRUNUTmVnQ29uZDxzZXR1bGUsIEk2NExHVHI2ND47CisKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBpNjQgc2V0dWdlL3NldHVsdDoKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisKK2RlZiBDTEdFcjY0Y29tcGFyZToKKyAgICBDb2RlRnJhZzwoQ0dUSXY0aTMyIChHQnY0aTMyIChPUnY0aTMyIENMR1RyNjR1Z3QuRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEdUcjY0ZXEuRnJhZ21lbnQpKSwgMHhiKT47CisKK2RlZiBDTEdFdjJpNjRjb21wYXJlOgorICAgIENvZGVGcmFnPChDRVFJdjRpMzIgKEdCdjRpMzIgKE9SdjRpMzIgQ0xHVHYyaTY0dWd0LkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xHVHYyaTY0ZXEuRnJhZ21lbnQpKSwgMHhmKT47CisKK211bHRpY2xhc3MgQ29tcGFyZUxvZ2ljYWxHcmVhdGVyRXF1YWw2NCB7CisgIC8vIFBsYWluIG9sZCBjb21wYXJpc29uLCBjb252ZXJ0cyBiYWNrIHRvIGkzMiBzY2FsYXIKKyAgZGVmIHI2NDogQ29kZUZyYWc8KE9SaTMyX3Y0aTMyIENMR0VyNjRjb21wYXJlLkZyYWdtZW50KT47CisgIGRlZiB2Mmk2NDogQ29kZUZyYWc8Q0xHRXYyaTY0Y29tcGFyZS5GcmFnbWVudD47CisKKyAgLy8gU0VMQiBtYXNrIGZyb20gRlNNOgorICBkZWYgcjY0bWFzazogQ29kZUZyYWc8KE9SaTMyX3Y0aTMyIChGU012NGkzMiBDTEdFcjY0Y29tcGFyZS5GcmFnbWVudCkpPjsKKyAgZGVmIHYyaTY0bWFzazogQ29kZUZyYWc8KE9SaTMyX3Y0aTMyIChGU012NGkzMiBDTEdFdjJpNjRjb21wYXJlLkZyYWdtZW50KSk+OworfQorCitkZWZtIEk2NExHRTogQ29tcGFyZUxvZ2ljYWxHcmVhdGVyRXF1YWw2NDsKKworZGVmIDogUGF0PChzZXR1Z2UgUjY0QzokckEsIFI2NEM6JHJCKSwgSTY0TEdFcjY0LkZyYWdtZW50PjsKK2RlZiA6IFBhdDwodjJpNjQgKHNldHVnZSAodjJpNjQgVkVDUkVHOiRyQSksICh2Mmk2NCBWRUNSRUc6JHJCKSkpLAorICAgICAgICAgIEk2NExHRXYyaTY0LkZyYWdtZW50PjsKKyAgICAgICAgICAgICAgICAgIAorCisvLyBpNjQgc2V0dWx0OgorZGVmIDogSTY0U0VUQ0NOZWdDb25kPHNldHVsdCwgSTY0TEdFcjY0PjsKK2RlZiA6IEk2NFNFTEVDVE5lZ0NvbmQ8c2V0dWx0LCBJNjRMR0VyNjQ+OworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorLy8gaTY0IHNldGd0L3NldGxlOgorLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKworZGVmIENHVHI2NHNndDoKKyAgICBDb2RlRnJhZzwoQ0dUdjRpMzIgKE9SdjJpNjRfaTY0IFI2NEM6JHJBKSwgKE9SdjJpNjRfaTY0IFI2NEM6JHJCKSk+OworCitkZWYgQ0dUcjY0ZXE6CisgICAgQ29kZUZyYWc8KENFUXY0aTMyIChPUnYyaTY0X2k2NCBSNjRDOiRyQSksIChPUnYyaTY0X2k2NCBSNjRDOiRyQikpPjsKKyAgICAKK2RlZiBDR1RyNjRjb21wYXJlOgorICAgIENvZGVGcmFnPChTRUxCdjJpNjQgQ0dUcjY0c2d0LkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgKFhTV0R2Mmk2NCBDR1RyNjRzZ3QuRnJhZ21lbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0dUcjY0ZXEuRnJhZ21lbnQpPjsKKworZGVmIENHVHYyaTY0c2d0OgorICAgIENvZGVGcmFnPChDR1R2NGkzMiBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKT47CisKK2RlZiBDR1R2Mmk2NGVxOgorICAgIENvZGVGcmFnPChDRVF2NGkzMiBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKT47CisgICAgCitkZWYgQ0dUdjJpNjRjb21wYXJlOgorICAgIENvZGVGcmFnPChTRUxCdjJpNjQgQ0dUdjJpNjRzZ3QuRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAoWFNXRHYyaTY0IENHVHI2NHNndC5GcmFnbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICBDR1R2Mmk2NGVxLkZyYWdtZW50KT47CisKK211bHRpY2xhc3MgQ29tcGFyZUdyZWF0ZXJUaGFuNjQgeworICAvLyBQbGFpbiBvbGQgY29tcGFyaXNvbiwgY29udmVydHMgYmFjayB0byBpMzIgc2NhbGFyCisgIGRlZiByNjQ6IENvZGVGcmFnPChPUmkzMl92NGkzMiBDR1RyNjRjb21wYXJlLkZyYWdtZW50KT47CisgIGRlZiB2Mmk2NDogQ29kZUZyYWc8Q0dUdjJpNjRjb21wYXJlLkZyYWdtZW50PjsKKworICAvLyBTRUxCIG1hc2sgZnJvbSBGU006CisgIGRlZiByNjRtYXNrOiBDb2RlRnJhZzwoT1JpMzJfdjRpMzIgKEZTTXY0aTMyIENHVHI2NGNvbXBhcmUuRnJhZ21lbnQpKT47CisgIGRlZiB2Mmk2NG1hc2s6IENvZGVGcmFnPChPUmkzMl92NGkzMiAoRlNNdjRpMzIgQ0dUdjJpNjRjb21wYXJlLkZyYWdtZW50KSk+OworfQorCitkZWZtIEk2NEdUOiBDb21wYXJlTG9naWNhbEdyZWF0ZXJUaGFuNjQ7CisKK2RlZiA6IFBhdDwoc2V0Z3QgUjY0QzokckEsIFI2NEM6JHJCKSwgSTY0R1RyNjQuRnJhZ21lbnQ+OworLy9kZWYgOiBQYXQ8KHNldGd0ICh2Mmk2NCBWRUNSRUc6JHJBKSwgKHYyaTY0IFZFQ1JFRzokckIpKSwKKy8vICAgICAgICAgICAgICAgICAgSTY0R1R2Mmk2NC5GcmFnbWVudD47CisKKy8vIGk2NCBzZXR1bHQ6CitkZWYgOiBJNjRTRVRDQ05lZ0NvbmQ8c2V0bGUsIEk2NEdUcjY0PjsKK2RlZiA6IEk2NFNFTEVDVE5lZ0NvbmQ8c2V0bGUsIEk2NEdUcjY0PjsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIGk2NCBzZXRnZS9zZXRsdDoKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisgICAgCitkZWYgQ0dFcjY0Y29tcGFyZToKKyAgICBDb2RlRnJhZzwoQ0dUSXY0aTMyIChHQnY0aTMyIChPUnY0aTMyIENHVHI2NHNndC5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHVHI2NGVxLkZyYWdtZW50KSksIDB4Yik+OworCitkZWYgQ0dFdjJpNjRjb21wYXJlOgorICAgIENvZGVGcmFnPChDRVFJdjRpMzIgKEdCdjRpMzIgKE9SdjRpMzIgQ0dUdjJpNjRzZ3QuRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1R2Mmk2NGVxLkZyYWdtZW50KSksIDB4Zik+OworCittdWx0aWNsYXNzIENvbXBhcmVHcmVhdGVyRXF1YWw2NCB7CisgIC8vIFBsYWluIG9sZCBjb21wYXJpc29uLCBjb252ZXJ0cyBiYWNrIHRvIGkzMiBzY2FsYXIKKyAgZGVmIHI2NDogQ29kZUZyYWc8KE9SaTMyX3Y0aTMyIENHRXI2NGNvbXBhcmUuRnJhZ21lbnQpPjsKKyAgZGVmIHYyaTY0OiBDb2RlRnJhZzxDR0V2Mmk2NGNvbXBhcmUuRnJhZ21lbnQ+OworCisgIC8vIFNFTEIgbWFzayBmcm9tIEZTTToKKyAgZGVmIHI2NG1hc2s6IENvZGVGcmFnPChPUmkzMl92NGkzMiAoRlNNdjRpMzIgQ0dFcjY0Y29tcGFyZS5GcmFnbWVudCkpPjsKKyAgZGVmIHYyaTY0bWFzazogQ29kZUZyYWc8KE9SaTMyX3Y0aTMyIChGU012NGkzMiBDR0V2Mmk2NGNvbXBhcmUuRnJhZ21lbnQpKT47Cit9CisKK2RlZm0gSTY0R0U6IENvbXBhcmVHcmVhdGVyRXF1YWw2NDsKKworZGVmIDogUGF0PChzZXRnZSBSNjRDOiRyQSwgUjY0QzokckIpLCBJNjRHRXI2NC5GcmFnbWVudD47CitkZWYgOiBQYXQ8KHYyaTY0IChzZXRnZSAodjJpNjQgVkVDUkVHOiRyQSksICh2Mmk2NCBWRUNSRUc6JHJCKSkpLAorICAgICAgICAgIEk2NEdFdjJpNjQuRnJhZ21lbnQ+OworCisvLyBpNjQgc2V0dWx0OgorZGVmIDogSTY0U0VUQ0NOZWdDb25kPHNldGx0LCBJNjRHRXI2ND47CitkZWYgOiBJNjRTRUxFQ1ROZWdDb25kPHNldGx0LCBJNjRHRXI2ND47CisKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyB2Mmk2NCwgaTY0IGFkZAorLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKworY2xhc3MgdjJpNjRfYWRkX2NnPGRhZyBsaHMsIGRhZyByaHM+OgorICAgIENvZGVGcmFnPChDR3Y0aTMyIGxocywgcmhzKT47CisKK2NsYXNzIHYyaTY0X2FkZF8xPGRhZyBsaHMsIGRhZyByaHMsIGRhZyBjZywgZGFnIGNnX21hc2s+OgorICAgIENvZGVGcmFnPChBRERYdjRpMzIgbGhzLCByaHMsIChTSFVGQnY0aTMyIGNnLCBjZywgY2dfbWFzaykpPjsKKworY2xhc3MgdjJpNjRfYWRkPGRhZyBsaHMsIGRhZyByaHMsIGRhZyBjZ19tYXNrPjoKKyAgICB2Mmk2NF9hZGRfMTxsaHMsIHJocywgdjJpNjRfYWRkX2NnPGxocywgcmhzPi5GcmFnbWVudCwgY2dfbWFzaz47CisKK2RlZiA6IFBhdDwoU1BVYWRkNjQgUjY0QzokckEsIFI2NEM6JHJCLCAodjRpMzIgVkVDUkVHOiRyQ0dtYXNrKSksCisgICAgICAgICAgIChPUmk2NF92Mmk2NCB2Mmk2NF9hZGQ8KE9SdjJpNjRfaTY0IFI2NEM6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1J2Mmk2NF9pNjQgUjY0QzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiBWRUNSRUc6JHJDR21hc2spPi5GcmFnbWVudCk+OworCitkZWYgOiBQYXQ8KFNQVWFkZDY0ICh2Mmk2NCBWRUNSRUc6JHJBKSwgKHYyaTY0IFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICAodjRpMzIgVkVDUkVHOiRyQ0dtYXNrKSksCisgICAgICAgICAgIHYyaTY0X2FkZDwodjJpNjQgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAodjJpNjQgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAodjRpMzIgVkVDUkVHOiRyQ0dtYXNrKT4uRnJhZ21lbnQ+OworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorLy8gdjJpNjQsIGk2NCBzdWJ0cmFjdGlvbgorLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKworY2xhc3MgdjJpNjRfc3ViX2JnPGRhZyBsaHMsIGRhZyByaHM+OiBDb2RlRnJhZzwoQkd2NGkzMiBsaHMsIHJocyk+OworCitjbGFzcyB2Mmk2NF9zdWI8ZGFnIGxocywgZGFnIHJocywgZGFnIGJnLCBkYWcgYmdfbWFzaz46CisgICAgQ29kZUZyYWc8KFNGWHY0aTMyIGxocywgcmhzLCAoU0hVRkJ2NGkzMiBiZywgYmcsIGJnX21hc2spKT47CisKK2RlZiA6IFBhdDwoU1BVc3ViNjQgUjY0QzokckEsIFI2NEM6JHJCLCAodjRpMzIgVkVDUkVHOiRyQ0dtYXNrKSksCisgICAgICAgICAgIChPUmk2NF92Mmk2NCB2Mmk2NF9zdWI8KE9SdjJpNjRfaTY0IFI2NEM6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1J2Mmk2NF9pNjQgUjY0QzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyaTY0X3N1Yl9iZzwoT1J2Mmk2NF9pNjQgUjY0QzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1J2Mmk2NF9pNjQgUjY0QzokckIpPi5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRpMzIgVkVDUkVHOiRyQ0dtYXNrKT4uRnJhZ21lbnQpPjsKKworZGVmIDogUGF0PChTUFVzdWI2NCAodjJpNjQgVkVDUkVHOiRyQSksICh2Mmk2NCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgKHY0aTMyIFZFQ1JFRzokckNHbWFzaykpLAorICAgICAgICAgICB2Mmk2NF9zdWI8KHYyaTY0IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgKHYyaTY0IFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICAgdjJpNjRfc3ViX2JnPCh2Mmk2NCBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJpNjQgVkVDUkVHOiRyQik+LkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIFZFQ1JFRzokckNHbWFzayk+LkZyYWdtZW50PjsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIHYyaTY0LCBpNjQgbXVsdGlwbHkKKy8vCisvLyBOb3RlOiBpNjQgbXVsdGlwbHkgaXMgc2ltcGx5IHRoZSB2ZWN0b3ItPnNjYWxhciBjb252ZXJzaW9uIG9mIHRoZQorLy8gZnVsbC1vbiB2Mmk2NCBtdWx0aXBseSwgc2luY2UgdGhlIGVudGlyZSB2ZWN0b3IgaGFzIHRvIGJlIG1hbmlwdWxhdGVkCisvLyBhbnl3YXkuCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitjbGFzcyB2Mmk2NF9tdWxfYWhpNjQ8ZGFnIHJBPiA6CisgICAgQ29kZUZyYWc8KFNFTEJ2NGkzMiByQSwgKElMdjRpMzIgMCksIChGU01CSXY0aTMyIDB4MGYwZikpPjsKKworY2xhc3MgdjJpNjRfbXVsX2JoaTY0PGRhZyByQj4gOgorICAgIENvZGVGcmFnPChTRUxCdjRpMzIgckIsIChJTHY0aTMyIDApLCAoRlNNQkl2NGkzMiAweDBmMGYpKT47CisKK2NsYXNzIHYyaTY0X211bF9hbG82NDxkYWcgckI+IDoKKyAgICBDb2RlRnJhZzwoU0VMQnY0aTMyIHJCLCAoSUx2NGkzMiAwKSwgKEZTTUJJdjRpMzIgMHhmMGYwKSk+OworCitjbGFzcyB2Mmk2NF9tdWxfYmxvNjQ8ZGFnIHJCPiA6CisgICAgQ29kZUZyYWc8KFNFTEJ2NGkzMiByQiwgKElMdjRpMzIgMCksIChGU01CSXY0aTMyIDB4ZjBmMCkpPjsKKworY2xhc3MgdjJpNjRfbXVsX2FzaGxxMjxkYWcgckE+OgorICAgIENvZGVGcmFnPChTSExRQllJdjRpMzIgckEsIDB4Mik+OworCitjbGFzcyB2Mmk2NF9tdWxfYXNobHE0PGRhZyByQT46CisgICAgQ29kZUZyYWc8KFNITFFCWUl2NGkzMiByQSwgMHg0KT47CisKK2NsYXNzIHYyaTY0X211bF9ic2hscTI8ZGFnIHJCPiA6CisgICAgQ29kZUZyYWc8KFNITFFCWUl2NGkzMiByQiwgMHgyKT47CisKK2NsYXNzIHYyaTY0X211bF9ic2hscTQ8ZGFnIHJCPiA6CisgICAgQ29kZUZyYWc8KFNITFFCWUl2NGkzMiByQiwgMHg0KT47CisKK2NsYXNzIHYyaTY0X2hpZ2hwcm9kPGRhZyByQSwgZGFnIHJCPjoKKyAgICBDb2RlRnJhZzwoQXY0aTMyCisgICAgICAgICAgICAgICAgKEF2NGkzMgorICAgICAgICAgICAgICAgICAgKE1QWVV2NGkzMiB2Mmk2NF9tdWxfYnNobHE0PHJCPi5GcmFnbWVudCwgICAgIC8vIGExIHggYjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjJpNjRfbXVsX2FoaTY0PHJBPi5GcmFnbWVudCksCisgICAgICAgICAgICAgICAgICAoTVBZSHY0aTMyIHYyaTY0X211bF9haGk2NDxyQT4uRnJhZ21lbnQsICAgICAgLy8gYTAgeCBiMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Mmk2NF9tdWxfYnNobHE0PHJCPi5GcmFnbWVudCkpLAorICAgICAgICAgICAgICAgIChBdjRpMzIKKyAgICAgICAgICAgICAgICAgIChNUFlIdjRpMzIgdjJpNjRfbXVsX2JoaTY0PHJCPi5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjJpNjRfbXVsX2FzaGxxNDxyQT4uRnJhZ21lbnQpLAorICAgICAgICAgICAgICAgICAgKEF2NGkzMgorICAgICAgICAgICAgICAgICAgICAgIChNUFlIdjRpMzIgdjJpNjRfbXVsX2FzaGxxNDxyQT4uRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Mmk2NF9tdWxfYmhpNjQ8ckI+LkZyYWdtZW50KSwKKyAgICAgICAgICAgICAgICAgICAgKEF2NGkzMgorICAgICAgICAgICAgICAgICAgICAgIChNUFlVdjRpMzIgdjJpNjRfbXVsX2FzaGxxNDxyQT4uRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Mmk2NF9tdWxfYmhpNjQ8ckI+LkZyYWdtZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAoQXY0aTMyCisgICAgICAgICAgICAgICAgICAgICAgICAoTVBZSHY0aTMyIHYyaTY0X211bF9hc2hscTI8ckE+LkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Mmk2NF9tdWxfYnNobHEyPHJCPi5GcmFnbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAoTVBZVXY0aTMyIHYyaTY0X211bF9hc2hscTI8ckE+LkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Mmk2NF9tdWxfYnNobHEyPHJCPi5GcmFnbWVudCkpKSkpKT47CisKK2NsYXNzIHYyaTY0X211bF9hM19iMzxkYWcgckEsIGRhZyByQj46CisgICAgQ29kZUZyYWc8KE1QWVV2NGkzMiB2Mmk2NF9tdWxfYWxvNjQ8ckE+LkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdjJpNjRfbXVsX2JsbzY0PHJCPi5GcmFnbWVudCk+OworCitjbGFzcyB2Mmk2NF9tdWxfYTJfYjM8ZGFnIHJBLCBkYWcgckI+OgorICAgIENvZGVGcmFnPChTRUxCdjRpMzIgKFNITFFCWUl2NGkzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAoTVBZSEhVdjRpMzIgdjJpNjRfbXVsX2FsbzY0PHJBPi5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyaTY0X211bF9ic2hscTI8ckI+LkZyYWdtZW50KSwgMHgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChJTHY0aTMyIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgKEZTTUJJdjRpMzIgMHhjM2MzKSk+OworCitjbGFzcyB2Mmk2NF9tdWxfYTNfYjI8ZGFnIHJBLCBkYWcgckI+OgorICAgIENvZGVGcmFnPChTRUxCdjRpMzIgKFNITFFCWUl2NGkzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAoTVBZSEhVdjRpMzIgdjJpNjRfbXVsX2JsbzY0PHJCPi5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyaTY0X211bF9hc2hscTI8ckE+LkZyYWdtZW50KSwgMHgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChJTHY0aTMyIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgKEZTTUJJdjRpMzIgMHhjM2MzKSk+OworCitjbGFzcyB2Mmk2NF9sb3dzdW08ZGFnIHJBLCBkYWcgckIsIGRhZyByQ0dtYXNrPjoKKyAgICB2Mmk2NF9hZGQ8djJpNjRfYWRkPHYyaTY0X211bF9hM19iMzxyQSwgckI+LkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdjJpNjRfbXVsX2EyX2IzPHJBLCByQj4uRnJhZ21lbnQsIHJDR21hc2s+LkZyYWdtZW50LAorICAgICAgICAgICAgICB2Mmk2NF9tdWxfYTNfYjI8ckEsIHJCPi5GcmFnbWVudCwgckNHbWFzaz47CisKK2NsYXNzIHYyaTY0X211bDxkYWcgckEsIGRhZyByQiwgZGFnIHJDR21hc2s+OgorICAgIHYyaTY0X2FkZDx2Mmk2NF9sb3dzdW08ckEsIHJCLCByQ0dtYXNrPi5GcmFnbWVudCwKKyAgICAgICAgICAgICAgKFNFTEJ2NGkzMiB2Mmk2NF9oaWdocHJvZDxyQSwgckI+LkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIChJTHY0aTMyIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGU01CSXY0aTMyIDB4MGYwZikpLAorICAgICAgICAgICAgICByQ0dtYXNrPjsKKworZGVmIDogUGF0PChTUFVtdWw2NCBSNjRDOiRyQSwgUjY0QzokckIsICh2NGkzMiBWRUNSRUc6JHJDR21hc2spKSwKKyAgICAgICAgICAoT1JpNjRfdjJpNjQgdjJpNjRfbXVsPChPUnYyaTY0X2k2NCBSNjRDOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1J2Mmk2NF9pNjQgUjY0QzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIFZFQ1JFRzokckNHbWFzayk+LkZyYWdtZW50KT47CisKK2RlZiA6IFBhdDwoU1BVbXVsNjQgKHYyaTY0IFZFQ1JFRzokckEpLCAodjJpNjQgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgICh2NGkzMiBWRUNSRUc6JHJDR21hc2spKSwKKyAgICAgICAgICB2Mmk2NF9tdWw8KHYyaTY0IFZFQ1JFRzokckEpLCAodjJpNjQgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgICh2NGkzMiBWRUNSRUc6JHJDR21hc2spPi5GcmFnbWVudD47CisKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBmNjQgY29tcGFyaXNvbnMKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisKKy8vIHNlbGIgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbiBmb3IgaTY0LiBOb3RlIHRoYXQgdGhlIHNlbGVjdGlvbiBtYXNrIGlzCisvLyBhIHZlY3RvciwgcHJvZHVjZWQgYnkgdmFyaW91cyBmb3JtcyBvZiBGU006CitkZWYgU0VMQmY2NF9jb25kOgorICAgU0VMQkluc3Q8KG91dHMgUjY0RlA6JHJUKSwgKGlucyBSNjRGUDokckEsIFI2NEZQOiRyQiwgUjMyQzokckMpLAorICAgICAgICAgICAgWyhzZXQgUjY0RlA6JHJULAorICAgICAgICAgICAgICAgICAgKHNlbGVjdCBSMzJDOiRyQywgUjY0RlA6JHJCLCBSNjRGUDokckEpKV0+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUNhbGxpbmdDb252LnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUNhbGxpbmdDb252LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOWU1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVQ2FsbGluZ0NvbnYudGQKQEAgLTAsMCArMSw1NyBAQAorLy89PT0tIFNQVUNhbGxpbmdDb252LnRkIC0gQ2FsbGluZyBDb252ZW50aW9ucyBmb3IgQ2VsbFNQVSAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZGVzY3JpYmVzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciB0aGUgU1RJIENlbGwgU1BVIGFyY2hpdGVjdHVyZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQ0NJZlN1YnRhcmdldCAtIE1hdGNoIGlmIHRoZSBjdXJyZW50IHN1YnRhcmdldCBoYXMgYSBmZWF0dXJlIEYuCitjbGFzcyBDQ0lmU3VidGFyZ2V0PHN0cmluZyBGLCBDQ0FjdGlvbiBBPgorIDogQ0NJZjwhc3RyY29uY2F0KCJTdGF0ZS5nZXRUYXJnZXQoKS5nZXRTdWJ0YXJnZXQ8UFBDU3VidGFyZ2V0PigpLiIsIEYpLCBBPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJldHVybiBWYWx1ZSBDYWxsaW5nIENvbnZlbnRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFJldHVybi12YWx1ZSBjb252ZW50aW9uIGZvciBDZWxsIFNQVTogRXZlcnl0aGluZyBjYW4gYmUgcGFzc2VkIGJhY2sgdmlhICQzOgorZGVmIFJldENDX1NQVSA6IENhbGxpbmdDb252PFsKKyAgQ0NJZlR5cGU8W2k4XSwgICAgICAgQ0NBc3NpZ25Ub1JlZzxbUjNdPj4sCisgIENDSWZUeXBlPFtpMTZdLCAgICAgIENDQXNzaWduVG9SZWc8W1IzXT4+LAorICBDQ0lmVHlwZTxbaTMyXSwgICAgICBDQ0Fzc2lnblRvUmVnPFtSM10+PiwKKyAgQ0NJZlR5cGU8W2k2NF0sICAgICAgQ0NBc3NpZ25Ub1JlZzxbUjNdPj4sCisgIENDSWZUeXBlPFtpMTI4XSwgICAgIENDQXNzaWduVG9SZWc8W1IzXT4+LAorICBDQ0lmVHlwZTxbZjMyLCBmNjRdLCBDQ0Fzc2lnblRvUmVnPFtSM10+PiwKKyAgQ0NJZlR5cGU8W3YxNmk4LCB2OGkxNiwgdjRpMzIsIHYyaTY0LCB2NGYzMiwgdjJmNjRdLCBDQ0Fzc2lnblRvUmVnPFtSM10+PiwKKyAgQ0NJZlR5cGU8W3YyaTMyLCB2MmYzMl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnblRvUmVnPFtSM10+PgorXT47CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENlbGxTUFUgQXJndW1lbnQgQ2FsbGluZyBDb252ZW50aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2RlZiBDQ0NfU1BVIDogQ2FsbGluZ0NvbnY8WworICBDQ0lmVHlwZTxbaTgsIGkxNiwgaTMyLCBpNjQsIGkxMjgsIGYzMiwgZjY0LCAKKyAgICAgICAgICAgIHYxNmk4LCB2OGkxNiwgdjRpMzIsIHY0ZjMyLCB2Mmk2NCwgdjJmNjQsIHYyaTMyLCB2MmYzMl0sCisgICAgICAgICAgICBDQ0Fzc2lnblRvUmVnPFtSMywgICBSNCwgIFI1LCAgUjYsICBSNywgIFI4LCAgUjksIFIxMCwgUjExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUjEyLCBSMTMsIFIxNCwgUjE1LCBSMTYsIFIxNywgUjE4LCBSMTksIFIyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFIyMSwgUjIyLCBSMjMsIFIyNCwgUjI1LCBSMjYsIFIyNywgUjI4LCBSMjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSMzAsIFIzMSwgUjMyLCBSMzMsIFIzNCwgUjM1LCBSMzYsIFIzNywgUjM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUjM5LCBSNDAsIFI0MSwgUjQyLCBSNDMsIFI0NCwgUjQ1LCBSNDYsIFI0NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFI0OCwgUjQ5LCBSNTAsIFI1MSwgUjUyLCBSNTMsIFI1NCwgUjU1LCBSNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSNTcsIFI1OCwgUjU5LCBSNjAsIFI2MSwgUjYyLCBSNjMsIFI2NCwgUjY1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUjY2LCBSNjcsIFI2OCwgUjY5LCBSNzAsIFI3MSwgUjcyLCBSNzMsIFI3NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFI3NSwgUjc2LCBSNzcsIFI3OCwgUjc5XT4+LAorICAvLyBJbnRlZ2VyL0ZQIHZhbHVlcyBnZXQgc3RvcmVkIGluIHN0YWNrIHNsb3RzIHRoYXQgYXJlIDggYnl0ZXMgaW4gc2l6ZSBhbmQKKyAgLy8gOC1ieXRlIGFsaWduZWQgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcmVnaXN0ZXJzIHRvIGhvbGQgdGhlbS4KKyAgQ0NJZlR5cGU8W2kzMiwgaTY0LCBmMzIsIGY2NF0sIENDQXNzaWduVG9TdGFjazw4LCA4Pj4sCisgIAorICAvLyBWZWN0b3JzIGdldCAxNi1ieXRlIHN0YWNrIHNsb3RzIHRoYXQgYXJlIDE2LWJ5dGUgYWxpZ25lZC4KKyAgQ0NJZlR5cGU8W3YxNmk4LCB2OGkxNiwgdjRpMzIsIHYyaTY0LCB2NGYzMiwgdjJmNjRdLAorICAgICAgICAgICAgICBDQ0Fzc2lnblRvU3RhY2s8MTYsIDE2Pj4KK10+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUZyYW1lSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVRnJhbWVJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ3YmE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUZyYW1lSW5mby5jcHAKQEAgLTAsMCArMSwyOSBAQAorLy89PT0tLSBTUFVUYXJnZXRNYWNoaW5lLmNwcCAtIERlZmluZSBUYXJnZXRNYWNoaW5lIGZvciBDZWxsIFNQVSAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUb3AtbGV2ZWwgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBDZWxsIFNQVSB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNQVS5oIgorI2luY2x1ZGUgIlNQVUZyYW1lSW5mby5oIgorI2luY2x1ZGUgIlNQVVJlZ2lzdGVyTmFtZXMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU1BVRnJhbWVJbmZvOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworU1BVRnJhbWVJbmZvOjpTUFVGcmFtZUluZm8oY29uc3QgVGFyZ2V0TWFjaGluZSAmdG0pOgorICBUYXJnZXRGcmFtZUluZm8oVGFyZ2V0RnJhbWVJbmZvOjpTdGFja0dyb3dzRG93biwgMTYsIDApLAorICBUTSh0bSkKK3sKKyAgTFJbMF0uZmlyc3QgPSBTUFU6OlIwOworICBMUlswXS5zZWNvbmQgPSAxNjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVGcmFtZUluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVGcmFtZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTExYWNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUZyYW1lSW5mby5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vPT09LS0gU1BVRnJhbWVJbmZvLmggLSBUb3AtbGV2ZWwgaW50ZXJmYWNlIGZvciBDZWxsIFNQVSBUYXJnZXQgLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIENlbGxTUFUgZnJhbWUgaW5mb3JtYXRpb24gdGhhdCBkb2Vzbid0IGZpdCBhbnl3aGVyZSBlbHNlCisvLyBjbGVhbmx5Li4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmICFkZWZpbmVkKFNQVUZSQU1FSU5GT19IKQorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlNQVVJlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFNQVUZyYW1lSW5mbzogcHVibGljIFRhcmdldEZyYW1lSW5mbyB7CisgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE07CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBpbnQ+IExSWzFdOworCisgIHB1YmxpYzoKKyAgICBTUFVGcmFtZUluZm8oY29uc3QgVGFyZ2V0TWFjaGluZSAmdG0pOworCisgICAgLy8hIFJldHVybiBhIGZ1bmN0aW9uJ3Mgc2F2ZWQgc3BpbGwgc2xvdHMKKyAgICAvKiEKKyAgICAgIEZvciBDZWxsU1BVLCBhIGZ1bmN0aW9uJ3Mgc2F2ZWQgc3BpbGwgc2xvdHMgaXMganVzdCB0aGUgbGluayByZWdpc3Rlci4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnBhaXI8dW5zaWduZWQsIGludD4gKgorICAgIGdldENhbGxlZVNhdmVTcGlsbFNsb3RzKHVuc2lnbmVkICZOdW1FbnRyaWVzKSBjb25zdDsKKworICAgIC8vISBTdGFjayBzbG90IHNpemUgKDE2IGJ5dGVzKQorICAgIHN0YXRpYyBpbnQgc3RhY2tTbG90U2l6ZSgpIHsKKyAgICAgIHJldHVybiAxNjsKKyAgICB9CisgICAgLy8hIE1heGltdW0gZnJhbWUgb2Zmc2V0IHJlcHJlc2VudGFibGUgYnkgYSBzaWduZWQgMTAtYml0IGludGVnZXIKKyAgICAvKiEKKyAgICAgIFRoaXMgaXMgdGhlIG1heGltdW0gZnJhbWUgb2Zmc2V0IHRoYXQgY2FuIGJlIGV4cHJlc3NlZCBhcyBhIDEwLWJpdAorICAgICAgaW50ZWdlciwgdXNlZCBpbiBELWZvcm0gYWRkcmVzc2VzLgorICAgICAqLworICAgIHN0YXRpYyBpbnQgbWF4RnJhbWVPZmZzZXQoKSB7CisgICAgICByZXR1cm4gKCgxIDw8IDkpIC0gMSkgKiBzdGFja1Nsb3RTaXplKCk7CisgICAgfQorICAgIC8vISBNaW5pbXVtIGZyYW1lIG9mZnNldCByZXByZXNlbnRhYmxlIGJ5IGEgc2lnbmVkIDEwLWJpdCBpbnRlZ2VyCisgICAgc3RhdGljIGludCBtaW5GcmFtZU9mZnNldCgpIHsKKyAgICAgIHJldHVybiAtKDEgPDwgOSkgKiBzdGFja1Nsb3RTaXplKCk7CisgICAgfQorICAgIC8vISBNaW5pbXVtIGZyYW1lIHNpemUgKGVub3VnaCB0byBzcGlsbCBMUiArIFNQKQorICAgIHN0YXRpYyBpbnQgbWluU3RhY2tTaXplKCkgeworICAgICAgcmV0dXJuICgyICogc3RhY2tTbG90U2l6ZSgpKTsKKyAgICB9CisgICAgLy8hIENvbnZlcnQgZnJhbWUgaW5kZXggdG8gc3RhY2sgb2Zmc2V0CisgICAgc3RhdGljIGludCBGSXRvU3RhY2tPZmZzZXQoaW50IGZyYW1lX2luZGV4KSB7CisgICAgICByZXR1cm4gZnJhbWVfaW5kZXggKiBzdGFja1Nsb3RTaXplKCk7CisgICAgfQorICAgIC8vISBOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHJlcXVpcmVkIHRvIG92ZXJjb21lIGhpbnQtZm9yLWJyYW5jaCBsYXRlbmN5CisgICAgLyohCisgICAgICBIQlIgKGhpbnQtZm9yLWJyYW5jaCkgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBpbnNlcnRlZCB3aGVuLCBmb3IgZXhhbXBsZSwKKyAgICAgIHdlIGtub3cgdGhhdCBhIGdpdmVuIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIGJlIGNhbGxlZCwgc3VjaCBhcyBwcmludGYoKSwKKyAgICAgIGluIHRoZSBjb250cm9sIGZsb3cgZ3JhcGguIEhCUnMgYXJlIG9ubHkgaW5zZXJ0ZWQgaWYgYSBzdWZmaWNpZW50IG51bWJlcgorICAgICAgb2YgaW5zdHJ1Y3Rpb25zIG9jY3VycyBiZXR3ZWVuIHRoZSBIQlIgYW5kIHRoZSB0YXJnZXQuIEN1cnJlbnRseSwgSEJScworICAgICAgdGFrZSA2IGN5Y2xlcywgZXJnbywgdGhlIG1hZ2ljIG51bWJlciA2LgorICAgICAqLworICAgIHN0YXRpYyBpbnQgYnJhbmNoSGludFBlbmFsdHkoKSB7CisgICAgICByZXR1cm4gNjsKKyAgICB9CisgIH07Cit9CisKKyNkZWZpbmUgU1BVRlJBTUVJTkZPX0ggMQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVSGF6YXJkUmVjb2duaXplcnMuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUhhemFyZFJlY29nbml6ZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGJhYjFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUhhemFyZFJlY29nbml6ZXJzLmNwcApAQCAtMCwwICsxLDEzOSBAQAorLy89PT0tLSBTUFVIYXphcmRSZWNvZ25pemVycy5jcHAgLSBDZWxsIEhhemFyZCBSZWNvZ25pemVyIEltcGxzIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBoYXphcmQgcmVjb2duaXplcnMgZm9yIHNjaGVkdWxpbmcgb24gQ2VsbCBTUFUKKy8vIHByb2Nlc3NvcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzY2hlZCIKKworI2luY2x1ZGUgIlNQVUhhemFyZFJlY29nbml6ZXJzLmgiCisjaW5jbHVkZSAiU1BVLmgiCisjaW5jbHVkZSAiU1BVSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENlbGwgU1BVIGhhemFyZCByZWNvZ25pemVyCisvLworLy8gVGhpcyBpcyB0aGUgcGlwZWxpbmUgaGF6YXJkIHJlY29nbml6ZXIgZm9yIHRoZSBDZWxsIFNQVSBwcm9jZXNzb3IuIEl0IGRvZXMKKy8vIHZlcnkgbGl0dGxlIHJpZ2h0IG5vdy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NQVUhhemFyZFJlY29nbml6ZXI6OlNQVUhhemFyZFJlY29nbml6ZXIoY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpIDoKKyAgVElJKHRpaSksCisgIEV2ZW5PZGQoMCkKK3sKK30KKworLy8vIFJldHVybiB0aGUgcGlwZWxpbmUgaGF6YXJkIHR5cGUgZW5jb3VudGVyZWQgb3IgZ2VuZXJhdGVkIGJ5IHRoaXMKKy8vLyBpbnN0cnVjdGlvbi4gQ3VycmVudGx5IHJldHVybnMgTm9IYXphcmQuCisvLy8KKy8vLyBccmV0dXJuIE5vSGF6YXJkCitTY2hlZHVsZUhhemFyZFJlY29nbml6ZXI6OkhhemFyZFR5cGUKK1NQVUhhemFyZFJlY29nbml6ZXI6OmdldEhhemFyZFR5cGUoU1VuaXQgKlNVKQoreworICAvLyBJbml0aWFsIHRob3VnaHRzIG9uIGhvdyB0byBkbyB0aGlzLCBidXQgdGhpcyBjb2RlIGNhbm5vdCB3b3JrIHVubGVzcyB0aGUKKyAgLy8gZnVuY3Rpb24ncyBwcm9sb2cgYW5kIGVwaWxvZyBjb2RlIGFyZSBhbHNvIGJlaW5nIHNjaGVkdWxlZCBzbyB0aGF0IHdlIGNhbgorICAvLyBhY2N1cmF0ZWx5IGRldGVybWluZSB3aGljaCBwaXBlbGluZSBpcyBiZWluZyBzY2hlZHVsZWQuCisjaWYgMAorICBjb25zdCBTRE5vZGUgKk5vZGUgPSBTVS0+Z2V0Tm9kZSgpLT5nZXRGbGFnZ2VkTWFjaGluZU5vZGUoKTsKKyAgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyOjpIYXphcmRUeXBlIHJldHZhbCA9IE5vSGF6YXJkOworICBib29sIG11c3RCZU9kZCA9IGZhbHNlOworCisgIHN3aXRjaCAoTm9kZS0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBTUFU6OkxRRHYxNmk4OgorICBjYXNlIFNQVTo6TFFEdjhpMTY6CisgIGNhc2UgU1BVOjpMUUR2NGkzMjoKKyAgY2FzZSBTUFU6OkxRRHY0ZjMyOgorICBjYXNlIFNQVTo6TFFEdjJmNjQ6CisgIGNhc2UgU1BVOjpMUURyMTI4OgorICBjYXNlIFNQVTo6TFFEcjY0OgorICBjYXNlIFNQVTo6TFFEcjMyOgorICBjYXNlIFNQVTo6TFFEcjE2OgorICBjYXNlIFNQVTo6TFFBdjE2aTg6CisgIGNhc2UgU1BVOjpMUUF2OGkxNjoKKyAgY2FzZSBTUFU6OkxRQXY0aTMyOgorICBjYXNlIFNQVTo6TFFBdjRmMzI6CisgIGNhc2UgU1BVOjpMUUF2MmY2NDoKKyAgY2FzZSBTUFU6OkxRQXIxMjg6CisgIGNhc2UgU1BVOjpMUUFyNjQ6CisgIGNhc2UgU1BVOjpMUUFyMzI6CisgIGNhc2UgU1BVOjpMUVh2NGkzMjoKKyAgY2FzZSBTUFU6OkxRWHIxMjg6CisgIGNhc2UgU1BVOjpMUVhyNjQ6CisgIGNhc2UgU1BVOjpMUVhyMzI6CisgIGNhc2UgU1BVOjpMUVhyMTY6CisgIGNhc2UgU1BVOjpTVFFEdjE2aTg6CisgIGNhc2UgU1BVOjpTVFFEdjhpMTY6CisgIGNhc2UgU1BVOjpTVFFEdjRpMzI6CisgIGNhc2UgU1BVOjpTVFFEdjRmMzI6CisgIGNhc2UgU1BVOjpTVFFEdjJmNjQ6CisgIGNhc2UgU1BVOjpTVFFEcjEyODoKKyAgY2FzZSBTUFU6OlNUUURyNjQ6CisgIGNhc2UgU1BVOjpTVFFEcjMyOgorICBjYXNlIFNQVTo6U1RRRHIxNjoKKyAgY2FzZSBTUFU6OlNUUURyODoKKyAgY2FzZSBTUFU6OlNUUUF2MTZpODoKKyAgY2FzZSBTUFU6OlNUUUF2OGkxNjoKKyAgY2FzZSBTUFU6OlNUUUF2NGkzMjoKKyAgY2FzZSBTUFU6OlNUUUF2NGYzMjoKKyAgY2FzZSBTUFU6OlNUUUF2MmY2NDoKKyAgY2FzZSBTUFU6OlNUUUFyMTI4OgorICBjYXNlIFNQVTo6U1RRQXI2NDoKKyAgY2FzZSBTUFU6OlNUUUFyMzI6CisgIGNhc2UgU1BVOjpTVFFBcjE2OgorICBjYXNlIFNQVTo6U1RRQXI4OgorICBjYXNlIFNQVTo6U1RRWHYxNmk4OgorICBjYXNlIFNQVTo6U1RRWHY4aTE2OgorICBjYXNlIFNQVTo6U1RRWHY0aTMyOgorICBjYXNlIFNQVTo6U1RRWHY0ZjMyOgorICBjYXNlIFNQVTo6U1RRWHYyZjY0OgorICBjYXNlIFNQVTo6U1RRWHIxMjg6CisgIGNhc2UgU1BVOjpTVFFYcjY0OgorICBjYXNlIFNQVTo6U1RRWHIzMjoKKyAgY2FzZSBTUFU6OlNUUVhyMTY6CisgIGNhc2UgU1BVOjpTVFFYcjg6CisgIGNhc2UgU1BVOjpSRVQ6CisgICAgbXVzdEJlT2RkID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICAvLyBBc3N1bWUgdGhhdCB0aGlzIGluc3RydWN0aW9uIGNhbiBiZSBvbiB0aGUgZXZlbiBwaXBlCisgICAgYnJlYWs7CisgIH0KKworICBpZiAobXVzdEJlT2RkICYmICFFdmVuT2RkKQorICAgIHJldHZhbCA9IEhhemFyZDsKKworICBERUJVRyhlcnJzKCkgPDwgIlNQVUhhemFyZFJlY29nbml6ZXIgRXZlbk9kZCAiIDw8IEV2ZW5PZGQgPDwgIiBIYXphcmQgIgorICAgICAgICAgICAgICAgPDwgcmV0dmFsIDw8ICJcbiIpOworICBFdmVuT2RkIF49IDE7CisgIHJldHVybiByZXR2YWw7CisjZWxzZQorICByZXR1cm4gTm9IYXphcmQ7CisjZW5kaWYKK30KKwordm9pZCBTUFVIYXphcmRSZWNvZ25pemVyOjpFbWl0SW5zdHJ1Y3Rpb24oU1VuaXQgKlNVKQoreworfQorCit2b2lkIFNQVUhhemFyZFJlY29nbml6ZXI6OkFkdmFuY2VDeWNsZSgpCit7CisgIERFQlVHKGVycnMoKSA8PCAiU1BVSGF6YXJkUmVjb2duaXplcjo6QWR2YW5jZUN5Y2xlXG4iKTsKK30KKwordm9pZCBTUFVIYXphcmRSZWNvZ25pemVyOjpFbWl0Tm9vcCgpCit7CisgIEFkdmFuY2VDeWNsZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUhhemFyZFJlY29nbml6ZXJzLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVSGF6YXJkUmVjb2duaXplcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGFlMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUhhemFyZFJlY29nbml6ZXJzLmgKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tLSBTUFVIYXphcmRSZWNvZ25pemVycy5oIC0gQ2VsbCBTUFUgSGF6YXJkIFJlY29nbml6ZXIgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBoYXphcmQgcmVjb2duaXplcnMgZm9yIHNjaGVkdWxpbmcgb24gdGhlIENlbGwgU1BVCisvLyBwcm9jZXNzb3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTUFVIQVpSRUNTX0gKKyNkZWZpbmUgU1BVSEFaUkVDU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworICAKKy8vLyBTUFVIYXphcmRSZWNvZ25pemVyCitjbGFzcyBTUFVIYXphcmRSZWNvZ25pemVyIDogcHVibGljIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplcgoreworcHJpdmF0ZToKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUk7CisgIGludCBFdmVuT2RkOworCitwdWJsaWM6CisgIFNQVUhhemFyZFJlY29nbml6ZXIoY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkpOworICB2aXJ0dWFsIEhhemFyZFR5cGUgZ2V0SGF6YXJkVHlwZShTVW5pdCAqU1UpOworICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKFNVbml0ICpTVSk7CisgIHZpcnR1YWwgdm9pZCBBZHZhbmNlQ3ljbGUoKTsKKyAgdmlydHVhbCB2b2lkIEVtaXROb29wKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJU2VsREFHVG9EQUcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUlTZWxEQUdUb0RBRy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyNDE3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJU2VsREFHVG9EQUcuY3BwCkBAIC0wLDAgKzEsMTI2MSBAQAorLy89PT0tLSBTUFVJU2VsREFHVG9EQUcuY3BwIC0gQ2VsbFNQVSBwYXR0ZXJuIG1hdGNoaW5nIGluc3Qgc2VsZWN0b3IgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHBhdHRlcm4gbWF0Y2hpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgZm9yIHRoZSBDZWxsIFNQVSwKKy8vIGNvbnZlcnRpbmcgZnJvbSBhIGxlZ2FsaXplZCBkYWcgdG8gYSBTUFUtdGFyZ2V0IGRhZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiU1BVLmgiCisjaW5jbHVkZSAiU1BVVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlNQVUhhemFyZFJlY29nbml6ZXJzLmgiCisjaW5jbHVkZSAiU1BVRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAiU1BVUmVnaXN0ZXJOYW1lcy5oIgorI2luY2x1ZGUgIlNQVVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKyAgLy8hIENvbnN0YW50U0ROb2RlIHByZWRpY2F0ZSBmb3IgaTMyIHNpZ24tZXh0ZW5kZWQsIDEwLWJpdCBpbW1lZGlhdGVzCisgIGJvb2wKKyAgaXNJNjRJbnRTMTBJbW1lZGlhdGUoQ29uc3RhbnRTRE5vZGUgKkNOKQorICB7CisgICAgcmV0dXJuIGlzSW50PDEwPihDTi0+Z2V0U0V4dFZhbHVlKCkpOworICB9CisKKyAgLy8hIENvbnN0YW50U0ROb2RlIHByZWRpY2F0ZSBmb3IgaTMyIHNpZ24tZXh0ZW5kZWQsIDEwLWJpdCBpbW1lZGlhdGVzCisgIGJvb2wKKyAgaXNJMzJJbnRTMTBJbW1lZGlhdGUoQ29uc3RhbnRTRE5vZGUgKkNOKQorICB7CisgICAgcmV0dXJuIGlzSW50PDEwPihDTi0+Z2V0U0V4dFZhbHVlKCkpOworICB9CisKKyAgLy8hIENvbnN0YW50U0ROb2RlIHByZWRpY2F0ZSBmb3IgaTMyIHVuc2lnbmVkIDEwLWJpdCBpbW1lZGlhdGUgdmFsdWVzCisgIGJvb2wKKyAgaXNJMzJJbnRVMTBJbW1lZGlhdGUoQ29uc3RhbnRTRE5vZGUgKkNOKQorICB7CisgICAgcmV0dXJuIGlzVUludDwxMD4oQ04tPmdldFNFeHRWYWx1ZSgpKTsKKyAgfQorCisgIC8vISBDb25zdGFudFNETm9kZSBwcmVkaWNhdGUgZm9yIGkxNiBzaWduLWV4dGVuZGVkLCAxMC1iaXQgaW1tZWRpYXRlIHZhbHVlcworICBib29sCisgIGlzSTE2SW50UzEwSW1tZWRpYXRlKENvbnN0YW50U0ROb2RlICpDTikKKyAgeworICAgIHJldHVybiBpc0ludDwxMD4oQ04tPmdldFNFeHRWYWx1ZSgpKTsKKyAgfQorCisgIC8vISBTRE5vZGUgcHJlZGljYXRlIGZvciBpMTYgc2lnbi1leHRlbmRlZCwgMTAtYml0IGltbWVkaWF0ZSB2YWx1ZXMKKyAgYm9vbAorICBpc0kxNkludFMxMEltbWVkaWF0ZShTRE5vZGUgKk4pCisgIHsKKyAgICBDb25zdGFudFNETm9kZSAqQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTik7CisgICAgcmV0dXJuIChDTiAhPSAwICYmIGlzSTE2SW50UzEwSW1tZWRpYXRlKENOKSk7CisgIH0KKworICAvLyEgQ29uc3RhbnRTRE5vZGUgcHJlZGljYXRlIGZvciBpMTYgdW5zaWduZWQgMTAtYml0IGltbWVkaWF0ZSB2YWx1ZXMKKyAgYm9vbAorICBpc0kxNkludFUxMEltbWVkaWF0ZShDb25zdGFudFNETm9kZSAqQ04pCisgIHsKKyAgICByZXR1cm4gaXNVSW50PDEwPigoc2hvcnQpIENOLT5nZXRaRXh0VmFsdWUoKSk7CisgIH0KKworICAvLyEgU0ROb2RlIHByZWRpY2F0ZSBmb3IgaTE2IHNpZ24tZXh0ZW5kZWQsIDEwLWJpdCBpbW1lZGlhdGUgdmFsdWVzCisgIGJvb2wKKyAgaXNJMTZJbnRVMTBJbW1lZGlhdGUoU0ROb2RlICpOKQorICB7CisgICAgcmV0dXJuIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50CisgICAgICAgICAgICAmJiBpc0kxNkludFUxMEltbWVkaWF0ZShjYXN0PENvbnN0YW50U0ROb2RlPihOKSkpOworICB9CisKKyAgLy8hIENvbnN0YW50U0ROb2RlIHByZWRpY2F0ZSBmb3Igc2lnbmVkIDE2LWJpdCB2YWx1ZXMKKyAgLyohCisgICAgXGFyZyBDTiBUaGUgY29uc3RhbnQgU2VsZWN0aW9uREFHIG5vZGUgaG9sZGluZyB0aGUgdmFsdWUKKyAgICBcYXJnIEltbSBUaGUgcmV0dXJuZWQgMTYtYml0IHZhbHVlLCBpZiByZXR1cm5pbmcgdHJ1ZQorCisgICAgVGhpcyBwcmVkaWNhdGUgdGVzdHMgdGhlIHZhbHVlIGluIFxhIENOIHRvIHNlZSB3aGV0aGVyIGl0IGNhbiBiZQorICAgIHJlcHJlc2VudGVkIGFzIGEgMTYtYml0LCBzaWduLWV4dGVuZGVkIHF1YW50aXR5LiBSZXR1cm5zIHRydWUgaWYKKyAgICB0aGlzIGlzIHRoZSBjYXNlLgorICAgKi8KKyAgYm9vbAorICBpc0ludFMxNkltbWVkaWF0ZShDb25zdGFudFNETm9kZSAqQ04sIHNob3J0ICZJbW0pCisgIHsKKyAgICBFVlQgdnQgPSBDTi0+Z2V0VmFsdWVUeXBlKDApOworICAgIEltbSA9IChzaG9ydCkgQ04tPmdldFpFeHRWYWx1ZSgpOworICAgIGlmICh2dC5nZXRTaW1wbGVWVCgpID49IE1WVDo6aTEgJiYgdnQuZ2V0U2ltcGxlVlQoKSA8PSBNVlQ6OmkxNikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmICh2dCA9PSBNVlQ6OmkzMikgeworICAgICAgaW50MzJfdCBpX3ZhbCA9IChpbnQzMl90KSBDTi0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBzaG9ydCBzX3ZhbCA9IChzaG9ydCkgaV92YWw7CisgICAgICByZXR1cm4gaV92YWwgPT0gc192YWw7CisgICAgfSBlbHNlIHsKKyAgICAgIGludDY0X3QgaV92YWwgPSAoaW50NjRfdCkgQ04tPmdldFpFeHRWYWx1ZSgpOworICAgICAgc2hvcnQgc192YWwgPSAoc2hvcnQpIGlfdmFsOworICAgICAgcmV0dXJuIGlfdmFsID09IHNfdmFsOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vISBTRE5vZGUgcHJlZGljYXRlIGZvciBzaWduZWQgMTYtYml0IHZhbHVlcy4KKyAgYm9vbAorICBpc0ludFMxNkltbWVkaWF0ZShTRE5vZGUgKk4sIHNob3J0ICZJbW0pCisgIHsKKyAgICByZXR1cm4gKE4tPmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQKKyAgICAgICAgICAgICYmIGlzSW50UzE2SW1tZWRpYXRlKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4pLCBJbW0pKTsKKyAgfQorCisgIC8vISBDb25zdGFudEZQU0ROb2RlIHByZWRpY2F0ZSBmb3IgcmVwcmVzZW50aW5nIGZsb2F0cyBhcyAxNi1iaXQgc2lnbiBleHQuCisgIHN0YXRpYyBib29sCisgIGlzRlBTMTZJbW1lZGlhdGUoQ29uc3RhbnRGUFNETm9kZSAqRlBOLCBzaG9ydCAmSW1tKQorICB7CisgICAgRVZUIHZ0ID0gRlBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgaWYgKHZ0ID09IE1WVDo6ZjMyKSB7CisgICAgICBpbnQgdmFsID0gRmxvYXRUb0JpdHMoRlBOLT5nZXRWYWx1ZUFQRigpLmNvbnZlcnRUb0Zsb2F0KCkpOworICAgICAgaW50IHN2YWwgPSAoaW50KSAoKHZhbCA8PCAxNikgPj4gMTYpOworICAgICAgSW1tID0gKHNob3J0KSB2YWw7CisgICAgICByZXR1cm4gdmFsID09IHN2YWw7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbAorICBpc0hpZ2hMb3coY29uc3QgU0RWYWx1ZSAmT3ApCisgIHsKKyAgICByZXR1cm4gKE9wLmdldE9wY29kZSgpID09IFNQVUlTRDo6SW5kaXJlY3RBZGRyCisgICAgICAgICAgICAmJiAoKE9wLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpIaQorICAgICAgICAgICAgICAgICAmJiBPcC5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IFNQVUlTRDo6TG8pCisgICAgICAgICAgICAgICAgfHwgKE9wLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpMbworICAgICAgICAgICAgICAgICAgICAmJiBPcC5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IFNQVUlTRDo6SGkpKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vISBFVlQgdG8gInVzZWZ1bCBzdHVmZiIgbWFwcGluZyBzdHJ1Y3R1cmU6CisKKyAgc3RydWN0IHZhbHR5cGVfbWFwX3MgeworICAgIEVWVCBWVDsKKyAgICB1bnNpZ25lZCBsZHJlc3VsdF9pbnM7ICAgICAgLy8vIExEUkVTVUxUIGluc3RydWN0aW9uICgwID0gdW5kZWZpbmVkKQorICAgIGJvb2wgbGRyZXN1bHRfaW1tOyAgICAgICAgICAvLy8gTERSRVNVTFQgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgaW1tZWRpYXRlPworICAgIHVuc2lnbmVkIGxyaW5zdDsgICAgICAgICAgICAvLy8gTFIgaW5zdHJ1Y3Rpb24KKyAgfTsKKworICBjb25zdCB2YWx0eXBlX21hcF9zIHZhbHR5cGVfbWFwW10gPSB7CisgICAgeyBNVlQ6Omk4LCAgICBTUFU6Ok9SQklyOCwgIHRydWUsICBTUFU6OkxScjggfSwKKyAgICB7IE1WVDo6aTE2LCAgIFNQVTo6T1JISXIxNiwgdHJ1ZSwgIFNQVTo6TFJyMTYgfSwKKyAgICB7IE1WVDo6aTMyLCAgIFNQVTo6T1JJcjMyLCAgdHJ1ZSwgIFNQVTo6TFJyMzIgfSwKKyAgICB7IE1WVDo6aTY0LCAgIFNQVTo6T1JyNjQsICAgZmFsc2UsIFNQVTo6TFJyNjQgfSwKKyAgICB7IE1WVDo6ZjMyLCAgIFNQVTo6T1JmMzIsICAgZmFsc2UsIFNQVTo6TFJmMzIgfSwKKyAgICB7IE1WVDo6ZjY0LCAgIFNQVTo6T1JmNjQsICAgZmFsc2UsIFNQVTo6TFJmNjQgfSwKKyAgICAvLyB2ZWN0b3IgdHlwZXMuLi4gKHNpZ2ghKQorICAgIHsgTVZUOjp2MTZpOCwgMCwgICAgICAgICAgICBmYWxzZSwgU1BVOjpMUnYxNmk4IH0sCisgICAgeyBNVlQ6OnY4aTE2LCAwLCAgICAgICAgICAgIGZhbHNlLCBTUFU6OkxSdjhpMTYgfSwKKyAgICB7IE1WVDo6djRpMzIsIDAsICAgICAgICAgICAgZmFsc2UsIFNQVTo6TFJ2NGkzMiB9LAorICAgIHsgTVZUOjp2Mmk2NCwgMCwgICAgICAgICAgICBmYWxzZSwgU1BVOjpMUnYyaTY0IH0sCisgICAgeyBNVlQ6OnY0ZjMyLCAwLCAgICAgICAgICAgIGZhbHNlLCBTUFU6OkxSdjRmMzIgfSwKKyAgICB7IE1WVDo6djJmNjQsIDAsICAgICAgICAgICAgZmFsc2UsIFNQVTo6TFJ2MmY2NCB9CisgIH07CisKKyAgY29uc3Qgc2l6ZV90IG5fdmFsdHlwZV9tYXAgPSBzaXplb2YodmFsdHlwZV9tYXApIC8gc2l6ZW9mKHZhbHR5cGVfbWFwWzBdKTsKKworICBjb25zdCB2YWx0eXBlX21hcF9zICpnZXRWYWx1ZVR5cGVNYXBFbnRyeShFVlQgVlQpCisgIHsKKyAgICBjb25zdCB2YWx0eXBlX21hcF9zICpyZXR2YWwgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbl92YWx0eXBlX21hcDsgKytpKSB7CisgICAgICBpZiAodmFsdHlwZV9tYXBbaV0uVlQgPT0gVlQpIHsKKyAgICAgICAgcmV0dmFsID0gdmFsdHlwZV9tYXAgKyBpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiU1BVSVNlbERBR1RvREFHLmNwcDogZ2V0VmFsdWVUeXBlTWFwRW50cnkgcmV0dXJucyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBmb3IgIiArIFR3aW5lKFZULmdldEVWVFN0cmluZygpKSk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gcmV0dmFsOworICB9CisKKyAgLy8hIEdlbmVyYXRlIHRoZSBjYXJyeS1nZW5lcmF0ZSBzaHVmZmxlIG1hc2suCisgIFNEVmFsdWUgZ2V0Q2FycnlHZW5lcmF0ZVNodWZNYXNrKFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCkgeworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2ID4gU2h1ZkJ5dGVzOworCisgICAgLy8gQ3JlYXRlIHRoZSBzaHVmZmxlIG1hc2sgZm9yICJyb3RhdGluZyIgdGhlIGJvcnJvdyB1cCBvbmUgcmVnaXN0ZXIgc2xvdAorICAgIC8vIG9uY2UgdGhlIGJvcnJvdyBpcyBnZW5lcmF0ZWQuCisgICAgU2h1ZkJ5dGVzLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoMHgwNDA1MDYwNywgTVZUOjppMzIpKTsKKyAgICBTaHVmQnl0ZXMucHVzaF9iYWNrKERBRy5nZXRDb25zdGFudCgweDgwODA4MDgwLCBNVlQ6OmkzMikpOworICAgIFNodWZCeXRlcy5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KDB4MGMwZDBlMGYsIE1WVDo6aTMyKSk7CisgICAgU2h1ZkJ5dGVzLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoMHg4MDgwODA4MCwgTVZUOjppMzIpKTsKKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djRpMzIsCisgICAgICAgICAgICAgICAgICAgICAgICZTaHVmQnl0ZXNbMF0sIFNodWZCeXRlcy5zaXplKCkpOworICB9CisKKyAgLy8hIEdlbmVyYXRlIHRoZSBib3Jyb3ctZ2VuZXJhdGUgc2h1ZmZsZSBtYXNrCisgIFNEVmFsdWUgZ2V0Qm9ycm93R2VuZXJhdGVTaHVmTWFzayhTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwpIHsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNiA+IFNodWZCeXRlczsKKworICAgIC8vIENyZWF0ZSB0aGUgc2h1ZmZsZSBtYXNrIGZvciAicm90YXRpbmciIHRoZSBib3Jyb3cgdXAgb25lIHJlZ2lzdGVyIHNsb3QKKyAgICAvLyBvbmNlIHRoZSBib3Jyb3cgaXMgZ2VuZXJhdGVkLgorICAgIFNodWZCeXRlcy5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KDB4MDQwNTA2MDcsIE1WVDo6aTMyKSk7CisgICAgU2h1ZkJ5dGVzLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoMHhjMGMwYzBjMCwgTVZUOjppMzIpKTsKKyAgICBTaHVmQnl0ZXMucHVzaF9iYWNrKERBRy5nZXRDb25zdGFudCgweDBjMGQwZTBmLCBNVlQ6OmkzMikpOworICAgIFNodWZCeXRlcy5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KDB4YzBjMGMwYzAsIE1WVDo6aTMyKSk7CisKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAmU2h1ZkJ5dGVzWzBdLCBTaHVmQnl0ZXMuc2l6ZSgpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNQVURBR1RvREFHSVNlbCAtIENlbGwgU1BVLXNwZWNpZmljIGNvZGUgdG8gc2VsZWN0IFNQVSBtYWNoaW5lCisgIC8vLyBpbnN0cnVjdGlvbnMgZm9yIFNlbGVjdGlvbkRBRyBvcGVyYXRpb25zLgorICAvLy8KKyAgY2xhc3MgU1BVREFHVG9EQUdJU2VsIDoKKyAgICBwdWJsaWMgU2VsZWN0aW9uREFHSVNlbAorICB7CisgICAgY29uc3QgU1BVVGFyZ2V0TWFjaGluZSAmVE07CisgICAgY29uc3QgU1BVVGFyZ2V0TG93ZXJpbmcgJlNQVXRsaTsKKyAgICB1bnNpZ25lZCBHbG9iYWxCYXNlUmVnOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTUFVEQUdUb0RBR0lTZWwoU1BVVGFyZ2V0TWFjaGluZSAmdG0pIDoKKyAgICAgIFNlbGVjdGlvbkRBR0lTZWwodG0pLAorICAgICAgVE0odG0pLAorICAgICAgU1BVdGxpKCp0bS5nZXRUYXJnZXRMb3dlcmluZygpKQorICAgIHsgfQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgICAgIC8vIE1ha2Ugc3VyZSB3ZSByZS1lbWl0IGEgc2V0IG9mIHRoZSBnbG9iYWwgYmFzZSByZWcgaWYgbmVjZXNzYXJ5CisgICAgICBHbG9iYWxCYXNlUmVnID0gMDsKKyAgICAgIFNlbGVjdGlvbkRBR0lTZWw6OnJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1GKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBnZXRJMzJJbW0gLSBSZXR1cm4gYSB0YXJnZXQgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLCBvZiB0eXBlCisgICAgLy8vIGkzMi4KKyAgICBpbmxpbmUgU0RWYWx1ZSBnZXRJMzJJbW0odWludDMyX3QgSW1tKSB7CisgICAgICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChJbW0sIE1WVDo6aTMyKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0STY0SW1tIC0gUmV0dXJuIGEgdGFyZ2V0IGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSwgb2YgdHlwZQorICAgIC8vLyBpNjQuCisgICAgaW5saW5lIFNEVmFsdWUgZ2V0STY0SW1tKHVpbnQ2NF90IEltbSkgeworICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoSW1tLCBNVlQ6Omk2NCk7CisgICAgfQorCisgICAgLy8vIGdldFNtYWxsSVB0ckltbSAtIFJldHVybiBhIHRhcmdldCBjb25zdGFudCBvZiBwb2ludGVyIHR5cGUuCisgICAgaW5saW5lIFNEVmFsdWUgZ2V0U21hbGxJUHRySW1tKHVuc2lnbmVkIEltbSkgeworICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoSW1tLCBTUFV0bGkuZ2V0UG9pbnRlclR5KCkpOworICAgICAgfQorCisgICAgU0ROb2RlICplbWl0QnVpbGRWZWN0b3IoU0ROb2RlICpidk5vZGUpIHsKKyAgICAgIEVWVCB2ZWNWVCA9IGJ2Tm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICAgICAgRGVidWdMb2MgZGwgPSBidk5vZGUtPmdldERlYnVnTG9jKCk7CisKKyAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHZlY3RvciBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBDZWxsU1BVIGltbWVkaWF0ZQorICAgICAgLy8gY29uc3RhbnQgYnkgaW52b2tpbmcgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gcHJlZGljYXRlczoKKyAgICAgIGlmICgoKHZlY1ZUID09IE1WVDo6djhpMTYpICYmCisgICAgICAgICAgIChTUFU6OmdldF92ZWNfaTE2aW1tKGJ2Tm9kZSwgKkN1ckRBRywgTVZUOjppMTYpLmdldE5vZGUoKSAhPSAwKSkgfHwKKyAgICAgICAgICAoKHZlY1ZUID09IE1WVDo6djRpMzIpICYmCisgICAgICAgICAgICgoU1BVOjpnZXRfdmVjX2kxNmltbShidk5vZGUsICpDdXJEQUcsIE1WVDo6aTMyKS5nZXROb2RlKCkgIT0gMCkgfHwKKyAgICAgICAgICAgIChTUFU6OmdldF9JTEhVdmVjX2ltbShidk5vZGUsICpDdXJEQUcsIE1WVDo6aTMyKS5nZXROb2RlKCkgIT0gMCkgfHwKKyAgICAgICAgICAgIChTUFU6OmdldF92ZWNfdTE4aW1tKGJ2Tm9kZSwgKkN1ckRBRywgTVZUOjppMzIpLmdldE5vZGUoKSAhPSAwKSB8fAorICAgICAgICAgICAgKFNQVTo6Z2V0X3Y0aTMyX2ltbShidk5vZGUsICpDdXJEQUcpLmdldE5vZGUoKSAhPSAwKSkpIHx8CisgICAgICAgICAgKCh2ZWNWVCA9PSBNVlQ6OnYyaTY0KSAmJgorICAgICAgICAgICAoKFNQVTo6Z2V0X3ZlY19pMTZpbW0oYnZOb2RlLCAqQ3VyREFHLCBNVlQ6Omk2NCkuZ2V0Tm9kZSgpICE9IDApIHx8CisgICAgICAgICAgICAoU1BVOjpnZXRfSUxIVXZlY19pbW0oYnZOb2RlLCAqQ3VyREFHLCBNVlQ6Omk2NCkuZ2V0Tm9kZSgpICE9IDApIHx8CisgICAgICAgICAgICAoU1BVOjpnZXRfdmVjX3UxOGltbShidk5vZGUsICpDdXJEQUcsIE1WVDo6aTY0KS5nZXROb2RlKCkgIT0gMCkpKSkgeworICAgICAgICBIYW5kbGVTRE5vZGUgRHVtbXkoU0RWYWx1ZShidk5vZGUsIDApKTsKKyAgICAgICAgaWYgKFNETm9kZSAqTiA9IFNlbGVjdChidk5vZGUpKQorICAgICAgICAgIHJldHVybiBOOworICAgICAgICByZXR1cm4gRHVtbXkuZ2V0VmFsdWUoKS5nZXROb2RlKCk7CisgICAgICB9CisKKyAgICAgIC8vIE5vLCBuZWVkIHRvIGVtaXQgYSBjb25zdGFudCBwb29sIHNwaWxsOgorICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDVjsKKworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidk5vZGUtPmdldE51bU9wZXJhbmRzKCk7ICsraSkgeworICAgICAgICBDb25zdGFudFNETm9kZSAqViA9IGNhc3Q8Q29uc3RhbnRTRE5vZGUgPiAoYnZOb2RlLT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgICAgQ1YucHVzaF9iYWNrKGNvbnN0X2Nhc3Q8Q29uc3RhbnRJbnQgKj4oVi0+Z2V0Q29uc3RhbnRJbnRWYWx1ZSgpKSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IENvbnN0YW50ICpDUCA9IENvbnN0YW50VmVjdG9yOjpnZXQoQ1YpOworICAgICAgU0RWYWx1ZSBDUElkeCA9IEN1ckRBRy0+Z2V0Q29uc3RhbnRQb29sKENQLCBTUFV0bGkuZ2V0UG9pbnRlclR5KCkpOworICAgICAgdW5zaWduZWQgQWxpZ25tZW50ID0gY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KENQSWR4KS0+Z2V0QWxpZ25tZW50KCk7CisgICAgICBTRFZhbHVlIENHUG9vbE9mZnNldCA9CisgICAgICAgICAgICAgIFNQVTo6TG93ZXJDb25zdGFudFBvb2woQ1BJZHgsICpDdXJEQUcsIFRNKTsKKyAgICAgIAorICAgICAgSGFuZGxlU0ROb2RlIER1bW15KEN1ckRBRy0+Z2V0TG9hZCh2ZWNWVCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0RW50cnlOb2RlKCksIENHUG9vbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgQWxpZ25tZW50KSk7CisgICAgICBDdXJEQUctPlJlcGxhY2VBbGxVc2VzV2l0aChTRFZhbHVlKGJ2Tm9kZSwgMCksIER1bW15LmdldFZhbHVlKCkpOworICAgICAgaWYgKFNETm9kZSAqTiA9IFNlbGVjdENvZGUoRHVtbXkuZ2V0VmFsdWUoKS5nZXROb2RlKCkpKQorICAgICAgICByZXR1cm4gTjsKKyAgICAgIHJldHVybiBEdW1teS5nZXRWYWx1ZSgpLmdldE5vZGUoKTsKKyAgICB9CisKKyAgICAvLy8gU2VsZWN0IC0gQ29udmVydCB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgZnJvbSBhIHRhcmdldC1pbmRlcGVuZGVudCB0byBhCisgICAgLy8vIHRhcmdldC1zcGVjaWZpYyBub2RlIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gY2hhbmdlZC4KKyAgICBTRE5vZGUgKlNlbGVjdChTRE5vZGUgKk4pOworCisgICAgLy8hIEVtaXQgdGhlIGluc3RydWN0aW9uIHNlcXVlbmNlIGZvciBpNjQgc2hsCisgICAgU0ROb2RlICpTZWxlY3RTSExpNjQoU0ROb2RlICpOLCBFVlQgT3BWVCk7CisKKyAgICAvLyEgRW1pdCB0aGUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgZm9yIGk2NCBzcmwKKyAgICBTRE5vZGUgKlNlbGVjdFNSTGk2NChTRE5vZGUgKk4sIEVWVCBPcFZUKTsKKworICAgIC8vISBFbWl0IHRoZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IgaTY0IHNyYQorICAgIFNETm9kZSAqU2VsZWN0U1JBaTY0KFNETm9kZSAqTiwgRVZUIE9wVlQpOworCisgICAgLy8hIEVtaXQgdGhlIG5lY2Vzc2FyeSBzZXF1ZW5jZSBmb3IgbG9hZGluZyBpNjQgY29uc3RhbnRzOgorICAgIFNETm9kZSAqU2VsZWN0STY0Q29uc3RhbnQoU0ROb2RlICpOLCBFVlQgT3BWVCwgRGVidWdMb2MgZGwpOworCisgICAgLy8hIEFsdGVybmF0ZSBpbnN0cnVjdGlvbiBlbWl0IHNlcXVlbmNlIGZvciBsb2FkaW5nIGk2NCBjb25zdGFudHMKKyAgICBTRE5vZGUgKlNlbGVjdEk2NENvbnN0YW50KHVpbnQ2NF90IGk2NGNvbnN0LCBFVlQgT3BWVCwgRGVidWdMb2MgZGwpOworCisgICAgLy8hIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBOIGlzIGFuIEEtZm9ybSAobG9jYWwgc3RvcmUpIGFkZHJlc3MKKyAgICBib29sIFNlbGVjdEFGb3JtQWRkcihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSW5kZXgpOworCisgICAgLy8hIEQtZm9ybSBhZGRyZXNzIHByZWRpY2F0ZQorICAgIGJvb2wgU2VsZWN0REZvcm1BZGRyKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZJbmRleCk7CisKKyAgICAvLy8gQWx0ZXJuYXRlIEQtZm9ybSBhZGRyZXNzIHVzaW5nIGk3IG9mZnNldCBwcmVkaWNhdGUKKyAgICBib29sIFNlbGVjdERGb3JtMkFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZEaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlKTsKKworICAgIC8vLyBELWZvcm0gYWRkcmVzcyBzZWxlY3Rpb24gd29ya2hvcnNlCisgICAgYm9vbCBERm9ybUFkZHJlc3NQcmVkaWNhdGUoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZEaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIGludCBtaW5PZmZzZXQsIGludCBtYXhPZmZzZXQpOworCisgICAgLy8hIEFkZHJlc3MgcHJlZGljYXRlIGlmIE4gY2FuIGJlIGV4cHJlc3NlZCBhcyBhbiBpbmRleGVkIFtyK3JdIG9wZXJhdGlvbi4KKyAgICBib29sIFNlbGVjdFhGb3JtQWRkcihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSW5kZXgpOworCisgICAgLy8vIFNlbGVjdElubGluZUFzbU1lbW9yeU9wZXJhbmQgLSBJbXBsZW1lbnQgYWRkcmVzc2luZyBtb2RlIHNlbGVjdGlvbiBmb3IKKyAgICAvLy8gaW5saW5lIGFzbSBleHByZXNzaW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wgU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChjb25zdCBTRFZhbHVlICZPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbnN0cmFpbnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPdXRPcHMpIHsKKyAgICAgIFNEVmFsdWUgT3AwLCBPcDE7CisgICAgICBzd2l0Y2ggKENvbnN0cmFpbnRDb2RlKSB7CisgICAgICBkZWZhdWx0OiByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgJ20nOiAgIC8vIG1lbW9yeQorICAgICAgICBpZiAoIVNlbGVjdERGb3JtQWRkcihPcC5nZXROb2RlKCksIE9wLCBPcDAsIE9wMSkKKyAgICAgICAgICAgICYmICFTZWxlY3RBRm9ybUFkZHIoT3AuZ2V0Tm9kZSgpLCBPcCwgT3AwLCBPcDEpKQorICAgICAgICAgIFNlbGVjdFhGb3JtQWRkcihPcC5nZXROb2RlKCksIE9wLCBPcDAsIE9wMSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnbyc6ICAgLy8gb2Zmc2V0YWJsZQorICAgICAgICBpZiAoIVNlbGVjdERGb3JtQWRkcihPcC5nZXROb2RlKCksIE9wLCBPcDAsIE9wMSkKKyAgICAgICAgICAgICYmICFTZWxlY3RBRm9ybUFkZHIoT3AuZ2V0Tm9kZSgpLCBPcCwgT3AwLCBPcDEpKSB7CisgICAgICAgICAgT3AwID0gT3A7CisgICAgICAgICAgT3AxID0gZ2V0U21hbGxJUHRySW1tKDApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndic6ICAgLy8gbm90IG9mZnNldGFibGUKKyNpZiAxCisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIklubGluZUFzbU1lbW9yeU9wZXJhbmQgJ3YnIGNvbnN0cmFpbnQgbm90IGhhbmRsZWQuIik7CisjZWxzZQorICAgICAgICBTZWxlY3RBZGRySWR4T25seShPcCwgT3AsIE9wMCwgT3AxKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgT3V0T3BzLnB1c2hfYmFjayhPcDApOworICAgICAgT3V0T3BzLnB1c2hfYmFjayhPcDEpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIkNlbGwgU1BVIERBRy0+REFHIFBhdHRlcm4gSW5zdHJ1Y3Rpb24gU2VsZWN0aW9uIjsKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlVGFyZ2V0SGF6YXJkUmVjb2duaXplciAtIFJldHVybiB0aGUgaGF6YXJkIHJlY29nbml6ZXIgdG8gdXNlIGZvcgorICAgIC8vLyB0aGlzIHRhcmdldCB3aGVuIHNjaGVkdWxpbmcgdGhlIERBRy4KKyAgICB2aXJ0dWFsIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplciAqQ3JlYXRlVGFyZ2V0SGF6YXJkUmVjb2duaXplcigpIHsKKyAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqSUkgPSBUTS5nZXRJbnN0ckluZm8oKTsKKyAgICAgIGFzc2VydChJSSAmJiAiTm8gSW5zdHJJbmZvPyIpOworICAgICAgcmV0dXJuIG5ldyBTUFVIYXphcmRSZWNvZ25pemVyKCpJSSk7CisgICAgfQorCisgICAgLy8gSW5jbHVkZSB0aGUgcGllY2VzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0aW9uLgorI2luY2x1ZGUgIlNQVUdlbkRBR0lTZWwuaW5jIgorICB9OworfQorCisvKiEKKyBcYXJnIE9wIFRoZSBJU0QgaW5zdHJ1Y3Rpb24gb3BlcmFuZAorIFxhcmcgTiBUaGUgYWRkcmVzcyB0byBiZSB0ZXN0ZWQKKyBcYXJnIEJhc2UgVGhlIGJhc2UgYWRkcmVzcworIFxhcmcgSW5kZXggVGhlIGJhc2UgYWRkcmVzcyBpbmRleAorICovCitib29sCitTUFVEQUdUb0RBR0lTZWw6OlNlbGVjdEFGb3JtQWRkcihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkluZGV4KSB7CisgIC8vIFRoZXNlIG1hdGNoIHRoZSBhZGRyMjU2ayBvcGVyYW5kIHR5cGU6CisgIEVWVCBPZmZzVlQgPSBNVlQ6OmkxNjsKKyAgU0RWYWx1ZSBaZXJvID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBPZmZzVlQpOworCisgIHN3aXRjaCAoTi5nZXRPcGNvZGUoKSkgeworICBjYXNlIElTRDo6Q29uc3RhbnQ6CisgIGNhc2UgSVNEOjpDb25zdGFudFBvb2w6CisgIGNhc2UgSVNEOjpHbG9iYWxBZGRyZXNzOgorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiU1BVIFNlbGVjdEFGb3JtQWRkcjogQ29uc3RhbnQvUG9vbC9HbG9iYWwgbm90IGxvd2VyZWQuIik7CisgICAgLypOT1RSRUFDSEVEKi8KKworICBjYXNlIElTRDo6VGFyZ2V0Q29uc3RhbnQ6CisgIGNhc2UgSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzOgorICBjYXNlIElTRDo6VGFyZ2V0SnVtcFRhYmxlOgorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiU1BVU2VsZWN0QUZvcm1BZGRyOiBUYXJnZXQgQ29uc3RhbnQvUG9vbC9HbG9iYWwgIgorICAgICAgICAgICAgICAgICAgICAgICJub3Qgd3JhcHBlZCBhcyBBLWZvcm0gYWRkcmVzcy4iKTsKKyAgICAvKk5PVFJFQUNIRUQqLworCisgIGNhc2UgU1BVSVNEOjpBRm9ybUFkZHI6CisgICAgLy8gSnVzdCBsb2FkIGZyb20gbWVtb3J5IGlmIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSB1c2Ugb2YgdGhlIGxvY2F0aW9uLAorICAgIC8vIG90aGVyd2lzZSwgdGhpcyB3aWxsIGdldCBoYW5kbGVkIGJlbG93IHdpdGggRC1mb3JtIG9mZnNldCBhZGRyZXNzZXMKKyAgICBpZiAoTi5oYXNPbmVVc2UoKSkgeworICAgICAgU0RWYWx1ZSBPcDAgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgICBzd2l0Y2ggKE9wMC5nZXRPcGNvZGUoKSkgeworICAgICAgY2FzZSBJU0Q6OlRhcmdldENvbnN0YW50UG9vbDoKKyAgICAgIGNhc2UgSVNEOjpUYXJnZXRKdW1wVGFibGU6CisgICAgICAgIEJhc2UgPSBPcDA7CisgICAgICAgIEluZGV4ID0gWmVybzsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGNhc2UgSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzOiB7CisgICAgICAgIEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdTRE4gPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wMCk7CisgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IEdTRE4tPmdldEdsb2JhbCgpOworICAgICAgICBpZiAoR1YtPmdldEFsaWdubWVudCgpID09IDE2KSB7CisgICAgICAgICAgQmFzZSA9IE9wMDsKKyAgICAgICAgICBJbmRleCA9IFplcm87CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbAorU1BVREFHVG9EQUdJU2VsOjpTZWxlY3RERm9ybTJBZGRyKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmRGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlKSB7CisgIGNvbnN0IGludCBtaW5ERm9ybTJPZmZzZXQgPSAtKDEgPDwgNyk7CisgIGNvbnN0IGludCBtYXhERm9ybTJPZmZzZXQgPSAoMSA8PCA3KSAtIDE7CisgIHJldHVybiBERm9ybUFkZHJlc3NQcmVkaWNhdGUoT3AsIE4sIERpc3AsIEJhc2UsIG1pbkRGb3JtMk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhERm9ybTJPZmZzZXQpOworfQorCisvKiEKKyAgXGFyZyBPcCBUaGUgSVNEIGluc3RydWN0aW9uIChpZ25vcmVkKQorICBcYXJnIE4gVGhlIGFkZHJlc3MgdG8gYmUgdGVzdGVkCisgIFxhcmcgQmFzZSBCYXNlIGFkZHJlc3MgcmVnaXN0ZXIvcG9pbnRlcgorICBcYXJnIEluZGV4IEJhc2UgYWRkcmVzcyBpbmRleAorCisgIEV4YW1pbmUgdGhlIGlucHV0IGFkZHJlc3MgYnkgYSBiYXNlIHJlZ2lzdGVyIHBsdXMgYSBzaWduZWQgMTAtYml0CisgIGRpc3BsYWNlbWVudCwgW3IrSTEwXSAoRC1mb3JtIGFkZHJlc3MpLgorCisgIFxyZXR1cm4gdHJ1ZSBpZiBcYSBOIGlzIGEgRC1mb3JtIGFkZHJlc3Mgd2l0aCBcYSBCYXNlIGFuZCBcYSBJbmRleCBzZXQKKyAgdG8gbm9uLWVtcHR5IFNEVmFsdWUgaW5zdGFuY2VzLgorKi8KK2Jvb2wKK1NQVURBR1RvREFHSVNlbDo6U2VsZWN0REZvcm1BZGRyKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkluZGV4KSB7CisgIHJldHVybiBERm9ybUFkZHJlc3NQcmVkaWNhdGUoT3AsIE4sIEJhc2UsIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQVUZyYW1lSW5mbzo6bWluRnJhbWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUFVGcmFtZUluZm86Om1heEZyYW1lT2Zmc2V0KCkpOworfQorCitib29sCitTUFVEQUdUb0RBR0lTZWw6OkRGb3JtQWRkcmVzc1ByZWRpY2F0ZShTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkluZGV4LCBpbnQgbWluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4T2Zmc2V0KSB7CisgIHVuc2lnbmVkIE9wYyA9IE4uZ2V0T3Bjb2RlKCk7CisgIEVWVCBQdHJUeSA9IFNQVXRsaS5nZXRQb2ludGVyVHkoKTsKKworICBpZiAoT3BjID09IElTRDo6RnJhbWVJbmRleCkgeworICAgIC8vIFN0YWNrIGZyYW1lIGluZGV4IG11c3QgYmUgbGVzcyB0aGFuIDUxMiAoZGl2aWRlZCBieSAxNik6CisgICAgRnJhbWVJbmRleFNETm9kZSAqRklOID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOKTsKKyAgICBpbnQgRkkgPSBpbnQoRklOLT5nZXRJbmRleCgpKTsKKyAgICBERUJVRyhlcnJzKCkgPDwgIlNlbGVjdERGb3JtQWRkcjogSVNEOjpGcmFtZUluZGV4ID0gIgorICAgICAgICAgICAgICAgPDwgRkkgPDwgIlxuIik7CisgICAgaWYgKFNQVUZyYW1lSW5mbzo6Rkl0b1N0YWNrT2Zmc2V0KEZJKSA8IG1heE9mZnNldCkgeworICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgUHRyVHkpOworICAgICAgSW5kZXggPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRkksIFB0clR5KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfSBlbHNlIGlmIChPcGMgPT0gSVNEOjpBREQpIHsKKyAgICAvLyBHZW5lcmF0ZWQgYnkgZ2V0ZWxlbWVudHB0cgorICAgIGNvbnN0IFNEVmFsdWUgT3AwID0gTi5nZXRPcGVyYW5kKDApOworICAgIGNvbnN0IFNEVmFsdWUgT3AxID0gTi5nZXRPcGVyYW5kKDEpOworCisgICAgaWYgKChPcDAuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpIaSAmJiBPcDEuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpMbykKKyAgICAgICAgfHwgKE9wMS5nZXRPcGNvZGUoKSA9PSBTUFVJU0Q6OkhpICYmIE9wMC5nZXRPcGNvZGUoKSA9PSBTUFVJU0Q6OkxvKSkgeworICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgUHRyVHkpOworICAgICAgSW5kZXggPSBOOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChPcDEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudAorICAgICAgICAgICAgICAgfHwgT3AxLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnQpIHsKKyAgICAgIENvbnN0YW50U0ROb2RlICpDTiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wMSk7CisgICAgICBpbnQzMl90IG9mZnNldCA9IGludDMyX3QoQ04tPmdldFNFeHRWYWx1ZSgpKTsKKworICAgICAgaWYgKE9wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZyYW1lSW5kZXgpIHsKKyAgICAgICAgRnJhbWVJbmRleFNETm9kZSAqRklOID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihPcDApOworICAgICAgICBpbnQgRkkgPSBpbnQoRklOLT5nZXRJbmRleCgpKTsKKyAgICAgICAgREVCVUcoZXJycygpIDw8ICJTZWxlY3RERm9ybUFkZHI6IElTRDo6QUREIG9mZnNldCA9ICIgPDwgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgPDwgIiBmcmFtZSBpbmRleCA9ICIgPDwgRkkgPDwgIlxuIik7CisKKyAgICAgICAgaWYgKFNQVUZyYW1lSW5mbzo6Rkl0b1N0YWNrT2Zmc2V0KEZJKSA8IG1heE9mZnNldCkgeworICAgICAgICAgIEJhc2UgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KG9mZnNldCwgUHRyVHkpOworICAgICAgICAgIEluZGV4ID0gQ3VyREFHLT5nZXRUYXJnZXRGcmFtZUluZGV4KEZJLCBQdHJUeSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAob2Zmc2V0ID4gbWluT2Zmc2V0ICYmIG9mZnNldCA8IG1heE9mZnNldCkgeworICAgICAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChvZmZzZXQsIFB0clR5KTsKKyAgICAgICAgSW5kZXggPSBPcDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoT3AwLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQKKyAgICAgICAgICAgICAgIHx8IE9wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldENvbnN0YW50KSB7CisgICAgICBDb25zdGFudFNETm9kZSAqQ04gPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcDApOworICAgICAgaW50MzJfdCBvZmZzZXQgPSBpbnQzMl90KENOLT5nZXRTRXh0VmFsdWUoKSk7CisKKyAgICAgIGlmIChPcDEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGcmFtZUluZGV4KSB7CisgICAgICAgIEZyYW1lSW5kZXhTRE5vZGUgKkZJTiA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oT3AxKTsKKyAgICAgICAgaW50IEZJID0gaW50KEZJTi0+Z2V0SW5kZXgoKSk7CisgICAgICAgIERFQlVHKGVycnMoKSA8PCAiU2VsZWN0REZvcm1BZGRyOiBJU0Q6OkFERCBvZmZzZXQgPSAiIDw8IG9mZnNldAorICAgICAgICAgICAgICAgICAgIDw8ICIgZnJhbWUgaW5kZXggPSAiIDw8IEZJIDw8ICJcbiIpOworCisgICAgICAgIGlmIChTUFVGcmFtZUluZm86OkZJdG9TdGFja09mZnNldChGSSkgPCBtYXhPZmZzZXQpIHsKKyAgICAgICAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChvZmZzZXQsIFB0clR5KTsKKyAgICAgICAgICBJbmRleCA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSSwgUHRyVHkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG9mZnNldCA+IG1pbk9mZnNldCAmJiBvZmZzZXQgPCBtYXhPZmZzZXQpIHsKKyAgICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQob2Zmc2V0LCBQdHJUeSk7CisgICAgICAgIEluZGV4ID0gT3AxOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoT3BjID09IFNQVUlTRDo6SW5kaXJlY3RBZGRyKSB7CisgICAgLy8gSW5kaXJlY3Qgd2l0aCBjb25zdGFudCBvZmZzZXQgLT4gRC1Gb3JtIGFkZHJlc3MKKyAgICBjb25zdCBTRFZhbHVlIE9wMCA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgICBjb25zdCBTRFZhbHVlIE9wMSA9IE4uZ2V0T3BlcmFuZCgxKTsKKworICAgIGlmIChPcDAuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpIaQorICAgICAgICAmJiBPcDEuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpMbykgeworICAgICAgLy8gKFNQVWluZGlyZWN0IChTUFVoaSA8YXJnPiwgMCksIChTUFVsbyA8YXJnPiwgMCkpCisgICAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBQdHJUeSk7CisgICAgICBJbmRleCA9IE47CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oT3AwKSB8fCBpc2E8Q29uc3RhbnRTRE5vZGU+KE9wMSkpIHsKKyAgICAgIGludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICAgIFNEVmFsdWUgaWR4T3A7CisKKyAgICAgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE9wMSkpIHsKKyAgICAgICAgQ29uc3RhbnRTRE5vZGUgKkNOID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3AxKTsKKyAgICAgICAgb2Zmc2V0ID0gaW50MzJfdChDTi0+Z2V0U0V4dFZhbHVlKCkpOworICAgICAgICBpZHhPcCA9IE9wMDsKKyAgICAgIH0gZWxzZSBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihPcDApKSB7CisgICAgICAgIENvbnN0YW50U0ROb2RlICpDTiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wMCk7CisgICAgICAgIG9mZnNldCA9IGludDMyX3QoQ04tPmdldFNFeHRWYWx1ZSgpKTsKKyAgICAgICAgaWR4T3AgPSBPcDE7CisgICAgICB9CisKKyAgICAgIGlmIChvZmZzZXQgPj0gbWluT2Zmc2V0ICYmIG9mZnNldCA8PSBtYXhPZmZzZXQpIHsKKyAgICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQob2Zmc2V0LCBQdHJUeSk7CisgICAgICAgIEluZGV4ID0gaWR4T3A7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChPcGMgPT0gU1BVSVNEOjpBRm9ybUFkZHIpIHsKKyAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBOLmdldFZhbHVlVHlwZSgpKTsKKyAgICBJbmRleCA9IE47CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoT3BjID09IFNQVUlTRDo6TERSRVNVTFQpIHsKKyAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBOLmdldFZhbHVlVHlwZSgpKTsKKyAgICBJbmRleCA9IE47CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoT3BjID09IElTRDo6UmVnaXN0ZXIgCisgICAgICAgICAgIHx8T3BjID09IElTRDo6Q29weUZyb21SZWcgCisgICAgICAgICAgIHx8T3BjID09IElTRDo6VU5ERUYKKyAgICAgICAgICAgfHxPcGMgPT0gSVNEOjpDb25zdGFudCkgeworICAgIHVuc2lnbmVkIE9wT3BjID0gT3AtPmdldE9wY29kZSgpOworCisgICAgaWYgKE9wT3BjID09IElTRDo6U1RPUkUgfHwgT3BPcGMgPT0gSVNEOjpMT0FEKSB7CisgICAgICAvLyBEaXJlY3QgbG9hZC9zdG9yZSB3aXRob3V0IGdldGVsZW1lbnRwdHIKKyAgICAgIFNEVmFsdWUgT2ZmczsKKworICAgICAgT2ZmcyA9ICgoT3BPcGMgPT0gSVNEOjpTVE9SRSkgPyBPcC0+Z2V0T3BlcmFuZCgzKSA6IE9wLT5nZXRPcGVyYW5kKDIpKTsKKworICAgICAgaWYgKE9mZnMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCB8fCBPZmZzLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpIHsKKyAgICAgICAgaWYgKE9mZnMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikKKyAgICAgICAgICBPZmZzID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBPZmZzLmdldFZhbHVlVHlwZSgpKTsKKworICAgICAgICBCYXNlID0gT2ZmczsKKyAgICAgICAgSW5kZXggPSBOOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogSWYgb3RoZXJ3aXNlIHVuYWRvcm5lZCwgZGVmYXVsdCB0byBELWZvcm0gYWRkcmVzcyB3aXRoIDAgb2Zmc2V0OiAqLworICAgICAgaWYgKE9wYyA9PSBJU0Q6OkNvcHlGcm9tUmVnKSB7CisgICAgICAgIEluZGV4ID0gTi5nZXRPcGVyYW5kKDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgSW5kZXggPSBOOworICAgICAgfQorCisgICAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBJbmRleC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIQorICBcYXJnIE9wIFRoZSBJU0QgaW5zdHJ1Y3Rpb24gb3BlcmFuZAorICBcYXJnIE4gVGhlIGFkZHJlc3Mgb3BlcmFuZAorICBcYXJnIEJhc2UgVGhlIGJhc2UgcG9pbnRlciBvcGVyYW5kCisgIFxhcmcgSW5kZXggVGhlIG9mZnNldC9pbmRleCBvcGVyYW5kCisKKyAgSWYgdGhlIGFkZHJlc3MgXGEgTiBjYW4gYmUgZXhwcmVzc2VkIGFzIGFuIEEtZm9ybSBvciBELWZvcm0gYWRkcmVzcywgcmV0dXJucworICBmYWxzZS4gIE90aGVyd2lzZSwgY3JlYXRlcyB0d28gb3BlcmFuZHMsIEJhc2UgYW5kIEluZGV4IHRoYXQgd2lsbCBiZWNvbWUgdGhlCisgIChyKShyKSBYLWZvcm0gYWRkcmVzcy4KKyovCitib29sCitTUFVEQUdUb0RBR0lTZWw6OlNlbGVjdFhGb3JtQWRkcihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZJbmRleCkgeworICBpZiAoIVNlbGVjdEFGb3JtQWRkcihPcCwgTiwgQmFzZSwgSW5kZXgpCisgICAgICAmJiAhU2VsZWN0REZvcm1BZGRyKE9wLCBOLCBCYXNlLCBJbmRleCkpIHsKKyAgICAvLyBJZiB0aGUgYWRkcmVzcyBpcyBuZWl0aGVyIEEtZm9ybSBvciBELWZvcm0sIHB1bnQgYW5kIHVzZSBhbiBYLWZvcm0KKyAgICAvLyBhZGRyZXNzOgorICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMSk7CisgICAgSW5kZXggPSBOLmdldE9wZXJhbmQoMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vISBDb252ZXJ0IHRoZSBvcGVyYW5kIGZyb20gYSB0YXJnZXQtaW5kZXBlbmRlbnQgdG8gYSB0YXJnZXQtc3BlY2lmaWMgbm9kZQorLyohCisgKi8KK1NETm9kZSAqCitTUFVEQUdUb0RBR0lTZWw6OlNlbGVjdChTRE5vZGUgKk4pIHsKKyAgdW5zaWduZWQgT3BjID0gTi0+Z2V0T3Bjb2RlKCk7CisgIGludCBuX29wcyA9IC0xOworICB1bnNpZ25lZCBOZXdPcGM7CisgIEVWVCBPcFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBTRFZhbHVlIE9wc1s4XTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIGlmIChOLT5pc01hY2hpbmVPcGNvZGUoKSkKKyAgICByZXR1cm4gTlVMTDsgICAvLyBBbHJlYWR5IHNlbGVjdGVkLgorCisgIGlmIChPcGMgPT0gSVNEOjpGcmFtZUluZGV4KSB7CisgICAgaW50IEZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOKS0+Z2V0SW5kZXgoKTsKKyAgICBTRFZhbHVlIFRGSSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgICBTRFZhbHVlIEltbTAgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIE4tPmdldFZhbHVlVHlwZSgwKSk7CisKKyAgICBpZiAoRkkgPCAxMjgpIHsKKyAgICAgIE5ld09wYyA9IFNQVTo6QUlyMzI7CisgICAgICBPcHNbMF0gPSBURkk7CisgICAgICBPcHNbMV0gPSBJbW0wOworICAgICAgbl9vcHMgPSAyOworICAgIH0gZWxzZSB7CisgICAgICBOZXdPcGMgPSBTUFU6OkFyMzI7CisgICAgICBPcHNbMF0gPSBDdXJEQUctPmdldFJlZ2lzdGVyKFNQVTo6UjEsIE4tPmdldFZhbHVlVHlwZSgwKSk7CisgICAgICBPcHNbMV0gPSBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpJTEFyMzIsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKSwgVEZJLCBJbW0wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICBuX29wcyA9IDI7CisgICAgfQorICB9IGVsc2UgaWYgKE9wYyA9PSBJU0Q6OkNvbnN0YW50ICYmIE9wVlQgPT0gTVZUOjppNjQpIHsKKyAgICAvLyBDYXRjaCB0aGUgaTY0IGNvbnN0YW50cyB0aGF0IGVuZCB1cCBoZXJlLiBOb3RlOiBUaGUgYmFja2VuZCBkb2Vzbid0CisgICAgLy8gYXR0ZW1wdCB0byBsZWdhbGl6ZSB0aGUgY29uc3RhbnQgKGl0J3MgdXNlbGVzcyBiZWNhdXNlIERBR0NvbWJpbmVyCisgICAgLy8gd2lsbCBpbnNlcnQgNjQtYml0IGNvbnN0YW50cyBhbmQgd2UgY2FuJ3Qgc3RvcCBpdCkuCisgICAgcmV0dXJuIFNlbGVjdEk2NENvbnN0YW50KE4sIE9wVlQsIE4tPmdldERlYnVnTG9jKCkpOworICB9IGVsc2UgaWYgKChPcGMgPT0gSVNEOjpaRVJPX0VYVEVORCB8fCBPcGMgPT0gSVNEOjpBTllfRVhURU5EKQorICAgICAgICAgICAgICYmIE9wVlQgPT0gTVZUOjppNjQpIHsKKyAgICBTRFZhbHVlIE9wMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgICAgRVZUIE9wMFZUID0gT3AwLmdldFZhbHVlVHlwZSgpOworICAgIEVWVCBPcDBWZWNWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkN1ckRBRy0+Z2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AwVlQsICgxMjggLyBPcDBWVC5nZXRTaXplSW5CaXRzKCkpKTsKKyAgICBFVlQgT3BWZWNWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkN1ckRBRy0+Z2V0Q29udGV4dCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BWVCwgKDEyOCAvIE9wVlQuZ2V0U2l6ZUluQml0cygpKSk7CisgICAgU0RWYWx1ZSBzaHVmTWFzazsKKworICAgIHN3aXRjaCAoT3AwVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkNlbGxTUFUgU2VsZWN0OiBVbmhhbmRsZWQgemVyby9hbnkgZXh0ZW5kIEVWVCIpOworICAgICAgLypOT1RSRUFDSEVEKi8KKyAgICBjYXNlIE1WVDo6aTMyOgorICAgICAgc2h1Zk1hc2sgPSBDdXJEQUctPmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRDb25zdGFudCgweDgwODA4MDgwLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldENvbnN0YW50KDB4MDAwMTAyMDMsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0Q29uc3RhbnQoMHg4MDgwODA4MCwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRDb25zdGFudCgweDA4MDkwYTBiLCBNVlQ6OmkzMikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1WVDo6aTE2OgorICAgICAgc2h1Zk1hc2sgPSBDdXJEQUctPmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRDb25zdGFudCgweDgwODA4MDgwLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldENvbnN0YW50KDB4ODA4MDAyMDMsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0Q29uc3RhbnQoMHg4MDgwODA4MCwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRDb25zdGFudCgweDgwODAwYTBiLCBNVlQ6OmkzMikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1WVDo6aTg6CisgICAgICBzaHVmTWFzayA9IEN1ckRBRy0+Z2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djRpMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldENvbnN0YW50KDB4ODA4MDgwODAsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0Q29uc3RhbnQoMHg4MDgwODAwMywgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRDb25zdGFudCgweDgwODA4MDgwLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldENvbnN0YW50KDB4ODA4MDgwMGIsIE1WVDo6aTMyKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBTRE5vZGUgKnNodWZNYXNrTG9hZCA9IGVtaXRCdWlsZFZlY3RvcihzaHVmTWFzay5nZXROb2RlKCkpOworICAgIAorICAgIEhhbmRsZVNETm9kZSBQcm9tb3RlU2NhbGFyKEN1ckRBRy0+Z2V0Tm9kZShTUFVJU0Q6OlBSRUZTTE9UMlZFQywgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wMFZlY1ZULCBPcDApKTsKKyAgICAKKyAgICBTRFZhbHVlIFByb21TY2FsYXI7CisgICAgaWYgKFNETm9kZSAqTiA9IFNlbGVjdENvZGUoUHJvbW90ZVNjYWxhci5nZXRWYWx1ZSgpLmdldE5vZGUoKSkpCisgICAgICBQcm9tU2NhbGFyID0gU0RWYWx1ZShOLCAwKTsKKyAgICBlbHNlCisgICAgICBQcm9tU2NhbGFyID0gUHJvbW90ZVNjYWxhci5nZXRWYWx1ZSgpOworICAgIAorICAgIFNEVmFsdWUgemV4dFNodWZmbGUgPQorICAgICAgICAgICAgQ3VyREFHLT5nZXROb2RlKFNQVUlTRDo6U0hVRkIsIGRsLCBPcFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21TY2FsYXIsIFByb21TY2FsYXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoc2h1Zk1hc2tMb2FkLCAwKSk7CisKKyAgICBIYW5kbGVTRE5vZGUgRHVtbXkyKHpleHRTaHVmZmxlKTsKKyAgICBpZiAoU0ROb2RlICpOID0gU2VsZWN0Q29kZShEdW1teTIuZ2V0VmFsdWUoKS5nZXROb2RlKCkpKQorICAgICAgemV4dFNodWZmbGUgPSBTRFZhbHVlKE4sIDApOworICAgIGVsc2UKKyAgICAgIHpleHRTaHVmZmxlID0gRHVtbXkyLmdldFZhbHVlKCk7CisgICAgSGFuZGxlU0ROb2RlIER1bW15KEN1ckRBRy0+Z2V0Tm9kZShTUFVJU0Q6OlZFQzJQUkVGU0xPVCwgZGwsIE9wVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXh0U2h1ZmZsZSkpOworICAgIAorICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNXaXRoKE4sIER1bW15LmdldFZhbHVlKCkuZ2V0Tm9kZSgpKTsKKyAgICBTZWxlY3RDb2RlKER1bW15LmdldFZhbHVlKCkuZ2V0Tm9kZSgpKTsKKyAgICByZXR1cm4gRHVtbXkuZ2V0VmFsdWUoKS5nZXROb2RlKCk7CisgIH0gZWxzZSBpZiAoT3BjID09IElTRDo6QUREICYmIChPcFZUID09IE1WVDo6aTY0IHx8IE9wVlQgPT0gTVZUOjp2Mmk2NCkpIHsKKyAgICBTRE5vZGUgKkNHTG9hZCA9CisgICAgICAgICAgICBlbWl0QnVpbGRWZWN0b3IoZ2V0Q2FycnlHZW5lcmF0ZVNodWZNYXNrKCpDdXJEQUcsIGRsKS5nZXROb2RlKCkpOworCisgICAgSGFuZGxlU0ROb2RlIER1bW15KEN1ckRBRy0+Z2V0Tm9kZShTUFVJU0Q6OkFERDY0X01BUktFUiwgZGwsIE9wVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShDR0xvYWQsIDApKSk7CisgICAgCisgICAgQ3VyREFHLT5SZXBsYWNlQWxsVXNlc1dpdGgoTiwgRHVtbXkuZ2V0VmFsdWUoKS5nZXROb2RlKCkpOworICAgIGlmIChTRE5vZGUgKk4gPSBTZWxlY3RDb2RlKER1bW15LmdldFZhbHVlKCkuZ2V0Tm9kZSgpKSkKKyAgICAgIHJldHVybiBOOworICAgIHJldHVybiBEdW1teS5nZXRWYWx1ZSgpLmdldE5vZGUoKTsKKyAgfSBlbHNlIGlmIChPcGMgPT0gSVNEOjpTVUIgJiYgKE9wVlQgPT0gTVZUOjppNjQgfHwgT3BWVCA9PSBNVlQ6OnYyaTY0KSkgeworICAgIFNETm9kZSAqQ0dMb2FkID0KKyAgICAgICAgICAgIGVtaXRCdWlsZFZlY3RvcihnZXRCb3Jyb3dHZW5lcmF0ZVNodWZNYXNrKCpDdXJEQUcsIGRsKS5nZXROb2RlKCkpOworCisgICAgSGFuZGxlU0ROb2RlIER1bW15KEN1ckRBRy0+Z2V0Tm9kZShTUFVJU0Q6OlNVQjY0X01BUktFUiwgZGwsIE9wVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShDR0xvYWQsIDApKSk7CisgICAgCisgICAgQ3VyREFHLT5SZXBsYWNlQWxsVXNlc1dpdGgoTiwgRHVtbXkuZ2V0VmFsdWUoKS5nZXROb2RlKCkpOworICAgIGlmIChTRE5vZGUgKk4gPSBTZWxlY3RDb2RlKER1bW15LmdldFZhbHVlKCkuZ2V0Tm9kZSgpKSkKKyAgICAgIHJldHVybiBOOworICAgIHJldHVybiBEdW1teS5nZXRWYWx1ZSgpLmdldE5vZGUoKTsKKyAgfSBlbHNlIGlmIChPcGMgPT0gSVNEOjpNVUwgJiYgKE9wVlQgPT0gTVZUOjppNjQgfHwgT3BWVCA9PSBNVlQ6OnYyaTY0KSkgeworICAgIFNETm9kZSAqQ0dMb2FkID0KKyAgICAgICAgICAgIGVtaXRCdWlsZFZlY3RvcihnZXRDYXJyeUdlbmVyYXRlU2h1Zk1hc2soKkN1ckRBRywgZGwpLmdldE5vZGUoKSk7CisKKyAgICBIYW5kbGVTRE5vZGUgRHVtbXkoQ3VyREFHLT5nZXROb2RlKFNQVUlTRDo6TVVMNjRfTUFSS0VSLCBkbCwgT3BWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKENHTG9hZCwgMCkpKTsKKyAgICBDdXJEQUctPlJlcGxhY2VBbGxVc2VzV2l0aChOLCBEdW1teS5nZXRWYWx1ZSgpLmdldE5vZGUoKSk7CisgICAgaWYgKFNETm9kZSAqTiA9IFNlbGVjdENvZGUoRHVtbXkuZ2V0VmFsdWUoKS5nZXROb2RlKCkpKQorICAgICAgcmV0dXJuIE47CisgICAgcmV0dXJuIER1bW15LmdldFZhbHVlKCkuZ2V0Tm9kZSgpOworICB9IGVsc2UgaWYgKE9wYyA9PSBJU0Q6OlRSVU5DQVRFKSB7CisgICAgU0RWYWx1ZSBPcDAgPSBOLT5nZXRPcGVyYW5kKDApOworICAgIGlmICgoT3AwLmdldE9wY29kZSgpID09IElTRDo6U1JBIHx8IE9wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSTCkKKyAgICAgICAgJiYgT3BWVCA9PSBNVlQ6OmkzMgorICAgICAgICAmJiBPcDAuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppNjQpIHsKKyAgICAgIC8vIENhdGNoICh0cnVuY2F0ZTppMzIgKFtzcmF8c3JsXTppNjQgYXJnLCBjKSwgd2hlcmUgYyA+PSAzMgorICAgICAgLy8KKyAgICAgIC8vIFRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIHVwcGVyIDMyIGJpdHMgYXJlIGluIHRoZQorICAgICAgLy8gaTMyIHByZWZlcnJlZCBzbG90IGFuZCBhdm9pZCBzaHVmZmxlIGd5bW5hc3RpY3M6CisgICAgICBDb25zdGFudFNETm9kZSAqQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AwLmdldE9wZXJhbmQoMSkpOworICAgICAgaWYgKENOICE9IDApIHsKKyAgICAgICAgdW5zaWduZWQgc2hpZnRfYW10ID0gdW5zaWduZWQoQ04tPmdldFpFeHRWYWx1ZSgpKTsKKworICAgICAgICBpZiAoc2hpZnRfYW10ID49IDMyKSB7CisgICAgICAgICAgU0ROb2RlICpoaTMyID0KKyAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpPUnIzMl9yNjQsIGRsLCBPcFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDAuZ2V0T3BlcmFuZCgwKSk7CisKKyAgICAgICAgICBzaGlmdF9hbXQgLT0gMzI7CisgICAgICAgICAgaWYgKHNoaWZ0X2FtdCA+IDApIHsKKyAgICAgICAgICAgIC8vIFRha2UgY2FyZSBvZiB0aGUgYWRkaXRpb25hbCBzaGlmdCwgaWYgcHJlc2VudDoKKyAgICAgICAgICAgIFNEVmFsdWUgc2hpZnQgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KHNoaWZ0X2FtdCwgTVZUOjppMzIpOworICAgICAgICAgICAgdW5zaWduZWQgT3BjID0gU1BVOjpST1RNQUlyMzJfaTMyOworCisgICAgICAgICAgICBpZiAoT3AwLmdldE9wY29kZSgpID09IElTRDo6U1JMKQorICAgICAgICAgICAgICBPcGMgPSBTUFU6OlJPVE1yMzI7CisKKyAgICAgICAgICAgIGhpMzIgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wYywgZGwsIE9wVlQsIFNEVmFsdWUoaGkzMiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIGhpMzI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoT3BjID09IElTRDo6U0hMKSB7CisgICAgaWYgKE9wVlQgPT0gTVZUOjppNjQpCisgICAgICByZXR1cm4gU2VsZWN0U0hMaTY0KE4sIE9wVlQpOworICB9IGVsc2UgaWYgKE9wYyA9PSBJU0Q6OlNSTCkgeworICAgIGlmIChPcFZUID09IE1WVDo6aTY0KQorICAgICAgcmV0dXJuIFNlbGVjdFNSTGk2NChOLCBPcFZUKTsKKyAgfSBlbHNlIGlmIChPcGMgPT0gSVNEOjpTUkEpIHsKKyAgICBpZiAoT3BWVCA9PSBNVlQ6Omk2NCkKKyAgICAgIHJldHVybiBTZWxlY3RTUkFpNjQoTiwgT3BWVCk7CisgIH0gZWxzZSBpZiAoT3BjID09IElTRDo6Rk5FRworICAgICAgICAgICAgICYmIChPcFZUID09IE1WVDo6ZjY0IHx8IE9wVlQgPT0gTVZUOjp2MmY2NCkpIHsKKyAgICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgICAgLy8gQ2hlY2sgaWYgdGhlIHBhdHRlcm4gaXMgYSBzcGVjaWFsIGZvcm0gb2YgREZOTVM6CisgICAgLy8gKGZuZWcgKGZzdWIgKGZtdWwgUjY0RlA6JHJBLCBSNjRGUDokckIpLCBSNjRGUDokckMpKQorICAgIFNEVmFsdWUgT3AwID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoT3AwLmdldE9wY29kZSgpID09IElTRDo6RlNVQikgeworICAgICAgU0RWYWx1ZSBPcDAwID0gT3AwLmdldE9wZXJhbmQoMCk7CisgICAgICBpZiAoT3AwMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZNVUwpIHsKKyAgICAgICAgdW5zaWduZWQgT3BjID0gU1BVOjpERk5NU2Y2NDsKKyAgICAgICAgaWYgKE9wVlQgPT0gTVZUOjp2MmY2NCkKKyAgICAgICAgICBPcGMgPSBTUFU6OkRGTk1TdjJmNjQ7CisKKyAgICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3BjLCBkbCwgT3BWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AwMC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDAwLmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wMC5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTRFZhbHVlIG5lZ0NvbnN0ID0gQ3VyREFHLT5nZXRDb25zdGFudCgweDgwMDAwMDAwMDAwMDAwMDBVTEwsIE1WVDo6aTY0KTsKKyAgICBTRE5vZGUgKnNpZ25NYXNrID0gMDsKKyAgICB1bnNpZ25lZCBPcGMgPSBTUFU6OlhPUmZuZWc2NDsKKworICAgIGlmIChPcFZUID09IE1WVDo6ZjY0KSB7CisgICAgICBzaWduTWFzayA9IFNlbGVjdEk2NENvbnN0YW50KG5lZ0NvbnN0LmdldE5vZGUoKSwgTVZUOjppNjQsIGRsKTsKKyAgICB9IGVsc2UgaWYgKE9wVlQgPT0gTVZUOjp2MmY2NCkgeworICAgICAgT3BjID0gU1BVOjpYT1JmbmVndmVjOworICAgICAgc2lnbk1hc2sgPSBlbWl0QnVpbGRWZWN0b3IoQ3VyREFHLT5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OnYyaTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ0NvbnN0LCBuZWdDb25zdCkuZ2V0Tm9kZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBPcFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCksIFNEVmFsdWUoc2lnbk1hc2ssIDApKTsKKyAgfSBlbHNlIGlmIChPcGMgPT0gSVNEOjpGQUJTKSB7CisgICAgaWYgKE9wVlQgPT0gTVZUOjpmNjQpIHsKKyAgICAgIFNETm9kZSAqc2lnbk1hc2sgPSBTZWxlY3RJNjRDb25zdGFudCgweDdmZmZmZmZmZmZmZmZmZmZVTEwsIE1WVDo6aTY0LCBkbCk7CisgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OkFORGZhYnM2NCwgZGwsIE9wVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDApLCBTRFZhbHVlKHNpZ25NYXNrLCAwKSk7CisgICAgfSBlbHNlIGlmIChPcFZUID09IE1WVDo6djJmNjQpIHsKKyAgICAgIFNEVmFsdWUgYWJzQ29uc3QgPSBDdXJEQUctPmdldENvbnN0YW50KDB4N2ZmZmZmZmZmZmZmZmZmZlVMTCwgTVZUOjppNjQpOworICAgICAgU0RWYWx1ZSBhYnNWZWMgPSBDdXJEQUctPmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnYyaTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzQ29uc3QsIGFic0NvbnN0KTsKKyAgICAgIFNETm9kZSAqc2lnbk1hc2sgPSBlbWl0QnVpbGRWZWN0b3IoYWJzVmVjLmdldE5vZGUoKSk7CisgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OkFORGZhYnN2ZWMsIGRsLCBPcFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgwKSwgU0RWYWx1ZShzaWduTWFzaywgMCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChPcGMgPT0gU1BVSVNEOjpMRFJFU1VMVCkgeworICAgIC8vIEN1c3RvbSBzZWxlY3QgaW5zdHJ1Y3Rpb25zIGZvciBMRFJFU1VMVAorICAgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgICBTRFZhbHVlIEFyZyA9IE4tPmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBDaGFpbiA9IE4tPmdldE9wZXJhbmQoMSk7CisgICAgU0ROb2RlICpSZXN1bHQ7CisgICAgY29uc3QgdmFsdHlwZV9tYXBfcyAqdnRtID0gZ2V0VmFsdWVUeXBlTWFwRW50cnkoVlQpOworCisgICAgaWYgKHZ0bS0+bGRyZXN1bHRfaW5zID09IDApIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiTERSRVNVTFQgZm9yIHVuc3VwcG9ydGVkIHR5cGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKFZULmdldEVWVFN0cmluZygpKSk7CisgICAgfQorCisgICAgT3BjID0gdnRtLT5sZHJlc3VsdF9pbnM7CisgICAgaWYgKHZ0bS0+bGRyZXN1bHRfaW1tKSB7CisgICAgICBTRFZhbHVlIFplcm8gPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIFZUKTsKKworICAgICAgUmVzdWx0ID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBWVCwgTVZUOjpPdGhlciwgQXJnLCBaZXJvLCBDaGFpbik7CisgICAgfSBlbHNlIHsKKyAgICAgIFJlc3VsdCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3BjLCBkbCwgVlQsIE1WVDo6T3RoZXIsIEFyZywgQXJnLCBDaGFpbik7CisgICAgfQorCisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfSBlbHNlIGlmIChPcGMgPT0gU1BVSVNEOjpJbmRpcmVjdEFkZHIpIHsKKyAgICAvLyBMb29rIGF0IHRoZSBvcGVyYW5kczogU2VsZWN0Q29kZSgpIHdpbGwgY2F0Y2ggdGhlIGNhc2VzIHRoYXQgYXJlbid0CisgICAgLy8gc3BlY2lmaWNhbGx5IGhhbmRsZWQgaGVyZS4KKyAgICAvLworICAgIC8vIFNQVUluc3RySW5mbyBjYXRjaGVzIHRoZSBmb2xsb3dpbmcgcGF0dGVybnM6CisgICAgLy8gKFNQVWluZGlyZWN0IChTUFVoaSAuLi4pLCAoU1BVbG8gLi4uKSkKKyAgICAvLyAoU1BVaW5kaXJlY3QgJHNwLCBpbW0pCisgICAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICAgIFNEVmFsdWUgT3AwID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIE9wMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgICAgUmVnaXN0ZXJTRE5vZGUgKlJOOworCisgICAgaWYgKChPcDAuZ2V0T3Bjb2RlKCkgIT0gU1BVSVNEOjpIaSAmJiBPcDEuZ2V0T3Bjb2RlKCkgIT0gU1BVSVNEOjpMbykKKyAgICAgICAgfHwgKE9wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlJlZ2lzdGVyCisgICAgICAgICAgICAmJiAoKFJOID0gZHluX2Nhc3Q8UmVnaXN0ZXJTRE5vZGU+KE9wMC5nZXROb2RlKCkpKSAhPSAwCisgICAgICAgICAgICAgICAgJiYgUk4tPmdldFJlZygpICE9IFNQVTo6UjEpKSkgeworICAgICAgTmV3T3BjID0gU1BVOjpBcjMyOworICAgICAgT3BzWzFdID0gT3AxOworICAgICAgaWYgKE9wMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50KSB7CisgICAgICAgIENvbnN0YW50U0ROb2RlICpDTiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wMSk7CisgICAgICAgIE9wMSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQ04tPmdldFNFeHRWYWx1ZSgpLCBWVCk7CisgICAgICAgIGlmIChpc0ludDwxMD4oQ04tPmdldFNFeHRWYWx1ZSgpKSkgeworICAgICAgICAgIE5ld09wYyA9IFNQVTo6QUlyMzI7CisgICAgICAgICAgT3BzWzFdID0gT3AxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIE9wc1sxXSA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OklMcjMyLCBkbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFZhbHVlVHlwZSgwKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIE9wc1swXSA9IE9wMDsKKyAgICAgIG5fb3BzID0gMjsKKyAgICB9CisgIH0KKworICBpZiAobl9vcHMgPiAwKSB7CisgICAgaWYgKE4tPmhhc09uZVVzZSgpKQorICAgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIE5ld09wYywgT3BWVCwgT3BzLCBuX29wcyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTmV3T3BjLCBkbCwgT3BWVCwgT3BzLCBuX29wcyk7CisgIH0gZWxzZQorICAgIHJldHVybiBTZWxlY3RDb2RlKE4pOworfQorCisvKiEKKyAqIEVtaXQgdGhlIGluc3RydWN0aW9uIHNlcXVlbmNlIGZvciBpNjQgbGVmdCBzaGlmdHMuIFRoZSBiYXNpYyBhbGdvcml0aG0KKyAqIGlzIHRvIGZpbGwgdGhlIGJvdHRvbSB0d28gd29yZCBzbG90cyB3aXRoIHplcm9zIHNvIHRoYXQgemVyb3MgYXJlIHNoaWZ0ZWQKKyAqIGluIGFzIHRoZSBlbnRpcmUgcXVhZHdvcmQgaXMgc2hpZnRlZCBsZWZ0LgorICoKKyAqIFxub3RlIFRoaXMgY29kZSBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gaW1wbGVtZW50IHYyaTY0IHNobC4KKyAqCisgKiBAcGFyYW0gT3AgVGhlIHNobCBvcGVyYW5kCisgKiBAcGFyYW0gT3BWVCBPcCdzIG1hY2hpbmUgdmFsdWUgdmFsdWUgdHlwZSAoZG9lc24ndCBuZWVkIHRvIGJlIHBhc3NlZCwgYnV0CisgKiBtYWtlcyBsaWZlIGVhc2llci4pCisgKiBAcmV0dXJuIFRoZSBTRE5vZGUgd2l0aCB0aGUgZW50aXJlIGluc3RydWN0aW9uIHNlcXVlbmNlCisgKi8KK1NETm9kZSAqCitTUFVEQUdUb0RBR0lTZWw6OlNlbGVjdFNITGk2NChTRE5vZGUgKk4sIEVWVCBPcFZUKSB7CisgIFNEVmFsdWUgT3AwID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgRVZUIFZlY1ZUID0gRVZUOjpnZXRWZWN0b3JWVCgqQ3VyREFHLT5nZXRDb250ZXh0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wVlQsICgxMjggLyBPcFZULmdldFNpemVJbkJpdHMoKSkpOworICBTRFZhbHVlIFNoaWZ0QW10ID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgRVZUIFNoaWZ0QW10VlQgPSBTaGlmdEFtdC5nZXRWYWx1ZVR5cGUoKTsKKyAgU0ROb2RlICpWZWNPcDAsICpTZWxNYXNrLCAqWmVyb0ZpbGwsICpTaGlmdCA9IDA7CisgIFNEVmFsdWUgU2VsTWFza1ZhbDsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIFZlY09wMCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpPUnYyaTY0X2k2NCwgZGwsIFZlY1ZULCBPcDApOworICBTZWxNYXNrVmFsID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgweGZmMDBVTEwsIE1WVDo6aTE2KTsKKyAgU2VsTWFzayA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpGU01CSXYyaTY0LCBkbCwgVmVjVlQsIFNlbE1hc2tWYWwpOworICBaZXJvRmlsbCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpJTHYyaTY0LCBkbCwgVmVjVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIE9wVlQpKTsKKyAgVmVjT3AwID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OlNFTEJ2Mmk2NCwgZGwsIFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoWmVyb0ZpbGwsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVmVjT3AwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKFNlbE1hc2ssIDApKTsKKworICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNOID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFNoaWZ0QW10KSkgeworICAgIHVuc2lnbmVkIGJ5dGVzID0gdW5zaWduZWQoQ04tPmdldFpFeHRWYWx1ZSgpKSA+PiAzOworICAgIHVuc2lnbmVkIGJpdHMgPSB1bnNpZ25lZChDTi0+Z2V0WkV4dFZhbHVlKCkpICYgNzsKKworICAgIGlmIChieXRlcyA+IDApIHsKKyAgICAgIFNoaWZ0ID0KKyAgICAgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OlNITFFCWUl2Mmk2NCwgZGwsIFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVmVjT3AwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KGJ5dGVzLCBTaGlmdEFtdFZUKSk7CisgICAgfQorCisgICAgaWYgKGJpdHMgPiAwKSB7CisgICAgICBTaGlmdCA9CisgICAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpTSExRQklJdjJpNjQsIGRsLCBWZWNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKChTaGlmdCAhPSAwID8gU2hpZnQgOiBWZWNPcDApLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KGJpdHMsIFNoaWZ0QW10VlQpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgU0ROb2RlICpCeXRlcyA9CisgICAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6Uk9UTUlyMzIsIGRsLCBTaGlmdEFtdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGlmdEFtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgzLCBTaGlmdEFtdFZUKSk7CisgICAgU0ROb2RlICpCaXRzID0KKyAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpBTkRJcjMyLCBkbCwgU2hpZnRBbXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hpZnRBbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoNywgU2hpZnRBbXRWVCkpOworICAgIFNoaWZ0ID0KKyAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpTSExRQll2Mmk2NCwgZGwsIFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKFZlY09wMCwgMCksIFNEVmFsdWUoQnl0ZXMsIDApKTsKKyAgICBTaGlmdCA9CisgICAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6U0hMUUJJdjJpNjQsIGRsLCBWZWNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShTaGlmdCwgMCksIFNEVmFsdWUoQml0cywgMCkpOworICB9CisKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpPUmk2NF92Mmk2NCwgZGwsIE9wVlQsIFNEVmFsdWUoU2hpZnQsIDApKTsKK30KKworLyohCisgKiBFbWl0IHRoZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IgaTY0IGxvZ2ljYWwgcmlnaHQgc2hpZnRzLgorICoKKyAqIEBwYXJhbSBPcCBUaGUgc2hsIG9wZXJhbmQKKyAqIEBwYXJhbSBPcFZUIE9wJ3MgbWFjaGluZSB2YWx1ZSB2YWx1ZSB0eXBlIChkb2Vzbid0IG5lZWQgdG8gYmUgcGFzc2VkLCBidXQKKyAqIG1ha2VzIGxpZmUgZWFzaWVyLikKKyAqIEByZXR1cm4gVGhlIFNETm9kZSB3aXRoIHRoZSBlbnRpcmUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UKKyAqLworU0ROb2RlICoKK1NQVURBR1RvREFHSVNlbDo6U2VsZWN0U1JMaTY0KFNETm9kZSAqTiwgRVZUIE9wVlQpIHsKKyAgU0RWYWx1ZSBPcDAgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgVmVjVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpDdXJEQUctPmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcFZULCAoMTI4IC8gT3BWVC5nZXRTaXplSW5CaXRzKCkpKTsKKyAgU0RWYWx1ZSBTaGlmdEFtdCA9IE4tPmdldE9wZXJhbmQoMSk7CisgIEVWVCBTaGlmdEFtdFZUID0gU2hpZnRBbXQuZ2V0VmFsdWVUeXBlKCk7CisgIFNETm9kZSAqVmVjT3AwLCAqU2hpZnQgPSAwOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgVmVjT3AwID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6Ok9SdjJpNjRfaTY0LCBkbCwgVmVjVlQsIE9wMCk7CisKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihTaGlmdEFtdCkpIHsKKyAgICB1bnNpZ25lZCBieXRlcyA9IHVuc2lnbmVkKENOLT5nZXRaRXh0VmFsdWUoKSkgPj4gMzsKKyAgICB1bnNpZ25lZCBiaXRzID0gdW5zaWduZWQoQ04tPmdldFpFeHRWYWx1ZSgpKSAmIDc7CisKKyAgICBpZiAoYnl0ZXMgPiAwKSB7CisgICAgICBTaGlmdCA9CisgICAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpST1RRTUJZSXYyaTY0LCBkbCwgVmVjVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShWZWNPcDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoYnl0ZXMsIFNoaWZ0QW10VlQpKTsKKyAgICB9CisKKyAgICBpZiAoYml0cyA+IDApIHsKKyAgICAgIFNoaWZ0ID0KKyAgICAgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OlJPVFFNQklJdjJpNjQsIGRsLCBWZWNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKChTaGlmdCAhPSAwID8gU2hpZnQgOiBWZWNPcDApLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KGJpdHMsIFNoaWZ0QW10VlQpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgU0ROb2RlICpCeXRlcyA9CisgICAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6Uk9UTUlyMzIsIGRsLCBTaGlmdEFtdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGlmdEFtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgzLCBTaGlmdEFtdFZUKSk7CisgICAgU0ROb2RlICpCaXRzID0KKyAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpBTkRJcjMyLCBkbCwgU2hpZnRBbXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hpZnRBbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoNywgU2hpZnRBbXRWVCkpOworCisgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNoaWZ0IGFtb3VudHMgYXJlIG5lZ2F0ZWQhCisgICAgQnl0ZXMgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6U0ZJcjMyLCBkbCwgU2hpZnRBbXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShCeXRlcywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgU2hpZnRBbXRWVCkpOworCisgICAgQml0cyA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpTRklyMzIsIGRsLCBTaGlmdEFtdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoQml0cywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBTaGlmdEFtdFZUKSk7CisKKyAgICBTaGlmdCA9CisgICAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6Uk9UUU1CWXYyaTY0LCBkbCwgVmVjVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVmVjT3AwLCAwKSwgU0RWYWx1ZShCeXRlcywgMCkpOworICAgIFNoaWZ0ID0KKyAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpST1RRTUJJdjJpNjQsIGRsLCBWZWNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShTaGlmdCwgMCksIFNEVmFsdWUoQml0cywgMCkpOworICB9CisKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpPUmk2NF92Mmk2NCwgZGwsIE9wVlQsIFNEVmFsdWUoU2hpZnQsIDApKTsKK30KKworLyohCisgKiBFbWl0IHRoZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IgaTY0IGFyaXRobWV0aWMgcmlnaHQgc2hpZnRzLgorICoKKyAqIEBwYXJhbSBPcCBUaGUgc2hsIG9wZXJhbmQKKyAqIEBwYXJhbSBPcFZUIE9wJ3MgbWFjaGluZSB2YWx1ZSB2YWx1ZSB0eXBlIChkb2Vzbid0IG5lZWQgdG8gYmUgcGFzc2VkLCBidXQKKyAqIG1ha2VzIGxpZmUgZWFzaWVyLikKKyAqIEByZXR1cm4gVGhlIFNETm9kZSB3aXRoIHRoZSBlbnRpcmUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UKKyAqLworU0ROb2RlICoKK1NQVURBR1RvREFHSVNlbDo6U2VsZWN0U1JBaTY0KFNETm9kZSAqTiwgRVZUIE9wVlQpIHsKKyAgLy8gUHJvbW90ZSBPcDAgdG8gdmVjdG9yCisgIEVWVCBWZWNWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkN1ckRBRy0+Z2V0Q29udGV4dCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcFZULCAoMTI4IC8gT3BWVC5nZXRTaXplSW5CaXRzKCkpKTsKKyAgU0RWYWx1ZSBTaGlmdEFtdCA9IE4tPmdldE9wZXJhbmQoMSk7CisgIEVWVCBTaGlmdEFtdFZUID0gU2hpZnRBbXQuZ2V0VmFsdWVUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICBTRE5vZGUgKlZlY09wMCA9CisgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6Ok9SdjJpNjRfaTY0LCBkbCwgVmVjVlQsIE4tPmdldE9wZXJhbmQoMCkpOworCisgIFNEVmFsdWUgU2lnblJvdEFtdCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMzEsIFNoaWZ0QW10VlQpOworICBTRE5vZGUgKlNpZ25Sb3QgPQorICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpST1RNQUl2Mmk2NF9pMzIsIGRsLCBNVlQ6OnYyaTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShWZWNPcDAsIDApLCBTaWduUm90QW10KTsKKyAgU0ROb2RlICpVcHBlckhhbGZTaWduID0KKyAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6T1JpMzJfdjRpMzIsIGRsLCBNVlQ6OmkzMiwgU0RWYWx1ZShTaWduUm90LCAwKSk7CisKKyAgU0ROb2RlICpVcHBlckhhbGZTaWduTWFzayA9CisgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OkZTTTY0cjMyLCBkbCwgVmVjVlQsIFNEVmFsdWUoVXBwZXJIYWxmU2lnbiwgMCkpOworICBTRE5vZGUgKlVwcGVyTG93ZXJNYXNrID0KKyAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6RlNNQkl2Mmk2NCwgZGwsIFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgweGZmMDBVTEwsIE1WVDo6aTE2KSk7CisgIFNETm9kZSAqVXBwZXJMb3dlclNlbGVjdCA9CisgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OlNFTEJ2Mmk2NCwgZGwsIFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShVcHBlckhhbGZTaWduTWFzaywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKFZlY09wMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKFVwcGVyTG93ZXJNYXNrLCAwKSk7CisKKyAgU0ROb2RlICpTaGlmdCA9IDA7CisKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihTaGlmdEFtdCkpIHsKKyAgICB1bnNpZ25lZCBieXRlcyA9IHVuc2lnbmVkKENOLT5nZXRaRXh0VmFsdWUoKSkgPj4gMzsKKyAgICB1bnNpZ25lZCBiaXRzID0gdW5zaWduZWQoQ04tPmdldFpFeHRWYWx1ZSgpKSAmIDc7CisKKyAgICBpZiAoYnl0ZXMgPiAwKSB7CisgICAgICBieXRlcyA9IDMxIC0gYnl0ZXM7CisgICAgICBTaGlmdCA9CisgICAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpST1RRQllJdjJpNjQsIGRsLCBWZWNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKFVwcGVyTG93ZXJTZWxlY3QsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoYnl0ZXMsIFNoaWZ0QW10VlQpKTsKKyAgICB9CisKKyAgICBpZiAoYml0cyA+IDApIHsKKyAgICAgIGJpdHMgPSA4IC0gYml0czsKKyAgICAgIFNoaWZ0ID0KKyAgICAgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OlJPVFFCSUl2Mmk2NCwgZGwsIFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoKFNoaWZ0ICE9IDAgPyBTaGlmdCA6IFVwcGVyTG93ZXJTZWxlY3QpLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KGJpdHMsIFNoaWZ0QW10VlQpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgU0ROb2RlICpOZWdTaGlmdCA9CisgICAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6U0ZJcjMyLCBkbCwgU2hpZnRBbXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hpZnRBbXQsIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgU2hpZnRBbXRWVCkpOworCisgICAgU2hpZnQgPQorICAgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6OlJPVFFCWUJJdjJpNjRfcjMyLCBkbCwgVmVjVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVXBwZXJMb3dlclNlbGVjdCwgMCksIFNEVmFsdWUoTmVnU2hpZnQsIDApKTsKKyAgICBTaGlmdCA9CisgICAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6Uk9UUUJJdjJpNjQsIGRsLCBWZWNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShTaGlmdCwgMCksIFNEVmFsdWUoTmVnU2hpZnQsIDApKTsKKyAgfQorCisgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6T1JpNjRfdjJpNjQsIGRsLCBPcFZULCBTRFZhbHVlKFNoaWZ0LCAwKSk7Cit9CisKKy8qIQorIERvIHRoZSBuZWNlc3NhcnkgbWFnaWMgbmVjZXNzYXJ5IHRvIGxvYWQgYSBpNjQgY29uc3RhbnQKKyAqLworU0ROb2RlICpTUFVEQUdUb0RBR0lTZWw6OlNlbGVjdEk2NENvbnN0YW50KFNETm9kZSAqTiwgRVZUIE9wVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgQ29uc3RhbnRTRE5vZGUgKkNOID0gY2FzdDxDb25zdGFudFNETm9kZT4oTik7CisgIHJldHVybiBTZWxlY3RJNjRDb25zdGFudChDTi0+Z2V0WkV4dFZhbHVlKCksIE9wVlQsIGRsKTsKK30KKworU0ROb2RlICpTUFVEQUdUb0RBR0lTZWw6OlNlbGVjdEk2NENvbnN0YW50KHVpbnQ2NF90IFZhbHVlNjQsIEVWVCBPcFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIEVWVCBPcFZlY1ZUID0gRVZUOjpnZXRWZWN0b3JWVCgqQ3VyREFHLT5nZXRDb250ZXh0KCksIE9wVlQsIDIpOworICBTRFZhbHVlIGk2NHZlYyA9CisgICAgICAgICAgU1BVOjpMb3dlclYySTY0U3BsYXQoT3BWZWNWVCwgKkN1ckRBRywgVmFsdWU2NCwgZGwpOworCisgIC8vIEhlcmUncyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLCBiZWNhdXNlIHdlIGhhdmUgdG8gcGFyc2Ugb3V0IHRoZQorICAvLyBzdWJ0cmVlIGhhbmRlZCBiYWNrIGluIGk2NHZlYzoKKworICBpZiAoaTY0dmVjLmdldE9wY29kZSgpID09IElTRDo6QklUX0NPTlZFUlQpIHsKKyAgICAvLyBUaGUgZGVnZW5lcmF0ZSBjYXNlIHdoZXJlIHRoZSB1cHBlciBhbmQgbG93ZXIgYml0cyBpbiB0aGUgc3BsYXQgYXJlCisgICAgLy8gaWRlbnRpY2FsOgorICAgIFNEVmFsdWUgT3AwID0gaTY0dmVjLmdldE9wZXJhbmQoMCk7CisKKyAgICBSZXBsYWNlVXNlcyhpNjR2ZWMsIE9wMCk7CisgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1BVOjpPUmk2NF92Mmk2NCwgZGwsIE9wVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShlbWl0QnVpbGRWZWN0b3IoT3AwLmdldE5vZGUoKSksIDApKTsKKyAgfSBlbHNlIGlmIChpNjR2ZWMuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpTSFVGQikgeworICAgIFNEVmFsdWUgbGhzID0gaTY0dmVjLmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSByaHMgPSBpNjR2ZWMuZ2V0T3BlcmFuZCgxKTsKKyAgICBTRFZhbHVlIHNodWZtYXNrID0gaTY0dmVjLmdldE9wZXJhbmQoMik7CisKKyAgICBpZiAobGhzLmdldE9wY29kZSgpID09IElTRDo6QklUX0NPTlZFUlQpIHsKKyAgICAgIFJlcGxhY2VVc2VzKGxocywgbGhzLmdldE9wZXJhbmQoMCkpOworICAgICAgbGhzID0gbGhzLmdldE9wZXJhbmQoMCk7CisgICAgfQorCisgICAgU0ROb2RlICpsaHNOb2RlID0gKGxocy5nZXROb2RlKCktPmlzTWFjaGluZU9wY29kZSgpCisgICAgICAgICAgICAgICAgICAgICAgID8gbGhzLmdldE5vZGUoKQorICAgICAgICAgICAgICAgICAgICAgICA6IGVtaXRCdWlsZFZlY3RvcihsaHMuZ2V0Tm9kZSgpKSk7CisKKyAgICBpZiAocmhzLmdldE9wY29kZSgpID09IElTRDo6QklUX0NPTlZFUlQpIHsKKyAgICAgIFJlcGxhY2VVc2VzKHJocywgcmhzLmdldE9wZXJhbmQoMCkpOworICAgICAgcmhzID0gcmhzLmdldE9wZXJhbmQoMCk7CisgICAgfQorCisgICAgU0ROb2RlICpyaHNOb2RlID0gKHJocy5nZXROb2RlKCktPmlzTWFjaGluZU9wY29kZSgpCisgICAgICAgICAgICAgICAgICAgICAgID8gcmhzLmdldE5vZGUoKQorICAgICAgICAgICAgICAgICAgICAgICA6IGVtaXRCdWlsZFZlY3RvcihyaHMuZ2V0Tm9kZSgpKSk7CisKKyAgICBpZiAoc2h1Zm1hc2suZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCSVRfQ09OVkVSVCkgeworICAgICAgUmVwbGFjZVVzZXMoc2h1Zm1hc2ssIHNodWZtYXNrLmdldE9wZXJhbmQoMCkpOworICAgICAgc2h1Zm1hc2sgPSBzaHVmbWFzay5nZXRPcGVyYW5kKDApOworICAgIH0KKworICAgIFNETm9kZSAqc2h1Zk1hc2tOb2RlID0gKHNodWZtYXNrLmdldE5vZGUoKS0+aXNNYWNoaW5lT3Bjb2RlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNodWZtYXNrLmdldE5vZGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZW1pdEJ1aWxkVmVjdG9yKHNodWZtYXNrLmdldE5vZGUoKSkpOworCisgICBTRFZhbHVlIHNodWZOb2RlID0KKyAgICAgICAgICAgIEN1ckRBRy0+Z2V0Tm9kZShTUFVJU0Q6OlNIVUZCLCBkbCwgT3BWZWNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShsaHNOb2RlLCAwKSwgU0RWYWx1ZShyaHNOb2RlLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShzaHVmTWFza05vZGUsIDApKTsKKyAgICBIYW5kbGVTRE5vZGUgRHVtbXkoc2h1Zk5vZGUpOworICAgIFNETm9kZSAqU04gPSBTZWxlY3RDb2RlKER1bW15LmdldFZhbHVlKCkuZ2V0Tm9kZSgpKTsKKyAgICBpZiAoU04gPT0gMCkgU04gPSBEdW1teS5nZXRWYWx1ZSgpLmdldE5vZGUoKTsKKyAgICAKKyAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShTUFU6Ok9SaTY0X3YyaTY0LCBkbCwgT3BWVCwgU0RWYWx1ZShTTiwgMCkpOworICB9IGVsc2UgaWYgKGk2NHZlYy5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJVSUxEX1ZFQ1RPUikgeworICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQVTo6T1JpNjRfdjJpNjQsIGRsLCBPcFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoZW1pdEJ1aWxkVmVjdG9yKGk2NHZlYy5nZXROb2RlKCkpLCAwKSk7CisgIH0gZWxzZSB7CisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJTUFVEQUdUb0RBR0lTZWw6OlNlbGVjdEk2NENvbnN0YW50OiBVbmhhbmRsZWQgaTY0dmVjIgorICAgICAgICAgICAgICAgICAgICAgICJjb25kaXRpb24iKTsKKyAgfQorfQorCisvLy8gY3JlYXRlU1BVSVNlbERhZyAtIFRoaXMgcGFzcyBjb252ZXJ0cyBhIGxlZ2FsaXplZCBEQUcgaW50byBhCisvLy8gU1BVLXNwZWNpZmljIERBRywgcmVhZHkgZm9yIGluc3RydWN0aW9uIHNjaGVkdWxpbmcuCisvLy8KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlU1BVSVNlbERhZyhTUFVUYXJnZXRNYWNoaW5lICZUTSkgeworICByZXR1cm4gbmV3IFNQVURBR1RvREFHSVNlbChUTSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVSVNlbExvd2VyaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJU2VsTG93ZXJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzk2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVSVNlbExvd2VyaW5nLmNwcApAQCAtMCwwICsxLDMxMzkgQEAKKy8vCisvLz09PS0tIFNQVUlTZWxMb3dlcmluZy5jcHAgLSBDZWxsIFNQVSBEQUcgTG93ZXJpbmcgSW1wbGVtZW50YXRpb24gLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNQVVRhcmdldExvd2VyaW5nIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJTUFVSZWdpc3Rlck5hbWVzLmgiCisjaW5jbHVkZSAiU1BVSVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiU1BVVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlNQVUZyYW1lSW5mby5oIgorI2luY2x1ZGUgIlNQVU1hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZUltcGwuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVmVjdG9yRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPG1hcD4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIFVzZWQgaW4gZ2V0VGFyZ2V0Tm9kZU5hbWUoKSBiZWxvdworbmFtZXNwYWNlIHsKKyAgc3RkOjptYXA8dW5zaWduZWQsIGNvbnN0IGNoYXIgKj4gbm9kZV9uYW1lczsKKworICAvLyEgRVZUIG1hcHBpbmcgdG8gdXNlZnVsIGRhdGEgZm9yIENlbGwgU1BVCisgIHN0cnVjdCB2YWx0eXBlX21hcF9zIHsKKyAgICBFVlQgICB2YWx0eXBlOworICAgIGludCAgIHByZWZzbG90X2J5dGU7CisgIH07CisKKyAgY29uc3QgdmFsdHlwZV9tYXBfcyB2YWx0eXBlX21hcFtdID0geworICAgIHsgTVZUOjppMSwgICAzIH0sCisgICAgeyBNVlQ6Omk4LCAgIDMgfSwKKyAgICB7IE1WVDo6aTE2LCAgMiB9LAorICAgIHsgTVZUOjppMzIsICAwIH0sCisgICAgeyBNVlQ6OmYzMiwgIDAgfSwKKyAgICB7IE1WVDo6aTY0LCAgMCB9LAorICAgIHsgTVZUOjpmNjQsICAwIH0sCisgICAgeyBNVlQ6OmkxMjgsIDAgfQorICB9OworCisgIGNvbnN0IHNpemVfdCBuX3ZhbHR5cGVfbWFwID0gc2l6ZW9mKHZhbHR5cGVfbWFwKSAvIHNpemVvZih2YWx0eXBlX21hcFswXSk7CisKKyAgY29uc3QgdmFsdHlwZV9tYXBfcyAqZ2V0VmFsdWVUeXBlTWFwRW50cnkoRVZUIFZUKSB7CisgICAgY29uc3QgdmFsdHlwZV9tYXBfcyAqcmV0dmFsID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbl92YWx0eXBlX21hcDsgKytpKSB7CisgICAgICBpZiAodmFsdHlwZV9tYXBbaV0udmFsdHlwZSA9PSBWVCkgeworICAgICAgICByZXR2YWwgPSB2YWx0eXBlX21hcCArIGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiZ2V0VmFsdWVUeXBlTWFwRW50cnkgcmV0dXJucyBOVUxMIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShWVC5nZXRFVlRTdHJpbmcoKSkpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHJldHZhbDsKKyAgfQorCisgIC8vISBFeHBhbmQgYSBsaWJyYXJ5IGNhbGwgaW50byBhbiBhY3R1YWwgY2FsbCBEQUcgbm9kZQorICAvKiEKKyAgIFxub3RlCisgICBUaGlzIGNvZGUgaXMgdGFrZW4gZnJvbSBTZWxlY3Rpb25EQUdMZWdhbGl6ZSwgc2luY2UgaXQgaXMgbm90IGV4cG9zZWQgYXMKKyAgIHBhcnQgb2YgdGhlIExMVk0gU2VsZWN0aW9uREFHIEFQSS4KKyAgICovCisKKyAgU0RWYWx1ZQorICBFeHBhbmRMaWJDYWxsKFJUTElCOjpMaWJjYWxsIExDLCBTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkLCBTRFZhbHVlICZIaSwgY29uc3QgU1BVVGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICAgIC8vIFRoZSBpbnB1dCBjaGFpbiB0byB0aGlzIGxpYmNhbGwgaXMgdGhlIGVudHJ5IG5vZGUgb2YgdGhlIGZ1bmN0aW9uLgorICAgIC8vIExlZ2FsaXppbmcgdGhlIGNhbGwgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgcHJldmlvdXMgY2FsbCB0byB0aGUKKyAgICAvLyBkZXBlbmRlbmNlLgorICAgIFNEVmFsdWUgSW5DaGFpbiA9IERBRy5nZXRFbnRyeU5vZGUoKTsKKworICAgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0VHkgQXJnczsKKyAgICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdEVudHJ5IEVudHJ5OworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcC5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgRVZUIEFyZ1ZUID0gT3AuZ2V0T3BlcmFuZChpKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICAgIGNvbnN0IFR5cGUgKkFyZ1R5ID0gQXJnVlQuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSk7CisgICAgICBFbnRyeS5Ob2RlID0gT3AuZ2V0T3BlcmFuZChpKTsKKyAgICAgIEVudHJ5LlR5ID0gQXJnVHk7CisgICAgICBFbnRyeS5pc1NFeHQgPSBpc1NpZ25lZDsKKyAgICAgIEVudHJ5LmlzWkV4dCA9ICFpc1NpZ25lZDsKKyAgICAgIEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKyAgICB9CisgICAgU0RWYWx1ZSBDYWxsZWUgPSBEQUcuZ2V0RXh0ZXJuYWxTeW1ib2woVExJLmdldExpYmNhbGxOYW1lKExDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpOworCisgICAgLy8gU3BsaWNlIHRoZSBsaWJjYWxsIGluIHdoZXJldmVyIEZpbmRJbnB1dE91dHB1dENoYWlucyB0ZWxscyB1cyB0by4KKyAgICBjb25zdCBUeXBlICpSZXRUeSA9CisgICAgICAgICAgICAgICAgT3AuZ2V0Tm9kZSgpLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSk7CisgICAgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+IENhbGxJbmZvID0KKyAgICAgICAgICAgIFRMSS5Mb3dlckNhbGxUbyhJbkNoYWluLCBSZXRUeSwgaXNTaWduZWQsICFpc1NpZ25lZCwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFRMSS5nZXRMaWJjYWxsQ2FsbGluZ0NvbnYoTEMpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzUmV0dXJuVmFsdWVVc2VkPSovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsZWUsIEFyZ3MsIERBRywgT3AuZ2V0RGVidWdMb2MoKSk7CisKKyAgICByZXR1cm4gQ2FsbEluZm8uZmlyc3Q7CisgIH0KK30KKworU1BVVGFyZ2V0TG93ZXJpbmc6OlNQVVRhcmdldExvd2VyaW5nKFNQVVRhcmdldE1hY2hpbmUgJlRNKQorICA6IFRhcmdldExvd2VyaW5nKFRNLCBuZXcgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlRUxGKCkpLAorICAgIFNQVVRNKFRNKSB7CisgIC8vIEZvbGQgYXdheSBzZXRjYyBvcGVyYXRpb25zIGlmIHBvc3NpYmxlLgorICBzZXRQb3cyRGl2SXNDaGVhcCgpOworCisgIC8vIFVzZSBfc2V0am1wL19sb25nam1wIGluc3RlYWQgb2Ygc2V0am1wL2xvbmdqbXAuCisgIHNldFVzZVVuZGVyc2NvcmVTZXRKbXAodHJ1ZSk7CisgIHNldFVzZVVuZGVyc2NvcmVMb25nSm1wKHRydWUpOworCisgIC8vIFNldCBSVExJQiBsaWJjYWxsIG5hbWVzIGFzIHVzZWQgYnkgU1BVOgorICBzZXRMaWJjYWxsTmFtZShSVExJQjo6RElWX0Y2NCwgIl9fZmFzdF9kaXZkZjMiKTsKKworICAvLyBTZXQgdXAgdGhlIFNQVSdzIHJlZ2lzdGVyIGNsYXNzZXM6CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppOCwgICBTUFU6OlI4Q1JlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6aTE2LCAgU1BVOjpSMTZDUmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppMzIsICBTUFU6OlIzMkNSZWdpc3RlckNsYXNzKTsKKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6Omk2NCwgIFNQVTo6UjY0Q1JlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjMyLCAgU1BVOjpSMzJGUFJlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjY0LCAgU1BVOjpSNjRGUFJlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6aTEyOCwgU1BVOjpHUFJDUmVnaXN0ZXJDbGFzcyk7CisKKyAgLy8gU1BVIGhhcyBubyBzaWduIG9yIHplcm8gZXh0ZW5kZWQgbG9hZHMgZm9yIGkxLCBpOCwgaTE2OgorICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6RVhUTE9BRCwgIE1WVDo6aTEsIFByb21vdGUpOworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6U0VYVExPQUQsIE1WVDo6aTEsIFByb21vdGUpOworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6WkVYVExPQUQsIE1WVDo6aTEsIFByb21vdGUpOworCisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCAgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCAgTVZUOjpmNjQsIEV4cGFuZCk7CisKKyAgc2V0VHJ1bmNTdG9yZUFjdGlvbihNVlQ6OmkxMjgsIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVDo6aTEyOCwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldFRydW5jU3RvcmVBY3Rpb24oTVZUOjppMTI4LCBNVlQ6OmkxNiwgRXhwYW5kKTsKKyAgc2V0VHJ1bmNTdG9yZUFjdGlvbihNVlQ6OmkxMjgsIE1WVDo6aTgsIEV4cGFuZCk7CisKKyAgc2V0VHJ1bmNTdG9yZUFjdGlvbihNVlQ6OmY2NCwgTVZUOjpmMzIsIEV4cGFuZCk7CisKKyAgLy8gU1BVIGNvbnN0YW50IGxvYWQgYWN0aW9ucyBhcmUgY3VzdG9tIGxvd2VyZWQ6CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50RlAsIE1WVDo6ZjMyLCBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50RlAsIE1WVDo6ZjY0LCBDdXN0b20pOworCisgIC8vIFNQVSdzIGxvYWRzIGFuZCBzdG9yZXMgaGF2ZSB0byBiZSBjdXN0b20gbG93ZXJlZDoKKyAgZm9yICh1bnNpZ25lZCBzY3R5cGUgPSAodW5zaWduZWQpIE1WVDo6aTg7IHNjdHlwZSA8ICh1bnNpZ25lZCkgTVZUOjppMTI4OworICAgICAgICsrc2N0eXBlKSB7CisgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpc2N0eXBlOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgICBWVCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVE9SRSwgIFZULCBDdXN0b20pOworICAgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCAgVlQsIEN1c3RvbSk7CisgICAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlpFWFRMT0FELCBWVCwgQ3VzdG9tKTsKKyAgICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6U0VYVExPQUQsIFZULCBDdXN0b20pOworCisgICAgZm9yICh1bnNpZ25lZCBzdHlwZSA9IHNjdHlwZSAtIDE7IHN0eXBlID49ICh1bnNpZ25lZCkgTVZUOjppODsgLS1zdHlwZSkgeworICAgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgU3RvcmVWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkgc3R5cGU7CisgICAgICBzZXRUcnVuY1N0b3JlQWN0aW9uKFZULCBTdG9yZVZULCBFeHBhbmQpOworICAgIH0KKyAgfQorCisgIGZvciAodW5zaWduZWQgc2N0eXBlID0gKHVuc2lnbmVkKSBNVlQ6OmYzMjsgc2N0eXBlIDwgKHVuc2lnbmVkKSBNVlQ6OmY2NDsKKyAgICAgICArK3NjdHlwZSkgeworICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUID0gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKSBzY3R5cGU7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpMT0FELCAgIFZULCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUT1JFLCAgVlQsIEN1c3RvbSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIHN0eXBlID0gc2N0eXBlIC0gMTsgc3R5cGUgPj0gKHVuc2lnbmVkKSBNVlQ6OmYzMjsgLS1zdHlwZSkgeworICAgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgU3RvcmVWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkgc3R5cGU7CisgICAgICBzZXRUcnVuY1N0b3JlQWN0aW9uKFZULCBTdG9yZVZULCBFeHBhbmQpOworICAgIH0KKyAgfQorCisgIC8vIEV4cGFuZCB0aGUganVtcHRhYmxlIGJyYW5jaGVzCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0pULCAgICAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJfQ0MsICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworCisgIC8vIEN1c3RvbSBsb3dlciBTRUxFQ1RfQ0MgZm9yIG1vc3QgY2FzZXMsIGJ1dCBleHBhbmQgYnkgZGVmYXVsdAorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVF9DQywgICAgTVZUOjppOCwgICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUX0NDLCAgICBNVlQ6OmkxNiwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsICAgIE1WVDo6aTMyLCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVF9DQywgICAgTVZUOjppNjQsICAgQ3VzdG9tKTsKKworICAvLyBTUFUgaGFzIG5vIGludHJpbnNpY3MgZm9yIHRoZXNlIHBhcnRpY3VsYXIgb3BlcmF0aW9uczoKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TUVNQkFSUklFUiwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKworICAvLyBTUFUgaGFzIG5vIGRpdmlzaW9uL3JlbWFpbmRlciBpbnN0cnVjdGlvbnMKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgICAgTVZUOjppOCwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCAgICBNVlQ6Omk4LCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYsICAgIE1WVDo6aTgsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgICAgTVZUOjppOCwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCBNVlQ6Omk4LCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVZSRU0sIE1WVDo6aTgsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgICAgTVZUOjppMTYsICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCAgICBNVlQ6OmkxNiwgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYsICAgIE1WVDo6aTE2LCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgICAgTVZUOjppMTYsICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCBNVlQ6OmkxNiwgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVZSRU0sIE1WVDo6aTE2LCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgICAgTVZUOjppMzIsICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCAgICBNVlQ6OmkzMiwgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYsICAgIE1WVDo6aTMyLCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgICAgTVZUOjppMzIsICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCBNVlQ6OmkzMiwgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVZSRU0sIE1WVDo6aTMyLCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgICAgTVZUOjppNjQsICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCAgICBNVlQ6Omk2NCwgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYsICAgIE1WVDo6aTY0LCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgICAgTVZUOjppNjQsICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCBNVlQ6Omk2NCwgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVZSRU0sIE1WVDo6aTY0LCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgICAgTVZUOjppMTI4LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCAgICBNVlQ6OmkxMjgsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYsICAgIE1WVDo6aTEyOCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgICAgTVZUOjppMTI4LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCBNVlQ6OmkxMjgsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVZSRU0sIE1WVDo6aTEyOCwgRXhwYW5kKTsKKworICAvLyBXZSBkb24ndCBzdXBwb3J0IHNpbi9jb3Mvc3FydC9mbW9kCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTSU4gLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUyAsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUkVNICwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTSU4gLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUyAsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUkVNICwgTVZUOjpmMzIsIEV4cGFuZCk7CisKKyAgLy8gRXhwYW5kIGZzcXJ0IHRvIHRoZSBhcHByb3ByaWF0ZSBsaWJjYWxsIChOT1RFOiBzaG91bGQgdXNlIGgvdyBmc3FydAorICAvLyBmb3IgZjMyISkKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNRUlQsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU1FSVCwgTVZUOjpmMzIsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICAvLyBTUFUgY2FuIGRvIHJvdGF0ZSByaWdodCBhbmQgbGVmdCwgc28gbGVnYWxpemUgaXQuLi4gYnV0IGN1c3RvbWl6ZSBmb3IgaTgKKyAgLy8gYmVjYXVzZSBpbnN0cnVjdGlvbnMgZG9uJ3QgZXhpc3QuCisKKyAgLy8gRklYTUU6IENoYW5nZSBmcm9tICJleHBhbmQiIHRvIGFwcHJvcHJpYXRlIHR5cGUgb25jZSBST1RSIGlzIHN1cHBvcnRlZCBpbgorICAvLyAgICAgICAgLnRkIGZpbGVzLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RSLCBNVlQ6OmkzMiwgICAgRXhwYW5kIC8qTGVnYWwqLyk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlJPVFIsIE1WVDo6aTE2LCAgICBFeHBhbmQgLypMZWdhbCovKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Uk9UUiwgTVZUOjppOCwgICAgIEV4cGFuZCAvKkN1c3RvbSovKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RMLCBNVlQ6OmkzMiwgICAgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RMLCBNVlQ6OmkxNiwgICAgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RMLCBNVlQ6Omk4LCAgICAgQ3VzdG9tKTsKKworICAvLyBTUFUgaGFzIG5vIG5hdGl2ZSB2ZXJzaW9uIG9mIHNoaWZ0IGxlZnQvcmlnaHQgZm9yIGk4CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITCwgIE1WVDo6aTgsICAgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkwsICBNVlQ6Omk4LCAgICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JBLCAgTVZUOjppOCwgICAgIEN1c3RvbSk7CisKKyAgLy8gTWFrZSB0aGVzZSBvcGVyYXRpb25zIGxlZ2FsIGFuZCBoYW5kbGUgdGhlbSBkdXJpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uOgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSEwsICBNVlQ6Omk2NCwgICAgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkwsICBNVlQ6Omk2NCwgICAgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkEsICBNVlQ6Omk2NCwgICAgTGVnYWwpOworCisgIC8vIEN1c3RvbSBsb3dlciBpOCwgaTMyIGFuZCBpNjQgbXVsdGlwbGljYXRpb25zCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTCwgIE1WVDo6aTgsICAgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUwsICBNVlQ6OmkzMiwgICAgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUwsICBNVlQ6Omk2NCwgICAgTGVnYWwpOworCisgIC8vIEV4cGFuZCBkb3VibGUtd2lkdGggbXVsdGlwbGljYXRpb24KKyAgLy8gRklYTUU6IEl0IHdvdWxkIHByb2JhYmx5IGJlIHJlYXNvbmFibGUgdG8gc3VwcG9ydCBzb21lIG9mIHRoZXNlIG9wZXJhdGlvbnMKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCBNVlQ6Omk4LCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCBNVlQ6Omk4LCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUsICAgICBNVlQ6Omk4LCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFMsICAgICBNVlQ6Omk4LCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCBNVlQ6OmkxNiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCBNVlQ6OmkxNiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUsICAgICBNVlQ6OmkxNiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFMsICAgICBNVlQ6OmkxNiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUsICAgICBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFMsICAgICBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUsICAgICBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFMsICAgICBNVlQ6Omk2NCwgRXhwYW5kKTsKKworICAvLyBOZWVkIHRvIGN1c3RvbSBoYW5kbGUgKHNvbWUpIGNvbW1vbiBpOCwgaTY0IG1hdGggb3BzCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFERCwgIE1WVDo6aTgsICAgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBREQsICBNVlQ6Omk2NCwgICAgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIsICBNVlQ6Omk4LCAgICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1VCLCAgTVZUOjppNjQsICAgIExlZ2FsKTsKKworICAvLyBTUFUgZG9lcyBub3QgaGF2ZSBCU1dBUC4gSXQgZG9lcyBoYXZlIGkzMiBzdXBwb3J0IENUTFouCisgIC8vIENUUE9QIGhhcyB0byBiZSBjdXN0b20gbG93ZXJlZC4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlNXQVAsIE1WVDo6aTMyLCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJTV0FQLCBNVlQ6Omk2NCwgICBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUUE9QLCBNVlQ6Omk4LCAgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFBPUCwgTVZUOjppMTYsICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AsIE1WVDo6aTMyLCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUUE9QLCBNVlQ6Omk2NCwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFBPUCwgTVZUOjppMTI4LCAgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFRaICwgTVZUOjppOCwgICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RUWiAsIE1WVDo6aTE2LCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUVFogLCBNVlQ6OmkzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFRaICwgTVZUOjppNjQsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RUWiAsIE1WVDo6aTEyOCwgIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RMWiAsIE1WVDo6aTgsICAgIFByb21vdGUpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaICwgTVZUOjppMTYsICAgUHJvbW90ZSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUTFogLCBNVlQ6OmkzMiwgICBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUTFogLCBNVlQ6Omk2NCwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaICwgTVZUOjppMTI4LCAgRXhwYW5kKTsKKworICAvLyBTUFUgaGFzIGEgdmVyc2lvbiBvZiBzZWxlY3QgdGhhdCBpbXBsZW1lbnRzIChhJn5jKXwoYiZjKSwganVzdCBsaWtlCisgIC8vIHNlbGVjdCBvdWdodCB0byB3b3JrOgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsIE1WVDo6aTgsICAgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsIE1WVDo6aTE2LCAgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsIE1WVDo6aTMyLCAgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsIE1WVDo6aTY0LCAgTGVnYWwpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFVENDLCBNVlQ6Omk4LCAgICBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFVENDLCBNVlQ6OmkxNiwgICBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFVENDLCBNVlQ6OmkzMiwgICBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFVENDLCBNVlQ6Omk2NCwgICBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFVENDLCBNVlQ6OmY2NCwgICBDdXN0b20pOworCisgIC8vIEN1c3RvbSBsb3dlciBpMTI4IC0+IGk2NCB0cnVuY2F0ZXMKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VFJVTkNBVEUsIE1WVDo6aTY0LCBDdXN0b20pOworCisgIC8vIEN1c3RvbSBsb3dlciBpMzIvaTY0IC0+IGkxMjggc2lnbiBleHRlbmQKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkQsIE1WVDo6aTEyOCwgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19TSU5ULCBNVlQ6Omk4LCBQcm9tb3RlKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCwgTVZUOjppOCwgUHJvbW90ZSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQsIE1WVDo6aTE2LCBQcm9tb3RlKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCwgTVZUOjppMTYsIFByb21vdGUpOworICAvLyBTUFUgaGFzIGEgbGVnYWwgRlAgLT4gc2lnbmVkIElOVCBpbnN0cnVjdGlvbiBmb3IgZjMyLCBidXQgZm9yIGY2NCwgbmVlZAorICAvLyB0byBleHBhbmQgdG8gYSBsaWJjYWxsLCBoZW5jZSB0aGUgY3VzdG9tIGxvd2VyaW5nOgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19TSU5ULCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCwgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQsIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5ULCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fU0lOVCwgTVZUOjppMTI4LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5ULCBNVlQ6OmkxMjgsIEV4cGFuZCk7CisKKyAgLy8gRkRJViBvbiBTUFUgcmVxdWlyZXMgY3VzdG9tIGxvd2VyaW5nCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZESVYsIE1WVDo6ZjY0LCBFeHBhbmQpOyAgICAgIC8vIHRvIGxpYmNhbGwKKworICAvLyBTUFUgaGFzIFtVfFNdSU5UX1RPX0ZQIGZvciBmMzItPmkzMiwgYnV0IG5vdCBmb3IgZjY0LT5pMzIsIGY2NC0+aTY0OgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCwgTVZUOjppMTYsIFByb21vdGUpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCBNVlQ6Omk4LCAgUHJvbW90ZSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVJTlRfVE9fRlAsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQLCBNVlQ6OmkxNiwgUHJvbW90ZSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVJTlRfVE9fRlAsIE1WVDo6aTgsICBQcm9tb3RlKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCwgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVJTlRfVE9fRlAsIE1WVDo6aTY0LCBDdXN0b20pOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJULCBNVlQ6OmkzMiwgTGVnYWwpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCSVRfQ09OVkVSVCwgTVZUOjpmMzIsIExlZ2FsKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsIE1WVDo6aTY0LCBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJULCBNVlQ6OmY2NCwgTGVnYWwpOworCisgIC8vIFdlIGNhbm5vdCBzZXh0aW5yZWcoaTEpLiAgRXhwYW5kIHRvIHNoaWZ0cy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTEsIEV4cGFuZCk7CisKKyAgLy8gV2Ugd2FudCB0byBsZWdhbGl6ZSBHbG9iYWxBZGRyZXNzIGFuZCBDb25zdGFudFBvb2wgbm9kZXMgaW50byB0aGUKKyAgLy8gYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb25zIHRvIG1hdGVyaWFsaXplIHRoZSBhZGRyZXNzLgorICBmb3IgKHVuc2lnbmVkIHNjdHlwZSA9ICh1bnNpZ25lZCkgTVZUOjppODsgc2N0eXBlIDwgKHVuc2lnbmVkKSBNVlQ6OmYxMjg7CisgICAgICAgKytzY3R5cGUpIHsKKyAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlzY3R5cGU7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxBZGRyZXNzLCAgVlQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q29uc3RhbnRQb29sLCAgIFZULCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okp1bXBUYWJsZSwgICAgICBWVCwgQ3VzdG9tKTsKKyAgfQorCisgIC8vIFZBU1RBUlQgbmVlZHMgdG8gYmUgY3VzdG9tIGxvd2VyZWQgdG8gdXNlIHRoZSBWYXJBcmdzRnJhbWVJbmRleAorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQVNUQVJUICAgICAgICAgICAsIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisKKyAgLy8gVXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQUFSRyAgICAgICAgICAgICAsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBQ09QWSAgICAgICAgICAgICwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFFTkQgICAgICAgICAgICAgLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVEFDS1NBVkUgICAgICAgICAsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUQUNLUkVTVE9SRSAgICAgICwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RFlOQU1JQ19TVEFDS0FMTE9DLCBNVlQ6OmkzMiAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0MsIE1WVDo6aTY0ICAsIEV4cGFuZCk7CisKKyAgLy8gQ2VsbCBTUFUgaGFzIGluc3RydWN0aW9ucyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGk2NCBhbmQgZnAuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQsIE1WVDo6aTY0LCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKworICAvLyBUbyB0YWtlIGFkdmFudGFnZSBvZiB0aGUgYWJvdmUgaTY0IEZQX1RPX1NJTlQsIHByb21vdGUgaTMyIEZQX1RPX1VJTlQKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCwgTVZUOjppMzIsIFByb21vdGUpOworCisgIC8vIEJVSUxEX1BBSVIgY2FuJ3QgYmUgaGFuZGxlZCBuYXRpdmVseSwgYW5kIHNob3VsZCBiZSBleHBhbmRlZCB0byBzaGwvb3IKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlVJTERfUEFJUiwgTVZUOjppNjQsIEV4cGFuZCk7CisKKyAgLy8gRmlyc3Qgc2V0IG9wZXJhdGlvbiBhY3Rpb24gZm9yIGFsbCB2ZWN0b3IgdHlwZXMgdG8gZXhwYW5kLiBUaGVuIHdlCisgIC8vIHdpbGwgc2VsZWN0aXZlbHkgdHVybiBvbiBvbmVzIHRoYXQgY2FuIGJlIGVmZmVjdGl2ZWx5IGNvZGVnZW4nZC4KKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnYxNmk4LCBTUFU6OlZFQ1JFR1JlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6djhpMTYsIFNQVTo6VkVDUkVHUmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjp2NGkzMiwgU1BVOjpWRUNSRUdSZWdpc3RlckNsYXNzKTsKKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnYyaTY0LCBTUFU6OlZFQ1JFR1JlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6djRmMzIsIFNQVTo6VkVDUkVHUmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjp2MmY2NCwgU1BVOjpWRUNSRUdSZWdpc3RlckNsYXNzKTsKKworICAvLyAiT2RkIHNpemUiIHZlY3RvciBjbGFzc2VzIHRoYXQgd2UncmUgd2lsbGluZyB0byBzdXBwb3J0OgorICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6djJpMzIsIFNQVTo6VkVDUkVHUmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjp2MmYzMiwgU1BVOjpWRUNSRUdSZWdpc3RlckNsYXNzKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAodW5zaWduZWQpTVZUOjpGSVJTVF9WRUNUT1JfVkFMVUVUWVBFOworICAgICAgIGkgPD0gKHVuc2lnbmVkKU1WVDo6TEFTVF9WRUNUT1JfVkFMVUVUWVBFOyArK2kpIHsKKyAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlpOworCisgICAgLy8gYWRkL3N1YiBhcmUgbGVnYWwgZm9yIGFsbCBzdXBwb3J0ZWQgdmVjdG9yIFZUJ3MuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURELCAgICAgVlQsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIsICAgICBWVCwgTGVnYWwpOworICAgIC8vIG11bCBoYXMgdG8gYmUgY3VzdG9tIGxvd2VyZWQuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMLCAgICAgVlQsIExlZ2FsKTsKKworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFORCwgICAgIFZULCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6T1IsICAgICAgVlQsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpYT1IsICAgICBWVCwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkxPQUQsICAgIFZULCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCAgVlQsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVE9SRSwgICBWVCwgTGVnYWwpOworCisgICAgLy8gVGhlc2Ugb3BlcmF0aW9ucyBuZWVkIHRvIGJlIGV4cGFuZGVkOgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYsICAgIFZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSRU0sICAgIFZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVYsICAgIFZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVSRU0sICAgIFZULCBFeHBhbmQpOworCisgICAgLy8gQ3VzdG9tIGxvd2VyIGJ1aWxkX3ZlY3RvciwgY29uc3RhbnQgcG9vbCBzcGlsbHMsIGluc2VydCBhbmQKKyAgICAvLyBleHRyYWN0IHZlY3RvciBlbGVtZW50czoKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCVUlMRF9WRUNUT1IsIFZULCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50UG9vbCwgVlQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgVlQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBWVCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgVlQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkVDVE9SX1NIVUZGTEUsIFZULCBDdXN0b20pOworICB9CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QU5ELCBNVlQ6OnYxNmk4LCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpPUiwgIE1WVDo6djE2aTgsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlhPUiwgTVZUOjp2MTZpOCwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgTVZUOjp2NGYzMiwgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGRElWLCBNVlQ6OnY0ZjMyLCBMZWdhbCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RPUkUsIE1WVDo6djJpMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUT1JFLCBNVlQ6OnYyZjMyLCBDdXN0b20pOworCisgIHNldFNoaWZ0QW1vdW50VHlwZShNVlQ6OmkzMik7CisgIHNldEJvb2xlYW5Db250ZW50cyhaZXJvT3JOZWdhdGl2ZU9uZUJvb2xlYW5Db250ZW50KTsKKworICBzZXRTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUoU1BVOjpSMSk7CisKKyAgLy8gV2UgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgZGFnIGNvbWJpbmUgcGF0dGVybnMgZm9yIHRoZSBmb2xsb3dpbmcgbm9kZXM6CisgIHNldFRhcmdldERBR0NvbWJpbmUoSVNEOjpBREQpOworICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6WkVST19FWFRFTkQpOworICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6U0lHTl9FWFRFTkQpOworICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6QU5ZX0VYVEVORCk7CisKKyAgY29tcHV0ZVJlZ2lzdGVyUHJvcGVydGllcygpOworCisgIC8vIFNldCBwcmUtUkEgcmVnaXN0ZXIgc2NoZWR1bGVyIGRlZmF1bHQgdG8gQlVSUiwgd2hpY2ggcHJvZHVjZXMgc2xpZ2h0bHkKKyAgLy8gYmV0dGVyIGNvZGUgdGhhbiB0aGUgZGVmYXVsdCAoY291bGQgYWxzbyBiZSBURFJSLCBidXQgVGFyZ2V0TG93ZXJpbmcuaAorICAvLyBuZWVkcyBhIG1vZCB0byBzdXBwb3J0IHRoYXQgbW9kZWwpOgorICBzZXRTY2hlZHVsaW5nUHJlZmVyZW5jZShTY2hlZDo6UmVnUHJlc3N1cmUpOworfQorCitjb25zdCBjaGFyICoKK1NQVVRhcmdldExvd2VyaW5nOjpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0Cit7CisgIGlmIChub2RlX25hbWVzLmVtcHR5KCkpIHsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpSRVRfRkxBR10gPSAiU1BVSVNEOjpSRVRfRkxBRyI7CisgICAgbm9kZV9uYW1lc1sodW5zaWduZWQpIFNQVUlTRDo6SGldID0gIlNQVUlTRDo6SGkiOworICAgIG5vZGVfbmFtZXNbKHVuc2lnbmVkKSBTUFVJU0Q6OkxvXSA9ICJTUFVJU0Q6OkxvIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpQQ1JlbEFkZHJdID0gIlNQVUlTRDo6UENSZWxBZGRyIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpBRm9ybUFkZHJdID0gIlNQVUlTRDo6QUZvcm1BZGRyIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpJbmRpcmVjdEFkZHJdID0gIlNQVUlTRDo6SW5kaXJlY3RBZGRyIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpMRFJFU1VMVF0gPSAiU1BVSVNEOjpMRFJFU1VMVCI7CisgICAgbm9kZV9uYW1lc1sodW5zaWduZWQpIFNQVUlTRDo6Q0FMTF0gPSAiU1BVSVNEOjpDQUxMIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpTSFVGQl0gPSAiU1BVSVNEOjpTSFVGQiI7CisgICAgbm9kZV9uYW1lc1sodW5zaWduZWQpIFNQVUlTRDo6U0hVRkZMRV9NQVNLXSA9ICJTUFVJU0Q6OlNIVUZGTEVfTUFTSyI7CisgICAgbm9kZV9uYW1lc1sodW5zaWduZWQpIFNQVUlTRDo6Q05UQl0gPSAiU1BVSVNEOjpDTlRCIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpQUkVGU0xPVDJWRUNdID0gIlNQVUlTRDo6UFJFRlNMT1QyVkVDIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpWRUMyUFJFRlNMT1RdID0gIlNQVUlTRDo6VkVDMlBSRUZTTE9UIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpTSExRVUFEX0xfQklUU10gPSAiU1BVSVNEOjpTSExRVUFEX0xfQklUUyI7CisgICAgbm9kZV9uYW1lc1sodW5zaWduZWQpIFNQVUlTRDo6U0hMUVVBRF9MX0JZVEVTXSA9ICJTUFVJU0Q6OlNITFFVQURfTF9CWVRFUyI7CisgICAgbm9kZV9uYW1lc1sodW5zaWduZWQpIFNQVUlTRDo6VkVDX1JPVExdID0gIlNQVUlTRDo6VkVDX1JPVEwiOworICAgIG5vZGVfbmFtZXNbKHVuc2lnbmVkKSBTUFVJU0Q6OlZFQ19ST1RSXSA9ICJTUFVJU0Q6OlZFQ19ST1RSIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpST1RCWVRFU19MRUZUXSA9ICJTUFVJU0Q6OlJPVEJZVEVTX0xFRlQiOworICAgIG5vZGVfbmFtZXNbKHVuc2lnbmVkKSBTUFVJU0Q6OlJPVEJZVEVTX0xFRlRfQklUU10gPQorICAgICAgICAgICAgIlNQVUlTRDo6Uk9UQllURVNfTEVGVF9CSVRTIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpTRUxFQ1RfTUFTS10gPSAiU1BVSVNEOjpTRUxFQ1RfTUFTSyI7CisgICAgbm9kZV9uYW1lc1sodW5zaWduZWQpIFNQVUlTRDo6U0VMQl0gPSAiU1BVSVNEOjpTRUxCIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpBREQ2NF9NQVJLRVJdID0gIlNQVUlTRDo6QURENjRfTUFSS0VSIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpTVUI2NF9NQVJLRVJdID0gIlNQVUlTRDo6U1VCNjRfTUFSS0VSIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpNVUw2NF9NQVJLRVJdID0gIlNQVUlTRDo6TVVMNjRfTUFSS0VSIjsKKyAgICBub2RlX25hbWVzWyh1bnNpZ25lZCkgU1BVSVNEOjpIQUxGMlZFQ10gPSAiU1BVSVNEOjpIQUxGMlZFQyI7CisgICAgbm9kZV9uYW1lc1sodW5zaWduZWQpIFNQVUlTRDo6VkVDMkhBTEZdID0gIlNQVUlTRDo6VkVDMkhBTEYiOworICB9CisKKyAgc3RkOjptYXA8dW5zaWduZWQsIGNvbnN0IGNoYXIgKj46Oml0ZXJhdG9yIGkgPSBub2RlX25hbWVzLmZpbmQoT3Bjb2RlKTsKKworICByZXR1cm4gKChpICE9IG5vZGVfbmFtZXMuZW5kKCkpID8gaS0+c2Vjb25kIDogMCk7Cit9CisKKy8vLyBnZXRGdW5jdGlvbkFsaWdubWVudCAtIFJldHVybiB0aGUgTG9nMiBhbGlnbm1lbnQgb2YgdGhpcyBmdW5jdGlvbi4KK3Vuc2lnbmVkIFNQVVRhcmdldExvd2VyaW5nOjpnZXRGdW5jdGlvbkFsaWdubWVudChjb25zdCBGdW5jdGlvbiAqKSBjb25zdCB7CisgIHJldHVybiAzOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmV0dXJuIHRoZSBDZWxsIFNQVSdzIFNFVENDIHJlc3VsdCB0eXBlCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNVlQ6OlNpbXBsZVZhbHVlVHlwZSBTUFVUYXJnZXRMb3dlcmluZzo6Z2V0U2V0Q0NSZXN1bHRUeXBlKEVWVCBWVCkgY29uc3QgeworICAvLyBpMTYgYW5kIGkzMiBhcmUgdmFsaWQgU0VUQ0MgcmVzdWx0IHR5cGVzCisgIHJldHVybiAoKFZUID09IE1WVDo6aTggfHwgVlQgPT0gTVZUOjppMTYgfHwgVlQgPT0gTVZUOjppMzIpID8KKyAgICBWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5IDoKKyAgICBNVlQ6OmkzMik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDYWxsaW5nIGNvbnZlbnRpb24gY29kZToKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJTUFVHZW5DYWxsaW5nQ29udi5pbmMiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTG93ZXJPcGVyYXRpb24gaW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBDdXN0b20gbG93ZXIgbG9hZHMgZm9yIENlbGxTUFUKKy8qIQorIEFsbCBDZWxsU1BVIGxvYWRzIGFuZCBzdG9yZXMgYXJlIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyaWVzLCBzbyBmb3IgZWxlbWVudHMKKyB3aXRoaW4gYSAxNi1ieXRlIGJsb2NrLCB3ZSBoYXZlIHRvIHJvdGF0ZSB0byBleHRyYWN0IHRoZSByZXF1ZXN0ZWQgZWxlbWVudC4KKworIEZvciBleHRlbmRpbmcgbG9hZHMsIHdlIGFsc28gd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzCisgZW1pdHRlZCwgZS5nLiBmb3IgTVZUOjpmMzIgZXh0ZW5kaW5nIGxvYWQgdG8gTVZUOjpmNjQ6CisKK1x2ZXJiYXRpbQorJTEgIHYxNmk4LGNoID0gbG9hZAorJTIgIHYxNmk4LGNoID0gcm90YXRlICUxCislMyAgdjRmOCwgY2ggPSBiaXRjb252ZXJ0ICUyCislNCAgZjMyICAgICAgPSB2ZWMycGVyZnNsb3QgJTMKKyU1ICBmNjQgICAgICA9IGZwX2V4dGVuZCAlNAorXGVuZHZlcmJhdGltCisqLworc3RhdGljIFNEVmFsdWUKK0xvd2VyTE9BRChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywgY29uc3QgU1BVU3VidGFyZ2V0ICpTVCkgeworICBMb2FkU0ROb2RlICpMTiA9IGNhc3Q8TG9hZFNETm9kZT4oT3ApOworICBTRFZhbHVlIHRoZV9jaGFpbiA9IExOLT5nZXRDaGFpbigpOworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisgIEVWVCBJblZUID0gTE4tPmdldE1lbW9yeVZUKCk7CisgIEVWVCBPdXRWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUgPSBMTi0+Z2V0RXh0ZW5zaW9uVHlwZSgpOworICB1bnNpZ25lZCBhbGlnbm1lbnQgPSBMTi0+Z2V0QWxpZ25tZW50KCk7CisgIGNvbnN0IHZhbHR5cGVfbWFwX3MgKnZ0bSA9IGdldFZhbHVlVHlwZU1hcEVudHJ5KEluVlQpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgc3dpdGNoIChMTi0+Z2V0QWRkcmVzc2luZ01vZGUoKSkgeworICBjYXNlIElTRDo6VU5JTkRFWEVEOiB7CisgICAgU0RWYWx1ZSByZXN1bHQ7CisgICAgU0RWYWx1ZSBiYXNlUHRyID0gTE4tPmdldEJhc2VQdHIoKTsKKyAgICBTRFZhbHVlIHJvdGF0ZTsKKworICAgIGlmIChhbGlnbm1lbnQgPT0gMTYpIHsKKyAgICAgIENvbnN0YW50U0ROb2RlICpDTjsKKworICAgICAgLy8gU3BlY2lhbCBjYXNlcyBmb3IgYSBrbm93biBhbGlnbmVkIGxvYWQgdG8gc2ltcGxpZnkgdGhlIGJhc2UgcG9pbnRlcgorICAgICAgLy8gYW5kIHRoZSByb3RhdGlvbiBhbW91bnQ6CisgICAgICBpZiAoYmFzZVB0ci5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERAorICAgICAgICAgICYmIChDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlID4gKGJhc2VQdHIuZ2V0T3BlcmFuZCgxKSkpICE9IDApIHsKKyAgICAgICAgLy8gS25vd24gb2Zmc2V0IGludG8gYmFzZVB0cgorICAgICAgICBpbnQ2NF90IG9mZnNldCA9IENOLT5nZXRTRXh0VmFsdWUoKTsKKyAgICAgICAgaW50NjRfdCByb3RhbXQgPSBpbnQ2NF90KChvZmZzZXQgJiAweGYpIC0gdnRtLT5wcmVmc2xvdF9ieXRlKTsKKworICAgICAgICBpZiAocm90YW10IDwgMCkKKyAgICAgICAgICByb3RhbXQgKz0gMTY7CisKKyAgICAgICAgcm90YXRlID0gREFHLmdldENvbnN0YW50KHJvdGFtdCwgTVZUOjppMTYpOworCisgICAgICAgIC8vIFNpbXBsaWZ5IHRoZSBiYXNlIHBvaW50ZXIgZm9yIHRoaXMgY2FzZToKKyAgICAgICAgYmFzZVB0ciA9IGJhc2VQdHIuZ2V0T3BlcmFuZCgwKTsKKyAgICAgICAgaWYgKChvZmZzZXQgJiB+MHhmKSA+IDApIHsKKyAgICAgICAgICBiYXNlUHRyID0gREFHLmdldE5vZGUoU1BVSVNEOjpJbmRpcmVjdEFkZHIsIGRsLCBQdHJWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KChvZmZzZXQgJiB+MHhmKSwgUHRyVlQpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICgoYmFzZVB0ci5nZXRPcGNvZGUoKSA9PSBTUFVJU0Q6OkFGb3JtQWRkcikKKyAgICAgICAgICAgICAgICAgfHwgKGJhc2VQdHIuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpJbmRpcmVjdEFkZHIKKyAgICAgICAgICAgICAgICAgICAgICYmIGJhc2VQdHIuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBTUFVJU0Q6OkhpCisgICAgICAgICAgICAgICAgICAgICAmJiBiYXNlUHRyLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpMbykpIHsKKyAgICAgICAgLy8gUGxhaW4gYWxpZ25lZCBhLWZvcm0gYWRkcmVzczogcm90YXRlIGludG8gcHJlZmVycmVkIHNsb3QKKyAgICAgICAgLy8gU2FtZSBmb3IgKFNQVWluZGlyZWN0IChTUFVoaSAuLi4pLCAoU1BVbG8gLi4uKSkKKyAgICAgICAgaW50NjRfdCByb3RhbXQgPSAtdnRtLT5wcmVmc2xvdF9ieXRlOworICAgICAgICBpZiAocm90YW10IDwgMCkKKyAgICAgICAgICByb3RhbXQgKz0gMTY7CisgICAgICAgIHJvdGF0ZSA9IERBRy5nZXRDb25zdGFudChyb3RhbXQsIE1WVDo6aTE2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE9mZnNldCB0aGUgcm90YXRlIGFtb3VudCBieSB0aGUgYmFzZVB0ciBhbmQgdGhlIHByZWZlcnJlZCBzbG90CisgICAgICAgIC8vIGJ5dGUgb2Zmc2V0CisgICAgICAgIGludDY0X3Qgcm90YW10ID0gLXZ0bS0+cHJlZnNsb3RfYnl0ZTsKKyAgICAgICAgaWYgKHJvdGFtdCA8IDApCisgICAgICAgICAgcm90YW10ICs9IDE2OworICAgICAgICByb3RhdGUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQocm90YW10LCBQdHJWVCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBVbmFsaWduZWQgbG9hZDogbXVzdCBiZSBtb3JlIHBlc3NpbWlzdGljIGFib3V0IGFkZHJlc3NpbmcgbW9kZXM6CisgICAgICBpZiAoYmFzZVB0ci5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZSZWdJbmZvID0gTUYuZ2V0UmVnSW5mbygpOworICAgICAgICB1bnNpZ25lZCBWUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoJlNQVTo6UjMyQ1JlZ0NsYXNzKTsKKyAgICAgICAgU0RWYWx1ZSBGbGFnOworCisgICAgICAgIFNEVmFsdWUgT3AwID0gYmFzZVB0ci5nZXRPcGVyYW5kKDApOworICAgICAgICBTRFZhbHVlIE9wMSA9IGJhc2VQdHIuZ2V0T3BlcmFuZCgxKTsKKworICAgICAgICBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihPcDEpKSB7CisgICAgICAgICAgLy8gQ29udmVydCB0aGUgKGFkZCA8cHRyPiwgPGNvbnN0PikgdG8gYW4gaW5kaXJlY3QgYWRkcmVzcyBjb250YWluZWQKKyAgICAgICAgICAvLyBpbiBhIHJlZ2lzdGVyLiBOb3RlIHRoYXQgdGhpcyBpcyBkb25lIGJlY2F1c2Ugd2UgbmVlZCB0byBhdm9pZAorICAgICAgICAgIC8vIGNyZWF0aW5nIGEgMChyZWcpIGQtZm9ybSBhZGRyZXNzIGR1ZSB0byB0aGUgU1BVJ3MgYmxvY2sgbG9hZHMuCisgICAgICAgICAgYmFzZVB0ciA9IERBRy5nZXROb2RlKFNQVUlTRDo6SW5kaXJlY3RBZGRyLCBkbCwgUHRyVlQsIE9wMCwgT3AxKTsKKyAgICAgICAgICB0aGVfY2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKHRoZV9jaGFpbiwgZGwsIFZSZWcsIGJhc2VQdHIsIEZsYWcpOworICAgICAgICAgIGJhc2VQdHIgPSBEQUcuZ2V0Q29weUZyb21SZWcodGhlX2NoYWluLCBkbCwgVlJlZywgUHRyVlQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIENvbnZlcnQgdGhlIChhZGQgPGFyZzE+LCA8YXJnMj4pIHRvIGFuIGluZGlyZWN0IGFkZHJlc3MsIHdoaWNoCisgICAgICAgICAgLy8gd2lsbCBsaWtlbHkgYmUgbG93ZXJlZCBhcyBhIHJlZyhyZWcpIHgtZm9ybSBhZGRyZXNzLgorICAgICAgICAgIGJhc2VQdHIgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIFB0clZULCBPcDAsIE9wMSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJhc2VQdHIgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIFB0clZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBQdHJWVCkpOworICAgICAgfQorCisgICAgICAvLyBPZmZzZXQgdGhlIHJvdGF0ZSBhbW91bnQgYnkgdGhlIGJhc2VQdHIgYW5kIHRoZSBwcmVmZXJyZWQgc2xvdAorICAgICAgLy8gYnl0ZSBvZmZzZXQKKyAgICAgIHJvdGF0ZSA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KC12dG0tPnByZWZzbG90X2J5dGUsIFB0clZUKSk7CisgICAgfQorCisgICAgLy8gUmUtZW1pdCBhcyBhIHYxNmk4IHZlY3RvciBsb2FkCisgICAgcmVzdWx0ID0gREFHLmdldExvYWQoTVZUOjp2MTZpOCwgZGwsIHRoZV9jaGFpbiwgYmFzZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMTi0+Z2V0U3JjVmFsdWUoKSwgTE4tPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTE4tPmlzVm9sYXRpbGUoKSwgTE4tPmlzTm9uVGVtcG9yYWwoKSwgMTYpOworCisgICAgLy8gVXBkYXRlIHRoZSBjaGFpbgorICAgIHRoZV9jaGFpbiA9IHJlc3VsdC5nZXRWYWx1ZSgxKTsKKworICAgIC8vIFJvdGF0ZSBpbnRvIHRoZSBwcmVmZXJyZWQgc2xvdDoKKyAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OlJPVEJZVEVTX0xFRlQsIGRsLCBNVlQ6OnYxNmk4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRWYWx1ZSgwKSwgcm90YXRlKTsKKworICAgIC8vIENvbnZlcnQgdGhlIGxvYWRlZCB2MTZpOCB2ZWN0b3IgdG8gdGhlIGFwcHJvcHJpYXRlIHZlY3RvciB0eXBlCisgICAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBvcGVyYW5kOgorICAgIEVWVCB2ZWNWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5WVCwgKDEyOCAvIEluVlQuZ2V0U2l6ZUluQml0cygpKSk7CisgICAgcmVzdWx0ID0gREFHLmdldE5vZGUoU1BVSVNEOjpWRUMyUFJFRlNMT1QsIGRsLCBJblZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCB2ZWNWVCwgcmVzdWx0KSk7CisKKyAgICAvLyBIYW5kbGUgZXh0ZW5kaW5nIGxvYWRzIGJ5IGV4dGVuZGluZyB0aGUgc2NhbGFyIHJlc3VsdDoKKyAgICBpZiAoRXh0VHlwZSA9PSBJU0Q6OlNFWFRMT0FEKSB7CisgICAgICByZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBkbCwgT3V0VlQsIHJlc3VsdCk7CisgICAgfSBlbHNlIGlmIChFeHRUeXBlID09IElTRDo6WkVYVExPQUQpIHsKKyAgICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBPdXRWVCwgcmVzdWx0KTsKKyAgICB9IGVsc2UgaWYgKEV4dFR5cGUgPT0gSVNEOjpFWFRMT0FEKSB7CisgICAgICB1bnNpZ25lZCBOZXdPcGMgPSBJU0Q6OkFOWV9FWFRFTkQ7CisKKyAgICAgIGlmIChPdXRWVC5pc0Zsb2F0aW5nUG9pbnQoKSkKKyAgICAgICAgTmV3T3BjID0gSVNEOjpGUF9FWFRFTkQ7CisKKyAgICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKE5ld09wYywgZGwsIE91dFZULCByZXN1bHQpOworICAgIH0KKworICAgIFNEVlRMaXN0IHJldHZ0cyA9IERBRy5nZXRWVExpc3QoT3V0VlQsIE1WVDo6T3RoZXIpOworICAgIFNEVmFsdWUgcmV0b3BzWzJdID0geworICAgICAgcmVzdWx0LAorICAgICAgdGhlX2NoYWluCisgICAgfTsKKworICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKFNQVUlTRDo6TERSRVNVTFQsIGRsLCByZXR2dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0b3BzLCBzaXplb2YocmV0b3BzKSAvIHNpemVvZihyZXRvcHNbMF0pKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGNhc2UgSVNEOjpQUkVfSU5DOgorICBjYXNlIElTRDo6UFJFX0RFQzoKKyAgY2FzZSBJU0Q6OlBPU1RfSU5DOgorICBjYXNlIElTRDo6UE9TVF9ERUM6CisgIGNhc2UgSVNEOjpMQVNUX0lOREVYRURfTU9ERToKKyAgICB7CisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkxvd2VyTE9BRDogR290IGEgTG9hZFNETm9kZSB3aXRoIGFuIGFkZHIgbW9kZSBvdGhlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gVU5JTkRFWEVEXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZSgodW5zaWduZWQpTE4tPmdldEFkZHJlc3NpbmdNb2RlKCkpKTsKKyAgICAgIC8qTk9UUkVBQ0hFRCovCisgICAgfQorICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIEN1c3RvbSBsb3dlciBzdG9yZXMgZm9yIENlbGxTUFUKKy8qIQorIEFsbCBDZWxsU1BVIHN0b3JlcyBhcmUgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJpZXMsIHNvIGZvciBlbGVtZW50cworIHdpdGhpbiBhIDE2LWJ5dGUgYmxvY2ssIHdlIGhhdmUgdG8gZ2VuZXJhdGUgYSBzaHVmZmxlIHRvIGluc2VydCB0aGUKKyByZXF1ZXN0ZWQgZWxlbWVudCBpbnRvIGl0cyBwbGFjZSwgdGhlbiBzdG9yZSB0aGUgcmVzdWx0aW5nIGJsb2NrLgorICovCitzdGF0aWMgU0RWYWx1ZQorTG93ZXJTVE9SRShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywgY29uc3QgU1BVU3VidGFyZ2V0ICpTVCkgeworICBTdG9yZVNETm9kZSAqU04gPSBjYXN0PFN0b3JlU0ROb2RlPihPcCk7CisgIFNEVmFsdWUgVmFsdWUgPSBTTi0+Z2V0VmFsdWUoKTsKKyAgRVZUIFZUID0gVmFsdWUuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBTdFZUID0gKCFTTi0+aXNUcnVuY2F0aW5nU3RvcmUoKSA/IFZUIDogU04tPmdldE1lbW9yeVZUKCkpOworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgYWxpZ25tZW50ID0gU04tPmdldEFsaWdubWVudCgpOworICBjb25zdCBib29sIGlzVmVjID0gVlQuaXNWZWN0b3IoKTsKKyAgRVZUIGVsdFR5ID0gaXNWZWMgPyBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOiBWVDsKKworICBzd2l0Y2ggKFNOLT5nZXRBZGRyZXNzaW5nTW9kZSgpKSB7CisgIGNhc2UgSVNEOjpVTklOREVYRUQ6IHsKKyAgICAvLyBUaGUgdmVjdG9yIHR5cGUgd2UgcmVhbGx5IHdhbnQgdG8gbG9hZCBmcm9tIHRoZSAxNi1ieXRlIGNodW5rLgorICAgIEVWVCB2ZWNWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHRUeSwgKDEyOCAvIGVsdFR5LmdldFNpemVJbkJpdHMoKSkpOworCisgICAgU0RWYWx1ZSBhbGlnbkxvYWRWZWM7CisgICAgU0RWYWx1ZSBiYXNlUHRyID0gU04tPmdldEJhc2VQdHIoKTsKKyAgICBTRFZhbHVlIHRoZV9jaGFpbiA9IFNOLT5nZXRDaGFpbigpOworICAgIFNEVmFsdWUgaW5zZXJ0RWx0T2ZmczsKKworICAgIGlmIChhbGlnbm1lbnQgPT0gMTYpIHsKKyAgICAgIENvbnN0YW50U0ROb2RlICpDTjsKKyAgICAgIC8vIFNwZWNpYWwgY2FzZXMgZm9yIGEga25vd24gYWxpZ25lZCBsb2FkIHRvIHNpbXBsaWZ5IHRoZSBiYXNlIHBvaW50ZXIKKyAgICAgIC8vIGFuZCBpbnNlcnRpb24gYnl0ZToKKyAgICAgIGlmIChiYXNlUHRyLmdldE9wY29kZSgpID09IElTRDo6QURECisgICAgICAgICAgJiYgKENOID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KGJhc2VQdHIuZ2V0T3BlcmFuZCgxKSkpICE9IDApIHsKKyAgICAgICAgLy8gS25vd24gb2Zmc2V0IGludG8gYmFzZVB0cgorICAgICAgICBpbnQ2NF90IG9mZnNldCA9IENOLT5nZXRTRXh0VmFsdWUoKTsKKworICAgICAgICAvLyBTaW1wbGlmeSB0aGUgYmFzZSBwb2ludGVyIGZvciB0aGlzIGNhc2U6CisgICAgICAgIGJhc2VQdHIgPSBiYXNlUHRyLmdldE9wZXJhbmQoMCk7CisgICAgICAgIGluc2VydEVsdE9mZnMgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIFB0clZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgob2Zmc2V0ICYgMHhmKSwgUHRyVlQpKTsKKworICAgICAgICBpZiAoKG9mZnNldCAmIH4weGYpID4gMCkgeworICAgICAgICAgIGJhc2VQdHIgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIFB0clZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoKG9mZnNldCAmIH4weGYpLCBQdHJWVCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSBpdCdzIGF0IGJ5dGUgMCBvZiBiYXNlUHRyCisgICAgICAgIGluc2VydEVsdE9mZnMgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIFB0clZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBQdHJWVCkpOworICAgICAgICBiYXNlUHRyID0gREFHLmdldE5vZGUoU1BVSVNEOjpJbmRpcmVjdEFkZHIsIGRsLCBQdHJWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gVW5hbGlnbmVkIGxvYWQ6IG11c3QgYmUgbW9yZSBwZXNzaW1pc3RpYyBhYm91dCBhZGRyZXNzaW5nIG1vZGVzOgorICAgICAgaWYgKGJhc2VQdHIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQpIHsKKyAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmUmVnSW5mbyA9IE1GLmdldFJlZ0luZm8oKTsKKyAgICAgICAgdW5zaWduZWQgVlJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKCZTUFU6OlIzMkNSZWdDbGFzcyk7CisgICAgICAgIFNEVmFsdWUgRmxhZzsKKworICAgICAgICBTRFZhbHVlIE9wMCA9IGJhc2VQdHIuZ2V0T3BlcmFuZCgwKTsKKyAgICAgICAgU0RWYWx1ZSBPcDEgPSBiYXNlUHRyLmdldE9wZXJhbmQoMSk7CisKKyAgICAgICAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oT3AxKSkgeworICAgICAgICAgIC8vIENvbnZlcnQgdGhlIChhZGQgPHB0cj4sIDxjb25zdD4pIHRvIGFuIGluZGlyZWN0IGFkZHJlc3MgY29udGFpbmVkCisgICAgICAgICAgLy8gaW4gYSByZWdpc3Rlci4gTm90ZSB0aGF0IHRoaXMgaXMgZG9uZSBiZWNhdXNlIHdlIG5lZWQgdG8gYXZvaWQKKyAgICAgICAgICAvLyBjcmVhdGluZyBhIDAocmVnKSBkLWZvcm0gYWRkcmVzcyBkdWUgdG8gdGhlIFNQVSdzIGJsb2NrIGxvYWRzLgorICAgICAgICAgIGJhc2VQdHIgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIFB0clZULCBPcDAsIE9wMSk7CisgICAgICAgICAgdGhlX2NoYWluID0gREFHLmdldENvcHlUb1JlZyh0aGVfY2hhaW4sIGRsLCBWUmVnLCBiYXNlUHRyLCBGbGFnKTsKKyAgICAgICAgICBiYXNlUHRyID0gREFHLmdldENvcHlGcm9tUmVnKHRoZV9jaGFpbiwgZGwsIFZSZWcsIFB0clZUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBDb252ZXJ0IHRoZSAoYWRkIDxhcmcxPiwgPGFyZzI+KSB0byBhbiBpbmRpcmVjdCBhZGRyZXNzLCB3aGljaAorICAgICAgICAgIC8vIHdpbGwgbGlrZWx5IGJlIGxvd2VyZWQgYXMgYSByZWcocmVnKSB4LWZvcm0gYWRkcmVzcy4KKyAgICAgICAgICBiYXNlUHRyID0gREFHLmdldE5vZGUoU1BVSVNEOjpJbmRpcmVjdEFkZHIsIGRsLCBQdHJWVCwgT3AwLCBPcDEpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBiYXNlUHRyID0gREFHLmdldE5vZGUoU1BVSVNEOjpJbmRpcmVjdEFkZHIsIGRsLCBQdHJWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpKTsKKyAgICAgIH0KKworICAgICAgLy8gSW5zZXJ0aW9uIHBvaW50IGlzIHNvbGVseSBkZXRlcm1pbmVkIGJ5IGJhc2VQdHIncyBjb250ZW50cworICAgICAgaW5zZXJ0RWx0T2ZmcyA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpKTsKKyAgICB9CisKKyAgICAvLyBMb2FkIHRoZSBtZW1vcnkgdG8gd2hpY2ggdG8gc3RvcmUuCisgICAgYWxpZ25Mb2FkVmVjID0gREFHLmdldExvYWQodmVjVlQsIGRsLCB0aGVfY2hhaW4sIGJhc2VQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU04tPmdldFNyY1ZhbHVlKCksIFNOLT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOLT5pc1ZvbGF0aWxlKCksIFNOLT5pc05vblRlbXBvcmFsKCksIDE2KTsKKworICAgIC8vIFVwZGF0ZSB0aGUgY2hhaW4KKyAgICB0aGVfY2hhaW4gPSBhbGlnbkxvYWRWZWMuZ2V0VmFsdWUoMSk7CisKKyAgICBMb2FkU0ROb2RlICpMTiA9IGNhc3Q8TG9hZFNETm9kZT4oYWxpZ25Mb2FkVmVjKTsKKyAgICBTRFZhbHVlIHRoZVZhbHVlID0gU04tPmdldFZhbHVlKCk7CisgICAgU0RWYWx1ZSByZXN1bHQ7CisKKyAgICBpZiAoU3RWVCAhPSBWVAorICAgICAgICAmJiAodGhlVmFsdWUuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBc3NlcnRaZXh0CisgICAgICAgICAgICB8fCB0aGVWYWx1ZS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFzc2VydFNleHQpKSB7CisgICAgICAvLyBEcmlsbCBkb3duIGFuZCBnZXQgdGhlIHZhbHVlIGZvciB6ZXJvLSBhbmQgc2lnbi1leHRlbmRlZAorICAgICAgLy8gcXVhbnRpdGllcworICAgICAgdGhlVmFsdWUgPSB0aGVWYWx1ZS5nZXRPcGVyYW5kKDApOworICAgIH0KKworICAgIC8vIElmIHRoZSBiYXNlIHBvaW50ZXIgaXMgYWxyZWFkeSBhIEQtZm9ybSBhZGRyZXNzLCB0aGVuIGp1c3QgY3JlYXRlCisgICAgLy8gYSBuZXcgRC1mb3JtIGFkZHJlc3Mgd2l0aCBhIHNsb3Qgb2Zmc2V0IGFuZCB0aGUgb3JpZ25hbCBiYXNlIHBvaW50ZXIuCisgICAgLy8gT3RoZXJ3aXNlIGdlbmVyYXRlIGEgRC1mb3JtIGFkZHJlc3Mgd2l0aCB0aGUgc2xvdCBvZmZzZXQgcmVsYXRpdmUKKyAgICAvLyB0byB0aGUgc3RhY2sgcG9pbnRlciwgd2hpY2ggaXMgYWx3YXlzIGFsaWduZWQuCisjaWYgIWRlZmluZWQoTkRFQlVHKQorICAgICAgaWYgKERlYnVnRmxhZyAmJiBpc0N1cnJlbnREZWJ1Z1R5cGUoREVCVUdfVFlQRSkpIHsKKyAgICAgICAgZXJycygpIDw8ICJDZWxsU1BVIExvd2VyU1RPUkU6IGJhc2VQdHIgPSAiOworICAgICAgICBiYXNlUHRyLmdldE5vZGUoKS0+ZHVtcCgmREFHKTsKKyAgICAgICAgZXJycygpIDw8ICJcbiI7CisgICAgICB9CisjZW5kaWYKKworICAgIFNEVmFsdWUgaW5zZXJ0RWx0T3A7CisgICAgU0RWYWx1ZSB2ZWN0b3JpemVPcDsKKyAgICBpZiAoaXNWZWMpCisgICAgeworICAgICAgLy8gRklYTUU6IHRoaXMgd29ya3Mgb25seSBpZiB0aGUgdmVjdG9yIGlzIDY0Yml0IQorICAgICAgaW5zZXJ0RWx0T3AgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OlNIVUZGTEVfTUFTSywgZGwsIE1WVDo6djJpNjQsIGluc2VydEVsdE9mZnMpOworICAgICAgdmVjdG9yaXplT3AgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkhBTEYyVkVDLCBkbCwgdmVjVlQsIHRoZVZhbHVlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGluc2VydEVsdE9wID0gREFHLmdldE5vZGUoU1BVSVNEOjpTSFVGRkxFX01BU0ssIGRsLCB2ZWNWVCwgaW5zZXJ0RWx0T2Zmcyk7CisgICAgICB2ZWN0b3JpemVPcCA9IERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIHZlY1ZULCB0aGVWYWx1ZSk7CisgICAgfQorICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKFNQVUlTRDo6U0hVRkIsIGRsLCB2ZWNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3JpemVPcCwgYWxpZ25Mb2FkVmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6djRpMzIsIGluc2VydEVsdE9wKSk7CisKKyAgICByZXN1bHQgPSBEQUcuZ2V0U3RvcmUodGhlX2NoYWluLCBkbCwgcmVzdWx0LCBiYXNlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMTi0+Z2V0U3JjVmFsdWUoKSwgTE4tPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIExOLT5pc1ZvbGF0aWxlKCksIExOLT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIExOLT5nZXRBbGlnbm1lbnQoKSk7CisKKyNpZiAwICYmICFkZWZpbmVkKE5ERUJVRykKKyAgICBpZiAoRGVidWdGbGFnICYmIGlzQ3VycmVudERlYnVnVHlwZShERUJVR19UWVBFKSkgeworICAgICAgY29uc3QgU0RWYWx1ZSAmY3VycmVudFJvb3QgPSBEQUcuZ2V0Um9vdCgpOworCisgICAgICBEQUcuc2V0Um9vdChyZXN1bHQpOworICAgICAgZXJycygpIDw8ICItLS0tLS0tIENlbGxTUFU6TG93ZXJTdG9yZSByZXN1bHQ6XG4iOworICAgICAgREFHLmR1bXAoKTsKKyAgICAgIGVycnMoKSA8PCAiLS0tLS0tLVxuIjsKKyAgICAgIERBRy5zZXRSb290KGN1cnJlbnRSb290KTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByZXN1bHQ7CisgICAgLypVTlJFQUNIRUQqLworICB9CisgIGNhc2UgSVNEOjpQUkVfSU5DOgorICBjYXNlIElTRDo6UFJFX0RFQzoKKyAgY2FzZSBJU0Q6OlBPU1RfSU5DOgorICBjYXNlIElTRDo6UE9TVF9ERUM6CisgIGNhc2UgSVNEOjpMQVNUX0lOREVYRURfTU9ERToKKyAgICB7CisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkxvd2VyTE9BRDogR290IGEgTG9hZFNETm9kZSB3aXRoIGFuIGFkZHIgbW9kZSBvdGhlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gVU5JTkRFWEVEXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZSgodW5zaWduZWQpU04tPmdldEFkZHJlc3NpbmdNb2RlKCkpKTsKKyAgICAgIC8qTk9UUkVBQ0hFRCovCisgICAgfQorICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8hIEdlbmVyYXRlIHRoZSBhZGRyZXNzIG9mIGEgY29uc3RhbnQgcG9vbCBlbnRyeS4KK3N0YXRpYyBTRFZhbHVlCitMb3dlckNvbnN0YW50UG9vbChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywgY29uc3QgU1BVU3VidGFyZ2V0ICpTVCkgeworICBFVlQgUHRyVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgQ29uc3RhbnRQb29sU0ROb2RlICpDUCA9IGNhc3Q8Q29uc3RhbnRQb29sU0ROb2RlPihPcCk7CisgIGNvbnN0IENvbnN0YW50ICpDID0gQ1AtPmdldENvbnN0VmFsKCk7CisgIFNEVmFsdWUgQ1BJID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDLCBQdHJWVCwgQ1AtPmdldEFsaWdubWVudCgpKTsKKyAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50KDAsIFB0clZUKTsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBEQUcuZ2V0VGFyZ2V0KCk7CisgIC8vIEZJWE1FIHRoZXJlIGlzIG5vIGFjdHVhbCBkZWJ1ZyBpbmZvIGhlcmUKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6U3RhdGljKSB7CisgICAgaWYgKCFTVC0+dXNpbmdMYXJnZU1lbSgpKSB7CisgICAgICAvLyBKdXN0IHJldHVybiB0aGUgU0RWYWx1ZSB3aXRoIHRoZSBjb25zdGFudCBwb29sIGFkZHJlc3MgaW4gaXQuCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoU1BVSVNEOjpBRm9ybUFkZHIsIGRsLCBQdHJWVCwgQ1BJLCBaZXJvKTsKKyAgICB9IGVsc2UgeworICAgICAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKFNQVUlTRDo6SGksIGRsLCBQdHJWVCwgQ1BJLCBaZXJvKTsKKyAgICAgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkxvLCBkbCwgUHRyVlQsIENQSSwgWmVybyk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoU1BVSVNEOjpJbmRpcmVjdEFkZHIsIGRsLCBQdHJWVCwgSGksIExvKTsKKyAgICB9CisgIH0KKworICBsbHZtX3VucmVhY2hhYmxlKCJMb3dlckNvbnN0YW50UG9vbDogUmVsb2NhdGlvbiBtb2RlbCBvdGhlciB0aGFuIHN0YXRpYyIKKyAgICAgICAgICAgICAgICAgICAiIG5vdCBzdXBwb3J0ZWQuIik7CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vISBBbHRlcm5hdGUgZW50cnkgcG9pbnQgZm9yIGdlbmVyYXRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBjb25zdGFudCBwb29sIGVudHJ5CitTRFZhbHVlCitTUFU6Okxvd2VyQ29uc3RhbnRQb29sKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHLCBjb25zdCBTUFVUYXJnZXRNYWNoaW5lICZUTSkgeworICByZXR1cm4gOjpMb3dlckNvbnN0YW50UG9vbChPcCwgREFHLCBUTS5nZXRTdWJ0YXJnZXRJbXBsKCkpOworfQorCitzdGF0aWMgU0RWYWx1ZQorTG93ZXJKdW1wVGFibGUoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsIGNvbnN0IFNQVVN1YnRhcmdldCAqU1QpIHsKKyAgRVZUIFB0clZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIEp1bXBUYWJsZVNETm9kZSAqSlQgPSBjYXN0PEp1bXBUYWJsZVNETm9kZT4oT3ApOworICBTRFZhbHVlIEpUSSA9IERBRy5nZXRUYXJnZXRKdW1wVGFibGUoSlQtPmdldEluZGV4KCksIFB0clZUKTsKKyAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50KDAsIFB0clZUKTsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBEQUcuZ2V0VGFyZ2V0KCk7CisgIC8vIEZJWE1FIHRoZXJlIGlzIG5vIGFjdHVhbCBkZWJ1ZyBpbmZvIGhlcmUKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6U3RhdGljKSB7CisgICAgaWYgKCFTVC0+dXNpbmdMYXJnZU1lbSgpKSB7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoU1BVSVNEOjpBRm9ybUFkZHIsIGRsLCBQdHJWVCwgSlRJLCBaZXJvKTsKKyAgICB9IGVsc2UgeworICAgICAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKFNQVUlTRDo6SGksIGRsLCBQdHJWVCwgSlRJLCBaZXJvKTsKKyAgICAgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkxvLCBkbCwgUHRyVlQsIEpUSSwgWmVybyk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoU1BVSVNEOjpJbmRpcmVjdEFkZHIsIGRsLCBQdHJWVCwgSGksIExvKTsKKyAgICB9CisgIH0KKworICBsbHZtX3VucmVhY2hhYmxlKCJMb3dlckp1bXBUYWJsZTogUmVsb2NhdGlvbiBtb2RlbCBvdGhlciB0aGFuIHN0YXRpYyIKKyAgICAgICAgICAgICAgICAgICAiIG5vdCBzdXBwb3J0ZWQuIik7CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK3N0YXRpYyBTRFZhbHVlCitMb3dlckdsb2JhbEFkZHJlc3MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsIGNvbnN0IFNQVVN1YnRhcmdldCAqU1QpIHsKKyAgRVZUIFB0clZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdTRE4gPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKTsKKyAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gR1NETi0+Z2V0R2xvYmFsKCk7CisgIFNEVmFsdWUgR0EgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgT3AuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clZULCBHU0ROLT5nZXRPZmZzZXQoKSk7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gREFHLmdldFRhcmdldCgpOworICBTRFZhbHVlIFplcm8gPSBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpOworICAvLyBGSVhNRSB0aGVyZSBpcyBubyBhY3R1YWwgZGVidWcgaW5mbyBoZXJlCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlN0YXRpYykgeworICAgIGlmICghU1QtPnVzaW5nTGFyZ2VNZW0oKSkgeworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKFNQVUlTRDo6QUZvcm1BZGRyLCBkbCwgUHRyVlQsIEdBLCBaZXJvKTsKKyAgICB9IGVsc2UgeworICAgICAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKFNQVUlTRDo6SGksIGRsLCBQdHJWVCwgR0EsIFplcm8pOworICAgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKFNQVUlTRDo6TG8sIGRsLCBQdHJWVCwgR0EsIFplcm8pOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKFNQVUlTRDo6SW5kaXJlY3RBZGRyLCBkbCwgUHRyVlQsIEhpLCBMbyk7CisgICAgfQorICB9IGVsc2UgeworICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiTG93ZXJHbG9iYWxBZGRyZXNzOiBSZWxvY2F0aW9uIG1vZGVsIG90aGVyIHRoYW4gc3RhdGljIgorICAgICAgICAgICAgICAgICAgICAgICJub3Qgc3VwcG9ydGVkLiIpOworICAgIC8qTk9UUkVBQ0hFRCovCisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLyEgQ3VzdG9tIGxvd2VyIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzCitzdGF0aWMgU0RWYWx1ZQorTG93ZXJDb25zdGFudEZQKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICAvLyBGSVhNRSB0aGVyZSBpcyBubyBhY3R1YWwgZGVidWcgaW5mbyBoZXJlCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBpZiAoVlQgPT0gTVZUOjpmNjQpIHsKKyAgICBDb25zdGFudEZQU0ROb2RlICpGUCA9IGNhc3Q8Q29uc3RhbnRGUFNETm9kZT4oT3AuZ2V0Tm9kZSgpKTsKKworICAgIGFzc2VydCgoRlAgIT0gMCkgJiYKKyAgICAgICAgICAgIkxvd2VyQ29uc3RhbnRGUDogTm9kZSBpcyBub3QgQ29uc3RhbnRGUFNETm9kZSIpOworCisgICAgdWludDY0X3QgZGJpdHMgPSBEb3VibGVUb0JpdHMoRlAtPmdldFZhbHVlQVBGKCkuY29udmVydFRvRG91YmxlKCkpOworICAgIFNEVmFsdWUgVCA9IERBRy5nZXRDb25zdGFudChkYml0cywgTVZUOjppNjQpOworICAgIFNEVmFsdWUgVHZlYyA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgTVZUOjp2Mmk2NCwgVCwgVCk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKFNQVUlTRDo6VkVDMlBSRUZTTE9ULCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYyZjY0LCBUdmVjKSk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlCitTUFVUYXJnZXRMb3dlcmluZzo6TG93ZXJGb3JtYWxBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmUmVnSW5mbyA9IE1GLmdldFJlZ0luZm8oKTsKKyAgU1BVRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88U1BVRnVuY3Rpb25JbmZvPigpOworCisgIHVuc2lnbmVkIEFyZ09mZnNldCA9IFNQVUZyYW1lSW5mbzo6bWluU3RhY2tTaXplKCk7CisgIHVuc2lnbmVkIEFyZ1JlZ0lkeCA9IDA7CisgIHVuc2lnbmVkIFN0YWNrU2xvdFNpemUgPSBTUFVGcmFtZUluZm86OnN0YWNrU2xvdFNpemUoKTsKKworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisKKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwgQXJnTG9jcywKKyAgICAgICAgICAgICAgICAgKkRBRy5nZXRDb250ZXh0KCkpOworICAvLyBGSVhNRTogYWxsb3cgZm9yIG90aGVyIGNhbGxpbmcgY29udmVudGlvbnMKKyAgQ0NJbmZvLkFuYWx5emVGb3JtYWxBcmd1bWVudHMoSW5zLCBDQ0NfU1BVKTsKKworICAvLyBBZGQgREFHIG5vZGVzIHRvIGxvYWQgdGhlIGFyZ3VtZW50cyBvciBjb3B5IHRoZW0gb3V0IG9mIHJlZ2lzdGVycy4KKyAgZm9yICh1bnNpZ25lZCBBcmdObyA9IDAsIGUgPSBJbnMuc2l6ZSgpOyBBcmdObyAhPSBlOyArK0FyZ05vKSB7CisgICAgRVZUIE9iamVjdFZUID0gSW5zW0FyZ05vXS5WVDsKKyAgICB1bnNpZ25lZCBPYmpTaXplID0gT2JqZWN0VlQuZ2V0U2l6ZUluQml0cygpLzg7CisgICAgU0RWYWx1ZSBBcmdWYWw7CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tBcmdOb107CisKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQXJnUmVnQ2xhc3M7CisKKyAgICAgIHN3aXRjaCAoT2JqZWN0VlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJMb3dlckZvcm1hbEFyZ3VtZW50cyBVbmhhbmRsZWQgYXJndW1lbnQgdHlwZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShPYmplY3RWVC5nZXRFVlRTdHJpbmcoKSkpOworICAgICAgY2FzZSBNVlQ6Omk4OgorICAgICAgICBBcmdSZWdDbGFzcyA9ICZTUFU6OlI4Q1JlZ0NsYXNzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppMTY6CisgICAgICAgIEFyZ1JlZ0NsYXNzID0gJlNQVTo6UjE2Q1JlZ0NsYXNzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppMzI6CisgICAgICAgIEFyZ1JlZ0NsYXNzID0gJlNQVTo6UjMyQ1JlZ0NsYXNzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppNjQ6CisgICAgICAgIEFyZ1JlZ0NsYXNzID0gJlNQVTo6UjY0Q1JlZ0NsYXNzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppMTI4OgorICAgICAgICBBcmdSZWdDbGFzcyA9ICZTUFU6OkdQUkNSZWdDbGFzczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6ZjMyOgorICAgICAgICBBcmdSZWdDbGFzcyA9ICZTUFU6OlIzMkZQUmVnQ2xhc3M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmY2NDoKKyAgICAgICAgQXJnUmVnQ2xhc3MgPSAmU1BVOjpSNjRGUFJlZ0NsYXNzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjp2MmY2NDoKKyAgICAgIGNhc2UgTVZUOjp2NGYzMjoKKyAgICAgIGNhc2UgTVZUOjp2Mmk2NDoKKyAgICAgIGNhc2UgTVZUOjp2NGkzMjoKKyAgICAgIGNhc2UgTVZUOjp2OGkxNjoKKyAgICAgIGNhc2UgTVZUOjp2MTZpODoKKyAgICAgIGNhc2UgTVZUOjp2MmkzMjoKKyAgICAgIGNhc2UgTVZUOjp2MmYzMjoKKyAgICAgICAgQXJnUmVnQ2xhc3MgPSAmU1BVOjpWRUNSRUdSZWdDbGFzczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHVuc2lnbmVkIFZSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihBcmdSZWdDbGFzcyk7CisgICAgICBSZWdJbmZvLmFkZExpdmVJbihWQS5nZXRMb2NSZWcoKSwgVlJlZyk7CisgICAgICBBcmdWYWwgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBWUmVnLCBPYmplY3RWVCk7CisgICAgICArK0FyZ1JlZ0lkeDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgbmVlZCB0byBsb2FkIHRoZSBhcmd1bWVudCB0byBhIHZpcnR1YWwgcmVnaXN0ZXIgaWYgd2UgZGV0ZXJtaW5lZAorICAgICAgLy8gYWJvdmUgdGhhdCB3ZSByYW4gb3V0IG9mIHBoeXNpY2FsIHJlZ2lzdGVycyBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAgLy8gb3Igd2UncmUgZm9yY2VkIHRvIGRvIHZhcmFyZworICAgICAgaW50IEZJID0gTUZJLT5DcmVhdGVGaXhlZE9iamVjdChPYmpTaXplLCBBcmdPZmZzZXQsIHRydWUpOworICAgICAgU0RWYWx1ZSBGSU4gPSBEQUcuZ2V0RnJhbWVJbmRleChGSSwgUHRyVlQpOworICAgICAgQXJnVmFsID0gREFHLmdldExvYWQoT2JqZWN0VlQsIGRsLCBDaGFpbiwgRklOLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworICAgICAgQXJnT2Zmc2V0ICs9IFN0YWNrU2xvdFNpemU7CisgICAgfQorCisgICAgSW5WYWxzLnB1c2hfYmFjayhBcmdWYWwpOworICAgIC8vIFVwZGF0ZSB0aGUgY2hhaW4KKyAgICBDaGFpbiA9IEFyZ1ZhbC5nZXRPcGVyYW5kKDApOworICB9CisKKyAgLy8gdmFyYXJnIGhhbmRsaW5nOgorICBpZiAoaXNWYXJBcmcpIHsKKyAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIGJlIGFibGUgdG8gcXVlcnkgdGhlIGFyZ3VtZW50IHJlZ2lzdGVycyBmcm9tIAorICAgIC8vICAgICAgICB0YWJsZWdlbiBnZW5lcmF0ZWQgY29kZS4gCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEFyZ1JlZ3NbXSA9IHsKKyAgICAgIFNQVTo6UjMsICBTUFU6OlI0LCAgU1BVOjpSNSwgIFNQVTo6UjYsICBTUFU6OlI3LCAgU1BVOjpSOCwgIFNQVTo6UjksCisgICAgICBTUFU6OlIxMCwgU1BVOjpSMTEsIFNQVTo6UjEyLCBTUFU6OlIxMywgU1BVOjpSMTQsIFNQVTo6UjE1LCBTUFU6OlIxNiwKKyAgICAgIFNQVTo6UjE3LCBTUFU6OlIxOCwgU1BVOjpSMTksIFNQVTo6UjIwLCBTUFU6OlIyMSwgU1BVOjpSMjIsIFNQVTo6UjIzLAorICAgICAgU1BVOjpSMjQsIFNQVTo6UjI1LCBTUFU6OlIyNiwgU1BVOjpSMjcsIFNQVTo6UjI4LCBTUFU6OlIyOSwgU1BVOjpSMzAsCisgICAgICBTUFU6OlIzMSwgU1BVOjpSMzIsIFNQVTo6UjMzLCBTUFU6OlIzNCwgU1BVOjpSMzUsIFNQVTo6UjM2LCBTUFU6OlIzNywKKyAgICAgIFNQVTo6UjM4LCBTUFU6OlIzOSwgU1BVOjpSNDAsIFNQVTo6UjQxLCBTUFU6OlI0MiwgU1BVOjpSNDMsIFNQVTo6UjQ0LAorICAgICAgU1BVOjpSNDUsIFNQVTo6UjQ2LCBTUFU6OlI0NywgU1BVOjpSNDgsIFNQVTo6UjQ5LCBTUFU6OlI1MCwgU1BVOjpSNTEsCisgICAgICBTUFU6OlI1MiwgU1BVOjpSNTMsIFNQVTo6UjU0LCBTUFU6OlI1NSwgU1BVOjpSNTYsIFNQVTo6UjU3LCBTUFU6OlI1OCwKKyAgICAgIFNQVTo6UjU5LCBTUFU6OlI2MCwgU1BVOjpSNjEsIFNQVTo6UjYyLCBTUFU6OlI2MywgU1BVOjpSNjQsIFNQVTo6UjY1LAorICAgICAgU1BVOjpSNjYsIFNQVTo6UjY3LCBTUFU6OlI2OCwgU1BVOjpSNjksIFNQVTo6UjcwLCBTUFU6OlI3MSwgU1BVOjpSNzIsCisgICAgICBTUFU6OlI3MywgU1BVOjpSNzQsIFNQVTo6Ujc1LCBTUFU6OlI3NiwgU1BVOjpSNzcsIFNQVTo6Ujc4LCBTUFU6OlI3OQorICAgIH07CisgICAgLy8gc2l6ZSBvZiBBcmdSZWdzIGFycmF5CisgICAgdW5zaWduZWQgTnVtQXJnUmVncyA9IDc3OworCisgICAgLy8gV2Ugd2lsbCBzcGlsbCAoNzktMykrMSByZWdpc3RlcnMgdG8gdGhlIHN0YWNrCisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgNzktMysxPiBNZW1PcHM7CisKKyAgICAvLyBDcmVhdGUgdGhlIGZyYW1lIHNsb3QKKyAgICBmb3IgKDsgQXJnUmVnSWR4ICE9IE51bUFyZ1JlZ3M7ICsrQXJnUmVnSWR4KSB7CisgICAgICBGdW5jSW5mby0+c2V0VmFyQXJnc0ZyYW1lSW5kZXgoCisgICAgICAgIE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoU3RhY2tTbG90U2l6ZSwgQXJnT2Zmc2V0LCB0cnVlKSk7CisgICAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZ1bmNJbmZvLT5nZXRWYXJBcmdzRnJhbWVJbmRleCgpLCBQdHJWVCk7CisgICAgICB1bnNpZ25lZCBWUmVnID0gTUYuYWRkTGl2ZUluKEFyZ1JlZ3NbQXJnUmVnSWR4XSwgJlNQVTo6UjMyQ1JlZ0NsYXNzKTsKKyAgICAgIFNEVmFsdWUgQXJnVmFsID0gREFHLmdldFJlZ2lzdGVyKFZSZWcsIE1WVDo6djE2aTgpOworICAgICAgU0RWYWx1ZSBTdG9yZSA9IERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIEFyZ1ZhbCwgRklOLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgQ2hhaW4gPSBTdG9yZS5nZXRPcGVyYW5kKDApOworICAgICAgTWVtT3BzLnB1c2hfYmFjayhTdG9yZSk7CisKKyAgICAgIC8vIEluY3JlbWVudCBhZGRyZXNzIGJ5IHN0YWNrIHNsb3Qgc2l6ZSBmb3IgdGhlIG5leHQgc3RvcmVkIGFyZ3VtZW50CisgICAgICBBcmdPZmZzZXQgKz0gU3RhY2tTbG90U2l6ZTsKKyAgICB9CisgICAgaWYgKCFNZW1PcHMuZW1wdHkoKSkKKyAgICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1PcHNbMF0sIE1lbU9wcy5zaXplKCkpOworICB9CisKKyAgcmV0dXJuIENoYWluOworfQorCisvLy8gaXNMU0FBZGRyZXNzIC0gUmV0dXJuIHRoZSBpbW1lZGlhdGUgdG8gdXNlIGlmIHRoZSBzcGVjaWZpZWQKKy8vLyB2YWx1ZSBpcyByZXByZXNlbnRhYmxlIGFzIGEgTFNBIGFkZHJlc3MuCitzdGF0aWMgU0ROb2RlICppc0xTQUFkZHJlc3MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3ApOworICBpZiAoIUMpIHJldHVybiAwOworCisgIGludCBBZGRyID0gQy0+Z2V0WkV4dFZhbHVlKCk7CisgIGlmICgoQWRkciAmIDMpICE9IDAgfHwgIC8vIExvdyAyIGJpdHMgYXJlIGltcGxpY2l0bHkgemVyby4KKyAgICAgIChBZGRyIDw8IDE0ID4+IDE0KSAhPSBBZGRyKQorICAgIHJldHVybiAwOyAgLy8gVG9wIDE0IGJpdHMgaGF2ZSB0byBiZSBzZXh0IG9mIGltbWVkaWF0ZS4KKworICByZXR1cm4gREFHLmdldENvbnN0YW50KChpbnQpQy0+Z2V0WkV4dFZhbHVlKCkgPj4gMiwgTVZUOjppMzIpLmdldE5vZGUoKTsKK30KKworU0RWYWx1ZQorU1BVVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdCB7CisgIC8vIENlbGxTUFUgdGFyZ2V0IGRvZXMgbm90IHlldCBzdXBwb3J0IHRhaWwgY2FsbCBvcHRpbWl6YXRpb24uCisgIGlzVGFpbENhbGwgPSBmYWxzZTsKKworICBjb25zdCBTUFVTdWJ0YXJnZXQgKlNUID0gU1BVVE0uZ2V0U3VidGFyZ2V0SW1wbCgpOworICB1bnNpZ25lZCBOdW1PcHMgICAgID0gT3V0cy5zaXplKCk7CisgIHVuc2lnbmVkIFN0YWNrU2xvdFNpemUgPSBTUFVGcmFtZUluZm86OnN0YWNrU2xvdFNpemUoKTsKKworICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IEFyZ0xvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLCBBcmdMb2NzLAorICAgICAgICAgICAgICAgICAqREFHLmdldENvbnRleHQoKSk7IAorICAvLyBGSVhNRTogYWxsb3cgZm9yIG90aGVyIGNhbGxpbmcgY29udmVudGlvbnMKKyAgQ0NJbmZvLkFuYWx5emVDYWxsT3BlcmFuZHMoT3V0cywgQ0NDX1NQVSk7CisgIAorICBjb25zdCB1bnNpZ25lZCBOdW1BcmdSZWdzID0gQXJnTG9jcy5zaXplKCk7CisKKworICAvLyBIYW5keSBwb2ludGVyIHR5cGUKKyAgRVZUIFB0clZUID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLmdldFBvaW50ZXJUeSgpOworCisgIC8vIFNldCB1cCBhIGNvcHkgb2YgdGhlIHN0YWNrIHBvaW50ZXIgZm9yIHVzZSBsb2FkaW5nIGFuZCBzdG9yaW5nIGFueQorICAvLyBhcmd1bWVudHMgdGhhdCBtYXkgbm90IGZpdCBpbiB0aGUgcmVnaXN0ZXJzIGF2YWlsYWJsZSBmb3IgYXJndW1lbnQKKyAgLy8gcGFzc2luZy4KKyAgU0RWYWx1ZSBTdGFja1B0ciA9IERBRy5nZXRSZWdpc3RlcihTUFU6OlIxLCBNVlQ6OmkzMik7CisKKyAgLy8gRmlndXJlIG91dCB3aGljaCBhcmd1bWVudHMgYXJlIGdvaW5nIHRvIGdvIGluIHJlZ2lzdGVycywgYW5kIHdoaWNoIGluCisgIC8vIG1lbW9yeS4KKyAgdW5zaWduZWQgQXJnT2Zmc2V0ID0gU1BVRnJhbWVJbmZvOjptaW5TdGFja1NpemUoKTsgLy8gSnVzdCBiZWxvdyBbTFJdCisgIHVuc2lnbmVkIEFyZ1JlZ0lkeCA9IDA7CisKKyAgLy8gS2VlcCB0cmFjayBvZiByZWdpc3RlcnMgcGFzc2luZyBhcmd1bWVudHMKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBTRFZhbHVlPiA+IFJlZ3NUb1Bhc3M7CisgIC8vIEFuZCB0aGUgYXJndW1lbnRzIHBhc3NlZCBvbiB0aGUgc3RhY2sKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gTWVtT3BDaGFpbnM7CisKKyAgZm9yICg7IEFyZ1JlZ0lkeCAhPSBOdW1PcHM7ICsrQXJnUmVnSWR4KSB7CisgICAgU0RWYWx1ZSBBcmcgPSBPdXRWYWxzW0FyZ1JlZ0lkeF07CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tBcmdSZWdJZHhdOworCisgICAgLy8gUHRyT2ZmIHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCBhcmd1bWVudCB0byB0aGUgc3RhY2sgaWYgYQorICAgIC8vIHJlZ2lzdGVyIGNhbm5vdCBiZSBmb3VuZCBmb3IgaXQuCisgICAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0Q29uc3RhbnQoQXJnT2Zmc2V0LCBTdGFja1B0ci5nZXRWYWx1ZVR5cGUoKSk7CisgICAgUHRyT2ZmID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJWVCwgU3RhY2tQdHIsIFB0ck9mZik7CisKKyAgICBzd2l0Y2ggKEFyZy5nZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBWYWx1ZVR5cGUgZm9yIGFyZ3VtZW50ISIpOworICAgIGNhc2UgTVZUOjppODoKKyAgICBjYXNlIE1WVDo6aTE2OgorICAgIGNhc2UgTVZUOjppMzI6CisgICAgY2FzZSBNVlQ6Omk2NDoKKyAgICBjYXNlIE1WVDo6aTEyODoKKyAgICBjYXNlIE1WVDo6ZjMyOgorICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgY2FzZSBNVlQ6OnYyaTY0OgorICAgIGNhc2UgTVZUOjp2MmY2NDoKKyAgICBjYXNlIE1WVDo6djRmMzI6CisgICAgY2FzZSBNVlQ6OnY0aTMyOgorICAgIGNhc2UgTVZUOjp2OGkxNjoKKyAgICBjYXNlIE1WVDo6djE2aTg6CisgICAgICBpZiAoQXJnUmVnSWR4ICE9IE51bUFyZ1JlZ3MpIHsKKyAgICAgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoVkEuZ2V0TG9jUmVnKCksIEFyZykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIEFyZywgUHRyT2ZmLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCkpOworICAgICAgICBBcmdPZmZzZXQgKz0gU3RhY2tTbG90U2l6ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIEFjY3VtdWxhdGUgaG93IG1hbnkgYnl0ZXMgYXJlIHRvIGJlIHB1c2hlZCBvbiB0aGUgc3RhY2ssIGluY2x1ZGluZyB0aGUKKyAgLy8gbGlua2FnZSBhcmVhLCBhbmQgcGFyYW1ldGVyIHBhc3NpbmcgYXJlYS4gIEFjY29yZGluZyB0byB0aGUgU1BVIEFCSSwKKyAgLy8gd2UgbWluaW1hbGx5IG5lZWQgc3BhY2UgZm9yIFtMUl0gYW5kIFtTUF0uCisgIHVuc2lnbmVkIE51bVN0YWNrQnl0ZXMgPSBBcmdPZmZzZXQgLSBTUFVGcmFtZUluZm86Om1pblN0YWNrU2l6ZSgpOworCisgIC8vIEluc2VydCBhIGNhbGwgc2VxdWVuY2Ugc3RhcnQKKyAgQ2hhaW4gPSBEQUcuZ2V0Q0FMTFNFUV9TVEFSVChDaGFpbiwgREFHLmdldEludFB0ckNvbnN0YW50KE51bVN0YWNrQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisKKyAgaWYgKCFNZW1PcENoYWlucy5lbXB0eSgpKSB7CisgICAgLy8gQWRqdXN0IHRoZSBzdGFjayBwb2ludGVyIGZvciB0aGUgc3RhY2sgYXJndW1lbnRzLgorICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAmTWVtT3BDaGFpbnNbMF0sIE1lbU9wQ2hhaW5zLnNpemUoKSk7CisgIH0KKworICAvLyBCdWlsZCBhIHNlcXVlbmNlIG9mIGNvcHktdG8tcmVnIG5vZGVzIGNoYWluZWQgdG9nZXRoZXIgd2l0aCB0b2tlbiBjaGFpbgorICAvLyBhbmQgZmxhZyBvcGVyYW5kcyB3aGljaCBjb3B5IHRoZSBvdXRnb2luZyBhcmdzIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlZ3MuCisgIFNEVmFsdWUgSW5GbGFnOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgUmVnc1RvUGFzc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQsIEluRmxhZyk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIH0KKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHM7CisgIHVuc2lnbmVkIENhbGxPcGMgPSBTUFVJU0Q6OkNBTEw7CisKKyAgLy8gSWYgdGhlIGNhbGxlZSBpcyBhIEdsb2JhbEFkZHJlc3MvRXh0ZXJuYWxTeW1ib2wgbm9kZSAocXVpdGUgY29tbW9uLCBldmVyeQorICAvLyBkaXJlY3QgY2FsbCBpcykgdHVybiBpdCBpbnRvIGEgVGFyZ2V0R2xvYmFsQWRkcmVzcy9UYXJnZXRFeHRlcm5hbFN5bWJvbAorICAvLyBub2RlIHNvIHRoYXQgbGVnYWxpemUgZG9lc24ndCBoYWNrIGl0LgorICBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KENhbGxlZSkpIHsKKyAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBHLT5nZXRHbG9iYWwoKTsKKyAgICBFVlQgQ2FsbGVlVlQgPSBDYWxsZWUuZ2V0VmFsdWVUeXBlKCk7CisgICAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50KDAsIFB0clZUKTsKKyAgICBTRFZhbHVlIEdBID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoR1YsIGRsLCBDYWxsZWVWVCk7CisKKyAgICBpZiAoIVNULT51c2luZ0xhcmdlTWVtKCkpIHsKKyAgICAgIC8vIFR1cm4gY2FsbHMgdG8gdGFyZ2V0cyB0aGF0IGFyZSBkZWZpbmVkIChpLmUuLCBoYXZlIGJvZGllcykgaW50byBCUlNMCisgICAgICAvLyBzdHlsZSBjYWxscywgb3RoZXJ3aXNlLCBleHRlcm5hbCBzeW1ib2xzIGFyZSBCUkFTTCBjYWxscy4gVGhpcyBhc3N1bWVzCisgICAgICAvLyB0aGF0IGRlY2xhcmVkL2RlZmluZWQgc3ltYm9scyBhcmUgaW4gdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdCBhbmQgY2FuCisgICAgICAvLyBiZSByZWFjaGVkIHRocm91Z2ggUEMtcmVsYXRpdmUganVtcHMuCisgICAgICAvLworICAgICAgLy8gTk9URToKKyAgICAgIC8vIFRoaXMgbWF5IGJlIGFuIHVuc2FmZSBhc3N1bXB0aW9uIGZvciBKSVQgYW5kIHJlYWxseSBsYXJnZSBjb21waWxhdGlvbgorICAgICAgLy8gdW5pdHMuCisgICAgICBpZiAoR1YtPmlzRGVjbGFyYXRpb24oKSkgeworICAgICAgICBDYWxsZWUgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkFGb3JtQWRkciwgZGwsIENhbGxlZVZULCBHQSwgWmVybyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDYWxsZWUgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OlBDUmVsQWRkciwgZGwsIENhbGxlZVZULCBHQSwgWmVybyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vICJMYXJnZSBtZW1vcnkiIG1vZGU6IFR1cm4gYWxsIGNhbGxzIGludG8gaW5kaXJlY3QgY2FsbHMgd2l0aCBhIFgtZm9ybQorICAgICAgLy8gYWRkcmVzcyBwYWlyczoKKyAgICAgIENhbGxlZSA9IERBRy5nZXROb2RlKFNQVUlTRDo6SW5kaXJlY3RBZGRyLCBkbCwgUHRyVlQsIEdBLCBaZXJvKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoRXh0ZXJuYWxTeW1ib2xTRE5vZGUgKlMgPSBkeW5fY2FzdDxFeHRlcm5hbFN5bWJvbFNETm9kZT4oQ2FsbGVlKSkgeworICAgIEVWVCBDYWxsZWVWVCA9IENhbGxlZS5nZXRWYWx1ZVR5cGUoKTsKKyAgICBTRFZhbHVlIFplcm8gPSBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpOworICAgIFNEVmFsdWUgRXh0U3ltID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKFMtPmdldFN5bWJvbCgpLAorICAgICAgICBDYWxsZWUuZ2V0VmFsdWVUeXBlKCkpOworCisgICAgaWYgKCFTVC0+dXNpbmdMYXJnZU1lbSgpKSB7CisgICAgICBDYWxsZWUgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkFGb3JtQWRkciwgZGwsIENhbGxlZVZULCBFeHRTeW0sIFplcm8pOworICAgIH0gZWxzZSB7CisgICAgICBDYWxsZWUgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIFB0clZULCBFeHRTeW0sIFplcm8pOworICAgIH0KKyAgfSBlbHNlIGlmIChTRE5vZGUgKkRlc3QgPSBpc0xTQUFkZHJlc3MoQ2FsbGVlLCBEQUcpKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHRoYXQgYXBwZWFycyB0byBiZSBhIGxlZ2FsCisgICAgLy8gbG9jYWwgc3RvcmUgYWRkcmVzcywgdXNlIHRoZSBtdW5nZWQgdmFsdWUuCisgICAgQ2FsbGVlID0gU0RWYWx1ZShEZXN0LCAwKTsKKyAgfQorCisgIE9wcy5wdXNoX2JhY2soQ2hhaW4pOworICBPcHMucHVzaF9iYWNrKENhbGxlZSk7CisKKyAgLy8gQWRkIGFyZ3VtZW50IHJlZ2lzdGVycyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHRoYXQgdGhleSBhcmUga25vd24gbGl2ZQorICAvLyBpbnRvIHRoZSBjYWxsLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE9wcy5wdXNoX2JhY2soREFHLmdldFJlZ2lzdGVyKFJlZ3NUb1Bhc3NbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQuZ2V0VmFsdWVUeXBlKCkpKTsKKworICBpZiAoSW5GbGFnLmdldE5vZGUoKSkKKyAgICBPcHMucHVzaF9iYWNrKEluRmxhZyk7CisgIC8vIFJldHVybnMgYSBjaGFpbiBhbmQgYSBmbGFnIGZvciByZXR2YWwgY29weSB0byB1c2UuCisgIENoYWluID0gREFHLmdldE5vZGUoQ2FsbE9wYywgZGwsIERBRy5nZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpGbGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisKKyAgQ2hhaW4gPSBEQUcuZ2V0Q0FMTFNFUV9FTkQoQ2hhaW4sIERBRy5nZXRJbnRQdHJDb25zdGFudChOdW1TdGFja0J5dGVzLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDAsIHRydWUpLCBJbkZsYWcpOworICBpZiAoIUlucy5lbXB0eSgpKQorICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHZvaWQsIGp1c3QgcmV0dXJuIHRoZSBjaGFpbi4KKyAgaWYgKElucy5lbXB0eSgpKQorICAgIHJldHVybiBDaGFpbjsKKworICAvLyBJZiB0aGUgY2FsbCBoYXMgcmVzdWx0cywgY29weSB0aGUgdmFsdWVzIG91dCBvZiB0aGUgcmV0IHZhbCByZWdpc3RlcnMuCisgIHN3aXRjaCAoSW5zWzBdLlZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCByZXQgdmFsdWUhIik7CisgIGNhc2UgTVZUOjpPdGhlcjogYnJlYWs7CisgIGNhc2UgTVZUOjppMzI6CisgICAgaWYgKElucy5zaXplKCkgPiAxICYmIEluc1sxXS5WVCA9PSBNVlQ6OmkzMikgeworICAgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBTUFU6OlI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIsIEluRmxhZykuZ2V0VmFsdWUoMSk7CisgICAgICBJblZhbHMucHVzaF9iYWNrKENoYWluLmdldFZhbHVlKDApKTsKKyAgICAgIENoYWluID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgU1BVOjpSMywgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbi5nZXRWYWx1ZSgyKSkuZ2V0VmFsdWUoMSk7CisgICAgICBJblZhbHMucHVzaF9iYWNrKENoYWluLmdldFZhbHVlKDApKTsKKyAgICB9IGVsc2UgeworICAgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBTUFU6OlIzLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRmxhZykuZ2V0VmFsdWUoMSk7CisgICAgICBJblZhbHMucHVzaF9iYWNrKENoYWluLmdldFZhbHVlKDApKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjppODoKKyAgY2FzZSBNVlQ6OmkxNjoKKyAgY2FzZSBNVlQ6Omk2NDoKKyAgY2FzZSBNVlQ6OmkxMjg6CisgIGNhc2UgTVZUOjpmMzI6CisgIGNhc2UgTVZUOjpmNjQ6CisgIGNhc2UgTVZUOjp2MmY2NDoKKyAgY2FzZSBNVlQ6OnYyaTY0OgorICBjYXNlIE1WVDo6djRmMzI6CisgIGNhc2UgTVZUOjp2NGkzMjoKKyAgY2FzZSBNVlQ6OnY4aTE2OgorICBjYXNlIE1WVDo6djE2aTg6CisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBTUFU6OlIzLCBJbnNbMF0uVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRmxhZykuZ2V0VmFsdWUoMSk7CisgICAgSW5WYWxzLnB1c2hfYmFjayhDaGFpbi5nZXRWYWx1ZSgwKSk7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKK1NEVmFsdWUKK1NQVVRhcmdldExvd2VyaW5nOjpMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKworICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIFJWTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworICBDQ0luZm8uQW5hbHl6ZVJldHVybihPdXRzLCBSZXRDQ19TUFUpOworCisgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHJldHVybiBsb3dlcmVkIGZvciB0aGlzIGZ1bmN0aW9uLCBhZGQgdGhlIHJlZ3MgdG8gdGhlCisgIC8vIGxpdmVvdXQgc2V0IGZvciB0aGUgZnVuY3Rpb24uCisgIGlmIChEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0UmVnSW5mbygpLmxpdmVvdXRfZW1wdHkoKSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUlZMb2NzLnNpemUoKTsgKytpKQorICAgICAgREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5hZGRMaXZlT3V0KFJWTG9jc1tpXS5nZXRMb2NSZWcoKSk7CisgIH0KKworICBTRFZhbHVlIEZsYWc7CisKKyAgLy8gQ29weSB0aGUgcmVzdWx0IHZhbHVlcyBpbnRvIHRoZSBvdXRwdXQgcmVnaXN0ZXJzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkgeworICAgIENDVmFsQXNzaWduICZWQSA9IFJWTG9jc1tpXTsKKyAgICBhc3NlcnQoVkEuaXNSZWdMb2MoKSAmJiAiQ2FuIG9ubHkgcmV0dXJuIGluIHJlZ2lzdGVycyEiKTsKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0VmFsc1tpXSwgRmxhZyk7CisgICAgRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisKKyAgaWYgKEZsYWcuZ2V0Tm9kZSgpKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShTUFVJU0Q6OlJFVF9GTEFHLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4sIEZsYWcpOworICBlbHNlCisgICAgcmV0dXJuIERBRy5nZXROb2RlKFNQVUlTRDo6UkVUX0ZMQUcsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbik7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFZlY3RvciByZWxhdGVkIGxvd2VyaW5nOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RhdGljIENvbnN0YW50U0ROb2RlICoKK2dldFZlY0ltbShTRE5vZGUgKk4pIHsKKyAgU0RWYWx1ZSBPcFZhbCgwLCAwKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBidWlsZHZlYyBoYXMgYSBzaW5nbGUgbm9uLXVuZGVmIHZhbHVlIGluIGl0cyBlbGVtZW50cy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKE4tPmdldE9wZXJhbmQoaSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikgY29udGludWU7CisgICAgaWYgKE9wVmFsLmdldE5vZGUoKSA9PSAwKQorICAgICAgT3BWYWwgPSBOLT5nZXRPcGVyYW5kKGkpOworICAgIGVsc2UgaWYgKE9wVmFsICE9IE4tPmdldE9wZXJhbmQoaSkpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChPcFZhbC5nZXROb2RlKCkgIT0gMCkgeworICAgIGlmIChDb25zdGFudFNETm9kZSAqQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3BWYWwpKSB7CisgICAgICByZXR1cm4gQ047CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBnZXRfdmVjX2kxOGltbSAtIFRlc3QgaWYgdGhpcyB2ZWN0b3IgaXMgYSB2ZWN0b3IgZmlsbGVkIHdpdGggdGhlIHNhbWUgdmFsdWUKKy8vLyBhbmQgdGhlIHZhbHVlIGZpdHMgaW50byBhbiB1bnNpZ25lZCAxOC1iaXQgY29uc3RhbnQsIGFuZCBpZiBzbywgcmV0dXJuIHRoZQorLy8vIGNvbnN0YW50CitTRFZhbHVlIFNQVTo6Z2V0X3ZlY191MThpbW0oU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWYWx1ZVR5cGUpIHsKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGdldFZlY0ltbShOKSkgeworICAgIHVpbnQ2NF90IFZhbHVlID0gQ04tPmdldFpFeHRWYWx1ZSgpOworICAgIGlmIChWYWx1ZVR5cGUgPT0gTVZUOjppNjQpIHsKKyAgICAgIHVpbnQ2NF90IFVWYWx1ZSA9IENOLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIHVpbnQzMl90IHVwcGVyID0gdWludDMyX3QoVVZhbHVlID4+IDMyKTsKKyAgICAgIHVpbnQzMl90IGxvd2VyID0gdWludDMyX3QoVVZhbHVlKTsKKyAgICAgIGlmICh1cHBlciAhPSBsb3dlcikKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICAgIFZhbHVlID0gVmFsdWUgPj4gMzI7CisgICAgfQorICAgIGlmIChWYWx1ZSA8PSAweDNmZmZmKQorICAgICAgcmV0dXJuIERBRy5nZXRUYXJnZXRDb25zdGFudChWYWx1ZSwgVmFsdWVUeXBlKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBnZXRfdmVjX2kxNmltbSAtIFRlc3QgaWYgdGhpcyB2ZWN0b3IgaXMgYSB2ZWN0b3IgZmlsbGVkIHdpdGggdGhlIHNhbWUgdmFsdWUKKy8vLyBhbmQgdGhlIHZhbHVlIGZpdHMgaW50byBhIHNpZ25lZCAxNi1iaXQgY29uc3RhbnQsIGFuZCBpZiBzbywgcmV0dXJuIHRoZQorLy8vIGNvbnN0YW50CitTRFZhbHVlIFNQVTo6Z2V0X3ZlY19pMTZpbW0oU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWYWx1ZVR5cGUpIHsKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGdldFZlY0ltbShOKSkgeworICAgIGludDY0X3QgVmFsdWUgPSBDTi0+Z2V0U0V4dFZhbHVlKCk7CisgICAgaWYgKFZhbHVlVHlwZSA9PSBNVlQ6Omk2NCkgeworICAgICAgdWludDY0X3QgVVZhbHVlID0gQ04tPmdldFpFeHRWYWx1ZSgpOworICAgICAgdWludDMyX3QgdXBwZXIgPSB1aW50MzJfdChVVmFsdWUgPj4gMzIpOworICAgICAgdWludDMyX3QgbG93ZXIgPSB1aW50MzJfdChVVmFsdWUpOworICAgICAgaWYgKHVwcGVyICE9IGxvd2VyKQorICAgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgICAgVmFsdWUgPSBWYWx1ZSA+PiAzMjsKKyAgICB9CisgICAgaWYgKFZhbHVlID49IC0oMSA8PCAxNSkgJiYgVmFsdWUgPD0gKCgxIDw8IDE1KSAtIDEpKSB7CisgICAgICByZXR1cm4gREFHLmdldFRhcmdldENvbnN0YW50KFZhbHVlLCBWYWx1ZVR5cGUpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBnZXRfdmVjX2kxMGltbSAtIFRlc3QgaWYgdGhpcyB2ZWN0b3IgaXMgYSB2ZWN0b3IgZmlsbGVkIHdpdGggdGhlIHNhbWUgdmFsdWUKKy8vLyBhbmQgdGhlIHZhbHVlIGZpdHMgaW50byBhIHNpZ25lZCAxMC1iaXQgY29uc3RhbnQsIGFuZCBpZiBzbywgcmV0dXJuIHRoZQorLy8vIGNvbnN0YW50CitTRFZhbHVlIFNQVTo6Z2V0X3ZlY19pMTBpbW0oU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWYWx1ZVR5cGUpIHsKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGdldFZlY0ltbShOKSkgeworICAgIGludDY0X3QgVmFsdWUgPSBDTi0+Z2V0U0V4dFZhbHVlKCk7CisgICAgaWYgKFZhbHVlVHlwZSA9PSBNVlQ6Omk2NCkgeworICAgICAgdWludDY0X3QgVVZhbHVlID0gQ04tPmdldFpFeHRWYWx1ZSgpOworICAgICAgdWludDMyX3QgdXBwZXIgPSB1aW50MzJfdChVVmFsdWUgPj4gMzIpOworICAgICAgdWludDMyX3QgbG93ZXIgPSB1aW50MzJfdChVVmFsdWUpOworICAgICAgaWYgKHVwcGVyICE9IGxvd2VyKQorICAgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgICAgVmFsdWUgPSBWYWx1ZSA+PiAzMjsKKyAgICB9CisgICAgaWYgKGlzSW50PDEwPihWYWx1ZSkpCisgICAgICByZXR1cm4gREFHLmdldFRhcmdldENvbnN0YW50KFZhbHVlLCBWYWx1ZVR5cGUpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIGdldF92ZWNfaThpbW0gLSBUZXN0IGlmIHRoaXMgdmVjdG9yIGlzIGEgdmVjdG9yIGZpbGxlZCB3aXRoIHRoZSBzYW1lIHZhbHVlCisvLy8gYW5kIHRoZSB2YWx1ZSBmaXRzIGludG8gYSBzaWduZWQgOC1iaXQgY29uc3RhbnQsIGFuZCBpZiBzbywgcmV0dXJuIHRoZQorLy8vIGNvbnN0YW50LgorLy8vCisvLy8gQG5vdGU6IFRoZSBpbmNvbWluZyB2ZWN0b3IgaXMgdjE2aTggYmVjYXVzZSB0aGF0J3MgdGhlIG9ubHkgd2F5IHdlIGNhbiBsb2FkCisvLy8gY29uc3RhbnQgdmVjdG9ycy4gVGh1cywgd2UgdGVzdCB0byBzZWUgaWYgdGhlIHVwcGVyIGFuZCBsb3dlciBieXRlcyBhcmUgdGhlCisvLy8gc2FtZSB2YWx1ZS4KK1NEVmFsdWUgU1BVOjpnZXRfdmVjX2k4aW1tKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWYWx1ZVR5cGUpIHsKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGdldFZlY0ltbShOKSkgeworICAgIGludCBWYWx1ZSA9IChpbnQpIENOLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBpZiAoVmFsdWVUeXBlID09IE1WVDo6aTE2CisgICAgICAgICYmIFZhbHVlIDw9IDB4ZmZmZiAgICAgICAgICAgICAgICAgLyogdHJ1bmNhdGVkIGZyb20gdWludDY0X3QgKi8KKyAgICAgICAgJiYgKChzaG9ydCkgVmFsdWUgPj4gOCkgPT0gKChzaG9ydCkgVmFsdWUgJiAweGZmKSkKKyAgICAgIHJldHVybiBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoVmFsdWUgJiAweGZmLCBWYWx1ZVR5cGUpOworICAgIGVsc2UgaWYgKFZhbHVlVHlwZSA9PSBNVlQ6Omk4CisgICAgICAgICAgICAgJiYgKFZhbHVlICYgMHhmZikgPT0gVmFsdWUpCisgICAgICByZXR1cm4gREFHLmdldFRhcmdldENvbnN0YW50KFZhbHVlLCBWYWx1ZVR5cGUpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIGdldF9JTEhVdmVjX2ltbSAtIFRlc3QgaWYgdGhpcyB2ZWN0b3IgaXMgYSB2ZWN0b3IgZmlsbGVkIHdpdGggdGhlIHNhbWUgdmFsdWUKKy8vLyBhbmQgdGhlIHZhbHVlIGZpdHMgaW50byBhIHNpZ25lZCAxNi1iaXQgY29uc3RhbnQsIGFuZCBpZiBzbywgcmV0dXJuIHRoZQorLy8vIGNvbnN0YW50CitTRFZhbHVlIFNQVTo6Z2V0X0lMSFV2ZWNfaW1tKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZhbHVlVHlwZSkgeworICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNOID0gZ2V0VmVjSW1tKE4pKSB7CisgICAgdWludDY0X3QgVmFsdWUgPSBDTi0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKChWYWx1ZVR5cGUgPT0gTVZUOjppMzIKKyAgICAgICAgICAmJiAoKHVuc2lnbmVkKSBWYWx1ZSAmIDB4ZmZmZjAwMDApID09ICh1bnNpZ25lZCkgVmFsdWUpCisgICAgICAgIHx8IChWYWx1ZVR5cGUgPT0gTVZUOjppNjQgJiYgKFZhbHVlICYgMHhmZmZmMDAwMCkgPT0gVmFsdWUpKQorICAgICAgcmV0dXJuIERBRy5nZXRUYXJnZXRDb25zdGFudChWYWx1ZSA+PiAxNiwgVmFsdWVUeXBlKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBnZXRfdjRpMzJfaW1tIC0gQ2F0Y2gtYWxsIGZvciBnZW5lcmFsIDMyLWJpdCBjb25zdGFudCB2ZWN0b3JzCitTRFZhbHVlIFNQVTo6Z2V0X3Y0aTMyX2ltbShTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIGlmIChDb25zdGFudFNETm9kZSAqQ04gPSBnZXRWZWNJbW0oTikpIHsKKyAgICByZXR1cm4gREFHLmdldFRhcmdldENvbnN0YW50KCh1bnNpZ25lZCkgQ04tPmdldFpFeHRWYWx1ZSgpLCBNVlQ6OmkzMik7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gZ2V0X3Y0aTMyX2ltbSAtIENhdGNoLWFsbCBmb3IgZ2VuZXJhbCA2NC1iaXQgY29uc3RhbnQgdmVjdG9ycworU0RWYWx1ZSBTUFU6OmdldF92Mmk2NF9pbW0oU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRykgeworICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNOID0gZ2V0VmVjSW1tKE4pKSB7CisgICAgcmV0dXJuIERBRy5nZXRUYXJnZXRDb25zdGFudCgodW5zaWduZWQpIENOLT5nZXRaRXh0VmFsdWUoKSwgTVZUOjppNjQpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8hIExvd2VyIGEgQlVJTERfVkVDVE9SIGluc3RydWN0aW9uIGNyZWF0aXZlbHk6CitzdGF0aWMgU0RWYWx1ZQorTG93ZXJCVUlMRF9WRUNUT1IoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBFbHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgQnVpbGRWZWN0b3JTRE5vZGUgKkJDTiA9IGR5bl9jYXN0PEJ1aWxkVmVjdG9yU0ROb2RlPihPcC5nZXROb2RlKCkpOworICBhc3NlcnQoQkNOICE9IDAgJiYgIkV4cGVjdGVkIEJ1aWxkVmVjdG9yU0ROb2RlIGluIFNQVSBMb3dlckJVSUxEX1ZFQ1RPUiIpOworICB1bnNpZ25lZCBtaW5TcGxhdEJpdHMgPSBFbHRWVC5nZXRTaXplSW5CaXRzKCk7CisKKyAgaWYgKG1pblNwbGF0Qml0cyA8IDE2KQorICAgIG1pblNwbGF0Qml0cyA9IDE2OworCisgIEFQSW50IEFQU3BsYXRCaXRzLCBBUFNwbGF0VW5kZWY7CisgIHVuc2lnbmVkIFNwbGF0Qml0U2l6ZTsKKyAgYm9vbCBIYXNBbnlVbmRlZnM7CisKKyAgaWYgKCFCQ04tPmlzQ29uc3RhbnRTcGxhdChBUFNwbGF0Qml0cywgQVBTcGxhdFVuZGVmLCBTcGxhdEJpdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzQW55VW5kZWZzLCBtaW5TcGxhdEJpdHMpCisgICAgICB8fCBtaW5TcGxhdEJpdHMgPCBTcGxhdEJpdFNpemUpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsgICAvLyBXYXNuJ3QgYSBjb25zdGFudCB2ZWN0b3Igb3Igc3BsYXQgZXhjZWVkZWQgbWluCisKKyAgdWludDY0X3QgU3BsYXRCaXRzID0gQVBTcGxhdEJpdHMuZ2V0WkV4dFZhbHVlKCk7CisKKyAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6CisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJDZWxsU1BVOiBVbmhhbmRsZWQgVlQgaW4gTG93ZXJCVUlMRF9WRUNUT1IsIFZUID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKFZULmdldEVWVFN0cmluZygpKSk7CisgICAgLypOT1RSRUFDSEVEKi8KKyAgY2FzZSBNVlQ6OnY0ZjMyOiB7CisgICAgdWludDMyX3QgVmFsdWUzMiA9IHVpbnQzMl90KFNwbGF0Qml0cyk7CisgICAgYXNzZXJ0KFNwbGF0Qml0U2l6ZSA9PSAzMgorICAgICAgICAgICAmJiAiTG93ZXJCVUlMRF9WRUNUT1I6IFVuZXhwZWN0ZWQgZmxvYXRpbmcgcG9pbnQgdmVjdG9yIGVsZW1lbnQuIik7CisgICAgLy8gTk9URTogcHJldGVuZCB0aGUgY29uc3RhbnQgaXMgYW4gaW50ZWdlci4gTExWTSB3b24ndCBsb2FkIEZQIGNvbnN0YW50cworICAgIFNEVmFsdWUgVCA9IERBRy5nZXRDb25zdGFudChWYWx1ZTMyLCBNVlQ6OmkzMik7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnY0ZjMyLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djRpMzIsIFQsVCxULFQpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIE1WVDo6djJmNjQ6IHsKKyAgICB1aW50NjRfdCBmNjR2YWwgPSB1aW50NjRfdChTcGxhdEJpdHMpOworICAgIGFzc2VydChTcGxhdEJpdFNpemUgPT0gNjQKKyAgICAgICAgICAgJiYgIkxvd2VyQlVJTERfVkVDVE9SOiA2NC1iaXQgZmxvYXQgdmVjdG9yIHNpemUgPiA4IGJ5dGVzLiIpOworICAgIC8vIE5PVEU6IHByZXRlbmQgdGhlIGNvbnN0YW50IGlzIGFuIGludGVnZXIuIExMVk0gd29uJ3QgbG9hZCBGUCBjb25zdGFudHMKKyAgICBTRFZhbHVlIFQgPSBEQUcuZ2V0Q29uc3RhbnQoZjY0dmFsLCBNVlQ6Omk2NCk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYyZjY0LAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djJpNjQsIFQsIFQpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIE1WVDo6djE2aTg6IHsKKyAgIC8vIDgtYml0IGNvbnN0YW50cyBoYXZlIHRvIGJlIGV4cGFuZGVkIHRvIDE2LWJpdHMKKyAgIHVuc2lnbmVkIHNob3J0IFZhbHVlMTYgPSBTcGxhdEJpdHMgLyogfCAoU3BsYXRCaXRzIDw8IDgpICovOworICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworCisgICBPcHMuYXNzaWduKDgsIERBRy5nZXRDb25zdGFudChWYWx1ZTE2LCBNVlQ6OmkxNikpOworICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djhpMTYsICZPcHNbMF0sIE9wcy5zaXplKCkpKTsKKyAgfQorICBjYXNlIE1WVDo6djhpMTY6IHsKKyAgICB1bnNpZ25lZCBzaG9ydCBWYWx1ZTE2ID0gU3BsYXRCaXRzOworICAgIFNEVmFsdWUgVCA9IERBRy5nZXRDb25zdGFudChWYWx1ZTE2LCBFbHRWVCk7CisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworCisgICAgT3BzLmFzc2lnbig4LCBUKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBWVCwgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgIH0KKyAgY2FzZSBNVlQ6OnY0aTMyOiB7CisgICAgU0RWYWx1ZSBUID0gREFHLmdldENvbnN0YW50KHVuc2lnbmVkKFNwbGF0Qml0cyksIFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIFZULCBULCBULCBULCBUKTsKKyAgfQorICBjYXNlIE1WVDo6djJmMzI6CisgIGNhc2UgTVZUOjp2MmkzMjogeworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKyAgY2FzZSBNVlQ6OnYyaTY0OiB7CisgICAgcmV0dXJuIFNQVTo6TG93ZXJWMkk2NFNwbGF0KFZULCBEQUcsIFNwbGF0Qml0cywgZGwpOworICB9CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvKiEKKyAqLworU0RWYWx1ZQorU1BVOjpMb3dlclYySTY0U3BsYXQoRVZUIE9wVlQsIFNlbGVjdGlvbkRBRyYgREFHLCB1aW50NjRfdCBTcGxhdFZhbCwKKyAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIHVpbnQzMl90IHVwcGVyID0gdWludDMyX3QoU3BsYXRWYWwgPj4gMzIpOworICB1aW50MzJfdCBsb3dlciA9IHVpbnQzMl90KFNwbGF0VmFsKTsKKworICBpZiAodXBwZXIgPT0gbG93ZXIpIHsKKyAgICAvLyBNYWdpYyBjb25zdGFudCB0aGF0IGNhbiBiZSBtYXRjaGVkIGJ5IElMLCBJTEEsIGV0LiBhbC4KKyAgICBTRFZhbHVlIFZhbCA9IERBRy5nZXRUYXJnZXRDb25zdGFudCh1cHBlciwgTVZUOjppMzIpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgT3BWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWwsIFZhbCwgVmFsLCBWYWwpKTsKKyAgfSBlbHNlIHsKKyAgICBib29sIHVwcGVyX3NwZWNpYWwsIGxvd2VyX3NwZWNpYWw7CisKKyAgICAvLyBOT1RFOiBUaGlzIGNvZGUgY3JlYXRlcyBjb21tb24tY2FzZSBzaHVmZmxlIG1hc2tzIHRoYXQgY2FuIGJlIGVhc2lseQorICAgIC8vIGRldGVjdGVkIGFzIGNvbW1vbiBleHByZXNzaW9ucy4gSXQgaXMgbm90IGF0dGVtcHRpbmcgdG8gY3JlYXRlIGhpZ2hseQorICAgIC8vIHNwZWNpYWxpemVkIG1hc2tzIHRvIHJlcGxhY2UgYW55IGFuZCBhbGwgMCdzLCAweGZmJ3MgYW5kIDB4ODAncy4KKworICAgIC8vIERldGVjdCBpZiB0aGUgdXBwZXIgb3IgbG93ZXIgaGFsZiBpcyBhIHNwZWNpYWwgc2h1ZmZsZSBtYXNrIHBhdHRlcm46CisgICAgdXBwZXJfc3BlY2lhbCA9ICh1cHBlciA9PSAwIHx8IHVwcGVyID09IDB4ZmZmZmZmZmYgfHwgdXBwZXIgPT0gMHg4MDAwMDAwMCk7CisgICAgbG93ZXJfc3BlY2lhbCA9IChsb3dlciA9PSAwIHx8IGxvd2VyID09IDB4ZmZmZmZmZmYgfHwgbG93ZXIgPT0gMHg4MDAwMDAwMCk7CisKKyAgICAvLyBCb3RoIHVwcGVyIGFuZCBsb3dlciBhcmUgc3BlY2lhbCwgbG93ZXIgdG8gYSBjb25zdGFudCBwb29sIGxvYWQ6CisgICAgaWYgKGxvd2VyX3NwZWNpYWwgJiYgdXBwZXJfc3BlY2lhbCkgeworICAgICAgU0RWYWx1ZSBTcGxhdFZhbENOID0gREFHLmdldENvbnN0YW50KFNwbGF0VmFsLCBNVlQ6Omk2NCk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnYyaTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGF0VmFsQ04sIFNwbGF0VmFsQ04pOworICAgIH0KKworICAgIFNEVmFsdWUgTE8zMjsKKyAgICBTRFZhbHVlIEhJMzI7CisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+IFNodWZCeXRlczsKKyAgICBTRFZhbHVlIFJlc3VsdDsKKworICAgIC8vIENyZWF0ZSBsb3dlciB2ZWN0b3IgaWYgbm90IGEgc3BlY2lhbCBwYXR0ZXJuCisgICAgaWYgKCFsb3dlcl9zcGVjaWFsKSB7CisgICAgICBTRFZhbHVlIExPMzJDID0gREFHLmdldENvbnN0YW50KGxvd2VyLCBNVlQ6OmkzMik7CisgICAgICBMTzMyID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE9wVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMzJDLCBMTzMyQywgTE8zMkMsIExPMzJDKSk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHVwcGVyIHZlY3RvciBpZiBub3QgYSBzcGVjaWFsIHBhdHRlcm4KKyAgICBpZiAoIXVwcGVyX3NwZWNpYWwpIHsKKyAgICAgIFNEVmFsdWUgSEkzMkMgPSBEQUcuZ2V0Q29uc3RhbnQodXBwZXIsIE1WVDo6aTMyKTsKKyAgICAgIEhJMzIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgT3BWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djRpMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEkzMkMsIEhJMzJDLCBISTMyQywgSEkzMkMpKTsKKyAgICB9CisKKyAgICAvLyBJZiBlaXRoZXIgdXBwZXIgb3IgbG93ZXIgYXJlIHNwZWNpYWwsIHRoZW4gdGhlIHR3byBpbnB1dCBvcGVyYW5kcyBhcmUKKyAgICAvLyB0aGUgc2FtZSAoYmFzaWNhbGx5LCBvbmUgb2YgdGhlbSBpcyBhICJkb24ndCBjYXJlIikKKyAgICBpZiAobG93ZXJfc3BlY2lhbCkKKyAgICAgIExPMzIgPSBISTMyOworICAgIGlmICh1cHBlcl9zcGVjaWFsKQorICAgICAgSEkzMiA9IExPMzI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgdWludDY0X3QgdmFsID0gMDsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgIFNEVmFsdWUgVjsKKyAgICAgICAgYm9vbCBwcm9jZXNzX3VwcGVyLCBwcm9jZXNzX2xvd2VyOworICAgICAgICB2YWwgPDw9IDg7CisgICAgICAgIHByb2Nlc3NfdXBwZXIgPSAodXBwZXJfc3BlY2lhbCAmJiAoaSAmIDEpID09IDApOworICAgICAgICBwcm9jZXNzX2xvd2VyID0gKGxvd2VyX3NwZWNpYWwgJiYgKGkgJiAxKSA9PSAxKTsKKworICAgICAgICBpZiAocHJvY2Vzc191cHBlciB8fCBwcm9jZXNzX2xvd2VyKSB7CisgICAgICAgICAgaWYgKChwcm9jZXNzX3VwcGVyICYmIHVwcGVyID09IDApCisgICAgICAgICAgICAgICAgICB8fCAocHJvY2Vzc19sb3dlciAmJiBsb3dlciA9PSAwKSkKKyAgICAgICAgICAgIHZhbCB8PSAweDgwOworICAgICAgICAgIGVsc2UgaWYgKChwcm9jZXNzX3VwcGVyICYmIHVwcGVyID09IDB4ZmZmZmZmZmYpCisgICAgICAgICAgICAgICAgICB8fCAocHJvY2Vzc19sb3dlciAmJiBsb3dlciA9PSAweGZmZmZmZmZmKSkKKyAgICAgICAgICAgIHZhbCB8PSAweGMwOworICAgICAgICAgIGVsc2UgaWYgKChwcm9jZXNzX3VwcGVyICYmIHVwcGVyID09IDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICB8fCAocHJvY2Vzc19sb3dlciAmJiBsb3dlciA9PSAweDgwMDAwMDAwKSkKKyAgICAgICAgICAgIHZhbCB8PSAoaiA9PSAwID8gMHhlMCA6IDB4ODApOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICB2YWwgfD0gaSAqIDQgKyBqICsgKChpICYgMSkgKiAxNik7CisgICAgICB9CisKKyAgICAgIFNodWZCeXRlcy5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KHZhbCwgTVZUOjppMzIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gREFHLmdldE5vZGUoU1BVSVNEOjpTSFVGQiwgZGwsIE9wVlQsIEhJMzIsIExPMzIsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgTVZUOjp2NGkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNodWZCeXRlc1swXSwgU2h1ZkJ5dGVzLnNpemUoKSkpOworICB9Cit9CisKKy8vLyBMb3dlclZFQ1RPUl9TSFVGRkxFIC0gTG93ZXIgYSB2ZWN0b3Igc2h1ZmZsZSAoVjEsIFYyLCBWMykgdG8gc29tZXRoaW5nIG9uCisvLy8gd2hpY2ggdGhlIENlbGwgY2FuIG9wZXJhdGUuIFRoZSBjb2RlIGluc3BlY3RzIFYzIHRvIGFzY2VydGFpbiB3aGV0aGVyIHRoZQorLy8vIHBlcm11dGF0aW9uIHZlY3RvciwgVjMsIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB3aXRoIG9uZSAiZXhjZXB0aW9uIgorLy8vIGVsZW1lbnQsIGUuZy4sICgwLCAxLCBfLCAzKS4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiBnZW5lcmF0ZSBhCisvLy8gU0hVRkZMRV9NQVNLIHN5bnRoZXRpYyBpbnN0cnVjdGlvbi4gT3RoZXJ3aXNlLCBzcGlsbCBWMyB0byB0aGUgY29uc3RhbnQgcG9vbC4KKy8vLyBJbiBlaXRoZXIgY2FzZSwgdGhlIG5ldCByZXN1bHQgaXMgZ29pbmcgdG8gZXZlbnR1YWxseSBpbnZva2UgU0hVRkIgdG8KKy8vLyBwZXJtdXRlL3NodWZmbGUgdGhlIGJ5dGVzIGZyb20gVjEgYW5kIFYyLgorLy8vIFxub3RlCisvLy8gU0hVRkZMRV9NQVNLIGlzIGV2ZW50dWFsbHkgc2VsZWN0ZWQgYXMgb25lIG9mIHRoZSBDKkQgaW5zdHJ1Y3Rpb25zLCBnZW5lcmF0ZQorLy8vIGNvbnRyb2wgd29yZCBmb3IgYnl0ZS9oYWxmd29yZC93b3JkIGluc2VydGlvbi4gVGhpcyB0YWtlcyBjYXJlIG9mIGEgc2luZ2xlCisvLy8gZWxlbWVudCBtb3ZlIGZyb20gVjIgaW50byBWMS4KKy8vLyBcbm90ZQorLy8vIFNQVUlTRDo6U0hVRkIgaXMgZXZlbnR1YWxseSBzZWxlY3RlZCBhcyBDZWxsJ3MgPGk+c2h1ZmI8L2k+IGluc3RydWN0aW9ucy4KK3N0YXRpYyBTRFZhbHVlIExvd2VyVkVDVE9SX1NIVUZGTEUoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgY29uc3QgU2h1ZmZsZVZlY3RvclNETm9kZSAqU1ZOID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihPcCk7CisgIFNEVmFsdWUgVjEgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFYyID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGlmIChWMi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKSBWMiA9IFYxOworCisgIC8vIElmIHdlIGhhdmUgYSBzaW5nbGUgZWxlbWVudCBiZWluZyBtb3ZlZCBmcm9tIFYxIHRvIFYyLCB0aGlzIGNhbiBiZSBoYW5kbGVkCisgIC8vIHVzaW5nIHRoZSBDKltEWF0gY29tcHV0ZSBtYXNrIGluc3RydWN0aW9ucywgYnV0IHRoZSB2ZWN0b3IgZWxlbWVudHMgaGF2ZQorICAvLyB0byBiZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgd2l0aCBvbmUgZXhjZXB0aW9uIGVsZW1lbnQuCisgIEVWVCBWZWNWVCA9IFYxLmdldFZhbHVlVHlwZSgpOworICBFVlQgRWx0VlQgPSBWZWNWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICB1bnNpZ25lZCBFbHRzRnJvbVYyID0gMDsKKyAgdW5zaWduZWQgVjJFbHQgPSAwOworICB1bnNpZ25lZCBWMkVsdElkeDAgPSAwOworICB1bnNpZ25lZCBDdXJyRWx0ID0gMDsKKyAgdW5zaWduZWQgTWF4RWx0cyA9IFZlY1ZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIHVuc2lnbmVkIFByZXZFbHQgPSAwOworICB1bnNpZ25lZCBWMEVsdCA9IDA7CisgIGJvb2wgbW9ub3RvbmljID0gdHJ1ZTsKKyAgYm9vbCByb3RhdGUgPSB0cnVlOworICBFVlQgbWFza1ZUOyAgICAgICAgICAgICAvLyB3aGljaCBvZiB0aGUgYz9kIGluc3RydWN0aW9ucyB0byB1c2UKKworICBpZiAoRWx0VlQgPT0gTVZUOjppOCkgeworICAgIFYyRWx0SWR4MCA9IDE2OworICAgIG1hc2tWVCA9IE1WVDo6djE2aTg7IAorICB9IGVsc2UgaWYgKEVsdFZUID09IE1WVDo6aTE2KSB7CisgICAgVjJFbHRJZHgwID0gODsKKyAgICBtYXNrVlQgPSBNVlQ6OnY4aTE2OworICB9IGVsc2UgaWYgKFZlY1ZUID09IE1WVDo6djJpMzIgfHwgVmVjVlQgPT0gTVZUOjp2MmYzMiApIHsKKyAgICBWMkVsdElkeDAgPSAyOworICAgIG1hc2tWVCA9IE1WVDo6djRpMzI7CisgIH0gZWxzZSBpZiAoRWx0VlQgPT0gTVZUOjppMzIgfHwgRWx0VlQgPT0gTVZUOjpmMzIpIHsKKyAgICBWMkVsdElkeDAgPSA0OworICAgIG1hc2tWVCA9IE1WVDo6djRpMzI7CisgIH0gZWxzZSBpZiAoRWx0VlQgPT0gTVZUOjppNjQgfHwgRWx0VlQgPT0gTVZUOjpmNjQpIHsKKyAgICBWMkVsdElkeDAgPSAyOworICAgIG1hc2tWVCA9IE1WVDo6djJpNjQ7CisgIH0gZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCB2ZWN0b3IgdHlwZSBpbiBMb3dlclZFQ1RPUl9TSFVGRkxFIik7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNYXhFbHRzOyArK2kpIHsKKyAgICBpZiAoU1ZOLT5nZXRNYXNrRWx0KGkpIDwgMCkKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIHVuc2lnbmVkIFNyY0VsdCA9IFNWTi0+Z2V0TWFza0VsdChpKTsKKworICAgIGlmIChtb25vdG9uaWMpIHsKKyAgICAgIGlmIChTcmNFbHQgPj0gVjJFbHRJZHgwKSB7CisgICAgICAgIGlmICgxID49ICgrK0VsdHNGcm9tVjIpKSB7CisgICAgICAgICAgVjJFbHQgPSAoVjJFbHRJZHgwIC0gU3JjRWx0KSA8PCAyOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKEN1cnJFbHQgIT0gU3JjRWx0KSB7CisgICAgICAgIG1vbm90b25pYyA9IGZhbHNlOworICAgICAgfQorCisgICAgICArK0N1cnJFbHQ7CisgICAgfQorCisgICAgaWYgKHJvdGF0ZSkgeworICAgICAgaWYgKFByZXZFbHQgPiAwICYmIFNyY0VsdCA8IE1heEVsdHMpIHsKKyAgICAgICAgaWYgKChQcmV2RWx0ID09IFNyY0VsdCAtIDEpCisgICAgICAgICAgICB8fCAoUHJldkVsdCA9PSBNYXhFbHRzIC0gMSAmJiBTcmNFbHQgPT0gMCkpIHsKKyAgICAgICAgICBQcmV2RWx0ID0gU3JjRWx0OworICAgICAgICAgIGlmIChTcmNFbHQgPT0gMCkKKyAgICAgICAgICAgIFYwRWx0ID0gaTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByb3RhdGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpID09IDApIHsKKyAgICAgICAgLy8gRmlyc3QgdGltZSB0aHJvdWdoLCBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgZWxlbWVudAorICAgICAgICBQcmV2RWx0ID0gU3JjRWx0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhpcyBpc24ndCBhIHJvdGF0aW9uLCB0YWtlcyBlbGVtZW50cyBmcm9tIHZlY3RvciAyCisgICAgICAgIHJvdGF0ZSA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChFbHRzRnJvbVYyID09IDEgJiYgbW9ub3RvbmljKSB7CisgICAgLy8gQ29tcHV0ZSBtYXNrIGFuZCBzaHVmZmxlCisgICAgRVZUIFB0clZUID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLmdldFBvaW50ZXJUeSgpOworCisgICAgLy8gQXMgU0hVRkZMRV9NQVNLIGJlY29tZXMgYSBjP2QgaW5zdHJ1Y3Rpb24sIGZlZWQgaXQgYW4gYWRkcmVzcworICAgIC8vIFIxICgkc3ApIGlzIHVzZWQgaGVyZSBvbmx5IGFzIGl0IGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBsYXN0IGJpdHMgemVybworICAgIFNEVmFsdWUgUG9pbnRlciA9IERBRy5nZXROb2RlKFNQVUlTRDo6SW5kaXJlY3RBZGRyLCBkbCwgUHRyVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRSZWdpc3RlcihTUFU6OlIxLCBQdHJWVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChWMkVsdCwgTVZUOjppMzIpKTsKKyAgICBTRFZhbHVlIFNodWZNYXNrT3AgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OlNIVUZGTEVfTUFTSywgZGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tWVCwgUG9pbnRlcik7CisKKyAgICAvLyBVc2Ugc2h1ZmZsZSBtYXNrIGluIFNIVUZCIHN5bnRoZXRpYyBpbnN0cnVjdGlvbjoKKyAgICByZXR1cm4gREFHLmdldE5vZGUoU1BVSVNEOjpTSFVGQiwgZGwsIFYxLmdldFZhbHVlVHlwZSgpLCBWMiwgVjEsCisgICAgICAgICAgICAgICAgICAgICAgIFNodWZNYXNrT3ApOworICB9IGVsc2UgaWYgKHJvdGF0ZSkgeworICAgIGludCByb3RhbXQgPSAoTWF4RWx0cyAtIFYwRWx0KSAqIEVsdFZULmdldFNpemVJbkJpdHMoKS84OworCisgICAgcmV0dXJuIERBRy5nZXROb2RlKFNQVUlTRDo6Uk9UQllURVNfTEVGVCwgZGwsIFYxLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBWMSwgREFHLmdldENvbnN0YW50KHJvdGFtdCwgTVZUOjppMTYpKTsKKyAgfSBlbHNlIHsKKyAgIC8vIENvbnZlcnQgdGhlIFNIVUZGTEVfVkVDVE9SIG1hc2sncyBpbnB1dCBlbGVtZW50IHVuaXRzIHRvIHRoZQorICAgLy8gYWN0dWFsIGJ5dGVzLgorICAgIHVuc2lnbmVkIEJ5dGVzUGVyRWxlbWVudCA9IEVsdFZULmdldFNpemVJbkJpdHMoKS84OworCisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+IFJlc3VsdE1hc2s7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1heEVsdHM7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBTcmNFbHQgPSBTVk4tPmdldE1hc2tFbHQoaSkgPCAwID8gMCA6IFNWTi0+Z2V0TWFza0VsdChpKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IEJ5dGVzUGVyRWxlbWVudDsgKytqKQorICAgICAgICBSZXN1bHRNYXNrLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoU3JjRWx0KkJ5dGVzUGVyRWxlbWVudCtqLE1WVDo6aTgpKTsKKyAgICB9CisgICAgLy8gRm9yIGhhbGYgdmVjdG9ycyBwYWRkIHRoZSBtYXNrIHdpdGggemVyb3MgZm9yIHRoZSBzZWNvbmQgaGFsZi4KKyAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG1hc2sgaXMgYXNzdW1lZCB0byBiZSBmdWxsIHZlY3RvciBlbHNld2hlcmUgaW4gCisgICAgLy8gdGhlIFNQVSBiYWNrZW5kLiAKKyAgICBpZihWZWNWVCA9PSBNVlQ6OnYyaTMyIHx8IFZlY1ZUID09IE1WVDo6djJmMzIpCisgICAgZm9yKCB1bnNpZ25lZCBpID0gMDsgaSA8IDI7ICsraSApCisgICAgeworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IEJ5dGVzUGVyRWxlbWVudDsgKytqKQorICAgICAgICBSZXN1bHRNYXNrLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoMCxNVlQ6Omk4KSk7CisgICAgfQorCisgICAgU0RWYWx1ZSBWUGVybU1hc2sgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djE2aTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUmVzdWx0TWFza1swXSwgUmVzdWx0TWFzay5zaXplKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShTUFVJU0Q6OlNIVUZCLCBkbCwgVjEuZ2V0VmFsdWVUeXBlKCksIFYxLCBWMiwgVlBlcm1NYXNrKTsKKyAgfQorfQorCitzdGF0aWMgU0RWYWx1ZSBMb3dlclNDQUxBUl9UT19WRUNUT1IoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgU0RWYWx1ZSBPcDAgPSBPcC5nZXRPcGVyYW5kKDApOyAgICAgICAgICAgICAgICAgICAgIC8vIE9wMCA9IHRoZSBzY2FsYXIKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGlmIChPcDAuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50KSB7CisgICAgLy8gRm9yIGEgY29uc3RhbnQsIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSBjb25zdGFudCB2ZWN0b3IsIHdoaWNoIHdpbGwKKyAgICAvLyBldmVudHVhbGx5IHNpbXBsaWZ5IHRvIGEgdmVjdG9yIHJlZ2lzdGVyIGxvYWQuCisKKyAgICBDb25zdGFudFNETm9kZSAqQ04gPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcDAuZ2V0Tm9kZSgpKTsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gQ29uc3RWZWNWYWx1ZXM7CisgICAgRVZUIFZUOworICAgIHNpemVfdCBuX2NvcGllczsKKworICAgIC8vIENyZWF0ZSBhIGNvbnN0YW50IHZlY3RvcjoKKyAgICBzd2l0Y2ggKE9wLmdldFZhbHVlVHlwZSgpLmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGNvbnN0YW50IHZhbHVlIHR5cGUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvd2VyU0NBTEFSX1RPX1ZFQ1RPUiIpOworICAgIGNhc2UgTVZUOjp2MTZpODogbl9jb3BpZXMgPSAxNjsgVlQgPSBNVlQ6Omk4OyBicmVhazsKKyAgICBjYXNlIE1WVDo6djhpMTY6IG5fY29waWVzID0gODsgVlQgPSBNVlQ6OmkxNjsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OnY0aTMyOiBuX2NvcGllcyA9IDQ7IFZUID0gTVZUOjppMzI7IGJyZWFrOworICAgIGNhc2UgTVZUOjp2NGYzMjogbl9jb3BpZXMgPSA0OyBWVCA9IE1WVDo6ZjMyOyBicmVhazsKKyAgICBjYXNlIE1WVDo6djJpNjQ6IG5fY29waWVzID0gMjsgVlQgPSBNVlQ6Omk2NDsgYnJlYWs7CisgICAgY2FzZSBNVlQ6OnYyZjY0OiBuX2NvcGllcyA9IDI7IFZUID0gTVZUOjpmNjQ7IGJyZWFrOworICAgIGNhc2UgTVZUOjp2MmkzMjogbl9jb3BpZXMgPSAyOyBWVCA9IE1WVDo6aTMyOyBicmVhazsKKyAgICB9CisKKyAgICBTRFZhbHVlIENWYWx1ZSA9IERBRy5nZXRDb25zdGFudChDTi0+Z2V0WkV4dFZhbHVlKCksIFZUKTsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG5fY29waWVzOyArK2opCisgICAgICBDb25zdFZlY1ZhbHVlcy5wdXNoX2JhY2soQ1ZhbHVlKTsKKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAmQ29uc3RWZWNWYWx1ZXNbMF0sIENvbnN0VmVjVmFsdWVzLnNpemUoKSk7CisgIH0gZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlLCBjb3B5IHRoZSB2YWx1ZSBmcm9tIG9uZSByZWdpc3RlciB0byBhbm90aGVyOgorICAgIHN3aXRjaCAoT3AwLmdldFZhbHVlVHlwZSgpLmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHZhbHVlIHR5cGUgaW4gTG93ZXJTQ0FMQVJfVE9fVkVDVE9SIik7CisgICAgY2FzZSBNVlQ6Omk4OgorICAgIGNhc2UgTVZUOjppMTY6CisgICAgY2FzZSBNVlQ6OmkzMjoKKyAgICBjYXNlIE1WVDo6aTY0OgorICAgIGNhc2UgTVZUOjpmMzI6CisgICAgY2FzZSBNVlQ6OmY2NDoKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShTUFVJU0Q6OlBSRUZTTE9UMlZFQywgZGwsIE9wLmdldFZhbHVlVHlwZSgpLCBPcDAsIE9wMCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworc3RhdGljIFNEVmFsdWUgTG93ZXJFWFRSQUNUX1ZFQ1RPUl9FTFQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIFNEVmFsdWUgTiA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgRWx0ID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIHJldHZhbDsKKworICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oRWx0KSkgeworICAgIC8vIENvbnN0YW50IGFyZ3VtZW50OgorICAgIGludCBFbHRObyA9IChpbnQpIEMtPmdldFpFeHRWYWx1ZSgpOworCisgICAgLy8gc2FuaXR5IGNoZWNrczoKKyAgICBpZiAoVlQgPT0gTVZUOjppOCAmJiBFbHRObyA+PSAxNikKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlNQVSBMb3dlckVYVFJBQ1RfVkVDVE9SX0VMVDogaTggZXh0cmFjdGlvbiBzbG90ID4gMTUiKTsKKyAgICBlbHNlIGlmIChWVCA9PSBNVlQ6OmkxNiAmJiBFbHRObyA+PSA4KQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiU1BVIExvd2VyRVhUUkFDVF9WRUNUT1JfRUxUOiBpMTYgZXh0cmFjdGlvbiBzbG90ID4gNyIpOworICAgIGVsc2UgaWYgKFZUID09IE1WVDo6aTMyICYmIEVsdE5vID49IDQpCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJTUFUgTG93ZXJFWFRSQUNUX1ZFQ1RPUl9FTFQ6IGkzMiBleHRyYWN0aW9uIHNsb3QgPiA0Iik7CisgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjppNjQgJiYgRWx0Tm8gPj0gMikKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlNQVSBMb3dlckVYVFJBQ1RfVkVDVE9SX0VMVDogaTY0IGV4dHJhY3Rpb24gc2xvdCA+IDIiKTsKKworICAgIGlmIChFbHRObyA9PSAwICYmIChWVCA9PSBNVlQ6OmkzMiB8fCBWVCA9PSBNVlQ6Omk2NCkpIHsKKyAgICAgIC8vIGkzMiBhbmQgaTY0OiBFbGVtZW50IDAgaXMgdGhlIHByZWZlcnJlZCBzbG90CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoU1BVSVNEOjpWRUMyUFJFRlNMT1QsIGRsLCBWVCwgTik7CisgICAgfQorCisgICAgLy8gTmVlZCB0byBnZW5lcmF0ZSBzaHVmZmxlIG1hc2sgYW5kIGV4dHJhY3Q6CisgICAgaW50IHByZWZzbG90X2JlZ2luID0gLTEsIHByZWZzbG90X2VuZCA9IC0xOworICAgIGludCBlbHRfYnl0ZSA9IEVsdE5vICogVlQuZ2V0U2l6ZUluQml0cygpIC8gODsKKworICAgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoZmFsc2UgJiYgIkludmFsaWQgdmFsdWUgdHlwZSEiKTsKKyAgICBjYXNlIE1WVDo6aTg6IHsKKyAgICAgIHByZWZzbG90X2JlZ2luID0gcHJlZnNsb3RfZW5kID0gMzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE1WVDo6aTE2OiB7CisgICAgICBwcmVmc2xvdF9iZWdpbiA9IDI7IHByZWZzbG90X2VuZCA9IDM7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBNVlQ6OmkzMjoKKyAgICBjYXNlIE1WVDo6ZjMyOiB7CisgICAgICBwcmVmc2xvdF9iZWdpbiA9IDA7IHByZWZzbG90X2VuZCA9IDM7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBNVlQ6Omk2NDoKKyAgICBjYXNlIE1WVDo6ZjY0OiB7CisgICAgICBwcmVmc2xvdF9iZWdpbiA9IDA7IHByZWZzbG90X2VuZCA9IDc7CisgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KHByZWZzbG90X2JlZ2luICE9IC0xICYmIHByZWZzbG90X2VuZCAhPSAtMSAmJgorICAgICAgICAgICAiTG93ZXJFWFRSQUNUX1ZFQ1RPUl9FTFQ6IHByZWZlcnJlZCBzbG90cyB1bmluaXRpYWxpemVkIik7CisKKyAgICB1bnNpZ25lZCBpbnQgU2h1ZkJ5dGVzWzE2XSA9IHsKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICB9OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgLy8gemVybyBmaWxsIHVwcHBlciBwYXJ0IG9mIHByZWZlcnJlZCBzbG90LCBkb24ndCBjYXJlIGFib3V0IHRoZQorICAgICAgLy8gb3RoZXIgc2xvdHM6CisgICAgICB1bnNpZ25lZCBpbnQgbWFza192YWw7CisgICAgICBpZiAoaSA8PSBwcmVmc2xvdF9lbmQpIHsKKyAgICAgICAgbWFza192YWwgPQorICAgICAgICAgICgoaSA8IHByZWZzbG90X2JlZ2luKQorICAgICAgICAgICA/IDB4ODAKKyAgICAgICAgICAgOiBlbHRfYnl0ZSArIChpIC0gcHJlZnNsb3RfYmVnaW4pKTsKKworICAgICAgICBTaHVmQnl0ZXNbaV0gPSBtYXNrX3ZhbDsKKyAgICAgIH0gZWxzZQorICAgICAgICBTaHVmQnl0ZXNbaV0gPSBTaHVmQnl0ZXNbaSAlIChwcmVmc2xvdF9lbmQgKyAxKV07CisgICAgfQorCisgICAgU0RWYWx1ZSBTaHVmTWFza1s0XTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKFNodWZNYXNrKS9zaXplb2YoU2h1Zk1hc2tbMF0pOyArK2kpIHsKKyAgICAgIHVuc2lnbmVkIGJpZHggPSBpICogNDsKKyAgICAgIHVuc2lnbmVkIGludCBiaXRzID0gKChTaHVmQnl0ZXNbYmlkeF0gPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChTaHVmQnl0ZXNbYmlkeCsxXSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNodWZCeXRlc1tiaWR4KzJdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNodWZCeXRlc1tiaWR4KzNdKTsKKyAgICAgIFNodWZNYXNrW2ldID0gREFHLmdldENvbnN0YW50KGJpdHMsIE1WVDo6aTMyKTsKKyAgICB9CisKKyAgICBTRFZhbHVlIFNodWZNYXNrVmVjID0KKyAgICAgIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgTVZUOjp2NGkzMiwKKyAgICAgICAgICAgICAgICAgICZTaHVmTWFza1swXSwgc2l6ZW9mKFNodWZNYXNrKS9zaXplb2YoU2h1Zk1hc2tbMF0pKTsKKworICAgIHJldHZhbCA9IERBRy5nZXROb2RlKFNQVUlTRDo6VkVDMlBSRUZTTE9ULCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoU1BVSVNEOjpTSFVGQiwgZGwsIE4uZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgTiwgU2h1Zk1hc2tWZWMpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBWYXJpYWJsZSBpbmRleDogUm90YXRlIHRoZSByZXF1ZXN0ZWQgZWxlbWVudCBpbnRvIHNsb3QgMCwgdGhlbiByZXBsaWNhdGUKKyAgICAvLyBzbG90IDAgYWNyb3NzIHRoZSB2ZWN0b3IKKyAgICBFVlQgVmVjVlQgPSBOLmdldFZhbHVlVHlwZSgpOworICAgIGlmICghVmVjVlQuaXNTaW1wbGUoKSB8fCAhVmVjVlQuaXNWZWN0b3IoKSkgeworICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJMb3dlckVYVFJBQ1RfVkVDVE9SX0VMVDogTXVzdCBoYXZlIGEgc2ltcGxlLCAxMjgtYml0IgorICAgICAgICAgICAgICAgICAgICAgICAgInZlY3RvciB0eXBlISIpOworICAgIH0KKworICAgIC8vIE1ha2UgbGlmZSBlYXNpZXIgYnkgbWFraW5nIHN1cmUgdGhlIGluZGV4IGlzIHplcm8tZXh0ZW5kZWQgdG8gaTMyCisgICAgaWYgKEVsdC5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6OmkzMikKKyAgICAgIEVsdCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBNVlQ6OmkzMiwgRWx0KTsKKworICAgIC8vIFNjYWxlIHRoZSBpbmRleCB0byBhIGJpdC9ieXRlIHNoaWZ0IHF1YW50aXR5CisgICAgQVBJbnQgc2NhbGVGYWN0b3IgPQorICAgICAgICAgICAgQVBJbnQoMzIsIHVpbnQ2NF90KDE2IC8gTi5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JOdW1FbGVtZW50cygpKSwgZmFsc2UpOworICAgIHVuc2lnbmVkIHNjYWxlU2hpZnQgPSBzY2FsZUZhY3Rvci5sb2dCYXNlMigpOworICAgIFNEVmFsdWUgdmVjU2hpZnQ7CisKKyAgICBpZiAoc2NhbGVTaGlmdCA+IDApIHsKKyAgICAgIC8vIFNjYWxlIHRoZSBzaGlmdCBmYWN0b3I6CisgICAgICBFbHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIE1WVDo6aTMyLCBFbHQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoc2NhbGVTaGlmdCwgTVZUOjppMzIpKTsKKyAgICB9CisKKyAgICB2ZWNTaGlmdCA9IERBRy5nZXROb2RlKFNQVUlTRDo6U0hMUVVBRF9MX0JZVEVTLCBkbCwgVmVjVlQsIE4sIEVsdCk7CisKKyAgICAvLyBSZXBsaWNhdGUgdGhlIGJ5dGVzIHN0YXJ0aW5nIGF0IGJ5dGUgMCBhY3Jvc3MgdGhlIGVudGlyZSB2ZWN0b3IgKGZvcgorICAgIC8vIGNvbnNpc3RlbmN5IHdpdGggdGhlIG5vdGlvbiBvZiBhIHVuaWZpZWQgcmVnaXN0ZXIgc2V0KQorICAgIFNEVmFsdWUgcmVwbGljYXRlOworCisgICAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiTG93ZXJFWFRSQUNUX1ZFQ1RPUl9FTFQodmFyYWJsZSk6IFVuaGFuZGxlZCB2ZWN0b3IiCisgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOworICAgICAgLypOT1RSRUFDSEVEKi8KKyAgICBjYXNlIE1WVDo6aTg6IHsKKyAgICAgIFNEVmFsdWUgZmFjdG9yID0gREFHLmdldENvbnN0YW50KDB4MDAwMDAwMDAsIE1WVDo6aTMyKTsKKyAgICAgIHJlcGxpY2F0ZSA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgTVZUOjp2NGkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciwgZmFjdG9yLCBmYWN0b3IsIGZhY3Rvcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBNVlQ6OmkxNjogeworICAgICAgU0RWYWx1ZSBmYWN0b3IgPSBEQUcuZ2V0Q29uc3RhbnQoMHgwMDAxMDAwMSwgTVZUOjppMzIpOworICAgICAgcmVwbGljYXRlID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yLCBmYWN0b3IsIGZhY3RvciwgZmFjdG9yKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE1WVDo6aTMyOgorICAgIGNhc2UgTVZUOjpmMzI6IHsKKyAgICAgIFNEVmFsdWUgZmFjdG9yID0gREFHLmdldENvbnN0YW50KDB4MDAwMTAyMDMsIE1WVDo6aTMyKTsKKyAgICAgIHJlcGxpY2F0ZSA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgTVZUOjp2NGkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciwgZmFjdG9yLCBmYWN0b3IsIGZhY3Rvcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBNVlQ6Omk2NDoKKyAgICBjYXNlIE1WVDo6ZjY0OiB7CisgICAgICBTRFZhbHVlIGxvRmFjdG9yID0gREFHLmdldENvbnN0YW50KDB4MDAwMTAyMDMsIE1WVDo6aTMyKTsKKyAgICAgIFNEVmFsdWUgaGlGYWN0b3IgPSBEQUcuZ2V0Q29uc3RhbnQoMHgwNDA1MDYwNywgTVZUOjppMzIpOworICAgICAgcmVwbGljYXRlID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9GYWN0b3IsIGhpRmFjdG9yLCBsb0ZhY3RvciwgaGlGYWN0b3IpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgIHJldHZhbCA9IERBRy5nZXROb2RlKFNQVUlTRDo6VkVDMlBSRUZTTE9ULCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoU1BVSVNEOjpTSFVGQiwgZGwsIFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1NoaWZ0LCB2ZWNTaGlmdCwgcmVwbGljYXRlKSk7CisgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgU0RWYWx1ZSBMb3dlcklOU0VSVF9WRUNUT1JfRUxUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIFNEVmFsdWUgVmVjT3AgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFZhbE9wID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBJZHhPcCA9IE9wLmdldE9wZXJhbmQoMik7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisKKyAgLy8gdXNlIDAgd2hlbiB0aGUgbGFuZSB0byBpbnNlcnQgdG8gaXMgJ3VuZGVmJworICBpbnQ2NF90IElkeD0wOworICBpZiAoSWR4T3AuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpVTkRFRikgeworICAgIENvbnN0YW50U0ROb2RlICpDTiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KElkeE9wKTsKKyAgICBhc3NlcnQoQ04gIT0gMCAmJiAiTG93ZXJJTlNFUlRfVkVDVE9SX0VMVDogSW5kZXggaXMgbm90IGNvbnN0YW50ISIpOworICAgIElkeCA9IChDTi0+Z2V0U0V4dFZhbHVlKCkpOworICB9CisKKyAgRVZUIFB0clZUID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLmdldFBvaW50ZXJUeSgpOworICAvLyBVc2UgJHNwICgkMSkgYmVjYXVzZSBpdCdzIGFsd2F5cyAxNi1ieXRlIGFsaWduZWQgYW5kIGl0J3MgYXZhaWxhYmxlOgorICBTRFZhbHVlIFBvaW50ZXIgPSBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIFB0clZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0UmVnaXN0ZXIoU1BVOjpSMSwgUHRyVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSWR4LCBQdHJWVCkpOworICAvLyB3aWRlbiB0aGUgbWFzayB3aGVuIGRlYWxpbmcgd2l0aCBoYWxmIHZlY3RvcnMKKyAgRVZUIG1hc2tWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKihEQUcuZ2V0Q29udGV4dCgpKSwgVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOC8gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5nZXRTaXplSW5CaXRzKCkpOworICBTRFZhbHVlIFNodWZNYXNrID0gREFHLmdldE5vZGUoU1BVSVNEOjpTSFVGRkxFX01BU0ssIGRsLCBtYXNrVlQsIFBvaW50ZXIpOworCisgIFNEVmFsdWUgcmVzdWx0ID0KKyAgICBEQUcuZ2V0Tm9kZShTUFVJU0Q6OlNIVUZCLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwgVlQsIFZhbE9wKSwKKyAgICAgICAgICAgICAgICBWZWNPcCwKKyAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2NGkzMiwgU2h1Zk1hc2spKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgU0RWYWx1ZSBMb3dlckk4TWF0aChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywgdW5zaWduZWQgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSkKK3sKKyAgU0RWYWx1ZSBOMCA9IE9wLmdldE9wZXJhbmQoMCk7ICAgICAgLy8gRXZlcnl0aGluZyBoYXMgYXQgbGVhc3Qgb25lIG9wZXJhbmQKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBFVlQgU2hpZnRWVCA9IFRMSS5nZXRTaGlmdEFtb3VudFR5KCk7CisKKyAgYXNzZXJ0KE9wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTgpOworICBzd2l0Y2ggKE9wYykgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBpOCBtYXRoIG9wZXJhdG9yIik7CisgICAgLypOT1RSRUFDSEVEKi8KKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkFERDogeworICAgIC8vIDgtYml0IGFkZGl0aW9uOiBQcm9tb3RlIHRoZSBhcmd1bWVudHMgdXAgdG8gMTYtYml0cyBhbmQgdHJ1bmNhdGUKKyAgICAvLyB0aGUgcmVzdWx0OgorICAgIFNEVmFsdWUgTjEgPSBPcC5nZXRPcGVyYW5kKDEpOworICAgIE4wID0gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgZGwsIE1WVDo6aTE2LCBOMCk7CisgICAgTjEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBkbCwgTVZUOjppMTYsIE4xKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIE1WVDo6aTgsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKE9wYywgZGwsIE1WVDo6aTE2LCBOMCwgTjEpKTsKKworICB9CisKKyAgY2FzZSBJU0Q6OlNVQjogeworICAgIC8vIDgtYml0IHN1YnRyYWN0aW9uOiBQcm9tb3RlIHRoZSBhcmd1bWVudHMgdXAgdG8gMTYtYml0cyBhbmQgdHJ1bmNhdGUKKyAgICAvLyB0aGUgcmVzdWx0OgorICAgIFNEVmFsdWUgTjEgPSBPcC5nZXRPcGVyYW5kKDEpOworICAgIE4wID0gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgZGwsIE1WVDo6aTE2LCBOMCk7CisgICAgTjEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBkbCwgTVZUOjppMTYsIE4xKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIE1WVDo6aTgsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKE9wYywgZGwsIE1WVDo6aTE2LCBOMCwgTjEpKTsKKyAgfQorICBjYXNlIElTRDo6Uk9UUjoKKyAgY2FzZSBJU0Q6OlJPVEw6IHsKKyAgICBTRFZhbHVlIE4xID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgICBFVlQgTjFWVCA9IE4xLmdldFZhbHVlVHlwZSgpOworCisgICAgTjAgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwgTVZUOjppMTYsIE4wKTsKKyAgICBpZiAoIU4xVlQuYml0c0VxKFNoaWZ0VlQpKSB7CisgICAgICB1bnNpZ25lZCBOMU9wYyA9IE4xLmdldFZhbHVlVHlwZSgpLmJpdHNMVChTaGlmdFZUKQorICAgICAgICAgICAgICAgICAgICAgICA/IElTRDo6WkVST19FWFRFTkQKKyAgICAgICAgICAgICAgICAgICAgICAgOiBJU0Q6OlRSVU5DQVRFOworICAgICAgTjEgPSBEQUcuZ2V0Tm9kZShOMU9wYywgZGwsIFNoaWZ0VlQsIE4xKTsKKyAgICB9CisKKyAgICAvLyBSZXBsaWNhdGUgbG93ZXIgOC1iaXRzIGludG8gdXBwZXIgODoKKyAgICBTRFZhbHVlIEV4cGFuZEFyZyA9CisgICAgICBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTVZUOjppMTYsIE4wLAorICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBNVlQ6OmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLCBEQUcuZ2V0Q29uc3RhbnQoOCwgTVZUOjppMzIpKSk7CisKKyAgICAvLyBUcnVuY2F0ZSBiYWNrIGRvd24gdG8gaTgKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIE1WVDo6aTgsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKE9wYywgZGwsIE1WVDo6aTE2LCBFeHBhbmRBcmcsIE4xKSk7CisgIH0KKyAgY2FzZSBJU0Q6OlNSTDoKKyAgY2FzZSBJU0Q6OlNITDogeworICAgIFNEVmFsdWUgTjEgPSBPcC5nZXRPcGVyYW5kKDEpOworICAgIEVWVCBOMVZUID0gTjEuZ2V0VmFsdWVUeXBlKCk7CisKKyAgICBOMCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBNVlQ6OmkxNiwgTjApOworICAgIGlmICghTjFWVC5iaXRzRXEoU2hpZnRWVCkpIHsKKyAgICAgIHVuc2lnbmVkIE4xT3BjID0gSVNEOjpaRVJPX0VYVEVORDsKKworICAgICAgaWYgKE4xLmdldFZhbHVlVHlwZSgpLmJpdHNHVChTaGlmdFZUKSkKKyAgICAgICAgTjFPcGMgPSBJU0Q6OlRSVU5DQVRFOworCisgICAgICBOMSA9IERBRy5nZXROb2RlKE4xT3BjLCBkbCwgU2hpZnRWVCwgTjEpOworICAgIH0KKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTVZUOjppOCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoT3BjLCBkbCwgTVZUOjppMTYsIE4wLCBOMSkpOworICB9CisgIGNhc2UgSVNEOjpTUkE6IHsKKyAgICBTRFZhbHVlIE4xID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgICBFVlQgTjFWVCA9IE4xLmdldFZhbHVlVHlwZSgpOworCisgICAgTjAgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBkbCwgTVZUOjppMTYsIE4wKTsKKyAgICBpZiAoIU4xVlQuYml0c0VxKFNoaWZ0VlQpKSB7CisgICAgICB1bnNpZ25lZCBOMU9wYyA9IElTRDo6U0lHTl9FWFRFTkQ7CisKKyAgICAgIGlmIChOMVZULmJpdHNHVChTaGlmdFZUKSkKKyAgICAgICAgTjFPcGMgPSBJU0Q6OlRSVU5DQVRFOworICAgICAgTjEgPSBEQUcuZ2V0Tm9kZShOMU9wYywgZGwsIFNoaWZ0VlQsIE4xKTsKKyAgICB9CisKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIE1WVDo6aTgsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKE9wYywgZGwsIE1WVDo6aTE2LCBOMCwgTjEpKTsKKyAgfQorICBjYXNlIElTRDo6TVVMOiB7CisgICAgU0RWYWx1ZSBOMSA9IE9wLmdldE9wZXJhbmQoMSk7CisKKyAgICBOMCA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkQsIGRsLCBNVlQ6OmkxNiwgTjApOworICAgIE4xID0gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgZGwsIE1WVDo6aTE2LCBOMSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBNVlQ6Omk4LAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBNVlQ6OmkxNiwgTjAsIE4xKSk7CisgICAgYnJlYWs7CisgIH0KKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vISBMb3dlciBieXRlIGltbWVkaWF0ZSBvcGVyYXRpb25zIGZvciB2MTZpOCB2ZWN0b3JzOgorc3RhdGljIFNEVmFsdWUKK0xvd2VyQnl0ZUltbWVkKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIFNEVmFsdWUgQ29uc3RWZWM7CisgIFNEVmFsdWUgQXJnOworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIENvbnN0VmVjID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgQXJnID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgaWYgKENvbnN0VmVjLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpCVUlMRF9WRUNUT1IpIHsKKyAgICBpZiAoQ29uc3RWZWMuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJJVF9DT05WRVJUKSB7CisgICAgICBDb25zdFZlYyA9IENvbnN0VmVjLmdldE9wZXJhbmQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvbnN0VmVjID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgICAgIEFyZyA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgICBpZiAoQ29uc3RWZWMuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJJVF9DT05WRVJUKSB7CisgICAgICAgIENvbnN0VmVjID0gQ29uc3RWZWMuZ2V0T3BlcmFuZCgwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoQ29uc3RWZWMuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJVSUxEX1ZFQ1RPUikgeworICAgIEJ1aWxkVmVjdG9yU0ROb2RlICpCQ04gPSBkeW5fY2FzdDxCdWlsZFZlY3RvclNETm9kZT4oQ29uc3RWZWMuZ2V0Tm9kZSgpKTsKKyAgICBhc3NlcnQoQkNOICE9IDAgJiYgIkV4cGVjdGVkIEJ1aWxkVmVjdG9yU0ROb2RlIGluIFNQVSBMb3dlckJ5dGVJbW1lZCIpOworCisgICAgQVBJbnQgQVBTcGxhdEJpdHMsIEFQU3BsYXRVbmRlZjsKKyAgICB1bnNpZ25lZCBTcGxhdEJpdFNpemU7CisgICAgYm9vbCBIYXNBbnlVbmRlZnM7CisgICAgdW5zaWduZWQgbWluU3BsYXRCaXRzID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisKKyAgICBpZiAoQkNOLT5pc0NvbnN0YW50U3BsYXQoQVBTcGxhdEJpdHMsIEFQU3BsYXRVbmRlZiwgU3BsYXRCaXRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzQW55VW5kZWZzLCBtaW5TcGxhdEJpdHMpCisgICAgICAgICYmIG1pblNwbGF0Qml0cyA8PSBTcGxhdEJpdFNpemUpIHsKKyAgICAgIHVpbnQ2NF90IFNwbGF0Qml0cyA9IEFQU3BsYXRCaXRzLmdldFpFeHRWYWx1ZSgpOworICAgICAgU0RWYWx1ZSB0YyA9IERBRy5nZXRUYXJnZXRDb25zdGFudChTcGxhdEJpdHMgJiAweGZmLCBNVlQ6Omk4KTsKKworICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+IHRjVmVjOworICAgICAgdGNWZWMuYXNzaWduKDE2LCB0Yyk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoT3AuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSwgZGwsIFZULCBBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBWVCwgJnRjVmVjWzBdLCB0Y1ZlYy5zaXplKCkpKTsKKyAgICB9CisgIH0KKworICAvLyBUaGVzZSBvcGVyYXRpb25zIChBTkQsIE9SLCBYT1IpIGFyZSBsZWdhbCwgdGhleSBqdXN0IGNvdWxkbid0IGJlIGN1c3RvbQorICAvLyBsb3dlcmVkLiAgUmV0dXJuIHRoZSBvcGVyYXRpb24sIHJhdGhlciB0aGFuIGEgbnVsbCBTRFZhbHVlLgorICByZXR1cm4gT3A7Cit9CisKKy8vISBDdXN0b20gbG93ZXJpbmcgZm9yIENUUE9QIChjb3VudCBwb3B1bGF0aW9uKQorLyohCisgIEN1c3RvbSBsb3dlcmluZyBjb2RlIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb25lcyBpbiB0aGUgaW5wdXQKKyAgb3BlcmFuZC4gU1BVIGhhcyBzdWNoIGFuIGluc3RydWN0aW9uLCBidXQgaXQgY291bnRzIHRoZSBudW1iZXIgb2YKKyAgb25lcyBwZXIgYnl0ZSwgd2hpY2ggdGhlbiBoYXZlIHRvIGJlIGFjY3VtdWxhdGVkLgorKi8KK3N0YXRpYyBTRFZhbHVlIExvd2VyQ1RQT1AoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCB2ZWNWVCA9IEVWVDo6Z2V0VmVjdG9yVlQoKkRBRy5nZXRDb250ZXh0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULCAoMTI4IC8gVlQuZ2V0U2l6ZUluQml0cygpKSk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoZmFsc2UgJiYgIkludmFsaWQgdmFsdWUgdHlwZSEiKTsKKyAgY2FzZSBNVlQ6Omk4OiB7CisgICAgU0RWYWx1ZSBOID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIEVsdDAgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworCisgICAgU0RWYWx1ZSBQcm9tb3RlID0gREFHLmdldE5vZGUoU1BVSVNEOjpQUkVGU0xPVDJWRUMsIGRsLCB2ZWNWVCwgTiwgTik7CisgICAgU0RWYWx1ZSBDTlRCID0gREFHLmdldE5vZGUoU1BVSVNEOjpDTlRCLCBkbCwgdmVjVlQsIFByb21vdGUpOworCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgTVZUOjppOCwgQ05UQiwgRWx0MCk7CisgIH0KKworICBjYXNlIE1WVDo6aTE2OiB7CisgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZSZWdJbmZvID0gTUYuZ2V0UmVnSW5mbygpOworCisgICAgdW5zaWduZWQgQ05UQl9yZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcigmU1BVOjpSMTZDUmVnQ2xhc3MpOworCisgICAgU0RWYWx1ZSBOID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIEVsdDAgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMTYpOworICAgIFNEVmFsdWUgTWFzazAgPSBEQUcuZ2V0Q29uc3RhbnQoMHgwZiwgTVZUOjppMTYpOworICAgIFNEVmFsdWUgU2hpZnQxID0gREFHLmdldENvbnN0YW50KDgsIE1WVDo6aTMyKTsKKworICAgIFNEVmFsdWUgUHJvbW90ZSA9IERBRy5nZXROb2RlKFNQVUlTRDo6UFJFRlNMT1QyVkVDLCBkbCwgdmVjVlQsIE4sIE4pOworICAgIFNEVmFsdWUgQ05UQiA9IERBRy5nZXROb2RlKFNQVUlTRDo6Q05UQiwgZGwsIHZlY1ZULCBQcm9tb3RlKTsKKworICAgIC8vIENOVEJfcmVzdWx0IGJlY29tZXMgdGhlIGNoYWluIHRvIHdoaWNoIGFsbCBvZiB0aGUgdmlydHVhbCByZWdpc3RlcnMKKyAgICAvLyBDTlRCX3JlZywgU1VNMV9yZWcgYmVjb21lIGFzc29jaWF0ZWQ6CisgICAgU0RWYWx1ZSBDTlRCX3Jlc3VsdCA9CisgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE1WVDo6aTE2LCBDTlRCLCBFbHQwKTsKKworICAgIFNEVmFsdWUgQ05UQl9yZXNjb3B5ID0KKyAgICAgIERBRy5nZXRDb3B5VG9SZWcoQ05UQl9yZXN1bHQsIGRsLCBDTlRCX3JlZywgQ05UQl9yZXN1bHQpOworCisgICAgU0RWYWx1ZSBUbXAxID0gREFHLmdldENvcHlGcm9tUmVnKENOVEJfcmVzY29weSwgZGwsIENOVEJfcmVnLCBNVlQ6OmkxNik7CisKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBNVlQ6OmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBNVlQ6OmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wMSwgU2hpZnQxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wMSksCisgICAgICAgICAgICAgICAgICAgICAgIE1hc2swKTsKKyAgfQorCisgIGNhc2UgTVZUOjppMzI6IHsKKyAgICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8gPSBNRi5nZXRSZWdJbmZvKCk7CisKKyAgICB1bnNpZ25lZCBDTlRCX3JlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKCZTUFU6OlIzMkNSZWdDbGFzcyk7CisgICAgdW5zaWduZWQgU1VNMV9yZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcigmU1BVOjpSMzJDUmVnQ2xhc3MpOworCisgICAgU0RWYWx1ZSBOID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIEVsdDAgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIFNEVmFsdWUgTWFzazAgPSBEQUcuZ2V0Q29uc3RhbnQoMHhmZiwgTVZUOjppMzIpOworICAgIFNEVmFsdWUgU2hpZnQxID0gREFHLmdldENvbnN0YW50KDE2LCBNVlQ6OmkzMik7CisgICAgU0RWYWx1ZSBTaGlmdDIgPSBEQUcuZ2V0Q29uc3RhbnQoOCwgTVZUOjppMzIpOworCisgICAgU0RWYWx1ZSBQcm9tb3RlID0gREFHLmdldE5vZGUoU1BVSVNEOjpQUkVGU0xPVDJWRUMsIGRsLCB2ZWNWVCwgTiwgTik7CisgICAgU0RWYWx1ZSBDTlRCID0gREFHLmdldE5vZGUoU1BVSVNEOjpDTlRCLCBkbCwgdmVjVlQsIFByb21vdGUpOworCisgICAgLy8gQ05UQl9yZXN1bHQgYmVjb21lcyB0aGUgY2hhaW4gdG8gd2hpY2ggYWxsIG9mIHRoZSB2aXJ0dWFsIHJlZ2lzdGVycworICAgIC8vIENOVEJfcmVnLCBTVU0xX3JlZyBiZWNvbWUgYXNzb2NpYXRlZDoKKyAgICBTRFZhbHVlIENOVEJfcmVzdWx0ID0KKyAgICAgIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgTVZUOjppMzIsIENOVEIsIEVsdDApOworCisgICAgU0RWYWx1ZSBDTlRCX3Jlc2NvcHkgPQorICAgICAgREFHLmdldENvcHlUb1JlZyhDTlRCX3Jlc3VsdCwgZGwsIENOVEJfcmVnLCBDTlRCX3Jlc3VsdCk7CisKKyAgICBTRFZhbHVlIENvbXAxID0KKyAgICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29weUZyb21SZWcoQ05UQl9yZXNjb3B5LCBkbCwgQ05UQl9yZWcsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgIFNoaWZ0MSk7CisKKyAgICBTRFZhbHVlIFN1bTEgPQorICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgQ29tcDEsCisgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29weUZyb21SZWcoQ05UQl9yZXNjb3B5LCBkbCwgQ05UQl9yZWcsIE1WVDo6aTMyKSk7CisKKyAgICBTRFZhbHVlIFN1bTFfcmVzY29weSA9CisgICAgICBEQUcuZ2V0Q29weVRvUmVnKENOVEJfcmVzdWx0LCBkbCwgU1VNMV9yZWcsIFN1bTEpOworCisgICAgU0RWYWx1ZSBDb21wMiA9CisgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgREFHLmdldENvcHlGcm9tUmVnKFN1bTFfcmVzY29weSwgZGwsIFNVTTFfcmVnLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICBTaGlmdDIpOworICAgIFNEVmFsdWUgU3VtMiA9CisgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCBDb21wMiwKKyAgICAgICAgICAgICAgICAgIERBRy5nZXRDb3B5RnJvbVJlZyhTdW0xX3Jlc2NvcHksIGRsLCBTVU0xX3JlZywgTVZUOjppMzIpKTsKKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIE1WVDo6aTMyLCBTdW0yLCBNYXNrMCk7CisgIH0KKworICBjYXNlIE1WVDo6aTY0OgorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8hIExvd2VyIElTRDo6RlBfVE9fU0lOVCwgSVNEOjpGUF9UT19VSU5UIGZvciBpMzIKKy8qIQorIGYzMi0+aTMyIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZCwgd2hlcmVhcyBmNjQtPmkzMiBleHBhbmRzIHRvIGEgbGliY2FsbC4KKyBBbGwgY29udmVyc2lvbnMgdG8gaTY0IGFyZSBleHBhbmRlZCB0byBhIGxpYmNhbGwuCisgKi8KK3N0YXRpYyBTRFZhbHVlIExvd2VyRlBfVE9fSU5UKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1BVVGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICBFVlQgT3BWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBTRFZhbHVlIE9wMCA9IE9wLmdldE9wZXJhbmQoMCk7CisgIEVWVCBPcDBWVCA9IE9wMC5nZXRWYWx1ZVR5cGUoKTsKKworICBpZiAoKE9wVlQgPT0gTVZUOjppMzIgJiYgT3AwVlQgPT0gTVZUOjpmNjQpCisgICAgICB8fCBPcFZUID09IE1WVDo6aTY0KSB7CisgICAgLy8gQ29udmVydCBmMzIgLyBmNjQgdG8gaTMyIC8gaTY0IHZpYSBsaWJjYWxsLgorICAgIFJUTElCOjpMaWJjYWxsIExDID0KKyAgICAgICAgICAgIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZQX1RPX1NJTlQpCisgICAgICAgICAgICAgPyBSVExJQjo6Z2V0RlBUT1NJTlQoT3AwVlQsIE9wVlQpCisgICAgICAgICAgICAgOiBSVExJQjo6Z2V0RlBUT1VJTlQoT3AwVlQsIE9wVlQpOworICAgIGFzc2VydChMQyAhPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICYmICJVbmV4cGVjdGQgZnAtdG8taW50IGNvbnZlcnNpb24hIik7CisgICAgU0RWYWx1ZSBEdW1teTsKKyAgICByZXR1cm4gRXhwYW5kTGliQ2FsbChMQywgT3AsIERBRywgZmFsc2UsIER1bW15LCBUTEkpOworICB9CisKKyAgcmV0dXJuIE9wOworfQorCisvLyEgTG93ZXIgSVNEOjpTSU5UX1RPX0ZQLCBJU0Q6OlVJTlRfVE9fRlAgZm9yIGkzMgorLyohCisgaTMyLT5mMzIgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkLCB3aGVyZWFzIGkzMi0+ZjY0IGlzIGV4cGFuZGVkIHRvIGEgbGliY2FsbC4KKyBBbGwgY29udmVyc2lvbnMgZnJvbSBpNjQgYXJlIGV4cGFuZGVkIHRvIGEgbGliY2FsbC4KKyAqLworc3RhdGljIFNEVmFsdWUgTG93ZXJJTlRfVE9fRlAoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUFVUYXJnZXRMb3dlcmluZyAmVExJKSB7CisgIEVWVCBPcFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIFNEVmFsdWUgT3AwID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgRVZUIE9wMFZUID0gT3AwLmdldFZhbHVlVHlwZSgpOworCisgIGlmICgoT3BWVCA9PSBNVlQ6OmY2NCAmJiBPcDBWVCA9PSBNVlQ6OmkzMikKKyAgICAgIHx8IE9wMFZUID09IE1WVDo6aTY0KSB7CisgICAgLy8gQ29udmVydCBpMzIsIGk2NCB0byBmNjQgdmlhIGxpYmNhbGw6CisgICAgUlRMSUI6OkxpYmNhbGwgTEMgPQorICAgICAgICAgICAgKE9wLmdldE9wY29kZSgpID09IElTRDo6U0lOVF9UT19GUCkKKyAgICAgICAgICAgICA/IFJUTElCOjpnZXRTSU5UVE9GUChPcDBWVCwgT3BWVCkKKyAgICAgICAgICAgICA6IFJUTElCOjpnZXRVSU5UVE9GUChPcDBWVCwgT3BWVCk7CisgICAgYXNzZXJ0KExDICE9IFJUTElCOjpVTktOT1dOX0xJQkNBTEwgJiYgIlVuZXhwZWN0ZCBpbnQtdG8tZnAgY29udmVyc2lvbiEiKTsKKyAgICBTRFZhbHVlIER1bW15OworICAgIHJldHVybiBFeHBhbmRMaWJDYWxsKExDLCBPcCwgREFHLCBmYWxzZSwgRHVtbXksIFRMSSk7CisgIH0KKworICByZXR1cm4gT3A7Cit9CisKKy8vISBMb3dlciBJU0Q6OlNFVENDCisvKiEKKyBUaGlzIGhhbmRsZXMgTVZUOjpmNjQgKGRvdWJsZSBmbG9hdGluZyBwb2ludCkgY29uZGl0aW9uIGxvd2VyaW5nCisgKi8KK3N0YXRpYyBTRFZhbHVlIExvd2VyU0VUQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpIHsKKyAgQ29uZENvZGVTRE5vZGUgKkNDID0gZHluX2Nhc3Q8Q29uZENvZGVTRE5vZGU+KE9wLmdldE9wZXJhbmQoMikpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGFzc2VydChDQyAhPSAwICYmICJMb3dlclNFVENDOiBDb25kQ29kZVNETm9kZSBzaG91bGQgbm90IGJlIG51bGwgaGVyZSFcbiIpOworCisgIFNEVmFsdWUgbGhzID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSByaHMgPSBPcC5nZXRPcGVyYW5kKDEpOworICBFVlQgbGhzVlQgPSBsaHMuZ2V0VmFsdWVUeXBlKCk7CisgIGFzc2VydChsaHNWVCA9PSBNVlQ6OmY2NCAmJiAiTG93ZXJTRVRDQzogdHlwZSBvdGhlciB0aGFuIE1WVDo6NjRcbiIpOworCisgIEVWVCBjY1Jlc3VsdFZUID0gVExJLmdldFNldENDUmVzdWx0VHlwZShsaHMuZ2V0VmFsdWVUeXBlKCkpOworICBBUEludCBjY1Jlc3VsdE9uZXMgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKGNjUmVzdWx0VlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgRVZUIEludFZUKE1WVDo6aTY0KTsKKworICAvLyBUYWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0ICh0cnVuY2F0ZSAoc3JhIGFyZywgMzIpKSBpcyBlZmZpY2llbnRseQorICAvLyBzZWxlY3RlZCB0byBhIE5PUDoKKyAgU0RWYWx1ZSBpNjRsaHMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgSW50VlQsIGxocyk7CisgIFNEVmFsdWUgbGhzSGkzMiA9CisgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgSW50VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0bGhzLCBEQUcuZ2V0Q29uc3RhbnQoMzIsIE1WVDo6aTMyKSkpOworICBTRFZhbHVlIGxoc0hpMzJhYnMgPQorICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgbGhzSGkzMiwgREFHLmdldENvbnN0YW50KDB4N2ZmZmZmZmYsIE1WVDo6aTMyKSk7CisgIFNEVmFsdWUgbGhzTG8zMiA9CisgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIE1WVDo6aTMyLCBpNjRsaHMpOworCisgIC8vIFNFVE8gYW5kIFNFVFVPIG9ubHkgdXNlIHRoZSBsaHMgb3BlcmFuZDoKKyAgaWYgKENDLT5nZXQoKSA9PSBJU0Q6OlNFVE8pIHsKKyAgICAvLyBFdmFsdWF0ZXMgdG8gdHJ1ZSBpZiBPcDAgaXMgbm90IFtTUV1OYU4gLSBsb3dlcnMgdG8gdGhlIGludmVyc2Ugb2YKKyAgICAvLyBTRVRVTworICAgIEFQSW50IGNjUmVzdWx0QWxsT25lcyA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoY2NSZXN1bHRWVC5nZXRTaXplSW5CaXRzKCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIGNjUmVzdWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRTZXRDQyhkbCwgY2NSZXN1bHRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxocywgREFHLmdldENvbnN0YW50RlAoMC4wLCBsaHNWVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OlNFVFVPKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KGNjUmVzdWx0QWxsT25lcywgY2NSZXN1bHRWVCkpOworICB9IGVsc2UgaWYgKENDLT5nZXQoKSA9PSBJU0Q6OlNFVFVPKSB7CisgICAgLy8gRXZhbHVhdGVzIHRvIHRydWUgaWYgT3AwIGlzIFtTUV1OYU4KKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBjY1Jlc3VsdFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0U2V0Q0MoZGwsIGNjUmVzdWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaHNIaTMyYWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDB4N2ZmMDAwMDAsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUR0UpLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0U2V0Q0MoZGwsIGNjUmVzdWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaHNMbzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6U0VUR1QpKTsKKyAgfQorCisgIFNEVmFsdWUgaTY0cmhzID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIEludFZULCByaHMpOworICBTRFZhbHVlIHJoc0hpMzIgPQorICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIEludFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NHJocywgREFHLmdldENvbnN0YW50KDMyLCBNVlQ6OmkzMikpKTsKKworICAvLyBJZiBhIHZhbHVlIGlzIG5lZ2F0aXZlLCBzdWJ0cmFjdCBmcm9tIHRoZSBzaWduIG1hZ25pdHVkZSBjb25zdGFudDoKKyAgU0RWYWx1ZSBzaWduTWFnMlRDID0gREFHLmdldENvbnN0YW50KDB4ODAwMDAwMDAwMDAwMDAwMFVMTCwgSW50VlQpOworCisgIC8vIENvbnZlcnQgdGhlIHNpZ24tbWFnbml0dWRlIHJlcHJlc2VudGF0aW9uIGludG8gMidzIGNvbXBsZW1lbnQ6CisgIFNEVmFsdWUgbGhzU2VsZWN0TWFzayA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgY2NSZXN1bHRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhzSGkzMiwgREFHLmdldENvbnN0YW50KDMxLCBNVlQ6OmkzMikpOworICBTRFZhbHVlIGxoc1NpZ25NYWcyVEMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIEludFZULCBzaWduTWFnMlRDLCBpNjRsaHMpOworICBTRFZhbHVlIGxoc1NlbGVjdCA9CisgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBJbnRWVCwKKyAgICAgICAgICAgICAgICAgICAgICBsaHNTZWxlY3RNYXNrLCBsaHNTaWduTWFnMlRDLCBpNjRsaHMpOworCisgIFNEVmFsdWUgcmhzU2VsZWN0TWFzayA9IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgY2NSZXN1bHRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzSGkzMiwgREFHLmdldENvbnN0YW50KDMxLCBNVlQ6OmkzMikpOworICBTRFZhbHVlIHJoc1NpZ25NYWcyVEMgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIEludFZULCBzaWduTWFnMlRDLCBpNjRyaHMpOworICBTRFZhbHVlIHJoc1NlbGVjdCA9CisgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTRUxFQ1QsIGRsLCBJbnRWVCwKKyAgICAgICAgICAgICAgICAgICAgICByaHNTZWxlY3RNYXNrLCByaHNTaWduTWFnMlRDLCBpNjRyaHMpOworCisgIHVuc2lnbmVkIGNvbXBhcmVPcDsKKworICBzd2l0Y2ggKENDLT5nZXQoKSkgeworICBjYXNlIElTRDo6U0VUT0VROgorICBjYXNlIElTRDo6U0VUVUVROgorICAgIGNvbXBhcmVPcCA9IElTRDo6U0VURVE7IGJyZWFrOworICBjYXNlIElTRDo6U0VUT0dUOgorICBjYXNlIElTRDo6U0VUVUdUOgorICAgIGNvbXBhcmVPcCA9IElTRDo6U0VUR1Q7IGJyZWFrOworICBjYXNlIElTRDo6U0VUT0dFOgorICBjYXNlIElTRDo6U0VUVUdFOgorICAgIGNvbXBhcmVPcCA9IElTRDo6U0VUR0U7IGJyZWFrOworICBjYXNlIElTRDo6U0VUT0xUOgorICBjYXNlIElTRDo6U0VUVUxUOgorICAgIGNvbXBhcmVPcCA9IElTRDo6U0VUTFQ7IGJyZWFrOworICBjYXNlIElTRDo6U0VUT0xFOgorICBjYXNlIElTRDo6U0VUVUxFOgorICAgIGNvbXBhcmVPcCA9IElTRDo6U0VUTEU7IGJyZWFrOworICBjYXNlIElTRDo6U0VUVU5FOgorICBjYXNlIElTRDo6U0VUT05FOgorICAgIGNvbXBhcmVPcCA9IElTRDo6U0VUTkU7IGJyZWFrOworICBkZWZhdWx0OgorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiQ2VsbFNQVSBJU2VsIFNlbGVjdDogdW5pbXBsZW1lbnRlZCBmNjQgY29uZGl0aW9uIik7CisgIH0KKworICBTRFZhbHVlIHJlc3VsdCA9CisgICAgICAgICAgREFHLmdldFNldENDKGRsLCBjY1Jlc3VsdFZULCBsaHNTZWxlY3QsIHJoc1NlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgKElTRDo6Q29uZENvZGUpIGNvbXBhcmVPcCk7CisKKyAgaWYgKChDQy0+Z2V0KCkgJiAweDgpID09IDApIHsKKyAgICAvLyBPcmRlcmVkIGNvbXBhcmlzb246CisgICAgU0RWYWx1ZSBsaHNOYU4gPSBEQUcuZ2V0U2V0Q0MoZGwsIGNjUmVzdWx0VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhzLCBEQUcuZ2V0Q29uc3RhbnRGUCgwLjAsIE1WVDo6ZjY0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OlNFVE8pOworICAgIFNEVmFsdWUgcmhzTmFOID0gREFHLmdldFNldENDKGRsLCBjY1Jlc3VsdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJocywgREFHLmdldENvbnN0YW50RlAoMC4wLCBNVlQ6OmY2NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRPKTsKKyAgICBTRFZhbHVlIG9yZGVyZWQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIGNjUmVzdWx0VlQsIGxoc05hTiwgcmhzTmFOKTsKKworICAgIHJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgY2NSZXN1bHRWVCwgb3JkZXJlZCwgcmVzdWx0KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vISBMb3dlciBJU0Q6OlNFTEVDVF9DQworLyohCisgIElTRDo6U0VMRUNUX0NDIGNhbiAoZ2VuZXJhbGx5KSBiZSBpbXBsZW1lbnRlZCBkaXJlY3RseSBvbiB0aGUgU1BVIHVzaW5nIHRoZQorICBTRUxCIGluc3RydWN0aW9uLgorCisgIFxub3RlIE5lZWQgdG8gcmV2aXNpdCB0aGlzIGluIHRoZSBmdXR1cmU6IGlmIHRoZSBjb2RlIHBhdGggdGhyb3VnaCB0aGUgdHJ1ZQorICBhbmQgZmFsc2UgdmFsdWUgY29tcHV0YXRpb25zIGlzIGxvbmdlciB0aGFuIHRoZSBsYXRlbmN5IG9mIGEgYnJhbmNoICg2CisgIGN5Y2xlcyksIHRoZW4gaXQgd291bGQgYmUgbW9yZSBhZHZhbnRhZ2VvdXMgdG8gYnJhbmNoIGFuZCBpbnNlcnQgYSBuZXcgYmFzaWMKKyAgYmxvY2sgYW5kIGJyYW5jaCBvbiB0aGUgY29uZGl0aW9uLiBIb3dldmVyLCB0aGlzIGNvZGUgZG9lcyBub3QgbWFrZSB0aGF0CisgIGFzc3VtcHRpb24sIGdpdmVuIHRoZSBzaW1wbGlzaXRjIHVzZXMgc28gZmFyLgorICovCisKK3N0YXRpYyBTRFZhbHVlIExvd2VyU0VMRUNUX0NDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgU0RWYWx1ZSBsaHMgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIHJocyA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgdHJ1ZXZhbCA9IE9wLmdldE9wZXJhbmQoMik7CisgIFNEVmFsdWUgZmFsc2V2YWwgPSBPcC5nZXRPcGVyYW5kKDMpOworICBTRFZhbHVlIGNvbmRpdGlvbiA9IE9wLmdldE9wZXJhbmQoNCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBOT1RFOiBTRUxCJ3MgYXJndW1lbnRzOiAkckEsICRyQiwgJG1hc2sKKyAgLy8KKyAgLy8gU0VMQiBzZWxlY3RzIGJpdHMgZnJvbSAkckEgd2hlcmUgYml0cyBpbiAkbWFzayBhcmUgMCwgYml0cyBmcm9tICRyQgorICAvLyB3aGVyZSBiaXRzIGluICRtYXNrIGFyZSAxLiBDQ29uZCB3aWxsIGJlIGludmVydGVkLCBoYXZpbmcgMXMgd2hlcmUgdGhlCisgIC8vIGNvbmRpdGlvbiB3YXMgdHJ1ZSBhbmQgMHMgd2hlcmUgdGhlIGNvbmRpdGlvbiB3YXMgZmFsc2UuIEhlbmNlLCB0aGUKKyAgLy8gYXJndW1lbnRzIHRvIFNFTEIgZ2V0IHJldmVyc2VkLgorCisgIC8vIE5vdGU6IFJlYWxseSBzaG91bGQgYmUgSVNEOjpTRUxFQ1QgaW5zdGVhZCBvZiBTUFVJU0Q6OlNFTEIsIGJ1dCBMTFZNJ3MKKyAgLy8gbGVnYWxpemVyIGluc2lzdHMgb24gY29tYmluaW5nIFNFVENDL1NFTEVDVCBpbnRvIFNFTEVDVF9DQywgc28gd2UgZW5kIHVwCisgIC8vIHdpdGggYW5vdGhlciAiY2Fubm90IHNlbGVjdCBzZWxlY3RfY2MiIGFzc2VydDoKKworICBTRFZhbHVlIGNvbXBhcmUgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNFVENDLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExJLmdldFNldENDUmVzdWx0VHlwZShPcC5nZXRWYWx1ZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxocywgcmhzLCBjb25kaXRpb24pOworICByZXR1cm4gREFHLmdldE5vZGUoU1BVSVNEOjpTRUxCLCBkbCwgVlQsIGZhbHNldmFsLCB0cnVldmFsLCBjb21wYXJlKTsKK30KKworLy8hIEN1c3RvbSBsb3dlciBJU0Q6OlRSVU5DQVRFCitzdGF0aWMgU0RWYWx1ZSBMb3dlclRSVU5DQVRFKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKQoreworICAvLyBUeXBlIHRvIHRydW5jYXRlIHRvCisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBNVlQgc2ltcGxlVlQgPSBWVC5nZXRTaW1wbGVWVCgpOworICBFVlQgVmVjVlQgPSBFVlQ6OmdldFZlY3RvclZUKCpEQUcuZ2V0Q29udGV4dCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVCwgKDEyOCAvIFZULmdldFNpemVJbkJpdHMoKSkpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgLy8gVHlwZSB0byB0cnVuY2F0ZSBmcm9tCisgIFNEVmFsdWUgT3AwID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgRVZUIE9wMFZUID0gT3AwLmdldFZhbHVlVHlwZSgpOworCisgIGlmIChPcDBWVC5nZXRTaW1wbGVWVCgpID09IE1WVDo6aTEyOCAmJiBzaW1wbGVWVCA9PSBNVlQ6Omk2NCkgeworICAgIC8vIENyZWF0ZSBzaHVmZmxlIG1hc2ssIGxlYXN0IHNpZ25pZmljYW50IGRvdWJsZXdvcmQgb2YgcXVhZHdvcmQKKyAgICB1bnNpZ25lZCBtYXNrSGlnaCA9IDB4MDgwOTBhMGI7CisgICAgdW5zaWduZWQgbWFza0xvdyA9IDB4MGMwZDBlMGY7CisgICAgLy8gVXNlIGEgc2h1ZmZsZSB0byBwZXJmb3JtIHRoZSB0cnVuY2F0aW9uCisgICAgU0RWYWx1ZSBzaHVmTWFzayA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgTVZUOjp2NGkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KG1hc2tIaWdoLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChtYXNrTG93LCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChtYXNrSGlnaCwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQobWFza0xvdywgTVZUOjppMzIpKTsKKworICAgIFNEVmFsdWUgdHJ1bmNTaHVmZmxlID0gREFHLmdldE5vZGUoU1BVSVNEOjpTSFVGQiwgZGwsIFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AwLCBPcDAsIHNodWZNYXNrKTsKKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShTUFVJU0Q6OlZFQzJQUkVGU0xPVCwgZGwsIFZULCB0cnVuY1NodWZmbGUpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsgICAgICAgICAgICAgLy8gTGVhdmUgdGhlIHRydW5jYXRlIHVubW9sZXN0ZWQKK30KKworLyohCisgKiBFbWl0IHRoZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IgaTY0L2kzMiAtPiBpMTI4IHNpZ24gZXh0ZW5kLiBUaGUgYmFzaWMKKyAqIGFsZ29yaXRobSBpcyB0byBkdXBsaWNhdGUgdGhlIHNpZ24gYml0IHVzaW5nIHJvdG1haSB0byBnZW5lcmF0ZSBhdAorICogbGVhc3Qgb25lIGJ5dGUgZnVsbCBvZiBzaWduIGJpdHMuIFRoZW4gcHJvcGFnYXRlIHRoZSAic2lnbi1ieXRlIiBpbnRvCisgKiB0aGUgbGVmdG1vc3Qgd29yZHMgYW5kIHRoZSBpNjQvaTMyIGludG8gdGhlIHJpZ2h0bW9zdCB3b3JkcyB1c2luZyBzaHVmYi4KKyAqCisgKiBAcGFyYW0gT3AgVGhlIHNleHQgb3BlcmFuZAorICogQHBhcmFtIERBRyBUaGUgY3VycmVudCBEQUcKKyAqIEByZXR1cm4gVGhlIFNEVmFsdWUgd2l0aCB0aGUgZW50aXJlIGluc3RydWN0aW9uIHNlcXVlbmNlCisgKi8KK3N0YXRpYyBTRFZhbHVlIExvd2VyU0lHTl9FWFRFTkQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpCit7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBUeXBlIHRvIGV4dGVuZCB0bworICBNVlQgT3BWVCA9IE9wLmdldFZhbHVlVHlwZSgpLmdldFNpbXBsZVZUKCk7CisKKyAgLy8gVHlwZSB0byBleHRlbmQgZnJvbQorICBTRFZhbHVlIE9wMCA9IE9wLmdldE9wZXJhbmQoMCk7CisgIE1WVCBPcDBWVCA9IE9wMC5nZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpOworCisgIC8vIFRoZSB0eXBlIHRvIGV4dGVuZCB0byBuZWVkcyB0byBiZSBhIGkxMjggYW5kCisgIC8vIHRoZSB0eXBlIHRvIGV4dGVuZCBmcm9tIG5lZWRzIHRvIGJlIGk2NCBvciBpMzIuCisgIGFzc2VydCgoT3BWVCA9PSBNVlQ6OmkxMjggJiYgKE9wMFZUID09IE1WVDo6aTY0IHx8IE9wMFZUID09IE1WVDo6aTMyKSkgJiYKKyAgICAgICAgICAiTG93ZXJTSUdOX0VYVEVORDogaW5wdXQgYW5kL29yIG91dHB1dCBvcGVyYW5kIGhhdmUgd3Jvbmcgc2l6ZSIpOworCisgIC8vIENyZWF0ZSBzaHVmZmxlIG1hc2sKKyAgdW5zaWduZWQgbWFzazEgPSAweDEwMTAxMDEwOyAvLyBieXRlIDAgLSAzIGFuZCA0IC0gNworICB1bnNpZ25lZCBtYXNrMiA9IE9wMFZUID09IE1WVDo6aTY0ID8gMHgwMDAxMDIwMyA6IDB4MTAxMDEwMTA7IC8vIGJ5dGUgIDggLSAxMQorICB1bnNpZ25lZCBtYXNrMyA9IE9wMFZUID09IE1WVDo6aTY0ID8gMHgwNDA1MDYwNyA6IDB4MDAwMTAyMDM7IC8vIGJ5dGUgMTIgLSAxNQorICBTRFZhbHVlIHNodWZNYXNrID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KG1hc2sxLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQobWFzazEsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChtYXNrMiwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KG1hc2szLCBNVlQ6OmkzMikpOworCisgIC8vIFdvcmQgd2lzZSBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IHRvIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSBieXRlCisgIC8vIHRoYXQgY29udGFpbnMgc2lnbiBiaXRzLgorICBNVlQgbXZ0ID0gT3AwVlQgPT0gTVZUOjppNjQgPyBNVlQ6OnYyaTY0IDogTVZUOjp2NGkzMjsKKyAgU0RWYWx1ZSBzcmFWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSQSwKKyAgICAgICAgICAgICAgICAgZGwsCisgICAgICAgICAgICAgICAgIG12dCwKKyAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoU1BVSVNEOjpQUkVGU0xPVDJWRUMsIGRsLCBtdnQsIE9wMCwgT3AwKSwKKyAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDMxLCBNVlQ6OmkzMikpOworCisgIC8vIFNodWZmbGUgYnl0ZXMgLSBDb3B5IHRoZSBzaWduIGJpdHMgaW50byB0aGUgdXBwZXIgNjQgYml0cworICAvLyBhbmQgdGhlIGlucHV0IHZhbHVlIGludG8gdGhlIGxvd2VyIDY0IGJpdHMuCisgIFNEVmFsdWUgZXh0U2h1ZmZsZSA9IERBRy5nZXROb2RlKFNQVUlTRDo6U0hVRkIsIGRsLCBtdnQsCisgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLCBNVlQ6OmkxMjgsIE9wMCksIHNyYVZhbCwgc2h1Zk1hc2spOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjppMTI4LCBleHRTaHVmZmxlKTsKK30KKworLy8hIEN1c3RvbSAodGFyZ2V0LXNwZWNpZmljKSBsb3dlcmluZyBlbnRyeSBwb2ludAorLyohCisgIFRoaXMgaXMgd2hlcmUgTExWTSdzIERBRyBzZWxlY3Rpb24gcHJvY2VzcyBjYWxscyB0byBkbyB0YXJnZXQtc3BlY2lmaWMKKyAgbG93ZXJpbmcgb2Ygbm9kZXMuCisgKi8KK1NEVmFsdWUKK1NQVVRhcmdldExvd2VyaW5nOjpMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QKK3sKKyAgdW5zaWduZWQgT3BjID0gKHVuc2lnbmVkKSBPcC5nZXRPcGNvZGUoKTsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisKKyAgc3dpdGNoIChPcGMpIHsKKyAgZGVmYXVsdDogeworI2lmbmRlZiBOREVCVUcKKyAgICBlcnJzKCkgPDwgIlNQVVRhcmdldExvd2VyaW5nOjpMb3dlck9wZXJhdGlvbigpOiBuZWVkIHRvIGxvd2VyIHRoaXMhXG4iOworICAgIGVycnMoKSA8PCAiT3AuZ2V0T3Bjb2RlKCkgPSAiIDw8IE9wYyA8PCAiXG4iOworICAgIGVycnMoKSA8PCAiKk9wLmdldE5vZGUoKTpcbiI7CisgICAgT3AuZ2V0Tm9kZSgpLT5kdW1wKCk7CisjZW5kaWYKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9CisgIGNhc2UgSVNEOjpMT0FEOgorICBjYXNlIElTRDo6RVhUTE9BRDoKKyAgY2FzZSBJU0Q6OlNFWFRMT0FEOgorICBjYXNlIElTRDo6WkVYVExPQUQ6CisgICAgcmV0dXJuIExvd2VyTE9BRChPcCwgREFHLCBTUFVUTS5nZXRTdWJ0YXJnZXRJbXBsKCkpOworICBjYXNlIElTRDo6U1RPUkU6CisgICAgcmV0dXJuIExvd2VyU1RPUkUoT3AsIERBRywgU1BVVE0uZ2V0U3VidGFyZ2V0SW1wbCgpKTsKKyAgY2FzZSBJU0Q6OkNvbnN0YW50UG9vbDoKKyAgICByZXR1cm4gTG93ZXJDb25zdGFudFBvb2woT3AsIERBRywgU1BVVE0uZ2V0U3VidGFyZ2V0SW1wbCgpKTsKKyAgY2FzZSBJU0Q6Okdsb2JhbEFkZHJlc3M6CisgICAgcmV0dXJuIExvd2VyR2xvYmFsQWRkcmVzcyhPcCwgREFHLCBTUFVUTS5nZXRTdWJ0YXJnZXRJbXBsKCkpOworICBjYXNlIElTRDo6SnVtcFRhYmxlOgorICAgIHJldHVybiBMb3dlckp1bXBUYWJsZShPcCwgREFHLCBTUFVUTS5nZXRTdWJ0YXJnZXRJbXBsKCkpOworICBjYXNlIElTRDo6Q29uc3RhbnRGUDoKKyAgICByZXR1cm4gTG93ZXJDb25zdGFudEZQKE9wLCBEQUcpOworCisgIC8vIGk4LCBpNjQgbWF0aCBvcHM6CisgIGNhc2UgSVNEOjpBREQ6CisgIGNhc2UgSVNEOjpTVUI6CisgIGNhc2UgSVNEOjpST1RSOgorICBjYXNlIElTRDo6Uk9UTDoKKyAgY2FzZSBJU0Q6OlNSTDoKKyAgY2FzZSBJU0Q6OlNITDoKKyAgY2FzZSBJU0Q6OlNSQTogeworICAgIGlmIChWVCA9PSBNVlQ6Omk4KQorICAgICAgcmV0dXJuIExvd2VySThNYXRoKE9wLCBEQUcsIE9wYywgKnRoaXMpOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBJU0Q6OkZQX1RPX1NJTlQ6CisgIGNhc2UgSVNEOjpGUF9UT19VSU5UOgorICAgIHJldHVybiBMb3dlckZQX1RPX0lOVChPcCwgREFHLCAqdGhpcyk7CisKKyAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6CisgIGNhc2UgSVNEOjpVSU5UX1RPX0ZQOgorICAgIHJldHVybiBMb3dlcklOVF9UT19GUChPcCwgREFHLCAqdGhpcyk7CisKKyAgLy8gVmVjdG9yLXJlbGF0ZWQgbG93ZXJpbmcuCisgIGNhc2UgSVNEOjpCVUlMRF9WRUNUT1I6CisgICAgcmV0dXJuIExvd2VyQlVJTERfVkVDVE9SKE9wLCBEQUcpOworICBjYXNlIElTRDo6U0NBTEFSX1RPX1ZFQ1RPUjoKKyAgICByZXR1cm4gTG93ZXJTQ0FMQVJfVE9fVkVDVE9SKE9wLCBEQUcpOworICBjYXNlIElTRDo6VkVDVE9SX1NIVUZGTEU6CisgICAgcmV0dXJuIExvd2VyVkVDVE9SX1NIVUZGTEUoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQ6CisgICAgcmV0dXJuIExvd2VyRVhUUkFDVF9WRUNUT1JfRUxUKE9wLCBEQUcpOworICBjYXNlIElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQ6CisgICAgcmV0dXJuIExvd2VySU5TRVJUX1ZFQ1RPUl9FTFQoT3AsIERBRyk7CisKKyAgLy8gTG9vayBmb3IgQU5EQkksIE9SQkkgYW5kIFhPUkJJIG9wcG9ydHVuaXRpZXMgYW5kIGxvd2VyIGFwcHJvcHJpYXRlbHk6CisgIGNhc2UgSVNEOjpBTkQ6CisgIGNhc2UgSVNEOjpPUjoKKyAgY2FzZSBJU0Q6OlhPUjoKKyAgICByZXR1cm4gTG93ZXJCeXRlSW1tZWQoT3AsIERBRyk7CisKKyAgLy8gVmVjdG9yIGFuZCBpOCBtdWx0aXBseToKKyAgY2FzZSBJU0Q6Ok1VTDoKKyAgICBpZiAoVlQgPT0gTVZUOjppOCkKKyAgICAgIHJldHVybiBMb3dlckk4TWF0aChPcCwgREFHLCBPcGMsICp0aGlzKTsKKworICBjYXNlIElTRDo6Q1RQT1A6CisgICAgcmV0dXJuIExvd2VyQ1RQT1AoT3AsIERBRyk7CisKKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzoKKyAgICByZXR1cm4gTG93ZXJTRUxFQ1RfQ0MoT3AsIERBRywgKnRoaXMpOworCisgIGNhc2UgSVNEOjpTRVRDQzoKKyAgICByZXR1cm4gTG93ZXJTRVRDQyhPcCwgREFHLCAqdGhpcyk7CisKKyAgY2FzZSBJU0Q6OlRSVU5DQVRFOgorICAgIHJldHVybiBMb3dlclRSVU5DQVRFKE9wLCBEQUcpOworCisgIGNhc2UgSVNEOjpTSUdOX0VYVEVORDoKKyAgICByZXR1cm4gTG93ZXJTSUdOX0VYVEVORChPcCwgREFHKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK3ZvaWQgU1BVVGFyZ2V0TG93ZXJpbmc6OlJlcGxhY2VOb2RlUmVzdWx0cyhTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+JlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0Cit7CisjaWYgMAorICB1bnNpZ25lZCBPcGMgPSAodW5zaWduZWQpIE4tPmdldE9wY29kZSgpOworICBFVlQgT3BWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKworICBzd2l0Y2ggKE9wYykgeworICBkZWZhdWx0OiB7CisgICAgZXJycygpIDw8ICJTUFVUYXJnZXRMb3dlcmluZzo6UmVwbGFjZU5vZGVSZXN1bHRzKCk6IG5lZWQgdG8gZml4IHRoaXMhXG4iOworICAgIGVycnMoKSA8PCAiT3AuZ2V0T3Bjb2RlKCkgPSAiIDw8IE9wYyA8PCAiXG4iOworICAgIGVycnMoKSA8PCAiKk9wLmdldE5vZGUoKTpcbiI7CisgICAgTi0+ZHVtcCgpOworICAgIGFib3J0KCk7CisgICAgLypOT1RSRUFDSEVEKi8KKyAgfQorICB9CisjZW5kaWYKKworICAvKiBPdGhlcndpc2UsIHJldHVybiB1bmNoYW5nZWQgKi8KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhcmdldCBPcHRpbWl6YXRpb24gSG9va3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NEVmFsdWUKK1NQVVRhcmdldExvd2VyaW5nOjpQZXJmb3JtREFHQ29tYmluZShTRE5vZGUgKk4sIERBR0NvbWJpbmVySW5mbyAmRENJKSBjb25zdAoreworI2lmIDAKKyAgVGFyZ2V0TWFjaGluZSAmVE0gPSBnZXRUYXJnZXRNYWNoaW5lKCk7CisjZW5kaWYKKyAgY29uc3QgU1BVU3VidGFyZ2V0ICpTVCA9IFNQVVRNLmdldFN1YnRhcmdldEltcGwoKTsKKyAgU2VsZWN0aW9uREFHICZEQUcgPSBEQ0kuREFHOworICBTRFZhbHVlIE9wMCA9IE4tPmdldE9wZXJhbmQoMCk7ICAgICAgIC8vIGV2ZXJ5dGhpbmcgaGFzIGF0IGxlYXN0IG9uZSBvcGVyYW5kCisgIEVWVCBOb2RlVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7ICAgICAgLy8gVGhlIG5vZGUncyB2YWx1ZSB0eXBlCisgIEVWVCBPcDBWVCA9IE9wMC5nZXRWYWx1ZVR5cGUoKTsgICAgICAgLy8gVGhlIGZpcnN0IG9wZXJhbmQncyByZXN1bHQKKyAgU0RWYWx1ZSBSZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsbHksIGVtcHR5IHJlc3VsdAorICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6OkFERDogeworICAgIFNEVmFsdWUgT3AxID0gTi0+Z2V0T3BlcmFuZCgxKTsKKworICAgIGlmIChPcDAuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpJbmRpcmVjdEFkZHIKKyAgICAgICAgfHwgT3AxLmdldE9wY29kZSgpID09IFNQVUlTRDo6SW5kaXJlY3RBZGRyKSB7CisgICAgICAvLyBOb3JtYWxpemUgdGhlIG9wZXJhbmRzIHRvIHJlZHVjZSByZXBlYXRlZCBjb2RlCisgICAgICBTRFZhbHVlIEluZGlyZWN0QXJnID0gT3AwLCBBZGRBcmcgPSBPcDE7CisKKyAgICAgIGlmIChPcDEuZ2V0T3Bjb2RlKCkgPT0gU1BVSVNEOjpJbmRpcmVjdEFkZHIpIHsKKyAgICAgICAgSW5kaXJlY3RBcmcgPSBPcDE7CisgICAgICAgIEFkZEFyZyA9IE9wMDsKKyAgICAgIH0KKworICAgICAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oQWRkQXJnKSkgeworICAgICAgICBDb25zdGFudFNETm9kZSAqQ04wID0gY2FzdDxDb25zdGFudFNETm9kZSA+IChBZGRBcmcpOworICAgICAgICBTRFZhbHVlIEluZE9wMSA9IEluZGlyZWN0QXJnLmdldE9wZXJhbmQoMSk7CisKKyAgICAgICAgaWYgKENOMC0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICAgIC8vIChhZGQgKFNQVWluZGlyZWN0IDxhcmc+LCA8YXJnPiksIDApIC0+CisgICAgICAgICAgLy8gKFNQVWluZGlyZWN0IDxhcmc+LCA8YXJnPikKKworI2lmICFkZWZpbmVkKE5ERUJVRykKKyAgICAgICAgICBpZiAoRGVidWdGbGFnICYmIGlzQ3VycmVudERlYnVnVHlwZShERUJVR19UWVBFKSkgeworICAgICAgICAgICAgZXJycygpIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgIlJlcGxhY2U6IChhZGQgKFNQVWluZGlyZWN0IDxhcmc+LCA8YXJnPiksIDApXG4iCisgICAgICAgICAgICAgICAgIDw8ICJXaXRoOiAgICAoU1BVaW5kaXJlY3QgPGFyZz4sIDxhcmc+KVxuIjsKKyAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgIHJldHVybiBJbmRpcmVjdEFyZzsKKyAgICAgICAgfSBlbHNlIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KEluZE9wMSkpIHsKKyAgICAgICAgICAvLyAoYWRkIChTUFVpbmRpcmVjdCA8YXJnPiwgPGNvbnN0PiksIDxjb25zdD4pIC0+CisgICAgICAgICAgLy8gKFNQVWluZGlyZWN0IDxhcmc+LCA8Y29uc3QgKyBjb25zdD4pCisgICAgICAgICAgQ29uc3RhbnRTRE5vZGUgKkNOMSA9IGNhc3Q8Q29uc3RhbnRTRE5vZGUgPiAoSW5kT3AxKTsKKyAgICAgICAgICBpbnQ2NF90IGNvbWJpbmVkQ29uc3QgPSBDTjAtPmdldFNFeHRWYWx1ZSgpICsgQ04xLT5nZXRTRXh0VmFsdWUoKTsKKyAgICAgICAgICBTRFZhbHVlIGNvbWJpbmVkVmFsdWUgPSBEQUcuZ2V0Q29uc3RhbnQoY29tYmluZWRDb25zdCwgT3AwVlQpOworCisjaWYgIWRlZmluZWQoTkRFQlVHKQorICAgICAgICAgIGlmIChEZWJ1Z0ZsYWcgJiYgaXNDdXJyZW50RGVidWdUeXBlKERFQlVHX1RZUEUpKSB7CisgICAgICAgICAgICBlcnJzKCkgPDwgIlxuIgorICAgICAgICAgICAgICAgICA8PCAiUmVwbGFjZTogKGFkZCAoU1BVaW5kaXJlY3QgPGFyZz4sICIgPDwgQ04xLT5nZXRTRXh0VmFsdWUoKQorICAgICAgICAgICAgICAgICA8PCAiKSwgIiA8PCBDTjAtPmdldFNFeHRWYWx1ZSgpIDw8ICIpXG4iCisgICAgICAgICAgICAgICAgIDw8ICJXaXRoOiAgICAoU1BVaW5kaXJlY3QgPGFyZz4sICIKKyAgICAgICAgICAgICAgICAgPDwgY29tYmluZWRDb25zdCA8PCAiKVxuIjsKKyAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIE9wMFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpcmVjdEFyZywgY29tYmluZWRWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOgorICBjYXNlIElTRDo6WkVST19FWFRFTkQ6CisgIGNhc2UgSVNEOjpBTllfRVhURU5EOiB7CisgICAgaWYgKE9wMC5nZXRPcGNvZGUoKSA9PSBTUFVJU0Q6OlZFQzJQUkVGU0xPVCAmJiBOb2RlVlQgPT0gT3AwVlQpIHsKKyAgICAgIC8vIChhbnlfZXh0ZW5kIChTUFVleHRyYWN0X2VsdDAgPGFyZz4pKSAtPgorICAgICAgLy8gKFNQVWV4dHJhY3RfZWx0MCA8YXJnPikKKyAgICAgIC8vIFR5cGVzIG11c3QgbWF0Y2gsIGhvd2V2ZXIuLi4KKyNpZiAhZGVmaW5lZChOREVCVUcpCisgICAgICBpZiAoRGVidWdGbGFnICYmIGlzQ3VycmVudERlYnVnVHlwZShERUJVR19UWVBFKSkgeworICAgICAgICBlcnJzKCkgPDwgIlxuUmVwbGFjZTogIjsKKyAgICAgICAgTi0+ZHVtcCgmREFHKTsKKyAgICAgICAgZXJycygpIDw8ICJcbldpdGg6ICAgICI7CisgICAgICAgIE9wMC5nZXROb2RlKCktPmR1bXAoJkRBRyk7CisgICAgICAgIGVycnMoKSA8PCAiXG4iOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHJldHVybiBPcDA7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgU1BVSVNEOjpJbmRpcmVjdEFkZHI6IHsKKyAgICBpZiAoIVNULT51c2luZ0xhcmdlTWVtKCkgJiYgT3AwLmdldE9wY29kZSgpID09IFNQVUlTRDo6QUZvcm1BZGRyKSB7CisgICAgICBDb25zdGFudFNETm9kZSAqQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICBpZiAoQ04gIT0gMCAmJiBDTi0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICAvLyAoU1BVaW5kaXJlY3QgKFNQVWFmb3JtIDxhZGRyPiwgMCksIDApIC0+CisgICAgICAgIC8vIChTUFVhZm9ybSA8YWRkcj4sIDApCisKKyAgICAgICAgREVCVUcoZXJycygpIDw8ICJSZXBsYWNlOiAiKTsKKyAgICAgICAgREVCVUcoTi0+ZHVtcCgmREFHKSk7CisgICAgICAgIERFQlVHKGVycnMoKSA8PCAiXG5XaXRoOiAgICAiKTsKKyAgICAgICAgREVCVUcoT3AwLmdldE5vZGUoKS0+ZHVtcCgmREFHKSk7CisgICAgICAgIERFQlVHKGVycnMoKSA8PCAiXG4iKTsKKworICAgICAgICByZXR1cm4gT3AwOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoT3AwLmdldE9wY29kZSgpID09IElTRDo6QUREKSB7CisgICAgICBTRFZhbHVlIE9wMSA9IE4tPmdldE9wZXJhbmQoMSk7CisgICAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNOMSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcDEpKSB7CisgICAgICAgIC8vIChTUFVpbmRpcmVjdCAoYWRkIDxhcmc+LCA8YXJnPiksIDApIC0+CisgICAgICAgIC8vIChTUFVpbmRpcmVjdCA8YXJnPiwgPGFyZz4pCisgICAgICAgIGlmIChDTjEtPmlzTnVsbFZhbHVlKCkpIHsKKworI2lmICFkZWZpbmVkKE5ERUJVRykKKyAgICAgICAgICBpZiAoRGVidWdGbGFnICYmIGlzQ3VycmVudERlYnVnVHlwZShERUJVR19UWVBFKSkgeworICAgICAgICAgICAgZXJycygpIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgIlJlcGxhY2U6IChTUFVpbmRpcmVjdCAoYWRkIDxhcmc+LCA8YXJnPiksIDApXG4iCisgICAgICAgICAgICAgICAgIDw8ICJXaXRoOiAgICAoU1BVaW5kaXJlY3QgPGFyZz4sIDxhcmc+KVxuIjsKKyAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShTUFVJU0Q6OkluZGlyZWN0QWRkciwgZGwsIE9wMFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDAuZ2V0T3BlcmFuZCgwKSwgT3AwLmdldE9wZXJhbmQoMSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgU1BVSVNEOjpTSExRVUFEX0xfQklUUzoKKyAgY2FzZSBTUFVJU0Q6OlNITFFVQURfTF9CWVRFUzoKKyAgY2FzZSBTUFVJU0Q6OlJPVEJZVEVTX0xFRlQ6IHsKKyAgICBTRFZhbHVlIE9wMSA9IE4tPmdldE9wZXJhbmQoMSk7CisKKyAgICAvLyBLaWxsIGRlZ2VuZXJhdGUgdmVjdG9yIHNoaWZ0czoKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNOID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wMSkpIHsKKyAgICAgIGlmIChDTi0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICBSZXN1bHQgPSBPcDA7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgU1BVSVNEOjpQUkVGU0xPVDJWRUM6IHsKKyAgICBzd2l0Y2ggKE9wMC5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIElTRDo6QU5ZX0VYVEVORDoKKyAgICBjYXNlIElTRDo6WkVST19FWFRFTkQ6CisgICAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOiB7CisgICAgICAvLyAoU1BVcHJlZnNsb3QydmVjIChhbnl8emVyb3xzaWduX2V4dGVuZCAoU1BVdmVjMnByZWZzbG90IDxhcmc+KSkpIC0+CisgICAgICAvLyA8YXJnPgorICAgICAgLy8gYnV0IG9ubHkgaWYgdGhlIFNQVXByZWZzbG90MnZlYyBhbmQgPGFyZz4gdHlwZXMgbWF0Y2guCisgICAgICBTRFZhbHVlIE9wMDAgPSBPcDAuZ2V0T3BlcmFuZCgwKTsKKyAgICAgIGlmIChPcDAwLmdldE9wY29kZSgpID09IFNQVUlTRDo6VkVDMlBSRUZTTE9UKSB7CisgICAgICAgIFNEVmFsdWUgT3AwMDAgPSBPcDAwLmdldE9wZXJhbmQoMCk7CisgICAgICAgIGlmIChPcDAwMC5nZXRWYWx1ZVR5cGUoKSA9PSBOb2RlVlQpIHsKKyAgICAgICAgICBSZXN1bHQgPSBPcDAwMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgU1BVSVNEOjpWRUMyUFJFRlNMT1Q6IHsKKyAgICAgIC8vIChTUFVwcmVmc2xvdDJ2ZWMgKFNQVXZlYzJwcmVmc2xvdCA8YXJnPikpIC0+CisgICAgICAvLyA8YXJnPgorICAgICAgUmVzdWx0ID0gT3AwLmdldE9wZXJhbmQoMCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9CisgIH0KKworICAvLyBPdGhlcndpc2UsIHJldHVybiB1bmNoYW5nZWQuCisjaWZuZGVmIE5ERUJVRworICBpZiAoUmVzdWx0LmdldE5vZGUoKSkgeworICAgIERFQlVHKGVycnMoKSA8PCAiXG5SZXBsYWNlLlNQVTogIik7CisgICAgREVCVUcoTi0+ZHVtcCgmREFHKSk7CisgICAgREVCVUcoZXJycygpIDw8ICJcbldpdGg6ICAgICAgICAiKTsKKyAgICBERUJVRyhSZXN1bHQuZ2V0Tm9kZSgpLT5kdW1wKCZEQUcpKTsKKyAgICBERUJVRyhlcnJzKCkgPDwgIlxuIik7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbmxpbmUgQXNzZW1ibHkgU3VwcG9ydAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGdldENvbnN0cmFpbnRUeXBlIC0gR2l2ZW4gYSBjb25zdHJhaW50IGxldHRlciwgcmV0dXJuIHRoZSB0eXBlIG9mCisvLy8gY29uc3RyYWludCBpdCBpcyBmb3IgdGhpcyB0YXJnZXQuCitTUFVUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUKK1NQVVRhcmdldExvd2VyaW5nOjpnZXRDb25zdHJhaW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludExldHRlcikgY29uc3QgeworICBpZiAoQ29uc3RyYWludExldHRlci5zaXplKCkgPT0gMSkgeworICAgIHN3aXRjaCAoQ29uc3RyYWludExldHRlclswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgIGNhc2UgJ3InOgorICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ3YnOgorICAgIGNhc2UgJ3knOgorICAgICAgcmV0dXJuIENfUmVnaXN0ZXJDbGFzczsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjpnZXRDb25zdHJhaW50VHlwZShDb25zdHJhaW50TGV0dGVyKTsKK30KKworc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4KK1NQVVRhcmdldExvd2VyaW5nOjpnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdAoreworICBpZiAoQ29uc3RyYWludC5zaXplKCkgPT0gMSkgeworICAgIC8vIEdDQyBSUzYwMDAgQ29uc3RyYWludCBMZXR0ZXJzCisgICAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgY2FzZSAnYic6ICAgLy8gUjEtUjMxCisgICAgY2FzZSAncic6ICAgLy8gUjAtUjMxCisgICAgICBpZiAoVlQgPT0gTVZUOjppNjQpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgU1BVOjpSNjRDUmVnaXN0ZXJDbGFzcyk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFNQVTo6UjMyQ1JlZ2lzdGVyQ2xhc3MpOworICAgIGNhc2UgJ2YnOgorICAgICAgaWYgKFZUID09IE1WVDo6ZjMyKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFNQVTo6UjMyRlBSZWdpc3RlckNsYXNzKTsKKyAgICAgIGVsc2UgaWYgKFZUID09IE1WVDo6ZjY0KQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFNQVTo6UjY0RlBSZWdpc3RlckNsYXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3YnOgorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBTUFU6OkdQUkNSZWdpc3RlckNsYXNzKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVGFyZ2V0TG93ZXJpbmc6OmdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoQ29uc3RyYWludCwgVlQpOworfQorCisvLyEgQ29tcHV0ZSB1c2VkL2tub3duIGJpdHMgZm9yIGEgU1BVIG9wZXJhbmQKK3ZvaWQKK1NQVVRhcmdldExvd2VyaW5nOjpjb21wdXRlTWFza2VkQml0c0ZvclRhcmdldE5vZGUoY29uc3QgU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoICkgY29uc3QgeworI2lmIDAKKyAgY29uc3QgdWludDY0X3QgdWludDY0X3NpemViaXRzID0gc2l6ZW9mKHVpbnQ2NF90KSAqIENIQVJfQklUOworCisgIHN3aXRjaCAoT3AuZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICAvLyBLbm93blplcm8gPSBLbm93bk9uZSA9IEFQSW50KE1hc2suZ2V0Qml0V2lkdGgoKSwgMCk7CisgICAgYnJlYWs7CisgIGNhc2UgQ0FMTDoKKyAgY2FzZSBTSFVGQjoKKyAgY2FzZSBTSFVGRkxFX01BU0s6CisgIGNhc2UgQ05UQjoKKyAgY2FzZSBTUFVJU0Q6OlBSRUZTTE9UMlZFQzoKKyAgY2FzZSBTUFVJU0Q6OkxEUkVTVUxUOgorICBjYXNlIFNQVUlTRDo6VkVDMlBSRUZTTE9UOgorICBjYXNlIFNQVUlTRDo6U0hMUVVBRF9MX0JJVFM6CisgIGNhc2UgU1BVSVNEOjpTSExRVUFEX0xfQllURVM6CisgIGNhc2UgU1BVSVNEOjpWRUNfUk9UTDoKKyAgY2FzZSBTUFVJU0Q6OlZFQ19ST1RSOgorICBjYXNlIFNQVUlTRDo6Uk9UQllURVNfTEVGVDoKKyAgY2FzZSBTUFVJU0Q6OlNFTEVDVF9NQVNLOgorICBjYXNlIFNQVUlTRDo6U0VMQjoKKyAgfQorI2VuZGlmCit9CisKK3Vuc2lnbmVkCitTUFVUYXJnZXRMb3dlcmluZzo6Q29tcHV0ZU51bVNpZ25CaXRzRm9yVGFyZ2V0Tm9kZShTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGgpIGNvbnN0IHsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiAxOworCisgIGNhc2UgSVNEOjpTRVRDQzogeworICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworCisgICAgaWYgKFZUICE9IE1WVDo6aTggJiYgVlQgIT0gTVZUOjppMTYgJiYgVlQgIT0gTVZUOjppMzIpIHsKKyAgICAgIFZUID0gTVZUOjppMzI7CisgICAgfQorICAgIHJldHVybiBWVC5nZXRTaXplSW5CaXRzKCk7CisgIH0KKyAgfQorfQorCisvLyBMb3dlckFzbU9wZXJhbmRGb3JDb25zdHJhaW50Cit2b2lkCitTUFVUYXJnZXRMb3dlcmluZzo6TG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBDb25zdHJhaW50TGV0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIERlZmF1bHQsIGZvciB0aGUgdGltZSBiZWluZywgdG8gdGhlIGJhc2UgY2xhc3MgaGFuZGxlcgorICBUYXJnZXRMb3dlcmluZzo6TG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludChPcCwgQ29uc3RyYWludExldHRlciwgT3BzLCBEQUcpOworfQorCisvLy8gaXNMZWdhbEFkZHJlc3NJbW1lZGlhdGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW50ZWdlciB2YWx1ZSBjYW4gYmUgdXNlZAorLy8vIGFzIHRoZSBvZmZzZXQgb2YgdGhlIHRhcmdldCBhZGRyZXNzaW5nIG1vZGUuCitib29sIFNQVVRhcmdldExvd2VyaW5nOjppc0xlZ2FsQWRkcmVzc0ltbWVkaWF0ZShpbnQ2NF90IFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgY29uc3QgeworICAvLyBTUFUncyBhZGRyZXNzZXMgYXJlIDI1Nks6CisgIHJldHVybiAoViA+IC0oMSA8PCAxOCkgJiYgViA8ICgxIDw8IDE4KSAtIDEpOworfQorCitib29sIFNQVVRhcmdldExvd2VyaW5nOjppc0xlZ2FsQWRkcmVzc0ltbWVkaWF0ZShsbHZtOjpHbG9iYWxWYWx1ZSogR1YpIGNvbnN0IHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sCitTUFVUYXJnZXRMb3dlcmluZzo6aXNPZmZzZXRGb2xkaW5nTGVnYWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EpIGNvbnN0IHsKKyAgLy8gVGhlIFNQVSB0YXJnZXQgaXNuJ3QgeWV0IGF3YXJlIG9mIG9mZnNldHMuCisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJU2VsTG93ZXJpbmcuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJU2VsTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDIyNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUlTZWxMb3dlcmluZy5oCkBAIC0wLDAgKzEsMTc4IEBACisvLz09PS0tIFNQVUlTZWxMb3dlcmluZy5oIC0gQ2VsbCBTUFUgREFHIExvd2VyaW5nIEludGVyZmFjZSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgQ2VsbCBTUFUgdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50bworLy8gYSBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU1BVX0lTRUxMT1dFUklOR19ICisjZGVmaW5lIFNQVV9JU0VMTE9XRVJJTkdfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAiU1BVLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgbmFtZXNwYWNlIFNQVUlTRCB7CisgICAgZW51bSBOb2RlVHlwZSB7CisgICAgICAvLyBTdGFydCB0aGUgbnVtYmVyaW5nIHdoZXJlIHRoZSBidWlsdGluZyBvcHMgYW5kIHRhcmdldCBvcHMgbGVhdmUgb2ZmLgorICAgICAgRklSU1RfTlVNQkVSID0gSVNEOjpCVUlMVElOX09QX0VORCwKKworICAgICAgLy8gUHNldWRvIGluc3RydWN0aW9uczoKKyAgICAgIFJFVF9GTEFHLCAgICAgICAgICAgICAgICAgLy8vPCBSZXR1cm4gd2l0aCBmbGFnLCBtYXRjaGVkIGJ5IGJpIGluc3RydWN0aW9uCisKKyAgICAgIEhpLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIaWdoIGFkZHJlc3MgY29tcG9uZW50ICh1cHBlciAxNikKKyAgICAgIExvLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBMb3cgYWRkcmVzcyBjb21wb25lbnQgKGxvd2VyIDE2KQorICAgICAgUENSZWxBZGRyLCAgICAgICAgICAgICAgICAvLy88IFByb2dyYW0gY291bnRlciByZWxhdGl2ZSBhZGRyZXNzCisgICAgICBBRm9ybUFkZHIsICAgICAgICAgICAgICAgIC8vLzwgQS1mb3JtIGFkZHJlc3MgKGxvY2FsIHN0b3JlKQorICAgICAgSW5kaXJlY3RBZGRyLCAgICAgICAgICAgICAvLy88IEQtRm9ybSAiaW1tKCRyKSIgYW5kIFgtZm9ybSAiJHIoJHIpIgorCisgICAgICBMRFJFU1VMVCwgICAgICAgICAgICAgICAgIC8vLzwgTG9hZCByZXN1bHQgKHZhbHVlLCBjaGFpbikKKyAgICAgIENBTEwsICAgICAgICAgICAgICAgICAgICAgLy8vPCBDQUxMIGluc3RydWN0aW9uCisgICAgICBTSFVGQiwgICAgICAgICAgICAgICAgICAgIC8vLzwgVmVjdG9yIHNodWZmbGUgKHBlcm11dGUpCisgICAgICBTSFVGRkxFX01BU0ssICAgICAgICAgICAgIC8vLzwgU2h1ZmZsZSBtYXNrCisgICAgICBDTlRCLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgQ291bnQgbGVhZGluZyBvbmVzIGluIGJ5dGVzCisgICAgICBQUkVGU0xPVDJWRUMsICAgICAgICAgICAgIC8vLzwgUHJvbW90ZSBzY2FsYXItPnZlY3RvcgorICAgICAgVkVDMlBSRUZTTE9ULCAgICAgICAgICAgICAvLy88IEV4dHJhY3QgZWxlbWVudCAwCisgICAgICBTSExRVUFEX0xfQklUUywgICAgICAgICAgIC8vLzwgUm90YXRlIHF1YWQgbGVmdCwgYnkgYml0cworICAgICAgU0hMUVVBRF9MX0JZVEVTLCAgICAgICAgICAvLy88IFJvdGF0ZSBxdWFkIGxlZnQsIGJ5IGJ5dGVzCisgICAgICBWRUNfUk9UTCwgICAgICAgICAgICAgICAgIC8vLzwgVmVjdG9yIHJvdGF0ZSBsZWZ0CisgICAgICBWRUNfUk9UUiwgICAgICAgICAgICAgICAgIC8vLzwgVmVjdG9yIHJvdGF0ZSByaWdodAorICAgICAgUk9UQllURVNfTEVGVCwgICAgICAgICAgICAvLy88IFJvdGF0ZSBieXRlcyAobG9hZHMgLT4gUk9UUUJZSSkKKyAgICAgIFJPVEJZVEVTX0xFRlRfQklUUywgICAgICAgLy8vPCBSb3RhdGUgYnl0ZXMgbGVmdCBieSBiaXQgc2hpZnQgY291bnQKKyAgICAgIFNFTEVDVF9NQVNLLCAgICAgICAgICAgICAgLy8vPCBTZWxlY3QgTWFzayAoRlNNLCBGU01CLCBGU01ILCBGU01CSSkKKyAgICAgIFNFTEIsICAgICAgICAgICAgICAgICAgICAgLy8vPCBTZWxlY3QgYml0cyAtPiAoYiAmIG1hc2spIHwgKGEgJiB+bWFzaykKKyAgICAgIC8vIE1hcmtlcnM6IFRoZXNlIGFyZW4ndCB1c2VkIHRvIGdlbmVyYXRlIHRhcmdldC1kZXBlbmRlbnQgbm9kZXMsIGJ1dAorICAgICAgLy8gYXJlIHVzZWQgZHVyaW5nIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKyAgICAgIEFERDY0X01BUktFUiwgICAgICAgICAgICAgLy8vPCBpNjQgYWRkaXRpb24gbWFya2VyCisgICAgICBTVUI2NF9NQVJLRVIsICAgICAgICAgICAgIC8vLzwgaTY0IHN1YnRyYWN0aW9uIG1hcmtlcgorICAgICAgTVVMNjRfTUFSS0VSLCAgICAgICAgICAgICAvLy88IGk2NCBtdWx0aXBseSBtYXJrZXIKKyAgICAgIEhBTEYyVkVDLCAgICAgICAgICAgICAgICAgLy8vPCBQcm9tb3RlIDY0IGJpdCB2ZWN0b3IgdG8gMTI4IGJpdHMKKyAgICAgIFZFQzJIQUxGLCAgICAgICAgICAgICAgICAgLy8vPCBFeHRyYWN0IGZpcnN0IDY0IGJpdHMgZnJvbSAxMjggYml0IHZlY3RvcgorICAgICAgTEFTVF9TUFVJU0QgICAgICAgICAgICAgICAvLy88IExhc3QgdXNlci1kZWZpbmVkIGluc3RydWN0aW9uCisgICAgfTsKKyAgfQorCisgIC8vISBVdGlsaXR5IGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBDZWxsU1BVOgorICBuYW1lc3BhY2UgU1BVIHsKKyAgICBTRFZhbHVlIGdldF92ZWNfdTE4aW1tKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWYWx1ZVR5cGUpOworICAgIFNEVmFsdWUgZ2V0X3ZlY19pMTZpbW0oU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZhbHVlVHlwZSk7CisgICAgU0RWYWx1ZSBnZXRfdmVjX2kxMGltbShTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVmFsdWVUeXBlKTsKKyAgICBTRFZhbHVlIGdldF92ZWNfaThpbW0oU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVmFsdWVUeXBlKTsKKyAgICBTRFZhbHVlIGdldF9JTEhVdmVjX2ltbShTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZhbHVlVHlwZSk7CisgICAgU0RWYWx1ZSBnZXRfdjRpMzJfaW1tKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcpOworICAgIFNEVmFsdWUgZ2V0X3YyaTY0X2ltbShTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKTsKKworICAgIFNEVmFsdWUgTG93ZXJDb25zdGFudFBvb2woU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUFVUYXJnZXRNYWNoaW5lICZUTSk7CisgICAgLy8hIFNpbXBsaWZ5IGEgRVZUOjp2Mmk2NCBjb25zdGFudCBzcGxhdCB0byBDZWxsU1BVLXJlYWR5IGZvcm0KKyAgICBTRFZhbHVlIExvd2VyVjJJNjRTcGxhdChFVlQgT3BWVCwgU2VsZWN0aW9uREFHICZEQUcsIHVpbnQ2NF90IHNwbGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCk7CisgIH0KKworICBjbGFzcyBTUFVUYXJnZXRNYWNoaW5lOyAgICAgICAgICAgIC8vIGZvcndhcmQgZGVjJ2wuCisKKyAgY2xhc3MgU1BVVGFyZ2V0TG93ZXJpbmcgOgorICAgIHB1YmxpYyBUYXJnZXRMb3dlcmluZworICB7CisgICAgaW50IFZhckFyZ3NGcmFtZUluZGV4OyAgICAgICAgICAgIC8vIEZyYW1lSW5kZXggZm9yIHN0YXJ0IG9mIHZhcmFyZ3MgYXJlYS4KKyAgICBTUFVUYXJnZXRNYWNoaW5lICZTUFVUTTsKKworICBwdWJsaWM6CisgICAgLy8hIFRoZSB2ZW5lcmFibGUgY29uc3RydWN0b3IKKyAgICAvKiEKKyAgICAgVGhpcyBpcyB3aGVyZSB0aGUgQ2VsbFNQVSBiYWNrZW5kIHNldHMgb3BlcmF0aW9uIGhhbmRsaW5nIChpLmUuLCBsZWdhbCwKKyAgICAgY3VzdG9tLCBleHBhbmQgb3IgcHJvbW90ZS4pCisgICAgICovCisgICAgU1BVVGFyZ2V0TG93ZXJpbmcoU1BVVGFyZ2V0TWFjaGluZSAmVE0pOworCisgICAgLy8hIEdldCB0aGUgdGFyZ2V0IG1hY2hpbmUKKyAgICBTUFVUYXJnZXRNYWNoaW5lICZnZXRTUFVUYXJnZXRNYWNoaW5lKCkgeworICAgICAgcmV0dXJuIFNQVVRNOworICAgIH0KKworICAgIC8vLyBnZXRUYXJnZXROb2RlTmFtZSgpIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiBhIHRhcmdldCBzcGVjaWZpYworICAgIC8vLyBEQUcgbm9kZS4KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgICAvLy8gZ2V0U2V0Q0NSZXN1bHRUeXBlIC0gUmV0dXJuIHRoZSBWYWx1ZVR5cGUgZm9yIElTRDo6U0VUQ0MKKyAgICB2aXJ0dWFsIE1WVDo6U2ltcGxlVmFsdWVUeXBlIGdldFNldENDUmVzdWx0VHlwZShFVlQgVlQpIGNvbnN0OworCisgICAgLy8hIEN1c3RvbSBsb3dlcmluZyBob29rcworICAgIHZpcnR1YWwgU0RWYWx1ZSBMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLyEgQ3VzdG9tIGxvd2VyaW5nIGhvb2sgZm9yIG5vZGVzIHdpdGggaWxsZWdhbCByZXN1bHQgdHlwZXMuCisgICAgdmlydHVhbCB2b2lkIFJlcGxhY2VOb2RlUmVzdWx0cyhTRE5vZGUgKk4sIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiZSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlIFBlcmZvcm1EQUdDb21iaW5lKFNETm9kZSAqTiwgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGNvbXB1dGVNYXNrZWRCaXRzRm9yVGFyZ2V0Tm9kZShjb25zdCBTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25aZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgICAgdmlydHVhbCB1bnNpZ25lZCBDb21wdXRlTnVtU2lnbkJpdHNGb3JUYXJnZXROb2RlKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgICAgQ29uc3RyYWludFR5cGUgZ2V0Q29uc3RyYWludFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnRMZXR0ZXIpIGNvbnN0OworCisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4KKyAgICAgIGdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3Q7CisKKyAgICB2b2lkIExvd2VyQXNtT3BlcmFuZEZvckNvbnN0cmFpbnQoU0RWYWx1ZSBPcCwgY2hhciBDb25zdHJhaW50TGV0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLy8gaXNMZWdhbEFkZHJlc3NJbW1lZGlhdGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW50ZWdlciB2YWx1ZSBjYW4gYmUgdXNlZAorICAgIC8vLyBhcyB0aGUgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgYWRkcmVzc2luZyBtb2RlLgorICAgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsQWRkcmVzc0ltbWVkaWF0ZShpbnQ2NF90IFYsIGNvbnN0IFR5cGUgKlR5KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNMZWdhbEFkZHJlc3NJbW1lZGlhdGUoR2xvYmFsVmFsdWUgKikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZzZXRGb2xkaW5nTGVnYWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EpIGNvbnN0OworCisgICAgLy8vIGdldEZ1bmN0aW9uQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBMb2cyIGFsaWdubWVudCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlckZvcm1hbEFyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUluc3RyQnVpbGRlci5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUluc3RyQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjY4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVSW5zdHJCdWlsZGVyLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PS0tIFNQVUluc3RyQnVpbGRlci5oIC0gQWlkZXMgZm9yIGJ1aWxkaW5nIENlbGwgU1BVIGluc3RzIC0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZXhwb3NlcyBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgdXNlZCB3aXRoIEJ1aWxkTUkgZnJvbSB0aGUKKy8vIE1hY2hpbmVJbnN0ckJ1aWxkZXIuaCBmaWxlIHRvIHNpbXBsaWZ5IGdlbmVyYXRpbmcgZnJhbWUgYW5kIGNvbnN0YW50IHBvb2wKKy8vIHJlZmVyZW5jZXMuCisvLworLy8gRm9yIHJlZmVyZW5jZSwgdGhlIG9yZGVyIG9mIG9wZXJhbmRzIGZvciBtZW1vcnkgcmVmZXJlbmNlcyBpczoKKy8vIChPcGVyYW5kKSwgRGVzdCBSZWcsIEJhc2UgUmVnLCBhbmQgZWl0aGVyIFJlZyBJbmRleCBvciBJbW1lZGlhdGUKKy8vIERpc3BsYWNlbWVudC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFNQVV9JTlNUUkJVSUxERVJfSAorI2RlZmluZSBTUFVfSU5TVFJCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIGFkZEZyYW1lUmVmZXJlbmNlIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBhIHJlZmVyZW5jZSB0byB0aGUgYmFzZSBvZgorLy8vIGFuIGFic3RyYWN0IG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICBUaGlzCisvLy8gcmVmZXJlbmNlIGhhcyBiYXNlIHJlZ2lzdGVyIGFzIHRoZSBGcmFtZUluZGV4IG9mZnNldCB1bnRpbCBpdCBpcyByZXNvbHZlZC4KKy8vLyBUaGlzIGFsbG93cyBhIGNvbnN0YW50IG9mZnNldCB0byBiZSBzcGVjaWZpZWQgYXMgd2VsbC4uLgorLy8vCitpbmxpbmUgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciYKK2FkZEZyYW1lUmVmZXJlbmNlKGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQiwgaW50IEZJLCBpbnQgT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgbWVtID0gdHJ1ZSkgeworICBpZiAobWVtKQorICAgIHJldHVybiBNSUIuYWRkSW1tKE9mZnNldCkuYWRkRnJhbWVJbmRleChGSSk7CisgIGVsc2UKKyAgICByZXR1cm4gTUlCLmFkZEZyYW1lSW5kZXgoRkkpLmFkZEltbShPZmZzZXQpOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJbnN0ckZvcm1hdHMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVSW5zdHJGb3JtYXRzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYmMyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVSW5zdHJGb3JtYXRzLnRkCkBAIC0wLDAgKzEsMjk4IEBACisvLz09PT0gU1BVSW5zdHJGb3JtYXRzLnRkIC0gQ2VsbCBTUFUgSW5zdHJ1Y3Rpb24gRm9ybWF0cyAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ2VsbCBTUFUgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gTm90ZSB0aGF0IHRoZXNlIGFyZSBub3RhdGlvbmFsbHkgc2ltaWxhciB0bworLy8gUG93ZXJQQywgbGlrZSAiQS1Gb3JtIi4gQnV0IHRoZSBzaXplcyBvZiBvcGVyYW5kcyBhbmQgZmllbGRzIGRpZmZlci4KKworLy8gVGhpcyB3YXMga2lwZWQgZnJvbSB0aGUgUFBDIGluc3RydWN0aW9uIGZvcm1hdHMgKHNlZW1lZCBsaWtlIGEgZ29vZCBpZGVhLi4uKQorCitjbGFzcyBTUFVJbnN0cjxkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluPgorICAgICAgICA6IEluc3RydWN0aW9uIHsKKyAgZmllbGQgYml0czwzMj4gSW5zdDsKKworICBsZXQgTmFtZXNwYWNlID0gIlNQVSI7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IE9PTDsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSBJT0w7CisgIGxldCBBc21TdHJpbmcgPSBhc21zdHI7CisgIGxldCBJdGluZXJhcnkgPSBpdGluOworfQorCisvLyBSUiBGb3JtYXQKK2NsYXNzIFJSRm9ybTxiaXRzPDExPiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIAorICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgICAgIDogU1BVSW5zdHI8T09MLCBJT0wsIGFzbXN0ciwgaXRpbj4geworICBiaXRzPDc+IFJBOworICBiaXRzPDc+IFJCOworICBiaXRzPDc+IFJUOworCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKworICBsZXQgSW5zdHswLTEwfSA9IG9wY29kZTsKKyAgbGV0IEluc3R7MTEtMTd9ID0gUkI7CisgIGxldCBJbnN0ezE4LTI0fSA9IFJBOworICBsZXQgSW5zdHsyNS0zMX0gPSBSVDsKK30KKworbGV0IFJCID0gMCBpbiB7CisgIC8vIFJSIEZvcm1hdCwgd2hlcmUgUkIgaXMgemVyb2VkIChkb250IGNhcmUpOgorICBjbGFzcyBSUkZvcm1fMTxiaXRzPDExPiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIAorICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgICAgICAgOiBSUkZvcm08b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluLCBwYXR0ZXJuPgorICB7IH0KKworICBsZXQgUkEgPSAwIGluIHsKKyAgICAvLyBSUiBGb3JtYXQsIHdoZXJlIFJBIGFuZCBSQiBhcmUgemVyb2VkIChkb250IGNhcmUpOgorICAgIC8vIFVzZWQgZm9yIHJlYWRzIGZyb20gc3RhdHVzIGNvbnRyb2wgcmVnaXN0ZXJzIChzZWUgRlBTQ1JScjMyKQorICAgIGNsYXNzIFJSRm9ybV8yPGJpdHM8MTE+IG9wY29kZSwgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwKKyAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgICAgICAgICA6IFJSRm9ybTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4sIHBhdHRlcm4+CisgICAgeyB9CisgIH0KK30KKworbGV0IFJUID0gMCBpbiB7CisgIC8vIFJSIEZvcm1hdCwgd2hlcmUgUlQgaXMgemVyb2VkIChkb24ndCBjYXJlKSwgb3IgYXMgdGhlIGluc3RydWN0aW9uIGhhbmRib29rCisgIC8vIHNheXMsICJSVCBpcyBhIGZhbHNlIHRhcmdldC4iIFVzZWQgaW4gIkhhbHQgaWYiIGluc3RydWN0aW9ucworICBjbGFzcyBSUkZvcm1fMzxiaXRzPDExPiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsCisgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBSUkZvcm08b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluLCBwYXR0ZXJuPgorICB7IH0KK30KKworLy8gUlJSIEZvcm1hdAorY2xhc3MgUlJSRm9ybTxiaXRzPDQ+IG9wY29kZSwgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwKKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICAgIDogU1BVSW5zdHI8T09MLCBJT0wsIGFzbXN0ciwgaXRpbj4KK3sKKyAgYml0czw3PiBSQTsKKyAgYml0czw3PiBSQjsKKyAgYml0czw3PiBSQzsKKyAgYml0czw3PiBSVDsKKworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisKKyAgbGV0IEluc3R7MC0zfSA9IG9wY29kZTsKKyAgbGV0IEluc3R7NC0xMH0gPSBSVDsKKyAgbGV0IEluc3R7MTEtMTd9ID0gUkI7CisgIGxldCBJbnN0ezE4LTI0fSA9IFJBOworICBsZXQgSW5zdHsyNS0zMX0gPSBSQzsKK30KKworLy8gUkk3IEZvcm1hdAorY2xhc3MgUkk3Rm9ybTxiaXRzPDExPiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgICA6IFNQVUluc3RyPE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+Cit7CisgIGJpdHM8Nz4gaTc7CisgIGJpdHM8Nz4gUkE7CisgIGJpdHM8Nz4gUlQ7CisKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworCisgIGxldCBJbnN0ezAtMTB9ID0gb3Bjb2RlOworICBsZXQgSW5zdHsxMS0xN30gPSBpNzsKKyAgbGV0IEluc3R7MTgtMjR9ID0gUkE7CisgIGxldCBJbnN0ezI1LTMxfSA9IFJUOworfQorCisvLyBDVlRJbnRGcCBGb3JtYXQKK2NsYXNzIENWVEludEZQRm9ybTxiaXRzPDEwPiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsCisgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICAgIDogU1BVSW5zdHI8T09MLCBJT0wsIGFzbXN0ciwgaXRpbj4KK3sKKyAgYml0czw3PiBSQTsKKyAgYml0czw3PiBSVDsKKworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisKKyAgbGV0IEluc3R7MC05fSA9IG9wY29kZTsKKyAgbGV0IEluc3R7MTAtMTd9ID0gMDsKKyAgbGV0IEluc3R7MTgtMjR9ID0gUkE7CisgIGxldCBJbnN0ezI1LTMxfSA9IFJUOworfQorCitsZXQgUkEgPSAwIGluIHsKKyAgY2xhc3MgQklDb25kRm9ybTxiaXRzPDExPiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgICAgICA6IFJSRm9ybTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIEJyYW5jaFJlc29sdiwgcGF0dGVybj4KKyAgeyB9CisKKyAgbGV0IFJUID0gMCBpbiB7CisgICAgLy8gQnJhbmNoIGluc3RydWN0aW9uIGZvcm1hdCAod2l0aG91dCBEL0UgZmxhZyBzZXR0aW5ncykKKyAgICBjbGFzcyBCUkZvcm08Yml0czwxMT4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLAorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICAgICAgOiBSUkZvcm08b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluLCBwYXR0ZXJuPgorICAgIHsgfQorCisgICAgY2xhc3MgQklGb3JtPGJpdHM8MTE+IG9wY29kZSwgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICAgICAgICAgOiBSUkZvcm08b3Bjb2RlLCAob3V0cyksIChpbnMgUjMyQzokZnVuYyksIGFzbXN0ciwgQnJhbmNoUmVzb2x2LAorICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4+CisgICAgeyB9CisKKyAgICBsZXQgUkIgPSAwIGluIHsKKyAgICAgIC8vIFJldHVybiBpbnN0cnVjdGlvbiAoYmksIGJyYW5jaCBpbmRpcmVjdCksIFJBIGlzIHplcm8gKExSKToKKyAgICAgIGNsYXNzIFJFVEZvcm08c3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICAgICAgICAgOiBCUkZvcm08MGIwMDAxMDEwMTEwMCwgKG91dHMpLCAoaW5zKSwgYXNtc3RyLCBCcmFuY2hSZXNvbHYsCisgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj4KKyAgICAgIHsgfQorICAgIH0KKyAgfQorfQorCisvLyBCcmFuY2ggaW5kaXJlY3QgZXh0ZXJuYWwgZGF0YSBmb3JtczoKK2NsYXNzIEJJU0xFREZvcm08Yml0czwyPiBERV9mbGFnLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgICAgIDogU1BVSW5zdHI8KG91dHMpLCAoaW5zIGluZGNhbGx0YXJnZXQ6JGZ1bmMpLCBhc21zdHIsIEJyYW5jaFJlc29sdj4KK3sKKyAgYml0czw3PiBSY2FsbGRlc3Q7CisKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworCisgIGxldCBJbnN0ezAtMTB9ID0gMGIxMTAxMDEwMTEwMDsKKyAgbGV0IEluc3R7MTF9ID0gMDsKKyAgbGV0IEluc3R7MTItMTN9ID0gREVfZmxhZzsKKyAgbGV0IEluc3R7MTQtMTd9ID0gMGIwMDAwOworICBsZXQgSW5zdHsxOC0yNH0gPSBSY2FsbGRlc3Q7CisgIGxldCBJbnN0ezI1LTMxfSA9IDBiMDAwMDAwMDsKK30KKworLy8gUkkxMCBGb3JtYXQKK2NsYXNzIFJJMTBGb3JtPGJpdHM8OD4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLAorICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgICAgOiBTUFVJbnN0cjxPT0wsIElPTCwgYXNtc3RyLCBpdGluPgoreworICBiaXRzPDEwPiBpMTA7CisgIGJpdHM8Nz4gUkE7CisgIGJpdHM8Nz4gUlQ7CisKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworCisgIGxldCBJbnN0ezAtN30gPSBvcGNvZGU7CisgIGxldCBJbnN0ezgtMTd9ID0gaTEwOworICBsZXQgSW5zdHsxOC0yNH0gPSBSQTsKKyAgbGV0IEluc3R7MjUtMzF9ID0gUlQ7Cit9CisKKy8vIFJJMTAgRm9ybWF0LCB3aGVyZSB0aGUgY29uc3RhbnQgaXMgemVybyAob3IgZWZmZWN0aXZlbHkgaWdub3JlZCBieSB0aGUKKy8vIFNQVSkKK2xldCBpMTAgPSAwIGluIHsKKyAgY2xhc3MgUkkxMEZvcm1fMTxiaXRzPDg+IG9wY29kZSwgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwKKyAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgICAgICA6IFJJMTBGb3JtPG9wY29kZSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbiwgcGF0dGVybj4KKyAgeyB9Cit9CisKKy8vIFJJMTAgRm9ybWF0LCB3aGVyZSBSVCBpcyBpZ25vcmVkLgorLy8gVGhpcyBmb3JtYXQgaXMgdXNlZCBwcmltYXJpbHkgYnkgdGhlIEhhbHQgSWYgLi4uIEltbWVkaWF0ZSBzZXQgb2YKKy8vIGluc3RydWN0aW9ucworbGV0IFJUID0gMCBpbiB7CisgIGNsYXNzIFJJMTBGb3JtXzI8Yml0czw4PiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsCisgICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICAgIDogUkkxMEZvcm08b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluLCBwYXR0ZXJuPgorICB7IH0KK30KKworLy8gUkkxNiBGb3JtYXQKK2NsYXNzIFJJMTZGb3JtPGJpdHM8OT4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLAorICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgICAgOiBTUFVJbnN0cjxPT0wsIElPTCwgYXNtc3RyLCBpdGluPgoreworICBiaXRzPDE2PiBpMTY7CisgIGJpdHM8Nz4gUlQ7CisKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworCisgIGxldCBJbnN0ezAtOH0gPSBvcGNvZGU7CisgIGxldCBJbnN0ezktMjR9ID0gaTE2OworICBsZXQgSW5zdHsyNS0zMX0gPSBSVDsKK30KKworLy8gU3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgUkkxNiBGb3JtYXQgZm9yIHVuY29uZGl0aW9uYWwgYnJhbmNoIHJlbGF0aXZlIGFuZAorLy8gYnJhbmNoIGFic29sdXRlLCBicmFuY2ggYW5kIHNldCBsaW5rLiBOb3RlIHRoYXQgZm9yIGJyYW5jaCBhbmQgc2V0IGxpbmssIHRoZQorLy8gbGluayByZWdpc3RlciBkb2Vzbid0IGhhdmUgdG8gYmUgJGxyLCBidXQgdGhpcyBpcyBhY3R1YWxseSBoYXJkIGNvZGVkIGludG8KKy8vIHRoZSBpbnN0cnVjdGlvbiBwYXR0ZXJuLgorCitsZXQgUlQgPSAwIGluIHsKKyAgY2xhc3MgVW5jb25kQnJhbmNoPGJpdHM8OT4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLAorICAgICAgICAgICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBSSTE2Rm9ybTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIEJyYW5jaFJlc29sdiwgcGF0dGVybj4KKyAgeyB9CisKKyAgY2xhc3MgQnJhbmNoU2V0TGluazxiaXRzPDk+IG9wY29kZSwgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgICAgOiBSSTE2Rm9ybTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIEJyYW5jaFJlc29sdiwgcGF0dGVybj4KKyAgeyB9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTcGVjaWFsaXplZCB2ZXJzaW9ucyBvZiBSSTE2OgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUkkxOCBGb3JtYXQKK2NsYXNzIFJJMThGb3JtPGJpdHM8Nz4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLAorICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgICAgOiBTUFVJbnN0cjxPT0wsIElPTCwgYXNtc3RyLCBpdGluPgoreworICBiaXRzPDE4PiBpMTg7CisgIGJpdHM8Nz4gUlQ7CisKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworCisgIGxldCBJbnN0ezAtNn0gPSBvcGNvZGU7CisgIGxldCBJbnN0ezctMjR9ID0gaTE4OworICBsZXQgSW5zdHsyNS0zMX0gPSBSVDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGZvcm1hdHMgZm9yIGludHJpbnNpY3M6CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBSSTEwIEZvcm1hdCBmb3IgdjhpMTYgaW50cmluc2ljcworY2xhc3MgUkkxMF9JbnRfdjhpMTY8Yml0czw4PiBvcGNvZGUsIHN0cmluZyBvcGMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50SUQ+IDoKKyAgUkkxMEZvcm08b3Bjb2RlLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBzMTBpbW06JHZhbCwgVkVDUkVHOiRyQSksCisgICAgICAgICAgICFzdHJjb25jYXQob3BjLCAiICRyVCwgJHJBLCAkdmFsIiksIGl0aW4sCisgICAgICAgICAgIFsoc2V0ICh2OGkxNiBWRUNSRUc6JHJUKSwgKEludElEICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE2SW1tU0V4dDEwOiR2YWwpKV0gPjsKKworY2xhc3MgUkkxMF9JbnRfdjRpMzI8Yml0czw4PiBvcGNvZGUsIHN0cmluZyBvcGMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50SUQ+IDoKKyAgUkkxMEZvcm08b3Bjb2RlLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBzMTBpbW06JHZhbCwgVkVDUkVHOiRyQSksCisgICAgICAgICAgICFzdHJjb25jYXQob3BjLCAiICRyVCwgJHJBLCAkdmFsIiksIGl0aW4sCisgICAgICAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgKEludElEICh2NGkzMiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMySW1tU0V4dDEwOiR2YWwpKV0gPjsKKworLy8gUlIgRm9ybWF0IGZvciB2OGkxNiBpbnRyaW5zaWNzCitjbGFzcyBSUl9JbnRfdjhpMTY8Yml0czwxMT4gb3Bjb2RlLCBzdHJpbmcgb3BjLCBJbnN0ckl0aW5DbGFzcyBpdGluLAorICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRJRD4gOgorICBSUkZvcm08b3Bjb2RlLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICFzdHJjb25jYXQob3BjLCAiICRyVCwgJHJBLCAkckIiKSwgaXRpbiwKKyAgICAgICAgIFsoc2V0ICh2OGkxNiBWRUNSRUc6JHJUKSwgKEludElEICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiBWRUNSRUc6JHJCKSkpXSA+OworCisvLyBSUiBGb3JtYXQgZm9yIHY0aTMyIGludHJpbnNpY3MKK2NsYXNzIFJSX0ludF92NGkzMjxiaXRzPDExPiBvcGNvZGUsIHN0cmluZyBvcGMsIEluc3RySXRpbkNsYXNzIGl0aW4sCisgICAgICAgICAgICAgICAgICAgSW50cmluc2ljIEludElEPiA6CisgIFJSRm9ybTxvcGNvZGUsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgIXN0cmNvbmNhdChvcGMsICIgJHJULCAkckEsICRyQiIpLCBpdGluLAorICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAoSW50SUQgKHY0aTMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIFZFQ1JFRzokckIpKSldID47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQc2V1ZG8gaW5zdHJ1Y3Rpb25zLCBsaWtlIGNhbGwgZnJhbWVzOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgUHNldWRvPGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgIDogU1BVSW5zdHI8T09MLCBJT0wsIGFzbXN0ciwgTm9JdGluZXJhcnk+IHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gT09MOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IElPTDsKKyAgbGV0IEFzbVN0cmluZyAgID0gYXNtc3RyOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxldCBJbnN0ezMxLTB9ID0gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJbnN0ckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUluc3RySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkNmI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsMzgwIEBACisvLz09PS0gU1BVSW5zdHJJbmZvLmNwcCAtIENlbGwgU1BVIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQ2VsbCBTUFUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiU1BVUmVnaXN0ZXJOYW1lcy5oIgorI2luY2x1ZGUgIlNQVUluc3RySW5mby5oIgorI2luY2x1ZGUgIlNQVUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgIlNQVVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJTUFVHZW5JbnN0ckluZm8uaW5jIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIC8vISBQcmVkaWNhdGUgZm9yIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uCisgIGlubGluZSBib29sIGlzVW5jb25kQnJhbmNoKGNvbnN0IE1hY2hpbmVJbnN0ciAqSSkgeworICAgIHVuc2lnbmVkIG9wYyA9IEktPmdldE9wY29kZSgpOworCisgICAgcmV0dXJuIChvcGMgPT0gU1BVOjpCUgorICAgICAgICAgICAgfHwgb3BjID09IFNQVTo6QlJBCisgICAgICAgICAgICB8fCBvcGMgPT0gU1BVOjpCSSk7CisgIH0KKworICAvLyEgUHJlZGljYXRlIGZvciBhIGNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbgorICBpbmxpbmUgYm9vbCBpc0NvbmRCcmFuY2goY29uc3QgTWFjaGluZUluc3RyICpJKSB7CisgICAgdW5zaWduZWQgb3BjID0gSS0+Z2V0T3Bjb2RlKCk7CisKKyAgICByZXR1cm4gKG9wYyA9PSBTUFU6OkJSTlpyMzIKKyAgICAgICAgICAgIHx8IG9wYyA9PSBTUFU6OkJSTlp2NGkzMgorICAgICAgICAgICAgfHwgb3BjID09IFNQVTo6QlJacjMyCisgICAgICAgICAgICB8fCBvcGMgPT0gU1BVOjpCUlp2NGkzMgorICAgICAgICAgICAgfHwgb3BjID09IFNQVTo6QlJITlpyMTYKKyAgICAgICAgICAgIHx8IG9wYyA9PSBTUFU6OkJSSE5adjhpMTYKKyAgICAgICAgICAgIHx8IG9wYyA9PSBTUFU6OkJSSFpyMTYKKyAgICAgICAgICAgIHx8IG9wYyA9PSBTUFU6OkJSSFp2OGkxNik7CisgIH0KK30KKworU1BVSW5zdHJJbmZvOjpTUFVJbnN0ckluZm8oU1BVVGFyZ2V0TWFjaGluZSAmdG0pCisgIDogVGFyZ2V0SW5zdHJJbmZvSW1wbChTUFVJbnN0cywgc2l6ZW9mKFNQVUluc3RzKS9zaXplb2YoU1BVSW5zdHNbMF0pKSwKKyAgICBUTSh0bSksCisgICAgUkkoKlRNLmdldFN1YnRhcmdldEltcGwoKSwgKnRoaXMpCit7IC8qIE5PUCAqLyB9CisKK3Vuc2lnbmVkCitTUFVJbnN0ckluZm86OmlzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgU1BVOjpMUUR2MTZpODoKKyAgY2FzZSBTUFU6OkxRRHY4aTE2OgorICBjYXNlIFNQVTo6TFFEdjRpMzI6CisgIGNhc2UgU1BVOjpMUUR2NGYzMjoKKyAgY2FzZSBTUFU6OkxRRHYyZjY0OgorICBjYXNlIFNQVTo6TFFEcjEyODoKKyAgY2FzZSBTUFU6OkxRRHI2NDoKKyAgY2FzZSBTUFU6OkxRRHIzMjoKKyAgY2FzZSBTUFU6OkxRRHIxNjogeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kIE1PcDEgPSBNSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCBNT3AyID0gTUktPmdldE9wZXJhbmQoMik7CisgICAgaWYgKE1PcDEuaXNJbW0oKSAmJiBNT3AyLmlzRkkoKSkgeworICAgICAgRnJhbWVJbmRleCA9IE1PcDIuZ2V0SW5kZXgoKTsKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKwordW5zaWduZWQKK1NQVUluc3RySW5mbzo6aXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgU1BVOjpTVFFEdjE2aTg6CisgIGNhc2UgU1BVOjpTVFFEdjhpMTY6CisgIGNhc2UgU1BVOjpTVFFEdjRpMzI6CisgIGNhc2UgU1BVOjpTVFFEdjRmMzI6CisgIGNhc2UgU1BVOjpTVFFEdjJmNjQ6CisgIGNhc2UgU1BVOjpTVFFEcjEyODoKKyAgY2FzZSBTUFU6OlNUUURyNjQ6CisgIGNhc2UgU1BVOjpTVFFEcjMyOgorICBjYXNlIFNQVTo6U1RRRHIxNjoKKyAgY2FzZSBTUFU6OlNUUURyODogeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kIE1PcDEgPSBNSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCBNT3AyID0gTUktPmdldE9wZXJhbmQoMik7CisgICAgaWYgKE1PcDEuaXNJbW0oKSAmJiBNT3AyLmlzRkkoKSkgeworICAgICAgRnJhbWVJbmRleCA9IE1PcDIuZ2V0SW5kZXgoKTsKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBTUFVJbnN0ckluZm86OmNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0Cit7CisgIC8vIFdlIHN1cHBvcnQgY3Jvc3MgcmVnaXN0ZXIgY2xhc3MgbW92ZXMgZm9yIG91ciBhbGlhc2VzLCBzdWNoIGFzIFIzIGluIGFueQorICAvLyByZWcgY2xhc3MgdG8gYW55IG90aGVyIHJlZyBjbGFzcyBjb250YWluaW5nIFIzLiAgVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlCisgIC8vIHdlIGluc3RydWN0aW9uIHNlbGVjdCBiaXRjb252ZXJ0IGk2NCAtPiBmNjQgYXMgYSBub29wIGZvciBleGFtcGxlLCBzbyBvdXIKKyAgLy8gdHlwZXMgaGF2ZSBubyBzcGVjaWZpYyBtZWFuaW5nLgorCisgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KFNQVTo6TFJyMTI4KSwgRGVzdFJlZykKKyAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKK30KKwordm9pZAorU1BVSW5zdHJJbmZvOjpzdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsIGludCBGcmFtZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QKK3sKKyAgdW5zaWduZWQgb3BjOworICBib29sIGlzVmFsaWRGcmFtZUlkeCA9IChGcmFtZUlkeCA8IFNQVUZyYW1lSW5mbzo6bWF4RnJhbWVPZmZzZXQoKSk7CisgIGlmIChSQyA9PSBTUFU6OkdQUkNSZWdpc3RlckNsYXNzKSB7CisgICAgb3BjID0gKGlzVmFsaWRGcmFtZUlkeCA/IFNQVTo6U1RRRHIxMjggOiBTUFU6OlNUUVhyMTI4KTsKKyAgfSBlbHNlIGlmIChSQyA9PSBTUFU6OlI2NENSZWdpc3RlckNsYXNzKSB7CisgICAgb3BjID0gKGlzVmFsaWRGcmFtZUlkeCA/IFNQVTo6U1RRRHI2NCA6IFNQVTo6U1RRWHI2NCk7CisgIH0gZWxzZSBpZiAoUkMgPT0gU1BVOjpSNjRGUFJlZ2lzdGVyQ2xhc3MpIHsKKyAgICBvcGMgPSAoaXNWYWxpZEZyYW1lSWR4ID8gU1BVOjpTVFFEcjY0IDogU1BVOjpTVFFYcjY0KTsKKyAgfSBlbHNlIGlmIChSQyA9PSBTUFU6OlIzMkNSZWdpc3RlckNsYXNzKSB7CisgICAgb3BjID0gKGlzVmFsaWRGcmFtZUlkeCA/IFNQVTo6U1RRRHIzMiA6IFNQVTo6U1RRWHIzMik7CisgIH0gZWxzZSBpZiAoUkMgPT0gU1BVOjpSMzJGUFJlZ2lzdGVyQ2xhc3MpIHsKKyAgICBvcGMgPSAoaXNWYWxpZEZyYW1lSWR4ID8gU1BVOjpTVFFEcjMyIDogU1BVOjpTVFFYcjMyKTsKKyAgfSBlbHNlIGlmIChSQyA9PSBTUFU6OlIxNkNSZWdpc3RlckNsYXNzKSB7CisgICAgb3BjID0gKGlzVmFsaWRGcmFtZUlkeCA/IFNQVTo6U1RRRHIxNiA6IFNQVTo6U1RRWHIxNik7CisgIH0gZWxzZSBpZiAoUkMgPT0gU1BVOjpSOENSZWdpc3RlckNsYXNzKSB7CisgICAgb3BjID0gKGlzVmFsaWRGcmFtZUlkeCA/IFNQVTo6U1RRRHI4IDogU1BVOjpTVFFYcjgpOworICB9IGVsc2UgaWYgKFJDID09IFNQVTo6VkVDUkVHUmVnaXN0ZXJDbGFzcykgeworICAgIG9wYyA9IChpc1ZhbGlkRnJhbWVJZHgpID8gU1BVOjpTVFFEdjE2aTggOiBTUFU6OlNUUVh2MTZpODsKKyAgfSBlbHNlIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHJlZ2NsYXNzISIpOworICB9CisKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisgIGFkZEZyYW1lUmVmZXJlbmNlKEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChvcGMpKQorICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpLCBGcmFtZUlkeCk7Cit9CisKK3ZvaWQKK1NQVUluc3RySW5mbzo6bG9hZFJlZ0Zyb21TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRnJhbWVJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QKK3sKKyAgdW5zaWduZWQgb3BjOworICBib29sIGlzVmFsaWRGcmFtZUlkeCA9IChGcmFtZUlkeCA8IFNQVUZyYW1lSW5mbzo6bWF4RnJhbWVPZmZzZXQoKSk7CisgIGlmIChSQyA9PSBTUFU6OkdQUkNSZWdpc3RlckNsYXNzKSB7CisgICAgb3BjID0gKGlzVmFsaWRGcmFtZUlkeCA/IFNQVTo6TFFEcjEyOCA6IFNQVTo6TFFYcjEyOCk7CisgIH0gZWxzZSBpZiAoUkMgPT0gU1BVOjpSNjRDUmVnaXN0ZXJDbGFzcykgeworICAgIG9wYyA9IChpc1ZhbGlkRnJhbWVJZHggPyBTUFU6OkxRRHI2NCA6IFNQVTo6TFFYcjY0KTsKKyAgfSBlbHNlIGlmIChSQyA9PSBTUFU6OlI2NEZQUmVnaXN0ZXJDbGFzcykgeworICAgIG9wYyA9IChpc1ZhbGlkRnJhbWVJZHggPyBTUFU6OkxRRHI2NCA6IFNQVTo6TFFYcjY0KTsKKyAgfSBlbHNlIGlmIChSQyA9PSBTUFU6OlIzMkNSZWdpc3RlckNsYXNzKSB7CisgICAgb3BjID0gKGlzVmFsaWRGcmFtZUlkeCA/IFNQVTo6TFFEcjMyIDogU1BVOjpMUVhyMzIpOworICB9IGVsc2UgaWYgKFJDID09IFNQVTo6UjMyRlBSZWdpc3RlckNsYXNzKSB7CisgICAgb3BjID0gKGlzVmFsaWRGcmFtZUlkeCA/IFNQVTo6TFFEcjMyIDogU1BVOjpMUVhyMzIpOworICB9IGVsc2UgaWYgKFJDID09IFNQVTo6UjE2Q1JlZ2lzdGVyQ2xhc3MpIHsKKyAgICBvcGMgPSAoaXNWYWxpZEZyYW1lSWR4ID8gU1BVOjpMUURyMTYgOiBTUFU6OkxRWHIxNik7CisgIH0gZWxzZSBpZiAoUkMgPT0gU1BVOjpSOENSZWdpc3RlckNsYXNzKSB7CisgICAgb3BjID0gKGlzVmFsaWRGcmFtZUlkeCA/IFNQVTo6TFFEcjggOiBTUFU6OkxRWHI4KTsKKyAgfSBlbHNlIGlmIChSQyA9PSBTUFU6OlZFQ1JFR1JlZ2lzdGVyQ2xhc3MpIHsKKyAgICBvcGMgPSAoaXNWYWxpZEZyYW1lSWR4KSA/IFNQVTo6TFFEdjE2aTggOiBTUFU6OkxRWHYxNmk4OworICB9IGVsc2UgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gcmVnY2xhc3MgaW4gbG9hZFJlZ0Zyb21TdGFja1Nsb3QhIik7CisgIH0KKworICBEZWJ1Z0xvYyBETDsKKyAgaWYgKE1JICE9IE1CQi5lbmQoKSkgREwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KG9wYyksIERlc3RSZWcpLCBGcmFtZUlkeCk7Cit9CisKKy8vISBCcmFuY2ggYW5hbHlzaXMKKy8qIQorICBcbm90ZSBUaGlzIGNvZGUgd2FzIGtpcGVkIGZyb20gUFBDLiBUaGVyZSBtYXkgYmUgbW9yZSBicmFuY2ggYW5hbHlzaXMgZm9yCisgIENlbGxTUFUgdGhhbiB3aGF0J3MgY3VycmVudGx5IGRvbmUgaGVyZS4KKyAqLworYm9vbAorU1BVSW5zdHJJbmZvOjpBbmFseXplQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSkgY29uc3QgeworICAvLyBJZiB0aGUgYmxvY2sgaGFzIG5vIHRlcm1pbmF0b3JzLCBpdCBqdXN0IGZhbGxzIGludG8gdGhlIGJsb2NrIGFmdGVyIGl0LgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5lbmQoKTsKKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAtLUk7CisgIHdoaWxlIChJLT5pc0RlYnVnVmFsdWUoKSkgeworICAgIGlmIChJID09IE1CQi5iZWdpbigpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC0tSTsKKyAgfQorICBpZiAoIWlzVW5wcmVkaWNhdGVkVGVybWluYXRvcihJKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gR2V0IHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBibG9jay4KKyAgTWFjaGluZUluc3RyICpMYXN0SW5zdCA9IEk7CisKKyAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgdGVybWluYXRvciBpbnN0cnVjdGlvbiwgcHJvY2VzcyBpdC4KKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkgfHwgIWlzVW5wcmVkaWNhdGVkVGVybWluYXRvcigtLUkpKSB7CisgICAgaWYgKGlzVW5jb25kQnJhbmNoKExhc3RJbnN0KSkgeworICAgICAgLy8gQ2hlY2sgZm9yIGp1bXAgdGFibGVzCisgICAgICBpZiAoIUxhc3RJbnN0LT5nZXRPcGVyYW5kKDApLmlzTUJCKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgVEJCID0gTGFzdEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChpc0NvbmRCcmFuY2goTGFzdEluc3QpKSB7CisgICAgICAvLyBCbG9jayBlbmRzIHdpdGggZmFsbC10aHJvdWdoIGNvbmRicmFuY2guCisgICAgICBUQkIgPSBMYXN0SW5zdC0+Z2V0T3BlcmFuZCgxKS5nZXRNQkIoKTsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiUHVzaGluZyBMYXN0SW5zdDogICAgICAgICAgICAgICAiKTsKKyAgICAgIERFQlVHKExhc3RJbnN0LT5kdW1wKCkpOworICAgICAgQ29uZC5wdXNoX2JhY2soTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbShMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkpKTsKKyAgICAgIENvbmQucHVzaF9iYWNrKExhc3RJbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gT3RoZXJ3aXNlLCBkb24ndCBrbm93IHdoYXQgdGhpcyBpcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIGl0IGlmIGl0J3MgYSB0ZXJtaW5hdG9yLgorICBNYWNoaW5lSW5zdHIgKlNlY29uZExhc3RJbnN0ID0gSTsKKworICAvLyBJZiB0aGVyZSBhcmUgdGhyZWUgdGVybWluYXRvcnMsIHdlIGRvbid0IGtub3cgd2hhdCBzb3J0IG9mIGJsb2NrIHRoaXMgaXMuCisgIGlmIChTZWNvbmRMYXN0SW5zdCAmJiBJICE9IE1CQi5iZWdpbigpICYmCisgICAgICBpc1VucHJlZGljYXRlZFRlcm1pbmF0b3IoLS1JKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBJZiB0aGUgYmxvY2sgZW5kcyB3aXRoIGEgY29uZGl0aW9uYWwgYW5kIHVuY29uZGl0aW9uYWwgYnJhbmNoLCBoYW5kbGUgaXQuCisgIGlmIChpc0NvbmRCcmFuY2goU2Vjb25kTGFzdEluc3QpICYmIGlzVW5jb25kQnJhbmNoKExhc3RJbnN0KSkgeworICAgIFRCQiA9ICBTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgxKS5nZXRNQkIoKTsKKyAgICBERUJVRyhlcnJzKCkgPDwgIlB1c2hpbmcgU2Vjb25kTGFzdEluc3Q6ICAgICAgICAgIik7CisgICAgREVCVUcoU2Vjb25kTGFzdEluc3QtPmR1bXAoKSk7CisgICAgQ29uZC5wdXNoX2JhY2soTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbShTZWNvbmRMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkpKTsKKyAgICBDb25kLnB1c2hfYmFjayhTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgRkJCID0gTGFzdEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYgdGhlIGJsb2NrIGVuZHMgd2l0aCB0d28gdW5jb25kaXRpb25hbCBicmFuY2hlcywgaGFuZGxlIGl0LiAgVGhlIHNlY29uZAorICAvLyBvbmUgaXMgbm90IGV4ZWN1dGVkLCBzbyByZW1vdmUgaXQuCisgIGlmIChpc1VuY29uZEJyYW5jaChTZWNvbmRMYXN0SW5zdCkgJiYgaXNVbmNvbmRCcmFuY2goTGFzdEluc3QpKSB7CisgICAgVEJCID0gU2Vjb25kTGFzdEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgSSA9IExhc3RJbnN0OworICAgIGlmIChBbGxvd01vZGlmeSkKKyAgICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgY2FuJ3QgaGFuZGxlIHRoaXMuCisgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZAorU1BVSW5zdHJJbmZvOjpSZW1vdmVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgeworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5lbmQoKTsKKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkpCisgICAgcmV0dXJuIDA7CisgIC0tSTsKKyAgd2hpbGUgKEktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgaWYgKEkgPT0gTUJCLmJlZ2luKCkpCisgICAgICByZXR1cm4gMDsKKyAgICAtLUk7CisgIH0KKyAgaWYgKCFpc0NvbmRCcmFuY2goSSkgJiYgIWlzVW5jb25kQnJhbmNoKEkpKQorICAgIHJldHVybiAwOworCisgIC8vIFJlbW92ZSB0aGUgZmlyc3QgYnJhbmNoLgorICBERUJVRyhlcnJzKCkgPDwgIlJlbW92aW5nIGJyYW5jaDogICAgICAgICAgICAgICAgIik7CisgIERFQlVHKEktPmR1bXAoKSk7CisgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICBJID0gTUJCLmVuZCgpOworICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkKKyAgICByZXR1cm4gMTsKKworICAtLUk7CisgIGlmICghKGlzQ29uZEJyYW5jaChJKSB8fCBpc1VuY29uZEJyYW5jaChJKSkpCisgICAgcmV0dXJuIDE7CisKKyAgLy8gUmVtb3ZlIHRoZSBzZWNvbmQgYnJhbmNoLgorICBERUJVRyhlcnJzKCkgPDwgIlJlbW92aW5nIHNlY29uZCBicmFuY2g6ICAgICAgICAgIik7CisgIERFQlVHKEktPmR1bXAoKSk7CisgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICByZXR1cm4gMjsKK30KKwordW5zaWduZWQKK1NQVUluc3RySW5mbzo6SW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdCB7CisgIC8vIFNob3VsZG4ndCBiZSBhIGZhbGwgdGhyb3VnaC4KKyAgYXNzZXJ0KFRCQiAmJiAiSW5zZXJ0QnJhbmNoIG11c3Qgbm90IGJlIHRvbGQgdG8gaW5zZXJ0IGEgZmFsbHRocm91Z2giKTsKKyAgYXNzZXJ0KChDb25kLnNpemUoKSA9PSAyIHx8IENvbmQuc2l6ZSgpID09IDApICYmCisgICAgICAgICAiU1BVIGJyYW5jaCBjb25kaXRpb25zIGhhdmUgdHdvIGNvbXBvbmVudHMhIik7CisKKyAgLy8gT25lLXdheSBicmFuY2guCisgIGlmIChGQkIgPT0gMCkgeworICAgIGlmIChDb25kLmVtcHR5KCkpIHsKKyAgICAgIC8vIFVuY29uZGl0aW9uYWwgYnJhbmNoCisgICAgICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQiA9IEJ1aWxkTUkoJk1CQiwgREwsIGdldChTUFU6OkJSKSk7CisgICAgICBNSUIuYWRkTUJCKFRCQik7CisKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiSW5zZXJ0ZWQgb25lLXdheSB1bmNvbmQgYnJhbmNoOiAiKTsKKyAgICAgIERFQlVHKCgqTUlCKS5kdW1wKCkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBDb25kaXRpb25hbCBicmFuY2gKKyAgICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgIE1JQiA9IEJ1aWxkTUkoJk1CQiwgREwsIGdldChDb25kWzBdLmdldEltbSgpKSk7CisgICAgICBNSUIuYWRkUmVnKENvbmRbMV0uZ2V0UmVnKCkpLmFkZE1CQihUQkIpOworCisgICAgICBERUJVRyhlcnJzKCkgPDwgIkluc2VydGVkIG9uZS13YXkgY29uZCBicmFuY2g6ICAgIik7CisgICAgICBERUJVRygoKk1JQikuZHVtcCgpKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKCZNQkIsIERMLCBnZXQoQ29uZFswXS5nZXRJbW0oKSkpOworICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCMiA9IEJ1aWxkTUkoJk1CQiwgREwsIGdldChTUFU6OkJSKSk7CisKKyAgICAvLyBUd28td2F5IENvbmRpdGlvbmFsIEJyYW5jaC4KKyAgICBNSUIuYWRkUmVnKENvbmRbMV0uZ2V0UmVnKCkpLmFkZE1CQihUQkIpOworICAgIE1JQjIuYWRkTUJCKEZCQik7CisKKyAgICBERUJVRyhlcnJzKCkgPDwgIkluc2VydGVkIGNvbmRpdGlvbmFsIGJyYW5jaDogICAgIik7CisgICAgREVCVUcoKCpNSUIpLmR1bXAoKSk7CisgICAgREVCVUcoZXJycygpIDw8ICJwYXJ0IDI6ICIpOworICAgIERFQlVHKCgqTUlCMikuZHVtcCgpKTsKKyAgIHJldHVybiAyOworICB9Cit9CisKKy8vISBSZXZlcnNlcyBhIGJyYW5jaCdzIGNvbmRpdGlvbiwgcmV0dXJuaW5nIGZhbHNlIG9uIHN1Y2Nlc3MuCitib29sCitTUFVJbnN0ckluZm86OlJldmVyc2VCcmFuY2hDb25kaXRpb24oU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCkKKyAgY29uc3QgeworICAvLyBQcmV0dHkgYnJhaW5sZXNzIHdheSBvZiBpbnZlcnRpbmcgdGhlIGNvbmRpdGlvbiwgYnV0IGl0IHdvcmtzLCBjb25zaWRlcmluZworICAvLyB0aGVyZSBhcmUgb25seSB0d28gY29uZGl0aW9ucy4uLgorICBzdGF0aWMgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBPcGM7ICAgICAgICAgICAgICAgLy8hIFRoZSBpbmNvbWluZyBvcGNvZGUKKyAgICB1bnNpZ25lZCBSZXZDb25kT3BjOyAgICAgICAgLy8hIFRoZSByZXZlcnNlZCBjb25kaXRpb24gb3Bjb2RlCisgIH0gcmV2Y29uZHNbXSA9IHsKKyAgICB7IFNQVTo6QlJOWnIzMiwgU1BVOjpCUlpyMzIgfSwKKyAgICB7IFNQVTo6QlJOWnY0aTMyLCBTUFU6OkJSWnY0aTMyIH0sCisgICAgeyBTUFU6OkJSWnIzMiwgU1BVOjpCUk5acjMyIH0sCisgICAgeyBTUFU6OkJSWnY0aTMyLCBTUFU6OkJSTlp2NGkzMiB9LAorICAgIHsgU1BVOjpCUkhOWnIxNiwgU1BVOjpCUkhacjE2IH0sCisgICAgeyBTUFU6OkJSSE5adjhpMTYsIFNQVTo6QlJIWnY4aTE2IH0sCisgICAgeyBTUFU6OkJSSFpyMTYsIFNQVTo6QlJITlpyMTYgfSwKKyAgICB7IFNQVTo6QlJIWnY4aTE2LCBTUFU6OkJSSE5adjhpMTYgfQorICB9OworCisgIHVuc2lnbmVkIE9wYyA9IHVuc2lnbmVkKENvbmRbMF0uZ2V0SW1tKCkpOworICAvLyBQcmV0dHkgZHVsbCBtYXBwaW5nIGJldHdlZW4gdGhlIHR3byBjb25kaXRpb25zIHRoYXQgU1BVIGNhbiBnZW5lcmF0ZToKKyAgZm9yIChpbnQgaSA9IHNpemVvZihyZXZjb25kcykvc2l6ZW9mKHJldmNvbmRzWzBdKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgaWYgKHJldmNvbmRzW2ldLk9wYyA9PSBPcGMpIHsKKyAgICAgIENvbmRbMF0uc2V0SW1tKHJldmNvbmRzW2ldLlJldkNvbmRPcGMpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUluc3RySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUluc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MWU1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVSW5zdHJJbmZvLmgKQEAgLTAsMCArMSw3NyBAQAorLy89PT0tIFNQVUluc3RySW5mby5oIC0gQ2VsbCBTUFUgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIENlbGxTUFUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFNQVV9JTlNUUlVDVElPTklORk9fSAorI2RlZmluZSBTUFVfSU5TVFJVQ1RJT05JTkZPX0gKKworI2luY2x1ZGUgIlNQVS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgIlNQVVJlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vISBDZWxsIFNQVSBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbiBjbGFzcworICBjbGFzcyBTUFVJbnN0ckluZm8gOiBwdWJsaWMgVGFyZ2V0SW5zdHJJbmZvSW1wbCB7CisgICAgU1BVVGFyZ2V0TWFjaGluZSAmVE07CisgICAgY29uc3QgU1BVUmVnaXN0ZXJJbmZvIFJJOworICBwdWJsaWM6CisgICAgZXhwbGljaXQgU1BVSW5zdHJJbmZvKFNQVVRhcmdldE1hY2hpbmUgJnRtKTsKKworICAgIC8vLyBnZXRSZWdpc3RlckluZm8gLSBUYXJnZXRJbnN0ckluZm8gaXMgYSBzdXBlcnNldCBvZiBNUmVnaXN0ZXIgaW5mby4gIEFzCisgICAgLy8vIHN1Y2gsIHdoZW5ldmVyIGEgY2xpZW50IGhhcyBhbiBpbnN0YW5jZSBvZiBpbnN0cnVjdGlvbiBpbmZvLCBpdCBzaG91bGQKKyAgICAvLy8gYWx3YXlzIGJlIGFibGUgdG8gZ2V0IHJlZ2lzdGVyIGluZm8gYXMgd2VsbCAodGhyb3VnaCB0aGlzIG1ldGhvZCkuCisgICAgLy8vCisgICAgdmlydHVhbCBjb25zdCBTUFVSZWdpc3RlckluZm8gJmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIFJJOyB9CisKKyAgICB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworICAgIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLCBEZWJ1Z0xvYyBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0OworCisgICAgLy8hIFN0b3JlIGEgcmVnaXN0ZXIgdG8gYSBzdGFjayBzbG90LCBiYXNlZCBvbiBpdHMgcmVnaXN0ZXIgY2xhc3MuCisgICAgdmlydHVhbCB2b2lkIHN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgICAvLyEgTG9hZCBhIHJlZ2lzdGVyIGZyb20gYSBzdGFjayBzbG90LCBiYXNlZCBvbiBpdHMgcmVnaXN0ZXIgY2xhc3MuCisgICAgdmlydHVhbCB2b2lkIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICAgIC8vISBSZXZlcnNlcyBhIGJyYW5jaCdzIGNvbmRpdGlvbiwgcmV0dXJuaW5nIGZhbHNlIG9uIHN1Y2Nlc3MuCisgICAgdmlydHVhbAorICAgIGJvb2wgUmV2ZXJzZUJyYW5jaENvbmRpdGlvbihTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBBbmFseXplQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIFJlbW92ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdDsKKworICAgIHZpcnR1YWwgdW5zaWduZWQgSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdDsKKyAgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVUluc3RySW5mby50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJbnN0ckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3NzZmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVJbnN0ckluZm8udGQKQEAgLTAsMCArMSw0NjcyIEBACisvLz09LSBTUFVJbnN0ckluZm8udGQgLSBEZXNjcmliZSB0aGUgQ2VsbCBTUFUgSW5zdHJ1Y3Rpb25zIC0qLSB0YWJsZWdlbiAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDZWxsIFNQVSBJbnN0cnVjdGlvbnM6CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVE9ETyBJdGVtcyAobm90IHVyZ2VudCB0b2RheSwgYnV0IHdvdWxkIGJlIG5pY2UsIGxvdyBwcmlvcml0eSkKKy8vCisvLyBBTkRCSSwgT1JCSTogU1BVIGNvbnN0cnVjdHMgYSA0LWJ5dGUgY29uc3RhbnQgZm9yIHRoZXNlIGluc3RydWN0aW9ucyBieQorLy8gY29uY2F0ZW5hdGluZyB0aGUgYnl0ZSBhcmd1bWVudCBiIGFzICJiYmJiIi4gQ291bGQgcmVjb2duaXplIHRoaXMgYml0IHBhdHRlcm4KKy8vIGluIDE2LWJpdCBhbmQgMzItYml0IGNvbnN0YW50cyBhbmQgcmVkdWNlIGluc3RydWN0aW9uIGNvdW50LgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBzZXVkbyBpbnN0cnVjdGlvbnM6CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgaGFzQ3RybERlcCA9IDEsIERlZnMgPSBbUjFdLCBVc2VzID0gW1IxXSBpbiB7CisgIGRlZiBBREpDQUxMU1RBQ0tET1dOIDogUHNldWRvPChvdXRzKSwgKGlucyB1MTZpbW1faTMyOiRhbXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH0gQURKQ0FMTFNUQUNLRE9XTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2FsbHNlcV9zdGFydCB0aW1tOiRhbXQpXT47CisgIGRlZiBBREpDQUxMU1RBQ0tVUCAgIDogUHNldWRvPChvdXRzKSwgKGlucyB1MTZpbW1faTMyOiRhbXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH0gQURKQ0FMTFNUQUNLVVAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGNhbGxzZXFfZW5kIHRpbW06JGFtdCldPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIExvYWRzOgorLy8gTkI6IFRoZSBvcmRlcmluZyBpcyBhY3R1YWxseSBpbXBvcnRhbnQsIHNpbmNlIHRoZSBpbnN0cnVjdGlvbiBzZWxlY3Rpb24KKy8vIHdpbGwgdHJ5IGVhY2ggb2YgdGhlIGluc3RydWN0aW9ucyBpbiBzZXF1ZW5jZSwgaS5lLiwgdGhlIEQtZm9ybSBmaXJzdCB3aXRoCisvLyB0aGUgMTAtYml0IGRpc3BsYWNlbWVudCwgdGhlbiB0aGUgQS1mb3JtIHdpdGggdGhlIDE2IGJpdCBkaXNwbGFjZW1lbnQsIGFuZAorLy8gZmluYWxseSB0aGUgWC1mb3JtIHdpdGggdGhlIHJlZ2lzdGVyLXJlZ2lzdGVyLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbGV0IGNhbkZvbGRBc0xvYWQgPSAxIGluIHsKKyAgY2xhc3MgTG9hZERGb3JtVmVjPFZhbHVlVHlwZSB2ZWN0eXBlPgorICAgIDogUkkxMEZvcm08MGIwMDEwMTEwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgZGZvcm1hZGRyOiRzcmMpLAorICAgICAgICAgICAgICAgImxxZFx0JHJULCAkc3JjIiwKKyAgICAgICAgICAgICAgIExvYWRTdG9yZSwKKyAgICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAobG9hZCBkZm9ybV9hZGRyOiRzcmMpKV0+CisgIHsgfQorCisgIGNsYXNzIExvYWRERm9ybTxSZWdpc3RlckNsYXNzIHJjbGFzcz4KKyAgICA6IFJJMTBGb3JtPDBiMDAxMDExMDAsIChvdXRzIHJjbGFzczokclQpLCAoaW5zIGRmb3JtYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAgICJscWRcdCRyVCwgJHNyYyIsCisgICAgICAgICAgICAgICBMb2FkU3RvcmUsCisgICAgICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCAobG9hZCBkZm9ybV9hZGRyOiRzcmMpKV0+CisgIHsgfQorCisgIG11bHRpY2xhc3MgTG9hZERGb3JtcworICB7CisgICAgZGVmIHYxNmk4OiBMb2FkREZvcm1WZWM8djE2aTg+OworICAgIGRlZiB2OGkxNjogTG9hZERGb3JtVmVjPHY4aTE2PjsKKyAgICBkZWYgdjRpMzI6IExvYWRERm9ybVZlYzx2NGkzMj47CisgICAgZGVmIHYyaTY0OiBMb2FkREZvcm1WZWM8djJpNjQ+OworICAgIGRlZiB2NGYzMjogTG9hZERGb3JtVmVjPHY0ZjMyPjsKKyAgICBkZWYgdjJmNjQ6IExvYWRERm9ybVZlYzx2MmY2ND47CisKKyAgICBkZWYgdjJpMzI6IExvYWRERm9ybVZlYzx2MmkzMj47CisgICAgZGVmIHYyZjMyOiBMb2FkREZvcm1WZWM8djJmMzI+OworCisgICAgZGVmIHIxMjg6ICBMb2FkREZvcm08R1BSQz47CisgICAgZGVmIHI2NDogICBMb2FkREZvcm08UjY0Qz47CisgICAgZGVmIHIzMjogICBMb2FkREZvcm08UjMyQz47CisgICAgZGVmIGYzMjogICBMb2FkREZvcm08UjMyRlA+OworICAgIGRlZiBmNjQ6ICAgTG9hZERGb3JtPFI2NEZQPjsKKyAgICBkZWYgcjE2OiAgIExvYWRERm9ybTxSMTZDPjsKKyAgICBkZWYgcjg6ICAgIExvYWRERm9ybTxSOEM+OworICB9CisKKyAgY2xhc3MgTG9hZEFGb3JtVmVjPFZhbHVlVHlwZSB2ZWN0eXBlPgorICAgIDogUkkxNkZvcm08MGIxMDAwMDExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIGFkZHIyNTZrOiRzcmMpLAorICAgICAgICAgICAgICAgImxxYVx0JHJULCAkc3JjIiwKKyAgICAgICAgICAgICAgIExvYWRTdG9yZSwKKyAgICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAobG9hZCBhZm9ybV9hZGRyOiRzcmMpKV0+CisgIHsgfQorCisgIGNsYXNzIExvYWRBRm9ybTxSZWdpc3RlckNsYXNzIHJjbGFzcz4KKyAgICA6IFJJMTZGb3JtPDBiMTAwMDAxMTAwLCAob3V0cyByY2xhc3M6JHJUKSwgKGlucyBhZGRyMjU2azokc3JjKSwKKyAgICAgICAgICAgICAgICJscWFcdCRyVCwgJHNyYyIsCisgICAgICAgICAgICAgICBMb2FkU3RvcmUsCisgICAgICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCAobG9hZCBhZm9ybV9hZGRyOiRzcmMpKV0+CisgIHsgfQorCisgIG11bHRpY2xhc3MgTG9hZEFGb3JtcworICB7CisgICAgZGVmIHYxNmk4OiBMb2FkQUZvcm1WZWM8djE2aTg+OworICAgIGRlZiB2OGkxNjogTG9hZEFGb3JtVmVjPHY4aTE2PjsKKyAgICBkZWYgdjRpMzI6IExvYWRBRm9ybVZlYzx2NGkzMj47CisgICAgZGVmIHYyaTY0OiBMb2FkQUZvcm1WZWM8djJpNjQ+OworICAgIGRlZiB2NGYzMjogTG9hZEFGb3JtVmVjPHY0ZjMyPjsKKyAgICBkZWYgdjJmNjQ6IExvYWRBRm9ybVZlYzx2MmY2ND47CisKKyAgICBkZWYgdjJpMzI6IExvYWRBRm9ybVZlYzx2MmkzMj47CisgICAgZGVmIHYyZjMyOiBMb2FkQUZvcm1WZWM8djJmMzI+OworCisgICAgZGVmIHIxMjg6ICBMb2FkQUZvcm08R1BSQz47CisgICAgZGVmIHI2NDogICBMb2FkQUZvcm08UjY0Qz47CisgICAgZGVmIHIzMjogICBMb2FkQUZvcm08UjMyQz47CisgICAgZGVmIGYzMjogICBMb2FkQUZvcm08UjMyRlA+OworICAgIGRlZiBmNjQ6ICAgTG9hZEFGb3JtPFI2NEZQPjsKKyAgICBkZWYgcjE2OiAgIExvYWRBRm9ybTxSMTZDPjsKKyAgICBkZWYgcjg6ICAgIExvYWRBRm9ybTxSOEM+OworICB9CisKKyAgY2xhc3MgTG9hZFhGb3JtVmVjPFZhbHVlVHlwZSB2ZWN0eXBlPgorICAgIDogUlJGb3JtPDBiMDAxMDAwMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIG1lbXJyOiRzcmMpLAorICAgICAgICAgICAgICJscXhcdCRyVCwgJHNyYyIsCisgICAgICAgICAgICAgTG9hZFN0b3JlLAorICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAobG9hZCB4Zm9ybV9hZGRyOiRzcmMpKV0+CisgIHsgfQorCisgIGNsYXNzIExvYWRYRm9ybTxSZWdpc3RlckNsYXNzIHJjbGFzcz4KKyAgICA6IFJSRm9ybTwwYjAwMTAwMDExMTAwLCAob3V0cyByY2xhc3M6JHJUKSwgKGlucyBtZW1ycjokc3JjKSwKKyAgICAgICAgICAgICAibHF4XHQkclQsICRzcmMiLAorICAgICAgICAgICAgIExvYWRTdG9yZSwKKyAgICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCAobG9hZCB4Zm9ybV9hZGRyOiRzcmMpKV0+CisgIHsgfQorCisgIG11bHRpY2xhc3MgTG9hZFhGb3JtcworICB7CisgICAgZGVmIHYxNmk4OiBMb2FkWEZvcm1WZWM8djE2aTg+OworICAgIGRlZiB2OGkxNjogTG9hZFhGb3JtVmVjPHY4aTE2PjsKKyAgICBkZWYgdjRpMzI6IExvYWRYRm9ybVZlYzx2NGkzMj47CisgICAgZGVmIHYyaTY0OiBMb2FkWEZvcm1WZWM8djJpNjQ+OworICAgIGRlZiB2NGYzMjogTG9hZFhGb3JtVmVjPHY0ZjMyPjsKKyAgICBkZWYgdjJmNjQ6IExvYWRYRm9ybVZlYzx2MmY2ND47CisKKyAgICBkZWYgdjJpMzI6IExvYWRYRm9ybVZlYzx2MmkzMj47CisgICAgZGVmIHYyZjMyOiBMb2FkWEZvcm1WZWM8djJmMzI+OworCisgICAgZGVmIHIxMjg6ICBMb2FkWEZvcm08R1BSQz47CisgICAgZGVmIHI2NDogICBMb2FkWEZvcm08UjY0Qz47CisgICAgZGVmIHIzMjogICBMb2FkWEZvcm08UjMyQz47CisgICAgZGVmIGYzMjogICBMb2FkWEZvcm08UjMyRlA+OworICAgIGRlZiBmNjQ6ICAgTG9hZFhGb3JtPFI2NEZQPjsKKyAgICBkZWYgcjE2OiAgIExvYWRYRm9ybTxSMTZDPjsKKyAgICBkZWYgcjg6ICAgIExvYWRYRm9ybTxSOEM+OworICB9CisKKyAgZGVmbSBMUUEgOiBMb2FkQUZvcm1zOworICBkZWZtIExRRCA6IExvYWRERm9ybXM7CisgIGRlZm0gTFFYIDogTG9hZFhGb3JtczsKKworLyogTG9hZCBxdWFkd29yZCwgUEMgcmVsYXRpdmU6IE5vdCBtdWNoIHVzZSBhdCB0aGlzIHBvaW50IGluIHRpbWUuCisgICBNaWdodCBiZSBvZiB1c2UgbGF0ZXIgZm9yIHJlbG9jYXRhYmxlIGNvZGUuIEl0J3MgZWZmZWN0aXZlbHkgdGhlCisgICBzYW1lIGFzIExRQSwgYnV0IHVzZXMgUEMtcmVsYXRpdmUgYWRkcmVzc2luZy4KKyAgZGVmIExRUiA6IFJJMTZGb3JtPDBiMTExMDAxMTAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBzMTZpbW06JGRpc3ApLAorICAgICAgICAgICAgICAgICAgICAgImxxclx0JHJULCAkZGlzcCIsIExvYWRTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZFQ1JFRzokclQsIChsb2FkIGlhZGRyOiRkaXNwKSldPjsKKyAqLworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3RvcmVzOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIFN0b3JlREZvcm1WZWM8VmFsdWVUeXBlIHZlY3R5cGU+CisgIDogUkkxMEZvcm08MGIwMDEwMDEwMCwgKG91dHMpLCAoaW5zIFZFQ1JFRzokclQsIGRmb3JtYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAic3RxZFx0JHJULCAkc3JjIiwKKyAgICAgICAgICAgICBMb2FkU3RvcmUsCisgICAgICAgICAgICAgWyhzdG9yZSAodmVjdHlwZSBWRUNSRUc6JHJUKSwgZGZvcm1fYWRkcjokc3JjKV0+Cit7IH0KKworY2xhc3MgU3RvcmVERm9ybTxSZWdpc3RlckNsYXNzIHJjbGFzcz4KKyAgOiBSSTEwRm9ybTwwYjAwMTAwMTAwLCAob3V0cyksIChpbnMgcmNsYXNzOiRyVCwgZGZvcm1hZGRyOiRzcmMpLAorICAgICAgICAgICAgICJzdHFkXHQkclQsICRzcmMiLAorICAgICAgICAgICAgIExvYWRTdG9yZSwKKyAgICAgICAgICAgICBbKHN0b3JlIHJjbGFzczokclQsIGRmb3JtX2FkZHI6JHNyYyldPgoreyB9CisKK211bHRpY2xhc3MgU3RvcmVERm9ybXMKK3sKKyAgZGVmIHYxNmk4OiBTdG9yZURGb3JtVmVjPHYxNmk4PjsKKyAgZGVmIHY4aTE2OiBTdG9yZURGb3JtVmVjPHY4aTE2PjsKKyAgZGVmIHY0aTMyOiBTdG9yZURGb3JtVmVjPHY0aTMyPjsKKyAgZGVmIHYyaTY0OiBTdG9yZURGb3JtVmVjPHYyaTY0PjsKKyAgZGVmIHY0ZjMyOiBTdG9yZURGb3JtVmVjPHY0ZjMyPjsKKyAgZGVmIHYyZjY0OiBTdG9yZURGb3JtVmVjPHYyZjY0PjsKKworICBkZWYgdjJpMzI6IFN0b3JlREZvcm1WZWM8djJpMzI+OworICBkZWYgdjJmMzI6IFN0b3JlREZvcm1WZWM8djJmMzI+OworCisgIGRlZiByMTI4OiAgU3RvcmVERm9ybTxHUFJDPjsKKyAgZGVmIHI2NDogICBTdG9yZURGb3JtPFI2NEM+OworICBkZWYgcjMyOiAgIFN0b3JlREZvcm08UjMyQz47CisgIGRlZiBmMzI6ICAgU3RvcmVERm9ybTxSMzJGUD47CisgIGRlZiBmNjQ6ICAgU3RvcmVERm9ybTxSNjRGUD47CisgIGRlZiByMTY6ICAgU3RvcmVERm9ybTxSMTZDPjsKKyAgZGVmIHI4OiAgICBTdG9yZURGb3JtPFI4Qz47Cit9CisKK2NsYXNzIFN0b3JlQUZvcm1WZWM8VmFsdWVUeXBlIHZlY3R5cGU+CisgIDogUkkxNkZvcm08MGIwMDEwMDEwLCAob3V0cyksIChpbnMgVkVDUkVHOiRyVCwgYWRkcjI1Nms6JHNyYyksCisgICAgICAgICAgICAgInN0cWFcdCRyVCwgJHNyYyIsCisgICAgICAgICAgICAgTG9hZFN0b3JlLAorICAgICAgICAgICAgIFsoc3RvcmUgKHZlY3R5cGUgVkVDUkVHOiRyVCksIGFmb3JtX2FkZHI6JHNyYyldPjsKKworY2xhc3MgU3RvcmVBRm9ybTxSZWdpc3RlckNsYXNzIHJjbGFzcz4KKyAgOiBSSTE2Rm9ybTwwYjAwMTAwMSwgKG91dHMpLCAoaW5zIHJjbGFzczokclQsIGFkZHIyNTZrOiRzcmMpLAorICAgICAgICAgICAgICJzdHFhXHQkclQsICRzcmMiLAorICAgICAgICAgICAgIExvYWRTdG9yZSwKKyAgICAgICAgICAgICBbKHN0b3JlIHJjbGFzczokclQsIGFmb3JtX2FkZHI6JHNyYyldPjsKKworbXVsdGljbGFzcyBTdG9yZUFGb3JtcworeworICBkZWYgdjE2aTg6IFN0b3JlQUZvcm1WZWM8djE2aTg+OworICBkZWYgdjhpMTY6IFN0b3JlQUZvcm1WZWM8djhpMTY+OworICBkZWYgdjRpMzI6IFN0b3JlQUZvcm1WZWM8djRpMzI+OworICBkZWYgdjJpNjQ6IFN0b3JlQUZvcm1WZWM8djJpNjQ+OworICBkZWYgdjRmMzI6IFN0b3JlQUZvcm1WZWM8djRmMzI+OworICBkZWYgdjJmNjQ6IFN0b3JlQUZvcm1WZWM8djJmNjQ+OworCisgIGRlZiB2MmkzMjogU3RvcmVBRm9ybVZlYzx2MmkzMj47CisgIGRlZiB2MmYzMjogU3RvcmVBRm9ybVZlYzx2MmYzMj47CisKKyAgZGVmIHIxMjg6ICBTdG9yZUFGb3JtPEdQUkM+OworICBkZWYgcjY0OiAgIFN0b3JlQUZvcm08UjY0Qz47CisgIGRlZiByMzI6ICAgU3RvcmVBRm9ybTxSMzJDPjsKKyAgZGVmIGYzMjogICBTdG9yZUFGb3JtPFIzMkZQPjsKKyAgZGVmIGY2NDogICBTdG9yZUFGb3JtPFI2NEZQPjsKKyAgZGVmIHIxNjogICBTdG9yZUFGb3JtPFIxNkM+OworICBkZWYgcjg6ICAgIFN0b3JlQUZvcm08UjhDPjsKK30KKworY2xhc3MgU3RvcmVYRm9ybVZlYzxWYWx1ZVR5cGUgdmVjdHlwZT4KKyAgOiBSUkZvcm08MGIwMDEwMDEwMCwgKG91dHMpLCAoaW5zIFZFQ1JFRzokclQsIG1lbXJyOiRzcmMpLAorICAgICAgICAgICAic3RxeFx0JHJULCAkc3JjIiwKKyAgICAgICAgICAgTG9hZFN0b3JlLAorICAgICAgICAgICBbKHN0b3JlICh2ZWN0eXBlIFZFQ1JFRzokclQpLCB4Zm9ybV9hZGRyOiRzcmMpXT4KK3sgfQorCitjbGFzcyBTdG9yZVhGb3JtPFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPgorICA6IFJSRm9ybTwwYjAwMTAwMTAwLCAob3V0cyksIChpbnMgcmNsYXNzOiRyVCwgbWVtcnI6JHNyYyksCisgICAgICAgICAgICJzdHF4XHQkclQsICRzcmMiLAorICAgICAgICAgICBMb2FkU3RvcmUsCisgICAgICAgICAgIFsoc3RvcmUgcmNsYXNzOiRyVCwgeGZvcm1fYWRkcjokc3JjKV0+Cit7IH0KKworbXVsdGljbGFzcyBTdG9yZVhGb3JtcworeworICBkZWYgdjE2aTg6IFN0b3JlWEZvcm1WZWM8djE2aTg+OworICBkZWYgdjhpMTY6IFN0b3JlWEZvcm1WZWM8djhpMTY+OworICBkZWYgdjRpMzI6IFN0b3JlWEZvcm1WZWM8djRpMzI+OworICBkZWYgdjJpNjQ6IFN0b3JlWEZvcm1WZWM8djJpNjQ+OworICBkZWYgdjRmMzI6IFN0b3JlWEZvcm1WZWM8djRmMzI+OworICBkZWYgdjJmNjQ6IFN0b3JlWEZvcm1WZWM8djJmNjQ+OworCisgIGRlZiB2MmkzMjogU3RvcmVYRm9ybVZlYzx2MmkzMj47CisgIGRlZiB2MmYzMjogU3RvcmVYRm9ybVZlYzx2MmYzMj47CisKKyAgZGVmIHIxMjg6ICBTdG9yZVhGb3JtPEdQUkM+OworICBkZWYgcjY0OiAgIFN0b3JlWEZvcm08UjY0Qz47CisgIGRlZiByMzI6ICAgU3RvcmVYRm9ybTxSMzJDPjsKKyAgZGVmIGYzMjogICBTdG9yZVhGb3JtPFIzMkZQPjsKKyAgZGVmIGY2NDogICBTdG9yZVhGb3JtPFI2NEZQPjsKKyAgZGVmIHIxNjogICBTdG9yZVhGb3JtPFIxNkM+OworICBkZWYgcjg6ICAgIFN0b3JlWEZvcm08UjhDPjsKK30KKworZGVmbSBTVFFEIDogU3RvcmVERm9ybXM7CitkZWZtIFNUUUEgOiBTdG9yZUFGb3JtczsKK2RlZm0gU1RRWCA6IFN0b3JlWEZvcm1zOworCisvKiBTdG9yZSBxdWFkd29yZCwgUEMgcmVsYXRpdmU6IE5vdCBtdWNoIHVzZSBhdCB0aGlzIHBvaW50IGluIHRpbWUuIE1pZ2h0CisgICBiZSB1c2VmdWwgZm9yIHJlbG9jYXRhYmxlIGNvZGUuCitkZWYgU1RRUiA6IFJJMTZGb3JtPDBiMTExMDAwMTAwLCAob3V0cyksIChpbnMgVkVDUkVHOiRyVCwgczE2aW1tOiRkaXNwKSwKKyAgICAgICAgICAgICAgICAgICAic3Rxclx0JHJULCAkZGlzcCIsIExvYWRTdG9yZSwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIFZFQ1JFRzokclQsIGlhZGRyOiRkaXNwKV0+OworKi8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdlbmVyYXRlIENvbnRyb2xzIGZvciBJbnNlcnRpb246CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgQ0JEOiBSSTdGb3JtPDBiMTAxMDExMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIHNodWZhZGRyOiRzcmMpLAorICAgICJjYmRcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjE2aTggVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayBkZm9ybTJfYWRkcjokc3JjKSldPjsKKworZGVmIENCWDogUlJGb3JtPDBiMDAxMDEwMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIG1lbXJyOiRzcmMpLAorICAgICJjYnhcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjE2aTggVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayB4Zm9ybV9hZGRyOiRzcmMpKV0+OworCitkZWYgQ0hEOiBSSTdGb3JtPDBiMTAxMDExMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIHNodWZhZGRyOiRzcmMpLAorICAgICJjaGRcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayBkZm9ybTJfYWRkcjokc3JjKSldPjsKKworZGVmIENIWDogUlJGb3JtPDBiMTAxMDEwMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIG1lbXJyOiRzcmMpLAorICAgICJjaHhcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayB4Zm9ybV9hZGRyOiRzcmMpKV0+OworCitkZWYgQ1dEOiBSSTdGb3JtPDBiMDExMDExMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIHNodWZhZGRyOiRzcmMpLAorICAgICJjd2RcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayBkZm9ybTJfYWRkcjokc3JjKSldPjsKKworZGVmIENXWDogUlJGb3JtPDBiMDExMDEwMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIG1lbXJyOiRzcmMpLAorICAgICJjd3hcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayB4Zm9ybV9hZGRyOiRzcmMpKV0+OworCitkZWYgQ1dEZjMyOiBSSTdGb3JtPDBiMDExMDExMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIHNodWZhZGRyOiRzcmMpLAorICAgICJjd2RcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjRmMzIgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayBkZm9ybTJfYWRkcjokc3JjKSldPjsKKworZGVmIENXWGYzMjogUlJGb3JtPDBiMDExMDEwMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIG1lbXJyOiRzcmMpLAorICAgICJjd3hcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjRmMzIgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayB4Zm9ybV9hZGRyOiRzcmMpKV0+OworCitkZWYgQ0REOiBSSTdGb3JtPDBiMTExMDExMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIHNodWZhZGRyOiRzcmMpLAorICAgICJjZGRcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjJpNjQgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayBkZm9ybTJfYWRkcjokc3JjKSldPjsKKworZGVmIENEWDogUlJGb3JtPDBiMTExMDEwMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIG1lbXJyOiRzcmMpLAorICAgICJjZHhcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjJpNjQgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayB4Zm9ybV9hZGRyOiRzcmMpKV0+OworCitkZWYgQ0REZjY0OiBSSTdGb3JtPDBiMTExMDExMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIHNodWZhZGRyOiRzcmMpLAorICAgICJjZGRcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjJmNjQgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayBkZm9ybTJfYWRkcjokc3JjKSldPjsKKworZGVmIENEWGY2NDogUlJGb3JtPDBiMTExMDEwMTExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIG1lbXJyOiRzcmMpLAorICAgICJjZHhcdCRyVCwgJHNyYyIsIFNodWZmbGVPcCwKKyAgICBbKHNldCAodjJmNjQgVkVDUkVHOiRyVCksIChTUFVzaHVmbWFzayB4Zm9ybV9hZGRyOiRzcmMpKV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29uc3RhbnQgZm9ybWF0aW9uOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIElMSHY4aTE2OgorICBSSTE2Rm9ybTwwYjExMDAwMDAxMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgczE2aW1tOiR2YWwpLAorICAgICJpbGhcdCRyVCwgJHZhbCIsIEltbUxvYWQsCisgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLCAodjhpMTYgdjhpMTZTRXh0MTZJbW06JHZhbCkpXT47CisKK2RlZiBJTEhyMTY6CisgIFJJMTZGb3JtPDBiMTEwMDAwMDEwLCAob3V0cyBSMTZDOiRyVCksIChpbnMgczE2aW1tOiR2YWwpLAorICAgICJpbGhcdCRyVCwgJHZhbCIsIEltbUxvYWQsCisgICAgWyhzZXQgUjE2QzokclQsIGltbVNFeHQxNjokdmFsKV0+OworCisvLyBDZWxsIFNQVSBkb2Vzbid0IGhhdmUgYSBuYXRpdmUgOC1iaXQgaW1tZWRpYXRlIGxvYWQsIGJ1dCBJTEggd29ya3MgKCJ3aXRoCisvLyB0aGUgcmlnaHQgY29uc3RhbnQiKQorZGVmIElMSHI4OgorICBSSTE2Rm9ybTwwYjExMDAwMDAxMCwgKG91dHMgUjhDOiRyVCksIChpbnMgczE2aW1tX2k4OiR2YWwpLAorICAgICJpbGhcdCRyVCwgJHZhbCIsIEltbUxvYWQsCisgICAgWyhzZXQgUjhDOiRyVCwgaW1tU0V4dDg6JHZhbCldPjsKKworLy8gSUwgZG9lcyBzaWduIGV4dGVuc2lvbiEKKworY2xhc3MgSUxJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgUkkxNkZvcm08MGIxMDAwMDAwMTAsIE9PTCwgSU9MLCAiaWxcdCRyVCwgJHZhbCIsCisgICAgICAgICAgIEltbUxvYWQsIHBhdHRlcm4+OworCitjbGFzcyBJTFZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGUsIE9wZXJhbmQgaW1tdHlwZSwgUGF0TGVhZiB4Zm9ybT46CisgIElMSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBpbW10eXBlOiR2YWwpLAorICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksICh2ZWN0eXBlIHhmb3JtOiR2YWwpKV0+OworCitjbGFzcyBJTFJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3MsIE9wZXJhbmQgaW1tdHlwZSwgUGF0TGVhZiB4Zm9ybT46CisgIElMSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyBpbW10eXBlOiR2YWwpLAorICAgICAgICAgWyhzZXQgcmNsYXNzOiRyVCwgeGZvcm06JHZhbCldPjsKKworbXVsdGljbGFzcyBJbW1lZGlhdGVMb2FkCit7CisgIGRlZiB2Mmk2NDogSUxWZWNJbnN0PHYyaTY0LCBzMTZpbW1faTY0LCB2Mmk2NFNFeHQxNkltbT47CisgIGRlZiB2NGkzMjogSUxWZWNJbnN0PHY0aTMyLCBzMTZpbW1faTMyLCB2NGkzMlNFeHQxNkltbT47CisKKyAgLy8gVE9ETzogTmVlZCB2MmY2NCwgdjRmMzIKKworICBkZWYgcjY0OiBJTFJlZ0luc3Q8UjY0QywgczE2aW1tX2k2NCwgaW1tU0V4dDE2PjsKKyAgZGVmIHIzMjogSUxSZWdJbnN0PFIzMkMsIHMxNmltbV9pMzIsIGltbVNFeHQxNj47CisgIGRlZiBmMzI6IElMUmVnSW5zdDxSMzJGUCwgczE2aW1tX2YzMiwgZnBpbW1TRXh0MTY+OworICBkZWYgZjY0OiBJTFJlZ0luc3Q8UjY0RlAsIHMxNmltbV9mNjQsIGZwaW1tU0V4dDE2PjsKK30KKworZGVmbSBJTCA6IEltbWVkaWF0ZUxvYWQ7CisKK2NsYXNzIElMSFVJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgUkkxNkZvcm08MGIwMTAwMDAwMTAsIE9PTCwgSU9MLCAiaWxodVx0JHJULCAkdmFsIiwKKyAgICAgICAgICAgSW1tTG9hZCwgcGF0dGVybj47CisKK2NsYXNzIElMSFVWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlLCBPcGVyYW5kIGltbXR5cGUsIFBhdExlYWYgeGZvcm0+OgorICBJTEhVSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBpbW10eXBlOiR2YWwpLAorICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwgKHZlY3R5cGUgeGZvcm06JHZhbCkpXT47CisKK2NsYXNzIElMSFVSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBPcGVyYW5kIGltbXR5cGUsIFBhdExlYWYgeGZvcm0+OgorICBJTEhVSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyBpbW10eXBlOiR2YWwpLAorICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCB4Zm9ybTokdmFsKV0+OworCittdWx0aWNsYXNzIEltbUxvYWRIYWxmd29yZFVwcGVyCit7CisgIGRlZiB2Mmk2NDogSUxIVVZlY0luc3Q8djJpNjQsIHUxNmltbV9pNjQsIGltbUlMSFV2ZWNfaTY0PjsKKyAgZGVmIHY0aTMyOiBJTEhVVmVjSW5zdDx2NGkzMiwgdTE2aW1tX2kzMiwgaW1tSUxIVXZlYz47CisKKyAgZGVmIHI2NDogSUxIVVJlZ0luc3Q8UjY0QywgdTE2aW1tX2k2NCwgaGkxNj47CisgIGRlZiByMzI6IElMSFVSZWdJbnN0PFIzMkMsIHUxNmltbV9pMzIsIGhpMTY+OworCisgIC8vIExvYWRzIHRoZSBoaWdoIHBvcnRpb24gb2YgYW4gYWRkcmVzcworICBkZWYgaGk6IElMSFVSZWdJbnN0PFIzMkMsIHN5bWJvbEhpLCBoaTE2PjsKKworICAvLyBVc2VkIGluIGN1c3RvbSBsb3dlcmluZyBjb25zdGFudCBTRlAgbG9hZHM6CisgIGRlZiBmMzI6IElMSFVSZWdJbnN0PFIzMkZQLCBmMTZpbW0sIGhpMTZfZjMyPjsKK30KKworZGVmbSBJTEhVIDogSW1tTG9hZEhhbGZ3b3JkVXBwZXI7CisKKy8vIEltbWVkaWF0ZSBsb2FkIGFkZHJlc3MgKGNhbiBhbHNvIGJlIHVzZWQgdG8gbG9hZCAxOC1iaXQgdW5zaWduZWQgY29uc3RhbnRzLAorLy8gc2VlIHRoZSB6ZXh0IDE2LT4zMiBwYXR0ZXJuKQorCitjbGFzcyBJTEFJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgUkkxOEZvcm08MGIxMDAwMDEwLCBPT0wsIElPTCwgImlsYVx0JHJULCAkdmFsIiwKKyAgICAgICAgICAgTG9hZE5PUCwgcGF0dGVybj47CisKK2NsYXNzIElMQVZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGUsIE9wZXJhbmQgaW1tdHlwZSwgUGF0TGVhZiB4Zm9ybT46CisgIElMQUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgaW1tdHlwZTokdmFsKSwKKyAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwgKHZlY3R5cGUgeGZvcm06JHZhbCkpXT47CisKK2NsYXNzIElMQVJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3MsIE9wZXJhbmQgaW1tdHlwZSwgUGF0TGVhZiB4Zm9ybT46CisgIElMQUluc3Q8KG91dHMgcmNsYXNzOiRyVCksIChpbnMgaW1tdHlwZTokdmFsKSwKKyAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCB4Zm9ybTokdmFsKV0+OworCittdWx0aWNsYXNzIEltbUxvYWRBZGRyZXNzCit7CisgIGRlZiB2Mmk2NDogSUxBVmVjSW5zdDx2Mmk2NCwgdTE4aW1tLCB2Mmk2NFVuczE4SW1tPjsKKyAgZGVmIHY0aTMyOiBJTEFWZWNJbnN0PHY0aTMyLCB1MThpbW0sIHY0aTMyVW5zMThJbW0+OworCisgIGRlZiByNjQ6IElMQVJlZ0luc3Q8UjY0QywgdTE4aW1tX2k2NCwgaW1tMTg+OworICBkZWYgcjMyOiBJTEFSZWdJbnN0PFIzMkMsIHUxOGltbSwgaW1tMTg+OworICBkZWYgZjMyOiBJTEFSZWdJbnN0PFIzMkZQLCBmMThpbW0sIGZwaW1tMTg+OworICBkZWYgZjY0OiBJTEFSZWdJbnN0PFI2NEZQLCBmMThpbW1fZjY0LCBmcGltbTE4PjsKKworICBkZWYgaGk6IElMQVJlZ0luc3Q8UjMyQywgc3ltYm9sSGksIGltbTE4PjsKKyAgZGVmIGxvOiBJTEFSZWdJbnN0PFIzMkMsIHN5bWJvbExvLCBpbW0xOD47CisKKyAgZGVmIGxzYTogSUxBSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgc3ltYm9sTFNBOiR2YWwpLAorICAgICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47Cit9CisKK2RlZm0gSUxBIDogSW1tTG9hZEFkZHJlc3M7CisKKy8vIEltbWVkaWF0ZSBPUiwgSGFsZndvcmQgTG93ZXI6IFRoZSAib3RoZXIiIHBhcnQgb2YgbG9hZGluZyBsYXJnZSBjb25zdGFudHMKKy8vIGludG8gMzItYml0IHJlZ2lzdGVycy4gU2VlIHRoZSBhbm9ueW1vdXMgcGF0dGVybiBQYXQ8KGkzMiBpbW06JGltbSksIC4uLj4KKy8vIE5vdGUgdGhhdCB0aGVzZSBhcmUgcmVhbGx5IHR3byBvcGVyYW5kIGluc3RydWN0aW9ucywgYnV0IHRoZXkncmUgZW5jb2RlZAorLy8gYXMgdGhyZWUgb3BlcmFuZHMgd2l0aCB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cyB0aWVkLXRvIGVhY2ggb3RoZXIuCisKK2NsYXNzIElPSExJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgUkkxNkZvcm08MGIxMDAwMDAxMTAsIE9PTCwgSU9MLCAiaW9obFx0JHJULCAkdmFsIiwKKyAgICAgICAgICAgSW1tTG9hZCwgcGF0dGVybj4sCisgIFJlZ0NvbnN0cmFpbnQ8IiRyUyA9ICRyVCI+LAorICBOb0VuY29kZTwiJHJTIj47CisKK2NsYXNzIElPSExWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlLCBPcGVyYW5kIGltbXR5cGUgLyogLCBQYXRMZWFmIHhmb3JtICovPjoKKyAgSU9ITEluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyUywgaW1tdHlwZTokdmFsKSwKKyAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworY2xhc3MgSU9ITFJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3MsIE9wZXJhbmQgaW1tdHlwZSAvKiAsIFBhdExlYWYgeGZvcm0gKi8+OgorICBJT0hMSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJTLCBpbW10eXBlOiR2YWwpLAorICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCittdWx0aWNsYXNzIEltbU9ySGFsZndvcmRMb3dlcgoreworICBkZWYgdjJpNjQ6IElPSExWZWNJbnN0PHYyaTY0LCB1MTZpbW1faTY0PjsKKyAgZGVmIHY0aTMyOiBJT0hMVmVjSW5zdDx2NGkzMiwgdTE2aW1tX2kzMj47CisKKyAgZGVmIHIzMjogSU9ITFJlZ0luc3Q8UjMyQywgaTMyaW1tPjsKKyAgZGVmIGYzMjogSU9ITFJlZ0luc3Q8UjMyRlAsIGYzMmltbT47CisKKyAgZGVmIGxvOiBJT0hMUmVnSW5zdDxSMzJDLCBzeW1ib2xMbz47Cit9CisKK2RlZm0gSU9ITDogSW1tT3JIYWxmd29yZExvd2VyOworCisvLyBGb3JtIHNlbGVjdCBtYXNrIGZvciBieXRlcyB1c2luZyBpbW1lZGlhdGUsIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKKy8vIFNFTEIgaW5zdHJ1Y3Rpb246CisKK2NsYXNzIEZTTUJJVmVjPFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgUkkxNkZvcm08MGIxMDEwMDExMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIHUxNmltbTokdmFsKSwKKyAgICAgICAgICAiZnNtYmlcdCRyVCwgJHZhbCIsCisgICAgICAgICAgU2VsZWN0T3AsCisgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksIChTUFVzZWxtYXNrIChpMTYgaW1tVTE2OiR2YWwpKSldPjsKKworbXVsdGljbGFzcyBGb3JtU2VsZWN0TWFza0J5dGVzSW1tCit7CisgIGRlZiB2MTZpODogRlNNQklWZWM8djE2aTg+OworICBkZWYgdjhpMTY6IEZTTUJJVmVjPHY4aTE2PjsKKyAgZGVmIHY0aTMyOiBGU01CSVZlYzx2NGkzMj47CisgIGRlZiB2Mmk2NDogRlNNQklWZWM8djJpNjQ+OworfQorCitkZWZtIEZTTUJJIDogRm9ybVNlbGVjdE1hc2tCeXRlc0ltbTsKKworLy8gZnNtYjogRm9ybSBzZWxlY3QgbWFzayBmb3IgYnl0ZXMuIE4uQi4gSW5wdXQgb3BlcmFuZCwgJHJBLCBpcyAxNi1iaXRzCitjbGFzcyBGU01CSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtXzE8MGIwMTEwMTEwMTEwMCwgT09MLCBJT0wsICJmc21iXHQkclQsICRyQSIsIFNlbGVjdE9wLAorICAgICAgICAgICAgIHBhdHRlcm4+OworCitjbGFzcyBGU01CUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcywgVmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIEZTTUJJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIHJjbGFzczokckEpLAorICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAoU1BVc2VsbWFzayByY2xhc3M6JHJBKSldPjsKKworY2xhc3MgRlNNQlZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIEZTTUJJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgIChTUFVzZWxtYXNrICh2ZWN0eXBlIFZFQ1JFRzokckEpKSldPjsKKworbXVsdGljbGFzcyBGb3JtU2VsZWN0TWFza0JpdHMgeworICBkZWYgdjE2aThfcjE2OiBGU01CUmVnSW5zdDxSMTZDLCB2MTZpOD47CisgIGRlZiB2MTZpODogICAgIEZTTUJWZWNJbnN0PHYxNmk4PjsKK30KKworZGVmbSBGU01COiBGb3JtU2VsZWN0TWFza0JpdHM7CisKKy8vIGZzbWg6IEZvcm0gc2VsZWN0IG1hc2sgZm9yIGhhbGZ3b3Jkcy4gTi5CLiwgSW5wdXQgb3BlcmFuZCwgJHJBLCBpcworLy8gb25seSA4LWJpdHMgd2lkZSAoZXZlbiB0aG91Z2ggaXQncyBpbnB1dCBhcyAxNi1iaXRzIGhlcmUpCisKK2NsYXNzIEZTTUhJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm1fMTwwYjEwMTAxMTAxMTAwLCBPT0wsIElPTCwgImZzbWhcdCRyVCwgJHJBIiwgU2VsZWN0T3AsCisgICAgICAgICAgICAgcGF0dGVybj47CisKK2NsYXNzIEZTTUhSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgRlNNSEluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgcmNsYXNzOiRyQSksCisgICAgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksIChTUFVzZWxtYXNrIHJjbGFzczokckEpKV0+OworCitjbGFzcyBGU01IVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgRlNNSEluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgICAgKFNQVXNlbG1hc2sgKHZlY3R5cGUgVkVDUkVHOiRyQSkpKV0+OworCittdWx0aWNsYXNzIEZvcm1TZWxlY3RNYXNrSGFsZndvcmQgeworICBkZWYgdjhpMTZfcjE2OiBGU01IUmVnSW5zdDxSMTZDLCB2OGkxNj47CisgIGRlZiB2OGkxNjogICAgIEZTTUhWZWNJbnN0PHY4aTE2PjsKK30KKworZGVmbSBGU01IOiBGb3JtU2VsZWN0TWFza0hhbGZ3b3JkOworCisvLyBmc206IEZvcm0gc2VsZWN0IG1hc2sgZm9yIHdvcmRzLiBMaWtlIHRoZSBvdGhlciBmc20qIGluc3RydWN0aW9ucywKKy8vIG9ubHkgdGhlIGxvd2VyIDQgYml0cyBvZiAkckEgYXJlIHNpZ25pZmljYW50LgorCitjbGFzcyBGU01JbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm1fMTwwYjAwMTAxMTAxMTAwLCBPT0wsIElPTCwgImZzbVx0JHJULCAkckEiLCBTZWxlY3RPcCwKKyAgICAgICAgICAgICBwYXR0ZXJuPjsKKworY2xhc3MgRlNNUmVnSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZSwgUmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIEZTTUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgcmNsYXNzOiRyQSksCisgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwgKFNQVXNlbG1hc2sgcmNsYXNzOiRyQSkpXT47CisKK2NsYXNzIEZTTVZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIEZTTUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSksCisgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwgKFNQVXNlbG1hc2sgKHZlY3R5cGUgVkVDUkVHOiRyQSkpKV0+OworCittdWx0aWNsYXNzIEZvcm1TZWxlY3RNYXNrV29yZCB7CisgIGRlZiB2NGkzMjogRlNNVmVjSW5zdDx2NGkzMj47CisKKyAgZGVmIHIzMiA6ICBGU01SZWdJbnN0PHY0aTMyLCBSMzJDPjsKKyAgZGVmIHIxNiA6ICBGU01SZWdJbnN0PHY0aTMyLCBSMTZDPjsKK30KKworZGVmbSBGU00gOiBGb3JtU2VsZWN0TWFza1dvcmQ7CisKKy8vIFNwZWNpYWwgY2FzZSB3aGVuIHVzZWQgZm9yIGk2NCBtYXRoIG9wZXJhdGlvbnMKK211bHRpY2xhc3MgRm9ybVNlbGVjdE1hc2tXb3JkNjQgeworICBkZWYgcjMyIDogRlNNUmVnSW5zdDx2Mmk2NCwgUjMyQz47CisgIGRlZiByMTYgOiBGU01SZWdJbnN0PHYyaTY0LCBSMTZDPjsKK30KKworZGVmbSBGU002NCA6IEZvcm1TZWxlY3RNYXNrV29yZDY0OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW50ZWdlciBhbmQgTG9naWNhbCBPcGVyYXRpb25zOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIEFIdjhpMTY6CisgIFJSRm9ybTwwYjAwMDEwMDExMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAiYWhcdCRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyT3AsCisgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLCAoaW50X3NwdV9zaV9haCBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSldPjsKKworZGVmIDogUGF0PChhZGQgKHY4aTE2IFZFQ1JFRzokckEpLCAodjhpMTYgVkVDUkVHOiRyQikpLAorICAgICAgICAgIChBSHY4aTE2IFZFQ1JFRzokckEsIFZFQ1JFRzokckIpPjsKKworZGVmIEFIcjE2OgorICBSUkZvcm08MGIwMDAxMDAxMTAwMCwgKG91dHMgUjE2QzokclQpLCAoaW5zIFIxNkM6JHJBLCBSMTZDOiRyQiksCisgICAgImFoXHQkclQsICRyQSwgJHJCIiwgSW50ZWdlck9wLAorICAgIFsoc2V0IFIxNkM6JHJULCAoYWRkIFIxNkM6JHJBLCBSMTZDOiRyQikpXT47CisKK2RlZiBBSEl2ZWM6CisgICAgUkkxMEZvcm08MGIxMDExMTAwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgImFoaVx0JHJULCAkckEsICR2YWwiLCBJbnRlZ2VyT3AsCisgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIChhZGQgKHY4aTE2IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4aTE2U0V4dDEwSW1tOiR2YWwpKV0+OworCitkZWYgQUhJcjE2OgorICBSSTEwRm9ybTwwYjEwMTExMDAwLCAob3V0cyBSMTZDOiRyVCksIChpbnMgUjE2QzokckEsIHMxMGltbTokdmFsKSwKKyAgICAiYWhpXHQkclQsICRyQSwgJHZhbCIsIEludGVnZXJPcCwKKyAgICBbKHNldCBSMTZDOiRyVCwgKGFkZCBSMTZDOiRyQSwgaTE2SW1tU0V4dDEwOiR2YWwpKV0+OworCisvLyB2NGkzMiwgaTMyIGFkZCBpbnN0cnVjdGlvbjoKKworY2xhc3MgQUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICBSUkZvcm08MGIwMDAwMDAxMTAwMCwgT09MLCBJT0wsCisgICAgICAgICAiYVx0JHJULCAkckEsICRyQiIsIEludGVnZXJPcCwKKyAgICAgICAgIHBhdHRlcm4+OworCitjbGFzcyBBVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgIEFJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwgKGFkZCAodmVjdHlwZSBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3R5cGUgVkVDUkVHOiRyQikpKV0+OworCitjbGFzcyBBUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgIEFJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgICBbKHNldCByY2xhc3M6JHJULCAoYWRkIHJjbGFzczokckEsIHJjbGFzczokckIpKV0+OworICAgICAgICAKK211bHRpY2xhc3MgQWRkSW5zdHJ1Y3Rpb24geworICBkZWYgdjRpMzI6IEFWZWNJbnN0PHY0aTMyPjsKKyAgZGVmIHYxNmk4OiBBVmVjSW5zdDx2MTZpOD47CisgIGRlZiB2MmkzMjogQVZlY0luc3Q8djJpMzI+OworICBkZWYgcjMyOiAgIEFSZWdJbnN0PFIzMkM+OworfQorCitkZWZtIEEgOiBBZGRJbnN0cnVjdGlvbjsKKworY2xhc3MgQUlJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSSTEwRm9ybTwwYjAwMTExMDAwLCBPT0wsIElPTCwKKyAgICAgICAgICAgICAiYWlcdCRyVCwgJHJBLCAkdmFsIiwgSW50ZWdlck9wLAorICAgICAgICAgICAgIHBhdHRlcm4+OworCitjbGFzcyBBSVZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGUsIFBhdExlYWYgaW1tcHJlZD46CisgICAgQUlJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAoYWRkICh2ZWN0eXBlIFZFQ1JFRzokckEpLCBpbW1wcmVkOiR2YWwpKV0+OworCitjbGFzcyBBSUZQVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZSwgUGF0TGVhZiBpbW1wcmVkPjoKKyAgICBBSUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworY2xhc3MgQUlSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBQYXRMZWFmIGltbXByZWQ+OgorICAgIEFJSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCBzMTBpbW1faTMyOiR2YWwpLAorICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCAoYWRkIHJjbGFzczokckEsIGltbXByZWQ6JHZhbCkpXT47CisKKy8vIFRoaXMgaXMgdXNlZCB0byBhZGQgZXBzaWxvbnMgdG8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBpbiB0aGUgZjMyIGZkaXYgY29kZToKK2NsYXNzIEFJRlBJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBQYXRMZWFmIGltbXByZWQ+OgorICAgIEFJSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCBzMTBpbW1faTMyOiR2YWwpLAorICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCittdWx0aWNsYXNzIEFkZEltbWVkaWF0ZSB7CisgIGRlZiB2NGkzMjogQUlWZWNJbnN0PHY0aTMyLCB2NGkzMlNFeHQxMEltbT47CisKKyAgZGVmIHIzMjogQUlSZWdJbnN0PFIzMkMsIGkzMkltbVNFeHQxMD47CisKKyAgZGVmIHY0ZjMyOiBBSUZQVmVjSW5zdDx2NGYzMiwgdjRpMzJTRXh0MTBJbW0+OworICBkZWYgZjMyOiBBSUZQSW5zdDxSMzJGUCwgaTMySW1tU0V4dDEwPjsKK30KKworZGVmbSBBSSA6IEFkZEltbWVkaWF0ZTsKKworZGVmIFNGSHZlYzoKKyAgICBSUkZvcm08MGIwMDAxMDAxMDAwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAic2ZoXHQkclQsICRyQSwgJHJCIiwgSW50ZWdlck9wLAorICAgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLCAoc3ViICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYgVkVDUkVHOiRyQikpKV0+OworCitkZWYgU0ZIcjE2OgorICAgIFJSRm9ybTwwYjAwMDEwMDEwMDAwLCAob3V0cyBSMTZDOiRyVCksIChpbnMgUjE2QzokckEsIFIxNkM6JHJCKSwKKyAgICAgICJzZmhcdCRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyT3AsCisgICAgICBbKHNldCBSMTZDOiRyVCwgKHN1YiBSMTZDOiRyQiwgUjE2QzokckEpKV0+OworCitkZWYgU0ZISXZlYzoKKyAgICBSSTEwRm9ybTwwYjEwMTEwMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAic2ZoaVx0JHJULCAkckEsICR2YWwiLCBJbnRlZ2VyT3AsCisgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIChzdWIgdjhpMTZTRXh0MTBJbW06JHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYgVkVDUkVHOiRyQSkpKV0+OworCitkZWYgU0ZISXIxNiA6IFJJMTBGb3JtPDBiMTAxMTAwMDAsIChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgczEwaW1tOiR2YWwpLAorICAic2ZoaVx0JHJULCAkckEsICR2YWwiLCBJbnRlZ2VyT3AsCisgIFsoc2V0IFIxNkM6JHJULCAoc3ViIGkxNkltbVNFeHQxMDokdmFsLCBSMTZDOiRyQSkpXT47CisKK2RlZiBTRnZlYyA6IFJSRm9ybTwwYjAwMDAwMDEwMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAic2ZcdCRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyT3AsCisgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwgKHN1YiAodjRpMzIgVkVDUkVHOiRyQiksICh2NGkzMiBWRUNSRUc6JHJBKSkpXT47CisKK2RlZiBTRjJ2ZWMgOiBSUkZvcm08MGIwMDAwMDAxMDAwMCwgKG91dHMgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgInNmXHQkclQsICRyQSwgJHJCIiwgSW50ZWdlck9wLAorICBbKHNldCAodjJpMzIgVkVDUkVHOiRyVCksIChzdWIgKHYyaTMyIFZFQ1JFRzokckIpLCAodjJpMzIgVkVDUkVHOiRyQSkpKV0+OworCisKK2RlZiBTRnIzMiA6IFJSRm9ybTwwYjAwMDAwMDEwMDAwLCAob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgInNmXHQkclQsICRyQSwgJHJCIiwgSW50ZWdlck9wLAorICBbKHNldCBSMzJDOiRyVCwgKHN1YiBSMzJDOiRyQiwgUjMyQzokckEpKV0+OworCitkZWYgU0ZJdmVjOgorICAgIFJJMTBGb3JtPDBiMDAxMTAwMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICJzZmlcdCRyVCwgJHJBLCAkdmFsIiwgSW50ZWdlck9wLAorICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAoc3ViIHY0aTMyU0V4dDEwSW1tOiR2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIFZFQ1JFRzokckEpKSldPjsKKworZGVmIFNGSXIzMiA6IFJJMTBGb3JtPDBiMDAxMTAwMDAsIChvdXRzIFIzMkM6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIFIzMkM6JHJBLCBzMTBpbW1faTMyOiR2YWwpLAorICAic2ZpXHQkclQsICRyQSwgJHZhbCIsIEludGVnZXJPcCwKKyAgWyhzZXQgUjMyQzokclQsIChzdWIgaTMySW1tU0V4dDEwOiR2YWwsIFIzMkM6JHJBKSldPjsKKworLy8gQUREWDogb25seSBhdmFpbGFibGUgaW4gdmVjdG9yIGZvcm0sIGRvZXNuJ3QgbWF0Y2ggYSBwYXR0ZXJuLgorY2xhc3MgQUREWEluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybTwwYjAwMDAwMDEwMTEwLCBPT0wsIElPTCwKKyAgICAgICJhZGR4XHQkclQsICRyQSwgJHJCIiwKKyAgICAgIEludGVnZXJPcCwgcGF0dGVybj47CisKK2NsYXNzIEFERFhWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBBRERYSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIsIFZFQ1JFRzokckNhcnJ5KSwKKyAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+LAorICAgIFJlZ0NvbnN0cmFpbnQ8IiRyQ2FycnkgPSAkclQiPiwKKyAgICBOb0VuY29kZTwiJHJDYXJyeSI+OworCitjbGFzcyBBRERYUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgQUREWEluc3Q8KG91dHMgcmNsYXNzOiRyVCksCisgICAgICAgICAgICAgKGlucyByY2xhc3M6JHJBLCByY2xhc3M6JHJCLCByY2xhc3M6JHJDYXJyeSksCisgICAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPiwKKyAgICBSZWdDb25zdHJhaW50PCIkckNhcnJ5ID0gJHJUIj4sCisgICAgTm9FbmNvZGU8IiRyQ2FycnkiPjsKKworbXVsdGljbGFzcyBBZGRFeHRlbmRlZCB7CisgIGRlZiB2Mmk2NCA6IEFERFhWZWNJbnN0PHYyaTY0PjsKKyAgZGVmIHY0aTMyIDogQUREWFZlY0luc3Q8djRpMzI+OworICBkZWYgcjY0IDogQUREWFJlZ0luc3Q8UjY0Qz47CisgIGRlZiByMzIgOiBBRERYUmVnSW5zdDxSMzJDPjsKK30KKworZGVmbSBBRERYIDogQWRkRXh0ZW5kZWQ7CisKKy8vIENHOiBHZW5lcmF0ZSBjYXJyeSBmb3IgYWRkCitjbGFzcyBDR0luc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybTwwYjAxMDAwMDExMDAwLCBPT0wsIElPTCwKKyAgICAgICJjZ1x0JHJULCAkckEsICRyQiIsCisgICAgICBJbnRlZ2VyT3AsIHBhdHRlcm4+OworCitjbGFzcyBDR1ZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIENHSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworY2xhc3MgQ0dSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBDR0luc3Q8KG91dHMgcmNsYXNzOiRyVCksCisgICAgICAgICAgIChpbnMgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQiksCisgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK211bHRpY2xhc3MgQ2FycnlHZW5lcmF0ZSB7CisgIGRlZiB2Mmk2NCA6IENHVmVjSW5zdDx2Mmk2ND47CisgIGRlZiB2NGkzMiA6IENHVmVjSW5zdDx2NGkzMj47CisgIGRlZiByNjQgOiBDR1JlZ0luc3Q8UjY0Qz47CisgIGRlZiByMzIgOiBDR1JlZ0luc3Q8UjMyQz47Cit9CisKK2RlZm0gQ0cgOiBDYXJyeUdlbmVyYXRlOworCisvLyBTRlg6IFN1YnJhY3QgZnJvbSwgZXh0ZW5kZWQuIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEJHIHRvIHN1YnRyYWN0CisvLyB3aXRoIGNhcnJ5IChib3Jyb3csIGluIHRoaXMgY2FzZSkKK2NsYXNzIFNGWEluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybTwwYjEwMDAwMDEwMTEwLCBPT0wsIElPTCwKKyAgICAgICJzZnhcdCRyVCwgJHJBLCAkckIiLAorICAgICAgSW50ZWdlck9wLCBwYXR0ZXJuPjsKKworY2xhc3MgU0ZYVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgU0ZYSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiwgVkVDUkVHOiRyQ2FycnkpLAorICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT4sCisgICAgUmVnQ29uc3RyYWludDwiJHJDYXJyeSA9ICRyVCI+LAorICAgIE5vRW5jb2RlPCIkckNhcnJ5Ij47CisKK2NsYXNzIFNGWFJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIFNGWEluc3Q8KG91dHMgcmNsYXNzOiRyVCksCisgICAgICAgICAgICAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIsIHJjbGFzczokckNhcnJ5KSwKKyAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+LAorICAgIFJlZ0NvbnN0cmFpbnQ8IiRyQ2FycnkgPSAkclQiPiwKKyAgICBOb0VuY29kZTwiJHJDYXJyeSI+OworCittdWx0aWNsYXNzIFN1YnRyYWN0RXh0ZW5kZWQgeworICBkZWYgdjJpNjQgOiBTRlhWZWNJbnN0PHYyaTY0PjsKKyAgZGVmIHY0aTMyIDogU0ZYVmVjSW5zdDx2NGkzMj47CisgIGRlZiByNjQgOiBTRlhSZWdJbnN0PFI2NEM+OworICBkZWYgcjMyIDogU0ZYUmVnSW5zdDxSMzJDPjsKK30KKworZGVmbSBTRlggOiBTdWJ0cmFjdEV4dGVuZGVkOworCisvLyBCRzogb25seSBhdmFpbGFibGUgaW4gdmVjdG9yIGZvcm0sIGRvZXNuJ3QgbWF0Y2ggYSBwYXR0ZXJuLgorY2xhc3MgQkdJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm08MGIwMTAwMDAxMDAwMCwgT09MLCBJT0wsCisgICAgICAiYmdcdCRyVCwgJHJBLCAkckIiLAorICAgICAgSW50ZWdlck9wLCBwYXR0ZXJuPjsKKworY2xhc3MgQkdWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBCR0luc3Q8KG91dHMgVkVDUkVHOiRyVCksCisgICAgICAgICAgIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2NsYXNzIEJHUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgQkdJbnN0PChvdXRzIHJjbGFzczokclQpLAorICAgICAgICAgICAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCittdWx0aWNsYXNzIEJvcnJvd0dlbmVyYXRlIHsKKyAgZGVmIHY0aTMyIDogQkdWZWNJbnN0PHY0aTMyPjsKKyAgZGVmIHYyaTY0IDogQkdWZWNJbnN0PHYyaTY0PjsKKyAgZGVmIHI2NCA6IEJHUmVnSW5zdDxSNjRDPjsKKyAgZGVmIHIzMiA6IEJHUmVnSW5zdDxSMzJDPjsKK30KKworZGVmbSBCRyA6IEJvcnJvd0dlbmVyYXRlOworCisvLyBCR1g6IEJvcnJvdyBnZW5lcmF0ZSwgZXh0ZW5kZWQuCitkZWYgQkdYdmVjOgorICAgIFJSRm9ybTwwYjExMDAwMDEwMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRUNSRUc6JHJDYXJyeSksCisgICAgICAiYmd4XHQkclQsICRyQSwgJHJCIiwgSW50ZWdlck9wLAorICAgICAgW10+LAorICAgIFJlZ0NvbnN0cmFpbnQ8IiRyQ2FycnkgPSAkclQiPiwKKyAgICBOb0VuY29kZTwiJHJDYXJyeSI+OworCisvLyBIYWxmd29yZCBtdWx0aXBseSB2YXJpYW50czoKKy8vIE4uQjogVGhlc2UgY2FuIGJlIHVzZWQgdG8gYnVpbGQgdXAgbGFyZ2VyIHF1YW50aXRpZXMgKDE2eDE2IC0+IDMyKQorCitkZWYgTVBZdjhpMTY6CisgIFJSRm9ybTwwYjAwMTAwMDExMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAibXB5XHQkclQsICRyQSwgJHJCIiwgSW50ZWdlck11bERpdiwKKyAgICBbLyogbm8gcGF0dGVybiAqL10+OworCitkZWYgTVBZcjE2OgorICBSUkZvcm08MGIwMDEwMDAxMTExMCwgKG91dHMgUjE2QzokclQpLCAoaW5zIFIxNkM6JHJBLCBSMTZDOiRyQiksCisgICAgIm1weVx0JHJULCAkckEsICRyQiIsIEludGVnZXJNdWxEaXYsCisgICAgWyhzZXQgUjE2QzokclQsIChtdWwgUjE2QzokckEsIFIxNkM6JHJCKSldPjsKKworLy8gVW5zaWduZWQgMTYtYml0IG11bHRpcGx5OgorCitjbGFzcyBNUFlVSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMDAxMTAwMTExMTAsIE9PTCwgSU9MLAorICAgICAgIm1weXVcdCRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyTXVsRGl2LAorICAgICAgcGF0dGVybj47CisKK2RlZiBNUFlVdjRpMzI6CisgIE1QWVVJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCitkZWYgTVBZVXYyaTMyOgorICBNUFlVSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworZGVmIE1QWVVyMTY6CisgIE1QWVVJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjE2QzokckIpLAorICAgICAgICAgICBbKHNldCBSMzJDOiRyVCwgKG11bCAoemV4dCBSMTZDOiRyQSksICh6ZXh0IFIxNkM6JHJCKSkpXT47CisKK2RlZiBNUFlVcjMyOgorICBNUFlVSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworLy8gbXB5aTogbXVsdGlwbHkgMTYgeCBzMTBpbW0gLT4gMzIgcmVzdWx0LgorCitjbGFzcyBNUFlJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgIFJJMTBGb3JtPDBiMDAxMDExMTAsIE9PTCwgSU9MLAorICAgICJtcHlpXHQkclQsICRyQSwgJHZhbCIsIEludGVnZXJNdWxEaXYsCisgICAgcGF0dGVybj47CisKK2RlZiBNUFlJdmVjOgorICBNUFlJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgIFsoc2V0ICh2OGkxNiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgKG11bCAodjhpMTYgVkVDUkVHOiRyQSksIHY4aTE2U0V4dDEwSW1tOiR2YWwpKV0+OworCitkZWYgTVBZSXIxNjoKKyAgTVBZSUluc3Q8KG91dHMgUjE2QzokclQpLCAoaW5zIFIxNkM6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgIFsoc2V0IFIxNkM6JHJULCAobXVsIFIxNkM6JHJBLCBpMTZJbW1TRXh0MTA6JHZhbCkpXT47CisKKy8vIG1weXVpOiBzYW1lIGlzc3VlcyBhcyBvdGhlciBtdWx0aXBsaWVzLCBwbHVzLCB0aGlzIGRvZXNuJ3QgbWF0Y2ggYQorLy8gcGF0dGVybi4uLiBidXQgbWF5IGJlIHVzZWQgZHVyaW5nIHRhcmdldCBEQUcgc2VsZWN0aW9uIG9yIGxvd2VyaW5nCisKK2NsYXNzIE1QWVVJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgIFJJMTBGb3JtPDBiMTAxMDExMTAsIE9PTCwgSU9MLAorICAgICAgICAgICAibXB5dWlcdCRyVCwgJHJBLCAkdmFsIiwgSW50ZWdlck11bERpdiwKKyAgICAgICAgICAgcGF0dGVybj47CisgICAgCitkZWYgTVBZVUl2ZWM6CisgIE1QWVVJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgICBbXT47CisKK2RlZiBNUFlVSXIxNjoKKyAgTVBZVUlJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgICAgICAgW10+OworCisvLyBtcHlhOiAxNiB4IDE2ICsgMTYgLT4gMzIgYml0IHJlc3VsdAorY2xhc3MgTVBZQUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICBSUlJGb3JtPDBiMDAxMSwgT09MLCBJT0wsCisgICAgICAgICAgIm1weWFcdCRyVCwgJHJBLCAkckIsICRyQyIsIEludGVnZXJNdWxEaXYsCisgICAgICAgICAgcGF0dGVybj47CisgICAgICAgICAgCitkZWYgTVBZQXY0aTMyOgorICBNUFlBSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAoYWRkICh2NGkzMiAoYml0Y29udmVydCAobXVsICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYgVkVDUkVHOiRyQikpKSksCisgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIFZFQ1JFRzokckMpKSldPjsKKworZGVmIE1QWUFyMzI6CisgIE1QWUFJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjE2QzokckIsIFIzMkM6JHJDKSwKKyAgICAgICAgICAgWyhzZXQgUjMyQzokclQsIChhZGQgKHNleHQgKG11bCBSMTZDOiRyQSwgUjE2QzokckIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUjMyQzokckMpKV0+OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2RlZiBNUFlBcjMyX3NleHQ6CisgIE1QWUFJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjE2QzokckIsIFIzMkM6JHJDKSwKKyAgICAgICAgICAgWyhzZXQgUjMyQzokclQsIChhZGQgKG11bCAoc2V4dCBSMTZDOiRyQSksIChzZXh0IFIxNkM6JHJCKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIzMkM6JHJDKSldPjsKKworZGVmIE1QWUFyMzJfc2V4dGlucmVnOgorICBNUFlBSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCLCBSMzJDOiRyQyksCisgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAoYWRkIChtdWwgKHNleHRfaW5yZWcgUjMyQzokckEsIGkxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNleHRfaW5yZWcgUjMyQzokckIsIGkxNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSMzJDOiRyQykpXT47CisKKy8vIG1weWg6IG11bHRpcGx5IGhpZ2gsIHVzZWQgdG8gc3ludGhlc2l6ZSAzMi1iaXQgbXVsdGlwbGllcworY2xhc3MgTVBZSEluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICBSUkZvcm08MGIxMDEwMDAxMTExMCwgT09MLCBJT0wsCisgICAgICAgICAibXB5aFx0JHJULCAkckEsICRyQiIsIEludGVnZXJNdWxEaXYsCisgICAgICAgICBwYXR0ZXJuPjsKKyAgICAgICAgIAorZGVmIE1QWUh2NGkzMjoKKyAgICBNUFlISW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCitkZWYgTVBZSHYyaTMyOgorICAgIE1QWUhJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2RlZiBNUFlIcjMyOgorICAgIE1QWUhJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMzJDOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKKy8vIG1weXM6IG11bHRpcGx5IGhpZ2ggYW5kIHNoaWZ0IHJpZ2h0IChyZXR1cm5zIHRoZSB0b3AgaGFsZiBvZgorLy8gYSAxNi1iaXQgbXVsdGlwbHksIHNpZ24gZXh0ZW5kZWQgdG8gMzIgYml0cy4pCisKK2NsYXNzIE1QWVNJbnN0PGRhZyBPT0wsIGRhZyBJT0w+OgorICAgIFJSRm9ybTwwYjExMTAwMDExMTEwLCBPT0wsIElPTCwgCisgICAgICAibXB5c1x0JHJULCAkckEsICRyQiIsIEludGVnZXJNdWxEaXYsCisgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCitkZWYgTVBZU3Y0aTMyOgorICAgIE1QWVNJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpPjsKKyAgICAKK2RlZiBNUFlTcjE2OgorICAgIE1QWVNJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjE2QzokckIpPjsKKworLy8gbXB5aGg6IG11bHRpcGx5IGhpZ2gtaGlnaCAocmV0dXJucyB0aGUgMzItYml0IHJlc3VsdCBmcm9tIG11bHRpcGx5aW5nCisvLyB0aGUgdG9wIDE2IGJpdHMgb2YgdGhlICRyQSwgJHJCKQorCitjbGFzcyBNUFlISEluc3Q8ZGFnIE9PTCwgZGFnIElPTD46CisgIFJSRm9ybTwwYjAxMTAwMDExMTEwLCBPT0wsIElPTCwKKyAgICAgICAgIm1weWhoXHQkclQsICRyQSwgJHJCIiwgSW50ZWdlck11bERpdiwKKyAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKyAgICAgICAgCitkZWYgTVBZSEh2OGkxNjoKKyAgICBNUFlISEluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQik+OworCitkZWYgTVBZSEhyMzI6CisgICAgTVBZSEhJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMzJDOiRyQSwgUjMyQzokckIpPjsKKworLy8gbXB5aGhhOiBNdWx0aXBseSBoaWdoLWhpZ2gsIGFkZCB0byAkclQ6CisKK2NsYXNzIE1QWUhIQUluc3Q8ZGFnIE9PTCwgZGFnIElPTD46CisgICAgUlJGb3JtPDBiMDExMDAwMTAxMTAsIE9PTCwgSU9MLAorICAgICAgIm1weWhoYVx0JHJULCAkckEsICRyQiIsIEludGVnZXJNdWxEaXYsCisgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCitkZWYgTVBZSEhBdmVjOgorICAgIE1QWUhIQUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQik+OworICAgIAorZGVmIE1QWUhIQXIzMjoKKyAgICBNUFlISEFJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMzJDOiRyQSwgUjMyQzokckIpPjsKKworLy8gbXB5aGh1OiBNdWx0aXBseSBoaWdoLWhpZ2gsIHVuc2lnbmVkLCBlLmcuOgorLy8KKy8vICstLS0tLS0tKy0tLS0tLS0rICAgKy0tLS0tLS0rLS0tLS0tLSsgICArLS0tLS0tLS0tKworLy8gfCAgYTAgICAuICBhMSAgIHwgeCB8ICBiMCAgIC4gIGIxICAgfCA9IHwgYTAgeCBiMCB8CisvLyArLS0tLS0tLSstLS0tLS0tKyAgICstLS0tLS0tKy0tLS0tLS0rICAgKy0tLS0tLS0tLSsKKy8vCisvLyB3aGVyZSBhMCwgYjAgYXJlIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSAzMi1iaXQgd29yZAorCitjbGFzcyBNUFlISFVJbnN0PGRhZyBPT0wsIGRhZyBJT0w+OgorICAgIFJSRm9ybTwwYjAxMTEwMDExMTEwLCBPT0wsIElPTCwKKyAgICAgICJtcHloaHVcdCRyVCwgJHJBLCAkckIiLCBJbnRlZ2VyTXVsRGl2LAorICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworZGVmIE1QWUhIVXY0aTMyOgorICAgIE1QWUhIVUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQik+OworICAgIAorZGVmIE1QWUhIVXIzMjoKKyAgICBNUFlISFVJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMzJDOiRyQSwgUjMyQzokckIpPjsKKworLy8gbXB5aGhhdTogTXVsdGlwbHkgaGlnaC1oaWdoLCB1bnNpZ25lZAorCitjbGFzcyBNUFlISEFVSW5zdDxkYWcgT09MLCBkYWcgSU9MPjoKKyAgICBSUkZvcm08MGIwMTExMDAxMDExMCwgT09MLCBJT0wsCisgICAgICAibXB5aGhhdVx0JHJULCAkckEsICRyQiIsIEludGVnZXJNdWxEaXYsCisgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCitkZWYgTVBZSEhBVXZlYzoKKyAgICBNUFlISEFVSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKT47CisgICAgCitkZWYgTVBZSEhBVXIzMjoKKyAgICBNUFlISEFVSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCKT47CisKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorLy8gY2x6OiBDb3VudCBsZWFkaW5nIHplcm9lcworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CitjbGFzcyBDTFpJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm1fMTwwYjEwMTAwMTAxMDEwLCBPT0wsIElPTCwgImNselx0JHJULCAkckEiLAorICAgICAgICAgICAgIEludGVnZXJPcCwgcGF0dGVybj47CisKK2NsYXNzIENMWlJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIENMWkluc3Q8KG91dHMgcmNsYXNzOiRyVCksIChpbnMgcmNsYXNzOiRyQSksCisgICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCAoY3RseiByY2xhc3M6JHJBKSldPjsKKworY2xhc3MgQ0xaVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgQ0xaSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAoY3RseiAodmVjdHlwZSBWRUNSRUc6JHJBKSkpXT47CisKK211bHRpY2xhc3MgQ291bnRMZWFkaW5nWmVyb2VzIHsKKyAgZGVmIHY0aTMyIDogQ0xaVmVjSW5zdDx2NGkzMj47CisgIGRlZiByMzIgICA6IENMWlJlZ0luc3Q8UjMyQz47Cit9CisKK2RlZm0gQ0xaIDogQ291bnRMZWFkaW5nWmVyb2VzOworCisvLyBjbnRiOiBDb3VudCBvbmVzIGluIGJ5dGVzIChha2EgInBvcHVsYXRpb24gY291bnQiKQorLy8KKy8vIE5PVEU6IFRoaXMgaW5zdHJ1Y3Rpb24gaXMgcmVhbGx5IGEgdmVjdG9yIGluc3RydWN0aW9uLCBidXQgdGhlIGN1c3RvbQorLy8gbG93ZXJpbmcgY29kZSB1c2VzIGl0IGluIHVub3J0aG9kb3ggd2F5cyB0byBzdXBwb3J0IENUUE9QIGZvciBvdGhlcgorLy8gZGF0YSB0eXBlcyEKKworZGVmIENOVEJ2MTZpODoKKyAgICBSUkZvcm1fMTwwYjAwMTAxMTAxMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBKSwKKyAgICAgICJjbnRiXHQkclQsICRyQSIsIEludGVnZXJPcCwKKyAgICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwgKFNQVWNudGIgKHYxNmk4IFZFQ1JFRzokckEpKSldPjsKKworZGVmIENOVEJ2OGkxNiA6CisgICAgUlJGb3JtXzE8MGIwMDEwMTEwMTAxMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSksCisgICAgICAiY250Ylx0JHJULCAkckEiLCBJbnRlZ2VyT3AsCisgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIChTUFVjbnRiICh2OGkxNiBWRUNSRUc6JHJBKSkpXT47CisKK2RlZiBDTlRCdjRpMzIgOgorICAgIFJSRm9ybV8xPDBiMDAxMDExMDEwMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEpLAorICAgICAgImNudGJcdCRyVCwgJHJBIiwgSW50ZWdlck9wLAorICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLCAoU1BVY250YiAodjRpMzIgVkVDUkVHOiRyQSkpKV0+OworCisvLyBnYmI6IEdhdGhlciB0aGUgbG93IG9yZGVyIGJpdHMgZnJvbSBlYWNoIGJ5dGUgaW4gJHJBIGludG8gYSBzaW5nbGUgMTYtYml0CisvLyBxdWFudGl0eSBzdG9yZWQgaW50byAkclQncyBzbG90IDAsIHVwcGVyIDE2IGJpdHMgYXJlIHplcm9lZCwgYXMgYXJlCisvLyBzbG90cyAxLTMuCisvLworLy8gTm90ZTogVGhpcyBpbnN0cnVjdGlvbiAicGFpcnMiIHdpdGggdGhlIGZzbWIgaW5zdHJ1Y3Rpb24gZm9yIGFsbCBvZiB0aGUKKy8vIHZhcmlvdXMgdHlwZXMgZGVmaW5lZCBoZXJlLgorLy8KKy8vIE5vdGUgMjogVGhlICJWZWNJbnN0IiBhbmQgIlJlZ0luc3QiIGZvcm1zIHJlZmVyIHRvIHRoZSByZXN1bHQgYmVpbmcgZWl0aGVyCisvLyBhIHZlY3RvciBvciByZWdpc3Rlci4KKworY2xhc3MgR0JCSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgIFJSRm9ybV8xPDBiMDEwMDExMDExMDAsIE9PTCwgSU9MLCAiZ2JiXHQkclQsICRyQSIsIEdhdGhlck9wLCBwYXR0ZXJuPjsKKworY2xhc3MgR0JCUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcywgVmFsdWVUeXBlIHZlY3R5cGU+OgorICBHQkJJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIFZFQ1JFRzokckEpLAorICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2NsYXNzIEdCQlZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICBHQkJJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEpLAorICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK211bHRpY2xhc3MgR2F0aGVyQml0c0Zyb21CeXRlcyB7CisgIGRlZiB2MTZpOF9yMzI6IEdCQlJlZ0luc3Q8UjMyQywgdjE2aTg+OworICBkZWYgdjE2aThfcjE2OiBHQkJSZWdJbnN0PFIxNkMsIHYxNmk4PjsKKyAgZGVmIHYxNmk4OiAgICAgR0JCVmVjSW5zdDx2MTZpOD47Cit9CisKK2RlZm0gR0JCOiBHYXRoZXJCaXRzRnJvbUJ5dGVzOworCisvLyBnYmg6IEdhdGhlciBhbGwgbG93IG9yZGVyIGJpdHMgZnJvbSBlYWNoIGhhbGZ3b3JkIGluICRyQSBpbnRvIGEgc2luZ2xlCisvLyA4LWJpdCBxdWFudGl0eSBzdG9yZWQgaW4gJHJUJ3Mgc2xvdCAwLCB3aXRoIHRoZSB1cHBlciBiaXRzIG9mICRyVCBzZXQgdG8gMAorLy8gYW5kIHNsb3RzIDEtMyBhbHNvIHNldCB0byAwLgorLy8KKy8vIFNlZSBub3RlcyBmb3IgR0JCSW5zdCwgYWJvdmUuCisKK2NsYXNzIEdCSEluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybV8xPDBiMTAwMDExMDExMDAsIE9PTCwgSU9MLCAiZ2JoXHQkclQsICRyQSIsIEdhdGhlck9wLAorICAgICAgICAgICAgIHBhdHRlcm4+OworCitjbGFzcyBHQkhSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgR0JISW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2NsYXNzIEdCSFZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIEdCSEluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSksCisgICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCittdWx0aWNsYXNzIEdhdGhlckJpdHNIYWxmd29yZCB7CisgIGRlZiB2OGkxNl9yMzI6IEdCSFJlZ0luc3Q8UjMyQywgdjhpMTY+OworICBkZWYgdjhpMTZfcjE2OiBHQkhSZWdJbnN0PFIxNkMsIHY4aTE2PjsKKyAgZGVmIHY4aTE2OiAgICAgR0JIVmVjSW5zdDx2OGkxNj47Cit9CisKK2RlZm0gR0JIOiBHYXRoZXJCaXRzSGFsZndvcmQ7CisKKy8vIGdiOiBHYXRoZXIgYWxsIGxvdyBvcmRlciBiaXRzIGZyb20gZWFjaCB3b3JkIGluICRyQSBpbnRvIGEgc2luZ2xlCisvLyA0LWJpdCBxdWFudGl0eSBzdG9yZWQgaW4gJHJUJ3Mgc2xvdCAwLCB1cHBlciBiaXRzIGluICRyVCBzZXQgdG8gMCwKKy8vIGFzIHdlbGwgYXMgc2xvdHMgMS0zLgorLy8KKy8vIFNlZSBub3RlcyBmb3IgZ2JiLCBhYm92ZS4KKworY2xhc3MgR0JJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm1fMTwwYjAwMDAxMTAxMTAwLCBPT0wsIElPTCwgImdiXHQkclQsICRyQSIsIEdhdGhlck9wLAorICAgICAgICAgICAgIHBhdHRlcm4+OworCitjbGFzcyBHQlJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3MsIFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBHQkluc3Q8KG91dHMgcmNsYXNzOiRyVCksIChpbnMgVkVDUkVHOiRyQSksCisgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2NsYXNzIEdCVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgR0JJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEpLAorICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCittdWx0aWNsYXNzIEdhdGhlckJpdHNXb3JkIHsKKyAgZGVmIHY0aTMyX3IzMjogR0JSZWdJbnN0PFIzMkMsIHY0aTMyPjsKKyAgZGVmIHY0aTMyX3IxNjogR0JSZWdJbnN0PFIxNkMsIHY0aTMyPjsKKyAgZGVmIHY0aTMyOiAgICAgR0JWZWNJbnN0PHY0aTMyPjsKK30KKworZGVmbSBHQjogR2F0aGVyQml0c1dvcmQ7CisKKy8vIGF2Z2I6IGF2ZXJhZ2UgYnl0ZXMKK2RlZiBBVkdCOgorICAgIFJSRm9ybTwwYjExMDAxMDExMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICJhdmdiXHQkclQsICRyQSwgJHJCIiwgQnl0ZU9wLAorICAgICAgW10+OworCisvLyBhYnNkYjogYWJzb2x1dGUgZGlmZmVyZW5jZSBvZiBieXRlcworZGVmIEFCU0RCOgorICAgIFJSRm9ybTwwYjExMDAxMDEwMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICJhYnNkYlx0JHJULCAkckEsICRyQiIsIEJ5dGVPcCwKKyAgICAgIFtdPjsKKworLy8gc3VtYjogc3VtIGJ5dGVzIGludG8gaGFsZndvcmRzCitkZWYgU1VNQjoKKyAgICBSUkZvcm08MGIxMTAwMTAxMDAxMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAic3VtYlx0JHJULCAkckEsICRyQiIsIEJ5dGVPcCwKKyAgICAgIFtdPjsKKworLy8gU2lnbiBleHRlbnNpb24gb3BlcmF0aW9uczoKK2NsYXNzIFhTQkhJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm1fMTwwYjAxMTAxMTAxMDEwLCBPT0wsIElPTCwKKyAgICAgICJ4c2JoXHQkckRzdCwgJHJTcmMiLAorICAgICAgSW50ZWdlck9wLCBwYXR0ZXJuPjsKKworY2xhc3MgWFNCSEluUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcywgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFhTQkhJbnN0PChvdXRzIHJjbGFzczokckRzdCksIChpbnMgcmNsYXNzOiRyU3JjKSwKKyAgICAgICAgICAgICBwYXR0ZXJuPjsKKworbXVsdGljbGFzcyBFeHRlbmRCeXRlSGFsZndvcmQgeworICBkZWYgdjE2aTg6ICAgICBYU0JISW5zdDwob3V0cyBWRUNSRUc6JHJEc3QpLCAoaW5zIFZFQ1JFRzokclNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgIC8qKHNldCAodjhpMTYgVkVDUkVHOiRyRHN0KSwgKHNleHQgKHY4aTE2IFZFQ1JFRzokclNyYykpKSovXT47CisgIGRlZiByODogICAgICAgIFhTQkhJbnN0PChvdXRzIFIxNkM6JHJEc3QpLCAoaW5zIFI4QzokclNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIxNkM6JHJEc3QsIChzZXh0IFI4QzokclNyYykpXT47CisgIGRlZiByMTY6ICAgICAgIFhTQkhJblJlZ0luc3Q8UjE2QywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMTZDOiRyRHN0LCAoc2V4dF9pbnJlZyBSMTZDOiRyU3JjLCBpOCkpXT47CisKKyAgLy8gMzItYml0IGZvcm0gZm9yIFhTQkg6IHVzZWQgdG8gc2lnbiBleHRlbmQgOC1iaXQgcXVhbnRpdGllcyB0byAxNi1iaXQKKyAgLy8gcXVhbnRpdGllcyB0byAzMi1iaXQgcXVhbnRpdGllcyB2aWEgYSAzMi1iaXQgcmVnaXN0ZXIgKHNlZSB0aGUgc2V4dCA4LT4zMgorICAvLyBwYXR0ZXJuIGJlbG93KS4gSW50ZW50aW9uYWxseSBkb2Vzbid0IG1hdGNoIGEgcGF0dGVybiBiZWNhdXNlIHdlIHdhbnQgdGhlCisgIC8vIHNleHQgOC0+MzIgcGF0dGVybiB0byBkbyB0aGUgd29yayBmb3IgdXMsIG5hbWVseSBiZWNhdXNlIHdlIG5lZWQgdGhlIGV4dHJhCisgIC8vIFhTSFdyMzIuCisgIGRlZiByMzI6ICAgWFNCSEluUmVnSW5zdDxSMzJDLCBbLyogbm8gcGF0dGVybiAqL10+OworICAKKyAgLy8gU2FtZSBhcyB0aGUgMzItYml0IHZlcnNpb24sIGJ1dCBmb3IgaTY0CisgIGRlZiByNjQ6ICAgWFNCSEluUmVnSW5zdDxSNjRDLCBbLyogbm8gcGF0dGVybiAqL10+OworfQorCitkZWZtIFhTQkggOiBFeHRlbmRCeXRlSGFsZndvcmQ7CisKKy8vIFNpZ24gZXh0ZW5kIGhhbGZ3b3JkcyB0byB3b3JkczoKKworY2xhc3MgWFNIV0luc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybV8xPDBiMDExMDExMDEwMTAsIE9PTCwgSU9MLCAieHNod1x0JHJEZXN0LCAkclNyYyIsCisgICAgICAgICAgICBJbnRlZ2VyT3AsIHBhdHRlcm4+OworCitjbGFzcyBYU0hXVmVjSW5zdDxWYWx1ZVR5cGUgaW5fdmVjdHlwZSwgVmFsdWVUeXBlIG91dF92ZWN0eXBlPjoKKyAgICBYU0hXSW5zdDwob3V0cyBWRUNSRUc6JHJEZXN0KSwgKGlucyBWRUNSRUc6JHJTcmMpLAorICAgICAgICAgICAgIFsoc2V0IChvdXRfdmVjdHlwZSBWRUNSRUc6JHJEZXN0KSwKKyAgICAgICAgICAgICAgICAgICAoc2V4dCAoaW5fdmVjdHlwZSBWRUNSRUc6JHJTcmMpKSldPjsKKworY2xhc3MgWFNIV0luUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcywgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFhTSFdJbnN0PChvdXRzIHJjbGFzczokckRlc3QpLCAoaW5zIHJjbGFzczokclNyYyksCisgICAgICAgICAgICAgcGF0dGVybj47CisgICAgICAgICAgICAgCitjbGFzcyBYU0hXUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgWFNIV0luc3Q8KG91dHMgcmNsYXNzOiRyRGVzdCksIChpbnMgUjE2QzokclNyYyksCisgICAgICAgICAgICAgWyhzZXQgcmNsYXNzOiRyRGVzdCwgKHNleHQgUjE2QzokclNyYykpXT47CisKK211bHRpY2xhc3MgRXh0ZW5kSGFsZndvcmRXb3JkIHsKKyAgZGVmIHY0aTMyOiBYU0hXVmVjSW5zdDx2NGkzMiwgdjhpMTY+OworICAKKyAgZGVmIHIxNjogICBYU0hXUmVnSW5zdDxSMzJDPjsKKyAgCisgIGRlZiByMzI6ICAgWFNIV0luUmVnSW5zdDxSMzJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMzJDOiRyRGVzdCwgKHNleHRfaW5yZWcgUjMyQzokclNyYywgaTE2KSldPjsKKyAgZGVmIHI2NDogICBYU0hXSW5SZWdJbnN0PFI2NEMsIFsvKiBubyBwYXR0ZXJuICovXT47Cit9CisKK2RlZm0gWFNIVyA6IEV4dGVuZEhhbGZ3b3JkV29yZDsKKworLy8gU2lnbi1leHRlbmQgd29yZHMgdG8gZG91Ymxld29yZHMgKDMyLT42NCBiaXRzKQorCitjbGFzcyBYU1dESW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtXzE8MGIwMTEwMDEwMTAxMCwgT09MLCBJT0wsICJ4c3dkXHQkckRzdCwgJHJTcmMiLAorICAgICAgICAgICAgICBJbnRlZ2VyT3AsIHBhdHRlcm4+OworICAgICAgCitjbGFzcyBYU1dEVmVjSW5zdDxWYWx1ZVR5cGUgaW5fdmVjdHlwZSwgVmFsdWVUeXBlIG91dF92ZWN0eXBlPjoKKyAgICBYU1dESW5zdDwob3V0cyBWRUNSRUc6JHJEc3QpLCAoaW5zIFZFQ1JFRzokclNyYyksCisgICAgICAgICAgICAgWy8qKHNldCAob3V0X3ZlY3R5cGUgVkVDUkVHOiRyRHN0KSwKKyAgICAgICAgICAgICAgICAgICAoc2V4dCAob3V0X3ZlY3R5cGUgVkVDUkVHOiRyU3JjKSkpKi9dPjsKKyAgICAgIAorY2xhc3MgWFNXRFJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyBpbl9yY2xhc3MsIFJlZ2lzdGVyQ2xhc3Mgb3V0X3JjbGFzcz46CisgICAgWFNXREluc3Q8KG91dHMgb3V0X3JjbGFzczokckRzdCksIChpbnMgaW5fcmNsYXNzOiRyU3JjKSwKKyAgICAgICAgICAgICBbKHNldCBvdXRfcmNsYXNzOiRyRHN0LCAoc2V4dCBpbl9yY2xhc3M6JHJTcmMpKV0+OworICAgICAgICAgICAgIAorbXVsdGljbGFzcyBFeHRlbmRXb3JkVG9Eb3VibGVXb3JkIHsKKyAgZGVmIHYyaTY0OiBYU1dEVmVjSW5zdDx2NGkzMiwgdjJpNjQ+OworICBkZWYgcjY0OiAgIFhTV0RSZWdJbnN0PFIzMkMsIFI2NEM+OworICAKKyAgZGVmIHI2NF9pbnJlZzogWFNXREluc3Q8KG91dHMgUjY0QzokckRzdCksIChpbnMgUjY0QzokclNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFI2NEM6JHJEc3QsIChzZXh0X2lucmVnIFI2NEM6JHJTcmMsIGkzMikpXT47Cit9CisKK2RlZm0gWFNXRCA6IEV4dGVuZFdvcmRUb0RvdWJsZVdvcmQ7CisKKy8vIEFORCBvcGVyYXRpb25zCisKK2NsYXNzIEFOREluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgICBSUkZvcm08MGIxMDAwMDAxMTAwMCwgT09MLCBJT0wsICJhbmRcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBJbnRlZ2VyT3AsIHBhdHRlcm4+OworCitjbGFzcyBBTkRWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBBTkRJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAoYW5kICh2ZWN0eXBlIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0eXBlIFZFQ1JFRzokckIpKSldPjsKKworY2xhc3MgQU5EUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgQU5ESW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSwKKyAgICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCAoYW5kIHJjbGFzczokckEsIHJjbGFzczokckIpKV0+OworCittdWx0aWNsYXNzIEJpdHdpc2VBbmQKK3sKKyAgZGVmIHYxNmk4OiBBTkRWZWNJbnN0PHYxNmk4PjsKKyAgZGVmIHY4aTE2OiBBTkRWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHY0aTMyOiBBTkRWZWNJbnN0PHY0aTMyPjsKKyAgZGVmIHYyaTY0OiBBTkRWZWNJbnN0PHYyaTY0PjsKKworICBkZWYgcjEyODogIEFORFJlZ0luc3Q8R1BSQz47CisgIGRlZiByNjQ6ICAgQU5EUmVnSW5zdDxSNjRDPjsKKyAgZGVmIHIzMjogICBBTkRSZWdJbnN0PFIzMkM+OworICBkZWYgcjE2OiAgIEFORFJlZ0luc3Q8UjE2Qz47CisgIGRlZiByODogICAgQU5EUmVnSW5zdDxSOEM+OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFNwZWNpYWwgaW5zdHJ1Y3Rpb25zIHRvIHBlcmZvcm0gdGhlIGZhYnMgaW5zdHJ1Y3Rpb24KKyAgZGVmIGZhYnMzMjogQU5ESW5zdDwob3V0cyBSMzJGUDokclQpLCAoaW5zIFIzMkZQOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgICAgICAgICAgICAgIFsvKiBJbnRlbnRpb25hbGx5IGRvZXMgbm90IG1hdGNoIGEgcGF0dGVybiAqL10+OworCisgIGRlZiBmYWJzNjQ6IEFOREluc3Q8KG91dHMgUjY0RlA6JHJUKSwgKGlucyBSNjRGUDokckEsIFI2NEM6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgICBbLyogSW50ZW50aW9uYWxseSBkb2VzIG5vdCBtYXRjaCBhIHBhdHRlcm4gKi9dPjsKKworICBkZWYgZmFic3ZlYzogQU5ESW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgWy8qIEludGVudGlvbmFsbHkgZG9lcyBub3QgbWF0Y2ggYSBwYXR0ZXJuICovXT47CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBIYWNrZWQgZm9ybSBvZiBBTkQgdG8gemVyby1leHRlbmQgMTYtYml0IHF1YW50aXRpZXMgdG8gMzItYml0CisgIC8vIHF1YW50aXRpZXMgLS0gc2VlIDE2LT4zMiB6ZXh0IHBhdHRlcm4uCisgIC8vCisgIC8vIFRoaXMgcGF0dGVybiBpcyBzb21ld2hhdCBhcnRpZmljaWFsLCBzaW5jZSBpdCBtaWdodCBtYXRjaCBzb21lCisgIC8vIGNvbXBpbGVyIGdlbmVyYXRlZCBwYXR0ZXJuIGJ1dCBpdCBpcyB1bmxpa2VseSB0byBkbyBzby4KKworICBkZWYgaTE2aTMyOiBBTkRJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAoYW5kICh6ZXh0IFIxNkM6JHJBKSwgUjMyQzokckIpKV0+OworfQorCitkZWZtIEFORCA6IEJpdHdpc2VBbmQ7CisKKworZGVmIHZub3RfY2VsbF9jb252IDogUGF0RnJhZzwob3BzIG5vZGU6JGluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHhvciBub2RlOiRpbiwgKGJpdGNvbnZlcnQgKHY0aTMyIGltbUFsbE9uZXNWKSkpPjsKKworLy8gTi5CLjogdm5vdF9jZWxsX2NvbnYgaXMgb25lIG9mIHRob3NlIHNwZWNpYWwgdGFyZ2V0IHNlbGVjdGlvbiBwYXR0ZXJuCisvLyBmcmFnbWVudHMsCisvLyBpbiB3aGljaCB3ZSBleHBlY3QgdGhlcmUgdG8gYmUgYSBiaXRfY29udmVydCBvbiB0aGUgY29uc3RhbnQuIEJlYXIgaW4gbWluZAorLy8gdGhhdCBsbHZtIHRyYW5zbGF0ZXMgIm5vdCA8cmVnPiIgdG8gInhvciA8cmVnPiwgLTEiIChvciBpbiB0aGlzIGNhc2UsIGEKKy8vIGNvbnN0YW50IC0xIHZlY3Rvci4pCisKK2NsYXNzIEFORENJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm08MGIxMDAwMDAxMTAxMCwgT09MLCBJT0wsICJhbmRjXHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgICAgSW50ZWdlck9wLCBwYXR0ZXJuPjsKKworY2xhc3MgQU5EQ1ZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGUsIFBhdEZyYWcgdm5vdF9mcmFnID0gdm5vdD46CisgICAgQU5EQ0luc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgICAgKGFuZCAodmVjdHlwZSBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2bm90X2ZyYWcgKHZlY3R5cGUgVkVDUkVHOiRyQikpKSldPjsKKworY2xhc3MgQU5EQ1JlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIEFORENJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsIChhbmQgcmNsYXNzOiRyQSwgKG5vdCByY2xhc3M6JHJCKSkpXT47CisKK211bHRpY2xhc3MgQW5kQ29tcGxlbWVudAoreworICBkZWYgdjE2aTg6IEFORENWZWNJbnN0PHYxNmk4PjsKKyAgZGVmIHY4aTE2OiBBTkRDVmVjSW5zdDx2OGkxNj47CisgIGRlZiB2NGkzMjogQU5EQ1ZlY0luc3Q8djRpMzI+OworICBkZWYgdjJpNjQ6IEFORENWZWNJbnN0PHYyaTY0PjsKKworICBkZWYgcjEyODogQU5EQ1JlZ0luc3Q8R1BSQz47CisgIGRlZiByNjQ6ICBBTkRDUmVnSW5zdDxSNjRDPjsKKyAgZGVmIHIzMjogIEFORENSZWdJbnN0PFIzMkM+OworICBkZWYgcjE2OiAgQU5EQ1JlZ0luc3Q8UjE2Qz47CisgIGRlZiByODogICBBTkRDUmVnSW5zdDxSOEM+OworCisgIC8vIFNvbWV0aW1lcywgdGhlIHhvciBwYXR0ZXJuIGhhcyBhIGJpdGNhc3QgY29uc3RhbnQ6CisgIGRlZiB2MTZpOF9jb252OiBBTkRDVmVjSW5zdDx2MTZpOCwgdm5vdF9jZWxsX2NvbnY+OworfQorCitkZWZtIEFOREMgOiBBbmRDb21wbGVtZW50OworCitjbGFzcyBBTkRCSUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJJMTBGb3JtPDBiMDExMDEwMDAsIE9PTCwgSU9MLCAiYW5kYmlcdCRyVCwgJHJBLCAkdmFsIiwKKyAgICAgICAgICAgICBCeXRlT3AsIHBhdHRlcm4+OworCittdWx0aWNsYXNzIEFuZEJ5dGVJbW0KK3sKKyAgZGVmIHYxNmk4OiBBTkRCSUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgdTEwaW1tOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCAodjE2aTggVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKHYxNmk4IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZpOCB2MTZpOFU4SW1tOiR2YWwpKSldPjsKKworICBkZWYgcjg6IEFOREJJSW5zdDwob3V0cyBSOEM6JHJUKSwgKGlucyBSOEM6JHJBLCB1MTBpbW1faTg6JHZhbCksCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFI4QzokclQsIChhbmQgUjhDOiRyQSwgaW1tVTg6JHZhbCkpXT47Cit9CisKK2RlZm0gQU5EQkkgOiBBbmRCeXRlSW1tOworCitjbGFzcyBBTkRISUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgICBSSTEwRm9ybTwwYjEwMTAxMDAwLCBPT0wsIElPTCwgImFuZGhpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgICAgQnl0ZU9wLCBwYXR0ZXJuPjsKKworbXVsdGljbGFzcyBBbmRIYWxmd29yZEltbQoreworICBkZWYgdjhpMTY6IEFOREhJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0ICh2OGkxNiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCAodjhpMTYgVkVDUkVHOiRyQSksIHY4aTE2U0V4dDEwSW1tOiR2YWwpKV0+OworCisgIGRlZiByMTY6IEFOREhJSW5zdDwob3V0cyBSMTZDOiRyVCksIChpbnMgUjE2QzokckEsIHUxMGltbTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIxNkM6JHJULCAoYW5kIFIxNkM6JHJBLCBpMTZJbW1VbnMxMDokdmFsKSldPjsKKworICAvLyBaZXJvLWV4dGVuZCBpOCB0byBpMTY6CisgIGRlZiBpOGkxNjogQU5ESElJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSOEM6JHJBLCB1MTBpbW06JHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjE2QzokclQsIChhbmQgKHpleHQgUjhDOiRyQSksIGkxNkltbVVuczEwOiR2YWwpKV0+OworfQorCitkZWZtIEFOREhJIDogQW5kSGFsZndvcmRJbW07CisKK2NsYXNzIEFORElJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6CisgICAgUkkxMEZvcm08MGIwMDEwMTAwMCwgT09MLCBJT0wsICJhbmRpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgICAgSW50ZWdlck9wLCBwYXR0ZXJuPjsKKworbXVsdGljbGFzcyBBbmRXb3JkSW1tCit7CisgIGRlZiB2NGkzMjogQU5ESUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kICh2NGkzMiBWRUNSRUc6JHJBKSwgdjRpMzJTRXh0MTBJbW06JHZhbCkpXT47CisKKyAgZGVmIHIzMjogQU5ESUluc3Q8KG91dHMgUjMyQzokclQpLCAoaW5zIFIzMkM6JHJBLCBzMTBpbW1faTMyOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBSMzJDOiRyVCwgKGFuZCBSMzJDOiRyQSwgaTMySW1tU0V4dDEwOiR2YWwpKV0+OworCisgIC8vIEhhY2tlZCBmb3JtIG9mIEFOREkgdG8gemVyby1leHRlbmQgaTggcXVhbnRpdGllcyB0byBpMzIuIFNlZSB0aGUgemV4dCA4LT4zMgorICAvLyBwYXR0ZXJuIGJlbG93LgorICBkZWYgaThpMzI6IEFORElJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSOEM6JHJBLCBzMTBpbW1faTMyOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKHpleHQgUjhDOiRyQSksIGkzMkltbVNFeHQxMDokdmFsKSldPjsKKworICAvLyBIYWNrZWQgZm9ybSBvZiBBTkRJIHRvIHplcm8tZXh0ZW5kIGkxNiBxdWFudGl0aWVzIHRvIGkzMi4gU2VlIHRoZQorICAvLyB6ZXh0IDE2LT4zMiBwYXR0ZXJuIGJlbG93LgorICAvLworICAvLyBOb3RlIHRoYXQgdGhpcyBwYXR0ZXJuIGlzIHNvbWV3aGF0IGFydGlmaWNpYWwsIHNpbmNlIGl0IG1pZ2h0IG1hdGNoCisgIC8vIHNvbWV0aGluZyB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIGJ1dCBpcyB1bmxpa2VseSB0byBvY2N1ciBpbiBwcmFjdGljZS4KKyAgZGVmIGkxNmkzMjogQU5ESUluc3Q8KG91dHMgUjMyQzokclQpLCAoaW5zIFIxNkM6JHJBLCBzMTBpbW1faTMyOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMzJDOiRyVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCAoemV4dCBSMTZDOiRyQSksIGkzMkltbVNFeHQxMDokdmFsKSldPjsKK30KKworZGVmbSBBTkRJIDogQW5kV29yZEltbTsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBCaXR3aXNlIE9SIGdyb3VwOgorLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisKKy8vIEJpdHdpc2UgIm9yIiAoTi5CLjogVGhlc2UgYXJlIGFsc28gcmVnaXN0ZXItcmVnaXN0ZXIgY29weSBpbnN0cnVjdGlvbnMuLi4pCitjbGFzcyBPUkluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybTwwYjEwMDAwMDEwMDAwLCBPT0wsIElPTCwgIm9yXHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgICAgSW50ZWdlck9wLCBwYXR0ZXJuPjsKKworY2xhc3MgT1JWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBPUkluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAob3IgKHZlY3R5cGUgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3R5cGUgVkVDUkVHOiRyQikpKV0+OworCitjbGFzcyBPUlJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIE9SSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSwKKyAgICAgICAgICAgWyhzZXQgcmNsYXNzOiRyVCwgKG9yIHJjbGFzczokckEsIHJjbGFzczokckIpKV0+OworCisvLyBPUkN2dEZvcm06IE9SIGNvbnZlcnNpb24gZm9ybQorLy8KKy8vIFRoaXMgaXMgdXNlZCB0byAiY29udmVydCIgdGhlIHByZWZlcnJlZCBzbG90IHRvIGl0cyB2ZWN0b3IgZXF1aXZhbGVudCwgYXMKKy8vIHdlbGwgYXMgY29udmVydCBhIHZlY3RvciBiYWNrIHRvIGl0cyBwcmVmZXJyZWQgc2xvdC4KKy8vCisvLyBUaGVzZSBhcmUgZWZmZWN0aXZlbHkgbm8tb3BzLCBidXQgbmVlZCB0byBleGlzdCBmb3IgcHJvcGVyIHR5cGUgY29udmVyc2lvbgorLy8gYW5kIHR5cGUgY29lcmNpb24uCisKK2NsYXNzIE9SQ3Z0Rm9ybTxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybiA9IFsvKiBubyBwYXR0ZXJuICovXT4KKyAgICAgICAgICA6IFNQVUluc3RyPE9PTCwgSU9MLCAib3JcdCRyVCwgJHJBLCAkckEiLCBJbnRlZ2VyT3A+IHsKKyAgYml0czw3PiBSQTsKKyAgYml0czw3PiBSVDsKKworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisKKyAgbGV0IEluc3R7MC0xMH0gPSAwYjEwMDAwMDEwMDAwOworICBsZXQgSW5zdHsxMS0xN30gPSBSQTsKKyAgbGV0IEluc3R7MTgtMjR9ID0gUkE7CisgIGxldCBJbnN0ezI1LTMxfSA9IFJUOworfQorCitjbGFzcyBPUlByb21vdGVTY2FsYXI8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIE9SQ3Z0Rm9ybTwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyByY2xhc3M6JHJBKT47CisKK2NsYXNzIE9SRXh0cmFjdEVsdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgT1JDdnRGb3JtPChvdXRzIHJjbGFzczokclQpLCAoaW5zIFZFQ1JFRzokckEpPjsKKworLyogY2xhc3MgT1JDdnRSZWdHUFJDPFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBPUkN2dEZvcm08KG91dHMgR1BSQzokclQpLCAoaW5zIHJjbGFzczokckEpPjsgKi8KKworLyogY2xhc3MgT1JDdnRHUFJDUmVnPFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBPUkN2dEZvcm08KG91dHMgcmNsYXNzOiRyVCksIChpbnMgR1BSQzokckEpPjsgKi8KKyAgICAKK2NsYXNzIE9SQ3Z0Rm9ybVIzMlJlZzxSZWdpc3RlckNsYXNzIHJjbGFzcywgbGlzdDxkYWc+IHBhdHRlcm4gPSBbIF0+OgorICAgIE9SQ3Z0Rm9ybTwob3V0cyByY2xhc3M6JHJUKSwgKGlucyBSMzJDOiRyQSksIHBhdHRlcm4+OworICAgIAorY2xhc3MgT1JDdnRGb3JtUmVnUjMyPFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBsaXN0PGRhZz4gcGF0dGVybiA9IFsgXT46CisgICAgT1JDdnRGb3JtPChvdXRzIFIzMkM6JHJUKSwgKGlucyByY2xhc3M6JHJBKSwgcGF0dGVybj47CisKK2NsYXNzIE9SQ3Z0Rm9ybVI2NFJlZzxSZWdpc3RlckNsYXNzIHJjbGFzcywgbGlzdDxkYWc+IHBhdHRlcm4gPSBbIF0+OgorICAgIE9SQ3Z0Rm9ybTwob3V0cyByY2xhc3M6JHJUKSwgKGlucyBSNjRDOiRyQSksIHBhdHRlcm4+OworICAgIAorY2xhc3MgT1JDdnRGb3JtUmVnUjY0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBsaXN0PGRhZz4gcGF0dGVybiA9IFsgXT46CisgICAgT1JDdnRGb3JtPChvdXRzIFI2NEM6JHJUKSwgKGlucyByY2xhc3M6JHJBKSwgcGF0dGVybj47CisKK2NsYXNzIE9SQ3Z0R1BSQ1ZlYzoKKyAgICBPUkN2dEZvcm08KG91dHMgVkVDUkVHOiRyVCksIChpbnMgR1BSQzokckEpPjsKKworY2xhc3MgT1JDdnRWZWNHUFJDOgorICAgIE9SQ3Z0Rm9ybTwob3V0cyBHUFJDOiRyVCksIChpbnMgVkVDUkVHOiRyQSk+OworCitjbGFzcyBPUkN2dFZlY1ZlYzoKKyAgICBPUkN2dEZvcm08KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSk+OworCittdWx0aWNsYXNzIEJpdHdpc2VPcgoreworICBkZWYgdjE2aTg6IE9SVmVjSW5zdDx2MTZpOD47CisgIGRlZiB2OGkxNjogT1JWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHY0aTMyOiBPUlZlY0luc3Q8djRpMzI+OworICBkZWYgdjJpNjQ6IE9SVmVjSW5zdDx2Mmk2ND47CisKKyAgZGVmIHY0ZjMyOiBPUkluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgIFsoc2V0ICh2NGYzMiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIChiaXRjb252ZXJ0IChvciAodjRpMzIgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIFZFQ1JFRzokckIpKSkpKV0+OworCisgIGRlZiB2MmY2NDogT1JJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICBbKHNldCAodjJmNjQgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2MmY2NCAoYml0Y29udmVydCAob3IgKHYyaTY0IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCBWRUNSRUc6JHJCKSkpKSldPjsKKworICBkZWYgcjEyODogT1JSZWdJbnN0PEdQUkM+OworICBkZWYgcjY0OiAgT1JSZWdJbnN0PFI2NEM+OworICBkZWYgcjMyOiAgT1JSZWdJbnN0PFIzMkM+OworICBkZWYgcjE2OiAgT1JSZWdJbnN0PFIxNkM+OworICBkZWYgcjg6ICAgT1JSZWdJbnN0PFI4Qz47CisKKyAgLy8gT1IgaW5zdHJ1Y3Rpb25zIHVzZWQgdG8gY29weSBmMzIgYW5kIGY2NCByZWdpc3RlcnMuCisgIGRlZiBmMzI6IE9SSW5zdDwob3V0cyBSMzJGUDokclQpLCAoaW5zIFIzMkZQOiRyQSwgUjMyRlA6JHJCKSwKKyAgICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKKyAgZGVmIGY2NDogT1JJbnN0PChvdXRzIFI2NEZQOiRyVCksIChpbnMgUjY0RlA6JHJBLCBSNjRGUDokckIpLAorICAgICAgICAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworICAvLyBzY2FsYXItPnZlY3RvciBwcm9tb3Rpb24sIHByZWZzbG90MnZlYzoKKyAgZGVmIHYxNmk4X2k4OiAgT1JQcm9tb3RlU2NhbGFyPFI4Qz47CisgIGRlZiB2OGkxNl9pMTY6IE9SUHJvbW90ZVNjYWxhcjxSMTZDPjsKKyAgZGVmIHY0aTMyX2kzMjogT1JQcm9tb3RlU2NhbGFyPFIzMkM+OworICBkZWYgdjJpNjRfaTY0OiBPUlByb21vdGVTY2FsYXI8UjY0Qz47CisgIGRlZiB2NGYzMl9mMzI6IE9SUHJvbW90ZVNjYWxhcjxSMzJGUD47CisgIGRlZiB2MmY2NF9mNjQ6IE9SUHJvbW90ZVNjYWxhcjxSNjRGUD47CisKKyAgLy8gdmVjdG9yLT5zY2FsYXIgZGVtb3Rpb24sIHZlYzJwcmVmc2xvdDoKKyAgZGVmIGk4X3YxNmk4OiAgT1JFeHRyYWN0RWx0PFI4Qz47CisgIGRlZiBpMTZfdjhpMTY6IE9SRXh0cmFjdEVsdDxSMTZDPjsKKyAgZGVmIGkzMl92NGkzMjogT1JFeHRyYWN0RWx0PFIzMkM+OworICBkZWYgaTY0X3YyaTY0OiBPUkV4dHJhY3RFbHQ8UjY0Qz47CisgIGRlZiBmMzJfdjRmMzI6IE9SRXh0cmFjdEVsdDxSMzJGUD47CisgIGRlZiBmNjRfdjJmNjQ6IE9SRXh0cmFjdEVsdDxSNjRGUD47CisKKyAgLy8gaGFsZiA8LT4gZnVsbCB2ZWN0b3IgbWFwcGluZ3MKKyAgZGVmIHYyaTMyX3Y0aTMyOiBPUkN2dFZlY1ZlYzsKKyAgZGVmIHY0aTMyX3YyaTMyOiBPUkN2dFZlY1ZlYzsKKyAgZGVmIHYyZjMyX3Y0ZjMyOiBPUkN2dFZlY1ZlYzsKKyAgZGVmIHY0ZjMyX3YyZjMyOiBPUkN2dFZlY1ZlYzsKKworCisgIC8vIENvbnZlcnNpb24gZnJvbSB2ZWN0b3IgdG8gR1BSQworICBkZWYgaTEyOF92ZWM6ICBPUkN2dFZlY0dQUkM7CisKKyAgLy8gQ29udmVyc2lvbiBmcm9tIEdQUkMgdG8gdmVjdG9yCisgIGRlZiB2ZWNfaTEyODogIE9SQ3Z0R1BSQ1ZlYzsKKworLyoKKyAgLy8gQ29udmVyc2lvbiBmcm9tIHJlZ2lzdGVyIHRvIEdQUkMKKyAgZGVmIGkxMjhfcjY0OiAgT1JDdnRSZWdHUFJDPFI2NEM+OworICBkZWYgaTEyOF9mNjQ6ICBPUkN2dFJlZ0dQUkM8UjY0RlA+OworICBkZWYgaTEyOF9yMzI6ICBPUkN2dFJlZ0dQUkM8UjMyQz47CisgIGRlZiBpMTI4X2YzMjogIE9SQ3Z0UmVnR1BSQzxSMzJGUD47CisgIGRlZiBpMTI4X3IxNjogIE9SQ3Z0UmVnR1BSQzxSMTZDPjsKKyAgZGVmIGkxMjhfcjg6ICAgT1JDdnRSZWdHUFJDPFI4Qz47CisKKyAgLy8gQ29udmVyc2lvbiBmcm9tIEdQUkMgdG8gcmVnaXN0ZXIKKyAgZGVmIHI2NF9pMTI4OiAgT1JDdnRHUFJDUmVnPFI2NEM+OworICBkZWYgZjY0X2kxMjg6ICBPUkN2dEdQUkNSZWc8UjY0RlA+OworICBkZWYgcjMyX2kxMjg6ICBPUkN2dEdQUkNSZWc8UjMyQz47CisgIGRlZiBmMzJfaTEyODogIE9SQ3Z0R1BSQ1JlZzxSMzJGUD47CisgIGRlZiByMTZfaTEyODogIE9SQ3Z0R1BSQ1JlZzxSMTZDPjsKKyAgZGVmIHI4X2kxMjg6ICAgT1JDdnRHUFJDUmVnPFI4Qz47CisqLworLyoKKyAgLy8gQ29udmVyc2lvbiBmcm9tIHJlZ2lzdGVyIHRvIFIzMkM6CisgIGRlZiByMzJfcjE2OiAgIE9SQ3Z0Rm9ybVJlZ1IzMjxSMTZDPjsKKyAgZGVmIHIzMl9yODogICAgT1JDdnRGb3JtUmVnUjMyPFI4Qz47CisgIAorICAvLyBDb252ZXJzaW9uIGZyb20gUjMyQyB0byByZWdpc3RlcgorICBkZWYgcjMyX3IxNjogICBPUkN2dEZvcm1SMzJSZWc8UjE2Qz47CisgIGRlZiByMzJfcjg6ICAgIE9SQ3Z0Rm9ybVIzMlJlZzxSOEM+OworKi8KKyAgCisgIC8vIENvbnZlcnNpb24gZnJvbSBSNjRDIHRvIHJlZ2lzdGVyOgorICBkZWYgcjMyX3I2NDogICBPUkN2dEZvcm1SNjRSZWc8UjMyQz47CisgIC8vIGRlZiByMTZfcjY0OiAgIE9SQ3Z0Rm9ybVI2NFJlZzxSMTZDPjsKKyAgLy8gZGVmIHI4X3I2NDogICAgT1JDdnRGb3JtUjY0UmVnPFI4Qz47CisgIAorICAvLyBDb252ZXJzaW9uIHRvIFI2NEMgZnJvbSByZWdpc3RlcjoKKyAgZGVmIHI2NF9yMzI6ICAgT1JDdnRGb3JtUmVnUjY0PFIzMkM+OworICAvLyBkZWYgcjY0X3IxNjogICBPUkN2dEZvcm1SZWdSNjQ8UjE2Qz47CisgIC8vIGRlZiByNjRfcjg6ICAgIE9SQ3Z0Rm9ybVJlZ1I2NDxSOEM+OworCisgIC8vIGJpdGNvbnZlcnQgcGF0dGVybnM6CisgIGRlZiByMzJfZjMyOiAgIE9SQ3Z0Rm9ybVIzMlJlZzxSMzJGUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkZQOiRyVCwgKGJpdGNvbnZlcnQgUjMyQzokckEpKV0+OworICBkZWYgZjMyX3IzMjogICBPUkN2dEZvcm1SZWdSMzI8UjMyRlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMzJDOiRyVCwgKGJpdGNvbnZlcnQgUjMyRlA6JHJBKSldPjsKKworICBkZWYgcjY0X2Y2NDogICBPUkN2dEZvcm1SNjRSZWc8UjY0RlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSNjRGUDokclQsIChiaXRjb252ZXJ0IFI2NEM6JHJBKSldPjsKKyAgZGVmIGY2NF9yNjQ6ICAgT1JDdnRGb3JtUmVnUjY0PFI2NEZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjY0QzokclQsIChiaXRjb252ZXJ0IFI2NEZQOiRyQSkpXT47Cit9CisKK2RlZm0gT1IgOiBCaXR3aXNlT3I7CisKKy8vIHNjYWxhci0+dmVjdG9yIHByb21vdGlvbiBwYXR0ZXJucyAocHJlZmVycmVkIHNsb3QgdG8gdmVjdG9yKToKK2RlZiA6IFBhdDwodjE2aTggKFNQVXByZWZzbG90MnZlYyBSOEM6JHJBKSksCisgICAgICAgICAgKE9SdjE2aThfaTggUjhDOiRyQSk+OworCitkZWYgOiBQYXQ8KHY4aTE2IChTUFVwcmVmc2xvdDJ2ZWMgUjE2QzokckEpKSwKKyAgICAgICAgICAoT1J2OGkxNl9pMTYgUjE2QzokckEpPjsKKworZGVmIDogUGF0PCh2NGkzMiAoU1BVcHJlZnNsb3QydmVjIFIzMkM6JHJBKSksCisgICAgICAgICAgKE9SdjRpMzJfaTMyIFIzMkM6JHJBKT47CisKK2RlZiA6IFBhdDwodjJpMzIgKFNQVXByZWZzbG90MnZlYyBSMzJDOiRyQSkpLAorICAgICAgICAgIChPUnY0aTMyX2kzMiBSMzJDOiRyQSk+OworCitkZWYgOiBQYXQ8KHYyaTY0IChTUFVwcmVmc2xvdDJ2ZWMgUjY0QzokckEpKSwKKyAgICAgICAgICAoT1J2Mmk2NF9pNjQgUjY0QzokckEpPjsKKworZGVmIDogUGF0PCh2NGYzMiAoU1BVcHJlZnNsb3QydmVjIFIzMkZQOiRyQSkpLAorICAgICAgICAgIChPUnY0ZjMyX2YzMiBSMzJGUDokckEpPjsKKworZGVmIDogUGF0PCh2MmYzMiAoU1BVcHJlZnNsb3QydmVjIFIzMkZQOiRyQSkpLAorICAgICAgICAgIChPUnY0ZjMyX2YzMiBSMzJGUDokckEpPjsKKworZGVmIDogUGF0PCh2MmY2NCAoU1BVcHJlZnNsb3QydmVjIFI2NEZQOiRyQSkpLAorICAgICAgICAgIChPUnYyZjY0X2Y2NCBSNjRGUDokckEpPjsKKworLy8gT1JpKl92KjogVXNlZCB0byBleHRyYWN0IHZlY3RvciBlbGVtZW50IDAgKHRoZSBwcmVmZXJyZWQgc2xvdCksIG90aGVyd2lzZQorLy8ga25vd24gYXMgY29udmVydGluZyB0aGUgdmVjdG9yIGJhY2sgdG8gaXRzIHByZWZlcnJlZCBzbG90CisKK2RlZiA6IFBhdDwoU1BVdmVjMnByZWZzbG90ICh2MTZpOCBWRUNSRUc6JHJBKSksCisgICAgICAgICAgKE9SaThfdjE2aTggVkVDUkVHOiRyQSk+OworCitkZWYgOiBQYXQ8KFNQVXZlYzJwcmVmc2xvdCAodjhpMTYgVkVDUkVHOiRyQSkpLAorICAgICAgICAgIChPUmkxNl92OGkxNiBWRUNSRUc6JHJBKT47CisKK2RlZiA6IFBhdDwoU1BVdmVjMnByZWZzbG90ICh2NGkzMiBWRUNSRUc6JHJBKSksCisgICAgICAgICAgKE9SaTMyX3Y0aTMyIFZFQ1JFRzokckEpPjsKKworZGVmIDogUGF0PChTUFV2ZWMycHJlZnNsb3QgKHYyaTMyIFZFQ1JFRzokckEpKSwKKyAgICAgICAgICAoT1JpMzJfdjRpMzIgVkVDUkVHOiRyQSk+OworCitkZWYgOiBQYXQ8KFNQVXZlYzJwcmVmc2xvdCAodjJpNjQgVkVDUkVHOiRyQSkpLAorICAgICAgICAgIChPUmk2NF92Mmk2NCBWRUNSRUc6JHJBKT47CisKK2RlZiA6IFBhdDwoU1BVdmVjMnByZWZzbG90ICh2NGYzMiBWRUNSRUc6JHJBKSksCisgICAgICAgICAgKE9SZjMyX3Y0ZjMyIFZFQ1JFRzokckEpPjsKKworZGVmIDogUGF0PChTUFV2ZWMycHJlZnNsb3QgKHYyZjMyIFZFQ1JFRzokckEpKSwKKyAgICAgICAgICAoT1JmMzJfdjRmMzIgVkVDUkVHOiRyQSk+OworCitkZWYgOiBQYXQ8KFNQVXZlYzJwcmVmc2xvdCAodjJmNjQgVkVDUkVHOiRyQSkpLAorICAgICAgICAgIChPUmY2NF92MmY2NCBWRUNSRUc6JHJBKT47CisKKy8vIENvbnZlcnNpb25zIGJldHdlZW4gNjQgYml0IGFuZCAxMjggYml0IHZlY3RvcnMuIAorCitkZWYgOiBQYXQ8KHY0aTMyIChTUFVoYWxmMnZlYyAodjJpMzIgVkVDUkVHOiRyQSkpKSwKKyAgICAgICAgICAoT1J2NGkzMl92MmkzMiAodjJpMzIgVkVDUkVHOiRyQSkpPjsKK2RlZiA6IFBhdDwodjRmMzIgKFNQVWhhbGYydmVjICh2MmYzMiBWRUNSRUc6JHJBKSkpLAorICAgICAgICAgIChPUnY0ZjMyX3YyZjMyICh2MmYzMiBWRUNSRUc6JHJBKSk+OworCitkZWYgOiBQYXQ8KHYyaTMyIChTUFV2ZWMyaGFsZiAodjRpMzIgVkVDUkVHOiRyQSkpKSwKKyAgICAgICAgICAoT1J2MmkzMl92NGkzMiBWRUNSRUc6JHJBKT47CitkZWYgOiBQYXQ8KHYyZjMyIChTUFV2ZWMyaGFsZiAodjRmMzIgVkVDUkVHOiRyQSkpKSwKKyAgICAgICAgICAoT1J2MmYzMl92NGYzMiBWRUNSRUc6JHJBKT47CisKKy8vIExvYWQgUmVnaXN0ZXI6IFRoaXMgaXMgYW4gYXNzZW1ibGVyIGFsaWFzIGZvciBhIGJpdHdpc2UgT1Igb2YgYSByZWdpc3RlcgorLy8gYWdhaW5zdCBpdHNlbGYuIEl0J3MgaGVyZSBiZWNhdXNlIGl0IGJyaW5ncyBzb21lIGNsYXJpdHkgdG8gYXNzZW1ibHkKKy8vIGxhbmd1YWdlIG91dHB1dC4KKworbGV0IGhhc0N0cmxEZXAgPSAxIGluIHsKKyAgICBjbGFzcyBMUkluc3Q8ZGFnIE9PTCwgZGFnIElPTD4KKyAgICAgICAgICAgICAgOiBTUFVJbnN0cjxPT0wsIElPTCwgImxyXHQkclQsICRyQSIsIEludGVnZXJPcD4geworICAgICAgYml0czw3PiBSQTsKKyAgICAgIGJpdHM8Nz4gUlQ7CisKKyAgICAgIGxldCBQYXR0ZXJuID0gWy8qbm8gcGF0dGVybiovXTsKKworICAgICAgbGV0IEluc3R7MC0xMH0gPSAwYjEwMDAwMDEwMDAwOyAgIC8qIEl0J3MgYW4gT1Igb3BlcmF0aW9uICovCisgICAgICBsZXQgSW5zdHsxMS0xN30gPSBSQTsKKyAgICAgIGxldCBJbnN0ezE4LTI0fSA9IFJBOworICAgICAgbGV0IEluc3R7MjUtMzF9ID0gUlQ7CisgICAgfQorCisgICAgY2xhc3MgTFJWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICAgICAgTFJJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEpPjsKKworICAgIGNsYXNzIExSUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgICAgIExSSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBKT47CisKKyAgICBtdWx0aWNsYXNzIExvYWRSZWdpc3RlciB7CisgICAgICBkZWYgdjJpNjQ6IExSVmVjSW5zdDx2Mmk2ND47CisgICAgICBkZWYgdjJmNjQ6IExSVmVjSW5zdDx2MmY2ND47CisgICAgICBkZWYgdjRpMzI6IExSVmVjSW5zdDx2NGkzMj47CisgICAgICBkZWYgdjRmMzI6IExSVmVjSW5zdDx2NGYzMj47CisgICAgICBkZWYgdjhpMTY6IExSVmVjSW5zdDx2OGkxNj47CisgICAgICBkZWYgdjE2aTg6IExSVmVjSW5zdDx2MTZpOD47CisKKyAgICAgIGRlZiByMTI4OiAgTFJSZWdJbnN0PEdQUkM+OworICAgICAgZGVmIHI2NDogICBMUlJlZ0luc3Q8UjY0Qz47CisgICAgICBkZWYgZjY0OiAgIExSUmVnSW5zdDxSNjRGUD47CisgICAgICBkZWYgcjMyOiAgIExSUmVnSW5zdDxSMzJDPjsKKyAgICAgIGRlZiBmMzI6ICAgTFJSZWdJbnN0PFIzMkZQPjsKKyAgICAgIGRlZiByMTY6ICAgTFJSZWdJbnN0PFIxNkM+OworICAgICAgZGVmIHI4OiAgICBMUlJlZ0luc3Q8UjhDPjsKKyAgICB9CisKKyAgICBkZWZtIExSOiBMb2FkUmVnaXN0ZXI7Cit9CisKKy8vIE9SQzogQml0d2lzZSAib3IiIHdpdGggY29tcGxlbWVudCAoYyA9IGEgfCB+YikKKworY2xhc3MgT1JDSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMTAwMTAwMTAwMDAsIE9PTCwgSU9MLCAib3JjXHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgICAgSW50ZWdlck9wLCBwYXR0ZXJuPjsKKworY2xhc3MgT1JDVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgT1JDSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAob3IgKHZlY3R5cGUgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2bm90ICh2ZWN0eXBlIFZFQ1JFRzokckIpKSkpXT47CisKK2NsYXNzIE9SQ1JlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICBPUkNJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsIChvciByY2xhc3M6JHJBLCAobm90IHJjbGFzczokckIpKSldPjsKKworbXVsdGljbGFzcyBCaXR3aXNlT3JDb21wbGVtZW50Cit7CisgIGRlZiB2MTZpODogT1JDVmVjSW5zdDx2MTZpOD47CisgIGRlZiB2OGkxNjogT1JDVmVjSW5zdDx2OGkxNj47CisgIGRlZiB2NGkzMjogT1JDVmVjSW5zdDx2NGkzMj47CisgIGRlZiB2Mmk2NDogT1JDVmVjSW5zdDx2Mmk2ND47CisKKyAgZGVmIHIxMjg6ICBPUkNSZWdJbnN0PEdQUkM+OworICBkZWYgcjY0OiAgIE9SQ1JlZ0luc3Q8UjY0Qz47CisgIGRlZiByMzI6ICAgT1JDUmVnSW5zdDxSMzJDPjsKKyAgZGVmIHIxNjogICBPUkNSZWdJbnN0PFIxNkM+OworICBkZWYgcjg6ICAgIE9SQ1JlZ0luc3Q8UjhDPjsKK30KKworZGVmbSBPUkMgOiBCaXR3aXNlT3JDb21wbGVtZW50OworCisvLyBPUiBieXRlIGltbWVkaWF0ZQorY2xhc3MgT1JCSUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJJMTBGb3JtPDBiMDExMDAwMDAsIE9PTCwgSU9MLCAib3JiaVx0JHJULCAkckEsICR2YWwiLAorICAgICAgICAgICAgIEludGVnZXJPcCwgcGF0dGVybj47CisKK2NsYXNzIE9SQklWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlLCBQYXRMZWFmIGltbXByZWQ+OgorICAgIE9SQklJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHUxMGltbTokdmFsKSwKKyAgICAgICAgICAgICBbKHNldCAodjE2aTggVkVDUkVHOiRyVCksIChvciAodmVjdHlwZSBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdHlwZSBpbW1wcmVkOiR2YWwpKSldPjsKKworbXVsdGljbGFzcyBCaXR3aXNlT3JCeXRlSW1tCit7CisgIGRlZiB2MTZpODogT1JCSVZlY0luc3Q8djE2aTgsIHYxNmk4VThJbW0+OworCisgIGRlZiByODogT1JCSUluc3Q8KG91dHMgUjhDOiRyVCksIChpbnMgUjhDOiRyQSwgdTEwaW1tX2k4OiR2YWwpLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IFI4QzokclQsIChvciBSOEM6JHJBLCBpbW1VODokdmFsKSldPjsKK30KKworZGVmbSBPUkJJIDogQml0d2lzZU9yQnl0ZUltbTsKKworLy8gT1IgaGFsZndvcmQgaW1tZWRpYXRlCitjbGFzcyBPUkhJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUkkxMEZvcm08MGIxMDEwMDAwMCwgT09MLCBJT0wsICJvcmhpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgICAgSW50ZWdlck9wLCBwYXR0ZXJuPjsKKworY2xhc3MgT1JISVZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGUsIFBhdExlYWYgaW1tcHJlZD46CisgICAgT1JISUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgdTEwaW1tOiR2YWwpLAorICAgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwgKG9yICh2ZWN0eXBlIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbXByZWQ6JHZhbCkpXT47CisKK211bHRpY2xhc3MgQml0d2lzZU9ySGFsZndvcmRJbW0KK3sKKyAgZGVmIHY4aTE2OiBPUkhJVmVjSW5zdDx2OGkxNiwgdjhpMTZVbnMxMEltbT47CisKKyAgZGVmIHIxNjogT1JISUluc3Q8KG91dHMgUjE2QzokclQpLCAoaW5zIFIxNkM6JHJBLCB1MTBpbW06JHZhbCksCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIxNkM6JHJULCAob3IgUjE2QzokckEsIGkxNkltbVVuczEwOiR2YWwpKV0+OworCisgIC8vIFNwZWNpYWxpemVkIE9SSEkgZm9ybSB1c2VkIHRvIHByb21vdGUgOC1iaXQgcmVnaXN0ZXJzIHRvIDE2LWJpdAorICBkZWYgaThpMTY6IE9SSElJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSOEM6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjE2QzokclQsIChvciAoYW55ZXh0IFI4QzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE2SW1tU0V4dDEwOiR2YWwpKV0+OworfQorCitkZWZtIE9SSEkgOiBCaXR3aXNlT3JIYWxmd29yZEltbTsKKworY2xhc3MgT1JJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUkkxMEZvcm08MGIwMDEwMDAwMCwgT09MLCBJT0wsICJvcmlcdCRyVCwgJHJBLCAkdmFsIiwKKyAgICAgICAgICAgICBJbnRlZ2VyT3AsIHBhdHRlcm4+OworCitjbGFzcyBPUklWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlLCBQYXRMZWFmIGltbXByZWQ+OgorICAgIE9SSUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgdTEwaW1tOiR2YWwpLAorICAgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksIChvciAodmVjdHlwZSBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tcHJlZDokdmFsKSldPjsKKworLy8gQml0d2lzZSAib3IiIHdpdGggaW1tZWRpYXRlCittdWx0aWNsYXNzIEJpdHdpc2VPckltbQoreworICBkZWYgdjRpMzI6IE9SSVZlY0luc3Q8djRpMzIsIHY0aTMyVW5zMTBJbW0+OworCisgIGRlZiByMzI6IE9SSUluc3Q8KG91dHMgUjMyQzokclQpLCAoaW5zIFIzMkM6JHJBLCB1MTBpbW1faTMyOiR2YWwpLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAob3IgUjMyQzokckEsIGkzMkltbVVuczEwOiR2YWwpKV0+OworCisgIC8vIGkxNmkzMjogaGFja2VkIHZlcnNpb24gb2YgdGhlIG9yaSBpbnN0cnVjdGlvbiB0byBleHRlbmQgMTYtYml0IHF1YW50aXRpZXMKKyAgLy8gdG8gMzItYml0IHF1YW50aXRpZXMuIHVzZWQgZXhjbHVzaXZlbHkgdG8gbWF0Y2ggImFueWV4dCIgY29udmVyc2lvbnMgKHZpZGUKKyAgLy8gaW5mcmEgImFueWV4dCAxNi0+MzIiIHBhdHRlcm4uKQorICBkZWYgaTE2aTMyOiBPUklJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgczEwaW1tX2kzMjokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMzJDOiRyVCwgKG9yIChhbnlleHQgUjE2QzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMySW1tU0V4dDEwOiR2YWwpKV0+OworCisgIC8vIGk4aTMyOiBIYWNrZWQgdmVyc2lvbiBvZiB0aGUgT1JJIGluc3RydWN0aW9uIHRvIGV4dGVuZCAxNi1iaXQgcXVhbnRpdGllcworICAvLyB0byAzMi1iaXQgcXVhbnRpdGllcy4gVXNlZCBleGNsdXNpdmVseSB0byBtYXRjaCAiYW55ZXh0IiBjb252ZXJzaW9ucyAodmlkZQorICAvLyBpbmZyYSAiYW55ZXh0IDE2LT4zMiIgcGF0dGVybi4pCisgIGRlZiBpOGkzMjogT1JJSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjhDOiRyQSwgczEwaW1tX2kzMjokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAob3IgKGFueWV4dCBSOEM6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMySW1tU0V4dDEwOiR2YWwpKV0+OworfQorCitkZWZtIE9SSSA6IEJpdHdpc2VPckltbTsKKworLy8gT1JYOiAib3IiIGFjcm9zcyB0aGUgdmVjdG9yOiBvcidzICRyQSdzIHdvcmQgc2xvdHMgbGVhdmluZyB0aGUgcmVzdWx0IGluCisvLyAkclRbMF0sIHNsb3RzIDEtMyBhcmUgemVyb2VkLgorLy8KKy8vIEZJWE1FOiBOZWVkcyB0byBtYXRjaCBhbiBpbnRyaW5zaWMgcGF0dGVybi4KK2RlZiBPUlh2NGkzMjoKKyAgICBSUkZvcm08MGIxMDAxMDAxMDAwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAib3J4XHQkclQsICRyQSwgJHJCIiwgSW50ZWdlck9wLAorICAgICAgW10+OworCisvLyBYT1I6CisKK2NsYXNzIFhPUkluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgICBSUkZvcm08MGIxMDAxMDAxMDAwMCwgT09MLCBJT0wsICJ4b3JcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBJbnRlZ2VyT3AsIHBhdHRlcm4+OworCitjbGFzcyBYT1JWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBYT1JJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLCAoeG9yICh2ZWN0eXBlIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0eXBlIFZFQ1JFRzokckIpKSldPjsKKworY2xhc3MgWE9SUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgWE9SSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSwKKyAgICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCAoeG9yIHJjbGFzczokckEsIHJjbGFzczokckIpKV0+OworCittdWx0aWNsYXNzIEJpdHdpc2VFeGNsdXNpdmVPcgoreworICBkZWYgdjE2aTg6IFhPUlZlY0luc3Q8djE2aTg+OworICBkZWYgdjhpMTY6IFhPUlZlY0luc3Q8djhpMTY+OworICBkZWYgdjRpMzI6IFhPUlZlY0luc3Q8djRpMzI+OworICBkZWYgdjJpNjQ6IFhPUlZlY0luc3Q8djJpNjQ+OworCisgIGRlZiByMTI4OiAgWE9SUmVnSW5zdDxHUFJDPjsKKyAgZGVmIHI2NDogICBYT1JSZWdJbnN0PFI2NEM+OworICBkZWYgcjMyOiAgIFhPUlJlZ0luc3Q8UjMyQz47CisgIGRlZiByMTY6ICAgWE9SUmVnSW5zdDxSMTZDPjsKKyAgZGVmIHI4OiAgICBYT1JSZWdJbnN0PFI4Qz47CisKKyAgLy8gWE9SIGluc3RydWN0aW9ucyB1c2VkIHRvIG5lZ2F0ZSBmMzIgYW5kIGY2NCBxdWFudGl0aWVzLgorCisgIGRlZiBmbmVnMzI6IFhPUkluc3Q8KG91dHMgUjMyRlA6JHJUKSwgKGlucyBSMzJGUDokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKKyAgZGVmIGZuZWc2NDogWE9SSW5zdDwob3V0cyBSNjRGUDokclQpLCAoaW5zIFI2NEZQOiRyQSwgUjY0QzokckIpLAorICAgICAgICAgICAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworICBkZWYgZm5lZ3ZlYzogWE9SSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiwgc2VlIGZuZWd7MzIsNjR9ICovXT47Cit9CisKK2RlZm0gWE9SIDogQml0d2lzZUV4Y2x1c2l2ZU9yOworCisvLz09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBYT1JCSUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJJMTBGb3JtPDBiMDExMDAwMDAsIE9PTCwgSU9MLCAieG9yYmlcdCRyVCwgJHJBLCAkdmFsIiwKKyAgICAgICAgICAgICBJbnRlZ2VyT3AsIHBhdHRlcm4+OworCittdWx0aWNsYXNzIFhvckJ5dGVJbW0KK3sKKyAgZGVmIHYxNmk4OgorICAgIFhPUkJJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCB1MTBpbW06JHZhbCksCisgICAgICAgICAgICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwgKHhvciAodjE2aTggVkVDUkVHOiRyQSksIHYxNmk4VThJbW06JHZhbCkpXT47CisKKyAgZGVmIHI4OgorICAgIFhPUkJJSW5zdDwob3V0cyBSOEM6JHJUKSwgKGlucyBSOEM6JHJBLCB1MTBpbW1faTg6JHZhbCksCisgICAgICAgICAgICAgIFsoc2V0IFI4QzokclQsICh4b3IgUjhDOiRyQSwgaW1tVTg6JHZhbCkpXT47Cit9CisKK2RlZm0gWE9SQkkgOiBYb3JCeXRlSW1tOworCitkZWYgWE9SSEl2OGkxNjoKKyAgICBSSTEwRm9ybTwwYjEwMTAwMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCB1MTBpbW06JHZhbCksCisgICAgICAieG9yaGlcdCRyVCwgJHJBLCAkdmFsIiwgSW50ZWdlck9wLAorICAgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLCAoeG9yICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjhpMTZTRXh0MTBJbW06JHZhbCkpXT47CisKK2RlZiBYT1JISXIxNjoKKyAgICBSSTEwRm9ybTwwYjEwMTAwMDAwLCAob3V0cyBSMTZDOiRyVCksIChpbnMgUjE2QzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICJ4b3JoaVx0JHJULCAkckEsICR2YWwiLCBJbnRlZ2VyT3AsCisgICAgICBbKHNldCBSMTZDOiRyVCwgKHhvciBSMTZDOiRyQSwgaTE2SW1tU0V4dDEwOiR2YWwpKV0+OworCitkZWYgWE9SSXY0aTMyOgorICAgIFJJMTBGb3JtPDBiMDAxMDAwMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbV9pMzI6JHZhbCksCisgICAgICAieG9yaVx0JHJULCAkckEsICR2YWwiLCBJbnRlZ2VyT3AsCisgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksICh4b3IgKHY0aTMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0aTMyU0V4dDEwSW1tOiR2YWwpKV0+OworCitkZWYgWE9SSXIzMjoKKyAgICBSSTEwRm9ybTwwYjAwMTAwMDAwLCAob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIHMxMGltbV9pMzI6JHZhbCksCisgICAgICAieG9yaVx0JHJULCAkckEsICR2YWwiLCBJbnRlZ2VyT3AsCisgICAgICBbKHNldCBSMzJDOiRyVCwgKHhvciBSMzJDOiRyQSwgaTMySW1tU0V4dDEwOiR2YWwpKV0+OworCisvLyBOQU5EOgorCitjbGFzcyBOQU5ESW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMTAwMTAwMTEwMDAsIE9PTCwgSU9MLCAibmFuZFx0JHJULCAkckEsICRyQiIsCisgICAgICAgICAgIEludGVnZXJPcCwgcGF0dGVybj47CisKK2NsYXNzIE5BTkRWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBOQU5ESW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwgKHZub3QgKGFuZCAodmVjdHlwZSBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdHlwZSBWRUNSRUc6JHJCKSkpKV0+OworY2xhc3MgTkFORFJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIE5BTkRJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsIChub3QgKGFuZCByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSkpXT47CisKK211bHRpY2xhc3MgQml0d2lzZU5hbmQKK3sKKyAgZGVmIHYxNmk4OiBOQU5EVmVjSW5zdDx2MTZpOD47CisgIGRlZiB2OGkxNjogTkFORFZlY0luc3Q8djhpMTY+OworICBkZWYgdjRpMzI6IE5BTkRWZWNJbnN0PHY0aTMyPjsKKyAgZGVmIHYyaTY0OiBOQU5EVmVjSW5zdDx2Mmk2ND47CisKKyAgZGVmIHIxMjg6ICBOQU5EUmVnSW5zdDxHUFJDPjsKKyAgZGVmIHI2NDogICBOQU5EUmVnSW5zdDxSNjRDPjsKKyAgZGVmIHIzMjogICBOQU5EUmVnSW5zdDxSMzJDPjsKKyAgZGVmIHIxNjogICBOQU5EUmVnSW5zdDxSMTZDPjsKKyAgZGVmIHI4OiAgICBOQU5EUmVnSW5zdDxSOEM+OworfQorCitkZWZtIE5BTkQgOiBCaXR3aXNlTmFuZDsKKworLy8gTk9SOgorCitjbGFzcyBOT1JJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm08MGIxMDAxMDAxMDAwMCwgT09MLCBJT0wsICJub3JcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBJbnRlZ2VyT3AsIHBhdHRlcm4+OworCitjbGFzcyBOT1JWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBOT1JJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksICh2bm90IChvciAodmVjdHlwZSBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3R5cGUgVkVDUkVHOiRyQikpKSldPjsKK2NsYXNzIE5PUlJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIE5PUkluc3Q8KG91dHMgcmNsYXNzOiRyVCksIChpbnMgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQiksCisgICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULCAobm90IChvciByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSkpXT47CisKK211bHRpY2xhc3MgQml0d2lzZU5vcgoreworICBkZWYgdjE2aTg6IE5PUlZlY0luc3Q8djE2aTg+OworICBkZWYgdjhpMTY6IE5PUlZlY0luc3Q8djhpMTY+OworICBkZWYgdjRpMzI6IE5PUlZlY0luc3Q8djRpMzI+OworICBkZWYgdjJpNjQ6IE5PUlZlY0luc3Q8djJpNjQ+OworCisgIGRlZiByMTI4OiAgTk9SUmVnSW5zdDxHUFJDPjsKKyAgZGVmIHI2NDogICBOT1JSZWdJbnN0PFI2NEM+OworICBkZWYgcjMyOiAgIE5PUlJlZ0luc3Q8UjMyQz47CisgIGRlZiByMTY6ICAgTk9SUmVnSW5zdDxSMTZDPjsKKyAgZGVmIHI4OiAgICBOT1JSZWdJbnN0PFI4Qz47Cit9CisKK2RlZm0gTk9SIDogQml0d2lzZU5vcjsKKworLy8gU2VsZWN0IGJpdHM6CitjbGFzcyBTRUxCSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJSRm9ybTwwYjEwMDAsIE9PTCwgSU9MLCAic2VsYlx0JHJULCAkckEsICRyQiwgJHJDIiwKKyAgICAgICAgICAgIEludGVnZXJPcCwgcGF0dGVybj47CisKK2NsYXNzIFNFTEJWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlLCBQYXRGcmFnIHZub3RfZnJhZyA9IHZub3Q+OgorICBTRUxCSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgIChvciAoYW5kICh2ZWN0eXBlIFZFQ1JFRzokckMpLCAodmVjdHlwZSBWRUNSRUc6JHJCKSksCisgICAgICAgICAgICAgICAgICAgICAoYW5kICh2bm90X2ZyYWcgKHZlY3R5cGUgVkVDUkVHOiRyQykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdHlwZSBWRUNSRUc6JHJBKSkpKV0+OworCitjbGFzcyBTRUxCVmVjVkNvbmRJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgU0VMQkluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiwgVkVDUkVHOiRyQyksCisgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAoc2VsZWN0ICh2ZWN0eXBlIFZFQ1JFRzokckMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0eXBlIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0eXBlIFZFQ1JFRzokckEpKSldPjsKKworY2xhc3MgU0VMQlZlY0NvbmRJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgU0VMQkluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiwgUjMyQzokckMpLAorICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgKHNlbGVjdCBSMzJDOiRyQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdHlwZSBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdHlwZSBWRUNSRUc6JHJBKSkpXT47CisKK2NsYXNzIFNFTEJSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgU0VMQkluc3Q8KG91dHMgcmNsYXNzOiRyVCksIChpbnMgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQiwgcmNsYXNzOiRyQyksCisgICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsCisgICAgICAgICAgICAgICAgIChvciAoYW5kIHJjbGFzczokckIsIHJjbGFzczokckMpLAorICAgICAgICAgICAgICAgICAgICAgKGFuZCByY2xhc3M6JHJBLCAobm90IHJjbGFzczokckMpKSkpXT47CisKK2NsYXNzIFNFTEJSZWdDb25kSW5zdDxSZWdpc3RlckNsYXNzIHJjb25kLCBSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgIFNFTEJJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIsIHJjb25kOiRyQyksCisgICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsCisgICAgICAgICAgICAgICAgIChzZWxlY3QgcmNvbmQ6JHJDLCByY2xhc3M6JHJCLCByY2xhc3M6JHJBKSldPjsKKworbXVsdGljbGFzcyBTZWxlY3RCaXRzCit7CisgIGRlZiB2MTZpODogU0VMQlZlY0luc3Q8djE2aTg+OworICBkZWYgdjhpMTY6IFNFTEJWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHY0aTMyOiBTRUxCVmVjSW5zdDx2NGkzMj47CisgIGRlZiB2Mmk2NDogU0VMQlZlY0luc3Q8djJpNjQsIHZub3RfY2VsbF9jb252PjsKKworICBkZWYgcjEyODogIFNFTEJSZWdJbnN0PEdQUkM+OworICBkZWYgcjY0OiAgIFNFTEJSZWdJbnN0PFI2NEM+OworICBkZWYgcjMyOiAgIFNFTEJSZWdJbnN0PFIzMkM+OworICBkZWYgcjE2OiAgIFNFTEJSZWdJbnN0PFIxNkM+OworICBkZWYgcjg6ICAgIFNFTEJSZWdJbnN0PFI4Qz47CisKKyAgZGVmIHYxNmk4X2NvbmQ6IFNFTEJWZWNDb25kSW5zdDx2MTZpOD47CisgIGRlZiB2OGkxNl9jb25kOiBTRUxCVmVjQ29uZEluc3Q8djhpMTY+OworICBkZWYgdjRpMzJfY29uZDogU0VMQlZlY0NvbmRJbnN0PHY0aTMyPjsKKyAgZGVmIHYyaTY0X2NvbmQ6IFNFTEJWZWNDb25kSW5zdDx2Mmk2ND47CisKKyAgZGVmIHYxNmk4X3Zjb25kOiBTRUxCVmVjQ29uZEluc3Q8djE2aTg+OworICBkZWYgdjhpMTZfdmNvbmQ6IFNFTEJWZWNDb25kSW5zdDx2OGkxNj47CisgIGRlZiB2NGkzMl92Y29uZDogU0VMQlZlY0NvbmRJbnN0PHY0aTMyPjsKKyAgZGVmIHYyaTY0X3Zjb25kOiBTRUxCVmVjQ29uZEluc3Q8djJpNjQ+OworCisgIGRlZiB2NGYzMl9jb25kOgorICAgICAgICBTRUxCSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAgICAgICAgICAgICAgWyhzZXQgKHY0ZjMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ICh2NGkzMiBWRUNSRUc6JHJDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRmMzIgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIFZFQ1JFRzokckEpKSldPjsKKworICAvLyBTRUxCcjY0X2NvbmQgaXMgZGVmaW5lZCBpbiBTUFU2NEluc3RySW5mby50ZAorICBkZWYgcjMyX2NvbmQ6ICAgU0VMQlJlZ0NvbmRJbnN0PFIzMkMsIFIzMkM+OworICBkZWYgZjMyX2NvbmQ6ICAgU0VMQlJlZ0NvbmRJbnN0PFIzMkMsIFIzMkZQPjsKKyAgZGVmIHIxNl9jb25kOiAgIFNFTEJSZWdDb25kSW5zdDxSMTZDLCBSMTZDPjsKKyAgZGVmIHI4X2NvbmQ6ICAgIFNFTEJSZWdDb25kSW5zdDxSOEMsICBSOEM+OworfQorCitkZWZtIFNFTEIgOiBTZWxlY3RCaXRzOworCitjbGFzcyBTUFVzZWxiUGF0VmVjPFZhbHVlVHlwZSB2ZWN0eXBlLCBTUFVJbnN0ciBpbnN0PjoKKyAgIFBhdDwoU1BVc2VsYiAodmVjdHlwZSBWRUNSRUc6JHJBKSwgKHZlY3R5cGUgVkVDUkVHOiRyQiksICh2ZWN0eXBlIFZFQ1JFRzokckMpKSwKKyAgICAgICAoaW5zdCBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKT47CisKK2RlZiA6IFNQVXNlbGJQYXRWZWM8djE2aTgsIFNFTEJ2MTZpOD47CitkZWYgOiBTUFVzZWxiUGF0VmVjPHY4aTE2LCBTRUxCdjhpMTY+OworZGVmIDogU1BVc2VsYlBhdFZlYzx2NGkzMiwgU0VMQnY0aTMyPjsKK2RlZiA6IFNQVXNlbGJQYXRWZWM8djJpNjQsIFNFTEJ2Mmk2ND47CisKK2NsYXNzIFNQVXNlbGJQYXRSZWc8UmVnaXN0ZXJDbGFzcyByY2xhc3MsIFNQVUluc3RyIGluc3Q+OgorICAgUGF0PChTUFVzZWxiIHJjbGFzczokckEsIHJjbGFzczokckIsIHJjbGFzczokckMpLAorICAgICAgIChpbnN0IHJjbGFzczokckEsIHJjbGFzczokckIsIHJjbGFzczokckMpPjsKKworZGVmIDogU1BVc2VsYlBhdFJlZzxSOEMsICAgU0VMQnI4PjsKK2RlZiA6IFNQVXNlbGJQYXRSZWc8UjE2QywgIFNFTEJyMTY+OworZGVmIDogU1BVc2VsYlBhdFJlZzxSMzJDLCAgU0VMQnIzMj47CitkZWYgOiBTUFVzZWxiUGF0UmVnPFI2NEMsICBTRUxCcjY0PjsKKworLy8gRVFWOiBFcXVpdmFsZW5jZSAoMSBmb3IgZWFjaCBzYW1lIGJpdCwgb3RoZXJ3aXNlIDApCisvLworLy8gTm90ZTogVGhlcmUgYXJlIGEgbG90IG9mIHdheXMgdG8gbWF0Y2ggdGhpcyBiaXQgb3BlcmF0b3IgYW5kIHRoZXNlIHBhdHRlcm5zCisvLyBhdHRlbXB0IHRvIGJlIGFzIGV4aGF1c3RpdmUgYXMgcG9zc2libGUuCisKK2NsYXNzIEVRVkluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybTwwYjEwMDEwMDEwMDAwLCBPT0wsIElPTCwgImVxdlx0JHJULCAkckEsICRyQiIsCisgICAgICAgICAgIEludGVnZXJPcCwgcGF0dGVybj47CisKK2NsYXNzIEVRVlZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIEVRVkluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgIChvciAoYW5kICh2ZWN0eXBlIFZFQ1JFRzokckEpLCAodmVjdHlwZSBWRUNSRUc6JHJCKSksCisgICAgICAgICAgICAgICAgICAgICAgKGFuZCAodm5vdCAodmVjdHlwZSBWRUNSRUc6JHJBKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodm5vdCAodmVjdHlwZSBWRUNSRUc6JHJCKSkpKSldPjsKKworY2xhc3MgRVFWUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgRVFWSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSwKKyAgICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsIChvciAoYW5kIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKG5vdCByY2xhc3M6JHJBKSwgKG5vdCByY2xhc3M6JHJCKSkpKV0+OworCitjbGFzcyBFUVZWZWNQYXR0ZXJuMTxWYWx1ZVR5cGUgdmVjdHlwZT46CisgIEVRVkluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgKHhvciAodmVjdHlwZSBWRUNSRUc6JHJBKSwgKHZub3QgKHZlY3R5cGUgVkVDUkVHOiRyQikpKSldPjsKKworY2xhc3MgRVFWUmVnUGF0dGVybjE8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICBFUVZJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsICh4b3IgcmNsYXNzOiRyQSwgKG5vdCByY2xhc3M6JHJCKSkpXT47CisKK2NsYXNzIEVRVlZlY1BhdHRlcm4yPFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgRVFWSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAob3IgKGFuZCAodmVjdHlwZSBWRUNSRUc6JHJBKSwgKHZlY3R5cGUgVkVDUkVHOiRyQikpLAorICAgICAgICAgICAgICAgICAgICAodm5vdCAob3IgKHZlY3R5cGUgVkVDUkVHOiRyQSksICh2ZWN0eXBlIFZFQ1JFRzokckIpKSkpKV0+OworCitjbGFzcyBFUVZSZWdQYXR0ZXJuMjxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgIEVRVkluc3Q8KG91dHMgcmNsYXNzOiRyVCksIChpbnMgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQiksCisgICAgICAgICAgWyhzZXQgcmNsYXNzOiRyVCwKKyAgICAgICAgICAgICAgICAob3IgKGFuZCByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgKG5vdCAob3IgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQikpKSldPjsKKworY2xhc3MgRVFWVmVjUGF0dGVybjM8VmFsdWVUeXBlIHZlY3R5cGU+OgorICBFUVZJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgIChub3QgKHhvciAodmVjdHlwZSBWRUNSRUc6JHJBKSwgKHZlY3R5cGUgVkVDUkVHOiRyQikpKSldPjsKKworY2xhc3MgRVFWUmVnUGF0dGVybjM8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICBFUVZJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsIChub3QgKHhvciByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSkpXT47CisKK211bHRpY2xhc3MgQml0RXF1aXZhbGVuY2UKK3sKKyAgZGVmIHYxNmk4OiBFUVZWZWNJbnN0PHYxNmk4PjsKKyAgZGVmIHY4aTE2OiBFUVZWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHY0aTMyOiBFUVZWZWNJbnN0PHY0aTMyPjsKKyAgZGVmIHYyaTY0OiBFUVZWZWNJbnN0PHYyaTY0PjsKKworICBkZWYgdjE2aThfMTogRVFWVmVjUGF0dGVybjE8djE2aTg+OworICBkZWYgdjhpMTZfMTogRVFWVmVjUGF0dGVybjE8djhpMTY+OworICBkZWYgdjRpMzJfMTogRVFWVmVjUGF0dGVybjE8djRpMzI+OworICBkZWYgdjJpNjRfMTogRVFWVmVjUGF0dGVybjE8djJpNjQ+OworCisgIGRlZiB2MTZpOF8yOiBFUVZWZWNQYXR0ZXJuMjx2MTZpOD47CisgIGRlZiB2OGkxNl8yOiBFUVZWZWNQYXR0ZXJuMjx2OGkxNj47CisgIGRlZiB2NGkzMl8yOiBFUVZWZWNQYXR0ZXJuMjx2NGkzMj47CisgIGRlZiB2Mmk2NF8yOiBFUVZWZWNQYXR0ZXJuMjx2Mmk2ND47CisKKyAgZGVmIHYxNmk4XzM6IEVRVlZlY1BhdHRlcm4zPHYxNmk4PjsKKyAgZGVmIHY4aTE2XzM6IEVRVlZlY1BhdHRlcm4zPHY4aTE2PjsKKyAgZGVmIHY0aTMyXzM6IEVRVlZlY1BhdHRlcm4zPHY0aTMyPjsKKyAgZGVmIHYyaTY0XzM6IEVRVlZlY1BhdHRlcm4zPHYyaTY0PjsKKworICBkZWYgcjEyODogIEVRVlJlZ0luc3Q8R1BSQz47CisgIGRlZiByNjQ6ICAgRVFWUmVnSW5zdDxSNjRDPjsKKyAgZGVmIHIzMjogICBFUVZSZWdJbnN0PFIzMkM+OworICBkZWYgcjE2OiAgIEVRVlJlZ0luc3Q8UjE2Qz47CisgIGRlZiByODogICAgRVFWUmVnSW5zdDxSOEM+OworCisgIGRlZiByMTI4XzE6IEVRVlJlZ1BhdHRlcm4xPEdQUkM+OworICBkZWYgcjY0XzE6ICBFUVZSZWdQYXR0ZXJuMTxSNjRDPjsKKyAgZGVmIHIzMl8xOiAgRVFWUmVnUGF0dGVybjE8UjMyQz47CisgIGRlZiByMTZfMTogIEVRVlJlZ1BhdHRlcm4xPFIxNkM+OworICBkZWYgcjhfMTogICBFUVZSZWdQYXR0ZXJuMTxSOEM+OworCisgIGRlZiByMTI4XzI6IEVRVlJlZ1BhdHRlcm4yPEdQUkM+OworICBkZWYgcjY0XzI6ICBFUVZSZWdQYXR0ZXJuMjxSNjRDPjsKKyAgZGVmIHIzMl8yOiAgRVFWUmVnUGF0dGVybjI8UjMyQz47CisgIGRlZiByMTZfMjogIEVRVlJlZ1BhdHRlcm4yPFIxNkM+OworICBkZWYgcjhfMjogICBFUVZSZWdQYXR0ZXJuMjxSOEM+OworCisgIGRlZiByMTI4XzM6IEVRVlJlZ1BhdHRlcm4zPEdQUkM+OworICBkZWYgcjY0XzM6ICBFUVZSZWdQYXR0ZXJuMzxSNjRDPjsKKyAgZGVmIHIzMl8zOiAgRVFWUmVnUGF0dGVybjM8UjMyQz47CisgIGRlZiByMTZfMzogIEVRVlJlZ1BhdHRlcm4zPFIxNkM+OworICBkZWYgcjhfMzogICBFUVZSZWdQYXR0ZXJuMzxSOEM+OworfQorCitkZWZtIEVRVjogQml0RXF1aXZhbGVuY2U7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBWZWN0b3Igc2h1ZmZsZS4uLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNQVXNodWZmbGUgaXMgZ2VuZXJhdGVkIGluIExvd2VyVkVDVE9SX1NIVUZGTEUgYW5kIGdldHMgcmVwbGFjZWQgd2l0aCBTSFVGQi4KKy8vIFNlZSB0aGUgU1BVc2h1ZmZsZSBTRE5vZGUgb3BlcmFuZCBhYm92ZSwgd2hpY2ggc2V0cyB1cCB0aGUgREFHIHBhdHRlcm4KKy8vIG1hdGNoZXIgdG8gZW1pdCBzb21ldGhpbmcgd2hlbiB0aGUgTG93ZXJWRUNUT1JfU0hVRkZMRSBnZW5lcmF0ZXMgYSBub2RlIHdpdGgKKy8vIHRoZSBTUFVJU0Q6OlNIVUZCIG9wY29kZS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFNIVUZCSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJSRm9ybTwwYjEwMDAsIE9PTCwgSU9MLCAic2h1ZmJcdCRyVCwgJHJBLCAkckIsICRyQyIsCisgICAgICAgICAgICBJbnRlZ2VyT3AsIHBhdHRlcm4+OworCitjbGFzcyBTSFVGQlZlY0luc3Q8VmFsdWVUeXBlIHJlc3VsdHZlYywgVmFsdWVUeXBlIG1hc2t2ZWM+OgorICAgIFNIVUZCSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAgICAgICAgICAgWyhzZXQgKHJlc3VsdHZlYyBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgKFNQVXNodWZmbGUgKHJlc3VsdHZlYyBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdHZlYyBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hc2t2ZWMgVkVDUkVHOiRyQykpKV0+OworCitjbGFzcyBTSFVGQkdQUkNJbnN0OgorICAgIFNIVUZCSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBHUFJDOiRyQSwgR1BSQzokckIsIFZFQ1JFRzokckMpLAorICAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCittdWx0aWNsYXNzIFNodWZmbGVCeXRlcworeworICBkZWYgdjE2aTggICAgIDogU0hVRkJWZWNJbnN0PHYxNmk4LCB2MTZpOD47CisgIGRlZiB2MTZpOF9tMzIgOiBTSFVGQlZlY0luc3Q8djE2aTgsIHY0aTMyPjsKKyAgZGVmIHY4aTE2ICAgICA6IFNIVUZCVmVjSW5zdDx2OGkxNiwgdjE2aTg+OworICBkZWYgdjhpMTZfbTMyIDogU0hVRkJWZWNJbnN0PHY4aTE2LCB2NGkzMj47CisgIGRlZiB2NGkzMiAgICAgOiBTSFVGQlZlY0luc3Q8djRpMzIsIHYxNmk4PjsKKyAgZGVmIHY0aTMyX20zMiA6IFNIVUZCVmVjSW5zdDx2NGkzMiwgdjRpMzI+OworICBkZWYgdjJpMzIgICAgIDogU0hVRkJWZWNJbnN0PHYyaTMyLCB2MTZpOD47CisgIGRlZiB2MmkzMl9tMzIgOiBTSFVGQlZlY0luc3Q8djJpMzIsIHY0aTMyPjsKKyAgZGVmIHYyaTY0ICAgICA6IFNIVUZCVmVjSW5zdDx2Mmk2NCwgdjE2aTg+OworICBkZWYgdjJpNjRfbTMyIDogU0hVRkJWZWNJbnN0PHYyaTY0LCB2NGkzMj47CisKKyAgZGVmIHY0ZjMyICAgICA6IFNIVUZCVmVjSW5zdDx2NGYzMiwgdjE2aTg+OworICBkZWYgdjRmMzJfbTMyIDogU0hVRkJWZWNJbnN0PHY0ZjMyLCB2NGkzMj47CisgIGRlZiB2MmYzMiAgICAgOiBTSFVGQlZlY0luc3Q8djJmMzIsIHYxNmk4PjsKKyAgZGVmIHYyZjMyX20zMiA6IFNIVUZCVmVjSW5zdDx2MmYzMiwgdjRpMzI+OworCisgIGRlZiB2MmY2NCAgICAgOiBTSFVGQlZlY0luc3Q8djJmNjQsIHYxNmk4PjsKKyAgZGVmIHYyZjY0X20zMiA6IFNIVUZCVmVjSW5zdDx2MmY2NCwgdjRpMzI+OworCisgIGRlZiBncHJjICAgICAgOiBTSFVGQkdQUkNJbnN0OworfQorCitkZWZtIFNIVUZCIDogU2h1ZmZsZUJ5dGVzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2hpZnQgYW5kIHJvdGF0ZSBncm91cDoKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFNITEhJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm08MGIxMTExMTAxMDAwMCwgT09MLCBJT0wsICJzaGxoXHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgICAgUm90YXRlU2hpZnQsIHBhdHRlcm4+OworCitjbGFzcyBTSExIVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgU0hMSEluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgUjE2QzokckIpLAorICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgIChTUFV2ZWNfc2hsICh2ZWN0eXBlIFZFQ1JFRzokckEpLCBSMTZDOiRyQikpXT47CisKK211bHRpY2xhc3MgU2hpZnRMZWZ0SGFsZndvcmQKK3sKKyAgZGVmIHY4aTE2OiBTSExIVmVjSW5zdDx2OGkxNj47CisgIGRlZiByMTY6ICAgU0hMSEluc3Q8KG91dHMgUjE2QzokclQpLCAoaW5zIFIxNkM6JHJBLCBSMTZDOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjE2QzokclQsIChzaGwgUjE2QzokckEsIFIxNkM6JHJCKSldPjsKKyAgZGVmIHIxNl9yMzI6IFNITEhJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjE2QzokclQsIChzaGwgUjE2QzokckEsIFIzMkM6JHJCKSldPjsKK30KKworZGVmbSBTSExIIDogU2hpZnRMZWZ0SGFsZndvcmQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFNITEhJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUkk3Rm9ybTwwYjExMTExMDEwMDAwLCBPT0wsIElPTCwgInNobGhpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFNITEhJVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgU0hMSElJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHU3aW1tOiR2YWwpLAorICAgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgKFNQVXZlY19zaGwgKHZlY3R5cGUgVkVDUkVHOiRyQSksIChpMTYgdWltbTc6JHZhbCkpKV0+OworCittdWx0aWNsYXNzIFNoaWZ0TGVmdEhhbGZ3b3JkSW1tCit7CisgIGRlZiB2OGkxNjogU0hMSElWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHIxNjogU0hMSElJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgdTdpbW06JHZhbCksCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMTZDOiRyVCwgKHNobCBSMTZDOiRyQSwgKGkxNiB1aW1tNzokdmFsKSkpXT47Cit9CisKK2RlZm0gU0hMSEkgOiBTaGlmdExlZnRIYWxmd29yZEltbTsKKworZGVmIDogUGF0PChTUFV2ZWNfc2hsICh2OGkxNiBWRUNSRUc6JHJBKSwgKGkzMiB1aW1tNzokdmFsKSksCisgICAgICAgICAgKFNITEhJdjhpMTYgVkVDUkVHOiRyQSwgKFRPX0lNTTE2IHVpbW03OiR2YWwpKT47CisKK2RlZiA6IFBhdDwoc2hsIFIxNkM6JHJBLCAoaTMyIHVpbW03OiR2YWwpKSwKKyAgICAgICAgICAoU0hMSElyMTYgUjE2QzokckEsIChUT19JTU0xNiB1aW1tNzokdmFsKSk+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBTSExJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm08MGIxMTExMTAxMDAwMCwgT09MLCBJT0wsICJzaGxcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK211bHRpY2xhc3MgU2hpZnRMZWZ0V29yZAoreworICBkZWYgdjRpMzI6CisgICAgICBTSExJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFIxNkM6JHJCKSwKKyAgICAgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAoU1BVdmVjX3NobCAodjRpMzIgVkVDUkVHOiRyQSksIFIxNkM6JHJCKSldPjsKKyAgZGVmIHIzMjoKKyAgICAgIFNITEluc3Q8KG91dHMgUjMyQzokclQpLCAoaW5zIFIzMkM6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAoc2hsIFIzMkM6JHJBLCBSMzJDOiRyQikpXT47Cit9CisKK2RlZm0gU0hMOiBTaGlmdExlZnRXb3JkOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBTSExJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUkk3Rm9ybTwwYjExMTExMDEwMDAwLCBPT0wsIElPTCwgInNobGlcdCRyVCwgJHJBLCAkdmFsIiwKKyAgICAgICAgICAgIFJvdGF0ZVNoaWZ0LCBwYXR0ZXJuPjsKKworbXVsdGljbGFzcyBTaGlmdExlZnRXb3JkSW1tCit7CisgIGRlZiB2NGkzMjoKKyAgICBTSExJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCB1N2ltbV9pMzI6JHZhbCksCisgICAgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgIChTUFV2ZWNfc2hsICh2NGkzMiBWRUNSRUc6JHJBKSwgKGkzMiB1aW1tNzokdmFsKSkpXT47CisKKyAgZGVmIHIzMjoKKyAgICBTSExJSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIHU3aW1tX2kzMjokdmFsKSwKKyAgICAgICAgICAgICBbKHNldCBSMzJDOiRyVCwgKHNobCBSMzJDOiRyQSwgKGkzMiB1aW1tNzokdmFsKSkpXT47Cit9CisKK2RlZm0gU0hMSSA6IFNoaWZ0TGVmdFdvcmRJbW07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTSExRQkkgdmVjIGZvcm06IE5vdGUgdGhhdCB0aGlzIHdpbGwgc2hpZnQgdGhlIGVudGlyZSB2ZWN0b3IgKHRoZSAxMjgtYml0CisvLyByZWdpc3RlcikgdG8gdGhlIGxlZnQuIFZlY3RvciBmb3JtIGlzIGhlcmUgdG8gZW5zdXJlIHR5cGUgY29ycmVjdG5lc3MuCisvLworLy8gVGhlIHNoaWZ0IGNvdW50IGlzIGluIHRoZSBsb3dlc3QgMyBiaXRzICgyOS0zMSkgb2YgJHJCLCBzbyBvbmx5IGEgYml0IHNoaWZ0CisvLyBvZiA3IGJpdHMgaXMgYWN0dWFsbHkgcG9zc2libGUuCisvLworLy8gTm90ZSBhbHNvIHRoYXQgU0hMUUJJL1NITFFCSUkgYXJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTSExRQlkvU0hMUUJZSQorLy8gdG8gc2hpZnQgaTY0IGFuZCBpMTI4LiBTSExRQkkgaXMgdGhlIHJlc2lkdWFsIGxlZnQgb3ZlciBhZnRlciBzaGlmdGluZyBieQorLy8gYnl0ZXMgd2l0aCBTSExRQlkuCisKK2NsYXNzIFNITFFCSUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybTwwYjExMDExMDExMTAwLCBPT0wsIElPTCwgInNobHFiaVx0JHJULCAkckEsICRyQiIsCisgICAgICAgICAgIFJvdGF0ZVNoaWZ0LCBwYXR0ZXJuPjsKKworY2xhc3MgU0hMUUJJVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgU0hMUUJJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgIChTUFVzaGxxdWFkX2xfYml0cyAodmVjdHlwZSBWRUNSRUc6JHJBKSwgUjMyQzokckIpKV0+OworCitjbGFzcyBTSExRQklSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBTSExRQklJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK211bHRpY2xhc3MgU2hpZnRMZWZ0UXVhZEJ5Qml0cworeworICBkZWYgdjE2aTg6IFNITFFCSVZlY0luc3Q8djE2aTg+OworICBkZWYgdjhpMTY6IFNITFFCSVZlY0luc3Q8djhpMTY+OworICBkZWYgdjRpMzI6IFNITFFCSVZlY0luc3Q8djRpMzI+OworICBkZWYgdjRmMzI6IFNITFFCSVZlY0luc3Q8djRmMzI+OworICBkZWYgdjJpNjQ6IFNITFFCSVZlY0luc3Q8djJpNjQ+OworICBkZWYgdjJmNjQ6IFNITFFCSVZlY0luc3Q8djJmNjQ+OworCisgIGRlZiByMTI4OiAgU0hMUUJJUmVnSW5zdDxHUFJDPjsKK30KKworZGVmbSBTSExRQkkgOiBTaGlmdExlZnRRdWFkQnlCaXRzOworCisvLyBTZWUgbm90ZSBhYm92ZSBvbiBTSExRQkkuIEluIHRoaXMgY2FzZSwgdGhlIHByZWRpY2F0ZSBhY3R1YWxseSBkb2VzIHRoZW4KKy8vIGVuZm9yY2VtZW50LCB3aGVyZWFzIHdpdGggU0hMUUJJLCB3ZSBoYXZlIHRvICJ0YWtlIGl0IG9uIGZhaXRoLiIKK2NsYXNzIFNITFFCSUlJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSSTdGb3JtPDBiMTEwMTExMTExMDAsIE9PTCwgSU9MLCAic2hscWJpaVx0JHJULCAkckEsICR2YWwiLAorICAgICAgICAgICAgUm90YXRlU2hpZnQsIHBhdHRlcm4+OworCitjbGFzcyBTSExRQklJVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgU0hMUUJJSUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgdTdpbW1faTMyOiR2YWwpLAorICAgICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAgIChTUFVzaGxxdWFkX2xfYml0cyAodmVjdHlwZSBWRUNSRUc6JHJBKSwgKGkzMiBiaXRzaGlmdDokdmFsKSkpXT47CisKK211bHRpY2xhc3MgU2hpZnRMZWZ0UXVhZEJ5Qml0c0ltbQoreworICBkZWYgdjE2aTggOiBTSExRQklJVmVjSW5zdDx2MTZpOD47CisgIGRlZiB2OGkxNiA6IFNITFFCSUlWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHY0aTMyIDogU0hMUUJJSVZlY0luc3Q8djRpMzI+OworICBkZWYgdjRmMzIgOiBTSExRQklJVmVjSW5zdDx2NGYzMj47CisgIGRlZiB2Mmk2NCA6IFNITFFCSUlWZWNJbnN0PHYyaTY0PjsKKyAgZGVmIHYyZjY0IDogU0hMUUJJSVZlY0luc3Q8djJmNjQ+OworfQorCitkZWZtIFNITFFCSUkgOiBTaGlmdExlZnRRdWFkQnlCaXRzSW1tOworCisvLyBTSExRQlksIFNITFFCWUkgdmVjdG9yIGZvcm1zOiBTaGlmdCB0aGUgZW50aXJlIHZlY3RvciB0byB0aGUgbGVmdCBieSBieXRlcywKKy8vIG5vdCBieSBiaXRzLiBTZWUgbm90ZXMgYWJvdmUgb24gU0hMUUJJLgorCitjbGFzcyBTSExRQllJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSSTdGb3JtPDBiMTExMTEwMTExMDAsIE9PTCwgSU9MLCAic2hscWJ5XHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgICAgIFJvdGF0ZVNoaWZ0LCBwYXR0ZXJuPjsKKworY2xhc3MgU0hMUUJZVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgU0hMUUJZSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgIChTUFVzaGxxdWFkX2xfYnl0ZXMgKHZlY3R5cGUgVkVDUkVHOiRyQSksIFIzMkM6JHJCKSldPjsKKworbXVsdGljbGFzcyBTaGlmdExlZnRRdWFkQnl0ZXMKK3sKKyAgZGVmIHYxNmk4OiBTSExRQllWZWNJbnN0PHYxNmk4PjsKKyAgZGVmIHY4aTE2OiBTSExRQllWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHY0aTMyOiBTSExRQllWZWNJbnN0PHY0aTMyPjsKKyAgZGVmIHY0ZjMyOiBTSExRQllWZWNJbnN0PHY0ZjMyPjsKKyAgZGVmIHYyaTY0OiBTSExRQllWZWNJbnN0PHYyaTY0PjsKKyAgZGVmIHYyZjY0OiBTSExRQllWZWNJbnN0PHYyZjY0PjsKKyAgZGVmIHIxMjg6IFNITFFCWUluc3Q8KG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJULCAoU1BVc2hscXVhZF9sX2J5dGVzIEdQUkM6JHJBLCBSMzJDOiRyQikpXT47Cit9CisKK2RlZm0gU0hMUUJZOiBTaGlmdExlZnRRdWFkQnl0ZXM7CisKK2NsYXNzIFNITFFCWUlJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSSTdGb3JtPDBiMTExMTExMTExMDAsIE9PTCwgSU9MLCAic2hscWJ5aVx0JHJULCAkckEsICR2YWwiLAorICAgICAgICAgICAgUm90YXRlU2hpZnQsIHBhdHRlcm4+OworCitjbGFzcyBTSExRQllJVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgU0hMUUJZSUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgdTdpbW1faTMyOiR2YWwpLAorICAgICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAgIChTUFVzaGxxdWFkX2xfYnl0ZXMgKHZlY3R5cGUgVkVDUkVHOiRyQSksIChpMzIgdWltbTc6JHZhbCkpKV0+OworCittdWx0aWNsYXNzIFNoaWZ0TGVmdFF1YWRCeXRlc0ltbQoreworICBkZWYgdjE2aTg6IFNITFFCWUlWZWNJbnN0PHYxNmk4PjsKKyAgZGVmIHY4aTE2OiBTSExRQllJVmVjSW5zdDx2OGkxNj47CisgIGRlZiB2NGkzMjogU0hMUUJZSVZlY0luc3Q8djRpMzI+OworICBkZWYgdjRmMzI6IFNITFFCWUlWZWNJbnN0PHY0ZjMyPjsKKyAgZGVmIHYyaTY0OiBTSExRQllJVmVjSW5zdDx2Mmk2ND47CisgIGRlZiB2MmY2NDogU0hMUUJZSVZlY0luc3Q8djJmNjQ+OworICBkZWYgcjEyODogIFNITFFCWUlJbnN0PChvdXRzIEdQUkM6JHJUKSwgKGlucyBHUFJDOiRyQSwgdTdpbW1faTMyOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTUFVzaGxxdWFkX2xfYnl0ZXMgR1BSQzokckEsIChpMzIgdWltbTc6JHZhbCkpKV0+OworfQorCitkZWZtIFNITFFCWUkgOiBTaGlmdExlZnRRdWFkQnl0ZXNJbW07CisKK2NsYXNzIFNITFFCWUJJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMDAxMTEwMDExMTEsIE9PTCwgSU9MLCAic2hscWJ5YmlcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFNITFFCWUJJVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgU0hMUUJZQklJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCitjbGFzcyBTSExRQllCSVJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIFNITFFCWUJJSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK211bHRpY2xhc3MgU2hpZnRMZWZ0UXVhZEJ5dGVzQml0Q291bnQKK3sKKyAgZGVmIHYxNmk4OiBTSExRQllCSVZlY0luc3Q8djE2aTg+OworICBkZWYgdjhpMTY6IFNITFFCWUJJVmVjSW5zdDx2OGkxNj47CisgIGRlZiB2NGkzMjogU0hMUUJZQklWZWNJbnN0PHY0aTMyPjsKKyAgZGVmIHY0ZjMyOiBTSExRQllCSVZlY0luc3Q8djRmMzI+OworICBkZWYgdjJpNjQ6IFNITFFCWUJJVmVjSW5zdDx2Mmk2ND47CisgIGRlZiB2MmY2NDogU0hMUUJZQklWZWNJbnN0PHYyZjY0PjsKKworICBkZWYgcjEyODogIFNITFFCWUJJUmVnSW5zdDxHUFJDPjsKK30KKworZGVmbSBTSExRQllCSSA6IFNoaWZ0TGVmdFF1YWRCeXRlc0JpdENvdW50OworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIFJvdGF0ZSBoYWxmd29yZDoKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorY2xhc3MgUk9USEluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybTwwYjAwMTExMDEwMDAwLCBPT0wsIElPTCwgInJvdGhcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFJPVEhWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBST1RISW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAoU1BVdmVjX3JvdGwgVkVDUkVHOiRyQSwgKHY4aTE2IFZFQ1JFRzokckIpKSldPjsKKworY2xhc3MgUk9USFJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIFJPVEhJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsIChyb3RsIHJjbGFzczokckEsIHJjbGFzczokckIpKV0+OworCittdWx0aWNsYXNzIFJvdGF0ZUxlZnRIYWxmd29yZAoreworICBkZWYgdjhpMTY6IFJPVEhWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHIxNjogUk9USFJlZ0luc3Q8UjE2Qz47Cit9CisKK2RlZm0gUk9USDogUm90YXRlTGVmdEhhbGZ3b3JkOworCitkZWYgUk9USHIxNl9yMzI6IFJPVEhJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMTZDOiRyVCwgKHJvdGwgUjE2QzokckEsIFIzMkM6JHJCKSldPjsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBSb3RhdGUgaGFsZndvcmQsIGltbWVkaWF0ZToKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorY2xhc3MgUk9USElJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSSTdGb3JtPDBiMDAxMTExMTAwMDAsIE9PTCwgSU9MLCAicm90aGlcdCRyVCwgJHJBLCAkdmFsIiwKKyAgICAgICAgICAgIFJvdGF0ZVNoaWZ0LCBwYXR0ZXJuPjsKKworY2xhc3MgUk9USElWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBST1RISUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgdTdpbW06JHZhbCksCisgICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAoU1BVdmVjX3JvdGwgVkVDUkVHOiRyQSwgKGkxNiB1aW1tNzokdmFsKSkpXT47CisKK211bHRpY2xhc3MgUm90YXRlTGVmdEhhbGZ3b3JkSW1tCit7CisgIGRlZiB2OGkxNjogUk9USElWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHIxNjogUk9USElJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgdTdpbW06JHZhbCksCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMTZDOiRyVCwgKHJvdGwgUjE2QzokckEsIChpMTYgdWltbTc6JHZhbCkpKV0+OworICBkZWYgcjE2X3IzMjogUk9USElJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgdTdpbW1faTMyOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIxNkM6JHJULCAocm90bCBSMTZDOiRyQSwgKGkzMiB1aW1tNzokdmFsKSkpXT47Cit9CisKK2RlZm0gUk9USEk6IFJvdGF0ZUxlZnRIYWxmd29yZEltbTsKKworZGVmIDogUGF0PChTUFV2ZWNfcm90bCAodjhpMTYgVkVDUkVHOiRyQSksIChpMzIgdWltbTc6JHZhbCkpLAorICAgICAgICAgIChST1RISXY4aTE2IFZFQ1JFRzokckEsIChUT19JTU0xNiBpbW06JHZhbCkpPjsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBSb3RhdGUgd29yZDoKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitjbGFzcyBST1RJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm08MGIwMDAxMTAxMDAwMCwgT09MLCBJT0wsICJyb3RcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFJPVFZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIFJPVEluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgICAoU1BVdmVjX3JvdGwgKHZlY3R5cGUgVkVDUkVHOiRyQSksIFIzMkM6JHJCKSldPjsKKworY2xhc3MgUk9UUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgUk9USW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICBbKHNldCByY2xhc3M6JHJULAorICAgICAgICAgICAgICAgICAgKHJvdGwgcmNsYXNzOiRyQSwgUjMyQzokckIpKV0+OworCittdWx0aWNsYXNzIFJvdGF0ZUxlZnRXb3JkCit7CisgIGRlZiB2NGkzMjogUk9UVmVjSW5zdDx2NGkzMj47CisgIGRlZiByMzI6ICAgUk9UUmVnSW5zdDxSMzJDPjsKK30KKworZGVmbSBST1Q6IFJvdGF0ZUxlZnRXb3JkOworCisvLyBUaGUgcm90YXRlIGFtb3VudCBpcyBpbiB0aGUgc2FtZSBiaXRzIHdoZXRoZXIgd2UndmUgZ290IGFuIDgtYml0LCAxNi1iaXQgb3IKKy8vIDMyLWJpdCByZWdpc3RlcgorZGVmIFJPVHIzMl9yMTZfYW55ZXh0OgorICAgIFJPVEluc3Q8KG91dHMgUjMyQzokclQpLCAoaW5zIFIzMkM6JHJBLCBSMTZDOiRyQiksCisgICAgICAgICAgICBbKHNldCBSMzJDOiRyVCwgKHJvdGwgUjMyQzokckEsIChpMzIgKGFueWV4dCBSMTZDOiRyQikpKSldPjsKKworZGVmIDogUGF0PChyb3RsIFIzMkM6JHJBLCAoaTMyICh6ZXh0IFIxNkM6JHJCKSkpLAorICAgICAgICAgIChST1RyMzJfcjE2X2FueWV4dCBSMzJDOiRyQSwgUjE2QzokckIpPjsKKworZGVmIDogUGF0PChyb3RsIFIzMkM6JHJBLCAoaTMyIChzZXh0IFIxNkM6JHJCKSkpLAorICAgICAgICAgIChST1RyMzJfcjE2X2FueWV4dCBSMzJDOiRyQSwgUjE2QzokckIpPjsKKworZGVmIFJPVHIzMl9yOF9hbnlleHQ6CisgICAgUk9USW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIFI4QzokckIpLAorICAgICAgICAgICAgWyhzZXQgUjMyQzokclQsIChyb3RsIFIzMkM6JHJBLCAoaTMyIChhbnlleHQgUjhDOiRyQikpKSldPjsKKworZGVmIDogUGF0PChyb3RsIFIzMkM6JHJBLCAoaTMyICh6ZXh0IFI4QzokckIpKSksCisgICAgICAgICAgKFJPVHIzMl9yOF9hbnlleHQgUjMyQzokckEsIFI4QzokckIpPjsKKworZGVmIDogUGF0PChyb3RsIFIzMkM6JHJBLCAoaTMyIChzZXh0IFI4QzokckIpKSksCisgICAgICAgICAgKFJPVHIzMl9yOF9hbnlleHQgUjMyQzokckEsIFI4QzokckIpPjsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBSb3RhdGUgd29yZCwgaW1tZWRpYXRlCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKworY2xhc3MgUk9USUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJJN0Zvcm08MGIwMDAxMTExMDAwMCwgT09MLCBJT0wsICJyb3RpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFJPVElWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlLCBPcGVyYW5kIG9wdHlwZSwgVmFsdWVUeXBlIGludHR5cGUsIFBhdExlYWYgcHJlZD46CisgICAgUk9USUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgb3B0eXBlOiR2YWwpLAorICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgIChTUFV2ZWNfcm90bCAodmVjdHlwZSBWRUNSRUc6JHJBKSwgKGludHR5cGUgcHJlZDokdmFsKSkpXT47CisKK2NsYXNzIFJPVElSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBPcGVyYW5kIG9wdHlwZSwgVmFsdWVUeXBlIGludHR5cGUsIFBhdExlYWYgcHJlZD46CisgICAgUk9USUluc3Q8KG91dHMgcmNsYXNzOiRyVCksIChpbnMgcmNsYXNzOiRyQSwgb3B0eXBlOiR2YWwpLAorICAgICAgICAgICAgIFsoc2V0IHJjbGFzczokclQsIChyb3RsIHJjbGFzczokckEsIChpbnR0eXBlIHByZWQ6JHZhbCkpKV0+OworCittdWx0aWNsYXNzIFJvdGF0ZUxlZnRXb3JkSW1tCit7CisgIGRlZiB2NGkzMjogUk9USVZlY0luc3Q8djRpMzIsIHU3aW1tX2kzMiwgaTMyLCB1aW1tNz47CisgIGRlZiB2NGkzMl9pMTY6IFJPVElWZWNJbnN0PHY0aTMyLCB1N2ltbSwgaTE2LCB1aW1tNz47CisgIGRlZiB2NGkzMl9pODogIFJPVElWZWNJbnN0PHY0aTMyLCB1N2ltbV9pOCwgaTgsIHVpbW03PjsKKworICBkZWYgcjMyOiAgICAgICBST1RJUmVnSW5zdDxSMzJDLCB1N2ltbV9pMzIsIGkzMiwgdWltbTc+OworICBkZWYgcjMyX2kxNjogICBST1RJUmVnSW5zdDxSMzJDLCB1N2ltbSwgaTE2LCB1aW1tNz47CisgIGRlZiByMzJfaTg6ICAgIFJPVElSZWdJbnN0PFIzMkMsIHU3aW1tX2k4LCBpOCwgdWltbTc+OworfQorCitkZWZtIFJPVEkgOiBSb3RhdGVMZWZ0V29yZEltbTsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBSb3RhdGUgcXVhZCBieSBieXRlIChjb3VudCkKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitjbGFzcyBST1RRQllJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm08MGIwMDExMTAxMTEwMCwgT09MLCBJT0wsICJyb3RxYnlcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFJPVFFCWVZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIFJPVFFCWUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgICAgICAoU1BVcm90Ynl0ZXNfbGVmdCAodmVjdHlwZSBWRUNSRUc6JHJBKSwgUjMyQzokckIpKV0+OworCittdWx0aWNsYXNzIFJvdGF0ZVF1YWRMZWZ0QnlCeXRlcworeworICBkZWYgdjE2aTg6IFJPVFFCWVZlY0luc3Q8djE2aTg+OworICBkZWYgdjhpMTY6IFJPVFFCWVZlY0luc3Q8djhpMTY+OworICBkZWYgdjRpMzI6IFJPVFFCWVZlY0luc3Q8djRpMzI+OworICBkZWYgdjRmMzI6IFJPVFFCWVZlY0luc3Q8djRmMzI+OworICBkZWYgdjJpNjQ6IFJPVFFCWVZlY0luc3Q8djJpNjQ+OworICBkZWYgdjJmNjQ6IFJPVFFCWVZlY0luc3Q8djJmNjQ+OworfQorCitkZWZtIFJPVFFCWTogUm90YXRlUXVhZExlZnRCeUJ5dGVzOworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIFJvdGF0ZSBxdWFkIGJ5IGJ5dGUgKGNvdW50KSwgaW1tZWRpYXRlCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKworY2xhc3MgUk9UUUJZSUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJJN0Zvcm08MGIwMDExMTExMTEwMCwgT09MLCBJT0wsICJyb3RxYnlpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFJPVFFCWUlWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBST1RRQllJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCB1N2ltbTokdmFsKSwKKyAgICAgICAgICAgICAgICBbKHNldCAodmVjdHlwZSBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAoU1BVcm90Ynl0ZXNfbGVmdCAodmVjdHlwZSBWRUNSRUc6JHJBKSwgKGkxNiB1aW1tNzokdmFsKSkpXT47CisKK211bHRpY2xhc3MgUm90YXRlUXVhZEJ5Qnl0ZXNJbW0KK3sKKyAgZGVmIHYxNmk4OiBST1RRQllJVmVjSW5zdDx2MTZpOD47CisgIGRlZiB2OGkxNjogUk9UUUJZSVZlY0luc3Q8djhpMTY+OworICBkZWYgdjRpMzI6IFJPVFFCWUlWZWNJbnN0PHY0aTMyPjsKKyAgZGVmIHY0ZjMyOiBST1RRQllJVmVjSW5zdDx2NGYzMj47CisgIGRlZiB2Mmk2NDogUk9UUUJZSVZlY0luc3Q8djJpNjQ+OworICBkZWYgdmZpNjQ6IFJPVFFCWUlWZWNJbnN0PHYyZjY0PjsKK30KKworZGVmbSBST1RRQllJOiBSb3RhdGVRdWFkQnlCeXRlc0ltbTsKKworLy8gU2VlIFJPVFFCWSBub3RlIGFib3ZlLgorY2xhc3MgUk9UUUJZQklJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSSTdGb3JtPDBiMDAxMTAwMTExMDAsIE9PTCwgSU9MLAorICAgICAgInJvdHFieWJpXHQkclQsICRyQSwgJHNoaWZ0IiwKKyAgICAgIFJvdGF0ZVNoaWZ0LCBwYXR0ZXJuPjsKKworY2xhc3MgUk9UUUJZQklWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlLCBSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgUk9UUUJZQklJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHJjbGFzczokc2hpZnQpLAorICAgICAgWyhzZXQgKHZlY3R5cGUgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAoU1BVcm90Ynl0ZXNfbGVmdF9iaXRzICh2ZWN0eXBlIFZFQ1JFRzokckEpLCByY2xhc3M6JHNoaWZ0KSldPjsKKworbXVsdGljbGFzcyBSb3RhdGVRdWFkQnlCeXRlc0J5Qml0c2hpZnQgeworICBkZWYgdjE2aThfcjMyOiBST1RRQllCSVZlY0luc3Q8djE2aTgsIFIzMkM+OworICBkZWYgdjhpMTZfcjMyOiBST1RRQllCSVZlY0luc3Q8djhpMTYsIFIzMkM+OworICBkZWYgdjRpMzJfcjMyOiBST1RRQllCSVZlY0luc3Q8djRpMzIsIFIzMkM+OworICBkZWYgdjJpNjRfcjMyOiBST1RRQllCSVZlY0luc3Q8djJpNjQsIFIzMkM+OworfQorCitkZWZtIFJPVFFCWUJJIDogUm90YXRlUXVhZEJ5Qnl0ZXNCeUJpdHNoaWZ0OworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIFNlZSBST1RRQlkgbm90ZSBhYm92ZS4KKy8vCisvLyBBc3N1bWUgdGhhdCB0aGUgdXNlciBvZiB0aGlzIGluc3RydWN0aW9uIGtub3dzIHRvIHNoaWZ0IHRoZSByb3RhdGUgY291bnQKKy8vIGludG8gYml0IDI5CisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKworY2xhc3MgUk9UUUJJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMDAwMTEwMTExMDAsIE9PTCwgSU9MLCAicm90cWJpXHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgICAgUm90YXRlU2hpZnQsIHBhdHRlcm4+OworCitjbGFzcyBST1RRQklWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBST1RRQklJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuIHlldCAqL10+OworCitjbGFzcyBST1RRQklSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBST1RRQklJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuIHlldCAqL10+OworCittdWx0aWNsYXNzIFJvdGF0ZVF1YWRCeUJpdENvdW50Cit7CisgIGRlZiB2MTZpODogUk9UUUJJVmVjSW5zdDx2MTZpOD47CisgIGRlZiB2OGkxNjogUk9UUUJJVmVjSW5zdDx2OGkxNj47CisgIGRlZiB2NGkzMjogUk9UUUJJVmVjSW5zdDx2NGkzMj47CisgIGRlZiB2Mmk2NDogUk9UUUJJVmVjSW5zdDx2Mmk2ND47CisKKyAgZGVmIHIxMjg6ICBST1RRQklSZWdJbnN0PEdQUkM+OworICBkZWYgcjY0OiAgIFJPVFFCSVJlZ0luc3Q8UjY0Qz47Cit9CisKK2RlZm0gUk9UUUJJOiBSb3RhdGVRdWFkQnlCaXRDb3VudDsKKworY2xhc3MgUk9UUUJJSUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJJN0Zvcm08MGIwMDAxMTExMTEwMCwgT09MLCBJT0wsICJyb3RxYmlpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFJPVFFCSUlWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlLCBPcGVyYW5kIG9wdHlwZSwgVmFsdWVUeXBlIGludHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBQYXRMZWFmIHByZWQ+OgorICAgIFJPVFFCSUlJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIG9wdHlwZTokdmFsKSwKKyAgICAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiB5ZXQgKi9dPjsKKworY2xhc3MgUk9UUUJJSVJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3MsIE9wZXJhbmQgb3B0eXBlLCBWYWx1ZVR5cGUgaW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIFBhdExlYWYgcHJlZD46CisgICAgUk9UUUJJSUluc3Q8KG91dHMgcmNsYXNzOiRyVCksIChpbnMgcmNsYXNzOiRyQSwgb3B0eXBlOiR2YWwpLAorICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuIHlldCAqL10+OworCittdWx0aWNsYXNzIFJvdGF0ZVF1YWRCeUJpdENvdW50SW1tCit7CisgIGRlZiB2MTZpODogUk9UUUJJSVZlY0luc3Q8djE2aTgsIHU3aW1tX2kzMiwgaTMyLCB1aW1tNz47CisgIGRlZiB2OGkxNjogUk9UUUJJSVZlY0luc3Q8djhpMTYsIHU3aW1tX2kzMiwgaTMyLCB1aW1tNz47CisgIGRlZiB2NGkzMjogUk9UUUJJSVZlY0luc3Q8djRpMzIsIHU3aW1tX2kzMiwgaTMyLCB1aW1tNz47CisgIGRlZiB2Mmk2NDogUk9UUUJJSVZlY0luc3Q8djJpNjQsIHU3aW1tX2kzMiwgaTMyLCB1aW1tNz47CisKKyAgZGVmIHIxMjg6ICBST1RRQklJUmVnSW5zdDxHUFJDLCB1N2ltbV9pMzIsIGkzMiwgdWltbTc+OworICBkZWYgcjY0OiAgIFJPVFFCSUlSZWdJbnN0PFI2NEMsIHU3aW1tX2kzMiwgaTMyLCB1aW1tNz47Cit9CisKK2RlZm0gUk9UUUJJSSA6IFJvdGF0ZVF1YWRCeUJpdENvdW50SW1tOworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIFJPVEhNIHY4aTE2IGZvcm06CisvLyBOT1RFKDEpOiBObyB2ZWN0b3Igcm90YXRlIGlzIGdlbmVyYXRlZCBieSB0aGUgQy9DKysgZnJvbnRlbmQgKHRvZGF5KSwKKy8vICAgICAgICAgIHNvIHRoaXMgb25seSBtYXRjaGVzIGEgc3ludGhldGljYWxseSBnZW5lcmF0ZWQvbG93ZXJlZCBjb2RlCisvLyAgICAgICAgICBmcmFnbWVudC4KKy8vIE5PVEUoMik6ICRyQiBtdXN0IGJlIG5lZ2F0ZWQgYmVmb3JlIHRoZSByaWdodCByb3RhdGUhCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKworY2xhc3MgUk9USE1JbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm08MGIxMDExMTAxMDAwMCwgT09MLCBJT0wsICJyb3RobVx0JHJULCAkckEsICRyQiIsCisgICAgICAgICAgIFJvdGF0ZVNoaWZ0LCBwYXR0ZXJuPjsKKworZGVmIFJPVEhNdjhpMTY6CisgICAgUk9USE1JbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgWy8qIHNlZSBwYXR0ZXJucyBiZWxvdyAtICRyQiBtdXN0IGJlIG5lZ2F0ZWQgKi9dPjsKKworZGVmIDogUGF0PChTUFV2ZWNfc3JsICh2OGkxNiBWRUNSRUc6JHJBKSwgUjMyQzokckIpLAorICAgICAgICAgIChST1RITXY4aTE2IFZFQ1JFRzokckEsIChTRklyMzIgUjMyQzokckIsIDApKT47CisKK2RlZiA6IFBhdDwoU1BVdmVjX3NybCAodjhpMTYgVkVDUkVHOiRyQSksIFIxNkM6JHJCKSwKKyAgICAgICAgICAoUk9USE12OGkxNiBWRUNSRUc6JHJBLAorICAgICAgICAgICAgICAgICAgICAgIChTRklyMzIgKFhTSFdyMTYgUjE2QzokckIpLCAwKSk+OworCitkZWYgOiBQYXQ8KFNQVXZlY19zcmwgKHY4aTE2IFZFQ1JFRzokckEpLCBSOEM6JHJCKSwKKyAgICAgICAgICAoUk9USE12OGkxNiBWRUNSRUc6JHJBLAorICAgICAgICAgICAgICAgICAgICAgIChTRklyMzIgKFhTSFdyMTYgKFhTQkhyOCBSOEM6JHJCKSApLCAwKSk+OworCisvLyBST1RITSByMTYgZm9ybTogUm90YXRlIDE2LWJpdCBxdWFudGl0eSB0byByaWdodCwgemVybyBmaWxsIGF0IHRoZSBsZWZ0CisvLyBOb3RlOiBUaGlzIGluc3RydWN0aW9uIGRvZXNuJ3QgbWF0Y2ggYSBwYXR0ZXJuIGJlY2F1c2UgckIgbXVzdCBiZSBuZWdhdGVkCisvLyBmb3IgdGhlIGluc3RydWN0aW9uIHRvIHdvcmsuIFRodXMsIHRoZSBwYXR0ZXJuIGJlbG93IHRoZSBpbnN0cnVjdGlvbiEKKworZGVmIFJPVEhNcjE2OgorICAgIFJPVEhNSW5zdDwob3V0cyBSMTZDOiRyVCksIChpbnMgUjE2QzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgWy8qIHNlZSBwYXR0ZXJucyBiZWxvdyAtICRyQiBtdXN0IGJlIG5lZ2F0ZWQhICovXT47CisKK2RlZiA6IFBhdDwoc3JsIFIxNkM6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgKFJPVEhNcjE2IFIxNkM6JHJBLCAoU0ZJcjMyIFIzMkM6JHJCLCAwKSk+OworCitkZWYgOiBQYXQ8KHNybCBSMTZDOiRyQSwgUjE2QzokckIpLAorICAgICAgICAgIChST1RITXIxNiBSMTZDOiRyQSwKKyAgICAgICAgICAgICAgICAgICAgKFNGSXIzMiAoWFNIV3IxNiBSMTZDOiRyQiksIDApKT47CisKK2RlZiA6IFBhdDwoc3JsIFIxNkM6JHJBLCBSOEM6JHJCKSwKKyAgICAgICAgICAoUk9USE1yMTYgUjE2QzokckEsCisgICAgICAgICAgICAgICAgICAgIChTRklyMzIgKFhTSFdyMTYgKFhTQkhyOCBSOEM6JHJCKSApLCAwKSk+OworCisvLyBST1RITUkgdjhpMTYgZm9ybTogU2VlIHRoZSBjb21tZW50IGZvciBST1RITSB2OGkxNi4gVGhlIGRpZmZlcmVuY2UgaGVyZSBpcworLy8gdGhhdCB0aGUgaW1tZWRpYXRlIGNhbiBiZSBjb21wbGVtZW50ZWQsIHNvIHRoYXQgdGhlIHVzZXIgZG9lc24ndCBoYXZlIHRvCisvLyB3b3JyeSBhYm91dCBpdC4KKworY2xhc3MgUk9USE1JSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUkk3Rm9ybTwwYjEwMTExMTEwMDAwLCBPT0wsIElPTCwgInJvdGhtaVx0JHJULCAkckEsICR2YWwiLAorICAgICAgICAgICAgUm90YXRlU2hpZnQsIHBhdHRlcm4+OworCitkZWYgUk9USE1JdjhpMTY6CisgICAgUk9USE1JSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCByb3RoTmVnN2ltbTokdmFsKSwKKyAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2RlZiA6IFBhdDwoU1BVdmVjX3NybCAodjhpMTYgVkVDUkVHOiRyQSksIChpMzIgaW1tOiR2YWwpKSwKKyAgICAgICAgICAoUk9USE1JdjhpMTYgVkVDUkVHOiRyQSwgaW1tOiR2YWwpPjsKKworZGVmOiBQYXQ8KFNQVXZlY19zcmwgKHY4aTE2IFZFQ1JFRzokckEpLCAoaTE2IGltbTokdmFsKSksCisgICAgICAgICAoUk9USE1JdjhpMTYgVkVDUkVHOiRyQSwgKFRPX0lNTTMyIGltbTokdmFsKSk+OworCitkZWY6IFBhdDwoU1BVdmVjX3NybCAodjhpMTYgVkVDUkVHOiRyQSksIChpOCBpbW06JHZhbCkpLAorICAgICAgICAgKFJPVEhNSXY4aTE2IFZFQ1JFRzokckEsIChUT19JTU0zMiBpbW06JHZhbCkpPjsKKworZGVmIFJPVEhNSXIxNjoKKyAgICBST1RITUlJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgcm90aE5lZzdpbW06JHZhbCksCisgICAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCitkZWY6IFBhdDwoc3JsIFIxNkM6JHJBLCAoaTMyIHVpbW03OiR2YWwpKSwKKyAgICAgICAgIChST1RITUlyMTYgUjE2QzokckEsIHVpbW03OiR2YWwpPjsKKworZGVmOiBQYXQ8KHNybCBSMTZDOiRyQSwgKGkxNiB1aW1tNzokdmFsKSksCisgICAgICAgICAoUk9USE1JcjE2IFIxNkM6JHJBLCAoVE9fSU1NMzIgdWltbTc6JHZhbCkpPjsKKworZGVmOiBQYXQ8KHNybCBSMTZDOiRyQSwgKGk4IHVpbW03OiR2YWwpKSwKKyAgICAgICAgIChST1RITUlyMTYgUjE2QzokckEsIChUT19JTU0zMiB1aW1tNzokdmFsKSk+OworCisvLyBST1RNIHY0aTMyIGZvcm06IFNlZSB0aGUgUk9USE0gdjhpMTYgY29tbWVudHMuCitjbGFzcyBST1RNSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMTAwMTEwMTAwMDAsIE9PTCwgSU9MLCAicm90bVx0JHJULCAkckEsICRyQiIsCisgICAgICAgICAgIFJvdGF0ZVNoaWZ0LCBwYXR0ZXJuPjsKKworZGVmIFJPVE12NGkzMjoKKyAgICBST1RNSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgWy8qIHNlZSBwYXR0ZXJucyBiZWxvdyAtICRyQiBtdXN0IGJlIG5lZ2F0ZWQgKi9dPjsKKworZGVmIDogUGF0PChTUFV2ZWNfc3JsICh2NGkzMiBWRUNSRUc6JHJBKSwgUjMyQzokckIpLAorICAgICAgICAgIChST1RNdjRpMzIgVkVDUkVHOiRyQSwgKFNGSXIzMiBSMzJDOiRyQiwgMCkpPjsKKworZGVmIDogUGF0PChTUFV2ZWNfc3JsICh2NGkzMiBWRUNSRUc6JHJBKSwgUjE2QzokckIpLAorICAgICAgICAgIChST1RNdjRpMzIgVkVDUkVHOiRyQSwKKyAgICAgICAgICAgICAgICAgICAgIChTRklyMzIgKFhTSFdyMTYgUjE2QzokckIpLCAwKSk+OworCitkZWYgOiBQYXQ8KFNQVXZlY19zcmwgKHY0aTMyIFZFQ1JFRzokckEpLCBSOEM6JHJCKSwKKyAgICAgICAgICAoUk9UTXY0aTMyIFZFQ1JFRzokckEsCisgICAgICAgICAgICAgICAgICAgICAoU0ZJcjMyIChYU0hXcjE2IChYU0JIcjggUjhDOiRyQikpLCAwKSk+OworCitkZWYgUk9UTXIzMjoKKyAgICBST1RNSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICBbLyogc2VlIHBhdHRlcm5zIGJlbG93IC0gJHJCIG11c3QgYmUgbmVnYXRlZCAqL10+OworCitkZWYgOiBQYXQ8KHNybCBSMzJDOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgIChST1RNcjMyIFIzMkM6JHJBLCAoU0ZJcjMyIFIzMkM6JHJCLCAwKSk+OworCitkZWYgOiBQYXQ8KHNybCBSMzJDOiRyQSwgUjE2QzokckIpLAorICAgICAgICAgIChST1RNcjMyIFIzMkM6JHJBLAorICAgICAgICAgICAgICAgICAgIChTRklyMzIgKFhTSFdyMTYgUjE2QzokckIpLCAwKSk+OworCitkZWYgOiBQYXQ8KHNybCBSMzJDOiRyQSwgUjhDOiRyQiksCisgICAgICAgICAgKFJPVE1yMzIgUjMyQzokckEsCisgICAgICAgICAgICAgICAgICAgKFNGSXIzMiAoWFNIV3IxNiAoWFNCSHI4IFI4QzokckIpKSwgMCkpPjsKKworLy8gUk9UTUkgdjRpMzIgZm9ybTogU2VlIHRoZSBjb21tZW50IGZvciBST1RITSB2OGkxNi4KK2RlZiBST1RNSXY0aTMyOgorICAgIFJJN0Zvcm08MGIxMDAxMTExMDAwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgcm90TmVnN2ltbTokdmFsKSwKKyAgICAgICJyb3RtaVx0JHJULCAkckEsICR2YWwiLCBSb3RhdGVTaGlmdCwKKyAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgIChTUFV2ZWNfc3JsIFZFQ1JFRzokckEsIChpMzIgdWltbTc6JHZhbCkpKV0+OworCitkZWYgOiBQYXQ8KFNQVXZlY19zcmwgKHY0aTMyIFZFQ1JFRzokckEpLCAoaTE2IHVpbW03OiR2YWwpKSwKKyAgICAgICAgICAoUk9UTUl2NGkzMiBWRUNSRUc6JHJBLCAoVE9fSU1NMzIgdWltbTc6JHZhbCkpPjsKKworZGVmIDogUGF0PChTUFV2ZWNfc3JsICh2NGkzMiBWRUNSRUc6JHJBKSwgKGk4IHVpbW03OiR2YWwpKSwKKyAgICAgICAgICAoUk9UTUl2NGkzMiBWRUNSRUc6JHJBLCAoVE9fSU1NMzIgdWltbTc6JHZhbCkpPjsKKworLy8gUk9UTUkgcjMyIGZvcm06IGtub3cgaG93IHRvIGNvbXBsZW1lbnQgdGhlIGltbWVkaWF0ZSB2YWx1ZS4KK2RlZiBST1RNSXIzMjoKKyAgICBSSTdGb3JtPDBiMTAwMTExMTAwMDAsIChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMzJDOiRyQSwgcm90TmVnN2ltbTokdmFsKSwKKyAgICAgICJyb3RtaVx0JHJULCAkckEsICR2YWwiLCBSb3RhdGVTaGlmdCwKKyAgICAgIFsoc2V0IFIzMkM6JHJULCAoc3JsIFIzMkM6JHJBLCAoaTMyIHVpbW03OiR2YWwpKSldPjsKKworZGVmIDogUGF0PChzcmwgUjMyQzokckEsIChpMTYgaW1tOiR2YWwpKSwKKyAgICAgICAgICAoUk9UTUlyMzIgUjMyQzokckEsIChUT19JTU0zMiB1aW1tNzokdmFsKSk+OworCitkZWYgOiBQYXQ8KHNybCBSMzJDOiRyQSwgKGk4IGltbTokdmFsKSksCisgICAgICAgICAgKFJPVE1JcjMyIFIzMkM6JHJBLCAoVE9fSU1NMzIgdWltbTc6JHZhbCkpPjsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBST1RRTUJZOiBUaGlzIGlzIGEgdmVjdG9yIGZvcm0gbWVyZWx5IHNvIHRoYXQgd2hlbiB1c2VkIGluIGFuCisvLyBpbnN0cnVjdGlvbiBwYXR0ZXJuLCB0eXBlIGNoZWNraW5nIHdpbGwgc3VjY2VlZC4gVGhpcyBpbnN0cnVjdGlvbiBhc3N1bWVzCisvLyB0aGF0IHRoZSB1c2VyIGtuZXcgdG8gbmVnYXRlICRyQi4KKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitjbGFzcyBST1RRTUJZSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMTAxMTEwMTExMDAsIE9PTCwgSU9MLCAicm90cW1ieVx0JHJULCAkckEsICRyQiIsCisgICAgICAgICAgIFJvdGF0ZVNoaWZ0LCBwYXR0ZXJuPjsKKworY2xhc3MgUk9UUU1CWVZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIFJPVFFNQllJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiwgJHJCIG11c3QgYmUgbmVnYXRlZCAqL10+OworCitjbGFzcyBST1RRTUJZUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgUk9UUU1CWUluc3Q8KG91dHMgcmNsYXNzOiRyVCksIChpbnMgcmNsYXNzOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK211bHRpY2xhc3MgUm90YXRlUXVhZEJ5dGVzCit7CisgIGRlZiB2MTZpODogUk9UUU1CWVZlY0luc3Q8djE2aTg+OworICBkZWYgdjhpMTY6IFJPVFFNQllWZWNJbnN0PHY4aTE2PjsKKyAgZGVmIHY0aTMyOiBST1RRTUJZVmVjSW5zdDx2NGkzMj47CisgIGRlZiB2Mmk2NDogUk9UUU1CWVZlY0luc3Q8djJpNjQ+OworCisgIGRlZiByMTI4OiBST1RRTUJZUmVnSW5zdDxHUFJDPjsKKyAgZGVmIHI2NDogIFJPVFFNQllSZWdJbnN0PFI2NEM+OworfQorCitkZWZtIFJPVFFNQlkgOiBSb3RhdGVRdWFkQnl0ZXM7CisKK2NsYXNzIFJPVFFNQllJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUkk3Rm9ybTwwYjEwMTExMTExMTAwLCBPT0wsIElPTCwgInJvdHFtYnlpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFJPVFFNQllJVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgUk9UUU1CWUlJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHJvdE5lZzdpbW06JHZhbCksCisgICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2NsYXNzIFJPVFFNQllJUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcywgT3BlcmFuZCBvcHR5cGUsIFZhbHVlVHlwZSBpbnR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIFBhdExlYWYgcHJlZD46CisgICAgUk9UUU1CWUlJbnN0PChvdXRzIHJjbGFzczokclQpLCAoaW5zIHJjbGFzczokckEsIG9wdHlwZTokdmFsKSwKKyAgICAgICAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworLy8gMTI4LWJpdCB6ZXJvIGV4dGVuc2lvbiBmb3JtOgorY2xhc3MgUk9UUU1CWUlaRXh0SW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcywgT3BlcmFuZCBvcHR5cGUsIFBhdExlYWYgcHJlZD46CisgICAgUk9UUU1CWUlJbnN0PChvdXRzIEdQUkM6JHJUKSwgKGlucyByY2xhc3M6JHJBLCBvcHR5cGU6JHZhbCksCisgICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK211bHRpY2xhc3MgUm90YXRlUXVhZEJ5dGVzSW1tCit7CisgIGRlZiB2MTZpODogUk9UUU1CWUlWZWNJbnN0PHYxNmk4PjsKKyAgZGVmIHY4aTE2OiBST1RRTUJZSVZlY0luc3Q8djhpMTY+OworICBkZWYgdjRpMzI6IFJPVFFNQllJVmVjSW5zdDx2NGkzMj47CisgIGRlZiB2Mmk2NDogUk9UUU1CWUlWZWNJbnN0PHYyaTY0PjsKKworICBkZWYgcjEyODogIFJPVFFNQllJUmVnSW5zdDxHUFJDLCByb3ROZWc3aW1tLCBpMzIsIHVpbW03PjsKKyAgZGVmIHI2NDogICBST1RRTUJZSVJlZ0luc3Q8UjY0Qywgcm90TmVnN2ltbSwgaTMyLCB1aW1tNz47CisgIAorICBkZWYgcjEyOF96ZXh0X3I4OiAgUk9UUU1CWUlaRXh0SW5zdDxSOEMsIHJvdE5lZzdpbW0sIHVpbW03PjsKKyAgZGVmIHIxMjhfemV4dF9yMTY6IFJPVFFNQllJWkV4dEluc3Q8UjE2Qywgcm90TmVnN2ltbSwgdWltbTc+OworICBkZWYgcjEyOF96ZXh0X3IzMjogUk9UUU1CWUlaRXh0SW5zdDxSMzJDLCByb3ROZWc3aW1tLCB1aW1tNz47CisgIGRlZiByMTI4X3pleHRfcjY0OiBST1RRTUJZSVpFeHRJbnN0PFI2NEMsIHJvdE5lZzdpbW0sIHVpbW03PjsKK30KKworZGVmbSBST1RRTUJZSSA6IFJvdGF0ZVF1YWRCeXRlc0ltbTsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBSb3RhdGUgcmlnaHQgYW5kIG1hc2sgYnkgYml0IGNvdW50CisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKworY2xhc3MgUk9UUU1CWUJJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMTAxMTAwMTExMDAsIE9PTCwgSU9MLCAicm90cW1ieWJpXHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgICAgUm90YXRlU2hpZnQsIHBhdHRlcm4+OworCitjbGFzcyBST1RRTUJZQklWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBST1RRTUJZQklJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuLCAqL10+OworCittdWx0aWNsYXNzIFJvdGF0ZU1hc2tRdWFkQnlCaXRDb3VudAoreworICBkZWYgdjE2aTg6IFJPVFFNQllCSVZlY0luc3Q8djE2aTg+OworICBkZWYgdjhpMTY6IFJPVFFNQllCSVZlY0luc3Q8djhpMTY+OworICBkZWYgdjRpMzI6IFJPVFFNQllCSVZlY0luc3Q8djRpMzI+OworICBkZWYgdjJpNjQ6IFJPVFFNQllCSVZlY0luc3Q8djJpNjQ+OworfQorCitkZWZtIFJPVFFNQllCSTogUm90YXRlTWFza1F1YWRCeUJpdENvdW50OworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIFJvdGF0ZSBxdWFkIGFuZCBtYXNrIGJ5IGJpdHMKKy8vIE5vdGUgdGhhdCB0aGUgcm90YXRlIGFtb3VudCBoYXMgdG8gYmUgbmVnYXRlZAorLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisKK2NsYXNzIFJPVFFNQklJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSUkZvcm08MGIxMDAxMTAxMTEwMCwgT09MLCBJT0wsICJyb3RxbWJpXHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgICAgUm90YXRlU2hpZnQsIHBhdHRlcm4+OworCitjbGFzcyBST1RRTUJJVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgUk9UUU1CSUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2NsYXNzIFJPVFFNQklSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBST1RRTUJJSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworbXVsdGljbGFzcyBSb3RhdGVNYXNrUXVhZEJ5Qml0cworeworICBkZWYgdjE2aTg6IFJPVFFNQklWZWNJbnN0PHYxNmk4PjsKKyAgZGVmIHY4aTE2OiBST1RRTUJJVmVjSW5zdDx2OGkxNj47CisgIGRlZiB2NGkzMjogUk9UUU1CSVZlY0luc3Q8djRpMzI+OworICBkZWYgdjJpNjQ6IFJPVFFNQklWZWNJbnN0PHYyaTY0PjsKKworICBkZWYgcjEyODogIFJPVFFNQklSZWdJbnN0PEdQUkM+OworICBkZWYgcjY0OiAgIFJPVFFNQklSZWdJbnN0PFI2NEM+OworfQorCitkZWZtIFJPVFFNQkk6IFJvdGF0ZU1hc2tRdWFkQnlCaXRzOworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIFJvdGF0ZSBxdWFkIGFuZCBtYXNrIGJ5IGJpdHMsIGltbWVkaWF0ZQorLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisKK2NsYXNzIFJPVFFNQklJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUkk3Rm9ybTwwYjEwMDExMTExMTAwLCBPT0wsIElPTCwgInJvdHFtYmlpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgICBSb3RhdGVTaGlmdCwgcGF0dGVybj47CisKK2NsYXNzIFJPVFFNQklJVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICBST1RRTUJJSUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgcm90TmVnN2ltbTokdmFsKSwKKyAgICAgICAgICAgICAgICAgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworY2xhc3MgUk9UUU1CSUlSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgIFJPVFFNQklJSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCByb3ROZWc3aW1tOiR2YWwpLAorICAgICAgICAgICAgICAgICBbLyogbm8gcGF0dGVybiAqL10+OworCittdWx0aWNsYXNzIFJvdGF0ZU1hc2tRdWFkQnlCaXRzSW1tCit7CisgIGRlZiB2MTZpODogUk9UUU1CSUlWZWNJbnN0PHYxNmk4PjsKKyAgZGVmIHY4aTE2OiBST1RRTUJJSVZlY0luc3Q8djhpMTY+OworICBkZWYgdjRpMzI6IFJPVFFNQklJVmVjSW5zdDx2NGkzMj47CisgIGRlZiB2Mmk2NDogUk9UUU1CSUlWZWNJbnN0PHYyaTY0PjsKKworICBkZWYgcjEyODogIFJPVFFNQklJUmVnSW5zdDxHUFJDPjsKKyAgZGVmIHI2NDogICBST1RRTUJJSVJlZ0luc3Q8UjY0Qz47Cit9CisKK2RlZm0gUk9UUU1CSUk6IFJvdGF0ZU1hc2tRdWFkQnlCaXRzSW1tOworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitkZWYgUk9UTUFIdjhpMTY6CisgICAgUlJGb3JtPDBiMDExMTEwMTAwMDAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFIzMkM6JHJCKSwKKyAgICAgICJyb3RtYWhcdCRyVCwgJHJBLCAkckIiLCBSb3RhdGVTaGlmdCwKKyAgICAgIFsvKiBzZWUgcGF0dGVybnMgYmVsb3cgLSAkckIgbXVzdCBiZSBuZWdhdGVkICovXT47CisKK2RlZiA6IFBhdDwoU1BVdmVjX3NyYSAodjhpMTYgVkVDUkVHOiRyQSksIFIzMkM6JHJCKSwKKyAgICAgICAgICAoUk9UTUFIdjhpMTYgVkVDUkVHOiRyQSwgKFNGSXIzMiBSMzJDOiRyQiwgMCkpPjsKKworZGVmIDogUGF0PChTUFV2ZWNfc3JhICh2OGkxNiBWRUNSRUc6JHJBKSwgUjE2QzokckIpLAorICAgICAgICAgIChST1RNQUh2OGkxNiBWRUNSRUc6JHJBLAorICAgICAgICAgICAgICAgICAgICAgICAoU0ZJcjMyIChYU0hXcjE2IFIxNkM6JHJCKSwgMCkpPjsKKworZGVmIDogUGF0PChTUFV2ZWNfc3JhICh2OGkxNiBWRUNSRUc6JHJBKSwgUjhDOiRyQiksCisgICAgICAgICAgKFJPVE1BSHY4aTE2IFZFQ1JFRzokckEsCisgICAgICAgICAgICAgICAgICAgICAgIChTRklyMzIgKFhTSFdyMTYgKFhTQkhyOCBSOEM6JHJCKSksIDApKT47CisKK2RlZiBST1RNQUhyMTY6CisgICAgUlJGb3JtPDBiMDExMTEwMTAwMDAsIChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjMyQzokckIpLAorICAgICAgInJvdG1haFx0JHJULCAkckEsICRyQiIsIFJvdGF0ZVNoaWZ0LAorICAgICAgWy8qIHNlZSBwYXR0ZXJucyBiZWxvdyAtICRyQiBtdXN0IGJlIG5lZ2F0ZWQgKi9dPjsKKworZGVmIDogUGF0PChzcmEgUjE2QzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAoUk9UTUFIcjE2IFIxNkM6JHJBLCAoU0ZJcjMyIFIzMkM6JHJCLCAwKSk+OworCitkZWYgOiBQYXQ8KHNyYSBSMTZDOiRyQSwgUjE2QzokckIpLAorICAgICAgICAgIChST1RNQUhyMTYgUjE2QzokckEsCisgICAgICAgICAgICAgICAgICAgICAoU0ZJcjMyIChYU0hXcjE2IFIxNkM6JHJCKSwgMCkpPjsKKworZGVmIDogUGF0PChzcmEgUjE2QzokckEsIFI4QzokckIpLAorICAgICAgICAgIChST1RNQUhyMTYgUjE2QzokckEsCisgICAgICAgICAgICAgICAgICAgICAoU0ZJcjMyIChYU0hXcjE2IChYU0JIcjggUjhDOiRyQikpLCAwKSk+OworCitkZWYgUk9UTUFISXY4aTE2OgorICAgIFJSRm9ybTwwYjAxMTExMTEwMDAwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCByb3RoTmVnN2ltbTokdmFsKSwKKyAgICAgICJyb3RtYWhpXHQkclQsICRyQSwgJHZhbCIsIFJvdGF0ZVNoaWZ0LAorICAgICAgWyhzZXQgKHY4aTE2IFZFQ1JFRzokclQpLAorICAgICAgICAgICAgKFNQVXZlY19zcmEgKHY4aTE2IFZFQ1JFRzokckEpLCAoaTMyIHVpbW03OiR2YWwpKSldPjsKKworZGVmIDogUGF0PChTUFV2ZWNfc3JhICh2OGkxNiBWRUNSRUc6JHJBKSwgKGkxNiB1aW1tNzokdmFsKSksCisgICAgICAgICAgKFJPVE1BSEl2OGkxNiAodjhpMTYgVkVDUkVHOiRyQSksIChUT19JTU0zMiB1aW1tNzokdmFsKSk+OworCitkZWYgOiBQYXQ8KFNQVXZlY19zcmEgKHY4aTE2IFZFQ1JFRzokckEpLCAoaTggdWltbTc6JHZhbCkpLAorICAgICAgICAgIChST1RNQUhJdjhpMTYgKHY4aTE2IFZFQ1JFRzokckEpLCAoVE9fSU1NMzIgdWltbTc6JHZhbCkpPjsKKworZGVmIFJPVE1BSElyMTY6CisgICAgUlJGb3JtPDBiMDExMTExMTAwMDAsIChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgcm90aE5lZzdpbW1faTE2OiR2YWwpLAorICAgICAgInJvdG1haGlcdCRyVCwgJHJBLCAkdmFsIiwgUm90YXRlU2hpZnQsCisgICAgICBbKHNldCBSMTZDOiRyVCwgKHNyYSBSMTZDOiRyQSwgKGkxNiB1aW1tNzokdmFsKSkpXT47CisKK2RlZiA6IFBhdDwoc3JhIFIxNkM6JHJBLCAoaTMyIGltbTokdmFsKSksCisgICAgICAgICAgKFJPVE1BSElyMTYgUjE2QzokckEsIChUT19JTU0zMiB1aW1tNzokdmFsKSk+OworCitkZWYgOiBQYXQ8KHNyYSBSMTZDOiRyQSwgKGk4IGltbTokdmFsKSksCisgICAgICAgICAgKFJPVE1BSElyMTYgUjE2QzokckEsIChUT19JTU0zMiB1aW1tNzokdmFsKSk+OworCitkZWYgUk9UTUF2NGkzMjoKKyAgICBSUkZvcm08MGIwMTAxMTAxMDAwMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgUjMyQzokckIpLAorICAgICAgInJvdG1hXHQkclQsICRyQSwgJHJCIiwgUm90YXRlU2hpZnQsCisgICAgICBbLyogc2VlIHBhdHRlcm5zIGJlbG93IC0gJHJCIG11c3QgYmUgbmVnYXRlZCAqL10+OworCitkZWYgOiBQYXQ8KFNQVXZlY19zcmEgKHY0aTMyIFZFQ1JFRzokckEpLCBSMzJDOiRyQiksCisgICAgICAgICAgKFJPVE1BdjRpMzIgVkVDUkVHOiRyQSwgKFNGSXIzMiBSMzJDOiRyQiwgMCkpPjsKKworZGVmIDogUGF0PChTUFV2ZWNfc3JhICh2NGkzMiBWRUNSRUc6JHJBKSwgUjE2QzokckIpLAorICAgICAgICAgIChST1RNQXY0aTMyIFZFQ1JFRzokckEsCisgICAgICAgICAgICAgICAgICAgICAgKFNGSXIzMiAoWFNIV3IxNiBSMTZDOiRyQiksIDApKT47CisKK2RlZiA6IFBhdDwoU1BVdmVjX3NyYSAodjRpMzIgVkVDUkVHOiRyQSksIFI4QzokckIpLAorICAgICAgICAgIChST1RNQXY0aTMyIFZFQ1JFRzokckEsCisgICAgICAgICAgICAgICAgICAgICAgKFNGSXIzMiAoWFNIV3IxNiAoWFNCSHI4IFI4QzokckIpKSwgMCkpPjsKKworZGVmIFJPVE1BcjMyOgorICAgIFJSRm9ybTwwYjAxMDExMDEwMDAwLCAob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICJyb3RtYVx0JHJULCAkckEsICRyQiIsIFJvdGF0ZVNoaWZ0LAorICAgICAgWy8qIHNlZSBwYXR0ZXJucyBiZWxvdyAtICRyQiBtdXN0IGJlIG5lZ2F0ZWQgKi9dPjsKKworZGVmIDogUGF0PChzcmEgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAoUk9UTUFyMzIgUjMyQzokckEsIChTRklyMzIgUjMyQzokckIsIDApKT47CisKK2RlZiA6IFBhdDwoc3JhIFIzMkM6JHJBLCBSMTZDOiRyQiksCisgICAgICAgICAgKFJPVE1BcjMyIFIzMkM6JHJBLAorICAgICAgICAgICAgICAgICAgICAoU0ZJcjMyIChYU0hXcjE2IFIxNkM6JHJCKSwgMCkpPjsKKworZGVmIDogUGF0PChzcmEgUjMyQzokckEsIFI4QzokckIpLAorICAgICAgICAgIChST1RNQXIzMiBSMzJDOiRyQSwKKyAgICAgICAgICAgICAgICAgICAgKFNGSXIzMiAoWFNIV3IxNiAoWFNCSHI4IFI4QzokckIpKSwgMCkpPjsKKworY2xhc3MgUk9UTUFJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMDEwMTExMTAwMDAsIE9PTCwgSU9MLAorICAgICAgInJvdG1haVx0JHJULCAkckEsICR2YWwiLAorICAgICAgUm90YXRlU2hpZnQsIHBhdHRlcm4+OworCitjbGFzcyBST1RNQUlWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlLCBPcGVyYW5kIGludG9wLCBWYWx1ZVR5cGUgaW50dHlwZT46CisgICAgUk9UTUFJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBpbnRvcDokdmFsKSwKKyAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgKFNQVXZlY19zcmEgVkVDUkVHOiRyQSwgKGludHR5cGUgdWltbTc6JHZhbCkpKV0+OworCitjbGFzcyBST1RNQUlSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBPcGVyYW5kIGludG9wLCBWYWx1ZVR5cGUgaW50dHlwZT46CisgICAgUk9UTUFJSW5zdDwob3V0cyByY2xhc3M6JHJUKSwgKGlucyByY2xhc3M6JHJBLCBpbnRvcDokdmFsKSwKKyAgICAgIFsoc2V0IHJjbGFzczokclQsIChzcmEgcmNsYXNzOiRyQSwgKGludHR5cGUgdWltbTc6JHZhbCkpKV0+OworCittdWx0aWNsYXNzIFJvdGF0ZU1hc2tBbGdlYnJhaWNJbW0geworICBkZWYgdjJpNjRfaTMyIDogUk9UTUFJVmVjSW5zdDx2Mmk2NCwgcm90TmVnN2ltbSwgaTMyPjsKKyAgZGVmIHY0aTMyX2kzMiA6IFJPVE1BSVZlY0luc3Q8djRpMzIsIHJvdE5lZzdpbW0sIGkzMj47CisgIGRlZiByNjRfaTMyIDogUk9UTUFJUmVnSW5zdDxSNjRDLCByb3ROZWc3aW1tLCBpMzI+OworICBkZWYgcjMyX2kzMiA6IFJPVE1BSVJlZ0luc3Q8UjMyQywgcm90TmVnN2ltbSwgaTMyPjsKK30KKworZGVmbSBST1RNQUkgOiBSb3RhdGVNYXNrQWxnZWJyYWljSW1tOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQnJhbmNoIGFuZCBjb25kaXRpb25hbHM6CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSBpbiB7CisgIC8vIEhhbHQgSWYgRXF1YWwgKHIzMiBwcmVmZXJyZWQgc2xvdCBvbmx5LCBubyB2ZWN0b3IgZm9ybSkKKyAgZGVmIEhFUXIzMjoKKyAgICBSUkZvcm1fMzwwYjAwMDExMDExMTEwLCAob3V0cyksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICJoZXFcdCRyQSwgJHJCIiwgQnJhbmNoUmVzb2x2LAorICAgICAgWy8qIG5vIHBhdHRlcm4gdG8gbWF0Y2ggKi9dPjsKKworICBkZWYgSEVRSXIzMiA6CisgICAgUkkxMEZvcm1fMjwwYjExMTExMTEwLCAob3V0cyksIChpbnMgUjMyQzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICJoZXFpXHQkckEsICR2YWwiLCBCcmFuY2hSZXNvbHYsCisgICAgICBbLyogbm8gcGF0dGVybiB0byBtYXRjaCAqL10+OworCisgIC8vIEhHVC9IR1RJOiBUaGVzZSBpbnN0cnVjdGlvbnMgdXNlIHNpZ25lZCBhcml0aG1ldGljIGZvciB0aGUgY29tcGFyaXNvbiwKKyAgLy8gY29udHJhc3Rpbmcgd2l0aCBITEdUL0hMR1RJLCB3aGljaCB1c2UgdW5zaWduZWQgY29tcGFyaXNvbjoKKyAgZGVmIEhHVHIzMjoKKyAgICBSUkZvcm1fMzwwYjAwMDExMDEwMDEwLCAob3V0cyksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICJoZ3RcdCRyQSwgJHJCIiwgQnJhbmNoUmVzb2x2LAorICAgICAgWy8qIG5vIHBhdHRlcm4gdG8gbWF0Y2ggKi9dPjsKKworICBkZWYgSEdUSXIzMjoKKyAgICBSSTEwRm9ybV8yPDBiMTExMTAwMTAsIChvdXRzKSwgKGlucyBSMzJDOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgImhndGlcdCRyQSwgJHZhbCIsIEJyYW5jaFJlc29sdiwKKyAgICAgIFsvKiBubyBwYXR0ZXJuIHRvIG1hdGNoICovXT47CisKKyAgZGVmIEhMR1RyMzI6CisgICAgUlJGb3JtXzM8MGIwMDAxMTAxMTAxMCwgKG91dHMpLCAoaW5zIFIzMkM6JHJBLCBSMzJDOiRyQiksCisgICAgICAiaGxndFx0JHJBLCAkckIiLCBCcmFuY2hSZXNvbHYsCisgICAgICBbLyogbm8gcGF0dGVybiB0byBtYXRjaCAqL10+OworCisgIGRlZiBITEdUSXIzMjoKKyAgICBSSTEwRm9ybV8yPDBiMTExMTEwMTAsIChvdXRzKSwgKGlucyBSMzJDOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgImhsZ3RpXHQkckEsICR2YWwiLCBCcmFuY2hSZXNvbHYsCisgICAgICBbLyogbm8gcGF0dGVybiB0byBtYXRjaCAqL10+OworfQorCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIGk4LCBpMTYgYW5kIGkzMjoKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisKK2NsYXNzIENFUUJJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6CisgIFJSRm9ybTwwYjAwMDAxMDExMTEwLCBPT0wsIElPTCwgImNlcWJcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgQnl0ZU9wLCBwYXR0ZXJuPjsKKworbXVsdGljbGFzcyBDbXBFcXVhbEJ5dGUKK3sKKyAgZGVmIHYxNmk4IDoKKyAgICBDRVFCSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwgKHNldGVxICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiBWRUNSRUc6JHJCKSkpXT47CisKKyAgZGVmIHI4IDoKKyAgICBDRVFCSW5zdDwob3V0cyBSOEM6JHJUKSwgKGlucyBSOEM6JHJBLCBSOEM6JHJCKSwKKyAgICAgICAgICAgICBbKHNldCBSOEM6JHJULCAoc2V0ZXEgUjhDOiRyQSwgUjhDOiRyQikpXT47Cit9CisKK2NsYXNzIENFUUJJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj4gOgorICBSSTEwRm9ybTwwYjAxMTExMTEwLCBPT0wsIElPTCwgImNlcWJpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgIEJ5dGVPcCwgcGF0dGVybj47CisKK211bHRpY2xhc3MgQ21wRXF1YWxCeXRlSW1tCit7CisgIGRlZiB2MTZpOCA6CisgICAgQ0VRQklJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbV9pODokdmFsKSwKKyAgICAgICAgICAgICAgWyhzZXQgKHYxNmk4IFZFQ1JFRzokclQpLCAoc2V0ZXEgKHYxNmk4IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MTZpOFNFeHQ4SW1tOiR2YWwpKV0+OworICBkZWYgcjg6CisgICAgQ0VRQklJbnN0PChvdXRzIFI4QzokclQpLCAoaW5zIFI4QzokckEsIHMxMGltbV9pODokdmFsKSwKKyAgICAgICAgICAgICBbKHNldCBSOEM6JHJULCAoc2V0ZXEgUjhDOiRyQSwgaW1tU0V4dDg6JHZhbCkpXT47Cit9CisKK2NsYXNzIENFUUhJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6CisgIFJSRm9ybTwwYjAwMDEwMDExMTEwLCBPT0wsIElPTCwgImNlcWhcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgQnl0ZU9wLCBwYXR0ZXJuPjsKKworbXVsdGljbGFzcyBDbXBFcXVhbEhhbGZ3b3JkCit7CisgIGRlZiB2OGkxNiA6IENFUUhJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIChzZXRlcSAodjhpMTYgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiBWRUNSRUc6JHJCKSkpXT47CisKKyAgZGVmIHIxNiA6IENFUUhJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjE2QzokckIpLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjE2QzokclQsIChzZXRlcSBSMTZDOiRyQSwgUjE2QzokckIpKV0+OworfQorCitjbGFzcyBDRVFISUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgUkkxMEZvcm08MGIxMDExMTExMCwgT09MLCBJT0wsICJjZXFoaVx0JHJULCAkckEsICR2YWwiLAorICAgICAgICAgICBCeXRlT3AsIHBhdHRlcm4+OworCittdWx0aWNsYXNzIENtcEVxdWFsSGFsZndvcmRJbW0KK3sKKyAgZGVmIHY4aTE2IDogQ0VRSElJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0ICh2OGkxNiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRlcSAodjhpMTYgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2IHY4aTE2U0V4dDEwSW1tOiR2YWwpKSldPjsKKyAgZGVmIHIxNiA6IENFUUhJSW5zdDwob3V0cyBSMTZDOiRyVCksIChpbnMgUjE2QzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMTZDOiRyVCwgKHNldGVxIFIxNkM6JHJBLCBpMTZJbW1TRXh0MTA6JHZhbCkpXT47Cit9CisKK2NsYXNzIENFUUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgUlJGb3JtPDBiMDAwMDAwMTExMTAsIE9PTCwgSU9MLCAiY2VxXHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgIEJ5dGVPcCwgcGF0dGVybj47CisKK211bHRpY2xhc3MgQ21wRXF1YWxXb3JkCit7CisgIGRlZiB2NGkzMiA6IENFUUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRlcSAodjRpMzIgVkVDUkVHOiRyQSksICh2NGkzMiBWRUNSRUc6JHJCKSkpXT47CisKKyAgZGVmIHIzMiA6IENFUUluc3Q8KG91dHMgUjMyQzokclQpLCAoaW5zIFIzMkM6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAoc2V0ZXEgUjMyQzokckEsIFIzMkM6JHJCKSldPjsKK30KKworY2xhc3MgQ0VRSUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgUkkxMEZvcm08MGIwMDExMTExMCwgT09MLCBJT0wsICJjZXFpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgIEJ5dGVPcCwgcGF0dGVybj47CisKK211bHRpY2xhc3MgQ21wRXF1YWxXb3JkSW1tCit7CisgIGRlZiB2NGkzMiA6IENFUUlJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ZXEgKHY0aTMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIHY0aTMyU0V4dDE2SW1tOiR2YWwpKSldPjsKKworICBkZWYgcjMyOiBDRVFJSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIHMxMGltbV9pMzI6JHZhbCksCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAoc2V0ZXEgUjMyQzokckEsIGkzMkltbVNFeHQxMDokdmFsKSldPjsKK30KKworY2xhc3MgQ0dUQkluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgUlJGb3JtPDBiMDAwMDEwMTAwMTAsIE9PTCwgSU9MLCAiY2d0Ylx0JHJULCAkckEsICRyQiIsCisgICAgICAgICBCeXRlT3AsIHBhdHRlcm4+OworCittdWx0aWNsYXNzIENtcEd0ckJ5dGUKK3sKKyAgZGVmIHYxNmk4IDoKKyAgICBDR1RCSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwgKHNldGd0ICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiBWRUNSRUc6JHJCKSkpXT47CisKKyAgZGVmIHI4IDoKKyAgICBDR1RCSW5zdDwob3V0cyBSOEM6JHJUKSwgKGlucyBSOEM6JHJBLCBSOEM6JHJCKSwKKyAgICAgICAgICAgICBbKHNldCBSOEM6JHJULCAoc2V0Z3QgUjhDOiRyQSwgUjhDOiRyQikpXT47Cit9CisKK2NsYXNzIENHVEJJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj4gOgorICBSSTEwRm9ybTwwYjAxMTEwMDEwLCBPT0wsIElPTCwgImNndGJpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgIEJ5dGVPcCwgcGF0dGVybj47CisKK211bHRpY2xhc3MgQ21wR3RyQnl0ZUltbQoreworICBkZWYgdjE2aTggOgorICAgIENHVEJJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW1faTg6JHZhbCksCisgICAgICAgICAgICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwgKHNldGd0ICh2MTZpOCBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjE2aThTRXh0OEltbTokdmFsKSldPjsKKyAgZGVmIHI4OgorICAgIENHVEJJSW5zdDwob3V0cyBSOEM6JHJUKSwgKGlucyBSOEM6JHJBLCBzMTBpbW1faTg6JHZhbCksCisgICAgICAgICAgICAgIFsoc2V0IFI4QzokclQsIChzZXRndCBSOEM6JHJBLCBpbW1TRXh0ODokdmFsKSldPjsKK30KKworY2xhc3MgQ0dUSEluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgUlJGb3JtPDBiMDAwMTAwMTAwMTAsIE9PTCwgSU9MLCAiY2d0aFx0JHJULCAkckEsICRyQiIsCisgICAgICAgICBCeXRlT3AsIHBhdHRlcm4+OworCittdWx0aWNsYXNzIENtcEd0ckhhbGZ3b3JkCit7CisgIGRlZiB2OGkxNiA6IENHVEhJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIChzZXRndCAodjhpMTYgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiBWRUNSRUc6JHJCKSkpXT47CisKKyAgZGVmIHIxNiA6IENHVEhJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgUjE2QzokckIpLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjE2QzokclQsIChzZXRndCBSMTZDOiRyQSwgUjE2QzokckIpKV0+OworfQorCitjbGFzcyBDR1RISUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgUkkxMEZvcm08MGIxMDExMDAxMCwgT09MLCBJT0wsICJjZ3RoaVx0JHJULCAkckEsICR2YWwiLAorICAgICAgICAgICBCeXRlT3AsIHBhdHRlcm4+OworCittdWx0aWNsYXNzIENtcEd0ckhhbGZ3b3JkSW1tCit7CisgIGRlZiB2OGkxNiA6IENHVEhJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0Z3QgKHY4aTE2IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiB2OGkxNlNFeHQxMEltbTokdmFsKSkpXT47CisgIGRlZiByMTYgOiBDR1RISUluc3Q8KG91dHMgUjE2QzokclQpLCAoaW5zIFIxNkM6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjE2QzokclQsIChzZXRndCBSMTZDOiRyQSwgaTE2SW1tU0V4dDEwOiR2YWwpKV0+OworfQorCitjbGFzcyBDR1RJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6CisgIFJSRm9ybTwwYjAwMDAwMDEwMDEwLCBPT0wsIElPTCwgImNndFx0JHJULCAkckEsICRyQiIsCisgICAgICAgICBCeXRlT3AsIHBhdHRlcm4+OworCittdWx0aWNsYXNzIENtcEd0cldvcmQKK3sKKyAgZGVmIHY0aTMyIDogQ0dUSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldGd0ICh2NGkzMiBWRUNSRUc6JHJBKSwgKHY0aTMyIFZFQ1JFRzokckIpKSldPjsKKworICBkZWYgcjMyIDogQ0dUSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjMyQzokclQsIChzZXRndCBSMzJDOiRyQSwgUjMyQzokckIpKV0+OworfQorCitjbGFzcyBDR1RJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj4gOgorICBSSTEwRm9ybTwwYjAwMTEwMDEwLCBPT0wsIElPTCwgImNndGlcdCRyVCwgJHJBLCAkdmFsIiwKKyAgICAgICAgICAgQnl0ZU9wLCBwYXR0ZXJuPjsKKworbXVsdGljbGFzcyBDbXBHdHJXb3JkSW1tCit7CisgIGRlZiB2NGkzMiA6IENHVElJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0Z3QgKHY0aTMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIHY0aTMyU0V4dDE2SW1tOiR2YWwpKSldPjsKKworICBkZWYgcjMyOiBDR1RJSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIHMxMGltbV9pMzI6JHZhbCksCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAoc2V0Z3QgUjMyQzokckEsIGkzMkltbVNFeHQxMDokdmFsKSldPjsKKworICAvLyBDR1RJdjRmMzIsIENHVElmMzI6IFRoZXNlIGFyZSB1c2VkIGluIHRoZSBmMzIgZmRpdiBpbnN0cnVjdGlvbiBzZXF1ZW5jZToKKyAgZGVmIHY0ZjMyOiBDR1RJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW06JHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0ICh2NGkzMiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldGd0ICh2NGkzMiAoYml0Y29udmVydCAodjRmMzIgVkVDUkVHOiRyQSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiB2NGkzMlNFeHQxNkltbTokdmFsKSkpXT47CisKKyAgZGVmIGYzMjogICBDR1RJSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyRlA6JHJBLCBzMTBpbW1faTMyOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47Cit9CisKK2NsYXNzIENMR1RCSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj4gOgorICBSUkZvcm08MGIwMDAwMTAxMTAxMCwgT09MLCBJT0wsICJjbGd0Ylx0JHJULCAkckEsICRyQiIsCisgICAgICAgICBCeXRlT3AsIHBhdHRlcm4+OworCittdWx0aWNsYXNzIENtcExHdHJCeXRlCit7CisgIGRlZiB2MTZpOCA6CisgICAgQ0xHVEJJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgWyhzZXQgKHYxNmk4IFZFQ1JFRzokclQpLCAoc2V0dWd0ICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiBWRUNSRUc6JHJCKSkpXT47CisKKyAgZGVmIHI4IDoKKyAgICBDTEdUQkluc3Q8KG91dHMgUjhDOiRyVCksIChpbnMgUjhDOiRyQSwgUjhDOiRyQiksCisgICAgICAgICAgICAgWyhzZXQgUjhDOiRyVCwgKHNldHVndCBSOEM6JHJBLCBSOEM6JHJCKSldPjsKK30KKworY2xhc3MgQ0xHVEJJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj4gOgorICBSSTEwRm9ybTwwYjAxMTExMDEwLCBPT0wsIElPTCwgImNsZ3RiaVx0JHJULCAkckEsICR2YWwiLAorICAgICAgICAgICBCeXRlT3AsIHBhdHRlcm4+OworCittdWx0aWNsYXNzIENtcExHdHJCeXRlSW1tCit7CisgIGRlZiB2MTZpOCA6CisgICAgQ0xHVEJJSW5zdDwob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBzMTBpbW1faTg6JHZhbCksCisgICAgICAgICAgICAgIFsoc2V0ICh2MTZpOCBWRUNSRUc6JHJUKSwgKHNldHVndCAodjE2aTggVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxNmk4U0V4dDhJbW06JHZhbCkpXT47CisgIGRlZiByODoKKyAgICBDTEdUQklJbnN0PChvdXRzIFI4QzokclQpLCAoaW5zIFI4QzokckEsIHMxMGltbV9pODokdmFsKSwKKyAgICAgICAgICAgICBbKHNldCBSOEM6JHJULCAoc2V0dWd0IFI4QzokckEsIGltbVNFeHQ4OiR2YWwpKV0+OworfQorCitjbGFzcyBDTEdUSEluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoKKyAgUlJGb3JtPDBiMDAwMTAwMTEwMTAsIE9PTCwgSU9MLCAiY2xndGhcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgQnl0ZU9wLCBwYXR0ZXJuPjsKKworbXVsdGljbGFzcyBDbXBMR3RySGFsZndvcmQKK3sKKyAgZGVmIHY4aTE2IDogQ0xHVEhJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCAodjhpMTYgVkVDUkVHOiRyVCksIChzZXR1Z3QgKHY4aTE2IFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYgVkVDUkVHOiRyQikpKV0+OworCisgIGRlZiByMTYgOiBDTEdUSEluc3Q8KG91dHMgUjE2QzokclQpLCAoaW5zIFIxNkM6JHJBLCBSMTZDOiRyQiksCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMTZDOiRyVCwgKHNldHVndCBSMTZDOiRyQSwgUjE2QzokckIpKV0+OworfQorCitjbGFzcyBDTEdUSElJbnN0PGRhZyBPT0wsIGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6CisgIFJJMTBGb3JtPDBiMTAxMTEwMTAsIE9PTCwgSU9MLCAiY2xndGhpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgIEJ5dGVPcCwgcGF0dGVybj47CisKK211bHRpY2xhc3MgQ21wTEd0ckhhbGZ3b3JkSW1tCit7CisgIGRlZiB2OGkxNiA6IENMR1RISUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0ICh2OGkxNiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0dWd0ICh2OGkxNiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNiB2OGkxNlNFeHQxMEltbTokdmFsKSkpXT47CisgIGRlZiByMTYgOiBDTEdUSElJbnN0PChvdXRzIFIxNkM6JHJUKSwgKGlucyBSMTZDOiRyQSwgczEwaW1tOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMTZDOiRyVCwgKHNldHVndCBSMTZDOiRyQSwgaTE2SW1tU0V4dDEwOiR2YWwpKV0+OworfQorCitjbGFzcyBDTEdUSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj4gOgorICBSUkZvcm08MGIwMDAwMDAxMTAxMCwgT09MLCBJT0wsICJjbGd0XHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgIEJ5dGVPcCwgcGF0dGVybj47CisKK211bHRpY2xhc3MgQ21wTEd0cldvcmQKK3sKKyAgZGVmIHY0aTMyIDogQ0xHVEluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXR1Z3QgKHY0aTMyIFZFQ1JFRzokckEpLCAodjRpMzIgVkVDUkVHOiRyQikpKV0+OworCisgIGRlZiByMzIgOiBDTEdUSW5zdDwob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAoc2V0dWd0IFIzMkM6JHJBLCBSMzJDOiRyQikpXT47Cit9CisKK2NsYXNzIENMR1RJSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj4gOgorICBSSTEwRm9ybTwwYjAwMTExMDEwLCBPT0wsIElPTCwgImNsZ3RpXHQkclQsICRyQSwgJHZhbCIsCisgICAgICAgICAgIEJ5dGVPcCwgcGF0dGVybj47CisKK211bHRpY2xhc3MgQ21wTEd0cldvcmRJbW0KK3sKKyAgZGVmIHY0aTMyIDogQ0xHVElJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIHMxMGltbTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgKHY0aTMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0dWd0ICh2NGkzMiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiB2NGkzMlNFeHQxNkltbTokdmFsKSkpXT47CisKKyAgZGVmIHIzMjogQ0xHVElJbnN0PChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMzJDOiRyQSwgczEwaW1tX2kzMjokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkM6JHJULCAoc2V0dWd0IFIzMkM6JHJBLCBpMzJJbW1TRXh0MTA6JHZhbCkpXT47Cit9CisKK2RlZm0gQ0VRQiAgIDogQ21wRXF1YWxCeXRlOworZGVmbSBDRVFCSSAgOiBDbXBFcXVhbEJ5dGVJbW07CitkZWZtIENFUUggICA6IENtcEVxdWFsSGFsZndvcmQ7CitkZWZtIENFUUhJICA6IENtcEVxdWFsSGFsZndvcmRJbW07CitkZWZtIENFUSAgICA6IENtcEVxdWFsV29yZDsKK2RlZm0gQ0VRSSAgIDogQ21wRXF1YWxXb3JkSW1tOworZGVmbSBDR1RCICAgOiBDbXBHdHJCeXRlOworZGVmbSBDR1RCSSAgOiBDbXBHdHJCeXRlSW1tOworZGVmbSBDR1RIICAgOiBDbXBHdHJIYWxmd29yZDsKK2RlZm0gQ0dUSEkgIDogQ21wR3RySGFsZndvcmRJbW07CitkZWZtIENHVCAgICA6IENtcEd0cldvcmQ7CitkZWZtIENHVEkgICA6IENtcEd0cldvcmRJbW07CitkZWZtIENMR1RCICA6IENtcExHdHJCeXRlOworZGVmbSBDTEdUQkkgOiBDbXBMR3RyQnl0ZUltbTsKK2RlZm0gQ0xHVEggIDogQ21wTEd0ckhhbGZ3b3JkOworZGVmbSBDTEdUSEkgOiBDbXBMR3RySGFsZndvcmRJbW07CitkZWZtIENMR1QgICA6IENtcExHdHJXb3JkOworZGVmbSBDTEdUSSAgOiBDbXBMR3RyV29yZEltbTsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIEZvciBTRVRDQyBwcmltaXRpdmVzIG5vdCBzdXBwb3J0ZWQgYWJvdmUgKHNldGx0LCBzZXRsZSwgc2V0Z2UsIGV0Yy4pCisvLyBkZWZpbmUgYSBwYXR0ZXJuIHRvIGdlbmVyYXRlIHRoZSByaWdodCBjb2RlLCBhcyBhIGJpbmFyeSBvcGVyYXRvcgorLy8gKGluIGEgbWFubmVyIG9mIHNwZWFraW5nLikKKy8vCisvLyBOb3RlczoKKy8vIDEuIFRoaXMgb25seSBtYXRjaGVzIHRoZSBzZXRjYyBzZXQgb2YgY29uZGl0aW9uYWxzLiBTcGVjaWFsIHBhdHRlcm4KKy8vICAgIG1hdGNoaW5nIGlzIHVzZWQgZm9yIHNlbGVjdCBjb25kaXRpb25hbHMuCisvLworLy8gMi4gVGhlICJEQUciIHZlcnNpb25zIG9mIHRoZXNlIGNsYXNzZXMgaXMgYWxtb3N0IGV4Y2x1c2l2ZWx5IHVzZWQgZm9yCisvLyAgICBpNjQgY29tcGFyaXNvbnMuIFNlZSB0aGUgdGJsZ2VuIGZ1bmRhbWVudGFscyBkb2N1bWVudGF0aW9uIGZvciB3aGF0CisvLyAgICAiLlJlc3VsdEluc3Ryc1swXSIgbWVhbnM7IHNlZSBUYXJnZXRTZWxlY3Rpb25EQUcudGQgYW5kIHRoZSBQYXR0ZXJuCisvLyAgICBjbGFzcyBmb3Igd2hlcmUgUmVzdWx0SW5zdHJzIG9yaWdpbmF0ZXMuCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitjbGFzcyBTRVRDQ05lZ0NvbmRSZWc8UGF0RnJhZyBjb25kLCBSZWdpc3RlckNsYXNzIHJjbGFzcywgVmFsdWVUeXBlIGludHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgU1BVSW5zdHIgeG9yaW5zdCwgU1BVSW5zdHIgY21wYXJlPjoKKyAgUGF0PChjb25kIHJjbGFzczokckEsIHJjbGFzczokckIpLAorICAgICAgKHhvcmluc3QgKGNtcGFyZSByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSwgKGludHR5cGUgLTEpKT47CisKK2NsYXNzIFNFVENDTmVnQ29uZEltbTxQYXRGcmFnIGNvbmQsIFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBWYWx1ZVR5cGUgaW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBQYXRMZWFmIGltbXByZWQsIFNQVUluc3RyIHhvcmluc3QsIFNQVUluc3RyIGNtcGFyZT46CisgIFBhdDwoY29uZCByY2xhc3M6JHJBLCAoaW50dHlwZSBpbW1wcmVkOiRpbW0pKSwKKyAgICAgICh4b3JpbnN0IChjbXBhcmUgcmNsYXNzOiRyQSwgKGludHR5cGUgaW1tcHJlZDokaW1tKSksIChpbnR0eXBlIC0xKSk+OworCitkZWYgOiBTRVRDQ05lZ0NvbmRSZWc8c2V0bmUsIFI4QywgaTgsIFhPUkJJcjgsICBDRVFCcjg+OworZGVmIDogU0VUQ0NOZWdDb25kSW1tPHNldG5lLCBSOEMsIGk4LCBpbW1TRXh0OCwgWE9SQklyOCwgQ0VRQklyOD47CisKK2RlZiA6IFNFVENDTmVnQ29uZFJlZzxzZXRuZSwgUjE2QywgaTE2LCBYT1JISXIxNiwgICAgIENFUUhyMTY+OworZGVmIDogU0VUQ0NOZWdDb25kSW1tPHNldG5lLCBSMTZDLCBpMTYsIGkxNkltbVNFeHQxMCwgWE9SSElyMTYsIENFUUhJcjE2PjsKKworZGVmIDogU0VUQ0NOZWdDb25kUmVnPHNldG5lLCBSMzJDLCBpMzIsIFhPUklyMzIsIENFUXIzMj47CitkZWYgOiBTRVRDQ05lZ0NvbmRJbW08c2V0bmUsIFIzMkMsIGkzMiwgaTMySW1tU0V4dDEwLCBYT1JJcjMyLCBDRVFJcjMyPjsKKworY2xhc3MgU0VUQ0NCaW5PcFJlZzxQYXRGcmFnIGNvbmQsIFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBTUFVJbnN0ciBiaW5vcCwgU1BVSW5zdHIgY21wT3AxLCBTUFVJbnN0ciBjbXBPcDI+OgorICAgIFBhdDwoY29uZCByY2xhc3M6JHJBLCByY2xhc3M6JHJCKSwKKyAgICAgICAgKGJpbm9wIChjbXBPcDEgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQiksCisgICAgICAgICAgICAgICAoY21wT3AyIHJjbGFzczokckEsIHJjbGFzczokckIpKT47CisKK2NsYXNzIFNFVENDQmluT3BJbW08UGF0RnJhZyBjb25kLCBSZWdpc3RlckNsYXNzIHJjbGFzcywgUGF0TGVhZiBpbW1wcmVkLAorICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgaW1tdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgU1BVSW5zdHIgYmlub3AsIFNQVUluc3RyIGNtcE9wMSwgU1BVSW5zdHIgY21wT3AyPjoKKyAgICBQYXQ8KGNvbmQgcmNsYXNzOiRyQSwgKGltbXR5cGUgaW1tcHJlZDokaW1tKSksCisgICAgICAgIChiaW5vcCAoY21wT3AxIHJjbGFzczokckEsIChpbW10eXBlIGltbXByZWQ6JGltbSkpLAorICAgICAgICAgICAgICAgKGNtcE9wMiByY2xhc3M6JHJBLCAoaW1tdHlwZSBpbW1wcmVkOiRpbW0pKSk+OworCitkZWYgOiBTRVRDQ0Jpbk9wUmVnPHNldGdlLCBSOEMsIE9ScjgsIENHVEJyOCwgQ0VRQnI4PjsKK2RlZiA6IFNFVENDQmluT3BJbW08c2V0Z2UsIFI4QywgaW1tU0V4dDgsIGk4LCBPUnI4LCBDR1RCSXI4LCBDRVFCSXI4PjsKK2RlZiA6IFNFVENDQmluT3BSZWc8c2V0bHQsIFI4QywgTk9ScjgsIENHVEJyOCwgQ0VRQnI4PjsKK2RlZiA6IFNFVENDQmluT3BJbW08c2V0bHQsIFI4QywgaW1tU0V4dDgsIGk4LCBOT1JyOCwgQ0dUQklyOCwgQ0VRQklyOD47CitkZWYgOiBQYXQ8KHNldGxlIFI4QzokckEsIFI4QzokckIpLAorICAgICAgICAgIChYT1JCSXI4IChDR1RCcjggUjhDOiRyQSwgUjhDOiRyQiksIDB4ZmYpPjsKK2RlZiA6ICBQYXQ8KHNldGxlIFI4QzokckEsIGltbVU4OiRpbW0pLAorICAgICAgICAgICAoWE9SQklyOCAoQ0dUQklyOCBSOEM6JHJBLCBpbW1VODokaW1tKSwgMHhmZik+OworCitkZWYgOiBTRVRDQ0Jpbk9wUmVnPHNldGdlLCBSMTZDLCBPUnIxNiwgQ0dUSHIxNiwgQ0VRSHIxNj47CitkZWYgOiBTRVRDQ0Jpbk9wSW1tPHNldGdlLCBSMTZDLCBpMTZJbW1TRXh0MTAsIGkxNiwKKyAgICAgICAgICAgICAgICAgICAgT1JyMTYsIENHVEhJcjE2LCBDRVFISXIxNj47CitkZWYgOiBTRVRDQ0Jpbk9wUmVnPHNldGx0LCBSMTZDLCBOT1JyMTYsIENHVEhyMTYsIENFUUhyMTY+OworZGVmIDogU0VUQ0NCaW5PcEltbTxzZXRsdCwgUjE2QywgaTE2SW1tU0V4dDEwLCBpMTYsIE5PUnIxNiwgQ0dUSElyMTYsIENFUUhJcjE2PjsKK2RlZiA6IFBhdDwoc2V0bGUgUjE2QzokckEsIFIxNkM6JHJCKSwKKyAgICAgICAgICAoWE9SSElyMTYgKENHVEhyMTYgUjE2QzokckEsIFIxNkM6JHJCKSwgMHhmZmZmKT47CitkZWYgOiBQYXQ8KHNldGxlIFIxNkM6JHJBLCBpMTZJbW1TRXh0MTA6JGltbSksCisgICAgICAgICAgKFhPUkhJcjE2IChDR1RISXIxNiBSMTZDOiRyQSwgaTE2SW1tU0V4dDEwOiRpbW0pLCAweGZmZmYpPjsKKworZGVmIDogU0VUQ0NCaW5PcFJlZzxzZXRnZSwgUjMyQywgT1JyMzIsIENHVHIzMiwgQ0VRcjMyPjsKK2RlZiA6IFNFVENDQmluT3BJbW08c2V0Z2UsIFIzMkMsIGkzMkltbVNFeHQxMCwgaTMyLAorICAgICAgICAgICAgICAgICAgICBPUnIzMiwgQ0dUSXIzMiwgQ0VRSXIzMj47CitkZWYgOiBTRVRDQ0Jpbk9wUmVnPHNldGx0LCBSMzJDLCBOT1JyMzIsIENHVHIzMiwgQ0VRcjMyPjsKK2RlZiA6IFNFVENDQmluT3BJbW08c2V0bHQsIFIzMkMsIGkzMkltbVNFeHQxMCwgaTMyLCBOT1JyMzIsIENHVElyMzIsIENFUUlyMzI+OworZGVmIDogUGF0PChzZXRsZSBSMzJDOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgIChYT1JJcjMyIChDR1RyMzIgUjMyQzokckEsIFIzMkM6JHJCKSwgMHhmZmZmZmZmZik+OworZGVmIDogUGF0PChzZXRsZSBSMzJDOiRyQSwgaTMySW1tU0V4dDEwOiRpbW0pLAorICAgICAgICAgIChYT1JJcjMyIChDR1RJcjMyIFIzMkM6JHJBLCBpMzJJbW1TRXh0MTA6JGltbSksIDB4ZmZmZmZmZmYpPjsKKworZGVmIDogU0VUQ0NCaW5PcFJlZzxzZXR1Z2UsIFI4QywgT1JyOCwgQ0xHVEJyOCwgQ0VRQnI4PjsKK2RlZiA6IFNFVENDQmluT3BJbW08c2V0dWdlLCBSOEMsIGltbVNFeHQ4LCBpOCwgT1JyOCwgQ0xHVEJJcjgsIENFUUJJcjg+OworZGVmIDogU0VUQ0NCaW5PcFJlZzxzZXR1bHQsIFI4QywgTk9ScjgsIENMR1RCcjgsIENFUUJyOD47CitkZWYgOiBTRVRDQ0Jpbk9wSW1tPHNldHVsdCwgUjhDLCBpbW1TRXh0OCwgaTgsIE5PUnI4LCBDTEdUQklyOCwgQ0VRQklyOD47CitkZWYgOiBQYXQ8KHNldHVsZSBSOEM6JHJBLCBSOEM6JHJCKSwKKyAgICAgICAgICAoWE9SQklyOCAoQ0xHVEJyOCBSOEM6JHJBLCBSOEM6JHJCKSwgMHhmZik+OworZGVmIDogIFBhdDwoc2V0dWxlIFI4QzokckEsIGltbVU4OiRpbW0pLAorICAgICAgICAgICAoWE9SQklyOCAoQ0xHVEJJcjggUjhDOiRyQSwgaW1tVTg6JGltbSksIDB4ZmYpPjsKKworZGVmIDogU0VUQ0NCaW5PcFJlZzxzZXR1Z2UsIFIxNkMsIE9ScjE2LCBDTEdUSHIxNiwgQ0VRSHIxNj47CitkZWYgOiBTRVRDQ0Jpbk9wSW1tPHNldHVnZSwgUjE2QywgaTE2SW1tU0V4dDEwLCBpMTYsCisgICAgICAgICAgICAgICAgICAgIE9ScjE2LCBDTEdUSElyMTYsIENFUUhJcjE2PjsKK2RlZiA6IFNFVENDQmluT3BSZWc8c2V0dWx0LCBSMTZDLCBOT1JyMTYsIENMR1RIcjE2LCBDRVFIcjE2PjsKK2RlZiA6IFNFVENDQmluT3BJbW08c2V0dWx0LCBSMTZDLCBpMTZJbW1TRXh0MTAsIGkxNiwgTk9ScjE2LAorICAgICAgICAgICAgICAgICAgICBDTEdUSElyMTYsIENFUUhJcjE2PjsKK2RlZiA6IFBhdDwoc2V0dWxlIFIxNkM6JHJBLCBSMTZDOiRyQiksCisgICAgICAgICAgKFhPUkhJcjE2IChDTEdUSHIxNiBSMTZDOiRyQSwgUjE2QzokckIpLCAweGZmZmYpPjsKK2RlZiA6ICBQYXQ8KHNldHVsZSBSMTZDOiRyQSwgaTE2SW1tU0V4dDEwOiRpbW0pLAorICAgICAgICAgICAoWE9SSElyMTYgKENMR1RISXIxNiBSMTZDOiRyQSwgaTE2SW1tU0V4dDEwOiRpbW0pLCAweGZmZmYpPjsKKworZGVmIDogU0VUQ0NCaW5PcFJlZzxzZXR1Z2UsIFIzMkMsIE9ScjMyLCBDTEdUcjMyLCBDRVFyMzI+OworZGVmIDogU0VUQ0NCaW5PcEltbTxzZXR1Z2UsIFIzMkMsIGkzMkltbVNFeHQxMCwgaTMyLAorICAgICAgICAgICAgICAgICAgICBPUnIzMiwgQ0xHVElyMzIsIENFUUlyMzI+OworZGVmIDogU0VUQ0NCaW5PcFJlZzxzZXR1bHQsIFIzMkMsIE5PUnIzMiwgQ0xHVHIzMiwgQ0VRcjMyPjsKK2RlZiA6IFNFVENDQmluT3BJbW08c2V0dWx0LCBSMzJDLCBpMzJJbW1TRXh0MTAsIGkzMiwgTk9ScjMyLCBDTEdUSXIzMiwgQ0VRSXIzMj47CitkZWYgOiBQYXQ8KHNldHVsZSBSMzJDOiRyQSwgUjMyQzokckIpLAorICAgICAgICAgIChYT1JJcjMyIChDTEdUcjMyIFIzMkM6JHJBLCBSMzJDOiRyQiksIDB4ZmZmZmZmZmYpPjsKK2RlZiA6IFBhdDwoc2V0dWxlIFIzMkM6JHJBLCBpMzJJbW1TRXh0MTA6JGltbSksCisgICAgICAgICAgKFhPUklyMzIgKENMR1RJcjMyIFIzMkM6JHJBLCBpMzJJbW1TRXh0MTA6JGltbSksIDB4ZmZmZmZmZmYpPjsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBzZWxlY3QgY29uZGl0aW9uYWwgcGF0dGVybnM6CisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKworY2xhc3MgU0VMRUNUTmVnQ29uZFJlZzxQYXRGcmFnIGNvbmQsIFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBWYWx1ZVR5cGUgaW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU1BVSW5zdHIgc2VsaW5zdHIsIFNQVUluc3RyIGNtcGFyZT46CisgIFBhdDwoc2VsZWN0IChpbnR0eXBlIChjb25kIHJjbGFzczokckEsIHJjbGFzczokckIpKSwKKyAgICAgICAgICAgICAgcmNsYXNzOiRyVHJ1ZSwgcmNsYXNzOiRyRmFsc2UpLAorICAgICAgKHNlbGluc3RyIHJjbGFzczokclRydWUsIHJjbGFzczokckZhbHNlLAorICAgICAgICAgICAgICAgIChjbXBhcmUgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQikpPjsKKworY2xhc3MgU0VMRUNUTmVnQ29uZEltbTxQYXRGcmFnIGNvbmQsIFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBWYWx1ZVR5cGUgaW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgUGF0TGVhZiBpbW1wcmVkLCBTUFVJbnN0ciBzZWxpbnN0ciwgU1BVSW5zdHIgY21wYXJlPjoKKyAgUGF0PChzZWxlY3QgKGludHR5cGUgKGNvbmQgcmNsYXNzOiRyQSwgaW1tcHJlZDokaW1tKSksCisgICAgICAgICAgICAgIHJjbGFzczokclRydWUsIHJjbGFzczokckZhbHNlKSwKKyAgICAgIChzZWxpbnN0ciByY2xhc3M6JHJUcnVlLCByY2xhc3M6JHJGYWxzZSwKKyAgICAgICAgICAgICAgICAoY21wYXJlIHJjbGFzczokckEsIGltbXByZWQ6JGltbSkpPjsKKworZGVmIDogU0VMRUNUTmVnQ29uZFJlZzxzZXRuZSwgUjhDLCBpOCwgU0VMQnI4LCBDRVFCcjg+OworZGVmIDogU0VMRUNUTmVnQ29uZEltbTxzZXRuZSwgUjhDLCBpOCwgaW1tU0V4dDgsIFNFTEJyOCwgQ0VRQklyOD47CitkZWYgOiBTRUxFQ1ROZWdDb25kUmVnPHNldGxlLCBSOEMsIGk4LCBTRUxCcjgsIENHVEJyOD47CitkZWYgOiBTRUxFQ1ROZWdDb25kSW1tPHNldGxlLCBSOEMsIGk4LCBpbW1TRXh0OCwgU0VMQnI4LCBDR1RCcjg+OworZGVmIDogU0VMRUNUTmVnQ29uZFJlZzxzZXR1bGUsIFI4QywgaTgsIFNFTEJyOCwgQ0xHVEJyOD47CitkZWYgOiBTRUxFQ1ROZWdDb25kSW1tPHNldHVsZSwgUjhDLCBpOCwgaW1tVTgsIFNFTEJyOCwgQ0xHVEJJcjg+OworCitkZWYgOiBTRUxFQ1ROZWdDb25kUmVnPHNldG5lLCBSMTZDLCBpMTYsIFNFTEJyMTYsIENFUUhyMTY+OworZGVmIDogU0VMRUNUTmVnQ29uZEltbTxzZXRuZSwgUjE2QywgaTE2LCBpMTZJbW1TRXh0MTAsIFNFTEJyMTYsIENFUUhJcjE2PjsKK2RlZiA6IFNFTEVDVE5lZ0NvbmRSZWc8c2V0bGUsIFIxNkMsIGkxNiwgU0VMQnIxNiwgQ0dUSHIxNj47CitkZWYgOiBTRUxFQ1ROZWdDb25kSW1tPHNldGxlLCBSMTZDLCBpMTYsIGkxNkltbVNFeHQxMCwgU0VMQnIxNiwgQ0dUSElyMTY+OworZGVmIDogU0VMRUNUTmVnQ29uZFJlZzxzZXR1bGUsIFIxNkMsIGkxNiwgU0VMQnIxNiwgQ0xHVEhyMTY+OworZGVmIDogU0VMRUNUTmVnQ29uZEltbTxzZXR1bGUsIFIxNkMsIGkxNiwgaTE2SW1tU0V4dDEwLCBTRUxCcjE2LCBDTEdUSElyMTY+OworCitkZWYgOiBTRUxFQ1ROZWdDb25kUmVnPHNldG5lLCBSMzJDLCBpMzIsIFNFTEJyMzIsIENFUXIzMj47CitkZWYgOiBTRUxFQ1ROZWdDb25kSW1tPHNldG5lLCBSMzJDLCBpMzIsIGkzMkltbVNFeHQxMCwgU0VMQnIzMiwgQ0VRSXIzMj47CitkZWYgOiBTRUxFQ1ROZWdDb25kUmVnPHNldGxlLCBSMzJDLCBpMzIsIFNFTEJyMzIsIENHVHIzMj47CitkZWYgOiBTRUxFQ1ROZWdDb25kSW1tPHNldGxlLCBSMzJDLCBpMzIsIGkzMkltbVNFeHQxMCwgU0VMQnIzMiwgQ0dUSXIzMj47CitkZWYgOiBTRUxFQ1ROZWdDb25kUmVnPHNldHVsZSwgUjMyQywgaTMyLCBTRUxCcjMyLCBDTEdUcjMyPjsKK2RlZiA6IFNFTEVDVE5lZ0NvbmRJbW08c2V0dWxlLCBSMzJDLCBpMzIsIGkzMkltbVNFeHQxMCwgU0VMQnIzMiwgQ0xHVElyMzI+OworCitjbGFzcyBTRUxFQ1RCaW5PcFJlZzxQYXRGcmFnIGNvbmQsIFJlZ2lzdGVyQ2xhc3MgcmNsYXNzLCBWYWx1ZVR5cGUgaW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIFNQVUluc3RyIHNlbGluc3RyLCBTUFVJbnN0ciBiaW5vcCwgU1BVSW5zdHIgY21wT3AxLAorICAgICAgICAgICAgICAgICAgICAgU1BVSW5zdHIgY21wT3AyPjoKKyAgUGF0PChzZWxlY3QgKGludHR5cGUgKGNvbmQgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQikpLAorICAgICAgICAgICAgICByY2xhc3M6JHJUcnVlLCByY2xhc3M6JHJGYWxzZSksCisgICAgICAoc2VsaW5zdHIgcmNsYXNzOiRyRmFsc2UsIHJjbGFzczokclRydWUsCisgICAgICAgICAgICAgICAgKGJpbm9wIChjbXBPcDEgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgIChjbXBPcDIgcmNsYXNzOiRyQSwgcmNsYXNzOiRyQikpKT47CisKK2NsYXNzIFNFTEVDVEJpbk9wSW1tPFBhdEZyYWcgY29uZCwgUmVnaXN0ZXJDbGFzcyByY2xhc3MsIFBhdExlYWYgaW1tcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZSBpbnR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgU1BVSW5zdHIgc2VsaW5zdHIsIFNQVUluc3RyIGJpbm9wLCBTUFVJbnN0ciBjbXBPcDEsCisgICAgICAgICAgICAgICAgICAgICBTUFVJbnN0ciBjbXBPcDI+OgorICAgIFBhdDwoc2VsZWN0IChpbnR0eXBlIChjb25kIHJjbGFzczokckEsIChpbnR0eXBlIGltbXByZWQ6JGltbSkpKSwKKyAgICAgICAgICAgICAgICByY2xhc3M6JHJUcnVlLCByY2xhc3M6JHJGYWxzZSksCisgICAgICAgIChzZWxpbnN0ciByY2xhc3M6JHJGYWxzZSwgcmNsYXNzOiRyVHJ1ZSwKKyAgICAgICAgICAgICAgICAgIChiaW5vcCAoY21wT3AxIHJjbGFzczokckEsIChpbnR0eXBlIGltbXByZWQ6JGltbSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjbXBPcDIgcmNsYXNzOiRyQSwgKGludHR5cGUgaW1tcHJlZDokaW1tKSkpKT47CisKK2RlZiA6IFNFTEVDVEJpbk9wUmVnPHNldGdlLCBSOEMsIGk4LCBTRUxCcjgsIE9ScjgsIENHVEJyOCwgQ0VRQnI4PjsKK2RlZiA6IFNFTEVDVEJpbk9wSW1tPHNldGdlLCBSOEMsIGltbVNFeHQ4LCBpOCwKKyAgICAgICAgICAgICAgICAgICAgIFNFTEJyOCwgT1JyOCwgQ0dUQklyOCwgQ0VRQklyOD47CisKK2RlZiA6IFNFTEVDVEJpbk9wUmVnPHNldGdlLCBSMTZDLCBpMTYsIFNFTEJyMTYsIE9ScjE2LCBDR1RIcjE2LCBDRVFIcjE2PjsKK2RlZiA6IFNFTEVDVEJpbk9wSW1tPHNldGdlLCBSMTZDLCBpMTZJbW1TRXh0MTAsIGkxNiwKKyAgICAgICAgICAgICAgICAgICAgIFNFTEJyMTYsIE9ScjE2LCBDR1RISXIxNiwgQ0VRSElyMTY+OworCitkZWYgOiBTRUxFQ1RCaW5PcFJlZzxzZXRnZSwgUjMyQywgaTMyLCBTRUxCcjMyLCBPUnIzMiwgQ0dUcjMyLCBDRVFyMzI+OworZGVmIDogU0VMRUNUQmluT3BJbW08c2V0Z2UsIFIzMkMsIGkzMkltbVNFeHQxMCwgaTMyLAorICAgICAgICAgICAgICAgICAgICAgU0VMQnIzMiwgT1JyMzIsIENHVElyMzIsIENFUUlyMzI+OworCitkZWYgOiBTRUxFQ1RCaW5PcFJlZzxzZXR1Z2UsIFI4QywgaTgsIFNFTEJyOCwgT1JyOCwgQ0xHVEJyOCwgQ0VRQnI4PjsKK2RlZiA6IFNFTEVDVEJpbk9wSW1tPHNldHVnZSwgUjhDLCBpbW1TRXh0OCwgaTgsCisgICAgICAgICAgICAgICAgICAgICBTRUxCcjgsIE9ScjgsIENMR1RCSXI4LCBDRVFCSXI4PjsKKworZGVmIDogU0VMRUNUQmluT3BSZWc8c2V0dWdlLCBSMTZDLCBpMTYsIFNFTEJyMTYsIE9ScjE2LCBDTEdUSHIxNiwgQ0VRSHIxNj47CitkZWYgOiBTRUxFQ1RCaW5PcEltbTxzZXR1Z2UsIFIxNkMsIGkxNkltbVVuczEwLCBpMTYsCisgICAgICAgICAgICAgICAgICAgICBTRUxCcjE2LCBPUnIxNiwgQ0xHVEhJcjE2LCBDRVFISXIxNj47CisKK2RlZiA6IFNFTEVDVEJpbk9wUmVnPHNldHVnZSwgUjMyQywgaTMyLCBTRUxCcjMyLCBPUnIzMiwgQ0xHVHIzMiwgQ0VRcjMyPjsKK2RlZiA6IFNFTEVDVEJpbk9wSW1tPHNldHVnZSwgUjMyQywgaTMySW1tVW5zMTAsIGkzMiwKKyAgICAgICAgICAgICAgICAgICAgIFNFTEJyMzIsIE9ScjMyLCBDTEdUSXIzMiwgQ0VRSXIzMj47CisKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitsZXQgaXNDYWxsID0gMSwKKyAgLy8gQWxsIGNhbGxzIGNsb2JiZXIgdGhlIG5vbi1jYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzOgorICBEZWZzID0gW1IwLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LAorICAgICAgICAgIFIxMCxSMTEsUjEyLFIxMyxSMTQsUjE1LFIxNixSMTcsUjE4LFIxOSwKKyAgICAgICAgICBSMjAsUjIxLFIyMixSMjMsUjI0LFIyNSxSMjYsUjI3LFIyOCxSMjksCisgICAgICAgICAgUjMwLFIzMSxSMzIsUjMzLFIzNCxSMzUsUjM2LFIzNyxSMzgsUjM5LAorICAgICAgICAgIFI0MCxSNDEsUjQyLFI0MyxSNDQsUjQ1LFI0NixSNDcsUjQ4LFI0OSwKKyAgICAgICAgICBSNTAsUjUxLFI1MixSNTMsUjU0LFI1NSxSNTYsUjU3LFI1OCxSNTksCisgICAgICAgICAgUjYwLFI2MSxSNjIsUjYzLFI2NCxSNjUsUjY2LFI2NyxSNjgsUjY5LAorICAgICAgICAgIFI3MCxSNzEsUjcyLFI3MyxSNzQsUjc1LFI3NixSNzcsUjc4LFI3OV0sCisgIC8vIEFsbCBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgdXNlICRsciAoYWthICQwKQorICBVc2VzID0gW1IwXSAgaW4geworICAvLyBCcmFuY2ggcmVsYXRpdmUgYW5kIHNldCBsaW5rOiBVc2VkIGlmIHdlIGFjdHVhbGx5IGtub3cgdGhhdCB0aGUgdGFyZ2V0CisgIC8vIGlzIHdpdGhpbiBbLTMyNzY4LCAzMjc2N10gYnl0ZXMgb2YgdGhlIHRhcmdldAorICBkZWYgQlJTTDoKKyAgICBCcmFuY2hTZXRMaW5rPDBiMDExMDAxMTAwLCAob3V0cyksIChpbnMgcmVsY2FsbHRhcmdldDokZnVuYywgdmFyaWFibGVfb3BzKSwKKyAgICAgICJicnNsXHQkJGxyLCAkZnVuYyIsCisgICAgICBbKFNQVWNhbGwgKFNQVXBjcmVsIHRnbG9iYWxhZGRyOiRmdW5jLCAwKSldPjsKKworICAvLyBCcmFuY2ggYWJzb2x1dGUgYW5kIHNldCBsaW5rOiBVc2VkIGlmIHdlIGFjdHVhbGx5IGtub3cgdGhhdCB0aGUgdGFyZ2V0CisgIC8vIGlzIGFuIGFic29sdXRlIGFkZHJlc3MKKyAgZGVmIEJSQVNMOgorICAgIEJyYW5jaFNldExpbms8MGIwMTEwMDExMDAsIChvdXRzKSwgKGlucyBjYWxsdGFyZ2V0OiRmdW5jLCB2YXJpYWJsZV9vcHMpLAorICAgICAgImJyYXNsXHQkJGxyLCAkZnVuYyIsCisgICAgICBbKFNQVWNhbGwgKFNQVWFmb3JtIHRnbG9iYWxhZGRyOiRmdW5jLCAwKSldPjsKKworICAvLyBCcmFuY2ggaW5kaXJlY3QgYW5kIHNldCBsaW5rIGlmIGV4dGVybmFsIGRhdGEuIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgbm90CisgIC8vIGFjdHVhbGx5IGdlbmVyYXRlZCwgbWF0Y2hlZCBieSBhbiBpbnRyaW5zaWM6CisgIGRlZiBCSVNMRURfMDA6IEJJU0xFREZvcm08MGIxMSwgImJpc2xlZFx0JCRsciwgJGZ1bmMiLCBbLyogZW1wdHkgcGF0dGVybiAqL10+OworICBkZWYgQklTTEVEX0UwOiBCSVNMRURGb3JtPDBiMTAsICJiaXNsZWRcdCQkbHIsICRmdW5jIiwgWy8qIGVtcHR5IHBhdHRlcm4gKi9dPjsKKyAgZGVmIEJJU0xFRF8wRDogQklTTEVERm9ybTwwYjAxLCAiYmlzbGVkXHQkJGxyLCAkZnVuYyIsIFsvKiBlbXB0eSBwYXR0ZXJuICovXT47CisgIGRlZiBCSVNMRURfRUQ6IEJJU0xFREZvcm08MGIwMCwgImJpc2xlZFx0JCRsciwgJGZ1bmMiLCBbLyogZW1wdHkgcGF0dGVybiAqL10+OworCisgIC8vIEJyYW5jaCBpbmRpcmVjdCBhbmQgc2V0IGxpbmsuIFRoaXMgaXMgdGhlICJYLWZvcm0iIGFkZHJlc3MgdmVyc2lvbiBvZiBhCisgIC8vIGZ1bmN0aW9uIGNhbGwKKyAgZGVmIEJJU0w6CisgICAgQklGb3JtPDBiMTAwMTAxMDExMDAsICJiaXNsXHQkJGxyLCAkZnVuYyIsIFsoU1BVY2FsbCBSMzJDOiRmdW5jKV0+OworfQorCisvLyBTdXBwb3J0IGNhbGxzIHRvIGV4dGVybmFsIHN5bWJvbHM6ICAgICAgCitkZWYgOiBQYXQ8KFNQVWNhbGwgKFNQVXBjcmVsIHRleHRlcm5hbHN5bTokZnVuYywgMCkpLAorICAgICAgICAgIChCUlNMIHRleHRlcm5hbHN5bTokZnVuYyk+OworICAgICAgCitkZWYgOiBQYXQ8KFNQVWNhbGwgKFNQVWFmb3JtIHRleHRlcm5hbHN5bTokZnVuYywgMCkpLAorICAgICAgICAgIChCUkFTTCB0ZXh0ZXJuYWxzeW06JGZ1bmMpPjsKKworLy8gVW5jb25kaXRpb25hbCBicmFuY2hlczoKK2xldCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGhhc0N0cmxEZXAgPSAxIGluIHsKKyAgbGV0IGlzQmFycmllciA9IDEgaW4geworICAgIGRlZiBCUiA6CisgICAgICBVbmNvbmRCcmFuY2g8MGIwMDEwMDExMDAsIChvdXRzKSwgKGlucyBicnRhcmdldDokZGVzdCksCisgICAgICAgICJiclx0JGRlc3QiLAorICAgICAgICBbKGJyIGJiOiRkZXN0KV0+OworCisgICAgLy8gVW5jb25kaXRpb25hbCwgYWJzb2x1dGUgYWRkcmVzcyBicmFuY2gKKyAgICBkZWYgQlJBOgorICAgICAgVW5jb25kQnJhbmNoPDBiMDAxMTAwMDAwLCAob3V0cyksIChpbnMgYnJ0YXJnZXQ6JGRlc3QpLAorICAgICAgICAiYnJhXHQkZGVzdCIsCisgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKKyAgICAvLyBJbmRpcmVjdCBicmFuY2gKKyAgICBkZWYgQkk6CisgICAgICBCSUZvcm08MGIwMDAxMDEwMTEwMCwgImJpXHQkZnVuYyIsIFsoYnJpbmQgUjMyQzokZnVuYyldPjsKKyAgfQorCisgIC8vIENvbmRpdGlvbmFsIGJyYW5jaGVzOgorICBjbGFzcyBCUk5aSW5zdDxkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUkkxNkZvcm08MGIwMTAwMDAxMDAsIChvdXRzKSwgSU9MLCAiYnJuelx0JHJDb25kLCRkZXN0IiwKKyAgICAgICAgICAgICBCcmFuY2hSZXNvbHYsIHBhdHRlcm4+OworCisgIGNsYXNzIEJSTlpSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBCUk5aSW5zdDwoaW5zIHJjbGFzczokckNvbmQsIGJydGFyZ2V0OiRkZXN0KSwKKyAgICAgICAgICAgICBbKGJyY29uZCByY2xhc3M6JHJDb25kLCBiYjokZGVzdCldPjsKKworICBjbGFzcyBCUk5aVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgQlJOWkluc3Q8KGlucyBWRUNSRUc6JHJDb25kLCBicnRhcmdldDokZGVzdCksCisgICAgICAgICAgICAgWyhicmNvbmQgKHZlY3R5cGUgVkVDUkVHOiRyQ29uZCksIGJiOiRkZXN0KV0+OworCisgIG11bHRpY2xhc3MgQnJhbmNoTm90WmVybyB7CisgICAgZGVmIHY0aTMyIDogQlJOWlZlY0luc3Q8djRpMzI+OworICAgIGRlZiByMzIgICA6IEJSTlpSZWdJbnN0PFIzMkM+OworICB9CisKKyAgZGVmbSBCUk5aIDogQnJhbmNoTm90WmVybzsKKworICBjbGFzcyBCUlpJbnN0PGRhZyBJT0wsIGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBSSTE2Rm9ybTwwYjAwMDAwMDEwMCwgKG91dHMpLCBJT0wsICJicnpcdCRyVCwkZGVzdCIsCisgICAgICAgICAgICAgQnJhbmNoUmVzb2x2LCBwYXR0ZXJuPjsKKworICBjbGFzcyBCUlpSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBCUlpJbnN0PChpbnMgcmNsYXNzOiRyVCwgYnJ0YXJnZXQ6JGRlc3QpLCBbLyogbm8gcGF0dGVybiAqL10+OworCisgIGNsYXNzIEJSWlZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIEJSWkluc3Q8KGlucyBWRUNSRUc6JHJULCBicnRhcmdldDokZGVzdCksIFsvKiBubyBwYXR0ZXJuICovXT47CisKKyAgbXVsdGljbGFzcyBCcmFuY2haZXJvIHsKKyAgICBkZWYgdjRpMzI6IEJSWlZlY0luc3Q8djRpMzI+OworICAgIGRlZiByMzI6ICAgQlJaUmVnSW5zdDxSMzJDPjsKKyAgfQorCisgIGRlZm0gQlJaOiBCcmFuY2haZXJvOworCisgIC8vIE5vdGU6IExMVk0gZG9lc24ndCBkbyBicmFuY2ggY29uZGl0aW9uYWwsIGluZGlyZWN0LiBPdGhlcndpc2UgdGhlc2Ugd291bGQKKyAgLy8gYmUgdXNlZnVsOgorICAvKgorICBjbGFzcyBCSU5aSW5zdDxkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICBCSUNvbmRGb3JtPDBiMTAwMTAxMDAxMDAsIChvdXRzKSwgSU9MLCAiYmluelx0JHJBLCAkZGVzdCIsIHBhdHRlcm4+OworCisgIGNsYXNzIEJJTlpSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBCSU5aSW5zdDwoaW5zIHJjbGFzczokckEsIGJydGFyZ2V0OiRkZXN0KSwKKyAgICAgICAgICAgICBbKGJyY29uZCByY2xhc3M6JHJBLCBSMzJDOiRkZXN0KV0+OworCisgIGNsYXNzIEJJTlpWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBCSU5aSW5zdDwoaW5zIFZFQ1JFRzokckEsIFIzMkM6JGRlc3QpLAorICAgICAgICAgICAgIFsoYnJjb25kICh2ZWN0eXBlIFZFQ1JFRzokckEpLCBSMzJDOiRkZXN0KV0+OworCisgIG11bHRpY2xhc3MgQnJhbmNoTm90WmVyb0luZGlyZWN0IHsKKyAgICBkZWYgdjRpMzI6IEJJTlpWZWNJbnN0PHY0aTMyPjsKKyAgICBkZWYgcjMyOiAgIEJJTlpSZWdJbnN0PFIzMkM+OworICB9CisKKyAgZGVmbSBCSU5aOiBCcmFuY2hOb3RaZXJvSW5kaXJlY3Q7CisKKyAgY2xhc3MgQklaSW5zdDxkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgQklDb25kRm9ybTwwYjAwMDEwMTAwMTAwLCAob3V0cyksIElPTCwgImJpelx0JHJBLCAkZnVuYyIsIHBhdHRlcm4+OworCisgIGNsYXNzIEJJWlJlZ0luc3Q8UmVnaXN0ZXJDbGFzcyByY2xhc3M+OgorICAgIEJJWkluc3Q8KGlucyByY2xhc3M6JHJBLCBSMzJDOiRmdW5jKSwgWy8qIG5vIHBhdHRlcm4gKi9dPjsKKworICBjbGFzcyBCSVpWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBCSVpJbnN0PChpbnMgVkVDUkVHOiRyQSwgUjMyQzokZnVuYyksIFsvKiBubyBwYXR0ZXJuICovXT47CisKKyAgbXVsdGljbGFzcyBCcmFuY2haZXJvSW5kaXJlY3QgeworICAgIGRlZiB2NGkzMjogQklaVmVjSW5zdDx2NGkzMj47CisgICAgZGVmIHIzMjogICBCSVpSZWdJbnN0PFIzMkM+OworICB9CisKKyAgZGVmbSBCSVo6IEJyYW5jaFplcm9JbmRpcmVjdDsKKyAgKi8KKworICBjbGFzcyBCUkhOWkluc3Q8ZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJJMTZGb3JtPDBiMDExMDAwMTAwLCAob3V0cyksIElPTCwgImJyaG56XHQkckNvbmQsJGRlc3QiLCBCcmFuY2hSZXNvbHYsCisgICAgICAgICAgICAgcGF0dGVybj47CisKKyAgY2xhc3MgQlJITlpSZWdJbnN0PFJlZ2lzdGVyQ2xhc3MgcmNsYXNzPjoKKyAgICBCUkhOWkluc3Q8KGlucyByY2xhc3M6JHJDb25kLCBicnRhcmdldDokZGVzdCksCisgICAgICAgICAgICAgIFsoYnJjb25kIHJjbGFzczokckNvbmQsIGJiOiRkZXN0KV0+OworCisgIGNsYXNzIEJSSE5aVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgQlJITlpJbnN0PChpbnMgVkVDUkVHOiRyQ29uZCwgYnJ0YXJnZXQ6JGRlc3QpLCBbLyogbm8gcGF0dGVybiAqL10+OworCisgIG11bHRpY2xhc3MgQnJhbmNoTm90WmVyb0hhbGZ3b3JkIHsKKyAgICBkZWYgdjhpMTY6IEJSSE5aVmVjSW5zdDx2OGkxNj47CisgICAgZGVmIHIxNjogICBCUkhOWlJlZ0luc3Q8UjE2Qz47CisgIH0KKworICBkZWZtIEJSSE5aOiBCcmFuY2hOb3RaZXJvSGFsZndvcmQ7CisKKyAgY2xhc3MgQlJIWkluc3Q8ZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJJMTZGb3JtPDBiMDAxMDAwMTAwLCAob3V0cyksIElPTCwgImJyaHpcdCRyVCwkZGVzdCIsIEJyYW5jaFJlc29sdiwKKyAgICAgICAgICAgICBwYXR0ZXJuPjsKKworICBjbGFzcyBCUkhaUmVnSW5zdDxSZWdpc3RlckNsYXNzIHJjbGFzcz46CisgICAgQlJIWkluc3Q8KGlucyByY2xhc3M6JHJULCBicnRhcmdldDokZGVzdCksIFsvKiBubyBwYXR0ZXJuICovXT47CisKKyAgY2xhc3MgQlJIWlZlY0luc3Q8VmFsdWVUeXBlIHZlY3R5cGU+OgorICAgIEJSSFpJbnN0PChpbnMgVkVDUkVHOiRyVCwgYnJ0YXJnZXQ6JGRlc3QpLCBbLyogbm8gcGF0dGVybiAqL10+OworCisgIG11bHRpY2xhc3MgQnJhbmNoWmVyb0hhbGZ3b3JkIHsKKyAgICBkZWYgdjhpMTY6IEJSSFpWZWNJbnN0PHY4aTE2PjsKKyAgICBkZWYgcjE2OiAgIEJSSFpSZWdJbnN0PFIxNkM+OworICB9CisKKyAgZGVmbSBCUkhaOiBCcmFuY2haZXJvSGFsZndvcmQ7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBzZXRjYyBhbmQgYnJjb25kIHBhdHRlcm5zOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIDogUGF0PChicmNvbmQgKGkxNiAoc2V0ZXEgUjE2QzokckEsIDApKSwgYmI6JGRlc3QpLAorICAgICAgICAgIChCUkhacjE2IFIxNkM6JHJBLCBiYjokZGVzdCk+OworZGVmIDogUGF0PChicmNvbmQgKGkxNiAoc2V0bmUgUjE2QzokckEsIDApKSwgYmI6JGRlc3QpLAorICAgICAgICAgIChCUkhOWnIxNiBSMTZDOiRyQSwgYmI6JGRlc3QpPjsKKworZGVmIDogUGF0PChicmNvbmQgKGkzMiAoc2V0ZXEgUjMyQzokckEsIDApKSwgYmI6JGRlc3QpLAorICAgICAgICAgIChCUlpyMzIgUjMyQzokckEsIGJiOiRkZXN0KT47CitkZWYgOiBQYXQ8KGJyY29uZCAoaTMyIChzZXRuZSBSMzJDOiRyQSwgMCkpLCBiYjokZGVzdCksCisgICAgICAgICAgKEJSTlpyMzIgUjMyQzokckEsIGJiOiRkZXN0KT47CisKK211bHRpY2xhc3MgQnJhbmNoQ29uZEVRPFBhdEZyYWcgY29uZCwgU1BVSW5zdHIgYnJpbnN0MTYsIFNQVUluc3RyIGJyaW5zdDMyPgoreworICBkZWYgcjE2aW1tOiBQYXQ8KGJyY29uZCAoaTE2IChjb25kIFIxNkM6JHJBLCBpMTZJbW1TRXh0MTA6JHZhbCkpLCBiYjokZGVzdCksCisgICAgICAgICAgICAgICAgICAoYnJpbnN0MTYgKENFUUhJcjE2IFIxNkM6JHJBLCBpMTZJbW1TRXh0MTA6JHZhbCksIGJiOiRkZXN0KT47CisKKyAgZGVmIHIxNiA6IFBhdDwoYnJjb25kIChpMTYgKGNvbmQgUjE2QzokckEsIFIxNkM6JHJCKSksIGJiOiRkZXN0KSwKKyAgICAgICAgICAgICAgICAoYnJpbnN0MTYgKENFUUhyMTYgUjE2QzokckEsIFIxNjokckIpLCBiYjokZGVzdCk+OworCisgIGRlZiByMzJpbW0gOiBQYXQ8KGJyY29uZCAoaTMyIChjb25kIFIzMkM6JHJBLCBpMzJJbW1TRXh0MTA6JHZhbCkpLCBiYjokZGVzdCksCisgICAgICAgICAgICAgICAgICAgKGJyaW5zdDMyIChDRVFJcjMyIFIzMkM6JHJBLCBpMzJJbW1TRXh0MTA6JHZhbCksIGJiOiRkZXN0KT47CisKKyAgZGVmIHIzMiA6IFBhdDwoYnJjb25kIChpMzIgKGNvbmQgUjMyQzokckEsIFIzMkM6JHJCKSksIGJiOiRkZXN0KSwKKyAgICAgICAgICAgICAgICAoYnJpbnN0MzIgKENFUXIzMiBSMzJDOiRyQSwgUjMyQzokckIpLCBiYjokZGVzdCk+OworfQorCitkZWZtIEJSQ09ORGVxIDogQnJhbmNoQ29uZEVRPHNldGVxLCBCUkhOWnIxNiwgQlJOWnIzMj47CitkZWZtIEJSQ09ORG5lIDogQnJhbmNoQ29uZEVRPHNldG5lLCBCUkhacjE2LCBCUlpyMzI+OworCittdWx0aWNsYXNzIEJyYW5jaENvbmRMR1Q8UGF0RnJhZyBjb25kLCBTUFVJbnN0ciBicmluc3QxNiwgU1BVSW5zdHIgYnJpbnN0MzI+Cit7CisgIGRlZiByMTZpbW0gOiBQYXQ8KGJyY29uZCAoaTE2IChjb25kIFIxNkM6JHJBLCBpMTZJbW1TRXh0MTA6JHZhbCkpLCBiYjokZGVzdCksCisgICAgICAgICAgICAgICAgICAgKGJyaW5zdDE2IChDTEdUSElyMTYgUjE2QzokckEsIGkxNkltbVNFeHQxMDokdmFsKSwgYmI6JGRlc3QpPjsKKworICBkZWYgcjE2IDogUGF0PChicmNvbmQgKGkxNiAoY29uZCBSMTZDOiRyQSwgUjE2QzokckIpKSwgYmI6JGRlc3QpLAorICAgICAgICAgICAgICAgIChicmluc3QxNiAoQ0xHVEhyMTYgUjE2QzokckEsIFIxNjokckIpLCBiYjokZGVzdCk+OworCisgIGRlZiByMzJpbW0gOiBQYXQ8KGJyY29uZCAoaTMyIChjb25kIFIzMkM6JHJBLCBpMzJJbW1TRXh0MTA6JHZhbCkpLCBiYjokZGVzdCksCisgICAgICAgICAgICAgICAgICAgKGJyaW5zdDMyIChDTEdUSXIzMiBSMzJDOiRyQSwgaTMySW1tU0V4dDEwOiR2YWwpLCBiYjokZGVzdCk+OworCisgIGRlZiByMzIgOiBQYXQ8KGJyY29uZCAoaTMyIChjb25kIFIzMkM6JHJBLCBSMzJDOiRyQikpLCBiYjokZGVzdCksCisgICAgICAgICAgICAgICAgKGJyaW5zdDMyIChDTEdUcjMyIFIzMkM6JHJBLCBSMzJDOiRyQiksIGJiOiRkZXN0KT47Cit9CisKK2RlZm0gQlJDT05EdWd0IDogQnJhbmNoQ29uZExHVDxzZXR1Z3QsIEJSSE5acjE2LCBCUk5acjMyPjsKK2RlZm0gQlJDT05EdWxlIDogQnJhbmNoQ29uZExHVDxzZXR1bGUsIEJSSFpyMTYsIEJSWnIzMj47CisKK211bHRpY2xhc3MgQnJhbmNoQ29uZExHVEVRPFBhdEZyYWcgY29uZCwgU1BVSW5zdHIgb3JpbnN0MTYsIFNQVUluc3RyIGJyaW5zdDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BVSW5zdHIgb3JpbnN0MzIsIFNQVUluc3RyIGJyaW5zdDMyPgoreworICBkZWYgcjE2aW1tOiBQYXQ8KGJyY29uZCAoaTE2IChjb25kIFIxNkM6JHJBLCBpMTZJbW1TRXh0MTA6JHZhbCkpLCBiYjokZGVzdCksCisgICAgICAgICAgICAgICAgICAoYnJpbnN0MTYgKG9yaW5zdDE2IChDTEdUSElyMTYgUjE2QzokckEsIGkxNkltbVNFeHQxMDokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENFUUhJcjE2IFIxNkM6JHJBLCBpMTZJbW1TRXh0MTA6JHZhbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiOiRkZXN0KT47CisKKyAgZGVmIHIxNjogUGF0PChicmNvbmQgKGkxNiAoY29uZCBSMTZDOiRyQSwgUjE2QzokckIpKSwgYmI6JGRlc3QpLAorICAgICAgICAgICAgICAgKGJyaW5zdDE2IChvcmluc3QxNiAoQ0xHVEhyMTYgUjE2QzokckEsIFIxNjokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0VRSHIxNiBSMTZDOiRyQSwgUjE2OiRyQikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJiOiRkZXN0KT47CisKKyAgZGVmIHIzMmltbSA6IFBhdDwoYnJjb25kIChpMzIgKGNvbmQgUjMyQzokckEsIGkzMkltbVNFeHQxMDokdmFsKSksIGJiOiRkZXN0KSwKKyAgICAgICAgICAgICAgICAgICAoYnJpbnN0MzIgKG9yaW5zdDMyIChDTEdUSXIzMiBSMzJDOiRyQSwgaTMySW1tU0V4dDEwOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENFUUlyMzIgUjMyQzokckEsIGkzMkltbVNFeHQxMDokdmFsKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiOiRkZXN0KT47CisKKyAgZGVmIHIzMiA6IFBhdDwoYnJjb25kIChpMzIgKGNvbmQgUjMyQzokckEsIFIzMkM6JHJCKSksIGJiOiRkZXN0KSwKKyAgICAgICAgICAgICAgICAoYnJpbnN0MzIgKG9yaW5zdDMyIChDTEdUcjMyIFIzMkM6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0VRcjMyIFIzMkM6JHJBLCBSMzJDOiRyQikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYjokZGVzdCk+OworfQorCitkZWZtIEJSQ09ORHVnZSA6IEJyYW5jaENvbmRMR1RFUTxzZXR1Z2UsIE9ScjE2LCBCUkhOWnIxNiwgT1JyMzIsIEJSTlpyMzI+OworZGVmbSBCUkNPTkR1bHQgOiBCcmFuY2hDb25kTEdURVE8c2V0dWx0LCBPUnIxNiwgQlJIWnIxNiwgT1JyMzIsIEJSWnIzMj47CisKK211bHRpY2xhc3MgQnJhbmNoQ29uZEdUPFBhdEZyYWcgY29uZCwgU1BVSW5zdHIgYnJpbnN0MTYsIFNQVUluc3RyIGJyaW5zdDMyPgoreworICBkZWYgcjE2aW1tIDogUGF0PChicmNvbmQgKGkxNiAoY29uZCBSMTZDOiRyQSwgaTE2SW1tU0V4dDEwOiR2YWwpKSwgYmI6JGRlc3QpLAorICAgICAgICAgICAgICAgICAgIChicmluc3QxNiAoQ0dUSElyMTYgUjE2QzokckEsIGkxNkltbVNFeHQxMDokdmFsKSwgYmI6JGRlc3QpPjsKKworICBkZWYgcjE2IDogUGF0PChicmNvbmQgKGkxNiAoY29uZCBSMTZDOiRyQSwgUjE2QzokckIpKSwgYmI6JGRlc3QpLAorICAgICAgICAgICAgICAgIChicmluc3QxNiAoQ0dUSHIxNiBSMTZDOiRyQSwgUjE2OiRyQiksIGJiOiRkZXN0KT47CisKKyAgZGVmIHIzMmltbSA6IFBhdDwoYnJjb25kIChpMzIgKGNvbmQgUjMyQzokckEsIGkzMkltbVNFeHQxMDokdmFsKSksIGJiOiRkZXN0KSwKKyAgICAgICAgICAgICAgICAgICAoYnJpbnN0MzIgKENHVElyMzIgUjMyQzokckEsIGkzMkltbVNFeHQxMDokdmFsKSwgYmI6JGRlc3QpPjsKKworICBkZWYgcjMyIDogUGF0PChicmNvbmQgKGkzMiAoY29uZCBSMzJDOiRyQSwgUjMyQzokckIpKSwgYmI6JGRlc3QpLAorICAgICAgICAgICAgICAgIChicmluc3QzMiAoQ0dUcjMyIFIzMkM6JHJBLCBSMzJDOiRyQiksIGJiOiRkZXN0KT47Cit9CisKK2RlZm0gQlJDT05EZ3QgOiBCcmFuY2hDb25kR1Q8c2V0Z3QsIEJSSE5acjE2LCBCUk5acjMyPjsKK2RlZm0gQlJDT05EbGUgOiBCcmFuY2hDb25kR1Q8c2V0bGUsIEJSSFpyMTYsIEJSWnIzMj47CisKK211bHRpY2xhc3MgQnJhbmNoQ29uZEdURVE8UGF0RnJhZyBjb25kLCBTUFVJbnN0ciBvcmluc3QxNiwgU1BVSW5zdHIgYnJpbnN0MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNQVUluc3RyIG9yaW5zdDMyLCBTUFVJbnN0ciBicmluc3QzMj4KK3sKKyAgZGVmIHIxNmltbTogUGF0PChicmNvbmQgKGkxNiAoY29uZCBSMTZDOiRyQSwgaTE2SW1tU0V4dDEwOiR2YWwpKSwgYmI6JGRlc3QpLAorICAgICAgICAgICAgICAgICAgKGJyaW5zdDE2IChvcmluc3QxNiAoQ0dUSElyMTYgUjE2QzokckEsIGkxNkltbVNFeHQxMDokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENFUUhJcjE2IFIxNkM6JHJBLCBpMTZJbW1TRXh0MTA6JHZhbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiOiRkZXN0KT47CisKKyAgZGVmIHIxNjogUGF0PChicmNvbmQgKGkxNiAoY29uZCBSMTZDOiRyQSwgUjE2QzokckIpKSwgYmI6JGRlc3QpLAorICAgICAgICAgICAgICAgKGJyaW5zdDE2IChvcmluc3QxNiAoQ0dUSHIxNiBSMTZDOiRyQSwgUjE2OiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRVFIcjE2IFIxNkM6JHJBLCBSMTY6JHJCKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYmI6JGRlc3QpPjsKKworICBkZWYgcjMyaW1tIDogUGF0PChicmNvbmQgKGkzMiAoY29uZCBSMzJDOiRyQSwgaTMySW1tU0V4dDEwOiR2YWwpKSwgYmI6JGRlc3QpLAorICAgICAgICAgICAgICAgICAgIChicmluc3QzMiAob3JpbnN0MzIgKENHVElyMzIgUjMyQzokckEsIGkzMkltbVNFeHQxMDokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRVFJcjMyIFIzMkM6JHJBLCBpMzJJbW1TRXh0MTA6JHZhbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYjokZGVzdCk+OworCisgIGRlZiByMzIgOiBQYXQ8KGJyY29uZCAoaTMyIChjb25kIFIzMkM6JHJBLCBSMzJDOiRyQikpLCBiYjokZGVzdCksCisgICAgICAgICAgICAgICAgKGJyaW5zdDMyIChvcmluc3QzMiAoQ0dUcjMyIFIzMkM6JHJBLCBSMzJDOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0VRcjMyIFIzMkM6JHJBLCBSMzJDOiRyQikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYjokZGVzdCk+OworfQorCitkZWZtIEJSQ09ORGdlIDogQnJhbmNoQ29uZEdURVE8c2V0Z2UsIE9ScjE2LCBCUkhOWnIxNiwgT1JyMzIsIEJSTlpyMzI+OworZGVmbSBCUkNPTkRsdCA6IEJyYW5jaENvbmRHVEVRPHNldGx0LCBPUnIxNiwgQlJIWnIxNiwgT1JyMzIsIEJSWnIzMj47CisKK2xldCBpc1Rlcm1pbmF0b3IgPSAxLCBpc0JhcnJpZXIgPSAxIGluIHsKKyAgbGV0IGlzUmV0dXJuID0gMSBpbiB7CisgICAgZGVmIFJFVDoKKyAgICAgICAgUkVURm9ybTwiYmlcdCQkbHIiLCBbKHJldGZsYWcpXT47CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBGQUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybTwwYjAxMDExMDAwMTAwLCBPT0wsIElPTCwgImZhXHQkclQsICRyQSwgJHJCIiwKKyAgICAgICAgICAgU1ByZWNGUCwgcGF0dGVybj47CisKK2NsYXNzIEZBVmVjSW5zdDxWYWx1ZVR5cGUgdmVjdHlwZT46CisgICAgRkFJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgIChmYWRkICh2ZWN0eXBlIFZFQ1JFRzokckEpLCAodmVjdHlwZSBWRUNSRUc6JHJCKSkpXT47CisKK211bHRpY2xhc3MgU0ZQQWRkCit7CisgIGRlZiB2NGYzMjogRkFWZWNJbnN0PHY0ZjMyPjsKKyAgZGVmIHYyZjMyOiBGQVZlY0luc3Q8djJmMzI+OworICBkZWYgZjMyOiAgIEZBSW5zdDwob3V0cyBSMzJGUDokclQpLCAoaW5zIFIzMkZQOiRyQSwgUjMyRlA6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjMyRlA6JHJULCAoZmFkZCBSMzJGUDokckEsIFIzMkZQOiRyQikpXT47Cit9CisKK2RlZm0gRkEgOiBTRlBBZGQ7CisKK2NsYXNzIEZTSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMDEwMTEwMDAxMDAsIE9PTCwgSU9MLCAiZnNcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBTUHJlY0ZQLCBwYXR0ZXJuPjsKKworY2xhc3MgRlNWZWNJbnN0PFZhbHVlVHlwZSB2ZWN0eXBlPjoKKyAgICBGU0luc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgIFsoc2V0ICh2ZWN0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAoZnN1YiAodmVjdHlwZSBWRUNSRUc6JHJBKSwgKHZlY3R5cGUgVkVDUkVHOiRyQikpKV0+OworCittdWx0aWNsYXNzIFNGUFN1YgoreworICBkZWYgdjRmMzI6IEZTVmVjSW5zdDx2NGYzMj47CisgIGRlZiB2MmYzMjogRlNWZWNJbnN0PHYyZjMyPjsKKyAgZGVmIGYzMjogICBGU0luc3Q8KG91dHMgUjMyRlA6JHJUKSwgKGlucyBSMzJGUDokckEsIFIzMkZQOiRyQiksCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIzMkZQOiRyVCwgKGZzdWIgUjMyRlA6JHJBLCBSMzJGUDokckIpKV0+OworfQorCitkZWZtIEZTIDogU0ZQU3ViOworCitjbGFzcyBGTUluc3Q8ZGFnIE9PTCwgZGFnIElPTCwgbGlzdDxkYWc+IHBhdHRlcm4+OgorICAgIFJSRm9ybTwwYjAxMTAwMDExMDEwLCBPT0wsIElPTCwKKyAgICAgICJmbVx0JHJULCAkckEsICRyQiIsIFNQcmVjRlAsCisgICAgICBwYXR0ZXJuPjsKKworY2xhc3MgRk1WZWNJbnN0PFZhbHVlVHlwZSB0eXBlPjoKKyAgICBGTUluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgIFsoc2V0ICh0eXBlIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAoZm11bCAodHlwZSBWRUNSRUc6JHJBKSwgKHR5cGUgVkVDUkVHOiRyQikpKV0+OworCittdWx0aWNsYXNzIFNGUE11bAoreworICBkZWYgdjRmMzI6IEZNVmVjSW5zdDx2NGYzMj47CisgIGRlZiB2MmYzMjogRk1WZWNJbnN0PHYyZjMyPjsKKyAgZGVmIGYzMjogICBGTUluc3Q8KG91dHMgUjMyRlA6JHJUKSwgKGlucyBSMzJGUDokckEsIFIzMkZQOiRyQiksCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBSMzJGUDokclQsIChmbXVsIFIzMkZQOiRyQSwgUjMyRlA6JHJCKSldPjsgCit9CisKK2RlZm0gRk0gOiBTRlBNdWw7CisKKy8vIEZsb2F0aW5nIHBvaW50IG11bHRpcGx5IGFuZCBhZGQKKy8vIGUuZy4gZCA9IGMgKyAoYSAqIGIpCitkZWYgRk1BdjRmMzI6CisgICAgUlJSRm9ybTwwYjAxMTEsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIsIFZFQ1JFRzokckMpLAorICAgICAgImZtYVx0JHJULCAkckEsICRyQiwgJHJDIiwgU1ByZWNGUCwKKyAgICAgIFsoc2V0ICh2NGYzMiBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgIChmYWRkICh2NGYzMiBWRUNSRUc6JHJDKSwKKyAgICAgICAgICAgICAgICAgIChmbXVsICh2NGYzMiBWRUNSRUc6JHJBKSwgKHY0ZjMyIFZFQ1JFRzokckIpKSkpXT47CisKK2RlZiBGTUFmMzI6CisgICAgUlJSRm9ybTwwYjAxMTEsIChvdXRzIFIzMkZQOiRyVCksIChpbnMgUjMyRlA6JHJBLCBSMzJGUDokckIsIFIzMkZQOiRyQyksCisgICAgICAiZm1hXHQkclQsICRyQSwgJHJCLCAkckMiLCBTUHJlY0ZQLAorICAgICAgWyhzZXQgUjMyRlA6JHJULCAoZmFkZCBSMzJGUDokckMsIChmbXVsIFIzMkZQOiRyQSwgUjMyRlA6JHJCKSkpXT47CisKKy8vIEZQIG11bHRpcGx5IGFuZCBzdWJ0cmFjdAorLy8gU3VidHJhY3RzIHZhbHVlIGluIHJDIGZyb20gcHJvZHVjdAorLy8gcmVzID0gYSAqIGIgLSBjCitkZWYgRk1TdjRmMzIgOgorICAgIFJSUkZvcm08MGIwMTExLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAgICJmbXNcdCRyVCwgJHJBLCAkckIsICRyQyIsIFNQcmVjRlAsCisgICAgICBbKHNldCAodjRmMzIgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAoZnN1YiAoZm11bCAodjRmMzIgVkVDUkVHOiRyQSksICh2NGYzMiBWRUNSRUc6JHJCKSksCisgICAgICAgICAgICAgICAgICAodjRmMzIgVkVDUkVHOiRyQykpKV0+OworCitkZWYgRk1TZjMyIDoKKyAgICBSUlJGb3JtPDBiMDExMSwgKG91dHMgUjMyRlA6JHJUKSwgKGlucyBSMzJGUDokckEsIFIzMkZQOiRyQiwgUjMyRlA6JHJDKSwKKyAgICAgICJmbXNcdCRyVCwgJHJBLCAkckIsICRyQyIsIFNQcmVjRlAsCisgICAgICBbKHNldCBSMzJGUDokclQsCisgICAgICAgICAgICAoZnN1YiAoZm11bCBSMzJGUDokckEsIFIzMkZQOiRyQiksIFIzMkZQOiRyQykpXT47CisKKy8vIEZsb2F0aW5nIE5lZ2F0aXZlIE11bGl0cGx5IGFuZCBTdWJ0cmFjdAorLy8gU3VidHJhY3RzIHByb2R1Y3QgZnJvbSB2YWx1ZSBpbiByQworLy8gcmVzID0gZm5lZyhmbXMgYSBiIGMpCisvLyAgICAgPSAtIChhICogYiAtIGMpCisvLyAgICAgPSBjIC0gYSAqIGIKKy8vIE5PVEU6IHN1YnRyYWN0aW9uIG9yZGVyCisvLyBmc3ViIGEgYiA9IGEgLSBiCisvLyBmcyBhIGIgPSBiIC0gYT8KK2RlZiBGTk1TZjMyIDoKKyAgICBSUlJGb3JtPDBiMTEwMSwgKG91dHMgUjMyRlA6JHJUKSwgKGlucyBSMzJGUDokckEsIFIzMkZQOiRyQiwgUjMyRlA6JHJDKSwKKyAgICAgICJmbm1zXHQkclQsICRyQSwgJHJCLCAkckMiLCBTUHJlY0ZQLAorICAgICAgWyhzZXQgUjMyRlA6JHJULCAoZnN1YiBSMzJGUDokckMsIChmbXVsIFIzMkZQOiRyQSwgUjMyRlA6JHJCKSkpXT47CisKK2RlZiBGTk1TdjRmMzIgOgorICAgIFJSUkZvcm08MGIxMTAxLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAgICJmbm1zXHQkclQsICRyQSwgJHJCLCAkckMiLCBTUHJlY0ZQLAorICAgICAgWyhzZXQgKHY0ZjMyIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgKGZzdWIgKHY0ZjMyIFZFQ1JFRzokckMpLAorICAgICAgICAgICAgICAgICAgKGZtdWwgKHY0ZjMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIFZFQ1JFRzokckIpKSkpXT47CisKKworCisKKy8vIEZsb2F0aW5nIHBvaW50IHJlY2lwcm9jYWwgZXN0aW1hdGUKKworY2xhc3MgRlJFU1RJbnN0PGRhZyBPT0wsIGRhZyBJT0w+OgorICBSUkZvcm1fMTwwYjAwMTEwMTExMDAwLCBPT0wsIElPTCwKKyAgICAgICAgICAgImZyZXN0XHQkclQsICRyQSIsIFNQcmVjRlAsCisgICAgICAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2RlZiBGUkVTVHY0ZjMyIDoKKyAgICBGUkVTVEluc3Q8KG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSk+OworCitkZWYgRlJFU1RmMzIgOgorICAgIEZSRVNUSW5zdDwob3V0cyBSMzJGUDokclQpLCAoaW5zIFIzMkZQOiRyQSk+OworCisvLyBGbG9hdGluZyBwb2ludCBpbnRlcnBvbGF0ZSAodXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHJlY2lwcm9jYWwgZXN0aW1hdGUpCitkZWYgRkl2NGYzMiA6CisgICAgUlJGb3JtPDBiMDAxMDEwMTExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgImZpXHQkclQsICRyQSwgJHJCIiwgU1ByZWNGUCwKKyAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKK2RlZiBGSWYzMiA6CisgICAgUlJGb3JtPDBiMDAxMDEwMTExMTAsIChvdXRzIFIzMkZQOiRyVCksIChpbnMgUjMyRlA6JHJBLCBSMzJGUDokckIpLAorICAgICAgImZpXHQkclQsICRyQSwgJHJCIiwgU1ByZWNGUCwKKyAgICAgIFsvKiBubyBwYXR0ZXJuICovXT47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJhc2ljIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbnM6CisvLworLy8gTm90ZTogVGhlcmUgaXMgbm8gc3VwcG9ydCBvbiBTUFUgZm9yIHNpbmdsZSBwcmVjaXNpb24gTmFOLiBDb25zZXF1ZW50bHksCisvLyBvcmRlcmVkIGFuZCB1bm9yZGVyZWQgY29tcGFyaXNvbnMgYXJlIHRoZSBzYW1lLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgRkNFUWYzMiA6CisgICAgUlJGb3JtPDBiMDEwMDAwMTExMTAsIChvdXRzIFIzMkM6JHJUKSwgKGlucyBSMzJGUDokckEsIFIzMkZQOiRyQiksCisgICAgICAiZmNlcVx0JHJULCAkckEsICRyQiIsIFNQcmVjRlAsCisgICAgICBbKHNldCBSMzJDOiRyVCwgKHNldHVlcSBSMzJGUDokckEsIFIzMkZQOiRyQikpXT47CisKK2RlZiA6IFBhdDwoc2V0b2VxIFIzMkZQOiRyQSwgUjMyRlA6JHJCKSwKKyAgICAgICAgICAoRkNFUWYzMiBSMzJGUDokckEsIFIzMkZQOiRyQik+OworCitkZWYgRkNNRVFmMzIgOgorICAgIFJSRm9ybTwwYjAxMDEwMDExMTEwLCAob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyRlA6JHJBLCBSMzJGUDokckIpLAorICAgICAgImZjbWVxXHQkclQsICRyQSwgJHJCIiwgU1ByZWNGUCwKKyAgICAgIFsoc2V0IFIzMkM6JHJULCAoc2V0dWVxIChmYWJzIFIzMkZQOiRyQSksIChmYWJzIFIzMkZQOiRyQikpKV0+OworCitkZWYgOiBQYXQ8KHNldG9lcSAoZmFicyBSMzJGUDokckEpLCAoZmFicyBSMzJGUDokckIpKSwKKyAgICAgICAgICAoRkNNRVFmMzIgUjMyRlA6JHJBLCBSMzJGUDokckIpPjsKKworZGVmIEZDR1RmMzIgOgorICAgIFJSRm9ybTwwYjAxMDAwMDExMDEwLCAob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyRlA6JHJBLCBSMzJGUDokckIpLAorICAgICAgImZjZ3RcdCRyVCwgJHJBLCAkckIiLCBTUHJlY0ZQLAorICAgICAgWyhzZXQgUjMyQzokclQsIChzZXR1Z3QgUjMyRlA6JHJBLCBSMzJGUDokckIpKV0+OworCitkZWYgOiBQYXQ8KHNldHVndCBSMzJGUDokckEsIFIzMkZQOiRyQiksCisgICAgICAgICAgKEZDR1RmMzIgUjMyRlA6JHJBLCBSMzJGUDokckIpPjsKKworZGVmIEZDTUdUZjMyIDoKKyAgICBSUkZvcm08MGIwMTAxMDAxMTAxMCwgKG91dHMgUjMyQzokclQpLCAoaW5zIFIzMkZQOiRyQSwgUjMyRlA6JHJCKSwKKyAgICAgICJmY21ndFx0JHJULCAkckEsICRyQiIsIFNQcmVjRlAsCisgICAgICBbKHNldCBSMzJDOiRyVCwgKHNldHVndCAoZmFicyBSMzJGUDokckEpLCAoZmFicyBSMzJGUDokckIpKSldPjsKKworZGVmIDogUGF0PChzZXR1Z3QgKGZhYnMgUjMyRlA6JHJBKSwgKGZhYnMgUjMyRlA6JHJCKSksCisgICAgICAgICAgKEZDTUdUZjMyIFIzMkZQOiRyQSwgUjMyRlA6JHJCKT47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbnMgYW5kIFNFVENDIGVxdWl2YWxlbnRzOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgOiBTRVRDQ05lZ0NvbmRSZWc8c2V0dW5lLCBSMzJGUCwgaTMyLCBYT1JJcjMyLCBGQ0VRZjMyPjsKK2RlZiA6IFNFVENDTmVnQ29uZFJlZzxzZXRvbmUsIFIzMkZQLCBpMzIsIFhPUklyMzIsIEZDRVFmMzI+OworCitkZWYgOiBTRVRDQ0Jpbk9wUmVnPHNldHVnZSwgUjMyRlAsIE9ScjMyLCBGQ0dUZjMyLCBGQ0VRZjMyPjsKK2RlZiA6IFNFVENDQmluT3BSZWc8c2V0b2dlLCBSMzJGUCwgT1JyMzIsIEZDR1RmMzIsIEZDRVFmMzI+OworCitkZWYgOiBTRVRDQ0Jpbk9wUmVnPHNldHVsdCwgUjMyRlAsIE5PUnIzMiwgRkNHVGYzMiwgRkNFUWYzMj47CitkZWYgOiBTRVRDQ0Jpbk9wUmVnPHNldG9sdCwgUjMyRlAsIE5PUnIzMiwgRkNHVGYzMiwgRkNFUWYzMj47CisKK2RlZiA6IFBhdDwoc2V0dWxlIFIzMkZQOiRyQSwgUjMyRlA6JHJCKSwKKyAgICAgICAgICAoWE9SSXIzMiAoRkNHVGYzMiBSMzJGUDokckEsIFIzMkZQOiRyQiksIDB4ZmZmZmZmZmYpPjsKK2RlZiA6IFBhdDwoc2V0b2xlIFIzMkZQOiRyQSwgUjMyRlA6JHJCKSwKKyAgICAgICAgICAoWE9SSXIzMiAoRkNHVGYzMiBSMzJGUDokckEsIFIzMkZQOiRyQiksIDB4ZmZmZmZmZmYpPjsKKworLy8gRlAgU3RhdHVzIGFuZCBDb250cm9sIFJlZ2lzdGVyIFdyaXRlCisvLyBXaHkgaXNuJ3QgclQgYSBkb24ndCBjYXJlIGluIHRoZSBJU0E/CisvLyBTaG91bGQgd2UgY3JlYXRlIGEgc3BlY2lhbCBSUkZvcm1fMyBmb3IgdGhpcyBndXkgYW5kIHplcm8gb3V0IHRoZSByVD8KK2RlZiBGU0NSV2YzMiA6CisgICAgUlJGb3JtXzE8MGIwMTAxMTEwMTExMCwgKG91dHMgUjMyRlA6JHJUKSwgKGlucyBSMzJGUDokckEpLAorICAgICAgImZzY3J3clx0JHJBIiwgU1ByZWNGUCwKKyAgICAgIFsvKiBUaGlzIGluc3RydWN0aW9uIHJlcXVpcmVzIGFuIGludHJpbnNpYy4gTm90ZTogclQgaXMgdW51c2VkLiAqL10+OworCisvLyBGUCBTdGF0dXMgYW5kIENvbnRyb2wgUmVnaXN0ZXIgUmVhZAorZGVmIEZTQ1JSZjMyIDoKKyAgICBSUkZvcm1fMjwwYjAxMDExMTAxMTEwLCAob3V0cyBSMzJGUDokclQpLCAoaW5zKSwKKyAgICAgICJmc2NycmRcdCRyVCIsIFNQcmVjRlAsCisgICAgICBbLyogVGhpcyBpbnN0cnVjdGlvbiByZXF1aXJlcyBhbiBpbnRyaW5zaWMgKi9dPjsKKworLy8gbGx2bSBpbnN0cnVjdGlvbiBzcGFjZQorLy8gSG93IGRvIHRoZXNlIG1hcCBvbnRvIGNlbGwgaW5zdHJ1Y3Rpb25zPworLy8gZmRpdiByQSByQgorLy8gICBmcmVzdCByQyByQiAgICAgICAgIyBjID0gMS9iIChib3RoIGxpbmVzKQorLy8gICBmaSByQyByQiByQworLy8gICBmbSByRCByQSByQyAgICAgICAgIyBkID0gYSAqIDEvYgorLy8gICBmbm1zIHJCIHJEIHJCIHJBICMgYiA9IC0gKGQgKiBiIC0gYSkgLS1zaG91bGQgPT0gMCBpbiBhIHBlcmZlY3Qgd29ybGQKKy8vICAgZm1hIHJCIHJCIHJDIHJEICAgICAgICAgICAgIyBiID0gYiAqIGMgKyBkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLShkICpiIC1hKSAqIGMgKyBkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYSAqIGMgLSBjICggYSAqYiAqYyAtIGEpCisKKy8vIGZjb3B5c2lnbiAoPz8/KQorCisvLyBMaWJyYXJ5IGNhbGxzOgorLy8gVGhlc2UgbGx2bSBpbnN0cnVjdGlvbnMgd2lsbCBhY3R1YWxseSBtYXAgdG8gbGlicmFyeSBjYWxscy4KKy8vIEFsbCB0aGF0J3MgbmVlZGVkLCB0aGVuLCBpcyB0byBjaGVjayB0aGF0IHRoZSBhcHByb3ByaWF0ZSBsaWJyYXJ5IGlzCisvLyBpbXBvcnRlZCBhbmQgZG8gYSBicnNsIHRvIHRoZSBwcm9wZXIgZnVuY3Rpb24gbmFtZS4KKy8vIGZyZW0gIyBmbW9kKHgsIHkpOiB4IC0gKHgveSkgKiB5CisvLyAoTm90ZTogZm1vZChkb3VibGUsIGRvdWJsZSksIGZtb2RmKGZsb2F0LGZsb2F0KQorLy8gZnNxcnQ/CisvLyBmc2luPworLy8gZmNvcz8KKy8vIFVuaW1wbGVtZW50ZWQgU1BVIGluc3RydWN0aW9uIHNwYWNlCisvLyBmbG9hdGluZyByZWNpcHJvY2FsIGFic29sdXRlIHNxdWFyZSByb290IGVzdGltYXRlIChmcnNxZXN0KQorCisvLyBUaGUgZm9sbG93aW5nIGFyZSBwcm9iYWJseSBqdXN0IGludHJpbnNpY3MKKy8vIHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlciB3cml0ZQorLy8gc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVyIHJlYWQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmxvYXRpbmcgUG9pbnQgQ29udmVyc2lvbnMKKy8vIFNpZ25lZCBjb252ZXJzaW9uczoKK2RlZiBDU2lGdjRmMzI6CisgICAgQ1ZUSW50RlBGb3JtPDBiMDEwMTEwMTExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSksCisgICAgICAiY3NmbHRcdCRyVCwgJHJBLCAwIiwgU1ByZWNGUCwKKyAgICAgIFsoc2V0ICh2NGYzMiBWRUNSRUc6JHJUKSwgKHNpbnRfdG9fZnAgKHY0aTMyIFZFQ1JFRzokckEpKSldPjsKKworLy8gQ29udmVydCBzaWduZWQgaW50ZWdlciB0byBmbG9hdGluZyBwb2ludAorZGVmIENTaUZmMzIgOgorICAgIENWVEludEZQRm9ybTwwYjAxMDExMDExMTAsIChvdXRzIFIzMkZQOiRyVCksIChpbnMgUjMyQzokckEpLAorICAgICAgImNzZmx0XHQkclQsICRyQSwgMCIsIFNQcmVjRlAsCisgICAgICBbKHNldCBSMzJGUDokclQsIChzaW50X3RvX2ZwIFIzMkM6JHJBKSldPjsKKworLy8gQ29udmVydCB1bnNpZ25lZCBpbnRvIHRvIGZsb2F0CitkZWYgQ1VpRnY0ZjMyIDoKKyAgICBDVlRJbnRGUEZvcm08MGIxMTAxMTAxMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBKSwKKyAgICAgICJjdWZsdFx0JHJULCAkckEsIDAiLCBTUHJlY0ZQLAorICAgICAgWyhzZXQgKHY0ZjMyIFZFQ1JFRzokclQpLCAodWludF90b19mcCAodjRpMzIgVkVDUkVHOiRyQSkpKV0+OworCitkZWYgQ1VpRmYzMiA6CisgICAgQ1ZUSW50RlBGb3JtPDBiMTEwMTEwMTExMCwgKG91dHMgUjMyRlA6JHJUKSwgKGlucyBSMzJDOiRyQSksCisgICAgICAiY3VmbHRcdCRyVCwgJHJBLCAwIiwgU1ByZWNGUCwKKyAgICAgIFsoc2V0IFIzMkZQOiRyVCwgKHVpbnRfdG9fZnAgUjMyQzokckEpKV0+OworCisvLyBDb252ZXJ0IGZsb2F0IHRvIHVuc2lnbmVkIGludAorLy8gQXNzdW1lIHRoYXQgc2NhbGUgPSAwCisKK2RlZiBDRlVpdjRmMzIgOgorICAgIENWVEludEZQRm9ybTwwYjExMDExMDExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEpLAorICAgICAgImNmbHR1XHQkclQsICRyQSwgMCIsIFNQcmVjRlAsCisgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksIChmcF90b191aW50ICh2NGYzMiBWRUNSRUc6JHJBKSkpXT47CisKK2RlZiBDRlVpZjMyIDoKKyAgICBDVlRJbnRGUEZvcm08MGIxMTAxMTAxMTEwLCAob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyRlA6JHJBKSwKKyAgICAgICJjZmx0dVx0JHJULCAkckEsIDAiLCBTUHJlY0ZQLAorICAgICAgWyhzZXQgUjMyQzokclQsIChmcF90b191aW50IFIzMkZQOiRyQSkpXT47CisKKy8vIENvbnZlcnQgZmxvYXQgdG8gc2lnbmVkIGludAorLy8gQXNzdW1lIHRoYXQgc2NhbGUgPSAwCisKK2RlZiBDRlNpdjRmMzIgOgorICAgIENWVEludEZQRm9ybTwwYjExMDExMDExMTAsIChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEpLAorICAgICAgImNmbHRzXHQkclQsICRyQSwgMCIsIFNQcmVjRlAsCisgICAgICBbKHNldCAodjRpMzIgVkVDUkVHOiRyVCksIChmcF90b19zaW50ICh2NGYzMiBWRUNSRUc6JHJBKSkpXT47CisKK2RlZiBDRlNpZjMyIDoKKyAgICBDVlRJbnRGUEZvcm08MGIxMTAxMTAxMTEwLCAob3V0cyBSMzJDOiRyVCksIChpbnMgUjMyRlA6JHJBKSwKKyAgICAgICJjZmx0c1x0JHJULCAkckEsIDAiLCBTUHJlY0ZQLAorICAgICAgWyhzZXQgUjMyQzokclQsIChmcF90b19zaW50IFIzMkZQOiRyQSkpXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KKy8vIFNpbmdsZTwtPkRvdWJsZSBwcmVjaXNpb24gY29udmVyc2lvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KKworLy8gTk9URTogV2UgdXNlICJ2ZWMiIG5hbWUgc3VmZml4IGhlcmUgdG8gYXZvaWQgY29uZnVzaW9uIChlLmcuIGlucHV0IGlzIGEKKy8vIHY0ZjMyLCBvdXRwdXQgaXMgdjJmNjQtLXdoaWNoIGdvZXMgaW4gdGhlIG5hbWU/KQorCisvLyBGbG9hdGluZyBwb2ludCBleHRlbmQgc2luZ2xlIHRvIGRvdWJsZQorLy8gTk9URTogTm90IHN1cmUgaWYgcGFzc2luZyBpbiB2NGYzMiB0byBGRVNEdmVjIGlzIGNvcnJlY3Qgc2luY2UgaXQKKy8vIG9wZXJhdGVzIG9uIHR3byBkb3VibGUtd29yZCBzbG90cyAoaS5lLiAxc3QgYW5kIDNyZCBmcCBudW1iZXJzCisvLyBhcmUgaWdub3JlZCkuCitkZWYgRkVTRHZlYyA6CisgICAgUlJGb3JtXzE8MGIwMDAxMTEwMTExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSksCisgICAgICAiZmVzZFx0JHJULCAkckEiLCBTUHJlY0ZQLAorICAgICAgWy8qKHNldCAodjJmNjQgVkVDUkVHOiRyVCksIChmZXh0ZW5kICh2NGYzMiBWRUNSRUc6JHJBKSkpKi9dPjsKKworZGVmIEZFU0RmMzIgOgorICAgIFJSRm9ybV8xPDBiMDAwMTExMDExMTAsIChvdXRzIFI2NEZQOiRyVCksIChpbnMgUjMyRlA6JHJBKSwKKyAgICAgICJmZXNkXHQkclQsICRyQSIsIFNQcmVjRlAsCisgICAgICBbKHNldCBSNjRGUDokclQsIChmZXh0ZW5kIFIzMkZQOiRyQSkpXT47CisKKy8vIEZsb2F0aW5nIHBvaW50IHJvdW5kIGRvdWJsZSB0byBzaW5nbGUKKy8vZGVmIEZSRFN2ZWMgOgorLy8gICAgUlJGb3JtXzE8MGIxMDAxMTEwMTExMCwgKG91dHMgVkVDUkVHOiRyVCksIChpbnMgVkVDUkVHOiRyQSksCisvLyAgICAgICJmcmRzXHQkclQsICRyQSwiLCBTUHJlY0ZQLAorLy8gICAgICBbKHNldCAodjRmMzIgUjMyRlA6JHJUKSwgKGZyb3VuZCAodjJmNjQgUjY0RlA6JHJBKSkpXT47CisKK2RlZiBGUkRTZjY0IDoKKyAgICBSUkZvcm1fMTwwYjEwMDExMTAxMTEwLCAob3V0cyBSMzJGUDokclQpLCAoaW5zIFI2NEZQOiRyQSksCisgICAgICAiZnJkc1x0JHJULCAkckEiLCBTUHJlY0ZQLAorICAgICAgWyhzZXQgUjMyRlA6JHJULCAoZnJvdW5kIFI2NEZQOiRyQSkpXT47CisKKy8vVG9EbyBpbmNsdWRlIGFueWV4dGVuZD8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT0vLworLy8gRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KK2RlZiBGQWY2NCA6CisgICAgUlJGb3JtPDBiMDAxMTAwMTEwMTAsIChvdXRzIFI2NEZQOiRyVCksIChpbnMgUjY0RlA6JHJBLCBSNjRGUDokckIpLAorICAgICAgImRmYVx0JHJULCAkckEsICRyQiIsIERQcmVjRlAsCisgICAgICBbKHNldCBSNjRGUDokclQsIChmYWRkIFI2NEZQOiRyQSwgUjY0RlA6JHJCKSldPjsKKworZGVmIEZBdjJmNjQgOgorICAgIFJSRm9ybTwwYjAwMTEwMDExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICJkZmFcdCRyVCwgJHJBLCAkckIiLCBEUHJlY0ZQLAorICAgICAgWyhzZXQgKHYyZjY0IFZFQ1JFRzokclQpLCAoZmFkZCAodjJmNjQgVkVDUkVHOiRyQSksICh2MmY2NCBWRUNSRUc6JHJCKSkpXT47CisKK2RlZiBGU2Y2NCA6CisgICAgUlJGb3JtPDBiMTAxMDAwMTEwMTAsIChvdXRzIFI2NEZQOiRyVCksIChpbnMgUjY0RlA6JHJBLCBSNjRGUDokckIpLAorICAgICAgImRmc1x0JHJULCAkckEsICRyQiIsIERQcmVjRlAsCisgICAgICBbKHNldCBSNjRGUDokclQsIChmc3ViIFI2NEZQOiRyQSwgUjY0RlA6JHJCKSldPjsKKworZGVmIEZTdjJmNjQgOgorICAgIFJSRm9ybTwwYjEwMTAwMDExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICJkZnNcdCRyVCwgJHJBLCAkckIiLCBEUHJlY0ZQLAorICAgICAgWyhzZXQgKHYyZjY0IFZFQ1JFRzokclQpLAorICAgICAgICAgICAgKGZzdWIgKHYyZjY0IFZFQ1JFRzokckEpLCAodjJmNjQgVkVDUkVHOiRyQikpKV0+OworCitkZWYgRk1mNjQgOgorICAgIFJSRm9ybTwwYjAxMTAwMDExMDEwLCAob3V0cyBSNjRGUDokclQpLCAoaW5zIFI2NEZQOiRyQSwgUjY0RlA6JHJCKSwKKyAgICAgICJkZm1cdCRyVCwgJHJBLCAkckIiLCBEUHJlY0ZQLAorICAgICAgWyhzZXQgUjY0RlA6JHJULCAoZm11bCBSNjRGUDokckEsIFI2NEZQOiRyQikpXT47CisKK2RlZiBGTXYyZjY0OgorICAgIFJSRm9ybTwwYjAwMTAwMDExMDEwLCAob3V0cyBWRUNSRUc6JHJUKSwgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSwKKyAgICAgICJkZm1cdCRyVCwgJHJBLCAkckIiLCBEUHJlY0ZQLAorICAgICAgWyhzZXQgKHYyZjY0IFZFQ1JFRzokclQpLAorICAgICAgICAgICAgKGZtdWwgKHYyZjY0IFZFQ1JFRzokckEpLCAodjJmNjQgVkVDUkVHOiRyQikpKV0+OworCitkZWYgRk1BZjY0OgorICAgIFJSRm9ybTwwYjAwMTExMDEwMTEwLCAob3V0cyBSNjRGUDokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIFI2NEZQOiRyQSwgUjY0RlA6JHJCLCBSNjRGUDokckMpLAorICAgICAgImRmbWFcdCRyVCwgJHJBLCAkckIiLCBEUHJlY0ZQLAorICAgICAgWyhzZXQgUjY0RlA6JHJULCAoZmFkZCBSNjRGUDokckMsIChmbXVsIFI2NEZQOiRyQSwgUjY0RlA6JHJCKSkpXT4sCisgICAgUmVnQ29uc3RyYWludDwiJHJDID0gJHJUIj4sCisgICAgTm9FbmNvZGU8IiRyQyI+OworCitkZWYgRk1BdjJmNjQ6CisgICAgUlJGb3JtPDBiMDAxMTEwMTAxMTAsIChvdXRzIFZFQ1JFRzokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIsIFZFQ1JFRzokckMpLAorICAgICAgImRmbWFcdCRyVCwgJHJBLCAkckIiLCBEUHJlY0ZQLAorICAgICAgWyhzZXQgKHYyZjY0IFZFQ1JFRzokclQpLAorICAgICAgICAgICAgKGZhZGQgKHYyZjY0IFZFQ1JFRzokckMpLAorICAgICAgICAgICAgICAgICAgKGZtdWwgKHYyZjY0IFZFQ1JFRzokckEpLCAodjJmNjQgVkVDUkVHOiRyQikpKSldPiwKKyAgICBSZWdDb25zdHJhaW50PCIkckMgPSAkclQiPiwKKyAgICBOb0VuY29kZTwiJHJDIj47CisKK2RlZiBGTVNmNjQgOgorICAgIFJSRm9ybTwwYjEwMTExMDEwMTEwLCAob3V0cyBSNjRGUDokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIFI2NEZQOiRyQSwgUjY0RlA6JHJCLCBSNjRGUDokckMpLAorICAgICAgImRmbXNcdCRyVCwgJHJBLCAkckIiLCBEUHJlY0ZQLAorICAgICAgWyhzZXQgUjY0RlA6JHJULCAoZnN1YiAoZm11bCBSNjRGUDokckEsIFI2NEZQOiRyQiksIFI2NEZQOiRyQykpXT4sCisgICAgUmVnQ29uc3RyYWludDwiJHJDID0gJHJUIj4sCisgICAgTm9FbmNvZGU8IiRyQyI+OworCitkZWYgRk1TdjJmNjQgOgorICAgIFJSRm9ybTwwYjEwMTExMDEwMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAgICJkZm1zXHQkclQsICRyQSwgJHJCIiwgRFByZWNGUCwKKyAgICAgIFsoc2V0ICh2MmY2NCBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgIChmc3ViIChmbXVsICh2MmY2NCBWRUNSRUc6JHJBKSwgKHYyZjY0IFZFQ1JFRzokckIpKSwKKyAgICAgICAgICAgICAgICAgICh2MmY2NCBWRUNSRUc6JHJDKSkpXT47CisKKy8vIERGTk1TOiAtIChhICogYiAtIGMpCisvLyAtIChhICogYikgKyBjID0+IGMgLSAoYSAqIGIpCisKK2NsYXNzIERGTk1TSW5zdDxkYWcgT09MLCBkYWcgSU9MLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgUlJGb3JtPDBiMDExMTEwMTAxMTAsIE9PTCwgSU9MLCAiZGZubXNcdCRyVCwgJHJBLCAkckIiLAorICAgICAgICAgICBEUHJlY0ZQLCBwYXR0ZXJuPiwKKyAgICBSZWdDb25zdHJhaW50PCIkckMgPSAkclQiPiwKKyAgICBOb0VuY29kZTwiJHJDIj47CisKK2NsYXNzIERGTk1TVmVjSW5zdDxsaXN0PGRhZz4gcGF0dGVybj46CisgICAgREZOTVNJbnN0PChvdXRzIFZFQ1JFRzokclQpLCAoaW5zIFZFQ1JFRzokckEsIFZFQ1JFRzokckIsIFZFQ1JFRzokckMpLAorICAgICAgICAgICAgICBwYXR0ZXJuPjsKKworY2xhc3MgREZOTVNSZWdJbnN0PGxpc3Q8ZGFnPiBwYXR0ZXJuPjoKKyAgICBERk5NU0luc3Q8KG91dHMgUjY0RlA6JHJUKSwgKGlucyBSNjRGUDokckEsIFI2NEZQOiRyQiwgUjY0RlA6JHJDKSwKKyAgICAgICAgICAgICBwYXR0ZXJuPjsKKworbXVsdGljbGFzcyBERk11bHRpcGx5U3VidHJhY3QKK3sKKyAgZGVmIHYyZjY0IDogREZOTVNWZWNJbnN0PFsoc2V0ICh2MmY2NCBWRUNSRUc6JHJUKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnN1YiAodjJmNjQgVkVDUkVHOiRyQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm11bCAodjJmNjQgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJmNjQgVkVDUkVHOiRyQikpKSldPjsKKworICBkZWYgZjY0IDogREZOTVNSZWdJbnN0PFsoc2V0IFI2NEZQOiRyVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnN1YiBSNjRGUDokckMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZtdWwgUjY0RlA6JHJBLCBSNjRGUDokckIpKSldPjsKK30KKworZGVmbSBERk5NUyA6IERGTXVsdGlwbHlTdWJ0cmFjdDsKKworLy8gLSAoYSAqIGIgKyBjKQorLy8gLSAoYSAqIGIpIC0gYworZGVmIEZOTUFmNjQgOgorICAgIFJSRm9ybTwwYjExMTExMDEwMTEwLCAob3V0cyBSNjRGUDokclQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIFI2NEZQOiRyQSwgUjY0RlA6JHJCLCBSNjRGUDokckMpLAorICAgICAgImRmbm1hXHQkclQsICRyQSwgJHJCIiwgRFByZWNGUCwKKyAgICAgIFsoc2V0IFI2NEZQOiRyVCwgKGZuZWcgKGZhZGQgUjY0RlA6JHJDLCAoZm11bCBSNjRGUDokckEsIFI2NEZQOiRyQikpKSldPiwKKyAgICBSZWdDb25zdHJhaW50PCIkckMgPSAkclQiPiwKKyAgICBOb0VuY29kZTwiJHJDIj47CisKK2RlZiBGTk1BdjJmNjQgOgorICAgIFJSRm9ybTwwYjExMTExMDEwMTEwLCAob3V0cyBWRUNSRUc6JHJUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCLCBWRUNSRUc6JHJDKSwKKyAgICAgICJkZm5tYVx0JHJULCAkckEsICRyQiIsIERQcmVjRlAsCisgICAgICBbKHNldCAodjJmNjQgVkVDUkVHOiRyVCksCisgICAgICAgICAgICAoZm5lZyAoZmFkZCAodjJmNjQgVkVDUkVHOiRyQyksCisgICAgICAgICAgICAgICAgICAgICAgICAoZm11bCAodjJmNjQgVkVDUkVHOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJmNjQgVkVDUkVHOiRyQikpKSkpXT4sCisgICAgUmVnQ29uc3RyYWludDwiJHJDID0gJHJUIj4sCisgICAgTm9FbmNvZGU8IiRyQyI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisvLyBGbG9hdGluZyBwb2ludCBuZWdhdGlvbiBhbmQgYWJzb2x1dGUgdmFsdWUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KKworZGVmIDogUGF0PChmbmVnICh2NGYzMiBWRUNSRUc6JHJBKSksCisgICAgICAgICAgKFhPUmZuZWd2ZWMgKHY0ZjMyIFZFQ1JFRzokckEpLAorICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiAoSUxIVXY0aTMyIDB4ODAwMCkpKT47CisKK2RlZiA6IFBhdDwoZm5lZyBSMzJGUDokckEpLAorICAgICAgICAgIChYT1JmbmVnMzIgUjMyRlA6JHJBLCAoSUxIVXIzMiAweDgwMDApKT47CisKKy8vIEZsb2F0aW5nIHBvaW50IGFic29sdXRlIHZhbHVlCisvLyBOb3RlOiBmNjQgZmFicyBpcyBjdXN0b20tc2VsZWN0ZWQuCisKK2RlZiA6IFBhdDwoZmFicyBSMzJGUDokckEpLAorICAgICAgICAgIChBTkRmYWJzMzIgUjMyRlA6JHJBLCAoSU9ITHIzMiAoSUxIVXIzMiAweDdmZmYpLCAweGZmZmYpKT47CisKK2RlZiA6IFBhdDwoZmFicyAodjRmMzIgVkVDUkVHOiRyQSkpLAorICAgICAgICAgIChBTkRmYWJzdmVjICh2NGYzMiBWRUNSRUc6JHJBKSwKKyAgICAgICAgICAgICAgICAgICAgICAoSU9ITHY0aTMyIChJTEhVdjRpMzIgMHg3ZmZmKSwgMHhmZmZmKSk+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSGludCBmb3IgYnJhbmNoIGluc3RydWN0aW9uczoKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8qIGRlZiBIQlIgOiBTUFVJbnN0cjwob3V0cyksIChpbnMpLCAiaGJyXHQiICovCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBFeGVjdXRpb24sIExvYWQgTk9QIChleGVjdXRlIE5PUHMgYmVsb25nIGluIGV2ZW4gcGlwZWxpbmUsIGxvYWQgTk9QcyBiZWxvbmcKKy8vIGluIHRoZSBvZGQgcGlwZWxpbmUpCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgRU5PUCA6IFNQVUluc3RyPChvdXRzKSwgKGlucyksICJlbm9wIiwgRXhlY05PUD4geworICBsZXQgUGF0dGVybiA9IFtdOworCisgIGxldCBJbnN0ezAtMTB9ID0gMGIxMDAwMDAwMDAxMDsKKyAgbGV0IEluc3R7MTEtMTd9ID0gMDsKKyAgbGV0IEluc3R7MTgtMjR9ID0gMDsKKyAgbGV0IEluc3R7MjUtMzF9ID0gMDsKK30KKworZGVmIExOT1AgOiBTUFVJbnN0cjwob3V0cyksIChpbnMpLCAibG5vcCIsIExvYWROT1A+IHsKKyAgbGV0IFBhdHRlcm4gPSBbXTsKKworICBsZXQgSW5zdHswLTEwfSA9IDBiMTAwMDAwMDAwMDA7CisgIGxldCBJbnN0ezExLTE3fSA9IDA7CisgIGxldCBJbnN0ezE4LTI0fSA9IDA7CisgIGxldCBJbnN0ezI1LTMxfSA9IDA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCaXQgY29udmVyc2lvbnMgKHR5cGUgY29udmVyc2lvbnMgYmV0d2VlbiB2ZWN0b3IvcGFja2VkIHR5cGVzKQorLy8gTk9URTogUHJvbW90aW9ucyBhcmUgaGFuZGxlZCB1c2luZyB0aGUgWFMqIGluc3RydWN0aW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgOiBQYXQ8KHYxNmk4IChiaXRjb252ZXJ0ICh2OGkxNiBWRUNSRUc6JHNyYykpKSwgKHYxNmk4IFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KHYxNmk4IChiaXRjb252ZXJ0ICh2NGkzMiBWRUNSRUc6JHNyYykpKSwgKHYxNmk4IFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KHYxNmk4IChiaXRjb252ZXJ0ICh2Mmk2NCBWRUNSRUc6JHNyYykpKSwgKHYxNmk4IFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KHYxNmk4IChiaXRjb252ZXJ0ICh2NGYzMiBWRUNSRUc6JHNyYykpKSwgKHYxNmk4IFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KHYxNmk4IChiaXRjb252ZXJ0ICh2MmY2NCBWRUNSRUc6JHNyYykpKSwgKHYxNmk4IFZFQ1JFRzokc3JjKT47CisKK2RlZiA6IFBhdDwodjhpMTYgKGJpdGNvbnZlcnQgKHYxNmk4IFZFQ1JFRzokc3JjKSkpLCAodjhpMTYgVkVDUkVHOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpMTYgKGJpdGNvbnZlcnQgKHY0aTMyIFZFQ1JFRzokc3JjKSkpLCAodjhpMTYgVkVDUkVHOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpMTYgKGJpdGNvbnZlcnQgKHYyaTY0IFZFQ1JFRzokc3JjKSkpLCAodjhpMTYgVkVDUkVHOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpMTYgKGJpdGNvbnZlcnQgKHY0ZjMyIFZFQ1JFRzokc3JjKSkpLCAodjhpMTYgVkVDUkVHOiRzcmMpPjsKK2RlZiA6IFBhdDwodjhpMTYgKGJpdGNvbnZlcnQgKHYyZjY0IFZFQ1JFRzokc3JjKSkpLCAodjhpMTYgVkVDUkVHOiRzcmMpPjsKKworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjE2aTggVkVDUkVHOiRzcmMpKSksICh2NGkzMiBWRUNSRUc6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjhpMTYgVkVDUkVHOiRzcmMpKSksICh2NGkzMiBWRUNSRUc6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjJpNjQgVkVDUkVHOiRzcmMpKSksICh2NGkzMiBWRUNSRUc6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjRmMzIgVkVDUkVHOiRzcmMpKSksICh2NGkzMiBWRUNSRUc6JHNyYyk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjJmNjQgVkVDUkVHOiRzcmMpKSksICh2NGkzMiBWRUNSRUc6JHNyYyk+OworCitkZWYgOiBQYXQ8KHYyaTY0IChiaXRjb252ZXJ0ICh2MTZpOCBWRUNSRUc6JHNyYykpKSwgKHYyaTY0IFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KHYyaTY0IChiaXRjb252ZXJ0ICh2OGkxNiBWRUNSRUc6JHNyYykpKSwgKHYyaTY0IFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KHYyaTY0IChiaXRjb252ZXJ0ICh2NGkzMiBWRUNSRUc6JHNyYykpKSwgKHYyaTY0IFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KHYyaTY0IChiaXRjb252ZXJ0ICh2NGYzMiBWRUNSRUc6JHNyYykpKSwgKHYyaTY0IFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KHYyaTY0IChiaXRjb252ZXJ0ICh2MmY2NCBWRUNSRUc6JHNyYykpKSwgKHYyaTY0IFZFQ1JFRzokc3JjKT47CisKK2RlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHYxNmk4IFZFQ1JFRzokc3JjKSkpLCAodjRmMzIgVkVDUkVHOiRzcmMpPjsKK2RlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHY4aTE2IFZFQ1JFRzokc3JjKSkpLCAodjRmMzIgVkVDUkVHOiRzcmMpPjsKK2RlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHYyaTY0IFZFQ1JFRzokc3JjKSkpLCAodjRmMzIgVkVDUkVHOiRzcmMpPjsKK2RlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHY0aTMyIFZFQ1JFRzokc3JjKSkpLCAodjRmMzIgVkVDUkVHOiRzcmMpPjsKK2RlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHYyZjY0IFZFQ1JFRzokc3JjKSkpLCAodjRmMzIgVkVDUkVHOiRzcmMpPjsKKworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjE2aTggVkVDUkVHOiRzcmMpKSksICh2MmY2NCBWRUNSRUc6JHNyYyk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjhpMTYgVkVDUkVHOiRzcmMpKSksICh2MmY2NCBWRUNSRUc6JHNyYyk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjRpMzIgVkVDUkVHOiRzcmMpKSksICh2MmY2NCBWRUNSRUc6JHNyYyk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjJpNjQgVkVDUkVHOiRzcmMpKSksICh2MmY2NCBWRUNSRUc6JHNyYyk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjRmMzIgVkVDUkVHOiRzcmMpKSksICh2MmY2NCBWRUNSRUc6JHNyYyk+OworCitkZWYgOiBQYXQ8KGkxMjggKGJpdGNvbnZlcnQgKHYxNmk4IFZFQ1JFRzokc3JjKSkpLAorICAgICAgICAgIChPUmkxMjhfdmVjIFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KGkxMjggKGJpdGNvbnZlcnQgKHY4aTE2IFZFQ1JFRzokc3JjKSkpLAorICAgICAgICAgIChPUmkxMjhfdmVjIFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KGkxMjggKGJpdGNvbnZlcnQgKHY0aTMyIFZFQ1JFRzokc3JjKSkpLAorICAgICAgICAgIChPUmkxMjhfdmVjIFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KGkxMjggKGJpdGNvbnZlcnQgKHYyaTY0IFZFQ1JFRzokc3JjKSkpLAorICAgICAgICAgIChPUmkxMjhfdmVjIFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KGkxMjggKGJpdGNvbnZlcnQgKHY0ZjMyIFZFQ1JFRzokc3JjKSkpLAorICAgICAgICAgIChPUmkxMjhfdmVjIFZFQ1JFRzokc3JjKT47CitkZWYgOiBQYXQ8KGkxMjggKGJpdGNvbnZlcnQgKHYyZjY0IFZFQ1JFRzokc3JjKSkpLAorICAgICAgICAgIChPUmkxMjhfdmVjIFZFQ1JFRzokc3JjKT47CisKK2RlZiA6IFBhdDwodjE2aTggKGJpdGNvbnZlcnQgKGkxMjggR1BSQzokc3JjKSkpLAorICAgICAgICAgICh2MTZpOCAoT1J2ZWNfaTEyOCBHUFJDOiRzcmMpKT47CitkZWYgOiBQYXQ8KHY4aTE2IChiaXRjb252ZXJ0IChpMTI4IEdQUkM6JHNyYykpKSwKKyAgICAgICAgICAodjhpMTYgKE9SdmVjX2kxMjggR1BSQzokc3JjKSk+OworZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAoaTEyOCBHUFJDOiRzcmMpKSksCisgICAgICAgICAgKHY0aTMyIChPUnZlY19pMTI4IEdQUkM6JHNyYykpPjsKK2RlZiA6IFBhdDwodjJpNjQgKGJpdGNvbnZlcnQgKGkxMjggR1BSQzokc3JjKSkpLAorICAgICAgICAgICh2Mmk2NCAoT1J2ZWNfaTEyOCBHUFJDOiRzcmMpKT47CitkZWYgOiBQYXQ8KHY0ZjMyIChiaXRjb252ZXJ0IChpMTI4IEdQUkM6JHNyYykpKSwKKyAgICAgICAgICAodjRmMzIgKE9SdmVjX2kxMjggR1BSQzokc3JjKSk+OworZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAoaTEyOCBHUFJDOiRzcmMpKSksCisgICAgICAgICAgKHYyZjY0IChPUnZlY19pMTI4IEdQUkM6JHNyYykpPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIHBhdHRlcm5zOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gR2VuZXJhbCAzMi1iaXQgY29uc3RhbnRzOgorZGVmIDogUGF0PChpMzIgaW1tOiRpbW0pLAorICAgICAgICAgIChJT0hMcjMyIChJTEhVcjMyIChISTE2IGltbTokaW1tKSksIChMTzE2IGltbTokaW1tKSk+OworCisvLyBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0IGNvbnN0YW50czoKK2RlZiA6IFBhdDwoZjMyIGZwaW1tOiRpbW0pLAorICAgICAgICAgIChJT0hMZjMyIChJTEhVZjMyIChISTE2X2YzMiBmcGltbTokaW1tKSksIChMTzE2X2YzMiBmcGltbTokaW1tKSk+OworCisvLyBHZW5lcmFsIGNvbnN0YW50IDMyLWJpdCB2ZWN0b3JzCitkZWYgOiBQYXQ8KHY0aTMyIHY0aTMySW1tOiRpbW0pLAorICAgICAgICAgIChJT0hMdjRpMzIgKHY0aTMyIChJTEhVdjRpMzIgKEhJMTZfdmVjIHY0aTMySW1tOiRpbW0pKSksCisgICAgICAgICAgICAgICAgICAgICAoTE8xNl92ZWMgdjRpMzJJbW06JGltbSkpPjsKKworLy8gOC1iaXQgY29uc3RhbnRzCitkZWYgOiBQYXQ8KGk4IGltbTokaW1tKSwKKyAgICAgICAgICAoSUxIcjggaW1tOiRpbW0pPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFplcm8vQW55L1NpZ24gZXh0ZW5zaW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gc2V4dCA4LT4zMjogU2lnbiBleHRlbmQgYnl0ZXMgdG8gd29yZHMKK2RlZiA6IFBhdDwoc2V4dF9pbnJlZyBSMzJDOiRyU3JjLCBpOCksCisgICAgICAgICAgKFhTSFdyMzIgKFhTQkhyMzIgUjMyQzokclNyYykpPjsKKworZGVmIDogUGF0PChpMzIgKHNleHQgUjhDOiRyU3JjKSksCisgICAgICAgICAgKFhTSFdyMTYgKFhTQkhyOCBSOEM6JHJTcmMpKT47CisKKy8vIHNleHQgOC0+NjQ6IFNpZ24gZXh0ZW5kIGJ5dGVzIHRvIGRvdWJsZSB3b3JkCitkZWYgOiBQYXQ8KHNleHRfaW5yZWcgUjY0QzokclNyYywgaTgpLAorICAgICAgICAgIChYU1dEcjY0X2lucmVnIChYU0hXcjY0IChYU0JIcjY0IFI2NEM6JHJTcmMpKSk+OworICAgICAgICAgIAorZGVmIDogUGF0PChpNjQgKHNleHQgUjhDOiRyU3JjKSksCisgICAgICAgICAgKFhTV0RyNjQgKFhTSFdyMTYgKFhTQkhyOCBSOEM6JHJTcmMpKSk+OworCisvLyB6ZXh0IDgtPjE2OiBaZXJvIGV4dGVuZCBieXRlcyB0byBoYWxmd29yZHMKK2RlZiA6IFBhdDwoaTE2ICh6ZXh0IFI4QzokclNyYykpLAorICAgICAgICAgIChBTkRISWk4aTE2IFI4QzokclNyYywgMHhmZik+OworCisvLyB6ZXh0IDgtPjMyOiBaZXJvIGV4dGVuZCBieXRlcyB0byB3b3JkcworZGVmIDogUGF0PChpMzIgKHpleHQgUjhDOiRyU3JjKSksCisgICAgICAgICAgKEFORElpOGkzMiBSOEM6JHJTcmMsIDB4ZmYpPjsKKworLy8gemV4dCA4LT42NDogWmVybyBleHRlbmQgYnl0ZXMgdG8gZG91YmxlIHdvcmRzCitkZWYgOiBQYXQ8KGk2NCAoemV4dCBSOEM6JHJTcmMpKSwKKyAgICAgICAgICAoT1JpNjRfdjJpNjQgKFNFTEJ2NGkzMiAoUk9UUU1CWXY0aTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1J2NGkzMl9pMzIgKEFORElpOGkzMiBSOEM6JHJTcmMsIDB4ZmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElMdjRpMzIgMHgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlNNQkl2NGkzMiAweDBmMGYpKSk+OworCisvLyBhbnlleHQgOC0+MTY6IEV4dGVuZCA4LT4xNiBiaXRzLCBpcnJlc3BlY3RpdmUgb2Ygc2lnbiwgcHJlc2VydmVzIGhpZ2ggYml0cworZGVmIDogUGF0PChpMTYgKGFueWV4dCBSOEM6JHJTcmMpKSwKKyAgICAgICAgICAoT1JISWk4aTE2IFI4QzokclNyYywgMCk+OworCisvLyBhbnlleHQgOC0+MzI6IEV4dGVuZCA4LT4zMiBiaXRzLCBpcnJlc3BlY3RpdmUgb2Ygc2lnbiwgcHJlc2VydmVzIGhpZ2ggYml0cworZGVmIDogUGF0PChpMzIgKGFueWV4dCBSOEM6JHJTcmMpKSwKKyAgICAgICAgICAoT1JJaThpMzIgUjhDOiRyU3JjLCAwKT47CisKKy8vIHNleHQgMTYtPjY0OiBTaWduIGV4dGVuZCBoYWxmd29yZCB0byBkb3VibGUgd29yZAorZGVmIDogUGF0PChzZXh0X2lucmVnIFI2NEM6JHJTcmMsIGkxNiksCisgICAgICAgICAgKFhTV0RyNjRfaW5yZWcgKFhTSFdyNjQgUjY0QzokclNyYykpPjsKKyAgICAgICAgICAKK2RlZiA6IFBhdDwoc2V4dCBSMTZDOiRyU3JjKSwKKyAgICAgICAgICAoWFNXRHI2NCAoWFNIV3IxNiBSMTZDOiRyU3JjKSk+OworCisvLyB6ZXh0IDE2LT4zMjogWmVybyBleHRlbmQgaGFsZndvcmRzIHRvIHdvcmRzCitkZWYgOiBQYXQ8KGkzMiAoemV4dCBSMTZDOiRyU3JjKSksCisgICAgICAgICAgKEFORGkxNmkzMiBSMTZDOiRyU3JjLCAoSUxBcjMyIDB4ZmZmZikpPjsKKworZGVmIDogUGF0PChpMzIgKHpleHQgKGFuZCBSMTZDOiRyU3JjLCAweGYpKSksCisgICAgICAgICAgKEFORElpMTZpMzIgUjE2QzokclNyYywgMHhmKT47CisKK2RlZiA6IFBhdDwoaTMyICh6ZXh0IChhbmQgUjE2QzokclNyYywgMHhmZikpKSwKKyAgICAgICAgICAoQU5ESWkxNmkzMiBSMTZDOiRyU3JjLCAweGZmKT47CisKK2RlZiA6IFBhdDwoaTMyICh6ZXh0IChhbmQgUjE2QzokclNyYywgMHhmZmYpKSksCisgICAgICAgICAgKEFORElpMTZpMzIgUjE2QzokclNyYywgMHhmZmYpPjsKKworLy8gYW55ZXh0IDE2LT4zMjogRXh0ZW5kIDE2LT4zMiBiaXRzLCBpcnJlc3BlY3RpdmUgb2Ygc2lnbgorZGVmIDogUGF0PChpMzIgKGFueWV4dCBSMTZDOiRyU3JjKSksCisgICAgICAgICAgKE9SSWkxNmkzMiBSMTZDOiRyU3JjLCAwKT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUcnVuY2F0ZXM6CisvLyBUaGVzZSB0cnVuY2F0ZXMgYXJlIGZvciB0aGUgU1BVJ3Mgc3VwcG9ydGVkIHR5cGVzIChpOCwgaTE2LCBpMzIpLiBpNjQgYW5kCisvLyBhYm92ZSBhcmUgY3VzdG9tIGxvd2VyZWQuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgOiBQYXQ8KGk4ICh0cnVuYyBHUFJDOiRzcmMpKSwKKyAgICAgICAgICAoT1JpOF92MTZpOAorICAgICAgICAgICAgKFNIVUZCZ3ByYyBHUFJDOiRzcmMsIEdQUkM6JHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgKElPSEx2NGkzMiAoSUxIVXY0aTMyIDB4MGYwZiksIDB4MGYwZikpKT47CisKK2RlZiA6IFBhdDwoaTggKHRydW5jIFI2NEM6JHNyYykpLAorICAgICAgICAgIChPUmk4X3YxNmk4CisgICAgICAgICAgICAoU0hVRkJ2Mmk2NF9tMzIKKyAgICAgICAgICAgICAgKE9SdjJpNjRfaTY0IFI2NEM6JHNyYyksCisgICAgICAgICAgICAgIChPUnYyaTY0X2k2NCBSNjRDOiRzcmMpLAorICAgICAgICAgICAgICAoSU9ITHY0aTMyIChJTEhVdjRpMzIgMHgwNzA3KSwgMHgwNzA3KSkpPjsKKworZGVmIDogUGF0PChpOCAodHJ1bmMgUjMyQzokc3JjKSksCisgICAgICAgICAgKE9SaThfdjE2aTgKKyAgICAgICAgICAgIChTSFVGQnY0aTMyX20zMgorICAgICAgICAgICAgICAgKE9SdjRpMzJfaTMyIFIzMkM6JHNyYyksCisgICAgICAgICAgICAgICAoT1J2NGkzMl9pMzIgUjMyQzokc3JjKSwKKyAgICAgICAgICAgICAgIChJT0hMdjRpMzIgKElMSFV2NGkzMiAweDAzMDMpLCAweDAzMDMpKSk+OworCitkZWYgOiBQYXQ8KGk4ICh0cnVuYyBSMTZDOiRzcmMpKSwKKyAgICAgICAgICAoT1JpOF92MTZpOAorICAgICAgICAgICAgKFNIVUZCdjRpMzJfbTMyCisgICAgICAgICAgICAgICAoT1J2OGkxNl9pMTYgUjE2Qzokc3JjKSwKKyAgICAgICAgICAgICAgIChPUnY4aTE2X2kxNiBSMTZDOiRzcmMpLAorICAgICAgICAgICAgICAgKElPSEx2NGkzMiAoSUxIVXY0aTMyIDB4MDMwMyksIDB4MDMwMykpKT47CisKK2RlZiA6IFBhdDwoaTE2ICh0cnVuYyBHUFJDOiRzcmMpKSwKKyAgICAgICAgICAoT1JpMTZfdjhpMTYKKyAgICAgICAgICAgIChTSFVGQmdwcmMgR1BSQzokc3JjLCBHUFJDOiRzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIChJT0hMdjRpMzIgKElMSFV2NGkzMiAweDBlMGYpLCAweDBlMGYpKSk+OworCitkZWYgOiBQYXQ8KGkxNiAodHJ1bmMgUjY0Qzokc3JjKSksCisgICAgICAgICAgKE9SaTE2X3Y4aTE2CisgICAgICAgICAgICAoU0hVRkJ2Mmk2NF9tMzIKKyAgICAgICAgICAgICAgKE9SdjJpNjRfaTY0IFI2NEM6JHNyYyksCisgICAgICAgICAgICAgIChPUnYyaTY0X2k2NCBSNjRDOiRzcmMpLAorICAgICAgICAgICAgICAoSU9ITHY0aTMyIChJTEhVdjRpMzIgMHgwNjA3KSwgMHgwNjA3KSkpPjsKKworZGVmIDogUGF0PChpMTYgKHRydW5jIFIzMkM6JHNyYykpLAorICAgICAgICAgIChPUmkxNl92OGkxNgorICAgICAgICAgICAgKFNIVUZCdjRpMzJfbTMyCisgICAgICAgICAgICAgICAoT1J2NGkzMl9pMzIgUjMyQzokc3JjKSwKKyAgICAgICAgICAgICAgIChPUnY0aTMyX2kzMiBSMzJDOiRzcmMpLAorICAgICAgICAgICAgICAgKElPSEx2NGkzMiAoSUxIVXY0aTMyIDB4MDIwMyksIDB4MDIwMykpKT47CisKK2RlZiA6IFBhdDwoaTMyICh0cnVuYyBHUFJDOiRzcmMpKSwKKyAgICAgICAgICAoT1JpMzJfdjRpMzIKKyAgICAgICAgICAgIChTSFVGQmdwcmMgR1BSQzokc3JjLCBHUFJDOiRzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIChJT0hMdjRpMzIgKElMSFV2NGkzMiAweDBjMGQpLCAweDBlMGYpKSk+OworCitkZWYgOiBQYXQ8KGkzMiAodHJ1bmMgUjY0Qzokc3JjKSksCisgICAgICAgICAgKE9SaTMyX3Y0aTMyCisgICAgICAgICAgICAoU0hVRkJ2Mmk2NF9tMzIKKyAgICAgICAgICAgICAgKE9SdjJpNjRfaTY0IFI2NEM6JHNyYyksCisgICAgICAgICAgICAgIChPUnYyaTY0X2k2NCBSNjRDOiRzcmMpLAorICAgICAgICAgICAgICAoSU9ITHY0aTMyIChJTEhVdjRpMzIgMHgwNDA1KSwgMHgwNjA3KSkpPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFkZHJlc3MgZ2VuZXJhdGlvbjogU1BVLCBsaWtlIFBQQywgaGFzIHRvIHNwbGl0IGFkZHJlc3NlcyBpbnRvIGhpZ2ggYW5kCisvLyBsb3cgcGFydHMgaW4gb3JkZXIgdG8gbG9hZCB0aGVtIGludG8gYSByZWdpc3Rlci4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiA6IFBhdDwoU1BVYWZvcm0gdGdsb2JhbGFkZHI6JGluLCAwKSwgIChJTEFsc2EgdGdsb2JhbGFkZHI6JGluKT47CitkZWYgOiBQYXQ8KFNQVWFmb3JtIHRleHRlcm5hbHN5bTokaW4sIDApLCAoSUxBbHNhIHRleHRlcm5hbHN5bTokaW4pPjsKK2RlZiA6IFBhdDwoU1BVYWZvcm0gdGp1bXB0YWJsZTokaW4sIDApLCAgIChJTEFsc2EgdGp1bXB0YWJsZTokaW4pPjsKK2RlZiA6IFBhdDwoU1BVYWZvcm0gdGNvbnN0cG9vbDokaW4sIDApLCAgIChJTEFsc2EgIHRjb25zdHBvb2w6JGluKT47CisKK2RlZiA6IFBhdDwoU1BVaW5kaXJlY3QgKFNQVWhpIHRnbG9iYWxhZGRyOiRpbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgIChTUFVsbyB0Z2xvYmFsYWRkcjokaW4sIDApKSwKKyAgICAgICAgICAoSU9ITGxvIChJTEhVaGkgdGdsb2JhbGFkZHI6JGluKSwgdGdsb2JhbGFkZHI6JGluKT47CisKK2RlZiA6IFBhdDwoU1BVaW5kaXJlY3QgKFNQVWhpIHRleHRlcm5hbHN5bTokaW4sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAoU1BVbG8gdGV4dGVybmFsc3ltOiRpbiwgMCkpLAorICAgICAgICAgIChJT0hMbG8gKElMSFVoaSB0ZXh0ZXJuYWxzeW06JGluKSwgdGV4dGVybmFsc3ltOiRpbik+OworCitkZWYgOiBQYXQ8KFNQVWluZGlyZWN0IChTUFVoaSB0anVtcHRhYmxlOiRpbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgIChTUFVsbyB0anVtcHRhYmxlOiRpbiwgMCkpLAorICAgICAgICAgIChJT0hMbG8gKElMSFVoaSB0anVtcHRhYmxlOiRpbiksIHRqdW1wdGFibGU6JGluKT47CisKK2RlZiA6IFBhdDwoU1BVaW5kaXJlY3QgKFNQVWhpIHRjb25zdHBvb2w6JGluLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKFNQVWxvIHRjb25zdHBvb2w6JGluLCAwKSksCisgICAgICAgICAgKElPSExsbyAoSUxIVWhpIHRjb25zdHBvb2w6JGluKSwgdGNvbnN0cG9vbDokaW4pPjsKKworZGVmIDogUGF0PChhZGQgKFNQVWhpIHRnbG9iYWxhZGRyOiRpbiwgMCksIChTUFVsbyB0Z2xvYmFsYWRkcjokaW4sIDApKSwKKyAgICAgICAgICAoSU9ITGxvIChJTEhVaGkgdGdsb2JhbGFkZHI6JGluKSwgdGdsb2JhbGFkZHI6JGluKT47CisKK2RlZiA6IFBhdDwoYWRkIChTUFVoaSB0ZXh0ZXJuYWxzeW06JGluLCAwKSwgKFNQVWxvIHRleHRlcm5hbHN5bTokaW4sIDApKSwKKyAgICAgICAgICAoSU9ITGxvIChJTEhVaGkgdGV4dGVybmFsc3ltOiRpbiksIHRleHRlcm5hbHN5bTokaW4pPjsKKworZGVmIDogUGF0PChhZGQgKFNQVWhpIHRqdW1wdGFibGU6JGluLCAwKSwgKFNQVWxvIHRqdW1wdGFibGU6JGluLCAwKSksCisgICAgICAgICAgKElPSExsbyAoSUxIVWhpIHRqdW1wdGFibGU6JGluKSwgdGp1bXB0YWJsZTokaW4pPjsKKworZGVmIDogUGF0PChhZGQgKFNQVWhpIHRjb25zdHBvb2w6JGluLCAwKSwgKFNQVWxvIHRjb25zdHBvb2w6JGluLCAwKSksCisgICAgICAgICAgKElPSExsbyAoSUxIVWhpIHRjb25zdHBvb2w6JGluKSwgdGNvbnN0cG9vbDokaW4pPjsKKworLy8gSW50cmluc2ljczoKK2luY2x1ZGUgIkNlbGxTREtJbnRyaW5zaWNzLnRkIgorLy8gVmFyaW91cyBtYXRoIG9wZXJhdG9yIGluc3RydWN0aW9uIHNlcXVlbmNlcworaW5jbHVkZSAiU1BVTWF0aEluc3RyLnRkIgorLy8gNjQtYml0ICJpbnN0cnVjdGlvbnMiL3N1cHBvcnQKK2luY2x1ZGUgIlNQVTY0SW5zdHJJbmZvLnRkIgorLy8gMTI4LWJpdCAiaW5zdHJ1Y3Rpb25zIi9zdXBwb3J0CitpbmNsdWRlICJTUFUxMjhJbnN0ckluZm8udGQiCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVTUNBc21JbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVNQ0FzbUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmE4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVTUNBc21JbmZvLmNwcApAQCAtMCwwICsxLDQwIEBACisvLz09PS0tIFNQVU1DQXNtSW5mby5jcHAgLSBDZWxsIFNQVSBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBTUFVNQ0FzbUluZm8gcHJvcGVydGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiU1BVTUNBc21JbmZvLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1BVTGludXhNQ0FzbUluZm86OlNQVUxpbnV4TUNBc21JbmZvKGNvbnN0IFRhcmdldCAmVCwgU3RyaW5nUmVmIFRUKSB7CisgIFplcm9EaXJlY3RpdmUgPSAiXHQuc3BhY2VcdCI7CisgIERhdGE2NGJpdHNEaXJlY3RpdmUgPSAiXHQucXVhZFx0IjsKKyAgQWxpZ25tZW50SXNJbkJ5dGVzID0gZmFsc2U7CisgICAgICAKKyAgUENTeW1ib2wgPSAiLiI7CisgIENvbW1lbnRTdHJpbmcgPSAiIyI7CisgIEdsb2JhbFByZWZpeCA9ICIiOworICBQcml2YXRlR2xvYmFsUHJlZml4ID0gIi5MIjsKKworICAvLyBIYXMgbGViMTI4LCAubG9jIGFuZCAuZmlsZQorICBIYXNMRUIxMjggPSB0cnVlOworICBIYXNEb3RMb2NBbmREb3RGaWxlID0gdHJ1ZTsKKworICBTdXBwb3J0c0RlYnVnSW5mb3JtYXRpb24gPSB0cnVlOworCisgIC8vIEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIENlbGxTUFUgKHRoaW5rIGFib3V0IGl0OiB5b3Ugb25seQorICAvLyBoYXZlIDI1NksgZm9yIGNvZGUrZGF0YS4gV291bGQgeW91IHN1cHBvcnQgZXhjZXB0aW9uIGhhbmRsaW5nPykKKyAgRXhjZXB0aW9uc1R5cGUgPSBFeGNlcHRpb25IYW5kbGluZzo6Tm9uZTsKKworICAvLyBTUFUgYXNzZW1ibHkgcmVxdWlyZXMgIi5zZWN0aW9uIiBiZWZvcmUgIi5ic3MiIAorICBVc2VzRUxGU2VjdGlvbkRpcmVjdGl2ZUZvckJTUyA9IHRydWU7ICAKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVU1DQXNtSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVU1DQXNtSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODUwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVTUNBc21JbmZvLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tLSBTUFVNQ0FzbUluZm8uaCAtIENlbGwgU1BVIGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBTUFVNQ0FzbUluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTUFVUQVJHRVRBU01JTkZPX0gKKyNkZWZpbmUgU1BVVEFSR0VUQVNNSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFRhcmdldDsKKyAgCisgIHN0cnVjdCBTUFVMaW51eE1DQXNtSW5mbyA6IHB1YmxpYyBNQ0FzbUluZm8geworICAgIGV4cGxpY2l0IFNQVUxpbnV4TUNBc21JbmZvKGNvbnN0IFRhcmdldCAmVCwgU3RyaW5nUmVmIFRUKTsKKyAgfTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8qIFNQVVRBUkdFVEFTTUlORk9fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVU1hY2hpbmVGdW5jdGlvbi5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVU1hY2hpbmVGdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjNjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVTWFjaGluZUZ1bmN0aW9uLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tLSBTUFVNYWNoaW5lRnVuY3Rpb25JbmZvLmggLSBQcml2YXRlIGRhdGEgdXNlZCBmb3IgQ2VsbFNQVSAtLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIElCTSBDZWxsIFNQVSBzcGVjaWZpYyBzdWJjbGFzcyBvZiBNYWNoaW5lRnVuY3Rpb25JbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU1BVX01BQ0hJTkVfRlVOQ1RJT05fSU5GT19ICisjZGVmaW5lIFNQVV9NQUNISU5FX0ZVTkNUSU9OX0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTUFVGdW5jdGlvbkluZm8gLSBDZWxsIFNQVSB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGVhY2gKKy8vLyBNYWNoaW5lRnVuY3Rpb24KK2NsYXNzIFNQVUZ1bmN0aW9uSW5mbyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25JbmZvIHsKK3ByaXZhdGU6CisgIC8vLyBVc2VzTFIgLSBJbmRpY2F0ZXMgd2hldGhlciBMUiBpcyB1c2VkIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAvLy8KKyAgYm9vbCBVc2VzTFI7CisKKyAgLy8gVmFyQXJnc0ZyYW1lSW5kZXggLSBGcmFtZUluZGV4IGZvciBzdGFydCBvZiB2YXJhcmdzIGFyZWEuCisgIGludCBWYXJBcmdzRnJhbWVJbmRleDsKKworcHVibGljOgorICBTUFVGdW5jdGlvbkluZm8oTWFjaGluZUZ1bmN0aW9uJiBNRikgCisgIDogVXNlc0xSKGZhbHNlKSwKKyAgICBWYXJBcmdzRnJhbWVJbmRleCgwKQorICB7fQorCisgIHZvaWQgc2V0VXNlc0xSKGJvb2wgVSkgeyBVc2VzTFIgPSBVOyB9CisgIGJvb2wgdXNlc0xSKCkgICAgICAgICAgeyByZXR1cm4gVXNlc0xSOyB9CisKKyAgaW50IGdldFZhckFyZ3NGcmFtZUluZGV4KCkgY29uc3QgeyByZXR1cm4gVmFyQXJnc0ZyYW1lSW5kZXg7IH0KKyAgdm9pZCBzZXRWYXJBcmdzRnJhbWVJbmRleChpbnQgSW5kZXgpIHsgVmFyQXJnc0ZyYW1lSW5kZXggPSBJbmRleDsgfQorfTsKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlIGxsdm0KKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVU1hdGhJbnN0ci50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVNYXRoSW5zdHIudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwNTU5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVNYXRoSW5zdHIudGQKQEAgLTAsMCArMSwxMDUgQEAKKy8vPT09PT09LS0tIFNQVU1hdGhJbnN0LnRkIC0gQ2VsbCBTUFUgbWF0aCBvcGVyYXRpb25zIC0qLSB0YWJsZWdlbiAtKi0tLT09PT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBDZWxsIFNQVSBtYXRoIG9wZXJhdGlvbnMKKy8vCisvLyBUaGlzIHRhcmdldCBkZXNjcmlwdGlvbiBmaWxlIGNvbnRhaW5zIGluc3RydWN0aW9uIHNlcXVlbmNlcyBmb3IgdmFyaW91cworLy8gbWF0aCBvcGVyYXRpb25zLCBzdWNoIGFzIHZlY3RvciBtdWx0aXBsaWVzLCBpMzIgbXVsdGlwbHksIGV0Yy4sIGZvciB0aGUKKy8vIFNQVSdzIGkzMiwgaTE2IGk4IGFuZCBjb3JyZXNwb25kaW5nIHZlY3RvciB0eXBlcy4KKy8vCisvLyBBbnkgcmVzZW1ibGFuY2UgdG8gbGlic2ltZG1hdGggb3IgdGhlIENlbGwgU0RLIHNpbWRtYXRoIGxpYnJhcnkgaXMKKy8vIHB1cmVseSBhbmQgY29tcGxldGVseSBjb2luY2lkZW50YWwuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4KKy8vIHYxNmk4IG11bHRpcGx5IGluc3RydWN0aW9uIHNlcXVlbmNlOgorLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisKK2RlZiA6IFBhdDwobXVsICh2MTZpOCBWRUNSRUc6JHJBKSwgKHYxNmk4IFZFQ1JFRzokckIpKSwKKyAgICAgICAgICAoT1J2NGkzMgorICAgICAgICAgICAoQU5EdjRpMzIKKyAgICAgICAgICAgIChTRUxCdjRpMzIgKE1QWXY4aTE2IFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLAorICAgICAgICAgICAgICAgICAgICAgICAoU0hMSEl2OGkxNiAoTVBZdjhpMTYgKFJPVE1BSEl2OGkxNiBWRUNSRUc6JHJBLCA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChST1RNQUhJdjhpMTYgVkVDUkVHOiRyQiwgOCkpLCA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZTTUJJdjhpMTYgMHgyMjIyKSksCisgICAgICAgICAgICAoSUxBdjRpMzIgMHgwMDAwZmZmZikpLAorICAgICAgICAgICAoU0hMSXY0aTMyCisgICAgICAgICAgICAoU0VMQnY0aTMyIChNUFl2OGkxNiAoUk9UTUFJdjRpMzJfaTMyIFZFQ1JFRzokckEsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChST1RNQUl2NGkzMl9pMzIgVkVDUkVHOiRyQiwgMTYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKFNITEhJdjhpMTYgKE1QWXY4aTE2IChST1RNQUl2NGkzMl9pMzIgVkVDUkVHOiRyQSwgOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUk9UTUFJdjRpMzJfaTMyIFZFQ1JFRzokckIsIDgpKSwgOCksCisgICAgICAgICAgICAgICAgICAgICAgIChGU01CSXY4aTE2IDB4MjIyMikpLCAxNikpPjsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyB2OGkxNiBtdWx0aXBseSBpbnN0cnVjdGlvbiBzZXF1ZW5jZToKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitkZWYgOiBQYXQ8KG11bCAodjhpMTYgVkVDUkVHOiRyQSksICh2OGkxNiBWRUNSRUc6JHJCKSksCisgICAgICAgICAgKFNFTEJ2OGkxNiAoTVBZdjhpMTYgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAoU0hMSXY0aTMyIChNUFlISHY4aTE2IFZFQ1JFRzokckEsIFZFQ1JFRzokckIpLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAoRlNNQkl2OGkxNiAweGNjY2MpKT47CisgICAgICAgICAgICAgICAgIAorLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyB2NGkzMiwgdjJpMzIsIGkzMiBtdWx0aXBseSBpbnN0cnVjdGlvbiBzZXF1ZW5jZToKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCitkZWYgTVBZdjRpMzI6CisgIFBhdDwobXVsICh2NGkzMiBWRUNSRUc6JHJBKSwgKHY0aTMyIFZFQ1JFRzokckIpKSwKKyAgICAgIChBdjRpMzIKKyAgICAgICAgKHY0aTMyIChBdjRpMzIgKHY0aTMyIChNUFlIdjRpMzIgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQikpLAorICAgICAgICAgICAgICAgICAgICAgICAodjRpMzIgKE1QWUh2NGkzMiBWRUNSRUc6JHJCLCBWRUNSRUc6JHJBKSkpKSwKKyAgICAgICAgKHY0aTMyIChNUFlVdjRpMzIgVkVDUkVHOiRyQSwgVkVDUkVHOiRyQikpKT47CisKK2RlZiBNUFl2MmkzMjoKKyAgUGF0PChtdWwgKHYyaTMyIFZFQ1JFRzokckEpLCAodjJpMzIgVkVDUkVHOiRyQikpLAorICAgICAgKEF2MmkzMgorICAgICAgICAodjJpMzIgKEF2MmkzMiAodjJpMzIgKE1QWUh2MmkzMiBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSksCisgICAgICAgICAgICAgICAgICAgICAgICh2MmkzMiAoTVBZSHYyaTMyIFZFQ1JFRzokckIsIFZFQ1JFRzokckEpKSkpLAorICAgICAgICAodjJpMzIgKE1QWVV2MmkzMiBWRUNSRUc6JHJBLCBWRUNSRUc6JHJCKSkpPjsKKworCitkZWYgTVBZaTMyOgorICBQYXQ8KG11bCBSMzJDOiRyQSwgUjMyQzokckIpLAorICAgICAgKEFyMzIKKyAgICAgICAgKEFyMzIgKE1QWUhyMzIgUjMyQzokckEsIFIzMkM6JHJCKSwKKyAgICAgICAgICAgICAgKE1QWUhyMzIgUjMyQzokckIsIFIzMkM6JHJBKSksCisgICAgICAgIChNUFlVcjMyIFIzMkM6JHJBLCBSMzJDOiRyQikpPjsKKworLy8tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+CisvLyBmMzIsIHY0ZjMyIGRpdmlkZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZToKKy8vLX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfi1+LX4tfgorCisvLyBSZWNpcHJvY2FsIGVzdGltYXRlIGFuZCBpbnRlcnBvbGF0aW9uCitkZWYgSW50ZXJwZjMyOiBDb2RlRnJhZzwoRklmMzIgUjMyRlA6JHJCLCAoRlJFU1RmMzIgUjMyRlA6JHJCKSk+OworLy8gRGl2aXNpb24gZXN0aW1hdGUKK2RlZiBEaXZFc3RmMzI6IENvZGVGcmFnPChGTWYzMiBSMzJGUDokckEsIEludGVycGYzMi5GcmFnbWVudCk+OworLy8gTmV3dG9uLVJhcGhzb24gaXRlcmF0aW9uCitkZWYgTlJhcGhmMzI6IENvZGVGcmFnPChGTUFmMzIgKEZOTVNmMzIgRGl2RXN0ZjMyLkZyYWdtZW50LCBSMzJGUDokckIsIFIzMkZQOiRyQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwZjMyLkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpdkVzdGYzMi5GcmFnbWVudCk+OworLy8gRXBzaWxvbiBhZGRpdGlvbgorZGVmIEVwc2lsb25mMzI6IENvZGVGcmFnPChBSWYzMiBOUmFwaGYzMi5GcmFnbWVudCwgMSk+OworCitkZWYgOiBQYXQ8KGZkaXYgUjMyRlA6JHJBLCBSMzJGUDokckIpLAorICAgICAgICAgIChTRUxCZjMyX2NvbmQgTlJhcGhmMzIuRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBFcHNpbG9uZjMyLkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgKENHVElmMzIgKEZOTVNmMzIgUjMyRlA6JHJCLCBFcHNpbG9uZjMyLkZyYWdtZW50LCBSMzJGUDokckEpLCAtMSkpPjsKKworLy8gUmVjaXByb2NhbCBlc3RpbWF0ZSBhbmQgaW50ZXJwb2xhdGlvbgorZGVmIEludGVycHY0ZjMyOiBDb2RlRnJhZzwoRkl2NGYzMiAodjRmMzIgVkVDUkVHOiRyQiksIChGUkVTVHY0ZjMyICh2NGYzMiBWRUNSRUc6JHJCKSkpPjsKKy8vIERpdmlzaW9uIGVzdGltYXRlCitkZWYgRGl2RXN0djRmMzI6IENvZGVGcmFnPChGTXY0ZjMyICh2NGYzMiBWRUNSRUc6JHJBKSwgSW50ZXJwdjRmMzIuRnJhZ21lbnQpPjsKKy8vIE5ld3Rvbi1SYXBoc29uIGl0ZXJhdGlvbgorZGVmIE5SYXBodjRmMzI6IENvZGVGcmFnPChGTUF2NGYzMiAoRk5NU3Y0ZjMyIERpdkVzdHY0ZjMyLkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiBWRUNSRUc6JHJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRmMzIgVkVDUkVHOiRyQSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnB2NGYzMi5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGl2RXN0djRmMzIuRnJhZ21lbnQpPjsKKy8vIEVwc2lsb24gYWRkaXRpb24KK2RlZiBFcHNpbG9udjRmMzI6IENvZGVGcmFnPChBSXY0ZjMyIE5SYXBodjRmMzIuRnJhZ21lbnQsIDEpPjsKKworZGVmIDogUGF0PChmZGl2ICh2NGYzMiBWRUNSRUc6JHJBKSwgKHY0ZjMyIFZFQ1JFRzokckIpKSwKKyAgICAgICAgICAoU0VMQnY0ZjMyX2NvbmQgTlJhcGh2NGYzMi5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVwc2lsb252NGYzMi5GcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChDR1RJdjRmMzIgKEZOTVN2NGYzMiAodjRmMzIgVkVDUkVHOiRyQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXBzaWxvbnY0ZjMyLkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiBWRUNSRUc6JHJBKSksIC0xKSk+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVU5vZGVzLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVU5vZGVzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYWNmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVTm9kZXMudGQKQEAgLTAsMCArMSwxNjMgQEAKKy8vPT09LSBTUFVOb2Rlcy50ZCAtIFNwZWNpYWxpemVkIFNlbGVjdGlvbkRBRyBub2RlcyB1c2VkIGZvciBDZWxsU1BVIC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVHlwZSBwcm9maWxlcyBhbmQgU2VsZWN0aW9uREFHIG5vZGVzIHVzZWQgYnkgQ2VsbFNQVQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFR5cGUgcHJvZmlsZSBmb3IgYSBjYWxsIHNlcXVlbmNlCitkZWYgU0RUX1NQVUNhbGxTZXEgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFsgU0RUQ2lzVlQ8MCwgaTMyPiBdPjsKKworLy8gU1BVX0dlbkNvbnRyb2w6IFR5cGUgcHJvZmlsZSBmb3IgZ2VuZXJhdGluZyBjb250cm9sIHdvcmRzIGZvciBpbnNlcnRpb25zCitkZWYgU1BVX0dlbkNvbnRyb2wgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFtdPjsKK2RlZiBTUFVzaHVmbWFzayAgICA6IFNETm9kZTwiU1BVSVNEOjpTSFVGRkxFX01BU0siLCBTUFVfR2VuQ29udHJvbCwgW10+OworCitkZWYgY2FsbHNlcV9zdGFydCA6IFNETm9kZTwiSVNEOjpDQUxMU0VRX1NUQVJUIiwgU0RUX1NQVUNhbGxTZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3V0RmxhZ10+OworZGVmIGNhbGxzZXFfZW5kICAgOiBTRE5vZGU8IklTRDo6Q0FMTFNFUV9FTkQiLCAgIFNEVF9TUFVDYWxsU2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUEluRmxhZywgU0ROUE91dEZsYWddPjsKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPcGVyYW5kIGNvbnN0cmFpbnRzOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIFNEVF9TUFVDYWxsICAgOiBTRFR5cGVQcm9maWxlPDAsIC0xLCBbU0RUQ2lzUHRyVHk8MD5dPjsKK2RlZiBTUFVjYWxsICAgICAgIDogU0ROb2RlPCJTUFVJU0Q6OkNBTEwiLCBTRFRfU1BVQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWcsIFNETlBPdXRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETlBWYXJpYWRpY10+OworCisvLyBPcGVyYW5kIHR5cGUgY29uc3RyYWludHMgZm9yIHZlY3RvciBzaHVmZmxlL3Blcm11dGUgb3BlcmF0aW9ucworZGVmIFNEVF9TUFVzaHVmZmxlICAgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsKKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNTYW1lQXM8MSwgMj4KK10+OworCisvLyBWZWN0b3IgYmluYXJ5IG9wZXJhdG9yIHR5cGUgY29uc3RyYWludHMgKG5lZWRzIGEgZnVydGhlciBjb25zdHJhaW50IHRvCisvLyBlbnN1cmUgdGhhdCBvcGVyYW5kIDAgaXMgYSB2ZWN0b3IuLi4pOgorCitkZWYgU1BVVmVjQmlub3A6IFNEVHlwZVByb2ZpbGU8MSwgMiwgWworICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1NhbWVBczwxLCAyPgorXT47CisKKy8vIFRyaW5hcnkgb3BlcmF0b3JzLCBlLmcuLCBhZGR4LCBjYXJyeSBnZW5lcmF0ZQorZGVmIFNQVUludFRyaW5hcnlPcCA6IFNEVHlwZVByb2ZpbGU8MSwgMywgWworICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzU2FtZUFzPDAsIDM+LCBTRFRDaXNJbnQ8MD4KK10+OworCisvLyBTRUxFQ1RfTUFTSyB0eXBlIGNvbnN0cmFpbnRzOiBUaGVyZSBhcmUgc2V2ZXJhbCB2YXJpYXRpb25zIGZvciB0aGUgdmFyaW91cworLy8gdmVjdG9yIHR5cGVzICh0aGlzIGF2b2lkcyBoYXZpbmcgdG8gYml0X2NvbnZlcnQgYWxsIG92ZXIgdGhlIHBsYWNlLikKK2RlZiBTUFVzZWxtYXNrX3R5cGU6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWworICBTRFRDaXNJbnQ8MT4KK10+OworCisvLyBTRUxCIHR5cGUgY29uc3RyYWludHM6CitkZWYgU1BVc2VsYl90eXBlOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsKKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNTYW1lQXM8MSwgMj4sIFNEVENpc1NhbWVBczwwLCAzPiBdPjsKKworLy8gU1BVIFZlY3RvciBzaGlmdCBwc2V1ZG8taW5zdHJ1Y3Rpb24gdHlwZSBjb25zdHJhaW50cworZGVmIFNQVXZlY3NoaWZ0X3R5cGU6IFNEVHlwZVByb2ZpbGU8MSwgMiwgWworICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc0ludDwyPl0+OworCisvLyAibWFya2VyIiB0eXBlIGZvciBpNjQgb3BlcmF0b3JzIHRoYXQgbmVlZCBhIHNodWZmbGUgbWFzaworLy8gKGkuZS4sIHVzZXMgY2cgb3IgYmcgb3IgYW5vdGhlciBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvCisvLyB1c2Ugc2h1ZmIgdG8gZ2V0IHRoaW5ncyBpbiB0aGUgcmlnaHQgcGxhY2UuKQorLy8gT3AwOiBUaGUgcmVzdWx0CisvLyBPcDEsIDI6IExIUywgUkhTCisvLyBPcDM6IENhcnJ5LWdlbmVyYXRlIHNodWZmbGUgbWFzaworCitkZWYgU1BVbWFya2VyX3R5cGUgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1NhbWVBczwxLCAyPiBdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFN5bnRoZXRpYy9wc2V1ZG8taW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBTUFUgQ05UQjoKK2RlZiBTUFVjbnRiIDogU0ROb2RlPCJTUFVJU0Q6OkNOVEIiLCBTRFRJbnRVbmFyeU9wPjsKKworLy8gU1BVIHZlY3RvciBzaHVmZmxlIG5vZGUsIG1hdGNoZWQgYnkgdGhlIFNQVUlTRDo6U0hVRkIgZW51bSAoc2VlCisvLyBTUFVJU2VsTG93ZXJpbmcuaCk6CitkZWYgU1BVc2h1ZmZsZTogU0ROb2RlPCJTUFVJU0Q6OlNIVUZCIiwgU0RUX1NQVXNodWZmbGUsIFtdPjsKKworLy8gU2hpZnQgbGVmdCBxdWFkd29yZCBieSBiaXRzIGFuZCBieXRlcworZGVmIFNQVXNobHF1YWRfbF9iaXRzOiBTRE5vZGU8IlNQVUlTRDo6U0hMUVVBRF9MX0JJVFMiLCBTUFV2ZWNzaGlmdF90eXBlLCBbXT47CitkZWYgU1BVc2hscXVhZF9sX2J5dGVzOiBTRE5vZGU8IlNQVUlTRDo6U0hMUVVBRF9MX0JZVEVTIiwgU1BVdmVjc2hpZnRfdHlwZSwgW10+OworCisvLyBWZWN0b3Igc2hpZnRzIChJU0Q6OlNITCxTUkwsU1JBIGFyZSBmb3IgX2ludGVnZXJzXyBvbmx5KToKK2RlZiBTUFV2ZWNfc2hsOiBTRE5vZGU8IklTRDo6U0hMIiwgU1BVdmVjc2hpZnRfdHlwZSwgW10+OworZGVmIFNQVXZlY19zcmw6IFNETm9kZTwiSVNEOjpTUkwiLCBTUFV2ZWNzaGlmdF90eXBlLCBbXT47CitkZWYgU1BVdmVjX3NyYTogU0ROb2RlPCJJU0Q6OlNSQSIsIFNQVXZlY3NoaWZ0X3R5cGUsIFtdPjsKKworZGVmIFNQVXZlY19yb3RsOiBTRE5vZGU8IlNQVUlTRDo6VkVDX1JPVEwiLCBTUFV2ZWNzaGlmdF90eXBlLCBbXT47CitkZWYgU1BVdmVjX3JvdHI6IFNETm9kZTwiU1BVSVNEOjpWRUNfUk9UUiIsIFNQVXZlY3NoaWZ0X3R5cGUsIFtdPjsKKworLy8gVmVjdG9yIHJvdGF0ZSBsZWZ0LCBiaXRzIHNoaWZ0ZWQgb3V0IG9mIHRoZSBsZWZ0IGFyZSByb3RhdGVkIGluIG9uIHRoZSByaWdodAorZGVmIFNQVXJvdGJ5dGVzX2xlZnQ6IFNETm9kZTwiU1BVSVNEOjpST1RCWVRFU19MRUZUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BVdmVjc2hpZnRfdHlwZSwgW10+OworCisvLyBWZWN0b3Igcm90YXRlIGxlZnQgYnkgYnl0ZXMsIGJ1dCB0aGUgY291bnQgaXMgZ2l2ZW4gaW4gYml0cyBhbmQgdGhlIFNQVQorLy8gaW50ZXJuYWxseSBjb252ZXJ0cyBpdCB0byBieXRlcyAoc2F2ZXMgYW4gaW5zdHJ1Y3Rpb24gdG8gbWFzayBvZmYgbG93ZXIKKy8vIHRocmVlIGJpdHMpCitkZWYgU1BVcm90Ynl0ZXNfbGVmdF9iaXRzIDogU0ROb2RlPCJTUFVJU0Q6OlJPVEJZVEVTX0xFRlRfQklUUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQVXZlY3NoaWZ0X3R5cGU+OworCisvLyBTUFUgZm9ybSBzZWxlY3QgbWFzayBmb3IgYnl0ZXMsIGltbWVkaWF0ZQorZGVmIFNQVXNlbG1hc2s6IFNETm9kZTwiU1BVSVNEOjpTRUxFQ1RfTUFTSyIsIFNQVXNlbG1hc2tfdHlwZSwgW10+OworCisvLyBTUFUgc2VsZWN0IGJpdHMgaW5zdHJ1Y3Rpb24KK2RlZiBTUFVzZWxiOiBTRE5vZGU8IlNQVUlTRDo6U0VMQiIsIFNQVXNlbGJfdHlwZSwgW10+OworCitkZWYgU0RUcHJlZnNsb3QydmVjOiBTRFR5cGVQcm9maWxlPDEsIDEsIFtdPjsKK2RlZiBTUFVwcmVmc2xvdDJ2ZWM6IFNETm9kZTwiU1BVSVNEOjpQUkVGU0xPVDJWRUMiLCBTRFRwcmVmc2xvdDJ2ZWMsIFtdPjsKKworZGVmIFNQVV92ZWNfZGVtb3RlICAgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFtdPjsKK2RlZiBTUFV2ZWMycHJlZnNsb3Q6IFNETm9kZTwiU1BVSVNEOjpWRUMyUFJFRlNMT1QiLCBTUFVfdmVjX2RlbW90ZSwgW10+OworCitkZWYgU1BVX2hhbGZfMl92ZWMgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFtdPjsKK2RlZiBTUFVoYWxmMnZlYzogU0ROb2RlPCJTUFVJU0Q6OkhBTEYyVkVDIiwgU1BVX2hhbGZfMl92ZWMsIFtdPjsKKworZGVmIFNQVV92ZWNfMl9oYWxmIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbXT47CitkZWYgU1BVdmVjMmhhbGY6IFNETm9kZTwiU1BVSVNEOjpWRUMySEFMRiIsIFNQVV92ZWNfMl9oYWxmLCBbXT47CisgCisvLyBBZGRyZXNzIGhpZ2ggYW5kIGxvdyBjb21wb25lbnRzLCB1c2VkIGZvciBbcityXSB0eXBlIGFkZHJlc3NpbmcKK2RlZiBTUFVoaSA6IFNETm9kZTwiU1BVSVNEOjpIaSIsIFNEVEludEJpbk9wLCBbXT47CitkZWYgU1BVbG8gOiBTRE5vZGU8IlNQVUlTRDo6TG8iLCBTRFRJbnRCaW5PcCwgW10+OworCisvLyBQQy1yZWxhdGl2ZSBhZGRyZXNzCitkZWYgU1BVcGNyZWwgOiBTRE5vZGU8IlNQVUlTRDo6UENSZWxBZGRyIiwgU0RUSW50QmluT3AsIFtdPjsKKworLy8gQS1Gb3JtIGxvY2FsIHN0b3JlIGFkZHJlc3NlcworZGVmIFNQVWFmb3JtIDogU0ROb2RlPCJTUFVJU0Q6OkFGb3JtQWRkciIsIFNEVEludEJpbk9wLCBbXT47CisKKy8vIEluZGlyZWN0IFtELUZvcm0gImltbSgkcmVnKSIgYW5kIFgtRm9ybSAiJHJlZygkcmVnKSJdIGFkZHJlc3NlcworZGVmIFNQVWluZGlyZWN0IDogU0ROb2RlPCJTUFVJU0Q6OkluZGlyZWN0QWRkciIsIFNEVEludEJpbk9wLCBbXT47CisKKy8vIGk2NCBtYXJrZXJzOiBzdXBwbGllcyBleHRyYSBvcGVyYW5kcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBpNjQgb3BlcmF0b3IKKy8vIGluc3RydWN0aW9uIHNlcXVlbmNlcworZGVmIFNQVWFkZDY0IDogU0ROb2RlPCJTUFVJU0Q6OkFERDY0X01BUktFUiIsIFNQVW1hcmtlcl90eXBlLCBbXT47CitkZWYgU1BVc3ViNjQgOiBTRE5vZGU8IlNQVUlTRDo6U1VCNjRfTUFSS0VSIiwgU1BVbWFya2VyX3R5cGUsIFtdPjsKK2RlZiBTUFVtdWw2NCA6IFNETm9kZTwiU1BVSVNEOjpNVUw2NF9NQVJLRVIiLCBTUFVtYXJrZXJfdHlwZSwgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29uc3RyYWludHM6ICh0YWtlbiBmcm9tIFBQQ0luc3RySW5mby50ZCkKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFJlZ0NvbnN0cmFpbnQ8c3RyaW5nIEM+IHsKKyAgc3RyaW5nIENvbnN0cmFpbnRzID0gQzsKK30KKworY2xhc3MgTm9FbmNvZGU8c3RyaW5nIEU+IHsKKyAgc3RyaW5nIERpc2FibGVFbmNvZGluZyA9IEU7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSZXR1cm4gKGZsYWcgaXNuJ3QgcXVpdGUgd2hhdCBpdCBtZWFuczogdGhlIG9wZXJhdGlvbnMgYXJlIGZsYWdnZWQgc28gdGhhdAorLy8gaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZyBkb2Vzbid0IGRpc2Fzc29jaWF0ZSB0aGVtLikKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiByZXRmbGFnICAgICA6IFNETm9kZTwiU1BVSVNEOjpSRVRfRkxBRyIsIFNEVE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZ10+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVU9wZXJhbmRzLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVU9wZXJhbmRzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTY2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVT3BlcmFuZHMudGQKQEAgLTAsMCArMSw2NjYgQEAKKy8vPT09LSBTUFVPcGVyYW5kcy50ZCAtIENlbGwgU1BVIEluc3RydWN0aW9uIE9wZXJhbmRzIC0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENlbGwgU1BVIEluc3RydWN0aW9uIE9wZXJhbmRzOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVE9fSU1NMzIgLSBDb252ZXJ0IGFuIGk4L2kxNiB0byBpMzIuCitkZWYgVE9fSU1NMzIgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIHJldHVybiBnZXRJMzJJbW0oTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0+OworCisvLyBUT19JTU0xNiAtIENvbnZlcnQgYW4gaTgvaTMyIHRvIGkxNi4KK2RlZiBUT19JTU0xNiA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoTi0+Z2V0WkV4dFZhbHVlKCksIE1WVDo6aTE2KTsKK31dPjsKKworCitkZWYgTE8xNiA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgdW5zaWduZWQgdmFsID0gTi0+Z2V0WkV4dFZhbHVlKCk7CisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiBnZXQgdGhlIGxvdyAxNiBiaXRzLgorICByZXR1cm4gZ2V0STMySW1tKHZhbCAmIDB4ZmZmZik7Cit9XT47CisKK2RlZiBMTzE2X3ZlYyA6IFNETm9kZVhGb3JtPHNjYWxhcl90b192ZWN0b3IsIFt7CisgIFNEVmFsdWUgT3BWYWwoMCwgMCk7CisKKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IGdldCB0aGUgbG93IDE2IGJpdCBpbW1lZGlhdGUgZnJvbSBhIGJ1aWxkX3ZlY3RvcgorICAvLyBub2RlLgorICBhc3NlcnQoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IKKyAgICAgICAgICYmICJMTzE2X3ZlYyBnb3Qgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBCVUlMRF9WRUNUT1IiKTsKKworICAvLyBHZXQgZmlyc3QgY29uc3RhbnQgb3BlcmFuZC4uLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgICBPcFZhbC5nZXROb2RlKCkgPT0gMCAmJiBpICE9IGU7ICsraSkgeworICAgIGlmIChOLT5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpIGNvbnRpbnVlOworICAgIGlmIChPcFZhbC5nZXROb2RlKCkgPT0gMCkKKyAgICAgIE9wVmFsID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgfQorICAKKyAgYXNzZXJ0KE9wVmFsLmdldE5vZGUoKSAhPSAwICYmICJMTzE2X3ZlYyBkaWQgbm90IGxvY2F0ZSBhIDxkZWZpbmVkPiBub2RlIik7CisgIENvbnN0YW50U0ROb2RlICpDTiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wVmFsKTsKKyAgcmV0dXJuIGdldEkzMkltbSgodW5zaWduZWQpQ04tPmdldFpFeHRWYWx1ZSgpICYgMHhmZmZmKTsKK31dPjsKKworLy8gVHJhbnNmb3JtIGFuIGltbWVkaWF0ZSwgcmV0dXJuaW5nIHRoZSBoaWdoIDE2IGJpdHMgc2hpZnRlZCBkb3duOgorZGVmIEhJMTYgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIHJldHVybiBnZXRJMzJJbW0oKHVuc2lnbmVkKU4tPmdldFpFeHRWYWx1ZSgpID4+IDE2KTsKK31dPjsKKworLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IHNoaWZ0IHRoZSBoaWdoIDE2IGJpdCBpbW1lZGlhdGUgZnJvbSBhIGJ1aWxkX3ZlY3RvcgorLy8gbm9kZSBpbnRvIHRoZSBsb3cgMTYgYml0cywgYW5kIHJldHVybiBhIDE2LWJpdCBjb25zdGFudC4KK2RlZiBISTE2X3ZlYyA6IFNETm9kZVhGb3JtPHNjYWxhcl90b192ZWN0b3IsIFt7CisgIFNEVmFsdWUgT3BWYWwoMCwgMCk7CisKKyAgYXNzZXJ0KE4tPmdldE9wY29kZSgpID09IElTRDo6QlVJTERfVkVDVE9SCisgICAgICAgICAmJiAiSEkxNl92ZWMgZ290IHNvbWV0aGluZyBvdGhlciB0aGFuIGEgQlVJTERfVkVDVE9SIik7CisgIAorICAvLyBHZXQgZmlyc3QgY29uc3RhbnQgb3BlcmFuZC4uLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgICBPcFZhbC5nZXROb2RlKCkgPT0gMCAmJiBpICE9IGU7ICsraSkgeworICAgIGlmIChOLT5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpIGNvbnRpbnVlOworICAgIGlmIChPcFZhbC5nZXROb2RlKCkgPT0gMCkKKyAgICAgIE9wVmFsID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgfQorICAKKyAgYXNzZXJ0KE9wVmFsLmdldE5vZGUoKSAhPSAwICYmICJISTE2X3ZlYyBkaWQgbm90IGxvY2F0ZSBhIDxkZWZpbmVkPiBub2RlIik7CisgIENvbnN0YW50U0ROb2RlICpDTiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wVmFsKTsKKyAgcmV0dXJuIGdldEkzMkltbSgodW5zaWduZWQpQ04tPmdldFpFeHRWYWx1ZSgpID4+IDE2KTsKK31dPjsKKworLy8gc2ltbTcgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgaW1tZWRpYXRlIGZpdHMgaW4gYW4gNy1iaXQgc2lnbmVkCisvLyBmaWVsZC4KK2RlZiBzaW1tNzogUGF0TGVhZjwoaW1tKSwgW3sKKyAgaW50IHNleHRWYWwgPSBpbnQoTi0+Z2V0U0V4dFZhbHVlKCkpOworICByZXR1cm4gKHNleHRWYWwgPj0gLTY0ICYmIHNleHRWYWwgPD0gNjMpOworfV0+OworCisvLyB1aW1tNyBwcmVkaWNhdGUgLSBUcnVlIGlmIHRoZSBpbW1lZGlhdGUgZml0cyBpbiBhbiA3LWJpdCB1bnNpZ25lZAorLy8gZmllbGQuCitkZWYgdWltbTc6IFBhdExlYWY8KGltbSksIFt7CisgIHJldHVybiAoTi0+Z2V0WkV4dFZhbHVlKCkgPD0gMHg3Zik7Cit9XT47CisKKy8vIGltbVNFeHQ4IHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIGltbWVkaWF0ZSBmaXRzIGluIGFuIDgtYml0IHNpZ24gZXh0ZW5kZWQKKy8vIGZpZWxkLgorZGVmIGltbVNFeHQ4ICA6IFBhdExlYWY8KGltbSksIFt7CisgIGludCBWYWx1ZSA9IGludChOLT5nZXRTRXh0VmFsdWUoKSk7CisgIHJldHVybiAoVmFsdWUgPj0gLSgxIDw8IDgpICYmIFZhbHVlIDw9ICgxIDw8IDgpIC0gMSk7Cit9XT47CisKKy8vIGltbVU4OiBpbW1lZGlhdGUsIHVuc2lnbmVkIDgtYml0IHF1YW50aXR5CitkZWYgaW1tVTggOiBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gKE4tPmdldFpFeHRWYWx1ZSgpIDw9IDB4ZmYpOworfV0+OworCisvLyBpNjRJbW1TRXh0MTAgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgaTY0IGltbWVkaWF0ZSBmaXRzIGluIGEgMTAtYml0IHNpZ24KKy8vIGV4dGVuZGVkIGZpZWxkLiAgVXNlZCBieSBSSTEwRm9ybSBpbnN0cnVjdGlvbnMgbGlrZSAnbGRxJy4KK2RlZiBpNjRJbW1TRXh0MTAgIDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgcmV0dXJuIGlzSTY0SW50UzEwSW1tZWRpYXRlKE4pOworfV0+OworCisvLyBpMzJJbW1TRXh0MTAgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgaTMyIGltbWVkaWF0ZSBmaXRzIGluIGEgMTAtYml0IHNpZ24KKy8vIGV4dGVuZGVkIGZpZWxkLiAgVXNlZCBieSBSSTEwRm9ybSBpbnN0cnVjdGlvbnMgbGlrZSAnbGRxJy4KK2RlZiBpMzJJbW1TRXh0MTAgIDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgcmV0dXJuIGlzSTMySW50UzEwSW1tZWRpYXRlKE4pOworfV0+OworCisvLyBpMzJJbW1VbnMxMCBwcmVkaWNhdGUgLSBUcnVlIGlmIHRoZSBpMzIgaW1tZWRpYXRlIGZpdHMgaW4gYSAxMC1iaXQgdW5zaWduZWQKKy8vIGZpZWxkLiAgVXNlZCBieSBSSTEwRm9ybSBpbnN0cnVjdGlvbnMgbGlrZSAnbGRxJy4KK2RlZiBpMzJJbW1VbnMxMCAgOiBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gaXNJMzJJbnRVMTBJbW1lZGlhdGUoTik7Cit9XT47CisKKy8vIGkxNkltbVNFeHQxMCBwcmVkaWNhdGUgLSBUcnVlIGlmIHRoZSBpMTYgaW1tZWRpYXRlIGZpdHMgaW4gYSAxMC1iaXQgc2lnbgorLy8gZXh0ZW5kZWQgZmllbGQuICBVc2VkIGJ5IFJJMTBGb3JtIGluc3RydWN0aW9ucyBsaWtlICdsZHEnLgorZGVmIGkxNkltbVNFeHQxMCAgOiBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gaXNJMTZJbnRTMTBJbW1lZGlhdGUoTik7Cit9XT47CisKKy8vIGkxNkltbVVuczEwIHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIGkxNiBpbW1lZGlhdGUgZml0cyBpbnRvIGEgMTAtYml0IHVuc2lnbmVkCisvLyB2YWx1ZS4gVXNlZCBieSBSSTEwRm9ybSBpbnN0cnVjdGlvbnMuCitkZWYgaTE2SW1tVW5zMTAgOiBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gaXNJMTZJbnRVMTBJbW1lZGlhdGUoTik7Cit9XT47CisKK2RlZiBpbW1TRXh0MTYgIDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgLy8gaW1tU0V4dDE2IHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIGltbWVkaWF0ZSBmaXRzIGluIGEgMTYtYml0IHNpZ24gZXh0ZW5kZWQKKyAgLy8gZmllbGQuCisgIHNob3J0IElnbm9yZWQ7CisgIHJldHVybiBpc0ludFMxNkltbWVkaWF0ZShOLCBJZ25vcmVkKTsKK31dPjsKKworZGVmIGltbVpFeHQxNiAgOiBQYXRMZWFmPChpbW0pLCBbeworICAvLyBpbW1aRXh0MTYgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgaW1tZWRpYXRlIGZpdHMgaW4gYSAxNi1iaXQgemVybyBleHRlbmRlZAorICAvLyBmaWVsZC4KKyAgcmV0dXJuICh1aW50NjRfdClOLT5nZXRaRXh0VmFsdWUoKSA9PSAodW5zaWduZWQgc2hvcnQpTi0+Z2V0WkV4dFZhbHVlKCk7Cit9XSwgTE8xNj47CisKK2RlZiBpbW1VMTYgOiBQYXRMZWFmPChpbW0pLCBbeworICAvLyBpbW1VMTYgcHJlZGljYXRlLSBUcnVlIGlmIHRoZSBpbW1lZGlhdGUgZml0cyBpbnRvIGEgMTYtYml0IHVuc2lnbmVkIGZpZWxkLgorICByZXR1cm4gKHVpbnQ2NF90KU4tPmdldFpFeHRWYWx1ZSgpID09IChOLT5nZXRaRXh0VmFsdWUoKSAmIDB4ZmZmZik7Cit9XT47CisKK2RlZiBpbW0xOCAgOiBQYXRMZWFmPChpbW0pLCBbeworICAvLyBpbW0xOCBwcmVkaWNhdGU6IFRydWUgaWYgdGhlIGltbWVkaWF0ZSBmaXRzIGludG8gYW4gMTgtYml0IHVuc2lnbmVkIGZpZWxkLgorICBpbnQgVmFsdWUgPSAoaW50KSBOLT5nZXRaRXh0VmFsdWUoKTsKKyAgcmV0dXJuICgoVmFsdWUgJiAoKDEgPDwgMTkpIC0gMSkpID09IFZhbHVlKTsKK31dPjsKKworZGVmIGxvMTYgOiBQYXRMZWFmPChpbW0pLCBbeworICAvLyBsbzE2IHByZWRpY2F0ZSAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgaW1tZWRpYXRlIGhhcyBhbGwgemVyb3MgaW4gdGhlCisgIC8vIGxvdyBvcmRlciBiaXRzIGFuZCBpcyBhIDMyLWJpdCBjb25zdGFudDoKKyAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMikgeworICAgIHVpbnQzMl90IHZhbCA9IE4tPmdldFpFeHRWYWx1ZSgpOworICAgIHJldHVybiAoKHZhbCAmIDB4MDAwMGZmZmYpID09IHZhbCk7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9XSwgTE8xNj47CisKK2RlZiBoaTE2IDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgLy8gaGkxNiBwcmVkaWNhdGUgLSByZXR1cm5zIHRydWUgaWYgdGhlIGltbWVkaWF0ZSBoYXMgYWxsIHplcm9zIGluIHRoZQorICAvLyBsb3cgb3JkZXIgYml0cyBhbmQgaXMgYSAzMi1iaXQgY29uc3RhbnQ6CisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIpIHsKKyAgICB1aW50MzJfdCB2YWwgPSB1aW50MzJfdChOLT5nZXRaRXh0VmFsdWUoKSk7CisgICAgcmV0dXJuICgodmFsICYgMHhmZmZmMDAwMCkgPT0gdmFsKTsKKyAgfSBlbHNlIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppNjQpIHsKKyAgICB1aW50NjRfdCB2YWwgPSBOLT5nZXRaRXh0VmFsdWUoKTsKKyAgICByZXR1cm4gKCh2YWwgJiAweGZmZmYwMDAwVUxMKSA9PSB2YWwpOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfV0sIEhJMTY+OworCitkZWYgYml0c2hpZnQgOiBQYXRMZWFmPChpbW0pLCBbeworICAvLyBiaXRzaGlmdCBwcmVkaWNhdGUgLSByZXR1cm5zIHRydWUgaWYgMCA8IGltbSA8PSA3IGZvciBTSExRQklJCisgIC8vIChzaGlmdCBsZWZ0IHF1YWR3b3JkIGJ5IGJpdHMgaW1tZWRpYXRlKQorICBpbnQ2NF90IFZhbCA9IE4tPmdldFpFeHRWYWx1ZSgpOworICByZXR1cm4gKFZhbCA+IDAgJiYgVmFsIDw9IDcpOworfV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRmxvYXRpbmcgcG9pbnQgb3BlcmFuZHM6CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUcmFuc2Zvcm0gYSBmbG9hdCwgcmV0dXJuaW5nIHRoZSBoaWdoIDE2IGJpdHMgc2hpZnRlZCBkb3duLCBhcyBpZgorLy8gdGhlIGZsb2F0IHdhcyByZWFsbHkgYW4gdW5zaWduZWQgaW50ZWdlcjoKK2RlZiBISTE2X2YzMiA6IFNETm9kZVhGb3JtPGZwaW1tLCBbeworICBmbG9hdCBmdmFsID0gTi0+Z2V0VmFsdWVBUEYoKS5jb252ZXJ0VG9GbG9hdCgpOworICByZXR1cm4gZ2V0STMySW1tKEZsb2F0VG9CaXRzKGZ2YWwpID4+IDE2KTsKK31dPjsKKworLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gb24gZmxvYXRzOiBnZXQgdGhlIGxvdyAxNiBiaXRzIGFzIGlmIHRoZSBmbG9hdCB3YXMKKy8vIGFuIHVuc2lnbmVkIGludGVnZXIuCitkZWYgTE8xNl9mMzIgOiBTRE5vZGVYRm9ybTxmcGltbSwgW3sKKyAgZmxvYXQgZnZhbCA9IE4tPmdldFZhbHVlQVBGKCkuY29udmVydFRvRmxvYXQoKTsKKyAgcmV0dXJuIGdldEkzMkltbShGbG9hdFRvQml0cyhmdmFsKSAmIDB4ZmZmZik7Cit9XT47CisKK2RlZiBGUGltbV9zZXh0MTYgOiBTRE5vZGVYRm9ybTxmcGltbSwgW3sKKyAgZmxvYXQgZnZhbCA9IE4tPmdldFZhbHVlQVBGKCkuY29udmVydFRvRmxvYXQoKTsKKyAgcmV0dXJuIGdldEkzMkltbSgoaW50KSAoKEZsb2F0VG9CaXRzKGZ2YWwpIDw8IDE2KSA+PiAxNikpOworfV0+OworCitkZWYgRlBpbW1fdTE4IDogU0ROb2RlWEZvcm08ZnBpbW0sIFt7CisgIGZsb2F0IGZ2YWwgPSBOLT5nZXRWYWx1ZUFQRigpLmNvbnZlcnRUb0Zsb2F0KCk7CisgIHJldHVybiBnZXRJMzJJbW0oRmxvYXRUb0JpdHMoZnZhbCkgJiAoKDEgPDwgMTkpIC0gMSkpOworfV0+OworCitkZWYgZnBpbW1TRXh0MTYgOiBQYXRMZWFmPChmcGltbSksIFt7CisgIHNob3J0IElnbm9yZWQ7CisgIHJldHVybiBpc0ZQUzE2SW1tZWRpYXRlKE4sIElnbm9yZWQpOyAgCit9XSwgRlBpbW1fc2V4dDE2PjsKKworLy8gRG9lcyB0aGUgU0ZQIGNvbnN0YW50IG9ubHkgaGF2ZSB1cHAgMTYgYml0cyBzZXQ/CitkZWYgaGkxNl9mMzIgOiBQYXRMZWFmPChmcGltbSksIFt7CisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjpmMzIpIHsKKyAgICB1aW50MzJfdCB2YWwgPSBGbG9hdFRvQml0cyhOLT5nZXRWYWx1ZUFQRigpLmNvbnZlcnRUb0Zsb2F0KCkpOworICAgIHJldHVybiAoKHZhbCAmIDB4ZmZmZjAwMDApID09IHZhbCk7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9XSwgSEkxNl9mMzI+OworCisvLyBEb2VzIHRoZSBTRlAgY29uc3RhbnQgZml0IGludG8gMTggYml0cz8KK2RlZiBmcGltbTE4ICA6IFBhdExlYWY8KGZwaW1tKSwgW3sKKyAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmYzMikgeworICAgIHVpbnQzMl90IFZhbHVlID0gRmxvYXRUb0JpdHMoTi0+Z2V0VmFsdWVBUEYoKS5jb252ZXJ0VG9GbG9hdCgpKTsKKyAgICByZXR1cm4gKChWYWx1ZSAmICgoMSA8PCAxOSkgLSAxKSkgPT0gVmFsdWUpOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfV0sIEZQaW1tX3UxOD47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyA2NC1iaXQgb3BlcmFuZHMgKFRPRE8pOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIGJ1aWxkX3ZlY3RvciBvcGVyYW5kczoKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIHYxNmk4U0V4dDhJbW1feGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgYnVpbGRfdmVjdG9yIHRvIDgtYml0IHNpZ24gZXh0ZW5kZWQKKy8vIGltbWVkaWF0ZSBjb25zdGFudCBsb2FkIGZvciB2MTZpOCB2ZWN0b3JzLiBOLkIuOiBUaGUgaW5jb21pbmcgY29uc3RhbnQgaGFzCisvLyB0byBiZSBhIDE2LWJpdCBxdWFudGl0eSB3aXRoIHRoZSB1cHBlciBhbmQgbG93ZXIgYnl0ZXMgZXF1YWwgKGUuZy4sIDB4MmEyYSkuCitkZWYgdjE2aThTRXh0OEltbV94Zm9ybTogU0ROb2RlWEZvcm08YnVpbGRfdmVjdG9yLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2k4aW1tKE4sICpDdXJEQUcsIE1WVDo6aTgpOworfV0+OworCisvLyB2MTZpOFNFeHQ4SW1tOiBQcmVkaWNhdGUgdGVzdCBmb3IgOC1iaXQgc2lnbiBleHRlbmRlZCBpbW1lZGlhdGUgY29uc3RhbnQKKy8vIGxvYWQsIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggaXRzIHRyYW5zZm9ybSBmdW5jdGlvbi4gTi5CLjogVGhpcyByZWxpZXMgdGhlCisvLyBpbmNvbWluZyBjb25zdGFudCBiZWluZyBhIDE2LWJpdCBxdWFudGl0eSwgd2hlcmUgdGhlIHVwcGVyIGFuZCBsb3dlciBieXRlcworLy8gYXJlIEVYQUNUTFkgdGhlIHNhbWUgKGUuZy4sIDB4MmEyYSkKK2RlZiB2MTZpOFNFeHQ4SW1tOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2k4aW1tKE4sICpDdXJEQUcsIE1WVDo6aTgpLmdldE5vZGUoKSAhPSAwOworfV0sIHYxNmk4U0V4dDhJbW1feGZvcm0+OworCisvLyB2MTZpOFU4SW1tX3hmb3JtIGZ1bmN0aW9uOiBjb252ZXJ0IGJ1aWxkX3ZlY3RvciB0byB1bnNpZ25lZCA4LWJpdAorLy8gaW1tZWRpYXRlIGNvbnN0YW50IGxvYWQgZm9yIHYxNmk4IHZlY3RvcnMuIE4uQi46IFRoZSBpbmNvbWluZyBjb25zdGFudCBoYXMKKy8vIHRvIGJlIGEgMTYtYml0IHF1YW50aXR5IHdpdGggdGhlIHVwcGVyIGFuZCBsb3dlciBieXRlcyBlcXVhbCAoZS5nLiwgMHgyYTJhKS4KK2RlZiB2MTZpOFU4SW1tX3hmb3JtOiBTRE5vZGVYRm9ybTxidWlsZF92ZWN0b3IsIFt7CisgIHJldHVybiBTUFU6OmdldF92ZWNfaThpbW0oTiwgKkN1ckRBRywgTVZUOjppOCk7Cit9XT47CisKKy8vIHYxNmk4VThJbW06IFByZWRpY2F0ZSB0ZXN0IGZvciB1bnNpZ25lZCA4LWJpdCBpbW1lZGlhdGUgY29uc3RhbnQKKy8vIGxvYWQsIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggaXRzIHRyYW5zZm9ybSBmdW5jdGlvbi4gTi5CLjogVGhpcyByZWxpZXMgdGhlCisvLyBpbmNvbWluZyBjb25zdGFudCBiZWluZyBhIDE2LWJpdCBxdWFudGl0eSwgd2hlcmUgdGhlIHVwcGVyIGFuZCBsb3dlciBieXRlcworLy8gYXJlIEVYQUNUTFkgdGhlIHNhbWUgKGUuZy4sIDB4MmEyYSkKK2RlZiB2MTZpOFU4SW1tOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2k4aW1tKE4sICpDdXJEQUcsIE1WVDo6aTgpLmdldE5vZGUoKSAhPSAwOworfV0sIHYxNmk4VThJbW1feGZvcm0+OworCisvLyB2OGkxNlNFeHQ4SW1tX3hmb3JtIGZ1bmN0aW9uOiBjb252ZXJ0IGJ1aWxkX3ZlY3RvciB0byA4LWJpdCBzaWduIGV4dGVuZGVkCisvLyBpbW1lZGlhdGUgY29uc3RhbnQgbG9hZCBmb3IgdjhpMTYgdmVjdG9ycy4KK2RlZiB2OGkxNlNFeHQ4SW1tX3hmb3JtOiBTRE5vZGVYRm9ybTxidWlsZF92ZWN0b3IsIFt7CisgIHJldHVybiBTUFU6OmdldF92ZWNfaThpbW0oTiwgKkN1ckRBRywgTVZUOjppMTYpOworfV0+OworCisvLyB2OGkxNlNFeHQ4SW1tOiBQcmVkaWNhdGUgdGVzdCBmb3IgOC1iaXQgc2lnbiBleHRlbmRlZCBpbW1lZGlhdGUgY29uc3RhbnQKKy8vIGxvYWQsIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggaXRzIHRyYW5zZm9ybSBmdW5jdGlvbi4KK2RlZiB2OGkxNlNFeHQ4SW1tOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2k4aW1tKE4sICpDdXJEQUcsIE1WVDo6aTE2KS5nZXROb2RlKCkgIT0gMDsKK31dLCB2OGkxNlNFeHQ4SW1tX3hmb3JtPjsKKworLy8gdjhpMTZTRXh0MTBJbW1feGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgYnVpbGRfdmVjdG9yIHRvIDE2LWJpdCBzaWduIGV4dGVuZGVkCisvLyBpbW1lZGlhdGUgY29uc3RhbnQgbG9hZCBmb3IgdjhpMTYgdmVjdG9ycy4KK2RlZiB2OGkxNlNFeHQxMEltbV94Zm9ybTogU0ROb2RlWEZvcm08YnVpbGRfdmVjdG9yLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2kxMGltbShOLCAqQ3VyREFHLCBNVlQ6OmkxNik7Cit9XT47CisKKy8vIHY4aTE2U0V4dDEwSW1tOiBQcmVkaWNhdGUgdGVzdCBmb3IgMTYtYml0IHNpZ24gZXh0ZW5kZWQgaW1tZWRpYXRlIGNvbnN0YW50CisvLyBsb2FkLCB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIGl0cyB0cmFuc2Zvcm0gZnVuY3Rpb24uCitkZWYgdjhpMTZTRXh0MTBJbW06IFBhdExlYWY8KGJ1aWxkX3ZlY3RvciksIFt7CisgIHJldHVybiBTUFU6OmdldF92ZWNfaTEwaW1tKE4sICpDdXJEQUcsIE1WVDo6aTE2KS5nZXROb2RlKCkgIT0gMDsKK31dLCB2OGkxNlNFeHQxMEltbV94Zm9ybT47CisKKy8vIHY4aTE2VW5zMTBJbW1feGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgYnVpbGRfdmVjdG9yIHRvIDE2LWJpdCB1bnNpZ25lZAorLy8gaW1tZWRpYXRlIGNvbnN0YW50IGxvYWQgZm9yIHY4aTE2IHZlY3RvcnMuCitkZWYgdjhpMTZVbnMxMEltbV94Zm9ybTogU0ROb2RlWEZvcm08YnVpbGRfdmVjdG9yLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2kxMGltbShOLCAqQ3VyREFHLCBNVlQ6OmkxNik7Cit9XT47CisKKy8vIHY4aTE2VW5zMTBJbW06IFByZWRpY2F0ZSB0ZXN0IGZvciAxNi1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIGNvbnN0YW50CisvLyBsb2FkLCB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIGl0cyB0cmFuc2Zvcm0gZnVuY3Rpb24uCitkZWYgdjhpMTZVbnMxMEltbTogUGF0TGVhZjwoYnVpbGRfdmVjdG9yKSwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X3ZlY19pMTBpbW0oTiwgKkN1ckRBRywgTVZUOjppMTYpLmdldE5vZGUoKSAhPSAwOworfV0sIHY4aTE2VW5zMTBJbW1feGZvcm0+OworCisvLyB2OGkxNlNFeHQxNkltbV94Zm9ybSBmdW5jdGlvbjogY29udmVydCBidWlsZF92ZWN0b3IgdG8gMTYtYml0IHNpZ24gZXh0ZW5kZWQKKy8vIGltbWVkaWF0ZSBjb25zdGFudCBsb2FkIGZvciB2OGkxNiB2ZWN0b3JzLgorZGVmIHY4aTE2VW5zMTZJbW1feGZvcm06IFNETm9kZVhGb3JtPGJ1aWxkX3ZlY3RvciwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X3ZlY19pMTZpbW0oTiwgKkN1ckRBRywgTVZUOjppMTYpOworfV0+OworCisvLyB2OGkxNlNFeHQxNkltbTogUHJlZGljYXRlIHRlc3QgZm9yIDE2LWJpdCBzaWduIGV4dGVuZGVkIGltbWVkaWF0ZSBjb25zdGFudAorLy8gbG9hZCwgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCBpdHMgdHJhbnNmb3JtIGZ1bmN0aW9uLgorZGVmIHY4aTE2U0V4dDE2SW1tOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2kxNmltbShOLCAqQ3VyREFHLCBNVlQ6OmkxNikuZ2V0Tm9kZSgpICE9IDA7Cit9XSwgdjhpMTZVbnMxNkltbV94Zm9ybT47CisKKy8vIHY0aTMyU0V4dDEwSW1tX3hmb3JtIGZ1bmN0aW9uOiBjb252ZXJ0IGJ1aWxkX3ZlY3RvciB0byAxMC1iaXQgc2lnbiBleHRlbmRlZAorLy8gaW1tZWRpYXRlIGNvbnN0YW50IGxvYWQgZm9yIHY0aTMyIHZlY3RvcnMuCitkZWYgdjRpMzJTRXh0MTBJbW1feGZvcm06IFNETm9kZVhGb3JtPGJ1aWxkX3ZlY3RvciwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X3ZlY19pMTBpbW0oTiwgKkN1ckRBRywgTVZUOjppMzIpOworfV0+OworCisvLyB2NGkzMlNFeHQxMEltbTogUHJlZGljYXRlIHRlc3QgZm9yIDEwLWJpdCBzaWduIGV4dGVuZGVkIGltbWVkaWF0ZSBjb25zdGFudAorLy8gbG9hZCwgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCBpdHMgdHJhbnNmb3JtIGZ1bmN0aW9uLgorZGVmIHY0aTMyU0V4dDEwSW1tOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2kxMGltbShOLCAqQ3VyREFHLCBNVlQ6OmkzMikuZ2V0Tm9kZSgpICE9IDA7Cit9XSwgdjRpMzJTRXh0MTBJbW1feGZvcm0+OworCisvLyB2NGkzMlVuczEwSW1tX3hmb3JtIGZ1bmN0aW9uOiBjb252ZXJ0IGJ1aWxkX3ZlY3RvciB0byAxMC1iaXQgdW5zaWduZWQKKy8vIGltbWVkaWF0ZSBjb25zdGFudCBsb2FkIGZvciB2NGkzMiB2ZWN0b3JzLgorZGVmIHY0aTMyVW5zMTBJbW1feGZvcm06IFNETm9kZVhGb3JtPGJ1aWxkX3ZlY3RvciwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X3ZlY19pMTBpbW0oTiwgKkN1ckRBRywgTVZUOjppMzIpOworfV0+OworCisvLyB2NGkzMlVuczEwSW1tOiBQcmVkaWNhdGUgdGVzdCBmb3IgMTAtYml0IHVuc2lnbmVkIGltbWVkaWF0ZSBjb25zdGFudAorLy8gbG9hZCwgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCBpdHMgdHJhbnNmb3JtIGZ1bmN0aW9uLgorZGVmIHY0aTMyVW5zMTBJbW06IFBhdExlYWY8KGJ1aWxkX3ZlY3RvciksIFt7CisgIHJldHVybiBTUFU6OmdldF92ZWNfaTEwaW1tKE4sICpDdXJEQUcsIE1WVDo6aTMyKS5nZXROb2RlKCkgIT0gMDsKK31dLCB2NGkzMlVuczEwSW1tX3hmb3JtPjsKKworLy8gdjRpMzJTRXh0MTZJbW1feGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgYnVpbGRfdmVjdG9yIHRvIDE2LWJpdCBzaWduIGV4dGVuZGVkCisvLyBpbW1lZGlhdGUgY29uc3RhbnQgbG9hZCBmb3IgdjRpMzIgdmVjdG9ycy4KK2RlZiB2NGkzMlNFeHQxNkltbV94Zm9ybTogU0ROb2RlWEZvcm08YnVpbGRfdmVjdG9yLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2kxNmltbShOLCAqQ3VyREFHLCBNVlQ6OmkzMik7Cit9XT47CisKKy8vIHY0aTMyU0V4dDE2SW1tOiBQcmVkaWNhdGUgdGVzdCBmb3IgMTYtYml0IHNpZ24gZXh0ZW5kZWQgaW1tZWRpYXRlIGNvbnN0YW50CisvLyBsb2FkLCB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIGl0cyB0cmFuc2Zvcm0gZnVuY3Rpb24uCitkZWYgdjRpMzJTRXh0MTZJbW06IFBhdExlYWY8KGJ1aWxkX3ZlY3RvciksIFt7CisgIHJldHVybiBTUFU6OmdldF92ZWNfaTE2aW1tKE4sICpDdXJEQUcsIE1WVDo6aTMyKS5nZXROb2RlKCkgIT0gMDsKK31dLCB2NGkzMlNFeHQxNkltbV94Zm9ybT47CisKKy8vIHY0aTMyVW5zMThJbW1feGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgYnVpbGRfdmVjdG9yIHRvIDE4LWJpdCB1bnNpZ25lZAorLy8gaW1tZWRpYXRlIGNvbnN0YW50IGxvYWQgZm9yIHY0aTMyIHZlY3RvcnMuCitkZWYgdjRpMzJVbnMxOEltbV94Zm9ybTogU0ROb2RlWEZvcm08YnVpbGRfdmVjdG9yLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX3UxOGltbShOLCAqQ3VyREFHLCBNVlQ6OmkzMik7Cit9XT47CisKKy8vIHY0aTMyVW5zMThJbW06IFByZWRpY2F0ZSB0ZXN0IGZvciAxOC1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIGNvbnN0YW50IGxvYWQsCisvLyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIGl0cyB0cmFuc2Zvcm0gZnVuY3Rpb24uCitkZWYgdjRpMzJVbnMxOEltbTogUGF0TGVhZjwoYnVpbGRfdmVjdG9yKSwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X3ZlY191MThpbW0oTiwgKkN1ckRBRywgTVZUOjppMzIpLmdldE5vZGUoKSAhPSAwOworfV0sIHY0aTMyVW5zMThJbW1feGZvcm0+OworCisvLyBJTEhVdmVjX2dldF9pbW0geGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgYnVpbGRfdmVjdG9yIHRvIElMSFV2ZWMgaW1tIGNvbnN0YW50CisvLyBsb2FkLgorZGVmIElMSFV2ZWNfZ2V0X2ltbTogU0ROb2RlWEZvcm08YnVpbGRfdmVjdG9yLCBbeworICByZXR1cm4gU1BVOjpnZXRfSUxIVXZlY19pbW0oTiwgKkN1ckRBRywgTVZUOjppMzIpOworfV0+OworCisvLy8gaW1tSUxIVXZlYzogUHJlZGljYXRlIHRlc3QgZm9yIGEgSUxIVSBjb25zdGFudCB2ZWN0b3IuCitkZWYgaW1tSUxIVXZlYzogUGF0TGVhZjwoYnVpbGRfdmVjdG9yKSwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X0lMSFV2ZWNfaW1tKE4sICpDdXJEQUcsIE1WVDo6aTMyKS5nZXROb2RlKCkgIT0gMDsKK31dLCBJTEhVdmVjX2dldF9pbW0+OworCisvLyBDYXRjaC1hbGwgZm9yIGFueSBvdGhlciBpMzIgdmVjdG9yIGNvbnN0YW50cworZGVmIHY0aTMyX2dldF9pbW06IFNETm9kZVhGb3JtPGJ1aWxkX3ZlY3RvciwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X3Y0aTMyX2ltbShOLCAqQ3VyREFHKTsKK31dPjsKKworZGVmIHY0aTMySW1tOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbeworICByZXR1cm4gU1BVOjpnZXRfdjRpMzJfaW1tKE4sICpDdXJEQUcpLmdldE5vZGUoKSAhPSAwOworfV0sIHY0aTMyX2dldF9pbW0+OworCisvLyB2Mmk2NFNFeHQxMEltbV94Zm9ybSBmdW5jdGlvbjogY29udmVydCBidWlsZF92ZWN0b3IgdG8gMTAtYml0IHNpZ24gZXh0ZW5kZWQKKy8vIGltbWVkaWF0ZSBjb25zdGFudCBsb2FkIGZvciB2Mmk2NCB2ZWN0b3JzLgorZGVmIHYyaTY0U0V4dDEwSW1tX3hmb3JtOiBTRE5vZGVYRm9ybTxidWlsZF92ZWN0b3IsIFt7CisgIHJldHVybiBTUFU6OmdldF92ZWNfaTEwaW1tKE4sICpDdXJEQUcsIE1WVDo6aTY0KTsKK31dPjsKKworLy8gdjJpNjRTRXh0MTBJbW06IFByZWRpY2F0ZSB0ZXN0IGZvciAxMC1iaXQgc2lnbiBleHRlbmRlZCBpbW1lZGlhdGUgY29uc3RhbnQKKy8vIGxvYWQsIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggaXRzIHRyYW5zZm9ybSBmdW5jdGlvbi4KK2RlZiB2Mmk2NFNFeHQxMEltbTogUGF0TGVhZjwoYnVpbGRfdmVjdG9yKSwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X3ZlY19pMTBpbW0oTiwgKkN1ckRBRywgTVZUOjppNjQpLmdldE5vZGUoKSAhPSAwOworfV0sIHYyaTY0U0V4dDEwSW1tX3hmb3JtPjsKKworLy8gdjJpNjRTRXh0MTZJbW1feGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgYnVpbGRfdmVjdG9yIHRvIDE2LWJpdCBzaWduIGV4dGVuZGVkCisvLyBpbW1lZGlhdGUgY29uc3RhbnQgbG9hZCBmb3IgdjJpNjQgdmVjdG9ycy4KK2RlZiB2Mmk2NFNFeHQxNkltbV94Zm9ybTogU0ROb2RlWEZvcm08YnVpbGRfdmVjdG9yLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX2kxNmltbShOLCAqQ3VyREFHLCBNVlQ6Omk2NCk7Cit9XT47CisKKy8vIHYyaTY0U0V4dDE2SW1tOiBQcmVkaWNhdGUgdGVzdCBmb3IgMTYtYml0IHNpZ24gZXh0ZW5kZWQgaW1tZWRpYXRlIGNvbnN0YW50CisvLyBsb2FkLCB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIGl0cyB0cmFuc2Zvcm0gZnVuY3Rpb24uCitkZWYgdjJpNjRTRXh0MTZJbW06IFBhdExlYWY8KGJ1aWxkX3ZlY3RvciksIFt7CisgIHJldHVybiBTUFU6OmdldF92ZWNfaTE2aW1tKE4sICpDdXJEQUcsIE1WVDo6aTY0KS5nZXROb2RlKCkgIT0gMDsKK31dLCB2Mmk2NFNFeHQxNkltbV94Zm9ybT47CisKKy8vIHYyaTY0VW5zMThJbW1feGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgYnVpbGRfdmVjdG9yIHRvIDE4LWJpdCB1bnNpZ25lZAorLy8gaW1tZWRpYXRlIGNvbnN0YW50IGxvYWQgZm9yIHYyaTY0IHZlY3RvcnMuCitkZWYgdjJpNjRVbnMxOEltbV94Zm9ybTogU0ROb2RlWEZvcm08YnVpbGRfdmVjdG9yLCBbeworICByZXR1cm4gU1BVOjpnZXRfdmVjX3UxOGltbShOLCAqQ3VyREFHLCBNVlQ6Omk2NCk7Cit9XT47CisKKy8vIHYyaTY0VW5zMThJbW06IFByZWRpY2F0ZSB0ZXN0IGZvciAxOC1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIGNvbnN0YW50IGxvYWQsCisvLyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIGl0cyB0cmFuc2Zvcm0gZnVuY3Rpb24uCitkZWYgdjJpNjRVbnMxOEltbTogUGF0TGVhZjwoYnVpbGRfdmVjdG9yKSwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X3ZlY191MThpbW0oTiwgKkN1ckRBRywgTVZUOjppNjQpLmdldE5vZGUoKSAhPSAwOworfV0sIHYyaTY0VW5zMThJbW1feGZvcm0+OworCisvLy8gaW1tSUxIVXZlYzogUHJlZGljYXRlIHRlc3QgZm9yIGEgSUxIVSBjb25zdGFudCB2ZWN0b3IuCitkZWYgaW1tSUxIVXZlY19pNjQ6IFBhdExlYWY8KGJ1aWxkX3ZlY3RvciksIFt7CisgIHJldHVybiBTUFU6OmdldF9JTEhVdmVjX2ltbShOLCAqQ3VyREFHLCBNVlQ6Omk2NCkuZ2V0Tm9kZSgpICE9IDA7Cit9XSwgSUxIVXZlY19nZXRfaW1tPjsKKworLy8gQ2F0Y2gtYWxsIGZvciBhbnkgb3RoZXIgaTMyIHZlY3RvciBjb25zdGFudHMKK2RlZiB2Mmk2NF9nZXRfaW1tOiBTRE5vZGVYRm9ybTxidWlsZF92ZWN0b3IsIFt7CisgIHJldHVybiBTUFU6OmdldF92Mmk2NF9pbW0oTiwgKkN1ckRBRyk7Cit9XT47CisKK2RlZiB2Mmk2NEltbTogUGF0TGVhZjwoYnVpbGRfdmVjdG9yKSwgW3sKKyAgcmV0dXJuIFNQVTo6Z2V0X3YyaTY0X2ltbShOLCAqQ3VyREFHKS5nZXROb2RlKCkgIT0gMDsKK31dLCB2Mmk2NF9nZXRfaW1tPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE9wZXJhbmQgRGVmaW5pdGlvbnMuCisKK2RlZiBzN2ltbTogT3BlcmFuZDxpOD4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTN0ltbU9wZXJhbmQiOworfQorCitkZWYgczdpbW1faTg6IE9wZXJhbmQ8aTg+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UzdJbW1PcGVyYW5kIjsKK30KKworZGVmIHU3aW1tOiBPcGVyYW5kPGkxNj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRVN0ltbU9wZXJhbmQiOworfQorCitkZWYgdTdpbW1faTg6IE9wZXJhbmQ8aTg+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VTdJbW1PcGVyYW5kIjsKK30KKworZGVmIHU3aW1tX2kzMjogT3BlcmFuZDxpMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VTdJbW1PcGVyYW5kIjsKK30KKworLy8gSGFsZndvcmQsIHNpZ25lZCAxMC1iaXQgY29uc3RhbnQKK2RlZiBzMTBpbW0gOiBPcGVyYW5kPGkxNj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTMTBJbW1PcGVyYW5kIjsKK30KKworZGVmIHMxMGltbV9pODogT3BlcmFuZDxpOD4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTMTBJbW1PcGVyYW5kIjsKK30KKworZGVmIHMxMGltbV9pMzI6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFMxMEltbU9wZXJhbmQiOworfQorCitkZWYgczEwaW1tX2k2NDogT3BlcmFuZDxpNjQ+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UzEwSW1tT3BlcmFuZCI7Cit9CisKKy8vIFVuc2lnbmVkIDEwLWJpdCBpbnRlZ2VyczoKK2RlZiB1MTBpbW06IE9wZXJhbmQ8aTE2PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFUxMEltbU9wZXJhbmQiOworfQorCitkZWYgdTEwaW1tX2k4OiBPcGVyYW5kPGk4PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFUxMEltbU9wZXJhbmQiOworfQorCitkZWYgdTEwaW1tX2kzMjogT3BlcmFuZDxpMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VTEwSW1tT3BlcmFuZCI7Cit9CisKK2RlZiBzMTZpbW0gIDogT3BlcmFuZDxpMTY+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UzE2SW1tT3BlcmFuZCI7Cit9CisKK2RlZiBzMTZpbW1faTg6IE9wZXJhbmQ8aTg+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UzE2SW1tT3BlcmFuZCI7Cit9CisKK2RlZiBzMTZpbW1faTMyOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTMTZJbW1PcGVyYW5kIjsKK30KKworZGVmIHMxNmltbV9pNjQ6IE9wZXJhbmQ8aTY0PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFMxNkltbU9wZXJhbmQiOworfQorCitkZWYgczE2aW1tX2YzMjogT3BlcmFuZDxmMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UzE2SW1tT3BlcmFuZCI7Cit9CisKK2RlZiBzMTZpbW1fZjY0OiBPcGVyYW5kPGY2ND4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTMTZJbW1PcGVyYW5kIjsKK30KKworZGVmIHUxNmltbV9pNjQgOiBPcGVyYW5kPGk2ND4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRVMTZJbW1PcGVyYW5kIjsKK30KKworZGVmIHUxNmltbV9pMzIgOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRVMTZJbW1PcGVyYW5kIjsKK30KKworZGVmIHUxNmltbSA6IE9wZXJhbmQ8aTE2PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFUxNkltbU9wZXJhbmQiOworfQorCitkZWYgZjE2aW1tIDogT3BlcmFuZDxmMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VTE2SW1tT3BlcmFuZCI7Cit9CisKK2RlZiBzMThpbW0gIDogT3BlcmFuZDxpMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UzE4SW1tT3BlcmFuZCI7Cit9CisKK2RlZiB1MThpbW0gOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRVMThJbW1PcGVyYW5kIjsKK30KKworZGVmIHUxOGltbV9pNjQgOiBPcGVyYW5kPGk2ND4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRVMThJbW1PcGVyYW5kIjsKK30KKworZGVmIGYxOGltbSA6IE9wZXJhbmQ8ZjMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFUxOEltbU9wZXJhbmQiOworfQorCitkZWYgZjE4aW1tX2Y2NCA6IE9wZXJhbmQ8ZjY0PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFUxOEltbU9wZXJhbmQiOworfQorCisvLyBOZWdhdGVkIDctYml0IGhhbGZ3b3JkIHJvdGF0ZSBpbW1lZGlhdGUgb3BlcmFuZHMKK2RlZiByb3RoTmVnN2ltbSA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFJPVEhOZWc3SW1tIjsKK30KKworZGVmIHJvdGhOZWc3aW1tX2kxNiA6IE9wZXJhbmQ8aTE2PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFJPVEhOZWc3SW1tIjsKK30KKworLy8gTmVnYXRlZCA3LWJpdCB3b3JkIHJvdGF0ZSBpbW1lZGlhdGUgb3BlcmFuZHMKK2RlZiByb3ROZWc3aW1tIDogT3BlcmFuZDxpMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50Uk9UTmVnN0ltbSI7Cit9CisKK2RlZiByb3ROZWc3aW1tX2kxNiA6IE9wZXJhbmQ8aTE2PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFJPVE5lZzdJbW0iOworfQorCitkZWYgcm90TmVnN2ltbV9pOCA6IE9wZXJhbmQ8aTg+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50Uk9UTmVnN0ltbSI7Cit9CisKK2RlZiB0YXJnZXQgOiBPcGVyYW5kPE90aGVyVlQ+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50QnJhbmNoT3BlcmFuZCI7Cit9CisKKy8vIEFic29sdXRlIGFkZHJlc3MgY2FsbCB0YXJnZXQKK2RlZiBjYWxsdGFyZ2V0IDogT3BlcmFuZDxpUFRSPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludENhbGxPcGVyYW5kIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIHUxOGltbTokY2FsbGRlc3QpOworfQorCisvLyBQQyByZWxhdGl2ZSBjYWxsIHRhcmdldAorZGVmIHJlbGNhbGx0YXJnZXQgOiBPcGVyYW5kPGlQVFI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UENSZWxhdGl2ZU9wZXJhbmQiOworICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgczE2aW1tOiRjYWxsZGVzdCk7Cit9CisKKy8vIEJyYW5jaCB0YXJnZXRzOgorZGVmIGJydGFyZ2V0IDogT3BlcmFuZDxPdGhlclZUPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFBDUmVsYXRpdmVPcGVyYW5kIjsKK30KKworLy8gSGludCBmb3IgYnJhbmNoIHRhcmdldAorZGVmIGhicnRhcmdldCA6IE9wZXJhbmQ8T3RoZXJWVD4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRIQlJPcGVyYW5kIjsKK30KKworLy8gSW5kaXJlY3QgY2FsbCB0YXJnZXQKK2RlZiBpbmRjYWxsdGFyZ2V0IDogT3BlcmFuZDxpUFRSPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludENhbGxPcGVyYW5kIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIHB0cl9yYzokY2FsbGRlc3QpOworfQorCitkZWYgc3ltYm9sSGk6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFN5bWJvbEhpIjsKK30KKworZGVmIHN5bWJvbExvOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTeW1ib2xMbyI7Cit9CisKK2RlZiBzeW1ib2xMU0E6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFN5bWJvbExTQSI7Cit9CisKKy8vIFNodWZmbGUgYWRkcmVzcyBtZW1vcnkgb3BlcmFhbmQgW3M3aW1tKHJlZykgZC1mb3JtYXRdCitkZWYgc2h1ZmFkZHIgOiBPcGVyYW5kPGlQVFI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50U2h1ZkFkZHIiOworICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgczdpbW06JGltbSwgcHRyX3JjOiRyZWcpOworfQorCisvLyBtZW1vcnkgczEwaW1tKHJlZykgb3BlcmFuZAorZGVmIGRmb3JtYWRkciA6IE9wZXJhbmQ8aVBUUj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRERm9ybUFkZHIiOworICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgczEwaW1tOiRpbW0sIHB0cl9yYzokcmVnKTsKK30KKworLy8gMjU2SyBsb2NhbCBzdG9yZSBhZGRyZXNzCisvLyBOLkIuOiBUaGUgdGJsZ2VuIGNvZGUgZ2VuZXJhdG9yIGV4cGVjdHMgdG8gaGF2ZSB0d28gb3BlcmFuZHMsIGFuIG9mZnNldAorLy8gYW5kIGEgcG9pbnRlci4gT2YgdGhlc2UsIG9ubHkgdGhlIGltbWVkaWF0ZSBpcyBhY3R1YWxseSB1c2VkLgorZGVmIGFkZHIyNTZrIDogT3BlcmFuZDxpUFRSPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludEFkZHIyNTZLIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIHMxNmltbTokaW1tLCBwdHJfcmM6JHJlZyk7Cit9CisKKy8vIG1lbW9yeSBzMThpbW0ocmVnKSBvcGVyYW5kCitkZWYgbWVtcmkxOCA6IE9wZXJhbmQ8aVBUUj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRNZW1SZWdJbW1TMTgiOworICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgczE4aW1tOiRpbW0sIHB0cl9yYzokcmVnKTsKK30KKworLy8gbWVtb3J5IHJlZ2lzdGVyICsgcmVnaXN0ZXIgb3BlcmFuZAorZGVmIG1lbXJyIDogT3BlcmFuZDxpUFRSPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludE1lbVJlZ1JlZyI7CisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBwdHJfcmM6JHJlZ19hLCBwdHJfcmM6JHJlZ19iKTsKK30KKworLy8gRGVmaW5lIFNQVS1zcGVjaWZpYyBhZGRyZXNzaW5nIG1vZGVzOiBUaGVzZSBjb21lIGluIHRocmVlIGJhc2ljCisvLyBmbGF2b3JzOgorLy8KKy8vIEQtZm9ybSAgIDogW3IrSTEwXSAoMTAtYml0IHNpZ25lZCBvZmZzZXQgKyByZWcpCisvLyBYLWZvcm0gICA6IFtyK3JdICAgKHJlZytyZWcpCisvLyBBLWZvcm0gICA6IGFicyAgICAgKDI1NksgTFNBIG9mZnNldCkKKy8vIEQtZm9ybSgyKTogW3IrSTddICAoNy1iaXQgc2lnbmVkIG9mZnNldCArIHJlZykKKworZGVmIGRmb3JtX2FkZHIgICA6IENvbXBsZXhQYXR0ZXJuPGlQVFIsIDIsICJTZWxlY3RERm9ybUFkZHIiLCAgICAgW10sIFtdPjsKK2RlZiB4Zm9ybV9hZGRyICAgOiBDb21wbGV4UGF0dGVybjxpUFRSLCAyLCAiU2VsZWN0WEZvcm1BZGRyIiwgICAgIFtdLCBbXT47CitkZWYgYWZvcm1fYWRkciAgIDogQ29tcGxleFBhdHRlcm48aVBUUiwgMiwgIlNlbGVjdEFGb3JtQWRkciIsICAgICBbXSwgW10+OworZGVmIGRmb3JtMl9hZGRyICA6IENvbXBsZXhQYXR0ZXJuPGlQVFIsIDIsICJTZWxlY3RERm9ybTJBZGRyIiwgICAgW10sIFtdPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVSZWdpc3RlckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVJlZ2lzdGVySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyN2Q1NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVSZWdpc3RlckluZm8uY3BwCkBAIC0wLDAgKzEsNjIxIEBACisvLz09PS0gU1BVUmVnaXN0ZXJJbmZvLmNwcCAtIENlbGwgU1BVIFJlZ2lzdGVyIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQ2VsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicmVnaW5mbyIKKyNpbmNsdWRlICJTUFUuaCIKKyNpbmNsdWRlICJTUFVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJTUFVSZWdpc3Rlck5hbWVzLmgiCisjaW5jbHVkZSAiU1BVSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAiU1BVU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiU1BVTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAiU1BVRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1JlZ2lzdGVyU2NhdmVuZ2luZy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBnZXRSZWdpc3Rlck51bWJlcmluZyAtIEdpdmVuIHRoZSBlbnVtIHZhbHVlIGZvciBzb21lIHJlZ2lzdGVyLCBlLmcuCisvLy8gUFBDOjpGMTQsIHJldHVybiB0aGUgbnVtYmVyIHRoYXQgaXQgY29ycmVzcG9uZHMgdG8gKGUuZy4gMTQpLgordW5zaWduZWQgU1BVUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyh1bnNpZ25lZCBSZWdFbnVtKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBTUFU7CisgIHN3aXRjaCAoUmVnRW51bSkgeworICBjYXNlIFNQVTo6UjA6IHJldHVybiAwOworICBjYXNlIFNQVTo6UjE6IHJldHVybiAxOworICBjYXNlIFNQVTo6UjI6IHJldHVybiAyOworICBjYXNlIFNQVTo6UjM6IHJldHVybiAzOworICBjYXNlIFNQVTo6UjQ6IHJldHVybiA0OworICBjYXNlIFNQVTo6UjU6IHJldHVybiA1OworICBjYXNlIFNQVTo6UjY6IHJldHVybiA2OworICBjYXNlIFNQVTo6Ujc6IHJldHVybiA3OworICBjYXNlIFNQVTo6Ujg6IHJldHVybiA4OworICBjYXNlIFNQVTo6Ujk6IHJldHVybiA5OworICBjYXNlIFNQVTo6UjEwOiByZXR1cm4gMTA7CisgIGNhc2UgU1BVOjpSMTE6IHJldHVybiAxMTsKKyAgY2FzZSBTUFU6OlIxMjogcmV0dXJuIDEyOworICBjYXNlIFNQVTo6UjEzOiByZXR1cm4gMTM7CisgIGNhc2UgU1BVOjpSMTQ6IHJldHVybiAxNDsKKyAgY2FzZSBTUFU6OlIxNTogcmV0dXJuIDE1OworICBjYXNlIFNQVTo6UjE2OiByZXR1cm4gMTY7CisgIGNhc2UgU1BVOjpSMTc6IHJldHVybiAxNzsKKyAgY2FzZSBTUFU6OlIxODogcmV0dXJuIDE4OworICBjYXNlIFNQVTo6UjE5OiByZXR1cm4gMTk7CisgIGNhc2UgU1BVOjpSMjA6IHJldHVybiAyMDsKKyAgY2FzZSBTUFU6OlIyMTogcmV0dXJuIDIxOworICBjYXNlIFNQVTo6UjIyOiByZXR1cm4gMjI7CisgIGNhc2UgU1BVOjpSMjM6IHJldHVybiAyMzsKKyAgY2FzZSBTUFU6OlIyNDogcmV0dXJuIDI0OworICBjYXNlIFNQVTo6UjI1OiByZXR1cm4gMjU7CisgIGNhc2UgU1BVOjpSMjY6IHJldHVybiAyNjsKKyAgY2FzZSBTUFU6OlIyNzogcmV0dXJuIDI3OworICBjYXNlIFNQVTo6UjI4OiByZXR1cm4gMjg7CisgIGNhc2UgU1BVOjpSMjk6IHJldHVybiAyOTsKKyAgY2FzZSBTUFU6OlIzMDogcmV0dXJuIDMwOworICBjYXNlIFNQVTo6UjMxOiByZXR1cm4gMzE7CisgIGNhc2UgU1BVOjpSMzI6IHJldHVybiAzMjsKKyAgY2FzZSBTUFU6OlIzMzogcmV0dXJuIDMzOworICBjYXNlIFNQVTo6UjM0OiByZXR1cm4gMzQ7CisgIGNhc2UgU1BVOjpSMzU6IHJldHVybiAzNTsKKyAgY2FzZSBTUFU6OlIzNjogcmV0dXJuIDM2OworICBjYXNlIFNQVTo6UjM3OiByZXR1cm4gMzc7CisgIGNhc2UgU1BVOjpSMzg6IHJldHVybiAzODsKKyAgY2FzZSBTUFU6OlIzOTogcmV0dXJuIDM5OworICBjYXNlIFNQVTo6UjQwOiByZXR1cm4gNDA7CisgIGNhc2UgU1BVOjpSNDE6IHJldHVybiA0MTsKKyAgY2FzZSBTUFU6OlI0MjogcmV0dXJuIDQyOworICBjYXNlIFNQVTo6UjQzOiByZXR1cm4gNDM7CisgIGNhc2UgU1BVOjpSNDQ6IHJldHVybiA0NDsKKyAgY2FzZSBTUFU6OlI0NTogcmV0dXJuIDQ1OworICBjYXNlIFNQVTo6UjQ2OiByZXR1cm4gNDY7CisgIGNhc2UgU1BVOjpSNDc6IHJldHVybiA0NzsKKyAgY2FzZSBTUFU6OlI0ODogcmV0dXJuIDQ4OworICBjYXNlIFNQVTo6UjQ5OiByZXR1cm4gNDk7CisgIGNhc2UgU1BVOjpSNTA6IHJldHVybiA1MDsKKyAgY2FzZSBTUFU6OlI1MTogcmV0dXJuIDUxOworICBjYXNlIFNQVTo6UjUyOiByZXR1cm4gNTI7CisgIGNhc2UgU1BVOjpSNTM6IHJldHVybiA1MzsKKyAgY2FzZSBTUFU6OlI1NDogcmV0dXJuIDU0OworICBjYXNlIFNQVTo6UjU1OiByZXR1cm4gNTU7CisgIGNhc2UgU1BVOjpSNTY6IHJldHVybiA1NjsKKyAgY2FzZSBTUFU6OlI1NzogcmV0dXJuIDU3OworICBjYXNlIFNQVTo6UjU4OiByZXR1cm4gNTg7CisgIGNhc2UgU1BVOjpSNTk6IHJldHVybiA1OTsKKyAgY2FzZSBTUFU6OlI2MDogcmV0dXJuIDYwOworICBjYXNlIFNQVTo6UjYxOiByZXR1cm4gNjE7CisgIGNhc2UgU1BVOjpSNjI6IHJldHVybiA2MjsKKyAgY2FzZSBTUFU6OlI2MzogcmV0dXJuIDYzOworICBjYXNlIFNQVTo6UjY0OiByZXR1cm4gNjQ7CisgIGNhc2UgU1BVOjpSNjU6IHJldHVybiA2NTsKKyAgY2FzZSBTUFU6OlI2NjogcmV0dXJuIDY2OworICBjYXNlIFNQVTo6UjY3OiByZXR1cm4gNjc7CisgIGNhc2UgU1BVOjpSNjg6IHJldHVybiA2ODsKKyAgY2FzZSBTUFU6OlI2OTogcmV0dXJuIDY5OworICBjYXNlIFNQVTo6UjcwOiByZXR1cm4gNzA7CisgIGNhc2UgU1BVOjpSNzE6IHJldHVybiA3MTsKKyAgY2FzZSBTUFU6OlI3MjogcmV0dXJuIDcyOworICBjYXNlIFNQVTo6UjczOiByZXR1cm4gNzM7CisgIGNhc2UgU1BVOjpSNzQ6IHJldHVybiA3NDsKKyAgY2FzZSBTUFU6OlI3NTogcmV0dXJuIDc1OworICBjYXNlIFNQVTo6Ujc2OiByZXR1cm4gNzY7CisgIGNhc2UgU1BVOjpSNzc6IHJldHVybiA3NzsKKyAgY2FzZSBTUFU6OlI3ODogcmV0dXJuIDc4OworICBjYXNlIFNQVTo6Ujc5OiByZXR1cm4gNzk7CisgIGNhc2UgU1BVOjpSODA6IHJldHVybiA4MDsKKyAgY2FzZSBTUFU6OlI4MTogcmV0dXJuIDgxOworICBjYXNlIFNQVTo6UjgyOiByZXR1cm4gODI7CisgIGNhc2UgU1BVOjpSODM6IHJldHVybiA4MzsKKyAgY2FzZSBTUFU6OlI4NDogcmV0dXJuIDg0OworICBjYXNlIFNQVTo6Ujg1OiByZXR1cm4gODU7CisgIGNhc2UgU1BVOjpSODY6IHJldHVybiA4NjsKKyAgY2FzZSBTUFU6OlI4NzogcmV0dXJuIDg3OworICBjYXNlIFNQVTo6Ujg4OiByZXR1cm4gODg7CisgIGNhc2UgU1BVOjpSODk6IHJldHVybiA4OTsKKyAgY2FzZSBTUFU6OlI5MDogcmV0dXJuIDkwOworICBjYXNlIFNQVTo6UjkxOiByZXR1cm4gOTE7CisgIGNhc2UgU1BVOjpSOTI6IHJldHVybiA5MjsKKyAgY2FzZSBTUFU6OlI5MzogcmV0dXJuIDkzOworICBjYXNlIFNQVTo6Ujk0OiByZXR1cm4gOTQ7CisgIGNhc2UgU1BVOjpSOTU6IHJldHVybiA5NTsKKyAgY2FzZSBTUFU6OlI5NjogcmV0dXJuIDk2OworICBjYXNlIFNQVTo6Ujk3OiByZXR1cm4gOTc7CisgIGNhc2UgU1BVOjpSOTg6IHJldHVybiA5ODsKKyAgY2FzZSBTUFU6OlI5OTogcmV0dXJuIDk5OworICBjYXNlIFNQVTo6UjEwMDogcmV0dXJuIDEwMDsKKyAgY2FzZSBTUFU6OlIxMDE6IHJldHVybiAxMDE7CisgIGNhc2UgU1BVOjpSMTAyOiByZXR1cm4gMTAyOworICBjYXNlIFNQVTo6UjEwMzogcmV0dXJuIDEwMzsKKyAgY2FzZSBTUFU6OlIxMDQ6IHJldHVybiAxMDQ7CisgIGNhc2UgU1BVOjpSMTA1OiByZXR1cm4gMTA1OworICBjYXNlIFNQVTo6UjEwNjogcmV0dXJuIDEwNjsKKyAgY2FzZSBTUFU6OlIxMDc6IHJldHVybiAxMDc7CisgIGNhc2UgU1BVOjpSMTA4OiByZXR1cm4gMTA4OworICBjYXNlIFNQVTo6UjEwOTogcmV0dXJuIDEwOTsKKyAgY2FzZSBTUFU6OlIxMTA6IHJldHVybiAxMTA7CisgIGNhc2UgU1BVOjpSMTExOiByZXR1cm4gMTExOworICBjYXNlIFNQVTo6UjExMjogcmV0dXJuIDExMjsKKyAgY2FzZSBTUFU6OlIxMTM6IHJldHVybiAxMTM7CisgIGNhc2UgU1BVOjpSMTE0OiByZXR1cm4gMTE0OworICBjYXNlIFNQVTo6UjExNTogcmV0dXJuIDExNTsKKyAgY2FzZSBTUFU6OlIxMTY6IHJldHVybiAxMTY7CisgIGNhc2UgU1BVOjpSMTE3OiByZXR1cm4gMTE3OworICBjYXNlIFNQVTo6UjExODogcmV0dXJuIDExODsKKyAgY2FzZSBTUFU6OlIxMTk6IHJldHVybiAxMTk7CisgIGNhc2UgU1BVOjpSMTIwOiByZXR1cm4gMTIwOworICBjYXNlIFNQVTo6UjEyMTogcmV0dXJuIDEyMTsKKyAgY2FzZSBTUFU6OlIxMjI6IHJldHVybiAxMjI7CisgIGNhc2UgU1BVOjpSMTIzOiByZXR1cm4gMTIzOworICBjYXNlIFNQVTo6UjEyNDogcmV0dXJuIDEyNDsKKyAgY2FzZSBTUFU6OlIxMjU6IHJldHVybiAxMjU7CisgIGNhc2UgU1BVOjpSMTI2OiByZXR1cm4gMTI2OworICBjYXNlIFNQVTo6UjEyNzogcmV0dXJuIDEyNzsKKyAgZGVmYXVsdDoKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlVuaGFuZGxlZCByZWcgaW4gU1BVUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyIpOworICB9Cit9CisKK1NQVVJlZ2lzdGVySW5mbzo6U1BVUmVnaXN0ZXJJbmZvKGNvbnN0IFNQVVN1YnRhcmdldCAmc3VidGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpIDoKKyAgU1BVR2VuUmVnaXN0ZXJJbmZvKFNQVTo6QURKQ0FMTFNUQUNLRE9XTiwgU1BVOjpBREpDQUxMU1RBQ0tVUCksCisgIFN1YnRhcmdldChzdWJ0YXJnZXQpLAorICBUSUkodGlpKQoreworfQorCisvLy8gZ2V0UG9pbnRlclJlZ0NsYXNzIC0gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyB0byB1c2UgdG8gaG9sZCBwb2ludGVycy4KKy8vLyBUaGlzIGlzIHVzZWQgZm9yIGFkZHJlc3NpbmcgbW9kZXMuCitjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKK1NQVVJlZ2lzdGVySW5mbzo6Z2V0UG9pbnRlclJlZ0NsYXNzKHVuc2lnbmVkIEtpbmQpIGNvbnN0IHsKKyAgcmV0dXJuICZTUFU6OlIzMkNSZWdDbGFzczsKK30KKworY29uc3QgdW5zaWduZWQgKgorU1BVUmVnaXN0ZXJJbmZvOjpnZXRDYWxsZWVTYXZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRikgY29uc3QKK3sKKyAgLy8gQ2VsbCBBQkkgY2FsbGluZyBjb252ZW50aW9uCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTUFVfQ2FsbGVlU2F2ZVJlZ3NbXSA9IHsKKyAgICBTUFU6OlI4MCwgU1BVOjpSODEsIFNQVTo6UjgyLCBTUFU6OlI4MywKKyAgICBTUFU6OlI4NCwgU1BVOjpSODUsIFNQVTo6Ujg2LCBTUFU6OlI4NywKKyAgICBTUFU6OlI4OCwgU1BVOjpSODksIFNQVTo6UjkwLCBTUFU6OlI5MSwKKyAgICBTUFU6OlI5MiwgU1BVOjpSOTMsIFNQVTo6Ujk0LCBTUFU6OlI5NSwKKyAgICBTUFU6OlI5NiwgU1BVOjpSOTcsIFNQVTo6Ujk4LCBTUFU6OlI5OSwKKyAgICBTUFU6OlIxMDAsIFNQVTo6UjEwMSwgU1BVOjpSMTAyLCBTUFU6OlIxMDMsCisgICAgU1BVOjpSMTA0LCBTUFU6OlIxMDUsIFNQVTo6UjEwNiwgU1BVOjpSMTA3LAorICAgIFNQVTo6UjEwOCwgU1BVOjpSMTA5LCBTUFU6OlIxMTAsIFNQVTo6UjExMSwKKyAgICBTUFU6OlIxMTIsIFNQVTo6UjExMywgU1BVOjpSMTE0LCBTUFU6OlIxMTUsCisgICAgU1BVOjpSMTE2LCBTUFU6OlIxMTcsIFNQVTo6UjExOCwgU1BVOjpSMTE5LAorICAgIFNQVTo6UjEyMCwgU1BVOjpSMTIxLCBTUFU6OlIxMjIsIFNQVTo6UjEyMywKKyAgICBTUFU6OlIxMjQsIFNQVTo6UjEyNSwgU1BVOjpSMTI2LCBTUFU6OlIxMjcsCisgICAgU1BVOjpSMiwgICAgLyogZW52aXJvbm1lbnQgcG9pbnRlciAqLworICAgIFNQVTo6UjEsICAgIC8qIHN0YWNrIHBvaW50ZXIgKi8KKyAgICBTUFU6OlIwLCAgICAvKiBsaW5rIHJlZ2lzdGVyICovCisgICAgMCAvKiBlbmQgKi8KKyAgfTsKKworICByZXR1cm4gU1BVX0NhbGxlZVNhdmVSZWdzOworfQorCisvKiEKKyBSMCAobGluayByZWdpc3RlciksIFIxIChzdGFjayBwb2ludGVyKSBhbmQgUjIgKGVudmlyb25tZW50IHBvaW50ZXIgLS0gdGhpcyBpcworIGdlbmVyYWxseSB1bnVzZWQpIGFyZSB0aGUgQ2VsbCdzIHJlc2VydmVkIHJlZ2lzdGVycworICovCitCaXRWZWN0b3IgU1BVUmVnaXN0ZXJJbmZvOjpnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBCaXRWZWN0b3IgUmVzZXJ2ZWQoZ2V0TnVtUmVncygpKTsKKyAgUmVzZXJ2ZWQuc2V0KFNQVTo6UjApOyAgICAgICAgICAgICAgICAvLyBMUgorICBSZXNlcnZlZC5zZXQoU1BVOjpSMSk7ICAgICAgICAgICAgICAgIC8vIFNQCisgIFJlc2VydmVkLnNldChTUFU6OlIyKTsgICAgICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQgcG9pbnRlcgorICByZXR1cm4gUmVzZXJ2ZWQ7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTdGFjayBGcmFtZSBQcm9jZXNzaW5nIG1ldGhvZHMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIG5lZWRzRlAgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGEgZGVkaWNhdGVkIGZyYW1lCisvLyBwb2ludGVyIHJlZ2lzdGVyLiAgVGhpcyBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBoYXMgdmFyaWFibGUgc2l6ZWQgYWxsb2NhcyBvcgorLy8gaWYgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbiBpcyBkaXNhYmxlZC4KKy8vCitzdGF0aWMgYm9vbCBuZWVkc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIHJldHVybiBEaXNhYmxlRnJhbWVQb2ludGVyRWxpbShNRikgfHwgTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaGFzRlAgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFjdHVhbGx5IGhhcyBhIGRlZGljYXRlZCBmcmFtZQorLy8gcG9pbnRlciByZWdpc3Rlci4gIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gbmVlZHMgYSBmcmFtZSBwb2ludGVyIGFuZCBoYXMKKy8vIGEgbm9uLXplcm8gc3RhY2sgc2l6ZS4KK2Jvb2wKK1NQVVJlZ2lzdGVySW5mbzo6aGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgcmV0dXJuIE1GSS0+Z2V0U3RhY2tTaXplKCkgJiYgbmVlZHNGUChNRik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQKK1NQVVJlZ2lzdGVySW5mbzo6ZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpCisgIGNvbnN0Cit7CisgIC8vIFNpbXBseSBkaXNjYXJkIEFESkNBTExTVEFDS0RPV04sIEFESkNBTExTVEFDS1VQIGluc3RydWN0aW9ucy4KKyAgTUJCLmVyYXNlKEkpOworfQorCit1bnNpZ25lZAorU1BVUmVnaXN0ZXJJbmZvOjplbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwgaW50IFNQQWRqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3QKK3sKKyAgdW5zaWduZWQgaSA9IDA7CisgIE1hY2hpbmVJbnN0ciAmTUkgPSAqSUk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIgPSAqTUkuZ2V0UGFyZW50KCk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgRGVidWdMb2MgZGwgPSBJSS0+Z2V0RGVidWdMb2MoKTsKKworICB3aGlsZSAoIU1JLmdldE9wZXJhbmQoaSkuaXNGSSgpKSB7CisgICAgKytpOworICAgIGFzc2VydChpIDwgTUkuZ2V0TnVtT3BlcmFuZHMoKSAmJiAiSW5zdHIgZG9lc24ndCBoYXZlIEZyYW1lSW5kZXggb3BlcmFuZCEiKTsKKyAgfQorCisgIE1hY2hpbmVPcGVyYW5kICZTUE9wID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgaW50IEZyYW1lSW5kZXggPSBTUE9wLmdldEluZGV4KCk7CisKKyAgLy8gTm93IGFkZCB0aGUgZnJhbWUgb2JqZWN0IG9mZnNldCB0byB0aGUgb2Zmc2V0IGZyb20gcjEuCisgIGludCBPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChGcmFtZUluZGV4KTsKKworICAvLyBNb3N0IGluc3RydWN0aW9ucywgZXhjZXB0IGZvciBnZW5lcmF0ZWQgRnJhbWVJbmRleCBhZGRpdGlvbnMgdXNpbmcgQUlyMzIKKyAgLy8gYW5kIElMQXIzMiwgaGF2ZSB0aGUgaW1tZWRpYXRlIGluIG9wZXJhbmQgMS4gQUlyMzIgYW5kIElMQXIzMiBoYXZlIHRoZQorICAvLyBpbW1lZGlhdGUgaW4gb3BlcmFuZCAyLgorICB1bnNpZ25lZCBPcE5vID0gMTsKKyAgaWYgKE1JLmdldE9wY29kZSgpID09IFNQVTo6QUlyMzIgfHwgTUkuZ2V0T3Bjb2RlKCkgPT0gU1BVOjpJTEFyMzIpCisgICAgT3BObyA9IDI7CisKKyAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChPcE5vKTsKKworICAvLyBPZmZzZXQgaXMgYmlhc2VkIGJ5ICRscidzIHNsb3QgYXQgdGhlIGJvdHRvbS4KKyAgT2Zmc2V0ICs9IE1PLmdldEltbSgpICsgTUZJLT5nZXRTdGFja1NpemUoKSArIFNQVUZyYW1lSW5mbzo6bWluU3RhY2tTaXplKCk7CisgIGFzc2VydCgoT2Zmc2V0ICYgMHhmKSA9PSAwCisgICAgICAgICAmJiAiMTYtYnl0ZSBhbGlnbm1lbnQgdmlvbGF0ZWQgaW4gZWxpbWluYXRlRnJhbWVJbmRleCIpOworCisgIC8vIFJlcGxhY2UgdGhlIEZyYW1lSW5kZXggd2l0aCBiYXNlIHJlZ2lzdGVyIHdpdGggJHNwIChha2EgJHIxKQorICBTUE9wLkNoYW5nZVRvUmVnaXN0ZXIoU1BVOjpSMSwgZmFsc2UpOworCisgIC8vIGlmICdPZmZzZXQnIGRvZXNuJ3QgZml0IHRvIHRoZSBELWZvcm0gaW5zdHJ1Y3Rpb24ncworICAvLyBpbW1lZGlhdGUsIGNvbnZlcnQgdGhlIGluc3RydWN0aW9uIHRvIFgtZm9ybQorICAvLyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IGFuIEFJICh3aGljaCB0YWtlcyBhIHMxMCBpbW1lZGlhdGUpLCBhc3N1bWUKKyAgLy8gaXQgaXMgYSBsb2FkL3N0b3JlIHRoYXQgY2FuIHRha2UgYSBzMTQgaW1tZWRpYXRlCisgIGlmICgoTUkuZ2V0T3Bjb2RlKCkgPT0gU1BVOjpBSXIzMiAmJiAhaXNJbnQ8MTA+KE9mZnNldCkpCisgICAgICB8fCAhaXNJbnQ8MTQ+KE9mZnNldCkpIHsKKyAgICBpbnQgbmV3T3Bjb2RlID0gY29udmVydERGb3JtVG9YRm9ybShNSS5nZXRPcGNvZGUoKSk7CisgICAgdW5zaWduZWQgdG1wUmVnID0gZmluZFNjcmF0Y2hSZWdpc3RlcihJSSwgUlMsICZTUFU6OlIzMkNSZWdDbGFzcywgU1BBZGopOworICAgIEJ1aWxkTUkoTUJCLCBJSSwgZGwsIFRJSS5nZXQoU1BVOjpJTHIzMiksIHRtcFJlZyApCisgICAgICAgIC5hZGRJbW0oT2Zmc2V0KTsKKyAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KG5ld09wY29kZSksIE1JLmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpCisgICAgICAgIC5hZGRSZWcodG1wUmVnLCBSZWdTdGF0ZTo6S2lsbCkKKyAgICAgICAgLmFkZFJlZyhTUFU6OlIxKTsKKyAgICAvLyByZW1vdmUgdGhlIHJlcGxhY2VkIEQtZm9ybSBpbnN0cnVjdGlvbgorICAgIE1CQi5lcmFzZShJSSk7CisgIH0gZWxzZSB7CisgICAgTU8uQ2hhbmdlVG9JbW1lZGlhdGUoT2Zmc2V0KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGRldGVybWluZUZyYW1lTGF5b3V0IC0gRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBmcmFtZSBhbmQgbWF4aW11bSBjYWxsCisvLy8gZnJhbWUgc2l6ZS4KK3ZvaWQKK1NQVVJlZ2lzdGVySW5mbzo6ZGV0ZXJtaW5lRnJhbWVMYXlvdXQoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QKK3sKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgRnJhbWVJbmZvCisgIHVuc2lnbmVkIEZyYW1lU2l6ZSA9IE1GSS0+Z2V0U3RhY2tTaXplKCk7CisKKyAgLy8gR2V0IHRoZSBhbGlnbm1lbnRzIHByb3ZpZGVkIGJ5IHRoZSB0YXJnZXQsIGFuZCB0aGUgbWF4aW11bSBhbGlnbm1lbnQKKyAgLy8gKGlmIGFueSkgb2YgdGhlIGZpeGVkIGZyYW1lIG9iamVjdHMuCisgIHVuc2lnbmVkIFRhcmdldEFsaWduID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrQWxpZ25tZW50KCk7CisgIHVuc2lnbmVkIEFsaWduID0gc3RkOjptYXgoVGFyZ2V0QWxpZ24sIE1GSS0+Z2V0TWF4QWxpZ25tZW50KCkpOworICBhc3NlcnQoaXNQb3dlck9mMl8zMihBbGlnbikgJiYgIkFsaWdubWVudCBpcyBub3QgcG93ZXIgb2YgMiIpOworICB1bnNpZ25lZCBBbGlnbk1hc2sgPSBBbGlnbiAtIDE7CisKKyAgLy8gR2V0IHRoZSBtYXhpbXVtIGNhbGwgZnJhbWUgc2l6ZSBvZiBhbGwgdGhlIGNhbGxzLgorICB1bnNpZ25lZCBtYXhDYWxsRnJhbWVTaXplID0gTUZJLT5nZXRNYXhDYWxsRnJhbWVTaXplKCk7CisKKyAgLy8gSWYgd2UgaGF2ZSBkeW5hbWljIGFsbG9jYSB0aGVuIG1heENhbGxGcmFtZVNpemUgbmVlZHMgdG8gYmUgYWxpZ25lZCBzbworICAvLyB0aGF0IGFsbG9jYXRpb25zIHdpbGwgYmUgYWxpZ25lZC4KKyAgaWYgKE1GSS0+aGFzVmFyU2l6ZWRPYmplY3RzKCkpCisgICAgbWF4Q2FsbEZyYW1lU2l6ZSA9IChtYXhDYWxsRnJhbWVTaXplICsgQWxpZ25NYXNrKSAmIH5BbGlnbk1hc2s7CisKKyAgLy8gVXBkYXRlIG1heGltdW0gY2FsbCBmcmFtZSBzaXplLgorICBNRkktPnNldE1heENhbGxGcmFtZVNpemUobWF4Q2FsbEZyYW1lU2l6ZSk7CisKKyAgLy8gSW5jbHVkZSBjYWxsIGZyYW1lIHNpemUgaW4gdG90YWwuCisgIEZyYW1lU2l6ZSArPSBtYXhDYWxsRnJhbWVTaXplOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgZnJhbWUgaXMgYWxpZ25lZC4KKyAgRnJhbWVTaXplID0gKEZyYW1lU2l6ZSArIEFsaWduTWFzaykgJiB+QWxpZ25NYXNrOworCisgIC8vIFVwZGF0ZSBmcmFtZSBpbmZvLgorICBNRkktPnNldFN0YWNrU2l6ZShGcmFtZVNpemUpOworfQorCit2b2lkIFNQVVJlZ2lzdGVySW5mbzo6cHJvY2Vzc0Z1bmN0aW9uQmVmb3JlQ2FsbGVlU2F2ZWRTY2FuKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMpCisgIGNvbnN0IHsKKyAgLy8gTWFyayBMUiBhbmQgU1AgdW51c2VkLCBzaW5jZSB0aGUgcHJvbG9nIHNwaWxscyB0aGVtIHRvIHN0YWNrIGFuZAorICAvLyB3ZSBkb24ndCB3YW50IGFueW9uZSBlbHNlIHRvIHNwaWxsIHRoZW0gZm9yIHVzLgorICAvLworICAvLyBBbHNvLCB1bmxlc3MgUjIgaXMgcmVhbGx5IHVzZWQgc29tZWRheSwgZG9uJ3Qgc3BpbGwgaXQgYXV0b21hdGljYWxseS4KKyAgTUYuZ2V0UmVnSW5mbygpLnNldFBoeXNSZWdVbnVzZWQoU1BVOjpSMCk7CisgIE1GLmdldFJlZ0luZm8oKS5zZXRQaHlzUmVnVW51c2VkKFNQVTo6UjEpOworICBNRi5nZXRSZWdJbmZvKCkuc2V0UGh5c1JlZ1VudXNlZChTUFU6OlIyKTsKKworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsgCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gJlNQVTo6UjMyQ1JlZ0NsYXNzOworICBSUy0+c2V0U2NhdmVuZ2luZ0ZyYW1lSW5kZXgoTUZJLT5DcmVhdGVTdGFja09iamVjdChSQy0+Z2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQy0+Z2V0QWxpZ25tZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisgIAorICAKK30KKwordm9pZCBTUFVSZWdpc3RlckluZm86OmVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdAoreworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gTUYuZnJvbnQoKTsgICAvLyBQcm9sb2cgZ29lcyBpbiBlbnRyeSBCQgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IE1CQi5iZWdpbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTWFjaGluZU1vZHVsZUluZm8gJk1NSSA9IE1GLmdldE1NSSgpOworICBEZWJ1Z0xvYyBkbCA9IE1CQkkgIT0gTUJCLmVuZCgpID8gTUJCSS0+Z2V0RGVidWdMb2MoKSA6IERlYnVnTG9jKCk7CisKKyAgLy8gUHJlcGFyZSBmb3IgZGVidWcgZnJhbWUgaW5mby4KKyAgYm9vbCBoYXNEZWJ1Z0luZm8gPSBNTUkuaGFzRGVidWdJbmZvKCk7CisgIE1DU3ltYm9sICpGcmFtZUxhYmVsID0gMDsKKworICAvLyBNb3ZlIE1CQkkgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbi4KKyAgTUJCSSA9IE1CQi5iZWdpbigpOworCisgIC8vIFdvcmsgb3V0IGZyYW1lIHNpemVzLgorICBkZXRlcm1pbmVGcmFtZUxheW91dChNRik7CisgIGludCBGcmFtZVNpemUgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworCisgIGFzc2VydCgoRnJhbWVTaXplICYgMHhmKSA9PSAwCisgICAgICAgICAmJiAiU1BVUmVnaXN0ZXJJbmZvOjplbWl0UHJvbG9ndWU6IEZyYW1lU2l6ZSBub3QgYWxpZ25lZCIpOworCisgIC8vIHRoZSAiZW1wdHkiIGZyYW1lIHNpemUgaXMgMTYgLSBqdXN0IHRoZSByZWdpc3RlciBzY2F2ZW5nZXIgc3BpbGwgc2xvdAorICBpZiAoRnJhbWVTaXplID4gMTYgfHwgTUZJLT5hZGp1c3RzU3RhY2soKSkgeworICAgIEZyYW1lU2l6ZSA9IC0oRnJhbWVTaXplICsgU1BVRnJhbWVJbmZvOjptaW5TdGFja1NpemUoKSk7CisgICAgaWYgKGhhc0RlYnVnSW5mbykgeworICAgICAgLy8gTWFyayBlZmZlY3RpdmUgYmVnaW5uaW5nIG9mIHdoZW4gZnJhbWUgcG9pbnRlciBiZWNvbWVzIHZhbGlkLgorICAgICAgRnJhbWVMYWJlbCA9IE1NSS5nZXRDb250ZXh0KCkuQ3JlYXRlVGVtcFN5bWJvbCgpOworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFNQVTo6UFJPTE9HX0xBQkVMKSkuYWRkU3ltKEZyYW1lTGFiZWwpOworICAgIH0KKworICAgIC8vIEFkanVzdCBzdGFjayBwb2ludGVyLCBzcGlsbGluZyAkbHIgLT4gMTYoJHNwKSBhbmQgJHNwIC0+IC1GcmFtZVNpemUoJHNwKQorICAgIC8vIGZvciB0aGUgQUJJCisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFNQVTo6U1RRRHIzMiksIFNQVTo6UjApLmFkZEltbSgxNikKKyAgICAgIC5hZGRSZWcoU1BVOjpSMSk7CisgICAgaWYgKGlzSW50PDEwPihGcmFtZVNpemUpKSB7CisgICAgICAvLyBTcGlsbCAkc3AgdG8gYWRqdXN0ZWQgJHNwCisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1BVOjpTVFFEcjMyKSwgU1BVOjpSMSkuYWRkSW1tKEZyYW1lU2l6ZSkKKyAgICAgICAgLmFkZFJlZyhTUFU6OlIxKTsKKyAgICAgIC8vIEFkanVzdCAkc3AgYnkgcmVxdWlyZWQgYW1vdXQKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChTUFU6OkFJcjMyKSwgU1BVOjpSMSkuYWRkUmVnKFNQVTo6UjEpCisgICAgICAgIC5hZGRJbW0oRnJhbWVTaXplKTsKKyAgICB9IGVsc2UgaWYgKGlzSW50PDE2PihGcmFtZVNpemUpKSB7CisgICAgICAvLyBGcmFtZSBzaXplIGNhbiBiZSBsb2FkZWQgaW50byBJTHIzMm4sIHNvIHRlbXBvcmFyaWx5IHNwaWxsICRyMiBhbmQgdXNlCisgICAgICAvLyAkcjIgdG8gYWRqdXN0ICRzcDoKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChTUFU6OlNUUURyMTI4KSwgU1BVOjpSMikKKyAgICAgICAgLmFkZEltbSgtMTYpCisgICAgICAgIC5hZGRSZWcoU1BVOjpSMSk7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1BVOjpJTHIzMiksIFNQVTo6UjIpCisgICAgICAgIC5hZGRJbW0oRnJhbWVTaXplKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChTUFU6OlNUUVhyMzIpLCBTUFU6OlIxKQorICAgICAgICAuYWRkUmVnKFNQVTo6UjIpCisgICAgICAgIC5hZGRSZWcoU1BVOjpSMSk7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1BVOjpBcjMyKSwgU1BVOjpSMSkKKyAgICAgICAgLmFkZFJlZyhTUFU6OlIxKQorICAgICAgICAuYWRkUmVnKFNQVTo6UjIpOworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFNQVTo6U0ZJcjMyKSwgU1BVOjpSMikKKyAgICAgICAgLmFkZFJlZyhTUFU6OlIyKQorICAgICAgICAuYWRkSW1tKDE2KTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChTUFU6OkxRWHIxMjgpLCBTUFU6OlIyKQorICAgICAgICAuYWRkUmVnKFNQVTo6UjIpCisgICAgICAgIC5hZGRSZWcoU1BVOjpSMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiVW5oYW5kbGVkIGZyYW1lIHNpemU6ICIgKyBUd2luZShGcmFtZVNpemUpKTsKKyAgICB9CisKKyAgICBpZiAoaGFzRGVidWdJbmZvKSB7CisgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lTW92ZT4gJk1vdmVzID0gTU1JLmdldEZyYW1lTW92ZXMoKTsKKworICAgICAgLy8gU2hvdyB1cGRhdGUgb2YgU1AuCisgICAgICBNYWNoaW5lTG9jYXRpb24gU1BEc3QoTWFjaGluZUxvY2F0aW9uOjpWaXJ0dWFsRlApOworICAgICAgTWFjaGluZUxvY2F0aW9uIFNQU3JjKE1hY2hpbmVMb2NhdGlvbjo6VmlydHVhbEZQLCAtRnJhbWVTaXplKTsKKyAgICAgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZShGcmFtZUxhYmVsLCBTUERzdCwgU1BTcmMpKTsKKworICAgICAgLy8gQWRkIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgdG8gbW92ZSBsaXN0LgorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJID0gTUZJLT5nZXRDYWxsZWVTYXZlZEluZm8oKTsKKyAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBDU0kuc2l6ZSgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBpbnQgT2Zmc2V0ID0gTUZJLT5nZXRPYmplY3RPZmZzZXQoQ1NJW0ldLmdldEZyYW1lSWR4KCkpOworICAgICAgICB1bnNpZ25lZCBSZWcgPSBDU0lbSV0uZ2V0UmVnKCk7CisgICAgICAgIGlmIChSZWcgPT0gU1BVOjpSMCkgY29udGludWU7CisgICAgICAgIE1hY2hpbmVMb2NhdGlvbiBDU0RzdChNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCwgT2Zmc2V0KTsKKyAgICAgICAgTWFjaGluZUxvY2F0aW9uIENTU3JjKFJlZyk7CisgICAgICAgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZShGcmFtZUxhYmVsLCBDU0RzdCwgQ1NTcmMpKTsKKyAgICAgIH0KKworICAgICAgLy8gTWFyayBlZmZlY3RpdmUgYmVnaW5uaW5nIG9mIHdoZW4gZnJhbWUgcG9pbnRlciBpcyByZWFkeS4KKyAgICAgIE1DU3ltYm9sICpSZWFkeUxhYmVsID0gTU1JLmdldENvbnRleHQoKS5DcmVhdGVUZW1wU3ltYm9sKCk7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1BVOjpQUk9MT0dfTEFCRUwpKS5hZGRTeW0oUmVhZHlMYWJlbCk7CisKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBGUERzdChTUFU6OlIxKTsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBGUFNyYyhNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCk7CisgICAgICBNb3Zlcy5wdXNoX2JhY2soTWFjaGluZU1vdmUoUmVhZHlMYWJlbCwgRlBEc3QsIEZQU3JjKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFRoaXMgaXMgYSBsZWFmIGZ1bmN0aW9uIC0tIGluc2VydCBhIGJyYW5jaCBoaW50IGlmZiB0aGVyZSBhcmUKKyAgICAvLyBzdWZmaWNpZW50IG51bWJlciBpbnN0cnVjdGlvbnMgaW4gdGhlIGJhc2ljIGJsb2NrLiBOb3RlIHRoYXQKKyAgICAvLyB0aGlzIGlzIGp1c3QgYSBiZXN0IGd1ZXNzIGJhc2VkIG9uIHRoZSBiYXNpYyBibG9jaydzIHNpemUuCisgICAgaWYgKE1CQi5zaXplKCkgPj0gKHVuc2lnbmVkKSBTUFVGcmFtZUluZm86OmJyYW5jaEhpbnRQZW5hbHR5KCkpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gcHJpb3IoTUJCLmVuZCgpKTsKKyAgICAgIGRsID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKworICAgICAgLy8gSW5zZXJ0IHRlcm1pbmF0b3IgbGFiZWwKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChTUFU6OlBST0xPR19MQUJFTCkpCisgICAgICAgIC5hZGRTeW0oTU1JLmdldENvbnRleHQoKS5DcmVhdGVUZW1wU3ltYm9sKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkCitTUFVSZWdpc3RlckluZm86OmVtaXRFcGlsb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdAoreworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IHByaW9yKE1CQi5lbmQoKSk7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBpbnQgRnJhbWVTaXplID0gTUZJLT5nZXRTdGFja1NpemUoKTsKKyAgaW50IExpbmtTbG90T2Zmc2V0ID0gU1BVRnJhbWVJbmZvOjpzdGFja1Nsb3RTaXplKCk7CisgIERlYnVnTG9jIGRsID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKworICBhc3NlcnQoTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gU1BVOjpSRVQgJiYKKyAgICAgICAgICJDYW4gb25seSBpbnNlcnQgZXBpbG9nIGludG8gcmV0dXJuaW5nIGJsb2NrcyIpOworICBhc3NlcnQoKEZyYW1lU2l6ZSAmIDB4ZikgPT0gMAorICAgICAgICAgJiYgIlNQVVJlZ2lzdGVySW5mbzo6ZW1pdEVwaWxvZ3VlOiBGcmFtZVNpemUgbm90IGFsaWduZWQiKTsKKworICAvLyB0aGUgImVtcHR5IiBmcmFtZSBzaXplIGlzIDE2IC0ganVzdCB0aGUgcmVnaXN0ZXIgc2NhdmVuZ2VyIHNwaWxsIHNsb3QKKyAgaWYgKEZyYW1lU2l6ZSA+IDE2IHx8IE1GSS0+YWRqdXN0c1N0YWNrKCkpIHsKKyAgICBGcmFtZVNpemUgPSBGcmFtZVNpemUgKyBTUFVGcmFtZUluZm86Om1pblN0YWNrU2l6ZSgpOworICAgIGlmIChpc0ludDwxMD4oRnJhbWVTaXplICsgTGlua1Nsb3RPZmZzZXQpKSB7CisgICAgICAvLyBSZWxvYWQgJGxyLCBhZGp1c3QgJHNwIGJ5IHJlcXVpcmVkIGFtb3VudAorICAgICAgLy8gTm90ZTogV2UgZG8gdGhpcyB0byBzbGlnaHRseSBpbXByb3ZlIGR1YWwgaXNzdWUgLS0gbm90IGJ5IG11Y2gsIGJ1dCBpdAorICAgICAgLy8gaXMgYW4gb3Bwb3J0dW5pdHkgZm9yIGR1YWwgaXNzdWUuCisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1BVOjpMUURyMTI4KSwgU1BVOjpSMCkKKyAgICAgICAgLmFkZEltbShGcmFtZVNpemUgKyBMaW5rU2xvdE9mZnNldCkKKyAgICAgICAgLmFkZFJlZyhTUFU6OlIxKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChTUFU6OkFJcjMyKSwgU1BVOjpSMSkKKyAgICAgICAgLmFkZFJlZyhTUFU6OlIxKQorICAgICAgICAuYWRkSW1tKEZyYW1lU2l6ZSk7CisgICAgfSBlbHNlIGlmIChGcmFtZVNpemUgPD0gKDEgPDwgMTYpIC0gMSAmJiBGcmFtZVNpemUgPj0gLSgxIDw8IDE2KSkgeworICAgICAgLy8gRnJhbWUgc2l6ZSBjYW4gYmUgbG9hZGVkIGludG8gSUxyMzJuLCBzbyB0ZW1wb3JhcmlseSBzcGlsbCAkcjIgYW5kIHVzZQorICAgICAgLy8gJHIyIHRvIGFkanVzdCAkc3A6CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1BVOjpTVFFEcjEyOCksIFNQVTo6UjIpCisgICAgICAgIC5hZGRJbW0oMTYpCisgICAgICAgIC5hZGRSZWcoU1BVOjpSMSk7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1BVOjpJTHIzMiksIFNQVTo6UjIpCisgICAgICAgIC5hZGRJbW0oRnJhbWVTaXplKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChTUFU6OkFyMzIpLCBTUFU6OlIxKQorICAgICAgICAuYWRkUmVnKFNQVTo6UjEpCisgICAgICAgIC5hZGRSZWcoU1BVOjpSMik7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1BVOjpMUURyMTI4KSwgU1BVOjpSMCkKKyAgICAgICAgLmFkZEltbSgxNikKKyAgICAgICAgLmFkZFJlZyhTUFU6OlIxKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChTUFU6OlNGSXIzMiksIFNQVTo6UjIpLgorICAgICAgICBhZGRSZWcoU1BVOjpSMikKKyAgICAgICAgLmFkZEltbSgxNik7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1BVOjpMUVhyMTI4KSwgU1BVOjpSMikKKyAgICAgICAgLmFkZFJlZyhTUFU6OlIyKQorICAgICAgICAuYWRkUmVnKFNQVTo6UjEpOworICAgIH0gZWxzZSB7CisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlVuaGFuZGxlZCBmcmFtZSBzaXplOiAiICsgVHdpbmUoRnJhbWVTaXplKSk7CisgICAgfQorICAgfQorfQorCit1bnNpZ25lZAorU1BVUmVnaXN0ZXJJbmZvOjpnZXRSQVJlZ2lzdGVyKCkgY29uc3QKK3sKKyAgcmV0dXJuIFNQVTo6UjA7Cit9CisKK3Vuc2lnbmVkCitTUFVSZWdpc3RlckluZm86OmdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QKK3sKKyAgcmV0dXJuIFNQVTo6UjE7Cit9CisKK3ZvaWQKK1NQVVJlZ2lzdGVySW5mbzo6Z2V0SW5pdGlhbEZyYW1lU3RhdGUoc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+ICZNb3ZlcykgY29uc3QKK3sKKyAgLy8gSW5pdGlhbCBzdGF0ZSBvZiB0aGUgZnJhbWUgcG9pbnRlciBpcyBSMS4KKyAgTWFjaGluZUxvY2F0aW9uIERzdChNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCk7CisgIE1hY2hpbmVMb2NhdGlvbiBTcmMoU1BVOjpSMSwgMCk7CisgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZSgwLCBEc3QsIFNyYykpOworfQorCisKK2ludAorU1BVUmVnaXN0ZXJJbmZvOjpnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3QgeworICAvLyBGSVhNRTogTW9zdCBwcm9iYWJseSBkd2FyZiBudW1iZXJzIGRpZmZlcnMgZm9yIExpbnV4IGFuZCBEYXJ3aW4KKyAgcmV0dXJuIFNQVUdlblJlZ2lzdGVySW5mbzo6Z2V0RHdhcmZSZWdOdW1GdWxsKFJlZ051bSwgMCk7Cit9CisKK2ludCAKK1NQVVJlZ2lzdGVySW5mbzo6Y29udmVydERGb3JtVG9YRm9ybShpbnQgZEZvcm1PcGNvZGUpIGNvbnN0Cit7CisgIHN3aXRjaChkRm9ybU9wY29kZSkgCisgIHsKKyAgICBjYXNlIFNQVTo6QUlyMzI6ICAgICByZXR1cm4gU1BVOjpBcjMyOworICAgIGNhc2UgU1BVOjpMUURyMzI6ICAgIHJldHVybiBTUFU6OkxRWHIzMjsKKyAgICBjYXNlIFNQVTo6TFFEcjEyODogICByZXR1cm4gU1BVOjpMUVhyMTI4OworICAgIGNhc2UgU1BVOjpMUUR2MTZpODogIHJldHVybiBTUFU6OkxRWHYxNmk4OworICAgIGNhc2UgU1BVOjpMUUR2NGkzMjogIHJldHVybiBTUFU6OkxRWHY0aTMyOworICAgIGNhc2UgU1BVOjpMUUR2NGYzMjogIHJldHVybiBTUFU6OkxRWHY0ZjMyOworICAgIGNhc2UgU1BVOjpTVFFEcjMyOiAgIHJldHVybiBTUFU6OlNUUVhyMzI7CisgICAgY2FzZSBTUFU6OlNUUURyMTI4OiAgcmV0dXJuIFNQVTo6U1RRWHIxMjg7CisgICAgY2FzZSBTUFU6OlNUUUR2MTZpODogcmV0dXJuIFNQVTo6U1RRWHYxNmk4OworICAgIGNhc2UgU1BVOjpTVFFEdjRpMzI6IHJldHVybiBTUFU6OlNUUVh2NGkzMjsKKyAgICBjYXNlIFNQVTo6U1RRRHY0ZjMyOiByZXR1cm4gU1BVOjpTVFFYdjRmMzI7CisKKyAgICBkZWZhdWx0OiBhc3NlcnQoIGZhbHNlICYmICJVbmhhbmRsZWQgRCB0byBYLWZvcm0gY29udmVyc2lvbiIpOworICB9CisgIC8vIGRlZmF1bHQgd2lsbCBhc3NlcnQsIGJ1dCBuZWVkIHRvIHJldHVybiBzb21ldGhpbmcgdG8ga2VlcCB0aGUKKyAgLy8gY29tcGlsZXIgaGFwcHkuCisgIHJldHVybiBkRm9ybU9wY29kZTsKK30KKworLy8gVE9ETyB0aGlzIGlzIGFscmVhZHkgY29waWVkIGZyb20gUFBDLiBDb3VsZCB0aGlzIGNvbnZlbmllbmNlIGZ1bmN0aW9uCisvLyBiZSBtb3ZlZCB0byB0aGUgUmVnU2NhdmVuZ2VyIGNsYXNzPwordW5zaWduZWQgIAorU1BVUmVnaXN0ZXJJbmZvOjpmaW5kU2NyYXRjaFJlZ2lzdGVyKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqKSBjb25zdAoreworICBhc3NlcnQoUlMgJiYgIlJlZ2lzdGVyIHNjYXZlbmdpbmcgbXVzdCBiZSBvbiIpOworICB1bnNpZ25lZCBSZWcgPSBSUy0+RmluZFVudXNlZFJlZyhSQyk7CisgIGlmIChSZWcgPT0gMCkKKyAgICBSZWcgPSBSUy0+c2NhdmVuZ2VSZWdpc3RlcihSQywgSUksIFNQQWRqKTsKKyAgYXNzZXJ0KCBSZWcgJiYgIlJlZ2lzdGVyIHNjYXZlbmdlciBmYWlsZWQiKTsKKyAgcmV0dXJuIFJlZzsKK30KKworI2luY2x1ZGUgIlNQVUdlblJlZ2lzdGVySW5mby5pbmMiCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVUmVnaXN0ZXJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVUmVnaXN0ZXJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2YWU2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVSZWdpc3RlckluZm8uaApAQCAtMCwwICsxLDEwOSBAQAorLy89PT0tIFNQVVJlZ2lzdGVySW5mby5oIC0gQ2VsbCBTUFUgUmVnaXN0ZXIgSW5mb3JtYXRpb24gSW1wbCAtLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIENlbGwgU1BVIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRSZWdpc3RlckluZm8KKy8vIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU1BVX1JFR0lTVEVSSU5GT19ICisjZGVmaW5lIFNQVV9SRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAiU1BVLmgiCisjaW5jbHVkZSAiU1BVR2VuUmVnaXN0ZXJJbmZvLmguaW5jIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFNQVVN1YnRhcmdldDsKKyAgY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworICBjbGFzcyBUeXBlOworCisgIGNsYXNzIFNQVVJlZ2lzdGVySW5mbyA6IHB1YmxpYyBTUFVHZW5SZWdpc3RlckluZm8geworICBwcml2YXRlOgorICAgIGNvbnN0IFNQVVN1YnRhcmdldCAmU3VidGFyZ2V0OworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJOworCisgICAgLy8hIFByZWRpY2F0ZTogRG9lcyB0aGUgbWFjaGluZSBmdW5jdGlvbiB1c2UgdGhlIGxpbmsgcmVnaXN0ZXI/CisgICAgYm9vbCB1c2VzTFIoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgcHVibGljOgorICAgIFNQVVJlZ2lzdGVySW5mbyhjb25zdCBTUFVTdWJ0YXJnZXQgJnN1YnRhcmdldCwgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpOworICAgIAorICAgIC8vISBUcmFuc2xhdGUgYSByZWdpc3RlcidzIGVudW0gdmFsdWUgdG8gYSByZWdpc3RlciBudW1iZXIKKyAgICAvKiEKKyAgICAgIFRoaXMgbWV0aG9kIHRyYW5zbGF0ZXMgYSByZWdpc3RlcidzIGVudW0gdmFsdWUgdG8gaXQncyByZWdpc2VyIG51bWJlciwKKyAgICAgIGUuZy4gU1BVOjpSMTQgLT4gMTQuCisgICAgICovCisgICAgc3RhdGljIHVuc2lnbmVkIGdldFJlZ2lzdGVyTnVtYmVyaW5nKHVuc2lnbmVkIFJlZ0VudW0pOworCisgICAgLy8vIGdldFBvaW50ZXJSZWdDbGFzcyAtIFJldHVybiB0aGUgcmVnaXN0ZXIgY2xhc3MgdG8gdXNlIHRvIGhvbGQgcG9pbnRlcnMuCisgICAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgYWRkcmVzc2luZyBtb2Rlcy4KKyAgICB2aXJ0dWFsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgorICAgIGdldFBvaW50ZXJSZWdDbGFzcyh1bnNpZ25lZCBLaW5kID0gMCkgY29uc3Q7CisKKyAgICAvLyEgUmV0dXJuIHRoZSBhcnJheSBvZiBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzCisgICAgdmlydHVhbCBjb25zdCB1bnNpZ25lZCogZ2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0OworCisgICAgLy8hIEFsbG93IGZvciBzY2F2ZW5naW5nLCBzbyB3ZSBjYW4gZ2V0IHNjcmF0Y2ggcmVnaXN0ZXJzIHdoZW4gbmVlZGVkLgorICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1JlZ2lzdGVyU2NhdmVuZ2luZyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdAorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAgIC8vISBSZXR1cm4gdGhlIHJlc2VydmVkIHJlZ2lzdGVycworICAgIEJpdFZlY3RvciBnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgICAvLyEgUHJlZGlhdGU6IFRhcmdldCBoYXMgZGVkaWNhdGVkIGZyYW1lIHBvaW50ZXIKKyAgICBib29sIGhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIC8vISBFbGltaW5hdGUgdGhlIGNhbGwgZnJhbWUgc2V0dXAgcHNldWRvLWluc3RydWN0aW9ucworICAgIHZvaWQgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgY29uc3Q7CisgICAgLy8hIENvbnZlcnQgZnJhbWUgaW5kaWNpZXMgaW50byBtYWNoaW5lIG9wZXJhbmRzCisgICAgdW5zaWduZWQgZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksIGludCBTUEFkaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IE5VTEwpIGNvbnN0OworICAgIC8vISBEZXRlcm1pbmUgdGhlIGZyYW1lJ3MgbGF5b3VyCisgICAgdm9pZCBkZXRlcm1pbmVGcmFtZUxheW91dChNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAgIHZvaWQgcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlQ2FsbGVlU2F2ZWRTY2FuKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IE5VTEwpIGNvbnN0OworICAgIC8vISBFbWl0IHRoZSBmdW5jdGlvbiBwcm9sb2d1ZQorICAgIHZvaWQgZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIC8vISBFbWl0IHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQorICAgIHZvaWQgZW1pdEVwaWxvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0OworICAgIC8vISBHZXQgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgKExSLCBha2EgUjApCisgICAgdW5zaWduZWQgZ2V0UkFSZWdpc3RlcigpIGNvbnN0OworICAgIC8vISBHZXQgdGhlIHN0YWNrIGZyYW1lIHJlZ2lzdGVyIChTUCwgYWthIFIxKQorICAgIHVuc2lnbmVkIGdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgICAgLy8hIFBlcmZvcm0gdGFyZ2V0LXNwZWNpZmljIHN0YWNrIGZyYW1lIHNldHVwLgorICAgIHZvaWQgZ2V0SW5pdGlhbEZyYW1lU3RhdGUoc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+ICZNb3ZlcykgY29uc3Q7CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIE5ldyBtZXRob2RzIGFkZGVkOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyEgR2V0IERXQVJGIGRlYnVnZ2luZyByZWdpc3RlciBudW1iZXIKKyAgICBpbnQgZ2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0OworCisgICAgLy8hIENvbnZlcnQgRC1mb3JtIGxvYWQvc3RvcmUgdG8gWC1mb3JtIGxvYWQvc3RvcmUKKyAgICAvKiEKKyAgICAgIENvbnZlcnRzIGEgcmVnaXNlciBkaXNwbGFjZW1lbnQgbG9hZC9zdG9yZSBpbnRvIGEgcmVnaXN0ZXItaW5kZXhlZAorICAgICAgbG9hZC9zdG9yZSBmb3IgbGFyZ2Ugc3RhY2sgZnJhbWVzLCB3aGVuIHRoZSBzdGFjayBmcmFtZSBleGNlZWRzIHRoZQorICAgICAgcmFuZ2Ugb2YgYSBzMTAgZGlzcGxhY2VtZW50LgorICAgICAqLworICAgIGludCBjb252ZXJ0REZvcm1Ub1hGb3JtKGludCBkRm9ybU9wY29kZSkgY29uc3Q7CisKKyAgICAvLyEgQWNxdWlyZSBhbiB1bnVzZWQgcmVnaXN0ZXIgaW4gYW4gZW1lcmdlbmN5LgorICAgIHVuc2lnbmVkIGZpbmRTY3JhdGNoUmVnaXN0ZXIoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUEFkaikgY29uc3Q7CisgICAgCisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVSZWdpc3RlckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVUmVnaXN0ZXJJbmZvLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDlkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVUmVnaXN0ZXJJbmZvLnRkCkBAIC0wLDAgKzEsNDI5IEBACisvLz09PS0gU1BVUmVnaXN0ZXJJbmZvLnRkIC0gVGhlIENlbGwgU1BVIFJlZ2lzdGVyIEZpbGUgLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFNQVVJlZzxzdHJpbmcgbj4gOiBSZWdpc3RlcjxuPiB7CisgIGxldCBOYW1lc3BhY2UgPSAiU1BVIjsKK30KKworLy8gVGhlIFNQVSdzIHJlZ2lzdGVyIGFyZSBhbGwgMTI4LWJpdHMgd2lkZSwgd2hpY2ggbWFrZXMgc3BlY2lmeWluZyB0aGUKKy8vIHJlZ2lzdGVycyByZWxhdGl2ZWx5IGVhc3ksIGlmIHJlbGF0aXZlbHkgbXVuZGFuZToKKworY2xhc3MgU1BVVmVjUmVnPGJpdHM8Nz4gbnVtLCBzdHJpbmcgbj4gOiBTUFVSZWc8bj4geworICBmaWVsZCBiaXRzPDc+IE51bSA9IG51bTsKK30KKworZGVmIFIwIDogU1BVVmVjUmVnPDAsICIkbHIiPiwgRHdhcmZSZWdOdW08WzBdPjsKK2RlZiBSMSA6IFNQVVZlY1JlZzwxLCAiJHNwIj4sIER3YXJmUmVnTnVtPFsxXT47CitkZWYgUjIgOiBTUFVWZWNSZWc8MiwgIiQyIj4sIER3YXJmUmVnTnVtPFsyXT47CitkZWYgUjMgOiBTUFVWZWNSZWc8MywgIiQzIj4sIER3YXJmUmVnTnVtPFszXT47CitkZWYgUjQgOiBTUFVWZWNSZWc8NCwgIiQ0Ij4sIER3YXJmUmVnTnVtPFs0XT47CitkZWYgUjUgOiBTUFVWZWNSZWc8NSwgIiQ1Ij4sIER3YXJmUmVnTnVtPFs1XT47CitkZWYgUjYgOiBTUFVWZWNSZWc8NiwgIiQ2Ij4sIER3YXJmUmVnTnVtPFs2XT47CitkZWYgUjcgOiBTUFVWZWNSZWc8NywgIiQ3Ij4sIER3YXJmUmVnTnVtPFs3XT47CitkZWYgUjggOiBTUFVWZWNSZWc8OCwgIiQ4Ij4sIER3YXJmUmVnTnVtPFs4XT47CitkZWYgUjkgOiBTUFVWZWNSZWc8OSwgIiQ5Ij4sIER3YXJmUmVnTnVtPFs5XT47CitkZWYgUjEwIDogU1BVVmVjUmVnPDEwLCAiJDEwIj4sIER3YXJmUmVnTnVtPFsxMF0+OworZGVmIFIxMSA6IFNQVVZlY1JlZzwxMSwgIiQxMSI+LCBEd2FyZlJlZ051bTxbMTFdPjsKK2RlZiBSMTIgOiBTUFVWZWNSZWc8MTIsICIkMTIiPiwgRHdhcmZSZWdOdW08WzEyXT47CitkZWYgUjEzIDogU1BVVmVjUmVnPDEzLCAiJDEzIj4sIER3YXJmUmVnTnVtPFsxM10+OworZGVmIFIxNCA6IFNQVVZlY1JlZzwxNCwgIiQxNCI+LCBEd2FyZlJlZ051bTxbMTRdPjsKK2RlZiBSMTUgOiBTUFVWZWNSZWc8MTUsICIkMTUiPiwgRHdhcmZSZWdOdW08WzE1XT47CitkZWYgUjE2IDogU1BVVmVjUmVnPDE2LCAiJDE2Ij4sIER3YXJmUmVnTnVtPFsxNl0+OworZGVmIFIxNyA6IFNQVVZlY1JlZzwxNywgIiQxNyI+LCBEd2FyZlJlZ051bTxbMTddPjsKK2RlZiBSMTggOiBTUFVWZWNSZWc8MTgsICIkMTgiPiwgRHdhcmZSZWdOdW08WzE4XT47CitkZWYgUjE5IDogU1BVVmVjUmVnPDE5LCAiJDE5Ij4sIER3YXJmUmVnTnVtPFsxOV0+OworZGVmIFIyMCA6IFNQVVZlY1JlZzwyMCwgIiQyMCI+LCBEd2FyZlJlZ051bTxbMjBdPjsKK2RlZiBSMjEgOiBTUFVWZWNSZWc8MjEsICIkMjEiPiwgRHdhcmZSZWdOdW08WzIxXT47CitkZWYgUjIyIDogU1BVVmVjUmVnPDIyLCAiJDIyIj4sIER3YXJmUmVnTnVtPFsyMl0+OworZGVmIFIyMyA6IFNQVVZlY1JlZzwyMywgIiQyMyI+LCBEd2FyZlJlZ051bTxbMjNdPjsKK2RlZiBSMjQgOiBTUFVWZWNSZWc8MjQsICIkMjQiPiwgRHdhcmZSZWdOdW08WzI0XT47CitkZWYgUjI1IDogU1BVVmVjUmVnPDI1LCAiJDI1Ij4sIER3YXJmUmVnTnVtPFsyNV0+OworZGVmIFIyNiA6IFNQVVZlY1JlZzwyNiwgIiQyNiI+LCBEd2FyZlJlZ051bTxbMjZdPjsKK2RlZiBSMjcgOiBTUFVWZWNSZWc8MjcsICIkMjciPiwgRHdhcmZSZWdOdW08WzI3XT47CitkZWYgUjI4IDogU1BVVmVjUmVnPDI4LCAiJDI4Ij4sIER3YXJmUmVnTnVtPFsyOF0+OworZGVmIFIyOSA6IFNQVVZlY1JlZzwyOSwgIiQyOSI+LCBEd2FyZlJlZ051bTxbMjldPjsKK2RlZiBSMzAgOiBTUFVWZWNSZWc8MzAsICIkMzAiPiwgRHdhcmZSZWdOdW08WzMwXT47CitkZWYgUjMxIDogU1BVVmVjUmVnPDMxLCAiJDMxIj4sIER3YXJmUmVnTnVtPFszMV0+OworZGVmIFIzMiA6IFNQVVZlY1JlZzwzMiwgIiQzMiI+LCBEd2FyZlJlZ051bTxbMzJdPjsKK2RlZiBSMzMgOiBTUFVWZWNSZWc8MzMsICIkMzMiPiwgRHdhcmZSZWdOdW08WzMzXT47CitkZWYgUjM0IDogU1BVVmVjUmVnPDM0LCAiJDM0Ij4sIER3YXJmUmVnTnVtPFszNF0+OworZGVmIFIzNSA6IFNQVVZlY1JlZzwzNSwgIiQzNSI+LCBEd2FyZlJlZ051bTxbMzVdPjsKK2RlZiBSMzYgOiBTUFVWZWNSZWc8MzYsICIkMzYiPiwgRHdhcmZSZWdOdW08WzM2XT47CitkZWYgUjM3IDogU1BVVmVjUmVnPDM3LCAiJDM3Ij4sIER3YXJmUmVnTnVtPFszN10+OworZGVmIFIzOCA6IFNQVVZlY1JlZzwzOCwgIiQzOCI+LCBEd2FyZlJlZ051bTxbMzhdPjsKK2RlZiBSMzkgOiBTUFVWZWNSZWc8MzksICIkMzkiPiwgRHdhcmZSZWdOdW08WzM5XT47CitkZWYgUjQwIDogU1BVVmVjUmVnPDQwLCAiJDQwIj4sIER3YXJmUmVnTnVtPFs0MF0+OworZGVmIFI0MSA6IFNQVVZlY1JlZzw0MSwgIiQ0MSI+LCBEd2FyZlJlZ051bTxbNDFdPjsKK2RlZiBSNDIgOiBTUFVWZWNSZWc8NDIsICIkNDIiPiwgRHdhcmZSZWdOdW08WzQyXT47CitkZWYgUjQzIDogU1BVVmVjUmVnPDQzLCAiJDQzIj4sIER3YXJmUmVnTnVtPFs0M10+OworZGVmIFI0NCA6IFNQVVZlY1JlZzw0NCwgIiQ0NCI+LCBEd2FyZlJlZ051bTxbNDRdPjsKK2RlZiBSNDUgOiBTUFVWZWNSZWc8NDUsICIkNDUiPiwgRHdhcmZSZWdOdW08WzQ1XT47CitkZWYgUjQ2IDogU1BVVmVjUmVnPDQ2LCAiJDQ2Ij4sIER3YXJmUmVnTnVtPFs0Nl0+OworZGVmIFI0NyA6IFNQVVZlY1JlZzw0NywgIiQ0NyI+LCBEd2FyZlJlZ051bTxbNDddPjsKK2RlZiBSNDggOiBTUFVWZWNSZWc8NDgsICIkNDgiPiwgRHdhcmZSZWdOdW08WzQ4XT47CitkZWYgUjQ5IDogU1BVVmVjUmVnPDQ5LCAiJDQ5Ij4sIER3YXJmUmVnTnVtPFs0OV0+OworZGVmIFI1MCA6IFNQVVZlY1JlZzw1MCwgIiQ1MCI+LCBEd2FyZlJlZ051bTxbNTBdPjsKK2RlZiBSNTEgOiBTUFVWZWNSZWc8NTEsICIkNTEiPiwgRHdhcmZSZWdOdW08WzUxXT47CitkZWYgUjUyIDogU1BVVmVjUmVnPDUyLCAiJDUyIj4sIER3YXJmUmVnTnVtPFs1Ml0+OworZGVmIFI1MyA6IFNQVVZlY1JlZzw1MywgIiQ1MyI+LCBEd2FyZlJlZ051bTxbNTNdPjsKK2RlZiBSNTQgOiBTUFVWZWNSZWc8NTQsICIkNTQiPiwgRHdhcmZSZWdOdW08WzU0XT47CitkZWYgUjU1IDogU1BVVmVjUmVnPDU1LCAiJDU1Ij4sIER3YXJmUmVnTnVtPFs1NV0+OworZGVmIFI1NiA6IFNQVVZlY1JlZzw1NiwgIiQ1NiI+LCBEd2FyZlJlZ051bTxbNTZdPjsKK2RlZiBSNTcgOiBTUFVWZWNSZWc8NTcsICIkNTciPiwgRHdhcmZSZWdOdW08WzU3XT47CitkZWYgUjU4IDogU1BVVmVjUmVnPDU4LCAiJDU4Ij4sIER3YXJmUmVnTnVtPFs1OF0+OworZGVmIFI1OSA6IFNQVVZlY1JlZzw1OSwgIiQ1OSI+LCBEd2FyZlJlZ051bTxbNTldPjsKK2RlZiBSNjAgOiBTUFVWZWNSZWc8NjAsICIkNjAiPiwgRHdhcmZSZWdOdW08WzYwXT47CitkZWYgUjYxIDogU1BVVmVjUmVnPDYxLCAiJDYxIj4sIER3YXJmUmVnTnVtPFs2MV0+OworZGVmIFI2MiA6IFNQVVZlY1JlZzw2MiwgIiQ2MiI+LCBEd2FyZlJlZ051bTxbNjJdPjsKK2RlZiBSNjMgOiBTUFVWZWNSZWc8NjMsICIkNjMiPiwgRHdhcmZSZWdOdW08WzYzXT47CitkZWYgUjY0IDogU1BVVmVjUmVnPDY0LCAiJDY0Ij4sIER3YXJmUmVnTnVtPFs2NF0+OworZGVmIFI2NSA6IFNQVVZlY1JlZzw2NSwgIiQ2NSI+LCBEd2FyZlJlZ051bTxbNjVdPjsKK2RlZiBSNjYgOiBTUFVWZWNSZWc8NjYsICIkNjYiPiwgRHdhcmZSZWdOdW08WzY2XT47CitkZWYgUjY3IDogU1BVVmVjUmVnPDY3LCAiJDY3Ij4sIER3YXJmUmVnTnVtPFs2N10+OworZGVmIFI2OCA6IFNQVVZlY1JlZzw2OCwgIiQ2OCI+LCBEd2FyZlJlZ051bTxbNjhdPjsKK2RlZiBSNjkgOiBTUFVWZWNSZWc8NjksICIkNjkiPiwgRHdhcmZSZWdOdW08WzY5XT47CitkZWYgUjcwIDogU1BVVmVjUmVnPDcwLCAiJDcwIj4sIER3YXJmUmVnTnVtPFs3MF0+OworZGVmIFI3MSA6IFNQVVZlY1JlZzw3MSwgIiQ3MSI+LCBEd2FyZlJlZ051bTxbNzFdPjsKK2RlZiBSNzIgOiBTUFVWZWNSZWc8NzIsICIkNzIiPiwgRHdhcmZSZWdOdW08WzcyXT47CitkZWYgUjczIDogU1BVVmVjUmVnPDczLCAiJDczIj4sIER3YXJmUmVnTnVtPFs3M10+OworZGVmIFI3NCA6IFNQVVZlY1JlZzw3NCwgIiQ3NCI+LCBEd2FyZlJlZ051bTxbNzRdPjsKK2RlZiBSNzUgOiBTUFVWZWNSZWc8NzUsICIkNzUiPiwgRHdhcmZSZWdOdW08Wzc1XT47CitkZWYgUjc2IDogU1BVVmVjUmVnPDc2LCAiJDc2Ij4sIER3YXJmUmVnTnVtPFs3Nl0+OworZGVmIFI3NyA6IFNQVVZlY1JlZzw3NywgIiQ3NyI+LCBEd2FyZlJlZ051bTxbNzddPjsKK2RlZiBSNzggOiBTUFVWZWNSZWc8NzgsICIkNzgiPiwgRHdhcmZSZWdOdW08Wzc4XT47CitkZWYgUjc5IDogU1BVVmVjUmVnPDc5LCAiJDc5Ij4sIER3YXJmUmVnTnVtPFs3OV0+OworZGVmIFI4MCA6IFNQVVZlY1JlZzw4MCwgIiQ4MCI+LCBEd2FyZlJlZ051bTxbODBdPjsKK2RlZiBSODEgOiBTUFVWZWNSZWc8ODEsICIkODEiPiwgRHdhcmZSZWdOdW08WzgxXT47CitkZWYgUjgyIDogU1BVVmVjUmVnPDgyLCAiJDgyIj4sIER3YXJmUmVnTnVtPFs4Ml0+OworZGVmIFI4MyA6IFNQVVZlY1JlZzw4MywgIiQ4MyI+LCBEd2FyZlJlZ051bTxbODNdPjsKK2RlZiBSODQgOiBTUFVWZWNSZWc8ODQsICIkODQiPiwgRHdhcmZSZWdOdW08Wzg0XT47CitkZWYgUjg1IDogU1BVVmVjUmVnPDg1LCAiJDg1Ij4sIER3YXJmUmVnTnVtPFs4NV0+OworZGVmIFI4NiA6IFNQVVZlY1JlZzw4NiwgIiQ4NiI+LCBEd2FyZlJlZ051bTxbODZdPjsKK2RlZiBSODcgOiBTUFVWZWNSZWc8ODcsICIkODciPiwgRHdhcmZSZWdOdW08Wzg3XT47CitkZWYgUjg4IDogU1BVVmVjUmVnPDg4LCAiJDg4Ij4sIER3YXJmUmVnTnVtPFs4OF0+OworZGVmIFI4OSA6IFNQVVZlY1JlZzw4OSwgIiQ4OSI+LCBEd2FyZlJlZ051bTxbODldPjsKK2RlZiBSOTAgOiBTUFVWZWNSZWc8OTAsICIkOTAiPiwgRHdhcmZSZWdOdW08WzkwXT47CitkZWYgUjkxIDogU1BVVmVjUmVnPDkxLCAiJDkxIj4sIER3YXJmUmVnTnVtPFs5MV0+OworZGVmIFI5MiA6IFNQVVZlY1JlZzw5MiwgIiQ5MiI+LCBEd2FyZlJlZ051bTxbOTJdPjsKK2RlZiBSOTMgOiBTUFVWZWNSZWc8OTMsICIkOTMiPiwgRHdhcmZSZWdOdW08WzkzXT47CitkZWYgUjk0IDogU1BVVmVjUmVnPDk0LCAiJDk0Ij4sIER3YXJmUmVnTnVtPFs5NF0+OworZGVmIFI5NSA6IFNQVVZlY1JlZzw5NSwgIiQ5NSI+LCBEd2FyZlJlZ051bTxbOTVdPjsKK2RlZiBSOTYgOiBTUFVWZWNSZWc8OTYsICIkOTYiPiwgRHdhcmZSZWdOdW08Wzk2XT47CitkZWYgUjk3IDogU1BVVmVjUmVnPDk3LCAiJDk3Ij4sIER3YXJmUmVnTnVtPFs5N10+OworZGVmIFI5OCA6IFNQVVZlY1JlZzw5OCwgIiQ5OCI+LCBEd2FyZlJlZ051bTxbOThdPjsKK2RlZiBSOTkgOiBTUFVWZWNSZWc8OTksICIkOTkiPiwgRHdhcmZSZWdOdW08Wzk5XT47CitkZWYgUjEwMCA6IFNQVVZlY1JlZzwxMDAsICIkMTAwIj4sIER3YXJmUmVnTnVtPFsxMDBdPjsKK2RlZiBSMTAxIDogU1BVVmVjUmVnPDEwMSwgIiQxMDEiPiwgRHdhcmZSZWdOdW08WzEwMV0+OworZGVmIFIxMDIgOiBTUFVWZWNSZWc8MTAyLCAiJDEwMiI+LCBEd2FyZlJlZ051bTxbMTAyXT47CitkZWYgUjEwMyA6IFNQVVZlY1JlZzwxMDMsICIkMTAzIj4sIER3YXJmUmVnTnVtPFsxMDNdPjsKK2RlZiBSMTA0IDogU1BVVmVjUmVnPDEwNCwgIiQxMDQiPiwgRHdhcmZSZWdOdW08WzEwNF0+OworZGVmIFIxMDUgOiBTUFVWZWNSZWc8MTA1LCAiJDEwNSI+LCBEd2FyZlJlZ051bTxbMTA1XT47CitkZWYgUjEwNiA6IFNQVVZlY1JlZzwxMDYsICIkMTA2Ij4sIER3YXJmUmVnTnVtPFsxMDZdPjsKK2RlZiBSMTA3IDogU1BVVmVjUmVnPDEwNywgIiQxMDciPiwgRHdhcmZSZWdOdW08WzEwN10+OworZGVmIFIxMDggOiBTUFVWZWNSZWc8MTA4LCAiJDEwOCI+LCBEd2FyZlJlZ051bTxbMTA4XT47CitkZWYgUjEwOSA6IFNQVVZlY1JlZzwxMDksICIkMTA5Ij4sIER3YXJmUmVnTnVtPFsxMDldPjsKK2RlZiBSMTEwIDogU1BVVmVjUmVnPDExMCwgIiQxMTAiPiwgRHdhcmZSZWdOdW08WzExMF0+OworZGVmIFIxMTEgOiBTUFVWZWNSZWc8MTExLCAiJDExMSI+LCBEd2FyZlJlZ051bTxbMTExXT47CitkZWYgUjExMiA6IFNQVVZlY1JlZzwxMTIsICIkMTEyIj4sIER3YXJmUmVnTnVtPFsxMTJdPjsKK2RlZiBSMTEzIDogU1BVVmVjUmVnPDExMywgIiQxMTMiPiwgRHdhcmZSZWdOdW08WzExM10+OworZGVmIFIxMTQgOiBTUFVWZWNSZWc8MTE0LCAiJDExNCI+LCBEd2FyZlJlZ051bTxbMTE0XT47CitkZWYgUjExNSA6IFNQVVZlY1JlZzwxMTUsICIkMTE1Ij4sIER3YXJmUmVnTnVtPFsxMTVdPjsKK2RlZiBSMTE2IDogU1BVVmVjUmVnPDExNiwgIiQxMTYiPiwgRHdhcmZSZWdOdW08WzExNl0+OworZGVmIFIxMTcgOiBTUFVWZWNSZWc8MTE3LCAiJDExNyI+LCBEd2FyZlJlZ051bTxbMTE3XT47CitkZWYgUjExOCA6IFNQVVZlY1JlZzwxMTgsICIkMTE4Ij4sIER3YXJmUmVnTnVtPFsxMThdPjsKK2RlZiBSMTE5IDogU1BVVmVjUmVnPDExOSwgIiQxMTkiPiwgRHdhcmZSZWdOdW08WzExOV0+OworZGVmIFIxMjAgOiBTUFVWZWNSZWc8MTIwLCAiJDEyMCI+LCBEd2FyZlJlZ051bTxbMTIwXT47CitkZWYgUjEyMSA6IFNQVVZlY1JlZzwxMjEsICIkMTIxIj4sIER3YXJmUmVnTnVtPFsxMjFdPjsKK2RlZiBSMTIyIDogU1BVVmVjUmVnPDEyMiwgIiQxMjIiPiwgRHdhcmZSZWdOdW08WzEyMl0+OworZGVmIFIxMjMgOiBTUFVWZWNSZWc8MTIzLCAiJDEyMyI+LCBEd2FyZlJlZ051bTxbMTIzXT47CitkZWYgUjEyNCA6IFNQVVZlY1JlZzwxMjQsICIkMTI0Ij4sIER3YXJmUmVnTnVtPFsxMjRdPjsKK2RlZiBSMTI1IDogU1BVVmVjUmVnPDEyNSwgIiQxMjUiPiwgRHdhcmZSZWdOdW08WzEyNV0+OworZGVmIFIxMjYgOiBTUFVWZWNSZWc8MTI2LCAiJDEyNiI+LCBEd2FyZlJlZ051bTxbMTI2XT47CitkZWYgUjEyNyA6IFNQVVZlY1JlZzwxMjcsICIkMTI3Ij4sIER3YXJmUmVnTnVtPFsxMjddPjsKKworLyogTmVlZCBmbG9hdGluZyBwb2ludCBzdGF0dXMgcmVnaXN0ZXIgaGVyZTogKi8KKy8qIGRlZiBGUENTUiA6IC4uLiAqLworCisvLyBUaGUgU1BVJ3MgcmVnaXN0ZXJzIGFzIDEyOC1iaXQgd2lkZSBlbnRpdGllcywgYW5kIGNhbiBmdW5jdGlvbiBhcyBnZW5lcmFsCisvLyBwdXJwb3NlIHJlZ2lzdGVycywgd2hlcmUgdGhlIG9wZXJhbmRzIGFyZSBpbiB0aGUgInByZWZlcnJlZCBzbG90IjoKK2RlZiBHUFJDIDogUmVnaXN0ZXJDbGFzczwiU1BVIiwgW2kxMjhdLCAxMjgsCisgWworICAgLyogdm9sYXRpbGUgcmVnaXN0ZXIgKi8KKyAgIFIzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LCBSMTAsIFIxMSwgUjEyLCBSMTMsIFIxNCwgUjE1LCBSMTYsIAorICAgUjE3LCBSMTgsIFIxOSwgUjIwLCBSMjEsIFIyMiwgUjIzLCBSMjQsIFIyNSwgUjI2LCBSMjcsIFIyOCwgUjI5LCBSMzAsIFIzMSwKKyAgIFIzMiwgUjMzLCBSMzQsIFIzNSwgUjM2LCBSMzcsIFIzOCwgUjM5LCBSNDAsIFI0MSwgUjQyLCBSNDMsIFI0NCwgUjQ1LCBSNDYsCisgICBSNDcsIFI0OCwgUjQ5LCBSNTAsIFI1MSwgUjUyLCBSNTMsIFI1NCwgUjU1LCBSNTYsIFI1NywgUjU4LCBSNTksIFI2MCwgUjYxLAorICAgUjYyLCBSNjMsIFI2NCwgUjY1LCBSNjYsIFI2NywgUjY4LCBSNjksIFI3MCwgUjcxLCBSNzIsIFI3MywgUjc0LCBSNzUsIFI3NiwKKyAgIFI3NywgUjc4LCBSNzksCisgICAvKiBub24tdm9sYXRpbGUgcmVnaXN0ZXI6IHRha2UgaGludCBmcm9tIFBQQyBhbmQgYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciAqLworICAgUjEyNywgUjEyNiwgUjEyNSwgUjEyNCwgUjEyMywgUjEyMiwgUjEyMSwgUjEyMCwgUjExOSwgUjExOCwgUjExNywgUjExNiwgUjExNSwKKyAgIFIxMTQsIFIxMTMsIFIxMTIsIFIxMTEsIFIxMTAsIFIxMDksIFIxMDgsIFIxMDcsIFIxMDYsIFIxMDUsIFIxMDQsIFIxMDMsIFIxMDIsCisgICBSMTAxLCBSMTAwLCBSOTksIFI5OCwgUjk3LCBSOTYsIFI5NSwgUjk0LCBSOTMsIFI5MiwgUjkxLCBSOTAsIFI4OSwgUjg4LCBSODcsCisgICBSODYsIFI4NSwgUjg0LCBSODMsIFI4MiwgUjgxLCBSODAsIAorICAgLyogZW52aXJvbm1lbnQgcHRyLCBTUCwgTFIgKi8gCisgICBSMiwgUjEsIFIwIF0+Cit7CisgIGxldCBNZXRob2RQcm90b3MgPSBbeworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIH1dOworICBsZXQgTWV0aG9kQm9kaWVzID0gW3sKKyAgICBHUFJDQ2xhc3M6Oml0ZXJhdG9yCisgICAgR1BSQ0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiZWdpbigpOworICAgIH0KKyAgICBHUFJDQ2xhc3M6Oml0ZXJhdG9yCisgICAgR1BSQ0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICByZXR1cm4gZW5kKCktMzsgIC8vIGRvbid0IGFsbG9jYXRlIFIyLCBSMSwgb3IgUjAgKGVudnAsIHNwLCBscikKKyAgICB9CisgIH1dOworfQorCisvLyBUaGUgU1BVJ3MgcmVnaXN0ZXJzIGFzIDY0LWJpdCB3aWRlIChkb3VibGUgd29yZCBpbnRlZ2VyKSAicHJlZmVycmVkIHNsb3QiOgorZGVmIFI2NEMgOiBSZWdpc3RlckNsYXNzPCJTUFUiLCBbaTY0XSwgMTI4LAorIFsKKyAgIC8qIHZvbGF0aWxlIHJlZ2lzdGVyICovCisgICBSMywgUjQsIFI1LCBSNiwgUjcsIFI4LCBSOSwgUjEwLCBSMTEsIFIxMiwgUjEzLCBSMTQsIFIxNSwgUjE2LCAKKyAgIFIxNywgUjE4LCBSMTksIFIyMCwgUjIxLCBSMjIsIFIyMywgUjI0LCBSMjUsIFIyNiwgUjI3LCBSMjgsIFIyOSwgUjMwLCBSMzEsCisgICBSMzIsIFIzMywgUjM0LCBSMzUsIFIzNiwgUjM3LCBSMzgsIFIzOSwgUjQwLCBSNDEsIFI0MiwgUjQzLCBSNDQsIFI0NSwgUjQ2LAorICAgUjQ3LCBSNDgsIFI0OSwgUjUwLCBSNTEsIFI1MiwgUjUzLCBSNTQsIFI1NSwgUjU2LCBSNTcsIFI1OCwgUjU5LCBSNjAsIFI2MSwKKyAgIFI2MiwgUjYzLCBSNjQsIFI2NSwgUjY2LCBSNjcsIFI2OCwgUjY5LCBSNzAsIFI3MSwgUjcyLCBSNzMsIFI3NCwgUjc1LCBSNzYsCisgICBSNzcsIFI3OCwgUjc5LAorICAgLyogbm9uLXZvbGF0aWxlIHJlZ2lzdGVyOiB0YWtlIGhpbnQgZnJvbSBQUEMgYW5kIGFsbG9jYXRlIGluIHJldmVyc2Ugb3JkZXIgKi8KKyAgIFIxMjcsIFIxMjYsIFIxMjUsIFIxMjQsIFIxMjMsIFIxMjIsIFIxMjEsIFIxMjAsIFIxMTksIFIxMTgsIFIxMTcsIFIxMTYsIFIxMTUsCisgICBSMTE0LCBSMTEzLCBSMTEyLCBSMTExLCBSMTEwLCBSMTA5LCBSMTA4LCBSMTA3LCBSMTA2LCBSMTA1LCBSMTA0LCBSMTAzLCBSMTAyLAorICAgUjEwMSwgUjEwMCwgUjk5LCBSOTgsIFI5NywgUjk2LCBSOTUsIFI5NCwgUjkzLCBSOTIsIFI5MSwgUjkwLCBSODksIFI4OCwgUjg3LAorICAgUjg2LCBSODUsIFI4NCwgUjgzLCBSODIsIFI4MSwgUjgwLCAKKyAgIC8qIGVudmlyb25tZW50IHB0ciwgU1AsIExSICovIAorICAgUjIsIFIxLCBSMCBdPgoreworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB9XTsKKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7CisgICAgUjY0Q0NsYXNzOjppdGVyYXRvcgorICAgIFI2NENDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICByZXR1cm4gYmVnaW4oKTsKKyAgICB9CisgICAgUjY0Q0NsYXNzOjppdGVyYXRvcgorICAgIFI2NENDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgcmV0dXJuIGVuZCgpLTM7ICAvLyBkb24ndCBhbGxvY2F0ZSBSMiwgUjEsIG9yIFIwIChlbnZwLCBzcCwgbHIpCisgICAgfQorICB9XTsKK30KKworLy8gVGhlIFNQVSdzIHJlZ2lzdGVycyBhcyA2NC1iaXQgd2lkZSAoZG91YmxlIHdvcmQpIEZQICJwcmVmZXJyZWQgc2xvdCI6CitkZWYgUjY0RlAgOiBSZWdpc3RlckNsYXNzPCJTUFUiLCBbZjY0XSwgMTI4LAorIFsKKyAgIC8qIHZvbGF0aWxlIHJlZ2lzdGVyICovCisgICBSMywgUjQsIFI1LCBSNiwgUjcsIFI4LCBSOSwgUjEwLCBSMTEsIFIxMiwgUjEzLCBSMTQsIFIxNSwgUjE2LCAKKyAgIFIxNywgUjE4LCBSMTksIFIyMCwgUjIxLCBSMjIsIFIyMywgUjI0LCBSMjUsIFIyNiwgUjI3LCBSMjgsIFIyOSwgUjMwLCBSMzEsCisgICBSMzIsIFIzMywgUjM0LCBSMzUsIFIzNiwgUjM3LCBSMzgsIFIzOSwgUjQwLCBSNDEsIFI0MiwgUjQzLCBSNDQsIFI0NSwgUjQ2LAorICAgUjQ3LCBSNDgsIFI0OSwgUjUwLCBSNTEsIFI1MiwgUjUzLCBSNTQsIFI1NSwgUjU2LCBSNTcsIFI1OCwgUjU5LCBSNjAsIFI2MSwKKyAgIFI2MiwgUjYzLCBSNjQsIFI2NSwgUjY2LCBSNjcsIFI2OCwgUjY5LCBSNzAsIFI3MSwgUjcyLCBSNzMsIFI3NCwgUjc1LCBSNzYsCisgICBSNzcsIFI3OCwgUjc5LAorICAgLyogbm9uLXZvbGF0aWxlIHJlZ2lzdGVyOiB0YWtlIGhpbnQgZnJvbSBQUEMgYW5kIGFsbG9jYXRlIGluIHJldmVyc2Ugb3JkZXIgKi8KKyAgIFIxMjcsIFIxMjYsIFIxMjUsIFIxMjQsIFIxMjMsIFIxMjIsIFIxMjEsIFIxMjAsIFIxMTksIFIxMTgsIFIxMTcsIFIxMTYsIFIxMTUsCisgICBSMTE0LCBSMTEzLCBSMTEyLCBSMTExLCBSMTEwLCBSMTA5LCBSMTA4LCBSMTA3LCBSMTA2LCBSMTA1LCBSMTA0LCBSMTAzLCBSMTAyLAorICAgUjEwMSwgUjEwMCwgUjk5LCBSOTgsIFI5NywgUjk2LCBSOTUsIFI5NCwgUjkzLCBSOTIsIFI5MSwgUjkwLCBSODksIFI4OCwgUjg3LAorICAgUjg2LCBSODUsIFI4NCwgUjgzLCBSODIsIFI4MSwgUjgwLCAKKyAgIC8qIGVudmlyb25tZW50IHB0ciwgU1AsIExSICovIAorICAgUjIsIFIxLCBSMCBdPgoreworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB9XTsKKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7CisgICAgUjY0RlBDbGFzczo6aXRlcmF0b3IKKyAgICBSNjRGUENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiZWdpbigpOworICAgIH0KKyAgICBSNjRGUENsYXNzOjppdGVyYXRvcgorICAgIFI2NEZQQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBlbmQoKS0zOyAgLy8gZG9uJ3QgYWxsb2NhdGUgUjIsIFIxLCBvciBSMCAoZW52cCwgc3AsIGxyKQorICAgIH0KKyAgfV07Cit9CisKKy8vIFRoZSBTUFUncyByZWdpc3RlcnMgYXMgMzItYml0IHdpZGUgKHdvcmQpICJwcmVmZXJyZWQgc2xvdCI6CitkZWYgUjMyQyA6IFJlZ2lzdGVyQ2xhc3M8IlNQVSIsIFtpMzJdLCAxMjgsCisgWworICAgLyogdm9sYXRpbGUgcmVnaXN0ZXIgKi8KKyAgIFIzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LCBSMTAsIFIxMSwgUjEyLCBSMTMsIFIxNCwgUjE1LCBSMTYsIAorICAgUjE3LCBSMTgsIFIxOSwgUjIwLCBSMjEsIFIyMiwgUjIzLCBSMjQsIFIyNSwgUjI2LCBSMjcsIFIyOCwgUjI5LCBSMzAsIFIzMSwKKyAgIFIzMiwgUjMzLCBSMzQsIFIzNSwgUjM2LCBSMzcsIFIzOCwgUjM5LCBSNDAsIFI0MSwgUjQyLCBSNDMsIFI0NCwgUjQ1LCBSNDYsCisgICBSNDcsIFI0OCwgUjQ5LCBSNTAsIFI1MSwgUjUyLCBSNTMsIFI1NCwgUjU1LCBSNTYsIFI1NywgUjU4LCBSNTksIFI2MCwgUjYxLAorICAgUjYyLCBSNjMsIFI2NCwgUjY1LCBSNjYsIFI2NywgUjY4LCBSNjksIFI3MCwgUjcxLCBSNzIsIFI3MywgUjc0LCBSNzUsIFI3NiwKKyAgIFI3NywgUjc4LCBSNzksCisgICAvKiBub24tdm9sYXRpbGUgcmVnaXN0ZXI6IHRha2UgaGludCBmcm9tIFBQQyBhbmQgYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciAqLworICAgUjEyNywgUjEyNiwgUjEyNSwgUjEyNCwgUjEyMywgUjEyMiwgUjEyMSwgUjEyMCwgUjExOSwgUjExOCwgUjExNywgUjExNiwgUjExNSwKKyAgIFIxMTQsIFIxMTMsIFIxMTIsIFIxMTEsIFIxMTAsIFIxMDksIFIxMDgsIFIxMDcsIFIxMDYsIFIxMDUsIFIxMDQsIFIxMDMsIFIxMDIsCisgICBSMTAxLCBSMTAwLCBSOTksIFI5OCwgUjk3LCBSOTYsIFI5NSwgUjk0LCBSOTMsIFI5MiwgUjkxLCBSOTAsIFI4OSwgUjg4LCBSODcsCisgICBSODYsIFI4NSwgUjg0LCBSODMsIFI4MiwgUjgxLCBSODAsIAorICAgLyogZW52aXJvbm1lbnQgcHRyLCBTUCwgTFIgKi8gCisgICBSMiwgUjEsIFIwIF0+Cit7CisgIGxldCBNZXRob2RQcm90b3MgPSBbeworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIH1dOworICBsZXQgTWV0aG9kQm9kaWVzID0gW3sKKyAgICBSMzJDQ2xhc3M6Oml0ZXJhdG9yCisgICAgUjMyQ0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiZWdpbigpOworICAgIH0KKyAgICBSMzJDQ2xhc3M6Oml0ZXJhdG9yCisgICAgUjMyQ0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICByZXR1cm4gZW5kKCktMzsgIC8vIGRvbid0IGFsbG9jYXRlIFIyLCBSMSwgb3IgUjAgKGVudnAsIHNwLCBscikKKyAgICB9CisgIH1dOworfQorCisvLyBUaGUgU1BVJ3MgcmVnaXN0ZXJzIGFzIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgInByZWZlcnJlZCBzbG90IjoKK2RlZiBSMzJGUCA6IFJlZ2lzdGVyQ2xhc3M8IlNQVSIsIFtmMzJdLCAxMjgsCisgWworICAgLyogdm9sYXRpbGUgcmVnaXN0ZXIgKi8KKyAgIFIzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LCBSMTAsIFIxMSwgUjEyLCBSMTMsIFIxNCwgUjE1LCBSMTYsIAorICAgUjE3LCBSMTgsIFIxOSwgUjIwLCBSMjEsIFIyMiwgUjIzLCBSMjQsIFIyNSwgUjI2LCBSMjcsIFIyOCwgUjI5LCBSMzAsIFIzMSwKKyAgIFIzMiwgUjMzLCBSMzQsIFIzNSwgUjM2LCBSMzcsIFIzOCwgUjM5LCBSNDAsIFI0MSwgUjQyLCBSNDMsIFI0NCwgUjQ1LCBSNDYsCisgICBSNDcsIFI0OCwgUjQ5LCBSNTAsIFI1MSwgUjUyLCBSNTMsIFI1NCwgUjU1LCBSNTYsIFI1NywgUjU4LCBSNTksIFI2MCwgUjYxLAorICAgUjYyLCBSNjMsIFI2NCwgUjY1LCBSNjYsIFI2NywgUjY4LCBSNjksIFI3MCwgUjcxLCBSNzIsIFI3MywgUjc0LCBSNzUsIFI3NiwKKyAgIFI3NywgUjc4LCBSNzksCisgICAvKiBub24tdm9sYXRpbGUgcmVnaXN0ZXI6IHRha2UgaGludCBmcm9tIFBQQyBhbmQgYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciAqLworICAgUjEyNywgUjEyNiwgUjEyNSwgUjEyNCwgUjEyMywgUjEyMiwgUjEyMSwgUjEyMCwgUjExOSwgUjExOCwgUjExNywgUjExNiwgUjExNSwKKyAgIFIxMTQsIFIxMTMsIFIxMTIsIFIxMTEsIFIxMTAsIFIxMDksIFIxMDgsIFIxMDcsIFIxMDYsIFIxMDUsIFIxMDQsIFIxMDMsIFIxMDIsCisgICBSMTAxLCBSMTAwLCBSOTksIFI5OCwgUjk3LCBSOTYsIFI5NSwgUjk0LCBSOTMsIFI5MiwgUjkxLCBSOTAsIFI4OSwgUjg4LCBSODcsCisgICBSODYsIFI4NSwgUjg0LCBSODMsIFI4MiwgUjgxLCBSODAsIAorICAgLyogZW52aXJvbm1lbnQgcHRyLCBTUCwgTFIgKi8gCisgICBSMiwgUjEsIFIwIF0+Cit7CisgIGxldCBNZXRob2RQcm90b3MgPSBbeworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIH1dOworICBsZXQgTWV0aG9kQm9kaWVzID0gW3sKKyAgICBSMzJGUENsYXNzOjppdGVyYXRvcgorICAgIFIzMkZQQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgcmV0dXJuIGJlZ2luKCk7CisgICAgfQorICAgIFIzMkZQQ2xhc3M6Oml0ZXJhdG9yCisgICAgUjMyRlBDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgcmV0dXJuIGVuZCgpLTM7ICAvLyBkb24ndCBhbGxvY2F0ZSBSMiwgUjEsIG9yIFIwIChlbnZwLCBzcCwgbHIpCisgICAgfQorICB9XTsKK30KKworLy8gVGhlIFNQVSdzIHJlZ2lzdGVycyBhcyAxNi1iaXQgd2lkZSAoaGFsZndvcmQpICJwcmVmZXJyZWQgc2xvdCI6CitkZWYgUjE2QyA6IFJlZ2lzdGVyQ2xhc3M8IlNQVSIsIFtpMTZdLCAxMjgsCisgWworICAgLyogdm9sYXRpbGUgcmVnaXN0ZXIgKi8KKyAgIFIzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LCBSMTAsIFIxMSwgUjEyLCBSMTMsIFIxNCwgUjE1LCBSMTYsIAorICAgUjE3LCBSMTgsIFIxOSwgUjIwLCBSMjEsIFIyMiwgUjIzLCBSMjQsIFIyNSwgUjI2LCBSMjcsIFIyOCwgUjI5LCBSMzAsIFIzMSwKKyAgIFIzMiwgUjMzLCBSMzQsIFIzNSwgUjM2LCBSMzcsIFIzOCwgUjM5LCBSNDAsIFI0MSwgUjQyLCBSNDMsIFI0NCwgUjQ1LCBSNDYsCisgICBSNDcsIFI0OCwgUjQ5LCBSNTAsIFI1MSwgUjUyLCBSNTMsIFI1NCwgUjU1LCBSNTYsIFI1NywgUjU4LCBSNTksIFI2MCwgUjYxLAorICAgUjYyLCBSNjMsIFI2NCwgUjY1LCBSNjYsIFI2NywgUjY4LCBSNjksIFI3MCwgUjcxLCBSNzIsIFI3MywgUjc0LCBSNzUsIFI3NiwKKyAgIFI3NywgUjc4LCBSNzksCisgICAvKiBub24tdm9sYXRpbGUgcmVnaXN0ZXI6IHRha2UgaGludCBmcm9tIFBQQyBhbmQgYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciAqLworICAgUjEyNywgUjEyNiwgUjEyNSwgUjEyNCwgUjEyMywgUjEyMiwgUjEyMSwgUjEyMCwgUjExOSwgUjExOCwgUjExNywgUjExNiwgUjExNSwKKyAgIFIxMTQsIFIxMTMsIFIxMTIsIFIxMTEsIFIxMTAsIFIxMDksIFIxMDgsIFIxMDcsIFIxMDYsIFIxMDUsIFIxMDQsIFIxMDMsIFIxMDIsCisgICBSMTAxLCBSMTAwLCBSOTksIFI5OCwgUjk3LCBSOTYsIFI5NSwgUjk0LCBSOTMsIFI5MiwgUjkxLCBSOTAsIFI4OSwgUjg4LCBSODcsCisgICBSODYsIFI4NSwgUjg0LCBSODMsIFI4MiwgUjgxLCBSODAsIAorICAgLyogZW52aXJvbm1lbnQgcHRyLCBTUCwgTFIgKi8gCisgICBSMiwgUjEsIFIwIF0+Cit7CisgIGxldCBNZXRob2RQcm90b3MgPSBbeworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIH1dOworICBsZXQgTWV0aG9kQm9kaWVzID0gW3sKKyAgICBSMTZDQ2xhc3M6Oml0ZXJhdG9yCisgICAgUjE2Q0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiZWdpbigpOworICAgIH0KKyAgICBSMTZDQ2xhc3M6Oml0ZXJhdG9yCisgICAgUjE2Q0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICByZXR1cm4gZW5kKCktMzsgIC8vIGRvbid0IGFsbG9jYXRlIFIyLCBSMSwgb3IgUjAgKGVudnAsIHNwLCBscikKKyAgICB9CisgIH1dOworfQorCisvLyBUaGUgU1BVJ3MgcmVnaXN0ZXJzIGFzIDgtYml0IHdpZGUgKGJ5dGUpICJwcmVmZXJyZWQgc2xvdCI6CitkZWYgUjhDIDogUmVnaXN0ZXJDbGFzczwiU1BVIiwgW2k4XSwgMTI4LAorIFsKKyAgIC8qIHZvbGF0aWxlIHJlZ2lzdGVyICovCisgICBSMywgUjQsIFI1LCBSNiwgUjcsIFI4LCBSOSwgUjEwLCBSMTEsIFIxMiwgUjEzLCBSMTQsIFIxNSwgUjE2LCAKKyAgIFIxNywgUjE4LCBSMTksIFIyMCwgUjIxLCBSMjIsIFIyMywgUjI0LCBSMjUsIFIyNiwgUjI3LCBSMjgsIFIyOSwgUjMwLCBSMzEsCisgICBSMzIsIFIzMywgUjM0LCBSMzUsIFIzNiwgUjM3LCBSMzgsIFIzOSwgUjQwLCBSNDEsIFI0MiwgUjQzLCBSNDQsIFI0NSwgUjQ2LAorICAgUjQ3LCBSNDgsIFI0OSwgUjUwLCBSNTEsIFI1MiwgUjUzLCBSNTQsIFI1NSwgUjU2LCBSNTcsIFI1OCwgUjU5LCBSNjAsIFI2MSwKKyAgIFI2MiwgUjYzLCBSNjQsIFI2NSwgUjY2LCBSNjcsIFI2OCwgUjY5LCBSNzAsIFI3MSwgUjcyLCBSNzMsIFI3NCwgUjc1LCBSNzYsCisgICBSNzcsIFI3OCwgUjc5LAorICAgLyogbm9uLXZvbGF0aWxlIHJlZ2lzdGVyOiB0YWtlIGhpbnQgZnJvbSBQUEMgYW5kIGFsbG9jYXRlIGluIHJldmVyc2Ugb3JkZXIgKi8KKyAgIFIxMjcsIFIxMjYsIFIxMjUsIFIxMjQsIFIxMjMsIFIxMjIsIFIxMjEsIFIxMjAsIFIxMTksIFIxMTgsIFIxMTcsIFIxMTYsIFIxMTUsCisgICBSMTE0LCBSMTEzLCBSMTEyLCBSMTExLCBSMTEwLCBSMTA5LCBSMTA4LCBSMTA3LCBSMTA2LCBSMTA1LCBSMTA0LCBSMTAzLCBSMTAyLAorICAgUjEwMSwgUjEwMCwgUjk5LCBSOTgsIFI5NywgUjk2LCBSOTUsIFI5NCwgUjkzLCBSOTIsIFI5MSwgUjkwLCBSODksIFI4OCwgUjg3LAorICAgUjg2LCBSODUsIFI4NCwgUjgzLCBSODIsIFI4MSwgUjgwLCAKKyAgIC8qIGVudmlyb25tZW50IHB0ciwgU1AsIExSICovIAorICAgUjIsIFIxLCBSMCBdPgoreworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB9XTsKKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7CisgICAgUjhDQ2xhc3M6Oml0ZXJhdG9yCisgICAgUjhDQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgcmV0dXJuIGJlZ2luKCk7CisgICAgfQorICAgIFI4Q0NsYXNzOjppdGVyYXRvcgorICAgIFI4Q0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICByZXR1cm4gZW5kKCktMzsgIC8vIGRvbid0IGFsbG9jYXRlIFIyLCBSMSwgb3IgUjAgKGVudnAsIHNwLCBscikKKyAgICB9CisgIH1dOworfQorCisvLyBUaGUgU1BVJ3MgcmVnaXN0ZXJzIGFzIHZlY3RvciByZWdpc3RlcnM6CitkZWYgVkVDUkVHIDogUmVnaXN0ZXJDbGFzczwiU1BVIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2MTZpOCx2OGkxNix2MmkzMix2MmYzMix2NGkzMix2NGYzMix2Mmk2NCx2MmY2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCisgWworICAgLyogdm9sYXRpbGUgcmVnaXN0ZXIgKi8KKyAgIFIzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LCBSMTAsIFIxMSwgUjEyLCBSMTMsIFIxNCwgUjE1LCBSMTYsIAorICAgUjE3LCBSMTgsIFIxOSwgUjIwLCBSMjEsIFIyMiwgUjIzLCBSMjQsIFIyNSwgUjI2LCBSMjcsIFIyOCwgUjI5LCBSMzAsIFIzMSwKKyAgIFIzMiwgUjMzLCBSMzQsIFIzNSwgUjM2LCBSMzcsIFIzOCwgUjM5LCBSNDAsIFI0MSwgUjQyLCBSNDMsIFI0NCwgUjQ1LCBSNDYsCisgICBSNDcsIFI0OCwgUjQ5LCBSNTAsIFI1MSwgUjUyLCBSNTMsIFI1NCwgUjU1LCBSNTYsIFI1NywgUjU4LCBSNTksIFI2MCwgUjYxLAorICAgUjYyLCBSNjMsIFI2NCwgUjY1LCBSNjYsIFI2NywgUjY4LCBSNjksIFI3MCwgUjcxLCBSNzIsIFI3MywgUjc0LCBSNzUsIFI3NiwKKyAgIFI3NywgUjc4LCBSNzksCisgICAvKiBub24tdm9sYXRpbGUgcmVnaXN0ZXI6IHRha2UgaGludCBmcm9tIFBQQyBhbmQgYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciAqLworICAgUjEyNywgUjEyNiwgUjEyNSwgUjEyNCwgUjEyMywgUjEyMiwgUjEyMSwgUjEyMCwgUjExOSwgUjExOCwgUjExNywgUjExNiwgUjExNSwKKyAgIFIxMTQsIFIxMTMsIFIxMTIsIFIxMTEsIFIxMTAsIFIxMDksIFIxMDgsIFIxMDcsIFIxMDYsIFIxMDUsIFIxMDQsIFIxMDMsIFIxMDIsCisgICBSMTAxLCBSMTAwLCBSOTksIFI5OCwgUjk3LCBSOTYsIFI5NSwgUjk0LCBSOTMsIFI5MiwgUjkxLCBSOTAsIFI4OSwgUjg4LCBSODcsCisgICBSODYsIFI4NSwgUjg0LCBSODMsIFI4MiwgUjgxLCBSODAsIAorICAgLyogZW52aXJvbm1lbnQgcHRyLCBTUCwgTFIgKi8gCisgICBSMiwgUjEsIFIwIF0+Cit7CisgIGxldCBNZXRob2RQcm90b3MgPSBbeworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIH1dOworICBsZXQgTWV0aG9kQm9kaWVzID0gW3sKKyAgICBWRUNSRUdDbGFzczo6aXRlcmF0b3IKKyAgICBWRUNSRUdDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICByZXR1cm4gYmVnaW4oKTsKKyAgICB9CisgICAgVkVDUkVHQ2xhc3M6Oml0ZXJhdG9yCisgICAgVkVDUkVHQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBlbmQoKS0zOyAgLy8gZG9uJ3QgYWxsb2NhdGUgUjIsIFIxLCBvciBSMCAoZW52cCwgc3AsIGxyKQorICAgIH0KKyAgfV07Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVUmVnaXN0ZXJOYW1lcy5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVJlZ2lzdGVyTmFtZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzNhZmRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVJlZ2lzdGVyTmFtZXMuaApAQCAtMCwwICsxLDE4IEBACisvLz09PS0gU1BVUmVnaXN0ZXJOYW1lcy5oIC0gV3JhcHBlciBoZWFkZXIgZm9yIFNQVSByZWdpc3RlciBuYW1lcyAtKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFNQVV9SRUdJU1RFUl9OQU1FU19ICisjZGVmaW5lIFNQVV9SRUdJU1RFUl9OQU1FU19ICisKKy8vIERlZmluZSBzeW1ib2xpYyBuYW1lcyBmb3IgQ2VsbCByZWdpc3RlcnMuICBUaGlzIGRlZmluZXMgYSBtYXBwaW5nIGZyb20KKy8vIHJlZ2lzdGVyIG5hbWUgdG8gcmVnaXN0ZXIgbnVtYmVyLgorLy8KKyNpbmNsdWRlICJTUFVHZW5SZWdpc3Rlck5hbWVzLmluYyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVU2NoZWR1bGUudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVU2NoZWR1bGUudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiNTgxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVTY2hlZHVsZS50ZApAQCAtMCwwICsxLDU3IEBACisvLz09PS0gU1BVU2NoZWR1bGUudGQgLSBDZWxsIFNjaGVkdWxpbmcgRGVmaW5pdGlvbnMgLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBFdmVuIHBpcGVsaW5lOgorCitkZWYgRVZFTl9VTklUIDogRnVuY1VuaXQ7ICAgICAgIC8vIEV2ZW4gZXhlY3V0aW9uIHVuaXQ6IChQQyAmIDB4NyA9PSAwMDApCitkZWYgT0REX1VOSVQgIDogRnVuY1VuaXQ7ICAgICAgIC8vIE9kZCBleGVjdXRpb24gdW5pdDogIChQQyAmIDB4NyA9PSAxMDApCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBJdGluZXJhcnkgY2xhc3NlcyB1c2VkIGZvciBDZWxsIFNQVQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIExvYWRTdG9yZSAgICA6IEluc3RySXRpbkNsYXNzOyAgICAgICAgICAgICAgLy8gT0REX1VOSVQKK2RlZiBCcmFuY2hIaW50cyAgOiBJbnN0ckl0aW5DbGFzczsgICAgICAgICAgICAgIC8vIE9ERF9VTklUCitkZWYgQnJhbmNoUmVzb2x2IDogSW5zdHJJdGluQ2xhc3M7ICAgICAgICAgICAgICAvLyBPRERfVU5JVAorZGVmIENoYW5PcFNQUiAgICA6IEluc3RySXRpbkNsYXNzOyAgICAgICAgICAgICAgLy8gT0REX1VOSVQKK2RlZiBTaHVmZmxlT3AgICAgOiBJbnN0ckl0aW5DbGFzczsgICAgICAgICAgICAgIC8vIE9ERF9VTklUCitkZWYgU2VsZWN0T3AgICAgIDogSW5zdHJJdGluQ2xhc3M7ICAgICAgICAgICAgICAvLyBPRERfVU5JVAorZGVmIEdhdGhlck9wICAgICA6IEluc3RySXRpbkNsYXNzOyAgICAgICAgICAgICAgLy8gT0REX1VOSVQKK2RlZiBMb2FkTk9QICAgICAgOiBJbnN0ckl0aW5DbGFzczsgICAgICAgICAgICAgIC8vIE9ERF9VTklUCitkZWYgRXhlY05PUCAgICAgIDogSW5zdHJJdGluQ2xhc3M7ICAgICAgICAgICAgICAvLyBFVkVOX1VOSVQKK2RlZiBTUHJlY0ZQICAgICAgOiBJbnN0ckl0aW5DbGFzczsgICAgICAgICAgICAgIC8vIEVWRU5fVU5JVAorZGVmIERQcmVjRlAgICAgICA6IEluc3RySXRpbkNsYXNzOyAgICAgICAgICAgICAgLy8gRVZFTl9VTklUCitkZWYgRlBJbnQgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7ICAgICAgICAgICAgICAvLyBFVkVOX1VOSVQgKEZQPC0+aW50ZWdlcikKK2RlZiBCeXRlT3AgICAgICAgOiBJbnN0ckl0aW5DbGFzczsgICAgICAgICAgICAgIC8vIEVWRU5fVU5JVAorZGVmIEludGVnZXJPcCAgICA6IEluc3RySXRpbkNsYXNzOyAgICAgICAgICAgICAgLy8gRVZFTl9VTklUCitkZWYgSW50ZWdlck11bERpdjogSW5zdHJJdGluQ2xhc3M7ICAgICAgICAgICAgICAvLyBFVkVOX1VOSVQKK2RlZiBSb3RhdGVTaGlmdCAgOiBJbnN0ckl0aW5DbGFzczsgICAgICAgICAgICAgIC8vIEVWRU5fVU5JVAorZGVmIEltbUxvYWQgICAgICA6IEluc3RySXRpbkNsYXNzOyAgICAgICAgICAgICAgLy8gRVZFTl9VTklUCisKKy8qIE5vdGU6IFRoZSBpdGluZXJhcnkgZm9yIHRoZSBDZWxsIFNQVSBpcyBzb21ld2hhdCBjb250cml2ZWQuLi4gKi8KK2RlZiBTUFVJdGluZXJhcmllcyA6IFByb2Nlc3Nvckl0aW5lcmFyaWVzPFtPRERfVU5JVCwgRVZFTl9VTklUXSwgWworICBJbnN0ckl0aW5EYXRhPExvYWRTdG9yZSAgICwgW0luc3RyU3RhZ2U8NiwgIFtPRERfVU5JVF0+XT4sCisgIEluc3RySXRpbkRhdGE8QnJhbmNoSGludHMgLCBbSW5zdHJTdGFnZTw2LCAgW09ERF9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxCcmFuY2hSZXNvbHYsIFtJbnN0clN0YWdlPDQsICBbT0REX1VOSVRdPl0+LAorICBJbnN0ckl0aW5EYXRhPENoYW5PcFNQUiAgICwgW0luc3RyU3RhZ2U8NiwgIFtPRERfVU5JVF0+XT4sCisgIEluc3RySXRpbkRhdGE8U2h1ZmZsZU9wICAgLCBbSW5zdHJTdGFnZTw0LCAgW09ERF9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxTZWxlY3RPcCAgICAsIFtJbnN0clN0YWdlPDQsICBbT0REX1VOSVRdPl0+LAorICBJbnN0ckl0aW5EYXRhPEdhdGhlck9wICAgICwgW0luc3RyU3RhZ2U8NCwgIFtPRERfVU5JVF0+XT4sCisgIEluc3RySXRpbkRhdGE8TG9hZE5PUCAgICAgLCBbSW5zdHJTdGFnZTwxLCAgW09ERF9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxFeGVjTk9QICAgICAsIFtJbnN0clN0YWdlPDEsICBbRVZFTl9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxTUHJlY0ZQICAgICAsIFtJbnN0clN0YWdlPDYsICBbRVZFTl9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxEUHJlY0ZQICAgICAsIFtJbnN0clN0YWdlPDEzLCBbRVZFTl9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxGUEludCAgICAgICAsIFtJbnN0clN0YWdlPDIsICBbRVZFTl9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxCeXRlT3AgICAgICAsIFtJbnN0clN0YWdlPDQsICBbRVZFTl9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJbnRlZ2VyT3AgICAsIFtJbnN0clN0YWdlPDIsICBbRVZFTl9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxSb3RhdGVTaGlmdCAsIFtJbnN0clN0YWdlPDQsICBbRVZFTl9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJbnRlZ2VyTXVsRGl2LFtJbnN0clN0YWdlPDcsICBbRVZFTl9VTklUXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJbW1Mb2FkICAgICAsIFtJbnN0clN0YWdlPDIsICBbRVZFTl9VTklUXT5dPgorICBdPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVTZWxlY3Rpb25EQUdJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVTZWxlY3Rpb25EQUdJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzMyZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVNlbGVjdGlvbkRBR0luZm8uY3BwCkBAIC0wLDAgKzEsMjMgQEAKKy8vPT09LS0gU1BVU2VsZWN0aW9uREFHSW5mby5jcHAgLSBDZWxsU1BVIFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNQVVNlbGVjdGlvbkRBR0luZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJjZWxsc3B1LXNlbGVjdGlvbmRhZy1pbmZvIgorI2luY2x1ZGUgIlNQVVRhcmdldE1hY2hpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTUFVTZWxlY3Rpb25EQUdJbmZvOjpTUFVTZWxlY3Rpb25EQUdJbmZvKGNvbnN0IFNQVVRhcmdldE1hY2hpbmUgJlRNKQorICA6IFRhcmdldFNlbGVjdGlvbkRBR0luZm8oVE0pIHsKK30KKworU1BVU2VsZWN0aW9uREFHSW5mbzo6flNQVVNlbGVjdGlvbkRBR0luZm8oKSB7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVU2VsZWN0aW9uREFHSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVNlbGVjdGlvbkRBR0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTI1N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVNlbGVjdGlvbkRBR0luZm8uaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0tIFNQVVNlbGVjdGlvbkRBR0luZm8uaCAtIENlbGxTUFUgU2VsZWN0aW9uREFHIEluZm8gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDZWxsU1BVIHN1YmNsYXNzIGZvciBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQ0VMTFNQVVNFTEVDVElPTkRBR0lORk9fSAorI2RlZmluZSBDRUxMU1BVU0VMRUNUSU9OREFHSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTZWxlY3Rpb25EQUdJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU1BVVGFyZ2V0TWFjaGluZTsKKworY2xhc3MgU1BVU2VsZWN0aW9uREFHSW5mbyA6IHB1YmxpYyBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgU1BVU2VsZWN0aW9uREFHSW5mbyhjb25zdCBTUFVUYXJnZXRNYWNoaW5lICZUTSk7CisgIH5TUFVTZWxlY3Rpb25EQUdJbmZvKCk7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVN1YnRhcmdldC5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVU3VidGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjE4YjdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVN1YnRhcmdldC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tIFNQVVN1YnRhcmdldC5jcHAgLSBTVEkgQ2VsbCBTUFUgU3VidGFyZ2V0IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQ2VsbFNQVS1zcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNQVVN1YnRhcmdldC5oIgorI2luY2x1ZGUgIlNQVS5oIgorI2luY2x1ZGUgIlNQVUdlblN1YnRhcmdldC5pbmMiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTUFVTdWJ0YXJnZXQ6OlNQVVN1YnRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVFQsIGNvbnN0IHN0ZDo6c3RyaW5nICZGUykgOgorICBTdGFja0FsaWdubWVudCgxNiksCisgIFByb2NEaXJlY3RpdmUoU1BVOjpERUZBVUxUX1BST0MpLAorICBVc2VMYXJnZU1lbShmYWxzZSkKK3sKKyAgLy8gU2hvdWxkIGJlIHRoZSB0YXJnZXQgU1BVIHByb2Nlc3NvciB0eXBlLiBGb3Igbm93LCBzaW5jZSB0aGVyZSdzIG9ubHkKKyAgLy8gb25lLCBzaW1wbHkgZGVmYXVsdCB0byB0aGUgY3VycmVudCAidjAiIGRlZmF1bHQ6CisgIHN0ZDo6c3RyaW5nIGRlZmF1bHRfY3B1KCJ2MCIpOworCisgIC8vIFBhcnNlIGZlYXR1cmVzIHN0cmluZy4KKyAgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhGUywgZGVmYXVsdF9jcHUpOworfQorCisvLy8gU2V0SklUTW9kZSAtIFRoaXMgaXMgY2FsbGVkIHRvIGluZm9ybSB0aGUgc3VidGFyZ2V0IGluZm8gdGhhdCB3ZSBhcmUKKy8vLyBwcm9kdWNpbmcgY29kZSBmb3IgdGhlIEpJVC4KK3ZvaWQgU1BVU3VidGFyZ2V0OjpTZXRKSVRNb2RlKCkgeworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVN1YnRhcmdldC5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVN1YnRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjAxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvU1BVU3VidGFyZ2V0LmgKQEAgLTAsMCArMSw5MCBAQAorLy89PT0tLSBTUFVTdWJ0YXJnZXQuaCAtIERlZmluZSBTdWJ0YXJnZXQgZm9yIHRoZSBDZWxsIFNQVSAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIENlbGwgU1BVLXNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENFTExTVUJUQVJHRVRfSAorI2RlZmluZSBDRUxMU1VCVEFSR0VUX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySXRpbmVyYXJpZXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBHbG9iYWxWYWx1ZTsKKworICBuYW1lc3BhY2UgU1BVIHsKKyAgICBlbnVtIHsKKyAgICAgIFBST0NfTk9ORSwKKyAgICAgIERFRkFVTFRfUFJPQworICAgIH07CisgIH0KKyAgICAKKyAgY2xhc3MgU1BVU3VidGFyZ2V0IDogcHVibGljIFRhcmdldFN1YnRhcmdldCB7CisgIHByb3RlY3RlZDoKKyAgICAvLy8gc3RhY2tBbGlnbm1lbnQgLSBUaGUgbWluaW11bSBhbGlnbm1lbnQga25vd24gdG8gaG9sZCBvZiB0aGUgc3RhY2sgZnJhbWUKKyAgICAvLy8gb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uIGFuZCB3aGljaCBtdXN0IGJlIG1haW50YWluZWQgYnkgZXZlcnkgZnVuY3Rpb24uCisgICAgdW5zaWduZWQgU3RhY2tBbGlnbm1lbnQ7CisgICAgCisgICAgLy8vIFNlbGVjdGVkIGluc3RydWN0aW9uIGl0aW5lcmFyaWVzIChvbmUgZW50cnkgcGVyIGl0aW5lcmFyeSBjbGFzcy4pCisgICAgSW5zdHJJdGluZXJhcnlEYXRhIEluc3RySXRpbnM7CisKKyAgICAvLy8gV2hpY2ggU1BVIHByb2Nlc3NvciAodGhpcyBpc24ndCByZWFsbHkgdXNlZCwgYnV0IGl0J3MgdGhlcmUgdG8ga2VlcAorICAgIC8vLyB0aGUgQyBjb21waWxlciBoYXBweSkKKyAgICB1bnNpZ25lZCBQcm9jRGlyZWN0aXZlOworCisgICAgLy8vIFVzZSAoYXNzdW1lKSBsYXJnZSBtZW1vcnkgLS0gZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIExRQS9TVFFBCisgICAgLy8vIGluc3RydWN0aW9ucyB0aGF0IGFzc3VtZSAyNTlLIGxvY2FsIHN0b3JlLgorICAgIGJvb2wgVXNlTGFyZ2VNZW07CisgICAgCisgIHB1YmxpYzoKKyAgICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgZGF0YSBtZW1iZXJzIHRvIG1hdGNoIHRoYXQKKyAgICAvLy8gb2YgdGhlIHNwZWNpZmllZCB0cmlwbGUuCisgICAgLy8vCisgICAgU1BVU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKKyAgICAKKyAgICAvLy8gUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyAtIFBhcnNlcyBmZWF0dXJlcyBzdHJpbmcgc2V0dGluZyBzcGVjaWZpZWQgCisgICAgLy8vIHN1YnRhcmdldCBvcHRpb25zLiAgRGVmaW5pdGlvbiBvZiBmdW5jdGlvbiBpcyBhdXRvIGdlbmVyYXRlZCBieSB0YmxnZW4uCisgICAgc3RkOjpzdHJpbmcgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhjb25zdCBzdGQ6OnN0cmluZyAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQ1BVKTsKKworICAgIC8vLyBTZXRKSVRNb2RlIC0gVGhpcyBpcyBjYWxsZWQgdG8gaW5mb3JtIHRoZSBzdWJ0YXJnZXQgaW5mbyB0aGF0IHdlIGFyZQorICAgIC8vLyBwcm9kdWNpbmcgY29kZSBmb3IgdGhlIEpJVC4KKyAgICB2b2lkIFNldEpJVE1vZGUoKTsKKworICAgIC8vLyBnZXRTdGFja0FsaWdubWVudCAtIFJldHVybnMgdGhlIG1pbmltdW0gYWxpZ25tZW50IGtub3duIHRvIGhvbGQgb2YgdGhlCisgICAgLy8vIHN0YWNrIGZyYW1lIG9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbiBhbmQgd2hpY2ggbXVzdCBiZSBtYWludGFpbmVkIGJ5CisgICAgLy8vIGV2ZXJ5IGZ1bmN0aW9uIGZvciB0aGlzIHN1YnRhcmdldC4KKyAgICB1bnNpZ25lZCBnZXRTdGFja0FsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIFN0YWNrQWxpZ25tZW50OyB9CisgICAgCisgICAgLy8vIGdldEluc3RySXRpbnMgLSBSZXR1cm4gdGhlIGluc3RydWN0aW9uIGl0aW5lcmFpZXMgYmFzZWQgb24gc3VidGFyZ2V0IAorICAgIC8vLyBzZWxlY3Rpb24uCisgICAgY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICZnZXRJbnN0ckl0aW5lcmFyeURhdGEoKSBjb25zdCB7CisgICAgICByZXR1cm4gSW5zdHJJdGluczsKKyAgICB9CisKKyAgICAvLy8gVXNlIGxhcmdlIG1lbW9yeSBhZGRyZXNzaW5nIHByZWRpY2F0ZQorICAgIGJvb2wgdXNpbmdMYXJnZU1lbSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBVc2VMYXJnZU1lbTsKKyAgICB9CisKKyAgICAvLy8gZ2V0VGFyZ2V0RGF0YVN0cmluZyAtIFJldHVybiB0aGUgcG9pbnRlciBzaXplIGFuZCB0eXBlIGFsaWdubWVudAorICAgIC8vLyBwcm9wZXJ0aWVzIG9mIHRoaXMgc3VidGFyZ2V0LgorICAgIGNvbnN0IGNoYXIgKmdldFRhcmdldERhdGFTdHJpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gIkUtcDozMjozMjoxMjgtZjY0OjY0OjEyOC1mMzI6MzI6MTI4LWk2NDozMjoxMjgtaTMyOjMyOjEyOCIKKyAgICAgICAgICAgICAiLWkxNjoxNjoxMjgtaTg6ODoxMjgtaTE6ODoxMjgtYTowOjEyOC12NjQ6MTI4OjEyOC12MTI4OjEyODoxMjgiCisgICAgICAgICAgICAgIi1zOjEyODoxMjgtbjMyOjY0IjsKKyAgICB9CisgIH07Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVUYXJnZXRNYWNoaW5lLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVUYXJnZXRNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBlYzNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVRhcmdldE1hY2hpbmUuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8vPT09LS0gU1BVVGFyZ2V0TWFjaGluZS5jcHAgLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgQ2VsbCBTUFUgLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVG9wLWxldmVsIGltcGxlbWVudGF0aW9uIGZvciB0aGUgQ2VsbCBTUFUgdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJTUFUuaCIKKyNpbmNsdWRlICJTUFVSZWdpc3Rlck5hbWVzLmgiCisjaW5jbHVkZSAiU1BVTUNBc21JbmZvLmgiCisjaW5jbHVkZSAiU1BVVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUmVnQWxsb2NSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZXJSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVDZWxsU1BVVGFyZ2V0KCkgeyAKKyAgLy8gUmVnaXN0ZXIgdGhlIHRhcmdldC4KKyAgUmVnaXN0ZXJUYXJnZXRNYWNoaW5lPFNQVVRhcmdldE1hY2hpbmU+IFgoVGhlQ2VsbFNQVVRhcmdldCk7CisgIFJlZ2lzdGVyQXNtSW5mbzxTUFVMaW51eE1DQXNtSW5mbz4gWShUaGVDZWxsU1BVVGFyZ2V0KTsKK30KKworY29uc3Qgc3RkOjpwYWlyPHVuc2lnbmVkLCBpbnQ+ICoKK1NQVUZyYW1lSW5mbzo6Z2V0Q2FsbGVlU2F2ZVNwaWxsU2xvdHModW5zaWduZWQgJk51bUVudHJpZXMpIGNvbnN0IHsKKyAgTnVtRW50cmllcyA9IDE7CisgIHJldHVybiAmTFJbMF07Cit9CisKK1NQVVRhcmdldE1hY2hpbmU6OlNQVVRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGUykKKyAgOiBMTFZNVGFyZ2V0TWFjaGluZShULCBUVCksCisgICAgU3VidGFyZ2V0KFRULCBGUyksCisgICAgRGF0YUxheW91dChTdWJ0YXJnZXQuZ2V0VGFyZ2V0RGF0YVN0cmluZygpKSwKKyAgICBJbnN0ckluZm8oKnRoaXMpLAorICAgIEZyYW1lSW5mbygqdGhpcyksCisgICAgVExJbmZvKCp0aGlzKSwKKyAgICBUU0luZm8oKnRoaXMpLAorICAgIEluc3RySXRpbnMoU3VidGFyZ2V0LmdldEluc3RySXRpbmVyYXJ5RGF0YSgpKSB7CisgIC8vIEZvciB0aGUgdGltZSBiZWluZywgdXNlIHN0YXRpYyByZWxvY2F0aW9ucywgc2luY2UgdGhlcmUncyByZWFsbHkgbm8KKyAgLy8gc3VwcG9ydCBmb3IgUElDIHlldC4KKyAgc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpTdGF0aWMpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFzcyBQaXBlbGluZSBDb25maWd1cmF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitib29sIFNQVVRhcmdldE1hY2hpbmU6OmFkZEluc3RTZWxlY3RvcihQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgLy8gSW5zdGFsbCBhbiBpbnN0cnVjdGlvbiBzZWxlY3Rvci4KKyAgUE0uYWRkKGNyZWF0ZVNQVUlTZWxEYWcoKnRoaXMpKTsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1NQVVRhcmdldE1hY2hpbmUuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVUYXJnZXRNYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwMjcwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9TUFVUYXJnZXRNYWNoaW5lLmgKQEAgLTAsMCArMSw4OSBAQAorLy89PT0tLSBTUFVUYXJnZXRNYWNoaW5lLmggLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgQ2VsbCBTUFUgLS0tLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIENlbGxTUFUtc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0TWFjaGluZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFNQVV9UQVJHRVRNQUNISU5FX0gKKyNkZWZpbmUgU1BVX1RBUkdFVE1BQ0hJTkVfSAorCisjaW5jbHVkZSAiU1BVU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiU1BVSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiU1BVSVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiU1BVU2VsZWN0aW9uREFHSW5mby5oIgorI2luY2x1ZGUgIlNQVUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFBhc3NNYW5hZ2VyOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBUYXJnZXRGcmFtZUluZm87CisKKy8vLyBTUFVUYXJnZXRNYWNoaW5lCisvLy8KK2NsYXNzIFNQVVRhcmdldE1hY2hpbmUgOiBwdWJsaWMgTExWTVRhcmdldE1hY2hpbmUgeworICBTUFVTdWJ0YXJnZXQgICAgICAgIFN1YnRhcmdldDsKKyAgY29uc3QgVGFyZ2V0RGF0YSAgICBEYXRhTGF5b3V0OworICBTUFVJbnN0ckluZm8gICAgICAgIEluc3RySW5mbzsKKyAgU1BVRnJhbWVJbmZvICAgICAgICBGcmFtZUluZm87CisgIFNQVVRhcmdldExvd2VyaW5nICAgVExJbmZvOworICBTUFVTZWxlY3Rpb25EQUdJbmZvIFRTSW5mbzsKKyAgSW5zdHJJdGluZXJhcnlEYXRhICBJbnN0ckl0aW5zOworcHVibGljOgorICBTUFVUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGUyk7CisKKyAgLy8vIFJldHVybiB0aGUgc3VidGFyZ2V0IGltcGxlbWVudGF0aW9uIG9iamVjdAorICB2aXJ0dWFsIGNvbnN0IFNQVVN1YnRhcmdldCAgICAgKmdldFN1YnRhcmdldEltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuICZTdWJ0YXJnZXQ7CisgIH0KKyAgdmlydHVhbCBjb25zdCBTUFVJbnN0ckluZm8gICAgICpnZXRJbnN0ckluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuICZJbnN0ckluZm87CisgIH0KKyAgdmlydHVhbCBjb25zdCBTUFVGcmFtZUluZm8gICAgICpnZXRGcmFtZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuICZGcmFtZUluZm87CisgIH0KKyAgLyohCisgICAgXG5vdGUgQ2VsbCBTUFUgZG9lcyBub3Qgc3VwcG9ydCBKSVQgdG9kYXkuIEl0IGNvdWxkIHN1cHBvcnQgSklUIGF0IHNvbWUKKyAgICBwb2ludC4KKyAgICovCisgIHZpcnR1YWwgICAgICAgVGFyZ2V0SklUSW5mbyAgICAqZ2V0SklUSW5mbygpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgU1BVVGFyZ2V0TG93ZXJpbmcgKmdldFRhcmdldExvd2VyaW5nKCkgY29uc3QgeyAKKyAgIHJldHVybiAmVExJbmZvOworICB9CisKKyAgdmlydHVhbCBjb25zdCBTUFVTZWxlY3Rpb25EQUdJbmZvKiBnZXRTZWxlY3Rpb25EQUdJbmZvKCkgY29uc3QgeworICAgIHJldHVybiAmVFNJbmZvOworICB9CisKKyAgdmlydHVhbCBjb25zdCBTUFVSZWdpc3RlckluZm8gKmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gJkluc3RySW5mby5nZXRSZWdpc3RlckluZm8oKTsKKyAgfQorICAKKyAgdmlydHVhbCBjb25zdCBUYXJnZXREYXRhICpnZXRUYXJnZXREYXRhKCkgY29uc3QgeworICAgIHJldHVybiAmRGF0YUxheW91dDsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhIGdldEluc3RySXRpbmVyYXJ5RGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5zdHJJdGluczsKKyAgfQorICAKKyAgLy8gUGFzcyBQaXBlbGluZSBDb25maWd1cmF0aW9uCisgIHZpcnR1YWwgYm9vbCBhZGRJbnN0U2VsZWN0b3IoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4ZDBmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTUNlbGxTUFVJbmZvCisgIENlbGxTUFVUYXJnZXRJbmZvLmNwcAorICApCisKK2FkZF9kZXBlbmRlbmNpZXMoTExWTUNlbGxTUFVJbmZvIENlbGxTUFVDb2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1RhcmdldEluZm8vQ2VsbFNQVVRhcmdldEluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1RhcmdldEluZm8vQ2VsbFNQVVRhcmdldEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OWVhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NlbGxTUFUvVGFyZ2V0SW5mby9DZWxsU1BVVGFyZ2V0SW5mby5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy89PT0tLSBDZWxsU1BVVGFyZ2V0SW5mby5jcHAgLSBDZWxsU1BVIFRhcmdldCBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNQVS5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitUYXJnZXQgbGx2bTo6VGhlQ2VsbFNQVVRhcmdldDsKKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplQ2VsbFNQVVRhcmdldEluZm8oKSB7IAorICBSZWdpc3RlclRhcmdldDxUcmlwbGU6OmNlbGxzcHU+IAorICAgIFgoVGhlQ2VsbFNQVVRhcmdldCwgImNlbGxzcHUiLCAiU1RJIENCRUEgQ2VsbCBTUFUgW2V4cGVyaW1lbnRhbF0iKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9UYXJnZXRJbmZvL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DZWxsU1BVL1RhcmdldEluZm8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiNjgyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ2VsbFNQVS9UYXJnZXRJbmZvL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L0NlbGxTUFUvVGFyZ2V0SW5mby9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCitMRVZFTCA9IC4uLy4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1DZWxsU1BVSW5mbworCisjIEhhY2s6IHdlIG5lZWQgdG8gaW5jbHVkZSAnbWFpbicgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQRkxBR1MgPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DcHBCYWNrZW5kL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9DcHBCYWNrZW5kL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTgyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzIEBACithZGRfbGx2bV90YXJnZXQoQ3BwQmFja2VuZAorICBDUFBCYWNrZW5kLmNwcAorICApCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvQ1BQQmFja2VuZC5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvQ1BQQmFja2VuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyMWNkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ3BwQmFja2VuZC9DUFBCYWNrZW5kLmNwcApAQCAtMCwwICsxLDIwMzcgQEAKKy8vPT09LS0gQ1BQQmFja2VuZC5jcHAgLSBMaWJyYXJ5IGZvciBjb252ZXJ0aW5nIExMVk0gY29kZSB0byBDKysgY29kZSAtLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHdyaXRpbmcgb2YgdGhlIExMVk0gSVIgYXMgYSBzZXQgb2YgQysrIGNhbGxzIHRvIHRoZQorLy8gTExWTSBJUiBpbnRlcmZhY2UuIFRoZSBpbnB1dCBtb2R1bGUgaXMgYXNzdW1lZCB0byBiZSB2ZXJpZmllZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQ1BQVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGVTeW1ib2xUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c2V0PgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CitGdW5jTmFtZSgiY3BwZm5hbWUiLCBjbDo6ZGVzYygiU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uIiksCisgICAgICAgICBjbDo6dmFsdWVfZGVzYygiZnVuY3Rpb24gbmFtZSIpKTsKKworZW51bSBXaGF0VG9HZW5lcmF0ZSB7CisgIEdlblByb2dyYW0sCisgIEdlbk1vZHVsZSwKKyAgR2VuQ29udGVudHMsCisgIEdlbkZ1bmN0aW9uLAorICBHZW5GdW5jdGlvbnMsCisgIEdlbklubGluZSwKKyAgR2VuVmFyaWFibGUsCisgIEdlblR5cGUKK307CisKK3N0YXRpYyBjbDo6b3B0PFdoYXRUb0dlbmVyYXRlPiBHZW5lcmF0aW9uVHlwZSgiY3BwZ2VuIiwgY2w6Ok9wdGlvbmFsLAorICBjbDo6ZGVzYygiQ2hvb3NlIHdoYXQga2luZCBvZiBvdXRwdXQgdG8gZ2VuZXJhdGUiKSwKKyAgY2w6OmluaXQoR2VuUHJvZ3JhbSksCisgIGNsOjp2YWx1ZXMoCisgICAgY2xFbnVtVmFsTihHZW5Qcm9ncmFtLCAgInByb2dyYW0iLCAgICJHZW5lcmF0ZSBhIGNvbXBsZXRlIHByb2dyYW0iKSwKKyAgICBjbEVudW1WYWxOKEdlbk1vZHVsZSwgICAibW9kdWxlIiwgICAgIkdlbmVyYXRlIGEgbW9kdWxlIGRlZmluaXRpb24iKSwKKyAgICBjbEVudW1WYWxOKEdlbkNvbnRlbnRzLCAiY29udGVudHMiLCAgIkdlbmVyYXRlIGNvbnRlbnRzIG9mIGEgbW9kdWxlIiksCisgICAgY2xFbnVtVmFsTihHZW5GdW5jdGlvbiwgImZ1bmN0aW9uIiwgICJHZW5lcmF0ZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24iKSwKKyAgICBjbEVudW1WYWxOKEdlbkZ1bmN0aW9ucywiZnVuY3Rpb25zIiwgIkdlbmVyYXRlIGFsbCBmdW5jdGlvbiBkZWZpbml0aW9ucyIpLAorICAgIGNsRW51bVZhbE4oR2VuSW5saW5lLCAgICJpbmxpbmUiLCAgICAiR2VuZXJhdGUgYW4gaW5saW5lIGZ1bmN0aW9uIiksCisgICAgY2xFbnVtVmFsTihHZW5WYXJpYWJsZSwgInZhcmlhYmxlIiwgICJHZW5lcmF0ZSBhIHZhcmlhYmxlIGRlZmluaXRpb24iKSwKKyAgICBjbEVudW1WYWxOKEdlblR5cGUsICAgICAidHlwZSIsICAgICAgIkdlbmVyYXRlIGEgdHlwZSBkZWZpbml0aW9uIiksCisgICAgY2xFbnVtVmFsRW5kCisgICkKKyk7CisKK3N0YXRpYyBjbDo6b3B0PHN0ZDo6c3RyaW5nPiBOYW1lVG9HZW5lcmF0ZSgiY3BwZm9yIiwgY2w6Ok9wdGlvbmFsLAorICBjbDo6ZGVzYygiU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgdGhpbmcgdG8gZ2VuZXJhdGUiKSwKKyAgY2w6OmluaXQoIiFiYWQhIikpOworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVDcHBCYWNrZW5kVGFyZ2V0KCkgeworICAvLyBSZWdpc3RlciB0aGUgdGFyZ2V0LgorICBSZWdpc3RlclRhcmdldE1hY2hpbmU8Q1BQVGFyZ2V0TWFjaGluZT4gWChUaGVDcHBCYWNrZW5kVGFyZ2V0KTsKK30KKworbmFtZXNwYWNlIHsKKyAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gVHlwZUxpc3Q7CisgIHR5cGVkZWYgc3RkOjptYXA8Y29uc3QgVHlwZSosc3RkOjpzdHJpbmc+IFR5cGVNYXA7CisgIHR5cGVkZWYgc3RkOjptYXA8Y29uc3QgVmFsdWUqLHN0ZDo6c3RyaW5nPiBWYWx1ZU1hcDsKKyAgdHlwZWRlZiBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gTmFtZVNldDsKKyAgdHlwZWRlZiBzdGQ6OnNldDxjb25zdCBUeXBlKj4gVHlwZVNldDsKKyAgdHlwZWRlZiBzdGQ6OnNldDxjb25zdCBWYWx1ZSo+IFZhbHVlU2V0OworICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IFZhbHVlKixzdGQ6OnN0cmluZz4gRm9yd2FyZFJlZk1hcDsKKworICAvLy8gQ3BwV3JpdGVyIC0gVGhpcyBjbGFzcyBpcyB0aGUgbWFpbiBjaHVuayBvZiBjb2RlIHRoYXQgY29udmVydHMgYW4gTExWTQorICAvLy8gbW9kdWxlIHRvIGEgQysrIHRyYW5zbGF0aW9uIHVuaXQuCisgIGNsYXNzIENwcFdyaXRlciA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKKyAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk91dDsKKyAgICBjb25zdCBNb2R1bGUgKlRoZU1vZHVsZTsKKyAgICB1aW50NjRfdCB1bmlxdWVOdW07CisgICAgVHlwZU1hcCBUeXBlTmFtZXM7CisgICAgVmFsdWVNYXAgVmFsdWVOYW1lczsKKyAgICBUeXBlTWFwIFVucmVzb2x2ZWRUeXBlczsKKyAgICBUeXBlTGlzdCBUeXBlU3RhY2s7CisgICAgTmFtZVNldCBVc2VkTmFtZXM7CisgICAgVHlwZVNldCBEZWZpbmVkVHlwZXM7CisgICAgVmFsdWVTZXQgRGVmaW5lZFZhbHVlczsKKyAgICBGb3J3YXJkUmVmTWFwIEZvcndhcmRSZWZzOworICAgIGJvb2wgaXNfaW5saW5lOworICAgIHVuc2lnbmVkIGluZGVudF9sZXZlbDsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgZXhwbGljaXQgQ3BwV3JpdGVyKGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmbykgOgorICAgICAgTW9kdWxlUGFzcyhJRCksIE91dChvKSwgdW5pcXVlTnVtKDApLCBpc19pbmxpbmUoZmFsc2UpLCBpbmRlbnRfbGV2ZWwoMCl7fQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJDKysgYmFja2VuZCI7IH0KKworICAgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICAgIHZvaWQgcHJpbnRQcm9ncmFtKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZE5hbWUgKTsKKyAgICB2b2lkIHByaW50TW9kdWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZE5hbWUgKTsKKyAgICB2b2lkIHByaW50Q29udGVudHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgbW9kTmFtZSApOworICAgIHZvaWQgcHJpbnRGdW5jdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdW5jTmFtZSApOworICAgIHZvaWQgcHJpbnRGdW5jdGlvbnMoKTsKKyAgICB2b2lkIHByaW50SW5saW5lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bmNOYW1lICk7CisgICAgdm9pZCBwcmludFZhcmlhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhck5hbWUgKTsKKyAgICB2b2lkIHByaW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlTmFtZSApOworCisgICAgdm9pZCBlcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIAorICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSYgbmwoZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZPdXQsIGludCBkZWx0YSA9IDApOworICAgIGlubGluZSB2b2lkIGluKCkgeyBpbmRlbnRfbGV2ZWwrKzsgfQorICAgIGlubGluZSB2b2lkIG91dCgpIHsgaWYgKGluZGVudF9sZXZlbCA+MCkgaW5kZW50X2xldmVsLS07IH0KKyAgICAKKyAgcHJpdmF0ZToKKyAgICB2b2lkIHByaW50TGlua2FnZVR5cGUoR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMVCk7CisgICAgdm9pZCBwcmludFZpc2liaWxpdHlUeXBlKEdsb2JhbFZhbHVlOjpWaXNpYmlsaXR5VHlwZXMgVmlzVHlwZXMpOworICAgIHZvaWQgcHJpbnRDYWxsaW5nQ29udihDYWxsaW5nQ29udjo6SUQgY2MpOworICAgIHZvaWQgcHJpbnRFc2NhcGVkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworICAgIHZvaWQgcHJpbnRDRlAoY29uc3QgQ29uc3RhbnRGUCogQ0ZQKTsKKworICAgIHN0ZDo6c3RyaW5nIGdldENwcE5hbWUoY29uc3QgVHlwZSogdmFsKTsKKyAgICBpbmxpbmUgdm9pZCBwcmludENwcE5hbWUoY29uc3QgVHlwZSogdmFsKTsKKworICAgIHN0ZDo6c3RyaW5nIGdldENwcE5hbWUoY29uc3QgVmFsdWUqIHZhbCk7CisgICAgaW5saW5lIHZvaWQgcHJpbnRDcHBOYW1lKGNvbnN0IFZhbHVlKiB2YWwpOworCisgICAgdm9pZCBwcmludEF0dHJpYnV0ZXMoY29uc3QgQXR0ckxpc3RQdHIgJlBBTCwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgIGJvb2wgcHJpbnRUeXBlSW50ZXJuYWwoY29uc3QgVHlwZSogVHkpOworICAgIGlubGluZSB2b2lkIHByaW50VHlwZShjb25zdCBUeXBlKiBUeSk7CisgICAgdm9pZCBwcmludFR5cGVzKGNvbnN0IE1vZHVsZSogTSk7CisKKyAgICB2b2lkIHByaW50Q29uc3RhbnQoY29uc3QgQ29uc3RhbnQgKkNQVik7CisgICAgdm9pZCBwcmludENvbnN0YW50cyhjb25zdCBNb2R1bGUqIE0pOworCisgICAgdm9pZCBwcmludFZhcmlhYmxlVXNlcyhjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpOworICAgIHZvaWQgcHJpbnRWYXJpYWJsZUhlYWQoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKTsKKyAgICB2b2lkIHByaW50VmFyaWFibGVCb2R5KGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVik7CisKKyAgICB2b2lkIHByaW50RnVuY3Rpb25Vc2VzKGNvbnN0IEZ1bmN0aW9uICpGKTsKKyAgICB2b2lkIHByaW50RnVuY3Rpb25IZWFkKGNvbnN0IEZ1bmN0aW9uICpGKTsKKyAgICB2b2lkIHByaW50RnVuY3Rpb25Cb2R5KGNvbnN0IEZ1bmN0aW9uICpGKTsKKyAgICB2b2lkIHByaW50SW5zdHJ1Y3Rpb24oY29uc3QgSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYm5hbWUpOworICAgIHN0ZDo6c3RyaW5nIGdldE9wTmFtZShWYWx1ZSopOworCisgICAgdm9pZCBwcmludE1vZHVsZUJvZHkoKTsKKyAgfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKK2Zvcm1hdHRlZF9yYXdfb3N0cmVhbSAmQ3BwV3JpdGVyOjpubChmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk91dCwgaW50IGRlbHRhKSB7CisgIE91dCA8PCAnXG4nOworICBpZiAoZGVsdGEgPj0gMCB8fCBpbmRlbnRfbGV2ZWwgPj0gdW5zaWduZWQoLWRlbHRhKSkKKyAgICBpbmRlbnRfbGV2ZWwgKz0gZGVsdGE7CisgIE91dC5pbmRlbnQoaW5kZW50X2xldmVsKTsKKyAgcmV0dXJuIE91dDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhbml0aXplKHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7ICsraSkKKyAgICBpZiAoIWlzYWxudW0oc3RyW2ldKSAmJiBzdHJbaV0gIT0gJ18nKQorICAgICAgc3RyW2ldID0gJ18nOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0VHlwZVByZWZpeChjb25zdCBUeXBlICpUeSkgeworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICBjYXNlIFR5cGU6OlZvaWRUeUlEOiAgICAgcmV0dXJuICJ2b2lkXyI7CisgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6CisgICAgcmV0dXJuICJpbnQiICsgdXRvc3RyKGNhc3Q8SW50ZWdlclR5cGU+KFR5KS0+Z2V0Qml0V2lkdGgoKSkgKyAiXyI7CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOiAgICByZXR1cm4gImZsb2F0XyI7CisgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDogICByZXR1cm4gImRvdWJsZV8iOworICBjYXNlIFR5cGU6OkxhYmVsVHlJRDogICAgcmV0dXJuICJsYWJlbF8iOworICBjYXNlIFR5cGU6OkZ1bmN0aW9uVHlJRDogcmV0dXJuICJmdW5jXyI7CisgIGNhc2UgVHlwZTo6U3RydWN0VHlJRDogICByZXR1cm4gInN0cnVjdF8iOworICBjYXNlIFR5cGU6OkFycmF5VHlJRDogICAgcmV0dXJuICJhcnJheV8iOworICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOiAgcmV0dXJuICJwdHJfIjsKKyAgY2FzZSBUeXBlOjpWZWN0b3JUeUlEOiAgIHJldHVybiAicGFja2VkXyI7CisgIGNhc2UgVHlwZTo6T3BhcXVlVHlJRDogICByZXR1cm4gIm9wYXF1ZV8iOworICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgcmV0dXJuICJvdGhlcl8iOworICB9CisgIHJldHVybiAidW5rbm93bl8iOworfQorCisvLyBMb29rcyB1cCB0aGUgdHlwZSBpbiB0aGUgc3ltYm9sIHRhYmxlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBpdHMgbmFtZSBvcgorLy8gYSBudWxsIHBvaW50ZXIgaWYgaXQgd2Fzbid0IGZvdW5kLiBOb3RlIHRoYXQgdGhpcyBpc24ndCB0aGUgc2FtZSBhcyB0aGUKKy8vIE1vZGU6OmdldFR5cGVOYW1lIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZywgbm90IGEgbnVsbAorLy8gcG9pbnRlciBpZiB0aGUgbmFtZSBpcyBub3QgZm91bmQuCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgKgorZmluZFR5cGVOYW1lKGNvbnN0IFR5cGVTeW1ib2xUYWJsZSYgU1QsIGNvbnN0IFR5cGUqIFR5KSB7CisgIFR5cGVTeW1ib2xUYWJsZTo6Y29uc3RfaXRlcmF0b3IgVEkgPSBTVC5iZWdpbigpOworICBUeXBlU3ltYm9sVGFibGU6OmNvbnN0X2l0ZXJhdG9yIFRFID0gU1QuZW5kKCk7CisgIGZvciAoO1RJICE9IFRFOyArK1RJKQorICAgIGlmIChUSS0+c2Vjb25kID09IFR5KQorICAgICAgcmV0dXJuICYoVEktPmZpcnN0KTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjplcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgIHJlcG9ydF9mYXRhbF9lcnJvcihtc2cpOworfQorCisvLyBwcmludENGUCAtIFByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgLi4gdmVyeSBjYXJlZnVsbHkgOikKKy8vIFRoaXMgbWFrZXMgc3VyZSB0aGF0IGNvbnZlcnNpb24gdG8vZnJvbSBmbG9hdGluZyB5aWVsZHMgdGhlIHNhbWUgYmluYXJ5CisvLyByZXN1bHQgc28gdGhhdCB3ZSBkb24ndCBsb3NlIHByZWNpc2lvbi4KK3ZvaWQgQ3BwV3JpdGVyOjpwcmludENGUChjb25zdCBDb25zdGFudEZQICpDRlApIHsKKyAgYm9vbCBpZ25vcmVkOworICBBUEZsb2F0IEFQRiA9IEFQRmxvYXQoQ0ZQLT5nZXRWYWx1ZUFQRigpKTsgIC8vIGNvcHkKKyAgaWYgKENGUC0+Z2V0VHlwZSgpID09IFR5cGU6OmdldEZsb2F0VHkoQ0ZQLT5nZXRDb250ZXh0KCkpKQorICAgIEFQRi5jb252ZXJ0KEFQRmxvYXQ6OklFRUVkb3VibGUsIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4sICZpZ25vcmVkKTsKKyAgT3V0IDw8ICJDb25zdGFudEZQOjpnZXQobW9kLT5nZXRDb250ZXh0KCksICI7CisgIE91dCA8PCAiQVBGbG9hdCgiOworI2lmIEhBVkVfUFJJTlRGX0EKKyAgY2hhciBCdWZmZXJbMTAwXTsKKyAgc3ByaW50ZihCdWZmZXIsICIlQSIsIEFQRi5jb252ZXJ0VG9Eb3VibGUoKSk7CisgIGlmICgoIXN0cm5jbXAoQnVmZmVyLCAiMHgiLCAyKSB8fAorICAgICAgICFzdHJuY21wKEJ1ZmZlciwgIi0weCIsIDMpIHx8CisgICAgICAgIXN0cm5jbXAoQnVmZmVyLCAiKzB4IiwgMykpICYmCisgICAgICBBUEYuYml0d2lzZUlzRXF1YWwoQVBGbG9hdChhdG9mKEJ1ZmZlcikpKSkgeworICAgIGlmIChDRlAtPmdldFR5cGUoKSA9PSBUeXBlOjpnZXREb3VibGVUeShDRlAtPmdldENvbnRleHQoKSkpCisgICAgICBPdXQgPDwgIkJpdHNUb0RvdWJsZSgiIDw8IEJ1ZmZlciA8PCAiKSI7CisgICAgZWxzZQorICAgICAgT3V0IDw8ICJCaXRzVG9GbG9hdCgoZmxvYXQpIiA8PCBCdWZmZXIgPDwgIikiOworICAgIE91dCA8PCAiKSI7CisgIH0gZWxzZSB7CisjZW5kaWYKKyAgICBzdGQ6OnN0cmluZyBTdHJWYWwgPSBmdG9zdHIoQ0ZQLT5nZXRWYWx1ZUFQRigpKTsKKworICAgIHdoaWxlIChTdHJWYWxbMF0gPT0gJyAnKQorICAgICAgU3RyVmFsLmVyYXNlKFN0clZhbC5iZWdpbigpKTsKKworICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdHJpbmdpemVkIG51bWJlciBpcyBub3Qgc29tZSBzdHJpbmcgbGlrZQorICAgIC8vICJJbmYiIG9yIE5hTi4gIENoZWNrIHRoYXQgdGhlIHN0cmluZyBtYXRjaGVzIHRoZSAiWy0rXT9bMC05XSIgcmVnZXguCisgICAgaWYgKCgoU3RyVmFsWzBdID49ICcwJyAmJiBTdHJWYWxbMF0gPD0gJzknKSB8fAorICAgICAgICAgKChTdHJWYWxbMF0gPT0gJy0nIHx8IFN0clZhbFswXSA9PSAnKycpICYmCisgICAgICAgICAgKFN0clZhbFsxXSA+PSAnMCcgJiYgU3RyVmFsWzFdIDw9ICc5JykpKSAmJgorICAgICAgICAoQ0ZQLT5pc0V4YWN0bHlWYWx1ZShhdG9mKFN0clZhbC5jX3N0cigpKSkpKSB7CisgICAgICBpZiAoQ0ZQLT5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0RG91YmxlVHkoQ0ZQLT5nZXRDb250ZXh0KCkpKQorICAgICAgICBPdXQgPDwgIFN0clZhbDsKKyAgICAgIGVsc2UKKyAgICAgICAgT3V0IDw8IFN0clZhbCA8PCAiZiI7CisgICAgfSBlbHNlIGlmIChDRlAtPmdldFR5cGUoKSA9PSBUeXBlOjpnZXREb3VibGVUeShDRlAtPmdldENvbnRleHQoKSkpCisgICAgICBPdXQgPDwgIkJpdHNUb0RvdWJsZSgweCIKKyAgICAgICAgICA8PCB1dG9oZXhzdHIoQ0ZQLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCkuZ2V0WkV4dFZhbHVlKCkpCisgICAgICAgICAgPDwgIlVMTCkgLyogIiA8PCBTdHJWYWwgPDwgIiAqLyI7CisgICAgZWxzZQorICAgICAgT3V0IDw8ICJCaXRzVG9GbG9hdCgweCIKKyAgICAgICAgICA8PCB1dG9oZXhzdHIoKHVpbnQzMl90KUNGUC0+Z2V0VmFsdWVBUEYoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0Y2FzdFRvQVBJbnQoKS5nZXRaRXh0VmFsdWUoKSkKKyAgICAgICAgICA8PCAiVSkgLyogIiA8PCBTdHJWYWwgPDwgIiAqLyI7CisgICAgT3V0IDw8ICIpIjsKKyNpZiBIQVZFX1BSSU5URl9BCisgIH0KKyNlbmRpZgorICBPdXQgPDwgIikiOworfQorCit2b2lkIENwcFdyaXRlcjo6cHJpbnRDYWxsaW5nQ29udihDYWxsaW5nQ29udjo6SUQgY2MpeworICAvLyBQcmludCB0aGUgY2FsbGluZyBjb252ZW50aW9uLgorICBzd2l0Y2ggKGNjKSB7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkM6ICAgICBPdXQgPDwgIkNhbGxpbmdDb252OjpDIjsgYnJlYWs7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkZhc3Q6ICBPdXQgPDwgIkNhbGxpbmdDb252OjpGYXN0IjsgYnJlYWs7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkNvbGQ6ICBPdXQgPDwgIkNhbGxpbmdDb252OjpDb2xkIjsgYnJlYWs7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkZpcnN0VGFyZ2V0Q0M6IE91dCA8PCAiQ2FsbGluZ0NvbnY6OkZpcnN0VGFyZ2V0Q0MiOyBicmVhazsKKyAgZGVmYXVsdDogICAgICAgICAgICAgICAgIE91dCA8PCBjYzsgYnJlYWs7CisgIH0KK30KKwordm9pZCBDcHBXcml0ZXI6OnByaW50TGlua2FnZVR5cGUoR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMVCkgeworICBzd2l0Y2ggKExUKSB7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZToKKyAgICBPdXQgPDwgIkdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2U6CisgICAgT3V0IDw8ICJHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2UiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua2VyUHJpdmF0ZUxpbmthZ2U6CisgICAgT3V0IDw8ICJHbG9iYWxWYWx1ZTo6TGlua2VyUHJpdmF0ZUxpbmthZ2UiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua2VyUHJpdmF0ZVdlYWtMaW5rYWdlOgorICAgIE91dCA8PCAiR2xvYmFsVmFsdWU6OkxpbmtlclByaXZhdGVXZWFrTGlua2FnZSI7IGJyZWFrOworICBjYXNlIEdsb2JhbFZhbHVlOjpBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZToKKyAgICBPdXQgPDwgIkdsb2JhbFZhbHVlOjpBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSAiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua09uY2VBbnlMaW5rYWdlOgorICAgIE91dCA8PCAiR2xvYmFsVmFsdWU6OkxpbmtPbmNlQW55TGlua2FnZSAiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua09uY2VPRFJMaW5rYWdlOgorICAgIE91dCA8PCAiR2xvYmFsVmFsdWU6OkxpbmtPbmNlT0RSTGlua2FnZSAiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6V2Vha0FueUxpbmthZ2U6CisgICAgT3V0IDw8ICJHbG9iYWxWYWx1ZTo6V2Vha0FueUxpbmthZ2UiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6V2Vha09EUkxpbmthZ2U6CisgICAgT3V0IDw8ICJHbG9iYWxWYWx1ZTo6V2Vha09EUkxpbmthZ2UiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6QXBwZW5kaW5nTGlua2FnZToKKyAgICBPdXQgPDwgIkdsb2JhbFZhbHVlOjpBcHBlbmRpbmdMaW5rYWdlIjsgYnJlYWs7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZToKKyAgICBPdXQgPDwgIkdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6RExMSW1wb3J0TGlua2FnZToKKyAgICBPdXQgPDwgIkdsb2JhbFZhbHVlOjpETExJbXBvcnRMaW5rYWdlIjsgYnJlYWs7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkRMTEV4cG9ydExpbmthZ2U6CisgICAgT3V0IDw8ICJHbG9iYWxWYWx1ZTo6RExMRXhwb3J0TGlua2FnZSI7IGJyZWFrOworICBjYXNlIEdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlOgorICAgIE91dCA8PCAiR2xvYmFsVmFsdWU6OkV4dGVybmFsV2Vha0xpbmthZ2UiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6Q29tbW9uTGlua2FnZToKKyAgICBPdXQgPDwgIkdsb2JhbFZhbHVlOjpDb21tb25MaW5rYWdlIjsgYnJlYWs7CisgIH0KK30KKwordm9pZCBDcHBXcml0ZXI6OnByaW50VmlzaWJpbGl0eVR5cGUoR2xvYmFsVmFsdWU6OlZpc2liaWxpdHlUeXBlcyBWaXNUeXBlKSB7CisgIHN3aXRjaCAoVmlzVHlwZSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIEdWYXIgdmlzaWJpbGl0eSIpOworICBjYXNlIEdsb2JhbFZhbHVlOjpEZWZhdWx0VmlzaWJpbGl0eToKKyAgICBPdXQgPDwgIkdsb2JhbFZhbHVlOjpEZWZhdWx0VmlzaWJpbGl0eSI7CisgICAgYnJlYWs7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkhpZGRlblZpc2liaWxpdHk6CisgICAgT3V0IDw8ICJHbG9iYWxWYWx1ZTo6SGlkZGVuVmlzaWJpbGl0eSI7CisgICAgYnJlYWs7CisgIGNhc2UgR2xvYmFsVmFsdWU6OlByb3RlY3RlZFZpc2liaWxpdHk6CisgICAgT3V0IDw8ICJHbG9iYWxWYWx1ZTo6UHJvdGVjdGVkVmlzaWJpbGl0eSI7CisgICAgYnJlYWs7CisgIH0KK30KKworLy8gcHJpbnRFc2NhcGVkU3RyaW5nIC0gUHJpbnQgZWFjaCBjaGFyYWN0ZXIgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcsIGVzY2FwaW5nCisvLyBpdCBpZiBpdCBpcyBub3QgcHJpbnRhYmxlIG9yIGlmIGl0IGlzIGFuIGVzY2FwZSBjaGFyLgordm9pZCBDcHBXcml0ZXI6OnByaW50RXNjYXBlZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmU3RyKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdHIuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIGNoYXIgQyA9IFN0cltpXTsKKyAgICBpZiAoaXNwcmludChDKSAmJiBDICE9ICciJyAmJiBDICE9ICdcXCcpIHsKKyAgICAgIE91dCA8PCBDOworICAgIH0gZWxzZSB7CisgICAgICBPdXQgPDwgIlxceCIKKyAgICAgICAgICA8PCAoY2hhcikgKChDLzE2ICA8IDEwKSA/ICggQy8xNiArJzAnKSA6ICggQy8xNiAtMTArJ0EnKSkKKyAgICAgICAgICA8PCAoY2hhcikoKChDJjE1KSA8IDEwKSA/ICgoQyYxNSkrJzAnKSA6ICgoQyYxNSktMTArJ0EnKSk7CisgICAgfQorICB9Cit9CisKK3N0ZDo6c3RyaW5nIENwcFdyaXRlcjo6Z2V0Q3BwTmFtZShjb25zdCBUeXBlKiBUeSkgeworICAvLyBGaXJzdCwgaGFuZGxlIHRoZSBwcmltaXRpdmUgdHlwZXMgLi4gZWFzeQorICBpZiAoVHktPmlzUHJpbWl0aXZlVHlwZSgpIHx8IFR5LT5pc0ludGVnZXJUeSgpKSB7CisgICAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBjYXNlIFR5cGU6OlZvaWRUeUlEOiAgIHJldHVybiAiVHlwZTo6Z2V0Vm9pZFR5KG1vZC0+Z2V0Q29udGV4dCgpKSI7CisgICAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDogeworICAgICAgdW5zaWduZWQgQml0V2lkdGggPSBjYXN0PEludGVnZXJUeXBlPihUeSktPmdldEJpdFdpZHRoKCk7CisgICAgICByZXR1cm4gIkludGVnZXJUeXBlOjpnZXQobW9kLT5nZXRDb250ZXh0KCksICIgKyB1dG9zdHIoQml0V2lkdGgpICsgIikiOworICAgIH0KKyAgICBjYXNlIFR5cGU6Olg4Nl9GUDgwVHlJRDogcmV0dXJuICJUeXBlOjpnZXRYODZfRlA4MFR5KG1vZC0+Z2V0Q29udGV4dCgpKSI7CisgICAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6ICAgIHJldHVybiAiVHlwZTo6Z2V0RmxvYXRUeShtb2QtPmdldENvbnRleHQoKSkiOworICAgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDogICByZXR1cm4gIlR5cGU6OmdldERvdWJsZVR5KG1vZC0+Z2V0Q29udGV4dCgpKSI7CisgICAgY2FzZSBUeXBlOjpMYWJlbFR5SUQ6ICAgIHJldHVybiAiVHlwZTo6Z2V0TGFiZWxUeShtb2QtPmdldENvbnRleHQoKSkiOworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvcigiSW52YWxpZCBwcmltaXRpdmUgdHlwZSIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIHNob3VsZG4ndCBiZSByZXR1cm5lZCwgYnV0IG1ha2UgaXQgc2Vuc2libGUKKyAgICByZXR1cm4gIlR5cGU6OmdldFZvaWRUeShtb2QtPmdldENvbnRleHQoKSkiOworICB9CisKKyAgLy8gTm93LCBzZWUgaWYgd2UndmUgc2VlbiB0aGUgdHlwZSBiZWZvcmUgYW5kIHJldHVybiB0aGF0CisgIFR5cGVNYXA6Oml0ZXJhdG9yIEkgPSBUeXBlTmFtZXMuZmluZChUeSk7CisgIGlmIChJICE9IFR5cGVOYW1lcy5lbmQoKSkKKyAgICByZXR1cm4gSS0+c2Vjb25kOworCisgIC8vIE9rYXksIGxldCdzIGJ1aWxkIGEgbmV3IG5hbWUgZm9yIHRoaXMgdHlwZS4gU3RhcnQgd2l0aCBhIHByZWZpeAorICBjb25zdCBjaGFyKiBwcmVmaXggPSAwOworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICBjYXNlIFR5cGU6OkZ1bmN0aW9uVHlJRDogICAgcHJlZml4ID0gIkZ1bmNUeV8iOyBicmVhazsKKyAgY2FzZSBUeXBlOjpTdHJ1Y3RUeUlEOiAgICAgIHByZWZpeCA9ICJTdHJ1Y3RUeV8iOyBicmVhazsKKyAgY2FzZSBUeXBlOjpBcnJheVR5SUQ6ICAgICAgIHByZWZpeCA9ICJBcnJheVR5XyI7IGJyZWFrOworICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOiAgICAgcHJlZml4ID0gIlBvaW50ZXJUeV8iOyBicmVhazsKKyAgY2FzZSBUeXBlOjpPcGFxdWVUeUlEOiAgICAgIHByZWZpeCA9ICJPcGFxdWVUeV8iOyBicmVhazsKKyAgY2FzZSBUeXBlOjpWZWN0b3JUeUlEOiAgICAgIHByZWZpeCA9ICJWZWN0b3JUeV8iOyBicmVhazsKKyAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJPdGhlclR5XyI7IGJyZWFrOyAvLyBwcmV2ZW50IGJyZWFrYWdlCisgIH0KKworICAvLyBTZWUgaWYgdGhlIHR5cGUgaGFzIGEgbmFtZSBpbiB0aGUgc3ltYm9sdGFibGUgYW5kIGJ1aWxkIGFjY29yZGluZ2x5CisgIGNvbnN0IHN0ZDo6c3RyaW5nKiB0TmFtZSA9IGZpbmRUeXBlTmFtZShUaGVNb2R1bGUtPmdldFR5cGVTeW1ib2xUYWJsZSgpLCBUeSk7CisgIHN0ZDo6c3RyaW5nIG5hbWU7CisgIGlmICh0TmFtZSkKKyAgICBuYW1lID0gc3RkOjpzdHJpbmcocHJlZml4KSArICp0TmFtZTsKKyAgZWxzZQorICAgIG5hbWUgPSBzdGQ6OnN0cmluZyhwcmVmaXgpICsgdXRvc3RyKHVuaXF1ZU51bSsrKTsKKyAgc2FuaXRpemUobmFtZSk7CisKKyAgLy8gU2F2ZSB0aGUgbmFtZQorICByZXR1cm4gVHlwZU5hbWVzW1R5XSA9IG5hbWU7Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludENwcE5hbWUoY29uc3QgVHlwZSogVHkpIHsKKyAgcHJpbnRFc2NhcGVkU3RyaW5nKGdldENwcE5hbWUoVHkpKTsKK30KKworc3RkOjpzdHJpbmcgQ3BwV3JpdGVyOjpnZXRDcHBOYW1lKGNvbnN0IFZhbHVlKiB2YWwpIHsKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgVmFsdWVNYXA6Oml0ZXJhdG9yIEkgPSBWYWx1ZU5hbWVzLmZpbmQodmFsKTsKKyAgaWYgKEkgIT0gVmFsdWVOYW1lcy5lbmQoKSAmJiBJLT5maXJzdCA9PSB2YWwpCisgICAgcmV0dXJuICBJLT5zZWNvbmQ7CisKKyAgaWYgKGNvbnN0IEdsb2JhbFZhcmlhYmxlKiBHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPih2YWwpKSB7CisgICAgbmFtZSA9IHN0ZDo6c3RyaW5nKCJndmFyXyIpICsKKyAgICAgIGdldFR5cGVQcmVmaXgoR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIH0gZWxzZSBpZiAoaXNhPEZ1bmN0aW9uPih2YWwpKSB7CisgICAgbmFtZSA9IHN0ZDo6c3RyaW5nKCJmdW5jXyIpOworICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50KiBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KHZhbCkpIHsKKyAgICBuYW1lID0gc3RkOjpzdHJpbmcoImNvbnN0XyIpICsgZ2V0VHlwZVByZWZpeChDLT5nZXRUeXBlKCkpOworICB9IGVsc2UgaWYgKGNvbnN0IEFyZ3VtZW50KiBBcmcgPSBkeW5fY2FzdDxBcmd1bWVudD4odmFsKSkgeworICAgIGlmIChpc19pbmxpbmUpIHsKKyAgICAgIHVuc2lnbmVkIGFyZ051bSA9IHN0ZDo6ZGlzdGFuY2UoQXJnLT5nZXRQYXJlbnQoKS0+YXJnX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOjpjb25zdF9hcmdfaXRlcmF0b3IoQXJnKSkgKyAxOworICAgICAgbmFtZSA9IHN0ZDo6c3RyaW5nKCJhcmdfIikgKyB1dG9zdHIoYXJnTnVtKTsKKyAgICAgIE5hbWVTZXQ6Oml0ZXJhdG9yIE5JID0gVXNlZE5hbWVzLmZpbmQobmFtZSk7CisgICAgICBpZiAoTkkgIT0gVXNlZE5hbWVzLmVuZCgpKQorICAgICAgICBuYW1lICs9IHN0ZDo6c3RyaW5nKCJfIikgKyB1dG9zdHIodW5pcXVlTnVtKyspOworICAgICAgVXNlZE5hbWVzLmluc2VydChuYW1lKTsKKyAgICAgIHJldHVybiBWYWx1ZU5hbWVzW3ZhbF0gPSBuYW1lOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gZ2V0VHlwZVByZWZpeCh2YWwtPmdldFR5cGUoKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIG5hbWUgPSBnZXRUeXBlUHJlZml4KHZhbC0+Z2V0VHlwZSgpKTsKKyAgfQorICBpZiAodmFsLT5oYXNOYW1lKCkpCisgICAgbmFtZSArPSB2YWwtPmdldE5hbWUoKTsKKyAgZWxzZQorICAgIG5hbWUgKz0gdXRvc3RyKHVuaXF1ZU51bSsrKTsKKyAgc2FuaXRpemUobmFtZSk7CisgIE5hbWVTZXQ6Oml0ZXJhdG9yIE5JID0gVXNlZE5hbWVzLmZpbmQobmFtZSk7CisgIGlmIChOSSAhPSBVc2VkTmFtZXMuZW5kKCkpCisgICAgbmFtZSArPSBzdGQ6OnN0cmluZygiXyIpICsgdXRvc3RyKHVuaXF1ZU51bSsrKTsKKyAgVXNlZE5hbWVzLmluc2VydChuYW1lKTsKKyAgcmV0dXJuIFZhbHVlTmFtZXNbdmFsXSA9IG5hbWU7Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludENwcE5hbWUoY29uc3QgVmFsdWUqIHZhbCkgeworICBwcmludEVzY2FwZWRTdHJpbmcoZ2V0Q3BwTmFtZSh2YWwpKTsKK30KKwordm9pZCBDcHBXcml0ZXI6OnByaW50QXR0cmlidXRlcyhjb25zdCBBdHRyTGlzdFB0ciAmUEFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICBPdXQgPDwgIkF0dHJMaXN0UHRyICIgPDwgbmFtZSA8PCAiX1BBTDsiOworICBubChPdXQpOworICBpZiAoIVBBTC5pc0VtcHR5KCkpIHsKKyAgICBPdXQgPDwgJ3snOyBpbigpOyBubChPdXQpOworICAgIE91dCA8PCAiU21hbGxWZWN0b3I8QXR0cmlidXRlV2l0aEluZGV4LCA0PiBBdHRyczsiOyBubChPdXQpOworICAgIE91dCA8PCAiQXR0cmlidXRlV2l0aEluZGV4IFBBV0k7IjsgbmwoT3V0KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUEFMLmdldE51bVNsb3RzKCk7ICsraSkgeworICAgICAgdW5zaWduZWQgaW5kZXggPSBQQUwuZ2V0U2xvdChpKS5JbmRleDsKKyAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBQQUwuZ2V0U2xvdChpKS5BdHRyczsKKyAgICAgIE91dCA8PCAiUEFXSS5JbmRleCA9ICIgPDwgaW5kZXggPDwgIlU7IFBBV0kuQXR0cnMgPSAwICI7CisjZGVmaW5lIEhBTkRMRV9BVFRSKFgpICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoYXR0cnMgJiBBdHRyaWJ1dGU6OlgpICAgICAgXAorICAgICAgICBPdXQgPDwgIiB8IEF0dHJpYnV0ZTo6IiAjWDsgIFwKKyAgICAgIGF0dHJzICY9IH5BdHRyaWJ1dGU6Olg7CisgICAgICAKKyAgICAgIEhBTkRMRV9BVFRSKFNFeHQpOworICAgICAgSEFORExFX0FUVFIoWkV4dCk7CisgICAgICBIQU5ETEVfQVRUUihOb1JldHVybik7CisgICAgICBIQU5ETEVfQVRUUihJblJlZyk7CisgICAgICBIQU5ETEVfQVRUUihTdHJ1Y3RSZXQpOworICAgICAgSEFORExFX0FUVFIoTm9VbndpbmQpOworICAgICAgSEFORExFX0FUVFIoTm9BbGlhcyk7CisgICAgICBIQU5ETEVfQVRUUihCeVZhbCk7CisgICAgICBIQU5ETEVfQVRUUihOZXN0KTsKKyAgICAgIEhBTkRMRV9BVFRSKFJlYWROb25lKTsKKyAgICAgIEhBTkRMRV9BVFRSKFJlYWRPbmx5KTsKKyAgICAgIEhBTkRMRV9BVFRSKE5vSW5saW5lKTsKKyAgICAgIEhBTkRMRV9BVFRSKEFsd2F5c0lubGluZSk7CisgICAgICBIQU5ETEVfQVRUUihPcHRpbWl6ZUZvclNpemUpOworICAgICAgSEFORExFX0FUVFIoU3RhY2tQcm90ZWN0KTsKKyAgICAgIEhBTkRMRV9BVFRSKFN0YWNrUHJvdGVjdFJlcSk7CisgICAgICBIQU5ETEVfQVRUUihOb0NhcHR1cmUpOworICAgICAgSEFORExFX0FUVFIoTm9SZWRab25lKTsKKyAgICAgIEhBTkRMRV9BVFRSKE5vSW1wbGljaXRGbG9hdCk7CisgICAgICBIQU5ETEVfQVRUUihOYWtlZCk7CisgICAgICBIQU5ETEVfQVRUUihJbmxpbmVIaW50KTsKKyN1bmRlZiBIQU5ETEVfQVRUUgorICAgICAgaWYgKGF0dHJzICYgQXR0cmlidXRlOjpTdGFja0FsaWdubWVudCkKKyAgICAgICAgT3V0IDw8ICIgfCBBdHRyaWJ1dGU6OmNvbnN0cnVjdFN0YWNrQWxpZ25tZW50RnJvbUludCgiCisgICAgICAgICAgICA8PCBBdHRyaWJ1dGU6OmdldFN0YWNrQWxpZ25tZW50RnJvbUF0dHJzKGF0dHJzKQorICAgICAgICAgICAgPDwgIikiOyAKKyAgICAgIGF0dHJzICY9IH5BdHRyaWJ1dGU6OlN0YWNrQWxpZ25tZW50OworICAgICAgYXNzZXJ0KGF0dHJzID09IDAgJiYgIlVuaGFuZGxlZCBhdHRyaWJ1dGUhIik7CisgICAgICBPdXQgPDwgIjsiOworICAgICAgbmwoT3V0KTsKKyAgICAgIE91dCA8PCAiQXR0cnMucHVzaF9iYWNrKFBBV0kpOyI7CisgICAgICBubChPdXQpOworICAgIH0KKyAgICBPdXQgPDwgbmFtZSA8PCAiX1BBTCA9IEF0dHJMaXN0UHRyOjpnZXQoQXR0cnMuYmVnaW4oKSwgQXR0cnMuZW5kKCkpOyI7CisgICAgbmwoT3V0KTsKKyAgICBvdXQoKTsgbmwoT3V0KTsKKyAgICBPdXQgPDwgJ30nOyBubChPdXQpOworICB9Cit9CisKK2Jvb2wgQ3BwV3JpdGVyOjpwcmludFR5cGVJbnRlcm5hbChjb25zdCBUeXBlKiBUeSkgeworICAvLyBXZSBkb24ndCBwcmludCBkZWZpbml0aW9ucyBmb3IgcHJpbWl0aXZlIHR5cGVzCisgIGlmIChUeS0+aXNQcmltaXRpdmVUeXBlKCkgfHwgVHktPmlzSW50ZWdlclR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHdlIGFscmVhZHkgZGVmaW5lZCB0aGlzIHR5cGUsIHdlIGRvbid0IG5lZWQgdG8gZGVmaW5lIGl0IGFnYWluLgorICBpZiAoRGVmaW5lZFR5cGVzLmZpbmQoVHkpICE9IERlZmluZWRUeXBlcy5lbmQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRXZlcnl0aGluZyBiZWxvdyBuZWVkcyB0aGUgbmFtZSBmb3IgdGhlIHR5cGUgc28gZ2V0IGl0IG5vdy4KKyAgc3RkOjpzdHJpbmcgdHlwZU5hbWUoZ2V0Q3BwTmFtZShUeSkpOworCisgIC8vIFNlYXJjaCB0aGUgdHlwZSBzdGFjayBmb3IgcmVjdXJzaW9uLiBJZiB3ZSBmaW5kIGl0LCB0aGVuIGdlbmVyYXRlIHRoaXMKKyAgLy8gYXMgYW4gT3BhcXVlVHlwZSwgYnV0IG1ha2Ugc3VyZSBub3QgdG8gZG8gdGhpcyBtdWx0aXBsZSB0aW1lcyBiZWNhdXNlCisgIC8vIHRoZSB0eXBlIGNvdWxkIGFwcGVhciBpbiBtdWx0aXBsZSBwbGFjZXMgb24gdGhlIHN0YWNrLiBPbmNlIHRoZSBvcGFxdWUKKyAgLy8gZGVmaW5pdGlvbiBpcyBpc3N1ZWQsIGl0IG11c3Qgbm90IGJlIHJlLWlzc3VlZC4gQ29uc2VxdWVudGx5IHdlIGhhdmUgdG8KKyAgLy8gY2hlY2sgdGhlIFVucmVzb2x2ZWRUeXBlcyBsaXN0IGFzIHdlbGwuCisgIFR5cGVMaXN0Ojpjb25zdF9pdGVyYXRvciBUSSA9IHN0ZDo6ZmluZChUeXBlU3RhY2suYmVnaW4oKSwgVHlwZVN0YWNrLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHkpOworICBpZiAoVEkgIT0gVHlwZVN0YWNrLmVuZCgpKSB7CisgICAgVHlwZU1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IFVucmVzb2x2ZWRUeXBlcy5maW5kKFR5KTsKKyAgICBpZiAoSSA9PSBVbnJlc29sdmVkVHlwZXMuZW5kKCkpIHsKKyAgICAgIE91dCA8PCAiUEFUeXBlSG9sZGVyICIgPDwgdHlwZU5hbWU7CisgICAgICBPdXQgPDwgIl9md2QgPSBPcGFxdWVUeXBlOjpnZXQobW9kLT5nZXRDb250ZXh0KCkpOyI7CisgICAgICBubChPdXQpOworICAgICAgVW5yZXNvbHZlZFR5cGVzW1R5XSA9IHR5cGVOYW1lOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFdlJ3JlIGdvaW5nIHRvIHByaW50IGEgZGVyaXZlZCB0eXBlIHdoaWNoLCBieSBkZWZpbml0aW9uLCBjb250YWlucyBvdGhlcgorICAvLyB0eXBlcy4gU28sIHB1c2ggdGhpcyBvbmUgd2UncmUgcHJpbnRpbmcgb250byB0aGUgdHlwZSBzdGFjayB0byBhc3Npc3Qgd2l0aAorICAvLyByZWN1cnNpdmUgZGVmaW5pdGlvbnMuCisgIFR5cGVTdGFjay5wdXNoX2JhY2soVHkpOworCisgIC8vIFByaW50IHRoZSB0eXBlIGRlZmluaXRpb24KKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgY2FzZSBUeXBlOjpGdW5jdGlvblR5SUQ6ICB7CisgICAgY29uc3QgRnVuY3Rpb25UeXBlKiBGVCA9IGNhc3Q8RnVuY3Rpb25UeXBlPihUeSk7CisgICAgT3V0IDw8ICJzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4iIDw8IHR5cGVOYW1lIDw8ICJfYXJnczsiOworICAgIG5sKE91dCk7CisgICAgRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBQSSA9IEZULT5wYXJhbV9iZWdpbigpOworICAgIEZ1bmN0aW9uVHlwZTo6cGFyYW1faXRlcmF0b3IgUEUgPSBGVC0+cGFyYW1fZW5kKCk7CisgICAgZm9yICg7IFBJICE9IFBFOyArK1BJKSB7CisgICAgICBjb25zdCBUeXBlKiBhcmdUeSA9IHN0YXRpY19jYXN0PGNvbnN0IFR5cGUqPigqUEkpOworICAgICAgYm9vbCBpc0ZvcndhcmQgPSBwcmludFR5cGVJbnRlcm5hbChhcmdUeSk7CisgICAgICBzdGQ6OnN0cmluZyBhcmdOYW1lKGdldENwcE5hbWUoYXJnVHkpKTsKKyAgICAgIE91dCA8PCB0eXBlTmFtZSA8PCAiX2FyZ3MucHVzaF9iYWNrKCIgPDwgYXJnTmFtZTsKKyAgICAgIGlmIChpc0ZvcndhcmQpCisgICAgICAgIE91dCA8PCAiX2Z3ZCI7CisgICAgICBPdXQgPDwgIik7IjsKKyAgICAgIG5sKE91dCk7CisgICAgfQorICAgIGJvb2wgaXNGb3J3YXJkID0gcHJpbnRUeXBlSW50ZXJuYWwoRlQtPmdldFJldHVyblR5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgcmV0VHlwZU5hbWUoZ2V0Q3BwTmFtZShGVC0+Z2V0UmV0dXJuVHlwZSgpKSk7CisgICAgT3V0IDw8ICJGdW5jdGlvblR5cGUqICIgPDwgdHlwZU5hbWUgPDwgIiA9IEZ1bmN0aW9uVHlwZTo6Z2V0KCI7CisgICAgaW4oKTsgbmwoT3V0KSA8PCAiLypSZXN1bHQ9Ki8iIDw8IHJldFR5cGVOYW1lOworICAgIGlmIChpc0ZvcndhcmQpCisgICAgICBPdXQgPDwgIl9md2QiOworICAgIE91dCA8PCAiLCI7CisgICAgbmwoT3V0KSA8PCAiLypQYXJhbXM9Ki8iIDw8IHR5cGVOYW1lIDw8ICJfYXJncywiOworICAgIG5sKE91dCkgPDwgIi8qaXNWYXJBcmc9Ki8iIDw8IChGVC0+aXNWYXJBcmcoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIpOyI7CisgICAgb3V0KCk7CisgICAgbmwoT3V0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIFR5cGU6OlN0cnVjdFR5SUQ6IHsKKyAgICBjb25zdCBTdHJ1Y3RUeXBlKiBTVCA9IGNhc3Q8U3RydWN0VHlwZT4oVHkpOworICAgIE91dCA8PCAic3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IiA8PCB0eXBlTmFtZSA8PCAiX2ZpZWxkczsiOworICAgIG5sKE91dCk7CisgICAgU3RydWN0VHlwZTo6ZWxlbWVudF9pdGVyYXRvciBFSSA9IFNULT5lbGVtZW50X2JlZ2luKCk7CisgICAgU3RydWN0VHlwZTo6ZWxlbWVudF9pdGVyYXRvciBFRSA9IFNULT5lbGVtZW50X2VuZCgpOworICAgIGZvciAoOyBFSSAhPSBFRTsgKytFSSkgeworICAgICAgY29uc3QgVHlwZSogZmllbGRUeSA9IHN0YXRpY19jYXN0PGNvbnN0IFR5cGUqPigqRUkpOworICAgICAgYm9vbCBpc0ZvcndhcmQgPSBwcmludFR5cGVJbnRlcm5hbChmaWVsZFR5KTsKKyAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZShnZXRDcHBOYW1lKGZpZWxkVHkpKTsKKyAgICAgIE91dCA8PCB0eXBlTmFtZSA8PCAiX2ZpZWxkcy5wdXNoX2JhY2soIiA8PCBmaWVsZE5hbWU7CisgICAgICBpZiAoaXNGb3J3YXJkKQorICAgICAgICBPdXQgPDwgIl9md2QiOworICAgICAgT3V0IDw8ICIpOyI7CisgICAgICBubChPdXQpOworICAgIH0KKyAgICBPdXQgPDwgIlN0cnVjdFR5cGUqICIgPDwgdHlwZU5hbWUgPDwgIiA9IFN0cnVjdFR5cGU6OmdldCgiCisgICAgICAgIDw8ICJtb2QtPmdldENvbnRleHQoKSwgIgorICAgICAgICA8PCB0eXBlTmFtZSA8PCAiX2ZpZWxkcywgLyppc1BhY2tlZD0qLyIKKyAgICAgICAgPDwgKFNULT5pc1BhY2tlZCgpID8gInRydWUiIDogImZhbHNlIikgPDwgIik7IjsKKyAgICBubChPdXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgVHlwZTo6QXJyYXlUeUlEOiB7CisgICAgY29uc3QgQXJyYXlUeXBlKiBBVCA9IGNhc3Q8QXJyYXlUeXBlPihUeSk7CisgICAgY29uc3QgVHlwZSogRVQgPSBBVC0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICBib29sIGlzRm9yd2FyZCA9IHByaW50VHlwZUludGVybmFsKEVUKTsKKyAgICBzdGQ6OnN0cmluZyBlbGVtTmFtZShnZXRDcHBOYW1lKEVUKSk7CisgICAgT3V0IDw8ICJBcnJheVR5cGUqICIgPDwgdHlwZU5hbWUgPDwgIiA9IEFycmF5VHlwZTo6Z2V0KCIKKyAgICAgICAgPDwgZWxlbU5hbWUgPDwgKGlzRm9yd2FyZCA/ICJfZndkIiA6ICIiKQorICAgICAgICA8PCAiLCAiIDw8IHV0b3N0cihBVC0+Z2V0TnVtRWxlbWVudHMoKSkgPDwgIik7IjsKKyAgICBubChPdXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgVHlwZTo6UG9pbnRlclR5SUQ6IHsKKyAgICBjb25zdCBQb2ludGVyVHlwZSogUFQgPSBjYXN0PFBvaW50ZXJUeXBlPihUeSk7CisgICAgY29uc3QgVHlwZSogRVQgPSBQVC0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICBib29sIGlzRm9yd2FyZCA9IHByaW50VHlwZUludGVybmFsKEVUKTsKKyAgICBzdGQ6OnN0cmluZyBlbGVtTmFtZShnZXRDcHBOYW1lKEVUKSk7CisgICAgT3V0IDw8ICJQb2ludGVyVHlwZSogIiA8PCB0eXBlTmFtZSA8PCAiID0gUG9pbnRlclR5cGU6OmdldCgiCisgICAgICAgIDw8IGVsZW1OYW1lIDw8IChpc0ZvcndhcmQgPyAiX2Z3ZCIgOiAiIikKKyAgICAgICAgPDwgIiwgIiA8PCB1dG9zdHIoUFQtPmdldEFkZHJlc3NTcGFjZSgpKSA8PCAiKTsiOworICAgIG5sKE91dCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBUeXBlOjpWZWN0b3JUeUlEOiB7CisgICAgY29uc3QgVmVjdG9yVHlwZSogUFQgPSBjYXN0PFZlY3RvclR5cGU+KFR5KTsKKyAgICBjb25zdCBUeXBlKiBFVCA9IFBULT5nZXRFbGVtZW50VHlwZSgpOworICAgIGJvb2wgaXNGb3J3YXJkID0gcHJpbnRUeXBlSW50ZXJuYWwoRVQpOworICAgIHN0ZDo6c3RyaW5nIGVsZW1OYW1lKGdldENwcE5hbWUoRVQpKTsKKyAgICBPdXQgPDwgIlZlY3RvclR5cGUqICIgPDwgdHlwZU5hbWUgPDwgIiA9IFZlY3RvclR5cGU6OmdldCgiCisgICAgICAgIDw8IGVsZW1OYW1lIDw8IChpc0ZvcndhcmQgPyAiX2Z3ZCIgOiAiIikKKyAgICAgICAgPDwgIiwgIiA8PCB1dG9zdHIoUFQtPmdldE51bUVsZW1lbnRzKCkpIDw8ICIpOyI7CisgICAgbmwoT3V0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIFR5cGU6Ok9wYXF1ZVR5SUQ6IHsKKyAgICBPdXQgPDwgIk9wYXF1ZVR5cGUqICIgPDwgdHlwZU5hbWU7CisgICAgT3V0IDw8ICIgPSBPcGFxdWVUeXBlOjpnZXQobW9kLT5nZXRDb250ZXh0KCkpOyI7CisgICAgbmwoT3V0KTsKKyAgICBicmVhazsKKyAgfQorICBkZWZhdWx0OgorICAgIGVycm9yKCJJbnZhbGlkIFR5cGVJRCIpOworICB9CisKKyAgLy8gSWYgdGhlIHR5cGUgaGFkIGEgbmFtZSwgbWFrZSBzdXJlIHdlIHJlY3JlYXRlIGl0LgorICBjb25zdCBzdGQ6OnN0cmluZyogcHJvZ1R5cGVOYW1lID0KKyAgICBmaW5kVHlwZU5hbWUoVGhlTW9kdWxlLT5nZXRUeXBlU3ltYm9sVGFibGUoKSxUeSk7CisgIGlmIChwcm9nVHlwZU5hbWUpIHsKKyAgICBPdXQgPDwgIm1vZC0+YWRkVHlwZU5hbWUoXCIiIDw8ICpwcm9nVHlwZU5hbWUgPDwgIlwiLCAiCisgICAgICAgIDw8IHR5cGVOYW1lIDw8ICIpOyI7CisgICAgbmwoT3V0KTsKKyAgfQorCisgIC8vIFBvcCB1cyBvZmYgdGhlIHR5cGUgc3RhY2sKKyAgVHlwZVN0YWNrLnBvcF9iYWNrKCk7CisKKyAgLy8gSW5kaWNhdGUgdGhhdCB0aGlzIHR5cGUgaXMgbm93IGRlZmluZWQuCisgIERlZmluZWRUeXBlcy5pbnNlcnQoVHkpOworCisgIC8vIEVhcmx5IHJlc29sdmUgYXMgbWFueSB1bnJlc29sdmVkIHR5cGVzIGFzIHBvc3NpYmxlLiBTZWFyY2ggdGhlIHVucmVzb2x2ZWQKKyAgLy8gdHlwZXMgbWFwIGZvciB0aGUgdHlwZSB3ZSBqdXN0IHByaW50ZWQuIE5vdyB0aGF0IGl0cyBkZWZpbml0aW9uIGlzIGNvbXBsZXRlCisgIC8vIHdlIGNhbiByZXNvbHZlIGFueSBwcmV2aW91cyByZWZlcmVuY2VzIHRvIGl0LiBUaGlzIHByZXZlbnRzIGEgY2FzY2FkZSBvZgorICAvLyB1bnJlc29sdmVkIHR5cGVzLgorICBUeXBlTWFwOjppdGVyYXRvciBJID0gVW5yZXNvbHZlZFR5cGVzLmZpbmQoVHkpOworICBpZiAoSSAhPSBVbnJlc29sdmVkVHlwZXMuZW5kKCkpIHsKKyAgICBPdXQgPDwgImNhc3Q8T3BhcXVlVHlwZT4oIiA8PCBJLT5zZWNvbmQKKyAgICAgICAgPDwgIl9md2QuZ2V0KCkpLT5yZWZpbmVBYnN0cmFjdFR5cGVUbygiIDw8IEktPnNlY29uZCA8PCAiKTsiOworICAgIG5sKE91dCk7CisgICAgT3V0IDw8IEktPnNlY29uZCA8PCAiID0gY2FzdDwiOworICAgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgICAgY2FzZSBUeXBlOjpGdW5jdGlvblR5SUQ6IE91dCA8PCAiRnVuY3Rpb25UeXBlIjsgYnJlYWs7CisgICAgY2FzZSBUeXBlOjpBcnJheVR5SUQ6ICAgIE91dCA8PCAiQXJyYXlUeXBlIjsgYnJlYWs7CisgICAgY2FzZSBUeXBlOjpTdHJ1Y3RUeUlEOiAgIE91dCA8PCAiU3RydWN0VHlwZSI7IGJyZWFrOworICAgIGNhc2UgVHlwZTo6VmVjdG9yVHlJRDogICBPdXQgPDwgIlZlY3RvclR5cGUiOyBicmVhazsKKyAgICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOiAgT3V0IDw8ICJQb2ludGVyVHlwZSI7IGJyZWFrOworICAgIGNhc2UgVHlwZTo6T3BhcXVlVHlJRDogICBPdXQgPDwgIk9wYXF1ZVR5cGUiOyBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgT3V0IDw8ICJOb1N1Y2hEZXJpdmVkVHlwZSI7IGJyZWFrOworICAgIH0KKyAgICBPdXQgPDwgIj4oIiA8PCBJLT5zZWNvbmQgPDwgIl9md2QuZ2V0KCkpOyI7CisgICAgbmwoT3V0KTsgbmwoT3V0KTsKKyAgICBVbnJlc29sdmVkVHlwZXMuZXJhc2UoSSk7CisgIH0KKworICAvLyBGaW5hbGx5LCBzZXBhcmF0ZSB0aGUgdHlwZSBkZWZpbml0aW9uIGZyb20gb3RoZXIgd2l0aCBhIG5ld2xpbmUuCisgIG5sKE91dCk7CisKKyAgLy8gV2Ugd2VyZW4ndCBhIHJlY3Vyc2l2ZSB0eXBlCisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUHJpbnRzIGEgdHlwZSBkZWZpbml0aW9uLiBSZXR1cm5zIHRydWUgaWYgaXQgY291bGQgbm90IHJlc29sdmUgYWxsIHRoZQorLy8gdHlwZXMgaW4gdGhlIGRlZmluaXRpb24gYnV0IGhhZCB0byB1c2UgYSBmb3J3YXJkIHJlZmVyZW5jZS4KK3ZvaWQgQ3BwV3JpdGVyOjpwcmludFR5cGUoY29uc3QgVHlwZSogVHkpIHsKKyAgYXNzZXJ0KFR5cGVTdGFjay5lbXB0eSgpKTsKKyAgVHlwZVN0YWNrLmNsZWFyKCk7CisgIHByaW50VHlwZUludGVybmFsKFR5KTsKKyAgYXNzZXJ0KFR5cGVTdGFjay5lbXB0eSgpKTsKK30KKwordm9pZCBDcHBXcml0ZXI6OnByaW50VHlwZXMoY29uc3QgTW9kdWxlKiBNKSB7CisgIC8vIFdhbGsgdGhlIHN5bWJvbCB0YWJsZSBhbmQgcHJpbnQgb3V0IGFsbCBpdHMgdHlwZXMKKyAgY29uc3QgVHlwZVN5bWJvbFRhYmxlJiBzeW10YWIgPSBNLT5nZXRUeXBlU3ltYm9sVGFibGUoKTsKKyAgZm9yIChUeXBlU3ltYm9sVGFibGU6OmNvbnN0X2l0ZXJhdG9yIFRJID0gc3ltdGFiLmJlZ2luKCksIFRFID0gc3ltdGFiLmVuZCgpOworICAgICAgIFRJICE9IFRFOyArK1RJKSB7CisKKyAgICAvLyBGb3IgcHJpbWl0aXZlIHR5cGVzIGFuZCB0eXBlcyBhbHJlYWR5IGRlZmluZWQsIGp1c3QgYWRkIGEgbmFtZQorICAgIFR5cGVNYXA6OmNvbnN0X2l0ZXJhdG9yIFROSSA9IFR5cGVOYW1lcy5maW5kKFRJLT5zZWNvbmQpOworICAgIGlmIChUSS0+c2Vjb25kLT5pc0ludGVnZXJUeSgpIHx8IFRJLT5zZWNvbmQtPmlzUHJpbWl0aXZlVHlwZSgpIHx8CisgICAgICAgIFROSSAhPSBUeXBlTmFtZXMuZW5kKCkpIHsKKyAgICAgIE91dCA8PCAibW9kLT5hZGRUeXBlTmFtZShcIiI7CisgICAgICBwcmludEVzY2FwZWRTdHJpbmcoVEktPmZpcnN0KTsKKyAgICAgIE91dCA8PCAiXCIsICIgPDwgZ2V0Q3BwTmFtZShUSS0+c2Vjb25kKSA8PCAiKTsiOworICAgICAgbmwoT3V0KTsKKyAgICAgIC8vIEZvciBldmVyeXRoaW5nIGVsc2UsIGRlZmluZSB0aGUgdHlwZQorICAgIH0gZWxzZSB7CisgICAgICBwcmludFR5cGUoVEktPnNlY29uZCk7CisgICAgfQorICB9CisKKyAgLy8gQWRkIGFsbCBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB0byB0aGUgdmFsdWUgdGFibGUuLi4KKyAgZm9yIChNb2R1bGU6OmNvbnN0X2dsb2JhbF9pdGVyYXRvciBJID0gVGhlTW9kdWxlLT5nbG9iYWxfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBUaGVNb2R1bGUtPmdsb2JhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aGFzSW5pdGlhbGl6ZXIoKSkKKyAgICAgIHByaW50VHlwZShJLT5nZXRJbml0aWFsaXplcigpLT5nZXRUeXBlKCkpOworICAgIHByaW50VHlwZShJLT5nZXRUeXBlKCkpOworICB9CisKKyAgLy8gQWRkIGFsbCB0aGUgZnVuY3Rpb25zIHRvIHRoZSB0YWJsZQorICBmb3IgKE1vZHVsZTo6Y29uc3RfaXRlcmF0b3IgRkkgPSBUaGVNb2R1bGUtPmJlZ2luKCksIEZFID0gVGhlTW9kdWxlLT5lbmQoKTsKKyAgICAgICBGSSAhPSBGRTsgKytGSSkgeworICAgIHByaW50VHlwZShGSS0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICBwcmludFR5cGUoRkktPmdldEZ1bmN0aW9uVHlwZSgpKTsKKyAgICAvLyBBZGQgYWxsIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBmb3IgKEZ1bmN0aW9uOjpjb25zdF9hcmdfaXRlcmF0b3IgQUkgPSBGSS0+YXJnX2JlZ2luKCksCisgICAgICAgICAgIEFFID0gRkktPmFyZ19lbmQoKTsgQUkgIT0gQUU7ICsrQUkpIHsKKyAgICAgIHByaW50VHlwZShBSS0+Z2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICAvLyBBZGQgYWxsIG9mIHRoZSBiYXNpYyBibG9ja3MgYW5kIGluc3RydWN0aW9ucworICAgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEJCID0gRkktPmJlZ2luKCksCisgICAgICAgICAgIEUgPSBGSS0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpIHsKKyAgICAgIHByaW50VHlwZShCQi0+Z2V0VHlwZSgpKTsKKyAgICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBJIT1FOworICAgICAgICAgICArK0kpIHsKKyAgICAgICAgcHJpbnRUeXBlKEktPmdldFR5cGUoKSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBJLT5nZXROdW1PcGVyYW5kcygpOyArK2kpCisgICAgICAgICAgcHJpbnRUeXBlKEktPmdldE9wZXJhbmQoaSktPmdldFR5cGUoKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLy8gcHJpbnRDb25zdGFudCAtIFByaW50IG91dCBhIGNvbnN0YW50IHBvb2wgZW50cnkuLi4KK3ZvaWQgQ3BwV3JpdGVyOjpwcmludENvbnN0YW50KGNvbnN0IENvbnN0YW50ICpDVikgeworICAvLyBGaXJzdCwgaWYgdGhlIGNvbnN0YW50IGlzIGFjdHVhbGx5IGEgR2xvYmFsVmFsdWUgKHZhcmlhYmxlIG9yIGZ1bmN0aW9uKQorICAvLyBvciBpdHMgYWxyZWFkeSBpbiB0aGUgY29uc3RhbnQgbGlzdCB0aGVuIHdlJ3ZlIHByaW50ZWQgaXQgYWxyZWFkeSBhbmQgd2UKKyAgLy8gY2FuIGp1c3QgcmV0dXJuLgorICBpZiAoaXNhPEdsb2JhbFZhbHVlPihDVikgfHwgVmFsdWVOYW1lcy5maW5kKENWKSAhPSBWYWx1ZU5hbWVzLmVuZCgpKQorICAgIHJldHVybjsKKworICBzdGQ6OnN0cmluZyBjb25zdE5hbWUoZ2V0Q3BwTmFtZShDVikpOworICBzdGQ6OnN0cmluZyB0eXBlTmFtZShnZXRDcHBOYW1lKENWLT5nZXRUeXBlKCkpKTsKKworICBpZiAoaXNhPEdsb2JhbFZhbHVlPihDVikpIHsKKyAgICAvLyBTa2lwIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLCB3ZSBlbWl0IHRoZW0gZWxzZXdoZXJlCisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGNvbnN0IENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDVikpIHsKKyAgICBzdGQ6OnN0cmluZyBjb25zdFZhbHVlID0gQ0ktPmdldFZhbHVlKCkudG9TdHJpbmcoMTAsIHRydWUpOworICAgIE91dCA8PCAiQ29uc3RhbnRJbnQqICIgPDwgY29uc3ROYW1lCisgICAgICAgIDw8ICIgPSBDb25zdGFudEludDo6Z2V0KG1vZC0+Z2V0Q29udGV4dCgpLCBBUEludCgiCisgICAgICAgIDw8IGNhc3Q8SW50ZWdlclR5cGU+KENJLT5nZXRUeXBlKCkpLT5nZXRCaXRXaWR0aCgpCisgICAgICAgIDw8ICIsIFN0cmluZ1JlZihcIiIgPDwgIGNvbnN0VmFsdWUgPDwgIlwiKSwgMTApKTsiOworICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KENWKSkgeworICAgIE91dCA8PCAiQ29uc3RhbnRBZ2dyZWdhdGVaZXJvKiAiIDw8IGNvbnN0TmFtZQorICAgICAgICA8PCAiID0gQ29uc3RhbnRBZ2dyZWdhdGVaZXJvOjpnZXQoIiA8PCB0eXBlTmFtZSA8PCAiKTsiOworICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihDVikpIHsKKyAgICBPdXQgPDwgIkNvbnN0YW50UG9pbnRlck51bGwqICIgPDwgY29uc3ROYW1lCisgICAgICAgIDw8ICIgPSBDb25zdGFudFBvaW50ZXJOdWxsOjpnZXQoIiA8PCB0eXBlTmFtZSA8PCAiKTsiOworICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50RlAgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlA+KENWKSkgeworICAgIE91dCA8PCAiQ29uc3RhbnRGUCogIiA8PCBjb25zdE5hbWUgPDwgIiA9ICI7CisgICAgcHJpbnRDRlAoQ0ZQKTsKKyAgICBPdXQgPDwgIjsiOworICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50QXJyYXkgKkNBID0gZHluX2Nhc3Q8Q29uc3RhbnRBcnJheT4oQ1YpKSB7CisgICAgaWYgKENBLT5pc1N0cmluZygpICYmCisgICAgICAgIENBLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkgPT0KKyAgICAgICAgICAgIFR5cGU6OmdldEludDhUeShDQS0+Z2V0Q29udGV4dCgpKSkgeworICAgICAgT3V0IDw8ICJDb25zdGFudCogIiA8PCBjb25zdE5hbWUgPDwKKyAgICAgICAgICAgICAiID0gQ29uc3RhbnRBcnJheTo6Z2V0KG1vZC0+Z2V0Q29udGV4dCgpLCBcIiI7CisgICAgICBzdGQ6OnN0cmluZyB0bXAgPSBDQS0+Z2V0QXNTdHJpbmcoKTsKKyAgICAgIGJvb2wgbnVsbFRlcm1pbmF0ZSA9IGZhbHNlOworICAgICAgaWYgKHRtcFt0bXAubGVuZ3RoKCktMV0gPT0gMCkgeworICAgICAgICB0bXAuZXJhc2UodG1wLmxlbmd0aCgpLTEpOworICAgICAgICBudWxsVGVybWluYXRlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHByaW50RXNjYXBlZFN0cmluZyh0bXApOworICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIHdhbnQgbnVsbCB0ZXJtaW5hdGlvbiBvciBub3QuCisgICAgICBpZiAobnVsbFRlcm1pbmF0ZSkKKyAgICAgICAgT3V0IDw8ICJcIiwgdHJ1ZSI7IC8vIEluZGljYXRlIHRoYXQgdGhlIG51bGwgdGVybWluYXRvciBzaG91bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGVkLgorICAgICAgZWxzZQorICAgICAgICBPdXQgPDwgIlwiLCBmYWxzZSI7Ly8gTm8gbnVsbCB0ZXJtaW5hdG9yCisgICAgICBPdXQgPDwgIik7IjsKKyAgICB9IGVsc2UgeworICAgICAgT3V0IDw8ICJzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICIgPDwgY29uc3ROYW1lIDw8ICJfZWxlbXM7IjsKKyAgICAgIG5sKE91dCk7CisgICAgICB1bnNpZ25lZCBOID0gQ0EtPmdldE51bU9wZXJhbmRzKCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgIHByaW50Q29uc3RhbnQoQ0EtPmdldE9wZXJhbmQoaSkpOyAvLyByZWN1cnNlIHRvIHByaW50IG9wZXJhbmRzCisgICAgICAgIE91dCA8PCBjb25zdE5hbWUgPDwgIl9lbGVtcy5wdXNoX2JhY2soIgorICAgICAgICAgICAgPDwgZ2V0Q3BwTmFtZShDQS0+Z2V0T3BlcmFuZChpKSkgPDwgIik7IjsKKyAgICAgICAgbmwoT3V0KTsKKyAgICAgIH0KKyAgICAgIE91dCA8PCAiQ29uc3RhbnQqICIgPDwgY29uc3ROYW1lIDw8ICIgPSBDb25zdGFudEFycmF5OjpnZXQoIgorICAgICAgICAgIDw8IHR5cGVOYW1lIDw8ICIsICIgPDwgY29uc3ROYW1lIDw8ICJfZWxlbXMpOyI7CisgICAgfQorICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50U3RydWN0ICpDUyA9IGR5bl9jYXN0PENvbnN0YW50U3RydWN0PihDVikpIHsKKyAgICBPdXQgPDwgInN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gIiA8PCBjb25zdE5hbWUgPDwgIl9maWVsZHM7IjsKKyAgICBubChPdXQpOworICAgIHVuc2lnbmVkIE4gPSBDUy0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICBwcmludENvbnN0YW50KENTLT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIE91dCA8PCBjb25zdE5hbWUgPDwgIl9maWVsZHMucHVzaF9iYWNrKCIKKyAgICAgICAgICA8PCBnZXRDcHBOYW1lKENTLT5nZXRPcGVyYW5kKGkpKSA8PCAiKTsiOworICAgICAgbmwoT3V0KTsKKyAgICB9CisgICAgT3V0IDw8ICJDb25zdGFudCogIiA8PCBjb25zdE5hbWUgPDwgIiA9IENvbnN0YW50U3RydWN0OjpnZXQoIgorICAgICAgICA8PCB0eXBlTmFtZSA8PCAiLCAiIDw8IGNvbnN0TmFtZSA8PCAiX2ZpZWxkcyk7IjsKKyAgfSBlbHNlIGlmIChjb25zdCBDb25zdGFudFZlY3RvciAqQ1AgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oQ1YpKSB7CisgICAgT3V0IDw8ICJzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICIgPDwgY29uc3ROYW1lIDw8ICJfZWxlbXM7IjsKKyAgICBubChPdXQpOworICAgIHVuc2lnbmVkIE4gPSBDUC0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICBwcmludENvbnN0YW50KENQLT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIE91dCA8PCBjb25zdE5hbWUgPDwgIl9lbGVtcy5wdXNoX2JhY2soIgorICAgICAgICAgIDw8IGdldENwcE5hbWUoQ1AtPmdldE9wZXJhbmQoaSkpIDw8ICIpOyI7CisgICAgICBubChPdXQpOworICAgIH0KKyAgICBPdXQgPDwgIkNvbnN0YW50KiAiIDw8IGNvbnN0TmFtZSA8PCAiID0gQ29uc3RhbnRWZWN0b3I6OmdldCgiCisgICAgICAgIDw8IHR5cGVOYW1lIDw8ICIsICIgPDwgY29uc3ROYW1lIDw8ICJfZWxlbXMpOyI7CisgIH0gZWxzZSBpZiAoaXNhPFVuZGVmVmFsdWU+KENWKSkgeworICAgIE91dCA8PCAiVW5kZWZWYWx1ZSogIiA8PCBjb25zdE5hbWUgPDwgIiA9IFVuZGVmVmFsdWU6OmdldCgiCisgICAgICAgIDw8IHR5cGVOYW1lIDw8ICIpOyI7CisgIH0gZWxzZSBpZiAoY29uc3QgQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oQ1YpKSB7CisgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cikgeworICAgICAgT3V0IDw8ICJzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICIgPDwgY29uc3ROYW1lIDw8ICJfaW5kaWNlczsiOworICAgICAgbmwoT3V0KTsKKyAgICAgIHByaW50Q29uc3RhbnQoQ0UtPmdldE9wZXJhbmQoMCkpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IENFLT5nZXROdW1PcGVyYW5kcygpOyArK2kgKSB7CisgICAgICAgIHByaW50Q29uc3RhbnQoQ0UtPmdldE9wZXJhbmQoaSkpOworICAgICAgICBPdXQgPDwgY29uc3ROYW1lIDw8ICJfaW5kaWNlcy5wdXNoX2JhY2soIgorICAgICAgICAgICAgPDwgZ2V0Q3BwTmFtZShDRS0+Z2V0T3BlcmFuZChpKSkgPDwgIik7IjsKKyAgICAgICAgbmwoT3V0KTsKKyAgICAgIH0KKyAgICAgIE91dCA8PCAiQ29uc3RhbnQqICIgPDwgY29uc3ROYW1lCisgICAgICAgICAgPDwgIiA9IENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cigiCisgICAgICAgICAgPDwgZ2V0Q3BwTmFtZShDRS0+Z2V0T3BlcmFuZCgwKSkgPDwgIiwgIgorICAgICAgICAgIDw8ICImIiA8PCBjb25zdE5hbWUgPDwgIl9pbmRpY2VzWzBdLCAiCisgICAgICAgICAgPDwgY29uc3ROYW1lIDw8ICJfaW5kaWNlcy5zaXplKCkiCisgICAgICAgICAgPDwgIik7IjsKKyAgICB9IGVsc2UgaWYgKENFLT5pc0Nhc3QoKSkgeworICAgICAgcHJpbnRDb25zdGFudChDRS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICBPdXQgPDwgIkNvbnN0YW50KiAiIDw8IGNvbnN0TmFtZSA8PCAiID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KCI7CisgICAgICBzd2l0Y2ggKENFLT5nZXRPcGNvZGUoKSkgeworICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBjYXN0IG9wY29kZSIpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6IE91dCA8PCAiSW5zdHJ1Y3Rpb246OlRydW5jIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OiAgT3V0IDw8ICJJbnN0cnVjdGlvbjo6WkV4dCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDogIE91dCA8PCAiSW5zdHJ1Y3Rpb246OlNFeHQiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVHJ1bmM6ICBPdXQgPDwgIkluc3RydWN0aW9uOjpGUFRydW5jIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpGUEV4dDogIE91dCA8PCAiSW5zdHJ1Y3Rpb246OkZQRXh0IjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpGUFRvVUk6ICBPdXQgPDwgIkluc3RydWN0aW9uOjpGUFRvVUkiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSTogIE91dCA8PCAiSW5zdHJ1Y3Rpb246OkZQVG9TSSI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6VUlUb0ZQOiAgT3V0IDw8ICJJbnN0cnVjdGlvbjo6VUlUb0ZQIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTSVRvRlA6ICBPdXQgPDwgIkluc3RydWN0aW9uOjpTSVRvRlAiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OiAgT3V0IDw8ICJJbnN0cnVjdGlvbjo6UHRyVG9JbnQiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOiAgT3V0IDw8ICJJbnN0cnVjdGlvbjo6SW50VG9QdHIiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6ICBPdXQgPDwgIkluc3RydWN0aW9uOjpCaXRDYXN0IjsgYnJlYWs7CisgICAgICB9CisgICAgICBPdXQgPDwgIiwgIiA8PCBnZXRDcHBOYW1lKENFLT5nZXRPcGVyYW5kKDApKSA8PCAiLCAiCisgICAgICAgICAgPDwgZ2V0Q3BwTmFtZShDRS0+Z2V0VHlwZSgpKSA8PCAiKTsiOworICAgIH0gZWxzZSB7CisgICAgICB1bnNpZ25lZCBOID0gQ0UtPmdldE51bU9wZXJhbmRzKCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTjsgKytpICkgeworICAgICAgICBwcmludENvbnN0YW50KENFLT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIH0KKyAgICAgIE91dCA8PCAiQ29uc3RhbnQqICIgPDwgY29uc3ROYW1lIDw8ICIgPSBDb25zdGFudEV4cHI6OiI7CisgICAgICBzd2l0Y2ggKENFLT5nZXRPcGNvZGUoKSkgeworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOiAgICBPdXQgPDwgImdldEFkZCgiOyAgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpGQWRkOiAgIE91dCA8PCAiZ2V0RkFkZCgiOyAgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTdWI6ICAgIE91dCA8PCAiZ2V0U3ViKCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlN1YjogICBPdXQgPDwgImdldEZTdWIoIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6ICAgIE91dCA8PCAiZ2V0TXVsKCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6Rk11bDogICBPdXQgPDwgImdldEZNdWwoIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OiAgIE91dCA8PCAiZ2V0VURpdigiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNEaXY6ICAgT3V0IDw8ICJnZXRTRGl2KCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6RkRpdjogICBPdXQgPDwgImdldEZEaXYoIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOiAgIE91dCA8PCAiZ2V0VVJlbSgiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNSZW06ICAgT3V0IDw8ICJnZXRTUmVtKCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlJlbTogICBPdXQgPDwgImdldEZSZW0oIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6ICAgIE91dCA8PCAiZ2V0QW5kKCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6ICAgICBPdXQgPDwgImdldE9yKCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOiAgICBPdXQgPDwgImdldFhvcigiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OklDbXA6CisgICAgICAgIE91dCA8PCAiZ2V0SUNtcChJQ21wSW5zdDo6SUNNUF8iOworICAgICAgICBzd2l0Y2ggKENFLT5nZXRQcmVkaWNhdGUoKSkgeworICAgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiAgT3V0IDw8ICJFUSI7IGJyZWFrOworICAgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiAgT3V0IDw8ICJORSI7IGJyZWFrOworICAgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogT3V0IDw8ICJTTFQiOyBicmVhazsKKyAgICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6IE91dCA8PCAiVUxUIjsgYnJlYWs7CisgICAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiBPdXQgPDwgIlNHVCI7IGJyZWFrOworICAgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDogT3V0IDw8ICJVR1QiOyBicmVhazsKKyAgICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6IE91dCA8PCAiU0xFIjsgYnJlYWs7CisgICAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxFOiBPdXQgPDwgIlVMRSI7IGJyZWFrOworICAgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRTogT3V0IDw8ICJTR0UiOyBicmVhazsKKyAgICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6IE91dCA8PCAiVUdFIjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGVycm9yKCJJbnZhbGlkIElDbXAgUHJlZGljYXRlIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpGQ21wOgorICAgICAgICBPdXQgPDwgImdldEZDbXAoRkNtcEluc3Q6OkZDTVBfIjsKKyAgICAgICAgc3dpdGNoIChDRS0+Z2V0UHJlZGljYXRlKCkpIHsKKyAgICAgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9GQUxTRTogT3V0IDw8ICJGQUxTRSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09SRDogICBPdXQgPDwgIk9SRCI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VOTzogICBPdXQgPDwgIlVOTyI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09FUTogICBPdXQgPDwgIk9FUSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VFUTogICBPdXQgPDwgIlVFUSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09ORTogICBPdXQgPDwgIk9ORSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VORTogICBPdXQgPDwgIlVORSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MVDogICBPdXQgPDwgIk9MVCI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMVDogICBPdXQgPDwgIlVMVCI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HVDogICBPdXQgPDwgIk9HVCI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHVDogICBPdXQgPDwgIlVHVCI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MRTogICBPdXQgPDwgIk9MRSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMRTogICBPdXQgPDwgIlVMRSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRTogICBPdXQgPDwgIk9HRSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHRTogICBPdXQgPDwgIlVHRSI7IGJyZWFrOworICAgICAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1RSVUU6ICBPdXQgPDwgIlRSVUUiOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogZXJyb3IoIkludmFsaWQgRkNtcCBQcmVkaWNhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDogICAgIE91dCA8PCAiZ2V0U2hsKCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjogICAgT3V0IDw8ICJnZXRMU2hyKCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjogICAgT3V0IDw8ICJnZXRBU2hyKCI7IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U2VsZWN0OiAgT3V0IDw8ICJnZXRTZWxlY3QoIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudDogT3V0IDw8ICJnZXRFeHRyYWN0RWxlbWVudCgiOyBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246Okluc2VydEVsZW1lbnQ6ICBPdXQgPDwgImdldEluc2VydEVsZW1lbnQoIjsgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTaHVmZmxlVmVjdG9yOiAgT3V0IDw8ICJnZXRTaHVmZmxlVmVjdG9yKCI7IGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3IoIkludmFsaWQgY29uc3RhbnQgZXhwcmVzc2lvbiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIE91dCA8PCBnZXRDcHBOYW1lKENFLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBDRS0+Z2V0TnVtT3BlcmFuZHMoKTsgKytpKQorICAgICAgICBPdXQgPDwgIiwgIiA8PCBnZXRDcHBOYW1lKENFLT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIE91dCA8PCAiKTsiOworICAgIH0KKyAgfSBlbHNlIGlmIChjb25zdCBCbG9ja0FkZHJlc3MgKkJBID0gZHluX2Nhc3Q8QmxvY2tBZGRyZXNzPihDVikpIHsKKyAgICBPdXQgPDwgIkNvbnN0YW50KiAiIDw8IGNvbnN0TmFtZSA8PCAiID0gIjsKKyAgICBPdXQgPDwgIkJsb2NrQWRkcmVzczo6Z2V0KCIgPDwgZ2V0T3BOYW1lKEJBLT5nZXRCYXNpY0Jsb2NrKCkpIDw8ICIpOyI7CisgIH0gZWxzZSB7CisgICAgZXJyb3IoIkJhZCBDb25zdGFudCIpOworICAgIE91dCA8PCAiQ29uc3RhbnQqICIgPDwgY29uc3ROYW1lIDw8ICIgPSAwOyAiOworICB9CisgIG5sKE91dCk7Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludENvbnN0YW50cyhjb25zdCBNb2R1bGUqIE0pIHsKKyAgLy8gVHJhdmVyc2UgYWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIGxvb2tpbmcgZm9yIGNvbnN0YW50IGluaXRpYWxpemVycworICBmb3IgKE1vZHVsZTo6Y29uc3RfZ2xvYmFsX2l0ZXJhdG9yIEkgPSBUaGVNb2R1bGUtPmdsb2JhbF9iZWdpbigpLAorICAgICAgICAgRSA9IFRoZU1vZHVsZS0+Z2xvYmFsX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoSS0+aGFzSW5pdGlhbGl6ZXIoKSkKKyAgICAgIHByaW50Q29uc3RhbnQoSS0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisKKyAgLy8gVHJhdmVyc2UgdGhlIExMVk0gZnVuY3Rpb25zIGxvb2tpbmcgZm9yIGNvbnN0YW50cworICBmb3IgKE1vZHVsZTo6Y29uc3RfaXRlcmF0b3IgRkkgPSBUaGVNb2R1bGUtPmJlZ2luKCksIEZFID0gVGhlTW9kdWxlLT5lbmQoKTsKKyAgICAgICBGSSAhPSBGRTsgKytGSSkgeworICAgIC8vIEFkZCBhbGwgb2YgdGhlIGJhc2ljIGJsb2NrcyBhbmQgaW5zdHJ1Y3Rpb25zCisgICAgZm9yIChGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IgQkIgPSBGSS0+YmVnaW4oKSwKKyAgICAgICAgICAgRSA9IEZJLT5lbmQoKTsgQkIgIT0gRTsgKytCQikgeworICAgICAgZm9yIChCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7IEkhPUU7CisgICAgICAgICAgICsrSSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgSS0+Z2V0TnVtT3BlcmFuZHMoKTsgKytpKSB7CisgICAgICAgICAgaWYgKENvbnN0YW50KiBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEktPmdldE9wZXJhbmQoaSkpKSB7CisgICAgICAgICAgICBwcmludENvbnN0YW50KEMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIENwcFdyaXRlcjo6cHJpbnRWYXJpYWJsZVVzZXMoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKSB7CisgIG5sKE91dCkgPDwgIi8vIFR5cGUgRGVmaW5pdGlvbnMiOworICBubChPdXQpOworICBwcmludFR5cGUoR1YtPmdldFR5cGUoKSk7CisgIGlmIChHVi0+aGFzSW5pdGlhbGl6ZXIoKSkgeworICAgIENvbnN0YW50ICpJbml0ID0gR1YtPmdldEluaXRpYWxpemVyKCk7CisgICAgcHJpbnRUeXBlKEluaXQtPmdldFR5cGUoKSk7CisgICAgaWYgKEZ1bmN0aW9uICpGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KEluaXQpKSB7CisgICAgICBubChPdXQpPDwgIi8gRnVuY3Rpb24gRGVjbGFyYXRpb25zIjsgbmwoT3V0KTsKKyAgICAgIHByaW50RnVuY3Rpb25IZWFkKEYpOworICAgIH0gZWxzZSBpZiAoR2xvYmFsVmFyaWFibGUqIGd2ID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KEluaXQpKSB7CisgICAgICBubChPdXQpIDw8ICIvLyBHbG9iYWwgVmFyaWFibGUgRGVjbGFyYXRpb25zIjsgbmwoT3V0KTsKKyAgICAgIHByaW50VmFyaWFibGVIZWFkKGd2KTsKKyAgICAgIAorICAgICAgbmwoT3V0KSA8PCAiLy8gR2xvYmFsIFZhcmlhYmxlIERlZmluaXRpb25zIjsgbmwoT3V0KTsKKyAgICAgIHByaW50VmFyaWFibGVCb2R5KGd2KTsKKyAgICB9IGVsc2UgIHsKKyAgICAgIG5sKE91dCkgPDwgIi8vIENvbnN0YW50IERlZmluaXRpb25zIjsgbmwoT3V0KTsKKyAgICAgIHByaW50Q29uc3RhbnQoSW5pdCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludFZhcmlhYmxlSGVhZChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIHsKKyAgbmwoT3V0KSA8PCAiR2xvYmFsVmFyaWFibGUqICIgPDwgZ2V0Q3BwTmFtZShHVik7CisgIGlmIChpc19pbmxpbmUpIHsKKyAgICBPdXQgPDwgIiA9IG1vZC0+Z2V0R2xvYmFsVmFyaWFibGUobW9kLT5nZXRDb250ZXh0KCksICI7CisgICAgcHJpbnRFc2NhcGVkU3RyaW5nKEdWLT5nZXROYW1lKCkpOworICAgIE91dCA8PCAiLCAiIDw8IGdldENwcE5hbWUoR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSkgPDwgIix0cnVlKSI7CisgICAgbmwoT3V0KSA8PCAiaWYgKCEiIDw8IGdldENwcE5hbWUoR1YpIDw8ICIpIHsiOworICAgIGluKCk7IG5sKE91dCkgPDwgZ2V0Q3BwTmFtZShHVik7CisgIH0KKyAgT3V0IDw8ICIgPSBuZXcgR2xvYmFsVmFyaWFibGUoLypNb2R1bGU9Ki8qbW9kLCAiOworICBubChPdXQpIDw8ICIvKlR5cGU9Ki8iOworICBwcmludENwcE5hbWUoR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIE91dCA8PCAiLCI7CisgIG5sKE91dCkgPDwgIi8qaXNDb25zdGFudD0qLyIgPDwgKEdWLT5pc0NvbnN0YW50KCk/InRydWUiOiJmYWxzZSIpOworICBPdXQgPDwgIiwiOworICBubChPdXQpIDw8ICIvKkxpbmthZ2U9Ki8iOworICBwcmludExpbmthZ2VUeXBlKEdWLT5nZXRMaW5rYWdlKCkpOworICBPdXQgPDwgIiwiOworICBubChPdXQpIDw8ICIvKkluaXRpYWxpemVyPSovMCwgIjsKKyAgaWYgKEdWLT5oYXNJbml0aWFsaXplcigpKSB7CisgICAgT3V0IDw8ICIvLyBoYXMgaW5pdGlhbGl6ZXIsIHNwZWNpZmllZCBiZWxvdyI7CisgIH0KKyAgbmwoT3V0KSA8PCAiLypOYW1lPSovXCIiOworICBwcmludEVzY2FwZWRTdHJpbmcoR1YtPmdldE5hbWUoKSk7CisgIE91dCA8PCAiXCIpOyI7CisgIG5sKE91dCk7CisKKyAgaWYgKEdWLT5oYXNTZWN0aW9uKCkpIHsKKyAgICBwcmludENwcE5hbWUoR1YpOworICAgIE91dCA8PCAiLT5zZXRTZWN0aW9uKFwiIjsKKyAgICBwcmludEVzY2FwZWRTdHJpbmcoR1YtPmdldFNlY3Rpb24oKSk7CisgICAgT3V0IDw8ICJcIik7IjsKKyAgICBubChPdXQpOworICB9CisgIGlmIChHVi0+Z2V0QWxpZ25tZW50KCkpIHsKKyAgICBwcmludENwcE5hbWUoR1YpOworICAgIE91dCA8PCAiLT5zZXRBbGlnbm1lbnQoIiA8PCB1dG9zdHIoR1YtPmdldEFsaWdubWVudCgpKSA8PCAiKTsiOworICAgIG5sKE91dCk7CisgIH0KKyAgaWYgKEdWLT5nZXRWaXNpYmlsaXR5KCkgIT0gR2xvYmFsVmFsdWU6OkRlZmF1bHRWaXNpYmlsaXR5KSB7CisgICAgcHJpbnRDcHBOYW1lKEdWKTsKKyAgICBPdXQgPDwgIi0+c2V0VmlzaWJpbGl0eSgiOworICAgIHByaW50VmlzaWJpbGl0eVR5cGUoR1YtPmdldFZpc2liaWxpdHkoKSk7CisgICAgT3V0IDw8ICIpOyI7CisgICAgbmwoT3V0KTsKKyAgfQorICBpZiAoR1YtPmlzVGhyZWFkTG9jYWwoKSkgeworICAgIHByaW50Q3BwTmFtZShHVik7CisgICAgT3V0IDw8ICItPnNldFRocmVhZExvY2FsKHRydWUpOyI7CisgICAgbmwoT3V0KTsKKyAgfQorICBpZiAoaXNfaW5saW5lKSB7CisgICAgb3V0KCk7IE91dCA8PCAifSI7IG5sKE91dCk7CisgIH0KK30KKwordm9pZCBDcHBXcml0ZXI6OnByaW50VmFyaWFibGVCb2R5KGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgeworICBpZiAoR1YtPmhhc0luaXRpYWxpemVyKCkpIHsKKyAgICBwcmludENwcE5hbWUoR1YpOworICAgIE91dCA8PCAiLT5zZXRJbml0aWFsaXplcigiOworICAgIE91dCA8PCBnZXRDcHBOYW1lKEdWLT5nZXRJbml0aWFsaXplcigpKSA8PCAiKTsiOworICAgIG5sKE91dCk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgQ3BwV3JpdGVyOjpnZXRPcE5hbWUoVmFsdWUqIFYpIHsKKyAgaWYgKCFpc2E8SW5zdHJ1Y3Rpb24+KFYpIHx8IERlZmluZWRWYWx1ZXMuZmluZChWKSAhPSBEZWZpbmVkVmFsdWVzLmVuZCgpKQorICAgIHJldHVybiBnZXRDcHBOYW1lKFYpOworCisgIC8vIFNlZSBpZiBpdHMgYWxyZWFkIGluIHRoZSBtYXAgb2YgZm9yd2FyZCByZWZlcmVuY2VzLCBpZiBzbyBqdXN0IHJldHVybiB0aGUKKyAgLy8gbmFtZSB3ZSBhbHJlYWR5IHNldCB1cCBmb3IgaXQKKyAgRm9yd2FyZFJlZk1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IEZvcndhcmRSZWZzLmZpbmQoVik7CisgIGlmIChJICE9IEZvcndhcmRSZWZzLmVuZCgpKQorICAgIHJldHVybiBJLT5zZWNvbmQ7CisKKyAgLy8gVGhpcyBpcyBhIG5ldyBmb3J3YXJkIHJlZmVyZW5jZS4gR2VuZXJhdGUgYSB1bmlxdWUgbmFtZSBmb3IgaXQKKyAgc3RkOjpzdHJpbmcgcmVzdWx0KHN0ZDo6c3RyaW5nKCJmd2RyZWZfIikgKyB1dG9zdHIodW5pcXVlTnVtKyspKTsKKworICAvLyBZZXMsIHRoaXMgaXMgYSBoYWNrLiBBbiBBcmd1bWVudCBpcyB0aGUgc21hbGxlc3QgaW5zdGFudGlhYmxlIHZhbHVlIHRoYXQKKyAgLy8gd2UgY2FuIG1ha2UgYXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIHJlYWwgdmFsdWUuIFdlJ2xsIHJlcGxhY2UgdGhlc2UKKyAgLy8gQXJndW1lbnQgaW5zdGFuY2VzIGxhdGVyLgorICBPdXQgPDwgIkFyZ3VtZW50KiAiIDw8IHJlc3VsdCA8PCAiID0gbmV3IEFyZ3VtZW50KCIKKyAgICAgIDw8IGdldENwcE5hbWUoVi0+Z2V0VHlwZSgpKSA8PCAiKTsiOworICBubChPdXQpOworICBGb3J3YXJkUmVmc1tWXSA9IHJlc3VsdDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gcHJpbnRJbnN0cnVjdGlvbiAtIFRoaXMgbWVtYmVyIGlzIGNhbGxlZCBmb3IgZWFjaCBJbnN0cnVjdGlvbiBpbiBhIGZ1bmN0aW9uLgordm9pZCBDcHBXcml0ZXI6OnByaW50SW5zdHJ1Y3Rpb24oY29uc3QgSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmJuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIGlOYW1lKGdldENwcE5hbWUoSSkpOworCisgIC8vIEJlZm9yZSB3ZSBlbWl0IHRoaXMgaW5zdHJ1Y3Rpb24sIHdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIGdlbmVyYXRpbmcgYW55CisgIC8vIGZvcndhcmQgcmVmZXJlbmNlcy4gU28sIHdlIGdldCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBvcGVyYW5kcyBpbiBhZHZhbmNlCisgIGNvbnN0IHVuc2lnbmVkIE9wcyhJLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgc3RkOjpzdHJpbmcqIG9wTmFtZXMgPSBuZXcgc3RkOjpzdHJpbmdbT3BzXTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE9wczsgaSsrKQorICAgIG9wTmFtZXNbaV0gPSBnZXRPcE5hbWUoSS0+Z2V0T3BlcmFuZChpKSk7CisKKyAgc3dpdGNoIChJLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIGVycm9yKCJJbnZhbGlkIGluc3RydWN0aW9uIik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBJbnN0cnVjdGlvbjo6UmV0OiB7CisgICAgY29uc3QgUmV0dXJuSW5zdCogcmV0ID0gIGNhc3Q8UmV0dXJuSW5zdD4oSSk7CisgICAgT3V0IDw8ICJSZXR1cm5JbnN0OjpDcmVhdGUobW9kLT5nZXRDb250ZXh0KCksICIKKyAgICAgICAgPDwgKHJldC0+Z2V0UmV0dXJuVmFsdWUoKSA/IG9wTmFtZXNbMF0gKyAiLCAiIDogIiIpIDw8IGJibmFtZSA8PCAiKTsiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJyOiB7CisgICAgY29uc3QgQnJhbmNoSW5zdCogYnIgPSBjYXN0PEJyYW5jaEluc3Q+KEkpOworICAgIE91dCA8PCAiQnJhbmNoSW5zdDo6Q3JlYXRlKCIgOworICAgIGlmIChici0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAzKSB7CisgICAgICBPdXQgPDwgb3BOYW1lc1syXSA8PCAiLCAiCisgICAgICAgICAgPDwgb3BOYW1lc1sxXSA8PCAiLCAiCisgICAgICAgICAgPDwgb3BOYW1lc1swXSA8PCAiLCAiOworCisgICAgfSBlbHNlIGlmIChici0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAxKSB7CisgICAgICBPdXQgPDwgb3BOYW1lc1swXSA8PCAiLCAiOworICAgIH0gZWxzZSB7CisgICAgICBlcnJvcigiQnJhbmNoIHdpdGggMiBvcGVyYW5kcz8iKTsKKyAgICB9CisgICAgT3V0IDw8IGJibmFtZSA8PCAiKTsiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN3aXRjaDogeworICAgIGNvbnN0IFN3aXRjaEluc3QgKlNJID0gY2FzdDxTd2l0Y2hJbnN0PihJKTsKKyAgICBPdXQgPDwgIlN3aXRjaEluc3QqICIgPDwgaU5hbWUgPDwgIiA9IFN3aXRjaEluc3Q6OkNyZWF0ZSgiCisgICAgICAgIDw8IG9wTmFtZXNbMF0gPDwgIiwgIgorICAgICAgICA8PCBvcE5hbWVzWzFdIDw8ICIsICIKKyAgICAgICAgPDwgU0ktPmdldE51bUNhc2VzKCkgPDwgIiwgIiA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBubChPdXQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDI7IGkgIT0gU0ktPmdldE51bU9wZXJhbmRzKCk7IGkgKz0gMikgeworICAgICAgT3V0IDw8IGlOYW1lIDw8ICItPmFkZENhc2UoIgorICAgICAgICAgIDw8IG9wTmFtZXNbaV0gPDwgIiwgIgorICAgICAgICAgIDw8IG9wTmFtZXNbaSsxXSA8PCAiKTsiOworICAgICAgbmwoT3V0KTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6SW5kaXJlY3RCcjogeworICAgIGNvbnN0IEluZGlyZWN0QnJJbnN0ICpJQkkgPSBjYXN0PEluZGlyZWN0QnJJbnN0PihJKTsKKyAgICBPdXQgPDwgIkluZGlyZWN0QnJJbnN0ICoiIDw8IGlOYW1lIDw8ICIgPSBJbmRpcmVjdEJySW5zdDo6Q3JlYXRlKCIKKyAgICAgICAgPDwgb3BOYW1lc1swXSA8PCAiLCAiIDw8IElCSS0+Z2V0TnVtRGVzdGluYXRpb25zKCkgPDwgIik7IjsKKyAgICBubChPdXQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgIT0gSUJJLT5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICAgIE91dCA8PCBpTmFtZSA8PCAiLT5hZGREZXN0aW5hdGlvbigiIDw8IG9wTmFtZXNbaV0gPDwgIik7IjsKKyAgICAgIG5sKE91dCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246Okludm9rZTogeworICAgIGNvbnN0IEludm9rZUluc3QqIGludiA9IGNhc3Q8SW52b2tlSW5zdD4oSSk7CisgICAgT3V0IDw8ICJzdGQ6OnZlY3RvcjxWYWx1ZSo+ICIgPDwgaU5hbWUgPDwgIl9wYXJhbXM7IjsKKyAgICBubChPdXQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpbnYtPmdldE51bUFyZ09wZXJhbmRzKCk7ICsraSkgeworICAgICAgT3V0IDw8IGlOYW1lIDw8ICJfcGFyYW1zLnB1c2hfYmFjaygiCisgICAgICAgICAgPDwgZ2V0T3BOYW1lKGludi0+Z2V0QXJnT3BlcmFuZChpKSkgPDwgIik7IjsKKyAgICAgIG5sKE91dCk7CisgICAgfQorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZG4ndCB1c2UgbWFnaWMgbnVtYmVycyAtMywgLTIsIGFuZCAtMS4KKyAgICBPdXQgPDwgIkludm9rZUluc3QgKiIgPDwgaU5hbWUgPDwgIiA9IEludm9rZUluc3Q6OkNyZWF0ZSgiCisgICAgICAgIDw8IGdldE9wTmFtZShpbnYtPmdldENhbGxlZEZ1bmN0aW9uKCkpIDw8ICIsICIKKyAgICAgICAgPDwgZ2V0T3BOYW1lKGludi0+Z2V0Tm9ybWFsRGVzdCgpKSA8PCAiLCAiCisgICAgICAgIDw8IGdldE9wTmFtZShpbnYtPmdldFVud2luZERlc3QoKSkgPDwgIiwgIgorICAgICAgICA8PCBpTmFtZSA8PCAiX3BhcmFtcy5iZWdpbigpLCAiCisgICAgICAgIDw8IGlOYW1lIDw8ICJfcGFyYW1zLmVuZCgpLCBcIiI7CisgICAgcHJpbnRFc2NhcGVkU3RyaW5nKGludi0+Z2V0TmFtZSgpKTsKKyAgICBPdXQgPDwgIlwiLCAiIDw8IGJibmFtZSA8PCAiKTsiOworICAgIG5sKE91dCkgPDwgaU5hbWUgPDwgIi0+c2V0Q2FsbGluZ0NvbnYoIjsKKyAgICBwcmludENhbGxpbmdDb252KGludi0+Z2V0Q2FsbGluZ0NvbnYoKSk7CisgICAgT3V0IDw8ICIpOyI7CisgICAgcHJpbnRBdHRyaWJ1dGVzKGludi0+Z2V0QXR0cmlidXRlcygpLCBpTmFtZSk7CisgICAgT3V0IDw8IGlOYW1lIDw8ICItPnNldEF0dHJpYnV0ZXMoIiA8PCBpTmFtZSA8PCAiX1BBTCk7IjsKKyAgICBubChPdXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVud2luZDogeworICAgIE91dCA8PCAibmV3IFVud2luZEluc3QoIgorICAgICAgICA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpVbnJlYWNoYWJsZTogeworICAgIE91dCA8PCAibmV3IFVucmVhY2hhYmxlSW5zdCgiCisgICAgICAgIDw8ICJtb2QtPmdldENvbnRleHQoKSwgIgorICAgICAgICA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlN1YjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICBjYXNlIEluc3RydWN0aW9uOjpGTXVsOgorICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICBjYXNlIEluc3RydWN0aW9uOjpGRGl2OgorICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOgorICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOgorICBjYXNlIEluc3RydWN0aW9uOjpGUmVtOgorICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjp7CisgICAgT3V0IDw8ICJCaW5hcnlPcGVyYXRvciogIiA8PCBpTmFtZSA8PCAiID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZSgiOworICAgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6IE91dCA8PCAiSW5zdHJ1Y3Rpb246OkFkZCI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6IE91dCA8PCAiSW5zdHJ1Y3Rpb246OkZBZGQiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTdWI6IE91dCA8PCAiSW5zdHJ1Y3Rpb246OlN1YiI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZTdWI6IE91dCA8PCAiSW5zdHJ1Y3Rpb246OkZTdWIiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6IE91dCA8PCAiSW5zdHJ1Y3Rpb246Ok11bCI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZNdWw6IE91dCA8PCAiSW5zdHJ1Y3Rpb246OkZNdWwiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVRGl2Ok91dCA8PCAiSW5zdHJ1Y3Rpb246OlVEaXYiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRGl2Ok91dCA8PCAiSW5zdHJ1Y3Rpb246OlNEaXYiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGRGl2Ok91dCA8PCAiSW5zdHJ1Y3Rpb246OkZEaXYiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOk91dCA8PCAiSW5zdHJ1Y3Rpb246OlVSZW0iOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOk91dCA8PCAiSW5zdHJ1Y3Rpb246OlNSZW0iOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUmVtOk91dCA8PCAiSW5zdHJ1Y3Rpb246OkZSZW0iOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6IE91dCA8PCAiSW5zdHJ1Y3Rpb246OkFuZCI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOiAgT3V0IDw8ICJJbnN0cnVjdGlvbjo6T3IiOyAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOiBPdXQgPDwgIkluc3RydWN0aW9uOjpYb3IiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTaGw6IE91dCA8PCAiSW5zdHJ1Y3Rpb246OlNobCI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6T3V0IDw8ICJJbnN0cnVjdGlvbjo6TFNociI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6T3V0IDw8ICJJbnN0cnVjdGlvbjo6QVNociI7IGJyZWFrOworICAgIGRlZmF1bHQ6IE91dCA8PCAiSW5zdHJ1Y3Rpb246OkJhZE9wQ29kZSI7IGJyZWFrOworICAgIH0KKyAgICBPdXQgPDwgIiwgIiA8PCBvcE5hbWVzWzBdIDw8ICIsICIgPDwgb3BOYW1lc1sxXSA8PCAiLCBcIiI7CisgICAgcHJpbnRFc2NhcGVkU3RyaW5nKEktPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIiwgIiA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpGQ21wOiB7CisgICAgT3V0IDw8ICJGQ21wSW5zdCogIiA8PCBpTmFtZSA8PCAiID0gbmV3IEZDbXBJbnN0KCoiIDw8IGJibmFtZSA8PCAiLCAiOworICAgIHN3aXRjaCAoY2FzdDxGQ21wSW5zdD4oSSktPmdldFByZWRpY2F0ZSgpKSB7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9GQUxTRTogT3V0IDw8ICJGQ21wSW5zdDo6RkNNUF9GQUxTRSI7IGJyZWFrOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0VRICA6IE91dCA8PCAiRkNtcEluc3Q6OkZDTVBfT0VRIjsgYnJlYWs7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PR1QgIDogT3V0IDw8ICJGQ21wSW5zdDo6RkNNUF9PR1QiOyBicmVhazsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRSAgOiBPdXQgPDwgIkZDbXBJbnN0OjpGQ01QX09HRSI7IGJyZWFrOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xUICA6IE91dCA8PCAiRkNtcEluc3Q6OkZDTVBfT0xUIjsgYnJlYWs7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTEUgIDogT3V0IDw8ICJGQ21wSW5zdDo6RkNNUF9PTEUiOyBicmVhazsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09ORSAgOiBPdXQgPDwgIkZDbXBJbnN0OjpGQ01QX09ORSI7IGJyZWFrOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT1JEICA6IE91dCA8PCAiRkNtcEluc3Q6OkZDTVBfT1JEIjsgYnJlYWs7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTk8gIDogT3V0IDw8ICJGQ21wSW5zdDo6RkNNUF9VTk8iOyBicmVhazsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VFUSAgOiBPdXQgPDwgIkZDbXBJbnN0OjpGQ01QX1VFUSI7IGJyZWFrOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdUICA6IE91dCA8PCAiRkNtcEluc3Q6OkZDTVBfVUdUIjsgYnJlYWs7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VR0UgIDogT3V0IDw8ICJGQ21wSW5zdDo6RkNNUF9VR0UiOyBicmVhazsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMVCAgOiBPdXQgPDwgIkZDbXBJbnN0OjpGQ01QX1VMVCI7IGJyZWFrOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxFICA6IE91dCA8PCAiRkNtcEluc3Q6OkZDTVBfVUxFIjsgYnJlYWs7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTkUgIDogT3V0IDw8ICJGQ21wSW5zdDo6RkNNUF9VTkUiOyBicmVhazsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1RSVUUgOiBPdXQgPDwgIkZDbXBJbnN0OjpGQ01QX1RSVUUiOyBicmVhazsKKyAgICBkZWZhdWx0OiBPdXQgPDwgIkZDbXBJbnN0OjpCQURfSUNNUF9QUkVESUNBVEUiOyBicmVhazsKKyAgICB9CisgICAgT3V0IDw8ICIsICIgPDwgb3BOYW1lc1swXSA8PCAiLCAiIDw8IG9wTmFtZXNbMV0gPDwgIiwgXCIiOworICAgIHByaW50RXNjYXBlZFN0cmluZyhJLT5nZXROYW1lKCkpOworICAgIE91dCA8PCAiXCIpOyI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6SUNtcDogeworICAgIE91dCA8PCAiSUNtcEluc3QqICIgPDwgaU5hbWUgPDwgIiA9IG5ldyBJQ21wSW5zdCgqIiA8PCBiYm5hbWUgPDwgIiwgIjsKKyAgICBzd2l0Y2ggKGNhc3Q8SUNtcEluc3Q+KEkpLT5nZXRQcmVkaWNhdGUoKSkgeworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6ICBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX0VRIjsgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6ICBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX05FIjsgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxFOiBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX1VMRSI7IGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xFOiBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX1NMRSI7IGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOiBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX1VHRSI7IGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOiBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX1NHRSI7IGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOiBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX1VMVCI7IGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX1NMVCI7IGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX1VHVCI7IGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiBPdXQgPDwgIklDbXBJbnN0OjpJQ01QX1NHVCI7IGJyZWFrOworICAgIGRlZmF1bHQ6IE91dCA8PCAiSUNtcEluc3Q6OkJBRF9JQ01QX1BSRURJQ0FURSI7IGJyZWFrOworICAgIH0KKyAgICBPdXQgPDwgIiwgIiA8PCBvcE5hbWVzWzBdIDw8ICIsICIgPDwgb3BOYW1lc1sxXSA8PCAiLCBcIiI7CisgICAgcHJpbnRFc2NhcGVkU3RyaW5nKEktPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIik7IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpBbGxvY2E6IHsKKyAgICBjb25zdCBBbGxvY2FJbnN0KiBhbGxvY2FJID0gY2FzdDxBbGxvY2FJbnN0PihJKTsKKyAgICBPdXQgPDwgIkFsbG9jYUluc3QqICIgPDwgaU5hbWUgPDwgIiA9IG5ldyBBbGxvY2FJbnN0KCIKKyAgICAgICAgPDwgZ2V0Q3BwTmFtZShhbGxvY2FJLT5nZXRBbGxvY2F0ZWRUeXBlKCkpIDw8ICIsICI7CisgICAgaWYgKGFsbG9jYUktPmlzQXJyYXlBbGxvY2F0aW9uKCkpCisgICAgICBPdXQgPDwgb3BOYW1lc1swXSA8PCAiLCAiOworICAgIE91dCA8PCAiXCIiOworICAgIHByaW50RXNjYXBlZFN0cmluZyhhbGxvY2FJLT5nZXROYW1lKCkpOworICAgIE91dCA8PCAiXCIsICIgPDwgYmJuYW1lIDw8ICIpOyI7CisgICAgaWYgKGFsbG9jYUktPmdldEFsaWdubWVudCgpKQorICAgICAgbmwoT3V0KSA8PCBpTmFtZSA8PCAiLT5zZXRBbGlnbm1lbnQoIgorICAgICAgICAgIDw8IGFsbG9jYUktPmdldEFsaWdubWVudCgpIDw8ICIpOyI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6TG9hZDogeworICAgIGNvbnN0IExvYWRJbnN0KiBsb2FkID0gY2FzdDxMb2FkSW5zdD4oSSk7CisgICAgT3V0IDw8ICJMb2FkSW5zdCogIiA8PCBpTmFtZSA8PCAiID0gbmV3IExvYWRJbnN0KCIKKyAgICAgICAgPDwgb3BOYW1lc1swXSA8PCAiLCBcIiI7CisgICAgcHJpbnRFc2NhcGVkU3RyaW5nKGxvYWQtPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIiwgIiA8PCAobG9hZC0+aXNWb2xhdGlsZSgpID8gInRydWUiIDogImZhbHNlIiApCisgICAgICAgIDw8ICIsICIgPDwgYmJuYW1lIDw8ICIpOyI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3RvcmU6IHsKKyAgICBjb25zdCBTdG9yZUluc3QqIHN0b3JlID0gY2FzdDxTdG9yZUluc3Q+KEkpOworICAgIE91dCA8PCAiIG5ldyBTdG9yZUluc3QoIgorICAgICAgICA8PCBvcE5hbWVzWzBdIDw8ICIsICIKKyAgICAgICAgPDwgb3BOYW1lc1sxXSA8PCAiLCAiCisgICAgICAgIDw8IChzdG9yZS0+aXNWb2xhdGlsZSgpID8gInRydWUiIDogImZhbHNlIikKKyAgICAgICAgPDwgIiwgIiA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOiB7CisgICAgY29uc3QgR2V0RWxlbWVudFB0ckluc3QqIGdlcCA9IGNhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KEkpOworICAgIGlmIChnZXAtPmdldE51bU9wZXJhbmRzKCkgPD0gMikgeworICAgICAgT3V0IDw8ICJHZXRFbGVtZW50UHRySW5zdCogIiA8PCBpTmFtZSA8PCAiID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZSgiCisgICAgICAgICAgPDwgb3BOYW1lc1swXTsKKyAgICAgIGlmIChnZXAtPmdldE51bU9wZXJhbmRzKCkgPT0gMikKKyAgICAgICAgT3V0IDw8ICIsICIgPDwgb3BOYW1lc1sxXTsKKyAgICB9IGVsc2UgeworICAgICAgT3V0IDw8ICJzdGQ6OnZlY3RvcjxWYWx1ZSo+ICIgPDwgaU5hbWUgPDwgIl9pbmRpY2VzOyI7CisgICAgICBubChPdXQpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGdlcC0+Z2V0TnVtT3BlcmFuZHMoKTsgKytpICkgeworICAgICAgICBPdXQgPDwgaU5hbWUgPDwgIl9pbmRpY2VzLnB1c2hfYmFjaygiCisgICAgICAgICAgICA8PCBvcE5hbWVzW2ldIDw8ICIpOyI7CisgICAgICAgIG5sKE91dCk7CisgICAgICB9CisgICAgICBPdXQgPDwgIkluc3RydWN0aW9uKiAiIDw8IGlOYW1lIDw8ICIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKCIKKyAgICAgICAgICA8PCBvcE5hbWVzWzBdIDw8ICIsICIgPDwgaU5hbWUgPDwgIl9pbmRpY2VzLmJlZ2luKCksICIKKyAgICAgICAgICA8PCBpTmFtZSA8PCAiX2luZGljZXMuZW5kKCkiOworICAgIH0KKyAgICBPdXQgPDwgIiwgXCIiOworICAgIHByaW50RXNjYXBlZFN0cmluZyhnZXAtPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIiwgIiA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpQSEk6IHsKKyAgICBjb25zdCBQSElOb2RlKiBwaGkgPSBjYXN0PFBISU5vZGU+KEkpOworCisgICAgT3V0IDw8ICJQSElOb2RlKiAiIDw8IGlOYW1lIDw8ICIgPSBQSElOb2RlOjpDcmVhdGUoIgorICAgICAgICA8PCBnZXRDcHBOYW1lKHBoaS0+Z2V0VHlwZSgpKSA8PCAiLCBcIiI7CisgICAgcHJpbnRFc2NhcGVkU3RyaW5nKHBoaS0+Z2V0TmFtZSgpKTsKKyAgICBPdXQgPDwgIlwiLCAiIDw8IGJibmFtZSA8PCAiKTsiOworICAgIG5sKE91dCkgPDwgaU5hbWUgPDwgIi0+cmVzZXJ2ZU9wZXJhbmRTcGFjZSgiCisgICAgICA8PCBwaGktPmdldE51bUluY29taW5nVmFsdWVzKCkKKyAgICAgICAgPDwgIik7IjsKKyAgICBubChPdXQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwaGktPmdldE51bU9wZXJhbmRzKCk7IGkrPTIpIHsKKyAgICAgIE91dCA8PCBpTmFtZSA8PCAiLT5hZGRJbmNvbWluZygiCisgICAgICAgICAgPDwgb3BOYW1lc1tpXSA8PCAiLCAiIDw8IG9wTmFtZXNbaSsxXSA8PCAiKTsiOworICAgICAgbmwoT3V0KTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlpFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVHJ1bmM6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQRXh0OgorICBjYXNlIEluc3RydWN0aW9uOjpGUFRvVUk6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSToKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VUlUb0ZQOgorICBjYXNlIEluc3RydWN0aW9uOjpTSVRvRlA6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OgorICBjYXNlIEluc3RydWN0aW9uOjpJbnRUb1B0cjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDogeworICAgIGNvbnN0IENhc3RJbnN0KiBjc3QgPSBjYXN0PENhc3RJbnN0PihJKTsKKyAgICBPdXQgPDwgIkNhc3RJbnN0KiAiIDw8IGlOYW1lIDw8ICIgPSBuZXcgIjsKKyAgICBzd2l0Y2ggKEktPmdldE9wY29kZSgpKSB7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6ICAgIE91dCA8PCAiVHJ1bmNJbnN0IjsgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDogICAgIE91dCA8PCAiWkV4dEluc3QiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OiAgICAgT3V0IDw8ICJTRXh0SW5zdCI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVHJ1bmM6ICBPdXQgPDwgIkZQVHJ1bmNJbnN0IjsgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6ICAgIE91dCA8PCAiRlBFeHRJbnN0IjsgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJOiAgIE91dCA8PCAiRlBUb1VJSW5zdCI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSTogICBPdXQgPDwgIkZQVG9TSUluc3QiOyBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVSVRvRlA6ICAgT3V0IDw8ICJVSVRvRlBJbnN0IjsgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOiAgIE91dCA8PCAiU0lUb0ZQSW5zdCI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OiBPdXQgPDwgIlB0clRvSW50SW5zdCI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOiBPdXQgPDwgIkludFRvUHRySW5zdCI7IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6ICBPdXQgPDwgIkJpdENhc3RJbnN0IjsgYnJlYWs7CisgICAgZGVmYXVsdDogYXNzZXJ0KCEiVW5yZWFjaGFibGUiKTsgYnJlYWs7CisgICAgfQorICAgIE91dCA8PCAiKCIgPDwgb3BOYW1lc1swXSA8PCAiLCAiCisgICAgICAgIDw8IGdldENwcE5hbWUoY3N0LT5nZXRUeXBlKCkpIDw8ICIsIFwiIjsKKyAgICBwcmludEVzY2FwZWRTdHJpbmcoY3N0LT5nZXROYW1lKCkpOworICAgIE91dCA8PCAiXCIsICIgPDwgYmJuYW1lIDw8ICIpOyI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6Q2FsbDogeworICAgIGNvbnN0IENhbGxJbnN0KiBjYWxsID0gY2FzdDxDYWxsSW5zdD4oSSk7CisgICAgaWYgKGNvbnN0IElubGluZUFzbSogaWxhID0gZHluX2Nhc3Q8SW5saW5lQXNtPihjYWxsLT5nZXRDYWxsZWRWYWx1ZSgpKSkgeworICAgICAgT3V0IDw8ICJJbmxpbmVBc20qICIgPDwgZ2V0Q3BwTmFtZShpbGEpIDw8ICIgPSBJbmxpbmVBc206OmdldCgiCisgICAgICAgICAgPDwgZ2V0Q3BwTmFtZShpbGEtPmdldEZ1bmN0aW9uVHlwZSgpKSA8PCAiLCBcIiIKKyAgICAgICAgICA8PCBpbGEtPmdldEFzbVN0cmluZygpIDw8ICJcIiwgXCIiCisgICAgICAgICAgPDwgaWxhLT5nZXRDb25zdHJhaW50U3RyaW5nKCkgPDwgIlwiLCIKKyAgICAgICAgICA8PCAoaWxhLT5oYXNTaWRlRWZmZWN0cygpID8gInRydWUiIDogImZhbHNlIikgPDwgIik7IjsKKyAgICAgIG5sKE91dCk7CisgICAgfQorICAgIGlmIChjYWxsLT5nZXROdW1BcmdPcGVyYW5kcygpID4gMSkgeworICAgICAgT3V0IDw8ICJzdGQ6OnZlY3RvcjxWYWx1ZSo+ICIgPDwgaU5hbWUgPDwgIl9wYXJhbXM7IjsKKyAgICAgIG5sKE91dCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2FsbC0+Z2V0TnVtQXJnT3BlcmFuZHMoKTsgKytpKSB7CisgICAgICAgIE91dCA8PCBpTmFtZSA8PCAiX3BhcmFtcy5wdXNoX2JhY2soIiA8PCBvcE5hbWVzW2ldIDw8ICIpOyI7CisgICAgICAgIG5sKE91dCk7CisgICAgICB9CisgICAgICBPdXQgPDwgIkNhbGxJbnN0KiAiIDw8IGlOYW1lIDw8ICIgPSBDYWxsSW5zdDo6Q3JlYXRlKCIKKyAgICAgICAgICA8PCBvcE5hbWVzW2NhbGwtPmdldE51bUFyZ09wZXJhbmRzKCldIDw8ICIsICIKKyAgICAgICAgICA8PCBpTmFtZSA8PCAiX3BhcmFtcy5iZWdpbigpLCAiCisgICAgICAgICAgPDwgaU5hbWUgPDwgIl9wYXJhbXMuZW5kKCksIFwiIjsKKyAgICB9IGVsc2UgaWYgKGNhbGwtPmdldE51bUFyZ09wZXJhbmRzKCkgPT0gMSkgeworICAgICAgT3V0IDw8ICJDYWxsSW5zdCogIiA8PCBpTmFtZSA8PCAiID0gQ2FsbEluc3Q6OkNyZWF0ZSgiCisgICAgICAgICAgPDwgb3BOYW1lc1tjYWxsLT5nZXROdW1BcmdPcGVyYW5kcygpXSA8PCAiLCAiIDw8IG9wTmFtZXNbMF0gPDwgIiwgXCIiOworICAgIH0gZWxzZSB7CisgICAgICBPdXQgPDwgIkNhbGxJbnN0KiAiIDw8IGlOYW1lIDw8ICIgPSBDYWxsSW5zdDo6Q3JlYXRlKCIKKyAgICAgICAgICA8PCBvcE5hbWVzW2NhbGwtPmdldE51bUFyZ09wZXJhbmRzKCldIDw8ICIsIFwiIjsKKyAgICB9CisgICAgcHJpbnRFc2NhcGVkU3RyaW5nKGNhbGwtPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIiwgIiA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBubChPdXQpIDw8IGlOYW1lIDw8ICItPnNldENhbGxpbmdDb252KCI7CisgICAgcHJpbnRDYWxsaW5nQ29udihjYWxsLT5nZXRDYWxsaW5nQ29udigpKTsKKyAgICBPdXQgPDwgIik7IjsKKyAgICBubChPdXQpIDw8IGlOYW1lIDw8ICItPnNldFRhaWxDYWxsKCIKKyAgICAgICAgPDwgKGNhbGwtPmlzVGFpbENhbGwoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIE91dCA8PCAiKTsiOworICAgIG5sKE91dCk7CisgICAgcHJpbnRBdHRyaWJ1dGVzKGNhbGwtPmdldEF0dHJpYnV0ZXMoKSwgaU5hbWUpOworICAgIE91dCA8PCBpTmFtZSA8PCAiLT5zZXRBdHRyaWJ1dGVzKCIgPDwgaU5hbWUgPDwgIl9QQUwpOyI7CisgICAgbmwoT3V0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6IHsKKyAgICBjb25zdCBTZWxlY3RJbnN0KiBzZWwgPSBjYXN0PFNlbGVjdEluc3Q+KEkpOworICAgIE91dCA8PCAiU2VsZWN0SW5zdCogIiA8PCBnZXRDcHBOYW1lKHNlbCkgPDwgIiA9IFNlbGVjdEluc3Q6OkNyZWF0ZSgiOworICAgIE91dCA8PCBvcE5hbWVzWzBdIDw8ICIsICIgPDwgb3BOYW1lc1sxXSA8PCAiLCAiIDw8IG9wTmFtZXNbMl0gPDwgIiwgXCIiOworICAgIHByaW50RXNjYXBlZFN0cmluZyhzZWwtPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIiwgIiA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpVc2VyT3AxOgorICAgIC8vLyBGQUxMIFRIUk9VR0gKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VXNlck9wMjogeworICAgIC8vLyBGSVhNRTogV2hhdCBzaG91bGQgYmUgZG9uZSBoZXJlPworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlZBQXJnOiB7CisgICAgY29uc3QgVkFBcmdJbnN0KiB2YSA9IGNhc3Q8VkFBcmdJbnN0PihJKTsKKyAgICBPdXQgPDwgIlZBQXJnSW5zdCogIiA8PCBnZXRDcHBOYW1lKHZhKSA8PCAiID0gbmV3IFZBQXJnSW5zdCgiCisgICAgICAgIDw8IG9wTmFtZXNbMF0gPDwgIiwgIiA8PCBnZXRDcHBOYW1lKHZhLT5nZXRUeXBlKCkpIDw8ICIsIFwiIjsKKyAgICBwcmludEVzY2FwZWRTdHJpbmcodmEtPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIiwgIiA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudDogeworICAgIGNvbnN0IEV4dHJhY3RFbGVtZW50SW5zdCogZWVpID0gY2FzdDxFeHRyYWN0RWxlbWVudEluc3Q+KEkpOworICAgIE91dCA8PCAiRXh0cmFjdEVsZW1lbnRJbnN0KiAiIDw8IGdldENwcE5hbWUoZWVpKQorICAgICAgICA8PCAiID0gbmV3IEV4dHJhY3RFbGVtZW50SW5zdCgiIDw8IG9wTmFtZXNbMF0KKyAgICAgICAgPDwgIiwgIiA8PCBvcE5hbWVzWzFdIDw8ICIsIFwiIjsKKyAgICBwcmludEVzY2FwZWRTdHJpbmcoZWVpLT5nZXROYW1lKCkpOworICAgIE91dCA8PCAiXCIsICIgPDwgYmJuYW1lIDw8ICIpOyI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6SW5zZXJ0RWxlbWVudDogeworICAgIGNvbnN0IEluc2VydEVsZW1lbnRJbnN0KiBpZWkgPSBjYXN0PEluc2VydEVsZW1lbnRJbnN0PihJKTsKKyAgICBPdXQgPDwgIkluc2VydEVsZW1lbnRJbnN0KiAiIDw8IGdldENwcE5hbWUoaWVpKQorICAgICAgICA8PCAiID0gSW5zZXJ0RWxlbWVudEluc3Q6OkNyZWF0ZSgiIDw8IG9wTmFtZXNbMF0KKyAgICAgICAgPDwgIiwgIiA8PCBvcE5hbWVzWzFdIDw8ICIsICIgPDwgb3BOYW1lc1syXSA8PCAiLCBcIiI7CisgICAgcHJpbnRFc2NhcGVkU3RyaW5nKGllaS0+Z2V0TmFtZSgpKTsKKyAgICBPdXQgPDwgIlwiLCAiIDw8IGJibmFtZSA8PCAiKTsiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNodWZmbGVWZWN0b3I6IHsKKyAgICBjb25zdCBTaHVmZmxlVmVjdG9ySW5zdCogc3ZpID0gY2FzdDxTaHVmZmxlVmVjdG9ySW5zdD4oSSk7CisgICAgT3V0IDw8ICJTaHVmZmxlVmVjdG9ySW5zdCogIiA8PCBnZXRDcHBOYW1lKHN2aSkKKyAgICAgICAgPDwgIiA9IG5ldyBTaHVmZmxlVmVjdG9ySW5zdCgiIDw8IG9wTmFtZXNbMF0KKyAgICAgICAgPDwgIiwgIiA8PCBvcE5hbWVzWzFdIDw8ICIsICIgPDwgb3BOYW1lc1syXSA8PCAiLCBcIiI7CisgICAgcHJpbnRFc2NhcGVkU3RyaW5nKHN2aS0+Z2V0TmFtZSgpKTsKKyAgICBPdXQgPDwgIlwiLCAiIDw8IGJibmFtZSA8PCAiKTsiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkV4dHJhY3RWYWx1ZTogeworICAgIGNvbnN0IEV4dHJhY3RWYWx1ZUluc3QgKmV2aSA9IGNhc3Q8RXh0cmFjdFZhbHVlSW5zdD4oSSk7CisgICAgT3V0IDw8ICJzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gIiA8PCBpTmFtZSA8PCAiX2luZGljZXM7IjsKKyAgICBubChPdXQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBldmktPmdldE51bUluZGljZXMoKTsgKytpKSB7CisgICAgICBPdXQgPDwgaU5hbWUgPDwgIl9pbmRpY2VzLnB1c2hfYmFjaygiCisgICAgICAgICAgPDwgZXZpLT5pZHhfYmVnaW4oKVtpXSA8PCAiKTsiOworICAgICAgbmwoT3V0KTsKKyAgICB9CisgICAgT3V0IDw8ICJFeHRyYWN0VmFsdWVJbnN0KiAiIDw8IGdldENwcE5hbWUoZXZpKQorICAgICAgICA8PCAiID0gRXh0cmFjdFZhbHVlSW5zdDo6Q3JlYXRlKCIgPDwgb3BOYW1lc1swXQorICAgICAgICA8PCAiLCAiCisgICAgICAgIDw8IGlOYW1lIDw8ICJfaW5kaWNlcy5iZWdpbigpLCAiIDw8IGlOYW1lIDw8ICJfaW5kaWNlcy5lbmQoKSwgXCIiOworICAgIHByaW50RXNjYXBlZFN0cmluZyhldmktPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIiwgIiA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpJbnNlcnRWYWx1ZTogeworICAgIGNvbnN0IEluc2VydFZhbHVlSW5zdCAqaXZpID0gY2FzdDxJbnNlcnRWYWx1ZUluc3Q+KEkpOworICAgIE91dCA8PCAic3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICIgPDwgaU5hbWUgPDwgIl9pbmRpY2VzOyI7CisgICAgbmwoT3V0KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXZpLT5nZXROdW1JbmRpY2VzKCk7ICsraSkgeworICAgICAgT3V0IDw8IGlOYW1lIDw8ICJfaW5kaWNlcy5wdXNoX2JhY2soIgorICAgICAgICAgIDw8IGl2aS0+aWR4X2JlZ2luKClbaV0gPDwgIik7IjsKKyAgICAgIG5sKE91dCk7CisgICAgfQorICAgIE91dCA8PCAiSW5zZXJ0VmFsdWVJbnN0KiAiIDw8IGdldENwcE5hbWUoaXZpKQorICAgICAgICA8PCAiID0gSW5zZXJ0VmFsdWVJbnN0OjpDcmVhdGUoIiA8PCBvcE5hbWVzWzBdCisgICAgICAgIDw8ICIsICIgPDwgb3BOYW1lc1sxXSA8PCAiLCAiCisgICAgICAgIDw8IGlOYW1lIDw8ICJfaW5kaWNlcy5iZWdpbigpLCAiIDw8IGlOYW1lIDw8ICJfaW5kaWNlcy5lbmQoKSwgXCIiOworICAgIHByaW50RXNjYXBlZFN0cmluZyhpdmktPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIiwgIiA8PCBiYm5hbWUgPDwgIik7IjsKKyAgICBicmVhazsKKyAgfQorICB9CisgIERlZmluZWRWYWx1ZXMuaW5zZXJ0KEkpOworICBubChPdXQpOworICBkZWxldGUgW10gb3BOYW1lczsKK30KKworLy8gUHJpbnQgb3V0IHRoZSB0eXBlcywgY29uc3RhbnRzIGFuZCBkZWNsYXJhdGlvbnMgbmVlZGVkIGJ5IG9uZSBmdW5jdGlvbgordm9pZCBDcHBXcml0ZXI6OnByaW50RnVuY3Rpb25Vc2VzKGNvbnN0IEZ1bmN0aW9uKiBGKSB7CisgIG5sKE91dCkgPDwgIi8vIFR5cGUgRGVmaW5pdGlvbnMiOyBubChPdXQpOworICBpZiAoIWlzX2lubGluZSkgeworICAgIC8vIFByaW50IHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlCisgICAgcHJpbnRUeXBlKEYtPmdldFJldHVyblR5cGUoKSk7CisKKyAgICAvLyBQcmludCB0aGUgZnVuY3Rpb24ncyBmdW5jdGlvbiB0eXBlCisgICAgcHJpbnRUeXBlKEYtPmdldEZ1bmN0aW9uVHlwZSgpKTsKKworICAgIC8vIFByaW50IHRoZSB0eXBlcyBvZiBlYWNoIG9mIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cworICAgIGZvciAoRnVuY3Rpb246OmNvbnN0X2FyZ19pdGVyYXRvciBBSSA9IEYtPmFyZ19iZWdpbigpLCBBRSA9IEYtPmFyZ19lbmQoKTsKKyAgICAgICAgIEFJICE9IEFFOyArK0FJKSB7CisgICAgICBwcmludFR5cGUoQUktPmdldFR5cGUoKSk7CisgICAgfQorICB9CisKKyAgLy8gUHJpbnQgdHlwZSBkZWZpbml0aW9ucyBmb3IgZXZlcnkgdHlwZSByZWZlcmVuY2VkIGJ5IGFuIGluc3RydWN0aW9uIGFuZAorICAvLyBtYWtlIGEgbm90ZSBvZiBhbnkgZ2xvYmFsIHZhbHVlcyBvciBjb25zdGFudHMgdGhhdCBhcmUgcmVmZXJlbmNlZAorICBTbWFsbFB0clNldDxHbG9iYWxWYWx1ZSosNjQ+IGd2czsKKyAgU21hbGxQdHJTZXQ8Q29uc3RhbnQqLDY0PiBjb25zdHM7CisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEJCID0gRi0+YmVnaW4oKSwgQkUgPSBGLT5lbmQoKTsKKyAgICAgICBCQiAhPSBCRTsgKytCQil7CisgICAgZm9yIChCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgLy8gUHJpbnQgdGhlIHR5cGUgb2YgdGhlIGluc3RydWN0aW9uIGl0c2VsZgorICAgICAgcHJpbnRUeXBlKEktPmdldFR5cGUoKSk7CisKKyAgICAgIC8vIFByaW50IHRoZSB0eXBlIG9mIGVhY2ggb2YgdGhlIGluc3RydWN0aW9uJ3Mgb3BlcmFuZHMKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBJLT5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICAgICAgVmFsdWUqIG9wZXJhbmQgPSBJLT5nZXRPcGVyYW5kKGkpOworICAgICAgICBwcmludFR5cGUob3BlcmFuZC0+Z2V0VHlwZSgpKTsKKworICAgICAgICAvLyBJZiB0aGUgb3BlcmFuZCByZWZlcmVuY2VzIGEgR1ZhbCBvciBDb25zdGFudCwgbWFrZSBhIG5vdGUgb2YgaXQKKyAgICAgICAgaWYgKEdsb2JhbFZhbHVlKiBHViA9IGR5bl9jYXN0PEdsb2JhbFZhbHVlPihvcGVyYW5kKSkgeworICAgICAgICAgIGd2cy5pbnNlcnQoR1YpOworICAgICAgICAgIGlmIChHbG9iYWxWYXJpYWJsZSAqR1ZhciA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihHVikpCisgICAgICAgICAgICBpZiAoR1Zhci0+aGFzSW5pdGlhbGl6ZXIoKSkKKyAgICAgICAgICAgICAgY29uc3RzLmluc2VydChHVmFyLT5nZXRJbml0aWFsaXplcigpKTsKKyAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudCogQyA9IGR5bl9jYXN0PENvbnN0YW50PihvcGVyYW5kKSkKKyAgICAgICAgICBjb25zdHMuaW5zZXJ0KEMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFByaW50IHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIGFueSBmdW5jdGlvbnMgZW5jb3VudGVyZWQKKyAgbmwoT3V0KSA8PCAiLy8gRnVuY3Rpb24gRGVjbGFyYXRpb25zIjsgbmwoT3V0KTsKKyAgZm9yIChTbWFsbFB0clNldDxHbG9iYWxWYWx1ZSosNjQ+OjppdGVyYXRvciBJID0gZ3ZzLmJlZ2luKCksIEUgPSBndnMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoRnVuY3Rpb24qIEZ1biA9IGR5bl9jYXN0PEZ1bmN0aW9uPigqSSkpIHsKKyAgICAgIGlmICghaXNfaW5saW5lIHx8IEZ1biAhPSBGKQorICAgICAgICBwcmludEZ1bmN0aW9uSGVhZChGdW4pOworICAgIH0KKyAgfQorCisgIC8vIFByaW50IHRoZSBnbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIGZvciBhbnkgdmFyaWFibGVzIGVuY291bnRlcmVkCisgIG5sKE91dCkgPDwgIi8vIEdsb2JhbCBWYXJpYWJsZSBEZWNsYXJhdGlvbnMiOyBubChPdXQpOworICBmb3IgKFNtYWxsUHRyU2V0PEdsb2JhbFZhbHVlKiw2ND46Oml0ZXJhdG9yIEkgPSBndnMuYmVnaW4oKSwgRSA9IGd2cy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChHbG9iYWxWYXJpYWJsZSogRiA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPigqSSkpCisgICAgICBwcmludFZhcmlhYmxlSGVhZChGKTsKKyAgfQorCisvLyBQcmludCB0aGUgY29uc3RhbnRzIGZvdW5kCisgIG5sKE91dCkgPDwgIi8vIENvbnN0YW50IERlZmluaXRpb25zIjsgbmwoT3V0KTsKKyAgZm9yIChTbWFsbFB0clNldDxDb25zdGFudCosNjQ+OjppdGVyYXRvciBJID0gY29uc3RzLmJlZ2luKCksCisgICAgICAgICBFID0gY29uc3RzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIHByaW50Q29uc3RhbnQoKkkpOworICB9CisKKyAgLy8gUHJvY2VzcyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBkZWZpbml0aW9ucyBub3cgdGhhdCBhbGwgdGhlIGNvbnN0YW50cyBoYXZlCisgIC8vIGJlZW4gZW1pdHRlZC4gVGhlc2UgZGVmaW5pdGlvbnMganVzdCBjb3VwbGUgdGhlIGd2YXJzIHdpdGggdGhlaXIgY29uc3RhbnQKKyAgLy8gaW5pdGlhbGl6ZXJzLgorICBubChPdXQpIDw8ICIvLyBHbG9iYWwgVmFyaWFibGUgRGVmaW5pdGlvbnMiOyBubChPdXQpOworICBmb3IgKFNtYWxsUHRyU2V0PEdsb2JhbFZhbHVlKiw2ND46Oml0ZXJhdG9yIEkgPSBndnMuYmVnaW4oKSwgRSA9IGd2cy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChHbG9iYWxWYXJpYWJsZSogR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oKkkpKQorICAgICAgcHJpbnRWYXJpYWJsZUJvZHkoR1YpOworICB9Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludEZ1bmN0aW9uSGVhZChjb25zdCBGdW5jdGlvbiogRikgeworICBubChPdXQpIDw8ICJGdW5jdGlvbiogIiA8PCBnZXRDcHBOYW1lKEYpOworICBpZiAoaXNfaW5saW5lKSB7CisgICAgT3V0IDw8ICIgPSBtb2QtPmdldEZ1bmN0aW9uKFwiIjsKKyAgICBwcmludEVzY2FwZWRTdHJpbmcoRi0+Z2V0TmFtZSgpKTsKKyAgICBPdXQgPDwgIlwiLCAiIDw8IGdldENwcE5hbWUoRi0+Z2V0RnVuY3Rpb25UeXBlKCkpIDw8ICIpOyI7CisgICAgbmwoT3V0KSA8PCAiaWYgKCEiIDw8IGdldENwcE5hbWUoRikgPDwgIikgeyI7CisgICAgbmwoT3V0KSA8PCBnZXRDcHBOYW1lKEYpOworICB9CisgIE91dDw8ICIgPSBGdW5jdGlvbjo6Q3JlYXRlKCI7CisgIG5sKE91dCwxKSA8PCAiLypUeXBlPSovIiA8PCBnZXRDcHBOYW1lKEYtPmdldEZ1bmN0aW9uVHlwZSgpKSA8PCAiLCI7CisgIG5sKE91dCkgPDwgIi8qTGlua2FnZT0qLyI7CisgIHByaW50TGlua2FnZVR5cGUoRi0+Z2V0TGlua2FnZSgpKTsKKyAgT3V0IDw8ICIsIjsKKyAgbmwoT3V0KSA8PCAiLypOYW1lPSovXCIiOworICBwcmludEVzY2FwZWRTdHJpbmcoRi0+Z2V0TmFtZSgpKTsKKyAgT3V0IDw8ICJcIiwgbW9kKTsgIiA8PCAoRi0+aXNEZWNsYXJhdGlvbigpPyAiLy8gKGV4dGVybmFsLCBubyBib2R5KSIgOiAiIik7CisgIG5sKE91dCwtMSk7CisgIHByaW50Q3BwTmFtZShGKTsKKyAgT3V0IDw8ICItPnNldENhbGxpbmdDb252KCI7CisgIHByaW50Q2FsbGluZ0NvbnYoRi0+Z2V0Q2FsbGluZ0NvbnYoKSk7CisgIE91dCA8PCAiKTsiOworICBubChPdXQpOworICBpZiAoRi0+aGFzU2VjdGlvbigpKSB7CisgICAgcHJpbnRDcHBOYW1lKEYpOworICAgIE91dCA8PCAiLT5zZXRTZWN0aW9uKFwiIiA8PCBGLT5nZXRTZWN0aW9uKCkgPDwgIlwiKTsiOworICAgIG5sKE91dCk7CisgIH0KKyAgaWYgKEYtPmdldEFsaWdubWVudCgpKSB7CisgICAgcHJpbnRDcHBOYW1lKEYpOworICAgIE91dCA8PCAiLT5zZXRBbGlnbm1lbnQoIiA8PCBGLT5nZXRBbGlnbm1lbnQoKSA8PCAiKTsiOworICAgIG5sKE91dCk7CisgIH0KKyAgaWYgKEYtPmdldFZpc2liaWxpdHkoKSAhPSBHbG9iYWxWYWx1ZTo6RGVmYXVsdFZpc2liaWxpdHkpIHsKKyAgICBwcmludENwcE5hbWUoRik7CisgICAgT3V0IDw8ICItPnNldFZpc2liaWxpdHkoIjsKKyAgICBwcmludFZpc2liaWxpdHlUeXBlKEYtPmdldFZpc2liaWxpdHkoKSk7CisgICAgT3V0IDw8ICIpOyI7CisgICAgbmwoT3V0KTsKKyAgfQorICBpZiAoRi0+aGFzR0MoKSkgeworICAgIHByaW50Q3BwTmFtZShGKTsKKyAgICBPdXQgPDwgIi0+c2V0R0MoXCIiIDw8IEYtPmdldEdDKCkgPDwgIlwiKTsiOworICAgIG5sKE91dCk7CisgIH0KKyAgaWYgKGlzX2lubGluZSkgeworICAgIE91dCA8PCAifSI7CisgICAgbmwoT3V0KTsKKyAgfQorICBwcmludEF0dHJpYnV0ZXMoRi0+Z2V0QXR0cmlidXRlcygpLCBnZXRDcHBOYW1lKEYpKTsKKyAgcHJpbnRDcHBOYW1lKEYpOworICBPdXQgPDwgIi0+c2V0QXR0cmlidXRlcygiIDw8IGdldENwcE5hbWUoRikgPDwgIl9QQUwpOyI7CisgIG5sKE91dCk7Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludEZ1bmN0aW9uQm9keShjb25zdCBGdW5jdGlvbiAqRikgeworICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpKQorICAgIHJldHVybjsgLy8gZXh0ZXJuYWwgZnVuY3Rpb25zIGhhdmUgbm8gYm9kaWVzLgorCisgIC8vIENsZWFyIHRoZSBEZWZpbmVkVmFsdWVzIGFuZCBGb3J3YXJkUmVmcyBtYXBzIGJlY2F1c2Ugd2UgY2FuJ3QgaGF2ZQorICAvLyBjcm9zcy1mdW5jdGlvbiBmb3J3YXJkIHJlZnMKKyAgRm9yd2FyZFJlZnMuY2xlYXIoKTsKKyAgRGVmaW5lZFZhbHVlcy5jbGVhcigpOworCisgIC8vIENyZWF0ZSBhbGwgdGhlIGFyZ3VtZW50IHZhbHVlcworICBpZiAoIWlzX2lubGluZSkgeworICAgIGlmICghRi0+YXJnX2VtcHR5KCkpIHsKKyAgICAgIE91dCA8PCAiRnVuY3Rpb246OmFyZ19pdGVyYXRvciBhcmdzID0gIiA8PCBnZXRDcHBOYW1lKEYpCisgICAgICAgICAgPDwgIi0+YXJnX2JlZ2luKCk7IjsKKyAgICAgIG5sKE91dCk7CisgICAgfQorICAgIGZvciAoRnVuY3Rpb246OmNvbnN0X2FyZ19pdGVyYXRvciBBSSA9IEYtPmFyZ19iZWdpbigpLCBBRSA9IEYtPmFyZ19lbmQoKTsKKyAgICAgICAgIEFJICE9IEFFOyArK0FJKSB7CisgICAgICBPdXQgPDwgIlZhbHVlKiAiIDw8IGdldENwcE5hbWUoQUkpIDw8ICIgPSBhcmdzKys7IjsKKyAgICAgIG5sKE91dCk7CisgICAgICBpZiAoQUktPmhhc05hbWUoKSkgeworICAgICAgICBPdXQgPDwgZ2V0Q3BwTmFtZShBSSkgPDwgIi0+c2V0TmFtZShcIiIgPDwgQUktPmdldE5hbWUoKSA8PCAiXCIpOyI7CisgICAgICAgIG5sKE91dCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ3JlYXRlIGFsbCB0aGUgYmFzaWMgYmxvY2tzCisgIG5sKE91dCk7CisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEJJID0gRi0+YmVnaW4oKSwgQkUgPSBGLT5lbmQoKTsKKyAgICAgICBCSSAhPSBCRTsgKytCSSkgeworICAgIHN0ZDo6c3RyaW5nIGJibmFtZShnZXRDcHBOYW1lKEJJKSk7CisgICAgT3V0IDw8ICJCYXNpY0Jsb2NrKiAiIDw8IGJibmFtZSA8PAorICAgICAgICAgICAiID0gQmFzaWNCbG9jazo6Q3JlYXRlKG1vZC0+Z2V0Q29udGV4dCgpLCBcIiI7CisgICAgaWYgKEJJLT5oYXNOYW1lKCkpCisgICAgICBwcmludEVzY2FwZWRTdHJpbmcoQkktPmdldE5hbWUoKSk7CisgICAgT3V0IDw8ICJcIiwiIDw8IGdldENwcE5hbWUoQkktPmdldFBhcmVudCgpKSA8PCAiLDApOyI7CisgICAgbmwoT3V0KTsKKyAgfQorCisgIC8vIE91dHB1dCBhbGwgb2YgaXRzIGJhc2ljIGJsb2Nrcy4uLiBmb3IgdGhlIGZ1bmN0aW9uCisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEJJID0gRi0+YmVnaW4oKSwgQkUgPSBGLT5lbmQoKTsKKyAgICAgICBCSSAhPSBCRTsgKytCSSkgeworICAgIHN0ZDo6c3RyaW5nIGJibmFtZShnZXRDcHBOYW1lKEJJKSk7CisgICAgbmwoT3V0KSA8PCAiLy8gQmxvY2sgIiA8PCBCSS0+Z2V0TmFtZSgpIDw8ICIgKCIgPDwgYmJuYW1lIDw8ICIpIjsKKyAgICBubChPdXQpOworCisgICAgLy8gT3V0cHV0IGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBiYXNpYyBibG9jay4uLgorICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJJLT5iZWdpbigpLCBFID0gQkktPmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIHByaW50SW5zdHJ1Y3Rpb24oSSxiYm5hbWUpOworICAgIH0KKyAgfQorCisgIC8vIExvb3Agb3ZlciB0aGUgRm9yd2FyZFJlZnMgYW5kIHJlc29sdmUgdGhlbSBub3cgdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zCisgIC8vIGFyZSBnZW5lcmF0ZWQuCisgIGlmICghRm9yd2FyZFJlZnMuZW1wdHkoKSkgeworICAgIG5sKE91dCkgPDwgIi8vIFJlc29sdmUgRm9yd2FyZCBSZWZlcmVuY2VzIjsKKyAgICBubChPdXQpOworICB9CisKKyAgd2hpbGUgKCFGb3J3YXJkUmVmcy5lbXB0eSgpKSB7CisgICAgRm9yd2FyZFJlZk1hcDo6aXRlcmF0b3IgSSA9IEZvcndhcmRSZWZzLmJlZ2luKCk7CisgICAgT3V0IDw8IEktPnNlY29uZCA8PCAiLT5yZXBsYWNlQWxsVXNlc1dpdGgoIgorICAgICAgICA8PCBnZXRDcHBOYW1lKEktPmZpcnN0KSA8PCAiKTsgZGVsZXRlICIgPDwgSS0+c2Vjb25kIDw8ICI7IjsKKyAgICBubChPdXQpOworICAgIEZvcndhcmRSZWZzLmVyYXNlKEkpOworICB9Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludElubGluZShjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bmMpIHsKKyAgY29uc3QgRnVuY3Rpb24qIEYgPSBUaGVNb2R1bGUtPmdldEZ1bmN0aW9uKGZ1bmMpOworICBpZiAoIUYpIHsKKyAgICBlcnJvcihzdGQ6OnN0cmluZygiRnVuY3Rpb24gJyIpICsgZnVuYyArICInIG5vdCBmb3VuZCBpbiBpbnB1dCBtb2R1bGUiKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSkgeworICAgIGVycm9yKHN0ZDo6c3RyaW5nKCJGdW5jdGlvbiAnIikgKyBmdW5jICsgIicgaXMgZXh0ZXJuYWwhIik7CisgICAgcmV0dXJuOworICB9CisgIG5sKE91dCkgPDwgIkJhc2ljQmxvY2sqICIgPDwgZm5hbWUgPDwgIihNb2R1bGUqIG1vZCwgRnVuY3Rpb24gKiIKKyAgICAgICAgICA8PCBnZXRDcHBOYW1lKEYpOworICB1bnNpZ25lZCBhcmdfY291bnQgPSAxOworICBmb3IgKEZ1bmN0aW9uOjpjb25zdF9hcmdfaXRlcmF0b3IgQUkgPSBGLT5hcmdfYmVnaW4oKSwgQUUgPSBGLT5hcmdfZW5kKCk7CisgICAgICAgQUkgIT0gQUU7ICsrQUkpIHsKKyAgICBPdXQgPDwgIiwgVmFsdWUqIGFyZ18iIDw8IGFyZ19jb3VudDsKKyAgfQorICBPdXQgPDwgIikgeyI7CisgIG5sKE91dCk7CisgIGlzX2lubGluZSA9IHRydWU7CisgIHByaW50RnVuY3Rpb25Vc2VzKEYpOworICBwcmludEZ1bmN0aW9uQm9keShGKTsKKyAgaXNfaW5saW5lID0gZmFsc2U7CisgIE91dCA8PCAicmV0dXJuICIgPDwgZ2V0Q3BwTmFtZShGLT5iZWdpbigpKSA8PCAiOyI7CisgIG5sKE91dCkgPDwgIn0iOworICBubChPdXQpOworfQorCit2b2lkIENwcFdyaXRlcjo6cHJpbnRNb2R1bGVCb2R5KCkgeworICAvLyBQcmludCBvdXQgYWxsIHRoZSB0eXBlIGRlZmluaXRpb25zCisgIG5sKE91dCkgPDwgIi8vIFR5cGUgRGVmaW5pdGlvbnMiOyBubChPdXQpOworICBwcmludFR5cGVzKFRoZU1vZHVsZSk7CisKKyAgLy8gRnVuY3Rpb25zIGNhbiBjYWxsIGVhY2ggb3RoZXIgYW5kIGdsb2JhbCB2YXJpYWJsZXMgY2FuIHJlZmVyZW5jZSB0aGVtIHNvCisgIC8vIGRlZmluZSBhbGwgdGhlIGZ1bmN0aW9ucyBmaXJzdCBiZWZvcmUgZW1pdHRpbmcgdGhlaXIgZnVuY3Rpb24gYm9kaWVzLgorICBubChPdXQpIDw8ICIvLyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMiOyBubChPdXQpOworICBmb3IgKE1vZHVsZTo6Y29uc3RfaXRlcmF0b3IgSSA9IFRoZU1vZHVsZS0+YmVnaW4oKSwgRSA9IFRoZU1vZHVsZS0+ZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgcHJpbnRGdW5jdGlvbkhlYWQoSSk7CisKKyAgLy8gUHJvY2VzcyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBkZWNsYXJhdGlvbnMuIFdlIGNhbid0IGluaXRpYWx6ZSB0aGVtIHVudGlsCisgIC8vIGFmdGVyIHRoZSBjb25zdGFudHMgYXJlIHByaW50ZWQgc28ganVzdCBwcmludCBhIGhlYWRlciBmb3IgZWFjaCBnbG9iYWwKKyAgbmwoT3V0KSA8PCAiLy8gR2xvYmFsIFZhcmlhYmxlIERlY2xhcmF0aW9uc1xuIjsgbmwoT3V0KTsKKyAgZm9yIChNb2R1bGU6OmNvbnN0X2dsb2JhbF9pdGVyYXRvciBJID0gVGhlTW9kdWxlLT5nbG9iYWxfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBUaGVNb2R1bGUtPmdsb2JhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBwcmludFZhcmlhYmxlSGVhZChJKTsKKyAgfQorCisgIC8vIFByaW50IG91dCBhbGwgdGhlIGNvbnN0YW50cyBkZWZpbml0aW9ucy4gQ29uc3RhbnRzIGRvbid0IHJlY3Vyc2UgZXhjZXB0CisgIC8vIHRocm91Z2ggR2xvYmFsVmFsdWVzLiBBbGwgR2xvYmFsVmFsdWVzIGhhdmUgYmVlbiBkZWNsYXJlZCBhdCB0aGlzIHBvaW50CisgIC8vIHNvIHdlIGNhbiBwcm9jZWVkIHRvIGdlbmVyYXRlIHRoZSBjb25zdGFudHMuCisgIG5sKE91dCkgPDwgIi8vIENvbnN0YW50IERlZmluaXRpb25zIjsgbmwoT3V0KTsKKyAgcHJpbnRDb25zdGFudHMoVGhlTW9kdWxlKTsKKworICAvLyBQcm9jZXNzIHRoZSBnbG9iYWwgdmFyaWFibGVzIGRlZmluaXRpb25zIG5vdyB0aGF0IGFsbCB0aGUgY29uc3RhbnRzIGhhdmUKKyAgLy8gYmVlbiBlbWl0dGVkLiBUaGVzZSBkZWZpbml0aW9ucyBqdXN0IGNvdXBsZSB0aGUgZ3ZhcnMgd2l0aCB0aGVpciBjb25zdGFudAorICAvLyBpbml0aWFsaXplcnMuCisgIG5sKE91dCkgPDwgIi8vIEdsb2JhbCBWYXJpYWJsZSBEZWZpbml0aW9ucyI7IG5sKE91dCk7CisgIGZvciAoTW9kdWxlOjpjb25zdF9nbG9iYWxfaXRlcmF0b3IgSSA9IFRoZU1vZHVsZS0+Z2xvYmFsX2JlZ2luKCksCisgICAgICAgICBFID0gVGhlTW9kdWxlLT5nbG9iYWxfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgcHJpbnRWYXJpYWJsZUJvZHkoSSk7CisgIH0KKworICAvLyBGaW5hbGx5LCB3ZSBjYW4gc2FmZWx5IHB1dCBvdXQgYWxsIG9mIHRoZSBmdW5jdGlvbiBib2RpZXMuCisgIG5sKE91dCkgPDwgIi8vIEZ1bmN0aW9uIERlZmluaXRpb25zIjsgbmwoT3V0KTsKKyAgZm9yIChNb2R1bGU6OmNvbnN0X2l0ZXJhdG9yIEkgPSBUaGVNb2R1bGUtPmJlZ2luKCksIEUgPSBUaGVNb2R1bGUtPmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKCFJLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgIG5sKE91dCkgPDwgIi8vIEZ1bmN0aW9uOiAiIDw8IEktPmdldE5hbWUoKSA8PCAiICgiIDw8IGdldENwcE5hbWUoSSkKKyAgICAgICAgICAgICAgPDwgIikiOworICAgICAgbmwoT3V0KSA8PCAieyI7CisgICAgICBubChPdXQsMSk7CisgICAgICBwcmludEZ1bmN0aW9uQm9keShJKTsKKyAgICAgIG5sKE91dCwtMSkgPDwgIn0iOworICAgICAgbmwoT3V0KTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDcHBXcml0ZXI6OnByaW50UHJvZ3JhbShjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtTmFtZSkgeworICBPdXQgPDwgIiNpbmNsdWRlIDxsbHZtL0xMVk1Db250ZXh0Lmg+XG4iOworICBPdXQgPDwgIiNpbmNsdWRlIDxsbHZtL01vZHVsZS5oPlxuIjsKKyAgT3V0IDw8ICIjaW5jbHVkZSA8bGx2bS9EZXJpdmVkVHlwZXMuaD5cbiI7CisgIE91dCA8PCAiI2luY2x1ZGUgPGxsdm0vQ29uc3RhbnRzLmg+XG4iOworICBPdXQgPDwgIiNpbmNsdWRlIDxsbHZtL0dsb2JhbFZhcmlhYmxlLmg+XG4iOworICBPdXQgPDwgIiNpbmNsdWRlIDxsbHZtL0Z1bmN0aW9uLmg+XG4iOworICBPdXQgPDwgIiNpbmNsdWRlIDxsbHZtL0NhbGxpbmdDb252Lmg+XG4iOworICBPdXQgPDwgIiNpbmNsdWRlIDxsbHZtL0Jhc2ljQmxvY2suaD5cbiI7CisgIE91dCA8PCAiI2luY2x1ZGUgPGxsdm0vSW5zdHJ1Y3Rpb25zLmg+XG4iOworICBPdXQgPDwgIiNpbmNsdWRlIDxsbHZtL0lubGluZUFzbS5oPlxuIjsKKyAgT3V0IDw8ICIjaW5jbHVkZSA8bGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oPlxuIjsKKyAgT3V0IDw8ICIjaW5jbHVkZSA8bGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaD5cbiI7CisgIE91dCA8PCAiI2luY2x1ZGUgPGxsdm0vUGFzcy5oPlxuIjsKKyAgT3V0IDw8ICIjaW5jbHVkZSA8bGx2bS9QYXNzTWFuYWdlci5oPlxuIjsKKyAgT3V0IDw8ICIjaW5jbHVkZSA8bGx2bS9BRFQvU21hbGxWZWN0b3IuaD5cbiI7CisgIE91dCA8PCAiI2luY2x1ZGUgPGxsdm0vQW5hbHlzaXMvVmVyaWZpZXIuaD5cbiI7CisgIE91dCA8PCAiI2luY2x1ZGUgPGxsdm0vQXNzZW1ibHkvUHJpbnRNb2R1bGVQYXNzLmg+XG4iOworICBPdXQgPDwgIiNpbmNsdWRlIDxhbGdvcml0aG0+XG4iOworICBPdXQgPDwgInVzaW5nIG5hbWVzcGFjZSBsbHZtO1xuXG4iOworICBPdXQgPDwgIk1vZHVsZSogIiA8PCBmbmFtZSA8PCAiKCk7XG5cbiI7CisgIE91dCA8PCAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKmFyZ3YpIHtcbiI7CisgIE91dCA8PCAiICBNb2R1bGUqIE1vZCA9ICIgPDwgZm5hbWUgPDwgIigpO1xuIjsKKyAgT3V0IDw8ICIgIHZlcmlmeU1vZHVsZSgqTW9kLCBQcmludE1lc3NhZ2VBY3Rpb24pO1xuIjsKKyAgT3V0IDw8ICIgIFBhc3NNYW5hZ2VyIFBNO1xuIjsKKyAgT3V0IDw8ICIgIFBNLmFkZChjcmVhdGVQcmludE1vZHVsZVBhc3MoJm91dHMoKSkpO1xuIjsKKyAgT3V0IDw8ICIgIFBNLnJ1bigqTW9kKTtcbiI7CisgIE91dCA8PCAiICByZXR1cm4gMDtcbiI7CisgIE91dCA8PCAifVxuXG4iOworICBwcmludE1vZHVsZShmbmFtZSxtTmFtZSk7Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludE1vZHVsZShjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1OYW1lKSB7CisgIG5sKE91dCkgPDwgIk1vZHVsZSogIiA8PCBmbmFtZSA8PCAiKCkgeyI7CisgIG5sKE91dCwxKSA8PCAiLy8gTW9kdWxlIENvbnN0cnVjdGlvbiI7CisgIG5sKE91dCkgPDwgIk1vZHVsZSogbW9kID0gbmV3IE1vZHVsZShcIiI7CisgIHByaW50RXNjYXBlZFN0cmluZyhtTmFtZSk7CisgIE91dCA8PCAiXCIsIGdldEdsb2JhbENvbnRleHQoKSk7IjsKKyAgaWYgKCFUaGVNb2R1bGUtPmdldFRhcmdldFRyaXBsZSgpLmVtcHR5KCkpIHsKKyAgICBubChPdXQpIDw8ICJtb2QtPnNldERhdGFMYXlvdXQoXCIiIDw8IFRoZU1vZHVsZS0+Z2V0RGF0YUxheW91dCgpIDw8ICJcIik7IjsKKyAgfQorICBpZiAoIVRoZU1vZHVsZS0+Z2V0VGFyZ2V0VHJpcGxlKCkuZW1wdHkoKSkgeworICAgIG5sKE91dCkgPDwgIm1vZC0+c2V0VGFyZ2V0VHJpcGxlKFwiIiA8PCBUaGVNb2R1bGUtPmdldFRhcmdldFRyaXBsZSgpCisgICAgICAgICAgICA8PCAiXCIpOyI7CisgIH0KKworICBpZiAoIVRoZU1vZHVsZS0+Z2V0TW9kdWxlSW5saW5lQXNtKCkuZW1wdHkoKSkgeworICAgIG5sKE91dCkgPDwgIm1vZC0+c2V0TW9kdWxlSW5saW5lQXNtKFwiIjsKKyAgICBwcmludEVzY2FwZWRTdHJpbmcoVGhlTW9kdWxlLT5nZXRNb2R1bGVJbmxpbmVBc20oKSk7CisgICAgT3V0IDw8ICJcIik7IjsKKyAgfQorICBubChPdXQpOworCisgIC8vIExvb3Agb3ZlciB0aGUgZGVwZW5kZW50IGxpYnJhcmllcyBhbmQgZW1pdCB0aGVtLgorICBNb2R1bGU6OmxpYl9pdGVyYXRvciBMSSA9IFRoZU1vZHVsZS0+bGliX2JlZ2luKCk7CisgIE1vZHVsZTo6bGliX2l0ZXJhdG9yIExFID0gVGhlTW9kdWxlLT5saWJfZW5kKCk7CisgIHdoaWxlIChMSSAhPSBMRSkgeworICAgIE91dCA8PCAibW9kLT5hZGRMaWJyYXJ5KFwiIiA8PCAqTEkgPDwgIlwiKTsiOworICAgIG5sKE91dCk7CisgICAgKytMSTsKKyAgfQorICBwcmludE1vZHVsZUJvZHkoKTsKKyAgbmwoT3V0KSA8PCAicmV0dXJuIG1vZDsiOworICBubChPdXQsLTEpIDw8ICJ9IjsKKyAgbmwoT3V0KTsKK30KKwordm9pZCBDcHBXcml0ZXI6OnByaW50Q29udGVudHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1OYW1lKSB7CisgIE91dCA8PCAiXG5Nb2R1bGUqICIgPDwgZm5hbWUgPDwgIihNb2R1bGUgKm1vZCkge1xuIjsKKyAgT3V0IDw8ICJcbm1vZC0+c2V0TW9kdWxlSWRlbnRpZmllcihcIiI7CisgIHByaW50RXNjYXBlZFN0cmluZyhtTmFtZSk7CisgIE91dCA8PCAiXCIpO1xuIjsKKyAgcHJpbnRNb2R1bGVCb2R5KCk7CisgIE91dCA8PCAiXG5yZXR1cm4gbW9kO1xuIjsKKyAgT3V0IDw8ICJcbn1cbiI7Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludEZ1bmN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdW5jTmFtZSkgeworICBjb25zdCBGdW5jdGlvbiogRiA9IFRoZU1vZHVsZS0+Z2V0RnVuY3Rpb24oZnVuY05hbWUpOworICBpZiAoIUYpIHsKKyAgICBlcnJvcihzdGQ6OnN0cmluZygiRnVuY3Rpb24gJyIpICsgZnVuY05hbWUgKyAiJyBub3QgZm91bmQgaW4gaW5wdXQgbW9kdWxlIik7CisgICAgcmV0dXJuOworICB9CisgIE91dCA8PCAiXG5GdW5jdGlvbiogIiA8PCBmbmFtZSA8PCAiKE1vZHVsZSAqbW9kKSB7XG4iOworICBwcmludEZ1bmN0aW9uVXNlcyhGKTsKKyAgcHJpbnRGdW5jdGlvbkhlYWQoRik7CisgIHByaW50RnVuY3Rpb25Cb2R5KEYpOworICBPdXQgPDwgInJldHVybiAiIDw8IGdldENwcE5hbWUoRikgPDwgIjtcbiI7CisgIE91dCA8PCAifVxuIjsKK30KKwordm9pZCBDcHBXcml0ZXI6OnByaW50RnVuY3Rpb25zKCkgeworICBjb25zdCBNb2R1bGU6OkZ1bmN0aW9uTGlzdFR5cGUgJmZ1bmNzID0gVGhlTW9kdWxlLT5nZXRGdW5jdGlvbkxpc3QoKTsKKyAgTW9kdWxlOjpjb25zdF9pdGVyYXRvciBJICA9IGZ1bmNzLmJlZ2luKCk7CisgIE1vZHVsZTo6Y29uc3RfaXRlcmF0b3IgSUUgPSBmdW5jcy5lbmQoKTsKKworICBmb3IgKDsgSSAhPSBJRTsgKytJKSB7CisgICAgY29uc3QgRnVuY3Rpb24gJmZ1bmMgPSAqSTsKKyAgICBpZiAoIWZ1bmMuaXNEZWNsYXJhdGlvbigpKSB7CisgICAgICBzdGQ6OnN0cmluZyBuYW1lKCJkZWZpbmVfIik7CisgICAgICBuYW1lICs9IGZ1bmMuZ2V0TmFtZSgpOworICAgICAgcHJpbnRGdW5jdGlvbihuYW1lLCBmdW5jLmdldE5hbWUoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ3BwV3JpdGVyOjpwcmludFZhcmlhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YXJOYW1lKSB7CisgIGNvbnN0IEdsb2JhbFZhcmlhYmxlKiBHViA9IFRoZU1vZHVsZS0+Z2V0TmFtZWRHbG9iYWwodmFyTmFtZSk7CisKKyAgaWYgKCFHVikgeworICAgIGVycm9yKHN0ZDo6c3RyaW5nKCJWYXJpYWJsZSAnIikgKyB2YXJOYW1lICsgIicgbm90IGZvdW5kIGluIGlucHV0IG1vZHVsZSIpOworICAgIHJldHVybjsKKyAgfQorICBPdXQgPDwgIlxuR2xvYmFsVmFyaWFibGUqICIgPDwgZm5hbWUgPDwgIihNb2R1bGUgKm1vZCkge1xuIjsKKyAgcHJpbnRWYXJpYWJsZVVzZXMoR1YpOworICBwcmludFZhcmlhYmxlSGVhZChHVik7CisgIHByaW50VmFyaWFibGVCb2R5KEdWKTsKKyAgT3V0IDw8ICJyZXR1cm4gIiA8PCBnZXRDcHBOYW1lKEdWKSA8PCAiO1xuIjsKKyAgT3V0IDw8ICJ9XG4iOworfQorCit2b2lkIENwcFdyaXRlcjo6cHJpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVOYW1lKSB7CisgIGNvbnN0IFR5cGUqIFR5ID0gVGhlTW9kdWxlLT5nZXRUeXBlQnlOYW1lKHR5cGVOYW1lKTsKKyAgaWYgKCFUeSkgeworICAgIGVycm9yKHN0ZDo6c3RyaW5nKCJUeXBlICciKSArIHR5cGVOYW1lICsgIicgbm90IGZvdW5kIGluIGlucHV0IG1vZHVsZSIpOworICAgIHJldHVybjsKKyAgfQorICBPdXQgPDwgIlxuVHlwZSogIiA8PCBmbmFtZSA8PCAiKE1vZHVsZSAqbW9kKSB7XG4iOworICBwcmludFR5cGUoVHkpOworICBPdXQgPDwgInJldHVybiAiIDw8IGdldENwcE5hbWUoVHkpIDw8ICI7XG4iOworICBPdXQgPDwgIn1cbiI7Cit9CisKK2Jvb2wgQ3BwV3JpdGVyOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgVGhlTW9kdWxlID0gJk07CisKKyAgLy8gRW1pdCBhIGhlYWRlcgorICBPdXQgPDwgIi8vIEdlbmVyYXRlZCBieSBsbHZtMmNwcCAtIERPIE5PVCBNT0RJRlkhXG5cbiI7CisKKyAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB3ZSdyZSBzdXBwb3NlZCB0byBnZW5lcmF0ZQorICBzdGQ6OnN0cmluZyBmbmFtZSA9IEZ1bmNOYW1lLmdldFZhbHVlKCk7CisKKyAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSB0aGluZyB3ZSBhcmUgdG8gZ2VuZXJhdGUKKyAgc3RkOjpzdHJpbmcgdGd0bmFtZSA9IE5hbWVUb0dlbmVyYXRlLmdldFZhbHVlKCk7CisgIGlmIChHZW5lcmF0aW9uVHlwZSA9PSBHZW5Nb2R1bGUgfHwKKyAgICAgIEdlbmVyYXRpb25UeXBlID09IEdlbkNvbnRlbnRzIHx8CisgICAgICBHZW5lcmF0aW9uVHlwZSA9PSBHZW5Qcm9ncmFtIHx8CisgICAgICBHZW5lcmF0aW9uVHlwZSA9PSBHZW5GdW5jdGlvbnMpIHsKKyAgICBpZiAodGd0bmFtZSA9PSAiIWJhZCEiKSB7CisgICAgICBpZiAoTS5nZXRNb2R1bGVJZGVudGlmaWVyKCkgPT0gIi0iKQorICAgICAgICB0Z3RuYW1lID0gIjxzdGRpbj4iOworICAgICAgZWxzZQorICAgICAgICB0Z3RuYW1lID0gTS5nZXRNb2R1bGVJZGVudGlmaWVyKCk7CisgICAgfQorICB9IGVsc2UgaWYgKHRndG5hbWUgPT0gIiFiYWQhIikKKyAgICBlcnJvcigiWW91IG11c3QgdXNlIHRoZSAtZm9yIG9wdGlvbiB3aXRoIC1nZW4te2Z1bmN0aW9uLHZhcmlhYmxlLHR5cGV9Iik7CisKKyAgc3dpdGNoIChXaGF0VG9HZW5lcmF0ZShHZW5lcmF0aW9uVHlwZSkpIHsKKyAgIGNhc2UgR2VuUHJvZ3JhbToKKyAgICBpZiAoZm5hbWUuZW1wdHkoKSkKKyAgICAgIGZuYW1lID0gIm1ha2VMTFZNTW9kdWxlIjsKKyAgICBwcmludFByb2dyYW0oZm5hbWUsdGd0bmFtZSk7CisgICAgYnJlYWs7CisgICBjYXNlIEdlbk1vZHVsZToKKyAgICBpZiAoZm5hbWUuZW1wdHkoKSkKKyAgICAgIGZuYW1lID0gIm1ha2VMTFZNTW9kdWxlIjsKKyAgICBwcmludE1vZHVsZShmbmFtZSx0Z3RuYW1lKTsKKyAgICBicmVhazsKKyAgIGNhc2UgR2VuQ29udGVudHM6CisgICAgaWYgKGZuYW1lLmVtcHR5KCkpCisgICAgICBmbmFtZSA9ICJtYWtlTExWTU1vZHVsZUNvbnRlbnRzIjsKKyAgICBwcmludENvbnRlbnRzKGZuYW1lLHRndG5hbWUpOworICAgIGJyZWFrOworICAgY2FzZSBHZW5GdW5jdGlvbjoKKyAgICBpZiAoZm5hbWUuZW1wdHkoKSkKKyAgICAgIGZuYW1lID0gIm1ha2VMTFZNRnVuY3Rpb24iOworICAgIHByaW50RnVuY3Rpb24oZm5hbWUsdGd0bmFtZSk7CisgICAgYnJlYWs7CisgICBjYXNlIEdlbkZ1bmN0aW9uczoKKyAgICBwcmludEZ1bmN0aW9ucygpOworICAgIGJyZWFrOworICAgY2FzZSBHZW5JbmxpbmU6CisgICAgaWYgKGZuYW1lLmVtcHR5KCkpCisgICAgICBmbmFtZSA9ICJtYWtlTExWTUlubGluZSI7CisgICAgcHJpbnRJbmxpbmUoZm5hbWUsdGd0bmFtZSk7CisgICAgYnJlYWs7CisgICBjYXNlIEdlblZhcmlhYmxlOgorICAgIGlmIChmbmFtZS5lbXB0eSgpKQorICAgICAgZm5hbWUgPSAibWFrZUxMVk1WYXJpYWJsZSI7CisgICAgcHJpbnRWYXJpYWJsZShmbmFtZSx0Z3RuYW1lKTsKKyAgICBicmVhazsKKyAgIGNhc2UgR2VuVHlwZToKKyAgICBpZiAoZm5hbWUuZW1wdHkoKSkKKyAgICAgIGZuYW1lID0gIm1ha2VMTFZNVHlwZSI7CisgICAgcHJpbnRUeXBlKGZuYW1lLHRndG5hbWUpOworICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICBlcnJvcigiSW52YWxpZCBnZW5lcmF0aW9uIG9wdGlvbiIpOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitjaGFyIENwcFdyaXRlcjo6SUQgPSAwOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIEludGVyZmFjZSBkZWNsYXJhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworYm9vbCBDUFBUYXJnZXRNYWNoaW5lOjphZGRQYXNzZXNUb0VtaXRGaWxlKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GaWxlVHlwZSBGaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVWZXJpZnkpIHsKKyAgaWYgKEZpbGVUeXBlICE9IFRhcmdldE1hY2hpbmU6OkNHRlRfQXNzZW1ibHlGaWxlKSByZXR1cm4gdHJ1ZTsKKyAgUE0uYWRkKG5ldyBDcHBXcml0ZXIobykpOworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvQ1BQVGFyZ2V0TWFjaGluZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DcHBCYWNrZW5kL0NQUFRhcmdldE1hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDIxNjZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DcHBCYWNrZW5kL0NQUFRhcmdldE1hY2hpbmUuaApAQCAtMCwwICsxLDQzIEBACisvLz09PS0tIENQUFRhcmdldE1hY2hpbmUuaCAtIFRhcmdldE1hY2hpbmUgZm9yIHRoZSBDKysgYmFja2VuZCAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgVGFyZ2V0TWFjaGluZSB0aGF0IGlzIHVzZWQgYnkgdGhlIEMrKyBiYWNrZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQ1BQVEFSR0VUTUFDSElORV9ICisjZGVmaW5lIENQUFRBUkdFVE1BQ0hJTkVfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBmb3JtYXR0ZWRfcmF3X29zdHJlYW07CisKK3N0cnVjdCBDUFBUYXJnZXRNYWNoaW5lIDogcHVibGljIFRhcmdldE1hY2hpbmUgeworICBDUFBUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGUykKKyAgICA6IFRhcmdldE1hY2hpbmUoVCkge30KKworICB2aXJ0dWFsIGJvb2wgYWRkUGFzc2VzVG9FbWl0RmlsZShQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZpbGVUeXBlIEZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlVmVyaWZ5KTsKKworICB2aXJ0dWFsIGNvbnN0IFRhcmdldERhdGEgKmdldFRhcmdldERhdGEoKSBjb25zdCB7IHJldHVybiAwOyB9Cit9OworCitleHRlcm4gVGFyZ2V0IFRoZUNwcEJhY2tlbmRUYXJnZXQ7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1ZjRlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ3BwQmFja2VuZC9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjIz09PS0gbGliL1RhcmdldC9DcHBCYWNrZW5kL01ha2VmaWxlIC0tLSAtLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1DcHBCYWNrZW5kCitESVJTID0gVGFyZ2V0SW5mbworCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCitDb21waWxlQ29tbW9uT3B0cyArPSAtV25vLWZvcm1hdApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DcHBCYWNrZW5kL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGFmNWQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DcHBCYWNrZW5kL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uICkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNQ3BwQmFja2VuZEluZm8KKyAgQ3BwQmFja2VuZFRhcmdldEluZm8uY3BwCisgICkKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9DcHBCYWNrZW5kL1RhcmdldEluZm8vQ3BwQmFja2VuZFRhcmdldEluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9DcHBCYWNrZW5kL1RhcmdldEluZm8vQ3BwQmFja2VuZFRhcmdldEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYWViMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvVGFyZ2V0SW5mby9DcHBCYWNrZW5kVGFyZ2V0SW5mby5jcHAKQEAgLTAsMCArMSwyNiBAQAorLy89PT0tLSBDcHBCYWNrZW5kVGFyZ2V0SW5mby5jcHAgLSBDcHBCYWNrZW5kIFRhcmdldCBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkNQUFRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGFyZ2V0IGxsdm06OlRoZUNwcEJhY2tlbmRUYXJnZXQ7CisKK3N0YXRpYyB1bnNpZ25lZCBDcHBCYWNrZW5kX1RyaXBsZU1hdGNoUXVhbGl0eShjb25zdCBzdGQ6OnN0cmluZyAmVFQpIHsKKyAgLy8gVGhpcyBjbGFzcyBhbHdheXMgd29ya3MsIGJ1dCBzaG91bGRuJ3QgYmUgdGhlIGRlZmF1bHQgaW4gbW9zdCBjYXNlcy4KKyAgcmV0dXJuIDE7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUNwcEJhY2tlbmRUYXJnZXRJbmZvKCkgeyAKKyAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyVGFyZ2V0KFRoZUNwcEJhY2tlbmRUYXJnZXQsICJjcHAiLCAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQysrIGJhY2tlbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDcHBCYWNrZW5kX1RyaXBsZU1hdGNoUXVhbGl0eSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvVGFyZ2V0SW5mby9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvQ3BwQmFja2VuZC9UYXJnZXRJbmZvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjgyODMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L0NwcEJhY2tlbmQvVGFyZ2V0SW5mby9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RhcmdldC9DcHBCYWNrZW5kL1RhcmdldEluZm8vTWFrZWZpbGUgLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNQ3BwQmFja2VuZEluZm8KKworIyBIYWNrOiB3ZSBuZWVkIHRvIGluY2x1ZGUgJ21haW4nIHRhcmdldCBkaXJlY3RvcnkgdG8gZ3JhYiBwcml2YXRlIGhlYWRlcnMKK0NQUEZMQUdTID0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvSUE2NC9Bc21QcmludGVyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9JQTY0L0FzbVByaW50ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4ODBmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvSUE2NC9Bc21QcmludGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L0lBNjQvQXNtUHJpbnRlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUlBNjRBc21QcmludGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBJQTY0IHRhcmdldCBkaXJlY3RvcnkgdG8gZ3JhYgorIyBwcml2YXRlIGhlYWRlcnMKK0NQUEZMQUdTID0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvSUE2NC9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvSUE2NC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzgzMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9JQTY0L01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L0lBNjQvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNSUE2NENvZGVHZW4KK1RBUkdFVCA9IElBNjQKKyMgTWFrZSBzdXJlIHRoYXQgdGJsZ2VuIGlzIHJ1biwgZmlyc3QgdGhpbmcuCitCVUlMVF9TT1VSQ0VTID0gSUE2NEdlblJlZ2lzdGVySW5mby5oLmluYyBJQTY0R2VuUmVnaXN0ZXJOYW1lcy5pbmMgXAorICAgICAgICAgICAgICAgIElBNjRHZW5SZWdpc3RlckluZm8uaW5jIElBNjRHZW5JbnN0ck5hbWVzLmluYyBcCisgICAgICAgICAgICAgICAgSUE2NEdlbkluc3RySW5mby5pbmMgSUE2NEdlbkFzbVdyaXRlci5pbmMgXAorCQlJQTY0R2VuREFHSVNlbC5pbmMKKworRElSUyA9IEFzbVByaW50ZXIKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9JQTY0L1JFQURNRSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvSUE2NC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzMWM1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvSUE2NC9SRUFETUUKQEAgLTAsMCArMSw0OCBAQAorVE9ETzoNCisgIC0gVW4tYml0cm90IElTZWwNCisgIC0gSG9vayB1cCBJZi1Db252ZXJzaW9uIGEgbGEgQVJNIHRhcmdldA0KKyAgLSBIb29rIHVwIGFsbCBicmFuY2ggYW5hbHlzaXMgZnVuY3Rpb25zDQorICAtIEluc3RydWN0aW9uIHNjaGVkdWxpbmcNCisgIC0gQnVuZGxpbmcNCisgIC0gRHluYW1pYyBPcHRpbWl6YXRpb24NCisgIC0gVGVzdGluZyBhbmQgYnVnZml4aW5nDQorICAtIHN0b3AgcGFzc2luZyBGUCBhcmdzIGluIGJvdGggRlAgKmFuZCogaW50ZWdlciByZWdzIHdoZW4gbm90IHJlcXVpcmVkDQorICAtIGFsbG9jYXRlIGxvdyAobm9uc3RhY2tlZCkgcmVnaXN0ZXJzIG1vcmUgYWdncmVzc2l2ZWx5DQorICAtIGNsZWFuIHVwIGFuZCB0aG9yb3VnaGx5IHRlc3QgdGhlIGlzZWwgcGF0dGVybnMuDQorICAtIGZpeCBzdGFja2VkIHJlZ2lzdGVyIGFsbG9jYXRpb24gb3JkZXI6IChmb3IgcmVhZGFiaWxpdHkpIHdlIGRvbid0IHdhbnQNCisgICAgdGhlIG91dD8gcmVnaXN0ZXJzIGJlaW5nIHRoZSBmaXJzdCBvbmVzIHVzZWQNCisgIC0gZml4IHVwIGZsb2F0aW5nIHBvaW50DQorICAgIChuYiBodHRwOi8vZ2NjLmdudS5vcmcvd2lraT9wYWdlbmFtZT1pYTY0JTIwZmxvYXRpbmclMjBwb2ludCApDQorICAtIGJ1bmRsaW5nIQ0KKyAgICAod2Ugd2lsbCBhdm9pZCB0aGUgbWVzcyB0aGF0IGlzOg0KKyAgICAgaHR0cDovL2djYy5nbnUub3JnL21sL2djYy8yMDAzLTEyL21zZzAwODMyLmh0bWwgKQ0KKyAgLSBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nIChobW1tbSEgOykNCisgIC0gY291bnRlZCBsb29wIHN1cHBvcnQNCisgIC0gbWFrZSBpbnRlZ2VyICsgRlAgbXVsL2RpdiBtb3JlIGNsZXZlciAod2UgaGF2ZSBmaXhlZCBwc2V1ZG9jb2RlIGF0bSkNCisgIC0gdHJhY2sgYW5kIHVzZSBjb21wYXJpc29uIGNvbXBsZW1lbnRzDQorDQorSU5GTzoNCisgIC0gd2UgYXJlIHN0cmljdGx5IExQNjQgaGVyZSwgbm8gc3VwcG9ydCBmb3IgSUxQMzIgb24gSFAtVVguIExpbnV4IHVzZXJzDQorICAgIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcy4NCisgIC0gaSBoYXZlIGluc3RydWN0aW9uIHNjaGVkdWxpbmcvYnVuZGxpbmcgcHNldWRvY29kZSwgdGhhdCByZWFsbHkgd29ya3MNCisgICAgKGhhcyBiZWVuIHRlc3RlZCwgYWxiZWl0IGF0IHRoZSBwZXJsLXNjcmlwdCBsZXZlbCkuDQorICAgIHNvLCBiZWZvcmUgeW91IGdvIHdyaXRlIHlvdXIgb3duLCBzZW5kIG1lIGFuIGVtYWlsIQ0KKw0KK0tOT1dOIERFRkVDVFMgQVQgVEhFIENVUlJFTlQgVElNRToNCisgIC0gQysrIHZ0YWJsZXMgY29udGFpbiBuYWtlZCBmdW5jdGlvbiBwb2ludGVycywgbm90IGZ1bmN0aW9uIGRlc2NyaXB0b3JzLA0KKyAgd2hpY2ggaXMgYmFkLiBzZWUgaHR0cDovL2xsdm0uY3MudWl1Yy5lZHUvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDA2DQorICAtIHZhcmFyZ3MgYXJlIGJyb2tlbg0KKyAgLSBhbGxvY2EgZG9lc24ndCB3b3JrIChpbmRlZWQsIHN0YWNrIGZyYW1lIGxheW91dCBpcyBib2d1cykNCisgIC0gbm8gc3VwcG9ydCBmb3IgYmlnLWVuZGlhbiBlbnZpcm9ubWVudHMNCisgIC0gKG5vdCByZWFsbHkgdGhlIGJhY2tlbmQsIGJ1dC4uLikgdGhlIENGRSBoYXMgc29tZSBpc3N1ZXMgb24gSUE2NC4NCisgICAgdGhlc2Ugd2lsbCBwcm9iYWJseSBiZSBmaXhlZCBzb29uLg0KKyAgDQorQUNLTk9XTEVER0VNRU5UUzoNCisgIC0gQ2hyaXMgTGF0dG5lciAoeDEwMCkNCisgIC0gT3RoZXIgTExWTSBkZXZlbG9wZXJzICgiaGV5LCB0aGF0IGxvb2tzIGZhbWlsaWFyIikNCisNCitDT05UQUNUOg0KKyAgLSBZb3UgY2FuIGVtYWlsIG1lIGF0IGR1cmFpZEBvY3RvcHVzLmNvbS5hdS4gSWYgeW91IGZpbmQgYSBzbWFsbCBidWcsDQorICAgIGp1c3QgZW1haWwgbWUuIElmIHlvdSBmaW5kIGEgYmlnIGJ1ZywgcGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0DQorICAgIGluIGJ1Z3ppbGxhISBodHRwOi8vbGx2bS5jcy51aXVjLmVkdSBpcyB5b3VyIG9uZSBzdG9wIHNob3AgZm9yIGFsbA0KKyAgICB0aGluZ3MgTExWTS4NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9Bc21QcmludGVyL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWMyYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLgorICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4KKyAgKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1NQmxhemVBc21QcmludGVyCisgIE1CbGF6ZUFzbVByaW50ZXIuY3BwCisgICkKK2FkZF9kZXBlbmRlbmNpZXMoTExWTU1CbGF6ZUFzbVByaW50ZXIgTUJsYXplQ29kZUdlblRhYmxlX2dlbikKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL0FzbVByaW50ZXIvTUJsYXplQXNtUHJpbnRlci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9Bc21QcmludGVyL01CbGF6ZUFzbVByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTRkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9Bc21QcmludGVyL01CbGF6ZUFzbVByaW50ZXIuY3BwCkBAIC0wLDAgKzEsMzA1IEBACisvLz09PS0tIE1CbGF6ZUFzbVByaW50ZXIuY3BwIC0gTUJsYXplIExMVk0gYXNzZW1ibHkgd3JpdGVyIC0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHByaW50ZXIgdGhhdCBjb252ZXJ0cyBmcm9tIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorLy8gb2YgbWFjaGluZS1kZXBlbmRlbnQgTExWTSBjb2RlIHRvIEdBUy1mb3JtYXQgTUJsYXplIGFzc2VtYmx5IGxhbmd1YWdlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibWJsYXplLWFzbS1wcmludGVyIgorCisjaW5jbHVkZSAiTUJsYXplLmgiCisjaW5jbHVkZSAiTUJsYXplU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiTUJsYXplSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiTUJsYXplVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIk1CbGF6ZU1hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Bc21QcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTdHJlYW1lci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L01hbmdsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjY3R5cGU+CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBjbGFzcyBNQmxhemVBc21QcmludGVyIDogcHVibGljIEFzbVByaW50ZXIgeworICAgIGNvbnN0IE1CbGF6ZVN1YnRhcmdldCAqU3VidGFyZ2V0OworICBwdWJsaWM6CisgICAgZXhwbGljaXQgTUJsYXplQXNtUHJpbnRlcihUYXJnZXRNYWNoaW5lICZUTSwgTUNTdHJlYW1lciAmU3RyZWFtZXIpCisgICAgICA6IEFzbVByaW50ZXIoVE0sIFN0cmVhbWVyKSB7CisgICAgICBTdWJ0YXJnZXQgPSAmVE0uZ2V0U3VidGFyZ2V0PE1CbGF6ZVN1YnRhcmdldD4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJNQmxhemUgQXNzZW1ibHkgUHJpbnRlciI7CisgICAgfQorCisgICAgYm9vbCBQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRVbnNpZ25lZEltbShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50RlNMSW1tKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRNZW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXIgPSAwKTsKKyAgICB2b2lkIHByaW50RkNDT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyID0gMCk7CisgICAgdm9pZCBwcmludFNhdmVkUmVnc0JpdG1hc2socmF3X29zdHJlYW0gJk9TKTsKKworICAgIGNvbnN0IGNoYXIgKmVtaXRDdXJyZW50QUJJU3RyaW5nKCk7CisgICAgdm9pZCBlbWl0RnJhbWVEaXJlY3RpdmUoKTsKKworICAgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSkgeyAKKyAgICAgIFNtYWxsU3RyaW5nPDEyOD4gU3RyOworICAgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhTdHIpOworICAgICAgcHJpbnRJbnN0cnVjdGlvbihNSSwgT1MpOworICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoT1Muc3RyKCkpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uQm9keVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIEVtaXRGdW5jdGlvbkJvZHlFbmQoKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0UmVnaXN0ZXJOYW1lKHVuc2lnbmVkIFJlZ05vKTsKKworICAgIHZpcnR1YWwgdm9pZCBFbWl0RnVuY3Rpb25FbnRyeUxhYmVsKCk7CisgIH07Cit9IC8vIGVuZCBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKyNpbmNsdWRlICJNQmxhemVHZW5Bc21Xcml0ZXIuaW5jIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBNQmxhemUgQXNtIERpcmVjdGl2ZXMKKy8vCisvLyAgLS0gRnJhbWUgZGlyZWN0aXZlICJmcmFtZSBTdGFja3BvaW50ZXIsIFN0YWNrc2l6ZSwgUkFSZWdpc3RlciIKKy8vICBEZXNjcmliZSB0aGUgc3RhY2sgZnJhbWUuCisvLworLy8gIC0tIE1hc2sgZGlyZWN0aXZlcyAibWFzayAgYml0bWFzaywgb2Zmc2V0IgorLy8gIFRlbGxzIHRoZSBhc3NlbWJsZXIgd2hpY2ggcmVnaXN0ZXJzIGFyZSBzYXZlZCBhbmQgd2hlcmUuCisvLyAgYml0bWFzayAtIGNvbnRhaW4gYSBsaXR0bGUgZW5kaWFuIGJpdHNldCBpbmRpY2F0aW5nIHdoaWNoIHJlZ2lzdGVycyBhcmUKKy8vICAgICAgICAgICAgc2F2ZWQgb24gZnVuY3Rpb24gcHJvbG9ndWUgKGUuZy4gd2l0aCBhIDB4ODAwMDAwMDAgbWFzaywgdGhlCisvLyAgICAgICAgICAgIGFzc2VtYmxlciBrbm93cyB0aGUgcmVnaXN0ZXIgMzEgKFJBKSBpcyBzYXZlZCBhdCBwcm9sb2d1ZS4KKy8vICBvZmZzZXQgIC0gdGhlIHBvc2l0aW9uIGJlZm9yZSBzdGFjayBwb2ludGVyIHN1YnRyYWN0aW9uIGluZGljYXRpbmcgd2hlcmUKKy8vICAgICAgICAgICAgdGhlIGZpcnN0IHNhdmVkIHJlZ2lzdGVyIG9uIHByb2xvZ3VlIGlzIGxvY2F0ZWQuIChlLmcuIHdpdGggYQorLy8KKy8vICBDb25zaWRlciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHByb2xvZ3VlOgorLy8KKy8vICAgIC5mcmFtZSAgUjE5LDQ4LFIxNQorLy8gICAgLm1hc2sgICAweGMwMDAwMDAwLC04CisvLyAgICAgICBhZGRpdSBSMSwgUjEsIC00OAorLy8gICAgICAgc3cgUjE1LCA0MChSMSkKKy8vICAgICAgIHN3IFIxOSwgMzYoUjEpCisvLworLy8gICAgV2l0aCBhIDB4YzAwMDAwMDAgbWFzaywgdGhlIGFzc2VtYmxlciBrbm93cyB0aGUgcmVnaXN0ZXIgMTUgKFIxNSkgYW5kCisvLyAgICAxOSAoUjE5KSBhcmUgc2F2ZWQgYXQgcHJvbG9ndWUuIEFzIHRoZSBzYXZlIG9yZGVyIG9uIHByb2xvZ3VlIGlzIGZyb20KKy8vICAgIGxlZnQgdG8gcmlnaHQsIFIxNSBpcyBzYXZlZCBmaXJzdC4gQSAtOCBvZmZzZXQgbWVhbnMgdGhhdCBhZnRlciB0aGUKKy8vICAgIHN0YWNrIHBvaW50ZXIgc3VidHJhdGlvbiwgdGhlIGZpcnN0IHJlZ2lzdGVyIGluIHRoZSBtYXNrIChSMTUpIHdpbGwgYmUKKy8vICAgIHNhdmVkIGF0IGFkZHJlc3MgNDgtOD00MC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWFzayBkaXJlY3RpdmVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBQcmludCBhIDMyIGJpdCBoZXggbnVtYmVyIHdpdGggYWxsIG51bWJlcnMuCitzdGF0aWMgdm9pZCBwcmludEhleDMyKHVuc2lnbmVkIGludCBWYWx1ZSwgcmF3X29zdHJlYW0gJk8pIHsKKyAgTyA8PCAiMHgiOworICBmb3IgKGludCBpID0gNzsgaSA+PSAwOyBpLS0pCisgICAgTyA8PCB1dG9oZXhzdHIoKFZhbHVlICYgKDB4RiA8PCAoaSo0KSkpID4+IChpKjQpKTsKK30KKworCisvLyBDcmVhdGUgYSBiaXRtYXNrIHdpdGggYWxsIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgZm9yIENQVSBvciBGbG9hdGluZyBQb2ludAorLy8gcmVnaXN0ZXJzLiBGb3IgQ1BVIHJlZ2lzdGVycyBjb25zaWRlciBSQSwgR1AgYW5kIEZQIGZvciBzYXZpbmcgaWYgbmVjZXNzYXJ5Lgordm9pZCBNQmxhemVBc21QcmludGVyOjpwcmludFNhdmVkUmVnc0JpdG1hc2socmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZSSSA9ICpUTS5nZXRSZWdpc3RlckluZm8oKTsKKyAgY29uc3QgTUJsYXplRnVuY3Rpb25JbmZvICpNQmxhemVGSSA9IE1GLT5nZXRJbmZvPE1CbGF6ZUZ1bmN0aW9uSW5mbz4oKTsKKworICAvLyBDUFUgU2F2ZWQgUmVnaXN0ZXJzIEJpdG1hc2tzCisgIHVuc2lnbmVkIGludCBDUFVCaXRtYXNrID0gMDsKKworICAvLyBTZXQgdGhlIENQVSBCaXRtYXNrcworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi0+Z2V0RnJhbWVJbmZvKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSA9IE1GSS0+Z2V0Q2FsbGVlU2F2ZWRJbmZvKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDU0kuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIFJlZyA9IENTSVtpXS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBSZWdOdW0gPSBNQmxhemVSZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKFJlZyk7CisgICAgaWYgKE1CbGF6ZTo6Q1BVUmVnc1JlZ2lzdGVyQ2xhc3MtPmNvbnRhaW5zKFJlZykpCisgICAgICBDUFVCaXRtYXNrIHw9ICgxIDw8IFJlZ051bSk7CisgIH0KKworICAvLyBSZXR1cm4gQWRkcmVzcyBhbmQgRnJhbWUgcmVnaXN0ZXJzIG11c3QgYWxzbyBiZSBzZXQgaW4gQ1BVQml0bWFzay4KKyAgaWYgKFJJLmhhc0ZQKCpNRikpCisgICAgQ1BVQml0bWFzayB8PSAoMSA8PCBNQmxhemVSZWdpc3RlckluZm86OgorICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyTnVtYmVyaW5nKFJJLmdldEZyYW1lUmVnaXN0ZXIoKk1GKSkpOworCisgIGlmIChNRkktPmFkanVzdHNTdGFjaygpKQorICAgIENQVUJpdG1hc2sgfD0gKDEgPDwgTUJsYXplUmVnaXN0ZXJJbmZvOjoKKyAgICAgICAgICAgICAgICBnZXRSZWdpc3Rlck51bWJlcmluZyhSSS5nZXRSQVJlZ2lzdGVyKCkpKTsKKworICAvLyBQcmludCBDUFVCaXRtYXNrCisgIE8gPDwgIlx0Lm1hc2sgXHQiOyBwcmludEhleDMyKENQVUJpdG1hc2ssIE8pOworICBPIDw8ICcsJyA8PCBNQmxhemVGSS0+Z2V0Q1BVVG9wU2F2ZWRSZWdPZmYoKSA8PCAnXG4nOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRnJhbWUgYW5kIFNldCBkaXJlY3RpdmVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRnJhbWUgRGlyZWN0aXZlCit2b2lkIE1CbGF6ZUFzbVByaW50ZXI6OmVtaXRGcmFtZURpcmVjdGl2ZSgpIHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZSSSA9ICpUTS5nZXRSZWdpc3RlckluZm8oKTsKKworICB1bnNpZ25lZCBzdGFja1JlZyAgPSBSSS5nZXRGcmFtZVJlZ2lzdGVyKCpNRik7CisgIHVuc2lnbmVkIHJldHVyblJlZyA9IFJJLmdldFJBUmVnaXN0ZXIoKTsKKyAgdW5zaWduZWQgc3RhY2tTaXplID0gTUYtPmdldEZyYW1lSW5mbygpLT5nZXRTdGFja1NpemUoKTsKKworCisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5mcmFtZVx0IiArIFR3aW5lKGdldFJlZ2lzdGVyTmFtZShzdGFja1JlZykpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiwiICsgVHdpbmUoc3RhY2tTaXplKSArICIsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKGdldFJlZ2lzdGVyTmFtZShyZXR1cm5SZWcpKSk7Cit9CisKK3ZvaWQgTUJsYXplQXNtUHJpbnRlcjo6RW1pdEZ1bmN0aW9uRW50cnlMYWJlbCgpIHsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LmVudFx0IiArIFR3aW5lKEN1cnJlbnRGblN5bS0+Z2V0TmFtZSgpKSk7CisgIE91dFN0cmVhbWVyLkVtaXRMYWJlbChDdXJyZW50Rm5TeW0pOworfQorCisvLy8gRW1pdEZ1bmN0aW9uQm9keVN0YXJ0IC0gVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBlbWl0IHN0dWZmIGJlZm9yZQorLy8vIHRoZSBmaXJzdCBiYXNpYyBibG9jayBpbiB0aGUgZnVuY3Rpb24uCit2b2lkIE1CbGF6ZUFzbVByaW50ZXI6OkVtaXRGdW5jdGlvbkJvZHlTdGFydCgpIHsKKyAgZW1pdEZyYW1lRGlyZWN0aXZlKCk7CisgIAorICBTbWFsbFN0cmluZzwxMjg+IFN0cjsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhTdHIpOworICBwcmludFNhdmVkUmVnc0JpdG1hc2soT1MpOworICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChPUy5zdHIoKSk7Cit9CisKKy8vLyBFbWl0RnVuY3Rpb25Cb2R5RW5kIC0gVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBlbWl0IHN0dWZmIGFmdGVyCisvLy8gdGhlIGxhc3QgYmFzaWMgYmxvY2sgaW4gdGhlIGZ1bmN0aW9uLgordm9pZCBNQmxhemVBc21QcmludGVyOjpFbWl0RnVuY3Rpb25Cb2R5RW5kKCkgeworICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHQuZW5kXHQiICsgVHdpbmUoQ3VycmVudEZuU3ltLT5nZXROYW1lKCkpKTsKK30KKworLy8gUHJpbnQgb3V0IGFuIG9wZXJhbmQgZm9yIGFuIGlubGluZSBhc20gZXhwcmVzc2lvbi4KK2Jvb2wgTUJsYXplQXNtUHJpbnRlcjo6CitQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwgcmF3X29zdHJlYW0gJk8pIHsKKyAgLy8gRG9lcyB0aGlzIGFzbSBvcGVyYW5kIGhhdmUgYSBzaW5nbGUgbGV0dGVyIG9wZXJhbmQgbW9kaWZpZXI/CisgIGlmIChFeHRyYUNvZGUgJiYgRXh0cmFDb2RlWzBdKQorICAgIHJldHVybiB0cnVlOyAvLyBVbmtub3duIG1vZGlmaWVyLgorCisgIHByaW50T3BlcmFuZChNSSwgT3BObywgTyk7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNQmxhemVBc21QcmludGVyOjpwcmludE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQob3BOdW0pOworCisgIHN3aXRjaCAoTU8uZ2V0VHlwZSgpKSB7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyOgorICAgIE8gPDwgZ2V0UmVnaXN0ZXJOYW1lKE1PLmdldFJlZygpKTsKKyAgICBicmVhazsKKworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgTyA8PCAoaW50KU1PLmdldEltbSgpOworICAgIGJyZWFrOworCisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ZQSW1tZWRpYXRlOiB7CisgICAgY29uc3QgQ29uc3RhbnRGUCAqZnAgPSBNTy5nZXRGUEltbSgpOworICAgIHByaW50SGV4MzIoZnAtPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKS5nZXRaRXh0VmFsdWUoKSwgTyk7CisgICAgTyA8PCAiO1x0IyBpbW1lZGlhdGUgPSAiIDw8ICpmcDsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrOgorICAgIE8gPDwgKk1PLmdldE1CQigpLT5nZXRTeW1ib2woKTsKKyAgICByZXR1cm47CisKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fR2xvYmFsQWRkcmVzczoKKyAgICBPIDw8ICpNYW5nLT5nZXRTeW1ib2woTU8uZ2V0R2xvYmFsKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOgorICAgIE8gPDwgKkdldEV4dGVybmFsU3ltYm9sU3ltYm9sKE1PLmdldFN5bWJvbE5hbWUoKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSA8PCAiSlRJIiA8PCBnZXRGdW5jdGlvbk51bWJlcigpCisgICAgPDwgJ18nIDw8IE1PLmdldEluZGV4KCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fQ29uc3RhbnRQb29sSW5kZXg6CisgICAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSA8PCAiQ1BJIgorICAgICAgPDwgZ2V0RnVuY3Rpb25OdW1iZXIoKSA8PCAiXyIgPDwgTU8uZ2V0SW5kZXgoKTsKKyAgICBpZiAoTU8uZ2V0T2Zmc2V0KCkpCisgICAgICBPIDw8ICIrIiA8PCBNTy5nZXRPZmZzZXQoKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIjx1bmtub3duIG9wZXJhbmQgdHlwZT4iKTsKKyAgfQorfQorCit2b2lkIE1CbGF6ZUFzbVByaW50ZXI6OnByaW50VW5zaWduZWRJbW0oY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKG9wTnVtKTsKKyAgaWYgKE1PLmlzSW1tKCkpCisgICAgTyA8PCAodW5zaWduZWQgaW50KU1PLmdldEltbSgpOworICBlbHNlCisgICAgcHJpbnRPcGVyYW5kKE1JLCBvcE51bSwgTyk7Cit9CisKK3ZvaWQgTUJsYXplQXNtUHJpbnRlcjo6cHJpbnRGU0xJbW0oY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChvcE51bSk7CisgIGlmIChNTy5pc0ltbSgpKQorICAgIE8gPDwgInJmc2wiIDw8ICh1bnNpZ25lZCBpbnQpTU8uZ2V0SW1tKCk7CisgIGVsc2UKKyAgICBwcmludE9wZXJhbmQoTUksIG9wTnVtLCBPKTsKK30KKwordm9pZCBNQmxhemVBc21QcmludGVyOjoKK3ByaW50TWVtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyKSB7CisgIHByaW50T3BlcmFuZChNSSwgb3BOdW0rMSwgTyk7CisgIE8gPDwgIiwgIjsKKyAgcHJpbnRPcGVyYW5kKE1JLCBvcE51bSwgTyk7Cit9CisKK3ZvaWQgTUJsYXplQXNtUHJpbnRlcjo6CitwcmludEZDQ09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLCByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllcikgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCYgTU8gPSBNSS0+Z2V0T3BlcmFuZChvcE51bSk7CisgIE8gPDwgTUJsYXplOjpNQmxhemVGQ0NUb1N0cmluZygoTUJsYXplOjpDb25kQ29kZSlNTy5nZXRJbW0oKSk7Cit9CisKKy8vIEZvcmNlIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZU1CbGF6ZUFzbVByaW50ZXIoKSB7CisgIFJlZ2lzdGVyQXNtUHJpbnRlcjxNQmxhemVBc21QcmludGVyPiBYKFRoZU1CbGF6ZVRhcmdldCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9Bc21QcmludGVyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvQXNtUHJpbnRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQ2NTFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvQXNtUHJpbnRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjIz09PS0gbGliL1RhcmdldC9NQmxhemUvQXNtUHJpbnRlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1NQmxhemVBc21QcmludGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBNQmxhemUgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiCisjIHByaXZhdGUgaGVhZGVycworQ1BQLkZsYWdzICs9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODViZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI4IEBACitzZXQoTExWTV9UQVJHRVRfREVGSU5JVElPTlMgTUJsYXplLnRkKQorCit0YWJsZWdlbihNQmxhemVHZW5SZWdpc3RlckluZm8uaC5pbmMgLWdlbi1yZWdpc3Rlci1kZXNjLWhlYWRlcikKK3RhYmxlZ2VuKE1CbGF6ZUdlblJlZ2lzdGVyTmFtZXMuaW5jIC1nZW4tcmVnaXN0ZXItZW51bXMpCit0YWJsZWdlbihNQmxhemVHZW5SZWdpc3RlckluZm8uaW5jIC1nZW4tcmVnaXN0ZXItZGVzYykKK3RhYmxlZ2VuKE1CbGF6ZUdlbkluc3RyTmFtZXMuaW5jIC1nZW4taW5zdHItZW51bXMpCit0YWJsZWdlbihNQmxhemVHZW5JbnN0ckluZm8uaW5jIC1nZW4taW5zdHItZGVzYykKK3RhYmxlZ2VuKE1CbGF6ZUdlbkFzbVdyaXRlci5pbmMgLWdlbi1hc20td3JpdGVyKQordGFibGVnZW4oTUJsYXplR2VuREFHSVNlbC5pbmMgLWdlbi1kYWctaXNlbCkKK3RhYmxlZ2VuKE1CbGF6ZUdlbkNhbGxpbmdDb252LmluYyAtZ2VuLWNhbGxpbmdjb252KQordGFibGVnZW4oTUJsYXplR2VuU3VidGFyZ2V0LmluYyAtZ2VuLXN1YnRhcmdldCkKK3RhYmxlZ2VuKE1CbGF6ZUdlbkludHJpbnNpY3MuaW5jIC1nZW4tdGd0LWludHJpbnNpYykKKworYWRkX2xsdm1fdGFyZ2V0KE1CbGF6ZUNvZGVHZW4KKyAgTUJsYXplRGVsYXlTbG90RmlsbGVyLmNwcAorICBNQmxhemVJbnN0ckluZm8uY3BwCisgIE1CbGF6ZUlTZWxEQUdUb0RBRy5jcHAKKyAgTUJsYXplSVNlbExvd2VyaW5nLmNwcAorICBNQmxhemVNQ0FzbUluZm8uY3BwCisgIE1CbGF6ZVJlZ2lzdGVySW5mby5jcHAKKyAgTUJsYXplU3VidGFyZ2V0LmNwcAorICBNQmxhemVUYXJnZXRNYWNoaW5lLmNwcAorICBNQmxhemVUYXJnZXRPYmplY3RGaWxlLmNwcAorICBNQmxhemVJbnRyaW5zaWNJbmZvLmNwcAorICBNQmxhemVTZWxlY3Rpb25EQUdJbmZvLmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoTExWTU1CbGF6ZUNvZGVHZW4gTExWTVNlbGVjdGlvbkRBRykKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkODI4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vPT09LS0gTUJsYXplLmggLSBUb3AtbGV2ZWwgaW50ZXJmYWNlIGZvciBNQmxhemUgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBlbnRyeSBwb2ludHMgZm9yIGdsb2JhbCBmdW5jdGlvbnMgZGVmaW5lZCBpbgorLy8gdGhlIExMVk0gTUJsYXplIGJhY2stZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVEFSR0VUX01CTEFaRV9ICisjZGVmaW5lIFRBUkdFVF9NQkxBWkVfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1CbGF6ZVRhcmdldE1hY2hpbmU7CisgIGNsYXNzIEZ1bmN0aW9uUGFzczsKKyAgY2xhc3MgTWFjaGluZUNvZGVFbWl0dGVyOworICBjbGFzcyBmb3JtYXR0ZWRfcmF3X29zdHJlYW07CisKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNQmxhemVJU2VsRGFnKE1CbGF6ZVRhcmdldE1hY2hpbmUgJlRNKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNQmxhemVEZWxheVNsb3RGaWxsZXJQYXNzKE1CbGF6ZVRhcmdldE1hY2hpbmUgJlRNKTsKKworICBleHRlcm4gVGFyZ2V0IFRoZU1CbGF6ZVRhcmdldDsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtOworCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciBNQmxhemUgcmVnaXN0ZXJzLiAgVGhpcyBkZWZpbmVzIGEgbWFwcGluZyBmcm9tCisvLyByZWdpc3RlciBuYW1lIHRvIHJlZ2lzdGVyIG51bWJlci4KKyNpbmNsdWRlICJNQmxhemVHZW5SZWdpc3Rlck5hbWVzLmluYyIKKworLy8gRGVmaW5lcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIE1CbGF6ZSBpbnN0cnVjdGlvbnMuCisjaW5jbHVkZSAiTUJsYXplR2VuSW5zdHJOYW1lcy5pbmMiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmRkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemUudGQKQEAgLTAsMCArMSw4MSBAQAorLy89PT0tIE1CbGF6ZS50ZCAtIERlc2NyaWJlIHRoZSBNQmxhemUgVGFyZ2V0IE1hY2hpbmUgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCBlbnRyeSBwb2ludCBmb3IgdGhlIE1CbGF6ZSB0YXJnZXQuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldC50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJlZ2lzdGVyIEZpbGUsIENhbGxpbmcgQ29udiwgSW5zdHJ1Y3Rpb24gRGVzY3JpcHRpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitpbmNsdWRlICJNQmxhemVSZWdpc3RlckluZm8udGQiCitpbmNsdWRlICJNQmxhemVTY2hlZHVsZS50ZCIKK2luY2x1ZGUgIk1CbGF6ZUludHJpbnNpY3MudGQiCitpbmNsdWRlICJNQmxhemVJbnN0ckluZm8udGQiCitpbmNsdWRlICJNQmxhemVDYWxsaW5nQ29udi50ZCIKKworZGVmIE1CbGF6ZUluc3RySW5mbyA6IEluc3RySW5mbzsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1pY3JvYmxhemUgU3VidGFyZ2V0IGZlYXR1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgRmVhdHVyZVBpcGUzICAgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwicGlwZTMiLCAiSGFzUGlwZTMiLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBsZW1lbnRzIDMtc3RhZ2UgcGlwZWxpbmUuIj47CitkZWYgRmVhdHVyZUJhcnJlbCAgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwiYmFycmVsIiwgIkhhc0JhcnJlbCIsICJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltcGxlbWVudHMgYmFycmVsIHNoaWZ0ZXIuIj47CitkZWYgRmVhdHVyZURpdiAgICAgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwiZGl2IiwgIkhhc0RpdiIsICJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltcGxlbWVudHMgaGFyZHdhcmUgZGl2aWRlci4iPjsKK2RlZiBGZWF0dXJlTXVsICAgICAgICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJtdWwiLCAiSGFzTXVsIiwgInRydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wbGVtZW50cyBoYXJkd2FyZSBtdWx0aXBsaWVyLiI+OworZGVmIEZlYXR1cmVGU0wgICAgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8ImZzbCIsICJIYXNGU0wiLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBsZW1lbnRzIEZTTCBpbnN0cnVjdGlvbnMuIj47CitkZWYgRmVhdHVyZUVGU0wgICAgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwiZWZzbCIsICJIYXNFRlNMIiwgInRydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wbGVtZW50cyBleHRlbmRlZCBGU0wgaW5zdHJ1Y3Rpb25zLiI+OworZGVmIEZlYXR1cmVNU1JTZXQgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8Im1zcnNldCIsICJIYXNNU1JTZXQiLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBsZW1lbnRzIE1TUiByZWdpc3RlciBzZXQgYW5kIGNsZWFyLiI+OworZGVmIEZlYXR1cmVFeGNlcHRpb24gICA6IFN1YnRhcmdldEZlYXR1cmU8ImV4Y2VwdGlvbiIsICJIYXNFeGNlcHRpb24iLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBsZW1lbnRzIGhhcmR3YXJlIGV4Y2VwdGlvbiBzdXBwb3J0LiI+OworZGVmIEZlYXR1cmVQYXRDbXAgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8InBhdGNtcCIsICJIYXNQYXRDbXAiLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBsZW1lbnRzIHBhdHRlcm4gY29tcGFyZSBpbnN0cnVjdGlvbi4iPjsKK2RlZiBGZWF0dXJlRlBVICAgICAgICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJmcHUiLCAiSGFzRlBVIiwgInRydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wbGVtZW50cyBmbG9hdGluZyBwb2ludCB1bml0LiI+OworZGVmIEZlYXR1cmVFU1IgICAgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8ImVzciIsICJIYXNFU1IiLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBsZW1lbnRzIEVTUiBhbmQgRUFSIHJlZ2lzdGVycyI+OworZGVmIEZlYXR1cmVQVlIgICAgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8InB2ciIsICJIYXNQVlIiLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBsZW1lbnRzIHByb2Nlc3NvciB2ZXJzaW9uIHJlZ2lzdGVyLiI+OworZGVmIEZlYXR1cmVNdWw2NCAgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8Im11bDY0IiwgIkhhc011bDY0IiwgInRydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wbGVtZW50cyBtdWx0aXBsaWVyIHdpdGggNjQtYml0IHJlc3VsdCI+OworZGVmIEZlYXR1cmVTcXJ0ICAgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8InNxcnQiLCAiSGFzU3FydCIsICJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltcGxlbWVudHMgc3FydCBhbmQgZmxvYXRpbmcgcG9pbnQgY29udmVydC4iPjsKK2RlZiBGZWF0dXJlTU1VICAgICAgICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJtbXUiLCAiSGFzTU1VIiwgInRydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wbGVtZW50cyBtZW1vcnkgbWFuYWdlbWVudCB1bml0LiI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUJsYXplIHByb2Nlc3NvcnMgc3VwcG9ydGVkLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgUHJvYzxzdHJpbmcgTmFtZSwgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBGZWF0dXJlcz4KKyA6IFByb2Nlc3NvcjxOYW1lLCBNQmxhemVHZW5lcmljSXRpbmVyYXJpZXMsIEZlYXR1cmVzPjsKKworCitkZWYgOiBQcm9jPCJ2NDAwIiwgW10+OworZGVmIDogUHJvYzwidjUwMCIsIFtdPjsKK2RlZiA6IFByb2M8InY2MDAiLCBbXT47CitkZWYgOiBQcm9jPCJ2NzAwIiwgW10+OworZGVmIDogUHJvYzwidjcxMCIsIFtdPjsKKworZGVmIE1CbGF6ZSA6IFRhcmdldCB7CisgIGxldCBJbnN0cnVjdGlvblNldCA9IE1CbGF6ZUluc3RySW5mbzsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUNhbGxpbmdDb252LnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplQ2FsbGluZ0NvbnYudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkNDk5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUNhbGxpbmdDb252LnRkCkBAIC0wLDAgKzEsMjYgQEAKKy8vPT09LSBNQmxhemVDYWxsaW5nQ29udi50ZCAtIENhbGxpbmcgQ29udmVudGlvbnMgZm9yIE1CbGF6ZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgZGVzY3JpYmVzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciBNQmxhemUgYXJjaGl0ZWN0dXJlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIENDSWZTdWJ0YXJnZXQgLSBNYXRjaCBpZiB0aGUgY3VycmVudCBzdWJ0YXJnZXQgaGFzIGEgZmVhdHVyZSBGLgorY2xhc3MgQ0NJZlN1YnRhcmdldDxzdHJpbmcgRiwgQ0NBY3Rpb24gQT46IAorICBDQ0lmPCFzdHJjb25jYXQoIlN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxNQmxhemVTdWJ0YXJnZXQ+KCkuIiwgRiksIEE+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUJsYXplIEFCSSBDYWxsaW5nIENvbnZlbnRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiBSZXRDQ19NQmxhemUgOiBDYWxsaW5nQ29udjxbCisgIC8vIGkzMiBhcmUgcmV0dXJuZWQgaW4gcmVnaXN0ZXJzIFIzLCBSNAorICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbUjMsIFI0XT4+LAorCisgIC8vIGYzMiBhcmUgcmV0dXJuZWQgaW4gcmVnaXN0ZXJzIEYzLCBGNAorICBDQ0lmVHlwZTxbZjMyXSwgQ0NBc3NpZ25Ub1JlZzxbRjMsIEY0XT4+CitdPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZURlbGF5U2xvdEZpbGxlci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVEZWxheVNsb3RGaWxsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTFiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVEZWxheVNsb3RGaWxsZXIuY3BwCkBAIC0wLDAgKzEsNzUgQEAKKy8vPT09LS0gRGVsYXlTbG90RmlsbGVyLmNwcCAtIE1CbGF6ZSBkZWxheSBzbG90IGZpbGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU2ltcGxlIHBhc3MgdG8gZmlsbHMgZGVsYXkgc2xvdHMgd2l0aCBOT1BzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiZGVsYXktc2xvdC1maWxsZXIiCisKKyNpbmNsdWRlICJNQmxhemUuaCIKKyNpbmNsdWRlICJNQmxhemVUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKEZpbGxlZFNsb3RzLCAiTnVtYmVyIG9mIGRlbGF5IHNsb3RzIGZpbGxlZCIpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRmlsbGVyIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworCisgICAgVGFyZ2V0TWFjaGluZSAmVE07CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBGaWxsZXIoVGFyZ2V0TWFjaGluZSAmdG0pIAorICAgICAgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwgVE0odG0pLCBUSUkodG0uZ2V0SW5zdHJJbmZvKCkpIHsgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiTUJsYXplIERlbGF5IFNsb3QgRmlsbGVyIjsKKyAgICB9CisKKyAgICBib29sIHJ1bk9uTWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisgICAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIHsKKyAgICAgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICAgICAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEZJID0gRi5iZWdpbigpLCBGRSA9IEYuZW5kKCk7CisgICAgICAgICAgIEZJICE9IEZFOyArK0ZJKQorICAgICAgICBDaGFuZ2VkIHw9IHJ1bk9uTWFjaGluZUJhc2ljQmxvY2soKkZJKTsKKyAgICAgIHJldHVybiBDaGFuZ2VkOworICAgIH0KKworICB9OworICBjaGFyIEZpbGxlcjo6SUQgPSAwOworfSAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLy8gcnVuT25NYWNoaW5lQmFzaWNCbG9jayAtIEZpbGwgaW4gZGVsYXkgc2xvdHMgZm9yIHRoZSBnaXZlbiBiYXNpYyBibG9jay4KKy8vLyBDdXJyZW50bHksIHdlIGZpbGwgZGVsYXkgc2xvdHMgd2l0aCBOT1BzLiBXZSBhc3N1bWUgdGhlcmUgaXMgb25seSBvbmUKKy8vLyBkZWxheSBzbG90IHBlciBkZWxheWVkIGluc3RydWN0aW9uLgorYm9vbCBGaWxsZXI6OnJ1bk9uTWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5iZWdpbigpOyBJICE9IE1CQi5lbmQoKTsgKytJKQorICAgIGlmIChJLT5nZXREZXNjKCkuaGFzRGVsYXlTbG90KCkpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBKID0gSTsKKyAgICAgICsrSjsKKyAgICAgIEJ1aWxkTUkoTUJCLCBKLCBJLT5nZXREZWJ1Z0xvYygpLCBUSUktPmdldChNQmxhemU6Ok5PUCkpOworICAgICAgKytGaWxsZWRTbG90czsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBjcmVhdGVNQmxhemVEZWxheVNsb3RGaWxsZXJQYXNzIC0gUmV0dXJucyBhIHBhc3MgdGhhdCBmaWxscyBpbiBkZWxheQorLy8vIHNsb3RzIGluIE1CbGF6ZSBNYWNoaW5lRnVuY3Rpb25zCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZU1CbGF6ZURlbGF5U2xvdEZpbGxlclBhc3MoTUJsYXplVGFyZ2V0TWFjaGluZSAmdG0pIHsKKyAgcmV0dXJuIG5ldyBGaWxsZXIodG0pOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVJU2VsREFHVG9EQUcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSVNlbERBR1RvREFHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2NkNWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSVNlbERBR1RvREFHLmNwcApAQCAtMCwwICsxLDMzOCBAQAorLy89PT0tLSBNQmxhemVJU2VsREFHVG9EQUcuY3BwIC0gQSBkYWcgdG8gZGFnIGluc3Qgc2VsZWN0b3IgZm9yIE1CbGF6ZSAtLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBpbnN0cnVjdGlvbiBzZWxlY3RvciBmb3IgdGhlIE1CbGF6ZSB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJtYmxhemUtaXNlbCIKKyNpbmNsdWRlICJNQmxhemUuaCIKKyNpbmNsdWRlICJNQmxhemVNYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJNQmxhemVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJNQmxhemVTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJNQmxhemVUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIFNlbGVjdG9yIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUJsYXplREFHVG9EQUdJU2VsIC0gTUJsYXplIHNwZWNpZmljIGNvZGUgdG8gc2VsZWN0IE1CbGF6ZSBtYWNoaW5lCisvLyBpbnN0cnVjdGlvbnMgZm9yIFNlbGVjdGlvbkRBRyBvcGVyYXRpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK25hbWVzcGFjZSB7CisKK2NsYXNzIE1CbGF6ZURBR1RvREFHSVNlbCA6IHB1YmxpYyBTZWxlY3Rpb25EQUdJU2VsIHsKKworICAvLy8gVE0gLSBLZWVwIGEgcmVmZXJlbmNlIHRvIE1CbGF6ZVRhcmdldE1hY2hpbmUuCisgIE1CbGF6ZVRhcmdldE1hY2hpbmUgJlRNOworCisgIC8vLyBTdWJ0YXJnZXQgLSBLZWVwIGEgcG9pbnRlciB0byB0aGUgTUJsYXplU3VidGFyZ2V0IGFyb3VuZCBzbyB0aGF0IHdlIGNhbgorICAvLy8gbWFrZSB0aGUgcmlnaHQgZGVjaXNpb24gd2hlbiBnZW5lcmF0aW5nIGNvZGUgZm9yIGRpZmZlcmVudCB0YXJnZXRzLgorICBjb25zdCBNQmxhemVTdWJ0YXJnZXQgJlN1YnRhcmdldDsKKworcHVibGljOgorICBleHBsaWNpdCBNQmxhemVEQUdUb0RBR0lTZWwoTUJsYXplVGFyZ2V0TWFjaGluZSAmdG0pIDoKKyAgU2VsZWN0aW9uREFHSVNlbCh0bSksCisgIFRNKHRtKSwgU3VidGFyZ2V0KHRtLmdldFN1YnRhcmdldDxNQmxhemVTdWJ0YXJnZXQ+KCkpIHt9CisKKyAgLy8gUGFzcyBOYW1lCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJNQmxhemUgREFHLT5EQUcgUGF0dGVybiBJbnN0cnVjdGlvbiBTZWxlY3Rpb24iOworICB9Citwcml2YXRlOgorICAvLyBJbmNsdWRlIHRoZSBwaWVjZXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSB0YXJnZXQgZGVzY3JpcHRpb24uCisgICNpbmNsdWRlICJNQmxhemVHZW5EQUdJU2VsLmluYyIKKworICAvLy8gZ2V0VGFyZ2V0TWFjaGluZSAtIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgVGFyZ2V0TWFjaGluZSwgY2FzdGVkCisgIC8vLyB0byB0aGUgdGFyZ2V0LXNwZWNpZmljIHR5cGUuCisgIGNvbnN0IE1CbGF6ZVRhcmdldE1hY2hpbmUgJmdldFRhcmdldE1hY2hpbmUoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IE1CbGF6ZVRhcmdldE1hY2hpbmUgJj4oVE0pOworICB9CisKKyAgLy8vIGdldEluc3RySW5mbyAtIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgVGFyZ2V0SW5zdHJJbmZvLCBjYXN0ZWQKKyAgLy8vIHRvIHRoZSB0YXJnZXQtc3BlY2lmaWMgdHlwZS4KKyAgY29uc3QgTUJsYXplSW5zdHJJbmZvICpnZXRJbnN0ckluZm8oKSB7CisgICAgcmV0dXJuIGdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKyAgfQorCisgIFNETm9kZSAqZ2V0R2xvYmFsQmFzZVJlZygpOworICBTRE5vZGUgKlNlbGVjdChTRE5vZGUgKk4pOworCisgIC8vIENvbXBsZXggUGF0dGVybi4KKyAgYm9vbCBTZWxlY3RBZGRyKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJk9mZnNldCk7CisKKyAgLy8gQWRkcmVzcyBTZWxlY3Rpb24KKyAgYm9vbCBTZWxlY3RBZGRyUmVnUmVnKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmSW5kZXgpOworICBib29sIFNlbGVjdEFkZHJSZWdJbW0oU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZEaXNwLCBTRFZhbHVlICZCYXNlKTsKKworICAvLyBnZXRJMzJJbW0gLSBSZXR1cm4gYSB0YXJnZXQgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLCBvZiB0eXBlIGkzMi4KKyAgaW5saW5lIFNEVmFsdWUgZ2V0STMySW1tKHVuc2lnbmVkIEltbSkgeworICAgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEltbSwgTVZUOjppMzIpOworICB9Cit9OworCit9CisKKy8vLyBpc0ludFMzMkltbWVkaWF0ZSAtIFRoaXMgbWV0aG9kIHRlc3RzIHRvIHNlZSBpZiB0aGUgbm9kZSBpcyBlaXRoZXIgYSAzMi1iaXQKKy8vLyBvciA2NC1iaXQgaW1tZWRpYXRlLCBhbmQgaWYgdGhlIHZhbHVlIGNhbiBiZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkIGFzIGEKKy8vLyBzaWduIGV4dGVuc2lvbiBmcm9tIGEgMzItYml0IHZhbHVlLiAgSWYgc28sIHRoaXMgcmV0dXJucyB0cnVlIGFuZCB0aGUKKy8vLyBpbW1lZGlhdGUuCitzdGF0aWMgYm9vbCBpc0ludFMzMkltbWVkaWF0ZShTRE5vZGUgKk4sIGludDMyX3QgJkltbSkgeworICB1bnNpZ25lZCBPcGMgPSBOLT5nZXRPcGNvZGUoKTsKKyAgaWYgKE9wYyAhPSBJU0Q6OkNvbnN0YW50KQorICAgIHJldHVybiBmYWxzZTsKKworICBJbW0gPSAoaW50MzJfdCljYXN0PENvbnN0YW50U0ROb2RlPihOKS0+Z2V0WkV4dFZhbHVlKCk7CisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIpCisgICAgcmV0dXJuIEltbSA9PSAoaW50MzJfdCljYXN0PENvbnN0YW50U0ROb2RlPihOKS0+Z2V0WkV4dFZhbHVlKCk7CisgIGVsc2UKKyAgICByZXR1cm4gSW1tID09IChpbnQ2NF90KWNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4pLT5nZXRaRXh0VmFsdWUoKTsKK30KKworc3RhdGljIGJvb2wgaXNJbnRTMzJJbW1lZGlhdGUoU0RWYWx1ZSBPcCwgaW50MzJfdCAmSW1tKSB7CisgIHJldHVybiBpc0ludFMzMkltbWVkaWF0ZShPcC5nZXROb2RlKCksIEltbSk7Cit9CisKKworLy8vIFNlbGVjdEFkZHJlc3NSZWdSZWcgLSBHaXZlbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3NlZCwgY2hlY2sgdG8gc2VlIGlmIGl0CisvLy8gY2FuIGJlIHJlcHJlc2VudGVkIGFzIGFuIGluZGV4ZWQgW3Ircl0gb3BlcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBpZiBpdAorLy8vIGNhbiBiZSBtb3JlIGVmZmljaWVudGx5IHJlcHJlc2VudGVkIHdpdGggW3IraW1tXS4KK2Jvb2wgTUJsYXplREFHVG9EQUdJU2VsOjoKK1NlbGVjdEFkZHJSZWdSZWcoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZJbmRleCkgeworICBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZyYW1lSW5kZXgpIHJldHVybiBmYWxzZTsKKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbCB8fAorICAgICAgTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MpCisgICAgcmV0dXJuIGZhbHNlOyAgLy8gZGlyZWN0IGNhbGxzLgorCisgIGludDMyX3QgaW1tID0gMDsKKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQgfHwgTi5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok9SKSB7CisgICAgaWYgKGlzSW50UzMySW1tZWRpYXRlKE4uZ2V0T3BlcmFuZCgxKSwgaW1tKSkKKyAgICAgIHJldHVybiBmYWxzZTsgICAgLy8gcitpCisKKyAgICBpZiAoTi5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0SnVtcFRhYmxlIHx8CisgICAgICAgIE4uZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEp1bXBUYWJsZSkKKyAgICAgIHJldHVybiBmYWxzZTsgLy8ganVtcCB0YWJsZXMuCisKKyAgICBCYXNlID0gTi5nZXRPcGVyYW5kKDEpOworICAgIEluZGV4ID0gTi5nZXRPcGVyYW5kKDApOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIE4gY2FuIGJlIHJlcHJlc2VudGVkIGJ5IGEgYmFzZSByZWdpc3RlciBwbHVzCisvLy8gYSBzaWduZWQgMzItYml0IGRpc3BsYWNlbWVudCBbcitpbW1dLCBhbmQgaWYgaXQgaXMgbm90IGJldHRlcgorLy8vIHJlcHJlc2VudGVkIGFzIHJlZytyZWcuCitib29sIE1CbGF6ZURBR1RvREFHSVNlbDo6CitTZWxlY3RBZGRyUmVnSW1tKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmRGlzcCwgU0RWYWx1ZSAmQmFzZSkgeworICAvLyBJZiB0aGlzIGNhbiBiZSBtb3JlIHByb2ZpdGFibHkgcmVhbGl6ZWQgYXMgcityLCBmYWlsLgorICBpZiAoU2VsZWN0QWRkclJlZ1JlZyhPcCwgTiwgRGlzcCwgQmFzZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChOLmdldE9wY29kZSgpID09IElTRDo6QUREIHx8IE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpPUikgeworICAgIGludDMyX3QgaW1tID0gMDsKKyAgICBpZiAoaXNJbnRTMzJJbW1lZGlhdGUoTi5nZXRPcGVyYW5kKDEpLCBpbW0pKSB7CisgICAgICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChpbW0sIE1WVDo6aTMyKTsKKyAgICAgIGlmIChGcmFtZUluZGV4U0ROb2RlICpGSSA9IGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KE4uZ2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSS0+Z2V0SW5kZXgoKSwgTi5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBCYXNlID0gTi5nZXRPcGVyYW5kKDApOworICAgICAgfQorICAgICAgREVCVUcoIGVycnMoKSA8PCAiV0VTTEVZOiBVc2luZyBPcGVyYW5kIEltbWVkaWF0ZVxuIiApOworICAgICAgcmV0dXJuIHRydWU7IC8vIFtyK2ldCisgICAgfQorICB9IGVsc2UgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOKSkgeworICAgIC8vIExvYWRpbmcgZnJvbSBhIGNvbnN0YW50IGFkZHJlc3MuCisgICAgdWludDMyX3QgSW1tID0gQ04tPmdldFpFeHRWYWx1ZSgpOworICAgIERpc3AgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEltbSwgQ04tPmdldFZhbHVlVHlwZSgwKSk7CisgICAgQmFzZSA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoTUJsYXplOjpSMCwgQ04tPmdldFZhbHVlVHlwZSgwKSk7CisgICAgREVCVUcoIGVycnMoKSA8PCAiV0VTTEVZOiBVc2luZyBDb25zdGFudCBOb2RlXG4iICk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBUTS5nZXRUYXJnZXRMb3dlcmluZygpLT5nZXRQb2ludGVyVHkoKSk7CisgIGlmIChGcmFtZUluZGV4U0ROb2RlICpGSSA9IGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KE4pKQorICAgIEJhc2UgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRkktPmdldEluZGV4KCksIE4uZ2V0VmFsdWVUeXBlKCkpOworICBlbHNlCisgICAgQmFzZSA9IE47CisgIHJldHVybiB0cnVlOyAgICAgIC8vIFtyKzBdCit9CisKKy8vLyBnZXRHbG9iYWxCYXNlUmVnIC0gT3V0cHV0IHRoZSBpbnN0cnVjdGlvbnMgcmVxdWlyZWQgdG8gcHV0IHRoZQorLy8vIEdPVCBhZGRyZXNzIGludG8gYSByZWdpc3Rlci4KK1NETm9kZSAqTUJsYXplREFHVG9EQUdJU2VsOjpnZXRHbG9iYWxCYXNlUmVnKCkgeworICB1bnNpZ25lZCBHbG9iYWxCYXNlUmVnID0gZ2V0SW5zdHJJbmZvKCktPmdldEdsb2JhbEJhc2VSZWcoTUYpOworICByZXR1cm4gQ3VyREFHLT5nZXRSZWdpc3RlcihHbG9iYWxCYXNlUmVnLCBUTEkuZ2V0UG9pbnRlclR5KCkpLmdldE5vZGUoKTsKK30KKworLy8vIENvbXBsZXhQYXR0ZXJuIHVzZWQgb24gTUJsYXplSW5zdHJJbmZvCisvLy8gVXNlZCBvbiBNQmxhemUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKK2Jvb2wgTUJsYXplREFHVG9EQUdJU2VsOjoKK1NlbGVjdEFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBBZGRyLCBTRFZhbHVlICZPZmZzZXQsIFNEVmFsdWUgJkJhc2UpIHsKKyAgLy8gaWYgQWRkcmVzcyBpcyBGSSwgZ2V0IHRoZSBUYXJnZXRGcmFtZUluZGV4LgorICBpZiAoRnJhbWVJbmRleFNETm9kZSAqRklOID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4oQWRkcikpIHsKKyAgICBCYXNlICAgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoRklOLT5nZXRJbmRleCgpLCBNVlQ6OmkzMik7CisgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBNVlQ6OmkzMik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBvbiBQSUMgY29kZSBMb2FkIEdBCisgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6UElDXykgeworICAgIGlmICgoQWRkci5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MpIHx8CisgICAgICAgIChBZGRyLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnRQb29sKSB8fAorICAgICAgICAoQWRkci5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEp1bXBUYWJsZSkpeworICAgICAgQmFzZSAgID0gQ3VyREFHLT5nZXRSZWdpc3RlcihNQmxhemU6OlIxNSwgTVZUOjppMzIpOworICAgICAgT2Zmc2V0ID0gQWRkcjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoKEFkZHIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbCB8fAorICAgICAgICBBZGRyLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsQWRkcmVzcykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBPcGVyYW5kIGlzIGEgcmVzdWx0IGZyb20gYW4gQURELgorICBpZiAoQWRkci5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIGlmIChDb25zdGFudFNETm9kZSAqQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oQWRkci5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgaWYgKFByZWRpY2F0ZV9pbW1TRXh0MTYoQ04pKSB7CisKKyAgICAgICAgLy8gSWYgdGhlIGZpcnN0IG9wZXJhbmQgaXMgYSBGSSwgZ2V0IHRoZSBUYXJnZXRGSSBOb2RlCisgICAgICAgIGlmIChGcmFtZUluZGV4U0ROb2RlICpGSU4gPSBkeW5fY2FzdDxGcmFtZUluZGV4U0ROb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFkZHIuZ2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRGcmFtZUluZGV4KEZJTi0+Z2V0SW5kZXgoKSwgTVZUOjppMzIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEJhc2UgPSBBZGRyLmdldE9wZXJhbmQoMCk7CisgICAgICAgIH0KKworICAgICAgICBPZmZzZXQgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KENOLT5nZXRaRXh0VmFsdWUoKSwgTVZUOjppMzIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBCYXNlICAgPSBBZGRyOworICBPZmZzZXQgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBTZWxlY3QgaW5zdHJ1Y3Rpb25zIG5vdCBjdXN0b21pemVkISBVc2VkIGZvcgorLy8vIGV4cGFuZGVkLCBwcm9tb3RlZCBhbmQgbm9ybWFsIGluc3RydWN0aW9ucworU0ROb2RlKiBNQmxhemVEQUdUb0RBR0lTZWw6OlNlbGVjdChTRE5vZGUgKk5vZGUpIHsKKyAgdW5zaWduZWQgT3Bjb2RlID0gTm9kZS0+Z2V0T3Bjb2RlKCk7CisgIERlYnVnTG9jIGRsID0gTm9kZS0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBEdW1wIGluZm9ybWF0aW9uIGFib3V0IHRoZSBOb2RlIGJlaW5nIHNlbGVjdGVkCisgIERFQlVHKGVycnMoKSA8PCAiU2VsZWN0aW5nOiAiOyBOb2RlLT5kdW1wKEN1ckRBRyk7IGVycnMoKSA8PCAiXG4iKTsKKworICAvLyBJZiB3ZSBoYXZlIGEgY3VzdG9tIG5vZGUsIHdlIGFscmVhZHkgaGF2ZSBzZWxlY3RlZCEKKyAgaWYgKE5vZGUtPmlzTWFjaGluZU9wY29kZSgpKSB7CisgICAgREVCVUcoZXJycygpIDw8ICI9PSAiOyBOb2RlLT5kdW1wKEN1ckRBRyk7IGVycnMoKSA8PCAiXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vLworICAvLyBJbnN0cnVjdGlvbiBTZWxlY3Rpb24gbm90IGhhbmRsZWQgYnkgdGhlIGF1dG8tZ2VuZXJhdGVkCisgIC8vIHRhYmxlZ2VuIHNlbGVjdGlvbiBzaG91bGQgYmUgaGFuZGxlZCBoZXJlLgorICAvLy8KKyAgc3dpdGNoKE9wY29kZSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworCisgICAgLy8gR2V0IHRhcmdldCBHT1QgYWRkcmVzcy4KKyAgICBjYXNlIElTRDo6R0xPQkFMX09GRlNFVF9UQUJMRToKKyAgICAgIHJldHVybiBnZXRHbG9iYWxCYXNlUmVnKCk7CisKKyAgICBjYXNlIElTRDo6RnJhbWVJbmRleDogeworICAgICAgICBTRFZhbHVlIGltbSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgICAgICBpbnQgRkkgPSBkeW5fY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOb2RlKS0+Z2V0SW5kZXgoKTsKKyAgICAgICAgRVZUIFZUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICAgICAgICBTRFZhbHVlIFRGSSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSSwgVlQpOworICAgICAgICB1bnNpZ25lZCBPcGMgPSBNQmxhemU6OkFEREk7CisgICAgICAgIGlmIChOb2RlLT5oYXNPbmVVc2UoKSkKKyAgICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTm9kZSwgT3BjLCBWVCwgVEZJLCBpbW0pOworICAgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBWVCwgVEZJLCBpbW0pOworICAgIH0KKworCisgICAgLy8vIEhhbmRsZSBkaXJlY3QgYW5kIGluZGlyZWN0IGNhbGxzIHdoZW4gdXNpbmcgUElDLiBPbiBQSUMsIHdoZW4KKyAgICAvLy8gR09UIGlzIHNtYWxsZXIgdGhhbiBhYm91dCA2NGsgKHNtYWxsIGNvZGUpIHRoZSBHQSB0YXJnZXQgaXMKKyAgICAvLy8gbG9hZGVkIHdpdGggb25seSBvbmUgaW5zdHJ1Y3Rpb24uIE90aGVyd2lzZSBHQSdzIHRhcmdldCBtdXN0CisgICAgLy8vIGJlIGxvYWRlZCB3aXRoIDMgaW5zdHJ1Y3Rpb25zLgorICAgIGNhc2UgTUJsYXplSVNEOjpKbXBMaW5rOiB7CisgICAgICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pIHsKKyAgICAgICAgU0RWYWx1ZSBDaGFpbiAgPSBOb2RlLT5nZXRPcGVyYW5kKDApOworICAgICAgICBTRFZhbHVlIENhbGxlZSA9IE5vZGUtPmdldE9wZXJhbmQoMSk7CisgICAgICAgIFNEVmFsdWUgUjIwUmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcihNQmxhemU6OlIyMCwgTVZUOjppMzIpOworICAgICAgICBTRFZhbHVlIEluRmxhZygwLCAwKTsKKworICAgICAgICBpZiAoIChpc2E8R2xvYmFsQWRkcmVzc1NETm9kZT4oQ2FsbGVlKSkgfHwKKyAgICAgICAgICAgICAoaXNhPEV4dGVybmFsU3ltYm9sU0ROb2RlPihDYWxsZWUpKSApCisgICAgICAgIHsKKyAgICAgICAgICAvLy8gRGlyZWN0IGNhbGwgZm9yIGdsb2JhbCBhZGRyZXNzZXMgYW5kIGV4dGVybmFsIHN5bWJvbHMKKyAgICAgICAgICBTRFZhbHVlIEdQUmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcihNQmxhemU6OlIxNSwgTVZUOjppMzIpOworCisgICAgICAgICAgLy8gVXNlIGxvYWQgdG8gZ2V0IEdPVCB0YXJnZXQKKyAgICAgICAgICBTRFZhbHVlIE9wc1tdID0geyBDYWxsZWUsIEdQUmVnLCBDaGFpbiB9OworICAgICAgICAgIFNEVmFsdWUgTG9hZCA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShNQmxhemU6OkxXLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTMyLCBNVlQ6Ok90aGVyLCBPcHMsIDMpLCAwKTsKKyAgICAgICAgICBDaGFpbiA9IExvYWQuZ2V0VmFsdWUoMSk7CisKKyAgICAgICAgICAvLyBDYWxsIHRhcmdldCBtdXN0IGJlIG9uIFQ5CisgICAgICAgICAgQ2hhaW4gPSBDdXJEQUctPmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFIyMFJlZywgTG9hZCwgSW5GbGFnKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgLy8vIEluZGlyZWN0IGNhbGwKKyAgICAgICAgICBDaGFpbiA9IEN1ckRBRy0+Z2V0Q29weVRvUmVnKENoYWluLCBkbCwgUjIwUmVnLCBDYWxsZWUsIEluRmxhZyk7CisKKyAgICAgICAgLy8gRW1pdCBKdW1wIGFuZCBMaW5rIFJlZ2lzdGVyCisgICAgICAgIFNETm9kZSAqUmVzTm9kZSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTUJsYXplOjpCUkxJRCwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpGbGFnLCBSMjBSZWcsIENoYWluKTsKKyAgICAgICAgQ2hhaW4gID0gU0RWYWx1ZShSZXNOb2RlLCAwKTsKKyAgICAgICAgSW5GbGFnID0gU0RWYWx1ZShSZXNOb2RlLCAxKTsKKyAgICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOb2RlLCAwKSwgQ2hhaW4pOworICAgICAgICBSZXBsYWNlVXNlcyhTRFZhbHVlKE5vZGUsIDEpLCBJbkZsYWcpOworICAgICAgICByZXR1cm4gUmVzTm9kZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBTZWxlY3QgdGhlIGRlZmF1bHQgaW5zdHJ1Y3Rpb24KKyAgU0ROb2RlICpSZXNOb2RlID0gU2VsZWN0Q29kZShOb2RlKTsKKworICBERUJVRyhlcnJzKCkgPDwgIj0+ICIpOworICBpZiAoUmVzTm9kZSA9PSBOVUxMIHx8IFJlc05vZGUgPT0gTm9kZSkKKyAgICBERUJVRyhOb2RlLT5kdW1wKEN1ckRBRykpOworICBlbHNlCisgICAgREVCVUcoUmVzTm9kZS0+ZHVtcChDdXJEQUcpKTsKKyAgREVCVUcoZXJycygpIDw8ICJcbiIpOworICByZXR1cm4gUmVzTm9kZTsKK30KKworLy8vIGNyZWF0ZU1CbGF6ZUlTZWxEYWcgLSBUaGlzIHBhc3MgY29udmVydHMgYSBsZWdhbGl6ZWQgREFHIGludG8gYQorLy8vIE1CbGF6ZS1zcGVjaWZpYyBEQUcsIHJlYWR5IGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVNQmxhemVJU2VsRGFnKE1CbGF6ZVRhcmdldE1hY2hpbmUgJlRNKSB7CisgIHJldHVybiBuZXcgTUJsYXplREFHVG9EQUdJU2VsKFRNKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUlTZWxMb3dlcmluZy5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVJU2VsTG93ZXJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MzBiNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVJU2VsTG93ZXJpbmcuY3BwCkBAIC0wLDAgKzEsOTcxIEBACisvLz09PS0tIE1CbGF6ZUlTZWxMb3dlcmluZy5jcHAgLSBNQmxhemUgREFHIExvd2VyaW5nIEltcGxlbWVudGF0aW9uIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgTUJsYXplIHVzZXMgdG8gbG93ZXIgTExWTSBjb2RlIGludG8gYQorLy8gc2VsZWN0aW9uIERBRy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgIm1ibGF6ZS1sb3dlciIKKyNpbmNsdWRlICJNQmxhemVJU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJNQmxhemVNYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJNQmxhemVUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiTUJsYXplVGFyZ2V0T2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgIk1CbGF6ZVN1YnRhcmdldC5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworY29uc3QgY2hhciAqTUJsYXplVGFyZ2V0TG93ZXJpbmc6OmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3QgeworICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGNhc2UgTUJsYXplSVNEOjpKbXBMaW5rICAgIDogcmV0dXJuICJNQmxhemVJU0Q6OkptcExpbmsiOworICAgIGNhc2UgTUJsYXplSVNEOjpHUFJlbCAgICAgIDogcmV0dXJuICJNQmxhemVJU0Q6OkdQUmVsIjsKKyAgICBjYXNlIE1CbGF6ZUlTRDo6V3JhcCAgICAgICA6IHJldHVybiAiTUJsYXplSVNEOjpXcmFwIjsKKyAgICBjYXNlIE1CbGF6ZUlTRDo6SUNtcCAgICAgICA6IHJldHVybiAiTUJsYXplSVNEOjpJQ21wIjsKKyAgICBjYXNlIE1CbGF6ZUlTRDo6UmV0ICAgICAgICA6IHJldHVybiAiTUJsYXplSVNEOjpSZXQiOworICAgIGNhc2UgTUJsYXplSVNEOjpTZWxlY3RfQ0MgIDogcmV0dXJuICJNQmxhemVJU0Q6OlNlbGVjdF9DQyI7CisgICAgZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgOiByZXR1cm4gTlVMTDsKKyAgfQorfQorCitNQmxhemVUYXJnZXRMb3dlcmluZzo6TUJsYXplVGFyZ2V0TG93ZXJpbmcoTUJsYXplVGFyZ2V0TWFjaGluZSAmVE0pCisgIDogVGFyZ2V0TG93ZXJpbmcoVE0sIG5ldyBNQmxhemVUYXJnZXRPYmplY3RGaWxlKCkpIHsKKyAgU3VidGFyZ2V0ID0gJlRNLmdldFN1YnRhcmdldDxNQmxhemVTdWJ0YXJnZXQ+KCk7CisKKyAgLy8gTUJsYXplIGRvZXMgbm90IGhhdmUgaTEgdHlwZSwgc28gdXNlIGkzMiBmb3IKKyAgLy8gc2V0Y2Mgb3BlcmF0aW9ucyByZXN1bHRzIChzbHQsIHNndCwgLi4uKS4KKyAgc2V0Qm9vbGVhbkNvbnRlbnRzKFplcm9Pck9uZUJvb2xlYW5Db250ZW50KTsKKworICAvLyBTZXQgdXAgdGhlIHJlZ2lzdGVyIGNsYXNzZXMKKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmkzMiwgTUJsYXplOjpDUFVSZWdzUmVnaXN0ZXJDbGFzcyk7CisgIGlmIChTdWJ0YXJnZXQtPmhhc0ZQVSgpKSB7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmYzMiwgTUJsYXplOjpGR1IzMlJlZ2lzdGVyQ2xhc3MpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50RlAsIE1WVDo6ZjMyLCBMZWdhbCk7CisgIH0KKworICAvLyBGbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSRU0sICAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQLCBNVlQ6Omk4LCAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUlOVF9UT19GUCwgTVZUOjppMTYsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVJTlRfVE9fRlAsIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5ULCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfUk9VTkQsICAgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1JPVU5ELCAgIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09QWVNJR04sICBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCAgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTSU4sICAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TLCAgICAgICBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBPV0ksICAgICAgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQT1csICAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTE9HLCAgICAgICBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxPRzIsICAgICAgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZMT0cxMCwgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGRVhQLCAgICAgICBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICAvLyBMb2FkIGV4dGVudGVkIG9wZXJhdGlvbnMgZm9yIGkxIHR5cGVzIG11c3QgYmUgcHJvbW90ZWQKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OkVYVExPQUQsICBNVlQ6OmkxLCAgUHJvbW90ZSk7CisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpaRVhUTE9BRCwgTVZUOjppMSwgIFByb21vdGUpOworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6U0VYVExPQUQsIE1WVDo6aTEsICBQcm9tb3RlKTsKKworICAvLyBNQmxhemUgaGFzIG5vIFJFTSBvciBESVZSRU0gb3BlcmF0aW9ucy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VVJFTSwgICAgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSRU0sICAgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJVlJFTSwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgLy8gSWYgdGhlIHByb2Nlc3NvciBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbHkgdGhlbiBleHBhbmQgaXQKKyAgaWYgKCFTdWJ0YXJnZXQtPmhhc011bCgpKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgfQorCisgIC8vIElmIHRoZSBwcm9jZXNzb3IgZG9lc24ndCBzdXBwb3J0IDY0LWJpdCBtdWx0aXBseSB0aGVuIGV4cGFuZAorICBpZiAoIVN1YnRhcmdldC0+aGFzTXVsKCkgfHwgIVN1YnRhcmdldC0+aGFzTXVsNjQoKSkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTEhTLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUxIUywgTVZUOjppNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUsIE1WVDo6aTMyLCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTEhVLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgfQorCisgIC8vIElmIHRoZSBwcm9jZXNzb3IgZG9lc24ndCBzdXBwb3J0IGRpdmlzaW9uIHRoZW4gZXhwYW5kCisgIGlmICghU3VidGFyZ2V0LT5oYXNEaXYoKSkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVYsIE1WVDo6aTMyLCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYsIE1WVDo6aTMyLCBFeHBhbmQpOworICB9CisKKyAgLy8gRXhwYW5kIHVuc3VwcG9ydGVkIGNvbnZlcnNpb25zCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJULCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsIE1WVDo6aTMyLCBFeHBhbmQpOworCisgIC8vIEV4cGFuZCBTRUxFQ1RfQ0MKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUX0NDLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworCisgIC8vIE1CbGF6ZSBkb2Vzbid0IGhhdmUgTVVMX0xPSEkKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKworICAvLyBVc2VkIGJ5IGxlZ2FsaXplIHR5cGVzIHRvIGNvcnJlY3RseSBnZW5lcmF0ZSB0aGUgc2V0Y2MgcmVzdWx0LgorICAvLyBXaXRob3V0IHRoaXMsIGV2ZXJ5IGZsb2F0IHNldGNjIGNvbWVzIHdpdGggYSBBTkQvT1Igd2l0aCB0aGUgcmVzdWx0LAorICAvLyB3ZSBkb24ndCB3YW50IHRoaXMsIHNpbmNlIHRoZSBmcGNtcCByZXN1bHQgZ29lcyB0byBhIGZsYWcgcmVnaXN0ZXIsCisgIC8vIHdoaWNoIGlzIHVzZWQgaW1wbGljaXRseSBieSBicmNvbmQgYW5kIHNlbGVjdCBvcGVyYXRpb25zLgorICBBZGRQcm9tb3RlZFRvVHlwZShJU0Q6OlNFVENDLCBNVlQ6OmkxLCBNVlQ6OmkzMik7CisgIEFkZFByb21vdGVkVG9UeXBlKElTRDo6U0VMRUNULCBNVlQ6OmkxLCBNVlQ6OmkzMik7CisgIEFkZFByb21vdGVkVG9UeXBlKElTRDo6U0VMRUNUX0NDLCBNVlQ6OmkxLCBNVlQ6OmkzMik7CisKKyAgLy8gTUJsYXplIEN1c3RvbSBPcGVyYXRpb25zCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbEFkZHJlc3MsICAgICAgTVZUOjppMzIsICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6R2xvYmFsVExTQWRkcmVzcywgICBNVlQ6OmkzMiwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpKdW1wVGFibGUsICAgICAgICAgIE1WVDo6aTMyLCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50UG9vbCwgICAgICAgTVZUOjppMzIsICAgQ3VzdG9tKTsKKworICAvLyBWYXJpYWJsZSBBcmd1bWVudCBzdXBwb3J0CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBU1RBUlQsICAgICAgICAgICAgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFFTkQsICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQUFSRywgICAgICAgICAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBQ09QWSwgICAgICAgICAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKworCisgIC8vIE9wZXJhdGlvbnMgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSBNQmxhemUuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkRZTkFNSUNfU1RBQ0tBTExPQywgTVZUOjppMzIsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJfSlQsICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUl9DQywgICAgICAgICAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCAgTVZUOjppMSwgICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Uk9UTCwgICAgICAgICAgICAgICBNVlQ6OmkzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RSLCAgICAgICAgICAgICAgIE1WVDo6aTMyLCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITF9QQVJUUywgICAgICAgICAgTVZUOjppMzIsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JBX1BBUlRTLCAgICAgICAgICBNVlQ6OmkzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkxfUEFSVFMsICAgICAgICAgIE1WVDo6aTMyLCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUTFosICAgICAgICAgICAgICAgTVZUOjppMzIsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RUWiwgICAgICAgICAgICAgICBNVlQ6OmkzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFBPUCwgICAgICAgICAgICAgIE1WVDo6aTMyLCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJTV0FQLCAgICAgICAgICAgICAgTVZUOjppMzIsICAgRXhwYW5kKTsKKworICAvLyBXZSBkb24ndCBoYXZlIGxpbmUgbnVtYmVyIHN1cHBvcnQgeWV0LgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFSF9MQUJFTCwgICAgICAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKworICAvLyBVc2UgdGhlIGRlZmF1bHQgZm9yIG5vdworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVEFDS1NBVkUsICAgICAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RBQ0tSRVNUT1JFLCAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1FTUJBUlJJRVIsICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworCisgIC8vIE1CbGF6ZSBkb2Vzbid0IGhhdmUgZXh0ZW5kaW5nIGZsb2F0LT5kb3VibGUgbG9hZC9zdG9yZQorICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6RVhUTE9BRCwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldFRydW5jU3RvcmVBY3Rpb24oTVZUOjpmNjQsIE1WVDo6ZjMyLCBFeHBhbmQpOworCisgIHNldFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZShNQmxhemU6OlIxKTsKKyAgY29tcHV0ZVJlZ2lzdGVyUHJvcGVydGllcygpOworfQorCitNVlQ6OlNpbXBsZVZhbHVlVHlwZSBNQmxhemVUYXJnZXRMb3dlcmluZzo6Z2V0U2V0Q0NSZXN1bHRUeXBlKEVWVCBWVCkgY29uc3QgeworICByZXR1cm4gTVZUOjppMzI7Cit9CisKKy8vLyBnZXRGdW5jdGlvbkFsaWdubWVudCAtIFJldHVybiB0aGUgTG9nMiBhbGlnbm1lbnQgb2YgdGhpcyBmdW5jdGlvbi4KK3Vuc2lnbmVkIE1CbGF6ZVRhcmdldExvd2VyaW5nOjpnZXRGdW5jdGlvbkFsaWdubWVudChjb25zdCBGdW5jdGlvbiAqKSBjb25zdCB7CisgIHJldHVybiAyOworfQorCitTRFZhbHVlIE1CbGF6ZVRhcmdldExvd2VyaW5nOjpMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkKKyAgeworICAgIGNhc2UgSVNEOjpDb25zdGFudFBvb2w6ICAgICAgIHJldHVybiBMb3dlckNvbnN0YW50UG9vbChPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6R2xvYmFsQWRkcmVzczogICAgICByZXR1cm4gTG93ZXJHbG9iYWxBZGRyZXNzKE9wLCBEQUcpOworICAgIGNhc2UgSVNEOjpHbG9iYWxUTFNBZGRyZXNzOiAgIHJldHVybiBMb3dlckdsb2JhbFRMU0FkZHJlc3MoT3AsIERBRyk7CisgICAgY2FzZSBJU0Q6Okp1bXBUYWJsZTogICAgICAgICAgcmV0dXJuIExvd2VySnVtcFRhYmxlKE9wLCBEQUcpOworICAgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6ICAgICAgICAgIHJldHVybiBMb3dlclNFTEVDVF9DQyhPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6VkFTVEFSVDogICAgICAgICAgICByZXR1cm4gTG93ZXJWQVNUQVJUKE9wLCBEQUcpOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTG93ZXIgaGVscGVyIGZ1bmN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK01hY2hpbmVCYXNpY0Jsb2NrKgorTUJsYXplVGFyZ2V0TG93ZXJpbmc6OkVtaXRJbnN0cldpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0SW5zdHJJbmZvKCk7CisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlICYmICJVbmV4cGVjdGVkIGluc3RyIHR5cGUgdG8gaW5zZXJ0Iik7CisgIGNhc2UgTUJsYXplOjpTaGlmdFJMOgorICBjYXNlIE1CbGF6ZTo6U2hpZnRSQToKKyAgY2FzZSBNQmxhemU6OlNoaWZ0TDogeworICAgIC8vIFRvICJpbnNlcnQiIGEgc2hpZnQgbGVmdCBpbnN0cnVjdGlvbiwgd2UgYWN0dWFsbHkgaGF2ZSB0byBpbnNlcnQgYQorICAgIC8vIHNpbXBsZSBsb29wLiAgVGhlIGluY29taW5nIGluc3RydWN0aW9uIGtub3dzIHRoZSBkZXN0aW5hdGlvbiB2cmVnIHRvCisgICAgLy8gc2V0LCB0aGUgc291cmNlIHZyZWcgdG8gb3BlcmF0ZSBvdmVyIGFuZCB0aGUgc2hpZnQgYW1vdW50LgorICAgIGNvbnN0IEJhc2ljQmxvY2sgKkxMVk1fQkIgPSBCQi0+Z2V0QmFzaWNCbG9jaygpOworICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSXQgPSBCQjsKKyAgICArK0l0OworCisgICAgLy8gc3RhcnQ6CisgICAgLy8gICBhbmRpICAgICBzYW10LCBzYW10LCAzMQorICAgIC8vICAgYmVxaWQgICAgc2FtdCwgZmluaXNoCisgICAgLy8gICBhZGQgICAgICBkc3QsIHNyYywgcjAKKyAgICAvLyBsb29wOgorICAgIC8vICAgYWRkaWsgICAgc2FtdCwgc2FtdCwgLTEKKyAgICAvLyAgIHNyYSAgICAgIGRzdCwgZHN0CisgICAgLy8gICBibmVpZCAgICBzYW10LCBsb29wCisgICAgLy8gICBub3AKKyAgICAvLyBmaW5pc2g6CisgICAgTWFjaGluZUZ1bmN0aW9uICpGID0gQkItPmdldFBhcmVudCgpOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJlIgPSBGLT5nZXRSZWdJbmZvKCk7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKmxvb3AgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqZmluaXNoID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgICAgRi0+aW5zZXJ0KEl0LCBsb29wKTsKKyAgICBGLT5pbnNlcnQoSXQsIGZpbmlzaCk7CisKKyAgICAvLyBVcGRhdGUgbWFjaGluZS1DRkcgZWRnZXMgYnkgdHJhbnNmZXJpbmcgYWRkaW5nIGFsbCBzdWNjZXNzb3JzIGFuZAorICAgIC8vIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgY3VycmVudCBibG9jayB0byB0aGUgbmV3IGJsb2NrIHdoaWNoCisgICAgLy8gd2lsbCBjb250YWluIHRoZSBQaGkgbm9kZSBmb3IgdGhlIHNlbGVjdC4KKyAgICBmaW5pc2gtPnNwbGljZShmaW5pc2gtPmJlZ2luKCksIEJCLAorICAgICAgICAgICAgICAgICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKE1JKSksCisgICAgICAgICAgICAgICAgICAgQkItPmVuZCgpKTsKKyAgICBmaW5pc2gtPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXMoQkIpOworCisgICAgLy8gQWRkIHRoZSB0cnVlIGFuZCBmYWxsdGhyb3VnaCBibG9ja3MgYXMgaXRzIHN1Y2Nlc3NvcnMuCisgICAgQkItPmFkZFN1Y2Nlc3Nvcihsb29wKTsKKyAgICBCQi0+YWRkU3VjY2Vzc29yKGZpbmlzaCk7CisKKyAgICAvLyBOZXh0LCBhZGQgdGhlIGZpbmlzaCBibG9jayBhcyBhIHN1Y2Nlc3NvciBvZiB0aGUgbG9vcCBibG9jaworICAgIGxvb3AtPmFkZFN1Y2Nlc3NvcihmaW5pc2gpOworICAgIGxvb3AtPmFkZFN1Y2Nlc3Nvcihsb29wKTsKKworICAgIHVuc2lnbmVkIElBTVQgPSBSLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihNQmxhemU6OkNQVVJlZ3NSZWdpc3RlckNsYXNzKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoTUJsYXplOjpBTkRJKSwgSUFNVCkKKyAgICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCkpCisgICAgICAuYWRkSW1tKDMxKTsKKworICAgIHVuc2lnbmVkIElWQUwgPSBSLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihNQmxhemU6OkNQVVJlZ3NSZWdpc3RlckNsYXNzKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoTUJsYXplOjpBRERJKSwgSVZBTCkKKyAgICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpCisgICAgICAuYWRkSW1tKDApOworCisgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KE1CbGF6ZTo6QkVRSUQpKQorICAgICAgLmFkZFJlZyhJQU1UKQorICAgICAgLmFkZE1CQihmaW5pc2gpOworCisgICAgdW5zaWduZWQgRFNUID0gUi5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoTUJsYXplOjpDUFVSZWdzUmVnaXN0ZXJDbGFzcyk7CisgICAgdW5zaWduZWQgTkRTVCA9IFIuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKE1CbGF6ZTo6Q1BVUmVnc1JlZ2lzdGVyQ2xhc3MpOworICAgIEJ1aWxkTUkobG9vcCwgZGwsIFRJSS0+Z2V0KE1CbGF6ZTo6UEhJKSwgRFNUKQorICAgICAgLmFkZFJlZyhJVkFMKS5hZGRNQkIoQkIpCisgICAgICAuYWRkUmVnKE5EU1QpLmFkZE1CQihsb29wKTsKKworICAgIHVuc2lnbmVkIFNBTVQgPSBSLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihNQmxhemU6OkNQVVJlZ3NSZWdpc3RlckNsYXNzKTsKKyAgICB1bnNpZ25lZCBOQU1UID0gUi5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoTUJsYXplOjpDUFVSZWdzUmVnaXN0ZXJDbGFzcyk7CisgICAgQnVpbGRNSShsb29wLCBkbCwgVElJLT5nZXQoTUJsYXplOjpQSEkpLCBTQU1UKQorICAgICAgLmFkZFJlZyhJQU1UKS5hZGRNQkIoQkIpCisgICAgICAuYWRkUmVnKE5BTVQpLmFkZE1CQihsb29wKTsKKworICAgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gTUJsYXplOjpTaGlmdEwpCisgICAgICBCdWlsZE1JKGxvb3AsIGRsLCBUSUktPmdldChNQmxhemU6OkFERCksIE5EU1QpLmFkZFJlZyhEU1QpLmFkZFJlZyhEU1QpOworICAgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBNQmxhemU6OlNoaWZ0UkEpCisgICAgICBCdWlsZE1JKGxvb3AsIGRsLCBUSUktPmdldChNQmxhemU6OlNSQSksIE5EU1QpLmFkZFJlZyhEU1QpOworICAgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBNQmxhemU6OlNoaWZ0UkwpCisgICAgICBCdWlsZE1JKGxvb3AsIGRsLCBUSUktPmdldChNQmxhemU6OlNSTCksIE5EU1QpLmFkZFJlZyhEU1QpOworICAgIGVsc2UKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSggIkNhbm5vdCBsb3dlciB1bmtub3duIHNoaWZ0IGluc3RydWN0aW9uIiApOworCisgICAgQnVpbGRNSShsb29wLCBkbCwgVElJLT5nZXQoTUJsYXplOjpBRERJKSwgTkFNVCkKKyAgICAgIC5hZGRSZWcoU0FNVCkKKyAgICAgIC5hZGRJbW0oLTEpOworCisgICAgQnVpbGRNSShsb29wLCBkbCwgVElJLT5nZXQoTUJsYXplOjpCTkVJRCkpCisgICAgICAuYWRkUmVnKE5BTVQpCisgICAgICAuYWRkTUJCKGxvb3ApOworCisgICAgQnVpbGRNSSgqZmluaXNoLCBmaW5pc2gtPmJlZ2luKCksIGRsLAorICAgICAgICAgICAgVElJLT5nZXQoTUJsYXplOjpQSEkpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAgIC5hZGRSZWcoSVZBTCkuYWRkTUJCKEJCKQorICAgICAgLmFkZFJlZyhORFNUKS5hZGRNQkIobG9vcCk7CisKKyAgICAvLyBUaGUgcHNldWRvIGluc3RydWN0aW9uIGlzIG5vIGxvbmdlciBuZWVkZWQgc28gcmVtb3ZlIGl0CisgICAgTUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybiBmaW5pc2g7CisgICAgfQorCisgIGNhc2UgTUJsYXplOjpTZWxlY3RfRkNDOgorICBjYXNlIE1CbGF6ZTo6U2VsZWN0X0NDOiB7CisgICAgLy8gVG8gImluc2VydCIgYSBTRUxFQ1RfQ0MgaW5zdHJ1Y3Rpb24sIHdlIGFjdHVhbGx5IGhhdmUgdG8gaW5zZXJ0IHRoZQorICAgIC8vIGRpYW1vbmQgY29udHJvbC1mbG93IHBhdHRlcm4uICBUaGUgaW5jb21pbmcgaW5zdHJ1Y3Rpb24ga25vd3MgdGhlCisgICAgLy8gZGVzdGluYXRpb24gdnJlZyB0byBzZXQsIHRoZSBjb25kaXRpb24gY29kZSByZWdpc3RlciB0byBicmFuY2ggb24sIHRoZQorICAgIC8vIHRydWUvZmFsc2UgdmFsdWVzIHRvIHNlbGVjdCBiZXR3ZWVuLCBhbmQgYSBicmFuY2ggb3Bjb2RlIHRvIHVzZS4KKyAgICBjb25zdCBCYXNpY0Jsb2NrICpMTFZNX0JCID0gQkItPmdldEJhc2ljQmxvY2soKTsKKyAgICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEl0ID0gQkI7CisgICAgKytJdDsKKworICAgIC8vICB0aGlzTUJCOgorICAgIC8vICAuLi4KKyAgICAvLyAgIFRydWVWYWwgPSAuLi4KKyAgICAvLyAgIHNldGNjIHIxLCByMiwgcjMKKyAgICAvLyAgIGJORSAgIHIxLCByMCwgY29weTFNQkIKKyAgICAvLyAgIGZhbGx0aHJvdWdoIC0tPiBjb3B5ME1CQgorICAgIE1hY2hpbmVGdW5jdGlvbiAqRiA9IEJCLT5nZXRQYXJlbnQoKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqZmxzQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqZG5lQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKworICAgIHVuc2lnbmVkIE9wYzsKKyAgICBzd2l0Y2ggKE1JLT5nZXRPcGVyYW5kKDQpLmdldEltbSgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSggIlVua25vd24gYnJhbmNoIGNvbmRpdGlvbiIgKTsKKyAgICBjYXNlIE1CbGF6ZUNDOjpFUTogT3BjID0gTUJsYXplOjpCTkVJRDsgYnJlYWs7CisgICAgY2FzZSBNQmxhemVDQzo6TkU6IE9wYyA9IE1CbGF6ZTo6QkVRSUQ7IGJyZWFrOworICAgIGNhc2UgTUJsYXplQ0M6OkdUOiBPcGMgPSBNQmxhemU6OkJMRUlEOyBicmVhazsKKyAgICBjYXNlIE1CbGF6ZUNDOjpMVDogT3BjID0gTUJsYXplOjpCR0VJRDsgYnJlYWs7CisgICAgY2FzZSBNQmxhemVDQzo6R0U6IE9wYyA9IE1CbGF6ZTo6QkxUSUQ7IGJyZWFrOworICAgIGNhc2UgTUJsYXplQ0M6OkxFOiBPcGMgPSBNQmxhemU6OkJHVElEOyBicmVhazsKKyAgICB9CisKKyAgICBGLT5pbnNlcnQoSXQsIGZsc0JCKTsKKyAgICBGLT5pbnNlcnQoSXQsIGRuZUJCKTsKKworICAgIC8vIFRyYW5zZmVyIHRoZSByZW1haW5kZXIgb2YgQkIgYW5kIGl0cyBzdWNjZXNzb3IgZWRnZXMgdG8gZG5lQkIuCisgICAgZG5lQkItPnNwbGljZShkbmVCQi0+YmVnaW4oKSwgQkIsCisgICAgICAgICAgICAgICAgICBsbHZtOjpuZXh0KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihNSSkpLAorICAgICAgICAgICAgICAgICAgQkItPmVuZCgpKTsKKyAgICBkbmVCQi0+dHJhbnNmZXJTdWNjZXNzb3JzQW5kVXBkYXRlUEhJcyhCQik7CisKKyAgICBCQi0+YWRkU3VjY2Vzc29yKGZsc0JCKTsKKyAgICBCQi0+YWRkU3VjY2Vzc29yKGRuZUJCKTsKKyAgICBmbHNCQi0+YWRkU3VjY2Vzc29yKGRuZUJCKTsKKworICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChPcGMpKQorICAgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgzKS5nZXRSZWcoKSkKKyAgICAgIC5hZGRNQkIoZG5lQkIpOworCisgICAgLy8gIHNpbmtNQkI6CisgICAgLy8gICAlUmVzdWx0ID0gcGhpIFsgJUZhbHNlVmFsdWUsIGNvcHkwTUJCIF0sIFsgJVRydWVWYWx1ZSwgdGhpc01CQiBdCisgICAgLy8gIC4uLgorICAgIC8vQnVpbGRNSShkbmVCQiwgZGwsIFRJSS0+Z2V0KE1CbGF6ZTo6UEhJKSwgTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpCisgICAgLy8gIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpLmFkZE1CQihmbHNCQikKKyAgICAvLyAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSkuYWRkTUJCKEJCKTsKKworICAgIEJ1aWxkTUkoKmRuZUJCLCBkbmVCQi0+YmVnaW4oKSwgZGwsCisgICAgICAgICAgICBUSUktPmdldChNQmxhemU6OlBISSksIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKQorICAgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSkuYWRkTUJCKGZsc0JCKQorICAgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkuYWRkTUJCKEJCKTsKKworICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsgICAvLyBUaGUgcHNldWRvIGluc3RydWN0aW9uIGlzIGdvbmUgbm93LgorICAgIHJldHVybiBkbmVCQjsKKyAgfQorICB9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTWlzYyBMb3dlciBPcGVyYXRpb24gaW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCitTRFZhbHVlIE1CbGF6ZVRhcmdldExvd2VyaW5nOjpMb3dlclNFTEVDVF9DQyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBMSFMgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFJIUyA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgVHJ1ZVZhbCA9IE9wLmdldE9wZXJhbmQoMik7CisgIFNEVmFsdWUgRmFsc2VWYWwgPSBPcC5nZXRPcGVyYW5kKDMpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIHVuc2lnbmVkIE9wYzsKKworICBTRFZhbHVlIENvbXBhcmVGbGFnOworICBpZiAoTEhTLmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTMyKSB7CisgICAgT3BjID0gTUJsYXplSVNEOjpTZWxlY3RfQ0M7CisgICAgQ29tcGFyZUZsYWcgPSBEQUcuZ2V0Tm9kZShNQmxhemVJU0Q6OklDbXAsIGRsLCBNVlQ6OmkzMiwgTEhTLCBSSFMpCisgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgxKTsKKyAgfSBlbHNlIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCAiQ2Fubm90IGxvd2VyIHNlbGVjdF9jYyB3aXRoIHVua25vd24gdHlwZSIgKTsKKyAgfQorIAorICByZXR1cm4gREFHLmdldE5vZGUoT3BjLCBkbCwgVHJ1ZVZhbC5nZXRWYWx1ZVR5cGUoKSwgVHJ1ZVZhbCwgRmFsc2VWYWwsCisgICAgICAgICAgICAgICAgICAgICBDb21wYXJlRmxhZyk7Cit9CisKK1NEVmFsdWUgTUJsYXplVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJHbG9iYWxBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIEZJWE1FIHRoZXJlIGlzbid0IGFjdHVhbGx5IGRlYnVnIGluZm8gaGVyZQorICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGNhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oT3ApLT5nZXRHbG9iYWwoKTsKKyAgU0RWYWx1ZSBHQSA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEdWLCBkbCwgTVZUOjppMzIpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShNQmxhemVJU0Q6OldyYXAsIGRsLCBNVlQ6OmkzMiwgR0EpOworfQorCitTRFZhbHVlIE1CbGF6ZVRhcmdldExvd2VyaW5nOjoKK0xvd2VyR2xvYmFsVExTQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJUTFMgbm90IGltcGxlbWVudGVkIGZvciBNaWNyb0JsYXplLiIpOworICByZXR1cm4gU0RWYWx1ZSgpOyAvLyBOb3QgcmVhY2hlZAorfQorCitTRFZhbHVlIE1CbGF6ZVRhcmdldExvd2VyaW5nOjoKK0xvd2VySnVtcFRhYmxlKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgUmVzTm9kZTsKKyAgU0RWYWx1ZSBIaVBhcnQ7CisgIC8vIEZJWE1FIHRoZXJlIGlzbid0IGFjdHVhbGx5IGRlYnVnIGluZm8gaGVyZQorICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGJvb2wgSXNQSUMgPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ187CisgIHVuc2lnbmVkIGNoYXIgT3BGbGFnID0gSXNQSUMgPyBNQmxhemVJSTo6TU9fR09UIDogTUJsYXplSUk6Ok1PX0FCU19ISUxPOworCisgIEVWVCBQdHJWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBKdW1wVGFibGVTRE5vZGUgKkpUICA9IGNhc3Q8SnVtcFRhYmxlU0ROb2RlPihPcCk7CisKKyAgU0RWYWx1ZSBKVEkgPSBEQUcuZ2V0VGFyZ2V0SnVtcFRhYmxlKEpULT5nZXRJbmRleCgpLCBQdHJWVCwgT3BGbGFnKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKE1CbGF6ZUlTRDo6V3JhcCwgZGwsIE1WVDo6aTMyLCBKVEkpOworICAvL3JldHVybiBKVEk7Cit9CisKK1NEVmFsdWUgTUJsYXplVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJDb25zdGFudFBvb2woU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBSZXNOb2RlOworICBDb25zdGFudFBvb2xTRE5vZGUgKk4gPSBjYXN0PENvbnN0YW50UG9vbFNETm9kZT4oT3ApOworICBjb25zdCBDb25zdGFudCAqQyA9IE4tPmdldENvbnN0VmFsKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBTRFZhbHVlIENQID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDLCBNVlQ6OmkzMiwgTi0+Z2V0QWxpZ25tZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9mZnNldCgpLCBNQmxhemVJSTo6TU9fQUJTX0hJTE8pOworICByZXR1cm4gREFHLmdldE5vZGUoTUJsYXplSVNEOjpXcmFwLCBkbCwgTVZUOjppMzIsIENQKTsKK30KKworU0RWYWx1ZSBNQmxhemVUYXJnZXRMb3dlcmluZzo6TG93ZXJWQVNUQVJUKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgTUJsYXplRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88TUJsYXplRnVuY3Rpb25JbmZvPigpOworCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBGSSA9IERBRy5nZXRGcmFtZUluZGV4KEZ1bmNJbmZvLT5nZXRWYXJBcmdzRnJhbWVJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCkpOworCisgIC8vIHZhc3RhcnQganVzdCBzdG9yZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFZhckFyZ3NGcmFtZUluZGV4IHNsb3QgaW50byB0aGUKKyAgLy8gbWVtb3J5IGxvY2F0aW9uIGFyZ3VtZW50LgorICBjb25zdCBWYWx1ZSAqU1YgPSBjYXN0PFNyY1ZhbHVlU0ROb2RlPihPcC5nZXRPcGVyYW5kKDIpKS0+Z2V0VmFsdWUoKTsKKyAgcmV0dXJuIERBRy5nZXRTdG9yZShPcC5nZXRPcGVyYW5kKDApLCBkbCwgRkksIE9wLmdldE9wZXJhbmQoMSksIFNWLCAwLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nIENvbnZlbnRpb24gSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJNQmxhemVHZW5DYWxsaW5nQ29udi5pbmMiCisKK3N0YXRpYyBib29sIENDX01CbGF6ZTIodW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKSB7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdzU2l6ZT02OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW50UmVnc1tdID0geworICAgIE1CbGF6ZTo6UjUsIE1CbGF6ZTo6UjYsIE1CbGF6ZTo6UjcsCisgICAgTUJsYXplOjpSOCwgTUJsYXplOjpSOSwgTUJsYXplOjpSMTAKKyAgfTsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRmx0UmVnc1tdID0geworICAgIE1CbGF6ZTo6RjUsIE1CbGF6ZTo6RjYsIE1CbGF6ZTo6RjcsCisgICAgTUJsYXplOjpGOCwgTUJsYXplOjpGOSwgTUJsYXplOjpGMTAKKyAgfTsKKworICB1bnNpZ25lZCBSZWc9MDsKKworICAvLyBQcm9tb3RlIGk4IGFuZCBpMTYKKyAgaWYgKExvY1ZUID09IE1WVDo6aTggfHwgTG9jVlQgPT0gTVZUOjppMTYpIHsKKyAgICBMb2NWVCA9IE1WVDo6aTMyOworICAgIGlmIChBcmdGbGFncy5pc1NFeHQoKSkKKyAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6U0V4dDsKKyAgICBlbHNlIGlmIChBcmdGbGFncy5pc1pFeHQoKSkKKyAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6WkV4dDsKKyAgICBlbHNlCisgICAgICBMb2NJbmZvID0gQ0NWYWxBc3NpZ246OkFFeHQ7CisgIH0KKworICBpZiAoVmFsVlQgPT0gTVZUOjppMzIpIHsKKyAgICBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhJbnRSZWdzLCBSZWdzU2l6ZSk7CisgICAgTG9jVlQgPSBNVlQ6OmkzMjsKKyAgfSBlbHNlIGlmIChWYWxWVCA9PSBNVlQ6OmYzMikgeworICAgIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKEZsdFJlZ3MsIFJlZ3NTaXplKTsKKyAgICBMb2NWVCA9IE1WVDo6ZjMyOworICB9CisKKyAgaWYgKCFSZWcpIHsKKyAgICB1bnNpZ25lZCBTaXplSW5CeXRlcyA9IFZhbFZULmdldFNpemVJbkJpdHMoKSA+PiAzOworICAgIHVuc2lnbmVkIE9mZnNldCA9IFN0YXRlLkFsbG9jYXRlU3RhY2soU2l6ZUluQnl0ZXMsIFNpemVJbkJ5dGVzKTsKKyAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldE1lbShWYWxObywgVmFsVlQsIE9mZnNldCwgTG9jVlQsIExvY0luZm8pKTsKKyAgfSBlbHNlIHsKKyAgICB1bnNpZ25lZCBTaXplSW5CeXRlcyA9IFZhbFZULmdldFNpemVJbkJpdHMoKSA+PiAzOworICAgIFN0YXRlLkFsbG9jYXRlU3RhY2soU2l6ZUluQnl0ZXMsIFNpemVJbkJ5dGVzKTsKKyAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsgLy8gQ0MgbXVzdCBhbHdheXMgbWF0Y2gKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgQ2FsbCBDYWxsaW5nIENvbnZlbnRpb24gSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBMb3dlckNhbGwgLSBmdW5jdGlvbnMgYXJndW1lbnRzIGFyZSBjb3BpZWQgZnJvbSB2aXJ0dWFsIHJlZ3MgdG8KKy8vLyAocGh5c2ljYWwgcmVncykvKHN0YWNrIGZyYW1lKSwgQ0FMTFNFUV9TVEFSVCBhbmQgQ0FMTFNFUV9FTkQgYXJlIGVtaXR0ZWQuCisvLy8gVE9ETzogaXNWYXJBcmcsIGlzVGFpbENhbGwuCitTRFZhbHVlIE1CbGF6ZVRhcmdldExvd2VyaW5nOjoKK0xvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LAorICAgICAgICAgIGJvb2wgaXNWYXJBcmcsIGJvb2wgJmlzVGFpbENhbGwsCisgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdCB7CisgIC8vIE1CbGF6ZSBkb2VzIG5vdCB5ZXQgc3VwcG9ydCB0YWlsIGNhbGwgb3B0aW1pemF0aW9uCisgIGlzVGFpbENhbGwgPSBmYWxzZTsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKworICAvLyBBbmFseXplIG9wZXJhbmRzIG9mIHRoZSBjYWxsLCBhc3NpZ25pbmcgbG9jYXRpb25zIHRvIGVhY2ggb3BlcmFuZC4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwgQXJnTG9jcywKKyAgICAgICAgICAgICAgICAgKkRBRy5nZXRDb250ZXh0KCkpOworICBDQ0luZm8uQW5hbHl6ZUNhbGxPcGVyYW5kcyhPdXRzLCBDQ19NQmxhemUyKTsKKworICAvLyBHZXQgYSBjb3VudCBvZiBob3cgbWFueSBieXRlcyBhcmUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjay4KKyAgdW5zaWduZWQgTnVtQnl0ZXMgPSBDQ0luZm8uZ2V0TmV4dFN0YWNrT2Zmc2V0KCk7CisgIENoYWluID0gREFHLmdldENBTExTRVFfU1RBUlQoQ2hhaW4sIERBRy5nZXRJbnRQdHJDb25zdGFudChOdW1CeXRlcywgdHJ1ZSkpOworCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgU0RWYWx1ZT4sIDg+IFJlZ3NUb1Bhc3M7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE1lbU9wQ2hhaW5zOworCisgIC8vIEZpcnN0L0xhc3RBcmdTdGFja0xvYyBjb250YWlucyB0aGUgZmlyc3QvbGFzdAorICAvLyAiYXQgc3RhY2siIGFyZ3VtZW50IGxvY2F0aW9uLgorICBpbnQgTGFzdEFyZ1N0YWNrTG9jID0gMDsKKyAgdW5zaWduZWQgRmlyc3RTdGFja0FyZ0xvYyA9IDA7CisKKyAgLy8gV2FsayB0aGUgcmVnaXN0ZXIvbWVtbG9jIGFzc2lnbm1lbnRzLCBpbnNlcnRpbmcgY29waWVzL2xvYWRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tpXTsKKyAgICBFVlQgUmVnVlQgPSBWQS5nZXRMb2NWVCgpOworICAgIFNEVmFsdWUgQXJnID0gT3V0VmFsc1tpXTsKKworICAgIC8vIFByb21vdGUgdGhlIHZhbHVlIGlmIG5lZWRlZC4KKyAgICBzd2l0Y2ggKFZBLmdldExvY0luZm8oKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbG9jIGluZm8hIik7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6RnVsbDogYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6U0V4dDoKKyAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkQsIGRsLCBSZWdWVCwgQXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OlpFeHQ6CisgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwgUmVnVlQsIEFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENDVmFsQXNzaWduOjpBRXh0OgorICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwgUmVnVlQsIEFyZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBBcmd1bWVudHMgdGhhdCBjYW4gYmUgcGFzc2VkIG9uIHJlZ2lzdGVyIG11c3QgYmUga2VwdCBhdAorICAgIC8vIFJlZ3NUb1Bhc3MgdmVjdG9yCisgICAgaWYgKFZBLmlzUmVnTG9jKCkpIHsKKyAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFZBLmdldExvY1JlZygpLCBBcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gUmVnaXN0ZXIgY2FuJ3QgZ2V0IHRvIHRoaXMgcG9pbnQuLi4KKyAgICAgIGFzc2VydChWQS5pc01lbUxvYygpKTsKKworICAgICAgLy8gQ3JlYXRlIHRoZSBmcmFtZSBpbmRleCBvYmplY3QgZm9yIHRoaXMgaW5jb21pbmcgcGFyYW1ldGVyCisgICAgICBMYXN0QXJnU3RhY2tMb2MgPSAoRmlyc3RTdGFja0FyZ0xvYyArIFZBLmdldExvY01lbU9mZnNldCgpKTsKKyAgICAgIGludCBGSSA9IE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoVkEuZ2V0VmFsVlQoKS5nZXRTaXplSW5CaXRzKCkvOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdEFyZ1N0YWNrTG9jLCB0cnVlKTsKKworICAgICAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0RnJhbWVJbmRleChGSSxnZXRQb2ludGVyVHkoKSk7CisKKyAgICAgIC8vIGVtaXQgSVNEOjpTVE9SRSB3aGljaHMgc3RvcmVzIHRoZQorICAgICAgLy8gcGFyYW1ldGVyIHZhbHVlIHRvIGEgc3RhY2sgTG9jYXRpb24KKyAgICAgIE1lbU9wQ2hhaW5zLnB1c2hfYmFjayhEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBBcmcsIFB0ck9mZiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisgICAgfQorICB9CisKKyAgLy8gVHJhbnNmb3JtIGFsbCBzdG9yZSBub2RlcyBpbnRvIG9uZSBzaW5nbGUgbm9kZSBiZWNhdXNlIGFsbCBzdG9yZQorICAvLyBub2RlcyBhcmUgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlci4KKyAgaWYgKCFNZW1PcENoYWlucy5lbXB0eSgpKQorICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAmTWVtT3BDaGFpbnNbMF0sIE1lbU9wQ2hhaW5zLnNpemUoKSk7CisKKyAgLy8gQnVpbGQgYSBzZXF1ZW5jZSBvZiBjb3B5LXRvLXJlZyBub2RlcyBjaGFpbmVkIHRvZ2V0aGVyIHdpdGggdG9rZW4KKyAgLy8gY2hhaW4gYW5kIGZsYWcgb3BlcmFuZHMgd2hpY2ggY29weSB0aGUgb3V0Z29pbmcgYXJncyBpbnRvIHJlZ2lzdGVycy4KKyAgLy8gVGhlIEluRmxhZyBpbiBuZWNlc3Nhcnkgc2luY2UgYWxsIGVtaXRlZCBpbnN0cnVjdGlvbnMgbXVzdCBiZQorICAvLyBzdHVjayB0b2dldGhlci4KKyAgU0RWYWx1ZSBJbkZsYWc7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzVG9QYXNzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBSZWdzVG9QYXNzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdzVG9QYXNzW2ldLnNlY29uZCwgSW5GbGFnKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIC8vIElmIHRoZSBjYWxsZWUgaXMgYSBHbG9iYWxBZGRyZXNzL0V4dGVybmFsU3ltYm9sIG5vZGUgKHF1aXRlIGNvbW1vbiwgZXZlcnkKKyAgLy8gZGlyZWN0IGNhbGwgaXMpIHR1cm4gaXQgaW50byBhIFRhcmdldEdsb2JhbEFkZHJlc3MvVGFyZ2V0RXh0ZXJuYWxTeW1ib2wKKyAgLy8gbm9kZSBzbyB0aGF0IGxlZ2FsaXplIGRvZXNuJ3QgaGFjayBpdC4KKyAgdW5zaWduZWQgY2hhciBPcEZsYWcgPSBNQmxhemVJSTo6TU9fTk9fRkxBRzsKKyAgaWYgKEdsb2JhbEFkZHJlc3NTRE5vZGUgKkcgPSBkeW5fY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihDYWxsZWUpKQorICAgIENhbGxlZSA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEctPmdldEdsb2JhbCgpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCksIDAsIE9wRmxhZyk7CisgIGVsc2UgaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpTID0gZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKFMtPmdldFN5bWJvbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSwgT3BGbGFnKTsKKworICAvLyBNQmxhemVKbXBMaW5rID0gI2NoYWluLCAjdGFyZ2V0X2FkZHJlc3MsICNvcHRfaW5fZmxhZ3MuLi4KKyAgLy8gICAgICAgICAgICAgPSBDaGFpbiwgQ2FsbGVlLCBSZWcjMSwgUmVnIzIsIC4uLgorICAvLworICAvLyBSZXR1cm5zIGEgY2hhaW4gJiBhIGZsYWcgZm9yIHJldHZhbCBjb3B5IHRvIHVzZS4KKyAgU0RWVExpc3QgTm9kZVR5cyA9IERBRy5nZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICBPcHMucHVzaF9iYWNrKENoYWluKTsKKyAgT3BzLnB1c2hfYmFjayhDYWxsZWUpOworCisgIC8vIEFkZCBhcmd1bWVudCByZWdpc3RlcnMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBzbyB0aGF0IHRoZXkgYXJlCisgIC8vIGtub3duIGxpdmUgaW50byB0aGUgY2FsbC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3NUb1Bhc3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE9wcy5wdXNoX2JhY2soREFHLmdldFJlZ2lzdGVyKFJlZ3NUb1Bhc3NbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgfQorCisgIGlmIChJbkZsYWcuZ2V0Tm9kZSgpKQorICAgIE9wcy5wdXNoX2JhY2soSW5GbGFnKTsKKworICBDaGFpbiAgPSBEQUcuZ2V0Tm9kZShNQmxhemVJU0Q6OkptcExpbmssIGRsLCBOb2RlVHlzLCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBDQUxMU0VRX0VORCBub2RlLgorICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX0VORChDaGFpbiwgREFHLmdldEludFB0ckNvbnN0YW50KE51bUJ5dGVzLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDAsIHRydWUpLCBJbkZsYWcpOworICBpZiAoIUlucy5lbXB0eSgpKQorICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIEhhbmRsZSByZXN1bHQgdmFsdWVzLCBjb3B5aW5nIHRoZW0gb3V0IG9mIHBoeXNyZWdzIGludG8gdnJlZ3MgdGhhdCB3ZQorICAvLyByZXR1cm4uCisgIHJldHVybiBMb3dlckNhbGxSZXN1bHQoQ2hhaW4sIEluRmxhZywgQ2FsbENvbnYsIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgIElucywgZGwsIERBRywgSW5WYWxzKTsKK30KKworLy8vIExvd2VyQ2FsbFJlc3VsdCAtIExvd2VyIHRoZSByZXN1bHQgdmFsdWVzIG9mIGEgY2FsbCBpbnRvIHRoZQorLy8vIGFwcHJvcHJpYXRlIGNvcGllcyBvdXQgb2YgYXBwcm9wcmlhdGUgcGh5c2ljYWwgcmVnaXN0ZXJzLgorU0RWYWx1ZSBNQmxhemVUYXJnZXRMb3dlcmluZzo6CitMb3dlckNhbGxSZXN1bHQoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBJbkZsYWcsIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwKKyAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLCBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgLy8gQXNzaWduIGxvY2F0aW9ucyB0byBlYWNoIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgY2FsbC4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBSVkxvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICBSVkxvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKworICBDQ0luZm8uQW5hbHl6ZUNhbGxSZXN1bHQoSW5zLCBSZXRDQ19NQmxhemUpOworCisgIC8vIENvcHkgYWxsIG9mIHRoZSByZXN1bHQgcmVnaXN0ZXJzIG91dCBvZiB0aGVpciBzcGVjaWZpZWQgcGh5c3JlZy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpIHsKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFJWTG9jc1tpXS5nZXRMb2NSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVkxvY3NbaV0uZ2V0VmFsVlQoKSwgSW5GbGFnKS5nZXRWYWx1ZSgxKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgyKTsKKyAgICBJblZhbHMucHVzaF9iYWNrKENoYWluLmdldFZhbHVlKDApKTsKKyAgfSAKKworICByZXR1cm4gQ2hhaW47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICBGb3JtYWwgQXJndW1lbnRzIENhbGxpbmcgQ29udmVudGlvbiBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIExvd2VyRm9ybWFsQXJndW1lbnRzIC0gdHJhbnNmb3JtIHBoeXNpY2FsIHJlZ2lzdGVycyBpbnRvCisvLy8gdmlydHVhbCByZWdpc3RlcnMgYW5kIGdlbmVyYXRlIGxvYWQgb3BlcmF0aW9ucyBmb3IKKy8vLyBhcmd1bWVudHMgcGxhY2VzIG9uIHRoZSBzdGFjay4KK1NEVmFsdWUgTUJsYXplVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJGb3JtYWxBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTUJsYXplRnVuY3Rpb25JbmZvICpNQmxhemVGSSA9IE1GLmdldEluZm88TUJsYXplRnVuY3Rpb25JbmZvPigpOworCisgIHVuc2lnbmVkIFN0YWNrUmVnID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCktPmdldEZyYW1lUmVnaXN0ZXIoTUYpOworICBNQmxhemVGSS0+c2V0VmFyQXJnc0ZyYW1lSW5kZXgoMCk7CisKKyAgLy8gVXNlZCB3aXRoIHZhcmdzIHRvIGFjdW11bGF0ZSBzdG9yZSBjaGFpbnMuCisgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+IE91dENoYWluczsKKworICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHJlZ2lzdGVyIHVzZWQgZm9yIGFyZ3VtZW50cworICB1bnNpZ25lZCBBcmdSZWdFbmQgPSAwOworCisgIC8vIEFzc2lnbiBsb2NhdGlvbnMgdG8gYWxsIG9mIHRoZSBpbmNvbWluZyBhcmd1bWVudHMuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gQXJnTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIEFyZ0xvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKworICBDQ0luZm8uQW5hbHl6ZUZvcm1hbEFyZ3VtZW50cyhJbnMsIENDX01CbGF6ZTIpOworICBTRFZhbHVlIFN0YWNrUHRyOworCisgIHVuc2lnbmVkIEZpcnN0U3RhY2tBcmdMb2MgPSAwOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBBcmdMb2NzW2ldOworCisgICAgLy8gQXJndW1lbnRzIHN0b3JlZCBvbiByZWdpc3RlcnMKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgRVZUIFJlZ1ZUID0gVkEuZ2V0TG9jVlQoKTsKKyAgICAgIEFyZ1JlZ0VuZCA9IFZBLmdldExvY1JlZygpOworICAgICAgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSAwOworCisgICAgICBpZiAoUmVnVlQgPT0gTVZUOjppMzIpCisgICAgICAgIFJDID0gTUJsYXplOjpDUFVSZWdzUmVnaXN0ZXJDbGFzczsKKyAgICAgIGVsc2UgaWYgKFJlZ1ZUID09IE1WVDo6ZjMyKQorICAgICAgICBSQyA9IE1CbGF6ZTo6RkdSMzJSZWdpc3RlckNsYXNzOworICAgICAgZWxzZQorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJSZWdWVCBub3Qgc3VwcG9ydGVkIGJ5IExvd2VyRm9ybWFsQXJndW1lbnRzIik7CisKKyAgICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJndW1lbnRzIHN0b3JlZCBvbgorICAgICAgLy8gcGh5c2ljYWwgcmVnaXN0ZXJzIGludG8gdmlydHVhbCBvbmVzCisgICAgICB1bnNpZ25lZCBSZWcgPSBNRi5hZGRMaXZlSW4oQXJnUmVnRW5kLCBSQyk7CisgICAgICBTRFZhbHVlIEFyZ1ZhbHVlID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgUmVnLCBSZWdWVCk7CisKKyAgICAgIC8vIElmIHRoaXMgaXMgYW4gOCBvciAxNi1iaXQgdmFsdWUsIGl0IGhhcyBiZWVuIHBhc3NlZCBwcm9tb3RlZAorICAgICAgLy8gdG8gMzIgYml0cy4gIEluc2VydCBhbiBhc3NlcnRbc3pdZXh0IHRvIGNhcHR1cmUgdGhpcywgdGhlbgorICAgICAgLy8gdHJ1bmNhdGUgdG8gdGhlIHJpZ2h0IHNpemUuIElmIGlmIGlzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAgICAgIC8vIHRoZW4gY29udmVydCB0byB0aGUgY29ycmVjdCB0eXBlLgorICAgICAgaWYgKFZBLmdldExvY0luZm8oKSAhPSBDQ1ZhbEFzc2lnbjo6RnVsbCkgeworICAgICAgICB1bnNpZ25lZCBPcGNvZGUgPSAwOworICAgICAgICBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpTRXh0KQorICAgICAgICAgIE9wY29kZSA9IElTRDo6QXNzZXJ0U2V4dDsKKyAgICAgICAgZWxzZSBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpaRXh0KQorICAgICAgICAgIE9wY29kZSA9IElTRDo6QXNzZXJ0WmV4dDsKKyAgICAgICAgaWYgKE9wY29kZSkKKyAgICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKE9wY29kZSwgZGwsIFJlZ1ZULCBBcmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWYWx1ZVR5cGUoVkEuZ2V0VmFsVlQoKSkpOworICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBWQS5nZXRWYWxWVCgpLCBBcmdWYWx1ZSk7CisgICAgICB9CisKKyAgICAgIEluVmFscy5wdXNoX2JhY2soQXJnVmFsdWUpOworCisgICAgfSBlbHNlIHsgLy8gVkEuaXNSZWdMb2MoKQorCisgICAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICAgIGFzc2VydChWQS5pc01lbUxvYygpKTsKKworICAgICAgLy8gVGhlIGxhc3QgYXJndW1lbnQgaXMgbm90IGEgcmVnaXN0ZXIKKyAgICAgIEFyZ1JlZ0VuZCA9IDA7CisKKyAgICAgIC8vIFRoZSBzdGFjayBwb2ludGVyIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgY2FsbGVyIHN0YWNrIGZyYW1lLgorICAgICAgLy8gU2luY2UgdGhlIHJlYWwgc3RhY2sgc2l6ZSBpcyB1bmtub3duIGhlcmUsIGEgbmVnYXRpdmUgU1BPZmZzZXQKKyAgICAgIC8vIGlzIHVzZWQgc28gdGhlcmUncyBhIHdheSB0byBhZGp1c3QgdGhlc2Ugb2Zmc2V0cyB3aGVuIHRoZSBzdGFjaworICAgICAgLy8gc2l6ZSBnZXQga25vd24gKG9uIEVsaW1pbmF0ZUZyYW1lSW5kZXgpLiBBIGR1bW15IFNQT2Zmc2V0IGlzCisgICAgICAvLyB1c2VkIGluc3RlYWQgb2YgYSBkaXJlY3QgbmVnYXRpdmUgYWRkcmVzcyAod2hpY2ggaXMgcmVjb3JkZWQgdG8KKyAgICAgIC8vIGJlIHVzZWQgb24gZW1pdFByb2xvZ3VlKSB0byBhdm9pZCBtaXMtY2FsYyBvZiB0aGUgZmlyc3Qgc3RhY2sKKyAgICAgIC8vIG9mZnNldCBvbiBQRUk6OmNhbGN1bGF0ZUZyYW1lT2JqZWN0T2Zmc2V0cy4KKyAgICAgIC8vIEFyZ3VtZW50cyBhcmUgYWx3YXlzIDMyLWJpdC4KKyAgICAgIHVuc2lnbmVkIEFyZ1NpemUgPSBWQS5nZXRMb2NWVCgpLmdldFNpemVJbkJpdHMoKS84OworICAgICAgaW50IEZJID0gTUZJLT5DcmVhdGVGaXhlZE9iamVjdChBcmdTaXplLCAwLCB0cnVlKTsKKyAgICAgIE1CbGF6ZUZJLT5yZWNvcmRMb2FkQXJnc0ZJKEZJLCAtKEFyZ1NpemUrCisgICAgICAgIChGaXJzdFN0YWNrQXJnTG9jICsgVkEuZ2V0TG9jTWVtT2Zmc2V0KCkpKSk7CisKKyAgICAgIC8vIENyZWF0ZSBsb2FkIG5vZGVzIHRvIHJldHJpZXZlIGFyZ3VtZW50cyBmcm9tIHRoZSBzdGFjaworICAgICAgU0RWYWx1ZSBGSU4gPSBEQUcuZ2V0RnJhbWVJbmRleChGSSwgZ2V0UG9pbnRlclR5KCkpOworICAgICAgSW5WYWxzLnB1c2hfYmFjayhEQUcuZ2V0TG9hZChWQS5nZXRWYWxWVCgpLCBkbCwgQ2hhaW4sIEZJTiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisgICAgfQorICB9CisKKyAgLy8gVG8gbWVldCBBQkksIHdoZW4gVkFSQVJHUyBhcmUgcGFzc2VkIG9uIHJlZ2lzdGVycywgdGhlIHJlZ2lzdGVycworICAvLyBtdXN0IGhhdmUgdGhlaXIgdmFsdWVzIHdyaXR0ZW4gdG8gdGhlIGNhbGxlciBzdGFjayBmcmFtZS4gSWYgdGhlIGxhc3QKKyAgLy8gYXJndW1lbnQgd2FzIHBsYWNlZCBpbiB0aGUgc3RhY2ssIHRoZXJlJ3Mgbm8gbmVlZCB0byBzYXZlIGFueSByZWdpc3Rlci4gCisgIGlmICgoaXNWYXJBcmcpICYmIEFyZ1JlZ0VuZCkgeworICAgIGlmIChTdGFja1B0ci5nZXROb2RlKCkgPT0gMCkKKyAgICAgIFN0YWNrUHRyID0gREFHLmdldFJlZ2lzdGVyKFN0YWNrUmVnLCBnZXRQb2ludGVyVHkoKSk7CisKKyAgICAvLyBUaGUgbGFzdCByZWdpc3RlciBhcmd1bWVudCB0aGF0IG11c3QgYmUgc2F2ZWQgaXMgTUJsYXplOjpSMTAKKyAgICBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IE1CbGF6ZTo6Q1BVUmVnc1JlZ2lzdGVyQ2xhc3M7CisKKyAgICB1bnNpZ25lZCBCZWdpbiA9IE1CbGF6ZVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoTUJsYXplOjpSNSk7CisgICAgdW5zaWduZWQgU3RhcnQgPSBNQmxhemVSZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKEFyZ1JlZ0VuZCsxKTsKKyAgICB1bnNpZ25lZCBFbmQgICA9IE1CbGF6ZVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoTUJsYXplOjpSMTApOworICAgIHVuc2lnbmVkIFN0YWNrTG9jID0gQXJnTG9jcy5zaXplKCktMSArIChTdGFydCAtIEJlZ2luKTsKKworICAgIGZvciAoOyBTdGFydCA8PSBFbmQ7ICsrU3RhcnQsICsrU3RhY2tMb2MpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IE1CbGF6ZVJlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJGcm9tTnVtYmVyaW5nKFN0YXJ0KTsKKyAgICAgIHVuc2lnbmVkIExpdmVSZWcgPSBNRi5hZGRMaXZlSW4oUmVnLCBSQyk7CisgICAgICBTRFZhbHVlIEFyZ1ZhbHVlID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgTGl2ZVJlZywgTVZUOjppMzIpOworCisgICAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KDQsIDAsIHRydWUpOworICAgICAgTUJsYXplRkktPnJlY29yZFN0b3JlVmFyQXJnc0ZJKEZJLCAtKDQrKFN0YWNrTG9jKjQpKSk7CisgICAgICBTRFZhbHVlIFB0ck9mZiA9IERBRy5nZXRGcmFtZUluZGV4KEZJLCBnZXRQb2ludGVyVHkoKSk7CisgICAgICBPdXRDaGFpbnMucHVzaF9iYWNrKERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIEFyZ1ZhbHVlLCBQdHJPZmYsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApKTsKKworICAgICAgLy8gUmVjb3JkIHRoZSBmcmFtZSBpbmRleCBvZiB0aGUgZmlyc3QgdmFyaWFibGUgYXJndW1lbnQKKyAgICAgIC8vIHdoaWNoIGlzIGEgdmFsdWUgbmVjZXNzYXJ5IHRvIFZBU1RBUlQuCisgICAgICBpZiAoIU1CbGF6ZUZJLT5nZXRWYXJBcmdzRnJhbWVJbmRleCgpKQorICAgICAgICBNQmxhemVGSS0+c2V0VmFyQXJnc0ZyYW1lSW5kZXgoRkkpOworICAgIH0KKyAgfQorCisgIC8vIEFsbCBzdG9yZXMgYXJlIGdyb3VwZWQgaW4gb25lIG5vZGUgdG8gYWxsb3cgdGhlIG1hdGNoaW5nIGJldHdlZW4gCisgIC8vIHRoZSBzaXplIG9mIElucyBhbmQgSW5WYWxzLiBUaGlzIG9ubHkgaGFwcGVucyB3aGVuIG9uIHZhcmcgZnVuY3Rpb25zCisgIGlmICghT3V0Q2hhaW5zLmVtcHR5KCkpIHsKKyAgICBPdXRDaGFpbnMucHVzaF9iYWNrKENoYWluKTsKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJk91dENoYWluc1swXSwgT3V0Q2hhaW5zLnNpemUoKSk7CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgIFJldHVybiBWYWx1ZSBDYWxsaW5nIENvbnZlbnRpb24gSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NEVmFsdWUgTUJsYXplVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJSZXR1cm4oU0RWYWx1ZSBDaGFpbiwgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvLyBDQ1ZhbEFzc2lnbiAtIHJlcHJlc2VudCB0aGUgYXNzaWdubWVudCBvZgorICAvLyB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgbG9jYXRpb24KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBSVkxvY3M7CisKKyAgLy8gQ0NTdGF0ZSAtIEluZm8gYWJvdXQgdGhlIHJlZ2lzdGVycyBhbmQgc3RhY2sgc2xvdC4KKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIFJWTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIC8vIEFuYWxpemUgcmV0dXJuIHZhbHVlcy4KKyAgQ0NJbmZvLkFuYWx5emVSZXR1cm4oT3V0cywgUmV0Q0NfTUJsYXplKTsKKworICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXR1cm4gbG93ZXJlZCBmb3IgdGhpcyBmdW5jdGlvbiwgYWRkCisgIC8vIHRoZSByZWdzIHRvIHRoZSBsaXZlb3V0IHNldCBmb3IgdGhlIGZ1bmN0aW9uLgorICBpZiAoREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5saXZlb3V0X2VtcHR5KCkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkKKyAgICAgIGlmIChSVkxvY3NbaV0uaXNSZWdMb2MoKSkKKyAgICAgICAgREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5hZGRMaXZlT3V0KFJWTG9jc1tpXS5nZXRMb2NSZWcoKSk7CisgIH0KKworICBTRFZhbHVlIEZsYWc7CisKKyAgLy8gQ29weSB0aGUgcmVzdWx0IHZhbHVlcyBpbnRvIHRoZSBvdXRwdXQgcmVnaXN0ZXJzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkgeworICAgIENDVmFsQXNzaWduICZWQSA9IFJWTG9jc1tpXTsKKyAgICBhc3NlcnQoVkEuaXNSZWdMb2MoKSAmJiAiQ2FuIG9ubHkgcmV0dXJuIGluIHJlZ2lzdGVycyEiKTsKKworICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFZBLmdldExvY1JlZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRWYWxzW2ldLCBGbGFnKTsKKworICAgIC8vIGd1YXJhbnRlZSB0aGF0IGFsbCBlbWl0dGVkIGNvcGllcyBhcmUKKyAgICAvLyBzdHVjayB0b2dldGhlciwgYXZvaWRpbmcgc29tZXRoaW5nIGJhZAorICAgIEZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIC8vIFJldHVybiBvbiBNQmxhemUgaXMgYWx3YXlzIGEgInJ0c2QgUjE1LCA4IgorICBpZiAoRmxhZy5nZXROb2RlKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKE1CbGF6ZUlTRDo6UmV0LCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW4sIERBRy5nZXRSZWdpc3RlcihNQmxhemU6OlIxNSwgTVZUOjppMzIpLCBGbGFnKTsKKyAgZWxzZSAvLyBSZXR1cm4gVm9pZAorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShNQmxhemVJU0Q6OlJldCwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgIENoYWluLCBEQUcuZ2V0UmVnaXN0ZXIoTUJsYXplOjpSMTUsIE1WVDo6aTMyKSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CbGF6ZSBJbmxpbmUgQXNzZW1ibHkgU3VwcG9ydAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGdldENvbnN0cmFpbnRUeXBlIC0gR2l2ZW4gYSBjb25zdHJhaW50IGxldHRlciwgcmV0dXJuIHRoZSB0eXBlIG9mCisvLy8gY29uc3RyYWludCBpdCBpcyBmb3IgdGhpcyB0YXJnZXQuCitNQmxhemVUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUgTUJsYXplVGFyZ2V0TG93ZXJpbmc6OgorZ2V0Q29uc3RyYWludFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQpIGNvbnN0Cit7CisgIC8vIE1CbGF6ZSBzcGVjaWZpYyBjb25zdHJhaW55CisgIC8vCisgIC8vICdkJyA6IEFuIGFkZHJlc3MgcmVnaXN0ZXIuIEVxdWl2YWxlbnQgdG8gci4KKyAgLy8gJ3knIDogRXF1aXZhbGVudCB0byByOyByZXRhaW5lZCBmb3IKKyAgLy8gICAgICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgIC8vICdmJyA6IEZsb2F0aW5nIFBvaW50IHJlZ2lzdGVycy4KKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICAgIGRlZmF1bHQgOiBicmVhazsKKyAgICAgIGNhc2UgJ2QnOgorICAgICAgY2FzZSAneSc6CisgICAgICBjYXNlICdmJzoKKyAgICAgICAgcmV0dXJuIENfUmVnaXN0ZXJDbGFzczsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoQ29uc3RyYWludCk7Cit9CisKKy8vLyBnZXRSZWdDbGFzc0ZvcklubGluZUFzbUNvbnN0cmFpbnQgLSBHaXZlbiBhIGNvbnN0cmFpbnQgbGV0dGVyIChlLmcuICJyIiksCisvLy8gcmV0dXJuIGEgbGlzdCBvZiByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzYXRpc2Z5IHRoZSBjb25zdHJhaW50LgorLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgQ19SZWdpc3RlckNsYXNzIGNvbnN0cmFpbnRzLgorc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4gTUJsYXplVGFyZ2V0TG93ZXJpbmc6OgorZ2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwgRVZUIFZUKSBjb25zdCB7CisgIGlmIChDb25zdHJhaW50LnNpemUoKSA9PSAxKSB7CisgICAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgY2FzZSAncic6CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIE1CbGF6ZTo6Q1BVUmVnc1JlZ2lzdGVyQ2xhc3MpOworICAgIGNhc2UgJ2YnOgorICAgICAgaWYgKFZUID09IE1WVDo6ZjMyKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIE1CbGF6ZTo6RkdSMzJSZWdpc3RlckNsYXNzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjpnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KENvbnN0cmFpbnQsIFZUKTsKK30KKworLy8vIEdpdmVuIGEgcmVnaXN0ZXIgY2xhc3MgY29uc3RyYWludCwgbGlrZSAncicsIGlmIHRoaXMgY29ycmVzcG9uZHMgZGlyZWN0bHkKKy8vLyB0byBhbiBMTFZNIHJlZ2lzdGVyIGNsYXNzLCByZXR1cm4gYSByZWdpc3RlciBvZiAwIGFuZCB0aGUgcmVnaXN0ZXIgY2xhc3MKKy8vLyBwb2ludGVyLgorc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IE1CbGF6ZVRhcmdldExvd2VyaW5nOjoKK2dldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwgRVZUIFZUKSBjb25zdCB7CisgIGlmIChDb25zdHJhaW50LnNpemUoKSAhPSAxKQorICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKKworICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICBkZWZhdWx0IDogYnJlYWs7CisgICAgY2FzZSAncic6CisgICAgLy8gR0NDIE1CbGF6ZSBDb25zdHJhaW50IExldHRlcnMKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICd5JzoKKyAgICAgIHJldHVybiBtYWtlX3ZlY3Rvcjx1bnNpZ25lZD4oCisgICAgICAgIE1CbGF6ZTo6UjMsICBNQmxhemU6OlI0LCAgTUJsYXplOjpSNSwgIE1CbGF6ZTo6UjYsCisgICAgICAgIE1CbGF6ZTo6UjcsICBNQmxhemU6OlI5LCAgTUJsYXplOjpSMTAsIE1CbGF6ZTo6UjExLAorICAgICAgICBNQmxhemU6OlIxMiwgTUJsYXplOjpSMTksIE1CbGF6ZTo6UjIwLCBNQmxhemU6OlIyMSwKKyAgICAgICAgTUJsYXplOjpSMjIsIE1CbGF6ZTo6UjIzLCBNQmxhemU6OlIyNCwgTUJsYXplOjpSMjUsCisgICAgICAgIE1CbGF6ZTo6UjI2LCBNQmxhemU6OlIyNywgTUJsYXplOjpSMjgsIE1CbGF6ZTo6UjI5LAorICAgICAgICBNQmxhemU6OlIzMCwgTUJsYXplOjpSMzEsIDApOworCisgICAgY2FzZSAnZic6CisgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KAorICAgICAgICBNQmxhemU6OkYzLCAgTUJsYXplOjpGNCwgIE1CbGF6ZTo6RjUsICBNQmxhemU6OkY2LAorICAgICAgICBNQmxhemU6OkY3LCAgTUJsYXplOjpGOSwgIE1CbGF6ZTo6RjEwLCBNQmxhemU6OkYxMSwKKyAgICAgICAgTUJsYXplOjpGMTIsIE1CbGF6ZTo6RjE5LCBNQmxhemU6OkYyMCwgTUJsYXplOjpGMjEsCisgICAgICAgIE1CbGF6ZTo6RjIyLCBNQmxhemU6OkYyMywgTUJsYXplOjpGMjQsIE1CbGF6ZTo6RjI1LAorICAgICAgICBNQmxhemU6OkYyNiwgTUJsYXplOjpGMjcsIE1CbGF6ZTo6RjI4LCBNQmxhemU6OkYyOSwKKyAgICAgICAgTUJsYXplOjpGMzAsIE1CbGF6ZTo6RjMxLCAwKTsKKyAgfQorICByZXR1cm4gc3RkOjp2ZWN0b3I8dW5zaWduZWQ+KCk7Cit9CisKK2Jvb2wgTUJsYXplVGFyZ2V0TG93ZXJpbmc6OgoraXNPZmZzZXRGb2xkaW5nTGVnYWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EpIGNvbnN0IHsKKyAgLy8gVGhlIE1CbGF6ZSB0YXJnZXQgaXNuJ3QgeWV0IGF3YXJlIG9mIG9mZnNldHMuCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNQmxhemVUYXJnZXRMb3dlcmluZzo6aXNGUEltbUxlZ2FsKGNvbnN0IEFQRmxvYXQgJkltbSwgRVZUIFZUKSBjb25zdCB7CisgIHJldHVybiBWVCAhPSBNVlQ6OmYzMjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUlTZWxMb3dlcmluZy5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSVNlbExvd2VyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjMjU2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUlTZWxMb3dlcmluZy5oCkBAIC0wLDAgKzEsMTQ4IEBACisvLz09PS0tIE1CbGF6ZUlTZWxMb3dlcmluZy5oIC0gTUJsYXplIERBRyBMb3dlcmluZyBJbnRlcmZhY2UgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgTUJsYXplIHVzZXMgdG8gbG93ZXIgTExWTSBjb2RlIGludG8gYQorLy8gc2VsZWN0aW9uIERBRy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE1CbGF6ZUlTRUxMT1dFUklOR19ICisjZGVmaW5lIE1CbGF6ZUlTRUxMT1dFUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJNQmxhemUuaCIKKyNpbmNsdWRlICJNQmxhemVTdWJ0YXJnZXQuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBuYW1lc3BhY2UgTUJsYXplQ0MgeworICAgIGVudW0gQ0MgeworICAgICAgRklSU1QgPSAwLAorICAgICAgRVEsCisgICAgICBORSwKKyAgICAgIEdULAorICAgICAgTFQsCisgICAgICBHRSwKKyAgICAgIExFCisgICAgfTsKKyAgfQorCisgIG5hbWVzcGFjZSBNQmxhemVJU0QgeworICAgIGVudW0gTm9kZVR5cGUgeworICAgICAgLy8gU3RhcnQgdGhlIG51bWJlcmluZyBmcm9tIHdoZXJlIElTRCBOb2RlVHlwZSBmaW5pc2hlcy4KKyAgICAgIEZJUlNUX05VTUJFUiA9IElTRDo6QlVJTFRJTl9PUF9FTkQsCisKKyAgICAgIC8vIEp1bXAgYW5kIGxpbmsgKGNhbGwpCisgICAgICBKbXBMaW5rLAorCisgICAgICAvLyBIYW5kbGUgZ3BfcmVsIChzbWFsbCBkYXRhL2JzcyBzZWN0aW9ucykgcmVsb2NhdGlvbi4KKyAgICAgIEdQUmVsLAorCisgICAgICAvLyBTZWxlY3QgQ0MgUHNldWRvIEluc3RydWN0aW9uCisgICAgICBTZWxlY3RfQ0MsCisKKyAgICAgIC8vIFdyYXAgdXAgbXVsdGlwbGUgdHlwZXMgb2YgaW5zdHJ1Y3Rpb25zCisgICAgICBXcmFwLAorCisgICAgICAvLyBJbnRlZ2VyIENvbXBhcmUKKyAgICAgIElDbXAsCisKKyAgICAgIC8vIFJldHVybgorICAgICAgUmV0CisgICAgfTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUYXJnZXRMb3dlcmluZyBJbXBsZW1lbnRhdGlvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBjbGFzcyBNQmxhemVUYXJnZXRMb3dlcmluZyA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgTUJsYXplVGFyZ2V0TG93ZXJpbmcoTUJsYXplVGFyZ2V0TWFjaGluZSAmVE0pOworCisgICAgLy8vIExvd2VyT3BlcmF0aW9uIC0gUHJvdmlkZSBjdXN0b20gbG93ZXJpbmcgaG9va3MgZm9yIHNvbWUgb3BlcmF0aW9ucy4KKyAgICB2aXJ0dWFsIFNEVmFsdWUgTG93ZXJPcGVyYXRpb24oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgLy8vIGdldFRhcmdldE5vZGVOYW1lIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiBhIHRhcmdldCBzcGVjaWZpYworICAgIC8vICBEQUcgbm9kZS4KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgICAvLy8gZ2V0U2V0Q0NSZXN1bHRUeXBlIC0gZ2V0IHRoZSBJU0Q6OlNFVENDIHJlc3VsdCBWYWx1ZVR5cGUKKyAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBnZXRTZXRDQ1Jlc3VsdFR5cGUoRVZUIFZUKSBjb25zdDsKKworICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0OworICBwcml2YXRlOgorICAgIC8vIFN1YnRhcmdldCBJbmZvCisgICAgY29uc3QgTUJsYXplU3VidGFyZ2V0ICpTdWJ0YXJnZXQ7CisKKworICAgIC8vIExvd2VyIE9wZXJhbmQgaGVscGVycworICAgIFNEVmFsdWUgTG93ZXJDYWxsUmVzdWx0KFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgLy8gTG93ZXIgT3BlcmFuZCBzcGVjaWZpY3MKKyAgICBTRFZhbHVlIExvd2VyQ29uc3RhbnRQb29sKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyR2xvYmFsQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckdsb2JhbFRMU0FkZHJlc3MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJKdW1wVGFibGUoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJTRUxFQ1RfQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJWQVNUQVJUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJGb3JtYWxBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlckNhbGwoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgIGJvb2wgJmlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJSZXR1cm4oU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgdmlydHVhbCBNYWNoaW5lQmFzaWNCbG9jayAqCisgICAgICBFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAgIC8vIElubGluZSBhc20gc3VwcG9ydAorICAgIENvbnN0cmFpbnRUeXBlIGdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdDsKKworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+CisgICAgICAgICAgICAgIGdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3Q7CisKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4KKyAgICBnZXRSZWdDbGFzc0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZzZXRGb2xkaW5nTGVnYWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EpIGNvbnN0OworCisgICAgLy8vIGlzRlBJbW1MZWdhbCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGNhbiBpbnN0cnVjdGlvbiBzZWxlY3QgdGhlCisgICAgLy8vIHNwZWNpZmllZCBGUCBpbW1lZGlhdGUgbmF0aXZlbHkuIElmIGZhbHNlLCB0aGUgbGVnYWxpemVyIHdpbGwKKyAgICAvLy8gbWF0ZXJpYWxpemUgdGhlIEZQIGltbWVkaWF0ZSBhcyBhIGxvYWQgZnJvbSBhIGNvbnN0YW50IHBvb2wuCisgICAgdmlydHVhbCBib29sIGlzRlBJbW1MZWdhbChjb25zdCBBUEZsb2F0ICZJbW0sIEVWVCBWVCkgY29uc3Q7CisgIH07Cit9CisKKyNlbmRpZiAvLyBNQmxhemVJU0VMTE9XRVJJTkdfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW5zdHJGUFUudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVJbnN0ckZQVS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDhhOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW5zdHJGUFUudGQKQEAgLTAsMCArMSwyMjMgQEAKKy8vPT09LSBNQmxhemVJbnN0ckZQVS50ZCAtIE1CbGF6ZSBGUFUgSW5zdHJ1Y3Rpb24gZGVmcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNQmxhemUgcHJvZmlsZXMgYW5kIG5vZGVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUJsYXplIE9wZXJhbmQsIENvbXBsZXggUGF0dGVybnMgYW5kIFRyYW5zZm9ybWF0aW9ucyBEZWZpbml0aW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNZW1vcnkgQWNjZXNzIEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIExvYWRGTTxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBQYXRGcmFnIE9wTm9kZT4gOgorICAgICAgICAgICAgIFRBPG9wLCAweDAwMCwgKG91dHMgRkdSMzI6JGRzdCksIChpbnMgbWVtcnI6JGFkZHIpLAorICAgICAgICAgICAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiICAgJGRzdCwgJGFkZHIiKSwKKyAgICAgICAgICAgICAgICBbKHNldCBGR1IzMjokZHN0LCAoT3BOb2RlIHhhZGRyOiRhZGRyKSldLCBJSUxvYWQ+OworCitjbGFzcyBMb2FkRk1JPGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20sIFBhdEZyYWcgT3BOb2RlPiA6CisgICAgICAgICAgICAgIFRBSTxvcCwgKG91dHMgRkdSMzI6JGRzdCksIChpbnMgbWVtcmk6JGFkZHIpLAorICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYWRkciIpLAorICAgICAgICAgICAgICAgICAgWyhzZXQgRkdSMzI6JGRzdCwgKE9wTm9kZSBpYWRkcjokYWRkcikpXSwgSUlMb2FkPjsKKworY2xhc3MgU3RvcmVGTTxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBQYXRGcmFnIE9wTm9kZT4gOgorICAgICAgICAgICAgICBUQTxvcCwgMHgwMDAsIChvdXRzKSwgKGlucyBGR1IzMjokZHN0LCBtZW1ycjokYWRkciksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiICAgJGRzdCwgJGFkZHIiKSwKKyAgICAgICAgICAgICAgICAgWyhPcE5vZGUgRkdSMzI6JGRzdCwgeGFkZHI6JGFkZHIpXSwgSUlTdG9yZT47CisKK2NsYXNzIFN0b3JlRk1JPGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20sIFBhdEZyYWcgT3BOb2RlPiA6CisgICAgICAgICAgICAgICBUQUk8b3AsIChvdXRzKSwgKGlucyBGR1IzMjokZHN0LCBtZW1ycjokYWRkciksCisgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYWRkciIpLAorICAgICAgICAgICAgICAgICAgIFsoT3BOb2RlIEZHUjMyOiRkc3QsIGlhZGRyOiRhZGRyKV0sIElJU3RvcmU+OworCitjbGFzcyBBcml0aEY8Yml0czw2PiBvcCwgYml0czwxMT4gZmxhZ3MsIHN0cmluZyBpbnN0cl9hc20sIFNETm9kZSBPcE5vZGUsCisgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICAgIFRBPG9wLCBmbGFncywgKG91dHMgRkdSMzI6JGRzdCksIChpbnMgRkdSMzI6JGIsIEZHUjMyOiRjKSwKKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRkc3QsICRiLCAkYyIpLAorICAgICAgICAgICAgICAgIFsoc2V0IEZHUjMyOiRkc3QsIChPcE5vZGUgRkdSMzI6JGIsIEZHUjMyOiRjKSldLCBpdGluPjsKKworY2xhc3MgQ21wRk48Yml0czw2PiBvcCwgYml0czwxMT4gZmxhZ3MsIHN0cmluZyBpbnN0cl9hc20sCisgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluPiA6CisgICAgICAgICAgICBUQTxvcCwgZmxhZ3MsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgRkdSMzI6JGIsIEZHUjMyOiRjKSwKKyAgICAgICAgICAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiICAgJGRzdCwgJGIsICRjIiksCisgICAgICAgICAgICAgICBbXSwgaXRpbj47CisKK2NsYXNzIEFyaXRoRlI8Yml0czw2PiBvcCwgYml0czwxMT4gZmxhZ3MsIHN0cmluZyBpbnN0cl9hc20sIFNETm9kZSBPcE5vZGUsCisgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICAgIFRBPG9wLCBmbGFncywgKG91dHMgRkdSMzI6JGRzdCksIChpbnMgRkdSMzI6JGIsIEZHUjMyOiRjKSwKKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRkc3QsICRjLCAkYiIpLAorICAgICAgICAgICAgICAgIFsoc2V0IEZHUjMyOiRkc3QsIChPcE5vZGUgRkdSMzI6JGIsIEZHUjMyOiRjKSldLCBpdGluPjsKKworY2xhc3MgQXJpdGhGMjxiaXRzPDY+IG9wLCBiaXRzPDExPiBmbGFncywgc3RyaW5nIGluc3RyX2FzbSwKKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICAgICBURjxvcCwgZmxhZ3MsIChvdXRzIEZHUjMyOiRkc3QpLCAoaW5zIEZHUjMyOiRiKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYiIpLAorICAgICAgICAgICAgICAgICBbXSwgaXRpbj47CisKK2NsYXNzIEFyaXRoSUY8Yml0czw2PiBvcCwgYml0czwxMT4gZmxhZ3MsIHN0cmluZyBpbnN0cl9hc20sCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+IDoKKyAgICAgICAgICAgICAgVEY8b3AsIGZsYWdzLCAob3V0cyBGR1IzMjokZHN0KSwgKGlucyBDUFVSZWdzOiRiKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYiIpLAorICAgICAgICAgICAgICAgICBbXSwgaXRpbj47CisKK2NsYXNzIEFyaXRoRkk8Yml0czw2PiBvcCwgYml0czwxMT4gZmxhZ3MsIHN0cmluZyBpbnN0cl9hc20sCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+IDoKKyAgICAgICAgICAgICAgVEY8b3AsIGZsYWdzLCAob3V0cyBDUFVSZWdzOiRkc3QpLCAoaW5zIEZHUjMyOiRiKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYiIpLAorICAgICAgICAgICAgICAgICBbXSwgaXRpbj47CisKK2NsYXNzIExvZ2ljRjxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtPiA6CisgICAgICAgICAgICAgVEFJPG9wLCAob3V0cyBGR1IzMjokZHN0KSwgKGlucyBGR1IzMjokYiwgRkdSMzI6JGMpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRkc3QsICRiLCAkYyIpLAorICAgICAgICAgICAgICAgICBbXSwKKyAgICAgICAgICAgICAgICAgSUlBbHU+OworCitjbGFzcyBMb2dpY0ZJPGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20+IDoKKyAgICAgICAgICAgICBUQUk8b3AsIChvdXRzIEZHUjMyOiRkc3QpLCAoaW5zIEZHUjMyOiRiLCBmaW1tOiRjKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYiwgJGMiKSwKKyAgICAgICAgICAgICAgICAgW10sCisgICAgICAgICAgICAgICAgIElJQWx1PjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBzZXVkbyBpbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGUFUgQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitsZXQgUHJlZGljYXRlcz1bSGFzRlBVXSBpbiB7CisgIGRlZiBGT1IgICAgOiAgTG9naWNGPDB4MjgsICJvciAgICAgIj47CisgIGRlZiBGT1JJICAgOiBMb2dpY0ZJPDB4MjgsICJvcmkgICAgIj47CisgIGRlZiBGQUREICAgOiAgQXJpdGhGPDB4MTYsIDB4MDAwLCAiZmFkZCAgICIsIGZhZGQsIElJQWx1PjsKKyAgZGVmIEZSU1VCICA6IEFyaXRoRlI8MHgxNiwgMHgwODAsICJmcnN1YiAgIiwgZnN1YiwgSUlBbHU+OworICBkZWYgRk1VTCAgIDogIEFyaXRoRjwweDE2LCAweDEwMCwgImZtdWwgICAiLCBmbXVsLCBJSUFsdT47CisgIGRlZiBGRElWICAgOiAgQXJpdGhGPDB4MTYsIDB4MTgwLCAiZmRpdiAgICIsIGZkaXYsIElJQWx1PjsKKworICBkZWYgTFdGICAgIDogICBMb2FkRk08MHgzMiwgImx3ICAgICAiLCBsb2FkPjsKKyAgZGVmIExXRkkgICA6ICBMb2FkRk1JPDB4MzIsICJsd2kgICAgIiwgbG9hZD47CisKKyAgZGVmIFNXRiAgICA6ICBTdG9yZUZNPDB4MzIsICJzdyAgICAgIiwgc3RvcmU+OworICBkZWYgU1dGSSAgIDogU3RvcmVGTUk8MHgzMiwgInN3aSAgICAiLCBzdG9yZT47Cit9CisKK2xldCBQcmVkaWNhdGVzPVtIYXNGUFUsSGFzU3FydF0gaW4geworICBkZWYgRkxUICAgIDogQXJpdGhJRjwweDE2LCAweDI4MCwgImZsdCAgICAiLCBJSUFsdT47CisgIGRlZiBGSU5UICAgOiBBcml0aEZJPDB4MTYsIDB4MzAwLCAiZmludCAgICIsIElJQWx1PjsKKyAgZGVmIEZTUVJUICA6IEFyaXRoRjI8MHgxNiwgMHgzMDAsICJmc3FydCAgIiwgSUlBbHU+OworfQorCitsZXQgaXNBc0NoZWFwQXNBTW92ZSA9IDEgaW4geworICBkZWYgRkNNUF9VTiA6IENtcEZOPDB4MTYsIDB4MjAwLCAiZmNtcC51biIsIElJQWx1PjsKKyAgZGVmIEZDTVBfTFQgOiBDbXBGTjwweDE2LCAweDIxMCwgImZjbXAubHQiLCBJSUFsdT47CisgIGRlZiBGQ01QX0VRIDogQ21wRk48MHgxNiwgMHgyMjAsICJmY21wLmVxIiwgSUlBbHU+OworICBkZWYgRkNNUF9MRSA6IENtcEZOPDB4MTYsIDB4MjMwLCAiZmNtcC5sZSIsIElJQWx1PjsKKyAgZGVmIEZDTVBfR1QgOiBDbXBGTjwweDE2LCAweDI0MCwgImZjbXAuZ3QiLCBJSUFsdT47CisgIGRlZiBGQ01QX05FIDogQ21wRk48MHgxNiwgMHgyNTAsICJmY21wLm5lIiwgSUlBbHU+OworICBkZWYgRkNNUF9HRSA6IENtcEZOPDB4MTYsIDB4MjYwLCAiZmNtcC5nZSIsIElJQWx1PjsKK30KKworCitsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMSBpbiB7CisgIGRlZiBTZWxlY3RfRkNDIDogTUJsYXplUHNldWRvPChvdXRzIEZHUjMyOiRkc3QpLAorICAgIChpbnMgRkdSMzI6JFQsIEZHUjMyOiRGLCBDUFVSZWdzOiRDTVAsIGkzMmltbTokQ0MpLAorICAgICI7IFNFTEVDVF9GQ0MgUFNFVURPISIsCisgICAgW10+OworfQorCisvLyBGbG9hdGluZyBwb2ludCBjb252ZXJzaW9ucworbGV0IFByZWRpY2F0ZXM9W0hhc0ZQVV0gaW4geworICBkZWYgOiBQYXQ8KHNpbnRfdG9fZnAgQ1BVUmVnczokViksIChGTFQgQ1BVUmVnczokVik+OworICBkZWYgOiBQYXQ8KGZwX3RvX3NpbnQgRkdSMzI6JFYpLCAoRklOVCBGR1IzMjokVik+OworICBkZWYgOiBQYXQ8KGZzcXJ0IEZHUjMyOiRWKSwgKEZTUVJUIEZHUjMyOiRWKT47Cit9CisKKy8vIFNFVF9DQyBvcGVyYXRpb25zCitsZXQgUHJlZGljYXRlcz1bSGFzRlBVXSBpbiB7CisgIGRlZiA6IFBhdDwoc2V0Y2MgRkdSMzI6JEwsIEZHUjMyOiRSLCBTRVRFUSksCisgICAgICAgICAgICAoU2VsZWN0X0NDIChBRERJIFIwLCAxKSwgKEFEREkgUjAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAoRkNNUF9FUSBGR1IzMjokTCwgRkdSMzI6JFIpLCAyKT47CisgIGRlZiA6IFBhdDwoc2V0Y2MgRkdSMzI6JEwsIEZHUjMyOiRSLCBTRVRORSksCisgICAgICAgICAgICAoU2VsZWN0X0NDIChBRERJIFIwLCAxKSwgKEFEREkgUjAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAoRkNNUF9FUSBGR1IzMjokTCwgRkdSMzI6JFIpLCAxKT47CisgIGRlZiA6IFBhdDwoc2V0Y2MgRkdSMzI6JEwsIEZHUjMyOiRSLCBTRVRPRVEpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfRVEgRkdSMzI6JEwsIEZHUjMyOiRSKSwgMik+OworIGRlZiA6IFBhdDwoc2V0Y2MgRkdSMzI6JEwsIEZHUjMyOiRSLCBTRVRPTkUpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKFhPUiAoRkNNUF9VTiBGR1IzMjokTCwgRkdSMzI6JFIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGQ01QX0VRIEZHUjMyOiRMLCBGR1IzMjokUikpLCAyKT47CisgIGRlZiA6IFBhdDwoc2V0Y2MgRkdSMzI6JEwsIEZHUjMyOiRSLCBTRVRPTkUpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKE9SIChGQ01QX1VOIEZHUjMyOiRMLCBGR1IzMjokUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRkNNUF9FUSBGR1IzMjokTCwgRkdSMzI6JFIpKSwgMik+OworICBkZWYgOiBQYXQ8KHNldGNjIEZHUjMyOiRMLCBGR1IzMjokUiwgU0VUR1QpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfR1QgRkdSMzI6JEwsIEZHUjMyOiRSKSwgMik+OworICBkZWYgOiBQYXQ8KHNldGNjIEZHUjMyOiRMLCBGR1IzMjokUiwgU0VUTFQpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfTFQgRkdSMzI6JEwsIEZHUjMyOiRSKSwgMik+OworICBkZWYgOiBQYXQ8KHNldGNjIEZHUjMyOiRMLCBGR1IzMjokUiwgU0VUR0UpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfR0UgRkdSMzI6JEwsIEZHUjMyOiRSKSwgMik+OworICBkZWYgOiBQYXQ8KHNldGNjIEZHUjMyOiRMLCBGR1IzMjokUiwgU0VUTEUpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfTEUgRkdSMzI6JEwsIEZHUjMyOiRSKSwgMik+OworICBkZWYgOiBQYXQ8KHNldGNjIEZHUjMyOiRMLCBGR1IzMjokUiwgU0VUT0dUKSwKKyAgICAgICAgICAgIChTZWxlY3RfQ0MgKEFEREkgUjAsIDEpLCAoQURESSBSMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgIChGQ01QX0dUIEZHUjMyOiRMLCBGR1IzMjokUiksIDIpPjsKKyAgZGVmIDogUGF0PChzZXRjYyBGR1IzMjokTCwgRkdSMzI6JFIsIFNFVE9MVCksCisgICAgICAgICAgICAoU2VsZWN0X0NDIChBRERJIFIwLCAxKSwgKEFEREkgUjAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAoRkNNUF9MVCBGR1IzMjokTCwgRkdSMzI6JFIpLCAyKT47CisgIGRlZiA6IFBhdDwoc2V0Y2MgRkdSMzI6JEwsIEZHUjMyOiRSLCBTRVRPR0UpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfR0UgRkdSMzI6JEwsIEZHUjMyOiRSKSwgMik+OworICBkZWYgOiBQYXQ8KHNldGNjIEZHUjMyOiRMLCBGR1IzMjokUiwgU0VUT0xFKSwKKyAgICAgICAgICAgIChTZWxlY3RfQ0MgKEFEREkgUjAsIDEpLCAoQURESSBSMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgIChGQ01QX0xFIEZHUjMyOiRMLCBGR1IzMjokUiksIDIpPjsKKyAgZGVmIDogUGF0PChzZXRjYyBGR1IzMjokTCwgRkdSMzI6JFIsIFNFVFVFUSksCisgICAgICAgICAgICAoU2VsZWN0X0NDIChBRERJIFIwLCAxKSwgKEFEREkgUjAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAoT1IgKEZDTVBfVU4gRkdSMzI6JEwsIEZHUjMyOiRSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGQ01QX0VRIEZHUjMyOiRMLCBGR1IzMjokUikpLCAyKT47CisgIGRlZiA6IFBhdDwoc2V0Y2MgRkdSMzI6JEwsIEZHUjMyOiRSLCBTRVRVTkUpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfTkUgRkdSMzI6JEwsIEZHUjMyOiRSKSwgMik+OworICBkZWYgOiBQYXQ8KHNldGNjIEZHUjMyOiRMLCBGR1IzMjokUiwgU0VUVUdUKSwKKyAgICAgICAgICAgIChTZWxlY3RfQ0MgKEFEREkgUjAsIDEpLCAoQURESSBSMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgIChPUiAoRkNNUF9VTiBGR1IzMjokTCwgRkdSMzI6JFIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfR1QgRkdSMzI6JEwsIEZHUjMyOiRSKSksIDIpPjsKKyAgZGVmIDogUGF0PChzZXRjYyBGR1IzMjokTCwgRkdSMzI6JFIsIFNFVFVMVCksCisgICAgICAgICAgICAoU2VsZWN0X0NDIChBRERJIFIwLCAxKSwgKEFEREkgUjAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAoT1IgKEZDTVBfVU4gRkdSMzI6JEwsIEZHUjMyOiRSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGQ01QX0xUIEZHUjMyOiRMLCBGR1IzMjokUikpLCAyKT47CisgIGRlZiA6IFBhdDwoc2V0Y2MgRkdSMzI6JEwsIEZHUjMyOiRSLCBTRVRVR0UpLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKE9SIChGQ01QX1VOIEZHUjMyOiRMLCBGR1IzMjokUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRkNNUF9HRSBGR1IzMjokTCwgRkdSMzI6JFIpKSwgMik+OworICBkZWYgOiBQYXQ8KHNldGNjIEZHUjMyOiRMLCBGR1IzMjokUiwgU0VUVUxFKSwKKyAgICAgICAgICAgIChTZWxlY3RfQ0MgKEFEREkgUjAsIDEpLCAoQURESSBSMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgIChPUiAoRkNNUF9VTiBGR1IzMjokTCwgRkdSMzI6JFIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfTEUgRkdSMzI6JEwsIEZHUjMyOiRSKSksIDIpPjsKKyAgZGVmIDogUGF0PChzZXRjYyBGR1IzMjokTCwgRkdSMzI6JFIsIFNFVE8pLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfVU4gRkdSMzI6JEwsIEZHUjMyOiRSKSwgMSk+OworICBkZWYgOiBQYXQ8KHNldGNjIEZHUjMyOiRMLCBGR1IzMjokUiwgU0VUVU8pLAorICAgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZDTVBfVU4gRkdSMzI6JEwsIEZHUjMyOiRSKSwgMik+OworfQorCisvLyBTRUxFQ1Qgb3BlcmF0aW9ucworZGVmIDogUGF0PChzZWxlY3QgQ1BVUmVnczokQywgRkdSMzI6JFQsIEZHUjMyOiRGKSwKKyAgICAgICAgICAoU2VsZWN0X0ZDQyBGR1IzMjokVCwgRkdSMzI6JEYsIENQVVJlZ3M6JEMsIDIpPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhdHRlcm5zIGZvciBGbG9hdGluZyBQb2ludCBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgOiBQYXQ8KGYzMiBmcGltbTokaW1tKSwgKEZPUkkgRjAsIGZwaW1tOiRpbW0pPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUluc3RyRlNMLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW5zdHJGU0wudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5OTk5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUluc3RyRlNMLnRkCkBAIC0wLDAgKzEsMTUzIEBACisvLz09PS0gTUJsYXplSW5zdHJGU0wudGQgLSBNQmxhemUgRlNMIEluc3RydWN0aW9uIGRlZnMgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRlNMIEluc3RydWN0aW9uIEZvcm1hdHMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBGU0xHZXREPGJpdHM8Nj4gb3AsIGJpdHM8MTE+IGZsYWdzLCBzdHJpbmcgaW5zdHJfYXNtLCBJbnRyaW5zaWMgT3BOb2RlPiA6CisgICAgICAgICAgICAgIFRBPG9wLCBmbGFncywgKG91dHMgQ1BVUmVnczokZHN0KSwgKGlucyBDUFVSZWdzOiRiKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgJGRzdCwgJGIiKSwKKyAgICAgICAgICAgICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoT3BOb2RlIENQVVJlZ3M6JGIpKV0sIElJQWx1PjsKKworY2xhc3MgRlNMR2V0PGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20sIEludHJpbnNpYyBPcE5vZGU+IDoKKyAgICAgICAgICAgICBUQUk8b3AsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgZnNsaW1tOiRiKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgJGRzdCwgJGIiKSwKKyAgICAgICAgICAgICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoT3BOb2RlIGltbVpFeHQ0OiRiKSldLCBJSUFsdT47CisKK2NsYXNzIEZTTFB1dEQ8Yml0czw2PiBvcCwgYml0czwxMT4gZmxhZ3MsIHN0cmluZyBpbnN0cl9hc20sIEludHJpbnNpYyBPcE5vZGU+IDoKKyAgICAgICAgICAgICAgVEE8b3AsIGZsYWdzLCAob3V0cyksIChpbnMgQ1BVUmVnczokdiwgQ1BVUmVnczokYiksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiICR2LCAkYiIpLAorICAgICAgICAgICAgICAgICBbKE9wTm9kZSBDUFVSZWdzOiR2LCBDUFVSZWdzOiRiKV0sIElJQWx1PjsKKworY2xhc3MgRlNMUHV0PGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20sIEludHJpbnNpYyBPcE5vZGU+IDoKKyAgICAgICAgICAgICBUQUk8b3AsIChvdXRzKSwgKGlucyBDUFVSZWdzOiR2LCBmc2xpbW06JGIpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAkdiwgJGIiKSwKKyAgICAgICAgICAgICAgICAgWyhPcE5vZGUgQ1BVUmVnczokdiwgaW1tWkV4dDQ6JGIpXSwgSUlBbHU+OworCitjbGFzcyBGU0xQdXRURDxiaXRzPDY+IG9wLCBiaXRzPDExPiBmbGFncywgc3RyaW5nIGluc3RyX2FzbSwgSW50cmluc2ljIE9wTm9kZT4gOgorICAgICAgICAgICAgICAgVEE8b3AsIGZsYWdzLCAob3V0cyksIChpbnMgQ1BVUmVnczokYiksCisgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAkYiIpLAorICAgICAgICAgICAgICAgICAgWyhPcE5vZGUgQ1BVUmVnczokYildLCBJSUFsdT47CisKK2NsYXNzIEZTTFB1dFQ8Yml0czw2PiBvcCwgc3RyaW5nIGluc3RyX2FzbSwgSW50cmluc2ljIE9wTm9kZT4gOgorICAgICAgICAgICAgICBUQUk8b3AsIChvdXRzKSwgKGlucyBmc2xpbW06JGIpLAorICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgJGIiKSwKKyAgICAgICAgICAgICAgICAgIFsoT3BOb2RlIGltbVpFeHQ0OiRiKV0sIElJQWx1PjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZTTCBHZXQgSW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIEdFVCAgICAgIDogRlNMR2V0PDB4MUIsICJnZXQgICAgICAiLCBpbnRfbWJsYXplX2ZzbF9nZXQ+OworZGVmIEFHRVQgICAgIDogRlNMR2V0PDB4MUIsICJhZ2V0ICAgICAiLCBpbnRfbWJsYXplX2ZzbF9hZ2V0PjsKK2RlZiBDR0VUICAgICA6IEZTTEdldDwweDFCLCAiY2dldCAgICAgIiwgaW50X21ibGF6ZV9mc2xfY2dldD47CitkZWYgQ0FHRVQgICAgOiBGU0xHZXQ8MHgxQiwgImNhZ2V0ICAgICIsIGludF9tYmxhemVfZnNsX2NhZ2V0PjsKK2RlZiBFR0VUICAgICA6IEZTTEdldDwweDFCLCAiZWdldCAgICAgIiwgaW50X21ibGF6ZV9mc2xfZWdldD47CitkZWYgRUFHRVQgICAgOiBGU0xHZXQ8MHgxQiwgImVhZ2V0ICAgICIsIGludF9tYmxhemVfZnNsX2VhZ2V0PjsKK2RlZiBFQ0dFVCAgICA6IEZTTEdldDwweDFCLCAiZWNnZXQgICAgIiwgaW50X21ibGF6ZV9mc2xfZWNnZXQ+OworZGVmIEVDQUdFVCAgIDogRlNMR2V0PDB4MUIsICJlY2FnZXQgICAiLCBpbnRfbWJsYXplX2ZzbF9lY2FnZXQ+OworZGVmIE5HRVQgICAgIDogRlNMR2V0PDB4MUIsICJuZ2V0ICAgICAiLCBpbnRfbWJsYXplX2ZzbF9uZ2V0PjsKK2RlZiBOQUdFVCAgICA6IEZTTEdldDwweDFCLCAibmFnZXQgICAgIiwgaW50X21ibGF6ZV9mc2xfbmFnZXQ+OworZGVmIE5DR0VUICAgIDogRlNMR2V0PDB4MUIsICJuY2dldCAgICAiLCBpbnRfbWJsYXplX2ZzbF9uY2dldD47CitkZWYgTkNBR0VUICAgOiBGU0xHZXQ8MHgxQiwgIm5jYWdldCAgICIsIGludF9tYmxhemVfZnNsX25jYWdldD47CitkZWYgTkVHRVQgICAgOiBGU0xHZXQ8MHgxQiwgIm5lZ2V0ICAgICIsIGludF9tYmxhemVfZnNsX25lZ2V0PjsKK2RlZiBORUFHRVQgICA6IEZTTEdldDwweDFCLCAibmVhZ2V0ICAgIiwgaW50X21ibGF6ZV9mc2xfbmVhZ2V0PjsKK2RlZiBORUNHRVQgICA6IEZTTEdldDwweDFCLCAibmVjZ2V0ICAgIiwgaW50X21ibGF6ZV9mc2xfbmVjZ2V0PjsKK2RlZiBORUNBR0VUICA6IEZTTEdldDwweDFCLCAibmVjYWdldCAgIiwgaW50X21ibGF6ZV9mc2xfbmVjYWdldD47CitkZWYgVEdFVCAgICAgOiBGU0xHZXQ8MHgxQiwgInRnZXQgICAgICIsIGludF9tYmxhemVfZnNsX3RnZXQ+OworZGVmIFRBR0VUICAgIDogRlNMR2V0PDB4MUIsICJ0YWdldCAgICAiLCBpbnRfbWJsYXplX2ZzbF90YWdldD47CitkZWYgVENHRVQgICAgOiBGU0xHZXQ8MHgxQiwgInRjZ2V0ICAgICIsIGludF9tYmxhemVfZnNsX3RjZ2V0PjsKK2RlZiBUQ0FHRVQgICA6IEZTTEdldDwweDFCLCAidGNhZ2V0ICAgIiwgaW50X21ibGF6ZV9mc2xfdGNhZ2V0PjsKK2RlZiBURUdFVCAgICA6IEZTTEdldDwweDFCLCAidGVnZXQgICAgIiwgaW50X21ibGF6ZV9mc2xfdGVnZXQ+OworZGVmIFRFQUdFVCAgIDogRlNMR2V0PDB4MUIsICJ0ZWFnZXQgICAiLCBpbnRfbWJsYXplX2ZzbF90ZWFnZXQ+OworZGVmIFRFQ0dFVCAgIDogRlNMR2V0PDB4MUIsICJ0ZWNnZXQgICAiLCBpbnRfbWJsYXplX2ZzbF90ZWNnZXQ+OworZGVmIFRFQ0FHRVQgIDogRlNMR2V0PDB4MUIsICJ0ZWNhZ2V0ICAiLCBpbnRfbWJsYXplX2ZzbF90ZWNhZ2V0PjsKK2RlZiBUTkdFVCAgICA6IEZTTEdldDwweDFCLCAidG5nZXQgICAgIiwgaW50X21ibGF6ZV9mc2xfdG5nZXQ+OworZGVmIFROQUdFVCAgIDogRlNMR2V0PDB4MUIsICJ0bmFnZXQgICAiLCBpbnRfbWJsYXplX2ZzbF90bmFnZXQ+OworZGVmIFROQ0dFVCAgIDogRlNMR2V0PDB4MUIsICJ0bmNnZXQgICAiLCBpbnRfbWJsYXplX2ZzbF90bmNnZXQ+OworZGVmIFROQ0FHRVQgIDogRlNMR2V0PDB4MUIsICJ0bmNhZ2V0ICAiLCBpbnRfbWJsYXplX2ZzbF90bmNhZ2V0PjsKK2RlZiBUTkVHRVQgICA6IEZTTEdldDwweDFCLCAidG5lZ2V0ICAgIiwgaW50X21ibGF6ZV9mc2xfdG5lZ2V0PjsKK2RlZiBUTkVBR0VUICA6IEZTTEdldDwweDFCLCAidG5lYWdldCAgIiwgaW50X21ibGF6ZV9mc2xfdG5lYWdldD47CitkZWYgVE5FQ0dFVCAgOiBGU0xHZXQ8MHgxQiwgInRuZWNnZXQgICIsIGludF9tYmxhemVfZnNsX3RuZWNnZXQ+OworZGVmIFRORUNBR0VUIDogRlNMR2V0PDB4MUIsICJ0bmVjYWdldCAiLCBpbnRfbWJsYXplX2ZzbF90bmVjYWdldD47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGU0wgRHluYW1pYyBHZXQgSW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIEdFVEQgICAgICA6IEZTTEdldEQ8MHgxQiwgMHgwMCwgImdldGQgICAgICIsIGludF9tYmxhemVfZnNsX2dldD47CitkZWYgQUdFVEQgICAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAiYWdldGQgICAgIiwgaW50X21ibGF6ZV9mc2xfYWdldD47CitkZWYgQ0dFVEQgICAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAiY2dldGQgICAgIiwgaW50X21ibGF6ZV9mc2xfY2dldD47CitkZWYgQ0FHRVREICAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAiY2FnZXRkICAgIiwgaW50X21ibGF6ZV9mc2xfY2FnZXQ+OworZGVmIEVHRVREICAgICA6IEZTTEdldEQ8MHgxQiwgMHgwMCwgImVnZXRkICAgICIsIGludF9tYmxhemVfZnNsX2VnZXQ+OworZGVmIEVBR0VURCAgICA6IEZTTEdldEQ8MHgxQiwgMHgwMCwgImVhZ2V0ZCAgICIsIGludF9tYmxhemVfZnNsX2VhZ2V0PjsKK2RlZiBFQ0dFVEQgICAgOiBGU0xHZXREPDB4MUIsIDB4MDAsICJlY2dldGQgICAiLCBpbnRfbWJsYXplX2ZzbF9lY2dldD47CitkZWYgRUNBR0VURCAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAiZWNhZ2V0ZCAgIiwgaW50X21ibGF6ZV9mc2xfZWNhZ2V0PjsKK2RlZiBOR0VURCAgICAgOiBGU0xHZXREPDB4MUIsIDB4MDAsICJuZ2V0ZCAgICAiLCBpbnRfbWJsYXplX2ZzbF9uZ2V0PjsKK2RlZiBOQUdFVEQgICAgOiBGU0xHZXREPDB4MUIsIDB4MDAsICJuYWdldGQgICAiLCBpbnRfbWJsYXplX2ZzbF9uYWdldD47CitkZWYgTkNHRVREICAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAibmNnZXRkICAgIiwgaW50X21ibGF6ZV9mc2xfbmNnZXQ+OworZGVmIE5DQUdFVEQgICA6IEZTTEdldEQ8MHgxQiwgMHgwMCwgIm5jYWdldGQgICIsIGludF9tYmxhemVfZnNsX25jYWdldD47CitkZWYgTkVHRVREICAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAibmVnZXRkICAgIiwgaW50X21ibGF6ZV9mc2xfbmVnZXQ+OworZGVmIE5FQUdFVEQgICA6IEZTTEdldEQ8MHgxQiwgMHgwMCwgIm5lYWdldGQgICIsIGludF9tYmxhemVfZnNsX25lYWdldD47CitkZWYgTkVDR0VURCAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAibmVjZ2V0ZCAgIiwgaW50X21ibGF6ZV9mc2xfbmVjZ2V0PjsKK2RlZiBORUNBR0VURCAgOiBGU0xHZXREPDB4MUIsIDB4MDAsICJuZWNhZ2V0ZCAiLCBpbnRfbWJsYXplX2ZzbF9uZWNhZ2V0PjsKK2RlZiBUR0VURCAgICAgOiBGU0xHZXREPDB4MUIsIDB4MDAsICJ0Z2V0ZCAgICAiLCBpbnRfbWJsYXplX2ZzbF90Z2V0PjsKK2RlZiBUQUdFVEQgICAgOiBGU0xHZXREPDB4MUIsIDB4MDAsICJ0YWdldGQgICAiLCBpbnRfbWJsYXplX2ZzbF90YWdldD47CitkZWYgVENHRVREICAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAidGNnZXRkICAgIiwgaW50X21ibGF6ZV9mc2xfdGNnZXQ+OworZGVmIFRDQUdFVEQgICA6IEZTTEdldEQ8MHgxQiwgMHgwMCwgInRjYWdldGQgICIsIGludF9tYmxhemVfZnNsX3RjYWdldD47CitkZWYgVEVHRVREICAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAidGVnZXRkICAgIiwgaW50X21ibGF6ZV9mc2xfdGVnZXQ+OworZGVmIFRFQUdFVEQgICA6IEZTTEdldEQ8MHgxQiwgMHgwMCwgInRlYWdldGQgICIsIGludF9tYmxhemVfZnNsX3RlYWdldD47CitkZWYgVEVDR0VURCAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAidGVjZ2V0ZCAgIiwgaW50X21ibGF6ZV9mc2xfdGVjZ2V0PjsKK2RlZiBURUNBR0VURCAgOiBGU0xHZXREPDB4MUIsIDB4MDAsICJ0ZWNhZ2V0ZCAiLCBpbnRfbWJsYXplX2ZzbF90ZWNhZ2V0PjsKK2RlZiBUTkdFVEQgICAgOiBGU0xHZXREPDB4MUIsIDB4MDAsICJ0bmdldGQgICAiLCBpbnRfbWJsYXplX2ZzbF90bmdldD47CitkZWYgVE5BR0VURCAgIDogRlNMR2V0RDwweDFCLCAweDAwLCAidG5hZ2V0ZCAgIiwgaW50X21ibGF6ZV9mc2xfdG5hZ2V0PjsKK2RlZiBUTkNHRVREICAgOiBGU0xHZXREPDB4MUIsIDB4MDAsICJ0bmNnZXRkICAiLCBpbnRfbWJsYXplX2ZzbF90bmNnZXQ+OworZGVmIFROQ0FHRVREICA6IEZTTEdldEQ8MHgxQiwgMHgwMCwgInRuY2FnZXRkICIsIGludF9tYmxhemVfZnNsX3RuY2FnZXQ+OworZGVmIFRORUdFVEQgICA6IEZTTEdldEQ8MHgxQiwgMHgwMCwgInRuZWdldGQgICIsIGludF9tYmxhemVfZnNsX3RuZWdldD47CitkZWYgVE5FQUdFVEQgIDogRlNMR2V0RDwweDFCLCAweDAwLCAidG5lYWdldGQgIiwgaW50X21ibGF6ZV9mc2xfdG5lYWdldD47CitkZWYgVE5FQ0dFVEQgIDogRlNMR2V0RDwweDFCLCAweDAwLCAidG5lY2dldGQgIiwgaW50X21ibGF6ZV9mc2xfdG5lY2dldD47CitkZWYgVE5FQ0FHRVREIDogRlNMR2V0RDwweDFCLCAweDAwLCAidG5lY2FnZXRkIiwgaW50X21ibGF6ZV9mc2xfdG5lY2FnZXQ+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRlNMIFB1dCBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgUFVUICAgICA6ICBGU0xQdXQ8MHgxQiwgInB1dCAgICAgICIsIGludF9tYmxhemVfZnNsX3B1dD47CitkZWYgQVBVVCAgICA6ICBGU0xQdXQ8MHgxQiwgImFwdXQgICAgICIsIGludF9tYmxhemVfZnNsX2FwdXQ+OworZGVmIENQVVQgICAgOiAgRlNMUHV0PDB4MUIsICJjcHV0ICAgICAiLCBpbnRfbWJsYXplX2ZzbF9jcHV0PjsKK2RlZiBDQVBVVCAgIDogIEZTTFB1dDwweDFCLCAiY2FwdXQgICAgIiwgaW50X21ibGF6ZV9mc2xfY2FwdXQ+OworZGVmIE5QVVQgICAgOiAgRlNMUHV0PDB4MUIsICJucHV0ICAgICAiLCBpbnRfbWJsYXplX2ZzbF9ucHV0PjsKK2RlZiBOQVBVVCAgIDogIEZTTFB1dDwweDFCLCAibmFwdXQgICAgIiwgaW50X21ibGF6ZV9mc2xfbmFwdXQ+OworZGVmIE5DUFVUICAgOiAgRlNMUHV0PDB4MUIsICJuY3B1dCAgICAiLCBpbnRfbWJsYXplX2ZzbF9uY3B1dD47CitkZWYgTkNBUFVUICA6ICBGU0xQdXQ8MHgxQiwgIm5jYXB1dCAgICIsIGludF9tYmxhemVfZnNsX25jYXB1dD47CitkZWYgVFBVVCAgICA6IEZTTFB1dFQ8MHgxQiwgInRwdXQgICAgICIsIGludF9tYmxhemVfZnNsX3RwdXQ+OworZGVmIFRBUFVUICAgOiBGU0xQdXRUPDB4MUIsICJ0YXB1dCAgICAiLCBpbnRfbWJsYXplX2ZzbF90YXB1dD47CitkZWYgVENQVVQgICA6IEZTTFB1dFQ8MHgxQiwgInRjcHV0ICAgICIsIGludF9tYmxhemVfZnNsX3RjcHV0PjsKK2RlZiBUQ0FQVVQgIDogRlNMUHV0VDwweDFCLCAidGNhcHV0ICAgIiwgaW50X21ibGF6ZV9mc2xfdGNhcHV0PjsKK2RlZiBUTlBVVCAgIDogRlNMUHV0VDwweDFCLCAidG5wdXQgICAgIiwgaW50X21ibGF6ZV9mc2xfdG5wdXQ+OworZGVmIFROQVBVVCAgOiBGU0xQdXRUPDB4MUIsICJ0bmFwdXQgICAiLCBpbnRfbWJsYXplX2ZzbF90bmFwdXQ+OworZGVmIFROQ1BVVCAgOiBGU0xQdXRUPDB4MUIsICJ0bmNwdXQgICAiLCBpbnRfbWJsYXplX2ZzbF90bmNwdXQ+OworZGVmIFROQ0FQVVQgOiBGU0xQdXRUPDB4MUIsICJ0bmNhcHV0ICAiLCBpbnRfbWJsYXplX2ZzbF90bmNhcHV0PjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZTTCBEeW5hbWljIFB1dCBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgUFVURCAgICAgOiAgRlNMUHV0RDwweDFCLCAweDAwLCAicHV0ZCAgICAgIiwgaW50X21ibGF6ZV9mc2xfcHV0PjsKK2RlZiBBUFVURCAgICA6ICBGU0xQdXREPDB4MUIsIDB4MDAsICJhcHV0ZCAgICAiLCBpbnRfbWJsYXplX2ZzbF9hcHV0PjsKK2RlZiBDUFVURCAgICA6ICBGU0xQdXREPDB4MUIsIDB4MDAsICJjcHV0ZCAgICAiLCBpbnRfbWJsYXplX2ZzbF9jcHV0PjsKK2RlZiBDQVBVVEQgICA6ICBGU0xQdXREPDB4MUIsIDB4MDAsICJjYXB1dGQgICAiLCBpbnRfbWJsYXplX2ZzbF9jYXB1dD47CitkZWYgTlBVVEQgICAgOiAgRlNMUHV0RDwweDFCLCAweDAwLCAibnB1dGQgICAgIiwgaW50X21ibGF6ZV9mc2xfbnB1dD47CitkZWYgTkFQVVREICAgOiAgRlNMUHV0RDwweDFCLCAweDAwLCAibmFwdXRkICAgIiwgaW50X21ibGF6ZV9mc2xfbmFwdXQ+OworZGVmIE5DUFVURCAgIDogIEZTTFB1dEQ8MHgxQiwgMHgwMCwgIm5jcHV0ZCAgICIsIGludF9tYmxhemVfZnNsX25jcHV0PjsKK2RlZiBOQ0FQVVREICA6ICBGU0xQdXREPDB4MUIsIDB4MDAsICJuY2FwdXRkICAiLCBpbnRfbWJsYXplX2ZzbF9uY2FwdXQ+OworZGVmIFRQVVREICAgIDogRlNMUHV0VEQ8MHgxQiwgMHgwMCwgInRwdXRkICAgICIsIGludF9tYmxhemVfZnNsX3RwdXQ+OworZGVmIFRBUFVURCAgIDogRlNMUHV0VEQ8MHgxQiwgMHgwMCwgInRhcHV0ZCAgICIsIGludF9tYmxhemVfZnNsX3RhcHV0PjsKK2RlZiBUQ1BVVEQgICA6IEZTTFB1dFREPDB4MUIsIDB4MDAsICJ0Y3B1dGQgICAiLCBpbnRfbWJsYXplX2ZzbF90Y3B1dD47CitkZWYgVENBUFVURCAgOiBGU0xQdXRURDwweDFCLCAweDAwLCAidGNhcHV0ZCAgIiwgaW50X21ibGF6ZV9mc2xfdGNhcHV0PjsKK2RlZiBUTlBVVEQgICA6IEZTTFB1dFREPDB4MUIsIDB4MDAsICJ0bnB1dGQgICAiLCBpbnRfbWJsYXplX2ZzbF90bnB1dD47CitkZWYgVE5BUFVURCAgOiBGU0xQdXRURDwweDFCLCAweDAwLCAidG5hcHV0ZCAgIiwgaW50X21ibGF6ZV9mc2xfdG5hcHV0PjsKK2RlZiBUTkNQVVREICA6IEZTTFB1dFREPDB4MUIsIDB4MDAsICJ0bmNwdXRkICAiLCBpbnRfbWJsYXplX2ZzbF90bmNwdXQ+OworZGVmIFROQ0FQVVREIDogRlNMUHV0VEQ8MHgxQiwgMHgwMCwgInRuY2FwdXRkICIsIGludF9tYmxhemVfZnNsX3RuY2FwdXQ+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW5zdHJGb3JtYXRzLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW5zdHJGb3JtYXRzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjU1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVJbnN0ckZvcm1hdHMudGQKQEAgLTAsMCArMSwyNDYgQEAKKy8vPT09LSBNQmxhemVJbnN0ckZvcm1hdHMudGQgLSBNQiBJbnN0cnVjdGlvbiBkZWZzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRGVzY3JpYmUgTUJsYXplIGluc3RydWN0aW9ucyBmb3JtYXQKKy8vCisvLyAgQ1BVIElOU1RSVUNUSU9OIEZPUk1BVFMKKy8vCisvLyAgb3Bjb2RlICAtIG9wZXJhdGlvbiBjb2RlLgorLy8gIHJkICAgICAgLSBkc3QgcmVnLgorLy8gIHJhICAgICAgLSBmaXJzdCBzcmMuIHJlZy4KKy8vICByYiAgICAgIC0gc2Vjb25kIHNyYy4gcmVnLgorLy8gIGltbTE2ICAgLSAxNi1iaXQgaW1tZWRpYXRlIHZhbHVlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEdlbmVyaWMgTUJsYXplIEZvcm1hdAorY2xhc3MgTUJsYXplSW5zdDxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4sIAorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOiBJbnN0cnVjdGlvbiAKK3sKKyAgZmllbGQgYml0czwzMj4gSW5zdDsKKworICBsZXQgTmFtZXNwYWNlID0gIk1CbGF6ZSI7CisKKyAgYml0czw2PiBvcGNvZGU7CisKKyAgLy8gVG9wIDYgYml0cyBhcmUgdGhlICdvcGNvZGUnIGZpZWxkCisgIGxldCBJbnN0ezAtNX0gPSBvcGNvZGU7ICAgCisgIAorICBkYWcgT3V0T3BlcmFuZExpc3QgPSBvdXRzOworICBkYWcgSW5PcGVyYW5kTGlzdCAgPSBpbnM7CisKKyAgbGV0IEFzbVN0cmluZyAgID0gYXNtc3RyOworICBsZXQgUGF0dGVybiAgICAgPSBwYXR0ZXJuOworICBsZXQgSXRpbmVyYXJ5ICAgPSBpdGluOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHNldWRvIGluc3RydWN0aW9uIGNsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworY2xhc3MgTUJsYXplUHNldWRvPGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj46CisgICAgICBNQmxhemVJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuLCBJSVBzZXVkbz47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUeXBlIEEgaW5zdHJ1Y3Rpb24gY2xhc3MgaW4gTUJsYXplIDogPHxvcGNvZGV8cmR8cmF8cmJ8ZmxhZ3N8PgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgVEE8Yml0czw2PiBvcCwgYml0czwxMT4gZmxhZ3MsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLAorICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4sIEluc3RySXRpbkNsYXNzIGl0aW4+IDogCisgICAgICAgICBNQmxhemVJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuLCBpdGluPiAKK3sKKyAgYml0czw1PiByZDsKKyAgYml0czw1PiByYTsKKyAgYml0czw1PiByYjsKKworICBsZXQgb3Bjb2RlID0gb3A7CisKKyAgbGV0IEluc3R7Ni0xMH0gID0gcmQ7CisgIGxldCBJbnN0ezExLTE1fSA9IHJhOyAKKyAgbGV0IEluc3R7MTYtMjB9ID0gcmI7CisgIGxldCBJbnN0ezIxLTMxfSA9IGZsYWdzOworfQorCitjbGFzcyBUQUk8Yml0czw2PiBvcCwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsCisgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4sIEluc3RySXRpbkNsYXNzIGl0aW4+IDoKKyAgICAgICAgICBNQmxhemVJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuLCBpdGluPgoreworICBiaXRzPDU+IHJkOworICBiaXRzPDU+IHJhOworICBiaXRzPDE2PiBpbW0xNjsKKworICBsZXQgb3Bjb2RlID0gb3A7CisKKyAgbGV0IEluc3R7Ni0xMH0gID0gcmQ7CisgIGxldCBJbnN0ezExLTE1fSA9IHJhOyAKKyAgbGV0IEluc3R7MTYtMzF9ID0gaW1tMTY7Cit9CisKK2NsYXNzIFRJTU08Yml0czw2PiBvcCwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsCisgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuLCBJbnN0ckl0aW5DbGFzcyBpdGluPiA6CisgICAgICAgICAgIE1CbGF6ZUluc3Q8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4sIGl0aW4+Cit7CisgIGJpdHM8NT4gcmE7CisgIGJpdHM8MTY+IGltbTE2OworCisgIGxldCBvcGNvZGUgPSBvcDsKKworICBsZXQgSW5zdHs2LTE1fSAgPSAwOworICBsZXQgSW5zdHsxNi0zMX0gPSBpbW0xNjsKK30KKworY2xhc3MgVEFERFI8Yml0czw2PiBvcCwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICAgTUJsYXplSW5zdDxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybiwgaXRpbj4KK3sKKyAgYml0czwyNj4gYWRkcjsKKworICBsZXQgb3Bjb2RlID0gb3A7CisKKyAgbGV0IEluc3R7Ni0zMX0gPSBhZGRyOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVHlwZSBCIGluc3RydWN0aW9uIGNsYXNzIGluIE1CbGF6ZSA6IDx8b3Bjb2RlfHJkfHJhfGltbWVkaWF0ZXw+CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBUQjxiaXRzPDY+IG9wLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4sCisgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluPiA6IAorICAgICAgICAgTUJsYXplSW5zdDxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybiwgaXRpbj4gCit7CisgIGJpdHM8NT4gIHJkOworICBiaXRzPDU+ICByYTsKKyAgYml0czwxNj4gaW1tMTY7CisKKyAgbGV0IG9wY29kZSA9IG9wOworCisgIGxldCBJbnN0ezYtMTB9ICA9IHJkOworICBsZXQgSW5zdHsxMS0xNX0gPSByYTsgCisgIGxldCBJbnN0ezE2LTMxfSA9IGltbTE2OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRmxvYXQgaW5zdHJ1Y3Rpb24gY2xhc3MgaW4gTUJsYXplIDogPHxvcGNvZGV8cmR8cmF8ZmxhZ3N8PgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgVEY8Yml0czw2PiBvcCwgYml0czwxMT4gZmxhZ3MsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLAorICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4sIEluc3RySXRpbkNsYXNzIGl0aW4+IDogCisgICAgICAgICBNQmxhemVJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuLCBpdGluPiAKK3sKKyAgYml0czw1PiAgcmQ7CisgIGJpdHM8NT4gIHJhOworCisgIGxldCBvcGNvZGUgPSBvcDsKKworICBsZXQgSW5zdHs2LTEwfSAgPSByZDsKKyAgbGV0IEluc3R7MTEtMTV9ID0gcmE7IAorICBsZXQgSW5zdHsxNi0yMH0gPSAwOworICBsZXQgSW5zdHsyMS0zMX0gPSBmbGFnczsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJyYW5jaCBpbnN0cnVjdGlvbiBjbGFzcyBpbiBNQmxhemUgOiA8fG9wY29kZXxyZHxicnxyYXxmbGFnc3w+CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBUQlI8Yml0czw2PiBvcCwgYml0czw1PiBiciwgYml0czwxMT4gZmxhZ3MsIGRhZyBvdXRzLCBkYWcgaW5zLAorICAgICAgICAgIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuLCBJbnN0ckl0aW5DbGFzcyBpdGluPiA6CisgICAgICAgICAgTUJsYXplSW5zdDxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybiwgaXRpbj4KK3sKKyAgYml0czw1PiByYTsKKworICBsZXQgb3Bjb2RlID0gb3A7CisKKyAgbGV0IEluc3R7Ni0xMH0gID0gMDsKKyAgbGV0IEluc3R7MTEtMTV9ID0gYnI7IAorICBsZXQgSW5zdHsxNi0yMH0gPSByYTsKKyAgbGV0IEluc3R7MjEtMzF9ID0gZmxhZ3M7Cit9CisKK2NsYXNzIFRCUkM8Yml0czw2PiBvcCwgYml0czw1PiBiciwgYml0czwxMT4gZmxhZ3MsIGRhZyBvdXRzLCBkYWcgaW5zLAorICAgICAgICAgICBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICBNQmxhemVJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuLCBpdGluPgoreworICBiaXRzPDU+IHJhOworICBiaXRzPDU+IHJiOworCisgIGxldCBvcGNvZGUgPSBvcDsKKworICBsZXQgSW5zdHs2LTEwfSAgPSBicjsKKyAgbGV0IEluc3R7MTEtMTV9ID0gcmE7IAorICBsZXQgSW5zdHsxNi0yMH0gPSByYjsKKyAgbGV0IEluc3R7MjEtMzF9ID0gZmxhZ3M7Cit9CisKK2NsYXNzIFRCUkw8Yml0czw2PiBvcCwgYml0czw1PiBiciwgYml0czwxMT4gZmxhZ3MsIGRhZyBvdXRzLCBkYWcgaW5zLAorICAgICAgICAgICBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICBNQmxhemVJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuLCBpdGluPgoreworICBiaXRzPDU+IHJhOworCisgIGxldCBvcGNvZGUgPSBvcDsKKworICBsZXQgSW5zdHs2LTEwfSAgPSAweEY7CisgIGxldCBJbnN0ezExLTE1fSA9IGJyOyAKKyAgbGV0IEluc3R7MTYtMjB9ID0gcmE7CisgIGxldCBJbnN0ezIxLTMxfSA9IGZsYWdzOworfQorCitjbGFzcyBUQlJJPGJpdHM8Nj4gb3AsIGJpdHM8NT4gYnIsIGRhZyBvdXRzLCBkYWcgaW5zLAorICAgICAgICAgICBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICBNQmxhemVJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuLCBpdGluPgoreworICBiaXRzPDE2PiBpbW0xNjsKKworICBsZXQgb3Bjb2RlID0gb3A7CisKKyAgbGV0IEluc3R7Ni0xMH0gID0gMDsKKyAgbGV0IEluc3R7MTEtMTV9ID0gYnI7IAorICBsZXQgSW5zdHsxNi0zMX0gPSBpbW0xNjsKK30KKworY2xhc3MgVEJSTEk8Yml0czw2PiBvcCwgYml0czw1PiBiciwgZGFnIG91dHMsIGRhZyBpbnMsCisgICAgICAgICAgICBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICAgTUJsYXplSW5zdDxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybiwgaXRpbj4KK3sKKyAgYml0czwxNj4gaW1tMTY7CisKKyAgbGV0IG9wY29kZSA9IG9wOworCisgIGxldCBJbnN0ezYtMTB9ICA9IDB4RjsKKyAgbGV0IEluc3R7MTEtMTV9ID0gYnI7IAorICBsZXQgSW5zdHsxNi0zMX0gPSBpbW0xNjsKK30KKworY2xhc3MgVEJSQ0k8Yml0czw2PiBvcCwgYml0czw1PiBiciwgZGFnIG91dHMsIGRhZyBpbnMsCisgICAgICAgICAgICBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICAgTUJsYXplSW5zdDxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybiwgaXRpbj4KK3sKKyAgYml0czw1PiByYTsKKyAgYml0czwxNj4gaW1tMTY7CisKKyAgbGV0IG9wY29kZSA9IG9wOworCisgIGxldCBJbnN0ezYtMTB9ICA9IGJyOworICBsZXQgSW5zdHsxMS0xNX0gPSByYTsgCisgIGxldCBJbnN0ezE2LTMxfSA9IGltbTE2OworfQorCitjbGFzcyBUUkVUPGJpdHM8Nj4gb3AsIGRhZyBvdXRzLCBkYWcgaW5zLAorICAgICAgICAgICAgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4sIEluc3RySXRpbkNsYXNzIGl0aW4+IDoKKyAgICAgICAgICAgIE1CbGF6ZUluc3Q8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4sIGl0aW4+Cit7CisgIGJpdHM8NT4gIHJhOworICBiaXRzPDE2PiBpbW0xNjsKKworICBsZXQgb3Bjb2RlID0gb3A7CisKKyAgbGV0IEluc3R7Ni0xMH0gID0gMHgxMDsKKyAgbGV0IEluc3R7MTEtMTV9ID0gcmE7IAorICBsZXQgSW5zdHsxNi0zMX0gPSBpbW0xNjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUluc3RySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVJbnN0ckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTBjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVJbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsMTQ0IEBACisvLz09PS0gTUJsYXplSW5zdHJJbmZvLmNwcCAtIE1CbGF6ZSBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbiAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgTUJsYXplIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1CbGF6ZUluc3RySW5mby5oIgorI2luY2x1ZGUgIk1CbGF6ZVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJNQmxhemVNYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJNQmxhemVHZW5JbnN0ckluZm8uaW5jIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworTUJsYXplSW5zdHJJbmZvOjpNQmxhemVJbnN0ckluZm8oTUJsYXplVGFyZ2V0TWFjaGluZSAmdG0pCisgIDogVGFyZ2V0SW5zdHJJbmZvSW1wbChNQmxhemVJbnN0cywgYXJyYXlfbGVuZ3Rob2YoTUJsYXplSW5zdHMpKSwKKyAgICBUTSh0bSksIFJJKCpUTS5nZXRTdWJ0YXJnZXRJbXBsKCksICp0aGlzKSB7fQorCitzdGF0aWMgYm9vbCBpc1plcm9JbW0oY29uc3QgTWFjaGluZU9wZXJhbmQgJm9wKSB7CisgIHJldHVybiBvcC5pc0ltbSgpICYmIG9wLmdldEltbSgpID09IDA7Cit9CisKKy8vLyBpc0xvYWRGcm9tU3RhY2tTbG90IC0gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGEgZGlyZWN0CisvLy8gbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorLy8vIHRoZSBkZXN0aW5hdGlvbiBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4IG9mIHRoZSBsb2FkZWQgc3RhY2sgc2xvdC4gIElmCisvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBsb2FkaW5nIGZyb20gdGhlIHN0YWNrIHNsb3QuCit1bnNpZ25lZCBNQmxhemVJbnN0ckluZm86OgoraXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBNQmxhemU6OkxXSSkgeworICAgIGlmICgoTUktPmdldE9wZXJhbmQoMikuaXNGSSgpKSAmJiAvLyBpcyBhIHN0YWNrIHNsb3QKKyAgICAgICAgKE1JLT5nZXRPcGVyYW5kKDEpLmlzSW1tKCkpICYmICAvLyB0aGUgaW1tIGlzIHplcm8KKyAgICAgICAgKGlzWmVyb0ltbShNSS0+Z2V0T3BlcmFuZCgxKSkpKSB7CisgICAgICBGcmFtZUluZGV4ID0gTUktPmdldE9wZXJhbmQoMikuZ2V0SW5kZXgoKTsKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworLy8vIGlzU3RvcmVUb1N0YWNrU2xvdCAtIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBhIGRpcmVjdAorLy8vIHN0b3JlIHRvIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorLy8vIHRoZSBzb3VyY2UgcmVnIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKy8vLyBub3QsIHJldHVybiAwLiAgVGhpcyBwcmVkaWNhdGUgbXVzdCByZXR1cm4gMCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzCisvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIHN0b3JpbmcgdG8gdGhlIHN0YWNrIHNsb3QuCit1bnNpZ25lZCBNQmxhemVJbnN0ckluZm86OgoraXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICBpZiAoTUktPmdldE9wY29kZSgpID09IE1CbGF6ZTo6U1dJKSB7CisgICAgaWYgKChNSS0+Z2V0T3BlcmFuZCgyKS5pc0ZJKCkpICYmIC8vIGlzIGEgc3RhY2sgc2xvdAorICAgICAgICAoTUktPmdldE9wZXJhbmQoMSkuaXNJbW0oKSkgJiYgIC8vIHRoZSBpbW0gaXMgemVybworICAgICAgICAoaXNaZXJvSW1tKE1JLT5nZXRPcGVyYW5kKDEpKSkpIHsKKyAgICAgIEZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbmRleCgpOworICAgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGluc2VydE5vb3AgLSBJZiBkYXRhIGhhemFyZCBjb25kaXRpb24gaXMgZm91bmQgaW5zZXJ0IHRoZSB0YXJnZXQgbm9wCisvLy8gaW5zdHJ1Y3Rpb24uCit2b2lkIE1CbGF6ZUluc3RySW5mbzo6CitpbnNlcnROb29wKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSkgY29uc3QgeworICBEZWJ1Z0xvYyBETDsKKyAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KE1CbGF6ZTo6Tk9QKSk7Cit9CisKK3ZvaWQgTUJsYXplSW5zdHJJbmZvOjoKK2NvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0IHsKKyAgbGx2bTo6QnVpbGRNSShNQkIsIEksIERMLCBnZXQoTUJsYXplOjpBREQpLCBEZXN0UmVnKQorICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpLmFkZFJlZyhNQmxhemU6OlIwKTsKK30KKwordm9pZCBNQmxhemVJbnN0ckluZm86Ogorc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZJLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgRGVidWdMb2MgREw7CisgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE1CbGF6ZTo6U1dJKSkuYWRkUmVnKFNyY1JlZyxnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAuYWRkSW1tKDApLmFkZEZyYW1lSW5kZXgoRkkpOworfQorCit2b2lkIE1CbGF6ZUluc3RySW5mbzo6Citsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgRGVidWdMb2MgREw7CisgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE1CbGF6ZTo6TFdJKSwgRGVzdFJlZykKKyAgICAgIC5hZGRJbW0oMCkuYWRkRnJhbWVJbmRleChGSSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCcmFuY2ggQW5hbHlzaXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCit1bnNpZ25lZCBNQmxhemVJbnN0ckluZm86OgorSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZCQiwKKyAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdCB7CisgIC8vIENhbiBvbmx5IGluc2VydCB1bmNvbmQgYnJhbmNoZXMgc28gZmFyLgorICBhc3NlcnQoQ29uZC5lbXB0eSgpICYmICFGQkIgJiYgVEJCICYmICJDYW4gb25seSBoYW5kbGUgdW5jb25kIGJyYW5jaGVzISIpOworICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoTUJsYXplOjpCUkkpKS5hZGRNQkIoVEJCKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLyBnZXRHbG9iYWxCYXNlUmVnIC0gUmV0dXJuIGEgdmlydHVhbCByZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZQorLy8vIHRoZSBnbG9iYWwgYmFzZSByZWdpc3RlciB2YWx1ZS4gT3V0cHV0IGluc3RydWN0aW9ucyByZXF1aXJlZCB0bworLy8vIGluaXRpYWxpemUgdGhlIHJlZ2lzdGVyIGluIHRoZSBmdW5jdGlvbiBlbnRyeSBibG9jaywgaWYgbmVjZXNzYXJ5LgorLy8vCit1bnNpZ25lZCBNQmxhemVJbnN0ckluZm86OmdldEdsb2JhbEJhc2VSZWcoTWFjaGluZUZ1bmN0aW9uICpNRikgY29uc3QgeworICBNQmxhemVGdW5jdGlvbkluZm8gKk1CbGF6ZUZJID0gTUYtPmdldEluZm88TUJsYXplRnVuY3Rpb25JbmZvPigpOworICB1bnNpZ25lZCBHbG9iYWxCYXNlUmVnID0gTUJsYXplRkktPmdldEdsb2JhbEJhc2VSZWcoKTsKKyAgaWYgKEdsb2JhbEJhc2VSZWcgIT0gMCkKKyAgICByZXR1cm4gR2xvYmFsQmFzZVJlZzsKKworICAvLyBJbnNlcnQgdGhlIHNldCBvZiBHbG9iYWxCYXNlUmVnIGludG8gdGhlIGZpcnN0IE1CQiBvZiB0aGUgZnVuY3Rpb24KKyAgTWFjaGluZUJhc2ljQmxvY2sgJkZpcnN0TUJCID0gTUYtPmZyb250KCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gRmlyc3RNQkIuYmVnaW4oKTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmUmVnSW5mbyA9IE1GLT5nZXRSZWdJbmZvKCk7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gTUYtPmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworCisgIEdsb2JhbEJhc2VSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihNQmxhemU6OkNQVVJlZ3NSZWdpc3RlckNsYXNzKTsKKyAgQnVpbGRNSShGaXJzdE1CQiwgTUJCSSwgRGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICAgICAgICBHbG9iYWxCYXNlUmVnKS5hZGRSZWcoTUJsYXplOjpSMjApOworICBSZWdJbmZvLmFkZExpdmVJbihNQmxhemU6OlIyMCk7CisKKyAgTUJsYXplRkktPnNldEdsb2JhbEJhc2VSZWcoR2xvYmFsQmFzZVJlZyk7CisgIHJldHVybiBHbG9iYWxCYXNlUmVnOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW5zdHJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVJbnN0ckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2RiYTBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW5zdHJJbmZvLmgKQEAgLTAsMCArMSwyMjYgQEAKKy8vPT09LSBNQmxhemVJbnN0ckluZm8uaCAtIE1CbGF6ZSBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBNQmxhemUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE1CTEFaRUlOU1RSVUNUSU9OSU5GT19ICisjZGVmaW5lIE1CTEFaRUlOU1RSVUNUSU9OSU5GT19ICisKKyNpbmNsdWRlICJNQmxhemUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgIk1CbGF6ZVJlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBNQmxhemUgeworCisgIC8vIE1CbGF6ZSBCcmFuY2ggQ29kZXMKKyAgZW51bSBGUEJyYW5jaENvZGUgeworICAgIEJSQU5DSF9GLAorICAgIEJSQU5DSF9ULAorICAgIEJSQU5DSF9GTCwKKyAgICBCUkFOQ0hfVEwsCisgICAgQlJBTkNIX0lOVkFMSUQKKyAgfTsKKworICAvLyBNQmxhemUgQ29uZGl0aW9uIENvZGVzCisgIGVudW0gQ29uZENvZGUgeworICAgIC8vIFRvIGJlIHVzZWQgd2l0aCBmbG9hdCBicmFuY2ggVHJ1ZQorICAgIEZDT05EX0YsCisgICAgRkNPTkRfVU4sCisgICAgRkNPTkRfRVEsCisgICAgRkNPTkRfVUVRLAorICAgIEZDT05EX09MVCwKKyAgICBGQ09ORF9VTFQsCisgICAgRkNPTkRfT0xFLAorICAgIEZDT05EX1VMRSwKKyAgICBGQ09ORF9TRiwKKyAgICBGQ09ORF9OR0xFLAorICAgIEZDT05EX1NFUSwKKyAgICBGQ09ORF9OR0wsCisgICAgRkNPTkRfTFQsCisgICAgRkNPTkRfTkdFLAorICAgIEZDT05EX0xFLAorICAgIEZDT05EX05HVCwKKworICAgIC8vIFRvIGJlIHVzZWQgd2l0aCBmbG9hdCBicmFuY2ggRmFsc2UKKyAgICAvLyBUaGlzIGNvbmRpdGlvbnMgaGF2ZSB0aGUgc2FtZSBtbmVtb25pYyBhcyB0aGUKKyAgICAvLyBhYm92ZSBvbmVzLCBidXQgYXJlIHVzZWQgd2l0aCBhIGJyYW5jaCBGYWxzZTsKKyAgICBGQ09ORF9ULAorICAgIEZDT05EX09SLAorICAgIEZDT05EX05FUSwKKyAgICBGQ09ORF9PR0wsCisgICAgRkNPTkRfVUdFLAorICAgIEZDT05EX09HRSwKKyAgICBGQ09ORF9VR1QsCisgICAgRkNPTkRfT0dULAorICAgIEZDT05EX1NULAorICAgIEZDT05EX0dMRSwKKyAgICBGQ09ORF9TTkUsCisgICAgRkNPTkRfR0wsCisgICAgRkNPTkRfTkxULAorICAgIEZDT05EX0dFLAorICAgIEZDT05EX05MRSwKKyAgICBGQ09ORF9HVCwKKworICAgIC8vIE9ubHkgaW50ZWdlciBjb25kaXRpb25zCisgICAgQ09ORF9FLAorICAgIENPTkRfR1osCisgICAgQ09ORF9HRVosCisgICAgQ09ORF9MWiwKKyAgICBDT05EX0xFWiwKKyAgICBDT05EX05FLAorICAgIENPTkRfSU5WQUxJRAorICB9OworCisgIC8vIFR1cm4gY29uZGl0aW9uIGNvZGUgaW50byBjb25kaXRpb25hbCBicmFuY2ggb3Bjb2RlLgorICB1bnNpZ25lZCBHZXRDb25kQnJhbmNoRnJvbUNvbmQoQ29uZENvZGUgQ0MpOworCisgIC8vLyBHZXRPcHBvc2l0ZUJyYW5jaENvbmRpdGlvbiAtIFJldHVybiB0aGUgaW52ZXJzZSBvZiB0aGUgc3BlY2lmaWVkIGNvbmQsCisgIC8vLyBlLmcuIHR1cm5pbmcgQ09ORF9FIHRvIENPTkRfTkUuCisgIENvbmRDb2RlIEdldE9wcG9zaXRlQnJhbmNoQ29uZGl0aW9uKE1CbGF6ZTo6Q29uZENvZGUgQ0MpOworCisgIC8vLyBNQmxhemVDQ1RvU3RyaW5nIC0gTWFwIGVhY2ggRlAgY29uZGl0aW9uIGNvZGUgdG8gaXRzIHN0cmluZworICBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKk1CbGF6ZUZDQ1RvU3RyaW5nKE1CbGF6ZTo6Q29uZENvZGUgQ0MpCisgIHsKKyAgICBzd2l0Y2ggKENDKSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGNvbmRpdGlvbiBjb2RlIik7CisgICAgICBjYXNlIEZDT05EX0Y6CisgICAgICBjYXNlIEZDT05EX1Q6ICAgcmV0dXJuICJmIjsKKyAgICAgIGNhc2UgRkNPTkRfVU46CisgICAgICBjYXNlIEZDT05EX09SOiAgcmV0dXJuICJ1biI7CisgICAgICBjYXNlIEZDT05EX0VROgorICAgICAgY2FzZSBGQ09ORF9ORVE6IHJldHVybiAiZXEiOworICAgICAgY2FzZSBGQ09ORF9VRVE6CisgICAgICBjYXNlIEZDT05EX09HTDogcmV0dXJuICJ1ZXEiOworICAgICAgY2FzZSBGQ09ORF9PTFQ6CisgICAgICBjYXNlIEZDT05EX1VHRTogcmV0dXJuICJvbHQiOworICAgICAgY2FzZSBGQ09ORF9VTFQ6CisgICAgICBjYXNlIEZDT05EX09HRTogcmV0dXJuICJ1bHQiOworICAgICAgY2FzZSBGQ09ORF9PTEU6CisgICAgICBjYXNlIEZDT05EX1VHVDogcmV0dXJuICJvbGUiOworICAgICAgY2FzZSBGQ09ORF9VTEU6CisgICAgICBjYXNlIEZDT05EX09HVDogcmV0dXJuICJ1bGUiOworICAgICAgY2FzZSBGQ09ORF9TRjoKKyAgICAgIGNhc2UgRkNPTkRfU1Q6ICByZXR1cm4gInNmIjsKKyAgICAgIGNhc2UgRkNPTkRfTkdMRToKKyAgICAgIGNhc2UgRkNPTkRfR0xFOiByZXR1cm4gIm5nbGUiOworICAgICAgY2FzZSBGQ09ORF9TRVE6CisgICAgICBjYXNlIEZDT05EX1NORTogcmV0dXJuICJzZXEiOworICAgICAgY2FzZSBGQ09ORF9OR0w6CisgICAgICBjYXNlIEZDT05EX0dMOiAgcmV0dXJuICJuZ2wiOworICAgICAgY2FzZSBGQ09ORF9MVDoKKyAgICAgIGNhc2UgRkNPTkRfTkxUOiByZXR1cm4gImx0IjsKKyAgICAgIGNhc2UgRkNPTkRfTkdFOgorICAgICAgY2FzZSBGQ09ORF9HRTogIHJldHVybiAiZ2UiOworICAgICAgY2FzZSBGQ09ORF9MRToKKyAgICAgIGNhc2UgRkNPTkRfTkxFOiByZXR1cm4gIm5sZSI7CisgICAgICBjYXNlIEZDT05EX05HVDoKKyAgICAgIGNhc2UgRkNPTkRfR1Q6ICByZXR1cm4gImd0IjsKKyAgICB9CisgIH0KK30KKworLy8vIE1CbGF6ZUlJIC0gVGhpcyBuYW1lc3BhY2UgaG9sZHMgYWxsIG9mIHRoZSB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgdGhhdAorLy8vIGluc3RydWN0aW9uIGluZm8gdHJhY2tzLgorLy8vCituYW1lc3BhY2UgTUJsYXplSUkgeworICAvLy8gVGFyZ2V0IE9wZXJhbmQgRmxhZyBlbnVtLgorICBlbnVtIFRPRiB7CisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vIE1CbGF6ZSBTcGVjaWZpYyBNYWNoaW5lT3BlcmFuZCBmbGFncy4KKyAgICBNT19OT19GTEFHLAorCisgICAgLy8vIE1PX0dPVCAtIFJlcHJlc2VudHMgdGhlIG9mZnNldCBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGF0IHdoaWNoCisgICAgLy8vIHRoZSBhZGRyZXNzIHRoZSByZWxvY2F0aW9uIGVudHJ5IHN5bWJvbCByZXNpZGVzIGR1cmluZyBleGVjdXRpb24uCisgICAgTU9fR09ULAorCisgICAgLy8vIE1PX0dPVF9DQUxMIC0gUmVwcmVzZW50cyB0aGUgb2Zmc2V0IGludG8gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgYXQKKyAgICAvLy8gd2hpY2ggdGhlIGFkZHJlc3Mgb2YgYSBjYWxsIHNpdGUgcmVsb2NhdGlvbiBlbnRyeSBzeW1ib2wgcmVzaWRlcworICAgIC8vLyBkdXJpbmcgZXhlY3V0aW9uLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhYm92ZSBzaW5jZSB0aGlzIGZsYWcKKyAgICAvLy8gY2FuIG9ubHkgYmUgcHJlc2VudCBpbiBjYWxsIGluc3RydWN0aW9ucy4KKyAgICBNT19HT1RfQ0FMTCwKKworICAgIC8vLyBNT19HUFJFTCAtIFJlcHJlc2VudHMgdGhlIG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IGdwIHZhbHVlIHRvIGJlIHVzZWQKKyAgICAvLy8gZm9yIHRoZSByZWxvY2F0YWJsZSBvYmplY3QgZmlsZSBiZWluZyBwcm9kdWNlZC4KKyAgICBNT19HUFJFTCwKKworICAgIC8vLyBNT19BQlNfSElMTyAtIFJlcHJlc2VudHMgdGhlIGhpIG9yIGxvdyBwYXJ0IG9mIGFuIGFic29sdXRlIHN5bWJvbAorICAgIC8vLyBhZGRyZXNzLgorICAgIE1PX0FCU19ISUxPCisKKyAgfTsKK30KKworY2xhc3MgTUJsYXplSW5zdHJJbmZvIDogcHVibGljIFRhcmdldEluc3RySW5mb0ltcGwgeworICBNQmxhemVUYXJnZXRNYWNoaW5lICZUTTsKKyAgY29uc3QgTUJsYXplUmVnaXN0ZXJJbmZvIFJJOworcHVibGljOgorICBleHBsaWNpdCBNQmxhemVJbnN0ckluZm8oTUJsYXplVGFyZ2V0TWFjaGluZSAmVE0pOworCisgIC8vLyBnZXRSZWdpc3RlckluZm8gLSBUYXJnZXRJbnN0ckluZm8gaXMgYSBzdXBlcnNldCBvZiBNUmVnaXN0ZXIgaW5mby4gIEFzCisgIC8vLyBzdWNoLCB3aGVuZXZlciBhIGNsaWVudCBoYXMgYW4gaW5zdGFuY2Ugb2YgaW5zdHJ1Y3Rpb24gaW5mbywgaXQgc2hvdWxkCisgIC8vLyBhbHdheXMgYmUgYWJsZSB0byBnZXQgcmVnaXN0ZXIgaW5mbyBhcyB3ZWxsICh0aHJvdWdoIHRoaXMgbWV0aG9kKS4KKyAgLy8vCisgIHZpcnR1YWwgY29uc3QgTUJsYXplUmVnaXN0ZXJJbmZvICZnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBSSTsgfQorCisgIC8vLyBpc0xvYWRGcm9tU3RhY2tTbG90IC0gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGEgZGlyZWN0CisgIC8vLyBsb2FkIGZyb20gYSBzdGFjayBzbG90LCByZXR1cm4gdGhlIHZpcnR1YWwgb3IgcGh5c2ljYWwgcmVnaXN0ZXIgbnVtYmVyIG9mCisgIC8vLyB0aGUgZGVzdGluYXRpb24gYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QuICBJZgorICAvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworICAvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIGxvYWRpbmcgZnJvbSB0aGUgc3RhY2sgc2xvdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworCisgIC8vLyBpc1N0b3JlVG9TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKyAgLy8vIHN0b3JlIHRvIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorICAvLy8gdGhlIHNvdXJjZSByZWcgYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QuICBJZgorICAvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworICAvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIHN0b3JpbmcgdG8gdGhlIHN0YWNrIHNsb3QuCisgIHZpcnR1YWwgdW5zaWduZWQgaXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisKKyAgLy8vIEJyYW5jaCBBbmFseXNpcworICB2aXJ0dWFsIHVuc2lnbmVkIEluc2VydEJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jayAqVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBETCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgIC8vLyBJbnNlcnQgbm9wIGluc3RydWN0aW9uIHdoZW4gaGF6YXJkIGNvbmRpdGlvbiBpcyBmb3VuZAorICB2aXJ0dWFsIHZvaWQgaW5zZXJ0Tm9vcChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpIGNvbnN0OworCisgIC8vLyBnZXRHbG9iYWxCYXNlUmVnIC0gUmV0dXJuIGEgdmlydHVhbCByZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZQorICAvLy8gdGhlIGdsb2JhbCBiYXNlIHJlZ2lzdGVyIHZhbHVlLiBPdXRwdXQgaW5zdHJ1Y3Rpb25zIHJlcXVpcmVkIHRvCisgIC8vLyBpbml0aWFsaXplIHRoZSByZWdpc3RlciBpbiB0aGUgZnVuY3Rpb24gZW50cnkgYmxvY2ssIGlmIG5lY2Vzc2FyeS4KKyAgLy8vCisgIHVuc2lnbmVkIGdldEdsb2JhbEJhc2VSZWcoTWFjaGluZUZ1bmN0aW9uICpNRikgY29uc3Q7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW5zdHJJbmZvLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW5zdHJJbmZvLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDA2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVJbnN0ckluZm8udGQKQEAgLTAsMCArMSw2NzIgQEAKKy8vPT09LSBNQmxhemVJbnN0ckluZm8udGQgLSBNQmxhemUgSW5zdHJ1Y3Rpb24gZGVmcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBmb3JtYXQgc3VwZXJjbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2luY2x1ZGUgIk1CbGF6ZUluc3RyRm9ybWF0cy50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1CbGF6ZSBwcm9maWxlcyBhbmQgbm9kZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgU0RUX01CbGF6ZVJldCAgICAgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFtTRFRDaXNJbnQ8MD5dPjsKK2RlZiBTRFRfTUJsYXplSm1wTGluayA6IFNEVHlwZVByb2ZpbGU8MCwgMSwgW1NEVENpc1ZUPDAsIGkzMj5dPjsKKworLy8gQ2FsbAorZGVmIE1CbGF6ZUptcExpbmsgOiBTRE5vZGU8Ik1CbGF6ZUlTRDo6Sm1wTGluayIsU0RUX01CbGF6ZUptcExpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbixTRE5QT3B0SW5GbGFnLFNETlBPdXRGbGFnXT47CisKKy8vIFJldHVybgorZGVmIE1CbGF6ZVJldCA6IFNETm9kZTwiTUJsYXplSVNEOjpSZXQiLCBTRFRfTUJsYXplUmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZ10+OworCisvLyBIaSBhbmQgTG8gbm9kZXMgYXJlIHVzZWQgdG8gaGFuZGxlIGdsb2JhbCBhZGRyZXNzZXMuIFVzZWQgb24gCisvLyBNQmxhemVJU2VsTG93ZXJpbmcgdG8gbG93ZXIgc3R1ZmYgbGlrZSBHbG9iYWxBZGRyZXNzLCBFeHRlcm5hbFN5bWJvbCAKKy8vIHN0YXRpYyBtb2RlbC4KK2RlZiBNQldyYXBwZXIgICA6IFNETm9kZTwiTUJsYXplSVNEOjpXcmFwIiwgU0RUSW50VW5hcnlPcD47CitkZWYgTUJsYXplR1BSZWwgOiBTRE5vZGU8Ik1CbGF6ZUlTRDo6R1BSZWwiLCBTRFRJbnRVbmFyeU9wPjsKKworZGVmIFNEVF9NQkNhbGxTZXFTdGFydCA6IFNEQ2FsbFNlcVN0YXJ0PFtTRFRDaXNWVDwwLCBpMzI+XT47CitkZWYgU0RUX01CQ2FsbFNlcUVuZCAgIDogU0RDYWxsU2VxRW5kPFtTRFRDaXNWVDwwLCBpMzI+LCBTRFRDaXNWVDwxLCBpMzI+XT47CisKKy8vIFRoZXNlIGFyZSB0YXJnZXQtaW5kZXBlbmRlbnQgbm9kZXMsIGJ1dCBoYXZlIHRhcmdldC1zcGVjaWZpYyBmb3JtYXRzLgorZGVmIGNhbGxzZXFfc3RhcnQgOiBTRE5vZGU8IklTRDo6Q0FMTFNFUV9TVEFSVCIsIFNEVF9NQkNhbGxTZXFTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPdXRGbGFnXT47CitkZWYgY2FsbHNlcV9lbmQgICA6IFNETm9kZTwiSVNEOjpDQUxMU0VRX0VORCIsIFNEVF9NQkNhbGxTZXFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZ10+OworCitkZWYgU0RUTUJsYXplU2VsZWN0Q0MgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFtTRFRDaXNTYW1lQXM8MCwgMT5dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1CbGF6ZSBJbnN0cnVjdGlvbiBQcmVkaWNhdGUgRGVmaW5pdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIEhhc1BpcGUzICAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0Lmhhc1BpcGUzKCkiPjsKK2RlZiBIYXNCYXJyZWwgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC5oYXNCYXJyZWwoKSI+OworZGVmIE5vQmFycmVsICAgICA6IFByZWRpY2F0ZTwiIVN1YnRhcmdldC5oYXNCYXJyZWwoKSI+OworZGVmIEhhc0RpdiAgICAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0Lmhhc0RpdigpIj47CitkZWYgSGFzTXVsICAgICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQuaGFzTXVsKCkiPjsKK2RlZiBIYXNGU0wgICAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC5oYXNGU0woKSI+OworZGVmIEhhc0VGU0wgICAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0Lmhhc0VGU0woKSI+OworZGVmIEhhc01TUlNldCAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0Lmhhc01TUlNldCgpIj47CitkZWYgSGFzRXhjZXB0aW9uIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQuaGFzRXhjZXB0aW9uKCkiPjsKK2RlZiBIYXNQYXRDbXAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC5oYXNQYXRDbXAoKSI+OworZGVmIEhhc0ZQVSAgICAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0Lmhhc0ZQVSgpIj47CitkZWYgSGFzRVNSICAgICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQuaGFzRVNSKCkiPjsKK2RlZiBIYXNQVlIgICAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC5oYXNQVlIoKSI+OworZGVmIEhhc011bDY0ICAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0Lmhhc011bDY0KCkiPjsKK2RlZiBIYXNTcXJ0ICAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC5oYXNTcXJ0KCkiPjsKK2RlZiBIYXNNTVUgICAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC5oYXNNTVUoKSI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUJsYXplIE9wZXJhbmQsIENvbXBsZXggUGF0dGVybnMgYW5kIFRyYW5zZm9ybWF0aW9ucyBEZWZpbml0aW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEluc3RydWN0aW9uIG9wZXJhbmQgdHlwZXMKK2RlZiBicnRhcmdldCAgICA6IE9wZXJhbmQ8T3RoZXJWVD47CitkZWYgY2FsbHRhcmdldCAgOiBPcGVyYW5kPGkzMj47CitkZWYgc2ltbTE2ICAgICAgOiBPcGVyYW5kPGkzMj47CitkZWYgdWltbTUgICAgICAgOiBPcGVyYW5kPGkzMj47CitkZWYgZmltbSAgICAgICAgOiBPcGVyYW5kPGYzMj47CisKKy8vIFVuc2lnbmVkIE9wZXJhbmQKK2RlZiB1aW1tMTYgICAgICA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFVuc2lnbmVkSW1tIjsKK30KKworLy8gRlNMIE9wZXJhbmQKK2RlZiBmc2xpbW0gICAgICA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludEZTTEltbSI7Cit9CisKKy8vIEFkZHJlc3Mgb3BlcmFuZAorZGVmIG1lbXJpIDogT3BlcmFuZDxpMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50TWVtT3BlcmFuZCI7CisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBzaW1tMTYsIENQVVJlZ3MpOworfQorCitkZWYgbWVtcnIgOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRNZW1PcGVyYW5kIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIENQVVJlZ3MsIENQVVJlZ3MpOworfQorCisvLyBUcmFuc2Zvcm1hdGlvbiBGdW5jdGlvbiAtIGdldCB0aGUgbG93ZXIgMTYgYml0cy4KK2RlZiBMTzE2IDogU0ROb2RlWEZvcm08aW1tLCBbeworICByZXR1cm4gZ2V0STMySW1tKCh1bnNpZ25lZClOLT5nZXRaRXh0VmFsdWUoKSAmIDB4RkZGRik7Cit9XT47CisKKy8vIFRyYW5zZm9ybWF0aW9uIEZ1bmN0aW9uIC0gZ2V0IHRoZSBoaWdoZXIgMTYgYml0cy4KK2RlZiBISTE2IDogU0ROb2RlWEZvcm08aW1tLCBbeworICByZXR1cm4gZ2V0STMySW1tKCh1bnNpZ25lZClOLT5nZXRaRXh0VmFsdWUoKSA+PiAxNik7Cit9XT47CisKKy8vIE5vZGUgaW1tZWRpYXRlIGZpdHMgYXMgMTYtYml0IHNpZ24gZXh0ZW5kZWQgb24gdGFyZ2V0IGltbWVkaWF0ZS4KKy8vIGUuZy4gYWRkaSwgYW5kaQorZGVmIGltbVNFeHQxNiAgOiBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gKE4tPmdldFpFeHRWYWx1ZSgpID4+IDE2KSA9PSAwOworfV0+OworCisvLyBOb2RlIGltbWVkaWF0ZSBmaXRzIGFzIDE2LWJpdCB6ZXJvIGV4dGVuZGVkIG9uIHRhcmdldCBpbW1lZGlhdGUuCisvLyBUaGUgTE8xNiBwYXJhbSBtZWFucyB0aGF0IG9ubHkgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIG5vZGUKKy8vIGltbWVkaWF0ZSBhcmUgY2F1Z2h0LgorLy8gZS5nLiBhZGRpdSwgc2x0aXUKK2RlZiBpbW1aRXh0MTYgIDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgcmV0dXJuIChOLT5nZXRaRXh0VmFsdWUoKSA+PiAxNikgPT0gMDsKK31dLCBMTzE2PjsKKworLy8gRlNMIGltbWVkaWF0ZSBmaWVsZCBtdXN0IGZpdCBpbiA0IGJpdHMuCitkZWYgaW1tWkV4dDQgOiBQYXRMZWFmPChpbW0pLCBbeworICAgICAgcmV0dXJuIE4tPmdldFpFeHRWYWx1ZSgpID09ICgoTi0+Z2V0WkV4dFZhbHVlKCkpICYgMHhmKSA7Cit9XT47CisKKy8vIHNoYW10IGZpZWxkIG11c3QgZml0IGluIDUgYml0cy4KK2RlZiBpbW1aRXh0NSA6IFBhdExlYWY8KGltbSksIFt7CisgICAgICByZXR1cm4gTi0+Z2V0WkV4dFZhbHVlKCkgPT0gKChOLT5nZXRaRXh0VmFsdWUoKSkgJiAweDFmKSA7Cit9XT47CisKKy8vIE1CbGF6ZSBBZGRyZXNzIE1vZGUhIFNETm9kZSBmcmFtZWluZGV4IGNvdWxkIHBvc3NpYmlseSBiZSBhIG1hdGNoCisvLyBzaW5jZSBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgZnJvbSBzdGFjayB1c2VkIGl0LgorZGVmIGlhZGRyIDogQ29tcGxleFBhdHRlcm48aTMyLCAyLCAiU2VsZWN0QWRkclJlZ0ltbSIsIFtmcmFtZWluZGV4XSwgW10+OworZGVmIHhhZGRyIDogQ29tcGxleFBhdHRlcm48aTMyLCAyLCAiU2VsZWN0QWRkclJlZ1JlZyIsIFtdLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQc2V1ZG8gaW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBBcyBzdGFjayBhbGlnbm1lbnQgaXMgYWx3YXlzIGRvbmUgd2l0aCBhZGRpdSwgd2UgbmVlZCBhIDE2LWJpdCBpbW1lZGlhdGUKK2xldCBEZWZzID0gW1IxXSwgVXNlcyA9IFtSMV0gaW4geworZGVmIEFESkNBTExTVEFDS0RPV04gOiBNQmxhemVQc2V1ZG88KG91dHMpLCAoaW5zIHNpbW0xNjokYW10KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH0gQURKQ0FMTFNUQUNLRE9XTiAkYW10IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGNhbGxzZXFfc3RhcnQgdGltbTokYW10KV0+OworZGVmIEFESkNBTExTVEFDS1VQICAgOiBNQmxhemVQc2V1ZG88KG91dHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgdWltbTE2OiRhbXQxLCBzaW1tMTY6JGFtdDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkezpjb21tZW50fSBBREpDQUxMU1RBQ0tVUCAkYW10MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhjYWxsc2VxX2VuZCB0aW1tOiRhbXQxLCB0aW1tOiRhbXQyKV0+OworfQorCisvLyBTb21lIGFzc2VtYmx5IG1hY3JvcyBuZWVkIHRvIGF2b2lkIHBzZXVkb2luc3RydWN0aW9ucyBhbmQgYXNzZW1ibGVyCisvLyBhdXRvbWF0aWMgcmVvZGVyaW5nLCB3ZSBzaG91bGQgcmVvcmRlciBvdXJzZWx2ZXMuCitkZWYgTUFDUk8gICAgIDogTUJsYXplUHNldWRvPChvdXRzKSwgKGlucyksICIuc2V0IG1hY3JvIiwgICAgIFtdPjsKK2RlZiBSRU9SREVSICAgOiBNQmxhemVQc2V1ZG88KG91dHMpLCAoaW5zKSwgIi5zZXQgcmVvcmRlciIsICAgW10+OworZGVmIE5PTUFDUk8gICA6IE1CbGF6ZVBzZXVkbzwob3V0cyksIChpbnMpLCAiLnNldCBub21hY3JvIiwgICBbXT47CitkZWYgTk9SRU9SREVSIDogTUJsYXplUHNldWRvPChvdXRzKSwgKGlucyksICIuc2V0IG5vcmVvcmRlciIsIFtdPjsKKworLy8gV2hlbiBoYW5kbGluZyBQSUMgY29kZSB0aGUgYXNzZW1ibGVyIG5lZWRzIC5jcGxvYWQgYW5kIC5jcHJlc3RvcmUKKy8vIGRpcmVjdGl2ZXMuIElmIHRoZSByZWFsIGluc3RydWN0aW9ucyBjb3JyZXNwb25kaW5nIHRoZXNlIGRpcmVjdGl2ZXMKKy8vIGFyZSB1c2VkLCB3ZSBoYXZlIHRoZSBzYW1lIGJlaGF2aW9yLCBidXQgZ2V0IGFsc28gYSBidW5jaCBvZiB3YXJuaW5ncworLy8gZnJvbSB0aGUgYXNzZW1ibGVyLgorZGVmIENQTE9BRCA6IE1CbGF6ZVBzZXVkbzwob3V0cyksIChpbnMgQ1BVUmVnczokcmVnKSwgIi5jcGxvYWQgJHJlZyIsIFtdPjsKK2RlZiBDUFJFU1RPUkUgOiBNQmxhemVQc2V1ZG88KG91dHMpLCAoaW5zIHVpbW0xNjokbCksICIuY3ByZXN0b3JlICRsXG4iLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbnMgc3BlY2lmaWMgZm9ybWF0CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBBcml0aDxiaXRzPDY+IG9wLCBiaXRzPDExPiBmbGFncywgc3RyaW5nIGluc3RyX2FzbSwgU0ROb2RlIE9wTm9kZSwKKyAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+IDoKKyAgICAgICAgICAgIFRBPG9wLCBmbGFncywgKG91dHMgQ1BVUmVnczokZHN0KSwgKGlucyBDUFVSZWdzOiRiLCBDUFVSZWdzOiRjKSwKKyAgICAgICAgICAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiICAgJGRzdCwgJGIsICRjIiksCisgICAgICAgICAgICAgICBbKHNldCBDUFVSZWdzOiRkc3QsIChPcE5vZGUgQ1BVUmVnczokYiwgQ1BVUmVnczokYykpXSwgaXRpbj47CisKK2NsYXNzIEFyaXRoSTxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBTRE5vZGUgT3BOb2RlLAorICAgICAgICAgICAgIE9wZXJhbmQgT2QsIFBhdExlYWYgaW1tX3R5cGU+IDoKKyAgICAgICAgICAgICBUQUk8b3AsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgQ1BVUmVnczokYiwgT2Q6JGMpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRkc3QsICRiLCAkYyIpLAorICAgICAgICAgICAgICAgICBbKHNldCBDUFVSZWdzOiRkc3QsIChPcE5vZGUgQ1BVUmVnczokYiwgaW1tX3R5cGU6JGMpKV0sIElJQWx1PjsKKworY2xhc3MgQXJpdGhSPGJpdHM8Nj4gb3AsIGJpdHM8MTE+IGZsYWdzLCBzdHJpbmcgaW5zdHJfYXNtLCBTRE5vZGUgT3BOb2RlLAorICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICAgVEE8b3AsIGZsYWdzLCAob3V0cyBDUFVSZWdzOiRkc3QpLCAoaW5zIENQVVJlZ3M6JGMsIENQVVJlZ3M6JGIpLAorICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYywgJGIiKSwKKyAgICAgICAgICAgICAgIFsoc2V0IENQVVJlZ3M6JGRzdCwgKE9wTm9kZSBDUFVSZWdzOiRiLCBDUFVSZWdzOiRjKSldLCBpdGluPjsKKworY2xhc3MgQXJpdGhSSTxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBTRE5vZGUgT3BOb2RlLAorICAgICAgICAgICAgIE9wZXJhbmQgT2QsIFBhdExlYWYgaW1tX3R5cGU+IDoKKyAgICAgICAgICAgICBUQUk8b3AsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgT2Q6JGIsIENQVVJlZ3M6JGMpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRkc3QsICRjLCAkYiIpLAorICAgICAgICAgICAgICAgICBbKHNldCBDUFVSZWdzOiRkc3QsIChPcE5vZGUgaW1tX3R5cGU6JGIsIENQVVJlZ3M6JGMpKV0sIElJQWx1PjsKKworY2xhc3MgQXJpdGhOPGJpdHM8Nj4gb3AsIGJpdHM8MTE+IGZsYWdzLCBzdHJpbmcgaW5zdHJfYXNtLAorICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICAgVEE8b3AsIGZsYWdzLCAob3V0cyBDUFVSZWdzOiRkc3QpLCAoaW5zIENQVVJlZ3M6JGIsIENQVVJlZ3M6JGMpLAorICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYiwgJGMiKSwKKyAgICAgICAgICAgICAgIFtdLCBpdGluPjsKKworY2xhc3MgQXJpdGhOSTxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLE9wZXJhbmQgT2QsIFBhdExlYWYgaW1tX3R5cGU+IDoKKyAgICAgICAgICAgICBUQUk8b3AsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgQ1BVUmVnczokYiwgT2Q6JGMpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRkc3QsICRiLCAkYyIpLAorICAgICAgICAgICAgICAgICBbXSwgSUlBbHU+OworCitjbGFzcyBBcml0aFJOPGJpdHM8Nj4gb3AsIGJpdHM8MTE+IGZsYWdzLCBzdHJpbmcgaW5zdHJfYXNtLAorICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gOgorICAgICAgICAgICAgVEE8b3AsIGZsYWdzLCAob3V0cyBDUFVSZWdzOiRkc3QpLCAoaW5zIENQVVJlZ3M6JGMsIENQVVJlZ3M6JGIpLAorICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYiwgJGMiKSwKKyAgICAgICAgICAgICAgIFtdLCBpdGluPjsKKworY2xhc3MgQXJpdGhSTkk8Yml0czw2PiBvcCwgc3RyaW5nIGluc3RyX2FzbSxPcGVyYW5kIE9kLCBQYXRMZWFmIGltbV90eXBlPiA6CisgICAgICAgICAgICAgVEFJPG9wLCAob3V0cyBDUFVSZWdzOiRkc3QpLCAoaW5zIE9kOiRjLCBDUFVSZWdzOiRiKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYiwgJGMiKSwKKyAgICAgICAgICAgICAgICAgW10sIElJQWx1PjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1pc2MgQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIExvZ2ljPGJpdHM8Nj4gb3AsIGJpdHM8MTE+IGZsYWdzLCBzdHJpbmcgaW5zdHJfYXNtLCBTRE5vZGUgT3BOb2RlPiA6CisgICAgICAgICAgICBUQTxvcCwgZmxhZ3MsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgQ1BVUmVnczokYiwgQ1BVUmVnczokYyksCisgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRkc3QsICRiLCAkYyIpLAorICAgICAgICAgICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoT3BOb2RlIENQVVJlZ3M6JGIsIENQVVJlZ3M6JGMpKV0sIElJQWx1PjsKKworY2xhc3MgTG9naWNJPGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20sIFNETm9kZSBPcE5vZGU+IDoKKyAgICAgICAgICAgICBUQUk8b3AsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgQ1BVUmVnczokYiwgdWltbTE2OiRjKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYiwgJGMiKSwKKyAgICAgICAgICAgICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoT3BOb2RlIENQVVJlZ3M6JGIsIGltbVpFeHQxNjokYykpXSwKKyAgICAgICAgICAgICAgICAgSUlBbHU+OworCitjbGFzcyBFZmZlY3RpdmVBZGRyZXNzPHN0cmluZyBpbnN0cl9hc20+IDoKKyAgICAgICAgICBUQUk8MHgwOCwgKG91dHMgQ1BVUmVnczokZHN0KSwgKGlucyBtZW1yaTokYWRkciksCisgICAgICAgICAgICAgIGluc3RyX2FzbSwgWyhzZXQgQ1BVUmVnczokZHN0LCBpYWRkcjokYWRkcildLCBJSUFsdT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNZW1vcnkgQWNjZXNzIEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIExvYWRNPGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20sIFBhdEZyYWcgT3BOb2RlPiA6CisgICAgICAgICAgICBUQTxvcCwgMHgwMDAsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgbWVtcnI6JGFkZHIpLAorICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYWRkciIpLAorICAgICAgICAgICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoT3BOb2RlIHhhZGRyOiRhZGRyKSldLCBJSUxvYWQ+OworCitjbGFzcyBMb2FkTUk8Yml0czw2PiBvcCwgc3RyaW5nIGluc3RyX2FzbSwgUGF0RnJhZyBPcE5vZGU+IDoKKyAgICAgICAgICAgICBUQUk8b3AsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgbWVtcmk6JGFkZHIpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRkc3QsICRhZGRyIiksCisgICAgICAgICAgICAgICAgIFsoc2V0IENQVVJlZ3M6JGRzdCwgKE9wTm9kZSBpYWRkcjokYWRkcikpXSwgSUlMb2FkPjsKKworY2xhc3MgU3RvcmVNPGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20sIFBhdEZyYWcgT3BOb2RlPiA6CisgICAgICAgICAgICAgVEE8b3AsIDB4MDAwLCAob3V0cyksIChpbnMgQ1BVUmVnczokZHN0LCBtZW1ycjokYWRkciksCisgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkZHN0LCAkYWRkciIpLAorICAgICAgICAgICAgICAgIFsoT3BOb2RlIENQVVJlZ3M6JGRzdCwgeGFkZHI6JGFkZHIpXSwgSUlTdG9yZT47CisKK2NsYXNzIFN0b3JlTUk8Yml0czw2PiBvcCwgc3RyaW5nIGluc3RyX2FzbSwgUGF0RnJhZyBPcE5vZGU+IDoKKyAgICAgICAgICAgICAgVEFJPG9wLCAob3V0cyksIChpbnMgQ1BVUmVnczokZHN0LCBtZW1yaTokYWRkciksCisgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRkc3QsICRhZGRyIiksCisgICAgICAgICAgICAgICAgICBbKE9wTm9kZSBDUFVSZWdzOiRkc3QsIGlhZGRyOiRhZGRyKV0sIElJU3RvcmU+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQnJhbmNoIEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIEJyYW5jaDxiaXRzPDY+IG9wLCBiaXRzPDU+IGJyLCBiaXRzPDExPiBmbGFncywgc3RyaW5nIGluc3RyX2FzbT4gOgorICAgICAgICAgICAgIFRCUjxvcCwgYnIsIGZsYWdzLCAob3V0cyksIChpbnMgQ1BVUmVnczokdGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkdGFyZ2V0IiksCisgICAgICAgICAgICAgICAgIFsoYnJpbmQgQ1BVUmVnczokdGFyZ2V0KV0sIElJQnJhbmNoPjsKKworY2xhc3MgQnJhbmNoSTxiaXRzPDY+IG9wLCBiaXRzPDU+IGJyZiwgc3RyaW5nIGluc3RyX2FzbT4gOgorICAgICAgICAgICAgICBUQlJJPG9wLCBicmYsIChvdXRzKSwgKGlucyBicnRhcmdldDokdGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICR0YXJnZXQiKSwKKyAgICAgICAgICAgICAgICAgICBbKGJyIGJiOiR0YXJnZXQpXSwgSUlCcmFuY2g+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQnJhbmNoIGFuZCBMaW5rIEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIEJyYW5jaEw8Yml0czw2PiBvcCwgYml0czw1PiBiciwgYml0czwxMT4gZmxhZ3MsIHN0cmluZyBpbnN0cl9hc20+IDoKKyAgICAgICAgICAgICAgVEJSTDxvcCwgYnIsIGZsYWdzLCAob3V0cyksIChpbnMgQ1BVUmVnczokdGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgIHIxNSwgJHRhcmdldCIpLAorICAgICAgICAgICAgICAgICAgIFtdLCBJSUJyYW5jaD47CisKK2NsYXNzIEJyYW5jaExJPGJpdHM8Nj4gb3AsIGJpdHM8NT4gYnIsIHN0cmluZyBpbnN0cl9hc20+IDoKKyAgICAgICAgICAgICAgIFRCUkxJPG9wLCBiciwgKG91dHMpLCAoaW5zIGNhbGx0YXJnZXQ6JHRhcmdldCksCisgICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgIHIxNSwgJHRhcmdldCIpLAorICAgICAgICAgICAgICAgICAgICAgW10sIElJQnJhbmNoPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbmRpdGlvbmFsIEJyYW5jaCBJbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBCcmFuY2hDPGJpdHM8Nj4gb3AsIGJpdHM8NT4gYnIsIGJpdHM8MTE+IGZsYWdzLCBzdHJpbmcgaW5zdHJfYXNtLAorICAgICAgICAgICAgICBQYXRGcmFnIGNvbmRfb3A+IDoKKyAgICAgICAgICAgICAgVEJSQzxvcCwgYnIsIGZsYWdzLCAob3V0cyksCisgICAgICAgICAgICAgICAgICAgKGlucyBDUFVSZWdzOiRhLCBDUFVSZWdzOiRiLCBicnRhcmdldDokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIiAgICRhLCAkYiwgJG9mZnNldCIpLAorICAgICAgICAgICAgICAgICAgIFtdLCBJSUJyYW5jaD47IAorICAgICAgICAgICAgICAgICAgIC8vKGJyY29uZCAoY29uZF9vcCBDUFVSZWdzOiRhLCBDUFVSZWdzOiRiKSwgYmI6JG9mZnNldCldLAorICAgICAgICAgICAgICAgICAgIC8vSUlCcmFuY2g+OworCitjbGFzcyBCcmFuY2hDSTxiaXRzPDY+IG9wLCBiaXRzPDU+IGJyLCBzdHJpbmcgaW5zdHJfYXNtLCBQYXRGcmFnIGNvbmRfb3A+IDoKKyAgICAgICAgICAgICAgIFRCUkNJPG9wLCBiciwgKG91dHMpLCAoaW5zIENQVVJlZ3M6JGEsIGJydGFyZ2V0OiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICIgICAkYSwgJG9mZnNldCIpLAorICAgICAgICAgICAgICAgICAgICAgW10sIElJQnJhbmNoPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1CbGF6ZSBhcml0aG1ldGljIGluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbGV0IGlzQ29tbXV0YWJsZSA9IDEsIGlzQXNDaGVhcEFzQU1vdmUgPSAxIGluIHsKKyAgICBkZWYgQUREICAgIDogIEFyaXRoPDB4MDAsIDB4MDAwLCAiYWRkICAgICIsIGFkZCwgIElJQWx1PjsKKyAgICBkZWYgQUREQyAgIDogIEFyaXRoPDB4MDIsIDB4MDAwLCAiYWRkYyAgICIsIGFkZGUsIElJQWx1PjsKKyAgICBkZWYgQURESyAgIDogIEFyaXRoPDB4MDQsIDB4MDAwLCAiYWRkayAgICIsIGFkZGMsIElJQWx1PjsKKyAgICBkZWYgQURES0MgIDogQXJpdGhOPDB4MDYsIDB4MDAwLCAiYWRka2MgICIsIElJQWx1PjsKKyAgICBkZWYgQU5EICAgIDogIExvZ2ljPDB4MjEsIDB4MDAwLCAiYW5kICAgICIsIGFuZD47CisgICAgZGVmIE9SICAgICA6ICBMb2dpYzwweDIwLCAweDAwMCwgIm9yICAgICAiLCBvcj47CisgICAgZGVmIFhPUiAgICA6ICBMb2dpYzwweDIyLCAweDAwMCwgInhvciAgICAiLCB4b3I+OworfQorCitsZXQgaXNBc0NoZWFwQXNBTW92ZSA9IDEgaW4geworICAgIGRlZiBBTkROICAgOiAgQXJpdGhOPDB4MjMsIDB4MDAwLCAiYW5kbiAgICIsIElJQWx1PjsKKyAgICBkZWYgQ01QICAgIDogIEFyaXRoTjwweDA1LCAweDAwMSwgImNtcCAgICAiLCBJSUFsdT47CisgICAgZGVmIENNUFUgICA6ICBBcml0aE48MHgwNSwgMHgwMDMsICJjbXB1ICAgIiwgSUlBbHU+OworICAgIGRlZiBSU1VCICAgOiAgQXJpdGhSPDB4MDEsIDB4MDAwLCAicnN1YiAgICIsIHN1YiwgIElJQWx1PjsKKyAgICBkZWYgUlNVQkMgIDogIEFyaXRoUjwweDAzLCAweDAwMCwgInJzdWJjICAiLCBzdWJlLCBJSUFsdT47CisgICAgZGVmIFJTVUJLICA6ICBBcml0aFI8MHgwNSwgMHgwMDAsICJyc3ViayAgIiwgc3ViYywgSUlBbHU+OworICAgIGRlZiBSU1VCS0MgOiBBcml0aFJOPDB4MDcsIDB4MDAwLCAicnN1YmtjICIsIElJQWx1PjsKK30KKworbGV0IGlzQ29tbXV0YWJsZSA9IDEsIFByZWRpY2F0ZXM9W0hhc011bF0gaW4geworICAgIGRlZiBNVUwgICAgOiBBcml0aDwweDEwLCAweDAwMCwgIm11bCAgICAiLCBtdWwsICAgSUlBbHU+OworfQorCitsZXQgaXNDb21tdXRhYmxlID0gMSwgUHJlZGljYXRlcz1bSGFzTXVsLEhhc011bDY0XSBpbiB7CisgICAgZGVmIE1VTEggICA6IEFyaXRoPDB4MTAsIDB4MDAxLCAibXVsaCAgICIsIG11bGhzLCBJSUFsdT47CisgICAgZGVmIE1VTEhVICA6IEFyaXRoPDB4MTAsIDB4MDAzLCAibXVsaHUgICIsIG11bGh1LCBJSUFsdT47Cit9CisKK2xldCBQcmVkaWNhdGVzPVtIYXNNdWwsSGFzTXVsNjRdIGluIHsKKyAgICBkZWYgTVVMSFNVIDogQXJpdGhOPDB4MTAsIDB4MDAyLCAibXVsaHN1ICIsIElJQWx1PjsKK30KKworbGV0IFByZWRpY2F0ZXM9W0hhc0JhcnJlbF0gaW4geworICAgIGRlZiBCU1JMICAgOiAgIEFyaXRoPDB4MTEsIDB4MDAwLCAiYnNybCAgICIsIHNybCwgSUlBbHU+OworICAgIGRlZiBCU1JBICAgOiAgIEFyaXRoPDB4MTEsIDB4MjAwLCAiYnNyYSAgICIsIHNyYSwgSUlBbHU+OworICAgIGRlZiBCU0xMICAgOiAgIEFyaXRoPDB4MTEsIDB4NDAwLCAiYnNsbCAgICIsIHNobCwgSUlBbHU+OworICAgIGRlZiBCU1JMSSAgOiAgQXJpdGhJPDB4MTEsICJic3JsaSAgIiwgc3JsLCB1aW1tNSwgaW1tWkV4dDU+OworICAgIGRlZiBCU1JBSSAgOiAgQXJpdGhJPDB4MTEsICJic3JhaSAgIiwgc3JhLCB1aW1tNSwgaW1tWkV4dDU+OworICAgIGRlZiBCU0xMSSAgOiAgQXJpdGhJPDB4MTEsICJic2xsaSAgIiwgc2hsLCB1aW1tNSwgaW1tWkV4dDU+OworfQorCitsZXQgUHJlZGljYXRlcz1bSGFzRGl2XSBpbiB7CisgICAgZGVmIElESVYgICA6ICBBcml0aDwweDEyLCAweDAwMCwgImlkaXYgICAiLCBzZGl2LCBJSUFsdT47CisgICAgZGVmIElESVZVICA6ICBBcml0aDwweDEyLCAweDAwMiwgImlkaXZ1ICAiLCB1ZGl2LCBJSUFsdT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNQmxhemUgaW1tZWRpYXRlIG1vZGUgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBpc0FzQ2hlYXBBc0FNb3ZlID0gMSBpbiB7CisgICAgZGVmIEFEREkgICAgOiAgIEFyaXRoSTwweDA4LCAiYWRkaSAgICIsIGFkZCwgIHNpbW0xNiwgaW1tU0V4dDE2PjsKKyAgICBkZWYgQURESUMgICA6ICBBcml0aE5JPDB4MEEsICJhZGRpYyAgIiwgc2ltbTE2LCBpbW1TRXh0MTY+OworICAgIGRlZiBBRERJSyAgIDogIEFyaXRoTkk8MHgwQywgImFkZGlrICAiLCBzaW1tMTYsIGltbVNFeHQxNj47CisgICAgZGVmIEFERElLQyAgOiAgIEFyaXRoSTwweDBFLCAiYWRkaWtjICIsIGFkZGMsIHNpbW0xNiwgaW1tU0V4dDE2PjsKKyAgICBkZWYgUlNVQkkgICA6ICAgQXJpdGhSSTwweDA5LCAicnN1YmkgICIsIHN1YiwgIHNpbW0xNiwgaW1tU0V4dDE2PjsKKyAgICBkZWYgUlNVQklDICA6ICBBcml0aFJOSTwweDBCLCAicnN1YmkgICIsIHNpbW0xNiwgaW1tU0V4dDE2PjsKKyAgICBkZWYgUlNVQklLICA6ICBBcml0aFJOSTwweDBFLCAicnN1YmljICIsIHNpbW0xNiwgaW1tU0V4dDE2PjsKKyAgICBkZWYgUlNVQklLQyA6ICAgQXJpdGhSSTwweDBGLCAicnN1YmlrYyIsIHN1YmMsIHNpbW0xNiwgaW1tU0V4dDE2PjsKKyAgICBkZWYgQU5ETkkgICA6ICBBcml0aE5JPDB4MkIsICJhbmRuaSAgIiwgdWltbTE2LCBpbW1aRXh0MTY+OworICAgIGRlZiBBTkRJICAgIDogICBMb2dpY0k8MHgyOSwgImFuZGkgICAiLCBhbmQ+OworICAgIGRlZiBPUkkgICAgIDogICBMb2dpY0k8MHgyOCwgIm9yaSAgICAiLCBvcj47CisgICAgZGVmIFhPUkkgICAgOiAgIExvZ2ljSTwweDJBLCAieG9yaSAgICIsIHhvcj47Cit9CisKK2xldCBQcmVkaWNhdGVzPVtIYXNNdWxdIGluIHsKKyAgICBkZWYgTVVMSSAgICA6ICAgQXJpdGhJPDB4MTgsICJtdWxpICAgIiwgbXVsLCBzaW1tMTYsIGltbVNFeHQxNj47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNQmxhemUgbWVtb3J5IGFjY2VzcyBpbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbiB7CisgICAgZGVmIExCVSAgOiAgTG9hZE08MHgzMCwgImxidSAgICAiLCB6ZXh0bG9hZGk4PjsKKyAgICBkZWYgTEhVICA6ICBMb2FkTTwweDMxLCAibGh1ICAgICIsIHpleHRsb2FkaTE2PjsKKyAgICBkZWYgTFcgICA6ICBMb2FkTTwweDMyLCAibHcgICAgICIsIGxvYWQ+OworCisgICAgZGVmIExCVUkgOiBMb2FkTUk8MHgzMCwgImxidWkgICAiLCB6ZXh0bG9hZGk4PjsKKyAgICBkZWYgTEhVSSA6IExvYWRNSTwweDMxLCAibGh1aSAgICIsIHpleHRsb2FkaTE2PjsKKyAgICBkZWYgTFdJICA6IExvYWRNSTwweDMyLCAibHdpICAgICIsIGxvYWQ+OworfQorCisgICAgZGVmIFNCICA6ICBTdG9yZU08MHgzNCwgInNiICAgICAiLCB0cnVuY3N0b3JlaTg+OworICAgIGRlZiBTSCAgOiAgU3RvcmVNPDB4MzUsICJzaCAgICAgIiwgdHJ1bmNzdG9yZWkxNj47CisgICAgZGVmIFNXICA6ICBTdG9yZU08MHgzNiwgInN3ICAgICAiLCBzdG9yZT47CisKKyAgICBkZWYgU0JJIDogU3RvcmVNSTwweDM0LCAic2JpICAgICIsIHRydW5jc3RvcmVpOD47CisgICAgZGVmIFNISSA6IFN0b3JlTUk8MHgzNSwgInNoaSAgICAiLCB0cnVuY3N0b3JlaTE2PjsKKyAgICBkZWYgU1dJIDogU3RvcmVNSTwweDM2LCAic3dpICAgICIsIHN0b3JlPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1CbGF6ZSBicmFuY2ggaW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBoYXNDdHJsRGVwID0gMSBpbiB7CisgICAgZGVmIEJSSSAgICA6ICBCcmFuY2hJPDB4MkUsIDB4MDAsICJicmkgICAgIj47CisgICAgZGVmIEJSQUkgICA6ICBCcmFuY2hJPDB4MkUsIDB4MDgsICJicmFpICAgIj47CisgICAgZGVmIEJFUUkgICA6IEJyYW5jaENJPDB4MkYsIDB4MDAsICJiZXFpICAgIiwgc2V0ZXE+OworICAgIGRlZiBCTkVJICAgOiBCcmFuY2hDSTwweDJGLCAweDAxLCAiYm5laSAgICIsIHNldG5lPjsKKyAgICBkZWYgQkxUSSAgIDogQnJhbmNoQ0k8MHgyRiwgMHgwMiwgImJsdGkgICAiLCBzZXRsdD47CisgICAgZGVmIEJMRUkgICA6IEJyYW5jaENJPDB4MkYsIDB4MDMsICJibGVpICAgIiwgc2V0bGU+OworICAgIGRlZiBCR1RJICAgOiBCcmFuY2hDSTwweDJGLCAweDA0LCAiYmd0aSAgICIsIHNldGd0PjsKKyAgICBkZWYgQkdFSSAgIDogQnJhbmNoQ0k8MHgyRiwgMHgwNSwgImJnZWkgICAiLCBzZXRnZT47Cit9CisKK2xldCBpc0JyYW5jaCA9IDEsIGlzSW5kaXJlY3RCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBoYXNDdHJsRGVwID0gMSBpbiB7CisgICAgZGVmIEJSICAgICA6ICAgQnJhbmNoPDB4MjYsIDB4MDAsIDB4MDAwLCAiYnIgICAgICI+OworICAgIGRlZiBCUkEgICAgOiAgIEJyYW5jaDwweDI2LCAweDA4LCAweDAwMCwgImJyYSAgICAiPjsKKyAgICBkZWYgQkVRICAgIDogIEJyYW5jaEM8MHgyNywgMHgwMCwgMHgwMDAsICJiZXEgICAgIiwgc2V0ZXE+OworICAgIGRlZiBCTkUgICAgOiAgQnJhbmNoQzwweDI3LCAweDAxLCAweDAwMCwgImJuZSAgICAiLCBzZXRuZT47CisgICAgZGVmIEJMVCAgICA6ICBCcmFuY2hDPDB4MjcsIDB4MDIsIDB4MDAwLCAiYmx0ICAgICIsIHNldGx0PjsKKyAgICBkZWYgQkxFICAgIDogIEJyYW5jaEM8MHgyNywgMHgwMywgMHgwMDAsICJibGUgICAgIiwgc2V0bGU+OworICAgIGRlZiBCR1QgICAgOiAgQnJhbmNoQzwweDI3LCAweDA0LCAweDAwMCwgImJndCAgICAiLCBzZXRndD47CisgICAgZGVmIEJHRSAgICA6ICBCcmFuY2hDPDB4MjcsIDB4MDUsIDB4MDAwLCAiYmdlICAgICIsIHNldGdlPjsKK30KKworbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaGFzRGVsYXlTbG90ID0gMSwgaGFzQ3RybERlcCA9IDEgaW4geworICAgIGRlZiBCUklEICAgOiAgQnJhbmNoSTwweDJFLCAweDEwLCAiYnJpZCAgICI+OworICAgIGRlZiBCUkFJRCAgOiAgQnJhbmNoSTwweDJFLCAweDE4LCAiYnJhaWQgICI+OworICAgIGRlZiBCRVFJRCAgOiBCcmFuY2hDSTwweDJGLCAweDEwLCAiYmVxaWQgICIsIHNldGVxPjsKKyAgICBkZWYgQk5FSUQgIDogQnJhbmNoQ0k8MHgyRiwgMHgxMSwgImJuZWlkICAiLCBzZXRuZT47CisgICAgZGVmIEJMVElEICA6IEJyYW5jaENJPDB4MkYsIDB4MTIsICJibHRpZCAgIiwgc2V0bHQ+OworICAgIGRlZiBCTEVJRCAgOiBCcmFuY2hDSTwweDJGLCAweDEzLCAiYmxlaWQgICIsIHNldGxlPjsKKyAgICBkZWYgQkdUSUQgIDogQnJhbmNoQ0k8MHgyRiwgMHgxNCwgImJndGlkICAiLCBzZXRndD47CisgICAgZGVmIEJHRUlEICA6IEJyYW5jaENJPDB4MkYsIDB4MTUsICJiZ2VpZCAgIiwgc2V0Z2U+OworfQorCitsZXQgaXNCcmFuY2ggPSAxLCBpc0luZGlyZWN0QnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwKKyAgICBoYXNEZWxheVNsb3QgPSAxLCBoYXNDdHJsRGVwID0gMSBpbiB7CisgICAgZGVmIEJSRCAgICA6ICAgQnJhbmNoPDB4MjYsIDB4MTAsIDB4MDAwLCAiYnJkICAgICI+OworICAgIGRlZiBCUkFEICAgOiAgIEJyYW5jaDwweDI2LCAweDE4LCAweDAwMCwgImJyYWQgICAiPjsKKyAgICBkZWYgQkVRRCAgIDogIEJyYW5jaEM8MHgyNywgMHgxMCwgMHgwMDAsICJiZXFkICAgIiwgc2V0ZXE+OworICAgIGRlZiBCTkVEICAgOiAgQnJhbmNoQzwweDI3LCAweDExLCAweDAwMCwgImJuZWQgICAiLCBzZXRuZT47CisgICAgZGVmIEJMVEQgICA6ICBCcmFuY2hDPDB4MjcsIDB4MTIsIDB4MDAwLCAiYmx0ZCAgICIsIHNldGx0PjsKKyAgICBkZWYgQkxFRCAgIDogIEJyYW5jaEM8MHgyNywgMHgxMywgMHgwMDAsICJibGVkICAgIiwgc2V0bGU+OworICAgIGRlZiBCR1REICAgOiAgQnJhbmNoQzwweDI3LCAweDE0LCAweDAwMCwgImJndGQgICAiLCBzZXRndD47CisgICAgZGVmIEJHRUQgICA6ICBCcmFuY2hDPDB4MjcsIDB4MTUsIDB4MDAwLCAiYmdlZCAgICIsIHNldGdlPjsKK30KKworbGV0IGlzQ2FsbCA9IDEsIGhhc0N0cmxEZXAgPSAxLCBpc0luZGlyZWN0QnJhbmNoID0gMSwKKyAgICBEZWZzID0gW1IzLFI0LFI1LFI2LFI3LFI4LFI5LFIxMCxSMTEsUjEyXSwKKyAgICBVc2VzID0gW1IxLFI1LFI2LFI3LFI4LFI5LFIxMF0gaW4geworICAgIGRlZiBCUkwgICAgOiBCcmFuY2hMPDB4MjYsIDB4MDQsIDB4MDAwLCAiYnJsICAgICI+OworICAgIGRlZiBCUkFMICAgOiBCcmFuY2hMPDB4MjYsIDB4MEMsIDB4MDAwLCAiYnJhbCAgICI+OworfQorCitsZXQgaXNDYWxsID0gMSwgaGFzRGVsYXlTbG90ID0gMSwgaGFzQ3RybERlcCA9IDEsCisgICAgRGVmcyA9IFtSMyxSNCxSNSxSNixSNyxSOCxSOSxSMTAsUjExLFIxMl0sCisgICAgVXNlcyA9IFtSMSxSNSxSNixSNyxSOCxSOSxSMTBdIGluIHsKKyAgICBkZWYgQlJMSUQgIDogQnJhbmNoTEk8MHgyRSwgMHgxNCwgImJybGlkICAiPjsKKyAgICBkZWYgQlJBTElEIDogQnJhbmNoTEk8MHgyRSwgMHgxQywgImJyYWxpZCAiPjsKK30KKworbGV0IGlzQ2FsbCA9IDEsIGhhc0RlbGF5U2xvdCA9IDEsIGhhc0N0cmxEZXAgPSAxLCBpc0luZGlyZWN0QnJhbmNoID0gMSwKKyAgICBEZWZzID0gW1IzLFI0LFI1LFI2LFI3LFI4LFI5LFIxMCxSMTEsUjEyXSwKKyAgICBVc2VzID0gW1IxLFI1LFI2LFI3LFI4LFI5LFIxMF0gaW4geworICAgIGRlZiBCUkxEICAgOiBCcmFuY2hMPDB4MjYsIDB4MTQsIDB4MDAwLCAiYnJsZCAgICI+OworICAgIGRlZiBCUkFMRCAgOiBCcmFuY2hMPDB4MjYsIDB4MUMsIDB4MDAwLCAiYnJhbGQgICI+OworfQorCitsZXQgaXNSZXR1cm49MSwgaXNUZXJtaW5hdG9yPTEsIGhhc0RlbGF5U2xvdD0xLAorICAgIGlzQmFycmllcj0xLCBoYXNDdHJsRGVwPTEsIGltbTE2PTB4OCBpbiB7CisgICAgZGVmIFJUU0QgICA6IFRSRVQ8MHgyRCwgKG91dHMpLCAoaW5zIENQVVJlZ3M6JHRhcmdldCksCisgICAgICAgICAgICAgICAgICAgICAgInJ0c2QgICAgICAkdGFyZ2V0LCA4IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKE1CbGF6ZVJldCBDUFVSZWdzOiR0YXJnZXQpXSwKKyAgICAgICAgICAgICAgICAgICAgICBJSUJyYW5jaD47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNQmxhemUgbWlzYyBpbnN0cnVjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBhZGRyID0gMCBpbiB7CisgICAgZGVmIE5PUCA6ICBUQUREUjwweDAwLCAob3V0cyksIChpbnMpLCAibm9wICAgICIsIFtdLCBJSUFsdT47Cit9CisKK2xldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxIGluIHsKKyAgLy9jbGFzcyBQc2V1ZG9TZWxDQzxSZWdpc3RlckNsYXNzIFJDLCBzdHJpbmcgYXNtc3RyPjoKKyAgLy8gIE1CbGF6ZVBzZXVkbzwob3V0cyBSQzokRCksIChpbnMgUkM6JFQsIFJDOiRGLCBDUFVSZWdzOiRDTVApLCBhc21zdHIsCisgIC8vICBbKHNldCBSQzokRCwgKE1CbGF6ZVNlbGVjdENDIFJDOiRULCBSQzokRiwgQ1BVUmVnczokQ01QKSldPjsKKyAgLy9kZWYgU2VsZWN0X0NDIDogUHNldWRvU2VsQ0M8Q1BVUmVncywgIiMgTUJsYXplU2VsZWN0X0NDIj47CisKKyAgZGVmIFNlbGVjdF9DQyA6IE1CbGF6ZVBzZXVkbzwob3V0cyBDUFVSZWdzOiRkc3QpLAorICAgIChpbnMgQ1BVUmVnczokVCwgQ1BVUmVnczokRiwgQ1BVUmVnczokQ01QLCBpMzJpbW06JENDKSwKKyAgICAiOyBTRUxFQ1RfQ0MgUFNFVURPISIsCisgICAgW10+OworCisgIGRlZiBTaGlmdEwgOiBNQmxhemVQc2V1ZG88KG91dHMgQ1BVUmVnczokZHN0KSwKKyAgICAoaW5zIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpLAorICAgICI7IFNoaWZ0TCBQU0VVRE8hIiwKKyAgICBbXT47CisKKyAgZGVmIFNoaWZ0UkEgOiBNQmxhemVQc2V1ZG88KG91dHMgQ1BVUmVnczokZHN0KSwKKyAgICAoaW5zIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpLAorICAgICI7IFNoaWZ0UkEgUFNFVURPISIsCisgICAgW10+OworCisgIGRlZiBTaGlmdFJMIDogTUJsYXplUHNldWRvPChvdXRzIENQVVJlZ3M6JGRzdCksCisgICAgKGlucyBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKSwKKyAgICAiOyBTaGlmdFJMIFBTRVVETyEiLAorICAgIFtdPjsKK30KKworCitsZXQgcmIgPSAwIGluIHsKKyAgICBkZWYgU0VYVDE2IDogVEE8MHgyNCwgMHgwNjEsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgQ1BVUmVnczokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgInNleHQxNiAgJGRzdCwgJHNyYyIsIFtdLCBJSUFsdT47CisgICAgZGVmIFNFWFQ4ICA6IFRBPDB4MjQsIDB4MDYwLCAob3V0cyBDUFVSZWdzOiRkc3QpLCAoaW5zIENQVVJlZ3M6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJzZXh0OCAgICRkc3QsICRzcmMiLCBbXSwgSUlBbHU+OworICAgIGRlZiBTUkwgICAgOiBUQTwweDI0LCAweDA0MSwgKG91dHMgQ1BVUmVnczokZHN0KSwgKGlucyBDUFVSZWdzOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAic3JsICAgICAkZHN0LCAkc3JjIiwgW10sIElJQWx1PjsKKyAgICBkZWYgU1JBICAgIDogVEE8MHgyNCwgMHgwMDEsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgQ1BVUmVnczokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgInNyYSAgICAgJGRzdCwgJHNyYyIsIFtdLCBJSUFsdT47CisgICAgZGVmIFNSQyAgICA6IFRBPDB4MjQsIDB4MDIxLCAob3V0cyBDUFVSZWdzOiRkc3QpLCAoaW5zIENQVVJlZ3M6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJzcmMgICAgICRkc3QsICRzcmMiLCBbXSwgSUlBbHU+OworfQorCitkZWYgTEVBX0FEREkgOiBFZmZlY3RpdmVBZGRyZXNzPCJhZGRpICAgICRkc3QsICR7YWRkcjpzdGFja2xvY30iPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBBcmJpdHJhcnkgcGF0dGVybnMgdGhhdCBtYXAgdG8gb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBTbWFsbCBpbW1lZGlhdGVzCitkZWYgOiBQYXQ8KGkzMiAwKSwgKEFERCBSMCwgUjApPjsKK2RlZiA6IFBhdDwoaTMyIGltbVNFeHQxNjokaW1tKSwgKEFEREkgUjAsIGltbTokaW1tKT47CitkZWYgOiBQYXQ8KGkzMiBpbW1aRXh0MTY6JGltbSksIChPUkkgUjAsIGltbTokaW1tKT47CisKKy8vIEFyYml0cmFyeSBpbW1lZGlhdGVzCitkZWYgOiBQYXQ8KGkzMiBpbW06JGltbSksIChBRERJIFIwLCBpbW06JGltbSk+OworCisvLyBJbiByZWdpc3RlciBzaWduIGV4dGVuc2lvbgorZGVmIDogUGF0PChzZXh0X2lucmVnIENQVVJlZ3M6JHNyYywgaTE2KSwgKFNFWFQxNiBDUFVSZWdzOiRzcmMpPjsKK2RlZiA6IFBhdDwoc2V4dF9pbnJlZyBDUFVSZWdzOiRzcmMsIGk4KSwgIChTRVhUOCBDUFVSZWdzOiRzcmMpPjsKKworLy8gQ2FsbAorZGVmIDogUGF0PChNQmxhemVKbXBMaW5rIChpMzIgdGdsb2JhbGFkZHI6JGRzdCkpLCAoQlJMSUQgdGdsb2JhbGFkZHI6JGRzdCk+OworZGVmIDogUGF0PChNQmxhemVKbXBMaW5rIChpMzIgdGV4dGVybmFsc3ltOiRkc3QpKSwoQlJMSUQgdGV4dGVybmFsc3ltOiRkc3QpPjsKK2RlZiA6IFBhdDwoTUJsYXplSm1wTGluayBDUFVSZWdzOiRkc3QpLCAoQlJMRCBDUFVSZWdzOiRkc3QpPjsKKworLy8gU2hpZnQgSW5zdHJ1Y3Rpb25zCitkZWYgOiBQYXQ8KHNobCBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKSwgKFNoaWZ0TCBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKT47CitkZWYgOiBQYXQ8KHNyYSBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKSwgKFNoaWZ0UkEgQ1BVUmVnczokTCwgQ1BVUmVnczokUik+OworZGVmIDogUGF0PChzcmwgQ1BVUmVnczokTCwgQ1BVUmVnczokUiksIChTaGlmdFJMIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpPjsKKworLy8gU0VUX0NDIG9wZXJhdGlvbnMKK2RlZiA6IFBhdDwoc2V0Y2MgQ1BVUmVnczokTCwgQ1BVUmVnczokUiwgU0VURVEpLAorICAgICAgICAgIChTZWxlY3RfQ0MgKEFEREkgUjAsIDEpLCAoQURESSBSMCwgMCksIAorICAgICAgICAgICAgICAgICAgICAgKENNUCBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKSwgMSk+OworZGVmIDogUGF0PChzZXRjYyBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSLCBTRVRORSksCisgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwgCisgICAgICAgICAgICAgICAgICAgICAoQ01QIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpLCAyKT47CitkZWYgOiBQYXQ8KHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVEdUKSwKKyAgICAgICAgICAoU2VsZWN0X0NDIChBRERJIFIwLCAxKSwgKEFEREkgUjAsIDApLCAKKyAgICAgICAgICAgICAgICAgICAgIChDTVAgQ1BVUmVnczokTCwgQ1BVUmVnczokUiksIDMpPjsKK2RlZiA6IFBhdDwoc2V0Y2MgQ1BVUmVnczokTCwgQ1BVUmVnczokUiwgU0VUTFQpLAorICAgICAgICAgIChTZWxlY3RfQ0MgKEFEREkgUjAsIDEpLCAoQURESSBSMCwgMCksIAorICAgICAgICAgICAgICAgICAgICAgKENNUCBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKSwgNCk+OworZGVmIDogUGF0PChzZXRjYyBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSLCBTRVRHRSksCisgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwgCisgICAgICAgICAgICAgICAgICAgICAoQ01QIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpLCA1KT47CitkZWYgOiBQYXQ8KHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVExFKSwKKyAgICAgICAgICAoU2VsZWN0X0NDIChBRERJIFIwLCAxKSwgKEFEREkgUjAsIDApLCAKKyAgICAgICAgICAgICAgICAgICAgIChDTVAgQ1BVUmVnczokTCwgQ1BVUmVnczokUiksIDYpPjsKK2RlZiA6IFBhdDwoc2V0Y2MgQ1BVUmVnczokTCwgQ1BVUmVnczokUiwgU0VUVUdUKSwKKyAgICAgICAgICAoU2VsZWN0X0NDIChBRERJIFIwLCAxKSwgKEFEREkgUjAsIDApLCAKKyAgICAgICAgICAgICAgICAgICAgIChDTVBVIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpLCAzKT47CitkZWYgOiBQYXQ8KHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVFVMVCksCisgICAgICAgICAgKFNlbGVjdF9DQyAoQURESSBSMCwgMSksIChBRERJIFIwLCAwKSwgCisgICAgICAgICAgICAgICAgICAgICAoQ01QVSBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKSwgNCk+OworZGVmIDogUGF0PChzZXRjYyBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSLCBTRVRVR0UpLAorICAgICAgICAgIChTZWxlY3RfQ0MgKEFEREkgUjAsIDEpLCAoQURESSBSMCwgMCksIAorICAgICAgICAgICAgICAgICAgICAgKENNUFUgQ1BVUmVnczokTCwgQ1BVUmVnczokUiksIDUpPjsKK2RlZiA6IFBhdDwoc2V0Y2MgQ1BVUmVnczokTCwgQ1BVUmVnczokUiwgU0VUVUxFKSwKKyAgICAgICAgICAoU2VsZWN0X0NDIChBRERJIFIwLCAxKSwgKEFEREkgUjAsIDApLCAKKyAgICAgICAgICAgICAgICAgICAgIChDTVBVIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpLCA2KT47CisKKy8vIFNFTEVDVCBvcGVyYXRpb25zCitkZWYgOiBQYXQ8KHNlbGVjdCBDUFVSZWdzOiRDLCBDUFVSZWdzOiRULCBDUFVSZWdzOiRGKSwKKyAgICAgICAgICAoU2VsZWN0X0NDIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYsIENQVVJlZ3M6JEMsIDIpPjsKKworLy8gU0VMRUNUX0NDIAorZGVmIDogUGF0PChzZWxlY3RjYyBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSLCBDUFVSZWdzOiRULCBDUFVSZWdzOiRGLCBTRVRFUSksCisgICAgICAgICAgKFNlbGVjdF9DQyBDUFVSZWdzOiRULCBDUFVSZWdzOiRGLCAoQ01QIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpLCAxKT47CitkZWYgOiBQYXQ8KHNlbGVjdGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYsIFNFVE5FKSwKKyAgICAgICAgICAoU2VsZWN0X0NDIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYsIChDTVAgQ1BVUmVnczokTCwgQ1BVUmVnczokUiksIDIpPjsKK2RlZiA6IFBhdDwoc2VsZWN0Y2MgQ1BVUmVnczokTCwgQ1BVUmVnczokUiwgQ1BVUmVnczokVCwgQ1BVUmVnczokRiwgU0VUR1QpLAorICAgICAgICAgIChTZWxlY3RfQ0MgQ1BVUmVnczokVCwgQ1BVUmVnczokRiwgKENNUCBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKSwgMyk+OworZGVmIDogUGF0PChzZWxlY3RjYyBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSLCBDUFVSZWdzOiRULCBDUFVSZWdzOiRGLCBTRVRMVCksCisgICAgICAgICAgKFNlbGVjdF9DQyBDUFVSZWdzOiRULCBDUFVSZWdzOiRGLCAoQ01QIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpLCA0KT47CitkZWYgOiBQYXQ8KHNlbGVjdGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYsIFNFVEdFKSwKKyAgICAgICAgICAoU2VsZWN0X0NDIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYsIChDTVAgQ1BVUmVnczokTCwgQ1BVUmVnczokUiksIDUpPjsKK2RlZiA6IFBhdDwoc2VsZWN0Y2MgQ1BVUmVnczokTCwgQ1BVUmVnczokUiwgQ1BVUmVnczokVCwgQ1BVUmVnczokRiwgU0VUTEUpLAorICAgICAgICAgIChTZWxlY3RfQ0MgQ1BVUmVnczokVCwgQ1BVUmVnczokRiwgKENNUCBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKSwgNik+OworZGVmIDogUGF0PChzZWxlY3RjYyBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSLCBDUFVSZWdzOiRULCBDUFVSZWdzOiRGLCBTRVRVR1QpLAorICAgICAgICAgIChTZWxlY3RfQ0MgQ1BVUmVnczokVCwgQ1BVUmVnczokRiwgKENNUFUgQ1BVUmVnczokTCwgQ1BVUmVnczokUiksIDMpPjsKK2RlZiA6IFBhdDwoc2VsZWN0Y2MgQ1BVUmVnczokTCwgQ1BVUmVnczokUiwgQ1BVUmVnczokVCwgQ1BVUmVnczokRiwgU0VUVUxUKSwKKyAgICAgICAgICAoU2VsZWN0X0NDIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYsIChDTVBVIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIpLCA0KT47CitkZWYgOiBQYXQ8KHNlbGVjdGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYsIFNFVFVHRSksCisgICAgICAgICAgKFNlbGVjdF9DQyBDUFVSZWdzOiRULCBDUFVSZWdzOiRGLCAoQ01QVSBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSKSwgNSk+OworZGVmIDogUGF0PChzZWxlY3RjYyBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSLCBDUFVSZWdzOiRULCBDUFVSZWdzOiRGLCBTRVRVTEUpLAorICAgICAgICAgIChTZWxlY3RfQ0MgQ1BVUmVnczokVCwgQ1BVUmVnczokRiwgKENNUFUgQ1BVUmVnczokTCwgQ1BVUmVnczokUiksIDYpPjsKKworLy8gQlJDT05EIGluc3RydWN0aW9ucworZGVmIDogUGF0PChicmNvbmQgKHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVEVRKSwgYmI6JFQpLAorICAgICAgICAgIChCRVFJRCAoQ01QIENQVVJlZ3M6JFIsIENQVVJlZ3M6JEwpLCBiYjokVCk+OworZGVmIDogUGF0PChicmNvbmQgKHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVE5FKSwgYmI6JFQpLAorICAgICAgICAgIChCTkVJRCAoQ01QIENQVVJlZ3M6JFIsIENQVVJlZ3M6JEwpLCBiYjokVCk+OworZGVmIDogUGF0PChicmNvbmQgKHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVEdUKSwgYmI6JFQpLAorICAgICAgICAgIChCR1RJRCAoQ01QIENQVVJlZ3M6JFIsIENQVVJlZ3M6JEwpLCBiYjokVCk+OworZGVmIDogUGF0PChicmNvbmQgKHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVExUKSwgYmI6JFQpLAorICAgICAgICAgIChCTFRJRCAoQ01QIENQVVJlZ3M6JFIsIENQVVJlZ3M6JEwpLCBiYjokVCk+OworZGVmIDogUGF0PChicmNvbmQgKHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVEdFKSwgYmI6JFQpLAorICAgICAgICAgIChCR0VJRCAoQ01QIENQVVJlZ3M6JFIsIENQVVJlZ3M6JEwpLCBiYjokVCk+OworZGVmIDogUGF0PChicmNvbmQgKHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVExFKSwgYmI6JFQpLAorICAgICAgICAgIChCTEVJRCAoQ01QIENQVVJlZ3M6JFIsIENQVVJlZ3M6JEwpLCBiYjokVCk+OworZGVmIDogUGF0PChicmNvbmQgKHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVFVHVCksIGJiOiRUKSwKKyAgICAgICAgICAoQkdUSUQgKENNUFUgQ1BVUmVnczokUiwgQ1BVUmVnczokTCksIGJiOiRUKT47CitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0Y2MgQ1BVUmVnczokTCwgQ1BVUmVnczokUiwgU0VUVUxUKSwgYmI6JFQpLAorICAgICAgICAgIChCTFRJRCAoQ01QVSBDUFVSZWdzOiRSLCBDUFVSZWdzOiRMKSwgYmI6JFQpPjsKK2RlZiA6IFBhdDwoYnJjb25kIChzZXRjYyBDUFVSZWdzOiRMLCBDUFVSZWdzOiRSLCBTRVRVR0UpLCBiYjokVCksCisgICAgICAgICAgKEJHRUlEIChDTVBVIENQVVJlZ3M6JFIsIENQVVJlZ3M6JEwpLCBiYjokVCk+OworZGVmIDogUGF0PChicmNvbmQgKHNldGNjIENQVVJlZ3M6JEwsIENQVVJlZ3M6JFIsIFNFVFVMRSksIGJiOiRUKSwKKyAgICAgICAgICAoQkxFSUQgKENNUFUgQ1BVUmVnczokUiwgQ1BVUmVnczokTCksIGJiOiRUKT47CitkZWYgOiBQYXQ8KGJyY29uZCBDUFVSZWdzOiRDLCBiYjokVCksCisgICAgICAgICAgKEJORUlEIENQVVJlZ3M6JEMsIGJiOiRUKT47CisKKy8vIEp1bXAgdGFibGVzLCBnbG9iYWwgYWRkcmVzc2VzLCBhbmQgY29uc3RhbnQgcG9vbHMKK2RlZiA6IFBhdDwoTUJXcmFwcGVyIHRnbG9iYWxhZGRyOiRpbiksIChPUkkgUjAsIHRnbG9iYWxhZGRyOiRpbik+OworZGVmIDogUGF0PChNQldyYXBwZXIgdGp1bXB0YWJsZTokaW4pLCAgKE9SSSBSMCwgdGp1bXB0YWJsZTokaW4pPjsKK2RlZiA6IFBhdDwoTUJXcmFwcGVyIHRjb25zdHBvb2w6JGluKSwgIChPUkkgUjAsIHRjb25zdHBvb2w6JGluKT47CisKKy8vIE1pc2MgaW5zdHJ1Y3Rpb25zCitkZWYgOiBQYXQ8KGFuZCBDUFVSZWdzOiRsaCwgKG5vdCBDUFVSZWdzOiRyaCkpLChBTkROIENQVVJlZ3M6JGxoLCBDUFVSZWdzOiRyaCk+OworCisvLyBBcml0aG1ldGljIHdpdGggaW1tZWRpYXRlcworZGVmIDogUGF0PChhZGQgQ1BVUmVnczokaW4sIGltbTokaW1tKSwoQURESSBDUFVSZWdzOiRpbiwgaW1tOiRpbW0pPjsKK2RlZiA6IFBhdDwob3IgQ1BVUmVnczokaW4sIGltbTokaW1tKSwoT1JJIENQVVJlZ3M6JGluLCBpbW06JGltbSk+OworZGVmIDogUGF0PCh4b3IgQ1BVUmVnczokaW4sIGltbTokaW1tKSwoWE9SSSBDUFVSZWdzOiRpbiwgaW1tOiRpbW0pPjsKKworLy8gZXh0ZW5kZWQgbG9hZCBhbmQgc3RvcmVzCitkZWYgOiBQYXQ8KGV4dGxvYWRpMSAgaWFkZHI6JHNyYyksIChMQlVJIGlhZGRyOiRzcmMpPjsKK2RlZiA6IFBhdDwoZXh0bG9hZGk4ICBpYWRkcjokc3JjKSwgKExCVUkgaWFkZHI6JHNyYyk+OworZGVmIDogUGF0PChleHRsb2FkaTE2IGlhZGRyOiRzcmMpLCAoTEhVSSBpYWRkcjokc3JjKT47CitkZWYgOiBQYXQ8KGV4dGxvYWRpMSAgeGFkZHI6JHNyYyksIChMQlUgIHhhZGRyOiRzcmMpPjsKK2RlZiA6IFBhdDwoZXh0bG9hZGk4ICB4YWRkcjokc3JjKSwgKExCVSAgeGFkZHI6JHNyYyk+OworZGVmIDogUGF0PChleHRsb2FkaTE2IHhhZGRyOiRzcmMpLCAoTEhVICB4YWRkcjokc3JjKT47CisKK2RlZiA6IFBhdDwoc2V4dGxvYWRpMSAgaWFkZHI6JHNyYyksIChTRVhUOCAgKExCVUkgaWFkZHI6JHNyYykpPjsKK2RlZiA6IFBhdDwoc2V4dGxvYWRpOCAgaWFkZHI6JHNyYyksIChTRVhUOCAgKExCVUkgaWFkZHI6JHNyYykpPjsKK2RlZiA6IFBhdDwoc2V4dGxvYWRpMTYgaWFkZHI6JHNyYyksIChTRVhUMTYgKExIVUkgaWFkZHI6JHNyYykpPjsKK2RlZiA6IFBhdDwoc2V4dGxvYWRpMSAgeGFkZHI6JHNyYyksIChTRVhUOCAgKExCVSB4YWRkcjokc3JjKSk+OworZGVmIDogUGF0PChzZXh0bG9hZGk4ICB4YWRkcjokc3JjKSwgKFNFWFQ4ICAoTEJVIHhhZGRyOiRzcmMpKT47CitkZWYgOiBQYXQ8KHNleHRsb2FkaTE2IHhhZGRyOiRzcmMpLCAoU0VYVDE2IChMSFUgeGFkZHI6JHNyYykpPjsKKworLy8gcGVlcGhvbGVzCitkZWYgOiBQYXQ8KHN0b3JlIChpMzIgMCksIGlhZGRyOiRkc3QpLCAoU1dJIFIwLCBpYWRkcjokZHN0KT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGbG9hdGluZyBQb2ludCBTdXBwb3J0CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworaW5jbHVkZSAiTUJsYXplSW5zdHJGU0wudGQiCitpbmNsdWRlICJNQmxhemVJbnN0ckZQVS50ZCIKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUludHJpbnNpY0luZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW50cmluc2ljSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzMTg2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUludHJpbnNpY0luZm8uY3BwCkBAIC0wLDAgKzEsMTEzIEBACisvLz09PS0gTUJsYXplSW50cmluc2ljSW5mby5jcHAgLSBJbnRyaW5zaWMgSW5mb3JtYXRpb24gLTAwLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgTUJsYXplIGltcGxlbWVudGF0aW9uIG9mIFRhcmdldEludHJpbnNpY0luZm8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1CbGF6ZUludHJpbnNpY0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgbWJsYXplSW50cmluc2ljIHsKKworICBlbnVtIElEIHsKKyAgICBsYXN0X25vbl9tYmxhemVfaW50cmluc2ljID0gSW50cmluc2ljOjpudW1faW50cmluc2ljcy0xLAorI2RlZmluZSBHRVRfSU5UUklOU0lDX0VOVU1fVkFMVUVTCisjaW5jbHVkZSAiTUJsYXplR2VuSW50cmluc2ljcy5pbmMiCisjdW5kZWYgR0VUX0lOVFJJTlNJQ19FTlVNX1ZBTFVFUworICAgICwgbnVtX21ibGF6ZV9pbnRyaW5zaWNzCisgIH07CisKKyNkZWZpbmUgR0VUX0xMVk1fSU5UUklOU0lDX0ZPUl9HQ0NfQlVJTFRJTgorI2luY2x1ZGUgIk1CbGF6ZUdlbkludHJpbnNpY3MuaW5jIgorI3VuZGVmIEdFVF9MTFZNX0lOVFJJTlNJQ19GT1JfR0NDX0JVSUxUSU4KK30KKworc3RkOjpzdHJpbmcgTUJsYXplSW50cmluc2ljSW5mbzo6Z2V0TmFtZSh1bnNpZ25lZCBJbnRySUQsIGNvbnN0IFR5cGUgKipUeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bVR5cykgY29uc3QgeworICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbXSA9IHsKKyNkZWZpbmUgR0VUX0lOVFJJTlNJQ19OQU1FX1RBQkxFCisjaW5jbHVkZSAiTUJsYXplR2VuSW50cmluc2ljcy5pbmMiCisjdW5kZWYgR0VUX0lOVFJJTlNJQ19OQU1FX1RBQkxFCisgIH07CisKKyAgYXNzZXJ0KCFpc092ZXJsb2FkZWQoSW50cklEKSAmJiAiTUJsYXplIGludHJpbnNpY3MgYXJlIG5vdCBvdmVybG9hZGVkIik7CisgIGlmIChJbnRySUQgPCBJbnRyaW5zaWM6Om51bV9pbnRyaW5zaWNzKQorICAgIHJldHVybiAwOworICBhc3NlcnQoSW50cklEIDwgbWJsYXplSW50cmluc2ljOjpudW1fbWJsYXplX2ludHJpbnNpY3MgJiYgCisgICAgICAgICAiSW52YWxpZCBpbnRyaW5zaWMgSUQiKTsKKworICBzdGQ6OnN0cmluZyBSZXN1bHQobmFtZXNbSW50cklEIC0gSW50cmluc2ljOjpudW1faW50cmluc2ljc10pOworICByZXR1cm4gUmVzdWx0OworfQorCit1bnNpZ25lZCBNQmxhemVJbnRyaW5zaWNJbmZvOjoKK2xvb2t1cE5hbWUoY29uc3QgY2hhciAqTmFtZSwgdW5zaWduZWQgTGVuKSBjb25zdCB7CisgIGlmIChMZW4gPCA1IHx8IE5hbWVbNF0gIT0gJy4nIHx8IE5hbWVbMF0gIT0gJ2wnIHx8IE5hbWVbMV0gIT0gJ2wnCisgICAgICB8fCBOYW1lWzJdICE9ICd2JyB8fCBOYW1lWzNdICE9ICdtJykKKyAgICByZXR1cm4gMDsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggJ2xsdm0uJworCisjZGVmaW5lIEdFVF9GVU5DVElPTl9SRUNPR05JWkVSCisjaW5jbHVkZSAiTUJsYXplR2VuSW50cmluc2ljcy5pbmMiCisjdW5kZWYgR0VUX0ZVTkNUSU9OX1JFQ09HTklaRVIKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIE1CbGF6ZUludHJpbnNpY0luZm86OgorbG9va3VwR0NDTmFtZShjb25zdCBjaGFyICpOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1ibGF6ZUludHJpbnNpYzo6Z2V0SW50cmluc2ljRm9yR0NDQnVpbHRpbigibWJsYXplIixOYW1lKTsKK30KKworYm9vbCBNQmxhemVJbnRyaW5zaWNJbmZvOjppc092ZXJsb2FkZWQodW5zaWduZWQgSW50cklEKSBjb25zdCB7CisgIC8vIE92ZXJsb2FkIFRhYmxlCisgIGNvbnN0IGJvb2wgT1RhYmxlW10gPSB7CisjZGVmaW5lIEdFVF9JTlRSSU5TSUNfT1ZFUkxPQURfVEFCTEUKKyNpbmNsdWRlICJNQmxhemVHZW5JbnRyaW5zaWNzLmluYyIKKyN1bmRlZiBHRVRfSU5UUklOU0lDX09WRVJMT0FEX1RBQkxFCisgIH07CisgIGlmIChJbnRySUQgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGVsc2UKKyAgICByZXR1cm4gT1RhYmxlW0ludHJJRCAtIEludHJpbnNpYzo6bnVtX2ludHJpbnNpY3NdOworfQorCisvLy8gVGhpcyBkZWZpbmVzIHRoZSAiZ2V0QXR0cmlidXRlcyhJRCBpZCkiIG1ldGhvZC4KKyNkZWZpbmUgR0VUX0lOVFJJTlNJQ19BVFRSSUJVVEVTCisjaW5jbHVkZSAiTUJsYXplR2VuSW50cmluc2ljcy5pbmMiCisjdW5kZWYgR0VUX0lOVFJJTlNJQ19BVFRSSUJVVEVTCisKK3N0YXRpYyBjb25zdCBGdW5jdGlvblR5cGUgKmdldFR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIGlkKSB7CisgIGNvbnN0IFR5cGUgKlJlc3VsdFR5ID0gTlVMTDsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IEFyZ1R5czsKKyAgYm9vbCBJc1ZhckFyZyA9IGZhbHNlOworICAKKyNkZWZpbmUgR0VUX0lOVFJJTlNJQ19HRU5FUkFUT1IKKyNpbmNsdWRlICJNQmxhemVHZW5JbnRyaW5zaWNzLmluYyIKKyN1bmRlZiBHRVRfSU5UUklOU0lDX0dFTkVSQVRPUgorCisgIHJldHVybiBGdW5jdGlvblR5cGU6OmdldChSZXN1bHRUeSwgQXJnVHlzLCBJc1ZhckFyZyk7IAorfQorCitGdW5jdGlvbiAqTUJsYXplSW50cmluc2ljSW5mbzo6Z2V0RGVjbGFyYXRpb24oTW9kdWxlICpNLCB1bnNpZ25lZCBJbnRySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICoqVHlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtVHkpIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc092ZXJsb2FkZWQoSW50cklEKSAmJiAiTUJsYXplIGludHJpbnNpY3MgYXJlIG5vdCBvdmVybG9hZGVkIik7CisgIEF0dHJMaXN0UHRyIEFMaXN0ID0gZ2V0QXR0cmlidXRlcygobWJsYXplSW50cmluc2ljOjpJRCkgSW50cklEKTsKKyAgcmV0dXJuIGNhc3Q8RnVuY3Rpb24+KE0tPmdldE9ySW5zZXJ0RnVuY3Rpb24oZ2V0TmFtZShJbnRySUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlKE0tPmdldENvbnRleHQoKSwgSW50cklEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxpc3QpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUludHJpbnNpY0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUludHJpbnNpY0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODA0Yzc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW50cmluc2ljSW5mby5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LSBNQmxhemVJbnRyaW5zaWNJbmZvLmggLSBNQmxhemUgSW50cmluc2ljIEluZm9ybWF0aW9uIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBNQmxhemUgaW1wbGVtZW50YXRpb24gb2YgVGFyZ2V0SW50cmluc2ljSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBNQkxBWkVJTlRSSU5TSUNTX0gKKyNkZWZpbmUgTUJMQVpFSU5UUklOU0lDU19ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnRyaW5zaWNJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBNQmxhemVJbnRyaW5zaWNJbmZvIDogcHVibGljIFRhcmdldEludHJpbnNpY0luZm8geworICBwdWJsaWM6CisgICAgc3RkOjpzdHJpbmcgZ2V0TmFtZSh1bnNpZ25lZCBJbnRySUQsIGNvbnN0IFR5cGUgKipUeXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtVHlzID0gMCkgY29uc3Q7CisgICAgdW5zaWduZWQgbG9va3VwTmFtZShjb25zdCBjaGFyICpOYW1lLCB1bnNpZ25lZCBMZW4pIGNvbnN0OworICAgIHVuc2lnbmVkIGxvb2t1cEdDQ05hbWUoY29uc3QgY2hhciAqTmFtZSkgY29uc3Q7CisgICAgYm9vbCBpc092ZXJsb2FkZWQodW5zaWduZWQgSUlEKSBjb25zdDsKKyAgICBGdW5jdGlvbiAqZ2V0RGVjbGFyYXRpb24oTW9kdWxlICpNLCB1bnNpZ25lZCBJRCwgY29uc3QgVHlwZSAqKlR5cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bVR5cyA9IDApIGNvbnN0OworICB9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplSW50cmluc2ljcy50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUludHJpbnNpY3MudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3Y2I1YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZUludHJpbnNpY3MudGQKQEAgLTAsMCArMSwxMzEgQEAKKy8vPT09LSBJbnRyaW5zaWNzTUJsYXplLnRkIC0gRGVmaW5lcyBNQmxhemUgaW50cmluc2ljcyAtLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIE1pY3JvQmxhemUtc3BlY2lmaWMgaW50cmluc2ljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRGVmaW5pdGlvbnMgZm9yIGFsbCBNQmxhemUgaW50cmluc2ljcy4KKy8vCisKKy8vIE1CbGF6ZSBpbnRyaW5zaWMgY2xhc3Nlcy4KK2xldCBUYXJnZXRQcmVmaXggPSAibWJsYXplIiwgaXNUYXJnZXQgPSAxIGluIHsgCisgIGNsYXNzIE1CRlNMX0dldF9JbnRyaW5zaWMgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW10+OworCisgIGNsYXNzIE1CRlNMX1B1dF9JbnRyaW5zaWMgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisKKyAgY2xhc3MgTUJGU0xfUHV0VF9JbnRyaW5zaWMgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1pY3JvQmxhemUgRlNMIEdldCBJbnRyaW5zaWMgRGVmaW5pdGlvbnMuCisvLworCitkZWYgaW50X21ibGF6ZV9mc2xfZ2V0ICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF9nZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfYWdldCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF9hZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX2NnZXQgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfY2dldCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfR2V0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF9jYWdldCAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX2NhZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX2VnZXQgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfZWdldCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfR2V0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF9lYWdldCAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX2VhZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX2VjZ2V0ICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfZWNnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfZWNhZ2V0ICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF9lY2FnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfbmdldCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF9uZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX25hZ2V0ICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfbmFnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfbmNnZXQgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF9uY2dldCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfR2V0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF9uY2FnZXQgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX25jYWdldCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfR2V0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF9uZWdldCAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX25lZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX25lYWdldCAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfbmVhZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX25lY2dldCAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfbmVjZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX25lY2FnZXQgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfbmVjYWdldCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfR2V0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF90Z2V0ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX3RnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdGFnZXQgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90YWdldCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfR2V0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF90Y2dldCAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX3RjZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX3RjYWdldCAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfdGNhZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX3RlZ2V0ICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfdGVnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdGVhZ2V0ICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90ZWFnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdGVjZ2V0ICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90ZWNnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdGVjYWdldCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90ZWNhZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX3RuZ2V0ICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfdG5nZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdG5hZ2V0ICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90bmFnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdG5jZ2V0ICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90bmNnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdG5jYWdldCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90bmNhZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX3RuZWdldCAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfdG5lZ2V0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9HZXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX3RuZWFnZXQgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfdG5lYWdldCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfR2V0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF90bmVjZ2V0ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX3RuZWNnZXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX0dldF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdG5lY2FnZXQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90bmVjYWdldCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfR2V0X0ludHJpbnNpYzsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1pY3JvQmxhemUgRlNMIFB1dCBJbnRyaW5zaWMgRGVmaW5pdGlvbnMuCisvLworCitkZWYgaW50X21ibGF6ZV9mc2xfcHV0ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX3B1dCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9QdXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX2FwdXQgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF9hcHV0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX1B1dF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfY3B1dCAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX2NwdXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfUHV0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF9jYXB1dCAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfY2FwdXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfUHV0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF9ucHV0ICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfbnB1dCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9QdXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX25hcHV0ICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF9uYXB1dCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9QdXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX25jcHV0ICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF9uY3B1dCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9QdXRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX25jYXB1dCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF9uY2FwdXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfUHV0X0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF90cHV0ICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfdHB1dCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9QdXRUX0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF90YXB1dCAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfdGFwdXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfUHV0VF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdGNwdXQgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX3RjcHV0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX1B1dFRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX3RjYXB1dCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90Y2FwdXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfUHV0VF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdG5wdXQgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX3RucHV0Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRlNMX1B1dFRfSW50cmluc2ljOworZGVmIGludF9tYmxhemVfZnNsX3RuYXB1dCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWJsYXplX2ZzbF90bmFwdXQiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJGU0xfUHV0VF9JbnRyaW5zaWM7CitkZWYgaW50X21ibGF6ZV9mc2xfdG5jcHV0ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tYmxhemVfZnNsX3RuY3B1dCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9QdXRUX0ludHJpbnNpYzsKK2RlZiBpbnRfbWJsYXplX2ZzbF90bmNhcHV0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21ibGF6ZV9mc2xfdG5jYXB1dCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkZTTF9QdXRUX0ludHJpbnNpYzsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZU1DQXNtSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVNQ0FzbUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYmViMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVNQ0FzbUluZm8uY3BwCkBAIC0wLDAgKzEsMjcgQEAKKy8vPT09LS0gTUJsYXplTUNBc21JbmZvLmNwcCAtIE1CbGF6ZSBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2YgdGhlIE1CbGF6ZU1DQXNtSW5mbyBwcm9wZXJ0aWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJNQmxhemVNQ0FzbUluZm8uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNQmxhemVNQ0FzbUluZm86Ok1CbGF6ZU1DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCkgeworICBBbGlnbm1lbnRJc0luQnl0ZXMgICAgICAgICAgPSBmYWxzZTsKKyAgRGF0YTE2Yml0c0RpcmVjdGl2ZSAgICAgICAgID0gIlx0LmhhbGZcdCI7CisgIERhdGEzMmJpdHNEaXJlY3RpdmUgICAgICAgICA9ICJcdC53b3JkXHQiOworICBEYXRhNjRiaXRzRGlyZWN0aXZlICAgICAgICAgPSAwOworICBQcml2YXRlR2xvYmFsUHJlZml4ICAgICAgICAgPSAiJCI7CisgIENvbW1lbnRTdHJpbmcgICAgICAgICAgICAgICA9ICIjIjsKKyAgWmVyb0RpcmVjdGl2ZSAgICAgICAgICAgICAgID0gIlx0LnNwYWNlXHQiOworICBHUFJlbDMyRGlyZWN0aXZlICAgICAgICAgICAgPSAiXHQuZ3B3b3JkXHQiOworICBIYXNTZXREaXJlY3RpdmUgICAgICAgICAgICAgPSBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZU1DQXNtSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplTUNBc21JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2ZmYzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZU1DQXNtSW5mby5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vPT09PT0tLSBNQmxhemVNQ0FzbUluZm8uaCAtIE1CbGF6ZSBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLSotIEMrKyAtKi0tPT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTUJsYXplTUNBc21JbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTUJMQVpFVEFSR0VUQVNNSU5GT19ICisjZGVmaW5lIE1CTEFaRVRBUkdFVEFTTUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBUYXJnZXQ7CisgIAorICBjbGFzcyBNQmxhemVNQ0FzbUluZm8gOiBwdWJsaWMgTUNBc21JbmZvIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IE1CbGF6ZU1DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCk7CisgIH07CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVNYWNoaW5lRnVuY3Rpb24uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZU1hY2hpbmVGdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTU2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVNYWNoaW5lRnVuY3Rpb24uaApAQCAtMCwwICsxLDE0MiBAQAorLy89PT0tLSBNQmxhemVNYWNoaW5lRnVuY3Rpb25JbmZvLmggLSBQcml2YXRlIGRhdGEgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1CbGF6ZSBzcGVjaWZpYyBzdWJjbGFzcyBvZiBNYWNoaW5lRnVuY3Rpb25JbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTUJMQVpFX01BQ0hJTkVfRlVOQ1RJT05fSU5GT19ICisjZGVmaW5lIE1CTEFaRV9NQUNISU5FX0ZVTkNUSU9OX0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9WZWN0b3JFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gTUJsYXplRnVuY3Rpb25JbmZvIC0gVGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gTWFjaGluZUZ1bmN0aW9uIHByaXZhdGUKKy8vLyBNQmxhemUgdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBlYWNoIE1hY2hpbmVGdW5jdGlvbi4KK2NsYXNzIE1CbGF6ZUZ1bmN0aW9uSW5mbyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25JbmZvIHsKKworcHJpdmF0ZToKKyAgLy8vIEhvbGRzIGZvciBlYWNoIGZ1bmN0aW9uIHdoZXJlIG9uIHRoZSBzdGFjayB0aGUgRnJhbWUgUG9pbnRlciBtdXN0IGJlIAorICAvLy8gc2F2ZWQuIFRoaXMgaXMgdXNlZCBvbiBQcm9sb2d1ZSBhbmQgRXBpbG9ndWUgdG8gZW1pdCBGUCBzYXZlL3Jlc3RvcmUKKyAgaW50IEZQU3RhY2tPZmZzZXQ7CisKKyAgLy8vIEhvbGRzIGZvciBlYWNoIGZ1bmN0aW9uIHdoZXJlIG9uIHRoZSBzdGFjayB0aGUgUmV0dXJuIEFkZHJlc3MgbXVzdCBiZSAKKyAgLy8vIHNhdmVkLiBUaGlzIGlzIHVzZWQgb24gUHJvbG9ndWUgYW5kIEVwaWxvZ3VlIHRvIGVtaXQgUkEgc2F2ZS9yZXN0b3JlCisgIGludCBSQVN0YWNrT2Zmc2V0OworCisgIC8vLyBBdCBlYWNoIGZ1bmN0aW9uIGVudHJ5IGEgc3BlY2lhbCBiaXRtYXNrIGRpcmVjdGl2ZSBtdXN0IGJlIGVtaXR0ZWQKKyAgLy8vIHRvIGhlbHAgaW4gZGVidWdnaW5nIENQVSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLiBJdCBuZWVkcyBhIG5lZ2F0aXZlCisgIC8vLyBvZmZzZXQgZnJvbSB0aGUgZmluYWwgc3RhY2sgc2l6ZSBhbmQgaXRzIGhpZ2hlciByZWdpc3RlciBsb2NhdGlvbiBvbgorICAvLy8gdGhlIHN0YWNrLgorICBpbnQgQ1BVVG9wU2F2ZWRSZWdPZmY7CisKKyAgLy8vIE1CbGF6ZUZJSG9sZGVyIC0gSG9sZHMgYSBGcmFtZUluZGV4IGFuZCBpdCdzIFN0YWNrIFBvaW50ZXIgT2Zmc2V0CisgIHN0cnVjdCBNQmxhemVGSUhvbGRlciB7CisKKyAgICBpbnQgRkk7CisgICAgaW50IFNQT2Zmc2V0OworCisgICAgTUJsYXplRklIb2xkZXIoaW50IEZyYW1lSW5kZXgsIGludCBTdGFja1BvaW50ZXJPZmZzZXQpCisgICAgICA6IEZJKEZyYW1lSW5kZXgpLCBTUE9mZnNldChTdGFja1BvaW50ZXJPZmZzZXQpIHt9CisgIH07CisKKyAgLy8vIFdoZW4gUElDIGlzIHVzZWQgdGhlIEdQIG11c3QgYmUgc2F2ZWQgb24gdGhlIHN0YWNrIG9uIHRoZSBmdW5jdGlvbiAKKyAgLy8vIHByb2xvZ3VlIGFuZCBtdXN0IGJlIHJlbG9hZGVkIGZyb20gdGhpcyBzdGFjayBsb2NhdGlvbiBhZnRlciBldmVyeSAKKyAgLy8vIGNhbGwuIEEgcmVmZXJlbmNlIHRvIGl0cyBzdGFjayBsb2NhdGlvbiBhbmQgZnJhbWUgaW5kZXggbXVzdCBiZSBrZXB0IAorICAvLy8gdG8gYmUgdXNlZCBvbiBlbWl0UHJvbG9ndWUgYW5kIHByb2Nlc3NGdW5jdGlvbkJlZm9yZUZyYW1lRmluYWxpemVkLgorICBNQmxhemVGSUhvbGRlciBHUEhvbGRlcjsKKworICAvLy8gT24gTG93ZXJGb3JtYWxBcmd1bWVudHMgdGhlIHN0YWNrIHNpemUgaXMgdW5rbm93biwgc28gdGhlIFN0YWNrCisgIC8vLyBQb2ludGVyIE9mZnNldCBjYWxjdWxhdGlvbiBvZiAibm90IGluIHJlZ2lzdGVyIGFyZ3VtZW50cyIgbXVzdCBiZSAKKyAgLy8vIHBvc3Rwb25lZCB0byBlbWl0UHJvbG9ndWUuIAorICBTbWFsbFZlY3RvcjxNQmxhemVGSUhvbGRlciwgMTY+IEZuTG9hZEFyZ3M7CisgIGJvb2wgSGFzTG9hZEFyZ3M7CisKKyAgLy8gV2hlbiBWYXJBcmdzLCB3ZSBtdXN0IHdyaXRlIHJlZ2lzdGVycyBiYWNrIHRvIGNhbGxlciBzdGFjaywgcHJlc2VydmluZyAKKyAgLy8gb24gcmVnaXN0ZXIgYXJndW1lbnRzLiBTaW5jZSB0aGUgc3RhY2sgc2l6ZSBpcyB1bmtub3duIG9uIAorICAvLyBMb3dlckZvcm1hbEFyZ3VtZW50cywgdGhlIFN0YWNrIFBvaW50ZXIgT2Zmc2V0IGNhbGN1bGF0aW9uIG11c3QgYmUKKyAgLy8gcG9zdHBvbmVkIHRvIGVtaXRQcm9sb2d1ZS4gCisgIFNtYWxsVmVjdG9yPE1CbGF6ZUZJSG9sZGVyLCA0PiBGblN0b3JlVmFyQXJnczsKKyAgYm9vbCBIYXNTdG9yZVZhckFyZ3M7CisKKyAgLy8vIFNSZXRSZXR1cm5SZWcgLSBTb21lIHN1YnRhcmdldHMgcmVxdWlyZSB0aGF0IHNyZXQgbG93ZXJpbmcgaW5jbHVkZXMKKyAgLy8vIHJldHVybmluZyB0aGUgdmFsdWUgb2YgdGhlIHJldHVybmVkIHN0cnVjdCBpbiBhIHJlZ2lzdGVyLiBUaGlzIGZpZWxkCisgIC8vLyBob2xkcyB0aGUgdmlydHVhbCByZWdpc3RlciBpbnRvIHdoaWNoIHRoZSBzcmV0IGFyZ3VtZW50IGlzIHBhc3NlZC4KKyAgdW5zaWduZWQgU1JldFJldHVyblJlZzsKKworICAvLy8gR2xvYmFsQmFzZVJlZyAtIGtlZXBzIHRyYWNrIG9mIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGluaXRpYWxpemVkIGZvcgorICAvLy8gdXNlIGFzIHRoZSBnbG9iYWwgYmFzZSByZWdpc3Rlci4gVGhpcyBpcyB1c2VkIGZvciBQSUMgaW4gc29tZSBQSUMKKyAgLy8vIHJlbG9jYXRpb24gbW9kZWxzLgorICB1bnNpZ25lZCBHbG9iYWxCYXNlUmVnOworCisgIC8vIFZhckFyZ3NGcmFtZUluZGV4IC0gRnJhbWVJbmRleCBmb3Igc3RhcnQgb2YgdmFyYXJncyBhcmVhLgorICBpbnQgVmFyQXJnc0ZyYW1lSW5kZXg7CisKK3B1YmxpYzoKKyAgTUJsYXplRnVuY3Rpb25JbmZvKE1hY2hpbmVGdW5jdGlvbiYgTUYpIAorICA6IEZQU3RhY2tPZmZzZXQoMCksIFJBU3RhY2tPZmZzZXQoMCksIENQVVRvcFNhdmVkUmVnT2ZmKDApLCAKKyAgICBHUEhvbGRlcigtMSwtMSksIEhhc0xvYWRBcmdzKGZhbHNlKSwgSGFzU3RvcmVWYXJBcmdzKGZhbHNlKSwKKyAgICBTUmV0UmV0dXJuUmVnKDApLCBHbG9iYWxCYXNlUmVnKDApLCBWYXJBcmdzRnJhbWVJbmRleCgwKQorICB7fQorCisgIGludCBnZXRGUFN0YWNrT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gRlBTdGFja09mZnNldDsgfQorICB2b2lkIHNldEZQU3RhY2tPZmZzZXQoaW50IE9mZikgeyBGUFN0YWNrT2Zmc2V0ID0gT2ZmOyB9CisKKyAgaW50IGdldFJBU3RhY2tPZmZzZXQoKSBjb25zdCB7IHJldHVybiBSQVN0YWNrT2Zmc2V0OyB9CisgIHZvaWQgc2V0UkFTdGFja09mZnNldChpbnQgT2ZmKSB7IFJBU3RhY2tPZmZzZXQgPSBPZmY7IH0KKworICBpbnQgZ2V0Q1BVVG9wU2F2ZWRSZWdPZmYoKSBjb25zdCB7IHJldHVybiBDUFVUb3BTYXZlZFJlZ09mZjsgfQorICB2b2lkIHNldENQVVRvcFNhdmVkUmVnT2ZmKGludCBPZmYpIHsgQ1BVVG9wU2F2ZWRSZWdPZmYgPSBPZmY7IH0KKworICBpbnQgZ2V0R1BTdGFja09mZnNldCgpIGNvbnN0IHsgcmV0dXJuIEdQSG9sZGVyLlNQT2Zmc2V0OyB9CisgIGludCBnZXRHUEZJKCkgY29uc3QgeyByZXR1cm4gR1BIb2xkZXIuRkk7IH0KKyAgdm9pZCBzZXRHUFN0YWNrT2Zmc2V0KGludCBPZmYpIHsgR1BIb2xkZXIuU1BPZmZzZXQgPSBPZmY7IH0KKyAgdm9pZCBzZXRHUEZJKGludCBGSSkgeyBHUEhvbGRlci5GSSA9IEZJOyB9CisgIGJvb2wgbmVlZEdQU2F2ZVJlc3RvcmUoKSBjb25zdCB7IHJldHVybiBHUEhvbGRlci5TUE9mZnNldCAhPSAtMTsgfQorCisgIGJvb2wgaGFzTG9hZEFyZ3MoKSBjb25zdCB7IHJldHVybiBIYXNMb2FkQXJnczsgfQorICBib29sIGhhc1N0b3JlVmFyQXJncygpIGNvbnN0IHsgcmV0dXJuIEhhc1N0b3JlVmFyQXJnczsgfSAKKworICB2b2lkIHJlY29yZExvYWRBcmdzRkkoaW50IEZJLCBpbnQgU1BPZmZzZXQpIHsKKyAgICBpZiAoIUhhc0xvYWRBcmdzKSBIYXNMb2FkQXJncz10cnVlOworICAgIEZuTG9hZEFyZ3MucHVzaF9iYWNrKE1CbGF6ZUZJSG9sZGVyKEZJLCBTUE9mZnNldCkpOworICB9CisgIHZvaWQgcmVjb3JkU3RvcmVWYXJBcmdzRkkoaW50IEZJLCBpbnQgU1BPZmZzZXQpIHsKKyAgICBpZiAoIUhhc1N0b3JlVmFyQXJncykgSGFzU3RvcmVWYXJBcmdzPXRydWU7CisgICAgRm5TdG9yZVZhckFyZ3MucHVzaF9iYWNrKE1CbGF6ZUZJSG9sZGVyKEZJLCBTUE9mZnNldCkpOworICB9CisKKyAgdm9pZCBhZGp1c3RMb2FkQXJnc0ZJKE1hY2hpbmVGcmFtZUluZm8gKk1GSSkgY29uc3QgeworICAgIGlmICghaGFzTG9hZEFyZ3MoKSkgcmV0dXJuOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGbkxvYWRBcmdzLnNpemUoKTsgaSAhPSBlOyArK2kpIAorICAgICAgTUZJLT5zZXRPYmplY3RPZmZzZXQoIEZuTG9hZEFyZ3NbaV0uRkksIEZuTG9hZEFyZ3NbaV0uU1BPZmZzZXQgKTsKKyAgfQorICB2b2lkIGFkanVzdFN0b3JlVmFyQXJnc0ZJKE1hY2hpbmVGcmFtZUluZm8gKk1GSSkgY29uc3QgeworICAgIGlmICghaGFzU3RvcmVWYXJBcmdzKCkpIHJldHVybjsgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZuU3RvcmVWYXJBcmdzLnNpemUoKTsgaSAhPSBlOyArK2kpIAorICAgICAgTUZJLT5zZXRPYmplY3RPZmZzZXQoIEZuU3RvcmVWYXJBcmdzW2ldLkZJLCBGblN0b3JlVmFyQXJnc1tpXS5TUE9mZnNldCApOworICB9CisKKyAgdW5zaWduZWQgZ2V0U1JldFJldHVyblJlZygpIGNvbnN0IHsgcmV0dXJuIFNSZXRSZXR1cm5SZWc7IH0KKyAgdm9pZCBzZXRTUmV0UmV0dXJuUmVnKHVuc2lnbmVkIFJlZykgeyBTUmV0UmV0dXJuUmVnID0gUmVnOyB9CisKKyAgdW5zaWduZWQgZ2V0R2xvYmFsQmFzZVJlZygpIGNvbnN0IHsgcmV0dXJuIEdsb2JhbEJhc2VSZWc7IH0KKyAgdm9pZCBzZXRHbG9iYWxCYXNlUmVnKHVuc2lnbmVkIFJlZykgeyBHbG9iYWxCYXNlUmVnID0gUmVnOyB9CisKKyAgaW50IGdldFZhckFyZ3NGcmFtZUluZGV4KCkgY29uc3QgeyByZXR1cm4gVmFyQXJnc0ZyYW1lSW5kZXg7IH0KKyAgdm9pZCBzZXRWYXJBcmdzRnJhbWVJbmRleChpbnQgSW5kZXgpIHsgVmFyQXJnc0ZyYW1lSW5kZXggPSBJbmRleDsgfQorfTsKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIE1CTEFaRV9NQUNISU5FX0ZVTkNUSU9OX0lORk9fSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplUmVnaXN0ZXJJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVJlZ2lzdGVySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhZmE4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVJlZ2lzdGVySW5mby5jcHAKQEAgLTAsMCArMSw0MDQgQEAKKy8vPT09LSBNQmxhemVSZWdpc3RlckluZm8uY3BwIC0gTUJsYXplIFJlZ2lzdGVyIEluZm9ybWF0aW9uIC09PSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBNQmxhemUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbworLy8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJtYmxhemUtcmVnLWluZm8iCisKKyNpbmNsdWRlICJNQmxhemUuaCIKKyNpbmNsdWRlICJNQmxhemVTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJNQmxhemVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJNQmxhemVNYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01CbGF6ZVJlZ2lzdGVySW5mbzo6CitNQmxhemVSZWdpc3RlckluZm8oY29uc3QgTUJsYXplU3VidGFyZ2V0ICZTVCwgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpCisgIDogTUJsYXplR2VuUmVnaXN0ZXJJbmZvKE1CbGF6ZTo6QURKQ0FMTFNUQUNLRE9XTiwgTUJsYXplOjpBREpDQUxMU1RBQ0tVUCksCisgICAgU3VidGFyZ2V0KFNUKSwgVElJKHRpaSkge30KKworLy8vIGdldFJlZ2lzdGVyTnVtYmVyaW5nIC0gR2l2ZW4gdGhlIGVudW0gdmFsdWUgZm9yIHNvbWUgcmVnaXN0ZXIsIGUuZy4KKy8vLyBNQmxhemU6OlIwLCByZXR1cm4gdGhlIG51bWJlciB0aGF0IGl0IGNvcnJlc3BvbmRzIHRvIChlLmcuIDApLgordW5zaWduZWQgTUJsYXplUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyh1bnNpZ25lZCBSZWdFbnVtKSB7CisgIHN3aXRjaCAoUmVnRW51bSkgeworICAgIGNhc2UgTUJsYXplOjpSMCAgOiBjYXNlIE1CbGF6ZTo6RjAgIDogcmV0dXJuIDA7CisgICAgY2FzZSBNQmxhemU6OlIxICA6IGNhc2UgTUJsYXplOjpGMSAgOiByZXR1cm4gMTsKKyAgICBjYXNlIE1CbGF6ZTo6UjIgIDogY2FzZSBNQmxhemU6OkYyICA6IHJldHVybiAyOworICAgIGNhc2UgTUJsYXplOjpSMyAgOiBjYXNlIE1CbGF6ZTo6RjMgIDogcmV0dXJuIDM7CisgICAgY2FzZSBNQmxhemU6OlI0ICA6IGNhc2UgTUJsYXplOjpGNCAgOiByZXR1cm4gNDsKKyAgICBjYXNlIE1CbGF6ZTo6UjUgIDogY2FzZSBNQmxhemU6OkY1ICA6IHJldHVybiA1OworICAgIGNhc2UgTUJsYXplOjpSNiAgOiBjYXNlIE1CbGF6ZTo6RjYgIDogcmV0dXJuIDY7CisgICAgY2FzZSBNQmxhemU6OlI3ICA6IGNhc2UgTUJsYXplOjpGNyAgOiByZXR1cm4gNzsKKyAgICBjYXNlIE1CbGF6ZTo6UjggIDogY2FzZSBNQmxhemU6OkY4ICA6IHJldHVybiA4OworICAgIGNhc2UgTUJsYXplOjpSOSAgOiBjYXNlIE1CbGF6ZTo6RjkgIDogcmV0dXJuIDk7CisgICAgY2FzZSBNQmxhemU6OlIxMCA6IGNhc2UgTUJsYXplOjpGMTAgOiByZXR1cm4gMTA7CisgICAgY2FzZSBNQmxhemU6OlIxMSA6IGNhc2UgTUJsYXplOjpGMTEgOiByZXR1cm4gMTE7CisgICAgY2FzZSBNQmxhemU6OlIxMiA6IGNhc2UgTUJsYXplOjpGMTIgOiByZXR1cm4gMTI7CisgICAgY2FzZSBNQmxhemU6OlIxMyA6IGNhc2UgTUJsYXplOjpGMTMgOiByZXR1cm4gMTM7CisgICAgY2FzZSBNQmxhemU6OlIxNCA6IGNhc2UgTUJsYXplOjpGMTQgOiByZXR1cm4gMTQ7CisgICAgY2FzZSBNQmxhemU6OlIxNSA6IGNhc2UgTUJsYXplOjpGMTUgOiByZXR1cm4gMTU7CisgICAgY2FzZSBNQmxhemU6OlIxNiA6IGNhc2UgTUJsYXplOjpGMTYgOiByZXR1cm4gMTY7CisgICAgY2FzZSBNQmxhemU6OlIxNyA6IGNhc2UgTUJsYXplOjpGMTcgOiByZXR1cm4gMTc7CisgICAgY2FzZSBNQmxhemU6OlIxOCA6IGNhc2UgTUJsYXplOjpGMTggOiByZXR1cm4gMTg7CisgICAgY2FzZSBNQmxhemU6OlIxOSA6IGNhc2UgTUJsYXplOjpGMTkgOiByZXR1cm4gMTk7CisgICAgY2FzZSBNQmxhemU6OlIyMCA6IGNhc2UgTUJsYXplOjpGMjAgOiByZXR1cm4gMjA7CisgICAgY2FzZSBNQmxhemU6OlIyMSA6IGNhc2UgTUJsYXplOjpGMjEgOiByZXR1cm4gMjE7CisgICAgY2FzZSBNQmxhemU6OlIyMiA6IGNhc2UgTUJsYXplOjpGMjIgOiByZXR1cm4gMjI7CisgICAgY2FzZSBNQmxhemU6OlIyMyA6IGNhc2UgTUJsYXplOjpGMjMgOiByZXR1cm4gMjM7CisgICAgY2FzZSBNQmxhemU6OlIyNCA6IGNhc2UgTUJsYXplOjpGMjQgOiByZXR1cm4gMjQ7CisgICAgY2FzZSBNQmxhemU6OlIyNSA6IGNhc2UgTUJsYXplOjpGMjUgOiByZXR1cm4gMjU7CisgICAgY2FzZSBNQmxhemU6OlIyNiA6IGNhc2UgTUJsYXplOjpGMjYgOiByZXR1cm4gMjY7CisgICAgY2FzZSBNQmxhemU6OlIyNyA6IGNhc2UgTUJsYXplOjpGMjcgOiByZXR1cm4gMjc7CisgICAgY2FzZSBNQmxhemU6OlIyOCA6IGNhc2UgTUJsYXplOjpGMjggOiByZXR1cm4gMjg7CisgICAgY2FzZSBNQmxhemU6OlIyOSA6IGNhc2UgTUJsYXplOjpGMjkgOiByZXR1cm4gMjk7CisgICAgY2FzZSBNQmxhemU6OlIzMCA6IGNhc2UgTUJsYXplOjpGMzAgOiByZXR1cm4gMzA7CisgICAgY2FzZSBNQmxhemU6OlIzMSA6IGNhc2UgTUJsYXplOjpGMzEgOiByZXR1cm4gMzE7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biByZWdpc3RlciBudW1iZXIhIik7CisgIH0KKyAgcmV0dXJuIDA7IC8vIE5vdCByZWFjaGVkCit9CisKKy8vLyBnZXRSZWdpc3RlckZyb21OdW1iZXJpbmcgLSBHaXZlbiB0aGUgZW51bSB2YWx1ZSBmb3Igc29tZSByZWdpc3RlciwgZS5nLgorLy8vIE1CbGF6ZTo6UjAsIHJldHVybiB0aGUgbnVtYmVyIHRoYXQgaXQgY29ycmVzcG9uZHMgdG8gKGUuZy4gMCkuCit1bnNpZ25lZCBNQmxhemVSZWdpc3RlckluZm86OmdldFJlZ2lzdGVyRnJvbU51bWJlcmluZyh1bnNpZ25lZCBSZWcpIHsKKyAgc3dpdGNoIChSZWcpIHsKKyAgICBjYXNlIDAgIDogcmV0dXJuIE1CbGF6ZTo6UjA7CisgICAgY2FzZSAxICA6IHJldHVybiBNQmxhemU6OlIxOworICAgIGNhc2UgMiAgOiByZXR1cm4gTUJsYXplOjpSMjsKKyAgICBjYXNlIDMgIDogcmV0dXJuIE1CbGF6ZTo6UjM7CisgICAgY2FzZSA0ICA6IHJldHVybiBNQmxhemU6OlI0OworICAgIGNhc2UgNSAgOiByZXR1cm4gTUJsYXplOjpSNTsKKyAgICBjYXNlIDYgIDogcmV0dXJuIE1CbGF6ZTo6UjY7CisgICAgY2FzZSA3ICA6IHJldHVybiBNQmxhemU6OlI3OworICAgIGNhc2UgOCAgOiByZXR1cm4gTUJsYXplOjpSODsKKyAgICBjYXNlIDkgIDogcmV0dXJuIE1CbGF6ZTo6Ujk7CisgICAgY2FzZSAxMCA6IHJldHVybiBNQmxhemU6OlIxMDsKKyAgICBjYXNlIDExIDogcmV0dXJuIE1CbGF6ZTo6UjExOworICAgIGNhc2UgMTIgOiByZXR1cm4gTUJsYXplOjpSMTI7CisgICAgY2FzZSAxMyA6IHJldHVybiBNQmxhemU6OlIxMzsKKyAgICBjYXNlIDE0IDogcmV0dXJuIE1CbGF6ZTo6UjE0OworICAgIGNhc2UgMTUgOiByZXR1cm4gTUJsYXplOjpSMTU7CisgICAgY2FzZSAxNiA6IHJldHVybiBNQmxhemU6OlIxNjsKKyAgICBjYXNlIDE3IDogcmV0dXJuIE1CbGF6ZTo6UjE3OworICAgIGNhc2UgMTggOiByZXR1cm4gTUJsYXplOjpSMTg7CisgICAgY2FzZSAxOSA6IHJldHVybiBNQmxhemU6OlIxOTsKKyAgICBjYXNlIDIwIDogcmV0dXJuIE1CbGF6ZTo6UjIwOworICAgIGNhc2UgMjEgOiByZXR1cm4gTUJsYXplOjpSMjE7CisgICAgY2FzZSAyMiA6IHJldHVybiBNQmxhemU6OlIyMjsKKyAgICBjYXNlIDIzIDogcmV0dXJuIE1CbGF6ZTo6UjIzOworICAgIGNhc2UgMjQgOiByZXR1cm4gTUJsYXplOjpSMjQ7CisgICAgY2FzZSAyNSA6IHJldHVybiBNQmxhemU6OlIyNTsKKyAgICBjYXNlIDI2IDogcmV0dXJuIE1CbGF6ZTo6UjI2OworICAgIGNhc2UgMjcgOiByZXR1cm4gTUJsYXplOjpSMjc7CisgICAgY2FzZSAyOCA6IHJldHVybiBNQmxhemU6OlIyODsKKyAgICBjYXNlIDI5IDogcmV0dXJuIE1CbGF6ZTo6UjI5OworICAgIGNhc2UgMzAgOiByZXR1cm4gTUJsYXplOjpSMzA7CisgICAgY2FzZSAzMSA6IHJldHVybiBNQmxhemU6OlIzMTsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHJlZ2lzdGVyIG51bWJlciEiKTsKKyAgfQorICByZXR1cm4gMDsgLy8gTm90IHJlYWNoZWQKK30KKwordW5zaWduZWQgTUJsYXplUmVnaXN0ZXJJbmZvOjpnZXRQSUNDYWxsUmVnKCkgeworICByZXR1cm4gTUJsYXplOjpSMjA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDYWxsZWUgU2F2ZWQgUmVnaXN0ZXJzIG1ldGhvZHMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBNQmxhemUgQ2FsbGVlIFNhdmVkIFJlZ2lzdGVycworY29uc3QgdW5zaWduZWQqIE1CbGF6ZVJlZ2lzdGVySW5mbzo6CitnZXRDYWxsZWVTYXZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRikgY29uc3QgeworICAvLyBNQmxhemUgY2FsbGVlLXNhdmUgcmVnaXN0ZXIgcmFuZ2UgaXMgUjIwIC0gUjMxCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBDYWxsZWVTYXZlZFJlZ3NbXSA9IHsKKyAgICBNQmxhemU6OlIyMCwgTUJsYXplOjpSMjEsIE1CbGF6ZTo6UjIyLCBNQmxhemU6OlIyMywKKyAgICBNQmxhemU6OlIyNCwgTUJsYXplOjpSMjUsIE1CbGF6ZTo6UjI2LCBNQmxhemU6OlIyNywKKyAgICBNQmxhemU6OlIyOCwgTUJsYXplOjpSMjksIE1CbGF6ZTo6UjMwLCBNQmxhemU6OlIzMSwKKyAgICAwCisgIH07CisKKyAgcmV0dXJuIENhbGxlZVNhdmVkUmVnczsKK30KKworQml0VmVjdG9yIE1CbGF6ZVJlZ2lzdGVySW5mbzo6CitnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBCaXRWZWN0b3IgUmVzZXJ2ZWQoZ2V0TnVtUmVncygpKTsKKyAgUmVzZXJ2ZWQuc2V0KE1CbGF6ZTo6UjApOworICBSZXNlcnZlZC5zZXQoTUJsYXplOjpSMSk7CisgIFJlc2VydmVkLnNldChNQmxhemU6OlIyKTsKKyAgUmVzZXJ2ZWQuc2V0KE1CbGF6ZTo6UjEzKTsKKyAgUmVzZXJ2ZWQuc2V0KE1CbGF6ZTo6UjE0KTsKKyAgUmVzZXJ2ZWQuc2V0KE1CbGF6ZTo6UjE1KTsKKyAgUmVzZXJ2ZWQuc2V0KE1CbGF6ZTo6UjE2KTsKKyAgUmVzZXJ2ZWQuc2V0KE1CbGF6ZTo6UjE3KTsKKyAgUmVzZXJ2ZWQuc2V0KE1CbGF6ZTo6UjE4KTsKKyAgUmVzZXJ2ZWQuc2V0KE1CbGF6ZTo6UjE5KTsKKyAgcmV0dXJuIFJlc2VydmVkOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFN0YWNrIEZyYW1lIFByb2Nlc3NpbmcgbWV0aG9kcworLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLworLy8gVGhlIHN0YWNrIGlzIGFsbG9jYXRlZCBkZWNyZW1lbnRpbmcgdGhlIHN0YWNrIHBvaW50ZXIgb24KKy8vIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiBhIGZ1bmN0aW9uIHByb2xvZ3VlLiBPbmNlIGRlY3JlbWVudGVkLAorLy8gYWxsIHN0YWNrIHJlZmVyZW5jZXMgYXJlIGFyZSBkb25lIHRocm91Z2ggYSBwb3NpdGl2ZSBvZmZzZXQKKy8vIGZyb20gdGhlIHN0YWNrL2ZyYW1lIHBvaW50ZXIsIHNvIHRoZSBzdGFjayBpcyBjb25zaWRlcmVkCisvLyB0byBncm93IHVwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgTUJsYXplUmVnaXN0ZXJJbmZvOjphZGp1c3RNQmxhemVTdGFja0ZyYW1lKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1CbGF6ZUZ1bmN0aW9uSW5mbyAqTUJsYXplRkkgPSBNRi5nZXRJbmZvPE1CbGF6ZUZ1bmN0aW9uSW5mbz4oKTsKKworICAvLyBTZWUgdGhlIGRlc2NyaXB0aW9uIGF0IE1pY3JvQmxhemVNYWNoaW5lRnVuY3Rpb24uaAorICBpbnQgVG9wQ1BVU2F2ZWRSZWdPZmYgPSAtMTsKKworICAvLyBBZGp1c3QgQ1BVIENhbGxlZSBTYXZlZCBSZWdpc3RlcnMgQXJlYS4gUmVnaXN0ZXJzIFJBIGFuZCBGUCBtdXN0CisgIC8vIGJlIHNhdmVkIGluIHRoaXMgQ1BVIEFyZWEgdGhlcmUgaXMgdGhlIG5lZWQuIFRoaXMgd2hvbGUgQXJlYSBtdXN0CisgIC8vIGJlIGFsaWduZWQgdG8gdGhlIGRlZmF1bHQgU3RhY2sgQWxpZ25tZW50IHJlcXVpcmVtZW50cy4KKyAgdW5zaWduZWQgU3RhY2tPZmZzZXQgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworICB1bnNpZ25lZCBSZWdTaXplID0gNDsKKworICAvLyBSZXBsYWNlIHRoZSBkdW1teSAnMCcgU1BPZmZzZXQgYnkgdGhlIG5lZ2F0aXZlIG9mZnNldHMsIGFzIGV4cGxhaW5lZCBvbgorICAvLyBMb3dlckZPUk1BTF9BUkdVTUVOVFMuIExlYXZpbmcgJzAnIGZvciB3aGlsZSBpcyBuZWNlc3NhcnkgdG8gYXZvaWQKKyAgLy8gdGhlIGFwcHJvYWNoIGRvbmUgYnkgY2FsY3VsYXRlRnJhbWVPYmplY3RPZmZzZXRzIHRvIHRoZSBzdGFjayBmcmFtZS4KKyAgTUJsYXplRkktPmFkanVzdExvYWRBcmdzRkkoTUZJKTsKKyAgTUJsYXplRkktPmFkanVzdFN0b3JlVmFyQXJnc0ZJKE1GSSk7CisKKyAgaWYgKGhhc0ZQKE1GKSkgeworICAgIE1GSS0+c2V0T2JqZWN0T2Zmc2V0KE1GSS0+Q3JlYXRlU3RhY2tPYmplY3QoUmVnU2l6ZSwgUmVnU2l6ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2tPZmZzZXQpOworICAgIE1CbGF6ZUZJLT5zZXRGUFN0YWNrT2Zmc2V0KFN0YWNrT2Zmc2V0KTsKKyAgICBUb3BDUFVTYXZlZFJlZ09mZiA9IFN0YWNrT2Zmc2V0OworICAgIFN0YWNrT2Zmc2V0ICs9IFJlZ1NpemU7CisgIH0KKworICBpZiAoTUZJLT5hZGp1c3RzU3RhY2soKSkgeworICAgIE1CbGF6ZUZJLT5zZXRSQVN0YWNrT2Zmc2V0KDApOworICAgIE1GSS0+c2V0T2JqZWN0T2Zmc2V0KE1GSS0+Q3JlYXRlU3RhY2tPYmplY3QoUmVnU2l6ZSwgUmVnU2l6ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2tPZmZzZXQpOworICAgIFRvcENQVVNhdmVkUmVnT2ZmID0gU3RhY2tPZmZzZXQ7CisgICAgU3RhY2tPZmZzZXQgKz0gUmVnU2l6ZTsKKyAgfQorCisgIC8vIFVwZGF0ZSBmcmFtZSBpbmZvCisgIE1GSS0+c2V0U3RhY2tTaXplKFN0YWNrT2Zmc2V0KTsKKworICAvLyBSZWNhbGN1bGF0ZSB0aGUgZmluYWwgdG9wcyBvZmZzZXQuIFRoZSBmaW5hbCB2YWx1ZXMgbXVzdCBiZSAnMCcKKyAgLy8gaWYgdGhlcmUgaXNuJ3QgYSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgZm9yIENQVSBvciBGUFUsIG90aGVyd2lzZQorICAvLyBhIG5lZ2F0aXZlIG9mZnNldCBpcyBuZWVkZWQuCisgIGlmIChUb3BDUFVTYXZlZFJlZ09mZiA+PSAwKQorICAgIE1CbGF6ZUZJLT5zZXRDUFVUb3BTYXZlZFJlZ09mZihUb3BDUFVTYXZlZFJlZ09mZi1TdGFja09mZnNldCk7Cit9CisKKy8vIGhhc0ZQIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBzaG91bGQgaGF2ZSBhIGRlZGljYXRlZCBmcmFtZQorLy8gcG9pbnRlciByZWdpc3Rlci4gIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaGFzIHZhcmlhYmxlIHNpemVkIGFsbG9jYXMgb3IKKy8vIGlmIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24gaXMgZGlzYWJsZWQuCitib29sIE1CbGF6ZVJlZ2lzdGVySW5mbzo6aGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgcmV0dXJuIERpc2FibGVGcmFtZVBvaW50ZXJFbGltKE1GKSB8fCBNRkktPmhhc1ZhclNpemVkT2JqZWN0cygpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGVsaW1pbmF0ZSBBREpDQUxMU1RBQ0tET1dOLAorLy8gQURKQ0FMTFNUQUNLVVAgcHNldWRvIGluc3RydWN0aW9ucwordm9pZCBNQmxhemVSZWdpc3RlckluZm86OgorZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdCB7CisgIC8vIFNpbXBseSBkaXNjYXJkIEFESkNBTExTVEFDS0RPV04sIEFESkNBTExTVEFDS1VQIGluc3RydWN0aW9ucy4KKyAgTUJCLmVyYXNlKEkpOworfQorCisvLyBGcmFtZUluZGV4IHJlcHJlc2VudCBvYmplY3RzIGluc2lkZSBhIGFic3RyYWN0IHN0YWNrLgorLy8gV2UgbXVzdCByZXBsYWNlIEZyYW1lSW5kZXggd2l0aCBhbiBzdGFjay9mcmFtZSBwb2ludGVyCisvLyBkaXJlY3QgcmVmZXJlbmNlLgordW5zaWduZWQgTUJsYXplUmVnaXN0ZXJJbmZvOjoKK2VsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLCBpbnQgU1BBZGosCisgICAgICAgICAgICAgICAgICAgIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUsIFJlZ1NjYXZlbmdlciAqUlMpIGNvbnN0IHsKKyAgTWFjaGluZUluc3RyICZNSSA9ICpJSTsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNSS5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisKKyAgdW5zaWduZWQgaSA9IDA7CisgIHdoaWxlICghTUkuZ2V0T3BlcmFuZChpKS5pc0ZJKCkpIHsKKyAgICArK2k7CisgICAgYXNzZXJ0KGkgPCBNSS5nZXROdW1PcGVyYW5kcygpICYmCisgICAgICAgICAgICJJbnN0ciBkb2Vzbid0IGhhdmUgRnJhbWVJbmRleCBvcGVyYW5kISIpOworICB9CisKKyAgdW5zaWduZWQgb2kgPSBpID09IDIgPyAxIDogMjsKKworICBERUJVRyhlcnJzKCkgPDwgIlxuRnVuY3Rpb24gOiAiIDw8IE1GLmdldEZ1bmN0aW9uKCktPmdldE5hbWUoKSA8PCAiXG4iOworICAgICAgICBlcnJzKCkgPDwgIjwtLS0tLS0tLS0+XG4iIDw8IE1JKTsKKworICBpbnQgRnJhbWVJbmRleCA9IE1JLmdldE9wZXJhbmQoaSkuZ2V0SW5kZXgoKTsKKyAgaW50IHN0YWNrU2l6ZSAgPSBNRi5nZXRGcmFtZUluZm8oKS0+Z2V0U3RhY2tTaXplKCk7CisgIGludCBzcE9mZnNldCAgID0gTUYuZ2V0RnJhbWVJbmZvKCktPmdldE9iamVjdE9mZnNldChGcmFtZUluZGV4KTsKKworICBERUJVRyhlcnJzKCkgPDwgIkZyYW1lSW5kZXggOiAiIDw8IEZyYW1lSW5kZXggPDwgIlxuIgorICAgICAgICAgICAgICAgPDwgInNwT2Zmc2V0ICAgOiAiIDw8IHNwT2Zmc2V0IDw8ICJcbiIKKyAgICAgICAgICAgICAgIDw8ICJzdGFja1NpemUgIDogIiA8PCBzdGFja1NpemUgPDwgIlxuIik7CisKKyAgLy8gYXMgZXhwbGFpbmVkIG9uIExvd2VyRm9ybWFsQXJndW1lbnRzLCBkZXRlY3QgbmVnYXRpdmUgb2Zmc2V0cworICAvLyBhbmQgYWRqdXN0IFNQT2Zmc2V0cyBjb25zaWRlcmluZyB0aGUgZmluYWwgc3RhY2sgc2l6ZS4KKyAgaW50IE9mZnNldCA9IChzcE9mZnNldCA8IDApID8gKHN0YWNrU2l6ZSAtIHNwT2Zmc2V0KSA6IChzcE9mZnNldCArIDQpOworICBPZmZzZXQgICAgKz0gTUkuZ2V0T3BlcmFuZChvaSkuZ2V0SW1tKCk7CisKKyAgREVCVUcoZXJycygpIDw8ICJPZmZzZXQgICAgIDogIiA8PCBPZmZzZXQgPDwgIlxuIiA8PCAiPC0tLS0tLS0tLT5cbiIpOworCisgIE1JLmdldE9wZXJhbmQob2kpLkNoYW5nZVRvSW1tZWRpYXRlKE9mZnNldCk7CisgIE1JLmdldE9wZXJhbmQoaSkuQ2hhbmdlVG9SZWdpc3RlcihnZXRGcmFtZVJlZ2lzdGVyKE1GKSwgZmFsc2UpOworICByZXR1cm4gMDsKK30KKwordm9pZCBNQmxhemVSZWdpc3RlckluZm86OgorZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiAgID0gTUYuZnJvbnQoKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJICAgID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1CbGF6ZUZ1bmN0aW9uSW5mbyAqTUJsYXplRkkgPSBNRi5nZXRJbmZvPE1CbGF6ZUZ1bmN0aW9uSW5mbz4oKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBNQkIuYmVnaW4oKTsKKyAgRGVidWdMb2MgREwgPSBNQkJJICE9IE1CQi5lbmQoKSA/IE1CQkktPmdldERlYnVnTG9jKCkgOiBEZWJ1Z0xvYygpOworCisgIC8vIEdldCB0aGUgcmlnaHQgZnJhbWUgb3JkZXIgZm9yIE1CbGF6ZS4KKyAgYWRqdXN0TUJsYXplU3RhY2tGcmFtZShNRik7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgRnJhbWVJbmZvLgorICB1bnNpZ25lZCBTdGFja1NpemUgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworCisgIC8vIE5vIG5lZWQgdG8gYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrLgorICBpZiAoU3RhY2tTaXplID09IDAgJiYgIU1GSS0+YWRqdXN0c1N0YWNrKCkpIHJldHVybjsKKyAgaWYgKFN0YWNrU2l6ZSA8IDI4ICYmIE1GSS0+YWRqdXN0c1N0YWNrKCkpIFN0YWNrU2l6ZSA9IDI4OworCisgIGludCBGUE9mZnNldCA9IE1CbGF6ZUZJLT5nZXRGUFN0YWNrT2Zmc2V0KCk7CisgIGludCBSQU9mZnNldCA9IE1CbGF6ZUZJLT5nZXRSQVN0YWNrT2Zmc2V0KCk7CisKKyAgLy8gQWRqdXN0IHN0YWNrIDogYWRkaSBSMSwgUjEsIC1pbW0KKyAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KE1CbGF6ZTo6QURESSksIE1CbGF6ZTo6UjEpCisgICAgICAuYWRkUmVnKE1CbGF6ZTo6UjEpLmFkZEltbSgtU3RhY2tTaXplKTsKKworICAvLyBTYXZlIHRoZSByZXR1cm4gYWRkcmVzcyBvbmx5IGlmIHRoZSBmdW5jdGlvbiBpc250IGEgbGVhZiBvbmUuCisgIC8vIHN3aSAgUjE1LCBSMSwgc3RhY2tfbG9jCisgIGlmIChNRkktPmFkanVzdHNTdGFjaygpKSB7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KE1CbGF6ZTo6U1dJKSkKKyAgICAgICAgLmFkZFJlZyhNQmxhemU6OlIxNSkuYWRkSW1tKFJBT2Zmc2V0KS5hZGRSZWcoTUJsYXplOjpSMSk7CisgIH0KKworICAvLyBpZiBmcmFtZXBvaW50ZXIgZW5hYmxlZCwgc2F2ZSBpdCBhbmQgc2V0IGl0CisgIC8vIHRvIHBvaW50IHRvIHRoZSBzdGFjayBwb2ludGVyCisgIGlmIChoYXNGUChNRikpIHsKKyAgICAvLyBzd2kgIFIxOSwgUjEsIHN0YWNrX2xvYworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwgVElJLmdldChNQmxhemU6OlNXSSkpCisgICAgICAuYWRkUmVnKE1CbGF6ZTo6UjE5KS5hZGRJbW0oRlBPZmZzZXQpLmFkZFJlZyhNQmxhemU6OlIxKTsKKworICAgIC8vIGFkZCBSMTksIFIxLCBSMAorICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwgVElJLmdldChNQmxhemU6OkFERCksIE1CbGF6ZTo6UjE5KQorICAgICAgLmFkZFJlZyhNQmxhemU6OlIxKS5hZGRSZWcoTUJsYXplOjpSMCk7CisgIH0KK30KKwordm9pZCBNQmxhemVSZWdpc3RlckluZm86OgorZW1pdEVwaWxvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBwcmlvcihNQkIuZW5kKCkpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgICAgICAgICAgICA9IE1GLmdldEZyYW1lSW5mbygpOworICBNQmxhemVGdW5jdGlvbkluZm8gKk1CbGF6ZUZJICAgICAgICAgPSBNRi5nZXRJbmZvPE1CbGF6ZUZ1bmN0aW9uSW5mbz4oKTsKKyAgRGVidWdMb2MgZGwgPSBNQkJJLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIEdldCB0aGUgRkkncyB3aGVyZSBSQSBhbmQgRlAgYXJlIHNhdmVkLgorICBpbnQgRlBPZmZzZXQgPSBNQmxhemVGSS0+Z2V0RlBTdGFja09mZnNldCgpOworICBpbnQgUkFPZmZzZXQgPSBNQmxhemVGSS0+Z2V0UkFTdGFja09mZnNldCgpOworCisgIC8vIGlmIGZyYW1lcG9pbnRlciBlbmFibGVkLCByZXN0b3JlIGl0IGFuZCByZXN0b3JlIHRoZQorICAvLyBzdGFjayBwb2ludGVyCisgIGlmIChoYXNGUChNRikpIHsKKyAgICAvLyBhZGQgUjEsIFIxOSwgUjAKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoTUJsYXplOjpBREQpLCBNQmxhemU6OlIxKQorICAgICAgLmFkZFJlZyhNQmxhemU6OlIxOSkuYWRkUmVnKE1CbGF6ZTo6UjApOworCisgICAgLy8gbHdpICBSMTksIFIxLCBzdGFja19sb2MKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoTUJsYXplOjpMV0kpLCBNQmxhemU6OlIxOSkKKyAgICAgIC5hZGRJbW0oRlBPZmZzZXQpLmFkZFJlZyhNQmxhemU6OlIxKTsKKyAgfQorCisgIC8vIFJlc3RvcmUgdGhlIHJldHVybiBhZGRyZXNzIG9ubHkgaWYgdGhlIGZ1bmN0aW9uIGlzbnQgYSBsZWFmIG9uZS4KKyAgLy8gbHdpIFIxNSwgUjEsIHN0YWNrX2xvYworICBpZiAoTUZJLT5hZGp1c3RzU3RhY2soKSkgeworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChNQmxhemU6OkxXSSksIE1CbGF6ZTo6UjE1KQorICAgICAgLmFkZEltbShSQU9mZnNldCkuYWRkUmVnKE1CbGF6ZTo6UjEpOworICB9CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSBGcmFtZUluZm8KKyAgaW50IFN0YWNrU2l6ZSA9IChpbnQpIE1GSS0+Z2V0U3RhY2tTaXplKCk7CisgIGlmIChTdGFja1NpemUgPCAyOCAmJiBNRkktPmFkanVzdHNTdGFjaygpKSBTdGFja1NpemUgPSAyODsKKworICAvLyBhZGp1c3Qgc3RhY2suCisgIC8vIGFkZGkgUjEsIFIxLCBpbW0KKyAgaWYgKFN0YWNrU2l6ZSkgeworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChNQmxhemU6OkFEREkpLCBNQmxhemU6OlIxKQorICAgICAgLmFkZFJlZyhNQmxhemU6OlIxKS5hZGRJbW0oU3RhY2tTaXplKTsKKyAgfQorfQorCisKK3ZvaWQgTUJsYXplUmVnaXN0ZXJJbmZvOjoKK3Byb2Nlc3NGdW5jdGlvbkJlZm9yZUZyYW1lRmluYWxpemVkKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgLy8gU2V0IHRoZSBzdGFjayBvZmZzZXQgd2hlcmUgR1AgbXVzdCBiZSBzYXZlZC9sb2FkZWQgZnJvbS4KKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1CbGF6ZUZ1bmN0aW9uSW5mbyAqTUJsYXplRkkgPSBNRi5nZXRJbmZvPE1CbGF6ZUZ1bmN0aW9uSW5mbz4oKTsKKyAgaWYgKE1CbGF6ZUZJLT5uZWVkR1BTYXZlUmVzdG9yZSgpKQorICAgIE1GSS0+c2V0T2JqZWN0T2Zmc2V0KE1CbGF6ZUZJLT5nZXRHUEZJKCksIE1CbGF6ZUZJLT5nZXRHUFN0YWNrT2Zmc2V0KCkpOworfQorCit1bnNpZ25lZCBNQmxhemVSZWdpc3RlckluZm86OmdldFJBUmVnaXN0ZXIoKSBjb25zdCB7CisgIHJldHVybiBNQmxhemU6OlIxNTsKK30KKwordW5zaWduZWQgTUJsYXplUmVnaXN0ZXJJbmZvOjpnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgcmV0dXJuIGhhc0ZQKE1GKSA/IE1CbGF6ZTo6UjE5IDogTUJsYXplOjpSMTsKK30KKwordW5zaWduZWQgTUJsYXplUmVnaXN0ZXJJbmZvOjpnZXRFSEV4Y2VwdGlvblJlZ2lzdGVyKCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJXaGF0IGlzIHRoZSBleGNlcHRpb24gcmVnaXN0ZXIiKTsKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIE1CbGF6ZVJlZ2lzdGVySW5mbzo6Z2V0RUhIYW5kbGVyUmVnaXN0ZXIoKSBjb25zdCB7CisgIGxsdm1fdW5yZWFjaGFibGUoIldoYXQgaXMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIHJlZ2lzdGVyIik7CisgIHJldHVybiAwOworfQorCitpbnQgTUJsYXplUmVnaXN0ZXJJbmZvOjpnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJXaGF0IGlzIHRoZSBkd2FyZiByZWdpc3RlciBudW1iZXIiKTsKKyAgcmV0dXJuIC0xOworfQorCisjaW5jbHVkZSAiTUJsYXplR2VuUmVnaXN0ZXJJbmZvLmluYyIKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplUmVnaXN0ZXJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVSZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjk3YjBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplUmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSw5MyBAQAorLy89PT0tIE1CbGF6ZVJlZ2lzdGVySW5mby5oIC0gTUJsYXplIFJlZ2lzdGVyIEluZm9ybWF0aW9uIEltcGwgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE1CbGF6ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvCisvLyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE1CTEFaRVJFR0lTVEVSSU5GT19ICisjZGVmaW5lIE1CTEFaRVJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJNQmxhemUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJNQmxhemVHZW5SZWdpc3RlckluZm8uaC5pbmMiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1CbGF6ZVN1YnRhcmdldDsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFR5cGU7CisKK25hbWVzcGFjZSBNQmxhemUgeworICAvLy8gU3VicmVnSW5kZXggLSBUaGUgaW5kZXggb2YgdmFyaW91cyBzaXplZCBzdWJyZWdpc3RlciBjbGFzc2VzLiBOb3RlIHRoYXQgCisgIC8vLyB0aGVzZSBpbmRpY2VzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGNsYXNzIGluZGljZXMgaW4gdGhlIAorICAvLy8gTUJsYXplUmVnaXN0ZXJJbmZvLnRkIGZpbGUuCisgIGVudW0gU3VicmVnSW5kZXggeworICAgIFNVQlJFR19GUEVWRU4gPSAxLCBTVUJSRUdfRlBPREQgPSAyCisgIH07Cit9CisKK3N0cnVjdCBNQmxhemVSZWdpc3RlckluZm8gOiBwdWJsaWMgTUJsYXplR2VuUmVnaXN0ZXJJbmZvIHsKKyAgY29uc3QgTUJsYXplU3VidGFyZ2V0ICZTdWJ0YXJnZXQ7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJOworICAKKyAgTUJsYXplUmVnaXN0ZXJJbmZvKGNvbnN0IE1CbGF6ZVN1YnRhcmdldCAmU3VidGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpOworCisgIC8vLyBnZXRSZWdpc3Rlck51bWJlcmluZyAtIEdpdmVuIHRoZSBlbnVtIHZhbHVlIGZvciBzb21lIHJlZ2lzdGVyLCBlLmcuCisgIC8vLyBNQmxhemU6OlJBLCByZXR1cm4gdGhlIG51bWJlciB0aGF0IGl0IGNvcnJlc3BvbmRzIHRvIChlLmcuIDMxKS4KKyAgc3RhdGljIHVuc2lnbmVkIGdldFJlZ2lzdGVyTnVtYmVyaW5nKHVuc2lnbmVkIFJlZ0VudW0pOworICBzdGF0aWMgdW5zaWduZWQgZ2V0UmVnaXN0ZXJGcm9tTnVtYmVyaW5nKHVuc2lnbmVkIFJlZ0VudW0pOworCisgIC8vLyBHZXQgUElDIGluZGlyZWN0IGNhbGwgcmVnaXN0ZXIKKyAgc3RhdGljIHVuc2lnbmVkIGdldFBJQ0NhbGxSZWcoKTsKKworICAvLy8gQWRqdXN0IHRoZSBNQmxhemUgc3RhY2sgZnJhbWUuCisgIHZvaWQgYWRqdXN0TUJsYXplU3RhY2tGcmFtZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gQ29kZSBHZW5lcmF0aW9uIHZpcnR1YWwgbWV0aG9kcy4uLgorICBjb25zdCB1bnNpZ25lZCAqZ2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiogTUYgPSAwKSBjb25zdDsKKworICBCaXRWZWN0b3IgZ2V0UmVzZXJ2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIGJvb2wgaGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgdm9pZCBlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIGNvbnN0OworCisgIC8vLyBTdGFjayBGcmFtZSBQcm9jZXNzaW5nIE1ldGhvZHMKKyAgdW5zaWduZWQgZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gTlVMTCkgY29uc3Q7CisKKyAgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZChNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2b2lkIGVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgdm9pZCBlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisgIAorICAvLy8gRGVidWcgaW5mb3JtYXRpb24gcXVlcmllcy4KKyAgdW5zaWduZWQgZ2V0UkFSZWdpc3RlcigpIGNvbnN0OworICB1bnNpZ25lZCBnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBFeGNlcHRpb24gaGFuZGxpbmcgcXVlcmllcy4KKyAgdW5zaWduZWQgZ2V0RUhFeGNlcHRpb25SZWdpc3RlcigpIGNvbnN0OworICB1bnNpZ25lZCBnZXRFSEhhbmRsZXJSZWdpc3RlcigpIGNvbnN0OworCisgIC8vLyB0YXJnZXRIYW5kbGVzU3RhY2tGcmFtZVJvdW5kaW5nIC0gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgaXMKKyAgLy8vIHJlc3BvbnNpYmxlIGZvciByb3VuZGluZyB1cCB0aGUgc3RhY2sgZnJhbWUgKHByb2JhYmx5IGF0IGVtaXRQcm9sb2d1ZQorICAvLy8gdGltZSkuCisgIGJvb2wgdGFyZ2V0SGFuZGxlc1N0YWNrRnJhbWVSb3VuZGluZygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICBpbnQgZ2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVSZWdpc3RlckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVSZWdpc3RlckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhMWU3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVJlZ2lzdGVySW5mby50ZApAQCAtMCwwICsxLDE4MCBAQAorLy89PT0tIE1CbGF6ZVJlZ2lzdGVySW5mby50ZCAtIE1CbGF6ZSBSZWdpc3RlciBkZWZzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBEZWNsYXJhdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgTWljcm9CbGF6ZSByZWdpc3RlciBmaWxlCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBXZSBoYXZlIGJhbmtzIG9mIDMyIHJlZ2lzdGVycyBlYWNoLgorY2xhc3MgTUJsYXplUmVnPHN0cmluZyBuPiA6IFJlZ2lzdGVyPG4+IHsKKyAgZmllbGQgYml0czw1PiBOdW07CisgIGxldCBOYW1lc3BhY2UgPSAiTUJsYXplIjsKK30KKworLy8gTUJsYXplIENQVSBSZWdpc3RlcnMKK2NsYXNzIE1CbGF6ZUdQUlJlZzxiaXRzPDU+IG51bSwgc3RyaW5nIG4+IDogTUJsYXplUmVnPG4+IHsKKyAgbGV0IE51bSA9IG51bTsKK30KKworLy8gTUJsYXplIDMyLWJpdCAoYWxpYXNlZCkgRlBVIFJlZ2lzdGVycworY2xhc3MgRlBSPGJpdHM8NT4gbnVtLCBzdHJpbmcgbiwgbGlzdDxSZWdpc3Rlcj4gYWxpYXNlcz4gOiBNQmxhemVSZWc8bj4geworICBsZXQgTnVtID0gbnVtOworICBsZXQgQWxpYXNlcyA9IGFsaWFzZXM7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgUmVnaXN0ZXJzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgTmFtZXNwYWNlID0gIk1CbGF6ZSIgaW4geworCisgIC8vIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlcnMKKyAgZGVmIFIwICA6IE1CbGF6ZUdQUlJlZzwgMCwgICJyMCI+LCAgIER3YXJmUmVnTnVtPFswXT47CisgIGRlZiBSMSAgOiBNQmxhemVHUFJSZWc8IDEsICAicjEiPiwgICBEd2FyZlJlZ051bTxbMV0+OworICBkZWYgUjIgIDogTUJsYXplR1BSUmVnPCAyLCAgInIyIj4sICAgRHdhcmZSZWdOdW08WzJdPjsKKyAgZGVmIFIzICA6IE1CbGF6ZUdQUlJlZzwgMywgICJyMyI+LCAgIER3YXJmUmVnTnVtPFszXT47CisgIGRlZiBSNCAgOiBNQmxhemVHUFJSZWc8IDQsICAicjQiPiwgICBEd2FyZlJlZ051bTxbNV0+OworICBkZWYgUjUgIDogTUJsYXplR1BSUmVnPCA1LCAgInI1Ij4sICAgRHdhcmZSZWdOdW08WzVdPjsKKyAgZGVmIFI2ICA6IE1CbGF6ZUdQUlJlZzwgNiwgICJyNiI+LCAgIER3YXJmUmVnTnVtPFs2XT47CisgIGRlZiBSNyAgOiBNQmxhemVHUFJSZWc8IDcsICAicjciPiwgICBEd2FyZlJlZ051bTxbN10+OworICBkZWYgUjggIDogTUJsYXplR1BSUmVnPCA4LCAgInI4Ij4sICAgRHdhcmZSZWdOdW08WzhdPjsKKyAgZGVmIFI5ICA6IE1CbGF6ZUdQUlJlZzwgOSwgICJyOSI+LCAgIER3YXJmUmVnTnVtPFs5XT47CisgIGRlZiBSMTAgOiBNQmxhemVHUFJSZWc8IDEwLCAicjEwIj4sICBEd2FyZlJlZ051bTxbMTBdPjsKKyAgZGVmIFIxMSA6IE1CbGF6ZUdQUlJlZzwgMTEsICJyMTEiPiwgIER3YXJmUmVnTnVtPFsxMV0+OworICBkZWYgUjEyIDogTUJsYXplR1BSUmVnPCAxMiwgInIxMiI+LCAgRHdhcmZSZWdOdW08WzEyXT47CisgIGRlZiBSMTMgOiBNQmxhemVHUFJSZWc8IDEzLCAicjEzIj4sICBEd2FyZlJlZ051bTxbMTNdPjsKKyAgZGVmIFIxNCA6IE1CbGF6ZUdQUlJlZzwgMTQsICJyMTQiPiwgIER3YXJmUmVnTnVtPFsxNF0+OworICBkZWYgUjE1IDogTUJsYXplR1BSUmVnPCAxNSwgInIxNSI+LCAgRHdhcmZSZWdOdW08WzE1XT47CisgIGRlZiBSMTYgOiBNQmxhemVHUFJSZWc8IDE2LCAicjE2Ij4sICBEd2FyZlJlZ051bTxbMTZdPjsKKyAgZGVmIFIxNyA6IE1CbGF6ZUdQUlJlZzwgMTcsICJyMTciPiwgIER3YXJmUmVnTnVtPFsxN10+OworICBkZWYgUjE4IDogTUJsYXplR1BSUmVnPCAxOCwgInIxOCI+LCAgRHdhcmZSZWdOdW08WzE4XT47CisgIGRlZiBSMTkgOiBNQmxhemVHUFJSZWc8IDE5LCAicjE5Ij4sICBEd2FyZlJlZ051bTxbMTldPjsKKyAgZGVmIFIyMCA6IE1CbGF6ZUdQUlJlZzwgMjAsICJyMjAiPiwgIER3YXJmUmVnTnVtPFsyMF0+OworICBkZWYgUjIxIDogTUJsYXplR1BSUmVnPCAyMSwgInIyMSI+LCAgRHdhcmZSZWdOdW08WzIxXT47CisgIGRlZiBSMjIgOiBNQmxhemVHUFJSZWc8IDIyLCAicjIyIj4sICBEd2FyZlJlZ051bTxbMjJdPjsKKyAgZGVmIFIyMyA6IE1CbGF6ZUdQUlJlZzwgMjMsICJyMjMiPiwgIER3YXJmUmVnTnVtPFsyM10+OworICBkZWYgUjI0IDogTUJsYXplR1BSUmVnPCAyNCwgInIyNCI+LCAgRHdhcmZSZWdOdW08WzI0XT47CisgIGRlZiBSMjUgOiBNQmxhemVHUFJSZWc8IDI1LCAicjI1Ij4sICBEd2FyZlJlZ051bTxbMjVdPjsKKyAgZGVmIFIyNiA6IE1CbGF6ZUdQUlJlZzwgMjYsICJyMjYiPiwgIER3YXJmUmVnTnVtPFsyNl0+OworICBkZWYgUjI3IDogTUJsYXplR1BSUmVnPCAyNywgInIyNyI+LCAgRHdhcmZSZWdOdW08WzI3XT47CisgIGRlZiBSMjggOiBNQmxhemVHUFJSZWc8IDI4LCAicjI4Ij4sICBEd2FyZlJlZ051bTxbMjhdPjsKKyAgZGVmIFIyOSA6IE1CbGF6ZUdQUlJlZzwgMjksICJyMjkiPiwgIER3YXJmUmVnTnVtPFsyOV0+OworICBkZWYgUjMwIDogTUJsYXplR1BSUmVnPCAzMCwgInIzMCI+LCAgRHdhcmZSZWdOdW08WzMwXT47CisgIGRlZiBSMzEgOiBNQmxhemVHUFJSZWc8IDMxLCAicjMxIj4sICBEd2FyZlJlZ051bTxbMzFdPjsKKworICAvLy8gTUJsYXplIFNpbmdsZSBwb2ludCBwcmVjaXNpb24gRlBVIFJlZ2lzdGVycworICBkZWYgRjAgIDogRlBSPCAwLCAgInIwIiwgW1IwXT4sICBEd2FyZlJlZ051bTxbMzJdPjsKKyAgZGVmIEYxICA6IEZQUjwgMSwgICJyMSIsIFtSMV0+LCAgRHdhcmZSZWdOdW08WzMzXT47CisgIGRlZiBGMiAgOiBGUFI8IDIsICAicjIiLCBbUjJdPiwgIER3YXJmUmVnTnVtPFszNF0+OworICBkZWYgRjMgIDogRlBSPCAzLCAgInIzIiwgW1IzXT4sICBEd2FyZlJlZ051bTxbMzVdPjsKKyAgZGVmIEY0ICA6IEZQUjwgNCwgICJyNCIsIFtSNF0+LCAgRHdhcmZSZWdOdW08WzM2XT47CisgIGRlZiBGNSAgOiBGUFI8IDUsICAicjUiLCBbUjVdPiwgIER3YXJmUmVnTnVtPFszN10+OworICBkZWYgRjYgIDogRlBSPCA2LCAgInI2IiwgW1I2XT4sICBEd2FyZlJlZ051bTxbMzhdPjsKKyAgZGVmIEY3ICA6IEZQUjwgNywgICJyNyIsIFtSN10+LCAgRHdhcmZSZWdOdW08WzM5XT47CisgIGRlZiBGOCAgOiBGUFI8IDgsICAicjgiLCBbUjhdPiwgIER3YXJmUmVnTnVtPFs0MF0+OworICBkZWYgRjkgIDogRlBSPCA5LCAgInI5IiwgW1I5XT4sICBEd2FyZlJlZ051bTxbNDFdPjsKKyAgZGVmIEYxMCA6IEZQUjwxMCwgInIxMCIsIFtSMTBdPiwgRHdhcmZSZWdOdW08WzQyXT47CisgIGRlZiBGMTEgOiBGUFI8MTEsICJyMTEiLCBbUjExXT4sIER3YXJmUmVnTnVtPFs0M10+OworICBkZWYgRjEyIDogRlBSPDEyLCAicjEyIiwgW1IxMl0+LCBEd2FyZlJlZ051bTxbNDRdPjsKKyAgZGVmIEYxMyA6IEZQUjwxMywgInIxMyIsIFtSMTNdPiwgRHdhcmZSZWdOdW08WzQ1XT47CisgIGRlZiBGMTQgOiBGUFI8MTQsICJyMTQiLCBbUjE0XT4sIER3YXJmUmVnTnVtPFs0Nl0+OworICBkZWYgRjE1IDogRlBSPDE1LCAicjE1IiwgW1IxNV0+LCBEd2FyZlJlZ051bTxbNDddPjsKKyAgZGVmIEYxNiA6IEZQUjwxNiwgInIxNiIsIFtSMTZdPiwgRHdhcmZSZWdOdW08WzQ4XT47CisgIGRlZiBGMTcgOiBGUFI8MTcsICJyMTciLCBbUjE3XT4sIER3YXJmUmVnTnVtPFs0OV0+OworICBkZWYgRjE4IDogRlBSPDE4LCAicjE4IiwgW1IxOF0+LCBEd2FyZlJlZ051bTxbNTBdPjsKKyAgZGVmIEYxOSA6IEZQUjwxOSwgInIxOSIsIFtSMTldPiwgRHdhcmZSZWdOdW08WzUxXT47CisgIGRlZiBGMjAgOiBGUFI8MjAsICJyMjAiLCBbUjIwXT4sIER3YXJmUmVnTnVtPFs1Ml0+OworICBkZWYgRjIxIDogRlBSPDIxLCAicjIxIiwgW1IyMV0+LCBEd2FyZlJlZ051bTxbNTNdPjsKKyAgZGVmIEYyMiA6IEZQUjwyMiwgInIyMiIsIFtSMjJdPiwgRHdhcmZSZWdOdW08WzU0XT47CisgIGRlZiBGMjMgOiBGUFI8MjMsICJyMjMiLCBbUjIzXT4sIER3YXJmUmVnTnVtPFs1NV0+OworICBkZWYgRjI0IDogRlBSPDI0LCAicjI0IiwgW1IyNF0+LCBEd2FyZlJlZ051bTxbNTZdPjsKKyAgZGVmIEYyNSA6IEZQUjwyNSwgInIyNSIsIFtSMjVdPiwgRHdhcmZSZWdOdW08WzU3XT47CisgIGRlZiBGMjYgOiBGUFI8MjYsICJyMjYiLCBbUjI2XT4sIER3YXJmUmVnTnVtPFs1OF0+OworICBkZWYgRjI3IDogRlBSPDI3LCAicjI3IiwgW1IyN10+LCBEd2FyZlJlZ051bTxbNTldPjsKKyAgZGVmIEYyOCA6IEZQUjwyOCwgInIyOCIsIFtSMjhdPiwgRHdhcmZSZWdOdW08WzYwXT47CisgIGRlZiBGMjkgOiBGUFI8MjksICJyMjkiLCBbUjI5XT4sIER3YXJmUmVnTnVtPFs2MV0+OworICBkZWYgRjMwIDogRlBSPDMwLCAicjMwIiwgW1IzMF0+LCBEd2FyZlJlZ051bTxbNjJdPjsKKyAgZGVmIEYzMSA6IEZQUjwzMSwgInIzMSIsIFtSMzFdPiwgRHdhcmZSZWdOdW08WzYzXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSZWdpc3RlciBDbGFzc2VzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgQ1BVUmVncyA6IFJlZ2lzdGVyQ2xhc3M8Ik1CbGF6ZSIsIFtpMzJdLCAzMiwKKyAgWworICAvLyBSZXR1cm4gVmFsdWVzIGFuZCBBcmd1bWVudHMKKyAgUjMsIFI0LCBSNSwgUjYsIFI3LCBSOCwgUjksIFIxMCwKKworICAvLyBOb3QgcHJlc2VydmVkIGFjcm9zcyBwcm9jZWR1cmUgY2FsbHMKKyAgUjExLCBSMTIsCisKKyAgLy8gQ2FsbGVlIHNhdmUKKyAgUjIwLCBSMjEsIFIyMiwgUjIzLCBSMjQsIFIyNSwgUjI2LCBSMjcsIFIyOCwgUjI5LCBSMzAsIFIzMSwKKworICAvLyBSZXNlcnZlZAorICBSMCwgIC8vIEFsd2F5cyB6ZXJvCisgIFIxLCAgLy8gVGhlIHN0YWNrIHBvaW50ZXIKKyAgUjIsICAvLyBSZWFkLW9ubHkgc21hbGwgZGF0YSBhcmVhIGFuY2hvcgorICBSMTMsIC8vIFJlYWQtd3JpdGUgc21hbGwgZGF0YSBhcmVhIGFuY2hvcgorICBSMTQsIC8vIFJldHVybiBhZGRyZXNzIGZvciBpbnRlcnJ1cHRzCisgIFIxNSwgLy8gUmV0dXJuIGFkZHJlc3MgZm9yIHN1Yi1yb3V0aW5lcworICBSMTYsIC8vIFJldHVybiBhZGRyZXNzIGZvciB0cmFwCisgIFIxNywgLy8gUmV0dXJuIGFkZHJlc3MgZm9yIGV4Y2VwdGlvbnMKKyAgUjE4LCAvLyBSZXNlcnZlZCBmb3IgYXNzZW1ibGVyCisgIFIxOSAgLy8gVGhlIGZyYW1lLXBvaW50ZXIKKyAgXT4KK3sKKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIH1dOworICBsZXQgTWV0aG9kQm9kaWVzID0gW3sKKyAgICBDUFVSZWdzQ2xhc3M6Oml0ZXJhdG9yCisgICAgQ1BVUmVnc0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICAvLyBUaGUgbGFzdCAxMCByZWdpc3RlcnMgb24gdGhlIGxpc3QgYWJvdmUgYXJlIHJlc2VydmVkCisgICAgICByZXR1cm4gZW5kKCktMTA7CisgICAgfQorICB9XTsKK30KKworZGVmIEZHUjMyIDogUmVnaXN0ZXJDbGFzczwiTUJsYXplIiwgW2YzMl0sIDMyLAorICBbCisgIC8vIFJldHVybiBWYWx1ZXMgYW5kIEFyZ3VtZW50cworICBGMywgRjQsIEY1LCBGNiwgRjcsIEY4LCBGOSwgRjEwLAorCisgIC8vIE5vdCBwcmVzZXJ2ZWQgYWNyb3NzIHByb2NlZHVyZSBjYWxscworICBGMTEsIEYxMiwKKworICAvLyBDYWxsZWUgc2F2ZQorICBGMjAsIEYyMSwgRjIyLCBGMjMsIEYyNCwgRjI1LCBGMjYsIEYyNywgRjI4LCBGMjksIEYzMCwgRjMxLAorCisgIC8vIFJlc2VydmVkCisgIEYwLCAgLy8gQWx3YXlzIHplcm8KKyAgRjEsICAvLyBUaGUgc3RhY2sgcG9pbnRlcgorICBGMiwgIC8vIFJlYWQtb25seSBzbWFsbCBkYXRhIGFyZWEgYW5jaG9yCisgIEYxMywgLy8gUmVhZC13cml0ZSBzbWFsbCBkYXRhIGFyZWEgYW5jaG9yCisgIEYxNCwgLy8gUmV0dXJuIGFkZHJlc3MgZm9yIGludGVycnVwdHMKKyAgRjE1LCAvLyBSZXR1cm4gYWRkcmVzcyBmb3Igc3ViLXJvdXRpbmVzCisgIEYxNiwgLy8gUmV0dXJuIGFkZHJlc3MgZm9yIHRyYXAKKyAgRjE3LCAvLyBSZXR1cm4gYWRkcmVzcyBmb3IgZXhjZXB0aW9ucworICBGMTgsIC8vIFJlc2VydmVkIGZvciBhc3NlbWJsZXIKKyAgRjE5ICAvLyBUaGUgZnJhbWUgcG9pbnRlcgorICBdPgoreworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIEZHUjMyQ2xhc3M6Oml0ZXJhdG9yCisgICAgRkdSMzJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgLy8gVGhlIGxhc3QgMTAgcmVnaXN0ZXJzIG9uIHRoZSBsaXN0IGFib3ZlIGFyZSByZXNlcnZlZAorICAgICAgcmV0dXJuIGVuZCgpLTEwOworICAgIH0KKyAgfV07Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVTY2hlZHVsZS50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVNjaGVkdWxlLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZWM5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVTY2hlZHVsZS50ZApAQCAtMCwwICsxLDY0IEBACisvLz09PS0gTUJsYXplU2NoZWR1bGUudGQgLSBNQmxhemUgU2NoZWR1bGluZyBEZWZpbml0aW9ucyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRnVuY3Rpb25hbCB1bml0cyBhY3Jvc3MgTUJsYXplIGNoaXBzIHNldHMuIEJhc2VkIG9uIEdDQy9NQmxhemUgYmFja2VuZCBmaWxlcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgQUxVICAgICA6IEZ1bmNVbml0OworZGVmIElNVUxESVYgOiBGdW5jVW5pdDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIEl0aW5lcmFyeSBjbGFzc2VzIHVzZWQgZm9yIE1CbGF6ZSAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgSUlBbHUgICAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlMb2FkICAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlTdG9yZSAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlYZmVyICAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlCcmFuY2ggICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlIaUxvICAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlJbXVsICAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlJZGl2ICAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGY3Z0ICAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGbW92ZSAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGY21wICAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGYWRkICAgICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGbXVsU2luZ2xlICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGbXVsRG91YmxlICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGZGl2U2luZ2xlICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGZGl2RG91YmxlICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGc3FydFNpbmdsZSAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGc3FydERvdWJsZSAgICAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlGcmVjaXBGc3FydFN0ZXAgIDogSW5zdHJJdGluQ2xhc3M7CitkZWYgSUlQc2V1ZG8gICAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNQmxhemUgR2VuZXJpYyBpbnN0cnVjdGlvbiBpdGluZXJhcmllcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgTUJsYXplR2VuZXJpY0l0aW5lcmFyaWVzIDogUHJvY2Vzc29ySXRpbmVyYXJpZXM8CisgIFtBTFUsIElNVUxESVZdLCBbCisgIEluc3RySXRpbkRhdGE8SUlBbHUgICAgICAgICAgICAgICwgW0luc3RyU3RhZ2U8MSwgIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJTG9hZCAgICAgICAgICAgICAsIFtJbnN0clN0YWdlPDMsICBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSVN0b3JlICAgICAgICAgICAgLCBbSW5zdHJTdGFnZTwxLCAgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlYZmVyICAgICAgICAgICAgICwgW0luc3RyU3RhZ2U8MiwgIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJQnJhbmNoICAgICAgICAgICAsIFtJbnN0clN0YWdlPDEsICBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUhpTG8gICAgICAgICAgICAgLCBbSW5zdHJTdGFnZTwxLCAgW0lNVUxESVZdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJSW11bCAgICAgICAgICAgICAsIFtJbnN0clN0YWdlPDE3LCBbSU1VTERJVl0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlJZGl2ICAgICAgICAgICAgICwgW0luc3RyU3RhZ2U8MzgsIFtJTVVMRElWXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUZjdnQgICAgICAgICAgICAgLCBbSW5zdHJTdGFnZTwxLCAgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlGbW92ZSAgICAgICAgICAgICwgW0luc3RyU3RhZ2U8MiwgIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJRmNtcCAgICAgICAgICAgICAsIFtJbnN0clN0YWdlPDMsICBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUZhZGQgICAgICAgICAgICAgLCBbSW5zdHJTdGFnZTw0LCAgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlGbXVsU2luZ2xlICAgICAgICwgW0luc3RyU3RhZ2U8NywgIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJRm11bERvdWJsZSAgICAgICAsIFtJbnN0clN0YWdlPDgsICBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUZkaXZTaW5nbGUgICAgICAgLCBbSW5zdHJTdGFnZTwyMywgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlGZGl2RG91YmxlICAgICAgICwgW0luc3RyU3RhZ2U8MzYsIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJRnNxcnRTaW5nbGUgICAgICAsIFtJbnN0clN0YWdlPDU0LCBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUZzcXJ0RG91YmxlICAgICAgLCBbSW5zdHJTdGFnZTwxMiwgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlGcmVjaXBGc3FydFN0ZXAgICwgW0luc3RyU3RhZ2U8NSwgIFtBTFVdPl0+CitdPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVNlbGVjdGlvbkRBR0luZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplU2VsZWN0aW9uREFHSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExMTViMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVNlbGVjdGlvbkRBR0luZm8uY3BwCkBAIC0wLDAgKzEsMjMgQEAKKy8vPT09LS0gTUJsYXplU2VsZWN0aW9uREFHSW5mby5jcHAgLSBNQmxhemUgU2VsZWN0aW9uREFHIEluZm8gLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIE1CbGF6ZVNlbGVjdGlvbkRBR0luZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJtYmxhemUtc2VsZWN0aW9uZGFnLWluZm8iCisjaW5jbHVkZSAiTUJsYXplVGFyZ2V0TWFjaGluZS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01CbGF6ZVNlbGVjdGlvbkRBR0luZm86Ok1CbGF6ZVNlbGVjdGlvbkRBR0luZm8oY29uc3QgTUJsYXplVGFyZ2V0TWFjaGluZSAmVE0pCisgIDogVGFyZ2V0U2VsZWN0aW9uREFHSW5mbyhUTSkgeworfQorCitNQmxhemVTZWxlY3Rpb25EQUdJbmZvOjp+TUJsYXplU2VsZWN0aW9uREFHSW5mbygpIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVNlbGVjdGlvbkRBR0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVNlbGVjdGlvbkRBR0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjhlMmFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplU2VsZWN0aW9uREFHSW5mby5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LS0gTUJsYXplU2VsZWN0aW9uREFHSW5mby5oIC0gTUJsYXplIFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1CbGF6ZSBzdWJjbGFzcyBmb3IgVGFyZ2V0U2VsZWN0aW9uREFHSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE1CTEFaRVNFTEVDVElPTkRBR0lORk9fSAorI2RlZmluZSBNQkxBWkVTRUxFQ1RJT05EQUdJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBR0luZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQmxhemVUYXJnZXRNYWNoaW5lOworCitjbGFzcyBNQmxhemVTZWxlY3Rpb25EQUdJbmZvIDogcHVibGljIFRhcmdldFNlbGVjdGlvbkRBR0luZm8geworcHVibGljOgorICBleHBsaWNpdCBNQmxhemVTZWxlY3Rpb25EQUdJbmZvKGNvbnN0IE1CbGF6ZVRhcmdldE1hY2hpbmUgJlRNKTsKKyAgfk1CbGF6ZVNlbGVjdGlvbkRBR0luZm8oKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVTdWJ0YXJnZXQuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplU3VidGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQwNTIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplU3VidGFyZ2V0LmNwcApAQCAtMCwwICsxLDMxIEBACisvLz09PS0gTUJsYXplU3VidGFyZ2V0LmNwcCAtIE1CbGF6ZSBTdWJ0YXJnZXQgSW5mb3JtYXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBNQmxhemUgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0U3VidGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJNQmxhemVTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJNQmxhemUuaCIKKyNpbmNsdWRlICJNQmxhemVHZW5TdWJ0YXJnZXQuaW5jIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01CbGF6ZVN1YnRhcmdldDo6TUJsYXplU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKToKKyAgSGFzUGlwZTMoZmFsc2UpLCBIYXNCYXJyZWwoZmFsc2UpLCBIYXNEaXYoZmFsc2UpLCBIYXNNdWwoZmFsc2UpLAorICBIYXNGU0woZmFsc2UpLCBIYXNFRlNMKGZhbHNlKSwgSGFzTVNSU2V0KGZhbHNlKSwgSGFzRXhjZXB0aW9uKGZhbHNlKSwKKyAgSGFzUGF0Q21wKGZhbHNlKSwgSGFzRlBVKGZhbHNlKSwgSGFzRVNSKGZhbHNlKSwgSGFzUFZSKGZhbHNlKSwKKyAgSGFzTXVsNjQoZmFsc2UpLCBIYXNTcXJ0KGZhbHNlKSwgSGFzTU1VKGZhbHNlKQoreworICBzdGQ6OnN0cmluZyBDUFUgPSAidjQwMCI7CisgIE1CbGF6ZUFyY2hWZXJzaW9uID0gVjQwMDsKKworICAvLyBQYXJzZSBmZWF0dXJlcyBzdHJpbmcuCisgIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoRlMsIENQVSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVTdWJ0YXJnZXQuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVN1YnRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmIzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVTdWJ0YXJnZXQuaApAQCAtMCwwICsxLDc5IEBACisvLz09PT09LS0gTUJsYXplU3VidGFyZ2V0LmggLSBEZWZpbmUgU3VidGFyZ2V0IGZvciB0aGUgTUJsYXplIC0qLSBDKysgLSotLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTUJsYXplIHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE1CTEFaRVNVQlRBUkdFVF9ICisjZGVmaW5lIE1CTEFaRVNVQlRBUkdFVF9ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUJsYXplU3VidGFyZ2V0IDogcHVibGljIFRhcmdldFN1YnRhcmdldCB7CisKK3Byb3RlY3RlZDoKKworICBlbnVtIE1CbGF6ZUFyY2hFbnVtIHsKKyAgICBWNDAwLCBWNTAwLCBWNjAwLCBWNzAwLCBWNzEwCisgIH07CisKKyAgLy8gTUJsYXplIGFyY2hpdGVjdHVyZSB2ZXJzaW9uCisgIE1CbGF6ZUFyY2hFbnVtIE1CbGF6ZUFyY2hWZXJzaW9uOworCisgIGJvb2wgSGFzUGlwZTM7CisgIGJvb2wgSGFzQmFycmVsOworICBib29sIEhhc0RpdjsKKyAgYm9vbCBIYXNNdWw7CisgIGJvb2wgSGFzRlNMOworICBib29sIEhhc0VGU0w7CisgIGJvb2wgSGFzTVNSU2V0OworICBib29sIEhhc0V4Y2VwdGlvbjsKKyAgYm9vbCBIYXNQYXRDbXA7CisgIGJvb2wgSGFzRlBVOworICBib29sIEhhc0VTUjsKKyAgYm9vbCBIYXNQVlI7CisgIGJvb2wgSGFzTXVsNjQ7CisgIGJvb2wgSGFzU3FydDsKKyAgYm9vbCBIYXNNTVU7CisKKyAgSW5zdHJJdGluZXJhcnlEYXRhIEluc3RySXRpbnM7CisKK3B1YmxpYzoKKworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgZGF0YSBtZW1iZXJzIHRvIG1hdGNoIHRoYXQKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgdHJpcGxlLgorICBNQmxhemVTdWJ0YXJnZXQoY29uc3Qgc3RkOjpzdHJpbmcgJlRULCBjb25zdCBzdGQ6OnN0cmluZyAmRlMpOworCisgIC8vLyBQYXJzZVN1YnRhcmdldEZlYXR1cmVzIC0gUGFyc2VzIGZlYXR1cmVzIHN0cmluZyBzZXR0aW5nIHNwZWNpZmllZAorICAvLy8gc3VidGFyZ2V0IG9wdGlvbnMuICBEZWZpbml0aW9uIG9mIGZ1bmN0aW9uIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRibGdlbi4KKyAgc3RkOjpzdHJpbmcgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhjb25zdCBzdGQ6OnN0cmluZyAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkNQVSk7CisKKyAgYm9vbCBoYXNGUFUoKSAgICBjb25zdCB7IHJldHVybiBIYXNGUFU7IH0KKyAgYm9vbCBoYXNTcXJ0KCkgICBjb25zdCB7IHJldHVybiBIYXNTcXJ0OyB9CisgIGJvb2wgaGFzTXVsKCkgICAgY29uc3QgeyByZXR1cm4gSGFzTXVsOyB9CisgIGJvb2wgaGFzTXVsNjQoKSAgY29uc3QgeyByZXR1cm4gSGFzTXVsNjQ7IH0KKyAgYm9vbCBoYXNEaXYoKSAgICBjb25zdCB7IHJldHVybiBIYXNEaXY7IH0KKyAgYm9vbCBoYXNCYXJyZWwoKSBjb25zdCB7IHJldHVybiBIYXNCYXJyZWw7IH0KKworICBib29sIGlzVjQwMCgpIGNvbnN0IHsgcmV0dXJuIE1CbGF6ZUFyY2hWZXJzaW9uID09IFY0MDA7IH0KKyAgYm9vbCBpc1Y1MDAoKSBjb25zdCB7IHJldHVybiBNQmxhemVBcmNoVmVyc2lvbiA9PSBWNTAwOyB9CisgIGJvb2wgaXNWNjAwKCkgY29uc3QgeyByZXR1cm4gTUJsYXplQXJjaFZlcnNpb24gPT0gVjYwMDsgfQorICBib29sIGlzVjcwMCgpIGNvbnN0IHsgcmV0dXJuIE1CbGF6ZUFyY2hWZXJzaW9uID09IFY3MDA7IH0KKyAgYm9vbCBpc1Y3MTAoKSBjb25zdCB7IHJldHVybiBNQmxhemVBcmNoVmVyc2lvbiA9PSBWNzEwOyB9Cit9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVUYXJnZXRNYWNoaW5lLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVRhcmdldE1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTI5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVUYXJnZXRNYWNoaW5lLmNwcApAQCAtMCwwICsxLDY2IEBACisvLz09PS0tIE1CbGF6ZVRhcmdldE1hY2hpbmUuY3BwIC0gRGVmaW5lIFRhcmdldE1hY2hpbmUgZm9yIE1CbGF6ZSAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEltcGxlbWVudHMgdGhlIGluZm8gYWJvdXQgTUJsYXplIHRhcmdldCBzcGVjLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJNQmxhemUuaCIKKyNpbmNsdWRlICJNQmxhemVNQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJNQmxhemVUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplTUJsYXplVGFyZ2V0KCkgeworICAvLyBSZWdpc3RlciB0aGUgdGFyZ2V0LgorICBSZWdpc3RlclRhcmdldE1hY2hpbmU8TUJsYXplVGFyZ2V0TWFjaGluZT4gWChUaGVNQmxhemVUYXJnZXQpOworICBSZWdpc3RlckFzbUluZm88TUJsYXplTUNBc21JbmZvPiBBKFRoZU1CbGF6ZVRhcmdldCk7Cit9CisKKy8vIERhdGFMYXlvdXQgLS0+IEJpZy1lbmRpYW4sIDMyLWJpdCBwb2ludGVyL0FCSS9hbGlnbm1lbnQKKy8vIFRoZSBzdGFjayBpcyBhbHdheXMgOCBieXRlIGFsaWduZWQKKy8vIE9uIGZ1bmN0aW9uIHByb2xvZ3VlLCB0aGUgc3RhY2sgaXMgY3JlYXRlZCBieSBkZWNyZW1lbnRpbmcKKy8vIGl0cyBwb2ludGVyLiBPbmNlIGRlY3JlbWVudGVkLCBhbGwgcmVmZXJlbmNlcyBhcmUgZG9uZSB3aXRoIHBvc2l0aXZlCisvLyBvZmZzZXQgZnJvbSB0aGUgc3RhY2svZnJhbWUgcG9pbnRlciwgdXNpbmcgU3RhY2tHcm93c1VwIGVuYWJsZXMKKy8vIGFuIGVhc2llciBoYW5kbGluZy4KK01CbGF6ZVRhcmdldE1hY2hpbmU6OgorTUJsYXplVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKToKKyAgTExWTVRhcmdldE1hY2hpbmUoVCwgVFQpLAorICBTdWJ0YXJnZXQoVFQsIEZTKSwKKyAgRGF0YUxheW91dCgiRS1wOjMyOjMyLWk4Ojg6OC1pMTY6MTY6MTYtaTY0OjMyOjMyLSIKKyAgICAgICAgICAgICAiZjY0OjMyOjMyLXY2NDozMjozMi12MTI4OjMyOjMyLW4zMiIpLAorICBJbnN0ckluZm8oKnRoaXMpLAorICBGcmFtZUluZm8oVGFyZ2V0RnJhbWVJbmZvOjpTdGFja0dyb3dzVXAsIDgsIDApLAorICBUTEluZm8oKnRoaXMpLCBUU0luZm8oKnRoaXMpIHsKKyAgaWYgKGdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpEZWZhdWx0KSB7CisgICAgICBzZXRSZWxvY2F0aW9uTW9kZWwoUmVsb2M6OlN0YXRpYyk7CisgIH0KKworICBpZiAoZ2V0Q29kZU1vZGVsKCkgPT0gQ29kZU1vZGVsOjpEZWZhdWx0KQorICAgIHNldENvZGVNb2RlbChDb2RlTW9kZWw6OlNtYWxsKTsKK30KKworLy8gSW5zdGFsbCBhbiBpbnN0cnVjdGlvbiBzZWxlY3RvciBwYXNzIHVzaW5nCisvLyB0aGUgSVNlbERhZyB0byBnZW4gTUJsYXplIGNvZGUuCitib29sIE1CbGF6ZVRhcmdldE1hY2hpbmU6OgorYWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIFBNLmFkZChjcmVhdGVNQmxhemVJU2VsRGFnKCp0aGlzKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gSW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IHdhbnQgdG8gcnVuIHBhc3NlcyBpbW1lZGlhdGVseSBiZWZvcmUKKy8vIG1hY2hpbmUgY29kZSBpcyBlbWl0dGVkLiByZXR1cm4gdHJ1ZSBpZiAtcHJpbnQtbWFjaGluZWluc3RycyBzaG91bGQKKy8vIHByaW50IG91dCB0aGUgY29kZSBhZnRlciB0aGUgcGFzc2VzLgorYm9vbCBNQmxhemVUYXJnZXRNYWNoaW5lOjoKK2FkZFByZUVtaXRQYXNzKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIFBNLmFkZChjcmVhdGVNQmxhemVEZWxheVNsb3RGaWxsZXJQYXNzKCp0aGlzKSk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplVGFyZ2V0TWFjaGluZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplVGFyZ2V0TWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTdlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVUYXJnZXRNYWNoaW5lLmgKQEAgLTAsMCArMSw3NCBAQAorLy89PT0tLSBNQmxhemVUYXJnZXRNYWNoaW5lLmggLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgTUJsYXplIC0tLSBDKysgLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1CbGF6ZSBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRNYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTUJMQVpFX1RBUkdFVE1BQ0hJTkVfSAorI2RlZmluZSBNQkxBWkVfVEFSR0VUTUFDSElORV9ICisKKyNpbmNsdWRlICJNQmxhemVTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJNQmxhemVJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJNQmxhemVJU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJNQmxhemVTZWxlY3Rpb25EQUdJbmZvLmgiCisjaW5jbHVkZSAiTUJsYXplSW50cmluc2ljSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOworCisgIGNsYXNzIE1CbGF6ZVRhcmdldE1hY2hpbmUgOiBwdWJsaWMgTExWTVRhcmdldE1hY2hpbmUgeworICAgIE1CbGF6ZVN1YnRhcmdldCAgICAgICBTdWJ0YXJnZXQ7CisgICAgY29uc3QgVGFyZ2V0RGF0YSAgICBEYXRhTGF5b3V0OyAvLyBDYWxjdWxhdGVzIHR5cGUgc2l6ZSAmIGFsaWdubWVudAorICAgIE1CbGF6ZUluc3RySW5mbyAgICAgICBJbnN0ckluZm87CisgICAgVGFyZ2V0RnJhbWVJbmZvICAgICBGcmFtZUluZm87CisgICAgTUJsYXplVGFyZ2V0TG93ZXJpbmcgIFRMSW5mbzsKKyAgICBNQmxhemVTZWxlY3Rpb25EQUdJbmZvIFRTSW5mbzsKKyAgICBNQmxhemVJbnRyaW5zaWNJbmZvIEludHJpbnNpY0luZm87CisgIHB1YmxpYzoKKyAgICBNQmxhemVUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGUyk7CisKKyAgICB2aXJ0dWFsIGNvbnN0IE1CbGF6ZUluc3RySW5mbyAqZ2V0SW5zdHJJbmZvKCkgY29uc3QKKyAgICB7IHJldHVybiAmSW5zdHJJbmZvOyB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFRhcmdldEZyYW1lSW5mbyAqZ2V0RnJhbWVJbmZvKCkgY29uc3QKKyAgICB7IHJldHVybiAmRnJhbWVJbmZvOyB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IE1CbGF6ZVN1YnRhcmdldCAqZ2V0U3VidGFyZ2V0SW1wbCgpIGNvbnN0CisgICAgeyByZXR1cm4gJlN1YnRhcmdldDsgfQorCisgICAgdmlydHVhbCBjb25zdCBUYXJnZXREYXRhICpnZXRUYXJnZXREYXRhKCkgY29uc3QKKyAgICB7IHJldHVybiAmRGF0YUxheW91dDt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IE1CbGF6ZVJlZ2lzdGVySW5mbyAqZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QKKyAgICB7IHJldHVybiAmSW5zdHJJbmZvLmdldFJlZ2lzdGVySW5mbygpOyB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IE1CbGF6ZVRhcmdldExvd2VyaW5nICpnZXRUYXJnZXRMb3dlcmluZygpIGNvbnN0CisgICAgeyByZXR1cm4gJlRMSW5mbzsgfQorCisgICAgdmlydHVhbCBjb25zdCBNQmxhemVTZWxlY3Rpb25EQUdJbmZvKiBnZXRTZWxlY3Rpb25EQUdJbmZvKCkgY29uc3QKKyAgICB7IHJldHVybiAmVFNJbmZvOyB9CisKKyAgICBjb25zdCBUYXJnZXRJbnRyaW5zaWNJbmZvICpnZXRJbnRyaW5zaWNJbmZvKCkgY29uc3QKKyAgICB7IHJldHVybiAmSW50cmluc2ljSW5mbzsgfQorCisgICAgLy8gUGFzcyBQaXBlbGluZSBDb25maWd1cmF0aW9uCisgICAgdmlydHVhbCBib29sIGFkZEluc3RTZWxlY3RvcihQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworCisgICAgdmlydHVhbCBib29sIGFkZFByZUVtaXRQYXNzKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKyAgfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplVGFyZ2V0T2JqZWN0RmlsZS5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVUYXJnZXRPYmplY3RGaWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWMwMWVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTUJsYXplVGFyZ2V0T2JqZWN0RmlsZS5jcHAKQEAgLTAsMCArMSw4OSBAQAorLy89PT0tLSBNQmxhemVUYXJnZXRPYmplY3RGaWxlLmNwcCAtIE1CbGF6ZSBvYmplY3QgZmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1CbGF6ZVRhcmdldE9iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJNQmxhemVTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uRUxGLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCit2b2lkIE1CbGF6ZVRhcmdldE9iamVjdEZpbGU6OgorSW5pdGlhbGl6ZShNQ0NvbnRleHQgJkN0eCwgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIHsKKyAgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlRUxGOjpJbml0aWFsaXplKEN0eCwgVE0pOworCisgIFNtYWxsRGF0YVNlY3Rpb24gPQorICAgIGdldENvbnRleHQoKS5nZXRFTEZTZWN0aW9uKCIuc2RhdGEiLCBNQ1NlY3Rpb25FTEY6OlNIVF9QUk9HQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlNIRl9XUklURSB8TUNTZWN0aW9uRUxGOjpTSEZfQUxMT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQ6OmdldERhdGFSZWwoKSk7CisKKyAgU21hbGxCU1NTZWN0aW9uID0KKyAgICBnZXRDb250ZXh0KCkuZ2V0RUxGU2VjdGlvbigiLnNic3MiLCBNQ1NlY3Rpb25FTEY6OlNIVF9OT0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfV1JJVEUgfE1DU2VjdGlvbkVMRjo6U0hGX0FMTE9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kOjpnZXRCU1MoKSk7CisKK30KKworLy8gQSBhZGRyZXNzIG11c3QgYmUgbG9hZGVkIGZyb20gYSBzbWFsbCBzZWN0aW9uIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiB0aGUKKy8vIHNtYWxsIHNlY3Rpb24gc2l6ZSB0aHJlc2hvbGQuIERhdGEgaW4gdGhpcyBzZWN0aW9uIG11c3QgYmUgYWRkcmVzc2VkIHVzaW5nCisvLyBncF9yZWwgb3BlcmF0b3IuCitzdGF0aWMgYm9vbCBJc0luU21hbGxTZWN0aW9uKHVpbnQ2NF90IFNpemUpIHsKKyAgcmV0dXJuIFNpemUgPiAwICYmIFNpemUgPD0gODsKK30KKworYm9vbCBNQmxhemVUYXJnZXRPYmplY3RGaWxlOjoKK0lzR2xvYmFsSW5TbWFsbFNlY3Rpb24oY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3QgeworICBpZiAoR1YtPmlzRGVjbGFyYXRpb24oKSB8fCBHVi0+aGFzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIElzR2xvYmFsSW5TbWFsbFNlY3Rpb24oR1YsIFRNLCBnZXRLaW5kRm9yR2xvYmFsKEdWLCBUTSkpOworfQorCisvLy8gSXNHbG9iYWxJblNtYWxsU2VjdGlvbiAtIFJldHVybiB0cnVlIGlmIHRoaXMgZ2xvYmFsIGFkZHJlc3Mgc2hvdWxkIGJlCisvLy8gcGxhY2VkIGludG8gc21hbGwgZGF0YS9ic3Mgc2VjdGlvbi4KK2Jvb2wgTUJsYXplVGFyZ2V0T2JqZWN0RmlsZTo6CitJc0dsb2JhbEluU21hbGxTZWN0aW9uKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kIEtpbmQpIGNvbnN0IHsKKyAgLy8gT25seSBnbG9iYWwgdmFyaWFibGVzLCBub3QgZnVuY3Rpb25zLgorICBjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1ZBID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KEdWKTsKKyAgaWYgKCFHVkEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFdlIGNhbiBvbmx5IGRvIHRoaXMgZm9yIGRhdGFyZWwgb3IgQlNTIG9iamVjdHMgZm9yIG5vdy4KKyAgaWYgKCFLaW5kLmlzQlNTKCkgJiYgIUtpbmQuaXNEYXRhUmVsKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHRoaXMgaXMgYSBpbnRlcm5hbCBjb25zdGFudCBzdHJpbmcsIHRoZXJlIGlzIGEgc3BlY2lhbAorICAvLyBzZWN0aW9uIGZvciBpdCwgYnV0IG5vdCBpbiBzbWFsbCBkYXRhL2Jzcy4KKyAgaWYgKEtpbmQuaXNNZXJnZWFibGUxQnl0ZUNTdHJpbmcoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgVHlwZSAqVHkgPSBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpOworICByZXR1cm4gSXNJblNtYWxsU2VjdGlvbihUTS5nZXRUYXJnZXREYXRhKCktPmdldFR5cGVBbGxvY1NpemUoVHkpKTsKK30KKworY29uc3QgTUNTZWN0aW9uICpNQmxhemVUYXJnZXRPYmplY3RGaWxlOjoKK1NlbGVjdFNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICBNYW5nbGVyICpNYW5nLCBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3QgeworICAvLyBUT0RPOiBDb3VsZCBhbHNvIHN1cHBvcnQgIndlYWsiIHN5bWJvbHMgYXMgd2VsbCB3aXRoICIuZ251LmxpbmtvbmNlLnMuKiIKKyAgLy8gc2VjdGlvbnM/CisKKyAgLy8gSGFuZGxlIFNtYWxsIFNlY3Rpb24gY2xhc3NpZmljYXRpb24gaGVyZS4KKyAgaWYgKEtpbmQuaXNCU1MoKSAmJiBJc0dsb2JhbEluU21hbGxTZWN0aW9uKEdWLCBUTSwgS2luZCkpCisgICAgcmV0dXJuIFNtYWxsQlNTU2VjdGlvbjsKKyAgaWYgKEtpbmQuaXNEYXRhTm9SZWwoKSAmJiBJc0dsb2JhbEluU21hbGxTZWN0aW9uKEdWLCBUTSwgS2luZCkpCisgICAgcmV0dXJuIFNtYWxsRGF0YVNlY3Rpb247CisKKyAgLy8gT3RoZXJ3aXNlLCB3ZSB3b3JrIHRoZSBzYW1lIGFzIEVMRi4KKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRjo6U2VsZWN0U2VjdGlvbkZvckdsb2JhbChHViwgS2luZCwgTWFuZyxUTSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVUYXJnZXRPYmplY3RGaWxlLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9NQmxhemVUYXJnZXRPYmplY3RGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlNzcwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01CbGF6ZVRhcmdldE9iamVjdEZpbGUuaApAQCAtMCwwICsxLDQxIEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L01CbGF6ZVRhcmdldE9iamVjdEZpbGUuaCAtIE1CbGF6ZSBPYmouIEluZm8gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX01CTEFaRV9UQVJHRVRPQkpFQ1RGSUxFX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfTUJMQVpFX1RBUkdFVE9CSkVDVEZJTEVfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZUltcGwuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIE1CbGF6ZVRhcmdldE9iamVjdEZpbGUgOiBwdWJsaWMgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlRUxGIHsKKyAgICBjb25zdCBNQ1NlY3Rpb24gKlNtYWxsRGF0YVNlY3Rpb247CisgICAgY29uc3QgTUNTZWN0aW9uICpTbWFsbEJTU1NlY3Rpb247CisgIHB1YmxpYzoKKyAgICAKKyAgICB2b2lkIEluaXRpYWxpemUoTUNDb250ZXh0ICZDdHgsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKKworICAgIAorICAgIC8vLyBJc0dsb2JhbEluU21hbGxTZWN0aW9uIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBnbG9iYWwgYWRkcmVzcyBzaG91bGQgYmUKKyAgICAvLy8gcGxhY2VkIGludG8gc21hbGwgZGF0YS9ic3Mgc2VjdGlvbi4KKyAgICBib29sIElzR2xvYmFsSW5TbWFsbFNlY3Rpb24oY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQgS2luZCkgY29uc3Q7CisKKyAgICBib29sIElzR2xvYmFsSW5TbWFsbFNlY3Rpb24oY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Q7ICAKKyAgICAKKyAgICBjb25zdCBNQ1NlY3Rpb24gKlNlbGVjdFNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5nbGVyICpNYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Q7CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllNTA4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L01CbGF6ZS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCitMRVZFTCA9IC4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1NQmxhemVDb2RlR2VuCitUQVJHRVQgPSBNQmxhemUKKworIyBNYWtlIHN1cmUgdGhhdCB0YmxnZW4gaXMgcnVuLCBmaXJzdCB0aGluZy4KK0JVSUxUX1NPVVJDRVMgPSBNQmxhemVHZW5SZWdpc3RlckluZm8uaC5pbmMgTUJsYXplR2VuUmVnaXN0ZXJOYW1lcy5pbmMgXAorICAgICAgICAgICAgICAgIE1CbGF6ZUdlblJlZ2lzdGVySW5mby5pbmMgTUJsYXplR2VuSW5zdHJOYW1lcy5pbmMgXAorICAgICAgICAgICAgICAgIE1CbGF6ZUdlbkluc3RySW5mby5pbmMgTUJsYXplR2VuQXNtV3JpdGVyLmluYyBcCisgICAgICAgICAgICAgICAgTUJsYXplR2VuREFHSVNlbC5pbmMgTUJsYXplR2VuQ2FsbGluZ0NvbnYuaW5jIFwKKyAgICAgICAgICAgICAgICBNQmxhemVHZW5TdWJ0YXJnZXQuaW5jIE1CbGF6ZUdlbkludHJpbnNpY3MuaW5jCisKK0RJUlMgPSBBc21QcmludGVyIFRhcmdldEluZm8KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmYjE0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw3IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uICkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNTUJsYXplSW5mbworICBNQmxhemVUYXJnZXRJbmZvLmNwcAorICApCisKK2FkZF9kZXBlbmRlbmNpZXMoTExWTU1CbGF6ZUluZm8gTUJsYXplQ29kZUdlblRhYmxlX2dlbikKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL1RhcmdldEluZm8vTUJsYXplVGFyZ2V0SW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9UYXJnZXRJbmZvL01CbGF6ZVRhcmdldEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTAxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01CbGF6ZS9UYXJnZXRJbmZvL01CbGF6ZVRhcmdldEluZm8uY3BwCkBAIC0wLDAgKzEsMTkgQEAKKy8vPT09LS0gTUJsYXplVGFyZ2V0SW5mby5jcHAgLSBNQmxhemUgVGFyZ2V0IEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJNQmxhemUuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGFyZ2V0IGxsdm06OlRoZU1CbGF6ZVRhcmdldDsKKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplTUJsYXplVGFyZ2V0SW5mbygpIHsKKyAgUmVnaXN0ZXJUYXJnZXQ8VHJpcGxlOjptYmxhemU+IFgoVGhlTUJsYXplVGFyZ2V0LCAibWJsYXplIiwgIk1CbGF6ZSIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NQmxhemUvVGFyZ2V0SW5mby9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL1RhcmdldEluZm8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3ZWExMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTUJsYXplL1RhcmdldEluZm8vTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvTUJsYXplL1RhcmdldEluZm8vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTU1CbGF6ZUluZm8KKworIyBIYWNrOiB3ZSBuZWVkIHRvIGluY2x1ZGUgJ21haW4nIHRhcmdldCBkaXJlY3RvcnkgdG8gZ3JhYiBwcml2YXRlIGhlYWRlcnMKK0NQUEZMQUdTID0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNJTC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNJTC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWQ0N2VmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU0lML0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMyBAQAorYWRkX2xsdm1fdGFyZ2V0KE1TSUwKKyAgTVNJTFdyaXRlci5jcHAKKyAgKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU0lML01TSUxXcml0ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU0lML01TSUxXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzUwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvTVNJTFdyaXRlci5jcHAKQEAgLTAsMCArMSwxNzA2IEBACisvLz09PS0tIE1TSUxXcml0ZXIuY3BwIC0gTGlicmFyeSBmb3IgY29udmVydGluZyBMTFZNIGNvZGUgdG8gTVNJTCAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgbGlicmFyeSBjb252ZXJ0cyBMTFZNIGNvZGUgdG8gTVNJTCBjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJNU0lMV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9UeXBlU3ltYm9sVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NvbnN0YW50c1NjYW5uZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9JbnN0VmlzaXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgLy8gVGFyZ2V0TWFjaGluZSBmb3IgdGhlIE1TSUwgCisgIHN0cnVjdCBNU0lMVGFyZ2V0IDogcHVibGljIFRhcmdldE1hY2hpbmUgeworICAgIE1TSUxUYXJnZXQoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsIGNvbnN0IHN0ZDo6c3RyaW5nICZGUykKKyAgICAgIDogVGFyZ2V0TWFjaGluZShUKSB7fQorCisgICAgdmlydHVhbCBib29sIGFkZFBhc3Nlc1RvRW1pdEZpbGUoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRmlsZVR5cGUgRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlVmVyaWZ5KTsKKworICAgIHZpcnR1YWwgY29uc3QgVGFyZ2V0RGF0YSAqZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgfTsKK30KKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplTVNJTFRhcmdldCgpIHsKKyAgLy8gUmVnaXN0ZXIgdGhlIHRhcmdldC4KKyAgUmVnaXN0ZXJUYXJnZXRNYWNoaW5lPE1TSUxUYXJnZXQ+IFgoVGhlTVNJTFRhcmdldCk7Cit9CisKK2Jvb2wgTVNJTE1vZHVsZTo6cnVuT25Nb2R1bGUoTW9kdWxlICZNKSB7CisgIE1vZHVsZVB0ciA9ICZNOworICBURCA9ICZnZXRBbmFseXNpczxUYXJnZXREYXRhPigpOworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgLy8gRmluZCBuYW1lZCB0eXBlcy4gIAorICBUeXBlU3ltYm9sVGFibGUmIFRhYmxlID0gTS5nZXRUeXBlU3ltYm9sVGFibGUoKTsKKyAgc3RkOjpzZXQ8Y29uc3QgVHlwZSAqPiBUeXBlcyA9IGdldEFuYWx5c2lzPEZpbmRVc2VkVHlwZXM+KCkuZ2V0VHlwZXMoKTsKKyAgZm9yIChUeXBlU3ltYm9sVGFibGU6Oml0ZXJhdG9yIEkgPSBUYWJsZS5iZWdpbigpLCBFID0gVGFibGUuZW5kKCk7IEkhPUU7ICkgeworICAgIGlmICghSS0+c2Vjb25kLT5pc1N0cnVjdFR5KCkgJiYgIUktPnNlY29uZC0+aXNPcGFxdWVUeSgpKQorICAgICAgVGFibGUucmVtb3ZlKEkrKyk7CisgICAgZWxzZSB7CisgICAgICBzdGQ6OnNldDxjb25zdCBUeXBlICo+OjppdGVyYXRvciBUID0gVHlwZXMuZmluZChJLT5zZWNvbmQpOworICAgICAgaWYgKFQ9PVR5cGVzLmVuZCgpKQorICAgICAgICBUYWJsZS5yZW1vdmUoSSsrKTsKKyAgICAgIGVsc2UgeworICAgICAgICBUeXBlcy5lcmFzZShUKTsKKyAgICAgICAgKytJOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBGaW5kIHVubmFtZWQgdHlwZXMuCisgIHVuc2lnbmVkIFJlbmFtZUNvdW50ZXIgPSAwOworICBmb3IgKHN0ZDo6c2V0PGNvbnN0IFR5cGUgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBUeXBlcy5iZWdpbigpLAorICAgICAgIEUgPSBUeXBlcy5lbmQoKTsgSSE9RTsgKytJKQorICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPigqSSkpIHsKKyAgICAgIHdoaWxlIChNb2R1bGVQdHItPmFkZFR5cGVOYW1lKCJ1bm5hbWVkJCIrdXRvc3RyKFJlbmFtZUNvdW50ZXIpLCBTVHkpKQorICAgICAgICArK1JlbmFtZUNvdW50ZXI7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgIC8vIFBvaW50ZXIgZm9yIEZ1bmN0aW9uUGFzcy4KKyAgVXNlZFR5cGVzID0gJmdldEFuYWx5c2lzPEZpbmRVc2VkVHlwZXM+KCkuZ2V0VHlwZXMoKTsKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2NoYXIgTVNJTE1vZHVsZTo6SUQgPSAwOworY2hhciBNU0lMV3JpdGVyOjpJRCA9IDA7CisKK2Jvb2wgTVNJTFdyaXRlcjo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICBpZiAoRi5pc0RlY2xhcmF0aW9uKCkpIHJldHVybiBmYWxzZTsKKworICAvLyBEbyBub3QgY29kZWdlbiBhbnkgJ2F2YWlsYWJsZV9leHRlcm5hbGx5JyBmdW5jdGlvbnMgYXQgYWxsLCB0aGV5IGhhdmUKKyAgLy8gZGVmaW5pdGlvbnMgb3V0c2lkZSB0aGUgdHJhbnNsYXRpb24gdW5pdC4KKyAgaWYgKEYuaGFzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgTEluZm8gPSAmZ2V0QW5hbHlzaXM8TG9vcEluZm8+KCk7CisgIHByaW50RnVuY3Rpb24oRik7CisgIHJldHVybiBmYWxzZTsKK30KKworCitib29sIE1TSUxXcml0ZXI6OmRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKSB7CisgIE1vZHVsZVB0ciA9ICZNOworICBPdXQgPDwgIi5hc3NlbWJseSBleHRlcm4gbXNjb3JsaWIge31cbiI7CisgIE91dCA8PCAiLmFzc2VtYmx5IE1TSUwge31cblxuIjsKKyAgT3V0IDw8ICIvLyBFeHRlcm5hbFxuIjsKKyAgcHJpbnRFeHRlcm5hbHMoKTsKKyAgT3V0IDw8ICIvLyBEZWNsYXJhdGlvbnNcbiI7CisgIHByaW50RGVjbGFyYXRpb25zKE0uZ2V0VHlwZVN5bWJvbFRhYmxlKCkpOworICBPdXQgPDwgIi8vIERlZmluaXRpb25zXG4iOworICBwcmludEdsb2JhbFZhcmlhYmxlcygpOworICBPdXQgPDwgIi8vIFN0YXJ0dXAgY29kZVxuIjsKKyAgcHJpbnRNb2R1bGVTdGFydHVwKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworCitib29sIE1TSUxXcml0ZXI6OmRvRmluYWxpemF0aW9uKE1vZHVsZSAmTSkgeworICByZXR1cm4gZmFsc2U7Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludE1vZHVsZVN0YXJ0dXAoKSB7CisgIE91dCA8PAorICAiLm1ldGhvZCBzdGF0aWMgcHVibGljIGludDMyICRNU0lMX1N0YXJ0dXAoKSB7XG4iCisgICJcdC5lbnRyeXBvaW50XG4iCisgICJcdC5sb2NhbHMgKG5hdGl2ZSBpbnQgaSlcbiIKKyAgIlx0LmxvY2FscyAobmF0aXZlIGludCBhcmdjKVxuIgorICAiXHQubG9jYWxzIChuYXRpdmUgaW50IHB0cilcbiIKKyAgIlx0LmxvY2FscyAodm9pZCogYXJndilcbiIKKyAgIlx0LmxvY2FscyAoc3RyaW5nW10gYXJncylcbiIKKyAgIlx0Y2FsbFx0c3RyaW5nW10gW21zY29ybGliXVN5c3RlbS5FbnZpcm9ubWVudDo6R2V0Q29tbWFuZExpbmVBcmdzKClcbiIKKyAgIlx0ZHVwXG4iCisgICJcdHN0bG9jXHRhcmdzXG4iCisgICJcdGxkbGVuXG4iCisgICJcdGNvbnYuaTRcbiIKKyAgIlx0ZHVwXG4iCisgICJcdHN0bG9jXHRhcmdjXG4iOworICBwcmludFB0ckxvYWQoVEQtPmdldFBvaW50ZXJTaXplKCkpOworICBPdXQgPDwKKyAgIlx0bXVsXG4iCisgICJcdGxvY2FsbG9jXG4iCisgICJcdHN0bG9jXHRhcmd2XG4iCisgICJcdGxkYy5pNC4wXG4iCisgICJcdHN0bG9jXHRpXG4iCisgICJMXzAxOlxuIgorICAiXHRsZGxvY1x0aVxuIgorICAiXHRsZGxvY1x0YXJnY1xuIgorICAiXHRjZXFcbiIKKyAgIlx0YnJ0cnVlXHRMXzAyXG4iCisgICJcdGxkbG9jXHRhcmdzXG4iCisgICJcdGxkbG9jXHRpXG4iCisgICJcdGxkZWxlbS5yZWZcbiIKKyAgIlx0Y2FsbFx0bmF0aXZlIGludCBbbXNjb3JsaWJdU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLk1hcnNoYWw6OiIKKyAgICAgICAgICAgIlN0cmluZ1RvSEdsb2JhbEFuc2koc3RyaW5nKVxuIgorICAiXHRzdGxvY1x0cHRyXG4iCisgICJcdGxkbG9jXHRhcmd2XG4iCisgICJcdGxkbG9jXHRpXG4iOworICBwcmludFB0ckxvYWQoVEQtPmdldFBvaW50ZXJTaXplKCkpOworICBPdXQgPDwgCisgICJcdG11bFxuIgorICAiXHRhZGRcbiIKKyAgIlx0bGRsb2NcdHB0clxuIgorICAiXHRzdGluZC5pXG4iCisgICJcdGxkbG9jXHRpXG4iCisgICJcdGxkYy5pNC4xXG4iCisgICJcdGFkZFxuIgorICAiXHRzdGxvY1x0aVxuIgorICAiXHRiclx0TF8wMVxuIgorICAiTF8wMjpcbiIKKyAgIlx0Y2FsbCB2b2lkICRNU0lMX0luaXQoKVxuIjsKKworICAvLyBDYWxsIHVzZXIgJ21haW4nIGZ1bmN0aW9uLgorICBjb25zdCBGdW5jdGlvbiogRiA9IE1vZHVsZVB0ci0+Z2V0RnVuY3Rpb24oIm1haW4iKTsKKyAgaWYgKCFGIHx8IEYtPmlzRGVjbGFyYXRpb24oKSkgeworICAgIE91dCA8PCAiXHRsZGMuaTQuMFxuXHRyZXRcbn1cbiI7CisgICAgcmV0dXJuOworICB9CisgIGJvb2wgQmFkU2lnID0gdHJ1ZTsKKyAgc3RkOjpzdHJpbmcgQXJncygiIik7CisgIEZ1bmN0aW9uOjpjb25zdF9hcmdfaXRlcmF0b3IgQXJnMSxBcmcyOworCisgIHN3aXRjaCAoRi0+YXJnX3NpemUoKSkgeworICBjYXNlIDA6CisgICAgQmFkU2lnID0gZmFsc2U7CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICBBcmcxID0gRi0+YXJnX2JlZ2luKCk7CisgICAgaWYgKEFyZzEtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkgeworICAgICAgT3V0IDw8ICJcdGxkbG9jXHRhcmdjXG4iOworICAgICAgQXJncyA9IGdldFR5cGVOYW1lKEFyZzEtPmdldFR5cGUoKSk7CisgICAgICBCYWRTaWcgPSBmYWxzZTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBBcmcxID0gQXJnMiA9IEYtPmFyZ19iZWdpbigpOyArK0FyZzI7CisgICAgaWYgKEFyZzEtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSAmJiAKKyAgICAgICAgQXJnMi0+Z2V0VHlwZSgpLT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpQb2ludGVyVHlJRCkgeworICAgICAgT3V0IDw8ICJcdGxkbG9jXHRhcmdjXG5cdGxkbG9jXHRhcmd2XG4iOworICAgICAgQXJncyA9IGdldFR5cGVOYW1lKEFyZzEtPmdldFR5cGUoKSkrIiwiK2dldFR5cGVOYW1lKEFyZzItPmdldFR5cGUoKSk7CisgICAgICBCYWRTaWcgPSBmYWxzZTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgQmFkU2lnID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgUmV0Vm9pZCA9IChGLT5nZXRSZXR1cm5UeXBlKCktPmdldFR5cGVJRCgpID09IFR5cGU6OlZvaWRUeUlEKTsKKyAgaWYgKEJhZFNpZyB8fCAoIUYtPmdldFJldHVyblR5cGUoKS0+aXNJbnRlZ2VyVHkoKSAmJiAhUmV0Vm9pZCkpIHsKKyAgICBPdXQgPDwgIlx0bGRjLmk0LjBcbiI7CisgIH0gZWxzZSB7CisgICAgT3V0IDw8ICJcdGNhbGxcdCIgPDwgZ2V0VHlwZU5hbWUoRi0+Z2V0UmV0dXJuVHlwZSgpKSA8PAorICAgICAgZ2V0Q29udk1vZG9wdChGLT5nZXRDYWxsaW5nQ29udigpKSA8PCAibWFpbigiIDw8IEFyZ3MgPDwgIilcbiI7CisgICAgaWYgKFJldFZvaWQpCisgICAgICBPdXQgPDwgIlx0bGRjLmk0LjBcbiI7CisgICAgZWxzZQorICAgICAgT3V0IDw8ICJcdGNvbnYuaTRcbiI7CisgIH0KKyAgT3V0IDw8ICJcdHJldFxufVxuIjsKK30KKworYm9vbCBNU0lMV3JpdGVyOjppc1plcm9WYWx1ZShjb25zdCBWYWx1ZSogVikgeworICBpZiAoY29uc3QgQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgcmV0dXJuIEMtPmlzTnVsbFZhbHVlKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworCitzdGQ6OnN0cmluZyBNU0lMV3JpdGVyOjpnZXRWYWx1ZU5hbWUoY29uc3QgVmFsdWUqIFYpIHsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgaWYgKGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhbHVlPihWKSkKKyAgICBOYW1lID0gR1YtPmdldE5hbWUoKTsKKyAgZWxzZSB7CisgICAgdW5zaWduZWQgJk5vID0gQW5vblZhbHVlTnVtYmVyc1tWXTsKKyAgICBpZiAoTm8gPT0gMCkgTm8gPSArK05leHRBbm9uVmFsdWVOdW1iZXI7CisgICAgTmFtZSA9ICJ0bXAiICsgdXRvc3RyKE5vKTsKKyAgfQorICAKKyAgLy8gTmFtZSBpbnRvIHRoZSBxdW90ZXMgYWxsb3cgY29udHJvbCBhbmQgc3BhY2UgY2hhcmFjdGVycy4KKyAgcmV0dXJuICInIitOYW1lKyInIjsKK30KKworCitzdGQ6OnN0cmluZyBNU0lMV3JpdGVyOjpnZXRMYWJlbE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIE5hbWUpIHsKKyAgaWYgKE5hbWUuZmluZCgnLicpIT1zdGQ6OnN0cmluZzo6bnBvcykgeworICAgIHN0ZDo6c3RyaW5nIFRtcChOYW1lKTsKKyAgICAvLyBSZXBsYWNlIHVuYWNjZXBhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGxhYmVsIG5hbWUuCisgICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgSSA9IFRtcC5iZWdpbigpLCBFID0gVG1wLmVuZCgpOyBJIT1FOyArK0kpCisgICAgICBpZiAoKkk9PScuJykgKkkgPSAnQCc7CisgICAgcmV0dXJuIFRtcDsKKyAgfQorICByZXR1cm4gTmFtZTsKK30KKworCitzdGQ6OnN0cmluZyBNU0lMV3JpdGVyOjpnZXRMYWJlbE5hbWUoY29uc3QgVmFsdWUqIFYpIHsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgaWYgKGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhbHVlPihWKSkKKyAgICBOYW1lID0gR1YtPmdldE5hbWUoKTsKKyAgZWxzZSB7CisgICAgdW5zaWduZWQgJk5vID0gQW5vblZhbHVlTnVtYmVyc1tWXTsKKyAgICBpZiAoTm8gPT0gMCkgTm8gPSArK05leHRBbm9uVmFsdWVOdW1iZXI7CisgICAgTmFtZSA9ICJ0bXAiICsgdXRvc3RyKE5vKTsKKyAgfQorICAKKyAgcmV0dXJuIGdldExhYmVsTmFtZShOYW1lKTsKK30KKworCitzdGQ6OnN0cmluZyBNU0lMV3JpdGVyOjpnZXRDb252TW9kb3B0KENhbGxpbmdDb252OjpJRCBDYWxsaW5nQ29udklEKSB7CisgIHN3aXRjaCAoQ2FsbGluZ0NvbnZJRCkgeworICBjYXNlIENhbGxpbmdDb252OjpDOgorICBjYXNlIENhbGxpbmdDb252OjpDb2xkOgorICBjYXNlIENhbGxpbmdDb252OjpGYXN0OgorICAgIHJldHVybiAibW9kb3B0KFttc2NvcmxpYl1TeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzLkNhbGxDb252Q2RlY2wpICI7CisgIGNhc2UgQ2FsbGluZ0NvbnY6Olg4Nl9GYXN0Q2FsbDoKKyAgICByZXR1cm4gIm1vZG9wdChbbXNjb3JsaWJdU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcy5DYWxsQ29udkZhc3RjYWxsKSAiOworICBjYXNlIENhbGxpbmdDb252OjpYODZfU3RkQ2FsbDoKKyAgICByZXR1cm4gIm1vZG9wdChbbXNjb3JsaWJdU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcy5DYWxsQ29udlN0ZGNhbGwpICI7CisgIGNhc2UgQ2FsbGluZ0NvbnY6Olg4Nl9UaGlzQ2FsbDoKKyAgICByZXR1cm4gIm1vZG9wdChbbXNjb3JsaWJdU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcy5DYWxsQ29udlRoaXNjYWxsKSAiOworICBkZWZhdWx0OgorICAgIGVycnMoKSA8PCAiQ2FsbGluZ0NvbnZJRCA9ICIgPDwgQ2FsbGluZ0NvbnZJRCA8PCAnXG4nOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIGNhbGxpbmcgY29udmVudGlvbiIpOworICB9CisgIHJldHVybiAiIjsgLy8gTm90IHJlYWNoZWQKK30KKworCitzdGQ6OnN0cmluZyBNU0lMV3JpdGVyOjpnZXRBcnJheVR5cGVOYW1lKFR5cGU6OlR5cGVJRCBUeUlELCBjb25zdCBUeXBlKiBUeSkgeworICBzdGQ6OnN0cmluZyBUbXAgPSAiIjsKKyAgY29uc3QgVHlwZSogRWxlbVR5ID0gVHk7CisgIGFzc2VydChUeS0+Z2V0VHlwZUlEKCk9PVR5SUQgJiYgIkludmFsaWQgdHlwZSBwYXNzZWQiKTsKKyAgLy8gV2FsayB0cm91Z2h0IGFycmF5IGVsZW1lbnQgdHlwZXMuCisgIGZvciAoOzspIHsKKyAgICAvLyBNdWx0aWRpbWVuc2lvbmFsIGFycmF5LgorICAgIGlmIChFbGVtVHktPmdldFR5cGVJRCgpPT1UeUlEKSB7CisgICAgICBpZiAoY29uc3QgQXJyYXlUeXBlKiBBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KEVsZW1UeSkpCisgICAgICAgIFRtcCArPSB1dG9zdHIoQVR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgICAgIGVsc2UgaWYgKGNvbnN0IFZlY3RvclR5cGUqIFZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KEVsZW1UeSkpCisgICAgICAgIFRtcCArPSB1dG9zdHIoVlR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgICAgIEVsZW1UeSA9IGNhc3Q8U2VxdWVudGlhbFR5cGU+KEVsZW1UeSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgfQorICAgIC8vIEJhc2UgZWxlbWVudCB0eXBlIGZvdW5kLgorICAgIGlmIChFbGVtVHktPmdldFR5cGVJRCgpIT1UeUlEKSBicmVhazsKKyAgICBUbXAgKz0gIiwiOworICB9CisgIHJldHVybiBnZXRUeXBlTmFtZShFbGVtVHksIGZhbHNlLCB0cnVlKSsiWyIrVG1wKyJdIjsKK30KKworCitzdGQ6OnN0cmluZyBNU0lMV3JpdGVyOjpnZXRQcmltaXRpdmVUeXBlTmFtZShjb25zdCBUeXBlKiBUeSwgYm9vbCBpc1NpZ25lZCkgeworICB1bnNpZ25lZCBOdW1CaXRzID0gMDsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgY2FzZSBUeXBlOjpWb2lkVHlJRDoKKyAgICByZXR1cm4gInZvaWQgIjsKKyAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgICBOdW1CaXRzID0gZ2V0Qml0V2lkdGgoVHkpOworICAgIGlmKE51bUJpdHM9PTEpCisgICAgICByZXR1cm4gImJvb2wgIjsKKyAgICBpZiAoIWlzU2lnbmVkKQorICAgICAgcmV0dXJuICJ1bnNpZ25lZCBpbnQiK3V0b3N0cihOdW1CaXRzKSsiICI7CisgICAgcmV0dXJuICJpbnQiK3V0b3N0cihOdW1CaXRzKSsiICI7CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOgorICAgIHJldHVybiAiZmxvYXQzMiAiOworICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6CisgICAgcmV0dXJuICJmbG9hdDY0ICI7IAorICBkZWZhdWx0OgorICAgIGVycnMoKSA8PCAiVHlwZSA9ICIgPDwgKlR5IDw8ICdcbic7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBwcmltaXRpdmUgdHlwZSIpOworICB9CisgIHJldHVybiAiIjsgLy8gTm90IHJlYWNoZWQKK30KKworCitzdGQ6OnN0cmluZyBNU0lMV3JpdGVyOjpnZXRUeXBlTmFtZShjb25zdCBUeXBlKiBUeSwgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOZXN0ZWQpIHsKKyAgaWYgKFR5LT5pc1ByaW1pdGl2ZVR5cGUoKSB8fCBUeS0+aXNJbnRlZ2VyVHkoKSkKKyAgICByZXR1cm4gZ2V0UHJpbWl0aXZlVHlwZU5hbWUoVHksaXNTaWduZWQpOworICAvLyBGSVhNRTogIk9wYXF1ZVR5cGUiIHN1cHBvcnQKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICByZXR1cm4gInZvaWQqICI7CisgIGNhc2UgVHlwZTo6U3RydWN0VHlJRDoKKyAgICBpZiAoaXNOZXN0ZWQpCisgICAgICByZXR1cm4gTW9kdWxlUHRyLT5nZXRUeXBlTmFtZShUeSk7CisgICAgcmV0dXJuICJ2YWx1ZXR5cGUgJyIrTW9kdWxlUHRyLT5nZXRUeXBlTmFtZShUeSkrIicgIjsKKyAgY2FzZSBUeXBlOjpBcnJheVR5SUQ6CisgICAgaWYgKGlzTmVzdGVkKQorICAgICAgcmV0dXJuIGdldEFycmF5VHlwZU5hbWUoVHktPmdldFR5cGVJRCgpLFR5KTsKKyAgICByZXR1cm4gInZhbHVldHlwZSAnIitnZXRBcnJheVR5cGVOYW1lKFR5LT5nZXRUeXBlSUQoKSxUeSkrIicgIjsKKyAgY2FzZSBUeXBlOjpWZWN0b3JUeUlEOgorICAgIGlmIChpc05lc3RlZCkKKyAgICAgIHJldHVybiBnZXRBcnJheVR5cGVOYW1lKFR5LT5nZXRUeXBlSUQoKSxUeSk7CisgICAgcmV0dXJuICJ2YWx1ZXR5cGUgJyIrZ2V0QXJyYXlUeXBlTmFtZShUeS0+Z2V0VHlwZUlEKCksVHkpKyInICI7CisgIGRlZmF1bHQ6CisgICAgZXJycygpIDw8ICJUeXBlID0gIiA8PCAqVHkgPDwgJ1xuJzsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHR5cGUgaW4gZ2V0VHlwZU5hbWUoKSIpOworICB9CisgIHJldHVybiAiIjsgLy8gTm90IHJlYWNoZWQKK30KKworCitNU0lMV3JpdGVyOjpWYWx1ZVR5cGUgTVNJTFdyaXRlcjo6Z2V0VmFsdWVMb2NhdGlvbihjb25zdCBWYWx1ZSogVikgeworICAvLyBGdW5jdGlvbiBhcmd1bWVudAorICBpZiAoaXNhPEFyZ3VtZW50PihWKSkKKyAgICByZXR1cm4gQXJndW1lbnRWVDsKKyAgLy8gRnVuY3Rpb24KKyAgZWxzZSBpZiAoY29uc3QgRnVuY3Rpb24qIEYgPSBkeW5fY2FzdDxGdW5jdGlvbj4oVikpCisgICAgcmV0dXJuIEYtPmhhc0xvY2FsTGlua2FnZSgpID8gSW50ZXJuYWxWVCA6IEdsb2JhbFZUOworICAvLyBWYXJpYWJsZQorICBlbHNlIGlmIChjb25zdCBHbG9iYWxWYXJpYWJsZSogRyA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihWKSkKKyAgICByZXR1cm4gRy0+aGFzTG9jYWxMaW5rYWdlKCkgPyBJbnRlcm5hbFZUIDogR2xvYmFsVlQ7CisgIC8vIENvbnN0YW50CisgIGVsc2UgaWYgKGlzYTxDb25zdGFudD4oVikpCisgICAgcmV0dXJuIGlzYTxDb25zdGFudEV4cHI+KFYpID8gQ29uc3RFeHByVlQgOiBDb25zdFZUOworICAvLyBMb2NhbCB2YXJpYWJsZQorICByZXR1cm4gTG9jYWxWVDsKK30KKworCitzdGQ6OnN0cmluZyBNU0lMV3JpdGVyOjpnZXRUeXBlUG9zdGZpeChjb25zdCBUeXBlKiBUeSwgYm9vbCBFeHBhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSB7CisgIHVuc2lnbmVkIE51bUJpdHMgPSAwOworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICAvLyBJbnRlZ2VyIGNvbnN0YW50LCBleHBhbmRpbmcgZm9yIHN0YWNrIG9wZXJhdGlvbnMuCisgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6CisgICAgTnVtQml0cyA9IGdldEJpdFdpZHRoKFR5KTsKKyAgICAvLyBFeHBhbmQgaW50ZWdlciB2YWx1ZSB0byAiaW50MzIiIG9yICJpbnQ2NCIuCisgICAgaWYgKEV4cGFuZCkgcmV0dXJuIChOdW1CaXRzPD0zMiA/ICJpNCIgOiAiaTgiKTsKKyAgICBpZiAoTnVtQml0cz09MSkgcmV0dXJuICJpMSI7CisgICAgcmV0dXJuIChpc1NpZ25lZCA/ICJpIiA6ICJ1IikrdXRvc3RyKE51bUJpdHMvOCk7CisgIC8vIEZsb2F0IGNvbnN0YW50LgorICBjYXNlIFR5cGU6OkZsb2F0VHlJRDoKKyAgICByZXR1cm4gInI0IjsKKyAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOgorICAgIHJldHVybiAicjgiOworICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOgorICAgIHJldHVybiAiaSIrdXRvc3RyKFRELT5nZXRUeXBlQWxsb2NTaXplKFR5KSk7CisgIGRlZmF1bHQ6CisgICAgZXJycygpIDw8ICJUeXBlSUQgPSAiIDw8IFR5LT5nZXRUeXBlSUQoKSA8PCAnXG4nOworICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgdHlwZSBpbiBUeXBlVG9Qb3N0Zml4KCkiKTsKKyAgfQorICByZXR1cm4gIiI7IC8vIE5vdCByZWFjaGVkCit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludENvbnZUb1B0cigpIHsKKyAgc3dpdGNoIChNb2R1bGVQdHItPmdldFBvaW50ZXJTaXplKCkpIHsKKyAgY2FzZSBNb2R1bGU6OlBvaW50ZXIzMjoKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJjb252LnU0Iik7CisgICAgYnJlYWs7CisgIGNhc2UgTW9kdWxlOjpQb2ludGVyNjQ6CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigiY29udi51OCIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIk1vZHVsZSB1c2Ugbm90IHN1cHBvcnRpbmcgcG9pbnRlciBzaXplIik7CisgIH0KK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50UHRyTG9hZCh1aW50NjRfdCBOKSB7CisgIHN3aXRjaCAoTW9kdWxlUHRyLT5nZXRQb2ludGVyU2l6ZSgpKSB7CisgIGNhc2UgTW9kdWxlOjpQb2ludGVyMzI6CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigibGRjLmk0Iix1dG9zdHIoTikuY19zdHIoKSk7CisgICAgLy8gRklYTUU6IE5lZWQgb3ZlcmZsb3cgdGVzdD8KKyAgICBpZiAoIWlzVUludDwzMj4oTikpIHsKKyAgICAgIGVycnMoKSA8PCAiVmFsdWUgPSAiIDw8IHV0b3N0cihOKSA8PCAnXG4nOworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiMzItYml0IHBvaW50ZXIgb3ZlcmZsb3dlZCIpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBNb2R1bGU6OlBvaW50ZXI2NDoKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJsZGMuaTgiLHV0b3N0cihOKS5jX3N0cigpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJNb2R1bGUgdXNlIG5vdCBzdXBwb3J0aW5nIHBvaW50ZXIgc2l6ZSIpOworICB9Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludFZhbHVlUHRyTG9hZChjb25zdCBWYWx1ZSogVikgeworICBwcmludFZhbHVlTG9hZChWKTsKKyAgcHJpbnRDb252VG9QdHIoKTsKK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50Q29uc3RMb2FkKGNvbnN0IENvbnN0YW50KiBDKSB7CisgIGlmIChjb25zdCBDb25zdGFudEludCogQ0ludCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDKSkgeworICAgIC8vIEludGVnZXIgY29uc3RhbnQKKyAgICBPdXQgPDwgIlx0bGRjLiIgPDwgZ2V0VHlwZVBvc3RmaXgoQy0+Z2V0VHlwZSgpLHRydWUpIDw8ICdcdCc7CisgICAgaWYgKENJbnQtPmlzTWluVmFsdWUodHJ1ZSkpCisgICAgICBPdXQgPDwgQ0ludC0+Z2V0U0V4dFZhbHVlKCk7CisgICAgZWxzZQorICAgICAgT3V0IDw8IENJbnQtPmdldFpFeHRWYWx1ZSgpOworICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50RlAqIEZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oQykpIHsKKyAgICAvLyBGbG9hdCBjb25zdGFudAorICAgIHVpbnQ2NF90IFg7CisgICAgdW5zaWduZWQgU2l6ZTsKKyAgICBpZiAoRlAtPmdldFR5cGUoKS0+Z2V0VHlwZUlEKCk9PVR5cGU6OkZsb2F0VHlJRCkgeworICAgICAgWCA9ICh1aW50MzJfdClGUC0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpLmdldFpFeHRWYWx1ZSgpOworICAgICAgU2l6ZSA9IDQ7ICAKKyAgICB9IGVsc2UgeworICAgICAgWCA9IEZQLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCkuZ2V0WkV4dFZhbHVlKCk7CisgICAgICBTaXplID0gODsgIAorICAgIH0KKyAgICBPdXQgPDwgIlx0bGRjLnIiIDw8IFNpemUgPDwgIlx0KCAiIDw8IHV0b2hleHN0cihYKSA8PCAnKSc7CisgIH0gZWxzZSBpZiAoaXNhPFVuZGVmVmFsdWU+KEMpKSB7CisgICAgLy8gVW5kZWZpbmVkIGNvbnN0YW50IHZhbHVlID0gTlVMTC4KKyAgICBwcmludFB0ckxvYWQoMCk7CisgIH0gZWxzZSB7CisgICAgZXJycygpIDw8ICJDb25zdGFudCA9ICIgPDwgKkMgPDwgJ1xuJzsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGNvbnN0YW50IHZhbHVlIik7CisgIH0KKyAgT3V0IDw8ICdcbic7Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludFZhbHVlTG9hZChjb25zdCBWYWx1ZSogVikgeworICBNU0lMV3JpdGVyOjpWYWx1ZVR5cGUgTG9jYXRpb24gPSBnZXRWYWx1ZUxvY2F0aW9uKFYpOworICBzd2l0Y2ggKExvY2F0aW9uKSB7CisgIC8vIEdsb2JhbCB2YXJpYWJsZSBvciBmdW5jdGlvbiBhZGRyZXNzLgorICBjYXNlIEdsb2JhbFZUOgorICBjYXNlIEludGVybmFsVlQ6CisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uKiBGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KFYpKSB7CisgICAgICBzdGQ6OnN0cmluZyBOYW1lID0gZ2V0Q29udk1vZG9wdChGLT5nZXRDYWxsaW5nQ29udigpKStnZXRWYWx1ZU5hbWUoRik7CisgICAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJsZGZ0biIsCisgICAgICAgIGdldENhbGxTaWduYXR1cmUoRi0+Z2V0RnVuY3Rpb25UeXBlKCksTlVMTCxOYW1lKS5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpzdHJpbmcgVG1wOworICAgICAgY29uc3QgVHlwZSogRWxlbVR5ID0gY2FzdDxQb2ludGVyVHlwZT4oVi0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgIGlmIChMb2NhdGlvbj09R2xvYmFsVlQgJiYgY2FzdDxHbG9iYWxWYXJpYWJsZT4oViktPmhhc0RMTEltcG9ydExpbmthZ2UoKSkgeworICAgICAgICBUbXAgPSAidm9pZCogIitnZXRWYWx1ZU5hbWUoVik7CisgICAgICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImxkc2ZsZCIsVG1wLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVG1wID0gZ2V0VHlwZU5hbWUoRWxlbVR5KStnZXRWYWx1ZU5hbWUoVik7CisgICAgICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImxkc2ZsZGEiLFRtcC5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIC8vIEZ1bmN0aW9uIGFyZ3VtZW50LgorICBjYXNlIEFyZ3VtZW50VlQ6CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigibGRhcmciLGdldFZhbHVlTmFtZShWKS5jX3N0cigpKTsKKyAgICBicmVhazsKKyAgLy8gTG9jYWwgZnVuY3Rpb24gdmFyaWFibGUuCisgIGNhc2UgTG9jYWxWVDoKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJsZGxvYyIsZ2V0VmFsdWVOYW1lKFYpLmNfc3RyKCkpOworICAgIGJyZWFrOworICAvLyBDb25zdGFudCB2YWx1ZS4KKyAgY2FzZSBDb25zdFZUOgorICAgIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oVikpCisgICAgICBwcmludFB0ckxvYWQoMCk7CisgICAgZWxzZQorICAgICAgcHJpbnRDb25zdExvYWQoY2FzdDxDb25zdGFudD4oVikpOworICAgIGJyZWFrOworICAvLyBDb25zdGFudCBleHByZXNzaW9uLgorICBjYXNlIENvbnN0RXhwclZUOgorICAgIHByaW50Q29uc3RhbnRFeHByKGNhc3Q8Q29uc3RhbnRFeHByPihWKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZXJycygpIDw8ICJWYWx1ZSA9ICIgPDwgKlYgPDwgJ1xuJzsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHZhbHVlIGxvY2F0aW9uIik7CisgIH0KK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50VmFsdWVTYXZlKGNvbnN0IFZhbHVlKiBWKSB7CisgIHN3aXRjaCAoZ2V0VmFsdWVMb2NhdGlvbihWKSkgeworICBjYXNlIEFyZ3VtZW50VlQ6CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigic3RhcmciLGdldFZhbHVlTmFtZShWKS5jX3N0cigpKTsKKyAgICBicmVhazsKKyAgY2FzZSBMb2NhbFZUOgorICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oInN0bG9jIixnZXRWYWx1ZU5hbWUoVikuY19zdHIoKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZXJycygpIDw8ICJWYWx1ZSAgPSAiIDw8ICpWIDw8ICdcbic7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCB2YWx1ZSBsb2NhdGlvbiIpOworICB9Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludEJpbmFyeUluc3RydWN0aW9uKGNvbnN0IGNoYXIqIE5hbWUsIGNvbnN0IFZhbHVlKiBMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlKiBSaWdodCkgeworICBwcmludFZhbHVlTG9hZChMZWZ0KTsKKyAgcHJpbnRWYWx1ZUxvYWQoUmlnaHQpOworICBPdXQgPDwgJ1x0JyA8PCBOYW1lIDw8ICdcbic7Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludFNpbXBsZUluc3RydWN0aW9uKGNvbnN0IGNoYXIqIEluc3QsIGNvbnN0IGNoYXIqIE9wZXJhbmQpIHsKKyAgaWYoT3BlcmFuZCkgCisgICAgT3V0IDw8ICdcdCcgPDwgSW5zdCA8PCAnXHQnIDw8IE9wZXJhbmQgPDwgJ1xuJzsKKyAgZWxzZQorICAgIE91dCA8PCAnXHQnIDw8IEluc3QgPDwgJ1xuJzsKK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50UEhJQ29weShjb25zdCBCYXNpY0Jsb2NrKiBTcmMsIGNvbnN0IEJhc2ljQmxvY2sqIERzdCkgeworICBmb3IgKEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBEc3QtPmJlZ2luKCk7IGlzYTxQSElOb2RlPihJKTsgKytJKSB7CisgICAgY29uc3QgUEhJTm9kZSogUGhpID0gY2FzdDxQSElOb2RlPihJKTsKKyAgICBjb25zdCBWYWx1ZSogVmFsID0gUGhpLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soU3JjKTsKKyAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KFZhbCkpIGNvbnRpbnVlOworICAgIHByaW50VmFsdWVMb2FkKFZhbCk7CisgICAgcHJpbnRWYWx1ZVNhdmUoUGhpKTsKKyAgfQorfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRCcmFuY2hUb0Jsb2NrKGNvbnN0IEJhc2ljQmxvY2sqIEN1cnJCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2ljQmxvY2sqIFRydWVCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2ljQmxvY2sqIEZhbHNlQkIpIHsKKyAgaWYgKFRydWVCQj09RmFsc2VCQikgeworICAgIC8vICJUcnVlQkIiIGFuZCAiRmFsc2VCQiIgZGVzdGluYXRpb24gZXF1YWxzCisgICAgcHJpbnRQSElDb3B5KEN1cnJCQixUcnVlQkIpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oInBvcCIpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImJyIixnZXRMYWJlbE5hbWUoVHJ1ZUJCKS5jX3N0cigpKTsKKyAgfSBlbHNlIGlmIChGYWxzZUJCPT1OVUxMKSB7CisgICAgLy8gSWYgIkZhbHNlQkIiIG5vdCB1c2VkIHRoZSBqdW1wIGhhdmUgY29uZGl0aW9uCisgICAgcHJpbnRQSElDb3B5KEN1cnJCQixUcnVlQkIpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImJydHJ1ZSIsZ2V0TGFiZWxOYW1lKFRydWVCQikuY19zdHIoKSk7CisgIH0gZWxzZSBpZiAoVHJ1ZUJCPT1OVUxMKSB7CisgICAgLy8gSWYgIlRydWVCQiIgbm90IHVzZWQgdGhlIGp1bXAgaXMgdW5jb25kaXRpb25hbAorICAgIHByaW50UEhJQ29weShDdXJyQkIsRmFsc2VCQik7CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigiYnIiLGdldExhYmVsTmFtZShGYWxzZUJCKS5jX3N0cigpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBDb3B5IFBISSBpbnN0cnVjdGlvbnMgZm9yIGVhY2ggYmxvY2sKKyAgICBzdGQ6OnN0cmluZyBUbXBMYWJlbDsKKyAgICAvLyBQcmludCBQSEkgaW5zdHJ1Y3Rpb25zIGZvciAiVHJ1ZUJCIgorICAgIGlmIChpc2E8UEhJTm9kZT4oVHJ1ZUJCLT5iZWdpbigpKSkgeworICAgICAgVG1wTGFiZWwgPSBnZXRMYWJlbE5hbWUoVHJ1ZUJCKSsiJHBoaV8iK3V0b3N0cihnZXRVbmlxSUQoKSk7CisgICAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJicnRydWUiLFRtcExhYmVsLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJicnRydWUiLGdldExhYmVsTmFtZShUcnVlQkIpLmNfc3RyKCkpOworICAgIH0KKyAgICAvLyBQcmludCBQSEkgaW5zdHJ1Y3Rpb25zIGZvciAiRmFsc2VCQiIKKyAgICBpZiAoaXNhPFBISU5vZGU+KEZhbHNlQkItPmJlZ2luKCkpKSB7CisgICAgICBwcmludFBISUNvcHkoQ3VyckJCLEZhbHNlQkIpOworICAgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigiYnIiLGdldExhYmVsTmFtZShGYWxzZUJCKS5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigiYnIiLGdldExhYmVsTmFtZShGYWxzZUJCKS5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKGlzYTxQSElOb2RlPihUcnVlQkItPmJlZ2luKCkpKSB7CisgICAgICAvLyBIYW5kbGUgIlRydWVCQiIgUEhJIENvcHkKKyAgICAgIE91dCA8PCBUbXBMYWJlbCA8PCAiOlxuIjsKKyAgICAgIHByaW50UEhJQ29weShDdXJyQkIsVHJ1ZUJCKTsKKyAgICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImJyIixnZXRMYWJlbE5hbWUoVHJ1ZUJCKS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50QnJhbmNoSW5zdHJ1Y3Rpb24oY29uc3QgQnJhbmNoSW5zdCogSW5zdCkgeworICBpZiAoSW5zdC0+aXNVbmNvbmRpdGlvbmFsKCkpIHsKKyAgICBwcmludEJyYW5jaFRvQmxvY2soSW5zdC0+Z2V0UGFyZW50KCksTlVMTCxJbnN0LT5nZXRTdWNjZXNzb3IoMCkpOworICB9IGVsc2UgeworICAgIHByaW50VmFsdWVMb2FkKEluc3QtPmdldENvbmRpdGlvbigpKTsKKyAgICBwcmludEJyYW5jaFRvQmxvY2soSW5zdC0+Z2V0UGFyZW50KCksSW5zdC0+Z2V0U3VjY2Vzc29yKDApLAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0LT5nZXRTdWNjZXNzb3IoMSkpOworICB9Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludFNlbGVjdEluc3RydWN0aW9uKGNvbnN0IFZhbHVlKiBDb25kLCBjb25zdCBWYWx1ZSogVlRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUqIFZGYWxzZSkgeworICBzdGQ6OnN0cmluZyBUbXBMYWJlbCA9IHN0ZDo6c3RyaW5nKCJzZWxlY3QkdHJ1ZV8iKSt1dG9zdHIoZ2V0VW5pcUlEKCkpOworICBwcmludFZhbHVlTG9hZChWVHJ1ZSk7CisgIHByaW50VmFsdWVMb2FkKENvbmQpOworICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJicnRydWUiLFRtcExhYmVsLmNfc3RyKCkpOworICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJwb3AiKTsKKyAgcHJpbnRWYWx1ZUxvYWQoVkZhbHNlKTsKKyAgT3V0IDw8IFRtcExhYmVsIDw8ICI6XG4iOworfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRJbmRpcmVjdExvYWQoY29uc3QgVmFsdWUqIFYpIHsKKyAgY29uc3QgVHlwZSogVHkgPSBWLT5nZXRUeXBlKCk7CisgIHByaW50VmFsdWVMb2FkKFYpOworICBpZiAoY29uc3QgUG9pbnRlclR5cGUqIFAgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oVHkpKQorICAgIFR5ID0gUC0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgc3RkOjpzdHJpbmcgVG1wID0gImxkaW5kLiIrZ2V0VHlwZVBvc3RmaXgoVHksIGZhbHNlKTsKKyAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbihUbXAuY19zdHIoKSk7Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludEluZGlyZWN0U2F2ZShjb25zdCBWYWx1ZSogUHRyLCBjb25zdCBWYWx1ZSogVmFsKSB7CisgIHByaW50VmFsdWVMb2FkKFB0cik7CisgIHByaW50VmFsdWVMb2FkKFZhbCk7CisgIHByaW50SW5kaXJlY3RTYXZlKFZhbC0+Z2V0VHlwZSgpKTsKK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50SW5kaXJlY3RTYXZlKGNvbnN0IFR5cGUqIFR5KSB7CisgIC8vIEluc3RydWN0aW9uIG5lZWQgc2lnbmVkIHBvc3RmaXggZm9yIGFueSB0eXBlLgorICBzdGQ6OnN0cmluZyBwb3N0Zml4ID0gZ2V0VHlwZVBvc3RmaXgoVHksIGZhbHNlKTsKKyAgaWYgKCpwb3N0Zml4LmJlZ2luKCk9PSd1JykgKnBvc3RmaXguYmVnaW4oKSA9ICdpJzsKKyAgcG9zdGZpeCA9ICJzdGluZC4iK3Bvc3RmaXg7CisgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24ocG9zdGZpeC5jX3N0cigpKTsKK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50Q2FzdEluc3RydWN0aW9uKHVuc2lnbmVkIGludCBPcCwgY29uc3QgVmFsdWUqIFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUqIFR5LCBjb25zdCBUeXBlKiBTcmNUeSkgeworICBzdGQ6OnN0cmluZyBUbXAoIiIpOworICBwcmludFZhbHVlTG9hZChWKTsKKyAgc3dpdGNoIChPcCkgeworICAvLyBTaWduZWQKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDoKKyAgICAvLyBJZiBzaWduIGV4dGVuZGluZyBpbnQsIGNvbnZlcnQgZmlyc3QgZnJvbSB1bnNpZ25lZCB0byBzaWduZWQKKyAgICAvLyB3aXRoIHRoZSBzYW1lIGJpdCBzaXplIC0gYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd2lsbCBsb29zZSB0aGUgc2lnbi4KKyAgICBpZiAoU3JjVHkpIHsKKyAgICAgIFRtcCA9ICJjb252LiIrZ2V0VHlwZVBvc3RmaXgoU3JjVHksZmFsc2UsdHJ1ZSk7CisgICAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKFRtcC5jX3N0cigpKTsKKyAgICB9CisgICAgLy8gRkFMTFRIUk9VR0gKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICBjYXNlIEluc3RydWN0aW9uOjpGUFRvU0k6CisgICAgVG1wID0gImNvbnYuIitnZXRUeXBlUG9zdGZpeChUeSxmYWxzZSx0cnVlKTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKFRtcC5jX3N0cigpKTsKKyAgICBicmVhazsKKyAgLy8gVW5zaWduZWQKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlpFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9VSToKKyAgY2FzZSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOgorICAgIFRtcCA9ICJjb252LiIrZ2V0VHlwZVBvc3RmaXgoVHksZmFsc2UpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oVG1wLmNfc3RyKCkpOworICAgIGJyZWFrOworICAvLyBEbyBub3RoaW5nCisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6CisgICAgLy8gRklYTUU6IG1lYW5pbmcgdGhhdCBsZCovc3QqIGluc3RydWN0aW9uIGRvIG5vdCBjaGFuZ2UgZGF0YSBmb3JtYXQuCisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZXJycygpIDw8ICJPcGNvZGUgPSAiIDw8IE9wIDw8ICdcbic7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBjb252ZXJzaW9uIGluc3RydWN0aW9uIik7CisgIH0KK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50R2VwSW5zdHJ1Y3Rpb24oY29uc3QgVmFsdWUqIFYsIGdlcF90eXBlX2l0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VwX3R5cGVfaXRlcmF0b3IgRSkgeworICB1bnNpZ25lZCBTaXplOworICAvLyBMb2FkIGFkZHJlc3MKKyAgcHJpbnRWYWx1ZVB0ckxvYWQoVik7CisgIC8vIENhbGN1bGF0ZSBlbGVtZW50IG9mZnNldC4KKyAgZm9yICg7IEkhPUU7ICsrSSl7CisgICAgU2l6ZSA9IDA7CisgICAgY29uc3QgVmFsdWUqIEluZGV4VmFsdWUgPSBJLmdldE9wZXJhbmQoKTsKKyAgICBpZiAoY29uc3QgU3RydWN0VHlwZSogU3RydWNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KCpJKSkgeworICAgICAgdWludDY0X3QgRmllbGRJbmRleCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEluZGV4VmFsdWUpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIC8vIE9mZnNldCBpcyB0aGUgc3VtIG9mIGFsbCBwcmV2aW91cyBzdHJ1Y3R1cmUgZmllbGRzLgorICAgICAgZm9yICh1aW50NjRfdCBGID0gMDsgRjxGaWVsZEluZGV4OyArK0YpCisgICAgICAgIFNpemUgKz0gVEQtPmdldFR5cGVBbGxvY1NpemUoU3RydWNUeS0+Z2V0Q29udGFpbmVkVHlwZSgodW5zaWduZWQpRikpOworICAgICAgcHJpbnRQdHJMb2FkKFNpemUpOworICAgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigiYWRkIik7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0IFNlcXVlbnRpYWxUeXBlKiBTZXFUeSA9IGR5bl9jYXN0PFNlcXVlbnRpYWxUeXBlPigqSSkpIHsKKyAgICAgIFNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShTZXFUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZSgqSSk7CisgICAgfQorICAgIC8vIEFkZCBvZmZzZXQgb2YgY3VycmVudCBlbGVtZW50IHRvIHN0YWNrIHRvcC4KKyAgICBpZiAoIWlzWmVyb1ZhbHVlKEluZGV4VmFsdWUpKSB7CisgICAgICAvLyBDb25zdGFudCBvcHRpbWl6YXRpb24uCisgICAgICBpZiAoY29uc3QgQ29uc3RhbnRJbnQqIEMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSW5kZXhWYWx1ZSkpIHsKKyAgICAgICAgaWYgKEMtPmdldFZhbHVlKCkuaXNOZWdhdGl2ZSgpKSB7CisgICAgICAgICAgcHJpbnRQdHJMb2FkKEMtPmdldFZhbHVlKCkuYWJzKCkuZ2V0WkV4dFZhbHVlKCkqU2l6ZSk7CisgICAgICAgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigic3ViIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHByaW50UHRyTG9hZChDLT5nZXRaRXh0VmFsdWUoKSpTaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50UHRyTG9hZChTaXplKTsKKyAgICAgICAgcHJpbnRWYWx1ZVB0ckxvYWQoSW5kZXhWYWx1ZSk7CisgICAgICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm11bCIpOworICAgICAgfQorICAgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigiYWRkIik7CisgICAgfQorICB9Cit9CisKKworc3RkOjpzdHJpbmcgTVNJTFdyaXRlcjo6Z2V0Q2FsbFNpZ25hdHVyZShjb25zdCBGdW5jdGlvblR5cGUqIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiogSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgTmFtZSkgeworICBzdGQ6OnN0cmluZyBUbXAoIiIpOworICBpZiAoVHktPmlzVmFyQXJnKCkpIFRtcCArPSAidmFyYXJnICI7CisgIC8vIE5hbWUgYW5kIHJldHVybiB0eXBlLgorICBUbXAgKz0gZ2V0VHlwZU5hbWUoVHktPmdldFJldHVyblR5cGUoKSkrTmFtZSsiKCI7CisgIC8vIEZ1bmN0aW9uIGFyZ3VtZW50IHR5cGUgbGlzdC4KKyAgdW5zaWduZWQgTnVtUGFyYW1zID0gVHktPmdldE51bVBhcmFtcygpOworICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIT1OdW1QYXJhbXM7ICsrSSkgeworICAgIGlmIChJIT0wKSBUbXAgKz0gIiwiOworICAgIFRtcCArPSBnZXRUeXBlTmFtZShUeS0+Z2V0UGFyYW1UeXBlKEkpKTsKKyAgfQorICAvLyBDTFIgbmVlZHMgdG8ga25vdyB0aGUgZXhhY3QgYW1vdW50IG9mIHBhcmFtZXRlcnMgcmVjZWl2ZWQgYnkgdmFyYXJnCisgIC8vIGZ1bmN0aW9uLCBiZWNhdXNlIGNhbGxlciBjbGVhbnMgdGhlIHN0YWNrLgorICBpZiAoVHktPmlzVmFyQXJnKCkgJiYgSW5zdCkgeworICAgIC8vIE9yaWdpbiB0byBmdW5jdGlvbiBhcmd1bWVudHMgaW4gIkNhbGxJbnN0IiBvciAiSW52b2tlSW5zdCIuCisgICAgdW5zaWduZWQgT3JnID0gaXNhPEludm9rZUluc3Q+KEluc3QpID8gMyA6IDE7CisgICAgLy8gUHJpbnQgdmFyaWFibGUgYXJndW1lbnQgdHlwZXMuCisgICAgdW5zaWduZWQgTnVtT3BlcmFuZHMgPSBJbnN0LT5nZXROdW1PcGVyYW5kcygpLU9yZzsKKyAgICBpZiAoTnVtUGFyYW1zPE51bU9wZXJhbmRzKSB7CisgICAgICBpZiAoTnVtUGFyYW1zIT0wKSBUbXAgKz0gIiwgIjsKKyAgICAgIFRtcCArPSAiLi4uICwgIjsKKyAgICAgIGZvciAodW5zaWduZWQgSiA9IE51bVBhcmFtczsgSiE9TnVtT3BlcmFuZHM7ICsrSikgeworICAgICAgICBpZiAoSiE9TnVtUGFyYW1zKSBUbXAgKz0gIiwgIjsKKyAgICAgICAgVG1wICs9IGdldFR5cGVOYW1lKEluc3QtPmdldE9wZXJhbmQoSitPcmcpLT5nZXRUeXBlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gVG1wKyIpIjsKK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50RnVuY3Rpb25DYWxsKGNvbnN0IFZhbHVlKiBGblZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24qIEluc3QpIHsKKyAgLy8gR2V0IGZ1bmN0aW9uIGNhbGxpbmcgY29udmVudGlvbi4KKyAgc3RkOjpzdHJpbmcgTmFtZSA9ICIiOworICBpZiAoY29uc3QgQ2FsbEluc3QqIENhbGwgPSBkeW5fY2FzdDxDYWxsSW5zdD4oSW5zdCkpCisgICAgTmFtZSA9IGdldENvbnZNb2RvcHQoQ2FsbC0+Z2V0Q2FsbGluZ0NvbnYoKSk7CisgIGVsc2UgaWYgKGNvbnN0IEludm9rZUluc3QqIEludm9rZSA9IGR5bl9jYXN0PEludm9rZUluc3Q+KEluc3QpKQorICAgIE5hbWUgPSBnZXRDb252TW9kb3B0KEludm9rZS0+Z2V0Q2FsbGluZ0NvbnYoKSk7CisgIGVsc2UgeworICAgIGVycnMoKSA8PCAiSW5zdHJ1Y3Rpb24gPSAiIDw8IEluc3QtPmdldE5hbWUoKSA8PCAnXG4nOworICAgIGxsdm1fdW5yZWFjaGFibGUoIk5lZWQgXCJJbnZva2VcIiBvciBcIkNhbGxcIiBpbnN0cnVjdGlvbiBvbmx5Iik7CisgIH0KKyAgaWYgKGNvbnN0IEZ1bmN0aW9uKiBGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KEZuVmFsKSkgeworICAgIC8vIERpcmVjdCBjYWxsLgorICAgIE5hbWUgKz0gZ2V0VmFsdWVOYW1lKEYpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImNhbGwiLAorICAgICAgZ2V0Q2FsbFNpZ25hdHVyZShGLT5nZXRGdW5jdGlvblR5cGUoKSxJbnN0LE5hbWUpLmNfc3RyKCkpOworICB9IGVsc2UgeworICAgIC8vIEluZGlyZWN0IGZ1bmN0aW9uIGNhbGwuCisgICAgY29uc3QgUG9pbnRlclR5cGUqIFBUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KEZuVmFsLT5nZXRUeXBlKCkpOworICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSogRlR5ID0gY2FzdDxGdW5jdGlvblR5cGU+KFBUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgLy8gTG9hZCBmdW5jdGlvbiBhZGRyZXNzLgorICAgIHByaW50VmFsdWVMb2FkKEZuVmFsKTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJjYWxsaSIsZ2V0Q2FsbFNpZ25hdHVyZShGVHksSW5zdCxOYW1lKS5jX3N0cigpKTsKKyAgfQorfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRJbnRyaW5zaWNDYWxsKGNvbnN0IEludHJpbnNpY0luc3QqIEluc3QpIHsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgc3dpdGNoIChJbnN0LT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgIGNhc2UgSW50cmluc2ljOjp2YXN0YXJ0OgorICAgIE5hbWUgPSBnZXRWYWx1ZU5hbWUoSW5zdC0+Z2V0QXJnT3BlcmFuZCgwKSk7CisgICAgTmFtZS5pbnNlcnQoTmFtZS5sZW5ndGgoKS0xLCIkdmFsaXN0Iik7CisgICAgLy8gT2J0YWluIHRoZSBhcmd1bWVudCBoYW5kbGUuCisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigibGRsb2NhIixOYW1lLmNfc3RyKCkpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImFyZ2xpc3QiKTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJjYWxsIiwKKyAgICAgICJpbnN0YW5jZSB2b2lkIFttc2NvcmxpYl1TeXN0ZW0uQXJnSXRlcmF0b3I6Oi5jdG9yIgorICAgICAgIih2YWx1ZXR5cGUgW21zY29ybGliXVN5c3RlbS5SdW50aW1lQXJndW1lbnRIYW5kbGUpIik7CisgICAgLy8gU2F2ZSBhcyBwb2ludGVyIHR5cGUgInZvaWQqIgorICAgIHByaW50VmFsdWVMb2FkKEluc3QtPmdldEFyZ09wZXJhbmQoMCkpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImxkbG9jYSIsTmFtZS5jX3N0cigpKTsKKyAgICBwcmludEluZGlyZWN0U2F2ZShQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKAorICAgICAgICAgIEludGVnZXJUeXBlOjpnZXQoSW5zdC0+Z2V0Q29udGV4dCgpLCA4KSkpOworICAgIGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6dmFlbmQ6CisgICAgLy8gQ2xvc2UgYXJndW1lbnQgbGlzdCBoYW5kbGUuCisgICAgcHJpbnRJbmRpcmVjdExvYWQoSW5zdC0+Z2V0QXJnT3BlcmFuZCgwKSk7CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigiY2FsbCIsImluc3RhbmNlIHZvaWQgW21zY29ybGliXVN5c3RlbS5BcmdJdGVyYXRvcjo6RW5kKCkiKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnZhY29weToKKyAgICAvLyBDb3B5ICJBcmdJdGVyYXRvciIgdmFsdWV0eXBlLgorICAgIHByaW50SW5kaXJlY3RMb2FkKEluc3QtPmdldEFyZ09wZXJhbmQoMCkpOworICAgIHByaW50SW5kaXJlY3RMb2FkKEluc3QtPmdldEFyZ09wZXJhbmQoMSkpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImNwb2JqIiwiW21zY29ybGliXVN5c3RlbS5BcmdJdGVyYXRvciIpOworICAgIGJyZWFrOyAgICAgICAgCisgIGRlZmF1bHQ6CisgICAgZXJycygpIDw8ICJJbnRyaW5zaWMgSUQgPSAiIDw8IEluc3QtPmdldEludHJpbnNpY0lEKCkgPDwgJ1xuJzsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGludHJpbnNpYyBmdW5jdGlvbiIpOworICB9Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludENhbGxJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiogSW5zdCkgeworICBpZiAoaXNhPEludHJpbnNpY0luc3Q+KEluc3QpKSB7CisgICAgLy8gSGFuZGxlIGludHJpbnNpYyBmdW5jdGlvbi4KKyAgICBwcmludEludHJpbnNpY0NhbGwoY2FzdDxJbnRyaW5zaWNJbnN0PihJbnN0KSk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgQ2FsbEluc3QgKkNJID0gY2FzdDxDYWxsSW5zdD4oSW5zdCk7CisgICAgLy8gTG9hZCBhcmd1bWVudHMgdG8gc3RhY2sgYW5kIGNhbGwgZnVuY3Rpb24uCisgICAgZm9yIChpbnQgSSA9IDAsIEUgPSBDSS0+Z2V0TnVtQXJnT3BlcmFuZHMoKTsgSSE9RTsgKytJKQorICAgICAgcHJpbnRWYWx1ZUxvYWQoQ0ktPmdldEFyZ09wZXJhbmQoSSkpOworICAgIHByaW50RnVuY3Rpb25DYWxsKENJLT5nZXRDYWxsZWRGdW5jdGlvbigpLCBJbnN0KTsKKyAgfQorfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRJQ21wSW5zdHJ1Y3Rpb24odW5zaWduZWQgUHJlZGljYXRlLCBjb25zdCBWYWx1ZSogTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUqIFJpZ2h0KSB7CisgIHN3aXRjaCAoUHJlZGljYXRlKSB7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiY2VxIixMZWZ0LFJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORToKKyAgICAvLyBFbXVsYXRlID0gbm90IG5lZyAoT3AxIGVxIE9wMikKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjZXEiLExlZnQsUmlnaHQpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm5lZyIpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm5vdCIpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRToKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6CisgICAgLy8gRW11bGF0ZSA9IChPcDEgZXEgT3AyKSBvciAoT3AxIGx0IE9wMikKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjZXEiLExlZnQsUmlnaHQpOworICAgIGlmIChQcmVkaWNhdGU9PUlDbXBJbnN0OjpJQ01QX1VMRSkKKyAgICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNsdC51biIsTGVmdCxSaWdodCk7CisgICAgZWxzZQorICAgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiY2x0IixMZWZ0LFJpZ2h0KTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJvciIpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHRToKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR0U6CisgICAgLy8gRW11bGF0ZSA9IChPcDEgZXEgT3AyKSBvciAoT3AxIGd0IE9wMikKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjZXEiLExlZnQsUmlnaHQpOworICAgIGlmIChQcmVkaWNhdGU9PUlDbXBJbnN0OjpJQ01QX1VHRSkKKyAgICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNndC51biIsTGVmdCxSaWdodCk7CisgICAgZWxzZQorICAgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiY2d0IixMZWZ0LFJpZ2h0KTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJvciIpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDoKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjbHQudW4iLExlZnQsUmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDoKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjbHQiLExlZnQsUmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDoKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjZ3QudW4iLExlZnQsUmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHVDoKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjZ3QiLExlZnQsUmlnaHQpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGVycnMoKSA8PCAiUHJlZGljYXRlID0gIiA8PCBQcmVkaWNhdGUgPDwgJ1xuJzsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGljbXAgcHJlZGljYXRlIik7CisgIH0KK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50RkNtcEluc3RydWN0aW9uKHVuc2lnbmVkIFByZWRpY2F0ZSwgY29uc3QgVmFsdWUqIExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlKiBSaWdodCkgeworICAvLyBGSVhNRTogQ29ycmVjdCBjb21wYXJpc29uCisgIHN0ZDo6c3RyaW5nIE5hbkZ1bmMgPSAiYm9vbCBbbXNjb3JsaWJdU3lzdGVtLkRvdWJsZTo6SXNOYU4oZmxvYXQ2NCkiOworICBzd2l0Y2ggKFByZWRpY2F0ZSkgeworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHVDoKKyAgICAvLyBYID4gIFkgfHwgbGx2bV9mY21wX3VubyhYLCBZKQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNndCIsTGVmdCxSaWdodCk7CisgICAgcHJpbnRGQ21wSW5zdHJ1Y3Rpb24oRkNtcEluc3Q6OkZDTVBfVU5PLExlZnQsUmlnaHQpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm9yIik7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0dUOgorICAgIC8vIFggPiAgWQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNndCIsTGVmdCxSaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdFOgorICAgIC8vIFggPj0gWSB8fCBsbHZtX2ZjbXBfdW5vKFgsIFkpCisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiY2VxIixMZWZ0LFJpZ2h0KTsKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjZ3QiLExlZnQsUmlnaHQpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm9yIik7CisgICAgcHJpbnRGQ21wSW5zdHJ1Y3Rpb24oRkNtcEluc3Q6OkZDTVBfVU5PLExlZnQsUmlnaHQpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm9yIik7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0dFOgorICAgIC8vIFggPj0gWQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNlcSIsTGVmdCxSaWdodCk7CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiY2d0IixMZWZ0LFJpZ2h0KTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJvciIpOworICAgIGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMVDoKKyAgICAvLyBYIDwgIFkgfHwgbGx2bV9mY21wX3VubyhYLCBZKQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNsdCIsTGVmdCxSaWdodCk7CisgICAgcHJpbnRGQ21wSW5zdHJ1Y3Rpb24oRkNtcEluc3Q6OkZDTVBfVU5PLExlZnQsUmlnaHQpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm9yIik7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xUOgorICAgIC8vIFggPCAgWQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNsdCIsTGVmdCxSaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxFOgorICAgIC8vIFggPD0gWSB8fCBsbHZtX2ZjbXBfdW5vKFgsIFkpCisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiY2VxIixMZWZ0LFJpZ2h0KTsKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjbHQiLExlZnQsUmlnaHQpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm9yIik7CisgICAgcHJpbnRGQ21wSW5zdHJ1Y3Rpb24oRkNtcEluc3Q6OkZDTVBfVU5PLExlZnQsUmlnaHQpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm9yIik7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xFOgorICAgIC8vIFggPD0gWQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNlcSIsTGVmdCxSaWdodCk7CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiY2x0IixMZWZ0LFJpZ2h0KTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJvciIpOworICAgIGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VFUToKKyAgICAvLyBYID09IFkgfHwgbGx2bV9mY21wX3VubyhYLCBZKQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNlcSIsTGVmdCxSaWdodCk7CisgICAgcHJpbnRGQ21wSW5zdHJ1Y3Rpb24oRkNtcEluc3Q6OkZDTVBfVU5PLExlZnQsUmlnaHQpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIm9yIik7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0VROgorICAgIC8vIFggPT0gWQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNlcSIsTGVmdCxSaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5FOgorICAgIC8vIFggIT0gWQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNlcSIsTGVmdCxSaWdodCk7CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigibmVnIik7CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigibm90Iik7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT05FOgorICAgIC8vIFggIT0gWSAmJiBsbHZtX2ZjbXBfb3JkKFgsIFkpCisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiY2VxIixMZWZ0LFJpZ2h0KTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJub3QiKTsKKyAgICBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PUkQ6CisgICAgLy8gcmV0dXJuIFggPT0gWCAmJiBZID09IFkKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjZXEiLExlZnQsTGVmdCk7CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiY2VxIixSaWdodCxSaWdodCk7CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigib3IiKTsKKyAgICBicmVhazsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTk86CisgICAgLy8gWCAhPSBYIHx8IFkgIT0gWQorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImNlcSIsTGVmdCxMZWZ0KTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJub3QiKTsKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJjZXEiLFJpZ2h0LFJpZ2h0KTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJub3QiKTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJvciIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgRkNtcCBwcmVkaWNhdGUiKTsKKyAgfQorfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRJbnZva2VJbnN0cnVjdGlvbihjb25zdCBJbnZva2VJbnN0KiBJbnN0KSB7CisgIHN0ZDo6c3RyaW5nIExhYmVsID0gImxlYXZlJG5vcm1hbF8iK3V0b3N0cihnZXRVbmlxSUQoKSk7CisgIE91dCA8PCAiLnRyeSB7XG4iOworICAvLyBMb2FkIGFyZ3VtZW50cworICBmb3IgKGludCBJID0gMCwgRSA9IEluc3QtPmdldE51bUFyZ09wZXJhbmRzKCk7IEkhPUU7ICsrSSkKKyAgICBwcmludFZhbHVlTG9hZChJbnN0LT5nZXRBcmdPcGVyYW5kKEkpKTsKKyAgLy8gUHJpbnQgY2FsbCBpbnN0cnVjdGlvbgorICBwcmludEZ1bmN0aW9uQ2FsbChJbnN0LT5nZXRPcGVyYW5kKDApLEluc3QpOworICAvLyBTYXZlIGZ1bmN0aW9uIHJlc3VsdCBhbmQgbGVhdmUgInRyeSIgYmxvY2sKKyAgcHJpbnRWYWx1ZVNhdmUoSW5zdCk7CisgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImxlYXZlIixMYWJlbC5jX3N0cigpKTsKKyAgT3V0IDw8ICJ9XG4iOworICBPdXQgPDwgImNhdGNoIFttc2NvcmxpYl1TeXN0ZW0uRXhjZXB0aW9uIHtcbiI7CisgIC8vIFJlZGlyZWN0IHRvIHVud2luZCBibG9jaworICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJwb3AiKTsKKyAgcHJpbnRCcmFuY2hUb0Jsb2NrKEluc3QtPmdldFBhcmVudCgpLE5VTEwsSW5zdC0+Z2V0VW53aW5kRGVzdCgpKTsKKyAgT3V0IDw8ICJ9XG4iIDw8IExhYmVsIDw8ICI6XG4iOworICAvLyBSZWRpcmVjdCB0byBjb250aW51ZSBibG9jaworICBwcmludEJyYW5jaFRvQmxvY2soSW5zdC0+Z2V0UGFyZW50KCksTlVMTCxJbnN0LT5nZXROb3JtYWxEZXN0KCkpOworfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRTd2l0Y2hJbnN0cnVjdGlvbihjb25zdCBTd2l0Y2hJbnN0KiBJbnN0KSB7CisgIC8vIEZJWE1FOiBFbXVsYXRlIHdpdGggSUwgInN3aXRjaCIgaW5zdHJ1Y3Rpb24KKyAgLy8gRW11bGF0ZSA9IGlmICgpIGVsc2UgaWYgKCkgZWxzZSBpZiAoKSBlbHNlIC4uLgorICBmb3IgKHVuc2lnbmVkIGludCBJID0gMSwgRSA9IEluc3QtPmdldE51bUNhc2VzKCk7IEkhPUU7ICsrSSkgeworICAgIHByaW50VmFsdWVMb2FkKEluc3QtPmdldENvbmRpdGlvbigpKTsKKyAgICBwcmludFZhbHVlTG9hZChJbnN0LT5nZXRDYXNlVmFsdWUoSSkpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImNlcSIpOworICAgIC8vIENvbmRpdGlvbiBqdW1wIHRvIHN1Y2Nlc3NvciBibG9jaworICAgIHByaW50QnJhbmNoVG9CbG9jayhJbnN0LT5nZXRQYXJlbnQoKSxJbnN0LT5nZXRTdWNjZXNzb3IoSSksTlVMTCk7CisgIH0KKyAgLy8gSnVtcCB0byBkZWZhdWx0IGJsb2NrCisgIHByaW50QnJhbmNoVG9CbG9jayhJbnN0LT5nZXRQYXJlbnQoKSxOVUxMLEluc3QtPmdldERlZmF1bHREZXN0KCkpOworfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRWQUFyZ0luc3RydWN0aW9uKGNvbnN0IFZBQXJnSW5zdCogSW5zdCkgeworICBwcmludEluZGlyZWN0TG9hZChJbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigiY2FsbCIsCisgICAgImluc3RhbmNlIHR5cGVkcmVmIFttc2NvcmxpYl1TeXN0ZW0uQXJnSXRlcmF0b3I6OkdldE5leHRBcmcoKSIpOworICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJyZWZhbnl2YWwiLCJ2b2lkKiIpOworICBzdGQ6OnN0cmluZyBOYW1lID0gCisgICAgImxkaW5kLiIrZ2V0VHlwZVBvc3RmaXgoUG9pbnRlclR5cGU6OmdldFVucXVhbCgKKyAgICAgICAgICAgIEludGVnZXJUeXBlOjpnZXQoSW5zdC0+Z2V0Q29udGV4dCgpLCA4KSksZmFsc2UpOworICBwcmludFNpbXBsZUluc3RydWN0aW9uKE5hbWUuY19zdHIoKSk7Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludEFsbG9jYUluc3RydWN0aW9uKGNvbnN0IEFsbG9jYUluc3QqIEluc3QpIHsKKyAgdWludDY0X3QgU2l6ZSA9IFRELT5nZXRUeXBlQWxsb2NTaXplKEluc3QtPmdldEFsbG9jYXRlZFR5cGUoKSk7CisgIC8vIENvbnN0YW50IG9wdGltaXphdGlvbi4KKyAgaWYgKGNvbnN0IENvbnN0YW50SW50KiBDSW50ID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEluc3QtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgcHJpbnRQdHJMb2FkKENJbnQtPmdldFpFeHRWYWx1ZSgpKlNpemUpOworICB9IGVsc2UgeworICAgIHByaW50UHRyTG9hZChTaXplKTsKKyAgICBwcmludFZhbHVlTG9hZChJbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJtdWwiKTsKKyAgfQorICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJsb2NhbGxvYyIpOworfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiogSW5zdCkgeworICBjb25zdCBWYWx1ZSAqTGVmdCA9IDAsICpSaWdodCA9IDA7CisgIGlmIChJbnN0LT5nZXROdW1PcGVyYW5kcygpPj0xKSBMZWZ0ID0gSW5zdC0+Z2V0T3BlcmFuZCgwKTsKKyAgaWYgKEluc3QtPmdldE51bU9wZXJhbmRzKCk+PTIpIFJpZ2h0ID0gSW5zdC0+Z2V0T3BlcmFuZCgxKTsKKyAgLy8gUHJpbnQgaW5zdHJ1Y3Rpb24KKyAgLy8gRklYTUU6ICJTaHVmZmxlVmVjdG9yIiwiRXh0cmFjdEVsZW1lbnQiLCJJbnNlcnRFbGVtZW50IiBzdXBwb3J0LgorICBzd2l0Y2ggKEluc3QtPmdldE9wY29kZSgpKSB7CisgIC8vIFRlcm1pbmF0b3IKKyAgY2FzZSBJbnN0cnVjdGlvbjo6UmV0OgorICAgIGlmIChJbnN0LT5nZXROdW1PcGVyYW5kcygpKSB7CisgICAgICBwcmludFZhbHVlTG9hZChMZWZ0KTsKKyAgICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oInJldCIpOworICAgIH0gZWxzZQorICAgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigicmV0Iik7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJyOgorICAgIHByaW50QnJhbmNoSW5zdHJ1Y3Rpb24oY2FzdDxCcmFuY2hJbnN0PihJbnN0KSk7CisgICAgYnJlYWs7CisgIC8vIEJpbmFyeQorICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiYWRkIixMZWZ0LFJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICBjYXNlIEluc3RydWN0aW9uOjpGU3ViOgorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oInN1YiIsTGVmdCxSaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Rk11bDoKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJtdWwiLExlZnQsUmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImRpdi51biIsTGVmdCxSaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNEaXY6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZEaXY6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiZGl2IixMZWZ0LFJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbToKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJyZW0udW4iLExlZnQsUmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOgorICBjYXNlIEluc3RydWN0aW9uOjpGUmVtOgorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oInJlbSIsTGVmdCxSaWdodCk7CisgICAgYnJlYWs7CisgIC8vIEJpbmFyeSBDb25kaXRpb24KKyAgY2FzZSBJbnN0cnVjdGlvbjo6SUNtcDoKKyAgICBwcmludElDbXBJbnN0cnVjdGlvbihjYXN0PElDbXBJbnN0PihJbnN0KS0+Z2V0UHJlZGljYXRlKCksTGVmdCxSaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZDbXA6CisgICAgcHJpbnRGQ21wSW5zdHJ1Y3Rpb24oY2FzdDxGQ21wSW5zdD4oSW5zdCktPmdldFByZWRpY2F0ZSgpLExlZnQsUmlnaHQpOworICAgIGJyZWFrOworICAvLyBCaXR3aXNlIEJpbmFyeQorICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiYW5kIixMZWZ0LFJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigib3IiLExlZnQsUmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigieG9yIixMZWZ0LFJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgIHByaW50VmFsdWVMb2FkKExlZnQpOworICAgIHByaW50VmFsdWVMb2FkKFJpZ2h0KTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJjb252Lmk0Iik7CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigic2hsIik7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6CisgICAgcHJpbnRWYWx1ZUxvYWQoTGVmdCk7CisgICAgcHJpbnRWYWx1ZUxvYWQoUmlnaHQpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oImNvbnYuaTQiKTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJzaHIudW4iKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICBwcmludFZhbHVlTG9hZChMZWZ0KTsKKyAgICBwcmludFZhbHVlTG9hZChSaWdodCk7CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigiY29udi5pNCIpOworICAgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oInNociIpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6CisgICAgcHJpbnRTZWxlY3RJbnN0cnVjdGlvbihJbnN0LT5nZXRPcGVyYW5kKDApLEluc3QtPmdldE9wZXJhbmQoMSksSW5zdC0+Z2V0T3BlcmFuZCgyKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkxvYWQ6CisgICAgcHJpbnRJbmRpcmVjdExvYWQoSW5zdC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN0b3JlOgorICAgIHByaW50SW5kaXJlY3RTYXZlKEluc3QtPmdldE9wZXJhbmQoMSksIEluc3QtPmdldE9wZXJhbmQoMCkpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OgorICAgIHByaW50Q2FzdEluc3RydWN0aW9uKEluc3QtPmdldE9wY29kZSgpLExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDYXN0SW5zdD4oSW5zdCktPmdldERlc3RUeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q2FzdEluc3Q+KEluc3QpLT5nZXRTcmNUeSgpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlpFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVHJ1bmM6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQRXh0OgorICBjYXNlIEluc3RydWN0aW9uOjpVSVRvRlA6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNJVG9GUDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJOgorICBjYXNlIEluc3RydWN0aW9uOjpGUFRvU0k6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OgorICBjYXNlIEluc3RydWN0aW9uOjpJbnRUb1B0cjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICBwcmludENhc3RJbnN0cnVjdGlvbihJbnN0LT5nZXRPcGNvZGUoKSxMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q2FzdEluc3Q+KEluc3QpLT5nZXREZXN0VHkoKSk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHI6CisgICAgcHJpbnRHZXBJbnN0cnVjdGlvbihJbnN0LT5nZXRPcGVyYW5kKDApLGdlcF90eXBlX2JlZ2luKEluc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2VwX3R5cGVfZW5kKEluc3QpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Q2FsbDoKKyAgICBwcmludENhbGxJbnN0cnVjdGlvbihjYXN0PENhbGxJbnN0PihJbnN0KSk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246Okludm9rZToKKyAgICBwcmludEludm9rZUluc3RydWN0aW9uKGNhc3Q8SW52b2tlSW5zdD4oSW5zdCkpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpVbndpbmQ6CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigibmV3b2JqIiwKKyAgICAgICJpbnN0YW5jZSB2b2lkIFttc2NvcmxpYl1TeXN0ZW0uRXhjZXB0aW9uOjouY3RvcigpIik7CisgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbigidGhyb3ciKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3dpdGNoOgorICAgIHByaW50U3dpdGNoSW5zdHJ1Y3Rpb24oY2FzdDxTd2l0Y2hJbnN0PihJbnN0KSk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFsbG9jYToKKyAgICBwcmludEFsbG9jYUluc3RydWN0aW9uKGNhc3Q8QWxsb2NhSW5zdD4oSW5zdCkpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpVbnJlYWNoYWJsZToKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJsZHN0ciIsICJcIlVucmVhY2hhYmxlIGluc3RydWN0aW9uXCIiKTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJuZXdvYmoiLAorICAgICAgImluc3RhbmNlIHZvaWQgW21zY29ybGliXVN5c3RlbS5FeGNlcHRpb246Oi5jdG9yKHN0cmluZykiKTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJ0aHJvdyIpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpWQUFyZzoKKyAgICBwcmludFZBQXJnSW5zdHJ1Y3Rpb24oY2FzdDxWQUFyZ0luc3Q+KEluc3QpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBlcnJzKCkgPDwgIkluc3RydWN0aW9uID0gIiA8PCBJbnN0LT5nZXROYW1lKCkgPDwgJ1xuJzsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBpbnN0cnVjdGlvbiIpOworICB9Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludExvb3AoY29uc3QgTG9vcCogTCkgeworICBPdXQgPDwgZ2V0TGFiZWxOYW1lKEwtPmdldEhlYWRlcigpLT5nZXROYW1lKCkpIDw8ICI6XG4iOworICBjb25zdCBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4mIGJsb2NrcyA9IEwtPmdldEJsb2NrcygpOworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gYmxvY2tzLnNpemUoKTsgSSE9RTsgSSsrKSB7CisgICAgQmFzaWNCbG9jayogQkIgPSBibG9ja3NbSV07CisgICAgTG9vcCogQkJMb29wID0gTEluZm8tPmdldExvb3BGb3IoQkIpOworICAgIGlmIChCQkxvb3AgPT0gTCkKKyAgICAgIHByaW50QmFzaWNCbG9jayhCQik7CisgICAgZWxzZSBpZiAoQkI9PUJCTG9vcC0+Z2V0SGVhZGVyKCkgJiYgQkJMb29wLT5nZXRQYXJlbnRMb29wKCk9PUwpCisgICAgICBwcmludExvb3AoQkJMb29wKTsKKyAgfQorICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJiciIsZ2V0TGFiZWxOYW1lKEwtPmdldEhlYWRlcigpLT5nZXROYW1lKCkpLmNfc3RyKCkpOworfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRCYXNpY0Jsb2NrKGNvbnN0IEJhc2ljQmxvY2sqIEJCKSB7CisgIE91dCA8PCBnZXRMYWJlbE5hbWUoQkIpIDw8ICI6XG4iOworICBmb3IgKEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSSE9RTsgKytJKSB7CisgICAgY29uc3QgSW5zdHJ1Y3Rpb24qIEluc3QgPSBJOworICAgIC8vIENvbW1lbnQgbGx2bSBvcmlnaW5hbCBpbnN0cnVjdGlvbgorICAgIC8vIE91dCA8PCAiXG4vLyIgPDwgKkluc3QgPDwgIlxuIjsKKyAgICAvLyBEbyBub3QgaGFuZGxlIFBISSBpbnN0cnVjdGlvbiBpbiBjdXJyZW50IGJsb2NrCisgICAgaWYgKEluc3QtPmdldE9wY29kZSgpPT1JbnN0cnVjdGlvbjo6UEhJKSBjb250aW51ZTsKKyAgICAvLyBQcmludCBpbnN0cnVjdGlvbgorICAgIHByaW50SW5zdHJ1Y3Rpb24oSW5zdCk7CisgICAgLy8gU2F2ZSByZXN1bHQKKyAgICBpZiAoSW5zdC0+Z2V0VHlwZSgpIT1UeXBlOjpnZXRWb2lkVHkoQkItPmdldENvbnRleHQoKSkpIHsKKyAgICAgIC8vIERvIG5vdCBzYXZlIHZhbHVlIGFmdGVyIGludm9rZSwgaXQgZG9uZSBpbiAidHJ5IiBibG9jaworICAgICAgaWYgKEluc3QtPmdldE9wY29kZSgpPT1JbnN0cnVjdGlvbjo6SW52b2tlKSBjb250aW51ZTsKKyAgICAgIHByaW50VmFsdWVTYXZlKEluc3QpOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRMb2NhbFZhcmlhYmxlcyhjb25zdCBGdW5jdGlvbiYgRikgeworICBzdGQ6OnN0cmluZyBOYW1lOworICBjb25zdCBUeXBlKiBUeSA9IE5VTEw7CisgIHN0ZDo6c2V0PGNvbnN0IFZhbHVlKj4gUHJpbnRlZDsKKyAgY29uc3QgVmFsdWUqIFZhTGlzdCA9IE5VTEw7CisgIHVuc2lnbmVkIFN0YWNrRGVwdGggPSA4OworICAvLyBGaW5kIGxvY2FsIHZhcmlhYmxlcworICBmb3IgKGNvbnN0X2luc3RfaXRlcmF0b3IgSSA9IGluc3RfYmVnaW4oJkYpLCBFID0gaW5zdF9lbmQoJkYpOyBJIT1FOyArK0kpIHsKKyAgICBpZiAoSS0+Z2V0T3Bjb2RlKCk9PUluc3RydWN0aW9uOjpDYWxsIHx8CisgICAgICAgIEktPmdldE9wY29kZSgpPT1JbnN0cnVjdGlvbjo6SW52b2tlKSB7CisgICAgICAvLyBUZXN0IHN0YWNrIGRlcHRoLgorICAgICAgaWYgKFN0YWNrRGVwdGg8SS0+Z2V0TnVtT3BlcmFuZHMoKSkKKyAgICAgICAgU3RhY2tEZXB0aCA9IEktPmdldE51bU9wZXJhbmRzKCk7CisgICAgfQorICAgIGNvbnN0IEFsbG9jYUluc3QqIEFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oJipJKTsKKyAgICBpZiAoQUkgJiYgIWlzYTxHbG9iYWxWYXJpYWJsZT4oQUkpKSB7CisgICAgICAvLyBMb2NhbCB2YXJpYWJsZSBhbGxvY2F0aW9uLgorICAgICAgVHkgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCkpOworICAgICAgTmFtZSA9IGdldFZhbHVlTmFtZShBSSk7CisgICAgICBPdXQgPDwgIlx0LmxvY2FscyAoIiA8PCBnZXRUeXBlTmFtZShUeSkgPDwgTmFtZSA8PCAiKVxuIjsKKyAgICB9IGVsc2UgaWYgKEktPmdldFR5cGUoKSE9VHlwZTo6Z2V0Vm9pZFR5KEYuZ2V0Q29udGV4dCgpKSkgeworICAgICAgLy8gT3BlcmF0aW9uIHJlc3VsdC4KKyAgICAgIFR5ID0gSS0+Z2V0VHlwZSgpOworICAgICAgTmFtZSA9IGdldFZhbHVlTmFtZSgmKkkpOworICAgICAgT3V0IDw8ICJcdC5sb2NhbHMgKCIgPDwgZ2V0VHlwZU5hbWUoVHkpIDw8IE5hbWUgPDwgIilcbiI7CisgICAgfQorICAgIC8vIFRlc3Qgb24gJ3ZhX2xpc3QnIHZhcmlhYmxlICAgIAorICAgIGJvb2wgaXNWYUxpc3QgPSBmYWxzZTsgICAgIAorICAgIGlmIChjb25zdCBWQUFyZ0luc3QqIFZhSW5zdCA9IGR5bl9jYXN0PFZBQXJnSW5zdD4oJipJKSkgeworICAgICAgLy8gInZhX2xpc3QiIGFzICJ2YV9hcmciIGluc3RydWN0aW9uIG9wZXJhbmQuCisgICAgICBpc1ZhTGlzdCA9IHRydWU7CisgICAgICBWYUxpc3QgPSBWYUluc3QtPmdldE9wZXJhbmQoMCk7CisgICAgfSBlbHNlIGlmIChjb25zdCBJbnRyaW5zaWNJbnN0KiBJbnN0ID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oJipJKSkgeworICAgICAgLy8gInZhX2xpc3QiIGFzIGludHJpbnNpYyBmdW5jdGlvbiBvcGVyYW5kLiAKKyAgICAgIHN3aXRjaCAoSW5zdC0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6OnZhc3RhcnQ6CisgICAgICBjYXNlIEludHJpbnNpYzo6dmFlbmQ6CisgICAgICBjYXNlIEludHJpbnNpYzo6dmFjb3B5OgorICAgICAgICBpc1ZhTGlzdCA9IHRydWU7CisgICAgICAgIFZhTGlzdCA9IEluc3QtPmdldEFyZ09wZXJhbmQoMCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaXNWYUxpc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gUHJpbnQgInZhX2xpc3QiIHZhcmlhYmxlLgorICAgIGlmIChpc1ZhTGlzdCAmJiBQcmludGVkLmluc2VydChWYUxpc3QpLnNlY29uZCkgeworICAgICAgTmFtZSA9IGdldFZhbHVlTmFtZShWYUxpc3QpOworICAgICAgTmFtZS5pbnNlcnQoTmFtZS5sZW5ndGgoKS0xLCIkdmFsaXN0Iik7CisgICAgICBPdXQgPDwgIlx0LmxvY2FscyAodmFsdWV0eXBlIFttc2NvcmxpYl1TeXN0ZW0uQXJnSXRlcmF0b3IgIgorICAgICAgICAgIDw8IE5hbWUgPDwgIilcbiI7CisgICAgfQorICB9CisgIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oIi5tYXhzdGFjayIsdXRvc3RyKFN0YWNrRGVwdGgqMikuY19zdHIoKSk7Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludEZ1bmN0aW9uQm9keShjb25zdCBGdW5jdGlvbiYgRikgeworICAvLyBQcmludCBib2R5CisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEkgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBJIT1FOyArK0kpIHsKKyAgICBpZiAoTG9vcCAqTCA9IExJbmZvLT5nZXRMb29wRm9yKEkpKSB7CisgICAgICBpZiAoTC0+Z2V0SGVhZGVyKCk9PUkgJiYgTC0+Z2V0UGFyZW50TG9vcCgpPT0wKQorICAgICAgICBwcmludExvb3AoTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50QmFzaWNCbG9jayhJKTsKKyAgICB9CisgIH0KK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50Q29uc3RhbnRFeHByKGNvbnN0IENvbnN0YW50RXhwciogQ0UpIHsKKyAgY29uc3QgVmFsdWUgKmxlZnQgPSAwLCAqcmlnaHQgPSAwOworICBpZiAoQ0UtPmdldE51bU9wZXJhbmRzKCk+PTEpIGxlZnQgPSBDRS0+Z2V0T3BlcmFuZCgwKTsKKyAgaWYgKENFLT5nZXROdW1PcGVyYW5kcygpPj0yKSByaWdodCA9IENFLT5nZXRPcGVyYW5kKDEpOworICAvLyBQcmludCBpbnN0cnVjdGlvbgorICBzd2l0Y2ggKENFLT5nZXRPcGNvZGUoKSkgeworICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICBjYXNlIEluc3RydWN0aW9uOjpGUFRvVUk6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSToKKyAgY2FzZSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOgorICBjYXNlIEluc3RydWN0aW9uOjpCaXRDYXN0OgorICAgIHByaW50Q2FzdEluc3RydWN0aW9uKENFLT5nZXRPcGNvZGUoKSxsZWZ0LENFLT5nZXRUeXBlKCkpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOgorICAgIHByaW50R2VwSW5zdHJ1Y3Rpb24oQ0UtPmdldE9wZXJhbmQoMCksZ2VwX3R5cGVfYmVnaW4oQ0UpLGdlcF90eXBlX2VuZChDRSkpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpJQ21wOgorICAgIHByaW50SUNtcEluc3RydWN0aW9uKENFLT5nZXRQcmVkaWNhdGUoKSxsZWZ0LHJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RkNtcDoKKyAgICBwcmludEZDbXBJbnN0cnVjdGlvbihDRS0+Z2V0UHJlZGljYXRlKCksbGVmdCxyaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNlbGVjdDoKKyAgICBwcmludFNlbGVjdEluc3RydWN0aW9uKENFLT5nZXRPcGVyYW5kKDApLENFLT5nZXRPcGVyYW5kKDEpLENFLT5nZXRPcGVyYW5kKDIpKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICBjYXNlIEluc3RydWN0aW9uOjpGQWRkOgorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImFkZCIsbGVmdCxyaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlN1YjoKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJzdWIiLGxlZnQscmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZNdWw6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigibXVsIixsZWZ0LHJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjoKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJkaXYudW4iLGxlZnQscmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICBjYXNlIEluc3RydWN0aW9uOjpGRGl2OgorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oImRpdiIsbGVmdCxyaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigicmVtLnVuIixsZWZ0LHJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlJlbToKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJyZW0iLGxlZnQscmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigiYW5kIixsZWZ0LHJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigib3IiLGxlZnQscmlnaHQpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigieG9yIixsZWZ0LHJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oInNobCIsbGVmdCxyaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6CisgICAgcHJpbnRCaW5hcnlJbnN0cnVjdGlvbigic2hyLnVuIixsZWZ0LHJpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICBwcmludEJpbmFyeUluc3RydWN0aW9uKCJzaHIiLGxlZnQscmlnaHQpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGVycnMoKSA8PCAiRXhwcmVzc2lvbiA9ICIgPDwgKkNFIDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBjb25zdGFudCBleHByZXNzaW9uIik7CisgIH0KK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50U3RhdGljSW5pdGlhbGl6ZXJMaXN0KCkgeworICAvLyBMaXN0IG9mIGdsb2JhbCB2YXJpYWJsZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcy4KKyAgZm9yIChzdGQ6Om1hcDxjb25zdCBHbG9iYWxWYXJpYWJsZSosc3RkOjp2ZWN0b3I8U3RhdGljSW5pdGlhbGl6ZXI+ID46Oml0ZXJhdG9yCisgICAgICAgVmFySSA9IFN0YXRpY0luaXRMaXN0LmJlZ2luKCksIFZhckUgPSBTdGF0aWNJbml0TGlzdC5lbmQoKTsgVmFySSE9VmFyRTsKKyAgICAgICArK1ZhckkpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdGF0aWNJbml0aWFsaXplcj4mIEluaXRMaXN0ID0gVmFySS0+c2Vjb25kOworICAgIGlmIChJbml0TGlzdC5lbXB0eSgpKSBjb250aW51ZTsKKyAgICAvLyBGb3IgZWFjaCB1bmluaXRpYWxpemVkIGZpZWxkLgorICAgIGZvciAoc3RkOjp2ZWN0b3I8U3RhdGljSW5pdGlhbGl6ZXI+Ojpjb25zdF9pdGVyYXRvciBJID0gSW5pdExpc3QuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBJbml0TGlzdC5lbmQoKTsgSSE9RTsgKytJKSB7CisgICAgICBpZiAoY29uc3QgQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oSS0+Y29uc3RhbnQpKSB7CisgICAgICAgIC8vIE91dCA8PCAiXG4vLyBJbml0ICIgPDwgZ2V0VmFsdWVOYW1lKFZhckktPmZpcnN0KSA8PCAiLCBvZmZzZXQgIiA8PAorICAgICAgICAvLyAgdXRvc3RyKEktPm9mZnNldCkgPDwgIiwgdHlwZSAiPDwgKkktPmNvbnN0YW50LT5nZXRUeXBlKCkgPDwgIlxuXG4iOworICAgICAgICAvLyBMb2FkIHZhcmlhYmxlIGFkZHJlc3MKKyAgICAgICAgcHJpbnRWYWx1ZUxvYWQoVmFySS0+Zmlyc3QpOworICAgICAgICAvLyBBZGQgb2Zmc2V0CisgICAgICAgIGlmIChJLT5vZmZzZXQhPTApIHsKKyAgICAgICAgICBwcmludFB0ckxvYWQoSS0+b2Zmc2V0KTsKKyAgICAgICAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJhZGQiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBMb2FkIHZhbHVlCisgICAgICAgIHByaW50Q29uc3RhbnRFeHByKENFKTsKKyAgICAgICAgLy8gU2F2ZSByZXN1bHQgYXQgb2Zmc2V0CisgICAgICAgIHN0ZDo6c3RyaW5nIHBvc3RmaXggPSBnZXRUeXBlUG9zdGZpeChDRS0+Z2V0VHlwZSgpLHRydWUpOworICAgICAgICBpZiAoKnBvc3RmaXguYmVnaW4oKT09J3UnKSAqcG9zdGZpeC5iZWdpbigpID0gJ2knOworICAgICAgICBwb3N0Zml4ID0gInN0aW5kLiIrcG9zdGZpeDsKKyAgICAgICAgcHJpbnRTaW1wbGVJbnN0cnVjdGlvbihwb3N0Zml4LmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJycygpIDw8ICJDb25zdGFudCA9ICIgPDwgKkktPmNvbnN0YW50IDw8ICdcbic7CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgc3RhdGljIGluaXRpYWxpemVyIik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludEZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uJiBGKSB7CisgIGJvb2wgaXNTaWduZWQgPSBGLnBhcmFtSGFzQXR0cigwLCBBdHRyaWJ1dGU6OlNFeHQpOworICBPdXQgPDwgIlxuLm1ldGhvZCBzdGF0aWMgIjsKKyAgT3V0IDw8IChGLmhhc0xvY2FsTGlua2FnZSgpID8gInByaXZhdGUgIiA6ICJwdWJsaWMgIik7CisgIGlmIChGLmlzVmFyQXJnKCkpIE91dCA8PCAidmFyYXJnICI7CisgIE91dCA8PCBnZXRUeXBlTmFtZShGLmdldFJldHVyblR5cGUoKSxpc1NpZ25lZCkgPDwgCisgICAgZ2V0Q29udk1vZG9wdChGLmdldENhbGxpbmdDb252KCkpIDw8IGdldFZhbHVlTmFtZSgmRikgPDwgJ1xuJzsKKyAgLy8gQXJndW1lbnRzCisgIE91dCA8PCAiXHQoIjsKKyAgdW5zaWduZWQgQXJnSWR4ID0gMTsKKyAgZm9yIChGdW5jdGlvbjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEkgPSBGLmFyZ19iZWdpbigpLCBFID0gRi5hcmdfZW5kKCk7IEkhPUU7CisgICAgICAgKytJLCArK0FyZ0lkeCkgeworICAgIGlzU2lnbmVkID0gRi5wYXJhbUhhc0F0dHIoQXJnSWR4LCBBdHRyaWJ1dGU6OlNFeHQpOworICAgIGlmIChJIT1GLmFyZ19iZWdpbigpKSBPdXQgPDwgIiwgIjsKKyAgICBPdXQgPDwgZ2V0VHlwZU5hbWUoSS0+Z2V0VHlwZSgpLGlzU2lnbmVkKSA8PCBnZXRWYWx1ZU5hbWUoSSk7CisgIH0KKyAgT3V0IDw8ICIpIGNpbCBtYW5hZ2VkXG4iOworICAvLyBCb2R5CisgIE91dCA8PCAie1xuIjsKKyAgcHJpbnRMb2NhbFZhcmlhYmxlcyhGKTsKKyAgcHJpbnRGdW5jdGlvbkJvZHkoRik7CisgIE91dCA8PCAifVxuIjsKK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50RGVjbGFyYXRpb25zKGNvbnN0IFR5cGVTeW1ib2xUYWJsZSYgU1QpIHsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgc3RkOjpzZXQ8Y29uc3QgVHlwZSo+IFByaW50ZWQ7CisgIGZvciAoc3RkOjpzZXQ8Y29uc3QgVHlwZSo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgIFVJID0gVXNlZFR5cGVzLT5iZWdpbigpLCBVRSA9IFVzZWRUeXBlcy0+ZW5kKCk7IFVJIT1VRTsgKytVSSkgeworICAgIGNvbnN0IFR5cGUqIFR5ID0gKlVJOworICAgIGlmIChUeS0+aXNBcnJheVR5KCkgfHwgVHktPmlzVmVjdG9yVHkoKSB8fCBUeS0+aXNTdHJ1Y3RUeSgpKQorICAgICAgTmFtZSA9IGdldFR5cGVOYW1lKFR5LCBmYWxzZSwgdHJ1ZSk7CisgICAgLy8gVHlwZSB3aXRoIG5vIG5lZWQgdG8gZGVjbGFyZS4KKyAgICBlbHNlIGNvbnRpbnVlOworICAgIC8vIFByaW50IG5vdCBkdXBsaWNhdGVkIHR5cGUKKyAgICBpZiAoUHJpbnRlZC5pbnNlcnQoVHkpLnNlY29uZCkgeworICAgICAgT3V0IDw8ICIuY2xhc3MgdmFsdWUgZXhwbGljaXQgYW5zaSBzZWFsZWQgJyIgPDwgTmFtZSA8PCAiJyI7CisgICAgICBPdXQgPDwgIiB7IC5wYWNrICIgPDwgMSA8PCAiIC5zaXplICIgPDwgVEQtPmdldFR5cGVBbGxvY1NpemUoVHkpOworICAgICAgT3V0IDw8ICIgfVxuXG4iOworICAgIH0KKyAgfQorfQorCisKK3Vuc2lnbmVkIGludCBNU0lMV3JpdGVyOjpnZXRCaXRXaWR0aChjb25zdCBUeXBlKiBUeSkgeworICB1bnNpZ25lZCBpbnQgTiA9IFR5LT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgIGFzc2VydChOIT0wICYmICJJbnZhbGlkIHR5cGUgaW4gZ2V0Qml0V2lkdGgoKSIpOworICBzd2l0Y2ggKE4pIHsKKyAgY2FzZSAxOgorICBjYXNlIDg6CisgIGNhc2UgMTY6CisgIGNhc2UgMzI6CisgIGNhc2UgNjQ6CisgICAgcmV0dXJuIE47CisgIGRlZmF1bHQ6CisgICAgZXJycygpIDw8ICJCaXRzID0gIiA8PCBOIDw8ICdcbic7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgaW50ZWdlciB3aWR0aCIpOworICB9CisgIHJldHVybiAwOyAvLyBOb3QgcmVhY2hlZAorfQorCisKK3ZvaWQgTVNJTFdyaXRlcjo6cHJpbnRTdGF0aWNDb25zdGFudChjb25zdCBDb25zdGFudCogQywgdWludDY0X3QmIE9mZnNldCkgeworICB1aW50NjRfdCBUeVNpemUgPSAwOworICBjb25zdCBUeXBlKiBUeSA9IEMtPmdldFR5cGUoKTsKKyAgLy8gUHJpbnQgemVybyBpbml0aWFsaXplZCBjb25zdGFudC4KKyAgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEMpIHx8IEMtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICBUeVNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShDLT5nZXRUeXBlKCkpOworICAgIE9mZnNldCArPSBUeVNpemU7CisgICAgT3V0IDw8ICJpbnQ4ICgwKSBbIiA8PCBUeVNpemUgPDwgIl0iOworICAgIHJldHVybjsKKyAgfQorICAvLyBQcmludCBjb25zdGFudCBpbml0aWFsaXplcgorICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOiB7CisgICAgVHlTaXplID0gVEQtPmdldFR5cGVBbGxvY1NpemUoVHkpOworICAgIGNvbnN0IENvbnN0YW50SW50KiBJbnQgPSBjYXN0PENvbnN0YW50SW50PihDKTsKKyAgICBPdXQgPDwgZ2V0UHJpbWl0aXZlVHlwZU5hbWUoVHksdHJ1ZSkgPDwgIigiIDw8IEludC0+Z2V0U0V4dFZhbHVlKCkgPDwgIikiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOgorICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6IHsKKyAgICBUeVNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShUeSk7CisgICAgY29uc3QgQ29uc3RhbnRGUCogRlAgPSBjYXN0PENvbnN0YW50RlA+KEMpOworICAgIGlmIChUeS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6RmxvYXRUeUlEKQorICAgICAgT3V0IDw8ICJpbnQzMiAoIiA8PCAKKyAgICAgICAgKHVpbnQzMl90KUZQLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCkuZ2V0WkV4dFZhbHVlKCkgPDwgJyknOworICAgIGVsc2UKKyAgICAgIE91dCA8PCAiaW50NjQgKCIgPDwgCisgICAgICAgIEZQLT5nZXRWYWx1ZUFQRigpLmJpdGNhc3RUb0FQSW50KCkuZ2V0WkV4dFZhbHVlKCkgPDwgJyknOworICAgIGJyZWFrOworICB9CisgIGNhc2UgVHlwZTo6QXJyYXlUeUlEOgorICBjYXNlIFR5cGU6OlZlY3RvclR5SUQ6CisgIGNhc2UgVHlwZTo6U3RydWN0VHlJRDoKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gQy0+Z2V0TnVtT3BlcmFuZHMoKTsgSTxFOyBJKyspIHsKKyAgICAgIGlmIChJIT0wKSBPdXQgPDwgIixcbiI7CisgICAgICBwcmludFN0YXRpY0NvbnN0YW50KGNhc3Q8Q29uc3RhbnQ+KEMtPmdldE9wZXJhbmQoSSkpLCBPZmZzZXQpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICBUeVNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShDLT5nZXRUeXBlKCkpOworICAgIC8vIEluaXRpYWxpemUgd2l0aCBnbG9iYWwgdmFyaWFibGUgYWRkcmVzcworICAgIGlmIChjb25zdCBHbG9iYWxWYXJpYWJsZSAqRyA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihDKSkgeworICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFZhbHVlTmFtZShHKTsKKyAgICAgIE91dCA8PCAiJigiIDw8IG5hbWUuaW5zZXJ0KG5hbWUubGVuZ3RoKCktMSwiJGRhdGEiKSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIER5bmFtaWMgaW5pdGlhbGl6YXRpb24KKyAgICAgIGlmICghaXNhPENvbnN0YW50UG9pbnRlck51bGw+KEMpICYmICFDLT5pc051bGxWYWx1ZSgpKQorICAgICAgICBJbml0TGlzdFB0ci0+cHVzaF9iYWNrKFN0YXRpY0luaXRpYWxpemVyKEMsT2Zmc2V0KSk7CisgICAgICAvLyBOdWxsIHBvaW50ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgIGlmIChUeVNpemU9PTQpIE91dCA8PCAiaW50MzIgKDApIjsKKyAgICAgIGVsc2UgaWYgKFR5U2l6ZT09OCkgT3V0IDw8ICJpbnQ2NCAoMCkiOworICAgICAgZWxzZSBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHBvaW50ZXIgc2l6ZSIpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBlcnJzKCkgPDwgIlR5cGVJRCA9ICIgPDwgVHktPmdldFR5cGVJRCgpIDw8ICdcbic7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCB0eXBlIGluIHByaW50U3RhdGljQ29uc3RhbnQoKSIpOworICB9CisgIC8vIEluY3JlYXNlIG9mZnNldC4KKyAgT2Zmc2V0ICs9IFR5U2l6ZTsKK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50U3RhdGljSW5pdGlhbGl6ZXIoY29uc3QgQ29uc3RhbnQqIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE5hbWUpIHsKKyAgc3dpdGNoIChDLT5nZXRUeXBlKCktPmdldFR5cGVJRCgpKSB7CisgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOgorICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6IAorICAgIE91dCA8PCBnZXRQcmltaXRpdmVUeXBlTmFtZShDLT5nZXRUeXBlKCksIGZhbHNlKTsKKyAgICBicmVhazsKKyAgY2FzZSBUeXBlOjpBcnJheVR5SUQ6CisgIGNhc2UgVHlwZTo6VmVjdG9yVHlJRDoKKyAgY2FzZSBUeXBlOjpTdHJ1Y3RUeUlEOgorICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOgorICAgIE91dCA8PCBnZXRUeXBlTmFtZShDLT5nZXRUeXBlKCkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGVycnMoKSA8PCAiVHlwZSA9ICIgPDwgKkMgPDwgIlxuIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGNvbnN0YW50IHR5cGUiKTsKKyAgfQorICAvLyBQcmludCBpbml0aWFsaXplcgorICBzdGQ6OnN0cmluZyBsYWJlbCA9IE5hbWU7CisgIGxhYmVsLmluc2VydChsYWJlbC5sZW5ndGgoKS0xLCIkZGF0YSIpOworICBPdXQgPDwgTmFtZSA8PCAiIGF0ICIgPDwgbGFiZWwgPDwgJ1xuJzsKKyAgT3V0IDw8ICIuZGF0YSAiIDw8IGxhYmVsIDw8ICIgPSB7XG4iOworICB1aW50NjRfdCBvZmZzZXQgPSAwOworICBwcmludFN0YXRpY0NvbnN0YW50KEMsb2Zmc2V0KTsKKyAgT3V0IDw8ICJcbn1cblxuIjsKK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50VmFyaWFibGVEZWZpbml0aW9uKGNvbnN0IEdsb2JhbFZhcmlhYmxlKiBHKSB7CisgIGNvbnN0IENvbnN0YW50KiBDID0gRy0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgaWYgKEMtPmlzTnVsbFZhbHVlKCkgfHwgaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oQykgfHwgaXNhPFVuZGVmVmFsdWU+KEMpKQorICAgIEluaXRMaXN0UHRyID0gMDsKKyAgZWxzZQorICAgIEluaXRMaXN0UHRyID0gJlN0YXRpY0luaXRMaXN0W0ddOworICBwcmludFN0YXRpY0luaXRpYWxpemVyKEMsZ2V0VmFsdWVOYW1lKEcpKTsKK30KKworCit2b2lkIE1TSUxXcml0ZXI6OnByaW50R2xvYmFsVmFyaWFibGVzKCkgeworICBpZiAoTW9kdWxlUHRyLT5nbG9iYWxfZW1wdHkoKSkgcmV0dXJuOworICBNb2R1bGU6Omdsb2JhbF9pdGVyYXRvciBJLEU7CisgIGZvciAoSSA9IE1vZHVsZVB0ci0+Z2xvYmFsX2JlZ2luKCksIEUgPSBNb2R1bGVQdHItPmdsb2JhbF9lbmQoKTsgSSE9RTsgKytJKSB7CisgICAgLy8gVmFyaWFibGUgZGVmaW5pdGlvbgorICAgIE91dCA8PCAiLmZpZWxkIHN0YXRpYyAiIDw8IChJLT5pc0RlY2xhcmF0aW9uKCkgPyAicHVibGljICIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSAiKTsKKyAgICBpZiAoSS0+aXNEZWNsYXJhdGlvbigpKSB7CisgICAgICBPdXQgPDwgZ2V0VHlwZU5hbWUoSS0+Z2V0VHlwZSgpKSA8PCBnZXRWYWx1ZU5hbWUoJipJKSA8PCAiXG5cbiI7CisgICAgfSBlbHNlCisgICAgICBwcmludFZhcmlhYmxlRGVmaW5pdGlvbigmKkkpOworICB9Cit9CisKKworY29uc3QgY2hhciogTVNJTFdyaXRlcjo6Z2V0TGlicmFyeU5hbWUoY29uc3QgRnVuY3Rpb24qIEYpIHsKKyAgcmV0dXJuIGdldExpYnJhcnlGb3JTeW1ib2woRi0+Z2V0TmFtZSgpLCB0cnVlLCBGLT5nZXRDYWxsaW5nQ29udigpKTsKK30KKworCitjb25zdCBjaGFyKiBNU0lMV3JpdGVyOjpnZXRMaWJyYXJ5TmFtZShjb25zdCBHbG9iYWxWYXJpYWJsZSogR1YpIHsKKyAgcmV0dXJuIGdldExpYnJhcnlGb3JTeW1ib2woR1YtPmdldE5hbWUoKSwgZmFsc2UsIENhbGxpbmdDb252OjpDKTsKK30KKworCitjb25zdCBjaGFyKiBNU0lMV3JpdGVyOjpnZXRMaWJyYXJ5Rm9yU3ltYm9sKFN0cmluZ1JlZiBOYW1lLCBib29sIGlzRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsaW5nQ29udikgeworICAvLyBUT0RPOiBSZWFkICouZGVmIGZpbGUgd2l0aCBmdW5jdGlvbiBhbmQgbGlicmFyaWVzIGRlZmluaXRpb25zLgorICByZXR1cm4gIk1TVkNSVC5ETEwiOyAgCit9CisKKwordm9pZCBNU0lMV3JpdGVyOjpwcmludEV4dGVybmFscygpIHsKKyAgTW9kdWxlOjpjb25zdF9pdGVyYXRvciBJLEU7CisgIC8vIEZ1bmN0aW9ucy4KKyAgZm9yIChJPU1vZHVsZVB0ci0+YmVnaW4oKSxFPU1vZHVsZVB0ci0+ZW5kKCk7IEkhPUU7ICsrSSkgeworICAgIC8vIFNraXAgaW50cmlzaWNzCisgICAgaWYgKEktPmlzSW50cmluc2ljKCkpIGNvbnRpbnVlOworICAgIGlmIChJLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgIGNvbnN0IEZ1bmN0aW9uKiBGID0gSTsgCisgICAgICBzdGQ6OnN0cmluZyBOYW1lID0gZ2V0Q29udk1vZG9wdChGLT5nZXRDYWxsaW5nQ29udigpKStnZXRWYWx1ZU5hbWUoRik7CisgICAgICBzdGQ6OnN0cmluZyBTaWcgPSAKKyAgICAgICAgZ2V0Q2FsbFNpZ25hdHVyZShjYXN0PEZ1bmN0aW9uVHlwZT4oRi0+Z2V0RnVuY3Rpb25UeXBlKCkpLCBOVUxMLCBOYW1lKTsKKyAgICAgIE91dCA8PCAiLm1ldGhvZCBzdGF0aWMgaGlkZWJ5c2lnIHBpbnZva2VpbXBsKFwiIgorICAgICAgICAgIDw8IGdldExpYnJhcnlOYW1lKEYpIDw8ICJcIilcblx0IiA8PCBTaWcgPDwgIiBwcmVzZXJ2ZXNpZyB7fVxuXG4iOworICAgIH0KKyAgfQorICAvLyBFeHRlcm5hbCB2YXJpYWJsZXMgYW5kIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KKyAgT3V0IDw8CisgICIubWV0aG9kIHB1YmxpYyBoaWRlYnlzaWcgc3RhdGljIHBpbnZva2VpbXBsKFwiS0VSTkVMMzIuRExMXCIgYW5zaSB3aW5hcGkpIgorICAiICBuYXRpdmUgaW50IExvYWRMaWJyYXJ5KHN0cmluZykgcHJlc2VydmVzaWcge31cbiIKKyAgIi5tZXRob2QgcHVibGljIGhpZGVieXNpZyBzdGF0aWMgcGludm9rZWltcGwoXCJLRVJORUwzMi5ETExcIiBhbnNpIHdpbmFwaSkiCisgICIgIG5hdGl2ZSBpbnQgR2V0UHJvY0FkZHJlc3MobmF0aXZlIGludCwgc3RyaW5nKSBwcmVzZXJ2ZXNpZyB7fVxuIjsKKyAgT3V0IDw8CisgICIubWV0aG9kIHByaXZhdGUgc3RhdGljIHZvaWQqICRNU0lMX0ltcG9ydChzdHJpbmcgbGliLHN0cmluZyBzeW0pXG4iCisgICIgbWFuYWdlZCBjaWxcbntcbiIKKyAgIlx0bGRhcmdcdGxpYlxuIgorICAiXHRjYWxsXHRuYXRpdmUgaW50IExvYWRMaWJyYXJ5KHN0cmluZylcbiIKKyAgIlx0bGRhcmdcdHN5bVxuIgorICAiXHRjYWxsXHRuYXRpdmUgaW50IEdldFByb2NBZGRyZXNzKG5hdGl2ZSBpbnQsc3RyaW5nKVxuIgorICAiXHRkdXBcbiIKKyAgIlx0YnJ0cnVlXHRMXzAxXG4iCisgICJcdGxkc3RyXHRcIkNhbiBubyBpbXBvcnQgdmFyaWFibGVcIlxuIgorICAiXHRuZXdvYmpcdGluc3RhbmNlIHZvaWQgW21zY29ybGliXVN5c3RlbS5FeGNlcHRpb246Oi5jdG9yKHN0cmluZylcbiIKKyAgIlx0dGhyb3dcbiIKKyAgIkxfMDE6XG4iCisgICJcdHJldFxuIgorICAifVxuXG4iCisgICIubWV0aG9kIHN0YXRpYyBwcml2YXRlIHZvaWQgJE1TSUxfSW5pdCgpIG1hbmFnZWQgY2lsXG57XG4iOworICBwcmludFN0YXRpY0luaXRpYWxpemVyTGlzdCgpOworICAvLyBGb3JlYWNoIGdsb2JhbCB2YXJpYWJsZS4KKyAgZm9yIChNb2R1bGU6Omdsb2JhbF9pdGVyYXRvciBJID0gTW9kdWxlUHRyLT5nbG9iYWxfYmVnaW4oKSwKKyAgICAgICBFID0gTW9kdWxlUHRyLT5nbG9iYWxfZW5kKCk7IEkhPUU7ICsrSSkgeworICAgIGlmICghSS0+aXNEZWNsYXJhdGlvbigpIHx8ICFJLT5oYXNETExJbXBvcnRMaW5rYWdlKCkpIGNvbnRpbnVlOworICAgIC8vIFVzZSAiTG9hZExpYnJhcnkiLyJHZXRQcm9jQWRkcmVzcyIgdG8gcmVjaXZlIHZhcmlhYmxlIGFkZHJlc3MuCisgICAgc3RkOjpzdHJpbmcgVG1wID0gZ2V0VHlwZU5hbWUoSS0+Z2V0VHlwZSgpKStnZXRWYWx1ZU5hbWUoJipJKTsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJsZHNmbGRhIixUbXAuY19zdHIoKSk7CisgICAgT3V0IDw8ICJcdGxkc3RyXHRcIiIgPDwgZ2V0TGlicmFyeU5hbWUoJipJKSA8PCAiXCJcbiI7CisgICAgT3V0IDw8ICJcdGxkc3RyXHRcIiIgPDwgSS0+Z2V0TmFtZSgpIDw8ICJcIlxuIjsKKyAgICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJjYWxsIiwidm9pZCogJE1TSUxfSW1wb3J0KHN0cmluZyxzdHJpbmcpIik7CisgICAgcHJpbnRJbmRpcmVjdFNhdmUoSS0+Z2V0VHlwZSgpKTsKKyAgfQorICBwcmludFNpbXBsZUluc3RydWN0aW9uKCJyZXQiKTsKKyAgT3V0IDw8ICJ9XG5cbiI7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIEludGVyZmFjZSBkZWNsYXJhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworYm9vbCBNU0lMVGFyZ2V0OjphZGRQYXNzZXNUb0VtaXRGaWxlKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GaWxlVHlwZSBGaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVWZXJpZnkpCit7CisgIGlmIChGaWxlVHlwZSAhPSBUYXJnZXRNYWNoaW5lOjpDR0ZUX0Fzc2VtYmx5RmlsZSkgcmV0dXJuIHRydWU7CisgIE1TSUxXcml0ZXIqIFdyaXRlciA9IG5ldyBNU0lMV3JpdGVyKG8pOworICBQTS5hZGQoY3JlYXRlR0NMb3dlcmluZ1Bhc3MoKSk7CisgIC8vIEZJWE1FOiBIYW5kbGUgc3dpdGNoIHRocm91Z2ggbmF0aXZlIElMIGluc3RydWN0aW9uICJzd2l0Y2giCisgIFBNLmFkZChjcmVhdGVMb3dlclN3aXRjaFBhc3MoKSk7CisgIFBNLmFkZChjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKSk7CisgIFBNLmFkZChuZXcgTVNJTE1vZHVsZShXcml0ZXItPlVzZWRUeXBlcyxXcml0ZXItPlREKSk7CisgIFBNLmFkZChXcml0ZXIpOworICBQTS5hZGQoY3JlYXRlR0NJbmZvRGVsZXRlcigpKTsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU0lML01TSUxXcml0ZXIuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNJTC9NU0lMV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0NDBlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNJTC9NU0lMV3JpdGVyLmgKQEAgLTAsMCArMSwyNTggQEAKKy8vPT09LS0gTVNJTFdyaXRlci5oIC0gVGFyZ2V0TWFjaGluZSBmb3IgdGhlIE1TSUwgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNU0lMV3JpdGVyIHRoYXQgaXMgdXNlZCBieSB0aGUgTVNJTC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBNU0lMV1JJVEVSX0gKKyNkZWZpbmUgTVNJTFdSSVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRmluZFVzZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGV4dGVybiBUYXJnZXQgVGhlTVNJTFRhcmdldDsKKworICBjbGFzcyBNU0lMTW9kdWxlIDogcHVibGljIE1vZHVsZVBhc3MgeworICAgIE1vZHVsZSAqTW9kdWxlUHRyOworICAgIGNvbnN0IHN0ZDo6c2V0PGNvbnN0IFR5cGUgKj4qJiBVc2VkVHlwZXM7CisgICAgY29uc3QgVGFyZ2V0RGF0YSomIFREOworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBNU0lMTW9kdWxlKGNvbnN0IHN0ZDo6c2V0PGNvbnN0IFR5cGUgKj4qJiBfVXNlZFR5cGVzLAorICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSomIF9URCkKKyAgICAgIDogTW9kdWxlUGFzcyhJRCksIFVzZWRUeXBlcyhfVXNlZFR5cGVzKSwgVEQoX1REKSB7fQorCisgICAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5hZGRSZXF1aXJlZDxGaW5kVXNlZFR5cGVzPigpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8VGFyZ2V0RGF0YT4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJNU0lMIGJhY2tlbmQgZGVmaW5pdGlvbnMiOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pOworCisgIH07CisKKyAgY2xhc3MgTVNJTFdyaXRlciA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICAgIHN0cnVjdCBTdGF0aWNJbml0aWFsaXplciB7CisgICAgICBjb25zdCBDb25zdGFudCogY29uc3RhbnQ7CisgICAgICB1aW50NjRfdCBvZmZzZXQ7CisgICAgICAKKyAgICAgIFN0YXRpY0luaXRpYWxpemVyKCkKKyAgICAgICAgOiBjb25zdGFudCgwKSwgb2Zmc2V0KDApIHt9CisKKyAgICAgIFN0YXRpY0luaXRpYWxpemVyKGNvbnN0IENvbnN0YW50KiBfY29uc3RhbnQsIHVpbnQ2NF90IF9vZmZzZXQpCisgICAgICAgIDogY29uc3RhbnQoX2NvbnN0YW50KSwgb2Zmc2V0KF9vZmZzZXQpIHt9IAorICAgIH07CisKKyAgICB1aW50NjRfdCBVbmlxSUQ7CisKKyAgICB1aW50NjRfdCBnZXRVbmlxSUQoKSB7CisgICAgICByZXR1cm4gKytVbmlxSUQ7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk91dDsKKyAgICBNb2R1bGUqIE1vZHVsZVB0cjsKKyAgICBjb25zdCBUYXJnZXREYXRhKiBURDsKKyAgICBMb29wSW5mbyAqTEluZm87CisgICAgc3RkOjp2ZWN0b3I8U3RhdGljSW5pdGlhbGl6ZXI+KiBJbml0TGlzdFB0cjsKKyAgICBzdGQ6Om1hcDxjb25zdCBHbG9iYWxWYXJpYWJsZSosc3RkOjp2ZWN0b3I8U3RhdGljSW5pdGlhbGl6ZXI+ID4KKyAgICAgIFN0YXRpY0luaXRMaXN0OworICAgIGNvbnN0IHN0ZDo6c2V0PGNvbnN0IFR5cGUgKj4qIFVzZWRUeXBlczsKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBEZW5zZU1hcDxjb25zdCBWYWx1ZSosIHVuc2lnbmVkPiBBbm9uVmFsdWVOdW1iZXJzOworICAgIHVuc2lnbmVkIE5leHRBbm9uVmFsdWVOdW1iZXI7CisKKyAgICBNU0lMV3JpdGVyKGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmbykgOiBGdW5jdGlvblBhc3MoSUQpLCBPdXQobyksCisgICAgICAgICBOZXh0QW5vblZhbHVlTnVtYmVyKDApIHsKKyAgICAgIFVuaXFJRCA9IDA7CisgICAgfQorCisgICAgZW51bSBWYWx1ZVR5cGUgeworICAgICAgVW5kZWZWVCwKKyAgICAgIEdsb2JhbFZULAorICAgICAgSW50ZXJuYWxWVCwKKyAgICAgIEFyZ3VtZW50VlQsCisgICAgICBMb2NhbFZULAorICAgICAgQ29uc3RWVCwKKyAgICAgIENvbnN0RXhwclZUCisgICAgfTsKKworICAgIGJvb2wgaXNWYXJpYWJsZShWYWx1ZVR5cGUgVikgeworICAgICAgcmV0dXJuIFY9PUdsb2JhbFZUIHx8IFY9PUludGVybmFsVlQgfHwgVj09QXJndW1lbnRWVCB8fCBWPT1Mb2NhbFZUOworICAgIH0KKworICAgIGJvb2wgaXNDb25zdFZhbHVlKFZhbHVlVHlwZSBWKSB7CisgICAgICByZXR1cm4gVj09Q29uc3RWVCB8fCBWPT1Db25zdEV4cHJWVDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gIk1TSUwgYmFja2VuZCI7IH0KKworICAgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuYWRkUmVxdWlyZWQ8TG9vcEluZm8+KCk7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICB9CisKKyAgICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworCisgICAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKTsKKworICAgIHZpcnR1YWwgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pOworCisgICAgdm9pZCBwcmludE1vZHVsZVN0YXJ0dXAoKTsKKworICAgIGJvb2wgaXNaZXJvVmFsdWUoY29uc3QgVmFsdWUqIFYpOworCisgICAgc3RkOjpzdHJpbmcgZ2V0VmFsdWVOYW1lKGNvbnN0IFZhbHVlKiBWKTsKKworICAgIHN0ZDo6c3RyaW5nIGdldExhYmVsTmFtZShjb25zdCBWYWx1ZSogVik7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRMYWJlbE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIE5hbWUpOworCisgICAgc3RkOjpzdHJpbmcgZ2V0Q29udk1vZG9wdChDYWxsaW5nQ29udjo6SUQgQ2FsbGluZ0NvbnZJRCk7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRBcnJheVR5cGVOYW1lKFR5cGU6OlR5cGVJRCBUeUlELCBjb25zdCBUeXBlKiBUeSk7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRQcmltaXRpdmVUeXBlTmFtZShjb25zdCBUeXBlKiBUeSwgYm9vbCBpc1NpZ25lZCk7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRGdW5jdGlvblR5cGVOYW1lKGNvbnN0IFR5cGUqIFR5KTsKKworICAgIHN0ZDo6c3RyaW5nIGdldFBvaW50ZXJUeXBlTmFtZShjb25zdCBUeXBlKiBUeSk7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRUeXBlTmFtZShjb25zdCBUeXBlKiBUeSwgYm9vbCBpc1NpZ25lZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOZXN0ZWQgPSBmYWxzZSk7CisKKyAgICBWYWx1ZVR5cGUgZ2V0VmFsdWVMb2NhdGlvbihjb25zdCBWYWx1ZSogVik7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRUeXBlUG9zdGZpeChjb25zdCBUeXBlKiBUeSwgYm9vbCBFeHBhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCA9IGZhbHNlKTsKKworICAgIHZvaWQgcHJpbnRDb252VG9QdHIoKTsKKworICAgIHZvaWQgcHJpbnRQdHJMb2FkKHVpbnQ2NF90IE4pOworCisgICAgdm9pZCBwcmludFZhbHVlUHRyTG9hZChjb25zdCBWYWx1ZSogVik7CisKKyAgICB2b2lkIHByaW50Q29uc3RMb2FkKGNvbnN0IENvbnN0YW50KiBDKTsKKworICAgIHZvaWQgcHJpbnRWYWx1ZUxvYWQoY29uc3QgVmFsdWUqIFYpOworCisgICAgdm9pZCBwcmludFZhbHVlU2F2ZShjb25zdCBWYWx1ZSogVik7CisKKyAgICB2b2lkIHByaW50QmluYXJ5SW5zdHJ1Y3Rpb24oY29uc3QgY2hhciogTmFtZSwgY29uc3QgVmFsdWUqIExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlKiBSaWdodCk7CisKKyAgICB2b2lkIHByaW50U2ltcGxlSW5zdHJ1Y3Rpb24oY29uc3QgY2hhciogSW5zdCwgY29uc3QgY2hhciogT3BlcmFuZCA9IE5VTEwpOworCisgICAgdm9pZCBwcmludFBISUNvcHkoY29uc3QgQmFzaWNCbG9jayogU3JjLCBjb25zdCBCYXNpY0Jsb2NrKiBEc3QpOworCisgICAgdm9pZCBwcmludEJyYW5jaFRvQmxvY2soY29uc3QgQmFzaWNCbG9jayogQ3VyckJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2ljQmxvY2sqIFRydWVCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrKiBGYWxzZUJCKTsKKworICAgIHZvaWQgcHJpbnRCcmFuY2hJbnN0cnVjdGlvbihjb25zdCBCcmFuY2hJbnN0KiBJbnN0KTsKKworICAgIHZvaWQgcHJpbnRTZWxlY3RJbnN0cnVjdGlvbihjb25zdCBWYWx1ZSogQ29uZCwgY29uc3QgVmFsdWUqIFZUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSogVkZhbHNlKTsKKworICAgIHZvaWQgcHJpbnRJbmRpcmVjdExvYWQoY29uc3QgVmFsdWUqIFYpOworCisgICAgdm9pZCBwcmludEluZGlyZWN0U2F2ZShjb25zdCBWYWx1ZSogUHRyLCBjb25zdCBWYWx1ZSogVmFsKTsKKworICAgIHZvaWQgcHJpbnRJbmRpcmVjdFNhdmUoY29uc3QgVHlwZSogVHkpOworCisgICAgdm9pZCBwcmludENhc3RJbnN0cnVjdGlvbih1bnNpZ25lZCBpbnQgT3AsIGNvbnN0IFZhbHVlKiBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSogVHksIGNvbnN0IFR5cGUqIFNyY1R5PTApOworCisgICAgdm9pZCBwcmludEdlcEluc3RydWN0aW9uKGNvbnN0IFZhbHVlKiBWLCBnZXBfdHlwZV9pdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXBfdHlwZV9pdGVyYXRvciBFKTsKKworICAgIHN0ZDo6c3RyaW5nIGdldENhbGxTaWduYXR1cmUoY29uc3QgRnVuY3Rpb25UeXBlKiBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uKiBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgTmFtZSk7CisKKyAgICB2b2lkIHByaW50RnVuY3Rpb25DYWxsKGNvbnN0IFZhbHVlKiBGblZhbCwgY29uc3QgSW5zdHJ1Y3Rpb24qIEluc3QpOworCisgICAgdm9pZCBwcmludEludHJpbnNpY0NhbGwoY29uc3QgSW50cmluc2ljSW5zdCogSW5zdCk7CisKKyAgICB2b2lkIHByaW50Q2FsbEluc3RydWN0aW9uKGNvbnN0IEluc3RydWN0aW9uKiBJbnN0KTsKKworICAgIHZvaWQgcHJpbnRJQ21wSW5zdHJ1Y3Rpb24odW5zaWduZWQgUHJlZGljYXRlLCBjb25zdCBWYWx1ZSogTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlKiBSaWdodCk7CisKKyAgICB2b2lkIHByaW50RkNtcEluc3RydWN0aW9uKHVuc2lnbmVkIFByZWRpY2F0ZSwgY29uc3QgVmFsdWUqIExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSogUmlnaHQpOworCisgICAgdm9pZCBwcmludEludm9rZUluc3RydWN0aW9uKGNvbnN0IEludm9rZUluc3QqIEluc3QpOworCisgICAgdm9pZCBwcmludFN3aXRjaEluc3RydWN0aW9uKGNvbnN0IFN3aXRjaEluc3QqIEluc3QpOworCisgICAgdm9pZCBwcmludFZBQXJnSW5zdHJ1Y3Rpb24oY29uc3QgVkFBcmdJbnN0KiBJbnN0KTsKKworICAgIHZvaWQgcHJpbnRBbGxvY2FJbnN0cnVjdGlvbihjb25zdCBBbGxvY2FJbnN0KiBJbnN0KTsKKworICAgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiogSW5zdCk7CisKKyAgICB2b2lkIHByaW50TG9vcChjb25zdCBMb29wKiBMKTsKKworICAgIHZvaWQgcHJpbnRCYXNpY0Jsb2NrKGNvbnN0IEJhc2ljQmxvY2sqIEJCKTsKKyAgICAKKyAgICB2b2lkIHByaW50TG9jYWxWYXJpYWJsZXMoY29uc3QgRnVuY3Rpb24mIEYpOworCisgICAgdm9pZCBwcmludEZ1bmN0aW9uQm9keShjb25zdCBGdW5jdGlvbiYgRik7CisKKyAgICB2b2lkIHByaW50Q29uc3RhbnRFeHByKGNvbnN0IENvbnN0YW50RXhwciogQ0UpOworCisgICAgdm9pZCBwcmludFN0YXRpY0luaXRpYWxpemVyTGlzdCgpOworCisgICAgdm9pZCBwcmludEZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uJiBGKTsKKworICAgIHZvaWQgcHJpbnREZWNsYXJhdGlvbnMoY29uc3QgVHlwZVN5bWJvbFRhYmxlJiBTVCk7CisKKyAgICB1bnNpZ25lZCBpbnQgZ2V0Qml0V2lkdGgoY29uc3QgVHlwZSogVHkpOworCisgICAgdm9pZCBwcmludFN0YXRpY0NvbnN0YW50KGNvbnN0IENvbnN0YW50KiBDLCB1aW50NjRfdCYgT2Zmc2V0KTsKKworICAgIHZvaWQgcHJpbnRTdGF0aWNJbml0aWFsaXplcihjb25zdCBDb25zdGFudCogQywgY29uc3Qgc3RkOjpzdHJpbmcmIE5hbWUpOworCisgICAgdm9pZCBwcmludFZhcmlhYmxlRGVmaW5pdGlvbihjb25zdCBHbG9iYWxWYXJpYWJsZSogRyk7CisKKyAgICB2b2lkIHByaW50R2xvYmFsVmFyaWFibGVzKCk7CisKKyAgICBjb25zdCBjaGFyKiBnZXRMaWJyYXJ5TmFtZShjb25zdCBGdW5jdGlvbiogRik7CisKKyAgICBjb25zdCBjaGFyKiBnZXRMaWJyYXJ5TmFtZShjb25zdCBHbG9iYWxWYXJpYWJsZSogR1YpOyAKKyAgICAKKyAgICBjb25zdCBjaGFyKiBnZXRMaWJyYXJ5Rm9yU3ltYm9sKFN0cmluZ1JlZiBOYW1lLCBib29sIGlzRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbGluZ0NvbnYpOworCisgICAgdm9pZCBwcmludEV4dGVybmFscygpOworICB9OworCit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlYWRiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNJTC9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjIz09PS0gbGliL1RhcmdldC9NU0lML01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIwkJICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTU1TSUwKK0RJUlMgPSBUYXJnZXRJbmZvCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCisKK0NvbXBpbGVDb21tb25PcHRzIDo9ICQoQ29tcGlsZUNvbW1vbk9wdHMpIC1Xbm8tZm9ybWF0CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvUkVBRE1FLlRYVCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNJTC9SRUFETUUuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTdjNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvUkVBRE1FLlRYVApAQCAtMCwwICsxLDI2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vIAorCitWZWN0b3IgaW5zdHJ1Y3Rpb25zIHN1cHBvcnQuCisKK1NodWZmbGVWZWN0b3IKK0V4dHJhY3RFbGVtZW50CitJbnNlcnRFbGVtZW50CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8gCisKK0FkZCAiT3BhcXVlVHlwZSIgdHlwZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLyAKKworInN3aXRjaCIgaW5zdHJ1Y3Rpb24gZW11bGF0aW9uIHdpdGggQ0xJICJzd2l0Y2giIGluc3RydWN0aW9uLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vIAorCitXcml0ZSBsaW5rZXIgZm9yIGV4dGVybmFsIGZ1bmN0aW9uLCBiZWNhdXNlIGZ1bmN0aW9uIGV4cG9ydCBuZWVkIHRvIGtub3cgCitkeW5hbWljIGxpYnJhcnkgd2hlcmUgZnVuY3Rpb24gbG9jYXRlZC4KKworLm1ldGhvZCBzdGF0aWMgaGlkZWJ5c2lnIHBpbnZva2VpbXBsKCJtc3ZjcnQuZGxsIiBjZGVjbCkKKyAgICB2b2lkIGZyZWUodm9pZCopIHByZXNlcnZlc2lnIHt9CisKKworCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNJTC9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMGMzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4gKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1NU0lMSW5mbworICBNU0lMVGFyZ2V0SW5mby5jcHAKKyAgKQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvVGFyZ2V0SW5mby9NU0lMVGFyZ2V0SW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvVGFyZ2V0SW5mby9NU0lMVGFyZ2V0SW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkNDI4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNJTC9UYXJnZXRJbmZvL01TSUxUYXJnZXRJbmZvLmNwcApAQCAtMCwwICsxLDI2IEBACisvLz09PS0tIE1TSUxUYXJnZXRJbmZvLmNwcCAtIE1TSUwgVGFyZ2V0IEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiTVNJTFdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitUYXJnZXQgbGx2bTo6VGhlTVNJTFRhcmdldDsKKworc3RhdGljIHVuc2lnbmVkIE1TSUxfVHJpcGxlTWF0Y2hRdWFsaXR5KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCkgeworICAvLyBUaGlzIGNsYXNzIGFsd2F5cyB3b3JrcywgYnV0IHNob3VsZG4ndCBiZSB0aGUgZGVmYXVsdCBpbiBtb3N0IGNhc2VzLgorICByZXR1cm4gMTsKK30KKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplTVNJTFRhcmdldEluZm8oKSB7IAorICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJUYXJnZXQoVGhlTVNJTFRhcmdldCwgIm1zaWwiLCAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTVNJTCBiYWNrZW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTVNJTF9UcmlwbGVNYXRjaFF1YWxpdHkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU0lML1RhcmdldEluZm8vTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TSUwvVGFyZ2V0SW5mby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGIwOTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU0lML1RhcmdldEluZm8vTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvTVNJTC9UYXJnZXRJbmZvL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTU1TSUxJbmZvCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFBGTEFHUyA9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9Bc21QcmludGVyL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjFmNGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDggQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4gKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1NU1A0MzBBc21QcmludGVyCisgIE1TUDQzMEFzbVByaW50ZXIuY3BwCisgIE1TUDQzMEluc3RQcmludGVyLmNwcAorICBNU1A0MzBNQ0luc3RMb3dlci5jcHAKKyAgKQorYWRkX2RlcGVuZGVuY2llcyhMTFZNTVNQNDMwQXNtUHJpbnRlciBNU1A0MzBDb2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9NU1A0MzBBc21QcmludGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL0FzbVByaW50ZXIvTVNQNDMwQXNtUHJpbnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmNzJiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL0FzbVByaW50ZXIvTVNQNDMwQXNtUHJpbnRlci5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8vPT09LS0gTVNQNDMwQXNtUHJpbnRlci5jcHAgLSBNU1A0MzAgTExWTSBhc3NlbWJseSB3cml0ZXIgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgcHJpbnRlciB0aGF0IGNvbnZlcnRzIGZyb20gb3VyIGludGVybmFsIHJlcHJlc2VudGF0aW9uCisvLyBvZiBtYWNoaW5lLWRlcGVuZGVudCBMTFZNIGNvZGUgdG8gdGhlIE1TUDQzMCBhc3NlbWJseSBsYW5ndWFnZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFzbS1wcmludGVyIgorI2luY2x1ZGUgIk1TUDQzMC5oIgorI2luY2x1ZGUgIk1TUDQzMEluc3RySW5mby5oIgorI2luY2x1ZGUgIk1TUDQzMEluc3RQcmludGVyLmgiCisjaW5jbHVkZSAiTVNQNDMwTUNBc21JbmZvLmgiCisjaW5jbHVkZSAiTVNQNDMwTUNJbnN0TG93ZXIuaCIKKyNpbmNsdWRlICJNU1A0MzBUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQXNtUHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3RyZWFtZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIE1TUDQzMEFzbVByaW50ZXIgOiBwdWJsaWMgQXNtUHJpbnRlciB7CisgIHB1YmxpYzoKKyAgICBNU1A0MzBBc21QcmludGVyKFRhcmdldE1hY2hpbmUgJlRNLCBNQ1N0cmVhbWVyICZTdHJlYW1lcikKKyAgICAgIDogQXNtUHJpbnRlcihUTSwgU3RyZWFtZXIpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJNU1A0MzAgQXNzZW1ibHkgUHJpbnRlciI7CisgICAgfQorCisgICAgdm9pZCBwcmludE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPLCBjb25zdCBjaGFyKiBNb2RpZmllciA9IDApOworICAgIHZvaWQgcHJpbnRTcmNNZW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgYm9vbCBQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIGJvb2wgUHJpbnRBc21NZW1vcnlPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BObywgdW5zaWduZWQgQXNtVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpFeHRyYUNvZGUsIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIEVtaXRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKTsKKyAgfTsKK30gLy8gZW5kIG9mIGFub255bW91cyBuYW1lc3BhY2UKKworCit2b2lkIE1TUDQzMEFzbVByaW50ZXI6OnByaW50T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywgY29uc3QgY2hhciAqTW9kaWZpZXIpIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBzd2l0Y2ggKE1PLmdldFR5cGUoKSkgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiTm90IGltcGxlbWVudGVkIHlldCEiKTsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fUmVnaXN0ZXI6CisgICAgTyA8PCBNU1A0MzBJbnN0UHJpbnRlcjo6Z2V0UmVnaXN0ZXJOYW1lKE1PLmdldFJlZygpKTsKKyAgICByZXR1cm47CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ltbWVkaWF0ZToKKyAgICBpZiAoIU1vZGlmaWVyIHx8IHN0cmNtcChNb2RpZmllciwgIm5vaGFzaCIpKQorICAgICAgTyA8PCAnIyc7CisgICAgTyA8PCBNTy5nZXRJbW0oKTsKKyAgICByZXR1cm47CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrOgorICAgIE8gPDwgKk1PLmdldE1CQigpLT5nZXRTeW1ib2woKTsKKyAgICByZXR1cm47CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0dsb2JhbEFkZHJlc3M6IHsKKyAgICBib29sIGlzTWVtT3AgID0gTW9kaWZpZXIgJiYgIXN0cmNtcChNb2RpZmllciwgIm1lbSIpOworICAgIHVpbnQ2NF90IE9mZnNldCA9IE1PLmdldE9mZnNldCgpOworCisgICAgLy8gSWYgdGhlIGdsb2JhbCBhZGRyZXNzIGV4cHJlc3Npb24gaXMgYSBwYXJ0IG9mIGRpc3BsYWNlbWVudCBmaWVsZCB3aXRoIGEKKyAgICAvLyByZWdpc3RlciBiYXNlLCB3ZSBzaG91bGQgbm90IGVtaXQgYW55IHByZWZpeCBzeW1ib2wgaGVyZSwgZS5nLgorICAgIC8vICAgbW92LncgJmZvbywgcjEKKyAgICAvLyB2cworICAgIC8vICAgbW92LncgZ2xiKHIxKSwgcjIKKyAgICAvLyBPdGhlcndpc2UgKCEpIG1zcDQzMC1hcyB3aWxsIHNpbGVudGx5IG1pc2NvbXBpbGUgdGhlIG91dHB1dCA6KAorICAgIGlmICghTW9kaWZpZXIgfHwgc3RyY21wKE1vZGlmaWVyLCAibm9oYXNoIikpCisgICAgICBPIDw8IChpc01lbU9wID8gJyYnIDogJyMnKTsKKyAgICBpZiAoT2Zmc2V0KQorICAgICAgTyA8PCAnKCcgPDwgT2Zmc2V0IDw8ICcrJzsKKworICAgIE8gPDwgKk1hbmctPmdldFN5bWJvbChNTy5nZXRHbG9iYWwoKSk7CisKKyAgICBpZiAoT2Zmc2V0KQorICAgICAgTyA8PCAnKSc7CisKKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fRXh0ZXJuYWxTeW1ib2w6IHsKKyAgICBib29sIGlzTWVtT3AgID0gTW9kaWZpZXIgJiYgIXN0cmNtcChNb2RpZmllciwgIm1lbSIpOworICAgIE8gPDwgKGlzTWVtT3AgPyAnJicgOiAnIycpOworICAgIE8gPDwgTUFJLT5nZXRHbG9iYWxQcmVmaXgoKSA8PCBNTy5nZXRTeW1ib2xOYW1lKCk7CisgICAgcmV0dXJuOworICB9CisgIH0KK30KKwordm9pZCBNU1A0MzBBc21QcmludGVyOjpwcmludFNyY01lbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJkJhc2UgPSBNSS0+Z2V0T3BlcmFuZChPcE51bSk7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZEaXNwID0gTUktPmdldE9wZXJhbmQoT3BOdW0rMSk7CisKKyAgLy8gUHJpbnQgZGlzcGxhY2VtZW50IGZpcnN0CisKKyAgLy8gSW1tIGhlcmUgaXMgaW4gZmFjdCBnbG9iYWwgYWRkcmVzcyAtIHByaW50IGV4dHJhIG1vZGlmaWVyLgorICBpZiAoRGlzcC5pc0ltbSgpICYmICFCYXNlLmdldFJlZygpKQorICAgIE8gPDwgJyYnOworICBwcmludE9wZXJhbmQoTUksIE9wTnVtKzEsIE8sICJub2hhc2giKTsKKworICAvLyBQcmludCByZWdpc3RlciBiYXNlIGZpZWxkCisgIGlmIChCYXNlLmdldFJlZygpKSB7CisgICAgTyA8PCAnKCc7CisgICAgcHJpbnRPcGVyYW5kKE1JLCBPcE51bSwgTyk7CisgICAgTyA8PCAnKSc7CisgIH0KK30KKworLy8vIFByaW50QXNtT3BlcmFuZCAtIFByaW50IG91dCBhbiBvcGVyYW5kIGZvciBhbiBpbmxpbmUgYXNtIGV4cHJlc3Npb24uCisvLy8KK2Jvb2wgTVNQNDMwQXNtUHJpbnRlcjo6UHJpbnRBc21PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRXh0cmFDb2RlLCByYXdfb3N0cmVhbSAmTykgeworICAvLyBEb2VzIHRoaXMgYXNtIG9wZXJhbmQgaGF2ZSBhIHNpbmdsZSBsZXR0ZXIgb3BlcmFuZCBtb2RpZmllcj8KKyAgaWYgKEV4dHJhQ29kZSAmJiBFeHRyYUNvZGVbMF0pCisgICAgcmV0dXJuIHRydWU7IC8vIFVua25vd24gbW9kaWZpZXIuCisKKyAgcHJpbnRPcGVyYW5kKE1JLCBPcE5vLCBPKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1TUDQzMEFzbVByaW50ZXI6OlByaW50QXNtTWVtb3J5T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BObywgdW5zaWduZWQgQXNtVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGlmIChFeHRyYUNvZGUgJiYgRXh0cmFDb2RlWzBdKSB7CisgICAgcmV0dXJuIHRydWU7IC8vIFVua25vd24gbW9kaWZpZXIuCisgIH0KKyAgcHJpbnRTcmNNZW1PcGVyYW5kKE1JLCBPcE5vLCBPKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwordm9pZCBNU1A0MzBBc21QcmludGVyOjpFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSkgeworICBNU1A0MzBNQ0luc3RMb3dlciBNQ0luc3RMb3dlcmluZyhPdXRDb250ZXh0LCAqTWFuZywgKnRoaXMpOworCisgIE1DSW5zdCBUbXBJbnN0OworICBNQ0luc3RMb3dlcmluZy5Mb3dlcihNSSwgVG1wSW5zdCk7CisgIE91dFN0cmVhbWVyLkVtaXRJbnN0cnVjdGlvbihUbXBJbnN0KTsKK30KKworc3RhdGljIE1DSW5zdFByaW50ZXIgKmNyZWF0ZU1TUDQzME1DSW5zdFByaW50ZXIoY29uc3QgVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3ludGF4VmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtSW5mbyAmTUFJKSB7CisgIGlmIChTeW50YXhWYXJpYW50ID09IDApCisgICAgcmV0dXJuIG5ldyBNU1A0MzBJbnN0UHJpbnRlcihNQUkpOworICByZXR1cm4gMDsKK30KKworLy8gRm9yY2Ugc3RhdGljIGluaXRpYWxpemF0aW9uLgorZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplTVNQNDMwQXNtUHJpbnRlcigpIHsKKyAgUmVnaXN0ZXJBc21QcmludGVyPE1TUDQzMEFzbVByaW50ZXI+IFgoVGhlTVNQNDMwVGFyZ2V0KTsKKyAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNJbnN0UHJpbnRlcihUaGVNU1A0MzBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTVNQNDMwTUNJbnN0UHJpbnRlcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9Bc21QcmludGVyL01TUDQzMEluc3RQcmludGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL0FzbVByaW50ZXIvTVNQNDMwSW5zdFByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNWQ0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9Bc21QcmludGVyL01TUDQzMEluc3RQcmludGVyLmNwcApAQCAtMCwwICsxLDExNiBAQAorLy89PT0tLSBNU1A0MzBJbnN0UHJpbnRlci5jcHAgLSBDb252ZXJ0IE1TUDQzMCBNQ0luc3QgdG8gYXNzZW1ibHkgc3ludGF4IC0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHByaW50cyBhbiBNU1A0MzAgTUNJbnN0IHRvIGEgLnMgZmlsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFzbS1wcmludGVyIgorI2luY2x1ZGUgIk1TUDQzMC5oIgorI2luY2x1ZGUgIk1TUDQzMEluc3RySW5mby5oIgorI2luY2x1ZGUgIk1TUDQzMEluc3RQcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworCisvLyBJbmNsdWRlIHRoZSBhdXRvLWdlbmVyYXRlZCBwb3J0aW9uIG9mIHRoZSBhc3NlbWJseSB3cml0ZXIuCisjZGVmaW5lIE1hY2hpbmVJbnN0ciBNQ0luc3QKKyNpbmNsdWRlICJNU1A0MzBHZW5Bc21Xcml0ZXIuaW5jIgorI3VuZGVmIE1hY2hpbmVJbnN0cgorCit2b2lkIE1TUDQzMEluc3RQcmludGVyOjpwcmludEluc3QoY29uc3QgTUNJbnN0ICpNSSwgcmF3X29zdHJlYW0gJk8pIHsKKyAgcHJpbnRJbnN0cnVjdGlvbihNSSwgTyk7Cit9CisKK3ZvaWQgTVNQNDMwSW5zdFByaW50ZXI6OnByaW50UENSZWxJbW1PcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk9wID0gTUktPmdldE9wZXJhbmQoT3BObyk7CisgIGlmIChPcC5pc0ltbSgpKQorICAgIE8gPDwgT3AuZ2V0SW1tKCk7CisgIGVsc2UgeworICAgIGFzc2VydChPcC5pc0V4cHIoKSAmJiAidW5rbm93biBwY3JlbCBpbW1lZGlhdGUgb3BlcmFuZCIpOworICAgIE8gPDwgKk9wLmdldEV4cHIoKTsKKyAgfQorfQorCit2b2lkIE1TUDQzMEluc3RQcmludGVyOjpwcmludE9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywgY29uc3QgY2hhciAqTW9kaWZpZXIpIHsKKyAgYXNzZXJ0KChNb2RpZmllciA9PSAwIHx8IE1vZGlmaWVyWzBdID09IDApICYmICJObyBtb2RpZmllcnMgc3VwcG9ydGVkIik7CisgIGNvbnN0IE1DT3BlcmFuZCAmT3AgPSBNSS0+Z2V0T3BlcmFuZChPcE5vKTsKKyAgaWYgKE9wLmlzUmVnKCkpIHsKKyAgICBPIDw8IGdldFJlZ2lzdGVyTmFtZShPcC5nZXRSZWcoKSk7CisgIH0gZWxzZSBpZiAoT3AuaXNJbW0oKSkgeworICAgIE8gPDwgJyMnIDw8IE9wLmdldEltbSgpOworICB9IGVsc2UgeworICAgIGFzc2VydChPcC5pc0V4cHIoKSAmJiAidW5rbm93biBvcGVyYW5kIGtpbmQgaW4gcHJpbnRPcGVyYW5kIik7CisgICAgTyA8PCAnIycgPDwgKk9wLmdldEV4cHIoKTsKKyAgfQorfQorCit2b2lkIE1TUDQzMEluc3RQcmludGVyOjpwcmludFNyY01lbU9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllcikgeworICBjb25zdCBNQ09wZXJhbmQgJkJhc2UgPSBNSS0+Z2V0T3BlcmFuZChPcE5vKTsKKyAgY29uc3QgTUNPcGVyYW5kICZEaXNwID0gTUktPmdldE9wZXJhbmQoT3BObysxKTsKKworICAvLyBQcmludCBkaXNwbGFjZW1lbnQgZmlyc3QKKworICAvLyBJZiB0aGUgZ2xvYmFsIGFkZHJlc3MgZXhwcmVzc2lvbiBpcyBhIHBhcnQgb2YgZGlzcGxhY2VtZW50IGZpZWxkIHdpdGggYQorICAvLyByZWdpc3RlciBiYXNlLCB3ZSBzaG91bGQgbm90IGVtaXQgYW55IHByZWZpeCBzeW1ib2wgaGVyZSwgZS5nLgorICAvLyAgIG1vdi53ICZmb28sIHIxCisgIC8vIHZzCisgIC8vICAgbW92LncgZ2xiKHIxKSwgcjIKKyAgLy8gT3RoZXJ3aXNlICghKSBtc3A0MzAtYXMgd2lsbCBzaWxlbnRseSBtaXNjb21waWxlIHRoZSBvdXRwdXQgOigKKyAgaWYgKCFCYXNlLmdldFJlZygpKQorICAgIE8gPDwgJyYnOworCisgIGlmIChEaXNwLmlzRXhwcigpKQorICAgIE8gPDwgKkRpc3AuZ2V0RXhwcigpOworICBlbHNlIHsKKyAgICBhc3NlcnQoRGlzcC5pc0ltbSgpICYmICJFeHBlY3RlZCBpbW1lZGlhdGUgaW4gZGlzcGxhY2VtZW50IGZpZWxkIik7CisgICAgTyA8PCBEaXNwLmdldEltbSgpOworICB9CisKKyAgLy8gUHJpbnQgcmVnaXN0ZXIgYmFzZSBmaWVsZAorICBpZiAoQmFzZS5nZXRSZWcoKSkKKyAgICBPIDw8ICcoJyA8PCBnZXRSZWdpc3Rlck5hbWUoQmFzZS5nZXRSZWcoKSkgPDwgJyknOworfQorCit2b2lkIE1TUDQzMEluc3RQcmludGVyOjpwcmludENDT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgdW5zaWduZWQgQ0MgPSBNSS0+Z2V0T3BlcmFuZChPcE5vKS5nZXRJbW0oKTsKKworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6CisgICBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBDQyBjb2RlIik7CisgICBicmVhazsKKyAgY2FzZSBNU1A0MzBDQzo6Q09ORF9FOgorICAgTyA8PCAiZXEiOworICAgYnJlYWs7CisgIGNhc2UgTVNQNDMwQ0M6OkNPTkRfTkU6CisgICBPIDw8ICJuZSI7CisgICBicmVhazsKKyAgY2FzZSBNU1A0MzBDQzo6Q09ORF9IUzoKKyAgIE8gPDwgImhzIjsKKyAgIGJyZWFrOworICBjYXNlIE1TUDQzMENDOjpDT05EX0xPOgorICAgTyA8PCAibG8iOworICAgYnJlYWs7CisgIGNhc2UgTVNQNDMwQ0M6OkNPTkRfR0U6CisgICBPIDw8ICJnZSI7CisgICBicmVhazsKKyAgY2FzZSBNU1A0MzBDQzo6Q09ORF9MOgorICAgTyA8PCAnbCc7CisgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9NU1A0MzBJbnN0UHJpbnRlci5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9NU1A0MzBJbnN0UHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZTFjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9Bc21QcmludGVyL01TUDQzMEluc3RQcmludGVyLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tLSBNU1A0MzBJbnN0UHJpbnRlci5oIC0gQ29udmVydCBNU1A0MzAgTUNJbnN0IHRvIGFzc2VtYmx5IHN5bnRheCAtLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHByaW50cyBhIE1TUDQzMCBNQ0luc3QgdG8gYSAucyBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTVNQNDMwSU5TVFBSSU5URVJfSAorI2RlZmluZSBNU1A0MzBJTlNUUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdFByaW50ZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNQ09wZXJhbmQ7CisKKyAgY2xhc3MgTVNQNDMwSW5zdFByaW50ZXIgOiBwdWJsaWMgTUNJbnN0UHJpbnRlciB7CisgIHB1YmxpYzoKKyAgICBNU1A0MzBJbnN0UHJpbnRlcihjb25zdCBNQ0FzbUluZm8gJk1BSSkgOiBNQ0luc3RQcmludGVyKE1BSSkgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBwcmludEluc3QoY29uc3QgTUNJbnN0ICpNSSwgcmF3X29zdHJlYW0gJk8pOworCisgICAgLy8gQXV0b2dlbmVyYXRlZCBieSB0YmxnZW4uCisgICAgdm9pZCBwcmludEluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAqTUksIHJhd19vc3RyZWFtICZPKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0UmVnaXN0ZXJOYW1lKHVuc2lnbmVkIFJlZ05vKTsKKworICAgIHZvaWQgcHJpbnRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyID0gMCk7CisgICAgdm9pZCBwcmludFBDUmVsSW1tT3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludFNyY01lbU9wZXJhbmQoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXIgPSAwKTsKKyAgICB2b2lkIHByaW50Q0NPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKTsKKworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL0FzbVByaW50ZXIvTVNQNDMwTUNJbnN0TG93ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9NU1A0MzBNQ0luc3RMb3dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkOWExMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL0FzbVByaW50ZXIvTVNQNDMwTUNJbnN0TG93ZXIuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvLz09PS0tIE1TUDQzME1DSW5zdExvd2VyLmNwcCAtIENvbnZlcnQgTVNQNDMwIE1hY2hpbmVJbnN0ciB0byBhbiBNQ0luc3QtLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHRvIGxvd2VyIE1TUDQzMCBNYWNoaW5lSW5zdHJzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcKKy8vIE1DSW5zdCByZWNvcmRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJNU1A0MzBNQ0luc3RMb3dlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Bc21QcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNQ1N5bWJvbCAqTVNQNDMwTUNJbnN0TG93ZXI6OgorR2V0R2xvYmFsQWRkcmVzc1N5bWJvbChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIGNvbnN0IHsKKyAgc3dpdGNoIChNTy5nZXRUYXJnZXRGbGFncygpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdGFyZ2V0IGZsYWcgb24gR1Ygb3BlcmFuZCIpOworICBjYXNlIDA6IGJyZWFrOworICB9CisKKyAgcmV0dXJuIFByaW50ZXIuTWFuZy0+Z2V0U3ltYm9sKE1PLmdldEdsb2JhbCgpKTsKK30KKworTUNTeW1ib2wgKk1TUDQzME1DSW5zdExvd2VyOjoKK0dldEV4dGVybmFsU3ltYm9sU3ltYm9sKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgY29uc3QgeworICBzd2l0Y2ggKE1PLmdldFRhcmdldEZsYWdzKCkpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gdGFyZ2V0IGZsYWcgb24gR1Ygb3BlcmFuZCIpOworICBjYXNlIDA6IGJyZWFrOworICB9CisKKyAgcmV0dXJuIFByaW50ZXIuR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woTU8uZ2V0U3ltYm9sTmFtZSgpKTsKK30KKworTUNTeW1ib2wgKk1TUDQzME1DSW5zdExvd2VyOjoKK0dldEp1bXBUYWJsZVN5bWJvbChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIGNvbnN0IHsKKyAgU21hbGxTdHJpbmc8MjU2PiBOYW1lOworICByYXdfc3ZlY3Rvcl9vc3RyZWFtKE5hbWUpIDw8IFByaW50ZXIuTUFJLT5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCkgPDwgIkpUSSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBQcmludGVyLmdldEZ1bmN0aW9uTnVtYmVyKCkgPDwgJ18nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTU8uZ2V0SW5kZXgoKTsKKworICBzd2l0Y2ggKE1PLmdldFRhcmdldEZsYWdzKCkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB0YXJnZXQgZmxhZyBvbiBHViBvcGVyYW5kIik7CisgIGNhc2UgMDogYnJlYWs7CisgIH0KKworICAvLyBDcmVhdGUgYSBzeW1ib2wgZm9yIHRoZSBuYW1lLgorICByZXR1cm4gQ3R4LkdldE9yQ3JlYXRlU3ltYm9sKE5hbWUuc3RyKCkpOworfQorCitNQ1N5bWJvbCAqTVNQNDMwTUNJbnN0TG93ZXI6OgorR2V0Q29uc3RhbnRQb29sSW5kZXhTeW1ib2woY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdCB7CisgIFNtYWxsU3RyaW5nPDI1Nj4gTmFtZTsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbShOYW1lKSA8PCBQcmludGVyLk1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJDUEkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgUHJpbnRlci5nZXRGdW5jdGlvbk51bWJlcigpIDw8ICdfJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE1PLmdldEluZGV4KCk7CisKKyAgc3dpdGNoIChNTy5nZXRUYXJnZXRGbGFncygpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdGFyZ2V0IGZsYWcgb24gR1Ygb3BlcmFuZCIpOworICBjYXNlIDA6IGJyZWFrOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc3ltYm9sIGZvciB0aGUgbmFtZS4KKyAgcmV0dXJuIEN0eC5HZXRPckNyZWF0ZVN5bWJvbChOYW1lLnN0cigpKTsKK30KKworTUNTeW1ib2wgKk1TUDQzME1DSW5zdExvd2VyOjoKK0dldEJsb2NrQWRkcmVzc1N5bWJvbChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIGNvbnN0IHsKKyAgc3dpdGNoIChNTy5nZXRUYXJnZXRGbGFncygpKSB7CisgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIHRhcmdldCBmbGFnIG9uIEdWIG9wZXJhbmQiKTsKKyAgY2FzZSAwOiBicmVhazsKKyAgfQorCisgIHJldHVybiBQcmludGVyLkdldEJsb2NrQWRkcmVzc1N5bWJvbChNTy5nZXRCbG9ja0FkZHJlc3MoKSk7Cit9CisKK01DT3BlcmFuZCBNU1A0MzBNQ0luc3RMb3dlcjo6CitMb3dlclN5bWJvbE9wZXJhbmQoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLCBNQ1N5bWJvbCAqU3ltKSBjb25zdCB7CisgIC8vIEZJWE1FOiBXZSB3b3VsZCBsaWtlIGFuIGVmZmljaWVudCBmb3JtIGZvciB0aGlzLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGEKKyAgLy8gbG90IG9mIGV4dHJhIHVuaXF1aW5nLgorICBjb25zdCBNQ0V4cHIgKkV4cHIgPSBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShTeW0sIEN0eCk7CisKKyAgc3dpdGNoIChNTy5nZXRUYXJnZXRGbGFncygpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdGFyZ2V0IGZsYWcgb24gR1Ygb3BlcmFuZCIpOworICBjYXNlIDA6IGJyZWFrOworICB9CisKKyAgaWYgKCFNTy5pc0pUSSgpICYmIE1PLmdldE9mZnNldCgpKQorICAgIEV4cHIgPSBNQ0JpbmFyeUV4cHI6OkNyZWF0ZUFkZChFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnN0YW50RXhwcjo6Q3JlYXRlKE1PLmdldE9mZnNldCgpLCBDdHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdHgpOworICByZXR1cm4gTUNPcGVyYW5kOjpDcmVhdGVFeHByKEV4cHIpOworfQorCit2b2lkIE1TUDQzME1DSW5zdExvd2VyOjpMb3dlcihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBNQ0luc3QgJk91dE1JKSBjb25zdCB7CisgIE91dE1JLnNldE9wY29kZShNSS0+Z2V0T3Bjb2RlKCkpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKworICAgIE1DT3BlcmFuZCBNQ09wOworICAgIHN3aXRjaCAoTU8uZ2V0VHlwZSgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIE1JLT5kdW1wKCk7CisgICAgICBhc3NlcnQoMCAmJiAidW5rbm93biBvcGVyYW5kIHR5cGUiKTsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19SZWdpc3RlcjoKKyAgICAgIC8vIElnbm9yZSBhbGwgaW1wbGljaXQgcmVnaXN0ZXIgb3BlcmFuZHMuCisgICAgICBpZiAoTU8uaXNJbXBsaWNpdCgpKSBjb250aW51ZTsKKyAgICAgIE1DT3AgPSBNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhNTy5nZXRSZWcoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgICBNQ09wID0gTUNPcGVyYW5kOjpDcmVhdGVJbW0oTU8uZ2V0SW1tKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fTWFjaGluZUJhc2ljQmxvY2s6CisgICAgICBNQ09wID0gTUNPcGVyYW5kOjpDcmVhdGVFeHByKE1DU3ltYm9sUmVmRXhwcjo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgIE1PLmdldE1CQigpLT5nZXRTeW1ib2woKSwgQ3R4KSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOgorICAgICAgTUNPcCA9IExvd2VyU3ltYm9sT3BlcmFuZChNTywgR2V0R2xvYmFsQWRkcmVzc1N5bWJvbChNTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fRXh0ZXJuYWxTeW1ib2w6CisgICAgICBNQ09wID0gTG93ZXJTeW1ib2xPcGVyYW5kKE1PLCBHZXRFeHRlcm5hbFN5bWJvbFN5bWJvbChNTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgICBNQ09wID0gTG93ZXJTeW1ib2xPcGVyYW5kKE1PLCBHZXRKdW1wVGFibGVTeW1ib2woTU8pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0NvbnN0YW50UG9vbEluZGV4OgorICAgICAgTUNPcCA9IExvd2VyU3ltYm9sT3BlcmFuZChNTywgR2V0Q29uc3RhbnRQb29sSW5kZXhTeW1ib2woTU8pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0Jsb2NrQWRkcmVzczoKKyAgICAgIE1DT3AgPSBMb3dlclN5bWJvbE9wZXJhbmQoTU8sIEdldEJsb2NrQWRkcmVzc1N5bWJvbChNTykpOworICAgIH0KKworICAgIE91dE1JLmFkZE9wZXJhbmQoTUNPcCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL0FzbVByaW50ZXIvTVNQNDMwTUNJbnN0TG93ZXIuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL0FzbVByaW50ZXIvTVNQNDMwTUNJbnN0TG93ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM3Njk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9NU1A0MzBNQ0luc3RMb3dlci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vPT09LS0gTVNQNDMwTUNJbnN0TG93ZXIuaCAtIExvd2VyIE1hY2hpbmVJbnN0ciB0byBNQ0luc3QgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTVNQNDMwX01DSU5TVExPV0VSX0gKKyNkZWZpbmUgTVNQNDMwX01DSU5TVExPV0VSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEFzbVByaW50ZXI7CisgIGNsYXNzIE1DQXNtSW5mbzsKKyAgY2xhc3MgTUNDb250ZXh0OworICBjbGFzcyBNQ0luc3Q7CisgIGNsYXNzIE1DT3BlcmFuZDsKKyAgY2xhc3MgTUNTeW1ib2w7CisgIGNsYXNzIE1hY2hpbmVJbnN0cjsKKyAgY2xhc3MgTWFjaGluZU1vZHVsZUluZm9NYWNoTzsKKyAgY2xhc3MgTWFjaGluZU9wZXJhbmQ7CisgIGNsYXNzIE1hbmdsZXI7CisKKyAgLy8vIE1TUDQzME1DSW5zdExvd2VyIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGxvd2VyIGFuIE1hY2hpbmVJbnN0cgorICAvLy8gaW50byBhbiBNQ0luc3QuCitjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBNU1A0MzBNQ0luc3RMb3dlciB7CisgIE1DQ29udGV4dCAmQ3R4OworICBNYW5nbGVyICZNYW5nOworCisgIEFzbVByaW50ZXIgJlByaW50ZXI7CitwdWJsaWM6CisgIE1TUDQzME1DSW5zdExvd2VyKE1DQ29udGV4dCAmY3R4LCBNYW5nbGVyICZtYW5nLCBBc21QcmludGVyICZwcmludGVyKQorICAgIDogQ3R4KGN0eCksIE1hbmcobWFuZyksIFByaW50ZXIocHJpbnRlcikge30KKyAgdm9pZCBMb3dlcihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBNQ0luc3QgJk91dE1JKSBjb25zdDsKKworICBNQ09wZXJhbmQgTG93ZXJTeW1ib2xPcGVyYW5kKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywgTUNTeW1ib2wgKlN5bSkgY29uc3Q7CisKKyAgTUNTeW1ib2wgKkdldEdsb2JhbEFkZHJlc3NTeW1ib2woY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdDsKKyAgTUNTeW1ib2wgKkdldEV4dGVybmFsU3ltYm9sU3ltYm9sKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgY29uc3Q7CisgIE1DU3ltYm9sICpHZXRKdW1wVGFibGVTeW1ib2woY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdDsKKyAgTUNTeW1ib2wgKkdldENvbnN0YW50UG9vbEluZGV4U3ltYm9sKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgY29uc3Q7CisgIE1DU3ltYm9sICpHZXRCbG9ja0FkZHJlc3NTeW1ib2woY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdDsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9Bc21QcmludGVyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI5M2FiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RhcmdldC9NU1A0MzAvQXNtUHJpbnRlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNTVNQNDMwQXNtUHJpbnRlcgorCisjIEhhY2s6IHdlIG5lZWQgdG8gaW5jbHVkZSAnbWFpbicgTVNQNDMwIHRhcmdldCBkaXJlY3RvcnkgdG8gZ3JhYiBwcml2YXRlIGhlYWRlcnMKK0NQUC5GbGFncyArPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Y2MGQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNSBAQAorc2V0KExMVk1fVEFSR0VUX0RFRklOSVRJT05TIE1TUDQzMC50ZCkKKwordGFibGVnZW4oTVNQNDMwR2VuUmVnaXN0ZXJJbmZvLmguaW5jIC1nZW4tcmVnaXN0ZXItZGVzYy1oZWFkZXIpCit0YWJsZWdlbihNU1A0MzBHZW5SZWdpc3Rlck5hbWVzLmluYyAtZ2VuLXJlZ2lzdGVyLWVudW1zKQordGFibGVnZW4oTVNQNDMwR2VuUmVnaXN0ZXJJbmZvLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MpCit0YWJsZWdlbihNU1A0MzBHZW5JbnN0ck5hbWVzLmluYyAtZ2VuLWluc3RyLWVudW1zKQordGFibGVnZW4oTVNQNDMwR2VuSW5zdHJJbmZvLmluYyAtZ2VuLWluc3RyLWRlc2MpCit0YWJsZWdlbihNU1A0MzBHZW5Bc21Xcml0ZXIuaW5jIC1nZW4tYXNtLXdyaXRlcikKK3RhYmxlZ2VuKE1TUDQzMEdlbkRBR0lTZWwuaW5jIC1nZW4tZGFnLWlzZWwpCit0YWJsZWdlbihNU1A0MzBHZW5DYWxsaW5nQ29udi5pbmMgLWdlbi1jYWxsaW5nY29udikKK3RhYmxlZ2VuKE1TUDQzMEdlblN1YnRhcmdldC5pbmMgLWdlbi1zdWJ0YXJnZXQpCisKK2FkZF9sbHZtX3RhcmdldChNU1A0MzBDb2RlR2VuCisgIE1TUDQzMEJyYW5jaFNlbGVjdG9yLmNwcAorICBNU1A0MzBJU2VsREFHVG9EQUcuY3BwCisgIE1TUDQzMElTZWxMb3dlcmluZy5jcHAKKyAgTVNQNDMwSW5zdHJJbmZvLmNwcAorICBNU1A0MzBNQ0FzbUluZm8uY3BwCisgIE1TUDQzMFJlZ2lzdGVySW5mby5jcHAKKyAgTVNQNDMwU3VidGFyZ2V0LmNwcAorICBNU1A0MzBUYXJnZXRNYWNoaW5lLmNwcAorICBNU1A0MzBTZWxlY3Rpb25EQUdJbmZvLmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoTExWTU1TUDQzMENvZGVHZW4gTExWTVNlbGVjdGlvbkRBRykKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMC5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MjExOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vPT0tLSBNU1A0MzAuaCAtIFRvcC1sZXZlbCBpbnRlcmZhY2UgZm9yIE1TUDQzMCByZXByZXNlbnRhdGlvbiAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBlbnRyeSBwb2ludHMgZm9yIGdsb2JhbCBmdW5jdGlvbnMgZGVmaW5lZCBpbgorLy8gdGhlIExMVk0gTVNQNDMwIGJhY2tlbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9NU1A0MzBfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9NU1A0MzBfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgTVNQNDMwQ0MgeworICAvLyBNU1A0MzAgc3BlY2lmaWMgY29uZGl0aW9uIGNvZGUuCisgIGVudW0gQ29uZENvZGVzIHsKKyAgICBDT05EX0UgID0gMCwgIC8vIGFrYSBDT05EX1oKKyAgICBDT05EX05FID0gMSwgIC8vIGFrYSBDT05EX05aCisgICAgQ09ORF9IUyA9IDIsICAvLyBha2EgQ09ORF9DCisgICAgQ09ORF9MTyA9IDMsICAvLyBha2EgQ09ORF9OQworICAgIENPTkRfR0UgPSA0LAorICAgIENPTkRfTCAgPSA1LAorCisgICAgQ09ORF9JTlZBTElEID0gLTEKKyAgfTsKK30KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNU1A0MzBUYXJnZXRNYWNoaW5lOworICBjbGFzcyBGdW5jdGlvblBhc3M7CisgIGNsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKworICBGdW5jdGlvblBhc3MgKmNyZWF0ZU1TUDQzMElTZWxEYWcoTVNQNDMwVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNU1A0MzBCcmFuY2hTZWxlY3Rpb25QYXNzKCk7CisKKyAgZXh0ZXJuIFRhcmdldCBUaGVNU1A0MzBUYXJnZXQ7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtOworCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciBNU1A0MzAgcmVnaXN0ZXJzLgorLy8gVGhpcyBkZWZpbmVzIGEgbWFwcGluZyBmcm9tIHJlZ2lzdGVyIG5hbWUgdG8gcmVnaXN0ZXIgbnVtYmVyLgorI2luY2x1ZGUgIk1TUDQzMEdlblJlZ2lzdGVyTmFtZXMuaW5jIgorCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciB0aGUgTVNQNDMwIGluc3RydWN0aW9ucy4KKyNpbmNsdWRlICJNU1A0MzBHZW5JbnN0ck5hbWVzLmluYyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzAudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzAudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwOGUzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMC50ZApAQCAtMCwwICsxLDY1IEBACisvLz09PS0gTVNQNDMwLnRkIC0gRGVzY3JpYmUgdGhlIE1TUDQzMCBUYXJnZXQgTWFjaGluZSAtLS0tLS0tLS0qLSB0YmxnZW4gLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCBlbnRyeSBwb2ludCBmb3IgdGhlIE1TUDQzMCB0YXJnZXQuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldC50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFN1YnRhcmdldCBGZWF0dXJlcy4gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIEZlYXR1cmVYCisgOiBTdWJ0YXJnZXRGZWF0dXJlPCJleHQiLCAiRXh0ZW5kZWRJbnN0cyIsICJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBNU1A0MzAtWCBleHRlbnNpb25zIj47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNU1A0MzAgc3VwcG9ydGVkIHByb2Nlc3NvcnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworY2xhc3MgUHJvYzxzdHJpbmcgTmFtZSwgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBGZWF0dXJlcz4KKyA6IFByb2Nlc3NvcjxOYW1lLCBOb0l0aW5lcmFyaWVzLCBGZWF0dXJlcz47CisKK2RlZiA6IFByb2M8ImdlbmVyaWMiLCAgICAgICAgIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJlZ2lzdGVyIEZpbGUgRGVzY3JpcHRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgIk1TUDQzMFJlZ2lzdGVySW5mby50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENhbGxpbmcgQ29udmVudGlvbiBEZXNjcmlwdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW5jbHVkZSAiTVNQNDMwQ2FsbGluZ0NvbnYudGQiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBEZXNjcmlwdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgIk1TUDQzMEluc3RySW5mby50ZCIKKworZGVmIE1TUDQzMEluc3RySW5mbyA6IEluc3RySW5mbzsKKworZGVmIE1TUDQzMEluc3RQcmludGVyIDogQXNtV3JpdGVyIHsKKyAgc3RyaW5nIEFzbVdyaXRlckNsYXNzTmFtZSAgPSAiSW5zdFByaW50ZXIiOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGFyZ2V0IERlY2xhcmF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgTVNQNDMwIDogVGFyZ2V0IHsKKyAgbGV0IEluc3RydWN0aW9uU2V0ID0gTVNQNDMwSW5zdHJJbmZvOworICBsZXQgQXNzZW1ibHlXcml0ZXJzID0gW01TUDQzMEluc3RQcmludGVyXTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwQnJhbmNoU2VsZWN0b3IuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwQnJhbmNoU2VsZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZDY5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBCcmFuY2hTZWxlY3Rvci5jcHAKQEAgLTAsMCArMSwxODAgQEAKKy8vPT09LS0gTVNQNDMwQnJhbmNoU2VsZWN0b3IuY3BwIC0gRW1pdCBsb25nIGNvbmRpdGlvbmFsIGJyYW5jaGVzLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgcGFzcyB0aGF0IHNjYW5zIGEgbWFjaGluZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2gKKy8vIGNvbmRpdGlvbmFsIGJyYW5jaGVzIG5lZWQgbW9yZSB0aGFuIDEwIGJpdHMgb2YgZGlzcGxhY2VtZW50IHRvIHJlYWNoIHRoZWlyCisvLyB0YXJnZXQgYmFzaWMgYmxvY2suICBJdCBkb2VzIHRoaXMgaW4gdHdvIHBhc3NlczsgYSBjYWxjdWxhdGlvbiBvZiBiYXNpYyBibG9jaworLy8gcG9zaXRpb25zIHBhc3MsIGFuZCBhIGJyYW5jaCBwc3VlZG8gb3AgdG8gbWFjaGluZSBicmFuY2ggb3Bjb2RlIHBhc3MuICBUaGlzCisvLyBwYXNzIHNob3VsZCBiZSBydW4gbGFzdCwganVzdCBiZWZvcmUgdGhlIGFzc2VtYmx5IHByaW50ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJtc3A0MzAtYnJhbmNoLXNlbGVjdCIKKyNpbmNsdWRlICJNU1A0MzAuaCIKKyNpbmNsdWRlICJNU1A0MzBJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUV4cGFuZGVkLCAiTnVtYmVyIG9mIGJyYW5jaGVzIGV4cGFuZGVkIHRvIGxvbmcgZm9ybWF0Iik7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBNU1A0MzBCU2VsIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOworICAgIE1TUDQzMEJTZWwoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICAvLy8gQmxvY2tTaXplcyAtIFRoZSBzaXplcyBvZiB0aGUgYmFzaWMgYmxvY2tzIGluIHRoZSBmdW5jdGlvbi4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gQmxvY2tTaXplczsKKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIk1TUDQzMCBCcmFuY2ggU2VsZWN0b3IiOworICAgIH0KKyAgfTsKKyAgY2hhciBNU1A0MzBCU2VsOjpJRCA9IDA7Cit9CisKKy8vLyBjcmVhdGVNU1A0MzBCcmFuY2hTZWxlY3Rpb25QYXNzIC0gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgQnJhbmNoCisvLy8gU2VsZWN0aW9uIFBhc3MKKy8vLworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVNU1A0MzBCcmFuY2hTZWxlY3Rpb25QYXNzKCkgeworICByZXR1cm4gbmV3IE1TUDQzMEJTZWwoKTsKK30KKworYm9vbCBNU1A0MzBCU2VsOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKSB7CisgIGNvbnN0IE1TUDQzMEluc3RySW5mbyAqVElJID0KKyAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBNU1A0MzBJbnN0ckluZm8qPihGbi5nZXRUYXJnZXQoKS5nZXRJbnN0ckluZm8oKSk7CisgIC8vIEdpdmUgdGhlIGJsb2NrcyBvZiB0aGUgZnVuY3Rpb24gYSBkZW5zZSwgaW4tb3JkZXIsIG51bWJlcmluZy4KKyAgRm4uUmVudW1iZXJCbG9ja3MoKTsKKyAgQmxvY2tTaXplcy5yZXNpemUoRm4uZ2V0TnVtQmxvY2tJRHMoKSk7CisKKyAgLy8gTWVhc3VyZSBlYWNoIE1CQiBhbmQgY29tcHV0ZSBhIHNpemUgZm9yIHRoZSBlbnRpcmUgZnVuY3Rpb24uCisgIHVuc2lnbmVkIEZ1bmNTaXplID0gMDsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1GSSA9IEZuLmJlZ2luKCksIEUgPSBGbi5lbmQoKTsgTUZJICE9IEU7CisgICAgICAgKytNRkkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTUZJOworCisgICAgdW5zaWduZWQgQmxvY2tTaXplID0gMDsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gTUJCLT5iZWdpbigpLCBFRSA9IE1CQi0+ZW5kKCk7CisgICAgICAgICBNQkJJICE9IEVFOyArK01CQkkpCisgICAgICBCbG9ja1NpemUgKz0gVElJLT5HZXRJbnN0U2l6ZUluQnl0ZXMoTUJCSSk7CisKKyAgICBCbG9ja1NpemVzW01CQi0+Z2V0TnVtYmVyKCldID0gQmxvY2tTaXplOworICAgIEZ1bmNTaXplICs9IEJsb2NrU2l6ZTsKKyAgfQorCisgIC8vIElmIHRoZSBlbnRpcmUgZnVuY3Rpb24gaXMgc21hbGxlciB0aGFuIHRoZSBkaXNwbGFjZW1lbnQgb2YgYSBicmFuY2ggZmllbGQsCisgIC8vIHdlIGtub3cgd2UgZG9uJ3QgbmVlZCB0byBzaHJpbmsgYW55IGJyYW5jaGVzIGluIHRoaXMgZnVuY3Rpb24uICBUaGlzIGlzIGEKKyAgLy8gY29tbW9uIGNhc2UuCisgIGlmIChGdW5jU2l6ZSA8ICgxIDw8IDkpKSB7CisgICAgQmxvY2tTaXplcy5jbGVhcigpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEZvciBlYWNoIGNvbmRpdGlvbmFsIGJyYW5jaCwgaWYgdGhlIG9mZnNldCB0byBpdHMgZGVzdGluYXRpb24gaXMgbGFyZ2VyCisgIC8vIHRoYW4gdGhlIG9mZnNldCBmaWVsZCBhbGxvd3MsIHRyYW5zZm9ybSBpdCBpbnRvIGEgbG9uZyBicmFuY2ggc2VxdWVuY2UKKyAgLy8gbGlrZSB0aGlzOgorICAvLyAgIHNob3J0IGJyYW5jaDoKKyAgLy8gICAgIGJDQyBNQkIKKyAgLy8gICBsb25nIGJyYW5jaDoKKyAgLy8gICAgIGIhQ0MgJFBDKzYKKyAgLy8gICAgIGIgTUJCCisgIC8vCisgIGJvb2wgTWFkZUNoYW5nZSA9IHRydWU7CisgIGJvb2wgRXZlck1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgd2hpbGUgKE1hZGVDaGFuZ2UpIHsKKyAgICAvLyBJdGVyYXRpdmVseSBleHBhbmQgYnJhbmNoZXMgdW50aWwgd2UgcmVhY2ggYSBmaXhlZCBwb2ludC4KKyAgICBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUZJID0gRm4uYmVnaW4oKSwgRSA9IEZuLmVuZCgpOyBNRkkgIT0gRTsKKyAgICAgICAgICsrTUZJKSB7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1GSTsKKyAgICAgIHVuc2lnbmVkIE1CQlN0YXJ0T2Zmc2V0ID0gMDsKKyAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuYmVnaW4oKSwgRSA9IE1CQi5lbmQoKTsKKyAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgaWYgKChJLT5nZXRPcGNvZGUoKSAhPSBNU1A0MzA6OkpDQyB8fCBJLT5nZXRPcGVyYW5kKDApLmlzSW1tKCkpICYmCisgICAgICAgICAgICBJLT5nZXRPcGNvZGUoKSAhPSBNU1A0MzA6OkpNUCkgeworICAgICAgICAgIE1CQlN0YXJ0T2Zmc2V0ICs9IFRJSS0+R2V0SW5zdFNpemVJbkJ5dGVzKEkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBicmFuY2ggdG8gdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIC8vIGJsb2NrLgorICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRGVzdCA9IEktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisKKyAgICAgICAgaW50IEJyYW5jaFNpemU7CisgICAgICAgIGlmIChEZXN0LT5nZXROdW1iZXIoKSA8PSBNQkIuZ2V0TnVtYmVyKCkpIHsKKyAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgYmFja3dhcmRzIGJyYW5jaCwgdGhlIGRlbHRhIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUKKyAgICAgICAgICAvLyBzdGFydCBvZiB0aGlzIGJsb2NrIHRvIHRoaXMgYnJhbmNoLCBwbHVzIHRoZSBzaXplcyBvZiBhbGwgYmxvY2tzCisgICAgICAgICAgLy8gZnJvbSB0aGlzIGJsb2NrIHRvIHRoZSBkZXN0LgorICAgICAgICAgIEJyYW5jaFNpemUgPSBNQkJTdGFydE9mZnNldDsKKworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IERlc3QtPmdldE51bWJlcigpLCBlID0gTUJCLmdldE51bWJlcigpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICAgIEJyYW5jaFNpemUgKz0gQmxvY2tTaXplc1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBPdGhlcndpc2UsIGFkZCB0aGUgc2l6ZSBvZiB0aGUgYmxvY2tzIGJldHdlZW4gdGhpcyBibG9jayBhbmQgdGhlCisgICAgICAgICAgLy8gZGVzdCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgaW4gdGhpcyBibG9jay4KKyAgICAgICAgICBCcmFuY2hTaXplID0gLU1CQlN0YXJ0T2Zmc2V0OworCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gTUJCLmdldE51bWJlcigpLCBlID0gRGVzdC0+Z2V0TnVtYmVyKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgQnJhbmNoU2l6ZSArPSBCbG9ja1NpemVzW2ldOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhpcyBicmFuY2ggaXMgaW4gcmFuZ2UsIGlnbm9yZSBpdC4KKyAgICAgICAgaWYgKGlzSW50PDEwPihCcmFuY2hTaXplKSkgeworICAgICAgICAgIE1CQlN0YXJ0T2Zmc2V0ICs9IDI7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gZXhwYW5kIGl0IHRvIGEgbG9uZyBicmFuY2guCisgICAgICAgIHVuc2lnbmVkIE5ld1NpemU7CisgICAgICAgIE1hY2hpbmVJbnN0ciAqT2xkQnJhbmNoID0gSTsKKyAgICAgICAgRGVidWdMb2MgZGwgPSBPbGRCcmFuY2gtPmdldERlYnVnTG9jKCk7CisKKyAgICAgICAgaWYgKEktPmdldE9wY29kZSgpID09IE1TUDQzMDo6Sk1QKSB7CisgICAgICAgICAgTmV3U2l6ZSA9IDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gVGhlIEJDQyBvcGVyYW5kcyBhcmU6CisgICAgICAgICAgLy8gMC4gTVNQNDMwIGJyYW5jaCBwcmVkaWNhdGUKKyAgICAgICAgICAvLyAxLiBUYXJnZXQgTUJCCisgICAgICAgICAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIDE+IENvbmQ7CisgICAgICAgICAgQ29uZC5wdXNoX2JhY2soSS0+Z2V0T3BlcmFuZCgxKSk7CisKKyAgICAgICAgICAvLyBKdW1wIG92ZXIgdGhlIHVuY29uZCBicmFuY2ggaW5zdCAoaS5lLiAkKzYpIG9uIG9wcG9zaXRlIGNvbmRpdGlvbi4KKyAgICAgICAgICBUSUktPlJldmVyc2VCcmFuY2hDb25kaXRpb24oQ29uZCk7CisgICAgICAgICAgQnVpbGRNSShNQkIsIEksIGRsLCBUSUktPmdldChNU1A0MzA6OkpDQykpCisgICAgICAgICAgICAuYWRkSW1tKDQpLmFkZE9wZXJhbmQoQ29uZFswXSk7CisKKyAgICAgICAgICBOZXdTaXplID0gNjsKKyAgICAgICAgfQorICAgICAgICAvLyBVbmNvbmQgYnJhbmNoIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorICAgICAgICBJID0gQnVpbGRNSShNQkIsIEksIGRsLCBUSUktPmdldChNU1A0MzA6OkJpKSkuYWRkTUJCKERlc3QpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIGJyYW5jaCBmcm9tIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgT2xkQnJhbmNoLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgTmV3U2l6ZSBieXRlcywgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlCisgICAgICAgIC8vIGJsb2NrIGJ5IE5ld1NpemUtMiwgcmVtZW1iZXIgdG8gaXRlcmF0ZS4KKyAgICAgICAgQmxvY2tTaXplc1tNQkIuZ2V0TnVtYmVyKCldICs9IE5ld1NpemUtMjsKKyAgICAgICAgTUJCU3RhcnRPZmZzZXQgKz0gTmV3U2l6ZTsKKworICAgICAgICArK051bUV4cGFuZGVkOworICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgRXZlck1hZGVDaGFuZ2UgfD0gTWFkZUNoYW5nZTsKKyAgfQorCisgIEJsb2NrU2l6ZXMuY2xlYXIoKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBDYWxsaW5nQ29udi50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMENhbGxpbmdDb252LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjdjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBDYWxsaW5nQ29udi50ZApAQCAtMCwwICsxLDM3IEBACisvLz09LSBNU1A0MzBDYWxsaW5nQ29udi50ZCAtIENhbGxpbmcgQ29udmVudGlvbnMgZm9yIE1TUDQzMCAtKi0gdGFibGVnZW4gLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBkZXNjcmliZXMgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIE1TUDQzMCBhcmNoaXRlY3R1cmUuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTVNQNDMwIFJldHVybiBWYWx1ZSBDYWxsaW5nIENvbnZlbnRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgUmV0Q0NfTVNQNDMwIDogQ2FsbGluZ0NvbnY8WworICAvLyBpOCBhcmUgcmV0dXJuZWQgaW4gcmVnaXN0ZXJzIFIxNUIsIFIxNEIsIFIxM0IsIFIxMkIKKyAgQ0NJZlR5cGU8W2k4XSwgQ0NBc3NpZ25Ub1JlZzxbUjE1QiwgUjE0QiwgUjEzQiwgUjEyQl0+PiwKKworICAvLyBpMTYgYXJlIHJldHVybmVkIGluIHJlZ2lzdGVycyBSMTUsIFIxNCwgUjEzLCBSMTIKKyAgQ0NJZlR5cGU8W2kxNl0sIENDQXNzaWduVG9SZWc8W1IxNVcsIFIxNFcsIFIxM1csIFIxMlddPj4KK10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTVNQNDMwIEFyZ3VtZW50IENhbGxpbmcgQ29udmVudGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgQ0NfTVNQNDMwIDogQ2FsbGluZ0NvbnY8WworICAvLyBQcm9tb3RlIGk4IGFyZ3VtZW50cyB0byBpMTYuCisgIENDSWZUeXBlPFtpOF0sIENDUHJvbW90ZVRvVHlwZTxpMTY+PiwKKworICAvLyBUaGUgZmlyc3QgNCBpbnRlZ2VyIGFyZ3VtZW50cyBvZiBub24tdmFyYXJncyBmdW5jdGlvbnMgYXJlIHBhc3NlZCBpbgorICAvLyBpbnRlZ2VyIHJlZ2lzdGVycy4KKyAgQ0NJZk5vdFZhckFyZzxDQ0lmVHlwZTxbaTE2XSwgQ0NBc3NpZ25Ub1JlZzxbUjE1VywgUjE0VywgUjEzVywgUjEyV10+Pj4sCisKKyAgLy8gSW50ZWdlciB2YWx1ZXMgZ2V0IHN0b3JlZCBpbiBzdGFjayBzbG90cyB0aGF0IGFyZSAyIGJ5dGVzIGluCisgIC8vIHNpemUgYW5kIDItYnl0ZSBhbGlnbmVkLgorICBDQ0lmVHlwZTxbaTE2XSwgQ0NBc3NpZ25Ub1N0YWNrPDIsIDI+PgorXT47CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBJU2VsREFHVG9EQUcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSVNlbERBR1RvREFHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzk1ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSVNlbERBR1RvREFHLmNwcApAQCAtMCwwICsxLDUwMSBAQAorLy89PT0tLSBNU1A0MzBJU2VsREFHVG9EQUcuY3BwIC0gQSBkYWcgdG8gZGFnIGluc3Qgc2VsZWN0b3IgZm9yIE1TUDQzMCAtLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBpbnN0cnVjdGlvbiBzZWxlY3RvciBmb3IgdGhlIE1TUDQzMCB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1TUDQzMC5oIgorI2luY2x1ZGUgIk1TUDQzMFRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBNU1A0MzBJU2VsQWRkcmVzc01vZGUgeworICAgIGVudW0geworICAgICAgUmVnQmFzZSwKKyAgICAgIEZyYW1lSW5kZXhCYXNlCisgICAgfSBCYXNlVHlwZTsKKworICAgIHN0cnVjdCB7ICAgICAgICAgICAgLy8gVGhpcyBpcyByZWFsbHkgYSB1bmlvbiwgZGlzY3JpbWluYXRlZCBieSBCYXNlVHlwZSEKKyAgICAgIFNEVmFsdWUgUmVnOworICAgICAgaW50IEZyYW1lSW5kZXg7CisgICAgfSBCYXNlOworCisgICAgaW50MTZfdCBEaXNwOworICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHVjsKKyAgICBjb25zdCBDb25zdGFudCAqQ1A7CisgICAgY29uc3QgQmxvY2tBZGRyZXNzICpCbG9ja0FkZHI7CisgICAgY29uc3QgY2hhciAqRVM7CisgICAgaW50IEpUOworICAgIHVuc2lnbmVkIEFsaWduOyAgICAvLyBDUCBhbGlnbm1lbnQuCisKKyAgICBNU1A0MzBJU2VsQWRkcmVzc01vZGUoKQorICAgICAgOiBCYXNlVHlwZShSZWdCYXNlKSwgRGlzcCgwKSwgR1YoMCksIENQKDApLCBCbG9ja0FkZHIoMCksCisgICAgICAgIEVTKDApLCBKVCgtMSksIEFsaWduKDApIHsKKyAgICB9CisKKyAgICBib29sIGhhc1N5bWJvbGljRGlzcGxhY2VtZW50KCkgY29uc3QgeworICAgICAgcmV0dXJuIEdWICE9IDAgfHwgQ1AgIT0gMCB8fCBFUyAhPSAwIHx8IEpUICE9IC0xOworICAgIH0KKworICAgIGJvb2wgaGFzQmFzZVJlZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBCYXNlLlJlZy5nZXROb2RlKCkgIT0gMDsKKyAgICB9CisKKyAgICB2b2lkIHNldEJhc2VSZWcoU0RWYWx1ZSBSZWcpIHsKKyAgICAgIEJhc2VUeXBlID0gUmVnQmFzZTsKKyAgICAgIEJhc2UuUmVnID0gUmVnOworICAgIH0KKworICAgIHZvaWQgZHVtcCgpIHsKKyAgICAgIGVycnMoKSA8PCAiTVNQNDMwSVNlbEFkZHJlc3NNb2RlICIgPDwgdGhpcyA8PCAnXG4nOworICAgICAgaWYgKEJhc2VUeXBlID09IFJlZ0Jhc2UgJiYgQmFzZS5SZWcuZ2V0Tm9kZSgpICE9IDApIHsKKyAgICAgICAgZXJycygpIDw8ICJCYXNlLlJlZyAiOworICAgICAgICBCYXNlLlJlZy5nZXROb2RlKCktPmR1bXAoKTsKKyAgICAgIH0gZWxzZSBpZiAoQmFzZVR5cGUgPT0gRnJhbWVJbmRleEJhc2UpIHsKKyAgICAgICAgZXJycygpIDw8ICIgQmFzZS5GcmFtZUluZGV4ICIgPDwgQmFzZS5GcmFtZUluZGV4IDw8ICdcbic7CisgICAgICB9CisgICAgICBlcnJzKCkgPDwgIiBEaXNwICIgPDwgRGlzcCA8PCAnXG4nOworICAgICAgaWYgKEdWKSB7CisgICAgICAgIGVycnMoKSA8PCAiR1YgIjsKKyAgICAgICAgR1YtPmR1bXAoKTsKKyAgICAgIH0gZWxzZSBpZiAoQ1ApIHsKKyAgICAgICAgZXJycygpIDw8ICIgQ1AgIjsKKyAgICAgICAgQ1AtPmR1bXAoKTsKKyAgICAgICAgZXJycygpIDw8ICIgQWxpZ24iIDw8IEFsaWduIDw8ICdcbic7CisgICAgICB9IGVsc2UgaWYgKEVTKSB7CisgICAgICAgIGVycnMoKSA8PCAiRVMgIjsKKyAgICAgICAgZXJycygpIDw8IEVTIDw8ICdcbic7CisgICAgICB9IGVsc2UgaWYgKEpUICE9IC0xKQorICAgICAgICBlcnJzKCkgPDwgIiBKVCIgPDwgSlQgPDwgIiBBbGlnbiIgPDwgQWxpZ24gPDwgJ1xuJzsKKyAgICB9CisgIH07Cit9CisKKy8vLyBNU1A0MzBEQUdUb0RBR0lTZWwgLSBNU1A0MzAgc3BlY2lmaWMgY29kZSB0byBzZWxlY3QgTVNQNDMwIG1hY2hpbmUKKy8vLyBpbnN0cnVjdGlvbnMgZm9yIFNlbGVjdGlvbkRBRyBvcGVyYXRpb25zLgorLy8vCituYW1lc3BhY2UgeworICBjbGFzcyBNU1A0MzBEQUdUb0RBR0lTZWwgOiBwdWJsaWMgU2VsZWN0aW9uREFHSVNlbCB7CisgICAgY29uc3QgTVNQNDMwVGFyZ2V0TG93ZXJpbmcgJkxvd2VyaW5nOworICAgIGNvbnN0IE1TUDQzMFN1YnRhcmdldCAmU3VidGFyZ2V0OworCisgIHB1YmxpYzoKKyAgICBNU1A0MzBEQUdUb0RBR0lTZWwoTVNQNDMwVGFyZ2V0TWFjaGluZSAmVE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKQorICAgICAgOiBTZWxlY3Rpb25EQUdJU2VsKFRNLCBPcHRMZXZlbCksCisgICAgICAgIExvd2VyaW5nKCpUTS5nZXRUYXJnZXRMb3dlcmluZygpKSwKKyAgICAgICAgU3VidGFyZ2V0KCpUTS5nZXRTdWJ0YXJnZXRJbXBsKCkpIHsgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiTVNQNDMwIERBRy0+REFHIFBhdHRlcm4gSW5zdHJ1Y3Rpb24gU2VsZWN0aW9uIjsKKyAgICB9CisKKyAgICBib29sIE1hdGNoQWRkcmVzcyhTRFZhbHVlIE4sIE1TUDQzMElTZWxBZGRyZXNzTW9kZSAmQU0pOworICAgIGJvb2wgTWF0Y2hXcmFwcGVyKFNEVmFsdWUgTiwgTVNQNDMwSVNlbEFkZHJlc3NNb2RlICZBTSk7CisgICAgYm9vbCBNYXRjaEFkZHJlc3NCYXNlKFNEVmFsdWUgTiwgTVNQNDMwSVNlbEFkZHJlc3NNb2RlICZBTSk7CisKKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBTZWxlY3RJbmxpbmVBc21NZW1vcnlPcGVyYW5kKGNvbnN0IFNEVmFsdWUgJk9wLCBjaGFyIENvbnN0cmFpbnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gJk91dE9wcyk7CisKKyAgICAvLyBJbmNsdWRlIHRoZSBwaWVjZXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSB0YXJnZXQgZGVzY3JpcHRpb24uCisgICNpbmNsdWRlICJNU1A0MzBHZW5EQUdJU2VsLmluYyIKKworICBwcml2YXRlOgorICAgIFNETm9kZSAqU2VsZWN0KFNETm9kZSAqTik7CisgICAgU0ROb2RlICpTZWxlY3RJbmRleGVkTG9hZChTRE5vZGUgKk9wKTsKKyAgICBTRE5vZGUgKlNlbGVjdEluZGV4ZWRCaW5PcChTRE5vZGUgKk9wLCBTRFZhbHVlIE4xLCBTRFZhbHVlIE4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wYzgsIHVuc2lnbmVkIE9wYzE2KTsKKworICAgIGJvb2wgU2VsZWN0QWRkcihTRE5vZGUgKk9wLCBTRFZhbHVlIEFkZHIsIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJkRpc3ApOworICB9OworfSAgLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworLy8vIGNyZWF0ZU1TUDQzMElTZWxEYWcgLSBUaGlzIHBhc3MgY29udmVydHMgYSBsZWdhbGl6ZWQgREFHIGludG8gYQorLy8vIE1TUDQzMC1zcGVjaWZpYyBEQUcsIHJlYWR5IGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorLy8vCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZU1TUDQzMElTZWxEYWcoTVNQNDMwVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgcmV0dXJuIG5ldyBNU1A0MzBEQUdUb0RBR0lTZWwoVE0sIE9wdExldmVsKTsKK30KKworCisvLy8gTWF0Y2hXcmFwcGVyIC0gVHJ5IHRvIG1hdGNoIE1TUDQzMElTRDo6V3JhcHBlciBub2RlIGludG8gYW4gYWRkcmVzc2luZyBtb2RlLgorLy8vIFRoZXNlIHdyYXAgdGhpbmdzIHRoYXQgd2lsbCByZXNvbHZlIGRvd24gaW50byBhIHN5bWJvbCByZWZlcmVuY2UuICBJZiBubworLy8vIG1hdGNoIGlzIHBvc3NpYmxlLCB0aGlzIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCitib29sIE1TUDQzMERBR1RvREFHSVNlbDo6TWF0Y2hXcmFwcGVyKFNEVmFsdWUgTiwgTVNQNDMwSVNlbEFkZHJlc3NNb2RlICZBTSkgeworICAvLyBJZiB0aGUgYWRkcmVzc2luZyBtb2RlIGFscmVhZHkgaGFzIGEgc3ltYm9sIGFzIHRoZSBkaXNwbGFjZW1lbnQsIHdlIGNhbgorICAvLyBuZXZlciBtYXRjaCBhbm90aGVyIHN5bWJvbC4KKyAgaWYgKEFNLmhhc1N5bWJvbGljRGlzcGxhY2VtZW50KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgU0RWYWx1ZSBOMCA9IE4uZ2V0T3BlcmFuZCgwKTsKKworICBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE4wKSkgeworICAgIEFNLkdWID0gRy0+Z2V0R2xvYmFsKCk7CisgICAgQU0uRGlzcCArPSBHLT5nZXRPZmZzZXQoKTsKKyAgICAvL0FNLlN5bWJvbEZsYWdzID0gRy0+Z2V0VGFyZ2V0RmxhZ3MoKTsKKyAgfSBlbHNlIGlmIChDb25zdGFudFBvb2xTRE5vZGUgKkNQID0gZHluX2Nhc3Q8Q29uc3RhbnRQb29sU0ROb2RlPihOMCkpIHsKKyAgICBBTS5DUCA9IENQLT5nZXRDb25zdFZhbCgpOworICAgIEFNLkFsaWduID0gQ1AtPmdldEFsaWdubWVudCgpOworICAgIEFNLkRpc3AgKz0gQ1AtPmdldE9mZnNldCgpOworICAgIC8vQU0uU3ltYm9sRmxhZ3MgPSBDUC0+Z2V0VGFyZ2V0RmxhZ3MoKTsKKyAgfSBlbHNlIGlmIChFeHRlcm5hbFN5bWJvbFNETm9kZSAqUyA9IGR5bl9jYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPihOMCkpIHsKKyAgICBBTS5FUyA9IFMtPmdldFN5bWJvbCgpOworICAgIC8vQU0uU3ltYm9sRmxhZ3MgPSBTLT5nZXRUYXJnZXRGbGFncygpOworICB9IGVsc2UgaWYgKEp1bXBUYWJsZVNETm9kZSAqSiA9IGR5bl9jYXN0PEp1bXBUYWJsZVNETm9kZT4oTjApKSB7CisgICAgQU0uSlQgPSBKLT5nZXRJbmRleCgpOworICAgIC8vQU0uU3ltYm9sRmxhZ3MgPSBKLT5nZXRUYXJnZXRGbGFncygpOworICB9IGVsc2UgeworICAgIEFNLkJsb2NrQWRkciA9IGNhc3Q8QmxvY2tBZGRyZXNzU0ROb2RlPihOMCktPmdldEJsb2NrQWRkcmVzcygpOworICAgIC8vQU0uU3ltYm9sRmxhZ3MgPSBjYXN0PEJsb2NrQWRkcmVzc1NETm9kZT4oTjApLT5nZXRUYXJnZXRGbGFncygpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIE1hdGNoQWRkcmVzc0Jhc2UgLSBIZWxwZXIgZm9yIE1hdGNoQWRkcmVzcy4gQWRkIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB0aGUKKy8vLyBzcGVjaWZpZWQgYWRkcmVzc2luZyBtb2RlIHdpdGhvdXQgYW55IGZ1cnRoZXIgcmVjdXJzaW9uLgorYm9vbCBNU1A0MzBEQUdUb0RBR0lTZWw6Ok1hdGNoQWRkcmVzc0Jhc2UoU0RWYWx1ZSBOLCBNU1A0MzBJU2VsQWRkcmVzc01vZGUgJkFNKSB7CisgIC8vIElzIHRoZSBiYXNlIHJlZ2lzdGVyIGFscmVhZHkgb2NjdXBpZWQ/CisgIGlmIChBTS5CYXNlVHlwZSAhPSBNU1A0MzBJU2VsQWRkcmVzc01vZGU6OlJlZ0Jhc2UgfHwgQU0uQmFzZS5SZWcuZ2V0Tm9kZSgpKSB7CisgICAgLy8gSWYgc28sIHdlIGNhbm5vdCBzZWxlY3QgaXQuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBEZWZhdWx0LCBnZW5lcmF0ZSBpdCBhcyBhIHJlZ2lzdGVyLgorICBBTS5CYXNlVHlwZSA9IE1TUDQzMElTZWxBZGRyZXNzTW9kZTo6UmVnQmFzZTsKKyAgQU0uQmFzZS5SZWcgPSBOOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTVNQNDMwREFHVG9EQUdJU2VsOjpNYXRjaEFkZHJlc3MoU0RWYWx1ZSBOLCBNU1A0MzBJU2VsQWRkcmVzc01vZGUgJkFNKSB7CisgIERFQlVHKGVycnMoKSA8PCAiTWF0Y2hBZGRyZXNzOiAiOyBBTS5kdW1wKCkpOworCisgIHN3aXRjaCAoTi5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6OkNvbnN0YW50OiB7CisgICAgdWludDY0X3QgVmFsID0gY2FzdDxDb25zdGFudFNETm9kZT4oTiktPmdldFNFeHRWYWx1ZSgpOworICAgIEFNLkRpc3AgKz0gVmFsOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNhc2UgTVNQNDMwSVNEOjpXcmFwcGVyOgorICAgIGlmICghTWF0Y2hXcmFwcGVyKE4sIEFNKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBicmVhazsKKworICBjYXNlIElTRDo6RnJhbWVJbmRleDoKKyAgICBpZiAoQU0uQmFzZVR5cGUgPT0gTVNQNDMwSVNlbEFkZHJlc3NNb2RlOjpSZWdCYXNlCisgICAgICAgICYmIEFNLkJhc2UuUmVnLmdldE5vZGUoKSA9PSAwKSB7CisgICAgICBBTS5CYXNlVHlwZSA9IE1TUDQzMElTZWxBZGRyZXNzTW9kZTo6RnJhbWVJbmRleEJhc2U7CisgICAgICBBTS5CYXNlLkZyYW1lSW5kZXggPSBjYXN0PEZyYW1lSW5kZXhTRE5vZGU+KE4pLT5nZXRJbmRleCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIElTRDo6QUREOiB7CisgICAgTVNQNDMwSVNlbEFkZHJlc3NNb2RlIEJhY2t1cCA9IEFNOworICAgIGlmICghTWF0Y2hBZGRyZXNzKE4uZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApLCBBTSkgJiYKKyAgICAgICAgIU1hdGNoQWRkcmVzcyhOLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgxKSwgQU0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFNID0gQmFja3VwOworICAgIGlmICghTWF0Y2hBZGRyZXNzKE4uZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDEpLCBBTSkgJiYKKyAgICAgICAgIU1hdGNoQWRkcmVzcyhOLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKSwgQU0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFNID0gQmFja3VwOworCisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIElTRDo6T1I6CisgICAgLy8gSGFuZGxlICJYIHwgQyIgYXMgIlggKyBDIiBpZmYgWCBpcyBrbm93biB0byBoYXZlIEMgYml0cyBjbGVhci4KKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNOID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIE1TUDQzMElTZWxBZGRyZXNzTW9kZSBCYWNrdXAgPSBBTTsKKyAgICAgIHVpbnQ2NF90IE9mZnNldCA9IENOLT5nZXRTRXh0VmFsdWUoKTsKKyAgICAgIC8vIFN0YXJ0IHdpdGggdGhlIExIUyBhcyBhbiBhZGRyIG1vZGUuCisgICAgICBpZiAoIU1hdGNoQWRkcmVzcyhOLmdldE9wZXJhbmQoMCksIEFNKSAmJgorICAgICAgICAgIC8vIEFkZHJlc3MgY291bGQgbm90IGhhdmUgcGlja2VkIGEgR1YgYWRkcmVzcyBmb3IgdGhlIGRpc3BsYWNlbWVudC4KKyAgICAgICAgICBBTS5HViA9PSBOVUxMICYmCisgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBMSFMgJiBDIGlzIHplcm8uCisgICAgICAgICAgQ3VyREFHLT5NYXNrZWRWYWx1ZUlzWmVybyhOLmdldE9wZXJhbmQoMCksIENOLT5nZXRBUEludFZhbHVlKCkpKSB7CisgICAgICAgIEFNLkRpc3AgKz0gT2Zmc2V0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBBTSA9IEJhY2t1cDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gTWF0Y2hBZGRyZXNzQmFzZShOLCBBTSk7Cit9CisKKy8vLyBTZWxlY3RBZGRyIC0gcmV0dXJucyB0cnVlIGlmIGl0IGlzIGFibGUgcGF0dGVybiBtYXRjaCBhbiBhZGRyZXNzaW5nIG1vZGUuCisvLy8gSXQgcmV0dXJucyB0aGUgb3BlcmFuZHMgd2hpY2ggbWFrZSB1cCB0aGUgbWF4aW1hbCBhZGRyZXNzaW5nIG1vZGUgaXQgY2FuCisvLy8gbWF0Y2ggYnkgcmVmZXJlbmNlLgorYm9vbCBNU1A0MzBEQUdUb0RBR0lTZWw6OlNlbGVjdEFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmRGlzcCkgeworICBNU1A0MzBJU2VsQWRkcmVzc01vZGUgQU07CisKKyAgaWYgKE1hdGNoQWRkcmVzcyhOLCBBTSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEVWVCBWVCA9IE4uZ2V0VmFsdWVUeXBlKCk7CisgIGlmIChBTS5CYXNlVHlwZSA9PSBNU1A0MzBJU2VsQWRkcmVzc01vZGU6OlJlZ0Jhc2UpIHsKKyAgICBpZiAoIUFNLkJhc2UuUmVnLmdldE5vZGUoKSkKKyAgICAgIEFNLkJhc2UuUmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBWVCk7CisgIH0KKworICBCYXNlICA9IChBTS5CYXNlVHlwZSA9PSBNU1A0MzBJU2VsQWRkcmVzc01vZGU6OkZyYW1lSW5kZXhCYXNlKSA/CisgICAgQ3VyREFHLT5nZXRUYXJnZXRGcmFtZUluZGV4KEFNLkJhc2UuRnJhbWVJbmRleCwgVExJLmdldFBvaW50ZXJUeSgpKSA6CisgICAgQU0uQmFzZS5SZWc7CisKKyAgaWYgKEFNLkdWKQorICAgIERpc3AgPSBDdXJEQUctPmdldFRhcmdldEdsb2JhbEFkZHJlc3MoQU0uR1YsIE9wLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMTYsIEFNLkRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLypBTS5TeW1ib2xGbGFncyovKTsKKyAgZWxzZSBpZiAoQU0uQ1ApCisgICAgRGlzcCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnRQb29sKEFNLkNQLCBNVlQ6OmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU0uQWxpZ24sIEFNLkRpc3AsIDAvKkFNLlN5bWJvbEZsYWdzKi8pOworICBlbHNlIGlmIChBTS5FUykKKyAgICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRFeHRlcm5hbFN5bWJvbChBTS5FUywgTVZUOjppMTYsIDAvKkFNLlN5bWJvbEZsYWdzKi8pOworICBlbHNlIGlmIChBTS5KVCAhPSAtMSkKKyAgICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRKdW1wVGFibGUoQU0uSlQsIE1WVDo6aTE2LCAwLypBTS5TeW1ib2xGbGFncyovKTsKKyAgZWxzZSBpZiAoQU0uQmxvY2tBZGRyKQorICAgIERpc3AgPSBDdXJEQUctPmdldEJsb2NrQWRkcmVzcyhBTS5CbG9ja0FkZHIsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAwLypBTS5TeW1ib2xGbGFncyovKTsKKyAgZWxzZQorICAgIERpc3AgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEFNLkRpc3AsIE1WVDo6aTE2KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNU1A0MzBEQUdUb0RBR0lTZWw6OgorU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChjb25zdCBTRFZhbHVlICZPcCwgY2hhciBDb25zdHJhaW50Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gJk91dE9wcykgeworICBTRFZhbHVlIE9wMCwgT3AxOworICBzd2l0Y2ggKENvbnN0cmFpbnRDb2RlKSB7CisgIGRlZmF1bHQ6IHJldHVybiB0cnVlOworICBjYXNlICdtJzogICAvLyBtZW1vcnkKKyAgICBpZiAoIVNlbGVjdEFkZHIoT3AuZ2V0Tm9kZSgpLCBPcCwgT3AwLCBPcDEpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIH0KKworICBPdXRPcHMucHVzaF9iYWNrKE9wMCk7CisgIE91dE9wcy5wdXNoX2JhY2soT3AxKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc1ZhbGlkSW5kZXhlZExvYWQoY29uc3QgTG9hZFNETm9kZSAqTEQpIHsKKyAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSA9IExELT5nZXRBZGRyZXNzaW5nTW9kZSgpOworICBpZiAoQU0gIT0gSVNEOjpQT1NUX0lOQyB8fCBMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpICE9IElTRDo6Tk9OX0VYVExPQUQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEVWVCBWVCA9IExELT5nZXRNZW1vcnlWVCgpOworCisgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICBjYXNlIE1WVDo6aTg6CisgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgaWYgKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KExELT5nZXRPZmZzZXQoKSktPmdldFpFeHRWYWx1ZSgpICE9IDEpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBicmVhazsKKyAgY2FzZSBNVlQ6OmkxNjoKKyAgICAvLyBTYW5pdHkgY2hlY2sKKyAgICBpZiAoY2FzdDxDb25zdGFudFNETm9kZT4oTEQtPmdldE9mZnNldCgpKS0+Z2V0WkV4dFZhbHVlKCkgIT0gMikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitTRE5vZGUgKk1TUDQzMERBR1RvREFHSVNlbDo6U2VsZWN0SW5kZXhlZExvYWQoU0ROb2RlICpOKSB7CisgIExvYWRTRE5vZGUgKkxEID0gY2FzdDxMb2FkU0ROb2RlPihOKTsKKyAgaWYgKCFpc1ZhbGlkSW5kZXhlZExvYWQoTEQpKQorICAgIHJldHVybiBOVUxMOworCisgIE1WVCBWVCA9IExELT5nZXRNZW1vcnlWVCgpLmdldFNpbXBsZVZUKCk7CisKKyAgdW5zaWduZWQgT3Bjb2RlID0gMDsKKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgeworICBjYXNlIE1WVDo6aTg6CisgICAgT3Bjb2RlID0gTVNQNDMwOjpNT1Y4cm1fUE9TVDsKKyAgICBicmVhazsKKyAgY2FzZSBNVlQ6OmkxNjoKKyAgICBPcGNvZGUgPSBNU1A0MzA6Ok1PVjE2cm1fUE9TVDsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGNvZGUsIE4tPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVCwgTVZUOjppMTYsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0QmFzZVB0cigpLCBMRC0+Z2V0Q2hhaW4oKSk7Cit9CisKK1NETm9kZSAqTVNQNDMwREFHVG9EQUdJU2VsOjpTZWxlY3RJbmRleGVkQmluT3AoU0ROb2RlICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BjOCwgdW5zaWduZWQgT3BjMTYpIHsKKyAgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6TE9BRCAmJgorICAgICAgTjEuaGFzT25lVXNlKCkgJiYKKyAgICAgIElzTGVnYWxUb0ZvbGQoTjEsIE9wLCBPcCwgT3B0TGV2ZWwpKSB7CisgICAgTG9hZFNETm9kZSAqTEQgPSBjYXN0PExvYWRTRE5vZGU+KE4xKTsKKyAgICBpZiAoIWlzVmFsaWRJbmRleGVkTG9hZChMRCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIE1WVCBWVCA9IExELT5nZXRNZW1vcnlWVCgpLmdldFNpbXBsZVZUKCk7CisgICAgdW5zaWduZWQgT3BjID0gKFZUID09IE1WVDo6aTE2ID8gT3BjMTYgOiBPcGM4KTsKKyAgICBNYWNoaW5lU0ROb2RlOjptbW9faXRlcmF0b3IgTWVtUmVmczAgPSBNRi0+YWxsb2NhdGVNZW1SZWZzQXJyYXkoMSk7CisgICAgTWVtUmVmczBbMF0gPSBjYXN0PE1lbVNETm9kZT4oTjEpLT5nZXRNZW1PcGVyYW5kKCk7CisgICAgU0RWYWx1ZSBPcHMwW10gPSB7IE4yLCBMRC0+Z2V0QmFzZVB0cigpLCBMRC0+Z2V0Q2hhaW4oKSB9OworICAgIFNETm9kZSAqUmVzTm9kZSA9CisgICAgICBDdXJEQUctPlNlbGVjdE5vZGVUbyhPcCwgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVlQsIE1WVDo6aTE2LCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzMCwgMyk7CisgICAgY2FzdDxNYWNoaW5lU0ROb2RlPihSZXNOb2RlKS0+c2V0TWVtUmVmcyhNZW1SZWZzMCwgTWVtUmVmczAgKyAxKTsKKyAgICAvLyBUcmFuc2ZlciBjaGFpbi4KKyAgICBSZXBsYWNlVXNlcyhTRFZhbHVlKE4xLmdldE5vZGUoKSwgMiksIFNEVmFsdWUoUmVzTm9kZSwgMikpOworICAgIC8vIFRyYW5zZmVyIHdyaXRlYmFjay4KKyAgICBSZXBsYWNlVXNlcyhTRFZhbHVlKE4xLmdldE5vZGUoKSwgMSksIFNEVmFsdWUoUmVzTm9kZSwgMSkpOworICAgIHJldHVybiBSZXNOb2RlOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU0ROb2RlICpNU1A0MzBEQUdUb0RBR0lTZWw6OlNlbGVjdChTRE5vZGUgKk5vZGUpIHsKKyAgRGVidWdMb2MgZGwgPSBOb2RlLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIER1bXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE5vZGUgYmVpbmcgc2VsZWN0ZWQKKyAgREVCVUcoZXJycygpIDw8ICJTZWxlY3Rpbmc6ICIpOworICBERUJVRyhOb2RlLT5kdW1wKEN1ckRBRykpOworICBERUJVRyhlcnJzKCkgPDwgIlxuIik7CisKKyAgLy8gSWYgd2UgaGF2ZSBhIGN1c3RvbSBub2RlLCB3ZSBhbHJlYWR5IGhhdmUgc2VsZWN0ZWQhCisgIGlmIChOb2RlLT5pc01hY2hpbmVPcGNvZGUoKSkgeworICAgIERFQlVHKGVycnMoKSA8PCAiPT0gIjsKKyAgICAgICAgICBOb2RlLT5kdW1wKEN1ckRBRyk7CisgICAgICAgICAgZXJycygpIDw8ICJcbiIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gRmV3IGN1c3RvbSBzZWxlY3Rpb24gc3R1ZmYuCisgIHN3aXRjaCAoTm9kZS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpGcmFtZUluZGV4OiB7CisgICAgYXNzZXJ0KE5vZGUtPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkxNik7CisgICAgaW50IEZJID0gY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOb2RlKS0+Z2V0SW5kZXgoKTsKKyAgICBTRFZhbHVlIFRGSSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSSwgTVZUOjppMTYpOworICAgIGlmIChOb2RlLT5oYXNPbmVVc2UoKSkKKyAgICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOb2RlLCBNU1A0MzA6OkFERDE2cmksIE1WVDo6aTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGSSwgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBNVlQ6OmkxNikpOworICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE1TUDQzMDo6QUREMTZyaSwgZGwsIE1WVDo6aTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGSSwgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBNVlQ6OmkxNikpOworICB9CisgIGNhc2UgSVNEOjpMT0FEOgorICAgIGlmIChTRE5vZGUgKlJlc05vZGUgPSBTZWxlY3RJbmRleGVkTG9hZChOb2RlKSkKKyAgICAgIHJldHVybiBSZXNOb2RlOworICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICBjYXNlIElTRDo6QUREOgorICAgIGlmIChTRE5vZGUgKlJlc05vZGUgPQorICAgICAgICBTZWxlY3RJbmRleGVkQmluT3AoTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMCksIE5vZGUtPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1A0MzA6OkFERDhybV9QT1NULCBNU1A0MzA6OkFERDE2cm1fUE9TVCkpCisgICAgICByZXR1cm4gUmVzTm9kZTsKKyAgICBlbHNlIGlmIChTRE5vZGUgKlJlc05vZGUgPQorICAgICAgICAgICAgIFNlbGVjdEluZGV4ZWRCaW5PcChOb2RlLCBOb2RlLT5nZXRPcGVyYW5kKDEpLCBOb2RlLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1A0MzA6OkFERDhybV9QT1NULCBNU1A0MzA6OkFERDE2cm1fUE9TVCkpCisgICAgICByZXR1cm4gUmVzTm9kZTsKKworICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICBjYXNlIElTRDo6U1VCOgorICAgIGlmIChTRE5vZGUgKlJlc05vZGUgPQorICAgICAgICBTZWxlY3RJbmRleGVkQmluT3AoTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMCksIE5vZGUtPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1A0MzA6OlNVQjhybV9QT1NULCBNU1A0MzA6OlNVQjE2cm1fUE9TVCkpCisgICAgICByZXR1cm4gUmVzTm9kZTsKKworICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICBjYXNlIElTRDo6QU5EOgorICAgIGlmIChTRE5vZGUgKlJlc05vZGUgPQorICAgICAgICBTZWxlY3RJbmRleGVkQmluT3AoTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMCksIE5vZGUtPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1A0MzA6OkFORDhybV9QT1NULCBNU1A0MzA6OkFORDE2cm1fUE9TVCkpCisgICAgICByZXR1cm4gUmVzTm9kZTsKKyAgICBlbHNlIGlmIChTRE5vZGUgKlJlc05vZGUgPQorICAgICAgICAgICAgIFNlbGVjdEluZGV4ZWRCaW5PcChOb2RlLCBOb2RlLT5nZXRPcGVyYW5kKDEpLCBOb2RlLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1A0MzA6OkFORDhybV9QT1NULCBNU1A0MzA6OkFORDE2cm1fUE9TVCkpCisgICAgICByZXR1cm4gUmVzTm9kZTsKKworICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICBjYXNlIElTRDo6T1I6CisgICAgaWYgKFNETm9kZSAqUmVzTm9kZSA9CisgICAgICAgIFNlbGVjdEluZGV4ZWRCaW5PcChOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0T3BlcmFuZCgwKSwgTm9kZS0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TUDQzMDo6T1I4cm1fUE9TVCwgTVNQNDMwOjpPUjE2cm1fUE9TVCkpCisgICAgICByZXR1cm4gUmVzTm9kZTsKKyAgICBlbHNlIGlmIChTRE5vZGUgKlJlc05vZGUgPQorICAgICAgICAgICAgIFNlbGVjdEluZGV4ZWRCaW5PcChOb2RlLCBOb2RlLT5nZXRPcGVyYW5kKDEpLCBOb2RlLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1A0MzA6Ok9SOHJtX1BPU1QsIE1TUDQzMDo6T1IxNnJtX1BPU1QpKQorICAgICAgcmV0dXJuIFJlc05vZGU7CisKKyAgICAvLyBPdGhlciBjYXNlcyBhcmUgYXV0b2dlbmVyYXRlZC4KKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlhPUjoKKyAgICBpZiAoU0ROb2RlICpSZXNOb2RlID0KKyAgICAgICAgU2VsZWN0SW5kZXhlZEJpbk9wKE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDApLCBOb2RlLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNQNDMwOjpYT1I4cm1fUE9TVCwgTVNQNDMwOjpYT1IxNnJtX1BPU1QpKQorICAgICAgcmV0dXJuIFJlc05vZGU7CisgICAgZWxzZSBpZiAoU0ROb2RlICpSZXNOb2RlID0KKyAgICAgICAgICAgICBTZWxlY3RJbmRleGVkQmluT3AoTm9kZSwgTm9kZS0+Z2V0T3BlcmFuZCgxKSwgTm9kZS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNQNDMwOjpYT1I4cm1fUE9TVCwgTVNQNDMwOjpYT1IxNnJtX1BPU1QpKQorICAgICAgcmV0dXJuIFJlc05vZGU7CisKKyAgICAvLyBPdGhlciBjYXNlcyBhcmUgYXV0b2dlbmVyYXRlZC4KKyAgICBicmVhazsKKyAgfQorCisgIC8vIFNlbGVjdCB0aGUgZGVmYXVsdCBpbnN0cnVjdGlvbgorICBTRE5vZGUgKlJlc05vZGUgPSBTZWxlY3RDb2RlKE5vZGUpOworCisgIERFQlVHKGVycnMoKSA8PCAiPT4gIik7CisgIGlmIChSZXNOb2RlID09IE5VTEwgfHwgUmVzTm9kZSA9PSBOb2RlKQorICAgIERFQlVHKE5vZGUtPmR1bXAoQ3VyREFHKSk7CisgIGVsc2UKKyAgICBERUJVRyhSZXNOb2RlLT5kdW1wKEN1ckRBRykpOworICBERUJVRyhlcnJzKCkgPDwgIlxuIik7CisKKyAgcmV0dXJuIFJlc05vZGU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBJU2VsTG93ZXJpbmcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSVNlbExvd2VyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTcwM2EzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSVNlbExvd2VyaW5nLmNwcApAQCAtMCwwICsxLDEyMDMgQEAKKy8vPT09LS0gTVNQNDMwSVNlbExvd2VyaW5nLmNwcCAtIE1TUDQzMCBEQUcgTG93ZXJpbmcgSW1wbGVtZW50YXRpb24gIC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIE1TUDQzMFRhcmdldExvd2VyaW5nIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibXNwNDMwLWxvd2VyIgorCisjaW5jbHVkZSAiTVNQNDMwSVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiTVNQNDMwLmgiCisjaW5jbHVkZSAiTVNQNDMwTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIk1TUDQzMFRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJNU1A0MzBTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsQWxpYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVJbXBsLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1ZlY3RvckV4dHJhcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3R5cGVkZWYgZW51bSB7CisgIE5vSFdNdWx0LAorICBIV011bHRJbnRyLAorICBIV011bHROb0ludHIKK30gSFdNdWx0VXNlTW9kZTsKKworc3RhdGljIGNsOjpvcHQ8SFdNdWx0VXNlTW9kZT4KK0hXTXVsdE1vZGUoIm1zcDQzMC1od211bHQtbW9kZSIsCisgICAgICAgICAgIGNsOjpkZXNjKCJIYXJkd2FyZSBtdWx0aXBsaWVyIHVzZSBtb2RlIiksCisgICAgICAgICAgIGNsOjppbml0KEhXTXVsdE5vSW50ciksCisgICAgICAgICAgIGNsOjp2YWx1ZXMoCisgICAgICAgICAgICAgY2xFbnVtVmFsTihOb0hXTXVsdCwgIm5vIiwKKyAgICAgICAgICAgICAgICAiRG8gbm90IHVzZSBoYXJkd2FyZSBtdWx0aXBsaWVyIiksCisgICAgICAgICAgICAgY2xFbnVtVmFsTihIV011bHRJbnRyLCAiaW50ZXJydXB0cyIsCisgICAgICAgICAgICAgICAgIkFzc3VtZSBoYXJkd2FyZSBtdWx0aXBsaWVyIGNhbiBiZSB1c2VkIGluc2lkZSBpbnRlcnJ1cHRzIiksCisgICAgICAgICAgICAgY2xFbnVtVmFsTihIV011bHROb0ludHIsICJ1c2UiLAorICAgICAgICAgICAgICAgICJBc3N1bWUgaGFyZHdhcmUgbXVsdGlwbGllciBjYW5ub3QgYmUgdXNlZCBpbnNpZGUgaW50ZXJydXB0cyIpLAorICAgICAgICAgICAgIGNsRW51bVZhbEVuZCkpOworCitNU1A0MzBUYXJnZXRMb3dlcmluZzo6TVNQNDMwVGFyZ2V0TG93ZXJpbmcoTVNQNDMwVGFyZ2V0TWFjaGluZSAmdG0pIDoKKyAgVGFyZ2V0TG93ZXJpbmcodG0sIG5ldyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEYoKSksCisgIFN1YnRhcmdldCgqdG0uZ2V0U3VidGFyZ2V0SW1wbCgpKSwgVE0odG0pIHsKKworICBURCA9IGdldFRhcmdldERhdGEoKTsKKworICAvLyBTZXQgdXAgdGhlIHJlZ2lzdGVyIGNsYXNzZXMuCisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppOCwgIE1TUDQzMDo6R1I4UmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppMTYsIE1TUDQzMDo6R1IxNlJlZ2lzdGVyQ2xhc3MpOworCisgIC8vIENvbXB1dGUgZGVyaXZlZCBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZ2lzdGVyIGNsYXNzZXMKKyAgY29tcHV0ZVJlZ2lzdGVyUHJvcGVydGllcygpOworCisgIC8vIFByb3ZpZGUgYWxsIHNvcnRzIG9mIG9wZXJhdGlvbiBhY3Rpb25zCisKKyAgLy8gRGl2aXNpb24gaXMgZXhwZW5zaXZlCisgIHNldEludERpdklzQ2hlYXAoZmFsc2UpOworCisgIC8vIEV2ZW4gaWYgd2UgaGF2ZSBvbmx5IDEgYml0IHNoaWZ0IGhlcmUsIHdlIGNhbiBwZXJmb3JtCisgIC8vIHNoaWZ0cyBvZiB0aGUgd2hvbGUgYml0d2lkdGggMSBiaXQgcGVyIHN0ZXAuCisgIHNldFNoaWZ0QW1vdW50VHlwZShNVlQ6Omk4KTsKKworICBzZXRTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUoTVNQNDMwOjpTUFcpOworICBzZXRCb29sZWFuQ29udGVudHMoWmVyb09yT25lQm9vbGVhbkNvbnRlbnQpOworICBzZXRTY2hlZHVsaW5nUHJlZmVyZW5jZShTY2hlZDo6TGF0ZW5jeSk7CisKKyAgLy8gV2UgaGF2ZSBwb3N0LWluY3JlbWVudGVkIGxvYWRzIC8gc3RvcmVzLgorICBzZXRJbmRleGVkTG9hZEFjdGlvbihJU0Q6OlBPU1RfSU5DLCBNVlQ6Omk4LCBMZWdhbCk7CisgIHNldEluZGV4ZWRMb2FkQWN0aW9uKElTRDo6UE9TVF9JTkMsIE1WVDo6aTE2LCBMZWdhbCk7CisKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OkVYVExPQUQsICBNVlQ6OmkxLCAgUHJvbW90ZSk7CisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpTRVhUTE9BRCwgTVZUOjppMSwgIFByb21vdGUpOworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6WkVYVExPQUQsIE1WVDo6aTEsICBQcm9tb3RlKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlNFWFRMT0FELCBNVlQ6Omk4LCAgRXhwYW5kKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlNFWFRMT0FELCBNVlQ6OmkxNiwgRXhwYW5kKTsKKworICAvLyBXZSBkb24ndCBoYXZlIGFueSB0cnVuY3N0b3JlcworICBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVDo6aTE2LCBNVlQ6Omk4LCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQSwgICAgICAgICAgICAgIE1WVDo6aTgsICAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITCwgICAgICAgICAgICAgIE1WVDo6aTgsICAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTCwgICAgICAgICAgICAgIE1WVDo6aTgsICAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQSwgICAgICAgICAgICAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITCwgICAgICAgICAgICAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTCwgICAgICAgICAgICAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlJPVEwsICAgICAgICAgICAgIE1WVDo6aTgsICAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlJPVFIsICAgICAgICAgICAgIE1WVDo6aTgsICAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlJPVEwsICAgICAgICAgICAgIE1WVDo6aTE2LCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlJPVFIsICAgICAgICAgICAgIE1WVDo6aTE2LCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbEFkZHJlc3MsICAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkV4dGVybmFsU3ltYm9sLCAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJsb2NrQWRkcmVzcywgICAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0pULCAgICAgICAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0NDLCAgICAgICAgICAgIE1WVDo6aTgsICAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0NDLCAgICAgICAgICAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSQ09ORCwgICAgICAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFVENDLCAgICAgICAgICAgIE1WVDo6aTgsICAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFVENDLCAgICAgICAgICAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgICAgICAgICAgIE1WVDo6aTgsICAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgICAgICAgICAgIE1WVDo6aTE2LCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVF9DQywgICAgICAgIE1WVDo6aTgsICAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVF9DQywgICAgICAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5ELCAgICAgIE1WVDo6aTE2LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkRZTkFNSUNfU1RBQ0tBTExPQywgTVZUOjppOCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RFlOQU1JQ19TVEFDS0FMTE9DLCBNVlQ6OmkxNiwgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFRaLCAgICAgICAgICAgICBNVlQ6Omk4LCAgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFRaLCAgICAgICAgICAgICBNVlQ6OmkxNiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaLCAgICAgICAgICAgICBNVlQ6Omk4LCAgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaLCAgICAgICAgICAgICBNVlQ6OmkxNiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFBPUCwgICAgICAgICAgICBNVlQ6Omk4LCAgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFBPUCwgICAgICAgICAgICBNVlQ6OmkxNiwgICBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITF9QQVJUUywgICAgICAgIE1WVDo6aTgsICAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITF9QQVJUUywgICAgICAgIE1WVDo6aTE2LCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTF9QQVJUUywgICAgICAgIE1WVDo6aTgsICAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTF9QQVJUUywgICAgICAgIE1WVDo6aTE2LCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQV9QQVJUUywgICAgICAgIE1WVDo6aTgsICAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQV9QQVJUUywgICAgICAgIE1WVDo6aTE2LCAgIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTEsICAgRXhwYW5kKTsKKworICAvLyBGSVhNRTogSW1wbGVtZW50IGVmZmljaWVudGx5IG11bHRpcGxpY2F0aW9uIGJ5IGEgY29uc3RhbnQKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMLCAgICAgICAgICAgICAgTVZUOjppOCwgICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFMsICAgICAgICAgICAgTVZUOjppOCwgICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUsICAgICAgICAgICAgTVZUOjppOCwgICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCAgICAgICAgTVZUOjppOCwgICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCAgICAgICAgTVZUOjppOCwgICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMLCAgICAgICAgICAgICAgTVZUOjppMTYsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFMsICAgICAgICAgICAgTVZUOjppMTYsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUsICAgICAgICAgICAgTVZUOjppMTYsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCAgICAgICAgTVZUOjppMTYsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCAgICAgICAgTVZUOjppMTYsICAgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWLCAgICAgICAgICAgICBNVlQ6Omk4LCAgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWUkVNLCAgICAgICAgICBNVlQ6Omk4LCAgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCAgICAgICAgICAgICBNVlQ6Omk4LCAgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWLCAgICAgICAgICAgICBNVlQ6Omk4LCAgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCAgICAgICAgICBNVlQ6Omk4LCAgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkVNLCAgICAgICAgICAgICBNVlQ6Omk4LCAgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWLCAgICAgICAgICAgICBNVlQ6OmkxNiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWUkVNLCAgICAgICAgICBNVlQ6OmkxNiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCAgICAgICAgICAgICBNVlQ6OmkxNiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWLCAgICAgICAgICAgICBNVlQ6OmkxNiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCAgICAgICAgICBNVlQ6OmkxNiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkVNLCAgICAgICAgICAgICBNVlQ6OmkxNiwgICBFeHBhbmQpOworCisgIC8vIExpYmNhbGxzIG5hbWVzLgorICBpZiAoSFdNdWx0TW9kZSA9PSBIV011bHRJbnRyKSB7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok1VTF9JOCwgICJfX211bHFpM2h3Iik7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok1VTF9JMTYsICJfX211bGhpM2h3Iik7CisgIH0gZWxzZSBpZiAoSFdNdWx0TW9kZSA9PSBIV011bHROb0ludHIpIHsKKyAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6TVVMX0k4LCAgIl9fbXVscWkzaHdfbm9pbnQiKTsKKyAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6TVVMX0kxNiwgIl9fbXVsaGkzaHdfbm9pbnQiKTsKKyAgfQorfQorCitTRFZhbHVlIE1TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBjYXNlIElTRDo6U0hMOiAvLyBGQUxMVEhST1VHSAorICBjYXNlIElTRDo6U1JMOgorICBjYXNlIElTRDo6U1JBOiAgICAgICAgICAgICAgcmV0dXJuIExvd2VyU2hpZnRzKE9wLCBEQUcpOworICBjYXNlIElTRDo6R2xvYmFsQWRkcmVzczogICAgcmV0dXJuIExvd2VyR2xvYmFsQWRkcmVzcyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkJsb2NrQWRkcmVzczogICAgIHJldHVybiBMb3dlckJsb2NrQWRkcmVzcyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkV4dGVybmFsU3ltYm9sOiAgIHJldHVybiBMb3dlckV4dGVybmFsU3ltYm9sKE9wLCBEQUcpOworICBjYXNlIElTRDo6U0VUQ0M6ICAgICAgICAgICAgcmV0dXJuIExvd2VyU0VUQ0MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpCUl9DQzogICAgICAgICAgICByZXR1cm4gTG93ZXJCUl9DQyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzogICAgICAgIHJldHVybiBMb3dlclNFTEVDVF9DQyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOiAgICAgIHJldHVybiBMb3dlclNJR05fRVhURU5EKE9wLCBEQUcpOworICBjYXNlIElTRDo6UkVUVVJOQUREUjogICAgICAgcmV0dXJuIExvd2VyUkVUVVJOQUREUihPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkZSQU1FQUREUjogICAgICAgIHJldHVybiBMb3dlckZSQU1FQUREUihPcCwgREFHKTsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmltcGxlbWVudGVkIG9wZXJhbmQiKTsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9Cit9CisKKy8vLyBnZXRGdW5jdGlvbkFsaWdubWVudCAtIFJldHVybiB0aGUgTG9nMiBhbGlnbm1lbnQgb2YgdGhpcyBmdW5jdGlvbi4KK3Vuc2lnbmVkIE1TUDQzMFRhcmdldExvd2VyaW5nOjpnZXRGdW5jdGlvbkFsaWdubWVudChjb25zdCBGdW5jdGlvbiAqRikgY29uc3QgeworICByZXR1cm4gRi0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6T3B0aW1pemVGb3JTaXplKSA/IDEgOiAyOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgIE1TUDQzMCBJbmxpbmUgQXNzZW1ibHkgU3VwcG9ydAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGdldENvbnN0cmFpbnRUeXBlIC0gR2l2ZW4gYSBjb25zdHJhaW50IGxldHRlciwgcmV0dXJuIHRoZSB0eXBlIG9mCisvLy8gY29uc3RyYWludCBpdCBpcyBmb3IgdGhpcyB0YXJnZXQuCitUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUKK01TUDQzMFRhcmdldExvd2VyaW5nOjpnZXRDb25zdHJhaW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCkgY29uc3QgeworICBpZiAoQ29uc3RyYWludC5zaXplKCkgPT0gMSkgeworICAgIHN3aXRjaCAoQ29uc3RyYWludFswXSkgeworICAgIGNhc2UgJ3InOgorICAgICAgcmV0dXJuIENfUmVnaXN0ZXJDbGFzczsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoQ29uc3RyYWludCk7Cit9CisKK3N0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+CitNU1A0MzBUYXJnZXRMb3dlcmluZzo6CitnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0IHsKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICAvLyBHQ0MgQ29uc3RyYWludCBMZXR0ZXJzCisgICAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAncic6ICAgLy8gR0VORVJBTF9SRUdTCisgICAgICBpZiAoVlQgPT0gTVZUOjppOCkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBNU1A0MzA6OkdSOFJlZ2lzdGVyQ2xhc3MpOworCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIE1TUDQzMDo6R1IxNlJlZ2lzdGVyQ2xhc3MpOworICAgIH0KKyAgfQorCisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChDb25zdHJhaW50LCBWVCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nIENvbnZlbnRpb24gSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJNU1A0MzBHZW5DYWxsaW5nQ29udi5pbmMiCisKK1NEVmFsdWUKK01TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlckZvcm1hbEFyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKKworICBzd2l0Y2ggKENhbGxDb252KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgY2FsbGluZyBjb252ZW50aW9uIik7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkM6CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkZhc3Q6CisgICAgcmV0dXJuIExvd2VyQ0NDQXJndW1lbnRzKENoYWluLCBDYWxsQ29udiwgaXNWYXJBcmcsIElucywgZGwsIERBRywgSW5WYWxzKTsKKyAgY2FzZSBDYWxsaW5nQ29udjo6TVNQNDMwX0lOVFI6CisgICBpZiAoSW5zLmVtcHR5KCkpCisgICAgIHJldHVybiBDaGFpbjsKKyAgIGVsc2UgeworICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiSVNScyBjYW5ub3QgaGF2ZSBhcmd1bWVudHMiKTsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgfQorICB9Cit9CisKK1NEVmFsdWUKK01TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlckNhbGwoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworICAvLyBNU1A0MzAgdGFyZ2V0IGRvZXMgbm90IHlldCBzdXBwb3J0IHRhaWwgY2FsbCBvcHRpbWl6YXRpb24uCisgIGlzVGFpbENhbGwgPSBmYWxzZTsKKworICBzd2l0Y2ggKENhbGxDb252KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgY2FsbGluZyBjb252ZW50aW9uIik7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkZhc3Q6CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkM6CisgICAgcmV0dXJuIExvd2VyQ0NDQ2FsbFRvKENoYWluLCBDYWxsZWUsIENhbGxDb252LCBpc1ZhckFyZywgaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cywgT3V0VmFscywgSW5zLCBkbCwgREFHLCBJblZhbHMpOworICBjYXNlIENhbGxpbmdDb252OjpNU1A0MzBfSU5UUjoKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIklTUnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseSIpOworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KK30KKworLy8vIExvd2VyQ0NDQXJndW1lbnRzIC0gdHJhbnNmb3JtIHBoeXNpY2FsIHJlZ2lzdGVycyBpbnRvIHZpcnR1YWwgcmVnaXN0ZXJzIGFuZAorLy8vIGdlbmVyYXRlIGxvYWQgb3BlcmF0aW9ucyBmb3IgYXJndW1lbnRzIHBsYWNlcyBvbiB0aGUgc3RhY2suCisvLyBGSVhNRTogc3RydWN0IHJldHVybiBzdHVmZgorLy8gRklYTUU6IHZhcmFyZ3MKK1NEVmFsdWUKK01TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlckNDQ0FyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8gPSBNRi5nZXRSZWdJbmZvKCk7CisKKyAgLy8gQXNzaWduIGxvY2F0aW9ucyB0byBhbGwgb2YgdGhlIGluY29taW5nIGFyZ3VtZW50cy4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgQXJnTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworICBDQ0luZm8uQW5hbHl6ZUZvcm1hbEFyZ3VtZW50cyhJbnMsIENDX01TUDQzMCk7CisKKyAgYXNzZXJ0KCFpc1ZhckFyZyAmJiAiVmFyYXJncyBub3Qgc3VwcG9ydGVkIHlldCIpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBBcmdMb2NzW2ldOworICAgIGlmIChWQS5pc1JlZ0xvYygpKSB7CisgICAgICAvLyBBcmd1bWVudHMgcGFzc2VkIGluIHJlZ2lzdGVycworICAgICAgRVZUIFJlZ1ZUID0gVkEuZ2V0TG9jVlQoKTsKKyAgICAgIHN3aXRjaCAoUmVnVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICAgICAgZGVmYXVsdDogCisgICAgICAgIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgZXJycygpIDw8ICJMb3dlckZvcm1hbEFyZ3VtZW50cyBVbmhhbmRsZWQgYXJndW1lbnQgdHlwZTogIgorICAgICAgICAgICAgICAgPDwgUmVnVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSA8PCAiXG4iOworI2VuZGlmCisgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICAgICAgfQorICAgICAgY2FzZSBNVlQ6OmkxNjoKKyAgICAgICAgdW5zaWduZWQgVlJlZyA9CisgICAgICAgICAgUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoTVNQNDMwOjpHUjE2UmVnaXN0ZXJDbGFzcyk7CisgICAgICAgIFJlZ0luZm8uYWRkTGl2ZUluKFZBLmdldExvY1JlZygpLCBWUmVnKTsKKyAgICAgICAgU0RWYWx1ZSBBcmdWYWx1ZSA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIFJlZ1ZUKTsKKworICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIDgtYml0IHZhbHVlLCBpdCBpcyByZWFsbHkgcGFzc2VkIHByb21vdGVkIHRvIDE2CisgICAgICAgIC8vIGJpdHMuIEluc2VydCBhbiBhc3NlcnRbc3pdZXh0IHRvIGNhcHR1cmUgdGhpcywgdGhlbiB0cnVuY2F0ZSB0byB0aGUKKyAgICAgICAgLy8gcmlnaHQgc2l6ZS4KKyAgICAgICAgaWYgKFZBLmdldExvY0luZm8oKSA9PSBDQ1ZhbEFzc2lnbjo6U0V4dCkKKyAgICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0U2V4dCwgZGwsIFJlZ1ZULCBBcmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWYWx1ZVR5cGUoVkEuZ2V0VmFsVlQoKSkpOworICAgICAgICBlbHNlIGlmIChWQS5nZXRMb2NJbmZvKCkgPT0gQ0NWYWxBc3NpZ246OlpFeHQpCisgICAgICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFpleHQsIGRsLCBSZWdWVCwgQXJnVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKFZBLmdldFZhbFZUKCkpKTsKKworICAgICAgICBpZiAoVkEuZ2V0TG9jSW5mbygpICE9IENDVmFsQXNzaWduOjpGdWxsKQorICAgICAgICAgIEFyZ1ZhbHVlID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFZBLmdldFZhbFZUKCksIEFyZ1ZhbHVlKTsKKworICAgICAgICBJblZhbHMucHVzaF9iYWNrKEFyZ1ZhbHVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgICBhc3NlcnQoVkEuaXNNZW1Mb2MoKSk7CisgICAgICAvLyBMb2FkIHRoZSBhcmd1bWVudCB0byBhIHZpcnR1YWwgcmVnaXN0ZXIKKyAgICAgIHVuc2lnbmVkIE9ialNpemUgPSBWQS5nZXRMb2NWVCgpLmdldFNpemVJbkJpdHMoKS84OworICAgICAgaWYgKE9ialNpemUgPiAyKSB7CisgICAgICAgIGVycnMoKSA8PCAiTG93ZXJGb3JtYWxBcmd1bWVudHMgVW5oYW5kbGVkIGFyZ3VtZW50IHR5cGU6ICIKKyAgICAgICAgICAgICA8PCBWQS5nZXRMb2NWVCgpLmdldFNpbXBsZVZUKCkuU2ltcGxlVHkKKyAgICAgICAgICAgICA8PCAiXG4iOworICAgICAgfQorICAgICAgLy8gQ3JlYXRlIHRoZSBmcmFtZSBpbmRleCBvYmplY3QgZm9yIHRoaXMgaW5jb21pbmcgcGFyYW1ldGVyLi4uCisgICAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KE9ialNpemUsIFZBLmdldExvY01lbU9mZnNldCgpLCB0cnVlKTsKKworICAgICAgLy8gQ3JlYXRlIHRoZSBTZWxlY3Rpb25EQUcgbm9kZXMgY29ycmVzcG9uZGluZyB0byBhIGxvYWQKKyAgICAgIC8vZnJvbSB0aGlzIHBhcmFtZXRlcgorICAgICAgU0RWYWx1ZSBGSU4gPSBEQUcuZ2V0RnJhbWVJbmRleChGSSwgTVZUOjppMTYpOworICAgICAgSW5WYWxzLnB1c2hfYmFjayhEQUcuZ2V0TG9hZChWQS5nZXRMb2NWVCgpLCBkbCwgQ2hhaW4sIEZJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKK1NEVmFsdWUKK01TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKworICAvLyBDQ1ZhbEFzc2lnbiAtIHJlcHJlc2VudCB0aGUgYXNzaWdubWVudCBvZiB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgbG9jYXRpb24KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBSVkxvY3M7CisKKyAgLy8gSVNScyBjYW5ub3QgcmV0dXJuIGFueSB2YWx1ZS4KKyAgaWYgKENhbGxDb252ID09IENhbGxpbmdDb252OjpNU1A0MzBfSU5UUiAmJiAhT3V0cy5lbXB0eSgpKSB7CisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJJU1JzIGNhbm5vdCByZXR1cm4gYW55IHZhbHVlIik7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorCisgIC8vIENDU3RhdGUgLSBJbmZvIGFib3V0IHRoZSByZWdpc3RlcnMgYW5kIHN0YWNrIHNsb3QuCisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICBSVkxvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKworICAvLyBBbmFsaXplIHJldHVybiB2YWx1ZXMuCisgIENDSW5mby5BbmFseXplUmV0dXJuKE91dHMsIFJldENDX01TUDQzMCk7CisKKyAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgcmV0dXJuIGxvd2VyZWQgZm9yIHRoaXMgZnVuY3Rpb24sIGFkZCB0aGUgcmVncyB0byB0aGUKKyAgLy8gbGl2ZW91dCBzZXQgZm9yIHRoZSBmdW5jdGlvbi4KKyAgaWYgKERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkubGl2ZW91dF9lbXB0eSgpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpCisgICAgICBpZiAoUlZMb2NzW2ldLmlzUmVnTG9jKCkpCisgICAgICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkuYWRkTGl2ZU91dChSVkxvY3NbaV0uZ2V0TG9jUmVnKCkpOworICB9CisKKyAgU0RWYWx1ZSBGbGFnOworCisgIC8vIENvcHkgdGhlIHJlc3VsdCB2YWx1ZXMgaW50byB0aGUgb3V0cHV0IHJlZ2lzdGVycy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBSVkxvY3NbaV07CisgICAgYXNzZXJ0KFZBLmlzUmVnTG9jKCkgJiYgIkNhbiBvbmx5IHJldHVybiBpbiByZWdpc3RlcnMhIik7CisKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0VmFsc1tpXSwgRmxhZyk7CisKKyAgICAvLyBHdWFyYW50ZWUgdGhhdCBhbGwgZW1pdHRlZCBjb3BpZXMgYXJlIHN0dWNrIHRvZ2V0aGVyLAorICAgIC8vIGF2b2lkaW5nIHNvbWV0aGluZyBiYWQuCisgICAgRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisKKyAgdW5zaWduZWQgT3BjID0gKENhbGxDb252ID09IENhbGxpbmdDb252OjpNU1A0MzBfSU5UUiA/CisgICAgICAgICAgICAgICAgICBNU1A0MzBJU0Q6OlJFVElfRkxBRyA6IE1TUDQzMElTRDo6UkVUX0ZMQUcpOworCisgIGlmIChGbGFnLmdldE5vZGUoKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoT3BjLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4sIEZsYWcpOworCisgIC8vIFJldHVybiBWb2lkCisgIHJldHVybiBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbik7Cit9CisKKy8vLyBMb3dlckNDQ0NhbGxUbyAtIGZ1bmN0aW9ucyBhcmd1bWVudHMgYXJlIGNvcGllZCBmcm9tIHZpcnR1YWwgcmVncyB0bworLy8vIChwaHlzaWNhbCByZWdzKS8oc3RhY2sgZnJhbWUpLCBDQUxMU0VRX1NUQVJUIGFuZCBDQUxMU0VRX0VORCBhcmUgZW1pdHRlZC4KKy8vLyBUT0RPOiBzcmV0LgorU0RWYWx1ZQorTVNQNDMwVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ0NDQ2FsbFRvKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworICAvLyBBbmFseXplIG9wZXJhbmRzIG9mIHRoZSBjYWxsLCBhc3NpZ25pbmcgbG9jYXRpb25zIHRvIGVhY2ggb3BlcmFuZC4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgQXJnTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIENDSW5mby5BbmFseXplQ2FsbE9wZXJhbmRzKE91dHMsIENDX01TUDQzMCk7CisKKyAgLy8gR2V0IGEgY291bnQgb2YgaG93IG1hbnkgYnl0ZXMgYXJlIHRvIGJlIHB1c2hlZCBvbiB0aGUgc3RhY2suCisgIHVuc2lnbmVkIE51bUJ5dGVzID0gQ0NJbmZvLmdldE5leHRTdGFja09mZnNldCgpOworCisgIENoYWluID0gREFHLmdldENBTExTRVFfU1RBUlQoQ2hhaW4gLERBRy5nZXRDb25zdGFudChOdW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBvaW50ZXJUeSgpLCB0cnVlKSk7CisKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBTRFZhbHVlPiwgND4gUmVnc1RvUGFzczsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTI+IE1lbU9wQ2hhaW5zOworICBTRFZhbHVlIFN0YWNrUHRyOworCisgIC8vIFdhbGsgdGhlIHJlZ2lzdGVyL21lbWxvYyBhc3NpZ25tZW50cywgaW5zZXJ0aW5nIGNvcGllcy9sb2Fkcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ0xvY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENDVmFsQXNzaWduICZWQSA9IEFyZ0xvY3NbaV07CisKKyAgICBTRFZhbHVlIEFyZyA9IE91dFZhbHNbaV07CisKKyAgICAvLyBQcm9tb3RlIHRoZSB2YWx1ZSBpZiBuZWVkZWQuCisgICAgc3dpdGNoIChWQS5nZXRMb2NJbmZvKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbG9jIGluZm8hIik7CisgICAgICBjYXNlIENDVmFsQXNzaWduOjpGdWxsOiBicmVhazsKKyAgICAgIGNhc2UgQ0NWYWxBc3NpZ246OlNFeHQ6CisgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0NWYWxBc3NpZ246OlpFeHQ6CisgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0NWYWxBc3NpZ246OkFFeHQ6CisgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIFZBLmdldExvY1ZUKCksIEFyZyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEFyZ3VtZW50cyB0aGF0IGNhbiBiZSBwYXNzZWQgb24gcmVnaXN0ZXIgbXVzdCBiZSBrZXB0IGF0IFJlZ3NUb1Bhc3MKKyAgICAvLyB2ZWN0b3IKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoVkEuZ2V0TG9jUmVnKCksIEFyZykpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoVkEuaXNNZW1Mb2MoKSk7CisKKyAgICAgIGlmIChTdGFja1B0ci5nZXROb2RlKCkgPT0gMCkKKyAgICAgICAgU3RhY2tQdHIgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBNU1A0MzA6OlNQVywgZ2V0UG9pbnRlclR5KCkpOworCisgICAgICBTRFZhbHVlIFB0ck9mZiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoVkEuZ2V0TG9jTWVtT2Zmc2V0KCkpKTsKKworCisgICAgICBNZW1PcENoYWlucy5wdXNoX2JhY2soREFHLmdldFN0b3JlKENoYWluLCBkbCwgQXJnLCBQdHJPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRTdGFjaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQS5nZXRMb2NNZW1PZmZzZXQoKSwgZmFsc2UsIGZhbHNlLCAwKSk7CisgICAgfQorICB9CisKKyAgLy8gVHJhbnNmb3JtIGFsbCBzdG9yZSBub2RlcyBpbnRvIG9uZSBzaW5nbGUgbm9kZSBiZWNhdXNlIGFsbCBzdG9yZSBub2RlcyBhcmUKKyAgLy8gaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlci4KKyAgaWYgKCFNZW1PcENoYWlucy5lbXB0eSgpKQorICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAmTWVtT3BDaGFpbnNbMF0sIE1lbU9wQ2hhaW5zLnNpemUoKSk7CisKKyAgLy8gQnVpbGQgYSBzZXF1ZW5jZSBvZiBjb3B5LXRvLXJlZyBub2RlcyBjaGFpbmVkIHRvZ2V0aGVyIHdpdGggdG9rZW4gY2hhaW4gYW5kCisgIC8vIGZsYWcgb3BlcmFuZHMgd2hpY2ggY29weSB0aGUgb3V0Z29pbmcgYXJncyBpbnRvIHJlZ2lzdGVycy4gIFRoZSBJbkZsYWcgaW4KKyAgLy8gbmVjZXNzYXJ5IHNpbmNlIGFsbCBlbWl0ZWQgaW5zdHJ1Y3Rpb25zIG11c3QgYmUgc3R1Y2sgdG9nZXRoZXIuCisgIFNEVmFsdWUgSW5GbGFnOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgUmVnc1RvUGFzc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQsIEluRmxhZyk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIH0KKworICAvLyBJZiB0aGUgY2FsbGVlIGlzIGEgR2xvYmFsQWRkcmVzcyBub2RlIChxdWl0ZSBjb21tb24sIGV2ZXJ5IGRpcmVjdCBjYWxsIGlzKQorICAvLyB0dXJuIGl0IGludG8gYSBUYXJnZXRHbG9iYWxBZGRyZXNzIG5vZGUgc28gdGhhdCBsZWdhbGl6ZSBkb2Vzbid0IGhhY2sgaXQuCisgIC8vIExpa2V3aXNlIEV4dGVybmFsU3ltYm9sIC0+IFRhcmdldEV4dGVybmFsU3ltYm9sLgorICBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KENhbGxlZSkpCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoRy0+Z2V0R2xvYmFsKCksIGRsLCBNVlQ6OmkxNik7CisgIGVsc2UgaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpFID0gZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKEUtPmdldFN5bWJvbCgpLCBNVlQ6OmkxNik7CisKKyAgLy8gUmV0dXJucyBhIGNoYWluICYgYSBmbGFnIGZvciByZXR2YWwgY29weSB0byB1c2UuCisgIFNEVlRMaXN0IE5vZGVUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wczsKKyAgT3BzLnB1c2hfYmFjayhDaGFpbik7CisgIE9wcy5wdXNoX2JhY2soQ2FsbGVlKTsKKworICAvLyBBZGQgYXJndW1lbnQgcmVnaXN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gdGhhdCB0aGV5IGFyZQorICAvLyBrbm93biBsaXZlIGludG8gdGhlIGNhbGwuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzVG9QYXNzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0UmVnaXN0ZXIoUmVnc1RvUGFzc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdzVG9QYXNzW2ldLnNlY29uZC5nZXRWYWx1ZVR5cGUoKSkpOworCisgIGlmIChJbkZsYWcuZ2V0Tm9kZSgpKQorICAgIE9wcy5wdXNoX2JhY2soSW5GbGFnKTsKKworICBDaGFpbiA9IERBRy5nZXROb2RlKE1TUDQzMElTRDo6Q0FMTCwgZGwsIE5vZGVUeXMsICZPcHNbMF0sIE9wcy5zaXplKCkpOworICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKworICAvLyBDcmVhdGUgdGhlIENBTExTRVFfRU5EIG5vZGUuCisgIENoYWluID0gREFHLmdldENBTExTRVFfRU5EKENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTnVtQnl0ZXMsIGdldFBvaW50ZXJUeSgpLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIGdldFBvaW50ZXJUeSgpLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5GbGFnKTsKKyAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisKKyAgLy8gSGFuZGxlIHJlc3VsdCB2YWx1ZXMsIGNvcHlpbmcgdGhlbSBvdXQgb2YgcGh5c3JlZ3MgaW50byB2cmVncyB0aGF0IHdlCisgIC8vIHJldHVybi4KKyAgcmV0dXJuIExvd2VyQ2FsbFJlc3VsdChDaGFpbiwgSW5GbGFnLCBDYWxsQ29udiwgaXNWYXJBcmcsIElucywgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLCBJblZhbHMpOworfQorCisvLy8gTG93ZXJDYWxsUmVzdWx0IC0gTG93ZXIgdGhlIHJlc3VsdCB2YWx1ZXMgb2YgYSBjYWxsIGludG8gdGhlCisvLy8gYXBwcm9wcmlhdGUgY29waWVzIG91dCBvZiBhcHByb3ByaWF0ZSBwaHlzaWNhbCByZWdpc3RlcnMuCisvLy8KK1NEVmFsdWUKK01TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlckNhbGxSZXN1bHQoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBJbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKworICAvLyBBc3NpZ24gbG9jYXRpb25zIHRvIGVhY2ggdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBjYWxsLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIFJWTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIENDSW5mby5BbmFseXplQ2FsbFJlc3VsdChJbnMsIFJldENDX01TUDQzMCk7CisKKyAgLy8gQ29weSBhbGwgb2YgdGhlIHJlc3VsdCByZWdpc3RlcnMgb3V0IG9mIHRoZWlyIHNwZWNpZmllZCBwaHlzcmVnLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkgeworICAgIENoYWluID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgUlZMb2NzW2ldLmdldExvY1JlZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJWTG9jc1tpXS5nZXRWYWxWVCgpLCBJbkZsYWcpLmdldFZhbHVlKDEpOworICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDIpOworICAgIEluVmFscy5wdXNoX2JhY2soQ2hhaW4uZ2V0VmFsdWUoMCkpOworICB9CisKKyAgcmV0dXJuIENoYWluOworfQorCitTRFZhbHVlIE1TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlclNoaWZ0cyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgdW5zaWduZWQgT3BjID0gT3AuZ2V0T3Bjb2RlKCk7CisgIFNETm9kZSogTiA9IE9wLmdldE5vZGUoKTsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBFeHBhbmQgbm9uLWNvbnN0YW50IHNoaWZ0cyB0byBsb29wczoKKyAgaWYgKCFpc2E8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMSkpKQorICAgIHN3aXRjaCAoT3BjKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwICYmICJJbnZhbGlkIHNoaWZ0IG9wY29kZSEiKTsKKyAgICBjYXNlIElTRDo6U0hMOgorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKE1TUDQzMElTRDo6U0hMLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWVCwgTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSk7CisgICAgY2FzZSBJU0Q6OlNSQToKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShNU1A0MzBJU0Q6OlNSQSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlQsIE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSkpOworICAgIGNhc2UgSVNEOjpTUkw6CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoTVNQNDMwSVNEOjpTUkwsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZULCBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpKTsKKyAgICB9CisKKyAgdWludDY0X3QgU2hpZnRBbW91bnQgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCk7CisKKyAgLy8gRXhwYW5kIHRoZSBzdHVmZiBpbnRvIHNlcXVlbmNlIG9mIHNoaWZ0cy4KKyAgLy8gRklYTUU6IGZvciBzb21lIHNoaWZ0IGFtb3VudHMgdGhpcyBtaWdodCBiZSBkb25lIGJldHRlciEKKyAgLy8gRS5nLjogZm9vID4+ICg4ICsgTikgPT4gc3h0KHN3cGIoZm9vKSkgPj4gTgorICBTRFZhbHVlIFZpY3RpbSA9IE4tPmdldE9wZXJhbmQoMCk7CisKKyAgaWYgKE9wYyA9PSBJU0Q6OlNSTCAmJiBTaGlmdEFtb3VudCkgeworICAgIC8vIEVtaXQgYSBzcGVjaWFsIGdvb2RuZXNzIGhlcmU6CisgICAgLy8gc3JsIEEsIDEgPT4gY2xyYzsgcnJjIEEKKyAgICBWaWN0aW0gPSBEQUcuZ2V0Tm9kZShNU1A0MzBJU0Q6OlJSQywgZGwsIFZULCBWaWN0aW0pOworICAgIFNoaWZ0QW1vdW50IC09IDE7CisgIH0KKworICB3aGlsZSAoU2hpZnRBbW91bnQtLSkKKyAgICBWaWN0aW0gPSBEQUcuZ2V0Tm9kZSgoT3BjID09IElTRDo6U0hMID8gTVNQNDMwSVNEOjpSTEEgOiBNU1A0MzBJU0Q6OlJSQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIFZULCBWaWN0aW0pOworCisgIHJldHVybiBWaWN0aW07Cit9CisKK1NEVmFsdWUgTVNQNDMwVGFyZ2V0TG93ZXJpbmc6Okxvd2VyR2xvYmFsQWRkcmVzcyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGNhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oT3ApLT5nZXRHbG9iYWwoKTsKKyAgaW50NjRfdCBPZmZzZXQgPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKS0+Z2V0T2Zmc2V0KCk7CisKKyAgLy8gQ3JlYXRlIHRoZSBUYXJnZXRHbG9iYWxBZGRyZXNzIG5vZGUsIGZvbGRpbmcgaW4gdGhlIGNvbnN0YW50IG9mZnNldC4KKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgT3AuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSwgT2Zmc2V0KTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKE1TUDQzMElTRDo6V3JhcHBlciwgT3AuZ2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIGdldFBvaW50ZXJUeSgpLCBSZXN1bHQpOworfQorCitTRFZhbHVlIE1TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlckV4dGVybmFsU3ltYm9sKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgY29uc3QgY2hhciAqU3ltID0gY2FzdDxFeHRlcm5hbFN5bWJvbFNETm9kZT4oT3ApLT5nZXRTeW1ib2woKTsKKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0RXh0ZXJuYWxTeW1ib2woU3ltLCBnZXRQb2ludGVyVHkoKSk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKE1TUDQzMElTRDo6V3JhcHBlciwgZGwsIGdldFBvaW50ZXJUeSgpLCBSZXN1bHQpOzsKK30KKworU0RWYWx1ZSBNU1A0MzBUYXJnZXRMb3dlcmluZzo6TG93ZXJCbG9ja0FkZHJlc3MoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgY29uc3QgQmxvY2tBZGRyZXNzICpCQSA9IGNhc3Q8QmxvY2tBZGRyZXNzU0ROb2RlPihPcCktPmdldEJsb2NrQWRkcmVzcygpOworICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXRCbG9ja0FkZHJlc3MoQkEsIGdldFBvaW50ZXJUeSgpLCAvKmlzVGFyZ2V0PSovdHJ1ZSk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKE1TUDQzMElTRDo6V3JhcHBlciwgZGwsIGdldFBvaW50ZXJUeSgpLCBSZXN1bHQpOzsKK30KKworc3RhdGljIFNEVmFsdWUgRW1pdENNUChTRFZhbHVlICZMSFMsIFNEVmFsdWUgJlJIUywgU0RWYWx1ZSAmVGFyZ2V0Q0MsCisgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Q29uZENvZGUgQ0MsCisgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgeworICAvLyBGSVhNRTogSGFuZGxlIGJpdHRlc3RzIHNvbWVkYXkKKyAgYXNzZXJ0KCFMSFMuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCkgJiYgIldlIGRvbid0IGhhbmRsZSBGUCB5ZXQiKTsKKworICAvLyBGSVhNRTogSGFuZGxlIGp1bXAgbmVnYXRpdmUgc29tZWRheQorICBNU1A0MzBDQzo6Q29uZENvZGVzIFRDQyA9IE1TUDQzMENDOjpDT05EX0lOVkFMSUQ7CisgIHN3aXRjaCAoQ0MpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBpbnRlZ2VyIGNvbmRpdGlvbiEiKTsKKyAgY2FzZSBJU0Q6OlNFVEVROgorICAgIFRDQyA9IE1TUDQzMENDOjpDT05EX0U7ICAgICAvLyBha2EgQ09ORF9aCisgICAgLy8gTWlub3Igb3B0aW1pemF0aW9uOiBpZiBMSFMgaXMgYSBjb25zdGFudCwgc3dhcCBvcGVyYW5kcywgdGhlbiB0aGUKKyAgICAvLyBjb25zdGFudCBjYW4gYmUgZm9sZGVkIGludG8gY29tcGFyaXNvbi4KKyAgICBpZiAoTEhTLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpCisgICAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUTkU6CisgICAgVENDID0gTVNQNDMwQ0M6OkNPTkRfTkU7ICAgIC8vIGFrYSBDT05EX05aCisgICAgLy8gTWlub3Igb3B0aW1pemF0aW9uOiBpZiBMSFMgaXMgYSBjb25zdGFudCwgc3dhcCBvcGVyYW5kcywgdGhlbiB0aGUKKyAgICAvLyBjb25zdGFudCBjYW4gYmUgZm9sZGVkIGludG8gY29tcGFyaXNvbi4KKyAgICBpZiAoTEhTLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpCisgICAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUVUxFOgorICAgIHN0ZDo6c3dhcChMSFMsIFJIUyk7ICAgICAgICAvLyBGQUxMVEhST1VHSAorICBjYXNlIElTRDo6U0VUVUdFOgorICAgIC8vIFR1cm4gbGhzIHU+PSByaHMgd2l0aCBsaHMgY29uc3RhbnQgaW50byByaHMgdTwgbGhzKzEsIHRoaXMgYWxsb3dzIHVzIHRvCisgICAgLy8gZm9sZCBjb25zdGFudCBpbnRvIGluc3RydWN0aW9uLgorICAgIGlmIChjb25zdCBDb25zdGFudFNETm9kZSAqIEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTEhTKSkgeworICAgICAgTEhTID0gUkhTOworICAgICAgUkhTID0gREFHLmdldENvbnN0YW50KEMtPmdldFNFeHRWYWx1ZSgpICsgMSwgQy0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgICAgIFRDQyA9IE1TUDQzMENDOjpDT05EX0xPOworICAgICAgYnJlYWs7CisgICAgfQorICAgIFRDQyA9IE1TUDQzMENDOjpDT05EX0hTOyAgICAvLyBha2EgQ09ORF9DCisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRVR1Q6CisgICAgc3RkOjpzd2FwKExIUywgUkhTKTsgICAgICAgIC8vIEZBTExUSFJPVUdICisgIGNhc2UgSVNEOjpTRVRVTFQ6CisgICAgLy8gVHVybiBsaHMgdTwgcmhzIHdpdGggbGhzIGNvbnN0YW50IGludG8gcmhzIHU+PSBsaHMrMSwgdGhpcyBhbGxvd3MgdXMgdG8KKyAgICAvLyBmb2xkIGNvbnN0YW50IGludG8gaW5zdHJ1Y3Rpb24uCisgICAgaWYgKGNvbnN0IENvbnN0YW50U0ROb2RlICogQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihMSFMpKSB7CisgICAgICBMSFMgPSBSSFM7CisgICAgICBSSFMgPSBEQUcuZ2V0Q29uc3RhbnQoQy0+Z2V0U0V4dFZhbHVlKCkgKyAxLCBDLT5nZXRWYWx1ZVR5cGUoMCkpOworICAgICAgVENDID0gTVNQNDMwQ0M6OkNPTkRfSFM7CisgICAgICBicmVhazsKKyAgICB9CisgICAgVENDID0gTVNQNDMwQ0M6OkNPTkRfTE87ICAgIC8vIGFrYSBDT05EX05DCisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRMRToKKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOyAgICAgICAgLy8gRkFMTFRIUk9VR0gKKyAgY2FzZSBJU0Q6OlNFVEdFOgorICAgIC8vIFR1cm4gbGhzID49IHJocyB3aXRoIGxocyBjb25zdGFudCBpbnRvIHJocyA8IGxocysxLCB0aGlzIGFsbG93cyB1cyB0bworICAgIC8vIGZvbGQgY29uc3RhbnQgaW50byBpbnN0cnVjdGlvbi4KKyAgICBpZiAoY29uc3QgQ29uc3RhbnRTRE5vZGUgKiBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KExIUykpIHsKKyAgICAgIExIUyA9IFJIUzsKKyAgICAgIFJIUyA9IERBRy5nZXRDb25zdGFudChDLT5nZXRTRXh0VmFsdWUoKSArIDEsIEMtPmdldFZhbHVlVHlwZSgwKSk7CisgICAgICBUQ0MgPSBNU1A0MzBDQzo6Q09ORF9MOworICAgICAgYnJlYWs7CisgICAgfQorICAgIFRDQyA9IE1TUDQzMENDOjpDT05EX0dFOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUR1Q6CisgICAgc3RkOjpzd2FwKExIUywgUkhTKTsgICAgICAgIC8vIEZBTExUSFJPVUdICisgIGNhc2UgSVNEOjpTRVRMVDoKKyAgICAvLyBUdXJuIGxocyA8IHJocyB3aXRoIGxocyBjb25zdGFudCBpbnRvIHJocyA+PSBsaHMrMSwgdGhpcyBhbGxvd3MgdXMgdG8KKyAgICAvLyBmb2xkIGNvbnN0YW50IGludG8gaW5zdHJ1Y3Rpb24uCisgICAgaWYgKGNvbnN0IENvbnN0YW50U0ROb2RlICogQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihMSFMpKSB7CisgICAgICBMSFMgPSBSSFM7CisgICAgICBSSFMgPSBEQUcuZ2V0Q29uc3RhbnQoQy0+Z2V0U0V4dFZhbHVlKCkgKyAxLCBDLT5nZXRWYWx1ZVR5cGUoMCkpOworICAgICAgVENDID0gTVNQNDMwQ0M6OkNPTkRfR0U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgVENDID0gTVNQNDMwQ0M6OkNPTkRfTDsKKyAgICBicmVhazsKKyAgfQorCisgIFRhcmdldENDID0gREFHLmdldENvbnN0YW50KFRDQywgTVZUOjppOCk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShNU1A0MzBJU0Q6OkNNUCwgZGwsIE1WVDo6RmxhZywgTEhTLCBSSFMpOworfQorCisKK1NEVmFsdWUgTVNQNDMwVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQlJfQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBDaGFpbiA9IE9wLmdldE9wZXJhbmQoMCk7CisgIElTRDo6Q29uZENvZGUgQ0MgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKS0+Z2V0KCk7CisgIFNEVmFsdWUgTEhTICAgPSBPcC5nZXRPcGVyYW5kKDIpOworICBTRFZhbHVlIFJIUyAgID0gT3AuZ2V0T3BlcmFuZCgzKTsKKyAgU0RWYWx1ZSBEZXN0ICA9IE9wLmdldE9wZXJhbmQoNCk7CisgIERlYnVnTG9jIGRsICAgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIFNEVmFsdWUgVGFyZ2V0Q0M7CisgIFNEVmFsdWUgRmxhZyA9IEVtaXRDTVAoTEhTLCBSSFMsIFRhcmdldENDLCBDQywgZGwsIERBRyk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKE1TUDQzMElTRDo6QlJfQ0MsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIENoYWluLCBEZXN0LCBUYXJnZXRDQywgRmxhZyk7Cit9CisKK1NEVmFsdWUgTVNQNDMwVGFyZ2V0TG93ZXJpbmc6Okxvd2VyU0VUQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBMSFMgICA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgUkhTICAgPSBPcC5nZXRPcGVyYW5kKDEpOworICBEZWJ1Z0xvYyBkbCAgID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBJZiB3ZSBhcmUgZG9pbmcgYW4gQU5EIGFuZCB0ZXN0aW5nIGFnYWluc3QgemVybywgdGhlbiB0aGUgQ01QCisgIC8vIHdpbGwgbm90IGJlIGdlbmVyYXRlZC4gIFRoZSBBTkQgKG9yIEJJVCkgd2lsbCBnZW5lcmF0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLAorICAvLyBidXQgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gQ01QLgorICAvLyBGSVhNRTogc2luY2Ugd2UncmUgZG9pbmcgYSBwb3N0LXByb2Nlc3NpbmcsIHVzZSBhIHBzZXVkb2luc3RyIGhlcmUsIHNvCisgIC8vIGxvd2VyaW5nICYgaXNlbCB3b3VsZG4ndCBkaXZlcmdlLgorICBib29sIGFuZENDID0gZmFsc2U7CisgIGlmIChDb25zdGFudFNETm9kZSAqUkhTQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihSSFMpKSB7CisgICAgaWYgKFJIU0MtPmlzTnVsbFZhbHVlKCkgJiYgTEhTLmhhc09uZVVzZSgpICYmCisgICAgICAgIChMSFMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTkQgfHwKKyAgICAgICAgIChMSFMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUUlVOQ0FURSAmJgorICAgICAgICAgIExIUy5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6QU5EKSkpIHsKKyAgICAgIGFuZENDID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgSVNEOjpDb25kQ29kZSBDQyA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KE9wLmdldE9wZXJhbmQoMikpLT5nZXQoKTsKKyAgU0RWYWx1ZSBUYXJnZXRDQzsKKyAgU0RWYWx1ZSBGbGFnID0gRW1pdENNUChMSFMsIFJIUywgVGFyZ2V0Q0MsIENDLCBkbCwgREFHKTsKKworICAvLyBHZXQgdGhlIGNvbmRpdGlvbiBjb2RlcyBkaXJlY3RseSBmcm9tIHRoZSBzdGF0dXMgcmVnaXN0ZXIsIGlmIGl0cyBlYXN5LgorICAvLyBPdGhlcndpc2UgYSBicmFuY2ggd2lsbCBiZSBnZW5lcmF0ZWQuICBOb3RlIHRoYXQgdGhlIEFORCBhbmQgQklUCisgIC8vIGluc3RydWN0aW9ucyBnZW5lcmF0ZSBkaWZmZXJlbnQgZmxhZ3MgdGhhbiBDTVAsIHRoZSBjYXJyeSBiaXQgY2FuIGJlIHVzZWQKKyAgLy8gZm9yIE5FL0VRLgorICBib29sIEludmVydCA9IGZhbHNlOworICBib29sIFNoaWZ0ID0gZmFsc2U7CisgIGJvb2wgQ29udmVydCA9IHRydWU7CisgIHN3aXRjaCAoY2FzdDxDb25zdGFudFNETm9kZT4oVGFyZ2V0Q0MpLT5nZXRaRXh0VmFsdWUoKSkgeworICAgZGVmYXVsdDoKKyAgICBDb252ZXJ0ID0gZmFsc2U7CisgICAgYnJlYWs7CisgICBjYXNlIE1TUDQzMENDOjpDT05EX0hTOgorICAgICAvLyBSZXMgPSBTUlcgJiAxLCBubyBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkCisgICAgIGJyZWFrOworICAgY2FzZSBNU1A0MzBDQzo6Q09ORF9MTzoKKyAgICAgLy8gUmVzID0gfihTUlcgJiAxKQorICAgICBJbnZlcnQgPSB0cnVlOworICAgICBicmVhazsKKyAgIGNhc2UgTVNQNDMwQ0M6OkNPTkRfTkU6CisgICAgIGlmIChhbmRDQykgeworICAgICAgIC8vIEMgPSB+WiwgdGh1cyBSZXMgPSBTUlcgJiAxLCBubyBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkCisgICAgIH0gZWxzZSB7CisgICAgICAgLy8gUmVzID0gfigoU1JXID4+IDEpICYgMSkKKyAgICAgICBTaGlmdCA9IHRydWU7CisgICAgICAgSW52ZXJ0ID0gdHJ1ZTsKKyAgICAgfQorICAgICBicmVhazsKKyAgIGNhc2UgTVNQNDMwQ0M6OkNPTkRfRToKKyAgICAgU2hpZnQgPSB0cnVlOworICAgICAvLyBDID0gflogZm9yIEFORCBpbnN0cnVjdGlvbiwgdGh1cyB3ZSBjYW4gcHV0IFJlcyA9IH4oU1JXICYgMSksIGhvd2V2ZXIsCisgICAgIC8vIFJlcyA9IChTUlcgPj4gMSkgJiAxIGlzIDEgd29yZCBzaG9ydGVyLgorICAgICBicmVhazsKKyAgfQorICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgU0RWYWx1ZSBPbmUgID0gREFHLmdldENvbnN0YW50KDEsIFZUKTsKKyAgaWYgKENvbnZlcnQpIHsKKyAgICBTRFZhbHVlIFNSID0gREFHLmdldENvcHlGcm9tUmVnKERBRy5nZXRFbnRyeU5vZGUoKSwgZGwsIE1TUDQzMDo6U1JXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMTYsIEZsYWcpOworICAgIGlmIChTaGlmdCkKKyAgICAgIC8vIEZJWE1FOiBzb21ld2hlcmUgdGhpcyBpcyB0dXJuZWQgaW50byBhIFNSTCwgbG93ZXIgaXQgTVNQIHNwZWNpZmljPworICAgICAgU1IgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSQSwgZGwsIE1WVDo6aTE2LCBTUiwgT25lKTsKKyAgICBTUiA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTVZUOjppMTYsIFNSLCBPbmUpOworICAgIGlmIChJbnZlcnQpCisgICAgICBTUiA9IERBRy5nZXROb2RlKElTRDo6WE9SLCBkbCwgTVZUOjppMTYsIFNSLCBPbmUpOworICAgIHJldHVybiBTUjsKKyAgfSBlbHNlIHsKKyAgICBTRFZhbHVlIFplcm8gPSBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpOworICAgIFNEVlRMaXN0IFZUcyA9IERBRy5nZXRWVExpc3QoT3AuZ2V0VmFsdWVUeXBlKCksIE1WVDo6RmxhZyk7CisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gT3BzOworICAgIE9wcy5wdXNoX2JhY2soT25lKTsKKyAgICBPcHMucHVzaF9iYWNrKFplcm8pOworICAgIE9wcy5wdXNoX2JhY2soVGFyZ2V0Q0MpOworICAgIE9wcy5wdXNoX2JhY2soRmxhZyk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKE1TUDQzMElTRDo6U0VMRUNUX0NDLCBkbCwgVlRzLCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgfQorfQorCitTRFZhbHVlIE1TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlclNFTEVDVF9DQyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBMSFMgICAgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFJIUyAgICA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgVHJ1ZVYgID0gT3AuZ2V0T3BlcmFuZCgyKTsKKyAgU0RWYWx1ZSBGYWxzZVYgPSBPcC5nZXRPcGVyYW5kKDMpOworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCg0KSktPmdldCgpOworICBEZWJ1Z0xvYyBkbCAgICA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgU0RWYWx1ZSBUYXJnZXRDQzsKKyAgU0RWYWx1ZSBGbGFnID0gRW1pdENNUChMSFMsIFJIUywgVGFyZ2V0Q0MsIENDLCBkbCwgREFHKTsKKworICBTRFZUTGlzdCBWVHMgPSBEQUcuZ2V0VlRMaXN0KE9wLmdldFZhbHVlVHlwZSgpLCBNVlQ6OkZsYWcpOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBPcHM7CisgIE9wcy5wdXNoX2JhY2soVHJ1ZVYpOworICBPcHMucHVzaF9iYWNrKEZhbHNlVik7CisgIE9wcy5wdXNoX2JhY2soVGFyZ2V0Q0MpOworICBPcHMucHVzaF9iYWNrKEZsYWcpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShNU1A0MzBJU0Q6OlNFTEVDVF9DQywgZGwsIFZUcywgJk9wc1swXSwgT3BzLnNpemUoKSk7Cit9CisKK1NEVmFsdWUgTVNQNDMwVGFyZ2V0TG93ZXJpbmc6Okxvd2VyU0lHTl9FWFRFTkQoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBWYWwgPSBPcC5nZXRPcGVyYW5kKDApOworICBFVlQgVlQgICAgICA9IE9wLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgYXNzZXJ0KFZUID09IE1WVDo6aTE2ICYmICJPbmx5IHN1cHBvcnQgaTE2IGZvciBub3chIik7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIFZULCBWYWwpLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShWYWwuZ2V0VmFsdWVUeXBlKCkpKTsKK30KKworU0RWYWx1ZQorTVNQNDMwVGFyZ2V0TG93ZXJpbmc6OmdldFJldHVybkFkZHJlc3NGcmFtZUluZGV4KFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIE1TUDQzME1hY2hpbmVGdW5jdGlvbkluZm8gKkZ1bmNJbmZvID0gTUYuZ2V0SW5mbzxNU1A0MzBNYWNoaW5lRnVuY3Rpb25JbmZvPigpOworICBpbnQgUmV0dXJuQWRkckluZGV4ID0gRnVuY0luZm8tPmdldFJBSW5kZXgoKTsKKworICBpZiAoUmV0dXJuQWRkckluZGV4ID09IDApIHsKKyAgICAvLyBTZXQgdXAgYSBmcmFtZSBvYmplY3QgZm9yIHRoZSByZXR1cm4gYWRkcmVzcy4KKyAgICB1aW50NjRfdCBTbG90U2l6ZSA9IFRELT5nZXRQb2ludGVyU2l6ZSgpOworICAgIFJldHVybkFkZHJJbmRleCA9IE1GLmdldEZyYW1lSW5mbygpLT5DcmVhdGVGaXhlZE9iamVjdChTbG90U2l6ZSwgLVNsb3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICBGdW5jSW5mby0+c2V0UkFJbmRleChSZXR1cm5BZGRySW5kZXgpOworICB9CisKKyAgcmV0dXJuIERBRy5nZXRGcmFtZUluZGV4KFJldHVybkFkZHJJbmRleCwgZ2V0UG9pbnRlclR5KCkpOworfQorCitTRFZhbHVlIE1TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlclJFVFVSTkFERFIoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnJhbWVJbmZvKCk7CisgIE1GSS0+c2V0UmV0dXJuQWRkcmVzc0lzVGFrZW4odHJ1ZSk7CisKKyAgdW5zaWduZWQgRGVwdGggPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDApKS0+Z2V0WkV4dFZhbHVlKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBpZiAoRGVwdGggPiAwKSB7CisgICAgU0RWYWx1ZSBGcmFtZUFkZHIgPSBMb3dlckZSQU1FQUREUihPcCwgREFHKTsKKyAgICBTRFZhbHVlIE9mZnNldCA9CisgICAgICBEQUcuZ2V0Q29uc3RhbnQoVEQtPmdldFBvaW50ZXJTaXplKCksIE1WVDo6aTE2KTsKKyAgICByZXR1cm4gREFHLmdldExvYWQoZ2V0UG9pbnRlclR5KCksIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lQWRkciwgT2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgfQorCisgIC8vIEp1c3QgbG9hZCB0aGUgcmV0dXJuIGFkZHJlc3MuCisgIFNEVmFsdWUgUmV0QWRkckZJID0gZ2V0UmV0dXJuQWRkcmVzc0ZyYW1lSW5kZXgoREFHKTsKKyAgcmV0dXJuIERBRy5nZXRMb2FkKGdldFBvaW50ZXJUeSgpLCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgUmV0QWRkckZJLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworfQorCitTRFZhbHVlIE1TUDQzMFRhcmdldExvd2VyaW5nOjpMb3dlckZSQU1FQUREUihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZyYW1lSW5mbygpOworICBNRkktPnNldEZyYW1lQWRkcmVzc0lzVGFrZW4odHJ1ZSk7CisKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsgIC8vIEZJWE1FIHByb2JhYmx5IG5vdCBtZWFuaW5nZnVsCisgIHVuc2lnbmVkIERlcHRoID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgwKSktPmdldFpFeHRWYWx1ZSgpOworICBTRFZhbHVlIEZyYW1lQWRkciA9IERBRy5nZXRDb3B5RnJvbVJlZyhEQUcuZ2V0RW50cnlOb2RlKCksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1A0MzA6OkZQVywgVlQpOworICB3aGlsZSAoRGVwdGgtLSkKKyAgICBGcmFtZUFkZHIgPSBEQUcuZ2V0TG9hZChWVCwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwgRnJhbWVBZGRyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgIHJldHVybiBGcmFtZUFkZHI7Cit9CisKKy8vLyBnZXRQb3N0SW5kZXhlZEFkZHJlc3NQYXJ0cyAtIHJldHVybnMgdHJ1ZSBieSB2YWx1ZSwgYmFzZSBwb2ludGVyIGFuZAorLy8vIG9mZnNldCBwb2ludGVyIGFuZCBhZGRyZXNzaW5nIG1vZGUgYnkgcmVmZXJlbmNlIGlmIHRoaXMgbm9kZSBjYW4gYmUKKy8vLyBjb21iaW5lZCB3aXRoIGEgbG9hZCAvIHN0b3JlIHRvIGZvcm0gYSBwb3N0LWluZGV4ZWQgbG9hZCAvIHN0b3JlLgorYm9vbCBNU1A0MzBUYXJnZXRMb3dlcmluZzo6Z2V0UG9zdEluZGV4ZWRBZGRyZXNzUGFydHMoU0ROb2RlICpOLCBTRE5vZGUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6TWVtSW5kZXhlZE1vZGUgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKworICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oTik7CisgIGlmIChMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpICE9IElTRDo6Tk9OX0VYVExPQUQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEVWVCBWVCA9IExELT5nZXRNZW1vcnlWVCgpOworICBpZiAoVlQgIT0gTVZUOjppOCAmJiBWVCAhPSBNVlQ6OmkxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKE9wLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OkFERCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKENvbnN0YW50U0ROb2RlICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgdWludDY0X3QgUkhTQyA9IFJIUy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKChWVCA9PSBNVlQ6OmkxNiAmJiBSSFNDICE9IDIpIHx8CisgICAgICAgIChWVCA9PSBNVlQ6Omk4ICYmIFJIU0MgIT0gMSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBCYXNlID0gT3AtPmdldE9wZXJhbmQoMCk7CisgICAgT2Zmc2V0ID0gREFHLmdldENvbnN0YW50KFJIU0MsIFZUKTsKKyAgICBBTSA9IElTRDo6UE9TVF9JTkM7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKworY29uc3QgY2hhciAqTVNQNDMwVGFyZ2V0TG93ZXJpbmc6OmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3QgeworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OiByZXR1cm4gTlVMTDsKKyAgY2FzZSBNU1A0MzBJU0Q6OlJFVF9GTEFHOiAgICAgICAgICAgcmV0dXJuICJNU1A0MzBJU0Q6OlJFVF9GTEFHIjsKKyAgY2FzZSBNU1A0MzBJU0Q6OlJFVElfRkxBRzogICAgICAgICAgcmV0dXJuICJNU1A0MzBJU0Q6OlJFVElfRkxBRyI7CisgIGNhc2UgTVNQNDMwSVNEOjpSUkE6ICAgICAgICAgICAgICAgIHJldHVybiAiTVNQNDMwSVNEOjpSUkEiOworICBjYXNlIE1TUDQzMElTRDo6UkxBOiAgICAgICAgICAgICAgICByZXR1cm4gIk1TUDQzMElTRDo6UkxBIjsKKyAgY2FzZSBNU1A0MzBJU0Q6OlJSQzogICAgICAgICAgICAgICAgcmV0dXJuICJNU1A0MzBJU0Q6OlJSQyI7CisgIGNhc2UgTVNQNDMwSVNEOjpDQUxMOiAgICAgICAgICAgICAgIHJldHVybiAiTVNQNDMwSVNEOjpDQUxMIjsKKyAgY2FzZSBNU1A0MzBJU0Q6OldyYXBwZXI6ICAgICAgICAgICAgcmV0dXJuICJNU1A0MzBJU0Q6OldyYXBwZXIiOworICBjYXNlIE1TUDQzMElTRDo6QlJfQ0M6ICAgICAgICAgICAgICByZXR1cm4gIk1TUDQzMElTRDo6QlJfQ0MiOworICBjYXNlIE1TUDQzMElTRDo6Q01QOiAgICAgICAgICAgICAgICByZXR1cm4gIk1TUDQzMElTRDo6Q01QIjsKKyAgY2FzZSBNU1A0MzBJU0Q6OlNFTEVDVF9DQzogICAgICAgICAgcmV0dXJuICJNU1A0MzBJU0Q6OlNFTEVDVF9DQyI7CisgIGNhc2UgTVNQNDMwSVNEOjpTSEw6ICAgICAgICAgICAgICAgIHJldHVybiAiTVNQNDMwSVNEOjpTSEwiOworICBjYXNlIE1TUDQzMElTRDo6U1JBOiAgICAgICAgICAgICAgICByZXR1cm4gIk1TUDQzMElTRDo6U1JBIjsKKyAgfQorfQorCitib29sIE1TUDQzMFRhcmdldExvd2VyaW5nOjppc1RydW5jYXRlRnJlZShjb25zdCBUeXBlICpUeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeTIpIGNvbnN0IHsKKyAgaWYgKCFUeTEtPmlzSW50ZWdlclR5KCkgfHwgIVR5Mi0+aXNJbnRlZ2VyVHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIChUeTEtPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA+IFR5Mi0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpKTsKK30KKworYm9vbCBNU1A0MzBUYXJnZXRMb3dlcmluZzo6aXNUcnVuY2F0ZUZyZWUoRVZUIFZUMSwgRVZUIFZUMikgY29uc3QgeworICBpZiAoIVZUMS5pc0ludGVnZXIoKSB8fCAhVlQyLmlzSW50ZWdlcigpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gKFZUMS5nZXRTaXplSW5CaXRzKCkgPiBWVDIuZ2V0U2l6ZUluQml0cygpKTsKK30KKworYm9vbCBNU1A0MzBUYXJnZXRMb3dlcmluZzo6aXNaRXh0RnJlZShjb25zdCBUeXBlICpUeTEsIGNvbnN0IFR5cGUgKlR5MikgY29uc3QgeworICAvLyBNU1A0MzAgaW1wbGljaXRseSB6ZXJvLWV4dGVuZHMgOC1iaXQgcmVzdWx0cyBpbiAxNi1iaXQgcmVnaXN0ZXJzLgorICByZXR1cm4gMCAmJiBUeTEtPmlzSW50ZWdlclR5KDgpICYmIFR5Mi0+aXNJbnRlZ2VyVHkoMTYpOworfQorCitib29sIE1TUDQzMFRhcmdldExvd2VyaW5nOjppc1pFeHRGcmVlKEVWVCBWVDEsIEVWVCBWVDIpIGNvbnN0IHsKKyAgLy8gTVNQNDMwIGltcGxpY2l0bHkgemVyby1leHRlbmRzIDgtYml0IHJlc3VsdHMgaW4gMTYtYml0IHJlZ2lzdGVycy4KKyAgcmV0dXJuIDAgJiYgVlQxID09IE1WVDo6aTggJiYgVlQyID09IE1WVDo6aTE2OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIE90aGVyIExvd2VyaW5nIENvZGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK01hY2hpbmVCYXNpY0Jsb2NrKgorTVNQNDMwVGFyZ2V0TG93ZXJpbmc6OkVtaXRTaGlmdEluc3RyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIE1hY2hpbmVGdW5jdGlvbiAqRiA9IEJCLT5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmUkkgPSBGLT5nZXRSZWdJbmZvKCk7CisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJID0gKmdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKworICB1bnNpZ25lZCBPcGM7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKiBSQzsKKyAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBzaGlmdCBvcGNvZGUhIik7CisgIGNhc2UgTVNQNDMwOjpTaGw4OgorICAgT3BjID0gTVNQNDMwOjpTSEw4cjE7CisgICBSQyA9IE1TUDQzMDo6R1I4UmVnaXN0ZXJDbGFzczsKKyAgIGJyZWFrOworICBjYXNlIE1TUDQzMDo6U2hsMTY6CisgICBPcGMgPSBNU1A0MzA6OlNITDE2cjE7CisgICBSQyA9IE1TUDQzMDo6R1IxNlJlZ2lzdGVyQ2xhc3M7CisgICBicmVhazsKKyAgY2FzZSBNU1A0MzA6OlNyYTg6CisgICBPcGMgPSBNU1A0MzA6OlNBUjhyMTsKKyAgIFJDID0gTVNQNDMwOjpHUjhSZWdpc3RlckNsYXNzOworICAgYnJlYWs7CisgIGNhc2UgTVNQNDMwOjpTcmExNjoKKyAgIE9wYyA9IE1TUDQzMDo6U0FSMTZyMTsKKyAgIFJDID0gTVNQNDMwOjpHUjE2UmVnaXN0ZXJDbGFzczsKKyAgIGJyZWFrOworICBjYXNlIE1TUDQzMDo6U3JsODoKKyAgIE9wYyA9IE1TUDQzMDo6U0FSOHIxYzsKKyAgIFJDID0gTVNQNDMwOjpHUjhSZWdpc3RlckNsYXNzOworICAgYnJlYWs7CisgIGNhc2UgTVNQNDMwOjpTcmwxNjoKKyAgIE9wYyA9IE1TUDQzMDo6U0FSMTZyMWM7CisgICBSQyA9IE1TUDQzMDo6R1IxNlJlZ2lzdGVyQ2xhc3M7CisgICBicmVhazsKKyAgfQorCisgIGNvbnN0IEJhc2ljQmxvY2sgKkxMVk1fQkIgPSBCQi0+Z2V0QmFzaWNCbG9jaygpOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBCQjsKKyAgKytJOworCisgIC8vIENyZWF0ZSBsb29wIGJsb2NrCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpMb29wQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlJlbUJCICA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworCisgIEYtPmluc2VydChJLCBMb29wQkIpOworICBGLT5pbnNlcnQoSSwgUmVtQkIpOworCisgIC8vIFVwZGF0ZSBtYWNoaW5lLUNGRyBlZGdlcyBieSB0cmFuc2ZlcnJpbmcgYWxsIHN1Y2Nlc3NvcnMgb2YgdGhlIGN1cnJlbnQKKyAgLy8gYmxvY2sgdG8gdGhlIGJsb2NrIGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb25zIGFmdGVyIHNoaWZ0LgorICBSZW1CQi0+c3BsaWNlKFJlbUJCLT5iZWdpbigpLCBCQiwKKyAgICAgICAgICAgICAgICBsbHZtOjpuZXh0KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihNSSkpLAorICAgICAgICAgICAgICAgIEJCLT5lbmQoKSk7CisgIFJlbUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKEJCKTsKKworICAvLyBBZGQgYWRnZXMgQkIgPT4gTG9vcEJCID0+IFJlbUJCLCBCQiA9PiBSZW1CQiwgTG9vcEJCID0+IExvb3BCQgorICBCQi0+YWRkU3VjY2Vzc29yKExvb3BCQik7CisgIEJCLT5hZGRTdWNjZXNzb3IoUmVtQkIpOworICBMb29wQkItPmFkZFN1Y2Nlc3NvcihSZW1CQik7CisgIExvb3BCQi0+YWRkU3VjY2Vzc29yKExvb3BCQik7CisKKyAgdW5zaWduZWQgU2hpZnRBbXRSZWcgPSBSSS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoTVNQNDMwOjpHUjhSZWdpc3RlckNsYXNzKTsKKyAgdW5zaWduZWQgU2hpZnRBbXRSZWcyID0gUkkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKE1TUDQzMDo6R1I4UmVnaXN0ZXJDbGFzcyk7CisgIHVuc2lnbmVkIFNoaWZ0UmVnID0gUkkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgdW5zaWduZWQgU2hpZnRSZWcyID0gUkkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgdW5zaWduZWQgU2hpZnRBbXRTcmNSZWcgPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgU3JjUmVnID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIERzdFJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworCisgIC8vIEJCOgorICAvLyBjbXAgMCwgTgorICAvLyBqZSBSZW1CQgorICBCdWlsZE1JKEJCLCBkbCwgVElJLmdldChNU1A0MzA6OkNNUDhyaSkpCisgICAgLmFkZFJlZyhTaGlmdEFtdFNyY1JlZykuYWRkSW1tKDApOworICBCdWlsZE1JKEJCLCBkbCwgVElJLmdldChNU1A0MzA6OkpDQykpCisgICAgLmFkZE1CQihSZW1CQikKKyAgICAuYWRkSW1tKE1TUDQzMENDOjpDT05EX0UpOworCisgIC8vIExvb3BCQjoKKyAgLy8gU2hpZnRSZWcgPSBwaGkgWyVTcmNSZWcsIEJCXSwgWyVTaGlmdFJlZzIsIExvb3BCQl0KKyAgLy8gU2hpZnRBbXQgPSBwaGkgWyVOLCBCQl0sICAgICAgWyVTaGlmdEFtdDIsIExvb3BCQl0KKyAgLy8gU2hpZnRSZWcyID0gc2hpZnQgU2hpZnRSZWcKKyAgLy8gU2hpZnRBbXQyID0gU2hpZnRBbXQgLSAxOworICBCdWlsZE1JKExvb3BCQiwgZGwsIFRJSS5nZXQoTVNQNDMwOjpQSEkpLCBTaGlmdFJlZykKKyAgICAuYWRkUmVnKFNyY1JlZykuYWRkTUJCKEJCKQorICAgIC5hZGRSZWcoU2hpZnRSZWcyKS5hZGRNQkIoTG9vcEJCKTsKKyAgQnVpbGRNSShMb29wQkIsIGRsLCBUSUkuZ2V0KE1TUDQzMDo6UEhJKSwgU2hpZnRBbXRSZWcpCisgICAgLmFkZFJlZyhTaGlmdEFtdFNyY1JlZykuYWRkTUJCKEJCKQorICAgIC5hZGRSZWcoU2hpZnRBbXRSZWcyKS5hZGRNQkIoTG9vcEJCKTsKKyAgQnVpbGRNSShMb29wQkIsIGRsLCBUSUkuZ2V0KE9wYyksIFNoaWZ0UmVnMikKKyAgICAuYWRkUmVnKFNoaWZ0UmVnKTsKKyAgQnVpbGRNSShMb29wQkIsIGRsLCBUSUkuZ2V0KE1TUDQzMDo6U1VCOHJpKSwgU2hpZnRBbXRSZWcyKQorICAgIC5hZGRSZWcoU2hpZnRBbXRSZWcpLmFkZEltbSgxKTsKKyAgQnVpbGRNSShMb29wQkIsIGRsLCBUSUkuZ2V0KE1TUDQzMDo6SkNDKSkKKyAgICAuYWRkTUJCKExvb3BCQikKKyAgICAuYWRkSW1tKE1TUDQzMENDOjpDT05EX05FKTsKKworICAvLyBSZW1CQjoKKyAgLy8gRGVzdFJlZyA9IHBoaSBbJVNyY1JlZywgQkJdLCBbJVNoaWZ0UmVnLCBMb29wQkJdCisgIEJ1aWxkTUkoKlJlbUJCLCBSZW1CQi0+YmVnaW4oKSwgZGwsIFRJSS5nZXQoTVNQNDMwOjpQSEkpLCBEc3RSZWcpCisgICAgLmFkZFJlZyhTcmNSZWcpLmFkZE1CQihCQikKKyAgICAuYWRkUmVnKFNoaWZ0UmVnMikuYWRkTUJCKExvb3BCQik7CisKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisgIHJldHVybiBSZW1CQjsKK30KKworTWFjaGluZUJhc2ljQmxvY2sqCitNU1A0MzBUYXJnZXRMb3dlcmluZzo6RW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICB1bnNpZ25lZCBPcGMgPSBNSS0+Z2V0T3Bjb2RlKCk7CisKKyAgaWYgKE9wYyA9PSBNU1A0MzA6OlNobDggfHwgT3BjID09IE1TUDQzMDo6U2hsMTYgfHwKKyAgICAgIE9wYyA9PSBNU1A0MzA6OlNyYTggfHwgT3BjID09IE1TUDQzMDo6U3JhMTYgfHwKKyAgICAgIE9wYyA9PSBNU1A0MzA6OlNybDggfHwgT3BjID09IE1TUDQzMDo6U3JsMTYpCisgICAgcmV0dXJuIEVtaXRTaGlmdEluc3RyKE1JLCBCQik7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkgPSAqZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgIGFzc2VydCgoT3BjID09IE1TUDQzMDo6U2VsZWN0MTYgfHwgT3BjID09IE1TUDQzMDo6U2VsZWN0OCkgJiYKKyAgICAgICAgICJVbmV4cGVjdGVkIGluc3RyIHR5cGUgdG8gaW5zZXJ0Iik7CisKKyAgLy8gVG8gImluc2VydCIgYSBTRUxFQ1QgaW5zdHJ1Y3Rpb24sIHdlIGFjdHVhbGx5IGhhdmUgdG8gaW5zZXJ0IHRoZSBkaWFtb25kCisgIC8vIGNvbnRyb2wtZmxvdyBwYXR0ZXJuLiAgVGhlIGluY29taW5nIGluc3RydWN0aW9uIGtub3dzIHRoZSBkZXN0aW5hdGlvbiB2cmVnCisgIC8vIHRvIHNldCwgdGhlIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyIHRvIGJyYW5jaCBvbiwgdGhlIHRydWUvZmFsc2UgdmFsdWVzIHRvCisgIC8vIHNlbGVjdCBiZXR3ZWVuLCBhbmQgYSBicmFuY2ggb3Bjb2RlIHRvIHVzZS4KKyAgY29uc3QgQmFzaWNCbG9jayAqTExWTV9CQiA9IEJCLT5nZXRCYXNpY0Jsb2NrKCk7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IEJCOworICArK0k7CisKKyAgLy8gIHRoaXNNQkI6CisgIC8vICAuLi4KKyAgLy8gICBUcnVlVmFsID0gLi4uCisgIC8vICAgY21wVFkgY2NYLCByMSwgcjIKKyAgLy8gICBqQ0MgY29weTFNQkIKKyAgLy8gICBmYWxsdGhyb3VnaCAtLT4gY29weTBNQkIKKyAgTWFjaGluZUJhc2ljQmxvY2sgKnRoaXNNQkIgPSBCQjsKKyAgTWFjaGluZUZ1bmN0aW9uICpGID0gQkItPmdldFBhcmVudCgpOworICBNYWNoaW5lQmFzaWNCbG9jayAqY29weTBNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmNvcHkxTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIEYtPmluc2VydChJLCBjb3B5ME1CQik7CisgIEYtPmluc2VydChJLCBjb3B5MU1CQik7CisgIC8vIFVwZGF0ZSBtYWNoaW5lLUNGRyBlZGdlcyBieSB0cmFuc2ZlcnJpbmcgYWxsIHN1Y2Nlc3NvcnMgb2YgdGhlIGN1cnJlbnQKKyAgLy8gYmxvY2sgdG8gdGhlIG5ldyBibG9jayB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIFBoaSBub2RlIGZvciB0aGUgc2VsZWN0LgorICBjb3B5MU1CQi0+c3BsaWNlKGNvcHkxTUJCLT5iZWdpbigpLCBCQiwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpuZXh0KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihNSSkpLAorICAgICAgICAgICAgICAgICAgIEJCLT5lbmQoKSk7CisgIGNvcHkxTUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKEJCKTsKKyAgLy8gTmV4dCwgYWRkIHRoZSB0cnVlIGFuZCBmYWxsdGhyb3VnaCBibG9ja3MgYXMgaXRzIHN1Y2Nlc3NvcnMuCisgIEJCLT5hZGRTdWNjZXNzb3IoY29weTBNQkIpOworICBCQi0+YWRkU3VjY2Vzc29yKGNvcHkxTUJCKTsKKworICBCdWlsZE1JKEJCLCBkbCwgVElJLmdldChNU1A0MzA6OkpDQykpCisgICAgLmFkZE1CQihjb3B5MU1CQikKKyAgICAuYWRkSW1tKE1JLT5nZXRPcGVyYW5kKDMpLmdldEltbSgpKTsKKworICAvLyAgY29weTBNQkI6CisgIC8vICAgJUZhbHNlVmFsdWUgPSAuLi4KKyAgLy8gICAjIGZhbGx0aHJvdWdoIHRvIGNvcHkxTUJCCisgIEJCID0gY29weTBNQkI7CisKKyAgLy8gVXBkYXRlIG1hY2hpbmUtQ0ZHIGVkZ2VzCisgIEJCLT5hZGRTdWNjZXNzb3IoY29weTFNQkIpOworCisgIC8vICBjb3B5MU1CQjoKKyAgLy8gICAlUmVzdWx0ID0gcGhpIFsgJUZhbHNlVmFsdWUsIGNvcHkwTUJCIF0sIFsgJVRydWVWYWx1ZSwgdGhpc01CQiBdCisgIC8vICAuLi4KKyAgQkIgPSBjb3B5MU1CQjsKKyAgQnVpbGRNSSgqQkIsIEJCLT5iZWdpbigpLCBkbCwgVElJLmdldChNU1A0MzA6OlBISSksCisgICAgICAgICAgTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpCisgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSkuYWRkTUJCKGNvcHkwTUJCKQorICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpLmFkZE1CQih0aGlzTUJCKTsKKworICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7ICAgLy8gVGhlIHBzZXVkbyBpbnN0cnVjdGlvbiBpcyBnb25lIG5vdy4KKyAgcmV0dXJuIEJCOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSVNlbExvd2VyaW5nLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBJU2VsTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzNjNTQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSVNlbExvd2VyaW5nLmgKQEAgLTAsMCArMSwxODMgQEAKKy8vPT0tLSBNU1A0MzBJU2VsTG93ZXJpbmcuaCAtIE1TUDQzMCBEQUcgTG93ZXJpbmcgSW50ZXJmYWNlIC0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZXMgdGhhdCBNU1A0MzAgdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50byBhCisvLyBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfTVNQNDMwX0lTRUxMT1dFUklOR19ICisjZGVmaW5lIExMVk1fVEFSR0VUX01TUDQzMF9JU0VMTE9XRVJJTkdfSAorCisjaW5jbHVkZSAiTVNQNDMwLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgbmFtZXNwYWNlIE1TUDQzMElTRCB7CisgICAgZW51bSB7CisgICAgICBGSVJTVF9OVU1CRVIgPSBJU0Q6OkJVSUxUSU5fT1BfRU5ELAorCisgICAgICAvLy8gUmV0dXJuIHdpdGggYSBmbGFnIG9wZXJhbmQuIE9wZXJhbmQgMCBpcyB0aGUgY2hhaW4gb3BlcmFuZC4KKyAgICAgIFJFVF9GTEFHLAorCisgICAgICAvLy8gU2FtZSBhcyBSRVRfRkxBRywgYnV0IHVzZWQgZm9yIHJldHVybmluZyBmcm9tIElTUnMuCisgICAgICBSRVRJX0ZMQUcsCisKKyAgICAgIC8vLyBZID0gUntSLEx9QSBYLCByb3RhdGUgcmlnaHQgKGxlZnQpIGFyaXRobWV0aWNhbGx5CisgICAgICBSUkEsIFJMQSwKKworICAgICAgLy8vIFkgPSBSUkMgWCwgcm90YXRlIHJpZ2h0IHZpYSBjYXJyeQorICAgICAgUlJDLAorCisgICAgICAvLy8gQ0FMTCAtIFRoZXNlIG9wZXJhdGlvbnMgcmVwcmVzZW50IGFuIGFic3RyYWN0IGNhbGwKKyAgICAgIC8vLyBpbnN0cnVjdGlvbiwgd2hpY2ggaW5jbHVkZXMgYSBidW5jaCBvZiBpbmZvcm1hdGlvbi4KKyAgICAgIENBTEwsCisKKyAgICAgIC8vLyBXcmFwcGVyIC0gQSB3cmFwcGVyIG5vZGUgZm9yIFRhcmdldENvbnN0YW50UG9vbCwgVGFyZ2V0RXh0ZXJuYWxTeW1ib2wsCisgICAgICAvLy8gYW5kIFRhcmdldEdsb2JhbEFkZHJlc3MuCisgICAgICBXcmFwcGVyLAorCisgICAgICAvLy8gQ01QIC0gQ29tcGFyZSBpbnN0cnVjdGlvbi4KKyAgICAgIENNUCwKKworICAgICAgLy8vIFNldENDIC0gT3BlcmFuZCAwIGlzIGNvbmRpdGlvbiBjb2RlLCBhbmQgb3BlcmFuZCAxIGlzIHRoZSBmbGFnCisgICAgICAvLy8gb3BlcmFuZCBwcm9kdWNlZCBieSBhIENNUCBpbnN0cnVjdGlvbi4KKyAgICAgIFNFVENDLAorCisgICAgICAvLy8gTVNQNDMwIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiBPcGVyYW5kIDAgaXMgdGhlIGNoYWluIG9wZXJhbmQsIG9wZXJhbmQgMQorICAgICAgLy8vIGlzIHRoZSBibG9jayB0byBicmFuY2ggaWYgY29uZGl0aW9uIGlzIHRydWUsIG9wZXJhbmQgMiBpcyB0aGUKKyAgICAgIC8vLyBjb25kaXRpb24gY29kZSwgYW5kIG9wZXJhbmQgMyBpcyB0aGUgZmxhZyBvcGVyYW5kIHByb2R1Y2VkIGJ5IGEgQ01QCisgICAgICAvLy8gaW5zdHJ1Y3Rpb24uCisgICAgICBCUl9DQywKKworICAgICAgLy8vIFNFTEVDVF9DQyAtIE9wZXJhbmQgMCBhbmQgb3BlcmFuZCAxIGFyZSBzZWxlY3Rpb24gdmFyaWFibGUsIG9wZXJhbmQgMworICAgICAgLy8vIGlzIGNvbmRpdGlvbiBjb2RlIGFuZCBvcGVyYW5kIDQgaXMgZmxhZyBvcGVyYW5kLgorICAgICAgU0VMRUNUX0NDLAorCisgICAgICAvLy8gU0hMLCBTUkEsIFNSTCAtIE5vbi1jb25zdGFudCBzaGlmdHMuCisgICAgICBTSEwsIFNSQSwgU1JMCisgICAgfTsKKyAgfQorCisgIGNsYXNzIE1TUDQzMFN1YnRhcmdldDsKKyAgY2xhc3MgTVNQNDMwVGFyZ2V0TWFjaGluZTsKKworICBjbGFzcyBNU1A0MzBUYXJnZXRMb3dlcmluZyA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBNU1A0MzBUYXJnZXRMb3dlcmluZyhNU1A0MzBUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgICAvLy8gTG93ZXJPcGVyYXRpb24gLSBQcm92aWRlIGN1c3RvbSBsb3dlcmluZyBob29rcyBmb3Igc29tZSBvcGVyYXRpb25zLgorICAgIHZpcnR1YWwgU0RWYWx1ZSBMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLy8gZ2V0VGFyZ2V0Tm9kZU5hbWUgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIGEgdGFyZ2V0IHNwZWNpZmljCisgICAgLy8vIERBRyBub2RlLgorICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0VGFyZ2V0Tm9kZU5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdDsKKworICAgIC8vLyBnZXRGdW5jdGlvbkFsaWdubWVudCAtIFJldHVybiB0aGUgTG9nMiBhbGlnbm1lbnQgb2YgdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldEZ1bmN0aW9uQWxpZ25tZW50KGNvbnN0IEZ1bmN0aW9uICpGKSBjb25zdDsKKworICAgIFNEVmFsdWUgTG93ZXJTaGlmdHMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJHbG9iYWxBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyQmxvY2tBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRXh0ZXJuYWxTeW1ib2woU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJCUl9DQyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclNFVENDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU0VMRUNUX0NDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU0lHTl9FWFRFTkQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJSRVRVUk5BRERSKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRlJBTUVBRERSKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIGdldFJldHVybkFkZHJlc3NGcmFtZUluZGV4KFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIFRhcmdldExvd2VyaW5nOjpDb25zdHJhaW50VHlwZQorICAgIGdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdDsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqPgorICAgIGdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsIEVWVCBWVCkgY29uc3Q7CisKKyAgICAvLy8gaXNUcnVuY2F0ZUZyZWUgLSBSZXR1cm4gdHJ1ZSBpZiBpdCdzIGZyZWUgdG8gdHJ1bmNhdGUgYSB2YWx1ZSBvZiB0eXBlCisgICAgLy8vIFR5MSB0byB0eXBlIFR5Mi4gZS5nLiBPbiBtc3A0MzAgaXQncyBmcmVlIHRvIHRydW5jYXRlIGEgaTE2IHZhbHVlIGluCisgICAgLy8vIHJlZ2lzdGVyIFIxNVcgdG8gaTggYnkgcmVmZXJlbmNpbmcgaXRzIHN1Yi1yZWdpc3RlciBSMTVCLgorICAgIHZpcnR1YWwgYm9vbCBpc1RydW5jYXRlRnJlZShjb25zdCBUeXBlICpUeTEsIGNvbnN0IFR5cGUgKlR5MikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzVHJ1bmNhdGVGcmVlKEVWVCBWVDEsIEVWVCBWVDIpIGNvbnN0OworCisgICAgLy8vIGlzWkV4dEZyZWUgLSBSZXR1cm4gdHJ1ZSBpZiBhbnkgYWN0dWFsIGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcyBhIHZhbHVlCisgICAgLy8vIG9mIHR5cGUgVHkxIGltcGxpY2l0IHplcm8tZXh0ZW5kcyB0aGUgdmFsdWUgdG8gVHkyIGluIHRoZSByZXN1bHQKKyAgICAvLy8gcmVnaXN0ZXIuIFRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgaW5jbHVkZSByZWdpc3RlcnMgZGVmaW5lZCBpbiB1bmtub3duCisgICAgLy8vIHdheXMsIHN1Y2ggYXMgaW5jb21pbmcgYXJndW1lbnRzLCBvciBjb3BpZXMgZnJvbSB1bmtub3duIHZpcnR1YWwKKyAgICAvLy8gcmVnaXN0ZXJzLiBBbHNvLCBpZiBpc1RydW5jYXRlRnJlZShUeTIsIFR5MSkgaXMgdHJ1ZSwgdGhpcyBkb2VzIG5vdAorICAgIC8vLyBuZWNlc3NhcmlseSBhcHBseSB0byB0cnVuY2F0ZSBpbnN0cnVjdGlvbnMuIGUuZy4gb24gbXNwNDMwLCBhbGwKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgZGVmaW5lIDgtYml0IHZhbHVlcyBpbXBsaWNpdCB6ZXJvLWV4dGVuZCB0aGUgcmVzdWx0CisgICAgLy8vIG91dCB0byAxNiBiaXRzLgorICAgIHZpcnR1YWwgYm9vbCBpc1pFeHRGcmVlKGNvbnN0IFR5cGUgKlR5MSwgY29uc3QgVHlwZSAqVHkyKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNaRXh0RnJlZShFVlQgVlQxLCBFVlQgVlQyKSBjb25zdDsKKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisgICAgTWFjaGluZUJhc2ljQmxvY2sqIEVtaXRTaGlmdEluc3RyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBTRFZhbHVlIExvd2VyQ0NDQ2FsbFRvKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgU0RWYWx1ZSBMb3dlckNDQ0FyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIFNEVmFsdWUgTG93ZXJDYWxsUmVzdWx0KFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlckZvcm1hbEFyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlckNhbGwoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLCBib29sICZpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyUmV0dXJuKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBnZXRQb3N0SW5kZXhlZEFkZHJlc3NQYXJ0cyhTRE5vZGUgKk4sIFNETm9kZSAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpNZW1JbmRleGVkTW9kZSAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIGNvbnN0IE1TUDQzMFN1YnRhcmdldCAmU3VidGFyZ2V0OworICAgIGNvbnN0IE1TUDQzMFRhcmdldE1hY2hpbmUgJlRNOworICAgIGNvbnN0IFRhcmdldERhdGEgKlREOworICB9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UQVJHRVRfTVNQNDMwX0lTRUxMT1dFUklOR19ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBJbnN0ckZvcm1hdHMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBJbnN0ckZvcm1hdHMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhZWYxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMEluc3RyRm9ybWF0cy50ZApAQCAtMCwwICsxLDIxMSBAQAorLy89PT0tIE1TUDQzMEluc3RyRm9ybWF0cy50ZCAtIE1TUDQzMCBJbnN0cnVjdGlvbiBGb3JtYXRzLS0tLS0qLSB0YmxnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRGVzY3JpYmUgTVNQNDMwIGluc3RydWN0aW9ucyBmb3JtYXQgaGVyZQorLy8KKworLy8gRm9ybWF0IHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBieSB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHBhcnQgb2YgdGhlCisvLyBhZC1ob2Mgc29sdXRpb24gdXNlZCB0byBlbWl0IG1hY2hpbmUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzIGJ5IG91ciBtYWNoaW5lCisvLyBjb2RlIGVtaXR0ZXIuCitjbGFzcyBGb3JtYXQ8Yml0czwyPiB2YWw+IHsKKyAgYml0czwyPiBWYWx1ZSA9IHZhbDsKK30KKworZGVmIFBzZXVkb0ZybSAgIDogRm9ybWF0PDA+OworZGVmIFNpbmdsZU9wRnJtIDogRm9ybWF0PDE+OworZGVmIERvdWJsZU9wRnJtIDogRm9ybWF0PDI+OworZGVmIENvbmRKdW1wRnJtIDogRm9ybWF0PDM+OworCitjbGFzcyBTb3VyY2VNb2RlPGJpdHM8Mj4gdmFsPiB7CisgIGJpdHM8Mj4gVmFsdWUgPSB2YWw7Cit9CisKK2RlZiBTcmNSZWcgICAgICA6IFNvdXJjZU1vZGU8MD47CitkZWYgU3JjTWVtICAgICAgOiBTb3VyY2VNb2RlPDE+OworZGVmIFNyY0luZFJlZyAgIDogU291cmNlTW9kZTwyPjsKK2RlZiBTcmNQb3N0SW5jICA6IFNvdXJjZU1vZGU8Mz47CitkZWYgU3JjSW1tICAgICAgOiBTb3VyY2VNb2RlPDM+OworCitjbGFzcyBEZXN0TW9kZTxiaXQgdmFsPiB7CisgIGJpdCBWYWx1ZSA9IHZhbDsKK30KKworZGVmIERzdFJlZyAgICAgIDogRGVzdE1vZGU8MD47CitkZWYgRHN0TWVtICAgICAgOiBEZXN0TW9kZTwxPjsKKworY2xhc3MgU2l6ZVZhbDxiaXRzPDM+IHZhbD4geworICBiaXRzPDM+IFZhbHVlID0gdmFsOworfQorCitkZWYgU2l6ZVVua25vd24gOiBTaXplVmFsPDA+OyAvLyBVbmtub3duIC8gdW5zZXQgc2l6ZQorZGVmIFNpemVTcGVjaWFsIDogU2l6ZVZhbDwxPjsgLy8gU3BlY2lhbCBpbnN0cnVjdGlvbiwgZS5nLiBwc2V1ZG8KK2RlZiBTaXplMkJ5dGVzICA6IFNpemVWYWw8Mj47CitkZWYgU2l6ZTRCeXRlcyAgOiBTaXplVmFsPDM+OworZGVmIFNpemU2Qnl0ZXMgIDogU2l6ZVZhbDw0PjsKKworLy8gR2VuZXJpYyBNU1A0MzAgRm9ybWF0CitjbGFzcyBNU1A0MzBJbnN0PGRhZyBvdXRzLCBkYWcgaW5zLCBTaXplVmFsIHN6LCBGb3JtYXQgZiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nIGFzbXN0cj4gOiBJbnN0cnVjdGlvbiB7CisgIGZpZWxkIGJpdHM8MTY+IEluc3Q7CisKKyAgbGV0IE5hbWVzcGFjZSA9ICJNU1A0MzAiOworCisgIGRhZyBPdXRPcGVyYW5kTGlzdCA9IG91dHM7CisgIGRhZyBJbk9wZXJhbmRMaXN0ICA9IGluczsKKworICBGb3JtYXQgRm9ybSA9IGY7CisgIFNpemVWYWwgU3ogPSBzejsKKworICAvLyBEZWZpbmUgaG93IHdlIHdhbnQgdG8gbGF5b3V0IG91ciBUYXJnZXRTcGVjaWZpYyBpbmZvcm1hdGlvbiBmaWVsZC4uLiBUaGlzCisgIC8vIHNob3VsZCBiZSBrZXB0IHVwLXRvLWRhdGUgd2l0aCB0aGUgZmllbGRzIGluIHRoZSBNU1A0MzBJbnN0ckluZm8uaCBmaWxlLgorICBsZXQgVFNGbGFnc3sxLTB9ID0gRm9ybS5WYWx1ZTsKKyAgbGV0IFRTRmxhZ3N7NC0yfSA9IFN6LlZhbHVlOworCisgIGxldCBBc21TdHJpbmcgICA9IGFzbXN0cjsKK30KKworLy8gRklYTUU6IENyZWF0ZSBkaWZmZXJlbnQgY2xhc3NlcyBmb3IgZGlmZmVyZW50IGFkZHJlc3NpbmcgbW9kZXMuCisKKy8vIE1TUDQzMCBEb3VibGUgT3BlcmFuZCAoRm9ybWF0IEkpIEluc3RydWN0aW9ucworY2xhc3MgSUZvcm08Yml0czw0PiBvcGNvZGUsIERlc3RNb2RlIGRlc3QsIGJpdCBidywgU291cmNlTW9kZSBzcmMsIFNpemVWYWwgc3osCisgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogTVNQNDMwSW5zdDxvdXRzLCBpbnMsIHN6LCBEb3VibGVPcEZybSwgYXNtc3RyPiB7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKworICBEZXN0TW9kZSBhZCA9IGRlc3Q7CisgIFNvdXJjZU1vZGUgYXMgPSBzcmM7CisgIAorICBsZXQgSW5zdHsxMi0xNX0gPSBvcGNvZGU7CisgIGxldCBJbnN0ezd9ICAgICA9IGFkLlZhbHVlOworICBsZXQgSW5zdHs2fSAgICAgPSBidzsKKyAgbGV0IEluc3R7NC01fSAgID0gYXMuVmFsdWU7Cit9CisKKy8vIDggYml0IElGb3JtIGluc3RydWN0aW9ucworY2xhc3MgSUZvcm04PGJpdHM8ND4gb3Bjb2RlLCBEZXN0TW9kZSBkZXN0LCBTb3VyY2VNb2RlIHNyYywgU2l6ZVZhbCBzeiwKKyAgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUZvcm08b3Bjb2RlLCBkZXN0LCAxLCBzcmMsIHN6LCBvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj47CisKK2NsYXNzIEk4cnI8Yml0czw0PiBvcGNvZGUsCisgICAgICAgICAgIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJRm9ybTg8b3Bjb2RlLCBEc3RSZWcsIFNyY1JlZywgU2l6ZTJCeXRlcywgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBJOHJpPGJpdHM8ND4gb3Bjb2RlLAorICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUZvcm04PG9wY29kZSwgRHN0UmVnLCBTcmNJbW0sIFNpemU0Qnl0ZXMsIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworY2xhc3MgSThybTxiaXRzPDQ+IG9wY29kZSwKKyAgICAgICAgICAgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IElGb3JtODxvcGNvZGUsIERzdFJlZywgU3JjTWVtLCBTaXplNEJ5dGVzLCBvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj47CisKK2NsYXNzIEk4bXI8Yml0czw0PiBvcGNvZGUsCisgICAgICAgICAgIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJRm9ybTg8b3Bjb2RlLCBEc3RNZW0sIFNyY1JlZywgU2l6ZTRCeXRlcywgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBJOG1pPGJpdHM8ND4gb3Bjb2RlLAorICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUZvcm04PG9wY29kZSwgRHN0TWVtLCBTcmNJbW0sIFNpemU2Qnl0ZXMsIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworY2xhc3MgSThtbTxiaXRzPDQ+IG9wY29kZSwKKyAgICAgICAgICAgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IElGb3JtODxvcGNvZGUsIERzdE1lbSwgU3JjTWVtLCBTaXplNkJ5dGVzLCBvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj47CisKKy8vIDE2IGJpdCBJRm9ybSBpbnN0cnVjdGlvbnMKK2NsYXNzIElGb3JtMTY8Yml0czw0PiBvcGNvZGUsIERlc3RNb2RlIGRlc3QsIFNvdXJjZU1vZGUgc3JjLCBTaXplVmFsIHN6LAorICAgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUZvcm08b3Bjb2RlLCBkZXN0LCAwLCBzcmMsIHN6LCBvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj47CisKK2NsYXNzIEkxNnJyPGJpdHM8ND4gb3Bjb2RlLAorICAgICAgICAgICAgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IElGb3JtMTY8b3Bjb2RlLCBEc3RSZWcsIFNyY1JlZywgU2l6ZTJCeXRlcywgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBJMTZyaTxiaXRzPDQ+IG9wY29kZSwKKyAgICAgICAgICAgIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJRm9ybTE2PG9wY29kZSwgRHN0UmVnLCBTcmNJbW0sIFNpemU0Qnl0ZXMsIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworY2xhc3MgSTE2cm08Yml0czw0PiBvcGNvZGUsCisgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUZvcm0xNjxvcGNvZGUsIERzdFJlZywgU3JjTWVtLCBTaXplNEJ5dGVzLCBvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj47CisKK2NsYXNzIEkxNm1yPGJpdHM8ND4gb3Bjb2RlLAorICAgICAgICAgICAgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IElGb3JtMTY8b3Bjb2RlLCBEc3RNZW0sIFNyY1JlZywgU2l6ZTRCeXRlcywgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBJMTZtaTxiaXRzPDQ+IG9wY29kZSwKKyAgICAgICAgICAgIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJRm9ybTE2PG9wY29kZSwgRHN0TWVtLCBTcmNJbW0sIFNpemU2Qnl0ZXMsIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworY2xhc3MgSTE2bW08Yml0czw0PiBvcGNvZGUsCisgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUZvcm0xNjxvcGNvZGUsIERzdE1lbSwgU3JjTWVtLCBTaXplNkJ5dGVzLCBvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj47CisKKy8vIE1TUDQzMCBTaW5nbGUgT3BlcmFuZCAoRm9ybWF0IElJKSBJbnN0cnVjdGlvbnMKK2NsYXNzIElJRm9ybTxiaXRzPDk+IG9wY29kZSwgYml0IGJ3LCBTb3VyY2VNb2RlIHNyYywgU2l6ZVZhbCBzeiwKKyAgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogTVNQNDMwSW5zdDxvdXRzLCBpbnMsIHN6LCBTaW5nbGVPcEZybSwgYXNtc3RyPiB7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgCisgIFNvdXJjZU1vZGUgYXMgPSBzcmM7CisKKyAgbGV0IEluc3R7Ny0xNX0gPSBvcGNvZGU7CisgIGxldCBJbnN0ezZ9ICAgID0gYnc7CisgIGxldCBJbnN0ezQtNX0gID0gYXMuVmFsdWU7Cit9CisKKy8vIDggYml0IElJRm9ybSBpbnN0cnVjdGlvbnMKK2NsYXNzIElJRm9ybTg8Yml0czw5PiBvcGNvZGUsIFNvdXJjZU1vZGUgc3JjLCBTaXplVmFsIHN6LAorICAgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUlGb3JtPG9wY29kZSwgMSwgc3JjLCBzeiwgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBJSThyPGJpdHM8OT4gb3Bjb2RlLAorICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUlGb3JtODxvcGNvZGUsIFNyY1JlZywgU2l6ZTJCeXRlcywgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBJSThtPGJpdHM8OT4gb3Bjb2RlLAorICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUlGb3JtODxvcGNvZGUsIFNyY01lbSwgU2l6ZTRCeXRlcywgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBJSThpPGJpdHM8OT4gb3Bjb2RlLAorICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUlGb3JtODxvcGNvZGUsIFNyY0ltbSwgU2l6ZTRCeXRlcywgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCisvLyAxNiBiaXQgSUlGb3JtIGluc3RydWN0aW9ucworY2xhc3MgSUlGb3JtMTY8Yml0czw5PiBvcGNvZGUsIFNvdXJjZU1vZGUgc3JjLCBTaXplVmFsIHN6LAorICAgICAgICAgICAgICAgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IElJRm9ybTxvcGNvZGUsIDAsIHNyYywgc3osIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworY2xhc3MgSUkxNnI8Yml0czw5PiBvcGNvZGUsCisgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUlGb3JtMTY8b3Bjb2RlLCBTcmNSZWcsIFNpemUyQnl0ZXMsIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworY2xhc3MgSUkxNm08Yml0czw5PiBvcGNvZGUsCisgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUlGb3JtMTY8b3Bjb2RlLCBTcmNNZW0sIFNpemU0Qnl0ZXMsIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworY2xhc3MgSUkxNmk8Yml0czw5PiBvcGNvZGUsCisgICAgICAgICAgICBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSUlGb3JtMTY8b3Bjb2RlLCBTcmNJbW0sIFNpemU0Qnl0ZXMsIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworLy8gTVNQNDMwIENvbmRpdGlvbmFsIEp1bXBzIEluc3RydWN0aW9ucworY2xhc3MgQ0pGb3JtPGJpdHM8Mz4gb3Bjb2RlLCBiaXRzPDM+IGNvbmQsCisgICAgICAgICAgICAgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IE1TUDQzMEluc3Q8b3V0cywgaW5zLCBTaXplMkJ5dGVzLCBDb25kSnVtcEZybSwgYXNtc3RyPiB7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgCisgIGxldCBJbnN0ezEzLTE1fSA9IG9wY29kZTsKKyAgbGV0IEluc3R7MTAtMTJ9ID0gY29uZDsKK30KKworLy8gUHNldWRvIGluc3RydWN0aW9ucworY2xhc3MgUHNldWRvPGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBNU1A0MzBJbnN0PG91dHMsIGlucywgU2l6ZVNwZWNpYWwsIFBzZXVkb0ZybSwgYXNtc3RyPiB7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGV0IEluc3R7MTUtMH0gPSAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSW5zdHJJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMEluc3RySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhYjg0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMEluc3RySW5mby5jcHAKQEAgLTAsMCArMSwzNzMgQEAKKy8vPT09LSBNU1A0MzBJbnN0ckluZm8uY3BwIC0gTVNQNDMwIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBNU1A0MzAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiTVNQNDMwLmgiCisjaW5jbHVkZSAiTVNQNDMwSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiTVNQNDMwTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIk1TUDQzMFRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJNU1A0MzBHZW5JbnN0ckluZm8uaW5jIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworTVNQNDMwSW5zdHJJbmZvOjpNU1A0MzBJbnN0ckluZm8oTVNQNDMwVGFyZ2V0TWFjaGluZSAmdG0pCisgIDogVGFyZ2V0SW5zdHJJbmZvSW1wbChNU1A0MzBJbnN0cywgYXJyYXlfbGVuZ3Rob2YoTVNQNDMwSW5zdHMpKSwKKyAgICBSSSh0bSwgKnRoaXMpLCBUTSh0bSkge30KKwordm9pZCBNU1A0MzBJbnN0ckluZm86OnN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsIGludCBGcmFtZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICBNYWNoaW5lRnJhbWVJbmZvICZNRkkgPSAqTUYuZ2V0RnJhbWVJbmZvKCk7CisKKyAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgTUYuZ2V0TWFjaGluZU1lbU9wZXJhbmQoUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRnJhbWVJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kOjpNT1N0b3JlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RTaXplKEZyYW1lSWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkkuZ2V0T2JqZWN0QWxpZ25tZW50KEZyYW1lSWR4KSk7CisKKyAgaWYgKFJDID09ICZNU1A0MzA6OkdSMTZSZWdDbGFzcykKKyAgICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoTVNQNDMwOjpNT1YxNm1yKSkKKyAgICAgIC5hZGRGcmFtZUluZGV4KEZyYW1lSWR4KS5hZGRJbW0oMCkKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkuYWRkTWVtT3BlcmFuZChNTU8pOworICBlbHNlIGlmIChSQyA9PSAmTVNQNDMwOjpHUjhSZWdDbGFzcykKKyAgICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoTVNQNDMwOjpNT1Y4bXIpKQorICAgICAgLmFkZEZyYW1lSW5kZXgoRnJhbWVJZHgpLmFkZEltbSgwKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKS5hZGRNZW1PcGVyYW5kKE1NTyk7CisgIGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDYW5ub3Qgc3RvcmUgdGhpcyByZWdpc3RlciB0byBzdGFjayBzbG90ISIpOworfQorCit2b2lkIE1TUDQzMEluc3RySW5mbzo6bG9hZFJlZ0Zyb21TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdHsKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICBNYWNoaW5lRnJhbWVJbmZvICZNRkkgPSAqTUYuZ2V0RnJhbWVJbmZvKCk7CisKKyAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgTUYuZ2V0TWFjaGluZU1lbU9wZXJhbmQoUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRnJhbWVJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kOjpNT0xvYWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZJLmdldE9iamVjdFNpemUoRnJhbWVJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RBbGlnbm1lbnQoRnJhbWVJZHgpKTsKKworICBpZiAoUkMgPT0gJk1TUDQzMDo6R1IxNlJlZ0NsYXNzKQorICAgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChNU1A0MzA6Ok1PVjE2cm0pKQorICAgICAgLmFkZFJlZyhEZXN0UmVnKS5hZGRGcmFtZUluZGV4KEZyYW1lSWR4KS5hZGRJbW0oMCkuYWRkTWVtT3BlcmFuZChNTU8pOworICBlbHNlIGlmIChSQyA9PSAmTVNQNDMwOjpHUjhSZWdDbGFzcykKKyAgICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoTVNQNDMwOjpNT1Y4cm0pKQorICAgICAgLmFkZFJlZyhEZXN0UmVnKS5hZGRGcmFtZUluZGV4KEZyYW1lSWR4KS5hZGRJbW0oMCkuYWRkTWVtT3BlcmFuZChNTU8pOworICBlbHNlCisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ2Fubm90IHN0b3JlIHRoaXMgcmVnaXN0ZXIgdG8gc3RhY2sgc2xvdCEiKTsKK30KKwordm9pZCBNU1A0MzBJbnN0ckluZm86OmNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0IHsKKyAgdW5zaWduZWQgT3BjOworICBpZiAoTVNQNDMwOjpHUjE2UmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBPcGMgPSBNU1A0MzA6Ok1PVjE2cnI7CisgIGVsc2UgaWYgKE1TUDQzMDo6R1I4UmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBPcGMgPSBNU1A0MzA6Ok1PVjhycjsKKyAgZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkltcG9zc2libGUgcmVnLXRvLXJlZyBjb3B5Iik7CisKKyAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoT3BjKSwgRGVzdFJlZykKKyAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKK30KKworYm9vbAorTVNQNDMwSW5zdHJJbmZvOjpzcGlsbENhbGxlZVNhdmVkUmVnaXN0ZXJzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGlmIChDU0kuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgIE1TUDQzME1hY2hpbmVGdW5jdGlvbkluZm8gKk1GSSA9IE1GLmdldEluZm88TVNQNDMwTWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKyAgTUZJLT5zZXRDYWxsZWVTYXZlZEZyYW1lU2l6ZShDU0kuc2l6ZSgpICogMik7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gQ1NJLnNpemUoKTsgaSAhPSAwOyAtLWkpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaS0xXS5nZXRSZWcoKTsKKyAgICAvLyBBZGQgdGhlIGNhbGxlZS1zYXZlZCByZWdpc3RlciBhcyBsaXZlLWluLiBJdCdzIGtpbGxlZCBhdCB0aGUgc3BpbGwuCisgICAgTUJCLmFkZExpdmVJbihSZWcpOworICAgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChNU1A0MzA6OlBVU0gxNnIpKQorICAgICAgLmFkZFJlZyhSZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbAorTVNQNDMwSW5zdHJJbmZvOjpyZXN0b3JlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZDU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICBpZiAoQ1NJLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIERlYnVnTG9jIERMOworICBpZiAoTUkgIT0gTUJCLmVuZCgpKSBETCA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDU0kuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoTVNQNDMwOjpQT1AxNnIpLCBDU0lbaV0uZ2V0UmVnKCkpOworCisgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBNU1A0MzBJbnN0ckluZm86OlJlbW92ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLmVuZCgpOworICB1bnNpZ25lZCBDb3VudCA9IDA7CisKKyAgd2hpbGUgKEkgIT0gTUJCLmJlZ2luKCkpIHsKKyAgICAtLUk7CisgICAgaWYgKEktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKEktPmdldE9wY29kZSgpICE9IE1TUDQzMDo6Sk1QICYmCisgICAgICAgIEktPmdldE9wY29kZSgpICE9IE1TUDQzMDo6SkNDICYmCisgICAgICAgIEktPmdldE9wY29kZSgpICE9IE1TUDQzMDo6QnIgJiYKKyAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgIT0gTVNQNDMwOjpCbSkKKyAgICAgIGJyZWFrOworICAgIC8vIFJlbW92ZSB0aGUgYnJhbmNoLgorICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIEkgPSBNQkIuZW5kKCk7CisgICAgKytDb3VudDsKKyAgfQorCisgIHJldHVybiBDb3VudDsKK30KKworYm9vbCBNU1A0MzBJbnN0ckluZm86OgorUmV2ZXJzZUJyYW5jaENvbmRpdGlvbihTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kKSBjb25zdCB7CisgIGFzc2VydChDb25kLnNpemUoKSA9PSAxICYmICJJbnZhbGlkIFhicmFuY2ggY29uZGl0aW9uISIpOworCisgIE1TUDQzMENDOjpDb25kQ29kZXMgQ0MgPSBzdGF0aWNfY2FzdDxNU1A0MzBDQzo6Q29uZENvZGVzPihDb25kWzBdLmdldEltbSgpKTsKKworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIkludmFsaWQgYnJhbmNoIGNvbmRpdGlvbiEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBNU1A0MzBDQzo6Q09ORF9FOgorICAgIENDID0gTVNQNDMwQ0M6OkNPTkRfTkU7CisgICAgYnJlYWs7CisgIGNhc2UgTVNQNDMwQ0M6OkNPTkRfTkU6CisgICAgQ0MgPSBNU1A0MzBDQzo6Q09ORF9FOworICAgIGJyZWFrOworICBjYXNlIE1TUDQzMENDOjpDT05EX0w6CisgICAgQ0MgPSBNU1A0MzBDQzo6Q09ORF9HRTsKKyAgICBicmVhazsKKyAgY2FzZSBNU1A0MzBDQzo6Q09ORF9HRToKKyAgICBDQyA9IE1TUDQzMENDOjpDT05EX0w7CisgICAgYnJlYWs7CisgIGNhc2UgTVNQNDMwQ0M6OkNPTkRfSFM6CisgICAgQ0MgPSBNU1A0MzBDQzo6Q09ORF9MTzsKKyAgICBicmVhazsKKyAgY2FzZSBNU1A0MzBDQzo6Q09ORF9MTzoKKyAgICBDQyA9IE1TUDQzMENDOjpDT05EX0hTOworICAgIGJyZWFrOworICB9CisKKyAgQ29uZFswXS5zZXRJbW0oQ0MpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTVNQNDMwSW5zdHJJbmZvOjppc1VucHJlZGljYXRlZFRlcm1pbmF0b3IoY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgIGlmICghVElELmlzVGVybWluYXRvcigpKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ29uZGl0aW9uYWwgYnJhbmNoIGlzIGEgc3BlY2lhbCBjYXNlLgorICBpZiAoVElELmlzQnJhbmNoKCkgJiYgIVRJRC5pc0JhcnJpZXIoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFUSUQuaXNQcmVkaWNhYmxlKCkpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiAhaXNQcmVkaWNhdGVkKE1JKTsKK30KKworYm9vbCBNU1A0MzBJbnN0ckluZm86OkFuYWx5emVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSkgY29uc3QgeworICAvLyBTdGFydCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIGJsb2NrIGFuZCB3b3JrIHVwLCBleGFtaW5pbmcgdGhlCisgIC8vIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb25zLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5lbmQoKTsKKyAgd2hpbGUgKEkgIT0gTUJCLmJlZ2luKCkpIHsKKyAgICAtLUk7CisgICAgaWYgKEktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBXb3JraW5nIGZyb20gdGhlIGJvdHRvbSwgd2hlbiB3ZSBzZWUgYSBub24tdGVybWluYXRvcgorICAgIC8vIGluc3RydWN0aW9uLCB3ZSdyZSBkb25lLgorICAgIGlmICghaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKEkpKQorICAgICAgYnJlYWs7CisKKyAgICAvLyBBIHRlcm1pbmF0b3IgdGhhdCBpc24ndCBhIGJyYW5jaCBjYW4ndCBlYXNpbHkgYmUgaGFuZGxlZAorICAgIC8vIGJ5IHRoaXMgYW5hbHlzaXMuCisgICAgaWYgKCFJLT5nZXREZXNjKCkuaXNCcmFuY2goKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gQ2Fubm90IGhhbmRsZSBpbmRpcmVjdCBicmFuY2hlcy4KKyAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gTVNQNDMwOjpCciB8fAorICAgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBNU1A0MzA6OkJtKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBIYW5kbGUgdW5jb25kaXRpb25hbCBicmFuY2hlcy4KKyAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gTVNQNDMwOjpKTVApIHsKKyAgICAgIGlmICghQWxsb3dNb2RpZnkpIHsKKyAgICAgICAgVEJCID0gSS0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoZSBibG9jayBoYXMgYW55IGluc3RydWN0aW9ucyBhZnRlciBhIEpNUCwgZGVsZXRlIHRoZW0uCisgICAgICB3aGlsZSAobGx2bTo6bmV4dChJKSAhPSBNQkIuZW5kKCkpCisgICAgICAgIGxsdm06Om5leHQoSSktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgQ29uZC5jbGVhcigpOworICAgICAgRkJCID0gMDsKKworICAgICAgLy8gRGVsZXRlIHRoZSBKTVAgaWYgaXQncyBlcXVpdmFsZW50IHRvIGEgZmFsbC10aHJvdWdoLgorICAgICAgaWYgKE1CQi5pc0xheW91dFN1Y2Nlc3NvcihJLT5nZXRPcGVyYW5kKDApLmdldE1CQigpKSkgeworICAgICAgICBUQkIgPSAwOworICAgICAgICBJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgSSA9IE1CQi5lbmQoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFRCQiBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSB1bmNvbmRpdGluYWwgZGVzdGluYXRpb24uCisgICAgICBUQkIgPSBJLT5nZXRPcGVyYW5kKDApLmdldE1CQigpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGJyYW5jaGVzLgorICAgIGFzc2VydChJLT5nZXRPcGNvZGUoKSA9PSBNU1A0MzA6OkpDQyAmJiAiSW52YWxpZCBjb25kaXRpb25hbCBicmFuY2giKTsKKyAgICBNU1A0MzBDQzo6Q29uZENvZGVzIEJyYW5jaENvZGUgPQorICAgICAgc3RhdGljX2Nhc3Q8TVNQNDMwQ0M6OkNvbmRDb2Rlcz4oSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKSk7CisgICAgaWYgKEJyYW5jaENvZGUgPT0gTVNQNDMwQ0M6OkNPTkRfSU5WQUxJRCkKKyAgICAgIHJldHVybiB0cnVlOyAgLy8gQ2FuJ3QgaGFuZGxlIHdlaXJkIHN0dWZmLgorCisgICAgLy8gV29ya2luZyBmcm9tIHRoZSBib3R0b20sIGhhbmRsZSB0aGUgZmlyc3QgY29uZGl0aW9uYWwgYnJhbmNoLgorICAgIGlmIChDb25kLmVtcHR5KCkpIHsKKyAgICAgIEZCQiA9IFRCQjsKKyAgICAgIFRCQiA9IEktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgICBDb25kLnB1c2hfYmFjayhNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlSW1tKEJyYW5jaENvZGUpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIEhhbmRsZSBzdWJzZXF1ZW50IGNvbmRpdGlvbmFsIGJyYW5jaGVzLiBPbmx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbGwKKyAgICAvLyBjb25kaXRpb25hbCBicmFuY2hlcyBicmFuY2ggdG8gdGhlIHNhbWUgZGVzdGluYXRpb24uCisgICAgYXNzZXJ0KENvbmQuc2l6ZSgpID09IDEpOworICAgIGFzc2VydChUQkIpOworCisgICAgLy8gT25seSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYWxsIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJyYW5jaCB0bworICAgIC8vIHRoZSBzYW1lIGRlc3RpbmF0aW9uLgorICAgIGlmIChUQkIgIT0gSS0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgTVNQNDMwQ0M6OkNvbmRDb2RlcyBPbGRCcmFuY2hDb2RlID0gKE1TUDQzMENDOjpDb25kQ29kZXMpQ29uZFswXS5nZXRJbW0oKTsKKyAgICAvLyBJZiB0aGUgY29uZGl0aW9ucyBhcmUgdGhlIHNhbWUsIHdlIGNhbiBsZWF2ZSB0aGVtIGFsb25lLgorICAgIGlmIChPbGRCcmFuY2hDb2RlID09IEJyYW5jaENvZGUpCisgICAgICBjb250aW51ZTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit1bnNpZ25lZAorTVNQNDMwSW5zdHJJbmZvOjpJbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0IHsKKyAgLy8gU2hvdWxkbid0IGJlIGEgZmFsbCB0aHJvdWdoLgorICBhc3NlcnQoVEJCICYmICJJbnNlcnRCcmFuY2ggbXVzdCBub3QgYmUgdG9sZCB0byBpbnNlcnQgYSBmYWxsdGhyb3VnaCIpOworICBhc3NlcnQoKENvbmQuc2l6ZSgpID09IDEgfHwgQ29uZC5zaXplKCkgPT0gMCkgJiYKKyAgICAgICAgICJNU1A0MzAgYnJhbmNoIGNvbmRpdGlvbnMgaGF2ZSBvbmUgY29tcG9uZW50ISIpOworCisgIGlmIChDb25kLmVtcHR5KCkpIHsKKyAgICAvLyBVbmNvbmRpdGlvbmFsIGJyYW5jaD8KKyAgICBhc3NlcnQoIUZCQiAmJiAiVW5jb25kaXRpb25hbCBicmFuY2ggd2l0aCBtdWx0aXBsZSBzdWNjZXNzb3JzISIpOworICAgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChNU1A0MzA6OkpNUCkpLmFkZE1CQihUQkIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gQ29uZGl0aW9uYWwgYnJhbmNoLgorICB1bnNpZ25lZCBDb3VudCA9IDA7CisgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChNU1A0MzA6OkpDQykpLmFkZE1CQihUQkIpLmFkZEltbShDb25kWzBdLmdldEltbSgpKTsKKyAgKytDb3VudDsKKworICBpZiAoRkJCKSB7CisgICAgLy8gVHdvLXdheSBDb25kaXRpb25hbCBicmFuY2guIEluc2VydCB0aGUgc2Vjb25kIGJyYW5jaC4KKyAgICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoTVNQNDMwOjpKTVApKS5hZGRNQkIoRkJCKTsKKyAgICArK0NvdW50OworICB9CisgIHJldHVybiBDb3VudDsKK30KKworLy8vIEdldEluc3RTaXplIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgY29kZSB0aGUgc3BlY2lmaWVkCisvLy8gaW5zdHJ1Y3Rpb24gbWF5IGJlLiAgVGhpcyByZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcy4KKy8vLwordW5zaWduZWQgTVNQNDMwSW5zdHJJbmZvOjpHZXRJbnN0U2l6ZUluQnl0ZXMoY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJkRlc2MgPSBNSS0+Z2V0RGVzYygpOworCisgIHN3aXRjaCAoRGVzYy5UU0ZsYWdzICYgTVNQNDMwSUk6OlNpemVNYXNrKSB7CisgIGRlZmF1bHQ6CisgICAgc3dpdGNoIChEZXNjLmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwICYmICJVbmtub3duIGluc3RydWN0aW9uIHNpemUhIik7CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OlBST0xPR19MQUJFTDoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6RUhfTEFCRUw6CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRjoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6S0lMTDoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6REJHX1ZBTFVFOgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OklOTElORUFTTTogeworICAgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IE1JLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSA9ICpNRi0+Z2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisgICAgICByZXR1cm4gVElJLmdldElubGluZUFzbUxlbmd0aChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRTeW1ib2xOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTUYtPmdldFRhcmdldCgpLmdldE1DQXNtSW5mbygpKTsKKyAgICB9CisgICAgfQorICBjYXNlIE1TUDQzMElJOjpTaXplU3BlY2lhbDoKKyAgICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoMCAmJiAiVW5rbm93biBpbnN0cnVjdGlvbiBzaXplISIpOworICAgIGNhc2UgTVNQNDMwOjpTQVI4cjFjOgorICAgIGNhc2UgTVNQNDMwOjpTQVIxNnIxYzoKKyAgICAgIHJldHVybiA0OworICAgIH0KKyAgY2FzZSBNU1A0MzBJSTo6U2l6ZTJCeXRlczoKKyAgICByZXR1cm4gMjsKKyAgY2FzZSBNU1A0MzBJSTo6U2l6ZTRCeXRlczoKKyAgICByZXR1cm4gNDsKKyAgY2FzZSBNU1A0MzBJSTo6U2l6ZTZCeXRlczoKKyAgICByZXR1cm4gNjsKKyAgfQorCisgIHJldHVybiA2OworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSW5zdHJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBJbnN0ckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWNjYzAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSW5zdHJJbmZvLmgKQEAgLTAsMCArMSw5OCBAQAorLy89PT0tIE1TUDQzMEluc3RySW5mby5oIC0gTVNQNDMwIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE1TUDQzMCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfTVNQNDMwSU5TVFJJTkZPX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfTVNQNDMwSU5TVFJJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgIk1TUDQzMFJlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1TUDQzMFRhcmdldE1hY2hpbmU7CisKKy8vLyBNU1A0MzBJSSAtIFRoaXMgbmFtZXNwYWNlIGhvbGRzIGFsbCBvZiB0aGUgdGFyZ2V0IHNwZWNpZmljIGZsYWdzIHRoYXQKKy8vLyBpbnN0cnVjdGlvbiBpbmZvIHRyYWNrcy4KKy8vLworbmFtZXNwYWNlIE1TUDQzMElJIHsKKyAgZW51bSB7CisgICAgU2l6ZVNoaWZ0ICAgPSAyLAorICAgIFNpemVNYXNrICAgID0gNyA8PCBTaXplU2hpZnQsCisKKyAgICBTaXplVW5rbm93biA9IDAgPDwgU2l6ZVNoaWZ0LAorICAgIFNpemVTcGVjaWFsID0gMSA8PCBTaXplU2hpZnQsCisgICAgU2l6ZTJCeXRlcyAgPSAyIDw8IFNpemVTaGlmdCwKKyAgICBTaXplNEJ5dGVzICA9IDMgPDwgU2l6ZVNoaWZ0LAorICAgIFNpemU2Qnl0ZXMgID0gNCA8PCBTaXplU2hpZnQKKyAgfTsKK30KKworY2xhc3MgTVNQNDMwSW5zdHJJbmZvIDogcHVibGljIFRhcmdldEluc3RySW5mb0ltcGwgeworICBjb25zdCBNU1A0MzBSZWdpc3RlckluZm8gUkk7CisgIE1TUDQzMFRhcmdldE1hY2hpbmUgJlRNOworcHVibGljOgorICBleHBsaWNpdCBNU1A0MzBJbnN0ckluZm8oTVNQNDMwVGFyZ2V0TWFjaGluZSAmVE0pOworCisgIC8vLyBnZXRSZWdpc3RlckluZm8gLSBUYXJnZXRJbnN0ckluZm8gaXMgYSBzdXBlcnNldCBvZiBNUmVnaXN0ZXIgaW5mby4gIEFzCisgIC8vLyBzdWNoLCB3aGVuZXZlciBhIGNsaWVudCBoYXMgYW4gaW5zdGFuY2Ugb2YgaW5zdHJ1Y3Rpb24gaW5mbywgaXQgc2hvdWxkCisgIC8vLyBhbHdheXMgYmUgYWJsZSB0byBnZXQgcmVnaXN0ZXIgaW5mbyBhcyB3ZWxsICh0aHJvdWdoIHRoaXMgbWV0aG9kKS4KKyAgLy8vCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBSSTsgfQorCisgIHZvaWQgY29weVBoeXNSZWcoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgIGJvb2wgS2lsbFNyYykgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIHN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRnJhbWVJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgc3BpbGxDYWxsZWVTYXZlZFJlZ2lzdGVycyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCByZXN0b3JlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICB1bnNpZ25lZCBHZXRJbnN0U2l6ZUluQnl0ZXMoY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3Q7CisKKyAgLy8gQnJhbmNoIGZvbGRpbmcgZ29vZG5lc3MKKyAgYm9vbCBSZXZlcnNlQnJhbmNoQ29uZGl0aW9uKFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQpIGNvbnN0OworICBib29sIGlzVW5wcmVkaWNhdGVkVGVybWluYXRvcihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdDsKKyAgYm9vbCBBbmFseXplQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqJlRCQiwgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSkgY29uc3Q7CisKKyAgdW5zaWduZWQgUmVtb3ZlQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0OworICB1bnNpZ25lZCBJbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0OworCit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSW5zdHJJbmZvLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwSW5zdHJJbmZvLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OTJiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBJbnN0ckluZm8udGQKQEAgLTAsMCArMSwxMjExIEBACisvLz09PS0gTVNQNDMwSW5zdHJJbmZvLnRkIC0gTVNQNDMwIEluc3RydWN0aW9uIGRlZnMgLS0tLS0tLS0tLS0qLSB0YmxnZW4tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBNU1A0MzAgaW5zdHJ1Y3Rpb25zIGluIFRhYmxlR2VuIGZvcm1hdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitpbmNsdWRlICJNU1A0MzBJbnN0ckZvcm1hdHMudGQiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUeXBlIENvbnN0cmFpbnRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIFNEVENpc0k4PGludCBPcE51bT4gOiBTRFRDaXNWVDxPcE51bSwgaTg+OworY2xhc3MgU0RUQ2lzSTE2PGludCBPcE51bT4gOiBTRFRDaXNWVDxPcE51bSwgaTE2PjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFR5cGUgUHJvZmlsZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIFNEVF9NU1A0MzBDYWxsICAgICAgICAgOiBTRFR5cGVQcm9maWxlPDAsIC0xLCBbU0RUQ2lzVlQ8MCwgaVBUUj5dPjsKK2RlZiBTRFRfTVNQNDMwQ2FsbFNlcVN0YXJ0IDogU0RDYWxsU2VxU3RhcnQ8W1NEVENpc1ZUPDAsIGkxNj5dPjsKK2RlZiBTRFRfTVNQNDMwQ2FsbFNlcUVuZCAgIDogU0RDYWxsU2VxRW5kPFtTRFRDaXNWVDwwLCBpMTY+LCBTRFRDaXNWVDwxLCBpMTY+XT47CitkZWYgU0RUX01TUDQzMFdyYXBwZXIgICAgICA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgW1NEVENpc1NhbWVBczwwLCAxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzUHRyVHk8MD5dPjsKK2RlZiBTRFRfTVNQNDMwQ21wICAgICAgICAgIDogU0RUeXBlUHJvZmlsZTwwLCAyLCBbU0RUQ2lzU2FtZUFzPDAsIDE+XT47CitkZWYgU0RUX01TUDQzMEJyQ0MgICAgICAgICA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgW1NEVENpc1ZUPDAsIE90aGVyVlQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwxLCBpOD5dPjsKK2RlZiBTRFRfTVNQNDMwU2VsZWN0Q0MgICAgIDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbU0RUQ2lzU2FtZUFzPDAsIDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNTYW1lQXM8MSwgMj4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwzLCBpOD5dPjsKK2RlZiBTRFRfTVNQNDMwU2hpZnQgICAgICAgIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzU2FtZUFzPDAsIDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNJODwyPl0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTVNQNDMwIFNwZWNpZmljIE5vZGUgRGVmaW5pdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIE1TUDQzMHJldGZsYWcgIDogU0ROb2RlPCJNU1A0MzBJU0Q6OlJFVF9GTEFHIiwgU0RUTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZ10+OworZGVmIE1TUDQzMHJldGlmbGFnIDogU0ROb2RlPCJNU1A0MzBJU0Q6OlJFVElfRkxBRyIsIFNEVE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWddPjsKKworZGVmIE1TUDQzMHJyYSAgICAgOiBTRE5vZGU8Ik1TUDQzMElTRDo6UlJBIiwgU0RUSW50VW5hcnlPcCwgW10+OworZGVmIE1TUDQzMHJsYSAgICAgOiBTRE5vZGU8Ik1TUDQzMElTRDo6UkxBIiwgU0RUSW50VW5hcnlPcCwgW10+OworZGVmIE1TUDQzMHJyYyAgICAgOiBTRE5vZGU8Ik1TUDQzMElTRDo6UlJDIiwgU0RUSW50VW5hcnlPcCwgW10+OworCitkZWYgTVNQNDMwY2FsbCAgICA6IFNETm9kZTwiTVNQNDMwSVNEOjpDQUxMIiwgU0RUX01TUDQzMENhbGwsCisgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3V0RmxhZywgU0ROUE9wdEluRmxhZywgU0ROUFZhcmlhZGljXT47CitkZWYgTVNQNDMwY2FsbHNlcV9zdGFydCA6CisgICAgICAgICAgICAgICAgIFNETm9kZTwiSVNEOjpDQUxMU0VRX1NUQVJUIiwgU0RUX01TUDQzMENhbGxTZXFTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPdXRGbGFnXT47CitkZWYgTVNQNDMwY2FsbHNlcV9lbmQgOgorICAgICAgICAgICAgICAgICBTRE5vZGU8IklTRDo6Q0FMTFNFUV9FTkQiLCAgIFNEVF9NU1A0MzBDYWxsU2VxRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZywgU0ROUE91dEZsYWddPjsKK2RlZiBNU1A0MzBXcmFwcGVyIDogU0ROb2RlPCJNU1A0MzBJU0Q6OldyYXBwZXIiLCBTRFRfTVNQNDMwV3JhcHBlcj47CitkZWYgTVNQNDMwY21wICAgICA6IFNETm9kZTwiTVNQNDMwSVNEOjpDTVAiLCBTRFRfTVNQNDMwQ21wLCBbU0ROUE91dEZsYWddPjsKK2RlZiBNU1A0MzBicmNjICAgIDogU0ROb2RlPCJNU1A0MzBJU0Q6OkJSX0NDIiwgU0RUX01TUDQzMEJyQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUEluRmxhZ10+OworZGVmIE1TUDQzMHNlbGVjdGNjOiBTRE5vZGU8Ik1TUDQzMElTRDo6U0VMRUNUX0NDIiwgU0RUX01TUDQzMFNlbGVjdENDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSW5GbGFnXT47CitkZWYgTVNQNDMwc2hsICAgICA6IFNETm9kZTwiTVNQNDMwSVNEOjpTSEwiLCBTRFRfTVNQNDMwU2hpZnQsIFtdPjsKK2RlZiBNU1A0MzBzcmEgICAgIDogU0ROb2RlPCJNU1A0MzBJU0Q6OlNSQSIsIFNEVF9NU1A0MzBTaGlmdCwgW10+OworZGVmIE1TUDQzMHNybCAgICAgOiBTRE5vZGU8Ik1TUDQzMElTRDo6U1JMIiwgU0RUX01TUDQzMFNoaWZ0LCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNU1A0MzAgT3BlcmFuZCBEZWZpbml0aW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEFkZHJlc3Mgb3BlcmFuZHMKK2RlZiBtZW1zcmMgOiBPcGVyYW5kPGkxNj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTcmNNZW1PcGVyYW5kIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdSMTYsIGkxNmltbSk7Cit9CisKK2RlZiBtZW1kc3QgOiBPcGVyYW5kPGkxNj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTcmNNZW1PcGVyYW5kIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdSMTYsIGkxNmltbSk7Cit9CisKKy8vIFNob3J0IGp1bXAgdGFyZ2V0cyBoYXZlIE90aGVyVlQgdHlwZSBhbmQgYXJlIHByaW50ZWQgYXMgcGNyZWwgaW1tIHZhbHVlcy4KK2RlZiBqbXB0YXJnZXQgOiBPcGVyYW5kPE90aGVyVlQ+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UENSZWxJbW1PcGVyYW5kIjsKK30KKworLy8gT3BlcmFuZCBmb3IgcHJpbnRpbmcgb3V0IGEgY29uZGl0aW9uIGNvZGUuCitkZWYgY2MgOiBPcGVyYW5kPGk4PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludENDT3BlcmFuZCI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNU1A0MzAgQ29tcGxleCBQYXR0ZXJuIERlZmluaXRpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIGFkZHIgOiBDb21wbGV4UGF0dGVybjxpUFRSLCAyLCAiU2VsZWN0QWRkciIsIFtdLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXR0ZXJuIEZyYWdtZW50cworZGVmIHpleHRsb2FkaTE2aTggOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGkxNiAoemV4dGxvYWRpOCBub2RlOiRwdHIpKT47CitkZWYgIGV4dGxvYWRpMTZpOCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTE2ICggZXh0bG9hZGk4IG5vZGU6JHB0cikpPjsKK2RlZiBhbmRfc3UgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLCAoYW5kIG5vZGU6JGxocywgbm9kZTokcmhzKSwgW3sKKyAgcmV0dXJuIE4tPmhhc09uZVVzZSgpOworfV0+OworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGxpc3QuLgorCisvLyBBREpDQUxMU1RBQ0tET1dOL1VQIGltcGxpY2l0bHkgdXNlL2RlZiBTUCBiZWNhdXNlIHRoZXkgbWF5IGJlIGV4cGFuZGVkIGludG8KKy8vIGEgc3RhY2sgYWRqdXN0bWVudCBhbmQgdGhlIGNvZGVnZW4gbXVzdCBrbm93IHRoYXQgdGhleSBtYXkgbW9kaWZ5IHRoZSBzdGFjaworLy8gcG9pbnRlciBiZWZvcmUgcHJvbG9nLWVwaWxvZyByZXdyaXRpbmcgb2NjdXJzLgorLy8gUGVzc2ltaXN0aWNhbGx5IGFzc3VtZSBBREpDQUxMU1RBQ0tET1dOIC8gQURKQ0FMTFNUQUNLVVAgd2lsbCBiZWNvbWUKKy8vIHN1YiAvIGFkZCB3aGljaCBjYW4gY2xvYmJlciBTUlcuCitsZXQgRGVmcyA9IFtTUFcsIFNSV10sIFVzZXMgPSBbU1BXXSBpbiB7CitkZWYgQURKQ0FMTFNUQUNLRE9XTiA6IFBzZXVkbzwob3V0cyksIChpbnMgaTE2aW1tOiRhbXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNBREpDQUxMU1RBQ0tET1dOIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY2FsbHNlcV9zdGFydCB0aW1tOiRhbXQpXT47CitkZWYgQURKQ0FMTFNUQUNLVVAgICA6IFBzZXVkbzwob3V0cyksIChpbnMgaTE2aW1tOiRhbXQxLCBpMTZpbW06JGFtdDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNBREpDQUxMU1RBQ0tVUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKE1TUDQzMGNhbGxzZXFfZW5kIHRpbW06JGFtdDEsIHRpbW06JGFtdDIpXT47Cit9CisKK2xldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxIGluIHsKKyAgZGVmIFNlbGVjdDggIDogUHNldWRvPChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgR1I4OiRzcmMyLCBpOGltbTokY2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiMgU2VsZWN0OCBQU0VVRE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChNU1A0MzBzZWxlY3RjYyBHUjg6JHNyYywgR1I4OiRzcmMyLCBpbW06JGNjKSldPjsKKyAgZGVmIFNlbGVjdDE2IDogUHNldWRvPChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBHUjE2OiRzcmMyLCBpOGltbTokY2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiMgU2VsZWN0MTYgUFNFVURPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE1TUDQzMHNlbGVjdGNjIEdSMTY6JHNyYywgR1IxNjokc3JjMiwgaW1tOiRjYykpXT47CisgIGxldCBEZWZzID0gW1NSV10gaW4geworICBkZWYgU2hsOCAgICAgOiBQc2V1ZG88KG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjLCBHUjg6JGNudCksCisgICAgICAgICAgICAgICAgICAgICAgICAiIyBTaGw4IFBTRVVETyIsCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKE1TUDQzMHNobCBHUjg6JHNyYywgR1I4OiRjbnQpKV0+OworICBkZWYgU2hsMTYgICAgOiBQc2V1ZG88KG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMsIEdSODokY250KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIjIFNobDE2IFBTRVVETyIsCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChNU1A0MzBzaGwgR1IxNjokc3JjLCBHUjg6JGNudCkpXT47CisgIGRlZiBTcmE4ICAgICA6IFBzZXVkbzwob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIEdSODokY250KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIjIFNyYTggUFNFVURPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoTVNQNDMwc3JhIEdSODokc3JjLCBHUjg6JGNudCkpXT47CisgIGRlZiBTcmExNiAgICA6IFBzZXVkbzwob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYywgR1I4OiRjbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiMgU3JhMTYgUFNFVURPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKE1TUDQzMHNyYSBHUjE2OiRzcmMsIEdSODokY250KSldPjsKKyAgZGVmIFNybDggICAgIDogUHNldWRvPChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgR1I4OiRjbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiMgU3JsOCBQU0VVRE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChNU1A0MzBzcmwgR1I4OiRzcmMsIEdSODokY250KSldPjsKKyAgZGVmIFNybDE2ICAgIDogUHNldWRvPChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBHUjg6JGNudCksCisgICAgICAgICAgICAgICAgICAgICAgICAiIyBTcmwxNiBQU0VVRE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoTVNQNDMwc3JsIEdSMTY6JHNyYywgR1I4OiRjbnQpKV0+OworCisgIH0KK30KKworbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluCitkZWYgTk9QIDogUHNldWRvPChvdXRzKSwgKGlucyksICJub3AiLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgQ29udHJvbCBGbG93IEluc3RydWN0aW9ucy4uLgorLy8KKworLy8gRklYTUU6IFByb3ZpZGUgcHJvcGVyIGVuY29kaW5nIQorbGV0IGlzUmV0dXJuID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSBpbiB7CisgIGRlZiBSRVQgIDogSUZvcm0xNjwweDAsIERzdFJlZywgU3JjUG9zdEluYywgU2l6ZTJCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyksICJyZXQiLCAgWyhNU1A0MzByZXRmbGFnKV0+OworICBkZWYgUkVUSSA6IElJMTZyPDB4MCwgKG91dHMpLCAoaW5zKSwgInJldGkiLCBbKE1TUDQzMHJldGlmbGFnKV0+OworfQorCitsZXQgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxIGluIHsKKworLy8gRklYTUU6IGV4cGFuZCBvcGNvZGUgJiBjb25kIGZpZWxkIGZvciBicmFuY2hlcyEKKworLy8gRGlyZWN0IGJyYW5jaAorbGV0IGlzQmFycmllciA9IDEgaW4geworICAvLyBTaG9ydCBicmFuY2gKKyAgZGVmIEpNUCA6IENKRm9ybTwwLCAwLCAob3V0cyksIChpbnMgam1wdGFyZ2V0OiRkc3QpLAorICAgICAgICAgICAgICAgICAgICJqbXBcdCRkc3QiLAorICAgICAgICAgICAgICAgICAgIFsoYnIgYmI6JGRzdCldPjsKKyAgbGV0IGlzSW5kaXJlY3RCcmFuY2ggPSAxIGluIHsKKyAgICAvLyBMb25nIGJyYW5jaGVzCisgICAgZGVmIEJpICA6IEkxNnJpPDAsIChvdXRzKSwgKGlucyBpMTZpbW06JGJyZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgImJyXHQkYnJkc3QiLAorICAgICAgICAgICAgICAgICAgICBbKGJyaW5kIHRibG9ja2FkZHJlc3M6JGJyZHN0KV0+OworICAgIGRlZiBCciAgOiBJMTZycjwwLCAob3V0cyksIChpbnMgR1IxNjokYnJkc3QpLAorICAgICAgICAgICAgICAgICAgICAibW92LndcdHskYnJkc3QsIHBjfSIsCisgICAgICAgICAgICAgICAgICAgIFsoYnJpbmQgR1IxNjokYnJkc3QpXT47CisgICAgZGVmIEJtICA6IEkxNnJtPDAsIChvdXRzKSwgKGlucyBtZW1zcmM6JGJyZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIm1vdi53XHR7JGJyZHN0LCBwY30iLAorICAgICAgICAgICAgICAgICAgICBbKGJyaW5kIChsb2FkIGFkZHI6JGJyZHN0KSldPjsKKyAgfQorfQorCisvLyBDb25kaXRpb25hbCBicmFuY2hlcworbGV0IFVzZXMgPSBbU1JXXSBpbgorICBkZWYgSkNDIDogQ0pGb3JtPDAsIDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGptcHRhcmdldDokZHN0LCBjYzokY2MpLAorICAgICAgICAgICAgICAgICAgICJqJGNjXHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICBbKE1TUDQzMGJyY2MgYmI6JGRzdCwgaW1tOiRjYyldPjsKK30gLy8gaXNCcmFuY2gsIGlzVGVybWluYXRvcgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIENhbGwgSW5zdHJ1Y3Rpb25zLi4uCisvLworbGV0IGlzQ2FsbCA9IDEgaW4KKyAgLy8gQWxsIGNhbGxzIGNsb2JiZXIgdGhlIG5vbi1jYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLiBTUFcgaXMgbWFya2VkIGFzCisgIC8vIGEgdXNlIHRvIHByZXZlbnQgc3RhY2stcG9pbnRlciBhc3NpZ25tZW50cyB0aGF0IGFwcGVhciBpbW1lZGlhdGVseQorICAvLyBiZWZvcmUgY2FsbHMgZnJvbSBwb3RlbnRpYWxseSBhcHBlYXJpbmcgZGVhZC4gVXNlcyBmb3IgYXJndW1lbnQKKyAgLy8gcmVnaXN0ZXJzIGFyZSBhZGRlZCBtYW51YWxseS4KKyAgbGV0IERlZnMgPSBbUjEyVywgUjEzVywgUjE0VywgUjE1VywgU1JXXSwKKyAgICAgIFVzZXMgPSBbU1BXXSBpbiB7CisgICAgZGVmIENBTExpICAgICA6IElJMTZpPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkxNmltbTokZHN0LCB2YXJpYWJsZV9vcHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbFx0JGRzdCIsIFsoTVNQNDMwY2FsbCBpbW06JGRzdCldPjsKKyAgICBkZWYgQ0FMTHIgICAgIDogSUkxNnI8MHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1IxNjokZHN0LCB2YXJpYWJsZV9vcHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbFx0JGRzdCIsIFsoTVNQNDMwY2FsbCBHUjE2OiRkc3QpXT47CisgICAgZGVmIENBTExtICAgICA6IElJMTZtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbXNyYzokZHN0LCB2YXJpYWJsZV9vcHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbFx0JHtkc3Q6bWVtfSIsIFsoTVNQNDMwY2FsbCAobG9hZCBhZGRyOiRkc3QpKV0+OworICB9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBNaXNjZWxsYW5lb3VzIEluc3RydWN0aW9ucy4uLgorLy8KK2xldCBEZWZzID0gW1NQV10sIFVzZXMgPSBbU1BXXSwgbmV2ZXJIYXNTaWRlRWZmZWN0cz0xIGluIHsKK2xldCBtYXlMb2FkID0gMSBpbgorZGVmIFBPUDE2ciAgIDogSUZvcm0xNjwweDAsIERzdFJlZywgU3JjUG9zdEluYywgU2l6ZTJCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokcmVnKSwgKGlucyksICJwb3Aud1x0JHJlZyIsIFtdPjsKKworbGV0IG1heVN0b3JlID0gMSBpbgorZGVmIFBVU0gxNnIgIDogSUkxNnI8MHgwLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSMTY6JHJlZyksICJwdXNoLndcdCRyZWciLFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1vdmUgSW5zdHJ1Y3Rpb25zCisKKy8vIEZJWE1FOiBQcm92aWRlIHByb3BlciBlbmNvZGluZyEKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7CitkZWYgTU9WOHJyICA6IEk4cnI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYyksCisgICAgICAgICAgICAgICAgICAgIm1vdi5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiBNT1YxNnJyIDogSTE2cnI8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJtb3Yud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgW10+OworfQorCisvLyBGSVhNRTogUHJvdmlkZSBwcm9wZXIgZW5jb2RpbmchCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSwgaXNBc0NoZWFwQXNBTW92ZSA9IDEgaW4geworZGVmIE1PVjhyaSAgOiBJOHJpPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgaThpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICAgIm1vdi5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCBpbW06JHNyYyldPjsKK2RlZiBNT1YxNnJpIDogSTE2cmk8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIGkxNmltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgIm1vdi53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIGltbTokc3JjKV0+OworfQorCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4geworZGVmIE1PVjhybSAgOiBJOHJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgbWVtc3JjOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJtb3YuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGxvYWQgYWRkcjokc3JjKSldPjsKK2RlZiBNT1YxNnJtIDogSTE2cm08MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIG1lbXNyYzokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgIm1vdi53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChsb2FkIGFkZHI6JHNyYykpXT47Cit9CisKK2RlZiBNT1ZaWDE2cnI4IDogSThycjwweDAsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjg6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgIm1vdi5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKHpleHQgR1I4OiRzcmMpKV0+OworZGVmIE1PVlpYMTZybTggOiBJOHJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIG1lbXNyYzokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAibW92LmJcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoemV4dGxvYWRpMTZpOCBhZGRyOiRzcmMpKV0+OworCitsZXQgbWF5TG9hZCA9IDEsIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgPSAxLCBDb25zdHJhaW50cyA9ICIkYmFzZSA9ICRiYXNlX3diIiBpbiB7CitkZWYgTU9WOHJtX1BPU1QgIDogSUZvcm04PDB4MCwgRHN0UmVnLCBTcmNQb3N0SW5jLCBTaXplMkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0LCBHUjE2OiRiYXNlX3diKSwgKGlucyBHUjE2OiRiYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibW92LmJcdHtAJGJhc2UrLCAkZHN0fSIsIFtdPjsKK2RlZiBNT1YxNnJtX1BPU1QgOiBJRm9ybTE2PDB4MCwgRHN0UmVnLCBTcmNQb3N0SW5jLCBTaXplMkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0LCBHUjE2OiRiYXNlX3diKSwgKGlucyBHUjE2OiRiYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3Yud1x0e0AkYmFzZSssICRkc3R9IiwgW10+OworfQorCisvLyBBbnkgaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIGEgOC1iaXQgcmVzdWx0IGxlYXZlcyB0aGUgaGlnaCBoYWxmIG9mIHRoZQorLy8gcmVnaXN0ZXIuIFRydW5jYXRlIGNhbiBiZSBsb3dlcmVkIHRvIEVYVFJBQ1RfU1VCUkVHLCBhbmQgQ29weUZyb21SZWcgbWF5CisvLyBiZSBjb3B5aW5nIGZyb20gYSB0cnVuY2F0ZSwgYnV0IGFueSBvdGhlciA4LWJpdCBvcGVyYXRpb24gd2lsbCB6ZXJvLWV4dGVuZAorLy8gdXAgdG8gMTYgYml0cy4KK2RlZiBkZWY4IDogUGF0TGVhZjwoaTggR1I4OiRzcmMpLCBbeworICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpUUlVOQ0FURSAmJgorICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgIT0gVGFyZ2V0T3Bjb2RlOjpFWFRSQUNUX1NVQlJFRyAmJgorICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpDb3B5RnJvbVJlZzsKK31dPjsKKworLy8gSW4gdGhlIGNhc2Ugb2YgYSA4LWJpdCBkZWYgdGhhdCBpcyBrbm93biB0byBpbXBsaWNpdGx5IHplcm8tZXh0ZW5kLAorLy8gd2UgY2FuIHVzZSBhIFNVQlJFR19UT19SRUcuCitkZWYgOiBQYXQ8KGkxNiAoemV4dCBkZWY4OiRzcmMpKSwKKyAgICAgICAgICAoU1VCUkVHX1RPX1JFRyAoaTE2IDApLCBHUjg6JHNyYywgc3VicmVnXzhiaXQpPjsKKworZGVmIE1PVjhtaSAgOiBJOG1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIGk4aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJtb3YuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChpOCBpbW06JHNyYyksIGFkZHI6JGRzdCldPjsKK2RlZiBNT1YxNm1pIDogSTE2bWk8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIGkxNmltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgIm1vdi53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChpMTYgaW1tOiRzcmMpLCBhZGRyOiRkc3QpXT47CisKK2RlZiBNT1Y4bXIgIDogSThtcjwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBHUjg6JHNyYyksCisgICAgICAgICAgICAgICAgICAgIm1vdi5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgR1I4OiRzcmMsIGFkZHI6JGRzdCldPjsKK2RlZiBNT1YxNm1yIDogSTE2bXI8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIEdSMTY6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJtb3Yud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBHUjE2OiRzcmMsIGFkZHI6JGRzdCldPjsKKworZGVmIE1PVjhtbSAgOiBJOG1tPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIG1lbXNyYzokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAibW92LmJcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoaTggKGxvYWQgYWRkcjokc3JjKSksIGFkZHI6JGRzdCldPjsKK2RlZiBNT1YxNm1tIDogSTE2bW08MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIG1lbXNyYzokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgIm1vdi53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChpMTYgKGxvYWQgYWRkcjokc3JjKSksIGFkZHI6JGRzdCldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFyaXRobWV0aWMgSW5zdHJ1Y3Rpb25zCisKK2xldCBDb25zdHJhaW50cyA9ICIkc3JjID0gJGRzdCIgaW4geworCitsZXQgRGVmcyA9IFtTUlddIGluIHsKKworbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4geyAvLyBYID0gQUREIFksIFogID09IFggPSBBREQgWiwgWQorCitkZWYgQUREOHJyICA6IEk4cnI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgR1I4OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYWRkLmJcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoYWRkIEdSODokc3JjLCBHUjg6JHNyYzIpKSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBBREQxNnJyIDogSTE2cnI8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYywgR1IxNjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJhZGQud1x0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGFkZCBHUjE2OiRzcmMsIEdSMTY6JHNyYzIpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47Cit9CisKK2RlZiBBREQ4cm0gIDogSThybTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjLCBtZW1zcmM6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJhZGQuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChhZGQgR1I4OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgQUREMTZybSA6IEkxNnJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMsIG1lbXNyYzokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJhZGQud1x0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGFkZCBHUjE2OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitsZXQgbWF5TG9hZCA9IDEsIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgPSAxLCAKK0NvbnN0cmFpbnRzID0gIiRiYXNlID0gJGJhc2Vfd2IsICRzcmMgPSAkZHN0IiBpbiB7CitkZWYgQUREOHJtX1BPU1QgOiBJRm9ybTg8MHgwLCBEc3RSZWcsIFNyY1Bvc3RJbmMsIFNpemUyQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QsIEdSMTY6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4OiRzcmMsIEdSMTY6JGJhc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhZGQuYlx0e0AkYmFzZSssICRkc3R9IiwgW10+OworZGVmIEFERDE2cm1fUE9TVCA6IElGb3JtMTY8MHgwLCBEc3RSZWcsIFNyY1Bvc3RJbmMsIFNpemUyQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QsIEdSMTY6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMsIEdSMTY6JGJhc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkLndcdHtAJGJhc2UrLCAkZHN0fSIsIFtdPjsKK30KKworCitkZWYgQUREOHJpICA6IEk4cmk8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgaThpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJhZGQuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChhZGQgR1I4OiRzcmMsIGltbTokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEFERDE2cmkgOiBJMTZyaTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBpMTZpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiYWRkLndcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChhZGQgR1IxNjokc3JjLCBpbW06JHNyYzIpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2xldCBDb25zdHJhaW50cyA9ICIiIGluIHsKK2RlZiBBREQ4bXIgIDogSThtcjwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBHUjg6JHNyYyksCisgICAgICAgICAgICAgICAgICAgImFkZC5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZCBhZGRyOiRkc3QpLCBHUjg6JHNyYyksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgQUREMTZtciA6IEkxNm1yPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBHUjE2OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAiYWRkLndcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZCBhZGRyOiRkc3QpLCBHUjE2OiRzcmMpLCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworZGVmIEFERDhtaSAgOiBJOG1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIGk4aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJhZGQuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGQgKGxvYWQgYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgQUREMTZtaSA6IEkxNm1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBpMTZpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJhZGQud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkIGFkZHI6JGRzdCksIChpMTYgaW1tOiRzcmMpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBBREQ4bW0gIDogSThtbTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBtZW1zcmM6JHNyYyksCisgICAgICAgICAgICAgICAgICAgImFkZC5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZCBhZGRyOiRkc3QpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBBREQxNm1tIDogSTE2bW08MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIG1lbXNyYzokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgImFkZC53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGQgKGxvYWQgYWRkcjokZHN0KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkxNiAobG9hZCBhZGRyOiRzcmMpKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworfQorCitsZXQgVXNlcyA9IFtTUlddIGluIHsKKworbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4geyAvLyBYID0gQUREQyBZLCBaICA9PSBYID0gQUREQyBaLCBZCitkZWYgQURDOHJyICA6IEk4cnI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgR1I4OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYWRkYy5iXHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGFkZGUgR1I4OiRzcmMsIEdSODokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEFEQzE2cnIgOiBJMTZycjwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBHUjE2OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgImFkZGMud1x0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGFkZGUgR1IxNjokc3JjLCBHUjE2OiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworfSAvLyBpc0NvbW11dGFibGUKKworZGVmIEFEQzhyaSAgOiBJOHJpPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIGk4aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYWRkYy5iXHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGFkZGUgR1I4OiRzcmMsIGltbTokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEFEQzE2cmkgOiBJMTZyaTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBpMTZpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiYWRkYy53XHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoYWRkZSBHUjE2OiRzcmMsIGltbTokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworZGVmIEFEQzhybSAgOiBJOHJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIG1lbXNyYzokc3JjMiksCisgICAgICAgICAgICAgICAgICAgImFkZGMuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChhZGRlIEdSODokc3JjLCAobG9hZCBhZGRyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEFEQzE2cm0gOiBJMTZybTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBtZW1zcmM6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiYWRkYy53XHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoYWRkZSBHUjE2OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7CitkZWYgQURDOG1yICA6IEk4bXI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgR1I4OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJhZGRjLmJcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkZSAobG9hZCBhZGRyOiRkc3QpLCBHUjg6JHNyYyksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgQURDMTZtciA6IEkxNm1yPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBHUjE2OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAiYWRkYy53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGRlIChsb2FkIGFkZHI6JGRzdCksIEdSMTY6JHNyYyksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgQURDOG1pICA6IEk4bWk8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgaThpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICAgImFkZGMuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGRlIChsb2FkIGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEFEQzE2bWkgOiBJMTZtaTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgaTE2aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAiYWRkYy53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGRlIChsb2FkIGFkZHI6JGRzdCksIChpMTYgaW1tOiRzcmMpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBBREM4bW0gIDogSThtbTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBtZW1zcmM6JHNyYyksCisgICAgICAgICAgICAgICAgICAgImFkZGMuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGRlIChsb2FkIGFkZHI6JGRzdCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBBREMxNm1tIDogSThtbTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBtZW1zcmM6JHNyYyksCisgICAgICAgICAgICAgICAgICAgImFkZGMud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGRlIChsb2FkIGFkZHI6JGRzdCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkxNiAobG9hZCBhZGRyOiRzcmMpKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47Cit9CisKK30gLy8gVXNlcyA9IFtTUlddCisKK2xldCBpc0NvbW11dGFibGUgPSAxIGluIHsgLy8gWCA9IEFORCBZLCBaICA9PSBYID0gQU5EIFosIFkKK2RlZiBBTkQ4cnIgIDogSThycjwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjLCBHUjg6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJhbmQuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChhbmQgR1I4OiRzcmMsIEdSODokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEFORDE2cnIgOiBJMTZycjwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBHUjE2OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgImFuZC53XHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoYW5kIEdSMTY6JHNyYywgR1IxNjokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK30KKworZGVmIEFORDhyaSAgOiBJOHJpPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIGk4aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYW5kLmJcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoYW5kIEdSODokc3JjLCBpbW06JHNyYzIpKSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBBTkQxNnJpIDogSTE2cmk8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYywgaTE2aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgImFuZC53XHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoYW5kIEdSMTY6JHNyYywgaW1tOiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgQU5EOHJtICA6IEk4cm08MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgbWVtc3JjOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYW5kLmJcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoYW5kIEdSODokc3JjLCAobG9hZCBhZGRyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEFORDE2cm0gOiBJMTZybTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBtZW1zcmM6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiYW5kLndcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChhbmQgR1IxNjokc3JjLCAobG9hZCBhZGRyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworbGV0IG1heUxvYWQgPSAxLCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMSwgCitDb25zdHJhaW50cyA9ICIkYmFzZSA9ICRiYXNlX3diLCAkc3JjID0gJGRzdCIgaW4geworZGVmIEFORDhybV9QT1NUIDogSUZvcm04PDB4MCwgRHN0UmVnLCBTcmNQb3N0SW5jLCBTaXplMkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0LCBHUjE2OiRiYXNlX3diKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSODokc3JjLCBHUjE2OiRiYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kLmJcdHtAJGJhc2UrLCAkZHN0fSIsIFtdPjsKK2RlZiBBTkQxNnJtX1BPU1QgOiBJRm9ybTE2PDB4MCwgRHN0UmVnLCBTcmNQb3N0SW5jLCBTaXplMkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0LCBHUjE2OiRiYXNlX3diKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjLCBHUjE2OiRiYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQud1x0e0AkYmFzZSssICRkc3R9IiwgW10+OworfQorCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7CitkZWYgQU5EOG1yICA6IEk4bXI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgR1I4OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJhbmQuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhbmQgKGxvYWQgYWRkcjokZHN0KSwgR1I4OiRzcmMpLCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEFORDE2bXIgOiBJMTZtcjwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgR1IxNjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgImFuZC53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhbmQgKGxvYWQgYWRkcjokZHN0KSwgR1IxNjokc3JjKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBBTkQ4bWkgIDogSThtaTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBpOGltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAiYW5kLmJcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYW5kIChsb2FkIGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEFORDE2bWkgOiBJMTZtaTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgaTE2aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAiYW5kLndcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFuZCAobG9hZCBhZGRyOiRkc3QpLCAoaTE2IGltbTokc3JjKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgQU5EOG1tICA6IEk4bW08MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgbWVtc3JjOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJhbmQuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhbmQgKGxvYWQgYWRkcjokZHN0KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpOCAobG9hZCBhZGRyOiRzcmMpKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgQU5EMTZtbSA6IEkxNm1tPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBtZW1zcmM6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJhbmQud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYW5kIChsb2FkIGFkZHI6JGRzdCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkxNiAobG9hZCBhZGRyOiRzcmMpKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworfQorCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7IC8vIFggPSBPUiBZLCBaICA9PSBYID0gT1IgWiwgWQorZGVmIE9SOHJyICA6IEk4cnI8MHgwLAorICAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjLCBHUjg6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgImJpcy5iXHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAob3IgR1I4OiRzcmMsIEdSODokc3JjMikpXT47CitkZWYgT1IxNnJyIDogSTE2cnI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBHUjE2OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYmlzLndcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKG9yIEdSMTY6JHNyYywgR1IxNjokc3JjMikpXT47Cit9CisKK2RlZiBPUjhyaSAgOiBJOHJpPDB4MCwKKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgaThpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgImJpcy5iXHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAob3IgR1I4OiRzcmMsIGltbTokc3JjMikpXT47CitkZWYgT1IxNnJpIDogSTE2cmk8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBpMTZpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJiaXMud1x0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAob3IgR1IxNjokc3JjLCBpbW06JHNyYzIpKV0+OworCitkZWYgT1I4cm0gIDogSThybTwweDAsCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIG1lbXNyYzokc3JjMiksCisgICAgICAgICAgICAgICAgICAiYmlzLmJcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChvciBHUjg6JHNyYywgKGxvYWQgYWRkcjokc3JjMikpKV0+OworZGVmIE9SMTZybSA6IEkxNnJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYywgbWVtc3JjOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYmlzLndcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKG9yIEdSMTY6JHNyYywgKGxvYWQgYWRkcjokc3JjMikpKV0+OworCitsZXQgbWF5TG9hZCA9IDEsIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgPSAxLCAKK0NvbnN0cmFpbnRzID0gIiRiYXNlID0gJGJhc2Vfd2IsICRzcmMgPSAkZHN0IiBpbiB7CitkZWYgT1I4cm1fUE9TVCA6IElGb3JtODwweDAsIERzdFJlZywgU3JjUG9zdEluYywgU2l6ZTJCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0LCBHUjE2OiRiYXNlX3diKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4OiRzcmMsIEdSMTY6JGJhc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgImJpcy5iXHR7QCRiYXNlKywgJGRzdH0iLCBbXT47CitkZWYgT1IxNnJtX1BPU1QgOiBJRm9ybTE2PDB4MCwgRHN0UmVnLCBTcmNQb3N0SW5jLCBTaXplMkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QsIEdSMTY6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMTY6JHNyYywgR1IxNjokYmFzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJiaXMud1x0e0AkYmFzZSssICRkc3R9IiwgW10+OworfQorCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7CitkZWYgT1I4bXIgIDogSThtcjwweDAsCisgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIEdSODokc3JjKSwKKyAgICAgICAgICAgICAgICAgICJiaXMuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKG9yIChsb2FkIGFkZHI6JGRzdCksIEdSODokc3JjKSwgYWRkcjokZHN0KV0+OworZGVmIE9SMTZtciA6IEkxNm1yPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIEdSMTY6JHNyYyksCisgICAgICAgICAgICAgICAgICAgImJpcy53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKG9yIChsb2FkIGFkZHI6JGRzdCksIEdSMTY6JHNyYyksIGFkZHI6JGRzdCldPjsKKworZGVmIE9SOG1pICA6IEk4bWk8MHgwLCAKKyAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgaThpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICAiYmlzLmJcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIChvciAobG9hZCBhZGRyOiRkc3QpLCAoaTggaW1tOiRzcmMpKSwgYWRkcjokZHN0KV0+OworZGVmIE9SMTZtaSA6IEkxNm1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIGkxNmltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAiYmlzLndcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAob3IgKGxvYWQgYWRkcjokZHN0KSwgKGkxNiBpbW06JHNyYykpLCBhZGRyOiRkc3QpXT47CisKK2RlZiBPUjhtbSAgOiBJOG1tPDB4MCwKKyAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgbWVtc3JjOiRzcmMpLAorICAgICAgICAgICAgICAgICAgImJpcy5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAob3IgKGk4IChsb2FkIGFkZHI6JGRzdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KV0+OworZGVmIE9SMTZtbSA6IEkxNm1tPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIG1lbXNyYzokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAiYmlzLndcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAob3IgKGkxNiAobG9hZCBhZGRyOiRkc3QpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTE2IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KV0+OworfQorCisvLyBiaWMgZG9lcyBub3QgbW9kaWZ5IGNvbmRpdGlvbiBjb2RlcworZGVmIEJJQzhyciA6ICBJOHJyPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIEdSODokc3JjMiksCisgICAgICAgICAgICAgICAgICAgImJpYy5iXHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGFuZCBHUjg6JHNyYywgKG5vdCBHUjg6JHNyYzIpKSldPjsKK2RlZiBCSUMxNnJyIDogSTE2cnI8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYywgR1IxNjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJiaWMud1x0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGFuZCBHUjE2OiRzcmMsIChub3QgR1IxNjokc3JjMikpKV0+OworCitkZWYgQklDOHJtIDogIEk4cm08MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgbWVtc3JjOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYmljLmJcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGFuZCBHUjg6JHNyYywgKG5vdCAoaTggKGxvYWQgYWRkcjokc3JjMikpKSkpXT47CitkZWYgQklDMTZybSA6IEkxNnJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMsIG1lbXNyYzokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJiaWMud1x0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGFuZCBHUjE2OiRzcmMsIChub3QgKGkxNiAobG9hZCBhZGRyOiRzcmMyKSkpKSldPjsKKworbGV0IENvbnN0cmFpbnRzID0gIiIgaW4geworZGVmIEJJQzhtciA6ICBJOG1yPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIEdSODokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAiYmljLmJcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYW5kIChsb2FkIGFkZHI6JGRzdCksIChub3QgR1I4OiRzcmMpKSwgYWRkcjokZHN0KV0+OworZGVmIEJJQzE2bXIgOiBJMTZtcjwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgR1IxNjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgImJpYy53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhbmQgKGxvYWQgYWRkcjokZHN0KSwgKG5vdCBHUjE2OiRzcmMpKSwgYWRkcjokZHN0KV0+OworCitkZWYgQklDOG1tIDogIEk4bW08MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgbWVtc3JjOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJiaWMuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhbmQgKGxvYWQgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoaTggKGxvYWQgYWRkcjokc3JjKSkpKSwgYWRkcjokZHN0KV0+OworZGVmIEJJQzE2bW0gOiBJMTZtbTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgbWVtc3JjOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAiYmljLndcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFuZCAobG9hZCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoaTE2IChsb2FkIGFkZHI6JHNyYykpKSksIGFkZHI6JGRzdCldPjsKK30KKworbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4geyAvLyBYID0gWE9SIFksIFogID09IFggPSBYT1IgWiwgWQorZGVmIFhPUjhyciAgOiBJOHJyPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIEdSODokc3JjMiksCisgICAgICAgICAgICAgICAgICAgInhvci5iXHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKHhvciBHUjg6JHNyYywgR1I4OiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgWE9SMTZyciA6IEkxNnJyPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMsIEdSMTY6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAieG9yLndcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsICh4b3IgR1IxNjokc3JjLCBHUjE2OiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworfQorCitkZWYgWE9SOHJpICA6IEk4cmk8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgaThpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJ4b3IuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsICh4b3IgR1I4OiRzcmMsIGltbTokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIFhPUjE2cmkgOiBJMTZyaTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBpMTZpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAieG9yLndcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsICh4b3IgR1IxNjokc3JjLCBpbW06JHNyYzIpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBYT1I4cm0gIDogSThybTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjLCBtZW1zcmM6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJ4b3IuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsICh4b3IgR1I4OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgWE9SMTZybSA6IEkxNnJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMsIG1lbXNyYzokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJ4b3Iud1x0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKHhvciBHUjE2OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitsZXQgbWF5TG9hZCA9IDEsIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgPSAxLCAKK0NvbnN0cmFpbnRzID0gIiRiYXNlID0gJGJhc2Vfd2IsICRzcmMgPSAkZHN0IiBpbiB7CitkZWYgWE9SOHJtX1BPU1QgOiBJRm9ybTg8MHgwLCBEc3RSZWcsIFNyY1Bvc3RJbmMsIFNpemUyQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QsIEdSMTY6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4OiRzcmMsIEdSMTY6JGJhc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ4b3IuYlx0e0AkYmFzZSssICRkc3R9IiwgW10+OworZGVmIFhPUjE2cm1fUE9TVCA6IElGb3JtMTY8MHgwLCBEc3RSZWcsIFNyY1Bvc3RJbmMsIFNpemUyQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QsIEdSMTY6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMsIEdSMTY6JGJhc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInhvci53XHR7QCRiYXNlKywgJGRzdH0iLCBbXT47Cit9CisKK2xldCBDb25zdHJhaW50cyA9ICIiIGluIHsKK2RlZiBYT1I4bXIgIDogSThtcjwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBHUjg6JHNyYyksCisgICAgICAgICAgICAgICAgICAgInhvci5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHhvciAobG9hZCBhZGRyOiRkc3QpLCBHUjg6JHNyYyksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgWE9SMTZtciA6IEkxNm1yPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBHUjE2OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAieG9yLndcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHhvciAobG9hZCBhZGRyOiRkc3QpLCBHUjE2OiRzcmMpLCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworZGVmIFhPUjhtaSAgOiBJOG1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIGk4aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJ4b3IuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlICh4b3IgKGxvYWQgYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgWE9SMTZtaSA6IEkxNm1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBpMTZpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJ4b3Iud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoeG9yIChsb2FkIGFkZHI6JGRzdCksIChpMTYgaW1tOiRzcmMpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBYT1I4bW0gIDogSThtbTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBtZW1zcmM6JHNyYyksCisgICAgICAgICAgICAgICAgICAgInhvci5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHhvciAobG9hZCBhZGRyOiRkc3QpLCAoaTggKGxvYWQgYWRkcjokc3JjKSkpLCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIFhPUjE2bW0gOiBJMTZtbTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgbWVtc3JjOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAieG9yLndcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHhvciAobG9hZCBhZGRyOiRkc3QpLCAoaTE2IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47Cit9CisKKworZGVmIFNVQjhyciAgOiBJOHJyPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIEdSODokc3JjMiksCisgICAgICAgICAgICAgICAgICAgInN1Yi5iXHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKHN1YiBHUjg6JHNyYywgR1I4OiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgU1VCMTZyciA6IEkxNnJyPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMsIEdSMTY6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAic3ViLndcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzdWIgR1IxNjokc3JjLCBHUjE2OiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgU1VCOHJpICA6IEk4cmk8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYywgaThpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJzdWIuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChzdWIgR1I4OiRzcmMsIGltbTokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIFNVQjE2cmkgOiBJMTZyaTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBpMTZpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAic3ViLndcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzdWIgR1IxNjokc3JjLCBpbW06JHNyYzIpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBTVUI4cm0gIDogSThybTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjLCBtZW1zcmM6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJzdWIuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChzdWIgR1I4OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgU1VCMTZybSA6IEkxNnJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMsIG1lbXNyYzokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJzdWIud1x0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKHN1YiBHUjE2OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitsZXQgbWF5TG9hZCA9IDEsIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgPSAxLCAKK0NvbnN0cmFpbnRzID0gIiRiYXNlID0gJGJhc2Vfd2IsICRzcmMgPSAkZHN0IiBpbiB7CitkZWYgU1VCOHJtX1BPU1QgOiBJRm9ybTg8MHgwLCBEc3RSZWcsIFNyY1Bvc3RJbmMsIFNpemUyQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QsIEdSMTY6JGJhc2Vfd2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4OiRzcmMsIEdSMTY6JGJhc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdWIuYlx0e0AkYmFzZSssICRkc3R9IiwgW10+OworZGVmIFNVQjE2cm1fUE9TVCA6IElGb3JtMTY8MHgwLCBEc3RSZWcsIFNyY1Bvc3RJbmMsIFNpemUyQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCwgR1IxNjokYmFzZV93YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjLCBHUjE2OiRiYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Yi53XHR7QCRiYXNlKywgJGRzdH0iLCBbXT47Cit9CisKK2xldCBDb25zdHJhaW50cyA9ICIiIGluIHsKK2RlZiBTVUI4bXIgIDogSThtcjwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBHUjg6JHNyYyksCisgICAgICAgICAgICAgICAgICAgInN1Yi5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHN1YiAobG9hZCBhZGRyOiRkc3QpLCBHUjg6JHNyYyksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgU1VCMTZtciA6IEkxNm1yPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBHUjE2OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAic3ViLndcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHN1YiAobG9hZCBhZGRyOiRkc3QpLCBHUjE2OiRzcmMpLCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworZGVmIFNVQjhtaSAgOiBJOG1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIGk4aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJzdWIuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzdWIgKGxvYWQgYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgU1VCMTZtaSA6IEkxNm1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBpMTZpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJzdWIud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViIChsb2FkIGFkZHI6JGRzdCksIChpMTYgaW1tOiRzcmMpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBTVUI4bW0gIDogSThtbTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbWRzdDokZHN0LCBtZW1zcmM6JHNyYyksCisgICAgICAgICAgICAgICAgICAgInN1Yi5iXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHN1YiAobG9hZCBhZGRyOiRkc3QpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBTVUIxNm1tIDogSTE2bW08MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIG1lbXNyYzokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgInN1Yi53XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzdWIgKGxvYWQgYWRkcjokZHN0KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTE2IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47Cit9CisKK2xldCBVc2VzID0gW1NSV10gaW4geworZGVmIFNCQzhyciAgOiBJOHJyPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIEdSODokc3JjMiksCisgICAgICAgICAgICAgICAgICAgInN1YmMuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChzdWJlIEdSODokc3JjLCBHUjg6JHNyYzIpKSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBTQkMxNnJyIDogSTE2cnI8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYywgR1IxNjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJzdWJjLndcdHskc3JjMiwgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzdWJlIEdSMTY6JHNyYywgR1IxNjokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworZGVmIFNCQzhyaSAgOiBJOHJpPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIGk4aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAic3ViYy5iXHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKHN1YmUgR1I4OiRzcmMsIGltbTokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIFNCQzE2cmkgOiBJMTZyaTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBpMTZpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAic3ViYy53XHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoc3ViZSBHUjE2OiRzcmMsIGltbTokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworZGVmIFNCQzhybSAgOiBJOHJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMsIG1lbXNyYzokc3JjMiksCisgICAgICAgICAgICAgICAgICAgInN1YmMuYlx0eyRzcmMyLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChzdWJlIEdSODokc3JjLCAobG9hZCBhZGRyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIFNCQzE2cm0gOiBJMTZybTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjLCBtZW1zcmM6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAic3ViYy53XHR7JHNyYzIsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoc3ViZSBHUjE2OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7CitkZWYgU0JDOG1yICA6IEk4bXI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgR1I4OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJzdWJjLmJcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzdWJlIChsb2FkIGFkZHI6JGRzdCksIEdSODokc3JjKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIFNCQzE2bXIgOiBJMTZtcjwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgR1IxNjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgInN1YmMud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViZSAobG9hZCBhZGRyOiRkc3QpLCBHUjE2OiRzcmMpLCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworZGVmIFNCQzhtaSAgOiBJOG1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIGk4aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJzdWJjLmJcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViZSAobG9hZCBhZGRyOiRkc3QpLCAoaTggaW1tOiRzcmMpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBTQkMxNm1pIDogSTE2bWk8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIGkxNmltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgInN1YmMud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViZSAobG9hZCBhZGRyOiRkc3QpLCAoaTE2IGltbTokc3JjKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgU0JDOG1tICA6IEk4bW08MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1kc3Q6JGRzdCwgbWVtc3JjOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJzdWJjLmJcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViZSAobG9hZCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBTQkMxNm1tIDogSTE2bW08MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtZHN0OiRkc3QsIG1lbXNyYzokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgInN1YmMud1x0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViZSAobG9hZCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMTYgKGxvYWQgYWRkcjokc3JjKSkpLCBhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK30KKworfSAvLyBVc2VzID0gW1NSV10KKworLy8gRklYTUU6IG1lbW9yeSB2YXJpYW50IQorZGVmIFNBUjhyMSAgOiBJSThyPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJycmEuYlx0JGRzdCIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChNU1A0MzBycmEgR1I4OiRzcmMpKSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBTQVIxNnIxIDogSUkxNnI8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJycmEud1x0JGRzdCIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKE1TUDQzMHJyYSBHUjE2OiRzcmMpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBTSEw4cjEgIDogSThycjwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAicmxhLmJcdCRkc3QiLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoTVNQNDMwcmxhIEdSODokc3JjKSksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgU0hMMTZyMSA6IEkxNnJyPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAicmxhLndcdCRkc3QiLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChNU1A0MzBybGEgR1IxNjokc3JjKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgU0FSOHIxYyAgOiBQc2V1ZG88KG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAiY2xyY1xuXHQiCisgICAgICAgICAgICAgICAgICAgICAgInJyYy5iXHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKE1TUDQzMHJyYyBHUjg6JHNyYykpLAorICAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIFNBUjE2cjFjIDogUHNldWRvPChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAiY2xyY1xuXHQiCisgICAgICAgICAgICAgICAgICAgICAgInJyYy53XHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChNU1A0MzBycmMgR1IxNjokc3JjKSksCisgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKKy8vIEZJWE1FOiBNZW1vcnkgc2V4dCdzID8KK2RlZiBTRVhUMTZyIDogSUkxNnI8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJzeHRcdCRkc3QiLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzZXh0X2lucmVnIEdSMTY6JHNyYywgaTgpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK30gLy8gRGVmcyA9IFtTUlddCisKK2RlZiBaRVhUMTZyIDogSThycjwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJtb3YuYlx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsICh6ZXh0ICh0cnVuYyBHUjE2OiRzcmMpKSldPjsKKworLy8gRklYTUU6IE1lbW9yeSBiaXRzd2Fwcz8KK2RlZiBTV1BCMTZyIDogSUkxNnI8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJzd3BiXHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoYnN3YXAgR1IxNjokc3JjKSldPjsKKworfSAvLyBDb25zdHJhaW50cyA9ICIkc3JjID0gJGRzdCIKKworLy8gSW50ZWdlciBjb21wYXJpc29ucworbGV0IERlZnMgPSBbU1JXXSBpbiB7CitkZWYgQ01QOHJyICA6IEk4cnI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjg6JHNyYywgR1I4OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiY21wLmJcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIEdSODokc3JjLCBHUjg6JHNyYzIpLCAoaW1wbGljaXQgU1JXKV0+OworZGVmIENNUDE2cnIgOiBJMTZycjwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjE2OiRzcmMsIEdSMTY6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiY21wLndcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICBbKE1TUDQzMGNtcCBHUjE2OiRzcmMsIEdSMTY6JHNyYzIpLCAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgQ01QOHJpICA6IEk4cmk8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjg6JHNyYywgaThpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJjbXAuYlx0eyRzcmMyLCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgWyhNU1A0MzBjbXAgR1I4OiRzcmMsIGltbTokc3JjMiksIChpbXBsaWNpdCBTUlcpXT47CitkZWYgQ01QMTZyaSA6IEkxNnJpPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSMTY6JHNyYywgaTE2aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgImNtcC53XHR7JHNyYzIsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhNU1A0MzBjbXAgR1IxNjokc3JjLCBpbW06JHNyYzIpLCAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgQ01QOG1pICA6IEk4bWk8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1zcmM6JHNyYywgaThpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJjbXAuYlx0eyRzcmMyLCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgWyhNU1A0MzBjbXAgKGxvYWQgYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTggaW1tOiRzcmMyKSksIChpbXBsaWNpdCBTUlcpXT47CitkZWYgQ01QMTZtaSA6IEkxNm1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbXNyYzokc3JjLCBpMTZpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiY21wLndcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgWyhNU1A0MzBjbXAgKGxvYWQgYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMTYgaW1tOiRzcmMyKSksIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBDTVA4cm0gIDogSThybTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSODokc3JjLCBtZW1zcmM6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJjbXAuYlx0eyRzcmMyLCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgWyhNU1A0MzBjbXAgR1I4OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSwgCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgQ01QMTZybSA6IEkxNnJtPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSMTY6JHNyYywgbWVtc3JjOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgImNtcC53XHR7JHNyYzIsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhNU1A0MzBjbXAgR1IxNjokc3JjLCAobG9hZCBhZGRyOiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgQ01QOG1yICA6IEk4bXI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1zcmM6JHNyYywgR1I4OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiY21wLmJcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIChsb2FkIGFkZHI6JHNyYyksIEdSODokc3JjMiksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CitkZWYgQ01QMTZtciA6IEkxNm1yPDB4MCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIG1lbXNyYzokc3JjLCBHUjE2OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgImNtcC53XHR7JHNyYzIsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhNU1A0MzBjbXAgKGxvYWQgYWRkcjokc3JjKSwgR1IxNjokc3JjMiksIAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworCisvLyBCSVQgVEVTVFMsIGp1c3Qgc2V0cyBjb25kaXRpb24gY29kZXMKKy8vIE5vdGUgdGhhdCB0aGUgQyBjb25kaXRpb24gaXMgc2V0IGRpZmZlcmVudGx5IHRoYW4gd2hlbiB1c2luZyBDTVAuCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7CitkZWYgQklUOHJyICA6IEk4cnI8MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjg6JHNyYywgR1I4OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYml0LmJcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIChhbmRfc3UgR1I4OiRzcmMsIEdSODokc3JjMiksIDApLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEJJVDE2cnIgOiBJMTZycjwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjE2OiRzcmMsIEdSMTY6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiYml0LndcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICBbKE1TUDQzMGNtcCAoYW5kX3N1IEdSMTY6JHNyYywgR1IxNjokc3JjMiksIDApLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK30KK2RlZiBCSVQ4cmkgIDogSThyaTwweDAsCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSODokc3JjLCBpOGltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgImJpdC5iXHR7JHNyYzIsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICBbKE1TUDQzMGNtcCAoYW5kX3N1IEdSODokc3JjLCBpbW06JHNyYzIpLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBCSVQxNnJpIDogSTE2cmk8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1IxNjokc3JjLCBpMTZpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiYml0LndcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICBbKE1TUDQzMGNtcCAoYW5kX3N1IEdSMTY6JHNyYywgaW1tOiRzcmMyKSwgMCksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgQklUOHJtICA6IEk4cm08MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjg6JHNyYywgbWVtZHN0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYml0LmJcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIChhbmRfc3UgR1I4OiRzcmMsICAobG9hZCBhZGRyOiRzcmMyKSksIDApLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEJJVDE2cm0gOiBJMTZybTwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjE2OiRzcmMsIG1lbWRzdDokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJiaXQud1x0eyRzcmMyLCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIChhbmRfc3UgR1IxNjokc3JjLCAgKGxvYWQgYWRkcjokc3JjMikpLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47CisKK2RlZiBCSVQ4bXIgIDogSThtcjwweDAsCisgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtc3JjOiRzcmMsIEdSODokc3JjMiksCisgICAgICAgICAgICAgICAgICAiYml0LmJcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgWyhNU1A0MzBjbXAgKGFuZF9zdSAobG9hZCBhZGRyOiRzcmMpLCBHUjg6JHNyYzIpLCAwKSwKKyAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworZGVmIEJJVDE2bXIgOiBJMTZtcjwweDAsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1zcmM6JHNyYywgR1IxNjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJiaXQud1x0eyRzcmMyLCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIChhbmRfc3UgKGxvYWQgYWRkcjokc3JjKSwgR1IxNjokc3JjMiksIDApLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKKworZGVmIEJJVDhtaSAgOiBJOG1pPDB4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtc3JjOiRzcmMsIGk4aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYml0LmJcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIChhbmRfc3UgKGxvYWQgYWRkcjokc3JjKSwgKGk4IGltbTokc3JjMikpLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBCSVQxNm1pIDogSTE2bWk8MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtc3JjOiRzcmMsIGkxNmltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJiaXQud1x0eyRzcmMyLCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIChhbmRfc3UgKGxvYWQgYWRkcjokc3JjKSwgKGkxNiBpbW06JHNyYzIpKSwgMCksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgU1JXKV0+OworCitkZWYgQklUOG1tICA6IEk4bW08MHgwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBtZW1zcmM6JHNyYywgbWVtc3JjOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYml0LmJcdHskc3JjMiwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIChhbmRfc3UgKGk4IChsb2FkIGFkZHI6JHNyYykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgYWRkcjokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCksCisgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFNSVyldPjsKK2RlZiBCSVQxNm1tIDogSTE2bW08MHgwLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgbWVtc3JjOiRzcmMsIG1lbXNyYzokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJiaXQud1x0eyRzcmMyLCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgIFsoTVNQNDMwY21wIChhbmRfc3UgKGkxNiAobG9hZCBhZGRyOiRzcmMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZCBhZGRyOiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBTUlcpXT47Cit9IC8vIERlZnMgPSBbU1JXXQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTm9uLUluc3RydWN0aW9uIFBhdHRlcm5zCisKKy8vIGV4dGxvYWQKK2RlZiA6IFBhdDwoZXh0bG9hZGkxNmk4IGFkZHI6JHNyYyksIChNT1ZaWDE2cm04IGFkZHI6JHNyYyk+OworCisvLyBhbnlleHQKK2RlZiA6IFBhdDwoaTE2IChhbnlleHQgR1I4OiRzcmMpKSwKKyAgICAgICAgICAoU1VCUkVHX1RPX1JFRyAoaTE2IDApLCBHUjg6JHNyYywgc3VicmVnXzhiaXQpPjsKKworLy8gdHJ1bmNzCitkZWYgOiBQYXQ8KGk4ICh0cnVuYyBHUjE2OiRzcmMpKSwKKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgR1IxNjokc3JjLCBzdWJyZWdfOGJpdCk+OworCisvLyBHbG9iYWxBZGRyZXNzLCBFeHRlcm5hbFN5bWJvbAorZGVmIDogUGF0PChpMTYgKE1TUDQzMFdyYXBwZXIgdGdsb2JhbGFkZHI6JGRzdCkpLCAoTU9WMTZyaSB0Z2xvYmFsYWRkcjokZHN0KT47CitkZWYgOiBQYXQ8KGkxNiAoTVNQNDMwV3JhcHBlciB0ZXh0ZXJuYWxzeW06JGRzdCkpLCAoTU9WMTZyaSB0ZXh0ZXJuYWxzeW06JGRzdCk+OworZGVmIDogUGF0PChpMTYgKE1TUDQzMFdyYXBwZXIgdGJsb2NrYWRkcmVzczokZHN0KSksIChNT1YxNnJpIHRibG9ja2FkZHJlc3M6JGRzdCk+OworCitkZWYgOiBQYXQ8KGFkZCBHUjE2OiRzcmMsIChNU1A0MzBXcmFwcGVyIHRnbG9iYWxhZGRyIDokc3JjMikpLAorICAgICAgICAgIChBREQxNnJpIEdSMTY6JHNyYywgdGdsb2JhbGFkZHI6JHNyYzIpPjsKK2RlZiA6IFBhdDwoYWRkIEdSMTY6JHNyYywgKE1TUDQzMFdyYXBwZXIgdGV4dGVybmFsc3ltOiRzcmMyKSksCisgICAgICAgICAgKEFERDE2cmkgR1IxNjokc3JjLCB0ZXh0ZXJuYWxzeW06JHNyYzIpPjsKK2RlZiA6IFBhdDwoYWRkIEdSMTY6JHNyYywgKE1TUDQzMFdyYXBwZXIgdGJsb2NrYWRkcmVzczokc3JjMikpLAorICAgICAgICAgIChBREQxNnJpIEdSMTY6JHNyYywgdGJsb2NrYWRkcmVzczokc3JjMik+OworCitkZWYgOiBQYXQ8KHN0b3JlIChpMTYgKE1TUDQzMFdyYXBwZXIgdGdsb2JhbGFkZHI6JHNyYykpLCBhZGRyOiRkc3QpLAorICAgICAgICAgIChNT1YxNm1pIGFkZHI6JGRzdCwgdGdsb2JhbGFkZHI6JHNyYyk+OworZGVmIDogUGF0PChzdG9yZSAoaTE2IChNU1A0MzBXcmFwcGVyIHRleHRlcm5hbHN5bTokc3JjKSksIGFkZHI6JGRzdCksCisgICAgICAgICAgKE1PVjE2bWkgYWRkcjokZHN0LCB0ZXh0ZXJuYWxzeW06JHNyYyk+OworZGVmIDogUGF0PChzdG9yZSAoaTE2IChNU1A0MzBXcmFwcGVyIHRibG9ja2FkZHJlc3M6JHNyYykpLCBhZGRyOiRkc3QpLAorICAgICAgICAgIChNT1YxNm1pIGFkZHI6JGRzdCwgdGJsb2NrYWRkcmVzczokc3JjKT47CisKKy8vIGNhbGxzCitkZWYgOiBQYXQ8KE1TUDQzMGNhbGwgKGkxNiB0Z2xvYmFsYWRkcjokZHN0KSksCisgICAgICAgICAgKENBTExpIHRnbG9iYWxhZGRyOiRkc3QpPjsKK2RlZiA6IFBhdDwoTVNQNDMwY2FsbCAoaTE2IHRleHRlcm5hbHN5bTokZHN0KSksCisgICAgICAgICAgKENBTExpIHRleHRlcm5hbHN5bTokZHN0KT47CisKKy8vIGFkZCBhbmQgc3ViIGFsd2F5cyBwcm9kdWNlIGNhcnJ5CitkZWYgOiBQYXQ8KGFkZGMgR1IxNjokc3JjLCBHUjE2OiRzcmMyKSwKKyAgICAgICAgICAoQUREMTZyciBHUjE2OiRzcmMsIEdSMTY6JHNyYzIpPjsKK2RlZiA6IFBhdDwoYWRkYyBHUjE2OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSwKKyAgICAgICAgICAoQUREMTZybSBHUjE2OiRzcmMsIGFkZHI6JHNyYzIpPjsKK2RlZiA6IFBhdDwoYWRkYyBHUjE2OiRzcmMsIGltbTokc3JjMiksCisgICAgICAgICAgKEFERDE2cmkgR1IxNjokc3JjLCBpbW06JHNyYzIpPjsKK2RlZiA6IFBhdDwoc3RvcmUgKGFkZGMgKGxvYWQgYWRkcjokZHN0KSwgR1IxNjokc3JjKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAoQUREMTZtciBhZGRyOiRkc3QsIEdSMTY6JHNyYyk+OworZGVmIDogUGF0PChzdG9yZSAoYWRkYyAobG9hZCBhZGRyOiRkc3QpLCAoaTE2IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAoQUREMTZtbSBhZGRyOiRkc3QsIGFkZHI6JHNyYyk+OworCitkZWYgOiBQYXQ8KGFkZGMgR1I4OiRzcmMsIEdSODokc3JjMiksCisgICAgICAgICAgKEFERDhyciBHUjg6JHNyYywgR1I4OiRzcmMyKT47CitkZWYgOiBQYXQ8KGFkZGMgR1I4OiRzcmMsIChsb2FkIGFkZHI6JHNyYzIpKSwKKyAgICAgICAgICAoQUREOHJtIEdSODokc3JjLCBhZGRyOiRzcmMyKT47CitkZWYgOiBQYXQ8KGFkZGMgR1I4OiRzcmMsIGltbTokc3JjMiksCisgICAgICAgICAgKEFERDhyaSBHUjg6JHNyYywgaW1tOiRzcmMyKT47CitkZWYgOiBQYXQ8KHN0b3JlIChhZGRjIChsb2FkIGFkZHI6JGRzdCksIEdSODokc3JjKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAoQUREOG1yIGFkZHI6JGRzdCwgR1I4OiRzcmMpPjsKK2RlZiA6IFBhdDwoc3RvcmUgKGFkZGMgKGxvYWQgYWRkcjokZHN0KSwgKGk4IChsb2FkIGFkZHI6JHNyYykpKSwgYWRkcjokZHN0KSwKKyAgICAgICAgICAoQUREOG1tIGFkZHI6JGRzdCwgYWRkcjokc3JjKT47CisKK2RlZiA6IFBhdDwoc3ViYyBHUjE2OiRzcmMsIEdSMTY6JHNyYzIpLAorICAgICAgICAgIChTVUIxNnJyIEdSMTY6JHNyYywgR1IxNjokc3JjMik+OworZGVmIDogUGF0PChzdWJjIEdSMTY6JHNyYywgKGxvYWQgYWRkcjokc3JjMikpLAorICAgICAgICAgIChTVUIxNnJtIEdSMTY6JHNyYywgYWRkcjokc3JjMik+OworZGVmIDogUGF0PChzdWJjIEdSMTY6JHNyYywgaW1tOiRzcmMyKSwKKyAgICAgICAgICAoU1VCMTZyaSBHUjE2OiRzcmMsIGltbTokc3JjMik+OworZGVmIDogUGF0PChzdG9yZSAoc3ViYyAobG9hZCBhZGRyOiRkc3QpLCBHUjE2OiRzcmMpLCBhZGRyOiRkc3QpLAorICAgICAgICAgIChTVUIxNm1yIGFkZHI6JGRzdCwgR1IxNjokc3JjKT47CitkZWYgOiBQYXQ8KHN0b3JlIChzdWJjIChsb2FkIGFkZHI6JGRzdCksIChpMTYgKGxvYWQgYWRkcjokc3JjKSkpLCBhZGRyOiRkc3QpLAorICAgICAgICAgIChTVUIxNm1tIGFkZHI6JGRzdCwgYWRkcjokc3JjKT47CisKK2RlZiA6IFBhdDwoc3ViYyBHUjg6JHNyYywgR1I4OiRzcmMyKSwKKyAgICAgICAgICAoU1VCOHJyIEdSODokc3JjLCBHUjg6JHNyYzIpPjsKK2RlZiA6IFBhdDwoc3ViYyBHUjg6JHNyYywgKGxvYWQgYWRkcjokc3JjMikpLAorICAgICAgICAgIChTVUI4cm0gR1I4OiRzcmMsIGFkZHI6JHNyYzIpPjsKK2RlZiA6IFBhdDwoc3ViYyBHUjg6JHNyYywgaW1tOiRzcmMyKSwKKyAgICAgICAgICAoU1VCOHJpIEdSODokc3JjLCBpbW06JHNyYzIpPjsKK2RlZiA6IFBhdDwoc3RvcmUgKHN1YmMgKGxvYWQgYWRkcjokZHN0KSwgR1I4OiRzcmMpLCBhZGRyOiRkc3QpLAorICAgICAgICAgIChTVUI4bXIgYWRkcjokZHN0LCBHUjg6JHNyYyk+OworZGVmIDogUGF0PChzdG9yZSAoc3ViYyAobG9hZCBhZGRyOiRkc3QpLCAoaTggKGxvYWQgYWRkcjokc3JjKSkpLCBhZGRyOiRkc3QpLAorICAgICAgICAgIChTVUI4bW0gYWRkcjokZHN0LCBhZGRyOiRzcmMpPjsKKworLy8gcGVlcGhvbGUgcGF0dGVybnMKK2RlZiA6IFBhdDwoYW5kIEdSMTY6JHNyYywgMjU1KSwgKFpFWFQxNnIgR1IxNjokc3JjKT47CitkZWYgOiBQYXQ8KE1TUDQzMGNtcCAodHJ1bmMgKGFuZF9zdSBHUjE2OiRzcmMsIEdSMTY6JHNyYzIpKSwgMCksCisgICAgICAgICAgKEJJVDhyciAoRVhUUkFDVF9TVUJSRUcgR1IxNjokc3JjLCBzdWJyZWdfOGJpdCksCisgICAgICAgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgR1IxNjokc3JjMiwgc3VicmVnXzhiaXQpKT47CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBNQ0FzbUluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwTUNBc21JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQ0OTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwTUNBc21JbmZvLmNwcApAQCAtMCwwICsxLDI2IEBACisvLz09PS0tIE1TUDQzME1DQXNtSW5mby5jcHAgLSBNU1A0MzAgYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBNU1A0MzBNQ0FzbUluZm8gcHJvcGVydGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiTVNQNDMwTUNBc21JbmZvLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworTVNQNDMwTUNBc21JbmZvOjpNU1A0MzBNQ0FzbUluZm8oY29uc3QgVGFyZ2V0ICZULCBTdHJpbmdSZWYgVFQpIHsKKyAgUHJpdmF0ZUdsb2JhbFByZWZpeCA9ICIuTCI7CisgIFdlYWtSZWZEaXJlY3RpdmUgPSJcdC53ZWFrXHQiOworICBQQ1N5bWJvbD0iLiI7CisgIENvbW1lbnRTdHJpbmcgPSAiOyI7CisKKyAgQWxpZ25tZW50SXNJbkJ5dGVzID0gZmFsc2U7CisgIEFsbG93TmFtZVRvU3RhcnRXaXRoRGlnaXQgPSB0cnVlOworICBVc2VzRUxGU2VjdGlvbkRpcmVjdGl2ZUZvckJTUyA9IHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBNQ0FzbUluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzME1DQXNtSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTM4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBNQ0FzbUluZm8uaApAQCAtMCwwICsxLDI5IEBACisvLz09PT09LS0gTVNQNDMwTUNBc21JbmZvLmggLSBNU1A0MzAgYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNU1A0MzBNQ0FzbUluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBNU1A0MzBUQVJHRVRBU01JTkZPX0gKKyNkZWZpbmUgTVNQNDMwVEFSR0VUQVNNSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFRhcmdldDsKKworICBzdHJ1Y3QgTVNQNDMwTUNBc21JbmZvIDogcHVibGljIE1DQXNtSW5mbyB7CisgICAgZXhwbGljaXQgTVNQNDMwTUNBc21JbmZvKGNvbnN0IFRhcmdldCAmVCwgU3RyaW5nUmVmIFRUKTsKKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzME1hY2hpbmVGdW5jdGlvbkluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzME1hY2hpbmVGdW5jdGlvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNmZDJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwTWFjaGluZUZ1bmN0aW9uSW5mby5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vPT09LSBNU1A0MzBNYWNoaW5lRnVjdGlvbkluZm8uaCAtIE1TUDQzMCBtYWNoaW5lIGZ1bmN0aW9uIGluZm8gLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIE1TUDQzMC1zcGVjaWZpYyBwZXItbWFjaGluZS1mdW5jdGlvbiBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE1TUDQzME1BQ0hJTkVGVU5DVElPTklORk9fSAorI2RlZmluZSBNU1A0MzBNQUNISU5FRlVOQ1RJT05JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gTVNQNDMwTWFjaGluZUZ1bmN0aW9uSW5mbyAtIFRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIE1hY2hpbmVGdW5jdGlvbiBhbmQKKy8vLyBjb250YWlucyBwcml2YXRlIE1TUDQzMCB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGVhY2ggTWFjaGluZUZ1bmN0aW9uLgorY2xhc3MgTVNQNDMwTWFjaGluZUZ1bmN0aW9uSW5mbyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25JbmZvIHsKKyAgLy8vIENhbGxlZVNhdmVkRnJhbWVTaXplIC0gU2l6ZSBvZiB0aGUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIHBvcnRpb24gb2YgdGhlCisgIC8vLyBzdGFjayBmcmFtZSBpbiBieXRlcy4KKyAgdW5zaWduZWQgQ2FsbGVlU2F2ZWRGcmFtZVNpemU7CisKKyAgLy8vIFJldHVybkFkZHJJbmRleCAtIEZyYW1lSW5kZXggZm9yIHJldHVybiBzbG90LgorICBpbnQgUmV0dXJuQWRkckluZGV4OworCitwdWJsaWM6CisgIE1TUDQzME1hY2hpbmVGdW5jdGlvbkluZm8oKSA6IENhbGxlZVNhdmVkRnJhbWVTaXplKDApIHt9CisKKyAgZXhwbGljaXQgTVNQNDMwTWFjaGluZUZ1bmN0aW9uSW5mbyhNYWNoaW5lRnVuY3Rpb24gJk1GKQorICAgIDogQ2FsbGVlU2F2ZWRGcmFtZVNpemUoMCksIFJldHVybkFkZHJJbmRleCgwKSB7fQorCisgIHVuc2lnbmVkIGdldENhbGxlZVNhdmVkRnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gQ2FsbGVlU2F2ZWRGcmFtZVNpemU7IH0KKyAgdm9pZCBzZXRDYWxsZWVTYXZlZEZyYW1lU2l6ZSh1bnNpZ25lZCBieXRlcykgeyBDYWxsZWVTYXZlZEZyYW1lU2l6ZSA9IGJ5dGVzOyB9CisKKyAgaW50IGdldFJBSW5kZXgoKSBjb25zdCB7IHJldHVybiBSZXR1cm5BZGRySW5kZXg7IH0KKyAgdm9pZCBzZXRSQUluZGV4KGludCBJbmRleCkgeyBSZXR1cm5BZGRySW5kZXggPSBJbmRleDsgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBSZWdpc3RlckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwUmVnaXN0ZXJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRjN2VkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwUmVnaXN0ZXJJbmZvLmNwcApAQCAtMCwwICsxLDM4MyBAQAorLy89PT0tIE1TUDQzMFJlZ2lzdGVySW5mby5jcHAgLSBNU1A0MzAgUmVnaXN0ZXIgSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE1TUDQzMCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibXNwNDMwLXJlZy1pbmZvIgorCisjaW5jbHVkZSAiTVNQNDMwLmgiCisjaW5jbHVkZSAiTVNQNDMwTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIk1TUDQzMFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgIk1TUDQzMFRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBGSVhNRTogUHJvdmlkZSBwcm9wZXIgY2FsbCBmcmFtZSBzZXR1cCAvIGRlc3Ryb3kgb3Bjb2Rlcy4KK01TUDQzMFJlZ2lzdGVySW5mbzo6TVNQNDMwUmVnaXN0ZXJJbmZvKE1TUDQzMFRhcmdldE1hY2hpbmUgJnRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpCisgIDogTVNQNDMwR2VuUmVnaXN0ZXJJbmZvKE1TUDQzMDo6QURKQ0FMTFNUQUNLRE9XTiwgTVNQNDMwOjpBREpDQUxMU1RBQ0tVUCksCisgICAgVE0odG0pLCBUSUkodGlpKSB7CisgIFN0YWNrQWxpZ24gPSBUTS5nZXRGcmFtZUluZm8oKS0+Z2V0U3RhY2tBbGlnbm1lbnQoKTsKK30KKworY29uc3QgdW5zaWduZWQqCitNU1A0MzBSZWdpc3RlckluZm86OmdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GKSBjb25zdCB7CisgIGNvbnN0IEZ1bmN0aW9uKiBGID0gTUYtPmdldEZ1bmN0aW9uKCk7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBDYWxsZWVTYXZlZFJlZ3NbXSA9IHsKKyAgICBNU1A0MzA6OkZQVywgTVNQNDMwOjpSNVcsIE1TUDQzMDo6UjZXLCBNU1A0MzA6OlI3VywKKyAgICBNU1A0MzA6OlI4VywgTVNQNDMwOjpSOVcsIE1TUDQzMDo6UjEwVywgTVNQNDMwOjpSMTFXLAorICAgIDAKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIENhbGxlZVNhdmVkUmVnc0ZQW10gPSB7CisgICAgTVNQNDMwOjpSNVcsIE1TUDQzMDo6UjZXLCBNU1A0MzA6OlI3VywKKyAgICBNU1A0MzA6OlI4VywgTVNQNDMwOjpSOVcsIE1TUDQzMDo6UjEwVywgTVNQNDMwOjpSMTFXLAorICAgIDAKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIENhbGxlZVNhdmVkUmVnc0ludHJbXSA9IHsKKyAgICBNU1A0MzA6OkZQVywgIE1TUDQzMDo6UjVXLCAgTVNQNDMwOjpSNlcsICBNU1A0MzA6OlI3VywKKyAgICBNU1A0MzA6OlI4VywgIE1TUDQzMDo6UjlXLCAgTVNQNDMwOjpSMTBXLCBNU1A0MzA6OlIxMVcsCisgICAgTVNQNDMwOjpSMTJXLCBNU1A0MzA6OlIxM1csIE1TUDQzMDo6UjE0VywgTVNQNDMwOjpSMTVXLAorICAgIDAKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIENhbGxlZVNhdmVkUmVnc0ludHJGUFtdID0geworICAgIE1TUDQzMDo6UjVXLCAgTVNQNDMwOjpSNlcsICBNU1A0MzA6OlI3VywKKyAgICBNU1A0MzA6OlI4VywgIE1TUDQzMDo6UjlXLCAgTVNQNDMwOjpSMTBXLCBNU1A0MzA6OlIxMVcsCisgICAgTVNQNDMwOjpSMTJXLCBNU1A0MzA6OlIxM1csIE1TUDQzMDo6UjE0VywgTVNQNDMwOjpSMTVXLAorICAgIDAKKyAgfTsKKworICBpZiAoaGFzRlAoKk1GKSkKKyAgICByZXR1cm4gKEYtPmdldENhbGxpbmdDb252KCkgPT0gQ2FsbGluZ0NvbnY6Ok1TUDQzMF9JTlRSID8KKyAgICAgICAgICAgIENhbGxlZVNhdmVkUmVnc0ludHJGUCA6IENhbGxlZVNhdmVkUmVnc0ZQKTsKKyAgZWxzZQorICAgIHJldHVybiAoRi0+Z2V0Q2FsbGluZ0NvbnYoKSA9PSBDYWxsaW5nQ29udjo6TVNQNDMwX0lOVFIgPworICAgICAgICAgICAgQ2FsbGVlU2F2ZWRSZWdzSW50ciA6IENhbGxlZVNhdmVkUmVncyk7CisKK30KKworQml0VmVjdG9yIE1TUDQzMFJlZ2lzdGVySW5mbzo6Z2V0UmVzZXJ2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgQml0VmVjdG9yIFJlc2VydmVkKGdldE51bVJlZ3MoKSk7CisKKyAgLy8gTWFyayA0IHNwZWNpYWwgcmVnaXN0ZXJzIGFzIHJlc2VydmVkLgorICBSZXNlcnZlZC5zZXQoTVNQNDMwOjpQQ1cpOworICBSZXNlcnZlZC5zZXQoTVNQNDMwOjpTUFcpOworICBSZXNlcnZlZC5zZXQoTVNQNDMwOjpTUlcpOworICBSZXNlcnZlZC5zZXQoTVNQNDMwOjpDR1cpOworCisgIC8vIE1hcmsgZnJhbWUgcG9pbnRlciBhcyByZXNlcnZlZCBpZiBuZWVkZWQuCisgIGlmIChoYXNGUChNRikpCisgICAgUmVzZXJ2ZWQuc2V0KE1TUDQzMDo6RlBXKTsKKworICByZXR1cm4gUmVzZXJ2ZWQ7Cit9CisKK2NvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgorTVNQNDMwUmVnaXN0ZXJJbmZvOjpnZXRQb2ludGVyUmVnQ2xhc3ModW5zaWduZWQgS2luZCkgY29uc3QgeworICByZXR1cm4gJk1TUDQzMDo6R1IxNlJlZ0NsYXNzOworfQorCisKK2Jvb2wgTVNQNDMwUmVnaXN0ZXJJbmZvOjpoYXNGUChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworCisgIHJldHVybiAoRGlzYWJsZUZyYW1lUG9pbnRlckVsaW0oTUYpIHx8CisgICAgICAgICAgTUYuZ2V0RnJhbWVJbmZvKCktPmhhc1ZhclNpemVkT2JqZWN0cygpIHx8CisgICAgICAgICAgTUZJLT5pc0ZyYW1lQWRkcmVzc1Rha2VuKCkpOworfQorCitib29sIE1TUDQzMFJlZ2lzdGVySW5mbzo6aGFzUmVzZXJ2ZWRDYWxsRnJhbWUoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICByZXR1cm4gIU1GLmdldEZyYW1lSW5mbygpLT5oYXNWYXJTaXplZE9iamVjdHMoKTsKK30KKwordm9pZCBNU1A0MzBSZWdpc3RlckluZm86OgorZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdCB7CisgIGlmICghaGFzUmVzZXJ2ZWRDYWxsRnJhbWUoTUYpKSB7CisgICAgLy8gSWYgdGhlIHN0YWNrIHBvaW50ZXIgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgcHJvbG9ndWUsIHR1cm4gdGhlCisgICAgLy8gYWRqY2FsbHN0YWNrdXAgaW5zdHJ1Y3Rpb24gaW50byBhICdzdWIgU1BXLCA8YW10PicgYW5kIHRoZQorICAgIC8vIGFkamNhbGxzdGFja2Rvd24gaW5zdHJ1Y3Rpb24gaW50byAnYWRkIFNQVywgPGFtdD4nCisgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgcHVzaCAvIHBvcCBpbnN0ZWFkIG9mIHN1YiArIHN0b3JlIC8gYWRkCisgICAgTWFjaGluZUluc3RyICpPbGQgPSBJOworICAgIHVpbnQ2NF90IEFtb3VudCA9IE9sZC0+Z2V0T3BlcmFuZCgwKS5nZXRJbW0oKTsKKyAgICBpZiAoQW1vdW50ICE9IDApIHsKKyAgICAgIC8vIFdlIG5lZWQgdG8ga2VlcCB0aGUgc3RhY2sgYWxpZ25lZCBwcm9wZXJseS4gIFRvIGRvIHRoaXMsIHdlIHJvdW5kIHRoZQorICAgICAgLy8gYW1vdW50IG9mIHNwYWNlIG5lZWRlZCBmb3IgdGhlIG91dGdvaW5nIGFyZ3VtZW50cyB1cCB0byB0aGUgbmV4dAorICAgICAgLy8gYWxpZ25tZW50IGJvdW5kYXJ5LgorICAgICAgQW1vdW50ID0gKEFtb3VudCtTdGFja0FsaWduLTEpL1N0YWNrQWxpZ24qU3RhY2tBbGlnbjsKKworICAgICAgTWFjaGluZUluc3RyICpOZXcgPSAwOworICAgICAgaWYgKE9sZC0+Z2V0T3Bjb2RlKCkgPT0gZ2V0Q2FsbEZyYW1lU2V0dXBPcGNvZGUoKSkgeworICAgICAgICBOZXcgPSBCdWlsZE1JKE1GLCBPbGQtPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgVElJLmdldChNU1A0MzA6OlNVQjE2cmkpLCBNU1A0MzA6OlNQVykKKyAgICAgICAgICAuYWRkUmVnKE1TUDQzMDo6U1BXKS5hZGRJbW0oQW1vdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChPbGQtPmdldE9wY29kZSgpID09IGdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKSk7CisgICAgICAgIC8vIGZhY3RvciBvdXQgdGhlIGFtb3VudCB0aGUgY2FsbGVlIGFscmVhZHkgcG9wcGVkLgorICAgICAgICB1aW50NjRfdCBDYWxsZWVBbXQgPSBPbGQtPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCk7CisgICAgICAgIEFtb3VudCAtPSBDYWxsZWVBbXQ7CisgICAgICAgIGlmIChBbW91bnQpCisgICAgICAgICAgTmV3ID0gQnVpbGRNSShNRiwgT2xkLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgVElJLmdldChNU1A0MzA6OkFERDE2cmkpLCBNU1A0MzA6OlNQVykKKyAgICAgICAgICAgIC5hZGRSZWcoTVNQNDMwOjpTUFcpLmFkZEltbShBbW91bnQpOworICAgICAgfQorCisgICAgICBpZiAoTmV3KSB7CisgICAgICAgIC8vIFRoZSBTUlcgaW1wbGljaXQgZGVmIGlzIGRlYWQuCisgICAgICAgIE5ldy0+Z2V0T3BlcmFuZCgzKS5zZXRJc0RlYWQoKTsKKworICAgICAgICAvLyBSZXBsYWNlIHRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gd2l0aCBhIG5ldyBpbnN0cnVjdGlvbi4uLgorICAgICAgICBNQkIuaW5zZXJ0KEksIE5ldyk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKEktPmdldE9wY29kZSgpID09IGdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKSkgeworICAgIC8vIElmIHdlIGFyZSBwZXJmb3JtaW5nIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24gYW5kIGlmIHRoZSBjYWxsZWUgcG9wcworICAgIC8vIHNvbWV0aGluZyBvZmYgdGhlIHN0YWNrIHBvaW50ZXIsIGFkZCBpdCBiYWNrLgorICAgIGlmICh1aW50NjRfdCBDYWxsZWVBbXQgPSBJLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKk9sZCA9IEk7CisgICAgICBNYWNoaW5lSW5zdHIgKk5ldyA9CisgICAgICAgIEJ1aWxkTUkoTUYsIE9sZC0+Z2V0RGVidWdMb2MoKSwgVElJLmdldChNU1A0MzA6OlNVQjE2cmkpLAorICAgICAgICAgICAgICAgIE1TUDQzMDo6U1BXKS5hZGRSZWcoTVNQNDMwOjpTUFcpLmFkZEltbShDYWxsZWVBbXQpOworICAgICAgLy8gVGhlIFNSVyBpbXBsaWNpdCBkZWYgaXMgZGVhZC4KKyAgICAgIE5ldy0+Z2V0T3BlcmFuZCgzKS5zZXRJc0RlYWQoKTsKKworICAgICAgTUJCLmluc2VydChJLCBOZXcpOworICAgIH0KKyAgfQorCisgIE1CQi5lcmFzZShJKTsKK30KKwordW5zaWduZWQKK01TUDQzMFJlZ2lzdGVySW5mbzo6ZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMpIGNvbnN0IHsKKyAgYXNzZXJ0KFNQQWRqID09IDAgJiYgIlVuZXhwZWN0ZWQiKTsKKworICB1bnNpZ25lZCBpID0gMDsKKyAgTWFjaGluZUluc3RyICZNSSA9ICpJSTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9ICpNSS5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgIERlYnVnTG9jIGRsID0gTUkuZ2V0RGVidWdMb2MoKTsKKyAgd2hpbGUgKCFNSS5nZXRPcGVyYW5kKGkpLmlzRkkoKSkgeworICAgICsraTsKKyAgICBhc3NlcnQoaSA8IE1JLmdldE51bU9wZXJhbmRzKCkgJiYgIkluc3RyIGRvZXNuJ3QgaGF2ZSBGcmFtZUluZGV4IG9wZXJhbmQhIik7CisgIH0KKworICBpbnQgRnJhbWVJbmRleCA9IE1JLmdldE9wZXJhbmQoaSkuZ2V0SW5kZXgoKTsKKworICB1bnNpZ25lZCBCYXNlUHRyID0gKGhhc0ZQKE1GKSA/IE1TUDQzMDo6RlBXIDogTVNQNDMwOjpTUFcpOworICBpbnQgT2Zmc2V0ID0gTUYuZ2V0RnJhbWVJbmZvKCktPmdldE9iamVjdE9mZnNldChGcmFtZUluZGV4KTsKKworICAvLyBTa2lwIHRoZSBzYXZlZCBQQworICBPZmZzZXQgKz0gMjsKKworICBpZiAoIWhhc0ZQKE1GKSkKKyAgICBPZmZzZXQgKz0gTUYuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrU2l6ZSgpOworICBlbHNlCisgICAgT2Zmc2V0ICs9IDI7IC8vIFNraXAgdGhlIHNhdmVkIEZQVworCisgIC8vIEZvbGQgaW1tIGludG8gb2Zmc2V0CisgIE9mZnNldCArPSBNSS5nZXRPcGVyYW5kKGkrMSkuZ2V0SW1tKCk7CisKKyAgaWYgKE1JLmdldE9wY29kZSgpID09IE1TUDQzMDo6QUREMTZyaSkgeworICAgIC8vIFRoaXMgaXMgYWN0dWFsbHkgImxvYWQgZWZmZWN0aXZlIGFkZHJlc3MiIG9mIHRoZSBzdGFjayBzbG90CisgICAgLy8gaW5zdHJ1Y3Rpb24uIFdlIGhhdmUgb25seSB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbnMsIHRodXMgd2UgbmVlZCB0bworICAgIC8vIGV4cGFuZCBpdCBpbnRvIG1vdiArIGFkZAorCisgICAgTUkuc2V0RGVzYyhUSUkuZ2V0KE1TUDQzMDo6TU9WMTZycikpOworICAgIE1JLmdldE9wZXJhbmQoaSkuQ2hhbmdlVG9SZWdpc3RlcihCYXNlUHRyLCBmYWxzZSk7CisKKyAgICBpZiAoT2Zmc2V0ID09IDApCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIFdlIG5lZWQgdG8gbWF0ZXJpYWxpemUgdGhlIG9mZnNldCB2aWEgYWRkIGluc3RydWN0aW9uLgorICAgIHVuc2lnbmVkIERzdFJlZyA9IE1JLmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgaWYgKE9mZnNldCA8IDApCisgICAgICBCdWlsZE1JKE1CQiwgbGx2bTo6bmV4dChJSSksIGRsLCBUSUkuZ2V0KE1TUDQzMDo6U1VCMTZyaSksIERzdFJlZykKKyAgICAgICAgLmFkZFJlZyhEc3RSZWcpLmFkZEltbSgtT2Zmc2V0KTsKKyAgICBlbHNlCisgICAgICBCdWlsZE1JKE1CQiwgbGx2bTo6bmV4dChJSSksIGRsLCBUSUkuZ2V0KE1TUDQzMDo6QUREMTZyaSksIERzdFJlZykKKyAgICAgICAgLmFkZFJlZyhEc3RSZWcpLmFkZEltbShPZmZzZXQpOworCisgICAgcmV0dXJuIDA7CisgIH0KKworICBNSS5nZXRPcGVyYW5kKGkpLkNoYW5nZVRvUmVnaXN0ZXIoQmFzZVB0ciwgZmFsc2UpOworICBNSS5nZXRPcGVyYW5kKGkrMSkuQ2hhbmdlVG9JbW1lZGlhdGUoT2Zmc2V0KTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK01TUDQzMFJlZ2lzdGVySW5mbzo6cHJvY2Vzc0Z1bmN0aW9uQmVmb3JlRnJhbWVGaW5hbGl6ZWQoTWFjaGluZUZ1bmN0aW9uICZNRikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CisgIC8vIENyZWF0ZSBhIGZyYW1lIGVudHJ5IGZvciB0aGUgRlBXIHJlZ2lzdGVyIHRoYXQgbXVzdCBiZSBzYXZlZC4KKyAgaWYgKGhhc0ZQKE1GKSkgeworICAgIGludCBGcmFtZUlkeCA9IE1GLmdldEZyYW1lSW5mbygpLT5DcmVhdGVGaXhlZE9iamVjdCgyLCAtNCwgdHJ1ZSk7CisgICAgKHZvaWQpRnJhbWVJZHg7CisgICAgYXNzZXJ0KEZyYW1lSWR4ID09IE1GLmdldEZyYW1lSW5mbygpLT5nZXRPYmplY3RJbmRleEJlZ2luKCkgJiYKKyAgICAgICAgICAgIlNsb3QgZm9yIEZQVyByZWdpc3RlciBtdXN0IGJlIGxhc3QgaW4gb3JkZXIgdG8gYmUgZm91bmQhIik7CisgIH0KK30KKworCit2b2lkIE1TUDQzMFJlZ2lzdGVySW5mbzo6ZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9IE1GLmZyb250KCk7ICAgLy8gUHJvbG9nIGdvZXMgaW4gZW50cnkgQkIKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1TUDQzME1hY2hpbmVGdW5jdGlvbkluZm8gKk1TUDQzMEZJID0gTUYuZ2V0SW5mbzxNU1A0MzBNYWNoaW5lRnVuY3Rpb25JbmZvPigpOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IE1CQi5iZWdpbigpOworICBEZWJ1Z0xvYyBETCA9IE1CQkkgIT0gTUJCLmVuZCgpID8gTUJCSS0+Z2V0RGVidWdMb2MoKSA6IERlYnVnTG9jKCk7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgRnJhbWVJbmZvLgorICB1aW50NjRfdCBTdGFja1NpemUgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworCisgIHVpbnQ2NF90IE51bUJ5dGVzID0gMDsKKyAgaWYgKGhhc0ZQKE1GKSkgeworICAgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBzdGFjayBhZGp1c3RtZW50CisgICAgdWludDY0X3QgRnJhbWVTaXplID0gU3RhY2tTaXplIC0gMjsKKyAgICBOdW1CeXRlcyA9IEZyYW1lU2l6ZSAtIE1TUDQzMEZJLT5nZXRDYWxsZWVTYXZlZEZyYW1lU2l6ZSgpOworCisgICAgLy8gR2V0IHRoZSBvZmZzZXQgb2YgdGhlIHN0YWNrIHNsb3QgZm9yIHRoZSBFQlAgcmVnaXN0ZXIuLi4gd2hpY2ggaXMKKyAgICAvLyBndWFyYW50ZWVkIHRvIGJlIHRoZSBsYXN0IHNsb3QgYnkgcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlRnJhbWVGaW5hbGl6ZWQuCisgICAgLy8gVXBkYXRlIHRoZSBmcmFtZSBvZmZzZXQgYWRqdXN0bWVudC4KKyAgICBNRkktPnNldE9mZnNldEFkanVzdG1lbnQoLU51bUJ5dGVzKTsKKworICAgIC8vIFNhdmUgRlBXIGludG8gdGhlIGFwcHJvcHJpYXRlIHN0YWNrIHNsb3QuLi4KKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsIFRJSS5nZXQoTVNQNDMwOjpQVVNIMTZyKSkKKyAgICAgIC5hZGRSZWcoTVNQNDMwOjpGUFcsIFJlZ1N0YXRlOjpLaWxsKTsKKworICAgIC8vIFVwZGF0ZSBGUFcgd2l0aCB0aGUgbmV3IGJhc2UgdmFsdWUuLi4KKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsIFRJSS5nZXQoTVNQNDMwOjpNT1YxNnJyKSwgTVNQNDMwOjpGUFcpCisgICAgICAuYWRkUmVnKE1TUDQzMDo6U1BXKTsKKworICAgIC8vIE1hcmsgdGhlIEZyYW1lUHRyIGFzIGxpdmUtaW4gaW4gZXZlcnkgYmxvY2sgZXhjZXB0IHRoZSBlbnRyeS4KKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IGxsdm06Om5leHQoTUYuYmVnaW4oKSksIEUgPSBNRi5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgSS0+YWRkTGl2ZUluKE1TUDQzMDo6RlBXKTsKKworICB9IGVsc2UKKyAgICBOdW1CeXRlcyA9IFN0YWNrU2l6ZSAtIE1TUDQzMEZJLT5nZXRDYWxsZWVTYXZlZEZyYW1lU2l6ZSgpOworCisgIC8vIFNraXAgdGhlIGNhbGxlZS1zYXZlZCBwdXNoIGluc3RydWN0aW9ucy4KKyAgd2hpbGUgKE1CQkkgIT0gTUJCLmVuZCgpICYmIChNQkJJLT5nZXRPcGNvZGUoKSA9PSBNU1A0MzA6OlBVU0gxNnIpKQorICAgICsrTUJCSTsKKworICBpZiAoTUJCSSAhPSBNQkIuZW5kKCkpCisgICAgREwgPSBNQkJJLT5nZXREZWJ1Z0xvYygpOworCisgIGlmIChOdW1CeXRlcykgeyAvLyBhZGp1c3Qgc3RhY2sgcG9pbnRlcjogU1BXIC09IG51bWJ5dGVzCisgICAgLy8gSWYgdGhlcmUgaXMgYW4gU1VCMTZyaSBvZiBTUFcgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgaW5zdHJ1Y3Rpb24sIG1lcmdlCisgICAgLy8gdGhlIHR3by4KKyAgICAvL051bUJ5dGVzIC09IG1lcmdlU1BVcGRhdGVzKE1CQiwgTUJCSSwgdHJ1ZSk7CisgICAgLy8gSWYgdGhlcmUgaXMgYW4gQUREMTZyaSBvciBTVUIxNnJpIG9mIFNQVyBpbW1lZGlhdGVseSBhZnRlciB0aGlzCisgICAgLy8gaW5zdHJ1Y3Rpb24sIG1lcmdlIHRoZSB0d28gaW5zdHJ1Y3Rpb25zLgorICAgIC8vIG1lcmdlU1BVcGRhdGVzRG93bihNQkIsIE1CQkksICZOdW1CeXRlcyk7CisKKyAgICBpZiAoTnVtQnl0ZXMpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqTUkgPQorICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsIFRJSS5nZXQoTVNQNDMwOjpTVUIxNnJpKSwgTVNQNDMwOjpTUFcpCisgICAgICAgIC5hZGRSZWcoTVNQNDMwOjpTUFcpLmFkZEltbShOdW1CeXRlcyk7CisgICAgICAvLyBUaGUgU1JXIGltcGxpY2l0IGRlZiBpcyBkZWFkLgorICAgICAgTUktPmdldE9wZXJhbmQoMykuc2V0SXNEZWFkKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgTVNQNDMwUmVnaXN0ZXJJbmZvOjplbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTVNQNDMwTWFjaGluZUZ1bmN0aW9uSW5mbyAqTVNQNDMwRkkgPSBNRi5nZXRJbmZvPE1TUDQzME1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gcHJpb3IoTUJCLmVuZCgpKTsKKyAgdW5zaWduZWQgUmV0T3Bjb2RlID0gTUJCSS0+Z2V0T3Bjb2RlKCk7CisgIERlYnVnTG9jIERMID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKworICBzd2l0Y2ggKFJldE9wY29kZSkgeworICBjYXNlIE1TUDQzMDo6UkVUOgorICBjYXNlIE1TUDQzMDo6UkVUSTogYnJlYWs7ICAvLyBUaGVzZSBhcmUgb2sKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDYW4gb25seSBpbnNlcnQgZXBpbG9nIGludG8gcmV0dXJuaW5nIGJsb2NrcyIpOworICB9CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgRnJhbWVJbmZvCisgIHVpbnQ2NF90IFN0YWNrU2l6ZSA9IE1GSS0+Z2V0U3RhY2tTaXplKCk7CisgIHVuc2lnbmVkIENTU2l6ZSA9IE1TUDQzMEZJLT5nZXRDYWxsZWVTYXZlZEZyYW1lU2l6ZSgpOworICB1aW50NjRfdCBOdW1CeXRlcyA9IDA7CisKKyAgaWYgKGhhc0ZQKE1GKSkgeworICAgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBzdGFjayBhZGp1c3RtZW50CisgICAgdWludDY0X3QgRnJhbWVTaXplID0gU3RhY2tTaXplIC0gMjsKKyAgICBOdW1CeXRlcyA9IEZyYW1lU2l6ZSAtIENTU2l6ZTsKKworICAgIC8vIHBvcCBGUFcuCisgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KE1TUDQzMDo6UE9QMTZyKSwgTVNQNDMwOjpGUFcpOworICB9IGVsc2UKKyAgICBOdW1CeXRlcyA9IFN0YWNrU2l6ZSAtIENTU2l6ZTsKKworICAvLyBTa2lwIHRoZSBjYWxsZWUtc2F2ZWQgcG9wIGluc3RydWN0aW9ucy4KKyAgd2hpbGUgKE1CQkkgIT0gTUJCLmJlZ2luKCkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUEkgPSBwcmlvcihNQkJJKTsKKyAgICB1bnNpZ25lZCBPcGMgPSBQSS0+Z2V0T3Bjb2RlKCk7CisgICAgaWYgKE9wYyAhPSBNU1A0MzA6OlBPUDE2ciAmJiAhUEktPmdldERlc2MoKS5pc1Rlcm1pbmF0b3IoKSkKKyAgICAgIGJyZWFrOworICAgIC0tTUJCSTsKKyAgfQorCisgIERMID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBJZiB0aGVyZSBpcyBhbiBBREQxNnJpIG9yIFNVQjE2cmkgb2YgU1BXIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzCisgIC8vIGluc3RydWN0aW9uLCBtZXJnZSB0aGUgdHdvIGluc3RydWN0aW9ucy4KKyAgLy9pZiAoTnVtQnl0ZXMgfHwgTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKSkKKyAgLy8gIG1lcmdlU1BVcGRhdGVzVXAoTUJCLCBNQkJJLCBTdGFja1B0ciwgJk51bUJ5dGVzKTsKKworICBpZiAoTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKSkgeworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwKKyAgICAgICAgICAgIFRJSS5nZXQoTVNQNDMwOjpNT1YxNnJyKSwgTVNQNDMwOjpTUFcpLmFkZFJlZyhNU1A0MzA6OkZQVyk7CisgICAgaWYgKENTU2l6ZSkgeworICAgICAgTWFjaGluZUluc3RyICpNSSA9CisgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwKKyAgICAgICAgICAgICAgICBUSUkuZ2V0KE1TUDQzMDo6U1VCMTZyaSksIE1TUDQzMDo6U1BXKQorICAgICAgICAuYWRkUmVnKE1TUDQzMDo6U1BXKS5hZGRJbW0oQ1NTaXplKTsKKyAgICAgIC8vIFRoZSBTUlcgaW1wbGljaXQgZGVmIGlzIGRlYWQuCisgICAgICBNSS0+Z2V0T3BlcmFuZCgzKS5zZXRJc0RlYWQoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gYWRqdXN0IHN0YWNrIHBvaW50ZXIgYmFjazogU1BXICs9IG51bWJ5dGVzCisgICAgaWYgKE51bUJ5dGVzKSB7CisgICAgICBNYWNoaW5lSW5zdHIgKk1JID0KKyAgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KE1TUDQzMDo6QUREMTZyaSksIE1TUDQzMDo6U1BXKQorICAgICAgICAuYWRkUmVnKE1TUDQzMDo6U1BXKS5hZGRJbW0oTnVtQnl0ZXMpOworICAgICAgLy8gVGhlIFNSVyBpbXBsaWNpdCBkZWYgaXMgZGVhZC4KKyAgICAgIE1JLT5nZXRPcGVyYW5kKDMpLnNldElzRGVhZCgpOworICAgIH0KKyAgfQorfQorCit1bnNpZ25lZCBNU1A0MzBSZWdpc3RlckluZm86OmdldFJBUmVnaXN0ZXIoKSBjb25zdCB7CisgIHJldHVybiBNU1A0MzA6OlBDVzsKK30KKwordW5zaWduZWQgTVNQNDMwUmVnaXN0ZXJJbmZvOjpnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgcmV0dXJuIGhhc0ZQKE1GKSA/IE1TUDQzMDo6RlBXIDogTVNQNDMwOjpTUFc7Cit9CisKK2ludCBNU1A0MzBSZWdpc3RlckluZm86OmdldER3YXJmUmVnTnVtKHVuc2lnbmVkIFJlZ051bSwgYm9vbCBpc0VIKSBjb25zdCB7CisgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7CisgIHJldHVybiAwOworfQorCisjaW5jbHVkZSAiTVNQNDMwR2VuUmVnaXN0ZXJJbmZvLmluYyIKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMFJlZ2lzdGVySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwUmVnaXN0ZXJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4ZmUxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMFJlZ2lzdGVySW5mby5oCkBAIC0wLDAgKzEsNjggQEAKKy8vPT09LSBNU1A0MzBSZWdpc3RlckluZm8uaCAtIE1TUDQzMCBSZWdpc3RlciBJbmZvcm1hdGlvbiBJbXBsIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBNU1A0MzAgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1SZWdpc3RlckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9NU1A0MzBSRUdJU1RFUklORk9fSAorI2RlZmluZSBMTFZNX1RBUkdFVF9NU1A0MzBSRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAiTVNQNDMwR2VuUmVnaXN0ZXJJbmZvLmguaW5jIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIE1TUDQzMFRhcmdldE1hY2hpbmU7CisKK3N0cnVjdCBNU1A0MzBSZWdpc3RlckluZm8gOiBwdWJsaWMgTVNQNDMwR2VuUmVnaXN0ZXJJbmZvIHsKK3ByaXZhdGU6CisgIE1TUDQzMFRhcmdldE1hY2hpbmUgJlRNOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSTsKKworICAvLy8gU3RhY2tBbGlnbiAtIERlZmF1bHQgc3RhY2sgYWxpZ25tZW50LgorICAvLy8KKyAgdW5zaWduZWQgU3RhY2tBbGlnbjsKK3B1YmxpYzoKKyAgTVNQNDMwUmVnaXN0ZXJJbmZvKE1TUDQzMFRhcmdldE1hY2hpbmUgJnRtLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gJnRpaSk7CisKKyAgLy8vIENvZGUgR2VuZXJhdGlvbiB2aXJ0dWFsIG1ldGhvZHMuLi4KKyAgY29uc3QgdW5zaWduZWQgKmdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gMCkgY29uc3Q7CisKKyAgQml0VmVjdG9yIGdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogZ2V0UG9pbnRlclJlZ0NsYXNzKHVuc2lnbmVkIEtpbmQgPSAwKSBjb25zdDsKKworICBib29sIGhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICBib29sIGhhc1Jlc2VydmVkQ2FsbEZyYW1lKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIHZvaWQgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdDsKKworICB1bnNpZ25lZCBlbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGosIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMgPSBOVUxMKSBjb25zdDsKKworICB2b2lkIGVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgdm9pZCBlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisKKyAgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZChNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLyBEZWJ1ZyBpbmZvcm1hdGlvbiBxdWVyaWVzLgorICB1bnNpZ25lZCBnZXRSQVJlZ2lzdGVyKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8hIEdldCBEV0FSRiBkZWJ1Z2dpbmcgcmVnaXN0ZXIgbnVtYmVyCisgIGludCBnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UQVJHRVRfTVNQNDMwUkVHSVNURVJJTkZPX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMFJlZ2lzdGVySW5mby50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMFJlZ2lzdGVySW5mby50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGFlYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwUmVnaXN0ZXJJbmZvLnRkCkBAIC0wLDAgKzEsMTE5IEBACisvLz09PS0gTVNQNDMwUmVnaXN0ZXJJbmZvLnRkIC0gTVNQNDMwIFJlZ2lzdGVyIGRlZnMgLS0tLS0tLS0tLSotIHRibGdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBEZWNsYXJhdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgTVNQNDMwIHJlZ2lzdGVyIGZpbGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIE1TUDQzMFJlZzxiaXRzPDQ+IG51bSwgc3RyaW5nIG4+IDogUmVnaXN0ZXI8bj4geworICBmaWVsZCBiaXRzPDQ+IE51bSA9IG51bTsKKyAgbGV0IE5hbWVzcGFjZSA9ICJNU1A0MzAiOworfQorCitjbGFzcyBNU1A0MzBSZWdXaXRoU3VicmVnczxiaXRzPDQ+IG51bSwgc3RyaW5nIG4sIGxpc3Q8UmVnaXN0ZXI+IHN1YnJlZ3M+IAorICA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8biwgc3VicmVncz4geworICBmaWVsZCBiaXRzPDQ+IE51bSA9IG51bTsKKyAgbGV0IE5hbWVzcGFjZSA9ICJNU1A0MzAiOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFJlZ2lzdGVycworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIFBDQiAgOiBNU1A0MzBSZWc8MCwgICJyMCI+OworZGVmIFNQQiAgOiBNU1A0MzBSZWc8MSwgICJyMSI+OworZGVmIFNSQiAgOiBNU1A0MzBSZWc8MiwgICJyMiI+OworZGVmIENHQiAgOiBNU1A0MzBSZWc8MywgICJyMyI+OworZGVmIEZQQiAgOiBNU1A0MzBSZWc8NCwgICJyNCI+OworZGVmIFI1QiAgOiBNU1A0MzBSZWc8NSwgICJyNSI+OworZGVmIFI2QiAgOiBNU1A0MzBSZWc8NiwgICJyNiI+OworZGVmIFI3QiAgOiBNU1A0MzBSZWc8NywgICJyNyI+OworZGVmIFI4QiAgOiBNU1A0MzBSZWc8OCwgICJyOCI+OworZGVmIFI5QiAgOiBNU1A0MzBSZWc8OSwgICJyOSI+OworZGVmIFIxMEIgOiBNU1A0MzBSZWc8MTAsICJyMTAiPjsKK2RlZiBSMTFCIDogTVNQNDMwUmVnPDExLCAicjExIj47CitkZWYgUjEyQiA6IE1TUDQzMFJlZzwxMiwgInIxMiI+OworZGVmIFIxM0IgOiBNU1A0MzBSZWc8MTMsICJyMTMiPjsKK2RlZiBSMTRCIDogTVNQNDMwUmVnPDE0LCAicjE0Ij47CitkZWYgUjE1QiA6IE1TUDQzMFJlZzwxNSwgInIxNSI+OworCitkZWYgc3VicmVnXzhiaXQgOiBTdWJSZWdJbmRleCB7IGxldCBOYW1lc3BhY2UgPSAiTVNQNDMwIjsgfQorCitsZXQgU3ViUmVnSW5kaWNlcyA9IFtzdWJyZWdfOGJpdF0gaW4geworZGVmIFBDVyAgOiBNU1A0MzBSZWdXaXRoU3VicmVnczwwLCAgInIwIiwgIFtQQ0JdPjsKK2RlZiBTUFcgIDogTVNQNDMwUmVnV2l0aFN1YnJlZ3M8MSwgICJyMSIsICBbU1BCXT47CitkZWYgU1JXICA6IE1TUDQzMFJlZ1dpdGhTdWJyZWdzPDIsICAicjIiLCAgW1NSQl0+OworZGVmIENHVyAgOiBNU1A0MzBSZWdXaXRoU3VicmVnczwzLCAgInIzIiwgIFtDR0JdPjsKK2RlZiBGUFcgIDogTVNQNDMwUmVnV2l0aFN1YnJlZ3M8NCwgICJyNCIsICBbRlBCXT47CitkZWYgUjVXICA6IE1TUDQzMFJlZ1dpdGhTdWJyZWdzPDUsICAicjUiLCAgW1I1Ql0+OworZGVmIFI2VyAgOiBNU1A0MzBSZWdXaXRoU3VicmVnczw2LCAgInI2IiwgIFtSNkJdPjsKK2RlZiBSN1cgIDogTVNQNDMwUmVnV2l0aFN1YnJlZ3M8NywgICJyNyIsICBbUjdCXT47CitkZWYgUjhXICA6IE1TUDQzMFJlZ1dpdGhTdWJyZWdzPDgsICAicjgiLCAgW1I4Ql0+OworZGVmIFI5VyAgOiBNU1A0MzBSZWdXaXRoU3VicmVnczw5LCAgInI5IiwgIFtSOUJdPjsKK2RlZiBSMTBXIDogTVNQNDMwUmVnV2l0aFN1YnJlZ3M8MTAsICJyMTAiLCBbUjEwQl0+OworZGVmIFIxMVcgOiBNU1A0MzBSZWdXaXRoU3VicmVnczwxMSwgInIxMSIsIFtSMTFCXT47CitkZWYgUjEyVyA6IE1TUDQzMFJlZ1dpdGhTdWJyZWdzPDEyLCAicjEyIiwgW1IxMkJdPjsKK2RlZiBSMTNXIDogTVNQNDMwUmVnV2l0aFN1YnJlZ3M8MTMsICJyMTMiLCBbUjEzQl0+OworZGVmIFIxNFcgOiBNU1A0MzBSZWdXaXRoU3VicmVnczwxNCwgInIxNCIsIFtSMTRCXT47CitkZWYgUjE1VyA6IE1TUDQzMFJlZ1dpdGhTdWJyZWdzPDE1LCAicjE1IiwgW1IxNUJdPjsKK30KKworZGVmIEdSOCA6IFJlZ2lzdGVyQ2xhc3M8Ik1TUDQzMCIsIFtpOF0sIDgsCisgICAvLyBWb2xhdGlsZSByZWdpc3RlcnMKKyAgW1IxMkIsIFIxM0IsIFIxNEIsIFIxNUIsIFIxMUIsIFIxMEIsIFI5QiwgUjhCLCBSN0IsIFI2QiwgUjVCLAorICAgLy8gRnJhbWUgcG9pbnRlciwgc29tZXRpbWVzIGFsbG9jYWJsZQorICAgRlBCLAorICAgLy8gVm9sYXRpbGUsIGJ1dCBub3QgYWxsb2NhYmxlCisgICBQQ0IsIFNQQiwgU1JCLCBDR0JdPgoreworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIEdSOENsYXNzOjppdGVyYXRvcgorICAgIEdSOENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICAgICAgLy8gRGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIHVzZXMgZnJhbWUgcG9pbnRlciBvciBub3QsIGxhc3QgNSBvciA0CisgICAgICAvLyByZWdpc3RlcnMgb24gdGhlIGxpc3QgYWJvdmUgYXJlIHJlc2VydmVkCisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSkKKyAgICAgICAgcmV0dXJuIGVuZCgpLTU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBlbmQoKS00OworICAgIH0KKyAgfV07Cit9CisKK2RlZiBHUjE2IDogUmVnaXN0ZXJDbGFzczwiTVNQNDMwIiwgW2kxNl0sIDE2LAorICAgLy8gVm9sYXRpbGUgcmVnaXN0ZXJzCisgIFtSMTJXLCBSMTNXLCBSMTRXLCBSMTVXLCBSMTFXLCBSMTBXLCBSOVcsIFI4VywgUjdXLCBSNlcsIFI1VywKKyAgIC8vIEZyYW1lIHBvaW50ZXIsIHNvbWV0aW1lcyBhbGxvY2FibGUKKyAgIEZQVywKKyAgIC8vIFZvbGF0aWxlLCBidXQgbm90IGFsbG9jYWJsZQorICAgUENXLCBTUFcsIFNSVywgQ0dXXT4KK3sKKyAgbGV0IFN1YlJlZ0NsYXNzZXMgPSBbKEdSOCBzdWJyZWdfOGJpdCldOworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIEdSMTZDbGFzczo6aXRlcmF0b3IKKyAgICBHUjE2Q2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgICAvLyBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZnVuY3Rpb24gdXNlcyBmcmFtZSBwb2ludGVyIG9yIG5vdCwgbGFzdCA1IG9yIDQKKyAgICAgIC8vIHJlZ2lzdGVycyBvbiB0aGUgbGlzdCBhYm92ZSBhcmUgcmVzZXJ2ZWQKKyAgICAgIGlmIChSSS0+aGFzRlAoTUYpKQorICAgICAgICByZXR1cm4gZW5kKCktNTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVuZCgpLTQ7CisgICAgfQorICB9XTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwU2VsZWN0aW9uREFHSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBTZWxlY3Rpb25EQUdJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGY0NWZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwU2VsZWN0aW9uREFHSW5mby5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy89PT0tLSBNU1A0MzBTZWxlY3Rpb25EQUdJbmZvLmNwcCAtIE1TUDQzMCBTZWxlY3Rpb25EQUcgSW5mbyAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTVNQNDMwU2VsZWN0aW9uREFHSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgIm1zcDQzMC1zZWxlY3Rpb25kYWctaW5mbyIKKyNpbmNsdWRlICJNU1A0MzBUYXJnZXRNYWNoaW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworTVNQNDMwU2VsZWN0aW9uREFHSW5mbzo6TVNQNDMwU2VsZWN0aW9uREFHSW5mbyhjb25zdCBNU1A0MzBUYXJnZXRNYWNoaW5lICZUTSkKKyAgOiBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvKFRNKSB7Cit9CisKK01TUDQzMFNlbGVjdGlvbkRBR0luZm86On5NU1A0MzBTZWxlY3Rpb25EQUdJbmZvKCkgeworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwU2VsZWN0aW9uREFHSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwU2VsZWN0aW9uREFHSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODE5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBTZWxlY3Rpb25EQUdJbmZvLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tLSBNU1A0MzBTZWxlY3Rpb25EQUdJbmZvLmggLSBNU1A0MzAgU2VsZWN0aW9uREFHIEluZm8gLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTVNQNDMwIHN1YmNsYXNzIGZvciBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTVNQNDMwU0VMRUNUSU9OREFHSU5GT19ICisjZGVmaW5lIE1TUDQzMFNFTEVDVElPTkRBR0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1TUDQzMFRhcmdldE1hY2hpbmU7CisKK2NsYXNzIE1TUDQzMFNlbGVjdGlvbkRBR0luZm8gOiBwdWJsaWMgVGFyZ2V0U2VsZWN0aW9uREFHSW5mbyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE1TUDQzMFNlbGVjdGlvbkRBR0luZm8oY29uc3QgTVNQNDMwVGFyZ2V0TWFjaGluZSAmVE0pOworICB+TVNQNDMwU2VsZWN0aW9uREFHSW5mbygpOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMFN1YnRhcmdldC5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBTdWJ0YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDZjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBTdWJ0YXJnZXQuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vPT09LSBNU1A0MzBTdWJ0YXJnZXQuY3BwIC0gTVNQNDMwIFN1YnRhcmdldCBJbmZvcm1hdGlvbiAtLS0tLS0tLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIE1TUDQzMCBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1TUDQzMFN1YnRhcmdldC5oIgorI2luY2x1ZGUgIk1TUDQzMC5oIgorI2luY2x1ZGUgIk1TUDQzMEdlblN1YnRhcmdldC5pbmMiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNU1A0MzBTdWJ0YXJnZXQ6Ok1TUDQzMFN1YnRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVFQsIGNvbnN0IHN0ZDo6c3RyaW5nICZGUykgeworICBzdGQ6OnN0cmluZyBDUFUgPSAiZ2VuZXJpYyI7CisKKyAgLy8gUGFyc2UgZmVhdHVyZXMgc3RyaW5nLgorICBQYXJzZVN1YnRhcmdldEZlYXR1cmVzKEZTLCBDUFUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwU3VidGFyZ2V0LmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBTdWJ0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDcwNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwU3VidGFyZ2V0LmgKQEAgLTAsMCArMSwzOCBAQAorLy89PT09LS0gTVNQNDMwU3VidGFyZ2V0LmggLSBEZWZpbmUgU3VidGFyZ2V0IGZvciB0aGUgTVNQNDMwIC0tLSotIEMrKyAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1TUDQzMCBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9NU1A0MzBfU1VCVEFSR0VUX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfTVNQNDMwX1NVQlRBUkdFVF9ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNU1A0MzBTdWJ0YXJnZXQgOiBwdWJsaWMgVGFyZ2V0U3VidGFyZ2V0IHsKKyAgYm9vbCBFeHRlbmRlZEluc3RzOworcHVibGljOgorICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgZGF0YSBtZW1iZXJzIHRvIG1hdGNoIHRoYXQKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgdHJpcGxlLgorICAvLy8KKyAgTVNQNDMwU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKKworICAvLy8gUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyAtIFBhcnNlcyBmZWF0dXJlcyBzdHJpbmcgc2V0dGluZyBzcGVjaWZpZWQKKyAgLy8vIHN1YnRhcmdldCBvcHRpb25zLiAgRGVmaW5pdGlvbiBvZiBmdW5jdGlvbiBpcyBhdXRvIGdlbmVyYXRlZCBieSB0YmxnZW4uCisgIHN0ZDo6c3RyaW5nIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcgJkZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZDUFUpOworfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAgLy8gTExWTV9UQVJHRVRfTVNQNDMwX1NVQlRBUkdFVF9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBUYXJnZXRNYWNoaW5lLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01TUDQzMFRhcmdldE1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ODc3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBUYXJnZXRNYWNoaW5lLmNwcApAQCAtMCwwICsxLDUyIEBACisvLz09PS0tIE1TUDQzMFRhcmdldE1hY2hpbmUuY3BwIC0gRGVmaW5lIFRhcmdldE1hY2hpbmUgZm9yIE1TUDQzMCAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRvcC1sZXZlbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE1TUDQzMCB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1TUDQzMC5oIgorI2luY2x1ZGUgIk1TUDQzME1DQXNtSW5mby5oIgorI2luY2x1ZGUgIk1TUDQzMFRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVNU1A0MzBUYXJnZXQoKSB7CisgIC8vIFJlZ2lzdGVyIHRoZSB0YXJnZXQuCisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxNU1A0MzBUYXJnZXRNYWNoaW5lPiBYKFRoZU1TUDQzMFRhcmdldCk7CisgIFJlZ2lzdGVyQXNtSW5mbzxNU1A0MzBNQ0FzbUluZm8+IFooVGhlTVNQNDMwVGFyZ2V0KTsKK30KKworTVNQNDMwVGFyZ2V0TWFjaGluZTo6TVNQNDMwVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKSA6CisgIExMVk1UYXJnZXRNYWNoaW5lKFQsIFRUKSwKKyAgU3VidGFyZ2V0KFRULCBGUyksCisgIC8vIEZJWE1FOiBDaGVjayBUYXJnZXREYXRhIHN0cmluZy4KKyAgRGF0YUxheW91dCgiZS1wOjE2OjE2OjE2LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjE2OjMyLW44OjE2IiksCisgIEluc3RySW5mbygqdGhpcyksIFRMSW5mbygqdGhpcyksIFRTSW5mbygqdGhpcyksCisgIEZyYW1lSW5mbyhUYXJnZXRGcmFtZUluZm86OlN0YWNrR3Jvd3NEb3duLCAyLCAtMikgeyB9CisKKworYm9vbCBNU1A0MzBUYXJnZXRNYWNoaW5lOjphZGRJbnN0U2VsZWN0b3IoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIC8vIEluc3RhbGwgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuCisgIFBNLmFkZChjcmVhdGVNU1A0MzBJU2VsRGFnKCp0aGlzLCBPcHRMZXZlbCkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTVNQNDMwVGFyZ2V0TWFjaGluZTo6YWRkUHJlRW1pdFBhc3MoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgLy8gTXVzdCBydW4gYnJhbmNoIHNlbGVjdGlvbiBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGFzbSBwcmludGVyLgorICBQTS5hZGQoY3JlYXRlTVNQNDMwQnJhbmNoU2VsZWN0aW9uUGFzcygpKTsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwVGFyZ2V0TWFjaGluZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTVNQNDMwVGFyZ2V0TWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5M2VkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9NU1A0MzBUYXJnZXRNYWNoaW5lLmgKQEAgLTAsMCArMSw2OSBAQAorLy89PS0tIE1TUDQzMFRhcmdldE1hY2hpbmUuaCAtIERlZmluZSBUYXJnZXRNYWNoaW5lIGZvciBNU1A0MzAgLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1TUDQzMCBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRNYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX1RBUkdFVF9NU1A0MzBfVEFSR0VUTUFDSElORV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX01TUDQzMF9UQVJHRVRNQUNISU5FX0gKKworI2luY2x1ZGUgIk1TUDQzMEluc3RySW5mby5oIgorI2luY2x1ZGUgIk1TUDQzMElTZWxMb3dlcmluZy5oIgorI2luY2x1ZGUgIk1TUDQzMFNlbGVjdGlvbkRBR0luZm8uaCIKKyNpbmNsdWRlICJNU1A0MzBSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJNU1A0MzBTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBNU1A0MzBUYXJnZXRNYWNoaW5lCisvLy8KK2NsYXNzIE1TUDQzMFRhcmdldE1hY2hpbmUgOiBwdWJsaWMgTExWTVRhcmdldE1hY2hpbmUgeworICBNU1A0MzBTdWJ0YXJnZXQgICAgICAgIFN1YnRhcmdldDsKKyAgY29uc3QgVGFyZ2V0RGF0YSAgICAgICBEYXRhTGF5b3V0OyAgICAgICAvLyBDYWxjdWxhdGVzIHR5cGUgc2l6ZSAmIGFsaWdubWVudAorICBNU1A0MzBJbnN0ckluZm8gICAgICAgIEluc3RySW5mbzsKKyAgTVNQNDMwVGFyZ2V0TG93ZXJpbmcgICBUTEluZm87CisgIE1TUDQzMFNlbGVjdGlvbkRBR0luZm8gVFNJbmZvOworCisgIC8vIE1TUDQzMCBkb2VzIG5vdCBoYXZlIGFueSBjYWxsIHN0YWNrIGZyYW1lLCB0aGVyZWZvcmUgbm90IGhhdmluZworICAvLyBhbnkgTVNQNDMwIHNwZWNpZmljIEZyYW1lSW5mbyBjbGFzcy4KKyAgVGFyZ2V0RnJhbWVJbmZvICAgICAgIEZyYW1lSW5mbzsKKworcHVibGljOgorICBNU1A0MzBUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGUyk7CisKKyAgdmlydHVhbCBjb25zdCBUYXJnZXRGcmFtZUluZm8gKmdldEZyYW1lSW5mbygpIGNvbnN0IHsgcmV0dXJuICZGcmFtZUluZm87IH0KKyAgdmlydHVhbCBjb25zdCBNU1A0MzBJbnN0ckluZm8gKmdldEluc3RySW5mbygpIGNvbnN0ICB7IHJldHVybiAmSW5zdHJJbmZvOyB9CisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0RGF0YSAqZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0ICAgICB7IHJldHVybiAmRGF0YUxheW91dDt9CisgIHZpcnR1YWwgY29uc3QgTVNQNDMwU3VidGFyZ2V0ICpnZXRTdWJ0YXJnZXRJbXBsKCkgY29uc3QgeyByZXR1cm4gJlN1YnRhcmdldDsgfQorCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuICZJbnN0ckluZm8uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IE1TUDQzMFRhcmdldExvd2VyaW5nICpnZXRUYXJnZXRMb3dlcmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gJlRMSW5mbzsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgTVNQNDMwU2VsZWN0aW9uREFHSW5mbyogZ2V0U2VsZWN0aW9uREFHSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gJlRTSW5mbzsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBhZGRJbnN0U2VsZWN0b3IoUGFzc01hbmFnZXJCYXNlICZQTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworICB2aXJ0dWFsIGJvb2wgYWRkUHJlRW1pdFBhc3MoUGFzc01hbmFnZXJCYXNlICZQTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworfTsgLy8gTVNQNDMwVGFyZ2V0TWFjaGluZS4KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVEFSR0VUX01TUDQzMF9UQVJHRVRNQUNISU5FX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmMzNkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L01TUDQzMC9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjIAorIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIyAKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTU1TUDQzMENvZGVHZW4KK1RBUkdFVCA9IE1TUDQzMAorCisjIE1ha2Ugc3VyZSB0aGF0IHRibGdlbiBpcyBydW4sIGZpcnN0IHRoaW5nLgorQlVJTFRfU09VUkNFUyA9IE1TUDQzMEdlblJlZ2lzdGVySW5mby5oLmluYyBNU1A0MzBHZW5SZWdpc3Rlck5hbWVzLmluYyBcCisJCU1TUDQzMEdlblJlZ2lzdGVySW5mby5pbmMgTVNQNDMwR2VuSW5zdHJOYW1lcy5pbmMgXAorCQlNU1A0MzBHZW5JbnN0ckluZm8uaW5jIE1TUDQzMEdlbkFzbVdyaXRlci5pbmMgXAorCQlNU1A0MzBHZW5EQUdJU2VsLmluYyBNU1A0MzBHZW5DYWxsaW5nQ29udi5pbmMgXAorCQlNU1A0MzBHZW5TdWJ0YXJnZXQuaW5jCisKK0RJUlMgPSBBc21QcmludGVyIFRhcmdldEluZm8KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NU1A0MzAvUkVBRE1FLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5NjM0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL1JFQURNRS50eHQKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTVNQNDMwIGJhY2tlbmQuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0RJU0NMQUlNRVI6IFRoaWQgYmFja2VuZCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBoaWdobHkgZXhwZXJpbWVudGFsLiBJIG5ldmVyCitzZWVuIG5vciB3b3JrZWQgd2l0aCB0aGlzIE1DVSwgYWxsIGluZm9ybWF0aW9uIHdhcyBnYXRoZXJlZCBmcm9tIGRhdGFzaGVldAorb25seS4gVGhlIG9yaWdpbmFsIGludGVudGlvbiBvZiBtYWtpbmcgdGhpcyBiYWNrZW5kIHdhcyB0byB3cml0ZSBkb2N1bWVudGF0aW9uCitvZiBmb3JtICJIb3cgdG8gd3JpdGUgYmFja2VuZCBmb3IgZHVtbWllcyIgOikgVGhlcyBub3RlcyBob3BlZnVsbHkgd2lsbCBiZQorYXZhaWxhYmxlIHByZXR0eSBzb29uLgorCitTb21lIHRoaW5ncyBhcmUgaW5jb21wbGV0ZSAvIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKHRoaXMgbGlzdCBzdXJlbHkgaXMgbm90Citjb21wbGV0ZSBhcyB3ZWxsKToKKworMS4gVmVyaWZ5LCBob3cgc3R1ZmYgaXMgaGFuZGxpbmcgaW1wbGljaXQgemV4dCB3aXRoIDggYml0IG9wZXJhbmRzICh0aGlzIG1pZ2h0CitiZSBtb2RlbGxlZCBjdXJyZW50bHkgaW4gaW1wcm9wZXIgd2F5IC0gc2hvdWxkIHdlIG5lZWQgdG8gbWFyayB0aGUgc3VwZXJyZWcgYXMKK2RlZiBmb3IgZXZlcnkgOCBiaXQgaW5zdHJ1Y3Rpb24/KS4KKworMi4gTGliY2FsbHM6IG11bHRpcGxpY2F0aW9uLCBkaXZpc2lvbiwgcmVtYWluZGVyLiBOb3RlLCB0aGF0IGNhbGxpbmcgY29udmVudGlvbgorZm9yIGxpYmNhbGxzIGlzIGluY29tcHRpYmxlIHdpdGggY2FsbGluZyBjb252ZW50aW9uIG9mIGxpYmNhbGxzIG9mIG1zcDQzMC1nY2MKKyh0aGVzZSBjYW5ub3QgYmUgdXNlZCB0aG91Z2ggZHVlIHRvIGxpY2Vuc2UgcmVzdHJpY3Rpb24pLgorCiszLiBJbXBsZW1lbnQgbXVsdGlwbGljYXRpb24gLyBkaXZpc2lvbiBieSBjb25zdGFudCAoZGFnIGNvbWJpbmVyIGhvb2s/KS4KKworNC4gSW1wbGVtZW50IG5vbi1jb25zdGFudCBzaGlmdHMuCisKKzUuIEltcGxlbWVudCB2YXJhcmdzIHN0dWZmLgorCis2LiBWZXJpZnkgYW5kIGZpeCAoaWYgbmVlZGVkKSBob3cncyBzdHVmZiBwbGF5aW5nIHdpdGggaTMyIC8gaTY0LgorCis3LiBJbXBsZW1lbnQgZmxvYXRpbmcgcG9pbnQgc3R1ZmYgKHNvZnRmcD8pCisKKzguIEltcGxlbWVudCBpbnN0cnVjdGlvbiBlbmNvZGluZyBmb3IgKHBvc3NpYmxlKSBkaXJlY3QgY29kZSBlbWlzc2lvbiBpbiB0aGUKK2Z1dHVyZS4KKworOS4gU2luY2UgYWxtb3N0IGFsbCBpbnN0cnVjdGlvbnMgc2V0IGZsYWdzIC0gaW1wbGVtZW50IGJyY29uZCAvIHNlbGVjdCBpbiBiZXR0ZXIKK3dheSAoY3VycmVudGx5IHRoZXkgZW1pdCBleHBsaWNpdCBjb21wYXJpc29uKS4KKworMTAuIEhhbmRsZSBpbW0gaW4gY29tcGFyaXNvbnMgaW4gYmV0dGVyIHdheSAoc2VlIGNvbW1lbnQgaW4gTVNQNDMwSW5zdHJJbmZvLnRkKQorCisxMS4gSW1wbGVtZW50IGhvb2tzIGZvciBiZXR0ZXIgbWVtb3J5IG9wIGZvbGRpbmcsIGV0Yy4KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNDA4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTU1TUDQzMEluZm8KKyAgTVNQNDMwVGFyZ2V0SW5mby5jcHAKKyAgKQorCithZGRfZGVwZW5kZW5jaWVzKExMVk1NU1A0MzBJbmZvIE1TUDQzMFRhYmxlX2dlbikKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL1RhcmdldEluZm8vTVNQNDMwVGFyZ2V0SW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9UYXJnZXRJbmZvL01TUDQzMFRhcmdldEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2E1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9UYXJnZXRJbmZvL01TUDQzMFRhcmdldEluZm8uY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vPT09LS0gTVNQNDMwVGFyZ2V0SW5mby5jcHAgLSBNU1A0MzAgVGFyZ2V0IEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJNU1A0MzAuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGFyZ2V0IGxsdm06OlRoZU1TUDQzMFRhcmdldDsKKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplTVNQNDMwVGFyZ2V0SW5mbygpIHsgCisgIFJlZ2lzdGVyVGFyZ2V0PFRyaXBsZTo6bXNwNDMwPiAKKyAgICBYKFRoZU1TUDQzMFRhcmdldCwgIm1zcDQzMCIsICJNU1A0MzAgW2V4cGVyaW1lbnRhbF0iKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTVNQNDMwL1RhcmdldEluZm8vTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9UYXJnZXRJbmZvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjA4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01TUDQzMC9UYXJnZXRJbmZvL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L01TUDQzMC9UYXJnZXRJbmZvL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCitMRVZFTCA9IC4uLy4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1NU1A0MzBJbmZvCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFBGTEFHUyA9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGEzNjBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACisjPT09LSBsaWIvVGFyZ2V0L01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1UYXJnZXQKK0JVSUxEX0FSQ0hJVkUgPSAxCisKKyMgV2UgaW5jbHVkZSB0aGlzIGVhcmx5IHNvIHdlIGNhbiBhY2Nlc3MgdGhlIHZhbHVlIG9mIFRBUkdFVFNfVE9fQlVJTEQgYXMgdGhlCisjIHZhbHVlIGZvciBQQVJBTExFTF9ESVJTIHdoaWNoIG11c3QgYmUgc2V0IGJlZm9yZSBNYWtlZmlsZS5ydWxlcyBpcyBpbmNsdWRlZAoraW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKKworUEFSQUxMRUxfRElSUyA6PSAkKFRBUkdFVFNfVE9fQlVJTEQpCisKK2luY2x1ZGUgJChMTFZNX1NSQ19ST09UKS9NYWtlZmlsZS5ydWxlcwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzA5OWQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4KKyAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uCisgICkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNTWlwc0FzbVByaW50ZXIKKyAgTWlwc0FzbVByaW50ZXIuY3BwCisgICkKK2FkZF9kZXBlbmRlbmNpZXMoTExWTU1pcHNBc21QcmludGVyIE1pcHNDb2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL0FzbVByaW50ZXIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvQXNtUHJpbnRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWVmZTliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL0FzbVByaW50ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIyM9PT0tIGxpYi9UYXJnZXQvTWlwcy9Bc21QcmludGVyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNTWlwc0FzbVByaW50ZXIKKworIyBIYWNrOiB3ZSBuZWVkIHRvIGluY2x1ZGUgJ21haW4nIE1pcHMgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiCisjIHByaXZhdGUgaGVhZGVycworQ1BQLkZsYWdzICs9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvQXNtUHJpbnRlci9NaXBzQXNtUHJpbnRlci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvQXNtUHJpbnRlci9NaXBzQXNtUHJpbnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2MGY2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9Bc21QcmludGVyL01pcHNBc21QcmludGVyLmNwcApAQCAtMCwwICsxLDM4NiBAQAorLy89PT0tLSBNaXBzQXNtUHJpbnRlci5jcHAgLSBNaXBzIExMVk0gYXNzZW1ibHkgd3JpdGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBwcmludGVyIHRoYXQgY29udmVydHMgZnJvbSBvdXIgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KKy8vIG9mIG1hY2hpbmUtZGVwZW5kZW50IExMVk0gY29kZSB0byBHQVMtZm9ybWF0IE1JUFMgYXNzZW1ibHkgbGFuZ3VhZ2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJtaXBzLWFzbS1wcmludGVyIgorI2luY2x1ZGUgIk1pcHMuaCIKKyNpbmNsdWRlICJNaXBzU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiTWlwc0luc3RySW5mby5oIgorI2luY2x1ZGUgIk1pcHNUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiTWlwc01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGUuaCIgCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBjbGFzcyBNaXBzQXNtUHJpbnRlciA6IHB1YmxpYyBBc21QcmludGVyIHsKKyAgICBjb25zdCBNaXBzU3VidGFyZ2V0ICpTdWJ0YXJnZXQ7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBNaXBzQXNtUHJpbnRlcihUYXJnZXRNYWNoaW5lICZUTSwgIE1DU3RyZWFtZXIgJlN0cmVhbWVyKQorICAgICAgOiBBc21QcmludGVyKFRNLCBTdHJlYW1lcikgeworICAgICAgU3VidGFyZ2V0ID0gJlRNLmdldFN1YnRhcmdldDxNaXBzU3VidGFyZ2V0PigpOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIk1pcHMgQXNzZW1ibHkgUHJpbnRlciI7CisgICAgfQorCisgICAgYm9vbCBQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXNtVmFyaWFudCwgY29uc3QgY2hhciAqRXh0cmFDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50VW5zaWduZWRJbW0oY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludE1lbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLCByYXdfb3N0cmVhbSAmTywgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXIgPSAwKTsKKyAgICB2b2lkIHByaW50RkNDT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllciA9IDApOworICAgIHZvaWQgcHJpbnRTYXZlZFJlZ3NCaXRtYXNrKHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50SGV4MzIodW5zaWduZWQgaW50IFZhbHVlLCByYXdfb3N0cmVhbSAmTyk7CisKKyAgICBjb25zdCBjaGFyICpnZXRDdXJyZW50QUJJU3RyaW5nKCkgY29uc3Q7CisgICAgdm9pZCBlbWl0RnJhbWVEaXJlY3RpdmUoKTsKKworICAgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmTyk7IC8vIGF1dG9nZW4nZC4KKyAgICB2b2lkIEVtaXRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgICBTbWFsbFN0cmluZzwxMjg+IFN0cjsKKyAgICAgIHJhd19zdmVjdG9yX29zdHJlYW0gT1MoU3RyKTsKKyAgICAgIHByaW50SW5zdHJ1Y3Rpb24oTUksIE9TKTsKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KE9TLnN0cigpKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIEVtaXRGdW5jdGlvbkJvZHlTdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBFbWl0RnVuY3Rpb25Cb2R5RW5kKCk7CisgICAgdmlydHVhbCBib29sIGlzQmxvY2tPbmx5UmVhY2hhYmxlQnlGYWxsdGhyb3VnaChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0UmVnaXN0ZXJOYW1lKHVuc2lnbmVkIFJlZ05vKTsKKworICAgIHZpcnR1YWwgdm9pZCBFbWl0RnVuY3Rpb25FbnRyeUxhYmVsKCk7CisgICAgdm9pZCBFbWl0U3RhcnRPZkFzbUZpbGUoTW9kdWxlICZNKTsKKyAgfTsKK30gLy8gZW5kIG9mIGFub255bW91cyBuYW1lc3BhY2UKKworI2luY2x1ZGUgIk1pcHNHZW5Bc21Xcml0ZXIuaW5jIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBNaXBzIEFzbSBEaXJlY3RpdmVzCisvLworLy8gIC0tIEZyYW1lIGRpcmVjdGl2ZSAiZnJhbWUgU3RhY2twb2ludGVyLCBTdGFja3NpemUsIFJBUmVnaXN0ZXIiCisvLyAgRGVzY3JpYmUgdGhlIHN0YWNrIGZyYW1lLgorLy8KKy8vICAtLSBNYXNrIGRpcmVjdGl2ZXMgIihmKW1hc2sgIGJpdG1hc2ssIG9mZnNldCIgCisvLyAgVGVsbHMgdGhlIGFzc2VtYmxlciB3aGljaCByZWdpc3RlcnMgYXJlIHNhdmVkIGFuZCB3aGVyZS4KKy8vICBiaXRtYXNrIC0gY29udGFpbiBhIGxpdHRsZSBlbmRpYW4gYml0c2V0IGluZGljYXRpbmcgd2hpY2ggcmVnaXN0ZXJzIGFyZSAKKy8vICAgICAgICAgICAgc2F2ZWQgb24gZnVuY3Rpb24gcHJvbG9ndWUgKGUuZy4gd2l0aCBhIDB4ODAwMDAwMDAgbWFzaywgdGhlIAorLy8gICAgICAgICAgICBhc3NlbWJsZXIga25vd3MgdGhlIHJlZ2lzdGVyIDMxIChSQSkgaXMgc2F2ZWQgYXQgcHJvbG9ndWUuCisvLyAgb2Zmc2V0ICAtIHRoZSBwb3NpdGlvbiBiZWZvcmUgc3RhY2sgcG9pbnRlciBzdWJ0cmFjdGlvbiBpbmRpY2F0aW5nIHdoZXJlIAorLy8gICAgICAgICAgICB0aGUgZmlyc3Qgc2F2ZWQgcmVnaXN0ZXIgb24gcHJvbG9ndWUgaXMgbG9jYXRlZC4gKGUuZy4gd2l0aCBhCisvLworLy8gIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gcHJvbG9ndWU6CisvLworLy8gICAgLmZyYW1lICAkZnAsNDgsJHJhCisvLyAgICAubWFzayAgIDB4YzAwMDAwMDAsLTgKKy8vICAgICAgIGFkZGl1ICRzcCwgJHNwLCAtNDgKKy8vICAgICAgIHN3ICRyYSwgNDAoJHNwKQorLy8gICAgICAgc3cgJGZwLCAzNigkc3ApCisvLworLy8gICAgV2l0aCBhIDB4YzAwMDAwMDAgbWFzaywgdGhlIGFzc2VtYmxlciBrbm93cyB0aGUgcmVnaXN0ZXIgMzEgKFJBKSBhbmQgCisvLyAgICAzMCAoRlApIGFyZSBzYXZlZCBhdCBwcm9sb2d1ZS4gQXMgdGhlIHNhdmUgb3JkZXIgb24gcHJvbG9ndWUgaXMgZnJvbSAKKy8vICAgIGxlZnQgdG8gcmlnaHQsIFJBIGlzIHNhdmVkIGZpcnN0LiBBIC04IG9mZnNldCBtZWFucyB0aGF0IGFmdGVyIHRoZSAKKy8vICAgIHN0YWNrIHBvaW50ZXIgc3VidHJhdGlvbiwgdGhlIGZpcnN0IHJlZ2lzdGVyIGluIHRoZSBtYXNrIChSQSkgd2lsbCBiZQorLy8gICAgc2F2ZWQgYXQgYWRkcmVzcyA0OC04PTQwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXNrIGRpcmVjdGl2ZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIENyZWF0ZSBhIGJpdG1hc2sgd2l0aCBhbGwgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyBmb3IgQ1BVIG9yIEZsb2F0aW5nIFBvaW50IAorLy8gcmVnaXN0ZXJzLiBGb3IgQ1BVIHJlZ2lzdGVycyBjb25zaWRlciBSQSwgR1AgYW5kIEZQIGZvciBzYXZpbmcgaWYgbmVjZXNzYXJ5Lgordm9pZCBNaXBzQXNtUHJpbnRlcjo6cHJpbnRTYXZlZFJlZ3NCaXRtYXNrKHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmUkkgPSAqVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIGNvbnN0IE1pcHNGdW5jdGlvbkluZm8gKk1pcHNGSSA9IE1GLT5nZXRJbmZvPE1pcHNGdW5jdGlvbkluZm8+KCk7CisgICAgICAgICAgICAgCisgIC8vIENQVSBhbmQgRlBVIFNhdmVkIFJlZ2lzdGVycyBCaXRtYXNrcworICB1bnNpZ25lZCBpbnQgQ1BVQml0bWFzayA9IDA7CisgIHVuc2lnbmVkIGludCBGUFVCaXRtYXNrID0gMDsKKworICAvLyBTZXQgdGhlIENQVSBhbmQgRlBVIEJpdG1hc2tzCisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLT5nZXRGcmFtZUluZm8oKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJID0gTUZJLT5nZXRDYWxsZWVTYXZlZEluZm8oKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gQ1NJW2ldLmdldFJlZygpOworICAgIHVuc2lnbmVkIFJlZ051bSA9IE1pcHNSZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKFJlZyk7CisgICAgaWYgKE1pcHM6OkNQVVJlZ3NSZWdpc3RlckNsYXNzLT5jb250YWlucyhSZWcpKQorICAgICAgQ1BVQml0bWFzayB8PSAoMSA8PCBSZWdOdW0pOworICAgIGVsc2UKKyAgICAgIEZQVUJpdG1hc2sgfD0gKDEgPDwgUmVnTnVtKTsKKyAgfQorCisgIC8vIFJldHVybiBBZGRyZXNzIGFuZCBGcmFtZSByZWdpc3RlcnMgbXVzdCBhbHNvIGJlIHNldCBpbiBDUFVCaXRtYXNrLgorICBpZiAoUkkuaGFzRlAoKk1GKSkgCisgICAgQ1BVQml0bWFzayB8PSAoMSA8PCBNaXBzUmVnaXN0ZXJJbmZvOjoKKyAgICAgICAgICAgICAgICBnZXRSZWdpc3Rlck51bWJlcmluZyhSSS5nZXRGcmFtZVJlZ2lzdGVyKCpNRikpKTsKKyAgCisgIGlmIChNRkktPmFkanVzdHNTdGFjaygpKSAKKyAgICBDUFVCaXRtYXNrIHw9ICgxIDw8IE1pcHNSZWdpc3RlckluZm86OgorICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyTnVtYmVyaW5nKFJJLmdldFJBUmVnaXN0ZXIoKSkpOworCisgIC8vIFByaW50IENQVUJpdG1hc2sKKyAgTyA8PCAiXHQubWFzayBcdCI7IHByaW50SGV4MzIoQ1BVQml0bWFzaywgTyk7CisgIE8gPDwgJywnIDw8IE1pcHNGSS0+Z2V0Q1BVVG9wU2F2ZWRSZWdPZmYoKSA8PCAnXG4nOworCisgIC8vIFByaW50IEZQVUJpdG1hc2sKKyAgTyA8PCAiXHQuZm1hc2tcdCI7IHByaW50SGV4MzIoRlBVQml0bWFzaywgTyk7IE8gPDwgIiwiCisgICAgPDwgTWlwc0ZJLT5nZXRGUFVUb3BTYXZlZFJlZ09mZigpIDw8ICdcbic7Cit9CisKKy8vIFByaW50IGEgMzIgYml0IGhleCBudW1iZXIgd2l0aCBhbGwgbnVtYmVycy4KK3ZvaWQgTWlwc0FzbVByaW50ZXI6OnByaW50SGV4MzIodW5zaWduZWQgVmFsdWUsIHJhd19vc3RyZWFtICZPKSB7CisgIE8gPDwgIjB4IjsKKyAgZm9yIChpbnQgaSA9IDc7IGkgPj0gMDsgaS0tKSAKKyAgICBPIDw8IHV0b2hleHN0cigoVmFsdWUgJiAoMHhGIDw8IChpKjQpKSkgPj4gKGkqNCkpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRnJhbWUgYW5kIFNldCBkaXJlY3RpdmVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRnJhbWUgRGlyZWN0aXZlCit2b2lkIE1pcHNBc21QcmludGVyOjplbWl0RnJhbWVEaXJlY3RpdmUoKSB7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmUkkgPSAqVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisKKyAgdW5zaWduZWQgc3RhY2tSZWcgID0gUkkuZ2V0RnJhbWVSZWdpc3RlcigqTUYpOworICB1bnNpZ25lZCByZXR1cm5SZWcgPSBSSS5nZXRSQVJlZ2lzdGVyKCk7CisgIHVuc2lnbmVkIHN0YWNrU2l6ZSA9IE1GLT5nZXRGcmFtZUluZm8oKS0+Z2V0U3RhY2tTaXplKCk7CisKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LmZyYW1lXHQkIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKExvd2VyY2FzZVN0cmluZyhnZXRSZWdpc3Rlck5hbWUoc3RhY2tSZWcpKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiLCIgKyBUd2luZShzdGFja1NpemUpICsgIiwkIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKExvd2VyY2FzZVN0cmluZyhnZXRSZWdpc3Rlck5hbWUocmV0dXJuUmVnKSkpKTsKK30KKworLy8vIEVtaXQgU2V0IGRpcmVjdGl2ZXMuCitjb25zdCBjaGFyICpNaXBzQXNtUHJpbnRlcjo6Z2V0Q3VycmVudEFCSVN0cmluZygpIGNvbnN0IHsgCisgIHN3aXRjaCAoU3VidGFyZ2V0LT5nZXRUYXJnZXRBQkkoKSkgeworICBjYXNlIE1pcHNTdWJ0YXJnZXQ6Ok8zMjogIHJldHVybiAiYWJpMzIiOyAgCisgIGNhc2UgTWlwc1N1YnRhcmdldDo6TzY0OiAgcmV0dXJuICJhYmlPNjQiOworICBjYXNlIE1pcHNTdWJ0YXJnZXQ6Ok4zMjogIHJldHVybiAiYWJpTjMyIjsKKyAgY2FzZSBNaXBzU3VidGFyZ2V0OjpONjQ6ICByZXR1cm4gImFiaTY0IjsKKyAgY2FzZSBNaXBzU3VidGFyZ2V0OjpFQUJJOiByZXR1cm4gImVhYmkzMiI7IC8vIFRPRE86IGhhbmRsZSBlYWJpNjQKKyAgZGVmYXVsdDogYnJlYWs7CisgIH0KKworICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIE1pcHMgQUJJIik7CisgIHJldHVybiBOVUxMOworfSAgCisKK3ZvaWQgTWlwc0FzbVByaW50ZXI6OkVtaXRGdW5jdGlvbkVudHJ5TGFiZWwoKSB7CisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5lbnRcdCIgKyBUd2luZShDdXJyZW50Rm5TeW0tPmdldE5hbWUoKSkpOworICBPdXRTdHJlYW1lci5FbWl0TGFiZWwoQ3VycmVudEZuU3ltKTsKK30KKworLy8vIEVtaXRGdW5jdGlvbkJvZHlTdGFydCAtIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZW1pdCBzdHVmZiBiZWZvcmUKKy8vLyB0aGUgZmlyc3QgYmFzaWMgYmxvY2sgaW4gdGhlIGZ1bmN0aW9uLgordm9pZCBNaXBzQXNtUHJpbnRlcjo6RW1pdEZ1bmN0aW9uQm9keVN0YXJ0KCkgeworICBlbWl0RnJhbWVEaXJlY3RpdmUoKTsKKyAgCisgIFNtYWxsU3RyaW5nPDEyOD4gU3RyOworICByYXdfc3ZlY3Rvcl9vc3RyZWFtIE9TKFN0cik7CisgIHByaW50U2F2ZWRSZWdzQml0bWFzayhPUyk7CisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KE9TLnN0cigpKTsKK30KKworLy8vIEVtaXRGdW5jdGlvbkJvZHlFbmQgLSBUYXJnZXRzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGVtaXQgc3R1ZmYgYWZ0ZXIKKy8vLyB0aGUgbGFzdCBiYXNpYyBibG9jayBpbiB0aGUgZnVuY3Rpb24uCit2b2lkIE1pcHNBc21QcmludGVyOjpFbWl0RnVuY3Rpb25Cb2R5RW5kKCkgeworICAvLyBUaGVyZSBhcmUgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgbWFjcm9zLCBidXQgdGhleSBtdXN0CisgIC8vIGFsd2F5cyBiZSBhdCB0aGUgZnVuY3Rpb24gZW5kLCBhbmQgd2UgY2FuJ3QgZW1pdCBhbmQKKyAgLy8gYnJlYWsgd2l0aCBCQiBsb2dpYy4gCisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXHQuc2V0XHRtYWNybyIpKTsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5zZXRcdHJlb3JkZXIiKSk7CisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5lbmRcdCIgKyBUd2luZShDdXJyZW50Rm5TeW0tPmdldE5hbWUoKSkpOworfQorCisKKy8vLyBpc0Jsb2NrT25seVJlYWNoYWJsZUJ5RmFsbHRob3VnaCAtIFJldHVybiB0cnVlIGlmIHRoZSBiYXNpYyBibG9jayBoYXMKKy8vLyBleGFjdGx5IG9uZSBwcmVkZWNlc3NvciBhbmQgdGhlIGNvbnRyb2wgdHJhbnNmZXIgbWVjaGFuaXNtIGJldHdlZW4KKy8vLyB0aGUgcHJlZGVjZXNzb3IgYW5kIHRoaXMgYmxvY2sgaXMgYSBmYWxsLXRocm91Z2guCitib29sIE1pcHNBc21QcmludGVyOjppc0Jsb2NrT25seVJlYWNoYWJsZUJ5RmFsbHRocm91Z2goY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgCisgICAgY29uc3QgeworICAvLyBUaGUgcHJlZGVjZXNzb3IgaGFzIHRvIGJlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGJsb2NrLgorICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZCA9ICpNQkItPnByZWRfYmVnaW4oKTsKKworICAvLyBJZiB0aGUgcHJlZGVjZXNzb3IgaXMgYSBzd2l0Y2ggc3RhdGVtZW50LCBhc3N1bWUgYSBqdW1wIHRhYmxlCisgIC8vIGltcGxlbWVudGF0aW9uLCBzbyBpdCBpcyBub3QgYSBmYWxsIHRocm91Z2guCisgIGlmIChjb25zdCBCYXNpY0Jsb2NrICpiYiA9IFByZWQtPmdldEJhc2ljQmxvY2soKSkKKyAgICBpZiAoaXNhPFN3aXRjaEluc3Q+KGJiLT5nZXRUZXJtaW5hdG9yKCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAKKyAgcmV0dXJuIEFzbVByaW50ZXI6OmlzQmxvY2tPbmx5UmVhY2hhYmxlQnlGYWxsdGhyb3VnaChNQkIpOworfQorCisvLyBQcmludCBvdXQgYW4gb3BlcmFuZCBmb3IgYW4gaW5saW5lIGFzbSBleHByZXNzaW9uLgorYm9vbCBNaXBzQXNtUHJpbnRlcjo6UHJpbnRBc21PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsY29uc3QgY2hhciAqRXh0cmFDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIC8vIERvZXMgdGhpcyBhc20gb3BlcmFuZCBoYXZlIGEgc2luZ2xlIGxldHRlciBvcGVyYW5kIG1vZGlmaWVyPworICBpZiAoRXh0cmFDb2RlICYmIEV4dHJhQ29kZVswXSkgCisgICAgcmV0dXJuIHRydWU7IC8vIFVua25vd24gbW9kaWZpZXIuCisKKyAgcHJpbnRPcGVyYW5kKE1JLCBPcE5vLCBPKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE1pcHNBc21QcmludGVyOjpwcmludE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKG9wTnVtKTsKKyAgYm9vbCBjbG9zZVAgPSBmYWxzZTsKKworICBpZiAoTU8uZ2V0VGFyZ2V0RmxhZ3MoKSkKKyAgICBjbG9zZVAgPSB0cnVlOworCisgIHN3aXRjaChNTy5nZXRUYXJnZXRGbGFncygpKSB7CisgIGNhc2UgTWlwc0lJOjpNT19HUFJFTDogICAgTyA8PCAiJWdwX3JlbCgiOyBicmVhazsKKyAgY2FzZSBNaXBzSUk6Ok1PX0dPVF9DQUxMOiBPIDw8ICIlY2FsbDE2KCI7IGJyZWFrOworICBjYXNlIE1pcHNJSTo6TU9fR09UOgorICAgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gTWlwczo6TFcpCisgICAgICBPIDw8ICIlZ290KCI7CisgICAgZWxzZQorICAgICAgTyA8PCAiJWxvKCI7CisgICAgYnJlYWs7CisgIGNhc2UgTWlwc0lJOjpNT19BQlNfSElMTzoKKyAgICBpZiAoTUktPmdldE9wY29kZSgpID09IE1pcHM6OkxVaSkKKyAgICAgIE8gPDwgIiVoaSgiOworICAgIGVsc2UKKyAgICAgIE8gPDwgIiVsbygiOyAgICAgCisgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKE1PLmdldFR5cGUoKSkgeworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyOgorICAgICAgTyA8PCAnJCcgPDwgTG93ZXJjYXNlU3RyaW5nKGdldFJlZ2lzdGVyTmFtZShNTy5nZXRSZWcoKSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgICBPIDw8IChzaG9ydCBpbnQpTU8uZ2V0SW1tKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrOgorICAgICAgTyA8PCAqTU8uZ2V0TUJCKCktPmdldFN5bWJvbCgpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fR2xvYmFsQWRkcmVzczoKKyAgICAgIE8gPDwgKk1hbmctPmdldFN5bWJvbChNTy5nZXRHbG9iYWwoKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOgorICAgICAgTyA8PCAqR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woTU8uZ2V0U3ltYm9sTmFtZSgpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgICBPIDw8IE1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJKVEkiIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkKKyAgICAgICAgPDwgJ18nIDw8IE1PLmdldEluZGV4KCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0NvbnN0YW50UG9vbEluZGV4OgorICAgICAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSA8PCAiQ1BJIgorICAgICAgICA8PCBnZXRGdW5jdGlvbk51bWJlcigpIDw8ICJfIiA8PCBNTy5nZXRJbmRleCgpOworICAgICAgaWYgKE1PLmdldE9mZnNldCgpKQorICAgICAgICBPIDw8ICIrIiA8PCBNTy5nZXRPZmZzZXQoKTsKKyAgICAgIGJyZWFrOworICAKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiPHVua25vd24gb3BlcmFuZCB0eXBlPiIpOworICB9CisKKyAgaWYgKGNsb3NlUCkgTyA8PCAiKSI7Cit9CisKK3ZvaWQgTWlwc0FzbVByaW50ZXI6OnByaW50VW5zaWduZWRJbW0oY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChvcE51bSk7CisgIGlmIChNTy5pc0ltbSgpKQorICAgIE8gPDwgKHVuc2lnbmVkIHNob3J0IGludClNTy5nZXRJbW0oKTsKKyAgZWxzZSAKKyAgICBwcmludE9wZXJhbmQoTUksIG9wTnVtLCBPKTsKK30KKwordm9pZCBNaXBzQXNtUHJpbnRlcjo6CitwcmludE1lbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLCByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllcikgeworICAvLyB3aGVuIHVzaW5nIHN0YWNrIGxvY2F0aW9ucyBmb3Igbm90IGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zCisgIC8vIHByaW50IHRoZSBzYW1lIHdheSBhcyBhbGwgbm9ybWFsIDMgb3BlcmFuZCBpbnN0cnVjdGlvbnMuCisgIGlmIChNb2RpZmllciAmJiAhc3RyY21wKE1vZGlmaWVyLCAic3RhY2tsb2MiKSkgeworICAgIHByaW50T3BlcmFuZChNSSwgb3BOdW0rMSwgTyk7CisgICAgTyA8PCAiLCAiOworICAgIHByaW50T3BlcmFuZChNSSwgb3BOdW0sIE8pOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIExvYWQvU3RvcmUgbWVtb3J5IG9wZXJhbmRzIC0tIGltbSgkcmVnKSAKKyAgLy8gSWYgUElDIHRhcmdldCB0aGUgdGFyZ2V0IGlzIGxvYWRlZCBhcyB0aGUgCisgIC8vIHBhdHRlcm4gbHcgJDI1LCVjYWxsMTYoJDI4KQorICBwcmludE9wZXJhbmQoTUksIG9wTnVtLCBPKTsKKyAgTyA8PCAiKCI7CisgIHByaW50T3BlcmFuZChNSSwgb3BOdW0rMSwgTyk7CisgIE8gPDwgIikiOworfQorCit2b2lkIE1pcHNBc21QcmludGVyOjoKK3ByaW50RkNDT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kJiBNTyA9IE1JLT5nZXRPcGVyYW5kKG9wTnVtKTsKKyAgTyA8PCBNaXBzOjpNaXBzRkNDVG9TdHJpbmcoKE1pcHM6OkNvbmRDb2RlKU1PLmdldEltbSgpKTsgCit9CisKK3ZvaWQgTWlwc0FzbVByaW50ZXI6OkVtaXRTdGFydE9mQXNtRmlsZShNb2R1bGUgJk0pIHsKKyAgLy8gRklYTUU6IFVzZSBTd2l0Y2hTZWN0aW9uLgorICAKKyAgLy8gVGVsbCB0aGUgYXNzZW1ibGVyIHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LnNlY3Rpb24gLm1kZWJ1Zy4iICsgVHdpbmUoZ2V0Q3VycmVudEFCSVN0cmluZygpKSk7CisKKyAgLy8gVE9ETzogaGFuZGxlIE82NCBBQkkKKyAgaWYgKFN1YnRhcmdldC0+aXNBQklfRUFCSSgpKSB7CisgICAgaWYgKFN1YnRhcmdldC0+aXNHUDMyYml0KCkpCisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChTdHJpbmdSZWYoIlx0LnNlY3Rpb24gLmdjY19jb21waWxlZF9sb25nMzIiKSk7CisgICAgZWxzZQorICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5zZWN0aW9uIC5nY2NfY29tcGlsZWRfbG9uZzY0IikpOworICB9CisKKyAgLy8gcmV0dXJuIHRvIHByZXZpb3VzIHNlY3Rpb24KKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5wcmV2aW91cyIpKTsgCit9CisKKy8vIEZvcmNlIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZU1pcHNBc21QcmludGVyKCkgeyAKKyAgUmVnaXN0ZXJBc21QcmludGVyPE1pcHNBc21QcmludGVyPiBYKFRoZU1pcHNUYXJnZXQpOworICBSZWdpc3RlckFzbVByaW50ZXI8TWlwc0FzbVByaW50ZXI+IFkoVGhlTWlwc2VsVGFyZ2V0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzc4MDJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjYgQEAKK3NldChMTFZNX1RBUkdFVF9ERUZJTklUSU9OUyBNaXBzLnRkKQorCit0YWJsZWdlbihNaXBzR2VuUmVnaXN0ZXJJbmZvLmguaW5jIC1nZW4tcmVnaXN0ZXItZGVzYy1oZWFkZXIpCit0YWJsZWdlbihNaXBzR2VuUmVnaXN0ZXJOYW1lcy5pbmMgLWdlbi1yZWdpc3Rlci1lbnVtcykKK3RhYmxlZ2VuKE1pcHNHZW5SZWdpc3RlckluZm8uaW5jIC1nZW4tcmVnaXN0ZXItZGVzYykKK3RhYmxlZ2VuKE1pcHNHZW5JbnN0ck5hbWVzLmluYyAtZ2VuLWluc3RyLWVudW1zKQordGFibGVnZW4oTWlwc0dlbkluc3RySW5mby5pbmMgLWdlbi1pbnN0ci1kZXNjKQordGFibGVnZW4oTWlwc0dlbkFzbVdyaXRlci5pbmMgLWdlbi1hc20td3JpdGVyKQordGFibGVnZW4oTWlwc0dlbkRBR0lTZWwuaW5jIC1nZW4tZGFnLWlzZWwpCit0YWJsZWdlbihNaXBzR2VuQ2FsbGluZ0NvbnYuaW5jIC1nZW4tY2FsbGluZ2NvbnYpCit0YWJsZWdlbihNaXBzR2VuU3VidGFyZ2V0LmluYyAtZ2VuLXN1YnRhcmdldCkKKworYWRkX2xsdm1fdGFyZ2V0KE1pcHNDb2RlR2VuCisgIE1pcHNEZWxheVNsb3RGaWxsZXIuY3BwCisgIE1pcHNJbnN0ckluZm8uY3BwCisgIE1pcHNJU2VsREFHVG9EQUcuY3BwCisgIE1pcHNJU2VsTG93ZXJpbmcuY3BwCisgIE1pcHNNQ0FzbUluZm8uY3BwCisgIE1pcHNSZWdpc3RlckluZm8uY3BwCisgIE1pcHNTdWJ0YXJnZXQuY3BwCisgIE1pcHNUYXJnZXRNYWNoaW5lLmNwcAorICBNaXBzVGFyZ2V0T2JqZWN0RmlsZS5jcHAKKyAgTWlwc1NlbGVjdGlvbkRBR0luZm8uY3BwCisgICkKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChMTFZNTWlwc0NvZGVHZW4gTExWTVNlbGVjdGlvbkRBRykKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQ4ZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L01pcHMvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTU1pcHNDb2RlR2VuCitUQVJHRVQgPSBNaXBzCisKKyMgTWFrZSBzdXJlIHRoYXQgdGJsZ2VuIGlzIHJ1biwgZmlyc3QgdGhpbmcuCitCVUlMVF9TT1VSQ0VTID0gTWlwc0dlblJlZ2lzdGVySW5mby5oLmluYyBNaXBzR2VuUmVnaXN0ZXJOYW1lcy5pbmMgXAorICAgICAgICAgICAgICAgIE1pcHNHZW5SZWdpc3RlckluZm8uaW5jIE1pcHNHZW5JbnN0ck5hbWVzLmluYyBcCisgICAgICAgICAgICAgICAgTWlwc0dlbkluc3RySW5mby5pbmMgTWlwc0dlbkFzbVdyaXRlci5pbmMgXAorICAgICAgICAgICAgICAgIE1pcHNHZW5EQUdJU2VsLmluYyBNaXBzR2VuQ2FsbGluZ0NvbnYuaW5jIFwKKyAgICAgICAgICAgICAgICBNaXBzR2VuU3VidGFyZ2V0LmluYworCitESVJTID0gQXNtUHJpbnRlciBUYXJnZXRJbmZvCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YWIwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwcy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LS0gTWlwcy5oIC0gVG9wLWxldmVsIGludGVyZmFjZSBmb3IgTWlwcyByZXByZXNlbnRhdGlvbiAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBlbnRyeSBwb2ludHMgZm9yIGdsb2JhbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiAKKy8vIHRoZSBMTFZNIE1pcHMgYmFjay1lbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBUQVJHRVRfTUlQU19ICisjZGVmaW5lIFRBUkdFVF9NSVBTX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNaXBzVGFyZ2V0TWFjaGluZTsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBjbGFzcyBNYWNoaW5lQ29kZUVtaXR0ZXI7CisgIGNsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKworICBGdW5jdGlvblBhc3MgKmNyZWF0ZU1pcHNJU2VsRGFnKE1pcHNUYXJnZXRNYWNoaW5lICZUTSk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlTWlwc0RlbGF5U2xvdEZpbGxlclBhc3MoTWlwc1RhcmdldE1hY2hpbmUgJlRNKTsKKworICBleHRlcm4gVGFyZ2V0IFRoZU1pcHNUYXJnZXQ7CisgIGV4dGVybiBUYXJnZXQgVGhlTWlwc2VsVGFyZ2V0OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bTsKKworLy8gRGVmaW5lcyBzeW1ib2xpYyBuYW1lcyBmb3IgTWlwcyByZWdpc3RlcnMuICBUaGlzIGRlZmluZXMgYSBtYXBwaW5nIGZyb20KKy8vIHJlZ2lzdGVyIG5hbWUgdG8gcmVnaXN0ZXIgbnVtYmVyLgorI2luY2x1ZGUgIk1pcHNHZW5SZWdpc3Rlck5hbWVzLmluYyIKKworLy8gRGVmaW5lcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIE1pcHMgaW5zdHJ1Y3Rpb25zLgorI2luY2x1ZGUgIk1pcHNHZW5JbnN0ck5hbWVzLmluYyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwcy50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNmUyZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwcy50ZApAQCAtMCwwICsxLDg1IEBACisvLz09PS0gTWlwcy50ZCAtIERlc2NyaWJlIHRoZSBNaXBzIFRhcmdldCBNYWNoaW5lIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLw0KKy8vDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgZW50cnkgcG9pbnQgZm9yIHRoZSBNaXBzIHRhcmdldC4NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gVGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldC50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFJlZ2lzdGVyIEZpbGUsIENhbGxpbmcgQ29udiwgSW5zdHJ1Y3Rpb24gRGVzY3JpcHRpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitpbmNsdWRlICJNaXBzUmVnaXN0ZXJJbmZvLnRkIg0KK2luY2x1ZGUgIk1pcHNTY2hlZHVsZS50ZCINCitpbmNsdWRlICJNaXBzSW5zdHJJbmZvLnRkIg0KK2luY2x1ZGUgIk1pcHNDYWxsaW5nQ29udi50ZCINCisNCitkZWYgTWlwc0luc3RySW5mbyA6IEluc3RySW5mbzsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIE1pcHMgU3VidGFyZ2V0IGZlYXR1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitkZWYgRmVhdHVyZUdQNjRCaXQgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwiZ3A2NCIsICJJc0dQNjRiaXQiLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVycyBhcmUgNjQtYml0IHdpZGUuIj47DQorZGVmIEZlYXR1cmVGUDY0Qml0ICAgICA6IFN1YnRhcmdldEZlYXR1cmU8ImZwNjQiLCAiSXNGUDY0Yml0IiwgInRydWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1cHBvcnQgNjQtYml0IEZQIHJlZ2lzdGVycy4iPjsNCitkZWYgRmVhdHVyZVNpbmdsZUZsb2F0IDogU3VidGFyZ2V0RmVhdHVyZTwic2luZ2xlLWZsb2F0IiwgIklzU2luZ2xlRmxvYXQiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRydWUiLCAiT25seSBzdXBwb3J0cyBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0Ij47DQorZGVmIEZlYXR1cmVNaXBzMSAgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8Im1pcHMxIiwgIk1pcHNBcmNoVmVyc2lvbiIsICJNaXBzMSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlwczEgSVNBIFN1cHBvcnQiPjsNCitkZWYgRmVhdHVyZU1pcHMyICAgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwibWlwczIiLCAiTWlwc0FyY2hWZXJzaW9uIiwgIk1pcHMyIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXBzMiBJU0EgU3VwcG9ydCI+Ow0KK2RlZiBGZWF0dXJlTzMyICAgICAgICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJvMzIiLCAiTWlwc0FCSSIsICJPMzIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBvMzIgQUJJIj47DQorZGVmIEZlYXR1cmVFQUJJICAgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8ImVhYmkiLCAiTWlwc0FCSSIsICJFQUJJIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgZWFiaSBBQkkiPjsNCitkZWYgRmVhdHVyZVZGUFUgICAgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwidmZwdSIsICJIYXNWRlBVIiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ1ZSIsICJFbmFibGUgdmVjdG9yIEZQVSBpbnN0cnVjdGlvbnMuIj47DQorZGVmIEZlYXR1cmVTRUluUmVnICAgICA6IFN1YnRhcmdldEZlYXR1cmU8InNlaW5yZWciLCAiSGFzU0VJblJlZyIsICJ0cnVlIiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlICdzaWduZXh0IGluIHJlZ2lzdGVyJyBpbnN0cnVjdGlvbnMuIj47DQorZGVmIEZlYXR1cmVDb25kTW92ICAgICA6IFN1YnRhcmdldEZlYXR1cmU8ImNvbmRtb3YiLCAiSGFzQ29uZE1vdiIsICJ0cnVlIiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlICdjb25kaXRpb25hbCBtb3ZlJyBpbnN0cnVjdGlvbnMuIj47DQorZGVmIEZlYXR1cmVNdWxEaXZBZGQgICA6IFN1YnRhcmdldEZlYXR1cmU8Im11bGRpdmFkZCIsICJIYXNNdWxEaXZBZGQiLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlICdtdWx0aXBseSBhZGQvc3ViJyBpbnN0cnVjdGlvbnMuIj47DQorZGVmIEZlYXR1cmVNaW5NYXggICAgICA6IFN1YnRhcmdldEZlYXR1cmU8Im1pbm1heCIsICJIYXNNaW5NYXgiLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlICdtaW4vbWF4JyBpbnN0cnVjdGlvbnMuIj47DQorZGVmIEZlYXR1cmVTd2FwICAgICAgICA6IFN1YnRhcmdldEZlYXR1cmU8InN3YXAiLCAiSGFzU3dhcCIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgJ2J5dGUvaGFsZiBzd2FwJyBpbnN0cnVjdGlvbnMuIj47DQorZGVmIEZlYXR1cmVCaXRDb3VudCAgICA6IFN1YnRhcmdldEZlYXR1cmU8ImJpdGNvdW50IiwgIkhhc0JpdENvdW50IiwgInRydWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSAnY291bnQgbGVhZGluZyBiaXRzJyBpbnN0cnVjdGlvbnMuIj47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBNaXBzIHByb2Nlc3NvcnMgc3VwcG9ydGVkLg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorY2xhc3MgUHJvYzxzdHJpbmcgTmFtZSwgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBGZWF0dXJlcz4NCisgOiBQcm9jZXNzb3I8TmFtZSwgTWlwc0dlbmVyaWNJdGluZXJhcmllcywgRmVhdHVyZXM+Ow0KKw0KK2RlZiA6IFByb2M8Im1pcHMxIiwgW0ZlYXR1cmVNaXBzMV0+Ow0KK2RlZiA6IFByb2M8InIyMDAwIiwgW0ZlYXR1cmVNaXBzMV0+Ow0KK2RlZiA6IFByb2M8InIzMDAwIiwgW0ZlYXR1cmVNaXBzMV0+Ow0KKw0KK2RlZiA6IFByb2M8Im1pcHMyIiwgW0ZlYXR1cmVNaXBzMl0+Ow0KK2RlZiA6IFByb2M8InI2MDAwIiwgW0ZlYXR1cmVNaXBzMl0+Ow0KKw0KKy8vIEFsbGVncmV4IGlzIGEgMzJiaXQgc3Vic2V0IG9mIHI0MDAwLCBib3RoIGZvciBpbnRlcmdlciBhbmQgZnAgcmVnaXN0ZXJzLCANCisvLyBidXQgbXVjaCBtb3JlIHNpbWlsYXIgdG8gTWlwczIgdGhhbiBNaXBzMy4gSXQgYWxzbyBjb250YWlucyBzb21lIG9mIA0KKy8vIE1pcHMzMi9NaXBzMzJyMiBpbnN0cnVjdGlvbnMgYW5kIGEgY3VzdG9tIHZlY3RvciBmcHUgcHJvY2Vzc29yLiANCitkZWYgOiBQcm9jPCJhbGxlZ3JleCIsIFtGZWF0dXJlTWlwczIsIEZlYXR1cmVTaW5nbGVGbG9hdCwgRmVhdHVyZUVBQkksIA0KKyAgICAgIEZlYXR1cmVWRlBVLCBGZWF0dXJlU0VJblJlZywgRmVhdHVyZUNvbmRNb3YsIEZlYXR1cmVNdWxEaXZBZGQsDQorICAgICAgRmVhdHVyZU1pbk1heCwgRmVhdHVyZVN3YXAsIEZlYXR1cmVCaXRDb3VudF0+Ow0KKw0KK2RlZiBNaXBzIDogVGFyZ2V0IHsNCisgIGxldCBJbnN0cnVjdGlvblNldCA9IE1pcHNJbnN0ckluZm87DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzQ2FsbGluZ0NvbnYudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0NhbGxpbmdDb252LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjY4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0NhbGxpbmdDb252LnRkCkBAIC0wLDAgKzEsODYgQEAKKy8vPT09LSBNaXBzQ2FsbGluZ0NvbnYudGQgLSBDYWxsaW5nIENvbnZlbnRpb25zIGZvciBNaXBzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gVGhpcyBkZXNjcmliZXMgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIE1pcHMgYXJjaGl0ZWN0dXJlLg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8vIENDSWZTdWJ0YXJnZXQgLSBNYXRjaCBpZiB0aGUgY3VycmVudCBzdWJ0YXJnZXQgaGFzIGEgZmVhdHVyZSBGLg0KK2NsYXNzIENDSWZTdWJ0YXJnZXQ8c3RyaW5nIEYsIENDQWN0aW9uIEE+OiANCisgIENDSWY8IXN0cmNvbmNhdCgiU3RhdGUuZ2V0VGFyZ2V0KCkuZ2V0U3VidGFyZ2V0PE1pcHNTdWJ0YXJnZXQ+KCkuIiwgRiksIEE+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTWlwcyBPMzIgQ2FsbGluZyBDb252ZW50aW9uDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBPbmx5IHRoZSByZXR1cm4gcnVsZXMgYXJlIGRlZmluZWQgaGVyZSBmb3IgTzMyLiBUaGUgcnVsZXMgZm9yIGFyZ3VtZW50IA0KKy8vIHBhc3NpbmcgYXJlIGRlZmluZWQgaW4gTWlwc0lTZWxMb3dlcmluZy5jcHAuDQorZGVmIFJldENDX01pcHNPMzIgOiBDYWxsaW5nQ29udjxbDQorICAvLyBpMzIgYXJlIHJldHVybmVkIGluIHJlZ2lzdGVycyBWMCwgVjENCisgIENDSWZUeXBlPFtpMzJdLCBDQ0Fzc2lnblRvUmVnPFtWMCwgVjFdPj4sDQorDQorICAvLyBmMzIgYXJlIHJldHVybmVkIGluIHJlZ2lzdGVycyBGMCwgRjINCisgIENDSWZUeXBlPFtmMzJdLCBDQ0Fzc2lnblRvUmVnPFtGMCwgRjJdPj4sDQorDQorICAvLyBmNjQgYXJlIHJldHVybmVkIGluIHJlZ2lzdGVyIEQwLCBEMQ0KKyAgQ0NJZlR5cGU8W2Y2NF0sIENDSWZTdWJ0YXJnZXQ8ImlzTm90U2luZ2xlRmxvYXQoKSIsIENDQXNzaWduVG9SZWc8W0QwLCBEMV0+Pj4NCitdPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIE1pcHMgRUFCSSBDYWxsaW5nIENvbnZlbnRpb24NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2RlZiBDQ19NaXBzRUFCSSA6IENhbGxpbmdDb252PFsNCisgIC8vIFByb21vdGUgaTgvaTE2IGFyZ3VtZW50cyB0byBpMzIuDQorICBDQ0lmVHlwZTxbaTgsIGkxNl0sIENDUHJvbW90ZVRvVHlwZTxpMzI+PiwNCisNCisgIC8vIEludGVnZXIgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnMuDQorICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbQTAsIEExLCBBMiwgQTMsIFQwLCBUMSwgVDIsIFQzXT4+LA0KKw0KKyAgLy8gU2luZ2xlIGZwIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIHBhaXJzIHdpdGhpbiAzMi1iaXQgbW9kZSANCisgIENDSWZUeXBlPFtmMzJdLCBDQ0lmU3VidGFyZ2V0PCJpc1NpbmdsZUZsb2F0KCkiLCANCisgICAgICAgICAgICAgICAgICBDQ0Fzc2lnblRvUmVnPFtGMTIsIEYxMywgRjE0LCBGMTUsIEYxNiwgRjE3LCBGMTgsIEYxOV0+Pj4sDQorDQorICBDQ0lmVHlwZTxbZjMyXSwgQ0NJZlN1YnRhcmdldDwiaXNOb3RTaW5nbGVGbG9hdCgpIiwgDQorICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25Ub1JlZzxbRjEyLCBGMTQsIEYxNiwgRjE4XT4+PiwNCisNCisgIC8vIFRoZSBmaXJzdCA0IGRvdWJsIGZwIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIHNpbmdsZSBmcCByZWdpc3RlcnMuDQorICBDQ0lmVHlwZTxbZjY0XSwgQ0NJZlN1YnRhcmdldDwiaXNOb3RTaW5nbGVGbG9hdCgpIiwgDQorICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25Ub1JlZzxbRDYsIEQ3LCBEOCwgRDldPj4+LA0KKw0KKyAgLy8gSW50ZWdlciB2YWx1ZXMgZ2V0IHN0b3JlZCBpbiBzdGFjayBzbG90cyB0aGF0IGFyZSA0IGJ5dGVzIGluDQorICAvLyBzaXplIGFuZCA0LWJ5dGUgYWxpZ25lZC4NCisgIENDSWZUeXBlPFtpMzIsIGYzMl0sIENDQXNzaWduVG9TdGFjazw0LCA0Pj4sDQorDQorICAvLyBJbnRlZ2VyIHZhbHVlcyBnZXQgc3RvcmVkIGluIHN0YWNrIHNsb3RzIHRoYXQgYXJlIDggYnl0ZXMgaW4NCisgIC8vIHNpemUgYW5kIDgtYnl0ZSBhbGlnbmVkLg0KKyAgQ0NJZlR5cGU8W2Y2NF0sIENDSWZTdWJ0YXJnZXQ8ImlzTm90U2luZ2xlRmxvYXQoKSIsIENDQXNzaWduVG9TdGFjazw4LCA4Pj4+DQorXT47DQorDQorZGVmIFJldENDX01pcHNFQUJJIDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gaTMyIGFyZSByZXR1cm5lZCBpbiByZWdpc3RlcnMgVjAsIFYxDQorICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbVjAsIFYxXT4+LA0KKw0KKyAgLy8gZjMyIGFyZSByZXR1cm5lZCBpbiByZWdpc3RlcnMgRjAsIEYxDQorICBDQ0lmVHlwZTxbZjMyXSwgQ0NBc3NpZ25Ub1JlZzxbRjAsIEYxXT4+LA0KKw0KKyAgLy8gZjY0IGFyZSByZXR1cm5lZCBpbiByZWdpc3RlciBEMA0KKyAgQ0NJZlR5cGU8W2Y2NF0sIENDSWZTdWJ0YXJnZXQ8ImlzTm90U2luZ2xlRmxvYXQoKSIsIENDQXNzaWduVG9SZWc8W0QwXT4+Pg0KK10+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTWlwcyBDYWxsaW5nIENvbnZlbnRpb24gRGlzcGF0Y2gNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2RlZiBDQ19NaXBzIDogQ2FsbGluZ0NvbnY8Ww0KKyAgQ0NJZlN1YnRhcmdldDwiaXNBQklfRUFCSSgpIiwgQ0NEZWxlZ2F0ZVRvPENDX01pcHNFQUJJPj4NCitdPjsNCisNCitkZWYgUmV0Q0NfTWlwcyA6IENhbGxpbmdDb252PFsNCisgIENDSWZTdWJ0YXJnZXQ8ImlzQUJJX0VBQkkoKSIsIENDRGVsZWdhdGVUbzxSZXRDQ19NaXBzRUFCST4+LA0KKyAgQ0NEZWxlZ2F0ZVRvPFJldENDX01pcHNPMzI+DQorXT47DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNEZWxheVNsb3RGaWxsZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNEZWxheVNsb3RGaWxsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2VhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0RlbGF5U2xvdEZpbGxlci5jcHAKQEAgLTAsMCArMSw3NyBAQAorLy89PT0tLSBEZWxheVNsb3RGaWxsZXIuY3BwIC0gTWlwcyBkZWxheSBzbG90IGZpbGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFNpbXBsZSBwYXNzIHRvIGZpbGxzIGRlbGF5IHNsb3RzIHdpdGggTk9Qcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImRlbGF5LXNsb3QtZmlsbGVyIgorCisjaW5jbHVkZSAiTWlwcy5oIgorI2luY2x1ZGUgIk1pcHNUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKEZpbGxlZFNsb3RzLCAiTnVtYmVyIG9mIGRlbGF5IHNsb3RzIGZpbGxlZCIpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRmlsbGVyIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworCisgICAgVGFyZ2V0TWFjaGluZSAmVE07CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBGaWxsZXIoVGFyZ2V0TWFjaGluZSAmdG0pIAorICAgICAgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwgVE0odG0pLCBUSUkodG0uZ2V0SW5zdHJJbmZvKCkpIHsgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiTWlwcyBEZWxheSBTbG90IEZpbGxlciI7CisgICAgfQorCisgICAgYm9vbCBydW5Pbk1hY2hpbmVCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworICAgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSB7CisgICAgICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgICAgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBGSSA9IEYuYmVnaW4oKSwgRkUgPSBGLmVuZCgpOworICAgICAgICAgICBGSSAhPSBGRTsgKytGSSkKKyAgICAgICAgQ2hhbmdlZCB8PSBydW5Pbk1hY2hpbmVCYXNpY0Jsb2NrKCpGSSk7CisgICAgICByZXR1cm4gQ2hhbmdlZDsKKyAgICB9CisKKyAgfTsKKyAgY2hhciBGaWxsZXI6OklEID0gMDsKK30gLy8gZW5kIG9mIGFub255bW91cyBuYW1lc3BhY2UKKworLy8vIHJ1bk9uTWFjaGluZUJhc2ljQmxvY2sgLSBGaWxsIGluIGRlbGF5IHNsb3RzIGZvciB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisvLy8gQ3VycmVudGx5LCB3ZSBmaWxsIGRlbGF5IHNsb3RzIHdpdGggTk9Qcy4gV2UgYXNzdW1lIHRoZXJlIGlzIG9ubHkgb25lCisvLy8gZGVsYXkgc2xvdCBwZXIgZGVsYXllZCBpbnN0cnVjdGlvbi4KK2Jvb2wgRmlsbGVyOjoKK3J1bk9uTWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgCit7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLmJlZ2luKCk7IEkgIT0gTUJCLmVuZCgpOyArK0kpCisgICAgaWYgKEktPmdldERlc2MoKS5oYXNEZWxheVNsb3QoKSkgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEogPSBJOworICAgICAgKytKOworICAgICAgQnVpbGRNSShNQkIsIEosIEktPmdldERlYnVnTG9jKCksIFRJSS0+Z2V0KE1pcHM6Ok5PUCkpOworICAgICAgKytGaWxsZWRTbG90czsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBjcmVhdGVNaXBzRGVsYXlTbG90RmlsbGVyUGFzcyAtIFJldHVybnMgYSBwYXNzIHRoYXQgZmlsbHMgaW4gZGVsYXkKKy8vLyBzbG90cyBpbiBNaXBzIE1hY2hpbmVGdW5jdGlvbnMKK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlTWlwc0RlbGF5U2xvdEZpbGxlclBhc3MoTWlwc1RhcmdldE1hY2hpbmUgJnRtKSB7CisgIHJldHVybiBuZXcgRmlsbGVyKHRtKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJU2VsREFHVG9EQUcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJU2VsREFHVG9EQUcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODhiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0lTZWxEQUdUb0RBRy5jcHAKQEAgLTAsMCArMSw1MzUgQEAKKy8vPT09LS0gTWlwc0lTZWxEQUdUb0RBRy5jcHAgLSBBIGRhZyB0byBkYWcgaW5zdCBzZWxlY3RvciBmb3IgTWlwcyAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgZm9yIHRoZSBNSVBTIHRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgIm1pcHMtaXNlbCIKKyNpbmNsdWRlICJNaXBzLmgiCisjaW5jbHVkZSAiTWlwc01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgIk1pcHNSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJNaXBzU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiTWlwc1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gU2VsZWN0b3IgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNaXBzREFHVG9EQUdJU2VsIC0gTUlQUyBzcGVjaWZpYyBjb2RlIHRvIHNlbGVjdCBNSVBTIG1hY2hpbmUKKy8vIGluc3RydWN0aW9ucyBmb3IgU2VsZWN0aW9uREFHIG9wZXJhdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworbmFtZXNwYWNlIHsKKworY2xhc3MgTWlwc0RBR1RvREFHSVNlbCA6IHB1YmxpYyBTZWxlY3Rpb25EQUdJU2VsIHsKKworICAvLy8gVE0gLSBLZWVwIGEgcmVmZXJlbmNlIHRvIE1pcHNUYXJnZXRNYWNoaW5lLgorICBNaXBzVGFyZ2V0TWFjaGluZSAmVE07CisKKyAgLy8vIFN1YnRhcmdldCAtIEtlZXAgYSBwb2ludGVyIHRvIHRoZSBNaXBzU3VidGFyZ2V0IGFyb3VuZCBzbyB0aGF0IHdlIGNhbgorICAvLy8gbWFrZSB0aGUgcmlnaHQgZGVjaXNpb24gd2hlbiBnZW5lcmF0aW5nIGNvZGUgZm9yIGRpZmZlcmVudCB0YXJnZXRzLgorICBjb25zdCBNaXBzU3VidGFyZ2V0ICZTdWJ0YXJnZXQ7CisgCitwdWJsaWM6CisgIGV4cGxpY2l0IE1pcHNEQUdUb0RBR0lTZWwoTWlwc1RhcmdldE1hY2hpbmUgJnRtKSA6CisgIFNlbGVjdGlvbkRBR0lTZWwodG0pLAorICBUTSh0bSksIFN1YnRhcmdldCh0bS5nZXRTdWJ0YXJnZXQ8TWlwc1N1YnRhcmdldD4oKSkge30KKyAgCisgIC8vIFBhc3MgTmFtZQorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiTUlQUyBEQUctPkRBRyBQYXR0ZXJuIEluc3RydWN0aW9uIFNlbGVjdGlvbiI7CisgIH0gCisgIAorCitwcml2YXRlOiAgCisgIC8vIEluY2x1ZGUgdGhlIHBpZWNlcyBhdXRvZ2VuZXJhdGVkIGZyb20gdGhlIHRhcmdldCBkZXNjcmlwdGlvbi4KKyAgI2luY2x1ZGUgIk1pcHNHZW5EQUdJU2VsLmluYyIKKworICAvLy8gZ2V0VGFyZ2V0TWFjaGluZSAtIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgVGFyZ2V0TWFjaGluZSwgY2FzdGVkCisgIC8vLyB0byB0aGUgdGFyZ2V0LXNwZWNpZmljIHR5cGUuCisgIGNvbnN0IE1pcHNUYXJnZXRNYWNoaW5lICZnZXRUYXJnZXRNYWNoaW5lKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBNaXBzVGFyZ2V0TWFjaGluZSAmPihUTSk7CisgIH0KKworICAvLy8gZ2V0SW5zdHJJbmZvIC0gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBUYXJnZXRJbnN0ckluZm8sIGNhc3RlZAorICAvLy8gdG8gdGhlIHRhcmdldC1zcGVjaWZpYyB0eXBlLgorICBjb25zdCBNaXBzSW5zdHJJbmZvICpnZXRJbnN0ckluZm8oKSB7CisgICAgcmV0dXJuIGdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKyAgfQorCisgIFNETm9kZSAqZ2V0R2xvYmFsQmFzZVJlZygpOworICBTRE5vZGUgKlNlbGVjdChTRE5vZGUgKk4pOworCisgIC8vIENvbXBsZXggUGF0dGVybi4KKyAgYm9vbCBTZWxlY3RBZGRyKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgCisgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZPZmZzZXQpOworCisgIFNETm9kZSAqU2VsZWN0TG9hZEZwNjQoU0ROb2RlICpOKTsKKyAgU0ROb2RlICpTZWxlY3RTdG9yZUZwNjQoU0ROb2RlICpOKTsKKworICAvLyBnZXRJMzJJbW0gLSBSZXR1cm4gYSB0YXJnZXQgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vIHZhbHVlLCBvZiB0eXBlIGkzMi4KKyAgaW5saW5lIFNEVmFsdWUgZ2V0STMySW1tKHVuc2lnbmVkIEltbSkgeworICAgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEltbSwgTVZUOjppMzIpOworICB9Cit9OworCit9CisKKworLy8vIGdldEdsb2JhbEJhc2VSZWcgLSBPdXRwdXQgdGhlIGluc3RydWN0aW9ucyByZXF1aXJlZCB0byBwdXQgdGhlCisvLy8gR09UIGFkZHJlc3MgaW50byBhIHJlZ2lzdGVyLgorU0ROb2RlICpNaXBzREFHVG9EQUdJU2VsOjpnZXRHbG9iYWxCYXNlUmVnKCkgeworICB1bnNpZ25lZCBHbG9iYWxCYXNlUmVnID0gZ2V0SW5zdHJJbmZvKCktPmdldEdsb2JhbEJhc2VSZWcoTUYpOworICByZXR1cm4gQ3VyREFHLT5nZXRSZWdpc3RlcihHbG9iYWxCYXNlUmVnLCBUTEkuZ2V0UG9pbnRlclR5KCkpLmdldE5vZGUoKTsKK30KKworLy8vIENvbXBsZXhQYXR0ZXJuIHVzZWQgb24gTWlwc0luc3RySW5mbworLy8vIFVzZWQgb24gTWlwcyBMb2FkL1N0b3JlIGluc3RydWN0aW9ucworYm9vbCBNaXBzREFHVG9EQUdJU2VsOjoKK1NlbGVjdEFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBBZGRyLCBTRFZhbHVlICZPZmZzZXQsIFNEVmFsdWUgJkJhc2UpCit7CisgIC8vIGlmIEFkZHJlc3MgaXMgRkksIGdldCB0aGUgVGFyZ2V0RnJhbWVJbmRleC4KKyAgaWYgKEZyYW1lSW5kZXhTRE5vZGUgKkZJTiA9IGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KEFkZHIpKSB7CisgICAgQmFzZSAgID0gQ3VyREFHLT5nZXRUYXJnZXRGcmFtZUluZGV4KEZJTi0+Z2V0SW5kZXgoKSwgTVZUOjppMzIpOworICAgIE9mZnNldCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIHJldHVybiB0cnVlOworICB9CisgICAgCisgIC8vIG9uIFBJQyBjb2RlIExvYWQgR0EKKyAgaWYgKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKSB7CisgICAgaWYgKChBZGRyLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsQWRkcmVzcykgfHwgCisgICAgICAgIChBZGRyLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnRQb29sKSB8fCAKKyAgICAgICAgKEFkZHIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRKdW1wVGFibGUpKXsKKyAgICAgIEJhc2UgICA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoTWlwczo6R1AsIE1WVDo6aTMyKTsKKyAgICAgIE9mZnNldCA9IEFkZHI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKChBZGRyLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0RXh0ZXJuYWxTeW1ib2wgfHwKKyAgICAgICAgQWRkci5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9ICAgIAorICAKKyAgLy8gT3BlcmFuZCBpcyBhIHJlc3VsdCBmcm9tIGFuIEFERC4KKyAgaWYgKEFkZHIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQpIHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNOID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KEFkZHIuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIGlmIChQcmVkaWNhdGVfaW1tU0V4dDE2KENOKSkgeworCisgICAgICAgIC8vIElmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGEgRkksIGdldCB0aGUgVGFyZ2V0RkkgTm9kZQorICAgICAgICBpZiAoRnJhbWVJbmRleFNETm9kZSAqRklOID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBZGRyLmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSU4tPmdldEluZGV4KCksIE1WVDo6aTMyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBCYXNlID0gQWRkci5nZXRPcGVyYW5kKDApOworICAgICAgICB9CisKKyAgICAgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChDTi0+Z2V0WkV4dFZhbHVlKCksIE1WVDo6aTMyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gV2hlbiBsb2FkaW5nIGZyb20gY29uc3RhbnQgcG9vbHMsIGxvYWQgdGhlIGxvd2VyIGFkZHJlc3MgcGFydCBpbgorICAgIC8vIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuIEV4YW1wbGUsIGluc3RlYWQgb2Y6CisgICAgLy8gIGx1aSAkMiwgJWhpKCRDUEkxXzApCisgICAgLy8gIGFkZGl1ICQyLCAkMiwgJWxvKCRDUEkxXzApCisgICAgLy8gIGx3YzEgJGYwLCAwKCQyKQorICAgIC8vIEdlbmVyYXRlOgorICAgIC8vICBsdWkgJDIsICVoaSgkQ1BJMV8wKQorICAgIC8vICBsd2MxICRmMCwgJWxvKCRDUEkxXzApKCQyKQorICAgIGlmICgoQWRkci5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IE1pcHNJU0Q6OkhpIHx8IAorICAgICAgICAgQWRkci5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6TE9BRCkgJiYKKyAgICAgICAgQWRkci5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IE1pcHNJU0Q6OkxvKSB7CisgICAgICBTRFZhbHVlIExvVmFsID0gQWRkci5nZXRPcGVyYW5kKDEpOyAKKyAgICAgIGlmIChkeW5fY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KExvVmFsLmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgIEJhc2UgPSBBZGRyLmdldE9wZXJhbmQoMCk7CisgICAgICAgIE9mZnNldCA9IExvVmFsLmdldE9wZXJhbmQoMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEJhc2UgICA9IEFkZHI7CisgIE9mZnNldCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICByZXR1cm4gdHJ1ZTsKK30KKworU0ROb2RlICpNaXBzREFHVG9EQUdJU2VsOjpTZWxlY3RMb2FkRnA2NChTRE5vZGUgKk4pIHsKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgTlZUID0gCisgICAgTi0+Z2V0VmFsdWVUeXBlKDApLmdldFNpbXBsZVZUKCkuU2ltcGxlVHk7CisKKyAgaWYgKCFTdWJ0YXJnZXQuaXNNaXBzMSgpIHx8IE5WVCAhPSBNVlQ6OmY2NCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIVByZWRpY2F0ZV91bmluZGV4ZWRsb2FkKE4pIHx8CisgICAgICAhUHJlZGljYXRlX2xvYWQoTikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgU0RWYWx1ZSBDaGFpbiA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIE9mZnNldDAsIE9mZnNldDEsIEJhc2U7CisKKyAgaWYgKCFTZWxlY3RBZGRyKE4sIE4xLCBPZmZzZXQwLCBCYXNlKSB8fAorICAgICAgTjEuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjppMzIpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgTWFjaGluZVNETm9kZTo6bW1vX2l0ZXJhdG9yIE1lbVJlZnMwID0gTUYtPmFsbG9jYXRlTWVtUmVmc0FycmF5KDEpOworICBNZW1SZWZzMFswXSA9IGNhc3Q8TWVtU0ROb2RlPihOKS0+Z2V0TWVtT3BlcmFuZCgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgLy8gVGhlIHNlY29uZCBsb2FkIHNob3VsZCBzdGFydCBhZnRlciBmb3IgNCBieXRlcy4gCisgIGlmIChDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPZmZzZXQwKSkKKyAgICBPZmZzZXQxID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChDLT5nZXRTRXh0VmFsdWUoKSs0LCBNVlQ6OmkzMik7CisgIGVsc2UgaWYgKENvbnN0YW50UG9vbFNETm9kZSAqQ1AgPSBkeW5fY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KE9mZnNldDApKQorICAgIE9mZnNldDEgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50UG9vbChDUC0+Z2V0Q29uc3RWYWwoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTMyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1AtPmdldEFsaWdubWVudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1AtPmdldE9mZnNldCgpKzQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUC0+Z2V0VGFyZ2V0RmxhZ3MoKSk7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKworICAvLyBDaG9vc2UgdGhlIG9mZnNldHMgZGVwZW5kaW5nIG9uIHRoZSBlbmRpYW5lc3MKKyAgaWYgKFRNLmdldFRhcmdldERhdGEoKS0+aXNCaWdFbmRpYW4oKSkKKyAgICBzdGQ6OnN3YXAoT2Zmc2V0MCwgT2Zmc2V0MSk7CisKKyAgLy8gSW5zdGVhZCBvZjoKKyAgLy8gICAgbGRjICRmMCwgWCgkMykKKyAgLy8gR2VuZXJhdGU6CisgIC8vICAgIGx3YyAkZjAsIFgoJDMpCisgIC8vICAgIGx3YyAkZjEsIFgrNCgkMykKKyAgU0ROb2RlICpMRDAgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE1pcHM6OkxXQzEsIGRsLCBNVlQ6OmYzMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBPZmZzZXQwLCBCYXNlLCBDaGFpbik7CisgIFNEVmFsdWUgVW5kZWYgPSBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIE5WVCksIDApOworICBTRFZhbHVlIEkwID0gQ3VyREFHLT5nZXRUYXJnZXRJbnNlcnRTdWJyZWcoTWlwczo6c3ViX2ZwZXZlbiwgZGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6ZjY0LCBVbmRlZiwgU0RWYWx1ZShMRDAsIDApKTsKKworICBTRE5vZGUgKkxEMSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTWlwczo6TFdDMSwgZGwsIE1WVDo6ZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBPZmZzZXQxLCBCYXNlLCBTRFZhbHVlKExEMCwgMSkpOworICBTRFZhbHVlIEkxID0gQ3VyREFHLT5nZXRUYXJnZXRJbnNlcnRTdWJyZWcoTWlwczo6c3ViX2Zwb2RkLCBkbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmNjQsIEkwLCBTRFZhbHVlKExEMSwgMCkpOworCisgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTiwgMCksIEkxKTsKKyAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOLCAxKSwgQ2hhaW4pOworICBjYXN0PE1hY2hpbmVTRE5vZGU+KExEMCktPnNldE1lbVJlZnMoTWVtUmVmczAsIE1lbVJlZnMwICsgMSk7CisgIGNhc3Q8TWFjaGluZVNETm9kZT4oTEQxKS0+c2V0TWVtUmVmcyhNZW1SZWZzMCwgTWVtUmVmczAgKyAxKTsKKyAgcmV0dXJuIEkxLmdldE5vZGUoKTsKK30KKworU0ROb2RlICpNaXBzREFHVG9EQUdJU2VsOjpTZWxlY3RTdG9yZUZwNjQoU0ROb2RlICpOKSB7CisKKyAgaWYgKCFTdWJ0YXJnZXQuaXNNaXBzMSgpIHx8IAorICAgICAgTi0+Z2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6OmY2NCkKKyAgICByZXR1cm4gTlVMTDsKKworICBTRFZhbHVlIENoYWluID0gTi0+Z2V0T3BlcmFuZCgwKTsKKworICBpZiAoIVByZWRpY2F0ZV91bmluZGV4ZWRzdG9yZShOKSB8fAorICAgICAgIVByZWRpY2F0ZV9zdG9yZShOKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBTRFZhbHVlIE4xID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBOMiA9IE4tPmdldE9wZXJhbmQoMik7CisgIFNEVmFsdWUgT2Zmc2V0MCwgT2Zmc2V0MSwgQmFzZTsKKworICBpZiAoIVNlbGVjdEFkZHIoTiwgTjIsIE9mZnNldDAsIEJhc2UpIHx8CisgICAgICBOMS5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6OmY2NCB8fAorICAgICAgTjIuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjppMzIpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgTWFjaGluZVNETm9kZTo6bW1vX2l0ZXJhdG9yIE1lbVJlZnMwID0gTUYtPmFsbG9jYXRlTWVtUmVmc0FycmF5KDEpOworICBNZW1SZWZzMFswXSA9IGNhc3Q8TWVtU0ROb2RlPihOKS0+Z2V0TWVtT3BlcmFuZCgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgLy8gR2V0IHRoZSBldmVuIGFuZCBvZGQgcGFydCBmcm9tIHRoZSBmNjQgcmVnaXN0ZXIKKyAgU0RWYWx1ZSBGUE9kZCA9IEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhNaXBzOjpzdWJfZnBvZGQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBNVlQ6OmYzMiwgTjEpOworICBTRFZhbHVlIEZQRXZlbiA9IEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhNaXBzOjpzdWJfZnBldmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBNVlQ6OmYzMiwgTjEpOworCisgIC8vIFRoZSBzZWNvbmQgc3RvcmUgc2hvdWxkIHN0YXJ0IGFmdGVyIGZvciA0IGJ5dGVzLiAKKyAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9mZnNldDApKQorICAgIE9mZnNldDEgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEMtPmdldFNFeHRWYWx1ZSgpKzQsIE1WVDo6aTMyKTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworCisgIC8vIENob29zZSB0aGUgb2Zmc2V0cyBkZXBlbmRpbmcgb24gdGhlIGVuZGlhbmVzcworICBpZiAoVE0uZ2V0VGFyZ2V0RGF0YSgpLT5pc0JpZ0VuZGlhbigpKQorICAgIHN0ZDo6c3dhcChPZmZzZXQwLCBPZmZzZXQxKTsKKworICAvLyBJbnN0ZWFkIG9mOgorICAvLyAgICBzZGMgJGYwLCBYKCQzKQorICAvLyBHZW5lcmF0ZToKKyAgLy8gICAgc3djICRmMCwgWCgkMykKKyAgLy8gICAgc3djICRmMSwgWCs0KCQzKQorICBTRFZhbHVlIE9wczBbXSA9IHsgRlBFdmVuLCBPZmZzZXQwLCBCYXNlLCBDaGFpbiB9OworICBDaGFpbiA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShNaXBzOjpTV0MxLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsIE9wczAsIDQpLCAwKTsKKyAgY2FzdDxNYWNoaW5lU0ROb2RlPihDaGFpbi5nZXROb2RlKCkpLT5zZXRNZW1SZWZzKE1lbVJlZnMwLCBNZW1SZWZzMCArIDEpOworCisgIFNEVmFsdWUgT3BzMVtdID0geyBGUE9kZCwgT2Zmc2V0MSwgQmFzZSwgQ2hhaW4gfTsKKyAgQ2hhaW4gPSBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTWlwczo6U1dDMSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBPcHMxLCA0KSwgMCk7CisgIGNhc3Q8TWFjaGluZVNETm9kZT4oQ2hhaW4uZ2V0Tm9kZSgpKS0+c2V0TWVtUmVmcyhNZW1SZWZzMCwgTWVtUmVmczAgKyAxKTsKKworICBSZXBsYWNlVXNlcyhTRFZhbHVlKE4sIDApLCBDaGFpbik7CisgIHJldHVybiBDaGFpbi5nZXROb2RlKCk7Cit9CisKKy8vLyBTZWxlY3QgaW5zdHJ1Y3Rpb25zIG5vdCBjdXN0b21pemVkISBVc2VkIGZvcgorLy8vIGV4cGFuZGVkLCBwcm9tb3RlZCBhbmQgbm9ybWFsIGluc3RydWN0aW9ucworU0ROb2RlKiBNaXBzREFHVG9EQUdJU2VsOjpTZWxlY3QoU0ROb2RlICpOb2RlKSB7CisgIHVuc2lnbmVkIE9wY29kZSA9IE5vZGUtPmdldE9wY29kZSgpOworICBEZWJ1Z0xvYyBkbCA9IE5vZGUtPmdldERlYnVnTG9jKCk7CisKKyAgLy8gRHVtcCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTm9kZSBiZWluZyBzZWxlY3RlZAorICBERUJVRyhlcnJzKCkgPDwgIlNlbGVjdGluZzogIjsgTm9kZS0+ZHVtcChDdXJEQUcpOyBlcnJzKCkgPDwgIlxuIik7CisKKyAgLy8gSWYgd2UgaGF2ZSBhIGN1c3RvbSBub2RlLCB3ZSBhbHJlYWR5IGhhdmUgc2VsZWN0ZWQhCisgIGlmIChOb2RlLT5pc01hY2hpbmVPcGNvZGUoKSkgeworICAgIERFQlVHKGVycnMoKSA8PCAiPT0gIjsgTm9kZS0+ZHVtcChDdXJEQUcpOyBlcnJzKCkgPDwgIlxuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLy8KKyAgLy8gSW5zdHJ1Y3Rpb24gU2VsZWN0aW9uIG5vdCBoYW5kbGVkIGJ5IHRoZSBhdXRvLWdlbmVyYXRlZCAKKyAgLy8gdGFibGVnZW4gc2VsZWN0aW9uIHNob3VsZCBiZSBoYW5kbGVkIGhlcmUuCisgIC8vLyAKKyAgc3dpdGNoKE9wY29kZSkgeworCisgICAgZGVmYXVsdDogYnJlYWs7CisKKyAgICBjYXNlIElTRDo6U1VCRTogCisgICAgY2FzZSBJU0Q6OkFEREU6IHsKKyAgICAgIFNEVmFsdWUgSW5GbGFnID0gTm9kZS0+Z2V0T3BlcmFuZCgyKSwgQ21wTEhTOworICAgICAgdW5zaWduZWQgT3BjID0gSW5GbGFnLmdldE9wY29kZSgpOyBPcGM9T3BjOworICAgICAgYXNzZXJ0KCgoT3BjID09IElTRDo6QUREQyB8fCBPcGMgPT0gSVNEOjpBRERFKSB8fCAKKyAgICAgICAgICAgICAgKE9wYyA9PSBJU0Q6OlNVQkMgfHwgT3BjID09IElTRDo6U1VCRSkpICYmICAKKyAgICAgICAgICAgICAiKEFERHxTVUIpRSBmbGFnIG9wZXJhbmQgbXVzdCBjb21lIGZyb20gKEFERHxTVUIpQy9FIGluc24iKTsKKworICAgICAgdW5zaWduZWQgTU9wOworICAgICAgaWYgKE9wY29kZSA9PSBJU0Q6OkFEREUpIHsKKyAgICAgICAgQ21wTEhTID0gSW5GbGFnLmdldFZhbHVlKDApOworICAgICAgICBNT3AgPSBNaXBzOjpBRER1OworICAgICAgfSBlbHNlIHsgCisgICAgICAgIENtcExIUyA9IEluRmxhZy5nZXRPcGVyYW5kKDApOworICAgICAgICBNT3AgPSBNaXBzOjpTVUJ1OworICAgICAgfQorCisgICAgICBTRFZhbHVlIE9wc1tdID0geyBDbXBMSFMsIEluRmxhZy5nZXRPcGVyYW5kKDEpIH07CisKKyAgICAgIFNEVmFsdWUgTEhTID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIFNEVmFsdWUgUkhTID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKworICAgICAgRVZUIFZUID0gTEhTLmdldFZhbHVlVHlwZSgpOworICAgICAgU0ROb2RlICpDYXJyeSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTWlwczo6U0xUdSwgZGwsIFZULCBPcHMsIDIpOworICAgICAgU0ROb2RlICpBZGRDYXJyeSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTWlwczo6QUREdSwgZGwsIFZULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoQ2FycnksMCksIFJIUyk7CisKKyAgICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOb2RlLCBNT3AsIFZULCBNVlQ6OkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTLCBTRFZhbHVlKEFkZENhcnJ5LDApKTsKKyAgICB9CisKKyAgICAvLy8gTXVsL0RpdiB3aXRoIHR3byByZXN1bHRzCisgICAgY2FzZSBJU0Q6OlNESVZSRU06CisgICAgY2FzZSBJU0Q6OlVESVZSRU06CisgICAgY2FzZSBJU0Q6OlNNVUxfTE9ISToKKyAgICBjYXNlIElTRDo6VU1VTF9MT0hJOiB7CisgICAgICBTRFZhbHVlIE9wMSA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgICAgICBTRFZhbHVlIE9wMiA9IE5vZGUtPmdldE9wZXJhbmQoMSk7CisKKyAgICAgIHVuc2lnbmVkIE9wOworICAgICAgaWYgKE9wY29kZSA9PSBJU0Q6OlVNVUxfTE9ISSB8fCBPcGNvZGUgPT0gSVNEOjpTTVVMX0xPSEkpCisgICAgICAgIE9wID0gKE9wY29kZSA9PSBJU0Q6OlVNVUxfTE9ISSA/IE1pcHM6Ok1VTFR1IDogTWlwczo6TVVMVCk7CisgICAgICBlbHNlCisgICAgICAgIE9wID0gKE9wY29kZSA9PSBJU0Q6OlVESVZSRU0gPyBNaXBzOjpESVZ1IDogTWlwczo6RElWKTsKKworICAgICAgU0ROb2RlICpNdWxEaXYgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wLCBkbCwgTVZUOjpGbGFnLCBPcDEsIE9wMik7CisKKyAgICAgIFNEVmFsdWUgSW5GbGFnID0gU0RWYWx1ZShNdWxEaXYsIDApOworICAgICAgU0ROb2RlICpMbyA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTWlwczo6TUZMTywgZGwsIE1WVDo6aTMyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6RmxhZywgSW5GbGFnKTsKKyAgICAgIEluRmxhZyA9IFNEVmFsdWUoTG8sMSk7CisgICAgICBTRE5vZGUgKkhpID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShNaXBzOjpNRkhJLCBkbCwgTVZUOjppMzIsIEluRmxhZyk7CisKKyAgICAgIGlmICghU0RWYWx1ZShOb2RlLCAwKS51c2VfZW1wdHkoKSkgCisgICAgICAgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTm9kZSwgMCksIFNEVmFsdWUoTG8sMCkpOworCisgICAgICBpZiAoIVNEVmFsdWUoTm9kZSwgMSkudXNlX2VtcHR5KCkpIAorICAgICAgICBSZXBsYWNlVXNlcyhTRFZhbHVlKE5vZGUsIDEpLCBTRFZhbHVlKEhpLDApKTsKKworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8vIFNwZWNpYWwgTXVscworICAgIGNhc2UgSVNEOjpNVUw6IAorICAgIGNhc2UgSVNEOjpNVUxIUzoKKyAgICBjYXNlIElTRDo6TVVMSFU6IHsKKyAgICAgIFNEVmFsdWUgTXVsT3AxID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIFNEVmFsdWUgTXVsT3AyID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKworICAgICAgdW5zaWduZWQgTXVsT3AgID0gKE9wY29kZSA9PSBJU0Q6Ok1VTEhVID8gTWlwczo6TVVMVHUgOiBNaXBzOjpNVUxUKTsKKyAgICAgIFNETm9kZSAqTXVsTm9kZSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTXVsT3AsIGRsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpGbGFnLCBNdWxPcDEsIE11bE9wMik7CisKKyAgICAgIFNEVmFsdWUgSW5GbGFnID0gU0RWYWx1ZShNdWxOb2RlLCAwKTsKKworICAgICAgaWYgKE9wY29kZSA9PSBJU0Q6Ok1VTCkKKyAgICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTWlwczo6TUZMTywgZGwsIE1WVDo6aTMyLCBJbkZsYWcpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShNaXBzOjpNRkhJLCBkbCwgTVZUOjppMzIsIEluRmxhZyk7CisgICAgfQorCisgICAgLy8vIERpdi9SZW0gb3BlcmF0aW9ucworICAgIGNhc2UgSVNEOjpTUkVNOgorICAgIGNhc2UgSVNEOjpVUkVNOgorICAgIGNhc2UgSVNEOjpTRElWOiAKKyAgICBjYXNlIElTRDo6VURJVjogeworICAgICAgU0RWYWx1ZSBPcDEgPSBOb2RlLT5nZXRPcGVyYW5kKDApOworICAgICAgU0RWYWx1ZSBPcDIgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworCisgICAgICB1bnNpZ25lZCBPcCwgTU9wOworICAgICAgaWYgKE9wY29kZSA9PSBJU0Q6OlNESVYgfHwgT3Bjb2RlID09IElTRDo6VURJVikgeworICAgICAgICBPcCAgPSAoT3Bjb2RlID09IElTRDo6U0RJViA/IE1pcHM6OkRJViA6IE1pcHM6OkRJVnUpOworICAgICAgICBNT3AgPSBNaXBzOjpNRkxPOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgT3AgID0gKE9wY29kZSA9PSBJU0Q6OlNSRU0gPyBNaXBzOjpESVYgOiBNaXBzOjpESVZ1KTsKKyAgICAgICAgTU9wID0gTWlwczo6TUZISTsKKyAgICAgIH0KKyAgICAgIFNETm9kZSAqTm9kZSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3AsIGRsLCBNVlQ6OkZsYWcsIE9wMSwgT3AyKTsKKworICAgICAgU0RWYWx1ZSBJbkZsYWcgPSBTRFZhbHVlKE5vZGUsIDApOworICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTU9wLCBkbCwgTVZUOjppMzIsIEluRmxhZyk7CisgICAgfQorCisgICAgLy8gR2V0IHRhcmdldCBHT1QgYWRkcmVzcy4KKyAgICBjYXNlIElTRDo6R0xPQkFMX09GRlNFVF9UQUJMRToKKyAgICAgIHJldHVybiBnZXRHbG9iYWxCYXNlUmVnKCk7CisKKyAgICBjYXNlIElTRDo6Q29uc3RhbnRGUDogeworICAgICAgQ29uc3RhbnRGUFNETm9kZSAqQ04gPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihOb2RlKTsKKyAgICAgIGlmIChOb2RlLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjpmNjQgJiYgQ04tPmlzRXhhY3RseVZhbHVlKCswLjApKSB7IAorICAgICAgICBTRFZhbHVlIFplcm8gPSBDdXJEQUctPmdldENvcHlGcm9tUmVnKEN1ckRBRy0+Z2V0RW50cnlOb2RlKCksIGRsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXBzOjpaRVJPLCBNVlQ6OmkzMik7CisgICAgICAgIFNEVmFsdWUgVW5kZWYgPSBTRFZhbHVlKAorICAgICAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYsIGRsLCBNVlQ6OmY2NCksIDApOworICAgICAgICBTRE5vZGUgKk1UQyA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTWlwczo6TVRDMSwgZGwsIE1WVDo6ZjMyLCBaZXJvKTsKKyAgICAgICAgU0RWYWx1ZSBJMCA9IEN1ckRBRy0+Z2V0VGFyZ2V0SW5zZXJ0U3VicmVnKE1pcHM6OnN1Yl9mcGV2ZW4sIGRsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmY2NCwgVW5kZWYsIFNEVmFsdWUoTVRDLCAwKSk7CisgICAgICAgIFNEVmFsdWUgSTEgPSBDdXJEQUctPmdldFRhcmdldEluc2VydFN1YnJlZyhNaXBzOjpzdWJfZnBvZGQsIGRsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmY2NCwgSTAsIFNEVmFsdWUoTVRDLCAwKSk7CisgICAgICAgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTm9kZSwgMCksIEkxKTsKKyAgICAgICAgcmV0dXJuIEkxLmdldE5vZGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgSVNEOjpMT0FEOgorICAgICAgaWYgKFNETm9kZSAqUmVzTm9kZSA9IFNlbGVjdExvYWRGcDY0KE5vZGUpKQorICAgICAgICByZXR1cm4gUmVzTm9kZTsKKyAgICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElTRDo6U1RPUkU6CisgICAgICBpZiAoU0ROb2RlICpSZXNOb2RlID0gU2VsZWN0U3RvcmVGcDY0KE5vZGUpKQorICAgICAgICByZXR1cm4gUmVzTm9kZTsKKyAgICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgICAgYnJlYWs7CisKKyAgICAvLy8gSGFuZGxlIGRpcmVjdCBhbmQgaW5kaXJlY3QgY2FsbHMgd2hlbiB1c2luZyBQSUMuIE9uIFBJQywgd2hlbiAKKyAgICAvLy8gR09UIGlzIHNtYWxsZXIgdGhhbiBhYm91dCA2NGsgKHNtYWxsIGNvZGUpIHRoZSBHQSB0YXJnZXQgaXMgCisgICAgLy8vIGxvYWRlZCB3aXRoIG9ubHkgb25lIGluc3RydWN0aW9uLiBPdGhlcndpc2UgR0EncyB0YXJnZXQgbXVzdCAKKyAgICAvLy8gYmUgbG9hZGVkIHdpdGggMyBpbnN0cnVjdGlvbnMuIAorICAgIGNhc2UgTWlwc0lTRDo6Sm1wTGluazogeworICAgICAgaWYgKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKSB7CisgICAgICAgIHVuc2lnbmVkIExhc3RPcE51bSA9IE5vZGUtPmdldE51bU9wZXJhbmRzKCktMTsKKworICAgICAgICBTRFZhbHVlIENoYWluICA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgICAgICAgIFNEVmFsdWUgQ2FsbGVlID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgICAgU0RWYWx1ZSBJbkZsYWc7CisKKyAgICAgICAgLy8gU2tpcCB0aGUgaW5jb21taW5nIGZsYWcgaWYgcHJlc2VudAorICAgICAgICBpZiAoTm9kZS0+Z2V0T3BlcmFuZChMYXN0T3BOdW0pLmdldFZhbHVlVHlwZSgpID09IE1WVDo6RmxhZykKKyAgICAgICAgICBMYXN0T3BOdW0tLTsKKworICAgICAgICBpZiAoIChpc2E8R2xvYmFsQWRkcmVzc1NETm9kZT4oQ2FsbGVlKSkgfHwKKyAgICAgICAgICAgICAoaXNhPEV4dGVybmFsU3ltYm9sU0ROb2RlPihDYWxsZWUpKSApCisgICAgICAgIHsKKyAgICAgICAgICAvLy8gRGlyZWN0IGNhbGwgZm9yIGdsb2JhbCBhZGRyZXNzZXMgYW5kIGV4dGVybmFsIHN5bWJvbHMKKyAgICAgICAgICBTRFZhbHVlIEdQUmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcihNaXBzOjpHUCwgTVZUOjppMzIpOworCisgICAgICAgICAgLy8gVXNlIGxvYWQgdG8gZ2V0IEdPVCB0YXJnZXQKKyAgICAgICAgICBTRFZhbHVlIE9wc1tdID0geyBDYWxsZWUsIEdQUmVnLCBDaGFpbiB9OworICAgICAgICAgIFNEVmFsdWUgTG9hZCA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShNaXBzOjpMVywgZGwsIE1WVDo6aTMyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBPcHMsIDMpLCAwKTsKKyAgICAgICAgICBDaGFpbiA9IExvYWQuZ2V0VmFsdWUoMSk7CisKKyAgICAgICAgICAvLyBDYWxsIHRhcmdldCBtdXN0IGJlIG9uIFQ5CisgICAgICAgICAgQ2hhaW4gPSBDdXJEQUctPmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIE1pcHM6OlQ5LCBMb2FkLCBJbkZsYWcpOworICAgICAgICB9IGVsc2UgCisgICAgICAgICAgLy8vIEluZGlyZWN0IGNhbGwKKyAgICAgICAgICBDaGFpbiA9IEN1ckRBRy0+Z2V0Q29weVRvUmVnKENoYWluLCBkbCwgTWlwczo6VDksIENhbGxlZSwgSW5GbGFnKTsKKworICAgICAgICAvLyBNYXAgdGhlIEptcExpbmsgb3BlcmFuZHMgdG8gSkFMUgorICAgICAgICBTRFZUTGlzdCBOb2RlVHlzID0gQ3VyREFHLT5nZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKyAgICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICAgICAgICBPcHMucHVzaF9iYWNrKEN1ckRBRy0+Z2V0UmVnaXN0ZXIoTWlwczo6VDksIE1WVDo6aTMyKSk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMiwgZSA9IExhc3RPcE51bSsxOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBPcHMucHVzaF9iYWNrKE5vZGUtPmdldE9wZXJhbmQoaSkpOworICAgICAgICBPcHMucHVzaF9iYWNrKENoYWluKTsKKyAgICAgICAgT3BzLnB1c2hfYmFjayhDaGFpbi5nZXRWYWx1ZSgxKSk7CisKKyAgICAgICAgLy8gRW1pdCBKdW1wIGFuZCBMaW5rIFJlZ2lzdGVyCisgICAgICAgIFNETm9kZSAqUmVzTm9kZSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTWlwczo6SkFMUiwgZGwsIE5vZGVUeXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPcHNbMF0sIE9wcy5zaXplKCkpOworCisgICAgICAgIC8vIFJlcGxhY2UgQ2hhaW4gYW5kIEluRmxhZworICAgICAgICBSZXBsYWNlVXNlcyhTRFZhbHVlKE5vZGUsIDApLCBTRFZhbHVlKFJlc05vZGUsIDApKTsKKyAgICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOb2RlLCAxKSwgU0RWYWx1ZShSZXNOb2RlLCAxKSk7CisgICAgICAgIHJldHVybiBSZXNOb2RlOworICAgICAgfSAKKyAgICB9CisgIH0KKworICAvLyBTZWxlY3QgdGhlIGRlZmF1bHQgaW5zdHJ1Y3Rpb24KKyAgU0ROb2RlICpSZXNOb2RlID0gU2VsZWN0Q29kZShOb2RlKTsKKworICBERUJVRyhlcnJzKCkgPDwgIj0+ICIpOworICBpZiAoUmVzTm9kZSA9PSBOVUxMIHx8IFJlc05vZGUgPT0gTm9kZSkKKyAgICBERUJVRyhOb2RlLT5kdW1wKEN1ckRBRykpOworICBlbHNlCisgICAgREVCVUcoUmVzTm9kZS0+ZHVtcChDdXJEQUcpKTsKKyAgREVCVUcoZXJycygpIDw8ICJcbiIpOworICByZXR1cm4gUmVzTm9kZTsKK30KKworLy8vIGNyZWF0ZU1pcHNJU2VsRGFnIC0gVGhpcyBwYXNzIGNvbnZlcnRzIGEgbGVnYWxpemVkIERBRyBpbnRvIGEgCisvLy8gTUlQUy1zcGVjaWZpYyBEQUcsIHJlYWR5IGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVNaXBzSVNlbERhZyhNaXBzVGFyZ2V0TWFjaGluZSAmVE0pIHsKKyAgcmV0dXJuIG5ldyBNaXBzREFHVG9EQUdJU2VsKFRNKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzSVNlbExvd2VyaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzSVNlbExvd2VyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGI5OWJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJU2VsTG93ZXJpbmcuY3BwCkBAIC0wLDAgKzEsMTM0MCBAQAorLy89PT0tLSBNaXBzSVNlbExvd2VyaW5nLmNwcCAtIE1pcHMgREFHIExvd2VyaW5nIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IE1pcHMgdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50byBhCisvLyBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibWlwcy1sb3dlciIKKyNpbmNsdWRlICJNaXBzSVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiTWlwc01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgIk1pcHNUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiTWlwc1RhcmdldE9iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJNaXBzU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitjb25zdCBjaGFyICpNaXBzVGFyZ2V0TG93ZXJpbmc6OmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3QgeworICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGNhc2UgTWlwc0lTRDo6Sm1wTGluayAgICA6IHJldHVybiAiTWlwc0lTRDo6Sm1wTGluayI7CisgICAgY2FzZSBNaXBzSVNEOjpIaSAgICAgICAgIDogcmV0dXJuICJNaXBzSVNEOjpIaSI7CisgICAgY2FzZSBNaXBzSVNEOjpMbyAgICAgICAgIDogcmV0dXJuICJNaXBzSVNEOjpMbyI7CisgICAgY2FzZSBNaXBzSVNEOjpHUFJlbCAgICAgIDogcmV0dXJuICJNaXBzSVNEOjpHUFJlbCI7CisgICAgY2FzZSBNaXBzSVNEOjpSZXQgICAgICAgIDogcmV0dXJuICJNaXBzSVNEOjpSZXQiOworICAgIGNhc2UgTWlwc0lTRDo6Q01vdiAgICAgICA6IHJldHVybiAiTWlwc0lTRDo6Q01vdiI7CisgICAgY2FzZSBNaXBzSVNEOjpTZWxlY3RDQyAgIDogcmV0dXJuICJNaXBzSVNEOjpTZWxlY3RDQyI7CisgICAgY2FzZSBNaXBzSVNEOjpGUFNlbGVjdENDIDogcmV0dXJuICJNaXBzSVNEOjpGUFNlbGVjdENDIjsKKyAgICBjYXNlIE1pcHNJU0Q6OkZQQnJjb25kICAgOiByZXR1cm4gIk1pcHNJU0Q6OkZQQnJjb25kIjsKKyAgICBjYXNlIE1pcHNJU0Q6OkZQQ21wICAgICAgOiByZXR1cm4gIk1pcHNJU0Q6OkZQQ21wIjsKKyAgICBjYXNlIE1pcHNJU0Q6OkZQUm91bmQgICAgOiByZXR1cm4gIk1pcHNJU0Q6OkZQUm91bmQiOworICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICA6IHJldHVybiBOVUxMOworICB9Cit9CisKK01pcHNUYXJnZXRMb3dlcmluZzo6CitNaXBzVGFyZ2V0TG93ZXJpbmcoTWlwc1RhcmdldE1hY2hpbmUgJlRNKQorICA6IFRhcmdldExvd2VyaW5nKFRNLCBuZXcgTWlwc1RhcmdldE9iamVjdEZpbGUoKSkgeworICBTdWJ0YXJnZXQgPSAmVE0uZ2V0U3VidGFyZ2V0PE1pcHNTdWJ0YXJnZXQ+KCk7CisKKyAgLy8gTWlwcyBkb2VzIG5vdCBoYXZlIGkxIHR5cGUsIHNvIHVzZSBpMzIgZm9yCisgIC8vIHNldGNjIG9wZXJhdGlvbnMgcmVzdWx0cyAoc2x0LCBzZ3QsIC4uLikuIAorICBzZXRCb29sZWFuQ29udGVudHMoWmVyb09yT25lQm9vbGVhbkNvbnRlbnQpOworCisgIC8vIFNldCB1cCB0aGUgcmVnaXN0ZXIgY2xhc3NlcworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6aTMyLCBNaXBzOjpDUFVSZWdzUmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjpmMzIsIE1pcHM6OkZHUjMyUmVnaXN0ZXJDbGFzcyk7CisKKyAgLy8gV2hlbiBkZWFsaW5nIHdpdGggc2luZ2xlIHByZWNpc2lvbiBvbmx5LCB1c2UgbGliY2FsbHMKKyAgaWYgKCFTdWJ0YXJnZXQtPmlzU2luZ2xlRmxvYXQoKSkKKyAgICBpZiAoIVN1YnRhcmdldC0+aXNGUDY0Yml0KCkpCisgICAgICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjY0LCBNaXBzOjpBRkdSNjRSZWdpc3RlckNsYXNzKTsKKworICAvLyBMb2FkIGV4dGVudGVkIG9wZXJhdGlvbnMgZm9yIGkxIHR5cGVzIG11c3QgYmUgcHJvbW90ZWQgCisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCAgTVZUOjppMSwgIFByb21vdGUpOworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6WkVYVExPQUQsIE1WVDo6aTEsICBQcm9tb3RlKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlNFWFRMT0FELCBNVlQ6OmkxLCAgUHJvbW90ZSk7CisKKyAgLy8gTUlQUyBkb2Vzbid0IGhhdmUgZXh0ZW5kaW5nIGZsb2F0LT5kb3VibGUgbG9hZC9zdG9yZQorICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6RVhUTE9BRCwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldFRydW5jU3RvcmVBY3Rpb24oTVZUOjpmNjQsIE1WVDo6ZjMyLCBFeHBhbmQpOworCisgIC8vIFVzZWQgYnkgbGVnYWxpemUgdHlwZXMgdG8gY29ycmVjdGx5IGdlbmVyYXRlIHRoZSBzZXRjYyByZXN1bHQuIAorICAvLyBXaXRob3V0IHRoaXMsIGV2ZXJ5IGZsb2F0IHNldGNjIGNvbWVzIHdpdGggYSBBTkQvT1Igd2l0aCB0aGUgcmVzdWx0LCAKKyAgLy8gd2UgZG9uJ3Qgd2FudCB0aGlzLCBzaW5jZSB0aGUgZnBjbXAgcmVzdWx0IGdvZXMgdG8gYSBmbGFnIHJlZ2lzdGVyLCAKKyAgLy8gd2hpY2ggaXMgdXNlZCBpbXBsaWNpdGx5IGJ5IGJyY29uZCBhbmQgc2VsZWN0IG9wZXJhdGlvbnMuCisgIEFkZFByb21vdGVkVG9UeXBlKElTRDo6U0VUQ0MsIE1WVDo6aTEsIE1WVDo6aTMyKTsKKworICAvLyBNaXBzIEN1c3RvbSBPcGVyYXRpb25zCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbEFkZHJlc3MsICAgICAgTVZUOjppMzIsICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6R2xvYmFsVExTQWRkcmVzcywgICBNVlQ6OmkzMiwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpKdW1wVGFibGUsICAgICAgICAgIE1WVDo6aTMyLCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50UG9vbCwgICAgICAgTVZUOjppMzIsICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCAgICAgICAgICAgICBNVlQ6OmYzMiwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsICAgICAgICAgICAgIE1WVDo6ZjY0LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgICAgICAgICAgICAgTVZUOjppMzIsICAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MsICAgICAgICAgICAgICBNVlQ6OmYzMiwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRVRDQywgICAgICAgICAgICAgIE1WVDo6ZjY0LCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSQ09ORCwgICAgICAgICAgICAgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RFlOQU1JQ19TVEFDS0FMTE9DLCBNVlQ6OmkzMiwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19TSU5ULCAgICAgICAgIE1WVDo6aTMyLCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBU1RBUlQsICAgICAgICAgICAgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKworCisgIC8vIFdlIGN1c3RvbSBsb3dlciBBTkQvT1IgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBEQUcgY29udGFpbiAnYW5kcy9vcnMnIAorICAvLyB3aXRoIG9wZXJhbmRzIGNvbW1pbmcgZnJvbSBzZXRjYyBmcCBjb21wYXJpb25zLiBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSAKKyAgLy8gdGhlIHJlc3VsdCBmcm9tIHRoZXNlIHNldGNjIGFyZSBpbiBhIGZsYWcgcmVnaXN0ZXJzIChGQ1IzMSkuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFORCwgICAgICAgICAgICAgIE1WVDo6aTMyLCAgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok9SLCAgICAgICAgICAgICAgIE1WVDo6aTMyLCAgIEN1c3RvbSk7CisKKyAgLy8gT3BlcmF0aW9ucyBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IE1pcHMuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0pULCAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUl9DQywgICAgICAgICAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUX0NDLCAgICAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVJTlRfVE9fRlAsICAgICAgICBNVlQ6OmkzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5ULCAgICAgICAgTVZUOjppMzIsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTEsICAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUUE9QLCAgICAgICAgICAgICBNVlQ6OmkzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFRaLCAgICAgICAgICAgICAgTVZUOjppMzIsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Uk9UTCwgICAgICAgICAgICAgIE1WVDo6aTMyLCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlJPVFIsICAgICAgICAgICAgICBNVlQ6OmkzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSExfUEFSVFMsICAgICAgICAgTVZUOjppMzIsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JBX1BBUlRTLCAgICAgICAgIE1WVDo6aTMyLCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTF9QQVJUUywgICAgICAgICBNVlQ6OmkzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09QWVNJR04sICAgICAgICAgTVZUOjpmMzIsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCAgICAgICAgIE1WVDo6ZjY0LCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTSU4sICAgICAgICAgICAgICBNVlQ6OmYzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TLCAgICAgICAgICAgICAgTVZUOjpmMzIsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBPV0ksICAgICAgICAgICAgIE1WVDo6ZjMyLCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQT1csICAgICAgICAgICAgICBNVlQ6OmYzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTE9HLCAgICAgICAgICAgICAgTVZUOjpmMzIsICAgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxPRzIsICAgICAgICAgICAgIE1WVDo6ZjMyLCAgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZMT0cxMCwgICAgICAgICAgICBNVlQ6OmYzMiwgICBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGRVhQLCAgICAgICAgICAgICAgTVZUOjpmMzIsICAgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFSF9MQUJFTCwgICAgICAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKworICAvLyBVc2UgdGhlIGRlZmF1bHQgZm9yIG5vdworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVEFDS1NBVkUsICAgICAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RBQ0tSRVNUT1JFLCAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1FTUJBUlJJRVIsICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworCisgIGlmIChTdWJ0YXJnZXQtPmlzU2luZ2xlRmxvYXQoKSkKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIE1WVDo6ZjY0LCBFeHBhbmQpOworCisgIGlmICghU3VidGFyZ2V0LT5oYXNTRUluUmVnKCkpIHsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSUdOX0VYVEVORF9JTlJFRywgTVZUOjppOCwgIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTE2LCBFeHBhbmQpOworICB9CisKKyAgaWYgKCFTdWJ0YXJnZXQtPmhhc0JpdENvdW50KCkpCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RMWiwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgaWYgKCFTdWJ0YXJnZXQtPmhhc1N3YXAoKSkKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCU1dBUCwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgc2V0U3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlKE1pcHM6OlNQKTsKKyAgY29tcHV0ZVJlZ2lzdGVyUHJvcGVydGllcygpOworfQorCitNVlQ6OlNpbXBsZVZhbHVlVHlwZSBNaXBzVGFyZ2V0TG93ZXJpbmc6OmdldFNldENDUmVzdWx0VHlwZShFVlQgVlQpIGNvbnN0IHsKKyAgcmV0dXJuIE1WVDo6aTMyOworfQorCisvLy8gZ2V0RnVuY3Rpb25BbGlnbm1lbnQgLSBSZXR1cm4gdGhlIExvZzIgYWxpZ25tZW50IG9mIHRoaXMgZnVuY3Rpb24uCit1bnNpZ25lZCBNaXBzVGFyZ2V0TG93ZXJpbmc6OmdldEZ1bmN0aW9uQWxpZ25tZW50KGNvbnN0IEZ1bmN0aW9uICopIGNvbnN0IHsKKyAgcmV0dXJuIDI7Cit9CisKK1NEVmFsdWUgTWlwc1RhcmdldExvd2VyaW5nOjoKK0xvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICBzd2l0Y2ggKE9wLmdldE9wY29kZSgpKSAKKyAgeworICAgIGNhc2UgSVNEOjpBTkQ6ICAgICAgICAgICAgICAgIHJldHVybiBMb3dlckFORE9SKE9wLCBEQUcpOworICAgIGNhc2UgSVNEOjpCUkNPTkQ6ICAgICAgICAgICAgIHJldHVybiBMb3dlckJSQ09ORChPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6Q29uc3RhbnRQb29sOiAgICAgICByZXR1cm4gTG93ZXJDb25zdGFudFBvb2woT3AsIERBRyk7CisgICAgY2FzZSBJU0Q6OkRZTkFNSUNfU1RBQ0tBTExPQzogcmV0dXJuIExvd2VyRFlOQU1JQ19TVEFDS0FMTE9DKE9wLCBEQUcpOworICAgIGNhc2UgSVNEOjpGUF9UT19TSU5UOiAgICAgICAgIHJldHVybiBMb3dlckZQX1RPX1NJTlQoT3AsIERBRyk7CisgICAgY2FzZSBJU0Q6Okdsb2JhbEFkZHJlc3M6ICAgICAgcmV0dXJuIExvd2VyR2xvYmFsQWRkcmVzcyhPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6R2xvYmFsVExTQWRkcmVzczogICByZXR1cm4gTG93ZXJHbG9iYWxUTFNBZGRyZXNzKE9wLCBEQUcpOworICAgIGNhc2UgSVNEOjpKdW1wVGFibGU6ICAgICAgICAgIHJldHVybiBMb3dlckp1bXBUYWJsZShPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6T1I6ICAgICAgICAgICAgICAgICByZXR1cm4gTG93ZXJBTkRPUihPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6U0VMRUNUOiAgICAgICAgICAgICByZXR1cm4gTG93ZXJTRUxFQ1QoT3AsIERBRyk7CisgICAgY2FzZSBJU0Q6OlNFVENDOiAgICAgICAgICAgICAgcmV0dXJuIExvd2VyU0VUQ0MoT3AsIERBRyk7CisgICAgY2FzZSBJU0Q6OlZBU1RBUlQ6ICAgICAgICAgICAgcmV0dXJuIExvd2VyVkFTVEFSVChPcCwgREFHKTsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIExvd2VyIGhlbHBlciBmdW5jdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEFkZExpdmVJbiAtIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGFkZHMgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3RlciB0byB0aGUKKy8vIE1hY2hpbmVGdW5jdGlvbiBhcyBhIGxpdmUgaW4gdmFsdWUuICBJdCBhbHNvIGNyZWF0ZXMgYSBjb3JyZXNwb25kaW5nCisvLyB2aXJ0dWFsIHJlZ2lzdGVyIGZvciBpdC4KK3N0YXRpYyB1bnNpZ25lZAorQWRkTGl2ZUluKE1hY2hpbmVGdW5jdGlvbiAmTUYsIHVuc2lnbmVkIFBSZWcsIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSAKK3sKKyAgYXNzZXJ0KFJDLT5jb250YWlucyhQUmVnKSAmJiAiTm90IHRoZSBjb3JyZWN0IHJlZ2NsYXNzISIpOworICB1bnNpZ25lZCBWUmVnID0gTUYuZ2V0UmVnSW5mbygpLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIE1GLmdldFJlZ0luZm8oKS5hZGRMaXZlSW4oUFJlZywgVlJlZyk7CisgIHJldHVybiBWUmVnOworfQorCisvLyBHZXQgZnAgYnJhbmNoIGNvZGUgKG5vdCBvcGNvZGUpIGZyb20gY29uZGl0aW9uIGNvZGUuCitzdGF0aWMgTWlwczo6RlBCcmFuY2hDb2RlIEdldEZQQnJhbmNoQ29kZUZyb21Db25kKE1pcHM6OkNvbmRDb2RlIENDKSB7CisgIGlmIChDQyA+PSBNaXBzOjpGQ09ORF9GICYmIENDIDw9IE1pcHM6OkZDT05EX05HVCkKKyAgICByZXR1cm4gTWlwczo6QlJBTkNIX1Q7CisKKyAgaWYgKENDID49IE1pcHM6OkZDT05EX1QgJiYgQ0MgPD0gTWlwczo6RkNPTkRfR1QpCisgICAgcmV0dXJuIE1pcHM6OkJSQU5DSF9GOworCisgIHJldHVybiBNaXBzOjpCUkFOQ0hfSU5WQUxJRDsKK30KKyAgCitzdGF0aWMgdW5zaWduZWQgRlBCcmFuY2hDb2RlVG9PcGMoTWlwczo6RlBCcmFuY2hDb2RlIEJDKSB7CisgIHN3aXRjaChCQykgeworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGJyYW5jaCBjb2RlIik7CisgICAgY2FzZSBNaXBzOjpCUkFOQ0hfVCAgOiByZXR1cm4gTWlwczo6QkMxVDsKKyAgICBjYXNlIE1pcHM6OkJSQU5DSF9GICA6IHJldHVybiBNaXBzOjpCQzFGOworICAgIGNhc2UgTWlwczo6QlJBTkNIX1RMIDogcmV0dXJuIE1pcHM6OkJDMVRMOworICAgIGNhc2UgTWlwczo6QlJBTkNIX0ZMIDogcmV0dXJuIE1pcHM6OkJDMUZMOworICB9Cit9CisKK3N0YXRpYyBNaXBzOjpDb25kQ29kZSBGUENvbmRDQ29kZVRvRkNDKElTRDo6Q29uZENvZGUgQ0MpIHsKKyAgc3dpdGNoIChDQykgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGZwIGNvbmRpdGlvbiBjb2RlISIpOworICBjYXNlIElTRDo6U0VURVE6ICAKKyAgY2FzZSBJU0Q6OlNFVE9FUTogcmV0dXJuIE1pcHM6OkZDT05EX0VROworICBjYXNlIElTRDo6U0VUVU5FOiByZXR1cm4gTWlwczo6RkNPTkRfT0dMOworICBjYXNlIElTRDo6U0VUTFQ6ICAKKyAgY2FzZSBJU0Q6OlNFVE9MVDogcmV0dXJuIE1pcHM6OkZDT05EX09MVDsKKyAgY2FzZSBJU0Q6OlNFVEdUOiAgCisgIGNhc2UgSVNEOjpTRVRPR1Q6IHJldHVybiBNaXBzOjpGQ09ORF9PR1Q7CisgIGNhc2UgSVNEOjpTRVRMRTogIAorICBjYXNlIElTRDo6U0VUT0xFOiByZXR1cm4gTWlwczo6RkNPTkRfT0xFOyAKKyAgY2FzZSBJU0Q6OlNFVEdFOgorICBjYXNlIElTRDo6U0VUT0dFOiByZXR1cm4gTWlwczo6RkNPTkRfT0dFOworICBjYXNlIElTRDo6U0VUVUxUOiByZXR1cm4gTWlwczo6RkNPTkRfVUxUOworICBjYXNlIElTRDo6U0VUVUxFOiByZXR1cm4gTWlwczo6RkNPTkRfVUxFOyAKKyAgY2FzZSBJU0Q6OlNFVFVHVDogcmV0dXJuIE1pcHM6OkZDT05EX1VHVDsKKyAgY2FzZSBJU0Q6OlNFVFVHRTogcmV0dXJuIE1pcHM6OkZDT05EX1VHRTsKKyAgY2FzZSBJU0Q6OlNFVFVPOiAgcmV0dXJuIE1pcHM6OkZDT05EX1VOOyAKKyAgY2FzZSBJU0Q6OlNFVE86ICAgcmV0dXJuIE1pcHM6OkZDT05EX09SOworICBjYXNlIElTRDo6U0VUTkU6ICAKKyAgY2FzZSBJU0Q6OlNFVE9ORTogcmV0dXJuIE1pcHM6OkZDT05EX05FUTsKKyAgY2FzZSBJU0Q6OlNFVFVFUTogcmV0dXJuIE1pcHM6OkZDT05EX1VFUTsKKyAgfQorfQorCitNYWNoaW5lQmFzaWNCbG9jayAqCitNaXBzVGFyZ2V0TG93ZXJpbmc6OkVtaXRJbnN0cldpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICBib29sIGlzRlBDbXAgPSBmYWxzZTsKKyAgRGVidWdMb2MgZGwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UgJiYgIlVuZXhwZWN0ZWQgaW5zdHIgdHlwZSB0byBpbnNlcnQiKTsKKyAgY2FzZSBNaXBzOjpTZWxlY3RfRkNDOgorICBjYXNlIE1pcHM6OlNlbGVjdF9GQ0NfUzMyOgorICBjYXNlIE1pcHM6OlNlbGVjdF9GQ0NfRDMyOgorICAgIGlzRlBDbXAgPSB0cnVlOyAvLyBGQUxMIFRIUk9VR0gKKyAgY2FzZSBNaXBzOjpTZWxlY3RfQ0M6CisgIGNhc2UgTWlwczo6U2VsZWN0X0NDX1MzMjoKKyAgY2FzZSBNaXBzOjpTZWxlY3RfQ0NfRDMyOiB7CisgICAgLy8gVG8gImluc2VydCIgYSBTRUxFQ1RfQ0MgaW5zdHJ1Y3Rpb24sIHdlIGFjdHVhbGx5IGhhdmUgdG8gaW5zZXJ0IHRoZQorICAgIC8vIGRpYW1vbmQgY29udHJvbC1mbG93IHBhdHRlcm4uICBUaGUgaW5jb21pbmcgaW5zdHJ1Y3Rpb24ga25vd3MgdGhlCisgICAgLy8gZGVzdGluYXRpb24gdnJlZyB0byBzZXQsIHRoZSBjb25kaXRpb24gY29kZSByZWdpc3RlciB0byBicmFuY2ggb24sIHRoZQorICAgIC8vIHRydWUvZmFsc2UgdmFsdWVzIHRvIHNlbGVjdCBiZXR3ZWVuLCBhbmQgYSBicmFuY2ggb3Bjb2RlIHRvIHVzZS4KKyAgICBjb25zdCBCYXNpY0Jsb2NrICpMTFZNX0JCID0gQkItPmdldEJhc2ljQmxvY2soKTsKKyAgICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEl0ID0gQkI7CisgICAgKytJdDsKKworICAgIC8vICB0aGlzTUJCOgorICAgIC8vICAuLi4KKyAgICAvLyAgIFRydWVWYWwgPSAuLi4KKyAgICAvLyAgIHNldGNjIHIxLCByMiwgcjMKKyAgICAvLyAgIGJORSAgIHIxLCByMCwgY29weTFNQkIKKyAgICAvLyAgIGZhbGx0aHJvdWdoIC0tPiBjb3B5ME1CQgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICp0aGlzTUJCICA9IEJCOworICAgIE1hY2hpbmVGdW5jdGlvbiAqRiA9IEJCLT5nZXRQYXJlbnQoKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqY29weTBNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqc2lua01CQiAgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgICBGLT5pbnNlcnQoSXQsIGNvcHkwTUJCKTsKKyAgICBGLT5pbnNlcnQoSXQsIHNpbmtNQkIpOworCisgICAgLy8gVHJhbnNmZXIgdGhlIHJlbWFpbmRlciBvZiBCQiBhbmQgaXRzIHN1Y2Nlc3NvciBlZGdlcyB0byBzaW5rTUJCLgorICAgIHNpbmtNQkItPnNwbGljZShzaW5rTUJCLT5iZWdpbigpLCBCQiwKKyAgICAgICAgICAgICAgICAgICAgbGx2bTo6bmV4dChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoTUkpKSwKKyAgICAgICAgICAgICAgICAgICAgQkItPmVuZCgpKTsKKyAgICBzaW5rTUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKEJCKTsKKworICAgIC8vIE5leHQsIGFkZCB0aGUgdHJ1ZSBhbmQgZmFsbHRocm91Z2ggYmxvY2tzIGFzIGl0cyBzdWNjZXNzb3JzLgorICAgIEJCLT5hZGRTdWNjZXNzb3IoY29weTBNQkIpOworICAgIEJCLT5hZGRTdWNjZXNzb3Ioc2lua01CQik7CisKKyAgICAvLyBFbWl0IHRoZSByaWdodCBpbnN0cnVjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgdGhlIG9wZXJhbmRzIGNvbXBhcmVkCisgICAgaWYgKGlzRlBDbXApIHsKKyAgICAgIC8vIEZpbmQgdGhlIGNvbmRpY3Rpb24gY29kZSBwcmVzZW50IGluIHRoZSBzZXRjYyBvcGVyYXRpb24uCisgICAgICBNaXBzOjpDb25kQ29kZSBDQyA9IChNaXBzOjpDb25kQ29kZSlNSS0+Z2V0T3BlcmFuZCg0KS5nZXRJbW0oKTsKKyAgICAgIC8vIEdldCB0aGUgYnJhbmNoIG9wY29kZSBmcm9tIHRoZSBicmFuY2ggY29kZS4KKyAgICAgIHVuc2lnbmVkIE9wYyA9IEZQQnJhbmNoQ29kZVRvT3BjKEdldEZQQnJhbmNoQ29kZUZyb21Db25kKENDKSk7CisgICAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoT3BjKSkuYWRkTUJCKHNpbmtNQkIpOworICAgIH0gZWxzZQorICAgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KE1pcHM6OkJORSkpLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkKKyAgICAgICAgLmFkZFJlZyhNaXBzOjpaRVJPKS5hZGRNQkIoc2lua01CQik7CisKKyAgICAvLyAgY29weTBNQkI6CisgICAgLy8gICAlRmFsc2VWYWx1ZSA9IC4uLgorICAgIC8vICAgIyBmYWxsdGhyb3VnaCB0byBzaW5rTUJCCisgICAgQkIgPSBjb3B5ME1CQjsKKworICAgIC8vIFVwZGF0ZSBtYWNoaW5lLUNGRyBlZGdlcworICAgIEJCLT5hZGRTdWNjZXNzb3Ioc2lua01CQik7CisKKyAgICAvLyAgc2lua01CQjoKKyAgICAvLyAgICVSZXN1bHQgPSBwaGkgWyAlVHJ1ZVZhbHVlLCB0aGlzTUJCIF0sIFsgJUZhbHNlVmFsdWUsIGNvcHkwTUJCIF0KKyAgICAvLyAgLi4uCisgICAgQkIgPSBzaW5rTUJCOworICAgIEJ1aWxkTUkoKkJCLCBCQi0+YmVnaW4oKSwgZGwsCisgICAgICAgICAgICBUSUktPmdldChNaXBzOjpQSEkpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCkpLmFkZE1CQih0aGlzTUJCKQorICAgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgzKS5nZXRSZWcoKSkuYWRkTUJCKGNvcHkwTUJCKTsKKworICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsgICAvLyBUaGUgcHNldWRvIGluc3RydWN0aW9uIGlzIGdvbmUgbm93LgorICAgIHJldHVybiBCQjsKKyAgfQorICB9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTWlzYyBMb3dlciBPcGVyYXRpb24gaW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NEVmFsdWUgTWlwc1RhcmdldExvd2VyaW5nOjoKK0xvd2VyRlBfVE9fU0lOVChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QKK3sKKyAgaWYgKCFTdWJ0YXJnZXQtPmlzTWlwczEoKSkKKyAgICByZXR1cm4gT3A7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgdW5zaWduZWQgQ0NSZWcgPSBBZGRMaXZlSW4oTUYsIE1pcHM6OkZDUjMxLCBNaXBzOjpDQ1JSZWdpc3RlckNsYXNzKTsKKworICBTRFZhbHVlIENoYWluID0gREFHLmdldEVudHJ5Tm9kZSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgU3JjID0gT3AuZ2V0T3BlcmFuZCgwKTsKKworICAvLyBTZXQgdGhlIGNvbmRpdGlvbiByZWdpc3RlcgorICBTRFZhbHVlIENvbmRSZWcgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBDQ1JlZywgTVZUOjppMzIpOworICBDb25kUmVnID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIE1pcHM6OkFULCBDb25kUmVnKTsKKyAgQ29uZFJlZyA9IERBRy5nZXRDb3B5RnJvbVJlZyhDb25kUmVnLCBkbCwgTWlwczo6QVQsIE1WVDo6aTMyKTsKKworICBTRFZhbHVlIENzdCA9IERBRy5nZXRDb25zdGFudCgzLCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgT3IgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTVZUOjppMzIsIENvbmRSZWcsIENzdCk7CisgIENzdCA9IERBRy5nZXRDb25zdGFudCgyLCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgWG9yID0gREFHLmdldE5vZGUoSVNEOjpYT1IsIGRsLCBNVlQ6OmkzMiwgT3IsIENzdCk7CisKKyAgU0RWYWx1ZSBJbkZsYWcoMCwgMCk7CisgIENvbmRSZWcgPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgTWlwczo6RkNSMzEsIFhvciwgSW5GbGFnKTsKKworICAvLyBFbWl0IHRoZSByb3VuZCBpbnN0cnVjdGlvbiBhbmQgYml0IGNvbnZlcnQgdG8gaW50ZWdlcgorICBTRFZhbHVlIFRydW5jID0gREFHLmdldE5vZGUoTWlwc0lTRDo6RlBSb3VuZCwgZGwsIE1WVDo6ZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjLCBDb25kUmVnLmdldFZhbHVlKDEpKTsKKyAgU0RWYWx1ZSBCaXRDdnQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjppMzIsIFRydW5jKTsKKyAgcmV0dXJuIEJpdEN2dDsKK30KKworU0RWYWx1ZSBNaXBzVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJEWU5BTUlDX1NUQUNLQUxMT0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0Cit7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFNpemUgPSBPcC5nZXRPcGVyYW5kKDEpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgLy8gR2V0IGEgcmVmZXJlbmNlIGZyb20gTWlwcyBzdGFjayBwb2ludGVyCisgIFNEVmFsdWUgU3RhY2tQb2ludGVyID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgTWlwczo6U1AsIE1WVDo6aTMyKTsKKworICAvLyBTdWJ0cmFjdCB0aGUgZHluYW1pYyBzaXplIGZyb20gdGhlIGFjdHVhbCBzdGFjayBzaXplIHRvCisgIC8vIG9idGFpbiB0aGUgbmV3IHN0YWNrIHNpemUuCisgIFNEVmFsdWUgU3ViID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBNVlQ6OmkzMiwgU3RhY2tQb2ludGVyLCBTaXplKTsKKworICAvLyBUaGUgU3ViIHJlc3VsdCBjb250YWlucyB0aGUgbmV3IHN0YWNrIHN0YXJ0IGFkZHJlc3MsIHNvIGl0IAorICAvLyBtdXN0IGJlIHBsYWNlZCBpbiB0aGUgc3RhY2sgcG9pbnRlciByZWdpc3Rlci4KKyAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKFN0YWNrUG9pbnRlci5nZXRWYWx1ZSgxKSwgZGwsIE1pcHM6OlNQLCBTdWIpOworICAKKyAgLy8gVGhpcyBub2RlIGFsd2F5cyBoYXMgdHdvIHJldHVybiB2YWx1ZXM6IGEgbmV3IHN0YWNrIHBvaW50ZXIgCisgIC8vIHZhbHVlIGFuZCBhIGNoYWluCisgIFNEVmFsdWUgT3BzWzJdID0geyBTdWIsIENoYWluIH07CisgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMoT3BzLCAyLCBkbCk7Cit9CisKK1NEVmFsdWUgTWlwc1RhcmdldExvd2VyaW5nOjoKK0xvd2VyQU5ET1IoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0Cit7CisgIFNEVmFsdWUgTEhTICAgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFJIUyAgID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgICA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgaWYgKExIUy5nZXRPcGNvZGUoKSAhPSBNaXBzSVNEOjpGUENtcCB8fCBSSFMuZ2V0T3Bjb2RlKCkgIT0gTWlwc0lTRDo6RlBDbXApCisgICAgcmV0dXJuIE9wOworCisgIFNEVmFsdWUgVHJ1ZSAgPSBEQUcuZ2V0Q29uc3RhbnQoMSwgTVZUOjppMzIpOworICBTRFZhbHVlIEZhbHNlID0gREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKworICBTRFZhbHVlIExTRUwgPSBEQUcuZ2V0Tm9kZShNaXBzSVNEOjpGUFNlbGVjdENDLCBkbCwgVHJ1ZS5nZXRWYWx1ZVR5cGUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIUywgVHJ1ZSwgRmFsc2UsIExIUy5nZXRPcGVyYW5kKDIpKTsKKyAgU0RWYWx1ZSBSU0VMID0gREFHLmdldE5vZGUoTWlwc0lTRDo6RlBTZWxlY3RDQywgZGwsIFRydWUuZ2V0VmFsdWVUeXBlKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMsIFRydWUsIEZhbHNlLCBSSFMuZ2V0T3BlcmFuZCgyKSk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKE9wLmdldE9wY29kZSgpLCBkbCwgTVZUOjppMzIsIExTRUwsIFJTRUwpOworfQorCitTRFZhbHVlIE1pcHNUYXJnZXRMb3dlcmluZzo6CitMb3dlckJSQ09ORChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QKK3sKKyAgLy8gVGhlIGZpcnN0IG9wZXJhbmQgaXMgdGhlIGNoYWluLCB0aGUgc2Vjb25kIGlzIHRoZSBjb25kaXRpb24sIHRoZSB0aGlyZCBpcyAKKyAgLy8gdGhlIGJsb2NrIHRvIGJyYW5jaCB0byBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIERlc3QgPSBPcC5nZXRPcGVyYW5kKDIpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgaWYgKE9wLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgIT0gTWlwc0lTRDo6RlBDbXApCisgICAgcmV0dXJuIE9wOworICAKKyAgU0RWYWx1ZSBDb25kUmVzID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBDQ05vZGUgID0gQ29uZFJlcy5nZXRPcGVyYW5kKDIpOworICBNaXBzOjpDb25kQ29kZSBDQyA9CisgICAgKE1pcHM6OkNvbmRDb2RlKWNhc3Q8Q29uc3RhbnRTRE5vZGU+KENDTm9kZSktPmdldFpFeHRWYWx1ZSgpOworICBTRFZhbHVlIEJyQ29kZSA9IERBRy5nZXRDb25zdGFudChHZXRGUEJyYW5jaENvZGVGcm9tQ29uZChDQyksIE1WVDo6aTMyKTsgCisKKyAgcmV0dXJuIERBRy5nZXROb2RlKE1pcHNJU0Q6OkZQQnJjb25kLCBkbCwgT3AuZ2V0VmFsdWVUeXBlKCksIENoYWluLCBCckNvZGUsIAorICAgICAgICAgICAgIERlc3QsIENvbmRSZXMpOworfQorCitTRFZhbHVlIE1pcHNUYXJnZXRMb3dlcmluZzo6CitMb3dlclNFVENDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICAvLyBUaGUgb3BlcmFuZHMgdG8gdGhpcyBhcmUgdGhlIGxlZnQgYW5kIHJpZ2h0IG9wZXJhbmRzIHRvIGNvbXBhcmUgKG9wcyAjMCwgCisgIC8vIGFuZCAjMSkgYW5kIHRoZSBjb25kaXRpb24gY29kZSB0byBjb21wYXJlIHRoZW0gd2l0aCAob3AgIzIpIGFzIGEgCisgIC8vIENvbmRDb2RlU0ROb2RlLgorICBTRFZhbHVlIExIUyA9IE9wLmdldE9wZXJhbmQoMCk7IAorICBTRFZhbHVlIFJIUyA9IE9wLmdldE9wZXJhbmQoMSk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCgyKSktPmdldCgpOworICAKKyAgcmV0dXJuIERBRy5nZXROb2RlKE1pcHNJU0Q6OkZQQ21wLCBkbCwgT3AuZ2V0VmFsdWVUeXBlKCksIExIUywgUkhTLCAKKyAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEZQQ29uZENDb2RlVG9GQ0MoQ0MpLCBNVlQ6OmkzMikpOworfQorCitTRFZhbHVlIE1pcHNUYXJnZXRMb3dlcmluZzo6CitMb3dlclNFTEVDVChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QKK3sKKyAgU0RWYWx1ZSBDb25kICA9IE9wLmdldE9wZXJhbmQoMCk7IAorICBTRFZhbHVlIFRydWUgID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBGYWxzZSA9IE9wLmdldE9wZXJhbmQoMik7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBpZiB0aGUgaW5jb21taW5nIGNvbmRpdGlvbiBjb21lcyBmcm9tIGEgaW50ZWdlciBjb21wYXJlLCB0aGUgc2VsZWN0IAorICAvLyBvcGVyYXRpb24gbXVzdCBiZSBTZWxlY3RDQyBvciBhIGNvbmRpdGlvbmFsIG1vdmUgaWYgdGhlIHN1YnRhcmdldCAKKyAgLy8gc3VwcG9ydHMgaXQuCisgIGlmIChDb25kLmdldE9wY29kZSgpICE9IE1pcHNJU0Q6OkZQQ21wKSB7CisgICAgaWYgKFN1YnRhcmdldC0+aGFzQ29uZE1vdigpICYmICFUcnVlLmdldFZhbHVlVHlwZSgpLmlzRmxvYXRpbmdQb2ludCgpKQorICAgICAgcmV0dXJuIE9wOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShNaXBzSVNEOjpTZWxlY3RDQywgZGwsIFRydWUuZ2V0VmFsdWVUeXBlKCksIAorICAgICAgICAgICAgICAgICAgICAgICBDb25kLCBUcnVlLCBGYWxzZSk7CisgIH0KKworICAvLyBpZiB0aGUgaW5jb21taW5nIGNvbmRpdGlvbiBjb21lcyBmcm9tIGZwY21wLCB0aGUgc2VsZWN0CisgIC8vIG9wZXJhdGlvbiBtdXN0IHVzZSBGUFNlbGVjdENDLgorICBTRFZhbHVlIENDTm9kZSA9IENvbmQuZ2V0T3BlcmFuZCgyKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKE1pcHNJU0Q6OkZQU2VsZWN0Q0MsIGRsLCBUcnVlLmdldFZhbHVlVHlwZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgIENvbmQsIFRydWUsIEZhbHNlLCBDQ05vZGUpOworfQorCitTRFZhbHVlIE1pcHNUYXJnZXRMb3dlcmluZzo6TG93ZXJHbG9iYWxBZGRyZXNzKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIEZJWE1FIHRoZXJlIGlzbid0IGFjdHVhbGx5IGRlYnVnIGluZm8gaGVyZQorICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGNhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oT3ApLT5nZXRHbG9iYWwoKTsKKworICBpZiAoZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFJlbG9jYXRpb25Nb2RlbCgpICE9IFJlbG9jOjpQSUNfKSB7CisgICAgU0RWVExpc3QgVlRzID0gREFHLmdldFZUTGlzdChNVlQ6OmkzMik7CisgICAgCisgICAgTWlwc1RhcmdldE9iamVjdEZpbGUgJlRMT0YgPSAoTWlwc1RhcmdldE9iamVjdEZpbGUmKWdldE9iakZpbGVMb3dlcmluZygpOworICAgIAorICAgIC8vICVncF9yZWwgcmVsb2NhdGlvbgorICAgIGlmIChUTE9GLklzR2xvYmFsSW5TbWFsbFNlY3Rpb24oR1YsIGdldFRhcmdldE1hY2hpbmUoKSkpIHsgCisgICAgICBTRFZhbHVlIEdBID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoR1YsIGRsLCBNVlQ6OmkzMiwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlwc0lJOjpNT19HUFJFTCk7CisgICAgICBTRFZhbHVlIEdQUmVsTm9kZSA9IERBRy5nZXROb2RlKE1pcHNJU0Q6OkdQUmVsLCBkbCwgVlRzLCAmR0EsIDEpOworICAgICAgU0RWYWx1ZSBHT1QgPSBEQUcuZ2V0R0xPQkFMX09GRlNFVF9UQUJMRShNVlQ6OmkzMik7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgR09ULCBHUFJlbE5vZGUpOyAKKyAgICB9CisgICAgLy8gJWhpLyVsbyByZWxvY2F0aW9uCisgICAgU0RWYWx1ZSBHQSA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEdWLCBkbCwgTVZUOjppMzIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pcHNJSTo6TU9fQUJTX0hJTE8pOworICAgIFNEVmFsdWUgSGlQYXJ0ID0gREFHLmdldE5vZGUoTWlwc0lTRDo6SGksIGRsLCBWVHMsICZHQSwgMSk7CisgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKE1pcHNJU0Q6OkxvLCBkbCwgTVZUOjppMzIsIEdBKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgSGlQYXJ0LCBMbyk7CisKKyAgfSBlbHNlIHsKKyAgICBTRFZhbHVlIEdBID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoR1YsIGRsLCBNVlQ6OmkzMiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlwc0lJOjpNT19HT1QpOworICAgIFNEVmFsdWUgUmVzTm9kZSA9IERBRy5nZXRMb2FkKE1WVDo6aTMyLCBkbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEVudHJ5Tm9kZSgpLCBHQSwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgIC8vIE9uIGZ1bmN0aW9ucyBhbmQgZ2xvYmFsIHRhcmdldHMgbm90IGludGVybmFsIGxpbmtlZCBvbmx5CisgICAgLy8gYSBsb2FkIGZyb20gZ290L0dQIGlzIG5lY2Vzc2FyeSBmb3IgUElDIHRvIHdvcmsuCisgICAgaWYgKCFHVi0+aGFzTG9jYWxMaW5rYWdlKCkgfHwgaXNhPEZ1bmN0aW9uPihHVikpCisgICAgICByZXR1cm4gUmVzTm9kZTsKKyAgICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoTWlwc0lTRDo6TG8sIGRsLCBNVlQ6OmkzMiwgR0EpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCBSZXNOb2RlLCBMbyk7CisgIH0KKworICBsbHZtX3VucmVhY2hhYmxlKCJEb250IGtub3cgaG93IHRvIGhhbmRsZSBHbG9iYWxBZGRyZXNzIik7CisgIHJldHVybiBTRFZhbHVlKDAsMCk7Cit9CisKK1NEVmFsdWUgTWlwc1RhcmdldExvd2VyaW5nOjoKK0xvd2VyR2xvYmFsVExTQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QKK3sKKyAgbGx2bV91bnJlYWNoYWJsZSgiVExTIG5vdCBpbXBsZW1lbnRlZCBmb3IgTUlQUy4iKTsKKyAgcmV0dXJuIFNEVmFsdWUoKTsgLy8gTm90IHJlYWNoZWQKK30KKworU0RWYWx1ZSBNaXBzVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJKdW1wVGFibGUoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0Cit7CisgIFNEVmFsdWUgUmVzTm9kZTsKKyAgU0RWYWx1ZSBIaVBhcnQ7IAorICAvLyBGSVhNRSB0aGVyZSBpc24ndCBhY3R1YWxseSBkZWJ1ZyBpbmZvIGhlcmUKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBib29sIElzUElDID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfOworICB1bnNpZ25lZCBjaGFyIE9wRmxhZyA9IElzUElDID8gTWlwc0lJOjpNT19HT1QgOiBNaXBzSUk6Ok1PX0FCU19ISUxPOworCisgIEVWVCBQdHJWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBKdW1wVGFibGVTRE5vZGUgKkpUICA9IGNhc3Q8SnVtcFRhYmxlU0ROb2RlPihPcCk7CisKKyAgU0RWYWx1ZSBKVEkgPSBEQUcuZ2V0VGFyZ2V0SnVtcFRhYmxlKEpULT5nZXRJbmRleCgpLCBQdHJWVCwgT3BGbGFnKTsKKworICBpZiAoIUlzUElDKSB7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgSlRJIH07CisgICAgSGlQYXJ0ID0gREFHLmdldE5vZGUoTWlwc0lTRDo6SGksIGRsLCBEQUcuZ2V0VlRMaXN0KE1WVDo6aTMyKSwgT3BzLCAxKTsKKyAgfSBlbHNlIC8vIEVtaXQgTG9hZCBmcm9tIEdsb2JhbCBQb2ludGVyCisgICAgSGlQYXJ0ID0gREFHLmdldExvYWQoTVZUOjppMzIsIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksIEpUSSwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworCisgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Tm9kZShNaXBzSVNEOjpMbywgZGwsIE1WVDo6aTMyLCBKVEkpOworICBSZXNOb2RlID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgSGlQYXJ0LCBMbyk7CisKKyAgcmV0dXJuIFJlc05vZGU7Cit9CisKK1NEVmFsdWUgTWlwc1RhcmdldExvd2VyaW5nOjoKK0xvd2VyQ29uc3RhbnRQb29sKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICBTRFZhbHVlIFJlc05vZGU7CisgIENvbnN0YW50UG9vbFNETm9kZSAqTiA9IGNhc3Q8Q29uc3RhbnRQb29sU0ROb2RlPihPcCk7CisgIGNvbnN0IENvbnN0YW50ICpDID0gTi0+Z2V0Q29uc3RWYWwoKTsKKyAgLy8gRklYTUUgdGhlcmUgaXNuJ3QgYWN0dWFsbHkgZGVidWcgaW5mbyBoZXJlCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBncF9yZWwgcmVsb2NhdGlvbgorICAvLyBGSVhNRTogd2Ugc2hvdWxkIHJlZmVyZW5jZSB0aGUgY29uc3RhbnQgcG9vbCB1c2luZyBzbWFsbCBkYXRhIHNlY3Rpb25zLCAKKyAgLy8gYnV0IHRoZSBhc20gcHJpbnRlciBjdXJyZW50bHkgZG9lbnMndCBzdXBwb3J0IHRoaXMgZmVhdHVyZSB3aXRob3V0CisgIC8vIGhhY2tpbmcgaXQuIFRoaXMgZmVhdHVyZSBzaG91bGQgY29tZSBzb29uIHNvIHdlIGNhbiB1bmNvbW1lbnQgdGhlIAorICAvLyBzdHVmZiBiZWxvdy4KKyAgLy9pZiAoSXNJblNtYWxsU2VjdGlvbihDLT5nZXRUeXBlKCkpKSB7CisgIC8vICBTRFZhbHVlIEdQUmVsTm9kZSA9IERBRy5nZXROb2RlKE1pcHNJU0Q6OkdQUmVsLCBNVlQ6OmkzMiwgQ1ApOworICAvLyAgU0RWYWx1ZSBHT1QgPSBEQUcuZ2V0R0xPQkFMX09GRlNFVF9UQUJMRShNVlQ6OmkzMik7CisgIC8vICBSZXNOb2RlID0gREFHLmdldE5vZGUoSVNEOjpBREQsIE1WVDo6aTMyLCBHT1QsIEdQUmVsTm9kZSk7IAorCisgIGlmIChnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgIT0gUmVsb2M6OlBJQ18pIHsKKyAgICBTRFZhbHVlIENQID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDLCBNVlQ6OmkzMiwgTi0+Z2V0QWxpZ25tZW50KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPZmZzZXQoKSwgTWlwc0lJOjpNT19BQlNfSElMTyk7CisgICAgU0RWYWx1ZSBIaVBhcnQgPSBEQUcuZ2V0Tm9kZShNaXBzSVNEOjpIaSwgZGwsIE1WVDo6aTMyLCBDUCk7CisgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKE1pcHNJU0Q6OkxvLCBkbCwgTVZUOjppMzIsIENQKTsKKyAgICBSZXNOb2RlID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgSGlQYXJ0LCBMbyk7CisgIH0gZWxzZSB7CisgICAgU0RWYWx1ZSBDUCA9IERBRy5nZXRUYXJnZXRDb25zdGFudFBvb2woQywgTVZUOjppMzIsIE4tPmdldEFsaWdubWVudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T2Zmc2V0KCksIE1pcHNJSTo6TU9fR09UKTsKKyAgICBTRFZhbHVlIExvYWQgPSBEQUcuZ2V0TG9hZChNVlQ6OmkzMiwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1AsIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKE1pcHNJU0Q6OkxvLCBkbCwgTVZUOjppMzIsIENQKTsKKyAgICBSZXNOb2RlID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgTG9hZCwgTG8pOworICB9CisKKyAgcmV0dXJuIFJlc05vZGU7Cit9CisKK1NEVmFsdWUgTWlwc1RhcmdldExvd2VyaW5nOjpMb3dlclZBU1RBUlQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgTWlwc0Z1bmN0aW9uSW5mbyAqRnVuY0luZm8gPSBNRi5nZXRJbmZvPE1pcHNGdW5jdGlvbkluZm8+KCk7CisKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIEZJID0gREFHLmdldEZyYW1lSW5kZXgoRnVuY0luZm8tPmdldFZhckFyZ3NGcmFtZUluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSk7CisKKyAgLy8gdmFzdGFydCBqdXN0IHN0b3JlcyB0aGUgYWRkcmVzcyBvZiB0aGUgVmFyQXJnc0ZyYW1lSW5kZXggc2xvdCBpbnRvIHRoZQorICAvLyBtZW1vcnkgbG9jYXRpb24gYXJndW1lbnQuCisgIGNvbnN0IFZhbHVlICpTViA9IGNhc3Q8U3JjVmFsdWVTRE5vZGU+KE9wLmdldE9wZXJhbmQoMikpLT5nZXRWYWx1ZSgpOworICByZXR1cm4gREFHLmdldFN0b3JlKE9wLmdldE9wZXJhbmQoMCksIGRsLCBGSSwgT3AuZ2V0T3BlcmFuZCgxKSwgU1YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmcgQ29udmVudGlvbiBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1pcHNHZW5DYWxsaW5nQ29udi5pbmMiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUT0RPOiBJbXBsZW1lbnQgYSBnZW5lcmljIGxvZ2ljIHVzaW5nIHRibGdlbiB0aGF0IGNhbiBzdXBwb3J0IHRoaXMuIAorLy8gTWlwcyBPMzIgQUJJIHJ1bGVzOgorLy8gLS0tCisvLyBpMzIgLSBQYXNzZWQgaW4gQTAsIEExLCBBMiwgQTMgYW5kIHN0YWNrCisvLyBmMzIgLSBPbmx5IHBhc3NlZCBpbiBmMzIgcmVnaXN0ZXJzIGlmIG5vIGludCByZWcgaGFzIGJlZW4gdXNlZCB5ZXQgdG8gaG9sZCAKKy8vICAgICAgIGFuIGFyZ3VtZW50LiBPdGhlcndpc2UsIHBhc3NlZCBpbiBBMSwgQTIsIEEzIGFuZCBzdGFjay4KKy8vIGY2NCAtIE9ubHkgcGFzc2VkIGluIHR3byBhbGlhc2VkIGYzMiByZWdpc3RlcnMgaWYgbm8gaW50IHJlZyBoYXMgYmVlbiB1c2VkIAorLy8gICAgICAgeWV0IHRvIGhvbGQgYW4gYXJndW1lbnQuIE90aGVyd2lzZSwgdXNlIEEyLCBBMyBhbmQgc3RhY2suIElmIEExIGlzIAorLy8gICAgICAgbm90IHVzZWQsIGl0IG11c3QgYmUgc2hhZG93ZWQuIElmIG9ubHkgQTMgaXMgYXZhaWFibGUsIHNoYWRvdyBpdCBhbmQKKy8vICAgICAgIGdvIHRvIHN0YWNrLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RhdGljIGJvb2wgQ0NfTWlwc08zMih1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpIHsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW50UmVnc1NpemU9NCwgRmxvYXRSZWdzU2l6ZT0yOyAKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW50UmVnc1tdID0geworICAgICAgTWlwczo6QTAsIE1pcHM6OkExLCBNaXBzOjpBMiwgTWlwczo6QTMKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEYzMlJlZ3NbXSA9IHsKKyAgICAgIE1pcHM6OkYxMiwgTWlwczo6RjE0CisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBGNjRSZWdzW10gPSB7CisgICAgICBNaXBzOjpENiwgTWlwczo6RDcKKyAgfTsKKworICB1bnNpZ25lZCBSZWc9MDsKKyAgdW5zaWduZWQgVW5hbGxvY0ludFJlZyA9IFN0YXRlLmdldEZpcnN0VW5hbGxvY2F0ZWQoSW50UmVncywgSW50UmVnc1NpemUpOworICBib29sIEludFJlZ1VzZWQgPSAoSW50UmVnc1tVbmFsbG9jSW50UmVnXSAhPSAodW5zaWduZWQgKE1pcHM6OkEwKSkpOworCisgIC8vIFByb21vdGUgaTggYW5kIGkxNgorICBpZiAoTG9jVlQgPT0gTVZUOjppOCB8fCBMb2NWVCA9PSBNVlQ6OmkxNikgeworICAgIExvY1ZUID0gTVZUOjppMzI7CisgICAgaWYgKEFyZ0ZsYWdzLmlzU0V4dCgpKQorICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpTRXh0OworICAgIGVsc2UgaWYgKEFyZ0ZsYWdzLmlzWkV4dCgpKQorICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpaRXh0OworICAgIGVsc2UKKyAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6QUV4dDsKKyAgfQorCisgIGlmIChWYWxWVCA9PSBNVlQ6OmkzMiB8fCAoVmFsVlQgPT0gTVZUOjpmMzIgJiYgSW50UmVnVXNlZCkpIHsKKyAgICBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhJbnRSZWdzLCBJbnRSZWdzU2l6ZSk7CisgICAgSW50UmVnVXNlZCA9IHRydWU7CisgICAgTG9jVlQgPSBNVlQ6OmkzMjsKKyAgfQorCisgIGlmIChWYWxWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJiAhSW50UmVnVXNlZCkgeworICAgIGlmIChWYWxWVCA9PSBNVlQ6OmYzMikKKyAgICAgIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKEYzMlJlZ3MsIEZsb2F0UmVnc1NpemUpOworICAgIGVsc2UKKyAgICAgIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKEY2NFJlZ3MsIEZsb2F0UmVnc1NpemUpOworICB9CisKKyAgaWYgKFZhbFZUID09IE1WVDo6ZjY0ICYmIEludFJlZ1VzZWQpIHsKKyAgICBpZiAoVW5hbGxvY0ludFJlZyAhPSBJbnRSZWdzU2l6ZSkgeworICAgICAgLy8gSWYgd2UgaGl0IHJlZ2lzdGVyIEEzIGFzIHRoZSBmaXJzdCBub3QgYWxsb2NhdGVkLCB3ZSBtdXN0CisgICAgICAvLyBtYXJrIGl0IGFzIGFsbG9jYXRlZCAoc2hhZG93KSBhbmQgdXNlIHRoZSBzdGFjayBpbnN0ZWFkLgorICAgICAgaWYgKEludFJlZ3NbVW5hbGxvY0ludFJlZ10gIT0gKHVuc2lnbmVkIChNaXBzOjpBMykpKQorICAgICAgICBSZWcgPSBNaXBzOjpBMjsKKyAgICAgIGZvciAoO1VuYWxsb2NJbnRSZWcgPCBJbnRSZWdzU2l6ZTsgKytVbmFsbG9jSW50UmVnKQorICAgICAgICBTdGF0ZS5BbGxvY2F0ZVJlZyhVbmFsbG9jSW50UmVnKTsKKyAgICB9IAorICAgIExvY1ZUID0gTVZUOjppMzI7CisgIH0KKworICBpZiAoIVJlZykgeworICAgIHVuc2lnbmVkIFNpemVJbkJ5dGVzID0gVmFsVlQuZ2V0U2l6ZUluQml0cygpID4+IDM7CisgICAgdW5zaWduZWQgT2Zmc2V0ID0gU3RhdGUuQWxsb2NhdGVTdGFjayhTaXplSW5CeXRlcywgU2l6ZUluQnl0ZXMpOworICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0TWVtKFZhbE5vLCBWYWxWVCwgT2Zmc2V0LCBMb2NWVCwgTG9jSW5mbykpOworICB9IGVsc2UKKyAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsKKworICByZXR1cm4gZmFsc2U7IC8vIENDIG11c3QgYWx3YXlzIG1hdGNoCit9CisKK3N0YXRpYyBib29sIENDX01pcHNPMzJfVmFyQXJncyh1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpIHsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW50UmVnc1NpemU9NDsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW50UmVnc1tdID0geworICAgICAgTWlwczo6QTAsIE1pcHM6OkExLCBNaXBzOjpBMiwgTWlwczo6QTMKKyAgfTsKKworICAvLyBQcm9tb3RlIGk4IGFuZCBpMTYKKyAgaWYgKExvY1ZUID09IE1WVDo6aTggfHwgTG9jVlQgPT0gTVZUOjppMTYpIHsKKyAgICBMb2NWVCA9IE1WVDo6aTMyOworICAgIGlmIChBcmdGbGFncy5pc1NFeHQoKSkKKyAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6U0V4dDsKKyAgICBlbHNlIGlmIChBcmdGbGFncy5pc1pFeHQoKSkKKyAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6WkV4dDsKKyAgICBlbHNlCisgICAgICBMb2NJbmZvID0gQ0NWYWxBc3NpZ246OkFFeHQ7CisgIH0KKworICBpZiAoVmFsVlQgPT0gTVZUOjppMzIgfHwgVmFsVlQgPT0gTVZUOjpmMzIpIHsKKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoSW50UmVncywgSW50UmVnc1NpemUpKSB7CisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTVZUOjppMzIsIExvY0luZm8pKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdW5zaWduZWQgT2ZmID0gU3RhdGUuQWxsb2NhdGVTdGFjayg0LCA0KTsKKyAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldE1lbShWYWxObywgVmFsVlQsIE9mZiwgTG9jVlQsIExvY0luZm8pKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB1bnNpZ25lZCBVbmFsbG9jSW50UmVnID0gU3RhdGUuZ2V0Rmlyc3RVbmFsbG9jYXRlZChJbnRSZWdzLCBJbnRSZWdzU2l6ZSk7CisgIGlmIChWYWxWVCA9PSBNVlQ6OmY2NCkgeworICAgIGlmIChJbnRSZWdzW1VuYWxsb2NJbnRSZWddID09ICh1bnNpZ25lZCAoTWlwczo6QTEpKSkgeworICAgICAgLy8gQTEgY2FuJ3QgYmUgdXNlZCBhbnltb3JlLCBiZWNhdXNlIDY0IGJpdCBhcmd1bWVudHMKKyAgICAgIC8vIG11c3QgYmUgYWxpZ25lZCB3aGVuIGNvcGllZCBiYWNrIHRvIHRoZSBjYWxsZXIgc3RhY2sKKyAgICAgIFN0YXRlLkFsbG9jYXRlUmVnKEludFJlZ3MsIEludFJlZ3NTaXplKTsKKyAgICAgIFVuYWxsb2NJbnRSZWcrKzsKKyAgICB9CisKKyAgICBpZiAoSW50UmVnc1tVbmFsbG9jSW50UmVnXSA9PSAodW5zaWduZWQgKE1pcHM6OkEwKSkgfHwKKyAgICAgICAgSW50UmVnc1tVbmFsbG9jSW50UmVnXSA9PSAodW5zaWduZWQgKE1pcHM6OkEyKSkpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKEludFJlZ3MsIEludFJlZ3NTaXplKTsKKyAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBNVlQ6OmkzMiwgTG9jSW5mbykpOworICAgICAgLy8gU2hhZG93IHRoZSBuZXh0IHJlZ2lzdGVyIHNvIGl0IGNhbiBiZSB1c2VkIAorICAgICAgLy8gbGF0ZXIgdG8gZ2V0IHRoZSBvdGhlciAzMmJpdCBwYXJ0LgorICAgICAgU3RhdGUuQWxsb2NhdGVSZWcoSW50UmVncywgSW50UmVnc1NpemUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIGlzIHNoYWRvd2VkIHRvIHByZXNlcnZlIGFsaWdubWVudCwgYW5kIHRoZQorICAgIC8vIGFyZ3VtZW50IGdvZXMgdG8gYSBzdGFjayBsb2NhdGlvbi4KKyAgICBpZiAoVW5hbGxvY0ludFJlZyAhPSBJbnRSZWdzU2l6ZSkKKyAgICAgIFN0YXRlLkFsbG9jYXRlUmVnKEludFJlZ3MsIEludFJlZ3NTaXplKTsKKworICAgIHVuc2lnbmVkIE9mZiA9IFN0YXRlLkFsbG9jYXRlU3RhY2soOCwgOCk7CisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmYsIExvY1ZULCBMb2NJbmZvKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7IC8vIENDIGRpZG4ndCBtYXRjaAorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICBDYWxsIENhbGxpbmcgQ29udmVudGlvbiBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIExvd2VyQ2FsbCAtIGZ1bmN0aW9ucyBhcmd1bWVudHMgYXJlIGNvcGllZCBmcm9tIHZpcnR1YWwgcmVncyB0bworLy8vIChwaHlzaWNhbCByZWdzKS8oc3RhY2sgZnJhbWUpLCBDQUxMU0VRX1NUQVJUIGFuZCBDQUxMU0VRX0VORCBhcmUgZW1pdHRlZC4KKy8vLyBUT0RPOiBpc1RhaWxDYWxsLgorU0RWYWx1ZQorTWlwc1RhcmdldExvd2VyaW5nOjpMb3dlckNhbGwoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgLy8gTUlQcyB0YXJnZXQgZG9lcyBub3QgeWV0IHN1cHBvcnQgdGFpbCBjYWxsIG9wdGltaXphdGlvbi4KKyAgaXNUYWlsQ2FsbCA9IGZhbHNlOworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBib29sIElzUElDID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfOworCisgIC8vIEFuYWx5emUgb3BlcmFuZHMgb2YgdGhlIGNhbGwsIGFzc2lnbmluZyBsb2NhdGlvbnMgdG8gZWFjaCBvcGVyYW5kLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IEFyZ0xvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLCBBcmdMb2NzLAorICAgICAgICAgICAgICAgICAqREFHLmdldENvbnRleHQoKSk7CisKKyAgLy8gVG8gbWVldCBPMzIgQUJJLCBNaXBzIG11c3QgYWx3YXlzIGFsbG9jYXRlIDE2IGJ5dGVzIG9uCisgIC8vIHRoZSBzdGFjayAoZXZlbiBpZiBsZXNzIHRoYW4gNCBhcmUgdXNlZCBhcyBhcmd1bWVudHMpCisgIGlmIChTdWJ0YXJnZXQtPmlzQUJJX08zMigpKSB7CisgICAgaW50IFZUc2l6ZSA9IEVWVChNVlQ6OmkzMikuZ2V0U2l6ZUluQml0cygpLzg7CisgICAgTUZJLT5DcmVhdGVGaXhlZE9iamVjdChWVHNpemUsIChWVHNpemUqMyksIHRydWUpOworICAgIENDSW5mby5BbmFseXplQ2FsbE9wZXJhbmRzKE91dHMsIAorICAgICAgICAgICAgICAgICAgICAgaXNWYXJBcmcgPyBDQ19NaXBzTzMyX1ZhckFyZ3MgOiBDQ19NaXBzTzMyKTsKKyAgfSBlbHNlCisgICAgQ0NJbmZvLkFuYWx5emVDYWxsT3BlcmFuZHMoT3V0cywgQ0NfTWlwcyk7CisgIAorICAvLyBHZXQgYSBjb3VudCBvZiBob3cgbWFueSBieXRlcyBhcmUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjay4KKyAgdW5zaWduZWQgTnVtQnl0ZXMgPSBDQ0luZm8uZ2V0TmV4dFN0YWNrT2Zmc2V0KCk7CisgIENoYWluID0gREFHLmdldENBTExTRVFfU1RBUlQoQ2hhaW4sIERBRy5nZXRJbnRQdHJDb25zdGFudChOdW1CeXRlcywgdHJ1ZSkpOworCisgIC8vIFdpdGggRUFCSSBpcyBpdCBwb3NzaWJsZSB0byBoYXZlIDE2IGFyZ3Mgb24gcmVnaXN0ZXJzLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIFNEVmFsdWU+LCAxNj4gUmVnc1RvUGFzczsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gTWVtT3BDaGFpbnM7CisKKyAgLy8gRmlyc3QvTGFzdEFyZ1N0YWNrTG9jIGNvbnRhaW5zIHRoZSBmaXJzdC9sYXN0IAorICAvLyAiYXQgc3RhY2siIGFyZ3VtZW50IGxvY2F0aW9uLgorICBpbnQgTGFzdEFyZ1N0YWNrTG9jID0gMDsKKyAgdW5zaWduZWQgRmlyc3RTdGFja0FyZ0xvYyA9IChTdWJ0YXJnZXQtPmlzQUJJX0VBQkkoKSA/IDAgOiAxNik7CisKKyAgLy8gV2FsayB0aGUgcmVnaXN0ZXIvbWVtbG9jIGFzc2lnbm1lbnRzLCBpbnNlcnRpbmcgY29waWVzL2xvYWRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgU0RWYWx1ZSBBcmcgPSBPdXRWYWxzW2ldOworICAgIENDVmFsQXNzaWduICZWQSA9IEFyZ0xvY3NbaV07CisKKyAgICAvLyBQcm9tb3RlIHRoZSB2YWx1ZSBpZiBuZWVkZWQuCisgICAgc3dpdGNoIChWQS5nZXRMb2NJbmZvKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGxvYyBpbmZvISIpOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OkZ1bGw6IAorICAgICAgaWYgKFN1YnRhcmdldC0+aXNBQklfTzMyKCkgJiYgVkEuaXNSZWdMb2MoKSkgeworICAgICAgICBpZiAoVkEuZ2V0VmFsVlQoKSA9PSBNVlQ6OmYzMiAmJiBWQS5nZXRMb2NWVCgpID09IE1WVDo6aTMyKQorICAgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmkzMiwgQXJnKTsKKyAgICAgICAgaWYgKFZBLmdldFZhbFZUKCkgPT0gTVZUOjpmNjQgJiYgVkEuZ2V0TG9jVlQoKSA9PSBNVlQ6OmkzMikgeworICAgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6Omk2NCwgQXJnKTsKKyAgICAgICAgICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwgQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgZ2V0UG9pbnRlclR5KCkpKTsKKyAgICAgICAgICBTRFZhbHVlIEhpID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwgQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgZ2V0UG9pbnRlclR5KCkpKTsKKyAgICAgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWQS5nZXRMb2NSZWcoKSwgTG8pKTsKKyAgICAgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWQS5nZXRMb2NSZWcoKSsxLCBIaSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9ICAKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OlNFeHQ6CisgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNJR05fRVhURU5ELCBkbCwgVkEuZ2V0TG9jVlQoKSwgQXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OlpFeHQ6CisgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwgVkEuZ2V0TG9jVlQoKSwgQXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OkFFeHQ6CisgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIC8vIEFyZ3VtZW50cyB0aGF0IGNhbiBiZSBwYXNzZWQgb24gcmVnaXN0ZXIgbXVzdCBiZSBrZXB0IGF0IAorICAgIC8vIFJlZ3NUb1Bhc3MgdmVjdG9yCisgICAgaWYgKFZBLmlzUmVnTG9jKCkpIHsKKyAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFZBLmdldExvY1JlZygpLCBBcmcpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvLyBSZWdpc3RlciBjYW4ndCBnZXQgdG8gdGhpcyBwb2ludC4uLgorICAgIGFzc2VydChWQS5pc01lbUxvYygpKTsKKyAgICAKKyAgICAvLyBDcmVhdGUgdGhlIGZyYW1lIGluZGV4IG9iamVjdCBmb3IgdGhpcyBpbmNvbWluZyBwYXJhbWV0ZXIKKyAgICAvLyBUaGlzIGd1YXJhbnRlZXMgdGhhdCB3aGVuIGFsbG9jYXRpbmcgTG9jYWwgQXJlYSB0aGUgZmlyc3RzCisgICAgLy8gMTYgYnl0ZXMgd2hpY2ggYXJlIGFsd2F5ZXMgcmVzZXJ2ZWQgd29uJ3QgYmUgb3ZlcndyaXR0ZW4KKyAgICAvLyBpZiBPMzIgQUJJIGlzIHVzZWQuIEZvciBFQUJJIHRoZSBmaXJzdCBhZGRyZXNzIGlzIHplcm8uCisgICAgTGFzdEFyZ1N0YWNrTG9jID0gKEZpcnN0U3RhY2tBcmdMb2MgKyBWQS5nZXRMb2NNZW1PZmZzZXQoKSk7CisgICAgaW50IEZJID0gTUZJLT5DcmVhdGVGaXhlZE9iamVjdChWQS5nZXRWYWxWVCgpLmdldFNpemVJbkJpdHMoKS84LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdEFyZ1N0YWNrTG9jLCB0cnVlKTsKKworICAgIFNEVmFsdWUgUHRyT2ZmID0gREFHLmdldEZyYW1lSW5kZXgoRkksZ2V0UG9pbnRlclR5KCkpOworCisgICAgLy8gZW1pdCBJU0Q6OlNUT1JFIHdoaWNocyBzdG9yZXMgdGhlIAorICAgIC8vIHBhcmFtZXRlciB2YWx1ZSB0byBhIHN0YWNrIExvY2F0aW9uCisgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIEFyZywgUHRyT2ZmLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisgIH0KKworICAvLyBUcmFuc2Zvcm0gYWxsIHN0b3JlIG5vZGVzIGludG8gb25lIHNpbmdsZSBub2RlIGJlY2F1c2UgYWxsIHN0b3JlCisgIC8vIG5vZGVzIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyLgorICBpZiAoIU1lbU9wQ2hhaW5zLmVtcHR5KCkpICAgICAKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICZNZW1PcENoYWluc1swXSwgTWVtT3BDaGFpbnMuc2l6ZSgpKTsKKworICAvLyBCdWlsZCBhIHNlcXVlbmNlIG9mIGNvcHktdG8tcmVnIG5vZGVzIGNoYWluZWQgdG9nZXRoZXIgd2l0aCB0b2tlbiAKKyAgLy8gY2hhaW4gYW5kIGZsYWcgb3BlcmFuZHMgd2hpY2ggY29weSB0aGUgb3V0Z29pbmcgYXJncyBpbnRvIHJlZ2lzdGVycy4KKyAgLy8gVGhlIEluRmxhZyBpbiBuZWNlc3Nhcnkgc2luY2UgYWxsIGVtaXRlZCBpbnN0cnVjdGlvbnMgbXVzdCBiZQorICAvLyBzdHVjayB0b2dldGhlci4KKyAgU0RWYWx1ZSBJbkZsYWc7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzVG9QYXNzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBSZWdzVG9QYXNzW2ldLmZpcnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQsIEluRmxhZyk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIH0KKworICAvLyBJZiB0aGUgY2FsbGVlIGlzIGEgR2xvYmFsQWRkcmVzcy9FeHRlcm5hbFN5bWJvbCBub2RlIChxdWl0ZSBjb21tb24sIGV2ZXJ5CisgIC8vIGRpcmVjdCBjYWxsIGlzKSB0dXJuIGl0IGludG8gYSBUYXJnZXRHbG9iYWxBZGRyZXNzL1RhcmdldEV4dGVybmFsU3ltYm9sIAorICAvLyBub2RlIHNvIHRoYXQgbGVnYWxpemUgZG9lc24ndCBoYWNrIGl0LiAKKyAgdW5zaWduZWQgY2hhciBPcEZsYWcgPSBJc1BJQyA/IE1pcHNJSTo6TU9fR09UX0NBTEwgOiBNaXBzSUk6Ok1PX05PX0ZMQUc7CisgIGlmIChHbG9iYWxBZGRyZXNzU0ROb2RlICpHID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oQ2FsbGVlKSkgCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoRy0+Z2V0R2xvYmFsKCksIGRsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCksIDAsIE9wRmxhZyk7CisgIGVsc2UgaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpTID0gZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKFMtPmdldFN5bWJvbCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCksIE9wRmxhZyk7CisKKyAgLy8gTWlwc0ptcExpbmsgPSAjY2hhaW4sICN0YXJnZXRfYWRkcmVzcywgI29wdF9pbl9mbGFncy4uLgorICAvLyAgICAgICAgICAgICA9IENoYWluLCBDYWxsZWUsIFJlZyMxLCBSZWcjMiwgLi4uICAKKyAgLy8KKyAgLy8gUmV0dXJucyBhIGNoYWluICYgYSBmbGFnIGZvciByZXR2YWwgY29weSB0byB1c2UuCisgIFNEVlRMaXN0IE5vZGVUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wczsKKyAgT3BzLnB1c2hfYmFjayhDaGFpbik7CisgIE9wcy5wdXNoX2JhY2soQ2FsbGVlKTsKKworICAvLyBBZGQgYXJndW1lbnQgcmVnaXN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gdGhhdCB0aGV5IGFyZSAKKyAgLy8ga25vd24gbGl2ZSBpbnRvIHRoZSBjYWxsLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE9wcy5wdXNoX2JhY2soREFHLmdldFJlZ2lzdGVyKFJlZ3NUb1Bhc3NbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQuZ2V0VmFsdWVUeXBlKCkpKTsKKworICBpZiAoSW5GbGFnLmdldE5vZGUoKSkKKyAgICBPcHMucHVzaF9iYWNrKEluRmxhZyk7CisKKyAgQ2hhaW4gID0gREFHLmdldE5vZGUoTWlwc0lTRDo6Sm1wTGluaywgZGwsIE5vZGVUeXMsICZPcHNbMF0sIE9wcy5zaXplKCkpOworICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKworICAvLyBDcmVhdGUgYSBzdGFjayBsb2NhdGlvbiB0byBob2xkIEdQIHdoZW4gUElDIGlzIHVzZWQuIFRoaXMgc3RhY2sgCisgIC8vIGxvY2F0aW9uIGlzIHVzZWQgb24gZnVuY3Rpb24gcHJvbG9ndWUgdG8gc2F2ZSBHUCBhbmQgYWxzbyBhZnRlciBhbGwgCisgIC8vIGVtaXRlZCBDQUxMJ3MgdG8gcmVzdG9yZSBHUC4gCisgIGlmIChJc1BJQykgeworICAgICAgLy8gRnVuY3Rpb24gY2FuIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBjYWxscywgc28gCisgICAgICAvLyBob2xkIHRoZSBMYXN0QXJnU3RhY2tMb2Mgd2l0aCB0aGUgYmlnZ2VzdCBvZmZzZXQuCisgICAgICBpbnQgRkk7CisgICAgICBNaXBzRnVuY3Rpb25JbmZvICpNaXBzRkkgPSBNRi5nZXRJbmZvPE1pcHNGdW5jdGlvbkluZm8+KCk7CisgICAgICBpZiAoTGFzdEFyZ1N0YWNrTG9jID49IE1pcHNGSS0+Z2V0R1BTdGFja09mZnNldCgpKSB7CisgICAgICAgIExhc3RBcmdTdGFja0xvYyA9ICghTGFzdEFyZ1N0YWNrTG9jKSA/ICgxNikgOiAoTGFzdEFyZ1N0YWNrTG9jKzQpOworICAgICAgICAvLyBDcmVhdGUgdGhlIGZyYW1lIGluZGV4IG9ubHkgb25jZS4gU1BPZmZzZXQgaGVyZSBjYW4gYmUgYW55dGhpbmcgCisgICAgICAgIC8vICh0aGlzIHdpbGwgYmUgZml4ZWQgb24gcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlRnJhbWVGaW5hbGl6ZWQpCisgICAgICAgIGlmIChNaXBzRkktPmdldEdQU3RhY2tPZmZzZXQoKSA9PSAtMSkgeworICAgICAgICAgIEZJID0gTUZJLT5DcmVhdGVGaXhlZE9iamVjdCg0LCAwLCB0cnVlKTsKKyAgICAgICAgICBNaXBzRkktPnNldEdQRkkoRkkpOworICAgICAgICB9CisgICAgICAgIE1pcHNGSS0+c2V0R1BTdGFja09mZnNldChMYXN0QXJnU3RhY2tMb2MpOworICAgICAgfQorCisgICAgICAvLyBSZWxvYWQgR1AgdmFsdWUuCisgICAgICBGSSA9IE1pcHNGSS0+Z2V0R1BGSSgpOworICAgICAgU0RWYWx1ZSBGSU4gPSBEQUcuZ2V0RnJhbWVJbmRleChGSSxnZXRQb2ludGVyVHkoKSk7CisgICAgICBTRFZhbHVlIEdQTG9hZCA9IERBRy5nZXRMb2FkKE1WVDo6aTMyLCBkbCwgQ2hhaW4sIEZJTiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgIENoYWluID0gR1BMb2FkLmdldFZhbHVlKDEpOworICAgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgREFHLmdldFJlZ2lzdGVyKE1pcHM6OkdQLCBNVlQ6OmkzMiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQTG9hZCwgU0RWYWx1ZSgwLDApKTsKKyAgICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9ICAgICAgCisKKyAgLy8gQ3JlYXRlIHRoZSBDQUxMU0VRX0VORCBub2RlLgorICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX0VORChDaGFpbiwgREFHLmdldEludFB0ckNvbnN0YW50KE51bUJ5dGVzLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDAsIHRydWUpLCBJbkZsYWcpOworICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKworICAvLyBIYW5kbGUgcmVzdWx0IHZhbHVlcywgY29weWluZyB0aGVtIG91dCBvZiBwaHlzcmVncyBpbnRvIHZyZWdzIHRoYXQgd2UKKyAgLy8gcmV0dXJuLgorICByZXR1cm4gTG93ZXJDYWxsUmVzdWx0KENoYWluLCBJbkZsYWcsIENhbGxDb252LCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnMsIGRsLCBEQUcsIEluVmFscyk7Cit9CisKKy8vLyBMb3dlckNhbGxSZXN1bHQgLSBMb3dlciB0aGUgcmVzdWx0IHZhbHVlcyBvZiBhIGNhbGwgaW50byB0aGUKKy8vLyBhcHByb3ByaWF0ZSBjb3BpZXMgb3V0IG9mIGFwcHJvcHJpYXRlIHBoeXNpY2FsIHJlZ2lzdGVycy4KK1NEVmFsdWUKK01pcHNUYXJnZXRMb3dlcmluZzo6TG93ZXJDYWxsUmVzdWx0KFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworCisgIC8vIEFzc2lnbiBsb2NhdGlvbnMgdG8gZWFjaCB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGNhbGwuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gUlZMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgUlZMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisKKyAgQ0NJbmZvLkFuYWx5emVDYWxsUmVzdWx0KElucywgUmV0Q0NfTWlwcyk7CisKKyAgLy8gQ29weSBhbGwgb2YgdGhlIHJlc3VsdCByZWdpc3RlcnMgb3V0IG9mIHRoZWlyIHNwZWNpZmllZCBwaHlzcmVnLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkgeworICAgIENoYWluID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgUlZMb2NzW2ldLmdldExvY1JlZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJWTG9jc1tpXS5nZXRWYWxWVCgpLCBJbkZsYWcpLmdldFZhbHVlKDEpOworICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDIpOworICAgIEluVmFscy5wdXNoX2JhY2soQ2hhaW4uZ2V0VmFsdWUoMCkpOworICB9CisKKyAgcmV0dXJuIENoYWluOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgRm9ybWFsIEFyZ3VtZW50cyBDYWxsaW5nIENvbnZlbnRpb24gSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBMb3dlckZvcm1hbEFyZ3VtZW50cyAtIHRyYW5zZm9ybSBwaHlzaWNhbCByZWdpc3RlcnMgaW50byB2aXJ0dWFsIHJlZ2lzdGVycyAKKy8vLyBhbmQgZ2VuZXJhdGUgbG9hZCBvcGVyYXRpb25zIGZvciBhcmd1bWVudHMgcGxhY2VzIG9uIHRoZSBzdGFjay4KK1NEVmFsdWUKK01pcHNUYXJnZXRMb3dlcmluZzo6TG93ZXJGb3JtYWxBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1pcHNGdW5jdGlvbkluZm8gKk1pcHNGSSA9IE1GLmdldEluZm88TWlwc0Z1bmN0aW9uSW5mbz4oKTsKKworICB1bnNpZ25lZCBTdGFja1JlZyA9IE1GLmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpLT5nZXRGcmFtZVJlZ2lzdGVyKE1GKTsKKyAgTWlwc0ZJLT5zZXRWYXJBcmdzRnJhbWVJbmRleCgwKTsKKworICAvLyBVc2VkIHdpdGggdmFyZ3MgdG8gYWN1bXVsYXRlIHN0b3JlIGNoYWlucy4KKyAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gT3V0Q2hhaW5zOworCisgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgcmVnaXN0ZXIgdXNlZCBmb3IgYXJndW1lbnRzCisgIHVuc2lnbmVkIEFyZ1JlZ0VuZCA9IDA7CisKKyAgLy8gQXNzaWduIGxvY2F0aW9ucyB0byBhbGwgb2YgdGhlIGluY29taW5nIGFyZ3VtZW50cy4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgQXJnTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIGlmIChTdWJ0YXJnZXQtPmlzQUJJX08zMigpKQorICAgIENDSW5mby5BbmFseXplRm9ybWFsQXJndW1lbnRzKElucywgCisgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhckFyZyA/IENDX01pcHNPMzJfVmFyQXJncyA6IENDX01pcHNPMzIpOworICBlbHNlCisgICAgQ0NJbmZvLkFuYWx5emVGb3JtYWxBcmd1bWVudHMoSW5zLCBDQ19NaXBzKTsKKworICBTRFZhbHVlIFN0YWNrUHRyOworCisgIHVuc2lnbmVkIEZpcnN0U3RhY2tBcmdMb2MgPSAoU3VidGFyZ2V0LT5pc0FCSV9FQUJJKCkgPyAwIDogMTYpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBBcmdMb2NzW2ldOworCisgICAgLy8gQXJndW1lbnRzIHN0b3JlZCBvbiByZWdpc3RlcnMKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgRVZUIFJlZ1ZUID0gVkEuZ2V0TG9jVlQoKTsKKyAgICAgIEFyZ1JlZ0VuZCA9IFZBLmdldExvY1JlZygpOworICAgICAgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSAwOworCisgICAgICBpZiAoUmVnVlQgPT0gTVZUOjppMzIpCisgICAgICAgIFJDID0gTWlwczo6Q1BVUmVnc1JlZ2lzdGVyQ2xhc3M7IAorICAgICAgZWxzZSBpZiAoUmVnVlQgPT0gTVZUOjpmMzIpIAorICAgICAgICBSQyA9IE1pcHM6OkZHUjMyUmVnaXN0ZXJDbGFzczsKKyAgICAgIGVsc2UgaWYgKFJlZ1ZUID09IE1WVDo6ZjY0KSB7CisgICAgICAgIGlmICghU3VidGFyZ2V0LT5pc1NpbmdsZUZsb2F0KCkpIAorICAgICAgICAgIFJDID0gTWlwczo6QUZHUjY0UmVnaXN0ZXJDbGFzczsKKyAgICAgIH0gZWxzZSAgCisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlJlZ1ZUIG5vdCBzdXBwb3J0ZWQgYnkgRm9ybWFsQXJndW1lbnRzIExvd2VyaW5nIik7CisKKyAgICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJndW1lbnRzIHN0b3JlZCBvbiAKKyAgICAgIC8vIHBoeXNpY2FsIHJlZ2lzdGVycyBpbnRvIHZpcnR1YWwgb25lcworICAgICAgdW5zaWduZWQgUmVnID0gQWRkTGl2ZUluKERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKSwgQXJnUmVnRW5kLCBSQyk7CisgICAgICBTRFZhbHVlIEFyZ1ZhbHVlID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgUmVnLCBSZWdWVCk7CisgICAgICAKKyAgICAgIC8vIElmIHRoaXMgaXMgYW4gOCBvciAxNi1iaXQgdmFsdWUsIGl0IGhhcyBiZWVuIHBhc3NlZCBwcm9tb3RlZCAKKyAgICAgIC8vIHRvIDMyIGJpdHMuICBJbnNlcnQgYW4gYXNzZXJ0W3N6XWV4dCB0byBjYXB0dXJlIHRoaXMsIHRoZW4gCisgICAgICAvLyB0cnVuY2F0ZSB0byB0aGUgcmlnaHQgc2l6ZS4KKyAgICAgIGlmIChWQS5nZXRMb2NJbmZvKCkgIT0gQ0NWYWxBc3NpZ246OkZ1bGwpIHsKKyAgICAgICAgdW5zaWduZWQgT3Bjb2RlID0gMDsKKyAgICAgICAgaWYgKFZBLmdldExvY0luZm8oKSA9PSBDQ1ZhbEFzc2lnbjo6U0V4dCkKKyAgICAgICAgICBPcGNvZGUgPSBJU0Q6OkFzc2VydFNleHQ7CisgICAgICAgIGVsc2UgaWYgKFZBLmdldExvY0luZm8oKSA9PSBDQ1ZhbEFzc2lnbjo6WkV4dCkKKyAgICAgICAgICBPcGNvZGUgPSBJU0Q6OkFzc2VydFpleHQ7CisgICAgICAgIGlmIChPcGNvZGUpCisgICAgICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Tm9kZShPcGNvZGUsIGRsLCBSZWdWVCwgQXJnVmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShWQS5nZXRWYWxWVCgpKSk7CisgICAgICAgIEFyZ1ZhbHVlID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFZBLmdldFZhbFZUKCksIEFyZ1ZhbHVlKTsKKyAgICAgIH0KKworICAgICAgLy8gSGFuZGxlIE8zMiBBQkkgY2FzZXM6IGkzMi0+ZjMyIGFuZCAoaTMyLGkzMiktPmY2NCAKKyAgICAgIGlmIChTdWJ0YXJnZXQtPmlzQUJJX08zMigpKSB7CisgICAgICAgIGlmIChSZWdWVCA9PSBNVlQ6OmkzMiAmJiBWQS5nZXRWYWxWVCgpID09IE1WVDo6ZjMyKSAKKyAgICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmYzMiwgQXJnVmFsdWUpOworICAgICAgICBpZiAoUmVnVlQgPT0gTVZUOjppMzIgJiYgVkEuZ2V0VmFsVlQoKSA9PSBNVlQ6OmY2NCkgeworICAgICAgICAgIHVuc2lnbmVkIFJlZzIgPSBBZGRMaXZlSW4oREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBLmdldExvY1JlZygpKzEsIFJDKTsKKyAgICAgICAgICBTRFZhbHVlIEFyZ1ZhbHVlMiA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFJlZzIsIFJlZ1ZUKTsKKyAgICAgICAgICBTRFZhbHVlIEhpID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6ZjMyLCBBcmdWYWx1ZSk7CisgICAgICAgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmYzMiwgQXJnVmFsdWUyKTsKKyAgICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfUEFJUiwgZGwsIE1WVDo6ZjY0LCBMbywgSGkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEluVmFscy5wdXNoX2JhY2soQXJnVmFsdWUpOworICAgIH0gZWxzZSB7IC8vIFZBLmlzUmVnTG9jKCkKKworICAgICAgLy8gc2FuaXR5IGNoZWNrCisgICAgICBhc3NlcnQoVkEuaXNNZW1Mb2MoKSk7CisKKyAgICAgIC8vIFRoZSBsYXN0IGFyZ3VtZW50IGlzIG5vdCBhIHJlZ2lzdGVyIGFueW1vcmUKKyAgICAgIEFyZ1JlZ0VuZCA9IDA7CisgICAgICAKKyAgICAgIC8vIFRoZSBzdGFjayBwb2ludGVyIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgY2FsbGVyIHN0YWNrIGZyYW1lLiAKKyAgICAgIC8vIFNpbmNlIHRoZSByZWFsIHN0YWNrIHNpemUgaXMgdW5rbm93biBoZXJlLCBhIG5lZ2F0aXZlIFNQT2Zmc2V0IAorICAgICAgLy8gaXMgdXNlZCBzbyB0aGVyZSdzIGEgd2F5IHRvIGFkanVzdCB0aGVzZSBvZmZzZXRzIHdoZW4gdGhlIHN0YWNrCisgICAgICAvLyBzaXplIGdldCBrbm93biAob24gRWxpbWluYXRlRnJhbWVJbmRleCkuIEEgZHVtbXkgU1BPZmZzZXQgaXMgCisgICAgICAvLyB1c2VkIGluc3RlYWQgb2YgYSBkaXJlY3QgbmVnYXRpdmUgYWRkcmVzcyAod2hpY2ggaXMgcmVjb3JkZWQgdG8KKyAgICAgIC8vIGJlIHVzZWQgb24gZW1pdFByb2xvZ3VlKSB0byBhdm9pZCBtaXMtY2FsYyBvZiB0aGUgZmlyc3Qgc3RhY2sgCisgICAgICAvLyBvZmZzZXQgb24gUEVJOjpjYWxjdWxhdGVGcmFtZU9iamVjdE9mZnNldHMuCisgICAgICAvLyBBcmd1bWVudHMgYXJlIGFsd2F5cyAzMi1iaXQuCisgICAgICB1bnNpZ25lZCBBcmdTaXplID0gVkEuZ2V0TG9jVlQoKS5nZXRTaXplSW5CaXRzKCkvODsKKyAgICAgIGludCBGSSA9IE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoQXJnU2l6ZSwgMCwgdHJ1ZSk7CisgICAgICBNaXBzRkktPnJlY29yZExvYWRBcmdzRkkoRkksIC0oQXJnU2l6ZSsKKyAgICAgICAgKEZpcnN0U3RhY2tBcmdMb2MgKyBWQS5nZXRMb2NNZW1PZmZzZXQoKSkpKTsKKworICAgICAgLy8gQ3JlYXRlIGxvYWQgbm9kZXMgdG8gcmV0cmlldmUgYXJndW1lbnRzIGZyb20gdGhlIHN0YWNrCisgICAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZJLCBnZXRQb2ludGVyVHkoKSk7CisgICAgICBJblZhbHMucHVzaF9iYWNrKERBRy5nZXRMb2FkKFZBLmdldFZhbFZUKCksIGRsLCBDaGFpbiwgRklOLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApKTsKKyAgICB9CisgIH0KKworICAvLyBUaGUgbWlwcyBBQklzIGZvciByZXR1cm5pbmcgc3RydWN0cyBieSB2YWx1ZSByZXF1aXJlcyB0aGF0IHdlIGNvcHkKKyAgLy8gdGhlIHNyZXQgYXJndW1lbnQgaW50byAkdjAgZm9yIHRoZSByZXR1cm4uIFNhdmUgdGhlIGFyZ3VtZW50IGludG8KKyAgLy8gYSB2aXJ0dWFsIHJlZ2lzdGVyIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBmcm9tIHRoZSByZXR1cm4gcG9pbnRzLgorICBpZiAoREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZ1bmN0aW9uKCktPmhhc1N0cnVjdFJldEF0dHIoKSkgeworICAgIHVuc2lnbmVkIFJlZyA9IE1pcHNGSS0+Z2V0U1JldFJldHVyblJlZygpOworICAgIGlmICghUmVnKSB7CisgICAgICBSZWcgPSBNRi5nZXRSZWdJbmZvKCkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKGdldFJlZ0NsYXNzRm9yKE1WVDo6aTMyKSk7CisgICAgICBNaXBzRkktPnNldFNSZXRSZXR1cm5SZWcoUmVnKTsKKyAgICB9CisgICAgU0RWYWx1ZSBDb3B5ID0gREFHLmdldENvcHlUb1JlZyhEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBSZWcsIEluVmFsc1swXSk7CisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgQ29weSwgQ2hhaW4pOworICB9CisKKyAgLy8gVG8gbWVldCBBQkksIHdoZW4gVkFSQVJHUyBhcmUgcGFzc2VkIG9uIHJlZ2lzdGVycywgdGhlIHJlZ2lzdGVycworICAvLyBtdXN0IGhhdmUgdGhlaXIgdmFsdWVzIHdyaXR0ZW4gdG8gdGhlIGNhbGxlciBzdGFjayBmcmFtZS4gSWYgdGhlIGxhc3QKKyAgLy8gYXJndW1lbnQgd2FzIHBsYWNlZCBpbiB0aGUgc3RhY2ssIHRoZXJlJ3Mgbm8gbmVlZCB0byBzYXZlIGFueSByZWdpc3Rlci4gCisgIGlmICgoaXNWYXJBcmcpICYmIChTdWJ0YXJnZXQtPmlzQUJJX08zMigpICYmIEFyZ1JlZ0VuZCkpIHsKKyAgICBpZiAoU3RhY2tQdHIuZ2V0Tm9kZSgpID09IDApCisgICAgICBTdGFja1B0ciA9IERBRy5nZXRSZWdpc3RlcihTdGFja1JlZywgZ2V0UG9pbnRlclR5KCkpOworICAKKyAgICAvLyBUaGUgbGFzdCByZWdpc3RlciBhcmd1bWVudCB0aGF0IG11c3QgYmUgc2F2ZWQgaXMgTWlwczo6QTMKKyAgICBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IE1pcHM6OkNQVVJlZ3NSZWdpc3RlckNsYXNzOworICAgIHVuc2lnbmVkIFN0YWNrTG9jID0gQXJnTG9jcy5zaXplKCktMTsKKworICAgIGZvciAoKytBcmdSZWdFbmQ7IEFyZ1JlZ0VuZCA8PSBNaXBzOjpBMzsgKytBcmdSZWdFbmQsICsrU3RhY2tMb2MpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IEFkZExpdmVJbihEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCksIEFyZ1JlZ0VuZCwgUkMpOworICAgICAgU0RWYWx1ZSBBcmdWYWx1ZSA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFJlZywgTVZUOjppMzIpOworCisgICAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KDQsIDAsIHRydWUpOworICAgICAgTWlwc0ZJLT5yZWNvcmRTdG9yZVZhckFyZ3NGSShGSSwgLSg0KyhTdGFja0xvYyo0KSkpOworICAgICAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0RnJhbWVJbmRleChGSSwgZ2V0UG9pbnRlclR5KCkpOworICAgICAgT3V0Q2hhaW5zLnB1c2hfYmFjayhEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBBcmdWYWx1ZSwgUHRyT2ZmLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisKKyAgICAgIC8vIFJlY29yZCB0aGUgZnJhbWUgaW5kZXggb2YgdGhlIGZpcnN0IHZhcmlhYmxlIGFyZ3VtZW50CisgICAgICAvLyB3aGljaCBpcyBhIHZhbHVlIG5lY2Vzc2FyeSB0byBWQVNUQVJULgorICAgICAgaWYgKCFNaXBzRkktPmdldFZhckFyZ3NGcmFtZUluZGV4KCkpCisgICAgICAgIE1pcHNGSS0+c2V0VmFyQXJnc0ZyYW1lSW5kZXgoRkkpOworICAgIH0KKyAgfQorCisgIC8vIEFsbCBzdG9yZXMgYXJlIGdyb3VwZWQgaW4gb25lIG5vZGUgdG8gYWxsb3cgdGhlIG1hdGNoaW5nIGJldHdlZW4gCisgIC8vIHRoZSBzaXplIG9mIElucyBhbmQgSW5WYWxzLiBUaGlzIG9ubHkgaGFwcGVucyB3aGVuIG9uIHZhcmcgZnVuY3Rpb25zCisgIGlmICghT3V0Q2hhaW5zLmVtcHR5KCkpIHsKKyAgICBPdXRDaGFpbnMucHVzaF9iYWNrKENoYWluKTsKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJk91dENoYWluc1swXSwgT3V0Q2hhaW5zLnNpemUoKSk7CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgIFJldHVybiBWYWx1ZSBDYWxsaW5nIENvbnZlbnRpb24gSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NEVmFsdWUKK01pcHNUYXJnZXRMb3dlcmluZzo6TG93ZXJSZXR1cm4oU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworCisgIC8vIENDVmFsQXNzaWduIC0gcmVwcmVzZW50IHRoZSBhc3NpZ25tZW50IG9mCisgIC8vIHRoZSByZXR1cm4gdmFsdWUgdG8gYSBsb2NhdGlvbgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKworICAvLyBDQ1N0YXRlIC0gSW5mbyBhYm91dCB0aGUgcmVnaXN0ZXJzIGFuZCBzdGFjayBzbG90LgorICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgUlZMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisKKyAgLy8gQW5hbGl6ZSByZXR1cm4gdmFsdWVzLgorICBDQ0luZm8uQW5hbHl6ZVJldHVybihPdXRzLCBSZXRDQ19NaXBzKTsKKworICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXR1cm4gbG93ZXJlZCBmb3IgdGhpcyBmdW5jdGlvbiwgYWRkIAorICAvLyB0aGUgcmVncyB0byB0aGUgbGl2ZW91dCBzZXQgZm9yIHRoZSBmdW5jdGlvbi4KKyAgaWYgKERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkubGl2ZW91dF9lbXB0eSgpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpCisgICAgICBpZiAoUlZMb2NzW2ldLmlzUmVnTG9jKCkpCisgICAgICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkuYWRkTGl2ZU91dChSVkxvY3NbaV0uZ2V0TG9jUmVnKCkpOworICB9CisKKyAgU0RWYWx1ZSBGbGFnOworCisgIC8vIENvcHkgdGhlIHJlc3VsdCB2YWx1ZXMgaW50byB0aGUgb3V0cHV0IHJlZ2lzdGVycy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBSVkxvY3NbaV07CisgICAgYXNzZXJ0KFZBLmlzUmVnTG9jKCkgJiYgIkNhbiBvbmx5IHJldHVybiBpbiByZWdpc3RlcnMhIik7CisKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dFZhbHNbaV0sIEZsYWcpOworCisgICAgLy8gZ3VhcmFudGVlIHRoYXQgYWxsIGVtaXR0ZWQgY29waWVzIGFyZQorICAgIC8vIHN0dWNrIHRvZ2V0aGVyLCBhdm9pZGluZyBzb21ldGhpbmcgYmFkCisgICAgRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisKKyAgLy8gVGhlIG1pcHMgQUJJcyBmb3IgcmV0dXJuaW5nIHN0cnVjdHMgYnkgdmFsdWUgcmVxdWlyZXMgdGhhdCB3ZSBjb3B5CisgIC8vIHRoZSBzcmV0IGFyZ3VtZW50IGludG8gJHYwIGZvciB0aGUgcmV0dXJuLiBXZSBzYXZlZCB0aGUgYXJndW1lbnQgaW50bworICAvLyBhIHZpcnR1YWwgcmVnaXN0ZXIgaW4gdGhlIGVudHJ5IGJsb2NrLCBzbyBub3cgd2UgY29weSB0aGUgdmFsdWUgb3V0CisgIC8vIGFuZCBpbnRvICR2MC4KKyAgaWYgKERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRGdW5jdGlvbigpLT5oYXNTdHJ1Y3RSZXRBdHRyKCkpIHsKKyAgICBNYWNoaW5lRnVuY3Rpb24gJk1GICAgICAgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgICAgTWlwc0Z1bmN0aW9uSW5mbyAqTWlwc0ZJID0gTUYuZ2V0SW5mbzxNaXBzRnVuY3Rpb25JbmZvPigpOworICAgIHVuc2lnbmVkIFJlZyA9IE1pcHNGSS0+Z2V0U1JldFJldHVyblJlZygpOworCisgICAgaWYgKCFSZWcpIAorICAgICAgbGx2bV91bnJlYWNoYWJsZSgic3JldCB2aXJ0dWFsIHJlZ2lzdGVyIG5vdCBjcmVhdGVkIGluIHRoZSBlbnRyeSBibG9jayIpOworICAgIFNEVmFsdWUgVmFsID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgUmVnLCBnZXRQb2ludGVyVHkoKSk7CisKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBNaXBzOjpWMCwgVmFsLCBGbGFnKTsKKyAgICBGbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIH0KKworICAvLyBSZXR1cm4gb24gTWlwcyBpcyBhbHdheXMgYSAianIgJHJhIgorICBpZiAoRmxhZy5nZXROb2RlKCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKE1pcHNJU0Q6OlJldCwgZGwsIE1WVDo6T3RoZXIsIAorICAgICAgICAgICAgICAgICAgICAgICBDaGFpbiwgREFHLmdldFJlZ2lzdGVyKE1pcHM6OlJBLCBNVlQ6OmkzMiksIEZsYWcpOworICBlbHNlIC8vIFJldHVybiBWb2lkCisgICAgcmV0dXJuIERBRy5nZXROb2RlKE1pcHNJU0Q6OlJldCwgZGwsIE1WVDo6T3RoZXIsIAorICAgICAgICAgICAgICAgICAgICAgICBDaGFpbiwgREFHLmdldFJlZ2lzdGVyKE1pcHM6OlJBLCBNVlQ6OmkzMikpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBNaXBzIElubGluZSBBc3NlbWJseSBTdXBwb3J0CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gZ2V0Q29uc3RyYWludFR5cGUgLSBHaXZlbiBhIGNvbnN0cmFpbnQgbGV0dGVyLCByZXR1cm4gdGhlIHR5cGUgb2YKKy8vLyBjb25zdHJhaW50IGl0IGlzIGZvciB0aGlzIHRhcmdldC4KK01pcHNUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUgTWlwc1RhcmdldExvd2VyaW5nOjoKK2dldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdCAKK3sKKyAgLy8gTWlwcyBzcGVjaWZpYyBjb25zdHJhaW55IAorICAvLyBHQ0MgY29uZmlnL21pcHMvY29uc3RyYWludHMubWQKKyAgLy8KKyAgLy8gJ2QnIDogQW4gYWRkcmVzcyByZWdpc3Rlci4gRXF1aXZhbGVudCB0byByIAorICAvLyAgICAgICB1bmxlc3MgZ2VuZXJhdGluZyBNSVBTMTYgY29kZS4gCisgIC8vICd5JyA6IEVxdWl2YWxlbnQgdG8gcjsgcmV0YWluZWQgZm9yIAorICAvLyAgICAgICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gCisgIC8vICdmJyA6IEZsb2F0aW5nIFBvaW50IHJlZ2lzdGVycy4gICAgICAKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICAgIGRlZmF1bHQgOiBicmVhazsKKyAgICAgIGNhc2UgJ2QnOiAgICAgCisgICAgICBjYXNlICd5JzogCisgICAgICBjYXNlICdmJzoKKyAgICAgICAgcmV0dXJuIENfUmVnaXN0ZXJDbGFzczsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoQ29uc3RyYWludCk7Cit9CisKKy8vLyBnZXRSZWdDbGFzc0ZvcklubGluZUFzbUNvbnN0cmFpbnQgLSBHaXZlbiBhIGNvbnN0cmFpbnQgbGV0dGVyIChlLmcuICJyIiksCisvLy8gcmV0dXJuIGEgbGlzdCBvZiByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzYXRpc2Z5IHRoZSBjb25zdHJhaW50LgorLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgQ19SZWdpc3RlckNsYXNzIGNvbnN0cmFpbnRzLgorc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4gTWlwc1RhcmdldExvd2VyaW5nOjoKK2dldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsIEVWVCBWVCkgY29uc3QKK3sKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICBjYXNlICdyJzoKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgTWlwczo6Q1BVUmVnc1JlZ2lzdGVyQ2xhc3MpOworICAgIGNhc2UgJ2YnOgorICAgICAgaWYgKFZUID09IE1WVDo6ZjMyKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIE1pcHM6OkZHUjMyUmVnaXN0ZXJDbGFzcyk7CisgICAgICBpZiAoVlQgPT0gTVZUOjpmNjQpICAgIAorICAgICAgICBpZiAoKCFTdWJ0YXJnZXQtPmlzU2luZ2xlRmxvYXQoKSkgJiYgKCFTdWJ0YXJnZXQtPmlzRlA2NGJpdCgpKSkKKyAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIE1pcHM6OkFGR1I2NFJlZ2lzdGVyQ2xhc3MpOworICAgIH0KKyAgfQorICByZXR1cm4gVGFyZ2V0TG93ZXJpbmc6OmdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoQ29uc3RyYWludCwgVlQpOworfQorCisvLy8gR2l2ZW4gYSByZWdpc3RlciBjbGFzcyBjb25zdHJhaW50LCBsaWtlICdyJywgaWYgdGhpcyBjb3JyZXNwb25kcyBkaXJlY3RseQorLy8vIHRvIGFuIExMVk0gcmVnaXN0ZXIgY2xhc3MsIHJldHVybiBhIHJlZ2lzdGVyIG9mIDAgYW5kIHRoZSByZWdpc3RlciBjbGFzcworLy8vIHBvaW50ZXIuCitzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gTWlwc1RhcmdldExvd2VyaW5nOjoKK2dldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0Cit7CisgIGlmIChDb25zdHJhaW50LnNpemUoKSAhPSAxKQorICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKKworICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsgICAgICAgICAKKyAgICBkZWZhdWx0IDogYnJlYWs7CisgICAgY2FzZSAncic6CisgICAgLy8gR0NDIE1pcHMgQ29uc3RyYWludCBMZXR0ZXJzCisgICAgY2FzZSAnZCc6ICAgICAKKyAgICBjYXNlICd5JzogCisgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KE1pcHM6OlQwLCBNaXBzOjpUMSwgTWlwczo6VDIsIE1pcHM6OlQzLCAKKyAgICAgICAgICAgICBNaXBzOjpUNCwgTWlwczo6VDUsIE1pcHM6OlQ2LCBNaXBzOjpUNywgTWlwczo6UzAsIE1pcHM6OlMxLCAKKyAgICAgICAgICAgICBNaXBzOjpTMiwgTWlwczo6UzMsIE1pcHM6OlM0LCBNaXBzOjpTNSwgTWlwczo6UzYsIE1pcHM6OlM3LCAKKyAgICAgICAgICAgICBNaXBzOjpUOCwgMCk7CisKKyAgICBjYXNlICdmJzoKKyAgICAgIGlmIChWVCA9PSBNVlQ6OmYzMikgeworICAgICAgICBpZiAoU3VidGFyZ2V0LT5pc1NpbmdsZUZsb2F0KCkpCisgICAgICAgICAgcmV0dXJuIG1ha2VfdmVjdG9yPHVuc2lnbmVkPihNaXBzOjpGMiwgTWlwczo6RjMsIE1pcHM6OkY0LCBNaXBzOjpGNSwKKyAgICAgICAgICAgICAgICAgTWlwczo6RjYsIE1pcHM6OkY3LCBNaXBzOjpGOCwgTWlwczo6RjksIE1pcHM6OkYxMCwgTWlwczo6RjExLAorICAgICAgICAgICAgICAgICBNaXBzOjpGMjAsIE1pcHM6OkYyMSwgTWlwczo6RjIyLCBNaXBzOjpGMjMsIE1pcHM6OkYyNCwKKyAgICAgICAgICAgICAgICAgTWlwczo6RjI1LCBNaXBzOjpGMjYsIE1pcHM6OkYyNywgTWlwczo6RjI4LCBNaXBzOjpGMjksCisgICAgICAgICAgICAgICAgIE1pcHM6OkYzMCwgTWlwczo6RjMxLCAwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBtYWtlX3ZlY3Rvcjx1bnNpZ25lZD4oTWlwczo6RjIsIE1pcHM6OkY0LCBNaXBzOjpGNiwgTWlwczo6RjgsIAorICAgICAgICAgICAgICAgICBNaXBzOjpGMTAsIE1pcHM6OkYyMCwgTWlwczo6RjIyLCBNaXBzOjpGMjQsIE1pcHM6OkYyNiwgCisgICAgICAgICAgICAgICAgIE1pcHM6OkYyOCwgTWlwczo6RjMwLCAwKTsKKyAgICAgIH0KKworICAgICAgaWYgKFZUID09IE1WVDo6ZjY0KSAgICAKKyAgICAgICAgaWYgKCghU3VidGFyZ2V0LT5pc1NpbmdsZUZsb2F0KCkpICYmICghU3VidGFyZ2V0LT5pc0ZQNjRiaXQoKSkpCisgICAgICAgICAgcmV0dXJuIG1ha2VfdmVjdG9yPHVuc2lnbmVkPihNaXBzOjpEMSwgTWlwczo6RDIsIE1pcHM6OkQzLCBNaXBzOjpENCwgCisgICAgICAgICAgICAgICAgIE1pcHM6OkQ1LCBNaXBzOjpEMTAsIE1pcHM6OkQxMSwgTWlwczo6RDEyLCBNaXBzOjpEMTMsIAorICAgICAgICAgICAgICAgICBNaXBzOjpEMTQsIE1pcHM6OkQxNSwgMCk7CisgIH0KKyAgcmV0dXJuIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPigpOworfQorCitib29sCitNaXBzVGFyZ2V0TG93ZXJpbmc6OmlzT2Zmc2V0Rm9sZGluZ0xlZ2FsKGNvbnN0IEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBKSBjb25zdCB7CisgIC8vIFRoZSBNaXBzIHRhcmdldCBpc24ndCB5ZXQgYXdhcmUgb2Ygb2Zmc2V0cy4KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1pcHNUYXJnZXRMb3dlcmluZzo6aXNGUEltbUxlZ2FsKGNvbnN0IEFQRmxvYXQgJkltbSwgRVZUIFZUKSBjb25zdCB7CisgIGlmIChWVCAhPSBNVlQ6OmYzMiAmJiBWVCAhPSBNVlQ6OmY2NCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBJbW0uaXNaZXJvKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0lTZWxMb3dlcmluZy5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJU2VsTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA3NDdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJU2VsTG93ZXJpbmcuaApAQCAtMCwwICsxLDE1OSBAQAorLy89PT0tLSBNaXBzSVNlbExvd2VyaW5nLmggLSBNaXBzIERBRyBMb3dlcmluZyBJbnRlcmZhY2UgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IE1pcHMgdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50byBhCisvLyBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTWlwc0lTRUxMT1dFUklOR19ICisjZGVmaW5lIE1pcHNJU0VMTE9XRVJJTkdfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAiTWlwcy5oIgorI2luY2x1ZGUgIk1pcHNTdWJ0YXJnZXQuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBuYW1lc3BhY2UgTWlwc0lTRCB7CisgICAgZW51bSBOb2RlVHlwZSB7CisgICAgICAvLyBTdGFydCB0aGUgbnVtYmVyaW5nIGZyb20gd2hlcmUgSVNEIE5vZGVUeXBlIGZpbmlzaGVzLgorICAgICAgRklSU1RfTlVNQkVSID0gSVNEOjpCVUlMVElOX09QX0VORCwKKworICAgICAgLy8gSnVtcCBhbmQgbGluayAoY2FsbCkKKyAgICAgIEptcExpbmssCisKKyAgICAgIC8vIEdldCB0aGUgSGlnaGVyIDE2IGJpdHMgZnJvbSBhIDMyLWJpdCBpbW1lZGlhdGUKKyAgICAgIC8vIE5vIHJlbGF0aW9uIHdpdGggTWlwcyBIaSByZWdpc3RlcgorICAgICAgSGksIAorCisgICAgICAvLyBHZXQgdGhlIExvd2VyIDE2IGJpdHMgZnJvbSBhIDMyLWJpdCBpbW1lZGlhdGUKKyAgICAgIC8vIE5vIHJlbGF0aW9uIHdpdGggTWlwcyBMbyByZWdpc3RlcgorICAgICAgTG8sIAorCisgICAgICAvLyBIYW5kbGUgZ3BfcmVsIChzbWFsbCBkYXRhL2JzcyBzZWN0aW9ucykgcmVsb2NhdGlvbi4KKyAgICAgIEdQUmVsLAorCisgICAgICAvLyBDb25kaXRpb25hbCBNb3ZlCisgICAgICBDTW92LAorCisgICAgICAvLyBTZWxlY3QgQ0MgUHNldWRvIEluc3RydWN0aW9uCisgICAgICBTZWxlY3RDQywKKworICAgICAgLy8gRmxvYXRpbmcgUG9pbnQgU2VsZWN0IENDIFBzZXVkbyBJbnN0cnVjdGlvbgorICAgICAgRlBTZWxlY3RDQywKKworICAgICAgLy8gRmxvYXRpbmcgUG9pbnQgQnJhbmNoIENvbmRpdGlvbmFsCisgICAgICBGUEJyY29uZCwKKworICAgICAgLy8gRmxvYXRpbmcgUG9pbnQgQ29tcGFyZQorICAgICAgRlBDbXAsCisKKyAgICAgIC8vIEZsb2F0aW5nIFBvaW50IFJvdW5kaW5nCisgICAgICBGUFJvdW5kLAorCisgICAgICAvLyBSZXR1cm4gCisgICAgICBSZXQKKyAgICB9OworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFRhcmdldExvd2VyaW5nIEltcGxlbWVudGF0aW9uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAKKyAgY2xhc3MgTWlwc1RhcmdldExvd2VyaW5nIDogcHVibGljIFRhcmdldExvd2VyaW5nICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBNaXBzVGFyZ2V0TG93ZXJpbmcoTWlwc1RhcmdldE1hY2hpbmUgJlRNKTsKKworICAgIC8vLyBMb3dlck9wZXJhdGlvbiAtIFByb3ZpZGUgY3VzdG9tIGxvd2VyaW5nIGhvb2tzIGZvciBzb21lIG9wZXJhdGlvbnMuCisgICAgdmlydHVhbCBTRFZhbHVlIExvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIC8vLyBnZXRUYXJnZXROb2RlTmFtZSAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgYSB0YXJnZXQgc3BlY2lmaWMgCisgICAgLy8gIERBRyBub2RlLgorICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0VGFyZ2V0Tm9kZU5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdDsKKworICAgIC8vLyBnZXRTZXRDQ1Jlc3VsdFR5cGUgLSBnZXQgdGhlIElTRDo6U0VUQ0MgcmVzdWx0IFZhbHVlVHlwZQorICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIGdldFNldENDUmVzdWx0VHlwZShFVlQgVlQpIGNvbnN0OworCisgICAgLy8vIGdldEZ1bmN0aW9uQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBMb2cyIGFsaWdubWVudCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0OworICBwcml2YXRlOgorICAgIC8vIFN1YnRhcmdldCBJbmZvCisgICAgY29uc3QgTWlwc1N1YnRhcmdldCAqU3VidGFyZ2V0OworCisKKyAgICAvLyBMb3dlciBPcGVyYW5kIGhlbHBlcnMKKyAgICBTRFZhbHVlIExvd2VyQ2FsbFJlc3VsdChTRFZhbHVlIENoYWluLCBTRFZhbHVlIEluRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIC8vIExvd2VyIE9wZXJhbmQgc3BlY2lmaWNzCisgICAgU0RWYWx1ZSBMb3dlckFORE9SKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyQlJDT05EKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyQ29uc3RhbnRQb29sKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRFlOQU1JQ19TVEFDS0FMTE9DKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRlBfVE9fU0lOVChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckdsb2JhbEFkZHJlc3MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJHbG9iYWxUTFNBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VySnVtcFRhYmxlKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU0VMRUNUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU0VUQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJWQVNUQVJUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJGb3JtYWxBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlckNhbGwoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgIGJvb2wgJmlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJSZXR1cm4oU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgdmlydHVhbCBNYWNoaW5lQmFzaWNCbG9jayAqCisgICAgICBFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAgIC8vIElubGluZSBhc20gc3VwcG9ydAorICAgIENvbnN0cmFpbnRUeXBlIGdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdDsKKworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+IAorICAgICAgICAgICAgICBnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0OworCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+CisgICAgZ2V0UmVnQ2xhc3NGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIGlzT2Zmc2V0Rm9sZGluZ0xlZ2FsKGNvbnN0IEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBKSBjb25zdDsKKworICAgIC8vLyBpc0ZQSW1tTGVnYWwgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBjYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0IHRoZQorICAgIC8vLyBzcGVjaWZpZWQgRlAgaW1tZWRpYXRlIG5hdGl2ZWx5LiBJZiBmYWxzZSwgdGhlIGxlZ2FsaXplciB3aWxsCisgICAgLy8vIG1hdGVyaWFsaXplIHRoZSBGUCBpbW1lZGlhdGUgYXMgYSBsb2FkIGZyb20gYSBjb25zdGFudCBwb29sLgorICAgIHZpcnR1YWwgYm9vbCBpc0ZQSW1tTGVnYWwoY29uc3QgQVBGbG9hdCAmSW1tLCBFVlQgVlQpIGNvbnN0OworICB9OworfQorCisjZW5kaWYgLy8gTWlwc0lTRUxMT1dFUklOR19ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0luc3RyRlBVLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJbnN0ckZQVS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQ4OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJbnN0ckZQVS50ZApAQCAtMCwwICsxLDMxNiBAQAorLy89PT0tIE1pcHNJbnN0ckZQVS50ZCAtIE1pcHMgRlBVIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE1pcHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRmxvYXRpbmcgUG9pbnQgSW5zdHJ1Y3Rpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICogNjRiaXQgZnA6CisvLyAgICAtIDMyIDY0LWJpdCByZWdpc3RlcnMgKGRlZmF1bHQgbW9kZSkKKy8vICAgIC0gMTYgZXZlbiAzMi1iaXQgcmVnaXN0ZXJzICgzMi1iaXQgY29tcGF0aWJsZSBtb2RlKSBmb3IKKy8vICAgICAgc2luZ2xlIGFuZCBkb3VibGUgYWNjZXNzLgorLy8gKiAzMmJpdCBmcDoKKy8vICAgIC0gMTYgZXZlbiAzMi1iaXQgcmVnaXN0ZXJzIC0gc2luZ2xlIGFuZCBkb3VibGUgKGFsaWFzZWQpCisvLyAgICAtIDMyIDMyLWJpdCByZWdpc3RlcnMgKHdpdGhpbiBzaW5nbGUtb25seSBtb2RlKQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRmxvYXRpbmcgUG9pbnQgQ29tcGFyZSBhbmQgQnJhbmNoCitkZWYgU0RUX01pcHNGUEJyY29uZCA6IFNEVHlwZVByb2ZpbGU8MCwgMywgW1NEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzSW50PDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDEsIE90aGVyVlQ+XT47CitkZWYgU0RUX01pcHNGUENtcCA6IFNEVHlwZVByb2ZpbGU8MSwgMywgW1NEVENpc1ZUPDAsIGkzMj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1NhbWVBczwxLCAyPiwgU0RUQ2lzRlA8MT4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNJbnQ8Mz5dPjsKK2RlZiBTRFRfTWlwc0ZQU2VsZWN0Q0MgOiBTRFR5cGVQcm9maWxlPDEsIDQsIFtTRFRDaXNJbnQ8MT4sIFNEVENpc0ludDw0PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNTYW1lQXM8MCwgMj4sIFNEVENpc1NhbWVBczwyLCAzPl0+OworCitkZWYgTWlwc0ZQUm91bmQgOiBTRE5vZGU8Ik1pcHNJU0Q6OkZQUm91bmQiLCBTRFRGUFJvdW5kT3AsIFtTRE5QT3B0SW5GbGFnXT47CitkZWYgTWlwc0ZQQnJjb25kIDogU0ROb2RlPCJNaXBzSVNEOjpGUEJyY29uZCIsIFNEVF9NaXBzRlBCcmNvbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluXT47IAorZGVmIE1pcHNGUENtcCA6IFNETm9kZTwiTWlwc0lTRDo6RlBDbXAiLCBTRFRfTWlwc0ZQQ21wPjsKK2RlZiBNaXBzRlBTZWxlY3RDQyA6IFNETm9kZTwiTWlwc0lTRDo6RlBTZWxlY3RDQyIsIFNEVF9NaXBzRlBTZWxlY3RDQz47CisKKy8vIE9wZXJhbmQgZm9yIHByaW50aW5nIG91dCBhIGNvbmRpdGlvbiBjb2RlLgorbGV0IFByaW50TWV0aG9kID0gInByaW50RkNDT3BlcmFuZCIgaW4KKyAgZGVmIGNvbmRjb2RlIDogT3BlcmFuZDxpMzI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRmVhdHVyZSBwcmVkaWNhdGVzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIEluMzJCaXRNb2RlICAgICAgOiBQcmVkaWNhdGU8IiFTdWJ0YXJnZXQuaXNGUDY0Yml0KCkiPjsKK2RlZiBJc1NpbmdsZUZsb2F0ICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQuaXNTaW5nbGVGbG9hdCgpIj47CitkZWYgSXNOb3RTaW5nbGVGbG9hdCA6IFByZWRpY2F0ZTwiIVN1YnRhcmdldC5pc1NpbmdsZUZsb2F0KCkiPjsKK2RlZiBJc05vdE1pcHNJICAgICAgIDogUHJlZGljYXRlPCIhU3VidGFyZ2V0LmlzTWlwczEoKSI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gQ2xhc3MgVGVtcGxhdGVzCisvLworLy8gQSBzZXQgb2YgbXVsdGljbGFzc2VzIGlzIHVzZWQgdG8gYWRkcmVzcyB0aGUgcmVnaXN0ZXIgdXNhZ2UuIAorLy8KKy8vIFMzMiAtIHNpbmdsZSBwcmVjaXNpb24gaW4gMTYgMzJiaXQgZXZlbiBmcCByZWdpc3RlcnMKKy8vICAgICAgIHNpbmdsZSBwcmVjaXNpb24gaW4gMzIgMzJiaXQgZnAgcmVnaXN0ZXJzIGluIFNpbmdsZU9ubHkgbW9kZQorLy8gUzY0IC0gc2luZ2xlIHByZWNpc2lvbiBpbiAzMiA2NGJpdCBmcCByZWdpc3RlcnMgKEluNjRCaXRNb2RlKQorLy8gRDMyIC0gZG91YmxlIHByZWNpc2lvbiBpbiAxNiAzMmJpdCBldmVuIGZwIHJlZ2lzdGVycworLy8gRDY0IC0gZG91YmxlIHByZWNpc2lvbiBpbiAzMiA2NGJpdCBmcCByZWdpc3RlcnMgKEluNjRCaXRNb2RlKQorLy8KKy8vIE9ubHkgUzMyIGFuZCBEMzIgYXJlIHN1cHBvcnRlZCByaWdodCBub3cuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCittdWx0aWNsYXNzIEZGUjFfMTxiaXRzPDY+IGZ1bmN0LCBzdHJpbmcgYXNtc3RyPiAKK3sKKyAgZGVmIF9TMzIgOiBGRlI8MHgxMSwgZnVuY3QsIDB4MCwgKG91dHMgRkdSMzI6JGZkKSwgKGlucyBGR1IzMjokZnMpLAorICAgICAgIXN0cmNvbmNhdChhc21zdHIsICIucyAkZmQsICRmcyIpLCBbXT47CisKKyAgZGVmIF9EMzIgIDogRkZSPDB4MTEsIGZ1bmN0LCAweDEsIChvdXRzIEZHUjMyOiRmZCksIChpbnMgQUZHUjY0OiRmcyksCisgICAgICAhc3RyY29uY2F0KGFzbXN0ciwgIi5kICRmZCwgJGZzIiksIFtdPiwgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47Cit9CisKK211bHRpY2xhc3MgRkZSMV8yPGJpdHM8Nj4gZnVuY3QsIHN0cmluZyBhc21zdHIsIFNETm9kZSBGT3A+IAoreworICBkZWYgX1MzMiA6IEZGUjwweDExLCBmdW5jdCwgMHgwLCAob3V0cyBGR1IzMjokZmQpLCAoaW5zIEZHUjMyOiRmcyksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoYXNtc3RyLCAiLnMgJGZkLCAkZnMiKSwgCisgICAgICAgICAgICAgICAgIFsoc2V0IEZHUjMyOiRmZCwgKEZPcCBGR1IzMjokZnMpKV0+OworCisgIGRlZiBfRDMyICA6IEZGUjwweDExLCBmdW5jdCwgMHgxLCAob3V0cyBBRkdSNjQ6JGZkKSwgKGlucyBBRkdSNjQ6JGZzKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChhc21zdHIsICIuZCAkZmQsICRmcyIpLCAKKyAgICAgICAgICAgICAgICAgWyhzZXQgQUZHUjY0OiRmZCwgKEZPcCBBRkdSNjQ6JGZzKSldPiwgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47Cit9CisKK2NsYXNzIEZGUjFfMzxiaXRzPDY+IGZ1bmN0LCBiaXRzPDU+IGZtdCwgUmVnaXN0ZXJDbGFzcyBSY1NyYywgCisgICAgICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MgUmNEc3QsIHN0cmluZyBhc21zdHI+OiAKKyAgRkZSPDB4MTEsIGZ1bmN0LCBmbXQsIChvdXRzIFJjU3JjOiRmZCksIChpbnMgUmNEc3Q6JGZzKSwgCisgICAgICAhc3RyY29uY2F0KGFzbXN0ciwgIiAkZmQsICRmcyIpLCBbXT47IAorCisKK211bHRpY2xhc3MgRkZSMV80PGJpdHM8Nj4gZnVuY3QsIHN0cmluZyBhc21zdHIsIFNETm9kZSBGT3A+IHsKKyAgZGVmIF9TMzIgOiBGRlI8MHgxMSwgZnVuY3QsIDB4MCwgKG91dHMgRkdSMzI6JGZkKSwgCisgICAgICAgICAgICAgICAgIChpbnMgRkdSMzI6JGZzLCBGR1IzMjokZnQpLCAKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChhc21zdHIsICIucyAkZmQsICRmcywgJGZ0IiksCisgICAgICAgICAgICAgICAgIFsoc2V0IEZHUjMyOiRmZCwgKEZPcCBGR1IzMjokZnMsIEZHUjMyOiRmdCkpXT47CisKKyAgZGVmIF9EMzIgOiBGRlI8MHgxMSwgZnVuY3QsIDB4MSwgKG91dHMgQUZHUjY0OiRmZCksIAorICAgICAgICAgICAgICAgICAoaW5zIEFGR1I2NDokZnMsIEFGR1I2NDokZnQpLCAKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChhc21zdHIsICIuZCAkZmQsICRmcywgJGZ0IiksCisgICAgICAgICAgICAgICAgIFsoc2V0IEFGR1I2NDokZmQsIChGT3AgQUZHUjY0OiRmcywgQUZHUjY0OiRmdCkpXT4sCisgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRmxvYXRpbmcgUG9pbnQgSW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgZnQgPSAwIGluIHsKKyAgZGVmbSBGTE9PUl9XIDogRkZSMV8xPDBiMDAxMTExLCAiZmxvb3IudyI+OworICBkZWZtIENFSUxfVyAgOiBGRlIxXzE8MGIwMDExMTAsICJjZWlsLnciPjsKKyAgZGVmbSBST1VORF9XIDogRkZSMV8xPDBiMDAxMTAwLCAicm91bmQudyI+OworICBkZWZtIFRSVU5DX1cgOiBGRlIxXzE8MGIwMDExMDEsICJ0cnVuYy53Ij47CisgIGRlZm0gQ1ZUVyAgICA6IEZGUjFfMTwwYjEwMDEwMCwgImN2dC53Ij47CisKKyAgZGVmbSBGQUJTICAgIDogRkZSMV8yPDBiMDAwMTAxLCAiYWJzIiwgIGZhYnM+OyAKKyAgZGVmbSBGTkVHICAgIDogRkZSMV8yPDBiMDAwMTExLCAibmVnIiwgIGZuZWc+OyAKKyAgZGVmbSBGU1FSVCAgIDogRkZSMV8yPDBiMDAwMTAwLCAic3FydCIsIGZzcXJ0PjsKKworICAvLy8gQ29udmVydCB0byBTaW5nbGUgUHJlY2lzb24KKyAgZGVmIENWVFNfVzMyIDogRkZSMV8zPDBiMTAwMDAwLCAweDIsIEZHUjMyLCAgRkdSMzIsICAiY3Z0LnMudyI+OworCisgIGxldCBQcmVkaWNhdGVzID0gW0lzTm90U2luZ2xlRmxvYXRdIGluIHsKKyAgICAvLy8gQ2VpbCB0byBsb25nIHNpZ25lZCBpbnRlZ2VyCisgICAgZGVmIENFSUxfTFMgICA6IEZGUjFfMzwwYjAwMTAxMCwgMHgwLCBGR1IzMiwgRkdSMzIsICJjZWlsLmwiPjsKKyAgICBkZWYgQ0VJTF9MRCAgIDogRkZSMV8zPDBiMDAxMDEwLCAweDEsIEFGR1I2NCwgQUZHUjY0LCAiY2VpbC5sIj47CisKKyAgICAvLy8gUm91bmQgdG8gbG9uZyBzaWduZWQgaW50ZWdlcgorICAgIGRlZiBST1VORF9MUyAgOiBGRlIxXzM8MGIwMDEwMDAsIDB4MCwgRkdSMzIsIEZHUjMyLCAicm91bmQubCI+OworICAgIGRlZiBST1VORF9MRCAgOiBGRlIxXzM8MGIwMDEwMDAsIDB4MSwgQUZHUjY0LCBBRkdSNjQsICJyb3VuZC5sIj47CisKKyAgICAvLy8gRmxvb3IgdG8gbG9uZyBzaWduZWQgaW50ZWdlcgorICAgIGRlZiBGTE9PUl9MUyAgOiBGRlIxXzM8MGIwMDEwMTEsIDB4MCwgRkdSMzIsIEZHUjMyLCAiZmxvb3IubCI+OworICAgIGRlZiBGTE9PUl9MRCAgOiBGRlIxXzM8MGIwMDEwMTEsIDB4MSwgQUZHUjY0LCBBRkdSNjQsICJmbG9vci5sIj47CisKKyAgICAvLy8gVHJ1bmMgdG8gbG9uZyBzaWduZWQgaW50ZWdlcgorICAgIGRlZiBUUlVOQ19MUyAgOiBGRlIxXzM8MGIwMDEwMDEsIDB4MCwgRkdSMzIsIEZHUjMyLCAidHJ1bmMubCI+OworICAgIGRlZiBUUlVOQ19MRCAgOiBGRlIxXzM8MGIwMDEwMDEsIDB4MSwgQUZHUjY0LCBBRkdSNjQsICJ0cnVuYy5sIj47CisKKyAgICAvLy8gQ29udmVydCB0byBsb25nIHNpZ25lZCBpbnRlZ2VyCisgICAgZGVmIENWVExfUyAgICA6IEZGUjFfMzwwYjEwMDEwMSwgMHgwLCBGR1IzMiwgRkdSMzIsICJjdnQubCI+OyAKKyAgICBkZWYgQ1ZUTF9EICAgIDogRkZSMV8zPDBiMTAwMTAxLCAweDEsIEFGR1I2NCwgQUZHUjY0LCAiY3Z0LmwiPjsgCisKKyAgICAvLy8gQ29udmVydCB0byBEb3VibGUgUHJlY2lzb24gCisgICAgZGVmIENWVERfUzMyIDogRkZSMV8zPDBiMTAwMDAxLCAweDAsIEFGR1I2NCwgRkdSMzIsICJjdnQuZC5zIj47IAorICAgIGRlZiBDVlREX1czMiA6IEZGUjFfMzwwYjEwMDAwMSwgMHgyLCBBRkdSNjQsIEZHUjMyLCAiY3Z0LmQudyI+OyAKKyAgICBkZWYgQ1ZURF9MMzIgOiBGRlIxXzM8MGIxMDAwMDEsIDB4MywgQUZHUjY0LCBBRkdSNjQsICJjdnQuZC5sIj47IAorICAgICAgICAgICAgICAgICAgIAorICAgIC8vLyBDb252ZXJ0IHRvIFNpbmdsZSBQcmVjaXNvbgorICAgIGRlZiBDVlRTX0QzMiA6IEZGUjFfMzwwYjEwMDAwMCwgMHgxLCBGR1IzMiwgQUZHUjY0LCAiY3Z0LnMuZCI+OworICAgIGRlZiBDVlRTX0wzMiA6IEZGUjFfMzwwYjEwMDAwMCwgMHgzLCBGR1IzMiwgQUZHUjY0LCAiY3Z0LnMubCI+OyAKKyAgfQorfQorCisvLyBUaGUgb2RkLW51bWJlcmVkIHJlZ2lzdGVycyBhcmUgb25seSByZWZlcmVuY2VkIHdoZW4gZG9pbmcgbG9hZHMsCisvLyBzdG9yZXMsIGFuZCBtb3ZlcyBiZXR3ZWVuIGZsb2F0aW5nLXBvaW50IGFuZCBpbnRlZ2VyIHJlZ2lzdGVycy4KKy8vIFdoZW4gZGVmaW5pbmcgaW5zdHJ1Y3Rpb25zLCB3ZSByZWZlcmVuY2UgYWxsIDMyLWJpdCByZWdpc3RlcnMsIAorLy8gcmVnYXJkbGVzcyBvZiByZWdpc3RlciBhbGlhc2luZy4KK2xldCBmZCA9IDAgaW4geworICAvLy8gTW92ZSBDb250cm9sIFJlZ2lzdGVycyBGcm9tL1RvIENQVSBSZWdpc3RlcnMKKyAgZGVmIENGQzEgIDogRkZSPDB4MTEsIDB4MCwgMHgyLCAob3V0cyBDUFVSZWdzOiRydCksIChpbnMgQ0NSOiRmcyksCisgICAgICAgICAgICAgICAgICAiY2ZjMSAkcnQsICRmcyIsIFtdPjsKKworICBkZWYgQ1RDMSAgOiBGRlI8MHgxMSwgMHgwLCAweDYsIChvdXRzIENDUjokcnQpLCAoaW5zIENQVVJlZ3M6JGZzKSwKKyAgICAgICAgICAgICAgICAgICJjdGMxICRmcywgJHJ0IiwgW10+OworICAgICAgICAgICAgICAgICAgCisgIGRlZiBNRkMxICA6IEZGUjwweDExLCAweDAwLCAweDAwLCAob3V0cyBDUFVSZWdzOiRydCksIChpbnMgRkdSMzI6JGZzKSwKKyAgICAgICAgICAgICAgICAgICJtZmMxICRydCwgJGZzIiwgW10+OworCisgIGRlZiBNVEMxICA6IEZGUjwweDExLCAweDAwLCAweDA0LCAob3V0cyBGR1IzMjokZnMpLCAoaW5zIENQVVJlZ3M6JHJ0KSwKKyAgICAgICAgICAgICAgICAgICJtdGMxICRydCwgJGZzIiwgW10+OworfQorCitkZWYgRk1PVl9TMzIgOiBGRlI8MHgxMSwgMGIwMDAxMTAsIDB4MCwgKG91dHMgRkdSMzI6JGZkKSwgKGlucyBGR1IzMjokZnMpLAorICAgICAgICAgICAgICAgICAgICJtb3YucyAkZmQsICRmcyIsIFtdPjsKK2RlZiBGTU9WX0QzMiA6IEZGUjwweDExLCAwYjAwMDExMCwgMHgxLCAob3V0cyBBRkdSNjQ6JGZkKSwgKGlucyBBRkdSNjQ6JGZzKSwKKyAgICAgICAgICAgICAgICAgICAibW92LmQgJGZkLCAkZnMiLCBbXT47CisKKy8vLyBGbG9hdGluZyBQb2ludCBNZW1vcnkgSW5zdHJ1Y3Rpb25zCitsZXQgUHJlZGljYXRlcyA9IFtJc05vdFNpbmdsZUZsb2F0LCBJc05vdE1pcHNJXSBpbiB7CisgIGRlZiBMREMxIDogRkZJPDBiMTEwMTAxLCAob3V0cyBBRkdSNjQ6JGZ0KSwgKGlucyBtZW06JGFkZHIpLCAKKyAgICAgICAgICAgICAgICAgImxkYzEgJGZ0LCAkYWRkciIsIFsoc2V0IEFGR1I2NDokZnQsIChsb2FkIGFkZHI6JGFkZHIpKV0+OworCisgIGRlZiBTREMxIDogRkZJPDBiMTExMTAxLCAob3V0cyksIChpbnMgQUZHUjY0OiRmdCwgbWVtOiRhZGRyKSwgCisgICAgICAgICAgICAgICAgICJzZGMxICRmdCwgJGFkZHIiLCBbKHN0b3JlIEFGR1I2NDokZnQsIGFkZHI6JGFkZHIpXT47Cit9CisKKy8vIExXQzEgYW5kIFNXQzEgY2FuIGFsd2F5cyBiZSBlbWl0ZWQgd2l0aCBvZGQgcmVnaXN0ZXJzLgorZGVmIExXQzEgIDogRkZJPDBiMTEwMDAxLCAob3V0cyBGR1IzMjokZnQpLCAoaW5zIG1lbTokYWRkciksICJsd2MxICRmdCwgJGFkZHIiLAorICAgICAgICAgICAgICAgWyhzZXQgRkdSMzI6JGZ0LCAobG9hZCBhZGRyOiRhZGRyKSldPjsgCitkZWYgU1dDMSAgOiBGRkk8MGIxMTEwMDEsIChvdXRzKSwgKGlucyBGR1IzMjokZnQsIG1lbTokYWRkciksICJzd2MxICRmdCwgJGFkZHIiLAorICAgICAgICAgICAgICAgWyhzdG9yZSBGR1IzMjokZnQsIGFkZHI6JGFkZHIpXT47IAorCisvLy8gRmxvYXRpbmctcG9pbnQgQXJpdG1ldGljCitkZWZtIEZBREQgOiBGRlIxXzQ8MHgxMCwgImFkZCIsIGZhZGQ+OworZGVmbSBGRElWIDogRkZSMV80PDB4MDMsICJkaXYiLCBmZGl2PjsKK2RlZm0gRk1VTCA6IEZGUjFfNDwweDAyLCAibXVsIiwgZm11bD47CitkZWZtIEZTVUIgOiBGRlIxXzQ8MHgwMSwgInN1YiIsIGZzdWI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRmxvYXRpbmcgUG9pbnQgQnJhbmNoIENvZGVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWlwcyBicmFuY2ggY29kZXMuIFRoZXNlIGNvcnJlc3BvbmQgdG8gY29uZGNvZGUgaW4gTWlwc0luc3RySW5mby5oLiAKKy8vIFRoZXkgbXVzdCBiZSBrZXB0IGluIHN5bmNoLgorZGVmIE1JUFNfQlJBTkNIX0YgIDogUGF0TGVhZjwoaTMyIDApPjsKK2RlZiBNSVBTX0JSQU5DSF9UICA6IFBhdExlYWY8KGkzMiAxKT47CitkZWYgTUlQU19CUkFOQ0hfRkwgOiBQYXRMZWFmPChpMzIgMik+OworZGVmIE1JUFNfQlJBTkNIX1RMIDogUGF0TGVhZjwoaTMyIDMpPjsKKworLy8vIEZsb2F0aW5nIFBvaW50IEJyYW5jaCBvZiBGYWxzZS9UcnVlIChMaWtlbHkpCitsZXQgaXNCcmFuY2g9MSwgaXNUZXJtaW5hdG9yPTEsIGhhc0RlbGF5U2xvdD0xLCBiYXNlPTB4OCwgVXNlcz1bRkNSMzFdIGluIHsKKyAgY2xhc3MgRkJSQU5DSDxQYXRMZWFmIG9wLCBzdHJpbmcgYXNtc3RyPiA6IEZGSTwweDExLCAob3V0cyksIAorICAgICAgICAoaW5zIGJydGFyZ2V0OiRkc3QpLCAhc3RyY29uY2F0KGFzbXN0ciwgIiAkZHN0IiksCisgICAgICAgIFsoTWlwc0ZQQnJjb25kIG9wLCBiYjokZHN0LCBGQ1IzMSldPjsKK30KK2RlZiBCQzFGICA6IEZCUkFOQ0g8TUlQU19CUkFOQ0hfRiwgICJiYzFmIj47CitkZWYgQkMxVCAgOiBGQlJBTkNIPE1JUFNfQlJBTkNIX1QsICAiYmMxdCI+OworZGVmIEJDMUZMIDogRkJSQU5DSDxNSVBTX0JSQU5DSF9GTCwgImJjMWZsIj47CitkZWYgQkMxVEwgOiBGQlJBTkNIPE1JUFNfQlJBTkNIX1RMLCAiYmMxdGwiPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZsb2F0aW5nIFBvaW50IEZsYWcgQ29uZGl0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1pcHMgY29uZGl0aW9uIGNvZGVzLiBUaGV5IG11c3QgY29ycmVzcG9uZCB0byBjb25kY29kZSBpbiBNaXBzSW5zdHJJbmZvLmguIAorLy8gVGhleSBtdXN0IGJlIGtlcHQgaW4gc3luY2guCitkZWYgTUlQU19GQ09ORF9GICAgIDogUGF0TGVhZjwoaTMyIDApPjsKK2RlZiBNSVBTX0ZDT05EX1VOICAgOiBQYXRMZWFmPChpMzIgMSk+OworZGVmIE1JUFNfRkNPTkRfRVEgICA6IFBhdExlYWY8KGkzMiAyKT47CitkZWYgTUlQU19GQ09ORF9VRVEgIDogUGF0TGVhZjwoaTMyIDMpPjsKK2RlZiBNSVBTX0ZDT05EX09MVCAgOiBQYXRMZWFmPChpMzIgNCk+OworZGVmIE1JUFNfRkNPTkRfVUxUICA6IFBhdExlYWY8KGkzMiA1KT47CitkZWYgTUlQU19GQ09ORF9PTEUgIDogUGF0TGVhZjwoaTMyIDYpPjsKK2RlZiBNSVBTX0ZDT05EX1VMRSAgOiBQYXRMZWFmPChpMzIgNyk+OworZGVmIE1JUFNfRkNPTkRfU0YgICA6IFBhdExlYWY8KGkzMiA4KT47CitkZWYgTUlQU19GQ09ORF9OR0xFIDogUGF0TGVhZjwoaTMyIDkpPjsKK2RlZiBNSVBTX0ZDT05EX1NFUSAgOiBQYXRMZWFmPChpMzIgMTApPjsKK2RlZiBNSVBTX0ZDT05EX05HTCAgOiBQYXRMZWFmPChpMzIgMTEpPjsKK2RlZiBNSVBTX0ZDT05EX0xUICAgOiBQYXRMZWFmPChpMzIgMTIpPjsKK2RlZiBNSVBTX0ZDT05EX05HRSAgOiBQYXRMZWFmPChpMzIgMTMpPjsKK2RlZiBNSVBTX0ZDT05EX0xFICAgOiBQYXRMZWFmPChpMzIgMTQpPjsKK2RlZiBNSVBTX0ZDT05EX05HVCAgOiBQYXRMZWFmPChpMzIgMTUpPjsKKworLy8vIEZsb2F0aW5nIFBvaW50IENvbXBhcmUKK2xldCBoYXNEZWxheVNsb3QgPSAxLCBEZWZzPVtGQ1IzMV0gaW4geworICBkZWYgRkNNUF9TMzIgOiBGQ0M8MHgwLCAob3V0cyksIChpbnMgRkdSMzI6JGZzLCBGR1IzMjokZnQsIGNvbmRjb2RlOiRjYyksCisgICAgICAiYy4kY2MucyAkZnMsICRmdCIsCisgICAgICAgIFsoc2V0IEZDUjMxLCAoTWlwc0ZQQ21wIEZHUjMyOiRmcywgRkdSMzI6JGZ0LCBpbW06JGNjKSldPjsgCisgIAorICBkZWYgRkNNUF9EMzIgOiBGQ0M8MHgxLCAob3V0cyksIChpbnMgQUZHUjY0OiRmcywgQUZHUjY0OiRmdCwgY29uZGNvZGU6JGNjKSwKKyAgICAgICJjLiRjYy5kICRmcywgJGZ0IiwKKyAgICAgICBbKHNldCBGQ1IzMSwgKE1pcHNGUENtcCBBRkdSNjQ6JGZzLCBBRkdSNjQ6JGZ0LCBpbW06JGNjKSldPiwKKyAgICAgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRmxvYXRpbmcgUG9pbnQgUHNldWRvLUluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRm9yIHNvbWUgZXhwbGFuYXRpb24sIHNlZSBTZWxlY3RfQ0MgYXQgTWlwc0luc3RySW5mby50ZC4gV2UgYWxzbyBlbWJlZGQgYSAKKy8vIGNvbmRpY2l0b24gY29kZSB0byBlbmFibGUgZWFzeSBoYW5kbGluZyBieSB0aGUgQ3VzdG9tIEluc2VydGVyLgorbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDEsIFVzZXM9W0ZDUjMxXSBpbiB7CisgIGNsYXNzIFBzZXVkb0ZQU2VsQ0M8UmVnaXN0ZXJDbGFzcyBSQywgc3RyaW5nIGFzbXN0cj4gOiAKKyAgICBNaXBzUHNldWRvPChvdXRzIFJDOiRkc3QpLCAKKyAgICAgICAgICAgICAgIChpbnMgQ1BVUmVnczokQ21wUmVzLCBSQzokVCwgUkM6JEYsIGNvbmRjb2RlOiRjYyksIGFzbXN0ciwgCisgICAgICAgICAgICAgICBbKHNldCBSQzokZHN0LCAoTWlwc0ZQU2VsZWN0Q0MgQ1BVUmVnczokQ21wUmVzLCBSQzokVCwgUkM6JEYsCisgICAgICAgICAgICAgICAgIGltbTokY2MpKV0+OworfQorCisvLyBUaGUgdmFsdWVzIHRvIGJlIHNlbGVjdGVkIGFyZSBmcCBidXQgdGhlIGNvbmRpdGlvbiB0ZXN0IGlzIHdpdGggaW50ZWdlcnMuCitkZWYgU2VsZWN0X0NDX1MzMiA6IFBzZXVkb1NlbENDPEZHUjMyLCAiIyBNaXBzU2VsZWN0X0NDX1MzMl9mMzIiPjsKK2RlZiBTZWxlY3RfQ0NfRDMyIDogUHNldWRvU2VsQ0M8QUZHUjY0LCAiIyBNaXBzU2VsZWN0X0NDX0QzMl9mMzIiPiwKKyAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47CisKKy8vIFRoZSB2YWx1ZXMgdG8gYmUgc2VsZWN0ZWQgYXJlIGludCBidXQgdGhlIGNvbmRpdGlvbiB0ZXN0IGlzIGRvbmUgd2l0aCBmcC4KK2RlZiBTZWxlY3RfRkNDICAgICA6IFBzZXVkb0ZQU2VsQ0M8Q1BVUmVncywgIiMgTWlwc1NlbGVjdF9GQ0MiPjsKKworLy8gVGhlIHZhbHVlcyB0byBiZSBzZWxlY3RlZCBhbmQgdGhlIGNvbmRpdGlvbiB0ZXN0IGlzIGRvbmUgd2l0aCBmcC4KK2RlZiBTZWxlY3RfRkNDX1MzMiA6IFBzZXVkb0ZQU2VsQ0M8RkdSMzIsICIjIE1pcHNTZWxlY3RfRkNDX1MzMl9mMzIiPjsKK2RlZiBTZWxlY3RfRkNDX0QzMiA6IFBzZXVkb0ZQU2VsQ0M8QUZHUjY0LCAiIyBNaXBzU2VsZWN0X0ZDQ19EMzJfZjMyIj4sIAorICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47CisKK2RlZiBNT1ZDQ1JUb0NDUiA6IE1pcHNQc2V1ZG88KG91dHMgQ0NSOiRkc3QpLCAoaW5zIENDUjokc3JjKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIE1PVkNDUlRvQ0NSIiwgW10+OyAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZsb2F0aW5nIFBvaW50IFBhdHRlcm5zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIGZwaW1tMCA6IFBhdExlYWY8KGZwaW1tKSwgW3sKKyAgcmV0dXJuIE4tPmlzRXhhY3RseVZhbHVlKCswLjApOworfV0+OworCitkZWYgZnBpbW0wbmVnIDogUGF0TGVhZjwoZnBpbW0pLCBbeworICByZXR1cm4gTi0+aXNFeGFjdGx5VmFsdWUoLTAuMCk7Cit9XT47CisKK2RlZiA6IFBhdDwoZjMyIGZwaW1tMCksIChNVEMxIFpFUk8pPjsKK2RlZiA6IFBhdDwoZjMyIGZwaW1tMG5lZyksIChGTkVHX1MzMiAoTVRDMSBaRVJPKSk+OworCitkZWYgOiBQYXQ8KGYzMiAoc2ludF90b19mcCBDUFVSZWdzOiRzcmMpKSwgKENWVFNfVzMyIChNVEMxIENQVVJlZ3M6JHNyYykpPjsKK2RlZiA6IFBhdDwoZjY0IChzaW50X3RvX2ZwIENQVVJlZ3M6JHNyYykpLCAoQ1ZURF9XMzIgKE1UQzEgQ1BVUmVnczokc3JjKSk+OworCitkZWYgOiBQYXQ8KGkzMiAoZnBfdG9fc2ludCBGR1IzMjokc3JjKSksIChNRkMxIChUUlVOQ19XX1MzMiBGR1IzMjokc3JjKSk+OworCitkZWYgOiBQYXQ8KGkzMiAoYml0Y29udmVydCBGR1IzMjokc3JjKSksICAoTUZDMSBGR1IzMjokc3JjKT47CitkZWYgOiBQYXQ8KGYzMiAoYml0Y29udmVydCBDUFVSZWdzOiRzcmMpKSwgKE1UQzEgQ1BVUmVnczokc3JjKT47CisKK2xldCBQcmVkaWNhdGVzID0gW0luMzJCaXRNb2RlXSBpbiB7IAorICBkZWYgOiBQYXQ8KGYzMiAoZnJvdW5kIEFGR1I2NDokc3JjKSksIChDVlRTX0QzMiBBRkdSNjQ6JHNyYyk+OworICBkZWYgOiBQYXQ8KGY2NCAoZmV4dGVuZCBGR1IzMjokc3JjKSksIChDVlREX1MzMiBGR1IzMjokc3JjKT47Cit9CisKKy8vIE1pcHNGUFJvdW5kIGlzIG9ubHkgZW1pdHRlZCBmb3IgTWlwc0kgdGFyZ2V0cy4KK2RlZiA6IFBhdDwoZjMyIChNaXBzRlBSb3VuZCBBRkdSNjQ6JHNyYykpLCAoQ1ZUV19EMzIgQUZHUjY0OiRzcmMpPjsKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJbnN0ckZvcm1hdHMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0luc3RyRm9ybWF0cy50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlkZTBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJbnN0ckZvcm1hdHMudGQKQEAgLTAsMCArMSwxODIgQEAKKy8vPT09LSBNaXBzUmVnaXN0ZXJJbmZvLnRkIC0gTWlwcyBSZWdpc3RlciBkZWZzIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8NCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIERlc2NyaWJlIE1JUFMgaW5zdHJ1Y3Rpb25zIGZvcm1hdA0KKy8vDQorLy8gIENQVSBJTlNUUlVDVElPTiBGT1JNQVRTDQorLy8NCisvLyAgb3Bjb2RlICAtIG9wZXJhdGlvbiBjb2RlLg0KKy8vICBycyAgICAgIC0gc3JjIHJlZy4NCisvLyAgcnQgICAgICAtIGRzdCByZWcgKG9uIGEgMiByZWdzIGluc3RyKSBvciBzcmMgcmVnIChvbiBhIDMgcmVnIGluc3RyKS4NCisvLyAgcmQgICAgICAtIGRzdCByZWcsIG9ubHkgdXNlZCBvbiAzIHJlZ3MgaW5zdHIuDQorLy8gIHNoYW10ICAgLSBvbmx5IHVzZWQgb24gc2hpZnQgaW5zdHJ1Y3Rpb25zLCBjb250YWlucyB0aGUgc2hpZnQgYW1vdW50Lg0KKy8vICBmdW5jdCAgIC0gY29tYmluZWQgd2l0aCBvcGNvZGUgZmllbGQgZ2l2ZSB1cyBhbiBvcGVyYXRpb24gY29kZS4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gR2VuZXJpYyBNaXBzIEZvcm1hdA0KK2NsYXNzIE1pcHNJbnN0PGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwgDQorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj46IEluc3RydWN0aW9uIA0KK3sNCisgIGZpZWxkIGJpdHM8MzI+IEluc3Q7DQorDQorICBsZXQgTmFtZXNwYWNlID0gIk1pcHMiOw0KKw0KKyAgYml0czw2PiBvcGNvZGU7DQorDQorICAvLyBUb3AgNSBiaXRzIGFyZSB0aGUgJ29wY29kZScgZmllbGQNCisgIGxldCBJbnN0ezMxLTI2fSA9IG9wY29kZTsgICANCisgIA0KKyAgZGFnIE91dE9wZXJhbmRMaXN0ID0gb3V0czsNCisgIGRhZyBJbk9wZXJhbmRMaXN0ICA9IGluczsNCisNCisgIGxldCBBc21TdHJpbmcgICA9IGFzbXN0cjsNCisgIGxldCBQYXR0ZXJuICAgICA9IHBhdHRlcm47DQorICBsZXQgSXRpbmVyYXJ5ICAgPSBpdGluOw0KK30NCisNCisvLyBNaXBzIFBzZXVkbyBJbnN0cnVjdGlvbnMgRm9ybWF0DQorY2xhc3MgTWlwc1BzZXVkbzxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+Og0KKyAgICAgIE1pcHNJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuLCBJSVBzZXVkbz47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBGb3JtYXQgUiBpbnN0cnVjdGlvbiBjbGFzcyBpbiBNaXBzIDogPHxvcGNvZGV8cnN8cnR8cmR8c2hhbXR8ZnVuY3R8Pg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorY2xhc3MgRlI8Yml0czw2PiBvcCwgYml0czw2PiBfZnVuY3QsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuLCBJbnN0ckl0aW5DbGFzcyBpdGluPjoNCisgICAgICBNaXBzSW5zdDxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybiwgaXRpbj4gDQorew0KKyAgYml0czw1PiAgcmQ7DQorICBiaXRzPDU+ICByczsNCisgIGJpdHM8NT4gIHJ0Ow0KKyAgYml0czw1PiAgc2hhbXQ7DQorICBiaXRzPDY+ICBmdW5jdDsNCisNCisgIGxldCBvcGNvZGUgPSBvcDsNCisgIGxldCBmdW5jdCAgPSBfZnVuY3Q7DQorDQorICBsZXQgSW5zdHsyNS0yMX0gPSByczsNCisgIGxldCBJbnN0ezIwLTE2fSA9IHJ0OyANCisgIGxldCBJbnN0ezE1LTExfSA9IHJkOw0KKyAgbGV0IEluc3R7MTAtNn0gID0gc2hhbXQ7DQorICBsZXQgSW5zdHs1LTB9ICAgPSBmdW5jdDsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBGb3JtYXQgSSBpbnN0cnVjdGlvbiBjbGFzcyBpbiBNaXBzIDogPHxvcGNvZGV8cnN8cnR8aW1tZWRpYXRlfD4NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2NsYXNzIEZJPGJpdHM8Nj4gb3AsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybiwNCisgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluPjogTWlwc0luc3Q8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4sIGl0aW4+IA0KK3sNCisgIGJpdHM8NT4gIHJ0Ow0KKyAgYml0czw1PiAgcnM7DQorICBiaXRzPDE2PiBpbW0xNjsNCisNCisgIGxldCBvcGNvZGUgPSBvcDsNCisNCisgIGxldCBJbnN0ezI1LTIxfSA9IHJzOw0KKyAgbGV0IEluc3R7MjAtMTZ9ID0gcnQ7IA0KKyAgbGV0IEluc3R7MTUtMH0gID0gaW1tMTY7DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRm9ybWF0IEogaW5zdHJ1Y3Rpb24gY2xhc3MgaW4gTWlwcyA6IDx8b3Bjb2RlfGFkZHJlc3N8Pg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorY2xhc3MgRko8Yml0czw2PiBvcCwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuLA0KKyAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+OiBNaXBzSW5zdDxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybiwgaXRpbj4gDQorew0KKyAgYml0czwyNj4gYWRkcjsNCisNCisgIGxldCBvcGNvZGUgPSBvcDsNCisgIA0KKyAgbGV0IEluc3R7MjUtMH0gPSBhZGRyOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gIEZMT0FUSU5HIFBPSU5UIElOU1RSVUNUSU9OIEZPUk1BVFMNCisvLw0KKy8vICBvcGNvZGUgIC0gb3BlcmF0aW9uIGNvZGUuDQorLy8gIGZzICAgICAgLSBzcmMgcmVnLg0KKy8vICBmdCAgICAgIC0gZHN0IHJlZyAob24gYSAyIHJlZ3MgaW5zdHIpIG9yIHNyYyByZWcgKG9uIGEgMyByZWcgaW5zdHIpLg0KKy8vICBmZCAgICAgIC0gZHN0IHJlZywgb25seSB1c2VkIG9uIDMgcmVncyBpbnN0ci4NCisvLyAgZm10ICAgICAtIGRvdWJsZSBvciBzaW5nbGUgcHJlY2lzaW9uLg0KKy8vICBmdW5jdCAgIC0gY29tYmluZWQgd2l0aCBvcGNvZGUgZmllbGQgZ2l2ZSB1cyBhbiBvcGVyYXRpb24gY29kZS4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBGb3JtYXQgRlIgaW5zdHJ1Y3Rpb24gY2xhc3MgaW4gTWlwcyA6IDx8b3Bjb2RlfGZtdHxmdHxmc3xmZHxmdW5jdHw+DQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitjbGFzcyBGRlI8Yml0czw2PiBvcCwgYml0czw2PiBfZnVuY3QsIGJpdHM8NT4gX2ZtdCwgZGFnIG91dHMsIGRhZyBpbnMsIA0KKyAgICAgICAgICBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4gOiANCisgICAgICAgICAgTWlwc0luc3Q8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4sIE5vSXRpbmVyYXJ5PiANCit7DQorICBiaXRzPDU+ICBmZDsNCisgIGJpdHM8NT4gIGZzOw0KKyAgYml0czw1PiAgZnQ7DQorICBiaXRzPDU+ICBmbXQ7DQorICBiaXRzPDY+ICBmdW5jdDsNCisNCisgIGxldCBvcGNvZGUgPSBvcDsNCisgIGxldCBmdW5jdCAgPSBfZnVuY3Q7DQorICBsZXQgZm10ICAgID0gX2ZtdDsNCisNCisgIGxldCBJbnN0ezI1LTIxfSA9IGZtdDsNCisgIGxldCBJbnN0ezIwLTE2fSA9IGZ0OyANCisgIGxldCBJbnN0ezE1LTExfSA9IGZzOw0KKyAgbGV0IEluc3R7MTAtNn0gID0gZmQ7DQorICBsZXQgSW5zdHs1LTB9ICAgPSBmdW5jdDsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBGb3JtYXQgRkkgaW5zdHJ1Y3Rpb24gY2xhc3MgaW4gTWlwcyA6IDx8b3Bjb2RlfGJhc2V8ZnR8aW1tZWRpYXRlfD4NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2NsYXNzIEZGSTxiaXRzPDY+IG9wLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+OiANCisgICAgICAgICAgTWlwc0luc3Q8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4sIE5vSXRpbmVyYXJ5PiANCit7DQorICBiaXRzPDU+ICBmdDsNCisgIGJpdHM8NT4gIGJhc2U7DQorICBiaXRzPDE2PiBpbW0xNjsNCisNCisgIGxldCBvcGNvZGUgPSBvcDsNCisNCisgIGxldCBJbnN0ezI1LTIxfSA9IGJhc2U7DQorICBsZXQgSW5zdHsyMC0xNn0gPSBmdDsgDQorICBsZXQgSW5zdHsxNS0wfSAgPSBpbW0xNjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBDb21wYXJlIGluc3RydWN0aW9uIGNsYXNzIGluIE1pcHMgOiA8fDAxMDAwMXxmbXR8ZnR8ZnN8MDAwMDAxMXxjb25kY29kZXw+DQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitjbGFzcyBGQ0M8Yml0czw1PiBfZm10LCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+IDogDQorICAgICAgICAgIE1pcHNJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuLCBOb0l0aW5lcmFyeT4gDQorew0KKyAgYml0czw1PiAgZnM7DQorICBiaXRzPDU+ICBmdDsNCisgIGJpdHM8ND4gIGNjOw0KKyAgYml0czw1PiAgZm10Ow0KKw0KKyAgbGV0IG9wY29kZSA9IDB4MTE7DQorICBsZXQgZm10ICAgID0gX2ZtdDsNCisNCisgIGxldCBJbnN0ezI1LTIxfSA9IGZtdDsNCisgIGxldCBJbnN0ezIwLTE2fSA9IGZ0OyANCisgIGxldCBJbnN0ezE1LTExfSA9IGZzOw0KKyAgbGV0IEluc3R7MTAtNn0gID0gMDsNCisgIGxldCBJbnN0ezUtNH0gICA9IDBiMTE7DQorICBsZXQgSW5zdHszLTB9ICAgPSBjYzsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJbnN0ckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJbnN0ckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjMwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0luc3RySW5mby5jcHAKQEAgLTAsMCArMSw1MjIgQEAKKy8vPT09LSBNaXBzSW5zdHJJbmZvLmNwcCAtIE1pcHMgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBNaXBzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1pcHNJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJNaXBzVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIk1pcHNNYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJNaXBzR2VuSW5zdHJJbmZvLmluYyIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01pcHNJbnN0ckluZm86Ok1pcHNJbnN0ckluZm8oTWlwc1RhcmdldE1hY2hpbmUgJnRtKQorICA6IFRhcmdldEluc3RySW5mb0ltcGwoTWlwc0luc3RzLCBhcnJheV9sZW5ndGhvZihNaXBzSW5zdHMpKSwKKyAgICBUTSh0bSksIFJJKCpUTS5nZXRTdWJ0YXJnZXRJbXBsKCksICp0aGlzKSB7fQorCitzdGF0aWMgYm9vbCBpc1plcm9JbW0oY29uc3QgTWFjaGluZU9wZXJhbmQgJm9wKSB7CisgIHJldHVybiBvcC5pc0ltbSgpICYmIG9wLmdldEltbSgpID09IDA7Cit9CisKKy8vLyBpc0xvYWRGcm9tU3RhY2tTbG90IC0gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGEgZGlyZWN0CisvLy8gbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorLy8vIHRoZSBkZXN0aW5hdGlvbiBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4IG9mIHRoZSBsb2FkZWQgc3RhY2sgc2xvdC4gIElmCisvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBsb2FkaW5nIGZyb20gdGhlIHN0YWNrIHNsb3QuCit1bnNpZ25lZCBNaXBzSW5zdHJJbmZvOjoKK2lzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50ICZGcmFtZUluZGV4KSBjb25zdCAKK3sKKyAgaWYgKChNSS0+Z2V0T3Bjb2RlKCkgPT0gTWlwczo6TFcpIHx8IChNSS0+Z2V0T3Bjb2RlKCkgPT0gTWlwczo6TFdDMSkgfHwKKyAgICAgIChNSS0+Z2V0T3Bjb2RlKCkgPT0gTWlwczo6TERDMSkpIHsKKyAgICBpZiAoKE1JLT5nZXRPcGVyYW5kKDIpLmlzRkkoKSkgJiYgLy8gaXMgYSBzdGFjayBzbG90CisgICAgICAgIChNSS0+Z2V0T3BlcmFuZCgxKS5pc0ltbSgpKSAmJiAgLy8gdGhlIGltbSBpcyB6ZXJvCisgICAgICAgIChpc1plcm9JbW0oTUktPmdldE9wZXJhbmQoMSkpKSkgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBpc1N0b3JlVG9TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKy8vLyBzdG9yZSB0byBhIHN0YWNrIHNsb3QsIHJldHVybiB0aGUgdmlydHVhbCBvciBwaHlzaWNhbCByZWdpc3RlciBudW1iZXIgb2YKKy8vLyB0aGUgc291cmNlIHJlZyBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4IG9mIHRoZSBsb2FkZWQgc3RhY2sgc2xvdC4gIElmCisvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBzdG9yaW5nIHRvIHRoZSBzdGFjayBzbG90LgordW5zaWduZWQgTWlwc0luc3RySW5mbzo6Citpc1N0b3JlVG9TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50ICZGcmFtZUluZGV4KSBjb25zdCAKK3sKKyAgaWYgKChNSS0+Z2V0T3Bjb2RlKCkgPT0gTWlwczo6U1cpIHx8IChNSS0+Z2V0T3Bjb2RlKCkgPT0gTWlwczo6U1dDMSkgfHwKKyAgICAgIChNSS0+Z2V0T3Bjb2RlKCkgPT0gTWlwczo6U0RDMSkpIHsKKyAgICBpZiAoKE1JLT5nZXRPcGVyYW5kKDIpLmlzRkkoKSkgJiYgLy8gaXMgYSBzdGFjayBzbG90CisgICAgICAgIChNSS0+Z2V0T3BlcmFuZCgxKS5pc0ltbSgpKSAmJiAgLy8gdGhlIGltbSBpcyB6ZXJvCisgICAgICAgIChpc1plcm9JbW0oTUktPmdldE9wZXJhbmQoMSkpKSkgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLy8gaW5zZXJ0Tm9vcCAtIElmIGRhdGEgaGF6YXJkIGNvbmRpdGlvbiBpcyBmb3VuZCBpbnNlcnQgdGhlIHRhcmdldCBub3AKKy8vLyBpbnN0cnVjdGlvbi4KK3ZvaWQgTWlwc0luc3RySW5mbzo6CitpbnNlcnROb29wKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSkgY29uc3QgCit7CisgIERlYnVnTG9jIERMOworICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoTWlwczo6Tk9QKSk7Cit9CisKK3ZvaWQgTWlwc0luc3RySW5mbzo6Citjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdCB7CisgIGJvb2wgRGVzdENQVSA9IE1pcHM6OkNQVVJlZ3NSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnKTsKKyAgYm9vbCBTcmNDUFUgID0gTWlwczo6Q1BVUmVnc1JlZ0NsYXNzLmNvbnRhaW5zKFNyY1JlZyk7CisKKyAgLy8gQ1BVLUNQVSBpcyB0aGUgbW9zdCBjb21tb24uCisgIGlmIChEZXN0Q1BVICYmIFNyY0NQVSkgeworICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE1pcHM6OkFERHUpLCBEZXN0UmVnKS5hZGRSZWcoTWlwczo6WkVSTykKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIENvcHkgdG8gQ1BVIGZyb20gb3RoZXIgcmVnaXN0ZXJzLgorICBpZiAoRGVzdENQVSkgeworICAgIGlmIChNaXBzOjpDQ1JSZWdDbGFzcy5jb250YWlucyhTcmNSZWcpKQorICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6Q0ZDMSksIERlc3RSZWcpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICAgIGVsc2UgaWYgKE1pcHM6OkZHUjMyUmVnQ2xhc3MuY29udGFpbnMoU3JjUmVnKSkKKyAgICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE1pcHM6Ok1GQzEpLCBEZXN0UmVnKQorICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgICBlbHNlIGlmIChTcmNSZWcgPT0gTWlwczo6SEkpCisgICAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChNaXBzOjpNRkhJKSwgRGVzdFJlZyk7CisgICAgZWxzZSBpZiAoU3JjUmVnID09IE1pcHM6OkxPKQorICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6TUZMTyksIERlc3RSZWcpOworICAgIGVsc2UKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvcHkgdG8gQ1BVIGZyb20gaW52YWxpZCByZWdpc3RlciIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIENvcHkgdG8gb3RoZXIgcmVnaXN0ZXJzIGZyb20gQ1BVLgorICBpZiAoU3JjQ1BVKSB7CisgICAgaWYgKE1pcHM6OkNDUlJlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcpKQorICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6Q1RDMSksIERlc3RSZWcpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICAgIGVsc2UgaWYgKE1pcHM6OkZHUjMyUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZykpCisgICAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChNaXBzOjpNVEMxKSwgRGVzdFJlZykKKyAgICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSk7CisgICAgZWxzZSBpZiAoRGVzdFJlZyA9PSBNaXBzOjpISSkKKyAgICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE1pcHM6Ok1USEkpKQorICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgICBlbHNlIGlmIChEZXN0UmVnID09IE1pcHM6OkxPKQorICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6TVRMTykpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICAgIGVsc2UKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvcHkgZnJvbSBDUFUgdG8gaW52YWxpZCByZWdpc3RlciIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChNaXBzOjpGR1IzMlJlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpIHsKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChNaXBzOjpGTU9WX1MzMiksIERlc3RSZWcpCisgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIGlmIChNaXBzOjpBRkdSNjRSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKSB7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6Rk1PVl9EMzIpLCBEZXN0UmVnKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKE1pcHM6OkNDUlJlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpIHsKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChNaXBzOjpNT1ZDQ1JUb0NDUiksIERlc3RSZWcpCisgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgICByZXR1cm47CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiQ2Fubm90IGNvcHkgcmVnaXN0ZXJzIik7Cit9CisKK3ZvaWQgTWlwc0luc3RySW5mbzo6CitzdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLCBpbnQgRkksIAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgRGVidWdMb2MgREw7CisgIGlmIChJICE9IE1CQi5lbmQoKSkgREwgPSBJLT5nZXREZWJ1Z0xvYygpOworCisgIGlmIChSQyA9PSBNaXBzOjpDUFVSZWdzUmVnaXN0ZXJDbGFzcykgCisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6U1cpKS5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAgICAgICAuYWRkSW1tKDApLmFkZEZyYW1lSW5kZXgoRkkpOworICBlbHNlIGlmIChSQyA9PSBNaXBzOjpGR1IzMlJlZ2lzdGVyQ2xhc3MpCisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6U1dDMSkpLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKQorICAgICAgICAgIC5hZGRJbW0oMCkuYWRkRnJhbWVJbmRleChGSSk7CisgIGVsc2UgaWYgKFJDID09IE1pcHM6OkFGR1I2NFJlZ2lzdGVyQ2xhc3MpIHsKKyAgICBpZiAoIVRNLmdldFN1YnRhcmdldDxNaXBzU3VidGFyZ2V0PigpLmlzTWlwczEoKSkgeworICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6U0RDMSkpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAgICAgLmFkZEltbSgwKS5hZGRGcmFtZUluZGV4KEZJKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSAKKyAgICAgICAgTUJCLmdldFBhcmVudCgpLT5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkICpTdWJTZXQgPSBUUkktPmdldFN1YlJlZ2lzdGVycyhTcmNSZWcpOworICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6U1dDMSkpCisgICAgICAgIC5hZGRSZWcoU3ViU2V0WzBdLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAgICAgLmFkZEltbSgwKS5hZGRGcmFtZUluZGV4KEZJKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE1pcHM6OlNXQzEpKQorICAgICAgICAuYWRkUmVnKFN1YlNldFsxXSwgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpCisgICAgICAgIC5hZGRJbW0oNCkuYWRkRnJhbWVJbmRleChGSSk7CisgICAgfQorICB9IGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJSZWdpc3RlciBjbGFzcyBub3QgaGFuZGxlZCEiKTsKK30KKwordm9pZCBNaXBzSW5zdHJJbmZvOjoKK2xvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZJLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgCit7CisgIERlYnVnTG9jIERMOworICBpZiAoSSAhPSBNQkIuZW5kKCkpIERMID0gSS0+Z2V0RGVidWdMb2MoKTsKKworICBpZiAoUkMgPT0gTWlwczo6Q1BVUmVnc1JlZ2lzdGVyQ2xhc3MpIAorICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE1pcHM6OkxXKSwgRGVzdFJlZykuYWRkSW1tKDApLmFkZEZyYW1lSW5kZXgoRkkpOworICBlbHNlIGlmIChSQyA9PSBNaXBzOjpGR1IzMlJlZ2lzdGVyQ2xhc3MpCisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6TFdDMSksIERlc3RSZWcpLmFkZEltbSgwKS5hZGRGcmFtZUluZGV4KEZJKTsKKyAgZWxzZSBpZiAoUkMgPT0gTWlwczo6QUZHUjY0UmVnaXN0ZXJDbGFzcykgeworICAgIGlmICghVE0uZ2V0U3VidGFyZ2V0PE1pcHNTdWJ0YXJnZXQ+KCkuaXNNaXBzMSgpKSB7CisgICAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChNaXBzOjpMREMxKSwgRGVzdFJlZykuYWRkSW1tKDApLmFkZEZyYW1lSW5kZXgoRkkpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IAorICAgICAgICBNQkIuZ2V0UGFyZW50KCktPmdldFRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICAgICAgY29uc3QgdW5zaWduZWQgKlN1YlNldCA9IFRSSS0+Z2V0U3ViUmVnaXN0ZXJzKERlc3RSZWcpOworICAgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoTWlwczo6TFdDMSksIFN1YlNldFswXSkKKyAgICAgICAgLmFkZEltbSgwKS5hZGRGcmFtZUluZGV4KEZJKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE1pcHM6OkxXQzEpLCBTdWJTZXRbMV0pCisgICAgICAgIC5hZGRJbW0oNCkuYWRkRnJhbWVJbmRleChGSSk7CisgICAgfQorICB9IGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJSZWdpc3RlciBjbGFzcyBub3QgaGFuZGxlZCEiKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJyYW5jaCBBbmFseXNpcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEdldENvbmRGcm9tQnJhbmNoT3BjIC0gUmV0dXJuIHRoZSBNaXBzIENDIHRoYXQgbWF0Y2hlcyAKKy8vLyB0aGUgY29ycmVzcG9uZGVudCBCcmFuY2ggaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorc3RhdGljIE1pcHM6OkNvbmRDb2RlIEdldENvbmRGcm9tQnJhbmNoT3BjKHVuc2lnbmVkIEJyT3BjKSAKK3sKKyAgc3dpdGNoIChCck9wYykgeworICBkZWZhdWx0OiByZXR1cm4gTWlwczo6Q09ORF9JTlZBTElEOworICBjYXNlIE1pcHM6OkJFUSAgOiByZXR1cm4gTWlwczo6Q09ORF9FOworICBjYXNlIE1pcHM6OkJORSAgOiByZXR1cm4gTWlwczo6Q09ORF9ORTsKKyAgY2FzZSBNaXBzOjpCR1RaIDogcmV0dXJuIE1pcHM6OkNPTkRfR1o7CisgIGNhc2UgTWlwczo6QkdFWiA6IHJldHVybiBNaXBzOjpDT05EX0dFWjsKKyAgY2FzZSBNaXBzOjpCTFRaIDogcmV0dXJuIE1pcHM6OkNPTkRfTFo7CisgIGNhc2UgTWlwczo6QkxFWiA6IHJldHVybiBNaXBzOjpDT05EX0xFWjsKKworICAvLyBXZSBkb250IGRvIGZwIGJyYW5jaCBhbmFseXNpcyB5ZXQhICAKKyAgY2FzZSBNaXBzOjpCQzFUIDogCisgIGNhc2UgTWlwczo6QkMxRiA6IHJldHVybiBNaXBzOjpDT05EX0lOVkFMSUQ7CisgIH0KK30KKworLy8vIEdldENvbmRCcmFuY2hGcm9tQ29uZCAtIFJldHVybiB0aGUgQnJhbmNoIGluc3RydWN0aW9uCisvLy8gb3Bjb2RlIHRoYXQgbWF0Y2hlcyB0aGUgY2MuCit1bnNpZ25lZCBNaXBzOjpHZXRDb25kQnJhbmNoRnJvbUNvbmQoTWlwczo6Q29uZENvZGUgQ0MpIAoreworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgY29uZGl0aW9uIGNvZGUhIik7CisgIGNhc2UgTWlwczo6Q09ORF9FICAgOiByZXR1cm4gTWlwczo6QkVROworICBjYXNlIE1pcHM6OkNPTkRfTkUgIDogcmV0dXJuIE1pcHM6OkJORTsKKyAgY2FzZSBNaXBzOjpDT05EX0daICA6IHJldHVybiBNaXBzOjpCR1RaOworICBjYXNlIE1pcHM6OkNPTkRfR0VaIDogcmV0dXJuIE1pcHM6OkJHRVo7CisgIGNhc2UgTWlwczo6Q09ORF9MWiAgOiByZXR1cm4gTWlwczo6QkxUWjsKKyAgY2FzZSBNaXBzOjpDT05EX0xFWiA6IHJldHVybiBNaXBzOjpCTEVaOworCisgIGNhc2UgTWlwczo6RkNPTkRfRjoKKyAgY2FzZSBNaXBzOjpGQ09ORF9VTjoKKyAgY2FzZSBNaXBzOjpGQ09ORF9FUToKKyAgY2FzZSBNaXBzOjpGQ09ORF9VRVE6CisgIGNhc2UgTWlwczo6RkNPTkRfT0xUOgorICBjYXNlIE1pcHM6OkZDT05EX1VMVDoKKyAgY2FzZSBNaXBzOjpGQ09ORF9PTEU6CisgIGNhc2UgTWlwczo6RkNPTkRfVUxFOgorICBjYXNlIE1pcHM6OkZDT05EX1NGOgorICBjYXNlIE1pcHM6OkZDT05EX05HTEU6CisgIGNhc2UgTWlwczo6RkNPTkRfU0VROgorICBjYXNlIE1pcHM6OkZDT05EX05HTDoKKyAgY2FzZSBNaXBzOjpGQ09ORF9MVDoKKyAgY2FzZSBNaXBzOjpGQ09ORF9OR0U6CisgIGNhc2UgTWlwczo6RkNPTkRfTEU6CisgIGNhc2UgTWlwczo6RkNPTkRfTkdUOiByZXR1cm4gTWlwczo6QkMxVDsKKworICBjYXNlIE1pcHM6OkZDT05EX1Q6CisgIGNhc2UgTWlwczo6RkNPTkRfT1I6CisgIGNhc2UgTWlwczo6RkNPTkRfTkVROgorICBjYXNlIE1pcHM6OkZDT05EX09HTDoKKyAgY2FzZSBNaXBzOjpGQ09ORF9VR0U6CisgIGNhc2UgTWlwczo6RkNPTkRfT0dFOgorICBjYXNlIE1pcHM6OkZDT05EX1VHVDoKKyAgY2FzZSBNaXBzOjpGQ09ORF9PR1Q6CisgIGNhc2UgTWlwczo6RkNPTkRfU1Q6CisgIGNhc2UgTWlwczo6RkNPTkRfR0xFOgorICBjYXNlIE1pcHM6OkZDT05EX1NORToKKyAgY2FzZSBNaXBzOjpGQ09ORF9HTDoKKyAgY2FzZSBNaXBzOjpGQ09ORF9OTFQ6CisgIGNhc2UgTWlwczo6RkNPTkRfR0U6CisgIGNhc2UgTWlwczo6RkNPTkRfTkxFOgorICBjYXNlIE1pcHM6OkZDT05EX0dUOiByZXR1cm4gTWlwczo6QkMxRjsKKyAgfQorfQorCisvLy8gR2V0T3Bwb3NpdGVCcmFuY2hDb25kaXRpb24gLSBSZXR1cm4gdGhlIGludmVyc2Ugb2YgdGhlIHNwZWNpZmllZCAKKy8vLyBjb25kaXRpb24sIGUuZy4gdHVybmluZyBDT05EX0UgdG8gQ09ORF9ORS4KK01pcHM6OkNvbmRDb2RlIE1pcHM6OkdldE9wcG9zaXRlQnJhbmNoQ29uZGl0aW9uKE1pcHM6OkNvbmRDb2RlIENDKSAKK3sKKyAgc3dpdGNoIChDQykgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIGNvbmRpdGlvbiBjb2RlISIpOworICBjYXNlIE1pcHM6OkNPTkRfRSAgIDogcmV0dXJuIE1pcHM6OkNPTkRfTkU7CisgIGNhc2UgTWlwczo6Q09ORF9ORSAgOiByZXR1cm4gTWlwczo6Q09ORF9FOworICBjYXNlIE1pcHM6OkNPTkRfR1ogIDogcmV0dXJuIE1pcHM6OkNPTkRfTEVaOworICBjYXNlIE1pcHM6OkNPTkRfR0VaIDogcmV0dXJuIE1pcHM6OkNPTkRfTFo7CisgIGNhc2UgTWlwczo6Q09ORF9MWiAgOiByZXR1cm4gTWlwczo6Q09ORF9HRVo7CisgIGNhc2UgTWlwczo6Q09ORF9MRVogOiByZXR1cm4gTWlwczo6Q09ORF9HWjsKKyAgY2FzZSBNaXBzOjpGQ09ORF9GICA6IHJldHVybiBNaXBzOjpGQ09ORF9UOworICBjYXNlIE1pcHM6OkZDT05EX1VOIDogcmV0dXJuIE1pcHM6OkZDT05EX09SOworICBjYXNlIE1pcHM6OkZDT05EX0VRIDogcmV0dXJuIE1pcHM6OkZDT05EX05FUTsKKyAgY2FzZSBNaXBzOjpGQ09ORF9VRVE6IHJldHVybiBNaXBzOjpGQ09ORF9PR0w7CisgIGNhc2UgTWlwczo6RkNPTkRfT0xUOiByZXR1cm4gTWlwczo6RkNPTkRfVUdFOworICBjYXNlIE1pcHM6OkZDT05EX1VMVDogcmV0dXJuIE1pcHM6OkZDT05EX09HRTsKKyAgY2FzZSBNaXBzOjpGQ09ORF9PTEU6IHJldHVybiBNaXBzOjpGQ09ORF9VR1Q7CisgIGNhc2UgTWlwczo6RkNPTkRfVUxFOiByZXR1cm4gTWlwczo6RkNPTkRfT0dUOworICBjYXNlIE1pcHM6OkZDT05EX1NGOiAgcmV0dXJuIE1pcHM6OkZDT05EX1NUOworICBjYXNlIE1pcHM6OkZDT05EX05HTEU6cmV0dXJuIE1pcHM6OkZDT05EX0dMRTsKKyAgY2FzZSBNaXBzOjpGQ09ORF9TRVE6IHJldHVybiBNaXBzOjpGQ09ORF9TTkU7CisgIGNhc2UgTWlwczo6RkNPTkRfTkdMOiByZXR1cm4gTWlwczo6RkNPTkRfR0w7CisgIGNhc2UgTWlwczo6RkNPTkRfTFQ6ICByZXR1cm4gTWlwczo6RkNPTkRfTkxUOworICBjYXNlIE1pcHM6OkZDT05EX05HRTogcmV0dXJuIE1pcHM6OkZDT05EX0dFOworICBjYXNlIE1pcHM6OkZDT05EX0xFOiAgcmV0dXJuIE1pcHM6OkZDT05EX05MRTsKKyAgY2FzZSBNaXBzOjpGQ09ORF9OR1Q6IHJldHVybiBNaXBzOjpGQ09ORF9HVDsKKyAgfQorfQorCitib29sIE1pcHNJbnN0ckluZm86OkFuYWx5emVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TW9kaWZ5KSBjb25zdCAKK3sKKyAgLy8gSWYgdGhlIGJsb2NrIGhhcyBubyB0ZXJtaW5hdG9ycywgaXQganVzdCBmYWxscyBpbnRvIHRoZSBibG9jayBhZnRlciBpdC4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuZW5kKCk7CisgIGlmIChJID09IE1CQi5iZWdpbigpKQorICAgIHJldHVybiBmYWxzZTsKKyAgLS1JOworICB3aGlsZSAoSS0+aXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAtLUk7CisgIH0KKyAgaWYgKCFpc1VucHJlZGljYXRlZFRlcm1pbmF0b3IoSSkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gR2V0IHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBibG9jay4KKyAgTWFjaGluZUluc3RyICpMYXN0SW5zdCA9IEk7CisgIAorICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSB0ZXJtaW5hdG9yIGluc3RydWN0aW9uLCBwcm9jZXNzIGl0LgorICB1bnNpZ25lZCBMYXN0T3BjID0gTGFzdEluc3QtPmdldE9wY29kZSgpOworICBpZiAoSSA9PSBNQkIuYmVnaW4oKSB8fCAhaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKC0tSSkpIHsKKyAgICBpZiAoIUxhc3RJbnN0LT5nZXREZXNjKCkuaXNCcmFuY2goKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gVW5jb25kaXRpb25hbCBicmFuY2gKKyAgICBpZiAoTGFzdE9wYyA9PSBNaXBzOjpKKSB7CisgICAgICBUQkIgPSBMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBNaXBzOjpDb25kQ29kZSBCcmFuY2hDb2RlID0gR2V0Q29uZEZyb21CcmFuY2hPcGMoTGFzdEluc3QtPmdldE9wY29kZSgpKTsKKyAgICBpZiAoQnJhbmNoQ29kZSA9PSBNaXBzOjpDT05EX0lOVkFMSUQpCisgICAgICByZXR1cm4gdHJ1ZTsgIC8vIENhbid0IGhhbmRsZSBpbmRpcmVjdCBicmFuY2guCisKKyAgICAvLyBDb25kaXRpb25hbCBicmFuY2gKKyAgICAvLyBCbG9jayBlbmRzIHdpdGggZmFsbC10aHJvdWdoIGNvbmRicmFuY2guCisgICAgaWYgKExhc3RPcGMgIT0gTWlwczo6Q09ORF9JTlZBTElEKSB7CisgICAgICBpbnQgTGFzdE51bU9wID0gTGFzdEluc3QtPmdldE51bU9wZXJhbmRzKCk7CisKKyAgICAgIFRCQiA9IExhc3RJbnN0LT5nZXRPcGVyYW5kKExhc3ROdW1PcC0xKS5nZXRNQkIoKTsKKyAgICAgIENvbmQucHVzaF9iYWNrKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVJbW0oQnJhbmNoQ29kZSkpOworCisgICAgICBmb3IgKGludCBpPTA7IGk8TGFzdE51bU9wLTE7IGkrKykgeworICAgICAgICBDb25kLnB1c2hfYmFjayhMYXN0SW5zdC0+Z2V0T3BlcmFuZChpKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgCisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIGl0IGlmIGl0IGlzIGEgdGVybWluYXRvci4KKyAgTWFjaGluZUluc3RyICpTZWNvbmRMYXN0SW5zdCA9IEk7CisgIAorICAvLyBJZiB0aGVyZSBhcmUgdGhyZWUgdGVybWluYXRvcnMsIHdlIGRvbid0IGtub3cgd2hhdCBzb3J0IG9mIGJsb2NrIHRoaXMgaXMuCisgIGlmIChTZWNvbmRMYXN0SW5zdCAmJiBJICE9IE1CQi5iZWdpbigpICYmIGlzVW5wcmVkaWNhdGVkVGVybWluYXRvcigtLUkpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIElmIHRoZSBibG9jayBlbmRzIHdpdGggTWlwczo6SiBhbmQgYSBNaXBzOjpCTkUvTWlwczo6QkVRLCBoYW5kbGUgaXQuCisgIHVuc2lnbmVkIFNlY29uZExhc3RPcGMgICAgPSBTZWNvbmRMYXN0SW5zdC0+Z2V0T3Bjb2RlKCk7CisgIE1pcHM6OkNvbmRDb2RlIEJyYW5jaENvZGUgPSBHZXRDb25kRnJvbUJyYW5jaE9wYyhTZWNvbmRMYXN0T3BjKTsKKworICBpZiAoQnJhbmNoQ29kZSAhPSBNaXBzOjpDT05EX0lOVkFMSUQgJiYgTGFzdE9wYyA9PSBNaXBzOjpKKSB7CisgICAgaW50IFNlY29uZE51bU9wID0gU2Vjb25kTGFzdEluc3QtPmdldE51bU9wZXJhbmRzKCk7CisKKyAgICBUQkIgPSBTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZChTZWNvbmROdW1PcC0xKS5nZXRNQkIoKTsKKyAgICBDb25kLnB1c2hfYmFjayhNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlSW1tKEJyYW5jaENvZGUpKTsKKworICAgIGZvciAoaW50IGk9MDsgaTxTZWNvbmROdW1PcC0xOyBpKyspIHsKKyAgICAgIENvbmQucHVzaF9iYWNrKFNlY29uZExhc3RJbnN0LT5nZXRPcGVyYW5kKGkpKTsKKyAgICB9CisKKyAgICBGQkIgPSBMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIElmIHRoZSBibG9jayBlbmRzIHdpdGggdHdvIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMsIGhhbmRsZSBpdC4gVGhlIGxhc3QgCisgIC8vIG9uZSBpcyBub3QgZXhlY3V0ZWQsIHNvIHJlbW92ZSBpdC4KKyAgaWYgKChTZWNvbmRMYXN0T3BjID09IE1pcHM6OkopICYmIChMYXN0T3BjID09IE1pcHM6OkopKSB7CisgICAgVEJCID0gU2Vjb25kTGFzdEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgSSA9IExhc3RJbnN0OworICAgIGlmIChBbGxvd01vZGlmeSkKKyAgICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgY2FuJ3QgaGFuZGxlIHRoaXMuCisgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBNaXBzSW5zdHJJbmZvOjoKK0luc2VydEJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jayAqVEJCLCAKKyAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0IHsKKyAgLy8gU2hvdWxkbid0IGJlIGEgZmFsbCB0aHJvdWdoLgorICBhc3NlcnQoVEJCICYmICJJbnNlcnRCcmFuY2ggbXVzdCBub3QgYmUgdG9sZCB0byBpbnNlcnQgYSBmYWxsdGhyb3VnaCIpOworICBhc3NlcnQoKENvbmQuc2l6ZSgpID09IDMgfHwgQ29uZC5zaXplKCkgPT0gMiB8fCBDb25kLnNpemUoKSA9PSAwKSAmJgorICAgICAgICAgIk1pcHMgYnJhbmNoIGNvbmRpdGlvbnMgY2FuIGhhdmUgdHdvfHRocmVlIGNvbXBvbmVudHMhIik7CisKKyAgaWYgKEZCQiA9PSAwKSB7IC8vIE9uZSB3YXkgYnJhbmNoLgorICAgIGlmIChDb25kLmVtcHR5KCkpIHsKKyAgICAgIC8vIFVuY29uZGl0aW9uYWwgYnJhbmNoPworICAgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KE1pcHM6OkopKS5hZGRNQkIoVEJCKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ29uZGl0aW9uYWwgYnJhbmNoLgorICAgICAgdW5zaWduZWQgT3BjID0gR2V0Q29uZEJyYW5jaEZyb21Db25kKChNaXBzOjpDb25kQ29kZSlDb25kWzBdLmdldEltbSgpKTsKKyAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmVElEID0gZ2V0KE9wYyk7CisKKyAgICAgIGlmIChUSUQuZ2V0TnVtT3BlcmFuZHMoKSA9PSAzKQorICAgICAgICBCdWlsZE1JKCZNQkIsIERMLCBUSUQpLmFkZFJlZyhDb25kWzFdLmdldFJlZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKENvbmRbMl0uZ2V0UmVnKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNQkIoVEJCKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQnVpbGRNSSgmTUJCLCBETCwgVElEKS5hZGRSZWcoQ29uZFsxXS5nZXRSZWcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1CQihUQkIpOworCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIC8vIFR3by13YXkgQ29uZGl0aW9uYWwgYnJhbmNoLgorICB1bnNpZ25lZCBPcGMgPSBHZXRDb25kQnJhbmNoRnJvbUNvbmQoKE1pcHM6OkNvbmRDb2RlKUNvbmRbMF0uZ2V0SW1tKCkpOworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IGdldChPcGMpOworCisgIGlmIChUSUQuZ2V0TnVtT3BlcmFuZHMoKSA9PSAzKQorICAgIEJ1aWxkTUkoJk1CQiwgREwsIFRJRCkuYWRkUmVnKENvbmRbMV0uZ2V0UmVnKCkpLmFkZFJlZyhDb25kWzJdLmdldFJlZygpKQorICAgICAgICAgICAgICAgICAgICAgIC5hZGRNQkIoVEJCKTsKKyAgZWxzZQorICAgIEJ1aWxkTUkoJk1CQiwgREwsIFRJRCkuYWRkUmVnKENvbmRbMV0uZ2V0UmVnKCkpLmFkZE1CQihUQkIpOworCisgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChNaXBzOjpKKSkuYWRkTUJCKEZCQik7CisgIHJldHVybiAyOworfQorCit1bnNpZ25lZCBNaXBzSW5zdHJJbmZvOjoKK1JlbW92ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCAKK3sKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuZW5kKCk7CisgIGlmIChJID09IE1CQi5iZWdpbigpKSByZXR1cm4gMDsKKyAgLS1JOworICB3aGlsZSAoSS0+aXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkKKyAgICAgIHJldHVybiAwOworICAgIC0tSTsKKyAgfQorICBpZiAoSS0+Z2V0T3Bjb2RlKCkgIT0gTWlwczo6SiAmJiAKKyAgICAgIEdldENvbmRGcm9tQnJhbmNoT3BjKEktPmdldE9wY29kZSgpKSA9PSBNaXBzOjpDT05EX0lOVkFMSUQpCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBSZW1vdmUgdGhlIGJyYW5jaC4KKyAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIAorICBJID0gTUJCLmVuZCgpOworICAKKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkpIHJldHVybiAxOworICAtLUk7CisgIGlmIChHZXRDb25kRnJvbUJyYW5jaE9wYyhJLT5nZXRPcGNvZGUoKSkgPT0gTWlwczo6Q09ORF9JTlZBTElEKQorICAgIHJldHVybiAxOworICAKKyAgLy8gUmVtb3ZlIHRoZSBicmFuY2guCisgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICByZXR1cm4gMjsKK30KKworLy8vIFJldmVyc2VCcmFuY2hDb25kaXRpb24gLSBSZXR1cm4gdGhlIGludmVyc2Ugb3Bjb2RlIG9mIHRoZSAKKy8vLyBzcGVjaWZpZWQgQnJhbmNoIGluc3RydWN0aW9uLgorYm9vbCBNaXBzSW5zdHJJbmZvOjoKK1JldmVyc2VCcmFuY2hDb25kaXRpb24oU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCkgY29uc3QgCit7CisgIGFzc2VydCggKENvbmQuc2l6ZSgpID09IDMgfHwgQ29uZC5zaXplKCkgPT0gMikgJiYgCisgICAgICAgICAgIkludmFsaWQgTWlwcyBicmFuY2ggY29uZGl0aW9uISIpOworICBDb25kWzBdLnNldEltbShHZXRPcHBvc2l0ZUJyYW5jaENvbmRpdGlvbigoTWlwczo6Q29uZENvZGUpQ29uZFswXS5nZXRJbW0oKSkpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBnZXRHbG9iYWxCYXNlUmVnIC0gUmV0dXJuIGEgdmlydHVhbCByZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZQorLy8vIHRoZSBnbG9iYWwgYmFzZSByZWdpc3RlciB2YWx1ZS4gT3V0cHV0IGluc3RydWN0aW9ucyByZXF1aXJlZCB0bworLy8vIGluaXRpYWxpemUgdGhlIHJlZ2lzdGVyIGluIHRoZSBmdW5jdGlvbiBlbnRyeSBibG9jaywgaWYgbmVjZXNzYXJ5LgorLy8vCit1bnNpZ25lZCBNaXBzSW5zdHJJbmZvOjpnZXRHbG9iYWxCYXNlUmVnKE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0IHsKKyAgTWlwc0Z1bmN0aW9uSW5mbyAqTWlwc0ZJID0gTUYtPmdldEluZm88TWlwc0Z1bmN0aW9uSW5mbz4oKTsKKyAgdW5zaWduZWQgR2xvYmFsQmFzZVJlZyA9IE1pcHNGSS0+Z2V0R2xvYmFsQmFzZVJlZygpOworICBpZiAoR2xvYmFsQmFzZVJlZyAhPSAwKQorICAgIHJldHVybiBHbG9iYWxCYXNlUmVnOworCisgIC8vIEluc2VydCB0aGUgc2V0IG9mIEdsb2JhbEJhc2VSZWcgaW50byB0aGUgZmlyc3QgTUJCIG9mIHRoZSBmdW5jdGlvbgorICBNYWNoaW5lQmFzaWNCbG9jayAmRmlyc3RNQkIgPSBNRi0+ZnJvbnQoKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBGaXJzdE1CQi5iZWdpbigpOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZSZWdJbmZvID0gTUYtPmdldFJlZ0luZm8oKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBNRi0+Z2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisKKyAgR2xvYmFsQmFzZVJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKE1pcHM6OkNQVVJlZ3NSZWdpc3RlckNsYXNzKTsKKyAgQnVpbGRNSShGaXJzdE1CQiwgTUJCSSwgRGVidWdMb2MoKSwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwKKyAgICAgICAgICBHbG9iYWxCYXNlUmVnKS5hZGRSZWcoTWlwczo6R1ApOworICBSZWdJbmZvLmFkZExpdmVJbihNaXBzOjpHUCk7CisKKyAgTWlwc0ZJLT5zZXRHbG9iYWxCYXNlUmVnKEdsb2JhbEJhc2VSZWcpOworICByZXR1cm4gR2xvYmFsQmFzZVJlZzsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzSW5zdHJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0luc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYTNkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0luc3RySW5mby5oCkBAIC0wLDAgKzEsMjM1IEBACisvLz09PS0gTWlwc0luc3RySW5mby5oIC0gTWlwcyBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgTWlwcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTUlQU0lOU1RSVUNUSU9OSU5GT19ICisjZGVmaW5lIE1JUFNJTlNUUlVDVElPTklORk9fSAorCisjaW5jbHVkZSAiTWlwcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiTWlwc1JlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBNaXBzIHsKKworICAvLyBNaXBzIEJyYW5jaCBDb2RlcworICBlbnVtIEZQQnJhbmNoQ29kZSB7CisgICAgQlJBTkNIX0YsCisgICAgQlJBTkNIX1QsCisgICAgQlJBTkNIX0ZMLAorICAgIEJSQU5DSF9UTCwKKyAgICBCUkFOQ0hfSU5WQUxJRAorICB9OworCisgIC8vIE1pcHMgQ29uZGl0aW9uIENvZGVzCisgIGVudW0gQ29uZENvZGUgeworICAgIC8vIFRvIGJlIHVzZWQgd2l0aCBmbG9hdCBicmFuY2ggVHJ1ZQorICAgIEZDT05EX0YsCisgICAgRkNPTkRfVU4sCisgICAgRkNPTkRfRVEsCisgICAgRkNPTkRfVUVRLAorICAgIEZDT05EX09MVCwKKyAgICBGQ09ORF9VTFQsCisgICAgRkNPTkRfT0xFLAorICAgIEZDT05EX1VMRSwKKyAgICBGQ09ORF9TRiwKKyAgICBGQ09ORF9OR0xFLAorICAgIEZDT05EX1NFUSwKKyAgICBGQ09ORF9OR0wsCisgICAgRkNPTkRfTFQsCisgICAgRkNPTkRfTkdFLAorICAgIEZDT05EX0xFLAorICAgIEZDT05EX05HVCwKKworICAgIC8vIFRvIGJlIHVzZWQgd2l0aCBmbG9hdCBicmFuY2ggRmFsc2UKKyAgICAvLyBUaGlzIGNvbmRpdGlvbnMgaGF2ZSB0aGUgc2FtZSBtbmVtb25pYyBhcyB0aGUKKyAgICAvLyBhYm92ZSBvbmVzLCBidXQgYXJlIHVzZWQgd2l0aCBhIGJyYW5jaCBGYWxzZTsKKyAgICBGQ09ORF9ULAorICAgIEZDT05EX09SLAorICAgIEZDT05EX05FUSwKKyAgICBGQ09ORF9PR0wsCisgICAgRkNPTkRfVUdFLAorICAgIEZDT05EX09HRSwKKyAgICBGQ09ORF9VR1QsCisgICAgRkNPTkRfT0dULAorICAgIEZDT05EX1NULAorICAgIEZDT05EX0dMRSwKKyAgICBGQ09ORF9TTkUsCisgICAgRkNPTkRfR0wsCisgICAgRkNPTkRfTkxULAorICAgIEZDT05EX0dFLAorICAgIEZDT05EX05MRSwKKyAgICBGQ09ORF9HVCwKKworICAgIC8vIE9ubHkgaW50ZWdlciBjb25kaXRpb25zCisgICAgQ09ORF9FLAorICAgIENPTkRfR1osCisgICAgQ09ORF9HRVosCisgICAgQ09ORF9MWiwKKyAgICBDT05EX0xFWiwKKyAgICBDT05EX05FLAorICAgIENPTkRfSU5WQUxJRAorICB9OworICAKKyAgLy8gVHVybiBjb25kaXRpb24gY29kZSBpbnRvIGNvbmRpdGlvbmFsIGJyYW5jaCBvcGNvZGUuCisgIHVuc2lnbmVkIEdldENvbmRCcmFuY2hGcm9tQ29uZChDb25kQ29kZSBDQyk7CisKKyAgLy8vIEdldE9wcG9zaXRlQnJhbmNoQ29uZGl0aW9uIC0gUmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoZSBzcGVjaWZpZWQgY29uZCwKKyAgLy8vIGUuZy4gdHVybmluZyBDT05EX0UgdG8gQ09ORF9ORS4KKyAgQ29uZENvZGUgR2V0T3Bwb3NpdGVCcmFuY2hDb25kaXRpb24oTWlwczo6Q29uZENvZGUgQ0MpOworCisgIC8vLyBNaXBzQ0NUb1N0cmluZyAtIE1hcCBlYWNoIEZQIGNvbmRpdGlvbiBjb2RlIHRvIGl0cyBzdHJpbmcKKyAgaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICpNaXBzRkNDVG9TdHJpbmcoTWlwczo6Q29uZENvZGUgQ0MpIAorICB7CisgICAgc3dpdGNoIChDQykgeworICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBjb25kaXRpb24gY29kZSIpOworICAgICAgY2FzZSBGQ09ORF9GOgorICAgICAgY2FzZSBGQ09ORF9UOiAgIHJldHVybiAiZiI7CisgICAgICBjYXNlIEZDT05EX1VOOgorICAgICAgY2FzZSBGQ09ORF9PUjogIHJldHVybiAidW4iOworICAgICAgY2FzZSBGQ09ORF9FUTogCisgICAgICBjYXNlIEZDT05EX05FUTogcmV0dXJuICJlcSI7CisgICAgICBjYXNlIEZDT05EX1VFUToKKyAgICAgIGNhc2UgRkNPTkRfT0dMOiByZXR1cm4gInVlcSI7CisgICAgICBjYXNlIEZDT05EX09MVDoKKyAgICAgIGNhc2UgRkNPTkRfVUdFOiByZXR1cm4gIm9sdCI7CisgICAgICBjYXNlIEZDT05EX1VMVDoKKyAgICAgIGNhc2UgRkNPTkRfT0dFOiByZXR1cm4gInVsdCI7CisgICAgICBjYXNlIEZDT05EX09MRToKKyAgICAgIGNhc2UgRkNPTkRfVUdUOiByZXR1cm4gIm9sZSI7CisgICAgICBjYXNlIEZDT05EX1VMRToKKyAgICAgIGNhc2UgRkNPTkRfT0dUOiByZXR1cm4gInVsZSI7CisgICAgICBjYXNlIEZDT05EX1NGOgorICAgICAgY2FzZSBGQ09ORF9TVDogIHJldHVybiAic2YiOworICAgICAgY2FzZSBGQ09ORF9OR0xFOgorICAgICAgY2FzZSBGQ09ORF9HTEU6IHJldHVybiAibmdsZSI7CisgICAgICBjYXNlIEZDT05EX1NFUToKKyAgICAgIGNhc2UgRkNPTkRfU05FOiByZXR1cm4gInNlcSI7CisgICAgICBjYXNlIEZDT05EX05HTDoKKyAgICAgIGNhc2UgRkNPTkRfR0w6ICByZXR1cm4gIm5nbCI7CisgICAgICBjYXNlIEZDT05EX0xUOgorICAgICAgY2FzZSBGQ09ORF9OTFQ6IHJldHVybiAibHQiOworICAgICAgY2FzZSBGQ09ORF9OR0U6CisgICAgICBjYXNlIEZDT05EX0dFOiAgcmV0dXJuICJnZSI7CisgICAgICBjYXNlIEZDT05EX0xFOgorICAgICAgY2FzZSBGQ09ORF9OTEU6IHJldHVybiAibmxlIjsKKyAgICAgIGNhc2UgRkNPTkRfTkdUOgorICAgICAgY2FzZSBGQ09ORF9HVDogIHJldHVybiAiZ3QiOworICAgIH0KKyAgfQorfQorCisvLy8gTWlwc0lJIC0gVGhpcyBuYW1lc3BhY2UgaG9sZHMgYWxsIG9mIHRoZSB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgdGhhdAorLy8vIGluc3RydWN0aW9uIGluZm8gdHJhY2tzLgorLy8vCituYW1lc3BhY2UgTWlwc0lJIHsKKyAgLy8vIFRhcmdldCBPcGVyYW5kIEZsYWcgZW51bS4KKyAgZW51bSBUT0YgeworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgICAvLyBNaXBzIFNwZWNpZmljIE1hY2hpbmVPcGVyYW5kIGZsYWdzLgorIAorICAgIE1PX05PX0ZMQUcsCisKKyAgICAvLy8gTU9fR09UIC0gUmVwcmVzZW50cyB0aGUgb2Zmc2V0IGludG8gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgYXQgd2hpY2gKKyAgICAvLy8gdGhlIGFkZHJlc3MgdGhlIHJlbG9jYXRpb24gZW50cnkgc3ltYm9sIHJlc2lkZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICBNT19HT1QsCisKKyAgICAvLy8gTU9fR09UX0NBTEwgLSBSZXByZXNlbnRzIHRoZSBvZmZzZXQgaW50byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBhdCAKKyAgICAvLy8gd2hpY2ggdGhlIGFkZHJlc3Mgb2YgYSBjYWxsIHNpdGUgcmVsb2NhdGlvbiBlbnRyeSBzeW1ib2wgcmVzaWRlcyAKKyAgICAvLy8gZHVyaW5nIGV4ZWN1dGlvbi4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUgc2luY2UgdGhpcyBmbGFnCisgICAgLy8vIGNhbiBvbmx5IGJlIHByZXNlbnQgaW4gY2FsbCBpbnN0cnVjdGlvbnMuCisgICAgTU9fR09UX0NBTEwsCisKKyAgICAvLy8gTU9fR1BSRUwgLSBSZXByZXNlbnRzIHRoZSBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBncCB2YWx1ZSB0byBiZSB1c2VkIAorICAgIC8vLyBmb3IgdGhlIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlIGJlaW5nIHByb2R1Y2VkLgorICAgIE1PX0dQUkVMLAorCisgICAgLy8vIE1PX0FCU19ISUxPIC0gUmVwcmVzZW50cyB0aGUgaGkgb3IgbG93IHBhcnQgb2YgYW4gYWJzb2x1dGUgc3ltYm9sCisgICAgLy8vIGFkZHJlc3MuIAorICAgIE1PX0FCU19ISUxPCisKKyAgfTsKK30KKworY2xhc3MgTWlwc0luc3RySW5mbyA6IHB1YmxpYyBUYXJnZXRJbnN0ckluZm9JbXBsIHsKKyAgTWlwc1RhcmdldE1hY2hpbmUgJlRNOworICBjb25zdCBNaXBzUmVnaXN0ZXJJbmZvIFJJOworcHVibGljOgorICBleHBsaWNpdCBNaXBzSW5zdHJJbmZvKE1pcHNUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgLy8vIGdldFJlZ2lzdGVySW5mbyAtIFRhcmdldEluc3RySW5mbyBpcyBhIHN1cGVyc2V0IG9mIE1SZWdpc3RlciBpbmZvLiAgQXMKKyAgLy8vIHN1Y2gsIHdoZW5ldmVyIGEgY2xpZW50IGhhcyBhbiBpbnN0YW5jZSBvZiBpbnN0cnVjdGlvbiBpbmZvLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBiZSBhYmxlIHRvIGdldCByZWdpc3RlciBpbmZvIGFzIHdlbGwgKHRocm91Z2ggdGhpcyBtZXRob2QpLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBNaXBzUmVnaXN0ZXJJbmZvICZnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBSSTsgfQorCisgIC8vLyBpc0xvYWRGcm9tU3RhY2tTbG90IC0gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGEgZGlyZWN0CisgIC8vLyBsb2FkIGZyb20gYSBzdGFjayBzbG90LCByZXR1cm4gdGhlIHZpcnR1YWwgb3IgcGh5c2ljYWwgcmVnaXN0ZXIgbnVtYmVyIG9mCisgIC8vLyB0aGUgZGVzdGluYXRpb24gYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QuICBJZgorICAvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworICAvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIGxvYWRpbmcgZnJvbSB0aGUgc3RhY2sgc2xvdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworICAKKyAgLy8vIGlzU3RvcmVUb1N0YWNrU2xvdCAtIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBhIGRpcmVjdAorICAvLy8gc3RvcmUgdG8gYSBzdGFjayBzbG90LCByZXR1cm4gdGhlIHZpcnR1YWwgb3IgcGh5c2ljYWwgcmVnaXN0ZXIgbnVtYmVyIG9mCisgIC8vLyB0aGUgc291cmNlIHJlZyBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4IG9mIHRoZSBsb2FkZWQgc3RhY2sgc2xvdC4gIElmCisgIC8vLyBub3QsIHJldHVybiAwLiAgVGhpcyBwcmVkaWNhdGUgbXVzdCByZXR1cm4gMCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzCisgIC8vLyBhbnkgc2lkZSBlZmZlY3RzIG90aGVyIHRoYW4gc3RvcmluZyB0byB0aGUgc3RhY2sgc2xvdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBpc1N0b3JlVG9TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdDsKKyAKKyAgLy8vIEJyYW5jaCBBbmFseXNpcworICB2aXJ0dWFsIGJvb2wgQW5hbHl6ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jayAqJlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dNb2RpZnkpIGNvbnN0OworICB2aXJ0dWFsIHVuc2lnbmVkIFJlbW92ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdDsKKyAgdmlydHVhbCB1bnNpZ25lZCBJbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgY29weVBoeXNSZWcoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgdmlydHVhbAorICBib29sIFJldmVyc2VCcmFuY2hDb25kaXRpb24oU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCkgY29uc3Q7CisKKyAgLy8vIEluc2VydCBub3AgaW5zdHJ1Y3Rpb24gd2hlbiBoYXphcmQgY29uZGl0aW9uIGlzIGZvdW5kCisgIHZpcnR1YWwgdm9pZCBpbnNlcnROb29wKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpIGNvbnN0OworCisgIC8vLyBnZXRHbG9iYWxCYXNlUmVnIC0gUmV0dXJuIGEgdmlydHVhbCByZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZQorICAvLy8gdGhlIGdsb2JhbCBiYXNlIHJlZ2lzdGVyIHZhbHVlLiBPdXRwdXQgaW5zdHJ1Y3Rpb25zIHJlcXVpcmVkIHRvCisgIC8vLyBpbml0aWFsaXplIHRoZSByZWdpc3RlciBpbiB0aGUgZnVuY3Rpb24gZW50cnkgYmxvY2ssIGlmIG5lY2Vzc2FyeS4KKyAgLy8vCisgIHVuc2lnbmVkIGdldEdsb2JhbEJhc2VSZWcoTWFjaGluZUZ1bmN0aW9uICpNRikgY29uc3Q7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJbnN0ckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc0luc3RySW5mby50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGE0MzIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNJbnN0ckluZm8udGQKQEAgLTAsMCArMSw3MDcgQEAKKy8vPT09LSBNaXBzSW5zdHJJbmZvLnRkIC0gTWlwcyBSZWdpc3RlciBkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8NCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gSW5zdHJ1Y3Rpb24gZm9ybWF0IHN1cGVyY2xhc3MNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIk1pcHNJbnN0ckZvcm1hdHMudGQiDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBNaXBzIHByb2ZpbGVzIGFuZCBub2Rlcw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorZGVmIFNEVF9NaXBzUmV0ICAgICAgICAgIDogU0RUeXBlUHJvZmlsZTwwLCAxLCBbU0RUQ2lzSW50PDA+XT47DQorZGVmIFNEVF9NaXBzSm1wTGluayAgICAgIDogU0RUeXBlUHJvZmlsZTwwLCAxLCBbU0RUQ2lzVlQ8MCwgaVBUUj5dPjsNCitkZWYgU0RUX01pcHNTZWxlY3RDQyAgICAgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFtTRFRDaXNTYW1lQXM8MCwgMj4sIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzU2FtZUFzPDIsIDM+LCBTRFRDaXNJbnQ8MT5dPjsNCitkZWYgU0RUX01pcHNDTW92ICAgICAgICAgOiBTRFR5cGVQcm9maWxlPDEsIDQsIFtTRFRDaXNTYW1lQXM8MCwgMT4sIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzU2FtZUFzPDEsIDI+LCBTRFRDaXNTYW1lQXM8MywgND4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNJbnQ8ND5dPjsNCitkZWYgU0RUX01pcHNDYWxsU2VxU3RhcnQgOiBTRENhbGxTZXFTdGFydDxbU0RUQ2lzVlQ8MCwgaTMyPl0+Ow0KK2RlZiBTRFRfTWlwc0NhbGxTZXFFbmQgICA6IFNEQ2FsbFNlcUVuZDxbU0RUQ2lzVlQ8MCwgaTMyPiwgU0RUQ2lzVlQ8MSwgaTMyPl0+Ow0KKw0KKy8vIENhbGwNCitkZWYgTWlwc0ptcExpbmsgOiBTRE5vZGU8Ik1pcHNJU0Q6OkptcExpbmsiLFNEVF9NaXBzSm1wTGluaywgDQorICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPdXRGbGFnLCBTRE5QT3B0SW5GbGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUFZhcmlhZGljXT47DQorDQorLy8gSGkgYW5kIExvIG5vZGVzIGFyZSB1c2VkIHRvIGhhbmRsZSBnbG9iYWwgYWRkcmVzc2VzLiBVc2VkIG9uIA0KKy8vIE1pcHNJU2VsTG93ZXJpbmcgdG8gbG93ZXIgc3R1ZmYgbGlrZSBHbG9iYWxBZGRyZXNzLCBFeHRlcm5hbFN5bWJvbCANCisvLyBzdGF0aWMgbW9kZWwuIChub3RoaW5nIHRvIGRvIHdpdGggTWlwcyBSZWdpc3RlcnMgSGkgYW5kIExvKQ0KK2RlZiBNaXBzSGkgICAgOiBTRE5vZGU8Ik1pcHNJU0Q6OkhpIiwgU0RUSW50VW5hcnlPcD47DQorZGVmIE1pcHNMbyAgICA6IFNETm9kZTwiTWlwc0lTRDo6TG8iLCBTRFRJbnRVbmFyeU9wPjsNCitkZWYgTWlwc0dQUmVsIDogU0ROb2RlPCJNaXBzSVNEOjpHUFJlbCIsIFNEVEludFVuYXJ5T3A+Ow0KKw0KKy8vIFJldHVybg0KK2RlZiBNaXBzUmV0IDogU0ROb2RlPCJNaXBzSVNEOjpSZXQiLCBTRFRfTWlwc1JldCwgW1NETlBIYXNDaGFpbiwgDQorICAgICAgICAgICAgICAgICAgICAgU0ROUE9wdEluRmxhZ10+Ow0KKw0KKy8vIFRoZXNlIGFyZSB0YXJnZXQtaW5kZXBlbmRlbnQgbm9kZXMsIGJ1dCBoYXZlIHRhcmdldC1zcGVjaWZpYyBmb3JtYXRzLg0KK2RlZiBjYWxsc2VxX3N0YXJ0IDogU0ROb2RlPCJJU0Q6OkNBTExTRVFfU1RBUlQiLCBTRFRfTWlwc0NhbGxTZXFTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3V0RmxhZ10+Ow0KK2RlZiBjYWxsc2VxX2VuZCAgIDogU0ROb2RlPCJJU0Q6OkNBTExTRVFfRU5EIiwgU0RUX01pcHNDYWxsU2VxRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWcsIFNETlBPdXRGbGFnXT47DQorDQorLy8gU2VsZWN0IENvbmRpdGlvbiBDb2RlDQorZGVmIE1pcHNTZWxlY3RDQyAgOiBTRE5vZGU8Ik1pcHNJU0Q6OlNlbGVjdENDIiwgU0RUX01pcHNTZWxlY3RDQz47DQorDQorLy8gQ29uZGl0aW9uYWwgTW92ZQ0KK2RlZiBNaXBzQ01vdiAgICAgIDogU0ROb2RlPCJNaXBzSVNEOjpDTW92IiwgU0RUX01pcHNDTW92PjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIE1pcHMgSW5zdHJ1Y3Rpb24gUHJlZGljYXRlIERlZmluaXRpb25zLg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorZGVmIEhhc1NFSW5SZWcgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQuaGFzU0VJblJlZygpIj47DQorZGVmIEhhc0JpdENvdW50IDogUHJlZGljYXRlPCJTdWJ0YXJnZXQuaGFzQml0Q291bnQoKSI+Ow0KK2RlZiBIYXNTd2FwICAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0Lmhhc1N3YXAoKSI+Ow0KK2RlZiBIYXNDb25kTW92ICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0Lmhhc0NvbmRNb3YoKSI+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTWlwcyBPcGVyYW5kLCBDb21wbGV4IFBhdHRlcm5zIGFuZCBUcmFuc2Zvcm1hdGlvbnMgRGVmaW5pdGlvbnMuDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBJbnN0cnVjdGlvbiBvcGVyYW5kIHR5cGVzDQorZGVmIGJydGFyZ2V0ICAgIDogT3BlcmFuZDxPdGhlclZUPjsNCitkZWYgY2FsbHRhcmdldCAgOiBPcGVyYW5kPGkzMj47DQorZGVmIHNpbW0xNiAgICAgIDogT3BlcmFuZDxpMzI+Ow0KK2RlZiBzaGFtdCAgICAgICA6IE9wZXJhbmQ8aTMyPjsNCisNCisvLyBVbnNpZ25lZCBPcGVyYW5kDQorZGVmIHVpbW0xNiAgICAgIDogT3BlcmFuZDxpMzI+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFVuc2lnbmVkSW1tIjsNCit9DQorDQorLy8gQWRkcmVzcyBvcGVyYW5kDQorZGVmIG1lbSA6IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRNZW1PcGVyYW5kIjsNCisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBzaW1tMTYsIENQVVJlZ3MpOw0KK30NCisNCisvLyBUcmFuc2Zvcm1hdGlvbiBGdW5jdGlvbiAtIGdldCB0aGUgbG93ZXIgMTYgYml0cy4NCitkZWYgTE8xNiA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIHJldHVybiBnZXRJMzJJbW0oKHVuc2lnbmVkKU4tPmdldFpFeHRWYWx1ZSgpICYgMHhGRkZGKTsNCit9XT47DQorDQorLy8gVHJhbnNmb3JtYXRpb24gRnVuY3Rpb24gLSBnZXQgdGhlIGhpZ2hlciAxNiBiaXRzLg0KK2RlZiBISTE2IDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgcmV0dXJuIGdldEkzMkltbSgodW5zaWduZWQpTi0+Z2V0WkV4dFZhbHVlKCkgPj4gMTYpOw0KK31dPjsNCisNCisvLyBOb2RlIGltbWVkaWF0ZSBmaXRzIGFzIDE2LWJpdCBzaWduIGV4dGVuZGVkIG9uIHRhcmdldCBpbW1lZGlhdGUuDQorLy8gZS5nLiBhZGRpLCBhbmRpDQorZGVmIGltbVNFeHQxNiAgOiBQYXRMZWFmPChpbW0pLCBbew0KKyAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIChpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpID09IChzaG9ydClOLT5nZXRaRXh0VmFsdWUoKTsNCisgIGVsc2UNCisgICAgcmV0dXJuIChpbnQ2NF90KU4tPmdldFpFeHRWYWx1ZSgpID09IChzaG9ydClOLT5nZXRaRXh0VmFsdWUoKTsNCit9XT47DQorDQorLy8gTm9kZSBpbW1lZGlhdGUgZml0cyBhcyAxNi1iaXQgemVybyBleHRlbmRlZCBvbiB0YXJnZXQgaW1tZWRpYXRlLg0KKy8vIFRoZSBMTzE2IHBhcmFtIG1lYW5zIHRoYXQgb25seSB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgbm9kZQ0KKy8vIGltbWVkaWF0ZSBhcmUgY2F1Z2h0Lg0KKy8vIGUuZy4gYWRkaXUsIHNsdGl1DQorZGVmIGltbVpFeHQxNiAgOiBQYXRMZWFmPChpbW0pLCBbew0KKyAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMikNCisgICAgcmV0dXJuICh1aW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSA9PSAodW5zaWduZWQgc2hvcnQpTi0+Z2V0WkV4dFZhbHVlKCk7DQorICBlbHNlDQorICAgIHJldHVybiAodWludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkgPT0gKHVuc2lnbmVkIHNob3J0KU4tPmdldFpFeHRWYWx1ZSgpOw0KK31dLCBMTzE2PjsNCisNCisvLyBzaGFtdCBmaWVsZCBtdXN0IGZpdCBpbiA1IGJpdHMuDQorZGVmIGltbVpFeHQ1IDogUGF0TGVhZjwoaW1tKSwgW3sNCisgIHJldHVybiBOLT5nZXRaRXh0VmFsdWUoKSA9PSAoKE4tPmdldFpFeHRWYWx1ZSgpKSAmIDB4MWYpIDsNCit9XT47DQorDQorLy8gTWlwcyBBZGRyZXNzIE1vZGUhIFNETm9kZSBmcmFtZWluZGV4IGNvdWxkIHBvc3NpYmlseSBiZSBhIG1hdGNoDQorLy8gc2luY2UgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIGZyb20gc3RhY2sgdXNlZCBpdC4NCitkZWYgYWRkciA6IENvbXBsZXhQYXR0ZXJuPGlQVFIsIDIsICJTZWxlY3RBZGRyIiwgW2ZyYW1laW5kZXhdLCBbXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBJbnN0cnVjdGlvbnMgc3BlY2lmaWMgZm9ybWF0DQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBBcml0aG1ldGljIDMgcmVnaXN0ZXIgb3BlcmFuZHMNCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbg0KK2NsYXNzIEFyaXRoUjxiaXRzPDY+IG9wLCBiaXRzPDY+IGZ1bmMsIHN0cmluZyBpbnN0cl9hc20sIFNETm9kZSBPcE5vZGUsDQorICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+Og0KKyAgRlI8IG9wLA0KKyAgICAgIGZ1bmMsDQorICAgICAgKG91dHMgQ1BVUmVnczokZHN0KSwNCisgICAgICAoaW5zIENQVVJlZ3M6JGIsIENQVVJlZ3M6JGMpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkZHN0LCAkYiwgJGMiKSwNCisgICAgICBbKHNldCBDUFVSZWdzOiRkc3QsIChPcE5vZGUgQ1BVUmVnczokYiwgQ1BVUmVnczokYykpXSwgaXRpbj47DQorDQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4NCitjbGFzcyBBcml0aE92ZXJmbG93UjxiaXRzPDY+IG9wLCBiaXRzPDY+IGZ1bmMsIHN0cmluZyBpbnN0cl9hc20+Og0KKyAgRlI8IG9wLA0KKyAgICAgIGZ1bmMsDQorICAgICAgKG91dHMgQ1BVUmVnczokZHN0KSwNCisgICAgICAoaW5zIENQVVJlZ3M6JGIsIENQVVJlZ3M6JGMpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkZHN0LCAkYiwgJGMiKSwNCisgICAgICBbXSwgSUlBbHU+Ow0KKw0KKy8vIEFyaXRobWV0aWMgMiByZWdpc3RlciBvcGVyYW5kcw0KK2NsYXNzIEFyaXRoSTxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBTRE5vZGUgT3BOb2RlLA0KKyAgICAgICAgICAgICBPcGVyYW5kIE9kLCBQYXRMZWFmIGltbV90eXBlPiA6DQorICBGSTwgb3AsDQorICAgICAgKG91dHMgQ1BVUmVnczokZHN0KSwNCisgICAgICAoaW5zIENQVVJlZ3M6JGIsIE9kOiRjKSwNCisgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIlx0JGRzdCwgJGIsICRjIiksDQorICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoT3BOb2RlIENQVVJlZ3M6JGIsIGltbV90eXBlOiRjKSldLCBJSUFsdT47DQorDQorY2xhc3MgQXJpdGhPdmVyZmxvd0k8Yml0czw2PiBvcCwgc3RyaW5nIGluc3RyX2FzbSwgU0ROb2RlIE9wTm9kZSwNCisgICAgICAgICAgICAgT3BlcmFuZCBPZCwgUGF0TGVhZiBpbW1fdHlwZT4gOg0KKyAgRkk8IG9wLA0KKyAgICAgIChvdXRzIENQVVJlZ3M6JGRzdCksDQorICAgICAgKGlucyBDUFVSZWdzOiRiLCBPZDokYyksDQorICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRkc3QsICRiLCAkYyIpLA0KKyAgICAgIFtdLCBJSUFsdT47DQorDQorLy8gQXJpdGhtZXRpYyBNdWx0aXBseSBBREQvU1VCDQorbGV0IHJkPTAgaW4NCitjbGFzcyBNQXJpdGhSPGJpdHM8Nj4gZnVuYywgc3RyaW5nIGluc3RyX2FzbT4gOg0KKyAgRlI8IDB4MWMsDQorICAgICAgZnVuYywNCisgICAgICAob3V0cyBDUFVSZWdzOiRycyksDQorICAgICAgKGlucyBDUFVSZWdzOiRydCksDQorICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRycywgJHJ0IiksDQorICAgICAgW10sIElJSW11bD47DQorDQorLy8gIExvZ2ljYWwNCitjbGFzcyBMb2dpY1I8Yml0czw2PiBmdW5jLCBzdHJpbmcgaW5zdHJfYXNtLCBTRE5vZGUgT3BOb2RlPjoNCisgIEZSPCAweDAwLA0KKyAgICAgIGZ1bmMsDQorICAgICAgKG91dHMgQ1BVUmVnczokZHN0KSwNCisgICAgICAoaW5zIENQVVJlZ3M6JGIsIENQVVJlZ3M6JGMpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkZHN0LCAkYiwgJGMiKSwNCisgICAgICBbKHNldCBDUFVSZWdzOiRkc3QsIChPcE5vZGUgQ1BVUmVnczokYiwgQ1BVUmVnczokYykpXSwgSUlBbHU+Ow0KKw0KK2NsYXNzIExvZ2ljSTxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBTRE5vZGUgT3BOb2RlPjoNCisgIEZJPCBvcCwNCisgICAgICAob3V0cyBDUFVSZWdzOiRkc3QpLA0KKyAgICAgIChpbnMgQ1BVUmVnczokYiwgdWltbTE2OiRjKSwNCisgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIlx0JGRzdCwgJGIsICRjIiksDQorICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoT3BOb2RlIENQVVJlZ3M6JGIsIGltbVpFeHQxNjokYykpXSwgSUlBbHU+Ow0KKw0KK2NsYXNzIExvZ2ljTk9SPGJpdHM8Nj4gb3AsIGJpdHM8Nj4gZnVuYywgc3RyaW5nIGluc3RyX2FzbT46DQorICBGUjwgb3AsDQorICAgICAgZnVuYywNCisgICAgICAob3V0cyBDUFVSZWdzOiRkc3QpLA0KKyAgICAgIChpbnMgQ1BVUmVnczokYiwgQ1BVUmVnczokYyksDQorICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRkc3QsICRiLCAkYyIpLA0KKyAgICAgIFsoc2V0IENQVVJlZ3M6JGRzdCwgKG5vdCAob3IgQ1BVUmVnczokYiwgQ1BVUmVnczokYykpKV0sIElJQWx1PjsNCisNCisvLyBTaGlmdHMNCitsZXQgcnQgPSAwIGluDQorY2xhc3MgTG9naWNSX3NoaWZ0X2ltbTxiaXRzPDY+IGZ1bmMsIHN0cmluZyBpbnN0cl9hc20sIFNETm9kZSBPcE5vZGU+Og0KKyAgRlI8IDB4MDAsDQorICAgICAgZnVuYywNCisgICAgICAob3V0cyBDUFVSZWdzOiRkc3QpLA0KKyAgICAgIChpbnMgQ1BVUmVnczokYiwgc2hhbXQ6JGMpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkZHN0LCAkYiwgJGMiKSwNCisgICAgICBbKHNldCBDUFVSZWdzOiRkc3QsIChPcE5vZGUgQ1BVUmVnczokYiwgaW1tWkV4dDU6JGMpKV0sIElJQWx1PjsNCisNCitjbGFzcyBMb2dpY1Jfc2hpZnRfcmVnPGJpdHM8Nj4gZnVuYywgc3RyaW5nIGluc3RyX2FzbSwgU0ROb2RlIE9wTm9kZT46DQorICBGUjwgMHgwMCwNCisgICAgICBmdW5jLA0KKyAgICAgIChvdXRzIENQVVJlZ3M6JGRzdCksDQorICAgICAgKGlucyBDUFVSZWdzOiRiLCBDUFVSZWdzOiRjKSwNCisgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIlx0JGRzdCwgJGIsICRjIiksDQorICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoT3BOb2RlIENQVVJlZ3M6JGIsIENQVVJlZ3M6JGMpKV0sIElJQWx1PjsNCisNCisvLyBMb2FkIFVwcGVyIEltZWRpYXRlDQorY2xhc3MgTG9hZFVwcGVyPGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20+Og0KKyAgRkk8IG9wLA0KKyAgICAgIChvdXRzIENQVVJlZ3M6JGRzdCksDQorICAgICAgKGlucyB1aW1tMTY6JGltbSksDQorICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRkc3QsICRpbW0iKSwNCisgICAgICBbXSwgSUlBbHU+Ow0KKw0KKy8vIE1lbW9yeSBMb2FkL1N0b3JlDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBoYXNEZWxheVNsb3QgPSAxIGluDQorY2xhc3MgTG9hZE08Yml0czw2PiBvcCwgc3RyaW5nIGluc3RyX2FzbSwgUGF0RnJhZyBPcE5vZGU+Og0KKyAgRkk8IG9wLA0KKyAgICAgIChvdXRzIENQVVJlZ3M6JGRzdCksDQorICAgICAgKGlucyBtZW06JGFkZHIpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkZHN0LCAkYWRkciIpLA0KKyAgICAgIFsoc2V0IENQVVJlZ3M6JGRzdCwgKE9wTm9kZSBhZGRyOiRhZGRyKSldLCBJSUxvYWQ+Ow0KKw0KK2NsYXNzIFN0b3JlTTxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBQYXRGcmFnIE9wTm9kZT46DQorICBGSTwgb3AsDQorICAgICAgKG91dHMpLA0KKyAgICAgIChpbnMgQ1BVUmVnczokZHN0LCBtZW06JGFkZHIpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkZHN0LCAkYWRkciIpLA0KKyAgICAgIFsoT3BOb2RlIENQVVJlZ3M6JGRzdCwgYWRkcjokYWRkcildLCBJSVN0b3JlPjsNCisNCisvLyBDb25kaXRpb25hbCBCcmFuY2gNCitsZXQgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3I9MSwgaGFzRGVsYXlTbG90ID0gMSBpbiB7DQorY2xhc3MgQ0JyYW5jaDxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBQYXRGcmFnIGNvbmRfb3A+Og0KKyAgRkk8IG9wLA0KKyAgICAgIChvdXRzKSwNCisgICAgICAoaW5zIENQVVJlZ3M6JGEsIENQVVJlZ3M6JGIsIGJydGFyZ2V0OiRvZmZzZXQpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkYSwgJGIsICRvZmZzZXQiKSwNCisgICAgICBbKGJyY29uZCAoY29uZF9vcCBDUFVSZWdzOiRhLCBDUFVSZWdzOiRiKSwgYmI6JG9mZnNldCldLA0KKyAgICAgIElJQnJhbmNoPjsNCisNCisNCitjbGFzcyBDQnJhbmNoWmVybzxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBQYXRGcmFnIGNvbmRfb3A+Og0KKyAgRkk8IG9wLA0KKyAgICAgIChvdXRzKSwNCisgICAgICAoaW5zIENQVVJlZ3M6JHNyYywgYnJ0YXJnZXQ6JG9mZnNldCksDQorICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRzcmMsICRvZmZzZXQiKSwNCisgICAgICBbKGJyY29uZCAoY29uZF9vcCBDUFVSZWdzOiRzcmMsIDApLCBiYjokb2Zmc2V0KV0sDQorICAgICAgSUlCcmFuY2g+Ow0KK30NCisNCisvLyBTZXRDQw0KK2NsYXNzIFNldENDX1I8Yml0czw2PiBvcCwgYml0czw2PiBmdW5jLCBzdHJpbmcgaW5zdHJfYXNtLA0KKyAgICAgIFBhdEZyYWcgY29uZF9vcD46DQorICBGUjwgb3AsDQorICAgICAgZnVuYywNCisgICAgICAob3V0cyBDUFVSZWdzOiRkc3QpLA0KKyAgICAgIChpbnMgQ1BVUmVnczokYiwgQ1BVUmVnczokYyksDQorICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRkc3QsICRiLCAkYyIpLA0KKyAgICAgIFsoc2V0IENQVVJlZ3M6JGRzdCwgKGNvbmRfb3AgQ1BVUmVnczokYiwgQ1BVUmVnczokYykpXSwNCisgICAgICBJSUFsdT47DQorDQorY2xhc3MgU2V0Q0NfSTxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtLCBQYXRGcmFnIGNvbmRfb3AsDQorICAgICAgT3BlcmFuZCBPZCwgUGF0TGVhZiBpbW1fdHlwZT46DQorICBGSTwgb3AsDQorICAgICAgKG91dHMgQ1BVUmVnczokZHN0KSwNCisgICAgICAoaW5zIENQVVJlZ3M6JGIsIE9kOiRjKSwNCisgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIlx0JGRzdCwgJGIsICRjIiksDQorICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoY29uZF9vcCBDUFVSZWdzOiRiLCBpbW1fdHlwZTokYykpXSwNCisgICAgICBJSUFsdT47DQorDQorLy8gVW5jb25kaXRpb25hbCBicmFuY2gNCitsZXQgaXNCcmFuY2g9MSwgaXNUZXJtaW5hdG9yPTEsIGlzQmFycmllcj0xLCBoYXNEZWxheVNsb3QgPSAxIGluDQorY2xhc3MgSnVtcEZKPGJpdHM8Nj4gb3AsIHN0cmluZyBpbnN0cl9hc20+Og0KKyAgRko8IG9wLA0KKyAgICAgIChvdXRzKSwNCisgICAgICAoaW5zIGJydGFyZ2V0OiR0YXJnZXQpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkdGFyZ2V0IiksDQorICAgICAgWyhiciBiYjokdGFyZ2V0KV0sIElJQnJhbmNoPjsNCisNCitsZXQgaXNCcmFuY2g9MSwgaXNUZXJtaW5hdG9yPTEsIGlzQmFycmllcj0xLCByZD0wLCBoYXNEZWxheVNsb3QgPSAxIGluDQorY2xhc3MgSnVtcEZSPGJpdHM8Nj4gb3AsIGJpdHM8Nj4gZnVuYywgc3RyaW5nIGluc3RyX2FzbT46DQorICBGUjwgb3AsDQorICAgICAgZnVuYywNCisgICAgICAob3V0cyksDQorICAgICAgKGlucyBDUFVSZWdzOiR0YXJnZXQpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkdGFyZ2V0IiksDQorICAgICAgWyhicmluZCBDUFVSZWdzOiR0YXJnZXQpXSwgSUlCcmFuY2g+Ow0KKw0KKy8vIEp1bXAgYW5kIExpbmsgKENhbGwpDQorbGV0IGlzQ2FsbD0xLCBoYXNEZWxheVNsb3Q9MSwNCisgIC8vIEFsbCBjYWxscyBjbG9iYmVyIHRoZSBub24tY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4uLg0KKyAgRGVmcyA9IFtBVCwgVjAsIFYxLCBBMCwgQTEsIEEyLCBBMywgVDAsIFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksDQorICAgICAgICAgIEswLCBLMSwgRDAsIEQxLCBEMiwgRDMsIEQ0LCBENSwgRDYsIEQ3LCBEOCwgRDldLCBVc2VzID0gW0dQXSBpbiB7DQorICBjbGFzcyBKdW1wTGluazxiaXRzPDY+IG9wLCBzdHJpbmcgaW5zdHJfYXNtPjoNCisgICAgRko8IG9wLA0KKyAgICAgICAgKG91dHMpLA0KKyAgICAgICAgKGlucyBjYWxsdGFyZ2V0OiR0YXJnZXQsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIlx0JHRhcmdldCIpLA0KKyAgICAgICAgWyhNaXBzSm1wTGluayBpbW06JHRhcmdldCldLCBJSUJyYW5jaD47DQorDQorICBsZXQgcmQ9MzEgaW4NCisgIGNsYXNzIEp1bXBMaW5rUmVnPGJpdHM8Nj4gb3AsIGJpdHM8Nj4gZnVuYywgc3RyaW5nIGluc3RyX2FzbT46DQorICAgIEZSPCBvcCwNCisgICAgICAgIGZ1bmMsDQorICAgICAgICAob3V0cyksDQorICAgICAgICAoaW5zIENQVVJlZ3M6JHJzLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRycyIpLA0KKyAgICAgICAgWyhNaXBzSm1wTGluayBDUFVSZWdzOiRycyldLCBJSUJyYW5jaD47DQorDQorICBjbGFzcyBCcmFuY2hMaW5rPHN0cmluZyBpbnN0cl9hc20+Og0KKyAgICBGSTwgMHgxLA0KKyAgICAgICAgKG91dHMpLA0KKyAgICAgICAgKGlucyBDUFVSZWdzOiRycywgYnJ0YXJnZXQ6JHRhcmdldCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkcnMsICR0YXJnZXQiKSwNCisgICAgICAgIFtdLCBJSUJyYW5jaD47DQorfQ0KKw0KKy8vIE11bCwgRGl2DQorY2xhc3MgTXVsRGl2PGJpdHM8Nj4gZnVuYywgc3RyaW5nIGluc3RyX2FzbSwgSW5zdHJJdGluQ2xhc3MgaXRpbj46DQorICBGUjwgMHgwMCwNCisgICAgICBmdW5jLA0KKyAgICAgIChvdXRzKSwNCisgICAgICAoaW5zIENQVVJlZ3M6JGEsIENQVVJlZ3M6JGIpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkYSwgJGIiKSwNCisgICAgICBbXSwgaXRpbj47DQorDQorLy8gTW92ZSBmcm9tIEhpL0xvDQorY2xhc3MgTW92ZUZyb21MT0hJPGJpdHM8Nj4gZnVuYywgc3RyaW5nIGluc3RyX2FzbT46DQorICBGUjwgMHgwMCwNCisgICAgICBmdW5jLA0KKyAgICAgIChvdXRzIENQVVJlZ3M6JGRzdCksDQorICAgICAgKGlucyksDQorICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRkc3QiKSwNCisgICAgICBbXSwgSUlIaUxvPjsNCisNCitjbGFzcyBNb3ZlVG9MT0hJPGJpdHM8Nj4gZnVuYywgc3RyaW5nIGluc3RyX2FzbT46DQorICBGUjwgMHgwMCwNCisgICAgICBmdW5jLA0KKyAgICAgIChvdXRzKSwNCisgICAgICAoaW5zIENQVVJlZ3M6JHNyYyksDQorICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRzcmMiKSwNCisgICAgICBbXSwgSUlIaUxvPjsNCisNCitjbGFzcyBFZmZlY3RpdmVBZGRyZXNzPHN0cmluZyBpbnN0cl9hc20+IDoNCisgIEZJPDB4MDksDQorICAgICAob3V0cyBDUFVSZWdzOiRkc3QpLA0KKyAgICAgKGlucyBtZW06JGFkZHIpLA0KKyAgICAgaW5zdHJfYXNtLA0KKyAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCBhZGRyOiRhZGRyKV0sIElJQWx1PjsNCisNCisvLyBDb3VudCBMZWFkaW5nIE9uZXMvWmVyb3MgaW4gV29yZA0KK2NsYXNzIENvdW50TGVhZGluZzxiaXRzPDY+IGZ1bmMsIHN0cmluZyBpbnN0cl9hc20sIFNETm9kZSBDb3VudE9wPjoNCisgIEZSPCAweDFjLCBmdW5jLCAob3V0cyBDUFVSZWdzOiRkc3QpLCAoaW5zIENQVVJlZ3M6JHNyYyksDQorICAgICAgIXN0cmNvbmNhdChpbnN0cl9hc20sICJcdCRkc3QsICRzcmMiKSwgDQorICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoQ291bnRPcCBDUFVSZWdzOiRzcmMpKV0sIElJQWx1PjsNCisNCisvLyBTaWduIEV4dGVuZCBpbiBSZWdpc3Rlci4NCitjbGFzcyBTaWduRXh0SW5SZWc8Yml0czw2PiBmdW5jLCBzdHJpbmcgaW5zdHJfYXNtLCBWYWx1ZVR5cGUgdnQ+Og0KKyAgRlI8IDB4M2YsIGZ1bmMsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgQ1BVUmVnczokc3JjKSwNCisgICAgICAhc3RyY29uY2F0KGluc3RyX2FzbSwgIlx0JGRzdCwgJHNyYyIpLA0KKyAgICAgIFsoc2V0IENQVVJlZ3M6JGRzdCwgKHNleHRfaW5yZWcgQ1BVUmVnczokc3JjLCB2dCkpXSwgTm9JdGluZXJhcnk+Ow0KKw0KKy8vIEJ5dGUgU3dhcA0KK2NsYXNzIEJ5dGVTd2FwPGJpdHM8Nj4gZnVuYywgc3RyaW5nIGluc3RyX2FzbT46DQorICBGUjwgMHgxZiwgZnVuYywgKG91dHMgQ1BVUmVnczokZHN0KSwgKGlucyBDUFVSZWdzOiRzcmMpLA0KKyAgICAgICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkZHN0LCAkc3JjIiksDQorICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoYnN3YXAgQ1BVUmVnczokc3JjKSldLCBOb0l0aW5lcmFyeT47DQorDQorLy8gQ29uZGl0aW9uYWwgTW92ZQ0KK2NsYXNzIENvbmRNb3Y8Yml0czw2PiBmdW5jLCBzdHJpbmcgaW5zdHJfYXNtLCBQYXRMZWFmIE1vdkNvZGU+Og0KKyAgRlI8IDB4MDAsIGZ1bmMsIChvdXRzIENQVVJlZ3M6JGRzdCksIChpbnMgQ1BVUmVnczokRiwgQ1BVUmVnczokVCwgDQorICAgICAgQ1BVUmVnczokY29uZCksICFzdHJjb25jYXQoaW5zdHJfYXNtLCAiXHQkZHN0LCAkVCwgJGNvbmQiKSwgDQorICAgICAgWyhzZXQgQ1BVUmVnczokZHN0LCAoTWlwc0NNb3YgQ1BVUmVnczokRiwgQ1BVUmVnczokVCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVUmVnczokY29uZCwgTW92Q29kZSkpXSwgTm9JdGluZXJhcnk+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gUHNldWRvIGluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gQXMgc3RhY2sgYWxpZ25tZW50IGlzIGFsd2F5cyBkb25lIHdpdGggYWRkaXUsIHdlIG5lZWQgYSAxNi1iaXQgaW1tZWRpYXRlDQorbGV0IERlZnMgPSBbU1BdLCBVc2VzID0gW1NQXSBpbiB7DQorZGVmIEFESkNBTExTVEFDS0RPV04gOiBNaXBzUHNldWRvPChvdXRzKSwgKGlucyB1aW1tMTY6JGFtdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIhQURKQ0FMTFNUQUNLRE9XTiAkYW10IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhjYWxsc2VxX3N0YXJ0IHRpbW06JGFtdCldPjsNCitkZWYgQURKQ0FMTFNUQUNLVVAgICA6IE1pcHNQc2V1ZG88KG91dHMpLCAoaW5zIHVpbW0xNjokYW10MSwgdWltbTE2OiRhbXQyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiFBREpDQUxMU1RBQ0tVUCAkYW10MSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2FsbHNlcV9lbmQgdGltbTokYW10MSwgdGltbTokYW10MildPjsNCit9DQorDQorLy8gU29tZSBhc3NlbWJseSBtYWNyb3MgbmVlZCB0byBhdm9pZCBwc2V1ZG9pbnN0cnVjdGlvbnMgYW5kIGFzc2VtYmxlcg0KKy8vIGF1dG9tYXRpYyByZW9kZXJpbmcsIHdlIHNob3VsZCByZW9yZGVyIG91cnNlbHZlcy4NCitkZWYgTUFDUk8gICAgIDogTWlwc1BzZXVkbzwob3V0cyksIChpbnMpLCAiLnNldFx0bWFjcm8iLCAgICAgW10+Ow0KK2RlZiBSRU9SREVSICAgOiBNaXBzUHNldWRvPChvdXRzKSwgKGlucyksICIuc2V0XHRyZW9yZGVyIiwgICBbXT47DQorZGVmIE5PTUFDUk8gICA6IE1pcHNQc2V1ZG88KG91dHMpLCAoaW5zKSwgIi5zZXRcdG5vbWFjcm8iLCAgIFtdPjsNCitkZWYgTk9SRU9SREVSIDogTWlwc1BzZXVkbzwob3V0cyksIChpbnMpLCAiLnNldFx0bm9yZW9yZGVyIiwgW10+Ow0KKw0KKy8vIFdoZW4gaGFuZGxpbmcgUElDIGNvZGUgdGhlIGFzc2VtYmxlciBuZWVkcyAuY3Bsb2FkIGFuZCAuY3ByZXN0b3JlDQorLy8gZGlyZWN0aXZlcy4gSWYgdGhlIHJlYWwgaW5zdHJ1Y3Rpb25zIGNvcnJlc3BvbmRpbmcgdGhlc2UgZGlyZWN0aXZlcw0KKy8vIGFyZSB1c2VkLCB3ZSBoYXZlIHRoZSBzYW1lIGJlaGF2aW9yLCBidXQgZ2V0IGFsc28gYSBidW5jaCBvZiB3YXJuaW5ncw0KKy8vIGZyb20gdGhlIGFzc2VtYmxlci4NCitkZWYgQ1BMT0FEIDogTWlwc1BzZXVkbzwob3V0cyksIChpbnMgQ1BVUmVnczokcGljcmVnKSwgIi5jcGxvYWRcdCRwaWNyZWciLCBbXT47DQorZGVmIENQUkVTVE9SRSA6IE1pcHNQc2V1ZG88KG91dHMpLCAoaW5zIHVpbW0xNjokbG9jKSwgIi5jcHJlc3RvcmVcdCRsb2NcbiIsIFtdPjsNCisNCisvLyBUaGUgc3VwcG9ydGVkIE1pcHMgSVNBcyBkb250IGhhdmUgYW55IGluc3RydWN0aW9uIGNsb3NlIHRvIHRoZSBTRUxFQ1RfQ0MgDQorLy8gb3BlcmF0aW9uLiBUaGUgc29sdXRpb24gaXMgdG8gY3JlYXRlIGEgTWlwcyBwc2V1ZG8gU0VMRUNUX0NDIGluc3RydWN0aW9uDQorLy8gKE1pcHNTZWxlY3RDQyksIHVzZSBMb3dlclNFTEVDVF9DQyB0byBnZW5lcmF0ZSB0aGlzIGluc3RydWN0aW9uIGFuZCBmaW5hbGx5IA0KKy8vIHJlcGxhY2UgaXQgZm9yIHJlYWwgc3VwcG9ydGVkIG5vZGVzIGludG8gRW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyDQorbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4gew0KKyAgY2xhc3MgUHNldWRvU2VsQ0M8UmVnaXN0ZXJDbGFzcyBSQywgc3RyaW5nIGFzbXN0cj46IA0KKyAgICBNaXBzUHNldWRvPChvdXRzIFJDOiRkc3QpLCAoaW5zIENQVVJlZ3M6JENtcFJlcywgUkM6JFQsIFJDOiRGKSwgYXNtc3RyLCANCisgICAgWyhzZXQgUkM6JGRzdCwgKE1pcHNTZWxlY3RDQyBDUFVSZWdzOiRDbXBSZXMsIFJDOiRULCBSQzokRikpXT47DQorfQ0KKw0KK2RlZiBTZWxlY3RfQ0MgOiBQc2V1ZG9TZWxDQzxDUFVSZWdzLCAiIyBNaXBzU2VsZWN0X0NDX2kzMiI+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gSW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBNaXBzSSBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vLyBBcml0aG1ldGljIEluc3RydWN0aW9ucyAoQUxVIEltbWVkaWF0ZSkNCitkZWYgQUREaXUgICA6IEFyaXRoSTwweDA5LCAiYWRkaXUiLCBhZGQsIHNpbW0xNiwgaW1tU0V4dDE2PjsNCitkZWYgQUREaSAgICA6IEFyaXRoT3ZlcmZsb3dJPDB4MDgsICJhZGRpIiwgIGFkZCwgc2ltbTE2LCBpbW1TRXh0MTY+Ow0KK2RlZiBTTFRpICAgIDogU2V0Q0NfSTwweDBhLCAic2x0aSIsIHNldGx0LCBzaW1tMTYsIGltbVNFeHQxNj47DQorZGVmIFNMVGl1ICAgOiBTZXRDQ19JPDB4MGIsICJzbHRpdSIsIHNldHVsdCwgc2ltbTE2LCBpbW1TRXh0MTY+Ow0KK2RlZiBBTkRpICAgIDogTG9naWNJPDB4MGMsICJhbmRpIiwgYW5kPjsNCitkZWYgT1JpICAgICA6IExvZ2ljSTwweDBkLCAib3JpIiwgIG9yPjsNCitkZWYgWE9SaSAgICA6IExvZ2ljSTwweDBlLCAieG9yaSIsICB4b3I+Ow0KK2RlZiBMVWkgICAgIDogTG9hZFVwcGVyPDB4MGYsICJsdWkiPjsNCisNCisvLy8gQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMgKDMtT3BlcmFuZCwgUi1UeXBlKQ0KK2RlZiBBRER1ICAgIDogQXJpdGhSPDB4MDAsIDB4MjEsICJhZGR1IiwgYWRkLCBJSUFsdT47DQorZGVmIFNVQnUgICAgOiBBcml0aFI8MHgwMCwgMHgyMywgInN1YnUiLCBzdWIsIElJQWx1PjsNCitkZWYgQUREICAgICA6IEFyaXRoT3ZlcmZsb3dSPDB4MDAsIDB4MjAsICJhZGQiPjsNCitkZWYgU1VCICAgICA6IEFyaXRoT3ZlcmZsb3dSPDB4MDAsIDB4MjIsICJzdWIiPjsNCitkZWYgU0xUICAgICA6IFNldENDX1I8MHgwMCwgMHgyYSwgInNsdCIsIHNldGx0PjsNCitkZWYgU0xUdSAgICA6IFNldENDX1I8MHgwMCwgMHgyYiwgInNsdHUiLCBzZXR1bHQ+Ow0KK2RlZiBBTkQgICAgIDogTG9naWNSPDB4MjQsICJhbmQiLCBhbmQ+Ow0KK2RlZiBPUiAgICAgIDogTG9naWNSPDB4MjUsICJvciIsICBvcj47DQorZGVmIFhPUiAgICAgOiBMb2dpY1I8MHgyNiwgInhvciIsIHhvcj47DQorZGVmIE5PUiAgICAgOiBMb2dpY05PUjwweDAwLCAweDI3LCAibm9yIj47DQorDQorLy8vIFNoaWZ0IEluc3RydWN0aW9ucw0KK2RlZiBTTEwgICAgIDogTG9naWNSX3NoaWZ0X2ltbTwweDAwLCAic2xsIiwgc2hsPjsNCitkZWYgU1JMICAgICA6IExvZ2ljUl9zaGlmdF9pbW08MHgwMiwgInNybCIsIHNybD47DQorZGVmIFNSQSAgICAgOiBMb2dpY1Jfc2hpZnRfaW1tPDB4MDMsICJzcmEiLCBzcmE+Ow0KK2RlZiBTTExWICAgIDogTG9naWNSX3NoaWZ0X3JlZzwweDA0LCAic2xsdiIsIHNobD47DQorZGVmIFNSTFYgICAgOiBMb2dpY1Jfc2hpZnRfcmVnPDB4MDYsICJzcmx2Iiwgc3JsPjsNCitkZWYgU1JBViAgICA6IExvZ2ljUl9zaGlmdF9yZWc8MHgwNywgInNyYXYiLCBzcmE+Ow0KKw0KKy8vLyBMb2FkIGFuZCBTdG9yZSBJbnN0cnVjdGlvbnMNCitkZWYgTEIgICAgICA6IExvYWRNPDB4MjAsICJsYiIsICBzZXh0bG9hZGk4PjsNCitkZWYgTEJ1ICAgICA6IExvYWRNPDB4MjQsICJsYnUiLCB6ZXh0bG9hZGk4PjsNCitkZWYgTEggICAgICA6IExvYWRNPDB4MjEsICJsaCIsICBzZXh0bG9hZGkxNj47DQorZGVmIExIdSAgICAgOiBMb2FkTTwweDI1LCAibGh1IiwgemV4dGxvYWRpMTY+Ow0KK2RlZiBMVyAgICAgIDogTG9hZE08MHgyMywgImx3IiwgIGxvYWQ+Ow0KK2RlZiBTQiAgICAgIDogU3RvcmVNPDB4MjgsICJzYiIsIHRydW5jc3RvcmVpOD47DQorZGVmIFNIICAgICAgOiBTdG9yZU08MHgyOSwgInNoIiwgdHJ1bmNzdG9yZWkxNj47DQorZGVmIFNXICAgICAgOiBTdG9yZU08MHgyYiwgInN3Iiwgc3RvcmU+Ow0KKw0KKy8vLyBKdW1wIGFuZCBCcmFuY2ggSW5zdHJ1Y3Rpb25zDQorZGVmIEogICAgICAgOiBKdW1wRko8MHgwMiwgImoiPjsNCitkZWYgSlIgICAgICA6IEp1bXBGUjwweDAwLCAweDA4LCAianIiPjsNCitkZWYgSkFMICAgICA6IEp1bXBMaW5rPDB4MDMsICJqYWwiPjsNCitkZWYgSkFMUiAgICA6IEp1bXBMaW5rUmVnPDB4MDAsIDB4MDksICJqYWxyIj47DQorZGVmIEJFUSAgICAgOiBDQnJhbmNoPDB4MDQsICJiZXEiLCBzZXRlcT47DQorZGVmIEJORSAgICAgOiBDQnJhbmNoPDB4MDUsICJibmUiLCBzZXRuZT47DQorDQorbGV0IHJ0PTEgaW4NCisgIGRlZiBCR0VaICA6IENCcmFuY2haZXJvPDB4MDEsICJiZ2V6Iiwgc2V0Z2U+Ow0KKw0KK2xldCBydD0wIGluIHsNCisgIGRlZiBCR1RaICA6IENCcmFuY2haZXJvPDB4MDcsICJiZ3R6Iiwgc2V0Z3Q+Ow0KKyAgZGVmIEJMRVogIDogQ0JyYW5jaFplcm88MHgwNywgImJsZXoiLCBzZXRsZT47DQorICBkZWYgQkxUWiAgOiBDQnJhbmNoWmVybzwweDAxLCAiYmx0eiIsIHNldGx0PjsNCit9DQorDQorZGVmIEJHRVpBTCAgOiBCcmFuY2hMaW5rPCJiZ2V6YWwiPjsNCitkZWYgQkxUWkFMICA6IEJyYW5jaExpbms8ImJsdHphbCI+Ow0KKw0KK2xldCBpc1JldHVybj0xLCBpc1Rlcm1pbmF0b3I9MSwgaGFzRGVsYXlTbG90PTEsDQorICAgIGlzQmFycmllcj0xLCBoYXNDdHJsRGVwPTEsIHJzPTAsIHJ0PTAsIHNoYW10PTAgaW4NCisgIGRlZiBSRVQgOiBGUiA8MHgwMCwgMHgwMiwgKG91dHMpLCAoaW5zIENQVVJlZ3M6JHRhcmdldCksDQorICAgICAgICAgICAgICAgICJqclx0JHRhcmdldCIsIFsoTWlwc1JldCBDUFVSZWdzOiR0YXJnZXQpXSwgSUlCcmFuY2g+Ow0KKw0KKy8vLyBNdWx0aXBseSBhbmQgRGl2aWRlIEluc3RydWN0aW9ucy4gDQorbGV0IERlZnMgPSBbSEksIExPXSBpbiB7DQorICBkZWYgTVVMVCAgICA6IE11bERpdjwweDE4LCAibXVsdCIsIElJSW11bD47DQorICBkZWYgTVVMVHUgICA6IE11bERpdjwweDE5LCAibXVsdHUiLCBJSUltdWw+Ow0KKyAgZGVmIERJViAgICAgOiBNdWxEaXY8MHgxYSwgImRpdiIsIElJSWRpdj47DQorICBkZWYgRElWdSAgICA6IE11bERpdjwweDFiLCAiZGl2dSIsIElJSWRpdj47DQorfQ0KKw0KK2xldCBEZWZzID0gW0hJXSBpbg0KKyAgZGVmIE1USEkgIDogTW92ZVRvTE9ISTwweDExLCAibXRoaSI+Ow0KK2xldCBEZWZzID0gW0xPXSBpbg0KKyAgZGVmIE1UTE8gIDogTW92ZVRvTE9ISTwweDEzLCAibXRsbyI+Ow0KKw0KK2xldCBVc2VzID0gW0hJXSBpbg0KKyAgZGVmIE1GSEkgIDogTW92ZUZyb21MT0hJPDB4MTAsICJtZmhpIj47DQorbGV0IFVzZXMgPSBbTE9dIGluDQorICBkZWYgTUZMTyAgOiBNb3ZlRnJvbUxPSEk8MHgxMiwgIm1mbG8iPjsNCisNCisvLy8gU2lnbiBFeHQgSW4gUmVnaXN0ZXIgSW5zdHJ1Y3Rpb25zLg0KK2xldCBQcmVkaWNhdGVzID0gW0hhc1NFSW5SZWddIGluIHsNCisgIGxldCBzaGFtdCA9IDB4MTAsIHJzID0gMCBpbg0KKyAgICBkZWYgU0VCIDogU2lnbkV4dEluUmVnPDB4MjEsICJzZWIiLCBpOD47DQorDQorICBsZXQgc2hhbXQgPSAweDE4LCBycyA9IDAgaW4NCisgICAgZGVmIFNFSCA6IFNpZ25FeHRJblJlZzwweDIwLCAic2VoIiwgaTE2PjsNCit9DQorDQorLy8vIENvdW50IExlYWRpbmcNCitsZXQgUHJlZGljYXRlcyA9IFtIYXNCaXRDb3VudF0gaW4gew0KKyAgbGV0IHJ0ID0gMCBpbg0KKyAgICBkZWYgQ0xaIDogQ291bnRMZWFkaW5nPDBiMDEwMTEwLCAiY2x6IiwgY3Rsej47DQorfQ0KKw0KKy8vLyBCeXRlIFN3YXANCitsZXQgUHJlZGljYXRlcyA9IFtIYXNTd2FwXSBpbiB7DQorICBsZXQgc2hhbXQgPSAweDMsIHJzID0gMCBpbg0KKyAgICBkZWYgV1NCVyA6IEJ5dGVTd2FwPDB4MjAsICJ3c2J3Ij47DQorfQ0KKw0KKy8vLyBDb25kaXRpb25hbCBNb3ZlDQorZGVmIE1JUFNfQ01PVl9aRVJPICA6IFBhdExlYWY8KGkzMiAwKT47DQorZGVmIE1JUFNfQ01PVl9OWkVSTyA6IFBhdExlYWY8KGkzMiAxKT47DQorDQorbGV0IFByZWRpY2F0ZXMgPSBbSGFzQ29uZE1vdl0sIENvbnN0cmFpbnRzID0gIiRGID0gJGRzdCIgaW4gew0KKyAgZGVmIE1PVk4gOiBDb25kTW92PDB4MGEsICJtb3ZuIiwgTUlQU19DTU9WX05aRVJPPjsNCisgIGRlZiBNT1ZaIDogQ29uZE1vdjwweDBiLCAibW92eiIsIE1JUFNfQ01PVl9aRVJPPjsNCit9DQorDQorLy8vIE5vIG9wZXJhdGlvbg0KK2xldCBhZGRyPTAgaW4NCisgIGRlZiBOT1AgICA6IEZKPDAsIChvdXRzKSwgKGlucyksICJub3AiLCBbXSwgSUlBbHU+Ow0KKw0KKy8vIEZyYW1lSW5kZXhlcyBhcmUgbGVnYWxpemVkIHdoZW4gdGhleSBhcmUgb3BlcmFuZHMgZnJvbSBsb2FkL3N0b3JlDQorLy8gaW5zdHJ1Y3Rpb25zLiBUaGUgc2FtZSBub3QgaGFwcGVucyBmb3Igc3RhY2sgYWRkcmVzcyBjb3BpZXMsIHNvIGFuDQorLy8gYWRkIG9wIHdpdGggbWVtIENvbXBsZXhQYXR0ZXJuIGlzIHVzZWQgYW5kIHRoZSBzdGFjayBhZGRyZXNzIGNvcHkNCisvLyBjYW4gYmUgbWF0Y2hlZC4gSXQncyBzaW1pbGFyIHRvIFNwYXJjIExFQV9BRERSaQ0KK2RlZiBMRUFfQUREaXUgOiBFZmZlY3RpdmVBZGRyZXNzPCJhZGRpdVx0JGRzdCwgJHthZGRyOnN0YWNrbG9jfSI+Ow0KKw0KKy8vIE1BREQqL01TVUIqIGFyZSBub3QgcGFydCBvZiBNaXBzSSBlaXRoZXIuDQorLy9kZWYgTUFERCAgICA6IE1Bcml0aFI8MHgwMCwgIm1hZGQiPjsNCisvL2RlZiBNQUREVSAgIDogTUFyaXRoUjwweDAxLCAibWFkZHUiPjsNCisvL2RlZiBNU1VCICAgIDogTUFyaXRoUjwweDA0LCAibXN1YiI+Ow0KKy8vZGVmIE1TVUJVICAgOiBNQXJpdGhSPDB4MDUsICJtc3VidSI+Ow0KKw0KKy8vIE1VTCBpcyBhIGFzc2VtYmx5IG1hY3JvIGluIHRoZSBjdXJyZW50IHVzZWQgSVNBcy4gSW4gcmVjZW50IElTQSdzDQorLy8gaXQgaXMgYSByZWFsIGluc3RydWN0aW9uLg0KKy8vZGVmIE1VTCAgIDogQXJpdGhSPDB4MWMsIDB4MDIsICJtdWwiLCBtdWwsIElJSW11bD47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgQXJiaXRyYXJ5IHBhdHRlcm5zIHRoYXQgbWFwIHRvIG9uZSBvciBtb3JlIGluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gU21hbGwgaW1tZWRpYXRlcw0KK2RlZiA6IFBhdDwoaTMyIGltbVNFeHQxNjokaW4pLA0KKyAgICAgICAgICAoQUREaXUgWkVSTywgaW1tOiRpbik+Ow0KK2RlZiA6IFBhdDwoaTMyIGltbVpFeHQxNjokaW4pLA0KKyAgICAgICAgICAoT1JpIFpFUk8sIGltbTokaW4pPjsNCisNCisvLyBBcmJpdHJhcnkgaW1tZWRpYXRlcw0KK2RlZiA6IFBhdDwoaTMyIGltbTokaW1tKSwNCisgICAgICAgICAgKE9SaSAoTFVpIChISTE2IGltbTokaW1tKSksIChMTzE2IGltbTokaW1tKSk+Ow0KKw0KKy8vIENhcnJ5IHBhdHRlcm5zDQorZGVmIDogUGF0PChzdWJjIENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSwNCisgICAgICAgICAgKFNVQnUgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpPjsNCitkZWYgOiBQYXQ8KGFkZGMgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpLA0KKyAgICAgICAgICAoQUREdSBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyk+Ow0KK2RlZiA6IFBhdDwoYWRkYyAgQ1BVUmVnczokc3JjLCBpbW06JGltbSksDQorICAgICAgICAgIChBRERpdSBDUFVSZWdzOiRzcmMsIGltbTokaW1tKT47DQorDQorLy8gQ2FsbA0KK2RlZiA6IFBhdDwoTWlwc0ptcExpbmsgKGkzMiB0Z2xvYmFsYWRkcjokZHN0KSksDQorICAgICAgICAgIChKQUwgdGdsb2JhbGFkZHI6JGRzdCk+Ow0KK2RlZiA6IFBhdDwoTWlwc0ptcExpbmsgKGkzMiB0ZXh0ZXJuYWxzeW06JGRzdCkpLA0KKyAgICAgICAgICAoSkFMIHRleHRlcm5hbHN5bTokZHN0KT47DQorLy9kZWYgOiBQYXQ8KE1pcHNKbXBMaW5rIENQVVJlZ3M6JGRzdCksDQorLy8gICAgICAgICAgKEpBTFIgQ1BVUmVnczokZHN0KT47DQorDQorLy8gaGkvbG8gcmVsb2NzDQorZGVmIDogUGF0PChNaXBzSGkgdGdsb2JhbGFkZHI6JGluKSwgKExVaSB0Z2xvYmFsYWRkcjokaW4pPjsNCitkZWYgOiBQYXQ8KGFkZCBDUFVSZWdzOiRoaSwgKE1pcHNMbyB0Z2xvYmFsYWRkcjokbG8pKSwNCisgICAgICAgICAgKEFERGl1IENQVVJlZ3M6JGhpLCB0Z2xvYmFsYWRkcjokbG8pPjsNCisNCitkZWYgOiBQYXQ8KE1pcHNIaSB0anVtcHRhYmxlOiRpbiksIChMVWkgdGp1bXB0YWJsZTokaW4pPjsNCitkZWYgOiBQYXQ8KGFkZCBDUFVSZWdzOiRoaSwgKE1pcHNMbyB0anVtcHRhYmxlOiRsbykpLA0KKyAgICAgICAgICAoQUREaXUgQ1BVUmVnczokaGksIHRqdW1wdGFibGU6JGxvKT47DQorDQorZGVmIDogUGF0PChNaXBzSGkgdGNvbnN0cG9vbDokaW4pLCAoTFVpIHRjb25zdHBvb2w6JGluKT47DQorZGVmIDogUGF0PChhZGQgQ1BVUmVnczokaGksIChNaXBzTG8gdGNvbnN0cG9vbDokbG8pKSwNCisgICAgICAgICAgKEFERGl1IENQVVJlZ3M6JGhpLCB0Y29uc3Rwb29sOiRsbyk+Ow0KKw0KKy8vIGdwX3JlbCByZWxvY3MNCitkZWYgOiBQYXQ8KGFkZCBDUFVSZWdzOiRncCwgKE1pcHNHUFJlbCB0Z2xvYmFsYWRkcjokaW4pKSwgDQorICAgICAgICAgIChBRERpdSBDUFVSZWdzOiRncCwgdGdsb2JhbGFkZHI6JGluKT47DQorZGVmIDogUGF0PChhZGQgQ1BVUmVnczokZ3AsIChNaXBzR1BSZWwgdGNvbnN0cG9vbDokaW4pKSwgDQorICAgICAgICAgIChBRERpdSBDUFVSZWdzOiRncCwgdGNvbnN0cG9vbDokaW4pPjsNCisNCisvLyBNaXBzIGRvZXMgbm90IGhhdmUgIm5vdCIsIHNvIHdlIGV4cGFuZCBvdXIgd2F5DQorZGVmIDogUGF0PChub3QgQ1BVUmVnczokaW4pLA0KKyAgICAgICAgICAoTk9SIENQVVJlZ3M6JGluLCBaRVJPKT47DQorDQorLy8gZXh0ZW5kZWQgbG9hZCBhbmQgc3RvcmVzDQorZGVmIDogUGF0PChleHRsb2FkaTEgIGFkZHI6JHNyYyksIChMQnUgYWRkcjokc3JjKT47DQorZGVmIDogUGF0PChleHRsb2FkaTggIGFkZHI6JHNyYyksIChMQnUgYWRkcjokc3JjKT47DQorZGVmIDogUGF0PChleHRsb2FkaTE2IGFkZHI6JHNyYyksIChMSHUgYWRkcjokc3JjKT47DQorDQorLy8gcGVlcGhvbGVzDQorZGVmIDogUGF0PChzdG9yZSAoaTMyIDApLCBhZGRyOiRkc3QpLCAoU1cgWkVSTywgYWRkcjokZHN0KT47DQorDQorLy8gYnJjb25kIHBhdHRlcm5zDQorZGVmIDogUGF0PChicmNvbmQgKHNldG5lIENQVVJlZ3M6JGxocywgMCksIGJiOiRkc3QpLA0KKyAgICAgICAgICAoQk5FIENQVVJlZ3M6JGxocywgWkVSTywgYmI6JGRzdCk+Ow0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXRlcSBDUFVSZWdzOiRsaHMsIDApLCBiYjokZHN0KSwNCisgICAgICAgICAgKEJFUSBDUFVSZWdzOiRsaHMsIFpFUk8sIGJiOiRkc3QpPjsNCisNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0Z2UgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpLCBiYjokZHN0KSwNCisgICAgICAgICAgKEJFUSAoU0xUIENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSwgWkVSTywgYmI6JGRzdCk+Ow0KK2RlZiA6IFBhdDwoYnJjb25kIChzZXR1Z2UgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpLCBiYjokZHN0KSwNCisgICAgICAgICAgKEJFUSAoU0xUdSBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyksIFpFUk8sIGJiOiRkc3QpPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0Z2UgQ1BVUmVnczokbGhzLCBpbW1TRXh0MTY6JHJocyksIGJiOiRkc3QpLA0KKyAgICAgICAgICAoQkVRIChTTFRpIENQVVJlZ3M6JGxocywgaW1tU0V4dDE2OiRyaHMpLCBaRVJPLCBiYjokZHN0KT47DQorZGVmIDogUGF0PChicmNvbmQgKHNldHVnZSBDUFVSZWdzOiRsaHMsIGltbVNFeHQxNjokcmhzKSwgYmI6JGRzdCksDQorICAgICAgICAgIChCRVEgKFNMVGl1IENQVVJlZ3M6JGxocywgaW1tU0V4dDE2OiRyaHMpLCBaRVJPLCBiYjokZHN0KT47DQorDQorZGVmIDogUGF0PChicmNvbmQgKHNldGxlIENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSwgYmI6JGRzdCksDQorICAgICAgICAgIChCRVEgKFNMVCBDUFVSZWdzOiRyaHMsIENQVVJlZ3M6JGxocyksIFpFUk8sIGJiOiRkc3QpPjsNCitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dWxlIENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSwgYmI6JGRzdCksDQorICAgICAgICAgIChCRVEgKFNMVHUgQ1BVUmVnczokcmhzLCBDUFVSZWdzOiRsaHMpLCBaRVJPLCBiYjokZHN0KT47DQorDQorZGVmIDogUGF0PChicmNvbmQgQ1BVUmVnczokY29uZCwgYmI6JGRzdCksDQorICAgICAgICAgIChCTkUgQ1BVUmVnczokY29uZCwgWkVSTywgYmI6JGRzdCk+Ow0KKw0KKy8vIHNlbGVjdCBwYXR0ZXJucw0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRnZSBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyksIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYpLA0KKyAgICAgICAgICAoTU9WWiBDUFVSZWdzOiRGLCBDUFVSZWdzOiRULCAoU0xUIENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXR1Z2UgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpLCBDUFVSZWdzOiRULCBDUFVSZWdzOiRGKSwNCisgICAgICAgICAgKE1PVlogQ1BVUmVnczokRiwgQ1BVUmVnczokVCwgKFNMVHUgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpKT47DQorZGVmIDogUGF0PChzZWxlY3QgKHNldGdlIENQVVJlZ3M6JGxocywgaW1tU0V4dDE2OiRyaHMpLCBDUFVSZWdzOiRULCBDUFVSZWdzOiRGKSwNCisgICAgICAgICAgKE1PVlogQ1BVUmVnczokRiwgQ1BVUmVnczokVCwgKFNMVGkgQ1BVUmVnczokbGhzLCBpbW1TRXh0MTY6JHJocykpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0dWdlIENQVVJlZ3M6JGxoLCBpbW1TRXh0MTY6JHJoKSwgQ1BVUmVnczokVCwgQ1BVUmVnczokRiksDQorICAgICAgICAgIChNT1ZaIENQVVJlZ3M6JEYsIENQVVJlZ3M6JFQsIChTTFRpdSBDUFVSZWdzOiRsaCwgaW1tU0V4dDE2OiRyaCkpPjsNCisNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0bGUgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpLCBDUFVSZWdzOiRULCBDUFVSZWdzOiRGKSwNCisgICAgICAgICAgKE1PVlogQ1BVUmVnczokRiwgQ1BVUmVnczokVCwgKFNMVCBDUFVSZWdzOiRyaHMsIENQVVJlZ3M6JGxocykpPjsNCitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0dWxlIENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSwgQ1BVUmVnczokVCwgQ1BVUmVnczokRiksDQorICAgICAgICAgIChNT1ZaIENQVVJlZ3M6JEYsIENQVVJlZ3M6JFQsIChTTFR1IENQVVJlZ3M6JHJocywgQ1BVUmVnczokbGhzKSk+Ow0KKw0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRlcSBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyksIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYpLA0KKyAgICAgICAgICAoTU9WWiBDUFVSZWdzOiRGLCBDUFVSZWdzOiRULCAoWE9SIENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSk+Ow0KK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRuZSBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyksIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYpLA0KKyAgICAgICAgICAoTU9WTiBDUFVSZWdzOiRGLCBDUFVSZWdzOiRULCAoWE9SIENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSk+Ow0KKw0KK2RlZiA6IFBhdDwoc2VsZWN0IENQVVJlZ3M6JGNvbmQsIENQVVJlZ3M6JFQsIENQVVJlZ3M6JEYpLCANCisgICAgICAgICAgKE1PVk4gQ1BVUmVnczokRiwgQ1BVUmVnczokVCwgQ1BVUmVnczokY29uZCk+Ow0KKw0KKy8vIHNldGNjIHBhdHRlcm5zDQorZGVmIDogUGF0PChzZXRlcSBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyksDQorICAgICAgICAgIChTTFR1IChYT1IgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpLCAxKT47DQorZGVmIDogUGF0PChzZXRuZSBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyksDQorICAgICAgICAgIChTTFR1IFpFUk8sIChYT1IgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpKT47DQorDQorZGVmIDogUGF0PChzZXRsZSBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyksDQorICAgICAgICAgIChYT1JpIChTTFQgQ1BVUmVnczokcmhzLCBDUFVSZWdzOiRsaHMpLCAxKT47DQorZGVmIDogUGF0PChzZXR1bGUgQ1BVUmVnczokbGhzLCBDUFVSZWdzOiRyaHMpLA0KKyAgICAgICAgICAoWE9SaSAoU0xUdSBDUFVSZWdzOiRyaHMsIENQVVJlZ3M6JGxocyksIDEpPjsNCisNCitkZWYgOiBQYXQ8KHNldGd0IENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSwNCisgICAgICAgICAgKFNMVCBDUFVSZWdzOiRyaHMsIENQVVJlZ3M6JGxocyk+Ow0KK2RlZiA6IFBhdDwoc2V0dWd0IENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSwNCisgICAgICAgICAgKFNMVHUgQ1BVUmVnczokcmhzLCBDUFVSZWdzOiRsaHMpPjsNCisNCitkZWYgOiBQYXQ8KHNldGdlIENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSwNCisgICAgICAgICAgKFhPUmkgKFNMVCBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyksIDEpPjsNCitkZWYgOiBQYXQ8KHNldHVnZSBDUFVSZWdzOiRsaHMsIENQVVJlZ3M6JHJocyksDQorICAgICAgICAgIChYT1JpIChTTFR1IENQVVJlZ3M6JGxocywgQ1BVUmVnczokcmhzKSwgMSk+Ow0KKw0KK2RlZiA6IFBhdDwoc2V0Z2UgQ1BVUmVnczokbGhzLCBpbW1TRXh0MTY6JHJocyksDQorICAgICAgICAgIChYT1JpIChTTFRpIENQVVJlZ3M6JGxocywgaW1tU0V4dDE2OiRyaHMpLCAxKT47DQorZGVmIDogUGF0PChzZXR1Z2UgQ1BVUmVnczokbGhzLCBpbW1TRXh0MTY6JHJocyksDQorICAgICAgICAgIChYT1JpIChTTFRpdSBDUFVSZWdzOiRsaHMsIGltbVNFeHQxNjokcmhzKSwgMSk+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRmxvYXRpbmcgUG9pbnQgU3VwcG9ydA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQoraW5jbHVkZSAiTWlwc0luc3RyRlBVLnRkIg0KKw0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzTUNBc21JbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzTUNBc21JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQ4YWI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNNQ0FzbUluZm8uY3BwCkBAIC0wLDAgKzEsMjcgQEAKKy8vPT09LS0gTWlwc01DQXNtSW5mby5jcHAgLSBNaXBzIGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2YgdGhlIE1pcHNNQ0FzbUluZm8gcHJvcGVydGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiTWlwc01DQXNtSW5mby5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK01pcHNNQ0FzbUluZm86Ok1pcHNNQ0FzbUluZm8oY29uc3QgVGFyZ2V0ICZULCBTdHJpbmdSZWYgVFQpIHsKKyAgQWxpZ25tZW50SXNJbkJ5dGVzICAgICAgICAgID0gZmFsc2U7CisgIERhdGExNmJpdHNEaXJlY3RpdmUgICAgICAgICA9ICJcdC5oYWxmXHQiOworICBEYXRhMzJiaXRzRGlyZWN0aXZlICAgICAgICAgPSAiXHQud29yZFx0IjsKKyAgRGF0YTY0Yml0c0RpcmVjdGl2ZSAgICAgICAgID0gMDsKKyAgUHJpdmF0ZUdsb2JhbFByZWZpeCAgICAgICAgID0gIiQiOworICBDb21tZW50U3RyaW5nICAgICAgICAgICAgICAgPSAiIyI7CisgIFplcm9EaXJlY3RpdmUgICAgICAgICAgICAgICA9ICJcdC5zcGFjZVx0IjsKKyAgR1BSZWwzMkRpcmVjdGl2ZSAgICAgICAgICAgID0gIlx0Lmdwd29yZFx0IjsKKyAgSGFzU2V0RGlyZWN0aXZlICAgICAgICAgICAgID0gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc01DQXNtSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNNQ0FzbUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE4NjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNNQ0FzbUluZm8uaApAQCAtMCwwICsxLDMwIEBACisvLz09PT09LS0gTWlwc01DQXNtSW5mby5oIC0gTWlwcyBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1pcHNNQ0FzbUluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBNSVBTVEFSR0VUQVNNSU5GT19ICisjZGVmaW5lIE1JUFNUQVJHRVRBU01JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgVGFyZ2V0OworICAKKyAgY2xhc3MgTWlwc01DQXNtSW5mbyA6IHB1YmxpYyBNQ0FzbUluZm8geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgTWlwc01DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCk7CisgIH07CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc01hY2hpbmVGdW5jdGlvbi5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNNYWNoaW5lRnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzIzZjllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNNYWNoaW5lRnVuY3Rpb24uaApAQCAtMCwwICsxLDE0NyBAQAorLy89PT0tLSBNaXBzTWFjaGluZUZ1bmN0aW9uSW5mby5oIC0gUHJpdmF0ZSBkYXRhIHVzZWQgZm9yIE1pcHMgLS0tLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1pcHMgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgTWFjaGluZUZ1bmN0aW9uSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE1JUFNfTUFDSElORV9GVU5DVElPTl9JTkZPX0gKKyNkZWZpbmUgTUlQU19NQUNISU5FX0ZVTkNUSU9OX0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9WZWN0b3JFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gTWlwc0Z1bmN0aW9uSW5mbyAtIFRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIE1hY2hpbmVGdW5jdGlvbiBwcml2YXRlCisvLy8gTWlwcyB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGVhY2ggTWFjaGluZUZ1bmN0aW9uLgorY2xhc3MgTWlwc0Z1bmN0aW9uSW5mbyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25JbmZvIHsKKworcHJpdmF0ZToKKyAgLy8vIEhvbGRzIGZvciBlYWNoIGZ1bmN0aW9uIHdoZXJlIG9uIHRoZSBzdGFjayB0aGUgRnJhbWUgUG9pbnRlciBtdXN0IGJlIAorICAvLy8gc2F2ZWQuIFRoaXMgaXMgdXNlZCBvbiBQcm9sb2d1ZSBhbmQgRXBpbG9ndWUgdG8gZW1pdCBGUCBzYXZlL3Jlc3RvcmUKKyAgaW50IEZQU3RhY2tPZmZzZXQ7CisKKyAgLy8vIEhvbGRzIGZvciBlYWNoIGZ1bmN0aW9uIHdoZXJlIG9uIHRoZSBzdGFjayB0aGUgUmV0dXJuIEFkZHJlc3MgbXVzdCBiZSAKKyAgLy8vIHNhdmVkLiBUaGlzIGlzIHVzZWQgb24gUHJvbG9ndWUgYW5kIEVwaWxvZ3VlIHRvIGVtaXQgUkEgc2F2ZS9yZXN0b3JlCisgIGludCBSQVN0YWNrT2Zmc2V0OworCisgIC8vLyBBdCBlYWNoIGZ1bmN0aW9uIGVudHJ5LCB0d28gc3BlY2lhbCBiaXRtYXNrIGRpcmVjdGl2ZXMgbXVzdCBiZSBlbWl0dGVkCisgIC8vLyB0byBoZWxwIGRlYnVnZ2luZywgZm9yIENQVSBhbmQgRlBVIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMuIEJvdGggbmVlZAorICAvLy8gdGhlIG5lZ2F0aXZlIG9mZnNldCBmcm9tIHRoZSBmaW5hbCBzdGFjayBzaXplIGFuZCBpdHMgaGlnaGVyIHJlZ2lzdGVycworICAvLy8gbG9jYXRpb24gb24gdGhlIHN0YWNrLgorICBpbnQgQ1BVVG9wU2F2ZWRSZWdPZmY7CisgIGludCBGUFVUb3BTYXZlZFJlZ09mZjsKKworICAvLy8gTWlwc0ZJSG9sZGVyIC0gSG9sZHMgYSBGcmFtZUluZGV4IGFuZCBpdCdzIFN0YWNrIFBvaW50ZXIgT2Zmc2V0CisgIHN0cnVjdCBNaXBzRklIb2xkZXIgeworCisgICAgaW50IEZJOworICAgIGludCBTUE9mZnNldDsKKworICAgIE1pcHNGSUhvbGRlcihpbnQgRnJhbWVJbmRleCwgaW50IFN0YWNrUG9pbnRlck9mZnNldCkKKyAgICAgIDogRkkoRnJhbWVJbmRleCksIFNQT2Zmc2V0KFN0YWNrUG9pbnRlck9mZnNldCkge30KKyAgfTsKKworICAvLy8gV2hlbiBQSUMgaXMgdXNlZCB0aGUgR1AgbXVzdCBiZSBzYXZlZCBvbiB0aGUgc3RhY2sgb24gdGhlIGZ1bmN0aW9uIAorICAvLy8gcHJvbG9ndWUgYW5kIG11c3QgYmUgcmVsb2FkZWQgZnJvbSB0aGlzIHN0YWNrIGxvY2F0aW9uIGFmdGVyIGV2ZXJ5IAorICAvLy8gY2FsbC4gQSByZWZlcmVuY2UgdG8gaXRzIHN0YWNrIGxvY2F0aW9uIGFuZCBmcmFtZSBpbmRleCBtdXN0IGJlIGtlcHQgCisgIC8vLyB0byBiZSB1c2VkIG9uIGVtaXRQcm9sb2d1ZSBhbmQgcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlRnJhbWVGaW5hbGl6ZWQuCisgIE1pcHNGSUhvbGRlciBHUEhvbGRlcjsKKworICAvLy8gT24gTG93ZXJGb3JtYWxBcmd1bWVudHMgdGhlIHN0YWNrIHNpemUgaXMgdW5rbm93biwgc28gdGhlIFN0YWNrCisgIC8vLyBQb2ludGVyIE9mZnNldCBjYWxjdWxhdGlvbiBvZiAibm90IGluIHJlZ2lzdGVyIGFyZ3VtZW50cyIgbXVzdCBiZSAKKyAgLy8vIHBvc3Rwb25lZCB0byBlbWl0UHJvbG9ndWUuIAorICBTbWFsbFZlY3RvcjxNaXBzRklIb2xkZXIsIDE2PiBGbkxvYWRBcmdzOworICBib29sIEhhc0xvYWRBcmdzOworCisgIC8vIFdoZW4gVmFyQXJncywgd2UgbXVzdCB3cml0ZSByZWdpc3RlcnMgYmFjayB0byBjYWxsZXIgc3RhY2ssIHByZXNlcnZpbmcgCisgIC8vIG9uIHJlZ2lzdGVyIGFyZ3VtZW50cy4gU2luY2UgdGhlIHN0YWNrIHNpemUgaXMgdW5rbm93biBvbiAKKyAgLy8gTG93ZXJGb3JtYWxBcmd1bWVudHMsIHRoZSBTdGFjayBQb2ludGVyIE9mZnNldCBjYWxjdWxhdGlvbiBtdXN0IGJlCisgIC8vIHBvc3Rwb25lZCB0byBlbWl0UHJvbG9ndWUuIAorICBTbWFsbFZlY3RvcjxNaXBzRklIb2xkZXIsIDQ+IEZuU3RvcmVWYXJBcmdzOworICBib29sIEhhc1N0b3JlVmFyQXJnczsKKworICAvLy8gU1JldFJldHVyblJlZyAtIFNvbWUgc3VidGFyZ2V0cyByZXF1aXJlIHRoYXQgc3JldCBsb3dlcmluZyBpbmNsdWRlcworICAvLy8gcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuZWQgc3RydWN0IGluIGEgcmVnaXN0ZXIuIFRoaXMgZmllbGQKKyAgLy8vIGhvbGRzIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGludG8gd2hpY2ggdGhlIHNyZXQgYXJndW1lbnQgaXMgcGFzc2VkLgorICB1bnNpZ25lZCBTUmV0UmV0dXJuUmVnOworCisgIC8vLyBHbG9iYWxCYXNlUmVnIC0ga2VlcHMgdHJhY2sgb2YgdGhlIHZpcnR1YWwgcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgZm9yCisgIC8vLyB1c2UgYXMgdGhlIGdsb2JhbCBiYXNlIHJlZ2lzdGVyLiBUaGlzIGlzIHVzZWQgZm9yIFBJQyBpbiBzb21lIFBJQworICAvLy8gcmVsb2NhdGlvbiBtb2RlbHMuCisgIHVuc2lnbmVkIEdsb2JhbEJhc2VSZWc7CisKKyAgLy8vIFZhckFyZ3NGcmFtZUluZGV4IC0gRnJhbWVJbmRleCBmb3Igc3RhcnQgb2YgdmFyYXJncyBhcmVhLgorICBpbnQgVmFyQXJnc0ZyYW1lSW5kZXg7CisKK3B1YmxpYzoKKyAgTWlwc0Z1bmN0aW9uSW5mbyhNYWNoaW5lRnVuY3Rpb24mIE1GKSAKKyAgOiBGUFN0YWNrT2Zmc2V0KDApLCBSQVN0YWNrT2Zmc2V0KDApLCBDUFVUb3BTYXZlZFJlZ09mZigwKSwgCisgICAgRlBVVG9wU2F2ZWRSZWdPZmYoMCksIEdQSG9sZGVyKC0xLC0xKSwgSGFzTG9hZEFyZ3MoZmFsc2UpLCAKKyAgICBIYXNTdG9yZVZhckFyZ3MoZmFsc2UpLCBTUmV0UmV0dXJuUmVnKDApLCBHbG9iYWxCYXNlUmVnKDApLAorICAgIFZhckFyZ3NGcmFtZUluZGV4KDApCisgIHt9CisKKyAgaW50IGdldEZQU3RhY2tPZmZzZXQoKSBjb25zdCB7IHJldHVybiBGUFN0YWNrT2Zmc2V0OyB9CisgIHZvaWQgc2V0RlBTdGFja09mZnNldChpbnQgT2ZmKSB7IEZQU3RhY2tPZmZzZXQgPSBPZmY7IH0KKworICBpbnQgZ2V0UkFTdGFja09mZnNldCgpIGNvbnN0IHsgcmV0dXJuIFJBU3RhY2tPZmZzZXQ7IH0KKyAgdm9pZCBzZXRSQVN0YWNrT2Zmc2V0KGludCBPZmYpIHsgUkFTdGFja09mZnNldCA9IE9mZjsgfQorCisgIGludCBnZXRDUFVUb3BTYXZlZFJlZ09mZigpIGNvbnN0IHsgcmV0dXJuIENQVVRvcFNhdmVkUmVnT2ZmOyB9CisgIHZvaWQgc2V0Q1BVVG9wU2F2ZWRSZWdPZmYoaW50IE9mZikgeyBDUFVUb3BTYXZlZFJlZ09mZiA9IE9mZjsgfQorCisgIGludCBnZXRGUFVUb3BTYXZlZFJlZ09mZigpIGNvbnN0IHsgcmV0dXJuIEZQVVRvcFNhdmVkUmVnT2ZmOyB9CisgIHZvaWQgc2V0RlBVVG9wU2F2ZWRSZWdPZmYoaW50IE9mZikgeyBGUFVUb3BTYXZlZFJlZ09mZiA9IE9mZjsgfQorCisgIGludCBnZXRHUFN0YWNrT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gR1BIb2xkZXIuU1BPZmZzZXQ7IH0KKyAgaW50IGdldEdQRkkoKSBjb25zdCB7IHJldHVybiBHUEhvbGRlci5GSTsgfQorICB2b2lkIHNldEdQU3RhY2tPZmZzZXQoaW50IE9mZikgeyBHUEhvbGRlci5TUE9mZnNldCA9IE9mZjsgfQorICB2b2lkIHNldEdQRkkoaW50IEZJKSB7IEdQSG9sZGVyLkZJID0gRkk7IH0KKyAgYm9vbCBuZWVkR1BTYXZlUmVzdG9yZSgpIGNvbnN0IHsgcmV0dXJuIEdQSG9sZGVyLlNQT2Zmc2V0ICE9IC0xOyB9CisKKyAgYm9vbCBoYXNMb2FkQXJncygpIGNvbnN0IHsgcmV0dXJuIEhhc0xvYWRBcmdzOyB9CisgIGJvb2wgaGFzU3RvcmVWYXJBcmdzKCkgY29uc3QgeyByZXR1cm4gSGFzU3RvcmVWYXJBcmdzOyB9IAorCisgIHZvaWQgcmVjb3JkTG9hZEFyZ3NGSShpbnQgRkksIGludCBTUE9mZnNldCkgeworICAgIGlmICghSGFzTG9hZEFyZ3MpIEhhc0xvYWRBcmdzPXRydWU7CisgICAgRm5Mb2FkQXJncy5wdXNoX2JhY2soTWlwc0ZJSG9sZGVyKEZJLCBTUE9mZnNldCkpOworICB9CisgIHZvaWQgcmVjb3JkU3RvcmVWYXJBcmdzRkkoaW50IEZJLCBpbnQgU1BPZmZzZXQpIHsKKyAgICBpZiAoIUhhc1N0b3JlVmFyQXJncykgSGFzU3RvcmVWYXJBcmdzPXRydWU7CisgICAgRm5TdG9yZVZhckFyZ3MucHVzaF9iYWNrKE1pcHNGSUhvbGRlcihGSSwgU1BPZmZzZXQpKTsKKyAgfQorCisgIHZvaWQgYWRqdXN0TG9hZEFyZ3NGSShNYWNoaW5lRnJhbWVJbmZvICpNRkkpIGNvbnN0IHsKKyAgICBpZiAoIWhhc0xvYWRBcmdzKCkpIHJldHVybjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRm5Mb2FkQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKSAKKyAgICAgIE1GSS0+c2V0T2JqZWN0T2Zmc2V0KCBGbkxvYWRBcmdzW2ldLkZJLCBGbkxvYWRBcmdzW2ldLlNQT2Zmc2V0ICk7CisgIH0KKyAgdm9pZCBhZGp1c3RTdG9yZVZhckFyZ3NGSShNYWNoaW5lRnJhbWVJbmZvICpNRkkpIGNvbnN0IHsKKyAgICBpZiAoIWhhc1N0b3JlVmFyQXJncygpKSByZXR1cm47IAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGblN0b3JlVmFyQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKSAKKyAgICAgIE1GSS0+c2V0T2JqZWN0T2Zmc2V0KCBGblN0b3JlVmFyQXJnc1tpXS5GSSwgRm5TdG9yZVZhckFyZ3NbaV0uU1BPZmZzZXQgKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFNSZXRSZXR1cm5SZWcoKSBjb25zdCB7IHJldHVybiBTUmV0UmV0dXJuUmVnOyB9CisgIHZvaWQgc2V0U1JldFJldHVyblJlZyh1bnNpZ25lZCBSZWcpIHsgU1JldFJldHVyblJlZyA9IFJlZzsgfQorCisgIHVuc2lnbmVkIGdldEdsb2JhbEJhc2VSZWcoKSBjb25zdCB7IHJldHVybiBHbG9iYWxCYXNlUmVnOyB9CisgIHZvaWQgc2V0R2xvYmFsQmFzZVJlZyh1bnNpZ25lZCBSZWcpIHsgR2xvYmFsQmFzZVJlZyA9IFJlZzsgfQorCisgIGludCBnZXRWYXJBcmdzRnJhbWVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFZhckFyZ3NGcmFtZUluZGV4OyB9CisgIHZvaWQgc2V0VmFyQXJnc0ZyYW1lSW5kZXgoaW50IEluZGV4KSB7IFZhckFyZ3NGcmFtZUluZGV4ID0gSW5kZXg7IH0KK307CisKK30gLy8gZW5kIG9mIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBNSVBTX01BQ0hJTkVfRlVOQ1RJT05fSU5GT19ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1JlZ2lzdGVySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1JlZ2lzdGVySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1ZjBhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzUmVnaXN0ZXJJbmZvLmNwcApAQCAtMCwwICsxLDUwNCBAQAorLy89PT0tIE1pcHNSZWdpc3RlckluZm8uY3BwIC0gTUlQUyBSZWdpc3RlciBJbmZvcm1hdGlvbiAtPT0gLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE1JUFMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgIm1pcHMtcmVnLWluZm8iCisKKyNpbmNsdWRlICJNaXBzLmgiCisjaW5jbHVkZSAiTWlwc1N1YnRhcmdldC5oIgorI2luY2x1ZGUgIk1pcHNSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJNaXBzTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNaXBzUmVnaXN0ZXJJbmZvOjpNaXBzUmVnaXN0ZXJJbmZvKGNvbnN0IE1pcHNTdWJ0YXJnZXQgJlNULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpCisgIDogTWlwc0dlblJlZ2lzdGVySW5mbyhNaXBzOjpBREpDQUxMU1RBQ0tET1dOLCBNaXBzOjpBREpDQUxMU1RBQ0tVUCksCisgICAgU3VidGFyZ2V0KFNUKSwgVElJKHRpaSkge30KKworLy8vIGdldFJlZ2lzdGVyTnVtYmVyaW5nIC0gR2l2ZW4gdGhlIGVudW0gdmFsdWUgZm9yIHNvbWUgcmVnaXN0ZXIsIGUuZy4KKy8vLyBNaXBzOjpSQSwgcmV0dXJuIHRoZSBudW1iZXIgdGhhdCBpdCBjb3JyZXNwb25kcyB0byAoZS5nLiAzMSkuCit1bnNpZ25lZCBNaXBzUmVnaXN0ZXJJbmZvOjoKK2dldFJlZ2lzdGVyTnVtYmVyaW5nKHVuc2lnbmVkIFJlZ0VudW0pIAoreworICBzd2l0Y2ggKFJlZ0VudW0pIHsKKyAgICBjYXNlIE1pcHM6OlpFUk8gOiBjYXNlIE1pcHM6OkYwIDogY2FzZSBNaXBzOjpEMCA6IHJldHVybiAwOworICAgIGNhc2UgTWlwczo6QVQgICA6IGNhc2UgTWlwczo6RjEgOiByZXR1cm4gMTsKKyAgICBjYXNlIE1pcHM6OlYwICAgOiBjYXNlIE1pcHM6OkYyIDogY2FzZSBNaXBzOjpEMSA6IHJldHVybiAyOworICAgIGNhc2UgTWlwczo6VjEgICA6IGNhc2UgTWlwczo6RjMgOiByZXR1cm4gMzsKKyAgICBjYXNlIE1pcHM6OkEwICAgOiBjYXNlIE1pcHM6OkY0IDogY2FzZSBNaXBzOjpEMiA6IHJldHVybiA0OworICAgIGNhc2UgTWlwczo6QTEgICA6IGNhc2UgTWlwczo6RjUgOiByZXR1cm4gNTsKKyAgICBjYXNlIE1pcHM6OkEyICAgOiBjYXNlIE1pcHM6OkY2IDogY2FzZSBNaXBzOjpEMyA6IHJldHVybiA2OworICAgIGNhc2UgTWlwczo6QTMgICA6IGNhc2UgTWlwczo6RjcgOiByZXR1cm4gNzsKKyAgICBjYXNlIE1pcHM6OlQwICAgOiBjYXNlIE1pcHM6OkY4IDogY2FzZSBNaXBzOjpENCA6IHJldHVybiA4OworICAgIGNhc2UgTWlwczo6VDEgICA6IGNhc2UgTWlwczo6RjkgOiByZXR1cm4gOTsKKyAgICBjYXNlIE1pcHM6OlQyICAgOiBjYXNlIE1pcHM6OkYxMDogY2FzZSBNaXBzOjpENTogcmV0dXJuIDEwOworICAgIGNhc2UgTWlwczo6VDMgICA6IGNhc2UgTWlwczo6RjExOiByZXR1cm4gMTE7CisgICAgY2FzZSBNaXBzOjpUNCAgIDogY2FzZSBNaXBzOjpGMTI6IGNhc2UgTWlwczo6RDY6IHJldHVybiAxMjsKKyAgICBjYXNlIE1pcHM6OlQ1ICAgOiBjYXNlIE1pcHM6OkYxMzogcmV0dXJuIDEzOworICAgIGNhc2UgTWlwczo6VDYgICA6IGNhc2UgTWlwczo6RjE0OiBjYXNlIE1pcHM6OkQ3OiByZXR1cm4gMTQ7CisgICAgY2FzZSBNaXBzOjpUNyAgIDogY2FzZSBNaXBzOjpGMTU6IHJldHVybiAxNTsKKyAgICBjYXNlIE1pcHM6OlQ4ICAgOiBjYXNlIE1pcHM6OkYxNjogY2FzZSBNaXBzOjpEODogcmV0dXJuIDE2OworICAgIGNhc2UgTWlwczo6VDkgICA6IGNhc2UgTWlwczo6RjE3OiByZXR1cm4gMTc7CisgICAgY2FzZSBNaXBzOjpTMCAgIDogY2FzZSBNaXBzOjpGMTg6IGNhc2UgTWlwczo6RDk6IHJldHVybiAxODsKKyAgICBjYXNlIE1pcHM6OlMxICAgOiBjYXNlIE1pcHM6OkYxOTogcmV0dXJuIDE5OworICAgIGNhc2UgTWlwczo6UzIgICA6IGNhc2UgTWlwczo6RjIwOiBjYXNlIE1pcHM6OkQxMDogcmV0dXJuIDIwOworICAgIGNhc2UgTWlwczo6UzMgICA6IGNhc2UgTWlwczo6RjIxOiByZXR1cm4gMjE7CisgICAgY2FzZSBNaXBzOjpTNCAgIDogY2FzZSBNaXBzOjpGMjI6IGNhc2UgTWlwczo6RDExOiByZXR1cm4gMjI7CisgICAgY2FzZSBNaXBzOjpTNSAgIDogY2FzZSBNaXBzOjpGMjM6IHJldHVybiAyMzsKKyAgICBjYXNlIE1pcHM6OlM2ICAgOiBjYXNlIE1pcHM6OkYyNDogY2FzZSBNaXBzOjpEMTI6IHJldHVybiAyNDsKKyAgICBjYXNlIE1pcHM6OlM3ICAgOiBjYXNlIE1pcHM6OkYyNTogcmV0dXJuIDI1OworICAgIGNhc2UgTWlwczo6SzAgICA6IGNhc2UgTWlwczo6RjI2OiBjYXNlIE1pcHM6OkQxMzogcmV0dXJuIDI2OworICAgIGNhc2UgTWlwczo6SzEgICA6IGNhc2UgTWlwczo6RjI3OiByZXR1cm4gMjc7CisgICAgY2FzZSBNaXBzOjpHUCAgIDogY2FzZSBNaXBzOjpGMjg6IGNhc2UgTWlwczo6RDE0OiByZXR1cm4gMjg7CisgICAgY2FzZSBNaXBzOjpTUCAgIDogY2FzZSBNaXBzOjpGMjk6IHJldHVybiAyOTsKKyAgICBjYXNlIE1pcHM6OkZQICAgOiBjYXNlIE1pcHM6OkYzMDogY2FzZSBNaXBzOjpEMTU6IHJldHVybiAzMDsKKyAgICBjYXNlIE1pcHM6OlJBICAgOiBjYXNlIE1pcHM6OkYzMTogcmV0dXJuIDMxOworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gcmVnaXN0ZXIgbnVtYmVyISIpOworICB9ICAgIAorICByZXR1cm4gMDsgLy8gTm90IHJlYWNoZWQKK30KKwordW5zaWduZWQgTWlwc1JlZ2lzdGVySW5mbzo6Z2V0UElDQ2FsbFJlZygpIHsgcmV0dXJuIE1pcHM6OlQ5OyB9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDYWxsZWUgU2F2ZWQgUmVnaXN0ZXJzIG1ldGhvZHMgCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gTWlwcyBDYWxsZWUgU2F2ZWQgUmVnaXN0ZXJzCitjb25zdCB1bnNpZ25lZCogTWlwc1JlZ2lzdGVySW5mbzo6CitnZXRDYWxsZWVTYXZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRikgY29uc3QgCit7CisgIC8vIE1pcHMgY2FsbGVlLXNhdmUgcmVnaXN0ZXIgcmFuZ2UgaXMgJDE2LSQyMywgJGYyMC0kZjMwCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTaW5nbGVGbG9hdE9ubHlDYWxsZWVTYXZlZFJlZ3NbXSA9IHsKKyAgICBNaXBzOjpTMCwgTWlwczo6UzEsIE1pcHM6OlMyLCBNaXBzOjpTMywgCisgICAgTWlwczo6UzQsIE1pcHM6OlM1LCBNaXBzOjpTNiwgTWlwczo6UzcsCisgICAgTWlwczo6RjIwLCBNaXBzOjpGMjEsIE1pcHM6OkYyMiwgTWlwczo6RjIzLCBNaXBzOjpGMjQsIE1pcHM6OkYyNSwgCisgICAgTWlwczo6RjI2LCBNaXBzOjpGMjcsIE1pcHM6OkYyOCwgTWlwczo6RjI5LCBNaXBzOjpGMzAsIDAKKyAgfTsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQml0TW9kZTMyQ2FsbGVlU2F2ZWRSZWdzW10gPSB7CisgICAgTWlwczo6UzAsIE1pcHM6OlMxLCBNaXBzOjpTMiwgTWlwczo6UzMsIAorICAgIE1pcHM6OlM0LCBNaXBzOjpTNSwgTWlwczo6UzYsIE1pcHM6OlM3LAorICAgIE1pcHM6OkYyMCwgTWlwczo6RjIyLCBNaXBzOjpGMjQsIE1pcHM6OkYyNiwgTWlwczo6RjI4LCBNaXBzOjpGMzAsIDAKKyAgfTsKKworICBpZiAoU3VidGFyZ2V0LmlzU2luZ2xlRmxvYXQoKSkKKyAgICByZXR1cm4gU2luZ2xlRmxvYXRPbmx5Q2FsbGVlU2F2ZWRSZWdzOworICBlbHNlCisgICAgcmV0dXJuIEJpdE1vZGUzMkNhbGxlZVNhdmVkUmVnczsKK30KKworQml0VmVjdG9yIE1pcHNSZWdpc3RlckluZm86OgorZ2V0UmVzZXJ2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Cit7CisgIEJpdFZlY3RvciBSZXNlcnZlZChnZXROdW1SZWdzKCkpOworICBSZXNlcnZlZC5zZXQoTWlwczo6WkVSTyk7CisgIFJlc2VydmVkLnNldChNaXBzOjpBVCk7CisgIFJlc2VydmVkLnNldChNaXBzOjpLMCk7CisgIFJlc2VydmVkLnNldChNaXBzOjpLMSk7CisgIFJlc2VydmVkLnNldChNaXBzOjpHUCk7CisgIFJlc2VydmVkLnNldChNaXBzOjpTUCk7CisgIFJlc2VydmVkLnNldChNaXBzOjpGUCk7CisgIFJlc2VydmVkLnNldChNaXBzOjpSQSk7CisKKyAgLy8gU1JWNCByZXF1aXJlcyB0aGF0IG9kZCByZWdpc3RlciBjYW4ndCBiZSB1c2VkLgorICBpZiAoIVN1YnRhcmdldC5pc1NpbmdsZUZsb2F0KCkpCisgICAgZm9yICh1bnNpZ25lZCBGUmVnPShNaXBzOjpGMCkrMTsgRlJlZyA8IE1pcHM6OkYzMDsgRlJlZys9MikKKyAgICAgIFJlc2VydmVkLnNldChGUmVnKTsKKyAgCisgIHJldHVybiBSZXNlcnZlZDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTdGFjayBGcmFtZSBQcm9jZXNzaW5nIG1ldGhvZHMKKy8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8KKy8vIFRoZSBzdGFjayBpcyBhbGxvY2F0ZWQgZGVjcmVtZW50aW5nIHRoZSBzdGFjayBwb2ludGVyIG9uCisvLyB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgYSBmdW5jdGlvbiBwcm9sb2d1ZS4gT25jZSBkZWNyZW1lbnRlZCwKKy8vIGFsbCBzdGFjayByZWZlcmVuY2VzIGFyZSBkb25lIHRob3VnaHQgYSBwb3NpdGl2ZSBvZmZzZXQKKy8vIGZyb20gdGhlIHN0YWNrL2ZyYW1lIHBvaW50ZXIsIHNvIHRoZSBzdGFjayBpcyBjb25zaWRlcmluZworLy8gdG8gZ3JvdyB1cCEgT3RoZXJ3aXNlIHRlcnJpYmxlIGhhY2tzIHdvdWxkIGhhdmUgdG8gYmUgbWFkZQorLy8gdG8gZ2V0IHRoaXMgc3RhY2sgQUJJIGNvbXBsaWFudCA6KQorLy8KKy8vICBUaGUgc3RhY2sgZnJhbWUgcmVxdWlyZWQgYnkgdGhlIEFCSSAoYWZ0ZXIgY2FsbCk6CisvLyAgT2Zmc2V0CisvLworLy8gIDAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0KKy8vICA0ICAgICAgICAgICAgICAgICBBcmdzIHRvIHBhc3MgCisvLyAgLiAgICAgICAgICAgICAgICAgc2F2ZWQgJEdQICAodXNlZCBpbiBQSUMpCisvLyAgLiAgICAgICAgICAgICAgICAgQWxsb2NhIGFsbG9jYXRpb25zCisvLyAgLiAgICAgICAgICAgICAgICAgTG9jYWwgQXJlYQorLy8gIC4gICAgICAgICAgICAgICAgIENQVSAiQ2FsbGVlIFNhdmVkIiBSZWdpc3RlcnMKKy8vICAuICAgICAgICAgICAgICAgICBzYXZlZCBGUAorLy8gIC4gICAgICAgICAgICAgICAgIHNhdmVkIFJBCisvLyAgLiAgICAgICAgICAgICAgICAgRlBVICJDYWxsZWUgU2F2ZWQiIFJlZ2lzdGVycworLy8gIFN0YWNrU2l6ZSAgICAgICAgIC0tLS0tLS0tLS0tCisvLworLy8gT2Zmc2V0IC0gb2Zmc2V0IGZyb20gc3AgYWZ0ZXIgc3RhY2sgYWxsb2NhdGlvbiBvbiBmdW5jdGlvbiBwcm9sb2d1ZQorLy8KKy8vIFRoZSBzcCBpcyB0aGUgc3RhY2sgcG9pbnRlciBzdWJ0cmFjdGVkL2FkZGVkIGZyb20gdGhlIHN0YWNrIHNpemUKKy8vIGF0IHRoZSBQcm9sb2d1ZS9FcGlsb2d1ZQorLy8KKy8vIFJlZmVyZW5jZXMgdG8gdGhlIHByZXZpb3VzIHN0YWNrICh0byBvYnRhaW4gYXJndW1lbnRzKSBhcmUgZG9uZQorLy8gd2l0aCBvZmZzZXRzIHRoYXQgZXhjZWVkcyB0aGUgc3RhY2sgc2l6ZTogKHN0YWNrc2l6ZSsoNCoobnVtX2FyZy0xKSkKKy8vCisvLyBFeGFtcGxlczoKKy8vIC0gcmVmZXJlbmNlIHRvIHRoZSBhY3R1YWwgc3RhY2sgZnJhbWUKKy8vICAgZm9yIGFueSBsb2NhbCBhcmVhIHZhciB0aGVyZSBpcyBzbXQgbGlrZSA6IEZJID49IDAsIFN0YWNrT2Zmc2V0OiA0CisvLyAgICAgc3cgUkVHWCwgNChTUCkKKy8vCisvLyAtIHJlZmVyZW5jZSB0byBwcmV2aW91cyBzdGFjayBmcmFtZQorLy8gICBzdXBwb3NlIHRoZXJlJ3MgYSBsb2FkIHRvIHRoZSA1dGggYXJndW1lbnRzIDogRkkgPCAwLCBTdGFja09mZnNldDogMTYuCisvLyAgIFRoZSBlbWl0dGVkIGluc3RydWN0aW9uIHdpbGwgYmUgc29tZXRoaW5nIGxpa2U6CisvLyAgICAgbHcgUkVHWCwgMTYrU3RhY2tTaXplKFNQKQorLy8KKy8vIFNpbmNlIHRoZSB0b3RhbCBzdGFjayBzaXplIGlzIHVua25vd24gb24gTG93ZXJGb3JtYWxBcmd1bWVudHMsIGFsbAorLy8gc3RhY2sgcmVmZXJlbmNlcyAoT2JqZWN0T2Zmc2V0KSBjcmVhdGVkIHRvIHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gCisvLyBhcmd1bWVudHMsIGFyZSBuZWdhdGl2ZSBudW1iZXJzLiBUaGlzIHdheSwgb24gZWxpbWluYXRlRnJhbWVJbmRleCBpdCdzCisvLyBwb3NzaWJsZSB0byBkZXRlY3QgdGhvc2UgcmVmZXJlbmNlcyBhbmQgdGhlIG9mZnNldHMgYXJlIGFkanVzdGVkIHRvCisvLyB0aGVpciByZWFsIGxvY2F0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgTWlwc1JlZ2lzdGVySW5mbzo6YWRqdXN0TWlwc1N0YWNrRnJhbWUoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QKK3sKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1pcHNGdW5jdGlvbkluZm8gKk1pcHNGSSA9IE1GLmdldEluZm88TWlwc0Z1bmN0aW9uSW5mbz4oKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJID0gTUZJLT5nZXRDYWxsZWVTYXZlZEluZm8oKTsKKyAgdW5zaWduZWQgU3RhY2tBbGlnbiA9IE1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja0FsaWdubWVudCgpOworICB1bnNpZ25lZCBSZWdTaXplID0gU3VidGFyZ2V0LmlzR1AzMmJpdCgpID8gNCA6IDg7CisgIGJvb2wgSGFzR1AgPSBNaXBzRkktPm5lZWRHUFNhdmVSZXN0b3JlKCk7CisKKyAgLy8gTWluIGFuZCBNYXggQ1NJIEZyYW1lSW5kZXguCisgIGludCBNaW5DU0ZJID0gLTEsIE1heENTRkkgPSAtMTsgCisKKyAgLy8gU2VlIHRoZSBkZXNjcmlwdGlvbiBhdCBNaXBzTWFjaGluZUZ1bmN0aW9uLmgKKyAgaW50IFRvcENQVVNhdmVkUmVnT2ZmID0gLTEsIFRvcEZQVVNhdmVkUmVnT2ZmID0gLTE7CisKKyAgLy8gUmVwbGFjZSB0aGUgZHVtbXkgJzAnIFNQT2Zmc2V0IGJ5IHRoZSBuZWdhdGl2ZSBvZmZzZXRzLCBhcyBleHBsYWluZWQgb24gCisgIC8vIExvd2VyRm9ybWFsQXJndW1lbnRzLiBMZWF2aW5nICcwJyBmb3Igd2hpbGUgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkCisgIC8vIHRoZSBhcHByb2FjaCBkb25lIGJ5IGNhbGN1bGF0ZUZyYW1lT2JqZWN0T2Zmc2V0cyB0byB0aGUgc3RhY2sgZnJhbWUuCisgIE1pcHNGSS0+YWRqdXN0TG9hZEFyZ3NGSShNRkkpOworICBNaXBzRkktPmFkanVzdFN0b3JlVmFyQXJnc0ZJKE1GSSk7IAorCisgIC8vIEl0IGhhcHBlbnMgdGhhdCB0aGUgZGVmYXVsdCBzdGFjayBmcmFtZSBhbGxvY2F0aW9uIG9yZGVyIGRvZXMgbm90IGRpcmVjdGx5IAorICAvLyBtYXAgdG8gdGhlIGNvbnZlbnRpb24gdXNlZCBmb3IgbWlwcy4gU28gd2UgbXVzdCBmaXggaXQuIFdlIG1vdmUgdGhlIGNhbGxlZSAKKyAgLy8gc2F2ZSByZWdpc3RlciBzbG90cyBhZnRlciB0aGUgbG9jYWwgdmFyaWFibGVzIGFyZWEsIGFzIGRlc2NyaWJlZCBpbiB0aGUKKyAgLy8gc3RhY2sgZnJhbWUgYWJvdmUuCisgIHVuc2lnbmVkIENhbGxlZVNhdmVkQXJlYVNpemUgPSAwOworICBpZiAoIUNTSS5lbXB0eSgpKSB7CisgICAgTWluQ1NGSSA9IENTSVswXS5nZXRGcmFtZUlkeCgpOworICAgIE1heENTRkkgPSBDU0lbQ1NJLnNpemUoKS0xXS5nZXRGcmFtZUlkeCgpOworICB9CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDU0kuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBDYWxsZWVTYXZlZEFyZWFTaXplICs9IE1GSS0+Z2V0T2JqZWN0QWxpZ25tZW50KENTSVtpXS5nZXRGcmFtZUlkeCgpKTsKKworICB1bnNpZ25lZCBTdGFja09mZnNldCA9IEhhc0dQID8gKE1pcHNGSS0+Z2V0R1BTdGFja09mZnNldCgpK1JlZ1NpemUpCisgICAgICAgICAgICAgICAgOiAoU3VidGFyZ2V0LmlzQUJJX08zMigpID8gMTYgOiAwKTsKKworICAvLyBBZGp1c3QgbG9jYWwgdmFyaWFibGVzLiBUaGV5IHNob3VsZCBjb21lIG9uIHRoZSBzdGFjayByaWdodAorICAvLyBhZnRlciB0aGUgYXJndW1lbnRzLgorICBpbnQgTGFzdE9mZnNldEZJID0gLTE7CisgIGZvciAoaW50IGkgPSAwLCBlID0gTUZJLT5nZXRPYmplY3RJbmRleEVuZCgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChpID49IE1pbkNTRkkgJiYgaSA8PSBNYXhDU0ZJKQorICAgICAgY29udGludWU7CisgICAgaWYgKE1GSS0+aXNEZWFkT2JqZWN0SW5kZXgoaSkpCisgICAgICBjb250aW51ZTsKKyAgICB1bnNpZ25lZCBPZmZzZXQgPSAKKyAgICAgIFN0YWNrT2Zmc2V0ICsgTUZJLT5nZXRPYmplY3RPZmZzZXQoaSkgLSBDYWxsZWVTYXZlZEFyZWFTaXplOworICAgIGlmIChMYXN0T2Zmc2V0RkkgPT0gLTEpCisgICAgICBMYXN0T2Zmc2V0RkkgPSBpOworICAgIGlmIChPZmZzZXQgPiBNRkktPmdldE9iamVjdE9mZnNldChMYXN0T2Zmc2V0RkkpKQorICAgICAgTGFzdE9mZnNldEZJID0gaTsKKyAgICBNRkktPnNldE9iamVjdE9mZnNldChpLCBPZmZzZXQpOworICB9CisKKyAgLy8gQWRqdXN0IENQVSBDYWxsZWUgU2F2ZWQgUmVnaXN0ZXJzIEFyZWEuIFJlZ2lzdGVycyBSQSBhbmQgRlAgbXVzdAorICAvLyBiZSBzYXZlZCBpbiB0aGlzIENQVSBBcmVhLiBUaGlzIHdob2xlIGFyZWEgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSAKKyAgLy8gZGVmYXVsdCBTdGFjayBBbGlnbm1lbnQgcmVxdWlyZW1lbnRzLgorICBpZiAoTGFzdE9mZnNldEZJID49IDApCisgICAgU3RhY2tPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChMYXN0T2Zmc2V0RkkpKyAKKyAgICAgICAgICAgICAgICAgIE1GSS0+Z2V0T2JqZWN0U2l6ZShMYXN0T2Zmc2V0RkkpOworICBTdGFja09mZnNldCA9ICgoU3RhY2tPZmZzZXQrU3RhY2tBbGlnbi0xKS9TdGFja0FsaWduKlN0YWNrQWxpZ24pOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDU0kuc2l6ZSgpOyBpICE9IGUgOyArK2kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaV0uZ2V0UmVnKCk7CisgICAgaWYgKCFNaXBzOjpDUFVSZWdzUmVnaXN0ZXJDbGFzcy0+Y29udGFpbnMoUmVnKSkKKyAgICAgIGJyZWFrOworICAgIE1GSS0+c2V0T2JqZWN0T2Zmc2V0KENTSVtpXS5nZXRGcmFtZUlkeCgpLCBTdGFja09mZnNldCk7CisgICAgVG9wQ1BVU2F2ZWRSZWdPZmYgPSBTdGFja09mZnNldDsKKyAgICBTdGFja09mZnNldCArPSBNRkktPmdldE9iamVjdEFsaWdubWVudChDU0lbaV0uZ2V0RnJhbWVJZHgoKSk7CisgIH0KKworICAvLyBTdGFjayBsb2NhdGlvbnMgZm9yIEZQIGFuZCBSQS4gSWYgb25seSBvbmUgb2YgdGhlbSBpcyB1c2VkLCAKKyAgLy8gdGhlIHNwYWNlIG11c3QgYmUgYWxsb2NhdGVkIGZvciBib3RoLCBvdGhlcndpc2Ugbm8gc3BhY2UgYXQgYWxsLgorICBpZiAoaGFzRlAoTUYpIHx8IE1GSS0+YWRqdXN0c1N0YWNrKCkpIHsKKyAgICAvLyBGUCBzdGFjayBsb2NhdGlvbgorICAgIE1GSS0+c2V0T2JqZWN0T2Zmc2V0KE1GSS0+Q3JlYXRlU3RhY2tPYmplY3QoUmVnU2l6ZSwgUmVnU2l6ZSwgdHJ1ZSksIAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrT2Zmc2V0KTsKKyAgICBNaXBzRkktPnNldEZQU3RhY2tPZmZzZXQoU3RhY2tPZmZzZXQpOworICAgIFRvcENQVVNhdmVkUmVnT2ZmID0gU3RhY2tPZmZzZXQ7CisgICAgU3RhY2tPZmZzZXQgKz0gUmVnU2l6ZTsKKworICAgIC8vIFNQIHN0YWNrIGxvY2F0aW9uCisgICAgTUZJLT5zZXRPYmplY3RPZmZzZXQoTUZJLT5DcmVhdGVTdGFja09iamVjdChSZWdTaXplLCBSZWdTaXplLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdGFja09mZnNldCk7CisgICAgTWlwc0ZJLT5zZXRSQVN0YWNrT2Zmc2V0KFN0YWNrT2Zmc2V0KTsKKyAgICBTdGFja09mZnNldCArPSBSZWdTaXplOworCisgICAgaWYgKE1GSS0+YWRqdXN0c1N0YWNrKCkpCisgICAgICBUb3BDUFVTYXZlZFJlZ09mZiArPSBSZWdTaXplOworICB9CisKKyAgU3RhY2tPZmZzZXQgPSAoKFN0YWNrT2Zmc2V0K1N0YWNrQWxpZ24tMSkvU3RhY2tBbGlnbipTdGFja0FsaWduKTsKKyAgCisgIC8vIEFkanVzdCBGUFUgQ2FsbGVlIFNhdmVkIFJlZ2lzdGVycyBBcmVhLiBUaGlzIEFyZWEgbXVzdCBiZSAKKyAgLy8gYWxpZ25lZCB0byB0aGUgZGVmYXVsdCBTdGFjayBBbGlnbm1lbnQgcmVxdWlyZW1lbnRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ1NJLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaV0uZ2V0UmVnKCk7CisgICAgaWYgKE1pcHM6OkNQVVJlZ3NSZWdpc3RlckNsYXNzLT5jb250YWlucyhSZWcpKQorICAgICAgY29udGludWU7CisgICAgTUZJLT5zZXRPYmplY3RPZmZzZXQoQ1NJW2ldLmdldEZyYW1lSWR4KCksIFN0YWNrT2Zmc2V0KTsKKyAgICBUb3BGUFVTYXZlZFJlZ09mZiA9IFN0YWNrT2Zmc2V0OworICAgIFN0YWNrT2Zmc2V0ICs9IE1GSS0+Z2V0T2JqZWN0QWxpZ25tZW50KENTSVtpXS5nZXRGcmFtZUlkeCgpKTsKKyAgfQorICBTdGFja09mZnNldCA9ICgoU3RhY2tPZmZzZXQrU3RhY2tBbGlnbi0xKS9TdGFja0FsaWduKlN0YWNrQWxpZ24pOworCisgIC8vIFVwZGF0ZSBmcmFtZSBpbmZvCisgIE1GSS0+c2V0U3RhY2tTaXplKFN0YWNrT2Zmc2V0KTsKKworICAvLyBSZWNhbGN1bGF0ZSB0aGUgZmluYWwgdG9wcyBvZmZzZXQuIFRoZSBmaW5hbCB2YWx1ZXMgbXVzdCBiZSAnMCcKKyAgLy8gaWYgdGhlcmUgaXNuJ3QgYSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgZm9yIENQVSBvciBGUFUsIG90aGVyd2lzZQorICAvLyBhIG5lZ2F0aXZlIG9mZnNldCBpcyBuZWVkZWQuCisgIGlmIChUb3BDUFVTYXZlZFJlZ09mZiA+PSAwKQorICAgIE1pcHNGSS0+c2V0Q1BVVG9wU2F2ZWRSZWdPZmYoVG9wQ1BVU2F2ZWRSZWdPZmYtU3RhY2tPZmZzZXQpOworCisgIGlmIChUb3BGUFVTYXZlZFJlZ09mZiA+PSAwKQorICAgIE1pcHNGSS0+c2V0RlBVVG9wU2F2ZWRSZWdPZmYoVG9wRlBVU2F2ZWRSZWdPZmYtU3RhY2tPZmZzZXQpOworfQorCisvLyBoYXNGUCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gc2hvdWxkIGhhdmUgYSBkZWRpY2F0ZWQgZnJhbWUKKy8vIHBvaW50ZXIgcmVnaXN0ZXIuICBUaGlzIGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGhhcyB2YXJpYWJsZSBzaXplZCBhbGxvY2FzIG9yCisvLyBpZiBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uIGlzIGRpc2FibGVkLgorYm9vbCBNaXBzUmVnaXN0ZXJJbmZvOjoKK2hhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIHJldHVybiBEaXNhYmxlRnJhbWVQb2ludGVyRWxpbShNRikgfHwgTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBlbGltaW5hdGUgQURKQ0FMTFNUQUNLRE9XTiwgCisvLyBBREpDQUxMU1RBQ0tVUCBwc2V1ZG8gaW5zdHJ1Y3Rpb25zCit2b2lkIE1pcHNSZWdpc3RlckluZm86OgorZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdCB7CisgIC8vIFNpbXBseSBkaXNjYXJkIEFESkNBTExTVEFDS0RPV04sIEFESkNBTExTVEFDS1VQIGluc3RydWN0aW9ucy4KKyAgTUJCLmVyYXNlKEkpOworfQorCisvLyBGcmFtZUluZGV4IHJlcHJlc2VudCBvYmplY3RzIGluc2lkZSBhIGFic3RyYWN0IHN0YWNrLgorLy8gV2UgbXVzdCByZXBsYWNlIEZyYW1lSW5kZXggd2l0aCBhbiBzdGFjay9mcmFtZSBwb2ludGVyCisvLyBkaXJlY3QgcmVmZXJlbmNlLgordW5zaWduZWQgTWlwc1JlZ2lzdGVySW5mbzo6CitlbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwgaW50IFNQQWRqLAorICAgICAgICAgICAgICAgICAgICBGcmFtZUluZGV4VmFsdWUgKlZhbHVlLCBSZWdTY2F2ZW5nZXIgKlJTKSBjb25zdAoreworICBNYWNoaW5lSW5zdHIgJk1JID0gKklJOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1JLmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKworICB1bnNpZ25lZCBpID0gMDsKKyAgd2hpbGUgKCFNSS5nZXRPcGVyYW5kKGkpLmlzRkkoKSkgeworICAgICsraTsKKyAgICBhc3NlcnQoaSA8IE1JLmdldE51bU9wZXJhbmRzKCkgJiYgCisgICAgICAgICAgICJJbnN0ciBkb2Vzbid0IGhhdmUgRnJhbWVJbmRleCBvcGVyYW5kISIpOworICB9CisKKyAgREVCVUcoZXJycygpIDw8ICJcbkZ1bmN0aW9uIDogIiA8PCBNRi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkgPDwgIlxuIjsKKyAgICAgICAgZXJycygpIDw8ICI8LS0tLS0tLS0tPlxuIiA8PCBNSSk7CisKKyAgaW50IEZyYW1lSW5kZXggPSBNSS5nZXRPcGVyYW5kKGkpLmdldEluZGV4KCk7CisgIGludCBzdGFja1NpemUgID0gTUYuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrU2l6ZSgpOworICBpbnQgc3BPZmZzZXQgICA9IE1GLmdldEZyYW1lSW5mbygpLT5nZXRPYmplY3RPZmZzZXQoRnJhbWVJbmRleCk7CisKKyAgREVCVUcoZXJycygpIDw8ICJGcmFtZUluZGV4IDogIiA8PCBGcmFtZUluZGV4IDw8ICJcbiIKKyAgICAgICAgICAgICAgIDw8ICJzcE9mZnNldCAgIDogIiA8PCBzcE9mZnNldCA8PCAiXG4iCisgICAgICAgICAgICAgICA8PCAic3RhY2tTaXplICA6ICIgPDwgc3RhY2tTaXplIDw8ICJcbiIpOworCisgIC8vIGFzIGV4cGxhaW5lZCBvbiBMb3dlckZvcm1hbEFyZ3VtZW50cywgZGV0ZWN0IG5lZ2F0aXZlIG9mZnNldHMKKyAgLy8gYW5kIGFkanVzdCBTUE9mZnNldHMgY29uc2lkZXJpbmcgdGhlIGZpbmFsIHN0YWNrIHNpemUuCisgIGludCBPZmZzZXQgPSAoKHNwT2Zmc2V0IDwgMCkgPyAoc3RhY2tTaXplICsgKC0oc3BPZmZzZXQrNCkpKSA6IChzcE9mZnNldCkpOworICBPZmZzZXQgICAgKz0gTUkuZ2V0T3BlcmFuZChpLTEpLmdldEltbSgpOworCisgIERFQlVHKGVycnMoKSA8PCAiT2Zmc2V0ICAgICA6ICIgPDwgT2Zmc2V0IDw8ICJcbiIgPDwgIjwtLS0tLS0tLS0+XG4iKTsKKworICBNSS5nZXRPcGVyYW5kKGktMSkuQ2hhbmdlVG9JbW1lZGlhdGUoT2Zmc2V0KTsKKyAgTUkuZ2V0T3BlcmFuZChpKS5DaGFuZ2VUb1JlZ2lzdGVyKGdldEZyYW1lUmVnaXN0ZXIoTUYpLCBmYWxzZSk7CisgIHJldHVybiAwOworfQorCit2b2lkIE1pcHNSZWdpc3RlckluZm86OgorZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IAoreworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCICAgPSBNRi5mcm9udCgpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgICAgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTWlwc0Z1bmN0aW9uSW5mbyAqTWlwc0ZJID0gTUYuZ2V0SW5mbzxNaXBzRnVuY3Rpb25JbmZvPigpOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IE1CQi5iZWdpbigpOworICBEZWJ1Z0xvYyBkbCA9IE1CQkkgIT0gTUJCLmVuZCgpID8gTUJCSS0+Z2V0RGVidWdMb2MoKSA6IERlYnVnTG9jKCk7CisgIGJvb2wgaXNQSUMgPSAoTUYuZ2V0VGFyZ2V0KCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pOworCisgIC8vIEdldCB0aGUgcmlnaHQgZnJhbWUgb3JkZXIgZm9yIE1pcHMuCisgIGFkanVzdE1pcHNTdGFja0ZyYW1lKE1GKTsKKworICAvLyBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBGcmFtZUluZm8uCisgIHVuc2lnbmVkIFN0YWNrU2l6ZSA9IE1GSS0+Z2V0U3RhY2tTaXplKCk7CisKKyAgLy8gTm8gbmVlZCB0byBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2suCisgIGlmIChTdGFja1NpemUgPT0gMCAmJiAhTUZJLT5hZGp1c3RzU3RhY2soKSkgcmV0dXJuOworCisgIGludCBGUE9mZnNldCA9IE1pcHNGSS0+Z2V0RlBTdGFja09mZnNldCgpOworICBpbnQgUkFPZmZzZXQgPSBNaXBzRkktPmdldFJBU3RhY2tPZmZzZXQoKTsKKworICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoTWlwczo6Tk9SRU9SREVSKSk7CisgIAorICAvLyBUT0RPOiBjaGVjayBuZWVkIGZyb20gR1AgaGVyZS4KKyAgaWYgKGlzUElDICYmIFN1YnRhcmdldC5pc0FCSV9PMzIoKSkgCisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KE1pcHM6OkNQTE9BRCkpLmFkZFJlZyhnZXRQSUNDYWxsUmVnKCkpOworICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoTWlwczo6Tk9NQUNSTykpOworCisgIC8vIEFkanVzdCBzdGFjayA6IGFkZGkgc3AsIHNwLCAoLWltbSkKKyAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KE1pcHM6OkFERGl1KSwgTWlwczo6U1ApCisgICAgICAuYWRkUmVnKE1pcHM6OlNQKS5hZGRJbW0oLVN0YWNrU2l6ZSk7CisKKyAgLy8gU2F2ZSB0aGUgcmV0dXJuIGFkZHJlc3Mgb25seSBpZiB0aGUgZnVuY3Rpb24gaXNudCBhIGxlYWYgb25lLgorICAvLyBzdyAgJHJhLCBzdGFja19sb2MoJHNwKQorICBpZiAoTUZJLT5hZGp1c3RzU3RhY2soKSkgeyAKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoTWlwczo6U1cpKQorICAgICAgICAuYWRkUmVnKE1pcHM6OlJBKS5hZGRJbW0oUkFPZmZzZXQpLmFkZFJlZyhNaXBzOjpTUCk7CisgIH0KKworICAvLyBpZiBmcmFtZXBvaW50ZXIgZW5hYmxlZCwgc2F2ZSBpdCBhbmQgc2V0IGl0CisgIC8vIHRvIHBvaW50IHRvIHRoZSBzdGFjayBwb2ludGVyCisgIGlmIChoYXNGUChNRikpIHsKKyAgICAvLyBzdyAgJGZwLHN0YWNrX2xvYygkc3ApCisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KE1pcHM6OlNXKSkKKyAgICAgIC5hZGRSZWcoTWlwczo6RlApLmFkZEltbShGUE9mZnNldCkuYWRkUmVnKE1pcHM6OlNQKTsKKworICAgIC8vIG1vdmUgJGZwLCAkc3AKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoTWlwczo6QUREdSksIE1pcHM6OkZQKQorICAgICAgLmFkZFJlZyhNaXBzOjpTUCkuYWRkUmVnKE1pcHM6OlpFUk8pOworICB9CisKKyAgLy8gUmVzdG9yZSBHUCBmcm9tIHRoZSBzYXZlZCBzdGFjayBsb2NhdGlvbgorICBpZiAoTWlwc0ZJLT5uZWVkR1BTYXZlUmVzdG9yZSgpKQorICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChNaXBzOjpDUFJFU1RPUkUpKQorICAgICAgLmFkZEltbShNaXBzRkktPmdldEdQU3RhY2tPZmZzZXQoKSk7Cit9CisKK3ZvaWQgTWlwc1JlZ2lzdGVySW5mbzo6CitlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgCit7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gcHJpb3IoTUJCLmVuZCgpKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJICAgICAgICAgICAgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTWlwc0Z1bmN0aW9uSW5mbyAqTWlwc0ZJICAgICAgICAgPSBNRi5nZXRJbmZvPE1pcHNGdW5jdGlvbkluZm8+KCk7CisgIERlYnVnTG9jIGRsID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIEZyYW1lSW5mbworICBpbnQgTnVtQnl0ZXMgPSAoaW50KSBNRkktPmdldFN0YWNrU2l6ZSgpOworCisgIC8vIEdldCB0aGUgRkkncyB3aGVyZSBSQSBhbmQgRlAgYXJlIHNhdmVkLgorICBpbnQgRlBPZmZzZXQgPSBNaXBzRkktPmdldEZQU3RhY2tPZmZzZXQoKTsKKyAgaW50IFJBT2Zmc2V0ID0gTWlwc0ZJLT5nZXRSQVN0YWNrT2Zmc2V0KCk7CisKKyAgLy8gaWYgZnJhbWVwb2ludGVyIGVuYWJsZWQsIHJlc3RvcmUgaXQgYW5kIHJlc3RvcmUgdGhlCisgIC8vIHN0YWNrIHBvaW50ZXIKKyAgaWYgKGhhc0ZQKE1GKSkgeworICAgIC8vIG1vdmUgJHNwLCAkZnAKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoTWlwczo6QUREdSksIE1pcHM6OlNQKQorICAgICAgLmFkZFJlZyhNaXBzOjpGUCkuYWRkUmVnKE1pcHM6OlpFUk8pOworCisgICAgLy8gbHcgICRmcCxzdGFja19sb2MoJHNwKQorICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChNaXBzOjpMVyksIE1pcHM6OkZQKQorICAgICAgLmFkZEltbShGUE9mZnNldCkuYWRkUmVnKE1pcHM6OlNQKTsKKyAgfQorCisgIC8vIFJlc3RvcmUgdGhlIHJldHVybiBhZGRyZXNzIG9ubHkgaWYgdGhlIGZ1bmN0aW9uIGlzbnQgYSBsZWFmIG9uZS4KKyAgLy8gbHcgICRyYSwgc3RhY2tfbG9jKCRzcCkKKyAgaWYgKE1GSS0+YWRqdXN0c1N0YWNrKCkpIHsgCisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KE1pcHM6OkxXKSwgTWlwczo6UkEpCisgICAgICAuYWRkSW1tKFJBT2Zmc2V0KS5hZGRSZWcoTWlwczo6U1ApOworICB9CisKKyAgLy8gYWRqdXN0IHN0YWNrICA6IGluc2VydCBhZGRpIHNwLCBzcCwgKGltbSkKKyAgaWYgKE51bUJ5dGVzKSB7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KE1pcHM6OkFERGl1KSwgTWlwczo6U1ApCisgICAgICAuYWRkUmVnKE1pcHM6OlNQKS5hZGRJbW0oTnVtQnl0ZXMpOworICB9Cit9CisKKwordm9pZCBNaXBzUmVnaXN0ZXJJbmZvOjoKK3Byb2Nlc3NGdW5jdGlvbkJlZm9yZUZyYW1lRmluYWxpemVkKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgLy8gU2V0IHRoZSBzdGFjayBvZmZzZXQgd2hlcmUgR1AgbXVzdCBiZSBzYXZlZC9sb2FkZWQgZnJvbS4KKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1pcHNGdW5jdGlvbkluZm8gKk1pcHNGSSA9IE1GLmdldEluZm88TWlwc0Z1bmN0aW9uSW5mbz4oKTsKKyAgaWYgKE1pcHNGSS0+bmVlZEdQU2F2ZVJlc3RvcmUoKSkKKyAgICBNRkktPnNldE9iamVjdE9mZnNldChNaXBzRkktPmdldEdQRkkoKSwgTWlwc0ZJLT5nZXRHUFN0YWNrT2Zmc2V0KCkpOworfQorCit1bnNpZ25lZCBNaXBzUmVnaXN0ZXJJbmZvOjoKK2dldFJBUmVnaXN0ZXIoKSBjb25zdCB7CisgIHJldHVybiBNaXBzOjpSQTsKK30KKwordW5zaWduZWQgTWlwc1JlZ2lzdGVySW5mbzo6CitnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgcmV0dXJuIGhhc0ZQKE1GKSA/IE1pcHM6OkZQIDogTWlwczo6U1A7Cit9CisKK3Vuc2lnbmVkIE1pcHNSZWdpc3RlckluZm86OgorZ2V0RUhFeGNlcHRpb25SZWdpc3RlcigpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiV2hhdCBpcyB0aGUgZXhjZXB0aW9uIHJlZ2lzdGVyIik7CisgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBNaXBzUmVnaXN0ZXJJbmZvOjoKK2dldEVISGFuZGxlclJlZ2lzdGVyKCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJXaGF0IGlzIHRoZSBleGNlcHRpb24gaGFuZGxlciByZWdpc3RlciIpOworICByZXR1cm4gMDsKK30KKworaW50IE1pcHNSZWdpc3RlckluZm86OgorZ2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiV2hhdCBpcyB0aGUgZHdhcmYgcmVnaXN0ZXIgbnVtYmVyIik7CisgIHJldHVybiAtMTsKK30KKworI2luY2x1ZGUgIk1pcHNHZW5SZWdpc3RlckluZm8uaW5jIgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNSZWdpc3RlckluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzUmVnaXN0ZXJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwMGE2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzUmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSw3NiBAQAorLy89PT0tIE1pcHNSZWdpc3RlckluZm8uaCAtIE1pcHMgUmVnaXN0ZXIgSW5mb3JtYXRpb24gSW1wbCAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE1pcHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE1JUFNSRUdJU1RFUklORk9fSAorI2RlZmluZSBNSVBTUkVHSVNURVJJTkZPX0gKKworI2luY2x1ZGUgIk1pcHMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJNaXBzR2VuUmVnaXN0ZXJJbmZvLmguaW5jIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNaXBzU3VidGFyZ2V0OworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVHlwZTsKKworc3RydWN0IE1pcHNSZWdpc3RlckluZm8gOiBwdWJsaWMgTWlwc0dlblJlZ2lzdGVySW5mbyB7CisgIGNvbnN0IE1pcHNTdWJ0YXJnZXQgJlN1YnRhcmdldDsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUk7CisgIAorICBNaXBzUmVnaXN0ZXJJbmZvKGNvbnN0IE1pcHNTdWJ0YXJnZXQgJlN1YnRhcmdldCwgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpOworCisgIC8vLyBnZXRSZWdpc3Rlck51bWJlcmluZyAtIEdpdmVuIHRoZSBlbnVtIHZhbHVlIGZvciBzb21lIHJlZ2lzdGVyLCBlLmcuCisgIC8vLyBNaXBzOjpSQSwgcmV0dXJuIHRoZSBudW1iZXIgdGhhdCBpdCBjb3JyZXNwb25kcyB0byAoZS5nLiAzMSkuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRSZWdpc3Rlck51bWJlcmluZyh1bnNpZ25lZCBSZWdFbnVtKTsKKworICAvLy8gR2V0IFBJQyBpbmRpcmVjdCBjYWxsIHJlZ2lzdGVyCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQSUNDYWxsUmVnKCk7CisKKyAgLy8vIEFkanVzdCB0aGUgTWlwcyBzdGFjayBmcmFtZS4KKyAgdm9pZCBhZGp1c3RNaXBzU3RhY2tGcmFtZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gQ29kZSBHZW5lcmF0aW9uIHZpcnR1YWwgbWV0aG9kcy4uLgorICBjb25zdCB1bnNpZ25lZCAqZ2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiogTUYgPSAwKSBjb25zdDsKKworICBCaXRWZWN0b3IgZ2V0UmVzZXJ2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIGJvb2wgaGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgdm9pZCBlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIGNvbnN0OworCisgIC8vLyBTdGFjayBGcmFtZSBQcm9jZXNzaW5nIE1ldGhvZHMKKyAgdW5zaWduZWQgZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gTlVMTCkgY29uc3Q7CisKKyAgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZChNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2b2lkIGVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgdm9pZCBlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisgIAorICAvLy8gRGVidWcgaW5mb3JtYXRpb24gcXVlcmllcy4KKyAgdW5zaWduZWQgZ2V0UkFSZWdpc3RlcigpIGNvbnN0OworICB1bnNpZ25lZCBnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBFeGNlcHRpb24gaGFuZGxpbmcgcXVlcmllcy4KKyAgdW5zaWduZWQgZ2V0RUhFeGNlcHRpb25SZWdpc3RlcigpIGNvbnN0OworICB1bnNpZ25lZCBnZXRFSEhhbmRsZXJSZWdpc3RlcigpIGNvbnN0OworCisgIGludCBnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzUmVnaXN0ZXJJbmZvLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNSZWdpc3RlckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1OWI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzUmVnaXN0ZXJJbmZvLnRkCkBAIC0wLDAgKzEsMjY0IEBACisvLz09PS0gTWlwc1JlZ2lzdGVySW5mby50ZCAtIE1pcHMgUmVnaXN0ZXIgZGVmcyAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLw0KKy8vDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBEZWNsYXJhdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgTUlQUyByZWdpc3RlciBmaWxlDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBXZSBoYXZlIGJhbmtzIG9mIDMyIHJlZ2lzdGVycyBlYWNoLg0KK2NsYXNzIE1pcHNSZWc8c3RyaW5nIG4+IDogUmVnaXN0ZXI8bj4gew0KKyAgZmllbGQgYml0czw1PiBOdW07DQorICBsZXQgTmFtZXNwYWNlID0gIk1pcHMiOw0KK30NCisNCitjbGFzcyBNaXBzUmVnV2l0aFN1YlJlZ3M8c3RyaW5nIG4sIGxpc3Q8UmVnaXN0ZXI+IHN1YnJlZ3M+IA0KKyAgOiBSZWdpc3RlcldpdGhTdWJSZWdzPG4sIHN1YnJlZ3M+IHsNCisgIGZpZWxkIGJpdHM8NT4gTnVtOw0KKyAgbGV0IE5hbWVzcGFjZSA9ICJNaXBzIjsNCit9DQorDQorLy8gTWlwcyBDUFUgUmVnaXN0ZXJzDQorY2xhc3MgTWlwc0dQUlJlZzxiaXRzPDU+IG51bSwgc3RyaW5nIG4+IDogTWlwc1JlZzxuPiB7DQorICBsZXQgTnVtID0gbnVtOw0KK30NCisNCisvLyBNaXBzIDMyLWJpdCBGUFUgUmVnaXN0ZXJzDQorY2xhc3MgRlBSPGJpdHM8NT4gbnVtLCBzdHJpbmcgbj4gOiBNaXBzUmVnPG4+IHsNCisgIGxldCBOdW0gPSBudW07DQorfQ0KKw0KKy8vIE1pcHMgNjQtYml0IChhbGlhc2VkKSBGUFUgUmVnaXN0ZXJzDQorbGV0IE5hbWVzcGFjZSA9ICJNaXBzIiBpbiB7DQorZGVmIHN1Yl9mcGV2ZW4gOiBTdWJSZWdJbmRleDsNCitkZWYgc3ViX2Zwb2RkICA6IFN1YlJlZ0luZGV4Ow0KK30NCitjbGFzcyBBRlBSPGJpdHM8NT4gbnVtLCBzdHJpbmcgbiwgbGlzdDxSZWdpc3Rlcj4gc3VicmVncz4NCisgIDogTWlwc1JlZ1dpdGhTdWJSZWdzPG4sIHN1YnJlZ3M+IHsNCisgIGxldCBOdW0gPSBudW07DQorICBsZXQgU3ViUmVnSW5kaWNlcyA9IFtzdWJfZnBldmVuLCBzdWJfZnBvZGRdOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBSZWdpc3RlcnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2xldCBOYW1lc3BhY2UgPSAiTWlwcyIgaW4gew0KKw0KKyAgLy8gR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVycw0KKyAgZGVmIFpFUk8gOiBNaXBzR1BSUmVnPCAwLCAiWkVSTyI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KKyAgZGVmIEFUICAgOiBNaXBzR1BSUmVnPCAxLCAiQVQiPiwgICBEd2FyZlJlZ051bTxbMV0+Ow0KKyAgZGVmIFYwICAgOiBNaXBzR1BSUmVnPCAyLCAiMiI+LCAgICBEd2FyZlJlZ051bTxbMl0+Ow0KKyAgZGVmIFYxICAgOiBNaXBzR1BSUmVnPCAzLCAiMyI+LCAgICBEd2FyZlJlZ051bTxbM10+Ow0KKyAgZGVmIEEwICAgOiBNaXBzR1BSUmVnPCA0LCAiNCI+LCAgICBEd2FyZlJlZ051bTxbNV0+Ow0KKyAgZGVmIEExICAgOiBNaXBzR1BSUmVnPCA1LCAiNSI+LCAgICBEd2FyZlJlZ051bTxbNV0+Ow0KKyAgZGVmIEEyICAgOiBNaXBzR1BSUmVnPCA2LCAiNiI+LCAgICBEd2FyZlJlZ051bTxbNl0+Ow0KKyAgZGVmIEEzICAgOiBNaXBzR1BSUmVnPCA3LCAiNyI+LCAgICBEd2FyZlJlZ051bTxbN10+Ow0KKyAgZGVmIFQwICAgOiBNaXBzR1BSUmVnPCA4LCAiOCI+LCAgICBEd2FyZlJlZ051bTxbOF0+Ow0KKyAgZGVmIFQxICAgOiBNaXBzR1BSUmVnPCA5LCAiOSI+LCAgICBEd2FyZlJlZ051bTxbOV0+Ow0KKyAgZGVmIFQyICAgOiBNaXBzR1BSUmVnPCAxMCwgIjEwIj4sICBEd2FyZlJlZ051bTxbMTBdPjsNCisgIGRlZiBUMyAgIDogTWlwc0dQUlJlZzwgMTEsICIxMSI+LCAgRHdhcmZSZWdOdW08WzExXT47DQorICBkZWYgVDQgICA6IE1pcHNHUFJSZWc8IDEyLCAiMTIiPiwgIER3YXJmUmVnTnVtPFsxMl0+Ow0KKyAgZGVmIFQ1ICAgOiBNaXBzR1BSUmVnPCAxMywgIjEzIj4sICBEd2FyZlJlZ051bTxbMTNdPjsNCisgIGRlZiBUNiAgIDogTWlwc0dQUlJlZzwgMTQsICIxNCI+LCAgRHdhcmZSZWdOdW08WzE0XT47DQorICBkZWYgVDcgICA6IE1pcHNHUFJSZWc8IDE1LCAiMTUiPiwgIER3YXJmUmVnTnVtPFsxNV0+Ow0KKyAgZGVmIFMwICAgOiBNaXBzR1BSUmVnPCAxNiwgIjE2Ij4sICBEd2FyZlJlZ051bTxbMTZdPjsNCisgIGRlZiBTMSAgIDogTWlwc0dQUlJlZzwgMTcsICIxNyI+LCAgRHdhcmZSZWdOdW08WzE3XT47DQorICBkZWYgUzIgICA6IE1pcHNHUFJSZWc8IDE4LCAiMTgiPiwgIER3YXJmUmVnTnVtPFsxOF0+Ow0KKyAgZGVmIFMzICAgOiBNaXBzR1BSUmVnPCAxOSwgIjE5Ij4sICBEd2FyZlJlZ051bTxbMTldPjsNCisgIGRlZiBTNCAgIDogTWlwc0dQUlJlZzwgMjAsICIyMCI+LCAgRHdhcmZSZWdOdW08WzIwXT47DQorICBkZWYgUzUgICA6IE1pcHNHUFJSZWc8IDIxLCAiMjEiPiwgIER3YXJmUmVnTnVtPFsyMV0+Ow0KKyAgZGVmIFM2ICAgOiBNaXBzR1BSUmVnPCAyMiwgIjIyIj4sICBEd2FyZlJlZ051bTxbMjJdPjsNCisgIGRlZiBTNyAgIDogTWlwc0dQUlJlZzwgMjMsICIyMyI+LCAgRHdhcmZSZWdOdW08WzIzXT47DQorICBkZWYgVDggICA6IE1pcHNHUFJSZWc8IDI0LCAiMjQiPiwgIER3YXJmUmVnTnVtPFsyNF0+Ow0KKyAgZGVmIFQ5ICAgOiBNaXBzR1BSUmVnPCAyNSwgIjI1Ij4sICBEd2FyZlJlZ051bTxbMjVdPjsNCisgIGRlZiBLMCAgIDogTWlwc0dQUlJlZzwgMjYsICIyNiI+LCAgRHdhcmZSZWdOdW08WzI2XT47DQorICBkZWYgSzEgICA6IE1pcHNHUFJSZWc8IDI3LCAiMjciPiwgIER3YXJmUmVnTnVtPFsyN10+Ow0KKyAgZGVmIEdQICAgOiBNaXBzR1BSUmVnPCAyOCwgIkdQIj4sICBEd2FyZlJlZ051bTxbMjhdPjsNCisgIGRlZiBTUCAgIDogTWlwc0dQUlJlZzwgMjksICJTUCI+LCAgRHdhcmZSZWdOdW08WzI5XT47DQorICBkZWYgRlAgICA6IE1pcHNHUFJSZWc8IDMwLCAiRlAiPiwgIER3YXJmUmVnTnVtPFszMF0+Ow0KKyAgZGVmIFJBICAgOiBNaXBzR1BSUmVnPCAzMSwgIlJBIj4sICBEd2FyZlJlZ051bTxbMzFdPjsNCisgIA0KKyAgLy8vIE1pcHMgU2luZ2xlIHBvaW50IHByZWNpc2lvbiBGUFUgUmVnaXN0ZXJzDQorICBkZWYgRjAgIDogRlBSPCAwLCAgIkYwIj4sIER3YXJmUmVnTnVtPFszMl0+Ow0KKyAgZGVmIEYxICA6IEZQUjwgMSwgICJGMSI+LCBEd2FyZlJlZ051bTxbMzNdPjsNCisgIGRlZiBGMiAgOiBGUFI8IDIsICAiRjIiPiwgRHdhcmZSZWdOdW08WzM0XT47DQorICBkZWYgRjMgIDogRlBSPCAzLCAgIkYzIj4sIER3YXJmUmVnTnVtPFszNV0+Ow0KKyAgZGVmIEY0ICA6IEZQUjwgNCwgICJGNCI+LCBEd2FyZlJlZ051bTxbMzZdPjsNCisgIGRlZiBGNSAgOiBGUFI8IDUsICAiRjUiPiwgRHdhcmZSZWdOdW08WzM3XT47DQorICBkZWYgRjYgIDogRlBSPCA2LCAgIkY2Ij4sIER3YXJmUmVnTnVtPFszOF0+Ow0KKyAgZGVmIEY3ICA6IEZQUjwgNywgICJGNyI+LCBEd2FyZlJlZ051bTxbMzldPjsNCisgIGRlZiBGOCAgOiBGUFI8IDgsICAiRjgiPiwgRHdhcmZSZWdOdW08WzQwXT47DQorICBkZWYgRjkgIDogRlBSPCA5LCAgIkY5Ij4sIER3YXJmUmVnTnVtPFs0MV0+Ow0KKyAgZGVmIEYxMCA6IEZQUjwxMCwgIkYxMCI+LCBEd2FyZlJlZ051bTxbNDJdPjsNCisgIGRlZiBGMTEgOiBGUFI8MTEsICJGMTEiPiwgRHdhcmZSZWdOdW08WzQzXT47DQorICBkZWYgRjEyIDogRlBSPDEyLCAiRjEyIj4sIER3YXJmUmVnTnVtPFs0NF0+Ow0KKyAgZGVmIEYxMyA6IEZQUjwxMywgIkYxMyI+LCBEd2FyZlJlZ051bTxbNDVdPjsNCisgIGRlZiBGMTQgOiBGUFI8MTQsICJGMTQiPiwgRHdhcmZSZWdOdW08WzQ2XT47DQorICBkZWYgRjE1IDogRlBSPDE1LCAiRjE1Ij4sIER3YXJmUmVnTnVtPFs0N10+Ow0KKyAgZGVmIEYxNiA6IEZQUjwxNiwgIkYxNiI+LCBEd2FyZlJlZ051bTxbNDhdPjsNCisgIGRlZiBGMTcgOiBGUFI8MTcsICJGMTciPiwgRHdhcmZSZWdOdW08WzQ5XT47DQorICBkZWYgRjE4IDogRlBSPDE4LCAiRjE4Ij4sIER3YXJmUmVnTnVtPFs1MF0+Ow0KKyAgZGVmIEYxOSA6IEZQUjwxOSwgIkYxOSI+LCBEd2FyZlJlZ051bTxbNTFdPjsNCisgIGRlZiBGMjAgOiBGUFI8MjAsICJGMjAiPiwgRHdhcmZSZWdOdW08WzUyXT47DQorICBkZWYgRjIxIDogRlBSPDIxLCAiRjIxIj4sIER3YXJmUmVnTnVtPFs1M10+Ow0KKyAgZGVmIEYyMiA6IEZQUjwyMiwgIkYyMiI+LCBEd2FyZlJlZ051bTxbNTRdPjsNCisgIGRlZiBGMjMgOiBGUFI8MjMsICJGMjMiPiwgRHdhcmZSZWdOdW08WzU1XT47DQorICBkZWYgRjI0IDogRlBSPDI0LCAiRjI0Ij4sIER3YXJmUmVnTnVtPFs1Nl0+Ow0KKyAgZGVmIEYyNSA6IEZQUjwyNSwgIkYyNSI+LCBEd2FyZlJlZ051bTxbNTddPjsNCisgIGRlZiBGMjYgOiBGUFI8MjYsICJGMjYiPiwgRHdhcmZSZWdOdW08WzU4XT47DQorICBkZWYgRjI3IDogRlBSPDI3LCAiRjI3Ij4sIER3YXJmUmVnTnVtPFs1OV0+Ow0KKyAgZGVmIEYyOCA6IEZQUjwyOCwgIkYyOCI+LCBEd2FyZlJlZ051bTxbNjBdPjsNCisgIGRlZiBGMjkgOiBGUFI8MjksICJGMjkiPiwgRHdhcmZSZWdOdW08WzYxXT47DQorICBkZWYgRjMwIDogRlBSPDMwLCAiRjMwIj4sIER3YXJmUmVnTnVtPFs2Ml0+Ow0KKyAgZGVmIEYzMSA6IEZQUjwzMSwgIkYzMSI+LCBEd2FyZlJlZ051bTxbNjNdPjsNCisgIA0KKyAgLy8vIE1pcHMgRG91YmxlIHBvaW50IHByZWNpc2lvbiBGUFUgUmVnaXN0ZXJzIChhbGlhc2VkDQorICAvLy8gd2l0aCB0aGUgc2luZ2xlIHByZWNpc2lvbiB0byBob2xkIDY0IGJpdCB2YWx1ZXMpDQorICBkZWYgRDAgIDogQUZQUjwgMCwgICJGMCIsIFtGMCwgICBGMV0+LCBEd2FyZlJlZ051bTxbMzJdPjsNCisgIGRlZiBEMSAgOiBBRlBSPCAyLCAgIkYyIiwgW0YyLCAgIEYzXT4sIER3YXJmUmVnTnVtPFszNF0+Ow0KKyAgZGVmIEQyICA6IEFGUFI8IDQsICAiRjQiLCBbRjQsICAgRjVdPiwgRHdhcmZSZWdOdW08WzM2XT47DQorICBkZWYgRDMgIDogQUZQUjwgNiwgICJGNiIsIFtGNiwgICBGN10+LCBEd2FyZlJlZ051bTxbMzhdPjsNCisgIGRlZiBENCAgOiBBRlBSPCA4LCAgIkY4IiwgW0Y4LCAgIEY5XT4sIER3YXJmUmVnTnVtPFs0MF0+Ow0KKyAgZGVmIEQ1ICA6IEFGUFI8MTAsICJGMTAiLCBbRjEwLCBGMTFdPiwgRHdhcmZSZWdOdW08WzQyXT47DQorICBkZWYgRDYgIDogQUZQUjwxMiwgIkYxMiIsIFtGMTIsIEYxM10+LCBEd2FyZlJlZ051bTxbNDRdPjsNCisgIGRlZiBENyAgOiBBRlBSPDE0LCAiRjE0IiwgW0YxNCwgRjE1XT4sIER3YXJmUmVnTnVtPFs0Nl0+Ow0KKyAgZGVmIEQ4ICA6IEFGUFI8MTYsICJGMTYiLCBbRjE2LCBGMTddPiwgRHdhcmZSZWdOdW08WzQ4XT47DQorICBkZWYgRDkgIDogQUZQUjwxOCwgIkYxOCIsIFtGMTgsIEYxOV0+LCBEd2FyZlJlZ051bTxbNTBdPjsNCisgIGRlZiBEMTAgOiBBRlBSPDIwLCAiRjIwIiwgW0YyMCwgRjIxXT4sIER3YXJmUmVnTnVtPFs1Ml0+Ow0KKyAgZGVmIEQxMSA6IEFGUFI8MjIsICJGMjIiLCBbRjIyLCBGMjNdPiwgRHdhcmZSZWdOdW08WzU0XT47DQorICBkZWYgRDEyIDogQUZQUjwyNCwgIkYyNCIsIFtGMjQsIEYyNV0+LCBEd2FyZlJlZ051bTxbNTZdPjsNCisgIGRlZiBEMTMgOiBBRlBSPDI2LCAiRjI2IiwgW0YyNiwgRjI3XT4sIER3YXJmUmVnTnVtPFs1OF0+Ow0KKyAgZGVmIEQxNCA6IEFGUFI8MjgsICJGMjgiLCBbRjI4LCBGMjldPiwgRHdhcmZSZWdOdW08WzYwXT47DQorICBkZWYgRDE1IDogQUZQUjwzMCwgIkYzMCIsIFtGMzAsIEYzMV0+LCBEd2FyZlJlZ051bTxbNjJdPjsNCisNCisgIC8vIEhpL0xvIHJlZ2lzdGVycw0KKyAgZGVmIEhJICA6IFJlZ2lzdGVyPCJoaSI+LCBEd2FyZlJlZ051bTxbNjRdPjsNCisgIGRlZiBMTyAgOiBSZWdpc3RlcjwibG8iPiwgRHdhcmZSZWdOdW08WzY1XT47DQorDQorICAvLyBTdGF0dXMgZmxhZ3MgcmVnaXN0ZXINCisgIGRlZiBGQ1IzMSA6IFJlZ2lzdGVyPCIzMSI+Ow0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFJlZ2lzdGVyIENsYXNzZXMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2RlZiBDUFVSZWdzIDogUmVnaXN0ZXJDbGFzczwiTWlwcyIsIFtpMzJdLCAzMiwgDQorICAvLyBSZXR1cm4gVmFsdWVzIGFuZCBBcmd1bWVudHMNCisgIFtWMCwgVjEsIEEwLCBBMSwgQTIsIEEzLA0KKyAgLy8gTm90IHByZXNlcnZlZCBhY3Jvc3MgcHJvY2VkdXJlIGNhbGxzDQorICBUMCwgVDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgDQorICAvLyBDYWxsZWUgc2F2ZQ0KKyAgUzAsIFMxLCBTMiwgUzMsIFM0LCBTNSwgUzYsIFM3LA0KKyAgLy8gUmVzZXJ2ZWQNCisgIFpFUk8sIEFULCBLMCwgSzEsIEdQLCBTUCwgRlAsIFJBXT4NCit7DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBDUFVSZWdzQ2xhc3M6Oml0ZXJhdG9yDQorICAgIENQVVJlZ3NDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIC8vIFRoZSBsYXN0IDggcmVnaXN0ZXJzIG9uIHRoZSBsaXN0IGFib3ZlIGFyZSByZXNlcnZlZA0KKyAgICAgIHJldHVybiBlbmQoKS04Ow0KKyAgICB9DQorICB9XTsNCit9DQorDQorLy8gNjRiaXQgZnA6DQorLy8gKiBGR1I2NCAgLSAzMiA2NC1iaXQgcmVnaXN0ZXJzDQorLy8gKiBBRkdSNjQgLSAxNiAzMi1iaXQgZXZlbiByZWdpc3RlcnMgKDMyLWJpdCBGUCBNb2RlKSANCisvLw0KKy8vIDMyYml0IGZwOg0KKy8vICogRkdSMzIgLSAxNiAzMi1iaXQgZXZlbiByZWdpc3RlcnMNCisvLyAqIEZHUjMyIC0gMzIgMzItYml0IHJlZ2lzdGVycyAoc2luZ2xlIGZsb2F0IG9ubHkgbW9kZSkNCitkZWYgRkdSMzIgOiBSZWdpc3RlckNsYXNzPCJNaXBzIiwgW2YzMl0sIDMyLCANCisgIC8vIFJldHVybiBWYWx1ZXMgYW5kIEFyZ3VtZW50cw0KKyAgW0YwLCBGMSwgRjIsIEYzLCBGMTIsIEYxMywgRjE0LCBGMTUsDQorICAvLyBOb3QgcHJlc2VydmVkIGFjcm9zcyBwcm9jZWR1cmUgY2FsbHMNCisgIEY0LCBGNSwgRjYsIEY3LCBGOCwgRjksIEYxMCwgRjExLCBGMTYsIEYxNywgRjE4LCBGMTksIA0KKyAgLy8gQ2FsbGVlIHNhdmUNCisgIEYyMCwgRjIxLCBGMjIsIEYyMywgRjI0LCBGMjUsIEYyNiwgRjI3LCBGMjgsIEYyOSwgRjMwLA0KKyAgLy8gUmVzZXJ2ZWQNCisgIEYzMV0+DQorew0KKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgfV07DQorICBsZXQgTWV0aG9kQm9kaWVzID0gW3sNCisNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1JUFNfRkdSMzJbXSA9IHsNCisgICAgICBNaXBzOjpGMCwgIE1pcHM6OkYxLCAgTWlwczo6RjIsICBNaXBzOjpGMywgIE1pcHM6OkYxMiwgIE1pcHM6OkYxMywgDQorICAgICAgTWlwczo6RjE0LCBNaXBzOjpGMTUsIE1pcHM6OkY0LCAgTWlwczo6RjUsICBNaXBzOjpGNiwgICBNaXBzOjpGNywgDQorICAgICAgTWlwczo6RjgsICBNaXBzOjpGOSwgIE1pcHM6OkYxMCwgTWlwczo6RjExLCBNaXBzOjpGMTYsICBNaXBzOjpGMTcsIA0KKyAgICAgIE1pcHM6OkYxOCwgTWlwczo6RjE5LCBNaXBzOjpGMjAsIE1pcHM6OkYyMSwgTWlwczo6RjIyLCAgTWlwczo6RjIzLCANCisgICAgICBNaXBzOjpGMjQsIE1pcHM6OkYyNSwgTWlwczo6RjI2LCBNaXBzOjpGMjcsIE1pcHM6OkYyOCwgIE1pcHM6OkYyOSwgDQorICAgICAgTWlwczo6RjMwDQorICAgIH07DQorDQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBNSVBTX1NWUjRfRkdSMzJbXSA9IHsNCisgICAgICBNaXBzOjpGMCwgIE1pcHM6OkYyLCAgTWlwczo6RjEyLCBNaXBzOjpGMTQsIE1pcHM6OkY0LCANCisgICAgICBNaXBzOjpGNiwgIE1pcHM6OkY4LCAgTWlwczo6RjEwLCBNaXBzOjpGMTYsIE1pcHM6OkYxOCwgDQorICAgICAgTWlwczo6RjIwLCBNaXBzOjpGMjIsIE1pcHM6OkYyNCwgTWlwczo6RjI2LCBNaXBzOjpGMjgsIE1pcHM6OkYzMCwNCisgICAgfTsNCisNCisgICAgRkdSMzJDbGFzczo6aXRlcmF0b3INCisgICAgRkdSMzJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBNaXBzU3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8TWlwc1N1YnRhcmdldD4oKTsNCisNCisgICAgICBpZiAoU3VidGFyZ2V0LmlzU2luZ2xlRmxvYXQoKSkNCisgICAgICAgIHJldHVybiBNSVBTX0ZHUjMyOw0KKyAgICAgIGVsc2UNCisgICAgICAgIHJldHVybiBNSVBTX1NWUjRfRkdSMzI7IA0KKyAgICB9DQorDQorICAgIEZHUjMyQ2xhc3M6Oml0ZXJhdG9yDQorICAgIEZHUjMyQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOw0KKyAgICAgIGNvbnN0IE1pcHNTdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxNaXBzU3VidGFyZ2V0PigpOw0KKw0KKyAgICAgIGlmIChTdWJ0YXJnZXQuaXNTaW5nbGVGbG9hdCgpKQ0KKyAgICAgICAgcmV0dXJuIE1JUFNfRkdSMzIgKyAoc2l6ZW9mKE1JUFNfRkdSMzIpIC8gc2l6ZW9mKHVuc2lnbmVkKSk7DQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIE1JUFNfU1ZSNF9GR1IzMiArIChzaXplb2YoTUlQU19TVlI0X0ZHUjMyKSAvIHNpemVvZih1bnNpZ25lZCkpOw0KKyAgICB9DQorICB9XTsNCit9DQorDQorZGVmIEFGR1I2NCA6IFJlZ2lzdGVyQ2xhc3M8Ik1pcHMiLCBbZjY0XSwgNjQsIA0KKyAgLy8gUmV0dXJuIFZhbHVlcyBhbmQgQXJndW1lbnRzDQorICBbRDAsIEQxLCBENiwgRDcsDQorICAvLyBOb3QgcHJlc2VydmVkIGFjcm9zcyBwcm9jZWR1cmUgY2FsbHMNCisgIEQyLCBEMywgRDQsIEQ1LCBEOCwgRDksIA0KKyAgLy8gQ2FsbGVlIHNhdmUNCisgIEQxMCwgRDExLCBEMTIsIEQxMywgRDE0LA0KKyAgLy8gUmVzZXJ2ZWQNCisgIEQxNV0+DQorew0KKyAgbGV0IFN1YlJlZ0NsYXNzZXMgPSBbKEZHUjMyIHN1Yl9mcGV2ZW4sIHN1Yl9mcG9kZCldOw0KKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgfV07DQorICBsZXQgTWV0aG9kQm9kaWVzID0gW3sNCisgICAgQUZHUjY0Q2xhc3M6Oml0ZXJhdG9yDQorICAgIEFGR1I2NENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgLy8gVGhlIGxhc3QgcmVnaXN0ZXIgb24gdGhlIGxpc3QgYWJvdmUgaXMgcmVzZXJ2ZWQNCisgICAgICByZXR1cm4gZW5kKCktMTsNCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KKy8vIENvbmRpdGlvbiBSZWdpc3RlciBmb3IgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucw0KK2RlZiBDQ1IgIDogUmVnaXN0ZXJDbGFzczwiTWlwcyIsIFtpMzJdLCAzMiwgW0ZDUjMxXT47DQorDQorLy8gSGkvTG8gUmVnaXN0ZXJzDQorZGVmIEhJTE8gOiBSZWdpc3RlckNsYXNzPCJNaXBzIiwgW2kzMl0sIDMyLCBbSEksIExPXT47DQorDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNTY2hlZHVsZS50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzU2NoZWR1bGUudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2YTc5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzU2NoZWR1bGUudGQKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tIE1pcHNTY2hlZHVsZS50ZCAtIE1pcHMgU2NoZWR1bGluZyBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZ1bmN0aW9uYWwgdW5pdHMgYWNyb3NzIE1pcHMgY2hpcHMgc2V0cy4gQmFzZWQgb24gR0NDL01pcHMgYmFja2VuZCBmaWxlcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgQUxVICAgICA6IEZ1bmNVbml0OworZGVmIElNVUxESVYgOiBGdW5jVW5pdDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIEl0aW5lcmFyeSBjbGFzc2VzIHVzZWQgZm9yIE1pcHMgCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIElJQWx1ICAgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJTG9hZCAgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJU3RvcmUgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJWGZlciAgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJQnJhbmNoICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJSGlMbyAgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJSW11bCAgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJSWRpdiAgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRmN2dCAgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRm1vdmUgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRmNtcCAgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRmFkZCAgICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRm11bFNpbmdsZSAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRm11bERvdWJsZSAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRmRpdlNpbmdsZSAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRmRpdkRvdWJsZSAgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRnNxcnRTaW5nbGUgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRnNxcnREb3VibGUgICAgICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJRnJlY2lwRnNxcnRTdGVwICA6IEluc3RySXRpbkNsYXNzOworZGVmIElJUHNldWRvICAgICAgICAgICA6IEluc3RySXRpbkNsYXNzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWlwcyBHZW5lcmljIGluc3RydWN0aW9uIGl0aW5lcmFyaWVzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2RlZiBNaXBzR2VuZXJpY0l0aW5lcmFyaWVzIDogUHJvY2Vzc29ySXRpbmVyYXJpZXM8W0FMVSwgSU1VTERJVl0sIFsKKyAgSW5zdHJJdGluRGF0YTxJSUFsdSAgICAgICAgICAgICAgLCBbSW5zdHJTdGFnZTwxLCAgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlMb2FkICAgICAgICAgICAgICwgW0luc3RyU3RhZ2U8MywgIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJU3RvcmUgICAgICAgICAgICAsIFtJbnN0clN0YWdlPDEsICBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSVhmZXIgICAgICAgICAgICAgLCBbSW5zdHJTdGFnZTwyLCAgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlCcmFuY2ggICAgICAgICAgICwgW0luc3RyU3RhZ2U8MSwgIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJSGlMbyAgICAgICAgICAgICAsIFtJbnN0clN0YWdlPDEsICBbSU1VTERJVl0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlJbXVsICAgICAgICAgICAgICwgW0luc3RyU3RhZ2U8MTcsIFtJTVVMRElWXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUlkaXYgICAgICAgICAgICAgLCBbSW5zdHJTdGFnZTwzOCwgW0lNVUxESVZdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJRmN2dCAgICAgICAgICAgICAsIFtJbnN0clN0YWdlPDEsICBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUZtb3ZlICAgICAgICAgICAgLCBbSW5zdHJTdGFnZTwyLCAgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlGY21wICAgICAgICAgICAgICwgW0luc3RyU3RhZ2U8MywgIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJRmFkZCAgICAgICAgICAgICAsIFtJbnN0clN0YWdlPDQsICBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUZtdWxTaW5nbGUgICAgICAgLCBbSW5zdHJTdGFnZTw3LCAgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlGbXVsRG91YmxlICAgICAgICwgW0luc3RyU3RhZ2U8OCwgIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJRmRpdlNpbmdsZSAgICAgICAsIFtJbnN0clN0YWdlPDIzLCBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUZkaXZEb3VibGUgICAgICAgLCBbSW5zdHJTdGFnZTwzNiwgW0FMVV0+XT4sCisgIEluc3RySXRpbkRhdGE8SUlGc3FydFNpbmdsZSAgICAgICwgW0luc3RyU3RhZ2U8NTQsIFtBTFVdPl0+LAorICBJbnN0ckl0aW5EYXRhPElJRnNxcnREb3VibGUgICAgICAsIFtJbnN0clN0YWdlPDEyLCBbQUxVXT5dPiwKKyAgSW5zdHJJdGluRGF0YTxJSUZyZWNpcEZzcXJ0U3RlcCAgLCBbSW5zdHJTdGFnZTw1LCAgW0FMVV0+XT4KK10+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNTZWxlY3Rpb25EQUdJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzU2VsZWN0aW9uREFHSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkNzBmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzU2VsZWN0aW9uREFHSW5mby5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy89PT0tLSBNaXBzU2VsZWN0aW9uREFHSW5mby5jcHAgLSBNaXBzIFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTWlwc1NlbGVjdGlvbkRBR0luZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJtaXBzLXNlbGVjdGlvbmRhZy1pbmZvIgorI2luY2x1ZGUgIk1pcHNUYXJnZXRNYWNoaW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworTWlwc1NlbGVjdGlvbkRBR0luZm86Ok1pcHNTZWxlY3Rpb25EQUdJbmZvKGNvbnN0IE1pcHNUYXJnZXRNYWNoaW5lICZUTSkKKyAgOiBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvKFRNKSB7Cit9CisKK01pcHNTZWxlY3Rpb25EQUdJbmZvOjp+TWlwc1NlbGVjdGlvbkRBR0luZm8oKSB7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1NlbGVjdGlvbkRBR0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzU2VsZWN0aW9uREFHSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYWZiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1NlbGVjdGlvbkRBR0luZm8uaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0tIE1pcHNTZWxlY3Rpb25EQUdJbmZvLmggLSBNaXBzIFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNaXBzIHN1YmNsYXNzIGZvciBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTUlQU1NFTEVDVElPTkRBR0lORk9fSAorI2RlZmluZSBNSVBTU0VMRUNUSU9OREFHSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTZWxlY3Rpb25EQUdJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWlwc1RhcmdldE1hY2hpbmU7CisKK2NsYXNzIE1pcHNTZWxlY3Rpb25EQUdJbmZvIDogcHVibGljIFRhcmdldFNlbGVjdGlvbkRBR0luZm8geworcHVibGljOgorICBleHBsaWNpdCBNaXBzU2VsZWN0aW9uREFHSW5mbyhjb25zdCBNaXBzVGFyZ2V0TWFjaGluZSAmVE0pOworICB+TWlwc1NlbGVjdGlvbkRBR0luZm8oKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1N1YnRhcmdldC5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1N1YnRhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxMTRkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzU3VidGFyZ2V0LmNwcApAQCAtMCwwICsxLDUxIEBACisvLz09PS0gTWlwc1N1YnRhcmdldC5jcHAgLSBNaXBzIFN1YnRhcmdldCBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBNaXBzIHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiTWlwc1N1YnRhcmdldC5oIgorI2luY2x1ZGUgIk1pcHMuaCIKKyNpbmNsdWRlICJNaXBzR2VuU3VidGFyZ2V0LmluYyIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitNaXBzU3VidGFyZ2V0OjpNaXBzU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpdHRsZSkgOiAKKyAgTWlwc0FyY2hWZXJzaW9uKE1pcHMxKSwgTWlwc0FCSShPMzIpLCBJc0xpdHRsZShsaXR0bGUpLCBJc1NpbmdsZUZsb2F0KGZhbHNlKSwKKyAgSXNGUDY0Yml0KGZhbHNlKSwgSXNHUDY0Yml0KGZhbHNlKSwgSGFzVkZQVShmYWxzZSksIElzTGludXgodHJ1ZSksCisgIEhhc1NFSW5SZWcoZmFsc2UpLCBIYXNDb25kTW92KGZhbHNlKSwgSGFzTXVsRGl2QWRkKGZhbHNlKSwgSGFzTWluTWF4KGZhbHNlKSwKKyAgSGFzU3dhcChmYWxzZSksIEhhc0JpdENvdW50KGZhbHNlKQoreworICBzdGQ6OnN0cmluZyBDUFUgPSAibWlwczEiOworICBNaXBzQXJjaFZlcnNpb24gPSBNaXBzMTsKKworICAvLyBQYXJzZSBmZWF0dXJlcyBzdHJpbmcuCisgIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoRlMsIENQVSk7CisKKyAgLy8gSXMgdGhlIHRhcmdldCBzeXN0ZW0gTGludXggPworICBpZiAoVFQuZmluZCgibGludXgiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICBJc0xpbnV4ID0gZmFsc2U7CisKKyAgLy8gV2hlbiBvbmx5IHRoZSB0YXJnZXQgdHJpcGxlIGlzIHNwZWNpZmllZCBhbmQgaXMgCisgIC8vIGEgYWxsZWdyZXggdGFyZ2V0LCBzZXQgdGhlIGZlYXR1cmVzLiBXZSBhbHNvIG1hdGNoCisgIC8vIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBhbGxlZ3JleCBjb3JlcyAoZG9udCByZWFsbHkKKyAgLy8ga25vdyBpZiBhIGJpZyBvbmUgZXhpc3RzKQorICBpZiAoVFQuZmluZCgibWlwc2FsbGVncmV4IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwKKyAgICAgIFRULmZpbmQoInBzcCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgTWlwc0FCSSA9IEVBQkk7CisgICAgSXNTaW5nbGVGbG9hdCA9IHRydWU7CisgICAgTWlwc0FyY2hWZXJzaW9uID0gTWlwczI7CisgICAgSGFzVkZQVSA9IHRydWU7IC8vIEVuYWJsZXMgQWxsZWdyZXggVmVjdG9yIEZQVSAobm90IHN1cHBvcnRlZCB5ZXQpCisgICAgSGFzU0VJblJlZyA9IHRydWU7CisgICAgSGFzQml0Q291bnQgPSB0cnVlOworICAgIEhhc1N3YXAgPSB0cnVlOworICAgIEhhc0NvbmRNb3YgPSB0cnVlOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1N1YnRhcmdldC5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNTdWJ0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDVmZDIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNTdWJ0YXJnZXQuaApAQCAtMCwwICsxLDEyMyBAQAorLy89PT09PS0tIE1pcHNTdWJ0YXJnZXQuaCAtIERlZmluZSBTdWJ0YXJnZXQgZm9yIHRoZSBNaXBzIC0tLS0tKi0gQysrIC0qLS09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1pcHMgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0U3VidGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTUlQU1NVQlRBUkdFVF9ICisjZGVmaW5lIE1JUFNTVUJUQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1pcHNTdWJ0YXJnZXQgOiBwdWJsaWMgVGFyZ2V0U3VidGFyZ2V0IHsKKworcHVibGljOgorICBlbnVtIE1pcHNBQklFbnVtIHsKKyAgICBPMzIsIE82NCwgTjMyLCBONjQsIEVBQkkKKyAgfTsgCisKK3Byb3RlY3RlZDoKKworICBlbnVtIE1pcHNBcmNoRW51bSB7CisgICAgTWlwczEsIE1pcHMyLCBNaXBzMywgTWlwczQsIE1pcHMzMiwgTWlwczMycjIsIE1pcHM2NCwgTWlwczY0cjIKKyAgfTsKKworICAvLyBNaXBzIGFyY2hpdGVjdHVyZSB2ZXJzaW9uIAorICBNaXBzQXJjaEVudW0gTWlwc0FyY2hWZXJzaW9uOworCisgIC8vIE1pcHMgc3VwcG9ydGVkIEFCSXMgCisgIE1pcHNBQklFbnVtIE1pcHNBQkk7CisKKyAgLy8gSXNMaXR0bGUgLSBUaGUgdGFyZ2V0IGlzIExpdHRsZSBFbmRpYW4KKyAgYm9vbCBJc0xpdHRsZTsKKworICAvLyBJc1NpbmdsZUZsb2F0IC0gVGhlIHRhcmdldCBvbmx5IHN1cHBvcnRzIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQKKyAgLy8gcG9pbnQgb3BlcmF0aW9ucy4gVGhpcyBlbmFibGUgdGhlIHRhcmdldCB0byB1c2UgYWxsIDMyIDMyLWJpdAorICAvLyBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaW5zdGVhZCBvZiBvbmx5IHVzaW5nIGV2ZW4gb25lcy4KKyAgYm9vbCBJc1NpbmdsZUZsb2F0OworCisgIC8vIElzRlA2NGJpdCAtIFRoZSB0YXJnZXQgcHJvY2Vzc29yIGhhcyA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLgorICBib29sIElzRlA2NGJpdDsKKworICAvLyBJc0ZQNjRiaXQgLSBHZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzIGFyZSA2NCBiaXRzIHdpZGUKKyAgYm9vbCBJc0dQNjRiaXQ7CisKKyAgLy8gSGFzVkZQVSAtIFByb2Nlc3NvciBoYXMgYSB2ZWN0b3IgZmxvYXRpbmcgcG9pbnQgdW5pdC4KKyAgYm9vbCBIYXNWRlBVOworCisgIC8vIGlzTGludXggLSBUYXJnZXQgc3lzdGVtIGlzIExpbnV4LiBJcyBmYWxzZSB3ZSBjb25zaWRlciBFTEZPUyBmb3Igbm93LgorICBib29sIElzTGludXg7CisKKyAgLy8vIEZlYXR1cmVzIHJlbGF0ZWQgdG8gdGhlIHByZXNlbmNlIG9mIHNwZWNpZmljIGluc3RydWN0aW9ucy4KKyAgCisgIC8vIEhhc1NFSW5SZWcgLSBTRUIgYW5kIFNFSCAoc2lnbmV4dCBpbiByZWdpc3RlcikgaW5zdHJ1Y3Rpb25zLgorICBib29sIEhhc1NFSW5SZWc7CisKKyAgLy8gSGFzQ29uZE1vdiAtIENvbmRpdGlvbmFsIG1vdiAoTU9WWiwgTU9WTikgaW5zdHJ1Y3Rpb25zLgorICBib29sIEhhc0NvbmRNb3Y7CisKKyAgLy8gSGFzTXVsRGl2QWRkIC0gTXVsdGlwbHkgYWRkIGFuZCBzdWIgKE1BREQsIE1BRER1LCBNU1VCLCBNU1VCdSkgCisgIC8vIGluc3RydWN0aW9ucy4KKyAgYm9vbCBIYXNNdWxEaXZBZGQ7CisKKyAgLy8gSGFzTWluTWF4IC0gTUlOIGFuZCBNQVggaW5zdHJ1Y3Rpb25zLgorICBib29sIEhhc01pbk1heDsKKworICAvLyBIYXNTd2FwIC0gQnl0ZSBhbmQgaGFsZiBzd2FwIGluc3RydWN0aW9ucy4KKyAgYm9vbCBIYXNTd2FwOworCisgIC8vIEhhc0JpdENvdW50IC0gQ291bnQgbGVhZGluZyAnMScgYW5kICcwJyBiaXRzLgorICBib29sIEhhc0JpdENvdW50OworCisgIEluc3RySXRpbmVyYXJ5RGF0YSBJbnN0ckl0aW5zOworCitwdWJsaWM6CisKKyAgLy8vIE9ubHkgTzMyIGFuZCBFQUJJIHN1cHBvcnRlZCByaWdodCBub3cuCisgIGJvb2wgaXNBQklfRUFCSSgpIGNvbnN0IHsgcmV0dXJuIE1pcHNBQkkgPT0gRUFCSTsgfQorICBib29sIGlzQUJJX08zMigpIGNvbnN0IHsgcmV0dXJuIE1pcHNBQkkgPT0gTzMyOyB9CisgIHVuc2lnbmVkIGdldFRhcmdldEFCSSgpIGNvbnN0IHsgcmV0dXJuIE1pcHNBQkk7IH0KKworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgZGF0YSBtZW1iZXJzIHRvIG1hdGNoIHRoYXQKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgdHJpcGxlLgorICBNaXBzU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTLCBib29sIGxpdHRsZSk7CisgIAorICAvLy8gUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyAtIFBhcnNlcyBmZWF0dXJlcyBzdHJpbmcgc2V0dGluZyBzcGVjaWZpZWQgCisgIC8vLyBzdWJ0YXJnZXQgb3B0aW9ucy4gIERlZmluaXRpb24gb2YgZnVuY3Rpb24gaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGJsZ2VuLgorICBzdGQ6OnN0cmluZyBQYXJzZVN1YnRhcmdldEZlYXR1cmVzKGNvbnN0IHN0ZDo6c3RyaW5nICZGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQ1BVKTsKKworICBib29sIGlzTWlwczEoKSBjb25zdCB7IHJldHVybiBNaXBzQXJjaFZlcnNpb24gPT0gTWlwczE7IH0KKworICBib29sIGlzTGl0dGxlKCkgY29uc3QgeyByZXR1cm4gSXNMaXR0bGU7IH0KKyAgYm9vbCBpc0ZQNjRiaXQoKSBjb25zdCB7IHJldHVybiBJc0ZQNjRiaXQ7IH0KKyAgYm9vbCBpc0dQNjRiaXQoKSBjb25zdCB7IHJldHVybiBJc0dQNjRiaXQ7IH0KKyAgYm9vbCBpc0dQMzJiaXQoKSBjb25zdCB7IHJldHVybiAhSXNHUDY0Yml0OyB9CisgIGJvb2wgaXNTaW5nbGVGbG9hdCgpIGNvbnN0IHsgcmV0dXJuIElzU2luZ2xlRmxvYXQ7IH0KKyAgYm9vbCBpc05vdFNpbmdsZUZsb2F0KCkgY29uc3QgeyByZXR1cm4gIUlzU2luZ2xlRmxvYXQ7IH0KKyAgYm9vbCBoYXNWRlBVKCkgY29uc3QgeyByZXR1cm4gSGFzVkZQVTsgfQorICBib29sIGlzTGludXgoKSBjb25zdCB7IHJldHVybiBJc0xpbnV4OyB9CisKKyAgLy8vIEZlYXR1cmVzIHJlbGF0ZWQgdG8gdGhlIHByZXNlbmNlIG9mIHNwZWNpZmljIGluc3RydWN0aW9ucy4KKyAgYm9vbCBoYXNTRUluUmVnKCkgICBjb25zdCB7IHJldHVybiBIYXNTRUluUmVnOyB9CisgIGJvb2wgaGFzQ29uZE1vdigpICAgY29uc3QgeyByZXR1cm4gSGFzQ29uZE1vdjsgfQorICBib29sIGhhc011bERpdkFkZCgpIGNvbnN0IHsgcmV0dXJuIEhhc011bERpdkFkZDsgfQorICBib29sIGhhc01pbk1heCgpICAgIGNvbnN0IHsgcmV0dXJuIEhhc01pbk1heDsgfQorICBib29sIGhhc1N3YXAoKSAgICAgIGNvbnN0IHsgcmV0dXJuIEhhc1N3YXA7IH0KKyAgYm9vbCBoYXNCaXRDb3VudCgpICBjb25zdCB7IHJldHVybiBIYXNCaXRDb3VudDsgfQorfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNUYXJnZXRNYWNoaW5lLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzVGFyZ2V0TWFjaGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzZWI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzVGFyZ2V0TWFjaGluZS5jcHAKQEAgLTAsMCArMSw3NyBAQAorLy89PT0tLSBNaXBzVGFyZ2V0TWFjaGluZS5jcHAgLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgTWlwcyAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbXBsZW1lbnRzIHRoZSBpbmZvIGFib3V0IE1pcHMgdGFyZ2V0IHNwZWMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1pcHMuaCIKKyNpbmNsdWRlICJNaXBzTUNBc21JbmZvLmgiCisjaW5jbHVkZSAiTWlwc1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVNaXBzVGFyZ2V0KCkgeworICAvLyBSZWdpc3RlciB0aGUgdGFyZ2V0LgorICBSZWdpc3RlclRhcmdldE1hY2hpbmU8TWlwc1RhcmdldE1hY2hpbmU+IFgoVGhlTWlwc1RhcmdldCk7CisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxNaXBzZWxUYXJnZXRNYWNoaW5lPiBZKFRoZU1pcHNlbFRhcmdldCk7CisgIFJlZ2lzdGVyQXNtSW5mbzxNaXBzTUNBc21JbmZvPiBBKFRoZU1pcHNUYXJnZXQpOworICBSZWdpc3RlckFzbUluZm88TWlwc01DQXNtSW5mbz4gQihUaGVNaXBzZWxUYXJnZXQpOworfQorCisvLyBEYXRhTGF5b3V0IC0tPiBCaWctZW5kaWFuLCAzMi1iaXQgcG9pbnRlci9BQkkvYWxpZ25tZW50CisvLyBUaGUgc3RhY2sgaXMgYWx3YXlzIDggYnl0ZSBhbGlnbmVkCisvLyBPbiBmdW5jdGlvbiBwcm9sb2d1ZSwgdGhlIHN0YWNrIGlzIGNyZWF0ZWQgYnkgZGVjcmVtZW50aW5nCisvLyBpdHMgcG9pbnRlci4gT25jZSBkZWNyZW1lbnRlZCwgYWxsIHJlZmVyZW5jZXMgYXJlIGRvbmUgd2l0aCBwb3NpdGl2ZQorLy8gb2Zmc2V0IGZyb20gdGhlIHN0YWNrL2ZyYW1lIHBvaW50ZXIsIHVzaW5nIFN0YWNrR3Jvd3NVcCBlbmFibGVzIAorLy8gYW4gZWFzaWVyIGhhbmRsaW5nLgorLy8gVXNpbmcgQ29kZU1vZGVsOjpMYXJnZSBlbmFibGVzIGRpZmZlcmVudCBDQUxMIGJlaGF2aW9yLgorTWlwc1RhcmdldE1hY2hpbmU6OgorTWlwc1RhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsIGNvbnN0IHN0ZDo6c3RyaW5nICZGUywKKyAgICAgICAgICAgICAgICAgIGJvb2wgaXNMaXR0bGU9ZmFsc2UpOgorICBMTFZNVGFyZ2V0TWFjaGluZShULCBUVCksCisgIFN1YnRhcmdldChUVCwgRlMsIGlzTGl0dGxlKSwgCisgIERhdGFMYXlvdXQoaXNMaXR0bGUgPyBzdGQ6OnN0cmluZygiZS1wOjMyOjMyOjMyLWk4Ojg6MzItaTE2OjE2OjMyLW4zMiIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJFLXA6MzI6MzI6MzItaTg6ODozMi1pMTY6MTY6MzItbjMyIikpLCAKKyAgSW5zdHJJbmZvKCp0aGlzKSwgCisgIEZyYW1lSW5mbyhUYXJnZXRGcmFtZUluZm86OlN0YWNrR3Jvd3NVcCwgOCwgMCksCisgIFRMSW5mbygqdGhpcyksIFRTSW5mbygqdGhpcykgeworICAvLyBBYmljYWxsIGVuYWJsZXMgUElDIGJ5IGRlZmF1bHQKKyAgaWYgKGdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpEZWZhdWx0KSB7CisgICAgaWYgKFN1YnRhcmdldC5pc0FCSV9PMzIoKSkKKyAgICAgIHNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6UElDXyk7CisgICAgZWxzZQorICAgICAgc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpTdGF0aWMpOworICB9Cit9CisKK01pcHNlbFRhcmdldE1hY2hpbmU6OgorTWlwc2VsVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKSA6CisgIE1pcHNUYXJnZXRNYWNoaW5lKFQsIFRULCBGUywgdHJ1ZSkge30KKworLy8gSW5zdGFsbCBhbiBpbnN0cnVjdGlvbiBzZWxlY3RvciBwYXNzIHVzaW5nIAorLy8gdGhlIElTZWxEYWcgdG8gZ2VuIE1pcHMgY29kZS4KK2Jvb2wgTWlwc1RhcmdldE1hY2hpbmU6OgorYWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSAKK3sKKyAgUE0uYWRkKGNyZWF0ZU1pcHNJU2VsRGFnKCp0aGlzKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gSW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IHdhbnQgdG8gcnVuIHBhc3NlcyBpbW1lZGlhdGVseSBiZWZvcmUgCisvLyBtYWNoaW5lIGNvZGUgaXMgZW1pdHRlZC4gcmV0dXJuIHRydWUgaWYgLXByaW50LW1hY2hpbmVpbnN0cnMgc2hvdWxkIAorLy8gcHJpbnQgb3V0IHRoZSBjb2RlIGFmdGVyIHRoZSBwYXNzZXMuCitib29sIE1pcHNUYXJnZXRNYWNoaW5lOjoKK2FkZFByZUVtaXRQYXNzKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSAKK3sKKyAgUE0uYWRkKGNyZWF0ZU1pcHNEZWxheVNsb3RGaWxsZXJQYXNzKCp0aGlzKSk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNUYXJnZXRNYWNoaW5lLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1RhcmdldE1hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjM5NzZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNUYXJnZXRNYWNoaW5lLmgKQEAgLTAsMCArMSw3NyBAQAorLy89PT0tLSBNaXBzVGFyZ2V0TWFjaGluZS5oIC0gRGVmaW5lIFRhcmdldE1hY2hpbmUgZm9yIE1pcHMgLTAwLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1pcHMgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0TWFjaGluZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE1JUFNUQVJHRVRNQUNISU5FX0gKKyNkZWZpbmUgTUlQU1RBUkdFVE1BQ0hJTkVfSAorCisjaW5jbHVkZSAiTWlwc1N1YnRhcmdldC5oIgorI2luY2x1ZGUgIk1pcHNJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJNaXBzSVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiTWlwc1NlbGVjdGlvbkRBR0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKyAgCisgIGNsYXNzIE1pcHNUYXJnZXRNYWNoaW5lIDogcHVibGljIExMVk1UYXJnZXRNYWNoaW5lIHsKKyAgICBNaXBzU3VidGFyZ2V0ICAgICAgIFN1YnRhcmdldDsKKyAgICBjb25zdCBUYXJnZXREYXRhICAgIERhdGFMYXlvdXQ7IC8vIENhbGN1bGF0ZXMgdHlwZSBzaXplICYgYWxpZ25tZW50CisgICAgTWlwc0luc3RySW5mbyAgICAgICBJbnN0ckluZm87CisgICAgVGFyZ2V0RnJhbWVJbmZvICAgICBGcmFtZUluZm87CisgICAgTWlwc1RhcmdldExvd2VyaW5nICBUTEluZm87CisgICAgTWlwc1NlbGVjdGlvbkRBR0luZm8gVFNJbmZvOworICBwdWJsaWM6CisgICAgTWlwc1RhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTLCBib29sIGlzTGl0dGxlKTsKKyAgICAKKyAgICB2aXJ0dWFsIGNvbnN0IE1pcHNJbnN0ckluZm8gICAqZ2V0SW5zdHJJbmZvKCkgICAgIGNvbnN0IAorICAgIHsgcmV0dXJuICZJbnN0ckluZm87IH0KKyAgICB2aXJ0dWFsIGNvbnN0IFRhcmdldEZyYW1lSW5mbyAqZ2V0RnJhbWVJbmZvKCkgICAgIGNvbnN0IAorICAgIHsgcmV0dXJuICZGcmFtZUluZm87IH0KKyAgICB2aXJ0dWFsIGNvbnN0IE1pcHNTdWJ0YXJnZXQgICAqZ2V0U3VidGFyZ2V0SW1wbCgpIGNvbnN0IAorICAgIHsgcmV0dXJuICZTdWJ0YXJnZXQ7IH0KKyAgICB2aXJ0dWFsIGNvbnN0IFRhcmdldERhdGEgICAgICAqZ2V0VGFyZ2V0RGF0YSgpICAgIGNvbnN0IAorICAgIHsgcmV0dXJuICZEYXRhTGF5b3V0O30KKworICAgIHZpcnR1YWwgY29uc3QgTWlwc1JlZ2lzdGVySW5mbyAqZ2V0UmVnaXN0ZXJJbmZvKCkgIGNvbnN0IHsKKyAgICAgIHJldHVybiAmSW5zdHJJbmZvLmdldFJlZ2lzdGVySW5mbygpOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgTWlwc1RhcmdldExvd2VyaW5nICpnZXRUYXJnZXRMb3dlcmluZygpIGNvbnN0IHsgCisgICAgICByZXR1cm4gJlRMSW5mbzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IE1pcHNTZWxlY3Rpb25EQUdJbmZvKiBnZXRTZWxlY3Rpb25EQUdJbmZvKCkgY29uc3QgeworICAgICAgcmV0dXJuICZUU0luZm87CisgICAgfQorCisgICAgLy8gUGFzcyBQaXBlbGluZSBDb25maWd1cmF0aW9uCisgICAgdmlydHVhbCBib29sIGFkZEluc3RTZWxlY3RvcihQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworICAgIHZpcnR1YWwgYm9vbCBhZGRQcmVFbWl0UGFzcyhQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisgIH07CisKKy8vLyBNaXBzZWxUYXJnZXRNYWNoaW5lIC0gTWlwc2VsIHRhcmdldCBtYWNoaW5lLgorLy8vCitjbGFzcyBNaXBzZWxUYXJnZXRNYWNoaW5lIDogcHVibGljIE1pcHNUYXJnZXRNYWNoaW5lIHsKK3B1YmxpYzoKKyAgTWlwc2VsVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1RhcmdldE9iamVjdEZpbGUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNUYXJnZXRPYmplY3RGaWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDVmNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL01pcHNUYXJnZXRPYmplY3RGaWxlLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLy89PT0tLSBNaXBzVGFyZ2V0T2JqZWN0RmlsZS5jcHAgLSBNaXBzIG9iamVjdCBmaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1pcHNUYXJnZXRPYmplY3RGaWxlLmgiCisjaW5jbHVkZSAiTWlwc1N1YnRhcmdldC5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25FTEYuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PHVuc2lnbmVkPgorU1NUaHJlc2hvbGQoIm1pcHMtc3NlY3Rpb24tdGhyZXNob2xkIiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICAgIGNsOjpkZXNjKCJTbWFsbCBkYXRhIGFuZCBic3Mgc2VjdGlvbiB0aHJlc2hvbGQgc2l6ZSAoZGVmYXVsdD04KSIpLAorICAgICAgICAgICAgY2w6OmluaXQoOCkpOworCit2b2lkIE1pcHNUYXJnZXRPYmplY3RGaWxlOjpJbml0aWFsaXplKE1DQ29udGV4dCAmQ3R4LCBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSl7CisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRjo6SW5pdGlhbGl6ZShDdHgsIFRNKTsKKyAKKyAgU21hbGxEYXRhU2VjdGlvbiA9CisgICAgZ2V0Q29udGV4dCgpLmdldEVMRlNlY3Rpb24oIi5zZGF0YSIsIE1DU2VjdGlvbkVMRjo6U0hUX1BST0dCSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX1dSSVRFIHxNQ1NlY3Rpb25FTEY6OlNIRl9BTExPQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZDo6Z2V0RGF0YVJlbCgpKTsKKyAgCisgIFNtYWxsQlNTU2VjdGlvbiA9CisgICAgZ2V0Q29udGV4dCgpLmdldEVMRlNlY3Rpb24oIi5zYnNzIiwgTUNTZWN0aW9uRUxGOjpTSFRfTk9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX1dSSVRFIHxNQ1NlY3Rpb25FTEY6OlNIRl9BTExPQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZDo6Z2V0QlNTKCkpOworICAKK30KKworLy8gQSBhZGRyZXNzIG11c3QgYmUgbG9hZGVkIGZyb20gYSBzbWFsbCBzZWN0aW9uIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiB0aGUgCisvLyBzbWFsbCBzZWN0aW9uIHNpemUgdGhyZXNob2xkLiBEYXRhIGluIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGFkZHJlc3NlZCB1c2luZyAKKy8vIGdwX3JlbCBvcGVyYXRvci4KK3N0YXRpYyBib29sIElzSW5TbWFsbFNlY3Rpb24odWludDY0X3QgU2l6ZSkgeworICByZXR1cm4gU2l6ZSA+IDAgJiYgU2l6ZSA8PSBTU1RocmVzaG9sZDsKK30KKworYm9vbCBNaXBzVGFyZ2V0T2JqZWN0RmlsZTo6SXNHbG9iYWxJblNtYWxsU2VjdGlvbihjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3QgeworICBpZiAoR1YtPmlzRGVjbGFyYXRpb24oKSB8fCBHVi0+aGFzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICByZXR1cm4gSXNHbG9iYWxJblNtYWxsU2VjdGlvbihHViwgVE0sIGdldEtpbmRGb3JHbG9iYWwoR1YsIFRNKSk7Cit9CisKKy8vLyBJc0dsb2JhbEluU21hbGxTZWN0aW9uIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBnbG9iYWwgYWRkcmVzcyBzaG91bGQgYmUKKy8vLyBwbGFjZWQgaW50byBzbWFsbCBkYXRhL2JzcyBzZWN0aW9uLgorYm9vbCBNaXBzVGFyZ2V0T2JqZWN0RmlsZTo6CitJc0dsb2JhbEluU21hbGxTZWN0aW9uKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kIEtpbmQpIGNvbnN0IHsKKworICAvLyBPbmx5IHVzZSBzbWFsbCBzZWN0aW9uIGZvciBub24gbGludXggdGFyZ2V0cy4KKyAgY29uc3QgTWlwc1N1YnRhcmdldCAmU3VidGFyZ2V0ID0gVE0uZ2V0U3VidGFyZ2V0PE1pcHNTdWJ0YXJnZXQ+KCk7CisgIGlmIChTdWJ0YXJnZXQuaXNMaW51eCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBPbmx5IGdsb2JhbCB2YXJpYWJsZXMsIG5vdCBmdW5jdGlvbnMuCisgIGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVkEgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oR1YpOworICBpZiAoIUdWQSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICAvLyBXZSBjYW4gb25seSBkbyB0aGlzIGZvciBkYXRhcmVsIG9yIEJTUyBvYmplY3RzIGZvciBub3cuCisgIGlmICghS2luZC5pc0JTUygpICYmICFLaW5kLmlzRGF0YVJlbCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIElmIHRoaXMgaXMgYSBpbnRlcm5hbCBjb25zdGFudCBzdHJpbmcsIHRoZXJlIGlzIGEgc3BlY2lhbAorICAvLyBzZWN0aW9uIGZvciBpdCwgYnV0IG5vdCBpbiBzbWFsbCBkYXRhL2Jzcy4KKyAgaWYgKEtpbmQuaXNNZXJnZWFibGUxQnl0ZUNTdHJpbmcoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgVHlwZSAqVHkgPSBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpOworICByZXR1cm4gSXNJblNtYWxsU2VjdGlvbihUTS5nZXRUYXJnZXREYXRhKCktPmdldFR5cGVBbGxvY1NpemUoVHkpKTsKK30KKworCisKK2NvbnN0IE1DU2VjdGlvbiAqTWlwc1RhcmdldE9iamVjdEZpbGU6OgorU2VsZWN0U2VjdGlvbkZvckdsb2JhbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgIE1hbmdsZXIgKk1hbmcsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCB7CisgIC8vIFRPRE86IENvdWxkIGFsc28gc3VwcG9ydCAid2VhayIgc3ltYm9scyBhcyB3ZWxsIHdpdGggIi5nbnUubGlua29uY2Uucy4qIgorICAvLyBzZWN0aW9ucz8KKyAgCisgIC8vIEhhbmRsZSBTbWFsbCBTZWN0aW9uIGNsYXNzaWZpY2F0aW9uIGhlcmUuCisgIGlmIChLaW5kLmlzQlNTKCkgJiYgSXNHbG9iYWxJblNtYWxsU2VjdGlvbihHViwgVE0sIEtpbmQpKQorICAgIHJldHVybiBTbWFsbEJTU1NlY3Rpb247CisgIGlmIChLaW5kLmlzRGF0YU5vUmVsKCkgJiYgSXNHbG9iYWxJblNtYWxsU2VjdGlvbihHViwgVE0sIEtpbmQpKQorICAgIHJldHVybiBTbWFsbERhdGFTZWN0aW9uOworICAKKyAgLy8gT3RoZXJ3aXNlLCB3ZSB3b3JrIHRoZSBzYW1lIGFzIEVMRi4KKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRjo6U2VsZWN0U2VjdGlvbkZvckdsb2JhbChHViwgS2luZCwgTWFuZyxUTSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1RhcmdldE9iamVjdEZpbGUuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9NaXBzVGFyZ2V0T2JqZWN0RmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzN2IxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvTWlwc1RhcmdldE9iamVjdEZpbGUuaApAQCAtMCwwICsxLDQxIEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L01pcHNUYXJnZXRPYmplY3RGaWxlLmggLSBNaXBzIE9iamVjdCBJbmZvIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX01JUFNfVEFSR0VUT0JKRUNURklMRV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX01JUFNfVEFSR0VUT0JKRUNURklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlSW1wbC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgTWlwc1RhcmdldE9iamVjdEZpbGUgOiBwdWJsaWMgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlRUxGIHsKKyAgICBjb25zdCBNQ1NlY3Rpb24gKlNtYWxsRGF0YVNlY3Rpb247CisgICAgY29uc3QgTUNTZWN0aW9uICpTbWFsbEJTU1NlY3Rpb247CisgIHB1YmxpYzoKKyAgICAKKyAgICB2b2lkIEluaXRpYWxpemUoTUNDb250ZXh0ICZDdHgsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKKworICAgIAorICAgIC8vLyBJc0dsb2JhbEluU21hbGxTZWN0aW9uIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBnbG9iYWwgYWRkcmVzcyBzaG91bGQgYmUKKyAgICAvLy8gcGxhY2VkIGludG8gc21hbGwgZGF0YS9ic3Mgc2VjdGlvbi4KKyAgICBib29sIElzR2xvYmFsSW5TbWFsbFNlY3Rpb24oY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSwgU2VjdGlvbktpbmQgS2luZCljb25zdDsKKyAgICBib29sIElzR2xvYmFsSW5TbWFsbFNlY3Rpb24oY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Q7ICAKKyAgICAKKyAgICBjb25zdCBNQ1NlY3Rpb24gKlNlbGVjdFNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5nbGVyICpNYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Q7CisgICAgICAKKyAgICAvLyBUT0RPOiBDbGFzc2lmeSBnbG9iYWxzIGFzIG1pcHMgd2lzaGVzLgorICB9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWQ1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDcgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4gKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1NaXBzSW5mbworICBNaXBzVGFyZ2V0SW5mby5jcHAKKyAgKQorCithZGRfZGVwZW5kZW5jaWVzKExMVk1NaXBzSW5mbyBNaXBzQ29kZUdlblRhYmxlX2dlbikKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9UYXJnZXRJbmZvL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL1RhcmdldEluZm8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmNGUxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvTWlwcy9UYXJnZXRJbmZvL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L01pcHMvVGFyZ2V0SW5mby9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCitMRVZFTCA9IC4uLy4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1NaXBzSW5mbworCisjIEhhY2s6IHdlIG5lZWQgdG8gaW5jbHVkZSAnbWFpbicgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQRkxBR1MgPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL1RhcmdldEluZm8vTWlwc1RhcmdldEluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9NaXBzL1RhcmdldEluZm8vTWlwc1RhcmdldEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjM2Q2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L01pcHMvVGFyZ2V0SW5mby9NaXBzVGFyZ2V0SW5mby5jcHAKQEAgLTAsMCArMSwyMSBAQAorLy89PT0tLSBNaXBzVGFyZ2V0SW5mby5jcHAgLSBNaXBzIFRhcmdldCBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk1pcHMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGFyZ2V0IGxsdm06OlRoZU1pcHNUYXJnZXQsIGxsdm06OlRoZU1pcHNlbFRhcmdldDsKKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplTWlwc1RhcmdldEluZm8oKSB7IAorICBSZWdpc3RlclRhcmdldDxUcmlwbGU6Om1pcHM+IFgoVGhlTWlwc1RhcmdldCwgIm1pcHMiLCAiTWlwcyIpOworCisgIFJlZ2lzdGVyVGFyZ2V0PFRyaXBsZTo6bWlwc2VsPiBZKFRoZU1pcHNlbFRhcmdldCwgIm1pcHNlbCIsICJNaXBzZWwiKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZiYjhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9Bc21QcmludGVyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOSBAQAoraW5jbHVkZV9kaXJlY3RvcmllcygKKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uCisgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLgorICApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTVBJQzE2QXNtUHJpbnRlcgorICBQSUMxNkFzbVByaW50ZXIuY3BwCisgICkKK2FkZF9kZXBlbmRlbmNpZXMoTExWTVBJQzE2QXNtUHJpbnRlciBQSUMxNkNvZGVHZW5UYWJsZV9nZW4pCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L0FzbVByaW50ZXIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L0FzbVByaW50ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjMDY4NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvQXNtUHJpbnRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RhcmdldC9QSUMxNi9Bc21QcmludGVyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNUElDMTZBc21QcmludGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBwaWMxNiB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFAuRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvQXNtUHJpbnRlci9QSUMxNkFzbVByaW50ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9Bc21QcmludGVyL1BJQzE2QXNtUHJpbnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2NTgxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvQXNtUHJpbnRlci9QSUMxNkFzbVByaW50ZXIuY3BwCkBAIC0wLDAgKzEsNTEyIEBACisvLz09PS0tIFBJQzE2QXNtUHJpbnRlci5jcHAgLSBQSUMxNiBMTFZNIGFzc2VtYmx5IHdyaXRlciAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHByaW50ZXIgdGhhdCBjb252ZXJ0cyBmcm9tIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorLy8gb2YgbWFjaGluZS1kZXBlbmRlbnQgTExWTSBjb2RlIHRvIFBJQzE2IGFzc2VtYmx5IGxhbmd1YWdlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJQSUMxNkFCSU5hbWVzLmgiCisjaW5jbHVkZSAiUElDMTZBc21QcmludGVyLmgiCisjaW5jbHVkZSAiUElDMTZTZWN0aW9uLmgiCisjaW5jbHVkZSAiUElDMTZNQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L01hbmdsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKyNpbmNsdWRlICJQSUMxNkdlbkFzbVdyaXRlci5pbmMiCisKK1BJQzE2QXNtUHJpbnRlcjo6UElDMTZBc21QcmludGVyKFRhcmdldE1hY2hpbmUgJlRNLCBNQ1N0cmVhbWVyICZTdHJlYW1lcikKKzogQXNtUHJpbnRlcihUTSwgU3RyZWFtZXIpLCBEYmdJbmZvKFN0cmVhbWVyLCBUTS5nZXRNQ0FzbUluZm8oKSkgeworICBQTUFJID0gc3RhdGljX2Nhc3Q8Y29uc3QgUElDMTZNQ0FzbUluZm8qPihUTS5nZXRNQ0FzbUluZm8oKSk7CisgIFBUT0YgPSAmZ2V0T2JqRmlsZUxvd2VyaW5nKCk7Cit9CisKK3ZvaWQgUElDMTZBc21QcmludGVyOjpFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSkgeworICBTbWFsbFN0cmluZzwxMjg+IFN0cjsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhTdHIpOworICBwcmludEluc3RydWN0aW9uKE1JLCBPUyk7CisgIAorICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChPUy5zdHIoKSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0RnVuY3Rpb25Db2xvcihjb25zdCBGdW5jdGlvbiAqRikgeworICBpZiAoRi0+aGFzU2VjdGlvbigpKSB7CisgICAgc3RkOjpzdHJpbmcgU2VjdG4gPSBGLT5nZXRTZWN0aW9uKCk7CisgICAgc3RkOjpzdHJpbmcgU3RyVG9GaW5kID0gIk92ZXJsYXk9IjsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIFBvcyA9IFNlY3RuLmZpbmQoU3RyVG9GaW5kKTsKKworICAgIC8vIFJldHJlaXZlIHRoZSBjb2xvciBudW1iZXIgaWYgdGhlIGtleSBpcyBmb3VuZC4KKyAgICBpZiAoUG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBQb3MgKz0gU3RyVG9GaW5kLmxlbmd0aCgpOworICAgICAgc3RkOjpzdHJpbmcgQ29sb3IgPSAiIjsKKyAgICAgIGNoYXIgYyA9IFNlY3RuLmF0KFBvcyk7CisgICAgICAvLyBBIENvbG9yIGNhbiBvbmx5IGNvbnNpc3Qgb2YgZGlnaXRzLgorICAgICAgd2hpbGUgKGMgPj0gJzAnICYmIGM8PSAnOScpIHsKKyAgICAgICAgQ29sb3IuYXBwZW5kKDEsYyk7CisgICAgICAgIFBvcysrOworICAgICAgICBpZiAoUG9zID49IFNlY3RuLmxlbmd0aCgpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjID0gU2VjdG4uYXQoUG9zKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhdG9pKENvbG9yLmNfc3RyKCkpOworICAgIH0KKyAgfQorCisgIC8vIENvbG9yIHdhcyBub3Qgc2V0IGZvciBmdW5jdGlvbiwgc28gcmV0dXJuIC0xLgorICByZXR1cm4gLTE7Cit9CisKKy8vIENvbG9yIHRoZSBBdXRvIHNlY3Rpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiAKK3ZvaWQgUElDMTZBc21QcmludGVyOjpDb2xvckF1dG9TZWN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIHN0ZDo6c3RyaW5nIFNlY3Rpb25OYW1lID0gUEFOOjpnZXRBdXRvc1NlY3Rpb25OYW1lKEN1cnJlbnRGblN5bS0+Z2V0TmFtZSgpKTsKKyAgUElDMTZTZWN0aW9uKiBTZWN0aW9uID0gUFRPRi0+ZmluZFBJQzE2U2VjdGlvbihTZWN0aW9uTmFtZSk7CisgIGlmIChTZWN0aW9uICE9IE5VTEwpIHsKKyAgICBpbnQgQ29sb3IgPSBnZXRGdW5jdGlvbkNvbG9yKEYpOworICAgIGlmIChDb2xvciA+PSAwKQorICAgICAgU2VjdGlvbi0+c2V0Q29sb3IoQ29sb3IpOworICB9Cit9CisKKworLy8vIHJ1bk9uTWFjaGluZUZ1bmN0aW9uIC0gVGhpcyBlbWl0cyB0aGUgZnJhbWUgc2VjdGlvbiwgYXV0b3Mgc2VjdGlvbiBhbmQgCisvLy8gYXNzZW1ibHkgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uIEFsc28gdGFrZXMgY2FyZSBvZiBmdW5jdGlvbiBiZWdpbiBkZWJ1ZworLy8vIGRpcmVjdGl2ZSBhbmQgZmlsZSBiZWdpbiBkZWJ1ZyBkaXJlY3RpdmUgKGlmIHJlcXVpcmVkKSBmb3IgdGhlIGZ1bmN0aW9uLgorLy8vCitib29sIFBJQzE2QXNtUHJpbnRlcjo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICAvLyBUaGlzIGNhbGxzIHRoZSBiYXNlIGNsYXNzIGZ1bmN0aW9uIHJlcXVpcmVkIHRvIGJlIGNhbGxlZCBhdCBiZWdpbm5pbmcKKyAgLy8gb2YgcnVuT25NYWNoaW5lRnVuY3Rpb24uCisgIFNldHVwTWFjaGluZUZ1bmN0aW9uKE1GKTsKKworICAvLyBQdXQgdGhlIGNvbG9yIGluZm9ybWF0aW9uIGZyb20gZnVuY3Rpb24gdG8gaXRzIGF1dG8gc2VjdGlvbi4KKyAgY29uc3QgRnVuY3Rpb24gKkYgPSBNRi5nZXRGdW5jdGlvbigpOworICBDb2xvckF1dG9TZWN0aW9uKEYpOworCisgIC8vIEVtaXQgdGhlIGZ1bmN0aW9uIGZyYW1lIChhcmdzIGFuZCB0ZW1wcykuCisgIEVtaXRGdW5jdGlvbkZyYW1lKE1GKTsKKworICBEYmdJbmZvLkJlZ2luRnVuY3Rpb24oTUYpOworCisgIC8vIE5vdyBlbWl0IHRoZSBpbnN0cnVjdGlvbnMgb2YgZnVuY3Rpb24gaW4gaXRzIGNvZGUgc2VjdGlvbi4KKyAgY29uc3QgTUNTZWN0aW9uICpmQ29kZVNlY3Rpb24gPSAKKyAgICBnZXRPYmpGaWxlTG93ZXJpbmcoKS5TZWN0aW9uRm9yQ29kZShDdXJyZW50Rm5TeW0tPmdldE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFOOjppc0lTUihGLT5nZXRTZWN0aW9uKCkpKTsKKworICAvLyBTdGFydCB0aGUgQ29kZSBTZWN0aW9uLgorICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKGZDb2RlU2VjdGlvbik7CisKKyAgLy8gRW1pdCB0aGUgZnJhbWUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gYXQgdGhlIGJlZ2lubmluZyBvZiBjb2RlLgorICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHRyZXRsdyAgbG93KCIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoUEFOOjpnZXRGcmFtZUxhYmVsKEN1cnJlbnRGblN5bS0+Z2V0TmFtZSgpKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIpOworICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHRyZXRsdyAgaGlnaCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoUEFOOjpnZXRGcmFtZUxhYmVsKEN1cnJlbnRGblN5bS0+Z2V0TmFtZSgpKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIpOworCisgIC8vIEVtaXQgZnVuY3Rpb24gc3RhcnQgbGFiZWwuCisgIE91dFN0cmVhbWVyLkVtaXRMYWJlbChDdXJyZW50Rm5TeW0pOworCisgIERlYnVnTG9jIEN1ckRMOworICAvLyBQcmludCBvdXQgY29kZSBmb3IgdGhlIGZ1bmN0aW9uLgorICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IgSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworCisgICAgLy8gUHJpbnQgYSBsYWJlbCBmb3IgdGhlIGJhc2ljIGJsb2NrLgorICAgIGlmIChJICE9IE1GLmJlZ2luKCkpCisgICAgICBFbWl0QmFzaWNCbG9ja1N0YXJ0KEkpOworICAgIAorICAgIC8vIFByaW50IGEgYmFzaWMgYmxvY2suCisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSUkgPSBJLT5iZWdpbigpLCBFID0gSS0+ZW5kKCk7CisgICAgICAgICBJSSAhPSBFOyArK0lJKSB7CisgICAgICAvLyBFbWl0IHRoZSBsaW5lIGRpcmVjdGl2ZSBpZiBzb3VyY2UgbGluZSBjaGFuZ2VkLgorICAgICAgRGVidWdMb2MgREwgPSBJSS0+Z2V0RGVidWdMb2MoKTsKKyAgICAgIGlmICghREwuaXNVbmtub3duKCkgJiYgREwgIT0gQ3VyREwpIHsKKyAgICAgICAgRGJnSW5mby5DaGFuZ2VEZWJ1Z0xvYyhNRiwgREwpOworICAgICAgICBDdXJETCA9IERMOworICAgICAgfQorICAgICAgICAKKyAgICAgIC8vIFByaW50IHRoZSBhc3NlbWJseSBmb3IgdGhlIGluc3RydWN0aW9uLgorICAgICAgRW1pdEluc3RydWN0aW9uKElJKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIEVtaXQgZnVuY3Rpb24gZW5kIGRlYnVnIGRpcmVjdGl2ZXMuCisgIERiZ0luZm8uRW5kRnVuY3Rpb24oTUYpOworCisgIHJldHVybiBmYWxzZTsgIC8vIHdlIGRpZG4ndCBtb2RpZnkgYW55dGhpbmcuCit9CisKKworLy8gcHJpbnRPcGVyYW5kIC0gcHJpbnQgb3BlcmFuZCBvZiBpbnNuLgordm9pZCBQSUMxNkFzbVByaW50ZXI6OnByaW50T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKG9wTnVtKTsKKyAgY29uc3QgRnVuY3Rpb24gKkYgPSBNSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXRGdW5jdGlvbigpOworCisgIHN3aXRjaCAoTU8uZ2V0VHlwZSgpKSB7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fUmVnaXN0ZXI6CisgICAgICB7CisgICAgICAgIC8vIEZvciBpbmRpcmVjdCBsb2FkL3N0b3JlIGluc25zLCB0aGUgZnNyIG5hbWUgaXMgcHJpbnRlZCBhcyBJTkRGLgorICAgICAgICBzdGQ6OnN0cmluZyBSZWdOYW1lID0gZ2V0UmVnaXN0ZXJOYW1lKE1PLmdldFJlZygpKTsKKyAgICAgICAgaWYgKChNSS0+Z2V0T3Bjb2RlKCkgPT0gUElDMTY6OmxvYWRfaW5kaXJlY3QpIHx8CisgICAgICAgICAgICAoTUktPmdldE9wY29kZSgpID09IFBJQzE2OjpzdG9yZV9pbmRpcmVjdCkpCisgICAgICAgICAgUmVnTmFtZS5yZXBsYWNlICgwLCAzLCAiSU5ERiIpOworICAgICAgICBPIDw8IFJlZ05hbWU7CisgICAgICB9CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgICBPIDw8IChpbnQpTU8uZ2V0SW1tKCk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOiB7CisgICAgICBNQ1N5bWJvbCAqU3ltID0gTWFuZy0+Z2V0U3ltYm9sKE1PLmdldEdsb2JhbCgpKTsKKyAgICAgIC8vIEZJWE1FOiBjdXJyZW50bHkgd2UgZG8gbm90IGhhdmUgYSBtZW1jcHkgZGVmIGNvbWluZyBpbiB0aGUgbW9kdWxlCisgICAgICAvLyBieSBhbnkgY2hhbmNlLCBhcyB3ZSBkbyBub3QgbGluayBpbiB0aG9zZSBhcyAuYmMgbGliLiBTbyB0aGVzZSBjYWxscworICAgICAgLy8gYXJlIGFsd2F5cyBleHRlcm5hbCBhbmQgaXQgaXMgc2FmZSB0byBlbWl0IGFuIGV4dGVybi4KKyAgICAgIGlmIChQQU46OmlzTWVtSW50cmluc2ljKFN5bS0+Z2V0TmFtZSgpKSkKKyAgICAgICAgTGliY2FsbERlY2xzLmluc2VydChTeW0tPmdldE5hbWUoKSk7CisKKyAgICAgIE8gPDwgKlN5bTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19FeHRlcm5hbFN5bWJvbDogeworICAgICAgIGNvbnN0IGNoYXIgKlNuYW1lID0gTU8uZ2V0U3ltYm9sTmFtZSgpOworICAgICAgIHN0ZDo6c3RyaW5nIFByaW50bmFtZSA9IFNuYW1lOworCisgICAgICAvLyBJbnRyaW5zaWMgc3R1ZmYgbmVlZHMgdG8gYmUgcmVuYW1lZCBpZiB3ZSBhcmUgcHJpbnRpbmcgSUwgZm4uIAorICAgICAgaWYgKFBBTjo6aXNJbnRyaW5zaWNTdHVmZihQcmludG5hbWUpKSB7CisgICAgICAgIGlmIChQQU46OmlzSVNSKEYtPmdldFNlY3Rpb24oKSkpIHsKKyAgICAgICAgICBQcmludG5hbWUgPSBQQU46OlJlbmFtZShTbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVjb3JkIHRoZXNlIGRlY2xzLCB3ZSBuZWVkIHRvIHByaW50IHRoZW0gaW4gYXNtIGFzIGV4dGVybi4KKyAgICAgICAgTGliY2FsbERlY2xzLmluc2VydChQcmludG5hbWUpOworICAgICAgfQorCisgICAgICBPIDw8IFByaW50bmFtZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19NYWNoaW5lQmFzaWNCbG9jazoKKyAgICAgIE8gPDwgKk1PLmdldE1CQigpLT5nZXRTeW1ib2woKTsKKyAgICAgIHJldHVybjsKKworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCIgT3BlcmFuZCB0eXBlIG5vdCBzdXBwb3J0ZWQuIik7CisgIH0KK30KKworLy8vIHByaW50Q0NPcGVyYW5kIC0gUHJpbnQgdGhlIGNvbmQgY29kZSBvcGVyYW5kLgorLy8vCit2b2lkIFBJQzE2QXNtUHJpbnRlcjo6cHJpbnRDQ09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGludCBDQyA9IChpbnQpTUktPmdldE9wZXJhbmQob3BOdW0pLmdldEltbSgpOworICBPIDw8IFBJQzE2Q29uZENvZGVUb1N0cmluZygoUElDMTZDQzo6Q29uZENvZGVzKUNDKTsKK30KKworLy8vIHByaW50TGliY2FsbERlY2xzIC0gcHJpbnQgdGhlIGV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIGNvbXBpbGVyIAorLy8vIGludHJpbnNpY3MuCisvLy8KK3ZvaWQgUElDMTZBc21QcmludGVyOjpwcmludExpYmNhbGxEZWNscygpIHsKKyAgLy8gSWYgbm8gbGliY2FsbHMgdXNlZCwgcmV0dXJuLgorICBpZiAoTGliY2FsbERlY2xzLmVtcHR5KCkpIHJldHVybjsKKworICBPdXRTdHJlYW1lci5BZGRDb21tZW50KCJFeHRlcm5hbCBkZWNscyBmb3IgbGliY2FsbHMgLSBCRUdJTiIpOworICBPdXRTdHJlYW1lci5BZGRCbGFua0xpbmUoKTsKKworICBmb3IgKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgSSA9IExpYmNhbGxEZWNscy5iZWdpbigpLAorICAgICAgIEUgPSBMaWJjYWxsRGVjbHMuZW5kKCk7IEkgIT0gRTsgSSsrKQorICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KE1BSS0+Z2V0RXh0ZXJuRGlyZWN0aXZlKCkgKyBUd2luZSgqSSkpOworCisgIE91dFN0cmVhbWVyLkFkZENvbW1lbnQoIkV4dGVybmFsIGRlY2xzIGZvciBsaWJjYWxscyAtIEVORCIpOworICBPdXRTdHJlYW1lci5BZGRCbGFua0xpbmUoKTsKK30KKworLy8vIGRvSW5pdGlhbGl6YXRpb24gLSBQZXJmb3JtIE1vZHVsZSBsZXZlbCBpbml0aWFsaXphdGlvbnMgaGVyZS4KKy8vLyBPbmUgdGFzayB0aGF0IHdlIGRvIGhlcmUgaXMgdG8gc2VjdGlvbml6ZSBhbGwgZ2xvYmFsIHZhcmlhYmxlcy4KKy8vLyBUaGUgTWVtU2VsT3B0aW1pemVyIHBhc3MgZGVwZW5kcyBvbiB0aGUgc2VjdGlvbml6aW5nLgorLy8vCitib29sIFBJQzE2QXNtUHJpbnRlcjo6ZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJk0pIHsKKyAgYm9vbCBSZXN1bHQgPSBBc21QcmludGVyOjpkb0luaXRpYWxpemF0aW9uKE0pOworCisgIC8vIEV2ZXJ5IGFzbWJseSBjb250YWlucyB0aGVzZSBzdGQgaGVhZGVycy4gCisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXG4jaW5jbHVkZSBwMTZmMXh4eC5pbmMiKSk7CisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiI2luY2x1ZGUgc3RkbWFjcm9zLmluYyIpKTsKKworICAvLyBTZXQgdGhlIHNlY3Rpb24gbmFtZXMgZm9yIGFsbCBnbG9iYWxzLgorICBmb3IgKE1vZHVsZTo6Z2xvYmFsX2l0ZXJhdG9yIEkgPSBNLmdsb2JhbF9iZWdpbigpLCBFID0gTS5nbG9iYWxfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKworICAgIC8vIFJlY29yZCBFeHRlcm5hbCBWYXIgRGVjbHMuCisgICAgaWYgKEktPmlzRGVjbGFyYXRpb24oKSkgeworICAgICAgRXh0ZXJuYWxWYXJEZWNscy5wdXNoX2JhY2soSSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZWNvcmQgRXh0ZXJhbmwgVmFyIERlZnMuCisgICAgaWYgKEktPmhhc0V4dGVybmFsTGlua2FnZSgpIHx8IEktPmhhc0NvbW1vbkxpbmthZ2UoKSkgeworICAgICAgRXh0ZXJuYWxWYXJEZWZzLnB1c2hfYmFjayhJKTsKKyAgICB9CisKKyAgICAvLyBTZWN0aW9uaWZ5IGFjdHVhbCBkYXRhLgorICAgIGlmICghSS0+aGFzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoKSkgeworICAgICAgY29uc3QgTUNTZWN0aW9uICpTID0gZ2V0T2JqRmlsZUxvd2VyaW5nKCkuU2VjdGlvbkZvckdsb2JhbChJLCBNYW5nLCBUTSk7CisgICAgICAKKyAgICAgIEktPnNldFNlY3Rpb24oKChjb25zdCBQSUMxNlNlY3Rpb24gKilTKS0+Z2V0TmFtZSgpKTsKKyAgICB9CisgIH0KKworICBEYmdJbmZvLkJlZ2luTW9kdWxlKE0pOworICBFbWl0RnVuY3Rpb25EZWNscyhNKTsKKyAgRW1pdFVuZGVmaW5lZFZhcnMoTSk7CisgIEVtaXREZWZpbmVkVmFycyhNKTsKKyAgRW1pdElEYXRhKE0pOworICBFbWl0VURhdGEoTSk7CisgIEVtaXRSb21EYXRhKE0pOworICBFbWl0U2hhcmVkVWRhdGEoTSk7CisgIEVtaXRVc2VyU2VjdGlvbnMoTSk7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBFbWl0IGV4dGVybiBkZWNscyBmb3IgZnVuY3Rpb25zIGltcG9ydGVkIGZyb20gb3RoZXIgbW9kdWxlcywgYW5kIGVtaXQKKy8vLyBnbG9iYWwgZGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbiBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIGFuZCB3aGljaCBhcmUKKy8vLyBhdmFpbGFibGUgdG8gb3RoZXIgbW9kdWxlcy4KKy8vLwordm9pZCBQSUMxNkFzbVByaW50ZXI6OkVtaXRGdW5jdGlvbkRlY2xzKE1vZHVsZSAmTSkgeworIC8vIEVtaXQgZGVjbGFyYXRpb25zIGZvciBleHRlcm5hbCBmdW5jdGlvbnMuCisgIE91dFN0cmVhbWVyLkFkZENvbW1lbnQoIkZ1bmN0aW9uIERlY2xhcmF0aW9ucyAtIEJFR0lOIik7CisgIE91dFN0cmVhbWVyLkFkZEJsYW5rTGluZSgpOworICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgSSA9IE0uYmVnaW4oKSwgRSA9IE0uZW5kKCk7IEkgIT0gRTsgSSsrKSB7CisgICAgaWYgKEktPmlzSW50cmluc2ljKCkgfHwgSS0+Z2V0TmFtZSgpID09ICJAYWJvcnQiKQorICAgICAgY29udGludWU7CisgICAgCisgICAgaWYgKCFJLT5pc0RlY2xhcmF0aW9uKCkgJiYgIUktPmhhc0V4dGVybmFsTGlua2FnZSgpKQorICAgICAgY29udGludWU7CisKKyAgICBNQ1N5bWJvbCAqU3ltID0gTWFuZy0+Z2V0U3ltYm9sKEkpOworICAgIAorICAgIC8vIERvIG5vdCBlbWl0IG1lbWNweSwgbWVtc2V0LCBhbmQgbWVtbW92ZSBoZXJlLgorICAgIC8vIENhbGxzIHRvIHRoZXNlIHJvdXRpbmVzIGNhbiBiZSBnZW5lcmF0ZWQgaW4gdHdvIHdheXMsCisgICAgLy8gMS4gVXNlciBjYWxsaW5nIHRoZSBzdGFuZGFyZCBsaWIgZnVuY3Rpb24KKyAgICAvLyAyLiBDb2RlZ2VuIGdlbmVyYXRpbmcgdGhlc2UgY2FsbHMgZm9yIGxsdm0gaW50cmluc2ljcy4KKyAgICAvLyBJbiB0aGUgZmlyc3QgY2FzZSBhIHByb3RvdHlwZSBpcyBhbHJlYWQgYXZhaWxhbGUsIHdoaWxlIGluCisgICAgLy8gc2Vjb25kIGNhc2UgdGhlIGNhbGwgaXMgdmlhIGFuZCBleHRlcm5hbHN5bSBhbmQgdGhlIHByb3RvdHlwZSBpcyBtaXNzaW5nLgorICAgIC8vIFNvIGRlY2xhcmF0aW9ucyBmb3IgdGhlc2UgYXJlIGN1cnJlbnRseSBhbHdheXMgZ2V0dGluZyBwcmludGluZyBieQorICAgIC8vIHRyYWNraW5nIGJvdGgga2luZCBvZiByZWZlcmVuY2VzIGluIHByaW50SW5zdHJ1bmN0aW9uLgorICAgIGlmIChJLT5pc0RlY2xhcmF0aW9uKCkgJiYgUEFOOjppc01lbUludHJpbnNpYyhTeW0tPmdldE5hbWUoKSkpIGNvbnRpbnVlOworCisgICAgY29uc3QgY2hhciAqZGlyZWN0aXZlID0gSS0+aXNEZWNsYXJhdGlvbigpID8gTUFJLT5nZXRFeHRlcm5EaXJlY3RpdmUoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFJLT5nZXRHbG9iYWxEaXJlY3RpdmUoKTsKKyAgICAgIAorICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KGRpcmVjdGl2ZSArIFR3aW5lKFN5bS0+Z2V0TmFtZSgpKSk7CisgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoZGlyZWN0aXZlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShQQU46OmdldFJldHZhbExhYmVsKFN5bS0+Z2V0TmFtZSgpKSkpOworICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KGRpcmVjdGl2ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoUEFOOjpnZXRBcmdzTGFiZWwoU3ltLT5nZXROYW1lKCkpKSk7CisgIH0KKworICBPdXRTdHJlYW1lci5BZGRDb21tZW50KCJGdW5jdGlvbiBEZWNsYXJhdGlvbnMgLSBFTkQiKTsKKyAgT3V0U3RyZWFtZXIuQWRkQmxhbmtMaW5lKCk7CisKK30KKworLy8gRW1pdCB2YXJpYWJsZXMgaW1wb3J0ZWQgZnJvbSBvdGhlciBNb2R1bGVzLgordm9pZCBQSUMxNkFzbVByaW50ZXI6OkVtaXRVbmRlZmluZWRWYXJzKE1vZHVsZSAmTSkgeworICBzdGQ6OnZlY3Rvcjxjb25zdCBHbG9iYWxWYXJpYWJsZSo+IEl0ZW1zID0gRXh0ZXJuYWxWYXJEZWNsczsKKyAgaWYgKCFJdGVtcy5zaXplKCkpIHJldHVybjsKKworICBPdXRTdHJlYW1lci5BZGRDb21tZW50KCJJbXBvcnRlZCBWYXJpYWJsZXMgLSBCRUdJTiIpOworICBPdXRTdHJlYW1lci5BZGRCbGFua0xpbmUoKTsKKyAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IEl0ZW1zLnNpemUoKTsgaisrKQorICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KE1BSS0+Z2V0RXh0ZXJuRGlyZWN0aXZlKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKE1hbmctPmdldFN5bWJvbChJdGVtc1tqXSktPmdldE5hbWUoKSkpOworICAKKyAgT3V0U3RyZWFtZXIuQWRkQ29tbWVudCgiSW1wb3J0ZWQgVmFyaWFibGVzIC0gRU5EIik7CisgIE91dFN0cmVhbWVyLkFkZEJsYW5rTGluZSgpOworfQorCisvLyBFbWl0IHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIGFuZCBhcmUgYXZhaWxhYmxlIHRvIG90aGVyIG1vZHVsZXMuCit2b2lkIFBJQzE2QXNtUHJpbnRlcjo6RW1pdERlZmluZWRWYXJzKE1vZHVsZSAmTSkgeworICBzdGQ6OnZlY3Rvcjxjb25zdCBHbG9iYWxWYXJpYWJsZSo+IEl0ZW1zID0gRXh0ZXJuYWxWYXJEZWZzOworICBpZiAoIUl0ZW1zLnNpemUoKSkgcmV0dXJuOworCisgIE91dFN0cmVhbWVyLkFkZENvbW1lbnQoIkV4cG9ydGVkIFZhcmlhYmxlcyAtIEJFR0lOIik7CisgIE91dFN0cmVhbWVyLkFkZEJsYW5rTGluZSgpOworCisgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBJdGVtcy5zaXplKCk7IGorKykKKyAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChNQUktPmdldEdsb2JhbERpcmVjdGl2ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShNYW5nLT5nZXRTeW1ib2woSXRlbXNbal0pLT5nZXROYW1lKCkpKTsKKyAgT3V0U3RyZWFtZXIuQWRkQ29tbWVudCgiRXhwb3J0ZWQgVmFyaWFibGVzIC0gRU5EIik7CisgIE91dFN0cmVhbWVyLkFkZEJsYW5rTGluZSgpOworfQorCisvLyBFbWl0IGluaXRpYWxpemVkIGRhdGEgcGxhY2VkIGluIFJPTS4KK3ZvaWQgUElDMTZBc21QcmludGVyOjpFbWl0Um9tRGF0YShNb2R1bGUgJk0pIHsKKyAgRW1pdFNpbmdsZVNlY3Rpb24oUFRPRi0+Uk9NREFUQVNlY3Rpb24oKSk7Cit9CisKKy8vIEVtaXQgU2hhcmVkIHNlY3Rpb24gdWRhdGEuCit2b2lkIFBJQzE2QXNtUHJpbnRlcjo6RW1pdFNoYXJlZFVkYXRhKE1vZHVsZSAmTSkgeworICBFbWl0U2luZ2xlU2VjdGlvbihQVE9GLT5TSEFSRURVREFUQVNlY3Rpb24oKSk7Cit9CisKK2Jvb2wgUElDMTZBc21QcmludGVyOjpkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIHsKKyAgRW1pdEFsbEF1dG9zKE0pOworICBwcmludExpYmNhbGxEZWNscygpOworICBEYmdJbmZvLkVuZE1vZHVsZShNKTsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdEVORCIpKTsKKyAgcmV0dXJuIEFzbVByaW50ZXI6OmRvRmluYWxpemF0aW9uKE0pOworfQorCit2b2lkIFBJQzE2QXNtUHJpbnRlcjo6RW1pdEZ1bmN0aW9uRnJhbWUoTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBjb25zdCBGdW5jdGlvbiAqRiA9IE1GLmdldEZ1bmN0aW9uKCk7CisgIGNvbnN0IFRhcmdldERhdGEgKlREID0gVE0uZ2V0VGFyZ2V0RGF0YSgpOworICBQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8gKkZ1bmNJbmZvID0gTUYuZ2V0SW5mbzxQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisKKyAgLy8gRW1pdCB0aGUgZGF0YSBzZWN0aW9uIG5hbWUuCisgIAorICBQSUMxNlNlY3Rpb24gKmZQRGF0YVNlY3Rpb24gPQorICAgIGNvbnN0X2Nhc3Q8UElDMTZTZWN0aW9uICo+KGdldE9iakZpbGVMb3dlcmluZygpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uRm9yRnJhbWUoQ3VycmVudEZuU3ltLT5nZXROYW1lKCkpKTsKKyAKKyAgZlBEYXRhU2VjdGlvbi0+c2V0Q29sb3IoZ2V0RnVuY3Rpb25Db2xvcihGKSk7IAorICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKGZQRGF0YVNlY3Rpb24pOworICAKKyAgLy8gRW1pdCBmdW5jdGlvbiBmcmFtZSBsYWJlbAorICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChQQU46OmdldEZyYW1lTGFiZWwoQ3VycmVudEZuU3ltLT5nZXROYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoIjoiKSk7CisKKyAgY29uc3QgVHlwZSAqUmV0VHlwZSA9IEYtPmdldFJldHVyblR5cGUoKTsKKyAgdW5zaWduZWQgUmV0U2l6ZSA9IDA7IAorICBpZiAoUmV0VHlwZS0+Z2V0VHlwZUlEKCkgIT0gVHlwZTo6Vm9pZFR5SUQpIAorICAgIFJldFNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShSZXRUeXBlKTsKKyAgCisgIC8vRW1pdCBmdW5jdGlvbiByZXR1cm4gdmFsdWUgc3BhY2UKKyAgLy8gRklYTUU6IERvIG5vdCBlbWl0IFJldHZhbExhYmxlIHdoZW4gcmV0c2l6ZSBpcyB6ZXJvLiBUbyBkbyB0aGlzCisgIC8vIHdlIHdpbGwgbmVlZCB0byBhdm9pZCBwcmludGluZyBhIGdsb2JhbCBkaXJlY3RpdmUgZm9yIFJldHZhbCBsYWJlbAorICAvLyBpbiBlbWl0RXh0ZXJuYW5kR2xvYmxhcy4KKyAgaWYoUmV0U2l6ZSA+IDApCisgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFBBTjo6Z2V0UmV0dmFsTGFiZWwoQ3VycmVudEZuU3ltLT5nZXROYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoIiBSRVMgIikgKyBUd2luZShSZXRTaXplKSk7CisgIGVsc2UKKyAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoUEFOOjpnZXRSZXR2YWxMYWJlbChDdXJyZW50Rm5TeW0tPmdldE5hbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZSgiOiIpKTsKKyAgIAorICAvLyBFbWl0IHZhcmlhYmxlIHRvIGhvbGQgdGhlIHNwYWNlIGZvciBmdW5jdGlvbiBhcmd1bWVudHMgCisgIHVuc2lnbmVkIEFyZ1NpemUgPSAwOworICBmb3IgKEZ1bmN0aW9uOjpjb25zdF9hcmdfaXRlcmF0b3IgYXJnaSA9IEYtPmFyZ19iZWdpbigpLAorICAgICAgICAgICBhcmdlID0gRi0+YXJnX2VuZCgpOyBhcmdpICE9IGFyZ2UgOyArK2FyZ2kpIHsKKyAgICBjb25zdCBUeXBlICpUeSA9IGFyZ2ktPmdldFR5cGUoKTsKKyAgICBBcmdTaXplICs9IFRELT5nZXRUeXBlQWxsb2NTaXplKFR5KTsKKyAgIH0KKworICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChQQU46OmdldEFyZ3NMYWJlbChDdXJyZW50Rm5TeW0tPmdldE5hbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZSgiIFJFUyAiKSArIFR3aW5lKEFyZ1NpemUpKTsKKworICAvLyBFbWl0IHRlbXBvcmFyeSBzcGFjZQorICBpbnQgVGVtcFNpemUgPSBGdW5jSW5mby0+Z2V0VG1wU2l6ZSgpOworICBpZiAoVGVtcFNpemUgPiAwKQorICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFBBTjo6Z2V0VGVtcGRhdGFMYWJlbChDdXJyZW50Rm5TeW0tPmdldE5hbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKCIgUkVTICAiKSArIFR3aW5lKFRlbXBTaXplKSk7Cit9CisKKwordm9pZCBQSUMxNkFzbVByaW50ZXI6OkVtaXRJbml0aWFsaXplZERhdGFTZWN0aW9uKGNvbnN0IFBJQzE2U2VjdGlvbiAqUykgeworICAvLy8gRW1pdCBTZWN0aW9uIGhlYWRlci4KKyAgT3V0U3RyZWFtZXIuU3dpdGNoU2VjdGlvbihTKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEdsb2JhbFZhcmlhYmxlKj4gSXRlbXMgPSBTLT5JdGVtczsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgSXRlbXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgIENvbnN0YW50ICpDID0gSXRlbXNbal0tPmdldEluaXRpYWxpemVyKCk7CisgICAgICBpbnQgQWRkclNwYWNlID0gSXRlbXNbal0tPmdldFR5cGUoKS0+Z2V0QWRkcmVzc1NwYWNlKCk7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChNYW5nLT5nZXRTeW1ib2woSXRlbXNbal0pLT5nZXROYW1lKCkpOworICAgICAgRW1pdEdsb2JhbENvbnN0YW50KEMsIEFkZHJTcGFjZSk7CisgICB9Cit9CisKKy8vIFByaW50IGFsbCBJREFUQSBzZWN0aW9ucy4KK3ZvaWQgUElDMTZBc21QcmludGVyOjpFbWl0SURhdGEoTW9kdWxlICZNKSB7CisgIEVtaXRTZWN0aW9uTGlzdCAoTSwgUFRPRi0+SURBVEFTZWN0aW9ucygpKTsKK30KKwordm9pZCBQSUMxNkFzbVByaW50ZXI6OgorRW1pdFVuaW5pdGlhbGl6ZWREYXRhU2VjdGlvbihjb25zdCBQSUMxNlNlY3Rpb24gKlMpIHsKKyAgICBjb25zdCBUYXJnZXREYXRhICpURCA9IFRNLmdldFRhcmdldERhdGEoKTsKKyAgICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKFMpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEdsb2JhbFZhcmlhYmxlKj4gSXRlbXMgPSBTLT5JdGVtczsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgSXRlbXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgIENvbnN0YW50ICpDID0gSXRlbXNbal0tPmdldEluaXRpYWxpemVyKCk7CisgICAgICBjb25zdCBUeXBlICpUeSA9IEMtPmdldFR5cGUoKTsKKyAgICAgIHVuc2lnbmVkIFNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShUeSk7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChNYW5nLT5nZXRTeW1ib2woSXRlbXNbal0pLT5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoIiBSRVMgIikgKyBUd2luZShTaXplKSk7CisgICAgfQorfQorCisvLyBQcmludCBhbGwgVURBVEEgc2VjdGlvbnMuCit2b2lkIFBJQzE2QXNtUHJpbnRlcjo6RW1pdFVEYXRhKE1vZHVsZSAmTSkgeworICBFbWl0U2VjdGlvbkxpc3QgKE0sIFBUT0YtPlVEQVRBU2VjdGlvbnMoKSk7Cit9CisKKy8vIFByaW50IGFsbCBVU0VSIHNlY3Rpb25zLgordm9pZCBQSUMxNkFzbVByaW50ZXI6OkVtaXRVc2VyU2VjdGlvbnMoTW9kdWxlICZNKSB7CisgIEVtaXRTZWN0aW9uTGlzdCAoTSwgUFRPRi0+VVNFUlNlY3Rpb25zKCkpOworfQorCisvLyBQcmludCBhbGwgQVVUTyBzZWN0aW9ucy4KK3ZvaWQgUElDMTZBc21QcmludGVyOjpFbWl0QWxsQXV0b3MoTW9kdWxlICZNKSB7CisgIEVtaXRTZWN0aW9uTGlzdCAoTSwgUFRPRi0+QVVUT1NlY3Rpb25zKCkpOworfQorCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVQSUMxNkFzbVByaW50ZXIoKSB7IAorICBSZWdpc3RlckFzbVByaW50ZXI8UElDMTZBc21QcmludGVyPiBYKFRoZVBJQzE2VGFyZ2V0KTsKK30KKworLy8gRW1pdCBvbmUgZGF0YSBzZWN0aW9uIHVzaW5nIGNvcnJlY3Qgc2VjdGlvbiBlbWl0dGVyIGJhc2VkIG9uIHNlY3Rpb24gdHlwZS4KK3ZvaWQgUElDMTZBc21QcmludGVyOjpFbWl0U2luZ2xlU2VjdGlvbihjb25zdCBQSUMxNlNlY3Rpb24gKlMpIHsKKyAgaWYgKFMgPT0gTlVMTCkgcmV0dXJuOworCisgIHN3aXRjaCAoUy0+Z2V0VHlwZSgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSAoInVua25vdyB1c2VyIHNlY3Rpb24gdHlwZSIpOworICAgIGNhc2UgVURBVEE6CisgICAgY2FzZSBVREFUQV9TSFI6CisgICAgY2FzZSBVREFUQV9PVlI6CisgICAgICBFbWl0VW5pbml0aWFsaXplZERhdGFTZWN0aW9uKFMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJREFUQToKKyAgICBjYXNlIFJPTURBVEE6CisgICAgICBFbWl0SW5pdGlhbGl6ZWREYXRhU2VjdGlvbihTKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8vIEVtaXQgYSBsaXN0IG9mIHNlY3Rpb25zLgordm9pZCBQSUMxNkFzbVByaW50ZXI6OgorRW1pdFNlY3Rpb25MaXN0KE1vZHVsZSAmTSwgY29uc3Qgc3RkOjp2ZWN0b3I8UElDMTZTZWN0aW9uICo+ICZTTGlzdCkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgU0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBFeGNsdWRlIGxsdm0gc3BlY2lmaWMgbWV0YWRhdGEgc2VjdGlvbnMuCisgICAgaWYgKFNMaXN0W2ldLT5nZXROYW1lKCkuZmluZCgibGx2bS4iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgIGNvbnRpbnVlOworICAgIE91dFN0cmVhbWVyLkFkZEJsYW5rTGluZSgpOworICAgIEVtaXRTaW5nbGVTZWN0aW9uKFNMaXN0W2ldKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L0FzbVByaW50ZXIvUElDMTZBc21QcmludGVyLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L0FzbVByaW50ZXIvUElDMTZBc21QcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyZTFmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvQXNtUHJpbnRlci9QSUMxNkFzbVByaW50ZXIuaApAQCAtMCwwICsxLDg4IEBACisvLz09PS0tIFBJQzE2QXNtUHJpbnRlci5oIC0gUElDMTYgTExWTSBhc3NlbWJseSB3cml0ZXIgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHByaW50ZXIgdGhhdCBjb252ZXJ0cyBmcm9tIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorLy8gb2YgbWFjaGluZS1kZXBlbmRlbnQgTExWTSBjb2RlIHRvIFBJQzE2IGFzc2VtYmx5IGxhbmd1YWdlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgUElDMTZBU01QUklOVEVSX0gKKyNkZWZpbmUgUElDMTZBU01QUklOVEVSX0gKKworI2luY2x1ZGUgIlBJQzE2LmgiCisjaW5jbHVkZSAiUElDMTZUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiUElDMTZEZWJ1Z0luZm8uaCIKKyNpbmNsdWRlICJQSUMxNk1DQXNtSW5mby5oIgorI2luY2x1ZGUgIlBJQzE2VGFyZ2V0T2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRGVidWdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIFBJQzE2QXNtUHJpbnRlciA6IHB1YmxpYyBBc21QcmludGVyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFBJQzE2QXNtUHJpbnRlcihUYXJnZXRNYWNoaW5lICZUTSwgTUNTdHJlYW1lciAmU3RyZWFtZXIpOworICBwcml2YXRlOgorICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIlBJQzE2IEFzc2VtYmx5IFByaW50ZXIiOworICAgIH0KKyAgICAKKyAgICBjb25zdCBQSUMxNlRhcmdldE9iamVjdEZpbGUgJmdldE9iakZpbGVMb3dlcmluZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoY29uc3QgUElDMTZUYXJnZXRPYmplY3RGaWxlICYpQXNtUHJpbnRlcjo6Z2V0T2JqRmlsZUxvd2VyaW5nKCk7CisgICAgfQorCisgICAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpOworICAgIHZvaWQgcHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRDQ09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgICAgdm9pZCBwcmludEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHJhd19vc3RyZWFtICZPKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0UmVnaXN0ZXJOYW1lKHVuc2lnbmVkIFJlZ05vKTsKKworICAgIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworICAgIHZvaWQgRW1pdEZ1bmN0aW9uRGVjbHMgKE1vZHVsZSAmTSk7CisgICAgdm9pZCBFbWl0VW5kZWZpbmVkVmFycyAoTW9kdWxlICZNKTsKKyAgICB2b2lkIEVtaXREZWZpbmVkVmFycyAoTW9kdWxlICZNKTsKKyAgICB2b2lkIEVtaXRJRGF0YSAoTW9kdWxlICZNKTsKKyAgICB2b2lkIEVtaXRVRGF0YSAoTW9kdWxlICZNKTsKKyAgICB2b2lkIEVtaXRBbGxBdXRvcyAoTW9kdWxlICZNKTsKKyAgICB2b2lkIEVtaXRSb21EYXRhIChNb2R1bGUgJk0pOworICAgIHZvaWQgRW1pdFNoYXJlZFVkYXRhKE1vZHVsZSAmTSk7CisgICAgdm9pZCBFbWl0VXNlclNlY3Rpb25zIChNb2R1bGUgJk0pOworICAgIHZvaWQgRW1pdEZ1bmN0aW9uRnJhbWUoTWFjaGluZUZ1bmN0aW9uICZNRik7CisgICAgdm9pZCBwcmludExpYmNhbGxEZWNscygpOworICAgIHZvaWQgRW1pdFVuaW5pdGlhbGl6ZWREYXRhU2VjdGlvbihjb25zdCBQSUMxNlNlY3Rpb24gKlMpOworICAgIHZvaWQgRW1pdEluaXRpYWxpemVkRGF0YVNlY3Rpb24oY29uc3QgUElDMTZTZWN0aW9uICpTKTsKKyAgICB2b2lkIEVtaXRTaW5nbGVTZWN0aW9uKGNvbnN0IFBJQzE2U2VjdGlvbiAqUyk7CisgICAgdm9pZCBFbWl0U2VjdGlvbkxpc3QoTW9kdWxlICZNLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwgUElDMTZTZWN0aW9uICo+ICZTTGlzdCk7CisgICAgdm9pZCBDb2xvckF1dG9TZWN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGKTsKKyAgcHJvdGVjdGVkOgorICAgIGJvb2wgZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJk0pOworICAgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKTsKKworICAgIC8vLyBFbWl0R2xvYmFsVmFyaWFibGUgLSBFbWl0IHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhcmlhYmxlIGFuZCBpdHMKKyAgICAvLy8gaW5pdGlhbGl6ZXIgdG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgdmlydHVhbCB2b2lkIEVtaXRHbG9iYWxWYXJpYWJsZShjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIHsKKyAgICAgIC8vIFBJQzE2IGRvZXNuJ3QgdXNlIG5vcm1hbCBob29rcyBmb3IgdGhpcy4KKyAgICB9CisgICAgCisgIHByaXZhdGU6CisgICAgY29uc3QgUElDMTZUYXJnZXRPYmplY3RGaWxlICpQVE9GOworICAgIFBJQzE2RGJnSW5mbyBEYmdJbmZvOworICAgIGNvbnN0IFBJQzE2TUNBc21JbmZvICpQTUFJOworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBMaWJjYWxsRGVjbHM7IC8vIFNvcnRlZCAmIHVuaXF1ZWQgc2V0IG9mIGV4dGVybiBkZWNscy4KKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBHbG9iYWxWYXJpYWJsZSAqPiBFeHRlcm5hbFZhckRlY2xzOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEdsb2JhbFZhcmlhYmxlICo+IEV4dGVybmFsVmFyRGVmczsKKyAgfTsKK30gLy8gZW5kIG9mIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmNiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjYgQEAKK3NldChMTFZNX1RBUkdFVF9ERUZJTklUSU9OUyBQSUMxNi50ZCkKKwordGFibGVnZW4oUElDMTZHZW5SZWdpc3RlckluZm8uaC5pbmMgLWdlbi1yZWdpc3Rlci1kZXNjLWhlYWRlcikKK3RhYmxlZ2VuKFBJQzE2R2VuUmVnaXN0ZXJOYW1lcy5pbmMgLWdlbi1yZWdpc3Rlci1lbnVtcykKK3RhYmxlZ2VuKFBJQzE2R2VuUmVnaXN0ZXJJbmZvLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MpCit0YWJsZWdlbihQSUMxNkdlbkluc3RyTmFtZXMuaW5jIC1nZW4taW5zdHItZW51bXMpCit0YWJsZWdlbihQSUMxNkdlbkluc3RySW5mby5pbmMgLWdlbi1pbnN0ci1kZXNjKQordGFibGVnZW4oUElDMTZHZW5Bc21Xcml0ZXIuaW5jIC1nZW4tYXNtLXdyaXRlcikKK3RhYmxlZ2VuKFBJQzE2R2VuREFHSVNlbC5pbmMgLWdlbi1kYWctaXNlbCkKK3RhYmxlZ2VuKFBJQzE2R2VuQ2FsbGluZ0NvbnYuaW5jIC1nZW4tY2FsbGluZ2NvbnYpCit0YWJsZWdlbihQSUMxNkdlblN1YnRhcmdldC5pbmMgLWdlbi1zdWJ0YXJnZXQpCisKK2FkZF9sbHZtX3RhcmdldChQSUMxNkNvZGVHZW4KKyAgUElDMTZEZWJ1Z0luZm8uY3BwCisgIFBJQzE2SW5zdHJJbmZvLmNwcAorICBQSUMxNklTZWxEQUdUb0RBRy5jcHAKKyAgUElDMTZJU2VsTG93ZXJpbmcuY3BwCisgIFBJQzE2TWVtU2VsT3B0LmNwcAorICBQSUMxNk1DQXNtSW5mby5jcHAKKyAgUElDMTZSZWdpc3RlckluZm8uY3BwCisgIFBJQzE2U2VjdGlvbi5jcHAKKyAgUElDMTZTdWJ0YXJnZXQuY3BwCisgIFBJQzE2VGFyZ2V0TWFjaGluZS5jcHAKKyAgUElDMTZUYXJnZXRPYmplY3RGaWxlLmNwcAorICBQSUMxNlNlbGVjdGlvbkRBR0luZm8uY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNzg0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L1BJQzE2L01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjIAorIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIyAKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVBJQzE2Q29kZUdlbgorVEFSR0VUID0gUElDMTYKKworIyBNYWtlIHN1cmUgdGhhdCB0YmxnZW4gaXMgcnVuLCBmaXJzdCB0aGluZy4KK0JVSUxUX1NPVVJDRVMgPSBQSUMxNkdlblJlZ2lzdGVySW5mby5oLmluYyBQSUMxNkdlblJlZ2lzdGVyTmFtZXMuaW5jIFwKKwkJUElDMTZHZW5SZWdpc3RlckluZm8uaW5jIFBJQzE2R2VuSW5zdHJOYW1lcy5pbmMgXAorCQlQSUMxNkdlbkluc3RySW5mby5pbmMgUElDMTZHZW5Bc21Xcml0ZXIuaW5jIFwKKwkJUElDMTZHZW5EQUdJU2VsLmluYyBQSUMxNkdlbkNhbGxpbmdDb252LmluYyBcCisJCVBJQzE2R2VuU3VidGFyZ2V0LmluYworCitESVJTID0gQXNtUHJpbnRlciBUYXJnZXRJbmZvIFBJQzE2UGFzc2VzCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTYuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGJiM2U2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNi5oCkBAIC0wLDAgKzEsMTM0IEBACisvLz09PS0tIFBJQzE2LmggLSBUb3AtbGV2ZWwgaW50ZXJmYWNlIGZvciBQSUMxNiByZXByZXNlbnRhdGlvbiAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGVudHJ5IHBvaW50cyBmb3IgZ2xvYmFsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIAorLy8gdGhlIExMVk0gUElDMTYgYmFjay1lbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9QSUMxNl9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1BJQzE2X0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgUElDMTZUYXJnZXRNYWNoaW5lOworICBjbGFzcyBGdW5jdGlvblBhc3M7CisgIGNsYXNzIE1hY2hpbmVDb2RlRW1pdHRlcjsKKyAgY2xhc3MgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOworCituYW1lc3BhY2UgUElDMTZDQyB7CisgIGVudW0gQ29uZENvZGVzIHsKKyAgICBFUSwKKyAgICBORSwKKyAgICBMVCwKKyAgICBMRSwKKyAgICBHVCwKKyAgICBHRSwKKyAgICBVTFQsCisgICAgVUdULAorICAgIFVMRSwKKyAgICBVR0UKKyAgfTsKK30KKworICBlbnVtIFBJQzE2U2VjdGlvblR5cGUgeworICAgICAgQ09ERSwKKyAgICAgIFVEQVRBLAorICAgICAgSURBVEEsCisgICAgICBST01EQVRBLAorICAgICAgVURBVEFfT1ZSLAorICAgICAgVURBVEFfU0hSCisgICAgfTsKKworICBjbGFzcyBFU05hbWVzIHsKKyAgICBzdGQ6OnZlY3RvcjxjaGFyKj4gc3RrOworICAgIEVTTmFtZXMoKSB7fQorICAgIHB1YmxpYzoKKyAgICB+RVNOYW1lcygpIHsKKyAgICAgIHdoaWxlICghc3RrLmVtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgY2hhciogcCA9IHN0ay5iYWNrKCk7CisgICAgICAgIGRlbGV0ZSBbXSBwOworICAgICAgICBzdGsucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEV4dGVybmFsIHN5bWJvbCBuYW1lcyByZXF1aXJlIG1lbW9yeSB0byBsaXZlIHRpbGwgdGhlIHByb2dyYW0gZW5kLgorICAgIC8vIFNvIHdlIGhhdmUgdG8gYWxsb2NhdGUgaXQgYW5kIGtlZXAuIFB1c2ggYWxsIHN1Y2ggYWxsb2NhdGlvbnMgaW50byBhIAorICAgIC8vIHZlY3RvciBzbyB0aGF0IHRoZXkgZ2V0IGZyZWVkIHVwIG9uIHRlcm1pbmF0aW9uLgorICAgIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqY3JlYXRlRVNOYW1lIChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICAgICAgc3RhdGljIEVTTmFtZXMgZXNuOworICAgICAgY2hhciAqdG1wTmFtZSA9IG5ldyBjaGFyW25hbWUuc2l6ZSgpICsgMV07CisgICAgICBtZW1jcHkodG1wTmFtZSwgbmFtZS5jX3N0cigpLCBuYW1lLnNpemUoKSArIDEpOworICAgICAgZXNuLnN0ay5wdXNoX2JhY2sodG1wTmFtZSk7CisgICAgICByZXR1cm4gdG1wTmFtZTsKKyAgICB9CisKKyB9OworCisgIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqUElDMTZDb25kQ29kZVRvU3RyaW5nKFBJQzE2Q0M6OkNvbmRDb2RlcyBDQykgeworICAgIHN3aXRjaCAoQ0MpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGNvbmRpdGlvbiBjb2RlIik7CisgICAgY2FzZSBQSUMxNkNDOjpORTogIHJldHVybiAibmUiOworICAgIGNhc2UgUElDMTZDQzo6RVE6ICAgcmV0dXJuICJlcSI7CisgICAgY2FzZSBQSUMxNkNDOjpMVDogICByZXR1cm4gImx0IjsKKyAgICBjYXNlIFBJQzE2Q0M6OlVMVDogICByZXR1cm4gImx0IjsKKyAgICBjYXNlIFBJQzE2Q0M6OkxFOiAgcmV0dXJuICJsZSI7CisgICAgY2FzZSBQSUMxNkNDOjpVTEU6ICByZXR1cm4gImxlIjsKKyAgICBjYXNlIFBJQzE2Q0M6OkdUOiAgcmV0dXJuICJndCI7CisgICAgY2FzZSBQSUMxNkNDOjpVR1Q6ICByZXR1cm4gImd0IjsKKyAgICBjYXNlIFBJQzE2Q0M6OkdFOiAgIHJldHVybiAiZ2UiOworICAgIGNhc2UgUElDMTZDQzo6VUdFOiAgIHJldHVybiAiZ2UiOworICAgIH0KKyAgfQorCisgIGlubGluZSBzdGF0aWMgYm9vbCBpc1NpZ25lZENvbXBhcmlzb24oUElDMTZDQzo6Q29uZENvZGVzIENDKSB7CisgICAgc3dpdGNoIChDQykgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29uZGl0aW9uIGNvZGUiKTsKKyAgICBjYXNlIFBJQzE2Q0M6Ok5FOiAgCisgICAgY2FzZSBQSUMxNkNDOjpFUTogCisgICAgY2FzZSBQSUMxNkNDOjpMVDoKKyAgICBjYXNlIFBJQzE2Q0M6OkxFOgorICAgIGNhc2UgUElDMTZDQzo6R0U6CisgICAgY2FzZSBQSUMxNkNDOjpHVDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgUElDMTZDQzo6VUxUOgorICAgIGNhc2UgUElDMTZDQzo6VUdUOgorICAgIGNhc2UgUElDMTZDQzo6VUxFOgorICAgIGNhc2UgUElDMTZDQzo6VUdFOgorICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIGNvbmRpdGlvbiBjb2RlcyBmb3IgdW5zaWduZWQgY29tcGFyaXNvbi4gCisgICAgfQorICB9CisKKworCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUElDMTZJU2VsRGFnKFBJQzE2VGFyZ2V0TWFjaGluZSAmVE0pOworICAvLyBCYW5rc2VsIG9wdGltaXplciBwYXNzLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVBJQzE2TWVtU2VsT3B0aW1pemVyUGFzcygpOworCisgIGV4dGVybiBUYXJnZXQgVGhlUElDMTZUYXJnZXQ7CisgIGV4dGVybiBUYXJnZXQgVGhlQ29vcGVyVGFyZ2V0OworICAKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtOworCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciBQSUMxNiByZWdpc3RlcnMuICBUaGlzIGRlZmluZXMgYSBtYXBwaW5nIGZyb20KKy8vIHJlZ2lzdGVyIG5hbWUgdG8gcmVnaXN0ZXIgbnVtYmVyLgorI2luY2x1ZGUgIlBJQzE2R2VuUmVnaXN0ZXJOYW1lcy5pbmMiCisKKy8vIERlZmluZXMgc3ltYm9saWMgbmFtZXMgZm9yIHRoZSBQSUMxNiBpbnN0cnVjdGlvbnMuCisjaW5jbHVkZSAiUElDMTZHZW5JbnN0ck5hbWVzLmluYyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2LnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmI5YjFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNi50ZApAQCAtMCwwICsxLDQwIEBACisvLz09PS0gUElDMTYudGQgLSBEZXNjcmliZSB0aGUgUElDMTYgVGFyZ2V0IE1hY2hpbmUgLS0tLS0tLS0tLS0qLSB0YmxnZW4gLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCBlbnRyeSBwb2ludCBmb3IgdGhlIFBJQzE2IHRhcmdldC4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYXJnZXQtaW5kZXBlbmRlbnQgaW50ZXJmYWNlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0LnRkIgorCitpbmNsdWRlICJQSUMxNlJlZ2lzdGVySW5mby50ZCIKK2luY2x1ZGUgIlBJQzE2SW5zdHJJbmZvLnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3VidGFyZ2V0IEZlYXR1cmVzLiAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgRmVhdHVyZUNvb3BlciA6IFN1YnRhcmdldEZlYXR1cmU8ImNvb3BlciIsICJJc0Nvb3BlciIsICJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUElDMTYgQ29vcGVyIElTQSBTdXBwb3J0Ij47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQSUMxNiBzdXBwb3J0ZWQgcHJvY2Vzc29ycy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiA6IFByb2Nlc3NvcjwiZ2VuZXJpYyIsIE5vSXRpbmVyYXJpZXMsIFtdPjsKK2RlZiA6IFByb2Nlc3NvcjwiY29vcGVyIiwgTm9JdGluZXJhcmllcywgW0ZlYXR1cmVDb29wZXJdPjsKKworCitkZWYgUElDMTZJbnN0ckluZm8gOiBJbnN0ckluZm8ge30gCisKK2RlZiBQSUMxNiA6IFRhcmdldCB7CisgIGxldCBJbnN0cnVjdGlvblNldCA9IFBJQzE2SW5zdHJJbmZvOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2QUJJTmFtZXMuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZBQklOYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWE4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2QUJJTmFtZXMuaApAQCAtMCwwICsxLDM5OSBAQAorLy89PT0tLSBQSUMxNkFCSU5hbWVzLmggLSBQSUMxNiBOYW1pbmcgY29udmVudGlvcyBmb3IgQUJJLS0tLS0gLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgdG8gbWFuYWdlIEFCSSBOYW1pbmcgY29udmVudGlvbnMgZm9yIFBJQzE2LiAKKy8vIAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfUElDMTZBQklOQU1FU19ICisjZGVmaW5lIExMVk1fVEFSR0VUX1BJQzE2QUJJTkFNRVNfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFBJQzE2VGFyZ2V0TWFjaGluZTsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBjbGFzcyBNYWNoaW5lQ29kZUVtaXR0ZXI7CisgIGNsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKworICAvLyBBIENlbnRyYWwgY2xhc3MgdG8gbWFuYWdlIGFsbCBBQkkgbmFtaW5nIGNvbnZlbnRpb25zLgorICAvLyBQQU4gLSBbUF1pYzE2IFtBXUJJIFtOXWFtZXMKKyAgY2xhc3MgUEFOIHsKKyAgICBwdWJsaWM6CisgICAgLy8gTWFwIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gaXRzIHNlY3Rpb24gbmFtZS4KKyAgICAvLyBDdXJyZW50IEFCSToKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEFMTCBOYW1lcyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3ltb2JsICdAJy4KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBHbG9iYWwgdmFyaWFibGVzIGRvIG5vdCBoYXZlIGFueSAnLicgaW4gdGhlaXIgbmFtZXMuCisgICAgLy8gVGhlc2UgYXJlIG1haWx5IGZ1bmN0aW9uIG5hbWVzIGFuZCBnbG9iYWwgdmFyaWFibGUgbmFtZXMuCisgICAgLy8gRXhhbXBsZSAtIEBmb28sICBAaQorICAgIC8vIFN0YXRpYyBsb2NhbCB2YXJpYWJsZXMgLSBAPGZ1bmM+Ljx2YXI+CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEZ1bmN0aW9ucyBhbmQgYXV0byB2YXJpYWJsZXMuCisgICAgLy8gTmFtZXMgYXJlIG1hbmdsZWQgYXMgPHByZWZpeD48ZnVuY25hbWU+Ljx0YWc+Ljx2YXJuYW1lPgorICAgIC8vIFdoZXJlIDxwcmVmaXg+IGlzICdAJyBhbmQgPHRhZz4gaXMgYW55IG9uZSBvZgorICAgIC8vIHRoZSBmb2xsb3dpbmcKKyAgICAvLyAuYXV0by4gLSBhbiBhdXRvbWF0aWMgdmFyIG9mIGEgZnVuY3Rpb24uCisgICAgLy8gLnRlbXAuIC0gdGVtcHJvcmF5IGRhdGEgb2YgYSBmdW5jdGlvbi4KKyAgICAvLyAucmV0LiAgLSByZXR1cm4gdmFsdWUgbGFiZWwgZm9yIGEgZnVuY3Rpb24uCisgICAgLy8gLmZyYW1lLiAtIEZyYW1lIGxhYmVsIGZvciBhIGZ1bmN0aW9uIHdoZXJlIHJldHZhbCwgYXJncworICAgIC8vICAgICAgICAgICBhbmQgdGVtcHMgYXJlIHN0b3JlZC4KKyAgICAvLyAuYXJncy4gLSBMYWJlbCB1c2VkIHRvIHBhc3MgYXJndW1lbnRzIHRvIGEgZGlyZWN0IGNhbGwuCisgICAgLy8gRXhhbXBsZSAtIEZ1bmN0aW9uIG5hbWU6ICAgQGZvbworICAgIC8vICAgICAgICAgICBJdHMgZnJhbWU6ICAgICAgIEBmb28uZnJhbWUuCisgICAgLy8gICAgICAgICAgIEl0cyByZXR2YWw6ICAgICAgQGZvby5yZXQuCisgICAgLy8gICAgICAgICAgIEl0cyBsb2NhbCB2YXJzOiAgQGZvby5hdXRvLmEKKyAgICAvLyAgICAgICAgICAgSXRzIHRlbXAgZGF0YTogICBAZm9vLnRlbXAuCisgICAgLy8gICAgICAgICAgIEl0cyBhcmcgcGFzc2luZzogQGZvby5hcmdzLgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIExpYmNhbGwgLSBjb21waWxlciBnZW5lcmF0ZWQgbGliY2FsbCBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggLmxpYi4KKyAgICAvLyAgICAgICAgICAgVGhpcyBpZCB3aWxsIGJlIHVzZWQgdG8gZW1pdCBleHRlcm4gZGVjbHMgZm9yIGxpYmNhbGxzLgorICAgIC8vIEV4YW1wbGUgLSBsaWJjYWxsIG5hbWU6ICAgQC5saWIuc3JhLmk4CisgICAgLy8gICAgICAgICAgIFRvIHBhc3MgYXJnczogICBALmxpYi5zcmEuaTguYXJncy4KKyAgICAvLyAgICAgICAgICAgVG8gcmV0dXJuIHZhbDogIEAubGliLnNyYS5pOC5yZXQuCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gU0VDVElPTiBOYW1lcworICAgIC8vIHVuaW5pdGlhbGl6ZWQgZ2xvYmFscyAtIEB1ZGF0YS48bnVtPi4jCisgICAgLy8gaW5pdGlhbGl6ZWQgZ2xvYmFscyAtIEBpZGF0YS48bnVtPi4jCisgICAgLy8gUHJvZ3JhbSBtZW1vcnkgZGF0YSAtIEByb21kYXRhLiMKKyAgICAvLyBWYXJpYWJsZXMgd2l0aCB1c2VyIGRlZmluZWQgc2VjdGlvbiBuYW1lIC0gPHVzZXJfZGVmaW5lZF9zZWN0aW9uPgorICAgIC8vIFZhcmlhYmxlcyB3aXRoIHVzZXIgZGVmaW5lZCBhZGRyZXNzIC0gQDx2YXI+LnVzZXJfc2VjdGlvbi48YWRkcmVzcz4uIworICAgIC8vIEZ1bmN0aW9uIGZyYW1lIC0gQDxmdW5jPi5mcmFtZV9zZWN0aW9uLgorICAgIC8vIEZ1bmN0aW9uIGF1dG9zIC0gQDxmdW5jPi5hdXRvc19zZWN0aW9uLgorICAgIC8vIE92ZXJsYXkgc2VjdGlvbnMgLSBAPGNvbG9yPi4jIworICAgIC8vIERlY2xhcmF0aW9ucyAtIEVuY2xvc2VkIGluIGNvbW1lbnRzLiBObyBzZWN0aW9uIGZvciB0aGVtLgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIAorICAgIC8vIFRhZ3MgdXNlZCB0byBtYW5nbGUgZGlmZmVyZW50IG5hbWVzLiAKKyAgICBlbnVtIFRBR1MgeworICAgICAgUFJFRklYX1NZTUJPTCwKKyAgICAgIEdMT0JBTCwKKyAgICAgIFNUQVRJQ19MT0NBTCwKKyAgICAgIEFVVE9TX0xBQkVMLAorICAgICAgRlJBTUVfTEFCRUwsCisgICAgICBSRVRfTEFCRUwsCisgICAgICBBUkdTX0xBQkVMLAorICAgICAgVEVNUFNfTEFCRUwsCisgICAgICAKKyAgICAgIExJQkNBTEwsCisgICAgICAKKyAgICAgIEZSQU1FX1NFQ1RJT04sCisgICAgICBBVVRPU19TRUNUSU9OLAorICAgICAgQ09ERV9TRUNUSU9OLAorICAgICAgVVNFUl9TRUNUSU9OCisgICAgfTsKKworICAgIC8vIFRleHR1YWwgbmFtZXMgb2YgdGhlIHRhZ3MuCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICpnZXRUYWdOYW1lKFRBR1MgdGFnKSB7CisgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgZGVmYXVsdDogcmV0dXJuICIiOworICAgICAgY2FzZSBQUkVGSVhfU1lNQk9MOiAgICByZXR1cm4gIkAiOworICAgICAgY2FzZSBBVVRPU19MQUJFTDogICAgICAgcmV0dXJuICIuYXV0by4iOworICAgICAgY2FzZSBGUkFNRV9MQUJFTDogICAgICAgcmV0dXJuICIuZnJhbWUuIjsKKyAgICAgIGNhc2UgVEVNUFNfTEFCRUw6ICAgICAgIHJldHVybiAiLnRlbXAuIjsKKyAgICAgIGNhc2UgQVJHU19MQUJFTDogICAgICAgcmV0dXJuICIuYXJncy4iOworICAgICAgY2FzZSBSRVRfTEFCRUw6ICAgICAgIHJldHVybiAiLnJldC4iOworICAgICAgY2FzZSBMSUJDQUxMOiAgICAgICByZXR1cm4gIi5saWIuIjsKKyAgICAgIGNhc2UgRlJBTUVfU0VDVElPTjogICAgICAgcmV0dXJuICIuZnJhbWVfc2VjdGlvbi4iOworICAgICAgY2FzZSBBVVRPU19TRUNUSU9OOiAgICAgICByZXR1cm4gIi5hdXRvc19zZWN0aW9uLiI7CisgICAgICBjYXNlIENPREVfU0VDVElPTjogICAgICAgcmV0dXJuICIuY29kZV9zZWN0aW9uLiI7CisgICAgICBjYXNlIFVTRVJfU0VDVElPTjogICAgICAgcmV0dXJuICIudXNlcl9zZWN0aW9uLiI7CisgICAgICB9CisgICAgfQorCisgICAgLy8gR2V0IHRhZyB0eXBlIGZvciB0aGUgU3ltYm9sLgorICAgIGlubGluZSBzdGF0aWMgVEFHUyBnZXRTeW1ib2xUYWcoY29uc3Qgc3RkOjpzdHJpbmcgJlN5bSkgeworICAgICAgaWYgKFN5bS5maW5kKGdldFRhZ05hbWUoVEVNUFNfTEFCRUwpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgcmV0dXJuIFRFTVBTX0xBQkVMOworCisgICAgICBpZiAoU3ltLmZpbmQoZ2V0VGFnTmFtZShGUkFNRV9MQUJFTCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICByZXR1cm4gRlJBTUVfTEFCRUw7CisKKyAgICAgIGlmIChTeW0uZmluZChnZXRUYWdOYW1lKFJFVF9MQUJFTCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICByZXR1cm4gUkVUX0xBQkVMOworCisgICAgICBpZiAoU3ltLmZpbmQoZ2V0VGFnTmFtZShBUkdTX0xBQkVMKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIHJldHVybiBBUkdTX0xBQkVMOworCisgICAgICBpZiAoU3ltLmZpbmQoZ2V0VGFnTmFtZShBVVRPU19MQUJFTCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICByZXR1cm4gQVVUT1NfTEFCRUw7CisKKyAgICAgIGlmIChTeW0uZmluZChnZXRUYWdOYW1lKExJQkNBTEwpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgcmV0dXJuIExJQkNBTEw7CisKKyAgICAgIC8vIEl0IGRvZXMgbm90IGhhdmUgYW55IFRhZy4gU28gaXRzIGEgdHJ1ZSBnbG9iYWwgb3Igc3RhdGljIGxvY2FsLgorICAgICAgaWYgKFN5bS5maW5kKCIuIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIAorICAgICAgICByZXR1cm4gR0xPQkFMOworICAgICAgCisgICAgICAvLyBJZiBhIC4gaXMgdGhlcmUsIHRoZW4gaXQgbWF5IGJlIHN0YXRpYyBsb2NhbC4KKyAgICAgIC8vIFdlIHNob3VsZCBtYW5nbGUgdGhlc2UgYXMgd2VsbCBpbiBjbGFuZy4KKyAgICAgIGlmIChTeW0uZmluZCgiLiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSAKKyAgICAgICAgcmV0dXJuIFNUQVRJQ19MT0NBTDsKKyAKKyAgICAgIGFzc2VydCAoMCAmJiAiQ291bGQgbm90IGRldGVybWluZSBTeW1ib2wncyB0YWciKTsKKyAgICAgIHJldHVybiBQUkVGSVhfU1lNQk9MOyAvLyBTaWxlbmNlIHdhcm5pbmcgd2hlbiBhc3NlcnRpb25zIGFyZSB0dXJuZWQgb2ZmLgorICAgIH0KKworICAgIC8vIGFkZFByZWZpeCAtIGFkZCBwcmVmaXggc3ltYm9sIHRvIGEgbmFtZSBpZiB0aGVyZSBpc24ndCBvbmUgYWxyZWFkeS4KKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6c3RyaW5nIGFkZFByZWZpeCAoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9IGdldFRhZ05hbWUgKFBSRUZJWF9TWU1CT0wpOworCisgICAgICAvLyBJZiB0aGlzIG5hbWUgYWxyZWFkeSBoYXMgYSBwcmVmaXgsIG5vdGhpbmcgdG8gZG8uCisgICAgICBpZiAoTmFtZS5jb21wYXJlKDAsIHByZWZpeC5zaXplKCksIHByZWZpeCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5hbWU7CisKKyAgICAgIHJldHVybiBwcmVmaXggKyBOYW1lOworICAgIH0KKworICAgIC8vIEdldCBtYW5nbGVkIGZ1bmMgbmFtZSBmcm9tIGEgbWFuZ2xlZCBzeW0gbmFtZS4KKyAgICAvLyBJbiBhbGwgY2FzZXMgZnVuYyBuYW1lIGlzIHRoZSBmaXJzdCBjb21wb25lbnQgYmVmb3JlIGEgJy4nLgorICAgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0RnVuY05hbWVGb3JTeW0oY29uc3Qgc3RkOjpzdHJpbmcgJlN5bTEpIHsKKyAgICAgIGFzc2VydCAoZ2V0U3ltYm9sVGFnKFN5bTEpICE9IEdMT0JBTCAmJiAibm90IGJlbG9uZ3MgdG8gYSBmdW5jdGlvbiIpOworCisgICAgICBzdGQ6OnN0cmluZyBTeW0gPSBhZGRQcmVmaXgoU3ltMSk7CisKKyAgICAgIC8vIFBvc2l0aW9uIG9mIHRoZSAuIGFmdGVyIGZ1bmMgbmFtZS4gVGhhdCdzIHdoZXJlIGZ1bmMgbmFtZSBlbmRzLgorICAgICAgc2l6ZV90IGZ1bmNfbmFtZV9lbmQgPSBTeW0uZmluZCAoJy4nKTsKKworICAgICAgcmV0dXJuIFN5bS5zdWJzdHIgKDAsIGZ1bmNfbmFtZV9lbmQpOworICAgIH0KKworICAgIC8vIEdldCBGcmFtZSBzdGFydCBsYWJlbCBmb3IgYSBmdW5jLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRGcmFtZUxhYmVsKGNvbnN0IHN0ZDo6c3RyaW5nICZGdW5jKSB7CisgICAgICBzdGQ6OnN0cmluZyBGdW5jMSA9IGFkZFByZWZpeChGdW5jKTsKKyAgICAgIHN0ZDo6c3RyaW5nIHRhZyA9IGdldFRhZ05hbWUoRlJBTUVfTEFCRUwpOworICAgICAgcmV0dXJuIEZ1bmMxICsgdGFnOworICAgIH0KKworICAgIC8vIEdldCB0aGUgcmV0dmFsIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFJldHZhbExhYmVsKGNvbnN0IHN0ZDo6c3RyaW5nICZGdW5jKSB7CisgICAgICBzdGQ6OnN0cmluZyBGdW5jMSA9IGFkZFByZWZpeChGdW5jKTsKKyAgICAgIHN0ZDo6c3RyaW5nIHRhZyA9IGdldFRhZ05hbWUoUkVUX0xBQkVMKTsKKyAgICAgIHJldHVybiBGdW5jMSArIHRhZzsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGFyZ3VtZW50IGxhYmVsIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEFyZ3NMYWJlbChjb25zdCBzdGQ6OnN0cmluZyAmRnVuYykgeworICAgICAgc3RkOjpzdHJpbmcgRnVuYzEgPSBhZGRQcmVmaXgoRnVuYyk7CisgICAgICBzdGQ6OnN0cmluZyB0YWcgPSBnZXRUYWdOYW1lKEFSR1NfTEFCRUwpOworICAgICAgcmV0dXJuIEZ1bmMxICsgdGFnOworICAgIH0KKworICAgIC8vIEdldCB0aGUgdGVtcGRhdGEgbGFiZWwgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbi4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0VGVtcGRhdGFMYWJlbChjb25zdCBzdGQ6OnN0cmluZyAmRnVuYykgeworICAgICAgc3RkOjpzdHJpbmcgRnVuYzEgPSBhZGRQcmVmaXgoRnVuYyk7CisgICAgICBzdGQ6OnN0cmluZyB0YWcgPSBnZXRUYWdOYW1lKFRFTVBTX0xBQkVMKTsKKyAgICAgIHJldHVybiBGdW5jMSArIHRhZzsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RnJhbWVTZWN0aW9uTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmRnVuYykgeworICAgICAgc3RkOjpzdHJpbmcgRnVuYzEgPSBhZGRQcmVmaXgoRnVuYyk7CisgICAgICBzdGQ6OnN0cmluZyB0YWcgPSBnZXRUYWdOYW1lKEZSQU1FX1NFQ1RJT04pOworICAgICAgcmV0dXJuIEZ1bmMxICsgdGFnICsgIiMiOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRBdXRvc1NlY3Rpb25OYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZGdW5jKSB7CisgICAgICBzdGQ6OnN0cmluZyBGdW5jMSA9IGFkZFByZWZpeChGdW5jKTsKKyAgICAgIHN0ZDo6c3RyaW5nIHRhZyA9IGdldFRhZ05hbWUoQVVUT1NfU0VDVElPTik7CisgICAgICByZXR1cm4gRnVuYzEgKyB0YWcgKyAiIyI7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldENvZGVTZWN0aW9uTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmRnVuYykgeworICAgICAgc3RkOjpzdHJpbmcgRnVuYzEgPSBhZGRQcmVmaXgoRnVuYyk7CisgICAgICBzdGQ6OnN0cmluZyB0YWcgPSBnZXRUYWdOYW1lKENPREVfU0VDVElPTik7CisgICAgICByZXR1cm4gRnVuYzEgKyB0YWcgKyAiIyI7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFVzZXJTZWN0aW9uTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgICAgc3RkOjpzdHJpbmcgc25hbWUgPSBhZGRQcmVmaXgoTmFtZSk7OworICAgICAgc3RkOjpzdHJpbmcgdGFnID0gZ2V0VGFnTmFtZShVU0VSX1NFQ1RJT04pOworICAgICAgcmV0dXJuIHNuYW1lICsgdGFnICsgIiMiOworICAgIH0KKworICAgIC8vIHVkYXRhLCByb21kYXRhIGFuZCBpZGF0YSBzZWN0aW9uIG5hbWVzIGFyZSBnZW5lcmF0ZWQgYnkgYSBnaXZlbiBudW1iZXIuCisgICAgLy8gQHVkYXRhLjxudW0+LiMgCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFVkYXRhU2VjdGlvbk5hbWUodW5zaWduZWQgbnVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIikgeworICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICAgICAgIG8gPDwgZ2V0VGFnTmFtZShQUkVGSVhfU1lNQk9MKSA8PCBwcmVmaXggPDwgInVkYXRhLiIgPDwgbnVtIAorICAgICAgICAgPDwgIi4jIjsgCisgICAgICAgcmV0dXJuIG8uc3RyKCk7IAorICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRSb21kYXRhU2VjdGlvbk5hbWUoKSB7CisgICAgICByZXR1cm4gInJvbWRhdGEuIyI7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFNoYXJlZFVEYXRhU2VjdGlvbk5hbWUoKSB7CisgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgICAgICAgbyA8PCBnZXRUYWdOYW1lKFBSRUZJWF9TWU1CT0wpICA8PCAidWRhdGFfc2hyIiA8PCAiLiMiOworICAgICAgIHJldHVybiBvLnN0cigpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRSb21kYXRhU2VjdGlvbk5hbWUodW5zaWduZWQgbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpIHsKKyAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgICAgICBvIDw8IGdldFRhZ05hbWUoUFJFRklYX1NZTUJPTCkgPDwgcHJlZml4IDw8ICJyb21kYXRhLiIgPDwgbnVtIAorICAgICAgICAgPDwgIi4jIjsKKyAgICAgICByZXR1cm4gby5zdHIoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0SWRhdGFTZWN0aW9uTmFtZSh1bnNpZ25lZCBudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpIHsKKyAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgICAgICBvIDw8IGdldFRhZ05hbWUoUFJFRklYX1NZTUJPTCkgPDwgcHJlZml4IDw8ICJpZGF0YS4iIDw8IG51bSAKKyAgICAgICAgIDw8ICIuIyI7IAorICAgICAgIHJldHVybiBvLnN0cigpOyAKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIGJvb2wgaXNMb2NhbE5hbWUgKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgICBpZiAoZ2V0U3ltYm9sVGFnKE5hbWUpID09IEFVVE9TX0xBQkVMKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgaW5saW5lIHN0YXRpYyBib29sIGlzTWVtSW50cmluc2ljIChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgICAgaWYgKE5hbWUuY29tcGFyZSgiQG1lbWNweSIpID09IDAgfHwgTmFtZS5jb21wYXJlKCJAbWVtc2V0IikgPT0gMCB8fAorICAgICAgICAgIE5hbWUuY29tcGFyZSgiQG1lbW1vdmUiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ3VycmVudGx5IG5hbWVzIG9mIGxpYmNhbGxzIGFyZSBhc3NpZ25lZCBkdXJpbmcgVGFyZ2V0TG93ZXJpbmcKKyAgICAvLyBvYmplY3QgY29uc3RydWN0aW9uLiBUaGVyZSBpcyBubyBwcm92aXNpb24gdG8gY2hhbmdlIHRoZSB3aGVuIHRoZSAKKyAgICAvLyBjb2RlIGZvciBhIGZ1bmN0aW9uIElMIGZ1bmN0aW9uIGJlaW5nIGdlbmVyYXRlZC4gCisgICAgLy8gU28gd2UgaGF2ZSB0byBjaGFuZ2UgdGhlc2UgbmFtZXMgd2hpbGUgcHJpbnRpbmcgYXNzZW1ibHkuCisgICAgLy8gV2UgbmVlZCB0byBkbyB0aGF0IG1haW5seSBmb3IgbmFtZXMgcmVsYXRlZCB0byBpbnRyaW5zaWNzLiBUaGlzCisgICAgLy8gZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGEgbmFtZSBuZWVkcyB0byBiZSBjbG9uZWQuIAorICAgIGlubGluZSBzdGF0aWMgYm9vbCBpc0ludHJpbnNpY1N0dWZmKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZSBjb250YWlucyBMSUJDQUxMIG1hcmtlciwgb3IgYSBNZW1JbnRyaW5pc2MuCisgICAgICAvLyB0aGVzZSBhcmUgbWFpbmx5IEFSR1NfTEFCRUwsIFJFVF9MQUJFTCwgYW5kIHRoZSBMSUJDQUxMIG5hbWUgaXRzZWxmLgorICAgICAgaWYgKChOYW1lLmZpbmQoZ2V0VGFnTmFtZShMSUJDQUxMKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIAorICAgICAgICAgIHx8IGlzTWVtSW50cmluc2ljKE5hbWUpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZW5hbWUgdGhlIG5hbWUgZm9yIElMLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjpzdHJpbmcgUmVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgICBzdGQ6OnN0cmluZyBOZXduYW1lOworICAgICAgLy8gSWYgaXRzIGEgbGFiZWwgKExJQkNBTEwrRnVuYytMQUJFTCksIGNoYW5nZSBpdCB0bworICAgICAgLy8gKExJQkNBTEwrRnVuYytJTCtMQUJFTCkuCisgICAgICBUQUdTIGlkID0gZ2V0U3ltYm9sVGFnKE5hbWUpOworICAgICAgaWYgKGlkID09IEFSR1NfTEFCRUwgfHwgaWQgPT0gUkVUX0xBQkVMKSB7CisgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IE5hbWUuZmluZChnZXRUYWdOYW1lKGlkKSk7CisgICAgICAgIE5ld25hbWUgPSBOYW1lLnN1YnN0cigwLCBwb3MpICsgIi5JTCIgKyBnZXRUYWdOYW1lKGlkKTsKKyAgICAgICAgcmV0dXJuIE5ld25hbWU7CisgICAgICB9CisgCisgICAgICAvLyBFbHNlLCBqdXN0IGFwcGVuZCBJTCB0byBuYW1lLiAKKyAgICAgIHJldHVybiBOYW1lICsgIi5JTCI7CisgICB9CisgICAgCisgICAgCisgICAKKworICAgIGlubGluZSBzdGF0aWMgYm9vbCBpc0xvY2FsVG9GdW5jIChzdGQ6OnN0cmluZyAmRnVuYywgc3RkOjpzdHJpbmcgJlZhcikgeworICAgICAgaWYgKCEgaXNMb2NhbE5hbWUoVmFyKSkgcmV0dXJuIGZhbHNlOworCisgICAgICBzdGQ6OnN0cmluZyBGdW5jMSA9IGFkZFByZWZpeChGdW5jKTsKKyAgICAgIC8vIEV4dHJhY3QgZnVuYyBuYW1lIG9mIHRoZSB2YXJpbGFibGUuCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZm5hbWUgPSBnZXRGdW5jTmFtZUZvclN5bShWYXIpOworCisgICAgICBpZiAoZm5hbWUuY29tcGFyZShGdW5jMSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAgIC8vIEdldCB0aGUgc2VjdGlvbiBmb3IgdGhlIGdpdmVuIGV4dGVybmFsIHN5bWJvbCBuYW1lcy4KKyAgICAvLyBUaGlzIHRyaWVzIHRvIGZpbmQgdGhlIHR5cGUgKFRhZykgb2YgdGhlIHN5bWJvbCBmcm9tIGl0cyBtYW5nbGVkIG5hbWUKKyAgICAvLyBhbmQgcmV0dXJuIGFwcHJvcHJpYXRlIHNlY3Rpb24gbmFtZSBmb3IgaXQuCisgICAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBnZXRTZWN0aW9uTmFtZUZvclN5bShjb25zdCBzdGQ6OnN0cmluZyAmU3ltMSkgeworICAgICAgc3RkOjpzdHJpbmcgU3ltID0gYWRkUHJlZml4KFN5bTEpOworCisgICAgICBzdGQ6OnN0cmluZyBTZWN0aW9uTmFtZTsKKyAKKyAgICAgIHN0ZDo6c3RyaW5nIEZuYW1lID0gZ2V0RnVuY05hbWVGb3JTeW0gKFN5bSk7CisgICAgICBUQUdTIGlkID0gZ2V0U3ltYm9sVGFnIChTeW0pOworCisgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIGRlZmF1bHQgOiBhc3NlcnQgKDAgJiYgIkNvdWxkIG5vdCBkZXRlcm1pbmUgZXh0ZXJuYWwgc3ltYm9sIHR5cGUiKTsKKyAgICAgICAgY2FzZSBGUkFNRV9MQUJFTDoKKyAgICAgICAgY2FzZSBSRVRfTEFCRUw6CisgICAgICAgIGNhc2UgVEVNUFNfTEFCRUw6CisgICAgICAgIGNhc2UgQVJHU19MQUJFTDogIHsKKyAgICAgICAgICByZXR1cm4gZ2V0RnJhbWVTZWN0aW9uTmFtZShGbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBVVRPU19MQUJFTDogeworICAgICAgICAgIHJldHVybiBnZXRBdXRvc1NlY3Rpb25OYW1lKEZuYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vLyBSZXR1cm4gT3ZlcmxheSBOYW1lIGZvciB0aGUgc2VjdGlvbi4KKyAgICAvLy8gVGhlIEFCSSBDb252ZW50aW9uIGlzOiBAPENvbG9yPi4jIy48c2VjdGlvbl90YWc+CisgICAgLy8vIFRoZSBzZWN0aW9uX3RhZyBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgU2VjdE5hbWUgcGFyYW1ldGVyIGFuZAorICAgIC8vLyBhbmQgQ29sb3IgaXMgcGFzc2VkIGluIHBhcmFtZXRlci4KKyAgICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nICBnZXRPdmVybGF5TmFtZShzdGQ6OnN0cmluZyBTZWN0TmFtZSwgaW50IENvbG9yKSB7CisgICAgICAvLyBGSVhNRTogT25seSBhdXRvc19zZWN0aW9uIGFuZCBmcmFtZV9zZWN0aW9uIGFyZSBjb2xvcmVkLgorICAgICAgLy8gU28gY2hlY2sgYW5kIGFzc2VydCBpZiB0aGUgcGFzc2VkIFNlY3ROYW1lIGRvZXMgbm90IGhhdmUgQVVUT1NfU0VDVElPTgorICAgICAgLy8gb3IgRlJBTUVfU0VDVElPTiB0YWcgaW4gaXQuCisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgICAgIG8gPDwgZ2V0VGFnTmFtZShQUkVGSVhfU1lNQk9MKSA8PCBDb2xvciA8PCAiLiMjIiAKKyAgICAgICAgPDwgU2VjdE5hbWUuc3Vic3RyKFNlY3ROYW1lLmZpbmQoIi4iKSk7CisKKyAgICAgIHJldHVybiBvLnN0cigpOworICAgIH0gCisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBmdW5jdGlvbiBpcyBhbiBJU1IKKyAgICBpbmxpbmUgc3RhdGljIGJvb2wgaXNJU1IoY29uc3Qgc3RkOjpzdHJpbmcgU2VjdE5hbWUpIHsKKyAgICAgICBpZiAoU2VjdE5hbWUuZmluZCgiaW50ZXJydXB0IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGFkZHJlc3MgZm9yIElTUiBzdGFydHMgaW4gcm9tLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0SVNSQWRkcih2b2lkKSB7CisgICAgICByZXR1cm4gIjB4NCI7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiBjbG9uZSBvZiBhIGZ1bmN0aW9uLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRDbG9uZUZuTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmRnVuYykgeworICAgICAgIHJldHVybiAoRnVuYyArICIuSUwiKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIGNsb25lIG9mIGEgdmFyaWFibGUuCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldENsb25lVmFyTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmRm4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlZhcikgeworICAgICAgc3RkOjpzdHJpbmcgY2xvbmVWYXJOYW1lID0gVmFyOworICAgICAgLy8gVGhlc2UgdmFycyBhcmUgbmFtZWQgbGlrZSBmdW4uYXV0by52YXIuCisgICAgICAvLyBKdXN0IHJlcGxhY2UgdGhlIGZ1bmN0aW9uIG5hbWUsIHdpdGggY2xvbmUgZnVuY3Rpb24gbmFtZS4KKyAgICAgIHN0ZDo6c3RyaW5nIGNsb25lRm5OYW1lID0gZ2V0Q2xvbmVGbk5hbWUoRm4pOworICAgICAgY2xvbmVWYXJOYW1lLnJlcGxhY2UoY2xvbmVWYXJOYW1lLmZpbmQoRm4pLCBGbi5sZW5ndGgoKSwgY2xvbmVGbk5hbWUpOworICAgICAgcmV0dXJuIGNsb25lVmFyTmFtZTsKKyAgICB9CisgIH07IC8vIGNsYXNzIFBBTi4KK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZEZWJ1Z0luZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNkRlYnVnSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5NDhkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZEZWJ1Z0luZm8uY3BwCkBAIC0wLDAgKzEsNDkwIEBACisKKy8vPT09LS0gUElDMTZEZWJ1Z0luZm8uY3BwIC0gSW1wbGVtZW50YXRpb24gZm9yIFBJQzE2IERlYnVnIEluZm9ybWF0aW9uID09PT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVwcmVzZW50aW5nIGRlYnVnIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJQSUMxNi5oIgorI2luY2x1ZGUgIlBJQzE2QUJJTmFtZXMuaCIKKyNpbmNsdWRlICJQSUMxNkRlYnVnSW5mby5oIiAKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gUG9wdWxhdGVEZWJ1Z0luZm8gLSBQb3B1bGF0ZSB0aGUgVHlwZU5vLCBBdXhbXSBhbmQgVGFnTmFtZSBmcm9tIFR5LgorLy8vCit2b2lkIFBJQzE2RGJnSW5mbzo6UG9wdWxhdGVEZWJ1Z0luZm8gKERJVHlwZSBUeSwgdW5zaWduZWQgc2hvcnQgJlR5cGVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSGFzQXV4LCBpbnQgQXV4W10sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmVGFnTmFtZSkgeworICBpZiAoVHkuaXNCYXNpY1R5cGUoKSkKKyAgICBQb3B1bGF0ZUJhc2ljVHlwZUluZm8gKFR5LCBUeXBlTm8pOworICBlbHNlIGlmIChUeS5pc0NvbXBvc2l0ZVR5cGUoKSkKKyAgICBQb3B1bGF0ZUNvbXBvc2l0ZVR5cGVJbmZvIChUeSwgVHlwZU5vLCBIYXNBdXgsIEF1eCwgVGFnTmFtZSk7CisgIGVsc2UgaWYgKFR5LmlzRGVyaXZlZFR5cGUoKSkKKyAgICBQb3B1bGF0ZURlcml2ZWRUeXBlSW5mbyAoVHksIFR5cGVObywgSGFzQXV4LCBBdXgsIFRhZ05hbWUpOworICBlbHNlIHsKKyAgICBUeXBlTm8gPSBQSUMxNkRiZzo6VF9OVUxMOworICAgIEhhc0F1eCA9IGZhbHNlOworICB9CisgIHJldHVybjsKK30KKworLy8vIFBvcHVsYXRlQmFzaWNUeXBlSW5mby0gUG9wdWxhdGUgVHlwZU5vIGZvciBiYXNpYyB0eXBlIGZyb20gVHkuCisvLy8KK3ZvaWQgUElDMTZEYmdJbmZvOjpQb3B1bGF0ZUJhc2ljVHlwZUluZm8gKERJVHlwZSBUeSwgdW5zaWduZWQgc2hvcnQgJlR5cGVObykgeworICBzdGQ6OnN0cmluZyBOYW1lID0gVHkuZ2V0TmFtZSgpOworICB1bnNpZ25lZCBzaG9ydCBCYXNlVHkgPSBHZXRUeXBlRGVidWdOdW1iZXIoTmFtZSk7CisgIFR5cGVObyA9IFR5cGVObyA8PCBQSUMxNkRiZzo6U19CQVNJQzsKKyAgVHlwZU5vID0gVHlwZU5vIHwgKDB4ZmZmZiAmIEJhc2VUeSk7Cit9CisKKy8vLyBQb3B1bGF0ZURlcml2ZWRUeXBlSW5mbyAtIFBvcHVsYXRlIFR5cGVObywgQXV4W10sIFRhZ05hbWUgZm9yIGRlcml2ZWQgdHlwZSAKKy8vLyBmcm9tIFR5LiBEZXJpdmVkIHR5cGVzIGFyZSBtb3N0bHkgcG9pbnRlcnMuCisvLy8KK3ZvaWQgUElDMTZEYmdJbmZvOjpQb3B1bGF0ZURlcml2ZWRUeXBlSW5mbyAoRElUeXBlIFR5LCB1bnNpZ25lZCBzaG9ydCAmVHlwZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNBdXgsIGludCBBdXhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlRhZ05hbWUpIHsKKworICBzd2l0Y2goVHkuZ2V0VGFnKCkpCisgIHsKKyAgICBjYXNlIGR3YXJmOjpEV19UQUdfcG9pbnRlcl90eXBlOgorICAgICAgVHlwZU5vID0gVHlwZU5vIDw8IFBJQzE2RGJnOjpTX0RFUklWRUQ7CisgICAgICBUeXBlTm8gPSBUeXBlTm8gfCBQSUMxNkRiZzo6RFRfUFRSOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIFR5cGVObyA9IFR5cGVObyA8PCBQSUMxNkRiZzo6U19ERVJJVkVEOworICB9CisgIAorICAvLyBXZSBhbHNvIG5lZWQgdG8gZW5jb2RlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFzZSB0eXBlIG9mCisgIC8vIHBvaW50ZXIgaW4gVHlwZU5vLgorICBESVR5cGUgQmFzZVR5cGUgPSBESURlcml2ZWRUeXBlKFR5KS5nZXRUeXBlRGVyaXZlZEZyb20oKTsKKyAgUG9wdWxhdGVEZWJ1Z0luZm8oQmFzZVR5cGUsIFR5cGVObywgSGFzQXV4LCBBdXgsIFRhZ05hbWUpOworfQorCisvLy8gUG9wdWxhdGVBcnJheVR5cGVJbmZvIC0gUG9wdWxhdGUgVHlwZU5vLCBBdXhbXSBmb3IgYXJyYXkgZnJvbSBUeS4KK3ZvaWQgUElDMTZEYmdJbmZvOjpQb3B1bGF0ZUFycmF5VHlwZUluZm8gKERJVHlwZSBUeSwgdW5zaWduZWQgc2hvcnQgJlR5cGVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc0F1eCwgaW50IEF1eFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlRhZ05hbWUpIHsKKworICBESUNvbXBvc2l0ZVR5cGUgQ1R5ID0gRElDb21wb3NpdGVUeXBlKFR5KTsKKyAgRElBcnJheSBFbGVtZW50cyA9IENUeS5nZXRUeXBlQXJyYXkoKTsKKyAgdW5zaWduZWQgc2hvcnQgc2l6ZSA9IDE7CisgIHVuc2lnbmVkIHNob3J0IERpbWVuc2lvbls0XT17MCwwLDAsMH07CisgIGZvciAodW5zaWduZWQgaSA9IDAsIE4gPSBFbGVtZW50cy5nZXROdW1FbGVtZW50cygpOyBpIDwgTjsgKytpKSB7CisgICAgRElEZXNjcmlwdG9yIEVsZW1lbnQgPSBFbGVtZW50cy5nZXRFbGVtZW50KGkpOworICAgIGlmIChFbGVtZW50LmdldFRhZygpID09IGR3YXJmOjpEV19UQUdfc3VicmFuZ2VfdHlwZSkgeworICAgICAgVHlwZU5vID0gVHlwZU5vIDw8IFBJQzE2RGJnOjpTX0RFUklWRUQ7CisgICAgICBUeXBlTm8gPSBUeXBlTm8gfCBQSUMxNkRiZzo6RFRfQVJZOworICAgICAgRElTdWJyYW5nZSBTdWJSYW5nZSA9IERJU3VicmFuZ2UoRWxlbWVudCk7CisgICAgICBEaW1lbnNpb25baV0gPSBTdWJSYW5nZS5nZXRIaSgpIC0gU3ViUmFuZ2UuZ2V0TG8oKSArIDE7CisgICAgICAvLyBFYWNoIGRpbWVuc2lvbiBpcyByZXByZXNlbnRlZCBieSAyIGJ5dGVzIHN0YXJ0aW5nIGF0IGJ5dGUgOS4KKyAgICAgIEF1eFs4K2kqMiswXSA9IERpbWVuc2lvbltpXTsKKyAgICAgIEF1eFs4K2kqMisxXSA9IERpbWVuc2lvbltpXSA+PiA4OworICAgICAgc2l6ZSA9IHNpemUgKiBEaW1lbnNpb25baV07CisgICAgfQorICB9CisgIEhhc0F1eCA9IHRydWU7CisgIC8vIEluIGF1eGlsbGFyeSBlbnRyeSBmb3IgYXJyYXksIDd0aCBhbmQgOHRoIGJ5dGUgcmVwcmVzZW50IGFycmF5IHNpemUuCisgIEF1eFs2XSA9IHNpemUgJiAweGZmOworICBBdXhbN10gPSBzaXplID4+IDg7CisgIERJVHlwZSBCYXNlVHlwZSA9IENUeS5nZXRUeXBlRGVyaXZlZEZyb20oKTsKKyAgUG9wdWxhdGVEZWJ1Z0luZm8oQmFzZVR5cGUsIFR5cGVObywgSGFzQXV4LCBBdXgsIFRhZ05hbWUpOworfQorCisvLy8gUG9wdWxhdGVTdHJ1Y3RPclVuaW9uVHlwZUluZm8gLSBQb3B1bGF0ZSBUeXBlTm8sIEF1eFtdICwgVGFnTmFtZSBmb3IgCisvLy8gc3RydWN0dXJlIG9yIHVuaW9uLgorLy8vCit2b2lkIFBJQzE2RGJnSW5mbzo6UG9wdWxhdGVTdHJ1Y3RPclVuaW9uVHlwZUluZm8gKERJVHlwZSBUeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICZUeXBlTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc0F1eCwgaW50IEF1eFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmVGFnTmFtZSkgeworICBESUNvbXBvc2l0ZVR5cGUgQ1R5ID0gRElDb21wb3NpdGVUeXBlKFR5KTsKKyAgVHlwZU5vID0gVHlwZU5vIDw8IFBJQzE2RGJnOjpTX0JBU0lDOworICBpZiAoVHkuZ2V0VGFnKCkgPT0gZHdhcmY6OkRXX1RBR19zdHJ1Y3R1cmVfdHlwZSkKKyAgICBUeXBlTm8gPSBUeXBlTm8gfCBQSUMxNkRiZzo6VF9TVFJVQ1Q7CisgIGVsc2UKKyAgICBUeXBlTm8gPSBUeXBlTm8gfCBQSUMxNkRiZzo6VF9VTklPTjsKKyAgVGFnTmFtZSA9IENUeS5nZXROYW1lKCk7CisgIC8vIFVuaXF1ZVN1ZmZpeCBpcyAubnVtYmVyIHdoZXJlIG51bWJlciBpcyBvYnRhaW5lZCBmcm9tCisgIC8vIGxsdm0uZGJnLmNvbXBvc2l0ZTxudW1iZXI+LgorICAvLyBGSVhNRTogVGhpcyB3aWxsIGJyZWFrIHdoZW4gY29tcG9zaXRlIHR5cGUgaXMgbm90IHJlcHJlc2VudGVkIGJ5CisgIC8vIGxsdm0uZGJnLmNvbXBvc2l0ZSogZ2xvYmFsIHZhcmlhYmxlLiBTaW5jZSB3ZSBuZWVkIHRvIHJldmlzaXQgCisgIC8vIFBJQzE2RGVidWdJbmZvIGltcGxlbWVudGF0aW9uIGFueXdheXMgYWZ0ZXIgdGhlIE1ETm9kZXMgYmFzZWQgCisgIC8vIGZyYW1ld29yayBpcyBkb25lLCBsZXQgdXMgY29udGludWUgd2l0aCB0aGUgd2F5IGl0IGlzLgorICBzdGQ6OnN0cmluZyBVbmlxdWVTdWZmaXggPSAiLiIgKyBUeS0+Z2V0TmFtZVN0cigpLnN1YnN0cigxOCk7CisgIFRhZ05hbWUgKz0gVW5pcXVlU3VmZml4OworICB1bnNpZ25lZCBzaG9ydCBzaXplID0gQ1R5LmdldFNpemVJbkJpdHMoKS84OworICAvLyA3dGggYW5kIDh0aCBieXRlIHJlcHJlc2VudCBzaXplLgorICBIYXNBdXggPSB0cnVlOworICBBdXhbNl0gPSBzaXplICYgMHhmZjsKKyAgQXV4WzddID0gc2l6ZSA+PiA4OworfQorCisvLy8gUG9wdWxhdGVFbnVtVHlwZUluZm8gLSBQb3B1bGF0ZSBUeXBlTm8gZm9yIGVudW0gZnJvbSBUeS4KK3ZvaWQgUElDMTZEYmdJbmZvOjpQb3B1bGF0ZUVudW1UeXBlSW5mbyAoRElUeXBlIFR5LCB1bnNpZ25lZCBzaG9ydCAmVHlwZU5vKSB7CisgIFR5cGVObyA9IFR5cGVObyA8PCBQSUMxNkRiZzo6U19CQVNJQzsKKyAgVHlwZU5vID0gVHlwZU5vIHwgUElDMTZEYmc6OlRfRU5VTTsKK30KKworLy8vIFBvcHVsYXRlQ29tcG9zaXRlVHlwZUluZm8gLSBQb3B1bGF0ZSBUeXBlTm8sIEF1eFtdIGFuZCBUYWdOYW1lIGZvciAKKy8vLyBjb21wb3NpdGUgdHlwZXMgZnJvbSBUeS4KKy8vLwordm9pZCBQSUMxNkRiZ0luZm86OlBvcHVsYXRlQ29tcG9zaXRlVHlwZUluZm8gKERJVHlwZSBUeSwgdW5zaWduZWQgc2hvcnQgJlR5cGVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNBdXgsIGludCBBdXhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmVGFnTmFtZSkgeworICBzd2l0Y2ggKFR5LmdldFRhZygpKSB7CisgICAgY2FzZSBkd2FyZjo6RFdfVEFHX2FycmF5X3R5cGU6IHsKKyAgICAgIFBvcHVsYXRlQXJyYXlUeXBlSW5mbyAoVHksIFR5cGVObywgSGFzQXV4LCBBdXgsIFRhZ05hbWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZHdhcmY6OiBEV19UQUdfdW5pb25fdHlwZToKKyAgICBjYXNlIGR3YXJmOjpEV19UQUdfc3RydWN0dXJlX3R5cGU6IHsKKyAgICAgIFBvcHVsYXRlU3RydWN0T3JVbmlvblR5cGVJbmZvIChUeSwgVHlwZU5vLCBIYXNBdXgsIEF1eCwgVGFnTmFtZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBkd2FyZjo6RFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6IHsKKyAgICAgIFBvcHVsYXRlRW51bVR5cGVJbmZvIChUeSwgVHlwZU5vKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgVHlwZU5vID0gVHlwZU5vIDw8IFBJQzE2RGJnOjpTX0RFUklWRUQ7CisgIH0KK30KKworLy8vIEdldFR5cGVEZWJ1Z051bWJlciAtIEdldCBkZWJ1ZyB0eXBlIG51bWJlciBmb3IgZ2l2ZW4gdHlwZS4KKy8vLwordW5zaWduZWQgUElDMTZEYmdJbmZvOjpHZXRUeXBlRGVidWdOdW1iZXIoc3RkOjpzdHJpbmcgJnR5cGUpICB7CisgIGlmICh0eXBlID09ICJjaGFyIikKKyAgICByZXR1cm4gUElDMTZEYmc6OlRfQ0hBUjsKKyAgZWxzZSBpZiAodHlwZSA9PSAic2hvcnQiKQorICAgIHJldHVybiBQSUMxNkRiZzo6VF9TSE9SVDsKKyAgZWxzZSBpZiAodHlwZSA9PSAiaW50IikKKyAgICByZXR1cm4gUElDMTZEYmc6OlRfSU5UOworICBlbHNlIGlmICh0eXBlID09ICJsb25nIikKKyAgICByZXR1cm4gUElDMTZEYmc6OlRfTE9ORzsKKyAgZWxzZSBpZiAodHlwZSA9PSAidW5zaWduZWQgY2hhciIpCisgICAgcmV0dXJuIFBJQzE2RGJnOjpUX1VDSEFSOworICBlbHNlIGlmICh0eXBlID09ICJ1bnNpZ25lZCBzaG9ydCIpCisgICAgcmV0dXJuIFBJQzE2RGJnOjpUX1VTSE9SVDsKKyAgZWxzZSBpZiAodHlwZSA9PSAidW5zaWduZWQgaW50IikKKyAgICByZXR1cm4gUElDMTZEYmc6OlRfVUlOVDsKKyAgZWxzZSBpZiAodHlwZSA9PSAidW5zaWduZWQgbG9uZyIpCisgICAgcmV0dXJuIFBJQzE2RGJnOjpUX1VMT05HOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisgCisvLy8gR2V0U3RvcmFnZUNsYXNzIC0gR2V0IHN0b3JhZ2UgY2xhc3MgZm9yIGdpdmUgZGVidWcgdmFyaWFibGUuCisvLy8KK3Nob3J0IFBJQzE2RGJnSW5mbzo6Z2V0U3RvcmFnZUNsYXNzKERJR2xvYmFsVmFyaWFibGUgRElHVikgeworICBzaG9ydCBDbGFzc05vOworICBpZiAoUEFOOjppc0xvY2FsTmFtZShESUdWLmdldE5hbWUoKSkpIHsKKyAgICAvLyBHZW5lcmF0aW5nIENfQVVUTyBoZXJlIGZhaWxzIGR1ZSB0byBlcnJvciBpbiBsaW5rZXIuIENoYW5nZSBpdCBvbmNlCisgICAgLy8gbGlua2VyIGlzIGZpeGVkLgorICAgIENsYXNzTm8gPSBQSUMxNkRiZzo6Q19TVEFUOworICB9CisgIGVsc2UgaWYgKERJR1YuaXNMb2NhbFRvVW5pdCgpKQorICAgIENsYXNzTm8gPSBQSUMxNkRiZzo6Q19TVEFUOworICBlbHNlCisgICAgQ2xhc3NObyA9IFBJQzE2RGJnOjpDX0VYVDsKKyAgcmV0dXJuIENsYXNzTm87Cit9CisKKy8vLyBCZWdpbk1vZHVsZSAtIEVtaXQgbmVjZXNzYXJ5IGRlYnVnIGluZm8gdG8gc3RhcnQgYSBNb2R1bGUgYW5kIGRvIG90aGVyCisvLy8gcmVxdWlyZWQgaW5pdGlhbGl6YXRpb25zLgordm9pZCBQSUMxNkRiZ0luZm86OkJlZ2luTW9kdWxlKE1vZHVsZSAmTSkgeworICAvLyBFbWl0IGZpbGUgZGlyZWN0aXZlIGZvciBtb2R1bGUuCisgIERlYnVnSW5mb0ZpbmRlciBEYmdGaW5kZXI7CisgIERiZ0ZpbmRlci5wcm9jZXNzTW9kdWxlKE0pOworICBpZiAoRGJnRmluZGVyLmNvbXBpbGVfdW5pdF9jb3VudCgpICE9IDApIHsKKyAgICAvLyBGSVhNRSA6IFdoYXQgaWYgbW9yZSB0aGVuIG9uZSBDVXMgYXJlIHByZXNlbnQgaW4gYSBtb2R1bGUgPworICAgIE1ETm9kZSAqQ1UgPSAqRGJnRmluZGVyLmNvbXBpbGVfdW5pdF9iZWdpbigpOworICAgIEVtaXREZWJ1Z0RpcmVjdGl2ZXMgPSB0cnVlOworICAgIFN3aXRjaFRvQ1UoQ1UpOworICB9CisgIC8vIEVtaXQgZGVidWcgaW5mbyBmb3IgZGVjbHMgb2YgY29tcG9zaXRlIHR5cGVzLgorICBFbWl0Q29tcG9zaXRlVHlwZURlY2xzKE0pOworfQorCisvLy8gSGVscGVyIHRvIGZpbmQgZmlyc3QgdmFsaWQgZGVidWcgbG9jIGZvciBhIGZ1bmN0aW9uLgorLy8vCitzdGF0aWMgY29uc3QgRGVidWdMb2MgR2V0RGVidWdMb2NGb3JGdW5jdGlvbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIERlYnVnTG9jIERMOworICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IgSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIElJID0gSS0+YmVnaW4oKSwgRSA9IEktPmVuZCgpOworICAgICAgICAgSUkgIT0gRTsgKytJSSkgeworICAgICAgREwgPSBJSS0+Z2V0RGVidWdMb2MoKTsKKyAgICAgIGlmICghREwuaXNVbmtub3duKCkpCisgICAgICAgIHJldHVybiBETDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIERMOworfQorCisvLy8gQmVnaW5GdW5jdGlvbiAtIEVtaXQgbmVjZXNzYXJ5IGRlYnVnIGluZm8gdG8gc3RhcnQgYSBmdW5jdGlvbi4KKy8vLwordm9pZCBQSUMxNkRiZ0luZm86OkJlZ2luRnVuY3Rpb24oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBpZiAoISBFbWl0RGVidWdEaXJlY3RpdmVzKSByZXR1cm47CisgIAorICAvLyBSZXRyZWl2ZSB0aGUgZmlyc3QgdmFsaWQgZGVidWcgTG9jIGFuZCBwcm9jZXNzIGl0LgorICBjb25zdCBEZWJ1Z0xvYyAmREwgPSBHZXREZWJ1Z0xvY0ZvckZ1bmN0aW9uKE1GKTsKKyAgLy8gRW1pdCBkZWJ1ZyBpbmZvIG9ubHkgaWYgdmFsaWQgZGVidWcgaW5mbyBpcyBhdmFpbGFibGUuCisgIGlmICghREwuaXNVbmtub3duKCkpIHsKKyAgICBDaGFuZ2VEZWJ1Z0xvYyhNRiwgREwsIHRydWUpOworICAgIEVtaXRGdW5jdEJlZ2luREkoTUYuZ2V0RnVuY3Rpb24oKSk7CisgIH0gCisgIC8vIFNldCBjdXJyZW50IGxpbmUgdG8gMCBzbyB0aGF0LmxpbmUgZGlyZWN0aXZlIGlzIGdlbmVhcnRlZCBhZnRlciAuYmYuCisgIEN1ckxpbmUgPSAwOworfQorCisvLy8gQ2hhbmdlRGVidWdMb2MgLSBUYWtlIG5lY2Vzc2FyeSBzdGVwcyB3aGVuIERlYnVnTG9jIGNoYW5nZXMuCisvLy8gQ3VyRmlsZSBhbmQgQ3VyTGluZSBtYXkgY2hhbmdlIGFzIGEgcmVzdWx0IG9mIHRoaXMuCisvLy8KK3ZvaWQgUElDMTZEYmdJbmZvOjpDaGFuZ2VEZWJ1Z0xvYyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLCBib29sIElzSW5CZWdpbkZ1bmN0aW9uKSB7CisgIGlmICghRW1pdERlYnVnRGlyZWN0aXZlcykgcmV0dXJuOworICBhc3NlcnQoIURMLmlzVW5rbm93bigpICYmICJjYW4ndCBjaGFuZ2UgdG8gaW52YWxpZCBkZWJ1ZyBsb2MiKTsKKworICBTd2l0Y2hUb0NVKERMLmdldFNjb3BlKE1GLmdldEZ1bmN0aW9uKCktPmdldENvbnRleHQoKSkpOworICBTd2l0Y2hUb0xpbmUoREwuZ2V0TGluZSgpLCBJc0luQmVnaW5GdW5jdGlvbik7Cit9CisKKy8vLyBTd2l0Y2hUb0xpbmUgLSBFbWl0IGxpbmUgZGlyZWN0aXZlIGZvciBhIG5ldyBsaW5lLgorLy8vCit2b2lkIFBJQzE2RGJnSW5mbzo6U3dpdGNoVG9MaW5lKHVuc2lnbmVkIExpbmUsIGJvb2wgSXNJbkJlZ2luRnVuY3Rpb24pIHsKKyAgaWYgKEN1ckxpbmUgPT0gTGluZSkgcmV0dXJuOworICBpZiAoIUlzSW5CZWdpbkZ1bmN0aW9uKQorICAgIE9TLkVtaXRSYXdUZXh0KCJcblx0LmxpbmUgIiArIFR3aW5lKExpbmUpKTsKKyAgQ3VyTGluZSA9IExpbmU7Cit9CisKKy8vLyBFbmRGdW5jdGlvbiAtIEVtaXQgLmVmIGZvciBlbmQgb2YgZnVuY3Rpb24uCisvLy8KK3ZvaWQgUElDMTZEYmdJbmZvOjpFbmRGdW5jdGlvbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIGlmICghIEVtaXREZWJ1Z0RpcmVjdGl2ZXMpIHJldHVybjsKKyAgY29uc3QgRGVidWdMb2MgJkRMID0gR2V0RGVidWdMb2NGb3JGdW5jdGlvbihNRik7CisgIC8vIEVtaXQgZGVidWcgaW5mbyBvbmx5IGlmIHZhbGlkIGRlYnVnIGluZm8gaXMgYXZhaWxhYmxlLgorICBpZiAoIURMLmlzVW5rbm93bigpKQorICAgIEVtaXRGdW5jdEVuZERJKE1GLmdldEZ1bmN0aW9uKCksIEN1ckxpbmUpOworfQorCisvLy8gRW5kTW9kdWxlIC0gRW1pdCAuZW9mIGZvciBlbmQgb2YgbW9kdWxlLgorLy8vCit2b2lkIFBJQzE2RGJnSW5mbzo6RW5kTW9kdWxlKE1vZHVsZSAmTSkgeworICBpZiAoISBFbWl0RGVidWdEaXJlY3RpdmVzKSByZXR1cm47CisgIEVtaXRWYXJEZWJ1Z0luZm8oTSk7CisgIGlmIChDdXJGaWxlICE9ICIiKSBPUy5FbWl0UmF3VGV4dChTdHJpbmdSZWYoIlxuXHQuZW9mIikpOworfQorIAorLy8vIEVtaXRDb21wb3NpdGVUeXBlRWxlbWVudHMgLSBFbWl0IGRlYnVnIGluZm9ybWF0aW9uIGZvciBtZW1iZXJzIG9mIGEgCisvLy8gY29tcG9zaXRlIHR5cGUuCisvLy8gCit2b2lkIFBJQzE2RGJnSW5mbzo6RW1pdENvbXBvc2l0ZVR5cGVFbGVtZW50cyAoRElDb21wb3NpdGVUeXBlIENUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBTdWZmaXhObykgeworICB1bnNpZ25lZCBsb25nIFZhbHVlID0gMDsKKyAgRElBcnJheSBFbGVtZW50cyA9IENUeS5nZXRUeXBlQXJyYXkoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgTiA9IEVsZW1lbnRzLmdldE51bUVsZW1lbnRzKCk7IGkgPCBOOyBpKyspIHsKKyAgICBESURlc2NyaXB0b3IgRWxlbWVudCA9IEVsZW1lbnRzLmdldEVsZW1lbnQoaSk7CisgICAgdW5zaWduZWQgc2hvcnQgVHlwZU5vID0gMDsKKyAgICBib29sIEhhc0F1eCA9IGZhbHNlOworICAgIGludCBFbGVtZW50QXV4W1BJQzE2RGJnOjpBdXhTaXplXSA9IHsgMCB9OworICAgIHN0ZDo6c3RyaW5nIFRhZ05hbWUgPSAiIjsKKyAgICBESURlcml2ZWRUeXBlIERJVHkoRWxlbWVudCk7CisgICAgdW5zaWduZWQgc2hvcnQgRWxlbWVudFNpemUgPSBESVR5LmdldFNpemVJbkJpdHMoKS84OworICAgIC8vIEdldCBtYW5nbGVkZGQgbmFtZSBmb3IgdGhpcyBzdHJ1Y3R1cmUvdW5pb24gIGVsZW1lbnQuCisgICAgc3RkOjpzdHJpbmcgTWFuZ01lbU5hbWUgPSBESVR5LmdldE5hbWUoKS5zdHIoKSArIFN1ZmZpeE5vOworICAgIFBvcHVsYXRlRGVidWdJbmZvKERJVHksIFR5cGVObywgSGFzQXV4LCBFbGVtZW50QXV4LCBUYWdOYW1lKTsKKyAgICBzaG9ydCBDbGFzcyA9IDA7CisgICAgaWYoIENUeS5nZXRUYWcoKSA9PSBkd2FyZjo6RFdfVEFHX3VuaW9uX3R5cGUpCisgICAgICBDbGFzcyA9IFBJQzE2RGJnOjpDX01PVTsKKyAgICBlbHNlIGlmICAoQ1R5LmdldFRhZygpID09IGR3YXJmOjpEV19UQUdfc3RydWN0dXJlX3R5cGUpCisgICAgICBDbGFzcyA9IFBJQzE2RGJnOjpDX01PUzsKKyAgICBFbWl0U3ltYm9sKE1hbmdNZW1OYW1lLmNfc3RyKCksIENsYXNzLCBUeXBlTm8sIFZhbHVlKTsKKyAgICBpZiAoQ1R5LmdldFRhZygpID09IGR3YXJmOjpEV19UQUdfc3RydWN0dXJlX3R5cGUpCisgICAgICBWYWx1ZSArPSBFbGVtZW50U2l6ZTsKKyAgICBpZiAoSGFzQXV4KQorICAgICAgRW1pdEF1eEVudHJ5KE1hbmdNZW1OYW1lLmNfc3RyKCksIEVsZW1lbnRBdXgsIFBJQzE2RGJnOjpBdXhTaXplLCBUYWdOYW1lKTsKKyAgfQorfQorCisvLy8gRW1pdENvbXBvc2l0ZVR5cGVEZWNscyAtIEVtaXQgY29tcG9zaXRlIHR5cGUgZGVjbGFyYXRpb25zIGxpa2Ugc3RydWN0dXJlIAorLy8vIGFuZCB1bmlvbiBkZWNsYXJhdGlvbnMuCisvLy8KK3ZvaWQgUElDMTZEYmdJbmZvOjpFbWl0Q29tcG9zaXRlVHlwZURlY2xzKE1vZHVsZSAmTSkgeworICBEZWJ1Z0luZm9GaW5kZXIgRGJnRmluZGVyOworICBEYmdGaW5kZXIucHJvY2Vzc01vZHVsZShNKTsKKyAgZm9yIChEZWJ1Z0luZm9GaW5kZXI6Oml0ZXJhdG9yIEkgPSBEYmdGaW5kZXIudHlwZV9iZWdpbigpLAorICAgICAgICAgRSA9IERiZ0ZpbmRlci50eXBlX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIERJQ29tcG9zaXRlVHlwZSBDVHkoKkkpOworICAgIGlmICghQ1R5LlZlcmlmeSgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKENUeS5nZXRUYWcoKSA9PSBkd2FyZjo6RFdfVEFHX3VuaW9uX3R5cGUgfHwKKyAgICAgICAgQ1R5LmdldFRhZygpID09IGR3YXJmOjpEV19UQUdfc3RydWN0dXJlX3R5cGUgKSB7CisgICAgICAvLyBHZXQgdGhlIG51bWJlciBhZnRlciBsbHZtLmRiZy5jb21wb3NpdGUgYW5kIG1ha2UgVW5pcXVlU3VmZml4IGZyb20gCisgICAgICAvLyBpdC4KKyAgICAgIHN0ZDo6c3RyaW5nIERJVmFyID0gQ1R5LT5nZXROYW1lU3RyKCk7CisgICAgICBzdGQ6OnN0cmluZyBVbmlxdWVTdWZmaXggPSAiLiIgKyBESVZhci5zdWJzdHIoMTgpOworICAgICAgc3RkOjpzdHJpbmcgTWFuZ2xlZENUeU5hbWUgPSBDVHkuZ2V0TmFtZSgpLnN0cigpICsgVW5pcXVlU3VmZml4OworICAgICAgdW5zaWduZWQgc2hvcnQgc2l6ZSA9IENUeS5nZXRTaXplSW5CaXRzKCkvODsKKyAgICAgIGludCBBdXhbUElDMTZEYmc6OkF1eFNpemVdID0gezB9OworICAgICAgLy8gN3RoIGFuZCA4dGggYnl0ZSByZXByZXNlbnQgc2l6ZSBvZiBzdHJ1Y3R1cmUvdW5pb24uCisgICAgICBBdXhbNl0gPSBzaXplICYgMHhmZjsKKyAgICAgIEF1eFs3XSA9IHNpemUgPj4gODsKKyAgICAgIC8vIEVtaXQgLmRlZiBmb3Igc3RydWN0dXJlL3VuaW9uIHRhZy4KKyAgICAgIGlmKCBDVHkuZ2V0VGFnKCkgPT0gZHdhcmY6OkRXX1RBR191bmlvbl90eXBlKQorICAgICAgICBFbWl0U3ltYm9sKE1hbmdsZWRDVHlOYW1lLmNfc3RyKCksIFBJQzE2RGJnOjpDX1VOVEFHKTsKKyAgICAgIGVsc2UgaWYgIChDVHkuZ2V0VGFnKCkgPT0gZHdhcmY6OkRXX1RBR19zdHJ1Y3R1cmVfdHlwZSkgCisgICAgICAgIEVtaXRTeW1ib2woTWFuZ2xlZENUeU5hbWUuY19zdHIoKSwgUElDMTZEYmc6OkNfU1RSVEFHKTsKKyAgICAgIAorICAgICAgLy8gRW1pdCBhdXhpbGlhcnkgZGVidWcgaW5mb3JtYXRpb24gZm9yIHN0cnVjdHVyZS91bmlvbiB0YWcuIAorICAgICAgRW1pdEF1eEVudHJ5KE1hbmdsZWRDVHlOYW1lLmNfc3RyKCksIEF1eCwgUElDMTZEYmc6OkF1eFNpemUpOworICAgICAgCisgICAgICAvLyBFbWl0IG1lbWJlcnMuCisgICAgICBFbWl0Q29tcG9zaXRlVHlwZUVsZW1lbnRzIChDVHksIFVuaXF1ZVN1ZmZpeCk7CisgICAgICAKKyAgICAgIC8vIEVtaXQgbWFuZ2xlZCBTeW1ib2wgZm9yIGVuZCBvZiBzdHJ1Y3R1cmUvdW5pb24uCisgICAgICBzdGQ6OnN0cmluZyBFT1NTeW1ib2wgPSAiLmVvcyIgKyBVbmlxdWVTdWZmaXg7CisgICAgICBFbWl0U3ltYm9sKEVPU1N5bWJvbC5jX3N0cigpLCBQSUMxNkRiZzo6Q19FT1MpOworICAgICAgRW1pdEF1eEVudHJ5KEVPU1N5bWJvbC5jX3N0cigpLCBBdXgsIFBJQzE2RGJnOjpBdXhTaXplLCAKKyAgICAgICAgICAgICAgICAgICBNYW5nbGVkQ1R5TmFtZS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKworCisvLy8gRW1pdEZ1bmN0QmVnaW5ESSAtIEVtaXQgLmJmIGZvciBmdW5jdGlvbi4KKy8vLwordm9pZCBQSUMxNkRiZ0luZm86OkVtaXRGdW5jdEJlZ2luREkoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgc3RkOjpzdHJpbmcgRnVuY3ROYW1lID0gRi0+Z2V0TmFtZSgpOworICBpZiAoRW1pdERlYnVnRGlyZWN0aXZlcykgeworICAgIHN0ZDo6c3RyaW5nIEZ1bmN0QmVnaW5TeW0gPSAiLmJmLiIgKyBGdW5jdE5hbWU7CisgICAgc3RkOjpzdHJpbmcgQmxvY2tCZWdpblN5bSA9ICIuYmIuIiArIEZ1bmN0TmFtZTsKKworICAgIGludCBCRkF1eFtQSUMxNkRiZzo6QXV4U2l6ZV0gPSB7MH07CisgICAgQkZBdXhbNF0gPSBDdXJMaW5lOworICAgIEJGQXV4WzVdID0gQ3VyTGluZSA+PiA4OworCisgICAgLy8gRW1pdCBkZWJ1ZyBkaXJlY3RpdmVzIGZvciBiZWdpbm5pbmcgb2YgZnVuY3Rpb24uCisgICAgRW1pdFN5bWJvbChGdW5jdEJlZ2luU3ltLCBQSUMxNkRiZzo6Q19GQ04pOworICAgIEVtaXRBdXhFbnRyeShGdW5jdEJlZ2luU3ltLCBCRkF1eCwgUElDMTZEYmc6OkF1eFNpemUpOworCisgICAgRW1pdFN5bWJvbChCbG9ja0JlZ2luU3ltLCBQSUMxNkRiZzo6Q19CTE9DSyk7CisgICAgRW1pdEF1eEVudHJ5KEJsb2NrQmVnaW5TeW0sIEJGQXV4LCBQSUMxNkRiZzo6QXV4U2l6ZSk7CisgIH0KK30KKworLy8vIEVtaXRGdW5jdEVuZERJIC0gRW1pdCAuZWYgZm9yIGZ1bmN0aW9uIGVuZC4KKy8vLwordm9pZCBQSUMxNkRiZ0luZm86OkVtaXRGdW5jdEVuZERJKGNvbnN0IEZ1bmN0aW9uICpGLCB1bnNpZ25lZCBMaW5lKSB7CisgIHN0ZDo6c3RyaW5nIEZ1bmN0TmFtZSA9IEYtPmdldE5hbWUoKTsKKyAgaWYgKEVtaXREZWJ1Z0RpcmVjdGl2ZXMpIHsKKyAgICBzdGQ6OnN0cmluZyBGdW5jdEVuZFN5bSA9ICIuZWYuIiArIEZ1bmN0TmFtZTsKKyAgICBzdGQ6OnN0cmluZyBCbG9ja0VuZFN5bSA9ICIuZWIuIiArIEZ1bmN0TmFtZTsKKworICAgIC8vIEVtaXQgZGVidWcgZGlyZWN0aXZlcyBmb3IgZW5kIG9mIGZ1bmN0aW9uLgorICAgIEVtaXRTeW1ib2woQmxvY2tFbmRTeW0sIFBJQzE2RGJnOjpDX0JMT0NLKTsKKyAgICBpbnQgRUZBdXhbUElDMTZEYmc6OkF1eFNpemVdID0gezB9OworICAgIC8vIDV0aCBhbmQgNnRoIGJ5dGUgc3RhbmQgZm9yIGxpbmUgbnVtYmVyLgorICAgIEVGQXV4WzRdID0gQ3VyTGluZTsKKyAgICBFRkF1eFs1XSA9IEN1ckxpbmUgPj4gODsKKyAgICBFbWl0QXV4RW50cnkoQmxvY2tFbmRTeW0sIEVGQXV4LCBQSUMxNkRiZzo6QXV4U2l6ZSk7CisgICAgRW1pdFN5bWJvbChGdW5jdEVuZFN5bSwgUElDMTZEYmc6OkNfRkNOKTsKKyAgICBFbWl0QXV4RW50cnkoRnVuY3RFbmRTeW0sIEVGQXV4LCBQSUMxNkRiZzo6QXV4U2l6ZSk7CisgIH0KK30KKworLy8vIEVtaXRBdXhFbnRyeSAtIEVtaXQgQXV4aWxpYXJ5IGRlYnVnIGluZm9ybWF0aW9uLgorLy8vCit2b2lkIFBJQzE2RGJnSW5mbzo6RW1pdEF1eEVudHJ5KGNvbnN0IHN0ZDo6c3RyaW5nIFZhck5hbWUsIGludCBBdXhbXSwgaW50IE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgVGFnTmFtZSkgeworICBzdGQ6OnN0cmluZyBUbXA7CisgIC8vIFRhZ05hbWUgaXMgZW1pdHRlZCBpbiBjYXNlIG9mIHN0cnVjdHVyZS91bmlvbiBvYmplY3RzLgorICBpZiAoIVRhZ05hbWUuZW1wdHkoKSkgVG1wICs9ICIsICIgKyBUYWdOYW1lOworICAKKyAgZm9yIChpbnQgaSA9IDA7IGk8TnVtOyBpKyspCisgICAgVG1wICs9ICIsIiArIHV0b3N0cihBdXhbaV0gJiAweGZmKTsKKyAgCisgIE9TLkVtaXRSYXdUZXh0KCJcblx0LmRpbSAiICsgVHdpbmUoVmFyTmFtZSkgKyAiLCAxIiArIFRtcCk7Cit9CisKKy8vLyBFbWl0U3ltYm9sIC0gRW1pdCAuZGVmIGZvciBhIHN5bWJvbC4gVmFsdWUgaXMgb2Zmc2V0IGZvciB0aGUgbWVtYmVyLgorLy8vCit2b2lkIFBJQzE2RGJnSW5mbzo6RW1pdFN5bWJvbChzdGQ6OnN0cmluZyBOYW1lLCBzaG9ydCBDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IFR5cGUsIHVuc2lnbmVkIGxvbmcgVmFsdWUpIHsKKyAgc3RkOjpzdHJpbmcgVG1wOworICBpZiAoVmFsdWUgPiAwKQorICAgIFRtcCA9ICIsIHZhbHVlID0gIiArIHV0b3N0cihWYWx1ZSk7CisgIAorICBPUy5FbWl0UmF3VGV4dCgiXG5cdC5kZWYgIiArIFR3aW5lKE5hbWUpICsgIiwgdHlwZSA9ICIgKyB1dG9zdHIoVHlwZSkgKworICAgICAgICAgICAgICAgICAiLCBjbGFzcyA9ICIgKyB1dG9zdHIoQ2xhc3MpICsgVG1wKTsKK30KKworLy8vIEVtaXRWYXJEZWJ1Z0luZm8gLSBFbWl0IGRlYnVnIGluZm9ybWF0aW9uIGZvciBhbGwgdmFyaWFibGVzLgorLy8vCit2b2lkIFBJQzE2RGJnSW5mbzo6RW1pdFZhckRlYnVnSW5mbyhNb2R1bGUgJk0pIHsKKyAgRGVidWdJbmZvRmluZGVyIERiZ0ZpbmRlcjsKKyAgRGJnRmluZGVyLnByb2Nlc3NNb2R1bGUoTSk7CisgIAorICBmb3IgKERlYnVnSW5mb0ZpbmRlcjo6aXRlcmF0b3IgSSA9IERiZ0ZpbmRlci5nbG9iYWxfdmFyaWFibGVfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBEYmdGaW5kZXIuZ2xvYmFsX3ZhcmlhYmxlX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIERJR2xvYmFsVmFyaWFibGUgRElHVigqSSk7CisgICAgRElUeXBlIFR5ID0gRElHVi5nZXRUeXBlKCk7CisgICAgdW5zaWduZWQgc2hvcnQgVHlwZU5vID0gMDsKKyAgICBib29sIEhhc0F1eCA9IGZhbHNlOworICAgIGludCBBdXhbUElDMTZEYmc6OkF1eFNpemVdID0geyAwIH07CisgICAgc3RkOjpzdHJpbmcgVGFnTmFtZSA9ICIiOworICAgIHN0ZDo6c3RyaW5nIFZhck5hbWUgPSBESUdWLmdldE5hbWUoKTsKKyAgICBWYXJOYW1lID0gTUFJLT5nZXRHbG9iYWxQcmVmaXgoKSArIFZhck5hbWU7CisgICAgUG9wdWxhdGVEZWJ1Z0luZm8oVHksIFR5cGVObywgSGFzQXV4LCBBdXgsIFRhZ05hbWUpOworICAgIC8vIEVtaXQgZGVidWcgaW5mbyBvbmx5IGlmIHR5cGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhaWJsZS4KKyAgICBpZiAoVHlwZU5vICE9IFBJQzE2RGJnOjpUX05VTEwpIHsKKyAgICAgIE9TLkVtaXRSYXdUZXh0KCJcdC50eXBlICIgKyBUd2luZShWYXJOYW1lKSArICIsICIgKyBUd2luZShUeXBlTm8pKTsKKyAgICAgIHNob3J0IENsYXNzTm8gPSBnZXRTdG9yYWdlQ2xhc3MoRElHVik7CisgICAgICBPUy5FbWl0UmF3VGV4dCgiXHQuY2xhc3MgIiArIFR3aW5lKFZhck5hbWUpICsgIiwgIiArIFR3aW5lKENsYXNzTm8pKTsKKyAgICAgIGlmIChIYXNBdXgpCisgICAgICAgIEVtaXRBdXhFbnRyeShWYXJOYW1lLCBBdXgsIFBJQzE2RGJnOjpBdXhTaXplLCBUYWdOYW1lKTsKKyAgICB9CisgIH0KK30KKworLy8vIFN3aXRjaFRvQ1UgLSBTd2l0Y2ggdG8gYSBuZXcgY29tcGlsYXRpb24gdW5pdC4KKy8vLwordm9pZCBQSUMxNkRiZ0luZm86OlN3aXRjaFRvQ1UoTUROb2RlICpDVSkgeworICAvLyBHZXQgdGhlIGZpbGUgcGF0aCBmcm9tIENVLgorICBESUNvbXBpbGVVbml0IGN1KENVKTsKKyAgc3RkOjpzdHJpbmcgRGlyTmFtZSA9IGN1LmdldERpcmVjdG9yeSgpOworICBzdGQ6OnN0cmluZyBGaWxlTmFtZSA9IGN1LmdldEZpbGVuYW1lKCk7CisgIHN0ZDo6c3RyaW5nIEZpbGVQYXRoID0gRGlyTmFtZSArICIvIiArIEZpbGVOYW1lOworCisgIC8vIE5vdGhpbmcgdG8gZG8gaWYgc291cmNlIGZpbGUgaXMgc3RpbGwgc2FtZS4KKyAgaWYgKCBGaWxlUGF0aCA9PSBDdXJGaWxlICkgcmV0dXJuOworCisgIC8vIEVsc2UsIGNsb3NlIHRoZSBjdXJyZW50IG9uZSBhbmQgc3RhcnQgYSBuZXcuCisgIGlmIChDdXJGaWxlICE9ICIiKQorICAgIE9TLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXHQuZW9mIikpOworICBPUy5FbWl0UmF3VGV4dCgiXG5cdC5maWxlXHRcIiIgKyBUd2luZShGaWxlUGF0aCkgKyAiXCIiKTsKKyAgQ3VyRmlsZSA9IEZpbGVQYXRoOworICBDdXJMaW5lID0gMDsKK30KKworLy8vIEVtaXRFT0YgLSBFbWl0IC5lb2YgZm9yIGVuZCBvZiBmaWxlLgorLy8vCit2b2lkIFBJQzE2RGJnSW5mbzo6RW1pdEVPRigpIHsKKyAgaWYgKEN1ckZpbGUgIT0gIiIpCisgICAgT1MuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5FT0YiKSk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZEZWJ1Z0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZEZWJ1Z0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFkY2YwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNkRlYnVnSW5mby5oCkBAIC0wLDAgKzEsMTU2IEBACisvLz09PS0tIFBJQzE2RGVidWdJbmZvLmggLSBJbnRlcmZhY2VzIGZvciBQSUMxNiBEZWJ1ZyBJbmZvcm1hdGlvbiA9PT09PT09PT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJlcHJlc2VudGluZyBkZWJ1ZyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFBJQzE2REJHX0gKKyNkZWZpbmUgUElDMTZEQkdfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKyAgY2xhc3MgRGVidWdMb2M7CisgIGNsYXNzIE1DU3RyZWFtZXI7CisgIAorICBuYW1lc3BhY2UgUElDMTZEYmcgeworICAgIGVudW0gVmFyVHlwZSB7CisgICAgICBUX05VTEwsCisgICAgICBUX1ZPSUQsCisgICAgICBUX0NIQVIsCisgICAgICBUX1NIT1JULAorICAgICAgVF9JTlQsCisgICAgICBUX0xPTkcsCisgICAgICBUX0ZMT0FULAorICAgICAgVF9ET1VCTEUsCisgICAgICBUX1NUUlVDVCwKKyAgICAgIFRfVU5JT04sCisgICAgICBUX0VOVU0sCisgICAgICBUX01PRSwKKyAgICAgIFRfVUNIQVIsCisgICAgICBUX1VTSE9SVCwKKyAgICAgIFRfVUlOVCwKKyAgICAgIFRfVUxPTkcKKyAgICB9OworICAgIGVudW0gRGVyaXZlZFR5cGUgeworICAgICAgRFRfTk9ORSwKKyAgICAgIERUX1BUUiwKKyAgICAgIERUX0ZDTiwKKyAgICAgIERUX0FSWQorICAgIH07CisgICAgZW51bSBUeXBlU2l6ZSB7CisgICAgICBTX0JBU0lDID0gNSwKKyAgICAgIFNfREVSSVZFRCA9IDMKKyAgICB9OworICAgIGVudW0gRGJnQ2xhc3MgeworICAgICAgQ19OVUxMLAorICAgICAgQ19BVVRPLAorICAgICAgQ19FWFQsCisgICAgICBDX1NUQVQsCisgICAgICBDX1JFRywKKyAgICAgIENfRVhUREVGLAorICAgICAgQ19MQUJFTCwKKyAgICAgIENfVUxBQkVMLAorICAgICAgQ19NT1MsCisgICAgICBDX0FSRywKKyAgICAgIENfU1RSVEFHLAorICAgICAgQ19NT1UsCisgICAgICBDX1VOVEFHLAorICAgICAgQ19UUERFRiwKKyAgICAgIENfVVNUQVRJQywKKyAgICAgIENfRU5UQUcsCisgICAgICBDX01PRSwKKyAgICAgIENfUkVHUEFSTSwKKyAgICAgIENfRklFTEQsCisgICAgICBDX0FVVE9BUkcsCisgICAgICBDX0xBU1RFTlQsCisgICAgICBDX0JMT0NLID0gMTAwLAorICAgICAgQ19GQ04sCisgICAgICBDX0VPUywKKyAgICAgIENfRklMRSwKKyAgICAgIENfTElORSwKKyAgICAgIENfQUxJQVMsCisgICAgICBDX0hJRERFTiwKKyAgICAgIENfRU9GLAorICAgICAgQ19MSVNULAorICAgICAgQ19TRUNUSU9OLAorICAgICAgQ19FRkNOID0gMjU1CisgICAgfTsKKyAgICBlbnVtIFN5bWJvbFNpemUgeworICAgICAgQXV4U2l6ZSA9MjAKKyAgICB9OworICB9CisKKyAgY2xhc3MgUElDMTZEYmdJbmZvIHsKKyAgICBNQ1N0cmVhbWVyICZPUzsKKyAgICBjb25zdCBNQ0FzbUluZm8gKk1BSTsKKyAgICBzdGQ6OnN0cmluZyBDdXJGaWxlOworICAgIHVuc2lnbmVkIEN1ckxpbmU7CisKKyAgICAvLyBFbWl0RGVidWdEaXJlY3RpdmVzIGlzIHNldCBpZiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuIERlZmF1bHQKKyAgICAvLyB2YWx1ZSBmb3IgaXQgaXMgZmFsc2UuCisgICAgYm9vbCBFbWl0RGVidWdEaXJlY3RpdmVzOworCisgIHB1YmxpYzoKKyAgICBQSUMxNkRiZ0luZm8oTUNTdHJlYW1lciAmb3MsIGNvbnN0IE1DQXNtSW5mbyAqVCkgOiBPUyhvcyksIE1BSShUKSB7CisgICAgICBDdXJGaWxlID0gIiI7CisgICAgICBDdXJMaW5lID0gMDsKKyAgICAgIEVtaXREZWJ1Z0RpcmVjdGl2ZXMgPSBmYWxzZTsgCisgICAgfQorCisgICAgdm9pZCBCZWdpbk1vZHVsZSAoTW9kdWxlICZNKTsKKyAgICB2b2lkIEJlZ2luRnVuY3Rpb24gKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpOworICAgIHZvaWQgQ2hhbmdlRGVidWdMb2MgKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5CZWdpbkZ1bmN0aW9uID0gZmFsc2UpOworICAgIHZvaWQgRW5kRnVuY3Rpb24gKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpOworICAgIHZvaWQgRW5kTW9kdWxlIChNb2R1bGUgJk0pOworCisKKyAgICBwcml2YXRlOgorICAgIHZvaWQgU3dpdGNoVG9DVSAoTUROb2RlICpDVSk7CisgICAgdm9pZCBTd2l0Y2hUb0xpbmUgKHVuc2lnbmVkIExpbmUsIGJvb2wgSXNJbkJlZ2luRnVuY3Rpb24gPSBmYWxzZSk7CisKKyAgICB2b2lkIFBvcHVsYXRlRGVidWdJbmZvIChESVR5cGUgVHksIHVuc2lnbmVkIHNob3J0ICZUeXBlTm8sIGJvb2wgJkhhc0F1eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBBdXhbXSwgc3RkOjpzdHJpbmcgJlR5cGVOYW1lKTsKKyAgICB2b2lkIFBvcHVsYXRlQmFzaWNUeXBlSW5mbyAoRElUeXBlIFR5LCB1bnNpZ25lZCBzaG9ydCAmVHlwZU5vKTsKKyAgICB2b2lkIFBvcHVsYXRlRGVyaXZlZFR5cGVJbmZvIChESVR5cGUgVHksIHVuc2lnbmVkIHNob3J0ICZUeXBlTm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc0F1eCwgaW50IEF1eFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZUeXBlTmFtZSk7CisKKyAgICB2b2lkIFBvcHVsYXRlQ29tcG9zaXRlVHlwZUluZm8gKERJVHlwZSBUeSwgdW5zaWduZWQgc2hvcnQgJlR5cGVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc0F1eCwgaW50IEF1eFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlR5cGVOYW1lKTsKKyAgICB2b2lkIFBvcHVsYXRlQXJyYXlUeXBlSW5mbyAoRElUeXBlIFR5LCB1bnNpZ25lZCBzaG9ydCAmVHlwZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNBdXgsIGludCBBdXhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlR5cGVOYW1lKTsKKworICAgIHZvaWQgUG9wdWxhdGVTdHJ1Y3RPclVuaW9uVHlwZUluZm8gKERJVHlwZSBUeSwgdW5zaWduZWQgc2hvcnQgJlR5cGVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNBdXgsIGludCBBdXhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmVHlwZU5hbWUpOworICAgIHZvaWQgUG9wdWxhdGVFbnVtVHlwZUluZm8gKERJVHlwZSBUeSwgdW5zaWduZWQgc2hvcnQgJlR5cGVObyk7CisKKyAgICB1bnNpZ25lZCBHZXRUeXBlRGVidWdOdW1iZXIoc3RkOjpzdHJpbmcgJlR5cGUpOworICAgIHNob3J0IGdldFN0b3JhZ2VDbGFzcyhESUdsb2JhbFZhcmlhYmxlIERJR1YpOworICAgIHZvaWQgRW1pdEZ1bmN0QmVnaW5ESShjb25zdCBGdW5jdGlvbiAqRik7CisgICAgdm9pZCBFbWl0Q29tcG9zaXRlVHlwZURlY2xzKE1vZHVsZSAmTSk7CisgICAgdm9pZCBFbWl0Q29tcG9zaXRlVHlwZUVsZW1lbnRzIChESUNvbXBvc2l0ZVR5cGUgQ1R5LCBzdGQ6OnN0cmluZyBTdWZmaXgpOworICAgIHZvaWQgRW1pdEZ1bmN0RW5kREkoY29uc3QgRnVuY3Rpb24gKkYsIHVuc2lnbmVkIExpbmUpOworICAgIHZvaWQgRW1pdEF1eEVudHJ5KGNvbnN0IHN0ZDo6c3RyaW5nIFZhck5hbWUsIGludCBBdXhbXSwgCisgICAgICAgICAgICAgICAgICAgICAgaW50IG51bSA9IFBJQzE2RGJnOjpBdXhTaXplLCBzdGQ6OnN0cmluZyBUYWdOYW1lID0gIiIpOworICAgIGlubGluZSB2b2lkIEVtaXRTeW1ib2woc3RkOjpzdHJpbmcgTmFtZSwgc2hvcnQgQ2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgVHlwZSA9IFBJQzE2RGJnOjpUX05VTEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBWYWx1ZSA9IDApOworICAgIHZvaWQgRW1pdFZhckRlYnVnSW5mbyhNb2R1bGUgJk0pOworICAgIHZvaWQgRW1pdEVPRigpOworICB9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm07CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJU2VsREFHVG9EQUcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNklTZWxEQUdUb0RBRy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZDAwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJU2VsREFHVG9EQUcuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8vPT09LS0gUElDMTZJU2VsREFHVG9EQUcuY3BwIC0gQSBkYWcgdG8gZGFnIGluc3Qgc2VsZWN0b3IgZm9yIFBJQzE2IC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGluc3RydWN0aW9uIHNlbGVjdG9yIGZvciB0aGUgUElDMTYgdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicGljMTYtaXNlbCIKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAiUElDMTZJU2VsREFHVG9EQUcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gY3JlYXRlUElDMTZJU2VsRGFnIC0gVGhpcyBwYXNzIGNvbnZlcnRzIGEgbGVnYWxpemVkIERBRyBpbnRvIGEKKy8vLyBQSUMxNi1zcGVjaWZpYyBEQUcsIHJlYWR5IGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVQSUMxNklTZWxEYWcoUElDMTZUYXJnZXRNYWNoaW5lICZUTSkgeworICByZXR1cm4gbmV3IFBJQzE2REFHVG9EQUdJU2VsKFRNKTsKK30KKworCisvLy8gU2VsZWN0IC0gU2VsZWN0IGluc3RydWN0aW9ucyBub3QgY3VzdG9taXplZCEgVXNlZCBmb3IKKy8vLyBleHBhbmRlZCwgcHJvbW90ZWQgYW5kIG5vcm1hbCBpbnN0cnVjdGlvbnMuCitTRE5vZGUqIFBJQzE2REFHVG9EQUdJU2VsOjpTZWxlY3QoU0ROb2RlICpOKSB7CisKKyAgLy8gU2VsZWN0IHRoZSBkZWZhdWx0IGluc3RydWN0aW9uLgorICBTRE5vZGUgKlJlc05vZGUgPSBTZWxlY3RDb2RlKE4pOworCisgIHJldHVybiBSZXNOb2RlOworfQorCisKKy8vIFNlbGVjdERpcmVjdEFkZHIgLSBNYXRjaCBhIGRpcmVjdCBhZGRyZXNzIGZvciBEQUcuIAorLy8gQSBkaXJlY3QgYWRkcmVzcyBjb3VsZCBiZSBhIGdsb2JhbGFkZHJlc3Mgb3IgZXh0ZXJuYWxzeW1ib2wuCitib29sIFBJQzE2REFHVG9EQUdJU2VsOjpTZWxlY3REaXJlY3RBZGRyKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkFkZHJlc3MpIHsKKyAgLy8gUmV0dXJuIHRydWUgaWYgVEdBIG9yIEVTLgorICBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MKKyAgICAgIHx8IE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbCkgeworICAgIEFkZHJlc3MgPSBOOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNklTZWxEQUdUb0RBRy5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNklTZWxEQUdUb0RBRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYWRkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2SVNlbERBR1RvREFHLmgKQEAgLTAsMCArMSw2MCBAQAorLy89PT0tLSBQSUMxNklTZWxEQUdUb0RBRy5jcHAgLSBBIGRhZyB0byBkYWcgaW5zdCBzZWxlY3RvciBmb3IgUElDMTYgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgZm9yIHRoZSBQSUMxNiB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwaWMxNi1pc2VsIgorCisjaW5jbHVkZSAiUElDMTYuaCIKKyNpbmNsdWRlICJQSUMxNlJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgIlBJQzE2VGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlBJQzE2TWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgUElDMTZEQUdUb0RBR0lTZWwgOiBwdWJsaWMgU2VsZWN0aW9uREFHSVNlbCB7CisKKyAgLy8vIFRNIC0gS2VlcCBhIHJlZmVyZW5jZSB0byBQSUMxNlRhcmdldE1hY2hpbmUuCisgIGNvbnN0IFBJQzE2VGFyZ2V0TWFjaGluZSAmVE07CisKKyAgLy8vIFBJQzE2TG93ZXJpbmcgLSBUaGlzIG9iamVjdCBmdWxseSBkZXNjcmliZXMgaG93IHRvIGxvd2VyIExMVk0gY29kZSB0byBhbgorICAvLy8gUElDMTYtc3BlY2lmaWMgU2VsZWN0aW9uREFHLgorICBjb25zdCBQSUMxNlRhcmdldExvd2VyaW5nICZQSUMxNkxvd2VyaW5nOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFBJQzE2REFHVG9EQUdJU2VsKFBJQzE2VGFyZ2V0TWFjaGluZSAmdG0pIDogCisgICAgICAgIFNlbGVjdGlvbkRBR0lTZWwodG0pLAorICAgICAgICBUTSh0bSksIFBJQzE2TG93ZXJpbmcoKlRNLmdldFRhcmdldExvd2VyaW5nKCkpIHt9CisgIAorICAvLyBQYXNzIE5hbWUKKyAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIlBJQzE2IERBRy0+REFHIFBhdHRlcm4gSW5zdHJ1Y3Rpb24gU2VsZWN0aW9uIjsKKyAgfSAKKworcHJpdmF0ZToKKyAgLy8gSW5jbHVkZSB0aGUgcGllY2VzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0aW9uLgorI2luY2x1ZGUgIlBJQzE2R2VuREFHSVNlbC5pbmMiCisKKyAgU0ROb2RlICpTZWxlY3QoU0ROb2RlICpOKTsKKworICAvLyBNYXRjaCBkaXJlY3QgYWRkcmVzcyBjb21wbGV4IHBhdHRlcm4uCisgIGJvb2wgU2VsZWN0RGlyZWN0QWRkcihTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkFkZHJlc3MpOworCit9OworCit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJU2VsTG93ZXJpbmcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNklTZWxMb3dlcmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3YjMxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJU2VsTG93ZXJpbmcuY3BwCkBAIC0wLDAgKzEsMjAwMCBAQAorLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IFBJQzE2IHVzZXMgdG8gbG93ZXIgTExWTSBjb2RlIGludG8gYQorLy8gc2VsZWN0aW9uIERBRy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInBpYzE2LWxvd2VyIgorI2luY2x1ZGUgIlBJQzE2QUJJTmFtZXMuaCIKKyNpbmNsdWRlICJQSUMxNklTZWxMb3dlcmluZy5oIgorI2luY2x1ZGUgIlBJQzE2VGFyZ2V0T2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgIlBJQzE2VGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlBJQzE2TWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldEludHJpbnNpY05hbWUodW5zaWduZWQgb3Bjb2RlKSB7CisgIHN0ZDo6c3RyaW5nIEJhc2VuYW1lOworICBzd2l0Y2gob3Bjb2RlKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoImRvIG5vdCBrbm93IGludHJpbnNpYyBuYW1lIik7CisgIC8vIEFyaXRobWV0aWMgUmlnaHQgc2hpZnQgZm9yIGludGVnZXIgdHlwZXMuCisgIGNhc2UgUElDMTZJU0Q6OlNSQV9JODogQmFzZW5hbWUgPSAic3JhLmk4IjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6OlNSQV9JMTY6IEJhc2VuYW1lID0gInNyYS5pMTYiOyBicmVhazsKKyAgY2FzZSBSVExJQjo6U1JBX0kzMjogQmFzZW5hbWUgPSAic3JhLmkzMiI7IGJyZWFrOworCisgIC8vIExlZnQgc2hpZnQgZm9yIGludGVnZXIgdHlwZXMuCisgIGNhc2UgUElDMTZJU0Q6OlNMTF9JODogQmFzZW5hbWUgPSAic2xsLmk4IjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6OlNITF9JMTY6IEJhc2VuYW1lID0gInNsbC5pMTYiOyBicmVhazsKKyAgY2FzZSBSVExJQjo6U0hMX0kzMjogQmFzZW5hbWUgPSAic2xsLmkzMiI7IGJyZWFrOworCisgIC8vIExvZ2ljYWwgUmlnaHQgU2hpZnQgZm9yIGludGVnZXIgdHlwZXMuCisgIGNhc2UgUElDMTZJU0Q6OlNSTF9JODogQmFzZW5hbWUgPSAic3JsLmk4IjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6OlNSTF9JMTY6IEJhc2VuYW1lID0gInNybC5pMTYiOyBicmVhazsKKyAgY2FzZSBSVExJQjo6U1JMX0kzMjogQmFzZW5hbWUgPSAic3JsLmkzMiI7IGJyZWFrOworCisgIC8vIE11bHRpcGx5IGZvciBpbnRlZ2VyIHR5cGVzLgorICBjYXNlIFBJQzE2SVNEOjpNVUxfSTg6IEJhc2VuYW1lID0gIm11bC5pOCI7IGJyZWFrOworICBjYXNlIFJUTElCOjpNVUxfSTE2OiBCYXNlbmFtZSA9ICJtdWwuaTE2IjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6Ok1VTF9JMzI6IEJhc2VuYW1lID0gIm11bC5pMzIiOyBicmVhazsKKworICAvLyBTaWduZWQgZGl2aXNpb24gZm9yIGludGVnZXJzLgorICBjYXNlIFJUTElCOjpTRElWX0kxNjogQmFzZW5hbWUgPSAic2Rpdi5pMTYiOyBicmVhazsKKyAgY2FzZSBSVExJQjo6U0RJVl9JMzI6IEJhc2VuYW1lID0gInNkaXYuaTMyIjsgYnJlYWs7CisKKyAgLy8gVW5zaWduZWQgZGl2aXNpb24gZm9yIGludGVnZXJzLgorICBjYXNlIFJUTElCOjpVRElWX0kxNjogQmFzZW5hbWUgPSAidWRpdi5pMTYiOyBicmVhazsKKyAgY2FzZSBSVExJQjo6VURJVl9JMzI6IEJhc2VuYW1lID0gInVkaXYuaTMyIjsgYnJlYWs7CisKKyAgLy8gU2lnbmVkIE1vZHVsYXMgZm9yIGludGVnZXJzLgorICBjYXNlIFJUTElCOjpTUkVNX0kxNjogQmFzZW5hbWUgPSAic3JlbS5pMTYiOyBicmVhazsKKyAgY2FzZSBSVExJQjo6U1JFTV9JMzI6IEJhc2VuYW1lID0gInNyZW0uaTMyIjsgYnJlYWs7CisKKyAgLy8gVW5zaWduZWQgTW9kdWxhcyBmb3IgaW50ZWdlcnMuCisgIGNhc2UgUlRMSUI6OlVSRU1fSTE2OiBCYXNlbmFtZSA9ICJ1cmVtLmkxNiI7IGJyZWFrOworICBjYXNlIFJUTElCOjpVUkVNX0kzMjogQmFzZW5hbWUgPSAidXJlbS5pMzIiOyBicmVhazsKKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIExJQkNBTExTIEZPUiBGTE9BVFMKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIC8vIEZsb2F0IHRvIHNpZ25lZCBpbnRlZ3JhbHMKKyAgY2FzZSBSVExJQjo6RlBUT1NJTlRfRjMyX0k4OiBCYXNlbmFtZSA9ICJmMzJfdG9fc2kzMiI7IGJyZWFrOworICBjYXNlIFJUTElCOjpGUFRPU0lOVF9GMzJfSTE2OiBCYXNlbmFtZSA9ICJmMzJfdG9fc2kzMiI7IGJyZWFrOworICBjYXNlIFJUTElCOjpGUFRPU0lOVF9GMzJfSTMyOiBCYXNlbmFtZSA9ICJmMzJfdG9fc2kzMiI7IGJyZWFrOworCisgIC8vIFNpZ25lZCBpbnRlZ3JhbHMgdG8gZmxvYXQuIGNoYXIgYW5kIGludCBhcmUgZmlyc3Qgc2lnbiBleHRlbmRlZCB0byBpMzIgCisgIC8vIGJlZm9yZSBiZWluZyBjb252ZXJ0ZWQgdG8gZmxvYXQsIHNvIGFuIEk4X0YzMiBvciBJMTZfRjMyIGlzbid0IHJlcXVpcmVkLgorICBjYXNlIFJUTElCOjpTSU5UVE9GUF9JMzJfRjMyOiBCYXNlbmFtZSA9ICJzaTMyX3RvX2YzMiI7IGJyZWFrOworCisgIC8vIEZsb2F0IHRvIFVuc2lnbmVkIGNvbnZlcnNpb25zLgorICAvLyBTaWduZWQgY29udmVyc2lvbiBjYW4gYmUgdXNlZCBmb3IgdW5zaWduZWQgY29udmVyc2lvbiBhcyB3ZWxsLgorICAvLyBJbiBzaWduZWQgYW5kIHVuc2lnbmVkIHZlcnNpb25zIG9ubHkgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSAKKyAgLy8gTVNCIGlzIGRpZmZlcmVudC4gQml0IHJlcHJlc2VudGF0aW9uIHJlbWFpbnMgdGhlIHNhbWUuIAorICBjYXNlIFJUTElCOjpGUFRPVUlOVF9GMzJfSTg6IEJhc2VuYW1lID0gImYzMl90b19zaTMyIjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6OkZQVE9VSU5UX0YzMl9JMTY6IEJhc2VuYW1lID0gImYzMl90b19zaTMyIjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6OkZQVE9VSU5UX0YzMl9JMzI6IEJhc2VuYW1lID0gImYzMl90b19zaTMyIjsgYnJlYWs7CisKKyAgLy8gVW5zaWduZWQgdG8gRmxvYXQgY29udmVyc2lvbnMuIGNoYXIgYW5kIGludCBhcmUgZmlyc3QgemVybyBleHRlbmRlZCAKKyAgLy8gYmVmb3JlIGJlaW5nIGNvbnZlcnRlZCB0byBmbG9hdC4KKyAgY2FzZSBSVExJQjo6VUlOVFRPRlBfSTMyX0YzMjogQmFzZW5hbWUgPSAidWkzMl90b19mMzIiOyBicmVhazsKKyAgICAgICAgICAgICAgIAorICAvLyBGbG9hdGluZyBwb2ludCBhZGQsIHN1YiwgbXVsLCBkaXYuCisgIGNhc2UgUlRMSUI6OkFERF9GMzI6IEJhc2VuYW1lID0gImFkZC5mMzIiOyBicmVhazsKKyAgY2FzZSBSVExJQjo6U1VCX0YzMjogQmFzZW5hbWUgPSAic3ViLmYzMiI7IGJyZWFrOworICBjYXNlIFJUTElCOjpNVUxfRjMyOiBCYXNlbmFtZSA9ICJtdWwuZjMyIjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6OkRJVl9GMzI6IEJhc2VuYW1lID0gImRpdi5mMzIiOyBicmVhazsKKworICAvLyBGbG9hdGluZyBwb2ludCBjb21wYXJpc29uCisgIGNhc2UgUlRMSUI6Ok9fRjMyOiBCYXNlbmFtZSA9ICJ1bm9yZGVyZWQuZjMyIjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6OlVPX0YzMjogQmFzZW5hbWUgPSAidW5vcmRlcmVkLmYzMiI7IGJyZWFrOworICBjYXNlIFJUTElCOjpPTEVfRjMyOiBCYXNlbmFtZSA9ICJsZS5mMzIiOyBicmVhazsKKyAgY2FzZSBSVExJQjo6T0dFX0YzMjogQmFzZW5hbWUgPSAiZ2UuZjMyIjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6Ok9MVF9GMzI6IEJhc2VuYW1lID0gImx0LmYzMiI7IGJyZWFrOworICBjYXNlIFJUTElCOjpPR1RfRjMyOiBCYXNlbmFtZSA9ICJndC5mMzIiOyBicmVhazsKKyAgY2FzZSBSVExJQjo6T0VRX0YzMjogQmFzZW5hbWUgPSAiZXEuZjMyIjsgYnJlYWs7CisgIGNhc2UgUlRMSUI6OlVORV9GMzI6IEJhc2VuYW1lID0gIm5lcS5mMzIiOyBicmVhazsKKyAgfQorICAKKyAgc3RkOjpzdHJpbmcgcHJlZml4ID0gUEFOOjpnZXRUYWdOYW1lKFBBTjo6UFJFRklYX1NZTUJPTCk7CisgIHN0ZDo6c3RyaW5nIHRhZ25hbWUgPSBQQU46OmdldFRhZ05hbWUoUEFOOjpMSUJDQUxMKTsKKyAgc3RkOjpzdHJpbmcgRnVsbG5hbWUgPSBwcmVmaXggKyB0YWduYW1lICsgQmFzZW5hbWU7IAorCisgIC8vIFRoZSBuYW1lIGhhcyB0byBsaXZlIHRocm91Z2ggcHJvZ3JhbSBsaWZlLgorICByZXR1cm4gRVNOYW1lczo6Y3JlYXRlRVNOYW1lKEZ1bGxuYW1lKTsKK30KKworLy8gZ2V0U3RkTGliQ2FsbE5hbWUgLSBHZXQgdGhlIG5hbWUgZm9yIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9uLgorc3RhdGljIGNvbnN0IGNoYXIgKmdldFN0ZExpYkNhbGxOYW1lKHVuc2lnbmVkIG9wY29kZSkgeworICBzdGQ6OnN0cmluZyBCYXNlTmFtZTsKKyAgc3dpdGNoKG9wY29kZSkgeworICAgIGNhc2UgUlRMSUI6OkNPU19GMzI6IEJhc2VOYW1lID0gImNvcyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJUTElCOjpTSU5fRjMyOiBCYXNlTmFtZSA9ICJzaW4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSVExJQjo6TUVNQ1BZOiBCYXNlTmFtZSA9ICJtZW1jcHkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSVExJQjo6TUVNU0VUOiBCYXNlTmFtZSA9ICJtZW1zZXQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSVExJQjo6TUVNTU9WRTogQmFzZU5hbWUgPSAibWVtbW92ZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJkbyBub3Qga25vdyBzdGQgbGliIGNhbGwgbmFtZSIpOworICB9CisgIHN0ZDo6c3RyaW5nIHByZWZpeCA9IFBBTjo6Z2V0VGFnTmFtZShQQU46OlBSRUZJWF9TWU1CT0wpOworICBzdGQ6OnN0cmluZyBMaWJDYWxsTmFtZSA9IHByZWZpeCArIEJhc2VOYW1lOworCisgIC8vIFRoZSBuYW1lIGhhcyB0byBsaXZlIHRocm91Z2ggcHJvZ3JhbSBsaWZlLgorICByZXR1cm4gRVNOYW1lczo6Y3JlYXRlRVNOYW1lKExpYkNhbGxOYW1lKTsKK30KKworLy8gUElDMTZUYXJnZXRMb3dlcmluZyBDb25zdHJ1Y3Rvci4KK1BJQzE2VGFyZ2V0TG93ZXJpbmc6OlBJQzE2VGFyZ2V0TG93ZXJpbmcoUElDMTZUYXJnZXRNYWNoaW5lICZUTSkKKyAgOiBUYXJnZXRMb3dlcmluZyhUTSwgbmV3IFBJQzE2VGFyZ2V0T2JqZWN0RmlsZSgpKSB7CisgCisgIFN1YnRhcmdldCA9ICZUTS5nZXRTdWJ0YXJnZXQ8UElDMTZTdWJ0YXJnZXQ+KCk7CisKKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6Omk4LCBQSUMxNjo6R1BSUmVnaXN0ZXJDbGFzcyk7CisKKyAgc2V0U2hpZnRBbW91bnRUeXBlKE1WVDo6aTgpOworICAKKyAgLy8gU3RkIGxpYiBjYWxsIG5hbWVzCisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpDT1NfRjMyLCBnZXRTdGRMaWJDYWxsTmFtZShSVExJQjo6Q09TX0YzMikpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6U0lOX0YzMiwgZ2V0U3RkTGliQ2FsbE5hbWUoUlRMSUI6OlNJTl9GMzIpKTsKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok1FTUNQWSwgZ2V0U3RkTGliQ2FsbE5hbWUoUlRMSUI6Ok1FTUNQWSkpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6TUVNU0VULCBnZXRTdGRMaWJDYWxsTmFtZShSVExJQjo6TUVNU0VUKSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpNRU1NT1ZFLCBnZXRTdGRMaWJDYWxsTmFtZShSVExJQjo6TUVNTU9WRSkpOworCisgIC8vIFNSQSBsaWJyYXJ5IGNhbGwgbmFtZXMKKyAgc2V0UElDMTZMaWJjYWxsTmFtZShQSUMxNklTRDo6U1JBX0k4LCBnZXRJbnRyaW5zaWNOYW1lKFBJQzE2SVNEOjpTUkFfSTgpKTsKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlNSQV9JMTYsIGdldEludHJpbnNpY05hbWUoUlRMSUI6OlNSQV9JMTYpKTsKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlNSQV9JMzIsIGdldEludHJpbnNpY05hbWUoUlRMSUI6OlNSQV9JMzIpKTsKKworICAvLyBTSEwgbGlicmFyeSBjYWxsIG5hbWVzCisgIHNldFBJQzE2TGliY2FsbE5hbWUoUElDMTZJU0Q6OlNMTF9JOCwgZ2V0SW50cmluc2ljTmFtZShQSUMxNklTRDo6U0xMX0k4KSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTSExfSTE2LCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpTSExfSTE2KSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTSExfSTMyLCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpTSExfSTMyKSk7CisKKyAgLy8gU1JMIGxpYnJhcnkgY2FsbCBuYW1lcworICBzZXRQSUMxNkxpYmNhbGxOYW1lKFBJQzE2SVNEOjpTUkxfSTgsIGdldEludHJpbnNpY05hbWUoUElDMTZJU0Q6OlNSTF9JOCkpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6U1JMX0kxNiwgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6U1JMX0kxNikpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6U1JMX0kzMiwgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6U1JMX0kzMikpOworCisgIC8vIE1VTCBMaWJyYXJ5IGNhbGwgbmFtZXMKKyAgc2V0UElDMTZMaWJjYWxsTmFtZShQSUMxNklTRDo6TVVMX0k4LCBnZXRJbnRyaW5zaWNOYW1lKFBJQzE2SVNEOjpNVUxfSTgpKTsKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok1VTF9JMTYsIGdldEludHJpbnNpY05hbWUoUlRMSUI6Ok1VTF9JMTYpKTsKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6Ok1VTF9JMzIsIGdldEludHJpbnNpY05hbWUoUlRMSUI6Ok1VTF9JMzIpKTsKKworICAvLyBTaWduZWQgZGl2aXNpb24gbGliIGNhbGwgbmFtZXMKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlNESVZfSTE2LCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpTRElWX0kxNikpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6U0RJVl9JMzIsIGdldEludHJpbnNpY05hbWUoUlRMSUI6OlNESVZfSTMyKSk7CisKKyAgLy8gVW5zaWduZWQgZGl2aXNpb24gbGliIGNhbGwgbmFtZXMKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlVESVZfSTE2LCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpVRElWX0kxNikpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6VURJVl9JMzIsIGdldEludHJpbnNpY05hbWUoUlRMSUI6OlVESVZfSTMyKSk7CisKKyAgLy8gU2lnbmVkIHJlbWFpbmRlciBsaWIgY2FsbCBuYW1lcworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6U1JFTV9JMTYsIGdldEludHJpbnNpY05hbWUoUlRMSUI6OlNSRU1fSTE2KSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTUkVNX0kzMiwgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6U1JFTV9JMzIpKTsKKworICAvLyBVbnNpZ25lZCByZW1haW5kZXIgbGliIGNhbGwgbmFtZXMKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlVSRU1fSTE2LCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpVUkVNX0kxNikpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6VVJFTV9JMzIsIGdldEludHJpbnNpY05hbWUoUlRMSUI6OlVSRU1fSTMyKSk7CisgCisgIC8vIEZsb2F0aW5nIHBvaW50IHRvIHNpZ25lZCBpbnQgY29udmVyc2lvbnMuCisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpGUFRPU0lOVF9GMzJfSTgsIAorICAgICAgICAgICAgICAgICBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpGUFRPU0lOVF9GMzJfSTgpKTsKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkZQVE9TSU5UX0YzMl9JMTYsIAorICAgICAgICAgICAgICAgICBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpGUFRPU0lOVF9GMzJfSTE2KSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpGUFRPU0lOVF9GMzJfSTMyLCAKKyAgICAgICAgICAgICAgICAgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6RlBUT1NJTlRfRjMyX0kzMikpOworCisgIC8vIFNpZ25lZCBpbnQgdG8gZmxvYXRzLgorICBzZXRMaWJjYWxsTmFtZShSVExJQjo6U0lOVFRPRlBfSTMyX0YzMiwgCisgICAgICAgICAgICAgICAgIGdldEludHJpbnNpY05hbWUoUlRMSUI6OlNJTlRUT0ZQX0kzMl9GMzIpKTsKKworICAvLyBGbG9hdGluZyBwb2ludHMgdG8gdW5zaWduZWQgaW50cy4KKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkZQVE9VSU5UX0YzMl9JOCwgCisgICAgICAgICAgICAgICAgIGdldEludHJpbnNpY05hbWUoUlRMSUI6OkZQVE9VSU5UX0YzMl9JOCkpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6RlBUT1VJTlRfRjMyX0kxNiwgCisgICAgICAgICAgICAgICAgIGdldEludHJpbnNpY05hbWUoUlRMSUI6OkZQVE9VSU5UX0YzMl9JMTYpKTsKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkZQVE9VSU5UX0YzMl9JMzIsIAorICAgICAgICAgICAgICAgICBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpGUFRPVUlOVF9GMzJfSTMyKSk7CisKKyAgLy8gVW5zaWduZWQgaW50IHRvIGZsb2F0cy4KKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlVJTlRUT0ZQX0kzMl9GMzIsIAorICAgICAgICAgICAgICAgICBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpVSU5UVE9GUF9JMzJfRjMyKSk7CisKKyAgLy8gRmxvYXRpbmcgcG9pbnQgYWRkLCBzdWIsIG11bCAsZGl2LgorICBzZXRMaWJjYWxsTmFtZShSVExJQjo6QUREX0YzMiwgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6QUREX0YzMikpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6U1VCX0YzMiwgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6U1VCX0YzMikpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6TVVMX0YzMiwgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6TVVMX0YzMikpOworICBzZXRMaWJjYWxsTmFtZShSVExJQjo6RElWX0YzMiwgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6RElWX0YzMikpOworCisgIC8vIEZsb2F0aW9uZyBwb2ludCBjb21wYXJpc29uCisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPX0YzMiwgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6T19GMzIpKTsKKyAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlVPX0YzMiwgZ2V0SW50cmluc2ljTmFtZShSVExJQjo6VU9fRjMyKSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPTEVfRjMyLCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpPTEVfRjMyKSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPR0VfRjMyLCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpPR0VfRjMyKSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPTFRfRjMyLCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpPTFRfRjMyKSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPR1RfRjMyLCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpPR1RfRjMyKSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpPRVFfRjMyLCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpPRVFfRjMyKSk7CisgIHNldExpYmNhbGxOYW1lKFJUTElCOjpVTkVfRjMyLCBnZXRJbnRyaW5zaWNOYW1lKFJUTElCOjpVTkVfRjMyKSk7CisKKyAgLy8gUmV0dXJuIHZhbHVlIGNvbXBhcmlzb25zIG9mIGZsb2F0aW5nIHBvaW50IGNhbGxzLiAKKyAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpPRVFfRjMyLCBJU0Q6OlNFVE5FKTsKKyAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpVTkVfRjMyLCBJU0Q6OlNFVE5FKTsKKyAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpPTFRfRjMyLCBJU0Q6OlNFVE5FKTsKKyAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpPTEVfRjMyLCBJU0Q6OlNFVE5FKTsKKyAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpPR0VfRjMyLCBJU0Q6OlNFVE5FKTsKKyAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpPR1RfRjMyLCBJU0Q6OlNFVE5FKTsKKyAgc2V0Q21wTGliY2FsbENDKFJUTElCOjpVT19GMzIsIElTRDo6U0VUTkUpOworICBzZXRDbXBMaWJjYWxsQ0MoUlRMSUI6Ok9fRjMyLCBJU0Q6OlNFVEVRKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxBZGRyZXNzLCBNVlQ6OmkxNiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RXh0ZXJuYWxTeW1ib2wsIE1WVDo6aTE2LCBDdXN0b20pOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkxPQUQsICAgTVZUOjppOCwgIExlZ2FsKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgICBNVlQ6OmkxNiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgICBNVlQ6OmkzMiwgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVE9SRSwgIE1WVDo6aTgsICBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUT1JFLCAgTVZUOjppMTYsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUT1JFLCAgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUT1JFLCAgTVZUOjppNjQsIEN1c3RvbSk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURERSwgICAgTVZUOjppOCwgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFEREMsICAgIE1WVDo6aTgsICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUJFLCAgICBNVlQ6Omk4LCAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1VCQywgICAgTVZUOjppOCwgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNVQiwgICAgTVZUOjppOCwgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFERCwgICAgTVZUOjppOCwgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFERCwgICAgTVZUOjppMTYsIEN1c3RvbSk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6T1IsICAgICBNVlQ6Omk4LCAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QU5ELCAgICBNVlQ6Omk4LCAgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6WE9SLCAgICBNVlQ6Omk4LCAgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGcmFtZUluZGV4LCBNVlQ6OmkxNiwgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUwsICAgIE1WVDo6aTgsICBDdXN0b20pOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNNVUxfTE9ISSwgICAgTVZUOjppOCwgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVNVUxfTE9ISSwgICAgTVZUOjppOCwgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTEhVLCAgICAgICAgTVZUOjppOCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFMsICAgICAgICBNVlQ6Omk4LCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQSwgICAgTVZUOjppOCwgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITCwgICAgTVZUOjppOCwgIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTCwgICAgTVZUOjppOCwgIEN1c3RvbSk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Uk9UTCwgICAgTVZUOjppOCwgIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlJPVFIsICAgIE1WVDo6aTgsICBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBNVlQ6OmkxLCBFeHBhbmQpOworCisgIC8vIFBJQzE2IGRvZXMgbm90IHN1cHBvcnQgc2hpZnQgcGFydHMKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JBX1BBUlRTLCAgICBNVlQ6Omk4LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSExfUEFSVFMsICAgIE1WVDo6aTgsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTF9QQVJUUywgICAgTVZUOjppOCwgRXhwYW5kKTsKKworCisgIC8vIFBJQzE2IGRvZXMgbm90IGhhdmUgYSBTRVRDQywgZXhwYW5kIGl0IHRvIFNFTEVDVF9DQy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MsICBNVlQ6Omk4LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsICBNVlQ6Omk4LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUkNPTkQsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSSU5ELCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVF9DQywgIE1WVDo6aTgsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0NDLCAgTVZUOjppOCwgQ3VzdG9tKTsKKworICAvL3NldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlRSVU5DQVRFLCBNVlQ6OmkxNiwgQ3VzdG9tKTsKKyAgc2V0VHJ1bmNTdG9yZUFjdGlvbihNVlQ6OmkxNiwgICBNVlQ6Omk4LCAgQ3VzdG9tKTsKKworICAvLyBOb3cgZGVkdWNlIHRoZSBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgYWJvdmUgbWVudGlvbmVkIAorICAvLyBhY3Rpb25zCisgIGNvbXB1dGVSZWdpc3RlclByb3BlcnRpZXMoKTsKK30KKworc3RkOjpwYWlyPGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqLCB1aW50OF90PgorUElDMTZUYXJnZXRMb3dlcmluZzo6ZmluZFJlcHJlc2VudGF0aXZlQ2xhc3MoRVZUIFZUKSBjb25zdCB7CisgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6ZmluZFJlcHJlc2VudGF0aXZlQ2xhc3MoVlQpOworICBjYXNlIE1WVDo6aTE2OgorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihQSUMxNjo6RlNSMTZSZWdpc3RlckNsYXNzLCAxKTsKKyAgfQorfQorCisvLyBnZXRPdXRGbGFnIC0gRXh0cmFjdCB0aGUgZmxhZyByZXN1bHQgaWYgdGhlIE9wIGhhcyBpdC4KK3N0YXRpYyBTRFZhbHVlIGdldE91dEZsYWcoU0RWYWx1ZSAmT3ApIHsKKyAgLy8gRmxhZyBpcyB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUgbm9kZS4KKyAgU0RWYWx1ZSBGbGFnID0gT3AuZ2V0VmFsdWUoT3AuZ2V0Tm9kZSgpLT5nZXROdW1WYWx1ZXMoKSAtIDEpOworCisgIGFzc2VydCAoRmxhZy5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OkZsYWcgCisgICAgICAgICAgJiYgIk5vZGUgZG9lcyBub3QgaGF2ZSBhbiBvdXQgRmxhZyIpOworCisgIHJldHVybiBGbGFnOworfQorLy8gR2V0IHRoZSBUbXBPZmZzZXQgZm9yIEZyYW1lSW5kZXgKK3Vuc2lnbmVkIFBJQzE2VGFyZ2V0TG93ZXJpbmc6OkdldFRtcE9mZnNldEZvckZJKHVuc2lnbmVkIEZJLCB1bnNpZ25lZCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8gKkZ1bmNJbmZvID0gTUYuZ2V0SW5mbzxQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisgIHN0ZDo6bWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gJkZpVG1wT2Zmc2V0TWFwID0gRnVuY0luZm8tPmdldEZpVG1wT2Zmc2V0TWFwKCk7CisKKyAgc3RkOjptYXA8dW5zaWduZWQsIHVuc2lnbmVkPjo6aXRlcmF0b3IgCisgICAgICAgICAgICBNYXBJdCA9IEZpVG1wT2Zmc2V0TWFwLmZpbmQoRkkpOworICBpZiAoTWFwSXQgIT0gRmlUbXBPZmZzZXRNYXAuZW5kKCkpCisgICAgICByZXR1cm4gTWFwSXQtPnNlY29uZDsKKworICAvLyBUaGlzIEZJIChGcmFtZUluZGV4KSBpcyBub3QgeWV0IG1hcHBlZCwgc28gbWFwIGl0CisgIEZpVG1wT2Zmc2V0TWFwW0ZJXSA9IEZ1bmNJbmZvLT5nZXRUbXBTaXplKCk7IAorICBGdW5jSW5mby0+c2V0VG1wU2l6ZShGdW5jSW5mby0+Z2V0VG1wU2l6ZSgpICsgc2l6ZSk7CisgIHJldHVybiBGaVRtcE9mZnNldE1hcFtGSV07Cit9CisKK3ZvaWQgUElDMTZUYXJnZXRMb3dlcmluZzo6UmVzZXRUbXBPZmZzZXRNYXAoU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgUElDMTZNYWNoaW5lRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88UElDMTZNYWNoaW5lRnVuY3Rpb25JbmZvPigpOworICBGdW5jSW5mby0+Z2V0RmlUbXBPZmZzZXRNYXAoKS5jbGVhcigpOworICBGdW5jSW5mby0+c2V0VG1wU2l6ZSgwKTsKK30KKworLy8gVG8gZXh0cmFjdCBjaGFpbiB2YWx1ZSBmcm9tIHRoZSBTRFZhbHVlIE5vZGVzCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgaGVscCB0byBtYWludGFpbiB0aGUgY2hhaW4gZXh0cmFjdGluZworLy8gY29kZSBhdCBvbmUgcGxhY2UuIEluIGNhc2Ugb2YgYW55IGNoYW5nZSBpbiBmdXR1cmUgaXQgd2lsbAorLy8gaGVscCBtYWludGFpbiB0aGUgY29kZS4KK3N0YXRpYyBTRFZhbHVlIGdldENoYWluKFNEVmFsdWUgJk9wKSB7IAorICBTRFZhbHVlIENoYWluID0gT3AuZ2V0VmFsdWUoT3AuZ2V0Tm9kZSgpLT5nZXROdW1WYWx1ZXMoKSAtIDEpOworCisgIC8vIElmIHRoZSBsYXN0IHZhbHVlIHJldHVybmVkIGluIEZsYWcgdGhlbiB0aGUgY2hhaW4gaXMKKyAgLy8gc2Vjb25kIGxhc3QgdmFsdWUgcmV0dXJuZWQuCisgIGlmIChDaGFpbi5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OkZsYWcpCisgICAgQ2hhaW4gPSBPcC5nZXRWYWx1ZShPcC5nZXROb2RlKCktPmdldE51bVZhbHVlcygpIC0gMik7CisgIAorICAvLyBBbGwgbm9kZXMgbWF5IG5vdCBwcm9kdWNlIGEgY2hhaW4uIFRoZXJlZm9yZSBmb2xsb3dpbmcgYXNzZXJ0CisgIC8vIHZlcmlmaWVzIHRoYXQgdGhlIG5vZGUgaXMgcmV0dXJuaW5nIGEgY2hhaW4gb25seS4KKyAgYXNzZXJ0IChDaGFpbi5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6Ok90aGVyIAorICAgICAgICAgICYmICJOb2RlIGRvZXMgbm90IGhhdmUgYSBjaGFpbiIpOworCisgIHJldHVybiBDaGFpbjsKK30KKworLy8vIFBvcHVsYXRlUmVzdWx0cyAtIEhlbHBlciBmdW5jdGlvbiB0byBMb3dlck9wZXJhdGlvbi4KKy8vLyBJZiBhIG5vZGUgd2FudHMgdG8gcmV0dXJuIG11bHRpcGxlIHJlc3VsdHMgYWZ0ZXIgbG93ZXJpbmcsCisvLy8gaXQgc3R1ZmZzIHRoZW0gaW50byBhbiBhcnJheSBvZiBTRFZhbHVlIGNhbGxlZCBSZXN1bHRzLgorCitzdGF0aWMgdm9pZCBQb3B1bGF0ZVJlc3VsdHMoU0RWYWx1ZSBOLCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4mUmVzdWx0cykgeworICBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1FUkdFX1ZBTFVFUykgeworICAgIGludCBOdW1SZXN1bHRzID0gTi5nZXROdW1PcGVyYW5kcygpOworICAgIGZvciggaW50IGkgPSAwOyBpIDwgTnVtUmVzdWx0czsgaSsrKQorICAgICAgUmVzdWx0cy5wdXNoX2JhY2soTi5nZXRPcGVyYW5kKGkpKTsKKyAgfQorICBlbHNlCisgICAgUmVzdWx0cy5wdXNoX2JhY2soTik7Cit9CisKK01WVDo6U2ltcGxlVmFsdWVUeXBlCitQSUMxNlRhcmdldExvd2VyaW5nOjpnZXRTZXRDQ1Jlc3VsdFR5cGUoRVZUIFZhbFR5cGUpIGNvbnN0IHsKKyAgcmV0dXJuIE1WVDo6aTg7Cit9CisKK01WVDo6U2ltcGxlVmFsdWVUeXBlCitQSUMxNlRhcmdldExvd2VyaW5nOjpnZXRDbXBMaWJjYWxsUmV0dXJuVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE1WVDo6aTg7IAorfQorCisvLy8gVGhlIHR5cGUgbGVnYWxpemVyIGZyYW1ld29yayBvZiBnZW5lcmF0aW5nIGxlZ2FsaXplciBjYW4gZ2VuZXJhdGUgbGliY2FsbHMKKy8vLyBvbmx5IHdoZW4gdGhlIG9wZXJhbmQvcmVzdWx0IHR5cGVzIGFyZSBpbGxlZ2FsLgorLy8vIFBJQzE2IG5lZWRzIHRvIGdlbmVyYXRlIGxpYmNhbGxzIGV2ZW4gZm9yIHRoZSBsZWdhbCB0eXBlcyAoaTgpIGZvciBzb21lIG9wcy4KKy8vLyBGb3IgZXhhbXBsZSBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gbG93ZXIKKy8vLyBzdWNoIG9wZXJhdGlvbnMgdGhhdCBnZW5lcmF0ZSBsaWJjYWxsIGZvciBsZWdhbCB0eXBlcy4KKwordm9pZCAKK1BJQzE2VGFyZ2V0TG93ZXJpbmc6OnNldFBJQzE2TGliY2FsbE5hbWUoUElDMTZJU0Q6OlBJQzE2TGliY2FsbCBDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKSB7CisgIFBJQzE2TGliY2FsbE5hbWVzW0NhbGxdID0gTmFtZTsgCit9CisKK2NvbnN0IGNoYXIgKgorUElDMTZUYXJnZXRMb3dlcmluZzo6Z2V0UElDMTZMaWJjYWxsTmFtZShQSUMxNklTRDo6UElDMTZMaWJjYWxsIENhbGwpIGNvbnN0IHsKKyAgcmV0dXJuIFBJQzE2TGliY2FsbE5hbWVzW0NhbGxdOworfQorCitTRFZhbHVlCitQSUMxNlRhcmdldExvd2VyaW5nOjpNYWtlUElDMTZMaWJjYWxsKFBJQzE2SVNEOjpQSUMxNkxpYmNhbGwgQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFJldFZULCBjb25zdCBTRFZhbHVlICpPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bU9wcywgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsKSBjb25zdCB7CisKKyAgVGFyZ2V0TG93ZXJpbmc6OkFyZ0xpc3RUeSBBcmdzOworICBBcmdzLnJlc2VydmUoTnVtT3BzKTsKKworICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdEVudHJ5IEVudHJ5OworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bU9wczsgKytpKSB7CisgICAgRW50cnkuTm9kZSA9IE9wc1tpXTsKKyAgICBFbnRyeS5UeSA9IEVudHJ5Lk5vZGUuZ2V0VmFsdWVUeXBlKCkuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSk7CisgICAgRW50cnkuaXNTRXh0ID0gaXNTaWduZWQ7CisgICAgRW50cnkuaXNaRXh0ID0gIWlzU2lnbmVkOworICAgIEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKyAgfQorCisgIFNEVmFsdWUgQ2FsbGVlID0gREFHLmdldEV4dGVybmFsU3ltYm9sKGdldFBJQzE2TGliY2FsbE5hbWUoQ2FsbCksIE1WVDo6aTE2KTsKKworICAgY29uc3QgVHlwZSAqUmV0VHkgPSBSZXRWVC5nZXRUeXBlRm9yRVZUKCpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgIHN0ZDo6cGFpcjxTRFZhbHVlLFNEVmFsdWU+IENhbGxJbmZvID0gCisgICAgIExvd2VyQ2FsbFRvKERBRy5nZXRFbnRyeU5vZGUoKSwgUmV0VHksIGlzU2lnbmVkLCAhaXNTaWduZWQsIGZhbHNlLAorICAgICAgICAgICAgICAgICBmYWxzZSwgMCwgQ2FsbGluZ0NvbnY6OkMsIGZhbHNlLAorICAgICAgICAgICAgICAgICAvKmlzUmV0dXJuVmFsdWVVc2VkPSovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgQ2FsbGVlLCBBcmdzLCBEQUcsIGRsKTsKKworICByZXR1cm4gQ2FsbEluZm8uZmlyc3Q7Cit9CisKK2NvbnN0IGNoYXIgKlBJQzE2VGFyZ2V0TG93ZXJpbmc6OmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3QgeworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgY2FzZSBQSUMxNklTRDo6TG86ICAgICAgICAgICAgICAgcmV0dXJuICJQSUMxNklTRDo6TG8iOworICBjYXNlIFBJQzE2SVNEOjpIaTogICAgICAgICAgICAgICByZXR1cm4gIlBJQzE2SVNEOjpIaSI7CisgIGNhc2UgUElDMTZJU0Q6Ok1UTE86ICAgICAgICAgICAgIHJldHVybiAiUElDMTZJU0Q6Ok1UTE8iOworICBjYXNlIFBJQzE2SVNEOjpNVEhJOiAgICAgICAgICAgICByZXR1cm4gIlBJQzE2SVNEOjpNVEhJIjsKKyAgY2FzZSBQSUMxNklTRDo6TVRQQ0xBVEg6ICAgICAgICAgcmV0dXJuICJQSUMxNklTRDo6TVRQQ0xBVEgiOworICBjYXNlIFBJQzE2SVNEOjpQSUMxNkNvbm5lY3Q6ICAgICByZXR1cm4gIlBJQzE2SVNEOjpQSUMxNkNvbm5lY3QiOworICBjYXNlIFBJQzE2SVNEOjpCYW5rc2VsOiAgICAgICAgICByZXR1cm4gIlBJQzE2SVNEOjpCYW5rc2VsIjsKKyAgY2FzZSBQSUMxNklTRDo6UElDMTZMb2FkOiAgICAgICAgcmV0dXJuICJQSUMxNklTRDo6UElDMTZMb2FkIjsKKyAgY2FzZSBQSUMxNklTRDo6UElDMTZMZEFyZzogICAgICAgcmV0dXJuICJQSUMxNklTRDo6UElDMTZMZEFyZyI7CisgIGNhc2UgUElDMTZJU0Q6OlBJQzE2TGRXRjogICAgICAgIHJldHVybiAiUElDMTZJU0Q6OlBJQzE2TGRXRiI7CisgIGNhc2UgUElDMTZJU0Q6OlBJQzE2U3RvcmU6ICAgICAgIHJldHVybiAiUElDMTZJU0Q6OlBJQzE2U3RvcmUiOworICBjYXNlIFBJQzE2SVNEOjpQSUMxNlN0V0Y6ICAgICAgICByZXR1cm4gIlBJQzE2SVNEOjpQSUMxNlN0V0YiOworICBjYXNlIFBJQzE2SVNEOjpCQ0Y6ICAgICAgICAgICAgICByZXR1cm4gIlBJQzE2SVNEOjpCQ0YiOworICBjYXNlIFBJQzE2SVNEOjpMU0xGOiAgICAgICAgICAgICByZXR1cm4gIlBJQzE2SVNEOjpMU0xGIjsKKyAgY2FzZSBQSUMxNklTRDo6TFJMRjogICAgICAgICAgICAgcmV0dXJuICJQSUMxNklTRDo6TFJMRiI7CisgIGNhc2UgUElDMTZJU0Q6OlJMRjogICAgICAgICAgICAgIHJldHVybiAiUElDMTZJU0Q6OlJMRiI7CisgIGNhc2UgUElDMTZJU0Q6OlJSRjogICAgICAgICAgICAgIHJldHVybiAiUElDMTZJU0Q6OlJSRiI7CisgIGNhc2UgUElDMTZJU0Q6OkNBTEw6ICAgICAgICAgICAgIHJldHVybiAiUElDMTZJU0Q6OkNBTEwiOworICBjYXNlIFBJQzE2SVNEOjpDQUxMVzogICAgICAgICAgICByZXR1cm4gIlBJQzE2SVNEOjpDQUxMVyI7CisgIGNhc2UgUElDMTZJU0Q6OlNVQkNDOiAgICAgICAgICAgIHJldHVybiAiUElDMTZJU0Q6OlNVQkNDIjsKKyAgY2FzZSBQSUMxNklTRDo6U0VMRUNUX0lDQzogICAgICAgcmV0dXJuICJQSUMxNklTRDo6U0VMRUNUX0lDQyI7CisgIGNhc2UgUElDMTZJU0Q6OkJSQ09ORDogICAgICAgICAgIHJldHVybiAiUElDMTZJU0Q6OkJSQ09ORCI7CisgIGNhc2UgUElDMTZJU0Q6OlJFVDogICAgICAgICAgICAgIHJldHVybiAiUElDMTZJU0Q6OlJFVCI7CisgIGNhc2UgUElDMTZJU0Q6OkR1bW15OiAgICAgICAgICAgIHJldHVybiAiUElDMTZJU0Q6OkR1bW15IjsKKyAgfQorfQorCit2b2lkIFBJQzE2VGFyZ2V0TG93ZXJpbmc6OlJlcGxhY2VOb2RlUmVzdWx0cyhTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4mUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSVNEOjpHbG9iYWxBZGRyZXNzOgorICAgICAgUmVzdWx0cy5wdXNoX2JhY2soRXhwYW5kR2xvYmFsQWRkcmVzcyhOLCBEQUcpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIElTRDo6RXh0ZXJuYWxTeW1ib2w6CisgICAgICBSZXN1bHRzLnB1c2hfYmFjayhFeHBhbmRFeHRlcm5hbFN5bWJvbChOLCBEQUcpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIElTRDo6U1RPUkU6CisgICAgICBSZXN1bHRzLnB1c2hfYmFjayhFeHBhbmRTdG9yZShOLCBEQUcpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIElTRDo6TE9BRDoKKyAgICAgIFBvcHVsYXRlUmVzdWx0cyhFeHBhbmRMb2FkKE4sIERBRyksIFJlc3VsdHMpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgSVNEOjpBREQ6CisgICAgICAvLyBSZXN1bHRzLnB1c2hfYmFjayhFeHBhbmRBZGQoTiwgREFHKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBJU0Q6OkZyYW1lSW5kZXg6CisgICAgICBSZXN1bHRzLnB1c2hfYmFjayhFeHBhbmRGcmFtZUluZGV4KE4sIERBRykpOworICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQgKDAgJiYgIm5vdCBpbXBsZW1lbnRlZCIpOworICAgICAgcmV0dXJuOworICB9Cit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6RXhwYW5kRnJhbWVJbmRleChTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKworICAvLyBDdXJyZW50bHkgaGFuZGxpbmcgRnJhbWVJbmRleCBvZiBzaXplIE1WVDo6aTE2IG9ubHkKKyAgLy8gT25lIGV4YW1wbGUgb2YgdGhpcyBzY2VuYXJpbyBpcyB3aGVuIHJldHVybiB2YWx1ZSBpcyB3cml0dGVuIG9uCisgIC8vIEZyYW1lSW5kZXgjMAorCisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgIT0gTVZUOjppMTYpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAvLyBFeHBhbmQgdGhlIEZyYW1lSW5kZXggaW50byBFeHRlcm5hbFN5bWJvbCBhbmQgYSBDb25zdGFudCBub2RlCisgIC8vIFRoZSBjb25zdGFudCB3aWxsIHJlcHJlc2VudCB0aGUgZnJhbWUgaW5kZXggbnVtYmVyCisgIC8vIEdldCB0aGUgY3VycmVudCBmdW5jdGlvbiBmcmFtZQorICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBjb25zdCBGdW5jdGlvbiAqRnVuYyA9IE1GLmdldEZ1bmN0aW9uKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIE5hbWUgPSBGdW5jLT5nZXROYW1lKCk7CisgIAorICBGcmFtZUluZGV4U0ROb2RlICpGUiA9IGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KFNEVmFsdWUoTiwwKSk7CisgIC8vIEZJWE1FIHRoZXJlIGlzbid0IHJlYWxseSBkZWJ1ZyBpbmZvIGhlcmUKKyAgRGVidWdMb2MgZGwgPSBGUi0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBFeHBhbmQgRnJhbWVJbmRleCBsaWtlIEdsb2JhbEFkZHJlc3MgYW5kIEV4dGVybmFsU3ltYm9sCisgIC8vIEFsc28gdXNlIE9mZnNldCBmaWVsZCBmb3IgbG8gYW5kIGhpIHBhcnRzLiBUaGUgZGVmYXVsdCAKKyAgLy8gb2Zmc2V0IGlzIHplcm8uCisKKyAgU0RWYWx1ZSBFUzsKKyAgaW50IEZyYW1lT2Zmc2V0OworICBTRFZhbHVlIEZJID0gU0RWYWx1ZShOLDApOworICBMZWdhbGl6ZUZyYW1lSW5kZXgoRkksIERBRywgRVMsIEZyYW1lT2Zmc2V0KTsKKyAgU0RWYWx1ZSBPZmZzZXQgPSBEQUcuZ2V0Q29uc3RhbnQoRnJhbWVPZmZzZXQsIE1WVDo6aTgpOworICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OkxvLCBkbCwgTVZUOjppOCwgRVMsIE9mZnNldCk7CisgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShQSUMxNklTRDo6SGksIGRsLCBNVlQ6Omk4LCBFUywgT2Zmc2V0KTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfUEFJUiwgZGwsIE4tPmdldFZhbHVlVHlwZSgwKSwgTG8sIEhpKTsKK30KKworCitTRFZhbHVlIFBJQzE2VGFyZ2V0TG93ZXJpbmc6OkV4cGFuZFN0b3JlKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsgCisgIFN0b3JlU0ROb2RlICpTdCA9IGNhc3Q8U3RvcmVTRE5vZGU+KE4pOworICBTRFZhbHVlIENoYWluID0gU3QtPmdldENoYWluKCk7CisgIFNEVmFsdWUgU3JjID0gU3QtPmdldFZhbHVlKCk7CisgIFNEVmFsdWUgUHRyID0gU3QtPmdldEJhc2VQdHIoKTsKKyAgRVZUIFZhbHVlVHlwZSA9IFNyYy5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgU3RvcmVPZmZzZXQgPSAwOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisKKyAgU0RWYWx1ZSBQdHJMbywgUHRySGk7CisgIExlZ2FsaXplQWRkcmVzcyhQdHIsIERBRywgUHRyTG8sIFB0ckhpLCBTdG9yZU9mZnNldCwgZGwpOworIAorICBpZiAoVmFsdWVUeXBlID09IE1WVDo6aTgpIHsKKyAgICByZXR1cm4gREFHLmdldE5vZGUgKFBJQzE2SVNEOjpQSUMxNlN0b3JlLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4sIFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIFB0ckxvLCBQdHJIaSwgCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQgKDAgKyBTdG9yZU9mZnNldCwgTVZUOjppOCkpOworICB9CisgIGVsc2UgaWYgKFZhbHVlVHlwZSA9PSBNVlQ6OmkxNikgeworICAgIC8vIEdldCB0aGUgTG8gYW5kIEhpIHBhcnRzIGZyb20gTUVSR0VfVkFMVUUgb3IgQlVJTERfUEFJUi4KKyAgICBTRFZhbHVlIFNyY0xvLCBTcmNIaTsKKyAgICBHZXRFeHBhbmRlZFBhcnRzKFNyYywgREFHLCBTcmNMbywgU3JjSGkpOworICAgIFNEVmFsdWUgQ2hhaW5MbyA9IENoYWluLCBDaGFpbkhpID0gQ2hhaW47CisgICAgLy8gRklYTUU6IFRoaXMgbWFrZXMgdW5zYWZlIGFzc3VtcHRpb25zLiBUaGUgQ2hhaW4gbWF5IGJlIGEgVG9rZW5GYWN0b3IKKyAgICAvLyBjcmVhdGVkIGZvciBhbiB1bnJlbGF0ZWQgcHVycG9zZSwgaW4gd2hpY2ggY2FzZSBpdCBtYXkgbm90IGhhdmUKKyAgICAvLyBleGFjdGx5IHR3byBvcGVyYW5kcy4gQWxzbywgZXZlbiBpZiBpdCBkb2VzIGhhdmUgdHdvIG9wZXJhbmRzLCB0aGV5CisgICAgLy8gbWF5IG5vdCBiZSB0aGUgbG93IGFuZCBoaWdoIHBhcnRzIG9mIGFuIGFsaWduZWQgbG9hZCB0aGF0IHdhcyBzcGxpdC4KKyAgICBpZiAoQ2hhaW4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUb2tlbkZhY3RvcikgeworICAgICAgQ2hhaW5MbyA9IENoYWluLmdldE9wZXJhbmQoMCk7CisgICAgICBDaGFpbkhpID0gQ2hhaW4uZ2V0T3BlcmFuZCgxKTsKKyAgICB9CisgICAgU0RWYWx1ZSBTdG9yZTEgPSBEQUcuZ2V0Tm9kZShQSUMxNklTRDo6UElDMTZTdG9yZSwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjTG8sIFB0ckxvLCBQdHJIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCAoMCArIFN0b3JlT2Zmc2V0LCBNVlQ6Omk4KSk7CisKKyAgICBTRFZhbHVlIFN0b3JlMiA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpQSUMxNlN0b3JlLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW5IaSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNIaSwgUHRyTG8sIFB0ckhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50ICgxICsgU3RvcmVPZmZzZXQsIE1WVDo6aTgpKTsKKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgZ2V0Q2hhaW4oU3RvcmUxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhaW4oU3RvcmUyKSk7CisgIH0KKyAgZWxzZSBpZiAoVmFsdWVUeXBlID09IE1WVDo6aTMyKSB7CisgICAgLy8gR2V0IHRoZSBMbyBhbmQgSGkgcGFydHMgZnJvbSBNRVJHRV9WQUxVRSBvciBCVUlMRF9QQUlSLgorICAgIFNEVmFsdWUgU3JjTG8sIFNyY0hpOworICAgIEdldEV4cGFuZGVkUGFydHMoU3JjLCBEQUcsIFNyY0xvLCBTcmNIaSk7CisKKyAgICAvLyBHZXQgdGhlIGV4cGFuZGVkIHBhcnRzIG9mIGVhY2ggb2YgU3JjTG8gYW5kIFNyY0hpLgorICAgIFNEVmFsdWUgU3JjTG8xLCBTcmNMbzIsIFNyY0hpMSwgU3JjSGkyOworICAgIEdldEV4cGFuZGVkUGFydHMoU3JjTG8sIERBRywgU3JjTG8xLCBTcmNMbzIpOworICAgIEdldEV4cGFuZGVkUGFydHMoU3JjSGksIERBRywgU3JjSGkxLCBTcmNIaTIpOworCisgICAgU0RWYWx1ZSBDaGFpbkxvID0gQ2hhaW4sIENoYWluSGkgPSBDaGFpbjsKKyAgICAvLyBGSVhNRTogVGhpcyBtYWtlcyB1bnNhZmUgYXNzdW1wdGlvbnM7IHNlZSB0aGUgRklYTUUgYWJvdmUuCisgICAgaWYgKENoYWluLmdldE9wY29kZSgpID09IElTRDo6VG9rZW5GYWN0b3IpIHsgIAorICAgICAgQ2hhaW5MbyA9IENoYWluLmdldE9wZXJhbmQoMCk7CisgICAgICBDaGFpbkhpID0gQ2hhaW4uZ2V0T3BlcmFuZCgxKTsKKyAgICB9CisgICAgU0RWYWx1ZSBDaGFpbkxvMSA9IENoYWluTG8sIENoYWluTG8yID0gQ2hhaW5MbywgQ2hhaW5IaTEgPSBDaGFpbkhpLAorICAgICAgICAgICAgQ2hhaW5IaTIgPSBDaGFpbkhpOworICAgIC8vIEZJWE1FOiBUaGlzIG1ha2VzIHVuc2FmZSBhc3N1bXB0aW9uczsgc2VlIHRoZSBGSVhNRSBhYm92ZS4KKyAgICBpZiAoQ2hhaW5Mby5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRva2VuRmFjdG9yKSB7CisgICAgICBDaGFpbkxvMSA9IENoYWluTG8uZ2V0T3BlcmFuZCgwKTsKKyAgICAgIENoYWluTG8yID0gQ2hhaW5Mby5nZXRPcGVyYW5kKDEpOworICAgIH0KKyAgICAvLyBGSVhNRTogVGhpcyBtYWtlcyB1bnNhZmUgYXNzdW1wdGlvbnM7IHNlZSB0aGUgRklYTUUgYWJvdmUuCisgICAgaWYgKENoYWluSGkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUb2tlbkZhY3RvcikgeworICAgICAgQ2hhaW5IaTEgPSBDaGFpbkhpLmdldE9wZXJhbmQoMCk7CisgICAgICBDaGFpbkhpMiA9IENoYWluSGkuZ2V0T3BlcmFuZCgxKTsKKyAgICB9CisgICAgU0RWYWx1ZSBTdG9yZTEgPSBEQUcuZ2V0Tm9kZShQSUMxNklTRDo6UElDMTZTdG9yZSwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbkxvMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY0xvMSwgUHRyTG8sIFB0ckhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50ICgwICsgU3RvcmVPZmZzZXQsIE1WVDo6aTgpKTsKKworICAgIFNEVmFsdWUgU3RvcmUyID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OlBJQzE2U3RvcmUsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbkxvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY0xvMiwgUHRyTG8sIFB0ckhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50ICgxICsgU3RvcmVPZmZzZXQsIE1WVDo6aTgpKTsKKworICAgIFNEVmFsdWUgU3RvcmUzID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OlBJQzE2U3RvcmUsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbkhpMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY0hpMSwgUHRyTG8sIFB0ckhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50ICgyICsgU3RvcmVPZmZzZXQsIE1WVDo6aTgpKTsKKworICAgIFNEVmFsdWUgU3RvcmU0ID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OlBJQzE2U3RvcmUsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbkhpMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY0hpMiwgUHRyTG8sIFB0ckhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50ICgzICsgU3RvcmVPZmZzZXQsIE1WVDo6aTgpKTsKKworICAgIFNEVmFsdWUgUmV0TG8gPSAgREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhaW4oU3RvcmUxKSwgZ2V0Q2hhaW4oU3RvcmUyKSk7CisgICAgU0RWYWx1ZSBSZXRIaSA9ICBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGFpbihTdG9yZTMpLCBnZXRDaGFpbihTdG9yZTQpKTsKKyAgICByZXR1cm4gIERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCBSZXRMbywgUmV0SGkpOworCisgIH0gZWxzZSBpZiAoVmFsdWVUeXBlID09IE1WVDo6aTY0KSB7CisgICAgU0RWYWx1ZSBTcmNMbywgU3JjSGk7CisgICAgR2V0RXhwYW5kZWRQYXJ0cyhTcmMsIERBRywgU3JjTG8sIFNyY0hpKTsKKyAgICBTRFZhbHVlIENoYWluTG8gPSBDaGFpbiwgQ2hhaW5IaSA9IENoYWluOworICAgIC8vIEZJWE1FOiBUaGlzIG1ha2VzIHVuc2FmZSBhc3N1bXB0aW9uczsgc2VlIHRoZSBGSVhNRSBhYm92ZS4KKyAgICBpZiAoQ2hhaW4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUb2tlbkZhY3RvcikgeworICAgICAgQ2hhaW5MbyA9IENoYWluLmdldE9wZXJhbmQoMCk7CisgICAgICBDaGFpbkhpID0gQ2hhaW4uZ2V0T3BlcmFuZCgxKTsKKyAgICB9CisgICAgU0RWYWx1ZSBTdG9yZTEgPSBEQUcuZ2V0U3RvcmUoQ2hhaW5MbywgZGwsIFNyY0xvLCBQdHIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArIFN0b3JlT2Zmc2V0LCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgUHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHIuZ2V0VmFsdWVUeXBlKCksIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoNCwgUHRyLmdldFZhbHVlVHlwZSgpKSk7CisgICAgU0RWYWx1ZSBTdG9yZTIgPSBEQUcuZ2V0U3RvcmUoQ2hhaW5IaSwgZGwsIFNyY0hpLCBQdHIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSArIFN0b3JlT2Zmc2V0LCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCBTdG9yZTEsCisgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlMik7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0ICgwICYmICJ2YWx1ZSB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9Cit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6RXhwYW5kRXh0ZXJuYWxTeW1ib2woU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykKKyBjb25zdCB7CisgIEV4dGVybmFsU3ltYm9sU0ROb2RlICpFUyA9IGR5bl9jYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPihTRFZhbHVlKE4sIDApKTsKKyAgLy8gRklYTUUgdGhlcmUgaXNuJ3QgcmVhbGx5IGRlYnVnIGluZm8gaGVyZQorICBEZWJ1Z0xvYyBkbCA9IEVTLT5nZXREZWJ1Z0xvYygpOworCisgIFNEVmFsdWUgVEVTID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKEVTLT5nZXRTeW1ib2woKSwgTVZUOjppOCk7CisgIFNEVmFsdWUgT2Zmc2V0ID0gREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTgpOworICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OkxvLCBkbCwgTVZUOjppOCwgVEVTLCBPZmZzZXQpOworICBTRFZhbHVlIEhpID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OkhpLCBkbCwgTVZUOjppOCwgVEVTLCBPZmZzZXQpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1BBSVIsIGRsLCBNVlQ6OmkxNiwgTG8sIEhpKTsKK30KKworLy8gRXhwYW5kR2xvYmFsQWRkcmVzcyAtIAorU0RWYWx1ZSBQSUMxNlRhcmdldExvd2VyaW5nOjpFeHBhbmRHbG9iYWxBZGRyZXNzKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBHbG9iYWxBZGRyZXNzU0ROb2RlICpHID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oU0RWYWx1ZShOLCAwKSk7CisgIC8vIEZJWE1FIHRoZXJlIGlzbid0IHJlYWxseSBkZWJ1ZyBpbmZvIGhlcmUKKyAgRGVidWdMb2MgZGwgPSBHLT5nZXREZWJ1Z0xvYygpOworICAKKyAgU0RWYWx1ZSBUR0EgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHLT5nZXRHbG9iYWwoKSwgTi0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Omk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEctPmdldE9mZnNldCgpKTsKKworICBTRFZhbHVlIE9mZnNldCA9IERBRy5nZXRDb25zdGFudCgwLCBNVlQ6Omk4KTsKKyAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpMbywgZGwsIE1WVDo6aTgsIFRHQSwgT2Zmc2V0KTsKKyAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpIaSwgZGwsIE1WVDo6aTgsIFRHQSwgT2Zmc2V0KTsKKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgTVZUOjppMTYsIExvLCBIaSk7Cit9CisKK2Jvb2wgUElDMTZUYXJnZXRMb3dlcmluZzo6aXNEaXJlY3RBZGRyZXNzKGNvbnN0IFNEVmFsdWUgJk9wKSBjb25zdCB7CisgIGFzc2VydCAoT3AuZ2V0Tm9kZSgpICE9IE5VTEwgJiYgIkNhbid0IG9wZXJhdGUgb24gTlVMTCBTRE5vZGUhISIpOworCisgIGlmIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJVSUxEX1BBSVIpIHsKKyAgIGlmIChPcC5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IFBJQzE2SVNEOjpMbykgCisgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgRGlyZWN0QWRkcmVzcyBpcyBpbiBST01fU1BBQ0UKK2Jvb2wgUElDMTZUYXJnZXRMb3dlcmluZzo6aXNSb21BZGRyZXNzKGNvbnN0IFNEVmFsdWUgJk9wKSBjb25zdCB7CisKKyAgLy8gUm9tQWRkcmVzcyBpcyBhIEdsb2JhbEFkZHJlc3MgaW4gUk9NX1NQQUNFXworICAvLyBJZiB0aGUgT3AgaXMgbm90IGEgR2xvYmFsQWRkcmVzcyByZXR1cm4gTlVMTCB3aXRob3V0IGNoZWNraW5nCisgIC8vIGFueXRoaW5nIGZ1cnRoZXIuCisgIGlmICghaXNEaXJlY3RBZGRyZXNzKE9wKSkKKyAgICByZXR1cm4gZmFsc2U7IAorCisgIC8vIEl0cyBhIEdsb2JhbEFkZHJlc3MuCisgIC8vIEl0IGlzIEJVSUxEX1BBSVIoKFBJQzE2TG8gVEdBKSwgKFBJQzE2SGkgVEdBKSkgYW5kIE9wIGlzIEJVSUxEX1BBSVIKKyAgU0RWYWx1ZSBUR0EgPSBPcC5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCk7CisgIEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdTRE4gPSBkeW5fY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihUR0EpOworCisgIGlmIChHU0ROLT5nZXRBZGRyZXNzU3BhY2UoKSA9PSBQSUMxNklTRDo6Uk9NX1NQQUNFKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIEFueSBvdGhlciBhZGRyZXNzIHNwYWNlIHJldHVybiBpdCBmYWxzZQorICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8gR2V0RXhwYW5kZWRQYXJ0cyAtIFRoaXMgZnVuY3Rpb24gaXMgb24gdGhlIHNpbWlsaWFyIGxpbmVzIGFzCisvLyB0aGUgR2V0RXhwYW5kZWRJbnRlZ2VyIGluIHR5cGUgbGVnYWxpemVyIGlzLiBUaGlzIHJldHVybnMgZXhwYW5kZWQKKy8vIHBhcnRzIG9mIE9wIGluIExvIGFuZCBIaS4gCisKK3ZvaWQgUElDMTZUYXJnZXRMb3dlcmluZzo6R2V0RXhwYW5kZWRQYXJ0cyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGkpIGNvbnN0IHsKKyAgU0ROb2RlICpOID0gT3AuZ2V0Tm9kZSgpOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIEVWVCBOZXdWVCA9IGdldFR5cGVUb1RyYW5zZm9ybVRvKCpEQUcuZ2V0Q29udGV4dCgpLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworCisgIC8vIEV4dHJhY3QgdGhlIGxvIGNvbXBvbmVudC4KKyAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE5ld1ZULCBPcCwKKyAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppOCkpOworCisgIC8vIGV4dHJhY3QgdGhlIGhpIGNvbXBvbmVudAorICBIaSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTmV3VlQsIE9wLAorICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6Omk4KSk7Cit9CisKKy8vIExlZ2FsaXplIEZyYW1lSW5kZXggaW50byBFeHRlcm5hbFN5bWJvbCBhbmQgb2Zmc2V0Lgordm9pZCAKK1BJQzE2VGFyZ2V0TG93ZXJpbmc6OkxlZ2FsaXplRnJhbWVJbmRleChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZFUywgaW50ICZPZmZzZXQpIGNvbnN0IHsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBjb25zdCBGdW5jdGlvbiAqRnVuYyA9IE1GLmdldEZ1bmN0aW9uKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8gKkZ1bmNJbmZvID0gTUYuZ2V0SW5mbzxQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIE5hbWUgPSBGdW5jLT5nZXROYW1lKCk7CisKKyAgRnJhbWVJbmRleFNETm9kZSAqRlIgPSBkeW5fY2FzdDxGcmFtZUluZGV4U0ROb2RlPihPcCk7CisKKyAgLy8gRnJhbWVJbmRpY2VzIGFyZSBub3Qgc3RhY2sgb2Zmc2V0cy4gQnV0IHRoZXkgcmVwcmVzZW50IHRoZSByZXF1ZXN0CisgIC8vIGZvciBzcGFjZSBvbiBzdGFjay4gVGhhdCBzcGFjZSByZXF1ZXN0ZWQgbWF5IGJlIG1vcmUgdGhhbiBvbmUgYnl0ZS4gCisgIC8vIFRoZXJlZm9yZSwgdG8gY2FsY3VsYXRlIHRoZSBzdGFjayBvZmZzZXQgdGhhdCBhIEZyYW1lSW5kZXggYWxpZ25zCisgIC8vIHdpdGgsIHdlIG5lZWQgdG8gdHJhdmVyc2UgYWxsIHRoZSBGcmFtZUluZGljZXMgYXZhaWxhYmxlIGVhcmxpZXIgaW4gCisgIC8vIHRoZSBsaXN0IGFuZCBhZGQgdGhlaXIgcmVxdWVzdGVkIHNpemUuCisgIHVuc2lnbmVkIEZJbmRleCA9IEZSLT5nZXRJbmRleCgpOworICBjb25zdCBjaGFyICp0bXBOYW1lOworICBpZiAoRkluZGV4IDwgRnVuY0luZm8tPmdldFJlc2VydmVkRnJhbWVDb3VudCgpKSB7CisgICAgdG1wTmFtZSA9IEVTTmFtZXM6OmNyZWF0ZUVTTmFtZShQQU46OmdldEZyYW1lTGFiZWwoTmFtZSkpOworICAgIEVTID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKHRtcE5hbWUsIE1WVDo6aTgpOworICAgIE9mZnNldCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpPTA7IGk8RkluZGV4IDsgKytpKSB7CisgICAgICBPZmZzZXQgKz0gTUZJLT5nZXRPYmplY3RTaXplKGkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgIC8vIEZyYW1lSW5kZXggaGFzIGJlZW4gbWFkZSBmb3Igc29tZSB0ZW1wb3Jhcnkgc3RvcmFnZSAKKyAgICB0bXBOYW1lID0gRVNOYW1lczo6Y3JlYXRlRVNOYW1lKFBBTjo6Z2V0VGVtcGRhdGFMYWJlbChOYW1lKSk7CisgICAgRVMgPSBEQUcuZ2V0VGFyZ2V0RXh0ZXJuYWxTeW1ib2wodG1wTmFtZSwgTVZUOjppOCk7CisgICAgT2Zmc2V0ID0gR2V0VG1wT2Zmc2V0Rm9yRkkoRkluZGV4LCBNRkktPmdldE9iamVjdFNpemUoRkluZGV4KSwgTUYpOworICB9CisKKyAgcmV0dXJuOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGxlZ2FsaXplcyB0aGUgUElDMTYgQWRkcmVzc2VzLiBJZiB0aGUgUG9pbnRlciBpcyAgCisvLyAgLS0gRGlyZWN0IGFkZHJlc3MgdmFyaWFibGUgcmVzaWRpbmcgCisvLyAgICAgLS0+IHRoZW4gYSBCYW5rc2VsIGZvciB0aGF0IHZhcmlhYmxlIHdpbGwgYmUgY3JlYXRlZC4KKy8vICAtLSBSb20gdmFyaWFibGUgICAgICAgICAgICAKKy8vICAgICAtLT4gdGhlbiBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gaW5kaXJlY3QgYWRkcmVzcy4KKy8vICAtLSBJbmRpcmVjdCBhZGRyZXNzIAorLy8gICAgIC0tPiB0aGVuIHRoZSBhZGRyZXNzIHdpbGwgYmUgbG9hZGVkIGludG8gRlNSCisvLyAgLS0gQUREIHdpdGggY29uc3RhbnQgb3BlcmFuZAorLy8gICAgIC0tPiB0aGVuIGNvbnN0YW50IG9wZXJhbmQgb2YgQUREIHdpbGwgYmUgcmV0dXJuZWQgYXMgT2Zmc2V0CisvLyAgICAgICAgIGFuZCBub24tY29uc3RhbnQgb3BlcmFuZCBvZiBBREQgd2lsbCBiZSB0cmVhdGVkIGFzIHBvaW50ZXIuCisvLyBSZXR1cm5zIHRoZSBoaWdoIGFuZCBsbyBwYXJ0IG9mIHRoZSBhZGRyZXNzLCBhbmQgdGhlIG9mZnNldChpbiBjYXNlIG9mIEFERCkuCisKK3ZvaWQgUElDMTZUYXJnZXRMb3dlcmluZzo6TGVnYWxpemVBZGRyZXNzKFNEVmFsdWUgUHRyLCBTZWxlY3Rpb25EQUcgJkRBRywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmT2Zmc2V0LCBEZWJ1Z0xvYyBkbCkgY29uc3QgeworCisgIC8vIE9mZnNldCwgYnkgZGVmYXVsdCwgc2hvdWxkIGJlIDAKKyAgT2Zmc2V0ID0gMDsKKworICAvLyBJZiB0aGUgcG9pbnRlciBpcyBBREQgd2l0aCBjb25zdGFudCwKKyAgLy8gcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZSBhcyB0aGUgb2Zmc2V0ICAKKyAgaWYgKFB0ci5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIFNEVmFsdWUgT3BlckxlZnQgPSBQdHIuZ2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIE9wZXJSaWdodCA9IFB0ci5nZXRPcGVyYW5kKDEpOworICAgIGlmICgoT3BlckxlZnQuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCkgJiYKKyAgICAgICAgKGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcGVyTGVmdCktPmdldFpFeHRWYWx1ZSgpIDwgMzIgKSkgeworICAgICAgT2Zmc2V0ID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wZXJMZWZ0KS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBQdHIgPSBPcGVyUmlnaHQ7CisgICAgfSBlbHNlIGlmICgoT3BlclJpZ2h0LmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpICAmJgorICAgICAgICAgICAgICAgKGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcGVyUmlnaHQpLT5nZXRaRXh0VmFsdWUoKSA8IDMyICkpeworICAgICAgT2Zmc2V0ID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wZXJSaWdodCktPmdldFpFeHRWYWx1ZSgpOworICAgICAgUHRyID0gT3BlckxlZnQ7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIHBvaW50ZXIgaXMgVHlwZSBpOCBhbmQgYW4gZXh0ZXJuYWwgc3ltYm9sCisgIC8vIHRoZW4gdHJlYXQgaXQgYXMgZGlyZWN0IGFkZHJlc3MuCisgIC8vIE9uZSBleGFtcGxlIGZvciBzdWNoIGNhc2UgaXMgc3RvcmluZyBhbmQgbG9hZGluZworICAvLyBmcm9tIGZ1bmN0aW9uIGZyYW1lIGR1cmluZyBhIGNhbGwKKyAgaWYgKFB0ci5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6Omk4KSB7CisgICAgc3dpdGNoIChQdHIuZ2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIElTRDo6VGFyZ2V0RXh0ZXJuYWxTeW1ib2w6CisgICAgICBMbyA9IFB0cjsKKyAgICAgIEhpID0gREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIEV4cGFuc2lvbiBvZiBGcmFtZUluZGV4IGhhcyBMby9IaSBwYXJ0cworICBpZiAoaXNEaXJlY3RBZGRyZXNzKFB0cikpIHsgCisgICAgICBTRFZhbHVlIFRGSSA9IFB0ci5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCk7IAorICAgICAgaW50IEZyYW1lT2Zmc2V0OworICAgICAgaWYgKFRGSS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEZyYW1lSW5kZXgpIHsKKyAgICAgICAgTGVnYWxpemVGcmFtZUluZGV4KFRGSSwgREFHLCBMbywgRnJhbWVPZmZzZXQpOworICAgICAgICBIaSA9IERBRy5nZXRDb25zdGFudCgxLCBNVlQ6Omk4KTsKKyAgICAgICAgT2Zmc2V0ICs9IEZyYW1lT2Zmc2V0OyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChURkkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbCkgeworICAgICAgICAvLyBGcmFtZUluZGV4IGhhcyBhbHJlYWR5IGJlZW4gZXhwYW5kZWQuCisgICAgICAgIC8vIE5vdyBqdXN0IG1ha2UgdXNlIG9mIGl0cyBleHBhbnNpb24KKyAgICAgICAgTG8gPSBURkk7CisgICAgICAgIEhpID0gREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTgpOworICAgICAgICBTRFZhbHVlIEZPZmZzZXQgPSBQdHIuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDEpOworICAgICAgICBhc3NlcnQgKEZPZmZzZXQuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3BlcmFuZCBvZiBQSUMxNklTRDo6TG8iKTsKKyAgICAgICAgT2Zmc2V0ICs9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihGT2Zmc2V0KS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgfQorCisgIGlmIChpc0RpcmVjdEFkZHJlc3MoUHRyKSAmJiAhaXNSb21BZGRyZXNzKFB0cikpIHsKKyAgICAvLyBEaXJlY3QgYWRkcmVzc2luZyBjYXNlIGZvciBSQU0gdmFyaWFibGVzLiBUaGUgSGkgcGFydCBpcyBjb25zdGFudAorICAgIC8vIGFuZCB0aGUgTG8gcGFydCBpcyB0aGUgVEdBIGl0c2VsZi4KKyAgICBMbyA9IFB0ci5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCk7CisKKyAgICAvLyBGb3IgZGlyZWN0IGFkZHJlc3NlcyBIaSBpcyBhIGNvbnN0YW50LiBWYWx1ZSAxIGZvciB0aGUgY29uc3RhbnQKKyAgICAvLyBzaWduaWZpZXMgdGhhdCBiYW5rc2VsIG5lZWRzIHRvIGdlbmVyYXRlZCBmb3IgaXQuIFZhbHVlIDAgZm9yCisgICAgLy8gdGhlIGNvbnN0YW50IHNpZ25pZmllcyB0aGF0IGJhbmtzZWwgZG9lcyBub3QgbmVlZCB0byBiZSBnZW5lcmF0ZWQgCisgICAgLy8gZm9yIGl0LiBNYXJrIGl0IGFzIDEgbm93IGFuZCBvcHRpbWl6ZSBsYXRlci4gCisgICAgSGkgPSBEQUcuZ2V0Q29uc3RhbnQoMSwgTVZUOjppOCk7CisgICAgcmV0dXJuOyAKKyAgfQorCisgIC8vIEluZGlyZWN0IGFkZHJlc3Nlcy4gR2V0IHRoZSBoaSBhbmQgbG8gcGFydHMgb2YgcHRyLiAKKyAgR2V0RXhwYW5kZWRQYXJ0cyhQdHIsIERBRywgTG8sIEhpKTsKKworICAvLyBQdXQgdGhlIGhpIGFuZCBsbyBwYXJ0cyBpbnRvIEZTUi4KKyAgTG8gPSBEQUcuZ2V0Tm9kZShQSUMxNklTRDo6TVRMTywgZGwsIE1WVDo6aTgsIExvKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShQSUMxNklTRDo6TVRISSwgZGwsIE1WVDo6aTgsIEhpKTsKKworICByZXR1cm47Cit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6RXhwYW5kTG9hZChTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIExvYWRTRE5vZGUgKkxEID0gZHluX2Nhc3Q8TG9hZFNETm9kZT4oU0RWYWx1ZShOLCAwKSk7CisgIFNEVmFsdWUgQ2hhaW4gPSBMRC0+Z2V0Q2hhaW4oKTsKKyAgU0RWYWx1ZSBQdHIgPSBMRC0+Z2V0QmFzZVB0cigpOworICBEZWJ1Z0xvYyBkbCA9IExELT5nZXREZWJ1Z0xvYygpOworCisgIFNEVmFsdWUgTG9hZCwgT2Zmc2V0OworICBTRFZUTGlzdCBUeXM7IAorICBFVlQgVlQsIE5ld1ZUOworICBTRFZhbHVlIFB0ckxvLCBQdHJIaTsKKyAgdW5zaWduZWQgTG9hZE9mZnNldDsKKworICAvLyBMZWdhbGl6ZSBkaXJlY3QvaW5kaXJlY3QgYWRkcmVzc2VzLiBUaGlzIHdpbGwgZ2l2ZSB0aGUgbG8gYW5kIGhpIHBhcnRzCisgIC8vIG9mIHRoZSBhZGRyZXNzIGFuZCB0aGUgb2Zmc2V0LgorICBMZWdhbGl6ZUFkZHJlc3MoUHRyLCBEQUcsIFB0ckxvLCBQdHJIaSwgTG9hZE9mZnNldCwgZGwpOworCisgIC8vIExvYWQgZnJvbSB0aGUgcG9pbnRlciAoZGlyZWN0IGFkZHJlc3Mgb3IgRlNSKSAKKyAgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIHVuc2lnbmVkIE51bUxvYWRzID0gVlQuZ2V0U2l6ZUluQml0cygpIC8gODsgCisgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+IFBJQ0xvYWRzOworICB1bnNpZ25lZCBpdGVyOworICBFVlQgTWVtVlQgPSBMRC0+Z2V0TWVtb3J5VlQoKTsKKyAgaWYoSVNEOjppc05PTl9FWFRMb2FkKE4pKSB7CisgICAgZm9yIChpdGVyPTA7IGl0ZXI8TnVtTG9hZHMgOyArK2l0ZXIpIHsKKyAgICAgIC8vIEFkZCB0aGUgcG9pbnRlciBvZmZzZXQgaWYgYW55CisgICAgICBPZmZzZXQgPSBEQUcuZ2V0Q29uc3RhbnQoaXRlciArIExvYWRPZmZzZXQsIE1WVDo6aTgpOworICAgICAgVHlzID0gREFHLmdldFZUTGlzdChNVlQ6Omk4LCBNVlQ6Ok90aGVyKTsgCisgICAgICBMb2FkID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OlBJQzE2TG9hZCwgZGwsIFR5cywgQ2hhaW4sIFB0ckxvLCBQdHJIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQpOyAKKyAgICAgIFBJQ0xvYWRzLnB1c2hfYmFjayhMb2FkKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gSWYgaXQgaXMgZXh0ZW5kZWQgbG9hZCB0aGVuIHVzZSBQSUMxNkxvYWQgZm9yIE1lbW9yeSBCeXRlcworICAgIC8vIGFuZCBmb3IgYWxsIGV4dGVuZGVkIGJ5dGVzIHBlcmZvcm0gYWN0aW9uIGJhc2VkIG9uIHR5cGUgb2YKKyAgICAvLyBleHRlbnRpb24gLSBpLmUuIFNpZ25FeHRlbmRlZExvYWQgb3IgWmVyb0V4dGVuZGVkTG9hZAorCisgICAgCisgICAgLy8gRm9yIGV4dGVuZGVkIGxvYWRzIHRoaXMgaXMgdGhlIG1lbW9yeSB2YWx1ZSB0eXBlCisgICAgLy8gaS5lLiB3aXRob3V0IGFueSBleHRlbnNpb24KKyAgICBFVlQgTWVtVlQgPSBMRC0+Z2V0TWVtb3J5VlQoKTsKKyAgICB1bnNpZ25lZCBNZW1CeXRlcyA9IE1lbVZULmdldFNpemVJbkJpdHMoKSAvIDg7CisgICAgLy8gaWYgTVZUOjppMSBpcyBleHRlbmRlZCB0byBNVlQ6Omk4IHRoZW4gTWVtQnl0ZXMgd2lsbCBiZSB6ZXJvCisgICAgLy8gU28gc2V0IGl0IHRvIG9uZQorICAgIGlmIChNZW1CeXRlcyA9PSAwKSBNZW1CeXRlcyA9IDE7CisgICAgCisgICAgdW5zaWduZWQgRXh0ZEJ5dGVzID0gVlQuZ2V0U2l6ZUluQml0cygpIC8gODsKKyAgICBPZmZzZXQgPSBEQUcuZ2V0Q29uc3RhbnQoTG9hZE9mZnNldCwgTVZUOjppOCk7CisKKyAgICBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6aTgsIE1WVDo6T3RoZXIpOyAKKyAgICAvLyBGb3IgTWVtQnl0ZXMgZ2VuZXJhdGUgUElDMTZMb2FkIHdpdGggcHJvcGVyIG9mZnNldAorICAgIGZvciAoaXRlcj0wOyBpdGVyIDwgTWVtQnl0ZXM7ICsraXRlcikgeworICAgICAgLy8gQWRkIHRoZSBwb2ludGVyIG9mZnNldCBpZiBhbnkKKyAgICAgIE9mZnNldCA9IERBRy5nZXRDb25zdGFudChpdGVyICsgTG9hZE9mZnNldCwgTVZUOjppOCk7CisgICAgICBMb2FkID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OlBJQzE2TG9hZCwgZGwsIFR5cywgQ2hhaW4sIFB0ckxvLCBQdHJIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQpOyAKKyAgICAgIFBJQ0xvYWRzLnB1c2hfYmFjayhMb2FkKTsKKyAgICB9CisKKyAgICAvLyBGb3IgU2lnbkV4dGVuZGVkTG9hZAorICAgIGlmIChJU0Q6OmlzU0VYVExvYWQoTikpIHsKKyAgICAgIC8vIEZvciBhbGwgRXh0ZEJ5dGVzIHVzZSB0aGUgUmlnaHQgU2hpZnRlZChBcml0aG1ldGljKSBWYWx1ZSBvZiB0aGUgCisgICAgICAvLyBoaWdoZXN0IE1lbUJ5dGUKKyAgICAgIFNEVmFsdWUgU1JBID0gREFHLmdldE5vZGUoSVNEOjpTUkEsIGRsLCBNVlQ6Omk4LCBMb2FkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDcsIE1WVDo6aTgpKTsKKyAgICAgIGZvciAoaXRlcj1NZW1CeXRlczsgaXRlcjxFeHRkQnl0ZXM7ICsraXRlcikgeyAKKyAgICAgICAgUElDTG9hZHMucHVzaF9iYWNrKFNSQSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChJU0Q6OmlzWkVYVExvYWQoTikgfHwgSVNEOjppc0VYVExvYWQoTikpIHsKKyAgICAvL30gZWxzZSBpZiAoSVNEOjppc1pFWFRMb2FkKE4pKSB7CisgICAgICAvLyBaZXJvRXh0ZW5kZWRMb2FkIC0tIEZvciBhbGwgRXh0ZEJ5dGVzIHVzZSBjb25zdGFudCAwCisgICAgICBTRFZhbHVlIENvbnN0WmVybyA9IERBRy5nZXRDb25zdGFudCgwLCBNVlQ6Omk4KTsKKyAgICAgIGZvciAoaXRlcj1NZW1CeXRlczsgaXRlcjxFeHRkQnl0ZXM7ICsraXRlcikgeyAKKyAgICAgICAgUElDTG9hZHMucHVzaF9iYWNrKENvbnN0WmVybyk7CisgICAgICB9CisgICAgfQorICB9CisgIFNEVmFsdWUgQlA7CisKKyAgaWYgKFZUID09IE1WVDo6aTgpIHsKKyAgICAvLyBPcGVyYW5kIG9mIExvYWQgaXMgaWxsZWdhbCAtLSBMb2FkIGl0c2VsZiBpcyBsZWdhbAorICAgIHJldHVybiBQSUNMb2Fkc1swXTsKKyAgfQorICBlbHNlIGlmIChWVCA9PSBNVlQ6OmkxNikgeworICAgIEJQID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgVlQsIFBJQ0xvYWRzWzBdLCBQSUNMb2Fkc1sxXSk7CisgICAgaWYgKChNZW1WVCA9PSBNVlQ6Omk4KSB8fCAoTWVtVlQgPT0gTVZUOjppMSkpCisgICAgICBDaGFpbiA9IGdldENoYWluKFBJQ0xvYWRzWzBdKTsKKyAgICBlbHNlCisgICAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhaW4oUElDTG9hZHNbMF0pLCBnZXRDaGFpbihQSUNMb2Fkc1sxXSkpOworICB9IGVsc2UgaWYgKFZUID09IE1WVDo6aTMyKSB7CisgICAgU0RWYWx1ZSBCUHNbMl07CisgICAgQlBzWzBdID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgTVZUOjppMTYsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFBJQ0xvYWRzWzBdLCBQSUNMb2Fkc1sxXSk7CisgICAgQlBzWzFdID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgTVZUOjppMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUElDTG9hZHNbMl0sIFBJQ0xvYWRzWzNdKTsKKyAgICBCUCA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfUEFJUiwgZGwsIFZULCBCUHNbMF0sIEJQc1sxXSk7CisgICAgaWYgKChNZW1WVCA9PSBNVlQ6Omk4KSB8fCAoTWVtVlQgPT0gTVZUOjppMSkpCisgICAgICBDaGFpbiA9IGdldENoYWluKFBJQ0xvYWRzWzBdKTsKKyAgICBlbHNlIGlmIChNZW1WVCA9PSBNVlQ6OmkxNikKKyAgICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGFpbihQSUNMb2Fkc1swXSksIGdldENoYWluKFBJQ0xvYWRzWzFdKSk7CisgICAgZWxzZSB7CisgICAgICBTRFZhbHVlIENoYWluc1syXTsKKyAgICAgIENoYWluc1swXSA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhaW4oUElDTG9hZHNbMF0pLCBnZXRDaGFpbihQSUNMb2Fkc1sxXSkpOworICAgICAgQ2hhaW5zWzFdID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGFpbihQSUNMb2Fkc1syXSksIGdldENoYWluKFBJQ0xvYWRzWzNdKSk7CisgICAgICBDaGFpbiA9ICBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWluc1swXSwgQ2hhaW5zWzFdKTsKKyAgICB9CisgIH0KKyAgVHlzID0gREFHLmdldFZUTGlzdChWVCwgTVZUOjpPdGhlcik7IAorICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpNRVJHRV9WQUxVRVMsIGRsLCBUeXMsIEJQLCBDaGFpbik7Cit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6TG93ZXJTaGlmdChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvLyBXZSBzaG91bGQgaGF2ZSBoYW5kbGVkIGxhcmdlciBvcGVyYW5kcyBpbiB0eXBlIGxlZ2FsaXplciBpdHNlbGYuCisgIGFzc2VydCAoT3AuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppOCAmJiAiaWxsZWdhbCBzaGlmdCB0byBsb3dlciIpOworIAorICBTRE5vZGUgKk4gPSBPcC5nZXROb2RlKCk7CisgIFNEVmFsdWUgVmFsdWUgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIEFtdCA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFBJQzE2SVNEOjpQSUMxNkxpYmNhbGwgQ2FsbENvZGU7CisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBJU0Q6OlNSQToKKyAgICBDYWxsQ29kZSA9IFBJQzE2SVNEOjpTUkFfSTg7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTSEw6CisgICAgQ2FsbENvZGUgPSBQSUMxNklTRDo6U0xMX0k4OworICAgIGJyZWFrOworICBjYXNlIElTRDo6U1JMOgorICAgIENhbGxDb2RlID0gUElDMTZJU0Q6OlNSTF9JODsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQgKCAwICYmICJUaGlzIHNoaWZ0IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAyPiBPcHMoMik7CisgIE9wc1swXSA9IFZhbHVlOworICBPcHNbMV0gPSBBbXQ7CisgIFNEVmFsdWUgQ2FsbCA9IE1ha2VQSUMxNkxpYmNhbGwoQ2FsbENvZGUsIE4tPmdldFZhbHVlVHlwZSgwKSwgJk9wc1swXSwgMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgREFHLCBOLT5nZXREZWJ1Z0xvYygpKTsKKyAgcmV0dXJuIENhbGw7Cit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6TG93ZXJNVUwoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgLy8gV2Ugc2hvdWxkIGhhdmUgaGFuZGxlZCBsYXJnZXIgb3BlcmFuZHMgaW4gdHlwZSBsZWdhbGl6ZXIgaXRzZWxmLgorICBhc3NlcnQgKE9wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTggJiYgImlsbGVnYWwgbXVsdGlwbHkgdG8gbG93ZXIiKTsKKworICBTRE5vZGUgKk4gPSBPcC5nZXROb2RlKCk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDI+IE9wcygyKTsKKyAgT3BzWzBdID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgT3BzWzFdID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBDYWxsID0gTWFrZVBJQzE2TGliY2FsbChQSUMxNklTRDo6TVVMX0k4LCBOLT5nZXRWYWx1ZVR5cGUoMCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPcHNbMF0sIDIsIHRydWUsIERBRywgTi0+Z2V0RGVidWdMb2MoKSk7CisgIHJldHVybiBDYWxsOworfQorCit2b2lkCitQSUMxNlRhcmdldExvd2VyaW5nOjpMb3dlck9wZXJhdGlvbldyYXBwZXIoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiZSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgT3AgPSBTRFZhbHVlKE4sIDApOworICBTRFZhbHVlIFJlczsKKyAgdW5zaWduZWQgaTsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSVNEOjpMT0FEOgorICAgICAgUmVzID0gRXhwYW5kTG9hZChPcC5nZXROb2RlKCksIERBRyk7IGJyZWFrOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIC8vIEFsbCBvdGhlciBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGluIExvd2VyT3BlcmF0aW9uLgorICAgICAgUmVzID0gTG93ZXJPcGVyYXRpb24oT3AsIERBRyk7CisgICAgICBpZiAoUmVzLmdldE5vZGUoKSkKKyAgICAgICAgUmVzdWx0cy5wdXNoX2JhY2soUmVzKTsKKyAgICAgICAgCisgICAgICByZXR1cm47IAorICAgIH0KKyAgfQorCisgIE4gPSBSZXMuZ2V0Tm9kZSgpOworICB1bnNpZ25lZCBOdW1WYWx1ZXMgPSBOLT5nZXROdW1WYWx1ZXMoKTsgCisgIGZvciAoaSA9IDA7IGkgPCBOdW1WYWx1ZXMgOyBpKyspIHsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhTRFZhbHVlKE4sIGkpKTsgCisgIH0KK30KKworU0RWYWx1ZSBQSUMxNlRhcmdldExvd2VyaW5nOjpMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBzd2l0Y2ggKE9wLmdldE9wY29kZSgpKSB7CisgICAgY2FzZSBJU0Q6OkFERDoKKyAgICBjYXNlIElTRDo6QUREQzoKKyAgICBjYXNlIElTRDo6QURERToKKyAgICAgIHJldHVybiBMb3dlckFERChPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6U1VCOgorICAgIGNhc2UgSVNEOjpTVUJDOgorICAgIGNhc2UgSVNEOjpTVUJFOgorICAgICAgcmV0dXJuIExvd2VyU1VCKE9wLCBEQUcpOworICAgIGNhc2UgSVNEOjpMT0FEOgorICAgICAgcmV0dXJuIEV4cGFuZExvYWQoT3AuZ2V0Tm9kZSgpLCBEQUcpOworICAgIGNhc2UgSVNEOjpTVE9SRToKKyAgICAgIHJldHVybiBFeHBhbmRTdG9yZShPcC5nZXROb2RlKCksIERBRyk7CisgICAgY2FzZSBJU0Q6Ok1VTDoKKyAgICAgIHJldHVybiBMb3dlck1VTChPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6U0hMOgorICAgIGNhc2UgSVNEOjpTUkE6CisgICAgY2FzZSBJU0Q6OlNSTDoKKyAgICAgIHJldHVybiBMb3dlclNoaWZ0KE9wLCBEQUcpOworICAgIGNhc2UgSVNEOjpPUjoKKyAgICBjYXNlIElTRDo6QU5EOgorICAgIGNhc2UgSVNEOjpYT1I6CisgICAgICByZXR1cm4gTG93ZXJCaW5PcChPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6QlJfQ0M6CisgICAgICByZXR1cm4gTG93ZXJCUl9DQyhPcCwgREFHKTsKKyAgICBjYXNlIElTRDo6U0VMRUNUX0NDOgorICAgICAgcmV0dXJuIExvd2VyU0VMRUNUX0NDKE9wLCBEQUcpOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6Q29udmVydFRvTWVtT3BlcmFuZChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSBjb25zdCB7CisgIGFzc2VydCAoT3AuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppOCAKKyAgICAgICAgICAmJiAiaWxsZWdhbCB2YWx1ZSB0eXBlIHRvIHN0b3JlIG9uIHN0YWNrLiIpOworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIGNvbnN0IEZ1bmN0aW9uICpGdW5jID0gTUYuZ2V0RnVuY3Rpb24oKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgRnVuY05hbWUgPSBGdW5jLT5nZXROYW1lKCk7CisKKworICAvLyBQdXQgdGhlIHZhbHVlIG9uIHN0YWNrLgorICAvLyBHZXQgYSBzdGFjayBzbG90IGluZGV4IGFuZCBjb252ZXJ0IHRvIGVzLgorICBpbnQgRkkgPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlU3RhY2tPYmplY3QoMSwgMSwgZmFsc2UpOworICBjb25zdCBjaGFyICp0bXBOYW1lID0gRVNOYW1lczo6Y3JlYXRlRVNOYW1lKFBBTjo6Z2V0VGVtcGRhdGFMYWJlbChGdW5jTmFtZSkpOworICBTRFZhbHVlIEVTID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKHRtcE5hbWUsIE1WVDo6aTgpOworCisgIC8vIFN0b3JlIHRoZSB2YWx1ZSB0byBFUy4KKyAgU0RWYWx1ZSBTdG9yZSA9IERBRy5nZXROb2RlIChQSUMxNklTRDo6UElDMTZTdG9yZSwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEVudHJ5Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLCBFUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50ICgxLCBNVlQ6Omk4KSwgLy8gQmFua3NlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQgKEdldFRtcE9mZnNldEZvckZJKEZJLCAxLCBNRiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppOCkpOworCisgIC8vIExvYWQgdGhlIHZhbHVlIGZyb20gRVMuCisgIFNEVlRMaXN0IFR5cyA9IERBRy5nZXRWVExpc3QoTVZUOjppOCwgTVZUOjpPdGhlcik7CisgIFNEVmFsdWUgTG9hZCA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpQSUMxNkxvYWQsIGRsLCBUeXMsIFN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUywgREFHLmdldENvbnN0YW50ICgxLCBNVlQ6Omk4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50IChHZXRUbXBPZmZzZXRGb3JGSShGSSwgMSwgTUYpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppOCkpOworICAgIAorICByZXR1cm4gTG9hZC5nZXRWYWx1ZSgwKTsKK30KKworU0RWYWx1ZSBQSUMxNlRhcmdldExvd2VyaW5nOjoKK0xvd2VySW5kaXJlY3RDYWxsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBEYXRhQWRkcl9MbywgU0RWYWx1ZSBEYXRhQWRkcl9IaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICB1bnNpZ25lZCBOdW1PcHMgPSBPdXRzLnNpemUoKTsKKworICAvLyBJZiBjYWxsIGhhcyBubyBhcmd1bWVudHMgdGhlbiBkbyBub3RoaW5nIGFuZCByZXR1cm4uCisgIGlmIChOdW1PcHMgPT0gMCkKKyAgICByZXR1cm4gQ2hhaW47CisKKyAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gT3BzOworICBTRFZUTGlzdCBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIFNEVmFsdWUgQXJnLCBTdG9yZVJldDsKKworICAvLyBGb3IgUElDMTYgQUJJIHRoZSBhcmd1bWVudHMgY29tZSBhZnRlciB0aGUgcmV0dXJuIHZhbHVlLiAKKyAgdW5zaWduZWQgUmV0VmFscyA9IElucy5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIEFyZ09mZnNldCA9IFJldFZhbHM7IGkgPCBOdW1PcHM7IGkrKykgeworICAgIC8vIEdldCB0aGUgYXJndW1lbnRzCisgICAgQXJnID0gT3V0VmFsc1tpXTsKKyAgICAKKyAgICBPcHMuY2xlYXIoKTsKKyAgICBPcHMucHVzaF9iYWNrKENoYWluKTsKKyAgICBPcHMucHVzaF9iYWNrKEFyZyk7CisgICAgT3BzLnB1c2hfYmFjayhEYXRhQWRkcl9Mbyk7CisgICAgT3BzLnB1c2hfYmFjayhEYXRhQWRkcl9IaSk7CisgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoQXJnT2Zmc2V0LCBNVlQ6Omk4KSk7CisgICAgT3BzLnB1c2hfYmFjayhJbkZsYWcpOworCisgICAgU3RvcmVSZXQgPSBEQUcuZ2V0Tm9kZSAoUElDMTZJU0Q6OlBJQzE2U3RXRiwgZGwsIFR5cywgJk9wc1swXSwgT3BzLnNpemUoKSk7CisKKyAgICBDaGFpbiA9IGdldENoYWluKFN0b3JlUmV0KTsKKyAgICBJbkZsYWcgPSBnZXRPdXRGbGFnKFN0b3JlUmV0KTsKKyAgICBBcmdPZmZzZXQrKzsKKyAgfQorICByZXR1cm4gQ2hhaW47Cit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6CitMb3dlckRpcmVjdENhbGxBcmd1bWVudHMoU0RWYWx1ZSBBcmdMYWJlbCwgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBJbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIHVuc2lnbmVkIE51bU9wcyA9IE91dHMuc2l6ZSgpOworICBzdGQ6OnN0cmluZyBOYW1lOworICBTRFZhbHVlIEFyZywgU3RvcmVBdDsKKyAgRVZUIEFyZ1ZUOworICB1bnNpZ25lZCBTaXplPTA7CisKKyAgLy8gSWYgY2FsbCBoYXMgbm8gYXJndW1lbnRzIHRoZW4gZG8gbm90aGluZyBhbmQgcmV0dXJuLgorICBpZiAoTnVtT3BzID09IDApCisgICAgcmV0dXJuIENoYWluOyAKKworICAvLyBGSVhNRTogVGhpcyBwb3J0aW9uIG9mIGNvZGUgY3VycmVudGx5IGFzc3VtZXMgb25seQorICAvLyBwcmltaXRpdmUgdHlwZXMgYmVpbmcgcGFzc2VkIGFzIGFyZ3VtZW50cy4KKworICAvLyBMZWdhbGl6ZSB0aGUgYWRkcmVzcyBiZWZvcmUgdXNlCisgIFNEVmFsdWUgUHRyTG8sIFB0ckhpOworICB1bnNpZ25lZCBBZGRyZXNzT2Zmc2V0OworICBpbnQgU3RvcmVPZmZzZXQgPSAwOworICBMZWdhbGl6ZUFkZHJlc3MoQXJnTGFiZWwsIERBRywgUHRyTG8sIFB0ckhpLCBBZGRyZXNzT2Zmc2V0LCBkbCk7CisgIFNEVmFsdWUgU3RvcmVSZXQ7CisKKyAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gT3BzOworICBTRFZUTGlzdCBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIGZvciAodW5zaWduZWQgaT0wLCBPZmZzZXQgPSAwOyBpPE51bU9wczsgaSsrKSB7CisgICAgLy8gR2V0IHRoZSBhcmd1bWVudAorICAgIEFyZyA9IE91dFZhbHNbaV07CisgICAgU3RvcmVPZmZzZXQgPSAoT2Zmc2V0ICsgQWRkcmVzc09mZnNldCk7CisgICAKKyAgICAvLyBTdG9yZSB0aGUgYXJndW1lbnQgb24gZnJhbWUKKworICAgIE9wcy5jbGVhcigpOworICAgIE9wcy5wdXNoX2JhY2soQ2hhaW4pOworICAgIE9wcy5wdXNoX2JhY2soQXJnKTsKKyAgICBPcHMucHVzaF9iYWNrKFB0ckxvKTsKKyAgICBPcHMucHVzaF9iYWNrKFB0ckhpKTsKKyAgICBPcHMucHVzaF9iYWNrKERBRy5nZXRDb25zdGFudChTdG9yZU9mZnNldCwgTVZUOjppOCkpOworICAgIE9wcy5wdXNoX2JhY2soSW5GbGFnKTsKKworICAgIFN0b3JlUmV0ID0gREFHLmdldE5vZGUgKFBJQzE2SVNEOjpQSUMxNlN0V0YsIGRsLCBUeXMsICZPcHNbMF0sIE9wcy5zaXplKCkpOworCisgICAgQ2hhaW4gPSBnZXRDaGFpbihTdG9yZVJldCk7CisgICAgSW5GbGFnID0gZ2V0T3V0RmxhZyhTdG9yZVJldCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIGZyYW1lIG9mZnNldCB0byBiZSB1c2VkIGZvciBuZXh0IGFyZ3VtZW50CisgICAgQXJnVlQgPSBBcmcuZ2V0VmFsdWVUeXBlKCk7CisgICAgU2l6ZSA9IEFyZ1ZULmdldFNpemVJbkJpdHMoKTsKKyAgICBTaXplID0gU2l6ZS84OyAgICAvLyBDYWxjdWxhdGUgc2l6ZSBpbiBieXRlcworICAgIE9mZnNldCArPSBTaXplOyAgIC8vIEluY3JlYXNlIHRoZSBmcmFtZSBvZmZzZXQKKyAgfQorICByZXR1cm4gQ2hhaW47Cit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6CitMb3dlckluZGlyZWN0Q2FsbFJldHVybihTRFZhbHVlIENoYWluLCBTRFZhbHVlIEluRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgRGF0YUFkZHJfTG8sIFNEVmFsdWUgRGF0YUFkZHJfSGksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdCB7CisgIHVuc2lnbmVkIFJldFZhbHMgPSBJbnMuc2l6ZSgpOworCisgIC8vIElmIGNhbGwgZG9lcyBub3QgaGF2ZSBhbnl0aGluZyB0byByZXR1cm4KKyAgLy8gdGhlbiBkbyBub3RoaW5nIGFuZCBnbyBiYWNrLgorICBpZiAoUmV0VmFscyA9PSAwKQorICAgIHJldHVybiBDaGFpbjsKKworICAvLyBDYWxsIGhhcyBzb21ldGhpbmcgdG8gcmV0dXJuCisgIFNEVmFsdWUgTG9hZFJldDsKKworICBTRFZUTGlzdCBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6aTgsIE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIGZvcih1bnNpZ25lZCBpPTA7aTxSZXRWYWxzO2krKykgeworICAgIExvYWRSZXQgPSBEQUcuZ2V0Tm9kZShQSUMxNklTRDo6UElDMTZMZFdGLCBkbCwgVHlzLCBDaGFpbiwgRGF0YUFkZHJfTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFBZGRyX0hpLCBEQUcuZ2V0Q29uc3RhbnQoaSwgTVZUOjppOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEluRmxhZyk7CisgICAgSW5GbGFnID0gZ2V0T3V0RmxhZyhMb2FkUmV0KTsKKyAgICBDaGFpbiA9IGdldENoYWluKExvYWRSZXQpOworICAgIEluVmFscy5wdXNoX2JhY2soTG9hZFJldCk7CisgIH0KKyAgcmV0dXJuIENoYWluOworfQorCitTRFZhbHVlIFBJQzE2VGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJEaXJlY3RDYWxsUmV0dXJuKFNEVmFsdWUgUmV0TGFiZWwsIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworCisgIC8vIEN1cnJlbnRseSBoYW5kbGluZyBwcmltaXRpdmUgdHlwZXMgb25seS4gVGhleSB3aWxsIGNvbWUgaW4KKyAgLy8gaTggcGFydHMKKyAgdW5zaWduZWQgUmV0VmFscyA9IElucy5zaXplKCk7CisKKyAgLy8gUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSByZXR1cm4gdHlwZSBpcyB2b2lkCisgIGlmIChSZXRWYWxzID09IDApCisgICAgcmV0dXJuIENoYWluOworCisgIC8vIENhbGwgaGFzIHNvbWV0aGluZyB0byByZXR1cm4KKyAgCisgIC8vIExlZ2FsaXplIHRoZSBhZGRyZXNzIGJlZm9yZSB1c2UKKyAgU0RWYWx1ZSBMZExvLCBMZEhpOworICB1bnNpZ25lZCBMZE9mZnNldDsKKyAgTGVnYWxpemVBZGRyZXNzKFJldExhYmVsLCBEQUcsIExkTG8sIExkSGksIExkT2Zmc2V0LCBkbCk7CisKKyAgU0RWVExpc3QgVHlzID0gREFHLmdldFZUTGlzdChNVlQ6Omk4LCBNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICBTRFZhbHVlIExvYWRSZXQ7CisgCisgIGZvcih1bnNpZ25lZCBpPTAsIE9mZnNldD0wO2k8UmV0VmFscztpKyspIHsKKworICAgIExvYWRSZXQgPSBEQUcuZ2V0Tm9kZShQSUMxNklTRDo6UElDMTZMZFdGLCBkbCwgVHlzLCBDaGFpbiwgTGRMbywgTGRIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KExkT2Zmc2V0ICsgT2Zmc2V0LCBNVlQ6Omk4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5GbGFnKTsKKworICAgIEluRmxhZyA9IGdldE91dEZsYWcoTG9hZFJldCk7CisKKyAgICBDaGFpbiA9IGdldENoYWluKExvYWRSZXQpOworICAgIE9mZnNldCsrOworICAgIEluVmFscy5wdXNoX2JhY2soTG9hZFJldCk7CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKK1NEVmFsdWUKK1BJQzE2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyUmV0dXJuKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisKKyAgLy8gTnVtYmVyIG9mIHZhbHVlcyB0byByZXR1cm4gCisgIHVuc2lnbmVkIE51bVJldCA9IE91dHMuc2l6ZSgpOworCisgIC8vIEZ1bmN0aW9uIHJldHVybnMgdmFsdWUgYWx3YXlzIG9uIHN0YWNrIHdpdGggdGhlIG9mZnNldCBzdGFydGluZworICAvLyBmcm9tIDAgCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIGNvbnN0IEZ1bmN0aW9uICpGID0gTUYuZ2V0RnVuY3Rpb24oKTsKKyAgc3RkOjpzdHJpbmcgRnVuY05hbWUgPSBGLT5nZXROYW1lKCk7CisKKyAgY29uc3QgY2hhciAqdG1wTmFtZSA9IEVTTmFtZXM6OmNyZWF0ZUVTTmFtZShQQU46OmdldEZyYW1lTGFiZWwoRnVuY05hbWUpKTsKKyAgU0RWYWx1ZSBFUyA9IERBRy5nZXRUYXJnZXRFeHRlcm5hbFN5bWJvbCh0bXBOYW1lLCBNVlQ6Omk4KTsKKyAgU0RWYWx1ZSBCUyA9IERBRy5nZXRDb25zdGFudCgxLCBNVlQ6Omk4KTsKKyAgU0RWYWx1ZSBSZXRWYWw7CisgIGZvcih1bnNpZ25lZCBpPTA7aTxOdW1SZXQ7ICsraSkgeworICAgIFJldFZhbCA9IE91dFZhbHNbaV07CisgICAgQ2hhaW4gPSAgREFHLmdldE5vZGUgKFBJQzE2SVNEOjpQSUMxNlN0b3JlLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4sIFJldFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVTLCBCUywKKyAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCAoaSwgTVZUOjppOCkpOworICAgICAgCisgIH0KKyAgcmV0dXJuIERBRy5nZXROb2RlKFBJQzE2SVNEOjpSRVQsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbik7Cit9CisKK3ZvaWQgUElDMTZUYXJnZXRMb3dlcmluZzo6CitHZXREYXRhQWRkcmVzcyhEZWJ1Z0xvYyBkbCwgU0RWYWx1ZSBDYWxsZWUsIFNEVmFsdWUgJkNoYWluLCAKKyAgICAgICAgICAgICAgIFNEVmFsdWUgJkRhdGFBZGRyX0xvLCBTRFZhbHVlICZEYXRhQWRkcl9IaSwKKyAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgICBhc3NlcnQgKENhbGxlZS5nZXRPcGNvZGUoKSA9PSBQSUMxNklTRDo6UElDMTZDb25uZWN0CisgICAgICAgICAgICYmICJEb24ndCBrbm93IHdoYXQgdG8gZG8gb2Ygc3VjaCBjYWxsZWUhISIpOworICAgU0RWYWx1ZSBaZXJvT3BlcmFuZCA9IERBRy5nZXRDb25zdGFudCgwLCBNVlQ6Omk4KTsKKyAgIFNEVmFsdWUgU2VxU3RhcnQgID0gREFHLmdldENBTExTRVFfU1RBUlQoQ2hhaW4sIFplcm9PcGVyYW5kKTsKKyAgIENoYWluID0gZ2V0Q2hhaW4oU2VxU3RhcnQpOworICAgU0RWYWx1ZSBPcGVyRmxhZyA9IGdldE91dEZsYWcoU2VxU3RhcnQpOyAvLyBUbyBtYW5hZ2UgdGhlIGRhdGEgZGVwZW5kZW5jeQorCisgICAvLyBHZXQgdGhlIExvIGFuZCBIaSBwYXJ0IG9mIGNvZGUgYWRkcmVzcworICAgU0RWYWx1ZSBMbyA9IENhbGxlZS5nZXRPcGVyYW5kKDApOworICAgU0RWYWx1ZSBIaSA9IENhbGxlZS5nZXRPcGVyYW5kKDEpOworCisgICBTRFZhbHVlIERhdGFfTG8sIERhdGFfSGk7CisgICBTRFZUTGlzdCBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6aTgsIE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgICAvLyBTdWJ0cmFjdCAyIGZyb20gQWRkcmVzcyB0byBnZXQgdGhlIExvd2VyIHBhcnQgb2YgRGF0YUFkZHJlc3MuCisgICBTRFZUTGlzdCBWVExpc3QgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6aTgsIE1WVDo6RmxhZyk7CisgICBEYXRhX0xvID0gREFHLmdldE5vZGUoSVNEOjpTVUJDLCBkbCwgVlRMaXN0LCBMbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDIsIE1WVDo6aTgpKTsKKyAgIFNEVmFsdWUgT3BzWzNdID0geyBIaSwgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTgpLCBEYXRhX0xvLmdldFZhbHVlKDEpfTsKKyAgIERhdGFfSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQkUsIGRsLCBWVExpc3QsIE9wcywgMyk7CisgICBTRFZhbHVlIFBDTEFUSCA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpNVFBDTEFUSCwgZGwsIE1WVDo6aTgsIERhdGFfSGkpOworICAgQ2FsbGVlID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OlBJQzE2Q29ubmVjdCwgZGwsIE1WVDo6aTgsIERhdGFfTG8sIFBDTEFUSCk7CisgICBTRFZhbHVlIENhbGwgPSBEQUcuZ2V0Tm9kZShQSUMxNklTRDo6Q0FMTFcsIGRsLCBUeXMsIENoYWluLCBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyRmxhZyk7CisgICBDaGFpbiA9IGdldENoYWluKENhbGwpOworICAgT3BlckZsYWcgPSBnZXRPdXRGbGFnKENhbGwpOworICAgU0RWYWx1ZSBTZXFFbmQgPSBEQUcuZ2V0Q0FMTFNFUV9FTkQoQ2hhaW4sIFplcm9PcGVyYW5kLCBaZXJvT3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJGbGFnKTsKKyAgIENoYWluID0gZ2V0Q2hhaW4oU2VxRW5kKTsKKyAgIE9wZXJGbGFnID0gZ2V0T3V0RmxhZyhTZXFFbmQpOworCisgICAvLyBMb3cgcGFydCBvZiBEYXRhIEFkZHJlc3MgCisgICBEYXRhQWRkcl9MbyA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpNVExPLCBkbCwgTVZUOjppOCwgQ2FsbCwgT3BlckZsYWcpOworCisgICAvLyBNYWtlIHRoZSBzZWNvbmQgY2FsbC4KKyAgIFNlcVN0YXJ0ICA9IERBRy5nZXRDQUxMU0VRX1NUQVJUKENoYWluLCBaZXJvT3BlcmFuZCk7CisgICBDaGFpbiA9IGdldENoYWluKFNlcVN0YXJ0KTsKKyAgIE9wZXJGbGFnID0gZ2V0T3V0RmxhZyhTZXFTdGFydCk7IC8vIFRvIG1hbmFnZSB0aGUgZGF0YSBkZXBlbmRlbmN5CisKKyAgIC8vIFN1YnRyYWN0IDEgZnJvbSBBZGRyZXNzIHRvIGdldCBoaWdoIHBhcnQgb2YgZGF0YSBhZGRyZXNzLgorICAgRGF0YV9MbyA9IERBRy5nZXROb2RlKElTRDo6U1VCQywgZGwsIFZUTGlzdCwgTG8sIAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6Omk4KSk7CisgICBTRFZhbHVlIEhpT3BzWzNdID0geyBIaSwgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTgpLCBEYXRhX0xvLmdldFZhbHVlKDEpfTsKKyAgIERhdGFfSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQkUsIGRsLCBWVExpc3QsIEhpT3BzLCAzKTsKKyAgIFBDTEFUSCA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpNVFBDTEFUSCwgZGwsIE1WVDo6aTgsIERhdGFfSGkpOworCisgICAvLyBVc2UgbmV3IExvIHRvIG1ha2UgYW5vdGhlciBDQUxMVworICAgQ2FsbGVlID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OlBJQzE2Q29ubmVjdCwgZGwsIE1WVDo6aTgsIERhdGFfTG8sIFBDTEFUSCk7CisgICBDYWxsID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OkNBTExXLCBkbCwgVHlzLCBDaGFpbiwgQ2FsbGVlLCBPcGVyRmxhZyk7CisgICBDaGFpbiA9IGdldENoYWluKENhbGwpOworICAgT3BlckZsYWcgPSBnZXRPdXRGbGFnKENhbGwpOworICAgU2VxRW5kID0gREFHLmdldENBTExTRVFfRU5EKENoYWluLCBaZXJvT3BlcmFuZCwgWmVyb09wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlckZsYWcpOworICAgQ2hhaW4gPSBnZXRDaGFpbihTZXFFbmQpOworICAgT3BlckZsYWcgPSBnZXRPdXRGbGFnKFNlcUVuZCk7CisgICAvLyBIaSBwYXJ0IG9mIERhdGEgQWRkcmVzcworICAgRGF0YUFkZHJfSGkgPSBEQUcuZ2V0Tm9kZShQSUMxNklTRDo6TVRISSwgZGwsIE1WVDo6aTgsIENhbGwsIE9wZXJGbGFnKTsKK30KKworU0RWYWx1ZQorUElDMTZUYXJnZXRMb3dlcmluZzo6TG93ZXJDYWxsKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworICAgIC8vIFBJQzE2IHRhcmdldCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCB0YWlsIGNhbGwgb3B0aW1pemF0aW9uLgorICAgIGlzVGFpbENhbGwgPSBmYWxzZTsKKworICAgIGFzc2VydChDYWxsZWUuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMTYgJiYKKyAgICAgICAgICAgIkRvbid0IGtub3cgaG93IHRvIGxlZ2FsaXplIHRoaXMgY2FsbCBub2RlISEhIik7CisKKyAgICAvLyBUaGUgZmxhZyB0byB0cmFjayBpZiB0aGlzIGlzIGEgZGlyZWN0IG9yIGluZGlyZWN0IGNhbGwuCisgICAgYm9vbCBJc0RpcmVjdENhbGwgPSB0cnVlOyAgICAKKyAgICB1bnNpZ25lZCBSZXRWYWxzID0gSW5zLnNpemUoKTsKKyAgICB1bnNpZ25lZCBOdW1BcmdzID0gT3V0cy5zaXplKCk7CisKKyAgICBTRFZhbHVlIERhdGFBZGRyX0xvLCBEYXRhQWRkcl9IaTsgCisgICAgaWYgKCFpc2E8R2xvYmFsQWRkcmVzc1NETm9kZT4oQ2FsbGVlKSAmJgorICAgICAgICAhaXNhPEV4dGVybmFsU3ltYm9sU0ROb2RlPihDYWxsZWUpKSB7CisgICAgICAgSXNEaXJlY3RDYWxsID0gZmFsc2U7ICAgIC8vIFRoaXMgaXMgaW5kaXJlY3QgY2FsbAorCisgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBpbmRpcmVjdCBjYWxsIHRoZW4gdG8gcGFzcyB0aGUgYXJndW1lbnRzCisgICAgICAgLy8gYW5kIHJlYWQgdGhlIHJldHVybiB2YWx1ZSBiYWNrLCB3ZSBuZWVkIHRoZSBkYXRhIGFkZHJlc3MKKyAgICAgICAvLyBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLgorICAgICAgIC8vIFRvIGdldCB0aGUgZGF0YSBhZGRyZXNzIHR3byBtb3JlIGNhbGxzIG5lZWQgdG8gYmUgbWFkZS4KKworICAgICAgIC8vIENvbWUgaGVyZSBmb3IgaW5kaXJlY3QgY2FsbHMKKyAgICAgICBTRFZhbHVlIExvLCBIaTsKKyAgICAgICAvLyBJbmRpcmVjdCBhZGRyZXNzZXMuIEdldCB0aGUgaGkgYW5kIGxvIHBhcnRzIG9mIHB0ci4KKyAgICAgICBHZXRFeHBhbmRlZFBhcnRzKENhbGxlZSwgREFHLCBMbywgSGkpOworICAgICAgIC8vIENvbm5lY3QgTG8gYW5kIEhpIHBhcnRzIG9mIHRoZSBjYWxsZWUgd2l0aCB0aGUgUElDMTZDb25uZWN0CisgICAgICAgQ2FsbGVlID0gREFHLmdldE5vZGUoUElDMTZJU0Q6OlBJQzE2Q29ubmVjdCwgZGwsIE1WVDo6aTgsIExvLCBIaSk7CisKKyAgICAgICAvLyBSZWFkIERhdGFBZGRyZXNzIG9ubHkgaWYgd2UgaGF2ZSB0byBwYXNzIGFyZ3VtZW50cyBvciAKKyAgICAgICAvLyByZWFkIHJldHVybiB2YWx1ZS4gCisgICAgICAgaWYgKChSZXRWYWxzID4gMCkgfHwgKE51bUFyZ3MgPiAwKSkgCisgICAgICAgICBHZXREYXRhQWRkcmVzcyhkbCwgQ2FsbGVlLCBDaGFpbiwgRGF0YUFkZHJfTG8sIERhdGFBZGRyX0hpLCBEQUcpOworICAgIH0KKworICAgIFNEVmFsdWUgWmVyb09wZXJhbmQgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppOCk7CisKKyAgICAvLyBTdGFydCB0aGUgY2FsbCBzZXF1ZW5jZS4KKyAgICAvLyBDYXJyaW5nIHRoZSBDb25zdGFudCAwIGFsb25nIHRoZSBDQUxMU0VRU1RBUlQKKyAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBjYXJyeS4KKyAgICBTRFZhbHVlIFNlcVN0YXJ0ICA9IERBRy5nZXRDQUxMU0VRX1NUQVJUKENoYWluLCBaZXJvT3BlcmFuZCk7CisgICAgQ2hhaW4gPSBnZXRDaGFpbihTZXFTdGFydCk7CisgICAgU0RWYWx1ZSBPcGVyRmxhZyA9IGdldE91dEZsYWcoU2VxU3RhcnQpOyAvLyBUbyBtYW5hZ2UgdGhlIGRhdGEgZGVwZW5kZW5jeQorICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisKKyAgICAvLyBGb3IgYW55IGRpcmVjdCBjYWxsIC0gY2FsbGVlIHdpbGwgYmUgR2xvYmFsQWRkcmVzc05vZGUgb3IKKyAgICAvLyBFeHRlcm5hbFN5bWJvbAorICAgIFNEVmFsdWUgQXJnTGFiZWwsIFJldExhYmVsOworICAgIGlmIChJc0RpcmVjdENhbGwpIHsgCisgICAgICAgLy8gQ29uc2lkZXJpbmcgdGhlIEdsb2JhbEFkZHJlc3NOb2RlIGNhc2UgaGVyZS4KKyAgICAgICBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KENhbGxlZSkpIHsKKyAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBHLT5nZXRHbG9iYWwoKTsKKyAgICAgICAgICBDYWxsZWUgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgZGwsIE1WVDo6aTgpOworICAgICAgICAgIE5hbWUgPSBHLT5nZXRHbG9iYWwoKS0+Z2V0TmFtZSgpOworICAgICAgIH0gZWxzZSB7Ly8gQ29uc2lkZXJpbmcgdGhlIEV4dGVybmFsU3ltYm9sIGNhc2UgaGVyZQorICAgICAgICAgIEV4dGVybmFsU3ltYm9sU0ROb2RlICpFUyA9IGR5bl9jYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPihDYWxsZWUpOworICAgICAgICAgIENhbGxlZSA9IERBRy5nZXRUYXJnZXRFeHRlcm5hbFN5bWJvbChFUy0+Z2V0U3ltYm9sKCksIE1WVDo6aTgpOyAKKyAgICAgICAgICBOYW1lID0gRVMtPmdldFN5bWJvbCgpOworICAgICAgIH0KKworICAgICAgIC8vIExhYmVsIGZvciBhcmd1bWVudCBwYXNzaW5nCisgICAgICAgY29uc3QgY2hhciAqYXJnRnJhbWUgPSBFU05hbWVzOjpjcmVhdGVFU05hbWUoUEFOOjpnZXRBcmdzTGFiZWwoTmFtZSkpOworICAgICAgIEFyZ0xhYmVsID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKGFyZ0ZyYW1lLCBNVlQ6Omk4KTsKKworICAgICAgIC8vIExhYmVsIGZvciByZWFkaW5nIHJldHVybiB2YWx1ZQorICAgICAgIGNvbnN0IGNoYXIgKnJldE5hbWUgPSBFU05hbWVzOjpjcmVhdGVFU05hbWUoUEFOOjpnZXRSZXR2YWxMYWJlbChOYW1lKSk7CisgICAgICAgUmV0TGFiZWwgPSBEQUcuZ2V0VGFyZ2V0RXh0ZXJuYWxTeW1ib2wocmV0TmFtZSwgTVZUOjppOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAvLyBpZiBpbmRpcmVjdCBjYWxsCisgICAgICAgU0RWYWx1ZSBDb2RlQWRkcl9MbyA9IENhbGxlZS5nZXRPcGVyYW5kKDApOworICAgICAgIFNEVmFsdWUgQ29kZUFkZHJfSGkgPSBDYWxsZWUuZ2V0T3BlcmFuZCgxKTsKKworICAgICAgIC8qQ29kZUFkZHJfTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTgsIENvZGVBZGRyX0xvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDIsIE1WVDo6aTgpKTsqLworCisgICAgICAgLy8gbW92ZSBIaSBwYXJ0IGluIFBDTEFUSAorICAgICAgIENvZGVBZGRyX0hpID0gREFHLmdldE5vZGUoUElDMTZJU0Q6Ok1UUENMQVRILCBkbCwgTVZUOjppOCwgQ29kZUFkZHJfSGkpOworICAgICAgIENhbGxlZSA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpQSUMxNkNvbm5lY3QsIGRsLCBNVlQ6Omk4LCBDb2RlQWRkcl9MbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlQWRkcl9IaSk7CisgICAgfSAKKworICAgIC8vIFBhc3MgdGhlIGFyZ3VtZW50IHRvIGZ1bmN0aW9uIGJlZm9yZSBtYWtpbmcgdGhlIGNhbGwuCisgICAgU0RWYWx1ZSBDYWxsQXJnczsKKyAgICBpZiAoSXNEaXJlY3RDYWxsKSB7CisgICAgICBDYWxsQXJncyA9IExvd2VyRGlyZWN0Q2FsbEFyZ3VtZW50cyhBcmdMYWJlbCwgQ2hhaW4sIE9wZXJGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cywgT3V0VmFscywgZGwsIERBRyk7CisgICAgICBDaGFpbiA9IGdldENoYWluKENhbGxBcmdzKTsKKyAgICAgIE9wZXJGbGFnID0gZ2V0T3V0RmxhZyhDYWxsQXJncyk7CisgICAgfSBlbHNlIHsKKyAgICAgIENhbGxBcmdzID0gTG93ZXJJbmRpcmVjdENhbGxBcmd1bWVudHMoQ2hhaW4sIE9wZXJGbGFnLCBEYXRhQWRkcl9MbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUFkZHJfSGksIE91dHMsIE91dFZhbHMsIElucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIERBRyk7CisgICAgICBDaGFpbiA9IGdldENoYWluKENhbGxBcmdzKTsKKyAgICAgIE9wZXJGbGFnID0gZ2V0T3V0RmxhZyhDYWxsQXJncyk7CisgICAgfQorCisgICAgU0RWVExpc3QgVHlzID0gREFHLmdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICAgIFNEVmFsdWUgUElDQ2FsbCA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpDQUxMLCBkbCwgVHlzLCBDaGFpbiwgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJGbGFnKTsKKyAgICBDaGFpbiA9IGdldENoYWluKFBJQ0NhbGwpOworICAgIE9wZXJGbGFnID0gZ2V0T3V0RmxhZyhQSUNDYWxsKTsKKworCisgICAgLy8gQ2FycnlpbmcgdGhlIENvbnN0YW50IDAgYWxvbmcgdGhlIENBTExTRVFTVEFSVAorICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIGNhcnJ5LgorICAgIFNEVmFsdWUgU2VxRW5kID0gREFHLmdldENBTExTRVFfRU5EKENoYWluLCBaZXJvT3BlcmFuZCwgWmVyb09wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlckZsYWcpOworICAgIENoYWluID0gZ2V0Q2hhaW4oU2VxRW5kKTsKKyAgICBPcGVyRmxhZyA9IGdldE91dEZsYWcoU2VxRW5kKTsKKworICAgIC8vIExvd2VyIHRoZSByZXR1cm4gdmFsdWUgcmVhZGluZyBhZnRlciB0aGUgY2FsbC4KKyAgICBpZiAoSXNEaXJlY3RDYWxsKQorICAgICAgcmV0dXJuIExvd2VyRGlyZWN0Q2FsbFJldHVybihSZXRMYWJlbCwgQ2hhaW4sIE9wZXJGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnMsIGRsLCBEQUcsIEluVmFscyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIExvd2VySW5kaXJlY3RDYWxsUmV0dXJuKENoYWluLCBPcGVyRmxhZywgRGF0YUFkZHJfTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUFkZHJfSGksIElucywgZGwsIERBRywgSW5WYWxzKTsKK30KKworYm9vbCBQSUMxNlRhcmdldExvd2VyaW5nOjppc0RpcmVjdExvYWQoY29uc3QgU0RWYWx1ZSBPcCkgY29uc3QgeworICBpZiAoT3AuZ2V0T3Bjb2RlKCkgPT0gUElDMTZJU0Q6OlBJQzE2TG9hZCkKKyAgICBpZiAoT3AuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MKKyAgICAgfHwgT3AuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEV4dGVybmFsU3ltYm9sKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gTmVlZFRvQ29udmVydFRvTWVtT3AgLSBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUKKy8vIG9wZXJhdGlvbiAnT3AnIG5lZWRzIHRvIGJlIHB1dCBpbnRvIG1lbW9yeS4gQWxzbyByZXR1cm5zIHRoZQorLy8gb3BlcmFuZCBuby4gb2YgdGhlIG9wZXJhbmQgdG8gYmUgY29udmVydGVkIGluICdNZW1PcCcuIFJlbWVtYmVyLCBQSUMxNiBoYXMgCisvLyBubyBpbnN0cnVjdGlvbiB0aGF0IGNhbiBvcGVyYXRpb24gb24gdHdvIHJlZ2lzdGVycy4gTW9zdCBpbnNucyB0YWtlCisvLyBvbmUgcmVnaXN0ZXIgYW5kIG9uZSBtZW1vcnkgb3BlcmFuZCAoYWRkd2YpIC8gQ29uc3RhbnQgKGFkZGx3KS4KK2Jvb2wgUElDMTZUYXJnZXRMb3dlcmluZzo6TmVlZFRvQ29udmVydFRvTWVtT3AoU0RWYWx1ZSBPcCwgdW5zaWduZWQgJk1lbU9wLCAKKyAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvLyBJZiBvbmUgb2YgdGhlIG9wZXJhbmQgaXMgYSBjb25zdGFudCwgcmV0dXJuIGZhbHNlLgorICBpZiAoT3AuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50IHx8CisgICAgICBPcC5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpCisgICAgcmV0dXJuIGZhbHNlOyAgICAKKworICAvLyBSZXR1cm4gZmFsc2UgaWYgb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBhbHJlYWR5IGEgZGlyZWN0CisgIC8vIGxvYWQgYW5kIHRoYXQgb3BlcmFuZCBoYXMgb25seSBvbmUgdXNlLgorICBpZiAoaXNEaXJlY3RMb2FkKE9wLmdldE9wZXJhbmQoMCkpKSB7CisgICAgaWYgKE9wLmdldE9wZXJhbmQoMCkuaGFzT25lVXNlKCkpIHsgIAorICAgICAgLy8gTGVnYWwgYW5kIHByb2ZpdGFibGUgZm9sZGluZyBjaGVjayB1c2VzIHRoZSBOb2RlSWQgb2YgREFHIG5vZGVzLgorICAgICAgLy8gVGhpcyBOb2RlSWQgaXMgYXNzaWduZWQgYnkgdG9wb2xvZ2ljYWwgb3JkZXIuIFRoZXJlZm9yZSBmaXJzdCAKKyAgICAgIC8vIGFzc2lnbiB0b3BvbG9naWNhbCBvcmRlciB0aGVuIHBlcmZvcm0gbGVnYWwgYW5kIHByb2ZpdGFibGUgY2hlY2suCisgICAgICAvLyBOb3RlOi0gVGhvdWdoIHRoaXMgb3JkZXJpbmcgaXMgZG9uZSBiZWZvcmUgYmVnaW5pbmcgd2l0aCBsZWdhbGl6YXRpb24sCisgICAgICAvLyBuZXdseSBhZGRlZCBub2RlIGR1cmluZyBsZWdhbGl6YXRpb24gcHJvY2VzcyBoYXZlIE5vZGVJZD0tMSAoTmV3Tm9kZSkKKyAgICAgIC8vIHRoZXJlZm9yZSBiZWZvcmUgcGVyZm9ybWluZyBhbnkgY2hlY2sgcHJvcGVyIG9yZGVyaW5nIG9mIHRoZSBub2RlIGlzCisgICAgICAvLyByZXF1aXJlZC4KKyAgICAgIERBRy5Bc3NpZ25Ub3BvbG9naWNhbE9yZGVyKCk7CisKKyAgICAgIC8vIERpcmVjdCBsb2FkIG9wZXJhbmRzIGFyZSBmb2xkZWQgaW4gYmluYXJ5IG9wZXJhdGlvbnMuIEJ1dCBiZWZvcmUgZm9sZGluZworICAgICAgLy8gdmVyaWZ5IGlmIHRoaXMgZm9sZGluZyBpcyBsZWdhbC4gRm9sZCBvbmx5IGlmIGl0IGlzIGxlZ2FsIG90aGVyd2lzZQorICAgICAgLy8gY29udmVydCB0aGlzIGRpcmVjdCBsb2FkIHRvIGEgc2VwYXJhdGUgbWVtb3J5IG9wZXJhdGlvbi4KKyAgICAgIGlmIChTZWxlY3Rpb25EQUdJU2VsOjpJc0xlZ2FsVG9Gb2xkKE9wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXROb2RlKCksIE9wLmdldE5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkRlZmF1bHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBlbHNlIAorICAgICAgICBNZW1PcCA9IDA7CisgICAgfQorICB9CisKKyAgLy8gRm9yIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm9uLWN1bW11dGF0aXZlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgCisgIC8vIGZvciByaWdodCBvcGVyYW5kIGJlY2F1c2UgZm9sZGluZyByaWdodCBvcGVyYW5kIG1heSByZXN1bHQgaW4gCisgIC8vIGluY29ycmVjdCBvcGVyYXRpb24uIAorICBpZiAoISBTZWxlY3Rpb25EQUc6OmlzQ29tbXV0YXRpdmVCaW5PcChPcC5nZXRPcGNvZGUoKSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGlzRGlyZWN0TG9hZChPcC5nZXRPcGVyYW5kKDEpKSkgeworICAgIGlmIChPcC5nZXRPcGVyYW5kKDEpLmhhc09uZVVzZSgpKSB7CisgICAgICAvLyBMZWdhbCBhbmQgcHJvZml0YWJsZSBmb2xkaW5nIGNoZWNrIHVzZXMgdGhlIE5vZGVJZCBvZiBEQUcgbm9kZXMuCisgICAgICAvLyBUaGlzIE5vZGVJZCBpcyBhc3NpZ25lZCBieSB0b3BvbG9naWNhbCBvcmRlci4gVGhlcmVmb3JlIGZpcnN0IAorICAgICAgLy8gYXNzaWduIHRvcG9sb2dpY2FsIG9yZGVyIHRoZW4gcGVyZm9ybSBsZWdhbCBhbmQgcHJvZml0YWJsZSBjaGVjay4KKyAgICAgIC8vIE5vdGU6LSBUaG91Z2ggdGhpcyBvcmRlcmluZyBpcyBkb25lIGJlZm9yZSBiZWdpbmluZyB3aXRoIGxlZ2FsaXphdGlvbiwKKyAgICAgIC8vIG5ld2x5IGFkZGVkIG5vZGUgZHVyaW5nIGxlZ2FsaXphdGlvbiBwcm9jZXNzIGhhdmUgTm9kZUlkPS0xIChOZXdOb2RlKQorICAgICAgLy8gdGhlcmVmb3JlIGJlZm9yZSBwZXJmb3JtaW5nIGFueSBjaGVjayBwcm9wZXIgb3JkZXJpbmcgb2YgdGhlIG5vZGUgaXMKKyAgICAgIC8vIHJlcXVpcmVkLgorICAgICAgREFHLkFzc2lnblRvcG9sb2dpY2FsT3JkZXIoKTsKKworICAgICAgLy8gRGlyZWN0IGxvYWQgb3BlcmFuZHMgYXJlIGZvbGRlZCBpbiBiaW5hcnkgb3BlcmF0aW9ucy4gQnV0IGJlZm9yZSBmb2xkaW5nCisgICAgICAvLyB2ZXJpZnkgaWYgdGhpcyBmb2xkaW5nIGlzIGxlZ2FsLiBGb2xkIG9ubHkgaWYgaXQgaXMgbGVnYWwgb3RoZXJ3aXNlCisgICAgICAvLyBjb252ZXJ0IHRoaXMgZGlyZWN0IGxvYWQgdG8gYSBzZXBhcmF0ZSBtZW1vcnkgb3BlcmF0aW9uLgorICAgICAgaWYgKFNlbGVjdGlvbkRBR0lTZWw6OklzTGVnYWxUb0ZvbGQoT3AuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE5vZGUoKSwgT3AuZ2V0Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6RGVmYXVsdCkpCisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBlbHNlIAorICAgICAgICAgTWVtT3AgPSAxOyAKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9ICAKKworLy8gTG93ZXJCaW5PcCAtIExvd2VyIGEgY29tbXV0YXRpdmUgYmluYXJ5IG9wZXJhdGlvbiB0aGF0IGRvZXMgbm90CisvLyBhZmZlY3Qgc3RhdHVzIGZsYWcgY2FycnkuCitTRFZhbHVlIFBJQzE2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyQmluT3AoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIC8vIFdlIHNob3VsZCBoYXZlIGhhbmRsZWQgbGFyZ2VyIG9wZXJhbmRzIGluIHR5cGUgbGVnYWxpemVyIGl0c2VsZi4KKyAgYXNzZXJ0IChPcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6Omk4ICYmICJpbGxlZ2FsIE9wIHRvIGxvd2VyIik7CisKKyAgdW5zaWduZWQgTWVtT3AgPSAxOworICBpZiAoTmVlZFRvQ29udmVydFRvTWVtT3AoT3AsIE1lbU9wLCBEQUcpKSB7CisgICAgLy8gUHV0IG9uZSB2YWx1ZSBvbiBzdGFjay4KKyAgICBTRFZhbHVlIE5ld1ZhbCA9IENvbnZlcnRUb01lbU9wZXJhbmQgKE9wLmdldE9wZXJhbmQoTWVtT3ApLCBEQUcsIGRsKTsKKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShPcC5nZXRPcGNvZGUoKSwgZGwsIE1WVDo6aTgsIE9wLmdldE9wZXJhbmQoTWVtT3AgXiAxKSwKKyAgICBOZXdWYWwpOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBPcDsKKyAgfQorfQorCisvLyBMb3dlckFERCAtIExvd2VyIGFsbCB0eXBlcyBvZiBBREQgb3BlcmF0aW9ucyBpbmNsdWRpbmcgdGhlIG9uZXMKKy8vIHRoYXQgYWZmZWN0cyBjYXJyeS4KK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6TG93ZXJBREQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgLy8gV2Ugc2hvdWxkIGhhdmUgaGFuZGxlZCBsYXJnZXIgb3BlcmFuZHMgaW4gdHlwZSBsZWdhbGl6ZXIgaXRzZWxmLgorICBhc3NlcnQgKE9wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTggJiYgImlsbGVnYWwgYWRkIHRvIGxvd2VyIik7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgTWVtT3AgPSAxOworICBpZiAoTmVlZFRvQ29udmVydFRvTWVtT3AoT3AsIE1lbU9wLCBEQUcpKSB7CisgICAgLy8gUHV0IG9uZSB2YWx1ZSBvbiBzdGFjay4KKyAgICBTRFZhbHVlIE5ld1ZhbCA9IENvbnZlcnRUb01lbU9wZXJhbmQgKE9wLmdldE9wZXJhbmQoTWVtT3ApLCBEQUcsIGRsKTsKKyAgICAKKyAgICAvLyBBRERDIGFuZCBBRERFIHByb2R1Y2UgdHdvIHJlc3VsdHMuCisgICAgU0RWVExpc3QgVHlzID0gREFHLmdldFZUTGlzdChNVlQ6Omk4LCBNVlQ6OkZsYWcpOworCisgICAgLy8gQURERSBoYXMgdGhyZWUgb3BlcmFuZHMsIHRoZSBsYXN0IG9uZSBpcyB0aGUgY2FycnkgYml0LgorICAgIGlmIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFEREUpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoT3AuZ2V0T3Bjb2RlKCksIGRsLCBUeXMsIE9wLmdldE9wZXJhbmQoTWVtT3AgXiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOZXdWYWwsIE9wLmdldE9wZXJhbmQoMikpOworICAgIC8vIEFEREMgaGFzIHR3byBvcGVyYW5kcy4KKyAgICBlbHNlIGlmIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFEREMpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoT3AuZ2V0T3Bjb2RlKCksIGRsLCBUeXMsIE9wLmdldE9wZXJhbmQoTWVtT3AgXiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOZXdWYWwpOworICAgIC8vIEFERCBpdCBpcy4gSXQgcHJvZHVjZXMgb25seSBvbmUgcmVzdWx0LgorICAgIGVsc2UKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShPcC5nZXRPcGNvZGUoKSwgZGwsIE1WVDo6aTgsIE9wLmdldE9wZXJhbmQoTWVtT3AgXiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOZXdWYWwpOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gT3A7Cit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6TG93ZXJTVUIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICAvLyBXZSBzaG91bGQgaGF2ZSBoYW5kbGVkIGxhcmdlciBvcGVyYW5kcyBpbiB0eXBlIGxlZ2FsaXplciBpdHNlbGYuCisgIGFzc2VydCAoT3AuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppOCAmJiAiaWxsZWdhbCBzdWIgdG8gbG93ZXIiKTsKKyAgdW5zaWduZWQgTWVtT3AgPSAxOworICBTRFZUTGlzdCBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6aTgsIE1WVDo6RmxhZyk7CisKKyAgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbiBpbnN0cnVjdGlvbiBmb3IgWCAtIGMgLCAKKyAgLy8gd2UgY2FuIGNoYW5nZSBpdCB0byBYICsgKC1jKQorICBDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKTsKKyAgaWYgKEMgJiYgKE9wLmdldE9wY29kZSgpID09IElTRDo6U1VCKSkKKyAgICB7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBREQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBNVlQ6Omk4LCBPcC5nZXRPcGVyYW5kKDApLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMC0oQy0+Z2V0WkV4dFZhbHVlKCkpLCBNVlQ6Omk4KSk7CisgICAgfQorCisgIGlmIChOZWVkVG9Db252ZXJ0VG9NZW1PcChPcCwgTWVtT3AsIERBRykgfHwKKyAgICAgIChpc0RpcmVjdExvYWQoT3AuZ2V0T3BlcmFuZCgxKSkgJiYgCisgICAgICAgKCFpc0RpcmVjdExvYWQoT3AuZ2V0T3BlcmFuZCgwKSkpICYmCisgICAgICAgKE9wLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpDb25zdGFudCkpKQorICAgIHsKKyAgICAgIC8vIFB1dCBmaXJzdCBvcGVyYW5kIG9uIHN0YWNrLgorICAgICAgU0RWYWx1ZSBOZXdWYWwgPSBDb252ZXJ0VG9NZW1PcGVyYW5kIChPcC5nZXRPcGVyYW5kKDApLCBEQUcsIGRsKTsKKyAgICAgIAorICAgICAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0ICgwICYmICJPcGNvZGUgdW5rbm93bi4iKTsgCisgICAgICBjYXNlIElTRDo6U1VCRToKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKE9wLmdldE9wY29kZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBUeXMsIE5ld1ZhbCwgT3AuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTVUJDOgorICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoT3AuZ2V0T3Bjb2RlKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIFR5cywgTmV3VmFsLCBPcC5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElTRDo6U1VCOgorICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoT3AuZ2V0T3Bjb2RlKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIE1WVDo6aTgsIE5ld1ZhbCwgT3AuZ2V0T3BlcmFuZCgxKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgZWxzZSAKKyAgICByZXR1cm4gT3A7Cit9CisKK3ZvaWQgUElDMTZUYXJnZXRMb3dlcmluZzo6SW5pdFJlc2VydmVkRnJhbWVDb3VudChjb25zdCBGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8gKkZ1bmNJbmZvID0gTUYuZ2V0SW5mbzxQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisKKyAgdW5zaWduZWQgTnVtQXJncyA9IEYtPmFyZ19zaXplKCk7CisKKyAgYm9vbCBpc1ZvaWRGdW5jID0gKEYtPmdldFJldHVyblR5cGUoKS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6Vm9pZFR5SUQpOworCisgIGlmIChpc1ZvaWRGdW5jKQorICAgIEZ1bmNJbmZvLT5zZXRSZXNlcnZlZEZyYW1lQ291bnQoTnVtQXJncyk7CisgIGVsc2UKKyAgICBGdW5jSW5mby0+c2V0UmVzZXJ2ZWRGcmFtZUNvdW50KE51bUFyZ3MgKyAxKTsKK30KKworLy8gTG93ZXJGb3JtYWxBcmd1bWVudHMgLSBBcmd1bWVudCB2YWx1ZXMgYXJlIGxvYWRlZCBmcm9tIHRoZQorLy8gPGZuYW1lPi5hcmdzICsgb2Zmc2V0LiBBbGwgYXJndW1lbnRzIGFyZSBhbHJlYWR5IGJyb2tlbiB0byBsZWFnbGl6ZWQKKy8vIHR5cGVzLCBzbyB0aGUgb2Zmc2V0IGp1c3QgcnVucyBmcm9tIDAgdG8gTnVtQXJnVmFscyAtIDEuCisKK1NEVmFsdWUKK1BJQzE2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyRm9ybWFsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeworICB1bnNpZ25lZCBOdW1BcmdWYWxzID0gSW5zLnNpemUoKTsKKworICAvLyBHZXQgdGhlIGNhbGxlZSdzIG5hbWUgdG8gY3JlYXRlIHRoZSA8Zm5hbWU+LmFyZ3MgbGFiZWwgdG8gcGFzcyBhcmdzLgorICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBjb25zdCBGdW5jdGlvbiAqRiA9IE1GLmdldEZ1bmN0aW9uKCk7CisgIHN0ZDo6c3RyaW5nIEZ1bmNOYW1lID0gRi0+Z2V0TmFtZSgpOworCisgIC8vIFJlc2V0IHRoZSBtYXAgb2YgRkkgYW5kIFRtcE9mZnNldCAKKyAgUmVzZXRUbXBPZmZzZXRNYXAoREFHKTsKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgUmVzZXJ2ZUZyYW1lQ291bnQKKyAgSW5pdFJlc2VydmVkRnJhbWVDb3VudChGLCBEQUcpOworCisgIC8vIENyZWF0ZSB0aGUgPGZuYW1lPi5hcmdzIGV4dGVybmFsIHN5bWJvbC4KKyAgY29uc3QgY2hhciAqdG1wTmFtZSA9IEVTTmFtZXM6OmNyZWF0ZUVTTmFtZShQQU46OmdldEFyZ3NMYWJlbChGdW5jTmFtZSkpOworICBTRFZhbHVlIEVTID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKHRtcE5hbWUsIE1WVDo6aTgpOworCisgIC8vIExvYWQgYXJnIHZhbHVlcyBmcm9tIHRoZSBsYWJlbCArIG9mZnNldC4KKyAgU0RWVExpc3QgVlRzICA9IERBRy5nZXRWVExpc3QgKE1WVDo6aTgsIE1WVDo6T3RoZXIpOworICBTRFZhbHVlIEJTID0gREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTgpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQXJnVmFscyA7ICsraSkgeworICAgIFNEVmFsdWUgT2Zmc2V0ID0gREFHLmdldENvbnN0YW50KGksIE1WVDo6aTgpOworICAgIFNEVmFsdWUgUElDTG9hZCA9IERBRy5nZXROb2RlKFBJQzE2SVNEOjpQSUMxNkxkQXJnLCBkbCwgVlRzLCBDaGFpbiwgRVMsIEJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCk7CisgICAgQ2hhaW4gPSBnZXRDaGFpbihQSUNMb2FkKTsKKyAgICBJblZhbHMucHVzaF9iYWNrKFBJQ0xvYWQpOworICB9CisKKyAgcmV0dXJuIENoYWluOworfQorCisvLyBQZXJmb3JtIERBR0NvbWJpbmUgb2YgUElDMTZMb2FkLgorLy8gRklYTUUgLSBOZWVkIGEgbW9yZSBlbGFib3JhdGUgY29tbWVudCBoZXJlLgorU0RWYWx1ZSBQSUMxNlRhcmdldExvd2VyaW5nOjoKK1BlcmZvcm1QSUMxNkxvYWRDb21iaW5lKFNETm9kZSAqTiwgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0IHsKKyAgU2VsZWN0aW9uREFHICZEQUcgPSBEQ0kuREFHOworICBTRFZhbHVlIENoYWluID0gTi0+Z2V0T3BlcmFuZCgwKTsgCisgIGlmIChOLT5oYXNOVXNlc09mVmFsdWUoMCwgMCkpIHsKKyAgICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlKE4sMSksIENoYWluKTsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLyBGb3IgYWxsIHRoZSBmdW5jdGlvbnMgd2l0aCBhcmd1bWVudHMgc29tZSBTVE9SRSBub2RlcyBhcmUgZ2VuZXJhdGVkIAorLy8gdGhhdCBzdG9yZSB0aGUgYXJndW1lbnQgb24gdGhlIGZyYW1laW5kZXguIEhvd2V2ZXIgaW4gUElDMTYgdGhlIGFyZ3VtZW50cworLy8gYXJlIHBhc3NlZCBvbiBzdGFjayBvbmx5LiBUaGVyZWZvcmUgdGhlc2UgU1RPUkUgbm9kZXMgYXJlIHJlZHVuZGFudC4gCisvLyBUbyByZW1vdmUgdGhlc2UgU1RPUkUgbm9kZXMgd2lsbCBiZSByZW1vdmVkIGluIFBlcmZvcm1TdG9yZUNvbWJpbmUgCisvLworLy8gQ3VycmVudGx5IHRoaXMgZnVuY3Rpb24gaXMgZG9pbnQgbm90aGluZyBhbmQgd2lsbCBiZSB1cGRhdGVkIGZvciByZW1vdmluZworLy8gdW53YW50ZWQgc3RvcmUgb3BlcmF0aW9ucworU0RWYWx1ZSBQSUMxNlRhcmdldExvd2VyaW5nOjoKK1BlcmZvcm1TdG9yZUNvbWJpbmUoU0ROb2RlICpOLCBEQUdDb21iaW5lckluZm8gJkRDSSkgY29uc3QgeworICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKKyAgLyoKKyAgLy8gU3RvcmluZyBhbiB1bmRlZiB2YWx1ZSBpcyBvZiBubyB1c2UsIHNvIHJlbW92ZSBpdAorICBpZiAoaXNTdG9yaW5nVW5kZWYoTiwgQ2hhaW4sIERBRykpIHsKKyAgICByZXR1cm4gQ2hhaW47IC8vIHJlbW92ZSB0aGUgc3RvcmUgYW5kIHJldHVybiB0aGUgY2hhaW4KKyAgfQorICAvL2Vsc2UgZXZlcnl0aGluZyBpcyBvay4KKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7CisgICovCit9CisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6UGVyZm9ybURBR0NvbWJpbmUoU0ROb2RlICpOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0IHsKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBjYXNlIElTRDo6U1RPUkU6ICAgCisgICByZXR1cm4gUGVyZm9ybVN0b3JlQ29tYmluZShOLCBEQ0kpOyAKKyAgY2FzZSBQSUMxNklTRDo6UElDMTZMb2FkOiAgIAorICAgIHJldHVybiBQZXJmb3JtUElDMTZMb2FkQ29tYmluZShOLCBEQ0kpOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK3N0YXRpYyBQSUMxNkNDOjpDb25kQ29kZXMgSW50Q0NUb1BJQzE2Q0MoSVNEOjpDb25kQ29kZSBDQykgeworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29uZGl0aW9uIGNvZGUhIik7CisgIGNhc2UgSVNEOjpTRVRORTogIHJldHVybiBQSUMxNkNDOjpORTsKKyAgY2FzZSBJU0Q6OlNFVEVROiAgcmV0dXJuIFBJQzE2Q0M6OkVROworICBjYXNlIElTRDo6U0VUR1Q6ICByZXR1cm4gUElDMTZDQzo6R1Q7CisgIGNhc2UgSVNEOjpTRVRHRTogIHJldHVybiBQSUMxNkNDOjpHRTsKKyAgY2FzZSBJU0Q6OlNFVExUOiAgcmV0dXJuIFBJQzE2Q0M6OkxUOworICBjYXNlIElTRDo6U0VUTEU6ICByZXR1cm4gUElDMTZDQzo6TEU7CisgIGNhc2UgSVNEOjpTRVRVTFQ6IHJldHVybiBQSUMxNkNDOjpVTFQ7CisgIGNhc2UgSVNEOjpTRVRVTEU6IHJldHVybiBQSUMxNkNDOjpVTEU7CisgIGNhc2UgSVNEOjpTRVRVR0U6IHJldHVybiBQSUMxNkNDOjpVR0U7CisgIGNhc2UgSVNEOjpTRVRVR1Q6IHJldHVybiBQSUMxNkNDOjpVR1Q7CisgIH0KK30KKworLy8gTG9vayBhdCBMSFMvUkhTL0NDIGFuZCBzZWUgaWYgdGhleSBhcmUgYSBsb3dlcmVkIHNldGNjIGluc3RydWN0aW9uLiAgSWYgc28KKy8vIHNldCBMSFMvUkhTIGFuZCBTUENDIHRvIHRoZSBMSFMvUkhTIG9mIHRoZSBzZXRjYyBhbmQgU1BDQyB0byB0aGUgY29uZGl0aW9uLgorc3RhdGljIHZvaWQgTG9va1Rocm91Z2hTZXRDQyhTRFZhbHVlICZMSFMsIFNEVmFsdWUgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpDb25kQ29kZSBDQywgdW5zaWduZWQgJlNQQ0MpIHsKKyAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oUkhTKSAmJgorICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oUkhTKS0+aXNOdWxsVmFsdWUoKSAmJgorICAgICAgQ0MgPT0gSVNEOjpTRVRORSAmJgorICAgICAgKExIUy5nZXRPcGNvZGUoKSA9PSBQSUMxNklTRDo6U0VMRUNUX0lDQyAmJgorICAgICAgICBMSFMuZ2V0T3BlcmFuZCgzKS5nZXRPcGNvZGUoKSA9PSBQSUMxNklTRDo6U1VCQ0MpICYmCisgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KExIUy5nZXRPcGVyYW5kKDApKSAmJgorICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihMSFMuZ2V0T3BlcmFuZCgxKSkgJiYKKyAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KExIUy5nZXRPcGVyYW5kKDApKS0+aXNPbmUoKSAmJgorICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTEhTLmdldE9wZXJhbmQoMSkpLT5pc051bGxWYWx1ZSgpKSB7CisgICAgU0RWYWx1ZSBDTVBDQyA9IExIUy5nZXRPcGVyYW5kKDMpOworICAgIFNQQ0MgPSBjYXN0PENvbnN0YW50U0ROb2RlPihMSFMuZ2V0T3BlcmFuZCgyKSktPmdldFpFeHRWYWx1ZSgpOworICAgIExIUyA9IENNUENDLmdldE9wZXJhbmQoMCk7CisgICAgUkhTID0gQ01QQ0MuZ2V0T3BlcmFuZCgxKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIGFwcHJvcHJpYXRlIENNUCBpbnNuIGFuZCBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbiBjb2RlIGluIFBJQzE2Q0MKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6Z2V0UElDMTZDbXAoU0RWYWx1ZSBMSFMsIFNEVmFsdWUgUkhTLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ0MsIFNEVmFsdWUgJlBJQzE2Q0MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwpIGNvbnN0IHsKKyAgUElDMTZDQzo6Q29uZENvZGVzIENvbmRDb2RlID0gKFBJQzE2Q0M6OkNvbmRDb2RlcykgQ0M7CisKKyAgLy8gUElDMTYgc3ViIGlzIGxpdGVyYWwgLSBXLiBTbyBTd2FwIHRoZSBvcGVyYW5kcyBhbmQgY29uZGl0aW9uIGlmIG5lZWRlZC4KKyAgLy8gaS5lLiBhIDwgMTIgY2FuIGJlIHJld3JpdHRlbiBhcyAxMiA+IGEuCisgIGlmIChSSFMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCkgeworCisgICAgU0RWYWx1ZSBUbXAgPSBMSFM7CisgICAgTEhTID0gUkhTOworICAgIFJIUyA9IFRtcDsKKworICAgIHN3aXRjaCAoQ29uZENvZGUpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIFBJQzE2Q0M6OkxUOgorICAgICAgQ29uZENvZGUgPSBQSUMxNkNDOjpHVDsgCisgICAgICBicmVhazsKKyAgICBjYXNlIFBJQzE2Q0M6OkdUOgorICAgICAgQ29uZENvZGUgPSBQSUMxNkNDOjpMVDsgCisgICAgICBicmVhazsKKyAgICBjYXNlIFBJQzE2Q0M6OlVMVDoKKyAgICAgIENvbmRDb2RlID0gUElDMTZDQzo6VUdUOyAKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUElDMTZDQzo6VUdUOgorICAgICAgQ29uZENvZGUgPSBQSUMxNkNDOjpVTFQ7IAorICAgICAgYnJlYWs7CisgICAgY2FzZSBQSUMxNkNDOjpHRToKKyAgICAgIENvbmRDb2RlID0gUElDMTZDQzo6TEU7IAorICAgICAgYnJlYWs7CisgICAgY2FzZSBQSUMxNkNDOjpMRToKKyAgICAgIENvbmRDb2RlID0gUElDMTZDQzo6R0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBJQzE2Q0M6OlVMRToKKyAgICAgIENvbmRDb2RlID0gUElDMTZDQzo6VUdFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQSUMxNkNDOjpVR0U6CisgICAgICBDb25kQ29kZSA9IFBJQzE2Q0M6OlVMRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIFBJQzE2Q0MgPSBEQUcuZ2V0Q29uc3RhbnQoQ29uZENvZGUsIE1WVDo6aTgpOworCisgIC8vIFRoZXNlIGFyZSBzaWduZWQgY29tcGFyaXNvbnMuIAorICBTRFZhbHVlIE1hc2sgPSBEQUcuZ2V0Q29uc3RhbnQoMTI4LCBNVlQ6Omk4KTsKKyAgaWYgKGlzU2lnbmVkQ29tcGFyaXNvbihDb25kQ29kZSkpIHsKKyAgICBMSFMgPSBEQUcuZ2V0Tm9kZSAoSVNEOjpYT1IsIGRsLCBNVlQ6Omk4LCBMSFMsIE1hc2spOworICAgIFJIUyA9IERBRy5nZXROb2RlIChJU0Q6OlhPUiwgZGwsIE1WVDo6aTgsIFJIUywgTWFzayk7IAorICB9CisKKyAgU0RWVExpc3QgVlRzID0gREFHLmdldFZUTGlzdCAoTVZUOjppOCwgTVZUOjpGbGFnKTsKKyAgLy8gV2UgY2FuIHVzZSBhIHN1YnRyYWN0IG9wZXJhdGlvbiB0byBzZXQgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gQnV0CisgIC8vIHdlIG5lZWQgdG8gcHV0IG9uZSBvcGVyYW5kIGluIG1lbW9yeSBpZiByZXF1aXJlZC4KKyAgLy8gTm90aGluZyB0byBkbyBpZiB0aGUgZmlyc3Qgb3BlcmFuZCBpcyBhbHJlYWR5IGEgdmFsaWQgdHlwZSAoZGlyZWN0IGxvYWQgCisgIC8vIGZvciBzdWJ3ZiBhbmQgbGl0ZXJhbCBmb3Igc3VibHcpIGFuZCBpdCBpcyB1c2VkIGJ5IHRoaXMgb3BlcmF0aW9uIG9ubHkuIAorICBpZiAoKExIUy5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50IHx8IGlzRGlyZWN0TG9hZChMSFMpKSAKKyAgICAgICYmIExIUy5oYXNPbmVVc2UoKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoUElDMTZJU0Q6OlNVQkNDLCBkbCwgVlRzLCBMSFMsIFJIUyk7CisKKyAgLy8gZWxzZSBjb252ZXJ0IHRoZSBmaXJzdCBvcGVyYW5kIHRvIG1lbS4KKyAgTEhTID0gQ29udmVydFRvTWVtT3BlcmFuZCAoTEhTLCBEQUcsIGRsKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKFBJQzE2SVNEOjpTVUJDQywgZGwsIFZUcywgTEhTLCBSSFMpOworfQorCisKK1NEVmFsdWUgUElDMTZUYXJnZXRMb3dlcmluZzo6TG93ZXJTRUxFQ1RfQ0MoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBMSFMgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFJIUyA9IE9wLmdldE9wZXJhbmQoMSk7CisgIElTRDo6Q29uZENvZGUgQ0MgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihPcC5nZXRPcGVyYW5kKDQpKS0+Z2V0KCk7CisgIFNEVmFsdWUgVHJ1ZVZhbCA9IE9wLmdldE9wZXJhbmQoMik7CisgIFNEVmFsdWUgRmFsc2VWYWwgPSBPcC5nZXRPcGVyYW5kKDMpOworICB1bnNpZ25lZCBPUklHQ0MgPSB+MDsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIC8vIElmIHRoaXMgaXMgYSBzZWxlY3RfY2Mgb2YgYSAic2V0Y2MiLCBhbmQgaWYgdGhlIHNldGNjIGdvdCBsb3dlcmVkIGludG8KKyAgLy8gYW4gQ01QW0lGXUNDL1NFTEVDVF9bSUZdQ0MgcGFpciwgZmluZCB0aGUgb3JpZ2luYWwgY29tcGFyZWQgdmFsdWVzLgorICAvLyBpLmUuCisgIC8vIEEgc2V0Y2M6IGxocywgcmhzLCBjYyBpcyBleHBhbmRlZCBieSBsbHZtIHRvIAorICAvLyBzZWxlY3RfY2M6IHJlc3VsdCBvZiBzZXRjYywgMCwgMSwgMCwgc2V0bmUKKyAgLy8gV2UgY2FuIHRoaW5rIG9mIGl0IGFzOgorICAvLyBzZWxlY3RfY2M6IGxocywgcmhzLCAxLCAwLCBjYworICBMb29rVGhyb3VnaFNldENDKExIUywgUkhTLCBDQywgT1JJR0NDKTsKKyAgaWYgKE9SSUdDQyA9PSB+MFUpIE9SSUdDQyA9IEludENDVG9QSUMxNkNDIChDQyk7CisKKyAgU0RWYWx1ZSBQSUMxNkNDOworICBTRFZhbHVlIENtcCA9IGdldFBJQzE2Q21wKExIUywgUkhTLCBPUklHQ0MsIFBJQzE2Q0MsIERBRywgZGwpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZSAoUElDMTZJU0Q6OlNFTEVDVF9JQ0MsIGRsLCBUcnVlVmFsLmdldFZhbHVlVHlwZSgpLCBUcnVlVmFsLAorICAgICAgICAgICAgICAgICAgICAgIEZhbHNlVmFsLCBQSUMxNkNDLCBDbXAuZ2V0VmFsdWUoMSkpOyAKK30KKworTWFjaGluZUJhc2ljQmxvY2sgKgorUElDMTZUYXJnZXRMb3dlcmluZzo6RW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJID0gKmdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKyAgdW5zaWduZWQgQ0MgPSAoUElDMTZDQzo6Q29uZENvZGVzKU1JLT5nZXRPcGVyYW5kKDMpLmdldEltbSgpOworICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIFRvICJpbnNlcnQiIGEgU0VMRUNUX0NDIGluc3RydWN0aW9uLCB3ZSBhY3R1YWxseSBoYXZlIHRvIGluc2VydCB0aGUgZGlhbW9uZAorICAvLyBjb250cm9sLWZsb3cgcGF0dGVybi4gIFRoZSBpbmNvbWluZyBpbnN0cnVjdGlvbiBrbm93cyB0aGUgZGVzdGluYXRpb24gdnJlZworICAvLyB0byBzZXQsIHRoZSBjb25kaXRpb24gY29kZSByZWdpc3RlciB0byBicmFuY2ggb24sIHRoZSB0cnVlL2ZhbHNlIHZhbHVlcyB0bworICAvLyBzZWxlY3QgYmV0d2VlbiwgYW5kIGEgYnJhbmNoIG9wY29kZSB0byB1c2UuCisgIGNvbnN0IEJhc2ljQmxvY2sgKkxMVk1fQkIgPSBCQi0+Z2V0QmFzaWNCbG9jaygpOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEl0ID0gQkI7CisgICsrSXQ7CisKKyAgLy8gIHRoaXNNQkI6CisgIC8vICAuLi4KKyAgLy8gICBUcnVlVmFsID0gLi4uCisgIC8vICAgW2ZdYkNDIGNvcHkxTUJCCisgIC8vICAgZmFsbHRocm91Z2ggLS0+IGNvcHkwTUJCCisgIE1hY2hpbmVCYXNpY0Jsb2NrICp0aGlzTUJCID0gQkI7CisgIE1hY2hpbmVGdW5jdGlvbiAqRiA9IEJCLT5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmNvcHkwTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpzaW5rTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIEJ1aWxkTUkoQkIsIGRsLCBUSUkuZ2V0KFBJQzE2OjpwaWMxNmJyY29uZCkpLmFkZE1CQihzaW5rTUJCKS5hZGRJbW0oQ0MpOworICBGLT5pbnNlcnQoSXQsIGNvcHkwTUJCKTsKKyAgRi0+aW5zZXJ0KEl0LCBzaW5rTUJCKTsKKworICAvLyBUcmFuc2ZlciB0aGUgcmVtYWluZGVyIG9mIEJCIGFuZCBpdHMgc3VjY2Vzc29yIGVkZ2VzIHRvIHNpbmtNQkIuCisgIHNpbmtNQkItPnNwbGljZShzaW5rTUJCLT5iZWdpbigpLCBCQiwKKyAgICAgICAgICAgICAgICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKE1JKSksCisgICAgICAgICAgICAgICAgICBCQi0+ZW5kKCkpOworICBzaW5rTUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKEJCKTsKKworICAvLyBOZXh0LCBhZGQgdGhlIHRydWUgYW5kIGZhbGx0aHJvdWdoIGJsb2NrcyBhcyBpdHMgc3VjY2Vzc29ycy4KKyAgQkItPmFkZFN1Y2Nlc3Nvcihjb3B5ME1CQik7CisgIEJCLT5hZGRTdWNjZXNzb3Ioc2lua01CQik7CisKKyAgLy8gIGNvcHkwTUJCOgorICAvLyAgICVGYWxzZVZhbHVlID0gLi4uCisgIC8vICAgIyBmYWxsdGhyb3VnaCB0byBzaW5rTUJCCisgIEJCID0gY29weTBNQkI7CisKKyAgLy8gVXBkYXRlIG1hY2hpbmUtQ0ZHIGVkZ2VzCisgIEJCLT5hZGRTdWNjZXNzb3Ioc2lua01CQik7CisKKyAgLy8gIHNpbmtNQkI6CisgIC8vICAgJVJlc3VsdCA9IHBoaSBbICVGYWxzZVZhbHVlLCBjb3B5ME1CQiBdLCBbICVUcnVlVmFsdWUsIHRoaXNNQkIgXQorICAvLyAgLi4uCisgIEJCID0gc2lua01CQjsKKyAgQnVpbGRNSSgqQkIsIEJCLT5iZWdpbigpLCBkbCwKKyAgICAgICAgICBUSUkuZ2V0KFBJQzE2OjpQSEkpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAuYWRkUmVnKE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpKS5hZGRNQkIoY29weTBNQkIpCisgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkuYWRkTUJCKHRoaXNNQkIpOworCisgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsgICAvLyBUaGUgcHNldWRvIGluc3RydWN0aW9uIGlzIGdvbmUgbm93LgorICByZXR1cm4gQkI7Cit9CisKKworU0RWYWx1ZSBQSUMxNlRhcmdldExvd2VyaW5nOjpMb3dlckJSX0NDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmdldCgpOworICBTRFZhbHVlIExIUyA9IE9wLmdldE9wZXJhbmQoMik7ICAgLy8gTEhTIG9mIHRoZSBjb25kaXRpb24uCisgIFNEVmFsdWUgUkhTID0gT3AuZ2V0T3BlcmFuZCgzKTsgICAvLyBSSFMgb2YgdGhlIGNvbmRpdGlvbi4KKyAgU0RWYWx1ZSBEZXN0ID0gT3AuZ2V0T3BlcmFuZCg0KTsgIC8vIEJCIHRvIGp1bXAgdG8KKyAgdW5zaWduZWQgT1JJR0NDID0gfjA7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBJZiB0aGlzIGlzIGEgYnJfY2Mgb2YgYSAic2V0Y2MiLCBhbmQgaWYgdGhlIHNldGNjIGdvdCBsb3dlcmVkIGludG8KKyAgLy8gYW4gQ01QW0lGXUNDL1NFTEVDVF9bSUZdQ0MgcGFpciwgZmluZCB0aGUgb3JpZ2luYWwgY29tcGFyZWQgdmFsdWVzLgorICBMb29rVGhyb3VnaFNldENDKExIUywgUkhTLCBDQywgT1JJR0NDKTsKKyAgaWYgKE9SSUdDQyA9PSB+MFUpIE9SSUdDQyA9IEludENDVG9QSUMxNkNDIChDQyk7CisKKyAgLy8gR2V0IHRoZSBDb21wYXJlIGluc24gYW5kIGNvbmRpdGlvbiBjb2RlLgorICBTRFZhbHVlIFBJQzE2Q0M7CisgIFNEVmFsdWUgQ21wID0gZ2V0UElDMTZDbXAoTEhTLCBSSFMsIE9SSUdDQywgUElDMTZDQywgREFHLCBkbCk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKFBJQzE2SVNEOjpCUkNPTkQsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbiwgRGVzdCwgUElDMTZDQywgCisgICAgICAgICAgICAgICAgICAgICBDbXAuZ2V0VmFsdWUoMSkpOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2SVNlbExvd2VyaW5nLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2SVNlbExvd2VyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiYjVjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJU2VsTG93ZXJpbmcuaApAQCAtMCwwICsxLDI1MyBAQAorLy89PT0tLSBQSUMxNklTZWxMb3dlcmluZy5oIC0gUElDMTYgREFHIExvd2VyaW5nIEludGVyZmFjZSAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZXMgdGhhdCBQSUMxNiB1c2VzIHRvIGxvd2VyIExMVk0gY29kZSBpbnRvIGEKKy8vIHNlbGVjdGlvbiBEQUcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQSUMxNklTRUxMT1dFUklOR19ICisjZGVmaW5lIFBJQzE2SVNFTExPV0VSSU5HX0gKKworI2luY2x1ZGUgIlBJQzE2LmgiCisjaW5jbHVkZSAiUElDMTZTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgbmFtZXNwYWNlIFBJQzE2SVNEIHsKKyAgICBlbnVtIE5vZGVUeXBlIHsKKyAgICAgIC8vIFN0YXJ0IHRoZSBudW1iZXJpbmcgZnJvbSB3aGVyZSBJU0QgTm9kZVR5cGUgZmluaXNoZXMuCisgICAgICBGSVJTVF9OVU1CRVIgPSBJU0Q6OkJVSUxUSU5fT1BfRU5ELAorCisgICAgICBMbywgICAgICAgICAgICAvLyBMb3cgOC1iaXRzIG9mIEdsb2JhbEFkZHJlc3MuCisgICAgICBIaSwgICAgICAgICAgICAvLyBIaWdoIDgtYml0cyBvZiBHbG9iYWxBZGRyZXNzLgorICAgICAgUElDMTZMb2FkLAorICAgICAgUElDMTZMZEFyZywgICAvLyBUaGlzIGlzIHJlcGxpY2Egb2YgUElDMTZMb2FkIGJ1dCB1c2VkIHRvIGxvYWQgZnVuY3Rpb24gCisgICAgICAgICAgICAgICAgICAgIC8vIGFyZ3VtZW50cyBhbmQgaXMgYmVpbmcgdXNlZCBmb3IgZmFjaWxpdGF0aW5nIGZvciBzb21lIAorICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZW1vdmFsIG9wdGltaXphdGlvbnMuIAorCisgICAgICBQSUMxNkxkV0YsCisgICAgICBQSUMxNlN0b3JlLAorICAgICAgUElDMTZTdFdGLAorICAgICAgQmFua3NlbCwKKyAgICAgIE1UTE8sICAgICAgICAgIC8vIE1vdmUgdG8gbG93IHBhcnQgb2YgRlNSCisgICAgICBNVEhJLCAgICAgICAgICAvLyBNb3ZlIHRvIGhpZ2ggcGFydCBvZiBGU1IKKyAgICAgIE1UUENMQVRILCAgICAgIC8vIE1vdmUgdG8gUENMQVRDSAorICAgICAgUElDMTZDb25uZWN0LCAgLy8gR2VuZXJhbCBjb25uZWN0b3IgZm9yIFBJQzE2IG5vZGVzCisgICAgICBCQ0YsCisgICAgICBMU0xGLCAgICAgICAgICAvLyBQSUMxNiBMb2dpY2FsIHNoaWZ0IGxlZnQKKyAgICAgIExSTEYsICAgICAgICAgIC8vIFBJQzE2IExvZ2ljYWwgc2hpZnQgcmlnaHQKKyAgICAgIFJMRiwgICAgICAgICAgIC8vIFJvdGF0ZSBsZWZ0IHRocm91Z2ggY2FycnkKKyAgICAgIFJSRiwgICAgICAgICAgIC8vIFJvdGF0ZSByaWdodCB0aHJvdWdoIGNhcnJ5CisgICAgICBDQUxMLCAgICAgICAgICAvLyBQSUMxNiBDYWxsIGluc3RydWN0aW9uIAorICAgICAgQ0FMTFcsICAgICAgICAgLy8gUElDMTYgQ0FMTFcgaW5zdHJ1Y3Rpb24gCisgICAgICBTVUJDQywgICAgICAgICAvLyBDb21wYXJlIGZvciBlcXVhbGl0eSBvciBpbmVxdWFsaXR5LgorICAgICAgU0VMRUNUX0lDQywgICAgLy8gUHN1ZWRvIHRvIGJlIGNhdWdodCBpbiBzY2hlZHVsYXIgYW5kIGV4cGFuZGVkIHRvIGJyY29uZC4KKyAgICAgIEJSQ09ORCwgICAgICAgIC8vIENvbmRpdGlvbmFsIGJyYW5jaC4KKyAgICAgIFJFVCwgICAgICAgICAgIC8vIFJldHVybi4KKyAgICAgIER1bW15CisgICAgfTsKKworICAgIC8vIEtlZXAgdHJhY2sgb2YgZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2VzLiAKKyAgICBlbnVtIEFkZHJlc3NTcGFjZSB7CisgICAgICBSQU1fU1BBQ0UgPSAwLCAgIC8vIFJBTSBhZGRyZXNzIHNwYWNlCisgICAgICBST01fU1BBQ0UgPSAxICAgIC8vIFJPTSBhZGRyZXNzIHNwYWNlIG51bWJlciBpcyAxCisgICAgfTsKKyAgICBlbnVtIFBJQzE2TGliY2FsbCB7CisgICAgICBNVUxfSTggPSBSVExJQjo6VU5LTk9XTl9MSUJDQUxMICsgMSwKKyAgICAgIFNSQV9JOCwKKyAgICAgIFNMTF9JOCwKKyAgICAgIFNSTF9JOCwKKyAgICAgIFBJQzE2VW5rbm93bkNhbGwKKyAgICB9OworICB9CisKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVGFyZ2V0TG93ZXJpbmcgSW1wbGVtZW50YXRpb24KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIGNsYXNzIFBJQzE2VGFyZ2V0TG93ZXJpbmcgOiBwdWJsaWMgVGFyZ2V0TG93ZXJpbmcgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUElDMTZUYXJnZXRMb3dlcmluZyhQSUMxNlRhcmdldE1hY2hpbmUgJlRNKTsKKworICAgIC8vLyBnZXRUYXJnZXROb2RlTmFtZSAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgYSB0YXJnZXQgc3BlY2lmaWMKKyAgICAvLy8gREFHIG5vZGUuCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworICAgIC8vLyBnZXRTZXRDQ1Jlc3VsdFR5cGUgLSBSZXR1cm4gdGhlIElTRDo6U0VUQ0MgVmFsdWVUeXBlCisgICAgdmlydHVhbCBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBnZXRTZXRDQ1Jlc3VsdFR5cGUoRVZUIFZhbFR5cGUpIGNvbnN0OworICAgIHZpcnR1YWwgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0Q21wTGliY2FsbFJldHVyblR5cGUoKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU2hpZnQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJNVUwoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJBREQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJTVUIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJCaW5PcChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgLy8gQ2FsbCByZXR1cm5zCisgICAgU0RWYWx1ZSAKKyAgICBMb3dlckRpcmVjdENhbGxSZXR1cm4oU0RWYWx1ZSBSZXRMYWJlbCwgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBJbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKyAgICBTRFZhbHVlIAorICAgIExvd2VySW5kaXJlY3RDYWxsUmV0dXJuKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIERhdGFBZGRyX0xvLCBTRFZhbHVlIERhdGFBZGRyX0hpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICAvLyBDYWxsIGFyZ3VtZW50cworICAgIFNEVmFsdWUgCisgICAgTG93ZXJEaXJlY3RDYWxsQXJndW1lbnRzKFNEVmFsdWUgQXJnTGFiZWwsIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICBTRFZhbHVlIAorICAgIExvd2VySW5kaXJlY3RDYWxsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgRGF0YUFkZHJfTG8sIFNEVmFsdWUgRGF0YUFkZHJfSGksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICBTRFZhbHVlIExvd2VyQlJfQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJTRUxFQ1RfQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgZ2V0UElDMTZDbXAoU0RWYWx1ZSBMSFMsIFNEVmFsdWUgUkhTLCB1bnNpZ25lZCBPcmlnQ0MsIFNEVmFsdWUgJkNDLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsKSBjb25zdDsKKyAgICB2aXJ0dWFsIE1hY2hpbmVCYXNpY0Jsb2NrICoKKyAgICAgIEVtaXRJbnN0cldpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlIExvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgUmVwbGFjZU5vZGVSZXN1bHRzKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgTG93ZXJPcGVyYXRpb25XcmFwcGVyKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgIExvd2VyRm9ybWFsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJDYWxsKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICBTRFZhbHVlIEV4cGFuZFN0b3JlKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgRXhwYW5kTG9hZChTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIEV4cGFuZEdsb2JhbEFkZHJlc3MoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBFeHBhbmRFeHRlcm5hbFN5bWJvbChTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIEV4cGFuZEZyYW1lSW5kZXgoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICBTRFZhbHVlIFBlcmZvcm1EQUdDb21iaW5lKFNETm9kZSAqTiwgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0OyAKKyAgICBTRFZhbHVlIFBlcmZvcm1QSUMxNkxvYWRDb21iaW5lKFNETm9kZSAqTiwgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0OyAKKyAgICBTRFZhbHVlIFBlcmZvcm1TdG9yZUNvbWJpbmUoU0ROb2RlICpOLCBEQUdDb21iaW5lckluZm8gJkRDSSkgY29uc3Q7IAorCisgICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBUbXAgT2Zmc2V0IGZvciBGcmFtZUluZGV4LiBJZiBhbnkgVG1wT2Zmc2V0IAorICAgIC8vIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgRkkgdGhlbiBpdCByZXR1cm5zIHRoZSBzYW1lIGVsc2UgaXQgY3JlYXRlcyB0aGUgCisgICAgLy8gbmV3IG9mZnNldCBhbmQgcmV0dXJucy4KKyAgICB1bnNpZ25lZCBHZXRUbXBPZmZzZXRGb3JGSSh1bnNpZ25lZCBGSSwgdW5zaWduZWQgc2xvdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIHZvaWQgUmVzZXRUbXBPZmZzZXRNYXAoU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIHZvaWQgSW5pdFJlc2VydmVkRnJhbWVDb3VudChjb25zdCBGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgLy8vIGdldEZ1bmN0aW9uQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBMb2cyIGFsaWdubWVudCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKikgY29uc3QgeworICAgICAgLy8gRklYTUU6IFRoZSBmdW5jdGlvbiBuZXZlciBzZWVtcyB0byBiZSBhbGlnbmVkLgorICAgICAgcmV0dXJuIDE7CisgICAgfQorICBwcm90ZWN0ZWQ6CisgICAgc3RkOjpwYWlyPGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqLCB1aW50OF90PgorICAgIGZpbmRSZXByZXNlbnRhdGl2ZUNsYXNzKEVWVCBWVCkgY29uc3Q7CisgIHByaXZhdGU6CisgICAgLy8gSWYgdGhlIE5vZGUgaXMgYSBCVUlMRF9QQUlSIHJlcHJlc2VudGluZyBhIGRpcmVjdCBBZGRyZXNzLAorICAgIC8vIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlLgorICAgIGJvb2wgaXNEaXJlY3RBZGRyZXNzKGNvbnN0IFNEVmFsdWUgJk9wKSBjb25zdDsKKworICAgIC8vIElmIHRoZSBOb2RlIGlzIGEgRGlyZWN0QWRkcmVzcyBpbiBST01fU1BBQ0UgdGhlbiB0aGlzIAorICAgIC8vIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUKKyAgICBib29sIGlzUm9tQWRkcmVzcyhjb25zdCBTRFZhbHVlICZPcCkgY29uc3Q7CisKKyAgICAvLyBFeHRyYWN0IHRoZSBMbyBhbmQgSGkgY29tcG9uZW50IG9mIE9wLiAKKyAgICB2b2lkIEdldEV4cGFuZGVkUGFydHMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsIFNEVmFsdWUgJkxvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSGkpIGNvbnN0OworCisKKyAgICAvLyBMb2FkIHBvaW50ZXIgY2FuIGJlIGEgZGlyZWN0IG9yIGluZGlyZWN0IGFkZHJlc3MuIEluIFBJQzE2IGRpcmVjdAorICAgIC8vIGFkZHJlc3NlcyBuZWVkIEJhbmtzZWwgYW5kIEluZGlyZWN0IGFkZHJlc3NlcyBuZWVkIHRvIGJlIGxvYWRlZCB0bworICAgIC8vIEZTUiBmaXJzdC4gSGFuZGxlIGFkZHJlc3Mgc3BlY2lmaWMgY2FzZXMgaGVyZS4KKyAgICB2b2lkIExlZ2FsaXplQWRkcmVzcyhTRFZhbHVlIFB0ciwgU2VsZWN0aW9uREFHICZEQUcsIFNEVmFsdWUgJkNoYWluLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZOZXdQdHIsIHVuc2lnbmVkICZPZmZzZXQsIERlYnVnTG9jIGRsKSBjb25zdDsKKworICAgIC8vIEZyYW1lSW5kZXggc2hvdWxkIGJlIGJyb2tlbiBkb3duIGludG8gRXh0ZXJuYWxTeW1ib2wgYW5kIEZyYW1lT2Zmc2V0LiAKKyAgICB2b2lkIExlZ2FsaXplRnJhbWVJbmRleChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywgU0RWYWx1ZSAmRVMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmT2Zmc2V0KSBjb25zdDsKKworICAgIC8vIEZvciBpbmRpcmVjdCBjYWxscyBkYXRhIGFkZHJlc3Mgb2YgdGhlIGNhbGxlZSBmcmFtZSBuZWVkIHRvIGJlCisgICAgLy8gZXh0cmFjdGVkLiBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBhcmd1bWVudHMgRGF0YUFkZHJfTG8gYW5kIAorICAgIC8vIERhdGFBZGRyX0hpIHdpdGggdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGxlZSBmcmFtZS4KKyAgICB2b2lkIEdldERhdGFBZGRyZXNzKERlYnVnTG9jIGRsLCBTRFZhbHVlIENhbGxlZSwgU0RWYWx1ZSAmQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZEYXRhQWRkcl9MbywgU0RWYWx1ZSAmRGF0YUFkZHJfSGksCisgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLyBXZSBjYW4gbm90IGhhdmUgYm90aCBvcGVyYW5kcyBvZiBhIGJpbmFyeSBvcGVyYXRpb24gaW4gVy4KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHV0IG9uZSBvcGVyYW5kIG9uIHN0YWNrIGFuZCBnZW5lcmF0ZSBhIGxvYWQuCisgICAgU0RWYWx1ZSBDb252ZXJ0VG9NZW1PcGVyYW5kKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCkgY29uc3Q7IAorCisgICAgLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgd2UgbmVlZCB0byBwdXQgYW4gb3BlcmFuZCBvZiBhbiBvcGVyYXRpb24gb24KKyAgICAvLyBzdGFjayBhbmQgZ2VuZXJhdGUgYSBsb2FkIG9yIG5vdC4KKyAgICAvLyBEQUcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIHRvIGFjY2VzcyBEQUcgaW5mb3JtYXRpb24gZHVyaW5nCisgICAgLy8gYW5hbHlzaXMuCisgICAgYm9vbCBOZWVkVG9Db252ZXJ0VG9NZW1PcChTRFZhbHVlIE9wLCB1bnNpZ25lZCAmTWVtT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLy8gU3VidGFyZ2V0IC0gS2VlcCBhIHBvaW50ZXIgdG8gdGhlIFBJQzE2U3VidGFyZ2V0IGFyb3VuZCBzbyB0aGF0IHdlIGNhbgorICAgIC8vLyBtYWtlIHRoZSByaWdodCBkZWNpc2lvbiB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgZGlmZmVyZW50IHRhcmdldHMuCisgICAgY29uc3QgUElDMTZTdWJ0YXJnZXQgKlN1YnRhcmdldDsKKworCisgICAgLy8gRXh0ZW5kaW5nIHRoZSBMSUIgQ2FsbCBmcmFtZXdvcmsgb2YgTExWTQorICAgIC8vIHRvIGhvbGQgdGhlIG5hbWVzIG9mIFBJQzE2TGliY2FsbHMuCisgICAgY29uc3QgY2hhciAqUElDMTZMaWJjYWxsTmFtZXNbUElDMTZJU0Q6OlBJQzE2VW5rbm93bkNhbGxdOyAKKworICAgIC8vIFRvIHNldCBhbmQgcmV0cmlldmUgdGhlIGxpYiBjYWxsIG5hbWVzLgorICAgIHZvaWQgc2V0UElDMTZMaWJjYWxsTmFtZShQSUMxNklTRDo6UElDMTZMaWJjYWxsIENhbGwsIGNvbnN0IGNoYXIgKk5hbWUpOworICAgIGNvbnN0IGNoYXIgKmdldFBJQzE2TGliY2FsbE5hbWUoUElDMTZJU0Q6OlBJQzE2TGliY2FsbCBDYWxsKSBjb25zdDsKKworICAgIC8vIE1ha2UgUElDMTYgTGliY2FsbC4KKyAgICBTRFZhbHVlIE1ha2VQSUMxNkxpYmNhbGwoUElDMTZJU0Q6OlBJQzE2TGliY2FsbCBDYWxsLCBFVlQgUmV0VlQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRFZhbHVlICpPcHMsIHVuc2lnbmVkIE51bU9wcywgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsKSBjb25zdDsKKworICAgIC8vIENoZWNrIGlmIG9wZXJhdGlvbiBoYXMgYSBkaXJlY3QgbG9hZCBvcGVyYW5kLgorICAgIGlubGluZSBib29sIGlzRGlyZWN0TG9hZChjb25zdCBTRFZhbHVlIE9wKSBjb25zdDsKKyAgfTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIFBJQzE2SVNFTExPV0VSSU5HX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJbnN0ckZvcm1hdHMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2SW5zdHJGb3JtYXRzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTNlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2SW5zdHJGb3JtYXRzLnRkCkBAIC0wLDAgKzEsMTE3IEBACisvLz09PS0gUElDMTZJbnN0ckZvcm1hdHMudGQgLSBQSUMxNiBJbnN0cnVjdGlvbiBGb3JtYXRzLS0tLS0tLSotIHRibGdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBEZXNjcmliZSBQSUMxNiBpbnN0cnVjdGlvbnMgZm9ybWF0CisvLworLy8gIEFsbCB0aGUgcG9zc2libGUgUElDMTYgZmllbGRzIGFyZToKKy8vCisvLyAgb3Bjb2RlICAtIG9wZXJhdGlvbiBjb2RlLgorLy8gIGYgICAgICAgLSA3LWJpdCByZWdpc3RlciBmaWxlIGFkZHJlc3MuCisvLyAgZCAgICAgICAtIDEtYml0IGRpcmVjdGlvbiBzcGVjaWZpZXIKKy8vICBrICAgICAgIC0gOC8xMSBiaXQgbGl0ZXJhbHMKKy8vICBiICAgICAgIC0gMyBiaXRzIGJpdCBudW0gc3BlY2lmaWVyCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gR2VuZXJpYyBQSUMxNiBGb3JtYXQKKy8vIFBJQzE2IEluc3RydWN0aW9ucyBhcmUgMTQtYml0IHdpZGUuCisKKy8vIEZJWE1FOiBBZGQgQ29vcGVyIFNwZWNpZmljIEZvcm1hdHMgaWYgYW55LgorCitjbGFzcyBQSUMxNkluc3Q8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEluc3RydWN0aW9uIHsKKyAgZmllbGQgYml0czwxND4gSW5zdDsKKworICBsZXQgTmFtZXNwYWNlID0gIlBJQzE2IjsKKyAgZGFnIE91dE9wZXJhbmRMaXN0ID0gb3V0czsKKyAgZGFnIEluT3BlcmFuZExpc3QgPSBpbnM7CisgIGxldCBBc21TdHJpbmcgPSBhc21zdHI7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQnl0ZSBPcmllbnRlZCBpbnN0cnVjdGlvbiBjbGFzcyBpbiBQSUMxNiA6IDx8b3Bjb2RlfGR8Znw+CisvLyBvcGNvZGUgPSA2IGJpdHMuCisvLyBkID0gZGlyZWN0aW9uID0gMSBiaXQuCisvLyBmID0gZmlsZSByZWdpc3RlciBhZGRyZXNzID0gNyBiaXRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgQnl0ZUZvcm1hdDxiaXRzPDY+IG9wY29kZSwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsCisgICAgICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6UElDMTZJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7CisgIGJpdHM8MT4gIGQ7CisgIGJpdHM8Nz4gIGY7CisKKyAgbGV0IEluc3R7MTMtOH0gPSBvcGNvZGU7CisKKyAgbGV0IEluc3R7N30gPSBkOworICBsZXQgSW5zdHs2LTB9ID0gZjsgCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCaXQgT3JpZW50ZWQgaW5zdHJ1Y3Rpb24gY2xhc3MgaW4gUElDMTYgOiA8fG9wY29kZXxifGZ8PgorLy8gb3Bjb2RlID0gNCBiaXRzLgorLy8gYiA9IGJpdCBzcGVjaWZpZXIgPSAzIGJpdHMuCisvLyBmID0gZmlsZSByZWdpc3RlciBhZGRyZXNzID0gNyBiaXRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgQml0Rm9ybWF0PGJpdHM8ND4gb3Bjb2RlLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgCisgICAgICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogUElDMTZJbnN0PG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7CisgIGJpdHM8Mz4gIGI7CisgIGJpdHM8Nz4gIGY7CisKKyAgbGV0IEluc3R7MTMtMTB9ID0gb3Bjb2RlOworCisgIGxldCBJbnN0ezktN30gPSBiOworICBsZXQgSW5zdHs2LTB9ID0gZjsgCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBMaXRlcmFsIEZvcm1hdCBpbnN0cnVjdGlvbiBjbGFzcyBpbiBQSUMxNiA6IDx8b3Bjb2RlfGt8PgorLy8gb3Bjb2RlID0gNiBiaXRzCisvLyBrID0gbGl0ZXJhbCA9IDggYml0cworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgTGl0ZXJhbEZvcm1hdDxiaXRzPDY+IG9wY29kZSwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIAorICAgICAgICAgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBQSUMxNkluc3Q8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgYml0czw4PiBrOworICAKKyAgbGV0IEluc3R7MTMtOH0gPSBvcGNvZGU7CisKKyAgbGV0IEluc3R7Ny0wfSA9IGs7IAorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29udHJvbCBGb3JtYXQgaW5zdHJ1Y3Rpb24gY2xhc3MgaW4gUElDMTYgOiA8fG9wY29kZXxrfD4KKy8vIG9wY29kZSA9IDMgYml0cy4KKy8vIGsgPSBqdW1wIGFkZHJlc3MgPSAxMSBiaXRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgQ29udHJvbEZvcm1hdDxiaXRzPDM+IG9wY29kZSwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIAorICAgICAgICAgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBQSUMxNkluc3Q8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgYml0czwxMT4gazsKKworICBsZXQgSW5zdHsxMy0xMX0gPSBvcGNvZGU7CisKKyAgbGV0IEluc3R7MTAtMH0gPSBrOyAKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBzZXVkbyBpbnN0cnVjdGlvbiBjbGFzcyBpbiBQSUMxNgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgUHNldWRvPGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBQSUMxNkluc3Q8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgIGxldCBJbnN0ezEzLTZ9ID0gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJbnN0ckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNkluc3RySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyNTdmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsMjI0IEBACisvLz09PS0gUElDMTZJbnN0ckluZm8uY3BwIC0gUElDMTYgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFBJQzE2IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlBJQzE2LmgiCisjaW5jbHVkZSAiUElDMTZBQklOYW1lcy5oIgorI2luY2x1ZGUgIlBJQzE2SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiUElDMTZUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiUElDMTZHZW5JbnN0ckluZm8uaW5jIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y3N0ZGlvPgorCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBGSVhNRTogQWRkIHRoZSBzdWJ0YXJnZXQgc3VwcG9ydCBvbiB0aGlzIGNvbnN0cnVjdG9yLgorUElDMTZJbnN0ckluZm86OlBJQzE2SW5zdHJJbmZvKFBJQzE2VGFyZ2V0TWFjaGluZSAmdG0pCisgIDogVGFyZ2V0SW5zdHJJbmZvSW1wbChQSUMxNkluc3RzLCBhcnJheV9sZW5ndGhvZihQSUMxNkluc3RzKSksCisgICAgVE0odG0pLCAKKyAgICBSZWdJbmZvKCp0aGlzLCAqVE0uZ2V0U3VidGFyZ2V0SW1wbCgpKSB7fQorCisKKy8vLyBpc1N0b3JlVG9TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKy8vLyBzdG9yZSB0byBhIHN0YWNrIHNsb3QsIHJldHVybiB0aGUgdmlydHVhbCBvciBwaHlzaWNhbCByZWdpc3RlciBudW1iZXIgb2YKKy8vLyB0aGUgc291cmNlIHJlZyBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4IG9mIHRoZSBsb2FkZWQgc3RhY2sgc2xvdC4gIAorLy8vIElmIG5vdCwgcmV0dXJuIDAuICBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiAwIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMKKy8vLyBhbnkgc2lkZSBlZmZlY3RzIG90aGVyIHRoYW4gc3RvcmluZyB0byB0aGUgc3RhY2sgc2xvdC4KK3Vuc2lnbmVkIFBJQzE2SW5zdHJJbmZvOjppc1N0b3JlVG9TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUElDMTY6Om1vdndmIAorICAgICAgJiYgTUktPmdldE9wZXJhbmQoMCkuaXNSZWcoKQorICAgICAgJiYgTUktPmdldE9wZXJhbmQoMSkuaXNTeW1ib2woKSkgeworICAgIEZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOworICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGlzTG9hZEZyb21TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKy8vLyBsb2FkIGZyb20gYSBzdGFjayBzbG90LCByZXR1cm4gdGhlIHZpcnR1YWwgb3IgcGh5c2ljYWwgcmVnaXN0ZXIgbnVtYmVyIG9mCisvLy8gdGhlIGRlc3QgcmVnIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIHN0YWNrIHNsb3QuICAKKy8vLyBJZiBub3QsIHJldHVybiAwLiAgVGhpcyBwcmVkaWNhdGUgbXVzdCByZXR1cm4gMCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzCisvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIHN0b3JpbmcgdG8gdGhlIHN0YWNrIHNsb3QuCit1bnNpZ25lZCBQSUMxNkluc3RySW5mbzo6aXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQSUMxNjo6bW92ZiAKKyAgICAgICYmIE1JLT5nZXRPcGVyYW5kKDApLmlzUmVnKCkKKyAgICAgICYmIE1JLT5nZXRPcGVyYW5kKDEpLmlzU3ltYm9sKCkpIHsKKyAgICBGcmFtZUluZGV4ID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0SW5kZXgoKTsKKyAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZCBQSUMxNkluc3RySW5mbzo6c3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGNvbnN0IFBJQzE2VGFyZ2V0TG93ZXJpbmcgKlBUTEkgPSBUTS5nZXRUYXJnZXRMb3dlcmluZygpOworICBEZWJ1Z0xvYyBETDsKKyAgaWYgKEkgIT0gTUJCLmVuZCgpKSBETCA9IEktPmdldERlYnVnTG9jKCk7CisKKyAgY29uc3QgRnVuY3Rpb24gKkZ1bmMgPSBNQkIuZ2V0UGFyZW50KCktPmdldEZ1bmN0aW9uKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIEZ1bmNOYW1lID0gRnVuYy0+Z2V0TmFtZSgpOworCisgIGNvbnN0IGNoYXIgKnRtcE5hbWUgPSBFU05hbWVzOjpjcmVhdGVFU05hbWUoUEFOOjpnZXRUZW1wZGF0YUxhYmVsKEZ1bmNOYW1lKSk7CisKKyAgLy8gT24gdGhlIG9yZGVyIG9mIG9wZXJhbmRzIGhlcmU6IHRoaW5rICJtb3Z3ZiBTcmNSZWcsIHRtcF9zbG90LCBvZmZzZXQiLgorICBpZiAoUkMgPT0gUElDMTY6OkdQUlJlZ2lzdGVyQ2xhc3MpIHsKKyAgICAvL01hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICAgIC8vTWFjaGluZVJlZ2lzdGVySW5mbyAmUkkgPSBNRi5nZXRSZWdJbmZvKCk7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoUElDMTY6Om1vdndmKSkKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAgIC5hZGRJbW0oUFRMSS0+R2V0VG1wT2Zmc2V0Rm9yRkkoRkksIDEsICpNQkIuZ2V0UGFyZW50KCkpKQorICAgICAgLmFkZEV4dGVybmFsU3ltYm9sKHRtcE5hbWUpCisgICAgICAuYWRkSW1tKDEpOyAvLyBFbWl0IGJhbmtzZWwgZm9yIGl0LgorICB9CisgIGVsc2UgaWYgKFJDID09IFBJQzE2OjpGU1IxNlJlZ2lzdGVyQ2xhc3MpIHsKKyAgICAvLyBUaGlzIGlzIGEgMTYtYml0IHJlZ2lzdGVyIGFuZCB0aGUgZnJhbWVpbmRleCBnaXZlbiBieSBsbHZtIGlzIG9mCisgICAgLy8gc2l6ZSB0d28gaGVyZS4gQnJlYWsgdGhpcyBpbmRleCBOIGludG8gdHdvIHplcm8gYmFzZWQgaW5kZXhlcyBhbmQgCisgICAgLy8gcHV0IG9uZSBpbnRvIHRoZSBtYXAuIFRoZSBzZWNvbmQgb25lIGlzIGFsd2F5cyBvYnRhaW5lZCBieSBhZGRpbmcgMQorICAgIC8vIHRvIHRoZSBmaXJzdCB6ZXJvIGJhc2VkIGluZGV4LiBJbiBmYWN0IGl0IGlzIGdvaW5nIHRvIHVzZSAzIHNsb3RzCisgICAgLy8gYXMgc2F2aW5nIEZTUnMgY29ycnVwdHMgVyBhbHNvIGFuZCBoZW5jZSB3ZSBuZWVkIHRvIHNhdmUvcmVzdG9yZSBXIGFsc28uCisKKyAgICB1bnNpZ25lZCBvcGNvZGUgPSAoU3JjUmVnID09IFBJQzE2OjpGU1IwKSA/IFBJQzE2OjpzYXZlX2ZzcjAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQSUMxNjo6c2F2ZV9mc3IxOworICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KG9wY29kZSkpCisgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpCisgICAgICAuYWRkSW1tKFBUTEktPkdldFRtcE9mZnNldEZvckZJKEZJLCAzLCAqTUJCLmdldFBhcmVudCgpKSkKKyAgICAgIC5hZGRFeHRlcm5hbFN5bWJvbCh0bXBOYW1lKQorICAgICAgLmFkZEltbSgxKTsgLy8gRW1pdCBiYW5rc2VsIGZvciBpdC4KKyAgfQorICBlbHNlCisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ2FuJ3Qgc3RvcmUgdGhpcyByZWdpc3RlciB0byBzdGFjayBzbG90Iik7Cit9CisKK3ZvaWQgUElDMTZJbnN0ckluZm86OmxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGNvbnN0IFBJQzE2VGFyZ2V0TG93ZXJpbmcgKlBUTEkgPSBUTS5nZXRUYXJnZXRMb3dlcmluZygpOworICBEZWJ1Z0xvYyBETDsKKyAgaWYgKEkgIT0gTUJCLmVuZCgpKSBETCA9IEktPmdldERlYnVnTG9jKCk7CisKKyAgY29uc3QgRnVuY3Rpb24gKkZ1bmMgPSBNQkIuZ2V0UGFyZW50KCktPmdldEZ1bmN0aW9uKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIEZ1bmNOYW1lID0gRnVuYy0+Z2V0TmFtZSgpOworCisgIGNvbnN0IGNoYXIgKnRtcE5hbWUgPSBFU05hbWVzOjpjcmVhdGVFU05hbWUoUEFOOjpnZXRUZW1wZGF0YUxhYmVsKEZ1bmNOYW1lKSk7CisKKyAgLy8gT24gdGhlIG9yZGVyIG9mIG9wZXJhbmRzIGhlcmU6IHRoaW5rICJtb3ZmIEZyYW1lSW5kZXgsIFciLgorICBpZiAoUkMgPT0gUElDMTY6OkdQUlJlZ2lzdGVyQ2xhc3MpIHsKKyAgICAvL01hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICAgIC8vTWFjaGluZVJlZ2lzdGVySW5mbyAmUkkgPSBNRi5nZXRSZWdJbmZvKCk7CisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoUElDMTY6Om1vdmYpLCBEZXN0UmVnKQorICAgICAgLmFkZEltbShQVExJLT5HZXRUbXBPZmZzZXRGb3JGSShGSSwgMSwgKk1CQi5nZXRQYXJlbnQoKSkpCisgICAgICAuYWRkRXh0ZXJuYWxTeW1ib2wodG1wTmFtZSkKKyAgICAgIC5hZGRJbW0oMSk7IC8vIEVtaXQgYmFua3NlbCBmb3IgaXQuCisgIH0KKyAgZWxzZSBpZiAoUkMgPT0gUElDMTY6OkZTUjE2UmVnaXN0ZXJDbGFzcykgeworICAgIC8vIFRoaXMgaXMgYSAxNi1iaXQgcmVnaXN0ZXIgYW5kIHRoZSBmcmFtZWluZGV4IGdpdmVuIGJ5IGxsdm0gaXMgb2YKKyAgICAvLyBzaXplIHR3byBoZXJlLiBCcmVhayB0aGlzIGluZGV4IE4gaW50byB0d28gemVybyBiYXNlZCBpbmRleGVzIGFuZCAKKyAgICAvLyBwdXQgb25lIGludG8gdGhlIG1hcC4gVGhlIHNlY29uZCBvbmUgaXMgYWx3YXlzIG9idGFpbmVkIGJ5IGFkZGluZyAxCisgICAgLy8gdG8gdGhlIGZpcnN0IHplcm8gYmFzZWQgaW5kZXguIEluIGZhY3QgaXQgaXMgZ29pbmcgdG8gdXNlIDMgc2xvdHMKKyAgICAvLyBhcyBzYXZpbmcgRlNScyBjb3JydXB0cyBXIGFsc28gYW5kIGhlbmNlIHdlIG5lZWQgdG8gc2F2ZS9yZXN0b3JlIFcgYWxzby4KKworICAgIHVuc2lnbmVkIG9wY29kZSA9IChEZXN0UmVnID09IFBJQzE2OjpGU1IwKSA/IFBJQzE2OjpyZXN0b3JlX2ZzcjAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQSUMxNjo6cmVzdG9yZV9mc3IxOworICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KG9wY29kZSksIERlc3RSZWcpCisgICAgICAuYWRkSW1tKFBUTEktPkdldFRtcE9mZnNldEZvckZJKEZJLCAzLCAqTUJCLmdldFBhcmVudCgpKSkKKyAgICAgIC5hZGRFeHRlcm5hbFN5bWJvbCh0bXBOYW1lKQorICAgICAgLmFkZEltbSgxKTsgLy8gRW1pdCBiYW5rc2VsIGZvciBpdC4KKyAgfQorICBlbHNlCisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ2FuJ3QgbG9hZCB0aGlzIHJlZ2lzdGVyIGZyb20gc3RhY2sgc2xvdCIpOworfQorCit2b2lkIFBJQzE2SW5zdHJJbmZvOjpjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdCB7CisgIHVuc2lnbmVkIE9wYzsKKyAgaWYgKFBJQzE2OjpGU1IxNlJlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpCisgICAgT3BjID0gUElDMTY6OmNvcHlfZnNyOworICBlbHNlIGlmIChQSUMxNjo6R1BSUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBPcGMgPSBQSUMxNjo6Y29weV93OworICBlbHNlCisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW1wb3NzaWJsZSByZWctdG8tcmVnIGNvcHkiKTsKKworICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChPcGMpLCBEZXN0UmVnKQorICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworfQorCisvLy8gSW5zZXJ0QnJhbmNoIC0gSW5zZXJ0IGEgYnJhbmNoIGludG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkCisvLy8gTWFjaGluZUJhc2ljQmxvY2suICBUaGlzIG9wZXJhbmRzIHRvIHRoaXMgbWV0aG9kIGFyZSB0aGUgc2FtZSBhcyB0aG9zZQorLy8vIHJldHVybmVkIGJ5IEFuYWx5emVCcmFuY2guICBUaGlzIGlzIGludm9rZWQgaW4gY2FzZXMgd2hlcmUgQW5hbHl6ZUJyYW5jaAorLy8vIHJldHVybnMgc3VjY2VzcyBhbmQgd2hlbiBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCAoVEJCIGlzIG5vbi1udWxsLCBGQkIgaXMKKy8vLyBudWxsLCBDb25kIGlzIGVtcHR5KSBuZWVkcyB0byBiZSBpbnNlcnRlZC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisvLy8gaW5zdHJ1Y3Rpb25zIGluc2VydGVkLgordW5zaWduZWQgUElDMTZJbnN0ckluZm86OgorSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsIAorICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICBEZWJ1Z0xvYyBETCkgY29uc3QgeworICAvLyBTaG91bGRuJ3QgYmUgYSBmYWxsIHRocm91Z2guCisgIGFzc2VydChUQkIgJiYgIkluc2VydEJyYW5jaCBtdXN0IG5vdCBiZSB0b2xkIHRvIGluc2VydCBhIGZhbGx0aHJvdWdoIik7CisKKyAgaWYgKEZCQiA9PSAwKSB7IC8vIE9uZSB3YXkgYnJhbmNoLgorICAgIGlmIChDb25kLmVtcHR5KCkpIHsKKyAgICAgIC8vIFVuY29uZGl0aW9uYWwgYnJhbmNoPworICAgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KFBJQzE2Ojpicl91bmNvbmQpKS5hZGRNQkIoVEJCKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBGSVhNRTogSWYgdGhlIHRoZXJlIGFyZSBzb21lIGNvbmRpdGlvbnMgc3BlY2lmaWVkIHRoZW4gY29uZGl0aW9uYWwgYnJhbmNoCisgIC8vIHNob3VsZCBiZSBnZW5lcmF0ZWQuICAgCisgIC8vIEZvciB0aGUgdGltZSBiZWluZyBubyBpbnN0cnVjdGlvbiBpcyBiZWluZyBnZW5lcmF0ZWQgdGhlcmVmb3JlCisgIC8vIHJldHVybmluZyBOVUxMLgorICByZXR1cm4gMDsKK30KKworYm9vbCBQSUMxNkluc3RySW5mbzo6QW5hbHl6ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqJlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dNb2RpZnkpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuZW5kKCk7CisgIGlmIChJID09IE1CQi5iZWdpbigpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIEdldCB0aGUgdGVybWluYXRvciBpbnN0cnVjdGlvbi4KKyAgLS1JOworICB3aGlsZSAoSS0+aXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIC0tSTsKKyAgfQorICAvLyBIYW5kbGUgdW5jb25kaXRpb25hbCBicmFuY2hlcy4gSWYgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoJ3MgdGFyZ2V0IGlzCisgIC8vIHN1Y2Nlc3NvciBiYXNpYyBibG9jayB0aGVuIHJlbW92ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guIAorICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gUElDMTY6OmJyX3VuY29uZCAgJiYgQWxsb3dNb2RpZnkpIHsKKyAgICBpZiAoTUJCLmlzTGF5b3V0U3VjY2Vzc29yKEktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCkpKSB7CisgICAgICBUQkIgPSAwOworICAgICAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNkluc3RySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNkluc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MWIzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2SW5zdHJJbmZvLmgKQEAgLTAsMCArMSw3NiBAQAorLy89PT0tIFBJQzE2SW5zdHJJbmZvLmggLSBQSUMxNiBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbi0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFBJQzE2IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQSUMxNklOU1RSVUNUSU9OSU5GT19ICisjZGVmaW5lIFBJQzE2SU5TVFJVQ1RJT05JTkZPX0gKKworI2luY2x1ZGUgIlBJQzE2LmgiCisjaW5jbHVkZSAiUElDMTZSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisKK2NsYXNzIFBJQzE2SW5zdHJJbmZvIDogcHVibGljIFRhcmdldEluc3RySW5mb0ltcGwgCit7CisgIFBJQzE2VGFyZ2V0TWFjaGluZSAmVE07CisgIGNvbnN0IFBJQzE2UmVnaXN0ZXJJbmZvIFJlZ0luZm87CitwdWJsaWM6CisgIGV4cGxpY2l0IFBJQzE2SW5zdHJJbmZvKFBJQzE2VGFyZ2V0TWFjaGluZSAmVE0pOworCisgIHZpcnR1YWwgY29uc3QgUElDMTZSZWdpc3RlckluZm8gJmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIFJlZ0luZm87IH0KKworICAvLy8gaXNMb2FkRnJvbVN0YWNrU2xvdCAtIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBhIGRpcmVjdAorICAvLy8gbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorICAvLy8gdGhlIGRlc3RpbmF0aW9uIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKyAgLy8vIG5vdCwgcmV0dXJuIDAuICBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiAwIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMKKyAgLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBsb2FkaW5nIGZyb20gdGhlIHN0YWNrIHNsb3QuCisgIHZpcnR1YWwgdW5zaWduZWQgaXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8vLyBpc1N0b3JlVG9TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKyAgLy8vIHN0b3JlIHRvIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorICAvLy8gdGhlIHNvdXJjZSByZWcgYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QuICBJZgorICAvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworICAvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIHN0b3JpbmcgdG8gdGhlIHN0YWNrIHNsb3QuCisgIHZpcnR1YWwgdW5zaWduZWQgaXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBzdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdmlydHVhbCB2b2lkIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdDsKKyAgdmlydHVhbCAKKyAgdW5zaWduZWQgSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdDsgCisgIHZpcnR1YWwgYm9vbCBBbmFseXplQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqJkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSkgY29uc3Q7CisgIH07Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNkluc3RySW5mby50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJbnN0ckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkMzZjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZJbnN0ckluZm8udGQKQEAgLTAsMCArMSw1NDAgQEAKKy8vPT09LSBQSUMxNkluc3RySW5mby50ZCAtIFBJQzE2IEluc3RydWN0aW9uIGRlZnMgLS0tLS0tLS0tLS0tLSotIHRibGdlbi0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIFBJQzE2IGluc3RydWN0aW9ucyBpbiBUYWJsZUdlbiBmb3JtYXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBJQzE2IFNwZWNpZmljIFR5cGUgQ29uc3RyYWludHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworY2xhc3MgU0RUQ2lzSTg8aW50IE9wTnVtPiA6IFNEVENpc1ZUPE9wTnVtLCBpOD47CitjbGFzcyBTRFRDaXNJMTY8aW50IE9wTnVtPiA6IFNEVENpc1ZUPE9wTnVtLCBpMTY+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUElDMTYgU3BlY2lmaWMgVHlwZSBQcm9maWxlcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEdlbmVyaWMgdHlwZSBwcm9maWxlcyBmb3IgaTgvaTE2IHVuYXJ5L2JpbmFyeSBvcGVyYXRpb25zLgorLy8gVGFraW5nIG9uZSBpOCBvciBpMTYgYW5kIHByb2R1Y2luZyB2b2lkLgorZGVmIFNEVEk4Vm9pZE9wIDogU0RUeXBlUHJvZmlsZTwwLCAxLCBbU0RUQ2lzSTg8MD5dPjsKK2RlZiBTRFRJMTZWb2lkT3AgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFtTRFRDaXNJMTY8MD5dPjsKKworLy8gVGFraW5nIG9uZSB2YWx1ZSBhbmQgcHJvZHVjaW5nIGFuIG91dHB1dCBvZiBzYW1lIHR5cGUuCitkZWYgU0RUSThVbmFyeU9wIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbU0RUQ2lzSTg8MD4sIFNEVENpc0k4PDE+XT47CitkZWYgU0RUSTE2VW5hcnlPcCA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgW1NEVENpc0kxNjwwPiwgU0RUQ2lzSTE2PDE+XT47CisKKy8vIFRha2luZyB0d28gdmFsdWVzIGFuZCBwcm9kdWNpbmcgYW4gb3V0cHV0IG9mIHNhbWUgdHlwZS4KK2RlZiBTRFRJOEJpbk9wIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzSTg8MD4sIFNEVENpc0k4PDE+LCBTRFRDaXNJODwyPl0+OworZGVmIFNEVEkxNkJpbk9wIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzSTE2PDA+LCBTRFRDaXNJMTY8MT4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzSTE2PDI+XT47CisKKy8vIE5vZGUgc3BlY2lmaWMgdHlwZSBwcm9maWxlcy4KK2RlZiBTRFRfUElDMTZMb2FkIDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbU0RUQ2lzSTg8MD4sIFNEVENpc0k4PDE+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc0k4PDI+LCBTRFRDaXNJODwzPl0+OworCitkZWYgU0RUX1BJQzE2U3RvcmUgOiBTRFR5cGVQcm9maWxlPDAsIDQsIFtTRFRDaXNJODwwPiwgU0RUQ2lzSTg8MT4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzSTg8Mj4sIFNEVENpc0k4PDM+XT47CisKK2RlZiBTRFRfUElDMTZDb25uZWN0IDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzSTg8MD4sIFNEVENpc0k4PDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNJODwyPl0+OworCisvLyBQSUMxNklTRDo6Q0FMTCB0eXBlIHByb3JpbGUKK2RlZiBTRFRfUElDMTZjYWxsIDogU0RUeXBlUHJvZmlsZTwwLCAtMSwgW1NEVENpc0ludDwwPl0+OworZGVmIFNEVF9QSUMxNmNhbGx3IDogU0RUeXBlUHJvZmlsZTwxLCAtMSwgW1NEVENpc0ludDwwPl0+OworCisvLyBQSUMxNklTRDo6QlJDT05ECitkZWYgU0RUX1BJQzE2QnJjb25kOiBTRFR5cGVQcm9maWxlPDAsIDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0RUQ2lzVlQ8MCwgT3RoZXJWVD4sIFNEVENpc0k4PDE+XT47CisKKy8vIFBJQzE2SVNEOjpCUkNPTkQKK2RlZiBTRFRfUElDMTZTZWxlY3RpY2M6IFNEVHlwZVByb2ZpbGU8MSwgMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRFRDaXNJODwwPiwgU0RUQ2lzSTg8MT4sIFNEVENpc0k4PDI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzSTg8Mz5dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBJQzE2IGFkZHJlc3NpbmcgbW9kZXMgbWF0Y2hpbmcgdmlhIERBRy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgZGlyYWRkciA6IENvbXBsZXhQYXR0ZXJuPGk4LCAxLCAiU2VsZWN0RGlyZWN0QWRkciIsIFtdLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQSUMxNiBTcGVjaWZpYyBOb2RlIERlZmluaXRpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2RlZiBQSUMxNmNhbGxzZXFfc3RhcnQgOiBTRE5vZGU8IklTRDo6Q0FMTFNFUV9TVEFSVCIsIFNEVEk4Vm9pZE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3V0RmxhZ10+OworZGVmIFBJQzE2Y2FsbHNlcV9lbmQgICA6IFNETm9kZTwiSVNEOjpDQUxMU0VRX0VORCIsIFNEVEk4Vm9pZE9wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZywgU0ROUE91dEZsYWddPjsKKworLy8gTG93IDgtYml0cyBvZiBHbG9iYWxBZGRyZXNzLgorZGVmIFBJQzE2TG8gOiBTRE5vZGU8IlBJQzE2SVNEOjpMbyIsIFNEVEk4QmluT3A+OyAgCisKKy8vIEhpZ2ggOC1iaXRzIG9mIEdsb2JhbEFkZHJlc3MuCitkZWYgUElDMTZIaSA6IFNETm9kZTwiUElDMTZJU0Q6OkhpIiwgU0RUSThCaW5PcD47CisKKy8vIFRoZSBNVEhJIGFuZCBNVExPIG5vZGVzIGFyZSB1c2VkIG9ubHkgdG8gbWF0Y2ggdGhlbSBpbiB0aGUgaW5jb21pbmcgCisvLyBEQUcgZm9yIHJlcGxhY2VtZW50IGJ5IGNvcnJlc3BvbmRpbmcgc2V0X2ZzcmhpLCBzZXRfZnNybG8gaW5zbnRydWN0aW9ucy4KKy8vIFRoZXNlIG5vZGVzIGFyZSBub3QgdXNlZCBmb3IgZGVmaW5pbmcgYW55IGluc3RydWN0aW9ucy4KK2RlZiBNVExPICAgICA6IFNETm9kZTwiUElDMTZJU0Q6Ok1UTE8iLCBTRFRJOFVuYXJ5T3A+OworZGVmIE1USEkgICAgIDogU0ROb2RlPCJQSUMxNklTRDo6TVRISSIsIFNEVEk4VW5hcnlPcD47CitkZWYgTVRQQ0xBVEggOiBTRE5vZGU8IlBJQzE2SVNEOjpNVFBDTEFUSCIsIFNEVEk4VW5hcnlPcD47CisKKy8vIE5vZGUgdG8gZ2VuZXJhdGUgQmFuayBTZWxlY3QgZm9yIGEgR2xvYmFsQWRkcmVzcy4KK2RlZiBCYW5rc2VsIDogU0ROb2RlPCJQSUMxNklTRDo6QmFua3NlbCIsIFNEVEk4VW5hcnlPcD47CisKKy8vIE5vZGUgdG8gbWF0Y2ggYSBkaXJlY3Qgc3RvcmUgb3BlcmF0aW9uLgorZGVmIFBJQzE2U3RvcmUgOiBTRE5vZGU8IlBJQzE2SVNEOjpQSUMxNlN0b3JlIiwgU0RUX1BJQzE2U3RvcmUsIFtTRE5QSGFzQ2hhaW5dPjsKK2RlZiBQSUMxNlN0V0YgOiBTRE5vZGU8IlBJQzE2SVNEOjpQSUMxNlN0V0YiLCBTRFRfUElDMTZTdG9yZSwgCisgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBJbkZsYWcsIFNETlBPdXRGbGFnXT47CisKKy8vIE5vZGUgdG8gbWF0Y2ggYSBkaXJlY3QgbG9hZCBvcGVyYXRpb24uCitkZWYgUElDMTZMb2FkICA6IFNETm9kZTwiUElDMTZJU0Q6OlBJQzE2TG9hZCIsIFNEVF9QSUMxNkxvYWQsIFtTRE5QSGFzQ2hhaW5dPjsKK2RlZiBQSUMxNkxkQXJnICA6IFNETm9kZTwiUElDMTZJU0Q6OlBJQzE2TGRBcmciLCBTRFRfUElDMTZMb2FkLCBbU0ROUEhhc0NoYWluXT47CitkZWYgUElDMTZMZFdGICA6IFNETm9kZTwiUElDMTZJU0Q6OlBJQzE2TGRXRiIsIFNEVF9QSUMxNkxvYWQsIAorICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QSW5GbGFnLCBTRE5QT3V0RmxhZ10+OworZGVmIFBJQzE2Q29ubmVjdDogU0ROb2RlPCJQSUMxNklTRDo6UElDMTZDb25uZWN0IiwgU0RUX1BJQzE2Q29ubmVjdCwgW10+OworCisvLyBOb2RlIHRvIG1hdGNoIFBJQzE2IGNhbGwKK2RlZiBQSUMxNmNhbGwgOiBTRE5vZGU8IlBJQzE2SVNEOjpDQUxMIiwgU0RUX1BJQzE2Y2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4gLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZ10+OworZGVmIFBJQzE2Y2FsbHcgOiBTRE5vZGU8IlBJQzE2SVNEOjpDQUxMVyIsIFNEVF9QSUMxNmNhbGx3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiAsIFNETlBPcHRJbkZsYWcsIFNETlBPdXRGbGFnXT47CisKKy8vIE5vZGUgdG8gbWF0Y2ggYSBjb21wYXJpc29uIGluc3RydWN0aW9uLgorZGVmIFBJQzE2U3ViY2MgOiBTRE5vZGU8IlBJQzE2SVNEOjpTVUJDQyIsIFNEVEk4QmluT3AsIFtTRE5QT3V0RmxhZ10+OworCisvLyBOb2RlIHRvIG1hdGNoIGEgY29uZGl0aW9uYWwgYnJhbmNoLgorZGVmIFBJQzE2QnJjb25kIDogU0ROb2RlPCJQSUMxNklTRDo6QlJDT05EIiwgU0RUX1BJQzE2QnJjb25kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QSW5GbGFnXT47CisKK2RlZiBQSUMxNlNlbGVjdGljYyA6IFNETm9kZTwiUElDMTZJU0Q6OlNFTEVDVF9JQ0MiLCBTRFRfUElDMTZTZWxlY3RpY2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSW5GbGFnXT47CisKK2RlZiBQSUMxNnJldCAgICAgICA6IFNETm9kZTwiUElDMTZJU0Q6OlJFVCIsIFNEVE5vbmUsIFtTRE5QSGFzQ2hhaW5dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBJQzE2IE9wZXJhbmQgRGVmaW5pdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIGk4bWVtIDogT3BlcmFuZDxpOD47CitkZWYgYnJ0YXJnZXQ6IE9wZXJhbmQ8T3RoZXJWVD47CisKKy8vIE9wZXJhbmQgZm9yIHByaW50aW5nIG91dCBhIGNvbmRpdGlvbiBjb2RlLgorbGV0IFByaW50TWV0aG9kID0gInByaW50Q0NPcGVyYW5kIiBpbgorICBkZWYgQ0NPcCA6IE9wZXJhbmQ8aTg+OworCitpbmNsdWRlICJQSUMxNkluc3RyRm9ybWF0cy50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBJQzE2IENvbW1vbiBDbGFzc2VzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVyA9IFcgT3AgRiA6IExvYWQgdGhlIHZhbHVlIGZyb20gRiBhbmQgZG8gT3AgdG8gVy4KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjID0gJGRzdCIsIG1heUxvYWQgPSAxIGluCitjbGFzcyBCaW5PcEZXPGJpdHM8Nj4gT3BDb2RlLCBzdHJpbmcgT3BjU3RyLCBTRE5vZGUgT3BOb2RlPjoKKyAgQnl0ZUZvcm1hdDxPcENvZGUsIChvdXRzIEdQUjokZHN0KSwKKyAgICAgICAgICAgICAoaW5zIEdQUjokc3JjLCBpOGltbTokb2Zmc2V0LCBpOG1lbTokcHRybG8sIGk4aW1tOiRwdHJoaSksCisgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRwdHJsbyArICRvZmZzZXQsIFciKSwKKyAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKE9wTm9kZSBHUFI6JHNyYywgKFBJQzE2TG9hZCBkaXJhZGRyOiRwdHJsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpOCBpbW06JHB0cmhpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpOCBpbW06JG9mZnNldCkpKSldPjsKKworLy8gRiA9IEYgT3AgVyA6IExvYWQgdGhlIHZhbHVlIGZyb20gRiwgZG8gb3Agd2l0aCBXIGFuZCBzdG9yZSBpbiBGLgorLy8gVGhpcyBpbnNuIGNsYXNzIGlzIG5vdCBtYXJrZWQgYXMgVHdvQWRkcmVzcyBiZWNhdXNlIHRoZSByZWcgaXMKKy8vIGJlaW5nIHVzZWQgYXMgYSBzb3VyY2Ugb3BlcmFuZCBvbmx5LiAoUmVtZW1iZXIgYSBUd29BZGRyZXNzIGluc24KKy8vIG5lZWRzIGEgY29weS4pCitsZXQgbWF5U3RvcmUgPSAxIGluCitjbGFzcyBCaW5PcFdGPGJpdHM8Nj4gT3BDb2RlLCBzdHJpbmcgT3BjU3RyLCBTRE5vZGUgT3BOb2RlPjoKKyAgQnl0ZUZvcm1hdDxPcENvZGUsIChvdXRzKSwKKyAgICAgICAgICAgICAoaW5zIEdQUjokc3JjLCBpOGltbTokb2Zmc2V0LCBpOG1lbTokcHRybG8sIGk4aW1tOiRwdHJoaSksCisgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRwdHJsbyArICRvZmZzZXQsIEYiKSwKKyAgICAgICAgICAgICBbKFBJQzE2U3RvcmUgKE9wTm9kZSBHUFI6JHNyYywgKFBJQzE2TG9hZCBkaXJhZGRyOiRwdHJsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpOCBpbW06JHB0cmhpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpOCBpbW06JG9mZnNldCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmFkZHI6JHB0cmxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IGltbTokcHRyaGkpLCAoaTggaW1tOiRvZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXT47CisKKy8vIFcgPSBXIE9wIEwgOiBEbyBPcCBvZiBMIHdpdGggVyBhbmQgcGxhY2UgcmVzdWx0IGluIFcuCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiIGluCitjbGFzcyBCaW5PcFdMPGJpdHM8Nj4gb3Bjb2RlLCBzdHJpbmcgT3BjU3RyLCBTRE5vZGUgT3BOb2RlPiA6CisgIExpdGVyYWxGb3JtYXQ8b3Bjb2RlLCAob3V0cyBHUFI6JGRzdCksCisgICAgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgaThpbW06JGxpdGVyYWwpLAorICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRsaXRlcmFsIiksCisgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChPcE5vZGUgR1BSOiRzcmMsIChpOCBpbW06JGxpdGVyYWwpKSldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBJQzE2IEluc3RydWN0aW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFBzZXVkby1pbnN0cnVjdGlvbnMuCitkZWYgQURKQ0FMTFNUQUNLRE9XTiA6IFBzZXVkbzwob3V0cyksIChpbnMgaThpbW06JGFtdCksCisgICAgICAgICAgICAgICAgICAgICAgICIhQURKQ0FMTFNUQUNLRE9XTiAkYW10IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhQSUMxNmNhbGxzZXFfc3RhcnQgaW1tOiRhbXQpXT47CisKK2RlZiBBREpDQUxMU1RBQ0tVUCA6IFBzZXVkbzwob3V0cyksIChpbnMgaThpbW06JGFtdCksCisgICAgICAgICAgICAgICAgICAgICAgICIhQURKQ0FMTFNUQUNLVVAgJGFtdCIsIAorICAgICAgICAgICAgICAgICAgICAgICBbKFBJQzE2Y2FsbHNlcV9lbmQgaW1tOiRhbXQpXT47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhaW91cyBtb3ZsdyBpbnNuIHBhdHRlcm5zLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4geworLy8gTW92ZSA4LWJpdCBsaXRlcmFsIHRvIFcuCitkZWYgbW92bHcgOiBCaXRGb3JtYXQ8MTIsIChvdXRzIEdQUjokZHN0KSwgKGlucyBpOGltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAibW92bHcgJHNyYyIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChpOCBpbW06JHNyYykpXT47CisKKy8vIE1vdmUgYSBMbyhUR0EpIHRvIFcuCitkZWYgbW92bHdfbG9fMSA6IEJpdEZvcm1hdDwxMiwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIGk4aW1tOiRzcmMsIGk4aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAibW92bHcgTE9XKCR7c3JjfSArICR7c3JjMn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKFBJQzE2TG8gdGdsb2JhbGFkZHI6JHNyYywgaW1tOiRzcmMyICkpXT47CisKKy8vIE1vdmUgYSBMbyhURVMpIHRvIFcuCitkZWYgbW92bHdfbG9fMiA6IEJpdEZvcm1hdDwxMiwgKG91dHMgR1BSOiRkc3QpLCAoaW5zIGk4aW1tOiRzcmMsIGk4aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAibW92bHcgTE9XKCR7c3JjfSArICR7c3JjMn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKFBJQzE2TG8gdGV4dGVybmFsc3ltOiRzcmMsIGltbTokc3JjMiApKV0+OworCisvLyBNb3ZlIGEgSGkoVEdBKSB0byBXLgorZGVmIG1vdmx3X2hpXzEgOiBCaXRGb3JtYXQ8MTIsIChvdXRzIEdQUjokZHN0KSwgKGlucyBpOGltbTokc3JjLCBpOGltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmx3IEhJR0goJHtzcmN9ICsgJHtzcmMyfSkiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoUElDMTZIaSB0Z2xvYmFsYWRkcjokc3JjLCBpbW06JHNyYzIpKV0+OworCisvLyBNb3ZlIGEgSGkoVEVTKSB0byBXLgorZGVmIG1vdmx3X2hpXzIgOiBCaXRGb3JtYXQ8MTIsIChvdXRzIEdQUjokZHN0KSwgKGlucyBpOGltbTokc3JjLCBpOGltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmx3IEhJR0goJHtzcmN9ICsgJHtzcmMyfSkiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoUElDMTZIaSB0ZXh0ZXJuYWxzeW06JHNyYywgaW1tOiRzcmMyKSldPjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGU1Igc2V0dGluZyBpbnNucy4gCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZXNlIGluc25zIGFyZSBtYXRjaGVkIHZpYSBhIERBRyByZXBsYWNlbWVudCBwYXR0ZXJuLgorZGVmIHNldF9mc3JsbzoKKyAgQnl0ZUZvcm1hdDwwLCAob3V0cyBGU1IxNjokZnNyKSwgCisgICAgICAgICAgICAgKGlucyBHUFI6JHZhbCksCisgICAgICAgICAgICAgIm1vdndmICR7ZnNyfUwiLAorICAgICAgICAgICAgIFtdPjsKKworbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiBpbgorZGVmIHNldF9mc3JoaToKKyAgQnl0ZUZvcm1hdDwwLCAob3V0cyBGU1IxNjokZHN0KSwgCisgICAgICAgICAgICAgKGlucyBGU1IxNjokc3JjLCBHUFI6JHZhbCksCisgICAgICAgICAgICAgIm1vdndmICR7ZHN0fUgiLAorICAgICAgICAgICAgIFtdPjsKKworZGVmIHNldF9wY2xhdGg6CisgIEJ5dGVGb3JtYXQ8MCwgKG91dHMgUENMQVRIUjokZHN0KSwgCisgICAgICAgICAgICAgKGlucyBHUFI6JHZhbCksCisgICAgICAgICAgICAgIm1vdndmICR7ZHN0fSIsCisgICAgICAgICAgICAgWyhzZXQgUENMQVRIUjokZHN0ICwgKE1UUENMQVRIIEdQUjokdmFsKSldPjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb3B5UGh5c1JlZyAKKy8vIGNvcHlQaHlzUmVnIGluc25zLiBUaGVzZSBhcmUgZHVtbXkuIFRoZXkgc2hvdWxkIGFsd2F5cyBiZSBkZWxldGVkCisvLyBieSB0aGUgb3B0aW1pemVyIGFuZCBuZXZlciBiZSBwcmVzZW50IGluIHRoZSBmaW5hbCBnZW5lcmF0ZWQgY29kZS4KKy8vIGlmIHRoZXkgYXJlLCB0aGVuIHdlIGhhdmUgdG8gd3JpdGUgY29ycmVjdCBtYWNyb3MgZm9yIHRoZXNlIGluc25zLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgY29weV9mc3I6CisgIFBzZXVkbzwob3V0cyBGU1IxNjokZHN0KSwgKGlucyBGU1IxNjokc3JjKSwgImNvcHlfZnNyICRkc3QsICRzcmMiLCBbXT47CisKK2RlZiBjb3B5X3c6CisgIFBzZXVkbzwob3V0cyBHUFI6JGRzdCksIChpbnMgR1BSOiRzcmMpLCAiY29weV93ICRkc3QsICRzcmMiLCBbXT47CisKK2NsYXNzIFNBVkVfRlNSPHN0cmluZyBPcGNTdHI+OgorICBQc2V1ZG88KG91dHMpLCAKKyAgICAgICAgIChpbnMgRlNSMTY6JHNyYywgaThpbW06JG9mZnNldCwgaThtZW06JHB0cmxvLCBpOGltbTokcHRyaGkpLCAKKyAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRwdHJsbywgJG9mZnNldCIpLAorICAgICAgICAgW10+OyAKKyAKK2RlZiBzYXZlX2ZzcjA6IFNBVkVfRlNSPCJzYXZlX2ZzcjAiPjsKK2RlZiBzYXZlX2ZzcjE6IFNBVkVfRlNSPCJzYXZlX2ZzcjEiPjsKKworY2xhc3MgUkVTVE9SRV9GU1I8c3RyaW5nIE9wY1N0cj46CisgIFBzZXVkbzwob3V0cyBGU1IxNjokZHN0KSwgCisgICAgICAgICAoaW5zIGk4aW1tOiRvZmZzZXQsIGk4bWVtOiRwdHJsbywgaThpbW06JHB0cmhpKSwgCisgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkcHRybG8sICRvZmZzZXQiKSwKKyAgICAgICAgIFtdPjsgCisKK2RlZiByZXN0b3JlX2ZzcjA6IFJFU1RPUkVfRlNSPCJyZXN0b3JlX2ZzcjAiPjsKK2RlZiByZXN0b3JlX2ZzcjE6IFJFU1RPUkVfRlNSPCJyZXN0b3JlX2ZzcjEiPjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RvcmUgdG8gbWVtb3J5CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRGlyZWN0IHN0b3JlLgorLy8gSW5wdXQgb3BlcmFuZHMgYXJlOiB2YWwgPSBXLCBwdHJsbyA9IEdBLCBvZmZzZXQgPSBvZmZzZXQsIHB0cmhpID0gYmFua3NlbC4KK2xldCBtYXlTdG9yZSA9IDEgaW4KK2NsYXNzIE1PVldGX0lOU048Yml0czw2PiBPcENvZGUsIFNETm9kZSBPcE5vZGVEZXN0LCBTRE5vZGUgT3A+OgorICBCeXRlRm9ybWF0PDAsIChvdXRzKSwgCisgICAgICAgICAgICAgKGlucyBHUFI6JHZhbCwgaThpbW06JG9mZnNldCwgaThtZW06JHB0cmxvLCBpOGltbTokcHRyaGkpLAorICAgICAgICAgICAgICJtb3Z3ZiAke3B0cmxvfSArICR7b2Zmc2V0fSIsCisgICAgICAgICAgICAgWyhPcCBHUFI6JHZhbCwgT3BOb2RlRGVzdDokcHRybG8sIChpOCBpbW06JHB0cmhpKSwgCisgICAgICAgICAgICAgICAoaTggaW1tOiRvZmZzZXQpKV0+OworCisvLyBTdG9yZSBXIHRvIGEgR2xvYmFsIEFkZHJlc3MuCitkZWYgbW92d2YgOiBNT1ZXRl9JTlNOPDAsIHRnbG9iYWxhZGRyLCBQSUMxNlN0b3JlPjsKKworLy8gU3RvcmUgVyB0byBhbiBFeHRlcm5hbCBTeW1vYm9sLgorZGVmIG1vdndmXzEgOiBNT1ZXRl9JTlNOPDAsIHRleHRlcm5hbHN5bSwgUElDMTZTdG9yZT47CisKKy8vIFN0b3JlIHdpdGggSW5GbGFnIGFuZCBPdXRGbGFnCisvLyBUaGlzIGlzIHNhbWUgYXMgbW92d2ZfMSBidXQgaGFzIGEgZmxhZy4gQSBmbGFnIGlzIHJlcXVpcmVkIHRvIAorLy8gb3JkZXIgdGhlIHN0b3JlcyB3aGlsZSBwYXNzaW5nIHRoZSBwYXJhbXMgdG8gZnVuY3Rpb24uCitkZWYgbW92d2ZfMiA6IE1PVldGX0lOU048MCwgdGV4dGVybmFsc3ltLCBQSUMxNlN0V0Y+OworCisvLyBJbmRpcmVjdCBzdG9yZS4gTWF0Y2hlZCB2aWEgYSBEQUcgcmVwbGFjZW1lbnQgcGF0dGVybi4KK2RlZiBzdG9yZV9pbmRpcmVjdCA6IAorICBCeXRlRm9ybWF0PDAsIChvdXRzKSwgCisgICAgICAgICAgICAgKGlucyBHUFI6JHZhbCwgRlNSMTY6JGZzciwgaThpbW06JG9mZnNldCksCisgICAgICAgICAgICAgIm1vdndpICRvZmZzZXRbJGZzcl0iLAorICAgICAgICAgICAgIFtdPjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMb2FkIGZyb20gbWVtb3J5CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpcmVjdCBsb2FkLgorLy8gSW5wdXQgT3BlcmFuZHMgYXJlOiBwdHJsbyA9IEdBLCBvZmZzZXQgPSBvZmZzZXQsIHB0cmhpID0gYmFua3NlbC4KKy8vIE91dHB1dDogZHN0ID0gVworbGV0IERlZnMgPSBbU1RBVFVTXSwgbWF5TG9hZCA9IDEgaW4KK2NsYXNzIE1PVkZfSU5TTjxiaXRzPDY+IE9wQ29kZSwgU0ROb2RlIE9wTm9kZVNyYywgU0ROb2RlIE9wPjoKKyAgQnl0ZUZvcm1hdDwwLCAob3V0cyBHUFI6JGRzdCksIAorICAgICAgICAgICAgIChpbnMgaThpbW06JG9mZnNldCwgaThtZW06JHB0cmxvLCBpOGltbTokcHRyaGkpLAorICAgICAgICAgICAgICJtb3ZmICR7cHRybG99ICsgJHtvZmZzZXR9LCBXIiwKKyAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgCisgICAgICAgICAgICAgICAoT3AgT3BOb2RlU3JjOiRwdHJsbywgKGk4IGltbTokcHRyaGkpLAorICAgICAgICAgICAgICAgKGk4IGltbTokb2Zmc2V0KSkpXT47CisKKy8vIExvYWQgZnJvbSBhIEdBLgorZGVmIG1vdmYgOiBNT1ZGX0lOU048MCwgdGdsb2JhbGFkZHIsIFBJQzE2TG9hZD47CisKKy8vIExvYWQgZnJvbSBhbiBFUy4KK2RlZiBtb3ZmXzEgOiBNT1ZGX0lOU048MCwgdGV4dGVybmFsc3ltLCBQSUMxNkxvYWQ+OworZGVmIG1vdmZfMV8xIDogTU9WRl9JTlNOPDAsIHRleHRlcm5hbHN5bSwgUElDMTZMZEFyZz47CisKKy8vIExvYWQgd2l0aCBJbkZsYWcgYW5kIE91dEZsYWcKKy8vIFRoaXMgaXMgc2FtZSBhcyBtb3ZmXzEgYnV0IGhhcyBhIGZsYWcuIEEgZmxhZyBpcyByZXF1aXJlZCB0byAKKy8vIG9yZGVyIHRoZSBsb2FkcyB3aGlsZSBjb3B5aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbi4KK2RlZiBtb3ZmXzIgOiBNT1ZGX0lOU048MCwgdGV4dGVybmFsc3ltLCBQSUMxNkxkV0Y+OworCisvLyBJbmRpcmVjdCBsb2FkLiBNYXRjaGVkIHZpYSBhIERBRyByZXBsYWNlbWVudCBwYXR0ZXJuLgorZGVmIGxvYWRfaW5kaXJlY3QgOiAKKyAgQnl0ZUZvcm1hdDwwLCAob3V0cyBHUFI6JGRzdCksIAorICAgICAgICAgICAgIChpbnMgRlNSMTY6JGZzciwgaThpbW06JG9mZnNldCksCisgICAgICAgICAgICAgIm1vdml3ICRvZmZzZXRbJGZzcl0iLAorICAgICAgICAgICAgIFtdPjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCaXR3aXNlIG9wZXJhdGlvbnMgcGF0dGVybnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFcgPSBXIG9wIFtGXQorbGV0IERlZnMgPSBbU1RBVFVTXSBpbiB7CitkZWYgT3JGVyA6ICBCaW5PcEZXPDAsICJpb3J3ZiIsIG9yPjsKK2RlZiBYT3JGVyA6IEJpbk9wRlc8MCwgInhvcndmIiwgeG9yPjsKK2RlZiBBbmRGVyA6IEJpbk9wRlc8MCwgImFuZHdmIiwgYW5kPjsKKworLy8gRiA9IFcgb3AgW0ZdCitkZWYgT3JXRiA6ICBCaW5PcFdGPDAsICJpb3J3ZiIsIG9yPjsKK2RlZiBYT3JXRiA6IEJpbk9wV0Y8MCwgInhvcndmIiwgeG9yPjsKK2RlZiBBbmRXRiA6IEJpbk9wV0Y8MCwgImFuZHdmIiwgYW5kPjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpb3VzIGFkZC9zdWIgcGF0dGVybnMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVyA9IFcgKyBbRl0KK2RlZiBhZGRmd18xOiBCaW5PcEZXPDAsICJhZGR3ZiIsIGFkZD47CitkZWYgYWRkZndfMjogQmluT3BGVzwwLCAiYWRkd2YiLCBhZGRjPjsKKworbGV0IFVzZXMgPSBbU1RBVFVTXSBpbgorZGVmIGFkZGZ3YzogQmluT3BGVzwwLCAiYWRkd2ZjIiwgYWRkZT47ICAvLyBXaXRoIENhcnJ5LgorCisvLyBGID0gVyArIFtGXQorZGVmIGFkZHdmXzE6IEJpbk9wV0Y8MCwgImFkZHdmIiwgYWRkPjsKK2RlZiBhZGR3Zl8yOiBCaW5PcFdGPDAsICJhZGR3ZiIsIGFkZGM+OworbGV0IFVzZXMgPSBbU1RBVFVTXSBpbgorZGVmIGFkZHdmYzogQmluT3BXRjwwLCAiYWRkd2ZjIiwgYWRkZT47ICAvLyBXaXRoIENhcnJ5LgorfQorCisvLyBXIC09IFtGXSA7IGxvYWQgZnJvbSBGIGFuZCBzdWIgdGhlIHZhbHVlIGZyb20gVy4KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjID0gJGRzdCIsIG1heUxvYWQgPSAxIGluCitjbGFzcyBTVUJGVzxiaXRzPDY+IE9wQ29kZSwgc3RyaW5nIE9wY1N0ciwgU0ROb2RlIE9wTm9kZT46CisgIEJ5dGVGb3JtYXQ8T3BDb2RlLCAob3V0cyBHUFI6JGRzdCksCisgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgaThpbW06JG9mZnNldCwgaThtZW06JHB0cmxvLCBpOGltbTokcHRyaGkpLAorICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkcHRybG8gKyAkb2Zmc2V0LCBXIiksCisgICAgICAgICAgICAgWyhzZXQgR1BSOiRkc3QsIChPcE5vZGUgKFBJQzE2TG9hZCBkaXJhZGRyOiRwdHJsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IGltbTokcHRyaGkpLCAoaTggaW1tOiRvZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSOiRzcmMpKV0+OworbGV0IERlZnMgPSBbU1RBVFVTXSBpbiB7CitkZWYgc3ViZndfMTogU1VCRlc8MCwgInN1YndmIiwgc3ViPjsKK2RlZiBzdWJmd18yOiBTVUJGVzwwLCAic3Vid2YiLCBzdWJjPjsKKworbGV0IFVzZXMgPSBbU1RBVFVTXSBpbgorZGVmIHN1YmZ3YjogU1VCRlc8MCwgInN1YndmYiIsIHN1YmU+OyAgLy8gV2l0aCBCb3Jyb3cuCisKK30KK2xldCBEZWZzID0gW1NUQVRVU10sIGlzVGVybWluYXRvciA9IDEgaW4KK2RlZiBzdWJmd19jYzogU1VCRlc8MCwgInN1YndmIiwgUElDMTZTdWJjYz47CisKKy8vIFtGXSAtPSBXIDsgCitsZXQgbWF5U3RvcmUgPSAxIGluCitjbGFzcyBTVUJXRjxiaXRzPDY+IE9wQ29kZSwgc3RyaW5nIE9wY1N0ciwgU0ROb2RlIE9wTm9kZT46CisgIEJ5dGVGb3JtYXQ8T3BDb2RlLCAob3V0cyksCisgICAgICAgICAgICAgKGlucyBHUFI6JHNyYywgaThpbW06JG9mZnNldCwgaThtZW06JHB0cmxvLCBpOGltbTokcHRyaGkpLAorICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkcHRybG8gKyAkb2Zmc2V0IiksCisgICAgICAgICAgICAgWyhQSUMxNlN0b3JlIChPcE5vZGUgKFBJQzE2TG9hZCBkaXJhZGRyOiRwdHJsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IGltbTokcHRyaGkpLCAoaTggaW1tOiRvZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSOiRzcmMpLCBkaXJhZGRyOiRwdHJsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IGltbTokcHRyaGkpLCAoaTggaW1tOiRvZmZzZXQpKV0+OworCitsZXQgRGVmcyA9IFtTVEFUVVNdIGluIHsKK2RlZiBzdWJ3Zl8xOiBTVUJXRjwwLCAic3Vid2YiLCBzdWI+OworZGVmIHN1YndmXzI6IFNVQldGPDAsICJzdWJ3ZiIsIHN1YmM+OworCitsZXQgVXNlcyA9IFtTVEFUVVNdIGluCisgIGRlZiBzdWJ3ZmI6IFNVQldGPDAsICJzdWJ3ZmIiLCBzdWJlPjsgIC8vIFdpdGggQm9ycm93LgorCitkZWYgc3Vid2ZfY2M6IFNVQldGPDAsICJzdWJ3ZiIsIFBJQzE2U3ViY2M+OworfQorCisvLyBhZGRsdyAKK2xldCBEZWZzID0gW1NUQVRVU10gaW4geworZGVmIGFkZGx3XzEgOiBCaW5PcFdMPDAsICJhZGRsdyIsIGFkZD47CitkZWYgYWRkbHdfMiA6IEJpbk9wV0w8MCwgImFkZGx3IiwgYWRkYz47CisKK2xldCBVc2VzID0gW1NUQVRVU10gaW4KK2RlZiBhZGRsd2MgOiBCaW5PcFdMPDAsICJhZGRsd2MiLCBhZGRlPjsgLy8gV2l0aCBDYXJyeS4gKEFzc2VtYmxlciBtYWNybykuCisKKy8vIGJpdHdpc2Ugb3BlcmF0aW9ucyBpbnZvbHZpbmcgYSBsaXRlcmFsIGFuZCB3LgorZGVmIGFuZGx3IDogQmluT3BXTDwwLCAiYW5kbHciLCBhbmQ+OworZGVmIHhvcmx3IDogQmluT3BXTDwwLCAieG9ybHciLCB4b3I+OworZGVmIG9ybHcgIDogQmluT3BXTDwwLCAiaW9ybHciLCBvcj47Cit9CisKKy8vIHN1Ymx3IAorLy8gVyA9IEMgLSBXIDsgc3ViIFcgZnJvbSBsaXRlcmFsLiAoV2l0aG91dCBib3Jyb3cpLgorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiBpbgorY2xhc3MgU1VCTFc8Yml0czw2PiBvcGNvZGUsIHN0cmluZyBPcGNTdHIsIFNETm9kZSBPcE5vZGU+IDoKKyAgTGl0ZXJhbEZvcm1hdDxvcGNvZGUsIChvdXRzIEdQUjokZHN0KSwKKyAgICAgICAgICAgICAgICAoaW5zIEdQUjokc3JjLCBpOGltbTokbGl0ZXJhbCksCisgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGxpdGVyYWwiKSwKKyAgICAgICAgICAgICAgICBbKHNldCBHUFI6JGRzdCwgKE9wTm9kZSAoaTggaW1tOiRsaXRlcmFsKSwgR1BSOiRzcmMpKV0+OworLy8gc3Vid2wgCisvLyBXID0gVyAtIEMgOyBzdWIgbGl0ZXJhbCBmcm9tIFcgIChXaXRob3V0IGJvcnJvdykuCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiIGluCitjbGFzcyBTVUJXTDxiaXRzPDY+IG9wY29kZSwgc3RyaW5nIE9wY1N0ciwgU0ROb2RlIE9wTm9kZT4gOgorICBMaXRlcmFsRm9ybWF0PG9wY29kZSwgKG91dHMgR1BSOiRkc3QpLAorICAgICAgICAgICAgICAgIChpbnMgR1BSOiRzcmMsIGk4aW1tOiRsaXRlcmFsKSwKKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkbGl0ZXJhbCIpLAorICAgICAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoT3BOb2RlIEdQUjokc3JjLCAoaTggaW1tOiRsaXRlcmFsKSkpXT47CisKK2xldCBEZWZzID0gW1NUQVRVU10gaW4geworZGVmIHN1Ymx3XzEgOiBTVUJMVzwwLCAic3VibHciLCBzdWI+OworZGVmIHN1Ymx3XzIgOiBTVUJMVzwwLCAic3VibHciLCBzdWJjPjsKK2RlZiBzdWJsd18zIDogU1VCTFc8MCwgInN1Ymx3YiIsIHN1YmU+OyAvLyBXaXRoIGJvcnJvdyAoQXNzZW1ibGVyIG1hY3JvKS4KKworZGVmIHN1Ymx3XzQgOiBTVUJXTDwwLCAic3Vid2wiLCBzdWI+OyAgIC8vIEFzc2VtYmxlciBtYWNybyByZXBsYWNlIHdpdGggYWRkbHcKK2RlZiBzdWJsd181IDogU1VCV0w8MCwgInN1YndsIiwgc3ViYz47ICAvLyBBc3NlbWJsZXIgbWFjcm8gcmVwbGFjZSB3aXRoIGFkZGx3CitkZWYgc3VibHdfNiA6IFNVQldMPDAsICJzdWJ3bGIiLCBzdWJlPjsgLy8gV2l0aCBib3Jyb3cgKEFzc2VtYmxlciBtYWNybykuCit9CitsZXQgRGVmcyA9IFtTVEFUVVNdLCBpc1Rlcm1pbmF0b3IgPSAxIGluIAorZGVmIHN1Ymx3X2NjIDogU1VCTFc8MCwgInN1Ymx3IiwgUElDMTZTdWJjYz47CisKKy8vIENhbGwgaW5zdHJ1Y3Rpb24uCitsZXQgaXNDYWxsID0gMSwKKyAgICBEZWZzID0gW1csIEZTUjAsIEZTUjFdIGluIHsKKyAgICBkZWYgQ0FMTDogTGl0ZXJhbEZvcm1hdDwweDEsIChvdXRzKSwgKGlucyBpOGltbTokZnVuYyksCisgICAgICAgICAgICAvLyJjYWxsICR7ZnVuY30gKyAyIiwKKyAgICAgICAgICAgICJjYWxsICR7ZnVuY30iLAorICAgICAgICAgICAgWyhQSUMxNmNhbGwgZGlyYWRkcjokZnVuYyldPjsKK30KKworbGV0IGlzQ2FsbCA9IDEsCisgICAgRGVmcyA9IFtXLCBGU1IwLCBGU1IxXSBpbiB7CisgICAgZGVmIENBTExfMTogTGl0ZXJhbEZvcm1hdDwweDEsIChvdXRzKSwgKGlucyBHUFI6JGZ1bmMsIFBDTEFUSFI6JHBjKSwKKyAgICAgICAgICAgICJjYWxsdyIsCisgICAgICAgICAgICBbKFBJQzE2Y2FsbCAoUElDMTZDb25uZWN0IEdQUjokZnVuYywgUENMQVRIUjokcGMpKV0+OworfQorCitsZXQgaXNDYWxsID0gMSwKKyAgICBEZWZzID0gW0ZTUjAsIEZTUjFdIGluIHsKKyAgICBkZWYgQ0FMTFc6IExpdGVyYWxGb3JtYXQ8MHgxLCAob3V0cyBHUFI6JGRlc3QpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdQUjokZnVuYywgUENMQVRIUjokcGMpLAorICAgICAgICAgICAgImNhbGx3IiwKKyAgICAgICAgICAgIFsoc2V0IEdQUjokZGVzdCwgKFBJQzE2Y2FsbHcgKFBJQzE2Q29ubmVjdCBHUFI6JGZ1bmMsIFBDTEFUSFI6JHBjKSkpXT47Cit9CisKK2xldCBVc2VzID0gW1NUQVRVU10sIGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaGFzRGVsYXlTbG90ID0gMCBpbgorZGVmIHBpYzE2YnJjb25kOiBDb250cm9sRm9ybWF0PDB4MCwgKG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QsIENDT3A6JGNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImIkY2MgJGRzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoUElDMTZCcmNvbmQgYmI6JGRzdCwgaW1tOiRjYyldPjsKKworLy8gVW5jb25kaXRpb25hbCBicmFuY2guCitsZXQgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBoYXNEZWxheVNsb3QgPSAwIGluCitkZWYgYnJfdW5jb25kOiBDb250cm9sRm9ybWF0PDB4MCwgKG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZ290byAkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyhiciBiYjokZHN0KV0+OworCisvLyBTRUxFQ1RfQ0NfKiAtIFVzZWQgdG8gaW1wbGVtZW50IHRoZSBTRUxFQ1RfQ0MgREFHIG9wZXJhdGlvbi4gIEV4cGFuZGVkIGFmdGVyCisvLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gaW50byBhIGJyYW5jaCBzZXF1ZW5jZS4KK2xldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxIGluIHsgICAvLyBFeHBhbmRlZCBhZnRlciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisgIGRlZiBTRUxFQ1RfQ0NfSW50X0lDQworICAgOiBQc2V1ZG88KG91dHMgR1BSOiRkc3QpLCAoaW5zIEdQUjokVCwgR1BSOiRGLCBpOGltbTokQ29uZCksCisgICAgICAgICAgICAiOyBTRUxFQ1RfQ0NfSW50X0lDQyBQU0VVRE8hIiwKKyAgICAgICAgICAgIFsoc2V0IEdQUjokZHN0LCAoUElDMTZTZWxlY3RpY2MgR1BSOiRULCBHUFI6JEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JENvbmQpKV0+OworfQorCisKKy8vIEJhbmtzZWwuCitkZWYgYmFua3NlbCA6IAorICBQc2V1ZG88KG91dHMpLAorICAgICAgICAgKGlucyBpOG1lbTokcHRyKSwKKyAgICAgICAgICJiYW5rc2VsICRwdHIiLAorICAgICAgICAgW10+OworCitkZWYgcGFnZXNlbCA6IAorICBQc2V1ZG88KG91dHMpLAorICAgICAgICAgKGlucyBpOG1lbTokcHRyKSwKKyAgICAgICAgICJtb3ZscCAkcHRyIiwKKyAgICAgICAgIFtdPjsKKworCisvLyBSZXR1cm4gaW5zbi4KK2xldCBpc1Rlcm1pbmF0b3IgPSAxLCBpc0JhcnJpZXIgPSAxLCBpc1JldHVybiA9IDEgaW4KK2RlZiBSZXR1cm4gOiAKKyAgQ29udHJvbEZvcm1hdDwwLCAob3V0cyksIChpbnMpLCAicmV0dXJuIiwgWyhQSUMxNnJldCldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBJQzE2IFJlcGxhY21lbnQgUGF0dGVybnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBJZGVudGlmeSBhbiBpbmRpcmVjdCBzdG9yZSBhbmQgc2VsZWN0IGluc25zIGZvciBpdC4KK2RlZiA6IFBhdDwoUElDMTZTdG9yZSBHUFI6JHZhbCwgKE1UTE8gR1BSOiRsb2FkZHIpLCAoTVRISSBHUFI6JGhpYWRkciksIAorICAgICAgICAgICBpbW06JG9mZnNldCksCisgICAgICAgICAgKHN0b3JlX2luZGlyZWN0IEdQUjokdmFsLCAKKyAgICAgICAgICAgKHNldF9mc3JoaSAoc2V0X2ZzcmxvIEdQUjokbG9hZGRyKSwgR1BSOiRoaWFkZHIpLAorICAgICAgICAgICBpbW06JG9mZnNldCk+OworCitkZWYgOiBQYXQ8KFBJQzE2U3RXRiBHUFI6JHZhbCwgKE1UTE8gR1BSOiRsb2FkZHIpLCAoTVRISSBHUFI6JGhpYWRkciksIAorICAgICAgICAgICBpbW06JG9mZnNldCksCisgICAgICAgICAgKHN0b3JlX2luZGlyZWN0IEdQUjokdmFsLCAKKyAgICAgICAgICAgKHNldF9mc3JoaSAoc2V0X2ZzcmxvIEdQUjokbG9hZGRyKSwgR1BSOiRoaWFkZHIpLAorICAgICAgICAgICBpbW06JG9mZnNldCk+OworCisvLyBJZGVudGlmeSBhbiBpbmRpcmVjdCBsb2FkIGFuZCBzZWxlY3QgaW5zbnMgZm9yIGl0LgorZGVmIDogUGF0PChQSUMxNkxvYWQgKE1UTE8gR1BSOiRsb2FkZHIpLCAoTVRISSBHUFI6JGhpYWRkciksIAorICAgICAgICAgICBpbW06JG9mZnNldCksCisgICAgICAgICAgKGxvYWRfaW5kaXJlY3QgIChzZXRfZnNyaGkgKHNldF9mc3JsbyBHUFI6JGxvYWRkciksIEdQUjokaGlhZGRyKSwKKyAgICAgICAgICAgaW1tOiRvZmZzZXQpPjsKKworZGVmIDogUGF0PChQSUMxNkxkV0YgKE1UTE8gR1BSOiRsb2FkZHIpLCAoTVRISSBHUFI6JGhpYWRkciksIAorICAgICAgICAgICBpbW06JG9mZnNldCksCisgICAgICAgICAgKGxvYWRfaW5kaXJlY3QgIChzZXRfZnNyaGkgKHNldF9mc3JsbyBHUFI6JGxvYWRkciksIEdQUjokaGlhZGRyKSwKKyAgICAgICAgICAgaW1tOiRvZmZzZXQpPjsKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNk1DQXNtSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2TUNBc21JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmNjNDk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNk1DQXNtSW5mby5jcHAKQEAgLTAsMCArMSw1OSBAQAorLy89PT0tLSBQSUMxNk1DQXNtSW5mby5jcHAgLSBQSUMxNiBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2YgdGhlIFBJQzE2TUNBc21JbmZvIHByb3BlcnRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlBJQzE2TUNBc21JbmZvLmgiCisKKy8vIEZJWE1FOiBMYXllcmluZyB2aW9sYXRpb24gdG8gZ2V0IGVudW1zIGFuZCBzdGF0aWMgZnVuY3Rpb24sIHNob3VsZCBiZSBtb3ZlZAorLy8gdG8gc2VwYXJhdGUgaGVhZGVycy4KKyNpbmNsdWRlICJQSUMxNi5oIgorI2luY2x1ZGUgIlBJQzE2QUJJTmFtZXMuaCIKKyNpbmNsdWRlICJQSUMxNklTZWxMb3dlcmluZy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1BJQzE2TUNBc21JbmZvOjpQSUMxNk1DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCkgeworICBDb21tZW50U3RyaW5nID0gIjsiOworICBHbG9iYWxQcmVmaXggPSBQQU46OmdldFRhZ05hbWUoUEFOOjpQUkVGSVhfU1lNQk9MKTsKKyAgR2xvYmFsRGlyZWN0aXZlID0gIlx0Z2xvYmFsXHQiOworICBFeHRlcm5EaXJlY3RpdmUgPSAiXHRleHRlcm5cdCI7CisKKyAgRGF0YThiaXRzRGlyZWN0aXZlID0gIiBkYiAiOworICBEYXRhMTZiaXRzRGlyZWN0aXZlID0gIiBkdyAiOworICBEYXRhMzJiaXRzRGlyZWN0aXZlID0gIiBkbCAiOworICBEYXRhNjRiaXRzRGlyZWN0aXZlID0gTlVMTDsKKyAgWmVyb0RpcmVjdGl2ZSA9IE5VTEw7CisgIEFzY2lpRGlyZWN0aXZlID0gIiBkdCAiOworICBBc2NpekRpcmVjdGl2ZSA9IE5VTEw7CisgICAgCisgIFJvbURhdGE4Yml0c0RpcmVjdGl2ZSA9ICIgZHcgIjsKKyAgUm9tRGF0YTE2Yml0c0RpcmVjdGl2ZSA9ICIgcm9tX2RpICI7CisgIFJvbURhdGEzMmJpdHNEaXJlY3RpdmUgPSAiIHJvbV9kbCAiOworICBIYXNTZXREaXJlY3RpdmUgPSBmYWxzZTsgIAorICAgIAorICAvLyBTZXQgaXQgdG8gZmFsc2UgYmVjYXVzZSB3ZSB3ZWVkIHRvIGdlbmVyYXRlIGMgZmlsZSBuYW1lIGFuZCBub3QgYmMgZmlsZQorICAvLyBuYW1lLgorICBIYXNTaW5nbGVQYXJhbWV0ZXJEb3RGaWxlID0gZmFsc2U7Cit9CisKK2NvbnN0IGNoYXIgKlBJQzE2TUNBc21JbmZvOjpnZXREYXRhQVNEaXJlY3RpdmUodW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQVMpIGNvbnN0IHsKKyAgaWYgKEFTICE9IFBJQzE2SVNEOjpST01fU1BBQ0UpCisgICAgcmV0dXJuIDA7CisgIAorICBzd2l0Y2ggKFNpemUpIHsKKyAgY2FzZSAgODogcmV0dXJuIFJvbURhdGE4Yml0c0RpcmVjdGl2ZTsKKyAgY2FzZSAxNjogcmV0dXJuIFJvbURhdGExNmJpdHNEaXJlY3RpdmU7CisgIGNhc2UgMzI6IHJldHVybiBSb21EYXRhMzJiaXRzRGlyZWN0aXZlOworICBkZWZhdWx0OiByZXR1cm4gTlVMTDsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2TUNBc21JbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2TUNBc21JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxYzExMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZNQ0FzbUluZm8uaApAQCAtMCwwICsxLDM1IEBACisvLz09PT09LS0gUElDMTZNQ0FzbUluZm8uaCAtIFBJQzE2IGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBQSUMxNk1DQXNtSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFBJQzE2VEFSR0VUQVNNSU5GT19ICisjZGVmaW5lIFBJQzE2VEFSR0VUQVNNSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFRhcmdldDsKKyAgY2xhc3MgU3RyaW5nUmVmOworCisgIGNsYXNzIFBJQzE2TUNBc21JbmZvIDogcHVibGljIE1DQXNtSW5mbyB7CisgICAgY29uc3QgY2hhciAqUm9tRGF0YThiaXRzRGlyZWN0aXZlOworICAgIGNvbnN0IGNoYXIgKlJvbURhdGExNmJpdHNEaXJlY3RpdmU7CisgICAgY29uc3QgY2hhciAqUm9tRGF0YTMyYml0c0RpcmVjdGl2ZTsKKyAgcHVibGljOiAgICAKKyAgICBQSUMxNk1DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCk7CisgICAgCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXREYXRhQVNEaXJlY3RpdmUodW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgQVMpIGNvbnN0OworICB9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZNYWNoaW5lRnVuY3Rpb25JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmNTA4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZNYWNoaW5lRnVuY3Rpb25JbmZvLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT09LSBQSUMxNk1hY2hpbmVGdWN0aW9uSW5mby5oIC0gUElDMTYgbWFjaGluZSBmdW5jdGlvbiBpbmZvIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgUElDMTYtc3BlY2lmaWMgcGVyLW1hY2hpbmUtZnVuY3Rpb24gaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQSUMxNk1BQ0hJTkVGVU5DVElPTklORk9fSAorI2RlZmluZSBQSUMxNk1BQ0hJTkVGVU5DVElPTklORk9fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8gLSBUaGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSBNYWNoaW5lRnVuY3Rpb24KKy8vLyBwcml2YXRlIFBJQzE2IHRhcmdldC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBNYWNoaW5lRnVuY3Rpb24uCitjbGFzcyBQSUMxNk1hY2hpbmVGdW5jdGlvbkluZm8gOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uSW5mbyB7CisgIC8vIFRoZSBmcmFtZWluZGV4ZXMgZ2VuZXJhdGVkIGZvciBzcGlsbC9yZWxvYWQgYXJlIHN0YWNrIGJhc2VkLgorICAvLyBUaGlzIG1hcHMgbWFpbnRhaW4gemVybyBiYXNlZCBpbmRleGVzIGZvciB0aGVzZSBGSXMuCisgIHN0ZDo6bWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gRmlUbXBPZmZzZXRNYXA7CisgIHVuc2lnbmVkIFRtcFNpemU7CisKKyAgLy8gVGhlc2UgYXJlIHRoZSBmcmFtZXMgZm9yIHJldHVybiB2YWx1ZSBhbmQgYXJndW1lbnQgcGFzc2luZyAKKyAgLy8gVGhlc2UgRnJhbWVJbmRpY2VzIHdpbGwgYmUgZXhwYW5kZWQgdG8gZm9vLmZyYW1lIGV4dGVybmFsIHN5bWJvbAorICAvLyBhbmQgYWxsIG90aGVycyB3aWxsIGJlIGV4cGFuZGVkIHRvIGZvby50bXAgZXh0ZXJuYWwgc3ltYm9sLgorICB1bnNpZ25lZCBSZXNlcnZlZEZyYW1lQ291bnQ7CisKK3B1YmxpYzoKKyAgUElDMTZNYWNoaW5lRnVuY3Rpb25JbmZvKCkKKyAgICA6IFRtcFNpemUoMCksIFJlc2VydmVkRnJhbWVDb3VudCgwKSB7fQorCisgIGV4cGxpY2l0IFBJQzE2TWFjaGluZUZ1bmN0aW9uSW5mbyhNYWNoaW5lRnVuY3Rpb24gJk1GKQorICAgIDogVG1wU2l6ZSgwKSwgUmVzZXJ2ZWRGcmFtZUNvdW50KDApIHt9CisKKyAgc3RkOjptYXA8dW5zaWduZWQsIHVuc2lnbmVkPiAmZ2V0RmlUbXBPZmZzZXRNYXAoKSB7IHJldHVybiBGaVRtcE9mZnNldE1hcDsgfQorCisgIHVuc2lnbmVkIGdldFRtcFNpemUoKSBjb25zdCB7IHJldHVybiBUbXBTaXplOyB9CisgIHZvaWQgc2V0VG1wU2l6ZSh1bnNpZ25lZCBTaXplKSB7IFRtcFNpemUgPSBTaXplOyB9CisKKyAgdW5zaWduZWQgZ2V0UmVzZXJ2ZWRGcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gUmVzZXJ2ZWRGcmFtZUNvdW50OyB9CisgIHZvaWQgc2V0UmVzZXJ2ZWRGcmFtZUNvdW50KHVuc2lnbmVkIENvdW50KSB7IFJlc2VydmVkRnJhbWVDb3VudCA9IENvdW50OyB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZNZW1TZWxPcHQuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNk1lbVNlbE9wdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhYTM4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZNZW1TZWxPcHQuY3BwCkBAIC0wLDAgKzEsMjU0IEBACisvLz09PS0tIFBJQzE2TWVtU2VsT3B0LmNwcCAtIFBJQzE2IGJhbmtzZWwgb3B0aW1pemVyICAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHBhc3Mgd2hpY2ggb3B0aW1pemVzIHRoZSBlbWl0dGluZyBvZiBiYW5rc2VsIAorLy8gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBhY2Nlc3NpbmcgZGF0YSBtZW1vcnkuIFRoaXMgY3VycmVudGx5IHdvcmtzIHdpdGhpbgorLy8gYSBiYXNpYyBibG9jayBvbmx5IGFuZCBrZWVwIHRyYWNrcyBvZiB0aGUgbGFzdCBhY2Nlc3NlZCBtZW1vcnkgYmFuay4KKy8vIElmIG1lbW9yeSBhY2Nlc3MgY29udGludWVzIHRvIGJlIGluIHRoZSBzYW1lIGJhbmsgaXQganVzdCBtYWtlcyBiYW5rc2VsCisvLyBpbW1lZGlhdGUsIHdoaWNoIGlzIGEgcGFydCBvZiB0aGUgaW5zbiBhY2Nlc3NpbmcgdGhlIGRhdGEgbWVtb3J5LCBmcm9tIDEKKy8vIHRvIHplcm8uIFRoZSBhc20gcHJpbnRlciBlbWl0cyBhIGJhbmtzZWwgb25seSBpZiB0aGF0IGltbWVkaWF0ZSBpcyAxLiAKKy8vCisvLyBGSVhNRTogdGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiAgVGhlIGJhbmtzZWwgcGFzcyBvbmx5IHdvcmtzIG9uIGxvY2FsCisvLyBiYXNpYyBibG9ja3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwaWMxNi1jb2RlZ2VuIgorI2luY2x1ZGUgIlBJQzE2LmgiCisjaW5jbHVkZSAiUElDMTZBQklOYW1lcy5oIgorI2luY2x1ZGUgIlBJQzE2SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiUElDMTZNQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJQSUMxNlRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBNZW1TZWxPcHQgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgTWVtU2VsT3B0KCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLmFkZFByZXNlcnZlZElEKE1hY2hpbmVMb29wSW5mb0lEKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZElEKE1hY2hpbmVEb21pbmF0b3JzSUQpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsgCisgICAgICByZXR1cm4gIlBJQzE2IE1lbXNlbCBPcHRpbWl6ZXIiOyAKKyAgICB9CisKKyAgIGJvb2wgcHJvY2Vzc0Jhc2ljQmxvY2soTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisgICBib29sIHByb2Nlc3NJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JKTsKKworICBwcml2YXRlOgorICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOyAvLyBNYWNoaW5lIGluc3RydWN0aW9uIGluZm8uCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQjsgICAgIC8vIEN1cnJlbnQgYmFzaWMgYmxvY2sKKyAgICBzdGQ6OnN0cmluZyBDdXJCYW5rOworICAgIGludCBQYWdlQ2hhbmdlZDsKKworICB9OworICBjaGFyIE1lbVNlbE9wdDo6SUQgPSAwOworfQorCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZVBJQzE2TWVtU2VsT3B0aW1pemVyUGFzcygpIHsgCisgIHJldHVybiBuZXcgTWVtU2VsT3B0KCk7IAorfQorCisKKy8vLyBydW5Pbk1hY2hpbmVGdW5jdGlvbiAtIExvb3Agb3ZlciBhbGwgb2YgdGhlIGJhc2ljIGJsb2NrcywgdHJhbnNmb3JtaW5nIEZQCisvLy8gcmVnaXN0ZXIgcmVmZXJlbmNlcyBpbnRvIEZQIHN0YWNrIHJlZmVyZW5jZXMuCisvLy8KK2Jvb2wgTWVtU2VsT3B0OjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIFRJSSA9IE1GLmdldFRhcmdldCgpLmdldEluc3RySW5mbygpOworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBDaGFuZ2VkIHw9IHByb2Nlc3NCYXNpY0Jsb2NrKE1GLCAqSSk7CisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIHByb2Nlc3NCYXNpY0Jsb2NrIC0gTG9vcCBvdmVyIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBiYXNpYyBibG9jaywKKy8vLyB0cmFuc2Zvcm1pbmcgRlAgaW5zdHJ1Y3Rpb25zIGludG8gdGhlaXIgc3RhY2sgZm9ybS4KKy8vLworYm9vbCBNZW1TZWxPcHQ6OnByb2Nlc3NCYXNpY0Jsb2NrKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZCQikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgTUJCID0gJkJCOworCisgIC8vIExldCB1cyBhc3N1bWUgdGhhdCB3aGVuIGVudGVyaW5nIGEgYmFzaWMgYmxvY2sgbm93IGJhbmsgaXMgc2VsZWN0ZWQuCisgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIHByZWRlY2Vzc29ycyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KKyAgQ3VyQmFuaz0iIjsgCisgIFBhZ2VDaGFuZ2VkPTA7CisKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEk7CisgIGZvciAoSSA9IEJCLmJlZ2luKCk7IEkgIT0gQkIuZW5kKCk7ICsrSSkgeworICAgIENoYW5nZWQgfD0gcHJvY2Vzc0luc3RydWN0aW9uKEkpOworCisgICAgLy8gaWYgdGhlIHBhZ2UgaGFzIGNoYW5nZWQgaW5zZXJ0IGEgcGFnZSBzZWwgYmVmb3JlIAorICAgIC8vIGFueSBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIG9uZQorICAgIGlmIChQYWdlQ2hhbmdlZCA9PSAxKQorICAgIHsKKyAgICAgIC8vIFJlc3RvcmUgdGhlIHBhZ2UgaWYgaXQgd2FzIGNoYW5nZWQsIGJlZm9yZSBsZWF2aW5nIHRoZSBiYXNpYyBibG9jaywKKyAgICAgIC8vIGJlY2F1c2UgaXQgbWF5IGJlIHJlcXVpcmVkIGJ5IHRoZSBnb3RvIHRlcm1pbmF0b3Igb3IgdGhlIGZhbGwgdGhydQorICAgICAgLy8gYmFzaWMgYmxjb2suCisgICAgICAvLyBJZiB0aGUgdGVybWluYXRvciBpcyByZXR1cm4sIHdlIGRvbid0IG5lZWQgdG8gcmVzdG9yZSBzaW5jZSB0aGVyZQorICAgICAgLy8gaXMgbm8gZ290byBvciBmYWxsIHRocnUgYmFzaWMgYmxvY2suCisgICAgICBpZiAoKEktPmdldE9wY29kZSgpID09IFBJQzE2OjpzdWJsd18zKSB8fCAvL21hY3JvIGhhcyBnb3RvCisgICAgICAgICAgKEktPmdldE9wY29kZSgpID09IFBJQzE2OjpzdWJsd182KSB8fCAvL21hY3JvIGhhcyBnb3RvCisgICAgICAgICAgKEktPmdldE9wY29kZSgpID09IFBJQzE2OjphZGRsd2MpICB8fCAvL21hY3JvIGhhcyBnb3RvCisgICAgICAgICAgKFRJSS0+Z2V0KEktPmdldE9wY29kZSgpKS5pc0JyYW5jaCgpKSkKKyAgICAgIHsKKyAgICAgICAgRGVidWdMb2MgZGwgPSBJLT5nZXREZWJ1Z0xvYygpOworICAgICAgICBCdWlsZE1JKCpNQkIsIEksIGRsLCBUSUktPmdldChQSUMxNjo6cGFnZXNlbCkpLmFkZEV4dGVybmFsU3ltYm9sKCIkIik7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBQYWdlQ2hhbmdlZCA9IDA7ICAgICAgICAgICAgCisgICAgICB9CisgICAgfQorICB9CisKKyAgIC8vIFRoZSBiYXNpYyBibG9jayBpcyBvdmVyLCBidXQgaWYgd2UgZGlkIG5vdCBmaW5kIGFueSBnb3RvIHlldCwKKyAgIC8vIHdlIGhhdmVuJ3QgcmVzdG9yZWQgdGhlIHBhZ2UuCisgICAvLyBSZXN0b3JlIHRoZSBwYWdlIGlmIGl0IHdhcyBjaGFuZ2VkLCBiZWZvcmUgbGVhdmluZyB0aGUgYmFzaWMgYmxvY2ssCisgICAvLyBiZWNhdXNlIGl0IG1heSBiZSByZXF1aXJlZCBieSBmYWxsIHRocnUgYmFzaWMgYmxjb2suCisgICAvLyBJZiB0aGUgdGVybWluYXRvciBpcyByZXR1cm4sIHdlIGRvbid0IG5lZWQgdG8gcmVzdG9yZSBzaW5jZSB0aGVyZQorICAgLy8gaXMgZmFsbCB0aHJ1IGJhc2ljIGJsb2NrLgorICAgaWYgKFBhZ2VDaGFuZ2VkID09IDEpIHsKKyAgICAgIC8vIHNhdmUgdGhlIGVuZCBwb2ludGVyIGJlZm9yZSB3ZSBtb3ZlIGJhY2sgdG8gbGFzdCBpbnNuLgorICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSiA9IEk7CisgICAgIEktLTsKKyAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBUSUktPmdldChJLT5nZXRPcGNvZGUoKSk7CisgICAgIGlmICghIFRJRC5pc1JldHVybigpKQorICAgICB7CisgICAgICAgRGVidWdMb2MgZGwgPSBJLT5nZXREZWJ1Z0xvYygpOworICAgICAgIEJ1aWxkTUkoKk1CQiwgSiwgZGwsIAorICAgICAgICAgICAgICAgVElJLT5nZXQoUElDMTY6OnBhZ2VzZWwpKS5hZGRFeHRlcm5hbFN5bWJvbCgiJCIpOworICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgIFBhZ2VDaGFuZ2VkID0gMDsKKyAgICAgfQorICAgfQorCisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2Jvb2wgTWVtU2VsT3B0Ojpwcm9jZXNzSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICB1bnNpZ25lZCBOdW1PcGVyYW5kcyA9IE1JLT5nZXROdW1PcGVyYW5kcygpOworICBpZiAoTnVtT3BlcmFuZHMgPT0gMCkgcmV0dXJuIGZhbHNlOworCisKKyAgLy8gSWYgdGhpcyBpbnNuIGlzIG5vdCBnb2luZyB0byBhY2Nlc3MgYW55IG1lbW9yeSwgcmV0dXJuLgorICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IFRJSS0+Z2V0KE1JLT5nZXRPcGNvZGUoKSk7CisgIGlmICghKFRJRC5pc0JyYW5jaCgpIHx8IFRJRC5pc0NhbGwoKSB8fCBUSUQubWF5TG9hZCgpIHx8IFRJRC5tYXlTdG9yZSgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVGhlIGZpcnN0IHRoaW5nIHdlIHNob3VsZCBkbyBpcyB0aGF0IHJlY29yZCBpZiBiYW5rc2VsL3BhZ2VzZWwgYXJlCisgIC8vIGNoYW5nZWQgaW4gYW4gdW5rbm93biB3YXkuIFRoaXMgY2FuIGhhcHBlbmQgdmlhIGFueSB0eXBlIG9mIGNhbGwuIAorICAvLyBXZSBkbyBpdCBoZXJlIGZpcnN0IGJlZm9yZSBzY2FubmluZyBvZiBNZW1PcCAvIEJCT3AgYXMgdGhlIGluZGlyZWN0CisgIC8vIGNhbGwgaW5zbnMgZG8gbm90IGhhdmUgYW55IG9wZXJhbmRzLCBidXQgdGhleSBzdGlsbCBtYXkgY2hhbmdlIGJhbmsvcGFnZS4KKyAgaWYgKFRJRC5pc0NhbGwoKSkgeworICAgIC8vIFJlY29yZCB0aGF0IHdlIGhhdmUgY2hhbmdlZCB0aGUgcGFnZSwgc28gdGhhdCB3ZSBjYW4gcmVzdG9yZSBpdAorICAgIC8vIGJlZm9yZSBiYXNpYyBibG9jayBlbmRzLgorICAgIC8vIFdlIHJlcXVpcmUgdG8gc2lnbmFsIHRoYXQgYSBwYWdlIGFuYyBiYW5rIGNoYW5nZSBoYXBwZW5lZCBldmVuIGZvcgorICAgIC8vIGluZGlyZWN0IGNhbGxzLiAKKyAgICBQYWdlQ2hhbmdlZCA9IDE7CisKKyAgICAvLyBXaGVuIGEgY2FsbCBpcyBtYWRlLCB0aGVyZSBtYXkgYmUgYmFua3NlbCBmb3IgdmFyaWFibGVzIGluIGNhbGxlZS4KKyAgICAvLyBIZW5jZSB0aGUgYmFua3NlbCBpbiBjYWxsZXIgbmVlZHMgdG8gYmUgcmVzZXQuCisgICAgQ3VyQmFuayA9ICIiOworICB9CisKKyAgLy8gU2NhbiBmb3IgdGhlIG1lbW9yeSBhZGRyZXNzIG9wZXJhbmQuCisgIC8vIEZJWE1FOiBTaG91bGQgd2UgdXNlIHN0YW5kYXJkIGludGVyZmFjZXMgbGlrZSBtZW1vcGVyYW5kc19pdGVyYXRvciwKKyAgLy8gaGFzTWVtT3BlcmFuZCgpIGV0YyA/CisgIGludCBNZW1PcFBvcyA9IC0xOworICBpbnQgQkJPcFBvcyA9IC0xOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtT3BlcmFuZHM7IGkrKykgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKE9wLmdldFR5cGUoKSA9PSAgTWFjaGluZU9wZXJhbmQ6Ok1PX0dsb2JhbEFkZHJlc3MgfHwKKyAgICAgICAgT3AuZ2V0VHlwZSgpID09ICBNYWNoaW5lT3BlcmFuZDo6TU9fRXh0ZXJuYWxTeW1ib2wpIHsgCisgICAgICAvLyBXZSBmb3VuZCBvbmUgbWVtIG9wZXJhbmQuIE5leHQgb25lIG1heSBiZSBCUy4KKyAgICAgIE1lbU9wUG9zID0gaTsKKyAgICB9CisgICAgaWYgKE9wLmdldFR5cGUoKSA9PSAgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrKSB7CisgICAgICAvLyBXZSBmb3VuZCBvbmUgQkIgb3BlcmFuZC4gTmV4dCBvbmUgbWF5IGJlIHBhZ2VzZWwuCisgICAgICBCQk9wUG9zID0gaTsKKyAgICB9CisgIH0KKworICAvLyBJZiB3ZSBkaWQgbm90IGZpbmQgYW4gaW5zbiBhY2Nlc3NpbmcgbWVtb3J5LiBDb250aW51ZS4KKyAgaWYgKChNZW1PcFBvcyA9PSAtMSkgJiYKKyAgICAgIChCQk9wUG9zID09IC0xKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGFzc2VydCAoKEJCT3BQb3MgIT0gTWVtT3BQb3MpICYmICJvcGVyYW5kIGNhbiBvbmx5IGJlIG9mIG9uZSB0eXBlIik7CisgCisKKyAgLy8gSWYgdGhpcyBpcyBhIHBhZ2VzZWwgbWF0ZXJpYWwsIGhhbmRsZSBpdCBmaXJzdC4KKyAgLy8gQ0FMTCBhbmQgYnJfdWNvbmQgaW5zbnMgdXNlIE1lbU9wIChHQSBvciBFUykgYW5kIG5vdCBCQk9wLgorICAvLyBQYWdlc2VsIGlzIHJlcXVpcmVkIG9ubHkgZm9yIGEgZGlyZWN0IGNhbGwuCisgIGlmICgoTUktPmdldE9wY29kZSgpID09IFBJQzE2OjpDQUxMKSkgeworICAgIC8vIEdldCB0aGUgQkJPcC4KKyAgICBNYWNoaW5lT3BlcmFuZCAmTWVtT3AgPSBNSS0+Z2V0T3BlcmFuZChNZW1PcFBvcyk7CisgICAgRGVidWdMb2MgZGwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgICBCdWlsZE1JKCpNQkIsIE1JLCBkbCwgVElJLT5nZXQoUElDMTY6OnBhZ2VzZWwpKS5hZGRPcGVyYW5kKE1lbU9wKTsgICAKKworICAgIC8vIENBTEwgYW5kIGJyX3Vjb25kIG5lZWRzIG9ubHkgcGFnZXNlbC4gc28gd2UgYXJlIGRvbmUuCisgICAgcmV0dXJuIHRydWU7IAorICB9CisKKyAgLy8gUGFnZXNlbCBpcyBoYW5kbGVkLiBOb3csIGFkZCBhIEJhbmtzZWwgaWYgbmVlZGVkLgorICBpZiAoTWVtT3BQb3MgPT0gLTEpIHJldHVybiBDaGFuZ2VkOworICAvLyBHZXQgdGhlIE1lbU9wLgorICBNYWNoaW5lT3BlcmFuZCAmT3AgPSBNSS0+Z2V0T3BlcmFuZChNZW1PcFBvcyk7CisKKyAgLy8gR2V0IHRoZSBzZWN0aW9uIG5hbWUoTmV3QmFuaykgZm9yIE1lbU9wLgorICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgc2VjdGlvbiBuYW1lcyBmb3IgZ2xvYmFscyBhcmUgYWxyZWFkeSBzZXQgYnkKKyAgLy8gQXNtUHJpbnRlci0+ZG9Jbml0aWFsaXphdGlvbi4KKyAgc3RkOjpzdHJpbmcgTmV3QmFuayA9IEN1ckJhbms7CisgIGJvb2wgaGFzRXh0ZXJuYWxMaW5rYWdlID0gZmFsc2U7CisgIGlmIChPcC5nZXRUeXBlKCkgPT0gIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzICYmCisgICAgICBPcC5nZXRHbG9iYWwoKS0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSA9PSBQSUMxNklTRDo6UkFNX1NQQUNFKSB7CisgICAgaWYgKE9wLmdldEdsb2JhbCgpLT5oYXNFeHRlcm5hbExpbmthZ2UoKSkKKyAgICAgIGhhc0V4dGVybmFsTGlua2FnZT0gdHJ1ZTsKKyAgICBOZXdCYW5rID0gT3AuZ2V0R2xvYmFsKCktPmdldFNlY3Rpb24oKTsKKyAgfSBlbHNlIGlmIChPcC5nZXRUeXBlKCkgPT0gIE1hY2hpbmVPcGVyYW5kOjpNT19FeHRlcm5hbFN5bWJvbCkgeworICAgIC8vIEV4dGVybmFsIFN5bWJvbCBpcyBnZW5lcmF0ZWQgZm9yIHRlbXAgZGF0YSBhbmQgYXJndW1lbnRzLiBUaGV5IGFyZQorICAgIC8vIGluIGZwZGF0YS48ZnVuY3Rpb25uYW1lPi4jIHNlY3Rpb24uCisgICAgc3RkOjpzdHJpbmcgU3ltID0gT3AuZ2V0U3ltYm9sTmFtZSgpOworICAgIE5ld0JhbmsgPSBQQU46OmdldFNlY3Rpb25OYW1lRm9yU3ltKFN5bSk7CisgIH0KKworICAvLyBJZiB0aGUgc2VjdGlvbiBpcyBzaGFyZWQgc2VjdGlvbiwgZG8gbm90IGVtaXQgYmFua3NlbC4KKyAgaWYgKE5ld0JhbmsgPT0gUEFOOjpnZXRTaGFyZWRVRGF0YVNlY3Rpb25OYW1lKCkpCisgICAgcmV0dXJuIENoYW5nZWQ7CisKKyAgLy8gSWYgdGhlIHByZXZpb3VzIGFuZCBuZXcgc2VjdGlvbiBuYW1lcyBhcmUgc2FtZSwgd2UgZG9uJ3QgbmVlZCB0bworICAvLyBlbWl0IGJhbmtzZWwuIAorICBpZiAoTmV3QmFuay5jb21wYXJlKEN1ckJhbmspICE9IDAgfHwgaGFzRXh0ZXJuYWxMaW5rYWdlKSB7CisgICAgRGVidWdMb2MgZGwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgICBCdWlsZE1JKCpNQkIsIE1JLCBkbCwgVElJLT5nZXQoUElDMTY6OmJhbmtzZWwpKS4KKyAgICAgIGFkZE9wZXJhbmQoT3ApOworICAgIENoYW5nZWQgPSB0cnVlOworICAgIEN1ckJhbmsgPSBOZXdCYW5rOworICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZQYXNzZXMvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2UGFzc2VzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODRiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2UGFzc2VzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L1BJQzE2L1BJQzE2UGFzc2VzL01ha2VmaWxlIC0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMgCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjIAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK1RBUkdFVCA9IFBJQzE2CitMSUJSQVJZTkFNRSA9IExMVk1waWMxNnBhc3NlcworQlVJTERfQVJDSElWRSA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlBhc3Nlcy9QSUMxNkNsb25lci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2UGFzc2VzL1BJQzE2Q2xvbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2YxY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlBhc3Nlcy9QSUMxNkNsb25lci5jcHAKQEAgLTAsMCArMSwyOTkgQEAKKy8vPT09LS0gUElDMTZDbG9uZXIuY3BwIC0gUElDMTYgTExWTSBDbG9uZXIgZm9yIHNoYXJlZCBmdW5jdGlvbnMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHRvIGNsb25lIGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4KKy8vIHRoZSBtYWluIGxpbmUgY29kZSAoTUwpIGFuZCBpbnRlcnJ1cHQgbGluZSBjb2RlIChJTCkuIEl0IGNsb25lcyBhbGwgc3VjaAorLy8gc2hhcmVkIGZ1bmN0aW9ucyBhbmQgdGhlaXIgYXV0b21hdGljIGdsb2JhbCB2YXJzIGJ5IGFkZGluZyB0aGUgLklMIHN1ZmZpeC4gCisvLworLy8gVGhpcyBwYXNzIGlzIHN1cHBvc2VkIHRvIGJlIHJ1biBvbiB0aGUgbGlua2VkIC5iYyBtb2R1bGUuCisvLyBJdCB0cmF2ZXNlcyB0aGUgbW9kdWxlIGNhbGwgZ3JhcGggdHdpY2UuIE9uY2Ugc3RhcnRpbmcgZnJvbSB0aGUgbWFpbiBmdW5jdGlvbgorLy8gYW5kIG1hcmtpbmcgZWFjaCByZWFjaGVkIGZ1bmN0aW9uIGFzICJNTCIuIEFnYWluLCBzdGFydGluZyBmcm9tIHRoZSBJU1IKKy8vIGFuZCBjbG9uaW5nIGFueSByZWFjaGFibGUgZnVuY3Rpb24gdGhhdCB3YXMgbWFya2VkIGFzICJNTCIuIEFmdGVyIGNsb25pbmcKKy8vIHRoZSBmdW5jdGlvbiwgaXQgcmVtYXBzIGFsbCB0aGUgY2FsbCBzaXRlcyBpbiBJTCBmdW5jdGlvbnMgdG8gY2FsbCB0aGUKKy8vIGNsb25lZCBmdW5jdGlvbnMuIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9DbG9uaW5nLmgiCisjaW5jbHVkZSAiUElDMTZDbG9uZXIuaCIKKyNpbmNsdWRlICIuLi9QSUMxNkFCSU5hbWVzLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6Om1hcDsKKworbmFtZXNwYWNlIGxsdm0geworICBjaGFyIFBJQzE2Q2xvbmVyOjpJRCA9IDA7CisKKyAgTW9kdWxlUGFzcyAqY3JlYXRlUElDMTZDbG9uZXJQYXNzKCkgeyByZXR1cm4gbmV3IFBJQzE2Q2xvbmVyKCk7IH0KK30KKworLy8gV2UgY3VycmVudGx5IGludGVuZCB0byBydW4gdGhlc2UgcGFzc2VzIGluIG9wdCwgd2hpY2ggZG9lcyBub3QgaGF2ZSBhbnkKKy8vIGRpYWdub3N0aWMgc3VwcG9ydC4gU28gdXNlIHRoZXNlIGZ1bmN0aW9ucyBmb3Igbm93LiBJbiBmdXR1cmUKKy8vIHdlIHdpbGwgcHJvYmFibHkgd3JpdGUgb3VyIG93biBkcml2ZXIgdG9vbC4KKy8vCit2b2lkIFBJQzE2Q2xvbmVyOjpyZXBvcnRFcnJvcihzdHJpbmcgRXJyb3JTdHJpbmcpIHsKKyAgZXJycygpIDw8ICJFUlJPUiA6ICIgPDwgRXJyb3JTdHJpbmcgPDwgIlxuIjsKKyAgZXhpdCgxKTsKK30KKwordm9pZCBQSUMxNkNsb25lcjo6CityZXBvcnRFcnJvciAoc3RyaW5nIEVycm9yU3RyaW5nLCB2ZWN0b3I8c3RyaW5nPiAmVmFsdWVzKSB7CisgIHVuc2lnbmVkIFZhbENvdW50ID0gVmFsdWVzLnNpemUoKTsKKyAgc3RyaW5nIFRhcmdldFN0cmluZzsKKyAgZm9yICh1bnNpZ25lZCBpPTA7IGk8VmFsQ291bnQ7ICsraSkgeworICAgIFRhcmdldFN0cmluZyA9ICIlIjsKKyAgICBUYXJnZXRTdHJpbmcgKz0gKChjaGFyKWkgKyAnMCcpOworICAgIEVycm9yU3RyaW5nLnJlcGxhY2UoRXJyb3JTdHJpbmcuZmluZChUYXJnZXRTdHJpbmcpLCBUYXJnZXRTdHJpbmcubGVuZ3RoKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzW2ldKTsKKyAgfQorICBlcnJzKCkgPDwgIkVSUk9SIDogIiA8PCBFcnJvclN0cmluZyA8PCAiXG4iOworICBleGl0KDEpOworfQorCisKKy8vIEVudHJ5IHBvaW50CisvLworYm9vbCBQSUMxNkNsb25lcjo6cnVuT25Nb2R1bGUoTW9kdWxlICZNKSB7CisgICBDYWxsR3JhcGggJkNHID0gZ2V0QW5hbHlzaXM8Q2FsbEdyYXBoPigpOworCisgICAvLyBTZWFyY2ggZm9yIHRoZSAibWFpbiIgYW5kICJJU1IiIGZ1bmN0aW9ucy4KKyAgIENhbGxHcmFwaE5vZGUgKm1haW5DR04gPSBOVUxMLCAqaXNyQ0dOID0gTlVMTDsKKyAgIGZvciAoQ2FsbEdyYXBoOjppdGVyYXRvciBpdCA9IENHLmJlZ2luKCkgOyBpdCAhPSBDRy5lbmQoKTsgaXQrKykKKyAgIHsKKyAgICAgLy8gRXh0ZXJuYWwgY2FsbGluZyBub2RlIGRvZXNuJ3QgaGF2ZSBhbnkgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgICBpZiAoISBpdC0+Zmlyc3QpCisgICAgICAgY29udGludWU7CisgICAgIAorICAgICBpZiAoaXQtPmZpcnN0LT5nZXROYW1lKCkuc3RyKCkgPT0gIm1haW4iKSB7CisgICAgICAgbWFpbkNHTiA9IGl0LT5zZWNvbmQ7CisgICAgIH0KKworICAgICBpZiAoUEFOOjppc0lTUihpdC0+Zmlyc3QtPmdldFNlY3Rpb24oKSkpIHsKKyAgICAgICBpc3JDR04gPSBpdC0+c2Vjb25kOworICAgICB9CisgCisgICAgIC8vIERvbid0IHNlYXJjaCBmdXJ0aGVyIGlmIHdlJ3ZlIGZvdW5kIGJvdGguCisgICAgIGlmIChtYWluQ0dOICYmIGlzckNHTikKKyAgICAgICBicmVhazsKKyAgIH0KKworICAgLy8gV2UgaGF2ZSBub3RoaW5nIHRvIGRvIGlmIGFueSBvZiB0aGUgbWFpbiBvciBJU1IgaXMgbWlzc2luZy4KKyAgIGlmICghIG1haW5DR04gfHwgISBpc3JDR04pIHJldHVybiBmYWxzZTsKKyAgICAgICAKKyAgIC8vIFRpbWUgZm9yIHNvbWUgZGlhZ25vc3RpY3MuCisgICAvLyBTZWUgaWYgdGhlIG1haW4gaXRzZWxmIGlzIGludGVycnVwdCBmdW5jdGlvbiB0aGVuIHJlcG9ydCBhbiBlcnJvci4KKyAgIGlmIChQQU46OmlzSVNSKG1haW5DR04tPmdldEZ1bmN0aW9uKCktPmdldFNlY3Rpb24oKSkpIHsKKyAgICAgcmVwb3J0RXJyb3IoIkZ1bmN0aW9uICdtYWluJyBjYW4ndCBiZSBpbnRlcnJ1cHQgZnVuY3Rpb24iKTsKKyAgIH0KKworICAgIAorICAgLy8gTWFyayBhbGwgcmVhY2hhYmxlIGZ1bmN0aW9ucyBmcm9tIG1haW4gYXMgTUwuCisgICBtYXJrQ2FsbEdyYXBoKG1haW5DR04sICJNTCIpOworCisgICAvLyBBbmQgdGhlbiBhbGwgdGhlIGZ1bmN0aW9ucyByZWFjaGFibGUgZnJvbSBJU1Igd2lsbCBiZSBjbG9uZWQuCisgICBjbG9uZVNoYXJlZEZ1bmN0aW9ucyhpc3JDR04pOworCisgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gTWFyayBhbGwgcmVhY2hhYmxlIGZ1bmN0aW9ucyBmcm9tIHRoZSBnaXZlbiBub2RlLCB3aXRoIHRoZSBnaXZlbiBtYXJrLgorLy8KK3ZvaWQgUElDMTZDbG9uZXI6Om1hcmtDYWxsR3JhcGgoQ2FsbEdyYXBoTm9kZSAqQ0dOLCBzdHJpbmcgU3RyaW5nTWFyaykgeworICAvLyBNYXJrIHRoZSB0b3Agbm9kZSBmaXJzdC4KKyAgRnVuY3Rpb24gKnRoaXNGID0gQ0dOLT5nZXRGdW5jdGlvbigpOworCisgIHRoaXNGLT5zZXRTZWN0aW9uKFN0cmluZ01hcmspOworCisgIC8vIE1hcmsgYWxsIHRoZSBjYWxsZWQgZnVuY3Rpb25zCisgIGZvcihDYWxsR3JhcGhOb2RlOjppdGVyYXRvciBjZ25faXQgPSBDR04tPmJlZ2luKCk7CisgICAgICAgICAgICAgIGNnbl9pdCAhPSBDR04tPmVuZCgpOyArK2Nnbl9pdCkgeworICAgICBGdW5jdGlvbiAqQ2FsbGVkRiA9IGNnbl9pdC0+c2Vjb25kLT5nZXRGdW5jdGlvbigpOworCisgICAgIC8vIElmIGNhbGxpbmcgYW4gZXh0ZXJuYWwgZnVuY3Rpb24gdGhlbiBDYWxsR3JhcGhOb2RlCisgICAgIC8vIHdpbGwgbm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgZnVuY3Rpb24uCisgICAgIGlmICghIENhbGxlZEYpCisgICAgICAgY29udGludWU7CisgIAorICAgICAvLyBJc3N1ZSBkaWFnbm9zdGljIGlmIGludGVycnVwdCBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQuCisgICAgIGlmIChQQU46OmlzSVNSKENhbGxlZEYtPmdldFNlY3Rpb24oKSkpIHsKKyAgICAgICB2ZWN0b3I8c3RyaW5nPiBWYWx1ZXM7CisgICAgICAgVmFsdWVzLnB1c2hfYmFjayhDYWxsZWRGLT5nZXROYW1lKCkuc3RyKCkpOworICAgICAgIHJlcG9ydEVycm9yKCJJbnRlcnJ1cHQgZnVuY3Rpb24gKCUwKSBjYW4ndCBiZSBjYWxsZWQiLCBWYWx1ZXMpOyAKKyAgICAgfQorCisgICAgIC8vIEhhcyBhbHJlYWR5IGJlZW4gbWFyayAKKyAgICAgaWYgKENhbGxlZEYtPmdldFNlY3Rpb24oKS5maW5kKFN0cmluZ01hcmspICE9IHN0cmluZzo6bnBvcykgeworICAgICAgIC8vIFNob3VsZCB3ZSBkbyBhbnl0aGluZyBoZXJlPworICAgICB9IGVsc2UgeworICAgICAgIC8vIE1hcmsgbm93CisgICAgICAgQ2FsbGVkRi0+c2V0U2VjdGlvbihTdHJpbmdNYXJrKTsKKyAgICAgfQorCisgICAgIC8vIEJlZm9yZSBnb2luZyBhbnkgZnVydGhlciBtYXJrIGFsbCB0aGUgY2FsbGVkIGZ1bmN0aW9uIGJ5IGN1cnJlbnQKKyAgICAgLy8gZnVuY3Rpb24uCisgICAgIG1hcmtDYWxsR3JhcGgoY2duX2l0LT5zZWNvbmQgLFN0cmluZ01hcmspOworICB9IC8vIGVuZCBvZiBsb29wIG9mIGFsbCBjYWxsZWQgZnVuY3Rpb25zLgorfQorCisKKy8vIEZvciBQSUMxNiwgYXV0b21hdGljIHZhcmlhYmxlcyBvZiBhIGZ1bmN0aW9uIGFyZSBlbWl0dGVkIGFzIGdsb2JhbHMuCisvLyBDbG9uZSB0aGUgYXV0byB2YXJpYWJsZXMgb2YgYSBmdW5jdGlvbiAgYW5kIHB1dCB0aGVtIGluIFZNYXAsIAorLy8gdGhpcyBWTWFwIHdpbGwgYmUgdXNlZCB3aGlsZQorLy8gQ2xvbmluZyB0aGUgY29kZSBvZiBmdW5jdGlvbiBpdHNlbGYuCisvLwordm9pZCBQSUMxNkNsb25lcjo6Q2xvbmVBdXRvcyhGdW5jdGlvbiAqRikgeworICAvLyBXZSdsbCBuZWVkIHRvIHVwZGF0ZSBtb2R1bGUncyBnbG9iYWxzIGxpc3QgYXMgd2VsbC4gU28ga2VlcCBhIHJlZmVyZW5jZQorICAvLyBoYW5keS4KKyAgTW9kdWxlICpNID0gRi0+Z2V0UGFyZW50KCk7CisgIE1vZHVsZTo6R2xvYmFsTGlzdFR5cGUgJkdsb2JhbHMgPSBNLT5nZXRHbG9iYWxMaXN0KCk7CisKKyAgLy8gQ2xlYXIgdGhlIGxlZnRvdmVycyBpbiBWTWFwIGJ5IGFueSBwcmV2aW91cyBjbG9uaW5nLgorICBWTWFwLmNsZWFyKCk7CisKKyAgLy8gRmluZCB0aGUgYXV0byBnbG9ibHMgZm9yIHRoaXMgZnVuY3Rpb24gYW5kIGNsb25lIHRoZW0sIGFuZCBwdXQgdGhlbQorICAvLyBpbiBWTWFwLgorICBzdGQ6OnN0cmluZyBGbk5hbWUgPSBGLT5nZXROYW1lKCkuc3RyKCk7CisgIHN0ZDo6c3RyaW5nIFZhck5hbWUsIENsb25lZFZhck5hbWU7CisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0tPmdsb2JhbF9iZWdpbigpLCBFID0gTS0+Z2xvYmFsX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgVmFyTmFtZSA9IEktPmdldE5hbWUoKS5zdHIoKTsKKyAgICBpZiAoUEFOOjppc0xvY2FsVG9GdW5jKEZuTmFtZSwgVmFyTmFtZSkpIHsKKyAgICAgIC8vIEF1dG8gdmFyaWFibGUgZm9yIGN1cnJlbnQgZnVuY3Rpb24gZm91bmQuIENsb25lIGl0LgorICAgICAgY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWID0gSTsKKworICAgICAgY29uc3QgVHlwZSAqSW5pdFR5ID0gR1YtPmdldEluaXRpYWxpemVyKCktPmdldFR5cGUoKTsKKyAgICAgIEdsb2JhbFZhcmlhYmxlICpDbG9uZWRHViA9IAorICAgICAgICBuZXcgR2xvYmFsVmFyaWFibGUoSW5pdFR5LCBmYWxzZSwgR1YtPmdldExpbmthZ2UoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHVi0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgICAgICBDbG9uZWRHVi0+c2V0TmFtZShQQU46OmdldENsb25lVmFyTmFtZShGbk5hbWUsIFZhck5hbWUpKTsKKyAgICAgIC8vIEFkZCB0aGVzZSBuZXcgZ2xvYmFscyB0byBtb2R1bGUncyBnbG9iYWxzIGxpc3QuCisgICAgICBHbG9iYWxzLnB1c2hfYmFjayhDbG9uZWRHVik7CisgCisgICAgICAvLyBVcGRhdGUgVk1hcC4KKyAgICAgIFZNYXBbR1ZdID0gQ2xvbmVkR1Y7CisgICAgIH0KKyAgfQorfQorCisKKy8vIENsb25lIGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gSVNSIGFuZCBhcmUgYWxyZWFkeSAKKy8vIG1hcmtlZCBhcyBNTC4KKy8vCit2b2lkIFBJQzE2Q2xvbmVyOjpjbG9uZVNoYXJlZEZ1bmN0aW9ucyhDYWxsR3JhcGhOb2RlICpDR04pIHsKKworICAvLyBDaGVjayBhbGwgdGhlIGNhbGxlZCBmdW5jdGlvbnMgZnJvbSBJU1IuCisgIGZvcihDYWxsR3JhcGhOb2RlOjppdGVyYXRvciBjZ25faXQgPSBDR04tPmJlZ2luKCk7IAorICAgICAgICAgICAgICBjZ25faXQgIT0gQ0dOLT5lbmQoKTsgKytjZ25faXQpIHsKKyAgICAgRnVuY3Rpb24gKkNhbGxlZEYgPSBjZ25faXQtPnNlY29uZC0+Z2V0RnVuY3Rpb24oKTsKKworICAgICAvLyBJZiBjYWxsaW5nIGFuIGV4dGVybmFsIGZ1bmN0aW9uIHRoZW4gQ2FsbEdyYXBoTm9kZQorICAgICAvLyB3aWxsIG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IGZ1bmN0aW9uLgorICAgICBpZiAoIUNhbGxlZEYpCisgICAgICAgY29udGludWU7CisgIAorICAgICAvLyBJc3N1ZSBkaWFnbm9zdGljIGlmIGludGVycnVwdCBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQuCisgICAgIGlmIChQQU46OmlzSVNSKENhbGxlZEYtPmdldFNlY3Rpb24oKSkpIHsKKyAgICAgICB2ZWN0b3I8c3RyaW5nPiBWYWx1ZXM7CisgICAgICAgVmFsdWVzLnB1c2hfYmFjayhDYWxsZWRGLT5nZXROYW1lKCkuc3RyKCkpOworICAgICAgIHJlcG9ydEVycm9yKCJJbnRlcnJ1cHQgZnVuY3Rpb24gKCUwKSBjYW4ndCBiZSBjYWxsZWQiLCBWYWx1ZXMpOyAKKyAgICAgfQorCisgICAgIGlmIChDYWxsZWRGLT5nZXRTZWN0aW9uKCkuZmluZCgiTUwiKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAvLyBGdW5jdGlvbiBpcyBhbHRlcm5hdGl2ZWx5IG1hcmtlZC4gSXQgc2hvdWxkIGJlIGEgc2hhcmVkIG9uZS4KKyAgICAgICAvLyBDcmVhdGUgSUwgY29weS4gUGFzc2luZyBjYWxsZWQgZnVuY3Rpb24gYXMgZmlyc3QgYXJndW1lbnQKKyAgICAgICAvLyBhbmQgdGhlIGNhbGxlciBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LgorCisgICAgICAgLy8gQmVmb3JlIG1ha2luZyBJTCBjb3B5LCBmaXJzdCBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGhhcyBhIAorICAgICAgIC8vIGJvZHkuIElmIHRoZSBmdW5jdGlvbiBkb2VzIGhhdmUgYSBib2R5LiBJdCBjYW4ndCBiZSBjbG9uZWQuCisgICAgICAgLy8gU3VjaCBhIGNhc2UgbWF5IG9jY3VyIHdoZW4gdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIGRlY2xhcmF0ZWQKKyAgICAgICAvLyBpbiB0aGUgQyBzb3VyY2UgY29kZSBidXQgaXRzIGJvZHkgZXhpc3RzIGluIGFzc2VtYmx5IGZpbGUuCisgICAgICAgaWYgKCFDYWxsZWRGLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgICAgIEZ1bmN0aW9uICpjZiA9IGNsb25lRnVuY3Rpb24oQ2FsbGVkRik7CisgICAgICAgICByZW1hcEFsbFNpdGVzKENHTi0+Z2V0RnVuY3Rpb24oKSwgQ2FsbGVkRiwgY2YpOworICAgICAgIH0gIGVsc2UgeworICAgICAgICAgLy8gSXQgaXMgY2FsbGVkIG9ubHkgZnJvbSBJU1IuIFN0aWxsIG1hcmsgaXQgYXMgd2UgbmVlZCB0aGlzIGluZm8KKyAgICAgICAgIC8vIGluIGNvZGUgZ2VuIHdoaWxlIGNhbGxpbmcgaW50cmluc2ljcy5GdW5jdGlvbiBpcyBub3QgbWFya2VkLgorICAgICAgICAgQ2FsbGVkRi0+c2V0U2VjdGlvbigiSUwiKTsKKyAgICAgICB9CisgICAgIH0KKyAgICAgLy8gQmVmb3JlIGdvaW5nIGFueSBmdXJ0aGVyIGNsb25lIGFsbCB0aGUgc2hhcmVkIGZ1bmN0aW9uIHJlYWNoYWFibGUgCisgICAgIC8vIGJ5IGN1cnJlbnQgZnVuY3Rpb24uCisgICAgIGNsb25lU2hhcmVkRnVuY3Rpb25zKGNnbl9pdC0+c2Vjb25kKTsKKyAgfSAvLyBlbmQgb2YgbG9vcCBvZiBhbGwgY2FsbGVkIGZ1bmN0aW9ucy4KK30KKworLy8gQ2xvbmUgdGhlIGdpdmVuIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXQuCisvLyBOb3RlOiBpdCB1c2VzIHRoZSBWTWFwIG1lbWJlciBvZiB0aGUgY2xhc3MsIHdoaWNoIGlzIGFscmVhZHkgcG9wdWxhdGVkCisvLyBieSBjbG9uZUF1dG9zIGJ5IHRoZSB0aW1lIHdlIHJlYWNoIGhlcmUuIAorLy8gRklYTUU6IFNob3VsZCB3ZSBqdXN0IHBhc3MgVk1hcCdzIHJlZiBhcyBhIHBhcmFtZXRlciBoZXJlPyByYXRoZXIKKy8vIHRoYW4ga2VlcGluZyB0aGUgVk1hcCBhcyBhIG1lbWJlci4KK0Z1bmN0aW9uICoKK1BJQzE2Q2xvbmVyOjpjbG9uZUZ1bmN0aW9uKEZ1bmN0aW9uICpPcmdGKSB7CisgICBGdW5jdGlvbiAqQ2xvbmVkRjsKKworICAgLy8gU2VlIGlmIHdlIGFscmVhZHkgY2xvbmVkIGl0LiBSZXR1cm4gdGhhdC4gCisgICBjbG9uZWRfbWFwX2l0ZXJhdG9yIGNtX2l0ID0gQ2xvbmVkRnVuY3Rpb25NYXAuZmluZChPcmdGKTsKKyAgIGlmKGNtX2l0ICE9IENsb25lZEZ1bmN0aW9uTWFwLmVuZCgpKSB7CisgICAgIENsb25lZEYgPSBjbV9pdC0+c2Vjb25kOworICAgICByZXR1cm4gQ2xvbmVkRjsKKyAgIH0KKworICAgLy8gQ2xvbmUgZG9lcyBub3QgZXhpc3QuIAorICAgLy8gRmlyc3QgY2xvbmUgdGhlIGF1dG9zLCBhbmQgcG9wdWxhdGUgVk1hcC4KKyAgIENsb25lQXV0b3MoT3JnRik7CisKKyAgIC8vIE5vdyBjcmVhdGUgdGhlIGNsb25lLgorICAgQ2xvbmVkRiA9IENsb25lRnVuY3Rpb24oT3JnRiwgVk1hcCk7CisKKyAgIC8vIFRoZSBuZXcgZnVuY3Rpb24gc2hvdWxkIGJlIGZvciBpbnRlcnJ1cHQgbGluZS4gVGhlcmVmb3JlIHNob3VsZCBoYXZlIAorICAgLy8gdGhlIG5hbWUgc3VmZml4ZWQgd2l0aCBJTCBhbmQgc2VjdGlvbiBhdHRyaWJ1dGUgbWFya2VkIHdpdGggSUwuIAorICAgQ2xvbmVkRi0+c2V0TmFtZShQQU46OmdldENsb25lRm5OYW1lKE9yZ0YtPmdldE5hbWUoKSkpOworICAgQ2xvbmVkRi0+c2V0U2VjdGlvbigiSUwiKTsKKworICAgLy8gQWRkIHRoZSBuZXdseSBjcmVhdGVkIGZ1bmN0aW9uIHRvIHRoZSBtb2R1bGUuCisgICBPcmdGLT5nZXRQYXJlbnQoKS0+Z2V0RnVuY3Rpb25MaXN0KCkucHVzaF9iYWNrKENsb25lZEYpOworCisgICAvLyBVcGRhdGUgdGhlIENsb25lZEZ1bmN0aW9uTWFwIHRvIHJlY29yZCB0aGlzIGNsb25pbmcgYWN0aXZpdHkuCisgICBDbG9uZWRGdW5jdGlvbk1hcFtPcmdGXSA9IENsb25lZEY7CisKKyAgIHJldHVybiBDbG9uZWRGOworfQorCisKKy8vIFJlbWFwIHRoZSBjYWxsIHNpdGVzIG9mIHNoYXJlZCBmdW5jdGlvbnMsIHRoYXQgYXJlIGluIElMLgorLy8gQ2hhbmdlIHRoZSBJTCBjYWxsIHNpdGUgb2YgYSBzaGFyZWQgZnVuY3Rpb24gdG8gaXRzIGNsb25lLgorLy8KK3ZvaWQgUElDMTZDbG9uZXI6OgorcmVtYXBBbGxTaXRlcyhGdW5jdGlvbiAqQ2FsbGVyLCBGdW5jdGlvbiAqT3JnRiwgRnVuY3Rpb24gKkNsb25lKSB7CisgIC8vIEZpcnN0IGZpbmQgdGhlIGNhbGxlciB0byB1cGRhdGUuIElmIHRoZSBjYWxsZXIgaXRzZWxmIGlzIGNsb25lZAorICAvLyB0aGVuIHVzZSB0aGUgY2xvbmVkIGNhbGxlci4gT3RoZXJ3aXNlIHVzZSBpdC4KKyAgY2xvbmVkX21hcF9pdGVyYXRvciBjbV9pdCA9IENsb25lZEZ1bmN0aW9uTWFwLmZpbmQoQ2FsbGVyKTsKKyAgaWYgKGNtX2l0ICE9IENsb25lZEZ1bmN0aW9uTWFwLmVuZCgpKQorICAgIENhbGxlciA9IGNtX2l0LT5zZWNvbmQ7CisKKyAgLy8gRm9yIHRoZSBsYWNrIG9mIGEgYmV0dGVyIGNhbGwgc2l0ZSBmaW5kaW5nIG1lY2hhbmlzbSwgaXRlcmF0ZSBvdmVyIAorICAvLyBhbGwgaW5zbnMgdG8gZmluZCB0aGUgdXNlcyBvZiBvcmlnaW5hbCBmbi4KKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkkgPSBDYWxsZXItPmJlZ2luKCk7IEJJICE9IENhbGxlci0+ZW5kKCk7ICsrQkkpIHsKKyAgICBCYXNpY0Jsb2NrICZCQiA9ICpCSTsKKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gQkIuYmVnaW4oKTsgSUkgIT0gQkIuZW5kKCk7ICsrSUkpIHsKKyAgICAgIGlmIChJSS0+Z2V0TnVtT3BlcmFuZHMoKSA+IDAgJiYgSUktPmdldE9wZXJhbmQoMCkgPT0gT3JnRikKKyAgICAgICAgICBJSS0+c2V0T3BlcmFuZCgwLCBDbG9uZSk7CisgICAgfQorICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2UGFzc2VzL1BJQzE2Q2xvbmVyLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2UGFzc2VzL1BJQzE2Q2xvbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkNjdjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZQYXNzZXMvUElDMTZDbG9uZXIuaApAQCAtMCwwICsxLDgzIEBACisvLz09PS0tIFBJQzE2Q2xvbmVyLmggLSBQSUMxNiBMTFZNIENsb25lciBmb3Igc2hhcmVkIGZ1bmN0aW9ucyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbiBvZiBhIGNsb25lciBjbGFzcyBjbG9uZSBhbGwgZnVuY3Rpb25zIHRoYXQgCisvLyBhcmUgc2hhcmVkIGJldHdlZW4gdGhlIG1haW4gbGluZSBjb2RlIChNTCkgYW5kIGludGVycnVwdCBsaW5lIGNvZGUgKElMKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFBJQzE2Q0xPTkVSX0gKKyNkZWZpbmUgUElDMTZDTE9ORVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVmFsdWVNYXAuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjptYXA7CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgLy8gZm9yd2FyZCBjbGFzc2VzLgorICBjbGFzcyBWYWx1ZTsKKyAgY2xhc3MgRnVuY3Rpb247CisgIGNsYXNzIE1vZHVsZTsKKyAgY2xhc3MgTW9kdWxlUGFzczsKKyAgY2xhc3MgQ2FsbEdyYXBoOworICBjbGFzcyBDYWxsR3JhcGhOb2RlOworICBjbGFzcyBBbmFseXNpc1VzYWdlOworCisgIGNsYXNzIFBJQzE2Q2xvbmVyIDogcHVibGljIE1vZHVsZVBhc3MgeyAKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBDbGFzcyBpZGVudGlmaWNhdGlvbiAKKyAgICBQSUMxNkNsb25lcigpIDogTW9kdWxlUGFzcyhJRCkgIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuYWRkUmVxdWlyZWQ8Q2FsbEdyYXBoPigpOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICBwcml2YXRlOiAvLyBGdW5jdGlvbnMKKyAgICAvLyBNYXJrIHJlYWNoYWJsZSBmdW5jdGlvbnMgZm9yIHRoZSBNYWluTGluZSBvciBJbnRlcnJ1cHRMaW5lLgorICAgIHZvaWQgbWFya0NhbGxHcmFwaChDYWxsR3JhcGhOb2RlICpDR04sIHN0cmluZyBTdHJpbmdNYXJrKTsKKworICAgIC8vIENsb25lIGF1dG8gdmFyaWFibGVzIG9mIGZ1bmN0aW9uIHNwZWNpZmllZC4KKyAgICB2b2lkIENsb25lQXV0b3MoRnVuY3Rpb24gKkYpOworICAgCisgICAgLy8gQ2xvbmUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4KKyAgICBGdW5jdGlvbiAqY2xvbmVGdW5jdGlvbihGdW5jdGlvbiAqRik7CisKKyAgICAvLyBDbG9uZSBhbGwgc2hhcmVkIGZ1bmN0aW9ucy4KKyAgICB2b2lkIGNsb25lU2hhcmVkRnVuY3Rpb25zKENhbGxHcmFwaE5vZGUgKmlzckNHTik7CisKKyAgICAvLyBSZW1hcCBhbGwgY2FsbCBzaXRlcyB0byB0aGUgc2hhcmVkIGZ1bmN0aW9uLgorICAgIHZvaWQgcmVtYXBBbGxTaXRlcyhGdW5jdGlvbiAqQ2FsbGVyLCBGdW5jdGlvbiAqT3JnRiwgRnVuY3Rpb24gKkNsb25lKTsKKworICAgIC8vIEVycm9yIHJlcG9ydGluZyBmb3IgUElDMTZQYXNzCisgICAgdm9pZCByZXBvcnRFcnJvcihzdHJpbmcgRXJyb3JTdHJpbmcsIHZlY3RvcjxzdHJpbmc+ICZWYWx1ZXMpOworICAgIHZvaWQgcmVwb3J0RXJyb3Ioc3RyaW5nIEVycm9yU3RyaW5nKTsKKworICBwcml2YXRlOiAgLy9kYXRhCisgICAgLy8gUmVjb3JkcyBpZiB0aGUgaW50ZXJydXB0IGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQuCisgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSBpbnRlcnJ1cHQgZnVuY3Rpb24gaXMgZm91bmQgdGhlbiBhbiBlcnJvcgorICAgIC8vIHNob3VsZCBiZSB0aHJvd24uCisgICAgYm9vbCBmb3VuZElTUjsKKworICAgIC8vIFRoaXMgVmFsdWVNYXAgbWFwcyB0aGUgYXV0byB2YXJpYWJsZXMgb2YgdGhlIG9yaWdpbmFsIGZ1bmN0aW9ucyB3aXRoCisgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgY2xvbmVkIGF1dG8gdmFyaWFibGUgb2YgdGhlIGNsb25lZCBmdW5jdGlvbi4gCisgICAgLy8gVGhpcyB2YWx1ZSBtYXAgaXMgcGFzc2VkIGR1cmluZyB0aGUgZnVuY3Rpb24gY2xvbmluZyBzbyB0aGF0IGFsbCB0aGUKKyAgICAvLyB1c2VzIG9mIGF1dG8gdmFyaWFibGVzIGJlIHVwZGF0ZWQgcHJvcGVybHkuIAorICAgIFZhbHVlTWFwPGNvbnN0IFZhbHVlKiwgVmFsdWUqPiBWTWFwOworCisgICAgLy8gTWFwIG9mIGEgYWxyZWFkeSBjbG9uZWQgZnVuY3Rpb25zLiAKKyAgICBtYXA8RnVuY3Rpb24gKiwgRnVuY3Rpb24gKj4gQ2xvbmVkRnVuY3Rpb25NYXA7CisgICAgdHlwZWRlZiBtYXA8RnVuY3Rpb24gKiwgRnVuY3Rpb24gKj46Oml0ZXJhdG9yIGNsb25lZF9tYXBfaXRlcmF0b3I7CisgIH07Cit9ICAvLyBFbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZQYXNzZXMvUElDMTZPdmVybGF5LmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZQYXNzZXMvUElDMTZPdmVybGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjg5MjhhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlBhc3Nlcy9QSUMxNk92ZXJsYXkuY3BwCkBAIC0wLDAgKzEsMTgyIEBACisvLz09PS0tIFBJQzE2T3ZlcmxheS5jcHAgLSBJbXBsZW1lbnRhdGlvbiBmb3IgUElDMTYgRnJhbWUgT3ZlcmxheT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgUElDMTYgRnJhbWUgT3ZlcmxheSBpbXBsZW1lbnRhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NhbGxHcmFwaC5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1ZhbHVlLmgiCisjaW5jbHVkZSAiUElDMTZPdmVybGF5LmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3N0cmVhbT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgbGx2bSB7CisgIGNoYXIgUElDMTZPdmVybGF5OjpJRCA9IDA7CisgIE1vZHVsZVBhc3MgKmNyZWF0ZVBJQzE2T3ZlcmxheVBhc3MoKSB7IHJldHVybiBuZXcgUElDMTZPdmVybGF5KCk7IH0KK30KKwordm9pZCBQSUMxNk92ZXJsYXk6OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIEFVLmFkZFJlcXVpcmVkPENhbGxHcmFwaD4oKTsKK30KKwordm9pZCBQSUMxNk92ZXJsYXk6OkRGU1RyYXZlcnNlKENhbGxHcmFwaE5vZGUgKkNHTiwgdW5zaWduZWQgRGVwdGgpIHsKKyAgLy8gRG8gbm90IHNldCBhbnkgY29sb3IgZm9yIGV4dGVybmFsIGNhbGxpbmcgbm9kZS4KKyAgaWYgKERlcHRoICE9IDAgJiYgQ0dOLT5nZXRGdW5jdGlvbigpKSB7CisgICAgdW5zaWduZWQgQ29sb3IgPSBnZXRDb2xvcihDR04tPmdldEZ1bmN0aW9uKCkpOworCisgICAgLy8gSGFuZGxlIGluZGlyZWN0bHkgY2FsbGVkIGZ1bmN0aW9ucworICAgIGlmIChDb2xvciA+PSBQSUMxNk9WRVJMQVk6OlN0YXJ0SW5kaXJlY3RDYWxsQ29sb3IgfHwgCisgICAgICAgIERlcHRoID49IFBJQzE2T1ZFUkxBWTo6U3RhcnRJbmRpcmVjdENhbGxDb2xvcikgeworICAgICAgLy8gQWxsIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBhbiBpbmRpcmVjdGx5IGNhbGxlZCBmdW5jdGlvbiBhcmUgZ2l2ZW4KKyAgICAgIC8vIGFuIHVuaXF1ZSBjb2xvci4KKyAgICAgIGlmIChDb2xvciA8IFBJQzE2T1ZFUkxBWTo6U3RhcnRJbmRpcmVjdENhbGxDb2xvciAmJgorICAgICAgICAgIERlcHRoID49IFBJQzE2T1ZFUkxBWTo6U3RhcnRJbmRpcmVjdENhbGxDb2xvcikKKyAgICAgICAgc2V0Q29sb3IoQ0dOLT5nZXRGdW5jdGlvbigpLCBEZXB0aCk7CisKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgQ0dOLT5zaXplKCk7IGkrKykKKyAgICAgICAgREZTVHJhdmVyc2UoKCpDR04pW2ldLCArK0luZGlyZWN0Q2FsbENvbG9yKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSnVzdCByZXR1cm4gaWYgdGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBjb2xvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgCisgICAgLy8gZGVwdGguIEEgbm9kZSBtdXN0IGJlIGNvbG9yZWQgd2l0aCB0aGUgbWF4aW11bSBkZXB0aCB0aGF0IGl0IGhhcy4KKyAgICBpZiAoQ29sb3IgPj0gRGVwdGgpCisgICAgICByZXR1cm47CisgICAgCisgICAgRGVwdGggPSBNb2RpZnlEZXB0aEZvckludGVycnVwdChDR04sIERlcHRoKTsgIAorICAgIHNldENvbG9yKENHTi0+Z2V0RnVuY3Rpb24oKSwgRGVwdGgpOworICB9CisgIAorICAvLyBDb2xvciBhbGwgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHdpdGggY29sb3IgZGVwdGgrMS4KKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBDR04tPnNpemUoKTsgaSsrKQorICAgIERGU1RyYXZlcnNlKCgqQ0dOKVtpXSwgRGVwdGgrMSk7Cit9CisKK3Vuc2lnbmVkIFBJQzE2T3ZlcmxheTo6TW9kaWZ5RGVwdGhGb3JJbnRlcnJ1cHQoQ2FsbEdyYXBoTm9kZSAqQ0dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSB7CisgIEZ1bmN0aW9uICpGbiA9IENHTi0+Z2V0RnVuY3Rpb24oKTsKKworICAvLyBSZXR1cm4gb3JpZ2luYWwgRGVwdGggaWYgZnVuY3Rpb24gb3Igc2VjdGlvbiBmb3IgZnVuY3Rpb24gZG8gbm90IGV4aXN0LgorICBpZiAoIUZuIHx8ICFGbi0+aGFzU2VjdGlvbigpKQorICAgIHJldHVybiBEZXB0aDsKKworICAvLyBSZXR1cm4gb3JpZ2luYWwgRGVwdGggaWYgdGhpcyBmdW5jdGlvbiBpcyBub3QgbWFya2VkIGFzIGludGVycnVwdC4KKyAgaWYgKEZuLT5nZXRTZWN0aW9uKCkuZmluZCgiaW50ZXJydXB0IikgPT0gc3RyaW5nOjpucG9zKQorICAgIHJldHVybiBEZXB0aDsKKworICBEZXB0aCA9IERlcHRoICsgSW50ZXJydXB0RGVwdGg7CisgIHJldHVybiBEZXB0aDsKK30KKwordm9pZCBQSUMxNk92ZXJsYXk6OnNldENvbG9yKEZ1bmN0aW9uICpGbiwgdW5zaWduZWQgQ29sb3IpIHsKKyAgc3RkOjpzdHJpbmcgU2VjdGlvbiA9ICIiOworICBpZiAoRm4tPmhhc1NlY3Rpb24oKSkKKyAgICBTZWN0aW9uID0gRm4tPmdldFNlY3Rpb24oKTsKKworICBzaXplX3QgUG9zID0gU2VjdGlvbi5maW5kKE92ZXJsYXlTdHIpOworCisgIC8vIENvbnZlcnQgQ29sb3IgdG8gc3RyaW5nLgorICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgQ29sb3I7CisgIHN0ZDo6c3RyaW5nIENvbG9yU3RyaW5nID0gc3Muc3RyKCk7CisKKyAgLy8gSWYgY29sb3IgaXMgYWxyZWFkeSBzZXQgdGhlbiByZXNldCBpdCB3aXRoIHRoZSBuZXcgdmFsdWUuIEVsc2UgYXBwZW5kIAorICAvLyB0aGUgQ29sb3Igc3RyaW5nIHRvIHNlY3Rpb24uCisgIGlmIChQb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBQb3MgKz0gT3ZlcmxheVN0ci5sZW5ndGgoKTsKKyAgICBjaGFyIGMgPSBTZWN0aW9uLmF0KFBvcyk7CisgICAgdW5zaWduZWQgT2xkQ29sb3JMZW5ndGggPSAwOyAgCisgICAgd2hpbGUgKGMgPj0gJzAnICYmIGM8PSAnOScpIHsKKyAgICAgIE9sZENvbG9yTGVuZ3RoKys7ICAgIAorICAgICAgaWYgKFBvcyA8IFNlY3Rpb24ubGVuZ3RoKCkgLSAxKQorICAgICAgICBQb3MrKzsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgICBjID0gU2VjdGlvbi5hdChQb3MpOworICAgIH0KKyAgICAvLyBSZXBsYWNlIG9sZCBjb2xvciB3aXRoIG5ldyBvbmUuCisgICAgU2VjdGlvbi5yZXBsYWNlKFBvcy1PbGRDb2xvckxlbmd0aCArMSwgT2xkQ29sb3JMZW5ndGgsIENvbG9yU3RyaW5nKTsgCisgIH0KKyAgZWxzZSB7CisgICAgLy8gQXBwZW5kIENvbG9yIGluZm9ybWF0aW9uIHRvIHNlY3Rpb24gc3RyaW5nLgorICAgIGlmIChGbi0+aGFzU2VjdGlvbigpKQorICAgICAgU2VjdGlvbi5hcHBlbmQoIiAiKTsKKyAgICBTZWN0aW9uLmFwcGVuZChPdmVybGF5U3RyICsgQ29sb3JTdHJpbmcpOworICB9CisgIEZuLT5zZXRTZWN0aW9uKFNlY3Rpb24pOworfQorCit1bnNpZ25lZCBQSUMxNk92ZXJsYXk6OmdldENvbG9yKEZ1bmN0aW9uICpGbikgeworICBpbnQgQ29sb3IgPSAwOworICBpZiAoIUZuLT5oYXNTZWN0aW9uKCkpCisgICAgcmV0dXJuIDA7CisKKyAgc3RkOjpzdHJpbmcgU2VjdGlvbiA9IEZuLT5nZXRTZWN0aW9uKCk7CisgIHNpemVfdCBQb3MgPSBTZWN0aW9uLmZpbmQoT3ZlcmxheVN0cik7CisgIAorICAvLyBSZXR1cm4gMCBpZiBDb2xvciBpcyBub3Qgc2V0LgorICBpZiAoUG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIHJldHVybiAwOworCisgIC8vIFNldCBQb3MgdG8gYWZ0ZXIgIk92ZXJsYXk9Ii4KKyAgUG9zICs9IE92ZXJsYXlTdHIubGVuZ3RoKCk7CisgIGNoYXIgYyA9IFNlY3Rpb24uYXQoUG9zKTsKKyAgc3RkOjpzdHJpbmcgQ29sb3JTdHJpbmcgPSAiIjsKKworICAvLyBGaW5kIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIENvbG9yLiBBIENvbG9yIGNhbiBvbmx5IGNvbnNpc3Qgb2YgZGlnaXRzLgorICB3aGlsZSAoYyA+PSAnMCcgJiYgYzw9ICc5JykgeyAKKyAgICBDb2xvclN0cmluZy5hcHBlbmQoMSxjKTsKKyAgICBpZiAoUG9zIDwgU2VjdGlvbi5sZW5ndGgoKSAtIDEpCisgICAgICBQb3MrKzsKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgICBjID0gU2VjdGlvbi5hdChQb3MpOworICB9CisgIENvbG9yID0gYXRvaShDb2xvclN0cmluZy5jX3N0cigpKTsKKyAgCisgIHJldHVybiBDb2xvcjsgICAgCit9CisKK2Jvb2wgUElDMTZPdmVybGF5OjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgQ2FsbEdyYXBoICZDRyA9IGdldEFuYWx5c2lzPENhbGxHcmFwaD4oKTsKKyAgQ2FsbEdyYXBoTm9kZSAqRUNOID0gQ0cuZ2V0RXh0ZXJuYWxDYWxsaW5nTm9kZSgpOworCisgIE1hcmtJbmRpcmVjdGx5Q2FsbGVkRnVuY3Rpb25zKE0pOyAKKyAgLy8gU2luY2UgRXh0ZXJuYWwgQ2FsbGluZyBOb2RlIGlzIHRoZSBiYXNlIGZ1bmN0aW9uLCBkbyBhIGRlcHRoIGZpcnN0IAorICAvLyB0cmF2ZXJzYWwgb2YgQ2FsbEdyYXBoIHdpdGggRUNOIGFzIHJvb3QuIEVhY2ggbm9kZSB3aXRoIGJlIG1hcmtlZCB3aXRoIAorICAvLyBhIGNvbG9yIHRoYXQgaXMgbWF4KGNvbG9yKGNhbGxlcnMpKSArIDEuCisgIGlmKEVDTikgeworICAgIERGU1RyYXZlcnNlKEVDTiwgMCk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBJQzE2T3ZlcmxheTo6TWFya0luZGlyZWN0bHlDYWxsZWRGdW5jdGlvbnMoTW9kdWxlICZNKSB7CisgIC8vIElmIHRoZSB1c2Ugb2YgYSBmdW5jdGlvbiBpcyBub3QgYSBjYWxsIGluc3RydWN0aW9uIHRoZW4gdGhpcworICAvLyBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgaW5kaXJlY3RseS4gSW4gdGhhdCBjYXNlIGdpdmUgaXQKKyAgLy8gYW4gdW5pcXVlIGNvbG9yLgorICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgTUkgPSBNLmJlZ2luKCksIEUgPSBNLmVuZCgpOyBNSSAhPSBFOyArK01JKSB7CisgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIEkgPSBNSS0+dXNlX2JlZ2luKCksIEUgPSBNSS0+dXNlX2VuZCgpOyBJICE9IEU7CisgICAgICAgICArK0kpIHsKKyAgICAgIFVzZXIgKlUgPSAqSTsKKyAgICAgIGlmICgoIWlzYTxDYWxsSW5zdD4oVSkgJiYgIWlzYTxJbnZva2VJbnN0PihVKSkKKyAgICAgICAgICB8fCAhQ2FsbFNpdGUoY2FzdDxJbnN0cnVjdGlvbj4oVSkpLmlzQ2FsbGVlKEkpKSB7CisgICAgICAgIHNldENvbG9yKE1JLCArK0luZGlyZWN0Q2FsbENvbG9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2UGFzc2VzL1BJQzE2T3ZlcmxheS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlBhc3Nlcy9QSUMxNk92ZXJsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjYxMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlBhc3Nlcy9QSUMxNk92ZXJsYXkuaApAQCAtMCwwICsxLDYwIEBACisvLz09PS0tIFBJQzE2T3ZlcmxheS5oIC0gSW50ZXJmYWNlIGZvciBQSUMxNiBGcmFtZSBPdmVybGF5IC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQSUMxNiBPdmVybGF5IGluZnJhc3RydWN0dXJlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgUElDMTZGUkFNRU9WRVJMQVlfSAorI2RlZmluZSBQSUMxNkZSQU1FT1ZFUkxBWV9ICisgCisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSAgbGx2bSB7CisgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorICBjbGFzcyBGdW5jdGlvbjsKKyAgY2xhc3MgTW9kdWxlOworICBjbGFzcyBNb2R1bGVQYXNzOworICBjbGFzcyBBbmFseXNpc1VzYWdlOworICBjbGFzcyBDYWxsR3JhcGhOb2RlOworICBjbGFzcyBDYWxsR3JhcGg7CisKKyAgbmFtZXNwYWNlIFBJQzE2T1ZFUkxBWSB7CisgICAgZW51bSBPdmVybGF5Q29uc3RzIHsKKyAgICAgIFN0YXJ0SW50ZXJydXB0Q29sb3IgPSAyMDAsCisgICAgICBTdGFydEluZGlyZWN0Q2FsbENvbG9yID0gMzAwCisgICAgfTsgCisgIH0KKyAgY2xhc3MgUElDMTZPdmVybGF5IDogcHVibGljIE1vZHVsZVBhc3MgeworICAgIHN0ZDo6c3RyaW5nIE92ZXJsYXlTdHI7CisgICAgdW5zaWduZWQgSW50ZXJydXB0RGVwdGg7CisgICAgdW5zaWduZWQgSW5kaXJlY3RDYWxsQ29sb3I7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gQ2xhc3MgaWRlbnRpZmljYXRpb24gCisgICAgUElDMTZPdmVybGF5KCkgOiBNb2R1bGVQYXNzKElEKSB7CisgICAgICBPdmVybGF5U3RyID0gIk92ZXJsYXk9IjsKKyAgICAgIEludGVycnVwdERlcHRoID0gUElDMTZPVkVSTEFZOjpTdGFydEludGVycnVwdENvbG9yOworICAgICAgSW5kaXJlY3RDYWxsQ29sb3IgPSBQSUMxNk9WRVJMQVk6OlN0YXJ0SW5kaXJlY3RDYWxsQ29sb3I7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0OyAKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICBwcml2YXRlOiAKKyAgICB1bnNpZ25lZCBnZXRDb2xvcihGdW5jdGlvbiAqRm4pOworICAgIHZvaWQgc2V0Q29sb3IoRnVuY3Rpb24gKkZuLCB1bnNpZ25lZCBDb2xvcik7CisgICAgdW5zaWduZWQgTW9kaWZ5RGVwdGhGb3JJbnRlcnJ1cHQoQ2FsbEdyYXBoTm9kZSAqQ0dOLCB1bnNpZ25lZCBEZXB0aCk7CisgICAgdm9pZCBNYXJrSW5kaXJlY3RseUNhbGxlZEZ1bmN0aW9ucyhNb2R1bGUgJk0pOworICAgIHZvaWQgREZTVHJhdmVyc2UoQ2FsbEdyYXBoTm9kZSAqQ0dOLCB1bnNpZ25lZCBEZXB0aCk7CisgIH07Cit9ICAvLyBFbmQgb2YgIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZSZWdpc3RlckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlJlZ2lzdGVySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmOThkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZSZWdpc3RlckluZm8uY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8vPT09LSBQSUMxNlJlZ2lzdGVySW5mby5jcHAgLSBQSUMxNiBSZWdpc3RlciBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgUElDMTYgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInBpYzE2LXJlZy1pbmZvIgorCisjaW5jbHVkZSAiUElDMTYuaCIKKyNpbmNsdWRlICJQSUMxNlJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitQSUMxNlJlZ2lzdGVySW5mbzo6UElDMTZSZWdpc3RlckluZm8oY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUElDMTZTdWJ0YXJnZXQgJnN0KQorICA6IFBJQzE2R2VuUmVnaXN0ZXJJbmZvKFBJQzE2OjpBREpDQUxMU1RBQ0tET1dOLCBQSUMxNjo6QURKQ0FMTFNUQUNLVVApLAorICAgIFRJSSh0aWkpLAorICAgIFNUKHN0KSB7fQorCisjaW5jbHVkZSAiUElDMTZHZW5SZWdpc3RlckluZm8uaW5jIgorCisvLy8gUElDMTYgQ2FsbGVlIFNhdmVkIFJlZ2lzdGVycworY29uc3QgdW5zaWduZWQqIFBJQzE2UmVnaXN0ZXJJbmZvOjoKK2dldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GKSBjb25zdCB7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBDYWxsZWVTYXZlZFJlZ3NbXSA9IHsgMCB9OworICByZXR1cm4gQ2FsbGVlU2F2ZWRSZWdzOworfQorCitCaXRWZWN0b3IgUElDMTZSZWdpc3RlckluZm86OmdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIEJpdFZlY3RvciBSZXNlcnZlZChnZXROdW1SZWdzKCkpOworICByZXR1cm4gUmVzZXJ2ZWQ7Cit9CisKK2Jvb2wgUElDMTZSZWdpc3RlckluZm86Omhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgcmV0dXJuIGZhbHNlOworfQorCit1bnNpZ25lZCBQSUMxNlJlZ2lzdGVySW5mbzo6CitlbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwgaW50IFNQQWRqLAorICAgICAgICAgICAgICAgICAgICBGcmFtZUluZGV4VmFsdWUgKlZhbHVlLCBSZWdTY2F2ZW5nZXIgKlJTKSBjb25zdAoreworICAvKiBOT1QgWUVUIElNUExFTUVOVEVEICovCisgIHJldHVybiAwOworfQorCit2b2lkIFBJQzE2UmVnaXN0ZXJJbmZvOjplbWl0UHJvbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QKK3sgICAgLyogTk9UIFlFVCBJTVBMRU1FTlRFRCAqLyAgfQorCit2b2lkIFBJQzE2UmVnaXN0ZXJJbmZvOjoKK2VtaXRFcGlsb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdAoreyAgICAvKiBOT1QgWUVUIElNUExFTUVOVEVEICovICB9CisKK2ludCBQSUMxNlJlZ2lzdGVySW5mbzo6CitnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJOb3Qga2VlcGluZyB0cmFjayBvZiBkZWJ1ZyBpbmZvcm1hdGlvbiB5ZXQhISIpOworICByZXR1cm4gLTE7Cit9CisKK3Vuc2lnbmVkIFBJQzE2UmVnaXN0ZXJJbmZvOjpnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiUElDMTYgRG9lcyBub3QgaGF2ZSBhbnkgZnJhbWUgcmVnaXN0ZXIiKTsKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIFBJQzE2UmVnaXN0ZXJJbmZvOjpnZXRSQVJlZ2lzdGVyKCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJQSUMxNiBEb2VzIG5vdCBoYXZlIGFueSByZXR1cm4gYWRkcmVzcyByZWdpc3RlciIpOworICByZXR1cm4gMDsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBlbGltaW5hdGVzIEFESkNBTExTVEFDS0RPV04sCisvLyBBREpDQUxMU1RBQ0tVUCBwc2V1ZG8gaW5zdHJ1Y3Rpb25zCit2b2lkIFBJQzE2UmVnaXN0ZXJJbmZvOjoKK2VsaW1pbmF0ZUNhbGxGcmFtZVBzZXVkb0luc3RyKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgY29uc3QgeworICAvLyBTaW1wbHkgZGlzY2FyZCBBREpDQUxMU1RBQ0tET1dOLAorICAvLyBBREpDQUxMU1RBQ0tVUCBpbnN0cnVjdGlvbnMuCisgIE1CQi5lcmFzZShJKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlJlZ2lzdGVySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlJlZ2lzdGVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzZhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2UmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tIFBJQzE2UmVnaXN0ZXJJbmZvLmggLSBQSUMxNiBSZWdpc3RlciBJbmZvcm1hdGlvbiBJbXBsIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQSUMxNiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgUElDMTZSRUdJU1RFUklORk9fSAorI2RlZmluZSBQSUMxNlJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJQSUMxNkdlblJlZ2lzdGVySW5mby5oLmluYyIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBGb3J3YXJkIERlY2xhcmF0aW9ucy4KKyAgY2xhc3MgUElDMTZTdWJ0YXJnZXQ7CisgIGNsYXNzIFRhcmdldEluc3RySW5mbzsKKworY2xhc3MgUElDMTZSZWdpc3RlckluZm8gOiBwdWJsaWMgUElDMTZHZW5SZWdpc3RlckluZm8geworICBwcml2YXRlOgorICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJOworICAgIGNvbnN0IFBJQzE2U3VidGFyZ2V0ICZTVDsKKyAgCisgIHB1YmxpYzoKKyAgICBQSUMxNlJlZ2lzdGVySW5mbyhjb25zdCBUYXJnZXRJbnN0ckluZm8gJnRpaSwgCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUElDMTZTdWJ0YXJnZXQgJnN0KTsKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFB1cmUgdmlydHVhbCBmdW5jdGlvbnMgZnJvbSBUYXJnZXRSZWdpc3RlckluZm8KKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBQSUMxNiBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzCisgIHZpcnR1YWwgY29uc3QgdW5zaWduZWQqIAorICBnZXRDYWxsZWVTYXZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IDApIGNvbnN0OworCisgIHZpcnR1YWwgQml0VmVjdG9yIGdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgdmlydHVhbCBib29sIGhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIHZpcnR1YWwgdW5zaWduZWQgZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGosIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUz1OVUxMKSBjb25zdDsKKworICB2b2lkIGVsaW1pbmF0ZUNhbGxGcmFtZVBzZXVkb0luc3RyKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIGVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIGVtaXRFcGlsb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdDsKKyAgdmlydHVhbCBpbnQgZ2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0OworICB2aXJ0dWFsIHVuc2lnbmVkIGdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UkFSZWdpc3RlcigpIGNvbnN0OworCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZSZWdpc3RlckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2UmVnaXN0ZXJJbmZvLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTlkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2UmVnaXN0ZXJJbmZvLnRkCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LSBQSUMxNlJlZ2lzdGVySW5mby50ZCAtIFBJQzE2IFJlZ2lzdGVyIGRlZnMgLS0tLS0tLS0tLS0tKi0gdGJsZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIERlY2xhcmF0aW9ucyB0aGF0IGRlc2NyaWJlIHRoZSBQSUMxNiByZWdpc3RlciBmaWxlCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBQSUMxNlJlZzxzdHJpbmcgbj4gOiBSZWdpc3RlcjxuPiB7CisgIGxldCBOYW1lc3BhY2UgPSAiUElDMTYiOworfQorCisvLyBQSUMxNiBSZWdpc3RlcnMuCitkZWYgVyAgIDogUElDMTZSZWc8IlciPjsKK2RlZiBGU1IwICAgOiBQSUMxNlJlZzwiRlNSMCI+OworZGVmIEZTUjEgICA6IFBJQzE2UmVnPCJGU1IxIj47CitkZWYgQlMgICAgIDogUElDMTZSZWc8IkJTIj47CitkZWYgUENMQVRIIDogUElDMTZSZWc8IlBDTEFUSCI+OworCitkZWYgU1RBVFVTIDogUElDMTZSZWc8IlNUQVRVUyI+OworCisvLyBQSUMxNiBSZWdpc3RlciBjbGFzc2VzLgorZGVmIEdQUiAgICAgOiBSZWdpc3RlckNsYXNzPCJQSUMxNiIsIFtpOF0sICA4LCBbV10+OworZGVmIEZTUjE2ICAgOiBSZWdpc3RlckNsYXNzPCJQSUMxNiIsIFtpMTZdLCA4LCBbRlNSMCwgRlNSMV0+OworZGVmIEJTUiAgICAgOiBSZWdpc3RlckNsYXNzPCJQSUMxNiIsIFtpOF0sICA4LCBbQlNdPjsKK2RlZiBQQ0xBVEhSIDogUmVnaXN0ZXJDbGFzczwiUElDMTYiLCBbaThdLCAgOCwgW1BDTEFUSF0+OworZGVmIFNUQVRVU1IgOiBSZWdpc3RlckNsYXNzPCJQSUMxNiIsIFtpOF0sICA4LCBbU1RBVFVTXT47CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZTZWN0aW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZTZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA1YjExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlNlY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTA0IEBACisvLz09PS0tIFBJQzE2U2VjdGlvbi5jcHAgLSBQSUMxNiBTZWN0aW9uIC0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlBJQzE2LmgiCisjaW5jbHVkZSAiUElDMTZBQklOYW1lcy5oIgorI2luY2x1ZGUgIlBJQzE2U2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworCisvLyBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byBjcmVhdGUgYSBQSUMxNlNlY3Rpb24uIFNlY3Rpb25zIGNyZWF0ZWQgaGVyZQorLy8gZG8gbm90IG5lZWQgdG8gYmUgZXhwbGljaXRseSBkZWxldGVkIGFzIHRoZXkgYXJlIG1hbmFnZWQgYnkgYXV0b19wdHJzLgorUElDMTZTZWN0aW9uICpQSUMxNlNlY3Rpb246OkNyZWF0ZShTdHJpbmdSZWYgTmFtZSwgUElDMTZTZWN0aW9uVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFkZHJlc3MsIGludCBDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKworICAvLy8gRGV0ZXJtaW5lIHRoZSBpbnRlcm5hbCBTZWN0aW9uS2luZCBpbmZvLgorICAvLy8gVXNlcnMgb2YgUElDMTZTZWN0aW9uIGNsYXNzIHNob3VsZCBub3QgbmVlZCB0byBrbm93IHRoZSBpbnRlcm5hbAorICAvLy8gU2VjdGlvbktpbmQuIFRoZXkgc2hvdWxkIHdvcmsgb25seSB3aXRoIFBJQzE2U2VjdGlvblR5cGUuCisgIC8vLworICAvLy8gUElDMTYgVGVybWlub2xvZ3kgZm9yIHNlY3Rpb24ga2luZHMgaXMgYXMgYmVsb3cuCisgIC8vLyBVREFUQSAtIEJTUworICAvLy8gSURBVEEgLSBpbml0aWFsaXplZCBkYXRhIChlcXVpdiB0byBNZXRhZGF0YSkgCisgIC8vLyBST01EQVRBIC0gUmVhZE9ubHkuCisgIC8vLyBVREFUQV9PVlIgLSBTZWN0aW9ucyB0aGF0IGNhbiBiZSBvdmVybGFpZC4gU2VjdGlvbiBvZiBzdWNoIHR5cGUgaXMKKyAgLy8vICAgICAgICAgICAgIHVzZWQgdG8gY29udGFpbiBmdW5jdGlvbiBhdXRvcyBhbiBmcmFtZS4gV2UgY2FuIHRoaW5rIG9mCisgIC8vLyAgICAgICAgICAgICBpdCBhcyBlcXVpdiB0byBsbHZtIFRocmVhZEJTUykKKyAgLy8vIFVEQVRBX1NIUiAtIFNoYXJlZCBSQU0uIE1lbW9yeSBhcmVhIHRoYXQgaXMgbWFwcGVkIHRvIGFsbCBiYW5rcy4KKworICBTZWN0aW9uS2luZCBLOworICBzd2l0Y2ggKFR5KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSAoImNhbiBub3QgY3JlYXRlIHVua25vd24gc2VjdGlvbiB0eXBlIik7CisgICAgY2FzZSBVREFUQV9PVlI6IHsKKyAgICAgIEsgPSBTZWN0aW9uS2luZDo6Z2V0VGhyZWFkQlNTKCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBVREFUQV9TSFI6CisgICAgY2FzZSBVREFUQTogeworICAgICAgSyA9IFNlY3Rpb25LaW5kOjpnZXRCU1MoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFJPTURBVEE6CisgICAgY2FzZSBJREFUQTogeworICAgICAgSyA9IFNlY3Rpb25LaW5kOjpnZXRNZXRhZGF0YSgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQ09ERTogeworICAgICAgSyA9IFNlY3Rpb25LaW5kOjpnZXRUZXh0KCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgICAKKyAgfQorCisgIC8vIENvcHkgc3RyaW5ncyBpbnRvIGNvbnRleHQgYWxsb2NhdGVkIG1lbW9yeSBzbyB0aGV5IGdldCBmcmVlJ2Qgd2hlbiB0aGUKKyAgLy8gY29udGV4dCBpcyBkZXN0cm95ZWQuCisgIGNoYXIgKk5hbWVDb3B5ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEN0eC5BbGxvY2F0ZShOYW1lLnNpemUoKSwgMSkpOworICBtZW1jcHkoTmFtZUNvcHksIE5hbWUuZGF0YSgpLCBOYW1lLnNpemUoKSk7CisgIGNoYXIgKkFkZHJlc3NDb3B5ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEN0eC5BbGxvY2F0ZShBZGRyZXNzLnNpemUoKSwgMSkpOworICBtZW1jcHkoQWRkcmVzc0NvcHksIEFkZHJlc3MuZGF0YSgpLCBBZGRyZXNzLnNpemUoKSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBTZWN0aW9uLgorICBQSUMxNlNlY3Rpb24gKlMgPQorICAgIG5ldyAoQ3R4KSBQSUMxNlNlY3Rpb24oU3RyaW5nUmVmKE5hbWVDb3B5LCBOYW1lLnNpemUoKSksIEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYoQWRkcmVzc0NvcHksIEFkZHJlc3Muc2l6ZSgpKSwgQ29sb3IpOworICBTLT5UID0gVHk7CisgIHJldHVybiBTOworfQorCisvLyBBIGdlbmVyaWMgd2F5IHRvIHByaW50IGFsbCB0eXBlcyBvZiBzZWN0aW9ucy4KK3ZvaWQgUElDMTZTZWN0aW9uOjpQcmludFN3aXRjaFRvU2VjdGlvbihjb25zdCBNQ0FzbUluZm8gJk1BSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgY29uc3QgeworIAorICAvLyBJZiB0aGUgc2VjdGlvbiBpcyBvdmVybGFpZChpLmUuIGl0IGhhcyBhIGNvbG9yKSwgcHJpbnQgb3ZlcmxheSBuYW1lIGZvciAKKyAgLy8gaXQuIE90aGVyd2lzZSBwcmludCBpdHMgbm9ybWFsIG5hbWUuCisgIGlmIChDb2xvciAhPSAtMSkKKyAgICBPUyA8PCBQQU46OmdldE92ZXJsYXlOYW1lKGdldE5hbWUoKSwgQ29sb3IpIDw8ICdcdCc7CisgIGVsc2UKKyAgICBPUyA8PCBnZXROYW1lKCkgPDwgJ1x0JzsKKworICAvLyBQcmludCB0eXBlLgorICBzd2l0Y2ggKGdldFR5cGUoKSkgeworICBkZWZhdWx0IDogbGx2bV91bnJlYWNoYWJsZSAoInVua25vd24gc2VjdGlvbiB0eXBlIik7IAorICBjYXNlIFVEQVRBOiBPUyA8PCAiVURBVEEiOyBicmVhazsKKyAgY2FzZSBJREFUQTogT1MgPDwgIklEQVRBIjsgYnJlYWs7CisgIGNhc2UgUk9NREFUQTogT1MgPDwgIlJPTURBVEEiOyBicmVhazsKKyAgY2FzZSBVREFUQV9TSFI6IE9TIDw8ICJVREFUQV9TSFIiOyBicmVhazsKKyAgY2FzZSBVREFUQV9PVlI6IE9TIDw8ICJVREFUQV9PVlIiOyBicmVhazsKKyAgY2FzZSBDT0RFOiBPUyA8PCAiQ09ERSI7IGJyZWFrOworICB9CisKKyAgT1MgPDwgJ1x0JzsKKworICAvLyBQcmludCBBZGRyZXNzLgorICBPUyA8PCBBZGRyZXNzOworCisgIE9TIDw8ICdcbic7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2U2VjdGlvbi5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjMzYjUxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZTZWN0aW9uLmgKQEAgLTAsMCArMSw5OSBAQAorLy89PT0tIFBJQzE2U2VjdGlvbi5oIC0gUElDMTYtc3BlY2lmaWMgc2VjdGlvbiByZXByZXNlbnRhdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBQSUMxNlNlY3Rpb24gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BJQzE2U0VDVElPTl9ICisjZGVmaW5lIExMVk1fUElDMTZTRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworICAvLy8gUElDMTZTZWN0aW9uIC0gUmVwcmVzZW50cyBhIHBoeXNpY2FsIHNlY3Rpb24gaW4gUElDMTYgQ09GRi4KKyAgLy8vIENvbnRhaW5zIGRhdGEgb2JqZWN0cy4KKyAgLy8vCisgIGNsYXNzIFBJQzE2U2VjdGlvbiA6IHB1YmxpYyBNQ1NlY3Rpb24geworICAgIC8vLyBQSUMxNiBTZWN0aW9ucyBkb2VzIG5vdCByZWFsbHkgdXNlIHRoZSBTZWN0aW9uS2luZCBjbGFzcyB0bworICAgIC8vLyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHZhcmlvdXMgdHlwZXMgb2Ygc2VjdGlvbnMuIFBJQzE2IG1haW50YWluCisgICAgLy8vIGl0cyBvd24gU2VjdGlvbiBUeXBlIGluZm8uIFNlZSB0aGUgUElDMTZTZWN0aW9uVHlwZSBlbnVtIGluIFBJQzE2LmggCisgICAgLy8vIGZvciB2YXJpb3VzIHNlY3Rpb24gdHlwZXMuCisgICAgUElDMTZTZWN0aW9uVHlwZSBUOworCisgICAgLy8vIE5hbWUgb2YgdGhlIHNlY3Rpb24gdG8gdW5pcXVlbHkgaWRlbnRpZnkgaXQuCisgICAgU3RyaW5nUmVmIE5hbWU7CisKKyAgICAvLy8gVXNlciBjYW4gc3BlY2lmeSBhbiBhZGRyZXNzIGF0IHdoaWNoIGEgc2VjdGlvbiBzaG91bGQgYmUgcGxhY2VkLiAKKyAgICAvLy8gTmVnYXRpdmUgdmFsdWUgaGVyZSBtZWFucyB1c2VyIGhhc24ndCBzcGVjaWZpZWQgYW55LiAKKyAgICBTdHJpbmdSZWYgQWRkcmVzczsgCisKKyAgICAvLy8gT3ZlcmxheSBpbmZvcm1hdGlvbiAtIFNlY3Rpb25zIHdpdGggc2FtZSBjb2xvciBjYW4gYmUgb3ZlcmxhaWQgb24KKyAgICAvLy8gb25lIGFub3RoZXIuCisgICAgaW50IENvbG9yOyAKKworICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbCBkYXRhIG9iamVjdHMgY29udGFpbmVkIGhlcmUuCisgICAgdW5zaWduZWQgU2l6ZTsKKyAgICAKKyAgICBQSUMxNlNlY3Rpb24oU3RyaW5nUmVmIG5hbWUsIFNlY3Rpb25LaW5kIEssIFN0cmluZ1JlZiBhZGRyLCBpbnQgY29sb3IpCisgICAgICA6IE1DU2VjdGlvbihTVl9QSUMxNiwgSyksIE5hbWUobmFtZSksIEFkZHJlc3MoYWRkciksCisgICAgICAgIENvbG9yKGNvbG9yKSwgU2l6ZSgwKSB7CisgICAgfQorICAgIAorICBwdWJsaWM6CisgICAgLy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbi4KKyAgICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAgIC8vLyBSZXR1cm4gdGhlIEFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24uCisgICAgU3RyaW5nUmVmIGdldEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBBZGRyZXNzOyB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBDb2xvciBvZiB0aGUgc2VjdGlvbi4KKyAgICBpbnQgZ2V0Q29sb3IoKSBjb25zdCB7IHJldHVybiBDb2xvcjsgfQorICAgIHZvaWQgc2V0Q29sb3IoaW50IGNvbG9yKSB7IENvbG9yID0gY29sb3I7IH0KKworICAgIC8vLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uCisgICAgdW5zaWduZWQgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKyAgICB2b2lkIHNldFNpemUodW5zaWduZWQgc2l6ZSkgeyBTaXplID0gc2l6ZTsgfQorCisgICAgLy8vIENvbmF0aW5lZCBkYXRhIG9iamVjdHMuCisgICAgLy8gRklYTUU6IFRoaXMgdmVjdG9yIGlzIGxlYWtlZCBiZWNhdXNlIHNlY3Rpb25zIGFyZSBhbGxvY2F0ZWQgd2l0aCBhCisgICAgLy8gICAgICAgIEJ1bXBQdHJBbGxvY2F0b3IuCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgR2xvYmFsVmFyaWFibGUgKj5JdGVtczsKKworICAgIC8vLyBDaGVjayBzZWN0aW9uIHR5cGUuIAorICAgIGJvb2wgaXNVREFUQV9UeXBlKCkgY29uc3QgeyByZXR1cm4gVCA9PSBVREFUQTsgfQorICAgIGJvb2wgaXNJREFUQV9UeXBlKCkgY29uc3QgeyByZXR1cm4gVCA9PSBJREFUQTsgfQorICAgIGJvb2wgaXNST01EQVRBX1R5cGUoKSBjb25zdCB7IHJldHVybiBUID09IFJPTURBVEE7IH0KKyAgICBib29sIGlzVURBVEFfT1ZSX1R5cGUoKSBjb25zdCB7IHJldHVybiBUID09IFVEQVRBX09WUjsgfQorICAgIGJvb2wgaXNVREFUQV9TSFJfVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFQgPT0gVURBVEFfU0hSOyB9CisgICAgYm9vbCBpc0NPREVfVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFQgPT0gQ09ERTsgfQorCisgICAgUElDMTZTZWN0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVDsgfQorCisgICAgLy8vIFRoaXMgd291bGQgYmUgdGhlIG9ubHkgd2F5IHRvIGNyZWF0ZSBhIHNlY3Rpb24uIAorICAgIHN0YXRpYyBQSUMxNlNlY3Rpb24gKkNyZWF0ZShTdHJpbmdSZWYgTmFtZSwgUElDMTZTZWN0aW9uVHlwZSBUeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBBZGRyZXNzLCBpbnQgQ29sb3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCk7CisgICAgCisgICAgLy8vIE92ZXJyaWRlIHRoaXMgYXMgUElDMTYgaGFzIGl0cyBvd24gd2F5IG9mIHByaW50aW5nIHN3aXRjaGluZworICAgIC8vLyB0byBhIHNlY3Rpb24uCisgICAgdmlydHVhbCB2b2lkIFByaW50U3dpdGNoVG9TZWN0aW9uKGNvbnN0IE1DQXNtSW5mbyAmTUFJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ1NlY3Rpb24gKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRWYXJpYW50KCkgPT0gU1ZfUElDMTY7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUElDMTZTZWN0aW9uICopIHsgcmV0dXJuIHRydWU7IH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2U2VsZWN0aW9uREFHSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2U2VsZWN0aW9uREFHSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1OTU1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZTZWxlY3Rpb25EQUdJbmZvLmNwcApAQCAtMCwwICsxLDIzIEBACisvLz09PS0tIFBJQzE2U2VsZWN0aW9uREFHSW5mby5jcHAgLSBQSUMxNiBTZWxlY3Rpb25EQUcgSW5mbyAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBQSUMxNlNlbGVjdGlvbkRBR0luZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwaWMxNi1zZWxlY3Rpb25kYWctaW5mbyIKKyNpbmNsdWRlICJQSUMxNlRhcmdldE1hY2hpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitQSUMxNlNlbGVjdGlvbkRBR0luZm86OlBJQzE2U2VsZWN0aW9uREFHSW5mbyhjb25zdCBQSUMxNlRhcmdldE1hY2hpbmUgJlRNKQorICA6IFRhcmdldFNlbGVjdGlvbkRBR0luZm8oVE0pIHsKK30KKworUElDMTZTZWxlY3Rpb25EQUdJbmZvOjp+UElDMTZTZWxlY3Rpb25EQUdJbmZvKCkgeworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlNlbGVjdGlvbkRBR0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZTZWxlY3Rpb25EQUdJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3ZmQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZTZWxlY3Rpb25EQUdJbmZvLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tLSBQSUMxNlNlbGVjdGlvbkRBR0luZm8uaCAtIFBJQzE2IFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUElDMTYgc3ViY2xhc3MgZm9yIFRhcmdldFNlbGVjdGlvbkRBR0luZm8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQSUMxNlNFTEVDVElPTkRBR0lORk9fSAorI2RlZmluZSBQSUMxNlNFTEVDVElPTkRBR0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFBJQzE2VGFyZ2V0TWFjaGluZTsKKworY2xhc3MgUElDMTZTZWxlY3Rpb25EQUdJbmZvIDogcHVibGljIFRhcmdldFNlbGVjdGlvbkRBR0luZm8geworcHVibGljOgorICBleHBsaWNpdCBQSUMxNlNlbGVjdGlvbkRBR0luZm8oY29uc3QgUElDMTZUYXJnZXRNYWNoaW5lICZUTSk7CisgIH5QSUMxNlNlbGVjdGlvbkRBR0luZm8oKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2U3VidGFyZ2V0LmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZTdWJ0YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZmMzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2U3VidGFyZ2V0LmNwcApAQCAtMCwwICsxLDI3IEBACisvLz09PS0gUElDMTZTdWJ0YXJnZXQuY3BwIC0gUElDMTYgU3VidGFyZ2V0IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgUElDMTYgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0U3VidGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJQSUMxNlN1YnRhcmdldC5oIgorI2luY2x1ZGUgIlBJQzE2R2VuU3VidGFyZ2V0LmluYyIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1BJQzE2U3VidGFyZ2V0OjpQSUMxNlN1YnRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVFQsIGNvbnN0IHN0ZDo6c3RyaW5nICZGUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb29wZXIpCisgIDpJc0Nvb3BlcihDb29wZXIpCit7CisgIHN0ZDo6c3RyaW5nIENQVSA9ICJnZW5lcmljIjsKKworICAvLyBQYXJzZSBmZWF0dXJlcyBzdHJpbmcuCisgIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoRlMsIENQVSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2U3VidGFyZ2V0LmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2U3VidGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlMzc4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZTdWJ0YXJnZXQuaApAQCAtMCwwICsxLDQ0IEBACisvLz09PT09LS0gUElDMTZTdWJ0YXJnZXQuaCAtIERlZmluZSBTdWJ0YXJnZXQgZm9yIHRoZSBQSUMxNiAtLS0qLSBDKysgLSotLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFBJQzE2IHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFBJQzE2U1VCVEFSR0VUX0gKKyNkZWZpbmUgUElDMTZTVUJUQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUElDMTZTdWJ0YXJnZXQgOiBwdWJsaWMgVGFyZ2V0U3VidGFyZ2V0IHsKKworICAvLyBJc0Nvb3BlciAtIFRhcmdldCBJU0EgaXMgQ29vcGVyLgorICBib29sIElzQ29vcGVyOworCitwdWJsaWM6CisgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGluaXRpYWxpemVzIHRoZSBkYXRhIG1lbWJlcnMgdG8gbWF0Y2ggdGhhdAorICAvLy8gb2YgdGhlIHNwZWNpZmllZCB0cmlwbGUuCisgIC8vLworICBQSUMxNlN1YnRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVFQsIGNvbnN0IHN0ZDo6c3RyaW5nICZGUywgYm9vbCBDb29wZXIpOworICAKKyAgLy8vIGlzQ29vcGVyIC0gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgSVNBIGlzIENvb3Blci4KKyAgYm9vbCBpc0Nvb3BlcigpIGNvbnN0IHsgcmV0dXJuIElzQ29vcGVyOyB9CisKKyAgLy8vIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMgLSBQYXJzZXMgZmVhdHVyZXMgc3RyaW5nIHNldHRpbmcgc3BlY2lmaWVkIAorICAvLy8gc3VidGFyZ2V0IG9wdGlvbnMuICBEZWZpbml0aW9uIG9mIGZ1bmN0aW9uIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRibGdlbi4KKyAgc3RkOjpzdHJpbmcgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhjb25zdCBzdGQ6OnN0cmluZyAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkNQVSk7Cit9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmICAvLyBQSUMxNlNVQlRBUkdFVF9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2VGFyZ2V0TWFjaGluZS5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2VGFyZ2V0TWFjaGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiNjliZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZUYXJnZXRNYWNoaW5lLmNwcApAQCAtMCwwICsxLDU1IEBACisvLz09PS0tIFBJQzE2VGFyZ2V0TWFjaGluZS5jcHAgLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgUElDMTYgLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUb3AtbGV2ZWwgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBQSUMxNiB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlBJQzE2LmgiCisjaW5jbHVkZSAiUElDMTZNQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJQSUMxNlRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVQSUMxNlRhcmdldCgpIHsKKyAgLy8gUmVnaXN0ZXIgdGhlIHRhcmdldC4gQ3VycmV0bmx5IHRoZSBjb2RlZ2VuIHdvcmtzIGZvcgorICAvLyBlbmhhbmNlZCBwaWMxNiBtaWQtcmFuZ2UuCisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxQSUMxNlRhcmdldE1hY2hpbmU+IFgoVGhlUElDMTZUYXJnZXQpOworICBSZWdpc3RlckFzbUluZm88UElDMTZNQ0FzbUluZm8+IEEoVGhlUElDMTZUYXJnZXQpOworfQorCisKKy8vIFBJQzE2VGFyZ2V0TWFjaGluZSAtIEVuaGFuY2VkIFBJQzE2IG1pZC1yYW5nZSBNYWNoaW5lLiBNYXkgYWxzbyByZXByZXNlbnQKKy8vIGEgVHJhZGl0aW9uYWwgTWFjaGluZSBpZiAnVHJhZCcgaXMgdHJ1ZS4KK1BJQzE2VGFyZ2V0TWFjaGluZTo6UElDMTZUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTLCBib29sIFRyYWQpCis6IExMVk1UYXJnZXRNYWNoaW5lKFQsIFRUKSwKKyAgU3VidGFyZ2V0KFRULCBGUywgVHJhZCksCisgIERhdGFMYXlvdXQoImUtcDoxNjo4OjgtaTg6ODo4LWkxNjo4OjgtaTMyOjg6OC1uOCIpLCAKKyAgSW5zdHJJbmZvKCp0aGlzKSwgVExJbmZvKCp0aGlzKSwgVFNJbmZvKCp0aGlzKSwKKyAgRnJhbWVJbmZvKFRhcmdldEZyYW1lSW5mbzo6U3RhY2tHcm93c1VwLCA4LCAwKSB7IH0KKworCitib29sIFBJQzE2VGFyZ2V0TWFjaGluZTo6YWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIC8vIEluc3RhbGwgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuCisgIFBNLmFkZChjcmVhdGVQSUMxNklTZWxEYWcoKnRoaXMpKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFBJQzE2VGFyZ2V0TWFjaGluZTo6YWRkUHJlRW1pdFBhc3MoUGFzc01hbmFnZXJCYXNlICZQTSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIFBNLmFkZChjcmVhdGVQSUMxNk1lbVNlbE9wdGltaXplclBhc3MoKSk7CisgIHJldHVybiB0cnVlOyAgLy8gLXByaW50LW1hY2hpbmVpbnN0ciBzaG91bGQgcHJpbnQgYWZ0ZXIgdGhpcy4KK30KKworCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2VGFyZ2V0TWFjaGluZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlRhcmdldE1hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWU1ZDMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlRhcmdldE1hY2hpbmUuaApAQCAtMCwwICsxLDcwIEBACisvLz09PS0tIFBJQzE2VGFyZ2V0TWFjaGluZS5oIC0gRGVmaW5lIFRhcmdldE1hY2hpbmUgZm9yIFBJQzE2IC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgUElDMTYgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0TWFjaGluZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgUElDMTZfVEFSR0VUTUFDSElORV9ICisjZGVmaW5lIFBJQzE2X1RBUkdFVE1BQ0hJTkVfSAorCisjaW5jbHVkZSAiUElDMTZJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJQSUMxNklTZWxMb3dlcmluZy5oIgorI2luY2x1ZGUgIlBJQzE2U2VsZWN0aW9uREFHSW5mby5oIgorI2luY2x1ZGUgIlBJQzE2UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAiUElDMTZTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQSUMxNlRhcmdldE1hY2hpbmUKKy8vLworY2xhc3MgUElDMTZUYXJnZXRNYWNoaW5lIDogcHVibGljIExMVk1UYXJnZXRNYWNoaW5lIHsKKyAgUElDMTZTdWJ0YXJnZXQgICAgICAgIFN1YnRhcmdldDsKKyAgY29uc3QgVGFyZ2V0RGF0YSAgICAgIERhdGFMYXlvdXQ7ICAgICAgIC8vIENhbGN1bGF0ZXMgdHlwZSBzaXplICYgYWxpZ25tZW50CisgIFBJQzE2SW5zdHJJbmZvICAgICAgICBJbnN0ckluZm87CisgIFBJQzE2VGFyZ2V0TG93ZXJpbmcgICBUTEluZm87CisgIFBJQzE2U2VsZWN0aW9uREFHSW5mbyBUU0luZm87CisKKyAgLy8gUElDMTYgZG9lcyBub3QgaGF2ZSBhbnkgY2FsbCBzdGFjayBmcmFtZSwgdGhlcmVmb3JlIG5vdCBoYXZpbmcgCisgIC8vIGFueSBQSUMxNiBzcGVjaWZpYyBGcmFtZUluZm8gY2xhc3MuCisgIFRhcmdldEZyYW1lSW5mbyAgICAgICBGcmFtZUluZm87CisKK3B1YmxpYzoKKyAgUElDMTZUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTLCBib29sIENvb3BlciA9IGZhbHNlKTsKKworICB2aXJ0dWFsIGNvbnN0IFRhcmdldEZyYW1lSW5mbyAqZ2V0RnJhbWVJbmZvKCkgY29uc3QgeyByZXR1cm4gJkZyYW1lSW5mbzsgfQorICB2aXJ0dWFsIGNvbnN0IFBJQzE2SW5zdHJJbmZvICpnZXRJbnN0ckluZm8oKSBjb25zdCAgeyByZXR1cm4gJkluc3RySW5mbzsgfQorICB2aXJ0dWFsIGNvbnN0IFRhcmdldERhdGEgKmdldFRhcmdldERhdGEoKSBjb25zdCAgICAgeyByZXR1cm4gJkRhdGFMYXlvdXQ7fQorICB2aXJ0dWFsIGNvbnN0IFBJQzE2U3VidGFyZ2V0ICpnZXRTdWJ0YXJnZXRJbXBsKCkgY29uc3QgeyByZXR1cm4gJlN1YnRhcmdldDsgfQorIAorICB2aXJ0dWFsIGNvbnN0IFBJQzE2UmVnaXN0ZXJJbmZvICpnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IAorICAgIHJldHVybiAmKEluc3RySW5mby5nZXRSZWdpc3RlckluZm8oKSk7IAorICB9CisKKyAgdmlydHVhbCBjb25zdCBQSUMxNlRhcmdldExvd2VyaW5nICpnZXRUYXJnZXRMb3dlcmluZygpIGNvbnN0IHsgCisgICAgcmV0dXJuICZUTEluZm87CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IFBJQzE2U2VsZWN0aW9uREFHSW5mbyogZ2V0U2VsZWN0aW9uREFHSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gJlRTSW5mbzsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBhZGRJbnN0U2VsZWN0b3IoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisgIHZpcnR1YWwgYm9vbCBhZGRQcmVFbWl0UGFzcyhQYXNzTWFuYWdlckJhc2UgJlBNLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7Cit9OyAvLyBQSUMxNlRhcmdldE1hY2hpbmUuCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlRhcmdldE9iamVjdEZpbGUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlRhcmdldE9iamVjdEZpbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMGY5NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1BJQzE2VGFyZ2V0T2JqZWN0RmlsZS5jcHAKQEAgLTAsMCArMSwzODQgQEAKKy8vPT09LS0gUElDMTZUYXJnZXRPYmplY3RGaWxlLmNwcCAtIFBJQzE2IG9iamVjdCBmaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJQSUMxNlRhcmdldE9iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJQSUMxNlRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJQSUMxNlNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKworUElDMTZUYXJnZXRPYmplY3RGaWxlOjpQSUMxNlRhcmdldE9iamVjdEZpbGUoKSB7Cit9CisKK1BJQzE2VGFyZ2V0T2JqZWN0RmlsZTo6flBJQzE2VGFyZ2V0T2JqZWN0RmlsZSgpIHsKK30KKworLy8vIEZpbmQgYSBwaWMxNiBzZWN0aW9uLiBSZXR1cm4gbnVsbCBpZiBub3QgZm91bmQuIERvIG5vdCBjcmVhdGUgb25lLgorUElDMTZTZWN0aW9uICpQSUMxNlRhcmdldE9iamVjdEZpbGU6OgorZmluZFBJQzE2U2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgY29uc3QgeworICAvLy8gUmV0dXJuIGlmIHdlIGhhdmUgYW4gYWxyZWFkeSBleGlzdGluZyBvbmUuCisgIFBJQzE2U2VjdGlvbiAqRW50cnkgPSBTZWN0aW9uc0J5TmFtZVtOYW1lXTsKKyAgaWYgKEVudHJ5KQorICAgIHJldHVybiBFbnRyeTsKKworICByZXR1cm4gTlVMTDsKK30KKworCisvLy8gRmluZCBhIHBpYzE2IHNlY3Rpb24uIElmIG5vdCBmb3VuZCwgY3JlYXRlIG9uZS4KK1BJQzE2U2VjdGlvbiAqUElDMTZUYXJnZXRPYmplY3RGaWxlOjoKK2dldFBJQzE2U2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgUElDMTZTZWN0aW9uVHlwZSBUeSwgCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkFkZHJlc3MsIGludCBDb2xvcikgY29uc3QgeworCisgIC8vLyBSZXR1cm4gaWYgd2UgaGF2ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZS4KKyAgUElDMTZTZWN0aW9uIComRW50cnkgPSBTZWN0aW9uc0J5TmFtZVtOYW1lXTsKKyAgaWYgKEVudHJ5KQorICAgIHJldHVybiBFbnRyeTsKKworCisgIEVudHJ5ID0gUElDMTZTZWN0aW9uOjpDcmVhdGUoTmFtZSwgVHksIEFkZHJlc3MsIENvbG9yLCBnZXRDb250ZXh0KCkpOworICByZXR1cm4gRW50cnk7Cit9CisKKy8vLyBGaW5kIGEgc3RhbmRhcmQgcGljMTYgZGF0YSBzZWN0aW9uLiBJZiBub3QgZm91bmQsIGNyZWF0ZSBvbmUgYW5kIGtlZXAKKy8vLyB0cmFjayBvZiBpdCBieSBhZGRpbmcgaXQgdG8gYXBwcm9wcmlhdGUgc3RkIHNlY3Rpb24gbGlzdC4KK1BJQzE2U2VjdGlvbiAqUElDMTZUYXJnZXRPYmplY3RGaWxlOjoKK2dldFBJQzE2RGF0YVNlY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIFBJQzE2U2VjdGlvblR5cGUgVHksIAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQWRkcmVzcywgaW50IENvbG9yKSBjb25zdCB7CisKKyAgLy8vIFJldHVybiBpZiB3ZSBoYXZlIGFuIGFscmVhZHkgZXhpc3Rpbmcgb25lLgorICBQSUMxNlNlY3Rpb24gKiZFbnRyeSA9IFNlY3Rpb25zQnlOYW1lW05hbWVdOworICBpZiAoRW50cnkpCisgICAgcmV0dXJuIEVudHJ5OworCisKKyAgLy8vIEVsc2UgY3JlYXRlIGEgbmV3IG9uZSBhbmQgYWRkIGl0IHRvIGFwcHJvcHJpYXRlIHNlY3Rpb24gbGlzdC4KKyAgRW50cnkgPSBQSUMxNlNlY3Rpb246OkNyZWF0ZShOYW1lLCBUeSwgQWRkcmVzcywgQ29sb3IsIGdldENvbnRleHQoKSk7CisKKyAgc3dpdGNoIChUeSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlICgidW5rbm93IHN0YW5kYXJkIHNlY3Rpb24gdHlwZS4iKTsKKyAgY2FzZSBVREFUQTogVURBVEFTZWN0aW9uc18ucHVzaF9iYWNrKEVudHJ5KTsgYnJlYWs7CisgIGNhc2UgSURBVEE6IElEQVRBU2VjdGlvbnNfLnB1c2hfYmFjayhFbnRyeSk7IGJyZWFrOworICBjYXNlIFJPTURBVEE6IFJPTURBVEFTZWN0aW9uXyA9IEVudHJ5OyBicmVhazsKKyAgY2FzZSBVREFUQV9TSFI6IFNIQVJFRFVEQVRBU2VjdGlvbl8gPSBFbnRyeTsgYnJlYWs7CisgIH0KKworICByZXR1cm4gRW50cnk7Cit9CisgICAgCisKKy8vLyBGaW5kIGEgc3RhbmRhcmQgcGljMTYgYXV0b3Mgc2VjdGlvbi4gSWYgbm90IGZvdW5kLCBjcmVhdGUgb25lIGFuZCBrZWVwCisvLy8gdHJhY2sgb2YgaXQgYnkgYWRkaW5nIGl0IHRvIGFwcHJvcHJpYXRlIHN0ZCBzZWN0aW9uIGxpc3QuCitQSUMxNlNlY3Rpb24gKlBJQzE2VGFyZ2V0T2JqZWN0RmlsZTo6CitnZXRQSUMxNkF1dG9TZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBQSUMxNlNlY3Rpb25UeXBlIFR5LCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkFkZHJlc3MsIGludCBDb2xvcikgY29uc3QgeworCisgIC8vLyBSZXR1cm4gaWYgd2UgaGF2ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZS4KKyAgUElDMTZTZWN0aW9uIComRW50cnkgPSBTZWN0aW9uc0J5TmFtZVtOYW1lXTsKKyAgaWYgKEVudHJ5KQorICAgIHJldHVybiBFbnRyeTsKKworCisgIC8vLyBFbHNlIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIGFkZCBpdCB0byBhcHByb3ByaWF0ZSBzZWN0aW9uIGxpc3QuCisgIEVudHJ5ID0gUElDMTZTZWN0aW9uOjpDcmVhdGUoTmFtZSwgVHksIEFkZHJlc3MsIENvbG9yLCBnZXRDb250ZXh0KCkpOworCisgIGFzc2VydCAoVHkgPT0gVURBVEFfT1ZSICYmICJpbmNvcnJlY3Qgc2VjdGlvbiB0eXBlIGZvciBhdXRvcyIpOworICBBVVRPU2VjdGlvbnNfLnB1c2hfYmFjayhFbnRyeSk7CisKKyAgcmV0dXJuIEVudHJ5OworfQorICAgIAorLy8vIEZpbmQgYSBwaWMxNiB1c2VyIHNlY3Rpb24uIElmIG5vdCBmb3VuZCwgY3JlYXRlIG9uZSBhbmQga2VlcAorLy8vIHRyYWNrIG9mIGl0IGJ5IGFkZGluZyBpdCB0byBhcHByb3ByaWF0ZSBzdGQgc2VjdGlvbiBsaXN0LgorUElDMTZTZWN0aW9uICpQSUMxNlRhcmdldE9iamVjdEZpbGU6OgorZ2V0UElDMTZVc2VyU2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgUElDMTZTZWN0aW9uVHlwZSBUeSwgCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZBZGRyZXNzLCBpbnQgQ29sb3IpIGNvbnN0IHsKKworICAvLy8gUmV0dXJuIGlmIHdlIGhhdmUgYW4gYWxyZWFkeSBleGlzdGluZyBvbmUuCisgIFBJQzE2U2VjdGlvbiAqJkVudHJ5ID0gU2VjdGlvbnNCeU5hbWVbTmFtZV07CisgIGlmIChFbnRyeSkKKyAgICByZXR1cm4gRW50cnk7CisKKworICAvLy8gRWxzZSBjcmVhdGUgYSBuZXcgb25lIGFuZCBhZGQgaXQgdG8gYXBwcm9wcmlhdGUgc2VjdGlvbiBsaXN0LgorICBFbnRyeSA9IFBJQzE2U2VjdGlvbjo6Q3JlYXRlKE5hbWUsIFR5LCBBZGRyZXNzLCBDb2xvciwgZ2V0Q29udGV4dCgpKTsKKworICBVU0VSU2VjdGlvbnNfLnB1c2hfYmFjayhFbnRyeSk7CisKKyAgcmV0dXJuIEVudHJ5OworfQorCisvLy8gRG8gc29tZSBzdGFuZGFyZCBpbml0aWFsaXphdGlvbi4KK3ZvaWQgUElDMTZUYXJnZXRPYmplY3RGaWxlOjpJbml0aWFsaXplKE1DQ29udGV4dCAmQ3R4LCBjb25zdCBUYXJnZXRNYWNoaW5lICZ0bSl7CisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZTo6SW5pdGlhbGl6ZShDdHgsIHRtKTsKKyAgVE0gPSAmdG07CisgIAorICBST01EQVRBU2VjdGlvbl8gPSBOVUxMOworICBTSEFSRURVREFUQVNlY3Rpb25fID0gTlVMTDsKK30KKworLy8vIGFsbG9jYXRlVURBVEEgLSBBbGxvY2F0ZSBhIHVuLWluaXRpYWxpemVkIGdsb2JhbCB0byBhbiBleGlzdGluZyBvciBuZXcgVURBVEEKKy8vLyBzZWN0aW9uIGFuZCByZXR1cm4gdGhhdCBzZWN0aW9uLgorY29uc3QgTUNTZWN0aW9uICoKK1BJQzE2VGFyZ2V0T2JqZWN0RmlsZTo6YWxsb2NhdGVVREFUQShjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIGNvbnN0IHsKKyAgYXNzZXJ0KEdWLT5oYXNJbml0aWFsaXplcigpICYmICJUaGlzIGdsb2JhbCBkb2Vzbid0IG5lZWQgc3BhY2UiKTsKKyAgY29uc3QgQ29uc3RhbnQgKkMgPSBHVi0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgYXNzZXJ0KEMtPmlzTnVsbFZhbHVlKCkgJiYgIlVuaXRpYWxpemVkIGdsb2JhbHMgaGFzIG5vbi16ZXJvIGluaXRpYWxpemVyIik7CisKKyAgLy8gRmluZCBob3cgbXVjaCBzcGFjZSB0aGlzIGdsb2JhbCBuZWVkcy4KKyAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSBUTS0+Z2V0VGFyZ2V0RGF0YSgpOworICBjb25zdCBUeXBlICpUeSA9IEMtPmdldFR5cGUoKTsgCisgIHVuc2lnbmVkIFZhbFNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShUeSk7CisgCisgIC8vIEdvIHRocm91Z2ggYWxsIFVEQVRBIFNlY3Rpb25zIGFuZCBhc3NpZ24gdGhpcyB2YXJpYWJsZQorICAvLyB0byB0aGUgZmlyc3QgYXZhaWxhYmxlIHNlY3Rpb24gaGF2aW5nIGVub3VnaCBzcGFjZS4KKyAgUElDMTZTZWN0aW9uICpGb3VuZCA9IE5VTEw7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBVREFUQVNlY3Rpb25zXy5zaXplKCk7IGkrKykgeworICAgIGlmIChEYXRhQmFua1NpemUgLSBVREFUQVNlY3Rpb25zX1tpXS0+Z2V0U2l6ZSgpID49IFZhbFNpemUpIHsKKyAgICAgIEZvdW5kID0gVURBVEFTZWN0aW9uc19baV07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBObyBVREFUQSBzZWN0aW9uIHNwYWNpb3VzIGVub3VnaCB3YXMgZm91bmQuIENyYXRlIGEgbmV3IG9uZS4KKyAgaWYgKCFGb3VuZCkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBQQU46OmdldFVkYXRhU2VjdGlvbk5hbWUoVURBVEFTZWN0aW9uc18uc2l6ZSgpKTsKKyAgICBGb3VuZCA9IGdldFBJQzE2RGF0YVNlY3Rpb24obmFtZS5jX3N0cigpLCBVREFUQSk7CisgIH0KKyAgCisgIC8vIEluc2VydCB0aGUgR1YgaW50byB0aGlzIFVEQVRBIHNlY3Rpb24uCisgIEZvdW5kLT5JdGVtcy5wdXNoX2JhY2soR1YpOworICBGb3VuZC0+c2V0U2l6ZShGb3VuZC0+Z2V0U2l6ZSgpICsgVmFsU2l6ZSk7CisgIHJldHVybiBGb3VuZDsKK30gCisKKy8vLyBhbGxvY2F0ZUlEQVRBIC0gYWxsb2NhdGUgYW4gaW5pdGlhbGl6ZWQgZ2xvYmFsIGludG8gYW4gZXhpc3RpbmcKKy8vLyBvciBuZXcgc2VjdGlvbiBhbmQgcmV0dXJuIHRoYXQgc2VjdGlvbi4KK2NvbnN0IE1DU2VjdGlvbiAqCitQSUMxNlRhcmdldE9iamVjdEZpbGU6OmFsbG9jYXRlSURBVEEoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKSBjb25zdHsKKyAgYXNzZXJ0KEdWLT5oYXNJbml0aWFsaXplcigpICYmICJUaGlzIGdsb2JhbCBkb2Vzbid0IG5lZWQgc3BhY2UiKTsKKyAgY29uc3QgQ29uc3RhbnQgKkMgPSBHVi0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgYXNzZXJ0KCFDLT5pc051bGxWYWx1ZSgpICYmICJpbml0aWFsaXplZCBnbG9iYWxzIGhhcyB6ZXJvIGluaXRpYWxpemVyIik7CisgIGFzc2VydChHVi0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSA9PSBQSUMxNklTRDo6UkFNX1NQQUNFICYmCisgICAgICAgICAiY2FuIGFsbG9jYXRlIGluaXRpYWxpemVkIFJBTSBkYXRhIG9ubHkiKTsKKworICAvLyBGaW5kIGhvdyBtdWNoIHNwYWNlIHRoaXMgZ2xvYmFsIG5lZWRzLgorICBjb25zdCBUYXJnZXREYXRhICpURCA9IFRNLT5nZXRUYXJnZXREYXRhKCk7CisgIGNvbnN0IFR5cGUgKlR5ID0gQy0+Z2V0VHlwZSgpOyAKKyAgdW5zaWduZWQgVmFsU2l6ZSA9IFRELT5nZXRUeXBlQWxsb2NTaXplKFR5KTsKKyAKKyAgLy8gR28gdGhyb3VnaCBhbGwgSURBVEEgU2VjdGlvbnMgYW5kIGFzc2lnbiB0aGlzIHZhcmlhYmxlCisgIC8vIHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgc2VjdGlvbiBoYXZpbmcgZW5vdWdoIHNwYWNlLgorICBQSUMxNlNlY3Rpb24gKkZvdW5kID0gTlVMTDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IElEQVRBU2VjdGlvbnNfLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKERhdGFCYW5rU2l6ZSAtIElEQVRBU2VjdGlvbnNfW2ldLT5nZXRTaXplKCkgPj0gVmFsU2l6ZSkgeworICAgICAgRm91bmQgPSBJREFUQVNlY3Rpb25zX1tpXTsgCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBObyBJREFUQSBzZWN0aW9uIHNwYWNpb3VzIGVub3VnaCB3YXMgZm91bmQuIENyYXRlIGEgbmV3IG9uZS4KKyAgaWYgKCFGb3VuZCkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBQQU46OmdldElkYXRhU2VjdGlvbk5hbWUoSURBVEFTZWN0aW9uc18uc2l6ZSgpKTsKKyAgICBGb3VuZCA9IGdldFBJQzE2RGF0YVNlY3Rpb24obmFtZS5jX3N0cigpLCBJREFUQSk7CisgIH0KKyAgCisgIC8vIEluc2VydCB0aGUgR1YgaW50byB0aGlzIElEQVRBLgorICBGb3VuZC0+SXRlbXMucHVzaF9iYWNrKEdWKTsKKyAgRm91bmQtPnNldFNpemUoRm91bmQtPmdldFNpemUoKSArIFZhbFNpemUpOworICByZXR1cm4gRm91bmQ7Cit9IAorCisvLyBBbGxvY2F0ZSBhIHByb2dyYW0gbWVtb3J5IHZhcmlhYmxlIGludG8gUk9NREFUQSBzZWN0aW9uLgorY29uc3QgTUNTZWN0aW9uICoKK1BJQzE2VGFyZ2V0T2JqZWN0RmlsZTo6YWxsb2NhdGVST01EQVRBKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgY29uc3QgeworCisgIHN0ZDo6c3RyaW5nIG5hbWUgPSBQQU46OmdldFJvbWRhdGFTZWN0aW9uTmFtZSgpOworICBQSUMxNlNlY3Rpb24gKlMgPSBnZXRQSUMxNkRhdGFTZWN0aW9uKG5hbWUuY19zdHIoKSwgUk9NREFUQSk7CisKKyAgUy0+SXRlbXMucHVzaF9iYWNrKEdWKTsKKyAgcmV0dXJuIFM7Cit9CisKKy8vIEdldCB0aGUgc2VjdGlvbiBmb3IgYW4gYXV0b21hdGljIHZhcmlhYmxlIG9mIGEgZnVuY3Rpb24uCisvLyBGb3IgUElDMTYgdGhleSBhcmUgZ2xvYmFscyBvbmx5IHdpdGggbWFuZ2xlZCBuYW1lcy4KK2NvbnN0IE1DU2VjdGlvbiAqCitQSUMxNlRhcmdldE9iamVjdEZpbGU6OmFsbG9jYXRlQVVUTyhjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIGNvbnN0IHsKKworICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gUEFOOjpnZXRTZWN0aW9uTmFtZUZvclN5bShHVi0+Z2V0TmFtZSgpKTsKKyAgUElDMTZTZWN0aW9uICpTID0gZ2V0UElDMTZBdXRvU2VjdGlvbihuYW1lLmNfc3RyKCkpOworCisgIFMtPkl0ZW1zLnB1c2hfYmFjayhHVik7CisgIHJldHVybiBTOworfQorCisKKy8vIE92ZXJyaWRlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcHV0IHRoZSB0cnVlIGdsb2JhbHMgaW50bworLy8gbXVsdGlwbGUgZGF0YSBzZWN0aW9ucyBpZiByZXF1aXJlZC4KK2NvbnN0IE1DU2VjdGlvbiAqCitQSUMxNlRhcmdldE9iamVjdEZpbGU6OlNlbGVjdFNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmdsZXIgKk1hbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IHsKKyAgLy8gV2Ugc2VsZWN0IHRoZSBzZWN0aW9uIGJhc2VkIG9uIHRoZSBpbml0aWFsaXplciBoZXJlLCBzbyBpdCByZWFsbHkKKyAgLy8gaGFzIHRvIGJlIGEgR2xvYmFsVmFyaWFibGUuCisgIGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihHVjEpOyAKKyAgaWYgKCFHVikKKyAgICByZXR1cm4gVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlOjpTZWxlY3RTZWN0aW9uRm9yR2xvYmFsKEdWMSwgS2luZCwgTWFuZyxUTSk7CisKKyAgYXNzZXJ0KEdWLT5oYXNJbml0aWFsaXplcigpICYmICJBIGRlZiB3aXRob3V0IGluaXRpYWxpemVyPyIpOworCisgIC8vIEZpcnN0LCBpZiB0aGlzIGlzIGFuIGF1dG9tYXRpYyB2YXJpYWJsZSBmb3IgYSBmdW5jdGlvbiwgZ2V0IHRoZSBzZWN0aW9uCisgIC8vIG5hbWUgZm9yIGl0IGFuZCByZXR1cm4uCisgIHN0ZDo6c3RyaW5nIG5hbWUgPSBHVi0+Z2V0TmFtZSgpOworICBpZiAoUEFOOjppc0xvY2FsTmFtZShuYW1lKSkKKyAgICByZXR1cm4gYWxsb2NhdGVBVVRPKEdWKTsKKworICAvLyBTZWUgaWYgdGhpcyBpcyBhbiB1bmluaXRpYWxpemVkIGdsb2JhbC4KKyAgY29uc3QgQ29uc3RhbnQgKkMgPSBHVi0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgaWYgKEMtPmlzTnVsbFZhbHVlKCkpIAorICAgIHJldHVybiBhbGxvY2F0ZVVEQVRBKEdWKTsKKworICAvLyBJZiB0aGlzIGlzIGluaXRpYWxpemVkIGRhdGEgaW4gUkFNLiBQdXQgaXQgaW4gdGhlIGNvcnJlY3QgSURBVEEgc2VjdGlvbi4KKyAgaWYgKEdWLT5nZXRUeXBlKCktPmdldEFkZHJlc3NTcGFjZSgpID09IFBJQzE2SVNEOjpSQU1fU1BBQ0UpIAorICAgIHJldHVybiBhbGxvY2F0ZUlEQVRBKEdWKTsKKworICAvLyBUaGlzIGlzIGluaXRpYWxpemVkIGRhdGEgaW4gcm9tLCBwdXQgaXQgaW4gdGhlIHJlYWRvbmx5IHNlY3Rpb24uCisgIGlmIChHVi0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSA9PSBQSUMxNklTRDo6Uk9NX1NQQUNFKSAKKyAgICByZXR1cm4gYWxsb2NhdGVST01EQVRBKEdWKTsKKworICAvLyBFbHNlIGxldCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0YWtlIGNhcmUgb2YgaXQuCisgIHJldHVybiBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGU6OlNlbGVjdFNlY3Rpb25Gb3JHbG9iYWwoR1YsIEtpbmQsIE1hbmcsVE0pOworfQorCisKKworCisvLy8gZ2V0RXhwbGljaXRTZWN0aW9uR2xvYmFsIC0gQWxsb3cgdGhlIHRhcmdldCB0byBjb21wbGV0ZWx5IG92ZXJyaWRlCisvLy8gc2VjdGlvbiBhc3NpZ25tZW50IG9mIGEgZ2xvYmFsLgorY29uc3QgTUNTZWN0aW9uICpQSUMxNlRhcmdldE9iamVjdEZpbGU6OgorZ2V0RXhwbGljaXRTZWN0aW9uR2xvYmFsKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgU2VjdGlvbktpbmQgS2luZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFuZ2xlciAqTWFuZywgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IHsKKyAgYXNzZXJ0KEdWLT5oYXNTZWN0aW9uKCkpOworICAKKyAgaWYgKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVmFyID0gY2FzdDxHbG9iYWxWYXJpYWJsZT4oR1YpKSB7CisgICAgc3RkOjpzdHJpbmcgU2VjdE5hbWUgPSBHVmFyLT5nZXRTZWN0aW9uKCk7CisgICAgLy8gSWYgYWRkcmVzcyBmb3IgYSB2YXJpYWJsZSBpcyBzcGVjaWZpZWQsIGdldCB0aGUgYWRkcmVzcyBhbmQgY3JlYXRlCisgICAgLy8gc2VjdGlvbi4KKyAgICAvLyBGSVhNRTogbW92ZSB0aGlzIGF0dHJpYnV0ZSBjaGVja2luZyBpbiBQQU4uCisgICAgc3RkOjpzdHJpbmcgQWRkclN0ciA9ICJBZGRyZXNzPSI7CisgICAgaWYgKFNlY3ROYW1lLmNvbXBhcmUoMCwgQWRkclN0ci5sZW5ndGgoKSwgQWRkclN0cikgPT0gMCkgeworICAgICAgc3RkOjpzdHJpbmcgU2VjdEFkZHIgPSBTZWN0TmFtZS5zdWJzdHIoQWRkclN0ci5sZW5ndGgoKSk7CisgICAgICBpZiAoU2VjdEFkZHIuY29tcGFyZSgiTkVBUiIpID09IDApCisgICAgICAgIHJldHVybiBhbGxvY2F0ZVNIQVJFRChHVmFyLCBNYW5nKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGFsbG9jYXRlQXRHaXZlbkFkZHJlc3MoR1ZhciwgU2VjdEFkZHIpOworICAgIH0KKyAgICAgCisgICAgLy8gQ3JlYXRlIHRoZSBzZWN0aW9uIHNwZWNpZmllZCB3aXRoIHNlY3Rpb24gYXR0cmlidXRlLiAKKyAgICByZXR1cm4gYWxsb2NhdGVJbkdpdmVuU2VjdGlvbihHVmFyKTsKKyAgfQorCisgIHJldHVybiBnZXRQSUMxNkRhdGFTZWN0aW9uKEdWLT5nZXRTZWN0aW9uKCkuY19zdHIoKSwgVURBVEEpOworfQorCitjb25zdCBNQ1NlY3Rpb24gKgorUElDMTZUYXJnZXRPYmplY3RGaWxlOjphbGxvY2F0ZVNIQVJFRChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmdsZXIgKk1hbmcpIGNvbnN0IHsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBhbiB1bmluaXRpYWxpemVkIGdsb2JhbC4KKyAgYXNzZXJ0KEdWLT5oYXNJbml0aWFsaXplcigpICYmICJUaGlzIGdsb2JhbCBkb2Vzbid0IG5lZWQgc3BhY2UiKTsKKyAgaWYgKCFHVi0+Z2V0SW5pdGlhbGl6ZXIoKS0+aXNOdWxsVmFsdWUoKSkgeworICAgIC8vIEZJWE1FOiBHZW5lcmF0ZSBhIHdhcm5pbmcgaW4gdGhpcyBjYXNlIHRoYXQgbmVhciBxdWFsaWZpZXIgd2lsbCBiZSAKKyAgICAvLyBpZ25vcmVkLgorICAgIHJldHVybiBTZWxlY3RTZWN0aW9uRm9yR2xvYmFsKEdWLCBTZWN0aW9uS2luZDo6Z2V0RGF0YVJlbCgpLCBNYW5nLCAqVE0pOyAKKyAgfSAKKyAgc3RkOjpzdHJpbmcgTmFtZSA9IFBBTjo6Z2V0U2hhcmVkVURhdGFTZWN0aW9uTmFtZSgpOyAKKworICBQSUMxNlNlY3Rpb24gKlNoYXJlZFVEYXRhU2VjdCA9IGdldFBJQzE2RGF0YVNlY3Rpb24oTmFtZS5jX3N0cigpLCBVREFUQV9TSFIpOyAKKyAgLy8gSW5zZXJ0IHRoZSBHViBpbnRvIHNoYXJlZCBzZWN0aW9uLgorICBTaGFyZWRVRGF0YVNlY3QtPkl0ZW1zLnB1c2hfYmFjayhHVik7CisgIHJldHVybiBTaGFyZWRVRGF0YVNlY3Q7Cit9CisKKworLy8gSW50ZXJmYWNlIHVzZWQgYnkgQXNtUHJpbnRlciB0byBnZXQgYSBjb2RlIHNlY3Rpb24gZm9yIGEgZnVuY3Rpb24uCitjb25zdCBQSUMxNlNlY3Rpb24gKgorUElDMTZUYXJnZXRPYmplY3RGaWxlOjpTZWN0aW9uRm9yQ29kZShjb25zdCBzdGQ6OnN0cmluZyAmRm5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzSVNSKSBjb25zdCB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZzZWNfbmFtZSA9IFBBTjo6Z2V0Q29kZVNlY3Rpb25OYW1lKEZuTmFtZSk7CisgIC8vIElmIGl0IGlzIElTUiwgaXRzIGNvZGUgc2VjdGlvbiBzdGFydHMgYXQgYSBzcGVjaWZpYyBhZGRyZXNzLgorICBpZiAoaXNJU1IpCisgICAgcmV0dXJuIGdldFBJQzE2U2VjdGlvbihzZWNfbmFtZSwgQ09ERSwgUEFOOjpnZXRJU1JBZGRyKCkpOworICByZXR1cm4gZ2V0UElDMTZTZWN0aW9uKHNlY19uYW1lLCBDT0RFKTsKK30KKworLy8gSW50ZXJmYWNlIHVzZWQgYnkgQXNtUHJpbnRlciB0byBnZXQgYSBmcmFtZSBzZWN0aW9uIGZvciBhIGZ1bmN0aW9uLgorY29uc3QgUElDMTZTZWN0aW9uICoKK1BJQzE2VGFyZ2V0T2JqZWN0RmlsZTo6U2VjdGlvbkZvckZyYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZGbk5hbWUpIGNvbnN0IHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJnNlY19uYW1lID0gUEFOOjpnZXRGcmFtZVNlY3Rpb25OYW1lKEZuTmFtZSk7CisgIHJldHVybiBnZXRQSUMxNlNlY3Rpb24oc2VjX25hbWUsIFVEQVRBX09WUik7Cit9CisKKy8vIEFsbG9jYXRlIGEgZ2xvYmFsIHZhciBpbiBleGlzdGluZyBvciBuZXcgc2VjdGlvbiBvZiBnaXZlbiBuYW1lLgorY29uc3QgTUNTZWN0aW9uICoKK1BJQzE2VGFyZ2V0T2JqZWN0RmlsZTo6YWxsb2NhdGVJbkdpdmVuU2VjdGlvbihjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIGNvbnN0IHsKKyAgLy8gRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHNlY3Rpb24gdGhhdCB3ZSBuZWVkIHRvIGNyZWF0ZS4KKyAgUElDMTZTZWN0aW9uVHlwZSBTZWNUeTsKKworICAvLyBTZWUgaWYgdGhpcyBpcyBhbiB1bmluaXRpYWxpemVkIGdsb2JhbC4KKyAgY29uc3QgQ29uc3RhbnQgKkMgPSBHVi0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgaWYgKEMtPmlzTnVsbFZhbHVlKCkpCisgICAgU2VjVHkgPSBVREFUQTsKKyAgLy8gSWYgdGhpcyBpcyBpbml0aWFsaXplZCBkYXRhIGluIFJBTS4gUHV0IGl0IGluIHRoZSBjb3JyZWN0IElEQVRBIHNlY3Rpb24uCisgIGVsc2UgaWYgKEdWLT5nZXRUeXBlKCktPmdldEFkZHJlc3NTcGFjZSgpID09IFBJQzE2SVNEOjpSQU1fU1BBQ0UpCisgICAgU2VjVHkgPSBJREFUQTsKKyAgLy8gVGhpcyBpcyBpbml0aWFsaXplZCBkYXRhIGluIHJvbSwgcHV0IGl0IGluIHRoZSByZWFkb25seSBzZWN0aW9uLgorICBlbHNlIGlmIChHVi0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSA9PSBQSUMxNklTRDo6Uk9NX1NQQUNFKSAKKyAgICBTZWNUeSA9IFJPTURBVEE7CisgIGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlICgiQ291bGQgbm90IGRldGVybWluZSBzZWN0aW9uIHR5cGUgZm9yIGdsb2JhbCIpOworCisgIFBJQzE2U2VjdGlvbiAqUyA9IGdldFBJQzE2VXNlclNlY3Rpb24oR1YtPmdldFNlY3Rpb24oKS5jX3N0cigpLCBTZWNUeSk7CisgIFMtPkl0ZW1zLnB1c2hfYmFjayhHVik7CisgIHJldHVybiBTOworfQorCisvLyBBbGxvY2F0ZSBhIGdsb2JhbCB2YXIgaW4gYSBuZXcgYWJzb2x1dGUgc2VjdGlvbnMgYXQgZ2l2ZW4gYWRkcmVzcy4KK2NvbnN0IE1DU2VjdGlvbiAqCitQSUMxNlRhcmdldE9iamVjdEZpbGU6OmFsbG9jYXRlQXRHaXZlbkFkZHJlc3MoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQWRkcikgY29uc3QgeworICAvLyBEZXRlcm1pbmUgdGhlIHR5cGUgb2Ygc2VjdGlvbiB0aGF0IHdlIG5lZWQgdG8gY3JlYXRlLgorICBQSUMxNlNlY3Rpb25UeXBlIFNlY1R5OworCisgIC8vIFNlZSBpZiB0aGlzIGlzIGFuIHVuaW5pdGlhbGl6ZWQgZ2xvYmFsLgorICBjb25zdCBDb25zdGFudCAqQyA9IEdWLT5nZXRJbml0aWFsaXplcigpOworICBpZiAoQy0+aXNOdWxsVmFsdWUoKSkKKyAgICBTZWNUeSA9IFVEQVRBOworICAvLyBJZiB0aGlzIGlzIGluaXRpYWxpemVkIGRhdGEgaW4gUkFNLiBQdXQgaXQgaW4gdGhlIGNvcnJlY3QgSURBVEEgc2VjdGlvbi4KKyAgZWxzZSBpZiAoR1YtPmdldFR5cGUoKS0+Z2V0QWRkcmVzc1NwYWNlKCkgPT0gUElDMTZJU0Q6OlJBTV9TUEFDRSkKKyAgICBTZWNUeSA9IElEQVRBOworICAvLyBUaGlzIGlzIGluaXRpYWxpemVkIGRhdGEgaW4gcm9tLCBwdXQgaXQgaW4gdGhlIHJlYWRvbmx5IHNlY3Rpb24uCisgIGVsc2UgaWYgKEdWLT5nZXRUeXBlKCktPmdldEFkZHJlc3NTcGFjZSgpID09IFBJQzE2SVNEOjpST01fU1BBQ0UpIAorICAgIFNlY1R5ID0gUk9NREFUQTsKKyAgZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUgKCJDb3VsZCBub3QgZGV0ZXJtaW5lIHNlY3Rpb24gdHlwZSBmb3IgZ2xvYmFsIik7CisKKyAgc3RkOjpzdHJpbmcgUHJlZml4ID0gR1YtPmdldE5hbWVTdHIoKSArICIuIiArIEFkZHIgKyAiLiI7CisgIHN0ZDo6c3RyaW5nIFNOYW1lID0gUEFOOjpnZXRVc2VyU2VjdGlvbk5hbWUoUHJlZml4KTsKKyAgUElDMTZTZWN0aW9uICpTID0gZ2V0UElDMTZVc2VyU2VjdGlvbihTTmFtZS5jX3N0cigpLCBTZWNUeSwgQWRkci5jX3N0cigpKTsKKyAgUy0+SXRlbXMucHVzaF9iYWNrKEdWKTsKKyAgcmV0dXJuIFM7Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9QSUMxNlRhcmdldE9iamVjdEZpbGUuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZUYXJnZXRPYmplY3RGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlYjlmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvUElDMTZUYXJnZXRPYmplY3RGaWxlLmgKQEAgLTAsMCArMSwxNjggQEAKKy8vPT09LS0gUElDMTZUYXJnZXRPYmplY3RGaWxlLmggLSBQSUMxNiBPYmplY3QgSW5mbyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfUElDMTZfVEFSR0VUT0JKRUNURklMRV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1BJQzE2X1RBUkdFVE9CSkVDVEZJTEVfSAorCisjaW5jbHVkZSAiUElDMTYuaCIKKyNpbmNsdWRlICJQSUMxNkFCSU5hbWVzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBHbG9iYWxWYXJpYWJsZTsKKyAgY2xhc3MgTW9kdWxlOworICBjbGFzcyBQSUMxNlRhcmdldE1hY2hpbmU7CisgIGNsYXNzIFBJQzE2U2VjdGlvbjsKKyAgCisgIGVudW0geyBEYXRhQmFua1NpemUgPSA4MCB9OworCisgIC8vLyBQSUMxNiBTcGxpdHMgdGhlIGdsb2JhbCBkYXRhIGludG8gbXVsaXRwbGUgdWRhdGEgYW5kIGlkYXRhIHNlY3Rpb25zLgorICAvLy8gRWFjaCB1ZGF0YSBhbmQgaWRhdGEgc2VjdGlvbiBuZWVkcyB0byBjb250YWluIGEgbGlzdCBvZiBnbG9iYWxzIHRoYXQKKyAgLy8vIHRoZXkgY29udGFpbiwgaW4gb3JkZXIgdG8gYXZvaWQgc2Nhbm5pbmcgb3ZlciBhbGwgdGhlIGdsb2JhbCB2YWx1ZXMgCisgIC8vLyBhZ2FpbiBhbmQgcHJpbnRpbmcgb25seSB0aG9zZSB0aGF0IG1hdGNoIHRoZSBjdXJyZW50IHNlY3Rpb24uIAorICAvLy8gS2VlcGluZyB2YWx1ZXMgaW5zaWRlIHRoZSBzZWN0aW9ucyBtYWtlIHByaW50aW5nIGEgc2VjdGlvbiBtdWNoIGVhc2llci4KKyAgLy8vCisgIC8vLyBGSVhNRTogTU9WRSBBTEwgVEhJUyBTVFVGRiBUTyBQSUMxNlNlY3Rpb24uCisgIC8vLworCisgIC8vLyBQSUMxNlRhcmdldE9iamVjdEZpbGUgLSBQSUMxNiBPYmplY3QgZmlsZS4gQ29udGFpbnMgZGF0YSBhbmQgY29kZQorICAvLy8gc2VjdGlvbnMuIAorICAvLyBQSUMxNiBPYmplY3QgRmlsZSBoYXMgdHdvIHR5cGVzIG9mIHNlY3Rpb25zLgorICAvLyAxLiBTdGFuZGFyZCBTZWN0aW9ucworICAvLyAgICAxLjEgdW4taW5pdGlhbGl6ZWQgZ2xvYmFsIGRhdGEgCisgIC8vICAgIDEuMiBpbml0aWFsaXplZCBnbG9iYWwgZGF0YQorICAvLyAgICAxLjMgcHJvZ3JhbSBtZW1vcnkgZGF0YQorICAvLyAgICAxLjQgbG9jYWwgdmFyaWFibGVzIG9mIGZ1bmN0aW9ucy4KKyAgLy8gMi4gVXNlciBkZWZpbmVkIHNlY3Rpb25zCisgIC8vICAgIDIuMSBPYmplY3RzIHBsYWNlZCBpbiBhIHNwZWNpZmljIHNlY3Rpb24uIChCeSBfU2VjdGlvbigpIG1hY3JvKQorICAvLyAgICAyLjIgT2JqZWN0cyBwbGFjZWQgYXQgYSBzcGVjaWZpYyBhZGRyZXNzLiAoQnkgX0FkZHJlc3MoKSBtYWNybykKKyAgY2xhc3MgUElDMTZUYXJnZXRPYmplY3RGaWxlIDogcHVibGljIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSB7CisgICAgLy8vIFNlY3Rpb25zQnlOYW1lIC0gQmluZGluZ3Mgb2YgbmFtZXMgdG8gYWxsb2NhdGVkIHNlY3Rpb25zLgorICAgIG11dGFibGUgU3RyaW5nTWFwPFBJQzE2U2VjdGlvbio+IFNlY3Rpb25zQnlOYW1lOworCisgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAqVE07CisgICAgCisgICAgLy8vIExpc3RzIG9mIHNlY3Rpb25zLgorICAgIC8vLyBTdGFuZGFyZCBEYXRhIFNlY3Rpb25zLgorICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8UElDMTZTZWN0aW9uICo+IFVEQVRBU2VjdGlvbnNfOworICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8UElDMTZTZWN0aW9uICo+IElEQVRBU2VjdGlvbnNfOworICAgIG11dGFibGUgUElDMTZTZWN0aW9uICogUk9NREFUQVNlY3Rpb25fOworICAgIG11dGFibGUgUElDMTZTZWN0aW9uICogU0hBUkVEVURBVEFTZWN0aW9uXzsKKworICAgIC8vLyBTdGFuZGFyZCBBdXRvIFNlY3Rpb25zLgorICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8UElDMTZTZWN0aW9uICo+IEFVVE9TZWN0aW9uc187CisgCisgICAgLy8vIFVzZXIgc3BlY2lmaWVkIHNlY3Rpb25zLgorICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8UElDMTZTZWN0aW9uICo+IFVTRVJTZWN0aW9uc187CisKKyAgICAKKyAgICAvLy8gRmluZCBvciBDcmVhdGUgYSBQSUMxNiBTZWN0aW9uLCB3aXRob3V0IGFkZGluZyBpdCB0byBhbnkKKyAgICAvLy8gc2VjdGlvbiBsaXN0LgorICAgIFBJQzE2U2VjdGlvbiAqZ2V0UElDMTZTZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSUMxNlNlY3Rpb25UeXBlIFR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkFkZHJlc3MgPSAiIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvciA9IC0xKSBjb25zdDsKKworICAgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbnMuIFRoZXNlIHdyYXBwZXJzIGFsc28gdGFrZSBjYXJlIG9mIGFkZGluZyAKKyAgICAvLy8gdGhlIG5ld2x5IGNyZWF0ZWQgc2VjdGlvbiB0byB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbnMgbGlzdC4KKworICAgIC8vLyBGaW5kIG9yIENyZWF0ZSBQSUMxNiBTdGFuZGFyZCBEYXRhIFNlY3Rpb24uCisgICAgUElDMTZTZWN0aW9uICpnZXRQSUMxNkRhdGFTZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElDMTZTZWN0aW9uVHlwZSBUeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQWRkcmVzcyA9ICIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvciA9IC0xKSBjb25zdDsKKworICAgIC8vLyBGaW5kIG9yIENyZWF0ZSBQSUMxNiBTdGFuZGFyZCBBdXRvIFNlY3Rpb24uCisgICAgUElDMTZTZWN0aW9uICpnZXRQSUMxNkF1dG9TZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElDMTZTZWN0aW9uVHlwZSBUeSA9IFVEQVRBX09WUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZBZGRyZXNzID0gIiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9yID0gLTEpIGNvbnN0OworCisgICAgLy8vIEZpbmQgb3IgQ3JlYXRlIFBJQzE2IFN0YW5kYXJkIEF1dG8gU2VjdGlvbi4KKyAgICBQSUMxNlNlY3Rpb24gKmdldFBJQzE2VXNlclNlY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSUMxNlNlY3Rpb25UeXBlIFR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZBZGRyZXNzID0gIiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9yID0gLTEpIGNvbnN0OworCisgICAgLy8vIEFsbG9jYXRlIFVuLWluaXRpYWxpemVkIGRhdGEgdG8gYSBzdGFuZGFyZCBVREFUQSBzZWN0aW9uLiAKKyAgICBjb25zdCBNQ1NlY3Rpb24gKmFsbG9jYXRlVURBVEEoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKSBjb25zdDsKKworICAgIC8vLyBBbGxvY2F0ZSBJbml0aWFsaXplZCBkYXRhIHRvIGEgc3RhbmRhcmQgSURBVEEgc2VjdGlvbi4gCisgICAgY29uc3QgTUNTZWN0aW9uICphbGxvY2F0ZUlEQVRBKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgY29uc3Q7CisKKyAgICAvLy8gQWxsb2NhdGUgUk9NIGRhdGEgdG8gdGhlIHN0YW5kYXJkIFJPTURBVEEgc2VjdGlvbi4gCisgICAgY29uc3QgTUNTZWN0aW9uICphbGxvY2F0ZVJPTURBVEEoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKSBjb25zdDsKKworICAgIC8vLyBBbGxvY2F0ZSBhbiBBVVRPIHZhcmlhYmxlIHRvIGFuIEFVVE8gc2VjdGlvbi4KKyAgICBjb25zdCBNQ1NlY3Rpb24gKmFsbG9jYXRlQVVUTyhjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIGNvbnN0OworICAgIAorICAgIC8vLyBBbGxvY2F0ZSBEQVRBIGluIHVzZXIgc3BlY2lmaWVkIHNlY3Rpb24uCisgICAgY29uc3QgTUNTZWN0aW9uICphbGxvY2F0ZUluR2l2ZW5TZWN0aW9uKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgY29uc3Q7CisKKyAgICAvLy8gQWxsb2NhdGUgREFUQSBhdCB1c2VyIHNwZWNpZmllZCBhZGRyZXNzLgorICAgIGNvbnN0IE1DU2VjdGlvbiAqYWxsb2NhdGVBdEdpdmVuQWRkcmVzcyhjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZBZGRyKSBjb25zdDsKKworICAgIC8vLyBBbGxvY2F0ZSBhIHNoYXJlZCB2YXJpYWJsZSB0byBTSEFSRUQgc2VjdGlvbi4KKyAgICBjb25zdCBNQ1NlY3Rpb24gKmFsbG9jYXRlU0hBUkVEKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmdsZXIgKk1hbmcpIGNvbnN0OworICAgCisgICAgcHVibGljOgorICAgIFBJQzE2VGFyZ2V0T2JqZWN0RmlsZSgpOworICAgIH5QSUMxNlRhcmdldE9iamVjdEZpbGUoKTsKKyAgICB2b2lkIEluaXRpYWxpemUoTUNDb250ZXh0ICZDdHgsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKKworICAgIC8vLyBSZXR1cm4gdGhlIHNlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gTmFtZS4gTnVsbCBpZiBub3QgZm91bmQuCisgICAgUElDMTZTZWN0aW9uICpmaW5kUElDMTZTZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBjb25zdDsKKworICAgIC8vLyBPdmVycmlkZSBzZWN0aW9uIGFsbG9jYXRpb25zIGZvciB1c2VyIHNwZWNpZmllZCBzZWN0aW9ucy4KKyAgICB2aXJ0dWFsIGNvbnN0IE1DU2VjdGlvbiAqCisgICAgZ2V0RXhwbGljaXRTZWN0aW9uR2xvYmFsKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgU2VjdGlvbktpbmQgS2luZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmdsZXIgKk1hbmcsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdDsKKyAgICAKKyAgICAvLy8gU2VsZWN0IHNlY3Rpb25zIGZvciBEYXRhIGFuZCBBdXRvIHZhcmlhYmxlcyhnbG9iYWxzKS4KKyAgICB2aXJ0dWFsIGNvbnN0IE1DU2VjdGlvbiAqU2VsZWN0U2VjdGlvbkZvckdsb2JhbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5nbGVyICpNYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUmKSBjb25zdDsKKworCisgICAgLy8vIFJldHVybiBhIGNvZGUgc2VjdGlvbiBmb3IgYSBmdW5jdGlvbi4KKyAgICBjb25zdCBQSUMxNlNlY3Rpb24gKlNlY3Rpb25Gb3JDb2RlIChjb25zdCBzdGQ6OnN0cmluZyAmRm5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJU1IpIGNvbnN0OworCisgICAgLy8vIFJldHVybiBhIGZyYW1lIHNlY3Rpb24gZm9yIGEgZnVuY3Rpb24uCisgICAgY29uc3QgUElDMTZTZWN0aW9uICpTZWN0aW9uRm9yRnJhbWUgKGNvbnN0IHN0ZDo6c3RyaW5nICZGbk5hbWUpIGNvbnN0OworCisgICAgLy8vIEFjY2Vzc29ycyBmb3IgdmFyaW91cyBzZWN0aW9uIGxpc3RzLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBJQzE2U2VjdGlvbiAqPiAmVURBVEFTZWN0aW9ucygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBVREFUQVNlY3Rpb25zXzsKKyAgICB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UElDMTZTZWN0aW9uICo+ICZJREFUQVNlY3Rpb25zKCkgY29uc3QgeworICAgICAgcmV0dXJuIElEQVRBU2VjdGlvbnNfOworICAgIH0KKyAgICBjb25zdCBQSUMxNlNlY3Rpb24gKlJPTURBVEFTZWN0aW9uKCkgY29uc3QgeworICAgICAgcmV0dXJuIFJPTURBVEFTZWN0aW9uXzsKKyAgICB9CisgICAgY29uc3QgUElDMTZTZWN0aW9uICpTSEFSRURVREFUQVNlY3Rpb24oKSBjb25zdCB7CisgICAgICByZXR1cm4gU0hBUkVEVURBVEFTZWN0aW9uXzsKKyAgICB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UElDMTZTZWN0aW9uICo+ICZBVVRPU2VjdGlvbnMoKSBjb25zdCB7CisgICAgICByZXR1cm4gQVVUT1NlY3Rpb25zXzsKKyAgICB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UElDMTZTZWN0aW9uICo+ICZVU0VSU2VjdGlvbnMoKSBjb25zdCB7CisgICAgICByZXR1cm4gVVNFUlNlY3Rpb25zXzsKKyAgICB9CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUElDMTYvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmM2ZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTVBJQzE2SW5mbworICBQSUMxNlRhcmdldEluZm8uY3BwCisgICkKKworYWRkX2RlcGVuZGVuY2llcyhMTFZNUElDMTZJbmZvIFBJQzE2VGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9UYXJnZXRJbmZvL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9UYXJnZXRJbmZvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NjA5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1RhcmdldEluZm8vTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvUElDMTYvVGFyZ2V0SW5mby9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVBJQzE2SW5mbworCisjIEhhY2s6IHdlIG5lZWQgdG8gaW5jbHVkZSAnbWFpbicgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQRkxBR1MgPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9UYXJnZXRJbmZvL1BJQzE2VGFyZ2V0SW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1BJQzE2L1RhcmdldEluZm8vUElDMTZUYXJnZXRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWJkYjEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9QSUMxNi9UYXJnZXRJbmZvL1BJQzE2VGFyZ2V0SW5mby5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy89PT0tLSBQSUMxNlRhcmdldEluZm8uY3BwIC0gUElDMTYgVGFyZ2V0IEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlBJQzE2LmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1RhcmdldCBsbHZtOjpUaGVQSUMxNlRhcmdldCwgbGx2bTo6VGhlQ29vcGVyVGFyZ2V0OworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVQSUMxNlRhcmdldEluZm8oKSB7IAorICBSZWdpc3RlclRhcmdldDxUcmlwbGU6OnBpYzE2PiBYKFRoZVBJQzE2VGFyZ2V0LCAicGljMTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQSUMxNiAxNC1iaXQgW2V4cGVyaW1lbnRhbF0iKTsKKworICBSZWdpc3RlclRhcmdldDw+IFkoVGhlQ29vcGVyVGFyZ2V0LCAiY29vcGVyIiwgIlBJQzE2IENvb3BlciBbZXhwZXJpbWVudGFsXSIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmNkNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uICkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNUG93ZXJQQ0FzbVByaW50ZXIKKyAgUFBDQXNtUHJpbnRlci5jcHAKKyAgKQorYWRkX2RlcGVuZGVuY2llcyhMTFZNUG93ZXJQQ0FzbVByaW50ZXIgUG93ZXJQQ0NvZGVHZW5UYWJsZV9nZW4pCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvQXNtUHJpbnRlci9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9Bc21QcmludGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWRjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvQXNtUHJpbnRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RhcmdldC9Qb3dlclBDL0FzbVByaW50ZXIvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNUG93ZXJQQ0FzbVByaW50ZXIKKworIyBIYWNrOiB3ZSBuZWVkIHRvIGluY2x1ZGUgJ21haW4nIFBvd2VyUEMgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQLkZsYWdzICs9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvQXNtUHJpbnRlci9QUENBc21QcmludGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9Bc21QcmludGVyL1BQQ0FzbVByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTU2NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvQXNtUHJpbnRlci9QUENBc21QcmludGVyLmNwcApAQCAtMCwwICsxLDkyMiBAQAorLy89PT0tLSBQUENBc21QcmludGVyLmNwcCAtIFByaW50IG1hY2hpbmUgaW5zdHJzIHRvIFBvd2VyUEMgYXNzZW1ibHkgLS0tLS0tLS09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBwcmludGVyIHRoYXQgY29udmVydHMgZnJvbSBvdXIgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KKy8vIG9mIG1hY2hpbmUtZGVwZW5kZW50IExMVk0gY29kZSB0byBQb3dlclBDIGFzc2VtYmx5IGxhbmd1YWdlLiBUaGlzIHByaW50ZXIgaXMKKy8vIHRoZSBvdXRwdXQgbWVjaGFuaXNtIHVzZWQgYnkgYGxsYycuCisvLworLy8gRG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL0RldmVsb3BlclRvb2xzLworLy8gUmVmZXJlbmNlL0Fzc2VtYmxlci9BU01JbnRyb2R1Y3Rpb24vY2hhcHRlcl8xX3NlY3Rpb25fMS5odG1sCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJhc21wcmludGVyIgorI2luY2x1ZGUgIlBQQy5oIgorI2luY2x1ZGUgIlBQQ1ByZWRpY2F0ZXMuaCIKKyNpbmNsdWRlICJQUENUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiUFBDU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1dyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Bc21QcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVJbXBsLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTdHJlYW1lci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9NYW5nbGVyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgUFBDQXNtUHJpbnRlciA6IHB1YmxpYyBBc21QcmludGVyIHsKKyAgcHJvdGVjdGVkOgorICAgIERlbnNlTWFwPE1DU3ltYm9sKiwgTUNTeW1ib2wqPiBUT0M7CisgICAgY29uc3QgUFBDU3VidGFyZ2V0ICZTdWJ0YXJnZXQ7CisgICAgdWludDY0X3QgTGFiZWxJRDsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFBQQ0FzbVByaW50ZXIoVGFyZ2V0TWFjaGluZSAmVE0sIE1DU3RyZWFtZXIgJlN0cmVhbWVyKQorICAgICAgOiBBc21QcmludGVyKFRNLCBTdHJlYW1lciksCisgICAgICAgIFN1YnRhcmdldChUTS5nZXRTdWJ0YXJnZXQ8UFBDU3VidGFyZ2V0PigpKSwgTGFiZWxJRCgwKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiUG93ZXJQQyBBc3NlbWJseSBQcmludGVyIjsKKyAgICB9CisKKyAgICBQUENUYXJnZXRNYWNoaW5lICZnZXRUTSgpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxQUENUYXJnZXRNYWNoaW5lJj4oVE0pOworICAgIH0KKworICAgIHVuc2lnbmVkIGVudW1SZWdUb01hY2hpbmVSZWcodW5zaWduZWQgZW51bVJlZykgeworICAgICAgc3dpdGNoIChlbnVtUmVnKSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgcmVnaXN0ZXIhIik7CisgICAgICBjYXNlIFBQQzo6Q1IwOiAgcmV0dXJuICAwOworICAgICAgY2FzZSBQUEM6OkNSMTogIHJldHVybiAgMTsKKyAgICAgIGNhc2UgUFBDOjpDUjI6ICByZXR1cm4gIDI7CisgICAgICBjYXNlIFBQQzo6Q1IzOiAgcmV0dXJuICAzOworICAgICAgY2FzZSBQUEM6OkNSNDogIHJldHVybiAgNDsKKyAgICAgIGNhc2UgUFBDOjpDUjU6ICByZXR1cm4gIDU7CisgICAgICBjYXNlIFBQQzo6Q1I2OiAgcmV0dXJuICA2OworICAgICAgY2FzZSBQUEM6OkNSNzogIHJldHVybiAgNzsKKyAgICAgIH0KKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgICAgfQorCisgICAgLy8vIHByaW50SW5zdHJ1Y3Rpb24gLSBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0YWJsZWdlbgorICAgIC8vLyBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzZXQgZGVzY3JpcHRpb24uICBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlCisgICAgLy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gd2FzIHN1ZmZpY2llbnRseSBkZXNjcmliZWQgdG8gcHJpbnQgaXQsIG90aGVyd2lzZSBpdAorICAgIC8vLyByZXR1cm5zIGZhbHNlLgorICAgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmTyk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFJlZ2lzdGVyTmFtZSh1bnNpZ25lZCBSZWdObyk7CisKKworICAgIHZpcnR1YWwgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSk7CisgICAgdm9pZCBwcmludE9wKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywgcmF3X29zdHJlYW0gJk8pOworCisgICAgLy8vIHN0cmlwUmVnaXN0ZXJQcmVmaXggLSBUaGlzIG1ldGhvZCBzdHJpcHMgdGhlIGNoYXJhY3RlciBwcmVmaXggZnJvbSBhCisgICAgLy8vIHJlZ2lzdGVyIG5hbWUgc28gdGhhdCBvbmx5IHRoZSBudW1iZXIgaXMgbGVmdC4gIFVzZWQgYnkgZm9yIGxpbnV4IGFzbS4KKyAgICBjb25zdCBjaGFyICpzdHJpcFJlZ2lzdGVyUHJlZml4KGNvbnN0IGNoYXIgKlJlZ05hbWUpIHsKKyAgICAgIHN3aXRjaCAoUmVnTmFtZVswXSkgeworICAgICAgY2FzZSAncic6CisgICAgICBjYXNlICdmJzoKKyAgICAgIGNhc2UgJ3YnOiByZXR1cm4gUmVnTmFtZSArIDE7CisgICAgICBjYXNlICdjJzogaWYgKFJlZ05hbWVbMV0gPT0gJ3InKSByZXR1cm4gUmVnTmFtZSArIDI7CisgICAgICB9CisKKyAgICAgIHJldHVybiBSZWdOYW1lOworICAgIH0KKworICAgIC8vLyBwcmludFJlZ2lzdGVyIC0gUHJpbnQgcmVnaXN0ZXIgYWNjb3JkaW5nIHRvIHRhcmdldCByZXF1aXJlbWVudHMuCisgICAgLy8vCisgICAgdm9pZCBwcmludFJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywgYm9vbCBSMEFzWmVybywgcmF3X29zdHJlYW0gJk8peworICAgICAgdW5zaWduZWQgUmVnTm8gPSBNTy5nZXRSZWcoKTsKKyAgICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWdObykgJiYgIk5vdCBwaHlzcmVnPz8iKTsKKworICAgICAgLy8gSWYgd2Ugc2hvdWxkIHVzZSAwIGZvciBSMC4KKyAgICAgIGlmIChSMEFzWmVybyAmJiBSZWdObyA9PSBQUEM6OlIwKSB7CisgICAgICAgIE8gPDwgIjAiOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvbnN0IGNoYXIgKlJlZ05hbWUgPSBnZXRSZWdpc3Rlck5hbWUoUmVnTm8pOworICAgICAgLy8gTGludXggYXNzZW1ibGVyIChPdGhlcnM/KSBkb2VzIG5vdCB0YWtlIHJlZ2lzdGVyIG1uZW1vbmljcy4KKyAgICAgIC8vIEZJWE1FIC0gV2hhdCBhYm91dCBzcGVjaWFsIHJlZ2lzdGVycyB1c2VkIGluIG1mc3ByL210c3ByPworICAgICAgaWYgKCFTdWJ0YXJnZXQuaXNEYXJ3aW4oKSkgUmVnTmFtZSA9IHN0cmlwUmVnaXN0ZXJQcmVmaXgoUmVnTmFtZSk7CisgICAgICBPIDw8IFJlZ05hbWU7CisgICAgfQorCisgICAgdm9pZCBwcmludE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKE9wTm8pOworICAgICAgaWYgKE1PLmlzUmVnKCkpIHsKKyAgICAgICAgcHJpbnRSZWdpc3RlcihNTywgZmFsc2UsIE8pOworICAgICAgfSBlbHNlIGlmIChNTy5pc0ltbSgpKSB7CisgICAgICAgIE8gPDwgTU8uZ2V0SW1tKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludE9wKE1PLCBPKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBib29sIFByaW50QXNtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTyk7CisgICAgYm9vbCBQcmludEFzbU1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworCisKKyAgICB2b2lkIHByaW50UzVJbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICAgICAgY2hhciB2YWx1ZSA9IE1JLT5nZXRPcGVyYW5kKE9wTm8pLmdldEltbSgpOworICAgICAgdmFsdWUgPSAodmFsdWUgPDwgKDMyLTUpKSA+PiAoMzItNSk7CisgICAgICBPIDw8IChpbnQpdmFsdWU7CisgICAgfQorICAgIHZvaWQgcHJpbnRVNUltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlID0gTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCk7CisgICAgICBhc3NlcnQodmFsdWUgPD0gMzEgJiYgIkludmFsaWQgdTVpbW0gYXJndW1lbnQhIik7CisgICAgICBPIDw8ICh1bnNpZ25lZCBpbnQpdmFsdWU7CisgICAgfQorICAgIHZvaWQgcHJpbnRVNkltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlID0gTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCk7CisgICAgICBhc3NlcnQodmFsdWUgPD0gNjMgJiYgIkludmFsaWQgdTZpbW0gYXJndW1lbnQhIik7CisgICAgICBPIDw8ICh1bnNpZ25lZCBpbnQpdmFsdWU7CisgICAgfQorICAgIHZvaWQgcHJpbnRTMTZJbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgICAgICBPIDw8IChzaG9ydClNSS0+Z2V0T3BlcmFuZChPcE5vKS5nZXRJbW0oKTsKKyAgICB9CisgICAgdm9pZCBwcmludFUxNkltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICAgICAgTyA8PCAodW5zaWduZWQgc2hvcnQpTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCk7CisgICAgfQorICAgIHZvaWQgcHJpbnRTMTZYNEltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgICAgICBpZiAoTUktPmdldE9wZXJhbmQoT3BObykuaXNJbW0oKSkgeworICAgICAgICBPIDw8IChzaG9ydCkoTUktPmdldE9wZXJhbmQoT3BObykuZ2V0SW1tKCkqNCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBPIDw8ICJsbzE2KCI7CisgICAgICAgIHByaW50T3AoTUktPmdldE9wZXJhbmQoT3BObyksIE8pOworICAgICAgICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pCisgICAgICAgICAgTyA8PCAiLVwiTCIgPDwgZ2V0RnVuY3Rpb25OdW1iZXIoKSA8PCAiJHBiXCIpIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIE8gPDwgJyknOworICAgICAgfQorICAgIH0KKyAgICB2b2lkIHByaW50QnJhbmNoT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgICAgICAvLyBCcmFuY2hlcyBjYW4gdGFrZSBhbiBpbW1lZGlhdGUgb3BlcmFuZC4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYnJhbmNoCisgICAgICAvLyBzZWxlY3Rpb24gcGFzcyB0byBwcmludCAkKzgsIGFuIGVpZ2h0IGJ5dGUgZGlzcGxhY2VtZW50IGZyb20gdGhlIFBDLgorICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKE9wTm8pLmlzSW1tKCkpIHsKKyAgICAgICAgTyA8PCAiJCsiIDw8IE1JLT5nZXRPcGVyYW5kKE9wTm8pLmdldEltbSgpKjQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludE9wKE1JLT5nZXRPcGVyYW5kKE9wTm8pLCBPKTsKKyAgICAgIH0KKyAgICB9CisgICAgdm9pZCBwcmludENhbGxPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChPcE5vKTsKKyAgICAgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSAhPSBSZWxvYzo6U3RhdGljKSB7CisgICAgICAgIGlmIChNTy5pc0dsb2JhbCgpKSB7CisgICAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gTU8uZ2V0R2xvYmFsKCk7CisgICAgICAgICAgaWYgKEdWLT5pc0RlY2xhcmF0aW9uKCkgfHwgR1YtPmlzV2Vha0ZvckxpbmtlcigpKSB7CisgICAgICAgICAgICAvLyBEeW5hbWljYWxseS1yZXNvbHZlZCBmdW5jdGlvbnMgbmVlZCBhIHN0dWIgZm9yIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgICAgIE1DU3ltYm9sICpTeW0gPSBHZXRTeW1ib2xXaXRoR2xvYmFsVmFsdWVCYXNlKEdWLCAiJHN0dWIiKTsKKyAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6U3R1YlZhbHVlVHkgJlN0dWJTeW0gPQorICAgICAgICAgICAgICBNTUktPmdldE9iakZpbGVJbmZvPE1hY2hpbmVNb2R1bGVJbmZvTWFjaE8+KCkuZ2V0Rm5TdHViRW50cnkoU3ltKTsKKyAgICAgICAgICAgIGlmIChTdHViU3ltLmdldFBvaW50ZXIoKSA9PSAwKQorICAgICAgICAgICAgICBTdHViU3ltID0gTWFjaGluZU1vZHVsZUluZm9JbXBsOjoKKyAgICAgICAgICAgICAgICBTdHViVmFsdWVUeShNYW5nLT5nZXRTeW1ib2woR1YpLCAhR1YtPmhhc0ludGVybmFsTGlua2FnZSgpKTsKKyAgICAgICAgICAgIE8gPDwgKlN5bTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1PLmlzU3ltYm9sKCkpIHsKKyAgICAgICAgICBTbWFsbFN0cmluZzwxMjg+IFRlbXBOYW1lU3RyOworICAgICAgICAgIFRlbXBOYW1lU3RyICs9IFN0cmluZ1JlZihNTy5nZXRTeW1ib2xOYW1lKCkpOworICAgICAgICAgIFRlbXBOYW1lU3RyICs9IFN0cmluZ1JlZigiJHN0dWIiKTsKKyAgICAgICAgICAKKyAgICAgICAgICBNQ1N5bWJvbCAqU3ltID0gR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woVGVtcE5hbWVTdHIuc3RyKCkpOworICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6U3R1YlZhbHVlVHkgJlN0dWJTeW0gPQorICAgICAgICAgICAgTU1JLT5nZXRPYmpGaWxlSW5mbzxNYWNoaW5lTW9kdWxlSW5mb01hY2hPPigpLmdldEZuU3R1YkVudHJ5KFN5bSk7CisgICAgICAgICAgaWYgKFN0dWJTeW0uZ2V0UG9pbnRlcigpID09IDApCisgICAgICAgICAgICBTdHViU3ltID0gTWFjaGluZU1vZHVsZUluZm9JbXBsOjoKKyAgICAgICAgICAgICAgU3R1YlZhbHVlVHkoR2V0RXh0ZXJuYWxTeW1ib2xTeW1ib2woTU8uZ2V0U3ltYm9sTmFtZSgpKSwgdHJ1ZSk7CisgICAgICAgICAgTyA8PCAqU3ltOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwcmludE9wKE1JLT5nZXRPcGVyYW5kKE9wTm8pLCBPKTsKKyAgICB9CisgICAgdm9pZCBwcmludEFic0FkZHJPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgICAgIE8gPDwgKGludClNSS0+Z2V0T3BlcmFuZChPcE5vKS5nZXRJbW0oKSo0OworICAgIH0KKyAgICB2b2lkIHByaW50UElDTGFiZWwoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIE8gPDwgIlwiTCIgPDwgZ2V0RnVuY3Rpb25OdW1iZXIoKSA8PCAiJHBiXCJcbiI7CisgICAgICBPIDw8ICJcIkwiIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkgPDwgIiRwYlwiOiI7CisgICAgfQorICAgIHZvaWQgcHJpbnRTeW1ib2xIaShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKE9wTm8pLmlzSW1tKCkpIHsKKyAgICAgICAgcHJpbnRTMTZJbW1PcGVyYW5kKE1JLCBPcE5vLCBPKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChTdWJ0YXJnZXQuaXNEYXJ3aW4oKSkgTyA8PCAiaGExNigiOworICAgICAgICBwcmludE9wKE1JLT5nZXRPcGVyYW5kKE9wTm8pLCBPKTsKKyAgICAgICAgaWYgKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKQorICAgICAgICAgIE8gPDwgIi1cIkwiIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkgPDwgIiRwYlwiIjsKKyAgICAgICAgaWYgKFN1YnRhcmdldC5pc0RhcndpbigpKQorICAgICAgICAgIE8gPDwgJyknOworICAgICAgICBlbHNlCisgICAgICAgICAgTyA8PCAiQGhhIjsKKyAgICAgIH0KKyAgICB9CisgICAgdm9pZCBwcmludFN5bWJvbExvKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgICBpZiAoTUktPmdldE9wZXJhbmQoT3BObykuaXNJbW0oKSkgeworICAgICAgICBwcmludFMxNkltbU9wZXJhbmQoTUksIE9wTm8sIE8pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFN1YnRhcmdldC5pc0RhcndpbigpKSBPIDw8ICJsbzE2KCI7CisgICAgICAgIHByaW50T3AoTUktPmdldE9wZXJhbmQoT3BObyksIE8pOworICAgICAgICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pCisgICAgICAgICAgTyA8PCAiLVwiTCIgPDwgZ2V0RnVuY3Rpb25OdW1iZXIoKSA8PCAiJHBiXCIiOworICAgICAgICBpZiAoU3VidGFyZ2V0LmlzRGFyd2luKCkpCisgICAgICAgICAgTyA8PCAnKSc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBPIDw8ICJAbCI7CisgICAgICB9CisgICAgfQorICAgIHZvaWQgcHJpbnRjcmJpdG0oY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIHVuc2lnbmVkIENDUmVnID0gTUktPmdldE9wZXJhbmQoT3BObykuZ2V0UmVnKCk7CisgICAgICB1bnNpZ25lZCBSZWdObyA9IGVudW1SZWdUb01hY2hpbmVSZWcoQ0NSZWcpOworICAgICAgTyA8PCAoMHg4MCA+PiBSZWdObyk7CisgICAgfQorICAgIC8vIFRoZSBuZXcgYWRkcmVzc2luZyBtb2RlIHByaW50ZXJzLgorICAgIHZvaWQgcHJpbnRNZW1SZWdJbW0oY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIHByaW50U3ltYm9sTG8oTUksIE9wTm8sIE8pOworICAgICAgTyA8PCAnKCc7CisgICAgICBpZiAoTUktPmdldE9wZXJhbmQoT3BObysxKS5pc1JlZygpICYmCisgICAgICAgICAgTUktPmdldE9wZXJhbmQoT3BObysxKS5nZXRSZWcoKSA9PSBQUEM6OlIwKQorICAgICAgICBPIDw8ICIwIjsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRPcGVyYW5kKE1JLCBPcE5vKzEsIE8pOworICAgICAgTyA8PCAnKSc7CisgICAgfQorICAgIHZvaWQgcHJpbnRNZW1SZWdJbW1TaGlmdGVkKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIGlmIChNSS0+Z2V0T3BlcmFuZChPcE5vKS5pc0ltbSgpKQorICAgICAgICBwcmludFMxNlg0SW1tT3BlcmFuZChNSSwgT3BObywgTyk7CisgICAgICBlbHNlCisgICAgICAgIHByaW50U3ltYm9sTG8oTUksIE9wTm8sIE8pOworICAgICAgTyA8PCAnKCc7CisgICAgICBpZiAoTUktPmdldE9wZXJhbmQoT3BObysxKS5pc1JlZygpICYmCisgICAgICAgICAgTUktPmdldE9wZXJhbmQoT3BObysxKS5nZXRSZWcoKSA9PSBQUEM6OlIwKQorICAgICAgICBPIDw8ICIwIjsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRPcGVyYW5kKE1JLCBPcE5vKzEsIE8pOworICAgICAgTyA8PCAnKSc7CisgICAgfQorCisgICAgdm9pZCBwcmludE1lbVJlZ1JlZyhjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgICAgLy8gV2hlbiB1c2VkIGFzIHRoZSBiYXNlIHJlZ2lzdGVyLCByMCByZWFkcyBjb25zdGFudCB6ZXJvIHJhdGhlciB0aGFuCisgICAgICAvLyB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZWdpc3Rlci4gIEZvciB0aGlzIHJlYXNvbiwgdGhlIGRhcndpbgorICAgICAgLy8gYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgd2UgcHJpbnQgcjAgYXMgMCAobm8gcikgd2hlbiB1c2VkIGFzIHRoZSBiYXNlLgorICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BObyk7CisgICAgICBwcmludFJlZ2lzdGVyKE1PLCB0cnVlLCBPKTsKKyAgICAgIE8gPDwgIiwgIjsKKyAgICAgIHByaW50T3BlcmFuZChNSSwgT3BObysxLCBPKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50VE9DRW50cnlMYWJlbChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChPcE5vKTsKKyAgICAgIGFzc2VydChNTy5pc0dsb2JhbCgpKTsKKyAgICAgIE1DU3ltYm9sICpTeW0gPSBNYW5nLT5nZXRTeW1ib2woTU8uZ2V0R2xvYmFsKCkpOworCisgICAgICAvLyBNYXAgc3ltYm9sIC0+IGxhYmVsIG9mIFRPQyBlbnRyeS4KKyAgICAgIE1DU3ltYm9sIComVE9DRW50cnkgPSBUT0NbU3ltXTsKKyAgICAgIGlmIChUT0NFbnRyeSA9PSAwKQorICAgICAgICBUT0NFbnRyeSA9IE91dENvbnRleHQuCisgICAgICAgICAgR2V0T3JDcmVhdGVTeW1ib2woU3RyaW5nUmVmKE1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMiICsgVHdpbmUoTGFiZWxJRCsrKSk7CisKKyAgICAgIE8gPDwgKlRPQ0VudHJ5IDw8ICJAdG9jIjsKKyAgICB9CisKKyAgICB2b2lkIHByaW50UHJlZGljYXRlT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPLCBjb25zdCBjaGFyICpNb2RpZmllcik7CisKKyAgICBNYWNoaW5lTG9jYXRpb24gZ2V0RGVidWdWYWx1ZUxvY2F0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0IHsKKworICAgICAgTWFjaGluZUxvY2F0aW9uIExvY2F0aW9uOworICAgICAgYXNzZXJ0IChNSS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSA0ICYmICJJbnZhbGlkIG5vLiBvZiBtYWNoaW5lIG9wZXJhbmRzISIpOworICAgICAgLy8gRnJhbWUgYWRkcmVzcy4gIEN1cnJlbnRseSBoYW5kbGVzIHJlZ2lzdGVyICstIG9mZnNldCBvbmx5LgorICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDApLmlzUmVnKCkgJiYgTUktPmdldE9wZXJhbmQoMikuaXNJbW0oKSkKKyAgICAgICAgTG9jYXRpb24uc2V0KE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpLCBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJEQkdfVkFMVUUgaW5zdHJ1Y3Rpb24gaWdub3JlZCEgIiA8PCAqTUkgPDwgIlxuIik7CisgICAgICB9CisgICAgICByZXR1cm4gTG9jYXRpb247CisgICAgfQorICB9OworCisgIC8vLyBQUENMaW51eEFzbVByaW50ZXIgLSBQb3dlclBDIGFzc2VtYmx5IHByaW50ZXIsIGN1c3RvbWl6ZWQgZm9yIExpbnV4CisgIGNsYXNzIFBQQ0xpbnV4QXNtUHJpbnRlciA6IHB1YmxpYyBQUENBc21QcmludGVyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFBQQ0xpbnV4QXNtUHJpbnRlcihUYXJnZXRNYWNoaW5lICZUTSwgTUNTdHJlYW1lciAmU3RyZWFtZXIpCisgICAgICA6IFBQQ0FzbVByaW50ZXIoVE0sIFN0cmVhbWVyKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiTGludXggUFBDIEFzc2VtYmx5IFByaW50ZXIiOworICAgIH0KKworICAgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKTsKKworICAgIHZpcnR1YWwgdm9pZCBFbWl0RnVuY3Rpb25FbnRyeUxhYmVsKCk7CisgIH07CisKKyAgLy8vIFBQQ0RhcndpbkFzbVByaW50ZXIgLSBQb3dlclBDIGFzc2VtYmx5IHByaW50ZXIsIGN1c3RvbWl6ZWQgZm9yIERhcndpbi9NYWMKKyAgLy8vIE9TIFgKKyAgY2xhc3MgUFBDRGFyd2luQXNtUHJpbnRlciA6IHB1YmxpYyBQUENBc21QcmludGVyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFBQQ0RhcndpbkFzbVByaW50ZXIoVGFyZ2V0TWFjaGluZSAmVE0sIE1DU3RyZWFtZXIgJlN0cmVhbWVyKQorICAgICAgOiBQUENBc21QcmludGVyKFRNLCBTdHJlYW1lcikge30KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIkRhcndpbiBQUEMgQXNzZW1ibHkgUHJpbnRlciI7CisgICAgfQorCisgICAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pOworICAgIHZvaWQgRW1pdFN0YXJ0T2ZBc21GaWxlKE1vZHVsZSAmTSk7CisKKyAgICB2b2lkIEVtaXRGdW5jdGlvblN0dWJzKGNvbnN0IE1hY2hpbmVNb2R1bGVJbmZvTWFjaE86OlN5bWJvbExpc3RUeSAmU3R1YnMpOworICB9OworfSAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBJbmNsdWRlIHRoZSBhdXRvLWdlbmVyYXRlZCBwb3J0aW9uIG9mIHRoZSBhc3NlbWJseSB3cml0ZXIKKyNpbmNsdWRlICJQUENHZW5Bc21Xcml0ZXIuaW5jIgorCit2b2lkIFBQQ0FzbVByaW50ZXI6OnByaW50T3AoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLCByYXdfb3N0cmVhbSAmTykgeworICBzd2l0Y2ggKE1PLmdldFR5cGUoKSkgeworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgbGx2bV91bnJlYWNoYWJsZSgicHJpbnRPcCgpIGRvZXMgbm90IGhhbmRsZSBpbW1lZGlhdGUgdmFsdWVzIik7CisKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fTWFjaGluZUJhc2ljQmxvY2s6CisgICAgTyA8PCAqTU8uZ2V0TUJCKCktPmdldFN5bWJvbCgpOworICAgIHJldHVybjsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSA8PCAiSlRJIiA8PCBnZXRGdW5jdGlvbk51bWJlcigpCisgICAgICA8PCAnXycgPDwgTU8uZ2V0SW5kZXgoKTsKKyAgICAvLyBGSVhNRTogUElDIHJlbG9jYXRpb24gbW9kZWwKKyAgICByZXR1cm47CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0NvbnN0YW50UG9vbEluZGV4OgorICAgIE8gPDwgTUFJLT5nZXRQcml2YXRlR2xvYmFsUHJlZml4KCkgPDwgIkNQSSIgPDwgZ2V0RnVuY3Rpb25OdW1iZXIoKQorICAgICAgPDwgJ18nIDw8IE1PLmdldEluZGV4KCk7CisgICAgcmV0dXJuOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19CbG9ja0FkZHJlc3M6CisgICAgTyA8PCAqR2V0QmxvY2tBZGRyZXNzU3ltYm9sKE1PLmdldEJsb2NrQWRkcmVzcygpKTsKKyAgICByZXR1cm47CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOiB7CisgICAgLy8gQ29tcHV0aW5nIHRoZSBhZGRyZXNzIG9mIGFuIGV4dGVybmFsIHN5bWJvbCwgbm90IGNhbGxpbmcgaXQuCisgICAgaWYgKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpTdGF0aWMpIHsKKyAgICAgIE8gPDwgKkdldEV4dGVybmFsU3ltYm9sU3ltYm9sKE1PLmdldFN5bWJvbE5hbWUoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTUNTeW1ib2wgKk5MUFN5bSA9IAorICAgICAgT3V0Q29udGV4dC5HZXRPckNyZWF0ZVN5bWJvbChTdHJpbmdSZWYoTUFJLT5nZXRHbG9iYWxQcmVmaXgoKSkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PLmdldFN5bWJvbE5hbWUoKSsiJG5vbl9sYXp5X3B0ciIpOworICAgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6U3R1YlZhbHVlVHkgJlN0dWJTeW0gPSAKKyAgICAgIE1NSS0+Z2V0T2JqRmlsZUluZm88TWFjaGluZU1vZHVsZUluZm9NYWNoTz4oKS5nZXRHVlN0dWJFbnRyeShOTFBTeW0pOworICAgIGlmIChTdHViU3ltLmdldFBvaW50ZXIoKSA9PSAwKQorICAgICAgU3R1YlN5bSA9IE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6CisgICAgICAgIFN0dWJWYWx1ZVR5KEdldEV4dGVybmFsU3ltYm9sU3ltYm9sKE1PLmdldFN5bWJvbE5hbWUoKSksIHRydWUpOworICAgIAorICAgIE8gPDwgKk5MUFN5bTsKKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fR2xvYmFsQWRkcmVzczogeworICAgIC8vIENvbXB1dGluZyB0aGUgYWRkcmVzcyBvZiBhIGdsb2JhbCBzeW1ib2wsIG5vdCBjYWxsaW5nIGl0LgorICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IE1PLmdldEdsb2JhbCgpOworICAgIE1DU3ltYm9sICpTeW1Ub1ByaW50OworCisgICAgLy8gRXh0ZXJuYWwgb3Igd2Vha2x5IGxpbmtlZCBnbG9iYWwgdmFyaWFibGVzIG5lZWQgbm9uLWxhemlseS1yZXNvbHZlZCBzdHVicworICAgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSAhPSBSZWxvYzo6U3RhdGljICYmCisgICAgICAgIChHVi0+aXNEZWNsYXJhdGlvbigpIHx8IEdWLT5pc1dlYWtGb3JMaW5rZXIoKSkpIHsKKyAgICAgIGlmICghR1YtPmhhc0hpZGRlblZpc2liaWxpdHkoKSkgeworICAgICAgICBTeW1Ub1ByaW50ID0gR2V0U3ltYm9sV2l0aEdsb2JhbFZhbHVlQmFzZShHViwgIiRub25fbGF6eV9wdHIiKTsKKyAgICAgICAgTWFjaGluZU1vZHVsZUluZm9JbXBsOjpTdHViVmFsdWVUeSAmU3R1YlN5bSA9IAorICAgICAgICAgIE1NSS0+Z2V0T2JqRmlsZUluZm88TWFjaGluZU1vZHVsZUluZm9NYWNoTz4oKQorICAgICAgICAgICAgLmdldEdWU3R1YkVudHJ5KFN5bVRvUHJpbnQpOworICAgICAgICBpZiAoU3R1YlN5bS5nZXRQb2ludGVyKCkgPT0gMCkKKyAgICAgICAgICBTdHViU3ltID0gTWFjaGluZU1vZHVsZUluZm9JbXBsOjoKKyAgICAgICAgICAgIFN0dWJWYWx1ZVR5KE1hbmctPmdldFN5bWJvbChHViksICFHVi0+aGFzSW50ZXJuYWxMaW5rYWdlKCkpOworICAgICAgfSBlbHNlIGlmIChHVi0+aXNEZWNsYXJhdGlvbigpIHx8IEdWLT5oYXNDb21tb25MaW5rYWdlKCkgfHwKKyAgICAgICAgICAgICAgICAgR1YtPmhhc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKCkpIHsKKyAgICAgICAgU3ltVG9QcmludCA9IEdldFN5bWJvbFdpdGhHbG9iYWxWYWx1ZUJhc2UoR1YsICIkbm9uX2xhenlfcHRyIik7CisgICAgICAgIAorICAgICAgICBNYWNoaW5lTW9kdWxlSW5mb0ltcGw6OlN0dWJWYWx1ZVR5ICZTdHViU3ltID0gCisgICAgICAgICAgTU1JLT5nZXRPYmpGaWxlSW5mbzxNYWNoaW5lTW9kdWxlSW5mb01hY2hPPigpLgorICAgICAgICAgICAgICAgICAgICBnZXRIaWRkZW5HVlN0dWJFbnRyeShTeW1Ub1ByaW50KTsKKyAgICAgICAgaWYgKFN0dWJTeW0uZ2V0UG9pbnRlcigpID09IDApCisgICAgICAgICAgU3R1YlN5bSA9IE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6CisgICAgICAgICAgICBTdHViVmFsdWVUeShNYW5nLT5nZXRTeW1ib2woR1YpLCAhR1YtPmhhc0ludGVybmFsTGlua2FnZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN5bVRvUHJpbnQgPSBNYW5nLT5nZXRTeW1ib2woR1YpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBTeW1Ub1ByaW50ID0gTWFuZy0+Z2V0U3ltYm9sKEdWKTsKKyAgICB9CisgICAgCisgICAgTyA8PCAqU3ltVG9QcmludDsKKworICAgIHByaW50T2Zmc2V0KE1PLmdldE9mZnNldCgpLCBPKTsKKyAgICByZXR1cm47CisgIH0KKworICBkZWZhdWx0OgorICAgIE8gPDwgIjx1bmtub3duIG9wZXJhbmQgdHlwZTogIiA8PCBNTy5nZXRUeXBlKCkgPDwgIj4iOworICAgIHJldHVybjsKKyAgfQorfQorCisvLy8gUHJpbnRBc21PcGVyYW5kIC0gUHJpbnQgb3V0IGFuIG9wZXJhbmQgZm9yIGFuIGlubGluZSBhc20gZXhwcmVzc2lvbi4KKy8vLworYm9vbCBQUENBc21QcmludGVyOjpQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpFeHRyYUNvZGUsIHJhd19vc3RyZWFtICZPKSB7CisgIC8vIERvZXMgdGhpcyBhc20gb3BlcmFuZCBoYXZlIGEgc2luZ2xlIGxldHRlciBvcGVyYW5kIG1vZGlmaWVyPworICBpZiAoRXh0cmFDb2RlICYmIEV4dHJhQ29kZVswXSkgeworICAgIGlmIChFeHRyYUNvZGVbMV0gIT0gMCkgcmV0dXJuIHRydWU7IC8vIFVua25vd24gbW9kaWZpZXIuCisKKyAgICBzd2l0Y2ggKEV4dHJhQ29kZVswXSkgeworICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlOyAgLy8gVW5rbm93biBtb2RpZmllci4KKyAgICBjYXNlICdjJzogLy8gRG9uJ3QgcHJpbnQgIiQiIGJlZm9yZSBhIGdsb2JhbCB2YXIgbmFtZSBvciBjb25zdGFudC4KKyAgICAgIC8vIFBQQyBuZXZlciBoYXMgYSBwcmVmaXguCisgICAgICBwcmludE9wZXJhbmQoTUksIE9wTm8sIE8pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgJ0wnOiAvLyBXcml0ZSBzZWNvbmQgd29yZCBvZiBESW1vZGUgcmVmZXJlbmNlLgorICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhpcyBvcGVyYW5kIGhhcyB0d28gY29uc2VjdXRpdmUgcmVnaXN0ZXJzLgorICAgICAgaWYgKCFNSS0+Z2V0T3BlcmFuZChPcE5vKS5pc1JlZygpIHx8CisgICAgICAgICAgT3BObysxID09IE1JLT5nZXROdW1PcGVyYW5kcygpIHx8CisgICAgICAgICAgIU1JLT5nZXRPcGVyYW5kKE9wTm8rMSkuaXNSZWcoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICArK09wTm87ICAgLy8gUmV0dXJuIHRoZSBoaWdoLXBhcnQuCisgICAgICBicmVhazsKKyAgICBjYXNlICdJJzoKKyAgICAgIC8vIFdyaXRlICdpJyBpZiBhbiBpbnRlZ2VyIGNvbnN0YW50LCBvdGhlcndpc2Ugbm90aGluZy4gIFVzZWQgdG8gcHJpbnQKKyAgICAgIC8vIGFkZGkgdnMgYWRkLCBldGMuCisgICAgICBpZiAoTUktPmdldE9wZXJhbmQoT3BObykuaXNJbW0oKSkKKyAgICAgICAgTyA8PCAiaSI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcHJpbnRPcGVyYW5kKE1JLCBPcE5vLCBPKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBBdCB0aGUgbW9tZW50LCBhbGwgaW5saW5lIGFzbSBtZW1vcnkgb3BlcmFuZHMgYXJlIGEgc2luZ2xlIHJlZ2lzdGVyLgorLy8gSW4gYW55IGNhc2UsIHRoZSBvdXRwdXQgb2YgdGhpcyByb3V0aW5lIHNob3VsZCBhbHdheXMgYmUganVzdCBvbmUKKy8vIGFzc2VtYmxlciBvcGVyYW5kLgorCitib29sIFBQQ0FzbVByaW50ZXI6OlByaW50QXNtTWVtb3J5T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXNtVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGlmIChFeHRyYUNvZGUgJiYgRXh0cmFDb2RlWzBdKQorICAgIHJldHVybiB0cnVlOyAvLyBVbmtub3duIG1vZGlmaWVyLgorICBhc3NlcnQgKE1JLT5nZXRPcGVyYW5kKE9wTm8pLmlzUmVnKCkpOworICBPIDw8ICIwKCI7CisgIHByaW50T3BlcmFuZChNSSwgT3BObywgTyk7CisgIE8gPDwgIikiOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUFBDQXNtUHJpbnRlcjo6cHJpbnRQcmVkaWNhdGVPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywgY29uc3QgY2hhciAqTW9kaWZpZXIpeworICBhc3NlcnQoTW9kaWZpZXIgJiYgIk11c3Qgc3BlY2lmeSAnY2MnIG9yICdyZWcnIGFzIHByZWRpY2F0ZSBvcCBtb2RpZmllciEiKTsKKyAgdW5zaWduZWQgQ29kZSA9IE1JLT5nZXRPcGVyYW5kKE9wTm8pLmdldEltbSgpOworICBpZiAoIXN0cmNtcChNb2RpZmllciwgImNjIikpIHsKKyAgICBzd2l0Y2ggKChQUEM6OlByZWRpY2F0ZSlDb2RlKSB7CisgICAgY2FzZSBQUEM6OlBSRURfQUxXQVlTOiByZXR1cm47IC8vIERvbid0IHByaW50IGFueXRoaW5nIGZvciBhbHdheXMuCisgICAgY2FzZSBQUEM6OlBSRURfTFQ6IE8gPDwgImx0IjsgcmV0dXJuOworICAgIGNhc2UgUFBDOjpQUkVEX0xFOiBPIDw8ICJsZSI7IHJldHVybjsKKyAgICBjYXNlIFBQQzo6UFJFRF9FUTogTyA8PCAiZXEiOyByZXR1cm47CisgICAgY2FzZSBQUEM6OlBSRURfR0U6IE8gPDwgImdlIjsgcmV0dXJuOworICAgIGNhc2UgUFBDOjpQUkVEX0dUOiBPIDw8ICJndCI7IHJldHVybjsKKyAgICBjYXNlIFBQQzo6UFJFRF9ORTogTyA8PCAibmUiOyByZXR1cm47CisgICAgY2FzZSBQUEM6OlBSRURfVU46IE8gPDwgInVuIjsgcmV0dXJuOworICAgIGNhc2UgUFBDOjpQUkVEX05VOiBPIDw8ICJudSI7IHJldHVybjsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoIXN0cmNtcChNb2RpZmllciwgInJlZyIpICYmCisgICAgICAgICAgICJOZWVkIHRvIHNwZWNpZnkgJ2NjJyBvciAncmVnJyBhcyBwcmVkaWNhdGUgb3AgbW9kaWZpZXIhIik7CisgICAgLy8gRG9uJ3QgcHJpbnQgdGhlIHJlZ2lzdGVyIGZvciAnYWx3YXlzJy4KKyAgICBpZiAoQ29kZSA9PSBQUEM6OlBSRURfQUxXQVlTKSByZXR1cm47CisgICAgcHJpbnRPcGVyYW5kKE1JLCBPcE5vKzEsIE8pOworICB9Cit9CisKKworLy8vIEVtaXRJbnN0cnVjdGlvbiAtLSBQcmludCBvdXQgYSBzaW5nbGUgUG93ZXJQQyBNSSBpbiBEYXJ3aW4gc3ludGF4IHRvCisvLy8gdGhlIGN1cnJlbnQgb3V0cHV0IHN0cmVhbS4KKy8vLwordm9pZCBQUENBc21QcmludGVyOjpFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSkgeworICBTbWFsbFN0cmluZzwxMjg+IFN0cjsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPKFN0cik7CisKKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkRCR19WQUxVRSkgeworICAgIHVuc2lnbmVkIE5PcHMgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICBhc3NlcnQoTk9wcz09NCk7CisgICAgTyA8PCAnXHQnIDw8IE1BSS0+Z2V0Q29tbWVudFN0cmluZygpIDw8ICJERUJVR19WQUxVRTogIjsKKyAgICAvLyBjYXN0IGF3YXkgY29uc3Q7IERJZXRjIGRvIG5vdCB0YWtlIGNvbnN0IG9wZXJhbmRzIGZvciBzb21lIHJlYXNvbi4KKyAgICBESVZhcmlhYmxlIFYoY29uc3RfY2FzdDxNRE5vZGUgKj4oTUktPmdldE9wZXJhbmQoTk9wcy0xKS5nZXRNZXRhZGF0YSgpKSk7CisgICAgTyA8PCBWLmdldE5hbWUoKTsKKyAgICBPIDw8ICIgPC0gIjsKKyAgICAvLyBGcmFtZSBhZGRyZXNzLiAgQ3VycmVudGx5IGhhbmRsZXMgcmVnaXN0ZXIgKy0gb2Zmc2V0IG9ubHkuCisgICAgYXNzZXJ0KE1JLT5nZXRPcGVyYW5kKDApLmlzUmVnKCkgJiYgTUktPmdldE9wZXJhbmQoMSkuaXNJbW0oKSk7CisgICAgTyA8PCAnWyc7IHByaW50T3BlcmFuZChNSSwgMCwgTyk7IE8gPDwgJysnOyBwcmludE9wZXJhbmQoTUksIDEsIE8pOworICAgIE8gPDwgJ10nOworICAgIE8gPDwgIisiOworICAgIHByaW50T3BlcmFuZChNSSwgTk9wcy0yLCBPKTsKKyAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChPLnN0cigpKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gQ2hlY2sgZm9yIHNsd2kvc3J3aSBtbmVtb25pY3MuCisgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpSTFdJTk0pIHsKKyAgICB1bnNpZ25lZCBjaGFyIFNIID0gTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCk7CisgICAgdW5zaWduZWQgY2hhciBNQiA9IE1JLT5nZXRPcGVyYW5kKDMpLmdldEltbSgpOworICAgIHVuc2lnbmVkIGNoYXIgTUUgPSBNSS0+Z2V0T3BlcmFuZCg0KS5nZXRJbW0oKTsKKyAgICBib29sIHVzZVN1YnN0aXR1dGVNbmVtb25pYyA9IGZhbHNlOworICAgIGlmIChTSCA8PSAzMSAmJiBNQiA9PSAwICYmIE1FID09ICgzMS1TSCkpIHsKKyAgICAgIE8gPDwgIlx0c2x3aSAiOyB1c2VTdWJzdGl0dXRlTW5lbW9uaWMgPSB0cnVlOworICAgIH0KKyAgICBpZiAoU0ggPD0gMzEgJiYgTUIgPT0gKDMyLVNIKSAmJiBNRSA9PSAzMSkgeworICAgICAgTyA8PCAiXHRzcndpICI7IHVzZVN1YnN0aXR1dGVNbmVtb25pYyA9IHRydWU7CisgICAgICBTSCA9IDMyLVNIOworICAgIH0KKyAgICBpZiAodXNlU3Vic3RpdHV0ZU1uZW1vbmljKSB7CisgICAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOworICAgICAgTyA8PCAiLCAiOworICAgICAgcHJpbnRPcGVyYW5kKE1JLCAxLCBPKTsKKyAgICAgIE8gPDwgIiwgIiA8PCAodW5zaWduZWQgaW50KVNIOworICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoTy5zdHIoKSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIAorICBpZiAoKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6Ok9SIHx8IE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6Ok9SOCkgJiYKKyAgICAgIE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpID09IE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpKSB7CisgICAgTyA8PCAiXHRtciAiOworICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7CisgICAgTyA8PCAiLCAiOworICAgIHByaW50T3BlcmFuZChNSSwgMSwgTyk7CisgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoTy5zdHIoKSk7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZiAoTUktPmdldE9wY29kZSgpID09IFBQQzo6UkxESUNSKSB7CisgICAgdW5zaWduZWQgY2hhciBTSCA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgIHVuc2lnbmVkIGNoYXIgTUUgPSBNSS0+Z2V0T3BlcmFuZCgzKS5nZXRJbW0oKTsKKyAgICAvLyBybGRpY3IgUkEsIFJTLCBTSCwgNjMtU0ggPT0gc2xkaSBSQSwgUlMsIFNICisgICAgaWYgKDYzLVNIID09IE1FKSB7CisgICAgICBPIDw8ICJcdHNsZGkgIjsKKyAgICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7CisgICAgICBPIDw8ICIsICI7CisgICAgICBwcmludE9wZXJhbmQoTUksIDEsIE8pOworICAgICAgTyA8PCAiLCAiIDw8ICh1bnNpZ25lZCBpbnQpU0g7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChPLnN0cigpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBwcmludEluc3RydWN0aW9uKE1JLCBPKTsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoTy5zdHIoKSk7Cit9CisKK3ZvaWQgUFBDTGludXhBc21QcmludGVyOjpFbWl0RnVuY3Rpb25FbnRyeUxhYmVsKCkgeworICBpZiAoIVN1YnRhcmdldC5pc1BQQzY0KCkpICAvLyBsaW51eC9wcGMzMiAtIE5vcm1hbCBlbnRyeSBsYWJlbC4KKyAgICByZXR1cm4gQXNtUHJpbnRlcjo6RW1pdEZ1bmN0aW9uRW50cnlMYWJlbCgpOworICAgIAorICAvLyBFbWl0IGFuIG9mZmljaWFsIHByb2NlZHVyZSBkZXNjcmlwdG9yLgorICAvLyBGSVhNRSA2NC1iaXQgU1ZSNDogVXNlIE1DU2VjdGlvbiBoZXJlIQorICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChTdHJpbmdSZWYoIlx0LnNlY3Rpb25cdFwiLm9wZFwiLFwiYXdcIiIpKTsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5hbGlnbiAzIikpOworICBPdXRTdHJlYW1lci5FbWl0TGFiZWwoQ3VycmVudEZuU3ltKTsKKyAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LnF1YWQgLkwuIiArIFR3aW5lKEN1cnJlbnRGblN5bS0+Z2V0TmFtZSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIsLlRPQy5AdG9jYmFzZSIpOworICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChTdHJpbmdSZWYoIlx0LnByZXZpb3VzIikpOworICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiLkwuIiArIFR3aW5lKEN1cnJlbnRGblN5bS0+Z2V0TmFtZSgpKSArICI6Iik7Cit9CisKKworYm9vbCBQUENMaW51eEFzbVByaW50ZXI6OmRvRmluYWxpemF0aW9uKE1vZHVsZSAmTSkgeworICBjb25zdCBUYXJnZXREYXRhICpURCA9IFRNLmdldFRhcmdldERhdGEoKTsKKworICBib29sIGlzUFBDNjQgPSBURC0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKSA9PSA2NDsKKworICBpZiAoaXNQUEM2NCAmJiAhVE9DLmVtcHR5KCkpIHsKKyAgICAvLyBGSVhNRSA2NC1iaXQgU1ZSNDogVXNlIE1DU2VjdGlvbiBoZXJlPworICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXHQuc2VjdGlvblx0XCIudG9jXCIsXCJhd1wiIikpOworCisgICAgLy8gRklYTUU6IFRoaXMgaXMgbm9uZGV0ZXJtaW5zdGljIQorICAgIGZvciAoRGVuc2VNYXA8TUNTeW1ib2wqLCBNQ1N5bWJvbCo+OjppdGVyYXRvciBJID0gVE9DLmJlZ2luKCksCisgICAgICAgICBFID0gVE9DLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgT3V0U3RyZWFtZXIuRW1pdExhYmVsKEktPnNlY29uZCk7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHQudGMgIiArIFR3aW5lKEktPmZpcnN0LT5nZXROYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbVENdLCIgKyBJLT5maXJzdC0+Z2V0TmFtZSgpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gQXNtUHJpbnRlcjo6ZG9GaW5hbGl6YXRpb24oTSk7Cit9CisKK3ZvaWQgUFBDRGFyd2luQXNtUHJpbnRlcjo6RW1pdFN0YXJ0T2ZBc21GaWxlKE1vZHVsZSAmTSkgeworICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgQ1BVRGlyZWN0aXZlc1tdID0geworICAgICIiLAorICAgICJwcGMiLAorICAgICJwcGM2MDEiLAorICAgICJwcGM2MDIiLAorICAgICJwcGM2MDMiLAorICAgICJwcGM3NDAwIiwKKyAgICAicHBjNzUwIiwKKyAgICAicHBjOTcwIiwKKyAgICAicHBjNjQiCisgIH07CisKKyAgdW5zaWduZWQgRGlyZWN0aXZlID0gU3VidGFyZ2V0LmdldERhcndpbkRpcmVjdGl2ZSgpOworICBpZiAoU3VidGFyZ2V0LmlzR2lnYVByb2Nlc3NvcigpICYmIERpcmVjdGl2ZSA8IFBQQzo6RElSXzk3MCkKKyAgICBEaXJlY3RpdmUgPSBQUEM6OkRJUl85NzA7CisgIGlmIChTdWJ0YXJnZXQuaGFzQWx0aXZlYygpICYmIERpcmVjdGl2ZSA8IFBQQzo6RElSXzc0MDApCisgICAgRGlyZWN0aXZlID0gUFBDOjpESVJfNzQwMDsKKyAgaWYgKFN1YnRhcmdldC5pc1BQQzY0KCkgJiYgRGlyZWN0aXZlIDwgUFBDOjpESVJfOTcwKQorICAgIERpcmVjdGl2ZSA9IFBQQzo6RElSXzY0OworICBhc3NlcnQoRGlyZWN0aXZlIDw9IFBQQzo6RElSXzY0ICYmICJEaXJlY3RpdmUgb3V0IG9mIHJhbmdlLiIpOworICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHQubWFjaGluZSAiICsgVHdpbmUoQ1BVRGlyZWN0aXZlc1tEaXJlY3RpdmVdKSk7CisKKyAgLy8gUHJpbWUgdGV4dCBzZWN0aW9ucyBzbyB0aGV5IGFyZSBhZGphY2VudC4gIFRoaXMgcmVkdWNlcyB0aGUgbGlrZWxpaG9vZCBhCisgIC8vIGxhcmdlIGRhdGEgb3IgZGVidWcgc2VjdGlvbiBjYXVzZXMgYSBicmFuY2ggdG8gZXhjZWVkIDE2TSBsaW1pdC4KKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlTWFjaE8gJlRMT0ZNYWNobyA9IAorICAgIHN0YXRpY19jYXN0PGNvbnN0IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZU1hY2hPICY+KGdldE9iakZpbGVMb3dlcmluZygpKTsKKyAgT3V0U3RyZWFtZXIuU3dpdGNoU2VjdGlvbihUTE9GTWFjaG8uZ2V0VGV4dENvYWxTZWN0aW9uKCkpOworICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pIHsKKyAgICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKAorICAgICAgICAgICBPdXRDb250ZXh0LmdldE1hY2hPU2VjdGlvbigiX19URVhUIiwgIl9fcGljc3ltYm9sc3R1YjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19TWU1CT0xfU1RVQlMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX1BVUkVfSU5TVFJVQ1RJT05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgU2VjdGlvbktpbmQ6OmdldFRleHQoKSkpOworICB9IGVsc2UgaWYgKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpEeW5hbWljTm9QSUMpIHsKKyAgICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKAorICAgICAgICAgICBPdXRDb250ZXh0LmdldE1hY2hPU2VjdGlvbigiX19URVhUIiwiX19zeW1ib2xfc3R1YjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19TWU1CT0xfU1RVQlMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25NYWNoTzo6U19BVFRSX1BVUkVfSU5TVFJVQ1RJT05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgU2VjdGlvbktpbmQ6OmdldFRleHQoKSkpOworICB9CisgIE91dFN0cmVhbWVyLlN3aXRjaFNlY3Rpb24oZ2V0T2JqRmlsZUxvd2VyaW5nKCkuZ2V0VGV4dFNlY3Rpb24oKSk7Cit9CisKK3N0YXRpYyBNQ1N5bWJvbCAqR2V0TGF6eVB0cihNQ1N5bWJvbCAqU3ltLCBNQ0NvbnRleHQgJkN0eCkgeworICAvLyBSZW1vdmUgJHN0dWIgc3VmZml4LCBhZGQgJGxhenlfcHRyLgorICBTbWFsbFN0cmluZzwxMjg+IFRtcFN0cihTeW0tPmdldE5hbWUoKS5iZWdpbigpLCBTeW0tPmdldE5hbWUoKS5lbmQoKS01KTsKKyAgVG1wU3RyICs9ICIkbGF6eV9wdHIiOworICByZXR1cm4gQ3R4LkdldE9yQ3JlYXRlU3ltYm9sKFRtcFN0ci5zdHIoKSk7Cit9CisKK3N0YXRpYyBNQ1N5bWJvbCAqR2V0QW5vblN5bShNQ1N5bWJvbCAqU3ltLCBNQ0NvbnRleHQgJkN0eCkgeworICAvLyBBZGQgJHRtcCBzdWZmaXggdG8gJHN0dWIsIHlpZWxkaW5nICRzdHViJHRtcC4KKyAgU21hbGxTdHJpbmc8MTI4PiBUbXBTdHIoU3ltLT5nZXROYW1lKCkuYmVnaW4oKSwgU3ltLT5nZXROYW1lKCkuZW5kKCkpOworICBUbXBTdHIgKz0gIiR0bXAiOworICByZXR1cm4gQ3R4LkdldE9yQ3JlYXRlU3ltYm9sKFRtcFN0ci5zdHIoKSk7Cit9CisKK3ZvaWQgUFBDRGFyd2luQXNtUHJpbnRlcjo6CitFbWl0RnVuY3Rpb25TdHVicyhjb25zdCBNYWNoaW5lTW9kdWxlSW5mb01hY2hPOjpTeW1ib2xMaXN0VHkgJlN0dWJzKSB7CisgIGJvb2wgaXNQUEM2NCA9IFRNLmdldFRhcmdldERhdGEoKS0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKSA9PSA2NDsKKyAgCisgIGNvbnN0IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZU1hY2hPICZUTE9GTWFjaG8gPSAKKyAgICBzdGF0aWNfY2FzdDxjb25zdCBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVNYWNoTyAmPihnZXRPYmpGaWxlTG93ZXJpbmcoKSk7CisKKyAgLy8gLmxhenlfc3ltYm9sX3BvaW50ZXIKKyAgY29uc3QgTUNTZWN0aW9uICpMU1BTZWN0aW9uID0gVExPRk1hY2hvLmdldExhenlTeW1ib2xQb2ludGVyU2VjdGlvbigpOworICAKKyAgLy8gT3V0cHV0IHN0dWJzIGZvciBkeW5hbWljYWxseS1saW5rZWQgZnVuY3Rpb25zCisgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6UElDXykgeworICAgIGNvbnN0IE1DU2VjdGlvbiAqU3R1YlNlY3Rpb24gPSAKKyAgICBPdXRDb250ZXh0LmdldE1hY2hPU2VjdGlvbigiX19URVhUIiwgIl9fcGljc3ltYm9sc3R1YjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX1NZTUJPTF9TVFVCUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9QVVJFX0lOU1RSVUNUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgU2VjdGlvbktpbmQ6OmdldFRleHQoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN0dWJzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE91dFN0cmVhbWVyLlN3aXRjaFNlY3Rpb24oU3R1YlNlY3Rpb24pOworICAgICAgRW1pdEFsaWdubWVudCg0KTsKKyAgICAgIAorICAgICAgTUNTeW1ib2wgKlN0dWIgPSBTdHVic1tpXS5maXJzdDsKKyAgICAgIE1DU3ltYm9sICpSYXdTeW0gPSBTdHVic1tpXS5zZWNvbmQuZ2V0UG9pbnRlcigpOworICAgICAgTUNTeW1ib2wgKkxhenlQdHIgPSBHZXRMYXp5UHRyKFN0dWIsIE91dENvbnRleHQpOworICAgICAgTUNTeW1ib2wgKkFub25TeW1ib2wgPSBHZXRBbm9uU3ltKFN0dWIsIE91dENvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgT3V0U3RyZWFtZXIuRW1pdExhYmVsKFN0dWIpOworICAgICAgT3V0U3RyZWFtZXIuRW1pdFN5bWJvbEF0dHJpYnV0ZShSYXdTeW0sIE1DU0FfSW5kaXJlY3RTeW1ib2wpOworICAgICAgLy8gRklYTUU6IE1DaXplIHRoaXMuCisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChTdHJpbmdSZWYoIlx0bWZsciByMCIpKTsKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdGJjbCAyMCwzMSwiICsgVHdpbmUoQW5vblN5bWJvbC0+Z2V0TmFtZSgpKSk7CisgICAgICBPdXRTdHJlYW1lci5FbWl0TGFiZWwoQW5vblN5bWJvbCk7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChTdHJpbmdSZWYoIlx0bWZsciByMTEiKSk7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHRhZGRpcyByMTEscjExLGhhMTYoIitUd2luZShMYXp5UHRyLT5nZXROYW1lKCkpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0iICsgQW5vblN5bWJvbC0+Z2V0TmFtZSgpICsgIikiKTsKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXHRtdGxyIHIwIikpOworICAgICAgCisgICAgICBpZiAoaXNQUEM2NCkKKyAgICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0bGR1IHIxMixsbzE2KCIgKyBUd2luZShMYXp5UHRyLT5nZXROYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0iICsgQW5vblN5bWJvbC0+Z2V0TmFtZSgpICsgIikocjExKSIpOworICAgICAgZWxzZQorICAgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHRsd3p1IHIxMixsbzE2KCIgKyBUd2luZShMYXp5UHRyLT5nZXROYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0iICsgQW5vblN5bWJvbC0+Z2V0TmFtZSgpICsgIikocjExKSIpOworICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdG10Y3RyIHIxMiIpKTsKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXHRiY3RyIikpOworICAgICAgCisgICAgICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKExTUFNlY3Rpb24pOworICAgICAgT3V0U3RyZWFtZXIuRW1pdExhYmVsKExhenlQdHIpOworICAgICAgT3V0U3RyZWFtZXIuRW1pdFN5bWJvbEF0dHJpYnV0ZShSYXdTeW0sIE1DU0FfSW5kaXJlY3RTeW1ib2wpOworICAgICAgCisgICAgICBpZiAoaXNQUEM2NCkKKyAgICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5xdWFkIGR5bGRfc3R1Yl9iaW5kaW5nX2hlbHBlciIpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5sb25nIGR5bGRfc3R1Yl9iaW5kaW5nX2hlbHBlciIpKTsKKyAgICB9CisgICAgT3V0U3RyZWFtZXIuQWRkQmxhbmtMaW5lKCk7CisgICAgcmV0dXJuOworICB9CisgIAorICBjb25zdCBNQ1NlY3Rpb24gKlN0dWJTZWN0aW9uID0KKyAgICBPdXRDb250ZXh0LmdldE1hY2hPU2VjdGlvbigiX19URVhUIiwiX19zeW1ib2xfc3R1YjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbk1hY2hPOjpTX1NZTUJPTF9TVFVCUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uTWFjaE86OlNfQVRUUl9QVVJFX0lOU1RSVUNUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgU2VjdGlvbktpbmQ6OmdldFRleHQoKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdHVicy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTUNTeW1ib2wgKlN0dWIgPSBTdHVic1tpXS5maXJzdDsKKyAgICBNQ1N5bWJvbCAqUmF3U3ltID0gU3R1YnNbaV0uc2Vjb25kLmdldFBvaW50ZXIoKTsKKyAgICBNQ1N5bWJvbCAqTGF6eVB0ciA9IEdldExhenlQdHIoU3R1YiwgT3V0Q29udGV4dCk7CisKKyAgICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKFN0dWJTZWN0aW9uKTsKKyAgICBFbWl0QWxpZ25tZW50KDQpOworICAgIE91dFN0cmVhbWVyLkVtaXRMYWJlbChTdHViKTsKKyAgICBPdXRTdHJlYW1lci5FbWl0U3ltYm9sQXR0cmlidXRlKFJhd1N5bSwgTUNTQV9JbmRpcmVjdFN5bWJvbCk7CisgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0bGlzIHIxMSxoYTE2KCIgKyBUd2luZShMYXp5UHRyLT5nZXROYW1lKCkpICsiKSIpOworICAgIGlmIChpc1BQQzY0KQorICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0bGR1IHIxMixsbzE2KCIgKyBUd2luZShMYXp5UHRyLT5nZXROYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpKHIxMSkiKTsKKyAgICBlbHNlCisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHRsd3p1IHIxMixsbzE2KCIgKyBUd2luZShMYXp5UHRyLT5nZXROYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpKHIxMSkiKTsKKyAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChTdHJpbmdSZWYoIlx0bXRjdHIgcjEyIikpOworICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXHRiY3RyIikpOworICAgIE91dFN0cmVhbWVyLlN3aXRjaFNlY3Rpb24oTFNQU2VjdGlvbik7CisgICAgT3V0U3RyZWFtZXIuRW1pdExhYmVsKExhenlQdHIpOworICAgIE91dFN0cmVhbWVyLkVtaXRTeW1ib2xBdHRyaWJ1dGUoUmF3U3ltLCBNQ1NBX0luZGlyZWN0U3ltYm9sKTsKKyAgICAKKyAgICBpZiAoaXNQUEM2NCkKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KFN0cmluZ1JlZigiXHQucXVhZCBkeWxkX3N0dWJfYmluZGluZ19oZWxwZXIiKSk7CisgICAgZWxzZQorICAgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCJcdC5sb25nIGR5bGRfc3R1Yl9iaW5kaW5nX2hlbHBlciIpKTsKKyAgfQorICAKKyAgT3V0U3RyZWFtZXIuQWRkQmxhbmtMaW5lKCk7Cit9CisKKworYm9vbCBQUENEYXJ3aW5Bc21QcmludGVyOjpkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIHsKKyAgYm9vbCBpc1BQQzY0ID0gVE0uZ2V0VGFyZ2V0RGF0YSgpLT5nZXRQb2ludGVyU2l6ZUluQml0cygpID09IDY0OworCisgIC8vIERhcndpbi9QUEMgYWx3YXlzIHVzZXMgbWFjaC1vLgorICBjb25zdCBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVNYWNoTyAmVExPRk1hY2hvID0gCisgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlTWFjaE8gJj4oZ2V0T2JqRmlsZUxvd2VyaW5nKCkpOworICBNYWNoaW5lTW9kdWxlSW5mb01hY2hPICZNTUlNYWNobyA9CisgICAgTU1JLT5nZXRPYmpGaWxlSW5mbzxNYWNoaW5lTW9kdWxlSW5mb01hY2hPPigpOworICAKKyAgTWFjaGluZU1vZHVsZUluZm9NYWNoTzo6U3ltYm9sTGlzdFR5IFN0dWJzID0gTU1JTWFjaG8uR2V0Rm5TdHViTGlzdCgpOworICBpZiAoIVN0dWJzLmVtcHR5KCkpCisgICAgRW1pdEZ1bmN0aW9uU3R1YnMoU3R1YnMpOworCisgIGlmIChNQUktPmRvZXNTdXBwb3J0RXhjZXB0aW9uSGFuZGxpbmcoKSAmJiBNTUkpIHsKKyAgICAvLyBBZGQgdGhlIChwb3NzaWJseSBtdWx0aXBsZSkgcGVyc29uYWxpdGllcyB0byB0aGUgc2V0IG9mIGdsb2JhbCB2YWx1ZXMuCisgICAgLy8gT25seSByZWZlcmVuY2VkIGZ1bmN0aW9ucyBnZXQgaW50byB0aGUgUGVyc29uYWxpdGllcyBsaXN0LgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZ1bmN0aW9uKj4gJlBlcnNvbmFsaXRpZXMgPSBNTUktPmdldFBlcnNvbmFsaXRpZXMoKTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPGNvbnN0IEZ1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBQZXJzb25hbGl0aWVzLmJlZ2luKCksCisgICAgICAgICBFID0gUGVyc29uYWxpdGllcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICgqSSkgeworICAgICAgICBNQ1N5bWJvbCAqTkxQU3ltID0gR2V0U3ltYm9sV2l0aEdsb2JhbFZhbHVlQmFzZSgqSSwgIiRub25fbGF6eV9wdHIiKTsKKyAgICAgICAgTWFjaGluZU1vZHVsZUluZm9JbXBsOjpTdHViVmFsdWVUeSAmU3R1YlN5bSA9CisgICAgICAgICAgTU1JTWFjaG8uZ2V0R1ZTdHViRW50cnkoTkxQU3ltKTsKKyAgICAgICAgU3R1YlN5bSA9IE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6U3R1YlZhbHVlVHkoTWFuZy0+Z2V0U3ltYm9sKCpJKSwgdHJ1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gT3V0cHV0IHN0dWJzIGZvciBkeW5hbWljYWxseS1saW5rZWQgZnVuY3Rpb25zLgorICBTdHVicyA9IE1NSU1hY2hvLkdldEdWU3R1Ykxpc3QoKTsKKyAgCisgIC8vIE91dHB1dCBtYWNobyBzdHVicyBmb3IgZXh0ZXJuYWwgYW5kIGNvbW1vbiBnbG9iYWwgdmFyaWFibGVzLgorICBpZiAoIVN0dWJzLmVtcHR5KCkpIHsKKyAgICAvLyBTd2l0Y2ggd2l0aCAiLm5vbl9sYXp5X3N5bWJvbF9wb2ludGVyIiBkaXJlY3RpdmUuCisgICAgT3V0U3RyZWFtZXIuU3dpdGNoU2VjdGlvbihUTE9GTWFjaG8uZ2V0Tm9uTGF6eVN5bWJvbFBvaW50ZXJTZWN0aW9uKCkpOworICAgIEVtaXRBbGlnbm1lbnQoaXNQUEM2NCA/IDMgOiAyKTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3R1YnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgLy8gTF9mb28kc3R1YjoKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRMYWJlbChTdHVic1tpXS5maXJzdCk7CisgICAgICAvLyAgIC5pbmRpcmVjdF9zeW1ib2wgX2ZvbworICAgICAgTWFjaGluZU1vZHVsZUluZm9JbXBsOjpTdHViVmFsdWVUeSAmTUNTeW0gPSBTdHVic1tpXS5zZWNvbmQ7CisgICAgICBPdXRTdHJlYW1lci5FbWl0U3ltYm9sQXR0cmlidXRlKE1DU3ltLmdldFBvaW50ZXIoKSwgTUNTQV9JbmRpcmVjdFN5bWJvbCk7CisKKyAgICAgIGlmIChNQ1N5bS5nZXRJbnQoKSkKKyAgICAgICAgLy8gRXh0ZXJuYWwgdG8gY3VycmVudCB0cmFuc2xhdGlvbiB1bml0LgorICAgICAgICBPdXRTdHJlYW1lci5FbWl0SW50VmFsdWUoMCwgaXNQUEM2NCA/IDggOiA0LypzaXplKi8sIDAvKmFkZHJzcGFjZSovKTsKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gSW50ZXJuYWwgdG8gY3VycmVudCB0cmFuc2xhdGlvbiB1bml0LgorICAgICAgICAvLworICAgICAgICAvLyBXaGVuIHdlIHBsYWNlIHRoZSBMU0RBIGludG8gdGhlIFRFWFQgc2VjdGlvbiwgdGhlIHR5cGUgaW5mbyBwb2ludGVycworICAgICAgICAvLyBuZWVkIHRvIGJlIGluZGlyZWN0IGFuZCBwYy1yZWwuIFdlIGFjY29tcGxpc2ggdGhpcyBieSB1c2luZyBOTFBzLgorICAgICAgICAvLyBIb3dldmVyLCBzb21ldGltZXMgdGhlIHR5cGVzIGFyZSBsb2NhbCB0byB0aGUgZmlsZS4gU28gd2UgbmVlZCB0bworICAgICAgICAvLyBmaWxsIGluIHRoZSB2YWx1ZSBmb3IgdGhlIE5MUCBpbiB0aG9zZSBjYXNlcy4KKyAgICAgICAgT3V0U3RyZWFtZXIuRW1pdFZhbHVlKE1DU3ltYm9sUmVmRXhwcjo6Q3JlYXRlKE1DU3ltLmdldFBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQUEM2NCA/IDggOiA0LypzaXplKi8sIDAvKmFkZHJzcGFjZSovKTsKKyAgICB9CisKKyAgICBTdHVicy5jbGVhcigpOworICAgIE91dFN0cmVhbWVyLkFkZEJsYW5rTGluZSgpOworICB9CisKKyAgU3R1YnMgPSBNTUlNYWNoby5HZXRIaWRkZW5HVlN0dWJMaXN0KCk7CisgIGlmICghU3R1YnMuZW1wdHkoKSkgeworICAgIE91dFN0cmVhbWVyLlN3aXRjaFNlY3Rpb24oZ2V0T2JqRmlsZUxvd2VyaW5nKCkuZ2V0RGF0YVNlY3Rpb24oKSk7CisgICAgRW1pdEFsaWdubWVudChpc1BQQzY0ID8gMyA6IDIpOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdHVicy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAvLyBMX2ZvbyRzdHViOgorICAgICAgT3V0U3RyZWFtZXIuRW1pdExhYmVsKFN0dWJzW2ldLmZpcnN0KTsKKyAgICAgIC8vICAgLmxvbmcgX2ZvbworICAgICAgT3V0U3RyZWFtZXIuRW1pdFZhbHVlKE1DU3ltYm9sUmVmRXhwcjo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlKFN0dWJzW2ldLnNlY29uZC5nZXRQb2ludGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUFBDNjQgPyA4IDogNC8qc2l6ZSovLCAwLyphZGRyc3BhY2UqLyk7CisgICAgfQorCisgICAgU3R1YnMuY2xlYXIoKTsKKyAgICBPdXRTdHJlYW1lci5BZGRCbGFua0xpbmUoKTsKKyAgfQorCisgIC8vIEZ1bm55IERhcndpbiBoYWNrOiBUaGlzIGZsYWcgdGVsbHMgdGhlIGxpbmtlciB0aGF0IG5vIGdsb2JhbCBzeW1ib2xzCisgIC8vIGNvbnRhaW4gY29kZSB0aGF0IGZhbGxzIHRocm91Z2ggdG8gb3RoZXIgZ2xvYmFsIHN5bWJvbHMgKGUuZy4gdGhlIG9idmlvdXMKKyAgLy8gaW1wbGVtZW50YXRpb24gb2YgbXVsdGlwbGUgZW50cnkgcG9pbnRzKS4gIElmIHRoaXMgZG9lc24ndCBvY2N1ciwgdGhlCisgIC8vIGxpbmtlciBjYW4gc2FmZWx5IHBlcmZvcm0gZGVhZCBjb2RlIHN0cmlwcGluZy4gIFNpbmNlIExMVk0gbmV2ZXIgZ2VuZXJhdGVzCisgIC8vIGNvZGUgdGhhdCBkb2VzIHRoaXMsIGl0IGlzIGFsd2F5cyBzYWZlIHRvIHNldC4KKyAgT3V0U3RyZWFtZXIuRW1pdEFzc2VtYmxlckZsYWcoTUNBRl9TdWJzZWN0aW9uc1ZpYVN5bWJvbHMpOworCisgIHJldHVybiBBc21QcmludGVyOjpkb0ZpbmFsaXphdGlvbihNKTsKK30KKworLy8vIGNyZWF0ZVBQQ0FzbVByaW50ZXJQYXNzIC0gUmV0dXJucyBhIHBhc3MgdGhhdCBwcmludHMgdGhlIFBQQyBhc3NlbWJseSBjb2RlCisvLy8gZm9yIGEgTWFjaGluZUZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLCBpbiBhIGZvcm1hdCB0aGF0IHRoZQorLy8vIERhcndpbiBhc3NlbWJsZXIgY2FuIGRlYWwgd2l0aC4KKy8vLworc3RhdGljIEFzbVByaW50ZXIgKmNyZWF0ZVBQQ0FzbVByaW50ZXJQYXNzKFRhcmdldE1hY2hpbmUgJnRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3RyZWFtZXIgJlN0cmVhbWVyKSB7CisgIGNvbnN0IFBQQ1N1YnRhcmdldCAqU3VidGFyZ2V0ID0gJnRtLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCk7CisKKyAgaWYgKFN1YnRhcmdldC0+aXNEYXJ3aW4oKSkKKyAgICByZXR1cm4gbmV3IFBQQ0RhcndpbkFzbVByaW50ZXIodG0sIFN0cmVhbWVyKTsKKyAgcmV0dXJuIG5ldyBQUENMaW51eEFzbVByaW50ZXIodG0sIFN0cmVhbWVyKTsKK30KKworLy8gRm9yY2Ugc3RhdGljIGluaXRpYWxpemF0aW9uLgorZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplUG93ZXJQQ0FzbVByaW50ZXIoKSB7IAorICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJBc21QcmludGVyKFRoZVBQQzMyVGFyZ2V0LCBjcmVhdGVQUENBc21QcmludGVyUGFzcyk7CisgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3RlckFzbVByaW50ZXIoVGhlUFBDNjRUYXJnZXQsIGNyZWF0ZVBQQ0FzbVByaW50ZXJQYXNzKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmZjNWViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzAgQEAKK3NldChMTFZNX1RBUkdFVF9ERUZJTklUSU9OUyBQUEMudGQpCisKK3RhYmxlZ2VuKFBQQ0dlbkluc3RyTmFtZXMuaW5jIC1nZW4taW5zdHItZW51bXMpCit0YWJsZWdlbihQUENHZW5SZWdpc3Rlck5hbWVzLmluYyAtZ2VuLXJlZ2lzdGVyLWVudW1zKQordGFibGVnZW4oUFBDR2VuQXNtV3JpdGVyLmluYyAtZ2VuLWFzbS13cml0ZXIpCit0YWJsZWdlbihQUENHZW5Db2RlRW1pdHRlci5pbmMgLWdlbi1lbWl0dGVyKQordGFibGVnZW4oUFBDR2VuUmVnaXN0ZXJJbmZvLmguaW5jIC1nZW4tcmVnaXN0ZXItZGVzYy1oZWFkZXIpCit0YWJsZWdlbihQUENHZW5SZWdpc3RlckluZm8uaW5jIC1nZW4tcmVnaXN0ZXItZGVzYykKK3RhYmxlZ2VuKFBQQ0dlbkluc3RySW5mby5pbmMgLWdlbi1pbnN0ci1kZXNjKQordGFibGVnZW4oUFBDR2VuREFHSVNlbC5pbmMgLWdlbi1kYWctaXNlbCkKK3RhYmxlZ2VuKFBQQ0dlbkNhbGxpbmdDb252LmluYyAtZ2VuLWNhbGxpbmdjb252KQordGFibGVnZW4oUFBDR2VuU3VidGFyZ2V0LmluYyAtZ2VuLXN1YnRhcmdldCkKKworYWRkX2xsdm1fdGFyZ2V0KFBvd2VyUENDb2RlR2VuCisgIFBQQ0JyYW5jaFNlbGVjdG9yLmNwcAorICBQUENDb2RlRW1pdHRlci5jcHAKKyAgUFBDSGF6YXJkUmVjb2duaXplcnMuY3BwCisgIFBQQ0luc3RySW5mby5jcHAKKyAgUFBDSVNlbERBR1RvREFHLmNwcAorICBQUENJU2VsTG93ZXJpbmcuY3BwCisgIFBQQ0pJVEluZm8uY3BwCisgIFBQQ01DQXNtSW5mby5jcHAKKyAgUFBDUHJlZGljYXRlcy5jcHAKKyAgUFBDUmVnaXN0ZXJJbmZvLmNwcAorICBQUENTdWJ0YXJnZXQuY3BwCisgIFBQQ1RhcmdldE1hY2hpbmUuY3BwCisgIFBQQ1NlbGVjdGlvbkRBR0luZm8uY3BwCisgICkKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChMTFZNUG93ZXJQQ0NvZGVHZW4gTExWTVNlbGVjdGlvbkRBRykKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjY1ZjFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L1Bvd2VyUEMvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVBvd2VyUENDb2RlR2VuCitUQVJHRVQgPSBQUEMKKworIyBNYWtlIHN1cmUgdGhhdCB0YmxnZW4gaXMgcnVuLCBmaXJzdCB0aGluZy4KK0JVSUxUX1NPVVJDRVMgPSBQUENHZW5JbnN0ck5hbWVzLmluYyBQUENHZW5SZWdpc3Rlck5hbWVzLmluYyBcCisgICAgICAgICAgICAgICAgUFBDR2VuQXNtV3JpdGVyLmluYyAgUFBDR2VuQ29kZUVtaXR0ZXIuaW5jIFwKKyAgICAgICAgICAgICAgICBQUENHZW5SZWdpc3RlckluZm8uaC5pbmMgUFBDR2VuUmVnaXN0ZXJJbmZvLmluYyBcCisgICAgICAgICAgICAgICAgUFBDR2VuSW5zdHJJbmZvLmluYyBQUENHZW5EQUdJU2VsLmluYyBcCisgICAgICAgICAgICAgICAgUFBDR2VuU3VidGFyZ2V0LmluYyBQUENHZW5DYWxsaW5nQ29udi5pbmMKKworRElSUyA9IEFzbVByaW50ZXIgVGFyZ2V0SW5mbworCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQy5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZTNhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDLmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tLSBQUEMuaCAtIFRvcC1sZXZlbCBpbnRlcmZhY2UgZm9yIFBvd2VyUEMgVGFyZ2V0IC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGVudHJ5IHBvaW50cyBmb3IgZ2xvYmFsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBMTFZNCisvLyBQb3dlclBDIGJhY2stZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfUE9XRVJQQ19ICisjZGVmaW5lIExMVk1fVEFSR0VUX1BPV0VSUENfSAorCisvLyBHQ0MgI2RlZmluZXMgUFBDIG9uIExpbnV4IGJ1dCB3ZSB1c2UgaXQgYXMgb3VyIG5hbWVzcGFjZSBuYW1lCisjdW5kZWYgUFBDCisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgUFBDVGFyZ2V0TWFjaGluZTsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBjbGFzcyBmb3JtYXR0ZWRfcmF3X29zdHJlYW07CisgIAorRnVuY3Rpb25QYXNzICpjcmVhdGVQUENCcmFuY2hTZWxlY3Rpb25QYXNzKCk7CitGdW5jdGlvblBhc3MgKmNyZWF0ZVBQQ0lTZWxEYWcoUFBDVGFyZ2V0TWFjaGluZSAmVE0pOworRnVuY3Rpb25QYXNzICpjcmVhdGVQUENKSVRDb2RlRW1pdHRlclBhc3MoUFBDVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRDb2RlRW1pdHRlciAmTUNFKTsKKworZXh0ZXJuIFRhcmdldCBUaGVQUEMzMlRhcmdldDsKK2V4dGVybiBUYXJnZXQgVGhlUFBDNjRUYXJnZXQ7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtOworCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciBQb3dlclBDIHJlZ2lzdGVycy4gIFRoaXMgZGVmaW5lcyBhIG1hcHBpbmcgZnJvbQorLy8gcmVnaXN0ZXIgbmFtZSB0byByZWdpc3RlciBudW1iZXIuCisvLworI2luY2x1ZGUgIlBQQ0dlblJlZ2lzdGVyTmFtZXMuaW5jIgorCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciB0aGUgUG93ZXJQQyBpbnN0cnVjdGlvbnMuCisvLworI2luY2x1ZGUgIlBQQ0dlbkluc3RyTmFtZXMuaW5jIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUEMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMmQ2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDLnRkCkBAIC0wLDAgKzEsMTA2IEBACisvLz09PS0gUFBDLnRkIC0gRGVzY3JpYmUgdGhlIFBvd2VyUEMgVGFyZ2V0IE1hY2hpbmUgLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBpcyB0aGUgdG9wIGxldmVsIGVudHJ5IHBvaW50IGZvciB0aGUgUG93ZXJQQyB0YXJnZXQuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIEdldCB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMgd2hpY2ggd2UgYXJlIGltcGxlbWVudGluZy4NCisvLw0KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldC50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFBvd2VyUEMgU3VidGFyZ2V0IGZlYXR1cmVzLg0KKy8vDQorIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQ1BVIERpcmVjdGl2ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2RlZiBEaXJlY3RpdmU2MDEgOiBTdWJ0YXJnZXRGZWF0dXJlPCIiLCAiRGFyd2luRGlyZWN0aXZlIiwgIlBQQzo6RElSXzYwMSIsICIiPjsNCitkZWYgRGlyZWN0aXZlNjAyIDogU3VidGFyZ2V0RmVhdHVyZTwiIiwgIkRhcndpbkRpcmVjdGl2ZSIsICJQUEM6OkRJUl82MDIiLCAiIj47DQorZGVmIERpcmVjdGl2ZTYwMyA6IFN1YnRhcmdldEZlYXR1cmU8IiIsICJEYXJ3aW5EaXJlY3RpdmUiLCAiUFBDOjpESVJfNjAzIiwgIiI+Ow0KK2RlZiBEaXJlY3RpdmU2MDQgOiBTdWJ0YXJnZXRGZWF0dXJlPCIiLCAiRGFyd2luRGlyZWN0aXZlIiwgIlBQQzo6RElSXzYwMyIsICIiPjsNCitkZWYgRGlyZWN0aXZlNjIwIDogU3VidGFyZ2V0RmVhdHVyZTwiIiwgIkRhcndpbkRpcmVjdGl2ZSIsICJQUEM6OkRJUl82MDMiLCAiIj47DQorZGVmIERpcmVjdGl2ZTc0MDA6IFN1YnRhcmdldEZlYXR1cmU8IiIsICJEYXJ3aW5EaXJlY3RpdmUiLCAiUFBDOjpESVJfNzQwMCIsICIiPjsNCitkZWYgRGlyZWN0aXZlNzUwIDogU3VidGFyZ2V0RmVhdHVyZTwiIiwgIkRhcndpbkRpcmVjdGl2ZSIsICJQUEM6OkRJUl83NTAiLCAiIj47DQorZGVmIERpcmVjdGl2ZTk3MCA6IFN1YnRhcmdldEZlYXR1cmU8IiIsICJEYXJ3aW5EaXJlY3RpdmUiLCAiUFBDOjpESVJfOTcwIiwgIiI+Ow0KK2RlZiBEaXJlY3RpdmUzMiAgOiBTdWJ0YXJnZXRGZWF0dXJlPCIiLCAiRGFyd2luRGlyZWN0aXZlIiwgIlBQQzo6RElSXzMyIiwgIiI+Ow0KK2RlZiBEaXJlY3RpdmU2NCAgOiBTdWJ0YXJnZXRGZWF0dXJlPCIiLCAiRGFyd2luRGlyZWN0aXZlIiwgIlBQQzo6RElSXzY0IiwgIiI+Ow0KKw0KK2RlZiBGZWF0dXJlNjRCaXQgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwiNjRiaXQiLCJIYXM2NEJpdFN1cHBvcnQiLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgNjQtYml0IGluc3RydWN0aW9ucyI+Ow0KK2RlZiBGZWF0dXJlNjRCaXRSZWdzIDogU3VidGFyZ2V0RmVhdHVyZTwiNjRiaXRyZWdzIiwiVXNlNjRCaXRSZWdzIiwgInRydWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgNjQtYml0IHJlZ2lzdGVycyB1c2FnZSBmb3IgcHBjMzIgW2JldGFdIj47DQorZGVmIEZlYXR1cmVBbHRpdmVjICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJhbHRpdmVjIiwiSGFzQWx0aXZlYyIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBBbHRpdmVjIGluc3RydWN0aW9ucyI+Ow0KK2RlZiBGZWF0dXJlR1BVTCAgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwiZ3B1bCIsIklzR2lnYVByb2Nlc3NvciIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBHUFVMIGluc3RydWN0aW9ucyI+Ow0KK2RlZiBGZWF0dXJlRlNxcnQgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwiZnNxcnQiLCJIYXNGU1FSVCIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSB0aGUgZnNxcnQgaW5zdHJ1Y3Rpb24iPjsgDQorZGVmIEZlYXR1cmVTVEZJV1ggICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJzdGZpd3giLCJIYXNTVEZJV1giLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgdGhlIHN0Zml3eCBpbnN0cnVjdGlvbiI+OyANCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFJlZ2lzdGVyIEZpbGUgRGVzY3JpcHRpb24NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIlBQQ1JlZ2lzdGVySW5mby50ZCINCitpbmNsdWRlICJQUENTY2hlZHVsZS50ZCINCitpbmNsdWRlICJQUENJbnN0ckluZm8udGQiDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBQb3dlclBDIHByb2Nlc3NvcnMgc3VwcG9ydGVkLg0KKy8vDQorDQorZGVmIDogUHJvY2Vzc29yPCJnZW5lcmljIiwgRzNJdGluZXJhcmllcywgW0RpcmVjdGl2ZTMyXT47DQorZGVmIDogUHJvY2Vzc29yPCI2MDEiLCBHM0l0aW5lcmFyaWVzLCBbRGlyZWN0aXZlNjAxXT47DQorZGVmIDogUHJvY2Vzc29yPCI2MDIiLCBHM0l0aW5lcmFyaWVzLCBbRGlyZWN0aXZlNjAyXT47DQorZGVmIDogUHJvY2Vzc29yPCI2MDMiLCBHM0l0aW5lcmFyaWVzLCBbRGlyZWN0aXZlNjAzXT47DQorZGVmIDogUHJvY2Vzc29yPCI2MDNlIiwgRzNJdGluZXJhcmllcywgW0RpcmVjdGl2ZTYwM10+Ow0KK2RlZiA6IFByb2Nlc3NvcjwiNjAzZXYiLCBHM0l0aW5lcmFyaWVzLCBbRGlyZWN0aXZlNjAzXT47DQorZGVmIDogUHJvY2Vzc29yPCI2MDQiLCBHM0l0aW5lcmFyaWVzLCBbRGlyZWN0aXZlNjA0XT47DQorZGVmIDogUHJvY2Vzc29yPCI2MDRlIiwgRzNJdGluZXJhcmllcywgW0RpcmVjdGl2ZTYwNF0+Ow0KK2RlZiA6IFByb2Nlc3NvcjwiNjIwIiwgRzNJdGluZXJhcmllcywgW0RpcmVjdGl2ZTYyMF0+Ow0KK2RlZiA6IFByb2Nlc3NvcjwiZzMiLCBHM0l0aW5lcmFyaWVzLCBbRGlyZWN0aXZlNzQwMF0+Ow0KK2RlZiA6IFByb2Nlc3NvcjwiNzQwMCIsIEc0SXRpbmVyYXJpZXMsIFtEaXJlY3RpdmU3NDAwLCBGZWF0dXJlQWx0aXZlY10+Ow0KK2RlZiA6IFByb2Nlc3NvcjwiZzQiLCBHNEl0aW5lcmFyaWVzLCBbRGlyZWN0aXZlNzQwMCwgRmVhdHVyZUFsdGl2ZWNdPjsNCitkZWYgOiBQcm9jZXNzb3I8Ijc0NTAiLCBHNFBsdXNJdGluZXJhcmllcywgW0RpcmVjdGl2ZTc0MDAsIEZlYXR1cmVBbHRpdmVjXT47DQorZGVmIDogUHJvY2Vzc29yPCJnNCsiLCBHNFBsdXNJdGluZXJhcmllcywgW0RpcmVjdGl2ZTc1MCwgRmVhdHVyZUFsdGl2ZWNdPjsNCitkZWYgOiBQcm9jZXNzb3I8Ijc1MCIsIEc0SXRpbmVyYXJpZXMsIFtEaXJlY3RpdmU3NTAsIEZlYXR1cmVBbHRpdmVjXT47DQorZGVmIDogUHJvY2Vzc29yPCI5NzAiLCBHNUl0aW5lcmFyaWVzLA0KKyAgICAgICAgICAgICAgICAgIFtEaXJlY3RpdmU5NzAsIEZlYXR1cmVBbHRpdmVjLA0KKyAgICAgICAgICAgICAgICAgICBGZWF0dXJlR1BVTCwgRmVhdHVyZUZTcXJ0LCBGZWF0dXJlU1RGSVdYLA0KKyAgICAgICAgICAgICAgICAgICBGZWF0dXJlNjRCaXQgLyosIEZlYXR1cmU2NEJpdFJlZ3MgKi9dPjsNCitkZWYgOiBQcm9jZXNzb3I8Imc1IiwgRzVJdGluZXJhcmllcywNCisgICAgICAgICAgICAgICAgICBbRGlyZWN0aXZlOTcwLCBGZWF0dXJlQWx0aXZlYywNCisgICAgICAgICAgICAgICAgICAgRmVhdHVyZUdQVUwsIEZlYXR1cmVGU3FydCwgRmVhdHVyZVNURklXWCwNCisgICAgICAgICAgICAgICAgICAgRmVhdHVyZTY0Qml0IC8qLCBGZWF0dXJlNjRCaXRSZWdzICovXT47DQorZGVmIDogUHJvY2Vzc29yPCJwcGMiLCBHM0l0aW5lcmFyaWVzLCBbRGlyZWN0aXZlMzJdPjsNCitkZWYgOiBQcm9jZXNzb3I8InBwYzY0IiwgRzVJdGluZXJhcmllcywNCisgICAgICAgICAgICAgICAgICBbRGlyZWN0aXZlNjQsIEZlYXR1cmVBbHRpdmVjLA0KKyAgICAgICAgICAgICAgICAgICBGZWF0dXJlR1BVTCwgRmVhdHVyZUZTcXJ0LCBGZWF0dXJlU1RGSVdYLA0KKyAgICAgICAgICAgICAgICAgICBGZWF0dXJlNjRCaXQgLyosIEZlYXR1cmU2NEJpdFJlZ3MgKi9dPjsNCisNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIENhbGxpbmcgQ29udmVudGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIlBQQ0NhbGxpbmdDb252LnRkIg0KKw0KK2RlZiBQUENJbnN0ckluZm8gOiBJbnN0ckluZm8gew0KKyAgbGV0IGlzTGl0dGxlRW5kaWFuRW5jb2RpbmcgPSAxOw0KK30NCisNCisNCitkZWYgUFBDIDogVGFyZ2V0IHsNCisgIC8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnN0cnVjdGlvbnMuDQorICBsZXQgSW5zdHJ1Y3Rpb25TZXQgPSBQUENJbnN0ckluZm87DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENCcmFuY2hTZWxlY3Rvci5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDQnJhbmNoU2VsZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjRlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDQnJhbmNoU2VsZWN0b3IuY3BwCkBAIC0wLDAgKzEsMTc0IEBACisvLz09PS0tIFBQQ0JyYW5jaFNlbGVjdG9yLmNwcCAtIEVtaXQgbG9uZyBjb25kaXRpb25hbCBicmFuY2hlcy0tLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHBhc3MgdGhhdCBzY2FucyBhIG1hY2hpbmUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoCisvLyBjb25kaXRpb25hbCBicmFuY2hlcyBuZWVkIG1vcmUgdGhhbiAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCB0byByZWFjaCB0aGVpcgorLy8gdGFyZ2V0IGJhc2ljIGJsb2NrLiAgSXQgZG9lcyB0aGlzIGluIHR3byBwYXNzZXM7IGEgY2FsY3VsYXRpb24gb2YgYmFzaWMgYmxvY2sKKy8vIHBvc2l0aW9ucyBwYXNzLCBhbmQgYSBicmFuY2ggcHN1ZWRvIG9wIHRvIG1hY2hpbmUgYnJhbmNoIG9wY29kZSBwYXNzLiAgVGhpcworLy8gcGFzcyBzaG91bGQgYmUgcnVuIGxhc3QsIGp1c3QgYmVmb3JlIHRoZSBhc3NlbWJseSBwcmludGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicHBjLWJyYW5jaC1zZWxlY3QiCisjaW5jbHVkZSAiUFBDLmgiCisjaW5jbHVkZSAiUFBDSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAiUFBDSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiUFBDUHJlZGljYXRlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUV4cGFuZGVkLCAiTnVtYmVyIG9mIGJyYW5jaGVzIGV4cGFuZGVkIHRvIGxvbmcgZm9ybWF0Iik7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBQUENCU2VsIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOworICAgIFBQQ0JTZWwoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICAvLy8gQmxvY2tTaXplcyAtIFRoZSBzaXplcyBvZiB0aGUgYmFzaWMgYmxvY2tzIGluIHRoZSBmdW5jdGlvbi4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gQmxvY2tTaXplczsKKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkZuKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIlBvd2VyUEMgQnJhbmNoIFNlbGVjdG9yIjsKKyAgICB9CisgIH07CisgIGNoYXIgUFBDQlNlbDo6SUQgPSAwOworfQorCisvLy8gY3JlYXRlUFBDQnJhbmNoU2VsZWN0aW9uUGFzcyAtIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIEJyYW5jaCBTZWxlY3Rpb24KKy8vLyBQYXNzCisvLy8KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlUFBDQnJhbmNoU2VsZWN0aW9uUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBQUENCU2VsKCk7Cit9CisKK2Jvb2wgUFBDQlNlbDo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGbikgeworICBjb25zdCBQUENJbnN0ckluZm8gKlRJSSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgUFBDSW5zdHJJbmZvKj4oRm4uZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCkpOworICAvLyBHaXZlIHRoZSBibG9ja3Mgb2YgdGhlIGZ1bmN0aW9uIGEgZGVuc2UsIGluLW9yZGVyLCBudW1iZXJpbmcuCisgIEZuLlJlbnVtYmVyQmxvY2tzKCk7CisgIEJsb2NrU2l6ZXMucmVzaXplKEZuLmdldE51bUJsb2NrSURzKCkpOworCisgIC8vIE1lYXN1cmUgZWFjaCBNQkIgYW5kIGNvbXB1dGUgYSBzaXplIGZvciB0aGUgZW50aXJlIGZ1bmN0aW9uLgorICB1bnNpZ25lZCBGdW5jU2l6ZSA9IDA7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNRkkgPSBGbi5iZWdpbigpLCBFID0gRm4uZW5kKCk7IE1GSSAhPSBFOworICAgICAgICsrTUZJKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1GSTsKKworICAgIHVuc2lnbmVkIEJsb2NrU2l6ZSA9IDA7CisgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IE1CQi0+YmVnaW4oKSwgRUUgPSBNQkItPmVuZCgpOworICAgICAgICAgTUJCSSAhPSBFRTsgKytNQkJJKQorICAgICAgQmxvY2tTaXplICs9IFRJSS0+R2V0SW5zdFNpemVJbkJ5dGVzKE1CQkkpOworICAgIAorICAgIEJsb2NrU2l6ZXNbTUJCLT5nZXROdW1iZXIoKV0gPSBCbG9ja1NpemU7CisgICAgRnVuY1NpemUgKz0gQmxvY2tTaXplOworICB9CisgIAorICAvLyBJZiB0aGUgZW50aXJlIGZ1bmN0aW9uIGlzIHNtYWxsZXIgdGhhbiB0aGUgZGlzcGxhY2VtZW50IG9mIGEgYnJhbmNoIGZpZWxkLAorICAvLyB3ZSBrbm93IHdlIGRvbid0IG5lZWQgdG8gc2hyaW5rIGFueSBicmFuY2hlcyBpbiB0aGlzIGZ1bmN0aW9uLiAgVGhpcyBpcyBhCisgIC8vIGNvbW1vbiBjYXNlLgorICBpZiAoRnVuY1NpemUgPCAoMSA8PCAxNSkpIHsKKyAgICBCbG9ja1NpemVzLmNsZWFyKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLyBGb3IgZWFjaCBjb25kaXRpb25hbCBicmFuY2gsIGlmIHRoZSBvZmZzZXQgdG8gaXRzIGRlc3RpbmF0aW9uIGlzIGxhcmdlcgorICAvLyB0aGFuIHRoZSBvZmZzZXQgZmllbGQgYWxsb3dzLCB0cmFuc2Zvcm0gaXQgaW50byBhIGxvbmcgYnJhbmNoIHNlcXVlbmNlCisgIC8vIGxpa2UgdGhpczoKKyAgLy8gICBzaG9ydCBicmFuY2g6CisgIC8vICAgICBiQ0MgTUJCCisgIC8vICAgbG9uZyBicmFuY2g6CisgIC8vICAgICBiIUNDICRQQys4CisgIC8vICAgICBiIE1CQgorICAvLworICBib29sIE1hZGVDaGFuZ2UgPSB0cnVlOworICBib29sIEV2ZXJNYWRlQ2hhbmdlID0gZmFsc2U7CisgIHdoaWxlIChNYWRlQ2hhbmdlKSB7CisgICAgLy8gSXRlcmF0aXZlbHkgZXhwYW5kIGJyYW5jaGVzIHVudGlsIHdlIHJlYWNoIGEgZml4ZWQgcG9pbnQuCisgICAgTWFkZUNoYW5nZSA9IGZhbHNlOworICAKKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUZJID0gRm4uYmVnaW4oKSwgRSA9IEZuLmVuZCgpOyBNRkkgIT0gRTsKKyAgICAgICAgICsrTUZJKSB7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1GSTsKKyAgICAgIHVuc2lnbmVkIE1CQlN0YXJ0T2Zmc2V0ID0gMDsKKyAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuYmVnaW4oKSwgRSA9IE1CQi5lbmQoKTsKKyAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgaWYgKEktPmdldE9wY29kZSgpICE9IFBQQzo6QkNDIHx8IEktPmdldE9wZXJhbmQoMikuaXNJbW0oKSkgeworICAgICAgICAgIE1CQlN0YXJ0T2Zmc2V0ICs9IFRJSS0+R2V0SW5zdFNpemVJbkJ5dGVzKEkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IGJyYW5jaCB0byB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgLy8gYmxvY2suCisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpEZXN0ID0gSS0+Z2V0T3BlcmFuZCgyKS5nZXRNQkIoKTsKKyAgICAgICAgCisgICAgICAgIGludCBCcmFuY2hTaXplOworICAgICAgICBpZiAoRGVzdC0+Z2V0TnVtYmVyKCkgPD0gTUJCLmdldE51bWJlcigpKSB7CisgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGJhY2t3YXJkcyBicmFuY2gsIHRoZSBkZWx0YSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlCisgICAgICAgICAgLy8gc3RhcnQgb2YgdGhpcyBibG9jayB0byB0aGlzIGJyYW5jaCwgcGx1cyB0aGUgc2l6ZXMgb2YgYWxsIGJsb2NrcworICAgICAgICAgIC8vIGZyb20gdGhpcyBibG9jayB0byB0aGUgZGVzdC4KKyAgICAgICAgICBCcmFuY2hTaXplID0gTUJCU3RhcnRPZmZzZXQ7CisgICAgICAgICAgCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gRGVzdC0+Z2V0TnVtYmVyKCksIGUgPSBNQkIuZ2V0TnVtYmVyKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgQnJhbmNoU2l6ZSArPSBCbG9ja1NpemVzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIE90aGVyd2lzZSwgYWRkIHRoZSBzaXplIG9mIHRoZSBibG9ja3MgYmV0d2VlbiB0aGlzIGJsb2NrIGFuZCB0aGUKKyAgICAgICAgICAvLyBkZXN0IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCBpbiB0aGlzIGJsb2NrLgorICAgICAgICAgIEJyYW5jaFNpemUgPSAtTUJCU3RhcnRPZmZzZXQ7CisKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBNQkIuZ2V0TnVtYmVyKCksIGUgPSBEZXN0LT5nZXROdW1iZXIoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgICBCcmFuY2hTaXplICs9IEJsb2NrU2l6ZXNbaV07CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIGJyYW5jaCBpcyBpbiByYW5nZSwgaWdub3JlIGl0LgorICAgICAgICBpZiAoaXNJbnQ8MTY+KEJyYW5jaFNpemUpKSB7CisgICAgICAgICAgTUJCU3RhcnRPZmZzZXQgKz0gNDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGV4cGFuZCBpdCB0byBhIGxvbmcgYnJhbmNoLgorICAgICAgICAvLyBUaGUgQkNDIG9wZXJhbmRzIGFyZToKKyAgICAgICAgLy8gMC4gUFBDIGJyYW5jaCBwcmVkaWNhdGUKKyAgICAgICAgLy8gMS4gQ1IgcmVnaXN0ZXIKKyAgICAgICAgLy8gMi4gVGFyZ2V0IE1CQgorICAgICAgICBQUEM6OlByZWRpY2F0ZSBQcmVkID0gKFBQQzo6UHJlZGljYXRlKUktPmdldE9wZXJhbmQoMCkuZ2V0SW1tKCk7CisgICAgICAgIHVuc2lnbmVkIENSUmVnID0gSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICAgICAgCisgICAgICAgIE1hY2hpbmVJbnN0ciAqT2xkQnJhbmNoID0gSTsKKyAgICAgICAgRGVidWdMb2MgZGwgPSBPbGRCcmFuY2gtPmdldERlYnVnTG9jKCk7CisgICAgICAgIAorICAgICAgICAvLyBKdW1wIG92ZXIgdGhlIHVuY29uZCBicmFuY2ggaW5zdCAoaS5lLiAkUEMrOCkgb24gb3Bwb3NpdGUgY29uZGl0aW9uLgorICAgICAgICBCdWlsZE1JKE1CQiwgSSwgZGwsIFRJSS0+Z2V0KFBQQzo6QkNDKSkKKyAgICAgICAgICAuYWRkSW1tKFBQQzo6SW52ZXJ0UHJlZGljYXRlKFByZWQpKS5hZGRSZWcoQ1JSZWcpLmFkZEltbSgyKTsKKyAgICAgICAgCisgICAgICAgIC8vIFVuY29uZCBicmFuY2ggdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisgICAgICAgIEkgPSBCdWlsZE1JKE1CQiwgSSwgZGwsIFRJSS0+Z2V0KFBQQzo6QikpLmFkZE1CQihEZXN0KTsKKworICAgICAgICAvLyBSZW1vdmUgdGhlIG9sZCBicmFuY2ggZnJvbSB0aGUgZnVuY3Rpb24uCisgICAgICAgIE9sZEJyYW5jaC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIAorICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgOC1ieXRlcywgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlCisgICAgICAgIC8vIGJsb2NrIGJ5IDQsIHJlbWVtYmVyIHRvIGl0ZXJhdGUuCisgICAgICAgIEJsb2NrU2l6ZXNbTUJCLmdldE51bWJlcigpXSArPSA0OworICAgICAgICBNQkJTdGFydE9mZnNldCArPSA4OworICAgICAgICArK051bUV4cGFuZGVkOworICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgRXZlck1hZGVDaGFuZ2UgfD0gTWFkZUNoYW5nZTsKKyAgfQorICAKKyAgQmxvY2tTaXplcy5jbGVhcigpOworICByZXR1cm4gdHJ1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0NhbGxpbmdDb252LnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0NhbGxpbmdDb252LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTIxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDQ2FsbGluZ0NvbnYudGQKQEAgLTAsMCArMSwxMzIgQEAKKy8vPT09LSBQUENDYWxsaW5nQ29udi50ZCAtIENhbGxpbmcgQ29udmVudGlvbnMgZm9yIFBvd2VyUEMgLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGRlc2NyaWJlcyB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgdGhlIFBvd2VyUEMgMzItIGFuZCA2NC1iaXQNCisvLyBhcmNoaXRlY3R1cmVzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLy8gQ0NJZlN1YnRhcmdldCAtIE1hdGNoIGlmIHRoZSBjdXJyZW50IHN1YnRhcmdldCBoYXMgYSBmZWF0dXJlIEYuDQorY2xhc3MgQ0NJZlN1YnRhcmdldDxzdHJpbmcgRiwgQ0NBY3Rpb24gQT4NCisgOiBDQ0lmPCFzdHJjb25jYXQoIlN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkuIiwgRiksIEE+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gUmV0dXJuIFZhbHVlIENhbGxpbmcgQ29udmVudGlvbg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gUmV0dXJuLXZhbHVlIGNvbnZlbnRpb24gZm9yIFBvd2VyUEMNCitkZWYgUmV0Q0NfUFBDIDogQ2FsbGluZ0NvbnY8Ww0KKyAgQ0NJZlR5cGU8W2kzMl0sIENDQXNzaWduVG9SZWc8W1IzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LCBSMTBdPj4sDQorICBDQ0lmVHlwZTxbaTY0XSwgQ0NBc3NpZ25Ub1JlZzxbWDMsIFg0LCBYNSwgWDZdPj4sDQorICANCisgIENDSWZUeXBlPFtmMzJdLCBDQ0Fzc2lnblRvUmVnPFtGMV0+PiwNCisgIENDSWZUeXBlPFtmNjRdLCBDQ0Fzc2lnblRvUmVnPFtGMSwgRjJdPj4sDQorICANCisgIC8vIFZlY3RvciB0eXBlcyBhcmUgYWx3YXlzIHJldHVybmVkIGluIFYyLg0KKyAgQ0NJZlR5cGU8W3YxNmk4LCB2OGkxNiwgdjRpMzIsIHY0ZjMyXSwgQ0NBc3NpZ25Ub1JlZzxbVjJdPj4NCitdPjsNCisNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFBvd2VyUEMgQXJndW1lbnQgQ2FsbGluZyBDb252ZW50aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLyoNCitkZWYgQ0NfUFBDIDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gVGhlIGZpcnN0IDggaW50ZWdlciBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVycy4NCisgIENDSWZUeXBlPFtpMzJdLCBDQ0Fzc2lnblRvUmVnPFtSMywgUjQsIFI1LCBSNiwgUjcsIFI4LCBSOSwgUjEwXT4+LA0KKyAgQ0NJZlR5cGU8W2k2NF0sIENDQXNzaWduVG9SZWc8W1gzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTBdPj4sDQorICANCisgIC8vIENvbW1vbiBzdWItdGFyZ2V0cyBwYXNzZXMgRlAgdmFsdWVzIGluIEYxIC0gRjEzDQorICBDQ0lmVHlwZTxbZjMyLCBmNjRdLCANCisgICAgICAgICAgIENDQXNzaWduVG9SZWc8W0YxLCBGMiwgRjMsIEY0LCBGNSwgRjYsIEY3LCBGOCxGOSxGMTAsRjExLEYxMixGMTNdPj4sDQorICAgICAgICAgICANCisgIC8vIFRoZSBmaXJzdCAxMiBWZWN0b3IgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gYWx0aXZlYyByZWdpc3RlcnMuDQorICBDQ0lmVHlwZTxbdjE2aTgsIHY4aTE2LCB2NGkzMiwgdjRmMzJdLA0KKyAgICAgICAgICAgICAgQ0NBc3NpZ25Ub1JlZzxbVjIsIFYzLCBWNCwgVjUsIFY2LCBWNywgVjgsIFY5LCBWMTAsVjExLFYxMixWMTNdPj4NCisNCisvKg0KKyAgLy8gSW50ZWdlci9GUCB2YWx1ZXMgZ2V0IHN0b3JlZCBpbiBzdGFjayBzbG90cyB0aGF0IGFyZSA4IGJ5dGVzIGluIHNpemUgYW5kDQorICAvLyA4LWJ5dGUgYWxpZ25lZCBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZWdpc3RlcnMgdG8gaG9sZCB0aGVtLg0KKyAgQ0NJZlR5cGU8W2kzMiwgaTY0LCBmMzIsIGY2NF0sIENDQXNzaWduVG9TdGFjazw4LCA4Pj4sDQorICANCisgIC8vIFZlY3RvcnMgZ2V0IDE2LWJ5dGUgc3RhY2sgc2xvdHMgdGhhdCBhcmUgMTYtYnl0ZSBhbGlnbmVkLg0KKyAgQ0NJZlR5cGU8W3YxNmk4LCB2OGkxNiwgdjRpMzIsIHYyaTY0LCB2NGYzMiwgdjJmNjRdLA0KKyAgICAgICAgICAgICAgQ0NBc3NpZ25Ub1N0YWNrPDE2LCAxNj4+Ki8NCitdPjsNCisNCisqLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gUG93ZXJQQyBTeXN0ZW0gViBSZWxlYXNlIDQgQUJJDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitkZWYgQ0NfUFBDX1NWUjRfQ29tbW9uIDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gVGhlIEFCSSByZXF1aXJlcyBpNjQgdG8gYmUgcGFzc2VkIGluIHR3byBhZGphY2VudCByZWdpc3RlcnMgd2l0aCB0aGUgZmlyc3QNCisgIC8vIHJlZ2lzdGVyIGhhdmluZyBhbiBvZGQgcmVnaXN0ZXIgbnVtYmVyLg0KKyAgQ0NJZlR5cGU8W2kzMl0sIENDSWZTcGxpdDxDQ0N1c3RvbTwiQ0NfUFBDX1NWUjRfQ3VzdG9tX0FsaWduQXJnUmVncyI+Pj4sDQorDQorICAvLyBUaGUgZmlyc3QgOCBpbnRlZ2VyIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzLg0KKyAgQ0NJZlR5cGU8W2kzMl0sIENDQXNzaWduVG9SZWc8W1IzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LCBSMTBdPj4sDQorDQorICAvLyBNYWtlIHN1cmUgdGhlIGk2NCB3b3JkcyBmcm9tIGEgbG9uZyBkb3VibGUgYXJlIGVpdGhlciBib3RoIHBhc3NlZCBpbg0KKyAgLy8gcmVnaXN0ZXJzIG9yIGJvdGggcGFzc2VkIG9uIHRoZSBzdGFjay4NCisgIENDSWZUeXBlPFtmNjRdLCBDQ0lmU3BsaXQ8Q0NDdXN0b208IkNDX1BQQ19TVlI0X0N1c3RvbV9BbGlnbkZQQXJnUmVncyI+Pj4sDQorICANCisgIC8vIEZQIHZhbHVlcyBhcmUgcGFzc2VkIGluIEYxIC0gRjguDQorICBDQ0lmVHlwZTxbZjMyLCBmNjRdLCBDQ0Fzc2lnblRvUmVnPFtGMSwgRjIsIEYzLCBGNCwgRjUsIEY2LCBGNywgRjhdPj4sDQorDQorICAvLyBTcGxpdCBhcmd1bWVudHMgaGF2ZSBhbiBhbGlnbm1lbnQgb2YgOCBieXRlcyBvbiB0aGUgc3RhY2suDQorICBDQ0lmVHlwZTxbaTMyXSwgQ0NJZlNwbGl0PENDQXNzaWduVG9TdGFjazw0LCA4Pj4+LA0KKyAgDQorICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1N0YWNrPDQsIDQ+PiwNCisgIA0KKyAgLy8gRmxvYXRzIGFyZSBzdG9yZWQgaW4gZG91YmxlIHByZWNpc2lvbiBmb3JtYXQsIHRodXMgdGhleSBoYXZlIHRoZSBzYW1lDQorICAvLyBhbGlnbm1lbnQgYW5kIHNpemUgYXMgZG91Ymxlcy4NCisgIENDSWZUeXBlPFtmMzIsZjY0XSwgQ0NBc3NpZ25Ub1N0YWNrPDgsIDg+PiwgIA0KKw0KKyAgLy8gVmVjdG9ycyBnZXQgMTYtYnl0ZSBzdGFjayBzbG90cyB0aGF0IGFyZSAxNi1ieXRlIGFsaWduZWQuDQorICBDQ0lmVHlwZTxbdjE2aTgsIHY4aTE2LCB2NGkzMiwgdjRmMzJdLCBDQ0Fzc2lnblRvU3RhY2s8MTYsIDE2Pj4NCitdPjsNCisNCisvLyBUaGlzIGNhbGxpbmcgY29udmVudGlvbiBwdXRzIHZlY3RvciBhcmd1bWVudHMgYWx3YXlzIG9uIHRoZSBzdGFjay4gSXQgaXMgdXNlZA0KKy8vIHRvIGFzc2lnbiB2ZWN0b3IgYXJndW1lbnRzIHdoaWNoIGJlbG9uZyB0byB0aGUgdmFyaWFibGUgcG9ydGlvbiBvZiB0aGUNCisvLyBwYXJhbWV0ZXIgbGlzdCBvZiBhIHZhcmlhYmxlIGFyZ3VtZW50IGZ1bmN0aW9uLg0KK2RlZiBDQ19QUENfU1ZSNF9WYXJBcmcgOiBDYWxsaW5nQ29udjxbDQorICBDQ0RlbGVnYXRlVG88Q0NfUFBDX1NWUjRfQ29tbW9uPg0KK10+Ow0KKw0KKy8vIEluIGNvbnRyYXN0IHRvIENDX1BQQ19TVlI0X1ZhckFyZywgdGhpcyBjYWxsaW5nIGNvbnZlbnRpb24gZmlyc3QgdHJpZXMgdG8gcHV0DQorLy8gdmVjdG9yIGFyZ3VtZW50cyBpbiB2ZWN0b3IgcmVnaXN0ZXJzIGJlZm9yZSBwdXR0aW5nIHRoZW0gb24gdGhlIHN0YWNrLg0KK2RlZiBDQ19QUENfU1ZSNCA6IENhbGxpbmdDb252PFsNCisgIC8vIFRoZSBmaXJzdCAxMiBWZWN0b3IgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gQWx0aVZlYyByZWdpc3RlcnMuDQorICBDQ0lmVHlwZTxbdjE2aTgsIHY4aTE2LCB2NGkzMiwgdjRmMzJdLA0KKyAgICAgICAgICAgQ0NBc3NpZ25Ub1JlZzxbVjIsIFYzLCBWNCwgVjUsIFY2LCBWNywgVjgsIFY5LCBWMTAsIFYxMSwgVjEyLCBWMTNdPj4sDQorICAgICAgICAgICANCisgIENDRGVsZWdhdGVUbzxDQ19QUENfU1ZSNF9Db21tb24+DQorXT47ICANCisNCisvLyBIZWxwZXIgImNhbGxpbmcgY29udmVudGlvbiIgdG8gaGFuZGxlIGFnZ3JlZ2F0ZSBieSB2YWx1ZSBhcmd1bWVudHMuDQorLy8gQWdncmVnYXRlIGJ5IHZhbHVlIGFyZ3VtZW50cyBhcmUgYWx3YXlzIHBsYWNlZCBpbiB0aGUgbG9jYWwgdmFyaWFibGUgc3BhY2UNCisvLyBvZiB0aGUgY2FsbGVyLiBUaGlzIGNhbGxpbmcgY29udmVudGlvbiBpcyBvbmx5IHVzZWQgdG8gYXNzaWduIHRob3NlIHN0YWNrDQorLy8gb2Zmc2V0cyBpbiB0aGUgY2FsbGVycyBzdGFjayBmcmFtZS4NCisvLw0KKy8vIFN0aWxsLCB0aGUgYWRkcmVzcyBvZiB0aGUgYWdncmVnYXRlIGNvcHkgaW4gdGhlIGNhbGxlcnMgc3RhY2sgZnJhbWUgaXMgcGFzc2VkDQorLy8gaW4gYSBHUFIgKG9yIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCBhcmVhIGlmIGFsbCBHUFJzIGFyZSBhbGxvY2F0ZWQpIGZyb20gdGhlDQorLy8gY2FsbGVyIHRvIHRoZSBjYWxsZWUuIFRoZSBsb2NhdGlvbiBmb3IgdGhlIGFkZHJlc3MgYXJndW1lbnQgaXMgYXNzaWduZWQgYnkNCisvLyB0aGUgQ0NfUFBDX1NWUjQgY2FsbGluZyBjb252ZW50aW9uLg0KKy8vDQorLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBDQ19QUENfU1ZSNF9DdXN0b21fRHVtbXkgaXMgdG8gc2tpcCBhcmd1bWVudHMgd2hpY2ggYXJlDQorLy8gbm90IHBhc3NlZCBieSB2YWx1ZS4NCisgDQorZGVmIENDX1BQQ19TVlI0X0J5VmFsIDogQ2FsbGluZ0NvbnY8Ww0KKyAgQ0NJZkJ5VmFsPENDUGFzc0J5VmFsPDQsIDQ+PiwNCisgIA0KKyAgQ0NDdXN0b208IkNDX1BQQ19TVlI0X0N1c3RvbV9EdW1teSI+DQorXT47DQorDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0NvZGVFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENDb2RlRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5YWI1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENDb2RlRW1pdHRlci5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8vPT09LS0gUFBDQ29kZUVtaXR0ZXIuY3BwIC0gSklUIENvZGUgRW1pdHRlciBmb3IgUG93ZXJQQzMyIC0tLS0tLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBvd2VyUEMgMzItYml0IENvZGVFbWl0dGVyIGFuZCBhc3NvY2lhdGVkIG1hY2hpbmVyeSB0bworLy8gSklULWNvbXBpbGUgYml0Y29kZSB0byBuYXRpdmUgUG93ZXJQQy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiUFBDVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlBQQ1JlbG9jYXRpb25zLmgiCisjaW5jbHVkZSAiUFBDLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0pJVENvZGVFbWl0dGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIFBQQ0NvZGVFbWl0dGVyIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIFRhcmdldE1hY2hpbmUgJlRNOworICAgIEpJVENvZGVFbWl0dGVyICZNQ0U7CisgICAgTWFjaGluZU1vZHVsZUluZm8gKk1NSTsKKyAgICAKKyAgICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPE1hY2hpbmVNb2R1bGVJbmZvPigpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBjaGFyIElEOworICAgIAorICAgIC8vLyBNb3ZlUEN0b0xST2Zmc2V0IC0gV2hlbi9pZiB3ZSBzZWUgYSBNb3ZlUEN0b0xSIGluc3RydWN0aW9uLCB3ZSByZWNvcmQKKyAgICAvLy8gaXRzIGFkZHJlc3MgaW4gdGhlIGZ1bmN0aW9uIGludG8gdGhpcyBwb2ludGVyLgorICAgIHZvaWQgKk1vdmVQQ3RvTFJPZmZzZXQ7CisgIHB1YmxpYzoKKyAgICAKKyAgICBQUENDb2RlRW1pdHRlcihUYXJnZXRNYWNoaW5lICZ0bSwgSklUQ29kZUVtaXR0ZXIgJm1jZSkKKyAgICAgIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCksIFRNKHRtKSwgTUNFKG1jZSkge30KKworICAgIC8vLyBnZXRCaW5hcnlDb2RlRm9ySW5zdHIgLSBUaGlzIGZ1bmN0aW9uLCBnZW5lcmF0ZWQgYnkgdGhlCisgICAgLy8vIENvZGVFbWl0dGVyR2VuZXJhdG9yIHVzaW5nIFRhYmxlR2VuLCBwcm9kdWNlcyB0aGUgYmluYXJ5IGVuY29kaW5nIGZvcgorICAgIC8vLyBtYWNoaW5lIGluc3RydWN0aW9ucy4KKworICAgIHVuc2lnbmVkIGdldEJpbmFyeUNvZGVGb3JJbnN0cihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAgIC8vLyBnZXRNYWNoaW5lT3BWYWx1ZSAtIGV2YWx1YXRlcyB0aGUgTWFjaGluZU9wZXJhbmQgb2YgYSBnaXZlbiBNYWNoaW5lSW5zdHIKKworICAgIHVuc2lnbmVkIGdldE1hY2hpbmVPcFZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKTsKKworICAgIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gIlBvd2VyUEMgTWFjaGluZSBDb2RlIEVtaXR0ZXIiOyB9CisKKyAgICAvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24gLSBlbWl0cyB0aGUgZ2l2ZW4gTWFjaGluZUZ1bmN0aW9uIHRvIG1lbW9yeQorICAgIC8vLworICAgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgICAvLy8gZW1pdEJhc2ljQmxvY2sgLSBlbWl0cyB0aGUgZ2l2ZW4gTWFjaGluZUJhc2ljQmxvY2sgdG8gbWVtb3J5CisgICAgLy8vCisgICAgdm9pZCBlbWl0QmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAgIC8vLyBnZXRWYWx1ZUJpdCAtIHJldHVybiB0aGUgcGFydGljdWxhciBiaXQgb2YgVmFsCisgICAgLy8vCisgICAgdW5zaWduZWQgZ2V0VmFsdWVCaXQoaW50NjRfdCBWYWwsIHVuc2lnbmVkIGJpdCkgeyByZXR1cm4gKFZhbCA+PiBiaXQpICYgMTsgfQorICB9OworfQorCitjaGFyIFBQQ0NvZGVFbWl0dGVyOjpJRCA9IDA7CisKKy8vLyBjcmVhdGVQUENDb2RlRW1pdHRlclBhc3MgLSBSZXR1cm4gYSBwYXNzIHRoYXQgZW1pdHMgdGhlIGNvbGxlY3RlZCBQUEMgY29kZQorLy8vIHRvIHRoZSBzcGVjaWZpZWQgTUNFIG9iamVjdC4KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlUFBDSklUQ29kZUVtaXR0ZXJQYXNzKFBQQ1RhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJkpDRSkgeworICByZXR1cm4gbmV3IFBQQ0NvZGVFbWl0dGVyKFRNLCBKQ0UpOworfQorCitib29sIFBQQ0NvZGVFbWl0dGVyOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIGFzc2VydCgoTUYuZ2V0VGFyZ2V0KCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgIT0gUmVsb2M6OkRlZmF1bHQgfHwKKyAgICAgICAgICBNRi5nZXRUYXJnZXQoKS5nZXRSZWxvY2F0aW9uTW9kZWwoKSAhPSBSZWxvYzo6U3RhdGljKSAmJgorICAgICAgICAgIkpJVCByZWxvY2F0aW9uIG1vZGVsIG11c3QgYmUgc2V0IHRvIHN0YXRpYyBvciBkZWZhdWx0ISIpOworCisgIE1NSSA9ICZnZXRBbmFseXNpczxNYWNoaW5lTW9kdWxlSW5mbz4oKTsKKyAgTUNFLnNldE1vZHVsZUluZm8oTU1JKTsKKyAgZG8geworICAgIE1vdmVQQ3RvTFJPZmZzZXQgPSAwOworICAgIE1DRS5zdGFydEZ1bmN0aW9uKE1GKTsKKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBNRi5iZWdpbigpLCBFID0gTUYuZW5kKCk7IEJCICE9IEU7ICsrQkIpCisgICAgICBlbWl0QmFzaWNCbG9jaygqQkIpOworICB9IHdoaWxlIChNQ0UuZmluaXNoRnVuY3Rpb24oTUYpKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUFBDQ29kZUVtaXR0ZXI6OmVtaXRCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIHsKKyAgTUNFLlN0YXJ0TWFjaGluZUJhc2ljQmxvY2soJk1CQik7CisKKyAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5iZWdpbigpLCBFID0gTUJCLmVuZCgpOyBJICE9IEU7ICsrSSl7CisgICAgY29uc3QgTWFjaGluZUluc3RyICZNSSA9ICpJOworICAgIE1DRS5wcm9jZXNzRGVidWdMb2MoTUkuZ2V0RGVidWdMb2MoKSwgdHJ1ZSk7CisgICAgc3dpdGNoIChNSS5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICBNQ0UuZW1pdFdvcmRCRShnZXRCaW5hcnlDb2RlRm9ySW5zdHIoTUkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpQUk9MT0dfTEFCRUw6CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OkVIX0xBQkVMOgorICAgICAgTUNFLmVtaXRMYWJlbChNSS5nZXRPcGVyYW5kKDApLmdldE1DU3ltYm9sKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRjoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6S0lMTDoKKyAgICAgIGJyZWFrOyAvLyBwc2V1ZG8gb3Bjb2RlLCBubyBzaWRlIGVmZmVjdHMKKyAgICBjYXNlIFBQQzo6TW92ZVBDdG9MUjoKKyAgICBjYXNlIFBQQzo6TW92ZVBDdG9MUjg6CisgICAgICBhc3NlcnQoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pOworICAgICAgTW92ZVBDdG9MUk9mZnNldCA9ICh2b2lkKilNQ0UuZ2V0Q3VycmVudFBDVmFsdWUoKTsKKyAgICAgIE1DRS5lbWl0V29yZEJFKDB4NDgwMDAwMDUpOyAgIC8vIGJsIDEKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBNQ0UucHJvY2Vzc0RlYnVnTG9jKE1JLmdldERlYnVnTG9jKCksIGZhbHNlKTsKKyAgfQorfQorCit1bnNpZ25lZCBQUENDb2RlRW1pdHRlcjo6Z2V0TWFjaGluZU9wVmFsdWUoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIHsKKworICB1bnNpZ25lZCBydiA9IDA7IC8vIFJldHVybiB2YWx1ZTsgZGVmYXVsdHMgdG8gMCBmb3IgdW5oYW5kbGVkIGNhc2VzCisgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhpbmdzIHRoYXQgZ2V0IGZpeGVkIHVwIGxhdGVyIGJ5IHRoZSBKSVQuCisgIGlmIChNTy5pc1JlZygpKSB7CisgICAgcnYgPSBQUENSZWdpc3RlckluZm86OmdldFJlZ2lzdGVyTnVtYmVyaW5nKE1PLmdldFJlZygpKTsKKworICAgIC8vIFNwZWNpYWwgZW5jb2RpbmcgZm9yIE1UQ1JGIGFuZCBNRk9DUkYsIHdoaWNoIHVzZXMgYSBiaXQgbWFzayBmb3IgdGhlCisgICAgLy8gcmVnaXN0ZXIsIG5vdCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGRpcmVjdGx5LgorICAgIGlmICgoTUkuZ2V0T3Bjb2RlKCkgPT0gUFBDOjpNVENSRiB8fCBNSS5nZXRPcGNvZGUoKSA9PSBQUEM6Ok1GT0NSRikgJiYKKyAgICAgICAgKE1PLmdldFJlZygpID49IFBQQzo6Q1IwICYmIE1PLmdldFJlZygpIDw9IFBQQzo6Q1I3KSkgeworICAgICAgcnYgPSAweDgwID4+IHJ2OworICAgIH0KKyAgfSBlbHNlIGlmIChNTy5pc0ltbSgpKSB7CisgICAgcnYgPSBNTy5nZXRJbW0oKTsKKyAgfSBlbHNlIGlmIChNTy5pc0dsb2JhbCgpIHx8IE1PLmlzU3ltYm9sKCkgfHwKKyAgICAgICAgICAgICBNTy5pc0NQSSgpIHx8IE1PLmlzSlRJKCkpIHsKKyAgICB1bnNpZ25lZCBSZWxvYyA9IDA7CisgICAgaWYgKE1JLmdldE9wY29kZSgpID09IFBQQzo6QkxfRGFyd2luIHx8IE1JLmdldE9wY29kZSgpID09IFBQQzo6Qkw4X0RhcndpbiB8fAorICAgICAgICBNSS5nZXRPcGNvZGUoKSA9PSBQUEM6OkJMX1NWUjQgfHwgTUkuZ2V0T3Bjb2RlKCkgPT0gUFBDOjpCTDhfRUxGIHx8CisgICAgICAgIE1JLmdldE9wY29kZSgpID09IFBQQzo6VEFJTEIgfHwgTUkuZ2V0T3Bjb2RlKCkgPT0gUFBDOjpUQUlMQjgpCisgICAgICBSZWxvYyA9IFBQQzo6cmVsb2NfcGNyZWxfYng7CisgICAgZWxzZSB7CisgICAgICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pIHsKKyAgICAgICAgYXNzZXJ0KE1vdmVQQ3RvTFJPZmZzZXQgJiYgIk1vdmVQQ3RvTFIgbm90IHNlZW4geWV0PyIpOworICAgICAgfQorICAgICAgc3dpdGNoIChNSS5nZXRPcGNvZGUoKSkgeworICAgICAgZGVmYXVsdDogTUkuZHVtcCgpOyBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGluc3RydWN0aW9uIGZvciByZWxvY2F0aW9uISIpOworICAgICAgY2FzZSBQUEM6OkxJUzoKKyAgICAgIGNhc2UgUFBDOjpMSVM4OgorICAgICAgY2FzZSBQUEM6OkFERElTOgorICAgICAgY2FzZSBQUEM6OkFERElTODoKKyAgICAgICAgUmVsb2MgPSBQUEM6OnJlbG9jX2Fic29sdXRlX2hpZ2g7ICAgICAgIC8vIFBvaW50ZXIgdG8gc3ltYm9sCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUEM6OkxJOgorICAgICAgY2FzZSBQUEM6OkxJODoKKyAgICAgIGNhc2UgUFBDOjpMQToKKyAgICAgIC8vIExvYWRzLgorICAgICAgY2FzZSBQUEM6OkxCWjoKKyAgICAgIGNhc2UgUFBDOjpMQlo4OgorICAgICAgY2FzZSBQUEM6OkxIQToKKyAgICAgIGNhc2UgUFBDOjpMSEE4OgorICAgICAgY2FzZSBQUEM6OkxIWjoKKyAgICAgIGNhc2UgUFBDOjpMSFo4OgorICAgICAgY2FzZSBQUEM6OkxXWjoKKyAgICAgIGNhc2UgUFBDOjpMV1o4OgorICAgICAgY2FzZSBQUEM6OkxGUzoKKyAgICAgIGNhc2UgUFBDOjpMRkQ6CisKKyAgICAgIC8vIFN0b3Jlcy4KKyAgICAgIGNhc2UgUFBDOjpTVEI6CisgICAgICBjYXNlIFBQQzo6U1RCODoKKyAgICAgIGNhc2UgUFBDOjpTVEg6CisgICAgICBjYXNlIFBQQzo6U1RIODoKKyAgICAgIGNhc2UgUFBDOjpTVFc6CisgICAgICBjYXNlIFBQQzo6U1RXODoKKyAgICAgIGNhc2UgUFBDOjpTVEZTOgorICAgICAgY2FzZSBQUEM6OlNURkQ6CisgICAgICAgIFJlbG9jID0gUFBDOjpyZWxvY19hYnNvbHV0ZV9sb3c7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBQQzo6TFdBOgorICAgICAgY2FzZSBQUEM6OkxEOgorICAgICAgY2FzZSBQUEM6OlNURDoKKyAgICAgIGNhc2UgUFBDOjpTVERfMzI6CisgICAgICAgIFJlbG9jID0gUFBDOjpyZWxvY19hYnNvbHV0ZV9sb3dfaXg7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIE1hY2hpbmVSZWxvY2F0aW9uIFI7CisgICAgaWYgKE1PLmlzR2xvYmFsKCkpIHsKKyAgICAgIFIgPSBNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0R1YoTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLCBSZWxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxHbG9iYWxWYWx1ZSAqPihNTy5nZXRHbG9iYWwoKSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzYTxGdW5jdGlvbj4oTU8uZ2V0R2xvYmFsKCkpKTsKKyAgICB9IGVsc2UgaWYgKE1PLmlzU3ltYm9sKCkpIHsKKyAgICAgIFIgPSBNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0RXh0U3ltKE1DRS5nZXRDdXJyZW50UENPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbG9jLCBNTy5nZXRTeW1ib2xOYW1lKCksIDApOworICAgIH0gZWxzZSBpZiAoTU8uaXNDUEkoKSkgeworICAgICAgUiA9IE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRDb25zdFBvb2woTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2MsIE1PLmdldEluZGV4KCksIDApOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoTU8uaXNKVEkoKSk7CisgICAgICBSID0gTWFjaGluZVJlbG9jYXRpb246OmdldEp1bXBUYWJsZShNQ0UuZ2V0Q3VycmVudFBDT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxvYywgTU8uZ2V0SW5kZXgoKSwgMCk7CisgICAgfQorCisgICAgLy8gSWYgaW4gUElDIG1vZGUsIHdlIG5lZWQgdG8gZW5jb2RlIHRoZSBuZWdhdGVkIGFkZHJlc3Mgb2YgdGhlCisgICAgLy8gJ21vdmVwY3RvbHInIGludG8gdGhlIHVucmVsb2NhdGVkIGZpZWxkLiAgQWZ0ZXIgcmVsb2NhdGlvbiwgd2UnbGwgaGF2ZQorICAgIC8vICZndi0mbW92ZXBjdG9sci00IGluIHRoZSBpbW0gZmllbGQuICBPbmNlICZtb3ZlcGN0b2xyIGlzIGFkZGVkIHRvIHRoZSBpbW0KKyAgICAvLyBmaWVsZCwgd2UgZ2V0ICZndi4gIFRoaXMgZG9lc24ndCBoYXBwZW4gZm9yIGJyYW5jaCByZWxvY2F0aW9ucywgd2hpY2ggYXJlCisgICAgLy8gYWx3YXlzIGltcGxpY2l0bHkgcGMgcmVsYXRpdmUuCisgICAgaWYgKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfICYmIFJlbG9jICE9IFBQQzo6cmVsb2NfcGNyZWxfYngpeworICAgICAgYXNzZXJ0KE1vdmVQQ3RvTFJPZmZzZXQgJiYgIk1vdmVQQ3RvTFIgbm90IHNlZW4geWV0PyIpOworICAgICAgUi5zZXRDb25zdGFudFZhbCgtKGludHB0cl90KU1vdmVQQ3RvTFJPZmZzZXQgLSA0KTsKKyAgICB9CisgICAgTUNFLmFkZFJlbG9jYXRpb24oUik7CisKKyAgfSBlbHNlIGlmIChNTy5pc01CQigpKSB7CisgICAgdW5zaWduZWQgUmVsb2MgPSAwOworICAgIHVuc2lnbmVkIE9wY29kZSA9IE1JLmdldE9wY29kZSgpOworICAgIGlmIChPcGNvZGUgPT0gUFBDOjpCIHx8IE9wY29kZSA9PSBQUEM6OkJMX0RhcndpbiB8fAorICAgICAgICBPcGNvZGUgPT0gUFBDOjpCTEFfRGFyd2lufHwgT3Bjb2RlID09IFBQQzo6QkxfU1ZSNCB8fAorICAgICAgICBPcGNvZGUgPT0gUFBDOjpCTEFfU1ZSNCkKKyAgICAgIFJlbG9jID0gUFBDOjpyZWxvY19wY3JlbF9ieDsKKyAgICBlbHNlIC8vIEJDQyBpbnN0cnVjdGlvbgorICAgICAgUmVsb2MgPSBQUEM6OnJlbG9jX3BjcmVsX2JjeDsKKworICAgIE1DRS5hZGRSZWxvY2F0aW9uKE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRCQihNQ0UuZ2V0Q3VycmVudFBDT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbG9jLCBNTy5nZXRNQkIoKSkpOworICB9IGVsc2UgeworI2lmbmRlZiBOREVCVUcKKyAgICBlcnJzKCkgPDwgIkVSUk9SOiBVbmtub3duIHR5cGUgb2YgTWFjaGluZU9wZXJhbmQ6ICIgPDwgTU8gPDwgIlxuIjsKKyNlbmRpZgorICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgIH0KKworICByZXR1cm4gcnY7Cit9CisKKyNpbmNsdWRlICJQUENHZW5Db2RlRW1pdHRlci5pbmMiCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDRnJhbWVJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDRnJhbWVJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4N2IwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENGcmFtZUluZm8uaApAQCAtMCwwICsxLDMwMCBAQAorLy89PT0tLSBQUENGcmFtZUluZm8uaCAtIERlZmluZSBUYXJnZXRGcmFtZUluZm8gZm9yIFBvd2VyUEMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQT1dFUlBDX0ZSQU1FSU5GT19ICisjZGVmaW5lIFBPV0VSUENfRlJBTUVJTkZPX0gKKworI2luY2x1ZGUgIlBQQy5oIgorI2luY2x1ZGUgIlBQQ1N1YnRhcmdldC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBQUENGcmFtZUluZm86IHB1YmxpYyBUYXJnZXRGcmFtZUluZm8geworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKworcHVibGljOgorICBQUENGcmFtZUluZm8oY29uc3QgVGFyZ2V0TWFjaGluZSAmdG0sIGJvb2wgTFA2NCkKKyAgICA6IFRhcmdldEZyYW1lSW5mbyhUYXJnZXRGcmFtZUluZm86OlN0YWNrR3Jvd3NEb3duLCAxNiwgMCksIFRNKHRtKSB7CisgIH0KKworICAvLy8gZ2V0UmV0dXJuU2F2ZU9mZnNldCAtIFJldHVybiB0aGUgcHJldmlvdXMgZnJhbWUgb2Zmc2V0IHRvIHNhdmUgdGhlCisgIC8vLyByZXR1cm4gYWRkcmVzcy4KKyAgc3RhdGljIHVuc2lnbmVkIGdldFJldHVyblNhdmVPZmZzZXQoYm9vbCBpc1BQQzY0LCBib29sIGlzRGFyd2luQUJJKSB7CisgICAgaWYgKGlzRGFyd2luQUJJKQorICAgICAgcmV0dXJuIGlzUFBDNjQgPyAxNiA6IDg7CisgICAgLy8gU1ZSNCBBQkk6CisgICAgcmV0dXJuIGlzUFBDNjQgPyAxNiA6IDQ7CisgIH0KKworICAvLy8gZ2V0RnJhbWVQb2ludGVyU2F2ZU9mZnNldCAtIFJldHVybiB0aGUgcHJldmlvdXMgZnJhbWUgb2Zmc2V0IHRvIHNhdmUgdGhlCisgIC8vLyBmcmFtZSBwb2ludGVyLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0RnJhbWVQb2ludGVyU2F2ZU9mZnNldChib29sIGlzUFBDNjQsIGJvb2wgaXNEYXJ3aW5BQkkpIHsKKyAgICAvLyBGb3IgdGhlIERhcndpbiBBQkk6CisgICAgLy8gV2UgY2Fubm90IHVzZSB0aGUgVE9DIHNhdmUgc2xvdCAob2Zmc2V0ICsyMCkgaW4gdGhlIFBvd2VyUEMgbGlua2FnZSBhcmVhCisgICAgLy8gZm9yIHNhdmluZyB0aGUgZnJhbWUgcG9pbnRlciAoaWYgbmVlZGVkLikgIFdoaWxlIHRoZSBwdWJsaXNoZWQgQUJJIGhhcworICAgIC8vIG5vdCB1c2VkIHRoaXMgc2xvdCBzaW5jZSBhdCBsZWFzdCBNYWNPU1ggMTAuMiwgdGhlcmUgaXMgb2xkZXIgY29kZQorICAgIC8vIGFyb3VuZCB0aGF0IGRvZXMgdXNlIGl0LCBhbmQgdGhhdCBuZWVkcyB0byBjb250aW51ZSB0byB3b3JrLgorICAgIGlmIChpc0RhcndpbkFCSSkKKyAgICAgIHJldHVybiBpc1BQQzY0ID8gLThVIDogLTRVOworICAgIAorICAgIC8vIFNWUjQgQUJJOiBGaXJzdCBzbG90IGluIHRoZSBnZW5lcmFsIHJlZ2lzdGVyIHNhdmUgYXJlYS4KKyAgICByZXR1cm4gaXNQUEM2NCA/IC04VSA6IC00VTsKKyAgfQorICAKKyAgLy8vIGdldExpbmthZ2VTaXplIC0gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBQb3dlclBDIEFCSSBsaW5rYWdlIGFyZWEuCisgIC8vLworICBzdGF0aWMgdW5zaWduZWQgZ2V0TGlua2FnZVNpemUoYm9vbCBpc1BQQzY0LCBib29sIGlzRGFyd2luQUJJKSB7CisgICAgaWYgKGlzRGFyd2luQUJJIHx8IGlzUFBDNjQpCisgICAgICByZXR1cm4gNiAqIChpc1BQQzY0ID8gOCA6IDQpOworICAgIAorICAgIC8vIFNWUjQgQUJJOgorICAgIHJldHVybiA4OworICB9CisKKyAgLy8vIGdldE1pbkNhbGxBcmd1bWVudHNTaXplIC0gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBtaW5pdW0gUG93ZXJQQyBBQkkKKyAgLy8vIGFyZ3VtZW50IGFyZWEuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRNaW5DYWxsQXJndW1lbnRzU2l6ZShib29sIGlzUFBDNjQsIGJvb2wgaXNEYXJ3aW5BQkkpIHsKKyAgICAvLyBGb3IgdGhlIERhcndpbiBBQkkgLyA2NC1iaXQgU1ZSNCBBQkk6CisgICAgLy8gVGhlIHByb2xvZyBjb2RlIG9mIHRoZSBjYWxsZWUgbWF5IHN0b3JlIHVwIHRvIDggR1BSIGFyZ3VtZW50IHJlZ2lzdGVycyB0bworICAgIC8vIHRoZSBzdGFjaywgYWxsb3dpbmcgdmFfc3RhcnQgdG8gaW5kZXggb3ZlciB0aGVtIGluIG1lbW9yeSBpZiBpdHMgdmFyYXJncy4KKyAgICAvLyBCZWNhdXNlIHdlIGNhbm5vdCB0ZWxsIGlmIHRoaXMgaXMgbmVlZGVkIG9uIHRoZSBjYWxsZXIgc2lkZSwgd2UgaGF2ZSB0bworICAgIC8vIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSB0aGF0IGl0IGlzIG5lZWRlZC4gIEFzIHN1Y2gsIG1ha2Ugc3VyZSB3ZSBoYXZlIGF0CisgICAgLy8gbGVhc3QgZW5vdWdoIHN0YWNrIHNwYWNlIGZvciB0aGUgY2FsbGVyIHRvIHN0b3JlIHRoZSA4IEdQUnMuCisgICAgaWYgKGlzRGFyd2luQUJJIHx8IGlzUFBDNjQpCisgICAgICByZXR1cm4gOCAqIChpc1BQQzY0ID8gOCA6IDQpOworICAgIAorICAgIC8vIDMyLWJpdCBTVlI0IEFCSToKKyAgICAvLyBUaGVyZSBpcyBubyBkZWZhdWx0IHN0YWNrIGFsbG9jYXRlZCBmb3IgdGhlIDggZmlyc3QgR1BSIGFyZ3VtZW50cy4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXRNaW5DYWxsRnJhbWVTaXplIC0gUmV0dXJuIHRoZSBtaW5pbXVtIHNpemUgYSBjYWxsIGZyYW1lIGNhbiBiZSB1c2luZworICAvLy8gdGhlIFBvd2VyUEMgQUJJLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0TWluQ2FsbEZyYW1lU2l6ZShib29sIGlzUFBDNjQsIGJvb2wgaXNEYXJ3aW5BQkkpIHsKKyAgICAvLyBUaGUgY2FsbCBmcmFtZSBuZWVkcyB0byBiZSBhdCBsZWFzdCBiaWcgZW5vdWdoIGZvciBsaW5rYWdlIGFuZCA4IGFyZ3MuCisgICAgcmV0dXJuIGdldExpbmthZ2VTaXplKGlzUFBDNjQsIGlzRGFyd2luQUJJKSArCisgICAgICAgICAgIGdldE1pbkNhbGxBcmd1bWVudHNTaXplKGlzUFBDNjQsIGlzRGFyd2luQUJJKTsKKyAgfQorCisgIC8vIFdpdGggdGhlIFNWUjQgQUJJLCBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIGhhdmUgZml4ZWQgb2Zmc2V0cyBvbiB0aGUgc3RhY2suCisgIGNvbnN0IFNwaWxsU2xvdCAqCisgIGdldENhbGxlZVNhdmVkU3BpbGxTbG90cyh1bnNpZ25lZCAmTnVtRW50cmllcykgY29uc3QgeworICAgIGlmIChUTS5nZXRTdWJ0YXJnZXQ8UFBDU3VidGFyZ2V0PigpLmlzRGFyd2luQUJJKCkpIHsKKyAgICAgIE51bUVudHJpZXMgPSAxOworICAgICAgaWYgKFRNLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkuaXNQUEM2NCgpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBTcGlsbFNsb3QgZGFyd2luNjRPZmZzZXRzID0ge1BQQzo6WDMxLCAtOH07CisgICAgICAgIHJldHVybiAmZGFyd2luNjRPZmZzZXRzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IFNwaWxsU2xvdCBkYXJ3aW5PZmZzZXRzID0ge1BQQzo6UjMxLCAtNH07CisgICAgICAgIHJldHVybiAmZGFyd2luT2Zmc2V0czsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFYXJseSBleGl0IGlmIG5vdCB1c2luZyB0aGUgU1ZSNCBBQkkuCisgICAgaWYgKCFUTS5nZXRTdWJ0YXJnZXQ8UFBDU3VidGFyZ2V0PigpLmlzU1ZSNEFCSSgpKSB7CisgICAgICBOdW1FbnRyaWVzID0gMDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBTcGlsbFNsb3QgT2Zmc2V0c1tdID0geworICAgICAgLy8gRmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIgc2F2ZSBhcmVhIG9mZnNldHMuCisgICAgICB7UFBDOjpGMzEsIC04fSwKKyAgICAgIHtQUEM6OkYzMCwgLTE2fSwKKyAgICAgIHtQUEM6OkYyOSwgLTI0fSwKKyAgICAgIHtQUEM6OkYyOCwgLTMyfSwKKyAgICAgIHtQUEM6OkYyNywgLTQwfSwKKyAgICAgIHtQUEM6OkYyNiwgLTQ4fSwKKyAgICAgIHtQUEM6OkYyNSwgLTU2fSwKKyAgICAgIHtQUEM6OkYyNCwgLTY0fSwKKyAgICAgIHtQUEM6OkYyMywgLTcyfSwKKyAgICAgIHtQUEM6OkYyMiwgLTgwfSwKKyAgICAgIHtQUEM6OkYyMSwgLTg4fSwKKyAgICAgIHtQUEM6OkYyMCwgLTk2fSwKKyAgICAgIHtQUEM6OkYxOSwgLTEwNH0sCisgICAgICB7UFBDOjpGMTgsIC0xMTJ9LAorICAgICAge1BQQzo6RjE3LCAtMTIwfSwKKyAgICAgIHtQUEM6OkYxNiwgLTEyOH0sCisgICAgICB7UFBDOjpGMTUsIC0xMzZ9LAorICAgICAge1BQQzo6RjE0LCAtMTQ0fSwKKworICAgICAgLy8gR2VuZXJhbCByZWdpc3RlciBzYXZlIGFyZWEgb2Zmc2V0cy4KKyAgICAgIHtQUEM6OlIzMSwgLTR9LAorICAgICAge1BQQzo6UjMwLCAtOH0sCisgICAgICB7UFBDOjpSMjksIC0xMn0sCisgICAgICB7UFBDOjpSMjgsIC0xNn0sCisgICAgICB7UFBDOjpSMjcsIC0yMH0sCisgICAgICB7UFBDOjpSMjYsIC0yNH0sCisgICAgICB7UFBDOjpSMjUsIC0yOH0sCisgICAgICB7UFBDOjpSMjQsIC0zMn0sCisgICAgICB7UFBDOjpSMjMsIC0zNn0sCisgICAgICB7UFBDOjpSMjIsIC00MH0sCisgICAgICB7UFBDOjpSMjEsIC00NH0sCisgICAgICB7UFBDOjpSMjAsIC00OH0sCisgICAgICB7UFBDOjpSMTksIC01Mn0sCisgICAgICB7UFBDOjpSMTgsIC01Nn0sCisgICAgICB7UFBDOjpSMTcsIC02MH0sCisgICAgICB7UFBDOjpSMTYsIC02NH0sCisgICAgICB7UFBDOjpSMTUsIC02OH0sCisgICAgICB7UFBDOjpSMTQsIC03Mn0sCisKKyAgICAgIC8vIENSIHNhdmUgYXJlYSBvZmZzZXQuCisgICAgICAvLyBGSVhNRSBTVlI0OiBEaXNhYmxlIENSIHNhdmUgYXJlYSBmb3Igbm93LgorLy8gICAgICB7UFBDOjpDUjIsIC00fSwKKy8vICAgICAge1BQQzo6Q1IzLCAtNH0sCisvLyAgICAgIHtQUEM6OkNSNCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjJMVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjJHVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjJFUSwgLTR9LAorLy8gICAgICB7UFBDOjpDUjJVTiwgLTR9LAorLy8gICAgICB7UFBDOjpDUjNMVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjNHVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjNFUSwgLTR9LAorLy8gICAgICB7UFBDOjpDUjNVTiwgLTR9LAorLy8gICAgICB7UFBDOjpDUjRMVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjRHVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjRFUSwgLTR9LAorLy8gICAgICB7UFBDOjpDUjRVTiwgLTR9LAorCisgICAgICAvLyBWUlNBVkUgc2F2ZSBhcmVhIG9mZnNldC4KKyAgICAgIHtQUEM6OlZSU0FWRSwgLTR9LAorCisgICAgICAvLyBWZWN0b3IgcmVnaXN0ZXIgc2F2ZSBhcmVhCisgICAgICB7UFBDOjpWMzEsIC0xNn0sCisgICAgICB7UFBDOjpWMzAsIC0zMn0sCisgICAgICB7UFBDOjpWMjksIC00OH0sCisgICAgICB7UFBDOjpWMjgsIC02NH0sCisgICAgICB7UFBDOjpWMjcsIC04MH0sCisgICAgICB7UFBDOjpWMjYsIC05Nn0sCisgICAgICB7UFBDOjpWMjUsIC0xMTJ9LAorICAgICAge1BQQzo6VjI0LCAtMTI4fSwKKyAgICAgIHtQUEM6OlYyMywgLTE0NH0sCisgICAgICB7UFBDOjpWMjIsIC0xNjB9LAorICAgICAge1BQQzo6VjIxLCAtMTc2fSwKKyAgICAgIHtQUEM6OlYyMCwgLTE5Mn0KKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IFNwaWxsU2xvdCBPZmZzZXRzNjRbXSA9IHsKKyAgICAgIC8vIEZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIHNhdmUgYXJlYSBvZmZzZXRzLgorICAgICAge1BQQzo6RjMxLCAtOH0sCisgICAgICB7UFBDOjpGMzAsIC0xNn0sCisgICAgICB7UFBDOjpGMjksIC0yNH0sCisgICAgICB7UFBDOjpGMjgsIC0zMn0sCisgICAgICB7UFBDOjpGMjcsIC00MH0sCisgICAgICB7UFBDOjpGMjYsIC00OH0sCisgICAgICB7UFBDOjpGMjUsIC01Nn0sCisgICAgICB7UFBDOjpGMjQsIC02NH0sCisgICAgICB7UFBDOjpGMjMsIC03Mn0sCisgICAgICB7UFBDOjpGMjIsIC04MH0sCisgICAgICB7UFBDOjpGMjEsIC04OH0sCisgICAgICB7UFBDOjpGMjAsIC05Nn0sCisgICAgICB7UFBDOjpGMTksIC0xMDR9LAorICAgICAge1BQQzo6RjE4LCAtMTEyfSwKKyAgICAgIHtQUEM6OkYxNywgLTEyMH0sCisgICAgICB7UFBDOjpGMTYsIC0xMjh9LAorICAgICAge1BQQzo6RjE1LCAtMTM2fSwKKyAgICAgIHtQUEM6OkYxNCwgLTE0NH0sCisKKyAgICAgIC8vIEdlbmVyYWwgcmVnaXN0ZXIgc2F2ZSBhcmVhIG9mZnNldHMuCisgICAgICAvLyBGSVhNRSA2NC1iaXQgU1ZSNDogQXJlIDMyLWJpdCByZWdpc3RlcnMgYWN0dWFsbHkgYWxsb2NhdGVkIGluIDY0LWJpdAorICAgICAgLy8gICAgICAgICAgICAgICAgICAgIG1vZGU/CisgICAgICB7UFBDOjpSMzEsIC00fSwKKyAgICAgIHtQUEM6OlIzMCwgLTEyfSwKKyAgICAgIHtQUEM6OlIyOSwgLTIwfSwKKyAgICAgIHtQUEM6OlIyOCwgLTI4fSwKKyAgICAgIHtQUEM6OlIyNywgLTM2fSwKKyAgICAgIHtQUEM6OlIyNiwgLTQ0fSwKKyAgICAgIHtQUEM6OlIyNSwgLTUyfSwKKyAgICAgIHtQUEM6OlIyNCwgLTYwfSwKKyAgICAgIHtQUEM6OlIyMywgLTY4fSwKKyAgICAgIHtQUEM6OlIyMiwgLTc2fSwKKyAgICAgIHtQUEM6OlIyMSwgLTg0fSwKKyAgICAgIHtQUEM6OlIyMCwgLTkyfSwKKyAgICAgIHtQUEM6OlIxOSwgLTEwMH0sCisgICAgICB7UFBDOjpSMTgsIC0xMDh9LAorICAgICAge1BQQzo6UjE3LCAtMTE2fSwKKyAgICAgIHtQUEM6OlIxNiwgLTEyNH0sCisgICAgICB7UFBDOjpSMTUsIC0xMzJ9LAorICAgICAge1BQQzo6UjE0LCAtMTQwfSwKKworICAgICAge1BQQzo6WDMxLCAtOH0sCisgICAgICB7UFBDOjpYMzAsIC0xNn0sCisgICAgICB7UFBDOjpYMjksIC0yNH0sCisgICAgICB7UFBDOjpYMjgsIC0zMn0sCisgICAgICB7UFBDOjpYMjcsIC00MH0sCisgICAgICB7UFBDOjpYMjYsIC00OH0sCisgICAgICB7UFBDOjpYMjUsIC01Nn0sCisgICAgICB7UFBDOjpYMjQsIC02NH0sCisgICAgICB7UFBDOjpYMjMsIC03Mn0sCisgICAgICB7UFBDOjpYMjIsIC04MH0sCisgICAgICB7UFBDOjpYMjEsIC04OH0sCisgICAgICB7UFBDOjpYMjAsIC05Nn0sCisgICAgICB7UFBDOjpYMTksIC0xMDR9LAorICAgICAge1BQQzo6WDE4LCAtMTEyfSwKKyAgICAgIHtQUEM6OlgxNywgLTEyMH0sCisgICAgICB7UFBDOjpYMTYsIC0xMjh9LAorICAgICAge1BQQzo6WDE1LCAtMTM2fSwKKyAgICAgIHtQUEM6OlgxNCwgLTE0NH0sCisKKyAgICAgIC8vIENSIHNhdmUgYXJlYSBvZmZzZXQuCisgICAgICAvLyBGSVhNRSBTVlI0OiBEaXNhYmxlIENSIHNhdmUgYXJlYSBmb3Igbm93LgorLy8gICAgICB7UFBDOjpDUjIsIC00fSwKKy8vICAgICAge1BQQzo6Q1IzLCAtNH0sCisvLyAgICAgIHtQUEM6OkNSNCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjJMVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjJHVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjJFUSwgLTR9LAorLy8gICAgICB7UFBDOjpDUjJVTiwgLTR9LAorLy8gICAgICB7UFBDOjpDUjNMVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjNHVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjNFUSwgLTR9LAorLy8gICAgICB7UFBDOjpDUjNVTiwgLTR9LAorLy8gICAgICB7UFBDOjpDUjRMVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjRHVCwgLTR9LAorLy8gICAgICB7UFBDOjpDUjRFUSwgLTR9LAorLy8gICAgICB7UFBDOjpDUjRVTiwgLTR9LAorCisgICAgICAvLyBWUlNBVkUgc2F2ZSBhcmVhIG9mZnNldC4KKyAgICAgIHtQUEM6OlZSU0FWRSwgLTR9LAorCisgICAgICAvLyBWZWN0b3IgcmVnaXN0ZXIgc2F2ZSBhcmVhCisgICAgICB7UFBDOjpWMzEsIC0xNn0sCisgICAgICB7UFBDOjpWMzAsIC0zMn0sCisgICAgICB7UFBDOjpWMjksIC00OH0sCisgICAgICB7UFBDOjpWMjgsIC02NH0sCisgICAgICB7UFBDOjpWMjcsIC04MH0sCisgICAgICB7UFBDOjpWMjYsIC05Nn0sCisgICAgICB7UFBDOjpWMjUsIC0xMTJ9LAorICAgICAge1BQQzo6VjI0LCAtMTI4fSwKKyAgICAgIHtQUEM6OlYyMywgLTE0NH0sCisgICAgICB7UFBDOjpWMjIsIC0xNjB9LAorICAgICAge1BQQzo6VjIxLCAtMTc2fSwKKyAgICAgIHtQUEM6OlYyMCwgLTE5Mn0KKyAgICB9OworCisgICAgaWYgKFRNLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkuaXNQUEM2NCgpKSB7CisgICAgICBOdW1FbnRyaWVzID0gYXJyYXlfbGVuZ3Rob2YoT2Zmc2V0czY0KTsKKworICAgICAgcmV0dXJuIE9mZnNldHM2NDsKKyAgICB9IGVsc2UgeworICAgICAgTnVtRW50cmllcyA9IGFycmF5X2xlbmd0aG9mKE9mZnNldHMpOworCisgICAgICByZXR1cm4gT2Zmc2V0czsKKyAgICB9CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0hhemFyZFJlY29nbml6ZXJzLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENIYXphcmRSZWNvZ25pemVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxMWZkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENIYXphcmRSZWNvZ25pemVycy5jcHAKQEAgLTAsMCArMSwzMDYgQEAKKy8vPT09LS0gUFBDSGF6YXJkUmVjb2duaXplcnMuY3BwIC0gUG93ZXJQQyBIYXphcmQgUmVjb2duaXplciBJbXBscyAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgaGF6YXJkIHJlY29nbml6ZXJzIGZvciBzY2hlZHVsaW5nIG9uIFBvd2VyUEMgcHJvY2Vzc29ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInByZS1SQS1zY2hlZCIKKyNpbmNsdWRlICJQUENIYXphcmRSZWNvZ25pemVycy5oIgorI2luY2x1ZGUgIlBQQy5oIgorI2luY2x1ZGUgIlBQQ0luc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZURBRy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBvd2VyUEMgOTcwIEhhemFyZCBSZWNvZ25pemVyCisvLworLy8gVGhpcyBtb2RlbHMgdGhlIGRpc3BhdGNoIGdyb3VwIGZvcm1hdGlvbiBvZiB0aGUgUFBDOTcwIHByb2Nlc3Nvci4gIERpc3BhdGNoCisvLyBncm91cHMgYXJlIGJ1bmRsZXMgb2YgdXAgdG8gZml2ZSBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gY29udGFpbiB2YXJpb3VzIG1peGVzCisvLyBvZiBpbnN0cnVjdGlvbnMuICBUaGUgUFBDOTcwIGNhbiBkaXNwYXRjaCBhIHBlYWsgb2YgNCBub24tYnJhbmNoIGFuZCBvbmUgCisvLyBicmFuY2ggaW5zdHJ1Y3Rpb24gcGVyLWN5Y2xlLgorLy8KKy8vIFRoZXJlIGFyZSBhIG51bWJlciBvZiByZXN0cmljdGlvbnMgdG8gZGlzcGF0Y2ggZ3JvdXAgZm9ybWF0aW9uOiBzb21lCisvLyBpbnN0cnVjdGlvbnMgY2FuIG9ubHkgYmUgaXNzdWVkIGluIHRoZSBmaXJzdCBzbG90IG9mIGEgZGlzcGF0Y2ggZ3JvdXAsICYgc29tZQorLy8gaW5zdHJ1Y3Rpb25zIGZpbGwgYW4gZW50aXJlIGRpc3BhdGNoIGdyb3VwLiAgQWRkaXRpb25hbGx5LCBvbmx5IGJyYW5jaGVzIGNhbgorLy8gaXNzdWUgaW4gdGhlIDV0aCAobGFzdCkgc2xvdC4KKy8vCisvLyBGaW5hbGx5LCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgInN0cnVjdHVyYWwiIGhhemFyZHMgb24gdGhlIFBQQzk3MC4gIFRoZXNlCisvLyBjb25kaXRpb25zIGNhdXNlIGxhcmdlIHBlcmZvcm1hbmNlIHBlbmFsdGllcyBkdWUgdG8gbWlzcHJlZGljdGlvbiwgcmVjb3ZlcnksCisvLyBhbmQgcmVwbGF5IGxvZ2ljIHRoYXQgaGFzIHRvIGhhcHBlbi4gIFRoZXNlIGNhc2VzIGluY2x1ZGUgc2V0dGluZyBhIENUUiBhbmQKKy8vIGJyYW5jaGluZyB0aHJvdWdoIGl0IGluIHRoZSBzYW1lIGRpc3BhdGNoIGdyb3VwLCBhbmQgc3RvcmluZyB0byBhbiBhZGRyZXNzLAorLy8gdGhlbiBsb2FkaW5nIGZyb20gdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gYSBkaXNwYXRjaCBncm91cC4gIFRvIGF2b2lkIHRoZXNlCisvLyBjb25kaXRpb25zLCB3ZSBpbnNlcnQgbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZW4gYXBwcm9wcmlhdGUuCisvLworLy8gRklYTUU6IFRoaXMgaXMgbWlzc2luZyBzb21lIHNpZ25pZmljYW50IGNhc2VzOgorLy8gICAxLiBNb2RlbGluZyBvZiBtaWNyb2NvZGVkIGluc3RydWN0aW9ucy4KKy8vICAgMi4gSGFuZGxpbmcgb2Ygc2VyaWFsaXplZCBvcGVyYXRpb25zLgorLy8gICAzLiBIYW5kbGluZyBvZiB0aGUgZXNvdGVyaWMgY2FzZXMgaW4gIlJlc291cmNlLWJhc2VkIEluc3RydWN0aW9uIEdyb3VwaW5nIi4KKy8vCisKK1BQQ0hhemFyZFJlY29nbml6ZXI5NzA6OlBQQ0hhemFyZFJlY29nbml6ZXI5NzAoY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZ0aWkpCisgIDogVElJKHRpaSkgeworICBFbmREaXNwYXRjaEdyb3VwKCk7Cit9CisKK3ZvaWQgUFBDSGF6YXJkUmVjb2duaXplcjk3MDo6RW5kRGlzcGF0Y2hHcm91cCgpIHsKKyAgREVCVUcoZXJycygpIDw8ICI9PT0gU3RhcnQgb2YgZGlzcGF0Y2ggZ3JvdXBcbiIpOworICBOdW1Jc3N1ZWQgPSAwOworICAKKyAgLy8gU3RydWN0dXJhbCBoYXphcmQgaW5mby4KKyAgSGFzQ1RSU2V0ID0gZmFsc2U7CisgIE51bVN0b3JlcyA9IDA7Cit9CisKKworUFBDSUk6OlBQQzk3MF9Vbml0IAorUFBDSGF6YXJkUmVjb2duaXplcjk3MDo6R2V0SW5zdHJUeXBlKHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc0ZpcnN0LCBib29sICZpc1NpbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc0NyYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNMb2FkLCBib29sICZpc1N0b3JlKSB7CisgIGlmICgoaW50KU9wY29kZSA+PSAwKSB7CisgICAgaXNGaXJzdCA9IGlzU2luZ2xlID0gaXNDcmFja2VkID0gaXNMb2FkID0gaXNTdG9yZSA9IGZhbHNlOworICAgIHJldHVybiBQUENJSTo6UFBDOTcwX1BzZXVkbzsKKyAgfQorICBPcGNvZGUgPSB+T3Bjb2RlOworICAKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBUSUkuZ2V0KE9wY29kZSk7CisgIAorICBpc0xvYWQgID0gVElELm1heUxvYWQoKTsKKyAgaXNTdG9yZSA9IFRJRC5tYXlTdG9yZSgpOworICAKKyAgdWludDY0X3QgVFNGbGFncyA9IFRJRC5UU0ZsYWdzOworICAKKyAgaXNGaXJzdCAgID0gVFNGbGFncyAmIFBQQ0lJOjpQUEM5NzBfRmlyc3Q7CisgIGlzU2luZ2xlICA9IFRTRmxhZ3MgJiBQUENJSTo6UFBDOTcwX1NpbmdsZTsKKyAgaXNDcmFja2VkID0gVFNGbGFncyAmIFBQQ0lJOjpQUEM5NzBfQ3JhY2tlZDsKKyAgcmV0dXJuIChQUENJSTo6UFBDOTcwX1VuaXQpKFRTRmxhZ3MgJiBQUENJSTo6UFBDOTcwX01hc2spOworfQorCisvLy8gaXNMb2FkT2ZTdG9yZWRBZGRyZXNzIC0gSWYgd2UgaGF2ZSBhIGxvYWQgZnJvbSB0aGUgcHJldmlvdXNseSBzdG9yZWQgcG9pbnRlcgorLy8vIGFzIGluZGljYXRlZCBieSBTdG9yZVB0cjEvU3RvcmVQdHIyL1N0b3JlU2l6ZSwgcmV0dXJuIHRydWUuCitib29sIFBQQ0hhemFyZFJlY29nbml6ZXI5NzA6OgoraXNMb2FkT2ZTdG9yZWRBZGRyZXNzKHVuc2lnbmVkIExvYWRTaXplLCBTRFZhbHVlIFB0cjEsIFNEVmFsdWUgUHRyMikgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtU3RvcmVzOyBpICE9IGU7ICsraSkgeworICAgIC8vIEhhbmRsZSBleGFjdCBhbmQgY29tbXV0ZWQgYWRkcmVzc2VzLgorICAgIGlmIChQdHIxID09IFN0b3JlUHRyMVtpXSAmJiBQdHIyID09IFN0b3JlUHRyMltpXSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChQdHIyID09IFN0b3JlUHRyMVtpXSAmJiBQdHIxID09IFN0b3JlUHRyMltpXSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIC8vIE9rYXksIHdlIGRvbid0IGhhdmUgYW4gZXhhY3QgbWF0Y2gsIGlmIHRoaXMgaXMgYW4gaW5kZXhlZCBvZmZzZXQsIHNlZSBpZgorICAgIC8vIHdlIGhhdmUgb3ZlcmxhcCAod2hpY2ggaGFwcGVucyBkdXJpbmcgZnAtPmludCBjb252ZXJzaW9uIGZvciBleGFtcGxlKS4KKyAgICBpZiAoU3RvcmVQdHIyW2ldID09IFB0cjIpIHsKKyAgICAgIGlmIChDb25zdGFudFNETm9kZSAqU3RvcmVPZmZzZXQgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oU3RvcmVQdHIxW2ldKSkKKyAgICAgICAgaWYgKENvbnN0YW50U0ROb2RlICpMb2FkT2Zmc2V0ID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFB0cjEpKSB7CisgICAgICAgICAgLy8gT2theSB0aGUgYmFzZSBwb2ludGVycyBtYXRjaCwgc28gd2UgaGF2ZSBbYzErcl0gdnMgW2MyK3JdLiAgQ2hlY2sKKyAgICAgICAgICAvLyB0byBzZWUgaWYgdGhlIGxvYWQgYW5kIHN0b3JlIGFjdHVhbGx5IG92ZXJsYXAuCisgICAgICAgICAgaW50IFN0b3JlT2ZmcyA9IFN0b3JlT2Zmc2V0LT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICBpbnQgTG9hZE9mZnMgID0gTG9hZE9mZnNldC0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgICAgaWYgKFN0b3JlT2ZmcyA8IExvYWRPZmZzKSB7CisgICAgICAgICAgICBpZiAoaW50KFN0b3JlT2ZmcytTdG9yZVNpemVbaV0pID4gTG9hZE9mZnMpIHJldHVybiB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW50KExvYWRPZmZzK0xvYWRTaXplKSA+IFN0b3JlT2ZmcykgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGdldEhhemFyZFR5cGUgLSBXZSByZXR1cm4gaGF6YXJkIGZvciBhbnkgbm9uLWJyYW5jaCBpbnN0cnVjdGlvbiB0aGF0IHdvdWxkCisvLy8gdGVybWluYXRlIHRoZSBkaXNwYXRjaCBncm91cC4gIFdlIHR1cm4gTm9vcEhhemFyZCBmb3IgYW55CisvLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgd291bGRuJ3QgdGVybWluYXRlIHRoZSBkaXNwYXRjaCBncm91cCB0aGF0IHdvdWxkIGNhdXNlIGEKKy8vLyBwaXBlbGluZSBmbHVzaC4KK1NjaGVkdWxlSGF6YXJkUmVjb2duaXplcjo6SGF6YXJkVHlwZSBQUENIYXphcmRSZWNvZ25pemVyOTcwOjoKK2dldEhhemFyZFR5cGUoU1VuaXQgKlNVKSB7CisgIGNvbnN0IFNETm9kZSAqTm9kZSA9IFNVLT5nZXROb2RlKCktPmdldEZsYWdnZWRNYWNoaW5lTm9kZSgpOworICBib29sIGlzRmlyc3QsIGlzU2luZ2xlLCBpc0NyYWNrZWQsIGlzTG9hZCwgaXNTdG9yZTsKKyAgUFBDSUk6OlBQQzk3MF9Vbml0IEluc3RyVHlwZSA9IAorICAgIEdldEluc3RyVHlwZShOb2RlLT5nZXRPcGNvZGUoKSwgaXNGaXJzdCwgaXNTaW5nbGUsIGlzQ3JhY2tlZCwKKyAgICAgICAgICAgICAgICAgaXNMb2FkLCBpc1N0b3JlKTsKKyAgaWYgKEluc3RyVHlwZSA9PSBQUENJSTo6UFBDOTcwX1BzZXVkbykgcmV0dXJuIE5vSGF6YXJkOyAgCisgIHVuc2lnbmVkIE9wY29kZSA9IE5vZGUtPmdldE1hY2hpbmVPcGNvZGUoKTsKKworICAvLyBXZSBjYW4gb25seSBpc3N1ZSBhIFBQQzk3MF9GaXJzdC9QUEM5NzBfU2luZ2xlIGluc3RydWN0aW9uIChzdWNoIGFzCisgIC8vIGNyYW5kL210c3ByL2V0YykgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY3ljbGUgb2YgdGhlIGRpc3BhdGNoIGdyb3VwLgorICBpZiAoTnVtSXNzdWVkICE9IDAgJiYgKGlzRmlyc3QgfHwgaXNTaW5nbGUpKQorICAgIHJldHVybiBIYXphcmQ7CisgIAorICAvLyBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGNyYWNrZWQgaW50byB0d28gb3BzIGJ5IHRoZSBkZWNvZGVyLCB3ZSBrbm93IHRoYXQKKyAgLy8gaXQgaXMgbm90IGEgYnJhbmNoIGFuZCB0aGF0IGl0IGNhbm5vdCBpc3N1ZSBpZiAzIG90aGVyIGluc3RydWN0aW9ucyBhcmUKKyAgLy8gYWxyZWFkeSBpbiB0aGUgZGlzcGF0Y2ggZ3JvdXAuCisgIGlmIChpc0NyYWNrZWQgJiYgTnVtSXNzdWVkID4gMikKKyAgICByZXR1cm4gSGF6YXJkOworICAgICAgCisgIHN3aXRjaCAoSW5zdHJUeXBlKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW5zdHJ1Y3Rpb24gdHlwZSEiKTsKKyAgY2FzZSBQUENJSTo6UFBDOTcwX0ZYVToKKyAgY2FzZSBQUENJSTo6UFBDOTcwX0xTVToKKyAgY2FzZSBQUENJSTo6UFBDOTcwX0ZQVToKKyAgY2FzZSBQUENJSTo6UFBDOTcwX1ZBTFU6CisgIGNhc2UgUFBDSUk6OlBQQzk3MF9WUEVSTToKKyAgICAvLyBXZSBjYW4gb25seSBpc3N1ZSBhIGJyYW5jaCBhcyB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiBhIGdyb3VwLgorICAgIGlmIChOdW1Jc3N1ZWQgPT0gNCkgcmV0dXJuIEhhemFyZDsKKyAgICBicmVhazsKKyAgY2FzZSBQUENJSTo6UFBDOTcwX0NSVToKKyAgICAvLyBXZSBjYW4gb25seSBpc3N1ZSBhIENSIGluc3RydWN0aW9uIGluIHRoZSBmaXJzdCB0d28gc2xvdHMuCisgICAgaWYgKE51bUlzc3VlZCA+PSAyKSByZXR1cm4gSGF6YXJkOworICAgIGJyZWFrOworICBjYXNlIFBQQ0lJOjpQUEM5NzBfQlJVOgorICAgIGJyZWFrOworICB9CisgIAorICAvLyBEbyBub3QgYWxsb3cgTVRDVFIgYW5kIEJDVFJMIHRvIGJlIGluIHRoZSBzYW1lIGRpc3BhdGNoIGdyb3VwLgorICBpZiAoSGFzQ1RSU2V0ICYmIChPcGNvZGUgPT0gUFBDOjpCQ1RSTF9EYXJ3aW4gfHwgT3Bjb2RlID09IFBQQzo6QkNUUkxfU1ZSNCkpCisgICAgcmV0dXJuIE5vb3BIYXphcmQ7CisgIAorICAvLyBJZiB0aGlzIGlzIGEgbG9hZCBmb2xsb3dpbmcgYSBzdG9yZSwgbWFrZSBzdXJlIGl0J3Mgbm90IHRvIHRoZSBzYW1lIG9yCisgIC8vIG92ZXJsYXBwaW5nIGFkZHJlc3MuCisgIGlmIChpc0xvYWQgJiYgTnVtU3RvcmVzKSB7CisgICAgdW5zaWduZWQgTG9hZFNpemU7CisgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGxvYWQhIik7CisgICAgY2FzZSBQUEM6OkxCWjogICBjYXNlIFBQQzo6TEJaVToKKyAgICBjYXNlIFBQQzo6TEJaWDoKKyAgICBjYXNlIFBQQzo6TEJaODogIGNhc2UgUFBDOjpMQlpVODoKKyAgICBjYXNlIFBQQzo6TEJaWDg6CisgICAgY2FzZSBQUEM6OkxWRUJYOgorICAgICAgTG9hZFNpemUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUEM6OkxIQTogICBjYXNlIFBQQzo6TEhBVToKKyAgICBjYXNlIFBQQzo6TEhBWDoKKyAgICBjYXNlIFBQQzo6TEhaOiAgIGNhc2UgUFBDOjpMSFpVOgorICAgIGNhc2UgUFBDOjpMSFpYOgorICAgIGNhc2UgUFBDOjpMVkVIWDoKKyAgICBjYXNlIFBQQzo6TEhCUlg6CisgICAgY2FzZSBQUEM6OkxIQTg6ICAgY2FzZSBQUEM6OkxIQVU4OgorICAgIGNhc2UgUFBDOjpMSEFYODoKKyAgICBjYXNlIFBQQzo6TEhaODogICBjYXNlIFBQQzo6TEhaVTg6CisgICAgY2FzZSBQUEM6OkxIWlg4OgorICAgICAgTG9hZFNpemUgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUEM6OkxGUzogICAgY2FzZSBQUEM6OkxGU1U6CisgICAgY2FzZSBQUEM6OkxGU1g6CisgICAgY2FzZSBQUEM6OkxXWjogICAgY2FzZSBQUEM6OkxXWlU6CisgICAgY2FzZSBQUEM6OkxXWlg6CisgICAgY2FzZSBQUEM6OkxXQToKKyAgICBjYXNlIFBQQzo6TFdBWDoKKyAgICBjYXNlIFBQQzo6TFZFV1g6CisgICAgY2FzZSBQUEM6OkxXQlJYOgorICAgIGNhc2UgUFBDOjpMV1o4OgorICAgIGNhc2UgUFBDOjpMV1pYODoKKyAgICAgIExvYWRTaXplID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBDOjpMRkQ6ICAgIGNhc2UgUFBDOjpMRkRVOgorICAgIGNhc2UgUFBDOjpMRkRYOgorICAgIGNhc2UgUFBDOjpMRDogICAgIGNhc2UgUFBDOjpMRFU6CisgICAgY2FzZSBQUEM6OkxEWDoKKyAgICAgIExvYWRTaXplID0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBDOjpMVlg6CisgICAgY2FzZSBQUEM6OkxWWEw6CisgICAgICBMb2FkU2l6ZSA9IDE2OworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlmIChpc0xvYWRPZlN0b3JlZEFkZHJlc3MoTG9hZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0T3BlcmFuZCgwKSwgTm9kZS0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICByZXR1cm4gTm9vcEhhemFyZDsKKyAgfQorICAKKyAgcmV0dXJuIE5vSGF6YXJkOworfQorCit2b2lkIFBQQ0hhemFyZFJlY29nbml6ZXI5NzA6OkVtaXRJbnN0cnVjdGlvbihTVW5pdCAqU1UpIHsKKyAgY29uc3QgU0ROb2RlICpOb2RlID0gU1UtPmdldE5vZGUoKS0+Z2V0RmxhZ2dlZE1hY2hpbmVOb2RlKCk7CisgIGJvb2wgaXNGaXJzdCwgaXNTaW5nbGUsIGlzQ3JhY2tlZCwgaXNMb2FkLCBpc1N0b3JlOworICBQUENJSTo6UFBDOTcwX1VuaXQgSW5zdHJUeXBlID0gCisgICAgR2V0SW5zdHJUeXBlKE5vZGUtPmdldE9wY29kZSgpLCBpc0ZpcnN0LCBpc1NpbmdsZSwgaXNDcmFja2VkLAorICAgICAgICAgICAgICAgICBpc0xvYWQsIGlzU3RvcmUpOworICBpZiAoSW5zdHJUeXBlID09IFBQQ0lJOjpQUEM5NzBfUHNldWRvKSByZXR1cm47ICAKKyAgdW5zaWduZWQgT3Bjb2RlID0gTm9kZS0+Z2V0TWFjaGluZU9wY29kZSgpOworCisgIC8vIFVwZGF0ZSBzdHJ1Y3R1cmFsIGhhemFyZCBpbmZvcm1hdGlvbi4KKyAgaWYgKE9wY29kZSA9PSBQUEM6Ok1UQ1RSKSBIYXNDVFJTZXQgPSB0cnVlOworICAKKyAgLy8gVHJhY2sgdGhlIGFkZHJlc3Mgc3RvcmVkIHRvLgorICBpZiAoaXNTdG9yZSkgeworICAgIHVuc2lnbmVkIFRoaXNTdG9yZVNpemU7CisgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHN0b3JlIGluc3RydWN0aW9uISIpOworICAgIGNhc2UgUFBDOjpTVEI6ICAgIGNhc2UgUFBDOjpTVEI4OgorICAgIGNhc2UgUFBDOjpTVEJVOiAgIGNhc2UgUFBDOjpTVEJVODoKKyAgICBjYXNlIFBQQzo6U1RCWDogICBjYXNlIFBQQzo6U1RCWDg6CisgICAgY2FzZSBQUEM6OlNUVkVCWDoKKyAgICAgIFRoaXNTdG9yZVNpemUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUEM6OlNUSDogICAgY2FzZSBQUEM6OlNUSDg6CisgICAgY2FzZSBQUEM6OlNUSFU6ICAgY2FzZSBQUEM6OlNUSFU4OgorICAgIGNhc2UgUFBDOjpTVEhYOiAgIGNhc2UgUFBDOjpTVEhYODoKKyAgICBjYXNlIFBQQzo6U1RWRUhYOgorICAgIGNhc2UgUFBDOjpTVEhCUlg6CisgICAgICBUaGlzU3RvcmVTaXplID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBDOjpTVEZTOgorICAgIGNhc2UgUFBDOjpTVEZTVToKKyAgICBjYXNlIFBQQzo6U1RGU1g6CisgICAgY2FzZSBQUEM6OlNUV1g6ICAgY2FzZSBQUEM6OlNUV1g4OgorICAgIGNhc2UgUFBDOjpTVFdVWDoKKyAgICBjYXNlIFBQQzo6U1RXOiAgICBjYXNlIFBQQzo6U1RXODoKKyAgICBjYXNlIFBQQzo6U1RXVToKKyAgICBjYXNlIFBQQzo6U1RWRVdYOgorICAgIGNhc2UgUFBDOjpTVEZJV1g6CisgICAgY2FzZSBQUEM6OlNUV0JSWDoKKyAgICAgIFRoaXNTdG9yZVNpemUgPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUEM6OlNURF8zMjoKKyAgICBjYXNlIFBQQzo6U1REWF8zMjoKKyAgICBjYXNlIFBQQzo6U1REOgorICAgIGNhc2UgUFBDOjpTVERVOgorICAgIGNhc2UgUFBDOjpTVEZEOgorICAgIGNhc2UgUFBDOjpTVEZEWDoKKyAgICBjYXNlIFBQQzo6U1REWDoKKyAgICBjYXNlIFBQQzo6U1REVVg6CisgICAgICBUaGlzU3RvcmVTaXplID0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBDOjpTVFZYOgorICAgIGNhc2UgUFBDOjpTVFZYTDoKKyAgICAgIFRoaXNTdG9yZVNpemUgPSAxNjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBTdG9yZVNpemVbTnVtU3RvcmVzXSA9IFRoaXNTdG9yZVNpemU7CisgICAgU3RvcmVQdHIxW051bVN0b3Jlc10gPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworICAgIFN0b3JlUHRyMltOdW1TdG9yZXNdID0gTm9kZS0+Z2V0T3BlcmFuZCgyKTsKKyAgICArK051bVN0b3JlczsKKyAgfQorICAKKyAgaWYgKEluc3RyVHlwZSA9PSBQUENJSTo6UFBDOTcwX0JSVSB8fCBpc1NpbmdsZSkKKyAgICBOdW1Jc3N1ZWQgPSA0OyAgLy8gVGVybWluYXRlIGEgZC1ncm91cC4KKyAgKytOdW1Jc3N1ZWQ7CisgIAorICAvLyBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGNyYWNrZWQgaW50byB0d28gb3BzIGJ5IHRoZSBkZWNvZGVyLCByZW1lbWJlciB0aGF0CisgIC8vIHdlIGlzc3VlZCB0d28gcGllY2VzLgorICBpZiAoaXNDcmFja2VkKQorICAgICsrTnVtSXNzdWVkOworICAKKyAgaWYgKE51bUlzc3VlZCA9PSA1KQorICAgIEVuZERpc3BhdGNoR3JvdXAoKTsKK30KKwordm9pZCBQUENIYXphcmRSZWNvZ25pemVyOTcwOjpBZHZhbmNlQ3ljbGUoKSB7CisgIGFzc2VydChOdW1Jc3N1ZWQgPCA1ICYmICJJbGxlZ2FsIGRpc3BhdGNoIGdyb3VwISIpOworICArK051bUlzc3VlZDsKKyAgaWYgKE51bUlzc3VlZCA9PSA1KQorICAgIEVuZERpc3BhdGNoR3JvdXAoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENIYXphcmRSZWNvZ25pemVycy5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0hhemFyZFJlY29nbml6ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiZjhlNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENIYXphcmRSZWNvZ25pemVycy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vPT09LS0gUFBDSGF6YXJkUmVjb2duaXplcnMuaCAtIFBvd2VyUEMgSGF6YXJkIFJlY29nbml6ZXJzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgaGF6YXJkIHJlY29nbml6ZXJzIGZvciBzY2hlZHVsaW5nIG9uIFBvd2VyUEMgcHJvY2Vzc29ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFBQQ0hBWlJFQ1NfSAorI2RlZmluZSBQUENIQVpSRUNTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHTm9kZXMuaCIKKyNpbmNsdWRlICJQUENJbnN0ckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICAKKy8vLyBQUENIYXphcmRSZWNvZ25pemVyOTcwIC0gVGhpcyBjbGFzcyBkZWZpbmVzIGEgZmluaXRlIHN0YXRlIGF1dG9tYXRhIHRoYXQKKy8vLyBtb2RlbHMgdGhlIGRpc3BhdGNoIGxvZ2ljIG9uIHRoZSBQb3dlclBDIDk3MCAoYWthIEc1KSBwcm9jZXNzb3IuICBUaGlzCisvLy8gcHJvbW90ZXMgZ29vZCBkaXNwYXRjaCBncm91cCBmb3JtYXRpb24gYW5kIGltcGxlbWVudHMgbm9vcCBpbnNlcnRpb24gdG8KKy8vLyBhdm9pZCBzdHJ1Y3R1cmFsIGhhemFyZHMgdGhhdCBjYXVzZSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwZW5hbHRpZXMgKGUuZy4KKy8vLyBzZXR0aW5nIHRoZSBDVFIgcmVnaXN0ZXIgdGhlbiBicmFuY2hpbmcgdGhyb3VnaCBpdCB3aXRoaW4gYSBkaXNwYXRjaCBncm91cCksCisvLy8gb3Igc3RvcmluZyB0aGVuIGxvYWRpbmcgZnJvbSB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiBhIGRpc3BhdGNoIGdyb3VwLgorY2xhc3MgUFBDSGF6YXJkUmVjb2duaXplcjk3MCA6IHB1YmxpYyBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgeworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSTsKKyAgCisgIHVuc2lnbmVkIE51bUlzc3VlZDsgIC8vIE51bWJlciBvZiBpbnN0cyBpc3N1ZWQsIGluY2x1ZGluZyBhZHZhbmNlZCBjeWNsZXMuCisgIAorICAvLyBWYXJpb3VzIHRoaW5ncyB0aGF0IGNhbiBjYXVzZSBhIHN0cnVjdHVyYWwgaGF6YXJkLgorICAKKyAgLy8gSGFzQ1RSU2V0IC0gSWYgdGhlIENUUiByZWdpc3RlciBpcyBzZXQgaW4gdGhpcyBncm91cCwgZGlzYWxsb3cgQkNUUkwuCisgIGJvb2wgSGFzQ1RSU2V0OworICAKKyAgLy8gU3RvcmVkUHRyIC0gS2VlcCB0cmFjayBvZiB0aGUgYWRkcmVzcyBvZiBhbnkgc3RvcmUuICBJZiB3ZSBzZWUgYSBsb2FkIGZyb20KKyAgLy8gdGhlIHNhbWUgYWRkcmVzcyAob3Igb25lIHRoYXQgYWxpYXNlcyBpdCksIGRpc2FsbG93IHRoZSBzdG9yZS4gIFdlIGNhbiBoYXZlCisgIC8vIHVwIHRvIGZvdXIgc3RvcmVzIGluIG9uZSBkaXNwYXRjaCBncm91cCwgaGVuY2Ugd2UgdHJhY2sgdXAgdG8gNC4KKyAgLy8KKyAgLy8gVGhpcyBpcyBudWxsIGlmIHdlIGhhdmVuJ3Qgc2VlbiBhIHN0b3JlIHlldC4gIFdlIGtlZXAgdHJhY2sgb2YgYm90aAorICAvLyBvcGVyYW5kcyBvZiB0aGUgc3RvcmUgaGVyZSwgc2luY2Ugd2Ugc3VwcG9ydCBbcityXSBhbmQgW3IraV0gYWRkcmVzc2luZy4KKyAgU0RWYWx1ZSBTdG9yZVB0cjFbNF0sIFN0b3JlUHRyMls0XTsKKyAgdW5zaWduZWQgIFN0b3JlU2l6ZVs0XTsKKyAgdW5zaWduZWQgTnVtU3RvcmVzOworICAKK3B1YmxpYzoKKyAgUFBDSGF6YXJkUmVjb2duaXplcjk3MChjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSk7CisgIHZpcnR1YWwgSGF6YXJkVHlwZSBnZXRIYXphcmRUeXBlKFNVbml0ICpTVSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oU1VuaXQgKlNVKTsKKyAgdmlydHVhbCB2b2lkIEFkdmFuY2VDeWNsZSgpOworICAKK3ByaXZhdGU6CisgIC8vLyBFbmREaXNwYXRjaEdyb3VwIC0gQ2FsbGVkIHdoZW4gd2UgYXJlIGZpbmlzaGluZyBhIG5ldyBkaXNwYXRjaCBncm91cC4KKyAgLy8vCisgIHZvaWQgRW5kRGlzcGF0Y2hHcm91cCgpOworICAKKyAgLy8vIEdldEluc3RyVHlwZSAtIENsYXNzaWZ5IHRoZSBzcGVjaWZpZWQgcG93ZXJwYyBvcGNvZGUgYWNjb3JkaW5nIHRvIGl0cworICAvLy8gcGlwZWxpbmUuCisgIFBQQ0lJOjpQUEM5NzBfVW5pdCBHZXRJbnN0clR5cGUodW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzRmlyc3QsIGJvb2wgJmlzU2luZ2xlLGJvb2wgJmlzQ3JhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc0xvYWQsIGJvb2wgJmlzU3RvcmUpOworICAKKyAgYm9vbCBpc0xvYWRPZlN0b3JlZEFkZHJlc3ModW5zaWduZWQgTG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyMSwgU0RWYWx1ZSBQdHIyKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSVNlbERBR1RvREFHLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJU2VsREFHVG9EQUcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWViYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSVNlbERBR1RvREFHLmNwcApAQCAtMCwwICsxLDEwOTMgQEAKKy8vPT09LS0gUFBDSVNlbERBR1RvREFHLmNwcCAtIFBQQyAtLXBhdHRlcm4gbWF0Y2hpbmcgaW5zdCBzZWxlY3RvciAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBwYXR0ZXJuIG1hdGNoaW5nIGluc3RydWN0aW9uIHNlbGVjdG9yIGZvciBQb3dlclBDLAorLy8gY29udmVydGluZyBmcm9tIGEgbGVnYWxpemVkIGRhZyB0byBhIFBQQyBkYWcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwcGMtY29kZWdlbiIKKyNpbmNsdWRlICJQUEMuaCIKKyNpbmNsdWRlICJQUENQcmVkaWNhdGVzLmgiCisjaW5jbHVkZSAiUFBDVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlBQQ0hhemFyZFJlY29nbml6ZXJzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbkFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFBQQ0RBR1RvREFHSVNlbCAtIFBQQyBzcGVjaWZpYyBjb2RlIHRvIHNlbGVjdCBQUEMgbWFjaGluZQorICAvLy8gaW5zdHJ1Y3Rpb25zIGZvciBTZWxlY3Rpb25EQUcgb3BlcmF0aW9ucy4KKyAgLy8vCisgIGNsYXNzIFBQQ0RBR1RvREFHSVNlbCA6IHB1YmxpYyBTZWxlY3Rpb25EQUdJU2VsIHsKKyAgICBjb25zdCBQUENUYXJnZXRNYWNoaW5lICZUTTsKKyAgICBjb25zdCBQUENUYXJnZXRMb3dlcmluZyAmUFBDTG93ZXJpbmc7CisgICAgY29uc3QgUFBDU3VidGFyZ2V0ICZQUENTdWJUYXJnZXQ7CisgICAgdW5zaWduZWQgR2xvYmFsQmFzZVJlZzsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFBQQ0RBR1RvREFHSVNlbChQUENUYXJnZXRNYWNoaW5lICZ0bSkKKyAgICAgIDogU2VsZWN0aW9uREFHSVNlbCh0bSksIFRNKHRtKSwKKyAgICAgICAgUFBDTG93ZXJpbmcoKlRNLmdldFRhcmdldExvd2VyaW5nKCkpLAorICAgICAgICBQUENTdWJUYXJnZXQoKlRNLmdldFN1YnRhcmdldEltcGwoKSkge30KKyAgICAKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIHJlLWVtaXQgYSBzZXQgb2YgdGhlIGdsb2JhbCBiYXNlIHJlZyBpZiBuZWNlc3NhcnkKKyAgICAgIEdsb2JhbEJhc2VSZWcgPSAwOworICAgICAgU2VsZWN0aW9uREFHSVNlbDo6cnVuT25NYWNoaW5lRnVuY3Rpb24oTUYpOworICAgICAgCisgICAgICBJbnNlcnRWUlNhdmVDb2RlKE1GKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgIAorICAgIC8vLyBnZXRJMzJJbW0gLSBSZXR1cm4gYSB0YXJnZXQgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLCBvZiB0eXBlCisgICAgLy8vIGkzMi4KKyAgICBpbmxpbmUgU0RWYWx1ZSBnZXRJMzJJbW0odW5zaWduZWQgSW1tKSB7CisgICAgICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChJbW0sIE1WVDo6aTMyKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0STY0SW1tIC0gUmV0dXJuIGEgdGFyZ2V0IGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSwgb2YgdHlwZQorICAgIC8vLyBpNjQuCisgICAgaW5saW5lIFNEVmFsdWUgZ2V0STY0SW1tKHVpbnQ2NF90IEltbSkgeworICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoSW1tLCBNVlQ6Omk2NCk7CisgICAgfQorICAgIAorICAgIC8vLyBnZXRTbWFsbElQdHJJbW0gLSBSZXR1cm4gYSB0YXJnZXQgY29uc3RhbnQgb2YgcG9pbnRlciB0eXBlLgorICAgIGlubGluZSBTRFZhbHVlIGdldFNtYWxsSVB0ckltbSh1bnNpZ25lZCBJbW0pIHsKKyAgICAgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEltbSwgUFBDTG93ZXJpbmcuZ2V0UG9pbnRlclR5KCkpOworICAgIH0KKyAgICAKKyAgICAvLy8gaXNSdW5PZk9uZXMgLSBSZXR1cm5zIHRydWUgaWZmIFZhbCBjb25zaXN0cyBvZiBvbmUgY29udGlndW91cyBydW4gb2YgMXMgCisgICAgLy8vIHdpdGggYW55IG51bWJlciBvZiAwcyBvbiBlaXRoZXIgc2lkZS4gIFRoZSAxcyBhcmUgYWxsb3dlZCB0byB3cmFwIGZyb20KKyAgICAvLy8gTFNCIHRvIE1TQiwgc28gMHgwMDBGRkYwLCAweDAwMDBGRkZGLCBhbmQgMHhGRjAwMDBGRiBhcmUgYWxsIHJ1bnMuCisgICAgLy8vIDB4MEYwRjAwMDAgaXMgbm90LCBzaW5jZSBhbGwgMXMgYXJlIG5vdCBjb250aWd1b3VzLgorICAgIHN0YXRpYyBib29sIGlzUnVuT2ZPbmVzKHVuc2lnbmVkIFZhbCwgdW5zaWduZWQgJk1CLCB1bnNpZ25lZCAmTUUpOworCisKKyAgICAvLy8gaXNSb3RhdGVBbmRNYXNrIC0gUmV0dXJucyB0cnVlIGlmIE1hc2sgYW5kIFNoaWZ0IGNhbiBiZSBmb2xkZWQgaW50byBhCisgICAgLy8vIHJvdGF0ZSBhbmQgbWFzayBvcGNvZGUgYW5kIG1hc2sgb3BlcmF0aW9uLgorICAgIHN0YXRpYyBib29sIGlzUm90YXRlQW5kTWFzayhTRE5vZGUgKk4sIHVuc2lnbmVkIE1hc2ssIGJvb2wgaXNTaGlmdE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTSCwgdW5zaWduZWQgJk1CLCB1bnNpZ25lZCAmTUUpOworICAgIAorICAgIC8vLyBnZXRHbG9iYWxCYXNlUmVnIC0gaW5zZXJ0IGNvZGUgaW50byB0aGUgZW50cnkgbWJiIHRvIG1hdGVyaWFsaXplIHRoZSBQSUMKKyAgICAvLy8gYmFzZSByZWdpc3Rlci4gIFJldHVybiB0aGUgdmlydHVhbCByZWdpc3RlciB0aGF0IGhvbGRzIHRoaXMgdmFsdWUuCisgICAgU0ROb2RlICpnZXRHbG9iYWxCYXNlUmVnKCk7CisgICAgCisgICAgLy8gU2VsZWN0IC0gQ29udmVydCB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgZnJvbSBhIHRhcmdldC1pbmRlcGVuZGVudCB0byBhCisgICAgLy8gdGFyZ2V0LXNwZWNpZmljIG5vZGUgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBjaGFuZ2VkLgorICAgIFNETm9kZSAqU2VsZWN0KFNETm9kZSAqTik7CisgICAgCisgICAgU0ROb2RlICpTZWxlY3RCaXRmaWVsZEluc2VydChTRE5vZGUgKk4pOworCisgICAgLy8vIFNlbGVjdENDIC0gU2VsZWN0IGEgY29tcGFyaXNvbiBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcyB3aXRoIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgY29uZGl0aW9uIGNvZGUsIHJldHVybmluZyB0aGUgQ1IjIG9mIHRoZSBleHByZXNzaW9uLgorICAgIFNEVmFsdWUgU2VsZWN0Q0MoU0RWYWx1ZSBMSFMsIFNEVmFsdWUgUkhTLCBJU0Q6OkNvbmRDb2RlIENDLCBEZWJ1Z0xvYyBkbCk7CisKKyAgICAvLy8gU2VsZWN0QWRkckltbSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBOIGNhbiBiZSByZXByZXNlbnRlZCBieQorICAgIC8vLyBhIGJhc2UgcmVnaXN0ZXIgcGx1cyBhIHNpZ25lZCAxNi1iaXQgZGlzcGxhY2VtZW50IFtyK2ltbV0uCisgICAgYm9vbCBTZWxlY3RBZGRySW1tKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmRGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSkgeworICAgICAgcmV0dXJuIFBQQ0xvd2VyaW5nLlNlbGVjdEFkZHJlc3NSZWdJbW0oTiwgRGlzcCwgQmFzZSwgKkN1ckRBRyk7CisgICAgfQorICAgIAorICAgIC8vLyBTZWxlY3RBZGRySW1tT2ZmcyAtIFJldHVybiB0cnVlIGlmIHRoZSBvcGVyYW5kIGlzIHZhbGlkIGZvciBhIHByZWluYworICAgIC8vLyBpbW1lZGlhdGUgZmllbGQuICBCZWNhdXNlIHByZWluYyBpbW1zIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCwganVzdAorICAgIC8vLyBhY2NlcHQgaXQuCisgICAgYm9vbCBTZWxlY3RBZGRySW1tT2ZmcyhTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJk91dCkgY29uc3QgeworICAgICAgT3V0ID0gTjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAgIAorICAgIC8vLyBTZWxlY3RBZGRySWR4IC0gR2l2ZW4gdGhlIHNwZWNpZmllZCBhZGRyZXNzZWQsIGNoZWNrIHRvIHNlZSBpZiBpdCBjYW4gYmUKKyAgICAvLy8gcmVwcmVzZW50ZWQgYXMgYW4gaW5kZXhlZCBbcityXSBvcGVyYXRpb24uICBSZXR1cm5zIGZhbHNlIGlmIGl0IGNhbgorICAgIC8vLyBiZSByZXByZXNlbnRlZCBieSBbcitpbW1dLCB3aGljaCBhcmUgcHJlZmVycmVkLgorICAgIGJvb2wgU2VsZWN0QWRkcklkeChTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkluZGV4KSB7CisgICAgICByZXR1cm4gUFBDTG93ZXJpbmcuU2VsZWN0QWRkcmVzc1JlZ1JlZyhOLCBCYXNlLCBJbmRleCwgKkN1ckRBRyk7CisgICAgfQorICAgIAorICAgIC8vLyBTZWxlY3RBZGRySWR4T25seSAtIEdpdmVuIHRoZSBzcGVjaWZpZWQgYWRkcmVzc2VkLCBmb3JjZSBpdCB0byBiZQorICAgIC8vLyByZXByZXNlbnRlZCBhcyBhbiBpbmRleGVkIFtyK3JdIG9wZXJhdGlvbi4KKyAgICBib29sIFNlbGVjdEFkZHJJZHhPbmx5KFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkluZGV4KSB7CisgICAgICByZXR1cm4gUFBDTG93ZXJpbmcuU2VsZWN0QWRkcmVzc1JlZ1JlZ09ubHkoTiwgQmFzZSwgSW5kZXgsICpDdXJEQUcpOworICAgIH0KKworICAgIC8vLyBTZWxlY3RBZGRySW1tU2hpZnQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgTiBjYW4gYmUgcmVwcmVzZW50ZWQgYnkKKyAgICAvLy8gYSBiYXNlIHJlZ2lzdGVyIHBsdXMgYSBzaWduZWQgMTQtYml0IGRpc3BsYWNlbWVudCBbcitpbW0qNF0uICBTdWl0YWJsZQorICAgIC8vLyBmb3IgdXNlIGJ5IFNURCBhbmQgZnJpZW5kcy4KKyAgICBib29sIFNlbGVjdEFkZHJJbW1TaGlmdChTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSkgeworICAgICAgcmV0dXJuIFBQQ0xvd2VyaW5nLlNlbGVjdEFkZHJlc3NSZWdJbW1TaGlmdChOLCBEaXNwLCBCYXNlLCAqQ3VyREFHKTsKKyAgICB9CisgICAgICAKKyAgICAvLy8gU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZCAtIEltcGxlbWVudCBhZGRyZXNzaW5nIG1vZGUgc2VsZWN0aW9uIGZvcgorICAgIC8vLyBpbmxpbmUgYXNtIGV4cHJlc3Npb25zLiAgSXQgaXMgYWx3YXlzIGNvcnJlY3QgdG8gY29tcHV0ZSB0aGUgdmFsdWUgaW50bworICAgIC8vLyBhIHJlZ2lzdGVyLiAgVGhlIGNhc2Ugb2YgYWRkaW5nIGEgKHBvc3NpYmx5IHJlbG9jYXRhYmxlKSBjb25zdGFudCB0byBhCisgICAgLy8vIHJlZ2lzdGVyIGNhbiBiZSBpbXByb3ZlZCwgYnV0IGl0IGlzIHdyb25nIHRvIHN1YnN0aXR1dGUgUmVnK1JlZyBmb3IKKyAgICAvLy8gUmVnIGluIGFuIGFzbSwgYmVjYXVzZSB0aGUgbG9hZCBvciBzdG9yZSBvcGNvZGUgd291bGQgaGF2ZSB0byBjaGFuZ2UuCisgICB2aXJ0dWFsIGJvb2wgU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChjb25zdCBTRFZhbHVlICZPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbnN0cmFpbnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPdXRPcHMpIHsKKyAgICAgIE91dE9wcy5wdXNoX2JhY2soT3ApOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBTRFZhbHVlIEJ1aWxkU0RJVlNlcXVlbmNlKFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSBCdWlsZFVESVZTZXF1ZW5jZShTRE5vZGUgKk4pOworICAgIAorICAgIHZvaWQgSW5zZXJ0VlJTYXZlQ29kZShNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIlBvd2VyUEMgREFHLT5EQUcgUGF0dGVybiBJbnN0cnVjdGlvbiBTZWxlY3Rpb24iOworICAgIH0gCisgICAgCisgICAgLy8vIENyZWF0ZVRhcmdldEhhemFyZFJlY29nbml6ZXIgLSBSZXR1cm4gdGhlIGhhemFyZCByZWNvZ25pemVyIHRvIHVzZSBmb3IKKyAgICAvLy8gdGhpcyB0YXJnZXQgd2hlbiBzY2hlZHVsaW5nIHRoZSBEQUcuCisgICAgdmlydHVhbCBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgKkNyZWF0ZVRhcmdldEhhemFyZFJlY29nbml6ZXIoKSB7CisgICAgICAvLyBTaG91bGQgdXNlIHN1YnRhcmdldCBpbmZvIHRvIHBpY2sgdGhlIHJpZ2h0IGhhemFyZCByZWNvZ25pemVyLiAgRm9yCisgICAgICAvLyBub3csIGFsd2F5cyByZXR1cm4gYSBQUEM5NzAgcmVjb2duaXplci4KKyAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqSUkgPSBUTS5nZXRJbnN0ckluZm8oKTsKKyAgICAgIGFzc2VydChJSSAmJiAiTm8gSW5zdHJJbmZvPyIpOworICAgICAgcmV0dXJuIG5ldyBQUENIYXphcmRSZWNvZ25pemVyOTcwKCpJSSk7IAorICAgIH0KKworLy8gSW5jbHVkZSB0aGUgcGllY2VzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0aW9uLgorI2luY2x1ZGUgIlBQQ0dlbkRBR0lTZWwuaW5jIgorICAgIAorcHJpdmF0ZToKKyAgICBTRE5vZGUgKlNlbGVjdFNFVENDKFNETm9kZSAqTik7CisgIH07Cit9CisKKy8vLyBJbnNlcnRWUlNhdmVDb2RlIC0gT25jZSB0aGUgZW50aXJlIGZ1bmN0aW9uIGhhcyBiZWVuIGluc3RydWN0aW9uIHNlbGVjdGVkLAorLy8vIGFsbCB2aXJ0dWFsIHJlZ2lzdGVycyBhcmUgY3JlYXRlZCBhbmQgYWxsIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGFyZSBidWlsdCwKKy8vLyBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBzYXZlL3Jlc3RvcmUgVlJTQVZFLiAgSWYgc28sIGRvIGl0Lgordm9pZCBQUENEQUdUb0RBR0lTZWw6Okluc2VydFZSU2F2ZUNvZGUoTWFjaGluZUZ1bmN0aW9uICZGbikgeworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmdW5jdGlvbiB1c2VzIHZlY3RvciByZWdpc3RlcnMsIHdoaWNoIG1lYW5zIHdlIGhhdmUgdG8KKyAgLy8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgVlJTQVZFIHJlZ2lzdGVyIGFuZCB1cGRhdGUgaXQgd2l0aCB0aGUgcmVncyB3ZSB1c2UuICAKKyAgLy8KKyAgLy8gSW4gdGhpcyBjYXNlLCB0aGVyZSB3aWxsIGJlIHZpcnR1YWwgcmVnaXN0ZXJzIG9mIHZlY3RvciB0eXBlIGNyZWF0ZWQKKyAgLy8gYnkgdGhlIHNjaGVkdWxlci4gIERldGVjdCB0aGVtIG5vdy4KKyAgYm9vbCBIYXNWZWN0b3JWUmVnID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IFRhcmdldFJlZ2lzdGVySW5mbzo6Rmlyc3RWaXJ0dWFsUmVnaXN0ZXIsIAorICAgICAgIGUgPSBSZWdJbmZvLT5nZXRMYXN0VmlydFJlZygpKzE7IGkgIT0gZTsgKytpKQorICAgIGlmIChSZWdJbmZvLT5nZXRSZWdDbGFzcyhpKSA9PSAmUFBDOjpWUlJDUmVnQ2xhc3MpIHsKKyAgICAgIEhhc1ZlY3RvclZSZWcgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICBpZiAoIUhhc1ZlY3RvclZSZWcpIHJldHVybjsgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAKKyAgLy8gSWYgd2UgaGF2ZSBhIHZlY3RvciByZWdpc3Rlciwgd2Ugd2FudCB0byBlbWl0IGNvZGUgaW50byB0aGUgZW50cnkgYW5kIGV4aXQKKyAgLy8gYmxvY2tzIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIFZSU0FWRSByZWdpc3Rlci4gIFdlIGRvIHRoaXMgaGVyZSAoaW5zdGVhZAorICAvLyBvZiBtYXJraW5nIGFsbCB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIGFzIGNsb2JiZXJpbmcgVlJTQVZFKSBmb3IgdHdvIHJlYXNvbnM6CisgIC8vCisgIC8vIDEuIFRoaXMgKHRyaXZpYWxseSkgcmVkdWNlcyB0aGUgbG9hZCBvbiB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yLCBieSBub3QKKyAgLy8gICAgaGF2aW5nIHRvIHJlcHJlc2VudCB0aGUgbGl2ZSByYW5nZSBvZiB0aGUgVlJTQVZFIHJlZ2lzdGVyLgorICAvLyAyLiBUaGlzIChtb3JlIHNpZ25pZmljYW50bHkpIGFsbG93cyB1cyB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgdmlydHVhbAorICAvLyAgICByZWdpc3RlciB0byBob2xkIHRoZSBzYXZlZCBWUlNBVkUgdmFsdWUsIGFsbG93aW5nIHRoaXMgdGVtcG9yYXJ5IHRvIGJlCisgIC8vICAgIHJlZ2lzdGVyIGFsbG9jYXRlZCwgaW5zdGVhZCBvZiBmb3JjaW5nIGl0IHRvIGJlIHNwaWxsZWQgdG8gdGhlIHN0YWNrLgorCisgIC8vIENyZWF0ZSB0d28gdnJlZ3MgLSBvbmUgdG8gaG9sZCB0aGUgVlJTQVZFIHJlZ2lzdGVyIHRoYXQgaXMgbGl2ZS1pbiB0byB0aGUKKyAgLy8gZnVuY3Rpb24gYW5kIG9uZSBmb3IgdGhlIHZhbHVlIGFmdGVyIGhhdmluZyBiaXRzIG9yJ2QgaW50byBpdC4KKyAgdW5zaWduZWQgSW5WUlNBVkUgPSBSZWdJbmZvLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoJlBQQzo6R1BSQ1JlZ0NsYXNzKTsKKyAgdW5zaWduZWQgVXBkYXRlZFZSU0FWRSA9IFJlZ0luZm8tPmNyZWF0ZVZpcnR1YWxSZWdpc3RlcigmUFBDOjpHUFJDUmVnQ2xhc3MpOworICAKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkgPSAqVE0uZ2V0SW5zdHJJbmZvKCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICZFbnRyeUJCID0gKkZuLmJlZ2luKCk7CisgIERlYnVnTG9jIGRsOworICAvLyBFbWl0IHRoZSBmb2xsb3dpbmcgY29kZSBpbnRvIHRoZSBlbnRyeSBibG9jazoKKyAgLy8gSW5WUlNBVkUgPSBNRlZSU0FWRQorICAvLyBVcGRhdGVkVlJTQVZFID0gVVBEQVRFX1ZSU0FWRSBJblZSU0FWRQorICAvLyBNVFZSU0FWRSBVcGRhdGVkVlJTQVZFCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCA9IEVudHJ5QkIuYmVnaW4oKTsgIC8vIEluc2VydCBQb2ludAorICBCdWlsZE1JKEVudHJ5QkIsIElQLCBkbCwgVElJLmdldChQUEM6Ok1GVlJTQVZFKSwgSW5WUlNBVkUpOworICBCdWlsZE1JKEVudHJ5QkIsIElQLCBkbCwgVElJLmdldChQUEM6OlVQREFURV9WUlNBVkUpLAorICAgICAgICAgIFVwZGF0ZWRWUlNBVkUpLmFkZFJlZyhJblZSU0FWRSk7CisgIEJ1aWxkTUkoRW50cnlCQiwgSVAsIGRsLCBUSUkuZ2V0KFBQQzo6TVRWUlNBVkUpKS5hZGRSZWcoVXBkYXRlZFZSU0FWRSk7CisgIAorICAvLyBGaW5kIGFsbCByZXR1cm4gYmxvY2tzLCBvdXRwdXR0aW5nIGEgcmVzdG9yZSBpbiBlYWNoIGVwaWxvZy4KKyAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJCID0gRm4uYmVnaW4oKSwgRSA9IEZuLmVuZCgpOyBCQiAhPSBFOyArK0JCKSB7CisgICAgaWYgKCFCQi0+ZW1wdHkoKSAmJiBCQi0+YmFjaygpLmdldERlc2MoKS5pc1JldHVybigpKSB7CisgICAgICBJUCA9IEJCLT5lbmQoKTsgLS1JUDsKKyAgICAgIAorICAgICAgLy8gU2tpcCBvdmVyIGFsbCB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucywgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHJldHVybgorICAgICAgLy8gc2VxdWVuY2UuCisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSTIgPSBJUDsKKyAgICAgIHdoaWxlIChJMiAhPSBCQi0+YmVnaW4oKSAmJiAoLS1JMiktPmdldERlc2MoKS5pc1Rlcm1pbmF0b3IoKSkKKyAgICAgICAgSVAgPSBJMjsKKyAgICAgIAorICAgICAgLy8gRW1pdDogTVRWUlNBVkUgSW5WUlNhdmUKKyAgICAgIEJ1aWxkTUkoKkJCLCBJUCwgZGwsIFRJSS5nZXQoUFBDOjpNVFZSU0FWRSkpLmFkZFJlZyhJblZSU0FWRSk7CisgICAgfSAgICAgICAgCisgIH0KK30KKworCisvLy8gZ2V0R2xvYmFsQmFzZVJlZyAtIE91dHB1dCB0aGUgaW5zdHJ1Y3Rpb25zIHJlcXVpcmVkIHRvIHB1dCB0aGUKKy8vLyBiYXNlIGFkZHJlc3MgdG8gdXNlIGZvciBhY2Nlc3NpbmcgZ2xvYmFscyBpbnRvIGEgcmVnaXN0ZXIuCisvLy8KK1NETm9kZSAqUFBDREFHVG9EQUdJU2VsOjpnZXRHbG9iYWxCYXNlUmVnKCkgeworICBpZiAoIUdsb2JhbEJhc2VSZWcpIHsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSA9ICpUTS5nZXRJbnN0ckluZm8oKTsKKyAgICAvLyBJbnNlcnQgdGhlIHNldCBvZiBHbG9iYWxCYXNlUmVnIGludG8gdGhlIGZpcnN0IE1CQiBvZiB0aGUgZnVuY3Rpb24KKyAgICBNYWNoaW5lQmFzaWNCbG9jayAmRmlyc3RNQkIgPSBNRi0+ZnJvbnQoKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IEZpcnN0TUJCLmJlZ2luKCk7CisgICAgRGVidWdMb2MgZGw7CisKKyAgICBpZiAoUFBDTG93ZXJpbmcuZ2V0UG9pbnRlclR5KCkgPT0gTVZUOjppMzIpIHsKKyAgICAgIEdsb2JhbEJhc2VSZWcgPSBSZWdJbmZvLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUFBDOjpHUFJDUmVnaXN0ZXJDbGFzcyk7CisgICAgICBCdWlsZE1JKEZpcnN0TUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6Ok1vdmVQQ3RvTFIpLCBQUEM6OkxSKTsKKyAgICAgIEJ1aWxkTUkoRmlyc3RNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6TUZMUiksIEdsb2JhbEJhc2VSZWcpOworICAgIH0gZWxzZSB7CisgICAgICBHbG9iYWxCYXNlUmVnID0gUmVnSW5mby0+Y3JlYXRlVmlydHVhbFJlZ2lzdGVyKFBQQzo6RzhSQ1JlZ2lzdGVyQ2xhc3MpOworICAgICAgQnVpbGRNSShGaXJzdE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpNb3ZlUEN0b0xSOCksIFBQQzo6TFI4KTsKKyAgICAgIEJ1aWxkTUkoRmlyc3RNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6TUZMUjgpLCBHbG9iYWxCYXNlUmVnKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEN1ckRBRy0+Z2V0UmVnaXN0ZXIoR2xvYmFsQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDTG93ZXJpbmcuZ2V0UG9pbnRlclR5KCkpLmdldE5vZGUoKTsKK30KKworLy8vIGlzSW50UzE2SW1tZWRpYXRlIC0gVGhpcyBtZXRob2QgdGVzdHMgdG8gc2VlIGlmIHRoZSBub2RlIGlzIGVpdGhlciBhIDMyLWJpdAorLy8vIG9yIDY0LWJpdCBpbW1lZGlhdGUsIGFuZCBpZiB0aGUgdmFsdWUgY2FuIGJlIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQgYXMgYQorLy8vIHNpZ24gZXh0ZW5zaW9uIGZyb20gYSAxNi1iaXQgdmFsdWUuICBJZiBzbywgdGhpcyByZXR1cm5zIHRydWUgYW5kIHRoZQorLy8vIGltbWVkaWF0ZS4KK3N0YXRpYyBib29sIGlzSW50UzE2SW1tZWRpYXRlKFNETm9kZSAqTiwgc2hvcnQgJkltbSkgeworICBpZiAoTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpDb25zdGFudCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgSW1tID0gKHNob3J0KWNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4pLT5nZXRaRXh0VmFsdWUoKTsKKyAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMikKKyAgICByZXR1cm4gSW1tID09IChpbnQzMl90KWNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4pLT5nZXRaRXh0VmFsdWUoKTsKKyAgZWxzZQorICAgIHJldHVybiBJbW0gPT0gKGludDY0X3QpY2FzdDxDb25zdGFudFNETm9kZT4oTiktPmdldFpFeHRWYWx1ZSgpOworfQorCitzdGF0aWMgYm9vbCBpc0ludFMxNkltbWVkaWF0ZShTRFZhbHVlIE9wLCBzaG9ydCAmSW1tKSB7CisgIHJldHVybiBpc0ludFMxNkltbWVkaWF0ZShPcC5nZXROb2RlKCksIEltbSk7Cit9CisKKworLy8vIGlzSW50MzJJbW1lZGlhdGUgLSBUaGlzIG1ldGhvZCB0ZXN0cyB0byBzZWUgaWYgdGhlIG5vZGUgaXMgYSAzMi1iaXQgY29uc3RhbnQKKy8vLyBvcGVyYW5kLiBJZiBzbyBJbW0gd2lsbCByZWNlaXZlIHRoZSAzMi1iaXQgdmFsdWUuCitzdGF0aWMgYm9vbCBpc0ludDMySW1tZWRpYXRlKFNETm9kZSAqTiwgdW5zaWduZWQgJkltbSkgeworICBpZiAoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJiBOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIpIHsKKyAgICBJbW0gPSBjYXN0PENvbnN0YW50U0ROb2RlPihOKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNJbnQ2NEltbWVkaWF0ZSAtIFRoaXMgbWV0aG9kIHRlc3RzIHRvIHNlZSBpZiB0aGUgbm9kZSBpcyBhIDY0LWJpdCBjb25zdGFudAorLy8vIG9wZXJhbmQuICBJZiBzbyBJbW0gd2lsbCByZWNlaXZlIHRoZSA2NC1iaXQgdmFsdWUuCitzdGF0aWMgYm9vbCBpc0ludDY0SW1tZWRpYXRlKFNETm9kZSAqTiwgdWludDY0X3QgJkltbSkgeworICBpZiAoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJiBOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppNjQpIHsKKyAgICBJbW0gPSBjYXN0PENvbnN0YW50U0ROb2RlPihOKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBpc0ludDMySW1tZWRpYXRlIC0gVGhpcyBtZXRob2QgdGVzdHMgdG8gc2VlIGlmIGEgY29uc3RhbnQgb3BlcmFuZC4KKy8vIElmIHNvIEltbSB3aWxsIHJlY2VpdmUgdGhlIDMyIGJpdCB2YWx1ZS4KK3N0YXRpYyBib29sIGlzSW50MzJJbW1lZGlhdGUoU0RWYWx1ZSBOLCB1bnNpZ25lZCAmSW1tKSB7CisgIHJldHVybiBpc0ludDMySW1tZWRpYXRlKE4uZ2V0Tm9kZSgpLCBJbW0pOworfQorCisKKy8vIGlzT3BjV2l0aEludEltbWVkaWF0ZSAtIFRoaXMgbWV0aG9kIHRlc3RzIHRvIHNlZSBpZiB0aGUgbm9kZSBpcyBhIHNwZWNpZmljCisvLyBvcGNvZGUgYW5kIHRoYXQgaXQgaGFzIGEgaW1tZWRpYXRlIGludGVnZXIgcmlnaHQgb3BlcmFuZC4KKy8vIElmIHNvIEltbSB3aWxsIHJlY2VpdmUgdGhlIDMyIGJpdCB2YWx1ZS4KK3N0YXRpYyBib29sIGlzT3BjV2l0aEludEltbWVkaWF0ZShTRE5vZGUgKk4sIHVuc2lnbmVkIE9wYywgdW5zaWduZWQmIEltbSkgeworICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gT3BjCisgICAgICAgICAmJiBpc0ludDMySW1tZWRpYXRlKE4tPmdldE9wZXJhbmQoMSkuZ2V0Tm9kZSgpLCBJbW0pOworfQorCitib29sIFBQQ0RBR1RvREFHSVNlbDo6aXNSdW5PZk9uZXModW5zaWduZWQgVmFsLCB1bnNpZ25lZCAmTUIsIHVuc2lnbmVkICZNRSkgeworICBpZiAoaXNTaGlmdGVkTWFza18zMihWYWwpKSB7CisgICAgLy8gbG9vayBmb3IgdGhlIGZpcnN0IG5vbi16ZXJvIGJpdAorICAgIE1CID0gQ291bnRMZWFkaW5nWmVyb3NfMzIoVmFsKTsKKyAgICAvLyBsb29rIGZvciB0aGUgZmlyc3QgemVybyBiaXQgYWZ0ZXIgdGhlIHJ1biBvZiBvbmVzCisgICAgTUUgPSBDb3VudExlYWRpbmdaZXJvc18zMigoVmFsIC0gMSkgXiBWYWwpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIFZhbCA9IH5WYWw7IC8vIGludmVydCBtYXNrCisgICAgaWYgKGlzU2hpZnRlZE1hc2tfMzIoVmFsKSkgeworICAgICAgLy8gZWZmZWN0aXZlbHkgbG9vayBmb3IgdGhlIGZpcnN0IHplcm8gYml0CisgICAgICBNRSA9IENvdW50TGVhZGluZ1plcm9zXzMyKFZhbCkgLSAxOworICAgICAgLy8gZWZmZWN0aXZlbHkgbG9vayBmb3IgdGhlIGZpcnN0IG9uZSBiaXQgYWZ0ZXIgdGhlIHJ1biBvZiB6ZXJvcworICAgICAgTUIgPSBDb3VudExlYWRpbmdaZXJvc18zMigoVmFsIC0gMSkgXiBWYWwpICsgMTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICAvLyBubyBydW4gcHJlc2VudAorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUFBDREFHVG9EQUdJU2VsOjppc1JvdGF0ZUFuZE1hc2soU0ROb2RlICpOLCB1bnNpZ25lZCBNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NoaWZ0TWFzaywgdW5zaWduZWQgJlNILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk1CLCB1bnNpZ25lZCAmTUUpIHsKKyAgLy8gRG9uJ3QgZXZlbiBnbyBkb3duIHRoaXMgcGF0aCBmb3IgaTY0LCBzaW5jZSBkaWZmZXJlbnQgbG9naWMgd2lsbCBiZQorICAvLyBuZWNlc3NhcnkgZm9yIHJsZGljbC9ybGRpY3IvcmxkaW1pLgorICBpZiAoTi0+Z2V0VmFsdWVUeXBlKDApICE9IE1WVDo6aTMyKQorICAgIHJldHVybiBmYWxzZTsKKworICB1bnNpZ25lZCBTaGlmdCAgPSAzMjsKKyAgdW5zaWduZWQgSW5kZXRlcm1pbmFudCA9IH4wOyAgLy8gYml0IG1hc2sgbWFya2luZyBpbmRldGVybWluYW50IHJlc3VsdHMKKyAgdW5zaWduZWQgT3Bjb2RlID0gTi0+Z2V0T3Bjb2RlKCk7CisgIGlmIChOLT5nZXROdW1PcGVyYW5kcygpICE9IDIgfHwKKyAgICAgICFpc0ludDMySW1tZWRpYXRlKE4tPmdldE9wZXJhbmQoMSkuZ2V0Tm9kZSgpLCBTaGlmdCkgfHwgKFNoaWZ0ID4gMzEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGlmIChPcGNvZGUgPT0gSVNEOjpTSEwpIHsKKyAgICAvLyBhcHBseSBzaGlmdCBsZWZ0IHRvIG1hc2sgaWYgaXQgY29tZXMgZmlyc3QKKyAgICBpZiAoaXNTaGlmdE1hc2spIE1hc2sgPSBNYXNrIDw8IFNoaWZ0OworICAgIC8vIGRldGVybWluZSB3aGljaCBiaXRzIGFyZSBtYWRlIGluZGV0ZXJtaW5hbnQgYnkgc2hpZnQKKyAgICBJbmRldGVybWluYW50ID0gfigweEZGRkZGRkZGdSA8PCBTaGlmdCk7CisgIH0gZWxzZSBpZiAoT3Bjb2RlID09IElTRDo6U1JMKSB7IAorICAgIC8vIGFwcGx5IHNoaWZ0IHJpZ2h0IHRvIG1hc2sgaWYgaXQgY29tZXMgZmlyc3QKKyAgICBpZiAoaXNTaGlmdE1hc2spIE1hc2sgPSBNYXNrID4+IFNoaWZ0OworICAgIC8vIGRldGVybWluZSB3aGljaCBiaXRzIGFyZSBtYWRlIGluZGV0ZXJtaW5hbnQgYnkgc2hpZnQKKyAgICBJbmRldGVybWluYW50ID0gfigweEZGRkZGRkZGdSA+PiBTaGlmdCk7CisgICAgLy8gYWRqdXN0IGZvciB0aGUgbGVmdCByb3RhdGUKKyAgICBTaGlmdCA9IDMyIC0gU2hpZnQ7CisgIH0gZWxzZSBpZiAoT3Bjb2RlID09IElTRDo6Uk9UTCkgeworICAgIEluZGV0ZXJtaW5hbnQgPSAwOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgLy8gaWYgdGhlIG1hc2sgZG9lc24ndCBpbnRlcnNlY3QgYW55IEluZGV0ZXJtaW5hbnQgYml0cworICBpZiAoTWFzayAmJiAhKE1hc2sgJiBJbmRldGVybWluYW50KSkgeworICAgIFNIID0gU2hpZnQgJiAzMTsKKyAgICAvLyBtYWtlIHN1cmUgdGhlIG1hc2sgaXMgc3RpbGwgYSBtYXNrICh3cmFwIGFyb3VuZHMgbWF5IG5vdCBiZSkKKyAgICByZXR1cm4gaXNSdW5PZk9uZXMoTWFzaywgTUIsIE1FKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBTZWxlY3RCaXRmaWVsZEluc2VydCAtIHR1cm4gYW4gb3Igb2YgdHdvIG1hc2tlZCB2YWx1ZXMgaW50bworLy8vIHRoZSByb3RhdGUgbGVmdCB3b3JkIGltbWVkaWF0ZSB0aGVuIG1hc2sgaW5zZXJ0IChybHdpbWkpIGluc3RydWN0aW9uLgorU0ROb2RlICpQUENEQUdUb0RBR0lTZWw6OlNlbGVjdEJpdGZpZWxkSW5zZXJ0KFNETm9kZSAqTikgeworICBTRFZhbHVlIE9wMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgT3AxID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICAKKyAgQVBJbnQgTEtaLCBMS08sIFJLWiwgUktPOworICBDdXJEQUctPkNvbXB1dGVNYXNrZWRCaXRzKE9wMCwgQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZSgzMiksIExLWiwgTEtPKTsKKyAgQ3VyREFHLT5Db21wdXRlTWFza2VkQml0cyhPcDEsIEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoMzIpLCBSS1osIFJLTyk7CisgIAorICB1bnNpZ25lZCBUYXJnZXRNYXNrID0gTEtaLmdldFpFeHRWYWx1ZSgpOworICB1bnNpZ25lZCBJbnNlcnRNYXNrID0gUktaLmdldFpFeHRWYWx1ZSgpOworICAKKyAgaWYgKChUYXJnZXRNYXNrIHwgSW5zZXJ0TWFzaykgPT0gMHhGRkZGRkZGRikgeworICAgIHVuc2lnbmVkIE9wME9wYyA9IE9wMC5nZXRPcGNvZGUoKTsKKyAgICB1bnNpZ25lZCBPcDFPcGMgPSBPcDEuZ2V0T3Bjb2RlKCk7CisgICAgdW5zaWduZWQgVmFsdWUsIFNIID0gMDsKKyAgICBUYXJnZXRNYXNrID0gflRhcmdldE1hc2s7CisgICAgSW5zZXJ0TWFzayA9IH5JbnNlcnRNYXNrOworCisgICAgLy8gSWYgdGhlIExIUyBoYXMgYSBmb2xkYWJsZSBzaGlmdCBhbmQgdGhlIFJIUyBkb2VzIG5vdCwgdGhlbiBzd2FwIGl0IHRvIHRoZQorICAgIC8vIFJIUyBzbyB0aGF0IHdlIGNhbiBmb2xkIHRoZSBzaGlmdCBpbnRvIHRoZSBpbnNlcnQuCisgICAgaWYgKE9wME9wYyA9PSBJU0Q6OkFORCAmJiBPcDFPcGMgPT0gSVNEOjpBTkQpIHsKKyAgICAgIGlmIChPcDAuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCB8fAorICAgICAgICAgIE9wMC5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IElTRDo6U1JMKSB7CisgICAgICAgIGlmIChPcDEuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNITCAmJgorICAgICAgICAgICAgT3AxLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpTUkwpIHsKKyAgICAgICAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOworICAgICAgICAgIHN0ZDo6c3dhcChPcDBPcGMsIE9wMU9wYyk7CisgICAgICAgICAgc3RkOjpzd2FwKFRhcmdldE1hc2ssIEluc2VydE1hc2spOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChPcDBPcGMgPT0gSVNEOjpTSEwgfHwgT3AwT3BjID09IElTRDo6U1JMKSB7CisgICAgICBpZiAoT3AxT3BjID09IElTRDo6QU5EICYmIE9wMS5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpICE9IElTRDo6U0hMICYmCisgICAgICAgICAgT3AxLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpTUkwpIHsKKyAgICAgICAgc3RkOjpzd2FwKE9wMCwgT3AxKTsKKyAgICAgICAgc3RkOjpzd2FwKE9wME9wYywgT3AxT3BjKTsKKyAgICAgICAgc3RkOjpzd2FwKFRhcmdldE1hc2ssIEluc2VydE1hc2spOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBNQiwgTUU7CisgICAgaWYgKEluc2VydE1hc2sgJiYgaXNSdW5PZk9uZXMoSW5zZXJ0TWFzaywgTUIsIE1FKSkgeworICAgICAgU0RWYWx1ZSBUbXAxLCBUbXAyOworCisgICAgICBpZiAoKE9wMU9wYyA9PSBJU0Q6OlNITCB8fCBPcDFPcGMgPT0gSVNEOjpTUkwpICYmCisgICAgICAgICAgaXNJbnQzMkltbWVkaWF0ZShPcDEuZ2V0T3BlcmFuZCgxKSwgVmFsdWUpKSB7CisgICAgICAgIE9wMSA9IE9wMS5nZXRPcGVyYW5kKDApOworICAgICAgICBTSCAgPSAoT3AxT3BjID09IElTRDo6U0hMKSA/IFZhbHVlIDogMzIgLSBWYWx1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChPcDFPcGMgPT0gSVNEOjpBTkQpIHsKKyAgICAgICAgdW5zaWduZWQgU0hPcGMgPSBPcDEuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKTsKKyAgICAgICAgaWYgKChTSE9wYyA9PSBJU0Q6OlNITCB8fCBTSE9wYyA9PSBJU0Q6OlNSTCkgJiYKKyAgICAgICAgICAgIGlzSW50MzJJbW1lZGlhdGUoT3AxLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgxKSwgVmFsdWUpKSB7CisgICAgICAgICAgT3AxID0gT3AxLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKTsKKyAgICAgICAgICBTSCAgPSAoU0hPcGMgPT0gSVNEOjpTSEwpID8gVmFsdWUgOiAzMiAtIFZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIE9wMSA9IE9wMS5nZXRPcGVyYW5kKDApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFNIICY9IDMxOworICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgT3AwLCBPcDEsIGdldEkzMkltbShTSCksIGdldEkzMkltbShNQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbShNRSkgfTsKKyAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6UkxXSU1JLCBkbCwgTVZUOjppMzIsIE9wcywgNSk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLy8gU2VsZWN0Q0MgLSBTZWxlY3QgYSBjb21wYXJpc29uIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzIHdpdGggdGhlIHNwZWNpZmllZAorLy8vIGNvbmRpdGlvbiBjb2RlLCByZXR1cm5pbmcgdGhlIENSIyBvZiB0aGUgZXhwcmVzc2lvbi4KK1NEVmFsdWUgUFBDREFHVG9EQUdJU2VsOjpTZWxlY3RDQyhTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkNvbmRDb2RlIENDLCBEZWJ1Z0xvYyBkbCkgeworICAvLyBBbHdheXMgc2VsZWN0IHRoZSBMSFMuCisgIHVuc2lnbmVkIE9wYzsKKyAgCisgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIpIHsKKyAgICB1bnNpZ25lZCBJbW07CisgICAgaWYgKENDID09IElTRDo6U0VURVEgfHwgQ0MgPT0gSVNEOjpTRVRORSkgeworICAgICAgaWYgKGlzSW50MzJJbW1lZGlhdGUoUkhTLCBJbW0pKSB7CisgICAgICAgIC8vIFNFVEVRL1NFVE5FIGNvbXBhcmlzb24gd2l0aCAxNi1iaXQgaW1tZWRpYXRlLCBmb2xkIGl0LgorICAgICAgICBpZiAoaXNVSW50PDE2PihJbW0pKQorICAgICAgICAgIHJldHVybiBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpDTVBMV0ksIGRsLCBNVlQ6OmkzMiwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0STMySW1tKEltbSAmIDB4RkZGRikpLCAwKTsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIDE2LWJpdCBzaWduZWQgaW1tZWRpYXRlLCBmb2xkIGl0LgorICAgICAgICBpZiAoaXNJbnQ8MTY+KChpbnQpSW1tKSkKKyAgICAgICAgICByZXR1cm4gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6Q01QV0ksIGRsLCBNVlQ6OmkzMiwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0STMySW1tKEltbSAmIDB4RkZGRikpLCAwKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvciBub24tZXF1YWxpdHkgY29tcGFyaXNvbnMsIHRoZSBkZWZhdWx0IGNvZGUgd291bGQgbWF0ZXJpYWxpemUgdGhlCisgICAgICAgIC8vIGNvbnN0YW50LCB0aGVuIGNvbXBhcmUgYWdhaW5zdCBpdCwgbGlrZSB0aGlzOgorICAgICAgICAvLyAgIGxpcyByMiwgNDY2MAorICAgICAgICAvLyAgIG9yaSByMiwgcjIsIDIyMTM2IAorICAgICAgICAvLyAgIGNtcHcgY3IwLCByMywgcjIKKyAgICAgICAgLy8gU2luY2Ugd2UgYXJlIGp1c3QgY29tcGFyaW5nIGZvciBlcXVhbGl0eSwgd2UgY2FuIGVtaXQgdGhpcyBpbnN0ZWFkOgorICAgICAgICAvLyAgIHhvcmlzIHIwLHIzLDB4MTIzNAorICAgICAgICAvLyAgIGNtcGx3aSBjcjAscjAsMHg1Njc4CisgICAgICAgIC8vICAgYmVxIGNyMCxMNgorICAgICAgICBTRFZhbHVlIFhvcihDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6WE9SSVMsIGRsLCBNVlQ6OmkzMiwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbShJbW0gPj4gMTYpKSwgMCk7CisgICAgICAgIHJldHVybiBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpDTVBMV0ksIGRsLCBNVlQ6OmkzMiwgWG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbShJbW0gJiAweEZGRkYpKSwgMCk7CisgICAgICB9CisgICAgICBPcGMgPSBQUEM6OkNNUExXOworICAgIH0gZWxzZSBpZiAoSVNEOjppc1Vuc2lnbmVkSW50U2V0Q0MoQ0MpKSB7CisgICAgICBpZiAoaXNJbnQzMkltbWVkaWF0ZShSSFMsIEltbSkgJiYgaXNVSW50PDE2PihJbW0pKQorICAgICAgICByZXR1cm4gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6Q01QTFdJLCBkbCwgTVZUOjppMzIsIExIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJMzJJbW0oSW1tICYgMHhGRkZGKSksIDApOworICAgICAgT3BjID0gUFBDOjpDTVBMVzsKKyAgICB9IGVsc2UgeworICAgICAgc2hvcnQgU0ltbTsKKyAgICAgIGlmIChpc0ludFMxNkltbWVkaWF0ZShSSFMsIFNJbW0pKQorICAgICAgICByZXR1cm4gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6Q01QV0ksIGRsLCBNVlQ6OmkzMiwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbSgoaW50KVNJbW0gJiAweEZGRkYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgIE9wYyA9IFBQQzo6Q01QVzsKKyAgICB9CisgIH0gZWxzZSBpZiAoTEhTLmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTY0KSB7CisgICAgdWludDY0X3QgSW1tOworICAgIGlmIChDQyA9PSBJU0Q6OlNFVEVRIHx8IENDID09IElTRDo6U0VUTkUpIHsKKyAgICAgIGlmIChpc0ludDY0SW1tZWRpYXRlKFJIUy5nZXROb2RlKCksIEltbSkpIHsKKyAgICAgICAgLy8gU0VURVEvU0VUTkUgY29tcGFyaXNvbiB3aXRoIDE2LWJpdCBpbW1lZGlhdGUsIGZvbGQgaXQuCisgICAgICAgIGlmIChpc1VJbnQ8MTY+KEltbSkpCisgICAgICAgICAgcmV0dXJuIFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6OkNNUExESSwgZGwsIE1WVDo6aTY0LCBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJMzJJbW0oSW1tICYgMHhGRkZGKSksIDApOworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgMTYtYml0IHNpZ25lZCBpbW1lZGlhdGUsIGZvbGQgaXQuCisgICAgICAgIGlmIChpc0ludDwxNj4oSW1tKSkKKyAgICAgICAgICByZXR1cm4gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6Q01QREksIGRsLCBNVlQ6Omk2NCwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0STMySW1tKEltbSAmIDB4RkZGRikpLCAwKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvciBub24tZXF1YWxpdHkgY29tcGFyaXNvbnMsIHRoZSBkZWZhdWx0IGNvZGUgd291bGQgbWF0ZXJpYWxpemUgdGhlCisgICAgICAgIC8vIGNvbnN0YW50LCB0aGVuIGNvbXBhcmUgYWdhaW5zdCBpdCwgbGlrZSB0aGlzOgorICAgICAgICAvLyAgIGxpcyByMiwgNDY2MAorICAgICAgICAvLyAgIG9yaSByMiwgcjIsIDIyMTM2IAorICAgICAgICAvLyAgIGNtcGQgY3IwLCByMywgcjIKKyAgICAgICAgLy8gU2luY2Ugd2UgYXJlIGp1c3QgY29tcGFyaW5nIGZvciBlcXVhbGl0eSwgd2UgY2FuIGVtaXQgdGhpcyBpbnN0ZWFkOgorICAgICAgICAvLyAgIHhvcmlzIHIwLHIzLDB4MTIzNAorICAgICAgICAvLyAgIGNtcGxkaSBjcjAscjAsMHg1Njc4CisgICAgICAgIC8vICAgYmVxIGNyMCxMNgorICAgICAgICBpZiAoaXNVSW50PDMyPihJbW0pKSB7CisgICAgICAgICAgU0RWYWx1ZSBYb3IoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6OlhPUklTOCwgZGwsIE1WVDo6aTY0LCBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJNjRJbW0oSW1tID4+IDE2KSksIDApOworICAgICAgICAgIHJldHVybiBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpDTVBMREksIGRsLCBNVlQ6Omk2NCwgWG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0STY0SW1tKEltbSAmIDB4RkZGRikpLCAwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgT3BjID0gUFBDOjpDTVBMRDsKKyAgICB9IGVsc2UgaWYgKElTRDo6aXNVbnNpZ25lZEludFNldENDKENDKSkgeworICAgICAgaWYgKGlzSW50NjRJbW1lZGlhdGUoUkhTLmdldE5vZGUoKSwgSW1tKSAmJiBpc1VJbnQ8MTY+KEltbSkpCisgICAgICAgIHJldHVybiBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpDTVBMREksIGRsLCBNVlQ6Omk2NCwgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEk2NEltbShJbW0gJiAweEZGRkYpKSwgMCk7CisgICAgICBPcGMgPSBQUEM6OkNNUExEOworICAgIH0gZWxzZSB7CisgICAgICBzaG9ydCBTSW1tOworICAgICAgaWYgKGlzSW50UzE2SW1tZWRpYXRlKFJIUywgU0ltbSkpCisgICAgICAgIHJldHVybiBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpDTVBESSwgZGwsIE1WVDo6aTY0LCBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0STY0SW1tKFNJbW0gJiAweEZGRkYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgIE9wYyA9IFBQQzo6Q01QRDsKKyAgICB9CisgIH0gZWxzZSBpZiAoTEhTLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyKSB7CisgICAgT3BjID0gUFBDOjpGQ01QVVM7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KExIUy5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmY2NCAmJiAiVW5rbm93biB2dCEiKTsKKyAgICBPcGMgPSBQUEM6OkZDTVBVRDsKKyAgfQorICByZXR1cm4gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wYywgZGwsIE1WVDo6aTMyLCBMSFMsIFJIUyksIDApOworfQorCitzdGF0aWMgUFBDOjpQcmVkaWNhdGUgZ2V0UHJlZGljYXRlRm9yU2V0Q0MoSVNEOjpDb25kQ29kZSBDQykgeworICBzd2l0Y2ggKENDKSB7CisgIGNhc2UgSVNEOjpTRVRVRVE6CisgIGNhc2UgSVNEOjpTRVRPTkU6CisgIGNhc2UgSVNEOjpTRVRPTEU6CisgIGNhc2UgSVNEOjpTRVRPR0U6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiU2hvdWxkIGJlIGxvd2VyZWQgYnkgbGVnYWxpemUhIik7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29uZGl0aW9uISIpOworICBjYXNlIElTRDo6U0VUT0VROgorICBjYXNlIElTRDo6U0VURVE6ICByZXR1cm4gUFBDOjpQUkVEX0VROworICBjYXNlIElTRDo6U0VUVU5FOgorICBjYXNlIElTRDo6U0VUTkU6ICByZXR1cm4gUFBDOjpQUkVEX05FOworICBjYXNlIElTRDo6U0VUT0xUOgorICBjYXNlIElTRDo6U0VUTFQ6ICByZXR1cm4gUFBDOjpQUkVEX0xUOworICBjYXNlIElTRDo6U0VUVUxFOgorICBjYXNlIElTRDo6U0VUTEU6ICByZXR1cm4gUFBDOjpQUkVEX0xFOworICBjYXNlIElTRDo6U0VUT0dUOgorICBjYXNlIElTRDo6U0VUR1Q6ICByZXR1cm4gUFBDOjpQUkVEX0dUOworICBjYXNlIElTRDo6U0VUVUdFOgorICBjYXNlIElTRDo6U0VUR0U6ICByZXR1cm4gUFBDOjpQUkVEX0dFOworICBjYXNlIElTRDo6U0VUTzogICByZXR1cm4gUFBDOjpQUkVEX05VOworICBjYXNlIElTRDo6U0VUVU86ICByZXR1cm4gUFBDOjpQUkVEX1VOOworICAgIC8vIFRoZXNlIHR3byBhcmUgaW52YWxpZCBmb3IgZmxvYXRpbmcgcG9pbnQuICBBc3N1bWUgd2UgaGF2ZSBpbnQuCisgIGNhc2UgSVNEOjpTRVRVTFQ6IHJldHVybiBQUEM6OlBSRURfTFQ7CisgIGNhc2UgSVNEOjpTRVRVR1Q6IHJldHVybiBQUEM6OlBSRURfR1Q7CisgIH0KK30KKworLy8vIGdldENSSWR4Rm9yU2V0Q0MgLSBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBjb25kaXRpb24gcmVnaXN0ZXIgZmllbGQKKy8vLyBhc3NvY2lhdGVkIHdpdGggdGhlIFNldENDIGNvbmRpdGlvbiwgYW5kIHdoZXRoZXIgb3Igbm90IHRoZSBmaWVsZCBpcworLy8vIHRyZWF0ZWQgYXMgaW52ZXJ0ZWQuICBUaGF0IGlzLCBsdCA9IDA7IGdlID0gMCBpbnZlcnRlZC4KKy8vLworLy8vIElmIHRoaXMgcmV0dXJucyB3aXRoIE90aGVyICE9IC0xLCB0aGVuIHRoZSByZXR1cm5lZCBjb21wYXJpc29uIGlzIGFuIG9yIG9mCisvLy8gdHdvIHNpbXBsZXIgY29tcGFyaXNvbnMuICBJbiB0aGlzIGNhc2UsIEludmVydCBpcyBndWFyYW50ZWVkIHRvIGJlIGZhbHNlLgorc3RhdGljIHVuc2lnbmVkIGdldENSSWR4Rm9yU2V0Q0MoSVNEOjpDb25kQ29kZSBDQywgYm9vbCAmSW52ZXJ0LCBpbnQgJk90aGVyKSB7CisgIEludmVydCA9IGZhbHNlOworICBPdGhlciA9IC0xOworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29uZGl0aW9uISIpOworICBjYXNlIElTRDo6U0VUT0xUOgorICBjYXNlIElTRDo6U0VUTFQ6ICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAvLyBCaXQgIzAgPSBTRVRPTFQKKyAgY2FzZSBJU0Q6OlNFVE9HVDoKKyAgY2FzZSBJU0Q6OlNFVEdUOiAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgLy8gQml0ICMxID0gU0VUT0dUCisgIGNhc2UgSVNEOjpTRVRPRVE6CisgIGNhc2UgSVNEOjpTRVRFUTogIHJldHVybiAyOyAgICAgICAgICAgICAgICAgIC8vIEJpdCAjMiA9IFNFVE9FUQorICBjYXNlIElTRDo6U0VUVU86ICByZXR1cm4gMzsgICAgICAgICAgICAgICAgICAvLyBCaXQgIzMgPSBTRVRVTworICBjYXNlIElTRDo6U0VUVUdFOgorICBjYXNlIElTRDo6U0VUR0U6ICBJbnZlcnQgPSB0cnVlOyByZXR1cm4gMDsgICAvLyAhQml0ICMwID0gU0VUVUdFCisgIGNhc2UgSVNEOjpTRVRVTEU6CisgIGNhc2UgSVNEOjpTRVRMRTogIEludmVydCA9IHRydWU7IHJldHVybiAxOyAgIC8vICFCaXQgIzEgPSBTRVRVTEUKKyAgY2FzZSBJU0Q6OlNFVFVORToKKyAgY2FzZSBJU0Q6OlNFVE5FOiAgSW52ZXJ0ID0gdHJ1ZTsgcmV0dXJuIDI7ICAgLy8gIUJpdCAjMiA9IFNFVFVORQorICBjYXNlIElTRDo6U0VUTzogICBJbnZlcnQgPSB0cnVlOyByZXR1cm4gMzsgICAvLyAhQml0ICMzID0gU0VUTworICBjYXNlIElTRDo6U0VUVUVROiAKKyAgY2FzZSBJU0Q6OlNFVE9HRTogCisgIGNhc2UgSVNEOjpTRVRPTEU6IAorICBjYXNlIElTRDo6U0VUT05FOgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgYnJhbmNoIGNvZGU6IHNob3VsZCBiZSBleHBhbmRlZCBieSBsZWdhbGl6ZSIpOworICAvLyBUaGVzZSBhcmUgaW52YWxpZCBmb3IgZmxvYXRpbmcgcG9pbnQuICBBc3N1bWUgaW50ZWdlci4KKyAgY2FzZSBJU0Q6OlNFVFVMVDogcmV0dXJuIDA7CisgIGNhc2UgSVNEOjpTRVRVR1Q6IHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitTRE5vZGUgKlBQQ0RBR1RvREFHSVNlbDo6U2VsZWN0U0VUQ0MoU0ROb2RlICpOKSB7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgSW1tOworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oTi0+Z2V0T3BlcmFuZCgyKSktPmdldCgpOworICBpZiAoaXNJbnQzMkltbWVkaWF0ZShOLT5nZXRPcGVyYW5kKDEpLCBJbW0pKSB7CisgICAgLy8gV2UgY2FuIGNvZGVnZW4gc2V0Y2Mgb3AsIGltbSB2ZXJ5IGVmZmljaWVudGx5IGNvbXBhcmVkIHRvIGEgYnJjb25kLgorICAgIC8vIENoZWNrIGZvciB0aG9zZSBjYXNlcyBoZXJlLgorICAgIC8vIHNldGNjIG9wLCAwCisgICAgaWYgKEltbSA9PSAwKSB7CisgICAgICBTRFZhbHVlIE9wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIHN3aXRjaCAoQ0MpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVEVROiB7CisgICAgICAgIE9wID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6Q05UTFpXLCBkbCwgTVZUOjppMzIsIE9wKSwgMCk7CisgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7IE9wLCBnZXRJMzJJbW0oMjcpLCBnZXRJMzJJbW0oNSksIGdldEkzMkltbSgzMSkgfTsKKyAgICAgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIFBQQzo6UkxXSU5NLCBNVlQ6OmkzMiwgT3BzLCA0KTsKKyAgICAgIH0KKyAgICAgIGNhc2UgSVNEOjpTRVRORTogeworICAgICAgICBTRFZhbHVlIEFEID0KKyAgICAgICAgICBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpBRERJQywgZGwsIE1WVDo6aTMyLCBNVlQ6OkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLCBnZXRJMzJJbW0ofjBVKSksIDApOworICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgUFBDOjpTVUJGRSwgTVZUOjppMzIsIEFELCBPcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRC5nZXRWYWx1ZSgxKSk7CisgICAgICB9CisgICAgICBjYXNlIElTRDo6U0VUTFQ6IHsKKyAgICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgT3AsIGdldEkzMkltbSgxKSwgZ2V0STMySW1tKDMxKSwgZ2V0STMySW1tKDMxKSB9OworICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgUFBDOjpSTFdJTk0sIE1WVDo6aTMyLCBPcHMsIDQpOworICAgICAgfQorICAgICAgY2FzZSBJU0Q6OlNFVEdUOiB7CisgICAgICAgIFNEVmFsdWUgVCA9CisgICAgICAgICAgU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6TkVHLCBkbCwgTVZUOjppMzIsIE9wKSwgMCk7CisgICAgICAgIFQgPSBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpBTkRDLCBkbCwgTVZUOjppMzIsIFQsIE9wKSwgMCk7CisgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7IFQsIGdldEkzMkltbSgxKSwgZ2V0STMySW1tKDMxKSwgZ2V0STMySW1tKDMxKSB9OworICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgUFBDOjpSTFdJTk0sIE1WVDo6aTMyLCBPcHMsIDQpOworICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoSW1tID09IH4wVSkgeyAgICAgICAgLy8gc2V0Y2Mgb3AsIC0xCisgICAgICBTRFZhbHVlIE9wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIHN3aXRjaCAoQ0MpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVEVROgorICAgICAgICBPcCA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6OkFERElDLCBkbCwgTVZUOjppMzIsIE1WVDo6RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AsIGdldEkzMkltbSgxKSksIDApOworICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgUFBDOjpBRERaRSwgTVZUOjppMzIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6TEksIGRsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJMzJJbW0oMCkpLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0VmFsdWUoMSkpOworICAgICAgY2FzZSBJU0Q6OlNFVE5FOiB7CisgICAgICAgIE9wID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6Tk9SLCBkbCwgTVZUOjppMzIsIE9wLCBPcCksIDApOworICAgICAgICBTRE5vZGUgKkFEID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6OkFERElDLCBkbCwgTVZUOjppMzIsIE1WVDo6RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AsIGdldEkzMkltbSh+MFUpKTsKKyAgICAgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIFBQQzo6U1VCRkUsIE1WVDo6aTMyLCBTRFZhbHVlKEFELCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLCBTRFZhbHVlKEFELCAxKSk7CisgICAgICB9CisgICAgICBjYXNlIElTRDo6U0VUTFQ6IHsKKyAgICAgICAgU0RWYWx1ZSBBRCA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6OkFEREksIGRsLCBNVlQ6OmkzMiwgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0STMySW1tKDEpKSwgMCk7CisgICAgICAgIFNEVmFsdWUgQU4gPSBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpBTkQsIGRsLCBNVlQ6OmkzMiwgQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ApLCAwKTsKKyAgICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgQU4sIGdldEkzMkltbSgxKSwgZ2V0STMySW1tKDMxKSwgZ2V0STMySW1tKDMxKSB9OworICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgUFBDOjpSTFdJTk0sIE1WVDo6aTMyLCBPcHMsIDQpOworICAgICAgfQorICAgICAgY2FzZSBJU0Q6OlNFVEdUOiB7CisgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7IE9wLCBnZXRJMzJJbW0oMSksIGdldEkzMkltbSgzMSksIGdldEkzMkltbSgzMSkgfTsKKyAgICAgICAgT3AgPSBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpSTFdJTk0sIGRsLCBNVlQ6OmkzMiwgT3BzLCA0KSwgCisgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIFBQQzo6WE9SSSwgTVZUOjppMzIsIE9wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbSgxKSk7CisgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIAorICBib29sIEludjsKKyAgaW50IE90aGVyQ29uZElkeDsKKyAgdW5zaWduZWQgSWR4ID0gZ2V0Q1JJZHhGb3JTZXRDQyhDQywgSW52LCBPdGhlckNvbmRJZHgpOworICBTRFZhbHVlIENDUmVnID0gU2VsZWN0Q0MoTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSwgQ0MsIGRsKTsKKyAgU0RWYWx1ZSBJbnRDUjsKKyAgCisgIC8vIEZvcmNlIHRoZSBjY3JlZyBpbnRvIENSNy4KKyAgU0RWYWx1ZSBDUjdSZWcgPSBDdXJEQUctPmdldFJlZ2lzdGVyKFBQQzo6Q1I3LCBNVlQ6OmkzMik7CisgIAorICBTRFZhbHVlIEluRmxhZygwLCAwKTsgIC8vIE51bGwgaW5jb21pbmcgZmxhZyB2YWx1ZS4KKyAgQ0NSZWcgPSBDdXJEQUctPmdldENvcHlUb1JlZyhDdXJEQUctPmdldEVudHJ5Tm9kZSgpLCBkbCwgQ1I3UmVnLCBDQ1JlZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5GbGFnKS5nZXRWYWx1ZSgxKTsKKyAgCisgIGlmIChQUENTdWJUYXJnZXQuaXNHaWdhUHJvY2Vzc29yKCkgJiYgT3RoZXJDb25kSWR4ID09IC0xKQorICAgIEludENSID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6TUZPQ1JGLCBkbCwgTVZUOjppMzIsIENSN1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1JlZyksIDApOworIGVsc2UKKyAgICBJbnRDUiA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6Ok1GQ1Jwc2V1ZCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSN1JlZywgQ0NSZWcpLCAwKTsKKyAgCisgIFNEVmFsdWUgT3BzW10gPSB7IEludENSLCBnZXRJMzJJbW0oKDMyLSgzLUlkeCkpICYgMzEpLAorICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbSgzMSksIGdldEkzMkltbSgzMSkgfTsKKyAgaWYgKE90aGVyQ29uZElkeCA9PSAtMSAmJiAhSW52KQorICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBQUEM6OlJMV0lOTSwgTVZUOjppMzIsIE9wcywgNCk7CisKKyAgLy8gR2V0IHRoZSBzcGVjaWZpZWQgYml0LgorICBTRFZhbHVlIFRtcCA9CisgICAgU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6UkxXSU5NLCBkbCwgTVZUOjppMzIsIE9wcywgNCksIDApOworICBpZiAoSW52KSB7CisgICAgYXNzZXJ0KE90aGVyQ29uZElkeCA9PSAtMSAmJiAiQ2FuJ3QgaGF2ZSBzcGxpdCBwbHVzIG5lZ2F0aW9uIik7CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIFBQQzo6WE9SSSwgTVZUOjppMzIsIFRtcCwgZ2V0STMySW1tKDEpKTsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byB0dXJuIGFuIG9wZXJhdGlvbiBsaWtlIFNFVE9ORSAtPiBTRVRPTFQgfCBTRVRPR1QuCisgIC8vIFdlIGFscmVhZHkgZ290IHRoZSBiaXQgZm9yIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb21wYXJpc29uIChlLmcuIFNFVFVMRSkuCisKKyAgLy8gR2V0IHRoZSBvdGhlciBiaXQgb2YgdGhlIGNvbXBhcmlzb24uCisgIE9wc1sxXSA9IGdldEkzMkltbSgoMzItKDMtT3RoZXJDb25kSWR4KSkgJiAzMSk7CisgIFNEVmFsdWUgT3RoZXJDb25kID0gCisgICAgU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6UkxXSU5NLCBkbCwgTVZUOjppMzIsIE9wcywgNCksIDApOworCisgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBQUEM6Ok9SLCBNVlQ6OmkzMiwgVG1wLCBPdGhlckNvbmQpOworfQorCisKKy8vIFNlbGVjdCAtIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGZyb20gYSB0YXJnZXQtaW5kZXBlbmRlbnQgdG8gYQorLy8gdGFyZ2V0LXNwZWNpZmljIG5vZGUgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBjaGFuZ2VkLgorU0ROb2RlICpQUENEQUdUb0RBR0lTZWw6OlNlbGVjdChTRE5vZGUgKk4pIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBpZiAoTi0+aXNNYWNoaW5lT3Bjb2RlKCkpCisgICAgcmV0dXJuIE5VTEw7ICAgLy8gQWxyZWFkeSBzZWxlY3RlZC4KKworICBzd2l0Y2ggKE4tPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICAKKyAgY2FzZSBJU0Q6OkNvbnN0YW50OiB7CisgICAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6Omk2NCkgeworICAgICAgLy8gR2V0IDY0IGJpdCB2YWx1ZS4KKyAgICAgIGludDY0X3QgSW1tID0gY2FzdDxDb25zdGFudFNETm9kZT4oTiktPmdldFpFeHRWYWx1ZSgpOworICAgICAgLy8gQXNzdW1lIG5vIHJlbWFpbmluZyBiaXRzLgorICAgICAgdW5zaWduZWQgUmVtYWluZGVyID0gMDsKKyAgICAgIC8vIEFzc3VtZSBubyBzaGlmdCByZXF1aXJlZC4KKyAgICAgIHVuc2lnbmVkIFNoaWZ0ID0gMDsKKyAgICAgIAorICAgICAgLy8gSWYgaXQgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgYXMgYSAzMiBiaXQgdmFsdWUuCisgICAgICBpZiAoIWlzSW50PDMyPihJbW0pKSB7CisgICAgICAgIFNoaWZ0ID0gQ291bnRUcmFpbGluZ1plcm9zXzY0KEltbSk7CisgICAgICAgIGludDY0X3QgSW1tU2ggPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oSW1tKSA+PiBTaGlmdDsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBzaGlmdGVkIHZhbHVlIGZpdHMgMzIgYml0cy4KKyAgICAgICAgaWYgKGlzSW50PDMyPihJbW1TaCkpIHsKKyAgICAgICAgICAvLyBHbyB3aXRoIHRoZSBzaGlmdGVkIHZhbHVlLgorICAgICAgICAgIEltbSA9IEltbVNoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFN0aWxsIHN0dWNrIHdpdGggYSA2NCBiaXQgdmFsdWUuCisgICAgICAgICAgUmVtYWluZGVyID0gSW1tOworICAgICAgICAgIFNoaWZ0ID0gMzI7CisgICAgICAgICAgSW1tID4+PSAzMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvLyBJbnRlcm1lZGlhdGUgb3BlcmFuZC4KKyAgICAgIFNETm9kZSAqUmVzdWx0OworCisgICAgICAvLyBIYW5kbGUgZmlyc3QgMzIgYml0cy4KKyAgICAgIHVuc2lnbmVkIExvID0gSW1tICYgMHhGRkZGOworICAgICAgdW5zaWduZWQgSGkgPSAoSW1tID4+IDE2KSAmIDB4RkZGRjsKKyAgICAgIAorICAgICAgLy8gU2ltcGxlIHZhbHVlLgorICAgICAgaWYgKGlzSW50PDE2PihJbW0pKSB7CisgICAgICAgLy8gSnVzdCB0aGUgTG8gYml0cy4KKyAgICAgICAgUmVzdWx0ID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6OkxJOCwgZGwsIE1WVDo6aTY0LCBnZXRJMzJJbW0oTG8pKTsKKyAgICAgIH0gZWxzZSBpZiAoTG8pIHsKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBIaSBiaXRzLgorICAgICAgICB1bnNpZ25lZCBPcEMgPSBIaSA/IFBQQzo6TElTOCA6IFBQQzo6TEk4OworICAgICAgICBSZXN1bHQgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wQywgZGwsIE1WVDo6aTY0LCBnZXRJMzJJbW0oSGkpKTsKKyAgICAgICAgLy8gQW5kIExvIGJpdHMuCisgICAgICAgIFJlc3VsdCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpPUkk4LCBkbCwgTVZUOjppNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShSZXN1bHQsIDApLCBnZXRJMzJJbW0oTG8pKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgLy8gSnVzdCB0aGUgSGkgYml0cy4KKyAgICAgICAgUmVzdWx0ID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6OkxJUzgsIGRsLCBNVlQ6Omk2NCwgZ2V0STMySW1tKEhpKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIElmIG5vIHNoaWZ0LCB3ZSdyZSBkb25lLgorICAgICAgaWYgKCFTaGlmdCkgcmV0dXJuIFJlc3VsdDsKKworICAgICAgLy8gU2hpZnQgZm9yIG5leHQgc3RlcCBpZiB0aGUgdXBwZXIgMzItYml0cyB3ZXJlIG5vdCB6ZXJvLgorICAgICAgaWYgKEltbSkgeworICAgICAgICBSZXN1bHQgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6UkxESUNSLCBkbCwgTVZUOjppNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShSZXN1bHQsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbShTaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0STMySW1tKDYzIC0gU2hpZnQpKTsKKyAgICAgIH0KKworICAgICAgLy8gQWRkIGluIHRoZSBsYXN0IGJpdHMgYXMgcmVxdWlyZWQuCisgICAgICBpZiAoKEhpID0gKFJlbWFpbmRlciA+PiAxNikgJiAweEZGRkYpKSB7CisgICAgICAgIFJlc3VsdCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpPUklTOCwgZGwsIE1WVDo6aTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoUmVzdWx0LCAwKSwgZ2V0STMySW1tKEhpKSk7CisgICAgICB9IAorICAgICAgaWYgKChMbyA9IFJlbWFpbmRlciAmIDB4RkZGRikpIHsKKyAgICAgICAgUmVzdWx0ID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6Ok9SSTgsIGRsLCBNVlQ6Omk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKFJlc3VsdCwgMCksIGdldEkzMkltbShMbykpOworICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICBicmVhazsKKyAgfQorICAKKyAgY2FzZSBJU0Q6OlNFVENDOgorICAgIHJldHVybiBTZWxlY3RTRVRDQyhOKTsKKyAgY2FzZSBQUENJU0Q6Okdsb2JhbEJhc2VSZWc6CisgICAgcmV0dXJuIGdldEdsb2JhbEJhc2VSZWcoKTsKKyAgICAKKyAgY2FzZSBJU0Q6OkZyYW1lSW5kZXg6IHsKKyAgICBpbnQgRkkgPSBjYXN0PEZyYW1lSW5kZXhTRE5vZGU+KE4pLT5nZXRJbmRleCgpOworICAgIFNEVmFsdWUgVEZJID0gQ3VyREFHLT5nZXRUYXJnZXRGcmFtZUluZGV4KEZJLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworICAgIHVuc2lnbmVkIE9wYyA9IE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMiA/IFBQQzo6QURESSA6IFBQQzo6QURESTg7CisgICAgaWYgKE4tPmhhc09uZVVzZSgpKQorICAgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIE9wYywgTi0+Z2V0VmFsdWVUeXBlKDApLCBURkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U21hbGxJUHRySW1tKDApKTsKKyAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBOLT5nZXRWYWx1ZVR5cGUoMCksIFRGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTbWFsbElQdHJJbW0oMCkpOworICB9CisKKyAgY2FzZSBQUENJU0Q6Ok1GQ1I6IHsKKyAgICBTRFZhbHVlIEluRmxhZyA9IE4tPmdldE9wZXJhbmQoMSk7CisgICAgLy8gVXNlIE1GT0NSRiBpZiBzdXBwb3J0ZWQuCisgICAgaWYgKFBQQ1N1YlRhcmdldC5pc0dpZ2FQcm9jZXNzb3IoKSkKKyAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6TUZPQ1JGLCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDApLCBJbkZsYWcpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6TUZDUnBzZXVkLCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDApLCBJbkZsYWcpOworICB9CisgICAgCisgIGNhc2UgSVNEOjpTRElWOiB7CisgICAgLy8gRklYTUU6IHNpbmNlIHRoaXMgZGVwZW5kcyBvbiB0aGUgc2V0dGluZyBvZiB0aGUgY2FycnkgZmxhZyBmcm9tIHRoZSBzcmF3aQorICAgIC8vICAgICAgICB3ZSBzaG91bGQgcmVhbGx5IGJlIG1ha2luZyBub3RlcyBhYm91dCB0aGF0IGZvciB0aGUgc2NoZWR1bGVyLgorICAgIC8vIEZJWE1FOiBJdCBzdXJlIHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgY2hlYXBseSByZWNvZ25pemUgdGhlIAorICAgIC8vICAgICAgICBzcmwvYWRkL3NyYSBwYXR0ZXJuIHRoZSBkYWcgY29tYmluZXIgd2lsbCBnZW5lcmF0ZSBmb3IgdGhpcyBhcworICAgIC8vICAgICAgICBzcmEvYWRkemUgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGhhbmRsZSBzZGl2IG91cnNlbHZlcy4gIG9oIHdlbGwuCisgICAgdW5zaWduZWQgSW1tOworICAgIGlmIChpc0ludDMySW1tZWRpYXRlKE4tPmdldE9wZXJhbmQoMSksIEltbSkpIHsKKyAgICAgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICAgICAgaWYgKChzaWduZWQpSW1tID4gMCAmJiBpc1Bvd2VyT2YyXzMyKEltbSkpIHsKKyAgICAgICAgU0ROb2RlICpPcCA9CisgICAgICAgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6OlNSQVdJLCBkbCwgTVZUOjppMzIsIE1WVDo6RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLCBnZXRJMzJJbW0oTG9nMl8zMihJbW0pKSk7CisgICAgICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBQUEM6OkFERFpFLCBNVlQ6OmkzMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKE9wLCAwKSwgU0RWYWx1ZShPcCwgMSkpOworICAgICAgfSBlbHNlIGlmICgoc2lnbmVkKUltbSA8IDAgJiYgaXNQb3dlck9mMl8zMigtSW1tKSkgeworICAgICAgICBTRE5vZGUgKk9wID0KKyAgICAgICAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6U1JBV0ksIGRsLCBNVlQ6OmkzMiwgTVZUOjpGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAsIGdldEkzMkltbShMb2cyXzMyKC1JbW0pKSk7CisgICAgICAgIFNEVmFsdWUgUFQgPQorICAgICAgICAgIFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShQUEM6OkFERFpFLCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoT3AsIDApLCBTRFZhbHVlKE9wLCAxKSksCisgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgUFBDOjpORUcsIE1WVDo6aTMyLCBQVCk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICB9CisgICAgCisgIGNhc2UgSVNEOjpMT0FEOiB7CisgICAgLy8gSGFuZGxlIHByZWluY3JlbWVudCBsb2Fkcy4KKyAgICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oTik7CisgICAgRVZUIExvYWRlZFZUID0gTEQtPmdldE1lbW9yeVZUKCk7CisgICAgCisgICAgLy8gTm9ybWFsIGxvYWRzIGFyZSBoYW5kbGVkIGJ5IGNvZGUgZ2VuZXJhdGVkIGZyb20gdGhlIC50ZCBmaWxlLgorICAgIGlmIChMRC0+Z2V0QWRkcmVzc2luZ01vZGUoKSAhPSBJU0Q6OlBSRV9JTkMpCisgICAgICBicmVhazsKKyAgICAKKyAgICBTRFZhbHVlIE9mZnNldCA9IExELT5nZXRPZmZzZXQoKTsKKyAgICBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihPZmZzZXQpIHx8CisgICAgICAgIE9mZnNldC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MpIHsKKyAgICAgIAorICAgICAgdW5zaWduZWQgT3Bjb2RlOworICAgICAgYm9vbCBpc1NFeHQgPSBMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6U0VYVExPQUQ7CisgICAgICBpZiAoTEQtPmdldFZhbHVlVHlwZSgwKSAhPSBNVlQ6Omk2NCkgeworICAgICAgICAvLyBIYW5kbGUgUFBDMzIgaW50ZWdlciBhbmQgbm9ybWFsIEZQIGxvYWRzLgorICAgICAgICBhc3NlcnQoKCFpc1NFeHQgfHwgTG9hZGVkVlQgPT0gTVZUOjppMTYpICYmICJJbnZhbGlkIHNleHQgdXBkYXRlIGxvYWQiKTsKKyAgICAgICAgc3dpdGNoIChMb2FkZWRWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBQUEMgbG9hZCB0eXBlISIpOworICAgICAgICAgIGNhc2UgTVZUOjpmNjQ6IE9wY29kZSA9IFBQQzo6TEZEVTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBNVlQ6OmYzMjogT3Bjb2RlID0gUFBDOjpMRlNVOyBicmVhazsKKyAgICAgICAgICBjYXNlIE1WVDo6aTMyOiBPcGNvZGUgPSBQUEM6OkxXWlU7IGJyZWFrOworICAgICAgICAgIGNhc2UgTVZUOjppMTY6IE9wY29kZSA9IGlzU0V4dCA/IFBQQzo6TEhBVSA6IFBQQzo6TEhaVTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBNVlQ6OmkxOgorICAgICAgICAgIGNhc2UgTVZUOjppODogIE9wY29kZSA9IFBQQzo6TEJaVTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChMRC0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTY0ICYmICJVbmtub3duIGxvYWQgcmVzdWx0IHR5cGUhIik7CisgICAgICAgIGFzc2VydCgoIWlzU0V4dCB8fCBMb2FkZWRWVCA9PSBNVlQ6OmkxNikgJiYgIkludmFsaWQgc2V4dCB1cGRhdGUgbG9hZCIpOworICAgICAgICBzd2l0Y2ggKExvYWRlZFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICAgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIFBQQyBsb2FkIHR5cGUhIik7CisgICAgICAgICAgY2FzZSBNVlQ6Omk2NDogT3Bjb2RlID0gUFBDOjpMRFU7IGJyZWFrOworICAgICAgICAgIGNhc2UgTVZUOjppMzI6IE9wY29kZSA9IFBQQzo6TFdaVTg7IGJyZWFrOworICAgICAgICAgIGNhc2UgTVZUOjppMTY6IE9wY29kZSA9IGlzU0V4dCA/IFBQQzo6TEhBVTggOiBQUEM6OkxIWlU4OyBicmVhazsKKyAgICAgICAgICBjYXNlIE1WVDo6aTE6CisgICAgICAgICAgY2FzZSBNVlQ6Omk4OiAgT3Bjb2RlID0gUFBDOjpMQlpVODsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgU0RWYWx1ZSBDaGFpbiA9IExELT5nZXRDaGFpbigpOworICAgICAgU0RWYWx1ZSBCYXNlID0gTEQtPmdldEJhc2VQdHIoKTsKKyAgICAgIFNEVmFsdWUgT3BzW10gPSB7IE9mZnNldCwgQmFzZSwgQ2hhaW4gfTsKKyAgICAgIC8vIEZJWE1FOiBQUEM2NAorICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3Bjb2RlLCBkbCwgTEQtPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ0xvd2VyaW5nLmdldFBvaW50ZXJUeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgT3BzLCAzKTsKKyAgICB9IGVsc2UgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiUitSIHByZWluZGV4IGxvYWRzIG5vdCBzdXBwb3J0ZWQgeWV0ISIpOworICAgIH0KKyAgfQorICAgIAorICBjYXNlIElTRDo6QU5EOiB7CisgICAgdW5zaWduZWQgSW1tLCBJbW0yLCBTSCwgTUIsIE1FOworCisgICAgLy8gSWYgdGhpcyBpcyBhbiBhbmQgb2YgYSB2YWx1ZSByb3RhdGVkIGJldHdlZW4gMCBhbmQgMzEgYml0cyBhbmQgdGhlbiBhbmQnZAorICAgIC8vIHdpdGggYSBtYXNrLCBlbWl0IHJsd2lubQorICAgIGlmIChpc0ludDMySW1tZWRpYXRlKE4tPmdldE9wZXJhbmQoMSksIEltbSkgJiYKKyAgICAgICAgaXNSb3RhdGVBbmRNYXNrKE4tPmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpLCBJbW0sIGZhbHNlLCBTSCwgTUIsIE1FKSkgeworICAgICAgU0RWYWx1ZSBWYWwgPSBOLT5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCk7CisgICAgICBTRFZhbHVlIE9wc1tdID0geyBWYWwsIGdldEkzMkltbShTSCksIGdldEkzMkltbShNQiksIGdldEkzMkltbShNRSkgfTsKKyAgICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBQUEM6OlJMV0lOTSwgTVZUOjppMzIsIE9wcywgNCk7CisgICAgfQorICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG1hc2tlZCB2YWx1ZSB3aGVyZSB0aGUgaW5wdXQgaXMgbm90IGhhbmRsZWQgYWJvdmUsIGFuZAorICAgIC8vIGlzIG5vdCBhIHJvdGF0ZS1sZWZ0IChoYW5kbGVkIGJ5IGEgcGF0dGVybiBpbiB0aGUgLnRkIGZpbGUpLCBlbWl0IHJsd2lubQorICAgIGlmIChpc0ludDMySW1tZWRpYXRlKE4tPmdldE9wZXJhbmQoMSksIEltbSkgJiYKKyAgICAgICAgaXNSdW5PZk9uZXMoSW1tLCBNQiwgTUUpICYmIAorICAgICAgICBOLT5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpICE9IElTRDo6Uk9UTCkgeworICAgICAgU0RWYWx1ZSBWYWwgPSBOLT5nZXRPcGVyYW5kKDApOworICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgVmFsLCBnZXRJMzJJbW0oMCksIGdldEkzMkltbShNQiksIGdldEkzMkltbShNRSkgfTsKKyAgICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBQUEM6OlJMV0lOTSwgTVZUOjppMzIsIE9wcywgNCk7CisgICAgfQorICAgIC8vIEFORCBYLCAwIC0+IDAsIG5vdCAicmx3aW5tIDMyIi4KKyAgICBpZiAoaXNJbnQzMkltbWVkaWF0ZShOLT5nZXRPcGVyYW5kKDEpLCBJbW0pICYmIChJbW0gPT0gMCkpIHsKKyAgICAgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTiwgMCksIE4tPmdldE9wZXJhbmQoMSkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIElTRDo6T1IgZG9lc24ndCBnZXQgYWxsIHRoZSBiaXRmaWVsZCBpbnNlcnRpb24gZnVuLgorICAgIC8vIChhbmQgKG9yIHgsIGMxKSwgYzIpIHdoZXJlIGlzUnVuT2ZPbmVzKH4oYzFeYzIpKSBpcyBhIGJpdGZpZWxkIGluc2VydAorICAgIGlmIChpc0ludDMySW1tZWRpYXRlKE4tPmdldE9wZXJhbmQoMSksIEltbSkgJiYgCisgICAgICAgIE4tPmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpPUiAmJgorICAgICAgICBpc0ludDMySW1tZWRpYXRlKE4tPmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgxKSwgSW1tMikpIHsKKyAgICAgIHVuc2lnbmVkIE1CLCBNRTsKKyAgICAgIEltbSA9IH4oSW1tXkltbTIpOworICAgICAgaWYgKGlzUnVuT2ZPbmVzKEltbSwgTUIsIE1FKSkgeworICAgICAgICBTRFZhbHVlIE9wc1tdID0geyBOLT5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbSgwKSwgZ2V0STMySW1tKE1CKSxnZXRJMzJJbW0oTUUpIH07CisgICAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFBQQzo6UkxXSU1JLCBkbCwgTVZUOjppMzIsIE9wcywgNSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpPUjoKKyAgICBpZiAoTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTMyKQorICAgICAgaWYgKFNETm9kZSAqSSA9IFNlbGVjdEJpdGZpZWxkSW5zZXJ0KE4pKQorICAgICAgICByZXR1cm4gSTsKKyAgICAgIAorICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICBjYXNlIElTRDo6U0hMOiB7CisgICAgdW5zaWduZWQgSW1tLCBTSCwgTUIsIE1FOworICAgIGlmIChpc09wY1dpdGhJbnRJbW1lZGlhdGUoTi0+Z2V0T3BlcmFuZCgwKS5nZXROb2RlKCksIElTRDo6QU5ELCBJbW0pICYmCisgICAgICAgIGlzUm90YXRlQW5kTWFzayhOLCBJbW0sIHRydWUsIFNILCBNQiwgTUUpKSB7CisgICAgICBTRFZhbHVlIE9wc1tdID0geyBOLT5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbShTSCksIGdldEkzMkltbShNQiksIGdldEkzMkltbShNRSkgfTsKKyAgICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBQUEM6OlJMV0lOTSwgTVZUOjppMzIsIE9wcywgNCk7CisgICAgfQorICAgIAorICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTUkw6IHsKKyAgICB1bnNpZ25lZCBJbW0sIFNILCBNQiwgTUU7CisgICAgaWYgKGlzT3BjV2l0aEludEltbWVkaWF0ZShOLT5nZXRPcGVyYW5kKDApLmdldE5vZGUoKSwgSVNEOjpBTkQsIEltbSkgJiYKKyAgICAgICAgaXNSb3RhdGVBbmRNYXNrKE4sIEltbSwgdHJ1ZSwgU0gsIE1CLCBNRSkpIHsgCisgICAgICBTRFZhbHVlIE9wc1tdID0geyBOLT5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEkzMkltbShTSCksIGdldEkzMkltbShNQiksIGdldEkzMkltbShNRSkgfTsKKyAgICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBQUEM6OlJMV0lOTSwgTVZUOjppMzIsIE9wcywgNCk7CisgICAgfQorICAgIAorICAgIC8vIE90aGVyIGNhc2VzIGFyZSBhdXRvZ2VuZXJhdGVkLgorICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6IHsKKyAgICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oTi0+Z2V0T3BlcmFuZCg0KSktPmdldCgpOworICAgIAorICAgIC8vIEhhbmRsZSB0aGUgc2V0Y2MgY2FzZXMgaGVyZS4gIHNlbGVjdF9jYyBsaHMsIDAsIDEsIDAsIGNjCisgICAgaWYgKENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKk4yQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDIpKSkKKyAgICAgICAgaWYgKENvbnN0YW50U0ROb2RlICpOM0MgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgzKSkpCisgICAgICAgICAgaWYgKE4xQy0+aXNOdWxsVmFsdWUoKSAmJiBOM0MtPmlzTnVsbFZhbHVlKCkgJiYKKyAgICAgICAgICAgICAgTjJDLT5nZXRaRXh0VmFsdWUoKSA9PSAxVUxMICYmIENDID09IElTRDo6U0VUTkUgJiYKKyAgICAgICAgICAgICAgLy8gRklYTUU6IEltcGxlbWVudCB0aGlzIG9wdHpuIGZvciBQUEM2NC4KKyAgICAgICAgICAgICAgTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTMyKSB7CisgICAgICAgICAgICBTRE5vZGUgKlRtcCA9CisgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoUFBDOjpBRERJQywgZGwsIE1WVDo6aTMyLCBNVlQ6OkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgwKSwgZ2V0STMySW1tKH4wVSkpOworICAgICAgICAgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIFBQQzo6U1VCRkUsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVG1wLCAwKSwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKFRtcCwgMSkpOworICAgICAgICAgIH0KKworICAgIFNEVmFsdWUgQ0NSZWcgPSBTZWxlY3RDQyhOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDEpLCBDQywgZGwpOworICAgIHVuc2lnbmVkIEJST3BjID0gZ2V0UHJlZGljYXRlRm9yU2V0Q0MoQ0MpOworCisgICAgdW5zaWduZWQgU2VsZWN0Q0NPcDsKKyAgICBpZiAoTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTMyKQorICAgICAgU2VsZWN0Q0NPcCA9IFBQQzo6U0VMRUNUX0NDX0k0OworICAgIGVsc2UgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6Omk2NCkKKyAgICAgIFNlbGVjdENDT3AgPSBQUEM6OlNFTEVDVF9DQ19JODsKKyAgICBlbHNlIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjpmMzIpCisgICAgICBTZWxlY3RDQ09wID0gUFBDOjpTRUxFQ1RfQ0NfRjQ7CisgICAgZWxzZSBpZiAoTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6ZjY0KQorICAgICAgU2VsZWN0Q0NPcCA9IFBQQzo6U0VMRUNUX0NDX0Y4OworICAgIGVsc2UKKyAgICAgIFNlbGVjdENDT3AgPSBQUEM6OlNFTEVDVF9DQ19WUlJDOworCisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgQ0NSZWcsIE4tPmdldE9wZXJhbmQoMiksIE4tPmdldE9wZXJhbmQoMyksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRJMzJJbW0oQlJPcGMpIH07CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIFNlbGVjdENDT3AsIE4tPmdldFZhbHVlVHlwZSgwKSwgT3BzLCA0KTsKKyAgfQorICBjYXNlIFBQQ0lTRDo6Q09ORF9CUkFOQ0g6IHsKKyAgICAvLyBPcCAjMCBpcyB0aGUgQ2hhaW4uCisgICAgLy8gT3AgIzEgaXMgdGhlIFBQQzo6UFJFRF8qIG51bWJlci4KKyAgICAvLyBPcCAjMiBpcyB0aGUgQ1IjCisgICAgLy8gT3AgIzMgaXMgdGhlIERlc3QgTUJCCisgICAgLy8gT3AgIzQgaXMgdGhlIEZsYWcuCisgICAgLy8gUHJldmVudCBQUEM6OlBSRURfKiBmcm9tIGJlaW5nIHNlbGVjdGVkIGludG8gTEkuCisgICAgU0RWYWx1ZSBQcmVkID0KKyAgICAgIGdldEkzMkltbShjYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCkpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IFByZWQsIE4tPmdldE9wZXJhbmQoMiksIE4tPmdldE9wZXJhbmQoMyksCisgICAgICBOLT5nZXRPcGVyYW5kKDApLCBOLT5nZXRPcGVyYW5kKDQpIH07CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIFBQQzo6QkNDLCBNVlQ6Ok90aGVyLCBPcHMsIDUpOworICB9CisgIGNhc2UgSVNEOjpCUl9DQzogeworICAgIElTRDo6Q29uZENvZGUgQ0MgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKS0+Z2V0KCk7CisgICAgU0RWYWx1ZSBDb25kQ29kZSA9IFNlbGVjdENDKE4tPmdldE9wZXJhbmQoMiksIE4tPmdldE9wZXJhbmQoMyksIENDLCBkbCk7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgZ2V0STMySW1tKGdldFByZWRpY2F0ZUZvclNldENDKENDKSksIENvbmRDb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoNCksIE4tPmdldE9wZXJhbmQoMCkgfTsKKyAgICByZXR1cm4gQ3VyREFHLT5TZWxlY3ROb2RlVG8oTiwgUFBDOjpCQ0MsIE1WVDo6T3RoZXIsIE9wcywgNCk7CisgIH0KKyAgY2FzZSBJU0Q6OkJSSU5EOiB7CisgICAgLy8gRklYTUU6IFNob3VsZCBjdXN0b20gbG93ZXIgdGhpcy4KKyAgICBTRFZhbHVlIENoYWluID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIFRhcmdldCA9IE4tPmdldE9wZXJhbmQoMSk7CisgICAgdW5zaWduZWQgT3BjID0gVGFyZ2V0LmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTMyID8gUFBDOjpNVENUUiA6IFBQQzo6TVRDVFI4OworICAgIENoYWluID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wYywgZGwsIE1WVDo6T3RoZXIsIFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbiksIDApOworICAgIHJldHVybiBDdXJEQUctPlNlbGVjdE5vZGVUbyhOLCBQUEM6OkJDVFIsIE1WVDo6T3RoZXIsIENoYWluKTsKKyAgfQorICB9CisgIAorICByZXR1cm4gU2VsZWN0Q29kZShOKTsKK30KKworCisKKy8vLyBjcmVhdGVQUENJU2VsRGFnIC0gVGhpcyBwYXNzIGNvbnZlcnRzIGEgbGVnYWxpemVkIERBRyBpbnRvIGEgCisvLy8gUG93ZXJQQy1zcGVjaWZpYyBEQUcsIHJlYWR5IGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorLy8vCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZVBQQ0lTZWxEYWcoUFBDVGFyZ2V0TWFjaGluZSAmVE0pIHsKKyAgcmV0dXJuIG5ldyBQUENEQUdUb0RBR0lTZWwoVE0pOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSVNlbExvd2VyaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJU2VsTG93ZXJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDFiMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSVNlbExvd2VyaW5nLmNwcApAQCAtMCwwICsxLDU2MDYgQEAKKy8vPT09LS0gUFBDSVNlbExvd2VyaW5nLmNwcCAtIFBQQyBEQUcgTG93ZXJpbmcgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFBQQ0lTZWxMb3dlcmluZyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiUFBDSVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiUFBDTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgIlBQQ1BlcmZlY3RTaHVmZmxlLmgiCisjaW5jbHVkZSAiUFBDUHJlZGljYXRlcy5oIgorI2luY2x1ZGUgIlBQQ1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9WZWN0b3JFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZUltcGwuaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBib29sIENDX1BQQ19TVlI0X0N1c3RvbV9EdW1teSh1bnNpZ25lZCAmVmFsTm8sIEVWVCAmVmFsVlQsIEVWVCAmTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5ICZBcmdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1N0YXRlICZTdGF0ZSk7CitzdGF0aWMgYm9vbCBDQ19QUENfU1ZSNF9DdXN0b21fQWxpZ25BcmdSZWdzKHVuc2lnbmVkICZWYWxObywgRVZUICZWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUICZMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSAmQXJnRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU3RhdGUgJlN0YXRlKTsKK3N0YXRpYyBib29sIENDX1BQQ19TVlI0X0N1c3RvbV9BbGlnbkZQQXJnUmVncyh1bnNpZ25lZCAmVmFsTm8sIEVWVCAmVmFsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUICZMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyAmTG9jSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgJkFyZ0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU3RhdGUgJlN0YXRlKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRW5hYmxlUFBDUHJlaW5jKCJlbmFibGUtcHBjLXByZWluYyIsCitjbDo6ZGVzYygiZW5hYmxlIHByZWluY3JlbWVudCBsb2FkL3N0b3JlIGdlbmVyYXRpb24gb24gUFBDIChleHBlcmltZW50YWwpIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OkhpZGRlbik7CisKK3N0YXRpYyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgKkNyZWF0ZVRMT0YoY29uc3QgUFBDVGFyZ2V0TWFjaGluZSAmVE0pIHsKKyAgaWYgKFRNLmdldFN1YnRhcmdldEltcGwoKS0+aXNEYXJ3aW4oKSkKKyAgICByZXR1cm4gbmV3IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZU1hY2hPKCk7CisKKyAgcmV0dXJuIG5ldyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEYoKTsKK30KKworUFBDVGFyZ2V0TG93ZXJpbmc6OlBQQ1RhcmdldExvd2VyaW5nKFBQQ1RhcmdldE1hY2hpbmUgJlRNKQorICA6IFRhcmdldExvd2VyaW5nKFRNLCBDcmVhdGVUTE9GKFRNKSksIFBQQ1N1YlRhcmdldCgqVE0uZ2V0U3VidGFyZ2V0SW1wbCgpKSB7CisKKyAgc2V0UG93MkRpdklzQ2hlYXAoKTsKKworICAvLyBVc2UgX3NldGptcC9fbG9uZ2ptcCBpbnN0ZWFkIG9mIHNldGptcC9sb25nam1wLgorICBzZXRVc2VVbmRlcnNjb3JlU2V0Sm1wKHRydWUpOworICBzZXRVc2VVbmRlcnNjb3JlTG9uZ0ptcCh0cnVlKTsKKworICAvLyBTZXQgdXAgdGhlIHJlZ2lzdGVyIGNsYXNzZXMuCisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppMzIsIFBQQzo6R1BSQ1JlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjMyLCBQUEM6OkY0UkNSZWdpc3RlckNsYXNzKTsKKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmY2NCwgUFBDOjpGOFJDUmVnaXN0ZXJDbGFzcyk7CisKKyAgLy8gUG93ZXJQQyBoYXMgYW4gaTE2IGJ1dCBubyBpOCAob3IgaTEpIFNFWFRMT0FECisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpTRVhUTE9BRCwgTVZUOjppMSwgUHJvbW90ZSk7CisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpTRVhUTE9BRCwgTVZUOjppOCwgRXhwYW5kKTsKKworICBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVDo6ZjY0LCBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICAvLyBQb3dlclBDIGhhcyBwcmUtaW5jIGxvYWQgYW5kIHN0b3JlJ3MuCisgIHNldEluZGV4ZWRMb2FkQWN0aW9uKElTRDo6UFJFX0lOQywgTVZUOjppMSwgTGVnYWwpOworICBzZXRJbmRleGVkTG9hZEFjdGlvbihJU0Q6OlBSRV9JTkMsIE1WVDo6aTgsIExlZ2FsKTsKKyAgc2V0SW5kZXhlZExvYWRBY3Rpb24oSVNEOjpQUkVfSU5DLCBNVlQ6OmkxNiwgTGVnYWwpOworICBzZXRJbmRleGVkTG9hZEFjdGlvbihJU0Q6OlBSRV9JTkMsIE1WVDo6aTMyLCBMZWdhbCk7CisgIHNldEluZGV4ZWRMb2FkQWN0aW9uKElTRDo6UFJFX0lOQywgTVZUOjppNjQsIExlZ2FsKTsKKyAgc2V0SW5kZXhlZFN0b3JlQWN0aW9uKElTRDo6UFJFX0lOQywgTVZUOjppMSwgTGVnYWwpOworICBzZXRJbmRleGVkU3RvcmVBY3Rpb24oSVNEOjpQUkVfSU5DLCBNVlQ6Omk4LCBMZWdhbCk7CisgIHNldEluZGV4ZWRTdG9yZUFjdGlvbihJU0Q6OlBSRV9JTkMsIE1WVDo6aTE2LCBMZWdhbCk7CisgIHNldEluZGV4ZWRTdG9yZUFjdGlvbihJU0Q6OlBSRV9JTkMsIE1WVDo6aTMyLCBMZWdhbCk7CisgIHNldEluZGV4ZWRTdG9yZUFjdGlvbihJU0Q6OlBSRV9JTkMsIE1WVDo6aTY0LCBMZWdhbCk7CisKKyAgLy8gVGhpcyBpcyB1c2VkIGluIHRoZSBwcGNmMTI4LT5pbnQgc2VxdWVuY2UuICBOb3RlIGl0IGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzCisgIC8vIGZyb20gRlBfUk9VTkQ6ICB0aGF0IHJvdW5kcyB0byBuZWFyZXN0LCB0aGlzIHJvdW5kcyB0byB6ZXJvLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9ST1VORF9JTlJFRywgTVZUOjpwcGNmMTI4LCBDdXN0b20pOworCisgIC8vIFBvd2VyUEMgaGFzIG5vIFNSRU0vVVJFTSBpbnN0cnVjdGlvbnMKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVSRU0sIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkVNLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VVJFTSwgTVZUOjppNjQsIEV4cGFuZCk7CisKKyAgLy8gRG9uJ3QgdXNlIFNNVUxfTE9ISS9VTVVMX0xPSEkgb3IgU0RJVlJFTS9VRElWUkVNIHRvIGxvd2VyIFNSRU0vVVJFTS4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU1VTF9MT0hJLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTF9MT0hJLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJVlJFTSwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVZSRU0sIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWUkVNLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0RJVlJFTSwgTVZUOjppNjQsIEV4cGFuZCk7CisKKyAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBzaW4vY29zL3NxcnQvZm1vZC9wb3cKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNJTiAsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TICwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSRU0gLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBPVyAsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU0lOICwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1MgLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlJFTSAsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUE9XICwgTVZUOjpmMzIsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxUX1JPVU5EU18sIE1WVDo6aTMyLCBDdXN0b20pOworCisgIC8vIElmIHdlJ3JlIGVuYWJsaW5nIEdQIG9wdGltaXphdGlvbnMsIHVzZSBoYXJkd2FyZSBzcXVhcmUgcm9vdAorICBpZiAoIVRNLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkuaGFzRlNRUlQoKSkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTUVJULCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU1FSVCwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIH0KKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09QWVNJR04sIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09QWVNJR04sIE1WVDo6ZjMyLCBFeHBhbmQpOworCisgIC8vIFBvd2VyUEMgZG9lcyBub3QgaGF2ZSBCU1dBUCwgQ1RQT1Agb3IgQ1RUWgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCU1dBUCwgTVZUOjppMzIgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AsIE1WVDo6aTMyICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUVFogLCBNVlQ6OmkzMiAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCU1dBUCwgTVZUOjppNjQgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AsIE1WVDo6aTY0ICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUVFogLCBNVlQ6Omk2NCAgLCBFeHBhbmQpOworCisgIC8vIFBvd2VyUEMgZG9lcyBub3QgaGF2ZSBST1RSCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlJPVFIsIE1WVDo6aTMyICAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RSLCBNVlQ6Omk2NCAgICwgRXhwYW5kKTsKKworICAvLyBQb3dlclBDIGRvZXMgbm90IGhhdmUgU2VsZWN0CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgTVZUOjpmNjQsIEV4cGFuZCk7CisKKyAgLy8gUG93ZXJQQyB3YW50cyB0byB0dXJuIHNlbGVjdF9jYyBvZiBGUCBpbnRvIGZzZWwgd2hlbiBwb3NzaWJsZS4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUX0NDLCBNVlQ6OmYzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUX0NDLCBNVlQ6OmY2NCwgQ3VzdG9tKTsKKworICAvLyBQb3dlclBDIHdhbnRzIHRvIG9wdGltaXplIGludGVnZXIgc2V0Y2MgYSBiaXQKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MsIE1WVDo6aTMyLCBDdXN0b20pOworCisgIC8vIFBvd2VyUEMgZG9lcyBub3QgaGF2ZSBCUkNPTkQgd2hpY2ggcmVxdWlyZXMgU2V0Q0MKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJDT05ELCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0pULCAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKworICAvLyBQb3dlclBDIHR1cm5zIEZQX1RPX1NJTlQgaW50byBGQ1RJV1ogYW5kIHNvbWUgbG9hZC9zdG9yZXMuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQsIE1WVDo6aTMyLCBDdXN0b20pOworCisgIC8vIFBvd2VyUEMgZG9lcyBub3QgaGF2ZSBbVXxTXUlOVF9UT19GUAorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUlOVF9UT19GUCwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCSVRfQ09OVkVSVCwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJULCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsIE1WVDo6ZjY0LCBFeHBhbmQpOworCisgIC8vIFdlIGNhbm5vdCBzZXh0aW5yZWcoaTEpLiAgRXhwYW5kIHRvIHNoaWZ0cy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTEsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RVhDRVBUSU9OQUREUiwgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkVIU0VMRUNUSU9OLCAgIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFWENFUFRJT05BRERSLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RUhTRUxFQ1RJT04sICAgTVZUOjppMzIsIEV4cGFuZCk7CisKKworICAvLyBXZSB3YW50IHRvIGxlZ2FsaXplIEdsb2JhbEFkZHJlc3MgYW5kIENvbnN0YW50UG9vbCBub2RlcyBpbnRvIHRoZQorICAvLyBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbnMgdG8gbWF0ZXJpYWxpemUgdGhlIGFkZHJlc3MuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbEFkZHJlc3MsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxUTFNBZGRyZXNzLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QmxvY2tBZGRyZXNzLCAgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50UG9vbCwgIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpKdW1wVGFibGUsICAgICBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6R2xvYmFsQWRkcmVzcywgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbFRMU0FkZHJlc3MsIE1WVDo6aTY0LCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCbG9ja0FkZHJlc3MsICBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q29uc3RhbnRQb29sLCAgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okp1bXBUYWJsZSwgICAgIE1WVDo6aTY0LCBDdXN0b20pOworCisgIC8vIFRSQVAgaXMgbGVnYWwuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlRSQVAsIE1WVDo6T3RoZXIsIExlZ2FsKTsKKworICAvLyBUUkFNUE9MSU5FIGlzIGN1c3RvbSBsb3dlcmVkLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpUUkFNUE9MSU5FLCBNVlQ6Ok90aGVyLCBDdXN0b20pOworCisgIC8vIFZBU1RBUlQgbmVlZHMgdG8gYmUgY3VzdG9tIGxvd2VyZWQgdG8gdXNlIHRoZSBWYXJBcmdzRnJhbWVJbmRleAorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQVNUQVJUICAgICAgICAgICAsIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisKKyAgLy8gVkFBUkcgaXMgY3VzdG9tIGxvd2VyZWQgd2l0aCB0aGUgMzItYml0IFNWUjQgQUJJLgorICBpZiAoICAgIFRNLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkuaXNTVlI0QUJJKCkKKyAgICAgICYmICFUTS5nZXRTdWJ0YXJnZXQ8UFBDU3VidGFyZ2V0PigpLmlzUFBDNjQoKSkKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQUFSRywgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKyAgZWxzZQorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBQVJHLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworCisgIC8vIFVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFDT1BZICAgICAgICAgICAgLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQUVORCAgICAgICAgICAgICAsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUQUNLU0FWRSAgICAgICAgICwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RBQ0tSRVNUT1JFICAgICAgLCBNVlQ6Ok90aGVyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0MsIE1WVDo6aTMyICAsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkRZTkFNSUNfU1RBQ0tBTExPQywgTVZUOjppNjQgICwgQ3VzdG9tKTsKKworICAvLyBXZSB3YW50IHRvIGN1c3RvbSBsb3dlciBzb21lIG9mIG91ciBpbnRyaW5zaWNzLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4sIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisKKyAgLy8gQ29tcGFyaXNvbnMgdGhhdCByZXF1aXJlIGNoZWNraW5nIHR3byBjb25kaXRpb25zLgorICBzZXRDb25kQ29kZUFjdGlvbihJU0Q6OlNFVFVMVCwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldENvbmRDb2RlQWN0aW9uKElTRDo6U0VUVUxULCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0Q29uZENvZGVBY3Rpb24oSVNEOjpTRVRVR1QsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRDb25kQ29kZUFjdGlvbihJU0Q6OlNFVFVHVCwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldENvbmRDb2RlQWN0aW9uKElTRDo6U0VUVUVRLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0Q29uZENvZGVBY3Rpb24oSVNEOjpTRVRVRVEsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRDb25kQ29kZUFjdGlvbihJU0Q6OlNFVE9HRSwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldENvbmRDb2RlQWN0aW9uKElTRDo6U0VUT0dFLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0Q29uZENvZGVBY3Rpb24oSVNEOjpTRVRPTEUsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRDb25kQ29kZUFjdGlvbihJU0Q6OlNFVE9MRSwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldENvbmRDb2RlQWN0aW9uKElTRDo6U0VUT05FLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0Q29uZENvZGVBY3Rpb24oSVNEOjpTRVRPTkUsIE1WVDo6ZjY0LCBFeHBhbmQpOworCisgIGlmIChUTS5nZXRTdWJ0YXJnZXQ8UFBDU3VidGFyZ2V0PigpLmhhczY0Qml0U3VwcG9ydCgpKSB7CisgICAgLy8gVGhleSBhbHNvIGhhdmUgaW5zdHJ1Y3Rpb25zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gaTY0IGFuZCBmcC4KKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19TSU5ULCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5ULCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQLCBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgICAvLyBUaGlzIGlzIGp1c3QgdGhlIGxvdyAzMiBiaXRzIG9mIGEgKHNpZ25lZCkgZnAtPmk2NCBjb252ZXJzaW9uLgorICAgIC8vIFdlIGNhbm5vdCBkbyB0aGlzIHdpdGggUHJvbW90ZSBiZWNhdXNlIGk2NCBpcyBub3QgYSBsZWdhbCB0eXBlLgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1VJTlQsIE1WVDo6aTMyLCBDdXN0b20pOworCisgICAgLy8gRklYTUU6IGRpc2FibGUgdGhpcyBsb3dlcmVkIGNvZGUuICBUaGlzIGdlbmVyYXRlcyA2NC1iaXQgcmVnaXN0ZXIgdmFsdWVzLAorICAgIC8vIGFuZCB3ZSBkb24ndCBtb2RlbCB0aGUgZmFjdCB0aGF0IHRoZSB0b3AgcGFydCBpcyBjbG9iYmVyZWQgYnkgY2FsbHMuICBXZQorICAgIC8vIG5lZWQgdG8gZmxhZyB0aGVzZSB0b2dldGhlciBzbyB0aGF0IHRoZSB2YWx1ZSBpc24ndCBsaXZlIGFjcm9zcyBhIGNhbGwuCisgICAgLy9zZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBQb3dlclBDIGRvZXMgbm90IGhhdmUgRlBfVE9fVUlOVCBvbiAzMi1iaXQgaW1wbGVtZW50YXRpb25zLgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1VJTlQsIE1WVDo6aTMyLCBFeHBhbmQpOworICB9CisKKyAgaWYgKFRNLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkudXNlNjRCaXRSZWdzKCkpIHsKKyAgICAvLyA2NC1iaXQgUG93ZXJQQyBpbXBsZW1lbnRhdGlvbnMgY2FuIHN1cHBvcnQgaTY0IHR5cGVzIGRpcmVjdGx5CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6Omk2NCwgUFBDOjpHOFJDUmVnaXN0ZXJDbGFzcyk7CisgICAgLy8gQlVJTERfUEFJUiBjYW4ndCBiZSBoYW5kbGVkIG5hdGl2ZWx5LCBhbmQgc2hvdWxkIGJlIGV4cGFuZGVkIHRvIHNobC9vcgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJVSUxEX1BBSVIsIE1WVDo6aTY0LCBFeHBhbmQpOworICAgIC8vIDY0LWJpdCBQb3dlclBDIHdhbnRzIHRvIGV4cGFuZCBpMTI4IHNoaWZ0cyBpdHNlbGYuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0hMX1BBUlRTLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkFfUEFSVFMsIE1WVDo6aTY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTF9QQVJUUywgTVZUOjppNjQsIEN1c3RvbSk7CisgIH0gZWxzZSB7CisgICAgLy8gMzItYml0IFBvd2VyUEMgd2FudHMgdG8gZXhwYW5kIGk2NCBzaGlmdHMgaXRzZWxmLgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITF9QQVJUUywgTVZUOjppMzIsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JBX1BBUlRTLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkxfUEFSVFMsIE1WVDo6aTMyLCBDdXN0b20pOworICB9CisKKyAgaWYgKFRNLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkuaGFzQWx0aXZlYygpKSB7CisgICAgLy8gRmlyc3Qgc2V0IG9wZXJhdGlvbiBhY3Rpb24gZm9yIGFsbCB2ZWN0b3IgdHlwZXMgdG8gZXhwYW5kLiBUaGVuIHdlCisgICAgLy8gd2lsbCBzZWxlY3RpdmVseSB0dXJuIG9uIG9uZXMgdGhhdCBjYW4gYmUgZWZmZWN0aXZlbHkgY29kZWdlbidkLgorICAgIGZvciAodW5zaWduZWQgaSA9ICh1bnNpZ25lZClNVlQ6OkZJUlNUX1ZFQ1RPUl9WQUxVRVRZUEU7CisgICAgICAgICBpIDw9ICh1bnNpZ25lZClNVlQ6OkxBU1RfVkVDVE9SX1ZBTFVFVFlQRTsgKytpKSB7CisgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlpOworCisgICAgICAvLyBhZGQvc3ViIGFyZSBsZWdhbCBmb3IgYWxsIHN1cHBvcnRlZCB2ZWN0b3IgVlQncy4KKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFERCAsIFZULCBMZWdhbCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIgLCBWVCwgTGVnYWwpOworCisgICAgICAvLyBXZSBwcm9tb3RlIGFsbCBzaHVmZmxlcyB0byB2MTZpOC4KKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLCBWVCwgUHJvbW90ZSk7CisgICAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpWRUNUT1JfU0hVRkZMRSwgVlQsIE1WVDo6djE2aTgpOworCisgICAgICAvLyBXZSBwcm9tb3RlIGFsbCBub24tdHlwZWQgb3BlcmF0aW9ucyB0byB2NGkzMi4KKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFORCAgICwgVlQsIFByb21vdGUpOworICAgICAgQWRkUHJvbW90ZWRUb1R5cGUgKElTRDo6QU5EICAgLCBWVCwgTVZUOjp2NGkzMik7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpPUiAgICAsIFZULCBQcm9tb3RlKTsKKyAgICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6Ok9SICAgICwgVlQsIE1WVDo6djRpMzIpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6WE9SICAgLCBWVCwgUHJvbW90ZSk7CisgICAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpYT1IgICAsIFZULCBNVlQ6OnY0aTMyKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkxPQUQgICwgVlQsIFByb21vdGUpOworICAgICAgQWRkUHJvbW90ZWRUb1R5cGUgKElTRDo6TE9BRCAgLCBWVCwgTVZUOjp2NGkzMik7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsIFZULCBQcm9tb3RlKTsKKyAgICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OlNFTEVDVCwgVlQsIE1WVDo6djRpMzIpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RPUkUsIFZULCBQcm9tb3RlKTsKKyAgICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OlNUT1JFLCBWVCwgTVZUOjp2NGkzMik7CisKKyAgICAgIC8vIE5vIG90aGVyIG9wZXJhdGlvbnMgYXJlIGxlZ2FsLgorICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMICwgVlQsIEV4cGFuZCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWLCBWVCwgRXhwYW5kKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSRU0sIFZULCBFeHBhbmQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgVlQsIEV4cGFuZCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCBWVCwgRXhwYW5kKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZESVYsIFZULCBFeHBhbmQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Rk5FRywgVlQsIEV4cGFuZCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIFZULCBFeHBhbmQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIFZULCBFeHBhbmQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlVJTERfVkVDVE9SLCBWVCwgRXhwYW5kKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVNVUxfTE9ISSwgVlQsIEV4cGFuZCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTTVVMX0xPSEksIFZULCBFeHBhbmQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJVlJFTSwgVlQsIEV4cGFuZCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWUkVNLCBWVCwgRXhwYW5kKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIFZULCBFeHBhbmQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBPVywgVlQsIEV4cGFuZCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFBPUCwgVlQsIEV4cGFuZCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaLCBWVCwgRXhwYW5kKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUVFosIFZULCBFeHBhbmQpOworICAgIH0KKworICAgIC8vIFdlIGNhbiBjdXN0b20gZXhwYW5kIGFsbCBWRUNUT1JfU0hVRkZMRXMgdG8gVlBFUk0sIG90aGVycyB3ZSBjYW4gaGFuZGxlCisgICAgLy8gd2l0aCBtZXJnZXMsIHNwbGF0cywgZXRjLgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLCBNVlQ6OnYxNmk4LCBDdXN0b20pOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QU5EICAgLCBNVlQ6OnY0aTMyLCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6T1IgICAgLCBNVlQ6OnY0aTMyLCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6WE9SICAgLCBNVlQ6OnY0aTMyLCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCAgLCBNVlQ6OnY0aTMyLCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCBNVlQ6OnY0aTMyLCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUT1JFICwgTVZUOjp2NGkzMiwgTGVnYWwpOworCisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnY0ZjMyLCBQUEM6OlZSUkNSZWdpc3RlckNsYXNzKTsKKyAgICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6djRpMzIsIFBQQzo6VlJSQ1JlZ2lzdGVyQ2xhc3MpOworICAgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjp2OGkxNiwgUFBDOjpWUlJDUmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnYxNmk4LCBQUEM6OlZSUkNSZWdpc3RlckNsYXNzKTsKKworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTCwgTVZUOjp2NGYzMiwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTCwgTVZUOjp2NGkzMiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUwsIE1WVDo6djhpMTYsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMLCBNVlQ6OnYxNmk4LCBDdXN0b20pOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgTVZUOjp2NGYzMiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBNVlQ6OnY0aTMyLCBDdXN0b20pOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlVJTERfVkVDVE9SLCBNVlQ6OnYxNmk4LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJVSUxEX1ZFQ1RPUiwgTVZUOjp2OGkxNiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCVUlMRF9WRUNUT1IsIE1WVDo6djRpMzIsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlVJTERfVkVDVE9SLCBNVlQ6OnY0ZjMyLCBDdXN0b20pOworICB9CisKKyAgc2V0U2hpZnRBbW91bnRUeXBlKE1WVDo6aTMyKTsKKyAgc2V0Qm9vbGVhbkNvbnRlbnRzKFplcm9Pck9uZUJvb2xlYW5Db250ZW50KTsKKworICBpZiAoVE0uZ2V0U3VidGFyZ2V0PFBQQ1N1YnRhcmdldD4oKS5pc1BQQzY0KCkpIHsKKyAgICBzZXRTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUoUFBDOjpYMSk7CisgICAgc2V0RXhjZXB0aW9uUG9pbnRlclJlZ2lzdGVyKFBQQzo6WDMpOworICAgIHNldEV4Y2VwdGlvblNlbGVjdG9yUmVnaXN0ZXIoUFBDOjpYNCk7CisgIH0gZWxzZSB7CisgICAgc2V0U3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlKFBQQzo6UjEpOworICAgIHNldEV4Y2VwdGlvblBvaW50ZXJSZWdpc3RlcihQUEM6OlIzKTsKKyAgICBzZXRFeGNlcHRpb25TZWxlY3RvclJlZ2lzdGVyKFBQQzo6UjQpOworICB9CisKKyAgLy8gV2UgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgZGFnIGNvbWJpbmUgcGF0dGVybnMgZm9yIHRoZSBmb2xsb3dpbmcgbm9kZXM6CisgIHNldFRhcmdldERBR0NvbWJpbmUoSVNEOjpTSU5UX1RPX0ZQKTsKKyAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OlNUT1JFKTsKKyAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OkJSX0NDKTsKKyAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OkJTV0FQKTsKKworICAvLyBEYXJ3aW4gbG9uZyBkb3VibGUgbWF0aCBsaWJyYXJ5IGZ1bmN0aW9ucyBoYXZlICRMREJMMTI4IGFwcGVuZGVkLgorICBpZiAoVE0uZ2V0U3VidGFyZ2V0PFBQQ1N1YnRhcmdldD4oKS5pc0RhcndpbigpKSB7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkNPU19QUENGMTI4LCAiY29zbCRMREJMMTI4Iik7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlBPV19QUENGMTI4LCAicG93bCRMREJMMTI4Iik7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlJFTV9QUENGMTI4LCAiZm1vZGwkTERCTDEyOCIpOworICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTSU5fUFBDRjEyOCwgInNpbmwkTERCTDEyOCIpOworICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTUVJUX1BQQ0YxMjgsICJzcXJ0bCRMREJMMTI4Iik7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkxPR19QUENGMTI4LCAibG9nbCRMREJMMTI4Iik7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkxPRzJfUFBDRjEyOCwgImxvZzJsJExEQkwxMjgiKTsKKyAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6TE9HMTBfUFBDRjEyOCwgImxvZzEwbCRMREJMMTI4Iik7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkVYUF9QUENGMTI4LCAiZXhwbCRMREJMMTI4Iik7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OkVYUDJfUFBDRjEyOCwgImV4cDJsJExEQkwxMjgiKTsKKyAgfQorCisgIGNvbXB1dGVSZWdpc3RlclByb3BlcnRpZXMoKTsKK30KKworLy8vIGdldEJ5VmFsVHlwZUFsaWdubWVudCAtIFJldHVybiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQgZm9yIEJ5VmFsIGFnZ3JlZ2F0ZQorLy8vIGZ1bmN0aW9uIGFyZ3VtZW50cyBpbiB0aGUgY2FsbGVyIHBhcmFtZXRlciBhcmVhLgordW5zaWduZWQgUFBDVGFyZ2V0TG93ZXJpbmc6OmdldEJ5VmFsVHlwZUFsaWdubWVudChjb25zdCBUeXBlICpUeSkgY29uc3QgeworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IGdldFRhcmdldE1hY2hpbmUoKTsKKyAgLy8gRGFyd2luIHBhc3NlcyBldmVyeXRoaW5nIG9uIDQgYnl0ZSBib3VuZGFyeS4KKyAgaWYgKFRNLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkuaXNEYXJ3aW4oKSkKKyAgICByZXR1cm4gNDsKKyAgLy8gRklYTUUgU1ZSNCBUQkQKKyAgcmV0dXJuIDQ7Cit9CisKK2NvbnN0IGNoYXIgKlBQQ1RhcmdldExvd2VyaW5nOjpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogcmV0dXJuIDA7CisgIGNhc2UgUFBDSVNEOjpGU0VMOiAgICAgICAgICAgIHJldHVybiAiUFBDSVNEOjpGU0VMIjsKKyAgY2FzZSBQUENJU0Q6OkZDRklEOiAgICAgICAgICAgcmV0dXJuICJQUENJU0Q6OkZDRklEIjsKKyAgY2FzZSBQUENJU0Q6OkZDVElEWjogICAgICAgICAgcmV0dXJuICJQUENJU0Q6OkZDVElEWiI7CisgIGNhc2UgUFBDSVNEOjpGQ1RJV1o6ICAgICAgICAgIHJldHVybiAiUFBDSVNEOjpGQ1RJV1oiOworICBjYXNlIFBQQ0lTRDo6U1RGSVdYOiAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6U1RGSVdYIjsKKyAgY2FzZSBQUENJU0Q6OlZNQURERlA6ICAgICAgICAgcmV0dXJuICJQUENJU0Q6OlZNQURERlAiOworICBjYXNlIFBQQ0lTRDo6Vk5NU1VCRlA6ICAgICAgICByZXR1cm4gIlBQQ0lTRDo6Vk5NU1VCRlAiOworICBjYXNlIFBQQ0lTRDo6VlBFUk06ICAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6VlBFUk0iOworICBjYXNlIFBQQ0lTRDo6SGk6ICAgICAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6SGkiOworICBjYXNlIFBQQ0lTRDo6TG86ICAgICAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6TG8iOworICBjYXNlIFBQQ0lTRDo6VE9DX0VOVFJZOiAgICAgICByZXR1cm4gIlBQQ0lTRDo6VE9DX0VOVFJZIjsKKyAgY2FzZSBQUENJU0Q6OlRPQ19SRVNUT1JFOiAgICAgcmV0dXJuICJQUENJU0Q6OlRPQ19SRVNUT1JFIjsKKyAgY2FzZSBQUENJU0Q6OkxPQUQ6ICAgICAgICAgICAgcmV0dXJuICJQUENJU0Q6OkxPQUQiOworICBjYXNlIFBQQ0lTRDo6TE9BRF9UT0M6ICAgICAgICByZXR1cm4gIlBQQ0lTRDo6TE9BRF9UT0MiOworICBjYXNlIFBQQ0lTRDo6RFlOQUxMT0M6ICAgICAgICByZXR1cm4gIlBQQ0lTRDo6RFlOQUxMT0MiOworICBjYXNlIFBQQ0lTRDo6R2xvYmFsQmFzZVJlZzogICByZXR1cm4gIlBQQ0lTRDo6R2xvYmFsQmFzZVJlZyI7CisgIGNhc2UgUFBDSVNEOjpTUkw6ICAgICAgICAgICAgIHJldHVybiAiUFBDSVNEOjpTUkwiOworICBjYXNlIFBQQ0lTRDo6U1JBOiAgICAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6U1JBIjsKKyAgY2FzZSBQUENJU0Q6OlNITDogICAgICAgICAgICAgcmV0dXJuICJQUENJU0Q6OlNITCI7CisgIGNhc2UgUFBDSVNEOjpFWFRTV18zMjogICAgICAgIHJldHVybiAiUFBDSVNEOjpFWFRTV18zMiI7CisgIGNhc2UgUFBDSVNEOjpTVERfMzI6ICAgICAgICAgIHJldHVybiAiUFBDSVNEOjpTVERfMzIiOworICBjYXNlIFBQQ0lTRDo6Q0FMTF9TVlI0OiAgICAgICByZXR1cm4gIlBQQ0lTRDo6Q0FMTF9TVlI0IjsKKyAgY2FzZSBQUENJU0Q6OkNBTExfRGFyd2luOiAgICAgcmV0dXJuICJQUENJU0Q6OkNBTExfRGFyd2luIjsKKyAgY2FzZSBQUENJU0Q6Ok5PUDogICAgICAgICAgICAgcmV0dXJuICJQUENJU0Q6Ok5PUCI7CisgIGNhc2UgUFBDSVNEOjpNVENUUjogICAgICAgICAgIHJldHVybiAiUFBDSVNEOjpNVENUUiI7CisgIGNhc2UgUFBDSVNEOjpCQ1RSTF9EYXJ3aW46ICAgIHJldHVybiAiUFBDSVNEOjpCQ1RSTF9EYXJ3aW4iOworICBjYXNlIFBQQ0lTRDo6QkNUUkxfU1ZSNDogICAgICByZXR1cm4gIlBQQ0lTRDo6QkNUUkxfU1ZSNCI7CisgIGNhc2UgUFBDSVNEOjpSRVRfRkxBRzogICAgICAgIHJldHVybiAiUFBDSVNEOjpSRVRfRkxBRyI7CisgIGNhc2UgUFBDSVNEOjpNRkNSOiAgICAgICAgICAgIHJldHVybiAiUFBDSVNEOjpNRkNSIjsKKyAgY2FzZSBQUENJU0Q6OlZDTVA6ICAgICAgICAgICAgcmV0dXJuICJQUENJU0Q6OlZDTVAiOworICBjYXNlIFBQQ0lTRDo6VkNNUG86ICAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6VkNNUG8iOworICBjYXNlIFBQQ0lTRDo6TEJSWDogICAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6TEJSWCI7CisgIGNhc2UgUFBDSVNEOjpTVEJSWDogICAgICAgICAgIHJldHVybiAiUFBDSVNEOjpTVEJSWCI7CisgIGNhc2UgUFBDSVNEOjpMQVJYOiAgICAgICAgICAgIHJldHVybiAiUFBDSVNEOjpMQVJYIjsKKyAgY2FzZSBQUENJU0Q6OlNUQ1g6ICAgICAgICAgICAgcmV0dXJuICJQUENJU0Q6OlNUQ1giOworICBjYXNlIFBQQ0lTRDo6Q09ORF9CUkFOQ0g6ICAgICByZXR1cm4gIlBQQ0lTRDo6Q09ORF9CUkFOQ0giOworICBjYXNlIFBQQ0lTRDo6TUZGUzogICAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6TUZGUyI7CisgIGNhc2UgUFBDSVNEOjpNVEZTQjA6ICAgICAgICAgIHJldHVybiAiUFBDSVNEOjpNVEZTQjAiOworICBjYXNlIFBQQ0lTRDo6TVRGU0IxOiAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6TVRGU0IxIjsKKyAgY2FzZSBQUENJU0Q6OkZBRERSVFo6ICAgICAgICAgcmV0dXJuICJQUENJU0Q6OkZBRERSVFoiOworICBjYXNlIFBQQ0lTRDo6TVRGU0Y6ICAgICAgICAgICByZXR1cm4gIlBQQ0lTRDo6TVRGU0YiOworICBjYXNlIFBQQ0lTRDo6VENfUkVUVVJOOiAgICAgICByZXR1cm4gIlBQQ0lTRDo6VENfUkVUVVJOIjsKKyAgfQorfQorCitNVlQ6OlNpbXBsZVZhbHVlVHlwZSBQUENUYXJnZXRMb3dlcmluZzo6Z2V0U2V0Q0NSZXN1bHRUeXBlKEVWVCBWVCkgY29uc3QgeworICByZXR1cm4gTVZUOjppMzI7Cit9CisKKy8vLyBnZXRGdW5jdGlvbkFsaWdubWVudCAtIFJldHVybiB0aGUgTG9nMiBhbGlnbm1lbnQgb2YgdGhpcyBmdW5jdGlvbi4KK3Vuc2lnbmVkIFBQQ1RhcmdldExvd2VyaW5nOjpnZXRGdW5jdGlvbkFsaWdubWVudChjb25zdCBGdW5jdGlvbiAqRikgY29uc3QgeworICBpZiAoZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkuaXNEYXJ3aW4oKSkKKyAgICByZXR1cm4gRi0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6T3B0aW1pemVGb3JTaXplKSA/IDIgOiA0OworICBlbHNlCisgICAgcmV0dXJuIDI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBOb2RlIG1hdGNoaW5nIHByZWRpY2F0ZXMsIGZvciB1c2UgYnkgdGhlIHRibGdlbiBtYXRjaGluZyBjb2RlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGlzRmxvYXRpbmdQb2ludFplcm8gLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIDAuMCBvciAtMC4wLgorc3RhdGljIGJvb2wgaXNGbG9hdGluZ1BvaW50WmVybyhTRFZhbHVlIE9wKSB7CisgIGlmIChDb25zdGFudEZQU0ROb2RlICpDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihPcCkpCisgICAgcmV0dXJuIENGUC0+Z2V0VmFsdWVBUEYoKS5pc1plcm8oKTsKKyAgZWxzZSBpZiAoSVNEOjppc0VYVExvYWQoT3AuZ2V0Tm9kZSgpKSB8fCBJU0Q6OmlzTk9OX0VYVExvYWQoT3AuZ2V0Tm9kZSgpKSkgeworICAgIC8vIE1heWJlIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBsZWdhbGl6ZWQgaW50byB0aGUgY29uc3RhbnQgcG9vbD8KKyAgICBpZiAoQ29uc3RhbnRQb29sU0ROb2RlICpDUCA9IGR5bl9jYXN0PENvbnN0YW50UG9vbFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSkpCisgICAgICBpZiAoY29uc3QgQ29uc3RhbnRGUCAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oQ1AtPmdldENvbnN0VmFsKCkpKQorICAgICAgICByZXR1cm4gQ0ZQLT5nZXRWYWx1ZUFQRigpLmlzWmVybygpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzQ29uc3RhbnRPclVuZGVmIC0gT3AgaXMgZWl0aGVyIGFuIHVuZGVmIG5vZGUgb3IgYSBDb25zdGFudFNETm9kZS4gIFJldHVybgorLy8vIHRydWUgaWYgT3AgaXMgdW5kZWYgb3IgaWYgaXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHZhbHVlLgorc3RhdGljIGJvb2wgaXNDb25zdGFudE9yVW5kZWYoaW50IE9wLCBpbnQgVmFsKSB7CisgIHJldHVybiBPcCA8IDAgfHwgT3AgPT0gVmFsOworfQorCisvLy8gaXNWUEtVSFVNU2h1ZmZsZU1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzaHVmZmxlIG1hc2sgZm9yIGEKKy8vLyBWUEtVSFVNIGluc3RydWN0aW9uLgorYm9vbCBQUEM6OmlzVlBLVUhVTVNodWZmbGVNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4sIGJvb2wgaXNVbmFyeSkgeworICBpZiAoIWlzVW5hcnkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDE2OyArK2kpCisgICAgICBpZiAoIWlzQ29uc3RhbnRPclVuZGVmKE4tPmdldE1hc2tFbHQoaSksICBpKjIrMSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDg7ICsraSkKKyAgICAgIGlmICghaXNDb25zdGFudE9yVW5kZWYoTi0+Z2V0TWFza0VsdChpKSwgICAgaSoyKzEpIHx8CisgICAgICAgICAgIWlzQ29uc3RhbnRPclVuZGVmKE4tPmdldE1hc2tFbHQoaSs4KSwgIGkqMisxKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gaXNWUEtVV1VNU2h1ZmZsZU1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzaHVmZmxlIG1hc2sgZm9yIGEKKy8vLyBWUEtVV1VNIGluc3RydWN0aW9uLgorYm9vbCBQUEM6OmlzVlBLVVdVTVNodWZmbGVNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4sIGJvb2wgaXNVbmFyeSkgeworICBpZiAoIWlzVW5hcnkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDE2OyBpICs9IDIpCisgICAgICBpZiAoIWlzQ29uc3RhbnRPclVuZGVmKE4tPmdldE1hc2tFbHQoaSAgKSwgIGkqMisyKSB8fAorICAgICAgICAgICFpc0NvbnN0YW50T3JVbmRlZihOLT5nZXRNYXNrRWx0KGkrMSksICBpKjIrMykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDg7IGkgKz0gMikKKyAgICAgIGlmICghaXNDb25zdGFudE9yVW5kZWYoTi0+Z2V0TWFza0VsdChpICApLCAgaSoyKzIpIHx8CisgICAgICAgICAgIWlzQ29uc3RhbnRPclVuZGVmKE4tPmdldE1hc2tFbHQoaSsxKSwgIGkqMiszKSB8fAorICAgICAgICAgICFpc0NvbnN0YW50T3JVbmRlZihOLT5nZXRNYXNrRWx0KGkrOCksICBpKjIrMikgfHwKKyAgICAgICAgICAhaXNDb25zdGFudE9yVW5kZWYoTi0+Z2V0TWFza0VsdChpKzkpLCAgaSoyKzMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1ZNZXJnZSAtIENvbW1vbiBmdW5jdGlvbiwgdXNlZCB0byBtYXRjaCB2bXJnKiBzaHVmZmxlcy4KKy8vLworc3RhdGljIGJvb2wgaXNWTWVyZ2UoU2h1ZmZsZVZlY3RvclNETm9kZSAqTiwgdW5zaWduZWQgVW5pdFNpemUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMSFNTdGFydCwgdW5zaWduZWQgUkhTU3RhcnQpIHsKKyAgYXNzZXJ0KE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OnYxNmk4ICYmCisgICAgICAgICAiUFBDIG9ubHkgc3VwcG9ydHMgc2h1ZmZsZXMgYnkgYnl0ZXMhIik7CisgIGFzc2VydCgoVW5pdFNpemUgPT0gMSB8fCBVbml0U2l6ZSA9PSAyIHx8IFVuaXRTaXplID09IDQpICYmCisgICAgICAgICAiVW5zdXBwb3J0ZWQgbWVyZ2Ugc2l6ZSEiKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDgvVW5pdFNpemU7ICsraSkgICAgIC8vIFN0ZXAgb3ZlciB1bml0cworICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gVW5pdFNpemU7ICsraikgeyAgIC8vIFN0ZXAgb3ZlciBieXRlcyB3aXRoaW4gdW5pdAorICAgICAgaWYgKCFpc0NvbnN0YW50T3JVbmRlZihOLT5nZXRNYXNrRWx0KGkqVW5pdFNpemUqMitqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTU3RhcnQraitpKlVuaXRTaXplKSB8fAorICAgICAgICAgICFpc0NvbnN0YW50T3JVbmRlZihOLT5nZXRNYXNrRWx0KGkqVW5pdFNpemUqMitVbml0U2l6ZStqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTU3RhcnQraitpKlVuaXRTaXplKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1ZNUkdMU2h1ZmZsZU1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc2h1ZmZsZSBtYXNrIHN1aXRhYmxlIGZvcgorLy8vIGEgVlJHTCogaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHVuaXQgc2l6ZSAoMSwyIG9yIDQgYnl0ZXMpLgorYm9vbCBQUEM6OmlzVk1SR0xTaHVmZmxlTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOLCB1bnNpZ25lZCBVbml0U2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNVbmFyeSkgeworICBpZiAoIWlzVW5hcnkpCisgICAgcmV0dXJuIGlzVk1lcmdlKE4sIFVuaXRTaXplLCA4LCAyNCk7CisgIHJldHVybiBpc1ZNZXJnZShOLCBVbml0U2l6ZSwgOCwgOCk7Cit9CisKKy8vLyBpc1ZNUkdIU2h1ZmZsZU1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc2h1ZmZsZSBtYXNrIHN1aXRhYmxlIGZvcgorLy8vIGEgVlJHSCogaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHVuaXQgc2l6ZSAoMSwyIG9yIDQgYnl0ZXMpLgorYm9vbCBQUEM6OmlzVk1SR0hTaHVmZmxlTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOLCB1bnNpZ25lZCBVbml0U2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNVbmFyeSkgeworICBpZiAoIWlzVW5hcnkpCisgICAgcmV0dXJuIGlzVk1lcmdlKE4sIFVuaXRTaXplLCAwLCAxNik7CisgIHJldHVybiBpc1ZNZXJnZShOLCBVbml0U2l6ZSwgMCwgMCk7Cit9CisKKworLy8vIGlzVlNMRE9JU2h1ZmZsZU1hc2sgLSBJZiB0aGlzIGlzIGEgdnNsZG9pIHNodWZmbGUgbWFzaywgcmV0dXJuIHRoZSBzaGlmdAorLy8vIGFtb3VudCwgb3RoZXJ3aXNlIHJldHVybiAtMS4KK2ludCBQUEM6OmlzVlNMRE9JU2h1ZmZsZU1hc2soU0ROb2RlICpOLCBib29sIGlzVW5hcnkpIHsKKyAgYXNzZXJ0KE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OnYxNmk4ICYmCisgICAgICAgICAiUFBDIG9ubHkgc3VwcG9ydHMgc2h1ZmZsZXMgYnkgYnl0ZXMhIik7CisKKyAgU2h1ZmZsZVZlY3RvclNETm9kZSAqU1ZPcCA9IGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTik7CisgIAorICAvLyBGaW5kIHRoZSBmaXJzdCBub24tdW5kZWYgdmFsdWUgaW4gdGhlIHNodWZmbGUgbWFzay4KKyAgdW5zaWduZWQgaTsKKyAgZm9yIChpID0gMDsgaSAhPSAxNiAmJiBTVk9wLT5nZXRNYXNrRWx0KGkpIDwgMDsgKytpKQorICAgIC8qc2VhcmNoKi87CisKKyAgaWYgKGkgPT0gMTYpIHJldHVybiAtMTsgIC8vIGFsbCB1bmRlZi4KKworICAvLyBPdGhlcndpc2UsIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVzdCBvZiB0aGUgZWxlbWVudHMgYXJlIGNvbnNlY3V0aXZlbHkKKyAgLy8gbnVtYmVyZWQgZnJvbSB0aGlzIHZhbHVlLgorICB1bnNpZ25lZCBTaGlmdEFtdCA9IFNWT3AtPmdldE1hc2tFbHQoaSk7CisgIGlmIChTaGlmdEFtdCA8IGkpIHJldHVybiAtMTsKKyAgU2hpZnRBbXQgLT0gaTsKKworICBpZiAoIWlzVW5hcnkpIHsKKyAgICAvLyBDaGVjayB0aGUgcmVzdCBvZiB0aGUgZWxlbWVudHMgdG8gc2VlIGlmIHRoZXkgYXJlIGNvbnNlY3V0aXZlLgorICAgIGZvciAoKytpOyBpICE9IDE2OyArK2kpCisgICAgICBpZiAoIWlzQ29uc3RhbnRPclVuZGVmKFNWT3AtPmdldE1hc2tFbHQoaSksIFNoaWZ0QW10K2kpKQorICAgICAgICByZXR1cm4gLTE7CisgIH0gZWxzZSB7CisgICAgLy8gQ2hlY2sgdGhlIHJlc3Qgb2YgdGhlIGVsZW1lbnRzIHRvIHNlZSBpZiB0aGV5IGFyZSBjb25zZWN1dGl2ZS4KKyAgICBmb3IgKCsraTsgaSAhPSAxNjsgKytpKQorICAgICAgaWYgKCFpc0NvbnN0YW50T3JVbmRlZihTVk9wLT5nZXRNYXNrRWx0KGkpLCAoU2hpZnRBbXQraSkgJiAxNSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gU2hpZnRBbXQ7Cit9CisKKy8vLyBpc1NwbGF0U2h1ZmZsZU1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKy8vLyBzcGVjaWZpZXMgYSBzcGxhdCBvZiBhIHNpbmdsZSBlbGVtZW50IHRoYXQgaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvCisvLy8gVlNQTFRCL1ZTUExUSC9WU1BMVFcuCitib29sIFBQQzo6aXNTcGxhdFNodWZmbGVNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4sIHVuc2lnbmVkIEVsdFNpemUpIHsKKyAgYXNzZXJ0KE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OnYxNmk4ICYmCisgICAgICAgICAoRWx0U2l6ZSA9PSAxIHx8IEVsdFNpemUgPT0gMiB8fCBFbHRTaXplID09IDQpKTsKKworICAvLyBUaGlzIGlzIGEgc3BsYXQgb3BlcmF0aW9uIGlmIGVhY2ggZWxlbWVudCBvZiB0aGUgcGVybXV0ZSBpcyB0aGUgc2FtZSwgYW5kCisgIC8vIGlmIHRoZSB2YWx1ZSBkb2Vzbid0IHJlZmVyZW5jZSB0aGUgc2Vjb25kIHZlY3Rvci4KKyAgdW5zaWduZWQgRWxlbWVudEJhc2UgPSBOLT5nZXRNYXNrRWx0KDApOworICAKKyAgLy8gRklYTUU6IEhhbmRsZSBVTkRFRiBlbGVtZW50cyB0b28hCisgIGlmIChFbGVtZW50QmFzZSA+PSAxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5kaWNlcyBhcmUgY29uc2VjdXRpdmUsIGluIHRoZSBjYXNlIG9mIGEgbXVsdGktYnl0ZSBlbGVtZW50CisgIC8vIHNwbGF0dGVkIHdpdGggYSB2MTZpOCBtYXNrLgorICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IEVsdFNpemU7ICsraSkKKyAgICBpZiAoTi0+Z2V0TWFza0VsdChpKSA8IDAgfHwgTi0+Z2V0TWFza0VsdChpKSAhPSAoaW50KShpK0VsZW1lbnRCYXNlKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSBFbHRTaXplLCBlID0gMTY7IGkgIT0gZTsgaSArPSBFbHRTaXplKSB7CisgICAgaWYgKE4tPmdldE1hc2tFbHQoaSkgPCAwKSBjb250aW51ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IEVsdFNpemU7ICsraikKKyAgICAgIGlmIChOLT5nZXRNYXNrRWx0KGkraikgIT0gTi0+Z2V0TWFza0VsdChqKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gaXNBbGxOZWdhdGl2ZVplcm9WZWN0b3IgLSBSZXR1cm5zIHRydWUgaWYgYWxsIGVsZW1lbnRzIG9mIGJ1aWxkX3ZlY3RvcgorLy8vIGFyZSAtMC4wLgorYm9vbCBQUEM6OmlzQWxsTmVnYXRpdmVaZXJvVmVjdG9yKFNETm9kZSAqTikgeworICBCdWlsZFZlY3RvclNETm9kZSAqQlYgPSBjYXN0PEJ1aWxkVmVjdG9yU0ROb2RlPihOKTsKKworICBBUEludCBBUFZhbCwgQVBVbmRlZjsKKyAgdW5zaWduZWQgQml0U2l6ZTsKKyAgYm9vbCBIYXNBbnlVbmRlZnM7CisgIAorICBpZiAoQlYtPmlzQ29uc3RhbnRTcGxhdChBUFZhbCwgQVBVbmRlZiwgQml0U2l6ZSwgSGFzQW55VW5kZWZzLCAzMiwgdHJ1ZSkpCisgICAgaWYgKENvbnN0YW50RlBTRE5vZGUgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4tPmdldE9wZXJhbmQoMCkpKQorICAgICAgcmV0dXJuIENGUC0+Z2V0VmFsdWVBUEYoKS5pc05lZ1plcm8oKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBnZXRWU1BMVEltbWVkaWF0ZSAtIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgVlNQTFQqIGltbWVkaWF0ZSB0byBzcGxhdCB0aGUKKy8vLyBzcGVjaWZpZWQgaXNTcGxhdFNodWZmbGVNYXNrIFZFQ1RPUl9TSFVGRkxFIG1hc2suCit1bnNpZ25lZCBQUEM6OmdldFZTUExUSW1tZWRpYXRlKFNETm9kZSAqTiwgdW5zaWduZWQgRWx0U2l6ZSkgeworICBTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk9wID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKTsKKyAgYXNzZXJ0KGlzU3BsYXRTaHVmZmxlTWFzayhTVk9wLCBFbHRTaXplKSk7CisgIHJldHVybiBTVk9wLT5nZXRNYXNrRWx0KDApIC8gRWx0U2l6ZTsKK30KKworLy8vIGdldF9WU1BMVElfZWx0IC0gSWYgdGhpcyBpcyBhIGJ1aWxkX3ZlY3RvciBvZiBjb25zdGFudHMgd2hpY2ggY2FuIGJlIGZvcm1lZAorLy8vIGJ5IHVzaW5nIGEgdnNwbHRpc1tiaHddIGluc3RydWN0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBzaXplLCByZXR1cm4KKy8vLyB0aGUgY29uc3RhbnQgYmVpbmcgc3BsYXR0ZWQuICBUaGUgQnl0ZVNpemUgZmllbGQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YKKy8vLyBieXRlcyBvZiBlYWNoIGVsZW1lbnQgWzEyNF0gLT4gW2Jod10uCitTRFZhbHVlIFBQQzo6Z2V0X1ZTUExUSV9lbHQoU0ROb2RlICpOLCB1bnNpZ25lZCBCeXRlU2l6ZSwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgU0RWYWx1ZSBPcFZhbCgwLCAwKTsKKworICAvLyBJZiBCeXRlU2l6ZSBvZiB0aGUgc3BsYXQgaXMgYmlnZ2VyIHRoYW4gdGhlIGVsZW1lbnQgc2l6ZSBvZiB0aGUKKyAgLy8gYnVpbGRfdmVjdG9yLCB0aGVuIHdlIGhhdmUgYSBjYXNlIHdoZXJlIHdlIGFyZSBjaGVja2luZyBmb3IgYSBzcGxhdCB3aGVyZQorICAvLyBtdWx0aXBsZSBlbGVtZW50cyBvZiB0aGUgYnVpbGR2ZWN0b3IgYXJlIGZvbGRlZCB0b2dldGhlciBpbnRvIGEgc2luZ2xlCisgIC8vIGxvZ2ljYWwgZWxlbWVudCBvZiB0aGUgc3BsYXQgKGUuZy4gInZzcGxpc2ggMSIgdG8gc3BsYXQgezAsMX0qOCkuCisgIHVuc2lnbmVkIEVsdFNpemUgPSAxNi9OLT5nZXROdW1PcGVyYW5kcygpOworICBpZiAoRWx0U2l6ZSA8IEJ5dGVTaXplKSB7CisgICAgdW5zaWduZWQgTXVsdGlwbGUgPSBCeXRlU2l6ZS9FbHRTaXplOyAgIC8vIE51bWJlciBvZiBCViBlbnRyaWVzIHBlciBzcGx0dmFsLgorICAgIFNEVmFsdWUgVW5pcXVlZFZhbHNbNF07CisgICAgYXNzZXJ0KE11bHRpcGxlID4gMSAmJiBNdWx0aXBsZSA8PSA0ICYmICJIb3cgY2FuIHRoaXMgaGFwcGVuPyIpOworCisgICAgLy8gU2VlIGlmIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGJ1aWxkdmVjdG9yIGFncmVlIGFjcm9zcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChOLT5nZXRPcGVyYW5kKGkpLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpIGNvbnRpbnVlOworICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXNuJ3QgYSBjb25zdGFudCwgYmFpbCBmdWxseSBvdXQuCisgICAgICBpZiAoIWlzYTxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZChpKSkpIHJldHVybiBTRFZhbHVlKCk7CisKKworICAgICAgaWYgKFVuaXF1ZWRWYWxzW2kmKE11bHRpcGxlLTEpXS5nZXROb2RlKCkgPT0gMCkKKyAgICAgICAgVW5pcXVlZFZhbHNbaSYoTXVsdGlwbGUtMSldID0gTi0+Z2V0T3BlcmFuZChpKTsKKyAgICAgIGVsc2UgaWYgKFVuaXF1ZWRWYWxzW2kmKE11bHRpcGxlLTEpXSAhPSBOLT5nZXRPcGVyYW5kKGkpKQorICAgICAgICByZXR1cm4gU0RWYWx1ZSgpOyAgLy8gbm8gbWF0Y2guCisgICAgfQorCisgICAgLy8gT2theSwgaWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50LCBVbmlxdWVkVmFsc1swLi5NdWx0aXBsZS0xXSBjb250YWlucworICAgIC8vIGVpdGhlciBjb25zdGFudCBvciB1bmRlZiB2YWx1ZXMgdGhhdCBhcmUgaWRlbnRpY2FsIGZvciBlYWNoIGNodW5rLiAgU2VlCisgICAgLy8gaWYgdGhlc2UgY2h1bmtzIGNhbiBmb3JtIGludG8gYSBsYXJnZXIgdnNwbHRpcyouCisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgYWxsIG9mIHRoZSBsZWFkaW5nIGVudHJpZXMgYXJlIGVpdGhlciAwIG9yIC0xLiAgSWYKKyAgICAvLyBuZWl0aGVyLCB0aGVuIHRoaXMgd29uJ3QgZml0IGludG8gdGhlIGltbWVkaWF0ZSBmaWVsZC4KKyAgICBib29sIExlYWRpbmdaZXJvID0gdHJ1ZTsKKyAgICBib29sIExlYWRpbmdPbmVzID0gdHJ1ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE11bHRpcGxlLTE7ICsraSkgeworICAgICAgaWYgKFVuaXF1ZWRWYWxzW2ldLmdldE5vZGUoKSA9PSAwKSBjb250aW51ZTsgIC8vIE11c3QgaGF2ZSBiZWVuIHVuZGVmcy4KKworICAgICAgTGVhZGluZ1plcm8gJj0gY2FzdDxDb25zdGFudFNETm9kZT4oVW5pcXVlZFZhbHNbaV0pLT5pc051bGxWYWx1ZSgpOworICAgICAgTGVhZGluZ09uZXMgJj0gY2FzdDxDb25zdGFudFNETm9kZT4oVW5pcXVlZFZhbHNbaV0pLT5pc0FsbE9uZXNWYWx1ZSgpOworICAgIH0KKyAgICAvLyBGaW5hbGx5LCBjaGVjayB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZW50cnkuCisgICAgaWYgKExlYWRpbmdaZXJvKSB7CisgICAgICBpZiAoVW5pcXVlZFZhbHNbTXVsdGlwbGUtMV0uZ2V0Tm9kZSgpID09IDApCisgICAgICAgIHJldHVybiBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOyAgLy8gMCwwLDAsdW5kZWYKKyAgICAgIGludCBWYWwgPSBjYXN0PENvbnN0YW50U0ROb2RlPihVbmlxdWVkVmFsc1tNdWx0aXBsZS0xXSktPmdldFpFeHRWYWx1ZSgpOworICAgICAgaWYgKFZhbCA8IDE2KQorICAgICAgICByZXR1cm4gREFHLmdldFRhcmdldENvbnN0YW50KFZhbCwgTVZUOjppMzIpOyAgLy8gMCwwLDAsNCAtPiB2c3BsdGlzdyg0KQorICAgIH0KKyAgICBpZiAoTGVhZGluZ09uZXMpIHsKKyAgICAgIGlmIChVbmlxdWVkVmFsc1tNdWx0aXBsZS0xXS5nZXROb2RlKCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIERBRy5nZXRUYXJnZXRDb25zdGFudCh+MFUsIE1WVDo6aTMyKTsgIC8vIC0xLC0xLC0xLHVuZGVmCisgICAgICBpbnQgVmFsID1jYXN0PENvbnN0YW50U0ROb2RlPihVbmlxdWVkVmFsc1tNdWx0aXBsZS0xXSktPmdldFNFeHRWYWx1ZSgpOworICAgICAgaWYgKFZhbCA+PSAtMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0xLC0xLC0xLC0yIC0+IHZzcGx0aXN3KC0yKQorICAgICAgICByZXR1cm4gREFHLmdldFRhcmdldENvbnN0YW50KFZhbCwgTVZUOjppMzIpOworICAgIH0KKworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBidWlsZHZlYyBoYXMgYSBzaW5nbGUgbm9uLXVuZGVmIHZhbHVlIGluIGl0cyBlbGVtZW50cy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKE4tPmdldE9wZXJhbmQoaSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikgY29udGludWU7CisgICAgaWYgKE9wVmFsLmdldE5vZGUoKSA9PSAwKQorICAgICAgT3BWYWwgPSBOLT5nZXRPcGVyYW5kKGkpOworICAgIGVsc2UgaWYgKE9wVmFsICE9IE4tPmdldE9wZXJhbmQoaSkpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisKKyAgaWYgKE9wVmFsLmdldE5vZGUoKSA9PSAwKSByZXR1cm4gU0RWYWx1ZSgpOyAgLy8gQWxsIFVOREVGOiB1c2UgaW1wbGljaXQgZGVmLgorCisgIHVuc2lnbmVkIFZhbFNpemVJbkJ5dGVzID0gRWx0U2l6ZTsKKyAgdWludDY0X3QgVmFsdWUgPSAwOworICBpZiAoQ29uc3RhbnRTRE5vZGUgKkNOID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wVmFsKSkgeworICAgIFZhbHVlID0gQ04tPmdldFpFeHRWYWx1ZSgpOworICB9IGVsc2UgaWYgKENvbnN0YW50RlBTRE5vZGUgKkNOID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oT3BWYWwpKSB7CisgICAgYXNzZXJ0KENOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjpmMzIgJiYgIk9ubHkgb25lIGxlZ2FsIEZQIHZlY3RvciB0eXBlISIpOworICAgIFZhbHVlID0gRmxvYXRUb0JpdHMoQ04tPmdldFZhbHVlQVBGKCkuY29udmVydFRvRmxvYXQoKSk7CisgIH0KKworICAvLyBJZiB0aGUgc3BsYXQgdmFsdWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGVsZW1lbnQgdmFsdWUsIHRoZW4gd2UgY2FuIG5ldmVyIGRvCisgIC8vIHRoaXMgc3BsYXQuICBUaGUgb25seSBjYXNlIHRoYXQgd2UgY291bGQgZml0IHRoZSByZXBsaWNhdGVkIGJpdHMgaW50byBvdXIKKyAgLy8gaW1tZWRpYXRlIGZpZWxkIGZvciB3b3VsZCBiZSB6ZXJvLCBhbmQgd2UgcHJlZmVyIHRvIHVzZSB2eG9yIGZvciBpdC4KKyAgaWYgKFZhbFNpemVJbkJ5dGVzIDwgQnl0ZVNpemUpIHJldHVybiBTRFZhbHVlKCk7CisKKyAgLy8gSWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgbGFyZ2VyIHRoYW4gdGhlIHNwbGF0IHZhbHVlLCBjdXQgaXQgaW4gaGFsZiBhbmQKKyAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSB0d28gaGFsdmVzIGFyZSBlcXVhbC4gIENvbnRpbnVlIGRvaW5nIHRoaXMgdW50aWwgd2UKKyAgLy8gZ2V0IHRvIEJ5dGVTaXplLiAgVGhpcyBhbGxvd3MgdXMgdG8gaGFuZGxlIDB4MDEwMTAxMDEgYXMgMHgwMS4KKyAgd2hpbGUgKFZhbFNpemVJbkJ5dGVzID4gQnl0ZVNpemUpIHsKKyAgICBWYWxTaXplSW5CeXRlcyA+Pj0gMTsKKworICAgIC8vIElmIHRoZSB0b3AgaGFsZiBlcXVhbHMgdGhlIGJvdHRvbSBoYWxmLCB3ZSdyZSBzdGlsbCBvay4KKyAgICBpZiAoKChWYWx1ZSA+PiAoVmFsU2l6ZUluQnl0ZXMqOCkpICYgKCgxIDw8ICg4KlZhbFNpemVJbkJ5dGVzKSktMSkpICE9CisgICAgICAgICAoVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAmICgoMSA8PCAoOCpWYWxTaXplSW5CeXRlcykpLTEpKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICAvLyBQcm9wZXJseSBzaWduIGV4dGVuZCB0aGUgdmFsdWUuCisgIGludCBTaEFtdCA9ICg0LUJ5dGVTaXplKSo4OworICBpbnQgTWFza1ZhbCA9ICgoaW50KVZhbHVlIDw8IFNoQW10KSA+PiBTaEFtdDsKKworICAvLyBJZiB0aGlzIGlzIHplcm8sIGRvbid0IG1hdGNoLCB6ZXJvIG1hdGNoZXMgSVNEOjppc0J1aWxkVmVjdG9yQWxsWmVyb3MuCisgIGlmIChNYXNrVmFsID09IDApIHJldHVybiBTRFZhbHVlKCk7CisKKyAgLy8gRmluYWxseSwgaWYgdGhpcyB2YWx1ZSBmaXRzIGluIGEgNSBiaXQgc2V4dCBmaWVsZCwgcmV0dXJuIGl0CisgIGlmICgoKE1hc2tWYWwgPDwgKDMyLTUpKSA+PiAoMzItNSkpID09IE1hc2tWYWwpCisgICAgcmV0dXJuIERBRy5nZXRUYXJnZXRDb25zdGFudChNYXNrVmFsLCBNVlQ6OmkzMik7CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgQWRkcmVzc2luZyBNb2RlIFNlbGVjdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGlzSW50UzE2SW1tZWRpYXRlIC0gVGhpcyBtZXRob2QgdGVzdHMgdG8gc2VlIGlmIHRoZSBub2RlIGlzIGVpdGhlciBhIDMyLWJpdAorLy8vIG9yIDY0LWJpdCBpbW1lZGlhdGUsIGFuZCBpZiB0aGUgdmFsdWUgY2FuIGJlIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQgYXMgYQorLy8vIHNpZ24gZXh0ZW5zaW9uIGZyb20gYSAxNi1iaXQgdmFsdWUuICBJZiBzbywgdGhpcyByZXR1cm5zIHRydWUgYW5kIHRoZQorLy8vIGltbWVkaWF0ZS4KK3N0YXRpYyBib29sIGlzSW50UzE2SW1tZWRpYXRlKFNETm9kZSAqTiwgc2hvcnQgJkltbSkgeworICBpZiAoTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpDb25zdGFudCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgSW1tID0gKHNob3J0KWNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4pLT5nZXRaRXh0VmFsdWUoKTsKKyAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMikKKyAgICByZXR1cm4gSW1tID09IChpbnQzMl90KWNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4pLT5nZXRaRXh0VmFsdWUoKTsKKyAgZWxzZQorICAgIHJldHVybiBJbW0gPT0gKGludDY0X3QpY2FzdDxDb25zdGFudFNETm9kZT4oTiktPmdldFpFeHRWYWx1ZSgpOworfQorc3RhdGljIGJvb2wgaXNJbnRTMTZJbW1lZGlhdGUoU0RWYWx1ZSBPcCwgc2hvcnQgJkltbSkgeworICByZXR1cm4gaXNJbnRTMTZJbW1lZGlhdGUoT3AuZ2V0Tm9kZSgpLCBJbW0pOworfQorCisKKy8vLyBTZWxlY3RBZGRyZXNzUmVnUmVnIC0gR2l2ZW4gdGhlIHNwZWNpZmllZCBhZGRyZXNzZWQsIGNoZWNrIHRvIHNlZSBpZiBpdAorLy8vIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhbiBpbmRleGVkIFtyK3JdIG9wZXJhdGlvbi4gIFJldHVybnMgZmFsc2UgaWYgaXQKKy8vLyBjYW4gYmUgbW9yZSBlZmZpY2llbnRseSByZXByZXNlbnRlZCB3aXRoIFtyK2ltbV0uCitib29sIFBQQ1RhcmdldExvd2VyaW5nOjpTZWxlY3RBZGRyZXNzUmVnUmVnKFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIHNob3J0IGltbSA9IDA7CisgIGlmIChOLmdldE9wY29kZSgpID09IElTRDo6QUREKSB7CisgICAgaWYgKGlzSW50UzE2SW1tZWRpYXRlKE4uZ2V0T3BlcmFuZCgxKSwgaW1tKSkKKyAgICAgIHJldHVybiBmYWxzZTsgICAgLy8gcitpCisgICAgaWYgKE4uZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBQUENJU0Q6OkxvKQorICAgICAgcmV0dXJuIGZhbHNlOyAgICAvLyByK2kKKworICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgSW5kZXggPSBOLmdldE9wZXJhbmQoMSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok9SKSB7CisgICAgaWYgKGlzSW50UzE2SW1tZWRpYXRlKE4uZ2V0T3BlcmFuZCgxKSwgaW1tKSkKKyAgICAgIHJldHVybiBmYWxzZTsgICAgLy8gcitpIGNhbiBmb2xkIGl0IGlmIHdlIGNhbi4KKworICAgIC8vIElmIHRoaXMgaXMgYW4gb3Igb2YgZGlzam9pbnQgYml0ZmllbGRzLCB3ZSBjYW4gY29kZWdlbiB0aGlzIGFzIGFuIGFkZAorICAgIC8vIChmb3IgYmV0dGVyIGFkZHJlc3MgYXJpdGhtZXRpYykgaWYgdGhlIExIUyBhbmQgUkhTIG9mIHRoZSBPUiBhcmUgcHJvdmFibHkKKyAgICAvLyBkaXNqb2ludC4KKyAgICBBUEludCBMSFNLbm93blplcm8sIExIU0tub3duT25lOworICAgIEFQSW50IFJIU0tub3duWmVybywgUkhTS25vd25PbmU7CisgICAgREFHLkNvbXB1dGVNYXNrZWRCaXRzKE4uZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShOLmdldE9wZXJhbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVTaXplSW5CaXRzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNLbm93blplcm8sIExIU0tub3duT25lKTsKKworICAgIGlmIChMSFNLbm93blplcm8uZ2V0Qm9vbFZhbHVlKCkpIHsKKyAgICAgIERBRy5Db21wdXRlTWFza2VkQml0cyhOLmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShOLmdldE9wZXJhbmQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZVNpemVJbkJpdHMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTS25vd25aZXJvLCBSSFNLbm93bk9uZSk7CisgICAgICAvLyBJZiBhbGwgb2YgdGhlIGJpdHMgYXJlIGtub3duIHplcm8gb24gdGhlIExIUyBvciBSSFMsIHRoZSBhZGQgd29uJ3QKKyAgICAgIC8vIGNhcnJ5LgorICAgICAgaWYgKH4oTEhTS25vd25aZXJvIHwgUkhTS25vd25aZXJvKSA9PSAwKSB7CisgICAgICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgICAgIEluZGV4ID0gTi5nZXRPcGVyYW5kKDEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgTiBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBiYXNlIHJlZ2lzdGVyIHBsdXMKKy8vLyBhIHNpZ25lZCAxNi1iaXQgZGlzcGxhY2VtZW50IFtyK2ltbV0sIGFuZCBpZiBpdCBpcyBub3QgYmV0dGVyCisvLy8gcmVwcmVzZW50ZWQgYXMgcmVnK3JlZy4KK2Jvb2wgUFBDVGFyZ2V0TG93ZXJpbmc6OlNlbGVjdEFkZHJlc3NSZWdJbW0oU0RWYWx1ZSBOLCBTRFZhbHVlICZEaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvLyBGSVhNRSBkbCBzaG91bGQgY29tZSBmcm9tIHBhcmVudCBsb2FkIG9yIHN0b3JlLCBub3QgZnJvbSBhZGRyZXNzCisgIERlYnVnTG9jIGRsID0gTi5nZXREZWJ1Z0xvYygpOworICAvLyBJZiB0aGlzIGNhbiBiZSBtb3JlIHByb2ZpdGFibHkgcmVhbGl6ZWQgYXMgcityLCBmYWlsLgorICBpZiAoU2VsZWN0QWRkcmVzc1JlZ1JlZyhOLCBEaXNwLCBCYXNlLCBEQUcpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIHNob3J0IGltbSA9IDA7CisgICAgaWYgKGlzSW50UzE2SW1tZWRpYXRlKE4uZ2V0T3BlcmFuZCgxKSwgaW1tKSkgeworICAgICAgRGlzcCA9IERBRy5nZXRUYXJnZXRDb25zdGFudCgoaW50KWltbSAmIDB4RkZGRiwgTVZUOjppMzIpOworICAgICAgaWYgKEZyYW1lSW5kZXhTRE5vZGUgKkZJID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4oTi5nZXRPcGVyYW5kKDApKSkgeworICAgICAgICBCYXNlID0gREFHLmdldFRhcmdldEZyYW1lSW5kZXgoRkktPmdldEluZGV4KCksIE4uZ2V0VmFsdWVUeXBlKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQmFzZSA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOyAvLyBbcitpXQorICAgIH0gZWxzZSBpZiAoTi5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IFBQQ0lTRDo6TG8pIHsKKyAgICAgIC8vIE1hdGNoIExPQUQgKEFERCAoWCwgTG8oRykpKS4KKyAgICAgYXNzZXJ0KCFjYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkuZ2V0T3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpCisgICAgICAgICAgICAgJiYgIkNhbm5vdCBoYW5kbGUgY29uc3RhbnQgb2Zmc2V0cyB5ZXQhIik7CisgICAgICBEaXNwID0gTi5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMCk7ICAvLyBUaGUgZ2xvYmFsIGFkZHJlc3MuCisgICAgICBhc3NlcnQoRGlzcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MgfHwKKyAgICAgICAgICAgICBEaXNwLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnRQb29sIHx8CisgICAgICAgICAgICAgRGlzcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEp1bXBUYWJsZSk7CisgICAgICBCYXNlID0gTi5nZXRPcGVyYW5kKDApOworICAgICAgcmV0dXJuIHRydWU7ICAvLyBbJmcrcl0KKyAgICB9CisgIH0gZWxzZSBpZiAoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok9SKSB7CisgICAgc2hvcnQgaW1tID0gMDsKKyAgICBpZiAoaXNJbnRTMTZJbW1lZGlhdGUoTi5nZXRPcGVyYW5kKDEpLCBpbW0pKSB7CisgICAgICAvLyBJZiB0aGlzIGlzIGFuIG9yIG9mIGRpc2pvaW50IGJpdGZpZWxkcywgd2UgY2FuIGNvZGVnZW4gdGhpcyBhcyBhbiBhZGQKKyAgICAgIC8vIChmb3IgYmV0dGVyIGFkZHJlc3MgYXJpdGhtZXRpYykgaWYgdGhlIExIUyBhbmQgUkhTIG9mIHRoZSBPUiBhcmUKKyAgICAgIC8vIHByb3ZhYmx5IGRpc2pvaW50LgorICAgICAgQVBJbnQgTEhTS25vd25aZXJvLCBMSFNLbm93bk9uZTsKKyAgICAgIERBRy5Db21wdXRlTWFza2VkQml0cyhOLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShOLmdldE9wZXJhbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZVNpemVJbkJpdHMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTS25vd25aZXJvLCBMSFNLbm93bk9uZSk7CisKKyAgICAgIGlmICgoTEhTS25vd25aZXJvLmdldFpFeHRWYWx1ZSgpfH4odWludDY0X3QpaW1tKSA9PSB+MFVMTCkgeworICAgICAgICAvLyBJZiBhbGwgb2YgdGhlIGJpdHMgYXJlIGtub3duIHplcm8gb24gdGhlIExIUyBvciBSSFMsIHRoZSBhZGQgd29uJ3QKKyAgICAgICAgLy8gY2FycnkuCisgICAgICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgICAgIERpc3AgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoKGludClpbW0gJiAweEZGRkYsIE1WVDo6aTMyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOKSkgeworICAgIC8vIExvYWRpbmcgZnJvbSBhIGNvbnN0YW50IGFkZHJlc3MuCisKKyAgICAvLyBJZiB0aGlzIGFkZHJlc3MgZml0cyBlbnRpcmVseSBpbiBhIDE2LWJpdCBzZXh0IGltbWVkaWF0ZSBmaWVsZCwgY29kZWdlbgorICAgIC8vIHRoaXMgYXMgImQsIDAiCisgICAgc2hvcnQgSW1tOworICAgIGlmIChpc0ludFMxNkltbWVkaWF0ZShDTiwgSW1tKSkgeworICAgICAgRGlzcCA9IERBRy5nZXRUYXJnZXRDb25zdGFudChJbW0sIENOLT5nZXRWYWx1ZVR5cGUoMCkpOworICAgICAgQmFzZSA9IERBRy5nZXRSZWdpc3RlcihQUEM6OlIwLCBDTi0+Z2V0VmFsdWVUeXBlKDApKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEhhbmRsZSAzMi1iaXQgc2V4dCBpbW1lZGlhdGVzIHdpdGggTElTICsgYWRkciBtb2RlLgorICAgIGlmIChDTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTMyIHx8CisgICAgICAgIChpbnQ2NF90KUNOLT5nZXRaRXh0VmFsdWUoKSA9PSAoaW50KUNOLT5nZXRaRXh0VmFsdWUoKSkgeworICAgICAgaW50IEFkZHIgPSAoaW50KUNOLT5nZXRaRXh0VmFsdWUoKTsKKworICAgICAgLy8gT3RoZXJ3aXNlLCBicmVhayB0aGlzIGRvd24gaW50byBhbiBMSVMgKyBkaXNwLgorICAgICAgRGlzcCA9IERBRy5nZXRUYXJnZXRDb25zdGFudCgoc2hvcnQpQWRkciwgTVZUOjppMzIpOworCisgICAgICBCYXNlID0gREFHLmdldFRhcmdldENvbnN0YW50KChBZGRyIC0gKHNpZ25lZCBzaG9ydClBZGRyKSA+PiAxNiwgTVZUOjppMzIpOworICAgICAgdW5zaWduZWQgT3BjID0gQ04tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMiA/IFBQQzo6TElTIDogUFBDOjpMSVM4OworICAgICAgQmFzZSA9IFNEVmFsdWUoREFHLmdldE1hY2hpbmVOb2RlKE9wYywgZGwsIENOLT5nZXRWYWx1ZVR5cGUoMCksIEJhc2UpLCAwKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIERpc3AgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoMCwgZ2V0UG9pbnRlclR5KCkpOworICBpZiAoRnJhbWVJbmRleFNETm9kZSAqRkkgPSBkeW5fY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOKSkKKyAgICBCYXNlID0gREFHLmdldFRhcmdldEZyYW1lSW5kZXgoRkktPmdldEluZGV4KCksIE4uZ2V0VmFsdWVUeXBlKCkpOworICBlbHNlCisgICAgQmFzZSA9IE47CisgIHJldHVybiB0cnVlOyAgICAgIC8vIFtyKzBdCit9CisKKy8vLyBTZWxlY3RBZGRyZXNzUmVnUmVnT25seSAtIEdpdmVuIHRoZSBzcGVjaWZpZWQgYWRkcmVzc2VkLCBmb3JjZSBpdCB0byBiZQorLy8vIHJlcHJlc2VudGVkIGFzIGFuIGluZGV4ZWQgW3Ircl0gb3BlcmF0aW9uLgorYm9vbCBQUENUYXJnZXRMb3dlcmluZzo6U2VsZWN0QWRkcmVzc1JlZ1JlZ09ubHkoU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvLyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGVhc2lseSByZXByZXNlbnQgdGhpcyBhcyBhbiBbcityXSBhZGRyZXNzLiAgVGhpcworICAvLyB3aWxsIGZhaWwgaWYgaXQgdGhpbmtzIHRoYXQgdGhlIGFkZHJlc3MgaXMgbW9yZSBwcm9maXRhYmx5IHJlcHJlc2VudGVkIGFzCisgIC8vIHJlZytpbW0sIGUuZy4gd2hlcmUgaW1tID0gMC4KKyAgaWYgKFNlbGVjdEFkZHJlc3NSZWdSZWcoTiwgQmFzZSwgSW5kZXgsIERBRykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gSWYgdGhlIG9wZXJhbmQgaXMgYW4gYWRkaXRpb24sIGFsd2F5cyBlbWl0IHRoaXMgYXMgW3Ircl0sIHNpbmNlIHRoaXMgaXMKKyAgLy8gYmV0dGVyIChmb3IgY29kZSBzaXplLCBhbmQgZXhlY3V0aW9uLCBhcyB0aGUgbWVtb3AgZG9lcyB0aGUgYWRkIGZvciBmcmVlKQorICAvLyB0aGFuIGVtaXR0aW5nIGFuIGV4cGxpY2l0IGFkZC4KKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQpIHsKKyAgICBCYXNlID0gTi5nZXRPcGVyYW5kKDApOworICAgIEluZGV4ID0gTi5nZXRPcGVyYW5kKDEpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBkbyBpdCB0aGUgaGFyZCB3YXksIHVzaW5nIFIwIGFzIHRoZSBiYXNlIHJlZ2lzdGVyLgorICBCYXNlID0gREFHLmdldFJlZ2lzdGVyKFBQQzo6UjAsIE4uZ2V0VmFsdWVUeXBlKCkpOworICBJbmRleCA9IE47CisgIHJldHVybiB0cnVlOworfQorCisvLy8gU2VsZWN0QWRkcmVzc1JlZ0ltbVNoaWZ0IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIE4gY2FuIGJlCisvLy8gcmVwcmVzZW50ZWQgYnkgYSBiYXNlIHJlZ2lzdGVyIHBsdXMgYSBzaWduZWQgMTQtYml0IGRpc3BsYWNlbWVudAorLy8vIFtyK2ltbSo0XS4gIFN1aXRhYmxlIGZvciB1c2UgYnkgU1REIGFuZCBmcmllbmRzLgorYm9vbCBQUENUYXJnZXRMb3dlcmluZzo6U2VsZWN0QWRkcmVzc1JlZ0ltbVNoaWZ0KFNEVmFsdWUgTiwgU0RWYWx1ZSAmRGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIEZJWE1FIGRsIHNob3VsZCBjb21lIGZyb20gdGhlIHBhcmVudCBsb2FkIG9yIHN0b3JlLCBub3QgdGhlIGFkZHJlc3MKKyAgRGVidWdMb2MgZGwgPSBOLmdldERlYnVnTG9jKCk7CisgIC8vIElmIHRoaXMgY2FuIGJlIG1vcmUgcHJvZml0YWJseSByZWFsaXplZCBhcyByK3IsIGZhaWwuCisgIGlmIChTZWxlY3RBZGRyZXNzUmVnUmVnKE4sIERpc3AsIEJhc2UsIERBRykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChOLmdldE9wY29kZSgpID09IElTRDo6QUREKSB7CisgICAgc2hvcnQgaW1tID0gMDsKKyAgICBpZiAoaXNJbnRTMTZJbW1lZGlhdGUoTi5nZXRPcGVyYW5kKDEpLCBpbW0pICYmIChpbW0gJiAzKSA9PSAwKSB7CisgICAgICBEaXNwID0gIERBRy5nZXRUYXJnZXRDb25zdGFudCgoKGludClpbW0gJiAweEZGRkYpID4+IDIsIE1WVDo6aTMyKTsKKyAgICAgIGlmIChGcmFtZUluZGV4U0ROb2RlICpGSSA9IGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KE4uZ2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgQmFzZSA9IERBRy5nZXRUYXJnZXRGcmFtZUluZGV4KEZJLT5nZXRJbmRleCgpLCBOLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEJhc2UgPSBOLmdldE9wZXJhbmQoMCk7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsgLy8gW3IraV0KKyAgICB9IGVsc2UgaWYgKE4uZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBQUENJU0Q6OkxvKSB7CisgICAgICAvLyBNYXRjaCBMT0FEIChBREQgKFgsIExvKEcpKSkuCisgICAgIGFzc2VydCghY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKQorICAgICAgICAgICAgICYmICJDYW5ub3QgaGFuZGxlIGNvbnN0YW50IG9mZnNldHMgeWV0ISIpOworICAgICAgRGlzcCA9IE4uZ2V0T3BlcmFuZCgxKS5nZXRPcGVyYW5kKDApOyAgLy8gVGhlIGdsb2JhbCBhZGRyZXNzLgorICAgICAgYXNzZXJ0KERpc3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzIHx8CisgICAgICAgICAgICAgRGlzcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldENvbnN0YW50UG9vbCB8fAorICAgICAgICAgICAgIERpc3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRKdW1wVGFibGUpOworICAgICAgQmFzZSA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgICAgIHJldHVybiB0cnVlOyAgLy8gWyZnK3JdCisgICAgfQorICB9IGVsc2UgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpPUikgeworICAgIHNob3J0IGltbSA9IDA7CisgICAgaWYgKGlzSW50UzE2SW1tZWRpYXRlKE4uZ2V0T3BlcmFuZCgxKSwgaW1tKSAmJiAoaW1tICYgMykgPT0gMCkgeworICAgICAgLy8gSWYgdGhpcyBpcyBhbiBvciBvZiBkaXNqb2ludCBiaXRmaWVsZHMsIHdlIGNhbiBjb2RlZ2VuIHRoaXMgYXMgYW4gYWRkCisgICAgICAvLyAoZm9yIGJldHRlciBhZGRyZXNzIGFyaXRobWV0aWMpIGlmIHRoZSBMSFMgYW5kIFJIUyBvZiB0aGUgT1IgYXJlCisgICAgICAvLyBwcm92YWJseSBkaXNqb2ludC4KKyAgICAgIEFQSW50IExIU0tub3duWmVybywgTEhTS25vd25PbmU7CisgICAgICBEQUcuQ29tcHV0ZU1hc2tlZEJpdHMoTi5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoTi5nZXRPcGVyYW5kKDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVTaXplSW5CaXRzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIU0tub3duWmVybywgTEhTS25vd25PbmUpOworICAgICAgaWYgKChMSFNLbm93blplcm8uZ2V0WkV4dFZhbHVlKCl8fih1aW50NjRfdClpbW0pID09IH4wVUxMKSB7CisgICAgICAgIC8vIElmIGFsbCBvZiB0aGUgYml0cyBhcmUga25vd24gemVybyBvbiB0aGUgTEhTIG9yIFJIUywgdGhlIGFkZCB3b24ndAorICAgICAgICAvLyBjYXJyeS4KKyAgICAgICAgQmFzZSA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgICAgICAgRGlzcCA9IERBRy5nZXRUYXJnZXRDb25zdGFudCgoKGludClpbW0gJiAweEZGRkYpID4+IDIsIE1WVDo6aTMyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOKSkgeworICAgIC8vIExvYWRpbmcgZnJvbSBhIGNvbnN0YW50IGFkZHJlc3MuICBWZXJpZnkgbG93IHR3byBiaXRzIGFyZSBjbGVhci4KKyAgICBpZiAoKENOLT5nZXRaRXh0VmFsdWUoKSAmIDMpID09IDApIHsKKyAgICAgIC8vIElmIHRoaXMgYWRkcmVzcyBmaXRzIGVudGlyZWx5IGluIGEgMTQtYml0IHNleHQgaW1tZWRpYXRlIGZpZWxkLCBjb2RlZ2VuCisgICAgICAvLyB0aGlzIGFzICJkLCAwIgorICAgICAgc2hvcnQgSW1tOworICAgICAgaWYgKGlzSW50UzE2SW1tZWRpYXRlKENOLCBJbW0pKSB7CisgICAgICAgIERpc3AgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoKHVuc2lnbmVkIHNob3J0KUltbSA+PiAyLCBnZXRQb2ludGVyVHkoKSk7CisgICAgICAgIEJhc2UgPSBEQUcuZ2V0UmVnaXN0ZXIoUFBDOjpSMCwgQ04tPmdldFZhbHVlVHlwZSgwKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICAvLyBGb2xkIHRoZSBsb3ctcGFydCBvZiAzMi1iaXQgYWJzb2x1dGUgYWRkcmVzc2VzIGludG8gYWRkciBtb2RlLgorICAgICAgaWYgKENOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIgfHwKKyAgICAgICAgICAoaW50NjRfdClDTi0+Z2V0WkV4dFZhbHVlKCkgPT0gKGludClDTi0+Z2V0WkV4dFZhbHVlKCkpIHsKKyAgICAgICAgaW50IEFkZHIgPSAoaW50KUNOLT5nZXRaRXh0VmFsdWUoKTsKKworICAgICAgICAvLyBPdGhlcndpc2UsIGJyZWFrIHRoaXMgZG93biBpbnRvIGFuIExJUyArIGRpc3AuCisgICAgICAgIERpc3AgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoKHNob3J0KUFkZHIgPj4gMiwgTVZUOjppMzIpOworICAgICAgICBCYXNlID0gREFHLmdldFRhcmdldENvbnN0YW50KChBZGRyLShzaWduZWQgc2hvcnQpQWRkcikgPj4gMTYsIE1WVDo6aTMyKTsKKyAgICAgICAgdW5zaWduZWQgT3BjID0gQ04tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMiA/IFBQQzo6TElTIDogUFBDOjpMSVM4OworICAgICAgICBCYXNlID0gU0RWYWx1ZShEQUcuZ2V0TWFjaGluZU5vZGUoT3BjLCBkbCwgQ04tPmdldFZhbHVlVHlwZSgwKSwgQmFzZSksMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIERpc3AgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoMCwgZ2V0UG9pbnRlclR5KCkpOworICBpZiAoRnJhbWVJbmRleFNETm9kZSAqRkkgPSBkeW5fY2FzdDxGcmFtZUluZGV4U0ROb2RlPihOKSkKKyAgICBCYXNlID0gREFHLmdldFRhcmdldEZyYW1lSW5kZXgoRkktPmdldEluZGV4KCksIE4uZ2V0VmFsdWVUeXBlKCkpOworICBlbHNlCisgICAgQmFzZSA9IE47CisgIHJldHVybiB0cnVlOyAgICAgIC8vIFtyKzBdCit9CisKKworLy8vIGdldFByZUluZGV4ZWRBZGRyZXNzUGFydHMgLSByZXR1cm5zIHRydWUgYnkgdmFsdWUsIGJhc2UgcG9pbnRlciBhbmQKKy8vLyBvZmZzZXQgcG9pbnRlciBhbmQgYWRkcmVzc2luZyBtb2RlIGJ5IHJlZmVyZW5jZSBpZiB0aGUgbm9kZSdzIGFkZHJlc3MKKy8vLyBjYW4gYmUgbGVnYWxseSByZXByZXNlbnRlZCBhcyBwcmUtaW5kZXhlZCBsb2FkIC8gc3RvcmUgYWRkcmVzcy4KK2Jvb2wgUFBDVGFyZ2V0TG93ZXJpbmc6OmdldFByZUluZGV4ZWRBZGRyZXNzUGFydHMoU0ROb2RlICpOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6TWVtSW5kZXhlZE1vZGUgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvLyBEaXNhYmxlZCBieSBkZWZhdWx0IGZvciBub3cuCisgIGlmICghRW5hYmxlUFBDUHJlaW5jKSByZXR1cm4gZmFsc2U7CisKKyAgU0RWYWx1ZSBQdHI7CisgIEVWVCBWVDsKKyAgaWYgKExvYWRTRE5vZGUgKkxEID0gZHluX2Nhc3Q8TG9hZFNETm9kZT4oTikpIHsKKyAgICBQdHIgPSBMRC0+Z2V0QmFzZVB0cigpOworICAgIFZUID0gTEQtPmdldE1lbW9yeVZUKCk7CisKKyAgfSBlbHNlIGlmIChTdG9yZVNETm9kZSAqU1QgPSBkeW5fY2FzdDxTdG9yZVNETm9kZT4oTikpIHsKKyAgICBTVCA9IFNUOworICAgIFB0ciA9IFNULT5nZXRCYXNlUHRyKCk7CisgICAgVlQgID0gU1QtPmdldE1lbW9yeVZUKCk7CisgIH0gZWxzZQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBQb3dlclBDIGRvZXNuJ3QgaGF2ZSBwcmVpbmMgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgZm9yIHZlY3RvcnMuCisgIGlmIChWVC5pc1ZlY3RvcigpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBUT0RPOiBDaGVjayByZWcrcmVnIGZpcnN0LgorCisgIC8vIExEVS9TVFUgdXNlIHJlZytpbW0qNCwgb3RoZXJzIHVzZSByZWcraW1tLgorICBpZiAoVlQgIT0gTVZUOjppNjQpIHsKKyAgICAvLyByZWcgKyBpbW0KKyAgICBpZiAoIVNlbGVjdEFkZHJlc3NSZWdJbW0oUHRyLCBPZmZzZXQsIEJhc2UsIERBRykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgLy8gcmVnICsgaW1tICogNC4KKyAgICBpZiAoIVNlbGVjdEFkZHJlc3NSZWdJbW1TaGlmdChQdHIsIE9mZnNldCwgQmFzZSwgREFHKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChMb2FkU0ROb2RlICpMRCA9IGR5bl9jYXN0PExvYWRTRE5vZGU+KE4pKSB7CisgICAgLy8gUFBDNjQgZG9lc24ndCBoYXZlIGx3YXUsIGJ1dCBpdCBkb2VzIGhhdmUgbHdhdXguICBSZWplY3QgcHJlaW5jIGxvYWQgb2YKKyAgICAvLyBzZXh0IGkzMiB0byBpNjQgd2hlbiBhZGRyIG1vZGUgaXMgcitpLgorICAgIGlmIChMRC0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTY0ICYmIExELT5nZXRNZW1vcnlWVCgpID09IE1WVDo6aTMyICYmCisgICAgICAgIExELT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpTRVhUTE9BRCAmJgorICAgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KE9mZnNldCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBBTSA9IElTRDo6UFJFX0lOQzsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTG93ZXJPcGVyYXRpb24gaW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ29uc3RhbnRQb29sKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBFVlQgUHRyVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgQ29uc3RhbnRQb29sU0ROb2RlICpDUCA9IGNhc3Q8Q29uc3RhbnRQb29sU0ROb2RlPihPcCk7CisgIGNvbnN0IENvbnN0YW50ICpDID0gQ1AtPmdldENvbnN0VmFsKCk7CisgIFNEVmFsdWUgQ1BJID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDLCBQdHJWVCwgQ1AtPmdldEFsaWdubWVudCgpKTsKKyAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50KDAsIFB0clZUKTsKKyAgLy8gRklYTUUgdGhlcmUgaXNuJ3QgcmVhbGx5IGFueSBkZWJ1ZyBpbmZvIGhlcmUKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gREFHLmdldFRhcmdldCgpOworCisgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkhpLCBkbCwgUHRyVlQsIENQSSwgWmVybyk7CisgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkxvLCBkbCwgUHRyVlQsIENQSSwgWmVybyk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIG5vbi1kYXJ3aW4gcGxhdGZvcm0sIHdlIGRvbid0IHN1cHBvcnQgbm9uLXN0YXRpYyByZWxvIG1vZGVscworICAvLyB5ZXQuCisgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6U3RhdGljIHx8CisgICAgICAhVE0uZ2V0U3VidGFyZ2V0PFBQQ1N1YnRhcmdldD4oKS5pc0RhcndpbigpKSB7CisgICAgLy8gR2VuZXJhdGUgbm9uLXBpYyBjb2RlIHRoYXQgaGFzIGRpcmVjdCBhY2Nlc3NlcyB0byB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgZ2xvYmFsIGlzIGp1c3QgKGhpKCZnKStsbygmZykpLgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULCBIaSwgTG8pOworICB9CisKKyAgaWYgKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKSB7CisgICAgLy8gV2l0aCBQSUMsIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyBhY3R1YWxseSAiR1IraGkoJkcpIi4KKyAgICBIaSA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShQUENJU0Q6Okdsb2JhbEJhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYygpLCBQdHJWVCksIEhpKTsKKyAgfQorCisgIExvID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJWVCwgSGksIExvKTsKKyAgcmV0dXJuIExvOworfQorCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpMb3dlckp1bXBUYWJsZShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBFVlQgUHRyVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgSnVtcFRhYmxlU0ROb2RlICpKVCA9IGNhc3Q8SnVtcFRhYmxlU0ROb2RlPihPcCk7CisgIFNEVmFsdWUgSlRJID0gREFHLmdldFRhcmdldEp1bXBUYWJsZShKVC0+Z2V0SW5kZXgoKSwgUHRyVlQpOworICBTRFZhbHVlIFplcm8gPSBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpOworICAvLyBGSVhNRSB0aGVyZSBpc24ndCByZWFsbHkgYW55IGRlYnVnIGxvYyBoZXJlCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IERBRy5nZXRUYXJnZXQoKTsKKworICBTRFZhbHVlIEhpID0gREFHLmdldE5vZGUoUFBDSVNEOjpIaSwgZGwsIFB0clZULCBKVEksIFplcm8pOworICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoUFBDSVNEOjpMbywgZGwsIFB0clZULCBKVEksIFplcm8pOworCisgIC8vIElmIHRoaXMgaXMgYSBub24tZGFyd2luIHBsYXRmb3JtLCB3ZSBkb24ndCBzdXBwb3J0IG5vbi1zdGF0aWMgcmVsbyBtb2RlbHMKKyAgLy8geWV0LgorICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlN0YXRpYyB8fAorICAgICAgIVRNLmdldFN1YnRhcmdldDxQUENTdWJ0YXJnZXQ+KCkuaXNEYXJ3aW4oKSkgeworICAgIC8vIEdlbmVyYXRlIG5vbi1waWMgY29kZSB0aGF0IGhhcyBkaXJlY3QgYWNjZXNzZXMgdG8gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIGdsb2JhbCBpcyBqdXN0IChoaSgmZykrbG8oJmcpKS4KKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJWVCwgSGksIExvKTsKKyAgfQorCisgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6UElDXykgeworICAgIC8vIFdpdGggUElDLCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgYWN0dWFsbHkgIkdSK2hpKCZHKSIuCisgICAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoUFBDSVNEOjpHbG9iYWxCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MoKSwgUHRyVlQpLCBIaSk7CisgIH0KKworICBMbyA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsIEhpLCBMbyk7CisgIHJldHVybiBMbzsKK30KKworU0RWYWx1ZSBQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJHbG9iYWxUTFNBZGRyZXNzKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiVExTIG5vdCBpbXBsZW1lbnRlZCBmb3IgUFBDLiIpOworICByZXR1cm4gU0RWYWx1ZSgpOyAvLyBOb3QgcmVhY2hlZAorfQorCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpMb3dlckJsb2NrQWRkcmVzcyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRVZUIFB0clZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIERlYnVnTG9jIERMID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBjb25zdCBCbG9ja0FkZHJlc3MgKkJBID0gY2FzdDxCbG9ja0FkZHJlc3NTRE5vZGU+KE9wKS0+Z2V0QmxvY2tBZGRyZXNzKCk7CisgIFNEVmFsdWUgVGd0QkEgPSBEQUcuZ2V0QmxvY2tBZGRyZXNzKEJBLCBQdHJWVCwgLyppc1RhcmdldD0qL3RydWUpOworICBTRFZhbHVlIFplcm8gPSBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpOworICBTRFZhbHVlIEhpID0gREFHLmdldE5vZGUoUFBDSVNEOjpIaSwgREwsIFB0clZULCBUZ3RCQSwgWmVybyk7CisgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkxvLCBETCwgUHRyVlQsIFRndEJBLCBaZXJvKTsKKworICAvLyBJZiB0aGlzIGlzIGEgbm9uLWRhcndpbiBwbGF0Zm9ybSwgd2UgZG9uJ3Qgc3VwcG9ydCBub24tc3RhdGljIHJlbG8gbW9kZWxzCisgIC8vIHlldC4KKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBEQUcuZ2V0VGFyZ2V0KCk7CisgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6U3RhdGljIHx8CisgICAgICAhVE0uZ2V0U3VidGFyZ2V0PFBQQ1N1YnRhcmdldD4oKS5pc0RhcndpbigpKSB7CisgICAgLy8gR2VuZXJhdGUgbm9uLXBpYyBjb2RlIHRoYXQgaGFzIGRpcmVjdCBhY2Nlc3NlcyB0byBnbG9iYWxzLgorICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSBnbG9iYWwgaXMganVzdCAoaGkoJmcpK2xvKCZnKSkuCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURELCBETCwgUHRyVlQsIEhpLCBMbyk7CisgIH0KKworICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pIHsKKyAgICAvLyBXaXRoIFBJQywgdGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIGFjdHVhbGx5ICJHUitoaSgmRykiLgorICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpBREQsIERMLCBQdHJWVCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKFBQQ0lTRDo6R2xvYmFsQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jKCksIFB0clZUKSwgSGkpOworICB9CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURELCBETCwgUHRyVlQsIEhpLCBMbyk7Cit9CisKK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyR2xvYmFsQWRkcmVzcyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIEVWVCBQdHJWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBHbG9iYWxBZGRyZXNzU0ROb2RlICpHU0ROID0gY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihPcCk7CisgIC8vIEZJWE1FIHRoZXJlIGlzbid0IHJlYWxseSBhbnkgZGVidWcgaW5mbyBoZXJlCisgIERlYnVnTG9jIGRsID0gR1NETi0+Z2V0RGVidWdMb2MoKTsKKyAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gR1NETi0+Z2V0R2xvYmFsKCk7CisgIFNEVmFsdWUgR0EgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgZGwsIFB0clZULCBHU0ROLT5nZXRPZmZzZXQoKSk7CisgIFNEVmFsdWUgWmVybyA9IERBRy5nZXRDb25zdGFudCgwLCBQdHJWVCk7CisKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBEQUcuZ2V0VGFyZ2V0KCk7CisKKyAgLy8gNjQtYml0IFNWUjQgQUJJIGNvZGUgaXMgYWx3YXlzIHBvc2l0aW9uLWluZGVwZW5kZW50LgorICAvLyBUaGUgYWN0dWFsIGFkZHJlc3Mgb2YgdGhlIEdsb2JhbFZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgVE9DLgorICBpZiAoUFBDU3ViVGFyZ2V0LmlzU1ZSNEFCSSgpICYmIFBQQ1N1YlRhcmdldC5pc1BQQzY0KCkpIHsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoUFBDSVNEOjpUT0NfRU5UUlksIGRsLCBNVlQ6Omk2NCwgR0EsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRSZWdpc3RlcihQUEM6OlgyLCBNVlQ6Omk2NCkpOworICB9CisKKyAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKFBQQ0lTRDo6SGksIGRsLCBQdHJWVCwgR0EsIFplcm8pOworICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoUFBDSVNEOjpMbywgZGwsIFB0clZULCBHQSwgWmVybyk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIG5vbi1kYXJ3aW4gcGxhdGZvcm0sIHdlIGRvbid0IHN1cHBvcnQgbm9uLXN0YXRpYyByZWxvIG1vZGVscworICAvLyB5ZXQuCisgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6U3RhdGljIHx8CisgICAgICAhVE0uZ2V0U3VidGFyZ2V0PFBQQ1N1YnRhcmdldD4oKS5pc0RhcndpbigpKSB7CisgICAgLy8gR2VuZXJhdGUgbm9uLXBpYyBjb2RlIHRoYXQgaGFzIGRpcmVjdCBhY2Nlc3NlcyB0byBnbG9iYWxzLgorICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSBnbG9iYWwgaXMganVzdCAoaGkoJmcpK2xvKCZnKSkuCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsIEhpLCBMbyk7CisgIH0KKworICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pIHsKKyAgICAvLyBXaXRoIFBJQywgdGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIGFjdHVhbGx5ICJHUitoaSgmRykiLgorICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJWVCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKFBQQ0lTRDo6R2xvYmFsQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jKCksIFB0clZUKSwgSGkpOworICB9CisKKyAgTG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULCBIaSwgTG8pOworCisgIGlmICghVE0uZ2V0U3VidGFyZ2V0PFBQQ1N1YnRhcmdldD4oKS5oYXNMYXp5UmVzb2x2ZXJTdHViKEdWLCBUTSkpCisgICAgcmV0dXJuIExvOworCisgIC8vIElmIHRoZSBnbG9iYWwgaXMgd2VhayBvciBleHRlcm5hbCwgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZSBsYXp5CisgIC8vIHJlc29sdXRpb24gc3R1Yi4KKyAgcmV0dXJuIERBRy5nZXRMb2FkKFB0clZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBMbywgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7Cit9CisKK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyU0VUQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgSVNEOjpDb25kQ29kZSBDQyA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KE9wLmdldE9wZXJhbmQoMikpLT5nZXQoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIC8vIElmIHdlJ3JlIGNvbXBhcmluZyBmb3IgZXF1YWxpdHkgdG8gemVybywgZXhwb3NlIHRoZSBmYWN0IHRoYXQgdGhpcyBpcworICAvLyBpbXBsZW50ZWQgYXMgYSBjdGx6L3NybCBwYWlyIG9uIHBwYywgc28gdGhhdCB0aGUgZGFnIGNvbWJpbmVyIGNhbgorICAvLyBmb2xkIHRoZSBuZXcgbm9kZXMuCisgIGlmIChDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKSkgeworICAgIGlmIChDLT5pc051bGxWYWx1ZSgpICYmIENDID09IElTRDo6U0VURVEpIHsKKyAgICAgIEVWVCBWVCA9IE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgICAgICBTRFZhbHVlIFpleHQgPSBPcC5nZXRPcGVyYW5kKDApOworICAgICAgaWYgKFZULmJpdHNMVChNVlQ6OmkzMikpIHsKKyAgICAgICAgVlQgPSBNVlQ6OmkzMjsKKyAgICAgICAgWmV4dCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBWVCwgT3AuZ2V0T3BlcmFuZCgwKSk7CisgICAgICB9CisgICAgICB1bnNpZ25lZCBMb2cyYiA9IExvZzJfMzIoVlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgICAgIFNEVmFsdWUgQ2x6ID0gREFHLmdldE5vZGUoSVNEOjpDVExaLCBkbCwgVlQsIFpleHQpOworICAgICAgU0RWYWx1ZSBTY2MgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIFZULCBDbHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChMb2cyYiwgTVZUOjppMzIpKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTVZUOjppMzIsIFNjYyk7CisgICAgfQorICAgIC8vIExlYXZlIGNvbXBhcmlzb25zIGFnYWluc3QgMCBhbmQgLTEgYWxvbmUgZm9yIG5vdywgc2luY2UgdGhleSdyZSB1c3VhbGx5CisgICAgLy8gb3B0aW1pemVkLiAgRklYTUU6IHJldmlzaXQgdGhpcyB3aGVuIHdlIGNhbiBjdXN0b20gbG93ZXIgYWxsIHNldGNjCisgICAgLy8gb3B0aW1pemF0aW9ucy4KKyAgICBpZiAoQy0+aXNBbGxPbmVzVmFsdWUoKSB8fCBDLT5pc051bGxWYWx1ZSgpKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorCisgIC8vIElmIHdlIGhhdmUgYW4gaW50ZWdlciBzZXRlcS9zZXRuZSwgdHVybiBpdCBpbnRvIGEgY29tcGFyZSBhZ2FpbnN0IHplcm8KKyAgLy8gYnkgeG9yJ2luZyB0aGUgcmhzIHdpdGggdGhlIGxocywgd2hpY2ggaXMgZmFzdGVyIHRoYW4gc2V0dGluZyBhCisgIC8vIGNvbmRpdGlvbiByZWdpc3RlciwgcmVhZGluZyBpdCBiYWNrIG91dCwgYW5kIG1hc2tpbmcgdGhlIGNvcnJlY3QgYml0LiAgVGhlCisgIC8vIG5vcm1hbCBhcHByb2FjaCBoZXJlIHVzZXMgc3ViIHRvIGRvIHRoaXMgaW5zdGVhZCBvZiB4b3IuICBVc2luZyB4b3IgZXhwb3NlcworICAvLyB0aGUgcmVzdWx0IHRvIG90aGVyIGJpdC10d2lkZGxpbmcgb3Bwb3J0dW5pdGllcy4KKyAgRVZUIExIU1ZUID0gT3AuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgaWYgKExIU1ZULmlzSW50ZWdlcigpICYmIChDQyA9PSBJU0Q6OlNFVEVRIHx8IENDID09IElTRDo6U0VUTkUpKSB7CisgICAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgICAgU0RWYWx1ZSBTdWIgPSBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIExIU1ZULCBPcC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpKTsKKyAgICByZXR1cm4gREFHLmdldFNldENDKGRsLCBWVCwgU3ViLCBEQUcuZ2V0Q29uc3RhbnQoMCwgTEhTVlQpLCBDQyk7CisgIH0KKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZSBQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJWQUFSRyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFBDU3VidGFyZ2V0ICZTdWJ0YXJnZXQpIGNvbnN0IHsKKworICBsbHZtX3VucmVhY2hhYmxlKCJWQUFSRyBub3QgeWV0IGltcGxlbWVudGVkIGZvciB0aGUgU1ZSNCBBQkkhIik7CisgIHJldHVybiBTRFZhbHVlKCk7IC8vIE5vdCByZWFjaGVkCit9CisKK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyVFJBTVBPTElORShTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFRybXAgPSBPcC5nZXRPcGVyYW5kKDEpOyAvLyB0cmFtcG9saW5lCisgIFNEVmFsdWUgRlB0ciA9IE9wLmdldE9wZXJhbmQoMik7IC8vIG5lc3RlZCBmdW5jdGlvbgorICBTRFZhbHVlIE5lc3QgPSBPcC5nZXRPcGVyYW5kKDMpOyAvLyAnbmVzdCcgcGFyYW1ldGVyIHZhbHVlCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisgIGJvb2wgaXNQUEM2NCA9IChQdHJWVCA9PSBNVlQ6Omk2NCk7CisgIGNvbnN0IFR5cGUgKkludFB0clR5ID0KKyAgICBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRJbnRQdHJUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpEQUcuZ2V0Q29udGV4dCgpKTsKKworICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdFR5IEFyZ3M7CisgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0RW50cnkgRW50cnk7CisKKyAgRW50cnkuVHkgPSBJbnRQdHJUeTsKKyAgRW50cnkuTm9kZSA9IFRybXA7IEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKworICAvLyBUcmFtcFNpemUgPT0gKGlzUFBDNjQgPyA0OCA6IDQwKTsKKyAgRW50cnkuTm9kZSA9IERBRy5nZXRDb25zdGFudChpc1BQQzY0ID8gNDggOiA0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BQQzY0ID8gTVZUOjppNjQgOiBNVlQ6OmkzMik7CisgIEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKworICBFbnRyeS5Ob2RlID0gRlB0cjsgQXJncy5wdXNoX2JhY2soRW50cnkpOworICBFbnRyeS5Ob2RlID0gTmVzdDsgQXJncy5wdXNoX2JhY2soRW50cnkpOworCisgIC8vIExvd2VyIHRvIGEgY2FsbCB0byBfX3RyYW1wb2xpbmVfc2V0dXAoVHJtcCwgVHJhbXBTaXplLCBGUHRyLCBjdHhfcmVnKQorICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gQ2FsbFJlc3VsdCA9CisgICAgTG93ZXJDYWxsVG8oQ2hhaW4sIE9wLmdldFZhbHVlVHlwZSgpLmdldFR5cGVGb3JFVlQoKkRBRy5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBDYWxsaW5nQ29udjo6QywgZmFsc2UsCisgICAgICAgICAgICAgICAgLyppc1JldHVyblZhbHVlVXNlZD0qL3RydWUsCisgICAgICAgICAgICAgICAgREFHLmdldEV4dGVybmFsU3ltYm9sKCJfX3RyYW1wb2xpbmVfc2V0dXAiLCBQdHJWVCksCisgICAgICAgICAgICAgICAgQXJncywgREFHLCBkbCk7CisKKyAgU0RWYWx1ZSBPcHNbXSA9CisgICAgeyBDYWxsUmVzdWx0LmZpcnN0LCBDYWxsUmVzdWx0LnNlY29uZCB9OworCisgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMoT3BzLCAyLCBkbCk7Cit9CisKK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyVkFTVEFSVChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQUENTdWJ0YXJnZXQgJlN1YnRhcmdldCkgY29uc3QgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBQUENGdW5jdGlvbkluZm8gKkZ1bmNJbmZvID0gTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCk7CisKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGlmIChTdWJ0YXJnZXQuaXNEYXJ3aW5BQkkoKSB8fCBTdWJ0YXJnZXQuaXNQUEM2NCgpKSB7CisgICAgLy8gdmFzdGFydCBqdXN0IHN0b3JlcyB0aGUgYWRkcmVzcyBvZiB0aGUgVmFyQXJnc0ZyYW1lSW5kZXggc2xvdCBpbnRvIHRoZQorICAgIC8vIG1lbW9yeSBsb2NhdGlvbiBhcmd1bWVudC4KKyAgICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisgICAgU0RWYWx1ZSBGUiA9IERBRy5nZXRGcmFtZUluZGV4KEZ1bmNJbmZvLT5nZXRWYXJBcmdzRnJhbWVJbmRleCgpLCBQdHJWVCk7CisgICAgY29uc3QgVmFsdWUgKlNWID0gY2FzdDxTcmNWYWx1ZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCgyKSktPmdldFZhbHVlKCk7CisgICAgcmV0dXJuIERBRy5nZXRTdG9yZShPcC5nZXRPcGVyYW5kKDApLCBkbCwgRlIsIE9wLmdldE9wZXJhbmQoMSksIFNWLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgfQorCisgIC8vIEZvciB0aGUgMzItYml0IFNWUjQgQUJJIHdlIGZvbGxvdyB0aGUgbGF5b3V0IG9mIHRoZSB2YV9saXN0IHN0cnVjdC4KKyAgLy8gV2Ugc3VwcG9zZSB0aGUgZ2l2ZW4gdmFfbGlzdCBpcyBhbHJlYWR5IGFsbG9jYXRlZC4KKyAgLy8KKyAgLy8gdHlwZWRlZiBzdHJ1Y3QgeworICAvLyAgY2hhciBncHI7ICAgICAvKiBpbmRleCBpbnRvIHRoZSBhcnJheSBvZiA4IEdQUnMKKyAgLy8gICAgICAgICAgICAgICAgICogc3RvcmVkIGluIHRoZSByZWdpc3RlciBzYXZlIGFyZWEKKyAgLy8gICAgICAgICAgICAgICAgICogZ3ByPTAgY29ycmVzcG9uZHMgdG8gcjMsCisgIC8vICAgICAgICAgICAgICAgICAqIGdwcj0xIHRvIHI0LCBldGMuCisgIC8vICAgICAgICAgICAgICAgICAqLworICAvLyAgY2hhciBmcHI7ICAgICAvKiBpbmRleCBpbnRvIHRoZSBhcnJheSBvZiA4IEZQUnMKKyAgLy8gICAgICAgICAgICAgICAgICogc3RvcmVkIGluIHRoZSByZWdpc3RlciBzYXZlIGFyZWEKKyAgLy8gICAgICAgICAgICAgICAgICogZnByPTAgY29ycmVzcG9uZHMgdG8gZjEsCisgIC8vICAgICAgICAgICAgICAgICAqIGZwcj0xIHRvIGYyLCBldGMuCisgIC8vICAgICAgICAgICAgICAgICAqLworICAvLyAgY2hhciAqb3ZlcmZsb3dfYXJnX2FyZWE7CisgIC8vICAgICAgICAgICAgICAgIC8qIGxvY2F0aW9uIG9uIHN0YWNrIHRoYXQgaG9sZHMKKyAgLy8gICAgICAgICAgICAgICAgICogdGhlIG5leHQgb3ZlcmZsb3cgYXJndW1lbnQKKyAgLy8gICAgICAgICAgICAgICAgICovCisgIC8vICBjaGFyICpyZWdfc2F2ZV9hcmVhOworICAvLyAgICAgICAgICAgICAgIC8qIHdoZXJlIHIzOnIxMCBhbmQgZjE6ZjggKGlmIHNhdmVkKQorICAvLyAgICAgICAgICAgICAgICAqIGFyZSBzdG9yZWQKKyAgLy8gICAgICAgICAgICAgICAgKi8KKyAgLy8gfSB2YV9saXN0WzFdOworCisKKyAgU0RWYWx1ZSBBcmdHUFIgPSBEQUcuZ2V0Q29uc3RhbnQoRnVuY0luZm8tPmdldFZhckFyZ3NOdW1HUFIoKSwgTVZUOjppMzIpOworICBTRFZhbHVlIEFyZ0ZQUiA9IERBRy5nZXRDb25zdGFudChGdW5jSW5mby0+Z2V0VmFyQXJnc051bUZQUigpLCBNVlQ6OmkzMik7CisKKworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisKKyAgU0RWYWx1ZSBTdGFja09mZnNldEZJID0gREFHLmdldEZyYW1lSW5kZXgoRnVuY0luZm8tPmdldFZhckFyZ3NTdGFja09mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJWVCk7CisgIFNEVmFsdWUgRlIgPSBEQUcuZ2V0RnJhbWVJbmRleChGdW5jSW5mby0+Z2V0VmFyQXJnc0ZyYW1lSW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clZUKTsKKworICB1aW50NjRfdCBGcmFtZU9mZnNldCA9IFB0clZULmdldFNpemVJbkJpdHMoKS84OworICBTRFZhbHVlIENvbnN0RnJhbWVPZmZzZXQgPSBEQUcuZ2V0Q29uc3RhbnQoRnJhbWVPZmZzZXQsIFB0clZUKTsKKworICB1aW50NjRfdCBTdGFja09mZnNldCA9IFB0clZULmdldFNpemVJbkJpdHMoKS84IC0gMTsKKyAgU0RWYWx1ZSBDb25zdFN0YWNrT2Zmc2V0ID0gREFHLmdldENvbnN0YW50KFN0YWNrT2Zmc2V0LCBQdHJWVCk7CisKKyAgdWludDY0X3QgRlBST2Zmc2V0ID0gMTsKKyAgU0RWYWx1ZSBDb25zdEZQUk9mZnNldCA9IERBRy5nZXRDb25zdGFudChGUFJPZmZzZXQsIFB0clZUKTsKKworICBjb25zdCBWYWx1ZSAqU1YgPSBjYXN0PFNyY1ZhbHVlU0ROb2RlPihPcC5nZXRPcGVyYW5kKDIpKS0+Z2V0VmFsdWUoKTsKKworICAvLyBTdG9yZSBmaXJzdCBieXRlIDogbnVtYmVyIG9mIGludCByZWdzCisgIFNEVmFsdWUgZmlyc3RTdG9yZSA9IERBRy5nZXRUcnVuY1N0b3JlKE9wLmdldE9wZXJhbmQoMCksIGRsLCBBcmdHUFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMSksIFNWLCAwLCBNVlQ6Omk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICB1aW50NjRfdCBuZXh0T2Zmc2V0ID0gRlBST2Zmc2V0OworICBTRFZhbHVlIG5leHRQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULCBPcC5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0RlBST2Zmc2V0KTsKKworICAvLyBTdG9yZSBzZWNvbmQgYnl0ZSA6IG51bWJlciBvZiBmbG9hdCByZWdzCisgIFNEVmFsdWUgc2Vjb25kU3RvcmUgPQorICAgIERBRy5nZXRUcnVuY1N0b3JlKGZpcnN0U3RvcmUsIGRsLCBBcmdGUFIsIG5leHRQdHIsIFNWLCBuZXh0T2Zmc2V0LCBNVlQ6Omk4LAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgIG5leHRPZmZzZXQgKz0gU3RhY2tPZmZzZXQ7CisgIG5leHRQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULCBuZXh0UHRyLCBDb25zdFN0YWNrT2Zmc2V0KTsKKworICAvLyBTdG9yZSBzZWNvbmQgd29yZCA6IGFyZ3VtZW50cyBnaXZlbiBvbiBzdGFjaworICBTRFZhbHVlIHRoaXJkU3RvcmUgPQorICAgIERBRy5nZXRTdG9yZShzZWNvbmRTdG9yZSwgZGwsIFN0YWNrT2Zmc2V0RkksIG5leHRQdHIsIFNWLCBuZXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICBuZXh0T2Zmc2V0ICs9IEZyYW1lT2Zmc2V0OworICBuZXh0UHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJWVCwgbmV4dFB0ciwgQ29uc3RGcmFtZU9mZnNldCk7CisKKyAgLy8gU3RvcmUgdGhpcmQgd29yZCA6IGFyZ3VtZW50cyBnaXZlbiBpbiByZWdpc3RlcnMKKyAgcmV0dXJuIERBRy5nZXRTdG9yZSh0aGlyZFN0b3JlLCBkbCwgRlIsIG5leHRQdHIsIFNWLCBuZXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisKK30KKworI2luY2x1ZGUgIlBQQ0dlbkNhbGxpbmdDb252LmluYyIKKworc3RhdGljIGJvb2wgQ0NfUFBDX1NWUjRfQ3VzdG9tX0R1bW15KHVuc2lnbmVkICZWYWxObywgRVZUICZWYWxWVCwgRVZUICZMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyAmTG9jSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgJkFyZ0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU3RhdGUgJlN0YXRlKSB7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBDQ19QUENfU1ZSNF9DdXN0b21fQWxpZ25BcmdSZWdzKHVuc2lnbmVkICZWYWxObywgRVZUICZWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUICZMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSAmQXJnRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU3RhdGUgJlN0YXRlKSB7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBBcmdSZWdzW10gPSB7CisgICAgUFBDOjpSMywgUFBDOjpSNCwgUFBDOjpSNSwgUFBDOjpSNiwKKyAgICBQUEM6OlI3LCBQUEM6OlI4LCBQUEM6OlI5LCBQUEM6OlIxMCwKKyAgfTsKKyAgY29uc3QgdW5zaWduZWQgTnVtQXJnUmVncyA9IGFycmF5X2xlbmd0aG9mKEFyZ1JlZ3MpOworICAKKyAgdW5zaWduZWQgUmVnTnVtID0gU3RhdGUuZ2V0Rmlyc3RVbmFsbG9jYXRlZChBcmdSZWdzLCBOdW1BcmdSZWdzKTsKKworICAvLyBTa2lwIG9uZSByZWdpc3RlciBpZiB0aGUgZmlyc3QgdW5hbGxvY2F0ZWQgcmVnaXN0ZXIgaGFzIGFuIGV2ZW4gcmVnaXN0ZXIKKyAgLy8gbnVtYmVyIGFuZCB0aGVyZSBhcmUgc3RpbGwgYXJndW1lbnQgcmVnaXN0ZXJzIGF2YWlsYWJsZSB3aGljaCBoYXZlIG5vdCBiZWVuCisgIC8vIGFsbG9jYXRlZCB5ZXQuIFJlZ051bSBpcyBhY3R1YWxseSBhbiBpbmRleCBpbnRvIEFyZ1JlZ3MsIHdoaWNoIG1lYW5zIHdlCisgIC8vIG5lZWQgdG8gc2tpcCBhIHJlZ2lzdGVyIGlmIFJlZ051bSBpcyBvZGQuCisgIGlmIChSZWdOdW0gIT0gTnVtQXJnUmVncyAmJiBSZWdOdW0gJSAyID09IDEpIHsKKyAgICBTdGF0ZS5BbGxvY2F0ZVJlZyhBcmdSZWdzW1JlZ051bV0pOworICB9CisgIAorICAvLyBBbHdheXMgcmV0dXJuIGZhbHNlIGhlcmUsIGFzIHRoaXMgZnVuY3Rpb24gb25seSBtYWtlcyBzdXJlIHRoYXQgdGhlIGZpcnN0CisgIC8vIHVuYWxsb2NhdGVkIHJlZ2lzdGVyIGhhcyBhbiBvZGQgcmVnaXN0ZXIgbnVtYmVyIGFuZCBkb2VzIG5vdCBhY3R1YWxseQorICAvLyBhbGxvY2F0ZSBhIHJlZ2lzdGVyIGZvciB0aGUgY3VycmVudCBhcmd1bWVudC4KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBDQ19QUENfU1ZSNF9DdXN0b21fQWxpZ25GUEFyZ1JlZ3ModW5zaWduZWQgJlZhbE5vLCBFVlQgJlZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCAmTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5ICZBcmdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1N0YXRlICZTdGF0ZSkgeworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQXJnUmVnc1tdID0geworICAgIFBQQzo6RjEsIFBQQzo6RjIsIFBQQzo6RjMsIFBQQzo6RjQsIFBQQzo6RjUsIFBQQzo6RjYsIFBQQzo6RjcsCisgICAgUFBDOjpGOAorICB9OworCisgIGNvbnN0IHVuc2lnbmVkIE51bUFyZ1JlZ3MgPSBhcnJheV9sZW5ndGhvZihBcmdSZWdzKTsKKyAgCisgIHVuc2lnbmVkIFJlZ051bSA9IFN0YXRlLmdldEZpcnN0VW5hbGxvY2F0ZWQoQXJnUmVncywgTnVtQXJnUmVncyk7CisKKyAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgRmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIgbGVmdCB3ZSBuZWVkIHRvIHB1dCBib3RoIGY2NAorICAvLyB2YWx1ZXMgb2YgYSBzcGxpdCBwcGNfZnAxMjggdmFsdWUgb24gdGhlIHN0YWNrLgorICBpZiAoUmVnTnVtICE9IE51bUFyZ1JlZ3MgJiYgQXJnUmVnc1tSZWdOdW1dID09IFBQQzo6RjgpIHsKKyAgICBTdGF0ZS5BbGxvY2F0ZVJlZyhBcmdSZWdzW1JlZ051bV0pOworICB9CisgIAorICAvLyBBbHdheXMgcmV0dXJuIGZhbHNlIGhlcmUsIGFzIHRoaXMgZnVuY3Rpb24gb25seSBtYWtlcyBzdXJlIHRoYXQgdGhlIHR3byBmNjQKKyAgLy8gdmFsdWVzIGEgcHBjX2ZwMTI4IHZhbHVlIGlzIHNwbGl0IGludG8gYXJlIGJvdGggcGFzc2VkIGluIHJlZ2lzdGVycyBvciBib3RoCisgIC8vIHBhc3NlZCBvbiB0aGUgc3RhY2sgYW5kIGRvZXMgbm90IGFjdHVhbGx5IGFsbG9jYXRlIGEgcmVnaXN0ZXIgZm9yIHRoZQorICAvLyBjdXJyZW50IGFyZ3VtZW50LgorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBHZXRGUFIgLSBHZXQgdGhlIHNldCBvZiBGUCByZWdpc3RlcnMgdGhhdCBzaG91bGQgYmUgYWxsb2NhdGVkIGZvciBhcmd1bWVudHMsCisvLy8gb24gRGFyd2luLgorc3RhdGljIGNvbnN0IHVuc2lnbmVkICpHZXRGUFIoKSB7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBGUFJbXSA9IHsKKyAgICBQUEM6OkYxLCBQUEM6OkYyLCBQUEM6OkYzLCBQUEM6OkY0LCBQUEM6OkY1LCBQUEM6OkY2LCBQUEM6OkY3LAorICAgIFBQQzo6RjgsIFBQQzo6RjksIFBQQzo6RjEwLCBQUEM6OkYxMSwgUFBDOjpGMTIsIFBQQzo6RjEzCisgIH07CisKKyAgcmV0dXJuIEZQUjsKK30KKworLy8vIENhbGN1bGF0ZVN0YWNrU2xvdFNpemUgLSBDYWxjdWxhdGVzIHRoZSBzaXplIHJlc2VydmVkIGZvciB0aGlzIGFyZ3VtZW50IG9uCisvLy8gdGhlIHN0YWNrLgorc3RhdGljIHVuc2lnbmVkIENhbGN1bGF0ZVN0YWNrU2xvdFNpemUoRVZUIEFyZ1ZULCBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQdHJCeXRlU2l6ZSkgeworICB1bnNpZ25lZCBBcmdTaXplID0gQXJnVlQuZ2V0U2l6ZUluQml0cygpLzg7CisgIGlmIChGbGFncy5pc0J5VmFsKCkpCisgICAgQXJnU2l6ZSA9IEZsYWdzLmdldEJ5VmFsU2l6ZSgpOworICBBcmdTaXplID0gKChBcmdTaXplICsgUHRyQnl0ZVNpemUgLSAxKS9QdHJCeXRlU2l6ZSkgKiBQdHJCeXRlU2l6ZTsKKworICByZXR1cm4gQXJnU2l6ZTsKK30KKworU0RWYWx1ZQorUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyRm9ybWFsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CisgIGlmIChQUENTdWJUYXJnZXQuaXNTVlI0QUJJKCkgJiYgIVBQQ1N1YlRhcmdldC5pc1BQQzY0KCkpIHsKKyAgICByZXR1cm4gTG93ZXJGb3JtYWxBcmd1bWVudHNfU1ZSNChDaGFpbiwgQ2FsbENvbnYsIGlzVmFyQXJnLCBJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIERBRywgSW5WYWxzKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTG93ZXJGb3JtYWxBcmd1bWVudHNfRGFyd2luKENoYWluLCBDYWxsQ29udiwgaXNWYXJBcmcsIElucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBEQUcsIEluVmFscyk7CisgIH0KK30KKworU0RWYWx1ZQorUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyRm9ybWFsQXJndW1lbnRzX1NWUjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworCisgIC8vIDMyLWJpdCBTVlI0IEFCSSBTdGFjayBGcmFtZSBMYXlvdXQ6CisgIC8vICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICArLS0+ICB8ICAgICAgICAgICAgQmFjayBjaGFpbiAgICAgICAgICAgICB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICB8ICAgICB8IEZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIHNhdmUgYXJlYSB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICB8ICAgICB8ICAgIEdlbmVyYWwgcmVnaXN0ZXIgc2F2ZSBhcmVhICAgICB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICB8ICAgICB8ICAgICAgICAgIENSIHNhdmUgd29yZCAgICAgICAgICAgICB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICB8ICAgICB8ICAgICAgICAgVlJTQVZFIHNhdmUgd29yZCAgICAgICAgICB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICB8ICAgICB8ICAgICAgICAgQWxpZ25tZW50IHBhZGRpbmcgICAgICAgICB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICB8ICAgICB8ICAgICBWZWN0b3IgcmVnaXN0ZXIgc2F2ZSBhcmVhICAgICB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICB8ICAgICB8ICAgICAgIExvY2FsIHZhcmlhYmxlIHNwYWNlICAgICAgICB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICB8ICAgICB8ICAgICAgICBQYXJhbWV0ZXIgbGlzdCBhcmVhICAgICAgICB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICB8ICAgICB8ICAgICAgICAgICBMUiBzYXZlIHdvcmQgICAgICAgICAgICB8CisgIC8vICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vIFNQLS0+ICArLS0tICB8ICAgICAgICAgICAgQmFjayBjaGFpbiAgICAgICAgICAgICB8CisgIC8vICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vCisgIC8vIFNwZWNpZmljYXRpb25zOgorICAvLyAgIFN5c3RlbSBWIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UgUG93ZXJQQyBQcm9jZXNzb3IgU3VwcGxlbWVudAorICAvLyAgIEFsdGlWZWMgVGVjaG5vbG9neSBQcm9ncmFtbWluZyBJbnRlcmZhY2UgTWFudWFsCisgIAorICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgUFBDRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88UFBDRnVuY3Rpb25JbmZvPigpOworCisgIEVWVCBQdHJWVCA9IERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKS5nZXRQb2ludGVyVHkoKTsKKyAgLy8gUG90ZW50aWFsIHRhaWwgY2FsbHMgY291bGQgY2F1c2Ugb3ZlcndyaXRpbmcgb2YgYXJndW1lbnQgc3RhY2sgc2xvdHMuCisgIGJvb2wgaXNJbW11dGFibGUgPSAhKEd1YXJhbnRlZWRUYWlsQ2FsbE9wdCAmJiAoQ2FsbENvbnY9PUNhbGxpbmdDb252OjpGYXN0KSk7CisgIHVuc2lnbmVkIFB0ckJ5dGVTaXplID0gNDsKKworICAvLyBBc3NpZ24gbG9jYXRpb25zIHRvIGFsbCBvZiB0aGUgaW5jb21pbmcgYXJndW1lbnRzLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IEFyZ0xvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLCBBcmdMb2NzLAorICAgICAgICAgICAgICAgICAqREFHLmdldENvbnRleHQoKSk7CisKKyAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIGxpbmthZ2UgYXJlYSBvbiB0aGUgc3RhY2suCisgIENDSW5mby5BbGxvY2F0ZVN0YWNrKFBQQ0ZyYW1lSW5mbzo6Z2V0TGlua2FnZVNpemUoZmFsc2UsIGZhbHNlKSwgUHRyQnl0ZVNpemUpOworCisgIENDSW5mby5BbmFseXplRm9ybWFsQXJndW1lbnRzKElucywgQ0NfUFBDX1NWUjQpOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ0xvY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENDVmFsQXNzaWduICZWQSA9IEFyZ0xvY3NbaV07CisgICAgCisgICAgLy8gQXJndW1lbnRzIHN0b3JlZCBpbiByZWdpc3RlcnMuCisgICAgaWYgKFZBLmlzUmVnTG9jKCkpIHsKKyAgICAgIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDOworICAgICAgRVZUIFZhbFZUID0gVkEuZ2V0VmFsVlQoKTsKKyAgICAgIAorICAgICAgc3dpdGNoIChWYWxWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVmFsVlQgbm90IHN1cHBvcnRlZCBieSBmb3JtYWwgYXJndW1lbnRzIExvd2VyaW5nIik7CisgICAgICAgIGNhc2UgTVZUOjppMzI6CisgICAgICAgICAgUkMgPSBQUEM6OkdQUkNSZWdpc3RlckNsYXNzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1WVDo6ZjMyOgorICAgICAgICAgIFJDID0gUFBDOjpGNFJDUmVnaXN0ZXJDbGFzczsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVlQ6OmY2NDoKKyAgICAgICAgICBSQyA9IFBQQzo6RjhSQ1JlZ2lzdGVyQ2xhc3M7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVZUOjp2MTZpODoKKyAgICAgICAgY2FzZSBNVlQ6OnY4aTE2OgorICAgICAgICBjYXNlIE1WVDo6djRpMzI6CisgICAgICAgIGNhc2UgTVZUOjp2NGYzMjoKKyAgICAgICAgICBSQyA9IFBQQzo6VlJSQ1JlZ2lzdGVyQ2xhc3M7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJndW1lbnRzIHN0b3JlZCBpbiBwaHlzaWNhbCByZWdpc3RlcnMgaW50byB2aXJ0dWFsIG9uZXMuCisgICAgICB1bnNpZ25lZCBSZWcgPSBNRi5hZGRMaXZlSW4oVkEuZ2V0TG9jUmVnKCksIFJDKTsKKyAgICAgIFNEVmFsdWUgQXJnVmFsdWUgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBSZWcsIFZhbFZUKTsKKworICAgICAgSW5WYWxzLnB1c2hfYmFjayhBcmdWYWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEFyZ3VtZW50IHN0b3JlZCBpbiBtZW1vcnkuCisgICAgICBhc3NlcnQoVkEuaXNNZW1Mb2MoKSk7CisKKyAgICAgIHVuc2lnbmVkIEFyZ1NpemUgPSBWQS5nZXRMb2NWVCgpLmdldFNpemVJbkJpdHMoKSAvIDg7CisgICAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KEFyZ1NpemUsIFZBLmdldExvY01lbU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ltbXV0YWJsZSk7CisKKyAgICAgIC8vIENyZWF0ZSBsb2FkIG5vZGVzIHRvIHJldHJpZXZlIGFyZ3VtZW50cyBmcm9tIHRoZSBzdGFjay4KKyAgICAgIFNEVmFsdWUgRklOID0gREFHLmdldEZyYW1lSW5kZXgoRkksIFB0clZUKTsKKyAgICAgIEluVmFscy5wdXNoX2JhY2soREFHLmdldExvYWQoVkEuZ2V0VmFsVlQoKSwgZGwsIENoYWluLCBGSU4sIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCkpOworICAgIH0KKyAgfQorCisgIC8vIEFzc2lnbiBsb2NhdGlvbnMgdG8gYWxsIG9mIHRoZSBpbmNvbWluZyBhZ2dyZWdhdGUgYnkgdmFsdWUgYXJndW1lbnRzLgorICAvLyBBZ2dyZWdhdGVzIHBhc3NlZCBieSB2YWx1ZSBhcmUgc3RvcmVkIGluIHRoZSBsb2NhbCB2YXJpYWJsZSBzcGFjZSBvZiB0aGUKKyAgLy8gY2FsbGVyJ3Mgc3RhY2sgZnJhbWUsIHJpZ2h0IGFib3ZlIHRoZSBwYXJhbWV0ZXIgbGlzdCBhcmVhLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IEJ5VmFsQXJnTG9jczsKKyAgQ0NTdGF0ZSBDQ0J5VmFsSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCeVZhbEFyZ0xvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKworICAvLyBSZXNlcnZlIHN0YWNrIHNwYWNlIGZvciB0aGUgYWxsb2NhdGlvbnMgaW4gQ0NJbmZvLgorICBDQ0J5VmFsSW5mby5BbGxvY2F0ZVN0YWNrKENDSW5mby5nZXROZXh0U3RhY2tPZmZzZXQoKSwgUHRyQnl0ZVNpemUpOworCisgIENDQnlWYWxJbmZvLkFuYWx5emVGb3JtYWxBcmd1bWVudHMoSW5zLCBDQ19QUENfU1ZSNF9CeVZhbCk7CisKKyAgLy8gQXJlYSB0aGF0IGlzIGF0IGxlYXN0IHJlc2VydmVkIGluIHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbi4KKyAgdW5zaWduZWQgTWluUmVzZXJ2ZWRBcmVhID0gQ0NCeVZhbEluZm8uZ2V0TmV4dFN0YWNrT2Zmc2V0KCk7CisgIAorICAvLyBTZXQgdGhlIHNpemUgdGhhdCBpcyBhdCBsZWFzdCByZXNlcnZlZCBpbiBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbi4gIFRhaWwKKyAgLy8gY2FsbCBvcHRpbWl6ZWQgZnVuY3Rpb24ncyByZXNlcnZlZCBzdGFjayBzcGFjZSBuZWVkcyB0byBiZSBhbGlnbmVkIHNvIHRoYXQKKyAgLy8gdGFraW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHN0YWNrIGFyZWFzIHdpbGwgcmVzdWx0IGluIGFuIGFsaWduZWQKKyAgLy8gc3RhY2suCisgIFBQQ0Z1bmN0aW9uSW5mbyAqRkkgPSBNRi5nZXRJbmZvPFBQQ0Z1bmN0aW9uSW5mbz4oKTsKKworICBNaW5SZXNlcnZlZEFyZWEgPQorICAgIHN0ZDo6bWF4KE1pblJlc2VydmVkQXJlYSwKKyAgICAgICAgICAgICBQUENGcmFtZUluZm86OmdldE1pbkNhbGxGcmFtZVNpemUoZmFsc2UsIGZhbHNlKSk7CisgIAorICB1bnNpZ25lZCBUYXJnZXRBbGlnbiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRUYXJnZXQoKS5nZXRGcmFtZUluZm8oKS0+CisgICAgZ2V0U3RhY2tBbGlnbm1lbnQoKTsKKyAgdW5zaWduZWQgQWxpZ25NYXNrID0gVGFyZ2V0QWxpZ24tMTsKKyAgTWluUmVzZXJ2ZWRBcmVhID0gKE1pblJlc2VydmVkQXJlYSArIEFsaWduTWFzaykgJiB+QWxpZ25NYXNrOworICAKKyAgRkktPnNldE1pblJlc2VydmVkQXJlYShNaW5SZXNlcnZlZEFyZWEpOworCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE1lbU9wczsKKyAgCisgIC8vIElmIHRoZSBmdW5jdGlvbiB0YWtlcyB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLCBtYWtlIGEgZnJhbWUgaW5kZXggZm9yCisgIC8vIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgdmFyYXJnIHZhbHVlLi4uIGZvciBleHBhbnNpb24gb2YgbGx2bS52YV9zdGFydC4KKyAgaWYgKGlzVmFyQXJnKSB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdQQXJnUmVnc1tdID0geworICAgICAgUFBDOjpSMywgUFBDOjpSNCwgUFBDOjpSNSwgUFBDOjpSNiwKKyAgICAgIFBQQzo6UjcsIFBQQzo6UjgsIFBQQzo6UjksIFBQQzo6UjEwLAorICAgIH07CisgICAgY29uc3QgdW5zaWduZWQgTnVtR1BBcmdSZWdzID0gYXJyYXlfbGVuZ3Rob2YoR1BBcmdSZWdzKTsKKworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBGUEFyZ1JlZ3NbXSA9IHsKKyAgICAgIFBQQzo6RjEsIFBQQzo6RjIsIFBQQzo6RjMsIFBQQzo6RjQsIFBQQzo6RjUsIFBQQzo6RjYsIFBQQzo6RjcsCisgICAgICBQUEM6OkY4CisgICAgfTsKKyAgICBjb25zdCB1bnNpZ25lZCBOdW1GUEFyZ1JlZ3MgPSBhcnJheV9sZW5ndGhvZihGUEFyZ1JlZ3MpOworCisgICAgRnVuY0luZm8tPnNldFZhckFyZ3NOdW1HUFIoQ0NJbmZvLmdldEZpcnN0VW5hbGxvY2F0ZWQoR1BBcmdSZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUdQQXJnUmVncykpOworICAgIEZ1bmNJbmZvLT5zZXRWYXJBcmdzTnVtRlBSKENDSW5mby5nZXRGaXJzdFVuYWxsb2NhdGVkKEZQQXJnUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1GUEFyZ1JlZ3MpKTsKKworICAgIC8vIE1ha2Ugcm9vbSBmb3IgTnVtR1BBcmdSZWdzIGFuZCBOdW1GUEFyZ1JlZ3MuCisgICAgaW50IERlcHRoID0gTnVtR1BBcmdSZWdzICogUHRyVlQuZ2V0U2l6ZUluQml0cygpLzggKworICAgICAgICAgICAgICAgIE51bUZQQXJnUmVncyAqIEVWVChNVlQ6OmY2NCkuZ2V0U2l6ZUluQml0cygpLzg7CisKKyAgICBGdW5jSW5mby0+c2V0VmFyQXJnc1N0YWNrT2Zmc2V0KAorICAgICAgTUZJLT5DcmVhdGVGaXhlZE9iamVjdChQdHJWVC5nZXRTaXplSW5CaXRzKCkvOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NJbmZvLmdldE5leHRTdGFja09mZnNldCgpLCB0cnVlKSk7CisKKyAgICBGdW5jSW5mby0+c2V0VmFyQXJnc0ZyYW1lSW5kZXgoTUZJLT5DcmVhdGVTdGFja09iamVjdChEZXB0aCwgOCwgZmFsc2UpKTsKKyAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZ1bmNJbmZvLT5nZXRWYXJBcmdzRnJhbWVJbmRleCgpLCBQdHJWVCk7CisKKyAgICAvLyBUaGUgZml4ZWQgaW50ZWdlciBhcmd1bWVudHMgb2YgYSB2YXJpYWRpYyBmdW5jdGlvbiBhcmUKKyAgICAvLyBzdG9yZWQgdG8gdGhlIFZhckFyZ3NGcmFtZUluZGV4IG9uIHRoZSBzdGFjay4KKyAgICB1bnNpZ25lZCBHUFJJbmRleCA9IDA7CisgICAgZm9yICg7IEdQUkluZGV4ICE9IEZ1bmNJbmZvLT5nZXRWYXJBcmdzTnVtR1BSKCk7ICsrR1BSSW5kZXgpIHsKKyAgICAgIFNEVmFsdWUgVmFsID0gREFHLmdldFJlZ2lzdGVyKEdQQXJnUmVnc1tHUFJJbmRleF0sIFB0clZUKTsKKyAgICAgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBWYWwsIEZJTiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgIE1lbU9wcy5wdXNoX2JhY2soU3RvcmUpOworICAgICAgLy8gSW5jcmVtZW50IHRoZSBhZGRyZXNzIGJ5IGZvdXIgZm9yIHRoZSBuZXh0IGFyZ3VtZW50IHRvIHN0b3JlCisgICAgICBTRFZhbHVlIFB0ck9mZiA9IERBRy5nZXRDb25zdGFudChQdHJWVC5nZXRTaXplSW5CaXRzKCkvOCwgUHRyVlQpOworICAgICAgRklOID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJPZmYuZ2V0VmFsdWVUeXBlKCksIEZJTiwgUHRyT2ZmKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIHZhcmFyZywgc3RvcmUgYW55IHJlbWFpbmluZyBpbnRlZ2VyIGFyZ3VtZW50IHJlZ3MKKyAgICAvLyB0byB0aGVpciBzcG90cyBvbiB0aGUgc3RhY2sgc28gdGhhdCB0aGV5IG1heSBiZSBsb2FkZWQgYnkgZGVmZXJlbmNpbmcgdGhlCisgICAgLy8gcmVzdWx0IG9mIHZhX25leHQuCisgICAgZm9yICg7IEdQUkluZGV4ICE9IE51bUdQQXJnUmVnczsgKytHUFJJbmRleCkgeworICAgICAgdW5zaWduZWQgVlJlZyA9IE1GLmFkZExpdmVJbihHUEFyZ1JlZ3NbR1BSSW5kZXhdLCAmUFBDOjpHUFJDUmVnQ2xhc3MpOworCisgICAgICBTRFZhbHVlIFZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIFB0clZUKTsKKyAgICAgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoVmFsLmdldFZhbHVlKDEpLCBkbCwgVmFsLCBGSU4sIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICBNZW1PcHMucHVzaF9iYWNrKFN0b3JlKTsKKyAgICAgIC8vIEluY3JlbWVudCB0aGUgYWRkcmVzcyBieSBmb3VyIGZvciB0aGUgbmV4dCBhcmd1bWVudCB0byBzdG9yZQorICAgICAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0Q29uc3RhbnQoUHRyVlQuZ2V0U2l6ZUluQml0cygpLzgsIFB0clZUKTsKKyAgICAgIEZJTiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyT2ZmLmdldFZhbHVlVHlwZSgpLCBGSU4sIFB0ck9mZik7CisgICAgfQorCisgICAgLy8gRklYTUUgMzItYml0IFNWUjQ6IFdlIG9ubHkgbmVlZCB0byBzYXZlIEZQIGFyZ3VtZW50IHJlZ2lzdGVycyBpZiBDUiBiaXQgNgorICAgIC8vIGlzIHNldC4KKyAgICAKKyAgICAvLyBUaGUgZG91YmxlIGFyZ3VtZW50cyBhcmUgc3RvcmVkIHRvIHRoZSBWYXJBcmdzRnJhbWVJbmRleAorICAgIC8vIG9uIHRoZSBzdGFjay4KKyAgICB1bnNpZ25lZCBGUFJJbmRleCA9IDA7CisgICAgZm9yIChGUFJJbmRleCA9IDA7IEZQUkluZGV4ICE9IEZ1bmNJbmZvLT5nZXRWYXJBcmdzTnVtRlBSKCk7ICsrRlBSSW5kZXgpIHsKKyAgICAgIFNEVmFsdWUgVmFsID0gREFHLmdldFJlZ2lzdGVyKEZQQXJnUmVnc1tGUFJJbmRleF0sIE1WVDo6ZjY0KTsKKyAgICAgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBWYWwsIEZJTiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgIE1lbU9wcy5wdXNoX2JhY2soU3RvcmUpOworICAgICAgLy8gSW5jcmVtZW50IHRoZSBhZGRyZXNzIGJ5IGVpZ2h0IGZvciB0aGUgbmV4dCBhcmd1bWVudCB0byBzdG9yZQorICAgICAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0Q29uc3RhbnQoRVZUKE1WVDo6ZjY0KS5nZXRTaXplSW5CaXRzKCkvOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyVlQpOworICAgICAgRklOID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJPZmYuZ2V0VmFsdWVUeXBlKCksIEZJTiwgUHRyT2ZmKTsKKyAgICB9CisKKyAgICBmb3IgKDsgRlBSSW5kZXggIT0gTnVtRlBBcmdSZWdzOyArK0ZQUkluZGV4KSB7CisgICAgICB1bnNpZ25lZCBWUmVnID0gTUYuYWRkTGl2ZUluKEZQQXJnUmVnc1tGUFJJbmRleF0sICZQUEM6OkY4UkNSZWdDbGFzcyk7CisKKyAgICAgIFNEVmFsdWUgVmFsID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgVlJlZywgTVZUOjpmNjQpOworICAgICAgU0RWYWx1ZSBTdG9yZSA9IERBRy5nZXRTdG9yZShWYWwuZ2V0VmFsdWUoMSksIGRsLCBWYWwsIEZJTiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgIE1lbU9wcy5wdXNoX2JhY2soU3RvcmUpOworICAgICAgLy8gSW5jcmVtZW50IHRoZSBhZGRyZXNzIGJ5IGVpZ2h0IGZvciB0aGUgbmV4dCBhcmd1bWVudCB0byBzdG9yZQorICAgICAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0Q29uc3RhbnQoRVZUKE1WVDo6ZjY0KS5nZXRTaXplSW5CaXRzKCkvOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyVlQpOworICAgICAgRklOID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJPZmYuZ2V0VmFsdWVUeXBlKCksIEZJTiwgUHRyT2ZmKTsKKyAgICB9CisgIH0KKworICBpZiAoIU1lbU9wcy5lbXB0eSgpKQorICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCAmTWVtT3BzWzBdLCBNZW1PcHMuc2l6ZSgpKTsKKworICByZXR1cm4gQ2hhaW47Cit9CisKK1NEVmFsdWUKK1BQQ1RhcmdldExvd2VyaW5nOjpMb3dlckZvcm1hbEFyZ3VtZW50c19EYXJ3aW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworICAvLyBUT0RPOiBhZGQgZGVzY3JpcHRpb24gb2YgUFBDIHN0YWNrIGZyYW1lIGZvcm1hdCwgb3IgYXQgbGVhc3Qgc29tZSBkb2NzLgorICAvLworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgUFBDRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88UFBDRnVuY3Rpb25JbmZvPigpOworCisgIEVWVCBQdHJWVCA9IERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKS5nZXRQb2ludGVyVHkoKTsKKyAgYm9vbCBpc1BQQzY0ID0gUHRyVlQgPT0gTVZUOjppNjQ7CisgIC8vIFBvdGVudGlhbCB0YWlsIGNhbGxzIGNvdWxkIGNhdXNlIG92ZXJ3cml0aW5nIG9mIGFyZ3VtZW50IHN0YWNrIHNsb3RzLgorICBib29sIGlzSW1tdXRhYmxlID0gIShHdWFyYW50ZWVkVGFpbENhbGxPcHQgJiYgKENhbGxDb252PT1DYWxsaW5nQ29udjo6RmFzdCkpOworICB1bnNpZ25lZCBQdHJCeXRlU2l6ZSA9IGlzUFBDNjQgPyA4IDogNDsKKworICB1bnNpZ25lZCBBcmdPZmZzZXQgPSBQUENGcmFtZUluZm86OmdldExpbmthZ2VTaXplKGlzUFBDNjQsIHRydWUpOworICAvLyBBcmVhIHRoYXQgaXMgYXQgbGVhc3QgcmVzZXJ2ZWQgaW4gY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24uCisgIHVuc2lnbmVkIE1pblJlc2VydmVkQXJlYSA9IEFyZ09mZnNldDsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR1BSXzMyW10gPSB7ICAgICAgICAgICAvLyAzMi1iaXQgcmVnaXN0ZXJzLgorICAgIFBQQzo6UjMsIFBQQzo6UjQsIFBQQzo6UjUsIFBQQzo6UjYsCisgICAgUFBDOjpSNywgUFBDOjpSOCwgUFBDOjpSOSwgUFBDOjpSMTAsCisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBHUFJfNjRbXSA9IHsgICAgICAgICAgIC8vIDY0LWJpdCByZWdpc3RlcnMuCisgICAgUFBDOjpYMywgUFBDOjpYNCwgUFBDOjpYNSwgUFBDOjpYNiwKKyAgICBQUEM6Olg3LCBQUEM6Olg4LCBQUEM6Olg5LCBQUEM6OlgxMCwKKyAgfTsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgKkZQUiA9IEdldEZQUigpOworCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBWUltdID0geworICAgIFBQQzo6VjIsIFBQQzo6VjMsIFBQQzo6VjQsIFBQQzo6VjUsIFBQQzo6VjYsIFBQQzo6VjcsIFBQQzo6VjgsCisgICAgUFBDOjpWOSwgUFBDOjpWMTAsIFBQQzo6VjExLCBQUEM6OlYxMiwgUFBDOjpWMTMKKyAgfTsKKworICBjb25zdCB1bnNpZ25lZCBOdW1fR1BSX1JlZ3MgPSBhcnJheV9sZW5ndGhvZihHUFJfMzIpOworICBjb25zdCB1bnNpZ25lZCBOdW1fRlBSX1JlZ3MgPSAxMzsKKyAgY29uc3QgdW5zaWduZWQgTnVtX1ZSX1JlZ3MgID0gYXJyYXlfbGVuZ3Rob2YoIFZSKTsKKworICB1bnNpZ25lZCBHUFJfaWR4ID0gMCwgRlBSX2lkeCA9IDAsIFZSX2lkeCA9IDA7CisKKyAgY29uc3QgdW5zaWduZWQgKkdQUiA9IGlzUFBDNjQgPyBHUFJfNjQgOiBHUFJfMzI7CisKKyAgLy8gSW4gMzItYml0IG5vbi12YXJhcmdzIGZ1bmN0aW9ucywgdGhlIHN0YWNrIHNwYWNlIGZvciB2ZWN0b3JzIGlzIGFmdGVyIHRoZQorICAvLyBzdGFjayBzcGFjZSBmb3Igbm9uLXZlY3RvcnMuICBXZSBkbyBub3QgdXNlIHRoaXMgc3BhY2UgdW5sZXNzIHdlIGhhdmUKKyAgLy8gdG9vIG1hbnkgdmVjdG9ycyB0byBmaXQgaW4gcmVnaXN0ZXJzLCBzb21ldGhpbmcgdGhhdCBvbmx5IG9jY3VycyBpbgorICAvLyBjb25zdHJ1Y3RlZCBleGFtcGxlczopLCBidXQgd2UgaGF2ZSB0byB3YWxrIHRoZSBhcmdsaXN0IHRvIGZpZ3VyZQorICAvLyB0aGF0IG91dC4uLmZvciB0aGUgcGF0aG9sb2dpY2FsIGNhc2UsIGNvbXB1dGUgVmVjQXJnT2Zmc2V0IGFzIHRoZQorICAvLyBzdGFydCBvZiB0aGUgdmVjdG9yIHBhcmFtZXRlciBhcmVhLiAgQ29tcHV0aW5nIFZlY0FyZ09mZnNldCBpcyB0aGUKKyAgLy8gZW50aXJlIHBvaW50IG9mIHRoZSBmb2xsb3dpbmcgbG9vcC4KKyAgdW5zaWduZWQgVmVjQXJnT2Zmc2V0ID0gQXJnT2Zmc2V0OworICBpZiAoIWlzVmFyQXJnICYmICFpc1BQQzY0KSB7CisgICAgZm9yICh1bnNpZ25lZCBBcmdObyA9IDAsIGUgPSBJbnMuc2l6ZSgpOyBBcmdObyAhPSBlOworICAgICAgICAgKytBcmdObykgeworICAgICAgRVZUIE9iamVjdFZUID0gSW5zW0FyZ05vXS5WVDsKKyAgICAgIHVuc2lnbmVkIE9ialNpemUgPSBPYmplY3RWVC5nZXRTaXplSW5CaXRzKCkvODsKKyAgICAgIElTRDo6QXJnRmxhZ3NUeSBGbGFncyA9IEluc1tBcmdOb10uRmxhZ3M7CisKKyAgICAgIGlmIChGbGFncy5pc0J5VmFsKCkpIHsKKyAgICAgICAgLy8gT2JqU2l6ZSBpcyB0aGUgdHJ1ZSBzaXplLCBBcmdTaXplIHJvdW5kZWQgdXAgdG8gbXVsdGlwbGUgb2YgcmVncy4KKyAgICAgICAgT2JqU2l6ZSA9IEZsYWdzLmdldEJ5VmFsU2l6ZSgpOworICAgICAgICB1bnNpZ25lZCBBcmdTaXplID0KKyAgICAgICAgICAgICAgICAoKE9ialNpemUgKyBQdHJCeXRlU2l6ZSAtIDEpL1B0ckJ5dGVTaXplKSAqIFB0ckJ5dGVTaXplOworICAgICAgICBWZWNBcmdPZmZzZXQgKz0gQXJnU2l6ZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHN3aXRjaChPYmplY3RWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgYXJndW1lbnQgdHlwZSEiKTsKKyAgICAgIGNhc2UgTVZUOjppMzI6CisgICAgICBjYXNlIE1WVDo6ZjMyOgorICAgICAgICBWZWNBcmdPZmZzZXQgKz0gaXNQUEM2NCA/IDggOiA0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppNjQ6ICAvLyBQUEM2NAorICAgICAgY2FzZSBNVlQ6OmY2NDoKKyAgICAgICAgVmVjQXJnT2Zmc2V0ICs9IDg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6OnY0ZjMyOgorICAgICAgY2FzZSBNVlQ6OnY0aTMyOgorICAgICAgY2FzZSBNVlQ6OnY4aTE2OgorICAgICAgY2FzZSBNVlQ6OnYxNmk4OgorICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLCB3ZSdyZSBvbmx5IGxvb2tpbmcgYXQgTm9udmVjdG9yIGFyZ3MgaGVyZS4KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIFdlJ3ZlIGZvdW5kIHdoZXJlIHRoZSB2ZWN0b3IgcGFyYW1ldGVyIGFyZWEgaW4gbWVtb3J5IGlzLiAgU2tpcCB0aGUKKyAgLy8gZmlyc3QgMTIgcGFyYW1ldGVyczsgdGhlc2UgZG9uJ3QgdXNlIHRoYXQgbWVtb3J5LgorICBWZWNBcmdPZmZzZXQgPSAoKFZlY0FyZ09mZnNldCsxNSkvMTYpKjE2OworICBWZWNBcmdPZmZzZXQgKz0gMTIqMTY7CisKKyAgLy8gQWRkIERBRyBub2RlcyB0byBsb2FkIHRoZSBhcmd1bWVudHMgb3IgY29weSB0aGVtIG91dCBvZiByZWdpc3RlcnMuICBPbgorICAvLyBlbnRyeSB0byBhIGZ1bmN0aW9uIG9uIFBQQywgdGhlIGFyZ3VtZW50cyBzdGFydCBhZnRlciB0aGUgbGlua2FnZSBhcmVhLAorICAvLyBhbHRob3VnaCB0aGUgZmlyc3Qgb25lcyBhcmUgb2Z0ZW4gaW4gcmVnaXN0ZXJzLgorCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE1lbU9wczsKKyAgdW5zaWduZWQgbkFsdGl2ZWNQYXJhbXNBdEVuZCA9IDA7CisgIGZvciAodW5zaWduZWQgQXJnTm8gPSAwLCBlID0gSW5zLnNpemUoKTsgQXJnTm8gIT0gZTsgKytBcmdObykgeworICAgIFNEVmFsdWUgQXJnVmFsOworICAgIGJvb2wgbmVlZHNMb2FkID0gZmFsc2U7CisgICAgRVZUIE9iamVjdFZUID0gSW5zW0FyZ05vXS5WVDsKKyAgICB1bnNpZ25lZCBPYmpTaXplID0gT2JqZWN0VlQuZ2V0U2l6ZUluQml0cygpLzg7CisgICAgdW5zaWduZWQgQXJnU2l6ZSA9IE9ialNpemU7CisgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzID0gSW5zW0FyZ05vXS5GbGFnczsKKworICAgIHVuc2lnbmVkIEN1ckFyZ09mZnNldCA9IEFyZ09mZnNldDsKKworICAgIC8vIFZhcmFyZ3Mgb3IgNjQgYml0IEFsdGl2ZWMgcGFyYW1ldGVycyBhcmUgcGFkZGVkIHRvIGEgMTYgYnl0ZSBib3VuZGFyeS4KKyAgICBpZiAoT2JqZWN0VlQ9PU1WVDo6djRmMzIgfHwgT2JqZWN0VlQ9PU1WVDo6djRpMzIgfHwKKyAgICAgICAgT2JqZWN0VlQ9PU1WVDo6djhpMTYgfHwgT2JqZWN0VlQ9PU1WVDo6djE2aTgpIHsKKyAgICAgIGlmIChpc1ZhckFyZyB8fCBpc1BQQzY0KSB7CisgICAgICAgIE1pblJlc2VydmVkQXJlYSA9ICgoTWluUmVzZXJ2ZWRBcmVhKzE1KS8xNikqMTY7CisgICAgICAgIE1pblJlc2VydmVkQXJlYSArPSBDYWxjdWxhdGVTdGFja1Nsb3RTaXplKE9iamVjdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyQnl0ZVNpemUpOworICAgICAgfSBlbHNlICBuQWx0aXZlY1BhcmFtc0F0RW5kKys7CisgICAgfSBlbHNlCisgICAgICAvLyBDYWxjdWxhdGUgbWluIHJlc2VydmVkIGFyZWEuCisgICAgICBNaW5SZXNlcnZlZEFyZWEgKz0gQ2FsY3VsYXRlU3RhY2tTbG90U2l6ZShJbnNbQXJnTm9dLlZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJCeXRlU2l6ZSk7CisKKyAgICAvLyBGSVhNRSB0aGUgY29kZWdlbiBjYW4gYmUgbXVjaCBpbXByb3ZlZCBpbiBzb21lIGNhc2VzLgorICAgIC8vIFdlIGRvIG5vdCBoYXZlIHRvIGtlZXAgZXZlcnl0aGluZyBpbiBtZW1vcnkuCisgICAgaWYgKEZsYWdzLmlzQnlWYWwoKSkgeworICAgICAgLy8gT2JqU2l6ZSBpcyB0aGUgdHJ1ZSBzaXplLCBBcmdTaXplIHJvdW5kZWQgdXAgdG8gbXVsdGlwbGUgb2YgcmVnaXN0ZXJzLgorICAgICAgT2JqU2l6ZSA9IEZsYWdzLmdldEJ5VmFsU2l6ZSgpOworICAgICAgQXJnU2l6ZSA9ICgoT2JqU2l6ZSArIFB0ckJ5dGVTaXplIC0gMSkvUHRyQnl0ZVNpemUpICogUHRyQnl0ZVNpemU7CisgICAgICAvLyBPYmplY3RzIG9mIHNpemUgMSBhbmQgMiBhcmUgcmlnaHQganVzdGlmaWVkLCBldmVyeXRoaW5nIGVsc2UgaXMKKyAgICAgIC8vIGxlZnQganVzdGlmaWVkLiAgVGhpcyBtZWFucyB0aGUgbWVtb3J5IGFkZHJlc3MgaXMgYWRqdXN0ZWQgZm9yd2FyZHMuCisgICAgICBpZiAoT2JqU2l6ZT09MSB8fCBPYmpTaXplPT0yKSB7CisgICAgICAgIEN1ckFyZ09mZnNldCA9IEN1ckFyZ09mZnNldCArICg0IC0gT2JqU2l6ZSk7CisgICAgICB9CisgICAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIG9iamVjdCBpcyBpdHMgYWRkcmVzcy4KKyAgICAgIGludCBGSSA9IE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoT2JqU2l6ZSwgQ3VyQXJnT2Zmc2V0LCB0cnVlKTsKKyAgICAgIFNEVmFsdWUgRklOID0gREFHLmdldEZyYW1lSW5kZXgoRkksIFB0clZUKTsKKyAgICAgIEluVmFscy5wdXNoX2JhY2soRklOKTsKKyAgICAgIGlmIChPYmpTaXplPT0xIHx8IE9ialNpemU9PTIpIHsKKyAgICAgICAgaWYgKEdQUl9pZHggIT0gTnVtX0dQUl9SZWdzKSB7CisgICAgICAgICAgdW5zaWduZWQgVlJlZyA9IE1GLmFkZExpdmVJbihHUFJbR1BSX2lkeF0sICZQUEM6OkdQUkNSZWdDbGFzcyk7CisgICAgICAgICAgU0RWYWx1ZSBWYWwgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBWUmVnLCBQdHJWVCk7CisgICAgICAgICAgU0RWYWx1ZSBTdG9yZSA9IERBRy5nZXRUcnVuY1N0b3JlKFZhbC5nZXRWYWx1ZSgxKSwgZGwsIFZhbCwgRklOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpTaXplPT0xID8gTVZUOjppOCA6IE1WVDo6aTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICAgIE1lbU9wcy5wdXNoX2JhY2soU3RvcmUpOworICAgICAgICAgICsrR1BSX2lkeDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQXJnT2Zmc2V0ICs9IFB0ckJ5dGVTaXplOworICAgICAgICAKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgQXJnU2l6ZTsgaiArPSBQdHJCeXRlU2l6ZSkgeworICAgICAgICAvLyBTdG9yZSB3aGF0ZXZlciBwaWVjZXMgb2YgdGhlIG9iamVjdCBhcmUgaW4gcmVnaXN0ZXJzCisgICAgICAgIC8vIHRvIG1lbW9yeS4gIEFyZ1ZhbCB3aWxsIGJlIGFkZHJlc3Mgb2YgdGhlIGJlZ2lubmluZyBvZgorICAgICAgICAvLyB0aGUgb2JqZWN0LgorICAgICAgICBpZiAoR1BSX2lkeCAhPSBOdW1fR1BSX1JlZ3MpIHsKKyAgICAgICAgICB1bnNpZ25lZCBWUmVnID0gTUYuYWRkTGl2ZUluKEdQUltHUFJfaWR4XSwgJlBQQzo6R1BSQ1JlZ0NsYXNzKTsKKyAgICAgICAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KFB0ckJ5dGVTaXplLCBBcmdPZmZzZXQsIHRydWUpOworICAgICAgICAgIFNEVmFsdWUgRklOID0gREFHLmdldEZyYW1lSW5kZXgoRkksIFB0clZUKTsKKyAgICAgICAgICBTRFZhbHVlIFZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIFB0clZUKTsKKyAgICAgICAgICBTRFZhbHVlIFN0b3JlID0gREFHLmdldFN0b3JlKFZhbC5nZXRWYWx1ZSgxKSwgZGwsIFZhbCwgRklOLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgICAgICBNZW1PcHMucHVzaF9iYWNrKFN0b3JlKTsKKyAgICAgICAgICArK0dQUl9pZHg7CisgICAgICAgICAgQXJnT2Zmc2V0ICs9IFB0ckJ5dGVTaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFyZ09mZnNldCArPSBBcmdTaXplIC0gKEFyZ09mZnNldC1DdXJBcmdPZmZzZXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKE9iamVjdFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgYXJndW1lbnQgdHlwZSEiKTsKKyAgICBjYXNlIE1WVDo6aTMyOgorICAgICAgaWYgKCFpc1BQQzY0KSB7CisgICAgICAgIGlmIChHUFJfaWR4ICE9IE51bV9HUFJfUmVncykgeworICAgICAgICAgIHVuc2lnbmVkIFZSZWcgPSBNRi5hZGRMaXZlSW4oR1BSW0dQUl9pZHhdLCAmUFBDOjpHUFJDUmVnQ2xhc3MpOworICAgICAgICAgIEFyZ1ZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIE1WVDo6aTMyKTsKKyAgICAgICAgICArK0dQUl9pZHg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmVlZHNMb2FkID0gdHJ1ZTsKKyAgICAgICAgICBBcmdTaXplID0gUHRyQnl0ZVNpemU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxsIGludCBhcmd1bWVudHMgcmVzZXJ2ZSBzdGFjayBzcGFjZSBpbiB0aGUgRGFyd2luIEFCSS4KKyAgICAgICAgQXJnT2Zmc2V0ICs9IFB0ckJ5dGVTaXplOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIEZBTExUSFJPVUdICisgICAgY2FzZSBNVlQ6Omk2NDogIC8vIFBQQzY0CisgICAgICBpZiAoR1BSX2lkeCAhPSBOdW1fR1BSX1JlZ3MpIHsKKyAgICAgICAgdW5zaWduZWQgVlJlZyA9IE1GLmFkZExpdmVJbihHUFJbR1BSX2lkeF0sICZQUEM6Okc4UkNSZWdDbGFzcyk7CisgICAgICAgIEFyZ1ZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIE1WVDo6aTY0KTsKKworICAgICAgICBpZiAoT2JqZWN0VlQgPT0gTVZUOjppMzIpIHsKKyAgICAgICAgICAvLyBQUEM2NCBwYXNzZXMgaTgsIGkxNiwgYW5kIGkzMiB2YWx1ZXMgaW4gaTY0IHJlZ2lzdGVycy4gUHJvbW90ZQorICAgICAgICAgIC8vIHZhbHVlIHRvIE1WVDo6aTY0IGFuZCB0aGVuIHRydW5jYXRlIHRvIHRoZSBjb3JyZWN0IHJlZ2lzdGVyIHNpemUuCisgICAgICAgICAgaWYgKEZsYWdzLmlzU0V4dCgpKQorICAgICAgICAgICAgQXJnVmFsID0gREFHLmdldE5vZGUoSVNEOjpBc3NlcnRTZXh0LCBkbCwgTVZUOjppNjQsIEFyZ1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWYWx1ZVR5cGUoT2JqZWN0VlQpKTsKKyAgICAgICAgICBlbHNlIGlmIChGbGFncy5pc1pFeHQoKSkKKyAgICAgICAgICAgIEFyZ1ZhbCA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0WmV4dCwgZGwsIE1WVDo6aTY0LCBBcmdWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKE9iamVjdFZUKSk7CisKKyAgICAgICAgICBBcmdWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTVZUOjppMzIsIEFyZ1ZhbCk7CisgICAgICAgIH0KKworICAgICAgICArK0dQUl9pZHg7CisgICAgICB9IGVsc2UgeworICAgICAgICBuZWVkc0xvYWQgPSB0cnVlOworICAgICAgICBBcmdTaXplID0gUHRyQnl0ZVNpemU7CisgICAgICB9CisgICAgICAvLyBBbGwgaW50IGFyZ3VtZW50cyByZXNlcnZlIHN0YWNrIHNwYWNlIGluIHRoZSBEYXJ3aW4gQUJJLgorICAgICAgQXJnT2Zmc2V0ICs9IDg7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTVZUOjpmMzI6CisgICAgY2FzZSBNVlQ6OmY2NDoKKyAgICAgIC8vIEV2ZXJ5IDQgYnl0ZXMgb2YgYXJndW1lbnQgc3BhY2UgY29uc3VtZXMgb25lIG9mIHRoZSBHUFJzIGF2YWlsYWJsZSBmb3IKKyAgICAgIC8vIGFyZ3VtZW50IHBhc3NpbmcuCisgICAgICBpZiAoR1BSX2lkeCAhPSBOdW1fR1BSX1JlZ3MpIHsKKyAgICAgICAgKytHUFJfaWR4OworICAgICAgICBpZiAoT2JqU2l6ZSA9PSA4ICYmIEdQUl9pZHggIT0gTnVtX0dQUl9SZWdzICYmICFpc1BQQzY0KQorICAgICAgICAgICsrR1BSX2lkeDsKKyAgICAgIH0KKyAgICAgIGlmIChGUFJfaWR4ICE9IE51bV9GUFJfUmVncykgeworICAgICAgICB1bnNpZ25lZCBWUmVnOworCisgICAgICAgIGlmIChPYmplY3RWVCA9PSBNVlQ6OmYzMikKKyAgICAgICAgICBWUmVnID0gTUYuYWRkTGl2ZUluKEZQUltGUFJfaWR4XSwgJlBQQzo6RjRSQ1JlZ0NsYXNzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFZSZWcgPSBNRi5hZGRMaXZlSW4oRlBSW0ZQUl9pZHhdLCAmUFBDOjpGOFJDUmVnQ2xhc3MpOworCisgICAgICAgIEFyZ1ZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIE9iamVjdFZUKTsKKyAgICAgICAgKytGUFJfaWR4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmVlZHNMb2FkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gQWxsIEZQIGFyZ3VtZW50cyByZXNlcnZlIHN0YWNrIHNwYWNlIGluIHRoZSBEYXJ3aW4gQUJJLgorICAgICAgQXJnT2Zmc2V0ICs9IGlzUFBDNjQgPyA4IDogT2JqU2l6ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVZUOjp2NGYzMjoKKyAgICBjYXNlIE1WVDo6djRpMzI6CisgICAgY2FzZSBNVlQ6OnY4aTE2OgorICAgIGNhc2UgTVZUOjp2MTZpODoKKyAgICAgIC8vIE5vdGUgdGhhdCB2ZWN0b3IgYXJndW1lbnRzIGluIHJlZ2lzdGVycyBkb24ndCByZXNlcnZlIHN0YWNrIHNwYWNlLAorICAgICAgLy8gZXhjZXB0IGluIHZhcmFyZ3MgZnVuY3Rpb25zLgorICAgICAgaWYgKFZSX2lkeCAhPSBOdW1fVlJfUmVncykgeworICAgICAgICB1bnNpZ25lZCBWUmVnID0gTUYuYWRkTGl2ZUluKFZSW1ZSX2lkeF0sICZQUEM6OlZSUkNSZWdDbGFzcyk7CisgICAgICAgIEFyZ1ZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIE9iamVjdFZUKTsKKyAgICAgICAgaWYgKGlzVmFyQXJnKSB7CisgICAgICAgICAgd2hpbGUgKChBcmdPZmZzZXQgJSAxNikgIT0gMCkgeworICAgICAgICAgICAgQXJnT2Zmc2V0ICs9IFB0ckJ5dGVTaXplOworICAgICAgICAgICAgaWYgKEdQUl9pZHggIT0gTnVtX0dQUl9SZWdzKQorICAgICAgICAgICAgICBHUFJfaWR4Kys7CisgICAgICAgICAgfQorICAgICAgICAgIEFyZ09mZnNldCArPSAxNjsKKyAgICAgICAgICBHUFJfaWR4ID0gc3RkOjptaW4oR1BSX2lkeCs0LCBOdW1fR1BSX1JlZ3MpOyAvLyBGSVhNRSBjb3JyZWN0IGZvciBwcGM2ND8KKyAgICAgICAgfQorICAgICAgICArK1ZSX2lkeDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghaXNWYXJBcmcgJiYgIWlzUFBDNjQpIHsKKyAgICAgICAgICAvLyBWZWN0b3JzIGdvIGFmdGVyIGFsbCB0aGUgbm9udmVjdG9ycy4KKyAgICAgICAgICBDdXJBcmdPZmZzZXQgPSBWZWNBcmdPZmZzZXQ7CisgICAgICAgICAgVmVjQXJnT2Zmc2V0ICs9IDE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFZlY3RvcnMgYXJlIGFsaWduZWQuCisgICAgICAgICAgQXJnT2Zmc2V0ID0gKChBcmdPZmZzZXQrMTUpLzE2KSoxNjsKKyAgICAgICAgICBDdXJBcmdPZmZzZXQgPSBBcmdPZmZzZXQ7CisgICAgICAgICAgQXJnT2Zmc2V0ICs9IDE2OworICAgICAgICB9CisgICAgICAgIG5lZWRzTG9hZCA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIGFyZ3VtZW50IHRvIGEgdmlydHVhbCByZWdpc3RlciBpZiB3ZSBkZXRlcm1pbmVkIGFib3ZlCisgICAgLy8gdGhhdCB3ZSByYW4gb3V0IG9mIHBoeXNpY2FsIHJlZ2lzdGVycyBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KKyAgICBpZiAobmVlZHNMb2FkKSB7CisgICAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KE9ialNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckFyZ09mZnNldCArIChBcmdTaXplIC0gT2JqU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW1tdXRhYmxlKTsKKyAgICAgIFNEVmFsdWUgRklOID0gREFHLmdldEZyYW1lSW5kZXgoRkksIFB0clZUKTsKKyAgICAgIEFyZ1ZhbCA9IERBRy5nZXRMb2FkKE9iamVjdFZULCBkbCwgQ2hhaW4sIEZJTiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgfQorCisgICAgSW5WYWxzLnB1c2hfYmFjayhBcmdWYWwpOworICB9CisKKyAgLy8gU2V0IHRoZSBzaXplIHRoYXQgaXMgYXQgbGVhc3QgcmVzZXJ2ZWQgaW4gY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24uICBUYWlsCisgIC8vIGNhbGwgb3B0aW1pemVkIGZ1bmN0aW9uJ3MgcmVzZXJ2ZWQgc3RhY2sgc3BhY2UgbmVlZHMgdG8gYmUgYWxpZ25lZCBzbyB0aGF0CisgIC8vIHRha2luZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBzdGFjayBhcmVhcyB3aWxsIHJlc3VsdCBpbiBhbiBhbGlnbmVkCisgIC8vIHN0YWNrLgorICBQUENGdW5jdGlvbkluZm8gKkZJID0gTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCk7CisgIC8vIEFkZCB0aGUgQWx0aXZlYyBwYXJhbWV0ZXJzIGF0IHRoZSBlbmQsIGlmIG5lZWRlZC4KKyAgaWYgKG5BbHRpdmVjUGFyYW1zQXRFbmQpIHsKKyAgICBNaW5SZXNlcnZlZEFyZWEgPSAoKE1pblJlc2VydmVkQXJlYSsxNSkvMTYpKjE2OworICAgIE1pblJlc2VydmVkQXJlYSArPSAxNipuQWx0aXZlY1BhcmFtc0F0RW5kOworICB9CisgIE1pblJlc2VydmVkQXJlYSA9CisgICAgc3RkOjptYXgoTWluUmVzZXJ2ZWRBcmVhLAorICAgICAgICAgICAgIFBQQ0ZyYW1lSW5mbzo6Z2V0TWluQ2FsbEZyYW1lU2l6ZShpc1BQQzY0LCB0cnVlKSk7CisgIHVuc2lnbmVkIFRhcmdldEFsaWduID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpLT4KKyAgICBnZXRTdGFja0FsaWdubWVudCgpOworICB1bnNpZ25lZCBBbGlnbk1hc2sgPSBUYXJnZXRBbGlnbi0xOworICBNaW5SZXNlcnZlZEFyZWEgPSAoTWluUmVzZXJ2ZWRBcmVhICsgQWxpZ25NYXNrKSAmIH5BbGlnbk1hc2s7CisgIEZJLT5zZXRNaW5SZXNlcnZlZEFyZWEoTWluUmVzZXJ2ZWRBcmVhKTsKKworICAvLyBJZiB0aGUgZnVuY3Rpb24gdGFrZXMgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgbWFrZSBhIGZyYW1lIGluZGV4IGZvcgorICAvLyB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHZhcmFyZyB2YWx1ZS4uLiBmb3IgZXhwYW5zaW9uIG9mIGxsdm0udmFfc3RhcnQuCisgIGlmIChpc1ZhckFyZykgeworICAgIGludCBEZXB0aCA9IEFyZ09mZnNldDsKKworICAgIEZ1bmNJbmZvLT5zZXRWYXJBcmdzRnJhbWVJbmRleCgKKyAgICAgIE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoUHRyVlQuZ2V0U2l6ZUluQml0cygpLzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHRoLCB0cnVlKSk7CisgICAgU0RWYWx1ZSBGSU4gPSBEQUcuZ2V0RnJhbWVJbmRleChGdW5jSW5mby0+Z2V0VmFyQXJnc0ZyYW1lSW5kZXgoKSwgUHRyVlQpOworCisgICAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyB2YXJhcmcsIHN0b3JlIGFueSByZW1haW5pbmcgaW50ZWdlciBhcmd1bWVudCByZWdzCisgICAgLy8gdG8gdGhlaXIgc3BvdHMgb24gdGhlIHN0YWNrIHNvIHRoYXQgdGhleSBtYXkgYmUgbG9hZGVkIGJ5IGRlZmVyZW5jaW5nIHRoZQorICAgIC8vIHJlc3VsdCBvZiB2YV9uZXh0LgorICAgIGZvciAoOyBHUFJfaWR4ICE9IE51bV9HUFJfUmVnczsgKytHUFJfaWR4KSB7CisgICAgICB1bnNpZ25lZCBWUmVnOworICAgICAgCisgICAgICBpZiAoaXNQUEM2NCkKKyAgICAgICAgVlJlZyA9IE1GLmFkZExpdmVJbihHUFJbR1BSX2lkeF0sICZQUEM6Okc4UkNSZWdDbGFzcyk7CisgICAgICBlbHNlCisgICAgICAgIFZSZWcgPSBNRi5hZGRMaXZlSW4oR1BSW0dQUl9pZHhdLCAmUFBDOjpHUFJDUmVnQ2xhc3MpOworCisgICAgICBTRFZhbHVlIFZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIFB0clZUKTsKKyAgICAgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoVmFsLmdldFZhbHVlKDEpLCBkbCwgVmFsLCBGSU4sIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICBNZW1PcHMucHVzaF9iYWNrKFN0b3JlKTsKKyAgICAgIC8vIEluY3JlbWVudCB0aGUgYWRkcmVzcyBieSBmb3VyIGZvciB0aGUgbmV4dCBhcmd1bWVudCB0byBzdG9yZQorICAgICAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0Q29uc3RhbnQoUHRyVlQuZ2V0U2l6ZUluQml0cygpLzgsIFB0clZUKTsKKyAgICAgIEZJTiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyT2ZmLmdldFZhbHVlVHlwZSgpLCBGSU4sIFB0ck9mZik7CisgICAgfQorICB9CisKKyAgaWYgKCFNZW1PcHMuZW1wdHkoKSkKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgJk1lbU9wc1swXSwgTWVtT3BzLnNpemUoKSk7CisKKyAgcmV0dXJuIENoYWluOworfQorCisvLy8gQ2FsY3VsYXRlUGFyYW1ldGVyQW5kTGlua2FnZUFyZWFTaXplIC0gR2V0IHRoZSBzaXplIG9mIHRoZSBwYXJhbXRlciBwbHVzCisvLy8gbGlua2FnZSBhcmVhIGZvciB0aGUgRGFyd2luIEFCSS4KK3N0YXRpYyB1bnNpZ25lZAorQ2FsY3VsYXRlUGFyYW1ldGVyQW5kTGlua2FnZUFyZWFTaXplKFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQUEM2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmbkFsdGl2ZWNQYXJhbXNBdEVuZCkgeworICAvLyBDb3VudCBob3cgbWFueSBieXRlcyBhcmUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjaywgaW5jbHVkaW5nIHRoZSBsaW5rYWdlCisgIC8vIGFyZWEsIGFuZCBwYXJhbWV0ZXIgcGFzc2luZyBhcmVhLiAgV2Ugc3RhcnQgd2l0aCAyNC80OCBieXRlcywgd2hpY2ggaXMKKyAgLy8gcHJlcmVzZXJ2ZWQgc3BhY2UgZm9yIFtTUF1bQ1JdW0xSXVszIHggdW51c2VkXS4KKyAgdW5zaWduZWQgTnVtQnl0ZXMgPSBQUENGcmFtZUluZm86OmdldExpbmthZ2VTaXplKGlzUFBDNjQsIHRydWUpOworICB1bnNpZ25lZCBOdW1PcHMgPSBPdXRzLnNpemUoKTsKKyAgdW5zaWduZWQgUHRyQnl0ZVNpemUgPSBpc1BQQzY0ID8gOCA6IDQ7CisKKyAgLy8gQWRkIHVwIGFsbCB0aGUgc3BhY2UgYWN0dWFsbHkgdXNlZC4KKyAgLy8gSW4gMzItYml0IG5vbi12YXJhcmdzIGNhbGxzLCBBbHRpdmVjIHBhcmFtZXRlcnMgYWxsIGdvIGF0IHRoZSBlbmQ7IHVzdWFsbHkKKyAgLy8gdGhleSBhbGwgZ28gaW4gcmVnaXN0ZXJzLCBidXQgd2UgbXVzdCByZXNlcnZlIHN0YWNrIHNwYWNlIGZvciB0aGVtIGZvcgorICAvLyBwb3NzaWJsZSB1c2UgYnkgdGhlIGNhbGxlci4gIEluIHZhcmFyZ3Mgb3IgNjQtYml0IGNhbGxzLCBwYXJhbWV0ZXJzIGFyZQorICAvLyBhc3NpZ25lZCBzdGFjayBzcGFjZSBpbiBvcmRlciwgd2l0aCBwYWRkaW5nIHNvIEFsdGl2ZWMgcGFyYW1ldGVycyBhcmUKKyAgLy8gMTYtYnl0ZSBhbGlnbmVkLgorICBuQWx0aXZlY1BhcmFtc0F0RW5kID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHM7ICsraSkgeworICAgIFNEVmFsdWUgQXJnID0gT3V0VmFsc1tpXTsKKyAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MgPSBPdXRzW2ldLkZsYWdzOworICAgIEVWVCBBcmdWVCA9IE91dHNbaV0uVlQ7CisgICAgLy8gVmFyYXJncyBBbHRpdmVjIHBhcmFtZXRlcnMgYXJlIHBhZGRlZCB0byBhIDE2IGJ5dGUgYm91bmRhcnkuCisgICAgaWYgKEFyZ1ZUPT1NVlQ6OnY0ZjMyIHx8IEFyZ1ZUPT1NVlQ6OnY0aTMyIHx8CisgICAgICAgIEFyZ1ZUPT1NVlQ6OnY4aTE2IHx8IEFyZ1ZUPT1NVlQ6OnYxNmk4KSB7CisgICAgICBpZiAoIWlzVmFyQXJnICYmICFpc1BQQzY0KSB7CisgICAgICAgIC8vIE5vbi12YXJhcmdzIEFsdGl2ZWMgcGFyYW1ldGVycyBnbyBhZnRlciBhbGwgdGhlIG5vbi1BbHRpdmVjCisgICAgICAgIC8vIHBhcmFtZXRlcnM7IGhhbmRsZSB0aG9zZSBsYXRlciBzbyB3ZSBrbm93IGhvdyBtdWNoIHBhZGRpbmcgd2UgbmVlZC4KKyAgICAgICAgbkFsdGl2ZWNQYXJhbXNBdEVuZCsrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIFZhcmFyZ3MgYW5kIDY0LWJpdCBBbHRpdmVjIHBhcmFtZXRlcnMgYXJlIHBhZGRlZCB0byAxNiBieXRlIGJvdW5kYXJ5LgorICAgICAgTnVtQnl0ZXMgPSAoKE51bUJ5dGVzKzE1KS8xNikqMTY7CisgICAgfQorICAgIE51bUJ5dGVzICs9IENhbGN1bGF0ZVN0YWNrU2xvdFNpemUoQXJnVlQsIEZsYWdzLCBQdHJCeXRlU2l6ZSk7CisgIH0KKworICAgLy8gQWxsb3cgZm9yIEFsdGl2ZWMgcGFyYW1ldGVycyBhdCB0aGUgZW5kLCBpZiBuZWVkZWQuCisgIGlmIChuQWx0aXZlY1BhcmFtc0F0RW5kKSB7CisgICAgTnVtQnl0ZXMgPSAoKE51bUJ5dGVzKzE1KS8xNikqMTY7CisgICAgTnVtQnl0ZXMgKz0gMTYqbkFsdGl2ZWNQYXJhbXNBdEVuZDsKKyAgfQorCisgIC8vIFRoZSBwcm9sb2cgY29kZSBvZiB0aGUgY2FsbGVlIG1heSBzdG9yZSB1cCB0byA4IEdQUiBhcmd1bWVudCByZWdpc3RlcnMgdG8KKyAgLy8gdGhlIHN0YWNrLCBhbGxvd2luZyB2YV9zdGFydCB0byBpbmRleCBvdmVyIHRoZW0gaW4gbWVtb3J5IGlmIGl0cyB2YXJhcmdzLgorICAvLyBCZWNhdXNlIHdlIGNhbm5vdCB0ZWxsIGlmIHRoaXMgaXMgbmVlZGVkIG9uIHRoZSBjYWxsZXIgc2lkZSwgd2UgaGF2ZSB0bworICAvLyBjb25zZXJ2YXRpdmVseSBhc3N1bWUgdGhhdCBpdCBpcyBuZWVkZWQuICBBcyBzdWNoLCBtYWtlIHN1cmUgd2UgaGF2ZSBhdAorICAvLyBsZWFzdCBlbm91Z2ggc3RhY2sgc3BhY2UgZm9yIHRoZSBjYWxsZXIgdG8gc3RvcmUgdGhlIDggR1BScy4KKyAgTnVtQnl0ZXMgPSBzdGQ6Om1heChOdW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBQUENGcmFtZUluZm86OmdldE1pbkNhbGxGcmFtZVNpemUoaXNQUEM2NCwgdHJ1ZSkpOworCisgIC8vIFRhaWwgY2FsbCBuZWVkcyB0aGUgc3RhY2sgdG8gYmUgYWxpZ25lZC4KKyAgaWYgKENDPT1DYWxsaW5nQ29udjo6RmFzdCAmJiBHdWFyYW50ZWVkVGFpbENhbGxPcHQpIHsKKyAgICB1bnNpZ25lZCBUYXJnZXRBbGlnbiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRUYXJnZXQoKS5nZXRGcmFtZUluZm8oKS0+CisgICAgICBnZXRTdGFja0FsaWdubWVudCgpOworICAgIHVuc2lnbmVkIEFsaWduTWFzayA9IFRhcmdldEFsaWduLTE7CisgICAgTnVtQnl0ZXMgPSAoTnVtQnl0ZXMgKyBBbGlnbk1hc2spICYgfkFsaWduTWFzazsKKyAgfQorCisgIHJldHVybiBOdW1CeXRlczsKK30KKworLy8vIENhbGN1bGF0ZVRhaWxDYWxsU1BEaWZmIC0gR2V0IHRoZSBhbW91bnQgdGhlIHN0YWNrIHBvaW50ZXIgaGFzIHRvIGJlCisvLy8gYWRqdXN0ZWQgdG8gYWNjb21vZGF0ZSB0aGUgYXJndW1lbnRzIGZvciB0aGUgdGFpbGNhbGwuCitzdGF0aWMgaW50IENhbGN1bGF0ZVRhaWxDYWxsU1BEaWZmKFNlbGVjdGlvbkRBRyYgREFHLCBib29sIGlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBhcmFtU2l6ZSkgeworCisgIGlmICghaXNUYWlsQ2FsbCkgcmV0dXJuIDA7CisKKyAgUFBDRnVuY3Rpb25JbmZvICpGSSA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRJbmZvPFBQQ0Z1bmN0aW9uSW5mbz4oKTsKKyAgdW5zaWduZWQgQ2FsbGVyTWluUmVzZXJ2ZWRBcmVhID0gRkktPmdldE1pblJlc2VydmVkQXJlYSgpOworICBpbnQgU1BEaWZmID0gKGludClDYWxsZXJNaW5SZXNlcnZlZEFyZWEgLSAoaW50KVBhcmFtU2l6ZTsKKyAgLy8gUmVtZW1iZXIgb25seSBpZiB0aGUgbmV3IGFkanVzdGVtZW50IGlzIGJpZ2dlci4KKyAgaWYgKFNQRGlmZiA8IEZJLT5nZXRUYWlsQ2FsbFNQRGVsdGEoKSkKKyAgICBGSS0+c2V0VGFpbENhbGxTUERlbHRhKFNQRGlmZik7CisKKyAgcmV0dXJuIFNQRGlmZjsKK30KKworLy8vIElzRWxpZ2libGVGb3JUYWlsQ2FsbE9wdGltaXphdGlvbiAtIENoZWNrIHdoZXRoZXIgdGhlIGNhbGwgaXMgZWxpZ2libGUKKy8vLyBmb3IgdGFpbCBjYWxsIG9wdGltaXphdGlvbi4gVGFyZ2V0cyB3aGljaCB3YW50IHRvIGRvIHRhaWwgY2FsbAorLy8vIG9wdGltaXphdGlvbiBzaG91bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCitib29sCitQUENUYXJnZXRMb3dlcmluZzo6SXNFbGlnaWJsZUZvclRhaWxDYWxsT3B0aW1pemF0aW9uKFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbGVlQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcmIERBRykgY29uc3QgeworICBpZiAoIUd1YXJhbnRlZWRUYWlsQ2FsbE9wdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVmFyaWFibGUgYXJndW1lbnQgZnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgorICBpZiAoaXNWYXJBcmcpCisgICAgcmV0dXJuIGZhbHNlOworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIENhbGxpbmdDb252OjpJRCBDYWxsZXJDQyA9IE1GLmdldEZ1bmN0aW9uKCktPmdldENhbGxpbmdDb252KCk7CisgIGlmIChDYWxsZWVDQyA9PSBDYWxsaW5nQ29udjo6RmFzdCAmJiBDYWxsZXJDQyA9PSBDYWxsZWVDQykgeworICAgIC8vIEZ1bmN0aW9ucyBjb250YWluaW5nIGJ5IHZhbCBwYXJhbWV0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gSW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzID0gSW5zW2ldLkZsYWdzOworICAgICAgIGlmIChGbGFncy5pc0J5VmFsKCkpIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb24gUElDL0dPVCAgdGFpbCBjYWxscyBhcmUgc3VwcG9ydGVkLgorICAgIGlmIChnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgIT0gUmVsb2M6OlBJQ18pCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIEF0IHRoZSBtb21lbnQgd2UgY2FuIG9ubHkgZG8gbG9jYWwgdGFpbCBjYWxscyAoaW4gc2FtZSBtb2R1bGUsIGhpZGRlbgorICAgIC8vIG9yIHByb3RlY3RlZCkgaWYgd2UgYXJlIGdlbmVyYXRpbmcgUElDLgorICAgIGlmIChHbG9iYWxBZGRyZXNzU0ROb2RlICpHID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oQ2FsbGVlKSkKKyAgICAgIHJldHVybiBHLT5nZXRHbG9iYWwoKS0+aGFzSGlkZGVuVmlzaWJpbGl0eSgpCisgICAgICAgICAgfHwgRy0+Z2V0R2xvYmFsKCktPmhhc1Byb3RlY3RlZFZpc2liaWxpdHkoKTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzQ2FsbENvbXBhdGlibGVBZGRyZXNzIC0gUmV0dXJuIHRoZSBpbW1lZGlhdGUgdG8gdXNlIGlmIHRoZSBzcGVjaWZpZWQKKy8vLyAzMi1iaXQgdmFsdWUgaXMgcmVwcmVzZW50YWJsZSBpbiB0aGUgaW1tZWRpYXRlIGZpZWxkIG9mIGEgQnhBIGluc3RydWN0aW9uLgorc3RhdGljIFNETm9kZSAqaXNCTEFDb21wYXRpYmxlQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgeworICBDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcCk7CisgIGlmICghQykgcmV0dXJuIDA7CisKKyAgaW50IEFkZHIgPSBDLT5nZXRaRXh0VmFsdWUoKTsKKyAgaWYgKChBZGRyICYgMykgIT0gMCB8fCAgLy8gTG93IDIgYml0cyBhcmUgaW1wbGljaXRseSB6ZXJvLgorICAgICAgKEFkZHIgPDwgNiA+PiA2KSAhPSBBZGRyKQorICAgIHJldHVybiAwOyAgLy8gVG9wIDYgYml0cyBoYXZlIHRvIGJlIHNleHQgb2YgaW1tZWRpYXRlLgorCisgIHJldHVybiBEQUcuZ2V0Q29uc3RhbnQoKGludClDLT5nZXRaRXh0VmFsdWUoKSA+PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKS5nZXRQb2ludGVyVHkoKSkuZ2V0Tm9kZSgpOworfQorCituYW1lc3BhY2UgeworCitzdHJ1Y3QgVGFpbENhbGxBcmd1bWVudEluZm8geworICBTRFZhbHVlIEFyZzsKKyAgU0RWYWx1ZSBGcmFtZUlkeE9wOworICBpbnQgICAgICAgRnJhbWVJZHg7CisKKyAgVGFpbENhbGxBcmd1bWVudEluZm8oKSA6IEZyYW1lSWR4KDApIHt9Cit9OworCit9CisKKy8vLyBTdG9yZVRhaWxDYWxsQXJndW1lbnRzVG9TdGFja1Nsb3QgLSBTdG9yZXMgYXJndW1lbnRzIHRvIHRoZWlyIHN0YWNrIHNsb3QuCitzdGF0aWMgdm9pZAorU3RvcmVUYWlsQ2FsbEFyZ3VtZW50c1RvU3RhY2tTbG90KFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3I8VGFpbENhbGxBcmd1bWVudEluZm8sIDg+ICZUYWlsQ2FsbEFyZ3MsCisgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gJk1lbU9wQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUYWlsQ2FsbEFyZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIFNEVmFsdWUgQXJnID0gVGFpbENhbGxBcmdzW2ldLkFyZzsKKyAgICBTRFZhbHVlIEZJTiA9IFRhaWxDYWxsQXJnc1tpXS5GcmFtZUlkeE9wOworICAgIGludCBGSSA9IFRhaWxDYWxsQXJnc1tpXS5GcmFtZUlkeDsKKyAgICAvLyBTdG9yZSByZWxhdGl2ZSB0byBmcmFtZXBvaW50ZXIuCisgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIEFyZywgRklOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIGZhbHNlLCAwKSk7CisgIH0KK30KKworLy8vIEVtaXRUYWlsQ2FsbFN0b3JlRlBBbmRSZXRBZGRyIC0gTW92ZSB0aGUgZnJhbWUgcG9pbnRlciBhbmQgcmV0dXJuIGFkZHJlc3MgdG8KKy8vLyB0aGUgYXBwcm9wcmlhdGUgc3RhY2sgc2xvdCBmb3IgdGhlIHRhaWwgY2FsbCBvcHRpbWl6ZWQgZnVuY3Rpb24gY2FsbC4KK3N0YXRpYyBTRFZhbHVlIEVtaXRUYWlsQ2FsbFN0b3JlRlBBbmRSZXRBZGRyKFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9sZFJldEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT2xkRlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUERpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQUEM2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RhcndpbkFCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgaWYgKFNQRGlmZikgeworICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHN0YWNrIHNsb3QgZm9yIHRoZSByZXR1cm4gYWRkcmVzcy4KKyAgICBpbnQgU2xvdFNpemUgPSBpc1BQQzY0ID8gOCA6IDQ7CisgICAgaW50IE5ld1JldEFkZHJMb2MgPSBTUERpZmYgKyBQUENGcmFtZUluZm86OmdldFJldHVyblNhdmVPZmZzZXQoaXNQUEM2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RhcndpbkFCSSk7CisgICAgaW50IE5ld1JldEFkZHIgPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlRml4ZWRPYmplY3QoU2xvdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3UmV0QWRkckxvYywgdHJ1ZSk7CisgICAgRVZUIFZUID0gaXNQUEM2NCA/IE1WVDo6aTY0IDogTVZUOjppMzI7CisgICAgU0RWYWx1ZSBOZXdSZXRBZGRyRnJJZHggPSBEQUcuZ2V0RnJhbWVJbmRleChOZXdSZXRBZGRyLCBWVCk7CisgICAgQ2hhaW4gPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBPbGRSZXRBZGRyLCBOZXdSZXRBZGRyRnJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soTmV3UmV0QWRkciksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgIC8vIFdoZW4gdXNpbmcgdGhlIDMyLzY0LWJpdCBTVlI0IEFCSSB0aGVyZSBpcyBubyBuZWVkIHRvIG1vdmUgdGhlIEZQIHN0YWNrCisgICAgLy8gc2xvdCBhcyB0aGUgRlAgaXMgbmV2ZXIgb3ZlcndyaXR0ZW4uCisgICAgaWYgKGlzRGFyd2luQUJJKSB7CisgICAgICBpbnQgTmV3RlBMb2MgPQorICAgICAgICBTUERpZmYgKyBQUENGcmFtZUluZm86OmdldEZyYW1lUG9pbnRlclNhdmVPZmZzZXQoaXNQUEM2NCwgaXNEYXJ3aW5BQkkpOworICAgICAgaW50IE5ld0ZQSWR4ID0gTUYuZ2V0RnJhbWVJbmZvKCktPkNyZWF0ZUZpeGVkT2JqZWN0KFNsb3RTaXplLCBOZXdGUExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgIFNEVmFsdWUgTmV3RnJhbWVQdHJJZHggPSBEQUcuZ2V0RnJhbWVJbmRleChOZXdGUElkeCwgVlQpOworICAgICAgQ2hhaW4gPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBPbGRGUCwgTmV3RnJhbWVQdHJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhOZXdGUElkeCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgIH0KKyAgfQorICByZXR1cm4gQ2hhaW47Cit9CisKKy8vLyBDYWxjdWxhdGVUYWlsQ2FsbEFyZ0Rlc3QgLSBSZW1lbWJlciBBcmd1bWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4gQ2FsY3VsYXRlCisvLy8gdGhlIHBvc2l0aW9uIG9mIHRoZSBhcmd1bWVudC4KK3N0YXRpYyB2b2lkCitDYWxjdWxhdGVUYWlsQ2FsbEFyZ0Rlc3QoU2VsZWN0aW9uREFHICZEQUcsIE1hY2hpbmVGdW5jdGlvbiAmTUYsIGJvb2wgaXNQUEM2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEFyZywgaW50IFNQRGlmZiwgdW5zaWduZWQgQXJnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPFRhaWxDYWxsQXJndW1lbnRJbmZvLCA4PiYgVGFpbENhbGxBcmd1bWVudHMpIHsKKyAgaW50IE9mZnNldCA9IEFyZ09mZnNldCArIFNQRGlmZjsKKyAgdWludDMyX3QgT3BTaXplID0gKEFyZy5nZXRWYWx1ZVR5cGUoKS5nZXRTaXplSW5CaXRzKCkrNykvODsKKyAgaW50IEZJID0gTUYuZ2V0RnJhbWVJbmZvKCktPkNyZWF0ZUZpeGVkT2JqZWN0KE9wU2l6ZSwgT2Zmc2V0LCB0cnVlKTsKKyAgRVZUIFZUID0gaXNQUEM2NCA/IE1WVDo6aTY0IDogTVZUOjppMzI7CisgIFNEVmFsdWUgRklOID0gREFHLmdldEZyYW1lSW5kZXgoRkksIFZUKTsKKyAgVGFpbENhbGxBcmd1bWVudEluZm8gSW5mbzsKKyAgSW5mby5BcmcgPSBBcmc7CisgIEluZm8uRnJhbWVJZHhPcCA9IEZJTjsKKyAgSW5mby5GcmFtZUlkeCA9IEZJOworICBUYWlsQ2FsbEFyZ3VtZW50cy5wdXNoX2JhY2soSW5mbyk7Cit9CisKKy8vLyBFbWl0VENGUEFuZFJldEFkZHJMb2FkIC0gRW1pdCBsb2FkIGZyb20gZnJhbWUgcG9pbnRlciBhbmQgcmV0dXJuIGFkZHJlc3MKKy8vLyBzdGFjayBzbG90LiBSZXR1cm5zIHRoZSBjaGFpbiBhcyByZXN1bHQgYW5kIHRoZSBsb2FkZWQgZnJhbWUgcG9pbnRlcnMgaW4KKy8vLyBMUk9wT3V0L0ZQT3BvdXQuIFVzZWQgd2hlbiB0YWlsIGNhbGxpbmcuCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpFbWl0VGFpbENhbGxMb2FkRlBBbmRSZXRBZGRyKFNlbGVjdGlvbkRBRyAmIERBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQRGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTFJPcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmRlBPcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RhcndpbkFCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIGNvbnN0IHsKKyAgaWYgKFNQRGlmZikgeworICAgIC8vIExvYWQgdGhlIExSIGFuZCBGUCBzdGFjayBzbG90IGZvciBsYXRlciBhZGp1c3RpbmcuCisgICAgRVZUIFZUID0gUFBDU3ViVGFyZ2V0LmlzUFBDNjQoKSA/IE1WVDo6aTY0IDogTVZUOjppMzI7CisgICAgTFJPcE91dCA9IGdldFJldHVybkFkZHJGcmFtZUluZGV4KERBRyk7CisgICAgTFJPcE91dCA9IERBRy5nZXRMb2FkKFZULCBkbCwgQ2hhaW4sIExST3BPdXQsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgQ2hhaW4gPSBTRFZhbHVlKExST3BPdXQuZ2V0Tm9kZSgpLCAxKTsKKyAgICAKKyAgICAvLyBXaGVuIHVzaW5nIHRoZSAzMi82NC1iaXQgU1ZSNCBBQkkgdGhlcmUgaXMgbm8gbmVlZCB0byBsb2FkIHRoZSBGUCBzdGFjaworICAgIC8vIHNsb3QgYXMgdGhlIEZQIGlzIG5ldmVyIG92ZXJ3cml0dGVuLgorICAgIGlmIChpc0RhcndpbkFCSSkgeworICAgICAgRlBPcE91dCA9IGdldEZyYW1lUG9pbnRlckZyYW1lSW5kZXgoREFHKTsKKyAgICAgIEZQT3BPdXQgPSBEQUcuZ2V0TG9hZChWVCwgZGwsIENoYWluLCBGUE9wT3V0LCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICBDaGFpbiA9IFNEVmFsdWUoRlBPcE91dC5nZXROb2RlKCksIDEpOworICAgIH0KKyAgfQorICByZXR1cm4gQ2hhaW47Cit9CisKKy8vLyBDcmVhdGVDb3B5T2ZCeVZhbEFyZ3VtZW50IC0gTWFrZSBhIGNvcHkgb2YgYW4gYWdncmVnYXRlIGF0IGFkZHJlc3Mgc3BlY2lmaWVkCisvLy8gYnkgIlNyYyIgdG8gYWRkcmVzcyAiRHN0IiBvZiBzaXplICJTaXplIi4gIEFsaWdubWVudCBpbmZvcm1hdGlvbiBpcworLy8vIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWMgcGFyYW1ldGVyIGF0dHJpYnV0ZS4gVGhlIGNvcHkgd2lsbCBiZSBwYXNzZWQgYXMKKy8vLyBhIGJ5dmFsIGZ1bmN0aW9uIHBhcmFtZXRlci4KKy8vLyBTb21ldGltZXMgd2hhdCB3ZSBhcmUgY29weWluZyBpcyB0aGUgZW5kIG9mIGEgbGFyZ2VyIG9iamVjdCwgdGhlIHBhcnQgdGhhdAorLy8vIGRvZXMgbm90IGZpdCBpbiByZWdpc3RlcnMuCitzdGF0aWMgU0RWYWx1ZQorQ3JlYXRlQ29weU9mQnlWYWxBcmd1bWVudChTRFZhbHVlIFNyYywgU0RWYWx1ZSBEc3QsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBGbGFncywgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsKSB7CisgIFNEVmFsdWUgU2l6ZU5vZGUgPSBEQUcuZ2V0Q29uc3RhbnQoRmxhZ3MuZ2V0QnlWYWxTaXplKCksIE1WVDo6aTMyKTsKKyAgcmV0dXJuIERBRy5nZXRNZW1jcHkoQ2hhaW4sIGRsLCBEc3QsIFNyYywgU2l6ZU5vZGUsIEZsYWdzLmdldEJ5VmFsQWxpZ24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBOVUxMLCAwLCBOVUxMLCAwKTsKK30KKworLy8vIExvd2VyTWVtT3BDYWxsVG8gLSBTdG9yZSB0aGUgYXJndW1lbnQgdG8gdGhlIHN0YWNrIG9yIHJlbWVtYmVyIGl0IGluIGNhc2Ugb2YKKy8vLyB0YWlsIGNhbGxzLgorc3RhdGljIHZvaWQKK0xvd2VyTWVtT3BDYWxsVG8oU2VsZWN0aW9uREFHICZEQUcsIE1hY2hpbmVGdW5jdGlvbiAmTUYsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgIFNEVmFsdWUgQXJnLCBTRFZhbHVlIFB0ck9mZiwgaW50IFNQRGlmZiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJnT2Zmc2V0LCBib29sIGlzUFBDNjQsIGJvb2wgaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgYm9vbCBpc1ZlY3RvciwgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gJk1lbU9wQ2hhaW5zLAorICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxUYWlsQ2FsbEFyZ3VtZW50SW5mbywgOD4mIFRhaWxDYWxsQXJndW1lbnRzLAorICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCkgeworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisgIGlmICghaXNUYWlsQ2FsbCkgeworICAgIGlmIChpc1ZlY3RvcikgeworICAgICAgU0RWYWx1ZSBTdGFja1B0cjsKKyAgICAgIGlmIChpc1BQQzY0KQorICAgICAgICBTdGFja1B0ciA9IERBRy5nZXRSZWdpc3RlcihQUEM6OlgxLCBNVlQ6Omk2NCk7CisgICAgICBlbHNlCisgICAgICAgIFN0YWNrUHRyID0gREFHLmdldFJlZ2lzdGVyKFBQQzo6UjEsIE1WVDo6aTMyKTsKKyAgICAgIFB0ck9mZiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsIFN0YWNrUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEFyZ09mZnNldCwgUHRyVlQpKTsKKyAgICB9CisgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIEFyZywgUHRyT2ZmLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisgIC8vIENhbGN1bGF0ZSBhbmQgcmVtZW1iZXIgYXJndW1lbnQgbG9jYXRpb24uCisgIH0gZWxzZSBDYWxjdWxhdGVUYWlsQ2FsbEFyZ0Rlc3QoREFHLCBNRiwgaXNQUEM2NCwgQXJnLCBTUERpZmYsIEFyZ09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWlsQ2FsbEFyZ3VtZW50cyk7Cit9CisKK3N0YXRpYwordm9pZCBQcmVwYXJlVGFpbENhbGwoU2VsZWN0aW9uREFHICZEQUcsIFNEVmFsdWUgJkluRmxhZywgU0RWYWx1ZSAmQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgYm9vbCBpc1BQQzY0LCBpbnQgU1BEaWZmLCB1bnNpZ25lZCBOdW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTFJPcCwgU0RWYWx1ZSBGUE9wLCBib29sIGlzRGFyd2luQUJJLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8VGFpbENhbGxBcmd1bWVudEluZm8sIDg+ICZUYWlsQ2FsbEFyZ3VtZW50cykgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworCisgIC8vIEVtaXQgYSBzZXF1ZW5jZSBvZiBjb3B5dG8vY29weWZyb20gdmlydHVhbCByZWdpc3RlcnMgZm9yIGFyZ3VtZW50cyB0aGF0CisgIC8vIG1pZ2h0IG92ZXJ3cml0ZSBlYWNoIG90aGVyIGluIGNhc2Ugb2YgdGFpbCBjYWxsIG9wdGltaXphdGlvbi4KKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gTWVtT3BDaGFpbnMyOworICAvLyBEbyBub3QgZmxhZyBwcmVjZWVkaW5nIGNvcHl0b3JlZyBzdHVmZiB0b2dldGhlciB3aXRoIHRoZSBmb2xsb3dpbmcgc3R1ZmYuCisgIEluRmxhZyA9IFNEVmFsdWUoKTsKKyAgU3RvcmVUYWlsQ2FsbEFyZ3VtZW50c1RvU3RhY2tTbG90KERBRywgQ2hhaW4sIFRhaWxDYWxsQXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtT3BDaGFpbnMyLCBkbCk7CisgIGlmICghTWVtT3BDaGFpbnMyLmVtcHR5KCkpCisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZNZW1PcENoYWluczJbMF0sIE1lbU9wQ2hhaW5zMi5zaXplKCkpOworCisgIC8vIFN0b3JlIHRoZSByZXR1cm4gYWRkcmVzcyB0byB0aGUgYXBwcm9wcmlhdGUgc3RhY2sgc2xvdC4KKyAgQ2hhaW4gPSBFbWl0VGFpbENhbGxTdG9yZUZQQW5kUmV0QWRkcihEQUcsIE1GLCBDaGFpbiwgTFJPcCwgRlBPcCwgU1BEaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUFBDNjQsIGlzRGFyd2luQUJJLCBkbCk7CisKKyAgLy8gRW1pdCBjYWxsc2VxX2VuZCBqdXN0IGJlZm9yZSB0YWlsY2FsbCBub2RlLgorICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX0VORChDaGFpbiwgREFHLmdldEludFB0ckNvbnN0YW50KE51bUJ5dGVzLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDAsIHRydWUpLCBJbkZsYWcpOworICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKK30KKworc3RhdGljCit1bnNpZ25lZCBQcmVwYXJlQ2FsbChTZWxlY3Rpb25EQUcgJkRBRywgU0RWYWx1ZSAmQ2FsbGVlLCBTRFZhbHVlICZJbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZDaGFpbiwgRGVidWdMb2MgZGwsIGludCBTUERpZmYsIGJvb2wgaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgU0RWYWx1ZT4sIDg+ICZSZWdzVG9QYXNzLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gJk9wcywgc3RkOjp2ZWN0b3I8RVZUPiAmTm9kZVR5cywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQUEM2NCwgYm9vbCBpc1NWUjRBQkkpIHsKKyAgRVZUIFB0clZUID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLmdldFBvaW50ZXJUeSgpOworICBOb2RlVHlzLnB1c2hfYmFjayhNVlQ6Ok90aGVyKTsgICAvLyBSZXR1cm5zIGEgY2hhaW4KKyAgTm9kZVR5cy5wdXNoX2JhY2soTVZUOjpGbGFnKTsgICAgLy8gUmV0dXJucyBhIGZsYWcgZm9yIHJldHZhbCBjb3B5IHRvIHVzZS4KKworICB1bnNpZ25lZCBDYWxsT3BjID0gaXNTVlI0QUJJID8gUFBDSVNEOjpDQUxMX1NWUjQgOiBQUENJU0Q6OkNBTExfRGFyd2luOworCisgIGJvb2wgbmVlZEluZGlyZWN0Q2FsbCA9IHRydWU7CisgIGlmIChTRE5vZGUgKkRlc3QgPSBpc0JMQUNvbXBhdGlibGVBZGRyZXNzKENhbGxlZSwgREFHKSkgeworICAgIC8vIElmIHRoaXMgaXMgYW4gYWJzb2x1dGUgZGVzdGluYXRpb24gYWRkcmVzcywgdXNlIHRoZSBtdW5nZWQgdmFsdWUuCisgICAgQ2FsbGVlID0gU0RWYWx1ZShEZXN0LCAwKTsKKyAgICBuZWVkSW5kaXJlY3RDYWxsID0gZmFsc2U7CisgIH0KKyAgLy8gWFhYIFdvcmsgYXJvdW5kIGZvciBodHRwOi8vbGx2bS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTIwMQorICAvLyBVc2UgaW5kaXJlY3QgY2FsbHMgZm9yIEFMTCBmdW5jdGlvbnMgY2FsbHMgaW4gSklUIG1vZGUsIHNpbmNlIHRoZQorICAvLyBmYXItY2FsbCBzdHVicyBtYXkgYmUgb3V0c2lkZSByZWxvY2F0aW9uIGxpbWl0cyBmb3IgYSBCTCBpbnN0cnVjdGlvbi4KKyAgaWYgKCFEQUcuZ2V0VGFyZ2V0KCkuZ2V0U3VidGFyZ2V0PFBQQ1N1YnRhcmdldD4oKS5pc0pJVENvZGVNb2RlbCgpKSB7CisgICAgLy8gSWYgdGhlIGNhbGxlZSBpcyBhIEdsb2JhbEFkZHJlc3MvRXh0ZXJuYWxTeW1ib2wgbm9kZSAocXVpdGUgY29tbW9uLCBldmVyeQorICAgIC8vIGRpcmVjdCBjYWxsIGlzKSB0dXJuIGl0IGludG8gYSBUYXJnZXRHbG9iYWxBZGRyZXNzL1RhcmdldEV4dGVybmFsU3ltYm9sCisgICAgLy8gbm9kZSBzbyB0aGF0IGxlZ2FsaXplIGRvZXNuJ3QgaGFjayBpdC4KKyAgICBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KENhbGxlZSkpIHsKKyAgICAgIENhbGxlZSA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEctPmdldEdsb2JhbCgpLCBkbCwKKwkJCQkJICBDYWxsZWUuZ2V0VmFsdWVUeXBlKCkpOworICAgICAgbmVlZEluZGlyZWN0Q2FsbCA9IGZhbHNlOworICAgIH0KKyAgfQorICBpZiAoRXh0ZXJuYWxTeW1ib2xTRE5vZGUgKlMgPSBkeW5fY2FzdDxFeHRlcm5hbFN5bWJvbFNETm9kZT4oQ2FsbGVlKSkgeworICAgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKFMtPmdldFN5bWJvbCgpLAorCQkJCQkgICBDYWxsZWUuZ2V0VmFsdWVUeXBlKCkpOworICAgICAgbmVlZEluZGlyZWN0Q2FsbCA9IGZhbHNlOworICB9CisgIGlmIChuZWVkSW5kaXJlY3RDYWxsKSB7CisgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGFuIGluZGlyZWN0IGNhbGwuICBXZSBoYXZlIHRvIHVzZSBhIE1UQ1RSL0JDVFJMIHBhaXIKKyAgICAvLyB0byBkbyB0aGUgY2FsbCwgd2UgY2FuJ3QgdXNlIFBQQ0lTRDo6Q0FMTC4KKyAgICBTRFZhbHVlIE1UQ1RST3BzW10gPSB7Q2hhaW4sIENhbGxlZSwgSW5GbGFnfTsKKworICAgIGlmIChpc1NWUjRBQkkgJiYgaXNQUEM2NCkgeworICAgICAgLy8gRnVuY3Rpb24gcG9pbnRlcnMgaW4gdGhlIDY0LWJpdCBTVlI0IEFCSSBkbyBub3QgcG9pbnQgdG8gdGhlIGZ1bmN0aW9uCisgICAgICAvLyBlbnRyeSBwb2ludCwgYnV0IHRvIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yICh0aGUgZnVuY3Rpb24gZW50cnkgcG9pbnQKKyAgICAgIC8vIGFkZHJlc3MgaXMgcGFydCBvZiB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciB0aG91Z2gpLgorICAgICAgLy8gVGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IgaXMgYSB0aHJlZSBkb3VibGV3b3JkIHN0cnVjdHVyZSB3aXRoIHRoZQorICAgICAgLy8gZm9sbG93aW5nIGZpZWxkczogZnVuY3Rpb24gZW50cnkgcG9pbnQsIFRPQyBiYXNlIGFkZHJlc3MgYW5kCisgICAgICAvLyBlbnZpcm9ubWVudCBwb2ludGVyLgorICAgICAgLy8gVGh1cyBmb3IgYSBjYWxsIHRocm91Z2ggYSBmdW5jdGlvbiBwb2ludGVyLCB0aGUgZm9sbG93aW5nIGFjdGlvbnMgbmVlZAorICAgICAgLy8gdG8gYmUgcGVyZm9ybWVkOgorICAgICAgLy8gICAxLiBTYXZlIHRoZSBUT0Mgb2YgdGhlIGNhbGxlciBpbiB0aGUgVE9DIHNhdmUgYXJlYSBvZiBpdHMgc3RhY2sKKyAgICAgIC8vICAgICAgZnJhbWUgKHRoaXMgaXMgZG9uZSBpbiBMb3dlckNhbGxfRGFyd2luKCkpLgorICAgICAgLy8gICAyLiBMb2FkIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBlbnRyeSBwb2ludCBmcm9tIHRoZSBmdW5jdGlvbgorICAgICAgLy8gICAgICBkZXNjcmlwdG9yLgorICAgICAgLy8gICAzLiBMb2FkIHRoZSBUT0Mgb2YgdGhlIGNhbGxlZSBmcm9tIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yIGludG8gcjIuCisgICAgICAvLyAgIDQuIExvYWQgdGhlIGVudmlyb25tZW50IHBvaW50ZXIgZnJvbSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciBpbnRvCisgICAgICAvLyAgICAgIHIxMS4KKyAgICAgIC8vICAgNS4gQnJhbmNoIHRvIHRoZSBmdW5jdGlvbiBlbnRyeSBwb2ludCBhZGRyZXNzLgorICAgICAgLy8gICA2LiBPbiByZXR1cm4gb2YgdGhlIGNhbGxlZSwgdGhlIFRPQyBvZiB0aGUgY2FsbGVyIG5lZWRzIHRvIGJlCisgICAgICAvLyAgICAgIHJlc3RvcmVkICh0aGlzIGlzIGRvbmUgaW4gRmluaXNoQ2FsbCgpKS4KKyAgICAgIC8vCisgICAgICAvLyBBbGwgdGhvc2Ugb3BlcmF0aW9ucyBhcmUgZmxhZ2dlZCB0b2dldGhlciB0byBlbnN1cmUgdGhhdCBubyBvdGhlcgorICAgICAgLy8gb3BlcmF0aW9ucyBjYW4gYmUgc2NoZWR1bGVkIGluIGJldHdlZW4uIEUuZy4gd2l0aG91dCBmbGFnZ2luZyB0aGUKKyAgICAgIC8vIG9wZXJhdGlvbnMgdG9nZXRoZXIsIGEgVE9DIGFjY2VzcyBpbiB0aGUgY2FsbGVyIGNvdWxkIGJlIHNjaGVkdWxlZAorICAgICAgLy8gYmV0d2VlbiB0aGUgbG9hZCBvZiB0aGUgY2FsbGVlIFRPQyBhbmQgdGhlIGJyYW5jaCB0byB0aGUgY2FsbGVlLCB3aGljaAorICAgICAgLy8gcmVzdWx0cyBpbiB0aGUgVE9DIGFjY2VzcyBnb2luZyB0aHJvdWdoIHRoZSBUT0Mgb2YgdGhlIGNhbGxlZSBpbnN0ZWFkCisgICAgICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBUT0Mgb2YgdGhlIGNhbGxlciwgd2hpY2ggbGVhZHMgdG8gaW5jb3JyZWN0IGNvZGUuCisKKyAgICAgIC8vIExvYWQgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGVudHJ5IHBvaW50IGZyb20gdGhlIGZ1bmN0aW9uCisgICAgICAvLyBkZXNjcmlwdG9yLgorICAgICAgU0RWVExpc3QgVlRzID0gREFHLmdldFZUTGlzdChNVlQ6Omk2NCwgTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKyAgICAgIFNEVmFsdWUgTG9hZEZ1bmNQdHIgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkxPQUQsIGRsLCBWVHMsIE1UQ1RST3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRmxhZy5nZXROb2RlKCkgPyAzIDogMik7CisgICAgICBDaGFpbiA9IExvYWRGdW5jUHRyLmdldFZhbHVlKDEpOworICAgICAgSW5GbGFnID0gTG9hZEZ1bmNQdHIuZ2V0VmFsdWUoMik7CisKKyAgICAgIC8vIExvYWQgZW52aXJvbm1lbnQgcG9pbnRlciBpbnRvIHIxMS4KKyAgICAgIC8vIE9mZnNldCBvZiB0aGUgZW52aXJvbm1lbnQgcG9pbnRlciB3aXRoaW4gdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IuCisgICAgICBTRFZhbHVlIFB0ck9mZiA9IERBRy5nZXRJbnRQdHJDb25zdGFudCgxNik7CisKKyAgICAgIFNEVmFsdWUgQWRkUHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6Omk2NCwgQ2FsbGVlLCBQdHJPZmYpOworICAgICAgU0RWYWx1ZSBMb2FkRW52UHRyID0gREFHLmdldE5vZGUoUFBDSVNEOjpMT0FELCBkbCwgVlRzLCBDaGFpbiwgQWRkUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5GbGFnKTsKKyAgICAgIENoYWluID0gTG9hZEVudlB0ci5nZXRWYWx1ZSgxKTsKKyAgICAgIEluRmxhZyA9IExvYWRFbnZQdHIuZ2V0VmFsdWUoMik7CisKKyAgICAgIFNEVmFsdWUgRW52VmFsID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFBQQzo6WDExLCBMb2FkRW52UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRmxhZyk7CisgICAgICBDaGFpbiA9IEVudlZhbC5nZXRWYWx1ZSgwKTsKKyAgICAgIEluRmxhZyA9IEVudlZhbC5nZXRWYWx1ZSgxKTsKKworICAgICAgLy8gTG9hZCBUT0Mgb2YgdGhlIGNhbGxlZSBpbnRvIHIyLiBXZSBhcmUgdXNpbmcgYSB0YXJnZXQtc3BlY2lmaWMgbG9hZAorICAgICAgLy8gd2l0aCByMiBoYXJkIGNvZGVkLCBiZWNhdXNlIHRoZSByZXN1bHQgb2YgYSB0YXJnZXQtaW5kZXBlbmRlbnQgbG9hZAorICAgICAgLy8gd291bGQgbmV2ZXIgZ28gZGlyZWN0bHkgaW50byByMiwgc2luY2UgcjIgaXMgYSByZXNlcnZlZCByZWdpc3RlciAod2hpY2gKKyAgICAgIC8vIHByZXZlbnRzIHRoZSByZWdpc3RlciBhbGxvY2F0b3IgZnJvbSBhbGxvY2F0aW5nIGl0KSwgcmVzdWx0aW5nIGluIGFuCisgICAgICAvLyBhZGRpdGlvbmFsIHJlZ2lzdGVyIGJlaW5nIGFsbG9jYXRlZCBhbmQgYW4gdW5uZWNlc3NhcnkgbW92ZSBpbnN0cnVjdGlvbgorICAgICAgLy8gYmVpbmcgZ2VuZXJhdGVkLgorICAgICAgVlRzID0gREFHLmdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICAgICAgU0RWYWx1ZSBMb2FkVE9DUHRyID0gREFHLmdldE5vZGUoUFBDSVNEOjpMT0FEX1RPQywgZGwsIFZUcywgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsZWUsIEluRmxhZyk7CisgICAgICBDaGFpbiA9IExvYWRUT0NQdHIuZ2V0VmFsdWUoMCk7CisgICAgICBJbkZsYWcgPSBMb2FkVE9DUHRyLmdldFZhbHVlKDEpOworCisgICAgICBNVENUUk9wc1swXSA9IENoYWluOworICAgICAgTVRDVFJPcHNbMV0gPSBMb2FkRnVuY1B0cjsKKyAgICAgIE1UQ1RST3BzWzJdID0gSW5GbGFnOworICAgIH0KKworICAgIENoYWluID0gREFHLmdldE5vZGUoUFBDSVNEOjpNVENUUiwgZGwsIE5vZGVUeXMsIE1UQ1RST3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgMiArIChJbkZsYWcuZ2V0Tm9kZSgpICE9IDApKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKworICAgIE5vZGVUeXMuY2xlYXIoKTsKKyAgICBOb2RlVHlzLnB1c2hfYmFjayhNVlQ6Ok90aGVyKTsKKyAgICBOb2RlVHlzLnB1c2hfYmFjayhNVlQ6OkZsYWcpOworICAgIE9wcy5wdXNoX2JhY2soQ2hhaW4pOworICAgIENhbGxPcGMgPSBpc1NWUjRBQkkgPyBQUENJU0Q6OkJDVFJMX1NWUjQgOiBQUENJU0Q6OkJDVFJMX0RhcndpbjsKKyAgICBDYWxsZWUuc2V0Tm9kZSgwKTsKKyAgICAvLyBBZGQgQ1RSIHJlZ2lzdGVyIGFzIGNhbGxlZSBzbyBhIGJjdHIgY2FuIGJlIGVtaXR0ZWQgbGF0ZXIuCisgICAgaWYgKGlzVGFpbENhbGwpCisgICAgICBPcHMucHVzaF9iYWNrKERBRy5nZXRSZWdpc3RlcihQUEM6OkNUUiwgUHRyVlQpKTsKKyAgfQorCisgIC8vIElmIHRoaXMgaXMgYSBkaXJlY3QgY2FsbCwgcGFzcyB0aGUgY2hhaW4gYW5kIHRoZSBjYWxsZWUuCisgIGlmIChDYWxsZWUuZ2V0Tm9kZSgpKSB7CisgICAgT3BzLnB1c2hfYmFjayhDaGFpbik7CisgICAgT3BzLnB1c2hfYmFjayhDYWxsZWUpOworICB9CisgIC8vIElmIHRoaXMgaXMgYSB0YWlsIGNhbGwgYWRkIHN0YWNrIHBvaW50ZXIgZGVsdGEuCisgIGlmIChpc1RhaWxDYWxsKQorICAgIE9wcy5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KFNQRGlmZiwgTVZUOjppMzIpKTsKKworICAvLyBBZGQgYXJndW1lbnQgcmVnaXN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gdGhhdCB0aGV5IGFyZSBrbm93biBsaXZlCisgIC8vIGludG8gdGhlIGNhbGwuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzVG9QYXNzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0UmVnaXN0ZXIoUmVnc1RvUGFzc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdzVG9QYXNzW2ldLnNlY29uZC5nZXRWYWx1ZVR5cGUoKSkpOworCisgIHJldHVybiBDYWxsT3BjOworfQorCitTRFZhbHVlCitQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJDYWxsUmVzdWx0KFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdCB7CisKKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBSVkxvY3M7CisgIENDU3RhdGUgQ0NSZXRJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICAgICBSVkxvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgQ0NSZXRJbmZvLkFuYWx5emVDYWxsUmVzdWx0KElucywgUmV0Q0NfUFBDKTsKKworICAvLyBDb3B5IGFsbCBvZiB0aGUgcmVzdWx0IHJlZ2lzdGVycyBvdXQgb2YgdGhlaXIgc3BlY2lmaWVkIHBoeXNyZWcuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSVkxvY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENDVmFsQXNzaWduICZWQSA9IFJWTG9jc1tpXTsKKyAgICBFVlQgVlQgPSBWQS5nZXRWYWxWVCgpOworICAgIGFzc2VydChWQS5pc1JlZ0xvYygpICYmICJDYW4gb25seSByZXR1cm4gaW4gcmVnaXN0ZXJzISIpOworICAgIENoYWluID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQS5nZXRMb2NSZWcoKSwgVlQsIEluRmxhZykuZ2V0VmFsdWUoMSk7CisgICAgSW5WYWxzLnB1c2hfYmFjayhDaGFpbi5nZXRWYWx1ZSgwKSk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMik7CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKK1NEVmFsdWUKK1BQQ1RhcmdldExvd2VyaW5nOjpGaW5pc2hDYWxsKENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFpbENhbGwsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgU0RWYWx1ZT4sIDg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSZWdzVG9QYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBJbkZsYWcsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BEaWZmLCB1bnNpZ25lZCBOdW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8RVZUPiBOb2RlVHlzOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBPcHM7CisgIHVuc2lnbmVkIENhbGxPcGMgPSBQcmVwYXJlQ2FsbChEQUcsIENhbGxlZSwgSW5GbGFnLCBDaGFpbiwgZGwsIFNQRGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFpbENhbGwsIFJlZ3NUb1Bhc3MsIE9wcywgTm9kZVR5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ1N1YlRhcmdldC5pc1BQQzY0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENTdWJUYXJnZXQuaXNTVlI0QUJJKCkpOworCisgIC8vIFdoZW4gcGVyZm9ybWluZyB0YWlsIGNhbGwgb3B0aW1pemF0aW9uIHRoZSBjYWxsZWUgcG9wcyBpdHMgYXJndW1lbnRzIG9mZgorICAvLyB0aGUgc3RhY2suIEFjY291bnQgZm9yIHRoaXMgaGVyZSBzbyB0aGVzZSBieXRlcyBjYW4gYmUgcHVzaGVkIGJhY2sgb24gaW4KKyAgLy8gUFBDUmVnaXN0ZXJJbmZvOjplbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0ci4KKyAgaW50IEJ5dGVzQ2FsbGVlUG9wcyA9CisgICAgKENhbGxDb252PT1DYWxsaW5nQ29udjo6RmFzdCAmJiBHdWFyYW50ZWVkVGFpbENhbGxPcHQpID8gTnVtQnl0ZXMgOiAwOworCisgIGlmIChJbkZsYWcuZ2V0Tm9kZSgpKQorICAgIE9wcy5wdXNoX2JhY2soSW5GbGFnKTsKKworICAvLyBFbWl0IHRhaWwgY2FsbC4KKyAgaWYgKGlzVGFpbENhbGwpIHsKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXR1cm4gbG93ZXJlZCBmb3IgdGhpcyBmdW5jdGlvbiwgYWRkIHRoZSByZWdzCisgICAgLy8gdG8gdGhlIGxpdmVvdXQgc2V0IGZvciB0aGUgZnVuY3Rpb24uCisgICAgaWYgKERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkubGl2ZW91dF9lbXB0eSgpKSB7CisgICAgICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKyAgICAgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLCBSVkxvY3MsCisgICAgICAgICAgICAgICAgICAgICAqREFHLmdldENvbnRleHQoKSk7CisgICAgICBDQ0luZm8uQW5hbHl6ZUNhbGxSZXN1bHQoSW5zLCBSZXRDQ19QUEMpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpCisgICAgICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkuYWRkTGl2ZU91dChSVkxvY3NbaV0uZ2V0TG9jUmVnKCkpOworICAgIH0KKworICAgIGFzc2VydCgoKENhbGxlZS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlJlZ2lzdGVyICYmCisgICAgICAgICAgICAgY2FzdDxSZWdpc3RlclNETm9kZT4oQ2FsbGVlKS0+Z2V0UmVnKCkgPT0gUFBDOjpDVFIpIHx8CisgICAgICAgICAgICBDYWxsZWUuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbCB8fAorICAgICAgICAgICAgQ2FsbGVlLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsQWRkcmVzcyB8fAorICAgICAgICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihDYWxsZWUpKSAmJgorICAgICJFeHBlY3RpbmcgYW4gZ2xvYmFsIGFkZHJlc3MsIGV4dGVybmFsIHN5bWJvbCwgYWJzb2x1dGUgdmFsdWUgb3IgcmVnaXN0ZXIiKTsKKworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShQUENJU0Q6OlRDX1JFVFVSTiwgZGwsIE1WVDo6T3RoZXIsICZPcHNbMF0sIE9wcy5zaXplKCkpOworICB9CisKKyAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShDYWxsT3BjLCBkbCwgTm9kZVR5cywgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIEFkZCBhIE5PUCBpbW1lZGlhdGVseSBhZnRlciB0aGUgYnJhbmNoIGluc3RydWN0aW9uIHdoZW4gdXNpbmcgdGhlIDY0LWJpdAorICAvLyBTVlI0IEFCSS4gQXQgbGluayB0aW1lLCBpZiBjYWxsZXIgYW5kIGNhbGxlZSBhcmUgaW4gYSBkaWZmZXJlbnQgbW9kdWxlIGFuZAorICAvLyB0aHVzIGhhdmUgYSBkaWZmZXJlbnQgVE9DLCB0aGUgY2FsbCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBjYWxsIHRvIGEgc3R1YgorICAvLyBmdW5jdGlvbiB3aGljaCBzYXZlcyB0aGUgY3VycmVudCBUT0MsIGxvYWRzIHRoZSBUT0Mgb2YgdGhlIGNhbGxlZSBhbmQKKyAgLy8gYnJhbmNoZXMgdG8gdGhlIGNhbGxlZS4gVGhlIE5PUCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBsb2FkIGluc3RydWN0aW9uCisgIC8vIHdoaWNoIHJlc3RvcmVzIHRoZSBUT0Mgb2YgdGhlIGNhbGxlciBmcm9tIHRoZSBUT0Mgc2F2ZSBzbG90IG9mIHRoZSBjdXJyZW50CisgIC8vIHN0YWNrIGZyYW1lLiBJZiBjYWxsZXIgYW5kIGNhbGxlZSBiZWxvbmcgdG8gdGhlIHNhbWUgbW9kdWxlIChhbmQgaGF2ZSB0aGUKKyAgLy8gc2FtZSBUT0MpLCB0aGUgTk9QIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4KKyAgaWYgKCFpc1RhaWxDYWxsICYmIFBQQ1N1YlRhcmdldC5pc1NWUjRBQkkoKSYmIFBQQ1N1YlRhcmdldC5pc1BQQzY0KCkpIHsKKyAgICBTRFZUTGlzdCBWVHMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgICAgaWYgKENhbGxPcGMgPT0gUFBDSVNEOjpCQ1RSTF9TVlI0KSB7CisgICAgICAvLyBUaGlzIGlzIGEgY2FsbCB0aHJvdWdoIGEgZnVuY3Rpb24gcG9pbnRlci4KKyAgICAgIC8vIFJlc3RvcmUgdGhlIGNhbGxlciBUT0MgZnJvbSB0aGUgc2F2ZSBhcmVhIGludG8gUjIuCisgICAgICAvLyBTZWUgUHJlcGFyZUNhbGwoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjYWxscyB0aHJvdWdoIGZ1bmN0aW9uCisgICAgICAvLyBwb2ludGVycyBpbiB0aGUgNjQtYml0IFNWUjQgQUJJLgorICAgICAgLy8gV2UgYXJlIHVzaW5nIGEgdGFyZ2V0LXNwZWNpZmljIGxvYWQgd2l0aCByMiBoYXJkIGNvZGVkLCBiZWNhdXNlIHRoZQorICAgICAgLy8gcmVzdWx0IG9mIGEgdGFyZ2V0LWluZGVwZW5kZW50IGxvYWQgd291bGQgbmV2ZXIgZ28gZGlyZWN0bHkgaW50byByMiwKKyAgICAgIC8vIHNpbmNlIHIyIGlzIGEgcmVzZXJ2ZWQgcmVnaXN0ZXIgKHdoaWNoIHByZXZlbnRzIHRoZSByZWdpc3RlciBhbGxvY2F0b3IKKyAgICAgIC8vIGZyb20gYWxsb2NhdGluZyBpdCksIHJlc3VsdGluZyBpbiBhbiBhZGRpdGlvbmFsIHJlZ2lzdGVyIGJlaW5nCisgICAgICAvLyBhbGxvY2F0ZWQgYW5kIGFuIHVubmVjZXNzYXJ5IG1vdmUgaW5zdHJ1Y3Rpb24gYmVpbmcgZ2VuZXJhdGVkLgorICAgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OlRPQ19SRVNUT1JFLCBkbCwgVlRzLCBDaGFpbiwgSW5GbGFnKTsKKyAgICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UgaW5zZXJ0IE5PUC4KKyAgICAgIEluRmxhZyA9IERBRy5nZXROb2RlKFBQQ0lTRDo6Tk9QLCBkbCwgTVZUOjpGbGFnLCBJbkZsYWcpOworICAgIH0KKyAgfQorCisgIENoYWluID0gREFHLmdldENBTExTRVFfRU5EKENoYWluLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoTnVtQnl0ZXMsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoQnl0ZXNDYWxsZWVQb3BzLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5GbGFnKTsKKyAgaWYgKCFJbnMuZW1wdHkoKSkKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKworICByZXR1cm4gTG93ZXJDYWxsUmVzdWx0KENoYWluLCBJbkZsYWcsIENhbGxDb252LCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnMsIGRsLCBEQUcsIEluVmFscyk7Cit9CisKK1NEVmFsdWUKK1BQQ1RhcmdldExvd2VyaW5nOjpMb3dlckNhbGwoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworICBpZiAoaXNUYWlsQ2FsbCkKKyAgICBpc1RhaWxDYWxsID0gSXNFbGlnaWJsZUZvclRhaWxDYWxsT3B0aW1pemF0aW9uKENhbGxlZSwgQ2FsbENvbnYsIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zLCBEQUcpOworCisgIGlmIChQUENTdWJUYXJnZXQuaXNTVlI0QUJJKCkgJiYgIVBQQ1N1YlRhcmdldC5pc1BQQzY0KCkpIHsKKyAgICByZXR1cm4gTG93ZXJDYWxsX1NWUjQoQ2hhaW4sIENhbGxlZSwgQ2FsbENvbnYsIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhaWxDYWxsLCBPdXRzLCBPdXRWYWxzLCBJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBEQUcsIEluVmFscyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIExvd2VyQ2FsbF9EYXJ3aW4oQ2hhaW4sIENhbGxlZSwgQ2FsbENvbnYsIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFpbENhbGwsIE91dHMsIE91dFZhbHMsIElucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCwgREFHLCBJblZhbHMpOworICB9Cit9CisKK1NEVmFsdWUKK1BQQ1RhcmdldExvd2VyaW5nOjpMb3dlckNhbGxfU1ZSNChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworICAvLyBTZWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyRm9ybWFsQXJndW1lbnRzX1NWUjQoKSBmb3IgYSBkZXNjcmlwdGlvbgorICAvLyBvZiB0aGUgMzItYml0IFNWUjQgQUJJIHN0YWNrIGZyYW1lIGxheW91dC4KKworICBhc3NlcnQoKENhbGxDb252ID09IENhbGxpbmdDb252OjpDIHx8CisgICAgICAgICAgQ2FsbENvbnYgPT0gQ2FsbGluZ0NvbnY6OkZhc3QpICYmICJVbmtub3duIGNhbGxpbmcgY29udmVudGlvbiEiKTsKKworICB1bnNpZ25lZCBQdHJCeXRlU2l6ZSA9IDQ7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKworICAvLyBNYXJrIHRoaXMgZnVuY3Rpb24gYXMgcG90ZW50aWFsbHkgY29udGFpbmluZyBhIGZ1bmN0aW9uIHRoYXQgY29udGFpbnMgYQorICAvLyB0YWlsIGNhbGwuIEFzIGEgY29uc2VxdWVuY2UgdGhlIGZyYW1lIHBvaW50ZXIgd2lsbCBiZSB1c2VkIGZvciBkeW5hbWljYWxsb2MKKyAgLy8gYW5kIHJlc3RvcmluZyB0aGUgY2FsbGVycyBzdGFjayBwb2ludGVyIGluIHRoaXMgZnVuY3Rpb25zIGVwaWxvZy4gVGhpcyBpcworICAvLyBkb25lIGJlY2F1c2UgYnkgdGFpbCBjYWxsaW5nIHRoZSBjYWxsZWQgZnVuY3Rpb24gbWlnaHQgb3ZlcndyaXRlIHRoZSB2YWx1ZQorICAvLyBpbiB0aGlzIGZ1bmN0aW9uJ3MgKE1GKSBzdGFjayBwb2ludGVyIHN0YWNrIHNsb3QgMChTUCkuCisgIGlmIChHdWFyYW50ZWVkVGFpbENhbGxPcHQgJiYgQ2FsbENvbnY9PUNhbGxpbmdDb252OjpGYXN0KQorICAgIE1GLmdldEluZm88UFBDRnVuY3Rpb25JbmZvPigpLT5zZXRIYXNGYXN0Q2FsbCgpOworICAKKyAgLy8gQ291bnQgaG93IG1hbnkgYnl0ZXMgYXJlIHRvIGJlIHB1c2hlZCBvbiB0aGUgc3RhY2ssIGluY2x1ZGluZyB0aGUgbGlua2FnZQorICAvLyBhcmVhLCBwYXJhbWV0ZXIgbGlzdCBhcmVhIGFuZCB0aGUgcGFydCBvZiB0aGUgbG9jYWwgdmFyaWFibGUgc3BhY2Ugd2hpY2gKKyAgLy8gY29udGFpbnMgY29waWVzIG9mIGFnZ3JlZ2F0ZXMgd2hpY2ggYXJlIHBhc3NlZCBieSB2YWx1ZS4KKworICAvLyBBc3NpZ24gbG9jYXRpb25zIHRvIGFsbCBvZiB0aGUgb3V0Z29pbmcgYXJndW1lbnRzLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IEFyZ0xvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICBBcmdMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisKKyAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIGxpbmthZ2UgYXJlYSBvbiB0aGUgc3RhY2suCisgIENDSW5mby5BbGxvY2F0ZVN0YWNrKFBQQ0ZyYW1lSW5mbzo6Z2V0TGlua2FnZVNpemUoZmFsc2UsIGZhbHNlKSwgUHRyQnl0ZVNpemUpOworCisgIGlmIChpc1ZhckFyZykgeworICAgIC8vIEhhbmRsZSBmaXhlZCBhbmQgdmFyaWFibGUgdmVjdG9yIGFyZ3VtZW50cyBkaWZmZXJlbnRseS4KKyAgICAvLyBGaXhlZCB2ZWN0b3IgYXJndW1lbnRzIGdvIGludG8gcmVnaXN0ZXJzIGFzIGxvbmcgYXMgcmVnaXN0ZXJzIGFyZQorICAgIC8vIGF2YWlsYWJsZS4gVmFyaWFibGUgdmVjdG9yIGFyZ3VtZW50cyBhbHdheXMgZ28gaW50byBtZW1vcnkuCisgICAgdW5zaWduZWQgTnVtQXJncyA9IE91dHMuc2l6ZSgpOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtQXJnczsgKytpKSB7CisgICAgICBFVlQgQXJnVlQgPSBPdXRzW2ldLlZUOworICAgICAgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzID0gT3V0c1tpXS5GbGFnczsKKyAgICAgIGJvb2wgUmVzdWx0OworICAgICAgCisgICAgICBpZiAoT3V0c1tpXS5Jc0ZpeGVkKSB7CisgICAgICAgIFJlc3VsdCA9IENDX1BQQ19TVlI0KGksIEFyZ1ZULCBBcmdWVCwgQ0NWYWxBc3NpZ246OkZ1bGwsIEFyZ0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0luZm8pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0ID0gQ0NfUFBDX1NWUjRfVmFyQXJnKGksIEFyZ1ZULCBBcmdWVCwgQ0NWYWxBc3NpZ246OkZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdGbGFncywgQ0NJbmZvKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKFJlc3VsdCkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgZXJycygpIDw8ICJDYWxsIG9wZXJhbmQgIyIgPDwgaSA8PCAiIGhhcyB1bmhhbmRsZWQgdHlwZSAiCisgICAgICAgICAgICAgPDwgQXJnVlQuZ2V0RVZUU3RyaW5nKCkgPDwgIlxuIjsKKyNlbmRpZgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBBbGwgYXJndW1lbnRzIGFyZSB0cmVhdGVkIHRoZSBzYW1lLgorICAgIENDSW5mby5BbmFseXplQ2FsbE9wZXJhbmRzKE91dHMsIENDX1BQQ19TVlI0KTsKKyAgfQorICAKKyAgLy8gQXNzaWduIGxvY2F0aW9ucyB0byBhbGwgb2YgdGhlIG91dGdvaW5nIGFnZ3JlZ2F0ZSBieSB2YWx1ZSBhcmd1bWVudHMuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gQnlWYWxBcmdMb2NzOworICBDQ1N0YXRlIENDQnlWYWxJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLCBCeVZhbEFyZ0xvY3MsCisgICAgICAgICAgICAgICAgICAgICAgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIC8vIFJlc2VydmUgc3RhY2sgc3BhY2UgZm9yIHRoZSBhbGxvY2F0aW9ucyBpbiBDQ0luZm8uCisgIENDQnlWYWxJbmZvLkFsbG9jYXRlU3RhY2soQ0NJbmZvLmdldE5leHRTdGFja09mZnNldCgpLCBQdHJCeXRlU2l6ZSk7CisKKyAgQ0NCeVZhbEluZm8uQW5hbHl6ZUNhbGxPcGVyYW5kcyhPdXRzLCBDQ19QUENfU1ZSNF9CeVZhbCk7CisKKyAgLy8gU2l6ZSBvZiB0aGUgbGlua2FnZSBhcmVhLCBwYXJhbWV0ZXIgbGlzdCBhcmVhIGFuZCB0aGUgcGFydCBvZiB0aGUgbG9jYWwKKyAgLy8gc3BhY2UgdmFyaWFibGUgd2hlcmUgY29waWVzIG9mIGFnZ3JlZ2F0ZXMgd2hpY2ggYXJlIHBhc3NlZCBieSB2YWx1ZSBhcmUKKyAgLy8gc3RvcmVkLgorICB1bnNpZ25lZCBOdW1CeXRlcyA9IENDQnlWYWxJbmZvLmdldE5leHRTdGFja09mZnNldCgpOworICAKKyAgLy8gQ2FsY3VsYXRlIGJ5IGhvdyBtYW55IGJ5dGVzIHRoZSBzdGFjayBoYXMgdG8gYmUgYWRqdXN0ZWQgaW4gY2FzZSBvZiB0YWlsCisgIC8vIGNhbGwgb3B0aW1pemF0aW9uLgorICBpbnQgU1BEaWZmID0gQ2FsY3VsYXRlVGFpbENhbGxTUERpZmYoREFHLCBpc1RhaWxDYWxsLCBOdW1CeXRlcyk7CisKKyAgLy8gQWRqdXN0IHRoZSBzdGFjayBwb2ludGVyIGZvciB0aGUgbmV3IGFyZ3VtZW50cy4uLgorICAvLyBUaGVzZSBvcGVyYXRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGVsaW1pbmF0ZWQgYnkgdGhlIHByb2xvZy9lcGlsb2cgcGFzcworICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX1NUQVJUKENoYWluLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoTnVtQnl0ZXMsIHRydWUpKTsKKyAgU0RWYWx1ZSBDYWxsU2VxU3RhcnQgPSBDaGFpbjsKKworICAvLyBMb2FkIHRoZSByZXR1cm4gYWRkcmVzcyBhbmQgZnJhbWUgcG9pbnRlciBzbyBpdCBjYW4gYmUgbW92ZWQgc29tZXdoZXJlIGVsc2UKKyAgLy8gbGF0ZXIuCisgIFNEVmFsdWUgTFJPcCwgRlBPcDsKKyAgQ2hhaW4gPSBFbWl0VGFpbENhbGxMb2FkRlBBbmRSZXRBZGRyKERBRywgU1BEaWZmLCBDaGFpbiwgTFJPcCwgRlBPcCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCk7CisKKyAgLy8gU2V0IHVwIGEgY29weSBvZiB0aGUgc3RhY2sgcG9pbnRlciBmb3IgdXNlIGxvYWRpbmcgYW5kIHN0b3JpbmcgYW55CisgIC8vIGFyZ3VtZW50cyB0aGF0IG1heSBub3QgZml0IGluIHRoZSByZWdpc3RlcnMgYXZhaWxhYmxlIGZvciBhcmd1bWVudAorICAvLyBwYXNzaW5nLgorICBTRFZhbHVlIFN0YWNrUHRyID0gREFHLmdldFJlZ2lzdGVyKFBQQzo6UjEsIE1WVDo6aTMyKTsKKyAgCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgU0RWYWx1ZT4sIDg+IFJlZ3NUb1Bhc3M7CisgIFNtYWxsVmVjdG9yPFRhaWxDYWxsQXJndW1lbnRJbmZvLCA4PiBUYWlsQ2FsbEFyZ3VtZW50czsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gTWVtT3BDaGFpbnM7CisKKyAgLy8gV2FsayB0aGUgcmVnaXN0ZXIvbWVtbG9jIGFzc2lnbm1lbnRzLCBpbnNlcnRpbmcgY29waWVzL2xvYWRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBqID0gMCwgZSA9IEFyZ0xvY3Muc2l6ZSgpOworICAgICAgIGkgIT0gZTsKKyAgICAgICArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBBcmdMb2NzW2ldOworICAgIFNEVmFsdWUgQXJnID0gT3V0VmFsc1tpXTsKKyAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MgPSBPdXRzW2ldLkZsYWdzOworICAgIAorICAgIGlmIChGbGFncy5pc0J5VmFsKCkpIHsKKyAgICAgIC8vIEFyZ3VtZW50IGlzIGFuIGFnZ3JlZ2F0ZSB3aGljaCBpcyBwYXNzZWQgYnkgdmFsdWUsIHRodXMgd2UgbmVlZCB0bworICAgICAgLy8gY3JlYXRlIGEgY29weSBvZiBpdCBpbiB0aGUgbG9jYWwgdmFyaWFibGUgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgIC8vIGZyYW1lICh3aGljaCBpcyB0aGUgc3RhY2sgZnJhbWUgb2YgdGhlIGNhbGxlcikgYW5kIHBhc3MgdGhlIGFkZHJlc3Mgb2YKKyAgICAgIC8vIHRoaXMgY29weSB0byB0aGUgY2FsbGVlLgorICAgICAgYXNzZXJ0KChqIDwgQnlWYWxBcmdMb2NzLnNpemUoKSkgJiYgIkluZGV4IG91dCBvZiBib3VuZHMhIik7CisgICAgICBDQ1ZhbEFzc2lnbiAmQnlWYWxWQSA9IEJ5VmFsQXJnTG9jc1tqKytdOworICAgICAgYXNzZXJ0KChWQS5nZXRWYWxObygpID09IEJ5VmFsVkEuZ2V0VmFsTm8oKSkgJiYgIlZhbE5vIG1pc21hdGNoISIpOworICAgICAgCisgICAgICAvLyBNZW1vcnkgcmVzZXJ2ZWQgaW4gdGhlIGxvY2FsIHZhcmlhYmxlIHNwYWNlIG9mIHRoZSBjYWxsZXJzIHN0YWNrIGZyYW1lLgorICAgICAgdW5zaWduZWQgTG9jTWVtT2Zmc2V0ID0gQnlWYWxWQS5nZXRMb2NNZW1PZmZzZXQoKTsKKyAgICAgIAorICAgICAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoTG9jTWVtT2Zmc2V0KTsKKyAgICAgIFB0ck9mZiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgZ2V0UG9pbnRlclR5KCksIFN0YWNrUHRyLCBQdHJPZmYpOworICAgICAgCisgICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBhcmd1bWVudCBpbiB0aGUgbG9jYWwgYXJlYSBvZiB0aGUgY3VycmVudAorICAgICAgLy8gc3RhY2sgZnJhbWUuCisgICAgICBTRFZhbHVlIE1lbWNweUNhbGwgPQorICAgICAgICBDcmVhdGVDb3B5T2ZCeVZhbEFyZ3VtZW50KEFyZywgUHRyT2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxTZXFTdGFydC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MsIERBRywgZGwpOworICAgICAgCisgICAgICAvLyBUaGlzIG11c3QgZ28gb3V0c2lkZSB0aGUgQ0FMTFNFUV9TVEFSVC4uRU5ELgorICAgICAgU0RWYWx1ZSBOZXdDYWxsU2VxU3RhcnQgPSBEQUcuZ2V0Q0FMTFNFUV9TVEFSVChNZW1jcHlDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbFNlcVN0YXJ0LmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICBEQUcuUmVwbGFjZUFsbFVzZXNXaXRoKENhbGxTZXFTdGFydC5nZXROb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0NhbGxTZXFTdGFydC5nZXROb2RlKCkpOworICAgICAgQ2hhaW4gPSBDYWxsU2VxU3RhcnQgPSBOZXdDYWxsU2VxU3RhcnQ7CisgICAgICAKKyAgICAgIC8vIFBhc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGFnZ3JlZ2F0ZSBjb3B5IG9uIHRoZSBzdGFjayBlaXRoZXIgaW4gYQorICAgICAgLy8gcGh5c2ljYWwgcmVnaXN0ZXIgb3IgaW4gdGhlIHBhcmFtZXRlciBsaXN0IGFyZWEgb2YgdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgIC8vIGZyYW1lIHRvIHRoZSBjYWxsZWUuCisgICAgICBBcmcgPSBQdHJPZmY7CisgICAgfQorICAgIAorICAgIGlmIChWQS5pc1JlZ0xvYygpKSB7CisgICAgICAvLyBQdXQgYXJndW1lbnQgaW4gYSBwaHlzaWNhbCByZWdpc3Rlci4KKyAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFZBLmdldExvY1JlZygpLCBBcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gUHV0IGFyZ3VtZW50IGluIHRoZSBwYXJhbWV0ZXIgbGlzdCBhcmVhIG9mIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLgorICAgICAgYXNzZXJ0KFZBLmlzTWVtTG9jKCkpOworICAgICAgdW5zaWduZWQgTG9jTWVtT2Zmc2V0ID0gVkEuZ2V0TG9jTWVtT2Zmc2V0KCk7CisKKyAgICAgIGlmICghaXNUYWlsQ2FsbCkgeworICAgICAgICBTRFZhbHVlIFB0ck9mZiA9IERBRy5nZXRJbnRQdHJDb25zdGFudChMb2NNZW1PZmZzZXQpOworICAgICAgICBQdHJPZmYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIGdldFBvaW50ZXJUeSgpLCBTdGFja1B0ciwgUHRyT2ZmKTsKKworICAgICAgICBNZW1PcENoYWlucy5wdXNoX2JhY2soREFHLmdldFN0b3JlKENoYWluLCBkbCwgQXJnLCBQdHJPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldFN0YWNrKCksIExvY01lbU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENhbGN1bGF0ZSBhbmQgcmVtZW1iZXIgYXJndW1lbnQgbG9jYXRpb24uCisgICAgICAgIENhbGN1bGF0ZVRhaWxDYWxsQXJnRGVzdChEQUcsIE1GLCBmYWxzZSwgQXJnLCBTUERpZmYsIExvY01lbU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhaWxDYWxsQXJndW1lbnRzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIGlmICghTWVtT3BDaGFpbnMuZW1wdHkoKSkKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJk1lbU9wQ2hhaW5zWzBdLCBNZW1PcENoYWlucy5zaXplKCkpOworICAKKyAgLy8gQnVpbGQgYSBzZXF1ZW5jZSBvZiBjb3B5LXRvLXJlZyBub2RlcyBjaGFpbmVkIHRvZ2V0aGVyIHdpdGggdG9rZW4gY2hhaW4KKyAgLy8gYW5kIGZsYWcgb3BlcmFuZHMgd2hpY2ggY29weSB0aGUgb3V0Z29pbmcgYXJncyBpbnRvIHRoZSBhcHByb3ByaWF0ZSByZWdzLgorICBTRFZhbHVlIEluRmxhZzsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3NUb1Bhc3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFJlZ3NUb1Bhc3NbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3NUb1Bhc3NbaV0uc2Vjb25kLCBJbkZsYWcpOworICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisgIAorICAvLyBTZXQgQ1I2IHRvIHRydWUgaWYgdGhpcyBpcyBhIHZhcmFyZyBjYWxsLgorICBpZiAoaXNWYXJBcmcpIHsKKyAgICBTRFZhbHVlIFNldENSKERBRy5nZXRNYWNoaW5lTm9kZShQUEM6OkNSU0VULCBkbCwgTVZUOjppMzIpLCAwKTsKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBQUEM6OkNSMUVRLCBTZXRDUiwgSW5GbGFnKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIGlmIChpc1RhaWxDYWxsKSB7CisgICAgUHJlcGFyZVRhaWxDYWxsKERBRywgSW5GbGFnLCBDaGFpbiwgZGwsIGZhbHNlLCBTUERpZmYsIE51bUJ5dGVzLCBMUk9wLCBGUE9wLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgVGFpbENhbGxBcmd1bWVudHMpOworICB9CisKKyAgcmV0dXJuIEZpbmlzaENhbGwoQ2FsbENvbnYsIGRsLCBpc1RhaWxDYWxsLCBpc1ZhckFyZywgREFHLAorICAgICAgICAgICAgICAgICAgICBSZWdzVG9QYXNzLCBJbkZsYWcsIENoYWluLCBDYWxsZWUsIFNQRGlmZiwgTnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIElucywgSW5WYWxzKTsKK30KKworU0RWYWx1ZQorUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbF9EYXJ3aW4oU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworCisgIHVuc2lnbmVkIE51bU9wcyAgPSBPdXRzLnNpemUoKTsKKworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisgIGJvb2wgaXNQUEM2NCA9IFB0clZUID09IE1WVDo6aTY0OworICB1bnNpZ25lZCBQdHJCeXRlU2l6ZSA9IGlzUFBDNjQgPyA4IDogNDsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworCisgIC8vIE1hcmsgdGhpcyBmdW5jdGlvbiBhcyBwb3RlbnRpYWxseSBjb250YWluaW5nIGEgZnVuY3Rpb24gdGhhdCBjb250YWlucyBhCisgIC8vIHRhaWwgY2FsbC4gQXMgYSBjb25zZXF1ZW5jZSB0aGUgZnJhbWUgcG9pbnRlciB3aWxsIGJlIHVzZWQgZm9yIGR5bmFtaWNhbGxvYworICAvLyBhbmQgcmVzdG9yaW5nIHRoZSBjYWxsZXJzIHN0YWNrIHBvaW50ZXIgaW4gdGhpcyBmdW5jdGlvbnMgZXBpbG9nLiBUaGlzIGlzCisgIC8vIGRvbmUgYmVjYXVzZSBieSB0YWlsIGNhbGxpbmcgdGhlIGNhbGxlZCBmdW5jdGlvbiBtaWdodCBvdmVyd3JpdGUgdGhlIHZhbHVlCisgIC8vIGluIHRoaXMgZnVuY3Rpb24ncyAoTUYpIHN0YWNrIHBvaW50ZXIgc3RhY2sgc2xvdCAwKFNQKS4KKyAgaWYgKEd1YXJhbnRlZWRUYWlsQ2FsbE9wdCAmJiBDYWxsQ29udj09Q2FsbGluZ0NvbnY6OkZhc3QpCisgICAgTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCktPnNldEhhc0Zhc3RDYWxsKCk7CisKKyAgdW5zaWduZWQgbkFsdGl2ZWNQYXJhbXNBdEVuZCA9IDA7CisKKyAgLy8gQ291bnQgaG93IG1hbnkgYnl0ZXMgYXJlIHRvIGJlIHB1c2hlZCBvbiB0aGUgc3RhY2ssIGluY2x1ZGluZyB0aGUgbGlua2FnZQorICAvLyBhcmVhLCBhbmQgcGFyYW1ldGVyIHBhc3NpbmcgYXJlYS4gIFdlIHN0YXJ0IHdpdGggMjQvNDggYnl0ZXMsIHdoaWNoIGlzCisgIC8vIHByZXJlc2VydmVkIHNwYWNlIGZvciBbU1BdW0NSXVtMUl1bMyB4IHVudXNlZF0uCisgIHVuc2lnbmVkIE51bUJ5dGVzID0KKyAgICBDYWxjdWxhdGVQYXJhbWV0ZXJBbmRMaW5rYWdlQXJlYVNpemUoREFHLCBpc1BQQzY0LCBpc1ZhckFyZywgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHMsIE91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5BbHRpdmVjUGFyYW1zQXRFbmQpOworCisgIC8vIENhbGN1bGF0ZSBieSBob3cgbWFueSBieXRlcyB0aGUgc3RhY2sgaGFzIHRvIGJlIGFkanVzdGVkIGluIGNhc2Ugb2YgdGFpbAorICAvLyBjYWxsIG9wdGltaXphdGlvbi4KKyAgaW50IFNQRGlmZiA9IENhbGN1bGF0ZVRhaWxDYWxsU1BEaWZmKERBRywgaXNUYWlsQ2FsbCwgTnVtQnl0ZXMpOworCisgIC8vIFRvIHByb3RlY3QgYXJndW1lbnRzIG9uIHRoZSBzdGFjayBmcm9tIGJlaW5nIGNsb2JiZXJlZCBpbiBhIHRhaWwgY2FsbCwKKyAgLy8gZm9yY2UgYWxsIHRoZSBsb2FkcyB0byBoYXBwZW4gYmVmb3JlIGRvaW5nIGFueSBvdGhlciBsb3dlcmluZy4KKyAgaWYgKGlzVGFpbENhbGwpCisgICAgQ2hhaW4gPSBEQUcuZ2V0U3RhY2tBcmd1bWVudFRva2VuRmFjdG9yKENoYWluKTsKKworICAvLyBBZGp1c3QgdGhlIHN0YWNrIHBvaW50ZXIgZm9yIHRoZSBuZXcgYXJndW1lbnRzLi4uCisgIC8vIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZWxpbWluYXRlZCBieSB0aGUgcHJvbG9nL2VwaWxvZyBwYXNzCisgIENoYWluID0gREFHLmdldENBTExTRVFfU1RBUlQoQ2hhaW4sIERBRy5nZXRJbnRQdHJDb25zdGFudChOdW1CeXRlcywgdHJ1ZSkpOworICBTRFZhbHVlIENhbGxTZXFTdGFydCA9IENoYWluOworCisgIC8vIExvYWQgdGhlIHJldHVybiBhZGRyZXNzIGFuZCBmcmFtZSBwb2ludGVyIHNvIGl0IGNhbiBiZSBtb3ZlIHNvbWV3aGVyZSBlbHNlCisgIC8vIGxhdGVyLgorICBTRFZhbHVlIExST3AsIEZQT3A7CisgIENoYWluID0gRW1pdFRhaWxDYWxsTG9hZEZQQW5kUmV0QWRkcihEQUcsIFNQRGlmZiwgQ2hhaW4sIExST3AsIEZQT3AsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCk7CisKKyAgLy8gU2V0IHVwIGEgY29weSBvZiB0aGUgc3RhY2sgcG9pbnRlciBmb3IgdXNlIGxvYWRpbmcgYW5kIHN0b3JpbmcgYW55CisgIC8vIGFyZ3VtZW50cyB0aGF0IG1heSBub3QgZml0IGluIHRoZSByZWdpc3RlcnMgYXZhaWxhYmxlIGZvciBhcmd1bWVudAorICAvLyBwYXNzaW5nLgorICBTRFZhbHVlIFN0YWNrUHRyOworICBpZiAoaXNQUEM2NCkKKyAgICBTdGFja1B0ciA9IERBRy5nZXRSZWdpc3RlcihQUEM6OlgxLCBNVlQ6Omk2NCk7CisgIGVsc2UKKyAgICBTdGFja1B0ciA9IERBRy5nZXRSZWdpc3RlcihQUEM6OlIxLCBNVlQ6OmkzMik7CisKKyAgLy8gRmlndXJlIG91dCB3aGljaCBhcmd1bWVudHMgYXJlIGdvaW5nIHRvIGdvIGluIHJlZ2lzdGVycywgYW5kIHdoaWNoIGluCisgIC8vIG1lbW9yeS4gIEFsc28sIGlmIHRoaXMgaXMgYSB2YXJhcmcgZnVuY3Rpb24sIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMKKyAgLy8gbXVzdCBiZSBzdG9yZWQgdG8gb3VyIHN0YWNrLCBhbmQgbG9hZGVkIGludG8gaW50ZWdlciByZWdzIGFzIHdlbGwsIGlmCisgIC8vIGFueSBpbnRlZ2VyIHJlZ3MgYXJlIGF2YWlsYWJsZSBmb3IgYXJndW1lbnQgcGFzc2luZy4KKyAgdW5zaWduZWQgQXJnT2Zmc2V0ID0gUFBDRnJhbWVJbmZvOjpnZXRMaW5rYWdlU2l6ZShpc1BQQzY0LCB0cnVlKTsKKyAgdW5zaWduZWQgR1BSX2lkeCA9IDAsIEZQUl9pZHggPSAwLCBWUl9pZHggPSAwOworCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBHUFJfMzJbXSA9IHsgICAgICAgICAgIC8vIDMyLWJpdCByZWdpc3RlcnMuCisgICAgUFBDOjpSMywgUFBDOjpSNCwgUFBDOjpSNSwgUFBDOjpSNiwKKyAgICBQUEM6OlI3LCBQUEM6OlI4LCBQUEM6OlI5LCBQUEM6OlIxMCwKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdQUl82NFtdID0geyAgICAgICAgICAgLy8gNjQtYml0IHJlZ2lzdGVycy4KKyAgICBQUEM6OlgzLCBQUEM6Olg0LCBQUEM6Olg1LCBQUEM6Olg2LAorICAgIFBQQzo6WDcsIFBQQzo6WDgsIFBQQzo6WDksIFBQQzo6WDEwLAorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgKkZQUiA9IEdldEZQUigpOworCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBWUltdID0geworICAgIFBQQzo6VjIsIFBQQzo6VjMsIFBQQzo6VjQsIFBQQzo6VjUsIFBQQzo6VjYsIFBQQzo6VjcsIFBQQzo6VjgsCisgICAgUFBDOjpWOSwgUFBDOjpWMTAsIFBQQzo6VjExLCBQUEM6OlYxMiwgUFBDOjpWMTMKKyAgfTsKKyAgY29uc3QgdW5zaWduZWQgTnVtR1BScyA9IGFycmF5X2xlbmd0aG9mKEdQUl8zMik7CisgIGNvbnN0IHVuc2lnbmVkIE51bUZQUnMgPSAxMzsKKyAgY29uc3QgdW5zaWduZWQgTnVtVlJzICA9IGFycmF5X2xlbmd0aG9mKFZSKTsKKworICBjb25zdCB1bnNpZ25lZCAqR1BSID0gaXNQUEM2NCA/IEdQUl82NCA6IEdQUl8zMjsKKworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIFNEVmFsdWU+LCA4PiBSZWdzVG9QYXNzOworICBTbWFsbFZlY3RvcjxUYWlsQ2FsbEFyZ3VtZW50SW5mbywgOD4gVGFpbENhbGxBcmd1bWVudHM7CisKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gTWVtT3BDaGFpbnM7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICBTRFZhbHVlIEFyZyA9IE91dFZhbHNbaV07CisgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzID0gT3V0c1tpXS5GbGFnczsKKworICAgIC8vIFB0ck9mZiB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgYXJndW1lbnQgdG8gdGhlIHN0YWNrIGlmIGEKKyAgICAvLyByZWdpc3RlciBjYW5ub3QgYmUgZm91bmQgZm9yIGl0LgorICAgIFNEVmFsdWUgUHRyT2ZmOworCisgICAgUHRyT2ZmID0gREFHLmdldENvbnN0YW50KEFyZ09mZnNldCwgU3RhY2tQdHIuZ2V0VmFsdWVUeXBlKCkpOworCisgICAgUHRyT2ZmID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJWVCwgU3RhY2tQdHIsIFB0ck9mZik7CisKKyAgICAvLyBPbiBQUEM2NCwgcHJvbW90ZSBpbnRlZ2VycyB0byA2NC1iaXQgdmFsdWVzLgorICAgIGlmIChpc1BQQzY0ICYmIEFyZy5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmkzMikgeworICAgICAgLy8gRklYTUU6IFNob3VsZCB0aGlzIHVzZSBBTllfRVhURU5EIGlmIG5laXRoZXIgc2V4dCBub3IgemV4dD8KKyAgICAgIHVuc2lnbmVkIEV4dE9wID0gRmxhZ3MuaXNTRXh0KCkgPyBJU0Q6OlNJR05fRVhURU5EIDogSVNEOjpaRVJPX0VYVEVORDsKKyAgICAgIEFyZyA9IERBRy5nZXROb2RlKEV4dE9wLCBkbCwgTVZUOjppNjQsIEFyZyk7CisgICAgfQorCisgICAgLy8gRklYTUUgbWVtY3B5IGlzIHVzZWQgd2F5IG1vcmUgdGhhbiBuZWNlc3NhcnkuICBDb3JyZWN0bmVzcyBmaXJzdC4KKyAgICBpZiAoRmxhZ3MuaXNCeVZhbCgpKSB7CisgICAgICB1bnNpZ25lZCBTaXplID0gRmxhZ3MuZ2V0QnlWYWxTaXplKCk7CisgICAgICBpZiAoU2l6ZT09MSB8fCBTaXplPT0yKSB7CisgICAgICAgIC8vIFZlcnkgc21hbGwgb2JqZWN0cyBhcmUgcGFzc2VkIHJpZ2h0LWp1c3RpZmllZC4KKyAgICAgICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIHBhc3NlZCBsZWZ0LWp1c3RpZmllZC4KKyAgICAgICAgRVZUIFZUID0gKFNpemU9PTEpID8gTVZUOjppOCA6IE1WVDo6aTE2OworICAgICAgICBpZiAoR1BSX2lkeCAhPSBOdW1HUFJzKSB7CisgICAgICAgICAgU0RWYWx1ZSBMb2FkID0gREFHLmdldEV4dExvYWQoSVNEOjpFWFRMT0FELCBQdHJWVCwgZGwsIENoYWluLCBBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgVlQsIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICAgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKExvYWQuZ2V0VmFsdWUoMSkpOworICAgICAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEdQUltHUFJfaWR4KytdLCBMb2FkKSk7CisKKyAgICAgICAgICBBcmdPZmZzZXQgKz0gUHRyQnl0ZVNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU0RWYWx1ZSBDb25zdCA9IERBRy5nZXRDb25zdGFudCg0IC0gU2l6ZSwgUHRyT2ZmLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgICAgICBTRFZhbHVlIEFkZFB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsIFB0ck9mZiwgQ29uc3QpOworICAgICAgICAgIFNEVmFsdWUgTWVtY3B5Q2FsbCA9IENyZWF0ZUNvcHlPZkJ5VmFsQXJndW1lbnQoQXJnLCBBZGRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxTZXFTdGFydC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLCBEQUcsIGRsKTsKKyAgICAgICAgICAvLyBUaGlzIG11c3QgZ28gb3V0c2lkZSB0aGUgQ0FMTFNFUV9TVEFSVC4uRU5ELgorICAgICAgICAgIFNEVmFsdWUgTmV3Q2FsbFNlcVN0YXJ0ID0gREFHLmdldENBTExTRVFfU1RBUlQoTWVtY3B5Q2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsU2VxU3RhcnQuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgICBEQUcuUmVwbGFjZUFsbFVzZXNXaXRoKENhbGxTZXFTdGFydC5nZXROb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdDYWxsU2VxU3RhcnQuZ2V0Tm9kZSgpKTsKKyAgICAgICAgICBDaGFpbiA9IENhbGxTZXFTdGFydCA9IE5ld0NhbGxTZXFTdGFydDsKKyAgICAgICAgICBBcmdPZmZzZXQgKz0gUHRyQnl0ZVNpemU7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyBDb3B5IGVudGlyZSBvYmplY3QgaW50byBtZW1vcnkuICBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgZ2NjLWdlbmVyYXRlZAorICAgICAgLy8gY29kZSBhc3N1bWVzIGl0IGlzIHRoZXJlLCBldmVuIGlmIGl0IGNvdWxkIGJlIHB1dCBlbnRpcmVseSBpbnRvCisgICAgICAvLyByZWdpc3RlcnMuICAoVGhpcyBpcyBub3Qgd2hhdCB0aGUgZG9jIHNheXMuKQorICAgICAgU0RWYWx1ZSBNZW1jcHlDYWxsID0gQ3JlYXRlQ29weU9mQnlWYWxBcmd1bWVudChBcmcsIFB0ck9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsU2VxU3RhcnQuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLCBEQUcsIGRsKTsKKyAgICAgIC8vIFRoaXMgbXVzdCBnbyBvdXRzaWRlIHRoZSBDQUxMU0VRX1NUQVJULi5FTkQuCisgICAgICBTRFZhbHVlIE5ld0NhbGxTZXFTdGFydCA9IERBRy5nZXRDQUxMU0VRX1NUQVJUKE1lbWNweUNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsU2VxU3RhcnQuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIERBRy5SZXBsYWNlQWxsVXNlc1dpdGgoQ2FsbFNlcVN0YXJ0LmdldE5vZGUoKSwgTmV3Q2FsbFNlcVN0YXJ0LmdldE5vZGUoKSk7CisgICAgICBDaGFpbiA9IENhbGxTZXFTdGFydCA9IE5ld0NhbGxTZXFTdGFydDsKKyAgICAgIC8vIEFuZCBjb3B5IHRoZSBwaWVjZXMgb2YgaXQgdGhhdCBmaXQgaW50byByZWdpc3RlcnMuCisgICAgICBmb3IgKHVuc2lnbmVkIGo9MDsgajxTaXplOyBqKz1QdHJCeXRlU2l6ZSkgeworICAgICAgICBTRFZhbHVlIENvbnN0ID0gREFHLmdldENvbnN0YW50KGosIFB0ck9mZi5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICAgIFNEVmFsdWUgQWRkQXJnID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBQdHJWVCwgQXJnLCBDb25zdCk7CisgICAgICAgIGlmIChHUFJfaWR4ICE9IE51bUdQUnMpIHsKKyAgICAgICAgICBTRFZhbHVlIExvYWQgPSBEQUcuZ2V0TG9hZChQdHJWVCwgZGwsIENoYWluLCBBZGRBcmcsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgICAgICBNZW1PcENoYWlucy5wdXNoX2JhY2soTG9hZC5nZXRWYWx1ZSgxKSk7CisgICAgICAgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoR1BSW0dQUl9pZHgrK10sIExvYWQpKTsKKyAgICAgICAgICBBcmdPZmZzZXQgKz0gUHRyQnl0ZVNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQXJnT2Zmc2V0ICs9ICgoU2l6ZSAtIGogKyBQdHJCeXRlU2l6ZS0xKS9QdHJCeXRlU2l6ZSkqUHRyQnl0ZVNpemU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN3aXRjaCAoQXJnLmdldFZhbHVlVHlwZSgpLmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIFZhbHVlVHlwZSBmb3IgYXJndW1lbnQhIik7CisgICAgY2FzZSBNVlQ6OmkzMjoKKyAgICBjYXNlIE1WVDo6aTY0OgorICAgICAgaWYgKEdQUl9pZHggIT0gTnVtR1BScykgeworICAgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihHUFJbR1BSX2lkeCsrXSwgQXJnKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMb3dlck1lbU9wQ2FsbFRvKERBRywgTUYsIENoYWluLCBBcmcsIFB0ck9mZiwgU1BEaWZmLCBBcmdPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNQUEM2NCwgaXNUYWlsQ2FsbCwgZmFsc2UsIE1lbU9wQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRhaWxDYWxsQXJndW1lbnRzLCBkbCk7CisgICAgICB9CisgICAgICBBcmdPZmZzZXQgKz0gUHRyQnl0ZVNpemU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1WVDo6ZjMyOgorICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICBpZiAoRlBSX2lkeCAhPSBOdW1GUFJzKSB7CisgICAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEZQUltGUFJfaWR4KytdLCBBcmcpKTsKKworICAgICAgICBpZiAoaXNWYXJBcmcpIHsKKyAgICAgICAgICBTRFZhbHVlIFN0b3JlID0gREFHLmdldFN0b3JlKENoYWluLCBkbCwgQXJnLCBQdHJPZmYsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICAgIE1lbU9wQ2hhaW5zLnB1c2hfYmFjayhTdG9yZSk7CisKKyAgICAgICAgICAvLyBGbG9hdCB2YXJhcmdzIGFyZSBhbHdheXMgc2hhZG93ZWQgaW4gYXZhaWxhYmxlIGludGVnZXIgcmVnaXN0ZXJzCisgICAgICAgICAgaWYgKEdQUl9pZHggIT0gTnVtR1BScykgeworICAgICAgICAgICAgU0RWYWx1ZSBMb2FkID0gREFHLmdldExvYWQoUHRyVlQsIGRsLCBTdG9yZSwgUHRyT2ZmLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgICAgICAgIE1lbU9wQ2hhaW5zLnB1c2hfYmFjayhMb2FkLmdldFZhbHVlKDEpKTsKKyAgICAgICAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEdQUltHUFJfaWR4KytdLCBMb2FkKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChHUFJfaWR4ICE9IE51bUdQUnMgJiYgQXJnLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjY0ICYmICFpc1BQQzY0KXsKKyAgICAgICAgICAgIFNEVmFsdWUgQ29uc3RGb3VyID0gREFHLmdldENvbnN0YW50KDQsIFB0ck9mZi5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICAgICAgICBQdHJPZmYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULCBQdHJPZmYsIENvbnN0Rm91cik7CisgICAgICAgICAgICBTRFZhbHVlIExvYWQgPSBEQUcuZ2V0TG9hZChQdHJWVCwgZGwsIFN0b3JlLCBQdHJPZmYsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICAgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKExvYWQuZ2V0VmFsdWUoMSkpOworICAgICAgICAgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoR1BSW0dQUl9pZHgrK10sIExvYWQpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbnkgRlBScyByZW1haW5pbmcsIHdlIG1heSBhbHNvIGhhdmUgR1BScyByZW1haW5pbmcuCisgICAgICAgICAgLy8gQXJncyBwYXNzZWQgaW4gRlBScyBjb25zdW1lIGVpdGhlciAxIChmMzIpIG9yIDIgKGY2NCkgYXZhaWxhYmxlCisgICAgICAgICAgLy8gR1BScy4KKyAgICAgICAgICBpZiAoR1BSX2lkeCAhPSBOdW1HUFJzKQorICAgICAgICAgICAgKytHUFJfaWR4OworICAgICAgICAgIGlmIChHUFJfaWR4ICE9IE51bUdQUnMgJiYgQXJnLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjY0ICYmCisgICAgICAgICAgICAgICFpc1BQQzY0KSAgLy8gUFBDNjQgaGFzIDY0LWJpdCBHUFIncyBvYnZpb3VzbHkgOikKKyAgICAgICAgICAgICsrR1BSX2lkeDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgTG93ZXJNZW1PcENhbGxUbyhEQUcsIE1GLCBDaGFpbiwgQXJnLCBQdHJPZmYsIFNQRGlmZiwgQXJnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzUFBDNjQsIGlzVGFpbENhbGwsIGZhbHNlLCBNZW1PcENoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBUYWlsQ2FsbEFyZ3VtZW50cywgZGwpOworICAgICAgfQorICAgICAgaWYgKGlzUFBDNjQpCisgICAgICAgIEFyZ09mZnNldCArPSA4OworICAgICAgZWxzZQorICAgICAgICBBcmdPZmZzZXQgKz0gQXJnLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyID8gNCA6IDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1WVDo6djRmMzI6CisgICAgY2FzZSBNVlQ6OnY0aTMyOgorICAgIGNhc2UgTVZUOjp2OGkxNjoKKyAgICBjYXNlIE1WVDo6djE2aTg6CisgICAgICBpZiAoaXNWYXJBcmcpIHsKKyAgICAgICAgLy8gVGhlc2UgZ28gYWxpZ25lZCBvbiB0aGUgc3RhY2ssIG9yIGluIHRoZSBjb3JyZXNwb25kaW5nIFIgcmVnaXN0ZXJzCisgICAgICAgIC8vIHdoZW4gd2l0aGluIHJhbmdlLiAgVGhlIERhcndpbiBQUEMgQUJJIGRvYyBjbGFpbXMgdGhleSBhbHNvIGdvIGluCisgICAgICAgIC8vIFYgcmVnaXN0ZXJzOyBpbiBmYWN0IGdjYyBkb2VzIHRoaXMgb25seSBmb3IgYXJndW1lbnRzIHRoYXQgYXJlCisgICAgICAgIC8vIHByb3RvdHlwZWQsIG5vdCBmb3IgdGhvc2UgdGhhdCBtYXRjaCB0aGUgLi4uICBXZSBkbyBpdCBmb3IgYWxsCisgICAgICAgIC8vIGFyZ3VtZW50cywgc2VlbXMgdG8gd29yay4KKyAgICAgICAgd2hpbGUgKEFyZ09mZnNldCAlIDE2ICE9MCkgeworICAgICAgICAgIEFyZ09mZnNldCArPSBQdHJCeXRlU2l6ZTsKKyAgICAgICAgICBpZiAoR1BSX2lkeCAhPSBOdW1HUFJzKQorICAgICAgICAgICAgR1BSX2lkeCsrOworICAgICAgICB9CisgICAgICAgIC8vIFdlIGNvdWxkIGVsaWRlIHRoaXMgc3RvcmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIG9iamVjdCBmaXRzCisgICAgICAgIC8vIGVudGlyZWx5IGluIFIgcmVnaXN0ZXJzLiAgTWF5YmUgbGF0ZXIuCisgICAgICAgIFB0ck9mZiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsIFN0YWNrUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChBcmdPZmZzZXQsIFB0clZUKSk7CisgICAgICAgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBBcmcsIFB0ck9mZiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICBNZW1PcENoYWlucy5wdXNoX2JhY2soU3RvcmUpOworICAgICAgICBpZiAoVlJfaWR4ICE9IE51bVZScykgeworICAgICAgICAgIFNEVmFsdWUgTG9hZCA9IERBRy5nZXRMb2FkKE1WVDo6djRmMzIsIGRsLCBTdG9yZSwgUHRyT2ZmLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICAgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKExvYWQuZ2V0VmFsdWUoMSkpOworICAgICAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFZSW1ZSX2lkeCsrXSwgTG9hZCkpOworICAgICAgICB9CisgICAgICAgIEFyZ09mZnNldCArPSAxNjsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpPTA7IGk8MTY7IGkrPVB0ckJ5dGVTaXplKSB7CisgICAgICAgICAgaWYgKEdQUl9pZHggPT0gTnVtR1BScykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIFNEVmFsdWUgSXggPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULCBQdHJPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KGksIFB0clZUKSk7CisgICAgICAgICAgU0RWYWx1ZSBMb2FkID0gREFHLmdldExvYWQoUHRyVlQsIGRsLCBTdG9yZSwgSXgsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgICAgICBNZW1PcENoYWlucy5wdXNoX2JhY2soTG9hZC5nZXRWYWx1ZSgxKSk7CisgICAgICAgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoR1BSW0dQUl9pZHgrK10sIExvYWQpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gTm9uLXZhcmFyZ3MgQWx0aXZlYyBwYXJhbXMgZ2VuZXJhbGx5IGdvIGluIHJlZ2lzdGVycywgYnV0IGhhdmUKKyAgICAgIC8vIHN0YWNrIHNwYWNlIGFsbG9jYXRlZCBhdCB0aGUgZW5kLgorICAgICAgaWYgKFZSX2lkeCAhPSBOdW1WUnMpIHsKKyAgICAgICAgLy8gRG9lc24ndCBoYXZlIEdQUiBzcGFjZSBhbGxvY2F0ZWQuCisgICAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFZSW1ZSX2lkeCsrXSwgQXJnKSk7CisgICAgICB9IGVsc2UgaWYgKG5BbHRpdmVjUGFyYW1zQXRFbmQ9PTApIHsKKyAgICAgICAgLy8gV2UgYXJlIGVtaXR0aW5nIEFsdGl2ZWMgcGFyYW1zIGluIG9yZGVyLgorICAgICAgICBMb3dlck1lbU9wQ2FsbFRvKERBRywgTUYsIENoYWluLCBBcmcsIFB0ck9mZiwgU1BEaWZmLCBBcmdPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNQUEM2NCwgaXNUYWlsQ2FsbCwgdHJ1ZSwgTWVtT3BDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGFpbENhbGxBcmd1bWVudHMsIGRsKTsKKyAgICAgICAgQXJnT2Zmc2V0ICs9IDE2OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8vIElmIGFsbCBBbHRpdmVjIHBhcmFtZXRlcnMgZml0IGluIHJlZ2lzdGVycywgYXMgdGhleSB1c3VhbGx5IGRvLAorICAvLyB0aGV5IGdldCBzdGFjayBzcGFjZSBmb2xsb3dpbmcgdGhlIG5vbi1BbHRpdmVjIHBhcmFtZXRlcnMuICBXZQorICAvLyBkb24ndCB0cmFjayB0aGlzIGhlcmUgYmVjYXVzZSBub2JvZHkgYmVsb3cgbmVlZHMgaXQuCisgIC8vIElmIHRoZXJlIGFyZSBtb3JlIEFsdGl2ZWMgcGFyYW1ldGVycyB0aGFuIGZpdCBpbiByZWdpc3RlcnMgZW1pdAorICAvLyB0aGUgc3RvcmVzIGhlcmUuCisgIGlmICghaXNWYXJBcmcgJiYgbkFsdGl2ZWNQYXJhbXNBdEVuZCA+IE51bVZScykgeworICAgIHVuc2lnbmVkIGogPSAwOworICAgIC8vIE9mZnNldCBpcyBhbGlnbmVkOyBza2lwIDFzdCAxMiBwYXJhbXMgd2hpY2ggZ28gaW4gViByZWdpc3RlcnMuCisgICAgQXJnT2Zmc2V0ID0gKChBcmdPZmZzZXQrMTUpLzE2KSoxNjsKKyAgICBBcmdPZmZzZXQgKz0gMTIqMTY7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHM7ICsraSkgeworICAgICAgU0RWYWx1ZSBBcmcgPSBPdXRWYWxzW2ldOworICAgICAgRVZUIEFyZ1R5cGUgPSBPdXRzW2ldLlZUOworICAgICAgaWYgKEFyZ1R5cGU9PU1WVDo6djRmMzIgfHwgQXJnVHlwZT09TVZUOjp2NGkzMiB8fAorICAgICAgICAgIEFyZ1R5cGU9PU1WVDo6djhpMTYgfHwgQXJnVHlwZT09TVZUOjp2MTZpOCkgeworICAgICAgICBpZiAoKytqID4gTnVtVlJzKSB7CisgICAgICAgICAgU0RWYWx1ZSBQdHJPZmY7CisgICAgICAgICAgLy8gV2UgYXJlIGVtaXR0aW5nIEFsdGl2ZWMgcGFyYW1zIGluIG9yZGVyLgorICAgICAgICAgIExvd2VyTWVtT3BDYWxsVG8oREFHLCBNRiwgQ2hhaW4sIEFyZywgUHRyT2ZmLCBTUERpZmYsIEFyZ09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUFBDNjQsIGlzVGFpbENhbGwsIHRydWUsIE1lbU9wQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFpbENhbGxBcmd1bWVudHMsIGRsKTsKKyAgICAgICAgICBBcmdPZmZzZXQgKz0gMTY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIU1lbU9wQ2hhaW5zLmVtcHR5KCkpCisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZNZW1PcENoYWluc1swXSwgTWVtT3BDaGFpbnMuc2l6ZSgpKTsKKworICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGluZGlyZWN0IGNhbGwgKE1UQ1RSL0JDVFJMKS4KKyAgLy8gU2VlIFByZXBhcmVDYWxsKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY2FsbHMgdGhyb3VnaCBmdW5jdGlvbgorICAvLyBwb2ludGVycyBpbiB0aGUgNjQtYml0IFNWUjQgQUJJLgorICBpZiAoIWlzVGFpbENhbGwgJiYgaXNQUEM2NCAmJiBQUENTdWJUYXJnZXQuaXNTVlI0QUJJKCkgJiYKKyAgICAgICFkeW5fY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihDYWxsZWUpICYmCisgICAgICAhZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkgJiYKKyAgICAgICFpc0JMQUNvbXBhdGlibGVBZGRyZXNzKENhbGxlZSwgREFHKSkgeworICAgIC8vIExvYWQgcjIgaW50byBhIHZpcnR1YWwgcmVnaXN0ZXIgYW5kIHN0b3JlIGl0IHRvIHRoZSBUT0Mgc2F2ZSBhcmVhLgorICAgIFNEVmFsdWUgVmFsID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgUFBDOjpYMiwgTVZUOjppNjQpOworICAgIC8vIFRPQyBzYXZlIGFyZWEgb2Zmc2V0LgorICAgIFNEVmFsdWUgUHRyT2ZmID0gREFHLmdldEludFB0ckNvbnN0YW50KDQwKTsKKyAgICBTRFZhbHVlIEFkZFB0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsIFN0YWNrUHRyLCBQdHJPZmYpOworICAgIENoYWluID0gREFHLmdldFN0b3JlKFZhbC5nZXRWYWx1ZSgxKSwgZGwsIFZhbCwgQWRkUHRyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgIH0KKworICAvLyBPbiBEYXJ3aW4sIFIxMiBtdXN0IGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgYW4gaW5kaXJlY3QgY2FsbGVlLiAgVGhpcyBkb2VzCisgIC8vIG5vdCBtZWFuIHRoZSBNVENUUiBpbnN0cnVjdGlvbiBtdXN0IHVzZSBSMTI7IGl0J3MgZWFzaWVyIHRvIG1vZGVsIHRoaXMgYXMKKyAgLy8gYW4gZXh0cmEgcGFyYW1ldGVyLCBzbyBkbyB0aGF0LgorICBpZiAoIWlzVGFpbENhbGwgJiYgCisgICAgICAhZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oQ2FsbGVlKSAmJgorICAgICAgIWR5bl9jYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPihDYWxsZWUpICYmCisgICAgICAhaXNCTEFDb21wYXRpYmxlQWRkcmVzcyhDYWxsZWUsIERBRykpCisgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoKHVuc2lnbmVkKShpc1BQQzY0ID8gUFBDOjpYMTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDOjpSMTIpLCBDYWxsZWUpKTsKKworICAvLyBCdWlsZCBhIHNlcXVlbmNlIG9mIGNvcHktdG8tcmVnIG5vZGVzIGNoYWluZWQgdG9nZXRoZXIgd2l0aCB0b2tlbiBjaGFpbgorICAvLyBhbmQgZmxhZyBvcGVyYW5kcyB3aGljaCBjb3B5IHRoZSBvdXRnb2luZyBhcmdzIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlZ3MuCisgIFNEVmFsdWUgSW5GbGFnOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgUmVnc1RvUGFzc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQsIEluRmxhZyk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIH0KKworICBpZiAoaXNUYWlsQ2FsbCkgeworICAgIFByZXBhcmVUYWlsQ2FsbChEQUcsIEluRmxhZywgQ2hhaW4sIGRsLCBpc1BQQzY0LCBTUERpZmYsIE51bUJ5dGVzLCBMUk9wLAorICAgICAgICAgICAgICAgICAgICBGUE9wLCB0cnVlLCBUYWlsQ2FsbEFyZ3VtZW50cyk7CisgIH0KKworICByZXR1cm4gRmluaXNoQ2FsbChDYWxsQ29udiwgZGwsIGlzVGFpbENhbGwsIGlzVmFyQXJnLCBEQUcsCisgICAgICAgICAgICAgICAgICAgIFJlZ3NUb1Bhc3MsIEluRmxhZywgQ2hhaW4sIENhbGxlZSwgU1BEaWZmLCBOdW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgSW5zLCBJblZhbHMpOworfQorCitTRFZhbHVlCitQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJSZXR1cm4oU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisKKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBSVkxvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICBSVkxvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgQ0NJbmZvLkFuYWx5emVSZXR1cm4oT3V0cywgUmV0Q0NfUFBDKTsKKworICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXR1cm4gbG93ZXJlZCBmb3IgdGhpcyBmdW5jdGlvbiwgYWRkIHRoZSByZWdzIHRvIHRoZQorICAvLyBsaXZlb3V0IHNldCBmb3IgdGhlIGZ1bmN0aW9uLgorICBpZiAoREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5saXZlb3V0X2VtcHR5KCkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkKKyAgICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkuYWRkTGl2ZU91dChSVkxvY3NbaV0uZ2V0TG9jUmVnKCkpOworICB9CisKKyAgU0RWYWx1ZSBGbGFnOworCisgIC8vIENvcHkgdGhlIHJlc3VsdCB2YWx1ZXMgaW50byB0aGUgb3V0cHV0IHJlZ2lzdGVycy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBSVkxvY3NbaV07CisgICAgYXNzZXJ0KFZBLmlzUmVnTG9jKCkgJiYgIkNhbiBvbmx5IHJldHVybiBpbiByZWdpc3RlcnMhIik7CisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgVkEuZ2V0TG9jUmVnKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dFZhbHNbaV0sIEZsYWcpOworICAgIEZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIGlmIChGbGFnLmdldE5vZGUoKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoUFBDSVNEOjpSRVRfRkxBRywgZGwsIE1WVDo6T3RoZXIsIENoYWluLCBGbGFnKTsKKyAgZWxzZQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShQUENJU0Q6OlJFVF9GTEFHLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4pOworfQorCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpMb3dlclNUQUNLUkVTVE9SRShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFBDU3VidGFyZ2V0ICZTdWJ0YXJnZXQpIGNvbnN0IHsKKyAgLy8gV2hlbiB3ZSBwb3AgdGhlIGR5bmFtaWMgYWxsb2NhdGlvbiB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIFNQIGxpbmsuCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBHZXQgdGhlIGNvcmVjdCB0eXBlIGZvciBwb2ludGVycy4KKyAgRVZUIFB0clZUID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLmdldFBvaW50ZXJUeSgpOworCisgIC8vIENvbnN0cnVjdCB0aGUgc3RhY2sgcG9pbnRlciBvcGVyYW5kLgorICBib29sIGlzUFBDNjQgPSBTdWJ0YXJnZXQuaXNQUEM2NCgpOworICB1bnNpZ25lZCBTUCA9IGlzUFBDNjQgPyBQUEM6OlgxIDogUFBDOjpSMTsKKyAgU0RWYWx1ZSBTdGFja1B0ciA9IERBRy5nZXRSZWdpc3RlcihTUCwgUHRyVlQpOworCisgIC8vIEdldCB0aGUgb3BlcmFuZHMgZm9yIHRoZSBTVEFDS1JFU1RPUkUuCisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFNhdmVTUCA9IE9wLmdldE9wZXJhbmQoMSk7CisKKyAgLy8gTG9hZCB0aGUgb2xkIGxpbmsgU1AuCisgIFNEVmFsdWUgTG9hZExpbmtTUCA9IERBRy5nZXRMb2FkKFB0clZULCBkbCwgQ2hhaW4sIFN0YWNrUHRyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworCisgIC8vIFJlc3RvcmUgdGhlIHN0YWNrIHBvaW50ZXIuCisgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhMb2FkTGlua1NQLmdldFZhbHVlKDEpLCBkbCwgU1AsIFNhdmVTUCk7CisKKyAgLy8gU3RvcmUgdGhlIG9sZCBsaW5rIFNQLgorICByZXR1cm4gREFHLmdldFN0b3JlKENoYWluLCBkbCwgTG9hZExpbmtTUCwgU3RhY2tQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKK30KKworCisKK1NEVmFsdWUKK1BQQ1RhcmdldExvd2VyaW5nOjpnZXRSZXR1cm5BZGRyRnJhbWVJbmRleChTZWxlY3Rpb25EQUcgJiBEQUcpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgYm9vbCBpc1BQQzY0ID0gUFBDU3ViVGFyZ2V0LmlzUFBDNjQoKTsKKyAgYm9vbCBpc0RhcndpbkFCSSA9IFBQQ1N1YlRhcmdldC5pc0RhcndpbkFCSSgpOworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisKKyAgLy8gR2V0IGN1cnJlbnQgZnJhbWUgcG9pbnRlciBzYXZlIGluZGV4LiAgVGhlIHVzZXJzIG9mIHRoaXMgaW5kZXggd2lsbCBiZQorICAvLyBwcmltYXJpbHkgRFlOQUxMT0MgaW5zdHJ1Y3Rpb25zLgorICBQUENGdW5jdGlvbkluZm8gKkZJID0gTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCk7CisgIGludCBSQVNJID0gRkktPmdldFJldHVybkFkZHJTYXZlSW5kZXgoKTsKKworICAvLyBJZiB0aGUgZnJhbWUgcG9pbnRlciBzYXZlIGluZGV4IGhhc24ndCBiZWVuIGRlZmluZWQgeWV0LgorICBpZiAoIVJBU0kpIHsKKyAgICAvLyBGaW5kIG91dCB3aGF0IHRoZSBmaXggb2Zmc2V0IG9mIHRoZSBmcmFtZSBwb2ludGVyIHNhdmUgYXJlYS4KKyAgICBpbnQgTFJPZmZzZXQgPSBQUENGcmFtZUluZm86OmdldFJldHVyblNhdmVPZmZzZXQoaXNQUEM2NCwgaXNEYXJ3aW5BQkkpOworICAgIC8vIEFsbG9jYXRlIHRoZSBmcmFtZSBpbmRleCBmb3IgZnJhbWUgcG9pbnRlciBzYXZlIGFyZWEuCisgICAgUkFTSSA9IE1GLmdldEZyYW1lSW5mbygpLT5DcmVhdGVGaXhlZE9iamVjdChpc1BQQzY0PyA4IDogNCwgTFJPZmZzZXQsIHRydWUpOworICAgIC8vIFNhdmUgdGhlIHJlc3VsdC4KKyAgICBGSS0+c2V0UmV0dXJuQWRkclNhdmVJbmRleChSQVNJKTsKKyAgfQorICByZXR1cm4gREFHLmdldEZyYW1lSW5kZXgoUkFTSSwgUHRyVlQpOworfQorCitTRFZhbHVlCitQUENUYXJnZXRMb3dlcmluZzo6Z2V0RnJhbWVQb2ludGVyRnJhbWVJbmRleChTZWxlY3Rpb25EQUcgJiBEQUcpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgYm9vbCBpc1BQQzY0ID0gUFBDU3ViVGFyZ2V0LmlzUFBDNjQoKTsKKyAgYm9vbCBpc0RhcndpbkFCSSA9IFBQQ1N1YlRhcmdldC5pc0RhcndpbkFCSSgpOworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisKKyAgLy8gR2V0IGN1cnJlbnQgZnJhbWUgcG9pbnRlciBzYXZlIGluZGV4LiAgVGhlIHVzZXJzIG9mIHRoaXMgaW5kZXggd2lsbCBiZQorICAvLyBwcmltYXJpbHkgRFlOQUxMT0MgaW5zdHJ1Y3Rpb25zLgorICBQUENGdW5jdGlvbkluZm8gKkZJID0gTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCk7CisgIGludCBGUFNJID0gRkktPmdldEZyYW1lUG9pbnRlclNhdmVJbmRleCgpOworCisgIC8vIElmIHRoZSBmcmFtZSBwb2ludGVyIHNhdmUgaW5kZXggaGFzbid0IGJlZW4gZGVmaW5lZCB5ZXQuCisgIGlmICghRlBTSSkgeworICAgIC8vIEZpbmQgb3V0IHdoYXQgdGhlIGZpeCBvZmZzZXQgb2YgdGhlIGZyYW1lIHBvaW50ZXIgc2F2ZSBhcmVhLgorICAgIGludCBGUE9mZnNldCA9IFBQQ0ZyYW1lSW5mbzo6Z2V0RnJhbWVQb2ludGVyU2F2ZU9mZnNldChpc1BQQzY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RhcndpbkFCSSk7CisKKyAgICAvLyBBbGxvY2F0ZSB0aGUgZnJhbWUgaW5kZXggZm9yIGZyYW1lIHBvaW50ZXIgc2F2ZSBhcmVhLgorICAgIEZQU0kgPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlRml4ZWRPYmplY3QoaXNQUEM2ND8gOCA6IDQsIEZQT2Zmc2V0LCB0cnVlKTsKKyAgICAvLyBTYXZlIHRoZSByZXN1bHQuCisgICAgRkktPnNldEZyYW1lUG9pbnRlclNhdmVJbmRleChGUFNJKTsKKyAgfQorICByZXR1cm4gREFHLmdldEZyYW1lSW5kZXgoRlBTSSwgUHRyVlQpOworfQorCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpMb3dlckRZTkFNSUNfU1RBQ0tBTExPQyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFBDU3VidGFyZ2V0ICZTdWJ0YXJnZXQpIGNvbnN0IHsKKyAgLy8gR2V0IHRoZSBpbnB1dHMuCisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFNpemUgID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIC8vIEdldCB0aGUgY29yZWN0IHR5cGUgZm9yIHBvaW50ZXJzLgorICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisgIC8vIE5lZ2F0ZSB0aGUgc2l6ZS4KKyAgU0RWYWx1ZSBOZWdTaXplID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBQdHJWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpLCBTaXplKTsKKyAgLy8gQ29uc3RydWN0IGEgbm9kZSBmb3IgdGhlIGZyYW1lIHBvaW50ZXIgc2F2ZSBpbmRleC4KKyAgU0RWYWx1ZSBGUFNJZHggPSBnZXRGcmFtZVBvaW50ZXJGcmFtZUluZGV4KERBRyk7CisgIC8vIEJ1aWxkIGEgRFlOQUxMT0Mgbm9kZS4KKyAgU0RWYWx1ZSBPcHNbM10gPSB7IENoYWluLCBOZWdTaXplLCBGUFNJZHggfTsKKyAgU0RWVExpc3QgVlRzID0gREFHLmdldFZUTGlzdChQdHJWVCwgTVZUOjpPdGhlcik7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShQUENJU0Q6OkRZTkFMTE9DLCBkbCwgVlRzLCBPcHMsIDMpOworfQorCisvLy8gTG93ZXJTRUxFQ1RfQ0MgLSBMb3dlciBmbG9hdGluZyBwb2ludCBzZWxlY3RfY2MncyBpbnRvIGZzZWwgaW5zdHJ1Y3Rpb24gd2hlbgorLy8vIHBvc3NpYmxlLgorU0RWYWx1ZSBQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJTRUxFQ1RfQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgLy8gTm90IEZQPyBOb3QgYSBmc2VsLgorICBpZiAoIU9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCkgfHwKKyAgICAgICFPcC5nZXRPcGVyYW5kKDIpLmdldFZhbHVlVHlwZSgpLmlzRmxvYXRpbmdQb2ludCgpKQorICAgIHJldHVybiBPcDsKKworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCg0KSktPmdldCgpOworCisgIC8vIENhbm5vdCBoYW5kbGUgU0VURVEvU0VUTkUuCisgIGlmIChDQyA9PSBJU0Q6OlNFVEVRIHx8IENDID09IElTRDo6U0VUTkUpIHJldHVybiBPcDsKKworICBFVlQgUmVzVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIENtcFZUID0gT3AuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgU0RWYWx1ZSBMSFMgPSBPcC5nZXRPcGVyYW5kKDApLCBSSFMgPSBPcC5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIFRWICA9IE9wLmdldE9wZXJhbmQoMiksIEZWICA9IE9wLmdldE9wZXJhbmQoMyk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBJZiB0aGUgUkhTIG9mIHRoZSBjb21wYXJpc29uIGlzIGEgMC4wLCB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoZQorICAvLyBzdWJ0cmFjdGlvbiBhdCBhbGwuCisgIGlmIChpc0Zsb2F0aW5nUG9pbnRaZXJvKFJIUykpCisgICAgc3dpdGNoIChDQykgeworICAgIGRlZmF1bHQ6IGJyZWFrOyAgICAgICAvLyBTRVRVTyBldGMgYXJlbid0IGhhbmRsZWQgYnkgZnNlbC4KKyAgICBjYXNlIElTRDo6U0VUVUxUOgorICAgIGNhc2UgSVNEOjpTRVRMVDoKKyAgICAgIHN0ZDo6c3dhcChUViwgRlYpOyAgLy8gZnNlbCBpcyBuYXRpdmVseSBzZXRnZSwgc3dhcCBvcGVyYW5kcyBmb3Igc2V0bHQKKyAgICBjYXNlIElTRDo6U0VUT0dFOgorICAgIGNhc2UgSVNEOjpTRVRHRToKKyAgICAgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmMzIpICAgLy8gQ29tcGFyaXNvbiBpcyBhbHdheXMgNjQtYml0cworICAgICAgICBMSFMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZQX0VYVEVORCwgZGwsIE1WVDo6ZjY0LCBMSFMpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKFBQQ0lTRDo6RlNFTCwgZGwsIFJlc1ZULCBMSFMsIFRWLCBGVik7CisgICAgY2FzZSBJU0Q6OlNFVFVHVDoKKyAgICBjYXNlIElTRDo6U0VUR1Q6CisgICAgICBzdGQ6OnN3YXAoVFYsIEZWKTsgIC8vIGZzZWwgaXMgbmF0aXZlbHkgc2V0Z2UsIHN3YXAgb3BlcmFuZHMgZm9yIHNldGx0CisgICAgY2FzZSBJU0Q6OlNFVE9MRToKKyAgICBjYXNlIElTRDo6U0VUTEU6CisgICAgICBpZiAoTEhTLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyKSAgIC8vIENvbXBhcmlzb24gaXMgYWx3YXlzIDY0LWJpdHMKKyAgICAgICAgTEhTID0gREFHLmdldE5vZGUoSVNEOjpGUF9FWFRFTkQsIGRsLCBNVlQ6OmY2NCwgTEhTKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShQUENJU0Q6OkZTRUwsIGRsLCBSZXNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkZORUcsIGRsLCBNVlQ6OmY2NCwgTEhTKSwgVFYsIEZWKTsKKyAgICB9CisKKyAgU0RWYWx1ZSBDbXA7CisgIHN3aXRjaCAoQ0MpIHsKKyAgZGVmYXVsdDogYnJlYWs7ICAgICAgIC8vIFNFVFVPIGV0YyBhcmVuJ3QgaGFuZGxlZCBieSBmc2VsLgorICBjYXNlIElTRDo6U0VUVUxUOgorICBjYXNlIElTRDo6U0VUTFQ6CisgICAgQ21wID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgQ21wVlQsIExIUywgUkhTKTsKKyAgICBpZiAoQ21wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyKSAgIC8vIENvbXBhcmlzb24gaXMgYWx3YXlzIDY0LWJpdHMKKyAgICAgIENtcCA9IERBRy5nZXROb2RlKElTRDo6RlBfRVhURU5ELCBkbCwgTVZUOjpmNjQsIENtcCk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoUFBDSVNEOjpGU0VMLCBkbCwgUmVzVlQsIENtcCwgRlYsIFRWKTsKKyAgY2FzZSBJU0Q6OlNFVE9HRToKKyAgY2FzZSBJU0Q6OlNFVEdFOgorICAgIENtcCA9IERBRy5nZXROb2RlKElTRDo6RlNVQiwgZGwsIENtcFZULCBMSFMsIFJIUyk7CisgICAgaWYgKENtcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmYzMikgICAvLyBDb21wYXJpc29uIGlzIGFsd2F5cyA2NC1iaXRzCisgICAgICBDbXAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZQX0VYVEVORCwgZGwsIE1WVDo6ZjY0LCBDbXApOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKFBQQ0lTRDo6RlNFTCwgZGwsIFJlc1ZULCBDbXAsIFRWLCBGVik7CisgIGNhc2UgSVNEOjpTRVRVR1Q6CisgIGNhc2UgSVNEOjpTRVRHVDoKKyAgICBDbXAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBDbXBWVCwgUkhTLCBMSFMpOworICAgIGlmIChDbXAuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmMzIpICAgLy8gQ29tcGFyaXNvbiBpcyBhbHdheXMgNjQtYml0cworICAgICAgQ21wID0gREFHLmdldE5vZGUoSVNEOjpGUF9FWFRFTkQsIGRsLCBNVlQ6OmY2NCwgQ21wKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShQUENJU0Q6OkZTRUwsIGRsLCBSZXNWVCwgQ21wLCBGViwgVFYpOworICBjYXNlIElTRDo6U0VUT0xFOgorICBjYXNlIElTRDo6U0VUTEU6CisgICAgQ21wID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgQ21wVlQsIFJIUywgTEhTKTsKKyAgICBpZiAoQ21wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyKSAgIC8vIENvbXBhcmlzb24gaXMgYWx3YXlzIDY0LWJpdHMKKyAgICAgIENtcCA9IERBRy5nZXROb2RlKElTRDo6RlBfRVhURU5ELCBkbCwgTVZUOjpmNjQsIENtcCk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoUFBDSVNEOjpGU0VMLCBkbCwgUmVzVlQsIENtcCwgVFYsIEZWKTsKKyAgfQorICByZXR1cm4gT3A7Cit9CisKKy8vIEZJWE1FOiBTcGxpdCB0aGlzIGNvZGUgdXAgd2hlbiBMZWdhbGl6ZURBR1R5cGVzIGxhbmRzLgorU0RWYWx1ZSBQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJGUF9UT19JTlQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIGNvbnN0IHsKKyAgYXNzZXJ0KE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCkpOworICBTRFZhbHVlIFNyYyA9IE9wLmdldE9wZXJhbmQoMCk7CisgIGlmIChTcmMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmMzIpCisgICAgU3JjID0gREFHLmdldE5vZGUoSVNEOjpGUF9FWFRFTkQsIGRsLCBNVlQ6OmY2NCwgU3JjKTsKKworICBTRFZhbHVlIFRtcDsKKyAgc3dpdGNoIChPcC5nZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBGUF9UT19JTlQgdHlwZSBpbiBjdXN0b20gZXhwYW5kZXIhIik7CisgIGNhc2UgTVZUOjppMzI6CisgICAgVG1wID0gREFHLmdldE5vZGUoT3AuZ2V0T3Bjb2RlKCk9PUlTRDo6RlBfVE9fU0lOVCA/IFBQQ0lTRDo6RkNUSVdaIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ0lTRDo6RkNUSURaLCAKKyAgICAgICAgICAgICAgICAgICAgICBkbCwgTVZUOjpmNjQsIFNyYyk7CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjppNjQ6CisgICAgVG1wID0gREFHLmdldE5vZGUoUFBDSVNEOjpGQ1RJRFosIGRsLCBNVlQ6OmY2NCwgU3JjKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8vIENvbnZlcnQgdGhlIEZQIHZhbHVlIHRvIGFuIGludCB2YWx1ZSB0aHJvdWdoIG1lbW9yeS4KKyAgU0RWYWx1ZSBGSVB0ciA9IERBRy5DcmVhdGVTdGFja1RlbXBvcmFyeShNVlQ6OmY2NCk7CisKKyAgLy8gRW1pdCBhIHN0b3JlIHRvIHRoZSBzdGFjayBzbG90LgorICBTRFZhbHVlIENoYWluID0gREFHLmdldFN0b3JlKERBRy5nZXRFbnRyeU5vZGUoKSwgZGwsIFRtcCwgRklQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKworICAvLyBSZXN1bHQgaXMgYSBsb2FkIGZyb20gdGhlIHN0YWNrIHNsb3QuICBJZiBsb2FkaW5nIDQgYnl0ZXMsIG1ha2Ugc3VyZSB0bworICAvLyBhZGQgaW4gYSBiaWFzLgorICBpZiAoT3AuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIpCisgICAgRklQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIEZJUHRyLmdldFZhbHVlVHlwZSgpLCBGSVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCg0LCBGSVB0ci5nZXRWYWx1ZVR5cGUoKSkpOworICByZXR1cm4gREFHLmdldExvYWQoT3AuZ2V0VmFsdWVUeXBlKCksIGRsLCBDaGFpbiwgRklQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworfQorCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpMb3dlclNJTlRfVE9fRlAoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIC8vIERvbid0IGhhbmRsZSBwcGNfZnAxMjggaGVyZTsgbGV0IGl0IGJlIGxvd2VyZWQgdG8gYSBsaWJjYWxsLgorICBpZiAoT3AuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjpmMzIgJiYgT3AuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjpmNjQpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBpZiAoT3AuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6Omk2NCkgeworICAgIFNEVmFsdWUgQml0cyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6ZjY0LCBPcC5nZXRPcGVyYW5kKDApKTsKKyAgICBTRFZhbHVlIEZQID0gREFHLmdldE5vZGUoUFBDSVNEOjpGQ0ZJRCwgZGwsIE1WVDo6ZjY0LCBCaXRzKTsKKyAgICBpZiAoT3AuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmMzIpCisgICAgICBGUCA9IERBRy5nZXROb2RlKElTRDo6RlBfUk9VTkQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmYzMiwgRlAsIERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSk7CisgICAgcmV0dXJuIEZQOworICB9CisKKyAgYXNzZXJ0KE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIgJiYKKyAgICAgICAgICJVbmhhbmRsZWQgU0lOVF9UT19GUCB0eXBlIGluIGN1c3RvbSBleHBhbmRlciEiKTsKKyAgLy8gU2luY2Ugd2Ugb25seSBnZW5lcmF0ZSB0aGlzIGluIDY0LWJpdCBtb2RlLCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YKKyAgLy8gNjQtYml0IHJlZ2lzdGVycy4gIEluIHBhcnRpY3VsYXIsIHNpZ24gZXh0ZW5kIHRoZSBpbnB1dCB2YWx1ZSBpbnRvIHRoZQorICAvLyA2NC1iaXQgcmVnaXN0ZXIgd2l0aCBleHRzdywgc3RvcmUgdGhlIFdIT0xFIDY0LWJpdCB2YWx1ZSBpbnRvIHRoZSBzdGFjaworICAvLyB0aGVuIGxmZCBpdCBhbmQgZmNmaWQgaXQuCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKkZyYW1lSW5mbyA9IE1GLmdldEZyYW1lSW5mbygpOworICBpbnQgRnJhbWVJZHggPSBGcmFtZUluZm8tPkNyZWF0ZVN0YWNrT2JqZWN0KDgsIDgsIGZhbHNlKTsKKyAgRVZUIFB0clZUID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLmdldFBvaW50ZXJUeSgpOworICBTRFZhbHVlIEZJZHggPSBEQUcuZ2V0RnJhbWVJbmRleChGcmFtZUlkeCwgUHRyVlQpOworCisgIFNEVmFsdWUgRXh0NjQgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkVYVFNXXzMyLCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMCkpOworCisgIC8vIFNURCB0aGUgZXh0ZW5kZWQgdmFsdWUgaW50byB0aGUgc3RhY2sgc2xvdC4KKyAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgTUYuZ2V0TWFjaGluZU1lbU9wZXJhbmQoUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRnJhbWVJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kOjpNT1N0b3JlLCAwLCA4LCA4KTsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgREFHLmdldEVudHJ5Tm9kZSgpLCBFeHQ2NCwgRklkeCB9OworICBTRFZhbHVlIFN0b3JlID0KKyAgICBEQUcuZ2V0TWVtSW50cmluc2ljTm9kZShQUENJU0Q6OlNURF8zMiwgZGwsIERBRy5nZXRWVExpc3QoTVZUOjpPdGhlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCA0LCBNVlQ6Omk2NCwgTU1PKTsKKyAgLy8gTG9hZCB0aGUgdmFsdWUgYXMgYSBkb3VibGUuCisgIFNEVmFsdWUgTGQgPSBEQUcuZ2V0TG9hZChNVlQ6OmY2NCwgZGwsIFN0b3JlLCBGSWR4LCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworCisgIC8vIEZDRklEIGl0IGFuZCByZXR1cm4gaXQuCisgIFNEVmFsdWUgRlAgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkZDRklELCBkbCwgTVZUOjpmNjQsIExkKTsKKyAgaWYgKE9wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyKQorICAgIEZQID0gREFHLmdldE5vZGUoSVNEOjpGUF9ST1VORCwgZGwsIE1WVDo6ZjMyLCBGUCwgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKyAgcmV0dXJuIEZQOworfQorCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpMb3dlckZMVF9ST1VORFNfKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgLyoKKyAgIFRoZSByb3VuZGluZyBtb2RlIGlzIGluIGJpdHMgMzA6MzEgb2YgRlBTUiwgYW5kIGhhcyB0aGUgZm9sbG93aW5nCisgICBzZXR0aW5nczoKKyAgICAgMDAgUm91bmQgdG8gbmVhcmVzdAorICAgICAwMSBSb3VuZCB0byAwCisgICAgIDEwIFJvdW5kIHRvICtpbmYKKyAgICAgMTEgUm91bmQgdG8gLWluZgorCisgIEZMVF9ST1VORFMsIG9uIHRoZSBvdGhlciBoYW5kLCBleHBlY3RzIHRoZSBmb2xsb3dpbmc6CisgICAgLTEgVW5kZWZpbmVkCisgICAgIDAgUm91bmQgdG8gMAorICAgICAxIFJvdW5kIHRvIG5lYXJlc3QKKyAgICAgMiBSb3VuZCB0byAraW5mCisgICAgIDMgUm91bmQgdG8gLWluZgorCisgIFRvIHBlcmZvcm0gdGhlIGNvbnZlcnNpb24sIHdlIGRvOgorICAgICgoRlBTQ1IgJiAweDMpIF4gKCh+RlBTQ1IgJiAweDMpID4+IDEpKQorICAqLworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBFVlQgUHRyVlQgPSBEQUcuZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkuZ2V0UG9pbnRlclR5KCk7CisgIHN0ZDo6dmVjdG9yPEVWVD4gTm9kZVR5czsKKyAgU0RWYWx1ZSBNRkZTcmVnLCBJbkZsYWc7CisKKyAgLy8gU2F2ZSBGUCBDb250cm9sIFdvcmQgdG8gcmVnaXN0ZXIKKyAgTm9kZVR5cy5wdXNoX2JhY2soTVZUOjpmNjQpOyAgICAvLyByZXR1cm4gcmVnaXN0ZXIKKyAgTm9kZVR5cy5wdXNoX2JhY2soTVZUOjpGbGFnKTsgICAvLyB1bnVzZWQgaW4gdGhpcyBjb250ZXh0CisgIFNEVmFsdWUgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShQUENJU0Q6Ok1GRlMsIGRsLCBOb2RlVHlzLCAmSW5GbGFnLCAwKTsKKworICAvLyBTYXZlIEZQIHJlZ2lzdGVyIHRvIHN0YWNrIHNsb3QKKyAgaW50IFNTRkkgPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlU3RhY2tPYmplY3QoOCwgOCwgZmFsc2UpOworICBTRFZhbHVlIFN0YWNrU2xvdCA9IERBRy5nZXRGcmFtZUluZGV4KFNTRkksIFB0clZUKTsKKyAgU0RWYWx1ZSBTdG9yZSA9IERBRy5nZXRTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFja1Nsb3QsIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgLy8gTG9hZCBGUCBDb250cm9sIFdvcmQgZnJvbSBsb3cgMzIgYml0cyBvZiBzdGFjayBzbG90LgorICBTRFZhbHVlIEZvdXIgPSBEQUcuZ2V0Q29uc3RhbnQoNCwgUHRyVlQpOworICBTRFZhbHVlIEFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFB0clZULCBTdGFja1Nsb3QsIEZvdXIpOworICBTRFZhbHVlIENXRCA9IERBRy5nZXRMb2FkKE1WVDo6aTMyLCBkbCwgU3RvcmUsIEFkZHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKworICAvLyBUcmFuc2Zvcm0gYXMgbmVjZXNzYXJ5CisgIFNEVmFsdWUgQ1dEMSA9CisgICAgREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICBDV0QsIERBRy5nZXRDb25zdGFudCgzLCBNVlQ6OmkzMikpOworICBTRFZhbHVlIENXRDIgPQorICAgIERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENXRCwgREFHLmdldENvbnN0YW50KDMsIE1WVDo6aTMyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDMsIE1WVDo6aTMyKSksCisgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTMyKSk7CisKKyAgU0RWYWx1ZSBSZXRWYWwgPQorICAgIERBRy5nZXROb2RlKElTRDo6WE9SLCBkbCwgTVZUOjppMzIsIENXRDEsIENXRDIpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZSgoVlQuZ2V0U2l6ZUluQml0cygpIDwgMTYgPworICAgICAgICAgICAgICAgICAgICAgIElTRDo6VFJVTkNBVEUgOiBJU0Q6OlpFUk9fRVhURU5EKSwgZGwsIFZULCBSZXRWYWwpOworfQorCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpMb3dlclNITF9QQVJUUyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgQml0V2lkdGggPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgYXNzZXJ0KE9wLmdldE51bU9wZXJhbmRzKCkgPT0gMyAmJgorICAgICAgICAgVlQgPT0gT3AuZ2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgIlVuZXhwZWN0ZWQgU0hMISIpOworCisgIC8vIEV4cGFuZCBpbnRvIGEgYnVuY2ggb2YgbG9naWNhbCBvcHMuICBOb3RlIHRoYXQgdGhlc2Ugb3BzCisgIC8vIGRlcGVuZCBvbiB0aGUgUFBDIGJlaGF2aW9yIGZvciBvdmVyc2l6ZWQgc2hpZnQgYW1vdW50cy4KKyAgU0RWYWx1ZSBMbyA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgSGkgPSBPcC5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIEFtdCA9IE9wLmdldE9wZXJhbmQoMik7CisgIEVWVCBBbXRWVCA9IEFtdC5nZXRWYWx1ZVR5cGUoKTsKKworICBTRFZhbHVlIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIEFtdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQml0V2lkdGgsIEFtdFZUKSwgQW10KTsKKyAgU0RWYWx1ZSBUbXAyID0gREFHLmdldE5vZGUoUFBDSVNEOjpTSEwsIGRsLCBWVCwgSGksIEFtdCk7CisgIFNEVmFsdWUgVG1wMyA9IERBRy5nZXROb2RlKFBQQ0lTRDo6U1JMLCBkbCwgVlQsIExvLCBUbXAxKTsKKyAgU0RWYWx1ZSBUbXA0ID0gREFHLmdldE5vZGUoSVNEOjpPUiAsIGRsLCBWVCwgVG1wMiwgVG1wMyk7CisgIFNEVmFsdWUgVG1wNSA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgQW10VlQsIEFtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KC1CaXRXaWR0aCwgQW10VlQpKTsKKyAgU0RWYWx1ZSBUbXA2ID0gREFHLmdldE5vZGUoUFBDSVNEOjpTSEwsIGRsLCBWVCwgTG8sIFRtcDUpOworICBTRFZhbHVlIE91dEhpID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFZULCBUbXA0LCBUbXA2KTsKKyAgU0RWYWx1ZSBPdXRMbyA9IERBRy5nZXROb2RlKFBQQ0lTRDo6U0hMLCBkbCwgVlQsIExvLCBBbXQpOworICBTRFZhbHVlIE91dE9wc1tdID0geyBPdXRMbywgT3V0SGkgfTsKKyAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPdXRPcHMsIDIsIGRsKTsKK30KKworU0RWYWx1ZSBQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJTUkxfUEFSVFMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgQml0V2lkdGggPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgIGFzc2VydChPcC5nZXROdW1PcGVyYW5kcygpID09IDMgJiYKKyAgICAgICAgIFZUID09IE9wLmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkgJiYKKyAgICAgICAgICJVbmV4cGVjdGVkIFNSTCEiKTsKKworICAvLyBFeHBhbmQgaW50byBhIGJ1bmNoIG9mIGxvZ2ljYWwgb3BzLiAgTm90ZSB0aGF0IHRoZXNlIG9wcworICAvLyBkZXBlbmQgb24gdGhlIFBQQyBiZWhhdmlvciBmb3Igb3ZlcnNpemVkIHNoaWZ0IGFtb3VudHMuCisgIFNEVmFsdWUgTG8gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIEhpID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBBbXQgPSBPcC5nZXRPcGVyYW5kKDIpOworICBFVlQgQW10VlQgPSBBbXQuZ2V0VmFsdWVUeXBlKCk7CisKKyAgU0RWYWx1ZSBUbXAxID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBBbXRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEJpdFdpZHRoLCBBbXRWVCksIEFtdCk7CisgIFNEVmFsdWUgVG1wMiA9IERBRy5nZXROb2RlKFBQQ0lTRDo6U1JMLCBkbCwgVlQsIExvLCBBbXQpOworICBTRFZhbHVlIFRtcDMgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OlNITCwgZGwsIFZULCBIaSwgVG1wMSk7CisgIFNEVmFsdWUgVG1wNCA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBWVCwgVG1wMiwgVG1wMyk7CisgIFNEVmFsdWUgVG1wNSA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgQW10VlQsIEFtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KC1CaXRXaWR0aCwgQW10VlQpKTsKKyAgU0RWYWx1ZSBUbXA2ID0gREFHLmdldE5vZGUoUFBDSVNEOjpTUkwsIGRsLCBWVCwgSGksIFRtcDUpOworICBTRFZhbHVlIE91dExvID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFZULCBUbXA0LCBUbXA2KTsKKyAgU0RWYWx1ZSBPdXRIaSA9IERBRy5nZXROb2RlKFBQQ0lTRDo6U1JMLCBkbCwgVlQsIEhpLCBBbXQpOworICBTRFZhbHVlIE91dE9wc1tdID0geyBPdXRMbywgT3V0SGkgfTsKKyAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPdXRPcHMsIDIsIGRsKTsKK30KKworU0RWYWx1ZSBQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJTUkFfUEFSVFMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgdW5zaWduZWQgQml0V2lkdGggPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgIGFzc2VydChPcC5nZXROdW1PcGVyYW5kcygpID09IDMgJiYKKyAgICAgICAgIFZUID09IE9wLmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkgJiYKKyAgICAgICAgICJVbmV4cGVjdGVkIFNSQSEiKTsKKworICAvLyBFeHBhbmQgaW50byBhIGJ1bmNoIG9mIGxvZ2ljYWwgb3BzLCBmb2xsb3dlZCBieSBhIHNlbGVjdF9jYy4KKyAgU0RWYWx1ZSBMbyA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgSGkgPSBPcC5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIEFtdCA9IE9wLmdldE9wZXJhbmQoMik7CisgIEVWVCBBbXRWVCA9IEFtdC5nZXRWYWx1ZVR5cGUoKTsKKworICBTRFZhbHVlIFRtcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIEFtdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQml0V2lkdGgsIEFtdFZUKSwgQW10KTsKKyAgU0RWYWx1ZSBUbXAyID0gREFHLmdldE5vZGUoUFBDSVNEOjpTUkwsIGRsLCBWVCwgTG8sIEFtdCk7CisgIFNEVmFsdWUgVG1wMyA9IERBRy5nZXROb2RlKFBQQ0lTRDo6U0hMLCBkbCwgVlQsIEhpLCBUbXAxKTsKKyAgU0RWYWx1ZSBUbXA0ID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFZULCBUbXAyLCBUbXAzKTsKKyAgU0RWYWx1ZSBUbXA1ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBBbXRWVCwgQW10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoLUJpdFdpZHRoLCBBbXRWVCkpOworICBTRFZhbHVlIFRtcDYgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OlNSQSwgZGwsIFZULCBIaSwgVG1wNSk7CisgIFNEVmFsdWUgT3V0SGkgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OlNSQSwgZGwsIFZULCBIaSwgQW10KTsKKyAgU0RWYWx1ZSBPdXRMbyA9IERBRy5nZXRTZWxlY3RDQyhkbCwgVG1wNSwgREFHLmdldENvbnN0YW50KDAsIEFtdFZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbXA0LCBUbXA2LCBJU0Q6OlNFVExFKTsKKyAgU0RWYWx1ZSBPdXRPcHNbXSA9IHsgT3V0TG8sIE91dEhpIH07CisgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMoT3V0T3BzLCAyLCBkbCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBWZWN0b3IgcmVsYXRlZCBsb3dlcmluZy4KKy8vCisKKy8vLyBCdWlsZFNwbGF0SSAtIEJ1aWxkIGEgY2Fub25pY2FsIHNwbGF0aSBvZiBWYWwgd2l0aCBhbiBlbGVtZW50IHNpemUgb2YKKy8vLyBTcGxhdFNpemUuICBDYXN0IHRoZSByZXN1bHQgdG8gVlQuCitzdGF0aWMgU0RWYWx1ZSBCdWlsZFNwbGF0SShpbnQgVmFsLCB1bnNpZ25lZCBTcGxhdFNpemUsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsKSB7CisgIGFzc2VydChWYWwgPj0gLTE2ICYmIFZhbCA8PSAxNSAmJiAidnNwbHRpIGlzIG91dCBvZiByYW5nZSEiKTsKKworICBzdGF0aWMgY29uc3QgRVZUIFZUeXNbXSA9IHsgLy8gY2Fub25pY2FsIFZUIHRvIHVzZSBmb3IgZWFjaCBzaXplLgorICAgIE1WVDo6djE2aTgsIE1WVDo6djhpMTYsIE1WVDo6T3RoZXIsIE1WVDo6djRpMzIKKyAgfTsKKworICBFVlQgUmVxVlQgPSBWVCAhPSBNVlQ6Ok90aGVyID8gVlQgOiBWVHlzW1NwbGF0U2l6ZS0xXTsKKworICAvLyBGb3JjZSB2c3BsdGlzW2h3XSAtMSB0byB2c3BsdGlzYiAtMSB0byBjYW5vbmljYWxpemUuCisgIGlmIChWYWwgPT0gLTEpCisgICAgU3BsYXRTaXplID0gMTsKKworICBFVlQgQ2Fub25pY2FsVlQgPSBWVHlzW1NwbGF0U2l6ZS0xXTsKKworICAvLyBCdWlsZCBhIGNhbm9uaWNhbCBzcGxhdCBmb3IgdGhpcyB2YWx1ZS4KKyAgU0RWYWx1ZSBFbHQgPSBEQUcuZ2V0Q29uc3RhbnQoVmFsLCBNVlQ6OmkzMik7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wczsKKyAgT3BzLmFzc2lnbihDYW5vbmljYWxWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpLCBFbHQpOworICBTRFZhbHVlIFJlcyA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgQ2Fub25pY2FsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBSZXFWVCwgUmVzKTsKK30KKworLy8vIEJ1aWxkSW50cmluc2ljT3AgLSBSZXR1cm4gYSBiaW5hcnkgb3BlcmF0b3IgaW50cmluc2ljIG5vZGUgd2l0aCB0aGUKKy8vLyBzcGVjaWZpZWQgaW50cmluc2ljIElELgorc3RhdGljIFNEVmFsdWUgQnVpbGRJbnRyaW5zaWNPcCh1bnNpZ25lZCBJSUQsIFNEVmFsdWUgTEhTLCBTRFZhbHVlIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgRGVzdFZUID0gTVZUOjpPdGhlcikgeworICBpZiAoRGVzdFZUID09IE1WVDo6T3RoZXIpIERlc3RWVCA9IExIUy5nZXRWYWx1ZVR5cGUoKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBkbCwgRGVzdFZULAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KElJRCwgTVZUOjppMzIpLCBMSFMsIFJIUyk7Cit9CisKKy8vLyBCdWlsZEludHJpbnNpY09wIC0gUmV0dXJuIGEgdGVybmFyeSBvcGVyYXRvciBpbnRyaW5zaWMgbm9kZSB3aXRoIHRoZQorLy8vIHNwZWNpZmllZCBpbnRyaW5zaWMgSUQuCitzdGF0aWMgU0RWYWx1ZSBCdWlsZEludHJpbnNpY09wKHVuc2lnbmVkIElJRCwgU0RWYWx1ZSBPcDAsIFNEVmFsdWUgT3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMiwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBFVlQgRGVzdFZUID0gTVZUOjpPdGhlcikgeworICBpZiAoRGVzdFZUID09IE1WVDo6T3RoZXIpIERlc3RWVCA9IE9wMC5nZXRWYWx1ZVR5cGUoKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBkbCwgRGVzdFZULAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KElJRCwgTVZUOjppMzIpLCBPcDAsIE9wMSwgT3AyKTsKK30KKworCisvLy8gQnVpbGRWU0xET0kgLSBSZXR1cm4gYSBWRUNUT1JfU0hVRkZMRSB0aGF0IGlzIGEgdnNsZG9pIG9mIHRoZSBzcGVjaWZpZWQKKy8vLyBhbW91bnQuICBUaGUgcmVzdWx0IGhhcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUuCitzdGF0aWMgU0RWYWx1ZSBCdWlsZFZTTERPSShTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsIHVuc2lnbmVkIEFtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZULCBTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwpIHsKKyAgLy8gRm9yY2UgTEhTL1JIUyB0byBiZSB0aGUgcmlnaHQgdHlwZS4KKyAgTEhTID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6djE2aTgsIExIUyk7CisgIFJIUyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYxNmk4LCBSSFMpOworCisgIGludCBPcHNbMTZdOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDE2OyArK2kpCisgICAgT3BzW2ldID0gaSArIEFtdDsKKyAgU0RWYWx1ZSBUID0gREFHLmdldFZlY3RvclNodWZmbGUoTVZUOjp2MTZpOCwgZGwsIExIUywgUkhTLCBPcHMpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULCBUKTsKK30KKworLy8gSWYgdGhpcyBpcyBhIGNhc2Ugd2UgY2FuJ3QgaGFuZGxlLCByZXR1cm4gbnVsbCBhbmQgbGV0IHRoZSBkZWZhdWx0CisvLyBleHBhbnNpb24gY29kZSB0YWtlIGNhcmUgb2YgaXQuICBJZiB3ZSBDQU4gc2VsZWN0IHRoaXMgY2FzZSwgYW5kIGlmIGl0CisvLyBzZWxlY3RzIHRvIGEgc2luZ2xlIGluc3RydWN0aW9uLCByZXR1cm4gT3AuICBPdGhlcndpc2UsIGlmIHdlIGNhbiBjb2RlZ2VuCisvLyB0aGlzIGNhc2UgbW9yZSBlZmZpY2llbnRseSB0aGFuIGEgY29uc3RhbnQgcG9vbCBsb2FkLCBsb3dlciBpdCB0byB0aGUKKy8vIHNlcXVlbmNlIG9mIG9wcyB0aGF0IHNob3VsZCBiZSB1c2VkLgorU0RWYWx1ZSBQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJCVUlMRF9WRUNUT1IoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgQnVpbGRWZWN0b3JTRE5vZGUgKkJWTiA9IGR5bl9jYXN0PEJ1aWxkVmVjdG9yU0ROb2RlPihPcC5nZXROb2RlKCkpOworICBhc3NlcnQoQlZOICE9IDAgJiYgIkV4cGVjdGVkIGEgQnVpbGRWZWN0b3JTRE5vZGUgaW4gTG93ZXJCVUlMRF9WRUNUT1IiKTsKKworICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgc3BsYXQgb2YgYSBjb25zdGFudCB2YWx1ZS4KKyAgQVBJbnQgQVBTcGxhdEJpdHMsIEFQU3BsYXRVbmRlZjsKKyAgdW5zaWduZWQgU3BsYXRCaXRTaXplOworICBib29sIEhhc0FueVVuZGVmczsKKyAgaWYgKCEgQlZOLT5pc0NvbnN0YW50U3BsYXQoQVBTcGxhdEJpdHMsIEFQU3BsYXRVbmRlZiwgU3BsYXRCaXRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNBbnlVbmRlZnMsIDAsIHRydWUpIHx8IFNwbGF0Qml0U2l6ZSA+IDMyKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgdW5zaWduZWQgU3BsYXRCaXRzID0gQVBTcGxhdEJpdHMuZ2V0WkV4dFZhbHVlKCk7CisgIHVuc2lnbmVkIFNwbGF0VW5kZWYgPSBBUFNwbGF0VW5kZWYuZ2V0WkV4dFZhbHVlKCk7CisgIHVuc2lnbmVkIFNwbGF0U2l6ZSA9IFNwbGF0Qml0U2l6ZSAvIDg7CisKKyAgLy8gRmlyc3QsIGhhbmRsZSBzaW5nbGUgaW5zdHJ1Y3Rpb24gY2FzZXMuCisKKyAgLy8gQWxsIHplcm9zPworICBpZiAoU3BsYXRCaXRzID09IDApIHsKKyAgICAvLyBDYW5vbmljYWxpemUgYWxsIHplcm8gdmVjdG9ycyB0byBiZSB2NGkzMi4KKyAgICBpZiAoT3AuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjp2NGkzMiB8fCBIYXNBbnlVbmRlZnMpIHsKKyAgICAgIFNEVmFsdWUgWiA9IERBRy5nZXRDb25zdGFudCgwLCBNVlQ6OmkzMik7CisgICAgICBaID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLCBaLCBaLCBaLCBaKTsKKyAgICAgIE9wID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLCBaKTsKKyAgICB9CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgLy8gSWYgdGhlIHNpZ24gZXh0ZW5kZWQgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFstMTYsMTVdLCB1c2UgVlNQTFRJW2Jod10uCisgIGludDMyX3QgU2V4dFZhbD0gKGludDMyX3QoU3BsYXRCaXRzIDw8ICgzMi1TcGxhdEJpdFNpemUpKSA+PgorICAgICAgICAgICAgICAgICAgICAoMzItU3BsYXRCaXRTaXplKSk7CisgIGlmIChTZXh0VmFsID49IC0xNiAmJiBTZXh0VmFsIDw9IDE1KQorICAgIHJldHVybiBCdWlsZFNwbGF0SShTZXh0VmFsLCBTcGxhdFNpemUsIE9wLmdldFZhbHVlVHlwZSgpLCBEQUcsIGRsKTsKKworCisgIC8vIFR3byBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMuCisKKyAgLy8gSWYgdGhpcyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWy0zMiwzMF0gYW5kIGlzIGV2ZW4sIHVzZToKKyAgLy8gICAgdG1wID0gVlNQTFRJW2Jod10sIHJlc3VsdCA9IGFkZCB0bXAsIHRtcAorICBpZiAoU2V4dFZhbCA+PSAtMzIgJiYgU2V4dFZhbCA8PSAzMCAmJiAoU2V4dFZhbCAmIDEpID09IDApIHsKKyAgICBTRFZhbHVlIFJlcyA9IEJ1aWxkU3BsYXRJKFNleHRWYWwgPj4gMSwgU3BsYXRTaXplLCBNVlQ6Ok90aGVyLCBEQUcsIGRsKTsKKyAgICBSZXMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFJlcy5nZXRWYWx1ZVR5cGUoKSwgUmVzLCBSZXMpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgT3AuZ2V0VmFsdWVUeXBlKCksIFJlcyk7CisgIH0KKworICAvLyBJZiB0aGlzIGlzIDB4ODAwMF8wMDAwIHggNCwgdHVybiBpbnRvIHZzcGx0aXN3ICsgdnNsdy4gIElmIGl0IGlzCisgIC8vIDB4N0ZGRl9GRkZGIHggNCwgdHVybiBpdCBpbnRvIG5vdCgweDgwMDBfMDAwMCkuICBUaGlzIGlzIGltcG9ydGFudAorICAvLyBmb3IgZm5lZy9mYWJzLgorICBpZiAoU3BsYXRTaXplID09IDQgJiYgU3BsYXRCaXRzID09ICgweDdGRkZGRkZGJn5TcGxhdFVuZGVmKSkgeworICAgIC8vIE1ha2UgLTEgYW5kIHZzcGx0aXN3IC0xOgorICAgIFNEVmFsdWUgT25lc1YgPSBCdWlsZFNwbGF0SSgtMSwgNCwgTVZUOjp2NGkzMiwgREFHLCBkbCk7CisKKyAgICAvLyBNYWtlIHRoZSBWU0xXIGludHJpbnNpYywgY29tcHV0aW5nIDB4ODAwMF8wMDAwLgorICAgIFNEVmFsdWUgUmVzID0gQnVpbGRJbnRyaW5zaWNPcChJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzbHcsIE9uZXNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmVzViwgREFHLCBkbCk7CisKKyAgICAvLyB4b3IgYnkgT25lc1YgdG8gaW52ZXJ0IGl0LgorICAgIFJlcyA9IERBRy5nZXROb2RlKElTRDo6WE9SLCBkbCwgTVZUOjp2NGkzMiwgUmVzLCBPbmVzVik7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwgUmVzKTsKKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgd2lkZSB2YXJpZXR5IG9mIHZzcGx0aSosIGJpbm9wIHNlbGYgY2FzZXMuCisgIHN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBTcGxhdENzdHNbXSA9IHsKKyAgICAtMSwgMSwgLTIsIDIsIC0zLCAzLCAtNCwgNCwgLTUsIDUsIC02LCA2LCAtNywgNywKKyAgICAtOCwgOCwgLTksIDksIC0xMCwgMTAsIC0xMSwgMTEsIC0xMiwgMTIsIC0xMywgMTMsIDE0LCAtMTQsIDE1LCAtMTUsIC0xNgorICB9OworCisgIGZvciAodW5zaWduZWQgaWR4ID0gMDsgaWR4IDwgYXJyYXlfbGVuZ3Rob2YoU3BsYXRDc3RzKTsgKytpZHgpIHsKKyAgICAvLyBJbmRpcmVjdCB0aHJvdWdoIHRoZSBTcGxhdENzdHMgYXJyYXkgc28gdGhhdCB3ZSBmYXZvciAndnNwbHRpIC0xJyBmb3IKKyAgICAvLyBjYXNlcyB3aGljaCBhcmUgYW1iaWd1b3VzIChlLmcuIGZvcm1hdGlvbiBvZiAweDgwMDBfMDAwMCkuICAndnNwbHRpIC0xJworICAgIGludCBpID0gU3BsYXRDc3RzW2lkeF07CisKKyAgICAvLyBGaWd1cmUgb3V0IHdoYXQgc2hpZnQgYW1vdW50IHdpbGwgYmUgdXNlZCBieSBhbHRpdmVjIGlmIHNoaWZ0ZWQgYnkgaSBpbgorICAgIC8vIHRoaXMgc3BsYXQgc2l6ZS4KKyAgICB1bnNpZ25lZCBUeXBlU2hpZnRBbXQgPSBpICYgKFNwbGF0Qml0U2l6ZS0xKTsKKworICAgIC8vIHZzcGx0aSArIHNobCBzZWxmLgorICAgIGlmIChTZXh0VmFsID09IChpIDw8IChpbnQpVHlwZVNoaWZ0QW10KSkgeworICAgICAgU0RWYWx1ZSBSZXMgPSBCdWlsZFNwbGF0SShpLCBTcGxhdFNpemUsIE1WVDo6T3RoZXIsIERBRywgZGwpOworICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIElJRHNbXSA9IHsgLy8gSW50cmluc2ljIHRvIHVzZSBmb3IgZWFjaCBzaXplLgorICAgICAgICBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzbGIsIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNsaCwgMCwKKyAgICAgICAgSW50cmluc2ljOjpwcGNfYWx0aXZlY192c2x3CisgICAgICB9OworICAgICAgUmVzID0gQnVpbGRJbnRyaW5zaWNPcChJSURzW1NwbGF0U2l6ZS0xXSwgUmVzLCBSZXMsIERBRywgZGwpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwgUmVzKTsKKyAgICB9CisKKyAgICAvLyB2c3BsdGkgKyBzcmwgc2VsZi4KKyAgICBpZiAoU2V4dFZhbCA9PSAoaW50KSgodW5zaWduZWQpaSA+PiBUeXBlU2hpZnRBbXQpKSB7CisgICAgICBTRFZhbHVlIFJlcyA9IEJ1aWxkU3BsYXRJKGksIFNwbGF0U2l6ZSwgTVZUOjpPdGhlciwgREFHLCBkbCk7CisgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSUlEc1tdID0geyAvLyBJbnRyaW5zaWMgdG8gdXNlIGZvciBlYWNoIHNpemUuCisgICAgICAgIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNyYiwgSW50cmluc2ljOjpwcGNfYWx0aXZlY192c3JoLCAwLAorICAgICAgICBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzcncKKyAgICAgIH07CisgICAgICBSZXMgPSBCdWlsZEludHJpbnNpY09wKElJRHNbU3BsYXRTaXplLTFdLCBSZXMsIFJlcywgREFHLCBkbCk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLCBSZXMpOworICAgIH0KKworICAgIC8vIHZzcGx0aSArIHNyYSBzZWxmLgorICAgIGlmIChTZXh0VmFsID09IChpbnQpKCh1bnNpZ25lZClpID4+IFR5cGVTaGlmdEFtdCkpIHsKKyAgICAgIFNEVmFsdWUgUmVzID0gQnVpbGRTcGxhdEkoaSwgU3BsYXRTaXplLCBNVlQ6Ok90aGVyLCBEQUcsIGRsKTsKKyAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBJSURzW10gPSB7IC8vIEludHJpbnNpYyB0byB1c2UgZm9yIGVhY2ggc2l6ZS4KKyAgICAgICAgSW50cmluc2ljOjpwcGNfYWx0aXZlY192c3JhYiwgSW50cmluc2ljOjpwcGNfYWx0aXZlY192c3JhaCwgMCwKKyAgICAgICAgSW50cmluc2ljOjpwcGNfYWx0aXZlY192c3JhdworICAgICAgfTsKKyAgICAgIFJlcyA9IEJ1aWxkSW50cmluc2ljT3AoSUlEc1tTcGxhdFNpemUtMV0sIFJlcywgUmVzLCBEQUcsIGRsKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgT3AuZ2V0VmFsdWVUeXBlKCksIFJlcyk7CisgICAgfQorCisgICAgLy8gdnNwbHRpICsgcm9sIHNlbGYuCisgICAgaWYgKFNleHRWYWwgPT0gKGludCkoKCh1bnNpZ25lZClpIDw8IFR5cGVTaGlmdEFtdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpaSA+PiAoU3BsYXRCaXRTaXplLVR5cGVTaGlmdEFtdCkpKSkgeworICAgICAgU0RWYWx1ZSBSZXMgPSBCdWlsZFNwbGF0SShpLCBTcGxhdFNpemUsIE1WVDo6T3RoZXIsIERBRywgZGwpOworICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIElJRHNbXSA9IHsgLy8gSW50cmluc2ljIHRvIHVzZSBmb3IgZWFjaCBzaXplLgorICAgICAgICBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZybGIsIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJsaCwgMCwKKyAgICAgICAgSW50cmluc2ljOjpwcGNfYWx0aXZlY192cmx3CisgICAgICB9OworICAgICAgUmVzID0gQnVpbGRJbnRyaW5zaWNPcChJSURzW1NwbGF0U2l6ZS0xXSwgUmVzLCBSZXMsIERBRywgZGwpOworICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwgUmVzKTsKKyAgICB9CisKKyAgICAvLyB0ID0gdnNwbHRpIGMsIHJlc3VsdCA9IHZzbGRvaSB0LCB0LCAxCisgICAgaWYgKFNleHRWYWwgPT0gKChpIDw8IDgpIHwgKGkgPCAwID8gMHhGRiA6IDApKSkgeworICAgICAgU0RWYWx1ZSBUID0gQnVpbGRTcGxhdEkoaSwgU3BsYXRTaXplLCBNVlQ6OnYxNmk4LCBEQUcsIGRsKTsKKyAgICAgIHJldHVybiBCdWlsZFZTTERPSShULCBULCAxLCBPcC5nZXRWYWx1ZVR5cGUoKSwgREFHLCBkbCk7CisgICAgfQorICAgIC8vIHQgPSB2c3BsdGkgYywgcmVzdWx0ID0gdnNsZG9pIHQsIHQsIDIKKyAgICBpZiAoU2V4dFZhbCA9PSAoKGkgPDwgMTYpIHwgKGkgPCAwID8gMHhGRkZGIDogMCkpKSB7CisgICAgICBTRFZhbHVlIFQgPSBCdWlsZFNwbGF0SShpLCBTcGxhdFNpemUsIE1WVDo6djE2aTgsIERBRywgZGwpOworICAgICAgcmV0dXJuIEJ1aWxkVlNMRE9JKFQsIFQsIDIsIE9wLmdldFZhbHVlVHlwZSgpLCBEQUcsIGRsKTsKKyAgICB9CisgICAgLy8gdCA9IHZzcGx0aSBjLCByZXN1bHQgPSB2c2xkb2kgdCwgdCwgMworICAgIGlmIChTZXh0VmFsID09ICgoaSA8PCAyNCkgfCAoaSA8IDAgPyAweEZGRkZGRiA6IDApKSkgeworICAgICAgU0RWYWx1ZSBUID0gQnVpbGRTcGxhdEkoaSwgU3BsYXRTaXplLCBNVlQ6OnYxNmk4LCBEQUcsIGRsKTsKKyAgICAgIHJldHVybiBCdWlsZFZTTERPSShULCBULCAzLCBPcC5nZXRWYWx1ZVR5cGUoKSwgREFHLCBkbCk7CisgICAgfQorICB9CisKKyAgLy8gVGhyZWUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzLgorCisgIC8vIE9kZCwgaW4gcmFuZ2UgWzE3LDMxXTogICh2c3BsdGkgQyktKHZzcGx0aSAtMTYpLgorICBpZiAoU2V4dFZhbCA+PSAwICYmIFNleHRWYWwgPD0gMzEpIHsKKyAgICBTRFZhbHVlIExIUyA9IEJ1aWxkU3BsYXRJKFNleHRWYWwtMTYsIFNwbGF0U2l6ZSwgTVZUOjpPdGhlciwgREFHLCBkbCk7CisgICAgU0RWYWx1ZSBSSFMgPSBCdWlsZFNwbGF0SSgtMTYsIFNwbGF0U2l6ZSwgTVZUOjpPdGhlciwgREFHLCBkbCk7CisgICAgTEhTID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBMSFMuZ2V0VmFsdWVUeXBlKCksIExIUywgUkhTKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLCBMSFMpOworICB9CisgIC8vIE9kZCwgaW4gcmFuZ2UgWy0zMSwtMTddOiAgKHZzcGx0aSBDKSsodnNwbHRpIC0xNikuCisgIGlmIChTZXh0VmFsID49IC0zMSAmJiBTZXh0VmFsIDw9IDApIHsKKyAgICBTRFZhbHVlIExIUyA9IEJ1aWxkU3BsYXRJKFNleHRWYWwrMTYsIFNwbGF0U2l6ZSwgTVZUOjpPdGhlciwgREFHLCBkbCk7CisgICAgU0RWYWx1ZSBSSFMgPSBCdWlsZFNwbGF0SSgtMTYsIFNwbGF0U2l6ZSwgTVZUOjpPdGhlciwgREFHLCBkbCk7CisgICAgTEhTID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBMSFMuZ2V0VmFsdWVUeXBlKCksIExIUywgUkhTKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLCBMSFMpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIEdlbmVyYXRlUGVyZmVjdFNodWZmbGUgLSBHaXZlbiBhbiBlbnRyeSBpbiB0aGUgcGVyZmVjdC1zaHVmZmxlIHRhYmxlLCBlbWl0CisvLy8gdGhlIHNwZWNpZmllZCBvcGVyYXRpb25zIHRvIGJ1aWxkIHRoZSBzaHVmZmxlLgorc3RhdGljIFNEVmFsdWUgR2VuZXJhdGVQZXJmZWN0U2h1ZmZsZSh1bnNpZ25lZCBQRkVudHJ5LCBTRFZhbHVlIExIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBSSFMsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCkgeworICB1bnNpZ25lZCBPcE51bSA9IChQRkVudHJ5ID4+IDI2KSAmIDB4MEY7CisgIHVuc2lnbmVkIExIU0lEID0gKFBGRW50cnkgPj4gMTMpICYgKCgxIDw8IDEzKS0xKTsKKyAgdW5zaWduZWQgUkhTSUQgPSAoUEZFbnRyeSA+PiAgMCkgJiAoKDEgPDwgMTMpLTEpOworCisgIGVudW0geworICAgIE9QX0NPUFkgPSAwLCAgLy8gQ29weSwgdXNlZCBmb3IgdGhpbmdzIGxpa2UgPHUsdSx1LDM+IHRvIHNheSBpdCBpcyA8MCwxLDIsMz4KKyAgICBPUF9WTVJHSFcsCisgICAgT1BfVk1SR0xXLAorICAgIE9QX1ZTUExUSVNXMCwKKyAgICBPUF9WU1BMVElTVzEsCisgICAgT1BfVlNQTFRJU1cyLAorICAgIE9QX1ZTUExUSVNXMywKKyAgICBPUF9WU0xET0k0LAorICAgIE9QX1ZTTERPSTgsCisgICAgT1BfVlNMRE9JMTIKKyAgfTsKKworICBpZiAoT3BOdW0gPT0gT1BfQ09QWSkgeworICAgIGlmIChMSFNJRCA9PSAoMSo5KzIpKjkrMykgcmV0dXJuIExIUzsKKyAgICBhc3NlcnQoTEhTSUQgPT0gKCg0KjkrNSkqOSs2KSo5KzcgJiYgIklsbGVnYWwgT1BfQ09QWSEiKTsKKyAgICByZXR1cm4gUkhTOworICB9CisKKyAgU0RWYWx1ZSBPcExIUywgT3BSSFM7CisgIE9wTEhTID0gR2VuZXJhdGVQZXJmZWN0U2h1ZmZsZShQZXJmZWN0U2h1ZmZsZVRhYmxlW0xIU0lEXSwgTEhTLCBSSFMsIERBRywgZGwpOworICBPcFJIUyA9IEdlbmVyYXRlUGVyZmVjdFNodWZmbGUoUGVyZmVjdFNodWZmbGVUYWJsZVtSSFNJRF0sIExIUywgUkhTLCBEQUcsIGRsKTsKKworICBpbnQgU2h1ZklkeHNbMTZdOworICBzd2l0Y2ggKE9wTnVtKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaTMyIHBlcm11dGUhIik7CisgIGNhc2UgT1BfVk1SR0hXOgorICAgIFNodWZJZHhzWyAwXSA9ICAwOyBTaHVmSWR4c1sgMV0gPSAgMTsgU2h1ZklkeHNbIDJdID0gIDI7IFNodWZJZHhzWyAzXSA9ICAzOworICAgIFNodWZJZHhzWyA0XSA9IDE2OyBTaHVmSWR4c1sgNV0gPSAxNzsgU2h1ZklkeHNbIDZdID0gMTg7IFNodWZJZHhzWyA3XSA9IDE5OworICAgIFNodWZJZHhzWyA4XSA9ICA0OyBTaHVmSWR4c1sgOV0gPSAgNTsgU2h1ZklkeHNbMTBdID0gIDY7IFNodWZJZHhzWzExXSA9ICA3OworICAgIFNodWZJZHhzWzEyXSA9IDIwOyBTaHVmSWR4c1sxM10gPSAyMTsgU2h1ZklkeHNbMTRdID0gMjI7IFNodWZJZHhzWzE1XSA9IDIzOworICAgIGJyZWFrOworICBjYXNlIE9QX1ZNUkdMVzoKKyAgICBTaHVmSWR4c1sgMF0gPSAgODsgU2h1ZklkeHNbIDFdID0gIDk7IFNodWZJZHhzWyAyXSA9IDEwOyBTaHVmSWR4c1sgM10gPSAxMTsKKyAgICBTaHVmSWR4c1sgNF0gPSAyNDsgU2h1ZklkeHNbIDVdID0gMjU7IFNodWZJZHhzWyA2XSA9IDI2OyBTaHVmSWR4c1sgN10gPSAyNzsKKyAgICBTaHVmSWR4c1sgOF0gPSAxMjsgU2h1ZklkeHNbIDldID0gMTM7IFNodWZJZHhzWzEwXSA9IDE0OyBTaHVmSWR4c1sxMV0gPSAxNTsKKyAgICBTaHVmSWR4c1sxMl0gPSAyODsgU2h1ZklkeHNbMTNdID0gMjk7IFNodWZJZHhzWzE0XSA9IDMwOyBTaHVmSWR4c1sxNV0gPSAzMTsKKyAgICBicmVhazsKKyAgY2FzZSBPUF9WU1BMVElTVzA6CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSAxNjsgKytpKQorICAgICAgU2h1ZklkeHNbaV0gPSAoaSYzKSswOworICAgIGJyZWFrOworICBjYXNlIE9QX1ZTUExUSVNXMToKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDE2OyArK2kpCisgICAgICBTaHVmSWR4c1tpXSA9IChpJjMpKzQ7CisgICAgYnJlYWs7CisgIGNhc2UgT1BfVlNQTFRJU1cyOgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gMTY7ICsraSkKKyAgICAgIFNodWZJZHhzW2ldID0gKGkmMykrODsKKyAgICBicmVhazsKKyAgY2FzZSBPUF9WU1BMVElTVzM6CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSAxNjsgKytpKQorICAgICAgU2h1ZklkeHNbaV0gPSAoaSYzKSsxMjsKKyAgICBicmVhazsKKyAgY2FzZSBPUF9WU0xET0k0OgorICAgIHJldHVybiBCdWlsZFZTTERPSShPcExIUywgT3BSSFMsIDQsIE9wTEhTLmdldFZhbHVlVHlwZSgpLCBEQUcsIGRsKTsKKyAgY2FzZSBPUF9WU0xET0k4OgorICAgIHJldHVybiBCdWlsZFZTTERPSShPcExIUywgT3BSSFMsIDgsIE9wTEhTLmdldFZhbHVlVHlwZSgpLCBEQUcsIGRsKTsKKyAgY2FzZSBPUF9WU0xET0kxMjoKKyAgICByZXR1cm4gQnVpbGRWU0xET0koT3BMSFMsIE9wUkhTLCAxMiwgT3BMSFMuZ2V0VmFsdWVUeXBlKCksIERBRywgZGwpOworICB9CisgIEVWVCBWVCA9IE9wTEhTLmdldFZhbHVlVHlwZSgpOworICBPcExIUyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYxNmk4LCBPcExIUyk7CisgIE9wUkhTID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6djE2aTgsIE9wUkhTKTsKKyAgU0RWYWx1ZSBUID0gREFHLmdldFZlY3RvclNodWZmbGUoTVZUOjp2MTZpOCwgZGwsIE9wTEhTLCBPcFJIUywgU2h1ZklkeHMpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULCBUKTsKK30KKworLy8vIExvd2VyVkVDVE9SX1NIVUZGTEUgLSBSZXR1cm4gdGhlIGNvZGUgd2UgbG93ZXIgZm9yIFZFQ1RPUl9TSFVGRkxFLiAgSWYgdGhpcworLy8vIGlzIGEgc2h1ZmZsZSB3ZSBjYW4gaGFuZGxlIGluIGEgc2luZ2xlIGluc3RydWN0aW9uLCByZXR1cm4gaXQuICBPdGhlcndpc2UsCisvLy8gcmV0dXJuIHRoZSBjb2RlIGl0IGNhbiBiZSBsb3dlcmVkIGludG8uICBXb3JzdCBjYXNlLCBpdCBjYW4gYWx3YXlzIGJlCisvLy8gbG93ZXJlZCBpbnRvIGEgdnBlcm0uCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpMb3dlclZFQ1RPUl9TSFVGRkxFKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBWMSA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgVjIgPSBPcC5nZXRPcGVyYW5kKDEpOworICBTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk9wID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihPcCk7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworCisgIC8vIENhc2VzIHRoYXQgYXJlIGhhbmRsZWQgYnkgaW5zdHJ1Y3Rpb25zIHRoYXQgdGFrZSBwZXJtdXRlIGltbWVkaWF0ZXMKKyAgLy8gKHN1Y2ggYXMgdnNwbHQqKSBzaG91bGQgYmUgbGVmdCBhcyBWRUNUT1JfU0hVRkZMRSBub2RlcyBzbyB0aGV5IGNhbiBiZQorICAvLyBzZWxlY3RlZCBieSB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuCisgIGlmIChWMi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKSB7CisgICAgaWYgKFBQQzo6aXNTcGxhdFNodWZmbGVNYXNrKFNWT3AsIDEpIHx8CisgICAgICAgIFBQQzo6aXNTcGxhdFNodWZmbGVNYXNrKFNWT3AsIDIpIHx8CisgICAgICAgIFBQQzo6aXNTcGxhdFNodWZmbGVNYXNrKFNWT3AsIDQpIHx8CisgICAgICAgIFBQQzo6aXNWUEtVV1VNU2h1ZmZsZU1hc2soU1ZPcCwgdHJ1ZSkgfHwKKyAgICAgICAgUFBDOjppc1ZQS1VIVU1TaHVmZmxlTWFzayhTVk9wLCB0cnVlKSB8fAorICAgICAgICBQUEM6OmlzVlNMRE9JU2h1ZmZsZU1hc2soU1ZPcCwgdHJ1ZSkgIT0gLTEgfHwKKyAgICAgICAgUFBDOjppc1ZNUkdMU2h1ZmZsZU1hc2soU1ZPcCwgMSwgdHJ1ZSkgfHwKKyAgICAgICAgUFBDOjppc1ZNUkdMU2h1ZmZsZU1hc2soU1ZPcCwgMiwgdHJ1ZSkgfHwKKyAgICAgICAgUFBDOjppc1ZNUkdMU2h1ZmZsZU1hc2soU1ZPcCwgNCwgdHJ1ZSkgfHwKKyAgICAgICAgUFBDOjppc1ZNUkdIU2h1ZmZsZU1hc2soU1ZPcCwgMSwgdHJ1ZSkgfHwKKyAgICAgICAgUFBDOjppc1ZNUkdIU2h1ZmZsZU1hc2soU1ZPcCwgMiwgdHJ1ZSkgfHwKKyAgICAgICAgUFBDOjppc1ZNUkdIU2h1ZmZsZU1hc2soU1ZPcCwgNCwgdHJ1ZSkpIHsKKyAgICAgIHJldHVybiBPcDsKKyAgICB9CisgIH0KKworICAvLyBBbHRpdmVjIGhhcyBhIHZhcmlldHkgb2YgInNodWZmbGUgaW1tZWRpYXRlcyIgdGhhdCB0YWtlIHR3byB2ZWN0b3IgaW5wdXRzCisgIC8vIGFuZCBwcm9kdWNlIGEgZml4ZWQgcGVybXV0YXRpb24uICBJZiBhbnkgb2YgdGhlc2UgbWF0Y2gsIGRvIG5vdCBsb3dlciB0bworICAvLyBWUEVSTS4KKyAgaWYgKFBQQzo6aXNWUEtVV1VNU2h1ZmZsZU1hc2soU1ZPcCwgZmFsc2UpIHx8CisgICAgICBQUEM6OmlzVlBLVUhVTVNodWZmbGVNYXNrKFNWT3AsIGZhbHNlKSB8fAorICAgICAgUFBDOjppc1ZTTERPSVNodWZmbGVNYXNrKFNWT3AsIGZhbHNlKSAhPSAtMSB8fAorICAgICAgUFBDOjppc1ZNUkdMU2h1ZmZsZU1hc2soU1ZPcCwgMSwgZmFsc2UpIHx8CisgICAgICBQUEM6OmlzVk1SR0xTaHVmZmxlTWFzayhTVk9wLCAyLCBmYWxzZSkgfHwKKyAgICAgIFBQQzo6aXNWTVJHTFNodWZmbGVNYXNrKFNWT3AsIDQsIGZhbHNlKSB8fAorICAgICAgUFBDOjppc1ZNUkdIU2h1ZmZsZU1hc2soU1ZPcCwgMSwgZmFsc2UpIHx8CisgICAgICBQUEM6OmlzVk1SR0hTaHVmZmxlTWFzayhTVk9wLCAyLCBmYWxzZSkgfHwKKyAgICAgIFBQQzo6aXNWTVJHSFNodWZmbGVNYXNrKFNWT3AsIDQsIGZhbHNlKSkKKyAgICByZXR1cm4gT3A7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBzaHVmZmxlIG9mIDQtYnl0ZSB2YWx1ZXMuICBJZiBzbywgd2UgY2FuIHVzZSBvdXIKKyAgLy8gcGVyZmVjdCBzaHVmZmxlIHRhYmxlIHRvIGVtaXQgYW4gb3B0aW1hbCBtYXRjaGluZyBzZXF1ZW5jZS4KKyAgU21hbGxWZWN0b3I8aW50LCAxNj4gUGVybU1hc2s7CisgIFNWT3AtPmdldE1hc2soUGVybU1hc2spOworICAKKyAgdW5zaWduZWQgUEZJbmRleGVzWzRdOworICBib29sIGlzRm91ckVsZW1lbnRTaHVmZmxlID0gdHJ1ZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSA0ICYmIGlzRm91ckVsZW1lbnRTaHVmZmxlOyArK2kpIHsgLy8gRWxlbWVudCBudW1iZXIKKyAgICB1bnNpZ25lZCBFbHRObyA9IDg7ICAgLy8gU3RhcnQgb3V0IHVuZGVmLgorICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gNDsgKytqKSB7ICAvLyBJbnRyYS1lbGVtZW50IGJ5dGUuCisgICAgICBpZiAoUGVybU1hc2tbaSo0K2pdIDwgMCkKKyAgICAgICAgY29udGludWU7ICAgLy8gVW5kZWYsIGlnbm9yZSBpdC4KKworICAgICAgdW5zaWduZWQgQnl0ZVNvdXJjZSA9IFBlcm1NYXNrW2kqNCtqXTsKKyAgICAgIGlmICgoQnl0ZVNvdXJjZSAmIDMpICE9IGopIHsKKyAgICAgICAgaXNGb3VyRWxlbWVudFNodWZmbGUgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChFbHRObyA9PSA4KSB7CisgICAgICAgIEVsdE5vID0gQnl0ZVNvdXJjZS80OworICAgICAgfSBlbHNlIGlmIChFbHRObyAhPSBCeXRlU291cmNlLzQpIHsKKyAgICAgICAgaXNGb3VyRWxlbWVudFNodWZmbGUgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIFBGSW5kZXhlc1tpXSA9IEVsdE5vOworICB9CisKKyAgLy8gSWYgdGhpcyBzaHVmZmxlIGNhbiBiZSBleHByZXNzZWQgYXMgYSBzaHVmZmxlIG9mIDQtYnl0ZSBlbGVtZW50cywgdXNlIHRoZQorICAvLyBwZXJmZWN0IHNodWZmbGUgdmVjdG9yIHRvIGRldGVybWluZSBpZiBpdCBpcyBjb3N0IGVmZmVjdGl2ZSB0byBkbyB0aGlzIGFzCisgIC8vIGRpc2NyZXRlIGluc3RydWN0aW9ucywgb3Igd2hldGhlciB3ZSBzaG91bGQgdXNlIGEgdnBlcm0uCisgIGlmIChpc0ZvdXJFbGVtZW50U2h1ZmZsZSkgeworICAgIC8vIENvbXB1dGUgdGhlIGluZGV4IGluIHRoZSBwZXJmZWN0IHNodWZmbGUgdGFibGUuCisgICAgdW5zaWduZWQgUEZUYWJsZUluZGV4ID0KKyAgICAgIFBGSW5kZXhlc1swXSo5KjkqOStQRkluZGV4ZXNbMV0qOSo5K1BGSW5kZXhlc1syXSo5K1BGSW5kZXhlc1szXTsKKworICAgIHVuc2lnbmVkIFBGRW50cnkgPSBQZXJmZWN0U2h1ZmZsZVRhYmxlW1BGVGFibGVJbmRleF07CisgICAgdW5zaWduZWQgQ29zdCAgPSAoUEZFbnRyeSA+PiAzMCk7CisKKyAgICAvLyBEZXRlcm1pbmluZyB3aGVuIHRvIGF2b2lkIHZwZXJtIGlzIHRyaWNreS4gIE1hbnkgdGhpbmdzIGFmZmVjdCB0aGUgY29zdAorICAgIC8vIG9mIHZwZXJtLCBwYXJ0aWN1bGFybHkgaG93IG1hbnkgdGltZXMgdGhlIHBlcm0gbWFzayBuZWVkcyB0byBiZSBjb21wdXRlZC4KKyAgICAvLyBGb3IgZXhhbXBsZSwgaWYgdGhlIHBlcm0gbWFzayBjYW4gYmUgaG9pc3RlZCBvdXQgb2YgYSBsb29wIG9yIGlzIGFscmVhZHkKKyAgICAvLyB1c2VkIChwZXJoYXBzIGJlY2F1c2UgdGhlcmUgYXJlIG11bHRpcGxlIHBlcm11dGVzIHdpdGggdGhlIHNhbWUgc2h1ZmZsZQorICAgIC8vIG1hc2s/KSB0aGUgdnBlcm0gaGFzIGEgY29zdCBvZiAxLiAgT1RPSCwgaG9pc3RpbmcgdGhlIHBlcm11dGUgbWFzayBvdXQgb2YKKyAgICAvLyB0aGUgbG9vcCByZXF1aXJlcyBhbiBleHRyYSByZWdpc3Rlci4KKyAgICAvLworICAgIC8vIEFzIGEgY29tcHJvbWlzZSwgd2Ugb25seSBlbWl0IGRpc2NyZXRlIGluc3RydWN0aW9ucyBpZiB0aGUgc2h1ZmZsZSBjYW4gYmUKKyAgICAvLyBnZW5lcmF0ZWQgaW4gMyBvciBmZXdlciBvcGVyYXRpb25zLiAgV2hlbiB3ZSBoYXZlIGxvb3AgaW5mb3JtYXRpb24KKyAgICAvLyBhdmFpbGFibGUsIGlmIHRoaXMgYmxvY2sgaXMgd2l0aGluIGEgbG9vcCwgd2Ugc2hvdWxkIGF2b2lkIHVzaW5nIHZwZXJtCisgICAgLy8gZm9yIDMtb3BlcmF0aW9uIHBlcm1zIGFuZCB1c2UgYSBjb25zdGFudCBwb29sIGxvYWQgaW5zdGVhZC4KKyAgICBpZiAoQ29zdCA8IDMpCisgICAgICByZXR1cm4gR2VuZXJhdGVQZXJmZWN0U2h1ZmZsZShQRkVudHJ5LCBWMSwgVjIsIERBRywgZGwpOworICB9CisKKyAgLy8gTG93ZXIgdGhpcyB0byBhIFZQRVJNKFYxLCBWMiwgVjMpIGV4cHJlc3Npb24sIHdoZXJlIFYzIGlzIGEgY29uc3RhbnQKKyAgLy8gdmVjdG9yIHRoYXQgd2lsbCBnZXQgc3BpbGxlZCB0byB0aGUgY29uc3RhbnQgcG9vbC4KKyAgaWYgKFYyLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpIFYyID0gVjE7CisKKyAgLy8gVGhlIFNIVUZGTEVfVkVDVE9SIG1hc2sgaXMgYWxtb3N0IGV4YWN0bHkgd2hhdCB3ZSB3YW50IGZvciB2cGVybSwgZXhjZXB0CisgIC8vIHRoYXQgaXQgaXMgaW4gaW5wdXQgZWxlbWVudCB1bml0cywgbm90IGluIGJ5dGVzLiAgQ29udmVydCBub3cuCisgIEVWVCBFbHRWVCA9IFYxLmdldFZhbHVlVHlwZSgpLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIHVuc2lnbmVkIEJ5dGVzUGVyRWxlbWVudCA9IEVsdFZULmdldFNpemVJbkJpdHMoKS84OworCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBSZXN1bHRNYXNrOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBTcmNFbHQgPSBQZXJtTWFza1tpXSA8IDAgPyAwIDogUGVybU1hc2tbaV07CisKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IEJ5dGVzUGVyRWxlbWVudDsgKytqKQorICAgICAgUmVzdWx0TWFzay5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KFNyY0VsdCpCeXRlc1BlckVsZW1lbnQraiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMikpOworICB9CisKKyAgU0RWYWx1ZSBWUGVybU1hc2sgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djE2aTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUmVzdWx0TWFza1swXSwgUmVzdWx0TWFzay5zaXplKCkpOworICByZXR1cm4gREFHLmdldE5vZGUoUFBDSVNEOjpWUEVSTSwgZGwsIFYxLmdldFZhbHVlVHlwZSgpLCBWMSwgVjIsIFZQZXJtTWFzayk7Cit9CisKKy8vLyBnZXRBbHRpdmVjQ29tcGFyZUluZm8gLSBHaXZlbiBhbiBpbnRyaW5zaWMsIHJldHVybiBmYWxzZSBpZiBpdCBpcyBub3QgYW4KKy8vLyBhbHRpdmVjIGNvbXBhcmlzb24uICBJZiBpdCBpcywgcmV0dXJuIHRydWUgYW5kIGZpbGwgaW4gT3BjL2lzRG90IHdpdGgKKy8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50cmluc2ljLgorc3RhdGljIGJvb2wgZ2V0QWx0aXZlY0NvbXBhcmVJbmZvKFNEVmFsdWUgSW50cmluLCBpbnQgJkNvbXBhcmVPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNEb3QpIHsKKyAgdW5zaWduZWQgSW50cmluc2ljSUQgPQorICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KEludHJpbi5nZXRPcGVyYW5kKDApKS0+Z2V0WkV4dFZhbHVlKCk7CisgIENvbXBhcmVPcGMgPSAtMTsKKyAgaXNEb3QgPSBmYWxzZTsKKyAgc3dpdGNoIChJbnRyaW5zaWNJRCkgeworICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgLy8gQ29tcGFyaXNvbiBwcmVkaWNhdGVzLgorICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGJmcF9wOiAgQ29tcGFyZU9wYyA9IDk2NjsgaXNEb3QgPSAxOyBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcWZwX3A6IENvbXBhcmVPcGMgPSAxOTg7IGlzRG90ID0gMTsgYnJlYWs7CisgIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZXF1Yl9wOiBDb21wYXJlT3BjID0gICA2OyBpc0RvdCA9IDE7IGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdWhfcDogQ29tcGFyZU9wYyA9ICA3MDsgaXNEb3QgPSAxOyBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcXV3X3A6IENvbXBhcmVPcGMgPSAxMzQ7IGlzRG90ID0gMTsgYnJlYWs7CisgIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ2VmcF9wOiBDb21wYXJlT3BjID0gNDU0OyBpc0RvdCA9IDE7IGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0ZnBfcDogQ29tcGFyZU9wYyA9IDcxMDsgaXNEb3QgPSAxOyBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHNiX3A6IENvbXBhcmVPcGMgPSA3NzQ7IGlzRG90ID0gMTsgYnJlYWs7CisgIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3RzaF9wOiBDb21wYXJlT3BjID0gODM4OyBpc0RvdCA9IDE7IGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c3dfcDogQ29tcGFyZU9wYyA9IDkwMjsgaXNEb3QgPSAxOyBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHViX3A6IENvbXBhcmVPcGMgPSA1MTg7IGlzRG90ID0gMTsgYnJlYWs7CisgIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3R1aF9wOiBDb21wYXJlT3BjID0gNTgyOyBpc0RvdCA9IDE7IGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dXdfcDogQ29tcGFyZU9wYyA9IDY0NjsgaXNEb3QgPSAxOyBicmVhazsKKworICAgIC8vIE5vcm1hbCBDb21wYXJpc29ucy4KKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBiZnA6ICAgIENvbXBhcmVPcGMgPSA5NjY7IGlzRG90ID0gMDsgYnJlYWs7CisgIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZXFmcDogICBDb21wYXJlT3BjID0gMTk4OyBpc0RvdCA9IDA7IGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdWI6ICAgQ29tcGFyZU9wYyA9ICAgNjsgaXNEb3QgPSAwOyBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcXVoOiAgIENvbXBhcmVPcGMgPSAgNzA7IGlzRG90ID0gMDsgYnJlYWs7CisgIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZXF1dzogICBDb21wYXJlT3BjID0gMTM0OyBpc0RvdCA9IDA7IGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGdlZnA6ICAgQ29tcGFyZU9wYyA9IDQ1NDsgaXNEb3QgPSAwOyBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndGZwOiAgIENvbXBhcmVPcGMgPSA3MTA7IGlzRG90ID0gMDsgYnJlYWs7CisgIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3RzYjogICBDb21wYXJlT3BjID0gNzc0OyBpc0RvdCA9IDA7IGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c2g6ICAgQ29tcGFyZU9wYyA9IDgzODsgaXNEb3QgPSAwOyBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHN3OiAgIENvbXBhcmVPcGMgPSA5MDI7IGlzRG90ID0gMDsgYnJlYWs7CisgIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3R1YjogICBDb21wYXJlT3BjID0gNTE4OyBpc0RvdCA9IDA7IGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dWg6ICAgQ29tcGFyZU9wYyA9IDU4MjsgaXNEb3QgPSAwOyBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHV3OiAgIENvbXBhcmVPcGMgPSA2NDY7IGlzRG90ID0gMDsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBMb3dlcklOVFJJTlNJQ19XT19DSEFJTiAtIElmIHRoaXMgaXMgYW4gaW50cmluc2ljIHRoYXQgd2Ugd2FudCB0byBjdXN0b20KKy8vLyBsb3dlciwgZG8gaXQsIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VySU5UUklOU0lDX1dPX0NIQUlOKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvLyBJZiB0aGlzIGlzIGEgbG93ZXJlZCBhbHRpdmVjIHByZWRpY2F0ZSBjb21wYXJlLCBDb21wYXJlT3BjIGlzIHNldCB0byB0aGUKKyAgLy8gb3Bjb2RlIG51bWJlciBvZiB0aGUgY29tcGFyaXNvbi4KKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBpbnQgQ29tcGFyZU9wYzsKKyAgYm9vbCBpc0RvdDsKKyAgaWYgKCFnZXRBbHRpdmVjQ29tcGFyZUluZm8oT3AsIENvbXBhcmVPcGMsIGlzRG90KSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOyAgICAvLyBEb24ndCBjdXN0b20gbG93ZXIgbW9zdCBpbnRyaW5zaWNzLgorCisgIC8vIElmIHRoaXMgaXMgYSBub24tZG90IGNvbXBhcmlzb24sIG1ha2UgdGhlIFZDTVAgbm9kZSBhbmQgd2UgYXJlIGRvbmUuCisgIGlmICghaXNEb3QpIHsKKyAgICBTRFZhbHVlIFRtcCA9IERBRy5nZXROb2RlKFBQQ0lTRDo6VkNNUCwgZGwsIE9wLmdldE9wZXJhbmQoMikuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpLCBPcC5nZXRPcGVyYW5kKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KENvbXBhcmVPcGMsIE1WVDo6aTMyKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwgVG1wKTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgUFBDSVNEIGFsdGl2ZWMgJ2RvdCcgY29tcGFyaXNvbiBub2RlLgorICBTRFZhbHVlIE9wc1tdID0geworICAgIE9wLmdldE9wZXJhbmQoMiksICAvLyBMSFMKKyAgICBPcC5nZXRPcGVyYW5kKDMpLCAgLy8gUkhTCisgICAgREFHLmdldENvbnN0YW50KENvbXBhcmVPcGMsIE1WVDo6aTMyKQorICB9OworICBzdGQ6OnZlY3RvcjxFVlQ+IFZUczsKKyAgVlRzLnB1c2hfYmFjayhPcC5nZXRPcGVyYW5kKDIpLmdldFZhbHVlVHlwZSgpKTsKKyAgVlRzLnB1c2hfYmFjayhNVlQ6OkZsYWcpOworICBTRFZhbHVlIENvbXBOb2RlID0gREFHLmdldE5vZGUoUFBDSVNEOjpWQ01QbywgZGwsIFZUcywgT3BzLCAzKTsKKworICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBjb21wYXJpc29uLCBlbWl0IGEgY29weSBmcm9tIHRoZSBDUiB0byBhIEdQUi4KKyAgLy8gVGhpcyBpcyBmbGFnZ2VkIHRvIHRoZSBhYm92ZSBkb3QgY29tcGFyaXNvbi4KKyAgU0RWYWx1ZSBGbGFncyA9IERBRy5nZXROb2RlKFBQQ0lTRDo6TUZDUiwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0UmVnaXN0ZXIoUFBDOjpDUjYsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcE5vZGUuZ2V0VmFsdWUoMSkpOworCisgIC8vIFVucGFjayB0aGUgcmVzdWx0IGJhc2VkIG9uIGhvdyB0aGUgdGFyZ2V0IHVzZXMgaXQuCisgIHVuc2lnbmVkIEJpdE5vOyAgIC8vIEJpdCAjIG9mIENSNi4KKyAgYm9vbCBJbnZlcnRCaXQ7ICAgLy8gSW52ZXJ0IHJlc3VsdD8KKyAgc3dpdGNoIChjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCkpIHsKKyAgZGVmYXVsdDogIC8vIENhbid0IGhhcHBlbiwgZG9uJ3QgY3Jhc2ggb24gaW52YWxpZCBudW1iZXIgdGhvdWdoLgorICBjYXNlIDA6ICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgRVEgYml0IG9mIENSNi4KKyAgICBCaXRObyA9IDA7IEludmVydEJpdCA9IGZhbHNlOworICAgIGJyZWFrOworICBjYXNlIDE6ICAgLy8gUmV0dXJuIHRoZSBpbnZlcnRlZCB2YWx1ZSBvZiB0aGUgRVEgYml0IG9mIENSNi4KKyAgICBCaXRObyA9IDA7IEludmVydEJpdCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgMjogICAvLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBMVCBiaXQgb2YgQ1I2LgorICAgIEJpdE5vID0gMjsgSW52ZXJ0Qml0ID0gZmFsc2U7CisgICAgYnJlYWs7CisgIGNhc2UgMzogICAvLyBSZXR1cm4gdGhlIGludmVydGVkIHZhbHVlIG9mIHRoZSBMVCBiaXQgb2YgQ1I2LgorICAgIEJpdE5vID0gMjsgSW52ZXJ0Qml0ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorCisgIC8vIFNoaWZ0IHRoZSBiaXQgaW50byB0aGUgbG93IHBvc2l0aW9uLgorICBGbGFncyA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTVZUOjppMzIsIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCg4LSgzLUJpdE5vKSwgTVZUOjppMzIpKTsKKyAgLy8gSXNvbGF0ZSB0aGUgYml0LgorICBGbGFncyA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTVZUOjppMzIsIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6OmkzMikpOworCisgIC8vIElmIHdlIGFyZSBzdXBwb3NlZCB0bywgdG9nZ2xlIHRoZSBiaXQuCisgIGlmIChJbnZlcnRCaXQpCisgICAgRmxhZ3MgPSBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIE1WVDo6aTMyLCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6OmkzMikpOworICByZXR1cm4gRmxhZ3M7Cit9CisKK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyU0NBTEFSX1RPX1ZFQ1RPUihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICAvLyBDcmVhdGUgYSBzdGFjayBzbG90IHRoYXQgaXMgMTYtYnl0ZSBhbGlnbmVkLgorICBNYWNoaW5lRnJhbWVJbmZvICpGcmFtZUluZm8gPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnJhbWVJbmZvKCk7CisgIGludCBGcmFtZUlkeCA9IEZyYW1lSW5mby0+Q3JlYXRlU3RhY2tPYmplY3QoMTYsIDE2LCBmYWxzZSk7CisgIEVWVCBQdHJWVCA9IGdldFBvaW50ZXJUeSgpOworICBTRFZhbHVlIEZJZHggPSBEQUcuZ2V0RnJhbWVJbmRleChGcmFtZUlkeCwgUHRyVlQpOworCisgIC8vIFN0b3JlIHRoZSBpbnB1dCB2YWx1ZSBpbnRvIFZhbHVlIzAgb2YgdGhlIHN0YWNrIHNsb3QuCisgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApLCBGSWR4LCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgIC8vIExvYWQgaXQgb3V0LgorICByZXR1cm4gREFHLmdldExvYWQoT3AuZ2V0VmFsdWVUeXBlKCksIGRsLCBTdG9yZSwgRklkeCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7Cit9CisKK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyTVVMKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgaWYgKE9wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6djRpMzIpIHsKKyAgICBTRFZhbHVlIExIUyA9IE9wLmdldE9wZXJhbmQoMCksIFJIUyA9IE9wLmdldE9wZXJhbmQoMSk7CisKKyAgICBTRFZhbHVlIFplcm8gID0gQnVpbGRTcGxhdEkoICAwLCAxLCBNVlQ6OnY0aTMyLCBEQUcsIGRsKTsKKyAgICBTRFZhbHVlIE5lZzE2ID0gQnVpbGRTcGxhdEkoLTE2LCA0LCBNVlQ6OnY0aTMyLCBEQUcsIGRsKTsvLysxNiBhcyBzaGlmdCBhbXQuCisKKyAgICBTRFZhbHVlIFJIU1N3YXAgPSAgIC8vID0gdnJsdyBSSFMsIDE2CisgICAgICBCdWlsZEludHJpbnNpY09wKEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJsdywgUkhTLCBOZWcxNiwgREFHLCBkbCk7CisKKyAgICAvLyBTaHJpbmtpZnkgaW5wdXRzIHRvIHY4aTE2LgorICAgIExIUyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnY4aTE2LCBMSFMpOworICAgIFJIUyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnY4aTE2LCBSSFMpOworICAgIFJIU1N3YXAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2OGkxNiwgUkhTU3dhcCk7CisKKyAgICAvLyBMb3cgcGFydHMgbXVsdGlwbGllZCB0b2dldGhlciwgZ2VuZXJhdGluZyAzMi1iaXQgcmVzdWx0cyAod2UgaWdub3JlIHRoZQorICAgIC8vIHRvcCBwYXJ0cykuCisgICAgU0RWYWx1ZSBMb1Byb2QgPSBCdWlsZEludHJpbnNpY09wKEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm11bG91aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFMsIFJIUywgREFHLCBkbCwgTVZUOjp2NGkzMik7CisKKyAgICBTRFZhbHVlIEhpUHJvZCA9IEJ1aWxkSW50cmluc2ljT3AoSW50cmluc2ljOjpwcGNfYWx0aXZlY192bXN1bXVobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTLCBSSFNTd2FwLCBaZXJvLCBEQUcsIGRsLCBNVlQ6OnY0aTMyKTsKKyAgICAvLyBTaGlmdCB0aGUgaGlnaCBwYXJ0cyB1cCAxNiBiaXRzLgorICAgIEhpUHJvZCA9IEJ1aWxkSW50cmluc2ljT3AoSW50cmluc2ljOjpwcGNfYWx0aXZlY192c2x3LCBIaVByb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZWcxNiwgREFHLCBkbCk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjp2NGkzMiwgTG9Qcm9kLCBIaVByb2QpOworICB9IGVsc2UgaWYgKE9wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6djhpMTYpIHsKKyAgICBTRFZhbHVlIExIUyA9IE9wLmdldE9wZXJhbmQoMCksIFJIUyA9IE9wLmdldE9wZXJhbmQoMSk7CisKKyAgICBTRFZhbHVlIFplcm8gPSBCdWlsZFNwbGF0SSgwLCAxLCBNVlQ6OnY4aTE2LCBEQUcsIGRsKTsKKworICAgIHJldHVybiBCdWlsZEludHJpbnNpY09wKEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1sYWRkdWhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIUywgUkhTLCBaZXJvLCBEQUcsIGRsKTsKKyAgfSBlbHNlIGlmIChPcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OnYxNmk4KSB7CisgICAgU0RWYWx1ZSBMSFMgPSBPcC5nZXRPcGVyYW5kKDApLCBSSFMgPSBPcC5nZXRPcGVyYW5kKDEpOworCisgICAgLy8gTXVsdGlwbHkgdGhlIGV2ZW4gOC1iaXQgcGFydHMsIHByb2R1Y2luZyAxNi1iaXQgc3Vtcy4KKyAgICBTRFZhbHVlIEV2ZW5QYXJ0cyA9IEJ1aWxkSW50cmluc2ljT3AoSW50cmluc2ljOjpwcGNfYWx0aXZlY192bXVsZXViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIUywgUkhTLCBEQUcsIGRsLCBNVlQ6OnY4aTE2KTsKKyAgICBFdmVuUGFydHMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2MTZpOCwgRXZlblBhcnRzKTsKKworICAgIC8vIE11bHRpcGx5IHRoZSBvZGQgOC1iaXQgcGFydHMsIHByb2R1Y2luZyAxNi1iaXQgc3Vtcy4KKyAgICBTRFZhbHVlIE9kZFBhcnRzID0gQnVpbGRJbnRyaW5zaWNPcChJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtdWxvdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFMsIFJIUywgREFHLCBkbCwgTVZUOjp2OGkxNik7CisgICAgT2RkUGFydHMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2MTZpOCwgT2RkUGFydHMpOworCisgICAgLy8gTWVyZ2UgdGhlIHJlc3VsdHMgdG9nZXRoZXIuCisgICAgaW50IE9wc1sxNl07CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSA4OyArK2kpIHsKKyAgICAgIE9wc1tpKjIgIF0gPSAyKmkrMTsKKyAgICAgIE9wc1tpKjIrMV0gPSAyKmkrMSsxNjsKKyAgICB9CisgICAgcmV0dXJuIERBRy5nZXRWZWN0b3JTaHVmZmxlKE1WVDo6djE2aTgsIGRsLCBFdmVuUGFydHMsIE9kZFBhcnRzLCBPcHMpOworICB9IGVsc2UgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbXVsIHRvIGxvd2VyISIpOworICB9Cit9CisKKy8vLyBMb3dlck9wZXJhdGlvbiAtIFByb3ZpZGUgY3VzdG9tIGxvd2VyaW5nIGhvb2tzIGZvciBzb21lIG9wZXJhdGlvbnMuCisvLy8KK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIHN3aXRjaCAoT3AuZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiV2Fzbid0IGV4cGVjdGluZyB0byBiZSBhYmxlIHRvIGxvd2VyIHRoaXMhIik7CisgIGNhc2UgSVNEOjpDb25zdGFudFBvb2w6ICAgICAgIHJldHVybiBMb3dlckNvbnN0YW50UG9vbChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkJsb2NrQWRkcmVzczogICAgICAgcmV0dXJuIExvd2VyQmxvY2tBZGRyZXNzKE9wLCBEQUcpOworICBjYXNlIElTRDo6R2xvYmFsQWRkcmVzczogICAgICByZXR1cm4gTG93ZXJHbG9iYWxBZGRyZXNzKE9wLCBEQUcpOworICBjYXNlIElTRDo6R2xvYmFsVExTQWRkcmVzczogICByZXR1cm4gTG93ZXJHbG9iYWxUTFNBZGRyZXNzKE9wLCBEQUcpOworICBjYXNlIElTRDo6SnVtcFRhYmxlOiAgICAgICAgICByZXR1cm4gTG93ZXJKdW1wVGFibGUoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpTRVRDQzogICAgICAgICAgICAgIHJldHVybiBMb3dlclNFVENDKE9wLCBEQUcpOworICBjYXNlIElTRDo6VFJBTVBPTElORTogICAgICAgICByZXR1cm4gTG93ZXJUUkFNUE9MSU5FKE9wLCBEQUcpOworICBjYXNlIElTRDo6VkFTVEFSVDoKKyAgICByZXR1cm4gTG93ZXJWQVNUQVJUKE9wLCBEQUcsIFBQQ1N1YlRhcmdldCk7CisKKyAgY2FzZSBJU0Q6OlZBQVJHOgorICAgIHJldHVybiBMb3dlclZBQVJHKE9wLCBEQUcsIFBQQ1N1YlRhcmdldCk7CisKKyAgY2FzZSBJU0Q6OlNUQUNLUkVTVE9SRTogICAgICAgcmV0dXJuIExvd2VyU1RBQ0tSRVNUT1JFKE9wLCBEQUcsIFBQQ1N1YlRhcmdldCk7CisgIGNhc2UgSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0M6CisgICAgcmV0dXJuIExvd2VyRFlOQU1JQ19TVEFDS0FMTE9DKE9wLCBEQUcsIFBQQ1N1YlRhcmdldCk7CisKKyAgY2FzZSBJU0Q6OlNFTEVDVF9DQzogICAgICAgICAgcmV0dXJuIExvd2VyU0VMRUNUX0NDKE9wLCBEQUcpOworICBjYXNlIElTRDo6RlBfVE9fVUlOVDoKKyAgY2FzZSBJU0Q6OkZQX1RPX1NJTlQ6ICAgICAgICAgcmV0dXJuIExvd2VyRlBfVE9fSU5UKE9wLCBEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0RGVidWdMb2MoKSk7CisgIGNhc2UgSVNEOjpTSU5UX1RPX0ZQOiAgICAgICAgIHJldHVybiBMb3dlclNJTlRfVE9fRlAoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpGTFRfUk9VTkRTXzogICAgICAgIHJldHVybiBMb3dlckZMVF9ST1VORFNfKE9wLCBEQUcpOworCisgIC8vIExvd2VyIDY0LWJpdCBzaGlmdHMuCisgIGNhc2UgSVNEOjpTSExfUEFSVFM6ICAgICAgICAgIHJldHVybiBMb3dlclNITF9QQVJUUyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlNSTF9QQVJUUzogICAgICAgICAgcmV0dXJuIExvd2VyU1JMX1BBUlRTKE9wLCBEQUcpOworICBjYXNlIElTRDo6U1JBX1BBUlRTOiAgICAgICAgICByZXR1cm4gTG93ZXJTUkFfUEFSVFMoT3AsIERBRyk7CisKKyAgLy8gVmVjdG9yLXJlbGF0ZWQgbG93ZXJpbmcuCisgIGNhc2UgSVNEOjpCVUlMRF9WRUNUT1I6ICAgICAgIHJldHVybiBMb3dlckJVSUxEX1ZFQ1RPUihPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlZFQ1RPUl9TSFVGRkxFOiAgICAgcmV0dXJuIExvd2VyVkVDVE9SX1NIVUZGTEUoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU46IHJldHVybiBMb3dlcklOVFJJTlNJQ19XT19DSEFJTihPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlNDQUxBUl9UT19WRUNUT1I6ICAgcmV0dXJuIExvd2VyU0NBTEFSX1RPX1ZFQ1RPUihPcCwgREFHKTsKKyAgY2FzZSBJU0Q6Ok1VTDogICAgICAgICAgICAgICAgcmV0dXJuIExvd2VyTVVMKE9wLCBEQUcpOworCisgIC8vIEZyYW1lICYgUmV0dXJuIGFkZHJlc3MuCisgIGNhc2UgSVNEOjpSRVRVUk5BRERSOiAgICAgICAgIHJldHVybiBMb3dlclJFVFVSTkFERFIoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpGUkFNRUFERFI6ICAgICAgICAgIHJldHVybiBMb3dlckZSQU1FQUREUihPcCwgREFHKTsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCit2b2lkIFBQQ1RhcmdldExvd2VyaW5nOjpSZXBsYWNlTm9kZVJlc3VsdHMoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiZSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIGFzc2VydChmYWxzZSAmJiAiRG8gbm90IGtub3cgaG93IHRvIGN1c3RvbSB0eXBlIGxlZ2FsaXplIHRoaXMgb3BlcmF0aW9uISIpOworICAgIHJldHVybjsKKyAgY2FzZSBJU0Q6OkZQX1JPVU5EX0lOUkVHOiB7CisgICAgYXNzZXJ0KE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OnBwY2YxMjgpOworICAgIGFzc2VydChOLT5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpID09IE1WVDo6cHBjZjEyOCk7CisgICAgU0RWYWx1ZSBMbyA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmNjQsIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSk7CisgICAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmNjQsIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgxKSk7CisKKyAgICAvLyBUaGlzIHNlcXVlbmNlIGNoYW5nZXMgRlBTQ1IgdG8gZG8gcm91bmQtdG8temVybywgYWRkcyB0aGUgdHdvIGhhbHZlcworICAgIC8vIG9mIHRoZSBsb25nIGRvdWJsZSwgYW5kIHB1dHMgRlBTQ1IgYmFjayB0aGUgd2F5IGl0IHdhcy4gIFdlIGRvIG5vdAorICAgIC8vIGFjdHVhbGx5IG1vZGVsIEZQU0NSLgorICAgIHN0ZDo6dmVjdG9yPEVWVD4gTm9kZVR5czsKKyAgICBTRFZhbHVlIE9wc1s0XSwgUmVzdWx0LCBNRkZTcmVnLCBJbkZsYWcsIEZQcmVnOworCisgICAgTm9kZVR5cy5wdXNoX2JhY2soTVZUOjpmNjQpOyAgIC8vIFJldHVybiByZWdpc3RlcgorICAgIE5vZGVUeXMucHVzaF9iYWNrKE1WVDo6RmxhZyk7ICAgIC8vIFJldHVybnMgYSBmbGFnIGZvciBsYXRlciBpbnNucworICAgIFJlc3VsdCA9IERBRy5nZXROb2RlKFBQQ0lTRDo6TUZGUywgZGwsIE5vZGVUeXMsICZJbkZsYWcsIDApOworICAgIE1GRlNyZWcgPSBSZXN1bHQuZ2V0VmFsdWUoMCk7CisgICAgSW5GbGFnID0gUmVzdWx0LmdldFZhbHVlKDEpOworCisgICAgTm9kZVR5cy5jbGVhcigpOworICAgIE5vZGVUeXMucHVzaF9iYWNrKE1WVDo6RmxhZyk7ICAgLy8gUmV0dXJucyBhIGZsYWcKKyAgICBPcHNbMF0gPSBEQUcuZ2V0Q29uc3RhbnQoMzEsIE1WVDo6aTMyKTsKKyAgICBPcHNbMV0gPSBJbkZsYWc7CisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoUFBDSVNEOjpNVEZTQjEsIGRsLCBOb2RlVHlzLCBPcHMsIDIpOworICAgIEluRmxhZyA9IFJlc3VsdC5nZXRWYWx1ZSgwKTsKKworICAgIE5vZGVUeXMuY2xlYXIoKTsKKyAgICBOb2RlVHlzLnB1c2hfYmFjayhNVlQ6OkZsYWcpOyAgIC8vIFJldHVybnMgYSBmbGFnCisgICAgT3BzWzBdID0gREFHLmdldENvbnN0YW50KDMwLCBNVlQ6OmkzMik7CisgICAgT3BzWzFdID0gSW5GbGFnOworICAgIFJlc3VsdCA9IERBRy5nZXROb2RlKFBQQ0lTRDo6TVRGU0IwLCBkbCwgTm9kZVR5cywgT3BzLCAyKTsKKyAgICBJbkZsYWcgPSBSZXN1bHQuZ2V0VmFsdWUoMCk7CisKKyAgICBOb2RlVHlzLmNsZWFyKCk7CisgICAgTm9kZVR5cy5wdXNoX2JhY2soTVZUOjpmNjQpOyAgICAvLyByZXN1bHQgb2YgYWRkCisgICAgTm9kZVR5cy5wdXNoX2JhY2soTVZUOjpGbGFnKTsgICAvLyBSZXR1cm5zIGEgZmxhZworICAgIE9wc1swXSA9IExvOworICAgIE9wc1sxXSA9IEhpOworICAgIE9wc1syXSA9IEluRmxhZzsKKyAgICBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkZBRERSVFosIGRsLCBOb2RlVHlzLCBPcHMsIDMpOworICAgIEZQcmVnID0gUmVzdWx0LmdldFZhbHVlKDApOworICAgIEluRmxhZyA9IFJlc3VsdC5nZXRWYWx1ZSgxKTsKKworICAgIE5vZGVUeXMuY2xlYXIoKTsKKyAgICBOb2RlVHlzLnB1c2hfYmFjayhNVlQ6OmY2NCk7CisgICAgT3BzWzBdID0gREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTMyKTsKKyAgICBPcHNbMV0gPSBNRkZTcmVnOworICAgIE9wc1syXSA9IEZQcmVnOworICAgIE9wc1szXSA9IEluRmxhZzsKKyAgICBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6Ok1URlNGLCBkbCwgTm9kZVR5cywgT3BzLCA0KTsKKyAgICBGUHJlZyA9IFJlc3VsdC5nZXRWYWx1ZSgwKTsKKworICAgIC8vIFdlIGtub3cgdGhlIGxvdyBoYWxmIGlzIGFib3V0IHRvIGJlIHRocm93biBhd2F5LCBzbyBqdXN0IHVzZSBzb21ldGhpbmcKKyAgICAvLyBjb252ZW5pZW50LgorICAgIFJlc3VsdHMucHVzaF9iYWNrKERBRy5nZXROb2RlKElTRDo6QlVJTERfUEFJUiwgZGwsIE1WVDo6cHBjZjEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlByZWcsIEZQcmVnKSk7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSVNEOjpGUF9UT19TSU5UOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKExvd2VyRlBfVE9fSU5UKFNEVmFsdWUoTiwgMCksIERBRywgZGwpKTsKKyAgICByZXR1cm47CisgIH0KK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIE90aGVyIExvd2VyaW5nIENvZGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK01hY2hpbmVCYXNpY0Jsb2NrICoKK1BQQ1RhcmdldExvd2VyaW5nOjpFbWl0QXRvbWljQmluYXJ5KE1hY2hpbmVJbnN0ciAqTUksIE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXM2NGJpdCwgdW5zaWduZWQgQmluT3Bjb2RlKSBjb25zdCB7CisgIC8vIFRoaXMgYWxzbyBoYW5kbGVzIEFUT01JQ19TV0FQLCBpbmRpY2F0ZWQgYnkgQmluT3Bjb2RlPT0wLgorICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IGdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKworICBjb25zdCBCYXNpY0Jsb2NrICpMTFZNX0JCID0gQkItPmdldEJhc2ljQmxvY2soKTsKKyAgTWFjaGluZUZ1bmN0aW9uICpGID0gQkItPmdldFBhcmVudCgpOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEl0ID0gQkI7CisgICsrSXQ7CisKKyAgdW5zaWduZWQgZGVzdCA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICB1bnNpZ25lZCBwdHJBID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIHB0ckIgPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgaW5jciA9IE1JLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpOworICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpsb29wTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpleGl0TUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIEYtPmluc2VydChJdCwgbG9vcE1CQik7CisgIEYtPmluc2VydChJdCwgZXhpdE1CQik7CisgIGV4aXRNQkItPnNwbGljZShleGl0TUJCLT5iZWdpbigpLCBCQiwKKyAgICAgICAgICAgICAgICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKE1JKSksCisgICAgICAgICAgICAgICAgICBCQi0+ZW5kKCkpOworICBleGl0TUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKEJCKTsKKworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZSZWdJbmZvID0gRi0+Z2V0UmVnSW5mbygpOworICB1bnNpZ25lZCBUbXBSZWcgPSAoIUJpbk9wY29kZSkgPyBpbmNyIDoKKyAgICBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcigKKyAgICAgICBpczY0Yml0ID8gKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKikgJlBQQzo6RzhSQ1JlZ0NsYXNzIDoKKyAgICAgICAgICAgICAgICAgKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKikgJlBQQzo6R1BSQ1JlZ0NsYXNzKTsKKworICAvLyAgdGhpc01CQjoKKyAgLy8gICAuLi4KKyAgLy8gICBmYWxsdGhyb3VnaCAtLT4gbG9vcE1CQgorICBCQi0+YWRkU3VjY2Vzc29yKGxvb3BNQkIpOworCisgIC8vICBsb29wTUJCOgorICAvLyAgIGxbd2RdYXJ4IGRlc3QsIHB0cgorICAvLyAgIGFkZCByMCwgZGVzdCwgaW5jcgorICAvLyAgIHN0W3dkXWN4LiByMCwgcHRyCisgIC8vICAgYm5lLSBsb29wTUJCCisgIC8vICAgZmFsbHRocm91Z2ggLS0+IGV4aXRNQkIKKyAgQkIgPSBsb29wTUJCOworICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXM2NGJpdCA/IFBQQzo6TERBUlggOiBQUEM6OkxXQVJYKSwgZGVzdCkKKyAgICAuYWRkUmVnKHB0ckEpLmFkZFJlZyhwdHJCKTsKKyAgaWYgKEJpbk9wY29kZSkKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoQmluT3Bjb2RlKSwgVG1wUmVnKS5hZGRSZWcoaW5jcikuYWRkUmVnKGRlc3QpOworICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXM2NGJpdCA/IFBQQzo6U1REQ1ggOiBQUEM6OlNUV0NYKSkKKyAgICAuYWRkUmVnKFRtcFJlZykuYWRkUmVnKHB0ckEpLmFkZFJlZyhwdHJCKTsKKyAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6QkNDKSkKKyAgICAuYWRkSW1tKFBQQzo6UFJFRF9ORSkuYWRkUmVnKFBQQzo6Q1IwKS5hZGRNQkIobG9vcE1CQik7CisgIEJCLT5hZGRTdWNjZXNzb3IobG9vcE1CQik7CisgIEJCLT5hZGRTdWNjZXNzb3IoZXhpdE1CQik7CisKKyAgLy8gIGV4aXRNQkI6CisgIC8vICAgLi4uCisgIEJCID0gZXhpdE1CQjsKKyAgcmV0dXJuIEJCOworfQorCitNYWNoaW5lQmFzaWNCbG9jayAqCitQUENUYXJnZXRMb3dlcmluZzo6RW1pdFBhcnR3b3JkQXRvbWljQmluYXJ5KE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpczhiaXQsICAgIC8vIG9wZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaW5PcGNvZGUpIGNvbnN0IHsKKyAgLy8gVGhpcyBhbHNvIGhhbmRsZXMgQVRPTUlDX1NXQVAsIGluZGljYXRlZCBieSBCaW5PcGNvZGU9PTAuCisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICAvLyBJbiA2NCBiaXQgbW9kZSB3ZSBoYXZlIHRvIHVzZSA2NCBiaXRzIGZvciBhZGRyZXNzZXMsIGV2ZW4gdGhvdWdoIHRoZQorICAvLyBsd2FyeC9zdHdjeCBhcmUgMzIgYml0cy4gIFdpdGggdGhlIDMyLWJpdCBhdG9taWNzIHdlIGNhbiB1c2UgYWRkcmVzcworICAvLyByZWdpc3RlcnMgd2l0aG91dCBjYXJpbmcgd2hldGhlciB0aGV5J3JlIDMyIG9yIDY0LCBidXQgaGVyZSB3ZSdyZQorICAvLyBkb2luZyBhY3R1YWwgYXJpdGhtZXRpYyBvbiB0aGUgYWRkcmVzc2VzLgorICBib29sIGlzNjRiaXQgPSBQUENTdWJUYXJnZXQuaXNQUEM2NCgpOworCisgIGNvbnN0IEJhc2ljQmxvY2sgKkxMVk1fQkIgPSBCQi0+Z2V0QmFzaWNCbG9jaygpOworICBNYWNoaW5lRnVuY3Rpb24gKkYgPSBCQi0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSXQgPSBCQjsKKyAgKytJdDsKKworICB1bnNpZ25lZCBkZXN0ID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIHB0ckEgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgcHRyQiA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpOworICB1bnNpZ25lZCBpbmNyID0gTUktPmdldE9wZXJhbmQoMykuZ2V0UmVnKCk7CisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmxvb3BNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmV4aXRNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgRi0+aW5zZXJ0KEl0LCBsb29wTUJCKTsKKyAgRi0+aW5zZXJ0KEl0LCBleGl0TUJCKTsKKyAgZXhpdE1CQi0+c3BsaWNlKGV4aXRNQkItPmJlZ2luKCksIEJCLAorICAgICAgICAgICAgICAgICAgbGx2bTo6bmV4dChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoTUkpKSwKKyAgICAgICAgICAgICAgICAgIEJCLT5lbmQoKSk7CisgIGV4aXRNQkItPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXMoQkIpOworCisgIE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8gPSBGLT5nZXRSZWdJbmZvKCk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0KKyAgICBpczY0Yml0ID8gKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKikgJlBQQzo6RzhSQ1JlZ0NsYXNzIDoKKyAgICAgICAgICAgICAgKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKikgJlBQQzo6R1BSQ1JlZ0NsYXNzOworICB1bnNpZ25lZCBQdHJSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIHVuc2lnbmVkIFNoaWZ0MVJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgdW5zaWduZWQgU2hpZnRSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIHVuc2lnbmVkIEluY3IyUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICB1bnNpZ25lZCBNYXNrUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICB1bnNpZ25lZCBNYXNrMlJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgdW5zaWduZWQgTWFzazNSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIHVuc2lnbmVkIFRtcDJSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIHVuc2lnbmVkIFRtcDNSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIHVuc2lnbmVkIFRtcDRSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIHVuc2lnbmVkIFRtcERlc3RSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIHVuc2lnbmVkIFB0cjFSZWc7CisgIHVuc2lnbmVkIFRtcFJlZyA9ICghQmluT3Bjb2RlKSA/IEluY3IyUmVnIDogUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworCisgIC8vICB0aGlzTUJCOgorICAvLyAgIC4uLgorICAvLyAgIGZhbGx0aHJvdWdoIC0tPiBsb29wTUJCCisgIEJCLT5hZGRTdWNjZXNzb3IobG9vcE1CQik7CisKKyAgLy8gVGhlIDQtYnl0ZSBsb2FkIG11c3QgYmUgYWxpZ25lZCwgd2hpbGUgYSBjaGFyIG9yIHNob3J0IG1heSBiZQorICAvLyBhbnl3aGVyZSBpbiB0aGUgd29yZC4gIEhlbmNlIGFsbCB0aGlzIG5hc3R5IGJvb2trZWVwaW5nIGNvZGUuCisgIC8vICAgYWRkIHB0cjEsIHB0ckEsIHB0ckIgW2NvcHkgaWYgcHRyQT09MF0KKyAgLy8gICBybHdpbm0gc2hpZnQxLCBwdHIxLCAzLCAyNywgMjggWzMsIDI3LCAyN10KKyAgLy8gICB4b3JpIHNoaWZ0LCBzaGlmdDEsIDI0IFsxNl0KKyAgLy8gICBybHdpbm0gcHRyLCBwdHIxLCAwLCAwLCAyOQorICAvLyAgIHNsdyBpbmNyMiwgaW5jciwgc2hpZnQKKyAgLy8gICBsaSBtYXNrMiwgMjU1IFtsaSBtYXNrMywgMDsgb3JpIG1hc2syLCBtYXNrMywgNjU1MzVdCisgIC8vICAgc2x3IG1hc2ssIG1hc2syLCBzaGlmdAorICAvLyAgbG9vcE1CQjoKKyAgLy8gICBsd2FyeCB0bXBEZXN0LCBwdHIKKyAgLy8gICBhZGQgdG1wLCB0bXBEZXN0LCBpbmNyMgorICAvLyAgIGFuZGMgdG1wMiwgdG1wRGVzdCwgbWFzaworICAvLyAgIGFuZCB0bXAzLCB0bXAsIG1hc2sKKyAgLy8gICBvciB0bXA0LCB0bXAzLCB0bXAyCisgIC8vICAgc3R3Y3guIHRtcDQsIHB0cgorICAvLyAgIGJuZS0gbG9vcE1CQgorICAvLyAgIGZhbGx0aHJvdWdoIC0tPiBleGl0TUJCCisgIC8vICAgc3J3IGRlc3QsIHRtcERlc3QsIHNoaWZ0CisKKyAgaWYgKHB0ckEhPVBQQzo6UjApIHsKKyAgICBQdHIxUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChpczY0Yml0ID8gUFBDOjpBREQ4IDogUFBDOjpBREQ0KSwgUHRyMVJlZykKKyAgICAgIC5hZGRSZWcocHRyQSkuYWRkUmVnKHB0ckIpOworICB9IGVsc2UgeworICAgIFB0cjFSZWcgPSBwdHJCOworICB9CisgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChQUEM6OlJMV0lOTSksIFNoaWZ0MVJlZykuYWRkUmVnKFB0cjFSZWcpCisgICAgICAuYWRkSW1tKDMpLmFkZEltbSgyNykuYWRkSW1tKGlzOGJpdCA/IDI4IDogMjcpOworICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXM2NGJpdCA/IFBQQzo6WE9SSTggOiBQUEM6OlhPUkkpLCBTaGlmdFJlZykKKyAgICAgIC5hZGRSZWcoU2hpZnQxUmVnKS5hZGRJbW0oaXM4Yml0ID8gMjQgOiAxNik7CisgIGlmIChpczY0Yml0KQorICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChQUEM6OlJMRElDUiksIFB0clJlZykKKyAgICAgIC5hZGRSZWcoUHRyMVJlZykuYWRkSW1tKDApLmFkZEltbSg2MSk7CisgIGVsc2UKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpSTFdJTk0pLCBQdHJSZWcpCisgICAgICAuYWRkUmVnKFB0cjFSZWcpLmFkZEltbSgwKS5hZGRJbW0oMCkuYWRkSW1tKDI5KTsKKyAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6U0xXKSwgSW5jcjJSZWcpCisgICAgICAuYWRkUmVnKGluY3IpLmFkZFJlZyhTaGlmdFJlZyk7CisgIGlmIChpczhiaXQpCisgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6TEkpLCBNYXNrMlJlZykuYWRkSW1tKDI1NSk7CisgIGVsc2UgeworICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChQUEM6OkxJKSwgTWFzazNSZWcpLmFkZEltbSgwKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpPUkkpLE1hc2syUmVnKS5hZGRSZWcoTWFzazNSZWcpLmFkZEltbSg2NTUzNSk7CisgIH0KKyAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6U0xXKSwgTWFza1JlZykKKyAgICAgIC5hZGRSZWcoTWFzazJSZWcpLmFkZFJlZyhTaGlmdFJlZyk7CisKKyAgQkIgPSBsb29wTUJCOworICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpMV0FSWCksIFRtcERlc3RSZWcpCisgICAgLmFkZFJlZyhQUEM6OlIwKS5hZGRSZWcoUHRyUmVnKTsKKyAgaWYgKEJpbk9wY29kZSkKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoQmluT3Bjb2RlKSwgVG1wUmVnKQorICAgICAgLmFkZFJlZyhJbmNyMlJlZykuYWRkUmVnKFRtcERlc3RSZWcpOworICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXM2NGJpdCA/IFBQQzo6QU5EQzggOiBQUEM6OkFOREMpLCBUbXAyUmVnKQorICAgIC5hZGRSZWcoVG1wRGVzdFJlZykuYWRkUmVnKE1hc2tSZWcpOworICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXM2NGJpdCA/IFBQQzo6QU5EOCA6IFBQQzo6QU5EKSwgVG1wM1JlZykKKyAgICAuYWRkUmVnKFRtcFJlZykuYWRkUmVnKE1hc2tSZWcpOworICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXM2NGJpdCA/IFBQQzo6T1I4IDogUFBDOjpPUiksIFRtcDRSZWcpCisgICAgLmFkZFJlZyhUbXAzUmVnKS5hZGRSZWcoVG1wMlJlZyk7CisgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChQUEM6OlNUV0NYKSkKKyAgICAuYWRkUmVnKFRtcDRSZWcpLmFkZFJlZyhQUEM6OlIwKS5hZGRSZWcoUHRyUmVnKTsKKyAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6QkNDKSkKKyAgICAuYWRkSW1tKFBQQzo6UFJFRF9ORSkuYWRkUmVnKFBQQzo6Q1IwKS5hZGRNQkIobG9vcE1CQik7CisgIEJCLT5hZGRTdWNjZXNzb3IobG9vcE1CQik7CisgIEJCLT5hZGRTdWNjZXNzb3IoZXhpdE1CQik7CisKKyAgLy8gIGV4aXRNQkI6CisgIC8vICAgLi4uCisgIEJCID0gZXhpdE1CQjsKKyAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6U1JXKSwgZGVzdCkuYWRkUmVnKFRtcERlc3RSZWcpLmFkZFJlZyhTaGlmdFJlZyk7CisgIHJldHVybiBCQjsKK30KKworTWFjaGluZUJhc2ljQmxvY2sgKgorUFBDVGFyZ2V0TG93ZXJpbmc6OkVtaXRJbnN0cldpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0SW5zdHJJbmZvKCk7CisKKyAgLy8gVG8gImluc2VydCIgdGhlc2UgaW5zdHJ1Y3Rpb25zIHdlIGFjdHVhbGx5IGhhdmUgdG8gaW5zZXJ0IHRoZWlyCisgIC8vIGNvbnRyb2wtZmxvdyBwYXR0ZXJucy4KKyAgY29uc3QgQmFzaWNCbG9jayAqTExWTV9CQiA9IEJCLT5nZXRCYXNpY0Jsb2NrKCk7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSXQgPSBCQjsKKyAgKytJdDsKKworICBNYWNoaW5lRnVuY3Rpb24gKkYgPSBCQi0+Z2V0UGFyZW50KCk7CisKKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OlNFTEVDVF9DQ19JNCB8fAorICAgICAgTUktPmdldE9wY29kZSgpID09IFBQQzo6U0VMRUNUX0NDX0k4IHx8CisgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpTRUxFQ1RfQ0NfRjQgfHwKKyAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OlNFTEVDVF9DQ19GOCB8fAorICAgICAgTUktPmdldE9wY29kZSgpID09IFBQQzo6U0VMRUNUX0NDX1ZSUkMpIHsKKworICAgIC8vIFRoZSBpbmNvbWluZyBpbnN0cnVjdGlvbiBrbm93cyB0aGUgZGVzdGluYXRpb24gdnJlZyB0byBzZXQsIHRoZQorICAgIC8vIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyIHRvIGJyYW5jaCBvbiwgdGhlIHRydWUvZmFsc2UgdmFsdWVzIHRvCisgICAgLy8gc2VsZWN0IGJldHdlZW4sIGFuZCBhIGJyYW5jaCBvcGNvZGUgdG8gdXNlLgorCisgICAgLy8gIHRoaXNNQkI6CisgICAgLy8gIC4uLgorICAgIC8vICAgVHJ1ZVZhbCA9IC4uLgorICAgIC8vICAgY21wVFkgY2NYLCByMSwgcjIKKyAgICAvLyAgIGJDQyBjb3B5MU1CQgorICAgIC8vICAgZmFsbHRocm91Z2ggLS0+IGNvcHkwTUJCCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKnRoaXNNQkIgPSBCQjsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqY29weTBNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqc2lua01CQiA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICAgIHVuc2lnbmVkIFNlbGVjdFByZWQgPSBNSS0+Z2V0T3BlcmFuZCg0KS5nZXRJbW0oKTsKKyAgICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworICAgIEYtPmluc2VydChJdCwgY29weTBNQkIpOworICAgIEYtPmluc2VydChJdCwgc2lua01CQik7CisKKyAgICAvLyBUcmFuc2ZlciB0aGUgcmVtYWluZGVyIG9mIEJCIGFuZCBpdHMgc3VjY2Vzc29yIGVkZ2VzIHRvIHNpbmtNQkIuCisgICAgc2lua01CQi0+c3BsaWNlKHNpbmtNQkItPmJlZ2luKCksIEJCLAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpuZXh0KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihNSSkpLAorICAgICAgICAgICAgICAgICAgICBCQi0+ZW5kKCkpOworICAgIHNpbmtNQkItPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXMoQkIpOworCisgICAgLy8gTmV4dCwgYWRkIHRoZSB0cnVlIGFuZCBmYWxsdGhyb3VnaCBibG9ja3MgYXMgaXRzIHN1Y2Nlc3NvcnMuCisgICAgQkItPmFkZFN1Y2Nlc3Nvcihjb3B5ME1CQik7CisgICAgQkItPmFkZFN1Y2Nlc3NvcihzaW5rTUJCKTsKKworICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChQUEM6OkJDQykpCisgICAgICAuYWRkSW1tKFNlbGVjdFByZWQpLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkuYWRkTUJCKHNpbmtNQkIpOworCisgICAgLy8gIGNvcHkwTUJCOgorICAgIC8vICAgJUZhbHNlVmFsdWUgPSAuLi4KKyAgICAvLyAgICMgZmFsbHRocm91Z2ggdG8gc2lua01CQgorICAgIEJCID0gY29weTBNQkI7CisKKyAgICAvLyBVcGRhdGUgbWFjaGluZS1DRkcgZWRnZXMKKyAgICBCQi0+YWRkU3VjY2Vzc29yKHNpbmtNQkIpOworCisgICAgLy8gIHNpbmtNQkI6CisgICAgLy8gICAlUmVzdWx0ID0gcGhpIFsgJUZhbHNlVmFsdWUsIGNvcHkwTUJCIF0sIFsgJVRydWVWYWx1ZSwgdGhpc01CQiBdCisgICAgLy8gIC4uLgorICAgIEJCID0gc2lua01CQjsKKyAgICBCdWlsZE1JKCpCQiwgQkItPmJlZ2luKCksIGRsLAorICAgICAgICAgICAgVElJLT5nZXQoUFBDOjpQSEkpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMykuZ2V0UmVnKCkpLmFkZE1CQihjb3B5ME1CQikKKyAgICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCkpLmFkZE1CQih0aGlzTUJCKTsKKyAgfQorICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9BRERfSTgpCisgICAgQkIgPSBFbWl0UGFydHdvcmRBdG9taWNCaW5hcnkoTUksIEJCLCB0cnVlLCBQUEM6OkFERDQpOworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9BRERfSTE2KQorICAgIEJCID0gRW1pdFBhcnR3b3JkQXRvbWljQmluYXJ5KE1JLCBCQiwgZmFsc2UsIFBQQzo6QURENCk7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX0FERF9JMzIpCisgICAgQkIgPSBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgZmFsc2UsIFBQQzo6QURENCk7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX0FERF9JNjQpCisgICAgQkIgPSBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgdHJ1ZSwgUFBDOjpBREQ4KTsKKworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9BTkRfSTgpCisgICAgQkIgPSBFbWl0UGFydHdvcmRBdG9taWNCaW5hcnkoTUksIEJCLCB0cnVlLCBQUEM6OkFORCk7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX0FORF9JMTYpCisgICAgQkIgPSBFbWl0UGFydHdvcmRBdG9taWNCaW5hcnkoTUksIEJCLCBmYWxzZSwgUFBDOjpBTkQpOworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9BTkRfSTMyKQorICAgIEJCID0gRW1pdEF0b21pY0JpbmFyeShNSSwgQkIsIGZhbHNlLCBQUEM6OkFORCk7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX0FORF9JNjQpCisgICAgQkIgPSBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgdHJ1ZSwgUFBDOjpBTkQ4KTsKKworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9PUl9JOCkKKyAgICBCQiA9IEVtaXRQYXJ0d29yZEF0b21pY0JpbmFyeShNSSwgQkIsIHRydWUsIFBQQzo6T1IpOworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9PUl9JMTYpCisgICAgQkIgPSBFbWl0UGFydHdvcmRBdG9taWNCaW5hcnkoTUksIEJCLCBmYWxzZSwgUFBDOjpPUik7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX09SX0kzMikKKyAgICBCQiA9IEVtaXRBdG9taWNCaW5hcnkoTUksIEJCLCBmYWxzZSwgUFBDOjpPUik7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX09SX0k2NCkKKyAgICBCQiA9IEVtaXRBdG9taWNCaW5hcnkoTUksIEJCLCB0cnVlLCBQUEM6Ok9SOCk7CisKKyAgZWxzZSBpZiAoTUktPmdldE9wY29kZSgpID09IFBQQzo6QVRPTUlDX0xPQURfWE9SX0k4KQorICAgIEJCID0gRW1pdFBhcnR3b3JkQXRvbWljQmluYXJ5KE1JLCBCQiwgdHJ1ZSwgUFBDOjpYT1IpOworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9YT1JfSTE2KQorICAgIEJCID0gRW1pdFBhcnR3b3JkQXRvbWljQmluYXJ5KE1JLCBCQiwgZmFsc2UsIFBQQzo6WE9SKTsKKyAgZWxzZSBpZiAoTUktPmdldE9wY29kZSgpID09IFBQQzo6QVRPTUlDX0xPQURfWE9SX0kzMikKKyAgICBCQiA9IEVtaXRBdG9taWNCaW5hcnkoTUksIEJCLCBmYWxzZSwgUFBDOjpYT1IpOworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9YT1JfSTY0KQorICAgIEJCID0gRW1pdEF0b21pY0JpbmFyeShNSSwgQkIsIHRydWUsIFBQQzo6WE9SOCk7CisKKyAgZWxzZSBpZiAoTUktPmdldE9wY29kZSgpID09IFBQQzo6QVRPTUlDX0xPQURfTkFORF9JOCkKKyAgICBCQiA9IEVtaXRQYXJ0d29yZEF0b21pY0JpbmFyeShNSSwgQkIsIHRydWUsIFBQQzo6QU5EQyk7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX05BTkRfSTE2KQorICAgIEJCID0gRW1pdFBhcnR3b3JkQXRvbWljQmluYXJ5KE1JLCBCQiwgZmFsc2UsIFBQQzo6QU5EQyk7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX05BTkRfSTMyKQorICAgIEJCID0gRW1pdEF0b21pY0JpbmFyeShNSSwgQkIsIGZhbHNlLCBQUEM6OkFOREMpOworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9OQU5EX0k2NCkKKyAgICBCQiA9IEVtaXRBdG9taWNCaW5hcnkoTUksIEJCLCB0cnVlLCBQUEM6OkFOREM4KTsKKworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9TVUJfSTgpCisgICAgQkIgPSBFbWl0UGFydHdvcmRBdG9taWNCaW5hcnkoTUksIEJCLCB0cnVlLCBQUEM6OlNVQkYpOworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfTE9BRF9TVUJfSTE2KQorICAgIEJCID0gRW1pdFBhcnR3b3JkQXRvbWljQmluYXJ5KE1JLCBCQiwgZmFsc2UsIFBQQzo6U1VCRik7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX1NVQl9JMzIpCisgICAgQkIgPSBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgZmFsc2UsIFBQQzo6U1VCRik7CisgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBQUEM6OkFUT01JQ19MT0FEX1NVQl9JNjQpCisgICAgQkIgPSBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgdHJ1ZSwgUFBDOjpTVUJGOCk7CisKKyAgZWxzZSBpZiAoTUktPmdldE9wY29kZSgpID09IFBQQzo6QVRPTUlDX1NXQVBfSTgpCisgICAgQkIgPSBFbWl0UGFydHdvcmRBdG9taWNCaW5hcnkoTUksIEJCLCB0cnVlLCAwKTsKKyAgZWxzZSBpZiAoTUktPmdldE9wY29kZSgpID09IFBQQzo6QVRPTUlDX1NXQVBfSTE2KQorICAgIEJCID0gRW1pdFBhcnR3b3JkQXRvbWljQmluYXJ5KE1JLCBCQiwgZmFsc2UsIDApOworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfU1dBUF9JMzIpCisgICAgQkIgPSBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgZmFsc2UsIDApOworICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfU1dBUF9JNjQpCisgICAgQkIgPSBFbWl0QXRvbWljQmluYXJ5KE1JLCBCQiwgdHJ1ZSwgMCk7CisKKyAgZWxzZSBpZiAoTUktPmdldE9wY29kZSgpID09IFBQQzo6QVRPTUlDX0NNUF9TV0FQX0kzMiB8fAorICAgICAgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfQ01QX1NXQVBfSTY0KSB7CisgICAgYm9vbCBpczY0Yml0ID0gTUktPmdldE9wY29kZSgpID09IFBQQzo6QVRPTUlDX0NNUF9TV0FQX0k2NDsKKworICAgIHVuc2lnbmVkIGRlc3QgICA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIHVuc2lnbmVkIHB0ckEgICA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgIHVuc2lnbmVkIHB0ckIgICA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpOworICAgIHVuc2lnbmVkIG9sZHZhbCA9IE1JLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpOworICAgIHVuc2lnbmVkIG5ld3ZhbCA9IE1JLT5nZXRPcGVyYW5kKDQpLmdldFJlZygpOworICAgIERlYnVnTG9jIGRsICAgICA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKmxvb3AxTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKmxvb3AyTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKm1pZE1CQiA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpleGl0TUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgICAgRi0+aW5zZXJ0KEl0LCBsb29wMU1CQik7CisgICAgRi0+aW5zZXJ0KEl0LCBsb29wMk1CQik7CisgICAgRi0+aW5zZXJ0KEl0LCBtaWRNQkIpOworICAgIEYtPmluc2VydChJdCwgZXhpdE1CQik7CisgICAgZXhpdE1CQi0+c3BsaWNlKGV4aXRNQkItPmJlZ2luKCksIEJCLAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpuZXh0KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihNSSkpLAorICAgICAgICAgICAgICAgICAgICBCQi0+ZW5kKCkpOworICAgIGV4aXRNQkItPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXMoQkIpOworCisgICAgLy8gIHRoaXNNQkI6CisgICAgLy8gICAuLi4KKyAgICAvLyAgIGZhbGx0aHJvdWdoIC0tPiBsb29wTUJCCisgICAgQkItPmFkZFN1Y2Nlc3Nvcihsb29wMU1CQik7CisKKyAgICAvLyBsb29wMU1CQjoKKyAgICAvLyAgIGxbd2RdYXJ4IGRlc3QsIHB0cgorICAgIC8vICAgY21wW3dkXSBkZXN0LCBvbGR2YWwKKyAgICAvLyAgIGJuZS0gbWlkTUJCCisgICAgLy8gbG9vcDJNQkI6CisgICAgLy8gICBzdFt3ZF1jeC4gbmV3dmFsLCBwdHIKKyAgICAvLyAgIGJuZS0gbG9vcE1CQgorICAgIC8vICAgYiBleGl0QkIKKyAgICAvLyBtaWRNQkI6CisgICAgLy8gICBzdFt3ZF1jeC4gZGVzdCwgcHRyCisgICAgLy8gZXhpdEJCOgorICAgIEJCID0gbG9vcDFNQkI7CisgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KGlzNjRiaXQgPyBQUEM6OkxEQVJYIDogUFBDOjpMV0FSWCksIGRlc3QpCisgICAgICAuYWRkUmVnKHB0ckEpLmFkZFJlZyhwdHJCKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXM2NGJpdCA/IFBQQzo6Q01QRCA6IFBQQzo6Q01QVyksIFBQQzo6Q1IwKQorICAgICAgLmFkZFJlZyhvbGR2YWwpLmFkZFJlZyhkZXN0KTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpCQ0MpKQorICAgICAgLmFkZEltbShQUEM6OlBSRURfTkUpLmFkZFJlZyhQUEM6OkNSMCkuYWRkTUJCKG1pZE1CQik7CisgICAgQkItPmFkZFN1Y2Nlc3Nvcihsb29wMk1CQik7CisgICAgQkItPmFkZFN1Y2Nlc3NvcihtaWRNQkIpOworCisgICAgQkIgPSBsb29wMk1CQjsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoaXM2NGJpdCA/IFBQQzo6U1REQ1ggOiBQUEM6OlNUV0NYKSkKKyAgICAgIC5hZGRSZWcobmV3dmFsKS5hZGRSZWcocHRyQSkuYWRkUmVnKHB0ckIpOworICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChQUEM6OkJDQykpCisgICAgICAuYWRkSW1tKFBQQzo6UFJFRF9ORSkuYWRkUmVnKFBQQzo6Q1IwKS5hZGRNQkIobG9vcDFNQkIpOworICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChQUEM6OkIpKS5hZGRNQkIoZXhpdE1CQik7CisgICAgQkItPmFkZFN1Y2Nlc3Nvcihsb29wMU1CQik7CisgICAgQkItPmFkZFN1Y2Nlc3NvcihleGl0TUJCKTsKKworICAgIEJCID0gbWlkTUJCOworICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChpczY0Yml0ID8gUFBDOjpTVERDWCA6IFBQQzo6U1RXQ1gpKQorICAgICAgLmFkZFJlZyhkZXN0KS5hZGRSZWcocHRyQSkuYWRkUmVnKHB0ckIpOworICAgIEJCLT5hZGRTdWNjZXNzb3IoZXhpdE1CQik7CisKKyAgICAvLyAgZXhpdE1CQjoKKyAgICAvLyAgIC4uLgorICAgIEJCID0gZXhpdE1CQjsKKyAgfSBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfQ01QX1NXQVBfSTggfHwKKyAgICAgICAgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfQ01QX1NXQVBfSTE2KSB7CisgICAgLy8gV2UgbXVzdCB1c2UgNjQtYml0IHJlZ2lzdGVycyBmb3IgYWRkcmVzc2VzIHdoZW4gdGFyZ2V0aW5nIDY0LWJpdCwKKyAgICAvLyBzaW5jZSB3ZSdyZSBhY3R1YWxseSBkb2luZyBhcml0aG1ldGljIG9uIHRoZW0uICBPdGhlciByZWdpc3RlcnMKKyAgICAvLyBjYW4gYmUgMzItYml0LgorICAgIGJvb2wgaXM2NGJpdCA9IFBQQ1N1YlRhcmdldC5pc1BQQzY0KCk7CisgICAgYm9vbCBpczhiaXQgPSBNSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBVE9NSUNfQ01QX1NXQVBfSTg7CisKKyAgICB1bnNpZ25lZCBkZXN0ICAgPSBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBwdHJBICAgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBwdHJCICAgPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBvbGR2YWwgPSBNSS0+Z2V0T3BlcmFuZCgzKS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBuZXd2YWwgPSBNSS0+Z2V0T3BlcmFuZCg0KS5nZXRSZWcoKTsKKyAgICBEZWJ1Z0xvYyBkbCAgICAgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpsb29wMU1CQiA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpsb29wMk1CQiA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICptaWRNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqZXhpdE1CQiA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICAgIEYtPmluc2VydChJdCwgbG9vcDFNQkIpOworICAgIEYtPmluc2VydChJdCwgbG9vcDJNQkIpOworICAgIEYtPmluc2VydChJdCwgbWlkTUJCKTsKKyAgICBGLT5pbnNlcnQoSXQsIGV4aXRNQkIpOworICAgIGV4aXRNQkItPnNwbGljZShleGl0TUJCLT5iZWdpbigpLCBCQiwKKyAgICAgICAgICAgICAgICAgICAgbGx2bTo6bmV4dChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoTUkpKSwKKyAgICAgICAgICAgICAgICAgICAgQkItPmVuZCgpKTsKKyAgICBleGl0TUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKEJCKTsKKworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8gPSBGLT5nZXRSZWdJbmZvKCk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPQorICAgICAgaXM2NGJpdCA/IChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICopICZQUEM6Okc4UkNSZWdDbGFzcyA6CisgICAgICAgICAgICAgICAgKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKikgJlBQQzo6R1BSQ1JlZ0NsYXNzOworICAgIHVuc2lnbmVkIFB0clJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgICB1bnNpZ25lZCBTaGlmdDFSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgICAgdW5zaWduZWQgU2hpZnRSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgICAgdW5zaWduZWQgTmV3VmFsMlJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgICB1bnNpZ25lZCBOZXdWYWwzUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgIHVuc2lnbmVkIE9sZFZhbDJSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgICAgdW5zaWduZWQgT2xkVmFsM1JlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgICB1bnNpZ25lZCBNYXNrUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgIHVuc2lnbmVkIE1hc2syUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgIHVuc2lnbmVkIE1hc2szUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgIHVuc2lnbmVkIFRtcDJSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgICAgdW5zaWduZWQgVG1wNFJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgICB1bnNpZ25lZCBUbXBEZXN0UmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgIHVuc2lnbmVkIFB0cjFSZWc7CisgICAgdW5zaWduZWQgVG1wUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgIC8vICB0aGlzTUJCOgorICAgIC8vICAgLi4uCisgICAgLy8gICBmYWxsdGhyb3VnaCAtLT4gbG9vcE1CQgorICAgIEJCLT5hZGRTdWNjZXNzb3IobG9vcDFNQkIpOworCisgICAgLy8gVGhlIDQtYnl0ZSBsb2FkIG11c3QgYmUgYWxpZ25lZCwgd2hpbGUgYSBjaGFyIG9yIHNob3J0IG1heSBiZQorICAgIC8vIGFueXdoZXJlIGluIHRoZSB3b3JkLiAgSGVuY2UgYWxsIHRoaXMgbmFzdHkgYm9va2tlZXBpbmcgY29kZS4KKyAgICAvLyAgIGFkZCBwdHIxLCBwdHJBLCBwdHJCIFtjb3B5IGlmIHB0ckE9PTBdCisgICAgLy8gICBybHdpbm0gc2hpZnQxLCBwdHIxLCAzLCAyNywgMjggWzMsIDI3LCAyN10KKyAgICAvLyAgIHhvcmkgc2hpZnQsIHNoaWZ0MSwgMjQgWzE2XQorICAgIC8vICAgcmx3aW5tIHB0ciwgcHRyMSwgMCwgMCwgMjkKKyAgICAvLyAgIHNsdyBuZXd2YWwyLCBuZXd2YWwsIHNoaWZ0CisgICAgLy8gICBzbHcgb2xkdmFsMiwgb2xkdmFsLHNoaWZ0CisgICAgLy8gICBsaSBtYXNrMiwgMjU1IFtsaSBtYXNrMywgMDsgb3JpIG1hc2syLCBtYXNrMywgNjU1MzVdCisgICAgLy8gICBzbHcgbWFzaywgbWFzazIsIHNoaWZ0CisgICAgLy8gICBhbmQgbmV3dmFsMywgbmV3dmFsMiwgbWFzaworICAgIC8vICAgYW5kIG9sZHZhbDMsIG9sZHZhbDIsIG1hc2sKKyAgICAvLyBsb29wMU1CQjoKKyAgICAvLyAgIGx3YXJ4IHRtcERlc3QsIHB0cgorICAgIC8vICAgYW5kIHRtcCwgdG1wRGVzdCwgbWFzaworICAgIC8vICAgY21wdyB0bXAsIG9sZHZhbDMKKyAgICAvLyAgIGJuZS0gbWlkTUJCCisgICAgLy8gbG9vcDJNQkI6CisgICAgLy8gICBhbmRjIHRtcDIsIHRtcERlc3QsIG1hc2sKKyAgICAvLyAgIG9yIHRtcDQsIHRtcDIsIG5ld3ZhbDMKKyAgICAvLyAgIHN0d2N4LiB0bXA0LCBwdHIKKyAgICAvLyAgIGJuZS0gbG9vcDFNQkIKKyAgICAvLyAgIGIgZXhpdEJCCisgICAgLy8gbWlkTUJCOgorICAgIC8vICAgc3R3Y3guIHRtcERlc3QsIHB0cgorICAgIC8vIGV4aXRCQjoKKyAgICAvLyAgIHNydyBkZXN0LCB0bXBEZXN0LCBzaGlmdAorICAgIGlmIChwdHJBIT1QUEM6OlIwKSB7CisgICAgICBQdHIxUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICAgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KGlzNjRiaXQgPyBQUEM6OkFERDggOiBQUEM6OkFERDQpLCBQdHIxUmVnKQorICAgICAgICAuYWRkUmVnKHB0ckEpLmFkZFJlZyhwdHJCKTsKKyAgICB9IGVsc2UgeworICAgICAgUHRyMVJlZyA9IHB0ckI7CisgICAgfQorICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChQUEM6OlJMV0lOTSksIFNoaWZ0MVJlZykuYWRkUmVnKFB0cjFSZWcpCisgICAgICAgIC5hZGRJbW0oMykuYWRkSW1tKDI3KS5hZGRJbW0oaXM4Yml0ID8gMjggOiAyNyk7CisgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KGlzNjRiaXQgPyBQUEM6OlhPUkk4IDogUFBDOjpYT1JJKSwgU2hpZnRSZWcpCisgICAgICAgIC5hZGRSZWcoU2hpZnQxUmVnKS5hZGRJbW0oaXM4Yml0ID8gMjQgOiAxNik7CisgICAgaWYgKGlzNjRiaXQpCisgICAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpSTERJQ1IpLCBQdHJSZWcpCisgICAgICAgIC5hZGRSZWcoUHRyMVJlZykuYWRkSW1tKDApLmFkZEltbSg2MSk7CisgICAgZWxzZQorICAgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6UkxXSU5NKSwgUHRyUmVnKQorICAgICAgICAuYWRkUmVnKFB0cjFSZWcpLmFkZEltbSgwKS5hZGRJbW0oMCkuYWRkSW1tKDI5KTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpTTFcpLCBOZXdWYWwyUmVnKQorICAgICAgICAuYWRkUmVnKG5ld3ZhbCkuYWRkUmVnKFNoaWZ0UmVnKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpTTFcpLCBPbGRWYWwyUmVnKQorICAgICAgICAuYWRkUmVnKG9sZHZhbCkuYWRkUmVnKFNoaWZ0UmVnKTsKKyAgICBpZiAoaXM4Yml0KQorICAgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6TEkpLCBNYXNrMlJlZykuYWRkSW1tKDI1NSk7CisgICAgZWxzZSB7CisgICAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpMSSksIE1hc2szUmVnKS5hZGRJbW0oMCk7CisgICAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpPUkkpLCBNYXNrMlJlZykKKyAgICAgICAgLmFkZFJlZyhNYXNrM1JlZykuYWRkSW1tKDY1NTM1KTsKKyAgICB9CisgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6U0xXKSwgTWFza1JlZykKKyAgICAgICAgLmFkZFJlZyhNYXNrMlJlZykuYWRkUmVnKFNoaWZ0UmVnKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpBTkQpLCBOZXdWYWwzUmVnKQorICAgICAgICAuYWRkUmVnKE5ld1ZhbDJSZWcpLmFkZFJlZyhNYXNrUmVnKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpBTkQpLCBPbGRWYWwzUmVnKQorICAgICAgICAuYWRkUmVnKE9sZFZhbDJSZWcpLmFkZFJlZyhNYXNrUmVnKTsKKworICAgIEJCID0gbG9vcDFNQkI7CisgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6TFdBUlgpLCBUbXBEZXN0UmVnKQorICAgICAgICAuYWRkUmVnKFBQQzo6UjApLmFkZFJlZyhQdHJSZWcpOworICAgIEJ1aWxkTUkoQkIsIGRsLCBUSUktPmdldChQUEM6OkFORCksVG1wUmVnKQorICAgICAgICAuYWRkUmVnKFRtcERlc3RSZWcpLmFkZFJlZyhNYXNrUmVnKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpDTVBXKSwgUFBDOjpDUjApCisgICAgICAgIC5hZGRSZWcoVG1wUmVnKS5hZGRSZWcoT2xkVmFsM1JlZyk7CisgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6QkNDKSkKKyAgICAgICAgLmFkZEltbShQUEM6OlBSRURfTkUpLmFkZFJlZyhQUEM6OkNSMCkuYWRkTUJCKG1pZE1CQik7CisgICAgQkItPmFkZFN1Y2Nlc3Nvcihsb29wMk1CQik7CisgICAgQkItPmFkZFN1Y2Nlc3NvcihtaWRNQkIpOworCisgICAgQkIgPSBsb29wMk1CQjsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpBTkRDKSxUbXAyUmVnKQorICAgICAgICAuYWRkUmVnKFRtcERlc3RSZWcpLmFkZFJlZyhNYXNrUmVnKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpPUiksVG1wNFJlZykKKyAgICAgICAgLmFkZFJlZyhUbXAyUmVnKS5hZGRSZWcoTmV3VmFsM1JlZyk7CisgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6U1RXQ1gpKS5hZGRSZWcoVG1wNFJlZykKKyAgICAgICAgLmFkZFJlZyhQUEM6OlIwKS5hZGRSZWcoUHRyUmVnKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpCQ0MpKQorICAgICAgLmFkZEltbShQUEM6OlBSRURfTkUpLmFkZFJlZyhQUEM6OkNSMCkuYWRkTUJCKGxvb3AxTUJCKTsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpCKSkuYWRkTUJCKGV4aXRNQkIpOworICAgIEJCLT5hZGRTdWNjZXNzb3IobG9vcDFNQkIpOworICAgIEJCLT5hZGRTdWNjZXNzb3IoZXhpdE1CQik7CisKKyAgICBCQiA9IG1pZE1CQjsKKyAgICBCdWlsZE1JKEJCLCBkbCwgVElJLT5nZXQoUFBDOjpTVFdDWCkpLmFkZFJlZyhUbXBEZXN0UmVnKQorICAgICAgLmFkZFJlZyhQUEM6OlIwKS5hZGRSZWcoUHRyUmVnKTsKKyAgICBCQi0+YWRkU3VjY2Vzc29yKGV4aXRNQkIpOworCisgICAgLy8gIGV4aXRNQkI6CisgICAgLy8gICAuLi4KKyAgICBCQiA9IGV4aXRNQkI7CisgICAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFBQQzo6U1JXKSxkZXN0KS5hZGRSZWcoVG1wUmVnKS5hZGRSZWcoU2hpZnRSZWcpOworICB9IGVsc2UgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgaW5zdHIgdHlwZSB0byBpbnNlcnQiKTsKKyAgfQorCisgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsgICAvLyBUaGUgcHNldWRvIGluc3RydWN0aW9uIGlzIGdvbmUgbm93LgorICByZXR1cm4gQkI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYXJnZXQgT3B0aW1pemF0aW9uIEhvb2tzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTRFZhbHVlIFBQQ1RhcmdldExvd2VyaW5nOjpQZXJmb3JtREFHQ29tYmluZShTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUdDb21iaW5lckluZm8gJkRDSSkgY29uc3QgeworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IGdldFRhcmdldE1hY2hpbmUoKTsKKyAgU2VsZWN0aW9uREFHICZEQUcgPSBEQ0kuREFHOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgUFBDSVNEOjpTSEw6CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICBpZiAoQy0+aXNOdWxsVmFsdWUoKSkgICAvLyAwIDw8IFYgLT4gMC4KKyAgICAgICAgcmV0dXJuIE4tPmdldE9wZXJhbmQoMCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFBQQ0lTRDo6U1JMOgorICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgaWYgKEMtPmlzTnVsbFZhbHVlKCkpICAgLy8gMCA+PnUgViAtPiAwLgorICAgICAgICByZXR1cm4gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgUFBDSVNEOjpTUkE6CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4tPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICBpZiAoQy0+aXNOdWxsVmFsdWUoKSB8fCAgIC8vICAwID4+cyBWIC0+IDAuCisgICAgICAgICAgQy0+aXNBbGxPbmVzVmFsdWUoKSkgICAgLy8gLTEgPj5zIFYgLT4gLTEuCisgICAgICAgIHJldHVybiBOLT5nZXRPcGVyYW5kKDApOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIElTRDo6U0lOVF9UT19GUDoKKyAgICBpZiAoVE0uZ2V0U3VidGFyZ2V0PFBQQ1N1YnRhcmdldD4oKS5oYXM2NEJpdFN1cHBvcnQoKSkgeworICAgICAgaWYgKE4tPmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpGUF9UT19TSU5UKSB7CisgICAgICAgIC8vIFR1cm4gKHNpbnRfdG9fZnAgKGZwX3RvX3NpbnQgWCkpIC0+IGZjdGlkei9mY2ZpZCB3aXRob3V0IGxvYWQvc3RvcmVzLgorICAgICAgICAvLyBXZSBhbGxvdyB0aGUgc3JjL2RzdCB0byBiZSBlaXRoZXIgZjMyL2Y2NCwgYnV0IHRoZSBpbnRlcm1lZGlhdGUKKyAgICAgICAgLy8gdHlwZSBtdXN0IGJlIGk2NC4KKyAgICAgICAgaWYgKE4tPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppNjQgJiYKKyAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6OnBwY2YxMjgpIHsKKyAgICAgICAgICBTRFZhbHVlIFZhbCA9IE4tPmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKTsKKyAgICAgICAgICBpZiAoVmFsLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjMyKSB7CisgICAgICAgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZQX0VYVEVORCwgZGwsIE1WVDo6ZjY0LCBWYWwpOworICAgICAgICAgICAgRENJLkFkZFRvV29ya2xpc3QoVmFsLmdldE5vZGUoKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgVmFsID0gREFHLmdldE5vZGUoUFBDSVNEOjpGQ1RJRFosIGRsLCBNVlQ6OmY2NCwgVmFsKTsKKyAgICAgICAgICBEQ0kuQWRkVG9Xb3JrbGlzdChWYWwuZ2V0Tm9kZSgpKTsKKyAgICAgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkZDRklELCBkbCwgTVZUOjpmNjQsIFZhbCk7CisgICAgICAgICAgRENJLkFkZFRvV29ya2xpc3QoVmFsLmdldE5vZGUoKSk7CisgICAgICAgICAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmYzMikgeworICAgICAgICAgICAgVmFsID0gREFHLmdldE5vZGUoSVNEOjpGUF9ST1VORCwgZGwsIE1WVDo6ZjMyLCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICAgICAgICAgICAgRENJLkFkZFRvV29ya2xpc3QoVmFsLmdldE5vZGUoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBWYWw7CisgICAgICAgIH0gZWxzZSBpZiAoTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmkzMikgeworICAgICAgICAgIC8vIElmIHRoZSBpbnRlcm1lZGlhdGUgdHlwZSBpcyBpMzIsIHdlIGNhbiBhdm9pZCB0aGUgbG9hZC9zdG9yZSBoZXJlCisgICAgICAgICAgLy8gdG9vLgorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElTRDo6U1RPUkU6CisgICAgLy8gVHVybiBTVE9SRSAoRlBfVE9fU0lOVCBGKSAtPiBTVEZJV1goRkNUSVdaKEYpKS4KKyAgICBpZiAoVE0uZ2V0U3VidGFyZ2V0PFBQQ1N1YnRhcmdldD4oKS5oYXNTVEZJV1goKSAmJgorICAgICAgICAhY2FzdDxTdG9yZVNETm9kZT4oTiktPmlzVHJ1bmNhdGluZ1N0b3JlKCkgJiYKKyAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZQX1RPX1NJTlQgJiYKKyAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmkzMiAmJgorICAgICAgICBOLT5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjpwcGNmMTI4KSB7CisgICAgICBTRFZhbHVlIFZhbCA9IE4tPmdldE9wZXJhbmQoMSkuZ2V0T3BlcmFuZCgwKTsKKyAgICAgIGlmIChWYWwuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmMzIpIHsKKyAgICAgICAgVmFsID0gREFHLmdldE5vZGUoSVNEOjpGUF9FWFRFTkQsIGRsLCBNVlQ6OmY2NCwgVmFsKTsKKyAgICAgICAgRENJLkFkZFRvV29ya2xpc3QoVmFsLmdldE5vZGUoKSk7CisgICAgICB9CisgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkZDVElXWiwgZGwsIE1WVDo6ZjY0LCBWYWwpOworICAgICAgRENJLkFkZFRvV29ya2xpc3QoVmFsLmdldE5vZGUoKSk7CisKKyAgICAgIFZhbCA9IERBRy5nZXROb2RlKFBQQ0lTRDo6U1RGSVdYLCBkbCwgTVZUOjpPdGhlciwgTi0+Z2V0T3BlcmFuZCgwKSwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgyKSwgTi0+Z2V0T3BlcmFuZCgzKSk7CisgICAgICBEQ0kuQWRkVG9Xb3JrbGlzdChWYWwuZ2V0Tm9kZSgpKTsKKyAgICAgIHJldHVybiBWYWw7CisgICAgfQorCisgICAgLy8gVHVybiBTVE9SRSAoQlNXQVApIC0+IHN0aGJyeC9zdHdicnguCisgICAgaWYgKGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5pc1VuaW5kZXhlZCgpICYmCisgICAgICAgIE4tPmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCU1dBUCAmJgorICAgICAgICBOLT5nZXRPcGVyYW5kKDEpLmdldE5vZGUoKS0+aGFzT25lVXNlKCkgJiYKKyAgICAgICAgKE4tPmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIgfHwKKyAgICAgICAgIE4tPmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMTYpKSB7CisgICAgICBTRFZhbHVlIEJTd2FwT3AgPSBOLT5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMCk7CisgICAgICAvLyBEbyBhbiBhbnktZXh0ZW5kIHRvIDMyLWJpdHMgaWYgdGhpcyBpcyBhIGhhbGYtd29yZCBpbnB1dC4KKyAgICAgIGlmIChCU3dhcE9wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTE2KQorICAgICAgICBCU3dhcE9wID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwgTVZUOjppMzIsIEJTd2FwT3ApOworCisgICAgICBTRFZhbHVlIE9wc1tdID0geworICAgICAgICBOLT5nZXRPcGVyYW5kKDApLCBCU3dhcE9wLCBOLT5nZXRPcGVyYW5kKDIpLAorICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKE4tPmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkpCisgICAgICB9OworICAgICAgcmV0dXJuCisgICAgICAgIERBRy5nZXRNZW1JbnRyaW5zaWNOb2RlKFBQQ0lTRDo6U1RCUlgsIGRsLCBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsIGFycmF5X2xlbmd0aG9mKE9wcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtT3BlcmFuZCgpKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpCU1dBUDoKKyAgICAvLyBUdXJuIEJTV0FQIChMT0FEKSAtPiBsaGJyeC9sd2JyeC4KKyAgICBpZiAoSVNEOjppc05PTl9FWFRMb2FkKE4tPmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpKSAmJgorICAgICAgICBOLT5nZXRPcGVyYW5kKDApLmhhc09uZVVzZSgpICYmCisgICAgICAgIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIgfHwgTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTE2KSkgeworICAgICAgU0RWYWx1ZSBMb2FkID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIExvYWRTRE5vZGUgKkxEID0gY2FzdDxMb2FkU0ROb2RlPihMb2FkKTsKKyAgICAgIC8vIENyZWF0ZSB0aGUgYnl0ZS1zd2FwcGluZyBsb2FkLgorICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsKKyAgICAgICAgTEQtPmdldENoYWluKCksICAgIC8vIENoYWluCisgICAgICAgIExELT5nZXRCYXNlUHRyKCksICAvLyBQdHIKKyAgICAgICAgREFHLmdldFZhbHVlVHlwZShOLT5nZXRWYWx1ZVR5cGUoMCkpIC8vIFZUCisgICAgICB9OworICAgICAgU0RWYWx1ZSBCU0xvYWQgPQorICAgICAgICBEQUcuZ2V0TWVtSW50cmluc2ljTm9kZShQUENJU0Q6OkxCUlgsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlRMaXN0KE1WVDo6aTMyLCBNVlQ6Ok90aGVyKSwgT3BzLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC0+Z2V0TWVtb3J5VlQoKSwgTEQtPmdldE1lbU9wZXJhbmQoKSk7CisKKyAgICAgIC8vIElmIHRoaXMgaXMgYW4gaTE2IGxvYWQsIGluc2VydCB0aGUgdHJ1bmNhdGUuCisgICAgICBTRFZhbHVlIFJlc1ZhbCA9IEJTTG9hZDsKKyAgICAgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMTYpCisgICAgICAgIFJlc1ZhbCA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBNVlQ6OmkxNiwgQlNMb2FkKTsKKworICAgICAgLy8gRmlyc3QsIGNvbWJpbmUgdGhlIGJzd2FwIGF3YXkuICBUaGlzIG1ha2VzIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB0aGUKKyAgICAgIC8vIGxvYWQgZGVhZC4KKyAgICAgIERDSS5Db21iaW5lVG8oTiwgUmVzVmFsKTsKKworICAgICAgLy8gTmV4dCwgY29tYmluZSB0aGUgbG9hZCBhd2F5LCB3ZSBnaXZlIGl0IGEgYm9ndXMgcmVzdWx0IHZhbHVlIGJ1dCBhIHJlYWwKKyAgICAgIC8vIGNoYWluIHJlc3VsdC4gIFRoZSByZXN1bHQgdmFsdWUgaXMgZGVhZCBiZWNhdXNlIHRoZSBic3dhcCBpcyBkZWFkLgorICAgICAgRENJLkNvbWJpbmVUbyhMb2FkLmdldE5vZGUoKSwgUmVzVmFsLCBCU0xvYWQuZ2V0VmFsdWUoMSkpOworCisgICAgICAvLyBSZXR1cm4gTiBzbyBpdCBkb2Vzbid0IGdldCByZWNoZWNrZWQhCisgICAgICByZXR1cm4gU0RWYWx1ZShOLCAwKTsKKyAgICB9CisKKyAgICBicmVhazsKKyAgY2FzZSBQUENJU0Q6OlZDTVA6IHsKKyAgICAvLyBJZiBhIFZDTVBvIG5vZGUgYWxyZWFkeSBleGlzdHMgd2l0aCBleGFjdGx5IHRoZSBzYW1lIG9wZXJhbmRzIGFzIHRoaXMKKyAgICAvLyBub2RlLCB1c2UgaXRzIHJlc3VsdCBpbnN0ZWFkIG9mIHRoaXMgbm9kZSAoVkNNUG8gY29tcHV0ZXMgYm90aCBhIENSNiBhbmQKKyAgICAvLyBhIG5vcm1hbCBvdXRwdXQpLgorICAgIC8vCisgICAgaWYgKCFOLT5nZXRPcGVyYW5kKDApLmhhc09uZVVzZSgpICYmCisgICAgICAgICFOLT5nZXRPcGVyYW5kKDEpLmhhc09uZVVzZSgpICYmCisgICAgICAgICFOLT5nZXRPcGVyYW5kKDIpLmhhc09uZVVzZSgpKSB7CisKKyAgICAgIC8vIFNjYW4gYWxsIG9mIHRoZSB1c2VycyBvZiB0aGUgTEhTLCBsb29raW5nIGZvciBWQ01QbydzIHRoYXQgbWF0Y2guCisgICAgICBTRE5vZGUgKlZDTVBvTm9kZSA9IDA7CisKKyAgICAgIFNETm9kZSAqTEhTTiA9IE4tPmdldE9wZXJhbmQoMCkuZ2V0Tm9kZSgpOworICAgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IExIU04tPnVzZV9iZWdpbigpLCBFID0gTEhTTi0+dXNlX2VuZCgpOworICAgICAgICAgICBVSSAhPSBFOyArK1VJKQorICAgICAgICBpZiAoVUktPmdldE9wY29kZSgpID09IFBQQ0lTRDo6VkNNUG8gJiYKKyAgICAgICAgICAgIFVJLT5nZXRPcGVyYW5kKDEpID09IE4tPmdldE9wZXJhbmQoMSkgJiYKKyAgICAgICAgICAgIFVJLT5nZXRPcGVyYW5kKDIpID09IE4tPmdldE9wZXJhbmQoMikgJiYKKyAgICAgICAgICAgIFVJLT5nZXRPcGVyYW5kKDApID09IE4tPmdldE9wZXJhbmQoMCkpIHsKKyAgICAgICAgICBWQ01Qb05vZGUgPSAqVUk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gVkNNUG8gbm9kZSwgb3IgaWYgdGhlIGZsYWcgdmFsdWUgaGFzIGEgc2luZ2xlIHVzZSwgZG9uJ3QKKyAgICAgIC8vIHRyYW5zZm9ybSB0aGlzLgorICAgICAgaWYgKCFWQ01Qb05vZGUgfHwgVkNNUG9Ob2RlLT5oYXNOVXNlc09mVmFsdWUoMCwgMSkpCisgICAgICAgIGJyZWFrOworCisgICAgICAvLyBMb29rIGF0IHRoZSAobmVjZXNzYXJpbHkgc2luZ2xlKSB1c2Ugb2YgdGhlIGZsYWcgdmFsdWUuICBJZiBpdCBoYXMgYQorICAgICAgLy8gY2hhaW4sIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgbW9yZSBjb21wbGV4LiAgTm90ZSB0aGF0IG11bHRpcGxlIHRoaW5ncworICAgICAgLy8gY291bGQgdXNlIHRoZSB2YWx1ZSByZXN1bHQsIHdoaWNoIHdlIHNob3VsZCBpZ25vcmUuCisgICAgICBTRE5vZGUgKkZsYWdVc2VyID0gMDsKKyAgICAgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBWQ01Qb05vZGUtPnVzZV9iZWdpbigpOworICAgICAgICAgICBGbGFnVXNlciA9PSAwOyArK1VJKSB7CisgICAgICAgIGFzc2VydChVSSAhPSBWQ01Qb05vZGUtPnVzZV9lbmQoKSAmJiAiRGlkbid0IGZpbmQgdXNlciEiKTsKKyAgICAgICAgU0ROb2RlICpVc2VyID0gKlVJOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVXNlci0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBpZiAoVXNlci0+Z2V0T3BlcmFuZChpKSA9PSBTRFZhbHVlKFZDTVBvTm9kZSwgMSkpIHsKKyAgICAgICAgICAgIEZsYWdVc2VyID0gVXNlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBJZiB0aGUgdXNlciBpcyBhIE1GQ1IgaW5zdHJ1Y3Rpb24sIHdlIGtub3cgdGhpcyBpcyBzYWZlLiAgT3RoZXJ3aXNlIHdlCisgICAgICAvLyBnaXZlIHVwIGZvciByaWdodCBub3cuCisgICAgICBpZiAoRmxhZ1VzZXItPmdldE9wY29kZSgpID09IFBQQ0lTRDo6TUZDUikKKyAgICAgICAgcmV0dXJuIFNEVmFsdWUoVkNNUG9Ob2RlLCAwKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OkJSX0NDOiB7CisgICAgLy8gSWYgdGhpcyBpcyBhIGJyYW5jaCBvbiBhbiBhbHRpdmVjIHByZWRpY2F0ZSBjb21wYXJpc29uLCBsb3dlciB0aGlzIHNvCisgICAgLy8gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGRvIGEgTUZDUjogaW5zdGVhZCwgYnJhbmNoIGRpcmVjdGx5IG9uIENSNi4gIFRoaXMKKyAgICAvLyBsb3dlcmluZyBpcyBkb25lIHByZS1sZWdhbGl6ZSwgYmVjYXVzZSB0aGUgbGVnYWxpemVyIGxvd2VycyB0aGUgcHJlZGljYXRlCisgICAgLy8gY29tcGFyZSBkb3duIHRvIGNvZGUgdGhhdCBpcyBkaWZmaWN1bHQgdG8gcmVhc3NlbWJsZS4KKyAgICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSktPmdldCgpOworICAgIFNEVmFsdWUgTEhTID0gTi0+Z2V0T3BlcmFuZCgyKSwgUkhTID0gTi0+Z2V0T3BlcmFuZCgzKTsKKyAgICBpbnQgQ29tcGFyZU9wYzsKKyAgICBib29sIGlzRG90OworCisgICAgaWYgKExIUy5nZXRPcGNvZGUoKSA9PSBJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiAmJgorICAgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KFJIUykgJiYgKENDID09IElTRDo6U0VURVEgfHwgQ0MgPT0gSVNEOjpTRVRORSkgJiYKKyAgICAgICAgZ2V0QWx0aXZlY0NvbXBhcmVJbmZvKExIUywgQ29tcGFyZU9wYywgaXNEb3QpKSB7CisgICAgICBhc3NlcnQoaXNEb3QgJiYgIkNhbid0IGNvbXBhcmUgYWdhaW5zdCBhIHZlY3RvciByZXN1bHQhIik7CisKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBjb21wYXJpc29uIGFnYWluc3Qgc29tZXRoaW5nIG90aGVyIHRoYW4gMC8xLCB0aGVuIHdlIGtub3cKKyAgICAgIC8vIHRoYXQgdGhlIGNvbmRpdGlvbiBpcyBuZXZlci9hbHdheXMgdHJ1ZS4KKyAgICAgIHVuc2lnbmVkIFZhbCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KFJIUyktPmdldFpFeHRWYWx1ZSgpOworICAgICAgaWYgKFZhbCAhPSAwICYmIFZhbCAhPSAxKSB7CisgICAgICAgIGlmIChDQyA9PSBJU0Q6OlNFVEVRKSAgICAgIC8vIENvbmQgbmV2ZXIgdHJ1ZSwgcmVtb3ZlIGJyYW5jaC4KKyAgICAgICAgICByZXR1cm4gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgLy8gQWx3YXlzICE9LCB0dXJuIGl0IGludG8gYW4gdW5jb25kaXRpb25hbCBicmFuY2guCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJSLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoNCkpOworICAgICAgfQorCisgICAgICBib29sIEJyYW5jaE9uV2hlblByZWRUcnVlID0gKENDID09IElTRDo6U0VURVEpIF4gKFZhbCA9PSAwKTsKKworICAgICAgLy8gQ3JlYXRlIHRoZSBQUENJU0QgYWx0aXZlYyAnZG90JyBjb21wYXJpc29uIG5vZGUuCisgICAgICBzdGQ6OnZlY3RvcjxFVlQ+IFZUczsKKyAgICAgIFNEVmFsdWUgT3BzW10gPSB7CisgICAgICAgIExIUy5nZXRPcGVyYW5kKDIpLCAgLy8gTEhTIG9mIGNvbXBhcmUKKyAgICAgICAgTEhTLmdldE9wZXJhbmQoMyksICAvLyBSSFMgb2YgY29tcGFyZQorICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQ29tcGFyZU9wYywgTVZUOjppMzIpCisgICAgICB9OworICAgICAgVlRzLnB1c2hfYmFjayhMSFMuZ2V0T3BlcmFuZCgyKS5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICBWVHMucHVzaF9iYWNrKE1WVDo6RmxhZyk7CisgICAgICBTRFZhbHVlIENvbXBOb2RlID0gREFHLmdldE5vZGUoUFBDSVNEOjpWQ01QbywgZGwsIFZUcywgT3BzLCAzKTsKKworICAgICAgLy8gVW5wYWNrIHRoZSByZXN1bHQgYmFzZWQgb24gaG93IHRoZSB0YXJnZXQgdXNlcyBpdC4KKyAgICAgIFBQQzo6UHJlZGljYXRlIENvbXBPcGM7CisgICAgICBzd2l0Y2ggKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KExIUy5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCkpIHsKKyAgICAgIGRlZmF1bHQ6ICAvLyBDYW4ndCBoYXBwZW4sIGRvbid0IGNyYXNoIG9uIGludmFsaWQgbnVtYmVyIHRob3VnaC4KKyAgICAgIGNhc2UgMDogICAvLyBCcmFuY2ggb24gdGhlIHZhbHVlIG9mIHRoZSBFUSBiaXQgb2YgQ1I2LgorICAgICAgICBDb21wT3BjID0gQnJhbmNoT25XaGVuUHJlZFRydWUgPyBQUEM6OlBSRURfRVEgOiBQUEM6OlBSRURfTkU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOiAgIC8vIEJyYW5jaCBvbiB0aGUgaW52ZXJ0ZWQgdmFsdWUgb2YgdGhlIEVRIGJpdCBvZiBDUjYuCisgICAgICAgIENvbXBPcGMgPSBCcmFuY2hPbldoZW5QcmVkVHJ1ZSA/IFBQQzo6UFJFRF9ORSA6IFBQQzo6UFJFRF9FUTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6ICAgLy8gQnJhbmNoIG9uIHRoZSB2YWx1ZSBvZiB0aGUgTFQgYml0IG9mIENSNi4KKyAgICAgICAgQ29tcE9wYyA9IEJyYW5jaE9uV2hlblByZWRUcnVlID8gUFBDOjpQUkVEX0xUIDogUFBDOjpQUkVEX0dFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzogICAvLyBCcmFuY2ggb24gdGhlIGludmVydGVkIHZhbHVlIG9mIHRoZSBMVCBiaXQgb2YgQ1I2LgorICAgICAgICBDb21wT3BjID0gQnJhbmNoT25XaGVuUHJlZFRydWUgPyBQUEM6OlBSRURfR0UgOiBQUEM6OlBSRURfTFQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoUFBDSVNEOjpDT05EX0JSQU5DSCwgZGwsIE1WVDo6T3RoZXIsIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KENvbXBPcGMsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0UmVnaXN0ZXIoUFBDOjpDUjYsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDQpLCBDb21wTm9kZS5nZXRWYWx1ZSgxKSk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5saW5lIEFzc2VtYmx5IFN1cHBvcnQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgUFBDVGFyZ2V0TG93ZXJpbmc6OmNvbXB1dGVNYXNrZWRCaXRzRm9yVGFyZ2V0Tm9kZShjb25zdCBTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSBjb25zdCB7CisgIEtub3duWmVybyA9IEtub3duT25lID0gQVBJbnQoTWFzay5nZXRCaXRXaWR0aCgpLCAwKTsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBQUENJU0Q6OkxCUlg6IHsKKyAgICAvLyBsaGJyeCBpcyBrbm93biB0byBoYXZlIHRoZSB0b3AgYml0cyBjbGVhcmVkIG91dC4KKyAgICBpZiAoY2FzdDxWVFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgyKSktPmdldFZUKCkgPT0gTVZUOjppMTYpCisgICAgICBLbm93blplcm8gPSAweEZGRkYwMDAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU46IHsKKyAgICBzd2l0Y2ggKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMCkpLT5nZXRaRXh0VmFsdWUoKSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wYmZwX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcWZwX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcXViX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcXVoX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcXV3X3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBnZWZwX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndGZwX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHNiX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHNoX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHN3X3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHViX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHVoX3A6CisgICAgY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHV3X3A6CisgICAgICBLbm93blplcm8gPSB+MVU7ICAvLyBBbGwgYml0cyBidXQgdGhlIGxvdyBvbmUgYXJlIGtub3duIHRvIGJlIHplcm8uCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgfQorfQorCisKKy8vLyBnZXRDb25zdHJhaW50VHlwZSAtIEdpdmVuIGEgY29uc3RyYWludCwgcmV0dXJuIHRoZSB0eXBlIG9mCisvLy8gY29uc3RyYWludCBpdCBpcyBmb3IgdGhpcyB0YXJnZXQuCitQUENUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUKK1BQQ1RhcmdldExvd2VyaW5nOjpnZXRDb25zdHJhaW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCkgY29uc3QgeworICBpZiAoQ29uc3RyYWludC5zaXplKCkgPT0gMSkgeworICAgIHN3aXRjaCAoQ29uc3RyYWludFswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgIGNhc2UgJ3InOgorICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ3YnOgorICAgIGNhc2UgJ3knOgorICAgICAgcmV0dXJuIENfUmVnaXN0ZXJDbGFzczsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjpnZXRDb25zdHJhaW50VHlwZShDb25zdHJhaW50KTsKK30KKworc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4KK1BQQ1RhcmdldExvd2VyaW5nOjpnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCB7CisgIGlmIChDb25zdHJhaW50LnNpemUoKSA9PSAxKSB7CisgICAgLy8gR0NDIFJTNjAwMCBDb25zdHJhaW50IExldHRlcnMKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICBjYXNlICdiJzogICAvLyBSMS1SMzEKKyAgICBjYXNlICdyJzogICAvLyBSMC1SMzEKKyAgICAgIGlmIChWVCA9PSBNVlQ6Omk2NCAmJiBQUENTdWJUYXJnZXQuaXNQUEM2NCgpKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFBQQzo6RzhSQ1JlZ2lzdGVyQ2xhc3MpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBQUEM6OkdQUkNSZWdpc3RlckNsYXNzKTsKKyAgICBjYXNlICdmJzoKKyAgICAgIGlmIChWVCA9PSBNVlQ6OmYzMikKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBQUEM6OkY0UkNSZWdpc3RlckNsYXNzKTsKKyAgICAgIGVsc2UgaWYgKFZUID09IE1WVDo6ZjY0KQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFBQQzo6RjhSQ1JlZ2lzdGVyQ2xhc3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAndic6CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFBQQzo6VlJSQ1JlZ2lzdGVyQ2xhc3MpOworICAgIGNhc2UgJ3knOiAgIC8vIGNycmMKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgUFBDOjpDUlJDUmVnaXN0ZXJDbGFzcyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjpnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KENvbnN0cmFpbnQsIFZUKTsKK30KKworCisvLy8gTG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludCAtIExvd2VyIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpbnRvIHRoZSBPcHMKKy8vLyB2ZWN0b3IuICBJZiBpdCBpcyBpbnZhbGlkLCBkb24ndCBhZGQgYW55dGhpbmcgdG8gT3BzLgordm9pZCBQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludChTRFZhbHVlIE9wLCBjaGFyIExldHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4mT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBTRFZhbHVlIFJlc3VsdCgwLDApOworICBzd2l0Y2ggKExldHRlcikgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSAnSSc6CisgIGNhc2UgJ0onOgorICBjYXNlICdLJzoKKyAgY2FzZSAnTCc6CisgIGNhc2UgJ00nOgorICBjYXNlICdOJzoKKyAgY2FzZSAnTyc6CisgIGNhc2UgJ1AnOiB7CisgICAgQ29uc3RhbnRTRE5vZGUgKkNTVCA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcCk7CisgICAgaWYgKCFDU1QpIHJldHVybjsgLy8gTXVzdCBiZSBhbiBpbW1lZGlhdGUgdG8gbWF0Y2guCisgICAgdW5zaWduZWQgVmFsdWUgPSBDU1QtPmdldFpFeHRWYWx1ZSgpOworICAgIHN3aXRjaCAoTGV0dGVyKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBjb25zdHJhaW50IGxldHRlciEiKTsKKyAgICBjYXNlICdJJzogIC8vICJJIiBpcyBhIHNpZ25lZCAxNi1iaXQgY29uc3RhbnQuCisgICAgICBpZiAoKHNob3J0KVZhbHVlID09IChpbnQpVmFsdWUpCisgICAgICAgIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRDb25zdGFudChWYWx1ZSwgT3AuZ2V0VmFsdWVUeXBlKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnSic6ICAvLyAiSiIgaXMgYSBjb25zdGFudCB3aXRoIG9ubHkgdGhlIGhpZ2gtb3JkZXIgMTYgYml0cyBub256ZXJvLgorICAgIGNhc2UgJ0wnOiAgLy8gIkwiIGlzIGEgc2lnbmVkIDE2LWJpdCBjb25zdGFudCBzaGlmdGVkIGxlZnQgMTYgYml0cy4KKyAgICAgIGlmICgoc2hvcnQpVmFsdWUgPT0gMCkKKyAgICAgICAgUmVzdWx0ID0gREFHLmdldFRhcmdldENvbnN0YW50KFZhbHVlLCBPcC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdLJzogIC8vICJLIiBpcyBhIGNvbnN0YW50IHdpdGggb25seSB0aGUgbG93LW9yZGVyIDE2IGJpdHMgbm9uemVyby4KKyAgICAgIGlmICgoVmFsdWUgPj4gMTYpID09IDApCisgICAgICAgIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRDb25zdGFudChWYWx1ZSwgT3AuZ2V0VmFsdWVUeXBlKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnTSc6ICAvLyAiTSIgaXMgYSBjb25zdGFudCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiAzMS4KKyAgICAgIGlmIChWYWx1ZSA+IDMxKQorICAgICAgICBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoVmFsdWUsIE9wLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ04nOiAgLy8gIk4iIGlzIGEgcG9zaXRpdmUgY29uc3RhbnQgdGhhdCBpcyBhbiBleGFjdCBwb3dlciBvZiB0d28uCisgICAgICBpZiAoKGludClWYWx1ZSA+IDAgJiYgaXNQb3dlck9mMl8zMihWYWx1ZSkpCisgICAgICAgIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRDb25zdGFudChWYWx1ZSwgT3AuZ2V0VmFsdWVUeXBlKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnTyc6ICAvLyAiTyIgaXMgdGhlIGNvbnN0YW50IHplcm8uCisgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgUmVzdWx0ID0gREFHLmdldFRhcmdldENvbnN0YW50KFZhbHVlLCBPcC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdQJzogIC8vICJQIiBpcyBhIGNvbnN0YW50IHdob3NlIG5lZ2F0aW9uIGlzIGEgc2lnbmVkIDE2LWJpdCBjb25zdGFudC4KKyAgICAgIGlmICgoc2hvcnQpLVZhbHVlID09IChpbnQpLVZhbHVlKQorICAgICAgICBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoVmFsdWUsIE9wLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICB9CisKKyAgaWYgKFJlc3VsdC5nZXROb2RlKCkpIHsKKyAgICBPcHMucHVzaF9iYWNrKFJlc3VsdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSGFuZGxlIHN0YW5kYXJkIGNvbnN0cmFpbnQgbGV0dGVycy4KKyAgVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQXNtT3BlcmFuZEZvckNvbnN0cmFpbnQoT3AsIExldHRlciwgT3BzLCBEQUcpOworfQorCisvLyBpc0xlZ2FsQWRkcmVzc2luZ01vZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzc2luZyBtb2RlIHJlcHJlc2VudGVkCisvLyBieSBBTSBpcyBsZWdhbCBmb3IgdGhpcyB0YXJnZXQsIGZvciBhIGxvYWQvc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorYm9vbCBQUENUYXJnZXRMb3dlcmluZzo6aXNMZWdhbEFkZHJlc3NpbmdNb2RlKGNvbnN0IEFkZHJNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpUeSkgY29uc3QgeworICAvLyBGSVhNRTogUFBDIGRvZXMgbm90IGFsbG93IHIraSBhZGRyZXNzaW5nIG1vZGVzIGZvciB2ZWN0b3JzIQorCisgIC8vIFBQQyBhbGxvd3MgYSBzaWduLWV4dGVuZGVkIDE2LWJpdCBpbW1lZGlhdGUgZmllbGQuCisgIGlmIChBTS5CYXNlT2ZmcyA8PSAtKDFMTCA8PCAxNikgfHwgQU0uQmFzZU9mZnMgPj0gKDFMTCA8PCAxNiktMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gTm8gZ2xvYmFsIGlzIGV2ZXIgYWxsb3dlZCBhcyBhIGJhc2UuCisgIGlmIChBTS5CYXNlR1YpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFBQQyBvbmx5IHN1cHBvcnQgcityLAorICBzd2l0Y2ggKEFNLlNjYWxlKSB7CisgIGNhc2UgMDogIC8vICJyK2kiIG9yIGp1c3QgImkiLCBkZXBlbmRpbmcgb24gSGFzQmFzZVJlZy4KKyAgICBicmVhazsKKyAgY2FzZSAxOgorICAgIGlmIChBTS5IYXNCYXNlUmVnICYmIEFNLkJhc2VPZmZzKSAgLy8gInIrcitpIiBpcyBub3QgYWxsb3dlZC4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBPdGhlcndpc2Ugd2UgaGF2ZSByK3Igb3IgcitpLgorICAgIGJyZWFrOworICBjYXNlIDI6CisgICAgaWYgKEFNLkhhc0Jhc2VSZWcgfHwgQU0uQmFzZU9mZnMpICAvLyAyKnIrciAgb3IgIDIqcitpIGlzIG5vdCBhbGxvd2VkLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEFsbG93IDIqciBhcyByK3IuCisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgLy8gTm8gb3RoZXIgc2NhbGVzIGFyZSBzdXBwb3J0ZWQuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc0xlZ2FsQWRkcmVzc0ltbWVkaWF0ZSAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGNhbiBiZSB1c2VkCisvLy8gYXMgdGhlIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGFkZHJlc3NpbmcgbW9kZSBmb3IgbG9hZCAvIHN0b3JlIG9mIHRoZQorLy8vIGdpdmVuIHR5cGUuCitib29sIFBQQ1RhcmdldExvd2VyaW5nOjppc0xlZ2FsQWRkcmVzc0ltbWVkaWF0ZShpbnQ2NF90IFYsY29uc3QgVHlwZSAqVHkpIGNvbnN0eworICAvLyBQUEMgYWxsb3dzIGEgc2lnbi1leHRlbmRlZCAxNi1iaXQgaW1tZWRpYXRlIGZpZWxkLgorICByZXR1cm4gKFYgPiAtKDEgPDwgMTYpICYmIFYgPCAoMSA8PCAxNiktMSk7Cit9CisKK2Jvb2wgUFBDVGFyZ2V0TG93ZXJpbmc6OmlzTGVnYWxBZGRyZXNzSW1tZWRpYXRlKGxsdm06Okdsb2JhbFZhbHVlKiBHVikgY29uc3QgeworICByZXR1cm4gZmFsc2U7Cit9CisKK1NEVmFsdWUgUFBDVGFyZ2V0TG93ZXJpbmc6Okxvd2VyUkVUVVJOQUREUihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBNRkktPnNldFJldHVybkFkZHJlc3NJc1Rha2VuKHRydWUpOworCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgRGVwdGggPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDApKS0+Z2V0WkV4dFZhbHVlKCk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBvcHRpbWl6ZSBhd2F5IHRoZSBzdG9yZSBvZiB0aGUgUkEgdG8KKyAgLy8gdGhlIHN0YWNrLgorICBQUENGdW5jdGlvbkluZm8gKkZ1bmNJbmZvID0gTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCk7CisgIEZ1bmNJbmZvLT5zZXRMUlN0b3JlUmVxdWlyZWQoKTsKKyAgYm9vbCBpc1BQQzY0ID0gUFBDU3ViVGFyZ2V0LmlzUFBDNjQoKTsKKyAgYm9vbCBpc0RhcndpbkFCSSA9IFBQQ1N1YlRhcmdldC5pc0RhcndpbkFCSSgpOworCisgIGlmIChEZXB0aCA+IDApIHsKKyAgICBTRFZhbHVlIEZyYW1lQWRkciA9IExvd2VyRlJBTUVBRERSKE9wLCBEQUcpOworICAgIFNEVmFsdWUgT2Zmc2V0ID0KKyAgICAKKyAgICAgIERBRy5nZXRDb25zdGFudChQUENGcmFtZUluZm86OmdldFJldHVyblNhdmVPZmZzZXQoaXNQUEM2NCwgaXNEYXJ3aW5BQkkpLAorICAgICAgICAgICAgICAgICAgICAgIGlzUFBDNjQ/IE1WVDo6aTY0IDogTVZUOjppMzIpOworICAgIHJldHVybiBEQUcuZ2V0TG9hZChnZXRQb2ludGVyVHkoKSwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVBZGRyLCBPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworICB9CisKKyAgLy8gSnVzdCBsb2FkIHRoZSByZXR1cm4gYWRkcmVzcyBvZmYgdGhlIHN0YWNrLgorICBTRFZhbHVlIFJldEFkZHJGSSA9IGdldFJldHVybkFkZHJGcmFtZUluZGV4KERBRyk7CisgIHJldHVybiBEQUcuZ2V0TG9hZChnZXRQb2ludGVyVHkoKSwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIFJldEFkZHJGSSwgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKK30KKworU0RWYWx1ZSBQUENUYXJnZXRMb3dlcmluZzo6TG93ZXJGUkFNRUFERFIoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgRGVwdGggPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDApKS0+Z2V0WkV4dFZhbHVlKCk7CisKKyAgRVZUIFB0clZUID0gREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLmdldFBvaW50ZXJUeSgpOworICBib29sIGlzUFBDNjQgPSBQdHJWVCA9PSBNVlQ6Omk2NDsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTUZJLT5zZXRGcmFtZUFkZHJlc3NJc1Rha2VuKHRydWUpOworICBib29sIGlzMzEgPSAoRGlzYWJsZUZyYW1lUG9pbnRlckVsaW0oTUYpIHx8IE1GSS0+aGFzVmFyU2l6ZWRPYmplY3RzKCkpICYmCisgICAgICAgICAgICAgICAgICBNRkktPmdldFN0YWNrU2l6ZSgpICYmCisgICAgICAgICAgICAgICAgICAhTUYuZ2V0RnVuY3Rpb24oKS0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6TmFrZWQpOworICB1bnNpZ25lZCBGcmFtZVJlZyA9IGlzUFBDNjQgPyAoaXMzMSA/IFBQQzo6WDMxIDogUFBDOjpYMSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXMzMSA/IFBQQzo6UjMxIDogUFBDOjpSMSk7CisgIFNEVmFsdWUgRnJhbWVBZGRyID0gREFHLmdldENvcHlGcm9tUmVnKERBRy5nZXRFbnRyeU5vZGUoKSwgZGwsIEZyYW1lUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJWVCk7CisgIHdoaWxlIChEZXB0aC0tKQorICAgIEZyYW1lQWRkciA9IERBRy5nZXRMb2FkKE9wLmdldFZhbHVlVHlwZSgpLCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lQWRkciwgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgcmV0dXJuIEZyYW1lQWRkcjsKK30KKworYm9vbAorUFBDVGFyZ2V0TG93ZXJpbmc6OmlzT2Zmc2V0Rm9sZGluZ0xlZ2FsKGNvbnN0IEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBKSBjb25zdCB7CisgIC8vIFRoZSBQb3dlclBDIHRhcmdldCBpc24ndCB5ZXQgYXdhcmUgb2Ygb2Zmc2V0cy4KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gZ2V0T3B0aW1hbE1lbU9wVHlwZSAtIFJldHVybnMgdGhlIHRhcmdldCBzcGVjaWZpYyBvcHRpbWFsIHR5cGUgZm9yIGxvYWQKKy8vLyBhbmQgc3RvcmUgb3BlcmF0aW9ucyBhcyBhIHJlc3VsdCBvZiBtZW1zZXQsIG1lbWNweSwgYW5kIG1lbW1vdmUKKy8vLyBsb3dlcmluZy4gSWYgRHN0QWxpZ24gaXMgemVybyB0aGF0IG1lYW5zIGl0J3Mgc2FmZSB0byBkZXN0aW5hdGlvbgorLy8vIGFsaWdubWVudCBjYW4gc2F0aXNmeSBhbnkgY29uc3RyYWludC4gU2ltaWxhcmx5IGlmIFNyY0FsaWduIGlzIHplcm8gaXQKKy8vLyBtZWFucyB0aGVyZSBpc24ndCBhIG5lZWQgdG8gY2hlY2sgaXQgYWdhaW5zdCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQsCisvLy8gcHJvYmFibHkgYmVjYXVzZSB0aGUgc291cmNlIGRvZXMgbm90IG5lZWQgdG8gYmUgbG9hZGVkLiBJZgorLy8vICdOb25TY2FsYXJJbnRTYWZlJyBpcyB0cnVlLCB0aGF0IG1lYW5zIGl0J3Mgc2FmZSB0byByZXR1cm4gYQorLy8vIG5vbi1zY2FsYXItaW50ZWdlciB0eXBlLCBlLmcuIGVtcHR5IHN0cmluZyBzb3VyY2UsIGNvbnN0YW50LCBvciBsb2FkZWQKKy8vLyBmcm9tIG1lbW9yeS4gJ01lbWNweVN0clNyYycgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1lbWNweSBzb3VyY2UgaXMKKy8vLyBjb25zdGFudCBzbyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGxvYWRlZC4KKy8vLyBJdCByZXR1cm5zIEVWVDo6T3RoZXIgaWYgdGhlIHR5cGUgc2hvdWxkIGJlIGRldGVybWluZWQgdXNpbmcgZ2VuZXJpYworLy8vIHRhcmdldC1pbmRlcGVuZGVudCBsb2dpYy4KK0VWVCBQUENUYXJnZXRMb3dlcmluZzo6Z2V0T3B0aW1hbE1lbU9wVHlwZSh1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdEFsaWduLCB1bnNpZ25lZCBTcmNBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5vblNjYWxhckludFNhZmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNZW1jcHlTdHJTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBpZiAodGhpcy0+UFBDU3ViVGFyZ2V0LmlzUFBDNjQoKSkgeworICAgIHJldHVybiBNVlQ6Omk2NDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTVZUOjppMzI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJU2VsTG93ZXJpbmcuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJU2VsTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDA4MTZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0lTZWxMb3dlcmluZy5oCkBAIC0wLDAgKzEsNDgyIEBACisvLz09PS0tIFBQQ0lTZWxMb3dlcmluZy5oIC0gUFBDMzIgREFHIExvd2VyaW5nIEludGVyZmFjZSAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgUFBDIHVzZXMgdG8gbG93ZXIgTExWTSBjb2RlIGludG8gYQorLy8gc2VsZWN0aW9uIERBRy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1BPV0VSUENfUFBDMzJJU0VMTE9XRVJJTkdfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9QT1dFUlBDX1BQQzMySVNFTExPV0VSSU5HX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgIlBQQy5oIgorI2luY2x1ZGUgIlBQQ1N1YnRhcmdldC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIG5hbWVzcGFjZSBQUENJU0QgeworICAgIGVudW0gTm9kZVR5cGUgeworICAgICAgLy8gU3RhcnQgdGhlIG51bWJlcmluZyB3aGVyZSB0aGUgYnVpbHRpbiBvcHMgYW5kIHRhcmdldCBvcHMgbGVhdmUgb2ZmLgorICAgICAgRklSU1RfTlVNQkVSID0gSVNEOjpCVUlMVElOX09QX0VORCwKKworICAgICAgLy8vIEZTRUwgLSBUcmFkaXRpb25hbCB0aHJlZS1vcGVyYW5kIGZzZWwgbm9kZS4KKyAgICAgIC8vLworICAgICAgRlNFTCwKKyAgICAgIAorICAgICAgLy8vIEZDRklEIC0gVGhlIEZDRklEIGluc3RydWN0aW9uLCB0YWtpbmcgYW4gZjY0IG9wZXJhbmQgYW5kIHByb2R1Y2luZworICAgICAgLy8vIGFuZCBmNjQgdmFsdWUgY29udGFpbmluZyB0aGUgRlAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludGVnZXIgdGhhdAorICAgICAgLy8vIHdhcyB0ZW1wb3JhcmlseSBpbiB0aGUgZjY0IG9wZXJhbmQuCisgICAgICBGQ0ZJRCwKKyAgICAgIAorICAgICAgLy8vIEZDVElbRCxXXVogLSBUaGUgRkNUSURaIGFuZCBGQ1RJV1ogaW5zdHJ1Y3Rpb25zLCB0YWtpbmcgYW4gZjMyIG9yIGY2NCAKKyAgICAgIC8vLyBvcGVyYW5kLCBwcm9kdWNpbmcgYW4gZjY0IHZhbHVlIGNvbnRhaW5pbmcgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24KKyAgICAgIC8vLyBvZiB0aGF0IEZQIHZhbHVlLgorICAgICAgRkNUSURaLCBGQ1RJV1osCisgICAgICAKKyAgICAgIC8vLyBTVEZJV1ggLSBUaGUgU1RGSVdYIGluc3RydWN0aW9uLiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMgYW4gaW5wdXQgdG9rZW4KKyAgICAgIC8vLyBjaGFpbiwgdGhlbiBhbiBmNjQgdmFsdWUgdG8gc3RvcmUsIHRoZW4gYW4gYWRkcmVzcyB0byBzdG9yZSBpdCB0by4KKyAgICAgIFNURklXWCwKKyAgICAgIAorICAgICAgLy8gVk1BRERGUCwgVk5NU1VCRlAgLSBUaGUgVk1BRERGUCBhbmQgVk5NU1VCRlAgaW5zdHJ1Y3Rpb25zLCB0YWtpbmcKKyAgICAgIC8vIHRocmVlIHY0ZjMyIG9wZXJhbmRzIGFuZCBwcm9kdWNpbmcgYSB2NGYzMiByZXN1bHQuCisgICAgICBWTUFEREZQLCBWTk1TVUJGUCwKKyAgICAgIAorICAgICAgLy8vIFZQRVJNIC0gVGhlIFBQQyBWUEVSTSBJbnN0cnVjdGlvbi4KKyAgICAgIC8vLworICAgICAgVlBFUk0sCisgICAgICAKKyAgICAgIC8vLyBIaS9MbyAtIFRoZXNlIHJlcHJlc2VudCB0aGUgaGlnaCBhbmQgbG93IDE2LWJpdCBwYXJ0cyBvZiBhIGdsb2JhbAorICAgICAgLy8vIGFkZHJlc3MgcmVzcGVjdGl2ZWx5LiAgVGhlc2Ugbm9kZXMgaGF2ZSB0d28gb3BlcmFuZHMsIHRoZSBmaXJzdCBvZgorICAgICAgLy8vIHdoaWNoIG11c3QgYmUgYSBUYXJnZXRHbG9iYWxBZGRyZXNzLCBhbmQgdGhlIHNlY29uZCBvZiB3aGljaCBtdXN0IGJlIGEKKyAgICAgIC8vLyBDb25zdGFudC4gIFNlbGVjdGVkIG5haXZlbHksIHRoZXNlIHR1cm4gaW50byAnbGlzIEcrQycgYW5kICdsaSBHK0MnLAorICAgICAgLy8vIHRob3VnaCB0aGVzZSBhcmUgdXN1YWxseSBmb2xkZWQgaW50byBvdGhlciBub2Rlcy4KKyAgICAgIEhpLCBMbywKKyAgICAgIAorICAgICAgVE9DX0VOVFJZLAorCisgICAgICAvLy8gVGhlIGZvbGxvd2luZyB0aHJlZSB0YXJnZXQtc3BlY2lmaWMgbm9kZXMgYXJlIHVzZWQgZm9yIGNhbGxzIHRocm91Z2gKKyAgICAgIC8vLyBmdW5jdGlvbiBwb2ludGVycyBpbiB0aGUgNjQtYml0IFNWUjQgQUJJLgorCisgICAgICAvLy8gUmVzdG9yZSB0aGUgVE9DIGZyb20gdGhlIFRPQyBzYXZlIGFyZWEgb2YgdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUuCisgICAgICAvLy8gVGhpcyBpcyBiYXNpY2FsbHkgYSBoYXJkIGNvZGVkIGxvYWQgaW5zdHJ1Y3Rpb24gd2hpY2ggYWRkaXRpb25hbGx5CisgICAgICAvLy8gdGFrZXMvcHJvZHVjZXMgYSBmbGFnLgorICAgICAgVE9DX1JFU1RPUkUsCisKKyAgICAgIC8vLyBMaWtlIGEgcmVndWxhciBMT0FEIGJ1dCBhZGRpdGlvbmFsbHkgdGFraW5nL3Byb2R1Y2luZyBhIGZsYWcuCisgICAgICBMT0FELAorCisgICAgICAvLy8gTE9BRCBpbnRvIHIyIChhbHNvIHRha2luZy9wcm9kdWNpbmcgYSBmbGFnKS4gTGlrZSBUT0NfUkVTVE9SRSwgdGhpcyBpcworICAgICAgLy8vIGEgaGFyZCBjb2RlZCBsb2FkIGluc3RydWN0aW9uLgorICAgICAgTE9BRF9UT0MsCisKKyAgICAgIC8vLyBPUFJDLCBDSEFJTiA9IERZTkFMTE9DKENIQUlOLCBORUdTSVpFLCBGUkFNRV9JTkRFWCkKKyAgICAgIC8vLyBUaGlzIGluc3RydWN0aW9uIGlzIGxvd2VyZWQgaW4gUFBDUmVnaXN0ZXJJbmZvOjplbGltaW5hdGVGcmFtZUluZGV4IHRvCisgICAgICAvLy8gY29tcHV0ZSBhbiBhbGxvY2F0aW9uIG9uIHRoZSBzdGFjay4KKyAgICAgIERZTkFMTE9DLAorICAgICAgCisgICAgICAvLy8gR2xvYmFsQmFzZVJlZyAtIE9uIERhcndpbiwgdGhpcyBub2RlIHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUgbWZscgorICAgICAgLy8vIGF0IGZ1bmN0aW9uIGVudHJ5LCB1c2VkIGZvciBQSUMgY29kZS4KKyAgICAgIEdsb2JhbEJhc2VSZWcsCisgICAgICAKKyAgICAgIC8vLyBUaGVzZSBub2RlcyByZXByZXNlbnQgdGhlIDMyLWJpdCBQUEMgc2hpZnRzIHRoYXQgb3BlcmF0ZSBvbiA2LWJpdAorICAgICAgLy8vIHNoaWZ0IGFtb3VudHMuICBUaGVzZSBub2RlcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBtdWx0aS1wcmVjaXNpb24gc2hpZnQKKyAgICAgIC8vLyBjb2RlLgorICAgICAgU1JMLCBTUkEsIFNITCwKKyAgICAgIAorICAgICAgLy8vIEVYVFNXXzMyIC0gVGhpcyBpcyB0aGUgRVhUU1cgaW5zdHJ1Y3Rpb24gZm9yIHVzZSB3aXRoICIzMi1iaXQiCisgICAgICAvLy8gcmVnaXN0ZXJzLgorICAgICAgRVhUU1dfMzIsCisKKyAgICAgIC8vLyBDQUxMIC0gQSBkaXJlY3QgZnVuY3Rpb24gY2FsbC4KKyAgICAgIENBTExfRGFyd2luLCBDQUxMX1NWUjQsCisgICAgICAKKyAgICAgIC8vLyBOT1AgLSBTcGVjaWFsIE5PUCB3aGljaCBmb2xsb3dzIDY0LWJpdCBTVlI0IGNhbGxzLgorICAgICAgTk9QLAorCisgICAgICAvLy8gQ0hBSU4sRkxBRyA9IE1UQ1RSKFZBTCwgQ0hBSU5bLCBJTkZMQUddKSAtIERpcmVjdGx5IGNvcnJlc3BvbmRzIHRvIGEKKyAgICAgIC8vLyBNVENUUiBpbnN0cnVjdGlvbi4KKyAgICAgIE1UQ1RSLAorICAgICAgCisgICAgICAvLy8gQ0hBSU4sRkxBRyA9IEJDVFJMKENIQUlOLCBJTkZMQUcpIC0gRGlyZWN0bHkgY29ycmVzcG9uZHMgdG8gYQorICAgICAgLy8vIEJDVFJMIGluc3RydWN0aW9uLgorICAgICAgQkNUUkxfRGFyd2luLCBCQ1RSTF9TVlI0LAorICAgICAgCisgICAgICAvLy8gUmV0dXJuIHdpdGggYSBmbGFnIG9wZXJhbmQsIG1hdGNoZWQgYnkgJ2JscicKKyAgICAgIFJFVF9GTEFHLAorICAgICAgCisgICAgICAvLy8gUjMyID0gTUZDUihDUlJFRywgSU5GTEFHKSAtIFJlcHJlc2VudHMgdGhlIE1GQ1Jwc2V1ZC9NRk9DUkYKKyAgICAgIC8vLyBpbnN0cnVjdGlvbnMuICBUaGlzIGNvcGllcyB0aGUgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgIC8vLyBDUlJFRyBpbnRvIHRoZSByZXN1bHRhbnQgR1BSLiAgQml0cyBjb3JyZXNwb25kaW5nIHRvIG90aGVyIENSIHJlZ3MKKyAgICAgIC8vLyBhcmUgdW5kZWZpbmVkLgorICAgICAgTUZDUiwKKworICAgICAgLy8vIFJFU1ZFQyA9IFZDTVAoTEhTLCBSSFMsIE9QQykgLSBSZXByZXNlbnRzIG9uZSBvZiB0aGUgYWx0aXZlYyBWQ01QKgorICAgICAgLy8vIGluc3RydWN0aW9ucy4gIEZvciBsYWNrIG9mIGJldHRlciBudW1iZXIsIHdlIHVzZSB0aGUgb3Bjb2RlIG51bWJlcgorICAgICAgLy8vIGVuY29kaW5nIGZvciB0aGUgT1BDIGZpZWxkIHRvIGlkZW50aWZ5IHRoZSBjb21wYXJlLiAgRm9yIGV4YW1wbGUsIDgzOAorICAgICAgLy8vIGlzIFZDTVBHVFNILgorICAgICAgVkNNUCwKKyAgICAgIAorICAgICAgLy8vIFJFU1ZFQywgT1VURkxBRyA9IFZDTVBvKExIUywgUkhTLCBPUEMpIC0gUmVwcmVzZW50cyBvbmUgb2YgdGhlCisgICAgICAvLy8gYWx0aXZlYyBWQ01QKm8gaW5zdHJ1Y3Rpb25zLiAgRm9yIGxhY2sgb2YgYmV0dGVyIG51bWJlciwgd2UgdXNlIHRoZSAKKyAgICAgIC8vLyBvcGNvZGUgbnVtYmVyIGVuY29kaW5nIGZvciB0aGUgT1BDIGZpZWxkIHRvIGlkZW50aWZ5IHRoZSBjb21wYXJlLiAgRm9yCisgICAgICAvLy8gZXhhbXBsZSwgODM4IGlzIFZDTVBHVFNILgorICAgICAgVkNNUG8sCisgICAgICAKKyAgICAgIC8vLyBDSEFJTiA9IENPTkRfQlJBTkNIIENIQUlOLCBDUlJDLCBPUEMsIERFU1RCQiBbLCBJTkZMQUddIC0gVGhpcworICAgICAgLy8vIGNvcnJlc3BvbmRzIHRvIHRoZSBDT05EX0JSQU5DSCBwc2V1ZG8gaW5zdHJ1Y3Rpb24uICBDUlJDIGlzIHRoZQorICAgICAgLy8vIGNvbmRpdGlvbiByZWdpc3RlciB0byBicmFuY2ggb24sIE9QQyBpcyB0aGUgYnJhbmNoIG9wY29kZSB0byB1c2UgKGUuZy4KKyAgICAgIC8vLyBQUEM6OkJMRSksIERFU1RCQiBpcyB0aGUgZGVzdGluYXRpb24gYmxvY2sgdG8gYnJhbmNoIHRvLCBhbmQgSU5GTEFHIGlzCisgICAgICAvLy8gYW4gb3B0aW9uYWwgaW5wdXQgZmxhZyBhcmd1bWVudC4KKyAgICAgIENPTkRfQlJBTkNILAorICAgICAgCisgICAgICAvLyBUaGUgZm9sbG93aW5nIDUgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIG9ubHkgYXMgcGFydCBvZiB0aGUKKyAgICAgIC8vIGxvbmcgZG91YmxlLXRvLWludCBjb252ZXJzaW9uIHNlcXVlbmNlLgorCisgICAgICAvLy8gT1VURkxBRyA9IE1GRlMgRjhSQyAtIFRoaXMgbW92ZXMgdGhlIEZQU0NSIChub3QgbW9kZWxsZWQpIGludG8gdGhlCisgICAgICAvLy8gcmVnaXN0ZXIuCisgICAgICBNRkZTLAorCisgICAgICAvLy8gT1VURkxBRyA9IE1URlNCMCBJTkZMQUcgLSBUaGlzIGNsZWFycyBhIGJpdCBpbiB0aGUgRlBTQ1IuCisgICAgICBNVEZTQjAsCisKKyAgICAgIC8vLyBPVVRGTEFHID0gTVRGU0IxIElORkxBRyAtIFRoaXMgc2V0cyBhIGJpdCBpbiB0aGUgRlBTQ1IuCisgICAgICBNVEZTQjEsCisKKyAgICAgIC8vLyBGOFJDLCBPVVRGTEFHID0gRkFERFJUWiBGOFJDLCBGOFJDLCBJTkZMQUcgLSBUaGlzIGlzIGFuIEZBREQgZG9uZSB3aXRoCisgICAgICAvLy8gcm91bmRpbmcgdG93YXJkcyB6ZXJvLiAgSXQgaGFzIGZsYWdzIGFkZGVkIHNvIGl0IHdvbid0IG1vdmUgcGFzdCB0aGUgCisgICAgICAvLy8gRlBTQ1Itc2V0dGluZyBpbnN0cnVjdGlvbnMuCisgICAgICBGQUREUlRaLAorCisgICAgICAvLy8gTVRGU0YgPSBGOFJDLCBJTkZMQUcgLSBUaGlzIG1vdmVzIHRoZSByZWdpc3RlciBpbnRvIHRoZSBGUFNDUi4KKyAgICAgIE1URlNGLAorCisgICAgICAvLy8gTEFSWCA9IFRoaXMgY29ycmVzcG9uZHMgdG8gUFBDIGx7d3xkfWFyeCBpbnN0cmN1dGlvbjogbG9hZCBhbmQKKyAgICAgIC8vLyByZXNlcnZlIGluZGV4ZWQuIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXRvbWljIG9wZXJhdGlvbnMuCisgICAgICBMQVJYLAorCisgICAgICAvLy8gU1RDWCA9IFRoaXMgY29ycmVzcG9uZHMgdG8gUFBDIHN0Y3guIGluc3RyY3V0aW9uOiBzdG9yZSBjb25kaXRpb25hbAorICAgICAgLy8vIGluZGV4ZWQuIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXRvbWljIG9wZXJhdGlvbnMuCisgICAgICBTVENYLAorCisgICAgICAvLy8gVENfUkVUVVJOIC0gQSB0YWlsIGNhbGwgcmV0dXJuLgorICAgICAgLy8vICAgb3BlcmFuZCAjMCBjaGFpbgorICAgICAgLy8vICAgb3BlcmFuZCAjMSBjYWxsZWUgKHJlZ2lzdGVyIG9yIGFic29sdXRlKQorICAgICAgLy8vICAgb3BlcmFuZCAjMiBzdGFjayBhZGp1c3RtZW50CisgICAgICAvLy8gICBvcGVyYW5kICMzIG9wdGlvbmFsIGluIGZsYWcKKyAgICAgIFRDX1JFVFVSTiwKKworICAgICAgLy8vIFNURF8zMiAtIFRoaXMgaXMgdGhlIFNURCBpbnN0cnVjdGlvbiBmb3IgdXNlIHdpdGggIjMyLWJpdCIgcmVnaXN0ZXJzLgorICAgICAgU1REXzMyID0gSVNEOjpGSVJTVF9UQVJHRVRfTUVNT1JZX09QQ09ERSwKKyAgICAgIAorICAgICAgLy8vIENIQUlOID0gU1RCUlggQ0hBSU4sIEdQUkMsIFB0ciwgVHlwZSAtIFRoaXMgaXMgYSAKKyAgICAgIC8vLyBieXRlLXN3YXBwaW5nIHN0b3JlIGluc3RydWN0aW9uLiAgSXQgYnl0ZS1zd2FwcyB0aGUgbG93ICJUeXBlIiBiaXRzIG9mCisgICAgICAvLy8gdGhlIEdQUkMgaW5wdXQsIHRoZW4gc3RvcmVzIGl0IHRocm91Z2ggUHRyLiAgVHlwZSBjYW4gYmUgZWl0aGVyIGkxNiBvcgorICAgICAgLy8vIGkzMi4KKyAgICAgIFNUQlJYLCAKKyAgICAgIAorICAgICAgLy8vIEdQUkMsIENIQUlOID0gTEJSWCBDSEFJTiwgUHRyLCBUeXBlIC0gVGhpcyBpcyBhIAorICAgICAgLy8vIGJ5dGUtc3dhcHBpbmcgbG9hZCBpbnN0cnVjdGlvbi4gIEl0IGxvYWRzICJUeXBlIiBiaXRzLCBieXRlIHN3YXBzIGl0LAorICAgICAgLy8vIHRoZW4gcHV0cyBpdCBpbiB0aGUgYm90dG9tIGJpdHMgb2YgdGhlIEdQUkMuICBUWVBFIGNhbiBiZSBlaXRoZXIgaTE2CisgICAgICAvLy8gb3IgaTMyLgorICAgICAgTEJSWAorICAgIH07CisgIH0KKworICAvLy8gRGVmaW5lIHNvbWUgcHJlZGljYXRlcyB0aGF0IGFyZSB1c2VkIGZvciBub2RlIG1hdGNoaW5nLgorICBuYW1lc3BhY2UgUFBDIHsKKyAgICAvLy8gaXNWUEtVSFVNU2h1ZmZsZU1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzaHVmZmxlIG1hc2sgZm9yIGEKKyAgICAvLy8gVlBLVUhVTSBpbnN0cnVjdGlvbi4KKyAgICBib29sIGlzVlBLVUhVTVNodWZmbGVNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4sIGJvb2wgaXNVbmFyeSk7CisgICAgCisgICAgLy8vIGlzVlBLVVdVTVNodWZmbGVNYXNrIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgc2h1ZmZsZSBtYXNrIGZvciBhCisgICAgLy8vIFZQS1VXVU0gaW5zdHJ1Y3Rpb24uCisgICAgYm9vbCBpc1ZQS1VXVU1TaHVmZmxlTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOLCBib29sIGlzVW5hcnkpOworCisgICAgLy8vIGlzVk1SR0xTaHVmZmxlTWFzayAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBzaHVmZmxlIG1hc2sgc3VpdGFibGUgZm9yCisgICAgLy8vIGEgVlJHTCogaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHVuaXQgc2l6ZSAoMSwyIG9yIDQgYnl0ZXMpLgorICAgIGJvb2wgaXNWTVJHTFNodWZmbGVNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4sIHVuc2lnbmVkIFVuaXRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNVbmFyeSk7CisKKyAgICAvLy8gaXNWTVJHSFNodWZmbGVNYXNrIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHNodWZmbGUgbWFzayBzdWl0YWJsZSBmb3IKKyAgICAvLy8gYSBWUkdIKiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgdW5pdCBzaXplICgxLDIgb3IgNCBieXRlcykuCisgICAgYm9vbCBpc1ZNUkdIU2h1ZmZsZU1hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTiwgdW5zaWduZWQgVW5pdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1VuYXJ5KTsKKyAgICAKKyAgICAvLy8gaXNWU0xET0lTaHVmZmxlTWFzayAtIElmIHRoaXMgaXMgYSB2c2xkb2kgc2h1ZmZsZSBtYXNrLCByZXR1cm4gdGhlIHNoaWZ0CisgICAgLy8vIGFtb3VudCwgb3RoZXJ3aXNlIHJldHVybiAtMS4KKyAgICBpbnQgaXNWU0xET0lTaHVmZmxlTWFzayhTRE5vZGUgKk4sIGJvb2wgaXNVbmFyeSk7CisgICAgCisgICAgLy8vIGlzU3BsYXRTaHVmZmxlTWFzayAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgb3BlcmFuZAorICAgIC8vLyBzcGVjaWZpZXMgYSBzcGxhdCBvZiBhIHNpbmdsZSBlbGVtZW50IHRoYXQgaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvCisgICAgLy8vIFZTUExUQi9WU1BMVEgvVlNQTFRXLgorICAgIGJvb2wgaXNTcGxhdFNodWZmbGVNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4sIHVuc2lnbmVkIEVsdFNpemUpOworICAgIAorICAgIC8vLyBpc0FsbE5lZ2F0aXZlWmVyb1ZlY3RvciAtIFJldHVybnMgdHJ1ZSBpZiBhbGwgZWxlbWVudHMgb2YgYnVpbGRfdmVjdG9yCisgICAgLy8vIGFyZSAtMC4wLgorICAgIGJvb2wgaXNBbGxOZWdhdGl2ZVplcm9WZWN0b3IoU0ROb2RlICpOKTsKKworICAgIC8vLyBnZXRWU1BMVEltbWVkaWF0ZSAtIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgVlNQTFQqIGltbWVkaWF0ZSB0byBzcGxhdCB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGlzU3BsYXRTaHVmZmxlTWFzayBWRUNUT1JfU0hVRkZMRSBtYXNrLgorICAgIHVuc2lnbmVkIGdldFZTUExUSW1tZWRpYXRlKFNETm9kZSAqTiwgdW5zaWduZWQgRWx0U2l6ZSk7CisgICAgCisgICAgLy8vIGdldF9WU1BMVElfZWx0IC0gSWYgdGhpcyBpcyBhIGJ1aWxkX3ZlY3RvciBvZiBjb25zdGFudHMgd2hpY2ggY2FuIGJlCisgICAgLy8vIGZvcm1lZCBieSB1c2luZyBhIHZzcGx0aXNbYmh3XSBpbnN0cnVjdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAvLy8gc2l6ZSwgcmV0dXJuIHRoZSBjb25zdGFudCBiZWluZyBzcGxhdHRlZC4gIFRoZSBCeXRlU2l6ZSBmaWVsZCBpbmRpY2F0ZXMKKyAgICAvLy8gdGhlIG51bWJlciBvZiBieXRlcyBvZiBlYWNoIGVsZW1lbnQgWzEyNF0gLT4gW2Jod10uCisgICAgU0RWYWx1ZSBnZXRfVlNQTFRJX2VsdChTRE5vZGUgKk4sIHVuc2lnbmVkIEJ5dGVTaXplLCBTZWxlY3Rpb25EQUcgJkRBRyk7CisgIH0KKyAgCisgIGNsYXNzIFBQQ1RhcmdldExvd2VyaW5nIDogcHVibGljIFRhcmdldExvd2VyaW5nIHsKKyAgICBjb25zdCBQUENTdWJ0YXJnZXQgJlBQQ1N1YlRhcmdldDsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUFBDVGFyZ2V0TG93ZXJpbmcoUFBDVGFyZ2V0TWFjaGluZSAmVE0pOworICAgIAorICAgIC8vLyBnZXRUYXJnZXROb2RlTmFtZSgpIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiBhIHRhcmdldCBzcGVjaWZpYworICAgIC8vLyBEQUcgbm9kZS4KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgICAvLy8gZ2V0U2V0Q0NSZXN1bHRUeXBlIC0gUmV0dXJuIHRoZSBJU0Q6OlNFVENDIFZhbHVlVHlwZQorICAgIHZpcnR1YWwgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0U2V0Q0NSZXN1bHRUeXBlKEVWVCBWVCkgY29uc3Q7CisKKyAgICAvLy8gZ2V0UHJlSW5kZXhlZEFkZHJlc3NQYXJ0cyAtIHJldHVybnMgdHJ1ZSBieSB2YWx1ZSwgYmFzZSBwb2ludGVyIGFuZAorICAgIC8vLyBvZmZzZXQgcG9pbnRlciBhbmQgYWRkcmVzc2luZyBtb2RlIGJ5IHJlZmVyZW5jZSBpZiB0aGUgbm9kZSdzIGFkZHJlc3MKKyAgICAvLy8gY2FuIGJlIGxlZ2FsbHkgcmVwcmVzZW50ZWQgYXMgcHJlLWluZGV4ZWQgbG9hZCAvIHN0b3JlIGFkZHJlc3MuCisgICAgdmlydHVhbCBib29sIGdldFByZUluZGV4ZWRBZGRyZXNzUGFydHMoU0ROb2RlICpOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6Ok1lbUluZGV4ZWRNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgCisgICAgLy8vIFNlbGVjdEFkZHJlc3NSZWdSZWcgLSBHaXZlbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3NlZCwgY2hlY2sgdG8gc2VlIGlmIGl0CisgICAgLy8vIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhbiBpbmRleGVkIFtyK3JdIG9wZXJhdGlvbi4gIFJldHVybnMgZmFsc2UgaWYgaXQKKyAgICAvLy8gY2FuIGJlIG1vcmUgZWZmaWNpZW50bHkgcmVwcmVzZW50ZWQgd2l0aCBbcitpbW1dLgorICAgIGJvb2wgU2VsZWN0QWRkcmVzc1JlZ1JlZyhTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgCisgICAgLy8vIFNlbGVjdEFkZHJlc3NSZWdJbW0gLSBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgTiBjYW4gYmUgcmVwcmVzZW50ZWQKKyAgICAvLy8gYnkgYSBiYXNlIHJlZ2lzdGVyIHBsdXMgYSBzaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBbcitpbW1dLCBhbmQgaWYgaXQKKyAgICAvLy8gaXMgbm90IGJldHRlciByZXByZXNlbnRlZCBhcyByZWcrcmVnLgorICAgIGJvb2wgU2VsZWN0QWRkcmVzc1JlZ0ltbShTRFZhbHVlIE4sIFNEVmFsdWUgJkRpc3AsIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICAKKyAgICAvLy8gU2VsZWN0QWRkcmVzc1JlZ1JlZ09ubHkgLSBHaXZlbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3NlZCwgZm9yY2UgaXQgdG8gYmUKKyAgICAvLy8gcmVwcmVzZW50ZWQgYXMgYW4gaW5kZXhlZCBbcityXSBvcGVyYXRpb24uCisgICAgYm9vbCBTZWxlY3RBZGRyZXNzUmVnUmVnT25seShTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgLy8vIFNlbGVjdEFkZHJlc3NSZWdJbW1TaGlmdCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBOIGNhbiBiZQorICAgIC8vLyByZXByZXNlbnRlZCBieSBhIGJhc2UgcmVnaXN0ZXIgcGx1cyBhIHNpZ25lZCAxNC1iaXQgZGlzcGxhY2VtZW50CisgICAgLy8vIFtyK2ltbSo0XS4gIFN1aXRhYmxlIGZvciB1c2UgYnkgU1REIGFuZCBmcmllbmRzLgorICAgIGJvb2wgU2VsZWN0QWRkcmVzc1JlZ0ltbVNoaWZ0KFNEVmFsdWUgTiwgU0RWYWx1ZSAmRGlzcCwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAKKyAgICAvLy8gTG93ZXJPcGVyYXRpb24gLSBQcm92aWRlIGN1c3RvbSBsb3dlcmluZyBob29rcyBmb3Igc29tZSBvcGVyYXRpb25zLgorICAgIC8vLworICAgIHZpcnR1YWwgU0RWYWx1ZSBMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLy8gUmVwbGFjZU5vZGVSZXN1bHRzIC0gUmVwbGFjZSB0aGUgcmVzdWx0cyBvZiBub2RlIHdpdGggYW4gaWxsZWdhbCByZXN1bHQKKyAgICAvLy8gdHlwZSB3aXRoIG5ldyB2YWx1ZXMgYnVpbHQgb3V0IG9mIGN1c3RvbSBjb2RlLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBSZXBsYWNlTm9kZVJlc3VsdHMoU0ROb2RlICpOLCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4mUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZSBQZXJmb3JtREFHQ29tYmluZShTRE5vZGUgKk4sIERBR0NvbWJpbmVySW5mbyAmRENJKSBjb25zdDsKKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgY29tcHV0ZU1hc2tlZEJpdHNGb3JUYXJnZXROb2RlKGNvbnN0IFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgICAgdmlydHVhbCBNYWNoaW5lQmFzaWNCbG9jayAqCisgICAgICBFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRW1pdEF0b21pY0JpbmFyeShNYWNoaW5lSW5zdHIgKk1JLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCBib29sIGlzNjRCaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQmluT3Bjb2RlKSBjb25zdDsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRW1pdFBhcnR3b3JkQXRvbWljQmluYXJ5KE1hY2hpbmVJbnN0ciAqTUksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXM4Yml0LCB1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworICAgIAorICAgIENvbnN0cmFpbnRUeXBlIGdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdDsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqPiAKKyAgICAgIGdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3Q7CisKKyAgICAvLy8gZ2V0QnlWYWxUeXBlQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBkZXNpcmVkIGFsaWdubWVudCBmb3IgQnlWYWwgYWdncmVnYXRlCisgICAgLy8vIGZ1bmN0aW9uIGFyZ3VtZW50cyBpbiB0aGUgY2FsbGVyIHBhcmFtZXRlciBhcmVhLiAgVGhpcyBpcyB0aGUgYWN0dWFsCisgICAgLy8vIGFsaWdubWVudCwgbm90IGl0cyBsb2dhcml0aG0uCisgICAgdW5zaWduZWQgZ2V0QnlWYWxUeXBlQWxpZ25tZW50KGNvbnN0IFR5cGUgKlR5KSBjb25zdDsKKworICAgIC8vLyBMb3dlckFzbU9wZXJhbmRGb3JDb25zdHJhaW50IC0gTG93ZXIgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGludG8gdGhlIE9wcworICAgIC8vLyB2ZWN0b3IuICBJZiBpdCBpcyBpbnZhbGlkLCBkb24ndCBhZGQgYW55dGhpbmcgdG8gT3BzLgorICAgIHZpcnR1YWwgdm9pZCBMb3dlckFzbU9wZXJhbmRGb3JDb25zdHJhaW50KFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBDb25zdHJhaW50TGV0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIAorICAgIC8vLyBpc0xlZ2FsQWRkcmVzc2luZ01vZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzc2luZyBtb2RlIHJlcHJlc2VudGVkCisgICAgLy8vIGJ5IEFNIGlzIGxlZ2FsIGZvciB0aGlzIHRhcmdldCwgZm9yIGEgbG9hZC9zdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgdmlydHVhbCBib29sIGlzTGVnYWxBZGRyZXNzaW5nTW9kZShjb25zdCBBZGRyTW9kZSAmQU0sIGNvbnN0IFR5cGUgKlR5KWNvbnN0OworICAgIAorICAgIC8vLyBpc0xlZ2FsQWRkcmVzc0ltbWVkaWF0ZSAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGNhbiBiZSB1c2VkCisgICAgLy8vIGFzIHRoZSBvZmZzZXQgb2YgdGhlIHRhcmdldCBhZGRyZXNzaW5nIG1vZGUgZm9yIGxvYWQgLyBzdG9yZSBvZiB0aGUKKyAgICAvLy8gZ2l2ZW4gdHlwZS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMZWdhbEFkZHJlc3NJbW1lZGlhdGUoaW50NjRfdCBWLCBjb25zdCBUeXBlICpUeSkgY29uc3Q7CisKKyAgICAvLy8gaXNMZWdhbEFkZHJlc3NJbW1lZGlhdGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgR2xvYmFsVmFsdWUgY2FuIGJlIHVzZWQgYXMKKyAgICAvLy8gdGhlIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGFkZHJlc3NpbmcgbW9kZS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMZWdhbEFkZHJlc3NJbW1lZGlhdGUoR2xvYmFsVmFsdWUgKkdWKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBpc09mZnNldEZvbGRpbmdMZWdhbChjb25zdCBHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSkgY29uc3Q7CisgICAgCisgICAgLy8vIGdldE9wdGltYWxNZW1PcFR5cGUgLSBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlY2lmaWMgb3B0aW1hbCB0eXBlIGZvciBsb2FkCisgICAgLy8vIGFuZCBzdG9yZSBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIG1lbXNldCwgbWVtY3B5LCBhbmQgbWVtbW92ZQorICAgIC8vLyBsb3dlcmluZy4gSWYgRHN0QWxpZ24gaXMgemVybyB0aGF0IG1lYW5zIGl0J3Mgc2FmZSB0byBkZXN0aW5hdGlvbgorICAgIC8vLyBhbGlnbm1lbnQgY2FuIHNhdGlzZnkgYW55IGNvbnN0cmFpbnQuIFNpbWlsYXJseSBpZiBTcmNBbGlnbiBpcyB6ZXJvIGl0CisgICAgLy8vIG1lYW5zIHRoZXJlIGlzbid0IGEgbmVlZCB0byBjaGVjayBpdCBhZ2FpbnN0IGFsaWdubWVudCByZXF1aXJlbWVudCwKKyAgICAvLy8gcHJvYmFibHkgYmVjYXVzZSB0aGUgc291cmNlIGRvZXMgbm90IG5lZWQgdG8gYmUgbG9hZGVkLiBJZgorICAgIC8vLyAnTm9uU2NhbGFySW50U2FmZScgaXMgdHJ1ZSwgdGhhdCBtZWFucyBpdCdzIHNhZmUgdG8gcmV0dXJuIGEKKyAgICAvLy8gbm9uLXNjYWxhci1pbnRlZ2VyIHR5cGUsIGUuZy4gZW1wdHkgc3RyaW5nIHNvdXJjZSwgY29uc3RhbnQsIG9yIGxvYWRlZAorICAgIC8vLyBmcm9tIG1lbW9yeS4gJ01lbWNweVN0clNyYycgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1lbWNweSBzb3VyY2UgaXMKKyAgICAvLy8gY29uc3RhbnQgc28gaXQgZG9lcyBub3QgbmVlZCB0byBiZSBsb2FkZWQuCisgICAgLy8vIEl0IHJldHVybnMgRVZUOjpPdGhlciBpZiB0aGUgdHlwZSBzaG91bGQgYmUgZGV0ZXJtaW5lZCB1c2luZyBnZW5lcmljCisgICAgLy8vIHRhcmdldC1pbmRlcGVuZGVudCBsb2dpYy4KKyAgICB2aXJ0dWFsIEVWVAorICAgIGdldE9wdGltYWxNZW1PcFR5cGUodWludDY0X3QgU2l6ZSwgdW5zaWduZWQgRHN0QWxpZ24sIHVuc2lnbmVkIFNyY0FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb25TY2FsYXJJbnRTYWZlLCBib29sIE1lbWNweVN0clNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgICAgLy8vIGdldEZ1bmN0aW9uQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBMb2cyIGFsaWdubWVudCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgU0RWYWx1ZSBnZXRGcmFtZVBvaW50ZXJGcmFtZUluZGV4KFNlbGVjdGlvbkRBRyAmIERBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBnZXRSZXR1cm5BZGRyRnJhbWVJbmRleChTZWxlY3Rpb25EQUcgJiBEQUcpIGNvbnN0OworCisgICAgYm9vbAorICAgIElzRWxpZ2libGVGb3JUYWlsQ2FsbE9wdGltaXphdGlvbihTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxlZUNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHJiBEQUcpIGNvbnN0OworCisgICAgU0RWYWx1ZSBFbWl0VGFpbENhbGxMb2FkRlBBbmRSZXRBZGRyKFNlbGVjdGlvbkRBRyAmIERBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQRGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTFJPcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmRlBPcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RhcndpbkFCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIGNvbnN0OworCisgICAgU0RWYWx1ZSBMb3dlclJFVFVSTkFERFIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJGUkFNRUFERFIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJDb25zdGFudFBvb2woU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJCbG9ja0FkZHJlc3MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJHbG9iYWxBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyR2xvYmFsVExTQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckp1bXBUYWJsZShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclNFVENDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyVFJBTVBPTElORShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclZBU1RBUlQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFBDU3VidGFyZ2V0ICZTdWJ0YXJnZXQpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJWQUFSRyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFBDU3VidGFyZ2V0ICZTdWJ0YXJnZXQpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJTVEFDS1JFU1RPUkUoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBQQ1N1YnRhcmdldCAmU3VidGFyZ2V0KSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRFlOQU1JQ19TVEFDS0FMTE9DKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQUENTdWJ0YXJnZXQgJlN1YnRhcmdldCkgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclNFTEVDVF9DQyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckZQX1RPX0lOVChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJTSU5UX1RPX0ZQKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRkxUX1JPVU5EU18oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJTSExfUEFSVFMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJTUkxfUEFSVFMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJTUkFfUEFSVFMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJCVUlMRF9WRUNUT1IoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJWRUNUT1JfU0hVRkZMRShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlcklOVFJJTlNJQ19XT19DSEFJTihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclNDQUxBUl9UT19WRUNUT1IoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJNVUwoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgU0RWYWx1ZSBMb3dlckNhbGxSZXN1bHQoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBJbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisgICAgU0RWYWx1ZSBGaW5pc2hDYWxsKENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgRGVidWdMb2MgZGwsIGJvb2wgaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgU0RWYWx1ZT4sIDg+CisgICAgICAgICAgICAgICAgICAgICAgICAgJlJlZ3NUb1Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgSW5GbGFnLCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBTUERpZmYsIHVuc2lnbmVkIE51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlckZvcm1hbEFyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsIGJvb2wgJmlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJSZXR1cm4oU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgU0RWYWx1ZQorICAgICAgTG93ZXJGb3JtYWxBcmd1bWVudHNfRGFyd2luKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisgICAgU0RWYWx1ZQorICAgICAgTG93ZXJGb3JtYWxBcmd1bWVudHNfU1ZSNChTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIFNEVmFsdWUKKyAgICAgIExvd2VyQ2FsbF9EYXJ3aW4oU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywgYm9vbCBpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKyAgICBTRFZhbHVlCisgICAgICBMb3dlckNhbGxfU1ZSNChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywgYm9vbCBpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworICB9OworfQorCisjZW5kaWYgICAvLyBMTFZNX1RBUkdFVF9QT1dFUlBDX1BQQzMySVNFTExPV0VSSU5HX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJbnN0cjY0Qml0LnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0luc3RyNjRCaXQudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5MTA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJbnN0cjY0Qml0LnRkCkBAIC0wLDAgKzEsNzUxIEBACisvLz09PS0gUFBDSW5zdHI2NEJpdC50ZCAtIFRoZSBQb3dlclBDIDY0LWJpdCBTdXBwb3J0IC0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgUG93ZXJQQyA2NC1iaXQgaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgcGF0dGVybnMgYXJlIHVzZWQNCisvLyBib3RoIHdoZW4gaW4gcHBjNjQgbW9kZSBhbmQgd2hlbiBpbiAidXNlIDY0LWJpdCBleHRlbnNpb25zIGluIDMyLWJpdCIgbW9kZS4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyA2NC1iaXQgb3BlcmFuZHMuDQorLy8NCitkZWYgczE2aW1tNjQgOiBPcGVyYW5kPGk2ND4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UzE2SW1tT3BlcmFuZCI7DQorfQ0KK2RlZiB1MTZpbW02NCA6IE9wZXJhbmQ8aTY0PiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRVMTZJbW1PcGVyYW5kIjsNCit9DQorZGVmIHN5bWJvbEhpNjQgOiBPcGVyYW5kPGk2ND4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50U3ltYm9sSGkiOw0KK30NCitkZWYgc3ltYm9sTG82NCA6IE9wZXJhbmQ8aTY0PiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTeW1ib2xMbyI7DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gNjQtYml0IHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucy4NCisvLw0KKw0KK2RlZiBTSEw2NCA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiA2MyAtIGltbQ0KKyAgcmV0dXJuIGdldEkzMkltbSg2MyAtIE4tPmdldFpFeHRWYWx1ZSgpKTsNCit9XT47DQorDQorZGVmIFNSTDY0IDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IDY0IC0gaW1tDQorICByZXR1cm4gTi0+Z2V0WkV4dFZhbHVlKCkgPyBnZXRJMzJJbW0oNjQgLSBOLT5nZXRaRXh0VmFsdWUoKSkgOiBnZXRJMzJJbW0oMCk7DQorfV0+Ow0KKw0KK2RlZiBISTMyXzQ4IDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IHNoaWZ0IHRoZSBpbW1lZGlhdGUgdmFsdWUgZG93biBpbnRvIHRoZSBsb3cgYml0cy4NCisgIHJldHVybiBnZXRJMzJJbW0oKHVuc2lnbmVkIHNob3J0KShOLT5nZXRaRXh0VmFsdWUoKSA+PiAzMikpOw0KK31dPjsNCisNCitkZWYgSEk0OF82NCA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiBzaGlmdCB0aGUgaW1tZWRpYXRlIHZhbHVlIGRvd24gaW50byB0aGUgbG93IGJpdHMuDQorICByZXR1cm4gZ2V0STMySW1tKCh1bnNpZ25lZCBzaG9ydCkoTi0+Z2V0WkV4dFZhbHVlKCkgPj4gNDgpKTsNCit9XT47DQorDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBDYWxscy4NCisvLw0KKw0KK2xldCBEZWZzID0gW0xSOF0gaW4NCisgIGRlZiBNb3ZlUEN0b0xSOCA6IFBzZXVkbzwob3V0cyksIChpbnMgcGljbGFiZWw6JGxhYmVsKSwgImJsICRsYWJlbCIsIFtdPiwNCisgICAgICAgICAgICAgICAgICAgIFBQQzk3MF9Vbml0X0JSVTsNCisNCisvLyBEYXJ3aW4gQUJJIENhbGxzLg0KK2xldCBpc0NhbGwgPSAxLCBQUEM5NzBfVW5pdCA9IDcsIA0KKyAgLy8gQWxsIGNhbGxzIGNsb2JiZXIgdGhlIFBQQzY0IG5vbi1jYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLg0KKyAgRGVmcyA9IFtYMCxYMixYMyxYNCxYNSxYNixYNyxYOCxYOSxYMTAsWDExLFgxMiwNCisgICAgICAgICAgRjAsRjEsRjIsRjMsRjQsRjUsRjYsRjcsRjgsRjksRjEwLEYxMSxGMTIsRjEzLA0KKyAgICAgICAgICBWMCxWMSxWMixWMyxWNCxWNSxWNixWNyxWOCxWOSxWMTAsVjExLFYxMixWMTMsVjE0LFYxNSxWMTYsVjE3LFYxOCxWMTksDQorICAgICAgICAgIExSOCxDVFI4LA0KKyAgICAgICAgICBDUjAsQ1IxLENSNSxDUjYsQ1I3LENBUlJZXSBpbiB7DQorICAvLyBDb252ZW5pZW50IGFsaWFzZXMgZm9yIGNhbGwgaW5zdHJ1Y3Rpb25zDQorICBsZXQgVXNlcyA9IFtSTV0gaW4gew0KKyAgICBkZWYgQkw4X0RhcndpbiAgOiBJRm9ybTwxOCwgMCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGNhbGx0YXJnZXQ6JGZ1bmMsIHZhcmlhYmxlX29wcyksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmwgJGZ1bmMiLCBCckIsIFtdPjsgIC8vIFNlZSBQYXQgcGF0dGVybnMgYmVsb3cuDQorICAgIGRlZiBCTEE4X0RhcndpbiA6IElGb3JtPDE4LCAxLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGFhZGRyOiRmdW5jLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJsYSAkZnVuYyIsIEJyQiwgWyhQUENjYWxsX0RhcndpbiAoaTY0IGltbTokZnVuYykpXT47DQorICB9DQorICBsZXQgVXNlcyA9IFtDVFI4LCBSTV0gaW4gew0KKyAgICBkZWYgQkNUUkw4X0RhcndpbiA6IFhMRm9ybV8yX2V4dDwxOSwgNTI4LCAyMCwgMCwgMSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmN0cmwiLCBCckIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoUFBDYmN0cmxfRGFyd2luKV0+LCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCisgIH0NCit9DQorDQorLy8gRUxGIDY0IEFCSSBDYWxscyA9IERhcndpbiBBQkkgQ2FsbHMNCisvLyBVc2VkIHRvIGRlZmluZSBCTDhfRUxGIGFuZCBCTEE4X0VMRg0KK2xldCBpc0NhbGwgPSAxLCBQUEM5NzBfVW5pdCA9IDcsIA0KKyAgLy8gQWxsIGNhbGxzIGNsb2JiZXIgdGhlIFBQQzY0IG5vbi1jYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLg0KKyAgRGVmcyA9IFtYMCxYMixYMyxYNCxYNSxYNixYNyxYOCxYOSxYMTAsWDExLFgxMiwNCisgICAgICAgICAgRjAsRjEsRjIsRjMsRjQsRjUsRjYsRjcsRjgsRjksRjEwLEYxMSxGMTIsRjEzLA0KKyAgICAgICAgICBWMCxWMSxWMixWMyxWNCxWNSxWNixWNyxWOCxWOSxWMTAsVjExLFYxMixWMTMsVjE0LFYxNSxWMTYsVjE3LFYxOCxWMTksDQorICAgICAgICAgIExSOCxDVFI4LA0KKyAgICAgICAgICBDUjAsQ1IxLENSNSxDUjYsQ1I3LENBUlJZXSBpbiB7DQorICAvLyBDb252ZW5pZW50IGFsaWFzZXMgZm9yIGNhbGwgaW5zdHJ1Y3Rpb25zDQorICBsZXQgVXNlcyA9IFtSTV0gaW4gew0KKyAgICBkZWYgQkw4X0VMRiAgOiBJRm9ybTwxOCwgMCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGNhbGx0YXJnZXQ6JGZ1bmMsIHZhcmlhYmxlX29wcyksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAiYmwgJGZ1bmMiLCBCckIsIFtdPjsgIC8vIFNlZSBQYXQgcGF0dGVybnMgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICBkZWYgQkxBOF9FTEYgOiBJRm9ybTwxOCwgMSwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGFhZGRyOiRmdW5jLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAiYmxhICRmdW5jIiwgQnJCLCBbKFBQQ2NhbGxfU1ZSNCAoaTY0IGltbTokZnVuYykpXT47DQorICB9DQorICBsZXQgVXNlcyA9IFtDVFI4LCBSTV0gaW4gew0KKyAgICBkZWYgQkNUUkw4X0VMRiA6IFhMRm9ybV8yX2V4dDwxOSwgNTI4LCAyMCwgMCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiY3RybCIsIEJyQiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhQUENiY3RybF9TVlI0KV0+LCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCisgIH0NCit9DQorDQorDQorLy8gQ2FsbHMNCitkZWYgOiBQYXQ8KFBQQ2NhbGxfRGFyd2luIChpNjQgdGdsb2JhbGFkZHI6JGRzdCkpLA0KKyAgICAgICAgICAoQkw4X0RhcndpbiB0Z2xvYmFsYWRkcjokZHN0KT47DQorZGVmIDogUGF0PChQUENjYWxsX0RhcndpbiAoaTY0IHRleHRlcm5hbHN5bTokZHN0KSksDQorICAgICAgICAgIChCTDhfRGFyd2luIHRleHRlcm5hbHN5bTokZHN0KT47DQorDQorZGVmIDogUGF0PChQUENjYWxsX1NWUjQgKGk2NCB0Z2xvYmFsYWRkcjokZHN0KSksDQorICAgICAgICAgIChCTDhfRUxGIHRnbG9iYWxhZGRyOiRkc3QpPjsNCitkZWYgOiBQYXQ8KFBQQ2NhbGxfU1ZSNCAoaTY0IHRleHRlcm5hbHN5bTokZHN0KSksDQorICAgICAgICAgIChCTDhfRUxGIHRleHRlcm5hbHN5bTokZHN0KT47DQorZGVmIDogUGF0PChQUENub3ApLA0KKyAgICAgICAgICAoTk9QKT47DQorDQorLy8gQXRvbWljIG9wZXJhdGlvbnMNCitsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMSBpbiB7DQorICBsZXQgVXNlcyA9IFtDUjBdIGluIHsNCisgICAgZGVmIEFUT01JQ19MT0FEX0FERF9JNjQgOiBQc2V1ZG88DQorICAgICAgKG91dHMgRzhSQzokZHN0KSwgKGlucyBtZW1ycjokcHRyLCBHOFJDOiRpbmNyKSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfQUREX0k2NCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHOFJDOiRkc3QsIChhdG9taWNfbG9hZF9hZGRfNjQgeG9hZGRyOiRwdHIsIEc4UkM6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfU1VCX0k2NCA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHOFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEc4UkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9TVUJfSTY0IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEc4UkM6JGRzdCwgKGF0b21pY19sb2FkX3N1Yl82NCB4b2FkZHI6JHB0ciwgRzhSQzokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9PUl9JNjQgOiBQc2V1ZG88DQorICAgICAgKG91dHMgRzhSQzokZHN0KSwgKGlucyBtZW1ycjokcHRyLCBHOFJDOiRpbmNyKSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfT1JfSTY0IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEc4UkM6JGRzdCwgKGF0b21pY19sb2FkX29yXzY0IHhvYWRkcjokcHRyLCBHOFJDOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX1hPUl9JNjQgOiBQc2V1ZG88DQorICAgICAgKG91dHMgRzhSQzokZHN0KSwgKGlucyBtZW1ycjokcHRyLCBHOFJDOiRpbmNyKSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfWE9SX0k2NCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHOFJDOiRkc3QsIChhdG9taWNfbG9hZF94b3JfNjQgeG9hZGRyOiRwdHIsIEc4UkM6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfQU5EX0k2NCA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHOFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEc4UkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9BTkRfSTY0IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEc4UkM6JGRzdCwgKGF0b21pY19sb2FkX2FuZF82NCB4b2FkZHI6JHB0ciwgRzhSQzokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9OQU5EX0k2NCA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHOFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEc4UkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9OQU5EX0k2NCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHOFJDOiRkc3QsIChhdG9taWNfbG9hZF9uYW5kXzY0IHhvYWRkcjokcHRyLCBHOFJDOiRpbmNyKSldPjsNCisNCisgICAgZGVmIEFUT01JQ19DTVBfU1dBUF9JNjQgOiBQc2V1ZG88DQorICAgICAgKG91dHMgRzhSQzokZHN0KSwgKGlucyBtZW1ycjokcHRyLCBHOFJDOiRvbGQsIEc4UkM6JG5ldyksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19DTVBfU1dBUF9JNjQgUFNFVURPISIsDQorICAgICAgWyhzZXQgRzhSQzokZHN0LCANCisgICAgICAgICAgICAgICAgICAgIChhdG9taWNfY21wX3N3YXBfNjQgeG9hZGRyOiRwdHIsIEc4UkM6JG9sZCwgRzhSQzokbmV3KSldPjsNCisNCisgICAgZGVmIEFUT01JQ19TV0FQX0k2NCA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHOFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEc4UkM6JG5ldyksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19TV0FQX0k2NCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHOFJDOiRkc3QsIChhdG9taWNfc3dhcF82NCB4b2FkZHI6JHB0ciwgRzhSQzokbmV3KSldPjsNCisgIH0NCit9DQorDQorLy8gSW5zdHJ1Y3Rpb25zIHRvIHN1cHBvcnQgYXRvbWljIG9wZXJhdGlvbnMNCitkZWYgTERBUlggOiBYRm9ybV8xPDMxLCAgODQsIChvdXRzIEc4UkM6JHJEKSwgKGlucyBtZW1ycjokcHRyKSwNCisgICAgICAgICAgICAgICAgICAgImxkYXJ4ICRyRCwgJHB0ciIsIExkU3RMREFSWCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckQsIChQUENsYXJ4IHhvYWRkcjokcHRyKSldPjsNCisNCitsZXQgRGVmcyA9IFtDUjBdIGluDQorZGVmIFNURENYIDogWEZvcm1fMTwzMSwgMjE0LCAob3V0cyksIChpbnMgRzhSQzokclMsIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic3RkY3guICRyUywgJGRzdCIsIExkU3RTVERDWCwNCisgICAgICAgICAgICAgICAgICAgWyhQUENzdGN4IEc4UkM6JHJTLCB4b2FkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgaXNET1Q7DQorDQorbGV0IGlzQ2FsbCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGlzUmV0dXJuID0gMSwgaXNCYXJyaWVyID0gMSwgVXNlcyA9IFtSTV0gaW4NCitkZWYgVENSRVRVUk5kaTggOlBzZXVkbzwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgY2FsbHRhcmdldDokZHN0LCBpMzJpbW06JG9mZnNldCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICIjVENfUkVUVVJOZDggJGRzdCAkb2Zmc2V0IiwNCisgICAgICAgICAgICAgICAgIFtdPjsNCisNCitsZXQgaXNDYWxsID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNSZXR1cm4gPSAxLCBpc0JhcnJpZXIgPSAxLCBVc2VzID0gW1JNXSBpbg0KK2RlZiBUQ1JFVFVSTmFpOCA6UHNldWRvPChvdXRzKSwgKGlucyBhYWRkcjokZnVuYywgaTMyaW1tOiRvZmZzZXQsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAiI1RDX1JFVFVSTmE4ICRmdW5jICRvZmZzZXQiLA0KKyAgICAgICAgICAgICAgICAgWyhQUEN0Y19yZXR1cm4gKGk2NCBpbW06JGZ1bmMpLCBpbW06JG9mZnNldCldPjsNCisNCitsZXQgaXNDYWxsID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNSZXR1cm4gPSAxLCBpc0JhcnJpZXIgPSAxLCBVc2VzID0gW1JNXSBpbg0KK2RlZiBUQ1JFVFVSTnJpOCA6IFBzZXVkbzwob3V0cyksIChpbnMgQ1RSUkM4OiRkc3QsIGkzMmltbTokb2Zmc2V0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgIiNUQ19SRVRVUk5yOCAkZHN0ICRvZmZzZXQiLA0KKyAgICAgICAgICAgICAgICAgW10+Ow0KKw0KKw0KK2xldCBpc1Rlcm1pbmF0b3IgPSAxLCBpc0JhcnJpZXIgPSAxLCBQUEM5NzBfVW5pdCA9IDcsIGlzQnJhbmNoID0gMSwNCisgICAgaXNJbmRpcmVjdEJyYW5jaCA9IDEsIGlzQ2FsbCA9IDEsIGlzUmV0dXJuID0gMSwgVXNlcyA9IFtDVFIsIFJNXSBpbg0KK2RlZiBUQUlMQkNUUjggOiBYTEZvcm1fMl9leHQ8MTksIDUyOCwgMjAsIDAsIDAsIChvdXRzKSwgKGlucyksICJiY3RyIiwgQnJCLCBbXT4sDQorICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KKw0KKw0KKw0KK2xldCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGhhc0N0cmxEZXAgPSAxLCBQUEM5NzBfVW5pdCA9IDcsDQorICAgIGlzQmFycmllciA9IDEsIGlzQ2FsbCA9IDEsIGlzUmV0dXJuID0gMSwgVXNlcyA9IFtSTV0gaW4NCitkZWYgVEFJTEI4ICAgOiBJRm9ybTwxOCwgMCwgMCwgKG91dHMpLCAoaW5zIGNhbGx0YXJnZXQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgImIgJGRzdCIsIEJyQiwNCisgICAgICAgICAgICAgICAgICBbXT47DQorDQorDQorbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaGFzQ3RybERlcCA9IDEsIFBQQzk3MF9Vbml0ID0gNywNCisgICAgaXNCYXJyaWVyID0gMSwgaXNDYWxsID0gMSwgaXNSZXR1cm4gPSAxLCBVc2VzID0gW1JNXSBpbg0KK2RlZiBUQUlMQkE4ICAgOiBJRm9ybTwxOCwgMCwgMCwgKG91dHMpLCAoaW5zIGFhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICJiYSAkZHN0IiwgQnJCLA0KKyAgICAgICAgICAgICAgICAgIFtdPjsNCisNCitkZWYgOiBQYXQ8KFBQQ3RjX3JldHVybiAoaTY0IHRnbG9iYWxhZGRyOiRkc3QpLCAgaW1tOiRpbW0pLA0KKyAgICAgICAgICAoVENSRVRVUk5kaTggdGdsb2JhbGFkZHI6JGRzdCwgaW1tOiRpbW0pPjsNCisNCitkZWYgOiBQYXQ8KFBQQ3RjX3JldHVybiAoaTY0IHRleHRlcm5hbHN5bTokZHN0KSwgaW1tOiRpbW0pLA0KKyAgICAgICAgICAoVENSRVRVUk5kaTggdGV4dGVybmFsc3ltOiRkc3QsIGltbTokaW1tKT47DQorDQorZGVmIDogUGF0PChQUEN0Y19yZXR1cm4gQ1RSUkM4OiRkc3QsIGltbTokaW1tKSwNCisgICAgICAgICAgKFRDUkVUVVJOcmk4IENUUlJDODokZHN0LCBpbW06JGltbSk+Ow0KKw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gNjQtYml0IFNQUiBtYW5pcHVsYXRpb24gaW5zdHJzLg0KKw0KK2xldCBVc2VzID0gW0NUUjhdIGluIHsNCitkZWYgTUZDVFI4IDogWEZYRm9ybV8xX2V4dDwzMSwgMzM5LCA5LCAob3V0cyBHOFJDOiRyVCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZmN0ciAkclQiLCBTcHJNRlNQUj4sDQorICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfRmlyc3QsIFBQQzk3MF9Vbml0X0ZYVTsNCit9DQorbGV0IFBhdHRlcm4gPSBbKFBQQ210Y3RyIEc4UkM6JHJTKV0sIERlZnMgPSBbQ1RSOF0gaW4gew0KK2RlZiBNVENUUjggOiBYRlhGb3JtXzdfZXh0PDMxLCA0NjcsIDksIChvdXRzKSwgKGlucyBHOFJDOiRyUyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm10Y3RyICRyUyIsIFNwck1UU1BSPiwNCisgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9GaXJzdCwgUFBDOTcwX1VuaXRfRlhVOw0KK30NCisNCitsZXQgRGVmcyA9IFtYMV0sIFVzZXMgPSBbWDFdIGluDQorZGVmIERZTkFMTE9DOCA6IFBzZXVkbzwob3V0cyBHOFJDOiRyZXN1bHQpLCAoaW5zIEc4UkM6JG5lZ3NpemUsIG1lbXJpOiRmcHNpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICIkezpjb21tZW50fSBEWU5BTExPQzggJHJlc3VsdCwgJG5lZ3NpemUsICRmcHNpIiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQUENkeW5hbGxvYyBHOFJDOiRuZWdzaXplLCBpYWRkcjokZnBzaSkpXT47DQorDQorbGV0IERlZnMgPSBbTFI4XSBpbiB7DQorZGVmIE1UTFI4ICA6IFhGWEZvcm1fN19leHQ8MzEsIDQ2NywgOCwgKG91dHMpLCAoaW5zIEc4UkM6JHJTKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibXRsciAkclMiLCBTcHJNVFNQUj4sDQorICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfRmlyc3QsIFBQQzk3MF9Vbml0X0ZYVTsNCit9DQorbGV0IFVzZXMgPSBbTFI4XSBpbiB7DQorZGVmIE1GTFI4ICA6IFhGWEZvcm1fMV9leHQ8MzEsIDMzOSwgOCwgKG91dHMgRzhSQzokclQpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWZsciAkclQiLCBTcHJNRlNQUj4sDQorICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfRmlyc3QsIFBQQzk3MF9Vbml0X0ZYVTsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBGaXhlZCBwb2ludCBpbnN0cnVjdGlvbnMuDQorLy8NCisNCitsZXQgUFBDOTcwX1VuaXQgPSAxIGluIHsgIC8vIEZYVSBPcGVyYXRpb25zLg0KKw0KKy8vIENvcGllcywgZXh0ZW5kcywgdHJ1bmNhdGVzLg0KK2RlZiBPUjRUbzggIDogWEZvcm1fNjwzMSwgNDQ0LCAob3V0cyBHOFJDOiRyQSksIChpbnMgR1BSQzokclMsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgIm9yICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbXT47DQorZGVmIE9SOFRvNCAgOiBYRm9ybV82PDMxLCA0NDQsIChvdXRzIEdQUkM6JHJBKSwgKGlucyBHOFJDOiRyUywgRzhSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAib3IgJHJBLCAkclMsICRyQiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgIFtdPjsNCisNCitkZWYgTEk4ICA6IERGb3JtXzJfcjA8MTQsIChvdXRzIEc4UkM6JHJEKSwgKGlucyBzeW1ib2xMbzY0OiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAibGkgJHJELCAkaW1tIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckQsIGltbVNFeHQxNjokaW1tKV0+Ow0KK2RlZiBMSVM4IDogREZvcm1fMl9yMDwxNSwgKG91dHMgRzhSQzokckQpLCAoaW5zIHN5bWJvbEhpNjQ6JGltbSksDQorICAgICAgICAgICAgICAgICAgICAgICJsaXMgJHJELCAkaW1tIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckQsIGltbTE2U2hpZnRlZFNFeHQ6JGltbSldPjsNCisNCisvLyBMb2dpY2FsIG9wcy4NCitkZWYgTkFORDg6IFhGb3JtXzY8MzEsIDQ3NiwgKG91dHMgRzhSQzokckEpLCAoaW5zIEc4UkM6JHJTLCBHOFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICJuYW5kICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyQSwgKG5vdCAoYW5kIEc4UkM6JHJTLCBHOFJDOiRyQikpKV0+Ow0KK2RlZiBBTkQ4IDogWEZvcm1fNjwzMSwgIDI4LCAob3V0cyBHOFJDOiRyQSksIChpbnMgRzhSQzokclMsIEc4UkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgImFuZCAkckEsICRyUywgJHJCIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckEsIChhbmQgRzhSQzokclMsIEc4UkM6JHJCKSldPjsNCitkZWYgQU5EQzg6IFhGb3JtXzY8MzEsICA2MCwgKG91dHMgRzhSQzokckEpLCAoaW5zIEc4UkM6JHJTLCBHOFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICJhbmRjICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyQSwgKGFuZCBHOFJDOiRyUywgKG5vdCBHOFJDOiRyQikpKV0+Ow0KK2RlZiBPUjggIDogWEZvcm1fNjwzMSwgNDQ0LCAob3V0cyBHOFJDOiRyQSksIChpbnMgRzhSQzokclMsIEc4UkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgIm9yICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyQSwgKG9yIEc4UkM6JHJTLCBHOFJDOiRyQikpXT47DQorZGVmIE5PUjggOiBYRm9ybV82PDMxLCAxMjQsIChvdXRzIEc4UkM6JHJBKSwgKGlucyBHOFJDOiRyUywgRzhSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAibm9yICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyQSwgKG5vdCAob3IgRzhSQzokclMsIEc4UkM6JHJCKSkpXT47DQorZGVmIE9SQzggOiBYRm9ybV82PDMxLCA0MTIsIChvdXRzIEc4UkM6JHJBKSwgKGlucyBHOFJDOiRyUywgRzhSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAib3JjICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyQSwgKG9yIEc4UkM6JHJTLCAobm90IEc4UkM6JHJCKSkpXT47DQorZGVmIEVRVjggOiBYRm9ybV82PDMxLCAyODQsIChvdXRzIEc4UkM6JHJBKSwgKGlucyBHOFJDOiRyUywgRzhSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAiZXF2ICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyQSwgKG5vdCAoeG9yIEc4UkM6JHJTLCBHOFJDOiRyQikpKV0+Ow0KK2RlZiBYT1I4IDogWEZvcm1fNjwzMSwgMzE2LCAob3V0cyBHOFJDOiRyQSksIChpbnMgRzhSQzokclMsIEc4UkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgInhvciAkckEsICRyUywgJHJCIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckEsICh4b3IgRzhSQzokclMsIEc4UkM6JHJCKSldPjsNCisNCisvLyBMb2dpY2FsIG9wcyB3aXRoIGltbWVkaWF0ZS4NCitkZWYgQU5ESW84ICA6IERGb3JtXzQ8MjgsIChvdXRzIEc4UkM6JGRzdCksIChpbnMgRzhSQzokc3JjMSwgdTE2aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgImFuZGkuICRkc3QsICRzcmMxLCAkc3JjMiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JGRzdCwgKGFuZCBHOFJDOiRzcmMxLCBpbW1aRXh0MTY6JHNyYzIpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICBpc0RPVDsNCitkZWYgQU5ESVNvOCA6IERGb3JtXzQ8MjksIChvdXRzIEc4UkM6JGRzdCksIChpbnMgRzhSQzokc3JjMSwgdTE2aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAiYW5kaXMuICRkc3QsICRzcmMxLCAkc3JjMiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRkc3QsIChhbmQgRzhSQzokc3JjMSxpbW0xNlNoaWZ0ZWRaRXh0OiRzcmMyKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBpc0RPVDsNCitkZWYgT1JJOCAgICA6IERGb3JtXzQ8MjQsIChvdXRzIEc4UkM6JGRzdCksIChpbnMgRzhSQzokc3JjMSwgdTE2aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm9yaSAkZHN0LCAkc3JjMSwgJHNyYzIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRkc3QsIChvciBHOFJDOiRzcmMxLCBpbW1aRXh0MTY6JHNyYzIpKV0+Ow0KK2RlZiBPUklTOCAgIDogREZvcm1fNDwyNSwgKG91dHMgRzhSQzokZHN0KSwgKGlucyBHOFJDOiRzcmMxLCB1MTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAib3JpcyAkZHN0LCAkc3JjMSwgJHNyYzIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokZHN0LCAob3IgRzhSQzokc3JjMSwgaW1tMTZTaGlmdGVkWkV4dDokc3JjMikpXT47DQorZGVmIFhPUkk4ICAgOiBERm9ybV80PDI2LCAob3V0cyBHOFJDOiRkc3QpLCAoaW5zIEc4UkM6JHNyYzEsIHUxNmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJ4b3JpICRkc3QsICRzcmMxLCAkc3JjMiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JGRzdCwgKHhvciBHOFJDOiRzcmMxLCBpbW1aRXh0MTY6JHNyYzIpKV0+Ow0KK2RlZiBYT1JJUzggIDogREZvcm1fNDwyNywgKG91dHMgRzhSQzokZHN0KSwgKGlucyBHOFJDOiRzcmMxLCB1MTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAieG9yaXMgJGRzdCwgJHNyYzEsICRzcmMyIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokZHN0LCAoeG9yIEc4UkM6JHNyYzEsIGltbTE2U2hpZnRlZFpFeHQ6JHNyYzIpKV0+Ow0KKw0KK2RlZiBBREQ4ICA6IFhPRm9ybV8xPDMxLCAyNjYsIDAsIChvdXRzIEc4UkM6JHJUKSwgKGlucyBHOFJDOiRyQSwgRzhSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGQgJHJULCAkckEsICRyQiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokclQsIChhZGQgRzhSQzokckEsIEc4UkM6JHJCKSldPjsNCisgICAgICAgICAgICAgICAgICAgICANCitsZXQgRGVmcyA9IFtDQVJSWV0gaW4gew0KK2RlZiBBRERDOCA6IFhPRm9ybV8xPDMxLCAxMCwgMCwgKG91dHMgRzhSQzokclQpLCAoaW5zIEc4UkM6JHJBLCBHOFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgImFkZGMgJHJULCAkckEsICRyQiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokclQsIChhZGRjIEc4UkM6JHJBLCBHOFJDOiRyQikpXT4sDQorICAgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KK2RlZiBBRERJQzggOiBERm9ybV8yPDEyLCAob3V0cyBHOFJDOiRyRCksIChpbnMgRzhSQzokckEsIHMxNmltbTY0OiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGRpYyAkckQsICRyQSwgJGltbSIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckQsIChhZGRjIEc4UkM6JHJBLCBpbW1TRXh0MTY6JGltbSkpXT47DQorfQ0KK2RlZiBBRERJOCAgOiBERm9ybV8yPDE0LCAob3V0cyBHOFJDOiRyRCksIChpbnMgRzhSQzokckEsIHMxNmltbTY0OiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGRpICRyRCwgJHJBLCAkaW1tIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyRCwgKGFkZCBHOFJDOiRyQSwgaW1tU0V4dDE2OiRpbW0pKV0+Ow0KK2RlZiBBRERJUzggOiBERm9ybV8yPDE1LCAob3V0cyBHOFJDOiRyRCksIChpbnMgRzhSQzokckEsIHN5bWJvbEhpNjQ6JGltbSksDQorICAgICAgICAgICAgICAgICAgICAgImFkZGlzICRyRCwgJHJBLCAkaW1tIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyRCwgKGFkZCBHOFJDOiRyQSwgaW1tMTZTaGlmdGVkU0V4dDokaW1tKSldPjsNCisNCitsZXQgRGVmcyA9IFtDQVJSWV0gaW4gew0KK2RlZiBTVUJGSUM4OiBERm9ybV8yPCA4LCAob3V0cyBHOFJDOiRyRCksIChpbnMgRzhSQzokckEsIHMxNmltbTY0OiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICJzdWJmaWMgJHJELCAkckEsICRpbW0iLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJELCAoc3ViYyBpbW1TRXh0MTY6JGltbSwgRzhSQzokckEpKV0+Ow0KK2RlZiBTVUJGQzggOiBYT0Zvcm1fMTwzMSwgOCwgMCwgKG91dHMgRzhSQzokclQpLCAoaW5zIEc4UkM6JHJBLCBHOFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICJzdWJmYyAkclQsICRyQSwgJHJCIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokclQsIChzdWJjIEc4UkM6JHJCLCBHOFJDOiRyQSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfQ3JhY2tlZDsNCit9DQorZGVmIFNVQkY4IDogWE9Gb3JtXzE8MzEsIDQwLCAwLCAob3V0cyBHOFJDOiRyVCksIChpbnMgRzhSQzokckEsIEc4UkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAic3ViZiAkclQsICRyQSwgJHJCIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyVCwgKHN1YiBHOFJDOiRyQiwgRzhSQzokckEpKV0+Ow0KK2RlZiBORUc4ICAgIDogWE9Gb3JtXzM8MzEsIDEwNCwgMCwgKG91dHMgRzhSQzokclQpLCAoaW5zIEc4UkM6JHJBKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJuZWcgJHJULCAkckEiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokclQsIChpbmVnIEc4UkM6JHJBKSldPjsNCitsZXQgVXNlcyA9IFtDQVJSWV0sIERlZnMgPSBbQ0FSUlldIGluIHsNCitkZWYgQURERTggICA6IFhPRm9ybV8xPDMxLCAxMzgsIDAsIChvdXRzIEc4UkM6JHJUKSwgKGlucyBHOFJDOiRyQSwgRzhSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgImFkZGUgJHJULCAkckEsICRyQiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyVCwgKGFkZGUgRzhSQzokckEsIEc4UkM6JHJCKSldPjsNCitkZWYgQURETUU4ICA6IFhPRm9ybV8zPDMxLCAyMzQsIDAsIChvdXRzIEc4UkM6JHJUKSwgKGlucyBHOFJDOiRyQSksDQorICAgICAgICAgICAgICAgICAgICAgICAiYWRkbWUgJHJULCAkckEiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokclQsIChhZGRlIEc4UkM6JHJBLCAtMSkpXT47DQorZGVmIEFERFpFOCAgOiBYT0Zvcm1fMzwzMSwgMjAyLCAwLCAob3V0cyBHOFJDOiRyVCksIChpbnMgRzhSQzokckEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgImFkZHplICRyVCwgJHJBIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJULCAoYWRkZSBHOFJDOiRyQSwgMCkpXT47DQorZGVmIFNVQkZFOCAgOiBYT0Zvcm1fMTwzMSwgMTM2LCAwLCAob3V0cyBHOFJDOiRyVCksIChpbnMgRzhSQzokckEsIEc4UkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJzdWJmZSAkclQsICRyQSwgJHJCIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJULCAoc3ViZSBHOFJDOiRyQiwgRzhSQzokckEpKV0+Ow0KK2RlZiBTVUJGTUU4IDogWE9Gb3JtXzM8MzEsIDIzMiwgMCwgKG91dHMgRzhSQzokclQpLCAoaW5zIEc4UkM6JHJBKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJzdWJmbWUgJHJULCAkckEiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokclQsIChzdWJlIC0xLCBHOFJDOiRyQSkpXT47DQorZGVmIFNVQkZaRTggOiBYT0Zvcm1fMzwzMSwgMjAwLCAwLCAob3V0cyBHOFJDOiRyVCksIChpbnMgRzhSQzokckEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInN1YmZ6ZSAkclQsICRyQSIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyVCwgKHN1YmUgMCwgRzhSQzokckEpKV0+Ow0KK30NCisNCisNCitkZWYgTVVMSEQgOiBYT0Zvcm1fMTwzMSwgNzMsIDAsIChvdXRzIEc4UkM6JHJUKSwgKGlucyBHOFJDOiRyQSwgRzhSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJtdWxoZCAkclQsICRyQSwgJHJCIiwgSW50TXVsSFcsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokclQsIChtdWxocyBHOFJDOiRyQSwgRzhSQzokckIpKV0+Ow0KK2RlZiBNVUxIRFUgOiBYT0Zvcm1fMTwzMSwgOSwgMCwgKG91dHMgRzhSQzokclQpLCAoaW5zIEc4UkM6JHJBLCBHOFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgIm11bGhkdSAkclQsICRyQSwgJHJCIiwgSW50TXVsSFdVLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJULCAobXVsaHUgRzhSQzokckEsIEc4UkM6JHJCKSldPjsNCisNCitkZWYgQ01QRCAgIDogWEZvcm1fMTZfZXh0PDMxLCAwLCAob3V0cyBDUlJDOiRjckQpLCAoaW5zIEc4UkM6JHJBLCBHOFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAiY21wZCAkY3JELCAkckEsICRyQiIsIEludENvbXBhcmU+LCBpc1BQQzY0Ow0KK2RlZiBDTVBMRCAgOiBYRm9ybV8xNl9leHQ8MzEsIDMyLCAob3V0cyBDUlJDOiRjckQpLCAoaW5zIEc4UkM6JHJBLCBHOFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAiY21wbGQgJGNyRCwgJHJBLCAkckIiLCBJbnRDb21wYXJlPiwgaXNQUEM2NDsNCitkZWYgQ01QREkgIDogREZvcm1fNV9leHQ8MTEsIChvdXRzIENSUkM6JGNyRCksIChpbnMgRzhSQzokckEsIHMxNmltbTokaW1tKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImNtcGRpICRjckQsICRyQSwgJGltbSIsIEludENvbXBhcmU+LCBpc1BQQzY0Ow0KK2RlZiBDTVBMREkgOiBERm9ybV82X2V4dDwxMCwgKG91dHMgQ1JSQzokZHN0KSwgKGlucyBHOFJDOiRzcmMxLCB1MTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAiY21wbGRpICRkc3QsICRzcmMxLCAkc3JjMiIsIEludENvbXBhcmU+LCBpc1BQQzY0Ow0KKw0KK2RlZiBTTEQgIDogWEZvcm1fNjwzMSwgIDI3LCAob3V0cyBHOFJDOiRyQSksIChpbnMgRzhSQzokclMsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgInNsZCAkckEsICRyUywgJHJCIiwgSW50Um90YXRlRCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckEsIChQUENzaGwgRzhSQzokclMsIEdQUkM6JHJCKSldPiwgaXNQUEM2NDsNCitkZWYgU1JEICA6IFhGb3JtXzY8MzEsIDUzOSwgKG91dHMgRzhSQzokckEpLCAoaW5zIEc4UkM6JHJTLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICJzcmQgJHJBLCAkclMsICRyQiIsIEludFJvdGF0ZUQsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJBLCAoUFBDc3JsIEc4UkM6JHJTLCBHUFJDOiRyQikpXT4sIGlzUFBDNjQ7DQorbGV0IERlZnMgPSBbQ0FSUlldIGluIHsNCitkZWYgU1JBRCA6IFhGb3JtXzY8MzEsIDc5NCwgKG91dHMgRzhSQzokckEpLCAoaW5zIEc4UkM6JHJTLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICJzcmFkICRyQSwgJHJTLCAkckIiLCBJbnRSb3RhdGVELA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyQSwgKFBQQ3NyYSBHOFJDOiRyUywgR1BSQzokckIpKV0+LCBpc1BQQzY0Ow0KK30NCisgICAgICAgICAgICAgICAgICAgDQorZGVmIEVYVFNCOCA6IFhGb3JtXzExPDMxLCA5NTQsIChvdXRzIEc4UkM6JHJBKSwgKGlucyBHOFJDOiRyUyksDQorICAgICAgICAgICAgICAgICAgICAgICJleHRzYiAkckEsICRyUyIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJBLCAoc2V4dF9pbnJlZyBHOFJDOiRyUywgaTgpKV0+Ow0KK2RlZiBFWFRTSDggOiBYRm9ybV8xMTwzMSwgOTIyLCAob3V0cyBHOFJDOiRyQSksIChpbnMgRzhSQzokclMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZXh0c2ggJHJBLCAkclMiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyQSwgKHNleHRfaW5yZWcgRzhSQzokclMsIGkxNikpXT47DQorDQorZGVmIEVYVFNXICA6IFhGb3JtXzExPDMxLCA5ODYsIChvdXRzIEc4UkM6JHJBKSwgKGlucyBHOFJDOiRyUyksDQorICAgICAgICAgICAgICAgICAgICAgICJleHRzdyAkckEsICRyUyIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJBLCAoc2V4dF9pbnJlZyBHOFJDOiRyUywgaTMyKSldPiwgaXNQUEM2NDsNCisvLy8gRVhUU1dfMzIgLSBKdXN0IGxpa2UgRVhUU1csIGJ1dCB3b3JrcyBvbiAnMzItYml0JyByZWdpc3RlcnMuDQorZGVmIEVYVFNXXzMyIDogWEZvcm1fMTE8MzEsIDk4NiwgKG91dHMgR1BSQzokckEpLCAoaW5zIEdQUkM6JHJTKSwNCisgICAgICAgICAgICAgICAgICAgICAgImV4dHN3ICRyQSwgJHJTIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckEsIChQUENleHRzd18zMiBHUFJDOiRyUykpXT4sIGlzUFBDNjQ7DQorZGVmIEVYVFNXXzMyXzY0IDogWEZvcm1fMTE8MzEsIDk4NiwgKG91dHMgRzhSQzokckEpLCAoaW5zIEdQUkM6JHJTKSwNCisgICAgICAgICAgICAgICAgICAgICAgImV4dHN3ICRyQSwgJHJTIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckEsIChzZXh0IEdQUkM6JHJTKSldPiwgaXNQUEM2NDsNCisNCitsZXQgRGVmcyA9IFtDQVJSWV0gaW4gew0KK2RlZiBTUkFESSAgOiBYU0Zvcm1fMTwzMSwgNDEzLCAob3V0cyBHOFJDOiRyQSksIChpbnMgRzhSQzokclMsIHU2aW1tOiRTSCksDQorICAgICAgICAgICAgICAgICAgICAgICJzcmFkaSAkckEsICRyUywgJFNIIiwgSW50Um90YXRlRCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckEsIChzcmEgRzhSQzokclMsIChpMzIgaW1tOiRTSCkpKV0+LCBpc1BQQzY0Ow0KK30NCitkZWYgQ05UTFpEIDogWEZvcm1fMTE8MzEsIDU4LCAob3V0cyBHOFJDOiRyQSksIChpbnMgRzhSQzokclMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY250bHpkICRyQSwgJHJTIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckEsIChjdGx6IEc4UkM6JHJTKSldPjsNCisNCitkZWYgRElWRCAgOiBYT0Zvcm1fMTwzMSwgNDg5LCAwLCAob3V0cyBHOFJDOiRyVCksIChpbnMgRzhSQzokckEsIEc4UkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAiZGl2ZCAkclQsICRyQSwgJHJCIiwgSW50RGl2RCwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyVCwgKHNkaXYgRzhSQzokckEsIEc4UkM6JHJCKSldPiwgaXNQUEM2NCwNCisgICAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0ZpcnN0LCBQUEM5NzBfREdyb3VwX0NyYWNrZWQ7DQorZGVmIERJVkRVIDogWE9Gb3JtXzE8MzEsIDQ1NywgMCwgKG91dHMgRzhSQzokclQpLCAoaW5zIEc4UkM6JHJBLCBHOFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgImRpdmR1ICRyVCwgJHJBLCAkckIiLCBJbnREaXZELA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJULCAodWRpdiBHOFJDOiRyQSwgRzhSQzokckIpKV0+LCBpc1BQQzY0LA0KKyAgICAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfRmlyc3QsIFBQQzk3MF9ER3JvdXBfQ3JhY2tlZDsNCitkZWYgTVVMTEQgOiBYT0Zvcm1fMTwzMSwgMjMzLCAwLCAob3V0cyBHOFJDOiRyVCksIChpbnMgRzhSQzokckEsIEc4UkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAibXVsbGQgJHJULCAkckEsICRyQiIsIEludE11bEhELA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJULCAobXVsIEc4UkM6JHJBLCBHOFJDOiRyQikpXT4sIGlzUFBDNjQ7DQorDQorDQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4gew0KK2RlZiBSTERJTUkgOiBNREZvcm1fMTwzMCwgMywNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRzhSQzokckEpLCAoaW5zIEc4UkM6JHJTaSwgRzhSQzokclMsIHU2aW1tOiRTSCwgdTZpbW06JE1CKSwNCisgICAgICAgICAgICAgICAgICAgICAgInJsZGltaSAkckEsICRyUywgJFNILCAkTUIiLCBJbnRSb3RhdGVELA0KKyAgICAgICAgICAgICAgICAgICAgICBbXT4sIGlzUFBDNjQsIFJlZ0NvbnN0cmFpbnQ8IiRyU2kgPSAkckEiPiwNCisgICAgICAgICAgICAgICAgICAgICAgTm9FbmNvZGU8IiRyU2kiPjsNCit9DQorDQorLy8gUm90YXRlIGluc3RydWN0aW9ucy4NCitkZWYgUkxEQ0wgIDogTURGb3JtXzE8MzAsIDAsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEc4UkM6JHJBKSwgKGlucyBHOFJDOiRyUywgR1BSQzokckIsIHU2aW1tOiRNQiksDQorICAgICAgICAgICAgICAgICAgICAgICJybGRjbCAkckEsICRyUywgJHJCLCAkTUIiLCBJbnRSb3RhdGVELA0KKyAgICAgICAgICAgICAgICAgICAgICBbXT4sIGlzUFBDNjQ7DQorZGVmIFJMRElDTCA6IE1ERm9ybV8xPDMwLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHOFJDOiRyQSksIChpbnMgRzhSQzokclMsIHU2aW1tOiRTSCwgdTZpbW06JE1CKSwNCisgICAgICAgICAgICAgICAgICAgICAgInJsZGljbCAkckEsICRyUywgJFNILCAkTUIiLCBJbnRSb3RhdGVELA0KKyAgICAgICAgICAgICAgICAgICAgICBbXT4sIGlzUFBDNjQ7DQorZGVmIFJMRElDUiA6IE1ERm9ybV8xPDMwLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHOFJDOiRyQSksIChpbnMgRzhSQzokclMsIHU2aW1tOiRTSCwgdTZpbW06JE1FKSwNCisgICAgICAgICAgICAgICAgICAgICAgInJsZGljciAkckEsICRyUywgJFNILCAkTUUiLCBJbnRSb3RhdGVELA0KKyAgICAgICAgICAgICAgICAgICAgICBbXT4sIGlzUFBDNjQ7DQorfSAgLy8gRW5kIEZYVSBPcGVyYXRpb25zLg0KKw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMuDQorLy8NCisNCisNCisvLyBTaWduIGV4dGVuZGluZyBsb2Fkcy4NCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIFBQQzk3MF9Vbml0ID0gMiBpbiB7DQorZGVmIExIQTg6IERGb3JtXzE8NDIsIChvdXRzIEc4UkM6JHJEKSwgKGlucyBtZW1yaTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAibGhhICRyRCwgJHNyYyIsIExkU3RMSEEsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckQsIChzZXh0bG9hZGkxNiBpYWRkcjokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0NyYWNrZWQ7DQorZGVmIExXQSAgOiBEU0Zvcm1fMTw1OCwgMiwgKG91dHMgRzhSQzokckQpLCAoaW5zIG1lbXJpeDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJsd2EgJHJELCAkc3JjIiwgTGRTdExXQSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJELCAoc2V4dGxvYWRpMzIgaXhhZGRyOiRzcmMpKV0+LCBpc1BQQzY0LA0KKyAgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KK2RlZiBMSEFYODogWEZvcm1fMTwzMSwgMzQzLCAob3V0cyBHOFJDOiRyRCksIChpbnMgbWVtcnI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJsaGF4ICRyRCwgJHNyYyIsIExkU3RMSEEsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJELCAoc2V4dGxvYWRpMTYgeGFkZHI6JHNyYykpXT4sDQorICAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfQ3JhY2tlZDsNCitkZWYgTFdBWCA6IFhGb3JtXzE8MzEsIDM0MSwgKG91dHMgRzhSQzokckQpLCAoaW5zIG1lbXJyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibHdheCAkckQsICRzcmMiLCBMZFN0TEhBLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyRCwgKHNleHRsb2FkaTMyIHhhZGRyOiRzcmMpKV0+LCBpc1BQQzY0LA0KKyAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0NyYWNrZWQ7DQorDQorLy8gVXBkYXRlIGZvcm1zLg0KK2xldCBtYXlMb2FkID0gMSBpbg0KK2RlZiBMSEFVOCA6IERGb3JtXzE8NDMsIChvdXRzIEc4UkM6JHJELCBwdHJfcmM6JGVhX3Jlc3VsdCksIChpbnMgc3ltYm9sTG86JGRpc3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9yYzokckEpLA0KKyAgICAgICAgICAgICAgICAgICAgImxoYXUgJHJELCAkZGlzcCgkckEpIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICBbXT4sIFJlZ0NvbnN0cmFpbnQ8IiRyQSA9ICRlYV9yZXN1bHQiPiwNCisgICAgICAgICAgICAgICAgICAgIE5vRW5jb2RlPCIkZWFfcmVzdWx0Ij47DQorLy8gTk8gTFdBVSENCisNCit9DQorDQorLy8gWmVybyBleHRlbmRpbmcgbG9hZHMuDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBQUEM5NzBfVW5pdCA9IDIgaW4gew0KK2RlZiBMQlo4IDogREZvcm1fMTwzNCwgKG91dHMgRzhSQzokckQpLCAoaW5zIG1lbXJpOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJsYnogJHJELCAkc3JjIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckQsICh6ZXh0bG9hZGk4IGlhZGRyOiRzcmMpKV0+Ow0KK2RlZiBMSFo4IDogREZvcm1fMTw0MCwgKG91dHMgRzhSQzokckQpLCAoaW5zIG1lbXJpOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJsaHogJHJELCAkc3JjIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckQsICh6ZXh0bG9hZGkxNiBpYWRkcjokc3JjKSldPjsNCitkZWYgTFdaOCA6IERGb3JtXzE8MzIsIChvdXRzIEc4UkM6JHJEKSwgKGlucyBtZW1yaTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAibHd6ICRyRCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJELCAoemV4dGxvYWRpMzIgaWFkZHI6JHNyYykpXT4sIGlzUFBDNjQ7DQorDQorZGVmIExCWlg4IDogWEZvcm1fMTwzMSwgIDg3LCAob3V0cyBHOFJDOiRyRCksIChpbnMgbWVtcnI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJsYnp4ICRyRCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyRCwgKHpleHRsb2FkaTggeGFkZHI6JHNyYykpXT47DQorZGVmIExIWlg4IDogWEZvcm1fMTwzMSwgMjc5LCAob3V0cyBHOFJDOiRyRCksIChpbnMgbWVtcnI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJsaHp4ICRyRCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyRCwgKHpleHRsb2FkaTE2IHhhZGRyOiRzcmMpKV0+Ow0KK2RlZiBMV1pYOCA6IFhGb3JtXzE8MzEsICAyMywgKG91dHMgRzhSQzokckQpLCAoaW5zIG1lbXJyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibHd6eCAkckQsICRzcmMiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckQsICh6ZXh0bG9hZGkzMiB4YWRkcjokc3JjKSldPjsNCisgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgIA0KKy8vIFVwZGF0ZSBmb3Jtcy4NCitsZXQgbWF5TG9hZCA9IDEgaW4gew0KK2RlZiBMQlpVOCA6IERGb3JtXzE8MzUsIChvdXRzIEc4UkM6JHJELCBwdHJfcmM6JGVhX3Jlc3VsdCksIChpbnMgbWVtcmk6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICAgImxienUgJHJELCAkYWRkciIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgW10+LCBSZWdDb25zdHJhaW50PCIkYWRkci5yZWcgPSAkZWFfcmVzdWx0Ij4sDQorICAgICAgICAgICAgICAgICAgICBOb0VuY29kZTwiJGVhX3Jlc3VsdCI+Ow0KK2RlZiBMSFpVOCA6IERGb3JtXzE8NDEsIChvdXRzIEc4UkM6JHJELCBwdHJfcmM6JGVhX3Jlc3VsdCksIChpbnMgbWVtcmk6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICAgImxoenUgJHJELCAkYWRkciIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgW10+LCBSZWdDb25zdHJhaW50PCIkYWRkci5yZWcgPSAkZWFfcmVzdWx0Ij4sDQorICAgICAgICAgICAgICAgICAgICBOb0VuY29kZTwiJGVhX3Jlc3VsdCI+Ow0KK2RlZiBMV1pVOCA6IERGb3JtXzE8MzMsIChvdXRzIEc4UkM6JHJELCBwdHJfcmM6JGVhX3Jlc3VsdCksIChpbnMgbWVtcmk6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICAgImx3enUgJHJELCAkYWRkciIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgW10+LCBSZWdDb25zdHJhaW50PCIkYWRkci5yZWcgPSAkZWFfcmVzdWx0Ij4sDQorICAgICAgICAgICAgICAgICAgICBOb0VuY29kZTwiJGVhX3Jlc3VsdCI+Ow0KK30NCit9DQorDQorDQorLy8gRnVsbCA4LWJ5dGUgbG9hZHMuDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBQUEM5NzBfVW5pdCA9IDIgaW4gew0KK2RlZiBMRCAgIDogRFNGb3JtXzE8NTgsIDAsIChvdXRzIEc4UkM6JHJEKSwgKGlucyBtZW1yaXg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAibGQgJHJELCAkc3JjIiwgTGRTdExELA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRzhSQzokckQsIChsb2FkIGl4YWRkcjokc3JjKSldPiwgaXNQUEM2NDsNCitkZWYgTER0b2M6IERTRm9ybV8xPDU4LCAwLCAob3V0cyBHOFJDOiRyRCksIChpbnMgdG9jZW50cnk6JGRpc3AsIEc4UkM6JHJlZyksDQorICAgICAgICAgICAgICAgICAgICAibGQgJHJELCAkZGlzcCgkcmVnKSIsIExkU3RMRCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEc4UkM6JHJELA0KKyAgICAgICAgICAgICAgICAgICAgIChQUEN0b2NfZW50cnkgdGdsb2JhbGFkZHI6JGRpc3AsIEc4UkM6JHJlZykpXT4sIGlzUFBDNjQ7DQorbGV0IFJTVCA9IDIsIERTID0gOCBpbg0KK2RlZiBMRGludG9fdG9jOiBEU0Zvcm1fMTw1OCwgMCwgKG91dHMpLCAoaW5zIEc4UkM6JHJlZyksDQorICAgICAgICAgICAgICAgICAgICAibGQgMiwgOCgkcmVnKSIsIExkU3RMRCwNCisgICAgICAgICAgICAgICAgICAgIFsoUFBDbG9hZF90b2MgRzhSQzokcmVnKV0+LCBpc1BQQzY0Ow0KK2xldCBSU1QgPSAyLCBEUyA9IDQwLCBSQSA9IDEgaW4NCitkZWYgTER0b2NfcmVzdG9yZSA6IERTRm9ybV8xPDU4LCAwLCAob3V0cyksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICAgImxkIDIsIDQwKDEpIiwgTGRTdExELA0KKyAgICAgICAgICAgICAgICAgICAgW10+LCBpc1BQQzY0Ow0KK2RlZiBMRFggIDogWEZvcm1fMTwzMSwgIDIxLCAob3V0cyBHOFJDOiRyRCksIChpbnMgbWVtcnI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJsZHggJHJELCAkc3JjIiwgTGRTdExELA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHOFJDOiRyRCwgKGxvYWQgeGFkZHI6JHNyYykpXT4sIGlzUFBDNjQ7DQorICAgICAgICAgICAgICAgICAgIA0KK2xldCBtYXlMb2FkID0gMSBpbg0KK2RlZiBMRFUgIDogRFNGb3JtXzE8NTgsIDEsIChvdXRzIEc4UkM6JHJELCBwdHJfcmM6JGVhX3Jlc3VsdCksIChpbnMgbWVtcml4OiRhZGRyKSwNCisgICAgICAgICAgICAgICAgICAgICJsZHUgJHJELCAkYWRkciIsIExkU3RMRCwNCisgICAgICAgICAgICAgICAgICAgIFtdPiwgUmVnQ29uc3RyYWludDwiJGFkZHIucmVnID0gJGVhX3Jlc3VsdCI+LCBpc1BQQzY0LA0KKyAgICAgICAgICAgICAgICAgICAgTm9FbmNvZGU8IiRlYV9yZXN1bHQiPjsNCisNCit9DQorDQorZGVmIDogUGF0PChQUEN0b2NfcmVzdG9yZSksDQorICAgICAgICAgIChMRHRvY19yZXN0b3JlKT47DQorZGVmIDogUGF0PChQUENsb2FkIGl4YWRkcjokc3JjKSwNCisgICAgICAgICAgKExEIGl4YWRkcjokc3JjKT47DQorZGVmIDogUGF0PChQUENsb2FkIHhhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoTERYIHhhZGRyOiRzcmMpPjsNCisNCitsZXQgUFBDOTcwX1VuaXQgPSAyIGluIHsNCisvLyBUcnVuY2F0aW5nIHN0b3Jlcy4gICAgICAgICAgICAgICAgICAgICAgIA0KK2RlZiBTVEI4IDogREZvcm1fMTwzOCwgKG91dHMpLCAoaW5zIEc4UkM6JHJTLCBtZW1yaTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgInN0YiAkclMsICRzcmMiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTggRzhSQzokclMsIGlhZGRyOiRzcmMpXT47DQorZGVmIFNUSDggOiBERm9ybV8xPDQ0LCAob3V0cyksIChpbnMgRzhSQzokclMsIG1lbXJpOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAic3RoICRyUywgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpMTYgRzhSQzokclMsIGlhZGRyOiRzcmMpXT47DQorZGVmIFNUVzggOiBERm9ybV8xPDM2LCAob3V0cyksIChpbnMgRzhSQzokclMsIG1lbXJpOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAic3R3ICRyUywgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpMzIgRzhSQzokclMsIGlhZGRyOiRzcmMpXT47DQorZGVmIFNUQlg4IDogWEZvcm1fODwzMSwgMjE1LCAob3V0cyksIChpbnMgRzhSQzokclMsIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic3RieCAkclMsICRkc3QiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTggRzhSQzokclMsIHhhZGRyOiRkc3QpXT4sIA0KKyAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0NyYWNrZWQ7DQorZGVmIFNUSFg4IDogWEZvcm1fODwzMSwgNDA3LCAob3V0cyksIChpbnMgRzhSQzokclMsIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic3RoeCAkclMsICRkc3QiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTE2IEc4UkM6JHJTLCB4YWRkcjokZHN0KV0+LCANCisgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KK2RlZiBTVFdYOCA6IFhGb3JtXzg8MzEsIDE1MSwgKG91dHMpLCAoaW5zIEc4UkM6JHJTLCBtZW1ycjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInN0d3ggJHJTLCAkZHN0IiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWkzMiBHOFJDOiRyUywgeGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KKy8vIE5vcm1hbCA4LWJ5dGUgc3RvcmVzLg0KK2RlZiBTVEQgIDogRFNGb3JtXzE8NjIsIDAsIChvdXRzKSwgKGlucyBHOFJDOiRyUywgbWVtcml4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgInN0ZCAkclMsICRkc3QiLCBMZFN0U1RELA0KKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBHOFJDOiRyUywgaXhhZGRyOiRkc3QpXT4sIGlzUFBDNjQ7DQorZGVmIFNURFggIDogWEZvcm1fODwzMSwgMTQ5LCAob3V0cyksIChpbnMgRzhSQzokclMsIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic3RkeCAkclMsICRkc3QiLCBMZFN0U1RELA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIEc4UkM6JHJTLCB4YWRkcjokZHN0KV0+LCBpc1BQQzY0LA0KKyAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0NyYWNrZWQ7DQorfQ0KKw0KK2xldCBQUEM5NzBfVW5pdCA9IDIgaW4gew0KKw0KK2RlZiBTVEJVOCA6IERGb3JtXzE8MzgsIChvdXRzIHB0cl9yYzokZWFfcmVzKSwgKGlucyBHOFJDOiRyUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbExvOiRwdHJvZmYsIHB0cl9yYzokcHRycmVnKSwNCisgICAgICAgICAgICAgICAgICAgICJzdGJ1ICRyUywgJHB0cm9mZigkcHRycmVnKSIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgcHRyX3JjOiRlYV9yZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlX3RydW5jc3RpOCBHOFJDOiRyUywgcHRyX3JjOiRwdHJyZWcsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWFkZHJvZmY6JHB0cm9mZikpXT4sDQorICAgICAgICAgICAgICAgICAgICBSZWdDb25zdHJhaW50PCIkcHRycmVnID0gJGVhX3JlcyI+LCBOb0VuY29kZTwiJGVhX3JlcyI+Ow0KK2RlZiBTVEhVOCA6IERGb3JtXzE8NDUsIChvdXRzIHB0cl9yYzokZWFfcmVzKSwgKGlucyBHOFJDOiRyUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbExvOiRwdHJvZmYsIHB0cl9yYzokcHRycmVnKSwNCisgICAgICAgICAgICAgICAgICAgICJzdGh1ICRyUywgJHB0cm9mZigkcHRycmVnKSIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgcHRyX3JjOiRlYV9yZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgKHByZV90cnVuY3N0aTE2IEc4UkM6JHJTLCBwdHJfcmM6JHB0cnJlZywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhZGRyb2ZmOiRwdHJvZmYpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJHB0cnJlZyA9ICRlYV9yZXMiPiwgTm9FbmNvZGU8IiRlYV9yZXMiPjsNCisNCitkZWYgU1REVSA6IERTRm9ybV8xPDYyLCAxLCAob3V0cyBwdHJfcmM6JGVhX3JlcyksIChpbnMgRzhSQzokclMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTZpbW1YNDokcHRyb2ZmLCBwdHJfcmM6JHB0cnJlZyksDQorICAgICAgICAgICAgICAgICAgICAic3RkdSAkclMsICRwdHJvZmYoJHB0cnJlZykiLCBMZFN0U1RELA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgcHRyX3JjOiRlYV9yZXMsIChwcmVfc3RvcmUgRzhSQzokclMsIHB0cl9yYzokcHRycmVnLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhZGRyb2ZmOiRwdHJvZmYpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJHB0cnJlZyA9ICRlYV9yZXMiPiwgTm9FbmNvZGU8IiRlYV9yZXMiPiwNCisgICAgICAgICAgICAgICAgICAgIGlzUFBDNjQ7DQorDQorbGV0IG1heVN0b3JlID0gMSBpbg0KK2RlZiBTVERVWCA6IFhGb3JtXzg8MzEsIDE4MSwgKG91dHMpLCAoaW5zIEc4UkM6JHJTLCBtZW1ycjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInN0ZHV4ICRyUywgJGRzdCIsIExkU3RTVEQsDQorICAgICAgICAgICAgICAgICAgIFtdPiwgaXNQUEM2NDsNCisNCisvLyBTVERfMzIvU1REWF8zMiAtIEp1c3QgbGlrZSBTVEQvU1REWCwgYnV0IHVzZXMgYSAnMzItYml0JyBpbnB1dCByZWdpc3Rlci4NCitkZWYgU1REXzMyICA6IERTRm9ybV8xPDYyLCAwLCAob3V0cyksIChpbnMgR1BSQzokclQsIG1lbXJpeDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICJzdGQgJHJULCAkZHN0IiwgTGRTdFNURCwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoUFBDc3RkXzMyICBHUFJDOiRyVCwgaXhhZGRyOiRkc3QpXT4sIGlzUFBDNjQ7DQorZGVmIFNURFhfMzIgIDogWEZvcm1fODwzMSwgMTQ5LCAob3V0cyksIChpbnMgR1BSQzokclQsIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInN0ZHggJHJULCAkZHN0IiwgTGRTdFNURCwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoUFBDc3RkXzMyICBHUFJDOiRyVCwgeGFkZHI6JGRzdCldPiwgaXNQUEM2NCwNCisgICAgICAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfQ3JhY2tlZDsNCit9DQorDQorDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBGbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuDQorLy8NCisNCisNCitsZXQgUFBDOTcwX1VuaXQgPSAzLCBVc2VzID0gW1JNXSBpbiB7ICAvLyBGUFUgT3BlcmF0aW9ucy4NCitkZWYgRkNGSUQgIDogWEZvcm1fMjY8NjMsIDg0NiwgKG91dHMgRjhSQzokZnJEKSwgKGlucyBGOFJDOiRmckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZmNmaWQgJGZyRCwgJGZyQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokZnJELCAoUFBDZmNmaWQgRjhSQzokZnJCKSldPiwgaXNQUEM2NDsNCitkZWYgRkNUSURaIDogWEZvcm1fMjY8NjMsIDgxNSwgKG91dHMgRjhSQzokZnJEKSwgKGlucyBGOFJDOiRmckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZmN0aWR6ICRmckQsICRmckIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JGZyRCwgKFBQQ2ZjdGlkeiBGOFJDOiRmckIpKV0+LCBpc1BQQzY0Ow0KK30NCisNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEluc3RydWN0aW9uIFBhdHRlcm5zDQorLy8NCisNCisvLyBFeHRlbnNpb25zIGFuZCB0cnVuY2F0ZXMgdG8vZnJvbSAzMi1iaXQgcmVncy4NCitkZWYgOiBQYXQ8KGk2NCAoemV4dCBHUFJDOiRpbikpLA0KKyAgICAgICAgICAoUkxESUNMIChPUjRUbzggR1BSQzokaW4sIEdQUkM6JGluKSwgMCwgMzIpPjsNCitkZWYgOiBQYXQ8KGk2NCAoYW55ZXh0IEdQUkM6JGluKSksDQorICAgICAgICAgIChPUjRUbzggR1BSQzokaW4sIEdQUkM6JGluKT47DQorZGVmIDogUGF0PChpMzIgKHRydW5jIEc4UkM6JGluKSksDQorICAgICAgICAgIChPUjhUbzQgRzhSQzokaW4sIEc4UkM6JGluKT47DQorDQorLy8gRXh0ZW5kaW5nIGxvYWRzIHdpdGggaTY0IHRhcmdldHMuDQorZGVmIDogUGF0PCh6ZXh0bG9hZGkxIGlhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoTEJaOCBpYWRkcjokc3JjKT47DQorZGVmIDogUGF0PCh6ZXh0bG9hZGkxIHhhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoTEJaWDggeGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoZXh0bG9hZGkxIGlhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoTEJaOCBpYWRkcjokc3JjKT47DQorZGVmIDogUGF0PChleHRsb2FkaTEgeGFkZHI6JHNyYyksDQorICAgICAgICAgIChMQlpYOCB4YWRkcjokc3JjKT47DQorZGVmIDogUGF0PChleHRsb2FkaTggaWFkZHI6JHNyYyksDQorICAgICAgICAgIChMQlo4IGlhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGV4dGxvYWRpOCB4YWRkcjokc3JjKSwNCisgICAgICAgICAgKExCWlg4IHhhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGV4dGxvYWRpMTYgaWFkZHI6JHNyYyksDQorICAgICAgICAgIChMSFo4IGlhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGV4dGxvYWRpMTYgeGFkZHI6JHNyYyksDQorICAgICAgICAgIChMSFpYOCB4YWRkcjokc3JjKT47DQorZGVmIDogUGF0PChleHRsb2FkaTMyIGlhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoTFdaOCBpYWRkcjokc3JjKT47DQorZGVmIDogUGF0PChleHRsb2FkaTMyIHhhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoTFdaWDggeGFkZHI6JHNyYyk+Ow0KKw0KKy8vIFN0YW5kYXJkIHNoaWZ0cy4gIFRoZXNlIGFyZSByZXByZXNlbnRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHJlYWwgc2hpZnRzIGFib3ZlDQorLy8gc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBzaGlmdHMgdGhhdCBhbGxvdyA2LWJpdCBhbmQgNy1iaXQgc2hpZnQNCisvLyBhbW91bnRzLg0KK2RlZiA6IFBhdDwoc3JhIEc4UkM6JHJTLCBHUFJDOiRyQiksDQorICAgICAgICAgIChTUkFEIEc4UkM6JHJTLCBHUFJDOiRyQik+Ow0KK2RlZiA6IFBhdDwoc3JsIEc4UkM6JHJTLCBHUFJDOiRyQiksDQorICAgICAgICAgIChTUkQgRzhSQzokclMsIEdQUkM6JHJCKT47DQorZGVmIDogUGF0PChzaGwgRzhSQzokclMsIEdQUkM6JHJCKSwNCisgICAgICAgICAgKFNMRCBHOFJDOiRyUywgR1BSQzokckIpPjsNCisNCisvLyBTSEwvU1JMDQorZGVmIDogUGF0PChzaGwgRzhSQzokaW4sIChpMzIgaW1tOiRpbW0pKSwNCisgICAgICAgICAgKFJMRElDUiBHOFJDOiRpbiwgaW1tOiRpbW0sIChTSEw2NCBpbW06JGltbSkpPjsNCitkZWYgOiBQYXQ8KHNybCBHOFJDOiRpbiwgKGkzMiBpbW06JGltbSkpLA0KKyAgICAgICAgICAoUkxESUNMIEc4UkM6JGluLCAoU1JMNjQgaW1tOiRpbW0pLCBpbW06JGltbSk+Ow0KKw0KKy8vIFJPVEwNCitkZWYgOiBQYXQ8KHJvdGwgRzhSQzokaW4sIEdQUkM6JHNoKSwNCisgICAgICAgICAgKFJMRENMIEc4UkM6JGluLCBHUFJDOiRzaCwgMCk+Ow0KK2RlZiA6IFBhdDwocm90bCBHOFJDOiRpbiwgKGkzMiBpbW06JGltbSkpLA0KKyAgICAgICAgICAoUkxESUNMIEc4UkM6JGluLCBpbW06JGltbSwgMCk+Ow0KKw0KKy8vIEhpIGFuZCBMbyBmb3IgRGFyd2luIEdsb2JhbCBBZGRyZXNzZXMuDQorZGVmIDogUGF0PChQUENoaSB0Z2xvYmFsYWRkcjokaW4sIDApLCAoTElTOCB0Z2xvYmFsYWRkcjokaW4pPjsNCitkZWYgOiBQYXQ8KFBQQ2xvIHRnbG9iYWxhZGRyOiRpbiwgMCksIChMSTggIHRnbG9iYWxhZGRyOiRpbik+Ow0KK2RlZiA6IFBhdDwoUFBDaGkgdGNvbnN0cG9vbDokaW4gLCAwKSwgKExJUzggdGNvbnN0cG9vbDokaW4pPjsNCitkZWYgOiBQYXQ8KFBQQ2xvIHRjb25zdHBvb2w6JGluICwgMCksIChMSTggIHRjb25zdHBvb2w6JGluKT47DQorZGVmIDogUGF0PChQUENoaSB0anVtcHRhYmxlOiRpbiAsIDApLCAoTElTOCB0anVtcHRhYmxlOiRpbik+Ow0KK2RlZiA6IFBhdDwoUFBDbG8gdGp1bXB0YWJsZTokaW4gLCAwKSwgKExJOCAgdGp1bXB0YWJsZTokaW4pPjsNCitkZWYgOiBQYXQ8KFBQQ2hpIHRibG9ja2FkZHJlc3M6JGluLCAwKSwgKExJUzggdGJsb2NrYWRkcmVzczokaW4pPjsNCitkZWYgOiBQYXQ8KFBQQ2xvIHRibG9ja2FkZHJlc3M6JGluLCAwKSwgKExJOCAgdGJsb2NrYWRkcmVzczokaW4pPjsNCitkZWYgOiBQYXQ8KGFkZCBHOFJDOiRpbiwgKFBQQ2hpIHRnbG9iYWxhZGRyOiRnLCAwKSksDQorICAgICAgICAgIChBRERJUzggRzhSQzokaW4sIHRnbG9iYWxhZGRyOiRnKT47DQorZGVmIDogUGF0PChhZGQgRzhSQzokaW4sIChQUENoaSB0Y29uc3Rwb29sOiRnLCAwKSksDQorICAgICAgICAgIChBRERJUzggRzhSQzokaW4sIHRjb25zdHBvb2w6JGcpPjsNCitkZWYgOiBQYXQ8KGFkZCBHOFJDOiRpbiwgKFBQQ2hpIHRqdW1wdGFibGU6JGcsIDApKSwNCisgICAgICAgICAgKEFERElTOCBHOFJDOiRpbiwgdGp1bXB0YWJsZTokZyk+Ow0KK2RlZiA6IFBhdDwoYWRkIEc4UkM6JGluLCAoUFBDaGkgdGJsb2NrYWRkcmVzczokZywgMCkpLA0KKyAgICAgICAgICAoQURESVM4IEc4UkM6JGluLCB0YmxvY2thZGRyZXNzOiRnKT47DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0luc3RyQWx0aXZlYy50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJbnN0ckFsdGl2ZWMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYTEzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJbnN0ckFsdGl2ZWMudGQKQEAgLTAsMCArMSw2OTUgQEAKKy8vPT09LSBQUENJbnN0ckFsdGl2ZWMudGQgLSBUaGUgUG93ZXJQQyBBbHRpdmVjIEV4dGVuc2lvbiAtLSotIHRhYmxlZ2VuIC0qLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBBbHRpdmVjIGV4dGVuc2lvbiB0byB0aGUgUG93ZXJQQyBpbnN0cnVjdGlvbiBzZXQuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQWx0aXZlYyB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgYW5kIHBhdHRlcm4gZnJhZ21lbnRzLg0KKy8vDQorDQorLy8gU2luY2Ugd2UgY2Fub25pY2FsaXplIGJ1aWxkdmVjdG9ycyB0byB2MTZpOCwgYWxsIHZub3RzICItMSIgb3BlcmFuZHMgd2lsbCBiZQ0KKy8vIG9mIHRoYXQgdHlwZS4NCitkZWYgdm5vdF9wcGMgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKHhvciBub2RlOiRpbiwgKGJpdGNvbnZlcnQgKHYxNmk4IGltbUFsbE9uZXNWKSkpPjsNCisNCitkZWYgdnBrdWh1bV9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbew0KKyAgcmV0dXJuIFBQQzo6aXNWUEtVSFVNU2h1ZmZsZU1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSwgZmFsc2UpOw0KK31dPjsNCitkZWYgdnBrdXd1bV9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbew0KKyAgcmV0dXJuIFBQQzo6aXNWUEtVV1VNU2h1ZmZsZU1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSwgZmFsc2UpOw0KK31dPjsNCitkZWYgdnBrdWh1bV91bmFyeV9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbew0KKyAgcmV0dXJuIFBQQzo6aXNWUEtVSFVNU2h1ZmZsZU1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSwgdHJ1ZSk7DQorfV0+Ow0KK2RlZiB2cGt1d3VtX3VuYXJ5X3NodWZmbGUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7DQorICByZXR1cm4gUFBDOjppc1ZQS1VXVU1TaHVmZmxlTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pLCB0cnVlKTsNCit9XT47DQorDQorDQorZGVmIHZtcmdsYl9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSAodjE2aTggbm9kZTokbGhzKSwgbm9kZTokcmhzKSwgW3sNCisgIHJldHVybiBQUEM6OmlzVk1SR0xTaHVmZmxlTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pLCAxLCBmYWxzZSk7DQorfV0+Ow0KK2RlZiB2bXJnbGhfc2h1ZmZsZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgKHYxNmk4IG5vZGU6JGxocyksIG5vZGU6JHJocyksIFt7DQorICByZXR1cm4gUFBDOjppc1ZNUkdMU2h1ZmZsZU1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSwgMiwgZmFsc2UpOw0KK31dPjsNCitkZWYgdm1yZ2x3X3NodWZmbGUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlICh2MTZpOCBub2RlOiRsaHMpLCBub2RlOiRyaHMpLCBbew0KKyAgcmV0dXJuIFBQQzo6aXNWTVJHTFNodWZmbGVNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTiksIDQsIGZhbHNlKTsNCit9XT47DQorZGVmIHZtcmdoYl9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSAodjE2aTggbm9kZTokbGhzKSwgbm9kZTokcmhzKSwgW3sNCisgIHJldHVybiBQUEM6OmlzVk1SR0hTaHVmZmxlTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pLCAxLCBmYWxzZSk7DQorfV0+Ow0KK2RlZiB2bXJnaGhfc2h1ZmZsZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgKHYxNmk4IG5vZGU6JGxocyksIG5vZGU6JHJocyksIFt7DQorICByZXR1cm4gUFBDOjppc1ZNUkdIU2h1ZmZsZU1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSwgMiwgZmFsc2UpOw0KK31dPjsNCitkZWYgdm1yZ2h3X3NodWZmbGUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlICh2MTZpOCBub2RlOiRsaHMpLCBub2RlOiRyaHMpLCBbew0KKyAgcmV0dXJuIFBQQzo6aXNWTVJHSFNodWZmbGVNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTiksIDQsIGZhbHNlKTsNCit9XT47DQorDQorDQorZGVmIHZtcmdsYl91bmFyeV9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlICh2MTZpOCBub2RlOiRsaHMpLCBub2RlOiRyaHMpLCBbew0KKyAgcmV0dXJuIFBQQzo6aXNWTVJHTFNodWZmbGVNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTiksIDEsIHRydWUpOw0KK31dPjsNCitkZWYgdm1yZ2xoX3VuYXJ5X3NodWZmbGUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlIG5vZGU6JGxocywgbm9kZTokcmhzKSwgW3sNCisgIHJldHVybiBQUEM6OmlzVk1SR0xTaHVmZmxlTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pLCAyLCB0cnVlKTsNCit9XT47DQorZGVmIHZtcmdsd191bmFyeV9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7DQorICByZXR1cm4gUFBDOjppc1ZNUkdMU2h1ZmZsZU1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSwgNCwgdHJ1ZSk7DQorfV0+Ow0KK2RlZiB2bXJnaGJfdW5hcnlfc2h1ZmZsZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbew0KKyAgcmV0dXJuIFBQQzo6aXNWTVJHSFNodWZmbGVNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTiksIDEsIHRydWUpOw0KK31dPjsNCitkZWYgdm1yZ2hoX3VuYXJ5X3NodWZmbGUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlIG5vZGU6JGxocywgbm9kZTokcmhzKSwgW3sNCisgIHJldHVybiBQUEM6OmlzVk1SR0hTaHVmZmxlTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pLCAyLCB0cnVlKTsNCit9XT47DQorZGVmIHZtcmdod191bmFyeV9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7DQorICByZXR1cm4gUFBDOjppc1ZNUkdIU2h1ZmZsZU1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSwgNCwgdHJ1ZSk7DQorfV0+Ow0KKw0KKw0KK2RlZiBWU0xET0lfZ2V0X2ltbSA6IFNETm9kZVhGb3JtPHZlY3Rvcl9zaHVmZmxlLCBbew0KKyAgcmV0dXJuIGdldEkzMkltbShQUEM6OmlzVlNMRE9JU2h1ZmZsZU1hc2soTiwgZmFsc2UpKTsNCit9XT47DQorZGVmIHZzbGRvaV9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7DQorICByZXR1cm4gUFBDOjppc1ZTTERPSVNodWZmbGVNYXNrKE4sIGZhbHNlKSAhPSAtMTsNCit9XSwgVlNMRE9JX2dldF9pbW0+Ow0KKw0KKw0KKy8vLyBWU0xET0lfdW5hcnkqIC0gVGhlc2UgYXJlIHVzZWQgdG8gbWF0Y2ggdnNsZG9pKFgsWCksIHdoaWNoIGlzIHR1cm5lZCBpbnRvDQorLy8vIHZlY3Rvcl9zaHVmZmxlKFgsdW5kZWYsbWFzaykgYnkgdGhlIGRhZyBjb21iaW5lci4NCitkZWYgVlNMRE9JX3VuYXJ5X2dldF9pbW0gOiBTRE5vZGVYRm9ybTx2ZWN0b3Jfc2h1ZmZsZSwgW3sNCisgIHJldHVybiBnZXRJMzJJbW0oUFBDOjppc1ZTTERPSVNodWZmbGVNYXNrKE4sIHRydWUpKTsNCit9XT47DQorZGVmIHZzbGRvaV91bmFyeV9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7DQorICByZXR1cm4gUFBDOjppc1ZTTERPSVNodWZmbGVNYXNrKE4sIHRydWUpICE9IC0xOw0KK31dLCBWU0xET0lfdW5hcnlfZ2V0X2ltbT47DQorDQorDQorLy8gVlNQTFQqX2dldF9pbW0geGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgdmVjdG9yX3NodWZmbGUgbWFzayB0byBWU1BMVCogaW1tLg0KK2RlZiBWU1BMVEJfZ2V0X2ltbSA6IFNETm9kZVhGb3JtPHZlY3Rvcl9zaHVmZmxlLCBbew0KKyAgcmV0dXJuIGdldEkzMkltbShQUEM6OmdldFZTUExUSW1tZWRpYXRlKE4sIDEpKTsNCit9XT47DQorZGVmIHZzcGx0Yl9zaHVmZmxlIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7DQorICByZXR1cm4gUFBDOjppc1NwbGF0U2h1ZmZsZU1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSwgMSk7DQorfV0sIFZTUExUQl9nZXRfaW1tPjsNCitkZWYgVlNQTFRIX2dldF9pbW0gOiBTRE5vZGVYRm9ybTx2ZWN0b3Jfc2h1ZmZsZSwgW3sNCisgIHJldHVybiBnZXRJMzJJbW0oUFBDOjpnZXRWU1BMVEltbWVkaWF0ZShOLCAyKSk7DQorfV0+Ow0KK2RlZiB2c3BsdGhfc2h1ZmZsZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbew0KKyAgcmV0dXJuIFBQQzo6aXNTcGxhdFNodWZmbGVNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTiksIDIpOw0KK31dLCBWU1BMVEhfZ2V0X2ltbT47DQorZGVmIFZTUExUV19nZXRfaW1tIDogU0ROb2RlWEZvcm08dmVjdG9yX3NodWZmbGUsIFt7DQorICByZXR1cm4gZ2V0STMySW1tKFBQQzo6Z2V0VlNQTFRJbW1lZGlhdGUoTiwgNCkpOw0KK31dPjsNCitkZWYgdnNwbHR3X3NodWZmbGUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlIG5vZGU6JGxocywgbm9kZTokcmhzKSwgW3sNCisgIHJldHVybiBQUEM6OmlzU3BsYXRTaHVmZmxlTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pLCA0KTsNCit9XSwgVlNQTFRXX2dldF9pbW0+Ow0KKw0KKw0KKy8vIFZTUExUSVNCX2dldF9pbW0geGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgYnVpbGRfdmVjdG9yIHRvIFZTUExUSVNCIGltbS4NCitkZWYgVlNQTFRJU0JfZ2V0X2ltbSA6IFNETm9kZVhGb3JtPGJ1aWxkX3ZlY3RvciwgW3sNCisgIHJldHVybiBQUEM6OmdldF9WU1BMVElfZWx0KE4sIDEsICpDdXJEQUcpOw0KK31dPjsNCitkZWYgdmVjc3BsdGlzYiA6IFBhdExlYWY8KGJ1aWxkX3ZlY3RvciksIFt7DQorICByZXR1cm4gUFBDOjpnZXRfVlNQTFRJX2VsdChOLCAxLCAqQ3VyREFHKS5nZXROb2RlKCkgIT0gMDsNCit9XSwgVlNQTFRJU0JfZ2V0X2ltbT47DQorDQorLy8gVlNQTFRJU0hfZ2V0X2ltbSB4Zm9ybSBmdW5jdGlvbjogY29udmVydCBidWlsZF92ZWN0b3IgdG8gVlNQTFRJU0ggaW1tLg0KK2RlZiBWU1BMVElTSF9nZXRfaW1tIDogU0ROb2RlWEZvcm08YnVpbGRfdmVjdG9yLCBbew0KKyAgcmV0dXJuIFBQQzo6Z2V0X1ZTUExUSV9lbHQoTiwgMiwgKkN1ckRBRyk7DQorfV0+Ow0KK2RlZiB2ZWNzcGx0aXNoIDogUGF0TGVhZjwoYnVpbGRfdmVjdG9yKSwgW3sNCisgIHJldHVybiBQUEM6OmdldF9WU1BMVElfZWx0KE4sIDIsICpDdXJEQUcpLmdldE5vZGUoKSAhPSAwOw0KK31dLCBWU1BMVElTSF9nZXRfaW1tPjsNCisNCisvLyBWU1BMVElTV19nZXRfaW1tIHhmb3JtIGZ1bmN0aW9uOiBjb252ZXJ0IGJ1aWxkX3ZlY3RvciB0byBWU1BMVElTVyBpbW0uDQorZGVmIFZTUExUSVNXX2dldF9pbW0gOiBTRE5vZGVYRm9ybTxidWlsZF92ZWN0b3IsIFt7DQorICByZXR1cm4gUFBDOjpnZXRfVlNQTFRJX2VsdChOLCA0LCAqQ3VyREFHKTsNCit9XT47DQorZGVmIHZlY3NwbHRpc3cgOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbew0KKyAgcmV0dXJuIFBQQzo6Z2V0X1ZTUExUSV9lbHQoTiwgNCwgKkN1ckRBRykuZ2V0Tm9kZSgpICE9IDA7DQorfV0sIFZTUExUSVNXX2dldF9pbW0+Ow0KKw0KK2RlZiBWX2ltbW5lZzAgOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbew0KKyAgcmV0dXJuIFBQQzo6aXNBbGxOZWdhdGl2ZVplcm9WZWN0b3IoTik7DQorfV0+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gSGVscGVycyBmb3IgZGVmaW5pbmcgaW5zdHJ1Y3Rpb25zIHRoYXQgZGlyZWN0bHkgY29ycmVzcG9uZCB0byBpbnRyaW5zaWNzLg0KKw0KKy8vIFZBMWFfSW50IC0gQSBWQUZvcm1fMWEgaW50cmluc2ljIGRlZmluaXRpb24uDQorY2xhc3MgVkExYV9JbnQ8Yml0czw2PiB4bywgc3RyaW5nIG9wYywgSW50cmluc2ljIEludElEPg0KKyAgOiBWQUZvcm1fMWE8eG8sIChvdXRzIFZSUkM6JHZEKSwgKGlucyBWUlJDOiR2QSwgVlJSQzokdkIsIFZSUkM6JHZDKSwNCisgICAgICAgICAgICAgICFzdHJjb25jYXQob3BjLCAiICR2RCwgJHZBLCAkdkIsICR2QyIpLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELCAoSW50SUQgVlJSQzokdkEsIFZSUkM6JHZCLCBWUlJDOiR2QykpXT47DQorDQorLy8gVlgxX0ludCAtIEEgVlhGb3JtXzEgaW50cmluc2ljIGRlZmluaXRpb24uDQorY2xhc3MgVlgxX0ludDxiaXRzPDExPiB4bywgc3RyaW5nIG9wYywgSW50cmluc2ljIEludElEPg0KKyAgOiBWWEZvcm1fMTx4bywgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICFzdHJjb25jYXQob3BjLCAiICR2RCwgJHZBLCAkdkIiKSwgVmVjRlAsDQorICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELCAoSW50SUQgVlJSQzokdkEsIFZSUkM6JHZCKSldPjsNCisNCisvLyBWWDJfSW50IC0gQSBWWEZvcm1fMiBpbnRyaW5zaWMgZGVmaW5pdGlvbi4NCitjbGFzcyBWWDJfSW50PGJpdHM8MTE+IHhvLCBzdHJpbmcgb3BjLCBJbnRyaW5zaWMgSW50SUQ+DQorICA6IFZYRm9ybV8yPHhvLCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkIpLA0KKyAgICAgICAgICAgICAhc3RyY29uY2F0KG9wYywgIiAkdkQsICR2QiIpLCBWZWNGUCwNCisgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsIChJbnRJRCBWUlJDOiR2QikpXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBJbnN0cnVjdGlvbiBEZWZpbml0aW9ucy4NCisNCitkZWYgRFNTICAgICAgOiBEU1NfRm9ybTw4MjIsIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIHU1aW1tOiRaRVJPMCwgdTVpbW06JFNUUk0sdTVpbW06JFpFUk8xLHU1aW1tOiRaRVJPMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgImRzcyAkU1RSTSIsIExkU3RHZW5lcmFsIC8qRklYTUUqLywgW10+Ow0KK2RlZiBEU1NBTEwgICA6IERTU19Gb3JtPDgyMiwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgdTVpbW06JE9ORSwgdTVpbW06JFpFUk8wLHU1aW1tOiRaRVJPMSx1NWltbTokWkVSTzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJkc3NhbGwiLCBMZFN0R2VuZXJhbCAvKkZJWE1FKi8sIFtdPjsNCitkZWYgRFNUICAgICAgOiBEU1NfRm9ybTwzNDIsIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIHU1aW1tOiRaRVJPLCB1NWltbTokU1RSTSwgR1BSQzokckEsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiZHN0ICRyQSwgJHJCLCAkU1RSTSIsIExkU3RHZW5lcmFsIC8qRklYTUUqLywgW10+Ow0KK2RlZiBEU1RUICAgICA6IERTU19Gb3JtPDM0MiwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgdTVpbW06JE9ORSwgdTVpbW06JFNUUk0sIEdQUkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICAgImRzdHQgJHJBLCAkckIsICRTVFJNIiwgTGRTdEdlbmVyYWwgLypGSVhNRSovLCBbXT47DQorZGVmIERTVFNUICAgIDogRFNTX0Zvcm08Mzc0LCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyB1NWltbTokWkVSTywgdTVpbW06JFNUUk0sIEdQUkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICAgImRzdHN0ICRyQSwgJHJCLCAkU1RSTSIsIExkU3RHZW5lcmFsIC8qRklYTUUqLywgW10+Ow0KK2RlZiBEU1RTVFQgICA6IERTU19Gb3JtPDM3NCwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgdTVpbW06JE9ORSwgdTVpbW06JFNUUk0sIEdQUkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICAgImRzdHN0dCAkckEsICRyQiwgJFNUUk0iLCBMZFN0R2VuZXJhbCAvKkZJWE1FKi8sIFtdPjsNCisNCitkZWYgRFNUNjQgICAgOiBEU1NfRm9ybTwzNDIsIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIHU1aW1tOiRaRVJPLCB1NWltbTokU1RSTSwgRzhSQzokckEsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiZHN0ICRyQSwgJHJCLCAkU1RSTSIsIExkU3RHZW5lcmFsIC8qRklYTUUqLywgW10+Ow0KK2RlZiBEU1RUNjQgICA6IERTU19Gb3JtPDM0MiwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgdTVpbW06JE9ORSwgdTVpbW06JFNUUk0sIEc4UkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICAgImRzdHQgJHJBLCAkckIsICRTVFJNIiwgTGRTdEdlbmVyYWwgLypGSVhNRSovLCBbXT47DQorZGVmIERTVFNUNjQgIDogRFNTX0Zvcm08Mzc0LCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyB1NWltbTokWkVSTywgdTVpbW06JFNUUk0sIEc4UkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICAgImRzdHN0ICRyQSwgJHJCLCAkU1RSTSIsIExkU3RHZW5lcmFsIC8qRklYTUUqLywgW10+Ow0KK2RlZiBEU1RTVFQ2NCA6IERTU19Gb3JtPDM3NCwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgdTVpbW06JE9ORSwgdTVpbW06JFNUUk0sIEc4UkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICAgImRzdHN0dCAkckEsICRyQiwgJFNUUk0iLCBMZFN0R2VuZXJhbCAvKkZJWE1FKi8sIFtdPjsNCisNCitkZWYgTUZWU0NSIDogVlhGb3JtXzQ8MTU0MCwgKG91dHMgVlJSQzokdkQpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1mdnNjciAkdkQiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsIChpbnRfcHBjX2FsdGl2ZWNfbWZ2c2NyKSldPjsgDQorZGVmIE1UVlNDUiA6IFZYRm9ybV81PDE2MDQsIChvdXRzKSwgKGlucyBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJtdHZzY3IgJHZCIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoaW50X3BwY19hbHRpdmVjX210dnNjciBWUlJDOiR2QildPjsgDQorDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBQUEM5NzBfVW5pdCA9IDIgaW4geyAgLy8gTG9hZHMuDQorZGVmIExWRUJYOiBYRm9ybV8xPDMxLCAgIDcsIChvdXRzIFZSUkM6JHZEKSwgKGlucyBtZW1ycjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImx2ZWJ4ICR2RCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKGludF9wcGNfYWx0aXZlY19sdmVieCB4b2FkZHI6JHNyYykpXT47DQorZGVmIExWRUhYOiBYRm9ybV8xPDMxLCAgMzksIChvdXRzIFZSUkM6JHZEKSwgKGlucyBtZW1ycjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImx2ZWh4ICR2RCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKGludF9wcGNfYWx0aXZlY19sdmVoeCB4b2FkZHI6JHNyYykpXT47DQorZGVmIExWRVdYOiBYRm9ybV8xPDMxLCAgNzEsIChvdXRzIFZSUkM6JHZEKSwgKGlucyBtZW1ycjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImx2ZXd4ICR2RCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKGludF9wcGNfYWx0aXZlY19sdmV3eCB4b2FkZHI6JHNyYykpXT47DQorZGVmIExWWCAgOiBYRm9ybV8xPDMxLCAxMDMsIChvdXRzIFZSUkM6JHZEKSwgKGlucyBtZW1ycjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImx2eCAkdkQsICRzcmMiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsIChpbnRfcHBjX2FsdGl2ZWNfbHZ4IHhvYWRkcjokc3JjKSldPjsNCitkZWYgTFZYTCA6IFhGb3JtXzE8MzEsIDM1OSwgKG91dHMgVlJSQzokdkQpLCAoaW5zIG1lbXJyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibHZ4bCAkdkQsICRzcmMiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsIChpbnRfcHBjX2FsdGl2ZWNfbHZ4bCB4b2FkZHI6JHNyYykpXT47DQorfQ0KKw0KK2RlZiBMVlNMIDogWEZvcm1fMTwzMSwgICA2LCAob3V0cyBWUlJDOiR2RCksIChpbnMgbWVtcnI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJsdnNsICR2RCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKGludF9wcGNfYWx0aXZlY19sdnNsIHhvYWRkcjokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgUFBDOTcwX1VuaXRfTFNVOw0KK2RlZiBMVlNSIDogWEZvcm1fMTwzMSwgIDM4LCAob3V0cyBWUlJDOiR2RCksIChpbnMgbWVtcnI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJsdnNyICR2RCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKGludF9wcGNfYWx0aXZlY19sdnNyIHhvYWRkcjokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgUFBDOTcwX1VuaXRfTFNVOw0KKw0KK2xldCBQUEM5NzBfVW5pdCA9IDIgaW4geyAgIC8vIFN0b3Jlcy4NCitkZWYgU1RWRUJYOiBYRm9ybV84PDMxLCAxMzUsIChvdXRzKSwgKGlucyBWUlJDOiRyUywgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzdHZlYnggJHJTLCAkZHN0IiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgIFsoaW50X3BwY19hbHRpdmVjX3N0dmVieCBWUlJDOiRyUywgeG9hZGRyOiRkc3QpXT47DQorZGVmIFNUVkVIWDogWEZvcm1fODwzMSwgMTY3LCAob3V0cyksIChpbnMgVlJSQzokclMsIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic3R2ZWh4ICRyUywgJGRzdCIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKGludF9wcGNfYWx0aXZlY19zdHZlaHggVlJSQzokclMsIHhvYWRkcjokZHN0KV0+Ow0KK2RlZiBTVFZFV1g6IFhGb3JtXzg8MzEsIDE5OSwgKG91dHMpLCAoaW5zIFZSUkM6JHJTLCBtZW1ycjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInN0dmV3eCAkclMsICRkc3QiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhpbnRfcHBjX2FsdGl2ZWNfc3R2ZXd4IFZSUkM6JHJTLCB4b2FkZHI6JGRzdCldPjsNCitkZWYgU1RWWCAgOiBYRm9ybV84PDMxLCAyMzEsIChvdXRzKSwgKGlucyBWUlJDOiRyUywgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzdHZ4ICRyUywgJGRzdCIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKGludF9wcGNfYWx0aXZlY19zdHZ4IFZSUkM6JHJTLCB4b2FkZHI6JGRzdCldPjsNCitkZWYgU1RWWEwgOiBYRm9ybV84PDMxLCA0ODcsIChvdXRzKSwgKGlucyBWUlJDOiRyUywgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzdHZ4bCAkclMsICRkc3QiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhpbnRfcHBjX2FsdGl2ZWNfc3R2eGwgVlJSQzokclMsIHhvYWRkcjokZHN0KV0+Ow0KK30NCisNCitsZXQgUFBDOTcwX1VuaXQgPSA1IGluIHsgIC8vIFZBTFUgT3BlcmF0aW9ucy4NCisvLyBWQS1Gb3JtIGluc3RydWN0aW9ucy4gIDMtaW5wdXQgQWx0aVZlYyBvcHMuDQorZGVmIFZNQURERlAgOiBWQUZvcm1fMTw0NiwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QywgVlJSQzokdkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInZtYWRkZnAgJHZELCAkdkEsICR2QywgJHZCIiwgVmVjRlAsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKGZhZGQgKGZtdWwgVlJSQzokdkEsIFZSUkM6JHZDKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUlJDOiR2QikpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbRlBDb250cmFjdGlvbnNdPjsNCitkZWYgVk5NU1VCRlA6IFZBRm9ybV8xPDQ3LCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkEsIFZSUkM6JHZDLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICAidm5tc3ViZnAgJHZELCAkdkEsICR2QywgJHZCIiwgVmVjRlAsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKGZzdWIgVl9pbW1uZWcwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmc3ViIChmbXVsIFZSUkM6JHZBLCBWUlJDOiR2QyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlJSQzokdkIpKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtGUENvbnRyYWN0aW9uc10+Ow0KKw0KK2RlZiBWTUhBRERTSFMgIDogVkExYV9JbnQ8MzIsICJ2bWhhZGRzaHMiLCAgaW50X3BwY19hbHRpdmVjX3ZtaGFkZHNocz47DQorZGVmIFZNSFJBRERTSFMgOiBWQTFhX0ludDwzMywgInZtaHJhZGRzaHMiLCBpbnRfcHBjX2FsdGl2ZWNfdm1ocmFkZHNocz47DQorZGVmIFZNTEFERFVITSAgOiBWQTFhX0ludDwzNCwgInZtbGFkZHVobSIsICBpbnRfcHBjX2FsdGl2ZWNfdm1sYWRkdWhtPjsNCitkZWYgVlBFUk0gICAgICA6IFZBMWFfSW50PDQzLCAidnBlcm0iLCAgICAgIGludF9wcGNfYWx0aXZlY192cGVybT47DQorZGVmIFZTRUwgICAgICAgOiBWQTFhX0ludDw0MiwgInZzZWwiLCAgICAgICBpbnRfcHBjX2FsdGl2ZWNfdnNlbD47DQorDQorLy8gU2h1ZmZsZXMuDQorZGVmIFZTTERPSSAgOiBWQUZvcm1fMjw0NCwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiwgdTVpbW06JFNIKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJ2c2xkb2kgJHZELCAkdkEsICR2QiwgJFNIIiwgVmVjRlAsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICh2c2xkb2lfc2h1ZmZsZTokU0ggKHYxNmk4IFZSUkM6JHZBKSwgVlJSQzokdkIpKV0+Ow0KKw0KKy8vIFZYLUZvcm0gaW5zdHJ1Y3Rpb25zLiAgQWx0aVZlYyBhcml0aG1ldGljIG9wcy4NCitkZWYgVkFEREZQIDogVlhGb3JtXzE8MTAsIChvdXRzIFZSUkM6JHZEKSwgKGlucyBWUlJDOiR2QSwgVlJSQzokdkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAidmFkZGZwICR2RCwgJHZBLCAkdkIiLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsIChmYWRkIFZSUkM6JHZBLCBWUlJDOiR2QikpXT47DQorICAgICAgICAgICAgICAgICAgICAgIA0KK2RlZiBWQUREVUJNIDogVlhGb3JtXzE8MCwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2YWRkdWJtICR2RCwgJHZBLCAkdkIiLCBWZWNHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKGFkZCAodjE2aTggVlJSQzokdkEpLCBWUlJDOiR2QikpXT47DQorZGVmIFZBRERVSE0gOiBWWEZvcm1fMTw2NCwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2YWRkdWhtICR2RCwgJHZBLCAkdkIiLCBWZWNHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKGFkZCAodjhpMTYgVlJSQzokdkEpLCBWUlJDOiR2QikpXT47DQorZGVmIFZBRERVV00gOiBWWEZvcm1fMTwxMjgsIChvdXRzIFZSUkM6JHZEKSwgKGlucyBWUlJDOiR2QSwgVlJSQzokdkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAidmFkZHV3bSAkdkQsICR2QSwgJHZCIiwgVmVjR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsIChhZGQgKHY0aTMyIFZSUkM6JHZBKSwgVlJSQzokdkIpKV0+Ow0KKyAgICAgICAgICAgICAgICAgICAgICANCitkZWYgVkFERENVVyA6IFZYMV9JbnQ8Mzg0LCAidmFkZGN1dyIsIGludF9wcGNfYWx0aXZlY192YWRkY3V3PjsNCitkZWYgVkFERFNCUyA6IFZYMV9JbnQ8NzY4LCAidmFkZHNicyIsIGludF9wcGNfYWx0aXZlY192YWRkc2JzPjsNCitkZWYgVkFERFNIUyA6IFZYMV9JbnQ8ODMyLCAidmFkZHNocyIsIGludF9wcGNfYWx0aXZlY192YWRkc2hzPjsNCitkZWYgVkFERFNXUyA6IFZYMV9JbnQ8ODk2LCAidmFkZHN3cyIsIGludF9wcGNfYWx0aXZlY192YWRkc3dzPjsNCitkZWYgVkFERFVCUyA6IFZYMV9JbnQ8NTEyLCAidmFkZHVicyIsIGludF9wcGNfYWx0aXZlY192YWRkdWJzPjsNCitkZWYgVkFERFVIUyA6IFZYMV9JbnQ8NTc2LCAidmFkZHVocyIsIGludF9wcGNfYWx0aXZlY192YWRkdWhzPjsNCitkZWYgVkFERFVXUyA6IFZYMV9JbnQ8NjQwLCAidmFkZHV3cyIsIGludF9wcGNfYWx0aXZlY192YWRkdXdzPjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorZGVmIFZBTkQgOiBWWEZvcm1fMTwxMDI4LCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkEsIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICJ2YW5kICR2RCwgJHZBLCAkdkIiLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELCAoYW5kICh2NGkzMiBWUlJDOiR2QSksIFZSUkM6JHZCKSldPjsNCitkZWYgVkFOREMgOiBWWEZvcm1fMTwxMDkyLCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkEsIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICAidmFuZGMgJHZELCAkdkEsICR2QiIsIFZlY0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELCAoYW5kICh2NGkzMiBWUlJDOiR2QSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZub3RfcHBjIFZSUkM6JHZCKSkpXT47DQorDQorZGVmIFZDRlNYICA6IFZYRm9ybV8xPDg0MiwgKG91dHMgVlJSQzokdkQpLCAoaW5zIHU1aW1tOiRVSU1NLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2Y2ZzeCAkdkQsICR2QiwgJFVJTU0iLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50X3BwY19hbHRpdmVjX3ZjZnN4IFZSUkM6JHZCLCBpbW06JFVJTU0pKV0+Ow0KK2RlZiBWQ0ZVWCAgOiBWWEZvcm1fMTw3NzgsIChvdXRzIFZSUkM6JHZEKSwgKGlucyB1NWltbTokVUlNTSwgVlJSQzokdkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAidmNmdXggJHZELCAkdkIsICRVSU1NIiwgVmVjRlAsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludF9wcGNfYWx0aXZlY192Y2Z1eCBWUlJDOiR2QiwgaW1tOiRVSU1NKSldPjsNCitkZWYgVkNUU1hTIDogVlhGb3JtXzE8OTcwLCAob3V0cyBWUlJDOiR2RCksIChpbnMgdTVpbW06JFVJTU0sIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZjdHN4cyAkdkQsICR2QiwgJFVJTU0iLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50X3BwY19hbHRpdmVjX3ZjdHN4cyBWUlJDOiR2QiwgaW1tOiRVSU1NKSldPjsNCitkZWYgVkNUVVhTIDogVlhGb3JtXzE8OTA2LCAob3V0cyBWUlJDOiR2RCksIChpbnMgdTVpbW06JFVJTU0sIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZjdHV4cyAkdkQsICR2QiwgJFVJTU0iLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50X3BwY19hbHRpdmVjX3ZjdHV4cyBWUlJDOiR2QiwgaW1tOiRVSU1NKSldPjsNCitkZWYgVkVYUFRFRlAgOiBWWDJfSW50PDM5NCwgInZleHB0ZWZwIiwgaW50X3BwY19hbHRpdmVjX3ZleHB0ZWZwPjsNCitkZWYgVkxPR0VGUCAgOiBWWDJfSW50PDQ1OCwgInZsb2dlZnAiLCAgaW50X3BwY19hbHRpdmVjX3Zsb2dlZnA+Ow0KKw0KK2RlZiBWQVZHU0IgOiBWWDFfSW50PDEyODIsICJ2YXZnc2IiLCBpbnRfcHBjX2FsdGl2ZWNfdmF2Z3NiPjsNCitkZWYgVkFWR1NIIDogVlgxX0ludDwxMzQ2LCAidmF2Z3NoIiwgaW50X3BwY19hbHRpdmVjX3ZhdmdzaD47DQorZGVmIFZBVkdTVyA6IFZYMV9JbnQ8MTQxMCwgInZhdmdzdyIsIGludF9wcGNfYWx0aXZlY192YXZnc3c+Ow0KK2RlZiBWQVZHVUIgOiBWWDFfSW50PDEwMjYsICJ2YXZndWIiLCBpbnRfcHBjX2FsdGl2ZWNfdmF2Z3ViPjsNCitkZWYgVkFWR1VIIDogVlgxX0ludDwxMDkwLCAidmF2Z3VoIiwgaW50X3BwY19hbHRpdmVjX3Zhdmd1aD47DQorZGVmIFZBVkdVVyA6IFZYMV9JbnQ8MTE1NCwgInZhdmd1dyIsIGludF9wcGNfYWx0aXZlY192YXZndXc+Ow0KKw0KK2RlZiBWTUFYRlAgOiBWWDFfSW50PDEwMzQsICJ2bWF4ZnAiLCBpbnRfcHBjX2FsdGl2ZWNfdm1heGZwPjsNCitkZWYgVk1BWFNCIDogVlgxX0ludDwgMjU4LCAidm1heHNiIiwgaW50X3BwY19hbHRpdmVjX3ZtYXhzYj47DQorZGVmIFZNQVhTSCA6IFZYMV9JbnQ8IDMyMiwgInZtYXhzaCIsIGludF9wcGNfYWx0aXZlY192bWF4c2g+Ow0KK2RlZiBWTUFYU1cgOiBWWDFfSW50PCAzODYsICJ2bWF4c3ciLCBpbnRfcHBjX2FsdGl2ZWNfdm1heHN3PjsNCitkZWYgVk1BWFVCIDogVlgxX0ludDwgICAyLCAidm1heHViIiwgaW50X3BwY19hbHRpdmVjX3ZtYXh1Yj47DQorZGVmIFZNQVhVSCA6IFZYMV9JbnQ8ICA2NiwgInZtYXh1aCIsIGludF9wcGNfYWx0aXZlY192bWF4dWg+Ow0KK2RlZiBWTUFYVVcgOiBWWDFfSW50PCAxMzAsICJ2bWF4dXciLCBpbnRfcHBjX2FsdGl2ZWNfdm1heHV3PjsNCitkZWYgVk1JTkZQIDogVlgxX0ludDwxMDk4LCAidm1pbmZwIiwgaW50X3BwY19hbHRpdmVjX3ZtaW5mcD47DQorZGVmIFZNSU5TQiA6IFZYMV9JbnQ8IDc3MCwgInZtaW5zYiIsIGludF9wcGNfYWx0aXZlY192bWluc2I+Ow0KK2RlZiBWTUlOU0ggOiBWWDFfSW50PCA4MzQsICJ2bWluc2giLCBpbnRfcHBjX2FsdGl2ZWNfdm1pbnNoPjsNCitkZWYgVk1JTlNXIDogVlgxX0ludDwgODk4LCAidm1pbnN3IiwgaW50X3BwY19hbHRpdmVjX3ZtaW5zdz47DQorZGVmIFZNSU5VQiA6IFZYMV9JbnQ8IDUxNCwgInZtaW51YiIsIGludF9wcGNfYWx0aXZlY192bWludWI+Ow0KK2RlZiBWTUlOVUggOiBWWDFfSW50PCA1NzgsICJ2bWludWgiLCBpbnRfcHBjX2FsdGl2ZWNfdm1pbnVoPjsNCitkZWYgVk1JTlVXIDogVlgxX0ludDwgNjQyLCAidm1pbnV3IiwgaW50X3BwY19hbHRpdmVjX3ZtaW51dz47DQorDQorZGVmIFZNUkdIQiA6IFZYRm9ybV8xPCAxMiwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2bXJnaGIgJHZELCAkdkEsICR2QiIsIFZlY0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKHZtcmdoYl9zaHVmZmxlIFZSUkM6JHZBLCBWUlJDOiR2QikpXT47DQorZGVmIFZNUkdISCA6IFZYRm9ybV8xPCA3NiwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2bXJnaGggJHZELCAkdkEsICR2QiIsIFZlY0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKHZtcmdoaF9zaHVmZmxlIFZSUkM6JHZBLCBWUlJDOiR2QikpXT47DQorZGVmIFZNUkdIVyA6IFZYRm9ybV8xPDE0MCwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2bXJnaHcgJHZELCAkdkEsICR2QiIsIFZlY0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKHZtcmdod19zaHVmZmxlIFZSUkM6JHZBLCBWUlJDOiR2QikpXT47DQorZGVmIFZNUkdMQiA6IFZYRm9ybV8xPDI2OCwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2bXJnbGIgJHZELCAkdkEsICR2QiIsIFZlY0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKHZtcmdsYl9zaHVmZmxlIFZSUkM6JHZBLCBWUlJDOiR2QikpXT47DQorZGVmIFZNUkdMSCA6IFZYRm9ybV8xPDMzMiwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2bXJnbGggJHZELCAkdkEsICR2QiIsIFZlY0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKHZtcmdsaF9zaHVmZmxlIFZSUkM6JHZBLCBWUlJDOiR2QikpXT47DQorZGVmIFZNUkdMVyA6IFZYRm9ybV8xPDM5NiwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2bXJnbHcgJHZELCAkdkEsICR2QiIsIFZlY0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKHZtcmdsd19zaHVmZmxlIFZSUkM6JHZBLCBWUlJDOiR2QikpXT47DQorDQorZGVmIFZNU1VNTUJNIDogVkExYV9JbnQ8MzcsICJ2bXN1bW1ibSIsIGludF9wcGNfYWx0aXZlY192bXN1bW1ibT47DQorZGVmIFZNU1VNU0hNIDogVkExYV9JbnQ8NDAsICJ2bXN1bXNobSIsIGludF9wcGNfYWx0aXZlY192bXN1bXNobT47DQorZGVmIFZNU1VNU0hTIDogVkExYV9JbnQ8NDEsICJ2bXN1bXNocyIsIGludF9wcGNfYWx0aXZlY192bXN1bXNocz47DQorZGVmIFZNU1VNVUJNIDogVkExYV9JbnQ8MzYsICJ2bXN1bXVibSIsIGludF9wcGNfYWx0aXZlY192bXN1bXVibT47DQorZGVmIFZNU1VNVUhNIDogVkExYV9JbnQ8MzgsICJ2bXN1bXVobSIsIGludF9wcGNfYWx0aXZlY192bXN1bXVobT47DQorZGVmIFZNU1VNVUhTIDogVkExYV9JbnQ8MzksICJ2bXN1bXVocyIsIGludF9wcGNfYWx0aXZlY192bXN1bXVocz47DQorDQorZGVmIFZNVUxFU0IgOiBWWDFfSW50PDc3NiwgInZtdWxlc2IiLCBpbnRfcHBjX2FsdGl2ZWNfdm11bGVzYj47DQorZGVmIFZNVUxFU0ggOiBWWDFfSW50PDg0MCwgInZtdWxlc2giLCBpbnRfcHBjX2FsdGl2ZWNfdm11bGVzaD47DQorZGVmIFZNVUxFVUIgOiBWWDFfSW50PDUyMCwgInZtdWxldWIiLCBpbnRfcHBjX2FsdGl2ZWNfdm11bGV1Yj47DQorZGVmIFZNVUxFVUggOiBWWDFfSW50PDU4NCwgInZtdWxldWgiLCBpbnRfcHBjX2FsdGl2ZWNfdm11bGV1aD47DQorZGVmIFZNVUxPU0IgOiBWWDFfSW50PDI2NCwgInZtdWxvc2IiLCBpbnRfcHBjX2FsdGl2ZWNfdm11bG9zYj47DQorZGVmIFZNVUxPU0ggOiBWWDFfSW50PDMyOCwgInZtdWxvc2giLCBpbnRfcHBjX2FsdGl2ZWNfdm11bG9zaD47DQorZGVmIFZNVUxPVUIgOiBWWDFfSW50PCAgOCwgInZtdWxvdWIiLCBpbnRfcHBjX2FsdGl2ZWNfdm11bG91Yj47DQorZGVmIFZNVUxPVUggOiBWWDFfSW50PCA3MiwgInZtdWxvdWgiLCBpbnRfcHBjX2FsdGl2ZWNfdm11bG91aD47DQorICAgICAgICAgICAgICAgICAgICAgICANCitkZWYgVlJFRlAgICAgIDogVlgyX0ludDwyNjYsICJ2cmVmcCIsICAgICBpbnRfcHBjX2FsdGl2ZWNfdnJlZnA+Ow0KK2RlZiBWUkZJTSAgICAgOiBWWDJfSW50PDcxNCwgInZyZmltIiwgICAgIGludF9wcGNfYWx0aXZlY192cmZpbT47DQorZGVmIFZSRklOICAgICA6IFZYMl9JbnQ8NTIyLCAidnJmaW4iLCAgICAgaW50X3BwY19hbHRpdmVjX3ZyZmluPjsNCitkZWYgVlJGSVAgICAgIDogVlgyX0ludDw2NTAsICJ2cmZpcCIsICAgICBpbnRfcHBjX2FsdGl2ZWNfdnJmaXA+Ow0KK2RlZiBWUkZJWiAgICAgOiBWWDJfSW50PDU4NiwgInZyZml6IiwgICAgIGludF9wcGNfYWx0aXZlY192cmZpej47DQorZGVmIFZSU1FSVEVGUCA6IFZYMl9JbnQ8MzMwLCAidnJzcXJ0ZWZwIiwgaW50X3BwY19hbHRpdmVjX3Zyc3FydGVmcD47DQorDQorZGVmIFZTVUJDVVcgOiBWWDFfSW50PDc0LCAidnN1YmN1dyIsIGludF9wcGNfYWx0aXZlY192c3ViY3V3PjsNCisNCitkZWYgVlNVQkZQICA6IFZYRm9ybV8xPDc0LCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkEsIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZzdWJmcCAkdkQsICR2QSwgJHZCIiwgVmVjR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsIChmc3ViIFZSUkM6JHZBLCBWUlJDOiR2QikpXT47DQorZGVmIFZTVUJVQk0gOiBWWEZvcm1fMTwxMDI0LCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkEsIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZzdWJ1Ym0gJHZELCAkdkEsICR2QiIsIFZlY0dlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELCAoc3ViICh2MTZpOCBWUlJDOiR2QSksIFZSUkM6JHZCKSldPjsNCitkZWYgVlNVQlVITSA6IFZYRm9ybV8xPDEwODgsIChvdXRzIFZSUkM6JHZEKSwgKGlucyBWUlJDOiR2QSwgVlJSQzokdkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAidnN1YnVobSAkdkQsICR2QSwgJHZCIiwgVmVjR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsIChzdWIgKHY4aTE2IFZSUkM6JHZBKSwgVlJSQzokdkIpKV0+Ow0KK2RlZiBWU1VCVVdNIDogVlhGb3JtXzE8MTE1MiwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2c3VidXdtICR2RCwgJHZBLCAkdkIiLCBWZWNHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKHN1YiAodjRpMzIgVlJSQzokdkEpLCBWUlJDOiR2QikpXT47DQorICAgICAgICAgICAgICAgICAgICAgIA0KK2RlZiBWU1VCU0JTIDogVlgxX0ludDwxNzkyLCAidnN1YnNicyIgLCBpbnRfcHBjX2FsdGl2ZWNfdnN1YnNicz47DQorZGVmIFZTVUJTSFMgOiBWWDFfSW50PDE4NTYsICJ2c3Vic2hzIiAsIGludF9wcGNfYWx0aXZlY192c3Vic2hzPjsNCitkZWYgVlNVQlNXUyA6IFZYMV9JbnQ8MTkyMCwgInZzdWJzd3MiICwgaW50X3BwY19hbHRpdmVjX3ZzdWJzd3M+Ow0KK2RlZiBWU1VCVUJTIDogVlgxX0ludDwxNTM2LCAidnN1YnVicyIgLCBpbnRfcHBjX2FsdGl2ZWNfdnN1YnVicz47DQorZGVmIFZTVUJVSFMgOiBWWDFfSW50PDE2MDAsICJ2c3VidWhzIiAsIGludF9wcGNfYWx0aXZlY192c3VidWhzPjsNCitkZWYgVlNVQlVXUyA6IFZYMV9JbnQ8MTY2NCwgInZzdWJ1d3MiICwgaW50X3BwY19hbHRpdmVjX3ZzdWJ1d3M+Ow0KK2RlZiBWU1VNU1dTIDogVlgxX0ludDwxOTI4LCAidnN1bXN3cyIgLCBpbnRfcHBjX2FsdGl2ZWNfdnN1bXN3cz47DQorZGVmIFZTVU0yU1dTOiBWWDFfSW50PDE2NzIsICJ2c3VtMnN3cyIsIGludF9wcGNfYWx0aXZlY192c3VtMnN3cz47DQorZGVmIFZTVU00U0JTOiBWWDFfSW50PDE2NzIsICJ2c3VtNHNicyIsIGludF9wcGNfYWx0aXZlY192c3VtNHNicz47DQorZGVmIFZTVU00U0hTOiBWWDFfSW50PDE2MDgsICJ2c3VtNHNocyIsIGludF9wcGNfYWx0aXZlY192c3VtNHNocz47DQorZGVmIFZTVU00VUJTOiBWWDFfSW50PDE1NDQsICJ2c3VtNHVicyIsIGludF9wcGNfYWx0aXZlY192c3VtNHVicz47DQorDQorZGVmIFZOT1IgOiBWWEZvcm1fMTwxMjg0LCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkEsIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICJ2bm9yICR2RCwgJHZBLCAkdkIiLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELCAodm5vdF9wcGMgKG9yICh2NGkzMiBWUlJDOiR2QSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUlJDOiR2QikpKV0+Ow0KK2RlZiBWT1IgOiBWWEZvcm1fMTwxMTU2LCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkEsIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZvciAkdkQsICR2QSwgJHZCIiwgVmVjRlAsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELCAob3IgKHY0aTMyIFZSUkM6JHZBKSwgVlJSQzokdkIpKV0+Ow0KK2RlZiBWWE9SIDogVlhGb3JtXzE8MTIyMCwgKG91dHMgVlJSQzokdkQpLCAoaW5zIFZSUkM6JHZBLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2eG9yICR2RCwgJHZBLCAkdkIiLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsICh4b3IgKHY0aTMyIFZSUkM6JHZBKSwgVlJSQzokdkIpKV0+Ow0KKw0KK2RlZiBWUkxCICAgOiBWWDFfSW50PCAgIDQsICJ2cmxiIiwgaW50X3BwY19hbHRpdmVjX3ZybGI+Ow0KK2RlZiBWUkxIICAgOiBWWDFfSW50PCAgNjgsICJ2cmxoIiwgaW50X3BwY19hbHRpdmVjX3ZybGg+Ow0KK2RlZiBWUkxXICAgOiBWWDFfSW50PCAxMzIsICJ2cmx3IiwgaW50X3BwY19hbHRpdmVjX3ZybHc+Ow0KKw0KK2RlZiBWU0wgICAgOiBWWDFfSW50PCA0NTIsICJ2c2wiICwgaW50X3BwY19hbHRpdmVjX3ZzbCA+Ow0KK2RlZiBWU0xPICAgOiBWWDFfSW50PDEwMzYsICJ2c2xvIiwgaW50X3BwY19hbHRpdmVjX3ZzbG8+Ow0KK2RlZiBWU0xCICAgOiBWWDFfSW50PCAyNjAsICJ2c2xiIiwgaW50X3BwY19hbHRpdmVjX3ZzbGI+Ow0KK2RlZiBWU0xIICAgOiBWWDFfSW50PCAzMjQsICJ2c2xoIiwgaW50X3BwY19hbHRpdmVjX3ZzbGg+Ow0KK2RlZiBWU0xXICAgOiBWWDFfSW50PCAzODgsICJ2c2x3IiwgaW50X3BwY19hbHRpdmVjX3ZzbHc+Ow0KKw0KK2RlZiBWU1BMVEIgOiBWWEZvcm1fMTw1MjQsIChvdXRzIFZSUkM6JHZEKSwgKGlucyB1NWltbTokVUlNTSwgVlJSQzokdkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAidnNwbHRiICR2RCwgJHZCLCAkVUlNTSIsIFZlY1Blcm0sDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2c3BsdGJfc2h1ZmZsZTokVUlNTSAodjE2aTggVlJSQzokdkIpLCAodW5kZWYpKSldPjsNCitkZWYgVlNQTFRIIDogVlhGb3JtXzE8NTg4LCAob3V0cyBWUlJDOiR2RCksIChpbnMgdTVpbW06JFVJTU0sIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZzcGx0aCAkdkQsICR2QiwgJFVJTU0iLCBWZWNQZXJtLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwNCisgICAgICAgICAgICAgICAgICAgICAgICAodnNwbHRoX3NodWZmbGU6JFVJTU0gKHYxNmk4IFZSUkM6JHZCKSwgKHVuZGVmKSkpXT47DQorZGVmIFZTUExUVyA6IFZYRm9ybV8xPDY1MiwgKG91dHMgVlJSQzokdkQpLCAoaW5zIHU1aW1tOiRVSU1NLCBWUlJDOiR2QiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2c3BsdHcgJHZELCAkdkIsICRVSU1NIiwgVmVjUGVybSwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2c3BsdHdfc2h1ZmZsZTokVUlNTSAodjE2aTggVlJSQzokdkIpLCAodW5kZWYpKSldPjsNCisNCitkZWYgVlNSICAgIDogVlgxX0ludDwgNzA4LCAidnNyIiAgLCBpbnRfcHBjX2FsdGl2ZWNfdnNyPjsNCitkZWYgVlNSTyAgIDogVlgxX0ludDwxMTAwLCAidnNybyIgLCBpbnRfcHBjX2FsdGl2ZWNfdnNybz47DQorZGVmIFZTUkFCICA6IFZYMV9JbnQ8IDc3MiwgInZzcmFiIiwgaW50X3BwY19hbHRpdmVjX3ZzcmFiPjsNCitkZWYgVlNSQUggIDogVlgxX0ludDwgODM2LCAidnNyYWgiLCBpbnRfcHBjX2FsdGl2ZWNfdnNyYWg+Ow0KK2RlZiBWU1JBVyAgOiBWWDFfSW50PCA5MDAsICJ2c3JhdyIsIGludF9wcGNfYWx0aXZlY192c3Jhdz47DQorZGVmIFZTUkIgICA6IFZYMV9JbnQ8IDUxNiwgInZzcmIiICwgaW50X3BwY19hbHRpdmVjX3ZzcmI+Ow0KK2RlZiBWU1JIICAgOiBWWDFfSW50PCA1ODAsICJ2c3JoIiAsIGludF9wcGNfYWx0aXZlY192c3JoPjsNCitkZWYgVlNSVyAgIDogVlgxX0ludDwgNjQ0LCAidnNydyIgLCBpbnRfcHBjX2FsdGl2ZWNfdnNydz47DQorDQorDQorZGVmIFZTUExUSVNCIDogVlhGb3JtXzM8NzgwLCAob3V0cyBWUlJDOiR2RCksIChpbnMgczVpbW06JFNJTU0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInZzcGx0aXNiICR2RCwgJFNJTU0iLCBWZWNQZXJtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlJSQzokdkQsICh2MTZpOCB2ZWNzcGx0aXNiOiRTSU1NKSldPjsNCitkZWYgVlNQTFRJU0ggOiBWWEZvcm1fMzw4NDQsIChvdXRzIFZSUkM6JHZEKSwgKGlucyBzNWltbTokU0lNTSksDQorICAgICAgICAgICAgICAgICAgICAgICAidnNwbHRpc2ggJHZELCAkU0lNTSIsIFZlY1Blcm0sDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKHY4aTE2IHZlY3NwbHRpc2g6JFNJTU0pKV0+Ow0KK2RlZiBWU1BMVElTVyA6IFZYRm9ybV8zPDkwOCwgKG91dHMgVlJSQzokdkQpLCAoaW5zIHM1aW1tOiRTSU1NKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJ2c3BsdGlzdyAkdkQsICRTSU1NIiwgVmVjUGVybSwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELCAodjRpMzIgdmVjc3BsdGlzdzokU0lNTSkpXT47DQorDQorLy8gVmVjdG9yIFBhY2suDQorZGVmIFZQS1BYICAgOiBWWDFfSW50PDc4MiwgInZwa3B4IiwgaW50X3BwY19hbHRpdmVjX3Zwa3B4PjsNCitkZWYgVlBLU0hTUyA6IFZYMV9JbnQ8Mzk4LCAidnBrc2hzcyIsIGludF9wcGNfYWx0aXZlY192cGtzaHNzPjsNCitkZWYgVlBLU0hVUyA6IFZYMV9JbnQ8MjcwLCAidnBrc2h1cyIsIGludF9wcGNfYWx0aXZlY192cGtzaHVzPjsNCitkZWYgVlBLU1dTUyA6IFZYMV9JbnQ8NDYyLCAidnBrc3dzcyIsIGludF9wcGNfYWx0aXZlY192cGtzd3NzPjsNCitkZWYgVlBLU1dVUyA6IFZYMV9JbnQ8MzM0LCAidnBrc3d1cyIsIGludF9wcGNfYWx0aXZlY192cGtzd3VzPjsNCitkZWYgVlBLVUhVTSA6IFZYRm9ybV8xPDE0LCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkEsIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJ2cGt1aHVtICR2RCwgJHZBLCAkdkIiLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAodnBrdWh1bV9zaHVmZmxlICh2MTZpOCBWUlJDOiR2QSksIFZSUkM6JHZCKSldPjsNCitkZWYgVlBLVUhVUyA6IFZYMV9JbnQ8MTQyLCAidnBrdWh1cyIsIGludF9wcGNfYWx0aXZlY192cGt1aHVzPjsNCitkZWYgVlBLVVdVTSA6IFZYRm9ybV8xPDc4LCAob3V0cyBWUlJDOiR2RCksIChpbnMgVlJSQzokdkEsIFZSUkM6JHZCKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJ2cGt1d3VtICR2RCwgJHZBLCAkdkIiLCBWZWNGUCwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSUkM6JHZELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAodnBrdXd1bV9zaHVmZmxlICh2MTZpOCBWUlJDOiR2QSksIFZSUkM6JHZCKSldPjsNCitkZWYgVlBLVVdVUyA6IFZYMV9JbnQ8MjA2LCAidnBrdXd1cyIsIGludF9wcGNfYWx0aXZlY192cGt1d3VzPjsNCisNCisvLyBWZWN0b3IgVW5wYWNrLg0KK2RlZiBWVVBLSFBYIDogVlgyX0ludDw4NDYsICJ2dXBraHB4IiwgaW50X3BwY19hbHRpdmVjX3Z1cGtocHg+Ow0KK2RlZiBWVVBLSFNCIDogVlgyX0ludDw1MjYsICJ2dXBraHNiIiwgaW50X3BwY19hbHRpdmVjX3Z1cGtoc2I+Ow0KK2RlZiBWVVBLSFNIIDogVlgyX0ludDw1OTAsICJ2dXBraHNoIiwgaW50X3BwY19hbHRpdmVjX3Z1cGtoc2g+Ow0KK2RlZiBWVVBLTFBYIDogVlgyX0ludDw5NzQsICJ2dXBrbHB4IiwgaW50X3BwY19hbHRpdmVjX3Z1cGtscHg+Ow0KK2RlZiBWVVBLTFNCIDogVlgyX0ludDw2NTQsICJ2dXBrbHNiIiwgaW50X3BwY19hbHRpdmVjX3Z1cGtsc2I+Ow0KK2RlZiBWVVBLTFNIIDogVlgyX0ludDw3MTgsICJ2dXBrbHNoIiwgaW50X3BwY19hbHRpdmVjX3Z1cGtsc2g+Ow0KKw0KKw0KKy8vIEFsdGl2ZWMgQ29tcGFyaXNvbnMuDQorDQorY2xhc3MgVkNNUDxiaXRzPDEwPiB4bywgc3RyaW5nIGFzbXN0ciwgVmFsdWVUeXBlIFR5Pg0KKyAgOiBWWFJGb3JtXzE8eG8sIChvdXRzIFZSUkM6JHZEKSwgKGlucyBWUlJDOiR2QSwgVlJSQzokdkIpLGFzbXN0cixWZWNGUENvbXBhcmUsDQorICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKFR5IChQUEN2Y21wIFZSUkM6JHZBLCBWUlJDOiR2QiwgeG8pKSldPjsNCitjbGFzcyBWQ01QbzxiaXRzPDEwPiB4bywgc3RyaW5nIGFzbXN0ciwgVmFsdWVUeXBlIFR5Pg0KKyAgOiBWWFJGb3JtXzE8eG8sIChvdXRzIFZSUkM6JHZEKSwgKGlucyBWUlJDOiR2QSwgVlJSQzokdkIpLGFzbXN0cixWZWNGUENvbXBhcmUsDQorICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKFR5IChQUEN2Y21wX28gVlJSQzokdkEsIFZSUkM6JHZCLCB4bykpKV0+IHsNCisgIGxldCBEZWZzID0gW0NSNl07DQorICBsZXQgUkMgPSAxOw0KK30NCisNCisvLyBmMzIgZWxlbWVudCBjb21wYXJpc29ucy4wDQorZGVmIFZDTVBCRlAgICA6IFZDTVAgPDk2NiwgInZjbXBiZnAgJHZELCAkdkEsICR2QiIgICwgdjRmMzI+Ow0KK2RlZiBWQ01QQkZQbyAgOiBWQ01Qbzw5NjYsICJ2Y21wYmZwLiAkdkQsICR2QSwgJHZCIiAsIHY0ZjMyPjsNCitkZWYgVkNNUEVRRlAgIDogVkNNUCA8MTk4LCAidmNtcGVxZnAgJHZELCAkdkEsICR2QiIgLCB2NGYzMj47DQorZGVmIFZDTVBFUUZQbyA6IFZDTVBvPDE5OCwgInZjbXBlcWZwLiAkdkQsICR2QSwgJHZCIiwgdjRmMzI+Ow0KK2RlZiBWQ01QR0VGUCAgOiBWQ01QIDw0NTQsICJ2Y21wZ2VmcCAkdkQsICR2QSwgJHZCIiAsIHY0ZjMyPjsNCitkZWYgVkNNUEdFRlBvIDogVkNNUG88NDU0LCAidmNtcGdlZnAuICR2RCwgJHZBLCAkdkIiLCB2NGYzMj47DQorZGVmIFZDTVBHVEZQICA6IFZDTVAgPDcxMCwgInZjbXBndGZwICR2RCwgJHZBLCAkdkIiICwgdjRmMzI+Ow0KK2RlZiBWQ01QR1RGUG8gOiBWQ01Qbzw3MTAsICJ2Y21wZ3RmcC4gJHZELCAkdkEsICR2QiIsIHY0ZjMyPjsNCisNCisvLyBpOCBlbGVtZW50IGNvbXBhcmlzb25zLg0KK2RlZiBWQ01QRVFVQiAgOiBWQ01QIDwgIDYsICJ2Y21wZXF1YiAkdkQsICR2QSwgJHZCIiAsIHYxNmk4PjsNCitkZWYgVkNNUEVRVUJvIDogVkNNUG88ICA2LCAidmNtcGVxdWIuICR2RCwgJHZBLCAkdkIiLCB2MTZpOD47DQorZGVmIFZDTVBHVFNCICA6IFZDTVAgPDc3NCwgInZjbXBndHNiICR2RCwgJHZBLCAkdkIiICwgdjE2aTg+Ow0KK2RlZiBWQ01QR1RTQm8gOiBWQ01Qbzw3NzQsICJ2Y21wZ3RzYi4gJHZELCAkdkEsICR2QiIsIHYxNmk4PjsNCitkZWYgVkNNUEdUVUIgIDogVkNNUCA8NTE4LCAidmNtcGd0dWIgJHZELCAkdkEsICR2QiIgLCB2MTZpOD47DQorZGVmIFZDTVBHVFVCbyA6IFZDTVBvPDUxOCwgInZjbXBndHViLiAkdkQsICR2QSwgJHZCIiwgdjE2aTg+Ow0KKw0KKy8vIGkxNiBlbGVtZW50IGNvbXBhcmlzb25zLg0KK2RlZiBWQ01QRVFVSCAgOiBWQ01QIDwgNzAsICJ2Y21wZXF1aCAkdkQsICR2QSwgJHZCIiAsIHY4aTE2PjsNCitkZWYgVkNNUEVRVUhvIDogVkNNUG88IDcwLCAidmNtcGVxdWguICR2RCwgJHZBLCAkdkIiLCB2OGkxNj47DQorZGVmIFZDTVBHVFNIICA6IFZDTVAgPDgzOCwgInZjbXBndHNoICR2RCwgJHZBLCAkdkIiICwgdjhpMTY+Ow0KK2RlZiBWQ01QR1RTSG8gOiBWQ01Qbzw4MzgsICJ2Y21wZ3RzaC4gJHZELCAkdkEsICR2QiIsIHY4aTE2PjsNCitkZWYgVkNNUEdUVUggIDogVkNNUCA8NTgyLCAidmNtcGd0dWggJHZELCAkdkEsICR2QiIgLCB2OGkxNj47DQorZGVmIFZDTVBHVFVIbyA6IFZDTVBvPDU4MiwgInZjbXBndHVoLiAkdkQsICR2QSwgJHZCIiwgdjhpMTY+Ow0KKw0KKy8vIGkzMiBlbGVtZW50IGNvbXBhcmlzb25zLg0KK2RlZiBWQ01QRVFVVyAgOiBWQ01QIDwxMzQsICJ2Y21wZXF1dyAkdkQsICR2QSwgJHZCIiAsIHY0aTMyPjsNCitkZWYgVkNNUEVRVVdvIDogVkNNUG88MTM0LCAidmNtcGVxdXcuICR2RCwgJHZBLCAkdkIiLCB2NGkzMj47DQorZGVmIFZDTVBHVFNXICA6IFZDTVAgPDkwMiwgInZjbXBndHN3ICR2RCwgJHZBLCAkdkIiICwgdjRpMzI+Ow0KK2RlZiBWQ01QR1RTV28gOiBWQ01Qbzw5MDIsICJ2Y21wZ3Rzdy4gJHZELCAkdkEsICR2QiIsIHY0aTMyPjsNCitkZWYgVkNNUEdUVVcgIDogVkNNUCA8NjQ2LCAidmNtcGd0dXcgJHZELCAkdkEsICR2QiIgLCB2NGkzMj47DQorZGVmIFZDTVBHVFVXbyA6IFZDTVBvPDY0NiwgInZjbXBndHV3LiAkdkQsICR2QSwgJHZCIiwgdjRpMzI+Ow0KKyAgICAgICAgICAgICAgICAgICAgICANCitkZWYgVl9TRVQwIDogVlhGb3JtX3NldHplcm88MTIyMCwgKG91dHMgVlJSQzokdkQpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZ4b3IgJHZELCAkdkQsICR2RCIsIFZlY0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUlJDOiR2RCwgKHY0aTMyIGltbUFsbFplcm9zVikpXT47DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQWRkaXRpb25hbCBBbHRpdmVjIFBhdHRlcm5zDQorLy8NCisNCisvLyBEUyogaW50cmluc2ljcw0KK2RlZiA6IFBhdDwoaW50X3BwY19hbHRpdmVjX2Rzc2FsbCksIChEU1NBTEwgMSwgMCwgMCwgMCk+Ow0KK2RlZiA6IFBhdDwoaW50X3BwY19hbHRpdmVjX2RzcyBpbW06JFNUUk0pLCAoRFNTIDAsIGltbTokU1RSTSwgMCwgMCk+Ow0KKw0KKy8vICAqIDMyLWJpdA0KK2RlZiA6IFBhdDwoaW50X3BwY19hbHRpdmVjX2RzdCBHUFJDOiRyQSwgR1BSQzokckIsIGltbTokU1RSTSksDQorICAgICAgICAgIChEU1QgMCwgaW1tOiRTVFJNLCBHUFJDOiRyQSwgR1BSQzokckIpPjsNCitkZWYgOiBQYXQ8KGludF9wcGNfYWx0aXZlY19kc3R0IEdQUkM6JHJBLCBHUFJDOiRyQiwgaW1tOiRTVFJNKSwNCisgICAgICAgICAgKERTVFQgMSwgaW1tOiRTVFJNLCBHUFJDOiRyQSwgR1BSQzokckIpPjsNCitkZWYgOiBQYXQ8KGludF9wcGNfYWx0aXZlY19kc3RzdCBHUFJDOiRyQSwgR1BSQzokckIsIGltbTokU1RSTSksDQorICAgICAgICAgIChEU1RTVCAwLCBpbW06JFNUUk0sIEdQUkM6JHJBLCBHUFJDOiRyQik+Ow0KK2RlZiA6IFBhdDwoaW50X3BwY19hbHRpdmVjX2RzdHN0dCBHUFJDOiRyQSwgR1BSQzokckIsIGltbTokU1RSTSksDQorICAgICAgICAgIChEU1RTVFQgMSwgaW1tOiRTVFJNLCBHUFJDOiRyQSwgR1BSQzokckIpPjsNCisNCisvLyAgKiA2NC1iaXQNCitkZWYgOiBQYXQ8KGludF9wcGNfYWx0aXZlY19kc3QgRzhSQzokckEsIEdQUkM6JHJCLCBpbW06JFNUUk0pLA0KKyAgICAgICAgICAoRFNUNjQgMCwgaW1tOiRTVFJNLCAoaTY0IEc4UkM6JHJBKSwgR1BSQzokckIpPjsNCitkZWYgOiBQYXQ8KGludF9wcGNfYWx0aXZlY19kc3R0IEc4UkM6JHJBLCBHUFJDOiRyQiwgaW1tOiRTVFJNKSwNCisgICAgICAgICAgKERTVFQ2NCAxLCBpbW06JFNUUk0sIChpNjQgRzhSQzokckEpLCBHUFJDOiRyQik+Ow0KK2RlZiA6IFBhdDwoaW50X3BwY19hbHRpdmVjX2RzdHN0IEc4UkM6JHJBLCBHUFJDOiRyQiwgaW1tOiRTVFJNKSwNCisgICAgICAgICAgKERTVFNUNjQgMCwgaW1tOiRTVFJNLCAoaTY0IEc4UkM6JHJBKSwgR1BSQzokckIpPjsNCitkZWYgOiBQYXQ8KGludF9wcGNfYWx0aXZlY19kc3RzdHQgRzhSQzokckEsIEdQUkM6JHJCLCBpbW06JFNUUk0pLA0KKyAgICAgICAgICAoRFNUU1RUNjQgMSwgaW1tOiRTVFJNLCAoaTY0IEc4UkM6JHJBKSwgR1BSQzokckIpPjsNCisNCisvLyBMb2Fkcy4NCitkZWYgOiBQYXQ8KHY0aTMyIChsb2FkIHhvYWRkcjokc3JjKSksIChMVlggeG9hZGRyOiRzcmMpPjsNCisNCisvLyBTdG9yZXMuDQorZGVmIDogUGF0PChzdG9yZSAodjRpMzIgVlJSQzokclMpLCB4b2FkZHI6JGRzdCksDQorICAgICAgICAgIChTVFZYICh2NGkzMiBWUlJDOiRyUyksIHhvYWRkcjokZHN0KT47DQorDQorLy8gQml0IGNvbnZlcnNpb25zLg0KK2RlZiA6IFBhdDwodjE2aTggKGJpdGNvbnZlcnQgKHY4aTE2IFZSUkM6JHNyYykpKSwgKHYxNmk4IFZSUkM6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjE2aTggKGJpdGNvbnZlcnQgKHY0aTMyIFZSUkM6JHNyYykpKSwgKHYxNmk4IFZSUkM6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjE2aTggKGJpdGNvbnZlcnQgKHY0ZjMyIFZSUkM6JHNyYykpKSwgKHYxNmk4IFZSUkM6JHNyYyk+Ow0KKw0KK2RlZiA6IFBhdDwodjhpMTYgKGJpdGNvbnZlcnQgKHYxNmk4IFZSUkM6JHNyYykpKSwgKHY4aTE2IFZSUkM6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjhpMTYgKGJpdGNvbnZlcnQgKHY0aTMyIFZSUkM6JHNyYykpKSwgKHY4aTE2IFZSUkM6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjhpMTYgKGJpdGNvbnZlcnQgKHY0ZjMyIFZSUkM6JHNyYykpKSwgKHY4aTE2IFZSUkM6JHNyYyk+Ow0KKw0KK2RlZiA6IFBhdDwodjRpMzIgKGJpdGNvbnZlcnQgKHYxNmk4IFZSUkM6JHNyYykpKSwgKHY0aTMyIFZSUkM6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjRpMzIgKGJpdGNvbnZlcnQgKHY4aTE2IFZSUkM6JHNyYykpKSwgKHY0aTMyIFZSUkM6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjRpMzIgKGJpdGNvbnZlcnQgKHY0ZjMyIFZSUkM6JHNyYykpKSwgKHY0aTMyIFZSUkM6JHNyYyk+Ow0KKw0KK2RlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHYxNmk4IFZSUkM6JHNyYykpKSwgKHY0ZjMyIFZSUkM6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHY4aTE2IFZSUkM6JHNyYykpKSwgKHY0ZjMyIFZSUkM6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHY0aTMyIFZSUkM6JHNyYykpKSwgKHY0ZjMyIFZSUkM6JHNyYyk+Ow0KKw0KKy8vIFNodWZmbGVzLg0KKw0KKy8vIE1hdGNoIHZzbGRvaSh4LHgpLCB2cGt1d3VtKHgseCksIHZwa3VodW0oeCx4KQ0KK2RlZjpQYXQ8KHZzbGRvaV91bmFyeV9zaHVmZmxlOiRpbiAodjE2aTggVlJSQzokdkEpLCB1bmRlZiksDQorICAgICAgICAoVlNMRE9JIFZSUkM6JHZBLCBWUlJDOiR2QSwgKFZTTERPSV91bmFyeV9nZXRfaW1tIFZSUkM6JGluKSk+Ow0KK2RlZjpQYXQ8KHZwa3V3dW1fdW5hcnlfc2h1ZmZsZSAodjE2aTggVlJSQzokdkEpLCB1bmRlZiksDQorICAgICAgICAoVlBLVVdVTSBWUlJDOiR2QSwgVlJSQzokdkEpPjsNCitkZWY6UGF0PCh2cGt1aHVtX3VuYXJ5X3NodWZmbGUgKHYxNmk4IFZSUkM6JHZBKSwgdW5kZWYpLA0KKyAgICAgICAgKFZQS1VIVU0gVlJSQzokdkEsIFZSUkM6JHZBKT47DQorDQorLy8gTWF0Y2ggdm1yZyooeCx4KQ0KK2RlZjpQYXQ8KHZtcmdsYl91bmFyeV9zaHVmZmxlICh2MTZpOCBWUlJDOiR2QSksIHVuZGVmKSwNCisgICAgICAgIChWTVJHTEIgVlJSQzokdkEsIFZSUkM6JHZBKT47DQorZGVmOlBhdDwodm1yZ2xoX3VuYXJ5X3NodWZmbGUgKHYxNmk4IFZSUkM6JHZBKSwgdW5kZWYpLA0KKyAgICAgICAgKFZNUkdMSCBWUlJDOiR2QSwgVlJSQzokdkEpPjsNCitkZWY6UGF0PCh2bXJnbHdfdW5hcnlfc2h1ZmZsZSAodjE2aTggVlJSQzokdkEpLCB1bmRlZiksDQorICAgICAgICAoVk1SR0xXIFZSUkM6JHZBLCBWUlJDOiR2QSk+Ow0KK2RlZjpQYXQ8KHZtcmdoYl91bmFyeV9zaHVmZmxlICh2MTZpOCBWUlJDOiR2QSksIHVuZGVmKSwNCisgICAgICAgIChWTVJHSEIgVlJSQzokdkEsIFZSUkM6JHZBKT47DQorZGVmOlBhdDwodm1yZ2hoX3VuYXJ5X3NodWZmbGUgKHYxNmk4IFZSUkM6JHZBKSwgdW5kZWYpLA0KKyAgICAgICAgKFZNUkdISCBWUlJDOiR2QSwgVlJSQzokdkEpPjsNCitkZWY6UGF0PCh2bXJnaHdfdW5hcnlfc2h1ZmZsZSAodjE2aTggVlJSQzokdkEpLCB1bmRlZiksDQorICAgICAgICAoVk1SR0hXIFZSUkM6JHZBLCBWUlJDOiR2QSk+Ow0KKw0KKy8vIExvZ2ljYWwgT3BlcmF0aW9ucw0KK2RlZiA6IFBhdDwodjRpMzIgKHZub3RfcHBjIFZSUkM6JHZBKSksIChWTk9SIFZSUkM6JHZBLCBWUlJDOiR2QSk+Ow0KKw0KK2RlZiA6IFBhdDwodjRpMzIgKHZub3RfcHBjIChvciBWUlJDOiRBLCBWUlJDOiRCKSkpLA0KKyAgICAgICAgICAoVk5PUiBWUlJDOiRBLCBWUlJDOiRCKT47DQorZGVmIDogUGF0PCh2NGkzMiAoYW5kIFZSUkM6JEEsICh2bm90X3BwYyBWUlJDOiRCKSkpLA0KKyAgICAgICAgICAoVkFOREMgVlJSQzokQSwgVlJSQzokQik+Ow0KKw0KK2RlZiA6IFBhdDwoZm11bCBWUlJDOiR2QSwgVlJSQzokdkIpLA0KKyAgICAgICAgICAoVk1BRERGUCBWUlJDOiR2QSwgVlJSQzokdkIsICh2NGkzMiAoVl9TRVQwKSkpPjsgDQorDQorLy8gRnVzZWQgbXVsdGlwbHkgYWRkIGFuZCBtdWx0aXBseSBzdWIgZm9yIHBhY2tlZCBmbG9hdC4gIFRoZXNlIGFyZSByZXByZXNlbnRlZA0KKy8vIHNlcGFyYXRlbHkgZnJvbSB0aGUgcmVhbCBpbnN0cnVjdGlvbnMgYWJvdmUsIGZvciBvcGVyYXRpb25zIHRoYXQgbXVzdCBoYXZlDQorLy8gdGhlIGFkZGl0aW9uYWwgcHJlY2lzaW9uLCBzdWNoIGFzIE5ld3Rvbi1SaGFwc29uICh1c2VkIGJ5IGRpdmlkZSwgc3FydCkNCitkZWYgOiBQYXQ8KFBQQ3ZtYWRkZnAgVlJSQzokQSwgVlJSQzokQiwgVlJSQzokQyksDQorICAgICAgICAgIChWTUFEREZQIFZSUkM6JEEsIFZSUkM6JEIsIFZSUkM6JEMpPjsNCitkZWYgOiBQYXQ8KFBQQ3ZubXN1YmZwIFZSUkM6JEEsIFZSUkM6JEIsIFZSUkM6JEMpLA0KKyAgICAgICAgICAoVk5NU1VCRlAgVlJSQzokQSwgVlJSQzokQiwgVlJSQzokQyk+Ow0KKw0KK2RlZiA6IFBhdDwoaW50X3BwY19hbHRpdmVjX3ZtYWRkZnAgVlJSQzokQSwgVlJSQzokQiwgVlJSQzokQyksDQorICAgICAgICAgIChWTUFEREZQIFZSUkM6JEEsIFZSUkM6JEIsIFZSUkM6JEMpPjsNCitkZWYgOiBQYXQ8KGludF9wcGNfYWx0aXZlY192bm1zdWJmcCBWUlJDOiRBLCBWUlJDOiRCLCBWUlJDOiRDKSwNCisgICAgICAgICAgKFZOTVNVQkZQIFZSUkM6JEEsIFZSUkM6JEIsIFZSUkM6JEMpPjsNCisNCitkZWYgOiBQYXQ8KFBQQ3ZwZXJtICh2MTZpOCBWUlJDOiR2QSksIFZSUkM6JHZCLCBWUlJDOiR2QyksDQorICAgICAgICAgIChWUEVSTSBWUlJDOiR2QSwgVlJSQzokdkIsIFZSUkM6JHZDKT47DQorDQorLy8gVmVjdG9yIHNoaWZ0cw0KK2RlZiA6IFBhdDwodjE2aTggKHNobCAodjE2aTggVlJSQzokdkEpLCAodjE2aTggVlJSQzokdkIpKSksDQorICAgICAgICAgICh2MTZpOCAoVlNMQiBWUlJDOiR2QSwgVlJSQzokdkIpKT47DQorZGVmIDogUGF0PCh2OGkxNiAoc2hsICh2OGkxNiBWUlJDOiR2QSksICh2OGkxNiBWUlJDOiR2QikpKSwNCisgICAgICAgICAgKHY4aTE2IChWU0xIIFZSUkM6JHZBLCBWUlJDOiR2QikpPjsNCitkZWYgOiBQYXQ8KHY0aTMyIChzaGwgKHY0aTMyIFZSUkM6JHZBKSwgKHY0aTMyIFZSUkM6JHZCKSkpLA0KKyAgICAgICAgICAodjRpMzIgKFZTTFcgVlJSQzokdkEsIFZSUkM6JHZCKSk+Ow0KKw0KK2RlZiA6IFBhdDwodjE2aTggKHNybCAodjE2aTggVlJSQzokdkEpLCAodjE2aTggVlJSQzokdkIpKSksDQorICAgICAgICAgICh2MTZpOCAoVlNSQiBWUlJDOiR2QSwgVlJSQzokdkIpKT47DQorZGVmIDogUGF0PCh2OGkxNiAoc3JsICh2OGkxNiBWUlJDOiR2QSksICh2OGkxNiBWUlJDOiR2QikpKSwNCisgICAgICAgICAgKHY4aTE2IChWU1JIIFZSUkM6JHZBLCBWUlJDOiR2QikpPjsNCitkZWYgOiBQYXQ8KHY0aTMyIChzcmwgKHY0aTMyIFZSUkM6JHZBKSwgKHY0aTMyIFZSUkM6JHZCKSkpLA0KKyAgICAgICAgICAodjRpMzIgKFZTUlcgVlJSQzokdkEsIFZSUkM6JHZCKSk+Ow0KKw0KK2RlZiA6IFBhdDwodjE2aTggKHNyYSAodjE2aTggVlJSQzokdkEpLCAodjE2aTggVlJSQzokdkIpKSksDQorICAgICAgICAgICh2MTZpOCAoVlNSQUIgVlJSQzokdkEsIFZSUkM6JHZCKSk+Ow0KK2RlZiA6IFBhdDwodjhpMTYgKHNyYSAodjhpMTYgVlJSQzokdkEpLCAodjhpMTYgVlJSQzokdkIpKSksDQorICAgICAgICAgICh2OGkxNiAoVlNSQUggVlJSQzokdkEsIFZSUkM6JHZCKSk+Ow0KK2RlZiA6IFBhdDwodjRpMzIgKHNyYSAodjRpMzIgVlJSQzokdkEpLCAodjRpMzIgVlJSQzokdkIpKSksDQorICAgICAgICAgICh2NGkzMiAoVlNSQVcgVlJSQzokdkEsIFZSUkM6JHZCKSk+Ow0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJbnN0ckJ1aWxkZXIuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJbnN0ckJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDI0ZDExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0luc3RyQnVpbGRlci5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LS0gUFBDSW5zdHJCdWlsZGVyLmggLSBBaWRlcyBmb3IgYnVpbGRpbmcgUFBDIGluc3RzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgZnVuY3Rpb25zIHRoYXQgbWF5IGJlIHVzZWQgd2l0aCBCdWlsZE1JIGZyb20gdGhlCisvLyBNYWNoaW5lSW5zdHJCdWlsZGVyLmggZmlsZSB0byBzaW1wbGlmeSBnZW5lcmF0aW5nIGZyYW1lIGFuZCBjb25zdGFudCBwb29sCisvLyByZWZlcmVuY2VzLgorLy8KKy8vIEZvciByZWZlcmVuY2UsIHRoZSBvcmRlciBvZiBvcGVyYW5kcyBmb3IgbWVtb3J5IHJlZmVyZW5jZXMgaXM6CisvLyAoT3BlcmFuZCksIERlc3QgUmVnLCBCYXNlIFJlZywgYW5kIGVpdGhlciBSZWcgSW5kZXggb3IgSW1tZWRpYXRlCisvLyBEaXNwbGFjZW1lbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQT1dFUlBDX0lOU1RSQlVJTERFUl9ICisjZGVmaW5lIFBPV0VSUENfSU5TVFJCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIGFkZEZyYW1lUmVmZXJlbmNlIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBhIHJlZmVyZW5jZSB0byB0aGUgYmFzZSBvZgorLy8vIGFuIGFic3RyYWN0IG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICBUaGlzCisvLy8gcmVmZXJlbmNlIGhhcyBiYXNlIHJlZ2lzdGVyIGFzIHRoZSBGcmFtZUluZGV4IG9mZnNldCB1bnRpbCBpdCBpcyByZXNvbHZlZC4KKy8vLyBUaGlzIGFsbG93cyBhIGNvbnN0YW50IG9mZnNldCB0byBiZSBzcGVjaWZpZWQgYXMgd2VsbC4uLgorLy8vCitzdGF0aWMgaW5saW5lIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXImCithZGRGcmFtZVJlZmVyZW5jZShjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZNSUIsIGludCBGSSwgaW50IE9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICBib29sIG1lbSA9IHRydWUpIHsKKyAgaWYgKG1lbSkKKyAgICByZXR1cm4gTUlCLmFkZEltbShPZmZzZXQpLmFkZEZyYW1lSW5kZXgoRkkpOworICBlbHNlCisgICAgcmV0dXJuIE1JQi5hZGRGcmFtZUluZGV4KEZJKS5hZGRJbW0oT2Zmc2V0KTsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSW5zdHJGb3JtYXRzLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0luc3RyRm9ybWF0cy50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTc3Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0luc3RyRm9ybWF0cy50ZApAQCAtMCwwICsxLDg4MCBAQAorLy89PT0tIFBvd2VyUENJbnN0ckZvcm1hdHMudGQgLSBQb3dlclBDIEluc3RydWN0aW9uIEZvcm1hdHMgLS0qLSB0YWJsZWdlbiAtKi09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gUG93ZXJQQyBpbnN0cnVjdGlvbiBmb3JtYXRzDQorDQorY2xhc3MgSTxiaXRzPDY+IG9wY29kZSwgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwgSW5zdHJJdGluQ2xhc3MgaXRpbj4NCisgICAgICAgIDogSW5zdHJ1Y3Rpb24gew0KKyAgZmllbGQgYml0czwzMj4gSW5zdDsNCisNCisgIGJpdCBQUEM2NCA9IDA7ICAvLyBEZWZhdWx0IHZhbHVlLCBvdmVycmlkZSB3aXRoIGlzUFBDNjQNCisNCisgIGxldCBOYW1lc3BhY2UgPSAiUFBDIjsNCisgIGxldCBJbnN0ezAtNX0gPSBvcGNvZGU7DQorICBsZXQgT3V0T3BlcmFuZExpc3QgPSBPT0w7DQorICBsZXQgSW5PcGVyYW5kTGlzdCA9IElPTDsNCisgIGxldCBBc21TdHJpbmcgPSBhc21zdHI7DQorICBsZXQgSXRpbmVyYXJ5ID0gaXRpbjsNCisNCisgIGJpdHM8MT4gUFBDOTcwX0ZpcnN0ID0gMDsNCisgIGJpdHM8MT4gUFBDOTcwX1NpbmdsZSA9IDA7DQorICBiaXRzPDE+IFBQQzk3MF9DcmFja2VkID0gMDsNCisgIGJpdHM8Mz4gUFBDOTcwX1VuaXQgPSAwOw0KKw0KKyAgLy8vIFRoZXNlIGZpZWxkcyBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZHMgaW4gUFBDSW5zdHJJbmZvLmguICBBbnkgY2hhbmdlcyB0bw0KKyAgLy8vIHRoZXNlIG11c3QgYmUgcmVmbGVjdGVkIHRoZXJlISAgU2VlIGNvbW1lbnRzIHRoZXJlIGZvciB3aGF0IHRoZXNlIGFyZS4NCisgIGxldCBUU0ZsYWdzezB9ICAgPSBQUEM5NzBfRmlyc3Q7DQorICBsZXQgVFNGbGFnc3sxfSAgID0gUFBDOTcwX1NpbmdsZTsNCisgIGxldCBUU0ZsYWdzezJ9ICAgPSBQUEM5NzBfQ3JhY2tlZDsNCisgIGxldCBUU0ZsYWdzezUtM30gPSBQUEM5NzBfVW5pdDsNCit9DQorDQorY2xhc3MgUFBDOTcwX0RHcm91cF9GaXJzdCAgIHsgYml0czwxPiBQUEM5NzBfRmlyc3QgPSAxOyAgfQ0KK2NsYXNzIFBQQzk3MF9ER3JvdXBfU2luZ2xlICB7IGJpdHM8MT4gUFBDOTcwX1NpbmdsZSA9IDE7IH0NCitjbGFzcyBQUEM5NzBfREdyb3VwX0NyYWNrZWQgeyBiaXRzPDE+IFBQQzk3MF9DcmFja2VkID0gMTsgfQ0KK2NsYXNzIFBQQzk3MF9NaWNyb0NvZGU7DQorDQorY2xhc3MgUFBDOTcwX1VuaXRfUHNldWRvICAgeyBiaXRzPDM+IFBQQzk3MF9Vbml0ID0gMDsgICB9DQorY2xhc3MgUFBDOTcwX1VuaXRfRlhVICAgICAgeyBiaXRzPDM+IFBQQzk3MF9Vbml0ID0gMTsgICB9DQorY2xhc3MgUFBDOTcwX1VuaXRfTFNVICAgICAgeyBiaXRzPDM+IFBQQzk3MF9Vbml0ID0gMjsgICB9DQorY2xhc3MgUFBDOTcwX1VuaXRfRlBVICAgICAgeyBiaXRzPDM+IFBQQzk3MF9Vbml0ID0gMzsgICB9DQorY2xhc3MgUFBDOTcwX1VuaXRfQ1JVICAgICAgeyBiaXRzPDM+IFBQQzk3MF9Vbml0ID0gNDsgICB9DQorY2xhc3MgUFBDOTcwX1VuaXRfVkFMVSAgICAgeyBiaXRzPDM+IFBQQzk3MF9Vbml0ID0gNTsgICB9DQorY2xhc3MgUFBDOTcwX1VuaXRfVlBFUk0gICAgeyBiaXRzPDM+IFBQQzk3MF9Vbml0ID0gNjsgICB9DQorY2xhc3MgUFBDOTcwX1VuaXRfQlJVICAgICAgeyBiaXRzPDM+IFBQQzk3MF9Vbml0ID0gNzsgICB9DQorDQorDQorLy8gMS43LjEgSS1Gb3JtDQorY2xhc3MgSUZvcm08Yml0czw2PiBvcGNvZGUsIGJpdCBhYSwgYml0IGxrLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyAgICAgICAgIDogSTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisgIGJpdHM8MjQ+IExJOw0KKw0KKyAgbGV0IEluc3R7Ni0yOX0gID0gTEk7DQorICBsZXQgSW5zdHszMH0gICAgPSBhYTsNCisgIGxldCBJbnN0ezMxfSAgICA9IGxrOw0KK30NCisNCisvLyAxLjcuMiBCLUZvcm0NCitjbGFzcyBCRm9ybTxiaXRzPDY+IG9wY29kZSwgYml0IGFhLCBiaXQgbGssIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHI+DQorICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBCckI+IHsNCisgIGJpdHM8Nz4gQklCTzsgIC8vIDIgYml0cyBvZiBCSSBhbmQgNSBiaXRzIG9mIEJPLg0KKyAgYml0czwzPiAgQ1I7DQorICBiaXRzPDE0PiBCRDsNCisNCisgIGJpdHM8NT4gQkk7DQorICBsZXQgQkl7MC0xfSA9IEJJQk97NS02fTsNCisgIGxldCBCSXsyLTR9ID0gQ1J7MC0yfTsNCisNCisgIGxldCBJbnN0ezYtMTB9ICA9IEJJQk97NC0wfTsNCisgIGxldCBJbnN0ezExLTE1fSA9IEJJOw0KKyAgbGV0IEluc3R7MTYtMjl9ID0gQkQ7DQorICBsZXQgSW5zdHszMH0gICAgPSBhYTsNCisgIGxldCBJbnN0ezMxfSAgICA9IGxrOw0KK30NCisNCisNCisvLyAxLjcuNCBELUZvcm0NCitjbGFzcyBERm9ybV9iYXNlPGJpdHM8Nj4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+IA0KKyAgOiBJPG9wY29kZSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw1PiAgQTsNCisgIGJpdHM8NT4gIEI7DQorICBiaXRzPDE2PiBDOw0KKw0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgDQorICBsZXQgSW5zdHs2LTEwfSAgPSBBOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gQjsNCisgIGxldCBJbnN0ezE2LTMxfSA9IEM7DQorfQ0KKw0KK2NsYXNzIERGb3JtXzE8Yml0czw2PiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogSTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gIEE7DQorICBiaXRzPDE2PiBDOw0KKyAgYml0czw1PiAgQjsNCisNCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisgIA0KKyAgbGV0IEluc3R7Ni0xMH0gID0gQTsNCisgIGxldCBJbnN0ezExLTE1fSA9IEI7DQorICBsZXQgSW5zdHsxNi0zMX0gPSBDOw0KK30NCisNCitjbGFzcyBERm9ybV8yPGJpdHM8Nj4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICA6IERGb3JtX2Jhc2U8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluLCBwYXR0ZXJuPjsNCisNCitjbGFzcyBERm9ybV8yX3IwPGJpdHM8Nj4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDU+ICBBOw0KKyAgYml0czwxNj4gQjsNCisgIA0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgDQorICBsZXQgSW5zdHs2LTEwfSAgPSBBOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gMDsNCisgIGxldCBJbnN0ezE2LTMxfSA9IEI7DQorfQ0KKw0KK2NsYXNzIERGb3JtXzQ8Yml0czw2PiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogSTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gIEI7DQorICBiaXRzPDU+ICBBOw0KKyAgYml0czwxNj4gQzsNCisgIA0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgDQorICBsZXQgSW5zdHs2LTEwfSAgPSBBOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gQjsNCisgIGxldCBJbnN0ezE2LTMxfSA9IEM7DQorfQ0KKyAgICAgICAgICAgICAgDQorY2xhc3MgREZvcm1fNF96ZXJvPGJpdHM8Nj4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogREZvcm1fMTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4sIHBhdHRlcm4+IHsNCisgIGxldCBBID0gMDsNCisgIGxldCBCID0gMDsNCisgIGxldCBDID0gMDsNCit9DQorDQorY2xhc3MgREZvcm1fNTxiaXRzPDY+IG9wY29kZSwgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+DQorICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDM+ICBCRjsNCisgIGJpdHM8MT4gIEw7DQorICBiaXRzPDU+ICBSQTsNCisgIGJpdHM8MTY+IEk7DQorDQorICBsZXQgSW5zdHs2LTh9ICAgPSBCRjsNCisgIGxldCBJbnN0ezl9ICAgICA9IDA7DQorICBsZXQgSW5zdHsxMH0gICAgPSBMOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gUkE7DQorICBsZXQgSW5zdHsxNi0zMX0gPSBJOw0KK30NCisNCitjbGFzcyBERm9ybV81X2V4dDxiaXRzPDY+IG9wY29kZSwgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluPg0KKyAgOiBERm9ybV81PG9wY29kZSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgbGV0IEwgPSBQUEM2NDsNCit9DQorDQorY2xhc3MgREZvcm1fNjxiaXRzPDY+IG9wY29kZSwgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+IA0KKyAgOiBERm9ybV81PG9wY29kZSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj47DQorDQorY2xhc3MgREZvcm1fNl9leHQ8Yml0czw2PiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4NCisgIDogREZvcm1fNjxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGxldCBMID0gUFBDNjQ7DQorfQ0KKw0KKw0KKy8vIDEuNy41IERTLUZvcm0NCitjbGFzcyBEU0Zvcm1fMTxiaXRzPDY+IG9wY29kZSwgYml0czwyPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgICAgICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDU+ICBSU1Q7DQorICBiaXRzPDE0PiBEUzsNCisgIGJpdHM8NT4gIFJBOw0KKw0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgDQorICBsZXQgSW5zdHs2LTEwfSAgPSBSU1Q7DQorICBsZXQgSW5zdHsxMS0xNX0gPSBSQTsNCisgIGxldCBJbnN0ezE2LTI5fSA9IERTOw0KKyAgbGV0IEluc3R7MzAtMzF9ID0geG87DQorfQ0KKw0KKy8vIDEuNy42IFgtRm9ybQ0KK2NsYXNzIFhGb3JtX2Jhc2VfcjN4bzxiaXRzPDY+IG9wY29kZSwgYml0czwxMD4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIA0KKyAgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogSTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gUlNUOw0KKyAgYml0czw1PiBBOw0KKyAgYml0czw1PiBCOw0KKw0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKw0KKyAgYml0IFJDID0gMDsgICAgLy8gc2V0IGJ5IGlzRE9UDQorDQorICBsZXQgSW5zdHs2LTEwfSAgPSBSU1Q7DQorICBsZXQgSW5zdHsxMS0xNX0gPSBBOw0KKyAgbGV0IEluc3R7MTYtMjB9ID0gQjsNCisgIGxldCBJbnN0ezIxLTMwfSA9IHhvOw0KKyAgbGV0IEluc3R7MzF9ICAgID0gUkM7DQorfQ0KKw0KKy8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgWEZvcm1fYmFzZV9yM3hvLCBidXQgdGhlIGZpcnN0IHR3byBvcGVyYW5kcyBhcmUgc3dhcHBlZA0KKy8vIHdoZW4gY29kZSBpcyBlbWl0dGVkLg0KK2NsYXNzIFhGb3JtX2Jhc2VfcjN4b19zd2FwcGVkDQorICAgICAgICA8Yml0czw2PiBvcGNvZGUsIGJpdHM8MTA+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDU+IEE7DQorICBiaXRzPDU+IFJTVDsNCisgIGJpdHM8NT4gQjsNCisNCisgIGJpdCBSQyA9IDA7ICAgIC8vIHNldCBieSBpc0RPVA0KKw0KKyAgbGV0IEluc3R7Ni0xMH0gID0gUlNUOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gQTsNCisgIGxldCBJbnN0ezE2LTIwfSA9IEI7DQorICBsZXQgSW5zdHsyMS0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IFJDOw0KK30NCisNCisNCitjbGFzcyBYRm9ybV8xPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPiANCisgIDogWEZvcm1fYmFzZV9yM3hvPG9wY29kZSwgeG8sIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4sIHBhdHRlcm4+Ow0KKw0KK2NsYXNzIFhGb3JtXzY8Yml0czw2PiBvcGNvZGUsIGJpdHM8MTA+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+IA0KKyAgOiBYRm9ybV9iYXNlX3IzeG9fc3dhcHBlZDxvcGNvZGUsIHhvLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorfQ0KKw0KK2NsYXNzIFhGb3JtXzg8Yml0czw2PiBvcGNvZGUsIGJpdHM8MTA+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+IA0KKyAgOiBYRm9ybV9iYXNlX3IzeG88b3Bjb2RlLCB4bywgT09MLCBJT0wsIGFzbXN0ciwgaXRpbiwgcGF0dGVybj47DQorDQorY2xhc3MgWEZvcm1fMTA8Yml0czw2PiBvcGNvZGUsIGJpdHM8MTA+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPiANCisgIDogWEZvcm1fYmFzZV9yM3hvX3N3YXBwZWQ8b3Bjb2RlLCB4bywgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorfQ0KKw0KK2NsYXNzIFhGb3JtXzExPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4gDQorICA6IFhGb3JtX2Jhc2VfcjN4b19zd2FwcGVkPG9wY29kZSwgeG8sIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGxldCBCID0gMDsNCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCit9DQorDQorY2xhc3MgWEZvcm1fMTY8Yml0czw2PiBvcGNvZGUsIGJpdHM8MTA+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+DQorICAgICAgICAgOiBJPG9wY29kZSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czwzPiBCRjsNCisgIGJpdHM8MT4gTDsgDQorICBiaXRzPDU+IFJBOw0KKyAgYml0czw1PiBSQjsNCisgIA0KKyAgbGV0IEluc3R7Ni04fSAgID0gQkY7DQorICBsZXQgSW5zdHs5fSAgICAgPSAwOw0KKyAgbGV0IEluc3R7MTB9ICAgID0gTDsNCisgIGxldCBJbnN0ezExLTE1fSA9IFJBOw0KKyAgbGV0IEluc3R7MTYtMjB9ID0gUkI7DQorICBsZXQgSW5zdHsyMS0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IDA7DQorfQ0KKw0KK2NsYXNzIFhGb3JtXzE2X2V4dDxiaXRzPDY+IG9wY29kZSwgYml0czwxMD4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+DQorICA6IFhGb3JtXzE2PG9wY29kZSwgeG8sIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGxldCBMID0gUFBDNjQ7DQorfQ0KKw0KK2NsYXNzIFhGb3JtXzE3PGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluPg0KKyAgICAgICAgIDogSTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8Mz4gQkY7DQorICBiaXRzPDU+IEZSQTsNCisgIGJpdHM8NT4gRlJCOw0KKyAgDQorICBsZXQgSW5zdHs2LTh9ICAgPSBCRjsNCisgIGxldCBJbnN0ezktMTB9ICA9IDA7DQorICBsZXQgSW5zdHsxMS0xNX0gPSBGUkE7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBGUkI7DQorICBsZXQgSW5zdHsyMS0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IDA7DQorfQ0KKw0KK2NsYXNzIFhGb3JtXzI0PGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4gDQorICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICBsZXQgSW5zdHs2LTEwfSAgPSAzMTsNCisgIGxldCBJbnN0ezExLTE1fSA9IDA7DQorICBsZXQgSW5zdHsxNi0yMH0gPSAwOw0KKyAgbGV0IEluc3R7MjEtMzB9ID0geG87DQorICBsZXQgSW5zdHszMX0gICAgPSAwOw0KK30NCisNCitjbGFzcyBYRm9ybV8yNF9zeW5jPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwNCisgICAgICAgICAgICAgICBzdHJpbmcgYXNtc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4gDQorICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICBsZXQgSW5zdHs2LTEwfSAgPSAwOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gMDsNCisgIGxldCBJbnN0ezE2LTIwfSA9IDA7DQorICBsZXQgSW5zdHsyMS0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IDA7DQorfQ0KKw0KK2NsYXNzIFhGb3JtXzI1PGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4gDQorICA6IFhGb3JtX2Jhc2VfcjN4bzxvcGNvZGUsIHhvLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluLCBwYXR0ZXJuPiB7DQorfQ0KKw0KK2NsYXNzIFhGb3JtXzI2PGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogWEZvcm1fYmFzZV9yM3hvPG9wY29kZSwgeG8sIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4sIHBhdHRlcm4+IHsNCisgIGxldCBBID0gMDsNCit9DQorDQorY2xhc3MgWEZvcm1fMjg8Yml0czw2PiBvcGNvZGUsIGJpdHM8MTA+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPiANCisgIDogWEZvcm1fYmFzZV9yM3hvPG9wY29kZSwgeG8sIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4sIHBhdHRlcm4+IHsNCit9DQorDQorLy8gVGhpcyBpcyB1c2VkIGZvciBNRkZTLCBNVEZTQjAsIE1URlNCMS4gIDQyIGlzIGFyYml0cmFyeTsgdGhpcyBzZXJpZXMgb2YNCisvLyBudW1iZXJzIHByZXN1bWFibHkgcmVsYXRlcyB0byBzb21lIGRvY3VtZW50LCBidXQgSSBoYXZlbid0IGZvdW5kIGl0Lg0KK2NsYXNzIFhGb3JtXzQyPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyAgOiBYRm9ybV9iYXNlX3IzeG88b3Bjb2RlLCB4bywgT09MLCBJT0wsIGFzbXN0ciwgaXRpbiwgcGF0dGVybj4gew0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKw0KKyAgYml0IFJDID0gMDsgICAgLy8gc2V0IGJ5IGlzRE9UDQorDQorICBsZXQgSW5zdHs2LTEwfSAgPSBSU1Q7DQorICBsZXQgSW5zdHsxMS0yMH0gPSAwOw0KKyAgbGV0IEluc3R7MjEtMzB9ID0geG87DQorICBsZXQgSW5zdHszMX0gICAgPSBSQzsNCit9DQorY2xhc3MgWEZvcm1fNDM8Yml0czw2PiBvcGNvZGUsIGJpdHM8MTA+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICA6IFhGb3JtX2Jhc2VfcjN4bzxvcGNvZGUsIHhvLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluLCBwYXR0ZXJuPiB7DQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICBiaXRzPDU+IEZNOw0KKw0KKyAgYml0IFJDID0gMDsgICAgLy8gc2V0IGJ5IGlzRE9UDQorDQorICBsZXQgSW5zdHs2LTEwfSAgPSBGTTsNCisgIGxldCBJbnN0ezExLTIwfSA9IDA7DQorICBsZXQgSW5zdHsyMS0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IFJDOw0KK30NCisNCisvLyBEQ0JfRm9ybSAtIEZvcm0gWCBpbnN0cnVjdGlvbiwgdXNlZCBmb3IgZGNiKiBpbnN0cnVjdGlvbnMuDQorY2xhc3MgRENCX0Zvcm08Yml0czwxMD4geG8sIGJpdHM8NT4gaW1tZmllbGQsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIA0KKyAgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogSTwzMSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw1PiBBOw0KKyAgYml0czw1PiBCOw0KKw0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKw0KKyAgbGV0IEluc3R7Ni0xMH0gID0gaW1tZmllbGQ7DQorICBsZXQgSW5zdHsxMS0xNX0gPSBBOw0KKyAgbGV0IEluc3R7MTYtMjB9ID0gQjsNCisgIGxldCBJbnN0ezIxLTMwfSA9IHhvOw0KKyAgbGV0IEluc3R7MzF9ICAgID0gMDsNCit9DQorDQorDQorLy8gRFNTX0Zvcm0gLSBGb3JtIFggaW5zdHJ1Y3Rpb24sIHVzZWQgZm9yIGFsdGl2ZWMgZHNzKiBpbnN0cnVjdGlvbnMuDQorY2xhc3MgRFNTX0Zvcm08Yml0czwxMD4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIA0KKyAgICAgICAgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogSTwzMSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czwxPiBUOw0KKyAgYml0czwyPiBTVFJNOw0KKyAgYml0czw1PiBBOw0KKyAgYml0czw1PiBCOw0KKw0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKw0KKyAgbGV0IEluc3R7Nn0gICAgID0gVDsNCisgIGxldCBJbnN0ezctOH0gICA9IDA7DQorICBsZXQgSW5zdHs5LTEwfSAgPSBTVFJNOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gQTsNCisgIGxldCBJbnN0ezE2LTIwfSA9IEI7DQorICBsZXQgSW5zdHsyMS0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IDA7DQorfQ0KKw0KKy8vIDEuNy43IFhMLUZvcm0NCitjbGFzcyBYTEZvcm1fMTxiaXRzPDY+IG9wY29kZSwgYml0czwxMD4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICAgIDogSTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gQ1JEOw0KKyAgYml0czw1PiBDUkE7DQorICBiaXRzPDU+IENSQjsNCisgIA0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgDQorICBsZXQgSW5zdHs2LTEwfSAgPSBDUkQ7DQorICBsZXQgSW5zdHsxMS0xNX0gPSBDUkE7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBDUkI7DQorICBsZXQgSW5zdHsyMS0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IDA7DQorfQ0KKw0KK2NsYXNzIFhMRm9ybV8xX2V4dDxiaXRzPDY+IG9wY29kZSwgYml0czwxMD4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICAgIDogSTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gQ1JEOw0KKyAgDQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICANCisgIGxldCBJbnN0ezYtMTB9ICA9IENSRDsNCisgIGxldCBJbnN0ezExLTE1fSA9IENSRDsNCisgIGxldCBJbnN0ezE2LTIwfSA9IENSRDsNCisgIGxldCBJbnN0ezIxLTMwfSA9IHhvOw0KKyAgbGV0IEluc3R7MzF9ICAgID0gMDsNCit9DQorDQorY2xhc3MgWExGb3JtXzI8Yml0czw2PiBvcGNvZGUsIGJpdHM8MTA+IHhvLCBiaXQgbGssIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIA0KKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyAgICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDU+IEJPOw0KKyAgYml0czw1PiBCSTsNCisgIGJpdHM8Mj4gQkg7DQorICANCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisgIA0KKyAgbGV0IEluc3R7Ni0xMH0gID0gQk87DQorICBsZXQgSW5zdHsxMS0xNX0gPSBCSTsNCisgIGxldCBJbnN0ezE2LTE4fSA9IDA7DQorICBsZXQgSW5zdHsxOS0yMH0gPSBCSDsNCisgIGxldCBJbnN0ezIxLTMwfSA9IHhvOw0KKyAgbGV0IEluc3R7MzF9ICAgID0gbGs7DQorfQ0KKw0KK2NsYXNzIFhMRm9ybV8yX2JyPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgYml0IGxrLA0KKyAgICAgICAgICAgICAgICAgIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyAgOiBYTEZvcm1fMjxvcGNvZGUsIHhvLCBsaywgT09MLCBJT0wsIGFzbXN0ciwgaXRpbiwgcGF0dGVybj4gew0KKyAgYml0czw3PiBCSUJPOyAgLy8gMiBiaXRzIG9mIEJJIGFuZCA1IGJpdHMgb2YgQk8uDQorICBiaXRzPDM+ICBDUjsNCisgIA0KKyAgbGV0IEJPID0gQklCT3syLTZ9Ow0KKyAgbGV0IEJJezAtMX0gPSBCSUJPezAtMX07DQorICBsZXQgQkl7Mi00fSA9IENSOw0KKyAgbGV0IEJIID0gMDsNCit9DQorDQorDQorY2xhc3MgWExGb3JtXzJfZXh0PGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgYml0czw1PiBibywgIGJpdHM8NT4gYmksIGJpdCBsaywNCisgICAgICAgICAgICAgICAgICBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogWExGb3JtXzI8b3Bjb2RlLCB4bywgbGssIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4sIHBhdHRlcm4+IHsNCisgIGxldCBCTyA9IGJvOw0KKyAgbGV0IEJJID0gYmk7DQorICBsZXQgQkggPSAwOw0KK30NCisNCitjbGFzcyBYTEZvcm1fMzxiaXRzPDY+IG9wY29kZSwgYml0czwxMD4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4NCisgICAgICAgICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDM+IEJGOw0KKyAgYml0czwzPiBCRkE7DQorICANCisgIGxldCBJbnN0ezYtOH0gICA9IEJGOw0KKyAgbGV0IEluc3R7OS0xMH0gID0gMDsNCisgIGxldCBJbnN0ezExLTEzfSA9IEJGQTsNCisgIGxldCBJbnN0ezE0LTE1fSA9IDA7DQorICBsZXQgSW5zdHsxNi0yMH0gPSAwOw0KKyAgbGV0IEluc3R7MjEtMzB9ID0geG87DQorICBsZXQgSW5zdHszMX0gICAgPSAwOw0KK30NCisNCisvLyAxLjcuOCBYRlgtRm9ybQ0KK2NsYXNzIFhGWEZvcm1fMTxiaXRzPDY+IG9wY29kZSwgYml0czwxMD4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+DQorICAgICAgICAgOiBJPG9wY29kZSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw1PiAgUlQ7DQorICBiaXRzPDEwPiBTUFI7DQorDQorICBsZXQgSW5zdHs2LTEwfSAgPSBSVDsNCisgIGxldCBJbnN0ezExfSAgICA9IFNQUns0fTsNCisgIGxldCBJbnN0ezEyfSAgICA9IFNQUnszfTsNCisgIGxldCBJbnN0ezEzfSAgICA9IFNQUnsyfTsNCisgIGxldCBJbnN0ezE0fSAgICA9IFNQUnsxfTsNCisgIGxldCBJbnN0ezE1fSAgICA9IFNQUnswfTsNCisgIGxldCBJbnN0ezE2fSAgICA9IFNQUns5fTsNCisgIGxldCBJbnN0ezE3fSAgICA9IFNQUns4fTsNCisgIGxldCBJbnN0ezE4fSAgICA9IFNQUns3fTsNCisgIGxldCBJbnN0ezE5fSAgICA9IFNQUns2fTsNCisgIGxldCBJbnN0ezIwfSAgICA9IFNQUns1fTsNCisgIGxldCBJbnN0ezIxLTMwfSA9IHhvOw0KKyAgbGV0IEluc3R7MzF9ICAgID0gMDsNCit9DQorDQorY2xhc3MgWEZYRm9ybV8xX2V4dDxiaXRzPDY+IG9wY29kZSwgYml0czwxMD4geG8sIGJpdHM8MTA+IHNwciwgDQorICAgICAgICAgICAgICAgICAgIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIEluc3RySXRpbkNsYXNzIGl0aW4+IA0KKyAgOiBYRlhGb3JtXzE8b3Bjb2RlLCB4bywgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgbGV0IFNQUiA9IHNwcjsNCit9DQorDQorY2xhc3MgWEZYRm9ybV8zPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4NCisgICAgICAgICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDU+ICBSVDsNCisgICANCisgIGxldCBJbnN0ezYtMTB9ICA9IFJUOw0KKyAgbGV0IEluc3R7MTEtMjB9ID0gMDsNCisgIGxldCBJbnN0ezIxLTMwfSA9IHhvOw0KKyAgbGV0IEluc3R7MzF9ICAgID0gMDsNCit9DQorDQorY2xhc3MgWEZYRm9ybV81PGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDg+ICBGWE07DQorICBiaXRzPDU+ICBTVDsNCisgICANCisgIGxldCBJbnN0ezYtMTB9ICA9IFNUOw0KKyAgbGV0IEluc3R7MTF9ICAgID0gMDsNCisgIGxldCBJbnN0ezEyLTE5fSA9IEZYTTsNCisgIGxldCBJbnN0ezIwfSAgICA9IDA7DQorICBsZXQgSW5zdHsyMS0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IDA7DQorfQ0KKw0KK2NsYXNzIFhGWEZvcm1fNWE8Yml0czw2PiBvcGNvZGUsIGJpdHM8MTA+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbj4gDQorICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDU+ICBTVDsNCisgIGJpdHM8OD4gIEZYTTsNCisgICANCisgIGxldCBJbnN0ezYtMTB9ICA9IFNUOw0KKyAgbGV0IEluc3R7MTF9ICAgID0gMTsNCisgIGxldCBJbnN0ezEyLTE5fSA9IEZYTTsNCisgIGxldCBJbnN0ezIwfSAgICA9IDA7DQorICBsZXQgSW5zdHsyMS0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IDA7DQorfQ0KKw0KK2NsYXNzIFhGWEZvcm1fNzxiaXRzPDY+IG9wY29kZSwgYml0czwxMD4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4+DQorICA6IFhGWEZvcm1fMTxvcGNvZGUsIHhvLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPjsNCisNCitjbGFzcyBYRlhGb3JtXzdfZXh0PGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgYml0czwxMD4gc3ByLCANCisgICAgICAgICAgICAgICAgICAgIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsIEluc3RySXRpbkNsYXNzIGl0aW4+IA0KKyAgOiBYRlhGb3JtXzc8b3Bjb2RlLCB4bywgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgbGV0IFNQUiA9IHNwcjsNCit9DQorDQorLy8gWEZMLUZvcm0gLSBNVEZTRg0KKy8vIFRoaXMgaXMgcHJvYmFibHkgMS43LjksIGJ1dCBJIGRvbid0IGhhdmUgdGhlIHJlZmVyZW5jZSB0aGF0IHVzZXMgdGhpcw0KKy8vIG51bWJlcmluZyBzY2hlbWUuLi4NCitjbGFzcyBYRkxGb3JtPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwgDQorICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz5wYXR0ZXJuPg0KKyAgOiBJPG9wY29kZSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw4PiBGTTsNCisgIGJpdHM8NT4gUlQ7DQorDQorICBiaXQgUkMgPSAwOyAgICAvLyBzZXQgYnkgaXNET1QNCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisgIGxldCBDb25zdHJhaW50cyA9IGNzdHI7DQorDQorICBsZXQgSW5zdHs2fSA9IDA7DQorICBsZXQgSW5zdHs3LTE0fSAgPSBGTTsNCisgIGxldCBJbnN0ezE1fSA9IDA7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBSVDsNCisgIGxldCBJbnN0ezIxLTMwfSA9IHhvOw0KKyAgbGV0IEluc3R7MzF9ICAgID0gUkM7DQorfQ0KKw0KKy8vIDEuNy4xMCBYUy1Gb3JtIC0gU1JBREkuDQorY2xhc3MgWFNGb3JtXzE8Yml0czw2PiBvcGNvZGUsIGJpdHM8OT4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICAgICAgICAgOiBJPG9wY29kZSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw1PiBBOw0KKyAgYml0czw1PiBSUzsNCisgIGJpdHM8Nj4gU0g7DQorDQorICBiaXQgUkMgPSAwOyAgICAvLyBzZXQgYnkgaXNET1QNCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisNCisgIGxldCBJbnN0ezYtMTB9ICA9IFJTOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gQTsNCisgIGxldCBJbnN0ezE2LTIwfSA9IFNIezQsMywyLDEsMH07DQorICBsZXQgSW5zdHsyMS0yOX0gPSB4bzsNCisgIGxldCBJbnN0ezMwfSAgICA9IFNIezV9Ow0KKyAgbGV0IEluc3R7MzF9ICAgID0gUkM7DQorfQ0KKw0KKy8vIDEuNy4xMSBYTy1Gb3JtDQorY2xhc3MgWE9Gb3JtXzE8Yml0czw2PiBvcGNvZGUsIGJpdHM8OT4geG8sIGJpdCBvZSwgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgICAgICA6IEk8b3Bjb2RlLCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDU+IFJUOw0KKyAgYml0czw1PiBSQTsNCisgIGJpdHM8NT4gUkI7DQorDQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorDQorICBiaXQgUkMgPSAwOyAgICAvLyBzZXQgYnkgaXNET1QNCisNCisgIGxldCBJbnN0ezYtMTB9ICA9IFJUOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gUkE7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBSQjsNCisgIGxldCBJbnN0ezIxfSAgICA9IG9lOw0KKyAgbGV0IEluc3R7MjItMzB9ID0geG87DQorICBsZXQgSW5zdHszMX0gICAgPSBSQzsgIA0KK30NCisNCitjbGFzcyBYT0Zvcm1fMzxiaXRzPDY+IG9wY29kZSwgYml0czw5PiB4bywgYml0IG9lLCANCisgICAgICAgICAgICAgICBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLCBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogWE9Gb3JtXzE8b3Bjb2RlLCB4bywgb2UsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4sIHBhdHRlcm4+IHsNCisgIGxldCBSQiA9IDA7DQorfQ0KKw0KKy8vIDEuNy4xMiBBLUZvcm0NCitjbGFzcyBBRm9ybV8xPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDU+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLCANCisgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyAgICAgICAgIDogSTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gRlJUOw0KKyAgYml0czw1PiBGUkE7DQorICBiaXRzPDU+IEZSQzsNCisgIGJpdHM8NT4gRlJCOw0KKw0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKw0KKyAgYml0IFJDID0gMDsgICAgLy8gc2V0IGJ5IGlzRE9UDQorDQorICBsZXQgSW5zdHs2LTEwfSAgPSBGUlQ7DQorICBsZXQgSW5zdHsxMS0xNX0gPSBGUkE7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBGUkI7DQorICBsZXQgSW5zdHsyMS0yNX0gPSBGUkM7DQorICBsZXQgSW5zdHsyNi0zMH0gPSB4bzsNCisgIGxldCBJbnN0ezMxfSAgICA9IFJDOw0KK30NCisNCitjbGFzcyBBRm9ybV8yPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDU+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICA6IEFGb3JtXzE8b3Bjb2RlLCB4bywgT09MLCBJT0wsIGFzbXN0ciwgaXRpbiwgcGF0dGVybj4gew0KKyAgbGV0IEZSQyA9IDA7DQorfQ0KKw0KK2NsYXNzIEFGb3JtXzM8Yml0czw2PiBvcGNvZGUsIGJpdHM8NT4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4gDQorICA6IEFGb3JtXzE8b3Bjb2RlLCB4bywgT09MLCBJT0wsIGFzbXN0ciwgaXRpbiwgcGF0dGVybj4gew0KKyAgbGV0IEZSQiA9IDA7DQorfQ0KKw0KKy8vIDEuNy4xMyBNLUZvcm0NCitjbGFzcyBNRm9ybV8xPGJpdHM8Nj4gb3Bjb2RlLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICAgIDogSTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gUkE7DQorICBiaXRzPDU+IFJTOw0KKyAgYml0czw1PiBSQjsNCisgIGJpdHM8NT4gTUI7DQorICBiaXRzPDU+IE1FOw0KKw0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKw0KKyAgYml0IFJDID0gMDsgICAgLy8gc2V0IGJ5IGlzRE9UDQorDQorICBsZXQgSW5zdHs2LTEwfSAgPSBSUzsNCisgIGxldCBJbnN0ezExLTE1fSA9IFJBOw0KKyAgbGV0IEluc3R7MTYtMjB9ID0gUkI7DQorICBsZXQgSW5zdHsyMS0yNX0gPSBNQjsNCisgIGxldCBJbnN0ezI2LTMwfSA9IE1FOw0KKyAgbGV0IEluc3R7MzF9ICAgID0gUkM7DQorfQ0KKw0KK2NsYXNzIE1Gb3JtXzI8Yml0czw2PiBvcGNvZGUsIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgIDogTUZvcm1fMTxvcGNvZGUsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4sIHBhdHRlcm4+IHsNCit9DQorDQorLy8gMS43LjE0IE1ELUZvcm0NCitjbGFzcyBNREZvcm1fMTxiaXRzPDY+IG9wY29kZSwgYml0czwzPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgOiBJPG9wY29kZSwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw1PiBSQTsNCisgIGJpdHM8NT4gUlM7DQorICBiaXRzPDY+IFNIOw0KKyAgYml0czw2PiBNQkU7DQorDQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorDQorICBiaXQgUkMgPSAwOyAgICAvLyBzZXQgYnkgaXNET1QNCisNCisgIGxldCBJbnN0ezYtMTB9ICA9IFJTOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gUkE7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBTSHs0LDMsMiwxLDB9Ow0KKyAgbGV0IEluc3R7MjEtMjZ9ID0gTUJFezQsMywyLDEsMCw1fTsNCisgIGxldCBJbnN0ezI3LTI5fSA9IHhvOw0KKyAgbGV0IEluc3R7MzB9ICAgID0gU0h7NX07DQorICBsZXQgSW5zdHszMX0gICAgPSBSQzsNCit9DQorDQorDQorDQorLy8gRS0xIFZBLUZvcm0NCisNCisvLyBWQUZvcm1fMSAtIERBQ0Igb3JkZXJpbmcuDQorY2xhc3MgVkFGb3JtXzE8Yml0czw2PiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgOiBJPDQsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gVkQ7DQorICBiaXRzPDU+IFZBOw0KKyAgYml0czw1PiBWQzsNCisgIGJpdHM8NT4gVkI7DQorDQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICANCisgIGxldCBJbnN0ezYtMTB9ICA9IFZEOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gVkE7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBWQjsNCisgIGxldCBJbnN0ezIxLTI1fSA9IFZDOw0KKyAgbGV0IEluc3R7MjYtMzF9ID0geG87DQorfQ0KKw0KKy8vIFZBRm9ybV8xYSAtIERBQkMgb3JkZXJpbmcuDQorY2xhc3MgVkFGb3JtXzFhPGJpdHM8Nj4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyAgICA6IEk8NCwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw1PiBWRDsNCisgIGJpdHM8NT4gVkE7DQorICBiaXRzPDU+IFZCOw0KKyAgYml0czw1PiBWQzsNCisNCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisgIA0KKyAgbGV0IEluc3R7Ni0xMH0gID0gVkQ7DQorICBsZXQgSW5zdHsxMS0xNX0gPSBWQTsNCisgIGxldCBJbnN0ezE2LTIwfSA9IFZCOw0KKyAgbGV0IEluc3R7MjEtMjV9ID0gVkM7DQorICBsZXQgSW5zdHsyNi0zMX0gPSB4bzsNCit9DQorDQorY2xhc3MgVkFGb3JtXzI8Yml0czw2PiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgOiBJPDQsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gVkQ7DQorICBiaXRzPDU+IFZBOw0KKyAgYml0czw1PiBWQjsNCisgIGJpdHM8ND4gU0g7DQorDQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICANCisgIGxldCBJbnN0ezYtMTB9ICA9IFZEOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gVkE7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBWQjsNCisgIGxldCBJbnN0ezIxfSAgICA9IDA7DQorICBsZXQgSW5zdHsyMi0yNX0gPSBTSDsNCisgIGxldCBJbnN0ezI2LTMxfSA9IHhvOw0KK30NCisNCisvLyBFLTIgVlgtRm9ybQ0KK2NsYXNzIFZYRm9ybV8xPGJpdHM8MTE+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyAgICA6IEk8NCwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw1PiBWRDsNCisgIGJpdHM8NT4gVkE7DQorICBiaXRzPDU+IFZCOw0KKyAgDQorICBsZXQgUGF0dGVybiA9IHBhdHRlcm47DQorICANCisgIGxldCBJbnN0ezYtMTB9ICA9IFZEOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gVkE7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBWQjsNCisgIGxldCBJbnN0ezIxLTMxfSA9IHhvOw0KK30NCisNCitjbGFzcyBWWEZvcm1fc2V0emVybzxiaXRzPDExPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgOiBWWEZvcm1fMTx4bywgT09MLCBJT0wsIGFzbXN0ciwgaXRpbiwgcGF0dGVybj4gew0KKyAgbGV0IFZBID0gVkQ7DQorICBsZXQgVkIgPSBWRDsNCit9DQorDQorDQorY2xhc3MgVlhGb3JtXzI8Yml0czwxMT4geG8sIGRhZyBPT0wsIGRhZyBJT0wsIHN0cmluZyBhc21zdHIsDQorICAgICAgICAgICAgICAgSW5zdHJJdGluQ2xhc3MgaXRpbiwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICAgIDogSTw0LCBPT0wsIElPTCwgYXNtc3RyLCBpdGluPiB7DQorICBiaXRzPDU+IFZEOw0KKyAgYml0czw1PiBWQjsNCisgIA0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgDQorICBsZXQgSW5zdHs2LTEwfSAgPSBWRDsNCisgIGxldCBJbnN0ezExLTE1fSA9IDA7DQorICBsZXQgSW5zdHsxNi0yMH0gPSBWQjsNCisgIGxldCBJbnN0ezIxLTMxfSA9IHhvOw0KK30NCisNCitjbGFzcyBWWEZvcm1fMzxiaXRzPDExPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgOiBJPDQsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gVkQ7DQorICBiaXRzPDU+IElNTTsNCisgIA0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgDQorICBsZXQgSW5zdHs2LTEwfSAgPSBWRDsNCisgIGxldCBJbnN0ezExLTE1fSA9IElNTTsNCisgIGxldCBJbnN0ezE2LTIwfSA9IDA7DQorICBsZXQgSW5zdHsyMS0zMX0gPSB4bzsNCit9DQorDQorLy8vIFZYRm9ybV80IC0gVlggaW5zdHJ1Y3Rpb25zIHdpdGggIlZELDAsMCIgcmVnaXN0ZXIgZmllbGRzLCBsaWtlIG1mdnNjci4NCitjbGFzcyBWWEZvcm1fNDxiaXRzPDExPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgOiBJPDQsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gVkQ7DQorICANCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisgIA0KKyAgbGV0IEluc3R7Ni0xMH0gID0gVkQ7DQorICBsZXQgSW5zdHsxMS0xNX0gPSAwOw0KKyAgbGV0IEluc3R7MTYtMjB9ID0gMDsNCisgIGxldCBJbnN0ezIxLTMxfSA9IHhvOw0KK30NCisNCisvLy8gVlhGb3JtXzUgLSBWWCBpbnN0cnVjdGlvbnMgd2l0aCAiMCwwLFZCIiByZWdpc3RlciBmaWVsZHMsIGxpa2UgbXR2c2NyLg0KK2NsYXNzIFZYRm9ybV81PGJpdHM8MTE+IHhvLCBkYWcgT09MLCBkYWcgSU9MLCBzdHJpbmcgYXNtc3RyLA0KKyAgICAgICAgICAgICAgIEluc3RySXRpbkNsYXNzIGl0aW4sIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyAgICA6IEk8NCwgT09MLCBJT0wsIGFzbXN0ciwgaXRpbj4gew0KKyAgYml0czw1PiBWQjsNCisgIA0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KKyAgDQorICBsZXQgSW5zdHs2LTEwfSAgPSAwOw0KKyAgbGV0IEluc3R7MTEtMTV9ID0gMDsNCisgIGxldCBJbnN0ezE2LTIwfSA9IFZCOw0KKyAgbGV0IEluc3R7MjEtMzF9ID0geG87DQorfQ0KKw0KKy8vIEUtNCBWWFItRm9ybQ0KK2NsYXNzIFZYUkZvcm1fMTxiaXRzPDEwPiB4bywgZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwNCisgICAgICAgICAgICAgICBJbnN0ckl0aW5DbGFzcyBpdGluLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgOiBJPDQsIE9PTCwgSU9MLCBhc21zdHIsIGl0aW4+IHsNCisgIGJpdHM8NT4gVkQ7DQorICBiaXRzPDU+IFZBOw0KKyAgYml0czw1PiBWQjsNCisgIGJpdCBSQyA9IDA7DQorICANCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisgIA0KKyAgbGV0IEluc3R7Ni0xMH0gID0gVkQ7DQorICBsZXQgSW5zdHsxMS0xNX0gPSBWQTsNCisgIGxldCBJbnN0ezE2LTIwfSA9IFZCOw0KKyAgbGV0IEluc3R7MjF9ICAgID0gUkM7DQorICBsZXQgSW5zdHsyMi0zMX0gPSB4bzsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCitjbGFzcyBQc2V1ZG88ZGFnIE9PTCwgZGFnIElPTCwgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICAgIDogSTwwLCBPT0wsIElPTCwgYXNtc3RyLCBOb0l0aW5lcmFyeT4gew0KKyAgbGV0IFBQQzY0ID0gMDsNCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsNCisgIGxldCBJbnN0ezMxLTB9ID0gMDsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0luc3RySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSW5zdHJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTcxMDhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0luc3RySW5mby5jcHAKQEAgLTAsMCArMSw2MzYgQEAKKy8vPT09LSBQUENJbnN0ckluZm8uY3BwIC0gUG93ZXJQQzMyIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQb3dlclBDIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlBQQ0luc3RySW5mby5oIgorI2luY2x1ZGUgIlBQQ0luc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgIlBQQ01hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJQUENQcmVkaWNhdGVzLmgiCisjaW5jbHVkZSAiUFBDR2VuSW5zdHJJbmZvLmluYyIKKyNpbmNsdWRlICJQUENUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CitleHRlcm4gY2w6Om9wdDxib29sPiBFbmFibGVQUEMzMlJTOyAgLy8gRklYTUUgKDY0LWJpdCk6IFNlZSBQUENSZWdpc3RlckluZm8uY3BwLgorZXh0ZXJuIGNsOjpvcHQ8Ym9vbD4gRW5hYmxlUFBDNjRSUzsgIC8vIEZJWE1FICg2NC1iaXQpOiBTZWUgUFBDUmVnaXN0ZXJJbmZvLmNwcC4KK30KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1BQQ0luc3RySW5mbzo6UFBDSW5zdHJJbmZvKFBQQ1RhcmdldE1hY2hpbmUgJnRtKQorICA6IFRhcmdldEluc3RySW5mb0ltcGwoUFBDSW5zdHMsIGFycmF5X2xlbmd0aG9mKFBQQ0luc3RzKSksIFRNKHRtKSwKKyAgICBSSSgqVE0uZ2V0U3VidGFyZ2V0SW1wbCgpLCAqdGhpcykge30KKwordW5zaWduZWQgUFBDSW5zdHJJbmZvOjppc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBQUEM6OkxEOgorICBjYXNlIFBQQzo6TFdaOgorICBjYXNlIFBQQzo6TEZTOgorICBjYXNlIFBQQzo6TEZEOgorICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgxKS5pc0ltbSgpICYmICFNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKSAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5pc0ZJKCkpIHsKKyAgICAgIEZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbmRleCgpOworICAgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgUFBDSW5zdHJJbmZvOjppc1N0b3JlVG9TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgUFBDOjpTVEQ6CisgIGNhc2UgUFBDOjpTVFc6CisgIGNhc2UgUFBDOjpTVEZTOgorICBjYXNlIFBQQzo6U1RGRDoKKyAgICBpZiAoTUktPmdldE9wZXJhbmQoMSkuaXNJbW0oKSAmJiAhTUktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMikuaXNGSSgpKSB7CisgICAgICBGcmFtZUluZGV4ID0gTUktPmdldE9wZXJhbmQoMikuZ2V0SW5kZXgoKTsKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIGNvbW11dGVJbnN0cnVjdGlvbiAtIFdlIGNhbiBjb21tdXRlIHJsd2ltaSBpbnN0cnVjdGlvbnMsIGJ1dCBvbmx5IGlmIHRoZQorLy8gcm90YXRlIGFtdCBpcyB6ZXJvLiAgV2UgYWxzbyBoYXZlIHRvIG11bmdlIHRoZSBpbW1lZGlhdGVzIGEgYml0LgorTWFjaGluZUluc3RyICoKK1BQQ0luc3RySW5mbzo6Y29tbXV0ZUluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAqTUksIGJvb2wgTmV3TUkpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworCisgIC8vIE5vcm1hbCBpbnN0cnVjdGlvbnMgY2FuIGJlIGNvbW11dGVkIHRoZSBvYnZpb3VzIHdheS4KKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSAhPSBQUEM6OlJMV0lNSSkKKyAgICByZXR1cm4gVGFyZ2V0SW5zdHJJbmZvSW1wbDo6Y29tbXV0ZUluc3RydWN0aW9uKE1JLCBOZXdNSSk7CisgIAorICAvLyBDYW5ub3QgY29tbXV0ZSBpZiBpdCBoYXMgYSBub24temVybyByb3RhdGUgY291bnQuCisgIGlmIChNSS0+Z2V0T3BlcmFuZCgzKS5nZXRJbW0oKSAhPSAwKQorICAgIHJldHVybiAwOworICAKKyAgLy8gSWYgd2UgaGF2ZSBhIHplcm8gcm90YXRlIGNvdW50LCB3ZSBoYXZlOgorICAvLyAgIE0gPSBtYXNrKE1CLE1FKQorICAvLyAgIE9wMCA9IChPcDEgJiB+TSkgfCAoT3AyICYgTSkKKyAgLy8gQ2hhbmdlIHRoaXMgdG86CisgIC8vICAgTSA9IG1hc2soKE1FKzEpJjMxLCAoTUItMSkmMzEpCisgIC8vICAgT3AwID0gKE9wMiAmIH5NKSB8IChPcDEgJiBNKQorCisgIC8vIFN3YXAgb3AxL29wMgorICB1bnNpZ25lZCBSZWcwID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIFJlZzEgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgUmVnMiA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpOworICBib29sIFJlZzFJc0tpbGwgPSBNSS0+Z2V0T3BlcmFuZCgxKS5pc0tpbGwoKTsKKyAgYm9vbCBSZWcySXNLaWxsID0gTUktPmdldE9wZXJhbmQoMikuaXNLaWxsKCk7CisgIGJvb2wgQ2hhbmdlUmVnMCA9IGZhbHNlOworICAvLyBJZiBtYWNoaW5lIGluc3RycyBhcmUgbm8gbG9uZ2VyIGluIHR3by1hZGRyZXNzIGZvcm1zLCB1cGRhdGUKKyAgLy8gZGVzdGluYXRpb24gcmVnaXN0ZXIgYXMgd2VsbC4KKyAgaWYgKFJlZzAgPT0gUmVnMSkgeworICAgIC8vIE11c3QgYmUgdHdvIGFkZHJlc3MgaW5zdHJ1Y3Rpb24hCisgICAgYXNzZXJ0KE1JLT5nZXREZXNjKCkuZ2V0T3BlcmFuZENvbnN0cmFpbnQoMCwgVE9JOjpUSUVEX1RPKSAmJgorICAgICAgICAgICAiRXhwZWN0aW5nIGEgdHdvLWFkZHJlc3MgaW5zdHJ1Y3Rpb24hIik7CisgICAgUmVnMklzS2lsbCA9IGZhbHNlOworICAgIENoYW5nZVJlZzAgPSB0cnVlOworICB9CisKKyAgLy8gTWFza3MuCisgIHVuc2lnbmVkIE1CID0gTUktPmdldE9wZXJhbmQoNCkuZ2V0SW1tKCk7CisgIHVuc2lnbmVkIE1FID0gTUktPmdldE9wZXJhbmQoNSkuZ2V0SW1tKCk7CisKKyAgaWYgKE5ld01JKSB7CisgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RydWN0aW9uLgorICAgIHVuc2lnbmVkIFJlZzAgPSBDaGFuZ2VSZWcwID8gUmVnMiA6IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIGJvb2wgUmVnMElzRGVhZCA9IE1JLT5nZXRPcGVyYW5kKDApLmlzRGVhZCgpOworICAgIHJldHVybiBCdWlsZE1JKE1GLCBNSS0+Z2V0RGVidWdMb2MoKSwgTUktPmdldERlc2MoKSkKKyAgICAgIC5hZGRSZWcoUmVnMCwgUmVnU3RhdGU6OkRlZmluZSB8IGdldERlYWRSZWdTdGF0ZShSZWcwSXNEZWFkKSkKKyAgICAgIC5hZGRSZWcoUmVnMiwgZ2V0S2lsbFJlZ1N0YXRlKFJlZzJJc0tpbGwpKQorICAgICAgLmFkZFJlZyhSZWcxLCBnZXRLaWxsUmVnU3RhdGUoUmVnMUlzS2lsbCkpCisgICAgICAuYWRkSW1tKChNRSsxKSAmIDMxKQorICAgICAgLmFkZEltbSgoTUItMSkgJiAzMSk7CisgIH0KKworICBpZiAoQ2hhbmdlUmVnMCkKKyAgICBNSS0+Z2V0T3BlcmFuZCgwKS5zZXRSZWcoUmVnMik7CisgIE1JLT5nZXRPcGVyYW5kKDIpLnNldFJlZyhSZWcxKTsKKyAgTUktPmdldE9wZXJhbmQoMSkuc2V0UmVnKFJlZzIpOworICBNSS0+Z2V0T3BlcmFuZCgyKS5zZXRJc0tpbGwoUmVnMUlzS2lsbCk7CisgIE1JLT5nZXRPcGVyYW5kKDEpLnNldElzS2lsbChSZWcySXNLaWxsKTsKKyAgCisgIC8vIFN3YXAgdGhlIG1hc2sgYXJvdW5kLgorICBNSS0+Z2V0T3BlcmFuZCg0KS5zZXRJbW0oKE1FKzEpICYgMzEpOworICBNSS0+Z2V0T3BlcmFuZCg1KS5zZXRJbW0oKE1CLTEpICYgMzEpOworICByZXR1cm4gTUk7Cit9CisKK3ZvaWQgUFBDSW5zdHJJbmZvOjppbnNlcnROb29wKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JKSBjb25zdCB7CisgIERlYnVnTG9jIERMOworICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoUFBDOjpOT1ApKTsKK30KKworCisvLyBCcmFuY2ggYW5hbHlzaXMuCitib29sIFBQQ0luc3RySW5mbzo6QW5hbHl6ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSkgY29uc3QgeworICAvLyBJZiB0aGUgYmxvY2sgaGFzIG5vIHRlcm1pbmF0b3JzLCBpdCBqdXN0IGZhbGxzIGludG8gdGhlIGJsb2NrIGFmdGVyIGl0LgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5lbmQoKTsKKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAtLUk7CisgIHdoaWxlIChJLT5pc0RlYnVnVmFsdWUoKSkgeworICAgIGlmIChJID09IE1CQi5iZWdpbigpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC0tSTsKKyAgfQorICBpZiAoIWlzVW5wcmVkaWNhdGVkVGVybWluYXRvcihJKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gR2V0IHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBibG9jay4KKyAgTWFjaGluZUluc3RyICpMYXN0SW5zdCA9IEk7CisgIAorICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSB0ZXJtaW5hdG9yIGluc3RydWN0aW9uLCBwcm9jZXNzIGl0LgorICBpZiAoSSA9PSBNQkIuYmVnaW4oKSB8fCAhaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKC0tSSkpIHsKKyAgICBpZiAoTGFzdEluc3QtPmdldE9wY29kZSgpID09IFBQQzo6QikgeworICAgICAgaWYgKCFMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5pc01CQigpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIFRCQiA9IExhc3RJbnN0LT5nZXRPcGVyYW5kKDApLmdldE1CQigpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoTGFzdEluc3QtPmdldE9wY29kZSgpID09IFBQQzo6QkNDKSB7CisgICAgICBpZiAoIUxhc3RJbnN0LT5nZXRPcGVyYW5kKDIpLmlzTUJCKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgLy8gQmxvY2sgZW5kcyB3aXRoIGZhbGwtdGhyb3VnaCBjb25kYnJhbmNoLgorICAgICAgVEJCID0gTGFzdEluc3QtPmdldE9wZXJhbmQoMikuZ2V0TUJCKCk7CisgICAgICBDb25kLnB1c2hfYmFjayhMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICBDb25kLnB1c2hfYmFjayhMYXN0SW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIE90aGVyd2lzZSwgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIGl0IGlmIGl0J3MgYSB0ZXJtaW5hdG9yLgorICBNYWNoaW5lSW5zdHIgKlNlY29uZExhc3RJbnN0ID0gSTsKKworICAvLyBJZiB0aGVyZSBhcmUgdGhyZWUgdGVybWluYXRvcnMsIHdlIGRvbid0IGtub3cgd2hhdCBzb3J0IG9mIGJsb2NrIHRoaXMgaXMuCisgIGlmIChTZWNvbmRMYXN0SW5zdCAmJiBJICE9IE1CQi5iZWdpbigpICYmCisgICAgICBpc1VucHJlZGljYXRlZFRlcm1pbmF0b3IoLS1JKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIC8vIElmIHRoZSBibG9jayBlbmRzIHdpdGggUFBDOjpCIGFuZCBQUEM6QkNDLCBoYW5kbGUgaXQuCisgIGlmIChTZWNvbmRMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpCQ0MgJiYgCisgICAgICBMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpCKSB7CisgICAgaWYgKCFTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgyKS5pc01CQigpIHx8CisgICAgICAgICFMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5pc01CQigpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgVEJCID0gIFNlY29uZExhc3RJbnN0LT5nZXRPcGVyYW5kKDIpLmdldE1CQigpOworICAgIENvbmQucHVzaF9iYWNrKFNlY29uZExhc3RJbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgICBDb25kLnB1c2hfYmFjayhTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgRkJCID0gTGFzdEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLyBJZiB0aGUgYmxvY2sgZW5kcyB3aXRoIHR3byBQUEM6QnMsIGhhbmRsZSBpdC4gIFRoZSBzZWNvbmQgb25lIGlzIG5vdAorICAvLyBleGVjdXRlZCwgc28gcmVtb3ZlIGl0LgorICBpZiAoU2Vjb25kTGFzdEluc3QtPmdldE9wY29kZSgpID09IFBQQzo6QiAmJiAKKyAgICAgIExhc3RJbnN0LT5nZXRPcGNvZGUoKSA9PSBQUEM6OkIpIHsKKyAgICBpZiAoIVNlY29uZExhc3RJbnN0LT5nZXRPcGVyYW5kKDApLmlzTUJCKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBUQkIgPSBTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICBJID0gTGFzdEluc3Q7CisgICAgaWYgKEFsbG93TW9kaWZ5KQorICAgICAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBjYW4ndCBoYW5kbGUgdGhpcy4KKyAgcmV0dXJuIHRydWU7Cit9CisKK3Vuc2lnbmVkIFBQQ0luc3RySW5mbzo6UmVtb3ZlQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuZW5kKCk7CisgIGlmIChJID09IE1CQi5iZWdpbigpKSByZXR1cm4gMDsKKyAgLS1JOworICB3aGlsZSAoSS0+aXNEZWJ1Z1ZhbHVlKCkpIHsKKyAgICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkKKyAgICAgIHJldHVybiAwOworICAgIC0tSTsKKyAgfQorICBpZiAoSS0+Z2V0T3Bjb2RlKCkgIT0gUFBDOjpCICYmIEktPmdldE9wY29kZSgpICE9IFBQQzo6QkNDKQorICAgIHJldHVybiAwOworICAKKyAgLy8gUmVtb3ZlIHRoZSBicmFuY2guCisgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAKKyAgSSA9IE1CQi5lbmQoKTsKKworICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkgcmV0dXJuIDE7CisgIC0tSTsKKyAgaWYgKEktPmdldE9wY29kZSgpICE9IFBQQzo6QkNDKQorICAgIHJldHVybiAxOworICAKKyAgLy8gUmVtb3ZlIHRoZSBicmFuY2guCisgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICByZXR1cm4gMjsKK30KKwordW5zaWduZWQKK1BQQ0luc3RySW5mbzo6SW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdCB7CisgIC8vIFNob3VsZG4ndCBiZSBhIGZhbGwgdGhyb3VnaC4KKyAgYXNzZXJ0KFRCQiAmJiAiSW5zZXJ0QnJhbmNoIG11c3Qgbm90IGJlIHRvbGQgdG8gaW5zZXJ0IGEgZmFsbHRocm91Z2giKTsKKyAgYXNzZXJ0KChDb25kLnNpemUoKSA9PSAyIHx8IENvbmQuc2l6ZSgpID09IDApICYmIAorICAgICAgICAgIlBQQyBicmFuY2ggY29uZGl0aW9ucyBoYXZlIHR3byBjb21wb25lbnRzISIpOworICAKKyAgLy8gT25lLXdheSBicmFuY2guCisgIGlmIChGQkIgPT0gMCkgeworICAgIGlmIChDb25kLmVtcHR5KCkpICAgLy8gVW5jb25kaXRpb25hbCBicmFuY2gKKyAgICAgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChQUEM6OkIpKS5hZGRNQkIoVEJCKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgIC8vIENvbmRpdGlvbmFsIGJyYW5jaAorICAgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KFBQQzo6QkNDKSkKKyAgICAgICAgLmFkZEltbShDb25kWzBdLmdldEltbSgpKS5hZGRSZWcoQ29uZFsxXS5nZXRSZWcoKSkuYWRkTUJCKFRCQik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIC8vIFR3by13YXkgQ29uZGl0aW9uYWwgQnJhbmNoLgorICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoUFBDOjpCQ0MpKQorICAgIC5hZGRJbW0oQ29uZFswXS5nZXRJbW0oKSkuYWRkUmVnKENvbmRbMV0uZ2V0UmVnKCkpLmFkZE1CQihUQkIpOworICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoUFBDOjpCKSkuYWRkTUJCKEZCQik7CisgIHJldHVybiAyOworfQorCit2b2lkIFBQQ0luc3RySW5mbzo6Y29weVBoeXNSZWcoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgS2lsbFNyYykgY29uc3QgeworICB1bnNpZ25lZCBPcGM7CisgIGlmIChQUEM6OkdQUkNSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIE9wYyA9IFBQQzo6T1I7CisgIGVsc2UgaWYgKFBQQzo6RzhSQ1JlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpCisgICAgT3BjID0gUFBDOjpPUjg7CisgIGVsc2UgaWYgKFBQQzo6RjRSQ1JlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpCisgICAgT3BjID0gUFBDOjpGTVI7CisgIGVsc2UgaWYgKFBQQzo6Q1JSQ1JlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpCisgICAgT3BjID0gUFBDOjpNQ1JGOworICBlbHNlIGlmIChQUEM6OlZSUkNSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIE9wYyA9IFBQQzo6Vk9SOworICBlbHNlIGlmIChQUEM6OkNSQklUUkNSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIE9wYyA9IFBQQzo6Q1JPUjsKKyAgZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkltcG9zc2libGUgcmVnLXRvLXJlZyBjb3B5Iik7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBnZXQoT3BjKTsKKyAgaWYgKFRJRC5nZXROdW1PcGVyYW5kcygpID09IDMpCisgICAgQnVpbGRNSShNQkIsIEksIERMLCBUSUQsIERlc3RSZWcpCisgICAgICAuYWRkUmVnKFNyY1JlZykuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgZWxzZQorICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgVElELCBEZXN0UmVnKS5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworfQorCitib29sCitQUENJbnN0ckluZm86OlN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGcmFtZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyKj4gJk5ld01JcykgY29uc3R7CisgIERlYnVnTG9jIERMOworICBpZiAoUkMgPT0gUFBDOjpHUFJDUmVnaXN0ZXJDbGFzcykgeworICAgIGlmIChTcmNSZWcgIT0gUFBDOjpMUikgeworICAgICAgTmV3TUlzLnB1c2hfYmFjayhhZGRGcmFtZVJlZmVyZW5jZShCdWlsZE1JKE1GLCBETCwgZ2V0KFBQQzo6U1RXKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUlkeCkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBGSVhNRTogdGhpcyBzcGlsbHMgTFIgaW1tZWRpYXRlbHkgdG8gbWVtb3J5IGluIG9uZSBzdGVwLiAgVG8gZG8gdGhpcywKKyAgICAgIC8vIHdlIHVzZSBSMTEsIHdoaWNoIHdlIGtub3cgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHByb2xvZy9lcGlsb2cuICBUaGlzIGlzCisgICAgICAvLyBhIGhhY2suCisgICAgICBOZXdNSXMucHVzaF9iYWNrKEJ1aWxkTUkoTUYsIERMLCBnZXQoUFBDOjpNRkxSKSwgUFBDOjpSMTEpKTsKKyAgICAgIE5ld01Jcy5wdXNoX2JhY2soYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNRiwgREwsIGdldChQUEM6OlNUVykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoUFBDOjpSMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUlkeCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChSQyA9PSBQUEM6Okc4UkNSZWdpc3RlckNsYXNzKSB7CisgICAgaWYgKFNyY1JlZyAhPSBQUEM6OkxSOCkgeworICAgICAgTmV3TUlzLnB1c2hfYmFjayhhZGRGcmFtZVJlZmVyZW5jZShCdWlsZE1JKE1GLCBETCwgZ2V0KFBQQzo6U1REKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUlkeCkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBGSVhNRTogdGhpcyBzcGlsbHMgTFIgaW1tZWRpYXRlbHkgdG8gbWVtb3J5IGluIG9uZSBzdGVwLiAgVG8gZG8gdGhpcywKKyAgICAgIC8vIHdlIHVzZSBSMTEsIHdoaWNoIHdlIGtub3cgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHByb2xvZy9lcGlsb2cuICBUaGlzIGlzCisgICAgICAvLyBhIGhhY2suCisgICAgICBOZXdNSXMucHVzaF9iYWNrKEJ1aWxkTUkoTUYsIERMLCBnZXQoUFBDOjpNRkxSOCksIFBQQzo6WDExKSk7CisgICAgICBOZXdNSXMucHVzaF9iYWNrKGFkZEZyYW1lUmVmZXJlbmNlKEJ1aWxkTUkoTUYsIERMLCBnZXQoUFBDOjpTVEQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFBQQzo6WDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVJZHgpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoUkMgPT0gUFBDOjpGOFJDUmVnaXN0ZXJDbGFzcykgeworICAgIE5ld01Jcy5wdXNoX2JhY2soYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNRiwgREwsIGdldChQUEM6OlNURkQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lSWR4KSk7CisgIH0gZWxzZSBpZiAoUkMgPT0gUFBDOjpGNFJDUmVnaXN0ZXJDbGFzcykgeworICAgIE5ld01Jcy5wdXNoX2JhY2soYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNRiwgREwsIGdldChQUEM6OlNURlMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lSWR4KSk7CisgIH0gZWxzZSBpZiAoUkMgPT0gUFBDOjpDUlJDUmVnaXN0ZXJDbGFzcykgeworICAgIGlmICgoRW5hYmxlUFBDMzJSUyAmJiAhVE0uZ2V0U3VidGFyZ2V0SW1wbCgpLT5pc1BQQzY0KCkpIHx8CisgICAgICAgIChFbmFibGVQUEM2NFJTICYmIFRNLmdldFN1YnRhcmdldEltcGwoKS0+aXNQUEM2NCgpKSkgeworICAgICAgLy8gRklYTUUgKDY0LWJpdCk6IEVuYWJsZQorICAgICAgTmV3TUlzLnB1c2hfYmFjayhhZGRGcmFtZVJlZmVyZW5jZShCdWlsZE1JKE1GLCBETCwgZ2V0KFBQQzo6U1BJTExfQ1IpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lSWR4KSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRklYTUU6IFdlIG5lZWQgYSBzY2F0Y2ggcmVnIGhlcmUuICBUaGUgdHJvdWJsZSB3aXRoIHVzaW5nIFIwIGlzIHRoYXQKKyAgICAgIC8vIGl0J3MgcG9zc2libGUgZm9yIHRoZSBzdGFjayBmcmFtZSB0byBiZSBzbyBiaWcgdGhlIHNhdmUgbG9jYXRpb24gaXMKKyAgICAgIC8vIG91dCBvZiByYW5nZSBvZiBpbW1lZGlhdGUgb2Zmc2V0cywgbmVjZXNzaXRhdGluZyBhbm90aGVyIHJlZ2lzdGVyLgorICAgICAgLy8gV2UgaGFjayB0aGlzIG9uIERhcndpbiBieSByZXNlcnZpbmcgUjIuICBJdCdzIHByb2JhYmx5IGJyb2tlbiBvbiBMaW51eAorICAgICAgLy8gYXQgdGhlIG1vbWVudC4KKworICAgICAgLy8gV2UgbmVlZCB0byBzdG9yZSB0aGUgQ1IgaW4gdGhlIGxvdyA0LWJpdHMgb2YgdGhlIHNhdmVkIHZhbHVlLiAgRmlyc3QsCisgICAgICAvLyBpc3N1ZSBhIE1GQ1IgdG8gc2F2ZSBhbGwgb2YgdGhlIENSQml0cy4KKyAgICAgIHVuc2lnbmVkIFNjcmF0Y2hSZWcgPSBUTS5nZXRTdWJ0YXJnZXRJbXBsKCktPmlzRGFyd2luQUJJKCkgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDOjpSMiA6IFBQQzo6UjA7CisgICAgICBOZXdNSXMucHVzaF9iYWNrKEJ1aWxkTUkoTUYsIERMLCBnZXQoUFBDOjpNRkNScHNldWQpLCBTY3JhdGNoUmVnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkpOworICAgIAorICAgICAgLy8gSWYgdGhlIHNhdmVkIHJlZ2lzdGVyIHdhc24ndCBDUjAsIHNoaWZ0IHRoZSBiaXRzIGxlZnQgc28gdGhhdCB0aGV5IGFyZQorICAgICAgLy8gaW4gQ1IwJ3Mgc2xvdC4KKyAgICAgIGlmIChTcmNSZWcgIT0gUFBDOjpDUjApIHsKKyAgICAgICAgdW5zaWduZWQgU2hpZnRCaXRzID0gUFBDUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhTcmNSZWcpKjQ7CisgICAgICAgIC8vIHJsd2lubSBzY3JhdGNoLCBzY3JhdGNoLCBTaGlmdEJpdHMsIDAsIDMxLgorICAgICAgICBOZXdNSXMucHVzaF9iYWNrKEJ1aWxkTUkoTUYsIERMLCBnZXQoUFBDOjpSTFdJTk0pLCBTY3JhdGNoUmVnKQorICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFNjcmF0Y2hSZWcpLmFkZEltbShTaGlmdEJpdHMpCisgICAgICAgICAgICAgICAgICAgICAgIC5hZGRJbW0oMCkuYWRkSW1tKDMxKSk7CisgICAgICB9CisgICAgCisgICAgICBOZXdNSXMucHVzaF9iYWNrKGFkZEZyYW1lUmVmZXJlbmNlKEJ1aWxkTUkoTUYsIERMLCBnZXQoUFBDOjpTVFcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFNjcmF0Y2hSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUlkeCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChSQyA9PSBQUEM6OkNSQklUUkNSZWdpc3RlckNsYXNzKSB7CisgICAgLy8gRklYTUU6IFdlIHVzZSBDUmkgaGVyZSBiZWNhdXNlIHRoZXJlIGlzIG5vIG10Y3JmIG9uIGEgYml0LiBTaW5jZSB0aGUKKyAgICAvLyBiYWNrZW5kIGN1cnJlbnRseSBvbmx5IHVzZXMgQ1IxRVEgYXMgYW4gaW5kaXZpZHVhbCBiaXQsIHRoaXMgc2hvdWxkCisgICAgLy8gbm90IGNhdXNlIGFueSBidWcuIElmIHdlIG5lZWQgb3RoZXIgdXNlcyBvZiBDUiBiaXRzLCB0aGUgZm9sbG93aW5nCisgICAgLy8gY29kZSBtYXkgYmUgaW52YWxpZC4KKyAgICB1bnNpZ25lZCBSZWcgPSAwOworICAgIGlmIChTcmNSZWcgPT0gUFBDOjpDUjBMVCB8fCBTcmNSZWcgPT0gUFBDOjpDUjBHVCB8fAorICAgICAgICBTcmNSZWcgPT0gUFBDOjpDUjBFUSB8fCBTcmNSZWcgPT0gUFBDOjpDUjBVTikKKyAgICAgIFJlZyA9IFBQQzo6Q1IwOworICAgIGVsc2UgaWYgKFNyY1JlZyA9PSBQUEM6OkNSMUxUIHx8IFNyY1JlZyA9PSBQUEM6OkNSMUdUIHx8CisgICAgICAgICAgICAgU3JjUmVnID09IFBQQzo6Q1IxRVEgfHwgU3JjUmVnID09IFBQQzo6Q1IxVU4pCisgICAgICBSZWcgPSBQUEM6OkNSMTsKKyAgICBlbHNlIGlmIChTcmNSZWcgPT0gUFBDOjpDUjJMVCB8fCBTcmNSZWcgPT0gUFBDOjpDUjJHVCB8fAorICAgICAgICAgICAgIFNyY1JlZyA9PSBQUEM6OkNSMkVRIHx8IFNyY1JlZyA9PSBQUEM6OkNSMlVOKQorICAgICAgUmVnID0gUFBDOjpDUjI7CisgICAgZWxzZSBpZiAoU3JjUmVnID09IFBQQzo6Q1IzTFQgfHwgU3JjUmVnID09IFBQQzo6Q1IzR1QgfHwKKyAgICAgICAgICAgICBTcmNSZWcgPT0gUFBDOjpDUjNFUSB8fCBTcmNSZWcgPT0gUFBDOjpDUjNVTikKKyAgICAgIFJlZyA9IFBQQzo6Q1IzOworICAgIGVsc2UgaWYgKFNyY1JlZyA9PSBQUEM6OkNSNExUIHx8IFNyY1JlZyA9PSBQUEM6OkNSNEdUIHx8CisgICAgICAgICAgICAgU3JjUmVnID09IFBQQzo6Q1I0RVEgfHwgU3JjUmVnID09IFBQQzo6Q1I0VU4pCisgICAgICBSZWcgPSBQUEM6OkNSNDsKKyAgICBlbHNlIGlmIChTcmNSZWcgPT0gUFBDOjpDUjVMVCB8fCBTcmNSZWcgPT0gUFBDOjpDUjVHVCB8fAorICAgICAgICAgICAgIFNyY1JlZyA9PSBQUEM6OkNSNUVRIHx8IFNyY1JlZyA9PSBQUEM6OkNSNVVOKQorICAgICAgUmVnID0gUFBDOjpDUjU7CisgICAgZWxzZSBpZiAoU3JjUmVnID09IFBQQzo6Q1I2TFQgfHwgU3JjUmVnID09IFBQQzo6Q1I2R1QgfHwKKyAgICAgICAgICAgICBTcmNSZWcgPT0gUFBDOjpDUjZFUSB8fCBTcmNSZWcgPT0gUFBDOjpDUjZVTikKKyAgICAgIFJlZyA9IFBQQzo6Q1I2OworICAgIGVsc2UgaWYgKFNyY1JlZyA9PSBQUEM6OkNSN0xUIHx8IFNyY1JlZyA9PSBQUEM6OkNSN0dUIHx8CisgICAgICAgICAgICAgU3JjUmVnID09IFBQQzo6Q1I3RVEgfHwgU3JjUmVnID09IFBQQzo6Q1I3VU4pCisgICAgICBSZWcgPSBQUEM6OkNSNzsKKworICAgIHJldHVybiBTdG9yZVJlZ1RvU3RhY2tTbG90KE1GLCBSZWcsIGlzS2lsbCwgRnJhbWVJZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQzo6Q1JSQ1JlZ2lzdGVyQ2xhc3MsIE5ld01Jcyk7CisKKyAgfSBlbHNlIGlmIChSQyA9PSBQUEM6OlZSUkNSZWdpc3RlckNsYXNzKSB7CisgICAgLy8gV2UgZG9uJ3QgaGF2ZSBpbmRleGVkIGFkZHJlc3NpbmcgZm9yIHZlY3RvciBsb2Fkcy4gIEVtaXQ6CisgICAgLy8gUjAgPSBBRERJIEZJIworICAgIC8vIFNUVlggVkFMLCAwLCBSMAorICAgIC8vIAorICAgIC8vIEZJWE1FOiBXZSB1c2UgUjAgaGVyZSwgYmVjYXVzZSBpdCBpc24ndCBhdmFpbGFibGUgZm9yIFJBLgorICAgIE5ld01Jcy5wdXNoX2JhY2soYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNRiwgREwsIGdldChQUEM6OkFEREkpLCBQUEM6OlIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lSWR4LCAwLCAwKSk7CisgICAgTmV3TUlzLnB1c2hfYmFjayhCdWlsZE1JKE1GLCBETCwgZ2V0KFBQQzo6U1RWWCkpCisgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpCisgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFBQQzo6UjApCisgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFBQQzo6UjApKTsKKyAgfSBlbHNlIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHJlZ2NsYXNzISIpOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkCitQUENJbnN0ckluZm86OnN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA0PiBOZXdNSXM7CisKKyAgaWYgKFN0b3JlUmVnVG9TdGFja1Nsb3QoTUYsIFNyY1JlZywgaXNLaWxsLCBGcmFtZUlkeCwgUkMsIE5ld01JcykpIHsKKyAgICBQUENGdW5jdGlvbkluZm8gKkZ1bmNJbmZvID0gTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCk7CisgICAgRnVuY0luZm8tPnNldFNwaWxsc0NSKCk7CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3TUlzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgTUJCLmluc2VydChNSSwgTmV3TUlzW2ldKTsKKworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICZNRkkgPSAqTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8gPQorICAgIE1GLmdldE1hY2hpbmVNZW1PcGVyYW5kKFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKEZyYW1lSWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZDo6TU9TdG9yZSwgLypPZmZzZXQ9Ki8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RTaXplKEZyYW1lSWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkkuZ2V0T2JqZWN0QWxpZ25tZW50KEZyYW1lSWR4KSk7CisgIE5ld01Jcy5iYWNrKCktPmFkZE1lbU9wZXJhbmQoTUYsIE1NTyk7Cit9CisKK3ZvaWQKK1BQQ0luc3RySW5mbzo6TG9hZFJlZ0Zyb21TdGFja1Nsb3QoTWFjaGluZUZ1bmN0aW9uICZNRiwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAmTmV3TUlzKWNvbnN0eworICBpZiAoUkMgPT0gUFBDOjpHUFJDUmVnaXN0ZXJDbGFzcykgeworICAgIGlmIChEZXN0UmVnICE9IFBQQzo6TFIpIHsKKyAgICAgIE5ld01Jcy5wdXNoX2JhY2soYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNRiwgREwsIGdldChQUEM6OkxXWiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdFJlZyksIEZyYW1lSWR4KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE5ld01Jcy5wdXNoX2JhY2soYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNRiwgREwsIGdldChQUEM6OkxXWiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDOjpSMTEpLCBGcmFtZUlkeCkpOworICAgICAgTmV3TUlzLnB1c2hfYmFjayhCdWlsZE1JKE1GLCBETCwgZ2V0KFBQQzo6TVRMUikpLmFkZFJlZyhQUEM6OlIxMSkpOworICAgIH0KKyAgfSBlbHNlIGlmIChSQyA9PSBQUEM6Okc4UkNSZWdpc3RlckNsYXNzKSB7CisgICAgaWYgKERlc3RSZWcgIT0gUFBDOjpMUjgpIHsKKyAgICAgIE5ld01Jcy5wdXNoX2JhY2soYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNRiwgREwsIGdldChQUEM6OkxEKSwgRGVzdFJlZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lSWR4KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE5ld01Jcy5wdXNoX2JhY2soYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNRiwgREwsIGdldChQUEM6OkxEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUEM6OlIxMSksIEZyYW1lSWR4KSk7CisgICAgICBOZXdNSXMucHVzaF9iYWNrKEJ1aWxkTUkoTUYsIERMLCBnZXQoUFBDOjpNVExSOCkpLmFkZFJlZyhQUEM6OlIxMSkpOworICAgIH0KKyAgfSBlbHNlIGlmIChSQyA9PSBQUEM6OkY4UkNSZWdpc3RlckNsYXNzKSB7CisgICAgTmV3TUlzLnB1c2hfYmFjayhhZGRGcmFtZVJlZmVyZW5jZShCdWlsZE1JKE1GLCBETCwgZ2V0KFBQQzo6TEZEKSwgRGVzdFJlZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUlkeCkpOworICB9IGVsc2UgaWYgKFJDID09IFBQQzo6RjRSQ1JlZ2lzdGVyQ2xhc3MpIHsKKyAgICBOZXdNSXMucHVzaF9iYWNrKGFkZEZyYW1lUmVmZXJlbmNlKEJ1aWxkTUkoTUYsIERMLCBnZXQoUFBDOjpMRlMpLCBEZXN0UmVnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lSWR4KSk7CisgIH0gZWxzZSBpZiAoUkMgPT0gUFBDOjpDUlJDUmVnaXN0ZXJDbGFzcykgeworICAgIC8vIEZJWE1FOiBXZSBuZWVkIGEgc2NhdGNoIHJlZyBoZXJlLiAgVGhlIHRyb3VibGUgd2l0aCB1c2luZyBSMCBpcyB0aGF0CisgICAgLy8gaXQncyBwb3NzaWJsZSBmb3IgdGhlIHN0YWNrIGZyYW1lIHRvIGJlIHNvIGJpZyB0aGUgc2F2ZSBsb2NhdGlvbiBpcworICAgIC8vIG91dCBvZiByYW5nZSBvZiBpbW1lZGlhdGUgb2Zmc2V0cywgbmVjZXNzaXRhdGluZyBhbm90aGVyIHJlZ2lzdGVyLgorICAgIC8vIFdlIGhhY2sgdGhpcyBvbiBEYXJ3aW4gYnkgcmVzZXJ2aW5nIFIyLiAgSXQncyBwcm9iYWJseSBicm9rZW4gb24gTGludXgKKyAgICAvLyBhdCB0aGUgbW9tZW50LgorICAgIHVuc2lnbmVkIFNjcmF0Y2hSZWcgPSBUTS5nZXRTdWJ0YXJnZXRJbXBsKCktPmlzRGFyd2luQUJJKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQzo6UjIgOiBQUEM6OlIwOworICAgIE5ld01Jcy5wdXNoX2JhY2soYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNRiwgREwsIGdldChQUEM6OkxXWiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyYXRjaFJlZyksIEZyYW1lSWR4KSk7CisgICAgCisgICAgLy8gSWYgdGhlIHJlbG9hZGVkIHJlZ2lzdGVyIGlzbid0IENSMCwgc2hpZnQgdGhlIGJpdHMgcmlnaHQgc28gdGhhdCB0aGV5IGFyZQorICAgIC8vIGluIHRoZSByaWdodCBDUidzIHNsb3QuCisgICAgaWYgKERlc3RSZWcgIT0gUFBDOjpDUjApIHsKKyAgICAgIHVuc2lnbmVkIFNoaWZ0Qml0cyA9IFBQQ1JlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoRGVzdFJlZykqNDsKKyAgICAgIC8vIHJsd2lubSByMTEsIHIxMSwgMzItU2hpZnRCaXRzLCAwLCAzMS4KKyAgICAgIE5ld01Jcy5wdXNoX2JhY2soQnVpbGRNSShNRiwgREwsIGdldChQUEM6OlJMV0lOTSksIFNjcmF0Y2hSZWcpCisgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoU2NyYXRjaFJlZykuYWRkSW1tKDMyLVNoaWZ0Qml0cykuYWRkSW1tKDApCisgICAgICAgICAgICAgICAgICAgIC5hZGRJbW0oMzEpKTsKKyAgICB9CisgICAgCisgICAgTmV3TUlzLnB1c2hfYmFjayhCdWlsZE1JKE1GLCBETCwgZ2V0KFBQQzo6TVRDUkYpLCBEZXN0UmVnKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhTY3JhdGNoUmVnKSk7CisgIH0gZWxzZSBpZiAoUkMgPT0gUFBDOjpDUkJJVFJDUmVnaXN0ZXJDbGFzcykgeworICAgCisgICAgdW5zaWduZWQgUmVnID0gMDsKKyAgICBpZiAoRGVzdFJlZyA9PSBQUEM6OkNSMExUIHx8IERlc3RSZWcgPT0gUFBDOjpDUjBHVCB8fAorICAgICAgICBEZXN0UmVnID09IFBQQzo6Q1IwRVEgfHwgRGVzdFJlZyA9PSBQUEM6OkNSMFVOKQorICAgICAgUmVnID0gUFBDOjpDUjA7CisgICAgZWxzZSBpZiAoRGVzdFJlZyA9PSBQUEM6OkNSMUxUIHx8IERlc3RSZWcgPT0gUFBDOjpDUjFHVCB8fAorICAgICAgICAgICAgIERlc3RSZWcgPT0gUFBDOjpDUjFFUSB8fCBEZXN0UmVnID09IFBQQzo6Q1IxVU4pCisgICAgICBSZWcgPSBQUEM6OkNSMTsKKyAgICBlbHNlIGlmIChEZXN0UmVnID09IFBQQzo6Q1IyTFQgfHwgRGVzdFJlZyA9PSBQUEM6OkNSMkdUIHx8CisgICAgICAgICAgICAgRGVzdFJlZyA9PSBQUEM6OkNSMkVRIHx8IERlc3RSZWcgPT0gUFBDOjpDUjJVTikKKyAgICAgIFJlZyA9IFBQQzo6Q1IyOworICAgIGVsc2UgaWYgKERlc3RSZWcgPT0gUFBDOjpDUjNMVCB8fCBEZXN0UmVnID09IFBQQzo6Q1IzR1QgfHwKKyAgICAgICAgICAgICBEZXN0UmVnID09IFBQQzo6Q1IzRVEgfHwgRGVzdFJlZyA9PSBQUEM6OkNSM1VOKQorICAgICAgUmVnID0gUFBDOjpDUjM7CisgICAgZWxzZSBpZiAoRGVzdFJlZyA9PSBQUEM6OkNSNExUIHx8IERlc3RSZWcgPT0gUFBDOjpDUjRHVCB8fAorICAgICAgICAgICAgIERlc3RSZWcgPT0gUFBDOjpDUjRFUSB8fCBEZXN0UmVnID09IFBQQzo6Q1I0VU4pCisgICAgICBSZWcgPSBQUEM6OkNSNDsKKyAgICBlbHNlIGlmIChEZXN0UmVnID09IFBQQzo6Q1I1TFQgfHwgRGVzdFJlZyA9PSBQUEM6OkNSNUdUIHx8CisgICAgICAgICAgICAgRGVzdFJlZyA9PSBQUEM6OkNSNUVRIHx8IERlc3RSZWcgPT0gUFBDOjpDUjVVTikKKyAgICAgIFJlZyA9IFBQQzo6Q1I1OworICAgIGVsc2UgaWYgKERlc3RSZWcgPT0gUFBDOjpDUjZMVCB8fCBEZXN0UmVnID09IFBQQzo6Q1I2R1QgfHwKKyAgICAgICAgICAgICBEZXN0UmVnID09IFBQQzo6Q1I2RVEgfHwgRGVzdFJlZyA9PSBQUEM6OkNSNlVOKQorICAgICAgUmVnID0gUFBDOjpDUjY7CisgICAgZWxzZSBpZiAoRGVzdFJlZyA9PSBQUEM6OkNSN0xUIHx8IERlc3RSZWcgPT0gUFBDOjpDUjdHVCB8fAorICAgICAgICAgICAgIERlc3RSZWcgPT0gUFBDOjpDUjdFUSB8fCBEZXN0UmVnID09IFBQQzo6Q1I3VU4pCisgICAgICBSZWcgPSBQUEM6OkNSNzsKKworICAgIHJldHVybiBMb2FkUmVnRnJvbVN0YWNrU2xvdChNRiwgREwsIFJlZywgRnJhbWVJZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUEM6OkNSUkNSZWdpc3RlckNsYXNzLCBOZXdNSXMpOworCisgIH0gZWxzZSBpZiAoUkMgPT0gUFBDOjpWUlJDUmVnaXN0ZXJDbGFzcykgeworICAgIC8vIFdlIGRvbid0IGhhdmUgaW5kZXhlZCBhZGRyZXNzaW5nIGZvciB2ZWN0b3IgbG9hZHMuICBFbWl0OgorICAgIC8vIFIwID0gQURESSBGSSMKKyAgICAvLyBEZXN0ID0gTFZYIDAsIFIwCisgICAgLy8gCisgICAgLy8gRklYTUU6IFdlIHVzZSBSMCBoZXJlLCBiZWNhdXNlIGl0IGlzbid0IGF2YWlsYWJsZSBmb3IgUkEuCisgICAgTmV3TUlzLnB1c2hfYmFjayhhZGRGcmFtZVJlZmVyZW5jZShCdWlsZE1JKE1GLCBETCwgZ2V0KFBQQzo6QURESSksIFBQQzo6UjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVJZHgsIDAsIDApKTsKKyAgICBOZXdNSXMucHVzaF9iYWNrKEJ1aWxkTUkoTUYsIERMLCBnZXQoUFBDOjpMVlgpLERlc3RSZWcpLmFkZFJlZyhQUEM6OlIwKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhQUEM6OlIwKSk7CisgIH0gZWxzZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biByZWdjbGFzcyEiKTsKKyAgfQorfQorCit2b2lkCitQUENJbnN0ckluZm86OmxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIDQ+IE5ld01JczsKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisgIExvYWRSZWdGcm9tU3RhY2tTbG90KE1GLCBETCwgRGVzdFJlZywgRnJhbWVJZHgsIFJDLCBOZXdNSXMpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3TUlzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgTUJCLmluc2VydChNSSwgTmV3TUlzW2ldKTsKKworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICZNRkkgPSAqTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8gPQorICAgIE1GLmdldE1hY2hpbmVNZW1PcGVyYW5kKFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKEZyYW1lSWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Mb2FkLCAvKk9mZnNldD0qLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZJLmdldE9iamVjdFNpemUoRnJhbWVJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RBbGlnbm1lbnQoRnJhbWVJZHgpKTsKKyAgTmV3TUlzLmJhY2soKS0+YWRkTWVtT3BlcmFuZChNRiwgTU1PKTsKK30KKworTWFjaGluZUluc3RyKgorUFBDSW5zdHJJbmZvOjplbWl0RnJhbWVJbmRleERlYnVnVmFsdWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGcmFtZUl4LCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKk1EUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0IHsKKyAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKE1GLCBETCwgZ2V0KFBQQzo6REJHX1ZBTFVFKSk7CisgIGFkZEZyYW1lUmVmZXJlbmNlKE1JQiwgRnJhbWVJeCwgMCwgZmFsc2UpLmFkZEltbShPZmZzZXQpLmFkZE1ldGFkYXRhKE1EUHRyKTsKKyAgcmV0dXJuICYqTUlCOworfQorCitib29sIFBQQ0luc3RySW5mbzo6CitSZXZlcnNlQnJhbmNoQ29uZGl0aW9uKFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQpIGNvbnN0IHsKKyAgYXNzZXJ0KENvbmQuc2l6ZSgpID09IDIgJiYgIkludmFsaWQgUFBDIGJyYW5jaCBvcGNvZGUhIik7CisgIC8vIExlYXZlIHRoZSBDUiMgdGhlIHNhbWUsIGJ1dCBpbnZlcnQgdGhlIGNvbmRpdGlvbi4KKyAgQ29uZFswXS5zZXRJbW0oUFBDOjpJbnZlcnRQcmVkaWNhdGUoKFBQQzo6UHJlZGljYXRlKUNvbmRbMF0uZ2V0SW1tKCkpKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gR2V0SW5zdFNpemUgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBjb2RlIHRoZSBzcGVjaWZpZWQKKy8vLyBpbnN0cnVjdGlvbiBtYXkgYmUuICBUaGlzIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzLgorLy8vCit1bnNpZ25lZCBQUENJbnN0ckluZm86OkdldEluc3RTaXplSW5CeXRlcyhjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdCB7CisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGNhc2UgUFBDOjpJTkxJTkVBU006IHsgICAgICAgLy8gSW5saW5lIEFzbTogVmFyaWFibGUgc2l6ZS4KKyAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICBjb25zdCBjaGFyICpBc21TdHIgPSBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRTeW1ib2xOYW1lKCk7CisgICAgcmV0dXJuIGdldElubGluZUFzbUxlbmd0aChBc21TdHIsICpNRi0+Z2V0VGFyZ2V0KCkuZ2V0TUNBc21JbmZvKCkpOworICB9CisgIGNhc2UgUFBDOjpQUk9MT0dfTEFCRUw6CisgIGNhc2UgUFBDOjpFSF9MQUJFTDoKKyAgY2FzZSBQUEM6OkdDX0xBQkVMOgorICBjYXNlIFBQQzo6REJHX1ZBTFVFOgorICAgIHJldHVybiAwOworICBkZWZhdWx0OgorICAgIHJldHVybiA0OyAvLyBQb3dlclBDIGluc3RydWN0aW9ucyBhcmUgYWxsIDQgYnl0ZXMKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0luc3RySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ0luc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjN2I3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSW5zdHJJbmZvLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8vPT09LSBQUENJbnN0ckluZm8uaCAtIFBvd2VyUEMgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQb3dlclBDIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQT1dFUlBDMzJfSU5TVFJVQ1RJT05JTkZPX0gKKyNkZWZpbmUgUE9XRVJQQzMyX0lOU1RSVUNUSU9OSU5GT19ICisKKyNpbmNsdWRlICJQUEMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJQUENSZWdpc3RlckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUFBDSUkgLSBUaGlzIG5hbWVzcGFjZSBob2xkcyBhbGwgb2YgdGhlIFBvd2VyUEMgdGFyZ2V0LXNwZWNpZmljCisvLy8gcGVyLWluc3RydWN0aW9uIGZsYWdzLiAgVGhlc2UgbXVzdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9ucyBpbgorLy8vIFBQQy50ZCBhbmQgUFBDSW5zdHJGb3JtYXRzLnRkLgorbmFtZXNwYWNlIFBQQ0lJIHsKK2VudW0geworICAvLyBQUEM5NzAgSW5zdHJ1Y3Rpb24gRmxhZ3MuICBUaGVzZSBmbGFncyBkZXNjcmliZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZQorICAvLyBQb3dlclBDIDk3MCAoYWthIEc1KSBkaXNwYXRjaCBncm91cHMgYW5kIGhvdyB0aGV5IGFyZSBmb3JtZWQgb3V0IG9mCisgIC8vIHJhdyBtYWNoaW5lIGluc3RydWN0aW9ucy4KKworICAvLy8gUFBDOTcwX0ZpcnN0IC0gVGhpcyBpbnN0cnVjdGlvbiBzdGFydHMgYSBuZXcgZGlzcGF0Y2ggZ3JvdXAsIHNvIGl0IHdpbGwKKyAgLy8vIGFsd2F5cyBiZSB0aGUgZmlyc3Qgb25lIGluIHRoZSBncm91cC4KKyAgUFBDOTcwX0ZpcnN0ID0gMHgxLAorICAKKyAgLy8vIFBQQzk3MF9TaW5nbGUgLSBUaGlzIGluc3RydWN0aW9uIHN0YXJ0cyBhIG5ldyBkaXNwYXRjaCBncm91cCBhbmQKKyAgLy8vIHRlcm1pbmF0ZXMgaXQsIHNvIGl0IHdpbGwgYmUgdGhlIHNvbGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGdyb3VwLgorICBQUEM5NzBfU2luZ2xlID0gMHgyLAorCisgIC8vLyBQUEM5NzBfQ3JhY2tlZCAtIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgY3JhY2tlZCBpbnRvIHR3byBwaWVjZXMsIHJlcXVpcmluZworICAvLy8gdHdvIGRpc3BhdGNoIHBpcGVzIHRvIGJlIGF2YWlsYWJsZSB0byBpc3N1ZS4KKyAgUFBDOTcwX0NyYWNrZWQgPSAweDQsCisgIAorICAvLy8gUFBDOTcwX01hc2svU2hpZnQgLSBUaGlzIGlzIGEgYml0bWFzayB0aGF0IHNlbGVjdHMgdGhlIHBpcGVsaW5lIHR5cGUgdGhhdAorICAvLy8gYW4gaW5zdHJ1Y3Rpb24gaXMgaXNzdWVkIHRvLgorICBQUEM5NzBfU2hpZnQgPSAzLAorICBQUEM5NzBfTWFzayA9IDB4MDcgPDwgUFBDOTcwX1NoaWZ0Cit9OworZW51bSBQUEM5NzBfVW5pdCB7CisgIC8vLyBUaGVzZSBhcmUgdGhlIHZhcmlvdXMgUFBDOTcwIGV4ZWN1dGlvbiB1bml0IHBpcGVsaW5lcy4gIEVhY2ggaW5zdHJ1Y3Rpb24KKyAgLy8vIGlzIG9uZSBvZiB0aGVzZS4KKyAgUFBDOTcwX1BzZXVkbyA9IDAgPDwgUFBDOTcwX1NoaWZ0LCAgIC8vIFBzZXVkbyBpbnN0cnVjdGlvbgorICBQUEM5NzBfRlhVICAgID0gMSA8PCBQUEM5NzBfU2hpZnQsICAgLy8gRml4ZWQgUG9pbnQgKGFrYSBJbnRlZ2VyL0FMVSkgVW5pdAorICBQUEM5NzBfTFNVICAgID0gMiA8PCBQUEM5NzBfU2hpZnQsICAgLy8gTG9hZCBTdG9yZSBVbml0CisgIFBQQzk3MF9GUFUgICAgPSAzIDw8IFBQQzk3MF9TaGlmdCwgICAvLyBGbG9hdGluZyBQb2ludCBVbml0CisgIFBQQzk3MF9DUlUgICAgPSA0IDw8IFBQQzk3MF9TaGlmdCwgICAvLyBDb250cm9sIFJlZ2lzdGVyIFVuaXQKKyAgUFBDOTcwX1ZBTFUgICA9IDUgPDwgUFBDOTcwX1NoaWZ0LCAgIC8vIFZlY3RvciBBTFUKKyAgUFBDOTcwX1ZQRVJNICA9IDYgPDwgUFBDOTcwX1NoaWZ0LCAgIC8vIFZlY3RvciBQZXJtdXRlIFVuaXQKKyAgUFBDOTcwX0JSVSAgICA9IDcgPDwgUFBDOTcwX1NoaWZ0ICAgIC8vIEJyYW5jaCBVbml0Cit9OworfQorICAKKyAgCitjbGFzcyBQUENJbnN0ckluZm8gOiBwdWJsaWMgVGFyZ2V0SW5zdHJJbmZvSW1wbCB7CisgIFBQQ1RhcmdldE1hY2hpbmUgJlRNOworICBjb25zdCBQUENSZWdpc3RlckluZm8gUkk7CisKKyAgYm9vbCBTdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLCBpbnQgRnJhbWVJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAmTmV3TUlzKSBjb25zdDsKKyAgdm9pZCBMb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lRnVuY3Rpb24gJk1GLCBEZWJ1Z0xvYyBETCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAmTmV3TUlzKSBjb25zdDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUFBDSW5zdHJJbmZvKFBQQ1RhcmdldE1hY2hpbmUgJlRNKTsKKworICAvLy8gZ2V0UmVnaXN0ZXJJbmZvIC0gVGFyZ2V0SW5zdHJJbmZvIGlzIGEgc3VwZXJzZXQgb2YgTVJlZ2lzdGVyIGluZm8uICBBcworICAvLy8gc3VjaCwgd2hlbmV2ZXIgYSBjbGllbnQgaGFzIGFuIGluc3RhbmNlIG9mIGluc3RydWN0aW9uIGluZm8sIGl0IHNob3VsZAorICAvLy8gYWx3YXlzIGJlIGFibGUgdG8gZ2V0IHJlZ2lzdGVyIGluZm8gYXMgd2VsbCAodGhyb3VnaCB0aGlzIG1ldGhvZCkuCisgIC8vLworICB2aXJ0dWFsIGNvbnN0IFBQQ1JlZ2lzdGVySW5mbyAmZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeyByZXR1cm4gUkk7IH0KKworICB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdDsKKyAgdW5zaWduZWQgaXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworCisgIC8vIGNvbW11dGVJbnN0cnVjdGlvbiAtIFdlIGNhbiBjb21tdXRlIHJsd2ltaSBpbnN0cnVjdGlvbnMsIGJ1dCBvbmx5IGlmIHRoZQorICAvLyByb3RhdGUgYW10IGlzIHplcm8uICBXZSBhbHNvIGhhdmUgdG8gbXVuZ2UgdGhlIGltbWVkaWF0ZXMgYSBiaXQuCisgIHZpcnR1YWwgTWFjaGluZUluc3RyICpjb21tdXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwgYm9vbCBOZXdNSSkgY29uc3Q7CisgIAorICB2aXJ0dWFsIHZvaWQgaW5zZXJ0Tm9vcChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JKSBjb25zdDsKKworCisgIC8vIEJyYW5jaCBhbmFseXNpcy4KKyAgdmlydHVhbCBib29sIEFuYWx5emVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKiZUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TW9kaWZ5KSBjb25zdDsKKyAgdmlydHVhbCB1bnNpZ25lZCBSZW1vdmVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIGNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0OworICAKKyAgdmlydHVhbCB2b2lkIHN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworICAKKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgKmVtaXRGcmFtZUluZGV4RGVidWdWYWx1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGcmFtZUl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKk1EUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdDsKKworICB2aXJ0dWFsCisgIGJvb2wgUmV2ZXJzZUJyYW5jaENvbmRpdGlvbihTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kKSBjb25zdDsKKyAgCisgIC8vLyBHZXRJbnN0U2l6ZSAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGNvZGUgdGhlIHNwZWNpZmllZAorICAvLy8gaW5zdHJ1Y3Rpb24gbWF5IGJlLiAgVGhpcyByZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcy4KKyAgLy8vCisgIHZpcnR1YWwgdW5zaWduZWQgR2V0SW5zdFNpemVJbkJ5dGVzKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0OworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENJbnN0ckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSW5zdHJJbmZvLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZTM0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSW5zdHJJbmZvLnRkCkBAIC0wLDAgKzEsMTQ5MCBAQAorLy89PT0tIFBQQ0luc3RySW5mby50ZCAtIFRoZSBQb3dlclBDIEluc3RydWN0aW9uIFNldCAtLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHN1YnNldCBvZiB0aGUgMzItYml0IFBvd2VyUEMgaW5zdHJ1Y3Rpb24gc2V0LCBhcyB1c2VkDQorLy8gYnkgdGhlIFBvd2VyUEMgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIlBQQ0luc3RyRm9ybWF0cy50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFBvd2VyUEMgc3BlY2lmaWMgdHlwZSBjb25zdHJhaW50cy4NCisvLw0KK2RlZiBTRFRfUFBDc3RmaXd4IDogU0RUeXBlUHJvZmlsZTwwLCAyLCBbIC8vIHN0Zml3eA0KKyAgU0RUQ2lzVlQ8MCwgZjY0PiwgU0RUQ2lzUHRyVHk8MT4NCitdPjsNCitkZWYgU0RUX1BQQ0NhbGxTZXFTdGFydCA6IFNEQ2FsbFNlcVN0YXJ0PFsgU0RUQ2lzVlQ8MCwgaTMyPiBdPjsNCitkZWYgU0RUX1BQQ0NhbGxTZXFFbmQgICA6IFNEQ2FsbFNlcUVuZDxbIFNEVENpc1ZUPDAsIGkzMj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwxLCBpMzI+IF0+Ow0KK2RlZiBTRFRfUFBDdnBlcm0gICA6IFNEVHlwZVByb2ZpbGU8MSwgMywgWw0KKyAgU0RUQ2lzVlQ8MywgdjE2aTg+LCBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1NhbWVBczwwLCAyPg0KK10+Ow0KKw0KK2RlZiBTRFRfUFBDdmNtcCA6IFNEVHlwZVByb2ZpbGU8MSwgMywgWw0KKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNTYW1lQXM8MSwgMj4sIFNEVENpc1ZUPDMsIGkzMj4NCitdPjsNCisNCitkZWYgU0RUX1BQQ2NvbmRiciA6IFNEVHlwZVByb2ZpbGU8MCwgMywgWw0KKyAgU0RUQ2lzVlQ8MCwgaTMyPiwgU0RUQ2lzVlQ8MiwgT3RoZXJWVD4NCitdPjsNCisNCitkZWYgU0RUX1BQQ2xicnggOiBTRFR5cGVQcm9maWxlPDEsIDIsIFsNCisgIFNEVENpc1ZUPDAsIGkzMj4sIFNEVENpc1B0clR5PDE+LCBTRFRDaXNWVDwyLCBPdGhlclZUPg0KK10+Ow0KK2RlZiBTRFRfUFBDc3RicnggOiBTRFR5cGVQcm9maWxlPDAsIDMsIFsNCisgIFNEVENpc1ZUPDAsIGkzMj4sIFNEVENpc1B0clR5PDE+LCBTRFRDaXNWVDwyLCBPdGhlclZUPg0KK10+Ow0KKw0KK2RlZiBTRFRfUFBDbGFyeCA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWw0KKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNQdHJUeTwxPg0KK10+Ow0KK2RlZiBTRFRfUFBDc3RjeCA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgWw0KKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNQdHJUeTwxPg0KK10+Ow0KKw0KK2RlZiBTRFRfUFBDVENfcmV0IDogU0RUeXBlUHJvZmlsZTwwLCAyLCBbDQorICBTRFRDaXNQdHJUeTwwPiwgU0RUQ2lzVlQ8MSwgaTMyPg0KK10+Ow0KKw0KK2RlZiBTRFRfUFBDbm9wIDogU0RUeXBlUHJvZmlsZTwwLCAwLCBbXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBQb3dlclBDIHNwZWNpZmljIERBRyBOb2Rlcy4NCisvLw0KKw0KK2RlZiBQUENmY2ZpZCAgOiBTRE5vZGU8IlBQQ0lTRDo6RkNGSUQiICwgU0RURlBVbmFyeU9wLCBbXT47DQorZGVmIFBQQ2ZjdGlkeiA6IFNETm9kZTwiUFBDSVNEOjpGQ1RJRFoiLCBTRFRGUFVuYXJ5T3AsIFtdPjsNCitkZWYgUFBDZmN0aXd6IDogU0ROb2RlPCJQUENJU0Q6OkZDVElXWiIsIFNEVEZQVW5hcnlPcCwgW10+Ow0KK2RlZiBQUENzdGZpd3ggOiBTRE5vZGU8IlBQQ0lTRDo6U1RGSVdYIiwgU0RUX1BQQ3N0Zml3eCwNCisgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZV0+Ow0KKw0KKy8vIFRoaXMgc2VxdWVuY2UgaXMgdXNlZCBmb3IgbG9uZyBkb3VibGUtPmludCBjb252ZXJzaW9ucy4gIEl0IGNoYW5nZXMgdGhlDQorLy8gYml0cyBpbiB0aGUgRlBTQ1Igd2hpY2ggaXMgbm90IG1vZGVsbGVkLiAgDQorZGVmIFBQQ21mZnMgICA6IFNETm9kZTwiUFBDSVNEOjpNRkZTIiwgU0RUeXBlUHJvZmlsZTwxLCAwLCBbU0RUQ2lzVlQ8MCwgZjY0Pl0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QT3V0RmxhZ10+Ow0KK2RlZiBQUENtdGZzYjAgOiBTRE5vZGU8IlBQQ0lTRDo6TVRGU0IwIiwgU0RUeXBlUHJvZmlsZTwwLCAxLCBbU0RUQ2lzSW50PDA+XT4sDQorICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEluRmxhZywgU0ROUE91dEZsYWddPjsNCitkZWYgUFBDbXRmc2IxIDogU0ROb2RlPCJQUENJU0Q6Ok1URlNCMSIsIFNEVHlwZVByb2ZpbGU8MCwgMSwgW1NEVENpc0ludDwwPl0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgW1NETlBJbkZsYWcsIFNETlBPdXRGbGFnXT47DQorZGVmIFBQQ2ZhZGRydHo6IFNETm9kZTwiUFBDSVNEOjpGQUREUlRaIiwgU0RURlBCaW5PcCwNCisgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSW5GbGFnLCBTRE5QT3V0RmxhZ10+Ow0KK2RlZiBQUENtdGZzZiAgOiBTRE5vZGU8IlBQQ0lTRDo6TVRGU0YiLCBTRFR5cGVQcm9maWxlPDEsIDMsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgW1NEVENpc1ZUPDAsIGY2ND4sIFNEVENpc0ludDwxPiwgU0RUQ2lzVlQ8MiwgZjY0PiwNCisgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwzLCBmNjQ+XT4sDQorICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEluRmxhZ10+Ow0KKw0KK2RlZiBQUENmc2VsICAgOiBTRE5vZGU8IlBQQ0lTRDo6RlNFTCIsICANCisgICAvLyBUeXBlIGNvbnN0cmFpbnQgZm9yIGZzZWwuDQorICAgU0RUeXBlUHJvZmlsZTwxLCAzLCBbU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNTYW1lQXM8MCwgMz4sIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc0ZQPDA+LCBTRFRDaXNWVDwxLCBmNjQ+XT4sIFtdPjsNCisNCitkZWYgUFBDaGkgICAgICAgOiBTRE5vZGU8IlBQQ0lTRDo6SGkiLCBTRFRJbnRCaW5PcCwgW10+Ow0KK2RlZiBQUENsbyAgICAgICA6IFNETm9kZTwiUFBDSVNEOjpMbyIsIFNEVEludEJpbk9wLCBbXT47DQorZGVmIFBQQ3RvY19lbnRyeTogU0ROb2RlPCJQUENJU0Q6OlRPQ19FTlRSWSIsIFNEVEludEJpbk9wLCBbU0ROUE1heUxvYWRdPjsNCitkZWYgUFBDdm1hZGRmcCAgOiBTRE5vZGU8IlBQQ0lTRDo6Vk1BRERGUCIsIFNEVEZQVGVybmFyeU9wLCBbXT47DQorZGVmIFBQQ3ZubXN1YmZwIDogU0ROb2RlPCJQUENJU0Q6OlZOTVNVQkZQIiwgU0RURlBUZXJuYXJ5T3AsIFtdPjsNCisNCitkZWYgUFBDdnBlcm0gICAgOiBTRE5vZGU8IlBQQ0lTRDo6VlBFUk0iLCBTRFRfUFBDdnBlcm0sIFtdPjsNCisNCisvLyBUaGVzZSBub2RlcyByZXByZXNlbnQgdGhlIDMyLWJpdCBQUEMgc2hpZnRzIHRoYXQgb3BlcmF0ZSBvbiA2LWJpdCBzaGlmdA0KKy8vIGFtb3VudHMuICBUaGVzZSBub2RlcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBtdWx0aS1wcmVjaXNpb24gc2hpZnQgY29kZS4NCitkZWYgUFBDc3JsICAgICAgICA6IFNETm9kZTwiUFBDSVNEOjpTUkwiICAgICAgICwgU0RUSW50U2hpZnRPcD47DQorZGVmIFBQQ3NyYSAgICAgICAgOiBTRE5vZGU8IlBQQ0lTRDo6U1JBIiAgICAgICAsIFNEVEludFNoaWZ0T3A+Ow0KK2RlZiBQUENzaGwgICAgICAgIDogU0ROb2RlPCJQUENJU0Q6OlNITCIgICAgICAgLCBTRFRJbnRTaGlmdE9wPjsNCisNCitkZWYgUFBDZXh0c3dfMzIgICA6IFNETm9kZTwiUFBDSVNEOjpFWFRTV18zMiIgICwgU0RUSW50VW5hcnlPcD47DQorZGVmIFBQQ3N0ZF8zMiAgICAgOiBTRE5vZGU8IlBQQ0lTRDo6U1REXzMyIiAgICAsIFNEVFN0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZV0+Ow0KKw0KKy8vIFRoZXNlIGFyZSB0YXJnZXQtaW5kZXBlbmRlbnQgbm9kZXMsIGJ1dCBoYXZlIHRhcmdldC1zcGVjaWZpYyBmb3JtYXRzLg0KK2RlZiBjYWxsc2VxX3N0YXJ0IDogU0ROb2RlPCJJU0Q6OkNBTExTRVFfU1RBUlQiLCBTRFRfUFBDQ2FsbFNlcVN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPdXRGbGFnXT47DQorZGVmIGNhbGxzZXFfZW5kICAgOiBTRE5vZGU8IklTRDo6Q0FMTFNFUV9FTkQiLCAgIFNEVF9QUENDYWxsU2VxRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWcsIFNETlBPdXRGbGFnXT47DQorDQorZGVmIFNEVF9QUENDYWxsICAgOiBTRFR5cGVQcm9maWxlPDAsIC0xLCBbU0RUQ2lzSW50PDA+XT47DQorZGVmIFBQQ2NhbGxfRGFyd2luIDogU0ROb2RlPCJQUENJU0Q6OkNBTExfRGFyd2luIiwgU0RUX1BQQ0NhbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWcsIFNETlBPdXRGbGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUFZhcmlhZGljXT47DQorZGVmIFBQQ2NhbGxfU1ZSNCAgOiBTRE5vZGU8IlBQQ0lTRDo6Q0FMTF9TVlI0IiwgU0RUX1BQQ0NhbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZywgU0ROUE91dEZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETlBWYXJpYWRpY10+Ow0KK2RlZiBQUENub3AgOiBTRE5vZGU8IlBQQ0lTRDo6Tk9QIiwgU0RUX1BQQ25vcCwgW1NETlBJbkZsYWcsIFNETlBPdXRGbGFnXT47DQorZGVmIFBQQ2xvYWQgICA6IFNETm9kZTwiUFBDSVNEOjpMT0FEIiwgU0RUeXBlUHJvZmlsZTwxLCAxLCBbXT4sDQorICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZ10+Ow0KK2RlZiBQUENsb2FkX3RvYyA6IFNETm9kZTwiUFBDSVNEOjpMT0FEX1RPQyIsIFNEVHlwZVByb2ZpbGU8MCwgMSwgW10+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUEluRmxhZywgU0ROUE91dEZsYWddPjsNCitkZWYgUFBDdG9jX3Jlc3RvcmUgOiBTRE5vZGU8IlBQQ0lTRDo6VE9DX1JFU1RPUkUiLCBTRFR5cGVQcm9maWxlPDAsIDAsIFtdPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUEluRmxhZywgU0ROUE91dEZsYWddPjsNCitkZWYgUFBDbXRjdHIgICAgICA6IFNETm9kZTwiUFBDSVNEOjpNVENUUiIsIFNEVF9QUENDYWxsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWcsIFNETlBPdXRGbGFnXT47DQorZGVmIFBQQ2JjdHJsX0RhcndpbiAgOiBTRE5vZGU8IlBQQ0lTRDo6QkNUUkxfRGFyd2luIiwgU0RUTm9uZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUFZhcmlhZGljXT47DQorDQorZGVmIFBQQ2JjdHJsX1NWUjQgIDogU0ROb2RlPCJQUENJU0Q6OkJDVFJMX1NWUjQiLCBTRFROb25lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETlBWYXJpYWRpY10+Ow0KKw0KK2RlZiByZXRmbGFnICAgICAgIDogU0ROb2RlPCJQUENJU0Q6OlJFVF9GTEFHIiwgU0RUTm9uZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QVmFyaWFkaWNdPjsNCisNCitkZWYgUFBDdGNfcmV0dXJuIDogU0ROb2RlPCJQUENJU0Q6OlRDX1JFVFVSTiIsIFNEVF9QUENUQ19yZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgIFNETlBPcHRJbkZsYWcsIFNETlBWYXJpYWRpY10+Ow0KKw0KK2RlZiBQUEN2Y21wICAgICAgIDogU0ROb2RlPCJQUENJU0Q6OlZDTVAiICwgU0RUX1BQQ3ZjbXAsIFtdPjsNCitkZWYgUFBDdmNtcF9vICAgICA6IFNETm9kZTwiUFBDSVNEOjpWQ01QbyIsIFNEVF9QUEN2Y21wLCBbU0ROUE91dEZsYWddPjsNCisNCitkZWYgUFBDY29uZGJyYW5jaCA6IFNETm9kZTwiUFBDSVNEOjpDT05EX0JSQU5DSCIsIFNEVF9QUENjb25kYnIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZ10+Ow0KKw0KK2RlZiBQUENsYnJ4ICAgICAgIDogU0ROb2RlPCJQUENJU0Q6OkxCUlgiLCBTRFRfUFBDbGJyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5TG9hZF0+Ow0KK2RlZiBQUENzdGJyeCAgICAgIDogU0ROb2RlPCJQUENJU0Q6OlNUQlJYIiwgU0RUX1BQQ3N0YnJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZV0+Ow0KKw0KKy8vIEluc3RydWN0aW9ucyB0byBzdXBwb3J0IGF0b21pYyBvcGVyYXRpb25zDQorZGVmIFBQQ2xhcnggICAgICA6IFNETm9kZTwiUFBDSVNEOjpMQVJYIiwgU0RUX1BQQ2xhcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5TG9hZF0+Ow0KK2RlZiBQUENzdGN4ICAgICAgOiBTRE5vZGU8IlBQQ0lTRDo6U1RDWCIsIFNEVF9QUENzdGN4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlXT47DQorDQorLy8gSW5zdHJ1Y3Rpb25zIHRvIHN1cHBvcnQgZHluYW1pYyBhbGxvY2EuDQorZGVmIFNEVER5bk9wICA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgW10+Ow0KK2RlZiBQUENkeW5hbGxvYyAgIDogU0ROb2RlPCJQUENJU0Q6OkRZTkFMTE9DIiwgU0RURHluT3AsIFtTRE5QSGFzQ2hhaW5dPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFBvd2VyUEMgc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGFuZCBwYXR0ZXJuIGZyYWdtZW50cy4NCisvLw0KKw0KK2RlZiBTSEwzMiA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiAzMSAtIGltbQ0KKyAgcmV0dXJuIGdldEkzMkltbSgzMSAtIE4tPmdldFpFeHRWYWx1ZSgpKTsNCit9XT47DQorDQorZGVmIFNSTDMyIDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IDMyIC0gaW1tDQorICByZXR1cm4gTi0+Z2V0WkV4dFZhbHVlKCkgPyBnZXRJMzJJbW0oMzIgLSBOLT5nZXRaRXh0VmFsdWUoKSkgOiBnZXRJMzJJbW0oMCk7DQorfV0+Ow0KKw0KK2RlZiBMTzE2IDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IGdldCB0aGUgbG93IDE2IGJpdHMuDQorICByZXR1cm4gZ2V0STMySW1tKCh1bnNpZ25lZCBzaG9ydClOLT5nZXRaRXh0VmFsdWUoKSk7DQorfV0+Ow0KKw0KK2RlZiBISTE2IDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IHNoaWZ0IHRoZSBpbW1lZGlhdGUgdmFsdWUgZG93biBpbnRvIHRoZSBsb3cgYml0cy4NCisgIHJldHVybiBnZXRJMzJJbW0oKHVuc2lnbmVkKU4tPmdldFpFeHRWYWx1ZSgpID4+IDE2KTsNCit9XT47DQorDQorZGVmIEhBMTYgOiBTRE5vZGVYRm9ybTxpbW0sIFt7DQorICAvLyBUcmFuc2Zvcm1hdGlvbiBmdW5jdGlvbjogc2hpZnQgdGhlIGltbWVkaWF0ZSB2YWx1ZSBkb3duIGludG8gdGhlIGxvdyBiaXRzLg0KKyAgc2lnbmVkIGludCBWYWwgPSBOLT5nZXRaRXh0VmFsdWUoKTsNCisgIHJldHVybiBnZXRJMzJJbW0oKFZhbCAtIChzaWduZWQgc2hvcnQpVmFsKSA+PiAxNik7DQorfV0+Ow0KK2RlZiBNQiA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiBnZXQgdGhlIHN0YXJ0IGJpdCBvZiBhIG1hc2sNCisgIHVuc2lnbmVkIG1iID0gMCwgbWU7DQorICAodm9pZClpc1J1bk9mT25lcygodW5zaWduZWQpTi0+Z2V0WkV4dFZhbHVlKCksIG1iLCBtZSk7DQorICByZXR1cm4gZ2V0STMySW1tKG1iKTsNCit9XT47DQorDQorZGVmIE1FIDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IGdldCB0aGUgZW5kIGJpdCBvZiBhIG1hc2sNCisgIHVuc2lnbmVkIG1iLCBtZSA9IDA7DQorICAodm9pZClpc1J1bk9mT25lcygodW5zaWduZWQpTi0+Z2V0WkV4dFZhbHVlKCksIG1iLCBtZSk7DQorICByZXR1cm4gZ2V0STMySW1tKG1lKTsNCit9XT47DQorZGVmIG1hc2tpbW0zMiA6IFBhdExlYWY8KGltbSksIFt7DQorICAvLyBtYXNrSW1tIHByZWRpY2F0ZSAtIFRydWUgaWYgaW1tZWRpYXRlIGlzIGEgcnVuIG9mIG9uZXMuDQorICB1bnNpZ25lZCBtYiwgbWU7DQorICBpZiAoTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gaXNSdW5PZk9uZXMoKHVuc2lnbmVkKU4tPmdldFpFeHRWYWx1ZSgpLCBtYiwgbWUpOw0KKyAgZWxzZQ0KKyAgICByZXR1cm4gZmFsc2U7DQorfV0+Ow0KKw0KK2RlZiBpbW1TRXh0MTYgIDogUGF0TGVhZjwoaW1tKSwgW3sNCisgIC8vIGltbVNFeHQxNiBwcmVkaWNhdGUgLSBUcnVlIGlmIHRoZSBpbW1lZGlhdGUgZml0cyBpbiBhIDE2LWJpdCBzaWduIGV4dGVuZGVkDQorICAvLyBmaWVsZC4gIFVzZWQgYnkgaW5zdHJ1Y3Rpb25zIGxpa2UgJ2FkZGknLg0KKyAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIChpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpID09IChzaG9ydClOLT5nZXRaRXh0VmFsdWUoKTsNCisgIGVsc2UNCisgICAgcmV0dXJuIChpbnQ2NF90KU4tPmdldFpFeHRWYWx1ZSgpID09IChzaG9ydClOLT5nZXRaRXh0VmFsdWUoKTsNCit9XT47DQorZGVmIGltbVpFeHQxNiAgOiBQYXRMZWFmPChpbW0pLCBbew0KKyAgLy8gaW1tWkV4dDE2IHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIGltbWVkaWF0ZSBmaXRzIGluIGEgMTYtYml0IHplcm8gZXh0ZW5kZWQNCisgIC8vIGZpZWxkLiAgVXNlZCBieSBpbnN0cnVjdGlvbnMgbGlrZSAnb3JpJy4NCisgIHJldHVybiAodWludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkgPT0gKHVuc2lnbmVkIHNob3J0KU4tPmdldFpFeHRWYWx1ZSgpOw0KK31dLCBMTzE2PjsNCisNCisvLyBpbW0xNlNoaWZ0ZWQqIC0gVGhlc2UgbWF0Y2ggaW1tZWRpYXRlcyB3aGVyZSB0aGUgbG93IDE2LWJpdHMgYXJlIHplcm8uICBUaGVyZQ0KKy8vIGFyZSB0d28gZm9ybXM6IGltbTE2U2hpZnRlZFNFeHQgYW5kIGltbTE2U2hpZnRlZFpFeHQuICBUaGVzZSB0d28gZm9ybXMgYXJlDQorLy8gaWRlbnRpY2FsIGluIDMyLWJpdCBtb2RlLCBidXQgaW4gNjQtYml0IG1vZGUsIHRoZXkgcmV0dXJuIHRydWUgaWYgdGhlDQorLy8gaW1tZWRpYXRlIGZpdHMgaW50byBhIHNpZ24vemVybyBleHRlbmRlZCAzMi1iaXQgaW1tZWRpYXRlICh3aXRoIHRoZSBsb3cgYml0cw0KKy8vIGNsZWFyKS4NCitkZWYgaW1tMTZTaGlmdGVkWkV4dCA6IFBhdExlYWY8KGltbSksIFt7DQorICAvLyBpbW0xNlNoaWZ0ZWRaRXh0IHByZWRpY2F0ZSAtIFRydWUgaWYgb25seSBiaXRzIGluIHRoZSB0b3AgMTYtYml0cyBvZiB0aGUNCisgIC8vIGltbWVkaWF0ZSBhcmUgc2V0LiAgVXNlZCBieSBpbnN0cnVjdGlvbnMgbGlrZSAneG9yaXMnLg0KKyAgcmV0dXJuIChOLT5nZXRaRXh0VmFsdWUoKSAmIH51aW50NjRfdCgweEZGRkYwMDAwKSkgPT0gMDsNCit9XSwgSEkxNj47DQorDQorZGVmIGltbTE2U2hpZnRlZFNFeHQgOiBQYXRMZWFmPChpbW0pLCBbew0KKyAgLy8gaW1tMTZTaGlmdGVkU0V4dCBwcmVkaWNhdGUgLSBUcnVlIGlmIG9ubHkgYml0cyBpbiB0aGUgdG9wIDE2LWJpdHMgb2YgdGhlDQorICAvLyBpbW1lZGlhdGUgYXJlIHNldC4gIFVzZWQgYnkgaW5zdHJ1Y3Rpb25zIGxpa2UgJ2FkZGlzJy4gIElkZW50aWNhbCB0byANCisgIC8vIGltbTE2U2hpZnRlZFpFeHQgaW4gMzItYml0IG1vZGUuDQorICBpZiAoTi0+Z2V0WkV4dFZhbHVlKCkgJiAweEZGRkYpIHJldHVybiBmYWxzZTsNCisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIpDQorICAgIHJldHVybiB0cnVlOw0KKyAgLy8gRm9yIDY0LWJpdCwgbWFrZSBzdXJlIGl0IGlzIHNleHQgcmlnaHQuDQorICByZXR1cm4gTi0+Z2V0WkV4dFZhbHVlKCkgPT0gKHVpbnQ2NF90KShpbnQpTi0+Z2V0WkV4dFZhbHVlKCk7DQorfV0sIEhJMTY+Ow0KKw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gUG93ZXJQQyBGbGFnIERlZmluaXRpb25zLg0KKw0KK2NsYXNzIGlzUFBDNjQgeyBiaXQgUFBDNjQgPSAxOyB9DQorY2xhc3MgaXNET1QgICB7DQorICBsaXN0PFJlZ2lzdGVyPiBEZWZzID0gW0NSMF07DQorICBiaXQgUkMgID0gMTsNCit9DQorDQorY2xhc3MgUmVnQ29uc3RyYWludDxzdHJpbmcgQz4gew0KKyAgc3RyaW5nIENvbnN0cmFpbnRzID0gQzsNCit9DQorY2xhc3MgTm9FbmNvZGU8c3RyaW5nIEU+IHsNCisgIHN0cmluZyBEaXNhYmxlRW5jb2RpbmcgPSBFOw0KK30NCisNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFBvd2VyUEMgT3BlcmFuZCBEZWZpbml0aW9ucy4NCisNCitkZWYgczVpbW0gICA6IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTNUltbU9wZXJhbmQiOw0KK30NCitkZWYgdTVpbW0gICA6IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRVNUltbU9wZXJhbmQiOw0KK30NCitkZWYgdTZpbW0gICA6IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRVNkltbU9wZXJhbmQiOw0KK30NCitkZWYgczE2aW1tICA6IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTMTZJbW1PcGVyYW5kIjsNCit9DQorZGVmIHUxNmltbSAgOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VTE2SW1tT3BlcmFuZCI7DQorfQ0KK2RlZiBzMTZpbW1YNCAgOiBPcGVyYW5kPGkzMj4geyAgIC8vIE11bHRpcGx5IGltbSBieSA0IGJlZm9yZSBwcmludGluZy4NCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFMxNlg0SW1tT3BlcmFuZCI7DQorfQ0KK2RlZiB0YXJnZXQgOiBPcGVyYW5kPE90aGVyVlQ+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludEJyYW5jaE9wZXJhbmQiOw0KK30NCitkZWYgY2FsbHRhcmdldCA6IE9wZXJhbmQ8aVBUUj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50Q2FsbE9wZXJhbmQiOw0KK30NCitkZWYgYWFkZHIgOiBPcGVyYW5kPGlQVFI+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludEFic0FkZHJPcGVyYW5kIjsNCit9DQorZGVmIHBpY2xhYmVsOiBPcGVyYW5kPGlQVFI+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFBJQ0xhYmVsIjsNCit9DQorZGVmIHN5bWJvbEhpOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50U3ltYm9sSGkiOw0KK30NCitkZWYgc3ltYm9sTG86IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTeW1ib2xMbyI7DQorfQ0KK2RlZiBjcmJpdG06IE9wZXJhbmQ8aTg+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludGNyYml0bSI7DQorfQ0KKy8vIEFkZHJlc3Mgb3BlcmFuZHMNCitkZWYgbWVtcmkgOiBPcGVyYW5kPGlQVFI+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludE1lbVJlZ0ltbSI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgaTMyaW1tOiRpbW0sIHB0cl9yYzokcmVnKTsNCit9DQorZGVmIG1lbXJyIDogT3BlcmFuZDxpUFRSPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRNZW1SZWdSZWciOw0KKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIHB0cl9yYywgcHRyX3JjKTsNCit9DQorZGVmIG1lbXJpeCA6IE9wZXJhbmQ8aVBUUj4geyAgIC8vIG1lbXJpIHdoZXJlIHRoZSBpbW0gaXMgc2hpZnRlZCAyIGJpdHMuDQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRNZW1SZWdJbW1TaGlmdGVkIjsNCisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBpMzJpbW06JGltbSwgcHRyX3JjOiRyZWcpOw0KK30NCitkZWYgdG9jZW50cnkgOiBPcGVyYW5kPGlQVFI+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFRPQ0VudHJ5TGFiZWwiOw0KKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIGkzMmltbTokaW1tKTsNCit9DQorDQorLy8gUG93ZXJQQyBQcmVkaWNhdGUgb3BlcmFuZC4gIDIwID0gKDA8PDUpfDIwID0gYWx3YXlzLCBDUjAgaXMgYSBkdW1teSByZWcNCisvLyB0aGF0IGRvZXNuJ3QgbWF0dGVyLg0KK2RlZiBwcmVkIDogUHJlZGljYXRlT3BlcmFuZDxPdGhlclZULCAob3BzIGltbSwgQ1JSQyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHMgKGkzMiAyMCksIChpMzIgemVyb19yZWcpKT4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UHJlZGljYXRlT3BlcmFuZCI7DQorfQ0KKw0KKy8vIERlZmluZSBQb3dlclBDIHNwZWNpZmljIGFkZHJlc3NpbmcgbW9kZS4NCitkZWYgaWFkZHIgIDogQ29tcGxleFBhdHRlcm48aVBUUiwgMiwgIlNlbGVjdEFkZHJJbW0iLCAgICBbXSwgW10+Ow0KK2RlZiB4YWRkciAgOiBDb21wbGV4UGF0dGVybjxpUFRSLCAyLCAiU2VsZWN0QWRkcklkeCIsICAgIFtdLCBbXT47DQorZGVmIHhvYWRkciA6IENvbXBsZXhQYXR0ZXJuPGlQVFIsIDIsICJTZWxlY3RBZGRySWR4T25seSIsW10sIFtdPjsNCitkZWYgaXhhZGRyIDogQ29tcGxleFBhdHRlcm48aVBUUiwgMiwgIlNlbGVjdEFkZHJJbW1TaGlmdCIsIFtdLCBbXT47IC8vICJzdGQiDQorDQorLy8vIFRoaXMgaXMganVzdCB0aGUgb2Zmc2V0IHBhcnQgb2YgaWFkZHIsIHVzZWQgZm9yIHByZWluYy4NCitkZWYgaWFkZHJvZmYgOiBDb21wbGV4UGF0dGVybjxpUFRSLCAxLCAiU2VsZWN0QWRkckltbU9mZnMiLCBbXSwgW10+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gUG93ZXJQQyBJbnN0cnVjdGlvbiBQcmVkaWNhdGUgRGVmaW5pdGlvbnMuDQorZGVmIEZQQ29udHJhY3Rpb25zIDogUHJlZGljYXRlPCIhTm9FeGNlc3NGUFByZWNpc2lvbiI+Ow0KK2RlZiBJbjMyQml0TW9kZSAgOiBQcmVkaWNhdGU8IiFQUENTdWJUYXJnZXQuaXNQUEM2NCgpIj47DQorZGVmIEluNjRCaXRNb2RlICA6IFByZWRpY2F0ZTwiUFBDU3ViVGFyZ2V0LmlzUFBDNjQoKSI+Ow0KKw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gUG93ZXJQQyBJbnN0cnVjdGlvbiBEZWZpbml0aW9ucy4NCisNCisvLyBQc2V1ZG8taW5zdHJ1Y3Rpb25zOg0KKw0KK2xldCBoYXNDdHJsRGVwID0gMSBpbiB7DQorbGV0IERlZnMgPSBbUjFdLCBVc2VzID0gW1IxXSBpbiB7DQorZGVmIEFESkNBTExTVEFDS0RPV04gOiBQc2V1ZG88KG91dHMpLCAoaW5zIHUxNmltbTokYW10KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH0gQURKQ0FMTFNUQUNLRE9XTiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhjYWxsc2VxX3N0YXJ0IHRpbW06JGFtdCldPjsNCitkZWYgQURKQ0FMTFNUQUNLVVAgICA6IFBzZXVkbzwob3V0cyksIChpbnMgdTE2aW1tOiRhbXQxLCB1MTZpbW06JGFtdDIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkezpjb21tZW50fSBBREpDQUxMU1RBQ0tVUCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhjYWxsc2VxX2VuZCB0aW1tOiRhbXQxLCB0aW1tOiRhbXQyKV0+Ow0KK30NCisNCitkZWYgVVBEQVRFX1ZSU0FWRSAgICA6IFBzZXVkbzwob3V0cyBHUFJDOiRyRCksIChpbnMgR1BSQzokclMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEVfVlJTQVZFICRyRCwgJHJTIiwgW10+Ow0KK30NCisNCitsZXQgRGVmcyA9IFtSMV0sIFVzZXMgPSBbUjFdIGluDQorZGVmIERZTkFMTE9DIDogUHNldWRvPChvdXRzIEdQUkM6JHJlc3VsdCksIChpbnMgR1BSQzokbmVnc2l6ZSwgbWVtcmk6JGZwc2kpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIiR7OmNvbW1lbnR9IERZTkFMTE9DICRyZXN1bHQsICRuZWdzaXplLCAkZnBzaSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFBDZHluYWxsb2MgR1BSQzokbmVnc2l6ZSwgaWFkZHI6JGZwc2kpKV0+Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICANCisvLyBTRUxFQ1RfQ0NfKiAtIFVzZWQgdG8gaW1wbGVtZW50IHRoZSBTRUxFQ1RfQ0MgREFHIG9wZXJhdGlvbi4gIEV4cGFuZGVkIGFmdGVyDQorLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGludG8gYSBicmFuY2ggc2VxdWVuY2UuDQorbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDEsICAgIC8vIEV4cGFuZGVkIGFmdGVyIGluc3RydWN0aW9uIHNlbGVjdGlvbi4NCisgICAgUFBDOTcwX1NpbmdsZSA9IDEgaW4gew0KKyAgZGVmIFNFTEVDVF9DQ19JNCA6IFBzZXVkbzwob3V0cyBHUFJDOiRkc3QpLCAoaW5zIENSUkM6JGNvbmQsIEdQUkM6JFQsIEdQUkM6JEYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyaW1tOiRCUk9QQyksICIkezpjb21tZW50fSBTRUxFQ1RfQ0MgUFNFVURPISIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+Ow0KKyAgZGVmIFNFTEVDVF9DQ19JOCA6IFBzZXVkbzwob3V0cyBHOFJDOiRkc3QpLCAoaW5zIENSUkM6JGNvbmQsIEc4UkM6JFQsIEc4UkM6JEYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyaW1tOiRCUk9QQyksICIkezpjb21tZW50fSBTRUxFQ1RfQ0MgUFNFVURPISIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+Ow0KKyAgZGVmIFNFTEVDVF9DQ19GNCAgOiBQc2V1ZG88KG91dHMgRjRSQzokZHN0KSwgKGlucyBDUlJDOiRjb25kLCBGNFJDOiRULCBGNFJDOiRGLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMmltbTokQlJPUEMpLCAiJHs6Y29tbWVudH0gU0VMRUNUX0NDIFBTRVVETyEiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsNCisgIGRlZiBTRUxFQ1RfQ0NfRjggIDogUHNldWRvPChvdXRzIEY4UkM6JGRzdCksIChpbnMgQ1JSQzokY29uZCwgRjhSQzokVCwgRjhSQzokRiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJpbW06JEJST1BDKSwgIiR7OmNvbW1lbnR9IFNFTEVDVF9DQyBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47DQorICBkZWYgU0VMRUNUX0NDX1ZSUkM6IFBzZXVkbzwob3V0cyBWUlJDOiRkc3QpLCAoaW5zIENSUkM6JGNvbmQsIFZSUkM6JFQsIFZSUkM6JEYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyaW1tOiRCUk9QQyksICIkezpjb21tZW50fSBTRUxFQ1RfQ0MgUFNFVURPISIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+Ow0KK30NCisNCisvLyBTUElMTF9DUiAtIEluZGljYXRlIHRoYXQgd2UncmUgZHVtcGluZyB0aGUgQ1IgcmVnaXN0ZXIsIHNvIHdlJ2xsIG5lZWQgdG8NCisvLyBzY2F2ZW5nZSBhIHJlZ2lzdGVyIGZvciBpdC4NCitkZWYgU1BJTExfQ1IgOiBQc2V1ZG88KG91dHMpLCAoaW5zIEdQUkM6JGNvbmQsIG1lbXJpOiRGKSwNCisgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH0gU1BJTExfQ1IgJGNvbmQgJEYiLCBbXT47DQorDQorbGV0IGlzVGVybWluYXRvciA9IDEsIGlzQmFycmllciA9IDEsIFBQQzk3MF9Vbml0ID0gNyBpbiB7DQorICBsZXQgaXNSZXR1cm4gPSAxLCBVc2VzID0gW0xSLCBSTV0gaW4NCisgICAgZGVmIEJMUiA6IFhMRm9ybV8yX2JyPDE5LCAxNiwgMCwgKG91dHMpLCAoaW5zIHByZWQ6JHApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImIke3A6Y2N9bHIgJHtwOnJlZ30iLCBCckIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyhyZXRmbGFnKV0+Ow0KKyAgbGV0IGlzQnJhbmNoID0gMSwgaXNJbmRpcmVjdEJyYW5jaCA9IDEsIFVzZXMgPSBbQ1RSXSBpbg0KKyAgICBkZWYgQkNUUiA6IFhMRm9ybV8yX2V4dDwxOSwgNTI4LCAyMCwgMCwgMCwgKG91dHMpLCAoaW5zKSwgImJjdHIiLCBCckIsIFtdPjsNCit9DQorDQorbGV0IERlZnMgPSBbTFJdIGluDQorICBkZWYgTW92ZVBDdG9MUiA6IFBzZXVkbzwob3V0cyksIChpbnMgcGljbGFiZWw6JGxhYmVsKSwgImJsICRsYWJlbCIsIFtdPiwNCisgICAgICAgICAgICAgICAgICAgUFBDOTcwX1VuaXRfQlJVOw0KKw0KK2xldCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGhhc0N0cmxEZXAgPSAxLCBQUEM5NzBfVW5pdCA9IDcgaW4gew0KKyAgbGV0IGlzQmFycmllciA9IDEgaW4gew0KKyAgZGVmIEIgICA6IElGb3JtPDE4LCAwLCAwLCAob3V0cyksIChpbnMgdGFyZ2V0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICJiICRkc3QiLCBCckIsDQorICAgICAgICAgICAgICAgICAgWyhiciBiYjokZHN0KV0+Ow0KKyAgfQ0KKw0KKyAgLy8gQkNDIHJlcHJlc2VudHMgYW4gYXJiaXRyYXJ5IGNvbmRpdGlvbmFsIGJyYW5jaCBvbiBhIHByZWRpY2F0ZS4NCisgIC8vIEZJWE1FOiBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBhIHBhdHRlcm4gZm9yIFBQQ2NvbmRicmFuY2gsIGJ1dCBjYW4ndCB1c2UNCisgIC8vIGEgdHdvLXZhbHVlIG9wZXJhbmQgd2hlcmUgYSBkYWcgbm9kZSBleHBlY3RzIHR3byBvcGVyYW5kcy4gOiggDQorICBkZWYgQkNDIDogQkZvcm08MTYsIDAsIDAsIChvdXRzKSwgKGlucyBwcmVkOiRjb25kLCB0YXJnZXQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgImIke2NvbmQ6Y2N9ICR7Y29uZDpyZWd9LCAkZHN0Ig0KKyAgICAgICAgICAgICAgICAgIC8qWyhQUENjb25kYnJhbmNoIENSUkM6JGNyUywgaW1tOiRvcGMsIGJiOiRkc3QpXSovPjsNCit9DQorDQorLy8gRGFyd2luIEFCSSBDYWxscy4NCitsZXQgaXNDYWxsID0gMSwgUFBDOTcwX1VuaXQgPSA3LCANCisgIC8vIEFsbCBjYWxscyBjbG9iYmVyIHRoZSBub24tY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4uLg0KKyAgRGVmcyA9IFtSMCxSMixSMyxSNCxSNSxSNixSNyxSOCxSOSxSMTAsUjExLFIxMiwNCisgICAgICAgICAgRjAsRjEsRjIsRjMsRjQsRjUsRjYsRjcsRjgsRjksRjEwLEYxMSxGMTIsRjEzLA0KKyAgICAgICAgICBWMCxWMSxWMixWMyxWNCxWNSxWNixWNyxWOCxWOSxWMTAsVjExLFYxMixWMTMsVjE0LFYxNSxWMTYsVjE3LFYxOCxWMTksDQorICAgICAgICAgIExSLENUUiwNCisgICAgICAgICAgQ1IwLENSMSxDUjUsQ1I2LENSNyxDQVJSWV0gaW4gew0KKyAgLy8gQ29udmVuaWVudCBhbGlhc2VzIGZvciBjYWxsIGluc3RydWN0aW9ucw0KKyAgbGV0IFVzZXMgPSBbUk1dIGluIHsNCisgICAgZGVmIEJMX0RhcndpbiAgOiBJRm9ybTwxOCwgMCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgY2FsbHRhcmdldDokZnVuYywgdmFyaWFibGVfb3BzKSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsICRmdW5jIiwgQnJCLCBbXT47ICAvLyBTZWUgUGF0IHBhdHRlcm5zIGJlbG93Lg0KKyAgICBkZWYgQkxBX0RhcndpbiA6IElGb3JtPDE4LCAxLCAxLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBhYWRkcjokZnVuYywgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJibGEgJGZ1bmMiLCBCckIsIFsoUFBDY2FsbF9EYXJ3aW4gKGkzMiBpbW06JGZ1bmMpKV0+Ow0KKyAgfQ0KKyAgbGV0IFVzZXMgPSBbQ1RSLCBSTV0gaW4gew0KKyAgICBkZWYgQkNUUkxfRGFyd2luIDogWExGb3JtXzJfZXh0PDE5LCA1MjgsIDIwLCAwLCAxLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiY3RybCIsIEJyQiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhQUENiY3RybF9EYXJ3aW4pXT4sIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KKyAgfQ0KK30NCisNCisvLyBTVlI0IEFCSSBDYWxscy4NCitsZXQgaXNDYWxsID0gMSwgUFBDOTcwX1VuaXQgPSA3LCANCisgIC8vIEFsbCBjYWxscyBjbG9iYmVyIHRoZSBub24tY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4uLg0KKyAgRGVmcyA9IFtSMCxSMyxSNCxSNSxSNixSNyxSOCxSOSxSMTAsUjExLFIxMiwNCisgICAgICAgICAgRjAsRjEsRjIsRjMsRjQsRjUsRjYsRjcsRjgsRjksRjEwLEYxMSxGMTIsRjEzLA0KKyAgICAgICAgICBWMCxWMSxWMixWMyxWNCxWNSxWNixWNyxWOCxWOSxWMTAsVjExLFYxMixWMTMsVjE0LFYxNSxWMTYsVjE3LFYxOCxWMTksDQorICAgICAgICAgIExSLENUUiwNCisgICAgICAgICAgQ1IwLENSMSxDUjUsQ1I2LENSNyxDQVJSWV0gaW4gew0KKyAgLy8gQ29udmVuaWVudCBhbGlhc2VzIGZvciBjYWxsIGluc3RydWN0aW9ucw0KKyAgbGV0IFVzZXMgPSBbUk1dIGluIHsNCisgICAgZGVmIEJMX1NWUjQgIDogSUZvcm08MTgsIDAsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGNhbGx0YXJnZXQ6JGZ1bmMsIHZhcmlhYmxlX29wcyksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJibCAkZnVuYyIsIEJyQiwgW10+OyAgLy8gU2VlIFBhdCBwYXR0ZXJucyBiZWxvdy4NCisgICAgZGVmIEJMQV9TVlI0IDogSUZvcm08MTgsIDEsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGFhZGRyOiRmdW5jLCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJibGEgJGZ1bmMiLCBCckIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhQUENjYWxsX1NWUjQgKGkzMiBpbW06JGZ1bmMpKV0+Ow0KKyAgfQ0KKyAgbGV0IFVzZXMgPSBbQ1RSLCBSTV0gaW4gew0KKyAgICBkZWYgQkNUUkxfU1ZSNCA6IFhMRm9ybV8yX2V4dDwxOSwgNTI4LCAyMCwgMCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJjdHJsIiwgQnJCLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhQUENiY3RybF9TVlI0KV0+LCBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCisgIH0NCit9DQorDQorDQorbGV0IGlzQ2FsbCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGlzUmV0dXJuID0gMSwgaXNCYXJyaWVyID0gMSwgVXNlcyA9IFtSTV0gaW4NCitkZWYgVENSRVRVUk5kaSA6UHNldWRvPCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBjYWxsdGFyZ2V0OiRkc3QsIGkzMmltbTokb2Zmc2V0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgIiNUQ19SRVRVUk5kICRkc3QgJG9mZnNldCIsDQorICAgICAgICAgICAgICAgICBbXT47DQorDQorDQorbGV0IGlzQ2FsbCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGlzUmV0dXJuID0gMSwgaXNCYXJyaWVyID0gMSwgVXNlcyA9IFtSTV0gaW4NCitkZWYgVENSRVRVUk5haSA6UHNldWRvPChvdXRzKSwgKGlucyBhYWRkcjokZnVuYywgaTMyaW1tOiRvZmZzZXQsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAiI1RDX1JFVFVSTmEgJGZ1bmMgJG9mZnNldCIsDQorICAgICAgICAgICAgICAgICBbKFBQQ3RjX3JldHVybiAoaTMyIGltbTokZnVuYyksIGltbTokb2Zmc2V0KV0+Ow0KKw0KK2xldCBpc0NhbGwgPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBpc1JldHVybiA9IDEsIGlzQmFycmllciA9IDEsIFVzZXMgPSBbUk1dIGluDQorZGVmIFRDUkVUVVJOcmkgOiBQc2V1ZG88KG91dHMpLCAoaW5zIENUUlJDOiRkc3QsIGkzMmltbTokb2Zmc2V0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgIiNUQ19SRVRVUk5yICRkc3QgJG9mZnNldCIsDQorICAgICAgICAgICAgICAgICBbXT47DQorDQorDQorbGV0IGlzVGVybWluYXRvciA9IDEsIGlzQmFycmllciA9IDEsIFBQQzk3MF9Vbml0ID0gNywgaXNCcmFuY2ggPSAxLA0KKyAgICBpc0luZGlyZWN0QnJhbmNoID0gMSwgaXNDYWxsID0gMSwgaXNSZXR1cm4gPSAxLCBVc2VzID0gW0NUUiwgUk1dICBpbg0KK2RlZiBUQUlMQkNUUiA6IFhMRm9ybV8yX2V4dDwxOSwgNTI4LCAyMCwgMCwgMCwgKG91dHMpLCAoaW5zKSwgImJjdHIiLCBCckIsIFtdPiwNCisgICAgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KKw0KKw0KKw0KK2xldCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGhhc0N0cmxEZXAgPSAxLCBQUEM5NzBfVW5pdCA9IDcsDQorICAgIGlzQmFycmllciA9IDEsIGlzQ2FsbCA9IDEsIGlzUmV0dXJuID0gMSwgVXNlcyA9IFtSTV0gaW4NCitkZWYgVEFJTEIgICA6IElGb3JtPDE4LCAwLCAwLCAob3V0cyksIChpbnMgY2FsbHRhcmdldDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAiYiAkZHN0IiwgQnJCLA0KKyAgICAgICAgICAgICAgICAgIFtdPjsNCisNCisNCitsZXQgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBoYXNDdHJsRGVwID0gMSwgUFBDOTcwX1VuaXQgPSA3LA0KKyAgICBpc0JhcnJpZXIgPSAxLCBpc0NhbGwgPSAxLCBpc1JldHVybiA9IDEsIFVzZXMgPSBbUk1dIGluDQorZGVmIFRBSUxCQSAgIDogSUZvcm08MTgsIDAsIDAsIChvdXRzKSwgKGlucyBhYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAiYmEgJGRzdCIsIEJyQiwNCisgICAgICAgICAgICAgICAgICBbXT47DQorDQorDQorLy8gRENCKiBpbnN0cnVjdGlvbnMuDQorZGVmIERDQkEgICA6IERDQl9Gb3JtPDc1OCwgMCwgKG91dHMpLCAoaW5zIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZGNiYSAkZHN0IiwgTGRTdERDQkYsIFsoaW50X3BwY19kY2JhIHhvYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX1NpbmdsZTsNCitkZWYgRENCRiAgIDogRENCX0Zvcm08ODYsIDAsIChvdXRzKSwgKGlucyBtZW1ycjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgImRjYmYgJGRzdCIsIExkU3REQ0JGLCBbKGludF9wcGNfZGNiZiB4b2FkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9TaW5nbGU7DQorZGVmIERDQkkgICA6IERDQl9Gb3JtPDQ3MCwgMCwgKG91dHMpLCAoaW5zIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZGNiaSAkZHN0IiwgTGRTdERDQkYsIFsoaW50X3BwY19kY2JpIHhvYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX1NpbmdsZTsNCitkZWYgRENCU1QgIDogRENCX0Zvcm08NTQsIDAsIChvdXRzKSwgKGlucyBtZW1ycjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgImRjYnN0ICRkc3QiLCBMZFN0RENCRiwgWyhpbnRfcHBjX2RjYnN0IHhvYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX1NpbmdsZTsNCitkZWYgRENCVCAgIDogRENCX0Zvcm08Mjc4LCAwLCAob3V0cyksIChpbnMgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICJkY2J0ICRkc3QiLCBMZFN0RENCRiwgWyhpbnRfcHBjX2RjYnQgeG9hZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfU2luZ2xlOw0KK2RlZiBEQ0JUU1QgOiBEQ0JfRm9ybTwyNDYsIDAsIChvdXRzKSwgKGlucyBtZW1ycjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgImRjYnRzdCAkZHN0IiwgTGRTdERDQkYsIFsoaW50X3BwY19kY2J0c3QgeG9hZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfU2luZ2xlOw0KK2RlZiBEQ0JaICAgOiBEQ0JfRm9ybTwxMDE0LCAwLCAob3V0cyksIChpbnMgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICJkY2J6ICRkc3QiLCBMZFN0RENCRiwgWyhpbnRfcHBjX2RjYnogeG9hZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfU2luZ2xlOw0KK2RlZiBEQ0JaTCAgOiBEQ0JfRm9ybTwxMDE0LCAxLCAob3V0cyksIChpbnMgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICJkY2J6bCAkZHN0IiwgTGRTdERDQkYsIFsoaW50X3BwY19kY2J6bCB4b2FkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9TaW5nbGU7DQorDQorLy8gQXRvbWljIG9wZXJhdGlvbnMNCitsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMSBpbiB7DQorICBsZXQgVXNlcyA9IFtDUjBdIGluIHsNCisgICAgZGVmIEFUT01JQ19MT0FEX0FERF9JOCA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9BRERfSTggUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX2xvYWRfYWRkXzggeG9hZGRyOiRwdHIsIEdQUkM6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfU1VCX0k4IDogUHNldWRvPA0KKyAgICAgIChvdXRzIEdQUkM6JGRzdCksIChpbnMgbWVtcnI6JHB0ciwgR1BSQzokaW5jciksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX1NVQl9JOCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfbG9hZF9zdWJfOCB4b2FkZHI6JHB0ciwgR1BSQzokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9BTkRfSTggOiBQc2V1ZG88DQorICAgICAgKG91dHMgR1BSQzokZHN0KSwgKGlucyBtZW1ycjokcHRyLCBHUFJDOiRpbmNyKSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfQU5EX0k4IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKGF0b21pY19sb2FkX2FuZF84IHhvYWRkcjokcHRyLCBHUFJDOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX09SX0k4IDogUHNldWRvPA0KKyAgICAgIChvdXRzIEdQUkM6JGRzdCksIChpbnMgbWVtcnI6JHB0ciwgR1BSQzokaW5jciksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX09SX0k4IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKGF0b21pY19sb2FkX29yXzggeG9hZGRyOiRwdHIsIEdQUkM6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfWE9SX0k4IDogUHNldWRvPA0KKyAgICAgIChvdXRzIEdQUkM6JGRzdCksIChpbnMgbWVtcnI6JHB0ciwgR1BSQzokaW5jciksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX1hPUl9JOCBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfbG9hZF94b3JfOCB4b2FkZHI6JHB0ciwgR1BSQzokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9OQU5EX0k4IDogUHNldWRvPA0KKyAgICAgIChvdXRzIEdQUkM6JGRzdCksIChpbnMgbWVtcnI6JHB0ciwgR1BSQzokaW5jciksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX05BTkRfSTggUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX2xvYWRfbmFuZF84IHhvYWRkcjokcHRyLCBHUFJDOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX0FERF9JMTYgOiBQc2V1ZG88DQorICAgICAgKG91dHMgR1BSQzokZHN0KSwgKGlucyBtZW1ycjokcHRyLCBHUFJDOiRpbmNyKSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfQUREX0kxNiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfbG9hZF9hZGRfMTYgeG9hZGRyOiRwdHIsIEdQUkM6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfU1VCX0kxNiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9TVUJfSTE2IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKGF0b21pY19sb2FkX3N1Yl8xNiB4b2FkZHI6JHB0ciwgR1BSQzokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9BTkRfSTE2IDogUHNldWRvPA0KKyAgICAgIChvdXRzIEdQUkM6JGRzdCksIChpbnMgbWVtcnI6JHB0ciwgR1BSQzokaW5jciksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX0FORF9JMTYgUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX2xvYWRfYW5kXzE2IHhvYWRkcjokcHRyLCBHUFJDOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX09SX0kxNiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9PUl9JMTYgUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX2xvYWRfb3JfMTYgeG9hZGRyOiRwdHIsIEdQUkM6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfWE9SX0kxNiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9YT1JfSTE2IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKGF0b21pY19sb2FkX3hvcl8xNiB4b2FkZHI6JHB0ciwgR1BSQzokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9OQU5EX0kxNiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9OQU5EX0kxNiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfbG9hZF9uYW5kXzE2IHhvYWRkcjokcHRyLCBHUFJDOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX0FERF9JMzIgOiBQc2V1ZG88DQorICAgICAgKG91dHMgR1BSQzokZHN0KSwgKGlucyBtZW1ycjokcHRyLCBHUFJDOiRpbmNyKSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0xPQURfQUREX0kzMiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfbG9hZF9hZGRfMzIgeG9hZGRyOiRwdHIsIEdQUkM6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfU1VCX0kzMiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9TVUJfSTMyIFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKGF0b21pY19sb2FkX3N1Yl8zMiB4b2FkZHI6JHB0ciwgR1BSQzokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9BTkRfSTMyIDogUHNldWRvPA0KKyAgICAgIChvdXRzIEdQUkM6JGRzdCksIChpbnMgbWVtcnI6JHB0ciwgR1BSQzokaW5jciksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19MT0FEX0FORF9JMzIgUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX2xvYWRfYW5kXzMyIHhvYWRkcjokcHRyLCBHUFJDOiRpbmNyKSldPjsNCisgICAgZGVmIEFUT01JQ19MT0FEX09SX0kzMiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9PUl9JMzIgUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX2xvYWRfb3JfMzIgeG9hZGRyOiRwdHIsIEdQUkM6JGluY3IpKV0+Ow0KKyAgICBkZWYgQVRPTUlDX0xPQURfWE9SX0kzMiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9YT1JfSTMyIFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKGF0b21pY19sb2FkX3hvcl8zMiB4b2FkZHI6JHB0ciwgR1BSQzokaW5jcikpXT47DQorICAgIGRlZiBBVE9NSUNfTE9BRF9OQU5EX0kzMiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JGluY3IpLA0KKyAgICAgICIkezpjb21tZW50fSBBVE9NSUNfTE9BRF9OQU5EX0kzMiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfbG9hZF9uYW5kXzMyIHhvYWRkcjokcHRyLCBHUFJDOiRpbmNyKSldPjsNCisNCisgICAgZGVmIEFUT01JQ19DTVBfU1dBUF9JOCA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JG9sZCwgR1BSQzokbmV3KSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX0NNUF9TV0FQX0k4IFBTRVVETyEiLA0KKyAgICAgIFsoc2V0IEdQUkM6JGRzdCwgDQorICAgICAgICAgICAgICAgICAgICAoYXRvbWljX2NtcF9zd2FwXzggeG9hZGRyOiRwdHIsIEdQUkM6JG9sZCwgR1BSQzokbmV3KSldPjsNCisgICAgZGVmIEFUT01JQ19DTVBfU1dBUF9JMTYgOiBQc2V1ZG88DQorICAgICAgKG91dHMgR1BSQzokZHN0KSwgKGlucyBtZW1ycjokcHRyLCBHUFJDOiRvbGQsIEdQUkM6JG5ldyksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19DTVBfU1dBUF9JMTYgUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCANCisgICAgICAgICAgICAgICAgICAgIChhdG9taWNfY21wX3N3YXBfMTYgeG9hZGRyOiRwdHIsIEdQUkM6JG9sZCwgR1BSQzokbmV3KSldPjsNCisgICAgZGVmIEFUT01JQ19DTVBfU1dBUF9JMzIgOiBQc2V1ZG88DQorICAgICAgKG91dHMgR1BSQzokZHN0KSwgKGlucyBtZW1ycjokcHRyLCBHUFJDOiRvbGQsIEdQUkM6JG5ldyksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19DTVBfU1dBUF9JMzIgUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCANCisgICAgICAgICAgICAgICAgICAgIChhdG9taWNfY21wX3N3YXBfMzIgeG9hZGRyOiRwdHIsIEdQUkM6JG9sZCwgR1BSQzokbmV3KSldPjsNCisNCisgICAgZGVmIEFUT01JQ19TV0FQX0k4IDogUHNldWRvPA0KKyAgICAgIChvdXRzIEdQUkM6JGRzdCksIChpbnMgbWVtcnI6JHB0ciwgR1BSQzokbmV3KSwNCisgICAgICAiJHs6Y29tbWVudH0gQVRPTUlDX1NXQVBfSTggUFNFVURPISIsDQorICAgICAgWyhzZXQgR1BSQzokZHN0LCAoYXRvbWljX3N3YXBfOCB4b2FkZHI6JHB0ciwgR1BSQzokbmV3KSldPjsNCisgICAgZGVmIEFUT01JQ19TV0FQX0kxNiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JG5ldyksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19TV0FQX0kxNiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfc3dhcF8xNiB4b2FkZHI6JHB0ciwgR1BSQzokbmV3KSldPjsNCisgICAgZGVmIEFUT01JQ19TV0FQX0kzMiA6IFBzZXVkbzwNCisgICAgICAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIG1lbXJyOiRwdHIsIEdQUkM6JG5ldyksDQorICAgICAgIiR7OmNvbW1lbnR9IEFUT01JQ19TV0FQX0kzMiBQU0VVRE8hIiwNCisgICAgICBbKHNldCBHUFJDOiRkc3QsIChhdG9taWNfc3dhcF8zMiB4b2FkZHI6JHB0ciwgR1BSQzokbmV3KSldPjsNCisgIH0NCit9DQorDQorLy8gSW5zdHJ1Y3Rpb25zIHRvIHN1cHBvcnQgYXRvbWljIG9wZXJhdGlvbnMNCitkZWYgTFdBUlggOiBYRm9ybV8xPDMxLCAgMjAsIChvdXRzIEdQUkM6JHJEKSwgKGlucyBtZW1ycjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImx3YXJ4ICRyRCwgJHNyYyIsIExkU3RMV0FSWCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckQsIChQUENsYXJ4IHhvYWRkcjokc3JjKSldPjsNCisNCitsZXQgRGVmcyA9IFtDUjBdIGluDQorZGVmIFNUV0NYIDogWEZvcm1fMTwzMSwgMTUwLCAob3V0cyksIChpbnMgR1BSQzokclMsIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic3R3Y3guICRyUywgJGRzdCIsIExkU3RTVFdDWCwNCisgICAgICAgICAgICAgICAgICAgWyhQUENzdGN4IEdQUkM6JHJTLCB4b2FkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgaXNET1Q7DQorDQorbGV0IGlzVGVybWluYXRvciA9IDEsIGlzQmFycmllciA9IDEsIGhhc0N0cmxEZXAgPSAxIGluDQorZGVmIFRSQVAgIDogWEZvcm1fMjQ8MzEsIDQsIChvdXRzKSwgKGlucyksICJ0cmFwIiwgTGRTdEdlbmVyYWwsIFsodHJhcCldPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFBQQzMyIExvYWQgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorDQorLy8gVW5pbmRleGVkIChyK2kpIExvYWRzLiANCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIFBQQzk3MF9Vbml0ID0gMiBpbiB7DQorZGVmIExCWiA6IERGb3JtXzE8MzQsIChvdXRzIEdQUkM6JHJEKSwgKGlucyBtZW1yaTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAibGJ6ICRyRCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJELCAoemV4dGxvYWRpOCBpYWRkcjokc3JjKSldPjsNCitkZWYgTEhBIDogREZvcm1fMTw0MiwgKG91dHMgR1BSQzokckQpLCAoaW5zIG1lbXJpOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJsaGEgJHJELCAkc3JjIiwgTGRTdExIQSwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyRCwgKHNleHRsb2FkaTE2IGlhZGRyOiRzcmMpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfQ3JhY2tlZDsNCitkZWYgTEhaIDogREZvcm1fMTw0MCwgKG91dHMgR1BSQzokckQpLCAoaW5zIG1lbXJpOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJsaHogJHJELCAkc3JjIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckQsICh6ZXh0bG9hZGkxNiBpYWRkcjokc3JjKSldPjsNCitkZWYgTFdaIDogREZvcm1fMTwzMiwgKG91dHMgR1BSQzokckQpLCAoaW5zIG1lbXJpOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJsd3ogJHJELCAkc3JjIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckQsIChsb2FkIGlhZGRyOiRzcmMpKV0+Ow0KKw0KK2RlZiBMRlMgOiBERm9ybV8xPDQ4LCAob3V0cyBGNFJDOiRyRCksIChpbnMgbWVtcmk6JHNyYyksDQorICAgICAgICAgICAgICAgICAgImxmcyAkckQsICRzcmMiLCBMZFN0TEZEVSwNCisgICAgICAgICAgICAgICAgICBbKHNldCBGNFJDOiRyRCwgKGxvYWQgaWFkZHI6JHNyYykpXT47DQorZGVmIExGRCA6IERGb3JtXzE8NTAsIChvdXRzIEY4UkM6JHJEKSwgKGlucyBtZW1yaTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAibGZkICRyRCwgJHNyYyIsIExkU3RMRkQsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokckQsIChsb2FkIGlhZGRyOiRzcmMpKV0+Ow0KKw0KKw0KKy8vIFVuaW5kZXhlZCAocitpKSBMb2FkcyB3aXRoIFVwZGF0ZSAocHJlaW5jKS4NCitsZXQgbWF5TG9hZCA9IDEgaW4gew0KK2RlZiBMQlpVIDogREZvcm1fMTwzNSwgKG91dHMgR1BSQzokckQsIHB0cl9yYzokZWFfcmVzdWx0KSwgKGlucyBtZW1yaTokYWRkciksDQorICAgICAgICAgICAgICAgICAgICJsYnp1ICRyRCwgJGFkZHIiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgW10+LCBSZWdDb25zdHJhaW50PCIkYWRkci5yZWcgPSAkZWFfcmVzdWx0Ij4sDQorICAgICAgICAgICAgICAgICAgIE5vRW5jb2RlPCIkZWFfcmVzdWx0Ij47DQorDQorZGVmIExIQVUgOiBERm9ybV8xPDQzLCAob3V0cyBHUFJDOiRyRCwgcHRyX3JjOiRlYV9yZXN1bHQpLCAoaW5zIG1lbXJpOiRhZGRyKSwNCisgICAgICAgICAgICAgICAgICAgImxoYXUgJHJELCAkYWRkciIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbXT4sIFJlZ0NvbnN0cmFpbnQ8IiRhZGRyLnJlZyA9ICRlYV9yZXN1bHQiPiwNCisgICAgICAgICAgICAgICAgICAgTm9FbmNvZGU8IiRlYV9yZXN1bHQiPjsNCisNCitkZWYgTEhaVSA6IERGb3JtXzE8NDEsIChvdXRzIEdQUkM6JHJELCBwdHJfcmM6JGVhX3Jlc3VsdCksIChpbnMgbWVtcmk6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICAibGh6dSAkckQsICRhZGRyIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgIFtdPiwgUmVnQ29uc3RyYWludDwiJGFkZHIucmVnID0gJGVhX3Jlc3VsdCI+LA0KKyAgICAgICAgICAgICAgICAgICBOb0VuY29kZTwiJGVhX3Jlc3VsdCI+Ow0KKw0KK2RlZiBMV1pVIDogREZvcm1fMTwzMywgKG91dHMgR1BSQzokckQsIHB0cl9yYzokZWFfcmVzdWx0KSwgKGlucyBtZW1yaTokYWRkciksDQorICAgICAgICAgICAgICAgICAgICJsd3p1ICRyRCwgJGFkZHIiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgW10+LCBSZWdDb25zdHJhaW50PCIkYWRkci5yZWcgPSAkZWFfcmVzdWx0Ij4sDQorICAgICAgICAgICAgICAgICAgIE5vRW5jb2RlPCIkZWFfcmVzdWx0Ij47DQorDQorZGVmIExGU1UgOiBERm9ybV8xPDQ5LCAob3V0cyBGNFJDOiRyRCwgcHRyX3JjOiRlYV9yZXN1bHQpLCAoaW5zIG1lbXJpOiRhZGRyKSwNCisgICAgICAgICAgICAgICAgICAibGZzICRyRCwgJGFkZHIiLCBMZFN0TEZEVSwNCisgICAgICAgICAgICAgICAgICBbXT4sIFJlZ0NvbnN0cmFpbnQ8IiRhZGRyLnJlZyA9ICRlYV9yZXN1bHQiPiwNCisgICAgICAgICAgICAgICAgICAgTm9FbmNvZGU8IiRlYV9yZXN1bHQiPjsNCisNCitkZWYgTEZEVSA6IERGb3JtXzE8NTEsIChvdXRzIEY4UkM6JHJELCBwdHJfcmM6JGVhX3Jlc3VsdCksIChpbnMgbWVtcmk6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICJsZmQgJHJELCAkYWRkciIsIExkU3RMRkQsDQorICAgICAgICAgICAgICAgICAgW10+LCBSZWdDb25zdHJhaW50PCIkYWRkci5yZWcgPSAkZWFfcmVzdWx0Ij4sDQorICAgICAgICAgICAgICAgICAgIE5vRW5jb2RlPCIkZWFfcmVzdWx0Ij47DQorfQ0KK30NCisNCisvLyBJbmRleGVkIChyK3IpIExvYWRzLg0KKy8vDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBQUEM5NzBfVW5pdCA9IDIgaW4gew0KK2RlZiBMQlpYIDogWEZvcm1fMTwzMSwgIDg3LCAob3V0cyBHUFJDOiRyRCksIChpbnMgbWVtcnI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJsYnp4ICRyRCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyRCwgKHpleHRsb2FkaTggeGFkZHI6JHNyYykpXT47DQorZGVmIExIQVggOiBYRm9ybV8xPDMxLCAzNDMsIChvdXRzIEdQUkM6JHJEKSwgKGlucyBtZW1ycjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImxoYXggJHJELCAkc3JjIiwgTGRTdExIQSwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckQsIChzZXh0bG9hZGkxNiB4YWRkcjokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KK2RlZiBMSFpYIDogWEZvcm1fMTwzMSwgMjc5LCAob3V0cyBHUFJDOiRyRCksIChpbnMgbWVtcnI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJsaHp4ICRyRCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyRCwgKHpleHRsb2FkaTE2IHhhZGRyOiRzcmMpKV0+Ow0KK2RlZiBMV1pYIDogWEZvcm1fMTwzMSwgIDIzLCAob3V0cyBHUFJDOiRyRCksIChpbnMgbWVtcnI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJsd3p4ICRyRCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyRCwgKGxvYWQgeGFkZHI6JHNyYykpXT47DQorICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICANCitkZWYgTEhCUlggOiBYRm9ybV8xPDMxLCA3OTAsIChvdXRzIEdQUkM6JHJEKSwgKGlucyBtZW1ycjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImxoYnJ4ICRyRCwgJHNyYyIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyRCwgKFBQQ2xicnggeG9hZGRyOiRzcmMsIGkxNikpXT47DQorZGVmIExXQlJYIDogWEZvcm1fMTwzMSwgIDUzNCwgKG91dHMgR1BSQzokckQpLCAoaW5zIG1lbXJyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibHdicnggJHJELCAkc3JjIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJELCAoUFBDbGJyeCB4b2FkZHI6JHNyYywgaTMyKSldPjsNCisNCitkZWYgTEZTWCAgIDogWEZvcm1fMjU8MzEsIDUzNSwgKG91dHMgRjRSQzokZnJEKSwgKGlucyBtZW1ycjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImxmc3ggJGZyRCwgJHNyYyIsIExkU3RMRkRVLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGNFJDOiRmckQsIChsb2FkIHhhZGRyOiRzcmMpKV0+Ow0KK2RlZiBMRkRYICAgOiBYRm9ybV8yNTwzMSwgNTk5LCAob3V0cyBGOFJDOiRmckQpLCAoaW5zIG1lbXJyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibGZkeCAkZnJELCAkc3JjIiwgTGRTdExGRFUsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JGZyRCwgKGxvYWQgeGFkZHI6JHNyYykpXT47DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gUFBDMzIgU3RvcmUgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorDQorLy8gVW5pbmRleGVkIChyK2kpIFN0b3Jlcy4NCitsZXQgUFBDOTcwX1VuaXQgPSAyIGluIHsNCitkZWYgU1RCICA6IERGb3JtXzE8MzgsIChvdXRzKSwgKGlucyBHUFJDOiRyUywgbWVtcmk6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJzdGIgJHJTLCAkc3JjIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWk4IEdQUkM6JHJTLCBpYWRkcjokc3JjKV0+Ow0KK2RlZiBTVEggIDogREZvcm1fMTw0NCwgKG91dHMpLCAoaW5zIEdQUkM6JHJTLCBtZW1yaTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgInN0aCAkclMsICRzcmMiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTE2IEdQUkM6JHJTLCBpYWRkcjokc3JjKV0+Ow0KK2RlZiBTVFcgIDogREZvcm1fMTwzNiwgKG91dHMpLCAoaW5zIEdQUkM6JHJTLCBtZW1yaTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgInN0dyAkclMsICRzcmMiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBHUFJDOiRyUywgaWFkZHI6JHNyYyldPjsNCitkZWYgU1RGUyA6IERGb3JtXzE8NTIsIChvdXRzKSwgKGlucyBGNFJDOiRyUywgbWVtcmk6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzdGZzICRyUywgJGRzdCIsIExkU3RVWCwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBGNFJDOiRyUywgaWFkZHI6JGRzdCldPjsNCitkZWYgU1RGRCA6IERGb3JtXzE8NTQsIChvdXRzKSwgKGlucyBGOFJDOiRyUywgbWVtcmk6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzdGZkICRyUywgJGRzdCIsIExkU3RVWCwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBGOFJDOiRyUywgaWFkZHI6JGRzdCldPjsNCit9DQorDQorLy8gVW5pbmRleGVkIChyK2kpIFN0b3JlcyB3aXRoIFVwZGF0ZSAocHJlaW5jKS4NCitsZXQgUFBDOTcwX1VuaXQgPSAyIGluIHsNCitkZWYgU1RCVSAgOiBERm9ybV8xPDM5LCAob3V0cyBwdHJfcmM6JGVhX3JlcyksIChpbnMgR1BSQzokclMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xMbzokcHRyb2ZmLCBwdHJfcmM6JHB0cnJlZyksDQorICAgICAgICAgICAgICAgICAgICAic3RidSAkclMsICRwdHJvZmYoJHB0cnJlZykiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IHB0cl9yYzokZWFfcmVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZV90cnVuY3N0aTggR1BSQzokclMsIHB0cl9yYzokcHRycmVnLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhZGRyb2ZmOiRwdHJvZmYpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJHB0cnJlZyA9ICRlYV9yZXMiPiwgTm9FbmNvZGU8IiRlYV9yZXMiPjsNCitkZWYgU1RIVSAgOiBERm9ybV8xPDQ1LCAob3V0cyBwdHJfcmM6JGVhX3JlcyksIChpbnMgR1BSQzokclMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xMbzokcHRyb2ZmLCBwdHJfcmM6JHB0cnJlZyksDQorICAgICAgICAgICAgICAgICAgICAic3RodSAkclMsICRwdHJvZmYoJHB0cnJlZykiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IHB0cl9yYzokZWFfcmVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChwcmVfdHJ1bmNzdGkxNiBHUFJDOiRyUywgcHRyX3JjOiRwdHJyZWcsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYWRkcm9mZjokcHRyb2ZmKSldPiwNCisgICAgICAgICAgICAgICAgICAgIFJlZ0NvbnN0cmFpbnQ8IiRwdHJyZWcgPSAkZWFfcmVzIj4sIE5vRW5jb2RlPCIkZWFfcmVzIj47DQorZGVmIFNUV1UgIDogREZvcm1fMTwzNywgKG91dHMgcHRyX3JjOiRlYV9yZXMpLCAoaW5zIEdQUkM6JHJTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sTG86JHB0cm9mZiwgcHRyX3JjOiRwdHJyZWcpLA0KKyAgICAgICAgICAgICAgICAgICAgInN0d3UgJHJTLCAkcHRyb2ZmKCRwdHJyZWcpIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBwdHJfcmM6JGVhX3JlcywgKHByZV9zdG9yZSBHUFJDOiRyUywgcHRyX3JjOiRwdHJyZWcsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWFkZHJvZmY6JHB0cm9mZikpXT4sDQorICAgICAgICAgICAgICAgICAgICBSZWdDb25zdHJhaW50PCIkcHRycmVnID0gJGVhX3JlcyI+LCBOb0VuY29kZTwiJGVhX3JlcyI+Ow0KK2RlZiBTVEZTVSA6IERGb3JtXzE8MzcsIChvdXRzIHB0cl9yYzokZWFfcmVzKSwgKGlucyBGNFJDOiRyUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbExvOiRwdHJvZmYsIHB0cl9yYzokcHRycmVnKSwNCisgICAgICAgICAgICAgICAgICAgICJzdGZzdSAkclMsICRwdHJvZmYoJHB0cnJlZykiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IHB0cl9yYzokZWFfcmVzLCAocHJlX3N0b3JlIEY0UkM6JHJTLCAgcHRyX3JjOiRwdHJyZWcsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhZGRyb2ZmOiRwdHJvZmYpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJHB0cnJlZyA9ICRlYV9yZXMiPiwgTm9FbmNvZGU8IiRlYV9yZXMiPjsNCitkZWYgU1RGRFUgOiBERm9ybV8xPDM3LCAob3V0cyBwdHJfcmM6JGVhX3JlcyksIChpbnMgRjhSQzokclMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xMbzokcHRyb2ZmLCBwdHJfcmM6JHB0cnJlZyksDQorICAgICAgICAgICAgICAgICAgICAic3RmZHUgJHJTLCAkcHRyb2ZmKCRwdHJyZWcpIiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBwdHJfcmM6JGVhX3JlcywgKHByZV9zdG9yZSBGOFJDOiRyUywgcHRyX3JjOiRwdHJyZWcsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhZGRyb2ZmOiRwdHJvZmYpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVnQ29uc3RyYWludDwiJHB0cnJlZyA9ICRlYV9yZXMiPiwgTm9FbmNvZGU8IiRlYV9yZXMiPjsNCit9DQorDQorDQorLy8gSW5kZXhlZCAocityKSBTdG9yZXMuDQorLy8NCitsZXQgUFBDOTcwX1VuaXQgPSAyIGluIHsNCitkZWYgU1RCWCAgOiBYRm9ybV84PDMxLCAyMTUsIChvdXRzKSwgKGlucyBHUFJDOiRyUywgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzdGJ4ICRyUywgJGRzdCIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpOCBHUFJDOiRyUywgeGFkZHI6JGRzdCldPiwgDQorICAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfQ3JhY2tlZDsNCitkZWYgU1RIWCAgOiBYRm9ybV84PDMxLCA0MDcsIChvdXRzKSwgKGlucyBHUFJDOiRyUywgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzdGh4ICRyUywgJGRzdCIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpMTYgR1BSQzokclMsIHhhZGRyOiRkc3QpXT4sIA0KKyAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0NyYWNrZWQ7DQorZGVmIFNUV1ggIDogWEZvcm1fODwzMSwgMTUxLCAob3V0cyksIChpbnMgR1BSQzokclMsIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic3R3eCAkclMsICRkc3QiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBHUFJDOiRyUywgeGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KKyAgICAgICAgICAgICAgICAgICANCitsZXQgbWF5U3RvcmUgPSAxIGluIHsNCitkZWYgU1RXVVggOiBYRm9ybV84PDMxLCAxODMsIChvdXRzKSwgKGlucyBHUFJDOiRyUywgR1BSQzokckEsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgInN0d3V4ICRyUywgJHJBLCAkckIiLCBMZFN0R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgW10+Ow0KK30NCitkZWYgU1RIQlJYOiBYRm9ybV84PDMxLCA5MTgsIChvdXRzKSwgKGlucyBHUFJDOiRyUywgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzdGhicnggJHJTLCAkZHN0IiwgTGRTdEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgIFsoUFBDc3RicnggR1BSQzokclMsIHhvYWRkcjokZHN0LCBpMTYpXT4sIA0KKyAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0NyYWNrZWQ7DQorZGVmIFNUV0JSWDogWEZvcm1fODwzMSwgNjYyLCAob3V0cyksIChpbnMgR1BSQzokclMsIG1lbXJyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic3R3YnJ4ICRyUywgJGRzdCIsIExkU3RHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKFBQQ3N0YnJ4IEdQUkM6JHJTLCB4b2FkZHI6JGRzdCwgaTMyKV0+LA0KKyAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0NyYWNrZWQ7DQorDQorZGVmIFNURklXWDogWEZvcm1fMjg8MzEsIDk4MywgKG91dHMpLCAoaW5zIEY4UkM6JGZyUywgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgInN0Zml3eCAkZnJTLCAkZHN0IiwgTGRTdFVYLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoUFBDc3RmaXd4IEY4UkM6JGZyUywgeG9hZGRyOiRkc3QpXT47DQorICAgICAgICAgICAgICAgICAgICAgDQorZGVmIFNURlNYIDogWEZvcm1fMjg8MzEsIDY2MywgKG91dHMpLCAoaW5zIEY0UkM6JGZyUywgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgInN0ZnN4ICRmclMsICRkc3QiLCBMZFN0VVgsDQorICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBGNFJDOiRmclMsIHhhZGRyOiRkc3QpXT47DQorZGVmIFNURkRYIDogWEZvcm1fMjg8MzEsIDcyNywgKG91dHMpLCAoaW5zIEY4UkM6JGZyUywgbWVtcnI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgInN0ZmR4ICRmclMsICRkc3QiLCBMZFN0VVgsDQorICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBGOFJDOiRmclMsIHhhZGRyOiRkc3QpXT47DQorfQ0KKw0KK2RlZiBTWU5DIDogWEZvcm1fMjRfc3luYzwzMSwgNTk4LCAob3V0cyksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jIiwgTGRTdFN5bmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhpbnRfcHBjX3N5bmMpXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBQUEMzMiBBcml0aG1ldGljIEluc3RydWN0aW9ucy4NCisvLw0KKw0KK2xldCBQUEM5NzBfVW5pdCA9IDEgaW4geyAgLy8gRlhVIE9wZXJhdGlvbnMuDQorZGVmIEFEREkgICA6IERGb3JtXzI8MTQsIChvdXRzIEdQUkM6JHJEKSwgKGlucyBHUFJDOiRyQSwgczE2aW1tOiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGRpICRyRCwgJHJBLCAkaW1tIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyRCwgKGFkZCBHUFJDOiRyQSwgaW1tU0V4dDE2OiRpbW0pKV0+Ow0KK2xldCBEZWZzID0gW0NBUlJZXSBpbiB7DQorZGVmIEFERElDICA6IERGb3JtXzI8MTIsIChvdXRzIEdQUkM6JHJEKSwgKGlucyBHUFJDOiRyQSwgczE2aW1tOiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGRpYyAkckQsICRyQSwgJGltbSIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckQsIChhZGRjIEdQUkM6JHJBLCBpbW1TRXh0MTY6JGltbSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KK2RlZiBBRERJQ28gOiBERm9ybV8yPDEzLCAob3V0cyBHUFJDOiRyRCksIChpbnMgR1BSQzokckEsIHMxNmltbTokaW1tKSwNCisgICAgICAgICAgICAgICAgICAgICAiYWRkaWMuICRyRCwgJHJBLCAkaW1tIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICBbXT47DQorfQ0KK2RlZiBBRERJUyAgOiBERm9ybV8yPDE1LCAob3V0cyBHUFJDOiRyRCksIChpbnMgR1BSQzokckEsIHN5bWJvbEhpOiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGRpcyAkckQsICRyQSwgJGltbSIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckQsIChhZGQgR1BSQzokckEsIGltbTE2U2hpZnRlZFNFeHQ6JGltbSkpXT47DQorZGVmIExBICAgICA6IERGb3JtXzI8MTQsIChvdXRzIEdQUkM6JHJEKSwgKGlucyBHUFJDOiRyQSwgc3ltYm9sTG86JHN5bSksDQorICAgICAgICAgICAgICAgICAgICAgImxhICRyRCwgJHN5bSgkckEpIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyRCwgKGFkZCBHUFJDOiRyQSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFBDbG8gdGdsb2JhbGFkZHI6JHN5bSwgMCkpKV0+Ow0KK2RlZiBNVUxMSSAgOiBERm9ybV8yPCA3LCAob3V0cyBHUFJDOiRyRCksIChpbnMgR1BSQzokckEsIHMxNmltbTokaW1tKSwNCisgICAgICAgICAgICAgICAgICAgICAibXVsbGkgJHJELCAkckEsICRpbW0iLCBJbnRNdWxMSSwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyRCwgKG11bCBHUFJDOiRyQSwgaW1tU0V4dDE2OiRpbW0pKV0+Ow0KK2xldCBEZWZzID0gW0NBUlJZXSBpbiB7DQorZGVmIFNVQkZJQyA6IERGb3JtXzI8IDgsIChvdXRzIEdQUkM6JHJEKSwgKGlucyBHUFJDOiRyQSwgczE2aW1tOiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICJzdWJmaWMgJHJELCAkckEsICRpbW0iLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJELCAoc3ViYyBpbW1TRXh0MTY6JGltbSwgR1BSQzokckEpKV0+Ow0KK30NCisNCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbiB7DQorICBkZWYgTEkgIDogREZvcm1fMl9yMDwxNCwgKG91dHMgR1BSQzokckQpLCAoaW5zIHN5bWJvbExvOiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgImxpICRyRCwgJGltbSIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyRCwgaW1tU0V4dDE2OiRpbW0pXT47DQorICBkZWYgTElTIDogREZvcm1fMl9yMDwxNSwgKG91dHMgR1BSQzokckQpLCAoaW5zIHN5bWJvbEhpOiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgImxpcyAkckQsICRpbW0iLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckQsIGltbTE2U2hpZnRlZFNFeHQ6JGltbSldPjsNCit9DQorfQ0KKw0KK2xldCBQUEM5NzBfVW5pdCA9IDEgaW4geyAgLy8gRlhVIE9wZXJhdGlvbnMuDQorZGVmIEFORElvIDogREZvcm1fNDwyOCwgKG91dHMgR1BSQzokZHN0KSwgKGlucyBHUFJDOiRzcmMxLCB1MTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImFuZGkuICRkc3QsICRzcmMxLCAkc3JjMiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRkc3QsIChhbmQgR1BSQzokc3JjMSwgaW1tWkV4dDE2OiRzcmMyKSldPiwNCisgICAgICAgICAgICAgICAgICAgIGlzRE9UOw0KK2RlZiBBTkRJU28gOiBERm9ybV80PDI5LCAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIEdQUkM6JHNyYzEsIHUxNmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYW5kaXMuICRkc3QsICRzcmMxLCAkc3JjMiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRkc3QsIChhbmQgR1BSQzokc3JjMSxpbW0xNlNoaWZ0ZWRaRXh0OiRzcmMyKSldPiwNCisgICAgICAgICAgICAgICAgICAgIGlzRE9UOw0KK2RlZiBPUkkgICA6IERGb3JtXzQ8MjQsIChvdXRzIEdQUkM6JGRzdCksIChpbnMgR1BSQzokc3JjMSwgdTE2aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJvcmkgJGRzdCwgJHNyYzEsICRzcmMyIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKG9yIEdQUkM6JHNyYzEsIGltbVpFeHQxNjokc3JjMikpXT47DQorZGVmIE9SSVMgIDogREZvcm1fNDwyNSwgKG91dHMgR1BSQzokZHN0KSwgKGlucyBHUFJDOiRzcmMxLCB1MTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgIm9yaXMgJGRzdCwgJHNyYzEsICRzcmMyIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKG9yIEdQUkM6JHNyYzEsIGltbTE2U2hpZnRlZFpFeHQ6JHNyYzIpKV0+Ow0KK2RlZiBYT1JJICA6IERGb3JtXzQ8MjYsIChvdXRzIEdQUkM6JGRzdCksIChpbnMgR1BSQzokc3JjMSwgdTE2aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJ4b3JpICRkc3QsICRzcmMxLCAkc3JjMiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRkc3QsICh4b3IgR1BSQzokc3JjMSwgaW1tWkV4dDE2OiRzcmMyKSldPjsNCitkZWYgWE9SSVMgOiBERm9ybV80PDI3LCAob3V0cyBHUFJDOiRkc3QpLCAoaW5zIEdQUkM6JHNyYzEsIHUxNmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAieG9yaXMgJGRzdCwgJHNyYzEsICRzcmMyIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JGRzdCwgKHhvciBHUFJDOiRzcmMxLGltbTE2U2hpZnRlZFpFeHQ6JHNyYzIpKV0+Ow0KK2RlZiBOT1AgICA6IERGb3JtXzRfemVybzwyNCwgKG91dHMpLCAoaW5zKSwgIm5vcCIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsNCitkZWYgQ01QV0kgOiBERm9ybV81X2V4dDwxMSwgKG91dHMgQ1JSQzokY3JEKSwgKGlucyBHUFJDOiRyQSwgczE2aW1tOiRpbW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJjbXB3aSAkY3JELCAkckEsICRpbW0iLCBJbnRDb21wYXJlPjsNCitkZWYgQ01QTFdJIDogREZvcm1fNl9leHQ8MTAsIChvdXRzIENSUkM6JGRzdCksIChpbnMgR1BSQzokc3JjMSwgdTE2aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImNtcGx3aSAkZHN0LCAkc3JjMSwgJHNyYzIiLCBJbnRDb21wYXJlPjsNCit9DQorDQorDQorbGV0IFBQQzk3MF9Vbml0ID0gMSBpbiB7ICAvLyBGWFUgT3BlcmF0aW9ucy4NCitkZWYgTkFORCA6IFhGb3JtXzY8MzEsIDQ3NiwgKG91dHMgR1BSQzokckEpLCAoaW5zIEdQUkM6JHJTLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICJuYW5kICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyQSwgKG5vdCAoYW5kIEdQUkM6JHJTLCBHUFJDOiRyQikpKV0+Ow0KK2RlZiBBTkQgIDogWEZvcm1fNjwzMSwgIDI4LCAob3V0cyBHUFJDOiRyQSksIChpbnMgR1BSQzokclMsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgImFuZCAkckEsICRyUywgJHJCIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckEsIChhbmQgR1BSQzokclMsIEdQUkM6JHJCKSldPjsNCitkZWYgQU5EQyA6IFhGb3JtXzY8MzEsICA2MCwgKG91dHMgR1BSQzokckEpLCAoaW5zIEdQUkM6JHJTLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICJhbmRjICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyQSwgKGFuZCBHUFJDOiRyUywgKG5vdCBHUFJDOiRyQikpKV0+Ow0KK2RlZiBPUiAgIDogWEZvcm1fNjwzMSwgNDQ0LCAob3V0cyBHUFJDOiRyQSksIChpbnMgR1BSQzokclMsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgIm9yICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyQSwgKG9yIEdQUkM6JHJTLCBHUFJDOiRyQikpXT47DQorZGVmIE5PUiAgOiBYRm9ybV82PDMxLCAxMjQsIChvdXRzIEdQUkM6JHJBKSwgKGlucyBHUFJDOiRyUywgR1BSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAibm9yICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyQSwgKG5vdCAob3IgR1BSQzokclMsIEdQUkM6JHJCKSkpXT47DQorZGVmIE9SQyAgOiBYRm9ybV82PDMxLCA0MTIsIChvdXRzIEdQUkM6JHJBKSwgKGlucyBHUFJDOiRyUywgR1BSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAib3JjICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyQSwgKG9yIEdQUkM6JHJTLCAobm90IEdQUkM6JHJCKSkpXT47DQorZGVmIEVRViAgOiBYRm9ybV82PDMxLCAyODQsIChvdXRzIEdQUkM6JHJBKSwgKGlucyBHUFJDOiRyUywgR1BSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAiZXF2ICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyQSwgKG5vdCAoeG9yIEdQUkM6JHJTLCBHUFJDOiRyQikpKV0+Ow0KK2RlZiBYT1IgIDogWEZvcm1fNjwzMSwgMzE2LCAob3V0cyBHUFJDOiRyQSksIChpbnMgR1BSQzokclMsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgInhvciAkckEsICRyUywgJHJCIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckEsICh4b3IgR1BSQzokclMsIEdQUkM6JHJCKSldPjsNCitkZWYgU0xXICA6IFhGb3JtXzY8MzEsICAyNCwgKG91dHMgR1BSQzokckEpLCAoaW5zIEdQUkM6JHJTLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICJzbHcgJHJBLCAkclMsICRyQiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJBLCAoUFBDc2hsIEdQUkM6JHJTLCBHUFJDOiRyQikpXT47DQorZGVmIFNSVyAgOiBYRm9ybV82PDMxLCA1MzYsIChvdXRzIEdQUkM6JHJBKSwgKGlucyBHUFJDOiRyUywgR1BSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAic3J3ICRyQSwgJHJTLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyQSwgKFBQQ3NybCBHUFJDOiRyUywgR1BSQzokckIpKV0+Ow0KK2xldCBEZWZzID0gW0NBUlJZXSBpbiB7DQorZGVmIFNSQVcgOiBYRm9ybV82PDMxLCA3OTIsIChvdXRzIEdQUkM6JHJBKSwgKGlucyBHUFJDOiRyUywgR1BSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAic3JhdyAkckEsICRyUywgJHJCIiwgSW50U2hpZnQsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJBLCAoUFBDc3JhIEdQUkM6JHJTLCBHUFJDOiRyQikpXT47DQorfQ0KK30NCisNCitsZXQgUFBDOTcwX1VuaXQgPSAxIGluIHsgIC8vIEZYVSBPcGVyYXRpb25zLg0KK2xldCBEZWZzID0gW0NBUlJZXSBpbiB7DQorZGVmIFNSQVdJIDogWEZvcm1fMTA8MzEsIDgyNCwgKG91dHMgR1BSQzokckEpLCAoaW5zIEdQUkM6JHJTLCB1NWltbTokU0gpLCANCisgICAgICAgICAgICAgICAgICAgICAic3Jhd2kgJHJBLCAkclMsICRTSCIsIEludFNoaWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJBLCAoc3JhIEdQUkM6JHJTLCAoaTMyIGltbTokU0gpKSldPjsNCit9DQorZGVmIENOVExaVyA6IFhGb3JtXzExPDMxLCAgMjYsIChvdXRzIEdQUkM6JHJBKSwgKGlucyBHUFJDOiRyUyksDQorICAgICAgICAgICAgICAgICAgICAgICJjbnRsencgJHJBLCAkclMiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyQSwgKGN0bHogR1BSQzokclMpKV0+Ow0KK2RlZiBFWFRTQiAgOiBYRm9ybV8xMTwzMSwgOTU0LCAob3V0cyBHUFJDOiRyQSksIChpbnMgR1BSQzokclMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZXh0c2IgJHJBLCAkclMiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyQSwgKHNleHRfaW5yZWcgR1BSQzokclMsIGk4KSldPjsNCitkZWYgRVhUU0ggIDogWEZvcm1fMTE8MzEsIDkyMiwgKG91dHMgR1BSQzokckEpLCAoaW5zIEdQUkM6JHJTKSwNCisgICAgICAgICAgICAgICAgICAgICAgImV4dHNoICRyQSwgJHJTIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokckEsIChzZXh0X2lucmVnIEdQUkM6JHJTLCBpMTYpKV0+Ow0KKw0KK2RlZiBDTVBXICAgOiBYRm9ybV8xNl9leHQ8MzEsIDAsIChvdXRzIENSUkM6JGNyRCksIChpbnMgR1BSQzokckEsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjbXB3ICRjckQsICRyQSwgJHJCIiwgSW50Q29tcGFyZT47DQorZGVmIENNUExXICA6IFhGb3JtXzE2X2V4dDwzMSwgMzIsIChvdXRzIENSUkM6JGNyRCksIChpbnMgR1BSQzokckEsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjbXBsdyAkY3JELCAkckEsICRyQiIsIEludENvbXBhcmU+Ow0KK30NCitsZXQgUFBDOTcwX1VuaXQgPSAzIGluIHsgIC8vIEZQVSBPcGVyYXRpb25zLg0KKy8vZGVmIEZDTVBPICA6IFhGb3JtXzE3PDYzLCAzMiwgKG91dHMgQ1JSQzokY3JEKSwgKGlucyBGUFJDOiRmQSwgRlBSQzokZkIpLA0KKy8vICAgICAgICAgICAgICAgICAgICAgICJmY21wbyAkY3JELCAkZkEsICRmQiIsIEZQQ29tcGFyZT47DQorZGVmIEZDTVBVUyA6IFhGb3JtXzE3PDYzLCAwLCAob3V0cyBDUlJDOiRjckQpLCAoaW5zIEY0UkM6JGZBLCBGNFJDOiRmQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmY21wdSAkY3JELCAkZkEsICRmQiIsIEZQQ29tcGFyZT47DQorZGVmIEZDTVBVRCA6IFhGb3JtXzE3PDYzLCAwLCAob3V0cyBDUlJDOiRjckQpLCAoaW5zIEY4UkM6JGZBLCBGOFJDOiRmQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmY21wdSAkY3JELCAkZkEsICRmQiIsIEZQQ29tcGFyZT47DQorDQorbGV0IFVzZXMgPSBbUk1dIGluIHsNCisgIGRlZiBGQ1RJV1ogOiBYRm9ybV8yNjw2MywgMTUsIChvdXRzIEY4UkM6JGZyRCksIChpbnMgRjhSQzokZnJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiZmN0aXd6ICRmckQsICRmckIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokZnJELCAoUFBDZmN0aXd6IEY4UkM6JGZyQikpXT47DQorICBkZWYgRlJTUCAgIDogWEZvcm1fMjY8NjMsIDEyLCAob3V0cyBGNFJDOiRmckQpLCAoaW5zIEY4UkM6JGZyQiksDQorICAgICAgICAgICAgICAgICAgICAgICAgImZyc3AgJGZyRCwgJGZyQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGNFJDOiRmckQsIChmcm91bmQgRjhSQzokZnJCKSldPjsNCisgIGRlZiBGU1FSVCAgOiBYRm9ybV8yNjw2MywgMjIsIChvdXRzIEY4UkM6JGZyRCksIChpbnMgRjhSQzokZnJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiZnNxcnQgJGZyRCwgJGZyQiIsIEZQU3FydCwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGOFJDOiRmckQsIChmc3FydCBGOFJDOiRmckIpKV0+Ow0KKyAgZGVmIEZTUVJUUyA6IFhGb3JtXzI2PDU5LCAyMiwgKG91dHMgRjRSQzokZnJEKSwgKGlucyBGNFJDOiRmckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJmc3FydHMgJGZyRCwgJGZyQiIsIEZQU3FydCwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGNFJDOiRmckQsIChmc3FydCBGNFJDOiRmckIpKV0+Ow0KKyAgfQ0KK30NCisNCisvLy8gTm90ZSB0aGF0IEZNUiBpcyBkZWZpbmVkIGFzIHBzZXVkby1vcHMgb24gdGhlIFBQQzk3MCBiZWNhdXNlIHRoZXkgYXJlDQorLy8vIG9mdGVuIGNvYWxlc2NlZCBhd2F5IGFuZCB3ZSBkb24ndCB3YW50IHRoZSBkaXNwYXRjaCBncm91cCBidWlsZGVyIHRvIHRoaW5rDQorLy8vIHRoYXQgdGhleSB3aWxsIGZpbGwgc2xvdHMgKHdoaWNoIGNvdWxkIGNhdXNlIHRoZSBsb2FkIG9mIGEgTFNVIHJlamVjdCB0bw0KKy8vLyBzbmVhayBpbnRvIGEgZC1ncm91cCB3aXRoIGEgc3RvcmUpLg0KK2RlZiBGTVIgICA6IFhGb3JtXzI2PDYzLCA3MiwgKG91dHMgRjRSQzokZnJEKSwgKGlucyBGNFJDOiRmckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJmbXIgJGZyRCwgJGZyQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICBbXT4sICAvLyAoc2V0IEY0UkM6JGZyRCwgRjRSQzokZnJCKQ0KKyAgICAgICAgICAgICAgICAgICAgIFBQQzk3MF9Vbml0X1BzZXVkbzsNCisNCitsZXQgUFBDOTcwX1VuaXQgPSAzIGluIHsgIC8vIEZQVSBPcGVyYXRpb25zLg0KKy8vIFRoZXNlIGFyZSBhcnRpZmljaWFsbHkgc3BsaXQgaW50byB0d28gZGlmZmVyZW50IGZvcm1zLCBmb3IgNC84IGJ5dGUgRlAuDQorZGVmIEZBQlNTICA6IFhGb3JtXzI2PDYzLCAyNjQsIChvdXRzIEY0UkM6JGZyRCksIChpbnMgRjRSQzokZnJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgImZhYnMgJGZyRCwgJGZyQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokZnJELCAoZmFicyBGNFJDOiRmckIpKV0+Ow0KK2RlZiBGQUJTRCAgOiBYRm9ybV8yNjw2MywgMjY0LCAob3V0cyBGOFJDOiRmckQpLCAoaW5zIEY4UkM6JGZyQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmYWJzICRmckQsICRmckIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JGZyRCwgKGZhYnMgRjhSQzokZnJCKSldPjsNCitkZWYgRk5BQlNTIDogWEZvcm1fMjY8NjMsIDEzNiwgKG91dHMgRjRSQzokZnJEKSwgKGlucyBGNFJDOiRmckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZm5hYnMgJGZyRCwgJGZyQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokZnJELCAoZm5lZyAoZmFicyBGNFJDOiRmckIpKSldPjsNCitkZWYgRk5BQlNEIDogWEZvcm1fMjY8NjMsIDEzNiwgKG91dHMgRjhSQzokZnJEKSwgKGlucyBGOFJDOiRmckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZm5hYnMgJGZyRCwgJGZyQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokZnJELCAoZm5lZyAoZmFicyBGOFJDOiRmckIpKSldPjsNCitkZWYgRk5FR1MgIDogWEZvcm1fMjY8NjMsIDQwLCAob3V0cyBGNFJDOiRmckQpLCAoaW5zIEY0UkM6JGZyQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmbmVnICRmckQsICRmckIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JGZyRCwgKGZuZWcgRjRSQzokZnJCKSldPjsNCitkZWYgRk5FR0QgIDogWEZvcm1fMjY8NjMsIDQwLCAob3V0cyBGOFJDOiRmckQpLCAoaW5zIEY4UkM6JGZyQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmbmVnICRmckQsICRmckIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JGZyRCwgKGZuZWcgRjhSQzokZnJCKSldPjsNCit9DQorICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKy8vIFhMLUZvcm0gaW5zdHJ1Y3Rpb25zLiAgY29uZGl0aW9uIHJlZ2lzdGVyIGxvZ2ljYWwgb3BzLg0KKy8vDQorZGVmIE1DUkYgICA6IFhMRm9ybV8zPDE5LCAwLCAob3V0cyBDUlJDOiRCRiksIChpbnMgQ1JSQzokQkZBKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1jcmYgJEJGLCAkQkZBIiwgQnJNQ1I+LA0KKyAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0ZpcnN0LCBQUEM5NzBfVW5pdF9DUlU7DQorDQorZGVmIENSRVFWICA6IFhMRm9ybV8xPDE5LCAyODksIChvdXRzIENSQklUUkM6JENSRCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgQ1JCSVRSQzokQ1JBLCBDUkJJVFJDOiRDUkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3JlcXYgJENSRCwgJENSQSwgJENSQiIsIEJyQ1IsDQorICAgICAgICAgICAgICAgICAgICAgIFtdPjsNCisNCitkZWYgQ1JPUiAgOiBYTEZvcm1fMTwxOSwgNDQ5LCAob3V0cyBDUkJJVFJDOiRDUkQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIENSQklUUkM6JENSQSwgQ1JCSVRSQzokQ1JCKSwNCisgICAgICAgICAgICAgICAgICAgICAgImNyb3IgJENSRCwgJENSQSwgJENSQiIsIEJyQ1IsDQorICAgICAgICAgICAgICAgICAgICAgIFtdPjsNCisNCitkZWYgQ1JTRVQgIDogWExGb3JtXzFfZXh0PDE5LCAyODksIChvdXRzIENSQklUUkM6JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgImNyZXF2ICRkc3QsICRkc3QsICRkc3QiLCBCckNSLA0KKyAgICAgICAgICAgICAgW10+Ow0KKw0KKy8vIFhGWC1Gb3JtIGluc3RydWN0aW9ucy4gIEluc3RydWN0aW9ucyB0aGF0IGRlYWwgd2l0aCBTUFJzLg0KKy8vDQorbGV0IFVzZXMgPSBbQ1RSXSBpbiB7DQorZGVmIE1GQ1RSIDogWEZYRm9ybV8xX2V4dDwzMSwgMzM5LCA5LCAob3V0cyBHUFJDOiRyVCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1mY3RyICRyVCIsIFNwck1GU1BSPiwNCisgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0ZpcnN0LCBQUEM5NzBfVW5pdF9GWFU7DQorfQ0KK2xldCBEZWZzID0gW0NUUl0sIFBhdHRlcm4gPSBbKFBQQ210Y3RyIEdQUkM6JHJTKV0gaW4gew0KK2RlZiBNVENUUiA6IFhGWEZvcm1fN19leHQ8MzEsIDQ2NywgOSwgKG91dHMpLCAoaW5zIEdQUkM6JHJTKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtdGN0ciAkclMiLCBTcHJNVFNQUj4sDQorICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9GaXJzdCwgUFBDOTcwX1VuaXRfRlhVOw0KK30NCisNCitsZXQgRGVmcyA9IFtMUl0gaW4gew0KK2RlZiBNVExSICA6IFhGWEZvcm1fN19leHQ8MzEsIDQ2NywgOCwgKG91dHMpLCAoaW5zIEdQUkM6JHJTKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtdGxyICRyUyIsIFNwck1UU1BSPiwNCisgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0ZpcnN0LCBQUEM5NzBfVW5pdF9GWFU7DQorfQ0KK2xldCBVc2VzID0gW0xSXSBpbiB7DQorZGVmIE1GTFIgIDogWEZYRm9ybV8xX2V4dDwzMSwgMzM5LCA4LCAob3V0cyBHUFJDOiRyVCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1mbHIgJHJUIiwgU3ByTUZTUFI+LA0KKyAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfRmlyc3QsIFBQQzk3MF9Vbml0X0ZYVTsNCit9DQorDQorLy8gTW92ZSB0by9mcm9tIFZSU0FWRTogZGVzcGl0ZSBiZWluZyBhIFNQUiwgdGhlIFZSU0FWRSByZWdpc3RlciBpcyByZW5hbWVkIGxpa2UNCisvLyBhIEdQUiBvbiB0aGUgUFBDOTcwLiAgQXMgc3VjaCwgY29waWVzIGluIGFuZCBvdXQgaGF2ZSB0aGUgc2FtZSBwZXJmb3JtYW5jZQ0KKy8vIGNoYXJhY3RlcmlzdGljcyBhcyBhbiBPUiBpbnN0cnVjdGlvbi4NCitkZWYgTVRWUlNBVkUgOiBYRlhGb3JtXzdfZXh0PDMxLCA0NjcsIDI1NiwgKG91dHMpLCAoaW5zIEdQUkM6JHJTKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdHNwciAyNTYsICRyUyIsIEludEdlbmVyYWw+LA0KKyAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfU2luZ2xlLCBQUEM5NzBfVW5pdF9GWFU7DQorZGVmIE1GVlJTQVZFIDogWEZYRm9ybV8xX2V4dDwzMSwgMzM5LCAyNTYsIChvdXRzIEdQUkM6JHJUKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWZzcHIgJHJULCAyNTYiLCBJbnRHZW5lcmFsPiwNCisgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0ZpcnN0LCBQUEM5NzBfVW5pdF9GWFU7DQorDQorZGVmIE1UQ1JGIDogWEZYRm9ybV81PDMxLCAxNDQsIChvdXRzKSwgKGlucyBjcmJpdG06JEZYTSwgR1BSQzokclMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibXRjcmYgJEZYTSwgJHJTIiwgQnJNQ1JYPiwNCisgICAgICAgICAgICBQUEM5NzBfTWljcm9Db2RlLCBQUEM5NzBfVW5pdF9DUlU7DQorDQorLy8gVGhpcyBpcyBhIHBzZXVkbyBmb3IgTUZDUiwgd2hpY2ggaW1wbGljaXRseSB1c2VzIGFsbCA4IG9mIGl0cyBzdWJyZWdpc3RlcnM7DQorLy8gZGVjbGFyaW5nIHRoYXQgaGVyZSBnaXZlcyB0aGUgbG9jYWwgcmVnaXN0ZXIgYWxsb2NhdG9yIHByb2JsZW1zIHdpdGggdGhpczoNCisvLyAgdnJlZyA9IE1DUkYgIENSMA0KKy8vICBNRkNSICA8a2lsbCBvZiB3aGF0ZXZlciBwcmVnIGdvdCBhc3NpZ25lZCB0byB2cmVnPg0KKy8vIHdoaWxlIG5vdCBkZWNsYXJpbmcgaXQgYnJlYWtzIERlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltaW5hdGlvbi4NCisvLyBBcyBpdCB0dXJucyBvdXQsIGluIGFsbCBjYXNlcyB3aGVyZSB3ZSBjdXJyZW50bHkgdXNlIHRoaXMsDQorLy8gd2UncmUgb25seSBpbnRlcmVzdGVkIGluIG9uZSBzdWJyZWdpc3RlciBvZiBpdC4gIFJlcHJlc2VudCB0aGlzIGluIHRoZQ0KKy8vIGluc3RydWN0aW9uIHRvIGtlZXAgdGhlIHJlZ2lzdGVyIGFsbG9jYXRvciBmcm9tIGJlY29taW5nIGNvbmZ1c2VkLg0KK2RlZiBNRkNScHNldWQ6IFhGWEZvcm1fMzwzMSwgMTksIChvdXRzIEdQUkM6JHJUKSwgKGlucyBjcmJpdG06JEZYTSksDQorICAgICAgICAgICAgICAgICAgICAgICAibWZjciAkclQgJHs6Y29tbWVudH0gJEZYTSIsIFNwck1GQ1I+LA0KKyAgICAgICAgICAgIFBQQzk3MF9NaWNyb0NvZGUsIFBQQzk3MF9Vbml0X0NSVTsNCitkZWYgTUZPQ1JGOiBYRlhGb3JtXzVhPDMxLCAxOSwgKG91dHMgR1BSQzokclQpLCAoaW5zIGNyYml0bTokRlhNKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtZmNyICRyVCwgJEZYTSIsIFNwck1GQ1I+LA0KKyAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfRmlyc3QsIFBQQzk3MF9Vbml0X0NSVTsNCisNCisvLyBJbnN0cnVjdGlvbnMgdG8gbWFuaXB1bGF0ZSBGUFNDUi4gIE9ubHkgbG9uZyBkb3VibGUgaGFuZGxpbmcgdXNlcyB0aGVzZS4NCisvLyBGUFNDUiBpcyBub3QgbW9kZWxsZWQ7IHdlIHVzZSB0aGUgU0ROb2RlIEZsYWcgdG8ga2VlcCB0aGluZ3MgaW4gb3JkZXIuDQorDQorbGV0IFVzZXMgPSBbUk1dLCBEZWZzID0gW1JNXSBpbiB7IA0KKyAgZGVmIE1URlNCMCA6IFhGb3JtXzQzPDYzLCA3MCwgKG91dHMpLCAoaW5zIHU1aW1tOiRGTSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJtdGZzYjAgJEZNIiwgSW50TVRGU0IwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoUFBDbXRmc2IwIChpMzIgaW1tOiRGTSkpXT4sDQorICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9TaW5nbGUsIFBQQzk3MF9Vbml0X0ZQVTsNCisgIGRlZiBNVEZTQjEgOiBYRm9ybV80Mzw2MywgMzgsIChvdXRzKSwgKGlucyB1NWltbTokRk0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAibXRmc2IxICRGTSIsIEludE1URlNCMCwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKFBQQ210ZnNiMSAoaTMyIGltbTokRk0pKV0+LA0KKyAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfU2luZ2xlLCBQUEM5NzBfVW5pdF9GUFU7DQorICAvLyBNVEZTRiBkb2VzIG5vdCBhY3R1YWxseSBwcm9kdWNlIGFuIEZQIHJlc3VsdC4gIFdlIHByZXRlbmQgaXQgY29waWVzDQorICAvLyBpbnB1dCByZWcgQiB0byB0aGUgb3V0cHV0LiAgSWYgd2UgZGlkbid0IGRvIHRoaXMgaXQgd291bGQgbG9vayBsaWtlIHRoZQ0KKyAgLy8gaW5zdHJ1Y3Rpb24gaGFkIG5vIG91dHB1dHMgKGJlY2F1c2Ugd2UgYXJlbid0IG1vZGVsbGluZyB0aGUgRlBTQ1IpIGFuZA0KKyAgLy8gaXQgd291bGQgYmUgZGVsZXRlZC4NCisgIGRlZiBNVEZTRiAgOiBYRkxGb3JtPDYzLCA3MTEsIChvdXRzIEY4UkM6JEZSQSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGkzMmltbTokRk0sIEY4UkM6JHJULCBGOFJDOiRGUkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAibXRmc2YgJEZNLCAkclQiLCAiJEZSQiA9ICRGUkEiLCBJbnRNVEZTQjAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JEZSQSwgKFBQQ210ZnNmIChpMzIgaW1tOiRGTSksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjhSQzokclQsIEY4UkM6JEZSQikpXT4sDQorICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9TaW5nbGUsIFBQQzk3MF9Vbml0X0ZQVTsNCit9DQorbGV0IFVzZXMgPSBbUk1dIGluIHsNCisgIGRlZiBNRkZTICAgOiBYRm9ybV80Mjw2MywgNTgzLCAob3V0cyBGOFJDOiRyVCksIChpbnMpLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1mZnMgJHJUIiwgSW50TUZGUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokclQsIChQUENtZmZzKSldPiwNCisgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX1NpbmdsZSwgUFBDOTcwX1VuaXRfRlBVOw0KKyAgZGVmIEZBRERydHo6IEFGb3JtXzI8NjMsIDIxLA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBGOFJDOiRGUlQpLCAoaW5zIEY4UkM6JEZSQSwgRjhSQzokRlJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgImZhZGQgJEZSVCwgJEZSQSwgJEZSQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokRlJULCAoUFBDZmFkZHJ0eiBGOFJDOiRGUkEsIEY4UkM6JEZSQikpXT4sDQorICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9TaW5nbGUsIFBQQzk3MF9Vbml0X0ZQVTsNCit9DQorDQorDQorbGV0IFBQQzk3MF9Vbml0ID0gMSBpbiB7ICAvLyBGWFUgT3BlcmF0aW9ucy4NCisNCisvLyBYTy1Gb3JtIGluc3RydWN0aW9ucy4gIEFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIHNldCBvdmVyZmxvdyBiaXQNCisvLw0KK2RlZiBBREQ0ICA6IFhPRm9ybV8xPDMxLCAyNjYsIDAsIChvdXRzIEdQUkM6JHJUKSwgKGlucyBHUFJDOiRyQSwgR1BSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGQgJHJULCAkckEsICRyQiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokclQsIChhZGQgR1BSQzokckEsIEdQUkM6JHJCKSldPjsNCitsZXQgRGVmcyA9IFtDQVJSWV0gaW4gew0KK2RlZiBBRERDICA6IFhPRm9ybV8xPDMxLCAxMCwgMCwgKG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgImFkZGMgJHJULCAkckEsICRyQiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokclQsIChhZGRjIEdQUkM6JHJBLCBHUFJDOiRyQikpXT4sDQorICAgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KK30NCitkZWYgRElWVyAgOiBYT0Zvcm1fMTwzMSwgNDkxLCAwLCAob3V0cyBHUFJDOiRyVCksIChpbnMgR1BSQzokckEsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAiZGl2dyAkclQsICRyQSwgJHJCIiwgSW50RGl2VywNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyVCwgKHNkaXYgR1BSQzokckEsIEdQUkM6JHJCKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBQUEM5NzBfREdyb3VwX0ZpcnN0LCBQUEM5NzBfREdyb3VwX0NyYWNrZWQ7DQorZGVmIERJVldVIDogWE9Gb3JtXzE8MzEsIDQ1OSwgMCwgKG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgImRpdnd1ICRyVCwgJHJBLCAkckIiLCBJbnREaXZXLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJULCAodWRpdiBHUFJDOiRyQSwgR1BSQzokckIpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFBQQzk3MF9ER3JvdXBfRmlyc3QsIFBQQzk3MF9ER3JvdXBfQ3JhY2tlZDsNCitkZWYgTVVMSFcgOiBYT0Zvcm1fMTwzMSwgNzUsIDAsIChvdXRzIEdQUkM6JHJUKSwgKGlucyBHUFJDOiRyQSwgR1BSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJtdWxodyAkclQsICRyQSwgJHJCIiwgSW50TXVsSFcsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokclQsIChtdWxocyBHUFJDOiRyQSwgR1BSQzokckIpKV0+Ow0KK2RlZiBNVUxIV1UgOiBYT0Zvcm1fMTwzMSwgMTEsIDAsIChvdXRzIEdQUkM6JHJUKSwgKGlucyBHUFJDOiRyQSwgR1BSQzokckIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJtdWxod3UgJHJULCAkckEsICRyQiIsIEludE11bEhXVSwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyVCwgKG11bGh1IEdQUkM6JHJBLCBHUFJDOiRyQikpXT47DQorZGVmIE1VTExXIDogWE9Gb3JtXzE8MzEsIDIzNSwgMCwgKG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgIm11bGx3ICRyVCwgJHJBLCAkckIiLCBJbnRNdWxIVywNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyVCwgKG11bCBHUFJDOiRyQSwgR1BSQzokckIpKV0+Ow0KK2RlZiBTVUJGICA6IFhPRm9ybV8xPDMxLCA0MCwgMCwgKG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgInN1YmYgJHJULCAkckEsICRyQiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokclQsIChzdWIgR1BSQzokckIsIEdQUkM6JHJBKSldPjsNCitsZXQgRGVmcyA9IFtDQVJSWV0gaW4gew0KK2RlZiBTVUJGQyA6IFhPRm9ybV8xPDMxLCA4LCAwLCAob3V0cyBHUFJDOiRyVCksIChpbnMgR1BSQzokckEsIEdQUkM6JHJCKSwNCisgICAgICAgICAgICAgICAgICAgICAic3ViZmMgJHJULCAkckEsICRyQiIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokclQsIChzdWJjIEdQUkM6JHJCLCBHUFJDOiRyQSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KK30NCitkZWYgTkVHICAgIDogWE9Gb3JtXzM8MzEsIDEwNCwgMCwgKG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm5lZyAkclQsICRyQSIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJULCAoaW5lZyBHUFJDOiRyQSkpXT47DQorbGV0IFVzZXMgPSBbQ0FSUlldLCBEZWZzID0gW0NBUlJZXSBpbiB7DQorZGVmIEFEREUgIDogWE9Gb3JtXzE8MzEsIDEzOCwgMCwgKG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICJhZGRlICRyVCwgJHJBLCAkckIiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyVCwgKGFkZGUgR1BSQzokckEsIEdQUkM6JHJCKSldPjsNCitkZWYgQURETUUgIDogWE9Gb3JtXzM8MzEsIDIzNCwgMCwgKG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBKSwNCisgICAgICAgICAgICAgICAgICAgICAgImFkZG1lICRyVCwgJHJBIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokclQsIChhZGRlIEdQUkM6JHJBLCAtMSkpXT47DQorZGVmIEFERFpFICA6IFhPRm9ybV8zPDMxLCAyMDIsIDAsIChvdXRzIEdQUkM6JHJUKSwgKGlucyBHUFJDOiRyQSksDQorICAgICAgICAgICAgICAgICAgICAgICJhZGR6ZSAkclQsICRyQSIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJULCAoYWRkZSBHUFJDOiRyQSwgMCkpXT47DQorZGVmIFNVQkZFIDogWE9Gb3JtXzE8MzEsIDEzNiwgMCwgKG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBLCBHUFJDOiRyQiksDQorICAgICAgICAgICAgICAgICAgICAgICJzdWJmZSAkclQsICRyQSwgJHJCIiwgSW50R2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1BSQzokclQsIChzdWJlIEdQUkM6JHJCLCBHUFJDOiRyQSkpXT47DQorZGVmIFNVQkZNRSA6IFhPRm9ybV8zPDMxLCAyMzIsIDAsIChvdXRzIEdQUkM6JHJUKSwgKGlucyBHUFJDOiRyQSksDQorICAgICAgICAgICAgICAgICAgICAgICJzdWJmbWUgJHJULCAkckEiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUFJDOiRyVCwgKHN1YmUgLTEsIEdQUkM6JHJBKSldPjsNCitkZWYgU1VCRlpFIDogWE9Gb3JtXzM8MzEsIDIwMCwgMCwgKG91dHMgR1BSQzokclQpLCAoaW5zIEdQUkM6JHJBKSwNCisgICAgICAgICAgICAgICAgICAgICAgInN1YmZ6ZSAkclQsICRyQSIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdQUkM6JHJULCAoc3ViZSAwLCBHUFJDOiRyQSkpXT47DQorfQ0KK30NCisNCisvLyBBLUZvcm0gaW5zdHJ1Y3Rpb25zLiAgTW9zdCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkIGluIHRoZSBGUFUgYXJlIG9mDQorLy8gdGhpcyB0eXBlLg0KKy8vDQorbGV0IFBQQzk3MF9Vbml0ID0gMyBpbiB7ICAvLyBGUFUgT3BlcmF0aW9ucy4NCitsZXQgVXNlcyA9IFtSTV0gaW4gew0KKyAgZGVmIEZNQUREIDogQUZvcm1fMTw2MywgMjksIA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBGOFJDOiRGUlQpLCAoaW5zIEY4UkM6JEZSQSwgRjhSQzokRlJDLCBGOFJDOiRGUkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZm1hZGQgJEZSVCwgJEZSQSwgJEZSQywgJEZSQiIsIEZQRnVzZWQsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JEZSVCwgKGZhZGQgKGZtdWwgRjhSQzokRlJBLCBGOFJDOiRGUkMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEY4UkM6JEZSQikpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtGUENvbnRyYWN0aW9uc10+Ow0KKyAgZGVmIEZNQUREUyA6IEFGb3JtXzE8NTksIDI5LA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBGNFJDOiRGUlQpLCAoaW5zIEY0UkM6JEZSQSwgRjRSQzokRlJDLCBGNFJDOiRGUkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZm1hZGRzICRGUlQsICRGUkEsICRGUkMsICRGUkIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JEZSVCwgKGZhZGQgKGZtdWwgRjRSQzokRlJBLCBGNFJDOiRGUkMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEY0UkM6JEZSQikpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtGUENvbnRyYWN0aW9uc10+Ow0KKyAgZGVmIEZNU1VCIDogQUZvcm1fMTw2MywgMjgsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEY4UkM6JEZSVCksIChpbnMgRjhSQzokRlJBLCBGOFJDOiRGUkMsIEY4UkM6JEZSQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmbXN1YiAkRlJULCAkRlJBLCAkRlJDLCAkRlJCIiwgRlBGdXNlZCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokRlJULCAoZnN1YiAoZm11bCBGOFJDOiRGUkEsIEY4UkM6JEZSQyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjhSQzokRlJCKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0ZQQ29udHJhY3Rpb25zXT47DQorICBkZWYgRk1TVUJTIDogQUZvcm1fMTw1OSwgMjgsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEY0UkM6JEZSVCksIChpbnMgRjRSQzokRlJBLCBGNFJDOiRGUkMsIEY0UkM6JEZSQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmbXN1YnMgJEZSVCwgJEZSQSwgJEZSQywgJEZSQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokRlJULCAoZnN1YiAoZm11bCBGNFJDOiRGUkEsIEY0UkM6JEZSQyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjRSQzokRlJCKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0ZQQ29udHJhY3Rpb25zXT47DQorICBkZWYgRk5NQUREIDogQUZvcm1fMTw2MywgMzEsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEY4UkM6JEZSVCksIChpbnMgRjhSQzokRlJBLCBGOFJDOiRGUkMsIEY4UkM6JEZSQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmbm1hZGQgJEZSVCwgJEZSQSwgJEZSQywgJEZSQiIsIEZQRnVzZWQsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JEZSVCwgKGZuZWcgKGZhZGQgKGZtdWwgRjhSQzokRlJBLCBGOFJDOiRGUkMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEY4UkM6JEZSQikpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbRlBDb250cmFjdGlvbnNdPjsNCisgIGRlZiBGTk1BRERTIDogQUZvcm1fMTw1OSwgMzEsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEY0UkM6JEZSVCksIChpbnMgRjRSQzokRlJBLCBGNFJDOiRGUkMsIEY0UkM6JEZSQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmbm1hZGRzICRGUlQsICRGUkEsICRGUkMsICRGUkIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JEZSVCwgKGZuZWcgKGZhZGQgKGZtdWwgRjRSQzokRlJBLCBGNFJDOiRGUkMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEY0UkM6JEZSQikpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbRlBDb250cmFjdGlvbnNdPjsNCisgIGRlZiBGTk1TVUIgOiBBRm9ybV8xPDYzLCAzMCwNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRjhSQzokRlJUKSwgKGlucyBGOFJDOiRGUkEsIEY4UkM6JEZSQywgRjhSQzokRlJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgImZubXN1YiAkRlJULCAkRlJBLCAkRlJDLCAkRlJCIiwgRlBGdXNlZCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjhSQzokRlJULCAoZm5lZyAoZnN1YiAoZm11bCBGOFJDOiRGUkEsIEY4UkM6JEZSQyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjhSQzokRlJCKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtGUENvbnRyYWN0aW9uc10+Ow0KKyAgZGVmIEZOTVNVQlMgOiBBRm9ybV8xPDU5LCAzMCwNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRjRSQzokRlJUKSwgKGlucyBGNFJDOiRGUkEsIEY0UkM6JEZSQywgRjRSQzokRlJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgImZubXN1YnMgJEZSVCwgJEZSQSwgJEZSQywgJEZSQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokRlJULCAoZm5lZyAoZnN1YiAoZm11bCBGNFJDOiRGUkEsIEY0UkM6JEZSQyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjRSQzokRlJCKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtGUENvbnRyYWN0aW9uc10+Ow0KK30NCisvLyBGU0VMIGlzIGFydGlmaWNpYWxseSBzcGxpdCBpbnRvIDQgYW5kIDgtYnl0ZSBmb3JtcyBmb3IgdGhlIHJlc3VsdC4gIFRvIGF2b2lkDQorLy8gaGF2aW5nIDQgb2YgdGhlc2UsIGZvcmNlIHRoZSBjb21wYXJpc29uIHRvIGFsd2F5cyBiZSBhbiA4LWJ5dGUgZG91YmxlIChjb2RlDQorLy8gc2hvdWxkIHVzZSBhbiBGTVJTRCBpZiB0aGUgaW5wdXQgY29tcGFyaXNvbiB2YWx1ZSByZWFsbHkgd2FudHMgdG8gYmUgYSBmbG9hdCkNCisvLyBhbmQgNC84IGJ5dGUgZm9ybXMgZm9yIHRoZSByZXN1bHQgYW5kIG9wZXJhbmQgdHlwZS4uDQorZGVmIEZTRUxEIDogQUZvcm1fMTw2MywgMjMsDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBGOFJDOiRGUlQpLCAoaW5zIEY4UkM6JEZSQSwgRjhSQzokRlJDLCBGOFJDOiRGUkIpLA0KKyAgICAgICAgICAgICAgICAgICAgImZzZWwgJEZSVCwgJEZSQSwgJEZSQywgJEZSQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JEZSVCwgKFBQQ2ZzZWwgRjhSQzokRlJBLEY4UkM6JEZSQyxGOFJDOiRGUkIpKV0+Ow0KK2RlZiBGU0VMUyA6IEFGb3JtXzE8NjMsIDIzLA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEY0UkM6JEZSVCksIChpbnMgRjhSQzokRlJBLCBGNFJDOiRGUkMsIEY0UkM6JEZSQiksDQorICAgICAgICAgICAgICAgICAgICAgImZzZWwgJEZSVCwgJEZSQSwgJEZSQywgJEZSQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JEZSVCwgKFBQQ2ZzZWwgRjhSQzokRlJBLEY0UkM6JEZSQyxGNFJDOiRGUkIpKV0+Ow0KK2xldCBVc2VzID0gW1JNXSBpbiB7DQorICBkZWYgRkFERCAgOiBBRm9ybV8yPDYzLCAyMSwNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRjhSQzokRlJUKSwgKGlucyBGOFJDOiRGUkEsIEY4UkM6JEZSQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmYWRkICRGUlQsICRGUkEsICRGUkIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JEZSVCwgKGZhZGQgRjhSQzokRlJBLCBGOFJDOiRGUkIpKV0+Ow0KKyAgZGVmIEZBRERTIDogQUZvcm1fMjw1OSwgMjEsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEY0UkM6JEZSVCksIChpbnMgRjRSQzokRlJBLCBGNFJDOiRGUkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZmFkZHMgJEZSVCwgJEZSQSwgJEZSQiIsIEZQR2VuZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokRlJULCAoZmFkZCBGNFJDOiRGUkEsIEY0UkM6JEZSQikpXT47DQorICBkZWYgRkRJViAgOiBBRm9ybV8yPDYzLCAxOCwNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRjhSQzokRlJUKSwgKGlucyBGOFJDOiRGUkEsIEY4UkM6JEZSQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmZGl2ICRGUlQsICRGUkEsICRGUkIiLCBGUERpdkQsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY4UkM6JEZSVCwgKGZkaXYgRjhSQzokRlJBLCBGOFJDOiRGUkIpKV0+Ow0KKyAgZGVmIEZESVZTIDogQUZvcm1fMjw1OSwgMTgsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEY0UkM6JEZSVCksIChpbnMgRjRSQzokRlJBLCBGNFJDOiRGUkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZmRpdnMgJEZSVCwgJEZSQSwgJEZSQiIsIEZQRGl2UywNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRjRSQzokRlJULCAoZmRpdiBGNFJDOiRGUkEsIEY0UkM6JEZSQikpXT47DQorICBkZWYgRk1VTCAgOiBBRm9ybV8zPDYzLCAyNSwNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgRjhSQzokRlJUKSwgKGlucyBGOFJDOiRGUkEsIEY4UkM6JEZSQiksDQorICAgICAgICAgICAgICAgICAgICAgICJmbXVsICRGUlQsICRGUkEsICRGUkIiLCBGUEZ1c2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGOFJDOiRGUlQsIChmbXVsIEY4UkM6JEZSQSwgRjhSQzokRlJCKSldPjsNCisgIGRlZiBGTVVMUyA6IEFGb3JtXzM8NTksIDI1LA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBGNFJDOiRGUlQpLCAoaW5zIEY0UkM6JEZSQSwgRjRSQzokRlJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgImZtdWxzICRGUlQsICRGUkEsICRGUkIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JEZSVCwgKGZtdWwgRjRSQzokRlJBLCBGNFJDOiRGUkIpKV0+Ow0KKyAgZGVmIEZTVUIgIDogQUZvcm1fMjw2MywgMjAsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEY4UkM6JEZSVCksIChpbnMgRjhSQzokRlJBLCBGOFJDOiRGUkIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiZnN1YiAkRlJULCAkRlJBLCAkRlJCIiwgRlBHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGOFJDOiRGUlQsIChmc3ViIEY4UkM6JEZSQSwgRjhSQzokRlJCKSldPjsNCisgIGRlZiBGU1VCUyA6IEFGb3JtXzI8NTksIDIwLA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBGNFJDOiRGUlQpLCAoaW5zIEY0UkM6JEZSQSwgRjRSQzokRlJCKSwNCisgICAgICAgICAgICAgICAgICAgICAgImZzdWJzICRGUlQsICRGUkEsICRGUkIiLCBGUEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEY0UkM6JEZSVCwgKGZzdWIgRjRSQzokRlJBLCBGNFJDOiRGUkIpKV0+Ow0KKyAgfQ0KK30NCisNCitsZXQgUFBDOTcwX1VuaXQgPSAxIGluIHsgIC8vIEZYVSBPcGVyYXRpb25zLg0KKy8vIE0tRm9ybSBpbnN0cnVjdGlvbnMuICByb3RhdGUgYW5kIG1hc2sgaW5zdHJ1Y3Rpb25zLg0KKy8vDQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4gew0KKy8vIFJMV0lNSSBjYW4gYmUgY29tbXV0ZWQgaWYgdGhlIHJvdGF0ZSBhbW91bnQgaXMgemVyby4NCitkZWYgUkxXSU1JIDogTUZvcm1fMjwyMCwNCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUFJDOiRyQSksIChpbnMgR1BSQzokclNpLCBHUFJDOiRyUywgdTVpbW06JFNILCB1NWltbTokTUIsIA0KKyAgICAgICAgICAgICAgICAgICAgICB1NWltbTokTUUpLCAicmx3aW1pICRyQSwgJHJTLCAkU0gsICRNQiwgJE1FIiwgSW50Um90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICBbXT4sIFBQQzk3MF9ER3JvdXBfQ3JhY2tlZCwgUmVnQ29uc3RyYWludDwiJHJTaSA9ICRyQSI+LA0KKyAgICAgICAgICAgICAgICAgICAgICBOb0VuY29kZTwiJHJTaSI+Ow0KK30NCitkZWYgUkxXSU5NIDogTUZvcm1fMjwyMSwNCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUFJDOiRyQSksIChpbnMgR1BSQzokclMsIHU1aW1tOiRTSCwgdTVpbW06JE1CLCB1NWltbTokTUUpLA0KKyAgICAgICAgICAgICAgICAgICAgICJybHdpbm0gJHJBLCAkclMsICRTSCwgJE1CLCAkTUUiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgIFtdPjsNCitkZWYgUkxXSU5NbyA6IE1Gb3JtXzI8MjEsDQorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1BSQzokckEpLCAoaW5zIEdQUkM6JHJTLCB1NWltbTokU0gsIHU1aW1tOiRNQiwgdTVpbW06JE1FKSwNCisgICAgICAgICAgICAgICAgICAgICAicmx3aW5tLiAkckEsICRyUywgJFNILCAkTUIsICRNRSIsIEludEdlbmVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgW10+LCBpc0RPVCwgUFBDOTcwX0RHcm91cF9DcmFja2VkOw0KK2RlZiBSTFdOTSAgOiBNRm9ybV8yPDIzLA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdQUkM6JHJBKSwgKGlucyBHUFJDOiRyUywgR1BSQzokckIsIHU1aW1tOiRNQiwgdTVpbW06JE1FKSwNCisgICAgICAgICAgICAgICAgICAgICAicmx3bm0gJHJBLCAkclMsICRyQiwgJE1CLCAkTUUiLCBJbnRHZW5lcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgIFtdPjsNCit9DQorDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBQb3dlclBDIEluc3RydWN0aW9uIFBhdHRlcm5zDQorLy8NCisNCisvLyBBcmJpdHJhcnkgaW1tZWRpYXRlIHN1cHBvcnQuICBJbXBsZW1lbnQgaW4gdGVybXMgb2YgTElTL09SSS4NCitkZWYgOiBQYXQ8KGkzMiBpbW06JGltbSksDQorICAgICAgICAgIChPUkkgKExJUyAoSEkxNiBpbW06JGltbSkpLCAoTE8xNiBpbW06JGltbSkpPjsNCisNCisvLyBJbXBsZW1lbnQgdGhlICdub3QnIG9wZXJhdGlvbiB3aXRoIHRoZSBOT1IgaW5zdHJ1Y3Rpb24uDQorZGVmIE5PVCA6IFBhdDwobm90IEdQUkM6JGluKSwNCisgICAgICAgICAgICAgIChOT1IgR1BSQzokaW4sIEdQUkM6JGluKT47DQorDQorLy8gQUREIGFuIGFyYml0cmFyeSBpbW1lZGlhdGUuDQorZGVmIDogUGF0PChhZGQgR1BSQzokaW4sIGltbTokaW1tKSwNCisgICAgICAgICAgKEFERElTIChBRERJIEdQUkM6JGluLCAoTE8xNiBpbW06JGltbSkpLCAoSEExNiBpbW06JGltbSkpPjsNCisvLyBPUiBhbiBhcmJpdHJhcnkgaW1tZWRpYXRlLg0KK2RlZiA6IFBhdDwob3IgR1BSQzokaW4sIGltbTokaW1tKSwNCisgICAgICAgICAgKE9SSVMgKE9SSSBHUFJDOiRpbiwgKExPMTYgaW1tOiRpbW0pKSwgKEhJMTYgaW1tOiRpbW0pKT47DQorLy8gWE9SIGFuIGFyYml0cmFyeSBpbW1lZGlhdGUuDQorZGVmIDogUGF0PCh4b3IgR1BSQzokaW4sIGltbTokaW1tKSwNCisgICAgICAgICAgKFhPUklTIChYT1JJIEdQUkM6JGluLCAoTE8xNiBpbW06JGltbSkpLCAoSEkxNiBpbW06JGltbSkpPjsNCisvLyBTVUJGSUMNCitkZWYgOiBQYXQ8KHN1YiAgaW1tU0V4dDE2OiRpbW0sIEdQUkM6JGluKSwNCisgICAgICAgICAgKFNVQkZJQyBHUFJDOiRpbiwgaW1tOiRpbW0pPjsNCisNCisvLyBTSEwvU1JMDQorZGVmIDogUGF0PChzaGwgR1BSQzokaW4sIChpMzIgaW1tOiRpbW0pKSwNCisgICAgICAgICAgKFJMV0lOTSBHUFJDOiRpbiwgaW1tOiRpbW0sIDAsIChTSEwzMiBpbW06JGltbSkpPjsNCitkZWYgOiBQYXQ8KHNybCBHUFJDOiRpbiwgKGkzMiBpbW06JGltbSkpLA0KKyAgICAgICAgICAoUkxXSU5NIEdQUkM6JGluLCAoU1JMMzIgaW1tOiRpbW0pLCBpbW06JGltbSwgMzEpPjsNCisNCisvLyBST1RMDQorZGVmIDogUGF0PChyb3RsIEdQUkM6JGluLCBHUFJDOiRzaCksDQorICAgICAgICAgIChSTFdOTSBHUFJDOiRpbiwgR1BSQzokc2gsIDAsIDMxKT47DQorZGVmIDogUGF0PChyb3RsIEdQUkM6JGluLCAoaTMyIGltbTokaW1tKSksDQorICAgICAgICAgIChSTFdJTk0gR1BSQzokaW4sIGltbTokaW1tLCAwLCAzMSk+Ow0KKw0KKy8vIFJMV05NDQorZGVmIDogUGF0PChhbmQgKHJvdGwgR1BSQzokaW4sIEdQUkM6JHNoKSwgbWFza2ltbTMyOiRpbW0pLA0KKyAgICAgICAgICAoUkxXTk0gR1BSQzokaW4sIEdQUkM6JHNoLCAoTUIgbWFza2ltbTMyOiRpbW0pLCAoTUUgbWFza2ltbTMyOiRpbW0pKT47DQorDQorLy8gQ2FsbHMNCitkZWYgOiBQYXQ8KFBQQ2NhbGxfRGFyd2luIChpMzIgdGdsb2JhbGFkZHI6JGRzdCkpLA0KKyAgICAgICAgICAoQkxfRGFyd2luIHRnbG9iYWxhZGRyOiRkc3QpPjsNCitkZWYgOiBQYXQ8KFBQQ2NhbGxfRGFyd2luIChpMzIgdGV4dGVybmFsc3ltOiRkc3QpKSwNCisgICAgICAgICAgKEJMX0RhcndpbiB0ZXh0ZXJuYWxzeW06JGRzdCk+Ow0KK2RlZiA6IFBhdDwoUFBDY2FsbF9TVlI0IChpMzIgdGdsb2JhbGFkZHI6JGRzdCkpLA0KKyAgICAgICAgICAoQkxfU1ZSNCB0Z2xvYmFsYWRkcjokZHN0KT47DQorZGVmIDogUGF0PChQUENjYWxsX1NWUjQgKGkzMiB0ZXh0ZXJuYWxzeW06JGRzdCkpLA0KKyAgICAgICAgICAoQkxfU1ZSNCB0ZXh0ZXJuYWxzeW06JGRzdCk+Ow0KKw0KKw0KK2RlZiA6IFBhdDwoUFBDdGNfcmV0dXJuIChpMzIgdGdsb2JhbGFkZHI6JGRzdCksICBpbW06JGltbSksDQorICAgICAgICAgIChUQ1JFVFVSTmRpIHRnbG9iYWxhZGRyOiRkc3QsIGltbTokaW1tKT47DQorDQorZGVmIDogUGF0PChQUEN0Y19yZXR1cm4gKGkzMiB0ZXh0ZXJuYWxzeW06JGRzdCksIGltbTokaW1tKSwNCisgICAgICAgICAgKFRDUkVUVVJOZGkgdGV4dGVybmFsc3ltOiRkc3QsIGltbTokaW1tKT47DQorDQorZGVmIDogUGF0PChQUEN0Y19yZXR1cm4gQ1RSUkM6JGRzdCwgaW1tOiRpbW0pLA0KKyAgICAgICAgICAoVENSRVRVUk5yaSBDVFJSQzokZHN0LCBpbW06JGltbSk+Ow0KKw0KKw0KKw0KKy8vIEhpIGFuZCBMbyBmb3IgRGFyd2luIEdsb2JhbCBBZGRyZXNzZXMuDQorZGVmIDogUGF0PChQUENoaSB0Z2xvYmFsYWRkcjokaW4sIDApLCAoTElTIHRnbG9iYWxhZGRyOiRpbik+Ow0KK2RlZiA6IFBhdDwoUFBDbG8gdGdsb2JhbGFkZHI6JGluLCAwKSwgKExJIHRnbG9iYWxhZGRyOiRpbik+Ow0KK2RlZiA6IFBhdDwoUFBDaGkgdGNvbnN0cG9vbDokaW4sIDApLCAoTElTIHRjb25zdHBvb2w6JGluKT47DQorZGVmIDogUGF0PChQUENsbyB0Y29uc3Rwb29sOiRpbiwgMCksIChMSSB0Y29uc3Rwb29sOiRpbik+Ow0KK2RlZiA6IFBhdDwoUFBDaGkgdGp1bXB0YWJsZTokaW4sIDApLCAoTElTIHRqdW1wdGFibGU6JGluKT47DQorZGVmIDogUGF0PChQUENsbyB0anVtcHRhYmxlOiRpbiwgMCksIChMSSB0anVtcHRhYmxlOiRpbik+Ow0KK2RlZiA6IFBhdDwoUFBDaGkgdGJsb2NrYWRkcmVzczokaW4sIDApLCAoTElTIHRibG9ja2FkZHJlc3M6JGluKT47DQorZGVmIDogUGF0PChQUENsbyB0YmxvY2thZGRyZXNzOiRpbiwgMCksIChMSSB0YmxvY2thZGRyZXNzOiRpbik+Ow0KK2RlZiA6IFBhdDwoYWRkIEdQUkM6JGluLCAoUFBDaGkgdGdsb2JhbGFkZHI6JGcsIDApKSwNCisgICAgICAgICAgKEFERElTIEdQUkM6JGluLCB0Z2xvYmFsYWRkcjokZyk+Ow0KK2RlZiA6IFBhdDwoYWRkIEdQUkM6JGluLCAoUFBDaGkgdGNvbnN0cG9vbDokZywgMCkpLA0KKyAgICAgICAgICAoQURESVMgR1BSQzokaW4sIHRjb25zdHBvb2w6JGcpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUFJDOiRpbiwgKFBQQ2hpIHRqdW1wdGFibGU6JGcsIDApKSwNCisgICAgICAgICAgKEFERElTIEdQUkM6JGluLCB0anVtcHRhYmxlOiRnKT47DQorZGVmIDogUGF0PChhZGQgR1BSQzokaW4sIChQUENoaSB0YmxvY2thZGRyZXNzOiRnLCAwKSksDQorICAgICAgICAgIChBRERJUyBHUFJDOiRpbiwgdGJsb2NrYWRkcmVzczokZyk+Ow0KKw0KKy8vIEZ1c2VkIG5lZ2F0aXZlIG11bHRpcGx5IHN1YnRyYWN0LCBhbHRlcm5hdGUgcGF0dGVybg0KK2RlZiA6IFBhdDwoZnN1YiBGOFJDOiRCLCAoZm11bCBGOFJDOiRBLCBGOFJDOiRDKSksDQorICAgICAgICAgIChGTk1TVUIgRjhSQzokQSwgRjhSQzokQywgRjhSQzokQik+LA0KKyAgICAgICAgICBSZXF1aXJlczxbRlBDb250cmFjdGlvbnNdPjsNCitkZWYgOiBQYXQ8KGZzdWIgRjRSQzokQiwgKGZtdWwgRjRSQzokQSwgRjRSQzokQykpLA0KKyAgICAgICAgICAoRk5NU1VCUyBGNFJDOiRBLCBGNFJDOiRDLCBGNFJDOiRCKT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtGUENvbnRyYWN0aW9uc10+Ow0KKw0KKy8vIFN0YW5kYXJkIHNoaWZ0cy4gIFRoZXNlIGFyZSByZXByZXNlbnRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHJlYWwgc2hpZnRzIGFib3ZlDQorLy8gc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBzaGlmdHMgdGhhdCBhbGxvdyA1LWJpdCBhbmQgNi1iaXQgc2hpZnQNCisvLyBhbW91bnRzLg0KK2RlZiA6IFBhdDwoc3JhIEdQUkM6JHJTLCBHUFJDOiRyQiksDQorICAgICAgICAgIChTUkFXIEdQUkM6JHJTLCBHUFJDOiRyQik+Ow0KK2RlZiA6IFBhdDwoc3JsIEdQUkM6JHJTLCBHUFJDOiRyQiksDQorICAgICAgICAgIChTUlcgR1BSQzokclMsIEdQUkM6JHJCKT47DQorZGVmIDogUGF0PChzaGwgR1BSQzokclMsIEdQUkM6JHJCKSwNCisgICAgICAgICAgKFNMVyBHUFJDOiRyUywgR1BSQzokckIpPjsNCisNCitkZWYgOiBQYXQ8KHpleHRsb2FkaTEgaWFkZHI6JHNyYyksDQorICAgICAgICAgIChMQlogaWFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoemV4dGxvYWRpMSB4YWRkcjokc3JjKSwNCisgICAgICAgICAgKExCWlggeGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoZXh0bG9hZGkxIGlhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoTEJaIGlhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGV4dGxvYWRpMSB4YWRkcjokc3JjKSwNCisgICAgICAgICAgKExCWlggeGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoZXh0bG9hZGk4IGlhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoTEJaIGlhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGV4dGxvYWRpOCB4YWRkcjokc3JjKSwNCisgICAgICAgICAgKExCWlggeGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoZXh0bG9hZGkxNiBpYWRkcjokc3JjKSwNCisgICAgICAgICAgKExIWiBpYWRkcjokc3JjKT47DQorZGVmIDogUGF0PChleHRsb2FkaTE2IHhhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoTEhaWCB4YWRkcjokc3JjKT47DQorZGVmIDogUGF0PChmNjQgKGV4dGxvYWRmMzIgaWFkZHI6JHNyYykpLA0KKyAgICAgICAgICAoQ09QWV9UT19SRUdDTEFTUyAoTEZTIGlhZGRyOiRzcmMpLCBGOFJDKT47DQorZGVmIDogUGF0PChmNjQgKGV4dGxvYWRmMzIgeGFkZHI6JHNyYykpLA0KKyAgICAgICAgICAoQ09QWV9UT19SRUdDTEFTUyAoTEZTWCB4YWRkcjokc3JjKSwgRjhSQyk+Ow0KKw0KK2RlZiA6IFBhdDwoZjY0IChmZXh0ZW5kIEY0UkM6JHNyYykpLA0KKyAgICAgICAgICAoQ09QWV9UT19SRUdDTEFTUyBGNFJDOiRzcmMsIEY4UkMpPjsNCisNCisvLyBNZW1vcnkgYmFycmllcnMNCitkZWYgOiBQYXQ8KG1lbWJhcnJpZXIgKGkzMiBpbW0gLypsbCovKSwNCisgICAgICAgICAgICAgICAgICAgICAgKGkzMiBpbW0gLypscyovKSwNCisgICAgICAgICAgICAgICAgICAgICAgKGkzMiBpbW0gLypzbCovKSwNCisgICAgICAgICAgICAgICAgICAgICAgKGkzMiBpbW0gLypzcyovKSwNCisgICAgICAgICAgICAgICAgICAgICAgKGkzMiBpbW0gLypkZXZpY2UqLykpLA0KKyAgICAgICAgICAgKFNZTkMpPjsNCisNCitpbmNsdWRlICJQUENJbnN0ckFsdGl2ZWMudGQiDQoraW5jbHVkZSAiUFBDSW5zdHI2NEJpdC50ZCINCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSklUSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSklUSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmNGVjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENKSVRJbmZvLmNwcApAQCAtMCwwICsxLDQ0NiBAQAorLy89PT0tLSBQUENKSVRJbmZvLmNwcCAtIEltcGxlbWVudCB0aGUgSklUIGludGVyZmFjZXMgZm9yIHRoZSBQb3dlclBDIC0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgSklUIGludGVyZmFjZXMgZm9yIHRoZSAzMi1iaXQgUG93ZXJQQyB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJqaXQiCisjaW5jbHVkZSAiUFBDSklUSW5mby5oIgorI2luY2x1ZGUgIlBQQ1JlbG9jYXRpb25zLmgiCisjaW5jbHVkZSAiUFBDVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NZW1vcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBUYXJnZXRKSVRJbmZvOjpKSVRDb21waWxlckZuIEpJVENvbXBpbGVyRnVuY3Rpb247CisKKyNkZWZpbmUgQlVJTERfQURESVMoUkQsUlMsSU1NMTYpIFwKKyAgKCgxNSA8PCAyNikgfCAoKFJEKSA8PCAyMSkgfCAoKFJTKSA8PCAxNikgfCAoKElNTTE2KSAmIDY1NTM1KSkKKyNkZWZpbmUgQlVJTERfT1JJKFJELFJTLFVJTU0xNikgXAorICAoKDI0IDw8IDI2KSB8ICgoUlMpIDw8IDIxKSB8ICgoUkQpIDw8IDE2KSB8ICgoVUlNTTE2KSAmIDY1NTM1KSkKKyNkZWZpbmUgQlVJTERfT1JJUyhSRCxSUyxVSU1NMTYpIFwKKyAgKCgyNSA8PCAyNikgfCAoKFJTKSA8PCAyMSkgfCAoKFJEKSA8PCAxNikgfCAoKFVJTU0xNikgJiA2NTUzNSkpCisjZGVmaW5lIEJVSUxEX1JMRElDUihSRCxSUyxTSCxNRSkgXAorICAoKDMwIDw8IDI2KSB8ICgoUlMpIDw8IDIxKSB8ICgoUkQpIDw8IDE2KSB8ICgoKFNIKSAmIDMxKSA8PCAxMSkgfCBcCisgICAoKChNRSkgJiA2MykgPDwgNikgfCAoMSA8PCAyKSB8ICgoKChTSCkgPj4gNSkgJiAxKSA8PCAxKSkKKyNkZWZpbmUgQlVJTERfTVRTUFIoUlMsU1BSKSAgICAgIFwKKyAgKCgzMSA8PCAyNikgfCAoKFJTKSA8PCAyMSkgfCAoKFNQUikgPDwgMTYpIHwgKDQ2NyA8PCAxKSkKKyNkZWZpbmUgQlVJTERfQkNDVFJ4KEJPLEJJLExJTkspIFwKKyAgKCgxOSA8PCAyNikgfCAoKEJPKSA8PCAyMSkgfCAoKEJJKSA8PCAxNikgfCAoNTI4IDw8IDEpIHwgKChMSU5LKSAmIDEpKQorI2RlZmluZSBCVUlMRF9CKFRBUkdFVCwgTElOSykgXAorICAoKDE4IDw8IDI2KSB8ICgoKFRBUkdFVCkgJiAweDAwRkZGRkZGKSA8PCAyKSB8ICgoTElOSykgJiAxKSkKKworLy8gUHNldWRvLW9wcworI2RlZmluZSBCVUlMRF9MSVMoUkQsSU1NMTYpICAgIEJVSUxEX0FERElTKFJELDAsSU1NMTYpCisjZGVmaW5lIEJVSUxEX1NMREkoUkQsUlMsSU1NNikgQlVJTERfUkxESUNSKFJELFJTLElNTTYsNjMtSU1NNikKKyNkZWZpbmUgQlVJTERfTVRDVFIoUlMpICAgICAgICBCVUlMRF9NVFNQUihSUyw5KQorI2RlZmluZSBCVUlMRF9CQ1RSKExJTkspICAgICAgIEJVSUxEX0JDQ1RSeCgyMCwwLExJTkspCisKK3N0YXRpYyB2b2lkIEVtaXRCcmFuY2hUb0F0KHVpbnQ2NF90IEF0LCB1aW50NjRfdCBUbywgYm9vbCBpc0NhbGwsIGJvb2wgaXM2NEJpdCl7CisgIGludHB0cl90IE9mZnNldCA9ICgoaW50cHRyX3QpVG8gLSAoaW50cHRyX3QpQXQpID4+IDI7CisgIHVuc2lnbmVkICpBdEkgPSAodW5zaWduZWQqKShpbnRwdHJfdClBdDsKKworICBpZiAoT2Zmc2V0ID49IC0oMSA8PCAyMykgJiYgT2Zmc2V0IDwgKDEgPDwgMjMpKSB7ICAgLy8gSW4gcmFuZ2U/CisgICAgQXRJWzBdID0gQlVJTERfQihPZmZzZXQsIGlzQ2FsbCk7ICAgICAvLyBiL2JsIHRhcmdldAorICB9IGVsc2UgaWYgKCFpczY0Qml0KSB7CisgICAgQXRJWzBdID0gQlVJTERfTElTKDEyLCBUbyA+PiAxNik7ICAgICAvLyBsaXMgcjEyLCBoaTE2KGFkZHJlc3MpCisgICAgQXRJWzFdID0gQlVJTERfT1JJKDEyLCAxMiwgVG8pOyAgICAgICAvLyBvcmkgcjEyLCByMTIsIGxvMTYoYWRkcmVzcykKKyAgICBBdElbMl0gPSBCVUlMRF9NVENUUigxMik7ICAgICAgICAgICAgIC8vIG10Y3RyIHIxMgorICAgIEF0SVszXSA9IEJVSUxEX0JDVFIoaXNDYWxsKTsgICAgICAgICAgLy8gYmN0ci9iY3RybAorICB9IGVsc2UgeworICAgIEF0SVswXSA9IEJVSUxEX0xJUygxMiwgVG8gPj4gNDgpOyAgICAgIC8vIGxpcyByMTIsIGhpMTYoYWRkcmVzcykKKyAgICBBdElbMV0gPSBCVUlMRF9PUkkoMTIsIDEyLCBUbyA+PiAzMik7ICAvLyBvcmkgcjEyLCByMTIsIGxvMTYoYWRkcmVzcykKKyAgICBBdElbMl0gPSBCVUlMRF9TTERJKDEyLCAxMiwgMzIpOyAgICAgICAvLyBzbGRpIHIxMiwgcjEyLCAzMgorICAgIEF0SVszXSA9IEJVSUxEX09SSVMoMTIsIDEyLCBUbyA+PiAxNik7IC8vIG9yaXMgcjEyLCByMTIsIGhpMTYoYWRkcmVzcykKKyAgICBBdElbNF0gPSBCVUlMRF9PUkkoMTIsIDEyLCBUbyk7ICAgICAgICAvLyBvcmkgcjEyLCByMTIsIGxvMTYoYWRkcmVzcykKKyAgICBBdElbNV0gPSBCVUlMRF9NVENUUigxMik7ICAgICAgICAgICAgICAvLyBtdGN0ciByMTIKKyAgICBBdElbNl0gPSBCVUlMRF9CQ1RSKGlzQ2FsbCk7ICAgICAgICAgICAvLyBiY3RyL2JjdHJsCisgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIFBQQzMyQ29tcGlsYXRpb25DYWxsYmFjaygpOworZXh0ZXJuICJDIiB2b2lkIFBQQzY0Q29tcGlsYXRpb25DYWxsYmFjaygpOworCisjaWYgKGRlZmluZWQoX19QT1dFUlBDX18pIHx8IGRlZmluZWQgKF9fcHBjX18pIHx8IGRlZmluZWQoX1BPV0VSKSkgJiYgXAorICAgICEoZGVmaW5lZChfX3BwYzY0X18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pKQorLy8gQ29tcGlsYXRpb25DYWxsYmFjayBzdHViIC0gV2UgY2FuJ3QgdXNlIGEgQyBmdW5jdGlvbiB3aXRoIGlubGluZSBhc3NlbWJseSBpbgorLy8gaXQsIGJlY2F1c2Ugd2UgdGhlIHByb2xvZy9lcGlsb2cgaW5zZXJ0ZWQgYnkgR0NDIHdvbid0IHdvcmsgZm9yIHVzLiAgSW5zdGVhZCwKKy8vIHdyaXRlIG91ciBvd24gd3JhcHBlciwgd2hpY2ggZG9lcyB0aGluZ3Mgb3VyIHdheSwgc28gd2UgaGF2ZSBjb21wbGV0ZSBjb250cm9sCisvLyBvdmVyIHJlZ2lzdGVyIHNhdmluZyBhbmQgcmVzdG9yaW5nLgorYXNtKAorICAgICIudGV4dFxuIgorICAgICIuYWxpZ24gMlxuIgorICAgICIuZ2xvYmwgX1BQQzMyQ29tcGlsYXRpb25DYWxsYmFja1xuIgorIl9QUEMzMkNvbXBpbGF0aW9uQ2FsbGJhY2s6XG4iCisgICAgLy8gTWFrZSBzcGFjZSBmb3IgOCBpbnRzIHJbMy0xMF0gYW5kIDEzIGRvdWJsZXMgZlsxLTEzXSBhbmQgdGhlIAorICAgIC8vIEZJWE1FOiBuZWVkIHRvIHNhdmUgdlswLTE5XSBmb3IgYWx0aXZlYz8KKyAgICAvLyBGSVhNRTogY291bGQgc2hyaW5rIGZyYW1lCisgICAgLy8gU2V0IHVwIGEgcHJvcGVyIHN0YWNrIGZyYW1lCisgICAgLy8gRklYTUUgTGF5b3V0CisgICAgLy8gICBQb3dlclBDNjQgQUJJIGxpbmthZ2UgICAgLSAgMjQgYnl0ZXMKKyAgICAvLyAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyAtICAzMiBieXRlcworICAgIC8vICAgMTMgZG91YmxlIHJlZ2lzdGVycyAgICAgIC0gMTA0IGJ5dGVzCisgICAgLy8gICA4IGludCByZWdpc3RlcnMgICAgICAgICAgLSAgMzIgYnl0ZXMKKyAgICAibWZsciByMFxuIgorICAgICJzdHcgcjAsICA4KHIxKVxuIgorICAgICJzdHd1IHIxLCAtMjA4KHIxKVxuIgorICAgIC8vIFNhdmUgYWxsIGludCBhcmcgcmVnaXN0ZXJzCisgICAgInN0dyByMTAsIDIwNChyMSlcbiIgICAgInN0dyByOSwgIDIwMChyMSlcbiIKKyAgICAic3R3IHI4LCAgMTk2KHIxKVxuIiAgICAic3R3IHI3LCAgMTkyKHIxKVxuIgorICAgICJzdHcgcjYsICAxODgocjEpXG4iICAgICJzdHcgcjUsICAxODQocjEpXG4iCisgICAgInN0dyByNCwgIDE4MChyMSlcbiIgICAgInN0dyByMywgIDE3NihyMSlcbiIKKyAgICAvLyBTYXZlIGFsbCBjYWxsLWNsb2JiZXJlZCBGUCByZWdzLgorICAgICJzdGZkIGYxMywgMTY4KHIxKVxuIiAgICJzdGZkIGYxMiwgMTYwKHIxKVxuIgorICAgICJzdGZkIGYxMSwgMTUyKHIxKVxuIiAgICJzdGZkIGYxMCwgMTQ0KHIxKVxuIgorICAgICJzdGZkIGY5LCAgMTM2KHIxKVxuIiAgICJzdGZkIGY4LCAgMTI4KHIxKVxuIgorICAgICJzdGZkIGY3LCAgMTIwKHIxKVxuIiAgICJzdGZkIGY2LCAgMTEyKHIxKVxuIgorICAgICJzdGZkIGY1LCAgMTA0KHIxKVxuIiAgICJzdGZkIGY0LCAgIDk2KHIxKVxuIgorICAgICJzdGZkIGYzLCAgIDg4KHIxKVxuIiAgICJzdGZkIGYyLCAgIDgwKHIxKVxuIgorICAgICJzdGZkIGYxLCAgIDcyKHIxKVxuIgorICAgIC8vIEFyZ3VtZW50cyB0byBDb21waWxhdGlvbiBDYWxsYmFjazoKKyAgICAvLyByMyAtIG91ciBsciAoYWRkcmVzcyBvZiB0aGUgY2FsbCBpbnN0cnVjdGlvbiBpbiBzdHViIHBsdXMgNCkKKyAgICAvLyByNCAtIHN0dWIncyBsciAoYWRkcmVzcyBvZiBpbnN0cnVjdGlvbiB0aGF0IGNhbGxlZCB0aGUgc3R1YiBwbHVzIDQpCisgICAgLy8gcjUgLSBpczY0Qml0IC0gYWx3YXlzIDAuCisgICAgIm1yICAgcjMsIHIwXG4iCisgICAgImx3eiAgcjIsIDIwOChyMSlcbiIgLy8gc3R1YidzIGZyYW1lCisgICAgImx3eiAgcjQsIDgocjIpXG4iIC8vIHN0dWIncyBscgorICAgICJsaSAgIHI1LCAwXG4iICAgICAgIC8vIDAgPT0gMzIgYml0CisgICAgImJsIF9QUENDb21waWxhdGlvbkNhbGxiYWNrQ1xuIgorICAgICJtdGN0ciByM1xuIgorICAgIC8vIFJlc3RvcmUgYWxsIGludCBhcmcgcmVnaXN0ZXJzCisgICAgImx3eiByMTAsIDIwNChyMSlcbiIgICAgImx3eiByOSwgIDIwMChyMSlcbiIKKyAgICAibHd6IHI4LCAgMTk2KHIxKVxuIiAgICAibHd6IHI3LCAgMTkyKHIxKVxuIgorICAgICJsd3ogcjYsICAxODgocjEpXG4iICAgICJsd3ogcjUsICAxODQocjEpXG4iCisgICAgImx3eiByNCwgIDE4MChyMSlcbiIgICAgImx3eiByMywgIDE3NihyMSlcbiIKKyAgICAvLyBSZXN0b3JlIGFsbCBGUCBhcmcgcmVnaXN0ZXJzCisgICAgImxmZCBmMTMsIDE2OChyMSlcbiIgICAgImxmZCBmMTIsIDE2MChyMSlcbiIKKyAgICAibGZkIGYxMSwgMTUyKHIxKVxuIiAgICAibGZkIGYxMCwgMTQ0KHIxKVxuIgorICAgICJsZmQgZjksICAxMzYocjEpXG4iICAgICJsZmQgZjgsICAxMjgocjEpXG4iCisgICAgImxmZCBmNywgIDEyMChyMSlcbiIgICAgImxmZCBmNiwgIDExMihyMSlcbiIKKyAgICAibGZkIGY1LCAgMTA0KHIxKVxuIiAgICAibGZkIGY0LCAgIDk2KHIxKVxuIgorICAgICJsZmQgZjMsICAgODgocjEpXG4iICAgICJsZmQgZjIsICAgODAocjEpXG4iCisgICAgImxmZCBmMSwgICA3MihyMSlcbiIKKyAgICAvLyBQb3AgMyBmcmFtZXMgb2ZmIHRoZSBzdGFjayBhbmQgYnJhbmNoIHRvIHRhcmdldAorICAgICJsd3ogIHIxLCAyMDgocjEpXG4iCisgICAgImx3eiAgcjIsIDgocjEpXG4iCisgICAgIm10bHIgcjJcbiIKKyAgICAiYmN0clxuIgorICAgICk7CisKKyNlbGlmIGRlZmluZWQoX19QUENfXykgJiYgIWRlZmluZWQoX19wcGM2NF9fKQorLy8gTGludXggJiBGcmVlQlNEIC8gUFBDIDMyIHN1cHBvcnQKKworLy8gQ29tcGlsYXRpb25DYWxsYmFjayBzdHViIC0gV2UgY2FuJ3QgdXNlIGEgQyBmdW5jdGlvbiB3aXRoIGlubGluZSBhc3NlbWJseSBpbgorLy8gaXQsIGJlY2F1c2Ugd2UgdGhlIHByb2xvZy9lcGlsb2cgaW5zZXJ0ZWQgYnkgR0NDIHdvbid0IHdvcmsgZm9yIHVzLiAgSW5zdGVhZCwKKy8vIHdyaXRlIG91ciBvd24gd3JhcHBlciwgd2hpY2ggZG9lcyB0aGluZ3Mgb3VyIHdheSwgc28gd2UgaGF2ZSBjb21wbGV0ZSBjb250cm9sCisvLyBvdmVyIHJlZ2lzdGVyIHNhdmluZyBhbmQgcmVzdG9yaW5nLgorYXNtKAorICAgICIudGV4dFxuIgorICAgICIuYWxpZ24gMlxuIgorICAgICIuZ2xvYmwgUFBDMzJDb21waWxhdGlvbkNhbGxiYWNrXG4iCisiUFBDMzJDb21waWxhdGlvbkNhbGxiYWNrOlxuIgorICAgIC8vIE1ha2Ugc3BhY2UgZm9yIDggaW50cyByWzMtMTBdIGFuZCA4IGRvdWJsZXMgZlsxLThdIGFuZCB0aGUgCisgICAgLy8gRklYTUU6IG5lZWQgdG8gc2F2ZSB2WzAtMTldIGZvciBhbHRpdmVjPworICAgIC8vIEZJWE1FOiBjb3VsZCBzaHJpbmsgZnJhbWUKKyAgICAvLyBTZXQgdXAgYSBwcm9wZXIgc3RhY2sgZnJhbWUKKyAgICAvLyBGSVhNRSBMYXlvdXQKKyAgICAvLyAgIDggZG91YmxlIHJlZ2lzdGVycyAgICAgICAtICA2NCBieXRlcworICAgIC8vICAgOCBpbnQgcmVnaXN0ZXJzICAgICAgICAgIC0gIDMyIGJ5dGVzCisgICAgIm1mbHIgMFxuIgorICAgICJzdHcgMCwgIDQoMSlcbiIKKyAgICAic3R3dSAxLCAtMTA0KDEpXG4iCisgICAgLy8gU2F2ZSBhbGwgaW50IGFyZyByZWdpc3RlcnMKKyAgICAic3R3IDEwLCAxMDAoMSlcbiIgICAic3R3IDksICA5NigxKVxuIgorICAgICJzdHcgOCwgIDkyKDEpXG4iICAgICJzdHcgNywgIDg4KDEpXG4iCisgICAgInN0dyA2LCAgODQoMSlcbiIgICAgInN0dyA1LCAgODAoMSlcbiIKKyAgICAic3R3IDQsICA3NigxKVxuIiAgICAic3R3IDMsICA3MigxKVxuIgorICAgIC8vIFNhdmUgYWxsIGNhbGwtY2xvYmJlcmVkIEZQIHJlZ3MuCisgICAgInN0ZmQgOCwgIDY0KDEpXG4iCisgICAgInN0ZmQgNywgIDU2KDEpXG4iICAgInN0ZmQgNiwgIDQ4KDEpXG4iCisgICAgInN0ZmQgNSwgIDQwKDEpXG4iICAgInN0ZmQgNCwgIDMyKDEpXG4iCisgICAgInN0ZmQgMywgIDI0KDEpXG4iICAgInN0ZmQgMiwgIDE2KDEpXG4iCisgICAgInN0ZmQgMSwgIDgoMSlcbiIKKyAgICAvLyBBcmd1bWVudHMgdG8gQ29tcGlsYXRpb24gQ2FsbGJhY2s6CisgICAgLy8gcjMgLSBvdXIgbHIgKGFkZHJlc3Mgb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaW4gc3R1YiBwbHVzIDQpCisgICAgLy8gcjQgLSBzdHViJ3MgbHIgKGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gdGhhdCBjYWxsZWQgdGhlIHN0dWIgcGx1cyA0KQorICAgIC8vIHI1IC0gaXM2NEJpdCAtIGFsd2F5cyAwLgorICAgICJtciAgIDMsIDBcbiIKKyAgICAibHd6ICA1LCAxMDQoMSlcbiIgLy8gc3R1YidzIGZyYW1lCisgICAgImx3eiAgNCwgNCg1KVxuIiAvLyBzdHViJ3MgbHIKKyAgICAibGkgICA1LCAwXG4iICAgICAgIC8vIDAgPT0gMzIgYml0CisgICAgImJsIFBQQ0NvbXBpbGF0aW9uQ2FsbGJhY2tDXG4iCisgICAgIm10Y3RyIDNcbiIKKyAgICAvLyBSZXN0b3JlIGFsbCBpbnQgYXJnIHJlZ2lzdGVycworICAgICJsd3ogMTAsIDEwMCgxKVxuIiAgICJsd3ogOSwgIDk2KDEpXG4iCisgICAgImx3eiA4LCAgOTIoMSlcbiIgICAgImx3eiA3LCAgODgoMSlcbiIKKyAgICAibHd6IDYsICA4NCgxKVxuIiAgICAibHd6IDUsICA4MCgxKVxuIgorICAgICJsd3ogNCwgIDc2KDEpXG4iICAgICJsd3ogMywgIDcyKDEpXG4iCisgICAgLy8gUmVzdG9yZSBhbGwgRlAgYXJnIHJlZ2lzdGVycworICAgICJsZmQgOCwgIDY0KDEpXG4iCisgICAgImxmZCA3LCAgNTYoMSlcbiIgICAgImxmZCA2LCAgNDgoMSlcbiIKKyAgICAibGZkIDUsICA0MCgxKVxuIiAgICAibGZkIDQsICAzMigxKVxuIgorICAgICJsZmQgMywgIDI0KDEpXG4iICAgICJsZmQgMiwgIDE2KDEpXG4iCisgICAgImxmZCAxLCAgOCgxKVxuIgorICAgIC8vIFBvcCAzIGZyYW1lcyBvZmYgdGhlIHN0YWNrIGFuZCBicmFuY2ggdG8gdGFyZ2V0CisgICAgImx3eiAgMSwgMTA0KDEpXG4iCisgICAgImx3eiAgMCwgNCgxKVxuIgorICAgICJtdGxyIDBcbiIKKyAgICAiYmN0clxuIgorICAgICk7CisjZWxzZQordm9pZCBQUEMzMkNvbXBpbGF0aW9uQ2FsbGJhY2soKSB7CisgIGxsdm1fdW5yZWFjaGFibGUoIlRoaXMgaXMgbm90IGEgcG93ZXIgcGMsIHlvdSBjYW4ndCBleGVjdXRlIHRoaXMhIik7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9fUE9XRVJQQ19fKSB8fCBkZWZpbmVkIChfX3BwY19fKSB8fCBkZWZpbmVkKF9QT1dFUikpICYmIFwKKyAgICBkZWZpbmVkKF9fcHBjNjRfXykKK2FzbSgKKyAgICAiLnRleHRcbiIKKyAgICAiLmFsaWduIDJcbiIKKyAgICAiLmdsb2JsIF9QUEM2NENvbXBpbGF0aW9uQ2FsbGJhY2tcbiIKKyJfUFBDNjRDb21waWxhdGlvbkNhbGxiYWNrOlxuIgorICAgIC8vIE1ha2Ugc3BhY2UgZm9yIDggaW50cyByWzMtMTBdIGFuZCAxMyBkb3VibGVzIGZbMS0xM10gYW5kIHRoZSAKKyAgICAvLyBGSVhNRTogbmVlZCB0byBzYXZlIHZbMC0xOV0gZm9yIGFsdGl2ZWM/CisgICAgLy8gU2V0IHVwIGEgcHJvcGVyIHN0YWNrIGZyYW1lCisgICAgLy8gTGF5b3V0CisgICAgLy8gICBQb3dlclBDNjQgQUJJIGxpbmthZ2UgICAgLSAgNDggYnl0ZXMKKyAgICAvLyAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyAtICA2NCBieXRlcworICAgIC8vICAgMTMgZG91YmxlIHJlZ2lzdGVycyAgICAgIC0gMTA0IGJ5dGVzCisgICAgLy8gICA4IGludCByZWdpc3RlcnMgICAgICAgICAgLSAgNjQgYnl0ZXMKKyAgICAibWZsciByMFxuIgorICAgICJzdGQgcjAsICAxNihyMSlcbiIKKyAgICAic3RkdSByMSwgLTI4MChyMSlcbiIKKyAgICAvLyBTYXZlIGFsbCBpbnQgYXJnIHJlZ2lzdGVycworICAgICJzdGQgcjEwLCAyNzIocjEpXG4iICAgICJzdGQgcjksICAyNjQocjEpXG4iCisgICAgInN0ZCByOCwgIDI1NihyMSlcbiIgICAgInN0ZCByNywgIDI0OChyMSlcbiIKKyAgICAic3RkIHI2LCAgMjQwKHIxKVxuIiAgICAic3RkIHI1LCAgMjMyKHIxKVxuIgorICAgICJzdGQgcjQsICAyMjQocjEpXG4iICAgICJzdGQgcjMsICAyMTYocjEpXG4iCisgICAgLy8gU2F2ZSBhbGwgY2FsbC1jbG9iYmVyZWQgRlAgcmVncy4KKyAgICAic3RmZCBmMTMsIDIwOChyMSlcbiIgICAgInN0ZmQgZjEyLCAyMDAocjEpXG4iCisgICAgInN0ZmQgZjExLCAxOTIocjEpXG4iICAgICJzdGZkIGYxMCwgMTg0KHIxKVxuIgorICAgICJzdGZkIGY5LCAgMTc2KHIxKVxuIiAgICAic3RmZCBmOCwgIDE2OChyMSlcbiIKKyAgICAic3RmZCBmNywgIDE2MChyMSlcbiIgICAgInN0ZmQgZjYsICAxNTIocjEpXG4iCisgICAgInN0ZmQgZjUsICAxNDQocjEpXG4iICAgICJzdGZkIGY0LCAgMTM2KHIxKVxuIgorICAgICJzdGZkIGYzLCAgMTI4KHIxKVxuIiAgICAic3RmZCBmMiwgIDEyMChyMSlcbiIKKyAgICAic3RmZCBmMSwgIDExMihyMSlcbiIKKyAgICAvLyBBcmd1bWVudHMgdG8gQ29tcGlsYXRpb24gQ2FsbGJhY2s6CisgICAgLy8gcjMgLSBvdXIgbHIgKGFkZHJlc3Mgb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaW4gc3R1YiBwbHVzIDQpCisgICAgLy8gcjQgLSBzdHViJ3MgbHIgKGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gdGhhdCBjYWxsZWQgdGhlIHN0dWIgcGx1cyA0KQorICAgIC8vIHI1IC0gaXM2NEJpdCAtIGFsd2F5cyAxLgorICAgICJtciAgIHIzLCByMFxuIgorICAgICJsZCAgIHIyLCAyODAocjEpXG4iIC8vIHN0dWIncyBmcmFtZQorICAgICJsZCAgIHI0LCAxNihyMilcbiIgIC8vIHN0dWIncyBscgorICAgICJsaSAgIHI1LCAxXG4iICAgICAgIC8vIDEgPT0gNjQgYml0CisgICAgImJsIF9QUENDb21waWxhdGlvbkNhbGxiYWNrQ1xuIgorICAgICJtdGN0ciByM1xuIgorICAgIC8vIFJlc3RvcmUgYWxsIGludCBhcmcgcmVnaXN0ZXJzCisgICAgImxkIHIxMCwgMjcyKHIxKVxuIiAgICAibGQgcjksICAyNjQocjEpXG4iCisgICAgImxkIHI4LCAgMjU2KHIxKVxuIiAgICAibGQgcjcsICAyNDgocjEpXG4iCisgICAgImxkIHI2LCAgMjQwKHIxKVxuIiAgICAibGQgcjUsICAyMzIocjEpXG4iCisgICAgImxkIHI0LCAgMjI0KHIxKVxuIiAgICAibGQgcjMsICAyMTYocjEpXG4iCisgICAgLy8gUmVzdG9yZSBhbGwgRlAgYXJnIHJlZ2lzdGVycworICAgICJsZmQgZjEzLCAyMDgocjEpXG4iICAgICJsZmQgZjEyLCAyMDAocjEpXG4iCisgICAgImxmZCBmMTEsIDE5MihyMSlcbiIgICAgImxmZCBmMTAsIDE4NChyMSlcbiIKKyAgICAibGZkIGY5LCAgMTc2KHIxKVxuIiAgICAibGZkIGY4LCAgMTY4KHIxKVxuIgorICAgICJsZmQgZjcsICAxNjAocjEpXG4iICAgICJsZmQgZjYsICAxNTIocjEpXG4iCisgICAgImxmZCBmNSwgIDE0NChyMSlcbiIgICAgImxmZCBmNCwgIDEzNihyMSlcbiIKKyAgICAibGZkIGYzLCAgMTI4KHIxKVxuIiAgICAibGZkIGYyLCAgMTIwKHIxKVxuIgorICAgICJsZmQgZjEsICAxMTIocjEpXG4iCisgICAgLy8gUG9wIDMgZnJhbWVzIG9mZiB0aGUgc3RhY2sgYW5kIGJyYW5jaCB0byB0YXJnZXQKKyAgICAibGQgIHIxLCAyODAocjEpXG4iCisgICAgImxkICByMiwgMTYocjEpXG4iCisgICAgIm10bHIgcjJcbiIKKyAgICAiYmN0clxuIgorICAgICk7CisjZWxzZQordm9pZCBQUEM2NENvbXBpbGF0aW9uQ2FsbGJhY2soKSB7CisgIGxsdm1fdW5yZWFjaGFibGUoIlRoaXMgaXMgbm90IGEgcG93ZXIgcGMsIHlvdSBjYW4ndCBleGVjdXRlIHRoaXMhIik7Cit9CisjZW5kaWYKKworZXh0ZXJuICJDIiB2b2lkICpQUENDb21waWxhdGlvbkNhbGxiYWNrQyh1bnNpZ25lZCAqU3R1YkNhbGxBZGRyUGx1czQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpPcmlnQ2FsbEFkZHJQbHVzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpczY0Qml0KSB7CisgIC8vIEFkanVzdCB0aGUgcG9pbnRlciB0byB0aGUgYWRkcmVzcyBvZiB0aGUgY2FsbCBpbnN0cnVjdGlvbiBpbiB0aGUgc3R1YgorICAvLyBlbWl0dGVkIGJ5IGVtaXRGdW5jdGlvblN0dWIsIHJhdGhlciB0aGFuIHRoZSBpbnN0cnVjdGlvbiBhZnRlciBpdC4KKyAgdW5zaWduZWQgKlN0dWJDYWxsQWRkciA9IFN0dWJDYWxsQWRkclBsdXM0IC0gMTsKKyAgdW5zaWduZWQgKk9yaWdDYWxsQWRkciA9IE9yaWdDYWxsQWRkclBsdXM0IC0gMTsKKworICB2b2lkICpUYXJnZXQgPSBKSVRDb21waWxlckZ1bmN0aW9uKFN0dWJDYWxsQWRkcik7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmICpPcmlnQ2FsbEFkZHIgaXMgYSAnYmwnIGluc3RydWN0aW9uLCBhbmQgaWYgd2UgY2FuIHJld3JpdGUKKyAgLy8gaXQgdG8gYnJhbmNoIGRpcmVjdGx5IHRvIHRoZSBkZXN0aW5hdGlvbi4gIElmIHNvLCByZXdyaXRlIGl0IHNvIGl0IGRvZXMgbm90CisgIC8vIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgc3R1YiBhbnltb3JlLgorICB1bnNpZ25lZCBPcmlnQ2FsbEluc3QgPSAqT3JpZ0NhbGxBZGRyOworICBpZiAoKE9yaWdDYWxsSW5zdCA+PiAyNikgPT0gMTgpIHsgICAgIC8vIERpcmVjdCBjYWxsLgorICAgIGludHB0cl90IE9mZnNldCA9ICgoaW50cHRyX3QpVGFyZ2V0IC0gKGludHB0cl90KU9yaWdDYWxsQWRkcikgPj4gMjsKKyAgICAKKyAgICBpZiAoT2Zmc2V0ID49IC0oMSA8PCAyMykgJiYgT2Zmc2V0IDwgKDEgPDwgMjMpKSB7ICAgLy8gSW4gcmFuZ2U/CisgICAgICAvLyBDbGVhciB0aGUgb3JpZ2luYWwgdGFyZ2V0IG91dC4KKyAgICAgIE9yaWdDYWxsSW5zdCAmPSAoNjMgPDwgMjYpIHwgMzsKKyAgICAgIC8vIEZpbGwgaW4gdGhlIG5ldyB0YXJnZXQuCisgICAgICBPcmlnQ2FsbEluc3QgfD0gKE9mZnNldCAmICgoMSA8PCAyNCktMSkpIDw8IDI7CisgICAgICAvLyBSZXBsYWNlIHRoZSBjYWxsLgorICAgICAgKk9yaWdDYWxsQWRkciA9IE9yaWdDYWxsSW5zdDsKKyAgICB9CisgIH0KKworICAvLyBBc3NlcnQgdGhhdCB3ZSBhcmUgY29taW5nIGZyb20gYSBzdHViIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCBvdXIKKyAgLy8gZW1pdEZ1bmN0aW9uU3R1Yi4KKyAgaWYgKCgqU3R1YkNhbGxBZGRyID4+IDI2KSA9PSAxOCkKKyAgICBTdHViQ2FsbEFkZHIgLT0gMzsKKyAgZWxzZSB7CisgIGFzc2VydCgoKlN0dWJDYWxsQWRkciA+PiAyNikgPT0gMTkgJiYgIkNhbGwgaW4gc3R1YiBpcyBub3QgaW5kaXJlY3QhIik7CisgICAgU3R1YkNhbGxBZGRyIC09IGlzNjRCaXQgPyA5IDogNjsKKyAgfQorCisgIC8vIFJld3JpdGUgdGhlIHN0dWIgd2l0aCBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byB0aGUgdGFyZ2V0LCBmb3IgYW55IHVzZXJzCisgIC8vIHdobyB0b29rIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHViLgorICBFbWl0QnJhbmNoVG9BdCgoaW50cHRyX3QpU3R1YkNhbGxBZGRyLCAoaW50cHRyX3QpVGFyZ2V0LCBmYWxzZSwgaXM2NEJpdCk7CisgIHN5czo6TWVtb3J5OjpJbnZhbGlkYXRlSW5zdHJ1Y3Rpb25DYWNoZShTdHViQ2FsbEFkZHIsIDcqNCk7CisKKyAgLy8gUHV0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgZnVuY3Rpb24gdG8gY2FsbCBhbmQgdGhlIGFkZHJlc3MgdG8gcmV0dXJuIHRvCisgIC8vIGFmdGVyIGNhbGxpbmcgdGhlIHRhcmdldCBmdW5jdGlvbiBpbiBhIHBsYWNlIHRoYXQgaXMgZWFzeSB0byBnZXQgb24gdGhlCisgIC8vIHN0YWNrIGFmdGVyIHdlIHJlc3RvcmUgYWxsIHJlZ3MuCisgIHJldHVybiBUYXJnZXQ7Cit9CisKKworCitUYXJnZXRKSVRJbmZvOjpMYXp5UmVzb2x2ZXJGbgorUFBDSklUSW5mbzo6Z2V0TGF6eVJlc29sdmVyRnVuY3Rpb24oSklUQ29tcGlsZXJGbiBGbikgeworICBKSVRDb21waWxlckZ1bmN0aW9uID0gRm47CisgIHJldHVybiBpczY0Qml0ID8gUFBDNjRDb21waWxhdGlvbkNhbGxiYWNrIDogUFBDMzJDb21waWxhdGlvbkNhbGxiYWNrOworfQorCitUYXJnZXRKSVRJbmZvOjpTdHViTGF5b3V0IFBQQ0pJVEluZm86OmdldFN0dWJMYXlvdXQoKSB7CisgIC8vIFRoZSBzdHViIGNvbnRhaW5zIHVwIHRvIDEwIDQtYnl0ZSBpbnN0cnVjdGlvbnMsIGFsaWduZWQgYXQgNCBieXRlczogMworICAvLyBpbnN0cnVjdGlvbnMgdG8gc2F2ZSB0aGUgY2FsbGVyJ3MgYWRkcmVzcyBpZiB0aGlzIGlzIGEgbGF6eS1jb21waWxhdGlvbgorICAvLyBzdHViLCBwbHVzIGEgMS0sIDQtLCBvciA3LWluc3RydWN0aW9uIHNlcXVlbmNlIHRvIGxvYWQgYW4gYXJiaXRyYXJ5IGFkZHJlc3MKKyAgLy8gaW50byBhIHJlZ2lzdGVyIGFuZCBqdW1wIHRocm91Z2ggaXQuCisgIFN0dWJMYXlvdXQgUmVzdWx0ID0gezEwKjQsIDR9OworICByZXR1cm4gUmVzdWx0OworfQorCisjaWYgKGRlZmluZWQoX19QT1dFUlBDX18pIHx8IGRlZmluZWQgKF9fcHBjX18pIHx8IGRlZmluZWQoX1BPV0VSKSkgJiYgXAorZGVmaW5lZChfX0FQUExFX18pCitleHRlcm4gIkMiIHZvaWQgc3lzX2ljYWNoZV9pbnZhbGlkYXRlKGNvbnN0IHZvaWQgKkFkZHIsIHNpemVfdCBsZW4pOworI2VuZGlmCisKK3ZvaWQgKlBQQ0pJVEluZm86OmVtaXRGdW5jdGlvblN0dWIoY29uc3QgRnVuY3Rpb24qIEYsIHZvaWQgKkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRDb2RlRW1pdHRlciAmSkNFKSB7CisgIC8vIElmIHRoaXMgaXMganVzdCBhIGNhbGwgdG8gYW4gZXh0ZXJuYWwgZnVuY3Rpb24sIGVtaXQgYSBicmFuY2ggaW5zdGVhZCBvZiBhCisgIC8vIGNhbGwuICBUaGUgY29kZSBpcyB0aGUgc2FtZSBleGNlcHQgZm9yIG9uZSBiaXQgb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgIGlmIChGbiAhPSAodm9pZCopKGludHB0cl90KVBQQzMyQ29tcGlsYXRpb25DYWxsYmFjayAmJiAKKyAgICAgIEZuICE9ICh2b2lkKikoaW50cHRyX3QpUFBDNjRDb21waWxhdGlvbkNhbGxiYWNrKSB7CisgICAgdm9pZCAqQWRkciA9ICh2b2lkKilKQ0UuZ2V0Q3VycmVudFBDVmFsdWUoKTsKKyAgICBKQ0UuZW1pdFdvcmRCRSgwKTsKKyAgICBKQ0UuZW1pdFdvcmRCRSgwKTsKKyAgICBKQ0UuZW1pdFdvcmRCRSgwKTsKKyAgICBKQ0UuZW1pdFdvcmRCRSgwKTsKKyAgICBKQ0UuZW1pdFdvcmRCRSgwKTsKKyAgICBKQ0UuZW1pdFdvcmRCRSgwKTsKKyAgICBKQ0UuZW1pdFdvcmRCRSgwKTsKKyAgICBFbWl0QnJhbmNoVG9BdCgoaW50cHRyX3QpQWRkciwgKGludHB0cl90KUZuLCBmYWxzZSwgaXM2NEJpdCk7CisgICAgc3lzOjpNZW1vcnk6OkludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKEFkZHIsIDcqNCk7CisgICAgcmV0dXJuIEFkZHI7CisgIH0KKworICB2b2lkICpBZGRyID0gKHZvaWQqKUpDRS5nZXRDdXJyZW50UENWYWx1ZSgpOworICBpZiAoaXM2NEJpdCkgeworICAgIEpDRS5lbWl0V29yZEJFKDB4ZjgyMWZmYjEpOyAgICAgLy8gc3RkdSByMSwtODAocjEpCisgICAgSkNFLmVtaXRXb3JkQkUoMHg3ZDY4MDJhNik7ICAgICAvLyBtZmxyIHIxMQorICAgIEpDRS5lbWl0V29yZEJFKDB4Zjk2MTAwNjApOyAgICAgLy8gc3RkIHIxMSwgOTYocjEpCisgIH0gZWxzZSBpZiAoVE0uZ2V0U3VidGFyZ2V0SW1wbCgpLT5pc0RhcndpbkFCSSgpKXsKKyAgICBKQ0UuZW1pdFdvcmRCRSgweDk0MjFmZmUwKTsgICAgIC8vIHN0d3UgcjEsLTMyKHIxKQorICAgIEpDRS5lbWl0V29yZEJFKDB4N2Q2ODAyYTYpOyAgICAgLy8gbWZsciByMTEKKyAgICBKQ0UuZW1pdFdvcmRCRSgweDkxNjEwMDI4KTsgICAgIC8vIHN0dyByMTEsIDQwKHIxKQorICB9IGVsc2UgeworICAgIEpDRS5lbWl0V29yZEJFKDB4OTQyMWZmZTApOyAgICAgLy8gc3R3dSByMSwtMzIocjEpCisgICAgSkNFLmVtaXRXb3JkQkUoMHg3ZDY4MDJhNik7ICAgICAvLyBtZmxyIHIxMQorICAgIEpDRS5lbWl0V29yZEJFKDB4OTE2MTAwMjQpOyAgICAgLy8gc3R3IHIxMSwgMzYocjEpCisgIH0KKyAgaW50cHRyX3QgQnJhbmNoQWRkciA9IChpbnRwdHJfdClKQ0UuZ2V0Q3VycmVudFBDVmFsdWUoKTsKKyAgSkNFLmVtaXRXb3JkQkUoMCk7CisgIEpDRS5lbWl0V29yZEJFKDApOworICBKQ0UuZW1pdFdvcmRCRSgwKTsKKyAgSkNFLmVtaXRXb3JkQkUoMCk7CisgIEpDRS5lbWl0V29yZEJFKDApOworICBKQ0UuZW1pdFdvcmRCRSgwKTsKKyAgSkNFLmVtaXRXb3JkQkUoMCk7CisgIEVtaXRCcmFuY2hUb0F0KEJyYW5jaEFkZHIsIChpbnRwdHJfdClGbiwgdHJ1ZSwgaXM2NEJpdCk7CisgIHN5czo6TWVtb3J5OjpJbnZhbGlkYXRlSW5zdHJ1Y3Rpb25DYWNoZShBZGRyLCAxMCo0KTsKKyAgcmV0dXJuIEFkZHI7Cit9CisKKwordm9pZCBQUENKSVRJbmZvOjpyZWxvY2F0ZSh2b2lkICpGdW5jdGlvbiwgTWFjaGluZVJlbG9jYXRpb24gKk1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZWxvY3MsIHVuc2lnbmVkIGNoYXIqIEdPVEJhc2UpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1SZWxvY3M7ICsraSwgKytNUikgeworICAgIHVuc2lnbmVkICpSZWxvY1BvcyA9ICh1bnNpZ25lZCopRnVuY3Rpb24gKyBNUi0+Z2V0TWFjaGluZUNvZGVPZmZzZXQoKS80OworICAgIGludHB0cl90IFJlc3VsdFB0ciA9IChpbnRwdHJfdClNUi0+Z2V0UmVzdWx0UG9pbnRlcigpOworICAgIHN3aXRjaCAoKFBQQzo6UmVsb2NhdGlvblR5cGUpTVItPmdldFJlbG9jYXRpb25UeXBlKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHJlbG9jYXRpb24gdHlwZSEiKTsKKyAgICBjYXNlIFBQQzo6cmVsb2NfcGNyZWxfYng6CisgICAgICAvLyBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBiIGFuZCBibCBpbnN0cnVjdGlvbnMuCisgICAgICBSZXN1bHRQdHIgPSAoUmVzdWx0UHRyLShpbnRwdHJfdClSZWxvY1BvcykgPj4gMjsKKyAgICAgIGFzc2VydChSZXN1bHRQdHIgPj0gLSgxIDw8IDIzKSAmJiBSZXN1bHRQdHIgPCAoMSA8PCAyMykgJiYKKyAgICAgICAgICAgICAiUmVsb2NhdGlvbiBvdXQgb2YgcmFuZ2UhIik7CisgICAgICAqUmVsb2NQb3MgfD0gKFJlc3VsdFB0ciAmICgoMSA8PCAyNCktMSkpICA8PCAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUEM6OnJlbG9jX3BjcmVsX2JjeDoKKyAgICAgIC8vIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIEJMVCxCTEUsQkVRLEJHRSxCR1QsQk5FLCBvciBvdGhlcgorICAgICAgLy8gYmN4IGluc3RydWN0aW9ucy4KKyAgICAgIFJlc3VsdFB0ciA9IChSZXN1bHRQdHItKGludHB0cl90KVJlbG9jUG9zKSA+PiAyOworICAgICAgYXNzZXJ0KFJlc3VsdFB0ciA+PSAtKDEgPDwgMTMpICYmIFJlc3VsdFB0ciA8ICgxIDw8IDEzKSAmJgorICAgICAgICAgICAgICJSZWxvY2F0aW9uIG91dCBvZiByYW5nZSEiKTsKKyAgICAgICpSZWxvY1BvcyB8PSAoUmVzdWx0UHRyICYgKCgxIDw8IDE0KS0xKSkgIDw8IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQQzo6cmVsb2NfYWJzb2x1dGVfaGlnaDogICAgIC8vIGhpZ2ggYml0cyBvZiByZWYgLT4gbG93IDE2IG9mIGluc3RyCisgICAgY2FzZSBQUEM6OnJlbG9jX2Fic29sdXRlX2xvdzogeyAgICAvLyBsb3cgYml0cyBvZiByZWYgIC0+IGxvdyAxNiBvZiBpbnN0cgorICAgICAgUmVzdWx0UHRyICs9IE1SLT5nZXRDb25zdGFudFZhbCgpOworCisgICAgICAvLyBJZiB0aGlzIGlzIGEgaGlnaC1wYXJ0IGFjY2VzcywgZ2V0IHRoZSBoaWdoLXBhcnQuCisgICAgICBpZiAoTVItPmdldFJlbG9jYXRpb25UeXBlKCkgPT0gUFBDOjpyZWxvY19hYnNvbHV0ZV9oaWdoKSB7CisgICAgICAgIC8vIElmIHRoZSBsb3cgcGFydCB3aWxsIGhhdmUgYSBjYXJyeSAocmVhbGx5IGEgYm9ycm93KSBmcm9tIHRoZSBsb3cKKyAgICAgICAgLy8gMTYtYml0cyBpbnRvIHRoZSBoaWdoIDE2LCBhZGQgYSBiaXQgdG8gYm9ycm93IGZyb20uCisgICAgICAgIGlmICgoKGludClSZXN1bHRQdHIgPDwgMTYpIDwgMCkKKyAgICAgICAgICBSZXN1bHRQdHIgKz0gMSA8PCAxNjsKKyAgICAgICAgUmVzdWx0UHRyID4+PSAxNjsKKyAgICAgIH0KKworICAgICAgLy8gRG8gdGhlIGFkZGl0aW9uIHRoZW4gbWFzaywgc28gdGhlIGFkZGl0aW9uIGRvZXMgbm90IG92ZXJmbG93IHRoZSAxNi1iaXQKKyAgICAgIC8vIGltbWVkaWF0ZSBzZWN0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgIHVuc2lnbmVkIExvd0JpdHMgID0gKCpSZWxvY1BvcyArIFJlc3VsdFB0cikgJiA2NTUzNTsKKyAgICAgIHVuc2lnbmVkIEhpZ2hCaXRzID0gKlJlbG9jUG9zICYgfjY1NTM1OworICAgICAgKlJlbG9jUG9zID0gTG93Qml0cyB8IEhpZ2hCaXRzOyAgLy8gU2xhbSBpbnRvIGxvdyAxNi1iaXRzCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUEM6OnJlbG9jX2Fic29sdXRlX2xvd19peDogeyAgLy8gbG93IGJpdHMgb2YgcmVmICAtPiBsb3cgMTQgb2YgaW5zdHIKKyAgICAgIFJlc3VsdFB0ciArPSBNUi0+Z2V0Q29uc3RhbnRWYWwoKTsKKyAgICAgIC8vIERvIHRoZSBhZGRpdGlvbiB0aGVuIG1hc2ssIHNvIHRoZSBhZGRpdGlvbiBkb2VzIG5vdCBvdmVyZmxvdyB0aGUgMTYtYml0CisgICAgICAvLyBpbW1lZGlhdGUgc2VjdGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgICB1bnNpZ25lZCBMb3dCaXRzICA9ICgqUmVsb2NQb3MgKyBSZXN1bHRQdHIpICYgMHhGRkZDOworICAgICAgdW5zaWduZWQgSGlnaEJpdHMgPSAqUmVsb2NQb3MgJiAweEZGRkYwMDAzOworICAgICAgKlJlbG9jUG9zID0gTG93Qml0cyB8IEhpZ2hCaXRzOyAgLy8gU2xhbSBpbnRvIGxvdyAxNC1iaXRzLgorICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIFBQQ0pJVEluZm86OnJlcGxhY2VNYWNoaW5lQ29kZUZvckZ1bmN0aW9uKHZvaWQgKk9sZCwgdm9pZCAqTmV3KSB7CisgIEVtaXRCcmFuY2hUb0F0KChpbnRwdHJfdClPbGQsIChpbnRwdHJfdClOZXcsIGZhbHNlLCBpczY0Qml0KTsKKyAgc3lzOjpNZW1vcnk6OkludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKE9sZCwgNyo0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENKSVRJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSklUSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZWFkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDSklUSW5mby5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LSBQUENKSVRJbmZvLmggLSBQb3dlclBDIGltcGwuIG9mIHRoZSBKSVQgaW50ZXJmYWNlIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQb3dlclBDIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRKSVRJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgUE9XRVJQQ19KSVRJTkZPX0gKKyNkZWZpbmUgUE9XRVJQQ19KSVRJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEpJVEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vSklUQ29kZUVtaXR0ZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBQUENUYXJnZXRNYWNoaW5lOworCisgIGNsYXNzIFBQQ0pJVEluZm8gOiBwdWJsaWMgVGFyZ2V0SklUSW5mbyB7CisgIHByb3RlY3RlZDoKKyAgICBQUENUYXJnZXRNYWNoaW5lICZUTTsKKyAgICBib29sIGlzNjRCaXQ7CisgIHB1YmxpYzoKKyAgICBQUENKSVRJbmZvKFBQQ1RhcmdldE1hY2hpbmUgJnRtLCBib29sIHRtSXM2NEJpdCkgOiBUTSh0bSkgeworICAgICAgdXNlR09UID0gMDsKKyAgICAgIGlzNjRCaXQgPSB0bUlzNjRCaXQ7CisgICAgfQorCisgICAgdmlydHVhbCBTdHViTGF5b3V0IGdldFN0dWJMYXlvdXQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgKmVtaXRGdW5jdGlvblN0dWIoY29uc3QgRnVuY3Rpb24qIEYsIHZvaWQgKkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRDb2RlRW1pdHRlciAmSkNFKTsKKyAgICB2aXJ0dWFsIExhenlSZXNvbHZlckZuIGdldExhenlSZXNvbHZlckZ1bmN0aW9uKEpJVENvbXBpbGVyRm4pOworICAgIHZpcnR1YWwgdm9pZCByZWxvY2F0ZSh2b2lkICpGdW5jdGlvbiwgTWFjaGluZVJlbG9jYXRpb24gKk1SLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZWxvY3MsIHVuc2lnbmVkIGNoYXIqIEdPVEJhc2UpOworICAgIAorICAgIC8vLyByZXBsYWNlTWFjaGluZUNvZGVGb3JGdW5jdGlvbiAtIE1ha2UgaXQgc28gdGhhdCBjYWxsaW5nIHRoZSBmdW5jdGlvbgorICAgIC8vLyB3aG9zZSBtYWNoaW5lIGNvZGUgaXMgYXQgT0xEIHR1cm5zIGludG8gYSBjYWxsIHRvIE5FVywgcGVyaGFwcyBieQorICAgIC8vLyBvdmVyd3JpdGluZyBPTEQgd2l0aCBhIGJyYW5jaCB0byBORVcuICBUaGlzIGlzIHVzZWQgZm9yIHNlbGYtbW9kaWZ5aW5nCisgICAgLy8vIGNvZGUuCisgICAgLy8vCisgICAgdmlydHVhbCB2b2lkIHJlcGxhY2VNYWNoaW5lQ29kZUZvckZ1bmN0aW9uKHZvaWQgKk9sZCwgdm9pZCAqTmV3KTsKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDTUNBc21JbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENNQ0FzbUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDRjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDTUNBc21JbmZvLmNwcApAQCAtMCwwICsxLDU3IEBACisvLz09PS0tIFBQQ01DQXNtSW5mby5jcHAgLSBQUEMgYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBNQ0FzbUluZm9EYXJ3aW4gcHJvcGVydGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiUFBDTUNBc21JbmZvLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworUFBDTUNBc21JbmZvRGFyd2luOjpQUENNQ0FzbUluZm9EYXJ3aW4oYm9vbCBpczY0Qml0KSB7CisgIFBDU3ltYm9sID0gIi4iOworICBDb21tZW50U3RyaW5nID0gIjsiOworICBFeGNlcHRpb25zVHlwZSA9IEV4Y2VwdGlvbkhhbmRsaW5nOjpEd2FyZjsKKworICBpZiAoIWlzNjRCaXQpCisgICAgRGF0YTY0Yml0c0RpcmVjdGl2ZSA9IDA7ICAgICAgLy8gV2UgY2FuJ3QgZW1pdCBhIDY0LWJpdCB1bml0IGluIFBQQzMyIG1vZGUuCisgIEFzc2VtYmxlckRpYWxlY3QgPSAxOyAgICAgICAgICAgLy8gTmV3LVN0eWxlIG1uZW1vbmljcy4KKyAgU3VwcG9ydHNEZWJ1Z0luZm9ybWF0aW9uPSB0cnVlOyAvLyBEZWJ1ZyBpbmZvcm1hdGlvbi4KK30KKworUFBDTGludXhNQ0FzbUluZm86OlBQQ0xpbnV4TUNBc21JbmZvKGJvb2wgaXM2NEJpdCkgeworICAvLyAiLmNvbW0gYWxpZ24gaXMgaW4gYnl0ZXMgYnV0IC5hbGlnbiBpcyBwb3ctMi4iCisgIEFsaWdubWVudElzSW5CeXRlcyA9IGZhbHNlOworCisgIENvbW1lbnRTdHJpbmcgPSAiIyI7CisgIEdsb2JhbFByZWZpeCA9ICIiOworICBQcml2YXRlR2xvYmFsUHJlZml4ID0gIi5MIjsKKyAgV2Vha1JlZkRpcmVjdGl2ZSA9ICJcdC53ZWFrXHQiOworICAKKyAgLy8gVXNlcyAnLnNlY3Rpb24nIGJlZm9yZSAnLmJzcycgZGlyZWN0aXZlCisgIFVzZXNFTEZTZWN0aW9uRGlyZWN0aXZlRm9yQlNTID0gdHJ1ZTsgIAorCisgIC8vIERlYnVnIEluZm9ybWF0aW9uCisgIFN1cHBvcnRzRGVidWdJbmZvcm1hdGlvbiA9IHRydWU7CisKKyAgUENTeW1ib2wgPSAiLiI7CisKKyAgLy8gU2V0IHVwIERXQVJGIGRpcmVjdGl2ZXMKKyAgSGFzTEVCMTI4ID0gdHJ1ZTsgIC8vIFRhcmdldCBhc20gc3VwcG9ydHMgbGViMTI4IGRpcmVjdGl2ZXMgKGxpdHRsZS1lbmRpYW4pCisKKyAgLy8gRXhjZXB0aW9ucyBoYW5kbGluZworICBpZiAoIWlzNjRCaXQpCisgICAgRXhjZXB0aW9uc1R5cGUgPSBFeGNlcHRpb25IYW5kbGluZzo6RHdhcmY7CisgICAgCisgIFplcm9EaXJlY3RpdmUgPSAiXHQuc3BhY2VcdCI7CisgIERhdGE2NGJpdHNEaXJlY3RpdmUgPSBpczY0Qml0ID8gIlx0LnF1YWRcdCIgOiAwOworICBIYXNMQ09NTURpcmVjdGl2ZSA9IHRydWU7CisgIEFzc2VtYmxlckRpYWxlY3QgPSAwOyAgICAgICAgICAgLy8gT2xkLVN0eWxlIG1uZW1vbmljcy4KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ01DQXNtSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ01DQXNtSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YWU2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDTUNBc21JbmZvLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT09PS0tIFBQQ01DQXNtSW5mby5oIC0gUFBDIGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLS09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNQ0FzbUluZm9EYXJ3aW4gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQUENUQVJHRVRBU01JTkZPX0gKKyNkZWZpbmUgUFBDVEFSR0VUQVNNSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mb0Rhcndpbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgc3RydWN0IFBQQ01DQXNtSW5mb0RhcndpbiA6IHB1YmxpYyBNQ0FzbUluZm9EYXJ3aW4geworICAgIGV4cGxpY2l0IFBQQ01DQXNtSW5mb0Rhcndpbihib29sIGlzNjRCaXQpOworICB9OworCisgIHN0cnVjdCBQUENMaW51eE1DQXNtSW5mbyA6IHB1YmxpYyBNQ0FzbUluZm8geworICAgIGV4cGxpY2l0IFBQQ0xpbnV4TUNBc21JbmZvKGJvb2wgaXM2NEJpdCk7CisgIH07CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDTWFjaGluZUZ1bmN0aW9uSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ01hY2hpbmVGdW5jdGlvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjY0OWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ01hY2hpbmVGdW5jdGlvbkluZm8uaApAQCAtMCwwICsxLDEzMiBAQAorLy89PT0tLSBQUENNYWNoaW5lRnVuY3Rpb25JbmZvLmggLSBQcml2YXRlIGRhdGEgdXNlZCBmb3IgUG93ZXJQQyAtLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFBvd2VyUEMgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgTWFjaGluZUZ1bmN0aW9uSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFBQQ19NQUNISU5FX0ZVTkNUSU9OX0lORk9fSAorI2RlZmluZSBQUENfTUFDSElORV9GVU5DVElPTl9JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUFBDRnVuY3Rpb25JbmZvIC0gVGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gTWFjaGluZUZ1bmN0aW9uIHByaXZhdGUKKy8vLyBQb3dlclBDIHRhcmdldC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBNYWNoaW5lRnVuY3Rpb24uCitjbGFzcyBQUENGdW5jdGlvbkluZm8gOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uSW5mbyB7Citwcml2YXRlOgorICAvLy8gRnJhbWVQb2ludGVyU2F2ZUluZGV4IC0gRnJhbWUgaW5kZXggb2Ygd2hlcmUgdGhlIG9sZCBmcmFtZSBwb2ludGVyIGlzCisgIC8vLyBzdG9yZWQuICBBbHNvIHVzZWQgYXMgYW4gYW5jaG9yIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFsdGVyZWQKKyAgLy8vIHdoZW4gdXNpbmcgZnJhbWUgcG9pbnRlcnMgKGR5bmFfYWRkLCBkeW5hX3N1Yi4pCisgIGludCBGcmFtZVBvaW50ZXJTYXZlSW5kZXg7CisgIAorICAvLy8gUmV0dXJuQWRkclNhdmVJbmRleCAtIEZyYW1lIGluZGV4IG9mIHdoZXJlIHRoZSByZXR1cm4gYWRkcmVzcyBpcyBzdG9yZWQuCisgIC8vLworICBpbnQgUmV0dXJuQWRkclNhdmVJbmRleDsKKworICAvLy8gTXVzdFNhdmVMUiAtIEluZGljYXRlcyB3aGV0aGVyIExSIGlzIGRlZmluZWQgKG9yIGNsb2JiZXJlZCkgaW4gdGhlIGN1cnJlbnQKKyAgLy8vIGZ1bmN0aW9uLiAgVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHRoZSBpbml0aWFsIHNjYW4gb2YgdGhlIGZ1bmN0aW9uIGJ5CisgIC8vLyBQRUkuCisgIGJvb2wgTXVzdFNhdmVMUjsKKworICAvLy8gU3BpbGxzQ1IgLSBJbmRpY2F0ZXMgd2hldGhlciBDUiBpcyBzcGlsbGVkIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBib29sIFNwaWxsc0NSOworCisgIC8vLyBMUlN0b3JlUmVxdWlyZWQgLSBUaGUgYm9vbCBpbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBpcyBzb21lIGV4cGxpY2l0IHVzZSBvZgorICAvLy8gdGhlIExSL0xSOCBzdGFjayBzbG90IHRoYXQgaXMgbm90IG9idmlvdXMgZnJvbSBzY2FubmluZyB0aGUgY29kZS4gIFRoaXMKKyAgLy8vIHJlcXVpcmVzIHRoYXQgdGhlIGNvZGUgZ2VuZXJhdG9yIHByb2R1Y2UgYSBzdG9yZSBvZiBMUiB0byB0aGUgc3RhY2sgb24KKyAgLy8vIGVudHJ5LCBldmVuIHRob3VnaCBMUiBtYXkgb3RoZXJ3aXNlIGFwcGFyZW50bHkgbm90IGJlIHVzZWQuCisgIGJvb2wgTFJTdG9yZVJlcXVpcmVkOworCisgIC8vLyBNaW5SZXNlcnZlZEFyZWEgLSBUaGlzIGlzIHRoZSBmcmFtZSBzaXplIHRoYXQgaXMgYXQgbGVhc3QgcmVzZXJ2ZWQgaW4gYQorICAvLy8gcG90ZW50aWFsIGNhbGxlciAocGFyYW1ldGVyK2xpbmthZ2UgYXJlYSkuCisgIHVuc2lnbmVkIE1pblJlc2VydmVkQXJlYTsKKworICAvLy8gVGFpbENhbGxTUERlbHRhIC0gU3RhY2sgcG9pbnRlciBkZWx0YSB1c2VkIHdoZW4gdGFpbCBjYWxsaW5nLiBNYXhpbXVtCisgIC8vLyBhbW91bnQgdGhlIHN0YWNrIHBvaW50ZXIgaXMgYWRqdXN0ZWQgdG8gbWFrZSB0aGUgZnJhbWUgYmlnZ2VyIGZvciB0YWlsCisgIC8vLyBjYWxscy4gVXNlZCBmb3IgY3JlYXRpbmcgYW4gYXJlYSBiZWZvcmUgdGhlIHJlZ2lzdGVyIHNwaWxsIGFyZWEuCisgIGludCBUYWlsQ2FsbFNQRGVsdGE7CisKKyAgLy8vIEhhc0Zhc3RDYWxsIC0gRG9lcyB0aGlzIGZ1bmN0aW9uIGNvbnRhaW4gYSBmYXN0IGNhbGwuIFVzZWQgdG8gZGV0ZXJtaW5lCisgIC8vLyBob3cgdGhlIGNhbGxlcidzIHN0YWNrIHBvaW50ZXIgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgKGVwaWxvZy9keW5hbWljYWxsb2MpLgorICBib29sIEhhc0Zhc3RDYWxsOworCisgIC8vLyBWYXJBcmdzRnJhbWVJbmRleCAtIEZyYW1lSW5kZXggZm9yIHN0YXJ0IG9mIHZhcmFyZ3MgYXJlYS4KKyAgaW50IFZhckFyZ3NGcmFtZUluZGV4OworICAvLy8gVmFyQXJnc1N0YWNrT2Zmc2V0IC0gU3RhY2tPZmZzZXQgZm9yIHN0YXJ0IG9mIHN0YWNrCisgIC8vLyBhcmd1bWVudHMuCisgIGludCBWYXJBcmdzU3RhY2tPZmZzZXQ7CisgIC8vLyBWYXJBcmdzTnVtR1BSIC0gSW5kZXggb2YgdGhlIGZpcnN0IHVudXNlZCBpbnRlZ2VyCisgIC8vLyByZWdpc3RlciBmb3IgcGFyYW1ldGVyIHBhc3NpbmcuCisgIHVuc2lnbmVkIFZhckFyZ3NOdW1HUFI7CisgIC8vLyBWYXJBcmdzTnVtRlBSIC0gSW5kZXggb2YgdGhlIGZpcnN0IHVudXNlZCBkb3VibGUKKyAgLy8vIHJlZ2lzdGVyIGZvciBwYXJhbWV0ZXIgcGFzc2luZy4KKyAgdW5zaWduZWQgVmFyQXJnc051bUZQUjsKKworcHVibGljOgorICBleHBsaWNpdCBQUENGdW5jdGlvbkluZm8oTWFjaGluZUZ1bmN0aW9uICZNRikgCisgICAgOiBGcmFtZVBvaW50ZXJTYXZlSW5kZXgoMCksCisgICAgICBSZXR1cm5BZGRyU2F2ZUluZGV4KDApLAorICAgICAgU3BpbGxzQ1IoZmFsc2UpLAorICAgICAgTFJTdG9yZVJlcXVpcmVkKGZhbHNlKSwKKyAgICAgIE1pblJlc2VydmVkQXJlYSgwKSwKKyAgICAgIFRhaWxDYWxsU1BEZWx0YSgwKSwKKyAgICAgIEhhc0Zhc3RDYWxsKGZhbHNlKSwKKyAgICAgIFZhckFyZ3NGcmFtZUluZGV4KDApLAorICAgICAgVmFyQXJnc1N0YWNrT2Zmc2V0KDApLAorICAgICAgVmFyQXJnc051bUdQUigwKSwKKyAgICAgIFZhckFyZ3NOdW1GUFIoMCkge30KKworICBpbnQgZ2V0RnJhbWVQb2ludGVyU2F2ZUluZGV4KCkgY29uc3QgeyByZXR1cm4gRnJhbWVQb2ludGVyU2F2ZUluZGV4OyB9CisgIHZvaWQgc2V0RnJhbWVQb2ludGVyU2F2ZUluZGV4KGludCBJZHgpIHsgRnJhbWVQb2ludGVyU2F2ZUluZGV4ID0gSWR4OyB9CisgIAorICBpbnQgZ2V0UmV0dXJuQWRkclNhdmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFJldHVybkFkZHJTYXZlSW5kZXg7IH0KKyAgdm9pZCBzZXRSZXR1cm5BZGRyU2F2ZUluZGV4KGludCBpZHgpIHsgUmV0dXJuQWRkclNhdmVJbmRleCA9IGlkeDsgfQorCisgIHVuc2lnbmVkIGdldE1pblJlc2VydmVkQXJlYSgpIGNvbnN0IHsgcmV0dXJuIE1pblJlc2VydmVkQXJlYTsgfQorICB2b2lkIHNldE1pblJlc2VydmVkQXJlYSh1bnNpZ25lZCBzaXplKSB7IE1pblJlc2VydmVkQXJlYSA9IHNpemU7IH0KKworICBpbnQgZ2V0VGFpbENhbGxTUERlbHRhKCkgY29uc3QgeyByZXR1cm4gVGFpbENhbGxTUERlbHRhOyB9CisgIHZvaWQgc2V0VGFpbENhbGxTUERlbHRhKGludCBzaXplKSB7IFRhaWxDYWxsU1BEZWx0YSA9IHNpemU7IH0KKworICAvLy8gTXVzdFNhdmVMUiAtIFRoaXMgaXMgc2V0IHdoZW4gdGhlIHByb2xvZy9lcGlsb2cgaW5zZXJ0ZXIgZG9lcyBpdHMgaW5pdGlhbAorICAvLy8gc2NhbiBvZiB0aGUgZnVuY3Rpb24uIEl0IGlzIHRydWUgaWYgdGhlIExSL0xSOCByZWdpc3RlciBpcyBldmVyIGV4cGxpY2l0bHkKKyAgLy8vIGRlZmluZWQvY2xvYmJlcmVkIGluIHRoZSBtYWNoaW5lIGZ1bmN0aW9uIChlLmcuIGJ5IGNhbGxzIGFuZCBtb3ZwY3RvbHIsCisgIC8vLyB3aGljaCBpcyB1c2VkIGluIFBJQyBnZW5lcmF0aW9uKSwgb3IgaWYgdGhlIExSIHN0YWNrIHNsb3QgaXMgZXhwbGljaXRseQorICAvLy8gcmVmZXJlbmNlZCBieSBidWlsdGluX3JldHVybl9hZGRyZXNzLgorICB2b2lkIHNldE11c3RTYXZlTFIoYm9vbCBVKSB7IE11c3RTYXZlTFIgPSBVOyB9CisgIGJvb2wgbXVzdFNhdmVMUigpIGNvbnN0ICAgIHsgcmV0dXJuIE11c3RTYXZlTFI7IH0KKworICB2b2lkIHNldFNwaWxsc0NSKCkgICAgICAgeyBTcGlsbHNDUiA9IHRydWU7IH0KKyAgYm9vbCBpc0NSU3BpbGxlZCgpIGNvbnN0IHsgcmV0dXJuIFNwaWxsc0NSOyB9CisKKyAgdm9pZCBzZXRMUlN0b3JlUmVxdWlyZWQoKSB7IExSU3RvcmVSZXF1aXJlZCA9IHRydWU7IH0KKyAgYm9vbCBpc0xSU3RvcmVSZXF1aXJlZCgpIGNvbnN0IHsgcmV0dXJuIExSU3RvcmVSZXF1aXJlZDsgfQorCisgIHZvaWQgc2V0SGFzRmFzdENhbGwoKSB7IEhhc0Zhc3RDYWxsID0gdHJ1ZTsgfQorICBib29sIGhhc0Zhc3RDYWxsKCkgY29uc3QgeyByZXR1cm4gSGFzRmFzdENhbGw7fQorCisgIGludCBnZXRWYXJBcmdzRnJhbWVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFZhckFyZ3NGcmFtZUluZGV4OyB9CisgIHZvaWQgc2V0VmFyQXJnc0ZyYW1lSW5kZXgoaW50IEluZGV4KSB7IFZhckFyZ3NGcmFtZUluZGV4ID0gSW5kZXg7IH0KKworICBpbnQgZ2V0VmFyQXJnc1N0YWNrT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gVmFyQXJnc1N0YWNrT2Zmc2V0OyB9CisgIHZvaWQgc2V0VmFyQXJnc1N0YWNrT2Zmc2V0KGludCBPZmZzZXQpIHsgVmFyQXJnc1N0YWNrT2Zmc2V0ID0gT2Zmc2V0OyB9CisKKyAgdW5zaWduZWQgZ2V0VmFyQXJnc051bUdQUigpIGNvbnN0IHsgcmV0dXJuIFZhckFyZ3NOdW1HUFI7IH0KKyAgdm9pZCBzZXRWYXJBcmdzTnVtR1BSKHVuc2lnbmVkIE51bSkgeyBWYXJBcmdzTnVtR1BSID0gTnVtOyB9CisKKyAgdW5zaWduZWQgZ2V0VmFyQXJnc051bUZQUigpIGNvbnN0IHsgcmV0dXJuIFZhckFyZ3NOdW1GUFI7IH0KKyAgdm9pZCBzZXRWYXJBcmdzTnVtRlBSKHVuc2lnbmVkIE51bSkgeyBWYXJBcmdzTnVtRlBSID0gTnVtOyB9Cit9OworCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgbGx2bQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1BlcmZlY3RTaHVmZmxlLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDUGVyZmVjdFNodWZmbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY0ZTMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1BlcmZlY3RTaHVmZmxlLmgKQEAgLTAsMCArMSw2NTg2IEBACisvLz09PS0tIFBQQ1BlcmZlY3RTaHVmZmxlLmggLSBBbHRpdmVjIFBlcmZlY3QgU2h1ZmZsZSBUYWJsZSAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSwgd2hpY2ggd2FzIGF1dG9nZW5lcmF0ZWQgYnkgbGx2bS1QZXJmZWN0U2h1ZmZsZSwgY29udGFpbnMgZGF0YQorLy8gZm9yIHRoZSBvcHRpbWFsIHdheSB0byBidWlsZCBhIHBlcmZlY3Qgc2h1ZmZsZSB3aXRob3V0IHVzaW5nIHZwZXJtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIDMxIGVudHJpZXMgaGF2ZSBjb3N0IDAKKy8vIDI5MiBlbnRyaWVzIGhhdmUgY29zdCAxCisvLyAxMzg0IGVudHJpZXMgaGF2ZSBjb3N0IDIKKy8vIDMwNjEgZW50cmllcyBoYXZlIGNvc3QgMworLy8gMTczMyBlbnRyaWVzIGhhdmUgY29zdCA0CisvLyA2MCBlbnRyaWVzIGhhdmUgY29zdCA1CisKKy8vIFRoaXMgdGFibGUgaXMgNjU2MSo0ID0gMjYyNDQgYnl0ZXMgaW4gc2l6ZS4KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBQZXJmZWN0U2h1ZmZsZVRhYmxlWzY1NjErMV0gPSB7CisgIDIwMjE2MjI3OFUsCS8vIDwwLDAsMCwwPjogQ29zdCAxIHZzcGx0aXN3MCBMSFMKKyAgMTE0MDg1MDc5MFUsCS8vIDwwLDAsMCwxPjogQ29zdCAyIHZtcmdodyA8MCwwLDAsMD4sIExIUworICAyNjE3MjQ3MTgxVSwJLy8gPDAsMCwwLDI+OiBDb3N0IDMgdnNsZG9pNCA8MCwwLDAsMD4sIDwyLDAsMywwPgorICAyNjM1MTYzNzg3VSwJLy8gPDAsMCwwLDM+OiBDb3N0IDMgdnNsZG9pNCA8MywwLDAsMD4sIDwzLDAsMCwwPgorICAxNTQzNTA3MjU0VSwJLy8gPDAsMCwwLDQ+OiBDb3N0IDIgdnNsZG9pNCA8MCwwLDAsMD4sIFJIUworICAyMjgxNzAxNzA1VSwJLy8gPDAsMCwwLDU+OiBDb3N0IDMgdm1yZ2x3IDwwLDAsMCwwPiwgPDAsNCwwLDU+CisgIDI2MTcyNTAxMzNVLAkvLyA8MCwwLDAsNj46IENvc3QgMyB2c2xkb2k0IDwwLDAsMCwwPiwgPDYsMCw3LDA+CisgIDI2NTkwNTQ1NzVVLAkvLyA8MCwwLDAsNz46IENvc3QgMyB2c2xkb2k0IDw3LDAsMCwwPiwgPDcsMCwwLDA+CisgIDIwMjE2MjI3OFUsCS8vIDwwLDAsMCx1PjogQ29zdCAxIHZzcGx0aXN3MCBMSFMKKyAgMTE0MTY4NjI4MlUsCS8vIDwwLDAsMSwwPjogQ29zdCAyIHZtcmdodyBMSFMsIDwwLDAsMSwxPgorICA2Nzk0NDU1MFUsCS8vIDwwLDAsMSwxPjogQ29zdCAxIHZtcmdodyBMSFMsIExIUworICAxNjg1MjQxOTU4VSwJLy8gPDAsMCwxLDI+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMiwzLDA+LCBMSFMKKyAgMjIxNTg3MDcxNlUsCS8vIDwwLDAsMSwzPjogQ29zdCAzIHZtcmdodyBMSFMsIDwwLDMsMSwwPgorICAxMTQxNzI3NTcwVSwJLy8gPDAsMCwxLDQ+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDAsNCwxLDU+CisgIDIyMTU0Mjg1NjJVLAkvLyA8MCwwLDEsNT46IENvc3QgMyB2bXJnaHcgTEhTLCA8MCw1LDYsNz4KKyAgMjIxNTQyODU4OVUsCS8vIDwwLDAsMSw2PjogQ29zdCAzIHZtcmdodyBMSFMsIDwwLDYsMCw3PgorICAyNjU5MDYyNzY4VSwJLy8gPDAsMCwxLDc+OiBDb3N0IDMgdnNsZG9pNCA8NywwLDAsMT4sIDw3LDAsMCwxPgorICA2Nzk0NTExN1UsCS8vIDwwLDAsMSx1PjogQ29zdCAxIHZtcmdodyBMSFMsIExIUworICAyNjg0MzU2MDQ1VSwJLy8gPDAsMCwyLDA+OiBDb3N0IDMgdnNsZG9pOCA8MCwwLDAsMD4sIDwyLDAsMywwPgorICAyMjE2MDA5ODMwVSwJLy8gPDAsMCwyLDE+OiBDb3N0IDMgdm1yZ2h3IDwwLDIsMSwyPiwgTEhTCisgIDIyMTYwMDk5MDFVLAkvLyA8MCwwLDIsMj46IENvc3QgMyB2bXJnaHcgPDAsMiwxLDI+LCA8MCwyLDEsMj4KKyAgMjY5ODI5MDg1M1UsCS8vIDwwLDAsMiwzPjogQ29zdCAzIHZzbGRvaTggPDIsMywwLDA+LCA8MiwzLDAsMD4KKyAgMzI4OTc1MTg5MFUsCS8vIDwwLDAsMiw0PjogQ29zdCA0IHZtcmdodyA8MCwyLDEsMj4sIDwwLDQsMSw1PgorICAzNzU4MDk4Mjc1VSwJLy8gPDAsMCwyLDU+OiBDb3N0IDQgdnNsZG9pOCA8MCwwLDAsMD4sIDwyLDUsMywxPgorICAyNjg0MzU2NTM4VSwJLy8gPDAsMCwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8MCwwLDAsMD4sIDwyLDYsMyw3PgorICAzNzU4MDk4NDEwVSwJLy8gPDAsMCwyLDc+OiBDb3N0IDQgdnNsZG9pOCA8MCwwLDAsMD4sIDwyLDcsMCwxPgorICAyMjE2MDEwMzk3VSwJLy8gPDAsMCwyLHU+OiBDb3N0IDMgdm1yZ2h3IDwwLDIsMSwyPiwgTEhTCisgIDI3MDIyNzI2NTFVLAkvLyA8MCwwLDMsMD46IENvc3QgMyB2c2xkb2k4IDwzLDAsMCwwPiwgPDMsMCwwLDA+CisgIDIyMTY2NTY5OThVLAkvLyA8MCwwLDMsMT46IENvc3QgMyB2bXJnaHcgPDAsMywxLDA+LCBMSFMKKyAgMzg0NDY2OTcwNFUsCS8vIDwwLDAsMywyPjogQ29zdCA0IHZzbGRvaTEyIDwzLDIsMywwPiwgPDAsMywyLDM+CisgIDIyMTY2NTcxNDhVLAkvLyA8MCwwLDMsMz46IENvc3QgMyB2bXJnaHcgPDAsMywxLDA+LCA8MCwzLDEsMD4KKyAgMjY4NDM1NzEyMlUsCS8vIDwwLDAsMyw0PjogQ29zdCAzIHZzbGRvaTggPDAsMCwwLDA+LCA8Myw0LDUsNj4KKyAgMzczMjgyMDA2NlUsCS8vIDwwLDAsMyw1PjogQ29zdCA0IHZzbGRvaTQgPDcsMCwwLDM+LCA8NSw2LDcsMD4KKyAgMzc3ODAwNTYyNFUsCS8vIDwwLDAsMyw2PjogQ29zdCA0IHZzbGRvaTggPDMsMywwLDA+LCA8Myw2LDAsNz4KKyAgMzM3NDcxMzQ2NFUsCS8vIDwwLDAsMyw3PjogQ29zdCA0IHZtcmdsdyA8MywyLDAsMz4sIDwzLDYsMCw3PgorICAyMjE2NjU3NTY1VSwJLy8gPDAsMCwzLHU+OiBDb3N0IDMgdm1yZ2h3IDwwLDMsMSwwPiwgTEhTCisgIDIyMTczNjE0MDhVLAkvLyA8MCwwLDQsMD46IENvc3QgMyB2bXJnaHcgPDAsNCwxLDU+LCA8MCwwLDAsMD4KKyAgMTE0MzYxOTY4NlUsCS8vIDwwLDAsNCwxPjogQ29zdCAyIHZtcmdodyA8MCw0LDEsNT4sIExIUworICAzMjkxMTAzNDA1VSwJLy8gPDAsMCw0LDI+OiBDb3N0IDQgdm1yZ2h3IDwwLDQsMSw1PiwgPDAsMiwxLDI+CisgIDM4MjcyNjk5ODhVLAkvLyA8MCwwLDQsMz46IENvc3QgNCB2c2xkb2kxMiA8MCwzLDEsMD4sIDwwLDQsMyw1PgorICAxMTQzNjE5OTIyVSwJLy8gPDAsMCw0LDQ+OiBDb3N0IDIgdm1yZ2h3IDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDE2MTA2MTYxMThVLAkvLyA8MCwwLDQsNT46IENvc3QgMiB2c2xkb2k4IDwwLDAsMCwwPiwgUkhTCisgIDM3NTgwOTk4MzNVLAkvLyA8MCwwLDQsNj46IENvc3QgNCB2c2xkb2k4IDwwLDAsMCwwPiwgPDQsNiw1LDI+CisgIDM4NTQxMDcwMTZVLAkvLyA8MCwwLDQsNz46IENvc3QgNCB2c2xkb2kxMiA8NCw3LDUsMD4sIDwwLDQsNyw1PgorICAxMTQzNjIwMjUzVSwJLy8gPDAsMCw0LHU+OiBDb3N0IDIgdm1yZ2h3IDwwLDQsMSw1PiwgTEhTCisgIDIyODQzOTY1NDRVLAkvLyA8MCwwLDUsMD46IENvc3QgMyB2bXJnbHcgPDAsNCwwLDU+LCA8MCwwLDAsMD4KKyAgMjIxODAyNTA2MlUsCS8vIDwwLDAsNSwxPjogQ29zdCAzIHZtcmdodyA8MCw1LDEsNT4sIExIUworICAzNzU4MTAwMjAzVSwJLy8gPDAsMCw1LDI+OiBDb3N0IDQgdnNsZG9pOCA8MCwwLDAsMD4sIDw1LDIsMSwzPgorICAzMzk1OTY2MTAwVSwJLy8gPDAsMCw1LDM+OiBDb3N0IDQgdm1yZ2x3IDw2LDcsMCw1PiwgPDcsMiwwLDM+CisgIDM4MDQ1NDkwNTJVLAkvLyA8MCwwLDUsND46IENvc3QgNCB2c2xkb2k4IDw3LDcsMCwwPiwgPDUsNCw2LDU+CisgIDIzMDIzMTQ5NjRVLAkvLyA8MCwwLDUsNT46IENvc3QgMyB2bXJnbHcgPDMsNCwwLDU+LCA8Myw0LDAsNT4KKyAgMjc4NTgyMTEzOFUsCS8vIDwwLDAsNSw2PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDAsNSw2LDc+CisgIDMzOTU5NjY0MjhVLAkvLyA8MCwwLDUsNz46IENvc3QgNCB2bXJnbHcgPDYsNywwLDU+LCA8Nyw2LDAsNz4KKyAgMjc4NzE0ODI2MFUsCS8vIDwwLDAsNSx1PjogQ29zdCAzIHZzbGRvaTEyIDw1LHUsNywwPiwgPDAsNSx1LDc+CisgIDI2ODQzNTg5OTdVLAkvLyA8MCwwLDYsMD46IENvc3QgMyB2c2xkb2k4IDwwLDAsMCwwPiwgPDYsMCw3LDA+CisgIDIyMTg2MzEyNzBVLAkvLyA8MCwwLDYsMT46IENvc3QgMyB2bXJnaHcgPDAsNiwwLDc+LCBMSFMKKyAgMjY4NDM1OTE2MlUsCS8vIDwwLDAsNiwyPjogQ29zdCAzIHZzbGRvaTggPDAsMCwwLDA+LCA8NiwyLDcsMz4KKyAgMzc1ODEwMTA0MlUsCS8vIDwwLDAsNiwzPjogQ29zdCA0IHZzbGRvaTggPDAsMCwwLDA+LCA8NiwzLDQsNT4KKyAgMzczMjg0MzgzMFUsCS8vIDwwLDAsNiw0PjogQ29zdCA0IHZzbGRvaTQgPDcsMCwwLDY+LCBSSFMKKyAgMzc1ODEwMTIyN1UsCS8vIDwwLDAsNiw1PjogQ29zdCA0IHZzbGRvaTggPDAsMCwwLDA+LCA8Niw1LDcsMT4KKyAgMjY4NDM1OTQ4MFUsCS8vIDwwLDAsNiw2PjogQ29zdCAzIHZzbGRvaTggPDAsMCwwLDA+LCA8Niw2LDYsNj4KKyAgMjcyNDgzNjE3M1UsCS8vIDwwLDAsNiw3PjogQ29zdCAzIHZzbGRvaTggPDYsNywwLDA+LCA8Niw3LDAsMD4KKyAgMjcyNTQ5OTgwNlUsCS8vIDwwLDAsNix1PjogQ29zdCAzIHZzbGRvaTggPDYsdSwwLDA+LCA8Nix1LDAsMD4KKyAgMjcyNjE2MzQzOVUsCS8vIDwwLDAsNywwPjogQ29zdCAzIHZzbGRvaTggPDcsMCwwLDA+LCA8NywwLDAsMD4KKyAgMjIxOTMxMTIwNlUsCS8vIDwwLDAsNywxPjogQ29zdCAzIHZtcmdodyA8MCw3LDEsMD4sIExIUworICAzODY4NTU3OTAwVSwJLy8gPDAsMCw3LDI+OiBDb3N0IDQgdnNsZG9pMTIgPDcsMiwzLDA+LCA8MCw3LDIsMz4KKyAgMzM3NzQwMDExMlUsCS8vIDwwLDAsNywzPjogQ29zdCA0IHZtcmdsdyA8Myw2LDAsNz4sIDwzLDIsMCwzPgorICAyNjg0MzYwMDM4VSwJLy8gPDAsMCw3LDQ+OiBDb3N0IDMgdnNsZG9pOCA8MCwwLDAsMD4sIDw3LDQsNSw2PgorICAzNzMyODUyODM0VSwJLy8gPDAsMCw3LDU+OiBDb3N0IDQgdnNsZG9pNCA8NywwLDAsNz4sIDw1LDYsNywwPgorICAzODcxNTA3MDYwVSwJLy8gPDAsMCw3LDY+OiBDb3N0IDQgdnNsZG9pMTIgPDcsNiw3LDA+LCA8MCw3LDYsNz4KKyAgMjMwMzY1ODYxNlUsCS8vIDwwLDAsNyw3PjogQ29zdCAzIHZtcmdsdyA8Myw2LDAsNz4sIDwzLDYsMCw3PgorICAyNzI2MTYzNDM5VSwJLy8gPDAsMCw3LHU+OiBDb3N0IDMgdnNsZG9pOCA8NywwLDAsMD4sIDw3LDAsMCwwPgorICAyMDIxNjIyNzhVLAkvLyA8MCwwLHUsMD46IENvc3QgMSB2c3BsdGlzdzAgTEhTCisgIDcyNTg5NDE0VSwJLy8gPDAsMCx1LDE+OiBDb3N0IDEgdm1yZ2h3IExIUywgTEhTCisgIDE2ODUyNDI1MjVVLAkvLyA8MCwwLHUsMj46IENvc3QgMiB2c2xkb2kxMiA8MSwyLDMsMD4sIExIUworICAyMjIwMDczMjEyVSwJLy8gPDAsMCx1LDM+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDAsMywxLDA+CisgIDExNDYzMzE0NzRVLAkvLyA8MCwwLHUsND46IENvc3QgMiB2bXJnaHcgTEhTLCA8MCw0LDEsNT4KKyAgMTYxMDYxOTAzNFUsCS8vIDwwLDAsdSw1PjogQ29zdCAyIHZzbGRvaTggPDAsMCwwLDA+LCBSSFMKKyAgMjc4NTgyMTEzOFUsCS8vIDwwLDAsdSw2PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDAsNSw2LDc+CisgIDI2NTkxMjAxMTlVLAkvLyA8MCwwLHUsNz46IENvc3QgMyB2c2xkb2k0IDw3LDAsMCx1PiwgPDcsMCwwLHU+CisgIDcyNTg5OTgxVSwJLy8gPDAsMCx1LHU+OiBDb3N0IDEgdm1yZ2h3IExIUywgTEhTCisgIDI2OTgyOTczNDRVLAkvLyA8MCwxLDAsMD46IENvc3QgMyB2c2xkb2k4IDwyLDMsMCwxPiwgPDAsMCwwLDA+CisgIDE2MjQ1NTU2MjJVLAkvLyA8MCwxLDAsMT46IENvc3QgMiB2c2xkb2k4IDwyLDMsMCwxPiwgTEhTCisgIDI3NTg5ODQ0MjhVLAkvLyA8MCwxLDAsMj46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsMD4sIDwxLDAsMiwxPgorICAyNjM1MjM3NTI0VSwJLy8gPDAsMSwwLDM+OiBDb3N0IDMgdnNsZG9pNCA8MywwLDEsMD4sIDwzLDAsMSwwPgorICAyNjkzNjUyODE4VSwJLy8gPDAsMSwwLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MSw1LDAsMT4sIDwwLDQsMSw1PgorICAyMjgxNzAxNzE0VSwJLy8gPDAsMSwwLDU+OiBDb3N0IDMgdm1yZ2x3IDwwLDAsMCwwPiwgPDAsNCwxLDU+CisgIDI2OTgyOTc4NDZVLAkvLyA8MCwxLDAsNj46IENvc3QgMyB2c2xkb2k4IDwyLDMsMCwxPiwgPDAsNiwxLDc+CisgIDI2NTkxMjgzMTJVLAkvLyA8MCwxLDAsNz46IENvc3QgMyB2c2xkb2k0IDw3LDAsMSwwPiwgPDcsMCwxLDA+CisgIDE2MjQ1NTYxODlVLAkvLyA8MCwxLDAsdT46IENvc3QgMiB2c2xkb2k4IDwyLDMsMCwxPiwgTEhTCisgIDE1NDM1ODU4MDJVLAkvLyA8MCwxLDEsMD46IENvc3QgMiB2c2xkb2k0IDwwLDAsMSwxPiwgPDAsMCwxLDE+CisgIDExNDE3MjgwNTJVLAkvLyA8MCwxLDEsMT46IENvc3QgMiB2bXJnaHcgTEhTLCA8MSwxLDEsMT4KKyAgMTE0MTcyODE1MFUsCS8vIDwwLDEsMSwyPjogQ29zdCAyIHZtcmdodyBMSFMsIDwxLDIsMywwPgorICAyMjk1NjQ0MzM0VSwJLy8gPDAsMSwxLDM+OiBDb3N0IDMgdm1yZ2x3IDwyLDMsMCwxPiwgPDAsMiwxLDM+CisgIDE1NDM1ODkxNzRVLAkvLyA8MCwxLDEsND46IENvc3QgMiB2c2xkb2k0IDwwLDAsMSwxPiwgUkhTCisgIDIyOTA5OTk2MzRVLAkvLyA8MCwxLDEsNT46IENvc3QgMyB2bXJnbHcgPDEsNSwwLDE+LCA8MCw0LDEsNT4KKyAgMjYxNzMzMjEzNVUsCS8vIDwwLDEsMSw2PjogQ29zdCAzIHZzbGRvaTQgPDAsMCwxLDE+LCA8NiwxLDcsMT4KKyAgMjYxNzMzMjcyMFUsCS8vIDwwLDEsMSw3PjogQ29zdCAzIHZzbGRvaTQgPDAsMCwxLDE+LCA8NywwLDAsMT4KKyAgMTE0MjE3MTAwNFUsCS8vIDwwLDEsMSx1PjogQ29zdCAyIHZtcmdodyBMSFMsIDwxLHUsMywwPgorICAxNTYxNTA5OTkwVSwJLy8gPDAsMSwyLDA+OiBDb3N0IDIgdnNsZG9pNCA8MywwLDEsMj4sIExIUworICAyNjIzMzA4NTE2VSwJLy8gPDAsMSwyLDE+OiBDb3N0IDMgdnNsZG9pNCA8MSwwLDEsMj4sIDwxLDAsMSwyPgorICAyNjk4Mjk4OTg0VSwJLy8gPDAsMSwyLDI+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDAsMT4sIDwyLDIsMiwyPgorICA4MzU1ODRVLAkvLyA8MCwxLDIsMz46IENvc3QgMCBjb3B5IExIUworICAxNTYxNTEzMjcwVSwJLy8gPDAsMSwyLDQ+OiBDb3N0IDIgdnNsZG9pNCA8MywwLDEsMj4sIFJIUworICAyNjQ3MTk5MzA0VSwJLy8gPDAsMSwyLDU+OiBDb3N0IDMgdnNsZG9pNCA8NSwwLDEsMj4sIDw1LDAsMSwyPgorICAyNjk4Mjk5MzIyVSwJLy8gPDAsMSwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDAsMT4sIDwyLDYsMyw3PgorICAxNTg1NDAyODc0VSwJLy8gPDAsMSwyLDc+OiBDb3N0IDIgdnNsZG9pNCA8NywwLDEsMj4sIDw3LDAsMSwyPgorICA4MzU1ODRVLAkvLyA8MCwxLDIsdT46IENvc3QgMCBjb3B5IExIUworICAyNjk4Mjk5NTQwVSwJLy8gPDAsMSwzLDA+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDAsMT4sIDwzLDAsMSwwPgorICAzMjkwMzk5NTQwVSwJLy8gPDAsMSwzLDE+OiBDb3N0IDQgdm1yZ2h3IDwwLDMsMSwwPiwgPDEsMSwxLDE+CisgIDI2OTgyOTk3MjBVLAkvLyA8MCwxLDMsMj46IENvc3QgMyB2c2xkb2k4IDwyLDMsMCwxPiwgPDMsMiwzLDA+CisgIDI2OTgyOTk4MDRVLAkvLyA8MCwxLDMsMz46IENvc3QgMyB2c2xkb2k4IDwyLDMsMCwxPiwgPDMsMywzLDM+CisgIDI2OTgyOTk5MDZVLAkvLyA8MCwxLDMsND46IENvc3QgMyB2c2xkb2k4IDwyLDMsMCwxPiwgPDMsNCw1LDY+CisgIDM4MzI3MjY1MjFVLAkvLyA8MCwxLDMsNT46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsMD4sIDwxLDMsNSwwPgorICAyNzI0ODQyMTYwVSwJLy8gPDAsMSwzLDY+OiBDb3N0IDMgdnNsZG9pOCA8Niw3LDAsMT4sIDwzLDYsNywwPgorICAyNzA2OTI2Mjc1VSwJLy8gPDAsMSwzLDc+OiBDb3N0IDMgdnNsZG9pOCA8Myw3LDAsMT4sIDwzLDcsMCwxPgorICAyNjk4MzAwMTkwVSwJLy8gPDAsMSwzLHU+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDAsMT4sIDwzLHUsMSwyPgorICAyNjM1MjY4MTk4VSwJLy8gPDAsMSw0LDA+OiBDb3N0IDMgdnNsZG9pNCA8MywwLDEsND4sIExIUworICAyMjE3MzYyMjI4VSwJLy8gPDAsMSw0LDE+OiBDb3N0IDMgdm1yZ2h3IDwwLDQsMSw1PiwgPDEsMSwxLDE+CisgIDIyMTczNjIzMjZVLAkvLyA8MCwxLDQsMj46IENvc3QgMyB2bXJnaHcgPDAsNCwxLDU+LCA8MSwyLDMsMD4KKyAgMjYzNTI3MDI5NlUsCS8vIDwwLDEsNCwzPjogQ29zdCAzIHZzbGRvaTQgPDMsMCwxLDQ+LCA8MywwLDEsND4KKyAgMjYzNTI3MTQ3OFUsCS8vIDwwLDEsNCw0PjogQ29zdCAzIHZzbGRvaTQgPDMsMCwxLDQ+LCBSSFMKKyAgMTYyNDU1ODkwMlUsCS8vIDwwLDEsNCw1PjogQ29zdCAyIHZzbGRvaTggPDIsMywwLDE+LCBSSFMKKyAgMjY1OTE2MDkxMFUsCS8vIDwwLDEsNCw2PjogQ29zdCAzIHZzbGRvaTQgPDcsMCwxLDQ+LCA8Niw3LDAsMT4KKyAgMjY1OTE2MTA4NFUsCS8vIDwwLDEsNCw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMCwxLDQ+LCA8NywwLDEsND4KKyAgMTYyNDU1OTE0NVUsCS8vIDwwLDEsNCx1PjogQ29zdCAyIHZzbGRvaTggPDIsMywwLDE+LCBSSFMKKyAgMzgzMjcyNjYzOVUsCS8vIDwwLDEsNSwwPjogQ29zdCA0IHZzbGRvaTEyIDwxLDIsMywwPiwgPDEsNSwwLDE+CisgIDI3MTQ4ODk4NzFVLAkvLyA8MCwxLDUsMT46IENvc3QgMyB2c2xkb2k4IDw1LDEsMCwxPiwgPDUsMSwwLDE+CisgIDIzMDIzMTQ2NDZVLAkvLyA8MCwxLDUsMj46IENvc3QgMyB2bXJnbHcgPDMsNCwwLDU+LCA8MywwLDEsMj4KKyAgMzgzNDcxNzMyMVUsCS8vIDwwLDEsNSwzPjogQ29zdCA0IHZzbGRvaTEyIDwxLDUsMywwPiwgPDEsNSwzLDA+CisgIDM4MzI3MjY2NzlVLAkvLyA8MCwxLDUsND46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsMD4sIDwxLDUsNCw1PgorICAyNzE3NTQ0NDAzVSwJLy8gPDAsMSw1LDU+OiBDb3N0IDMgdnNsZG9pOCA8NSw1LDAsMT4sIDw1LDUsMCwxPgorICAyNzE4MjA4MDM2VSwJLy8gPDAsMSw1LDY+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDAsMT4sIDw1LDYsMCwxPgorICAzNzkyNjEzNDkzVSwJLy8gPDAsMSw1LDc+OiBDb3N0IDQgdnNsZG9pOCA8NSw3LDAsMT4sIDw1LDcsMCwxPgorICAyNzE5NTM1MzAyVSwJLy8gPDAsMSw1LHU+OiBDb3N0IDMgdnNsZG9pOCA8NSx1LDAsMT4sIDw1LHUsMCwxPgorICAyNjU5MTcyNDU0VSwJLy8gPDAsMSw2LDA+OiBDb3N0IDMgdnNsZG9pNCA8NywwLDEsNj4sIExIUworICAzODMyNzI2NzM1VSwJLy8gPDAsMSw2LDE+OiBDb3N0IDQgdnNsZG9pMTIgPDEsMiwzLDA+LCA8MSw2LDEsNz4KKyAgMjcyNDg0NDAyNlUsCS8vIDwwLDEsNiwyPjogQ29zdCAzIHZzbGRvaTggPDYsNywwLDE+LCA8NiwyLDcsMz4KKyAgMzc3NTM2MTYwOFUsCS8vIDwwLDEsNiwzPjogQ29zdCA0IHZzbGRvaTggPDIsdSwwLDE+LCA8NiwzLDcsMD4KKyAgMjY1OTE3NTczNFUsCS8vIDwwLDEsNiw0PjogQ29zdCAzIHZzbGRvaTQgPDcsMCwxLDY+LCBSSFMKKyAgMzgzMjcyNjc3MVUsCS8vIDwwLDEsNiw1PjogQ29zdCA0IHZzbGRvaTEyIDwxLDIsMywwPiwgPDEsNiw1LDc+CisgIDI3MjQ4NDQzNDRVLAkvLyA8MCwxLDYsNj46IENvc3QgMyB2c2xkb2k4IDw2LDcsMCwxPiwgPDYsNiw2LDY+CisgIDE2NTExMDI1NDJVLAkvLyA8MCwxLDYsNz46IENvc3QgMiB2c2xkb2k4IDw2LDcsMCwxPiwgPDYsNywwLDE+CisgIDE2NTE3NjYxNzVVLAkvLyA8MCwxLDYsdT46IENvc3QgMiB2c2xkb2k4IDw2LHUsMCwxPiwgPDYsdSwwLDE+CisgIDI3MjQ4NDQ1MzZVLAkvLyA8MCwxLDcsMD46IENvc3QgMyB2c2xkb2k4IDw2LDcsMCwxPiwgPDcsMCwxLDA+CisgIDMzNzczOTc3NzBVLAkvLyA8MCwxLDcsMT46IENvc3QgNCB2bXJnbHcgPDMsNiwwLDc+LCA8MCwwLDEsMT4KKyAgMjY5ODMwMjYzNlUsCS8vIDwwLDEsNywyPjogQ29zdCAzIHZzbGRvaTggPDIsMywwLDE+LCA8NywyLDMsMD4KKyAgMjcyODE2MjUzMVUsCS8vIDwwLDEsNywzPjogQ29zdCAzIHZzbGRvaTggPDcsMywwLDE+LCA8NywzLDAsMT4KKyAgMjcyNDg0NDkwMlUsCS8vIDwwLDEsNyw0PjogQ29zdCAzIHZzbGRvaTggPDYsNywwLDE+LCA8Nyw0LDUsNj4KKyAgMzM3NzM5ODA5OFUsCS8vIDwwLDEsNyw1PjogQ29zdCA0IHZtcmdsdyA8Myw2LDAsNz4sIDwwLDQsMSw1PgorICAyNzI0ODQ1MDc2VSwJLy8gPDAsMSw3LDY+OiBDb3N0IDMgdnNsZG9pOCA8Niw3LDAsMT4sIDw3LDYsNywwPgorICAyNzI0ODQ1MTY0VSwJLy8gPDAsMSw3LDc+OiBDb3N0IDMgdnNsZG9pOCA8Niw3LDAsMT4sIDw3LDcsNyw3PgorICAyNzI0ODQ1MTg2VSwJLy8gPDAsMSw3LHU+OiBDb3N0IDMgdnNsZG9pOCA8Niw3LDAsMT4sIDw3LHUsMSwyPgorICAxNTYxNTU5MTQyVSwJLy8gPDAsMSx1LDA+OiBDb3N0IDIgdnNsZG9pNCA8MywwLDEsdT4sIExIUworICAxMTQ2MzMxOTU2VSwJLy8gPDAsMSx1LDE+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDEsMSwxLDE+CisgIDExNDYzMzIwNTRVLAkvLyA8MCwxLHUsMj46IENvc3QgMiB2bXJnaHcgTEhTLCA8MSwyLDMsMD4KKyAgODM1NTg0VSwJLy8gPDAsMSx1LDM+OiBDb3N0IDAgY29weSBMSFMKKyAgMTU2MTU2MjQyMlUsCS8vIDwwLDEsdSw0PjogQ29zdCAyIHZzbGRvaTQgPDMsMCwxLHU+LCBSSFMKKyAgMTYyNDU2MTgxOFUsCS8vIDwwLDEsdSw1PjogQ29zdCAyIHZzbGRvaTggPDIsMywwLDE+LCBSSFMKKyAgMjIyMDA3NDE5MVUsCS8vIDwwLDEsdSw2PjogQ29zdCAzIHZtcmdodyBMSFMsIDwxLDYsMSw3PgorICAxNTg1NDUyMDMyVSwJLy8gPDAsMSx1LDc+OiBDb3N0IDIgdnNsZG9pNCA8NywwLDEsdT4sIDw3LDAsMSx1PgorICA4MzU1ODRVLAkvLyA8MCwxLHUsdT46IENvc3QgMCBjb3B5IExIUworICAyMjE0NTkzOTk3VSwJLy8gPDAsMiwwLDA+OiBDb3N0IDMgdm1yZ2h3IDwwLDAsMCwwPiwgPDIsMCwzLDA+CisgIDIyMTQ2NzU5OTlVLAkvLyA8MCwyLDAsMT46IENvc3QgMyB2bXJnaHcgPDAsMCwxLDE+LCA8MiwxLDMsMT4KKyAgMjIxNDU5NDE1MlUsCS8vIDwwLDIsMCwyPjogQ29zdCAzIHZtcmdodyA8MCwwLDAsMD4sIDwyLDIsMiwyPgorICAxMjA3OTU5NjU0VSwJLy8gPDAsMiwwLDM+OiBDb3N0IDIgdm1yZ2x3IDwwLDAsMCwwPiwgTEhTCisgIDM3MDkwNTQyNjJVLAkvLyA8MCwyLDAsND46IENvc3QgNCB2c2xkb2k0IDwzLDAsMiwwPiwgUkhTCisgIDMzNzUzNTA4MzZVLAkvLyA8MCwyLDAsNT46IENvc3QgNCB2bXJnbHcgPDMsMywwLDA+LCA8MSw0LDIsNT4KKyAgMjIxNDU5NDQ5MFUsCS8vIDwwLDIsMCw2PjogQ29zdCAzIHZtcmdodyA8MCwwLDAsMD4sIDwyLDYsMyw3PgorICAzMjg4MzM2MzYyVSwJLy8gPDAsMiwwLDc+OiBDb3N0IDQgdm1yZ2h3IDwwLDAsMCwwPiwgPDIsNywwLDE+CisgIDEyMDc5NTk2NTlVLAkvLyA8MCwyLDAsdT46IENvc3QgMiB2bXJnbHcgPDAsMCwwLDA+LCBMSFMKKyAgMjIxNTg3MTk5NFUsCS8vIDwwLDIsMSwwPjogQ29zdCAzIHZtcmdodyBMSFMsIDwyLDAsdSwwPgorICAyMjE1NDcwNjIzVSwJLy8gPDAsMiwxLDE+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDIsMSwzLDE+CisgIDExNDE3Mjg4NzJVLAkvLyA8MCwyLDEsMj46IENvc3QgMiB2bXJnaHcgTEhTLCA8MiwyLDIsMj4KKyAgMTE0MTcyODkzNFUsCS8vIDwwLDIsMSwzPjogQ29zdCAyIHZtcmdodyBMSFMsIDwyLDMsMCwxPgorICAyMjE1ODcyMzIzVSwJLy8gPDAsMiwxLDQ+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDIsNCx1LDU+CisgIDIyMTU4NzI0MDVVLAkvLyA8MCwyLDEsNT46IENvc3QgMyB2bXJnaHcgTEhTLCA8Miw1LHUsNj4KKyAgMTE0MTcyOTIxMFUsCS8vIDwwLDIsMSw2PjogQ29zdCAyIHZtcmdodyBMSFMsIDwyLDYsMyw3PgorICAyMjE1NDMwMTIyVSwJLy8gPDAsMiwxLDc+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDIsNywwLDE+CisgIDExNDE3MjkzNjhVLAkvLyA8MCwyLDEsdT46IENvc3QgMiB2bXJnaHcgTEhTLCA8Mix1LDMsMz4KKyAgMzI4OTczNjY5OFUsCS8vIDwwLDIsMiwwPjogQ29zdCA0IHZtcmdodyA8MCwyLDEsMD4sIDwyLDAsdSwwPgorICAzMjg5NzQ0OTI3VSwJLy8gPDAsMiwyLDE+OiBDb3N0IDQgdm1yZ2h3IDwwLDIsMSwxPiwgPDIsMSwzLDE+CisgIDIyMTYwMTEzNjhVLAkvLyA8MCwyLDIsMj46IENvc3QgMyB2bXJnaHcgPDAsMiwxLDI+LCA8MiwyLDIsMj4KKyAgMjIxNjAxOTYyMlUsCS8vIDwwLDIsMiwzPjogQ29zdCAzIHZtcmdodyA8MCwyLDEsMz4sIDwyLDMsMCwxPgorICAzMjg5NzY5Nzk1VSwJLy8gPDAsMiwyLDQ+OiBDb3N0IDQgdm1yZ2h3IDwwLDIsMSw0PiwgPDIsNCx1LDU+CisgIDMyODk3NzgwNjlVLAkvLyA8MCwyLDIsNT46IENvc3QgNCB2bXJnaHcgPDAsMiwxLDU+LCA8Miw1LHUsNj4KKyAgMjIxNjA0NDQ3NFUsCS8vIDwwLDIsMiw2PjogQ29zdCAzIHZtcmdodyA8MCwyLDEsNj4sIDwyLDYsMyw3PgorICAzNzMyOTYwMjU5VSwJLy8gPDAsMiwyLDc+OiBDb3N0IDQgdnNsZG9pNCA8NywwLDIsMj4sIDw3LDAsMiwyPgorICAyMjE2MDYxMDE2VSwJLy8gPDAsMiwyLHU+OiBDb3N0IDMgdm1yZ2h3IDwwLDIsMSx1PiwgPDIsdSwzLDM+CisgIDI3NTg5ODUzODJVLAkvLyA8MCwyLDMsMD46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsMD4sIDwyLDMsMCwxPgorICAyNzU4OTg1MzkyVSwJLy8gPDAsMiwzLDE+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDA+LCA8MiwzLDEsMj4KKyAgMzI5MDQwMDM2MFUsCS8vIDwwLDIsMywyPjogQ29zdCA0IHZtcmdodyA8MCwzLDEsMD4sIDwyLDIsMiwyPgorICAyNzU4OTg1NDA4VSwJLy8gPDAsMiwzLDM+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDA+LCA8MiwzLDMsMD4KKyAgMjc1ODk4NTQyMlUsCS8vIDwwLDIsMyw0PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMywwPiwgPDIsMyw0LDU+CisgIDI3ODU4MjI0MjRVLAkvLyA8MCwyLDMsNT46IENvc3QgMyB2c2xkb2kxMiA8NSw2LDcsMD4sIDwyLDMsNSw2PgorICAzMjkwNDAwNjk4VSwJLy8gPDAsMiwzLDY+OiBDb3N0IDQgdm1yZ2h3IDwwLDMsMSwwPiwgPDIsNiwzLDc+CisgIDI3NjU5MTU4NzZVLAkvLyA8MCwyLDMsNz46IENvc3QgMyB2c2xkb2kxMiA8MiwzLDcsMD4sIDwyLDMsNywwPgorICAyNzU4OTg1NDUzVSwJLy8gPDAsMiwzLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDA+LCA8MiwzLHUsMD4KKyAgMzI5MTEwNDc2MlUsCS8vIDwwLDIsNCwwPjogQ29zdCA0IHZtcmdodyA8MCw0LDEsNT4sIDwyLDAsdSwwPgorICAyMjE3MzYyOTc5VSwJLy8gPDAsMiw0LDE+OiBDb3N0IDMgdm1yZ2h3IDwwLDQsMSw1PiwgPDIsMSwzLDU+CisgIDIyMTczNjMwNDhVLAkvLyA8MCwyLDQsMj46IENvc3QgMyB2bXJnaHcgPDAsNCwxLDU+LCA8MiwyLDIsMj4KKyAgMjIxNzM2MzExMFUsCS8vIDwwLDIsNCwzPjogQ29zdCAzIHZtcmdodyA8MCw0LDEsNT4sIDwyLDMsMCwxPgorICAzMjkxMTA1MDg3VSwJLy8gPDAsMiw0LDQ+OiBDb3N0IDQgdm1yZ2h3IDwwLDQsMSw1PiwgPDIsNCx1LDE+CisgIDMyOTExMDUxNzNVLAkvLyA8MCwyLDQsNT46IENvc3QgNCB2bXJnaHcgPDAsNCwxLDU+LCA8Miw1LHUsNj4KKyAgMjIxNzM2MzM4NlUsCS8vIDwwLDIsNCw2PjogQ29zdCAzIHZtcmdodyA8MCw0LDEsNT4sIDwyLDYsMyw3PgorICAzNzg4NjM5Njg4VSwJLy8gPDAsMiw0LDc+OiBDb3N0IDQgdnNsZG9pOCA8NSwxLDAsMj4sIDw0LDcsNSwwPgorICAyMjE3MzYzNTE1VSwJLy8gPDAsMiw0LHU+OiBDb3N0IDMgdm1yZ2h3IDwwLDQsMSw1PiwgPDIsdSwwLDE+CisgIDMzNzYwNTQzNzFVLAkvLyA8MCwyLDUsMD46IENvc3QgNCB2bXJnbHcgPDMsNCwwLDU+LCA8MCwxLDIsMD4KKyAgMzc4ODYzOTg4OFUsCS8vIDwwLDIsNSwxPjogQ29zdCA0IHZzbGRvaTggPDUsMSwwLDI+LCA8NSwxLDAsMj4KKyAgMzM3NjA1NTkxMlUsCS8vIDwwLDIsNSwyPjogQ29zdCA0IHZtcmdsdyA8Myw0LDAsNT4sIDwyLDIsMiwyPgorICAyMzAyMzEyNTUwVSwJLy8gPDAsMiw1LDM+OiBDb3N0IDMgdm1yZ2x3IDwzLDQsMCw1PiwgTEhTCisgIDMzNzYwNTQzNzVVLAkvLyA8MCwyLDUsND46IENvc3QgNCB2bXJnbHcgPDMsNCwwLDU+LCA8MCwxLDIsND4KKyAgMzM3NDcyODI0NFUsCS8vIDwwLDIsNSw1PjogQ29zdCA0IHZtcmdsdyA8MywyLDAsNT4sIDwxLDQsMiw1PgorICAzODA1MjI5MTU0VSwJLy8gPDAsMiw1LDY+OiBDb3N0IDQgdnNsZG9pOCA8Nyx1LDAsMj4sIDw1LDYsNywwPgorICAzMzc2MDU1NTEyVSwJLy8gPDAsMiw1LDc+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsMCw1PiwgPDEsNiwyLDc+CisgIDIzMDIzMTI1NTVVLAkvLyA8MCwyLDUsdT46IENvc3QgMyB2bXJnbHcgPDMsNCwwLDU+LCBMSFMKKyAgMzcwOTEwMDEzNFUsCS8vIDwwLDIsNiwwPjogQ29zdCA0IHZzbGRvaTQgPDMsMCwyLDY+LCBMSFMKKyAgMzcwOTEwMDk1MFUsCS8vIDwwLDIsNiwxPjogQ29zdCA0IHZzbGRvaTQgPDMsMCwyLDY+LCA8MSwyLDMsMD4KKyAgMzcwOTEwMjAxMFUsCS8vIDwwLDIsNiwyPjogQ29zdCA0IHZzbGRvaTQgPDMsMCwyLDY+LCA8Miw2LDMsNz4KKyAgMjc1ODk4NTY1OFUsCS8vIDwwLDIsNiwzPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMywwPiwgPDIsNiwzLDc+CisgIDM3MDkxMDM0MTRVLAkvLyA8MCwyLDYsND46IENvc3QgNCB2c2xkb2k0IDwzLDAsMiw2PiwgUkhTCisgIDM3MzI5OTIwOThVLAkvLyA8MCwyLDYsNT46IENvc3QgNCB2c2xkb2k0IDw3LDAsMiw2PiwgPDUsNiw3LDA+CisgIDMyOTIzNzQ5NzBVLAkvLyA8MCwyLDYsNj46IENvc3QgNCB2bXJnaHcgPDAsNiwwLDc+LCA8Miw2LDMsNz4KKyAgMzc5ODU5NDM4M1UsCS8vIDwwLDIsNiw3PjogQ29zdCA0IHZzbGRvaTggPDYsNywwLDI+LCA8Niw3LDAsMj4KKyAgMjc1ODk4NTcwM1UsCS8vIDwwLDIsNix1PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMywwPiwgPDIsNix1LDc+CisgIDM3ODg2NDEyNzRVLAkvLyA8MCwyLDcsMD46IENvc3QgNCB2c2xkb2k4IDw1LDEsMCwyPiwgPDcsMCwxLDI+CisgIDMzNzczOTg1MDhVLAkvLyA8MCwyLDcsMT46IENvc3QgNCB2bXJnbHcgPDMsNiwwLDc+LCA8MSwwLDIsMT4KKyAgMzM3NzM5ODU5MFUsCS8vIDwwLDIsNywyPjogQ29zdCA0IHZtcmdsdyA8Myw2LDAsNz4sIDwxLDEsMiwyPgorICAyMzAzNjU2MDM4VSwJLy8gPDAsMiw3LDM+OiBDb3N0IDMgdm1yZ2x3IDwzLDYsMCw3PiwgTEhTCisgIDM3MDkxMTE2MDZVLAkvLyA8MCwyLDcsND46IENvc3QgNCB2c2xkb2k0IDwzLDAsMiw3PiwgUkhTCisgIDMzNzczOTg4MzZVLAkvLyA8MCwyLDcsNT46IENvc3QgNCB2bXJnbHcgPDMsNiwwLDc+LCA8MSw0LDIsNT4KKyAgMzgwMzkwMzQ0N1UsCS8vIDwwLDIsNyw2PjogQ29zdCA0IHZzbGRvaTggPDcsNiwwLDI+LCA8Nyw2LDAsMj4KKyAgMzI5MzA1NDk1NFUsCS8vIDwwLDIsNyw3PjogQ29zdCA0IHZtcmdodyA8MCw3LDEsMD4sIDwyLDcsMCwxPgorICAyMzAzNjU2MDQzVSwJLy8gPDAsMiw3LHU+OiBDb3N0IDMgdm1yZ2x3IDwzLDYsMCw3PiwgTEhTCisgIDIyMjAwNzQ0OTBVLAkvLyA8MCwyLHUsMD46IENvc3QgMyB2bXJnaHcgTEhTLCA8MiwwLHUsMD4KKyAgMjIyMDA3NDUyN1UsCS8vIDwwLDIsdSwxPjogQ29zdCAzIHZtcmdodyBMSFMsIDwyLDEsMywxPgorICAxMTQ2MzMyNzc2VSwJLy8gPDAsMix1LDI+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDIsMiwyLDI+CisgIDExNDYzMzI4MzhVLAkvLyA8MCwyLHUsMz46IENvc3QgMiB2bXJnaHcgTEhTLCA8MiwzLDAsMT4KKyAgMjIyMDA3NDgxOVUsCS8vIDwwLDIsdSw0PjogQ29zdCAzIHZtcmdodyBMSFMsIDwyLDQsdSw1PgorICAyMjIwMDc0OTAxVSwJLy8gPDAsMix1LDU+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDIsNSx1LDY+CisgIDExNDYzMzMxMTRVLAkvLyA8MCwyLHUsNj46IENvc3QgMiB2bXJnaHcgTEhTLCA8Miw2LDMsNz4KKyAgMjIyMDA3NDk4NlUsCS8vIDwwLDIsdSw3PjogQ29zdCAzIHZtcmdodyBMSFMsIDwyLDcsMCwxPgorICAxMTQ2MzMzMjQzVSwJLy8gPDAsMix1LHU+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDIsdSwwLDE+CisgIDI2Mjk0MTA4MTZVLAkvLyA8MCwzLDAsMD46IENvc3QgMyB2c2xkb2k0IDwyLDAsMywwPiwgPDAsMCwwLDA+CisgIDI3NTM1MzAwMDZVLAkvLyA8MCwzLDAsMT46IENvc3QgMyB2c2xkb2kxMiA8MCwzLDEsMD4sIDwzLDAsMSwyPgorICAyNjI5NDEyMzAxVSwJLy8gPDAsMywwLDI+OiBDb3N0IDMgdnNsZG9pNCA8MiwwLDMsMD4sIDwyLDAsMywwPgorICAyMjE0NTk0OTcyVSwJLy8gPDAsMywwLDM+OiBDb3N0IDMgdm1yZ2h3IDwwLDAsMCwwPiwgPDMsMywzLDM+CisgIDI3NTg5ODU5MDhVLAkvLyA8MCwzLDAsND46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsMD4sIDwzLDAsNCw1PgorICAzNzMzMDE2Njc0VSwJLy8gPDAsMywwLDU+OiBDb3N0IDQgdnNsZG9pNCA8NywwLDMsMD4sIDw1LDYsNywwPgorICAzNzc3MzY0NDg4VSwJLy8gPDAsMywwLDY+OiBDb3N0IDQgdnNsZG9pOCA8MywyLDAsMz4sIDwwLDYsMyw3PgorICAyMjgxNzAzMzU0VSwJLy8gPDAsMywwLDc+OiBDb3N0IDMgdm1yZ2x3IDwwLDAsMCwwPiwgPDIsNiwzLDc+CisgIDI3NTg5ODU5NDFVLAkvLyA8MCwzLDAsdT46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsMD4sIDwzLDAsdSwyPgorICAxMTQxNzI5NDMwVSwJLy8gPDAsMywxLDA+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDMsMCwxLDI+CisgIDIyMTU0NzEzMzRVLAkvLyA8MCwzLDEsMT46IENvc3QgMyB2bXJnaHcgTEhTLCA8MywxLDEsMT4KKyAgMjIxNTQ3MTQyNVUsCS8vIDwwLDMsMSwyPjogQ29zdCAzIHZtcmdodyBMSFMsIDwzLDIsMiwyPgorICAxMTQxNzI5NjkyVSwJLy8gPDAsMywxLDM+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDMsMywzLDM+CisgIDExNDE3Mjk3OTRVLAkvLyA8MCwzLDEsND46IENvc3QgMiB2bXJnaHcgTEhTLCA8Myw0LDUsNj4KKyAgMjIxNTQzMDczOFUsCS8vIDwwLDMsMSw1PjogQ29zdCAzIHZtcmdodyBMSFMsIDwzLDUsNSw1PgorICAyMjE1NDMwNzc2VSwJLy8gPDAsMywxLDY+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDMsNiwwLDc+CisgIDIyOTU2NDYxMzhVLAkvLyA8MCwzLDEsNz46IENvc3QgMyB2bXJnbHcgPDIsMywwLDE+LCA8Miw2LDMsNz4KKyAgMTE0MTczMDA3OFUsCS8vIDwwLDMsMSx1PjogQ29zdCAyIHZtcmdodyBMSFMsIDwzLHUsMSwyPgorICAyNzU4OTg2MDMyVSwJLy8gPDAsMywyLDA+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDA+LCA8MywyLDAsMz4KKyAgMzcwOTE0MTkxMFUsCS8vIDwwLDMsMiwxPjogQ29zdCA0IHZzbGRvaTQgPDMsMCwzLDI+LCA8MSwyLDMsMD4KKyAgMzI4OTc1MzkyMVUsCS8vIDwwLDMsMiwyPjogQ29zdCA0IHZtcmdodyA8MCwyLDEsMj4sIDwzLDIsMiwyPgorICAyNzcwOTI5OTkyVSwJLy8gPDAsMywyLDM+OiBDb3N0IDMgdnNsZG9pMTIgPDMsMiwzLDA+LCA8MywyLDMsMD4KKyAgMzI4OTc1NDExNFUsCS8vIDwwLDMsMiw0PjogQ29zdCA0IHZtcmdodyA8MCwyLDEsMj4sIDwzLDQsNSw2PgorICAzMzYyMDk1NDYwVSwJLy8gPDAsMywyLDU+OiBDb3N0IDUgdm1yZ2x3IDwxLDEsMCwyPiwgPDAsNCwzLDU+CisgIDM4MzI3Mjc5MTBVLAkvLyA8MCwzLDIsNj46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsMD4sIDwzLDIsNiwzPgorICAzMzY1NDE0ODQyVSwJLy8gPDAsMywyLDc+OiBDb3N0IDQgdm1yZ2x3IDwxLDYsMCwyPiwgPDIsNiwzLDc+CisgIDI3NzEyOTg2NzdVLAkvLyA8MCwzLDIsdT46IENvc3QgMyB2c2xkb2kxMiA8MywyLHUsMD4sIDwzLDIsdSwwPgorICAyMjE2NjU5MDk0VSwJLy8gPDAsMywzLDA+OiBDb3N0IDMgdm1yZ2h3IDwwLDMsMSwwPiwgPDMsMCwxLDI+CisgIDMyOTA0MDkxOTBVLAkvLyA8MCwzLDMsMT46IENvc3QgNCB2bXJnaHcgPDAsMywxLDE+LCA8MywxLDEsMT4KKyAgMjcwMzYyNDQ5NlUsCS8vIDwwLDMsMywyPjogQ29zdCAzIHZzbGRvaTggPDMsMiwwLDM+LCA8MywyLDAsMz4KKyAgMjIxNjY4MzkzMlUsCS8vIDwwLDMsMywzPjogQ29zdCAzIHZtcmdodyA8MCwzLDEsMz4sIDwzLDMsMywzPgorICAyMjE2NjkyMjI2VSwJLy8gPDAsMywzLDQ+OiBDb3N0IDMgdm1yZ2h3IDwwLDMsMSw0PiwgPDMsNCw1LDY+CisgIDM3MzMwNDEyNTBVLAkvLyA8MCwzLDMsNT46IENvc3QgNCB2c2xkb2k0IDw3LDAsMywzPiwgPDUsNiw3LDA+CisgIDM4MzI3Mjc5ODhVLAkvLyA8MCwzLDMsNj46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsMD4sIDwzLDMsNiwwPgorICAzMzc0NzEyNzYyVSwJLy8gPDAsMywzLDc+OiBDb3N0IDQgdm1yZ2x3IDwzLDIsMCwzPiwgPDIsNiwzLDc+CisgIDIyMTY3MjUyNzhVLAkvLyA8MCwzLDMsdT46IENvc3QgMyB2bXJnaHcgPDAsMywxLHU+LCA8Myx1LDEsMj4KKyAgMjIxNzM2MzYwNlUsCS8vIDwwLDMsNCwwPjogQ29zdCAzIHZtcmdodyA8MCw0LDEsNT4sIDwzLDAsMSwyPgorICAzMjkxMTA1NTEwVSwJLy8gPDAsMyw0LDE+OiBDb3N0IDQgdm1yZ2h3IDwwLDQsMSw1PiwgPDMsMSwxLDE+CisgIDMyOTExMDU2MDFVLAkvLyA8MCwzLDQsMj46IENvc3QgNCB2bXJnaHcgPDAsNCwxLDU+LCA8MywyLDIsMj4KKyAgMjIxNzM2Mzg2OFUsCS8vIDwwLDMsNCwzPjogQ29zdCAzIHZtcmdodyA8MCw0LDEsNT4sIDwzLDMsMywzPgorICAyMjE3MzYzOTcwVSwJLy8gPDAsMyw0LDQ+OiBDb3N0IDMgdm1yZ2h3IDwwLDQsMSw1PiwgPDMsNCw1LDY+CisgIDI3NTg5ODYyNDJVLAkvLyA8MCwzLDQsNT46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsMD4sIDwzLDQsNSw2PgorICAzNzI3MDc3Njg1VSwJLy8gPDAsMyw0LDY+OiBDb3N0IDQgdnNsZG9pNCA8NiwwLDMsND4sIDw2LDAsMyw0PgorICAzMzY0NzY3Njc0VSwJLy8gPDAsMyw0LDc+OiBDb3N0IDQgdm1yZ2x3IDwxLDUsMCw0PiwgPDIsNiwzLDc+CisgIDIyMTczNjQyNTRVLAkvLyA8MCwzLDQsdT46IENvc3QgMyB2bXJnaHcgPDAsNCwxLDU+LCA8Myx1LDEsMj4KKyAgMzgzMjcyODEwMlUsCS8vIDwwLDMsNSwwPjogQ29zdCA0IHZzbGRvaTEyIDwxLDIsMywwPiwgPDMsNSwwLDY+CisgIDM0MDU5MTYwMDNVLAkvLyA8MCwzLDUsMT46IENvc3QgNCB2bXJnbHcgPHUsNCwwLDU+LCA8Miw1LDMsMT4KKyAgMzM3NjA1NTg0MFUsCS8vIDwwLDMsNSwyPjogQ29zdCA0IHZtcmdsdyA8Myw0LDAsNT4sIDwyLDEsMywyPgorICAzMzc2MDU1Njc5VSwJLy8gPDAsMyw1LDM+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsMCw1PiwgPDEsdSwzLDM+CisgIDMzNzYwNTUxOTRVLAkvLyA8MCwzLDUsND46IENvc3QgNCB2bXJnbHcgPDMsNCwwLDU+LCA8MSwyLDMsND4KKyAgMzg1OTU2NTEzOFUsCS8vIDwwLDMsNSw1PjogQ29zdCA0IHZzbGRvaTEyIDw1LDYsNywwPiwgPDMsNSw1LDU+CisgIDI3Mjc1MTQyMTBVLAkvLyA8MCwzLDUsNj46IENvc3QgMyB2c2xkb2k4IDw3LDIsMCwzPiwgPDUsNiw3LDA+CisgIDMzNzYwNTYyNTBVLAkvLyA8MCwzLDUsNz46IENvc3QgNCB2bXJnbHcgPDMsNCwwLDU+LCA8Miw2LDMsNz4KKyAgMjcyNzUxNDIxMFUsCS8vIDwwLDMsNSx1PjogQ29zdCAzIHZzbGRvaTggPDcsMiwwLDM+LCA8NSw2LDcsMD4KKyAgMjc1ODk4NjM2MFUsCS8vIDwwLDMsNiwwPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMywwPiwgPDMsNiwwLDc+CisgIDM3MDkxNzQ2NzhVLAkvLyA8MCwzLDYsMT46IENvc3QgNCB2c2xkb2k0IDwzLDAsMyw2PiwgPDEsMiwzLDA+CisgIDM3OTUyODQ0MTFVLAkvLyA8MCwzLDYsMj46IENvc3QgNCB2c2xkb2k4IDw2LDIsMCwzPiwgPDYsMiwwLDM+CisgIDM3MDkxNzU5ODBVLAkvLyA8MCwzLDYsMz46IENvc3QgNCB2c2xkb2k0IDwzLDAsMyw2PiwgPDMsMCwzLDY+CisgIDM4MzMwOTY4NjBVLAkvLyA8MCwzLDYsND46IENvc3QgNCB2c2xkb2kxMiA8MSwyLHUsMD4sIDwzLDYsNCw3PgorICAzMzc2NzI4MjM1VSwJLy8gPDAsMyw2LDU+OiBDb3N0IDUgdm1yZ2x3IDwzLDUsMCw2PiwgPDMsMCwzLDU+CisgIDM4NTk1NjUyMjlVLAkvLyA8MCwzLDYsNj46IENvc3QgNCB2c2xkb2kxMiA8NSw2LDcsMD4sIDwzLDYsNiw2PgorICAyNzczODc5NDcyVSwJLy8gPDAsMyw2LDc+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNiw3LDA+LCA8Myw2LDcsMD4KKyAgMjc1ODk4NjM2MFUsCS8vIDwwLDMsNix1PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMywwPiwgPDMsNiwwLDc+CisgIDIzMDM2NTY4NTRVLAkvLyA8MCwzLDcsMD46IENvc3QgMyB2bXJnbHcgPDMsNiwwLDc+LCA8MSwyLDMsMD4KKyAgMzgwNzIyOTAxOFUsCS8vIDwwLDMsNywxPjogQ29zdCA0IHZzbGRvaTggPHUsMiwwLDM+LCA8NywxLDIsdT4KKyAgMjcyNzUxNTI4NFUsCS8vIDwwLDMsNywyPjogQ29zdCAzIHZzbGRvaTggPDcsMiwwLDM+LCA8NywyLDAsMz4KKyAgMzM3NzM5OTQxMFUsCS8vIDwwLDMsNywzPjogQ29zdCA0IHZtcmdsdyA8Myw2LDAsNz4sIDwyLDIsMywzPgorICAzMzc3Mzk4NjgyVSwJLy8gPDAsMyw3LDQ+OiBDb3N0IDQgdm1yZ2x3IDwzLDYsMCw3PiwgPDEsMiwzLDQ+CisgIDM4MDEyNTc0MDlVLAkvLyA8MCwzLDcsNT46IENvc3QgNCB2c2xkb2k4IDw3LDIsMCwzPiwgPDcsNSw2LDc+CisgIDMzNzczOTk5ODBVLAkvLyA8MCwzLDcsNj46IENvc3QgNCB2bXJnbHcgPDMsNiwwLDc+LCA8MywwLDMsNj4KKyAgMzM3NTQwOTA4MlUsCS8vIDwwLDMsNyw3PjogQ29zdCA0IHZtcmdsdyA8MywzLDAsNz4sIDwyLDYsMyw3PgorICAyNzMxNDk3MDgyVSwJLy8gPDAsMyw3LHU+OiBDb3N0IDMgdnNsZG9pOCA8Nyx1LDAsMz4sIDw3LHUsMCwzPgorICAxMTQ2MzMzMzM0VSwJLy8gPDAsMyx1LDA+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDMsMCwxLDI+CisgIDIyMjAwNzUyMzhVLAkvLyA8MCwzLHUsMT46IENvc3QgMyB2bXJnaHcgTEhTLCA8MywxLDEsMT4KKyAgMjIyMDA3NTMyOVUsCS8vIDwwLDMsdSwyPjogQ29zdCAzIHZtcmdodyBMSFMsIDwzLDIsMiwyPgorICAxMTQ2MzMzNTk2VSwJLy8gPDAsMyx1LDM+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDMsMywzLDM+CisgIDExNDYzMzM2OThVLAkvLyA8MCwzLHUsND46IENvc3QgMiB2bXJnaHcgTEhTLCA8Myw0LDUsNj4KKyAgMjc1ODk4NjU2NlUsCS8vIDwwLDMsdSw1PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMywwPiwgPDMsdSw1LDY+CisgIDI4MDM3Mzk0NzJVLAkvLyA8MCwzLHUsNj46IENvc3QgMyB2c2xkb2kxMiA8dSw2LDcsMD4sIDwzLHUsNiw3PgorICAyMjk1NzAzNDgyVSwJLy8gPDAsMyx1LDc+OiBDb3N0IDMgdm1yZ2x3IDwyLDMsMCx1PiwgPDIsNiwzLDc+CisgIDExNDYzMzM5ODJVLAkvLyA8MCwzLHUsdT46IENvc3QgMiB2bXJnaHcgTEhTLCA8Myx1LDEsMj4KKyAgMjIxNDU5NTQ3M1UsCS8vIDwwLDQsMCwwPjogQ29zdCAzIHZtcmdodyA8MCwwLDAsMD4sIDw0LDAsNSwwPgorICAyNjkzNjc3MTU4VSwJLy8gPDAsNCwwLDE+OiBDb3N0IDMgdnNsZG9pOCA8MSw1LDAsND4sIExIUworICAzODM5NDM3Njg5VSwJLy8gPDAsNCwwLDI+OiBDb3N0IDQgdnNsZG9pMTIgPDIsMyw0LDA+LCA8NCwwLDIsMz4KKyAgMzcwOTIwMDU1OVUsCS8vIDwwLDQsMCwzPjogQ29zdCA0IHZzbGRvaTQgPDMsMCw0LDA+LCA8MywwLDQsMD4KKyAgMjY5MzY3NzM5NFUsCS8vIDwwLDQsMCw0PjogQ29zdCAzIHZzbGRvaTggPDEsNSwwLDQ+LCA8MCw0LDEsNT4KKyAgMTE0MDg1NDA3MFUsCS8vIDwwLDQsMCw1PjogQ29zdCAyIHZtcmdodyA8MCwwLDAsMD4sIFJIUworICAzNzY3NDE5NDA5VSwJLy8gPDAsNCwwLDY+OiBDb3N0IDQgdnNsZG9pOCA8MSw1LDAsND4sIDwwLDYsNCw3PgorICAzODU0MTA5NjA0VSwJLy8gPDAsNCwwLDc+OiBDb3N0IDQgdnNsZG9pMTIgPDQsNyw1LDA+LCA8NCwwLDcsMT4KKyAgMTE0MDg1NDMxM1UsCS8vIDwwLDQsMCx1PjogQ29zdCAyIHZtcmdodyA8MCwwLDAsMD4sIFJIUworICAxMTQxNjg5MjM0VSwJLy8gPDAsNCwxLDA+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDQsMCw1LDE+CisgIDIyMTU0MzExMTRVLAkvLyA8MCw0LDEsMT46IENvc3QgMyB2bXJnaHcgTEhTLCA8NCwxLDIsMz4KKyAgMjIxNTQzMTIyMVUsCS8vIDwwLDQsMSwyPjogQ29zdCAzIHZtcmdodyBMSFMsIDw0LDIsNSwyPgorICAyNjM1NDY2OTI4VSwJLy8gPDAsNCwxLDM+OiBDb3N0IDMgdnNsZG9pNCA8MywwLDQsMT4sIDwzLDAsNCwxPgorICAxMTQxNjg5NTUyVSwJLy8gPDAsNCwxLDQ+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDQsNCw0LDQ+CisgIDY3OTQ3ODMwVSwJLy8gPDAsNCwxLDU+OiBDb3N0IDEgdm1yZ2h3IExIUywgUkhTCisgIDIyMTU0MzE1NDVVLAkvLyA8MCw0LDEsNj46IENvc3QgMyB2bXJnaHcgTEhTLCA8NCw2LDUsMj4KKyAgMjY1OTM1NzcxNlUsCS8vIDwwLDQsMSw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMCw0LDE+LCA8NywwLDQsMT4KKyAgNjc5NDgwNzNVLAkvLyA8MCw0LDEsdT46IENvc3QgMSB2bXJnaHcgTEhTLCBSSFMKKyAgMzc2NzQyMDM2OVUsCS8vIDwwLDQsMiwwPjogQ29zdCA0IHZzbGRvaTggPDEsNSwwLDQ+LCA8MiwwLDMsND4KKyAgMzc2NzQyMDQ1MVUsCS8vIDwwLDQsMiwxPjogQ29zdCA0IHZzbGRvaTggPDEsNSwwLDQ+LCA8MiwxLDMsNT4KKyAgMzc2NzQyMDUyMFUsCS8vIDwwLDQsMiwyPjogQ29zdCA0IHZzbGRvaTggPDEsNSwwLDQ+LCA8MiwyLDIsMj4KKyAgMjY5ODMyMzYyNVUsCS8vIDwwLDQsMiwzPjogQ29zdCAzIHZzbGRvaTggPDIsMywwLDQ+LCA8MiwzLDAsND4KKyAgMzcwOTIxODEwMlUsCS8vIDwwLDQsMiw0PjogQ29zdCA0IHZzbGRvaTQgPDMsMCw0LDI+LCBSSFMKKyAgMjIxNjAxMzExMFUsCS8vIDwwLDQsMiw1PjogQ29zdCAzIHZtcmdodyA8MCwyLDEsMj4sIFJIUworICAzNzY3NDIwODU4VSwJLy8gPDAsNCwyLDY+OiBDb3N0IDQgdnNsZG9pOCA8MSw1LDAsND4sIDwyLDYsMyw3PgorICAzNzc0NzE5OTgxVSwJLy8gPDAsNCwyLDc+OiBDb3N0IDQgdnNsZG9pOCA8Miw3LDAsND4sIDwyLDcsMCw0PgorICAyMjE2MDEzMzUzVSwJLy8gPDAsNCwyLHU+OiBDb3N0IDMgdm1yZ2h3IDwwLDIsMSwyPiwgUkhTCisgIDM3Njc0MjEwNzhVLAkvLyA8MCw0LDMsMD46IENvc3QgNCB2c2xkb2k4IDwxLDUsMCw0PiwgPDMsMCwxLDI+CisgIDM3NzY3MTA4ODBVLAkvLyA8MCw0LDMsMT46IENvc3QgNCB2c2xkb2k4IDwzLDEsMCw0PiwgPDMsMSwwLDQ+CisgIDM4MzMwOTczMjVVLAkvLyA8MCw0LDMsMj46IENvc3QgNSB2c2xkb2kxMiA8MSwyLHUsMD4sIDw0LDMsMiw0PgorICAzNzY3NDIxMzQwVSwJLy8gPDAsNCwzLDM+OiBDb3N0IDQgdnNsZG9pOCA8MSw1LDAsND4sIDwzLDMsMywzPgorICAzNzY3NDIxNDQyVSwJLy8gPDAsNCwzLDQ+OiBDb3N0IDQgdnNsZG9pOCA8MSw1LDAsND4sIDwzLDQsNSw2PgorICAyMjE2NjYwMjc4VSwJLy8gPDAsNCwzLDU+OiBDb3N0IDMgdm1yZ2h3IDwwLDMsMSwwPiwgUkhTCisgIDM4MzMwOTczNjFVLAkvLyA8MCw0LDMsNj46IENvc3QgNSB2c2xkb2kxMiA8MSwyLHUsMD4sIDw0LDMsNiw0PgorICAzNzgwNjkyNjc4VSwJLy8gPDAsNCwzLDc+OiBDb3N0IDQgdnNsZG9pOCA8Myw3LDAsND4sIDwzLDcsMCw0PgorICAyMjE2NjYwNTIxVSwJLy8gPDAsNCwzLHU+OiBDb3N0IDMgdm1yZ2h3IDwwLDMsMSwwPiwgUkhTCisgIDI2MTc1NzM0MTZVLAkvLyA8MCw0LDQsMD46IENvc3QgMyB2c2xkb2k0IDwwLDAsNCw0PiwgPDAsMCw0LDQ+CisgIDIyMTczNjQ0NTBVLAkvLyA8MCw0LDQsMT46IENvc3QgMyB2bXJnaHcgPDAsNCwxLDU+LCA8NCwxLDUsMD4KKyAgMzY5MTMxNjc3MVUsCS8vIDwwLDQsNCwyPjogQ29zdCA0IHZzbGRvaTQgPDAsMCw0LDQ+LCA8MiwxLDMsNT4KKyAgMzcwOTIzMzMzMVUsCS8vIDwwLDQsNCwzPjogQ29zdCA0IHZzbGRvaTQgPDMsMCw0LDQ+LCA8MywwLDQsND4KKyAgMjc4NTgyMzk1MlUsCS8vIDwwLDQsNCw0PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDQsNCw0LDQ+CisgIDExNDM2MjI5NjZVLAkvLyA8MCw0LDQsNT46IENvc3QgMiB2bXJnaHcgPDAsNCwxLDU+LCBSSFMKKyAgMzY5MTMxOTcyM1UsCS8vIDwwLDQsNCw2PjogQ29zdCA0IHZzbGRvaTQgPDAsMCw0LDQ+LCA8NiwxLDcsNT4KKyAgMzg1NDEwOTkzMlUsCS8vIDwwLDQsNCw3PjogQ29zdCA0IHZzbGRvaTEyIDw0LDcsNSwwPiwgPDQsNCw3LDU+CisgIDExNDM2MjMyMDlVLAkvLyA8MCw0LDQsdT46IENvc3QgMiB2bXJnaHcgPDAsNCwxLDU+LCBSSFMKKyAgMjYzNTQ5NzU3NFUsCS8vIDwwLDQsNSwwPjogQ29zdCAzIHZzbGRvaTQgPDMsMCw0LDU+LCBMSFMKKyAgMjYzNTQ5ODM5MFUsCS8vIDwwLDQsNSwxPjogQ29zdCAzIHZzbGRvaTQgPDMsMCw0LDU+LCA8MSwyLDMsMD4KKyAgMzcwOTI0MDkzNlUsCS8vIDwwLDQsNSwyPjogQ29zdCA0IHZzbGRvaTQgPDMsMCw0LDU+LCA8MiwyLDIsMj4KKyAgMjYzNTQ5OTcwMFUsCS8vIDwwLDQsNSwzPjogQ29zdCAzIHZzbGRvaTQgPDMsMCw0LDU+LCA8MywwLDQsNT4KKyAgMjYzNTUwMDg1NFUsCS8vIDwwLDQsNSw0PjogQ29zdCAzIHZzbGRvaTQgPDMsMCw0LDU+LCBSSFMKKyAgMjc4NTgyNDA0NFUsCS8vIDwwLDQsNSw1PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDQsNSw1LDY+CisgIDE2ODUyNDUyMzhVLAkvLyA8MCw0LDUsNj46IENvc3QgMiB2c2xkb2kxMiA8MSwyLDMsMD4sIFJIUworICAyNjU5MzkwNDg4VSwJLy8gPDAsNCw1LDc+OiBDb3N0IDMgdnNsZG9pNCA8NywwLDQsNT4sIDw3LDAsNCw1PgorICAxNjg1MjQ1MjU2VSwJLy8gPDAsNCw1LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMiwzLDA+LCBSSFMKKyAgMzgzOTQzODE2MVUsCS8vIDwwLDQsNiwwPjogQ29zdCA0IHZzbGRvaTEyIDwyLDMsNCwwPiwgPDQsNiwwLDc+CisgIDM3OTg2MTAzNDdVLAkvLyA8MCw0LDYsMT46IENvc3QgNCB2c2xkb2k4IDw2LDcsMCw0PiwgPDYsMSw3LDU+CisgIDM3OTg2MTA0MjZVLAkvLyA8MCw0LDYsMj46IENvc3QgNCB2c2xkb2k4IDw2LDcsMCw0PiwgPDYsMiw3LDM+CisgIDM3OTU5NTYyMzdVLAkvLyA8MCw0LDYsMz46IENvc3QgNCB2c2xkb2k4IDw2LDMsMCw0PiwgPDYsMywwLDQ+CisgIDM3MzMxMzg3NDJVLAkvLyA8MCw0LDYsND46IENvc3QgNCB2c2xkb2k0IDw3LDAsNCw2PiwgUkhTCisgIDIyMTg2MzQ1NTBVLAkvLyA8MCw0LDYsNT46IENvc3QgMyB2bXJnaHcgPDAsNiwwLDc+LCBSSFMKKyAgMzc5ODYxMDc0NFUsCS8vIDwwLDQsNiw2PjogQ29zdCA0IHZzbGRvaTggPDYsNywwLDQ+LCA8Niw2LDYsNj4KKyAgMjcyNDg2ODk0NVUsCS8vIDwwLDQsNiw3PjogQ29zdCAzIHZzbGRvaTggPDYsNywwLDQ+LCA8Niw3LDAsND4KKyAgMjcyNTUzMjU3OFUsCS8vIDwwLDQsNix1PjogQ29zdCAzIHZzbGRvaTggPDYsdSwwLDQ+LCA8Nix1LDAsND4KKyAgMzM4MzM3MTQ2NVUsCS8vIDwwLDQsNywwPjogQ29zdCA0IHZtcmdsdyA8NCw2LDAsNz4sIDwyLDMsNCwwPgorICAzODAwNjAxNjY4VSwJLy8gPDAsNCw3LDE+OiBDb3N0IDQgdnNsZG9pOCA8NywxLDAsND4sIDw3LDEsMCw0PgorICAzNzc1Mzg2ODI2VSwJLy8gPDAsNCw3LDI+OiBDb3N0IDUgdnNsZG9pOCA8Mix1LDAsND4sIDw3LDIsNiwzPgorICAzODAxOTI4OTM0VSwJLy8gPDAsNCw3LDM+OiBDb3N0IDQgdnNsZG9pOCA8NywzLDAsND4sIDw3LDMsMCw0PgorICAzNzIxMjAyOTk4VSwJLy8gPDAsNCw3LDQ+OiBDb3N0IDQgdnNsZG9pNCA8NSwwLDQsNz4sIFJIUworICAyNzgwMzY4MzI4VSwJLy8gPDAsNCw3LDU+OiBDb3N0IDMgdnNsZG9pMTIgPDQsNyw1LDA+LCA8NCw3LDUsMD4KKyAgMzM4MzM3MjY4NlUsCS8vIDwwLDQsNyw2PjogQ29zdCA1IHZtcmdsdyA8NCw2LDAsNz4sIDw0LDAsNCw2PgorICAzODU0MTEwMTcwVSwJLy8gPDAsNCw3LDc+OiBDb3N0IDQgdnNsZG9pMTIgPDQsNyw1LDA+LCA8NCw3LDcsMD4KKyAgMjc4MDM2ODMyOFUsCS8vIDwwLDQsNyx1PjogQ29zdCAzIHZzbGRvaTEyIDw0LDcsNSwwPiwgPDQsNyw1LDA+CisgIDExNDYzMzQwOThVLAkvLyA8MCw0LHUsMD46IENvc3QgMiB2bXJnaHcgTEhTLCA8NCwwLDUsMT4KKyAgMjIyMDA3NjAwMlUsCS8vIDwwLDQsdSwxPjogQ29zdCAzIHZtcmdodyBMSFMsIDw0LDEsNSwwPgorICAyMjIwMDc2MDg1VSwJLy8gPDAsNCx1LDI+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDQsMiw1LDI+CisgIDI2MzU1MjQyNzlVLAkvLyA8MCw0LHUsMz46IENvc3QgMyB2c2xkb2k0IDwzLDAsNCx1PiwgPDMsMCw0LHU+CisgIDExNDYzMzQ0MTZVLAkvLyA8MCw0LHUsND46IENvc3QgMiB2bXJnaHcgTEhTLCA8NCw0LDQsND4KKyAgNzI1OTI2OTRVLAkvLyA8MCw0LHUsNT46IENvc3QgMSB2bXJnaHcgTEhTLCBSSFMKKyAgMTY4NTI0NTQ4MVUsCS8vIDwwLDQsdSw2PjogQ29zdCAyIHZzbGRvaTEyIDwxLDIsMywwPiwgUkhTCisgIDI2NTk0MTUwNjdVLAkvLyA8MCw0LHUsNz46IENvc3QgMyB2c2xkb2k0IDw3LDAsNCx1PiwgPDcsMCw0LHU+CisgIDcyNTkyOTM3VSwJLy8gPDAsNCx1LHU+OiBDb3N0IDEgdm1yZ2h3IExIUywgUkhTCisgIDIyODE3MDQzMzdVLAkvLyA8MCw1LDAsMD46IENvc3QgMyB2bXJnbHcgPDAsMCwwLDA+LCA8NCwwLDUsMD4KKyAgMjcwNDk2NTczNFUsCS8vIDwwLDUsMCwxPjogQ29zdCAzIHZzbGRvaTggPDMsNCwwLDU+LCBMSFMKKyAgMzc3ODcwNzY2NlUsCS8vIDwwLDUsMCwyPjogQ29zdCA0IHZzbGRvaTggPDMsNCwwLDU+LCA8MCwyLDUsMz4KKyAgMzc3ODcwNzcwOFUsCS8vIDwwLDUsMCwzPjogQ29zdCA0IHZzbGRvaTggPDMsNCwwLDU+LCA8MCwzLDEsMD4KKyAgMjY4NzA1MDA1N1UsCS8vIDwwLDUsMCw0PjogQ29zdCAzIHZzbGRvaTggPDAsNCwwLDU+LCA8MCw0LDAsNT4KKyAgMjIxNDU5NjYxMlUsCS8vIDwwLDUsMCw1PjogQ29zdCAzIHZtcmdodyA8MCwwLDAsMD4sIDw1LDUsNSw1PgorICAyNzg1ODI0MzcyVSwJLy8gPDAsNSwwLDY+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDA+LCA8NSwwLDYsMT4KKyAgMzg1NDExMDMzMlUsCS8vIDwwLDUsMCw3PjogQ29zdCA0IHZzbGRvaTEyIDw0LDcsNSwwPiwgPDUsMCw3LDA+CisgIDI3MDQ5NjYzMDFVLAkvLyA8MCw1LDAsdT46IENvc3QgMyB2c2xkb2k4IDwzLDQsMCw1PiwgTEhTCisgIDE1Njc3Njg2NzhVLAkvLyA8MCw1LDEsMD46IENvc3QgMiB2c2xkb2k0IDw0LDAsNSwxPiwgTEhTCisgIDIzMTIyMzY1NzBVLAkvLyA8MCw1LDEsMT46IENvc3QgMyB2bXJnbHcgPDUsMSwwLDE+LCA8NCx1LDUsMT4KKyAgMjIxNTQzMTkxNVUsCS8vIDwwLDUsMSwyPjogQ29zdCAzIHZtcmdodyBMSFMsIDw1LDIsMSwzPgorICAyNjQxNTEyNTk4VSwJLy8gPDAsNSwxLDM+OiBDb3N0IDMgdnNsZG9pNCA8NCwwLDUsMT4sIDwzLDAsMSwyPgorICAxNTY3NzcxNTM4VSwJLy8gPDAsNSwxLDQ+OiBDb3N0IDIgdnNsZG9pNCA8NCwwLDUsMT4sIDw0LDAsNSwxPgorICAxMTQxNjkwMzcyVSwJLy8gPDAsNSwxLDU+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDUsNSw1LDU+CisgIDExNDE2OTA0NjZVLAkvLyA8MCw1LDEsNj46IENvc3QgMiB2bXJnaHcgTEhTLCA8NSw2LDcsMD4KKyAgMjY0MTUxNTUxNFUsCS8vIDwwLDUsMSw3PjogQ29zdCAzIHZzbGRvaTQgPDQsMCw1LDE+LCA8NywwLDEsMj4KKyAgMTE0MTY5MDYxNVUsCS8vIDwwLDUsMSx1PjogQ29zdCAyIHZtcmdodyBMSFMsIDw1LHUsNSw1PgorICAzNzcyNzM2OTczVSwJLy8gPDAsNSwyLDA+OiBDb3N0IDQgdnNsZG9pOCA8Miw0LDAsNT4sIDwyLDAsMywwPgorICAzNzc4NzA5MDI0VSwJLy8gPDAsNSwyLDE+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDAsNT4sIDwyLDEsMywyPgorICAzNzc4NzA5MDk2VSwJLy8gPDAsNSwyLDI+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDAsNT4sIDwyLDIsMiwyPgorICAzNzc4NzA5MTU4VSwJLy8gPDAsNSwyLDM+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDAsNT4sIDwyLDMsMCwxPgorICAzNzcyNzM3Mjc1VSwJLy8gPDAsNSwyLDQ+OiBDb3N0IDQgdnNsZG9pOCA8Miw0LDAsNT4sIDwyLDQsMCw1PgorICAzODU5NTY2MzUxVSwJLy8gPDAsNSwyLDU+OiBDb3N0IDQgdnNsZG9pMTIgPDUsNiw3LDA+LCA8NSwyLDUsMz4KKyAgMzc3ODcwOTQzNFUsCS8vIDwwLDUsMiw2PjogQ29zdCA0IHZzbGRvaTggPDMsNCwwLDU+LCA8Miw2LDMsNz4KKyAgMzgwNTI1MTU2MlUsCS8vIDwwLDUsMiw3PjogQ29zdCA0IHZzbGRvaTggPDcsdSwwLDU+LCA8Miw3LDAsMT4KKyAgMzc3NTM5MTgwN1UsCS8vIDwwLDUsMix1PjogQ29zdCA0IHZzbGRvaTggPDIsdSwwLDU+LCA8Mix1LDAsNT4KKyAgMjcwNDk2NzgzMFUsCS8vIDwwLDUsMywwPjogQ29zdCAzIHZzbGRvaTggPDMsNCwwLDU+LCA8MywwLDEsMj4KKyAgMzc3NjcxOTA3M1UsCS8vIDwwLDUsMywxPjogQ29zdCA0IHZzbGRvaTggPDMsMSwwLDU+LCA8MywxLDAsNT4KKyAgMzc3NzM4MjcwNlUsCS8vIDwwLDUsMywyPjogQ29zdCA0IHZzbGRvaTggPDMsMiwwLDU+LCA8MywyLDAsNT4KKyAgMzc3ODcwOTg4N1UsCS8vIDwwLDUsMywzPjogQ29zdCA0IHZzbGRvaTggPDMsNCwwLDU+LCA8MywzLDAsMT4KKyAgMjcwNDk2ODE0OFUsCS8vIDwwLDUsMyw0PjogQ29zdCAzIHZzbGRvaTggPDMsNCwwLDU+LCA8Myw0LDAsNT4KKyAgMzg1NzQyODMxN1UsCS8vIDwwLDUsMyw1PjogQ29zdCA0IHZzbGRvaTEyIDw1LDMsNSwwPiwgPDUsMyw1LDA+CisgIDMzNjQwOTY1MTRVLAkvLyA8MCw1LDMsNj46IENvc3QgNCB2bXJnbHcgPDEsNCwwLDM+LCA8Myw0LDUsNj4KKyAgMzc4MDcwMDg3MVUsCS8vIDwwLDUsMyw3PjogQ29zdCA0IHZzbGRvaTggPDMsNywwLDU+LCA8Myw3LDAsNT4KKyAgMjcwNzYyMjY4MFUsCS8vIDwwLDUsMyx1PjogQ29zdCAzIHZzbGRvaTggPDMsdSwwLDU+LCA8Myx1LDAsNT4KKyAgMjcyODg1NjQ2NlUsCS8vIDwwLDUsNCwwPjogQ29zdCAzIHZzbGRvaTggPDcsNCwwLDU+LCA8NCwwLDUsMT4KKyAgMzY5NzM2MTY3NFUsCS8vIDwwLDUsNCwxPjogQ29zdCA0IHZzbGRvaTQgPDEsMCw1LDQ+LCA8MSwwLDUsND4KKyAgMzY5NzM2MjYwMVUsCS8vIDwwLDUsNCwyPjogQ29zdCA0IHZzbGRvaTQgPDEsMCw1LDQ+LCA8MiwzLDAsND4KKyAgMzM2NDc2NjYzNVUsCS8vIDwwLDUsNCwzPjogQ29zdCA0IHZtcmdsdyA8MSw1LDAsND4sIDwxLDIsNSwzPgorICAyMjE3MzY1NDI4VSwJLy8gPDAsNSw0LDQ+OiBDb3N0IDMgdm1yZ2h3IDwwLDQsMSw1PiwgPDUsNCw1LDY+CisgIDI3MDQ5NjkwMTRVLAkvLyA8MCw1LDQsNT46IENvc3QgMyB2c2xkb2k4IDwzLDQsMCw1PiwgUkhTCisgIDI3ODU4MjQ3MDBVLAkvLyA8MCw1LDQsNj46IENvc3QgMyB2c2xkb2kxMiA8NSw2LDcsMD4sIDw1LDQsNiw1PgorICAzMzY0NzY2OTYzVSwJLy8gPDAsNSw0LDc+OiBDb3N0IDQgdm1yZ2x3IDwxLDUsMCw0PiwgPDEsNiw1LDc+CisgIDI3MDQ5NjkyNTdVLAkvLyA8MCw1LDQsdT46IENvc3QgMyB2c2xkb2k4IDwzLDQsMCw1PiwgUkhTCisgIDM4NDYxNDgwNTBVLAkvLyA8MCw1LDUsMD46IENvc3QgNCB2c2xkb2kxMiA8Myw0LDUsMD4sIDw1LDUsMCwwPgorICAyMzI2MjAzMjgyVSwJLy8gPDAsNSw1LDE+OiBDb3N0IDMgdm1yZ2x3IDw3LDQsMCw1PiwgPDQsMCw1LDE+CisgIDMyOTE3NDYwMjdVLAkvLyA8MCw1LDUsMj46IENvc3QgNCB2bXJnaHcgPDAsNSwxLDI+LCA8NSwyLDEsMz4KKyAgMzM3NjA1NDQ4MlUsCS8vIDwwLDUsNSwzPjogQ29zdCA0IHZtcmdsdyA8Myw0LDAsNT4sIDwwLDIsNSwzPgorICAzNzkwNjU1MzY2VSwJLy8gPDAsNSw1LDQ+OiBDb3N0IDQgdnNsZG9pOCA8NSw0LDAsNT4sIDw1LDQsMCw1PgorICAyNzg1ODI0NzcyVSwJLy8gPDAsNSw1LDU+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDA+LCA8NSw1LDUsNT4KKyAgMjcyNDg3NjM4NlUsCS8vIDwwLDUsNSw2PjogQ29zdCAzIHZzbGRvaTggPDYsNywwLDU+LCA8NSw2LDcsMD4KKyAgMzg1ODkwMzA1N1UsCS8vIDwwLDUsNSw3PjogQ29zdCA0IHZzbGRvaTEyIDw1LDUsNywwPiwgPDUsNSw3LDA+CisgIDI3MzY4MjA0ODRVLAkvLyA8MCw1LDUsdT46IENvc3QgMyB2c2xkb2k4IDx1LDcsMCw1PiwgPDUsdSw3LDA+CisgIDI2NTk0NjczNjZVLAkvLyA8MCw1LDYsMD46IENvc3QgMyB2c2xkb2k0IDw3LDAsNSw2PiwgTEhTCisgIDM4NTk1NjY2NDNVLAkvLyA8MCw1LDYsMT46IENvc3QgNCB2c2xkb2kxMiA8NSw2LDcsMD4sIDw1LDYsMSw3PgorICAzNzk4NjE4NjE4VSwJLy8gPDAsNSw2LDI+OiBDb3N0IDQgdnNsZG9pOCA8Niw3LDAsNT4sIDw2LDIsNywzPgorICAzODUyODU3NDEwVSwJLy8gPDAsNSw2LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDQsNSw2LDA+LCA8NSw2LDMsND4KKyAgMjY1OTQ3MDY0NlUsCS8vIDwwLDUsNiw0PjogQ29zdCAzIHZzbGRvaTQgPDcsMCw1LDY+LCBSSFMKKyAgMjY1OTQ3MTQ1OFUsCS8vIDwwLDUsNiw1PjogQ29zdCAzIHZzbGRvaTQgPDcsMCw1LDY+LCA8NSw2LDcsMD4KKyAgMzgzMjcyOTY5NlUsCS8vIDwwLDUsNiw2PjogQ29zdCA0IHZzbGRvaTEyIDwxLDIsMywwPiwgPDUsNiw2LDc+CisgIDE3MTIwODMwNDJVLAkvLyA8MCw1LDYsNz46IENvc3QgMiB2c2xkb2kxMiA8NSw2LDcsMD4sIDw1LDYsNywwPgorICAxNzEyMTU2Nzc5VSwJLy8gPDAsNSw2LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDUsNix1LDA+LCA8NSw2LHUsMD4KKyAgMjczMTUxMjgyNlUsCS8vIDwwLDUsNywwPjogQ29zdCAzIHZzbGRvaTggPDcsdSwwLDU+LCA8NywwLDEsMj4KKyAgMzg1OTU2NjcxN1UsCS8vIDwwLDUsNywxPjogQ29zdCA0IHZzbGRvaTEyIDw1LDYsNywwPiwgPDUsNywxLDA+CisgIDM3OTg2MTkyODRVLAkvLyA8MCw1LDcsMj46IENvc3QgNCB2c2xkb2k4IDw2LDcsMCw1PiwgPDcsMiwwLDM+CisgIDM3Nzg3MTI4MDNVLAkvLyA8MCw1LDcsMz46IENvc3QgNCB2c2xkb2k4IDwzLDQsMCw1PiwgPDcsMywwLDE+CisgIDI3Mjg4NTg5MzZVLAkvLyA8MCw1LDcsND46IENvc3QgMyB2c2xkb2k4IDw3LDQsMCw1PiwgPDcsNCwwLDU+CisgIDM4NTk1NjY3NTNVLAkvLyA8MCw1LDcsNT46IENvc3QgNCB2c2xkb2kxMiA8NSw2LDcsMD4sIDw1LDcsNSwwPgorICAzMzc3Mzk4MTM1VSwJLy8gPDAsNSw3LDY+OiBDb3N0IDQgdm1yZ2x3IDwzLDYsMCw3PiwgPDAsNCw1LDY+CisgIDM3OTg2MTk2ODZVLAkvLyA8MCw1LDcsNz46IENvc3QgNCB2c2xkb2k4IDw2LDcsMCw1PiwgPDcsNywwLDA+CisgIDI3MzE1MTM0NjhVLAkvLyA8MCw1LDcsdT46IENvc3QgMyB2c2xkb2k4IDw3LHUsMCw1PiwgPDcsdSwwLDU+CisgIDE1Njc4MjYwMjJVLAkvLyA8MCw1LHUsMD46IENvc3QgMiB2c2xkb2k0IDw0LDAsNSx1PiwgTEhTCisgIDI3MDQ5NzE1NjZVLAkvLyA8MCw1LHUsMT46IENvc3QgMyB2c2xkb2k4IDwzLDQsMCw1PiwgTEhTCisgIDIyMjAwNzY3NzlVLAkvLyA8MCw1LHUsMj46IENvc3QgMyB2bXJnaHcgTEhTLCA8NSwyLDEsMz4KKyAgMjY0MTU2OTk0MlUsCS8vIDwwLDUsdSwzPjogQ29zdCAzIHZzbGRvaTQgPDQsMCw1LHU+LCA8MywwLDEsMj4KKyAgMTU2NzgyODg4OVUsCS8vIDwwLDUsdSw0PjogQ29zdCAyIHZzbGRvaTQgPDQsMCw1LHU+LCA8NCwwLDUsdT4KKyAgMTE0NjMzNTIzNlUsCS8vIDwwLDUsdSw1PjogQ29zdCAyIHZtcmdodyBMSFMsIDw1LDUsNSw1PgorICAxMTQ2MzM1MzMwVSwJLy8gPDAsNSx1LDY+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDUsNiw3LDA+CisgIDE3MTM0MTAzMDhVLAkvLyA8MCw1LHUsNz46IENvc3QgMiB2c2xkb2kxMiA8NSx1LDcsMD4sIDw1LHUsNywwPgorICAxNzEzNDg0MDQ1VSwJLy8gPDAsNSx1LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDUsdSx1LDA+LCA8NSx1LHUsMD4KKyAgMjIxNDU5Njk0OVUsCS8vIDwwLDYsMCwwPjogQ29zdCAzIHZtcmdodyA8MCwwLDAsMD4sIDw2LDAsNywwPgorICAyMjE0Njc4OTUxVSwJLy8gPDAsNiwwLDE+OiBDb3N0IDMgdm1yZ2h3IDwwLDAsMSwxPiwgPDYsMSw3LDE+CisgIDIyMTQ1OTcxMTRVLAkvLyA8MCw2LDAsMj46IENvc3QgMyB2bXJnaHcgPDAsMCwwLDA+LCA8NiwyLDcsMz4KKyAgMzg1Mjg1NzY1M1UsCS8vIDwwLDYsMCwzPjogQ29zdCA0IHZzbGRvaTEyIDw0LDUsNiwwPiwgPDYsMCwzLDQ+CisgIDM4MzI3Mjk5MTlVLAkvLyA8MCw2LDAsND46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsMD4sIDw2LDAsNCw1PgorICAzNzIxMjkzNDI3VSwJLy8gPDAsNiwwLDU+OiBDb3N0IDQgdnNsZG9pNCA8NSwwLDYsMD4sIDw1LDAsNiwwPgorICAyMjE0NTk3NDMyVSwJLy8gPDAsNiwwLDY+OiBDb3N0IDMgdm1yZ2h3IDwwLDAsMCwwPiwgPDYsNiw2LDY+CisgIDEyMDc5NjI5MzRVLAkvLyA8MCw2LDAsNz46IENvc3QgMiB2bXJnbHcgPDAsMCwwLDA+LCBSSFMKKyAgMTIwNzk2MjkzNVUsCS8vIDwwLDYsMCx1PjogQ29zdCAyIHZtcmdsdyA8MCwwLDAsMD4sIFJIUworICAyMjE1NDMyNDgxVSwJLy8gPDAsNiwxLDA+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDYsMCwxLDI+CisgIDIyMTU0MzI2MTVVLAkvLyA8MCw2LDEsMT46IENvc3QgMyB2bXJnaHcgTEhTLCA8NiwxLDcsMT4KKyAgMTE0MTY5MDg3NFUsCS8vIDwwLDYsMSwyPjogQ29zdCAyIHZtcmdodyBMSFMsIDw2LDIsNywzPgorICAyMjE1NDMyNzU0VSwJLy8gPDAsNiwxLDM+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDYsMyw0LDU+CisgIDIyMTU0MzI4MTdVLAkvLyA8MCw2LDEsND46IENvc3QgMyB2bXJnaHcgTEhTLCA8Niw0LDIsNT4KKyAgMjIxNTQzMjkzOVUsCS8vIDwwLDYsMSw1PjogQ29zdCAzIHZtcmdodyBMSFMsIDw2LDUsNywxPgorICAxMTQxNjkxMTkyVSwJLy8gPDAsNiwxLDY+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDYsNiw2LDY+CisgIDEyMjE5MDU3MThVLAkvLyA8MCw2LDEsNz46IENvc3QgMiB2bXJnbHcgPDIsMywwLDE+LCBSSFMKKyAgMTIyMTkwNTcxOVUsCS8vIDwwLDYsMSx1PjogQ29zdCAyIHZtcmdsdyA8MiwzLDAsMT4sIFJIUworICAzODUyODU3Nzg3VSwJLy8gPDAsNiwyLDA+OiBDb3N0IDQgdnNsZG9pMTIgPDQsNSw2LDA+LCA8NiwyLDAsMz4KKyAgMzI4OTc2NDI2NVUsCS8vIDwwLDYsMiwxPjogQ29zdCA0IHZtcmdodyA8MCwyLDEsMz4sIDw2LDEsNywzPgorICAzMjg5NjkwNjE4VSwJLy8gPDAsNiwyLDI+OiBDb3N0IDQgdm1yZ2h3IDwwLDIsMCwzPiwgPDYsMiw3LDM+CisgIDM4NjI1ODk5MDdVLAkvLyA8MCw2LDIsMz46IENvc3QgNCB2c2xkb2kxMiA8NiwyLDMsMD4sIDw2LDIsMywwPgorICAzNzMzMjUzNDMwVSwJLy8gPDAsNiwyLDQ+OiBDb3N0IDQgdnNsZG9pNCA8NywwLDYsMj4sIFJIUworICAzNzMzMjU0MjQyVSwJLy8gPDAsNiwyLDU+OiBDb3N0IDQgdnNsZG9pNCA8NywwLDYsMj4sIDw1LDYsNywwPgorICAzNzc3MzkwNTIyVSwJLy8gPDAsNiwyLDY+OiBDb3N0IDQgdnNsZG9pOCA8MywyLDAsNj4sIDwyLDYsMyw3PgorICAyNzg1ODI1Mjc0VSwJLy8gPDAsNiwyLDc+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDA+LCA8NiwyLDcsMz4KKyAgMjc4NTgyNTI4M1UsCS8vIDwwLDYsMix1PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDYsMix1LDM+CisgIDM3NzczOTA3NDJVLAkvLyA8MCw2LDMsMD46IENvc3QgNCB2c2xkb2k4IDwzLDIsMCw2PiwgPDMsMCwxLDI+CisgIDM4NjMxMDYwNjZVLAkvLyA8MCw2LDMsMT46IENvc3QgNCB2c2xkb2kxMiA8NiwzLDEsMD4sIDw2LDMsMSwwPgorICAzNzc3MzkwODk5VSwJLy8gPDAsNiwzLDI+OiBDb3N0IDQgdnNsZG9pOCA8MywyLDAsNj4sIDwzLDIsMCw2PgorICAzMjkwNDM2MTQ2VSwJLy8gPDAsNiwzLDM+OiBDb3N0IDQgdm1yZ2h3IDwwLDMsMSw0PiwgPDYsMyw0LDU+CisgIDM3NzkzODE3NjJVLAkvLyA8MCw2LDMsND46IENvc3QgNCB2c2xkb2k4IDwzLDUsMCw2PiwgPDMsNCw1LDY+CisgIDM3NzkzODE3OThVLAkvLyA8MCw2LDMsNT46IENvc3QgNCB2c2xkb2k4IDwzLDUsMCw2PiwgPDMsNSwwLDY+CisgIDM3MzMyNjI5MjBVLAkvLyA8MCw2LDMsNj46IENvc3QgNCB2c2xkb2k0IDw3LDAsNiwzPiwgPDYsMyw3LDA+CisgIDIzMDA5NzIzNDJVLAkvLyA8MCw2LDMsNz46IENvc3QgMyB2bXJnbHcgPDMsMiwwLDM+LCBSSFMKKyAgMjMwMDk3MjM0M1UsCS8vIDwwLDYsMyx1PjogQ29zdCAzIHZtcmdsdyA8MywyLDAsMz4sIFJIUworICAzODAyNjA2NDgyVSwJLy8gPDAsNiw0LDA+OiBDb3N0IDQgdnNsZG9pOCA8Nyw0LDAsNj4sIDw0LDAsNSwxPgorICAyMjE3MzY1OTMxVSwJLy8gPDAsNiw0LDE+OiBDb3N0IDMgdm1yZ2h3IDwwLDQsMSw1PiwgPDYsMSw3LDU+CisgIDIyMTczNjYwMTBVLAkvLyA8MCw2LDQsMj46IENvc3QgMyB2bXJnaHcgPDAsNCwxLDU+LCA8NiwyLDcsMz4KKyAgMzI5MTEwNzg5MFUsCS8vIDwwLDYsNCwzPjogQ29zdCA0IHZtcmdodyA8MCw0LDEsNT4sIDw2LDMsNCw1PgorICAzMjkxMDk5ODA1VSwJLy8gPDAsNiw0LDQ+OiBDb3N0IDQgdm1yZ2h3IDwwLDQsMSw0PiwgPDYsNCw3LDQ+CisgIDM3NzczOTE5MjZVLAkvLyA8MCw2LDQsNT46IENvc3QgNCB2c2xkb2k4IDwzLDIsMCw2PiwgUkhTCisgIDIyMTczNjYzMjhVLAkvLyA8MCw2LDQsNj46IENvc3QgMyB2bXJnaHcgPDAsNCwxLDU+LCA8Niw2LDYsNj4KKyAgMjI5MTAyNzI1NFUsCS8vIDwwLDYsNCw3PjogQ29zdCAzIHZtcmdsdyA8MSw1LDAsND4sIFJIUworICAyMjkxMDI3MjU1VSwJLy8gPDAsNiw0LHU+OiBDb3N0IDMgdm1yZ2x3IDwxLDUsMCw0PiwgUkhTCisgIDM4NTI4NTgwMzNVLAkvLyA8MCw2LDUsMD46IENvc3QgNCB2c2xkb2kxMiA8NCw1LDYsMD4sIDw2LDUsMCw2PgorICAzMzk1OTY0NTMyVSwJLy8gPDAsNiw1LDE+OiBDb3N0IDQgdm1yZ2x3IDw2LDcsMCw1PiwgPDUsMCw2LDE+CisgIDM4NjQ1MDcwNjlVLAkvLyA8MCw2LDUsMj46IENvc3QgNCB2c2xkb2kxMiA8Niw1LDIsMD4sIDw2LDUsMiwwPgorICAzMzc2MDU2Njc4VSwJLy8gPDAsNiw1LDM+OiBDb3N0IDUgdm1yZ2x3IDwzLDQsMCw1PiwgPDMsMiw2LDM+CisgIDM3MjEzMzQwNzBVLAkvLyA8MCw2LDUsND46IENvc3QgNCB2c2xkb2k0IDw1LDAsNiw1PiwgUkhTCisgIDMzOTU5NjQ4NjBVLAkvLyA8MCw2LDUsNT46IENvc3QgNCB2bXJnbHcgPDYsNywwLDU+LCA8NSw0LDYsNT4KKyAgMzg2NDgwMjAxN1UsCS8vIDwwLDYsNSw2PjogQ29zdCA0IHZzbGRvaTEyIDw2LDUsNiwwPiwgPDYsNSw2LDA+CisgIDIzMDIzMTU4MzBVLAkvLyA8MCw2LDUsNz46IENvc3QgMyB2bXJnbHcgPDMsNCwwLDU+LCBSSFMKKyAgMjMwMjMxNTgzMVUsCS8vIDwwLDYsNSx1PjogQ29zdCAzIHZtcmdsdyA8Myw0LDAsNT4sIFJIUworICAzODUyODU4MTA4VSwJLy8gPDAsNiw2LDA+OiBDb3N0IDQgdnNsZG9pMTIgPDQsNSw2LDA+LCA8Niw2LDAsMD4KKyAgMzM5ODYyNDc0NVUsCS8vIDwwLDYsNiwxPjogQ29zdCA0IHZtcmdsdyA8NywyLDAsNj4sIDwyLDAsNiwxPgorICAyMjE4NjY4NTM4VSwJLy8gPDAsNiw2LDI+OiBDb3N0IDMgdm1yZ2h3IDwwLDYsMSwyPiwgPDYsMiw3LDM+CisgIDMyOTI0MTg2MTBVLAkvLyA8MCw2LDYsMz46IENvc3QgNCB2bXJnaHcgPDAsNiwxLDM+LCA8NiwzLDQsNT4KKyAgMzczMzI4NjE5OFUsCS8vIDwwLDYsNiw0PjogQ29zdCA0IHZzbGRvaTQgPDcsMCw2LDY+LCBSSFMKKyAgMzc5NzI5OTg4OVUsCS8vIDwwLDYsNiw1PjogQ29zdCA0IHZzbGRvaTggPDYsNSwwLDY+LCA8Niw1LDAsNj4KKyAgMjc4NTgyNTU5MlUsCS8vIDwwLDYsNiw2PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDYsNiw2LDY+CisgIDI3ODU4MjU2MDJVLAkvLyA8MCw2LDYsNz46IENvc3QgMyB2c2xkb2kxMiA8NSw2LDcsMD4sIDw2LDYsNyw3PgorICAyNzg1ODI1NjExVSwJLy8gPDAsNiw2LHU+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDA+LCA8Niw2LHUsNz4KKyAgMjc4NTgyNTYxNFUsCS8vIDwwLDYsNywwPjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDYsNywwLDE+CisgIDI3NTg5ODg2MzJVLAkvLyA8MCw2LDcsMT46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsMD4sIDw2LDcsMSwyPgorICAzMzc3NDAwMDg0VSwJLy8gPDAsNiw3LDI+OiBDb3N0IDQgdm1yZ2x3IDwzLDYsMCw3PiwgPDMsMSw2LDI+CisgIDI3OTIxNjYyNDhVLAkvLyA8MCw2LDcsMz46IENvc3QgMyB2c2xkb2kxMiA8Niw3LDMsMD4sIDw2LDcsMywwPgorICAyNzg1ODI1NjU0VSwJLy8gPDAsNiw3LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDA+LCA8Niw3LDQsNT4KKyAgMjc4NTgyNTY2NFUsCS8vIDwwLDYsNyw1PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDYsNyw1LDY+CisgIDM4NTk1Njc0OTNVLAkvLyA8MCw2LDcsNj46IENvc3QgNCB2c2xkb2kxMiA8NSw2LDcsMD4sIDw2LDcsNiwyPgorICAyMzAzNjU5MzE4VSwJLy8gPDAsNiw3LDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDYsMCw3PiwgUkhTCisgIDIzMDM2NTkzMTlVLAkvLyA8MCw2LDcsdT46IENvc3QgMyB2bXJnbHcgPDMsNiwwLDc+LCBSSFMKKyAgMjc4NTgyNTY5NVUsCS8vIDwwLDYsdSwwPjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDYsdSwwLDE+CisgIDIyMjAwNzc0NzlVLAkvLyA8MCw2LHUsMT46IENvc3QgMyB2bXJnaHcgTEhTLCA8NiwxLDcsMT4KKyAgMTE0NjMzNTczOFUsCS8vIDwwLDYsdSwyPjogQ29zdCAyIHZtcmdodyBMSFMsIDw2LDIsNywzPgorICAyNzkyODI5ODgxVSwJLy8gPDAsNix1LDM+OiBDb3N0IDMgdnNsZG9pMTIgPDYsdSwzLDA+LCA8Nix1LDMsMD4KKyAgMjc4NTgyNTczNVUsCS8vIDwwLDYsdSw0PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDYsdSw0LDU+CisgIDI3ODU4MjU2NjRVLAkvLyA8MCw2LHUsNT46IENvc3QgMyB2c2xkb2kxMiA8NSw2LDcsMD4sIDw2LDcsNSw2PgorICAxMTQ2MzM2MDU2VSwJLy8gPDAsNix1LDY+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDYsNiw2LDY+CisgIDEyMjE5NjMwNjJVLAkvLyA8MCw2LHUsNz46IENvc3QgMiB2bXJnbHcgPDIsMywwLHU+LCBSSFMKKyAgMTIyMTk2MzA2M1UsCS8vIDwwLDYsdSx1PjogQ29zdCAyIHZtcmdsdyA8MiwzLDAsdT4sIFJIUworICAyNjUzNTkzNjAwVSwJLy8gPDAsNywwLDA+OiBDb3N0IDMgdnNsZG9pNCA8NiwwLDcsMD4sIDwwLDAsMCwwPgorICAyNzA2MzA5MjIyVSwJLy8gPDAsNywwLDE+OiBDb3N0IDMgdnNsZG9pOCA8Myw2LDAsNz4sIExIUworICAzNzA5NDIxNDk4VSwJLy8gPDAsNywwLDI+OiBDb3N0IDQgdnNsZG9pNCA8MywwLDcsMD4sIDwyLDYsMyw3PgorICAyMjgxNzA1OTc4VSwJLy8gPDAsNywwLDM+OiBDb3N0IDMgdm1yZ2x3IDwwLDAsMCwwPiwgPDYsMiw3LDM+CisgIDI3ODU4MjU4MTZVLAkvLyA8MCw3LDAsND46IENvc3QgMyB2c2xkb2kxMiA8NSw2LDcsMD4sIDw3LDAsNCw1PgorICAyNzg1ODI1ODI2VSwJLy8gPDAsNywwLDU+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDA+LCA8NywwLDUsNj4KKyAgMjY1MzU5ODAzN1UsCS8vIDwwLDcsMCw2PjogQ29zdCAzIHZzbGRvaTQgPDYsMCw3LDA+LCA8NiwwLDcsMD4KKyAgMjIxNDU5ODI1MlUsCS8vIDwwLDcsMCw3PjogQ29zdCAzIHZtcmdodyA8MCwwLDAsMD4sIDw3LDcsNyw3PgorICAyNzA2MzA5Nzg5VSwJLy8gPDAsNywwLHU+OiBDb3N0IDMgdnNsZG9pOCA8Myw2LDAsNz4sIExIUworICAxMTQxNjkxMzg2VSwJLy8gPDAsNywxLDA+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDcsMCwxLDI+CisgIDIyMTU0MzMyOTBVLAkvLyA8MCw3LDEsMT46IENvc3QgMyB2bXJnaHcgTEhTLCA8NywxLDEsMT4KKyAgMjcwNjMxMDAzOFUsCS8vIDwwLDcsMSwyPjogQ29zdCAzIHZzbGRvaTggPDMsNiwwLDc+LCA8MSwyLDMsMD4KKyAgMjMyMjE5MDg0MlUsCS8vIDwwLDcsMSwzPjogQ29zdCAzIHZtcmdsdyA8Niw3LDAsMT4sIDw2LDIsNywzPgorICAxMTQxNjkxNzUwVSwJLy8gPDAsNywxLDQ+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDcsNCw1LDY+CisgIDIyMTU0MzM2NTRVLAkvLyA8MCw3LDEsNT46IENvc3QgMyB2bXJnaHcgTEhTLCA8Nyw1LDUsNT4KKyAgMjY1MzYwNjIzMFUsCS8vIDwwLDcsMSw2PjogQ29zdCAzIHZzbGRvaTQgPDYsMCw3LDE+LCA8NiwwLDcsMT4KKyAgMTE0MTY5MjAxMlUsCS8vIDwwLDcsMSw3PjogQ29zdCAyIHZtcmdodyBMSFMsIDw3LDcsNyw3PgorICAxMTQxNjkyMDM0VSwJLy8gPDAsNywxLHU+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDcsdSwxLDI+CisgIDI3ODU4MjU5NDBVLAkvLyA8MCw3LDIsMD46IENvc3QgMyB2c2xkb2kxMiA8NSw2LDcsMD4sIDw3LDIsMCwzPgorICAzNzY4MTA4NTc2VSwJLy8gPDAsNywyLDE+OiBDb3N0IDUgdnNsZG9pOCA8MSw2LDAsNz4sIDwyLDEsMywyPgorICAzNzgwMDUyNTg0VSwJLy8gPDAsNywyLDI+OiBDb3N0IDQgdnNsZG9pOCA8Myw2LDAsNz4sIDwyLDIsMiwyPgorICAyNzk0ODIwNzgwVSwJLy8gPDAsNywyLDM+OiBDb3N0IDMgdnNsZG9pMTIgPDcsMiwzLDA+LCA8NywyLDMsMD4KKyAgMzg1OTY0MTUyOFUsCS8vIDwwLDcsMiw0PjogQ29zdCA0IHZzbGRvaTEyIDw1LDYsdSwwPiwgPDcsMiw0LDM+CisgIDM3MzMzMjc5NzBVLAkvLyA8MCw3LDIsNT46IENvc3QgNCB2c2xkb2k0IDw3LDAsNywyPiwgPDUsNiw3LDA+CisgIDM3NzgwNjIyNjZVLAkvLyA8MCw3LDIsNj46IENvc3QgNCB2c2xkb2k4IDwzLDMsMCw3PiwgPDIsNiwzLDc+CisgIDM3MzMzMjg5NDRVLAkvLyA8MCw3LDIsNz46IENvc3QgNCB2c2xkb2k0IDw3LDAsNywyPiwgPDcsMCw3LDI+CisgIDI3OTUxODk0NjVVLAkvLyA8MCw3LDIsdT46IENvc3QgMyB2c2xkb2kxMiA8NywyLHUsMD4sIDw3LDIsdSwwPgorICAyMzI0ODYxMDI2VSwJLy8gPDAsNywzLDA+OiBDb3N0IDMgdm1yZ2x3IDw3LDIsMCwzPiwgPDUsNiw3LDA+CisgIDM3ODAwNTMyMzNVLAkvLyA8MCw3LDMsMT46IENvc3QgNCB2c2xkb2k4IDwzLDYsMCw3PiwgPDMsMSwyLDM+CisgIDM3ODAwNTMyOTZVLAkvLyA8MCw3LDMsMj46IENvc3QgNCB2c2xkb2k4IDwzLDYsMCw3PiwgPDMsMiwwLDM+CisgIDM3NzgwNjI3MjVVLAkvLyA8MCw3LDMsMz46IENvc3QgNCB2c2xkb2k4IDwzLDMsMCw3PiwgPDMsMywwLDc+CisgIDM3ODAwNTM1MDZVLAkvLyA8MCw3LDMsND46IENvc3QgNCB2c2xkb2k4IDwzLDYsMCw3PiwgPDMsNCw1LDY+CisgIDM4MDM5NDE0NjlVLAkvLyA8MCw3LDMsNT46IENvc3QgNCB2c2xkb2k4IDw3LDYsMCw3PiwgPDMsNSw2LDc+CisgIDI3MDYzMTE4MDBVLAkvLyA8MCw3LDMsNj46IENvc3QgMyB2c2xkb2k4IDwzLDYsMCw3PiwgPDMsNiwwLDc+CisgIDMzOTg2MDM1ODZVLAkvLyA8MCw3LDMsNz46IENvc3QgNCB2bXJnbHcgPDcsMiwwLDM+LCA8Niw2LDcsNz4KKyAgMjcwNzYzOTA2NlUsCS8vIDwwLDcsMyx1PjogQ29zdCAzIHZzbGRvaTggPDMsdSwwLDc+LCA8Myx1LDAsNz4KKyAgMjIxNzM2NjUyMlUsCS8vIDwwLDcsNCwwPjogQ29zdCAzIHZtcmdodyA8MCw0LDEsNT4sIDw3LDAsMSwyPgorICAzNzI3MzY5MTEwVSwJLy8gPDAsNyw0LDE+OiBDb3N0IDQgdnNsZG9pNCA8NiwwLDcsND4sIDwxLDIsMywwPgorICAzMjkxMTA4NTAwVSwJLy8gPDAsNyw0LDI+OiBDb3N0IDQgdm1yZ2h3IDwwLDQsMSw1PiwgPDcsMiwwLDM+CisgIDM3MjczNzA4NzJVLAkvLyA8MCw3LDQsMz46IENvc3QgNCB2c2xkb2k0IDw2LDAsNyw0PiwgPDMsNiwwLDc+CisgIDIyMTczNjY4ODZVLAkvLyA8MCw3LDQsND46IENvc3QgMyB2bXJnaHcgPDAsNCwxLDU+LCA8Nyw0LDUsNj4KKyAgMjcwNjMxMjUwMlUsCS8vIDwwLDcsNCw1PjogQ29zdCAzIHZzbGRvaTggPDMsNiwwLDc+LCBSSFMKKyAgMzc4NjAyNjMyMVUsCS8vIDwwLDcsNCw2PjogQ29zdCA0IHZzbGRvaTggPDQsNiwwLDc+LCA8NCw2LDAsNz4KKyAgMjIxNzM2NzE0OFUsCS8vIDwwLDcsNCw3PjogQ29zdCAzIHZtcmdodyA8MCw0LDEsNT4sIDw3LDcsNyw3PgorICAyNzA2MzEyNzQ1VSwJLy8gPDAsNyw0LHU+OiBDb3N0IDMgdnNsZG9pOCA8Myw2LDAsNz4sIFJIUworICAyMzIyMjIzMjAyVSwJLy8gPDAsNyw1LDA+OiBDb3N0IDMgdm1yZ2x3IDw2LDcsMCw1PiwgPDUsNiw3LDA+CisgIDMzOTk5NDY5ODdVLAkvLyA8MCw3LDUsMT46IENvc3QgNCB2bXJnbHcgPDcsNCwwLDU+LCA8Niw1LDcsMT4KKyAgMzI5MTc4MDI0NFUsCS8vIDwwLDcsNSwyPjogQ29zdCA0IHZtcmdodyA8MCw1LDEsNj4sIDw3LDIsMCwzPgorICAzNzI3Mzc4NTgyVSwJLy8gPDAsNyw1LDM+OiBDb3N0IDQgdnNsZG9pNCA8NiwwLDcsNT4sIDwzLDAsMSwyPgorICAzNzI3Mzc5NzY2VSwJLy8gPDAsNyw1LDQ+OiBDb3N0IDQgdnNsZG9pNCA8NiwwLDcsNT4sIFJIUworICAzODU5NTY4MDU0VSwJLy8gPDAsNyw1LDU+OiBDb3N0IDQgdnNsZG9pMTIgPDUsNiw3LDA+LCA8Nyw1LDUsNT4KKyAgMjc4NTgyNjI0MVUsCS8vIDwwLDcsNSw2PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDcsNSw2LDc+CisgIDMzOTU5NjU3NjJVLAkvLyA8MCw3LDUsNz46IENvc3QgNCB2bXJnbHcgPDYsNywwLDU+LCA8Niw2LDcsNz4KKyAgMjc4NzE1MzM2M1UsCS8vIDwwLDcsNSx1PjogQ29zdCAzIHZzbGRvaTEyIDw1LHUsNywwPiwgPDcsNSx1LDc+CisgIDI3ODU4MjYyNjhVLAkvLyA8MCw3LDYsMD46IENvc3QgMyB2c2xkb2kxMiA8NSw2LDcsMD4sIDw3LDYsMCw3PgorICAzNzgwMDU1NDIwVSwJLy8gPDAsNyw2LDE+OiBDb3N0IDUgdnNsZG9pOCA8Myw2LDAsNz4sIDw2LDEsMiwzPgorICAzODU5NTY4MTEwVSwJLy8gPDAsNyw2LDI+OiBDb3N0IDQgdnNsZG9pMTIgPDUsNiw3LDA+LCA8Nyw2LDIsNz4KKyAgMzg3NDUzNDkwM1UsCS8vIDwwLDcsNiwzPjogQ29zdCA0IHZzbGRvaTEyIDx1LDIsMywwPiwgPDcsNiwzLDc+CisgIDM4NTk2NDE4NTZVLAkvLyA8MCw3LDYsND46IENvc3QgNCB2c2xkb2kxMiA8NSw2LHUsMD4sIDw3LDYsNCw3PgorICAzNzMzMzYwNzM4VSwJLy8gPDAsNyw2LDU+OiBDb3N0IDQgdnNsZG9pNCA8NywwLDcsNj4sIDw1LDYsNywwPgorICAzODU5NTY4MTQ1VSwJLy8gPDAsNyw2LDY+OiBDb3N0IDQgdnNsZG9pMTIgPDUsNiw3LDA+LCA8Nyw2LDYsNj4KKyAgMjc5Nzc3MDI2MFUsCS8vIDwwLDcsNiw3PjogQ29zdCAzIHZzbGRvaTEyIDw3LDYsNywwPiwgPDcsNiw3LDA+CisgIDI3OTc4NDM5OTdVLAkvLyA8MCw3LDYsdT46IENvc3QgMyB2c2xkb2kxMiA8Nyw2LHUsMD4sIDw3LDYsdSwwPgorICAyNzg1ODI2MzQyVSwJLy8gPDAsNyw3LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDA+LCA8Nyw3LDAsMD4KKyAgMzcyNzM5MzY4NlUsCS8vIDwwLDcsNywxPjogQ29zdCA0IHZzbGRvaTQgPDYsMCw3LDc+LCA8MSwyLDMsMD4KKyAgMzg2ODU2MzAwM1UsCS8vIDwwLDcsNywyPjogQ29zdCA0IHZzbGRvaTEyIDw3LDIsMywwPiwgPDcsNywyLDM+CisgIDMzNzczOTc5ODhVLAkvLyA8MCw3LDcsMz46IENvc3QgNCB2bXJnbHcgPDMsNiwwLDc+LCA8MCwyLDcsMz4KKyAgMjIxOTM0OTM1MFUsCS8vIDwwLDcsNyw0PjogQ29zdCAzIHZtcmdodyA8MCw3LDEsND4sIDw3LDQsNSw2PgorICAzODU5NTY4MjE3VSwJLy8gPDAsNyw3LDU+OiBDb3N0IDQgdnNsZG9pMTIgPDUsNiw3LDA+LCA8Nyw3LDUsNj4KKyAgMjczMDIwMjU4OFUsCS8vIDwwLDcsNyw2PjogQ29zdCAzIHZzbGRvaTggPDcsNiwwLDc+LCA8Nyw2LDAsNz4KKyAgMjc4NTgyNjQxMlUsCS8vIDwwLDcsNyw3PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPDcsNyw3LDc+CisgIDI3MzE1Mjk4NTRVLAkvLyA8MCw3LDcsdT46IENvc3QgMyB2c2xkb2k4IDw3LHUsMCw3PiwgPDcsdSwwLDc+CisgIDExNDYzMzYyNTBVLAkvLyA8MCw3LHUsMD46IENvc3QgMiB2bXJnaHcgTEhTLCA8NywwLDEsMj4KKyAgMjcwNjMxNTA1NFUsCS8vIDwwLDcsdSwxPjogQ29zdCAzIHZzbGRvaTggPDMsNiwwLDc+LCBMSFMKKyAgMjY1MzY2MDg0NVUsCS8vIDwwLDcsdSwyPjogQ29zdCAzIHZzbGRvaTQgPDYsMCw3LHU+LCA8MiwzLDAsdT4KKyAgMjMyMjI0ODE4NlUsCS8vIDwwLDcsdSwzPjogQ29zdCAzIHZtcmdsdyA8Niw3LDAsdT4sIDw2LDIsNywzPgorICAxMTQ2MzM2NjE0VSwJLy8gPDAsNyx1LDQ+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDcsNCw1LDY+CisgIDI3MDYzMTU0MThVLAkvLyA8MCw3LHUsNT46IENvc3QgMyB2c2xkb2k4IDwzLDYsMCw3PiwgUkhTCisgIDI2NTM2NjM1ODFVLAkvLyA8MCw3LHUsNj46IENvc3QgMyB2c2xkb2k0IDw2LDAsNyx1PiwgPDYsMCw3LHU+CisgIDExNDYzMzY4NzZVLAkvLyA8MCw3LHUsNz46IENvc3QgMiB2bXJnaHcgTEhTLCA8Nyw3LDcsNz4KKyAgMTE0NjMzNjg5OFUsCS8vIDwwLDcsdSx1PjogQ29zdCAyIHZtcmdodyBMSFMsIDw3LHUsMSwyPgorICAyMDIxNjIyNzhVLAkvLyA8MCx1LDAsMD46IENvc3QgMSB2c3BsdGlzdzAgTEhTCisgIDE2MjQ2MTI5NjZVLAkvLyA8MCx1LDAsMT46IENvc3QgMiB2c2xkb2k4IDwyLDMsMCx1PiwgTEhTCisgIDI2Mjk3ODA5ODZVLAkvLyA8MCx1LDAsMj46IENvc3QgMyB2c2xkb2k0IDwyLDAsdSwwPiwgPDIsMCx1LDA+CisgIDEyMDc5NTk3MDhVLAkvLyA8MCx1LDAsMz46IENvc3QgMiB2bXJnbHcgPDAsMCwwLDA+LCBMSFMKKyAgMTU0NDA5NzA3OFUsCS8vIDwwLHUsMCw0PjogQ29zdCAyIHZzbGRvaTQgPDAsMCx1LDA+LCBSSFMKKyAgMTE0MDg1Njk4NlUsCS8vIDwwLHUsMCw1PjogQ29zdCAyIHZtcmdodyA8MCwwLDAsMD4sIFJIUworICAyNjk4MzU1MjUzVSwJLy8gPDAsdSwwLDY+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDAsdT4sIDwwLDYsdSw3PgorICAxMjA3OTYyOTUyVSwJLy8gPDAsdSwwLDc+OiBDb3N0IDIgdm1yZ2x3IDwwLDAsMCwwPiwgUkhTCisgIDIwMjE2MjI3OFUsCS8vIDwwLHUsMCx1PjogQ29zdCAxIHZzcGx0aXN3MCBMSFMKKyAgMTE0MjEzNDQ4M1UsCS8vIDwwLHUsMSwwPjogQ29zdCAyIHZtcmdodyBMSFMsIDx1LDAsMSwyPgorICA2Nzk1MDM4MlUsCS8vIDwwLHUsMSwxPjogQ29zdCAxIHZtcmdodyBMSFMsIExIUworICAxMTQyMTc1NjI0VSwJLy8gPDAsdSwxLDI+OiBDb3N0IDIgdm1yZ2h3IExIUywgPHUsMiwzLDM+CisgIDExNDIxNzU2NzZVLAkvLyA8MCx1LDEsMz46IENvc3QgMiB2bXJnaHcgTEhTLCA8dSwzLDAsMT4KKyAgMTE0MjEzNDg0N1UsCS8vIDwwLHUsMSw0PjogQ29zdCAyIHZtcmdodyBMSFMsIDx1LDQsNSw2PgorICA2Nzk1MDc0NlUsCS8vIDwwLHUsMSw1PjogQ29zdCAxIHZtcmdodyBMSFMsIFJIUworICAxMTQyMTc1OTUyVSwJLy8gPDAsdSwxLDY+OiBDb3N0IDIgdm1yZ2h3IExIUywgPHUsNiwzLDc+CisgIDEyMjE5MDU3MzZVLAkvLyA8MCx1LDEsNz46IENvc3QgMiB2bXJnbHcgPDIsMywwLDE+LCBSSFMKKyAgNjc5NTA5NDlVLAkvLyA8MCx1LDEsdT46IENvc3QgMSB2bXJnaHcgTEhTLCBMSFMKKyAgMTU2MjAyNjA4NlUsCS8vIDwwLHUsMiwwPjogQ29zdCAyIHZzbGRvaTQgPDMsMCx1LDI+LCBMSFMKKyAgMjIxNjAxNTY2MlUsCS8vIDwwLHUsMiwxPjogQ29zdCAzIHZtcmdodyA8MCwyLDEsMj4sIExIUworICAyNjk4MzU2MzI4VSwJLy8gPDAsdSwyLDI+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDAsdT4sIDwyLDIsMiwyPgorICA4MzU1ODRVLAkvLyA8MCx1LDIsMz46IENvc3QgMCBjb3B5IExIUworICAxNTYyMDI5MzY2VSwJLy8gPDAsdSwyLDQ+OiBDb3N0IDIgdnNsZG9pNCA8MywwLHUsMj4sIFJIUworICAyMjE2MDE2MDI2VSwJLy8gPDAsdSwyLDU+OiBDb3N0IDMgdm1yZ2h3IDwwLDIsMSwyPiwgUkhTCisgIDI2OTgzNTY2NjZVLAkvLyA8MCx1LDIsNj46IENvc3QgMyB2c2xkb2k4IDwyLDMsMCx1PiwgPDIsNiwzLDc+CisgIDE1ODU5MTkwMzNVLAkvLyA8MCx1LDIsNz46IENvc3QgMiB2c2xkb2k0IDw3LDAsdSwyPiwgPDcsMCx1LDI+CisgIDgzNTU4NFUsCS8vIDwwLHUsMix1PjogQ29zdCAwIGNvcHkgTEhTCisgIDI3NTg5ODk3NTZVLAkvLyA8MCx1LDMsMD46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsMD4sIDx1LDMsMCwxPgorICAyMjE2NjYyODMwVSwJLy8gPDAsdSwzLDE+OiBDb3N0IDMgdm1yZ2h3IDwwLDMsMSwwPiwgTEhTCisgIDI3MDM2NjU0NjFVLAkvLyA8MCx1LDMsMj46IENvc3QgMyB2c2xkb2k4IDwzLDIsMCx1PiwgPDMsMiwwLHU+CisgIDI3NTg5ODk3ODJVLAkvLyA8MCx1LDMsMz46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsMD4sIDx1LDMsMywwPgorICAyNzU4OTg5Nzk2VSwJLy8gPDAsdSwzLDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDA+LCA8dSwzLDQsNT4KKyAgMjIxNjY2MzE5NFUsCS8vIDwwLHUsMyw1PjogQ29zdCAzIHZtcmdodyA8MCwzLDEsMD4sIFJIUworICAyNzA2MzE5OTkzVSwJLy8gPDAsdSwzLDY+OiBDb3N0IDMgdnNsZG9pOCA8Myw2LDAsdT4sIDwzLDYsMCx1PgorICAyMzAwOTcyMzYwVSwJLy8gPDAsdSwzLDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDIsMCwzPiwgUkhTCisgIDIyMTY2NjMzOTdVLAkvLyA8MCx1LDMsdT46IENvc3QgMyB2bXJnaHcgPDAsMywxLDA+LCBMSFMKKyAgMjIxNzM2NzI1MVUsCS8vIDwwLHUsNCwwPjogQ29zdCAzIHZtcmdodyA8MCw0LDEsNT4sIDx1LDAsMSwyPgorICAxMTQzNjI1NTE4VSwJLy8gPDAsdSw0LDE+OiBDb3N0IDIgdm1yZ2h3IDwwLDQsMSw1PiwgTEhTCisgIDIyMTczNjc0MzJVLAkvLyA8MCx1LDQsMj46IENvc3QgMyB2bXJnaHcgPDAsNCwxLDU+LCA8dSwyLDMsMz4KKyAgMjIxNzM2NzQ4NFUsCS8vIDwwLHUsNCwzPjogQ29zdCAzIHZtcmdodyA8MCw0LDEsNT4sIDx1LDMsMCwxPgorICAxMTQzNjE5OTIyVSwJLy8gPDAsdSw0LDQ+OiBDb3N0IDIgdm1yZ2h3IDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDExNDM2MjU4ODJVLAkvLyA8MCx1LDQsNT46IENvc3QgMiB2bXJnaHcgPDAsNCwxLDU+LCBSSFMKKyAgMjIxNzM2Nzc2MFUsCS8vIDwwLHUsNCw2PjogQ29zdCAzIHZtcmdodyA8MCw0LDEsNT4sIDx1LDYsMyw3PgorICAyMjkxMDI3MjcyVSwJLy8gPDAsdSw0LDc+OiBDb3N0IDMgdm1yZ2x3IDwxLDUsMCw0PiwgUkhTCisgIDExNDM2MjYwODVVLAkvLyA8MCx1LDQsdT46IENvc3QgMiB2bXJnaHcgPDAsNCwxLDU+LCBMSFMKKyAgMjYzNTc5MjQ4NlUsCS8vIDwwLHUsNSwwPjogQ29zdCAzIHZzbGRvaTQgPDMsMCx1LDU+LCBMSFMKKyAgMjYzNTc5MzMwMlUsCS8vIDwwLHUsNSwxPjogQ29zdCAzIHZzbGRvaTQgPDMsMCx1LDU+LCA8MSwyLDMsMD4KKyAgMjMwMjMxNDY0NlUsCS8vIDwwLHUsNSwyPjogQ29zdCAzIHZtcmdsdyA8Myw0LDAsNT4sIDwzLDAsMSwyPgorICAyNjM1Nzk0NjQ4VSwJLy8gPDAsdSw1LDM+OiBDb3N0IDMgdnNsZG9pNCA8MywwLHUsNT4sIDwzLDAsdSw1PgorICAyNjM1Nzk1NzY2VSwJLy8gPDAsdSw1LDQ+OiBDb3N0IDMgdnNsZG9pNCA8MywwLHUsNT4sIFJIUworICAyNzE3NjAxNzU0VSwJLy8gPDAsdSw1LDU+OiBDb3N0IDMgdnNsZG9pOCA8NSw1LDAsdT4sIDw1LDUsMCx1PgorICAxNjg1MjQ4MTU0VSwJLy8gPDAsdSw1LDY+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMiwzLDA+LCBSSFMKKyAgMjMwMjMxNTg0OFUsCS8vIDwwLHUsNSw3PjogQ29zdCAzIHZtcmdsdyA8Myw0LDAsNT4sIFJIUworICAxNjg1MjQ4MTcyVSwJLy8gPDAsdSw1LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMiwzLDA+LCBSSFMKKyAgMjc1OTM1ODY0NVUsCS8vIDwwLHUsNiwwPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsdSwwPiwgPHUsNiwwLDc+CisgIDIyMTg2MzcxMDJVLAkvLyA8MCx1LDYsMT46IENvc3QgMyB2bXJnaHcgPDAsNiwwLDc+LCBMSFMKKyAgMjcyNDkwMTM3MFUsCS8vIDwwLHUsNiwyPjogQ29zdCAzIHZzbGRvaTggPDYsNywwLHU+LCA8NiwyLDcsMz4KKyAgMjc1ODk5MDAzMlUsCS8vIDwwLHUsNiwzPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMywwPiwgPHUsNiwzLDc+CisgIDI2NTk2OTE4MzBVLAkvLyA8MCx1LDYsND46IENvc3QgMyB2c2xkb2k0IDw3LDAsdSw2PiwgUkhTCisgIDI2NTk0NzE0NThVLAkvLyA8MCx1LDYsNT46IENvc3QgMyB2c2xkb2k0IDw3LDAsNSw2PiwgPDUsNiw3LDA+CisgIDI3MjQ5MDE2ODhVLAkvLyA8MCx1LDYsNj46IENvc3QgMyB2c2xkb2k4IDw2LDcsMCx1PiwgPDYsNiw2LDY+CisgIDE2NTExNTk4OTNVLAkvLyA8MCx1LDYsNz46IENvc3QgMiB2c2xkb2k4IDw2LDcsMCx1PiwgPDYsNywwLHU+CisgIDE2NTE4MjM1MjZVLAkvLyA8MCx1LDYsdT46IENvc3QgMiB2c2xkb2k4IDw2LHUsMCx1PiwgPDYsdSwwLHU+CisgIDI3ODU4MjcwNzJVLAkvLyA8MCx1LDcsMD46IENvc3QgMyB2c2xkb2kxMiA8NSw2LDcsMD4sIDx1LDcsMCwxPgorICAyODAzOTY0MTY4VSwJLy8gPDAsdSw3LDE+OiBDb3N0IDMgdnNsZG9pMTIgPHUsNywxLDA+LCA8dSw3LDEsMD4KKyAgMjcyNzU1NjI0OVUsCS8vIDwwLHUsNywyPjogQ29zdCAzIHZzbGRvaTggPDcsMiwwLHU+LCA8NywyLDAsdT4KKyAgMjMwMzY1NjA5MlUsCS8vIDwwLHUsNywzPjogQ29zdCAzIHZtcmdsdyA8Myw2LDAsNz4sIExIUworICAyNzg1ODI3MTEyVSwJLy8gPDAsdSw3LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDA+LCA8dSw3LDQsNT4KKyAgMjc4NTgyNzEyMlUsCS8vIDwwLHUsNyw1PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywwPiwgPHUsNyw1LDY+CisgIDI3MzAyMTA3ODFVLAkvLyA8MCx1LDcsNj46IENvc3QgMyB2c2xkb2k4IDw3LDYsMCx1PiwgPDcsNiwwLHU+CisgIDIzMDM2NTkzMzZVLAkvLyA8MCx1LDcsNz46IENvc3QgMyB2bXJnbHcgPDMsNiwwLDc+LCBSSFMKKyAgMjMwMzY1NjA5N1UsCS8vIDwwLHUsNyx1PjogQ29zdCAzIHZtcmdsdyA8Myw2LDAsNz4sIExIUworICAyMDIxNjIyNzhVLAkvLyA8MCx1LHUsMD46IENvc3QgMSB2c3BsdGlzdzAgTEhTCisgIDcyNTk1MjQ2VSwJLy8gPDAsdSx1LDE+OiBDb3N0IDEgdm1yZ2h3IExIUywgTEhTCisgIDExNDYzMzcxNjBVLAkvLyA8MCx1LHUsMj46IENvc3QgMiB2bXJnaHcgTEhTLCA8dSwyLDMsMz4KKyAgODM1NTg0VSwJLy8gPDAsdSx1LDM+OiBDb3N0IDAgY29weSBMSFMKKyAgMTE0NjMzNzM0M1UsCS8vIDwwLHUsdSw0PjogQ29zdCAyIHZtcmdodyBMSFMsIDx1LDQsNSw2PgorICA3MjU5NTYxMFUsCS8vIDwwLHUsdSw1PjogQ29zdCAxIHZtcmdodyBMSFMsIFJIUworICAxMTQ2MzM3NDg4VSwJLy8gPDAsdSx1LDY+OiBDb3N0IDIgdm1yZ2h3IExIUywgPHUsNiwzLDc+CisgIDEyMjE5NjMwODBVLAkvLyA8MCx1LHUsNz46IENvc3QgMiB2bXJnbHcgPDIsMywwLHU+LCBSSFMKKyAgODM1NTg0VSwJLy8gPDAsdSx1LHU+OiBDb3N0IDAgY29weSBMSFMKKyAgMjc1Njg1Mzc2MFUsCS8vIDwxLDAsMCwwPjogQ29zdCAzIHZzbGRvaTEyIDwwLHUsMSwxPiwgPDAsMCwwLDA+CisgIDE2Nzc4MDM1MzBVLAkvLyA8MSwwLDAsMT46IENvc3QgMiB2c2xkb2kxMiA8MCwwLDEsMT4sIDwwLDAsMSwxPgorICAzNzU5NDk3Mzg3VSwJLy8gPDEsMCwwLDI+OiBDb3N0IDQgdnNsZG9pOCA8MCwyLDEsMD4sIDwwLDIsMSwwPgorICAyNjg2NDE5MTk2VSwJLy8gPDEsMCwwLDM+OiBDb3N0IDMgdnNsZG9pOCA8MCwzLDEsMD4sIDwwLDMsMSwwPgorICAyNzUxNzY2NTY1VSwJLy8gPDEsMCwwLDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDAsMCw0LDE+LCA8MCwwLDQsMT4KKyAgMjY4Nzc0NjQ2MlUsCS8vIDwxLDAsMCw1PjogQ29zdCAzIHZzbGRvaTggPDAsNSwxLDA+LCA8MCw1LDEsMD4KKyAgMzc3NjA4NjUxOFUsCS8vIDwxLDAsMCw2PjogQ29zdCA0IHZzbGRvaTggPDMsMCwxLDA+LCA8MCw2LDEsNz4KKyAgMjY4OTA3MzcyOFUsCS8vIDwxLDAsMCw3PjogQ29zdCAzIHZzbGRvaTggPDAsNywxLDA+LCA8MCw3LDEsMD4KKyAgMTY3ODMxOTY4OVUsCS8vIDwxLDAsMCx1PjogQ29zdCAyIHZzbGRvaTEyIDwwLDAsdSwxPiwgPDAsMCx1LDE+CisgIDIyODcwOTE3MTJVLAkvLyA8MSwwLDEsMD46IENvc3QgMyB2bXJnbHcgPDAsdSwxLDE+LCA8MCwwLDAsMD4KKyAgMTE0NzU2ODIzMFUsCS8vIDwxLDAsMSwxPjogQ29zdCAyIHZtcmdodyA8MSwxLDEsMT4sIExIUworICAxNjgzMTEyMDM4VSwJLy8gPDEsMCwxLDI+OiBDb3N0IDIgdnNsZG9pMTIgPDAsdSwxLDE+LCBMSFMKKyAgMzI5NDk3MDEwOFUsCS8vIDwxLDAsMSwzPjogQ29zdCA0IHZtcmdodyA8MSwxLDAsMD4sIDwwLDMsMSwwPgorICAyNjIzODkyNzkwVSwJLy8gPDEsMCwxLDQ+OiBDb3N0IDMgdnNsZG9pNCA8MSwxLDAsMT4sIFJIUworICAyNjQ3NzgxMDA3VSwJLy8gPDEsMCwxLDU+OiBDb3N0IDMgdnNsZG9pNCA8NSwxLDAsMT4sIDw1LDEsMCwxPgorICAyNzkxOTQ4NDMwVSwJLy8gPDEsMCwxLDY+OiBDb3N0IDMgdnNsZG9pMTIgPDYsNywwLDE+LCA8MCwxLDYsNz4KKyAgMzcyMTUyNDIxOFUsCS8vIDwxLDAsMSw3PjogQ29zdCA0IHZzbGRvaTQgPDUsMSwwLDE+LCA8NywwLDEsMj4KKyAgMTY4MzExMjA5MlUsCS8vIDwxLDAsMSx1PjogQ29zdCAyIHZzbGRvaTEyIDwwLHUsMSwxPiwgTEhTCisgIDIyMjIxMTI3NjhVLAkvLyA8MSwwLDIsMD46IENvc3QgMyB2bXJnaHcgPDEsMiwzLDA+LCA8MCwwLDAsMD4KKyAgMTE0ODM3MTA0NlUsCS8vIDwxLDAsMiwxPjogQ29zdCAyIHZtcmdodyA8MSwyLDMsMD4sIExIUworICAzMzU2ODYyNTI0VSwJLy8gPDEsMCwyLDI+OiBDb3N0IDQgdm1yZ2x3IDwwLDIsMSwyPiwgPDIsdSwwLDI+CisgIDI3MDIzNDU4OTRVLAkvLyA8MSwwLDIsMz46IENvc3QgMyB2c2xkb2k4IDwzLDAsMSwwPiwgPDIsMywwLDE+CisgIDIyMjIxMTMxMDZVLAkvLyA8MSwwLDIsND46IENvc3QgMyB2bXJnaHcgPDEsMiwzLDA+LCA8MCw0LDEsNT4KKyAgMjI5OTcwOTkwOFUsCS8vIDwxLDAsMiw1PjogQ29zdCAzIHZtcmdsdyA8MywwLDEsMj4sIDwzLDQsMCw1PgorICAzNzYwMTYyNzQ2VSwJLy8gPDEsMCwyLDY+OiBDb3N0IDQgdnNsZG9pOCA8MCwzLDEsMD4sIDwyLDYsMyw3PgorICAzMzY5NDcwNTg0VSwJLy8gPDEsMCwyLDc+OiBDb3N0IDQgdm1yZ2x3IDwyLDMsMSwyPiwgPDMsNiwwLDc+CisgIDExNDgzNzE2MTNVLAkvLyA8MSwwLDIsdT46IENvc3QgMiB2bXJnaHcgPDEsMiwzLDA+LCBMSFMKKyAgMjY4NjQyMTE0MlUsCS8vIDwxLDAsMywwPjogQ29zdCAzIHZzbGRvaTggPDAsMywxLDA+LCA8MywwLDEsMj4KKyAgMjI4MzEyODQ4NlUsCS8vIDwxLDAsMywxPjogQ29zdCAzIHZtcmdsdyA8MCwyLDEsMz4sIDwyLDMsMCwxPgorICAzMjk2MzA1MzI2VSwJLy8gPDEsMCwzLDI+OiBDb3N0IDQgdm1yZ2h3IDwxLDMsMCwxPiwgPDAsMiwxLDM+CisgIDM3NjAxNjMxOTlVLAkvLyA8MSwwLDMsMz46IENvc3QgNCB2c2xkb2k4IDwwLDMsMSwwPiwgPDMsMywwLDE+CisgIDM3NjAxNjMzMzBVLAkvLyA8MSwwLDMsND46IENvc3QgNCB2c2xkb2k4IDwwLDMsMSwwPiwgPDMsNCw1LDY+CisgIDM3Nzk0MDYzNzdVLAkvLyA8MSwwLDMsNT46IENvc3QgNCB2c2xkb2k4IDwzLDUsMSwwPiwgPDMsNSwxLDA+CisgIDM4NjU2OTA0MTZVLAkvLyA8MSwwLDMsNj46IENvc3QgNCB2c2xkb2kxMiA8Niw3LDAsMT4sIDwwLDMsNiw3PgorICAzMzY2ODI0NTY4VSwJLy8gPDEsMCwzLDc+OiBDb3N0IDUgdm1yZ2x3IDwxLHUsMSwzPiwgPDMsNiwwLDc+CisgIDI3MDc2NTU0NTJVLAkvLyA8MSwwLDMsdT46IENvc3QgMyB2c2xkb2k4IDwzLHUsMSwwPiwgPDMsdSwxLDA+CisgIDI3MzQ4NjEyMDJVLAkvLyA8MSwwLDQsMD46IENvc3QgMyB2c2xkb2k4IDx1LDQsMSwwPiwgPDQsMCw1LDE+CisgIDI3NTY4NTQwOThVLAkvLyA8MSwwLDQsMT46IENvc3QgMyB2c2xkb2kxMiA8MCx1LDEsMT4sIDwwLDQsMSw1PgorICAzODMwNTk1OTMxVSwJLy8gPDEsMCw0LDI+OiBDb3N0IDUgdnNsZG9pMTIgPDAsdSwxLDE+LCA8MCw0LDIsNT4KKyAgMzI5Njk2ODk2MFUsCS8vIDwxLDAsNCwzPjogQ29zdCA0IHZtcmdodyA8MSw0LDAsMT4sIDwwLDMsMSw0PgorICAzODMwNTk1OTQ5VSwJLy8gPDEsMCw0LDQ+OiBDb3N0IDQgdnNsZG9pMTIgPDAsdSwxLDE+LCA8MCw0LDQsNT4KKyAgMjY4NjQyMjMyNlUsCS8vIDwxLDAsNCw1PjogQ29zdCAzIHZzbGRvaTggPDAsMywxLDA+LCBSSFMKKyAgMzI5NzM3ODgwNlUsCS8vIDwxLDAsNCw2PjogQ29zdCA1IHZtcmdodyA8MSw0LDUsNj4sIDwwLDYsMSw3PgorICAzODEwNTk0MjQ4VSwJLy8gPDEsMCw0LDc+OiBDb3N0IDQgdnNsZG9pOCA8dSw3LDEsMD4sIDw0LDcsNSwwPgorICAyNjg2NDIyNTY5VSwJLy8gPDEsMCw0LHU+OiBDb3N0IDMgdnNsZG9pOCA8MCwzLDEsMD4sIFJIUworICAyMjg0NDcwMjcyVSwJLy8gPDEsMCw1LDA+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSw1PiwgPDAsMCwwLDA+CisgIDIyODQ0NzE5NzRVLAkvLyA8MSwwLDUsMT46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MiwzLDAsMT4KKyAgMzgwOTI2NzQzNVUsCS8vIDwxLDAsNSwyPjogQ29zdCA0IHZzbGRvaTggPHUsNSwxLDA+LCA8NSwyLDEsMz4KKyAgMzI5Nzk2ODM4NFUsCS8vIDwxLDAsNSwzPjogQ29zdCA0IHZtcmdodyA8MSw1LDQsNj4sIDwwLDMsMSw0PgorICAyMjg0NDcxOTc3VSwJLy8gPDEsMCw1LDQ+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSw1PiwgPDIsMywwLDQ+CisgIDM3MjE1NTU2MDNVLAkvLyA8MSwwLDUsNT46IENvc3QgNCB2c2xkb2k0IDw1LDEsMCw1PiwgPDUsMSwwLDU+CisgIDM3OTI2NzkwMTBVLAkvLyA8MSwwLDUsNj46IENvc3QgNCB2c2xkb2k4IDw1LDcsMSwwPiwgPDUsNiw3LDA+CisgIDM3OTI2NzkwMzdVLAkvLyA8MSwwLDUsNz46IENvc3QgNCB2c2xkb2k4IDw1LDcsMSwwPiwgPDUsNywxLDA+CisgIDIyODQ0NzE5ODFVLAkvLyA8MSwwLDUsdT46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MiwzLDAsdT4KKyAgMzM1Njg5MzE4NFUsCS8vIDwxLDAsNiwwPjogQ29zdCA0IHZtcmdsdyA8MCwyLDEsNj4sIDwwLDAsMCwwPgorICAyMjI0Njc2OTY2VSwJLy8gPDEsMCw2LDE+OiBDb3N0IDMgdm1yZ2h3IDwxLDYsMSw3PiwgTEhTCisgIDMyOTgyOTU5ODVVLAkvLyA8MSwwLDYsMj46IENvc3QgNCB2bXJnaHcgPDEsNiwwLDE+LCA8MCwyLDEsNj4KKyAgMzI5ODM0NTIxMlUsCS8vIDwxLDAsNiwzPjogQ29zdCA0IHZtcmdodyA8MSw2LDAsNz4sIDwwLDMsMSwwPgorICAyMjI0OTcyMTE0VSwJLy8gPDEsMCw2LDQ+OiBDb3N0IDMgdm1yZ2h3IDwxLDYsNSw3PiwgPDAsNCwxLDU+CisgIDM4MDg2MDQ5MDdVLAkvLyA8MSwwLDYsNT46IENvc3QgNCB2c2xkb2k4IDx1LDQsMSwwPiwgPDYsNSw3LDE+CisgIDM3OTk5Nzg4MDhVLAkvLyA8MSwwLDYsNj46IENvc3QgNCB2c2xkb2k4IDw3LDAsMSwwPiwgPDYsNiw2LDY+CisgIDI3MjYyMzcwMDZVLAkvLyA8MSwwLDYsNz46IENvc3QgMyB2c2xkb2k4IDw3LDAsMSwwPiwgPDYsNywwLDE+CisgIDIyMjQ2Nzc1MjJVLAkvLyA8MSwwLDYsdT46IENvc3QgMyB2bXJnaHcgPDEsNiwxLDc+LCA8MCx1LDEsMT4KKyAgMjcyNjIzNzE3NlUsCS8vIDwxLDAsNywwPjogQ29zdCAzIHZzbGRvaTggPDcsMCwxLDA+LCA8NywwLDEsMD4KKyAgMjI4NTgxNTQ2MlUsCS8vIDwxLDAsNywxPjogQ29zdCAzIHZtcmdsdyA8MCw2LDEsNz4sIDwyLDMsMCwxPgorICAzODA1OTUxMTkzVSwJLy8gPDEsMCw3LDI+OiBDb3N0IDQgdnNsZG9pOCA8dSwwLDEsMD4sIDw3LDIsdSwwPgorICAzODA3OTQxODU5VSwJLy8gPDEsMCw3LDM+OiBDb3N0IDQgdnNsZG9pOCA8dSwzLDEsMD4sIDw3LDMsMCwxPgorICAzNzk5OTc5MzY2VSwJLy8gPDEsMCw3LDQ+OiBDb3N0IDQgdnNsZG9pOCA8NywwLDEsMD4sIDw3LDQsNSw2PgorICAzODAzMjk3MTY1VSwJLy8gPDEsMCw3LDU+OiBDb3N0IDQgdnNsZG9pOCA8Nyw1LDEsMD4sIDw3LDUsMSwwPgorICAzNzk5OTc5NTQwVSwJLy8gPDEsMCw3LDY+OiBDb3N0IDQgdnNsZG9pOCA8NywwLDEsMD4sIDw3LDYsNywwPgorICAzNzk5OTc5NjI4VSwJLy8gPDEsMCw3LDc+OiBDb3N0IDQgdnNsZG9pOCA8NywwLDEsMD4sIDw3LDcsNyw3PgorICAyNzMxNTQ2MjQwVSwJLy8gPDEsMCw3LHU+OiBDb3N0IDMgdnNsZG9pOCA8Nyx1LDEsMD4sIDw3LHUsMSwwPgorICAyMjg0NDk0ODQ4VSwJLy8gPDEsMCx1LDA+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSx1PiwgPDAsMCwwLDA+CisgIDE2ODMxMTI1OTRVLAkvLyA8MSwwLHUsMT46IENvc3QgMiB2c2xkb2kxMiA8MCx1LDEsMT4sIDwwLHUsMSwxPgorICAxNjgzMTEyNjA1VSwJLy8gPDEsMCx1LDI+OiBDb3N0IDIgdnNsZG9pMTIgPDAsdSwxLDE+LCBMSFMKKyAgMjczNDIwMDc3MlUsCS8vIDwxLDAsdSwzPjogQ29zdCAzIHZzbGRvaTggPHUsMywxLDA+LCA8dSwzLDEsMD4KKyAgMjc1NzA3NTYyOVUsCS8vIDwxLDAsdSw0PjogQ29zdCAzIHZzbGRvaTEyIDwwLHUsNCwxPiwgPDAsdSw0LDE+CisgIDI2ODY0MjUyNDJVLAkvLyA8MSwwLHUsNT46IENvc3QgMyB2c2xkb2k4IDwwLDMsMSwwPiwgUkhTCisgIDI3OTE5NDg0MzBVLAkvLyA8MSwwLHUsNj46IENvc3QgMyB2c2xkb2kxMiA8Niw3LDAsMT4sIDwwLDEsNiw3PgorICAyNzM2ODU1MzA0VSwJLy8gPDEsMCx1LDc+OiBDb3N0IDMgdnNsZG9pOCA8dSw3LDEsMD4sIDx1LDcsMSwwPgorICAxNjgzMTEyNjU5VSwJLy8gPDEsMCx1LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDAsdSwxLDE+LCBMSFMKKyAgMTYxMDY5NDY2NlUsCS8vIDwxLDEsMCwwPjogQ29zdCAyIHZzbGRvaTggPDAsMCwxLDE+LCA8MCwwLDEsMT4KKyAgMTYxNjAwMzE3NFUsCS8vIDwxLDEsMCwxPjogQ29zdCAyIHZzbGRvaTggPDAsdSwxLDE+LCBMSFMKKyAgMjI4Mzc2Nzk1OFUsCS8vIDwxLDEsMCwyPjogQ29zdCAzIHZtcmdsdyA8MCwzLDEsMD4sIDwzLDAsMSwyPgorICAzMzU3NTA3NTk2VSwJLy8gPDEsMSwwLDM+OiBDb3N0IDQgdm1yZ2x3IDwwLDMsMSwwPiwgPDAsMCwxLDM+CisgIDI2ODk3NDUyMzRVLAkvLyA8MSwxLDAsND46IENvc3QgMyB2c2xkb2k4IDwwLHUsMSwxPiwgPDAsNCwxLDU+CisgIDMzNTc1MDc5MjJVLAkvLyA8MSwxLDAsNT46IENvc3QgNCB2bXJnbHcgPDAsMywxLDA+LCA8MCw0LDEsNT4KKyAgMzI5NDM5NzY0N1UsCS8vIDwxLDEsMCw2PjogQ29zdCA0IHZtcmdodyA8MSwwLDEsMj4sIDwxLDYsMSw3PgorICAzMzczNDMzMzM0VSwJLy8gPDEsMSwwLDc+OiBDb3N0IDQgdm1yZ2x3IDwzLDAsMSwwPiwgPDAsNiwxLDc+CisgIDE2MTYwMDM3MzBVLAkvLyA8MSwxLDAsdT46IENvc3QgMiB2c2xkb2k4IDwwLHUsMSwxPiwgPDAsdSwxLDE+CisgIDE1NTAyMjE0MTRVLAkvLyA8MSwxLDEsMD46IENvc3QgMiB2c2xkb2k0IDwxLDEsMSwxPiwgTEhTCisgIDI2OTI3MTE0MlUsCS8vIDwxLDEsMSwxPjogQ29zdCAxIHZzcGx0aXN3MSBMSFMKKyAgMjI4NzA5MzkxMFUsCS8vIDwxLDEsMSwyPjogQ29zdCAzIHZtcmdsdyA8MCx1LDEsMT4sIDwzLDAsMSwyPgorICAyMjg3MDkyNjE1VSwJLy8gPDEsMSwxLDM+OiBDb3N0IDMgdm1yZ2x3IDwwLHUsMSwxPiwgPDEsMiwxLDM+CisgIDE1NTAyMjQ2OTRVLAkvLyA8MSwxLDEsND46IENvc3QgMiB2c2xkb2k0IDwxLDEsMSwxPiwgUkhTCisgIDIyODcwOTIwNTBVLAkvLyA8MSwxLDEsNT46IENvc3QgMyB2bXJnbHcgPDAsdSwxLDE+LCA8MCw0LDEsNT4KKyAgMjY4OTc0NjEyN1UsCS8vIDwxLDEsMSw2PjogQ29zdCAzIHZzbGRvaTggPDAsdSwxLDE+LCA8MSw2LDEsNz4KKyAgMjY1OTgwMDEzOFUsCS8vIDwxLDEsMSw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMSwxLDE+LCA8NywxLDEsMT4KKyAgMjY5MjcxMTQyVSwJLy8gPDEsMSwxLHU+OiBDb3N0IDEgdnNwbHRpc3cxIExIUworICAyMjIyMTEzNTE2VSwJLy8gPDEsMSwyLDA+OiBDb3N0IDMgdm1yZ2h3IDwxLDIsMywwPiwgPDEsMCwyLDE+CisgIDI3NTY4NTQ2NjNVLAkvLyA8MSwxLDIsMT46IENvc3QgMyB2c2xkb2kxMiA8MCx1LDEsMT4sIDwxLDIsMSwzPgorICAxMTQ4MzcxODYyVSwJLy8gPDEsMSwyLDI+OiBDb3N0IDIgdm1yZ2h3IDwxLDIsMywwPiwgPDEsMiwzLDA+CisgIDI2ODk3NDY1OThVLAkvLyA8MSwxLDIsMz46IENvc3QgMyB2c2xkb2k4IDwwLHUsMSwxPiwgPDIsMywwLDE+CisgIDI2MTgwMDI3NDJVLAkvLyA8MSwxLDIsND46IENvc3QgMyB2c2xkb2k0IDwwLDEsMSwyPiwgUkhTCisgIDIyOTk3MDc3MzBVLAkvLyA8MSwxLDIsNT46IENvc3QgMyB2bXJnbHcgPDMsMCwxLDI+LCA8MCw0LDEsNT4KKyAgMjY4OTc0Njg3NFUsCS8vIDwxLDEsMiw2PjogQ29zdCAzIHZzbGRvaTggPDAsdSwxLDE+LCA8Miw2LDMsNz4KKyAgMzM2MTUwNjUxMVUsCS8vIDwxLDEsMiw3PjogQ29zdCA0IHZtcmdsdyA8MSwwLDEsMj4sIDwxLDYsMSw3PgorICAxMTQ4MzcxODYyVSwJLy8gPDEsMSwyLHU+OiBDb3N0IDIgdm1yZ2h3IDwxLDIsMywwPiwgPDEsMiwzLDA+CisgIDI2ODk3NDcwOTRVLAkvLyA8MSwxLDMsMD46IENvc3QgMyB2c2xkb2k4IDwwLHUsMSwxPiwgPDMsMCwxLDI+CisgIDI2OTEwNzQyNzhVLAkvLyA8MSwxLDMsMT46IENvc3QgMyB2c2xkb2k4IDwxLDEsMSwxPiwgPDMsMSwxLDE+CisgIDMzNTY4NzA4MDZVLAkvLyA8MSwxLDMsMj46IENvc3QgNCB2bXJnbHcgPDAsMiwxLDM+LCA8MywwLDEsMj4KKyAgMjI4MzEyNjk1OFUsCS8vIDwxLDEsMywzPjogQ29zdCAzIHZtcmdsdyA8MCwyLDEsMz4sIDwwLDIsMSwzPgorICAyNjg5NzQ3NDU4VSwJLy8gPDEsMSwzLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MCx1LDEsMT4sIDwzLDQsNSw2PgorICAzMzU2ODY4OTQ2VSwJLy8gPDEsMSwzLDU+OiBDb3N0IDQgdm1yZ2x3IDwwLDIsMSwzPiwgPDAsNCwxLDU+CisgIDM4MTEyNjUxNDRVLAkvLyA8MSwxLDMsNj46IENvc3QgNCB2c2xkb2k4IDx1LHUsMSwxPiwgPDMsNiwwLDc+CisgIDMzNjI4NDE4MDdVLAkvLyA8MSwxLDMsNz46IENvc3QgNCB2bXJnbHcgPDEsMiwxLDM+LCA8MSw2LDEsNz4KKyAgMjY4OTc0Nzc0MlUsCS8vIDwxLDEsMyx1PjogQ29zdCAzIHZzbGRvaTggPDAsdSwxLDE+LCA8Myx1LDEsMj4KKyAgMjYyMzk4NzgxNFUsCS8vIDwxLDEsNCwwPjogQ29zdCAzIHZzbGRvaTQgPDEsMSwxLDQ+LCBMSFMKKyAgMjc1ODE4MTkzMVUsCS8vIDwxLDEsNCwxPjogQ29zdCAzIHZzbGRvaTEyIDwxLDEsMSwxPiwgPDEsNCwxLDU+CisgIDIyMjM0MDgwMjJVLAkvLyA8MSwxLDQsMj46IENvc3QgMyB2bXJnaHcgPDEsNCwyLDU+LCA8MSwyLDMsMD4KKyAgMzY5NzczMTczNFUsCS8vIDwxLDEsNCwzPjogQ29zdCA0IHZzbGRvaTQgPDEsMSwxLDQ+LCA8MywwLDEsMj4KKyAgMjI4Mzc5ODc4NFUsCS8vIDwxLDEsNCw0PjogQ29zdCAzIHZtcmdsdyA8MCwzLDEsND4sIDwwLDMsMSw0PgorICAxNjE2MDA2NDU0VSwJLy8gPDEsMSw0LDU+OiBDb3N0IDIgdnNsZG9pOCA8MCx1LDEsMT4sIFJIUworICAzMjk3Mzc5NTM1VSwJLy8gPDEsMSw0LDY+OiBDb3N0IDQgdm1yZ2h3IDwxLDQsNSw2PiwgPDEsNiwxLDc+CisgIDMzNzM0NjYxMDJVLAkvLyA8MSwxLDQsNz46IENvc3QgNCB2bXJnbHcgPDMsMCwxLDQ+LCA8MCw2LDEsNz4KKyAgMTYxNjAwNjY5N1UsCS8vIDwxLDEsNCx1PjogQ29zdCAyIHZzbGRvaTggPDAsdSwxLDE+LCBSSFMKKyAgMjc2MDc2MjQ3OVUsCS8vIDwxLDEsNSwwPjogQ29zdCAzIHZzbGRvaTEyIDwxLDUsMCwxPiwgPDEsNSwwLDE+CisgIDIyODQ0NzAyODJVLAkvLyA8MSwxLDUsMT46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MCwwLDEsMT4KKyAgMjI4NDQ3MjQ3MFUsCS8vIDwxLDEsNSwyPjogQ29zdCAzIHZtcmdsdyA8MCw0LDEsNT4sIDwzLDAsMSwyPgorICAzMzU4MjEyMjcwVSwJLy8gPDEsMSw1LDM+OiBDb3N0IDQgdm1yZ2x3IDwwLDQsMSw1PiwgPDAsMiwxLDM+CisgIDIyODQ0NzAyODVVLAkvLyA8MSwxLDUsND46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MCwwLDEsND4KKyAgMTIxMDcyODc4NlUsCS8vIDwxLDEsNSw1PjogQ29zdCAyIHZtcmdsdyA8MCw0LDEsNT4sIDwwLDQsMSw1PgorICAyNzM3NTI0ODM0VSwJLy8gPDEsMSw1LDY+OiBDb3N0IDMgdnNsZG9pOCA8dSx1LDEsMT4sIDw1LDYsNywwPgorICAzMzYwODY3NTM1VSwJLy8gPDEsMSw1LDc+OiBDb3N0IDQgdm1yZ2x3IDwwLHUsMSw1PiwgPDEsNiwxLDc+CisgIDEyMTA3Mjg3ODZVLAkvLyA8MSwxLDUsdT46IENvc3QgMiB2bXJnbHcgPDAsNCwxLDU+LCA8MCw0LDEsNT4KKyAgMzY5Nzc0NjAyMlUsCS8vIDwxLDEsNiwwPjogQ29zdCA0IHZzbGRvaTQgPDEsMSwxLDY+LCBMSFMKKyAgMjc1Njg1NDk5MVUsCS8vIDwxLDEsNiwxPjogQ29zdCAzIHZzbGRvaTEyIDwwLHUsMSwxPiwgPDEsNiwxLDc+CisgIDI3Mzc1MjUyNDJVLAkvLyA8MSwxLDYsMj46IENvc3QgMyB2c2xkb2k4IDx1LHUsMSwxPiwgPDYsMiw3LDM+CisgIDM4MzkxNDkyODFVLAkvLyA8MSwxLDYsMz46IENvc3QgNCB2c2xkb2kxMiA8MiwzLDAsMT4sIDwxLDYsMyw3PgorICAzNjk3NzQ5MzAyVSwJLy8gPDEsMSw2LDQ+OiBDb3N0IDQgdnNsZG9pNCA8MSwxLDEsNj4sIFJIUworICAzMzU2ODkzNTIyVSwJLy8gPDEsMSw2LDU+OiBDb3N0IDQgdm1yZ2x3IDwwLDIsMSw2PiwgPDAsNCwxLDU+CisgIDIyODMxNTE1MzdVLAkvLyA8MSwxLDYsNj46IENvc3QgMyB2bXJnbHcgPDAsMiwxLDY+LCA8MCwyLDEsNj4KKyAgMjc5MTk0OTU2NlUsCS8vIDwxLDEsNiw3PjogQ29zdCAzIHZzbGRvaTEyIDw2LDcsMCwxPiwgPDEsNiw3LDA+CisgIDI3OTI2MTMxMjdVLAkvLyA8MSwxLDYsdT46IENvc3QgMyB2c2xkb2kxMiA8Nix1LDAsMT4sIDwxLDYsdSwwPgorICAyNzM3NTI1NzU0VSwJLy8gPDEsMSw3LDA+OiBDb3N0IDMgdnNsZG9pOCA8dSx1LDEsMT4sIDw3LDAsMSwyPgorICAyMjkxNzg2Mzg2VSwJLy8gPDEsMSw3LDE+OiBDb3N0IDMgdm1yZ2x3IDwxLDYsMSw3PiwgPDAsdSwxLDE+CisgIDMzNjU1MjgyOTJVLAkvLyA8MSwxLDcsMj46IENvc3QgNCB2bXJnbHcgPDEsNiwxLDc+LCA8MSwwLDEsMj4KKyAgMzM2NTUyODQ1NVUsCS8vIDwxLDEsNywzPjogQ29zdCA0IHZtcmdsdyA8MSw2LDEsNz4sIDwxLDIsMSwzPgorICAyNzM3NTI2MTE4VSwJLy8gPDEsMSw3LDQ+OiBDb3N0IDMgdnNsZG9pOCA8dSx1LDEsMT4sIDw3LDQsNSw2PgorICAzMzY1NTI3ODkwVSwJLy8gPDEsMSw3LDU+OiBDb3N0IDQgdm1yZ2x3IDwxLDYsMSw3PiwgPDAsNCwxLDU+CisgIDMzNjU1MjgzNzdVLAkvLyA8MSwxLDcsNj46IENvc3QgNCB2bXJnbHcgPDEsNiwxLDc+LCA8MSwxLDEsNj4KKyAgMjI5MTc4Njk1OVUsCS8vIDwxLDEsNyw3PjogQ29zdCAzIHZtcmdsdyA8MSw2LDEsNz4sIDwxLDYsMSw3PgorICAyNzM3NTI2NDAyVSwJLy8gPDEsMSw3LHU+OiBDb3N0IDMgdnNsZG9pOCA8dSx1LDEsMT4sIDw3LHUsMSwyPgorICAxNTUwMjIxNDE0VSwJLy8gPDEsMSx1LDA+OiBDb3N0IDIgdnNsZG9pNCA8MSwxLDEsMT4sIExIUworICAyNjkyNzExNDJVLAkvLyA8MSwxLHUsMT46IENvc3QgMSB2c3BsdGlzdzEgTEhTCisgIDExNDgzNzE4NjJVLAkvLyA8MSwxLHUsMj46IENvc3QgMiB2bXJnaHcgPDEsMiwzLDA+LCA8MSwyLDMsMD4KKyAgMjY4OTc1MDk3MlUsCS8vIDwxLDEsdSwzPjogQ29zdCAzIHZzbGRvaTggPDAsdSwxLDE+LCA8dSwzLDAsMT4KKyAgMTU1MDIyNDY5NFUsCS8vIDwxLDEsdSw0PjogQ29zdCAyIHZzbGRvaTQgPDEsMSwxLDE+LCBSSFMKKyAgMTYxNjAwOTM3MFUsCS8vIDwxLDEsdSw1PjogQ29zdCAyIHZzbGRvaTggPDAsdSwxLDE+LCBSSFMKKyAgMjY4OTc1MTI0OFUsCS8vIDwxLDEsdSw2PjogQ29zdCAzIHZzbGRvaTggPDAsdSwxLDE+LCA8dSw2LDMsNz4KKyAgMjczNjg2MzQ5N1UsCS8vIDwxLDEsdSw3PjogQ29zdCAzIHZzbGRvaTggPHUsNywxLDE+LCA8dSw3LDEsMT4KKyAgMjY5MjcxMTQyVSwJLy8gPDEsMSx1LHU+OiBDb3N0IDEgdnNwbHRpc3cxIExIUworICAyNzAyMzYwNTc2VSwJLy8gPDEsMiwwLDA+OiBDb3N0IDMgdnNsZG9pOCA8MywwLDEsMj4sIDwwLDAsMCwwPgorICAxNjI4NjE4ODU0VSwJLy8gPDEsMiwwLDE+OiBDb3N0IDIgdnNsZG9pOCA8MywwLDEsMj4sIExIUworICAyNjg1NzcxOTQ5VSwJLy8gPDEsMiwwLDI+OiBDb3N0IDMgdnNsZG9pOCA8MCwyLDEsMj4sIDwwLDIsMSwyPgorICAyMjgzNzY1ODYyVSwJLy8gPDEsMiwwLDM+OiBDb3N0IDMgdm1yZ2x3IDwwLDMsMSwwPiwgTEhTCisgIDI3MDIzNjA5MTRVLAkvLyA8MSwyLDAsND46IENvc3QgMyB2c2xkb2k4IDwzLDAsMSwyPiwgPDAsNCwxLDU+CisgIDM3ODgwNDY4MTNVLAkvLyA8MSwyLDAsNT46IENvc3QgNCB2c2xkb2k4IDw1LDAsMSwyPiwgPDAsNSx1LDA+CisgIDI2ODg0MjY0ODFVLAkvLyA8MSwyLDAsNj46IENvc3QgMyB2c2xkb2k4IDwwLDYsMSwyPiwgPDAsNiwxLDI+CisgIDI3MjYyNDkwMjRVLAkvLyA8MSwyLDAsNz46IENvc3QgMyB2c2xkb2k4IDw3LDAsMSwyPiwgPDAsNywxLDA+CisgIDE2Mjg2MTk0MjFVLAkvLyA8MSwyLDAsdT46IENvc3QgMiB2c2xkb2k4IDwzLDAsMSwyPiwgTEhTCisgIDI2OTA0MTczODBVLAkvLyA8MSwyLDEsMD46IENvc3QgMyB2c2xkb2k4IDwxLDAsMSwyPiwgPDEsMCwxLDI+CisgIDI3MDIzNjEzOTZVLAkvLyA8MSwyLDEsMT46IENvc3QgMyB2c2xkb2k4IDwzLDAsMSwyPiwgPDEsMSwxLDE+CisgIDIyODcwOTMzNTJVLAkvLyA8MSwyLDEsMj46IENvc3QgMyB2bXJnbHcgPDAsdSwxLDE+LCA8MiwyLDIsMj4KKyAgMTIxMzM0OTk5MFUsCS8vIDwxLDIsMSwzPjogQ29zdCAyIHZtcmdsdyA8MCx1LDEsMT4sIExIUworICAzNzY0MTU5NTIyVSwJLy8gPDEsMiwxLDQ+OiBDb3N0IDQgdnNsZG9pOCA8MSwwLDEsMj4sIDwxLDQsMCw1PgorICAzMjk1MDUzNjcyVSwJLy8gPDEsMiwxLDU+OiBDb3N0IDQgdm1yZ2h3IDwxLDEsMSwxPiwgPDIsNSwzLDY+CisgIDIyMjEzMTE5MzBVLAkvLyA8MSwyLDEsNj46IENvc3QgMyB2bXJnaHcgPDEsMSwxLDE+LCA8Miw2LDMsNz4KKyAgMzc5OTk5MTU5M1UsCS8vIDwxLDIsMSw3PjogQ29zdCA0IHZzbGRvaTggPDcsMCwxLDI+LCA8MSw3LDIsNz4KKyAgMTIxMzM0OTk5NVUsCS8vIDwxLDIsMSx1PjogQ29zdCAyIHZtcmdsdyA8MCx1LDEsMT4sIExIUworICAyNjI0MDQ1MTU4VSwJLy8gPDEsMiwyLDA+OiBDb3N0IDMgdnNsZG9pNCA8MSwxLDIsMj4sIExIUworICAyNzAyMzYyMTQ0VSwJLy8gPDEsMiwyLDE+OiBDb3N0IDMgdnNsZG9pOCA8MywwLDEsMj4sIDwyLDEsMywyPgorICAyMjgzMTIwMjMyVSwJLy8gPDEsMiwyLDI+OiBDb3N0IDMgdm1yZ2x3IDwwLDIsMSwyPiwgPDIsMiwyLDI+CisgIDEyMjU5NjU2NzBVLAkvLyA8MSwyLDIsMz46IENvc3QgMiB2bXJnbHcgPDMsMCwxLDI+LCBMSFMKKyAgMjYyNDA0ODQzOFUsCS8vIDwxLDIsMiw0PjogQ29zdCAzIHZzbGRvaTQgPDEsMSwyLDI+LCBSSFMKKyAgMzM1Njg2MDc2M1UsCS8vIDwxLDIsMiw1PjogQ29zdCA0IHZtcmdsdyA8MCwyLDEsMj4sIDwwLDQsMiw1PgorICAyMjIyMTE0NzQ2VSwJLy8gPDEsMiwyLDY+OiBDb3N0IDMgdm1yZ2h3IDwxLDIsMywwPiwgPDIsNiwzLDc+CisgIDIyOTk3MDg2MzJVLAkvLyA8MSwyLDIsNz46IENvc3QgMyB2bXJnbHcgPDMsMCwxLDI+LCA8MSw2LDIsNz4KKyAgMTIyNTk2NTY3NVUsCS8vIDwxLDIsMix1PjogQ29zdCAyIHZtcmdsdyA8MywwLDEsMj4sIExIUworICA0NzA1OTc3MzRVLAkvLyA8MSwyLDMsMD46IENvc3QgMSB2c2xkb2k0IExIUywgTEhTCisgIDE1NDQzNDAyNzZVLAkvLyA8MSwyLDMsMT46IENvc3QgMiB2c2xkb2k0IExIUywgPDEsMSwxLDE+CisgIDE1NDQzNDEwOTZVLAkvLyA8MSwyLDMsMj46IENvc3QgMiB2c2xkb2k0IExIUywgPDIsMiwyLDI+CisgIDE1NDQzNDE5MTZVLAkvLyA8MSwyLDMsMz46IENvc3QgMiB2c2xkb2k0IExIUywgPDMsMywzLDM+CisgIDQ3MDYwMTAxNFUsCS8vIDwxLDIsMyw0PjogQ29zdCAxIHZzbGRvaTQgTEhTLCBSSFMKKyAgMTU5MjExOTMwMFUsCS8vIDwxLDIsMyw1PjogQ29zdCAyIHZzbGRvaTQgTEhTLCA8NSw1LDUsNT4KKyAgMTU5MjExOTgwMlUsCS8vIDwxLDIsMyw2PjogQ29zdCAyIHZzbGRvaTQgTEhTLCA8NiwyLDcsMz4KKyAgMTU5MjEyMDMxNFUsCS8vIDwxLDIsMyw3PjogQ29zdCAyIHZzbGRvaTQgTEhTLCA8NywwLDEsMj4KKyAgNDcwNjAzNTY2VSwJLy8gPDEsMiwzLHU+OiBDb3N0IDEgdnNsZG9pNCBMSFMsIExIUworICAyNzA4MzM1NDcxVSwJLy8gPDEsMiw0LDA+OiBDb3N0IDMgdnNsZG9pOCA8NCwwLDEsMj4sIDw0LDAsMSwyPgorICAzODM4MDQzOTA4VSwJLy8gPDEsMiw0LDE+OiBDb3N0IDQgdnNsZG9pMTIgPDIsMSwzLDE+LCA8Miw0LDEsNT4KKyAgMzM1NzU0MTk5MlUsCS8vIDwxLDIsNCwyPjogQ29zdCA0IHZtcmdsdyA8MCwzLDEsND4sIDwyLDIsMiwyPgorICAyMjgzNzk4NjMwVSwJLy8gPDEsMiw0LDM+OiBDb3N0IDMgdm1yZ2x3IDwwLDMsMSw0PiwgTEhTCisgIDI3MjYyNTE3MjhVLAkvLyA8MSwyLDQsND46IENvc3QgMyB2c2xkb2k4IDw3LDAsMSwyPiwgPDQsNCw0LDQ+CisgIDE2Mjg2MjIxMzRVLAkvLyA8MSwyLDQsNT46IENvc3QgMiB2c2xkb2k4IDwzLDAsMSwyPiwgUkhTCisgIDMyOTcwNzcxNzhVLAkvLyA8MSwyLDQsNj46IENvc3QgNCB2bXJnaHcgPDEsNCwxLDU+LCA8Miw2LDMsNz4KKyAgMjcyNjI1MTk3NlUsCS8vIDwxLDIsNCw3PjogQ29zdCAzIHZzbGRvaTggPDcsMCwxLDI+LCA8NCw3LDUsMD4KKyAgMTYyODYyMjM3N1UsCS8vIDwxLDIsNCx1PjogQ29zdCAyIHZzbGRvaTggPDMsMCwxLDI+LCBSSFMKKyAgMjcxNDMwODE2OFUsCS8vIDwxLDIsNSwwPjogQ29zdCAzIHZzbGRvaTggPDUsMCwxLDI+LCA8NSwwLDEsMj4KKyAgMzI5NzYzMzgyN1UsCS8vIDwxLDIsNSwxPjogQ29zdCA0IHZtcmdodyA8MSw1LDAsMT4sIDwyLDEsMyw1PgorICAyMjg0NDcxOTEyVSwJLy8gPDEsMiw1LDI+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSw1PiwgPDIsMiwyLDI+CisgIDEyMTA3Mjg1NTBVLAkvLyA8MSwyLDUsMz46IENvc3QgMiB2bXJnbHcgPDAsNCwxLDU+LCBMSFMKKyAgMzc3NjEwNjQyMFUsCS8vIDwxLDIsNSw0PjogQ29zdCA0IHZzbGRvaTggPDMsMCwxLDI+LCA8NSw0LDUsNj4KKyAgMjcyNjI1MjU0OFUsCS8vIDwxLDIsNSw1PjogQ29zdCAzIHZzbGRvaTggPDcsMCwxLDI+LCA8NSw1LDUsNT4KKyAgMjcyNjI1MjY0MlUsCS8vIDwxLDIsNSw2PjogQ29zdCAzIHZzbGRvaTggPDcsMCwxLDI+LCA8NSw2LDcsMD4KKyAgMzc5OTk5NDUzOFUsCS8vIDwxLDIsNSw3PjogQ29zdCA0IHZzbGRvaTggPDcsMCwxLDI+LCA8NSw3LDYsMD4KKyAgMTIxMDcyODU1NVUsCS8vIDwxLDIsNSx1PjogQ29zdCAyIHZtcmdsdyA8MCw0LDEsNT4sIExIUworICAyNzIwMjgwODY1VSwJLy8gPDEsMiw2LDA+OiBDb3N0IDMgdnNsZG9pOCA8NiwwLDEsMj4sIDw2LDAsMSwyPgorICAyNzAyMzY1MDk2VSwJLy8gPDEsMiw2LDE+OiBDb3N0IDMgdnNsZG9pOCA8MywwLDEsMj4sIDw2LDEsNywyPgorICAyNzI2MjUzMDUwVSwJLy8gPDEsMiw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8NywwLDEsMj4sIDw2LDIsNywzPgorICAyMjgzMTUxNDYyVSwJLy8gPDEsMiw2LDM+OiBDb3N0IDMgdm1yZ2x3IDwwLDIsMSw2PiwgTEhTCisgIDM2OTc4MjMwMzBVLAkvLyA8MSwyLDYsND46IENvc3QgNCB2c2xkb2k0IDwxLDEsMiw2PiwgUkhTCisgIDMyOTg3MTU0OTdVLAkvLyA8MSwyLDYsNT46IENvc3QgNCB2bXJnaHcgPDEsNiw1LDc+LCA8Miw1LDMsNz4KKyAgMjcyNjI1MzM2OFUsCS8vIDwxLDIsNiw2PjogQ29zdCAzIHZzbGRvaTggPDcsMCwxLDI+LCA8Niw2LDYsNj4KKyAgMjcyNDkyNjI5NlUsCS8vIDwxLDIsNiw3PjogQ29zdCAzIHZzbGRvaTggPDYsNywxLDI+LCA8Niw3LDEsMj4KKyAgMjI4MzE1MTQ2N1UsCS8vIDwxLDIsNix1PjogQ29zdCAzIHZtcmdsdyA8MCwyLDEsNj4sIExIUworICAxNjUyNTExNzM4VSwJLy8gPDEsMiw3LDA+OiBDb3N0IDIgdnNsZG9pOCA8NywwLDEsMj4sIDw3LDAsMSwyPgorICAzMzcxNTAwOTE2VSwJLy8gPDEsMiw3LDE+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMSw3PiwgPDEsdSwyLDE+CisgIDMzNjU1MjkxOTJVLAkvLyA8MSwyLDcsMj46IENvc3QgNCB2bXJnbHcgPDEsNiwxLDc+LCA8MiwyLDIsMj4KKyAgMjI5MTc4NTgzMFUsCS8vIDwxLDIsNywzPjogQ29zdCAzIHZtcmdsdyA8MSw2LDEsNz4sIExIUworICAyNzI2MjUzOTI2VSwJLy8gPDEsMiw3LDQ+OiBDb3N0IDMgdnNsZG9pOCA8NywwLDEsMj4sIDw3LDQsNSw2PgorICAzNzg4MDUxODQ1VSwJLy8gPDEsMiw3LDU+OiBDb3N0IDQgdnNsZG9pOCA8NSwwLDEsMj4sIDw3LDUsMCwxPgorICAzNzk0MDIzODk0VSwJLy8gPDEsMiw3LDY+OiBDb3N0IDQgdnNsZG9pOCA8NiwwLDEsMj4sIDw3LDYsMCwxPgorICAyNzI2MjU0MTE5VSwJLy8gPDEsMiw3LDc+OiBDb3N0IDMgdnNsZG9pOCA8NywwLDEsMj4sIDw3LDcsMCwxPgorICAxNjU3ODIwODAyVSwJLy8gPDEsMiw3LHU+OiBDb3N0IDIgdnNsZG9pOCA8Nyx1LDEsMj4sIDw3LHUsMSwyPgorICA0NzA2Mzg2OTlVLAkvLyA8MSwyLHUsMD46IENvc3QgMSB2c2xkb2k0IExIUywgTEhTCisgIDE1NDQzODEyMzZVLAkvLyA8MSwyLHUsMT46IENvc3QgMiB2c2xkb2k0IExIUywgPDEsMSwxLDE+CisgIDE1NDQzODIwNTZVLAkvLyA8MSwyLHUsMj46IENvc3QgMiB2c2xkb2k0IExIUywgPDIsMiwyLDI+CisgIDE1NDQzODI2MTRVLAkvLyA8MSwyLHUsMz46IENvc3QgMiB2c2xkb2k0IExIUywgPDMsMCwxLDI+CisgIDQ3MDY0MTk3NFUsCS8vIDwxLDIsdSw0PjogQ29zdCAxIHZzbGRvaTQgTEhTLCBSSFMKKyAgMTYyODYyNTA1MFUsCS8vIDwxLDIsdSw1PjogQ29zdCAyIHZzbGRvaTggPDMsMCwxLDI+LCBSSFMKKyAgMTU5MjE2MDc2MlUsCS8vIDwxLDIsdSw2PjogQ29zdCAyIHZzbGRvaTQgTEhTLCA8NiwyLDcsMz4KKyAgMTU5MjE2MTI3NFUsCS8vIDwxLDIsdSw3PjogQ29zdCAyIHZzbGRvaTQgTEhTLCA8NywwLDEsMj4KKyAgNDcwNjQ0NTI2VSwJLy8gPDEsMix1LHU+OiBDb3N0IDEgdnNsZG9pNCBMSFMsIExIUworICAyNzY5Mzg5NzA4VSwJLy8gPDEsMywwLDA+OiBDb3N0IDMgdnNsZG9pMTIgPDMsMCwwLDE+LCA8MywwLDAsMT4KKyAgMjY4NTc4MDA3MFUsCS8vIDwxLDMsMCwxPjogQ29zdCAzIHZzbGRvaTggPDAsMiwxLDM+LCBMSFMKKyAgMjY4NTc4MDE0MlUsCS8vIDwxLDMsMCwyPjogQ29zdCAzIHZzbGRvaTggPDAsMiwxLDM+LCA8MCwyLDEsMz4KKyAgMjY4NjQ0Mzc3NVUsCS8vIDwxLDMsMCwzPjogQ29zdCAzIHZzbGRvaTggPDAsMywxLDM+LCA8MCwzLDEsMz4KKyAgMjc2OTY4NDY1NlUsCS8vIDwxLDMsMCw0PjogQ29zdCAzIHZzbGRvaTEyIDwzLDAsNCwxPiwgPDMsMCw0LDE+CisgIDMzNTc1MDc5NDBVLAkvLyA8MSwzLDAsNT46IENvc3QgNCB2bXJnbHcgPDAsMywxLDA+LCA8MCw0LDMsNT4KKyAgMzc1OTUyMjI5NFUsCS8vIDwxLDMsMCw2PjogQ29zdCA0IHZzbGRvaTggPDAsMiwxLDM+LCA8MCw2LDEsNz4KKyAgMzM1NzUwOTU2MlUsCS8vIDwxLDMsMCw3PjogQ29zdCA0IHZtcmdsdyA8MCwzLDEsMD4sIDwyLDYsMyw3PgorICAyNjg1NzgwNjM3VSwJLy8gPDEsMywwLHU+OiBDb3N0IDMgdnNsZG9pOCA8MCwyLDEsMz4sIExIUworICAyMjg3MDkyNjMwVSwJLy8gPDEsMywxLDA+OiBDb3N0IDMgdm1yZ2x3IDwwLHUsMSwxPiwgPDEsMiwzLDA+CisgIDIyMjEzMTIyMzBVLAkvLyA8MSwzLDEsMT46IENvc3QgMyB2bXJnaHcgPDEsMSwxLDE+LCA8MywxLDEsMT4KKyAgMjY5MTc1MjgzOVUsCS8vIDwxLDMsMSwyPjogQ29zdCAzIHZzbGRvaTggPDEsMiwxLDM+LCA8MSwyLDEsMz4KKyAgMjI4NzA5MzM2MlUsCS8vIDwxLDMsMSwzPjogQ29zdCAzIHZtcmdsdyA8MCx1LDEsMT4sIDwyLDIsMywzPgorICAyMjg3MDkyNjM0VSwJLy8gPDEsMywxLDQ+OiBDb3N0IDMgdm1yZ2x3IDwwLHUsMSwxPiwgPDEsMiwzLDQ+CisgIDMzNjA4MzUxMDdVLAkvLyA8MSwzLDEsNT46IENvc3QgNCB2bXJnbHcgPDAsdSwxLDE+LCA8MiwxLDMsNT4KKyAgMzc1OTUyMzA0MVUsCS8vIDwxLDMsMSw2PjogQ29zdCA0IHZzbGRvaTggPDAsMiwxLDM+LCA8MSw2LDMsNz4KKyAgMjI4NzA5MzY5MFUsCS8vIDwxLDMsMSw3PjogQ29zdCAzIHZtcmdsdyA8MCx1LDEsMT4sIDwyLDYsMyw3PgorICAyMjg3MDkyNjM4VSwJLy8gPDEsMywxLHU+OiBDb3N0IDMgdm1yZ2x3IDwwLHUsMSwxPiwgPDEsMiwzLHU+CisgIDIyMjIxMTQ5NjZVLAkvLyA8MSwzLDIsMD46IENvc3QgMyB2bXJnaHcgPDEsMiwzLDA+LCA8MywwLDEsMj4KKyAgMjIyMjExNTA1N1UsCS8vIDwxLDMsMiwxPjogQ29zdCAzIHZtcmdodyA8MSwyLDMsMD4sIDwzLDEsMiwzPgorICAyNjMwMDkyMzIwVSwJLy8gPDEsMywyLDI+OiBDb3N0IDMgdnNsZG9pNCA8MiwxLDMsMj4sIDwyLDEsMywyPgorICAyNjg1NzgxNjcwVSwJLy8gPDEsMywyLDM+OiBDb3N0IDMgdnNsZG9pOCA8MCwyLDEsMz4sIDwyLDMsMCwxPgorICAyMjIyMTE1MzMwVSwJLy8gPDEsMywyLDQ+OiBDb3N0IDMgdm1yZ2h3IDwxLDIsMywwPiwgPDMsNCw1LDY+CisgIDMzNzM0NDk1NzJVLAkvLyA8MSwzLDIsNT46IENvc3QgNCB2bXJnbHcgPDMsMCwxLDI+LCA8MCw0LDMsNT4KKyAgMjIyMjExNTQ0OFUsCS8vIDwxLDMsMiw2PjogQ29zdCAzIHZtcmdodyA8MSwyLDMsMD4sIDwzLDYsMCw3PgorICAyMjk5NzA5MzcwVSwJLy8gPDEsMywyLDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDAsMSwyPiwgPDIsNiwzLDc+CisgIDIyMjIxMTU2MTRVLAkvLyA8MSwzLDIsdT46IENvc3QgMyB2bXJnaHcgPDEsMiwzLDA+LCA8Myx1LDEsMj4KKyAgMjc3MTM4MDYwN1UsCS8vIDwxLDMsMywwPjogQ29zdCAzIHZzbGRvaTEyIDwzLDMsMCwxPiwgPDMsMywwLDE+CisgIDMzNTY4NzQ0NjhVLAkvLyA8MSwzLDMsMT46IENvc3QgNCB2bXJnbHcgPDAsMiwxLDM+LCA8dSwwLDMsMT4KKyAgMzc1OTUyNDE2OFUsCS8vIDwxLDMsMywyPjogQ29zdCA0IHZzbGRvaTggPDAsMiwxLDM+LCA8MywyLDMsMD4KKyAgMjI4Mzc5Mjc5NlUsCS8vIDwxLDMsMywzPjogQ29zdCAzIHZtcmdsdyA8MCwzLDEsMz4sIDwzLDMsMywzPgorICAzMzU2ODY5NTMwVSwJLy8gPDEsMywzLDQ+OiBDb3N0IDQgdm1yZ2x3IDwwLDIsMSwzPiwgPDEsMiwzLDQ+CisgIDM3MjE3NjA0MjhVLAkvLyA8MSwzLDMsNT46IENvc3QgNCB2c2xkb2k0IDw1LDEsMywzPiwgPDUsMSwzLDM+CisgIDMyOTY0OTYyNDhVLAkvLyA8MSwzLDMsNj46IENvc3QgNCB2bXJnaHcgPDEsMywyLDY+LCA8Myw2LDAsNz4KKyAgMzM1Njg3MDU4NlUsCS8vIDwxLDMsMyw3PjogQ29zdCA0IHZtcmdsdyA8MCwyLDEsMz4sIDwyLDYsMyw3PgorICAyNzcxOTcwNTAzVSwJLy8gPDEsMywzLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDMsMyx1LDE+LCA8MywzLHUsMT4KKyAgMjc3MjA0NDI0MFUsCS8vIDwxLDMsNCwwPjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsMCwxPiwgPDMsNCwwLDE+CisgIDMzNjIxODYxMzVVLAkvLyA8MSwzLDQsMT46IENvc3QgNCB2bXJnbHcgPDEsMSwxLDQ+LCA8MSwyLDMsMT4KKyAgMzI5NzE1MTI4MFUsCS8vIDwxLDMsNCwyPjogQ29zdCA0IHZtcmdodyA8MSw0LDIsNT4sIDwzLDIsMCwzPgorICAzMzU3NTQyMDAyVSwJLy8gPDEsMyw0LDM+OiBDb3N0IDQgdm1yZ2x3IDwwLDMsMSw0PiwgPDIsMiwzLDM+CisgIDMzNTc1NDA2MjZVLAkvLyA8MSwzLDQsND46IENvc3QgNCB2bXJnbHcgPDAsMywxLDQ+LCA8MCwzLDMsND4KKyAgMjY4NTc4MzM1MFUsCS8vIDwxLDMsNCw1PjogQ29zdCAzIHZzbGRvaTggPDAsMiwxLDM+LCBSSFMKKyAgMzM1NzU0NjYyMlUsCS8vIDwxLDMsNCw2PjogQ29zdCA0IHZtcmdsdyA8MCwzLDEsND4sIDx1LDUsMyw2PgorICAzMzU3NTQyMzMwVSwJLy8gPDEsMyw0LDc+OiBDb3N0IDQgdm1yZ2x3IDwwLDMsMSw0PiwgPDIsNiwzLDc+CisgIDI2ODU3ODM1OTNVLAkvLyA8MSwzLDQsdT46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSwzPiwgUkhTCisgIDIyODQ0NzExOTBVLAkvLyA8MSwzLDUsMD46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MSwyLDMsMD4KKyAgMzM1ODIxMzAxNVUsCS8vIDwxLDMsNSwxPjogQ29zdCA0IHZtcmdsdyA8MCw0LDEsNT4sIDwxLDIsMywxPgorICAyNjMwMTE2ODk5VSwJLy8gPDEsMyw1LDI+OiBDb3N0IDMgdnNsZG9pNCA8MiwxLDMsNT4sIDwyLDEsMyw1PgorICAyMjg0NDcxOTIyVSwJLy8gPDEsMyw1LDM+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSw1PiwgPDIsMiwzLDM+CisgIDIyODQ0NzExOTRVLAkvLyA8MSwzLDUsND46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MSwyLDMsND4KKyAgMjI4NDQ3MTg0M1UsCS8vIDwxLDMsNSw1PjogQ29zdCAzIHZtcmdsdyA8MCw0LDEsNT4sIDwyLDEsMyw1PgorICAzMzU4MjE4MzY2VSwJLy8gPDEsMyw1LDY+OiBDb3N0IDQgdm1yZ2x3IDwwLDQsMSw1PiwgPHUsNSwzLDY+CisgIDIyODQ0NzIyNTBVLAkvLyA8MSwzLDUsNz46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8Miw2LDMsNz4KKyAgMjI4NDQ3MTE5OFUsCS8vIDwxLDMsNSx1PjogQ29zdCAzIHZtcmdsdyA8MCw0LDEsNT4sIDwxLDIsMyx1PgorICAyMjI0NzUyNzkwVSwJLy8gPDEsMyw2LDA+OiBDb3N0IDMgdm1yZ2h3IDwxLDYsMiw3PiwgPDMsMCwxLDI+CisgIDM4MzI3MzYzODVVLAkvLyA8MSwzLDYsMT46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsMT4sIDwzLDYsMSw3PgorICAzNzAzODY2OTE2VSwJLy8gPDEsMyw2LDI+OiBDb3N0IDQgdnNsZG9pNCA8MiwxLDMsNj4sIDwyLDEsMyw2PgorICAzMzU2ODk0ODM0VSwJLy8gPDEsMyw2LDM+OiBDb3N0IDQgdm1yZ2x3IDwwLDIsMSw2PiwgPDIsMiwzLDM+CisgIDMzNTY4OTQxMDZVLAkvLyA8MSwzLDYsND46IENvc3QgNCB2bXJnbHcgPDAsMiwxLDY+LCA8MSwyLDMsND4KKyAgMzM1Njg5NDc1NVUsCS8vIDwxLDMsNiw1PjogQ29zdCA1IHZtcmdsdyA8MCwyLDEsNj4sIDwyLDEsMyw1PgorICAzMzU2ODk5MTMwVSwJLy8gPDEsMyw2LDY+OiBDb3N0IDQgdm1yZ2x3IDwwLDIsMSw2PiwgPHUsMSwzLDY+CisgIDIyODMxNTMzMzhVLAkvLyA8MSwzLDYsNz46IENvc3QgMyB2bXJnbHcgPDAsMiwxLDY+LCA8Miw2LDMsNz4KKyAgMjI4MzE1MzMzOFUsCS8vIDwxLDMsNix1PjogQ29zdCAzIHZtcmdsdyA8MCwyLDEsNj4sIDwyLDYsMyw3PgorICAyNzc0MDM1MTM5VSwJLy8gPDEsMyw3LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNywwLDE+LCA8Myw3LDAsMT4KKyAgMzcwMzg3NDc2N1UsCS8vIDwxLDMsNywxPjogQ29zdCA0IHZzbGRvaTQgPDIsMSwzLDc+LCA8MSw2LDEsNz4KKyAgMzcwMzg3NTEwOVUsCS8vIDwxLDMsNywyPjogQ29zdCA0IHZzbGRvaTQgPDIsMSwzLDc+LCA8MiwxLDMsNz4KKyAgMzM2NTUyOTIwMlUsCS8vIDwxLDMsNywzPjogQ29zdCA0IHZtcmdsdyA8MSw2LDEsNz4sIDwyLDIsMywzPgorICAzMzY1NTI4NDc0VSwJLy8gPDEsMyw3LDQ+OiBDb3N0IDQgdm1yZ2x3IDwxLDYsMSw3PiwgPDEsMiwzLDQ+CisgIDM3ODkzODcxNTlVLAkvLyA8MSwzLDcsNT46IENvc3QgNCB2c2xkb2k4IDw1LDIsMSwzPiwgPDcsNSwyLDE+CisgIDM4NjU2OTI5MjdVLAkvLyA8MSwzLDcsNj46IENvc3QgNCB2c2xkb2kxMiA8Niw3LDAsMT4sIDwzLDcsNiw3PgorICAzMzYzNTM4ODc0VSwJLy8gPDEsMyw3LDc+OiBDb3N0IDQgdm1yZ2x3IDwxLDMsMSw3PiwgPDIsNiwzLDc+CisgIDI3NzQ2MjUwMzVVLAkvLyA8MSwzLDcsdT46IENvc3QgMyB2c2xkb2kxMiA8Myw3LHUsMT4sIDwzLDcsdSwxPgorICAyMjg0NDk1NzY2VSwJLy8gPDEsMyx1LDA+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSx1PiwgPDEsMiwzLDA+CisgIDI2ODU3ODU5MDJVLAkvLyA8MSwzLHUsMT46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSwzPiwgTEhTCisgIDI2MzAxNDE0NzhVLAkvLyA8MSwzLHUsMj46IENvc3QgMyB2c2xkb2k0IDwyLDEsMyx1PiwgPDIsMSwzLHU+CisgIDIyODMxNjk4ODBVLAkvLyA8MSwzLHUsMz46IENvc3QgMyB2bXJnbHcgPDAsMiwxLHU+LCA8Mix1LDMsMz4KKyAgMjI4NDQ5NTc3MFUsCS8vIDwxLDMsdSw0PjogQ29zdCAzIHZtcmdsdyA8MCw0LDEsdT4sIDwxLDIsMyw0PgorICAyNjg1Nzg2MjY2VSwJLy8gPDEsMyx1LDU+OiBDb3N0IDMgdnNsZG9pOCA8MCwyLDEsMz4sIFJIUworICAyMjIyMTE1NDQ4VSwJLy8gPDEsMyx1LDY+OiBDb3N0IDMgdm1yZ2h3IDwxLDIsMywwPiwgPDMsNiwwLDc+CisgIDIyODQ0OTY4MjZVLAkvLyA8MSwzLHUsNz46IENvc3QgMyB2bXJnbHcgPDAsNCwxLHU+LCA8Miw2LDMsNz4KKyAgMjY4NTc4NjQ2OVUsCS8vIDwxLDMsdSx1PjogQ29zdCAzIHZzbGRvaTggPDAsMiwxLDM+LCBMSFMKKyAgMjY4NDQ2MTA2OVUsCS8vIDwxLDQsMCwwPjogQ29zdCAzIHZzbGRvaTggPDAsMCwxLDQ+LCA8MCwwLDEsND4KKyAgMjY4NjQ1MTgxNFUsCS8vIDwxLDQsMCwxPjogQ29zdCAzIHZzbGRvaTggPDAsMywxLDQ+LCBMSFMKKyAgMzc1OTUzMDE1OVUsCS8vIDwxLDQsMCwyPjogQ29zdCA0IHZzbGRvaTggPDAsMiwxLDQ+LCA8MCwyLDEsND4KKyAgMjY4NjQ1MTk2OFUsCS8vIDwxLDQsMCwzPjogQ29zdCAzIHZzbGRvaTggPDAsMywxLDQ+LCA8MCwzLDEsND4KKyAgMjY4NDQ2MTM5NFUsCS8vIDwxLDQsMCw0PjogQ29zdCAzIHZzbGRvaTggPDAsMCwxLDQ+LCA8MCw0LDEsNT4KKyAgMTcwMTk4OTI2NlUsCS8vIDwxLDQsMCw1PjogQ29zdCAyIHZzbGRvaTEyIDw0LDAsNSwxPiwgPDQsMCw1LDE+CisgIDM3NzYxMTkyODZVLAkvLyA8MSw0LDAsNj46IENvc3QgNCB2c2xkb2k4IDwzLDAsMSw0PiwgPDAsNiwxLDc+CisgIDI2ODkxMDY1MDBVLAkvLyA8MSw0LDAsNz46IENvc3QgMyB2c2xkb2k4IDwwLDcsMSw0PiwgPDAsNywxLDQ+CisgIDE3MDIyMTA0NzdVLAkvLyA8MSw0LDAsdT46IENvc3QgMiB2c2xkb2kxMiA8NCwwLHUsMT4sIDw0LDAsdSwxPgorICAyMjIxMzEyOTE0VSwJLy8gPDEsNCwxLDA+OiBDb3N0IDMgdm1yZ2h3IDwxLDEsMSwxPiwgPDQsMCw1LDE+CisgIDI2OTEwOTczOTlVLAkvLyA8MSw0LDEsMT46IENvc3QgMyB2c2xkb2k4IDwxLDEsMSw0PiwgPDEsMSwxLDQ+CisgIDM3NjAxOTQ0NTRVLAkvLyA8MSw0LDEsMj46IENvc3QgNCB2c2xkb2k4IDwwLDMsMSw0PiwgPDEsMiwzLDA+CisgIDM3NjYxNjY0ODlVLAkvLyA8MSw0LDEsMz46IENvc3QgNCB2c2xkb2k4IDwxLDMsMSw0PiwgPDEsMywxLDQ+CisgIDIzMzQ4NzA3MzZVLAkvLyA8MSw0LDEsND46IENvc3QgMyB2bXJnbHcgPHUsdSwxLDE+LCA8NCw0LDQsND4KKyAgMTE0NzU3MTUxMFUsCS8vIDwxLDQsMSw1PjogQ29zdCAyIHZtcmdodyA8MSwxLDEsMT4sIFJIUworICAzNzYwMTk0Nzk0VSwJLy8gPDEsNCwxLDY+OiBDb3N0IDQgdnNsZG9pOCA8MCwzLDEsND4sIDwxLDYsNCw3PgorICAzODY3MzE1MTg4VSwJLy8gPDEsNCwxLDc+OiBDb3N0IDQgdnNsZG9pMTIgPDcsMCw0LDE+LCA8NCwxLDcsMD4KKyAgMTE0NzU3MTc1M1UsCS8vIDwxLDQsMSx1PjogQ29zdCAyIHZtcmdodyA8MSwxLDEsMT4sIFJIUworICAyMjIyMTE1NzMwVSwJLy8gPDEsNCwyLDA+OiBDb3N0IDMgdm1yZ2h3IDwxLDIsMywwPiwgPDQsMCw1LDE+CisgIDIyMjIxMTU4MTJVLAkvLyA8MSw0LDIsMT46IENvc3QgMyB2bXJnaHcgPDEsMiwzLDA+LCA8NCwxLDUsMj4KKyAgMzc2MDE5NTE3NlUsCS8vIDwxLDQsMiwyPjogQ29zdCA0IHZzbGRvaTggPDAsMywxLDQ+LCA8MiwyLDIsMj4KKyAgMjcwMjM3ODY2MlUsCS8vIDwxLDQsMiwzPjogQ29zdCAzIHZzbGRvaTggPDMsMCwxLDQ+LCA8MiwzLDAsMT4KKyAgMjMyMzU5ODU0NFUsCS8vIDwxLDQsMiw0PjogQ29zdCAzIHZtcmdsdyA8NywwLDEsMj4sIDw0LDQsNCw0PgorICAxMTQ4Mzc0MzI2VSwJLy8gPDEsNCwyLDU+OiBDb3N0IDIgdm1yZ2h3IDwxLDIsMywwPiwgUkhTCisgIDM3NjAxOTU1MTRVLAkvLyA8MSw0LDIsNj46IENvc3QgNCB2c2xkb2k4IDwwLDMsMSw0PiwgPDIsNiwzLDc+CisgIDMzNzM0NTE5MzJVLAkvLyA8MSw0LDIsNz46IENvc3QgNCB2bXJnbHcgPDMsMCwxLDI+LCA8Myw2LDQsNz4KKyAgMTE0ODM3NDU2OVUsCS8vIDwxLDQsMix1PjogQ29zdCAyIHZtcmdodyA8MSwyLDMsMD4sIFJIUworICAyNzAyMzc5MTYwVSwJLy8gPDEsNCwzLDA+OiBDb3N0IDMgdnNsZG9pOCA8MywwLDEsND4sIDwzLDAsMSw0PgorICAzNzYwMTk1ODQwVSwJLy8gPDEsNCwzLDE+OiBDb3N0IDQgdnNsZG9pOCA8MCwzLDEsND4sIDwzLDEsNCwwPgorICAzNzc2MTIxMTYwVSwJLy8gPDEsNCwzLDI+OiBDb3N0IDQgdnNsZG9pOCA8MywwLDEsND4sIDwzLDIsMywwPgorICAzNzYwMTk1OTk2VSwJLy8gPDEsNCwzLDM+OiBDb3N0IDQgdnNsZG9pOCA8MCwzLDEsND4sIDwzLDMsMywzPgorICAyNjg2NDU0Mjc0VSwJLy8gPDEsNCwzLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MCwzLDEsND4sIDwzLDQsNSw2PgorICAzMzU2ODcwMzUwVSwJLy8gPDEsNCwzLDU+OiBDb3N0IDQgdm1yZ2x3IDwwLDIsMSwzPiwgPDIsMyw0LDU+CisgIDM4MDAwMDkzOTJVLAkvLyA8MSw0LDMsNj46IENvc3QgNCB2c2xkb2k4IDw3LDAsMSw0PiwgPDMsNiw3LDA+CisgIDMzNjY4MjQ2MDRVLAkvLyA8MSw0LDMsNz46IENvc3QgNSB2bXJnbHcgPDEsdSwxLDM+LCA8Myw2LDQsNz4KKyAgMjcwNzY4ODIyNFUsCS8vIDwxLDQsMyx1PjogQ29zdCAzIHZzbGRvaTggPDMsdSwxLDQ+LCA8Myx1LDEsND4KKyAgMjc3NTczMTM2OFUsCS8vIDwxLDQsNCwwPjogQ29zdCAzIHZzbGRvaTEyIDw0LDAsNSwxPiwgPDQsNCwwLDA+CisgIDM4MzA4MjAwMThVLAkvLyA8MSw0LDQsMT46IENvc3QgNCB2c2xkb2kxMiA8MCx1LDQsMT4sIDw0LDQsMSwxPgorICAzNjkxOTgwNDU0VSwJLy8gPDEsNCw0LDI+OiBDb3N0IDQgdnNsZG9pNCA8MCwxLDQsND4sIDwyLDMsMCwxPgorICAzMzU3NTQxMjgyVSwJLy8gPDEsNCw0LDM+OiBDb3N0IDQgdm1yZ2x3IDwwLDMsMSw0PiwgPDEsMiw0LDM+CisgIDI3ODEwMzk4MjRVLAkvLyA8MSw0LDQsND46IENvc3QgMyB2c2xkb2kxMiA8NCx1LDUsMT4sIDw0LDQsNCw0PgorICAyNjg2NDU1MDk0VSwJLy8gPDEsNCw0LDU+OiBDb3N0IDMgdnNsZG9pOCA8MCwzLDEsND4sIFJIUworICAzMzU3NTQxNTI4VSwJLy8gPDEsNCw0LDY+OiBDb3N0IDQgdm1yZ2x3IDwwLDMsMSw0PiwgPDEsNSw0LDY+CisgIDM4MTA2MjcwMjBVLAkvLyA8MSw0LDQsNz46IENvc3QgNCB2c2xkb2k4IDx1LDcsMSw0PiwgPDQsNyw1LDQ+CisgIDI2ODY0NTUzMzdVLAkvLyA8MSw0LDQsdT46IENvc3QgMyB2c2xkb2k4IDwwLDMsMSw0PiwgUkhTCisgIDI2MjQyMTcxOTBVLAkvLyA8MSw0LDUsMD46IENvc3QgMyB2c2xkb2k0IDwxLDEsNCw1PiwgTEhTCisgIDIyODQ0NzAzMDlVLAkvLyA8MSw0LDUsMT46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MCwwLDQsMT4KKyAgMjYxODI0NjgyMlUsCS8vIDwxLDQsNSwyPjogQ29zdCAzIHZzbGRvaTQgPDAsMSw0LDU+LCA8MiwzLDAsMT4KKyAgMzM1ODIxMjI5N1UsCS8vIDwxLDQsNSwzPjogQ29zdCA0IHZtcmdsdyA8MCw0LDEsNT4sIDwwLDIsNCwzPgorICAyMjg0NDcwMzEyVSwJLy8gPDEsNCw1LDQ+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSw1PiwgPDAsMCw0LDQ+CisgIDIyODQ0NzA2MzdVLAkvLyA8MSw0LDUsNT46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MCw0LDQsNT4KKyAgMTY4MzExNTMxOFUsCS8vIDwxLDQsNSw2PjogQ29zdCAyIHZzbGRvaTEyIDwwLHUsMSwxPiwgUkhTCisgIDM3MjE4NTE4OThVLAkvLyA8MSw0LDUsNz46IENvc3QgNCB2c2xkb2k0IDw1LDEsNCw1PiwgPDcsMCwxLDI+CisgIDE2ODMxMTUzMzZVLAkvLyA8MSw0LDUsdT46IENvc3QgMiB2c2xkb2kxMiA8MCx1LDEsMT4sIFJIUworICAzNzk0MDM5MDc1VSwJLy8gPDEsNCw2LDA+OiBDb3N0IDQgdnNsZG9pOCA8NiwwLDEsND4sIDw2LDAsMSw0PgorICAzODMwODIwMTg2VSwJLy8gPDEsNCw2LDE+OiBDb3N0IDQgdnNsZG9pMTIgPDAsdSw0LDE+LCA8NCw2LDEsNz4KKyAgMzgwMDAxMTI1OFUsCS8vIDwxLDQsNiwyPjogQ29zdCA0IHZzbGRvaTggPDcsMCwxLDQ+LCA8NiwyLDcsMz4KKyAgMzgwNzk3MzkzOFUsCS8vIDwxLDQsNiwzPjogQ29zdCA0IHZzbGRvaTggPHUsMywxLDQ+LCA8NiwzLDQsNT4KKyAgMzI5ODcxNjg4MFUsCS8vIDwxLDQsNiw0PjogQ29zdCA0IHZtcmdodyA8MSw2LDUsNz4sIDw0LDQsNCw0PgorICAyMjI0NjgwMjQ2VSwJLy8gPDEsNCw2LDU+OiBDb3N0IDMgdm1yZ2h3IDwxLDYsMSw3PiwgUkhTCisgIDM4MDAwMTE1NzZVLAkvLyA8MSw0LDYsNj46IENvc3QgNCB2c2xkb2k4IDw3LDAsMSw0PiwgPDYsNiw2LDY+CisgIDI3MjYyNjk3NzRVLAkvLyA8MSw0LDYsNz46IENvc3QgMyB2c2xkb2k4IDw3LDAsMSw0PiwgPDYsNywwLDE+CisgIDIyMjQ2ODA0ODlVLAkvLyA8MSw0LDYsdT46IENvc3QgMyB2bXJnaHcgPDEsNiwxLDc+LCBSSFMKKyAgMjcyNjI2OTk0OFUsCS8vIDwxLDQsNywwPjogQ29zdCAzIHZzbGRvaTggPDcsMCwxLDQ+LCA8NywwLDEsND4KKyAgMzM4MzQ0NDE0MVUsCS8vIDwxLDQsNywxPjogQ29zdCA0IHZtcmdsdyA8NCw2LDEsNz4sIDwwLHUsNCwxPgorICAzODA1OTgzOTYxVSwJLy8gPDEsNCw3LDI+OiBDb3N0IDQgdnNsZG9pOCA8dSwwLDEsND4sIDw3LDIsdSwwPgorICAzODA3OTc0NjY3VSwJLy8gPDEsNCw3LDM+OiBDb3N0IDQgdnNsZG9pOCA8dSwzLDEsND4sIDw3LDMsNCw1PgorICAyNzM2ODg3MTQyVSwJLy8gPDEsNCw3LDQ+OiBDb3N0IDMgdnNsZG9pOCA8dSw3LDEsND4sIDw3LDQsNSw2PgorICAzMzY1NTI4NDAzVSwJLy8gPDEsNCw3LDU+OiBDb3N0IDQgdm1yZ2x3IDwxLDYsMSw3PiwgPDEsMSw0LDU+CisgIDM4MDAwMTIzMDhVLAkvLyA8MSw0LDcsNj46IENvc3QgNCB2c2xkb2k4IDw3LDAsMSw0PiwgPDcsNiw3LDA+CisgIDM4MDAwMTIzOTZVLAkvLyA8MSw0LDcsNz46IENvc3QgNCB2c2xkb2k4IDw3LDAsMSw0PiwgPDcsNyw3LDc+CisgIDI3MzE1NzkwMTJVLAkvLyA8MSw0LDcsdT46IENvc3QgMyB2c2xkb2k4IDw3LHUsMSw0PiwgPDcsdSwxLDQ+CisgIDI2MjQyNDE3NjZVLAkvLyA8MSw0LHUsMD46IENvc3QgMyB2c2xkb2k0IDwxLDEsNCx1PiwgTEhTCisgIDI2ODY0NTc2NDZVLAkvLyA8MSw0LHUsMT46IENvc3QgMyB2c2xkb2k4IDwwLDMsMSw0PiwgTEhTCisgIDI2MTgyNzEzOThVLAkvLyA8MSw0LHUsMj46IENvc3QgMyB2c2xkb2k0IDwwLDEsNCx1PiwgPDIsMywwLDE+CisgIDI3MzQyMzM1NDRVLAkvLyA8MSw0LHUsMz46IENvc3QgMyB2c2xkb2k4IDx1LDMsMSw0PiwgPHUsMywxLDQ+CisgIDI2ODk3NzU2NzlVLAkvLyA8MSw0LHUsND46IENvc3QgMyB2c2xkb2k4IDwwLHUsMSw0PiwgPHUsNCw1LDY+CisgIDExNTIzNTU2MzhVLAkvLyA8MSw0LHUsNT46IENvc3QgMiB2bXJnaHcgPDEsdSwzLDA+LCBSSFMKKyAgMTY4MzExNTU2MVUsCS8vIDwxLDQsdSw2PjogQ29zdCAyIHZzbGRvaTEyIDwwLHUsMSwxPiwgUkhTCisgIDI3MzY4ODgwNzZVLAkvLyA8MSw0LHUsNz46IENvc3QgMyB2c2xkb2k4IDx1LDcsMSw0PiwgPHUsNywxLDQ+CisgIDE2ODMxMTU1NzlVLAkvLyA8MSw0LHUsdT46IENvc3QgMiB2c2xkb2kxMiA8MCx1LDEsMT4sIFJIUworICAyNjg3MTIzNDU2VSwJLy8gPDEsNSwwLDA+OiBDb3N0IDMgdnNsZG9pOCA8MCw0LDEsNT4sIDwwLDAsMCwwPgorICAxNjEzMzgxNzM0VSwJLy8gPDEsNSwwLDE+OiBDb3N0IDIgdnNsZG9pOCA8MCw0LDEsNT4sIExIUworICAzNzU5NTM4MzUyVSwJLy8gPDEsNSwwLDI+OiBDb3N0IDQgdnNsZG9pOCA8MCwyLDEsNT4sIDwwLDIsMSw1PgorICAzNzYwODY1NTMyVSwJLy8gPDEsNSwwLDM+OiBDb3N0IDQgdnNsZG9pOCA8MCw0LDEsNT4sIDwwLDMsMSwwPgorICAxNjEzMzgxOTcwVSwJLy8gPDEsNSwwLDQ+OiBDb3N0IDIgdnNsZG9pOCA8MCw0LDEsNT4sIDwwLDQsMSw1PgorICAyNjg3Nzg3NDI3VSwJLy8gPDEsNSwwLDU+OiBDb3N0IDMgdnNsZG9pOCA8MCw1LDEsNT4sIDwwLDUsMSw1PgorICAyNzgxNzc3NTI0VSwJLy8gPDEsNSwwLDY+OiBDb3N0IDMgdnNsZG9pMTIgPDUsMCw2LDE+LCA8NSwwLDYsMT4KKyAgMzczMzgyODcxN1UsCS8vIDwxLDUsMCw3PjogQ29zdCA0IHZzbGRvaTQgPDcsMSw1LDA+LCA8NywxLDUsMD4KKyAgMTYxMzM4MjMwMVUsCS8vIDwxLDUsMCx1PjogQ29zdCAyIHZzbGRvaTggPDAsNCwxLDU+LCBMSFMKKyAgMjc4MTA0MDI3MVUsCS8vIDwxLDUsMSwwPjogQ29zdCAzIHZzbGRvaTEyIDw0LHUsNSwxPiwgPDUsMSwwLDE+CisgIDI2ODcxMjQyNzZVLAkvLyA8MSw1LDEsMT46IENvc3QgMyB2c2xkb2k4IDwwLDQsMSw1PiwgPDEsMSwxLDE+CisgIDI2ODcxMjQzNzRVLAkvLyA8MSw1LDEsMj46IENvc3QgMyB2c2xkb2k4IDwwLDQsMSw1PiwgPDEsMiwzLDA+CisgIDM3NjA4NjYyOTdVLAkvLyA8MSw1LDEsMz46IENvc3QgNCB2c2xkb2k4IDwwLDQsMSw1PiwgPDEsMyw1LDA+CisgIDI2OTMwOTY0OTFVLAkvLyA8MSw1LDEsND46IENvc3QgMyB2c2xkb2k4IDwxLDQsMSw1PiwgPDEsNCwxLDU+CisgIDI2ODcxMjQ1OTFVLAkvLyA8MSw1LDEsNT46IENvc3QgMyB2c2xkb2k4IDwwLDQsMSw1PiwgPDEsNSwwLDE+CisgIDI2ODcxMjQ3MjNVLAkvLyA8MSw1LDEsNj46IENvc3QgMyB2c2xkb2k4IDwwLDQsMSw1PiwgPDEsNiw1LDc+CisgIDMzNjA4MzQ4MDNVLAkvLyA8MSw1LDEsNz46IENvc3QgNCB2bXJnbHcgPDAsdSwxLDE+LCA8MSw2LDUsNz4KKyAgMjY4NzEyNDg2MFUsCS8vIDwxLDUsMSx1PjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8MSx1LDMsMD4KKyAgMjMyMzU5ODc5MlUsCS8vIDwxLDUsMiwwPjogQ29zdCAzIHZtcmdsdyA8NywwLDEsMj4sIDw0LDcsNSwwPgorICAyNjg3MTI1MDI3VSwJLy8gPDEsNSwyLDE+OiBDb3N0IDMgdnNsZG9pOCA8MCw0LDEsNT4sIDwyLDEsMyw1PgorICAyNjg3MTI1MDk2VSwJLy8gPDEsNSwyLDI+OiBDb3N0IDMgdnNsZG9pOCA8MCw0LDEsNT4sIDwyLDIsMiwyPgorICAyNjg3MTI1MTU4VSwJLy8gPDEsNSwyLDM+OiBDb3N0IDMgdnNsZG9pOCA8MCw0LDEsNT4sIDwyLDMsMCwxPgorICAyNjQyMTg1MTg4VSwJLy8gPDEsNSwyLDQ+OiBDb3N0IDMgdnNsZG9pNCA8NCwxLDUsMj4sIDw0LDEsNSwyPgorICAyMzIzNTk4NTU0VSwJLy8gPDEsNSwyLDU+OiBDb3N0IDMgdm1yZ2x3IDw3LDAsMSwyPiwgPDQsNCw1LDU+CisgIDI2ODcxMjU0MzRVLAkvLyA8MSw1LDIsNj46IENvc3QgMyB2c2xkb2k4IDwwLDQsMSw1PiwgPDIsNiwzLDc+CisgIDMzNzM0NTA0ODNVLAkvLyA8MSw1LDIsNz46IENvc3QgNCB2bXJnbHcgPDMsMCwxLDI+LCA8MSw2LDUsNz4KKyAgMjY4NzEyNTU2M1UsCS8vIDwxLDUsMix1PjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8Mix1LDAsMT4KKyAgMjY4NzEyNTY1NFUsCS8vIDwxLDUsMywwPjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8MywwLDEsMj4KKyAgMjMxMjk5MDIzNFUsCS8vIDwxLDUsMywxPjogQ29zdCAzIHZtcmdsdyA8NSwyLDEsMz4sIDw0LHUsNSwxPgorICAzNzYwODY3NjQ5VSwJLy8gPDEsNSwzLDI+OiBDb3N0IDQgdnNsZG9pOCA8MCw0LDEsNT4sIDwzLDIsMiwyPgorICAyNjg3MTI1OTE2VSwJLy8gPDEsNSwzLDM+OiBDb3N0IDMgdnNsZG9pOCA8MCw0LDEsNT4sIDwzLDMsMywzPgorICAyNjg3MTI2MDE4VSwJLy8gPDEsNSwzLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MCw0LDEsNT4sIDwzLDQsNSw2PgorICAzMzg2NzMxNzM4VSwJLy8gPDEsNSwzLDU+OiBDb3N0IDQgdm1yZ2x3IDw1LDIsMSwzPiwgPDQsNCw1LDU+CisgIDMzNTY4NzExNzBVLAkvLyA8MSw1LDMsNj46IENvc3QgNCB2bXJnbHcgPDAsMiwxLDM+LCA8Myw0LDUsNj4KKyAgMzgwODY0Mzc3OVUsCS8vIDwxLDUsMyw3PjogQ29zdCA0IHZzbGRvaTggPHUsNCwxLDU+LCA8Myw3LDAsMT4KKyAgMjY4NzEyNjMwMlUsCS8vIDwxLDUsMyx1PjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8Myx1LDEsMj4KKyAgMjY0MjE5ODYzMFUsCS8vIDwxLDUsNCwwPjogQ29zdCAzIHZzbGRvaTQgPDQsMSw1LDQ+LCBMSFMKKyAgMjY4NzEyNjQ5OFUsCS8vIDwxLDUsNCwxPjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8NCwxLDUsMD4KKyAgMzcxNTk0MTkyM1UsCS8vIDwxLDUsNCwyPjogQ29zdCA0IHZzbGRvaTQgPDQsMSw1LDQ+LCA8MiwxLDMsNT4KKyAgMzcwOTk3MDcwMVUsCS8vIDwxLDUsNCwzPjogQ29zdCA0IHZzbGRvaTQgPDMsMSw1LDQ+LCA8MywxLDUsND4KKyAgMjY4NzEyNjczNlUsCS8vIDwxLDUsNCw0PjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8NCw0LDQsND4KKyAgMTYxMzM4NTAxNFUsCS8vIDwxLDUsNCw1PjogQ29zdCAyIHZzbGRvaTggPDAsNCwxLDU+LCBSSFMKKyAgMjI4MzgwMTA5MFUsCS8vIDwxLDUsNCw2PjogQ29zdCAzIHZtcmdsdyA8MCwzLDEsND4sIDwzLDQsNSw2PgorICAzNzMzODYxNDg5VSwJLy8gPDEsNSw0LDc+OiBDb3N0IDQgdnNsZG9pNCA8NywxLDUsND4sIDw3LDEsNSw0PgorICAxNjEzMzg1MjU3VSwJLy8gPDEsNSw0LHU+OiBDb3N0IDIgdnNsZG9pOCA8MCw0LDEsNT4sIFJIUworICAyNjI0MjkwOTE4VSwJLy8gPDEsNSw1LDA+OiBDb3N0IDMgdnNsZG9pNCA8MSwxLDUsNT4sIExIUworICAyNjI0MjkxNjc2VSwJLy8gPDEsNSw1LDE+OiBDb3N0IDMgdnNsZG9pNCA8MSwxLDUsNT4sIDwxLDEsNSw1PgorICAzNjk4MDM0MjExVSwJLy8gPDEsNSw1LDI+OiBDb3N0IDQgdnNsZG9pNCA8MSwxLDUsNT4sIDwyLDEsMyw1PgorICAyMjg0NDcxMjExVSwJLy8gPDEsNSw1LDM+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSw1PiwgPDEsMiw1LDM+CisgIDI2MjQyOTQxOThVLAkvLyA8MSw1LDUsND46IENvc3QgMyB2c2xkb2k0IDwxLDEsNSw1PiwgUkhTCisgIDIyODQ0NzExMzJVLAkvLyA8MSw1LDUsNT46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MSwxLDUsNT4KKyAgMjI4NDQ3MjgzNFUsCS8vIDwxLDUsNSw2PjogQ29zdCAzIHZtcmdsdyA8MCw0LDEsNT4sIDwzLDQsNSw2PgorICAyMjg0NDcxNTM5VSwJLy8gPDEsNSw1LDc+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSw1PiwgPDEsNiw1LDc+CisgIDIyODQ0NzEyMTZVLAkvLyA8MSw1LDUsdT46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MSwyLDUsdT4KKyAgMjc4NTMxNjkwMFUsCS8vIDwxLDUsNiwwPjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsMCwxPiwgPDUsNiwwLDE+CisgIDI3ODEwNDA2OTFVLAkvLyA8MSw1LDYsMT46IENvc3QgMyB2c2xkb2kxMiA8NCx1LDUsMT4sIDw1LDYsMSw3PgorICAyNzM0OTAzODAyVSwJLy8gPDEsNSw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8dSw0LDEsNT4sIDw2LDIsNywzPgorICAzODQ4NzM2ODM0VSwJLy8gPDEsNSw2LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDMsdSw0LDE+LCA8NSw2LDMsND4KKyAgMzI5ODcxNzYyMFUsCS8vIDwxLDUsNiw0PjogQ29zdCA0IHZtcmdodyA8MSw2LDUsNz4sIDw1LDQsNSw2PgorICAzMjk4NzE3NzAwVSwJLy8gPDEsNSw2LDU+OiBDb3N0IDQgdm1yZ2h3IDwxLDYsNSw3PiwgPDUsNSw1LDU+CisgIDI3MzQ5MDQxMjBVLAkvLyA8MSw1LDYsNj46IENvc3QgMyB2c2xkb2k4IDx1LDQsMSw1PiwgPDYsNiw2LDY+CisgIDI3ODEwNDA3MzhVLAkvLyA8MSw1LDYsNz46IENvc3QgMyB2c2xkb2kxMiA8NCx1LDUsMT4sIDw1LDYsNywwPgorICAyNzgxMDQwNzQ3VSwJLy8gPDEsNSw2LHU+OiBDb3N0IDMgdnNsZG9pMTIgPDQsdSw1LDE+LCA8NSw2LHUsMD4KKyAgMjczNDkwNDMxNFUsCS8vIDwxLDUsNywwPjogQ29zdCAzIHZzbGRvaTggPHUsNCwxLDU+LCA8NywwLDEsMj4KKyAgMjMxNTY3NzIxMFUsCS8vIDwxLDUsNywxPjogQ29zdCAzIHZtcmdsdyA8NSw2LDEsNz4sIDw0LHUsNSwxPgorICAzODA4NjQ2MjkyVSwJLy8gPDEsNSw3LDI+OiBDb3N0IDQgdnNsZG9pOCA8dSw0LDEsNT4sIDw3LDIsMCwzPgorICAzODA4NjQ2MzcxVSwJLy8gPDEsNSw3LDM+OiBDb3N0IDQgdnNsZG9pOCA8dSw0LDEsNT4sIDw3LDMsMCwxPgorICAyNzM0OTA0Njc4VSwJLy8gPDEsNSw3LDQ+OiBDb3N0IDMgdnNsZG9pOCA8dSw0LDEsNT4sIDw3LDQsNSw2PgorICAzMzg5NDE4NzE0VSwJLy8gPDEsNSw3LDU+OiBDb3N0IDQgdm1yZ2x3IDw1LDYsMSw3PiwgPDQsNCw1LDU+CisgIDMzNjU1Mjg2NTZVLAkvLyA8MSw1LDcsNj46IENvc3QgNCB2bXJnbHcgPDEsNiwxLDc+LCA8MSw0LDUsNj4KKyAgMjczNDkwNDk0MFUsCS8vIDwxLDUsNyw3PjogQ29zdCAzIHZzbGRvaTggPHUsNCwxLDU+LCA8Nyw3LDcsNz4KKyAgMjczNDkwNDk2MlUsCS8vIDwxLDUsNyx1PjogQ29zdCAzIHZzbGRvaTggPHUsNCwxLDU+LCA8Nyx1LDEsMj4KKyAgMjY4NzEyOTI5OVUsCS8vIDwxLDUsdSwwPjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8dSwwLDEsMj4KKyAgMTYxMzM4NzU2NlUsCS8vIDwxLDUsdSwxPjogQ29zdCAyIHZzbGRvaTggPDAsNCwxLDU+LCBMSFMKKyAgMjY4NzEyOTQ4MFUsCS8vIDwxLDUsdSwyPjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8dSwyLDMsMz4KKyAgMjY4NzEyOTUzMlUsCS8vIDwxLDUsdSwzPjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8dSwzLDAsMT4KKyAgMTY2MTE2MzU0NlUsCS8vIDwxLDUsdSw0PjogQ29zdCAyIHZzbGRvaTggPHUsNCwxLDU+LCA8dSw0LDEsNT4KKyAgMTYxMzM4NzkzMFUsCS8vIDwxLDUsdSw1PjogQ29zdCAyIHZzbGRvaTggPDAsNCwxLDU+LCBSSFMKKyAgMjY4NzEyOTgwOFUsCS8vIDwxLDUsdSw2PjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLDU+LCA8dSw2LDMsNz4KKyAgMjc4MTA0MDkwMFUsCS8vIDwxLDUsdSw3PjogQ29zdCAzIHZzbGRvaTEyIDw0LHUsNSwxPiwgPDUsdSw3LDA+CisgIDE2MTMzODgxMzNVLAkvLyA8MSw1LHUsdT46IENvc3QgMiB2c2xkb2k4IDwwLDQsMSw1PiwgTEhTCisgIDM3NTk1NDYzNjhVLAkvLyA8MSw2LDAsMD46IENvc3QgNCB2c2xkb2k4IDwwLDIsMSw2PiwgPDAsMCwwLDA+CisgIDI2ODU4MDQ2NDZVLAkvLyA8MSw2LDAsMT46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSw2PiwgTEhTCisgIDI2ODU4MDQ3MjFVLAkvLyA8MSw2LDAsMj46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSw2PiwgPDAsMiwxLDY+CisgIDM4NjEyNzA4MzRVLAkvLyA8MSw2LDAsMz46IENvc3QgNCB2c2xkb2kxMiA8NiwwLDMsMT4sIDw2LDAsMywxPgorICAzNzU5NTQ2NzA2VSwJLy8gPDEsNiwwLDQ+OiBDb3N0IDQgdnNsZG9pOCA8MCwyLDEsNj4sIDwwLDQsMSw1PgorICAyNjg3Nzk1NjIwVSwJLy8gPDEsNiwwLDU+OiBDb3N0IDMgdnNsZG9pOCA8MCw1LDEsNj4sIDwwLDUsMSw2PgorICAyNjg4NDU5MjUzVSwJLy8gPDEsNiwwLDY+OiBDb3N0IDMgdnNsZG9pOCA8MCw2LDEsNj4sIDwwLDYsMSw2PgorICAyMjgzNzY5MTQyVSwJLy8gPDEsNiwwLDc+OiBDb3N0IDMgdm1yZ2x3IDwwLDMsMSwwPiwgUkhTCisgIDI2ODU4MDUyMTNVLAkvLyA8MSw2LDAsdT46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSw2PiwgTEhTCisgIDM2OTgwNzM3MDJVLAkvLyA8MSw2LDEsMD46IENvc3QgNCB2c2xkb2k0IDwxLDEsNiwxPiwgTEhTCisgIDM3NTk1NDcxODhVLAkvLyA8MSw2LDEsMT46IENvc3QgNCB2c2xkb2k4IDwwLDIsMSw2PiwgPDEsMSwxLDE+CisgIDIyMjEzMTQ1NTRVLAkvLyA8MSw2LDEsMj46IENvc3QgMyB2bXJnaHcgPDEsMSwxLDE+LCA8NiwyLDcsMz4KKyAgMzc1OTU0NzQwMVUsCS8vIDwxLDYsMSwzPjogQ29zdCA0IHZzbGRvaTggPDAsMiwxLDY+LCA8MSwzLDYsNz4KKyAgMzY5ODA3Njk4MlUsCS8vIDwxLDYsMSw0PjogQ29zdCA0IHZzbGRvaTQgPDEsMSw2LDE+LCBSSFMKKyAgMzc2NzUxMDE0MVUsCS8vIDwxLDYsMSw1PjogQ29zdCA0IHZzbGRvaTggPDEsNSwxLDY+LCA8MSw1LDEsNj4KKyAgMjMzNDg3MjM3NlUsCS8vIDwxLDYsMSw2PjogQ29zdCAzIHZtcmdsdyA8dSx1LDEsMT4sIDw2LDYsNiw2PgorICAxMjEzMzUzMjcwVSwJLy8gPDEsNiwxLDc+OiBDb3N0IDIgdm1yZ2x3IDwwLHUsMSwxPiwgUkhTCisgIDEyMTMzNTMyNzFVLAkvLyA8MSw2LDEsdT46IENvc3QgMiB2bXJnbHcgPDAsdSwxLDE+LCBSSFMKKyAgMzcwNDA1Mzg2MlUsCS8vIDwxLDYsMiwwPjogQ29zdCA0IHZzbGRvaTQgPDIsMSw2LDI+LCBMSFMKKyAgMzc1OTU0Nzk2MVUsCS8vIDwxLDYsMiwxPjogQ29zdCA0IHZzbGRvaTggPDAsMiwxLDY+LCA8MiwxLDYsMD4KKyAgMjIyMjExNzM3MFUsCS8vIDwxLDYsMiwyPjogQ29zdCAzIHZtcmdodyA8MSwyLDMsMD4sIDw2LDIsNywzPgorICAzNzU5NTQ4MDcwVSwJLy8gPDEsNiwyLDM+OiBDb3N0IDQgdnNsZG9pOCA8MCwyLDEsNj4sIDwyLDMsMCwxPgorICAzNzA0MDU3MTQyVSwJLy8gPDEsNiwyLDQ+OiBDb3N0IDQgdnNsZG9pNCA8MiwxLDYsMj4sIFJIUworICAzMzczNDUxMDU3VSwJLy8gPDEsNiwyLDU+OiBDb3N0IDQgdm1yZ2x3IDwzLDAsMSwyPiwgPDIsNCw2LDU+CisgIDI2ODU4MDY1MjJVLAkvLyA8MSw2LDIsNj46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSw2PiwgPDIsNiwzLDc+CisgIDEyMjU5Njg5NTBVLAkvLyA8MSw2LDIsNz46IENvc3QgMiB2bXJnbHcgPDMsMCwxLDI+LCBSSFMKKyAgMTIyNTk2ODk1MVUsCS8vIDwxLDYsMix1PjogQ29zdCAyIHZtcmdsdyA8MywwLDEsMj4sIFJIUworICAzNzU5NTQ4NTY2VSwJLy8gPDEsNiwzLDA+OiBDb3N0IDQgdnNsZG9pOCA8MCwyLDEsNj4sIDwzLDAsMSwyPgorICAzODQyOTEyNzkzVSwJLy8gPDEsNiwzLDE+OiBDb3N0IDQgdnNsZG9pMTIgPDIsdSw2LDE+LCA8NiwzLDEsNz4KKyAgMzc1OTU0ODc3NFUsCS8vIDwxLDYsMywyPjogQ29zdCA0IHZzbGRvaTggPDAsMiwxLDY+LCA8MywyLDYsMz4KKyAgMzc1OTU0ODgyOFUsCS8vIDwxLDYsMywzPjogQ29zdCA0IHZzbGRvaTggPDAsMiwxLDY+LCA8MywzLDMsMz4KKyAgMzc1OTU0ODkzMFUsCS8vIDwxLDYsMyw0PjogQ29zdCA0IHZzbGRvaTggPDAsMiwxLDY+LCA8Myw0LDUsNj4KKyAgMzgwOTMxNTQyMVUsCS8vIDwxLDYsMyw1PjogQ29zdCA0IHZzbGRvaTggPHUsNSwxLDY+LCA8Myw1LDYsNz4KKyAgMzM4NjczMzM2OFUsCS8vIDwxLDYsMyw2PjogQ29zdCA0IHZtcmdsdyA8NSwyLDEsMz4sIDw2LDYsNiw2PgorICAyMjgzMTMwMTY2VSwJLy8gPDEsNiwzLDc+OiBDb3N0IDMgdm1yZ2x3IDwwLDIsMSwzPiwgUkhTCisgIDIyODMxMzAxNjdVLAkvLyA8MSw2LDMsdT46IENvc3QgMyB2bXJnbHcgPDAsMiwxLDM+LCBSSFMKKyAgMzcwNDA3MDI0NlUsCS8vIDwxLDYsNCwwPjogQ29zdCA0IHZzbGRvaTQgPDIsMSw2LDQ+LCBMSFMKKyAgMzg2MjIyOTYwOFUsCS8vIDwxLDYsNCwxPjogQ29zdCA0IHZzbGRvaTEyIDw2LDEsNywxPiwgPDYsNCwxLDU+CisgIDM3MDQwNzE3NDFVLAkvLyA8MSw2LDQsMj46IENvc3QgNCB2c2xkb2k0IDwyLDEsNiw0PiwgPDIsMSw2LDQ+CisgIDM3MjE5ODg2MTBVLAkvLyA8MSw2LDQsMz46IENvc3QgNCB2c2xkb2k0IDw1LDEsNiw0PiwgPDMsNCw1LDY+CisgIDM3MDQwNzM1MjZVLAkvLyA8MSw2LDQsND46IENvc3QgNCB2c2xkb2k0IDwyLDEsNiw0PiwgUkhTCisgIDI2ODU4MDc5MjZVLAkvLyA8MSw2LDQsNT46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSw2PiwgUkhTCisgIDM4NjU2MjExNDFVLAkvLyA8MSw2LDQsNj46IENvc3QgNCB2c2xkb2kxMiA8Niw2LHUsMT4sIDw2LDQsNiw1PgorICAyMjgzODAxOTEwVSwJLy8gPDEsNiw0LDc+OiBDb3N0IDMgdm1yZ2x3IDwwLDMsMSw0PiwgUkhTCisgIDI2ODU4MDgxNjlVLAkvLyA8MSw2LDQsdT46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSw2PiwgUkhTCisgIDM3MTAwNTA0MDZVLAkvLyA8MSw2LDUsMD46IENvc3QgNCB2c2xkb2k0IDwzLDEsNiw1PiwgTEhTCisgIDM3MTAwNTE1NzFVLAkvLyA8MSw2LDUsMT46IENvc3QgNCB2c2xkb2k0IDwzLDEsNiw1PiwgPDEsNiw1LDc+CisgIDM0MDU5ODk1OTdVLAkvLyA8MSw2LDUsMj46IENvc3QgNCB2bXJnbHcgPHUsNCwxLDU+LCA8MiwzLDYsMj4KKyAgMzM1ODIxNDUwMlUsCS8vIDwxLDYsNSwzPjogQ29zdCA0IHZtcmdsdyA8MCw0LDEsNT4sIDwzLDIsNiwzPgorICAzNzEwMDUzNjg2VSwJLy8gPDEsNiw1LDQ+OiBDb3N0IDQgdnNsZG9pNCA8MywxLDYsNT4sIFJIUworICAzNzIxOTk4MDI1VSwJLy8gPDEsNiw1LDU+OiBDb3N0IDQgdnNsZG9pNCA8NSwxLDYsNT4sIDw1LDEsNiw1PgorICAyMzMyMjUwOTM2VSwJLy8gPDEsNiw1LDY+OiBDb3N0IDMgdm1yZ2x3IDx1LDQsMSw1PiwgPDYsNiw2LDY+CisgIDEyMTA3MzE4MzBVLAkvLyA8MSw2LDUsNz46IENvc3QgMiB2bXJnbHcgPDAsNCwxLDU+LCBSSFMKKyAgMTIxMDczMTgzMVUsCS8vIDwxLDYsNSx1PjogQ29zdCAyIHZtcmdsdyA8MCw0LDEsNT4sIFJIUworICAyNzkxMjg5NTk3VSwJLy8gPDEsNiw2LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDYsNiwwLDE+LCA8Niw2LDAsMT4KKyAgMzY5ODExNTQzMFUsCS8vIDwxLDYsNiwxPjogQ29zdCA0IHZzbGRvaTQgPDEsMSw2LDY+LCA8MSwxLDYsNj4KKyAgMzY5ODExNjUzOFUsCS8vIDwxLDYsNiwyPjogQ29zdCA0IHZzbGRvaTQgPDEsMSw2LDY+LCA8Miw2LDMsNz4KKyAgMzM1Njg5NDEzMlUsCS8vIDwxLDYsNiwzPjogQ29zdCA0IHZtcmdsdyA8MCwyLDEsNj4sIDwxLDIsNiwzPgorICAzNjk4MTE3OTQyVSwJLy8gPDEsNiw2LDQ+OiBDb3N0IDQgdnNsZG9pNCA8MSwxLDYsNj4sIFJIUworICAzNzIyMDA2MjE4VSwJLy8gPDEsNiw2LDU+OiBDb3N0IDQgdnNsZG9pNCA8NSwxLDYsNj4sIDw1LDEsNiw2PgorICAyNzgxMDQxNDY0VSwJLy8gPDEsNiw2LDY+OiBDb3N0IDMgdnNsZG9pMTIgPDQsdSw1LDE+LCA8Niw2LDYsNj4KKyAgMjI4MzE1NDc0MlUsCS8vIDwxLDYsNiw3PjogQ29zdCAzIHZtcmdsdyA8MCwyLDEsNj4sIFJIUworICAyMjgzMTU0NzQzVSwJLy8gPDEsNiw2LHU+OiBDb3N0IDMgdm1yZ2x3IDwwLDIsMSw2PiwgUkhTCisgIDE3MTgyMTE0MDZVLAkvLyA8MSw2LDcsMD46IENvc3QgMiB2c2xkb2kxMiA8Niw3LDAsMT4sIDw2LDcsMCwxPgorICAyNzkyMDI2OTY3VSwJLy8gPDEsNiw3LDE+OiBDb3N0IDMgdnNsZG9pMTIgPDYsNywxLDE+LCA8Niw3LDEsMT4KKyAgMjc2NTQxMTE3MFUsCS8vIDwxLDYsNywyPjogQ29zdCAzIHZzbGRvaTEyIDwyLDMsMCwxPiwgPDYsNywyLDM+CisgIDM4NTQ3ODMzMzZVLAkvLyA8MSw2LDcsMz46IENvc3QgNCB2c2xkb2kxMiA8NCx1LDUsMT4sIDw2LDcsMywwPgorICAyNzgxMDQxNTI2VSwJLy8gPDEsNiw3LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDQsdSw1LDE+LCA8Niw3LDQsNT4KKyAgMzM2NTUyODY2NFUsCS8vIDwxLDYsNyw1PjogQ29zdCA0IHZtcmdsdyA8MSw2LDEsNz4sIDwxLDQsNiw1PgorICAyNzkxOTUzMjkwVSwJLy8gPDEsNiw3LDY+OiBDb3N0IDMgdnNsZG9pMTIgPDYsNywwLDE+LCA8Niw3LDYsNz4KKyAgMjI5MTc4OTExMFUsCS8vIDwxLDYsNyw3PjogQ29zdCAzIHZtcmdsdyA8MSw2LDEsNz4sIFJIUworICAxNzE4ODAxMzAyVSwJLy8gPDEsNiw3LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDYsNyx1LDE+LCA8Niw3LHUsMT4KKyAgMTcxODg3NTAzOVUsCS8vIDwxLDYsdSwwPjogQ29zdCAyIHZzbGRvaTEyIDw2LHUsMCwxPiwgPDYsdSwwLDE+CisgIDI2ODU4MTA0NzhVLAkvLyA8MSw2LHUsMT46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSw2PiwgTEhTCisgIDI3OTI3NjQzMzdVLAkvLyA8MSw2LHUsMj46IENvc3QgMyB2c2xkb2kxMiA8Nix1LDIsMT4sIDw2LHUsMiwxPgorICAzNzU5NTUyNDQ0VSwJLy8gPDEsNix1LDM+OiBDb3N0IDQgdnNsZG9pOCA8MCwyLDEsNj4sIDx1LDMsMCwxPgorICAyNzgxMDQxNjA3VSwJLy8gPDEsNix1LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDQsdSw1LDE+LCA8Nix1LDQsNT4KKyAgMjY4NTgxMDg0MlUsCS8vIDwxLDYsdSw1PjogQ29zdCAzIHZzbGRvaTggPDAsMiwxLDY+LCBSSFMKKyAgMjY4OTc5MjIwOFUsCS8vIDwxLDYsdSw2PjogQ29zdCAzIHZzbGRvaTggPDAsdSwxLDY+LCA8dSw2LDMsNz4KKyAgMTIxMDc1NjQwNlUsCS8vIDwxLDYsdSw3PjogQ29zdCAyIHZtcmdsdyA8MCw0LDEsdT4sIFJIUworICAxMjEwNzU2NDA3VSwJLy8gPDEsNix1LHU+OiBDb3N0IDIgdm1yZ2x3IDwwLDQsMSx1PiwgUkhTCisgIDI3OTMyODA0OTZVLAkvLyA8MSw3LDAsMD46IENvc3QgMyB2c2xkb2kxMiA8NywwLDAsMT4sIDw3LDAsMCwxPgorICAyNjk0NDM5MDE0VSwJLy8gPDEsNywwLDE+OiBDb3N0IDMgdnNsZG9pOCA8MSw2LDEsNz4sIExIUworICAzMzkzMzQzOTEyVSwJLy8gPDEsNywwLDI+OiBDb3N0IDQgdm1yZ2x3IDw2LDMsMSwwPiwgPDYsMSw3LDI+CisgIDMzOTczMjUzMDZVLAkvLyA8MSw3LDAsMz46IENvc3QgNCB2bXJnbHcgPDcsMCwxLDA+LCA8NiwyLDcsMz4KKyAgMjc5MzU3NTQ0NFUsCS8vIDwxLDcsMCw0PjogQ29zdCAzIHZzbGRvaTEyIDw3LDAsNCwxPiwgPDcsMCw0LDE+CisgIDM3MjIwMzA3OTdVLAkvLyA8MSw3LDAsNT46IENvc3QgNCB2c2xkb2k0IDw1LDEsNywwPiwgPDUsMSw3LDA+CisgIDI2ODg0Njc0NDZVLAkvLyA8MSw3LDAsNj46IENvc3QgMyB2c2xkb2k4IDwwLDYsMSw3PiwgPDAsNiwxLDc+CisgIDI2ODkxMzEwNzlVLAkvLyA8MSw3LDAsNz46IENvc3QgMyB2c2xkb2k4IDwwLDcsMSw3PiwgPDAsNywxLDc+CisgIDI2OTQ0Mzk1NzBVLAkvLyA8MSw3LDAsdT46IENvc3QgMyB2c2xkb2k4IDwxLDYsMSw3PiwgPDAsdSwxLDE+CisgIDI2NTQyNjUzNTRVLAkvLyA8MSw3LDEsMD46IENvc3QgMyB2c2xkb2k0IDw2LDEsNywxPiwgPDAsMCwxLDE+CisgIDI3OTQwMTc4NjZVLAkvLyA8MSw3LDEsMT46IENvc3QgMyB2c2xkb2kxMiA8NywxLDEsMT4sIDw3LDEsMSwxPgorICAzNzY4MTgxNjM5VSwJLy8gPDEsNywxLDI+OiBDb3N0IDQgdnNsZG9pOCA8MSw2LDEsNz4sIDwxLDIsMSwzPgorICAyMzM0ODcyMDU4VSwJLy8gPDEsNywxLDM+OiBDb3N0IDMgdm1yZ2x3IDx1LHUsMSwxPiwgPDYsMiw3LDM+CisgIDI2NTQyNjg3MjZVLAkvLyA8MSw3LDEsND46IENvc3QgMyB2c2xkb2k0IDw2LDEsNywxPiwgUkhTCisgIDM3OTIwNjk3OTdVLAkvLyA8MSw3LDEsNT46IENvc3QgNCB2c2xkb2k4IDw1LDYsMSw3PiwgPDEsNSw2LDE+CisgIDI2OTQ0NDAxNDNVLAkvLyA8MSw3LDEsNj46IENvc3QgMyB2c2xkb2k4IDwxLDYsMSw3PiwgPDEsNiwxLDc+CisgIDIzMzQ4NzIzODZVLAkvLyA8MSw3LDEsNz46IENvc3QgMyB2bXJnbHcgPHUsdSwxLDE+LCA8Niw2LDcsNz4KKyAgMjY5NTc2NzQwOVUsCS8vIDwxLDcsMSx1PjogQ29zdCAzIHZzbGRvaTggPDEsdSwxLDc+LCA8MSx1LDEsNz4KKyAgMjY1NDI3MzYzOFUsCS8vIDwxLDcsMiwwPjogQ29zdCAzIHZzbGRvaTQgPDYsMSw3LDI+LCBMSFMKKyAgMjIyMjExNzk3M1UsCS8vIDwxLDcsMiwxPjogQ29zdCAzIHZtcmdodyA8MSwyLDMsMD4sIDw3LDEsMiwzPgorICAyMjk5NzExOTEyVSwJLy8gPDEsNywyLDI+OiBDb3N0IDMgdm1yZ2x3IDwzLDAsMSwyPiwgPDYsMSw3LDI+CisgIDI2NTQyNzU3MzRVLAkvLyA8MSw3LDIsMz46IENvc3QgMyB2c2xkb2k0IDw2LDEsNywyPiwgPDMsMCwxLDI+CisgIDI2NTQyNzY5MThVLAkvLyA8MSw3LDIsND46IENvc3QgMyB2c2xkb2k0IDw2LDEsNywyPiwgUkhTCisgIDMzODUzOTc2NzVVLAkvLyA8MSw3LDIsNT46IENvc3QgNCB2bXJnbHcgPDUsMCwxLDI+LCA8NiwxLDcsNT4KKyAgMjY1NDI3ODA1NlUsCS8vIDwxLDcsMiw2PjogQ29zdCAzIHZzbGRvaTQgPDYsMSw3LDI+LCA8NiwxLDcsMj4KKyAgMjMyMzU5OTYyN1UsCS8vIDwxLDcsMiw3PjogQ29zdCAzIHZtcmdsdyA8NywwLDEsMj4sIDw1LHUsNyw3PgorICAyNjU0Mjc5NDcwVSwJLy8gPDEsNywyLHU+OiBDb3N0IDMgdnNsZG9pNCA8NiwxLDcsMj4sIExIUworICAyNzk1MjcxMzk1VSwJLy8gPDEsNywzLDA+OiBDb3N0IDMgdnNsZG9pMTIgPDcsMywwLDE+LCA8NywzLDAsMT4KKyAgMzc2ODE4MzA1OVUsCS8vIDwxLDcsMywxPjogQ29zdCA0IHZzbGRvaTggPDEsNiwxLDc+LCA8MywxLDYsMT4KKyAgMzcyODAyNTI1NFUsCS8vIDwxLDcsMywyPjogQ29zdCA0IHZzbGRvaTQgPDYsMSw3LDM+LCA8MiwzLDAsMT4KKyAgMzc2ODE4MzE5NlUsCS8vIDwxLDcsMywzPjogQ29zdCA0IHZzbGRvaTggPDEsNiwxLDc+LCA8MywzLDMsMz4KKyAgMzc2ODE4MzI5OFUsCS8vIDwxLDcsMyw0PjogQ29zdCA0IHZzbGRvaTggPDEsNiwxLDc+LCA8Myw0LDUsNj4KKyAgMzc5MjA3MTI1NVUsCS8vIDwxLDcsMyw1PjogQ29zdCA0IHZzbGRvaTggPDUsNiwxLDc+LCA8Myw1LDYsMT4KKyAgMzc4MDEyNzM2MVUsCS8vIDwxLDcsMyw2PjogQ29zdCA0IHZzbGRvaTggPDMsNiwxLDc+LCA8Myw2LDEsNz4KKyAgMzg0Nzc3OTYxN1UsCS8vIDwxLDcsMyw3PjogQ29zdCA0IHZzbGRvaTEyIDwzLDcsMCwxPiwgPDcsMyw3LDA+CisgIDI3OTU4NjEyOTFVLAkvLyA8MSw3LDMsdT46IENvc3QgMyB2c2xkb2kxMiA8NywzLHUsMT4sIDw3LDMsdSwxPgorICAyNzk1OTM1MDI4VSwJLy8gPDEsNyw0LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDcsNCwwLDE+LCA8Nyw0LDAsMT4KKyAgMzcyODAzMjk3NVUsCS8vIDwxLDcsNCwxPjogQ29zdCA0IHZzbGRvaTQgPDYsMSw3LDQ+LCA8MSw2LDEsNz4KKyAgMzgzOTE1MzQ4MFUsCS8vIDwxLDcsNCwyPjogQ29zdCA0IHZzbGRvaTEyIDwyLDMsMCwxPiwgPDcsNCwyLDM+CisgIDMzOTczNTgwNzRVLAkvLyA8MSw3LDQsMz46IENvc3QgNCB2bXJnbHcgPDcsMCwxLDQ+LCA8NiwyLDcsMz4KKyAgMzg1NDc4MzgzNVUsCS8vIDwxLDcsNCw0PjogQ29zdCA0IHZzbGRvaTEyIDw0LHUsNSwxPiwgPDcsNCw0LDQ+CisgIDI2OTQ0NDIyOTRVLAkvLyA8MSw3LDQsNT46IENvc3QgMyB2c2xkb2k4IDwxLDYsMSw3PiwgUkhTCisgIDM3ODYxMDAwNThVLAkvLyA8MSw3LDQsNj46IENvc3QgNCB2c2xkb2k4IDw0LDYsMSw3PiwgPDQsNiwxLDc+CisgIDM3MjIwNjUyNTRVLAkvLyA8MSw3LDQsNz46IENvc3QgNCB2c2xkb2k0IDw1LDEsNyw0PiwgPDcsNCw1LDY+CisgIDI2OTQ0NDI1MzdVLAkvLyA8MSw3LDQsdT46IENvc3QgMyB2c2xkb2k4IDwxLDYsMSw3PiwgUkhTCisgIDI2NTQyOTgyMTRVLAkvLyA8MSw3LDUsMD46IENvc3QgMyB2c2xkb2k0IDw2LDEsNyw1PiwgTEhTCisgIDM4NTQ3ODM4OTNVLAkvLyA8MSw3LDUsMT46IENvc3QgNCB2c2xkb2kxMiA8NCx1LDUsMT4sIDw3LDUsMSx1PgorICAzNzEwMTI2MDEwVSwJLy8gPDEsNyw1LDI+OiBDb3N0IDQgdnNsZG9pNCA8MywxLDcsNT4sIDwyLDYsMyw3PgorICAyMzMyMjUwNjE4VSwJLy8gPDEsNyw1LDM+OiBDb3N0IDMgdm1yZ2x3IDx1LDQsMSw1PiwgPDYsMiw3LDM+CisgIDI2NTQzMDE0OTRVLAkvLyA8MSw3LDUsND46IENvc3QgMyB2c2xkb2k0IDw2LDEsNyw1PiwgUkhTCisgIDIyODQ0NzQ3OTVVLAkvLyA8MSw3LDUsNT46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8NiwxLDcsNT4KKyAgMjcxODMzMDkzMVUsCS8vIDwxLDcsNSw2PjogQ29zdCAzIHZzbGRvaTggPDUsNiwxLDc+LCA8NSw2LDEsNz4KKyAgMjMzMjI1MDk0NlUsCS8vIDwxLDcsNSw3PjogQ29zdCAzIHZtcmdsdyA8dSw0LDEsNT4sIDw2LDYsNyw3PgorICAyNzE5NjU4MTk3VSwJLy8gPDEsNyw1LHU+OiBDb3N0IDMgdnNsZG9pOCA8NSx1LDEsNz4sIDw1LHUsMSw3PgorICAyMzMyOTIxOTU0VSwJLy8gPDEsNyw2LDA+OiBDb3N0IDMgdm1yZ2x3IDx1LDUsMSw2PiwgPDUsNiw3LDA+CisgIDM3NjgxODUyNTRVLAkvLyA8MSw3LDYsMT46IENvc3QgNCB2c2xkb2k4IDwxLDYsMSw3PiwgPDYsMSw3LDA+CisgIDM3MTAxMzQyMDJVLAkvLyA8MSw3LDYsMj46IENvc3QgNCB2c2xkb2k0IDwzLDEsNyw2PiwgPDIsNiwzLDc+CisgIDM3MTAxMzQ1NjFVLAkvLyA8MSw3LDYsMz46IENvc3QgNCB2c2xkb2k0IDwzLDEsNyw2PiwgPDMsMSw3LDY+CisgIDM3MTAxMzU2MDZVLAkvLyA8MSw3LDYsND46IENvc3QgNCB2c2xkb2k0IDwzLDEsNyw2PiwgUkhTCisgIDM4NjQ4ODQ3NDVVLAkvLyA8MSw3LDYsNT46IENvc3QgNCB2c2xkb2kxMiA8Niw1LDcsMT4sIDw3LDYsNSw3PgorICAzODU0Nzg0MDE3VSwJLy8gPDEsNyw2LDY+OiBDb3N0IDQgdnNsZG9pMTIgPDQsdSw1LDE+LCA8Nyw2LDYsNj4KKyAgMjc5MTk1Mzk0MFUsCS8vIDwxLDcsNiw3PjogQ29zdCAzIHZzbGRvaTEyIDw2LDcsMCwxPiwgPDcsNiw3LDA+CisgIDI3OTI2MTc1MDFVLAkvLyA8MSw3LDYsdT46IENvc3QgMyB2c2xkb2kxMiA8Nix1LDAsMT4sIDw3LDYsdSwwPgorICAyNzk3OTI1OTI3VSwJLy8gPDEsNyw3LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDcsNywwLDE+LCA8Nyw3LDAsMT4KKyAgMzM2NTUyODQyNlUsCS8vIDwxLDcsNywxPjogQ29zdCA0IHZtcmdsdyA8MSw2LDEsNz4sIDwxLDEsNywxPgorICAzNzI4MDU4MDIyVSwJLy8gPDEsNyw3LDI+OiBDb3N0IDQgdnNsZG9pNCA8NiwxLDcsNz4sIDwyLDMsMCwxPgorICAzMzY1NTI4NTA5VSwJLy8gPDEsNyw3LDM+OiBDb3N0IDQgdm1yZ2x3IDwxLDYsMSw3PiwgPDEsMiw3LDM+CisgIDM4NTQ3ODQwNzlVLAkvLyA8MSw3LDcsND46IENvc3QgNCB2c2xkb2kxMiA8NCx1LDUsMT4sIDw3LDcsNCw1PgorICAzNzIyMDg4MTQ4VSwJLy8gPDEsNyw3LDU+OiBDb3N0IDQgdnNsZG9pNCA8NSwxLDcsNz4sIDw1LDEsNyw3PgorICAzNzI4MDYwODQ1VSwJLy8gPDEsNyw3LDY+OiBDb3N0IDQgdnNsZG9pNCA8NiwxLDcsNz4sIDw2LDEsNyw3PgorICAyNzgxMDQyMjg0VSwJLy8gPDEsNyw3LDc+OiBDb3N0IDMgdnNsZG9pMTIgPDQsdSw1LDE+LCA8Nyw3LDcsNz4KKyAgMjc5ODUxNTgyM1UsCS8vIDwxLDcsNyx1PjogQ29zdCAzIHZzbGRvaTEyIDw3LDcsdSwxPiwgPDcsNyx1LDE+CisgIDI2NTQzMjI3MDVVLAkvLyA8MSw3LHUsMD46IENvc3QgMyB2c2xkb2k0IDw2LDEsNyx1PiwgPDAsMCwxLHU+CisgIDI2OTQ0NDQ4NDZVLAkvLyA8MSw3LHUsMT46IENvc3QgMyB2c2xkb2k4IDwxLDYsMSw3PiwgTEhTCisgIDIyOTk3MTE5MTJVLAkvLyA8MSw3LHUsMj46IENvc3QgMyB2bXJnbHcgPDMsMCwxLDI+LCA8NiwxLDcsMj4KKyAgMjMyMzY0OTAxOFUsCS8vIDwxLDcsdSwzPjogQ29zdCAzIHZtcmdsdyA8NywwLDEsdT4sIDw2LDIsNywzPgorICAyNjU0MzI2MDcwVSwJLy8gPDEsNyx1LDQ+OiBDb3N0IDMgdnNsZG9pNCA8NiwxLDcsdT4sIFJIUworICAyNjk0NDQ1MjEwVSwJLy8gPDEsNyx1LDU+OiBDb3N0IDMgdnNsZG9pOCA8MSw2LDEsNz4sIFJIUworICAyNjU0MzI3MjE0VSwJLy8gPDEsNyx1LDY+OiBDb3N0IDMgdnNsZG9pNCA8NiwxLDcsdT4sIDw2LDEsNyx1PgorICAyMzIzNjQ5MzQ2VSwJLy8gPDEsNyx1LDc+OiBDb3N0IDMgdm1yZ2x3IDw3LDAsMSx1PiwgPDYsNiw3LDc+CisgIDI2OTQ0NDU0MTNVLAkvLyA8MSw3LHUsdT46IENvc3QgMyB2c2xkb2k4IDwxLDYsMSw3PiwgTEhTCisgIDE2MTA3NTIwMTdVLAkvLyA8MSx1LDAsMD46IENvc3QgMiB2c2xkb2k4IDwwLDAsMSx1PiwgPDAsMCwxLHU+CisgIDE2MTM0MDYzMTBVLAkvLyA8MSx1LDAsMT46IENvc3QgMiB2c2xkb2k4IDwwLDQsMSx1PiwgTEhTCisgIDI2ODU4MjExMDdVLAkvLyA8MSx1LDAsMj46IENvc3QgMyB2c2xkb2k4IDwwLDIsMSx1PiwgPDAsMiwxLHU+CisgIDIyODM3NjU5MTZVLAkvLyA8MSx1LDAsMz46IENvc3QgMyB2bXJnbHcgPDAsMywxLDA+LCBMSFMKKyAgMTYxMzQwNjU0OVUsCS8vIDwxLHUsMCw0PjogQ29zdCAyIHZzbGRvaTggPDAsNCwxLHU+LCA8MCw0LDEsdT4KKyAgMTcyNTg4MDA1NFUsCS8vIDwxLHUsMCw1PjogQ29zdCAyIHZzbGRvaTEyIDx1LDAsNSwxPiwgPHUsMCw1LDE+CisgIDI2ODg0NzU2MzlVLAkvLyA8MSx1LDAsNj46IENvc3QgMyB2c2xkb2k4IDwwLDYsMSx1PiwgPDAsNiwxLHU+CisgIDIyODM3NjkxNjBVLAkvLyA8MSx1LDAsNz46IENvc3QgMyB2bXJnbHcgPDAsMywxLDA+LCBSSFMKKyAgMTYxMzQwNjg3N1UsCS8vIDwxLHUsMCx1PjogQ29zdCAyIHZzbGRvaTggPDAsNCwxLHU+LCBMSFMKKyAgMTU1MDIyMTQxNFUsCS8vIDwxLHUsMSwwPjogQ29zdCAyIHZzbGRvaTQgPDEsMSwxLDE+LCBMSFMKKyAgMjY5MjcxMTQyVSwJLy8gPDEsdSwxLDE+OiBDb3N0IDEgdnNwbHRpc3cxIExIUworICAxNjgzMTE3ODcwVSwJLy8gPDEsdSwxLDI+OiBDb3N0IDIgdnNsZG9pMTIgPDAsdSwxLDE+LCBMSFMKKyAgMTIxMzM1MDA0NFUsCS8vIDwxLHUsMSwzPjogQ29zdCAyIHZtcmdsdyA8MCx1LDEsMT4sIExIUworICAxNTUwMjI0Njk0VSwJLy8gPDEsdSwxLDQ+OiBDb3N0IDIgdnNsZG9pNCA8MSwxLDEsMT4sIFJIUworICAxMTQ3NTc0NDI2VSwJLy8gPDEsdSwxLDU+OiBDb3N0IDIgdm1yZ2h3IDwxLDEsMSwxPiwgUkhTCisgIDI2ODcxNDkzMjZVLAkvLyA8MSx1LDEsNj46IENvc3QgMyB2c2xkb2k4IDwwLDQsMSx1PiwgPDEsNix1LDc+CisgIDEyMTMzNTMyODhVLAkvLyA8MSx1LDEsNz46IENvc3QgMiB2bXJnbHcgPDAsdSwxLDE+LCBSSFMKKyAgMjY5MjcxMTQyVSwJLy8gPDEsdSwxLHU+OiBDb3N0IDEgdnNwbHRpc3cxIExIUworICAyMjIyMTE4NjExVSwJLy8gPDEsdSwyLDA+OiBDb3N0IDMgdm1yZ2h3IDwxLDIsMywwPiwgPHUsMCwxLDI+CisgIDExNDgzNzY4NzhVLAkvLyA8MSx1LDIsMT46IENvc3QgMiB2bXJnaHcgPDEsMiwzLDA+LCBMSFMKKyAgMTE0ODM3MTg2MlUsCS8vIDwxLHUsMiwyPjogQ29zdCAyIHZtcmdodyA8MSwyLDMsMD4sIDwxLDIsMywwPgorICAxMjI1OTY1NzI0VSwJLy8gPDEsdSwyLDM+OiBDb3N0IDIgdm1yZ2x3IDwzLDAsMSwyPiwgTEhTCisgIDIyMjIxMTg5NzVVLAkvLyA8MSx1LDIsND46IENvc3QgMyB2bXJnaHcgPDEsMiwzLDA+LCA8dSw0LDUsNj4KKyAgMTE0ODM3NzI0MlUsCS8vIDwxLHUsMiw1PjogQ29zdCAyIHZtcmdodyA8MSwyLDMsMD4sIFJIUworICAyNjg3MTUwMDEwVSwJLy8gPDEsdSwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8MCw0LDEsdT4sIDwyLDYsMyw3PgorICAxMjI1OTY4OTY4VSwJLy8gPDEsdSwyLDc+OiBDb3N0IDIgdm1yZ2x3IDwzLDAsMSwyPiwgUkhTCisgIDExNDgzNzc0NDVVLAkvLyA8MSx1LDIsdT46IENvc3QgMiB2bXJnaHcgPDEsMiwzLDA+LCBMSFMKKyAgNDcxMDQwMTU2VSwJLy8gPDEsdSwzLDA+OiBDb3N0IDEgdnNsZG9pNCBMSFMsIExIUworICAxNTQ0NzgyNjQ0VSwJLy8gPDEsdSwzLDE+OiBDb3N0IDIgdnNsZG9pNCBMSFMsIDwxLDEsMSwxPgorICAxNTQ0NzgzNDY0VSwJLy8gPDEsdSwzLDI+OiBDb3N0IDIgdnNsZG9pNCBMSFMsIDwyLDIsMiwyPgorICAxNTQ0Nzg0MDIyVSwJLy8gPDEsdSwzLDM+OiBDb3N0IDIgdnNsZG9pNCBMSFMsIDwzLDAsMSwyPgorICA0NzEwNDMzODJVLAkvLyA8MSx1LDMsND46IENvc3QgMSB2c2xkb2k0IExIUywgUkhTCisgIDE1OTI1NjE2NjhVLAkvLyA8MSx1LDMsNT46IENvc3QgMiB2c2xkb2k0IExIUywgPDUsNSw1LDU+CisgIDE1OTI1NjIxNzBVLAkvLyA8MSx1LDMsNj46IENvc3QgMiB2c2xkb2k0IExIUywgPDYsMiw3LDM+CisgIDE1OTI1NjI2ODJVLAkvLyA8MSx1LDMsNz46IENvc3QgMiB2c2xkb2k0IExIUywgPDcsMCwxLDI+CisgIDQ3MTA0NTkzNFUsCS8vIDwxLHUsMyx1PjogQ29zdCAxIHZzbGRvaTQgTEhTLCBMSFMKKyAgMjcwODM4NDYyOVUsCS8vIDwxLHUsNCwwPjogQ29zdCAzIHZzbGRvaTggPDQsMCwxLHU+LCA8NCwwLDEsdT4KKyAgMjY4NzE1MTEwMVUsCS8vIDwxLHUsNCwxPjogQ29zdCAzIHZzbGRvaTggPDAsNCwxLHU+LCA8NCwxLHUsMD4KKyAgMjIyMzQwODAyMlUsCS8vIDwxLHUsNCwyPjogQ29zdCAzIHZtcmdodyA8MSw0LDIsNT4sIDwxLDIsMywwPgorICAyMjgzNzk4Njg0VSwJLy8gPDEsdSw0LDM+OiBDb3N0IDMgdm1yZ2x3IDwwLDMsMSw0PiwgTEhTCisgIDI2NDI0MjI3ODVVLAkvLyA8MSx1LDQsND46IENvc3QgMyB2c2xkb2k0IDw0LDEsdSw0PiwgPDQsMSx1LDQ+CisgIDE2MTM0MDk1OTBVLAkvLyA8MSx1LDQsNT46IENvc3QgMiB2c2xkb2k4IDwwLDQsMSx1PiwgUkhTCisgIDIyODM4MDEwOTBVLAkvLyA8MSx1LDQsNj46IENvc3QgMyB2bXJnbHcgPDAsMywxLDQ+LCA8Myw0LDUsNj4KKyAgMjI4MzgwMTkyOFUsCS8vIDwxLHUsNCw3PjogQ29zdCAzIHZtcmdsdyA8MCwzLDEsND4sIFJIUworICAxNjEzNDA5ODMzVSwJLy8gPDEsdSw0LHU+OiBDb3N0IDIgdnNsZG9pOCA8MCw0LDEsdT4sIFJIUworICAyMjg0NDcxMjM1VSwJLy8gPDEsdSw1LDA+OiBDb3N0IDMgdm1yZ2x3IDwwLDQsMSw1PiwgPDEsMix1LDA+CisgIDIyODQ0NzIwNDZVLAkvLyA8MSx1LDUsMT46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MiwzLHUsMT4KKyAgMjI4NDQ3MjUzM1UsCS8vIDwxLHUsNSwyPjogQ29zdCAzIHZtcmdsdyA8MCw0LDEsNT4sIDwzLDAsdSwyPgorICAxMjEwNzI4NjA0VSwJLy8gPDEsdSw1LDM+OiBDb3N0IDIgdm1yZ2x3IDwwLDQsMSw1PiwgTEhTCisgIDIyODQ0NzEyMzlVLAkvLyA8MSx1LDUsND46IENvc3QgMyB2bXJnbHcgPDAsNCwxLDU+LCA8MSwyLHUsND4KKyAgMTIxMDcyODc4NlUsCS8vIDwxLHUsNSw1PjogQ29zdCAyIHZtcmdsdyA8MCw0LDEsNT4sIDwwLDQsMSw1PgorICAxNjgzMTE4MjM0VSwJLy8gPDEsdSw1LDY+OiBDb3N0IDIgdnNsZG9pMTIgPDAsdSwxLDE+LCBSSFMKKyAgMTIxMDczMTg0OFUsCS8vIDwxLHUsNSw3PjogQ29zdCAyIHZtcmdsdyA8MCw0LDEsNT4sIFJIUworICAxMjEwNzI4NjA5VSwJLy8gPDEsdSw1LHU+OiBDb3N0IDIgdm1yZ2x3IDwwLDQsMSw1PiwgTEhTCisgIDI3MjAzMzAwMjNVLAkvLyA8MSx1LDYsMD46IENvc3QgMyB2c2xkb2k4IDw2LDAsMSx1PiwgPDYsMCwxLHU+CisgIDI3NTczNzYxOTBVLAkvLyA8MSx1LDYsMT46IENvc3QgMyB2c2xkb2kxMiA8MCx1LHUsMT4sIDx1LDYsMSw3PgorICAyNzI2MzAyMjAyVSwJLy8gPDEsdSw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8NywwLDEsdT4sIDw2LDIsNywzPgorICAyMjgzMTUxNTE2VSwJLy8gPDEsdSw2LDM+OiBDb3N0IDMgdm1yZ2x3IDwwLDIsMSw2PiwgTEhTCisgIDIyMjQ5NzIxMTRVLAkvLyA8MSx1LDYsND46IENvc3QgMyB2bXJnaHcgPDEsNiw1LDc+LCA8MCw0LDEsNT4KKyAgMjIyNDY4MzE2MlUsCS8vIDwxLHUsNiw1PjogQ29zdCAzIHZtcmdodyA8MSw2LDEsNz4sIFJIUworICAyNzI2MzAyNTIwVSwJLy8gPDEsdSw2LDY+OiBDb3N0IDMgdnNsZG9pOCA8NywwLDEsdT4sIDw2LDYsNiw2PgorICAyMjgzMTU0NzYwVSwJLy8gPDEsdSw2LDc+OiBDb3N0IDMgdm1yZ2x3IDwwLDIsMSw2PiwgUkhTCisgIDIyODMxNTE1MjFVLAkvLyA8MSx1LDYsdT46IENvc3QgMyB2bXJnbHcgPDAsMiwxLDY+LCBMSFMKKyAgMTY1MjU2MDg5NlUsCS8vIDwxLHUsNywwPjogQ29zdCAyIHZzbGRvaTggPDcsMCwxLHU+LCA8NywwLDEsdT4KKyAgMjMzMzU5MDIyNVUsCS8vIDwxLHUsNywxPjogQ29zdCAzIHZtcmdsdyA8dSw2LDEsNz4sIDwwLHUsdSwxPgorICAyNzY1NDEyNjI4VSwJLy8gPDEsdSw3LDI+OiBDb3N0IDMgdnNsZG9pMTIgPDIsMywwLDE+LCA8dSw3LDIsMz4KKyAgMjI5MTc4NTg4NFUsCS8vIDwxLHUsNywzPjogQ29zdCAzIHZtcmdsdyA8MSw2LDEsNz4sIExIUworICAyNzgxMDQyOTg0VSwJLy8gPDEsdSw3LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDQsdSw1LDE+LCA8dSw3LDQsNT4KKyAgMzM2NTUyNzk1M1UsCS8vIDwxLHUsNyw1PjogQ29zdCA0IHZtcmdsdyA8MSw2LDEsNz4sIDwwLDQsdSw1PgorICAyNzkxOTU0NzQ4VSwJLy8gPDEsdSw3LDY+OiBDb3N0IDMgdnNsZG9pMTIgPDYsNywwLDE+LCA8dSw3LDYsNz4KKyAgMjI5MTc4OTEyOFUsCS8vIDwxLHUsNyw3PjogQ29zdCAzIHZtcmdsdyA8MSw2LDEsNz4sIFJIUworICAxNjU3ODY5OTYwVSwJLy8gPDEsdSw3LHU+OiBDb3N0IDIgdnNsZG9pOCA8Nyx1LDEsdT4sIDw3LHUsMSx1PgorICA0NzEwODExMjFVLAkvLyA8MSx1LHUsMD46IENvc3QgMSB2c2xkb2k0IExIUywgTEhTCisgIDI2OTI3MTE0MlUsCS8vIDwxLHUsdSwxPjogQ29zdCAxIHZzcGx0aXN3MSBMSFMKKyAgMTU0NDgyNDQyNFUsCS8vIDwxLHUsdSwyPjogQ29zdCAyIHZzbGRvaTQgTEhTLCA8MiwyLDIsMj4KKyAgMTU0NDgyNDk4MlUsCS8vIDwxLHUsdSwzPjogQ29zdCAyIHZzbGRvaTQgTEhTLCA8MywwLDEsMj4KKyAgNDcxMDg0MzQyVSwJLy8gPDEsdSx1LDQ+OiBDb3N0IDEgdnNsZG9pNCBMSFMsIFJIUworICAxNjEzNDEyNTA2VSwJLy8gPDEsdSx1LDU+OiBDb3N0IDIgdnNsZG9pOCA8MCw0LDEsdT4sIFJIUworICAxNjgzMTE4NDc3VSwJLy8gPDEsdSx1LDY+OiBDb3N0IDIgdnNsZG9pMTIgPDAsdSwxLDE+LCBSSFMKKyAgMTIxMDc1NjQyNFUsCS8vIDwxLHUsdSw3PjogQ29zdCAyIHZtcmdsdyA8MCw0LDEsdT4sIFJIUworICA0NzEwODY4OTRVLAkvLyA8MSx1LHUsdT46IENvc3QgMSB2c2xkb2k0IExIUywgTEhTCisgIDIyMjY3NTc2MzJVLAkvLyA8MiwwLDAsMD46IENvc3QgMyB2bXJnaHcgPDIsMCwzLDA+LCA8MCwwLDAsMD4KKyAgMjIyNjc1NzczNFUsCS8vIDwyLDAsMCwxPjogQ29zdCAzIHZtcmdodyA8MiwwLDMsMD4sIExIUworICAzODI2NjIyNDgzVSwJLy8gPDIsMCwwLDI+OiBDb3N0IDQgdnNsZG9pMTIgPDAsMiwxLDI+LCA8MCwwLDIsMT4KKyAgMzg0MzIxMTI5MlUsCS8vIDwyLDAsMCwzPjogQ29zdCA0IHZzbGRvaTEyIDwzLDAsMSwyPiwgPDAsMCwzLDE+CisgIDMzMDA0OTk3OTRVLAkvLyA8MiwwLDAsND46IENvc3QgNCB2bXJnaHcgPDIsMCwzLDA+LCA8MCw0LDEsNT4KKyAgMzM1NjI1NjcyNFUsCS8vIDwyLDAsMCw1PjogQ29zdCA0IHZtcmdsdyA8MCwxLDIsMD4sIDwzLDQsMCw1PgorICAzODI1NjY0MDU2VSwJLy8gPDIsMCwwLDY+OiBDb3N0IDQgdnNsZG9pMTIgPDAsMCw2LDI+LCA8MCwwLDYsMj4KKyAgMzc2Mjg4OTI4OVUsCS8vIDwyLDAsMCw3PjogQ29zdCA0IHZzbGRvaTggPDAsNywyLDA+LCA8MCw3LDIsMD4KKyAgMjIyNjc1ODMwMVUsCS8vIDwyLDAsMCx1PjogQ29zdCAzIHZtcmdodyA8MiwwLDMsMD4sIExIUworICAyMjI3NDI5Mzg2VSwJLy8gPDIsMCwxLDA+OiBDb3N0IDMgdm1yZ2h3IDwyLDEsMywxPiwgPDAsMCwxLDE+CisgIDIyMjc0Mjk0NzhVLAkvLyA8MiwwLDEsMT46IENvc3QgMyB2bXJnaHcgPDIsMSwzLDE+LCBMSFMKKyAgMTY5MTE1NjU4MlUsCS8vIDwyLDAsMSwyPjogQ29zdCAyIHZzbGRvaTEyIDwyLDIsMiwyPiwgTEhTCisgIDI2NjYzNTg5OTdVLAkvLyA8MiwwLDEsMz46IENvc3QgMyB2c2xkb2k0IDx1LDIsMCwxPiwgPDMsMCx1LDI+CisgIDIyMjc0NjI0ODJVLAkvLyA8MiwwLDEsND46IENvc3QgMyB2bXJnaHcgPDIsMSwzLDU+LCA8MCw0LDEsNT4KKyAgMzcyMjE4NjQ2NFUsCS8vIDwyLDAsMSw1PjogQ29zdCA0IHZzbGRvaTQgPDUsMiwwLDE+LCA8NSwyLDAsMT4KKyAgMzg2NzA5OTI3OFUsCS8vIDwyLDAsMSw2PjogQ29zdCA0IHZzbGRvaTEyIDw3LDAsMSwyPiwgPDAsMSw2LDc+CisgIDMzNjY4ODE5MTJVLAkvLyA8MiwwLDEsNz46IENvc3QgNCB2bXJnbHcgPDEsdSwyLDE+LCA8Myw2LDAsNz4KKyAgMTY5MTE1NjYzNlUsCS8vIDwyLDAsMSx1PjogQ29zdCAyIHZzbGRvaTEyIDwyLDIsMiwyPiwgTEhTCisgIDIyMjgwMjczOTJVLAkvLyA8MiwwLDIsMD46IENvc3QgMyB2bXJnaHcgPDIsMiwyLDI+LCA8MCwwLDAsMD4KKyAgMTE1NDI4NTY3MFUsCS8vIDwyLDAsMiwxPjogQ29zdCAyIHZtcmdodyA8MiwyLDIsMj4sIExIUworICAyMjI4MDI3NTY1VSwJLy8gPDIsMCwyLDI+OiBDb3N0IDMgdm1yZ2h3IDwyLDIsMiwyPiwgPDAsMiwxLDI+CisgIDMzMDE3Njk0NjhVLAkvLyA8MiwwLDIsMz46IENvc3QgNCB2bXJnaHcgPDIsMiwyLDI+LCA8MCwzLDEsMD4KKyAgMjIyODAyNzczMFUsCS8vIDwyLDAsMiw0PjogQ29zdCAzIHZtcmdodyA8MiwyLDIsMj4sIDwwLDQsMSw1PgorICAzMzAxNzY5NjM1VSwJLy8gPDIsMCwyLDU+OiBDb3N0IDQgdm1yZ2h3IDwyLDIsMiwyPiwgPDAsNSwxLDU+CisgIDM3ODA4MDY1ODZVLAkvLyA8MiwwLDIsNj46IENvc3QgNCB2c2xkb2k4IDwzLDcsMiwwPiwgPDIsNiwzLDc+CisgIDMzNjg4ODA3NjBVLAkvLyA8MiwwLDIsNz46IENvc3QgNCB2bXJnbHcgPDIsMiwyLDI+LCA8Myw2LDAsNz4KKyAgMTE1NDI4NjIzN1UsCS8vIDwyLDAsMix1PjogQ29zdCAyIHZtcmdodyA8MiwyLDIsMj4sIExIUworICAxMjEzNDQwMDAwVSwJLy8gPDIsMCwzLDA+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDAsMCwwLDA+CisgIDEyMTM0NDE3MDJVLAkvLyA8MiwwLDMsMT46IENvc3QgMiB2bXJnbHcgTEhTLCA8MiwzLDAsMT4KKyAgMjIyODUzNTQ3MFUsCS8vIDwyLDAsMywyPjogQ29zdCAzIHZtcmdodyA8MiwzLDAsMT4sIDwwLDIsMSwzPgorICAyNjM2NTE1NjMyVSwJLy8gPDIsMCwzLDM+OiBDb3N0IDMgdnNsZG9pNCA8MywyLDAsMz4sIDwzLDIsMCwzPgorICAyMjg3MTgyOTYyVSwJLy8gPDIsMCwzLDQ+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDEsNSwwLDQ+CisgIDI2NjA0MDUzNDZVLAkvLyA8MiwwLDMsNT46IENvc3QgMyB2c2xkb2k0IDw3LDIsMCwzPiwgPDUsNiw3LDA+CisgIDIyMjg1MzU3OThVLAkvLyA8MiwwLDMsNj46IENvc3QgMyB2bXJnaHcgPDIsMywwLDE+LCA8MCw2LDEsNz4KKyAgMjY2MDQwNjQyMFUsCS8vIDwyLDAsMyw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMiwwLDM+LCA8NywyLDAsMz4KKyAgMTIxMzQ0MTcwOVUsCS8vIDwyLDAsMyx1PjogQ29zdCAyIHZtcmdsdyBMSFMsIDwyLDMsMCx1PgorICAzMzY4ODk0NDY0VSwJLy8gPDIsMCw0LDA+OiBDb3N0IDQgdm1yZ2x3IDwyLDIsMiw0PiwgPDAsMCwwLDA+CisgIDI3NjQ4OTg2NDJVLAkvLyA8MiwwLDQsMT46IENvc3QgMyB2c2xkb2kxMiA8MiwyLDIsMj4sIDwwLDQsMSw1PgorICAzODI2NjIyODExVSwJLy8gPDIsMCw0LDI+OiBDb3N0IDQgdnNsZG9pMTIgPDAsMiwxLDI+LCA8MCw0LDIsNT4KKyAgMzg0MzIxMTYyMFUsCS8vIDwyLDAsNCwzPjogQ29zdCA0IHZzbGRvaTEyIDwzLDAsMSwyPiwgPDAsNCwzLDU+CisgIDM4Mzg2NDA0OTNVLAkvLyA8MiwwLDQsND46IENvc3QgNCB2c2xkb2kxMiA8MiwyLDIsMj4sIDwwLDQsNCw1PgorICAyNzMyOTQ0Njk0VSwJLy8gPDIsMCw0LDU+OiBDb3N0IDMgdnNsZG9pOCA8dSwxLDIsMD4sIFJIUworICAzNzk3Mzk2ODU3VSwJLy8gPDIsMCw0LDY+OiBDb3N0IDQgdnNsZG9pOCA8Niw1LDIsMD4sIDw0LDYsNSwyPgorICAzODY3MDk5NTI4VSwJLy8gPDIsMCw0LDc+OiBDb3N0IDQgdnNsZG9pMTIgPDcsMCwxLDI+LCA8MCw0LDcsNT4KKyAgMjc2NDg5ODcwNVUsCS8vIDwyLDAsNCx1PjogQ29zdCAzIHZzbGRvaTEyIDwyLDIsMiwyPiwgPDAsNCx1LDU+CisgIDMzNjQyNTc3OTJVLAkvLyA8MiwwLDUsMD46IENvc3QgNCB2bXJnbHcgPDEsNCwyLDU+LCA8MCwwLDAsMD4KKyAgMjIzMDEyNDY0NlUsCS8vIDwyLDAsNSwxPjogQ29zdCAzIHZtcmdodyA8Miw1LDMsNj4sIExIUworICAzMzA0MjM1MTg0VSwJLy8gPDIsMCw1LDI+OiBDb3N0IDQgdm1yZ2h3IDwyLDUsdSw2PiwgPDAsMiwxLDU+CisgIDMzNjQyNjAxNDRVLAkvLyA8MiwwLDUsMz46IENvc3QgNCB2bXJnbHcgPDEsNCwyLDU+LCA8MywyLDAsMz4KKyAgMzMwMzgxNzU1NFUsCS8vIDwyLDAsNSw0PjogQ29zdCA0IHZtcmdodyA8Miw1LDMsMD4sIDwwLDQsMSw1PgorICAzMzY0MjYwMTQ2VSwJLy8gPDIsMCw1LDU+OiBDb3N0IDQgdm1yZ2x3IDwxLDQsMiw1PiwgPDMsMiwwLDU+CisgIDM4NjcwOTk2MDJVLAkvLyA8MiwwLDUsNj46IENvc3QgNCB2c2xkb2kxMiA8NywwLDEsMj4sIDwwLDUsNiw3PgorICAzMzY0MjYwNDcyVSwJLy8gPDIsMCw1LDc+OiBDb3N0IDQgdm1yZ2x3IDwxLDQsMiw1PiwgPDMsNiwwLDc+CisgIDIyMzAxMjUyMTNVLAkvLyA8MiwwLDUsdT46IENvc3QgMyB2bXJnaHcgPDIsNSwzLDY+LCBMSFMKKyAgMjIzMDc5NjI4OFUsCS8vIDwyLDAsNiwwPjogQ29zdCAzIHZtcmdodyA8Miw2LDMsNz4sIDwwLDAsMCwwPgorICAxMTU3MDU0NTY2VSwJLy8gPDIsMCw2LDE+OiBDb3N0IDIgdm1yZ2h3IDwyLDYsMyw3PiwgTEhTCisgIDIyMzA3OTY0NjVVLAkvLyA8MiwwLDYsMj46IENvc3QgMyB2bXJnaHcgPDIsNiwzLDc+LCA8MCwyLDEsNj4KKyAgMzMwNDUzODM2NFUsCS8vIDwyLDAsNiwzPjogQ29zdCA0IHZtcmdodyA8Miw2LDMsNz4sIDwwLDMsMSwwPgorICAyMjMwNzk2NjI2VSwJLy8gPDIsMCw2LDQ+OiBDb3N0IDMgdm1yZ2h3IDwyLDYsMyw3PiwgPDAsNCwxLDU+CisgIDM3OTczOTgyMDVVLAkvLyA8MiwwLDYsNT46IENvc3QgNCB2c2xkb2k4IDw2LDUsMiwwPiwgPDYsNSwyLDA+CisgIDMzMDQ1Mzg2MTRVLAkvLyA8MiwwLDYsNj46IENvc3QgNCB2bXJnaHcgPDIsNiwzLDc+LCA8MCw2LDEsNz4KKyAgMzc5ODcyNTQ3MVUsCS8vIDwyLDAsNiw3PjogQ29zdCA0IHZzbGRvaTggPDYsNywyLDA+LCA8Niw3LDIsMD4KKyAgMTE1NzA1NTEzM1UsCS8vIDwyLDAsNix1PjogQ29zdCAyIHZtcmdodyA8Miw2LDMsNz4sIExIUworICAzMzcxNTczMjQ4VSwJLy8gPDIsMCw3LDA+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMiw3PiwgPDAsMCwwLDA+CisgIDIyMzExODk2MDZVLAkvLyA8MiwwLDcsMT46IENvc3QgMyB2bXJnaHcgPDIsNywwLDE+LCBMSFMKKyAgMzgwMTM4MDAwM1UsCS8vIDwyLDAsNywyPjogQ29zdCA0IHZzbGRvaTggPDcsMiwyLDA+LCA8NywyLDIsMD4KKyAgMzgwMjA0MzYzNlUsCS8vIDwyLDAsNywzPjogQ29zdCA0IHZzbGRvaTggPDcsMywyLDA+LCA8NywzLDIsMD4KKyAgMzgwNjY4ODYxNFUsCS8vIDwyLDAsNyw0PjogQ29zdCA0IHZzbGRvaTggPHUsMSwyLDA+LCA8Nyw0LDUsNj4KKyAgMzM1NjMxNzMwOFUsCS8vIDwyLDAsNyw1PjogQ29zdCA0IHZtcmdsdyA8MCwxLDIsNz4sIDw3LHUsMCw1PgorICAzODA0MDM0NTM1VSwJLy8gPDIsMCw3LDY+OiBDb3N0IDQgdnNsZG9pOCA8Nyw2LDIsMD4sIDw3LDYsMiwwPgorICAzODA2Njg4ODc2VSwJLy8gPDIsMCw3LDc+OiBDb3N0IDQgdnNsZG9pOCA8dSwxLDIsMD4sIDw3LDcsNyw3PgorICAyMjMxMTkwMTczVSwJLy8gPDIsMCw3LHU+OiBDb3N0IDMgdm1yZ2h3IDwyLDcsMCwxPiwgTEhTCisgIDEyMDg4MzYwOTZVLAkvLyA8MiwwLHUsMD46IENvc3QgMiB2bXJnbHcgTEhTLCA8MCwwLDAsMD4KKyAgMTIwODgzNzc5OFUsCS8vIDwyLDAsdSwxPjogQ29zdCAyIHZtcmdsdyBMSFMsIDwyLDMsMCwxPgorICAxNjkxMTU3MTQ5VSwJLy8gPDIsMCx1LDI+OiBDb3N0IDIgdnNsZG9pMTIgPDIsMiwyLDI+LCBMSFMKKyAgMjYzNjU1NjU5N1UsCS8vIDwyLDAsdSwzPjogQ29zdCAzIHZzbGRvaTQgPDMsMiwwLHU+LCA8MywyLDAsdT4KKyAgMjI4MjU3OTYyNVUsCS8vIDwyLDAsdSw0PjogQ29zdCAzIHZtcmdsdyBMSFMsIDwyLDMsMCw0PgorICAyNjYwNDQ2MzA2VSwJLy8gPDIsMCx1LDU+OiBDb3N0IDMgdnNsZG9pNCA8NywyLDAsdT4sIDw1LDYsNywwPgorICAyMjI4NTM1Nzk4VSwJLy8gPDIsMCx1LDY+OiBDb3N0IDMgdm1yZ2h3IDwyLDMsMCwxPiwgPDAsNiwxLDc+CisgIDI2NjA0NDczODVVLAkvLyA8MiwwLHUsNz46IENvc3QgMyB2c2xkb2k0IDw3LDIsMCx1PiwgPDcsMiwwLHU+CisgIDEyMDg4Mzc4MDVVLAkvLyA8MiwwLHUsdT46IENvc3QgMiB2bXJnbHcgTEhTLCA8MiwzLDAsdT4KKyAgMzY5MjM4ODUyM1UsCS8vIDwyLDEsMCwwPjogQ29zdCA0IHZzbGRvaTQgPDAsMiwxLDA+LCA8MCwyLDEsMD4KKyAgMjc1NzUyNjI0NFUsCS8vIDwyLDEsMCwxPjogQ29zdCAzIHZzbGRvaTEyIDwxLDAsMSwyPiwgPDEsMCwxLDI+CisgIDIzMzAyOTA5NzRVLAkvLyA8MiwxLDAsMj46IENvc3QgMyB2bXJnbHcgPHUsMSwyLDA+LCA8Myx1LDEsMj4KKyAgMzg0MzIxMjAyMFUsCS8vIDwyLDEsMCwzPjogQ29zdCA0IHZzbGRvaTEyIDwzLDAsMSwyPiwgPDEsMCwzLDA+CisgIDM2OTIzOTE3MzRVLAkvLyA8MiwxLDAsND46IENvc3QgNCB2c2xkb2k0IDwwLDIsMSwwPiwgUkhTCisgIDMzMDA1MzMzNjJVLAkvLyA8MiwxLDAsNT46IENvc3QgNCB2bXJnaHcgPDIsMCwzLDQ+LCA8MSw1LDAsND4KKyAgMzc5NDA4NDMzN1UsCS8vIDwyLDEsMCw2PjogQ29zdCA0IHZzbGRvaTggPDYsMCwyLDE+LCA8MCw2LDEsMj4KKyAgMzM3NDE3MDYxNFUsCS8vIDwyLDEsMCw3PjogQ29zdCA1IHZtcmdsdyA8MywxLDIsMD4sIDwwLDYsMSw3PgorICAyNzU4MDQyNDAzVSwJLy8gPDIsMSwwLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMCx1LDI+LCA8MSwwLHUsMj4KKyAgMjY5MDQ4MjkyNFUsCS8vIDwyLDEsMSwwPjogQ29zdCAzIHZzbGRvaTggPDEsMCwyLDE+LCA8MSwwLDIsMT4KKyAgMjc2NDg5OTEyNFUsCS8vIDwyLDEsMSwxPjogQ29zdCAzIHZzbGRvaTEyIDwyLDIsMiwyPiwgPDEsMSwxLDE+CisgIDI2OTU3OTE1MTBVLAkvLyA8MiwxLDEsMj46IENvc3QgMyB2c2xkb2k4IDwxLHUsMiwxPiwgPDEsMiwzLDA+CisgIDMzNjIyMzUyNzFVLAkvLyA8MiwxLDEsMz46IENvc3QgNCB2bXJnbHcgPDEsMSwyLDE+LCA8MSwyLDEsMz4KKyAgMzY5MjM5OTkyNlUsCS8vIDwyLDEsMSw0PjogQ29zdCA0IHZzbGRvaTQgPDAsMiwxLDE+LCBSSFMKKyAgMzgzMjIyNjY0OVUsCS8vIDwyLDEsMSw1PjogQ29zdCA0IHZzbGRvaTEyIDwxLDEsNSwyPiwgPDEsMSw1LDI+CisgIDMzMDEyMDUyMzVVLAkvLyA8MiwxLDEsNj46IENvc3QgNCB2bXJnaHcgPDIsMSwzLDU+LCA8MSw2LDUsNz4KKyAgMzc2ODg3MDE3OVUsCS8vIDwyLDEsMSw3PjogQ29zdCA0IHZzbGRvaTggPDEsNywyLDE+LCA8MSw3LDIsMT4KKyAgMjY5NTc5MTk4OFUsCS8vIDwyLDEsMSx1PjogQ29zdCAzIHZzbGRvaTggPDEsdSwyLDE+LCA8MSx1LDIsMT4KKyAgMjYxODY2MzA4NVUsCS8vIDwyLDEsMiwwPjogQ29zdCAzIHZzbGRvaTQgPDAsMiwxLDI+LCA8MCwyLDEsMj4KKyAgMjIyODAyODIxMlUsCS8vIDwyLDEsMiwxPjogQ29zdCAzIHZtcmdodyA8MiwyLDIsMj4sIDwxLDEsMSwxPgorICAyNjE4NjY0NTUyVSwJLy8gPDIsMSwyLDI+OiBDb3N0IDMgdnNsZG9pNCA8MCwyLDEsMj4sIDwyLDIsMiwyPgorICAyNzU5MDAwOTg0VSwJLy8gPDIsMSwyLDM+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDI+LCA8MSwyLDMsMj4KKyAgMjYxODY2NjI5NFUsCS8vIDwyLDEsMiw0PjogQ29zdCAzIHZzbGRvaTQgPDAsMiwxLDI+LCBSSFMKKyAgMjI5NTEzNjU5NFUsCS8vIDwyLDEsMiw1PjogQ29zdCAzIHZtcmdsdyA8MiwyLDIsMj4sIDwwLDQsMSw1PgorICAzNzY5NTM0Mzc2VSwJLy8gPDIsMSwyLDY+OiBDb3N0IDQgdnNsZG9pOCA8MSx1LDIsMT4sIDwyLDYsMSw3PgorICAyNzkzMzU4MjY2VSwJLy8gPDIsMSwyLDc+OiBDb3N0IDMgdnNsZG9pMTIgPDcsMCwxLDI+LCA8MSwyLDcsMD4KKyAgMjYxODY2ODg0NlUsCS8vIDwyLDEsMix1PjogQ29zdCAzIHZzbGRvaTQgPDAsMiwxLDI+LCBMSFMKKyAgMjI4MjUzNjk2OVUsCS8vIDwyLDEsMywwPjogQ29zdCAzIHZtcmdsdyBMSFMsIDwwLDAsMSwwPgorICAxMjA4Nzk1MTQ2VSwJLy8gPDIsMSwzLDE+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDAsMCwxLDE+CisgIDEyMTM0NDIxOThVLAkvLyA8MiwxLDMsMj46IENvc3QgMiB2bXJnbHcgTEhTLCA8MywwLDEsMj4KKyAgMjI4NzE4MTk5OFUsCS8vIDwyLDEsMywzPjogQ29zdCAzIHZtcmdsdyBMSFMsIDwwLDIsMSwzPgorICAyNjE4Njc0NDg2VSwJLy8gPDIsMSwzLDQ+OiBDb3N0IDMgdnNsZG9pNCA8MCwyLDEsMz4sIFJIUworICAxMjA4Nzk1NDc0VSwJLy8gPDIsMSwzLDU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDAsNCwxLDU+CisgIDIyODcxODIwMDFVLAkvLyA8MiwxLDMsNj46IENvc3QgMyB2bXJnbHcgTEhTLCA8MCwyLDEsNj4KKyAgMjI4NzE4MzA1NVUsCS8vIDwyLDEsMyw3PjogQ29zdCAzIHZtcmdsdyBMSFMsIDwxLDYsMSw3PgorICAxMjA4Nzk1MTUzVSwJLy8gPDIsMSwzLHU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDAsMCwxLHU+CisgIDM2OTI0MjEyOTVVLAkvLyA8MiwxLDQsMD46IENvc3QgNCB2c2xkb2k0IDwwLDIsMSw0PiwgPDAsMiwxLDQ+CisgIDM4Mzg2NDExOTVVLAkvLyA8MiwxLDQsMT46IENvc3QgNCB2c2xkb2kxMiA8MiwyLDIsMj4sIDwxLDQsMSw1PgorICAyMzMwMzIzNzQyVSwJLy8gPDIsMSw0LDI+OiBDb3N0IDMgdm1yZ2x3IDx1LDEsMiw0PiwgPDMsdSwxLDI+CisgIDM2OTI0MjMzMThVLAkvLyA8MiwxLDQsMz46IENvc3QgNSB2c2xkb2k0IDwwLDIsMSw0PiwgPDMsMCwxLDI+CisgIDM2OTI0MjQ1MDJVLAkvLyA8MiwxLDQsND46IENvc3QgNCB2c2xkb2k0IDwwLDIsMSw0PiwgUkhTCisgIDI2OTU3OTM5NzRVLAkvLyA8MiwxLDQsNT46IENvc3QgMyB2c2xkb2k4IDwxLHUsMiwxPiwgUkhTCisgIDM3OTkzOTU3MDVVLAkvLyA8MiwxLDQsNj46IENvc3QgNCB2c2xkb2k4IDw2LHUsMiwxPiwgPDQsNiw1LDI+CisgIDMzNjg4OTU2OTVVLAkvLyA8MiwxLDQsNz46IENvc3QgNSB2bXJnbHcgPDIsMiwyLDQ+LCA8MSw2LDEsNz4KKyAgMjY5NTc5NDIxN1UsCS8vIDwyLDEsNCx1PjogQ29zdCAzIHZzbGRvaTggPDEsdSwyLDE+LCBSSFMKKyAgMzY5MjQyOTQ4OFUsCS8vIDwyLDEsNSwwPjogQ29zdCA0IHZzbGRvaTQgPDAsMiwxLDU+LCA8MCwyLDEsNT4KKyAgMzM2NDI1NzgwMlUsCS8vIDwyLDEsNSwxPjogQ29zdCA0IHZtcmdsdyA8MSw0LDIsNT4sIDwwLDAsMSwxPgorICAzNjkyNDMxMjUzVSwJLy8gPDIsMSw1LDI+OiBDb3N0IDQgdnNsZG9pNCA8MCwyLDEsNT4sIDwyLDUsdSw2PgorICAzNjkyNDMxODc0VSwJLy8gPDIsMSw1LDM+OiBDb3N0IDQgdnNsZG9pNCA8MCwyLDEsNT4sIDwzLDQsNSw2PgorICAzNjkyNDMyNjk0VSwJLy8gPDIsMSw1LDQ+OiBDb3N0IDQgdnNsZG9pNCA8MCwyLDEsNT4sIFJIUworICAzMzY0MjU4MTMwVSwJLy8gPDIsMSw1LDU+OiBDb3N0IDQgdm1yZ2x3IDwxLDQsMiw1PiwgPDAsNCwxLDU+CisgIDMzMDM4NzU4MjdVLAkvLyA8MiwxLDUsNj46IENvc3QgNCB2bXJnaHcgPDIsNSwzLDc+LCA8MSw2LDUsNz4KKyAgMzg2NzEwMDMzM1UsCS8vIDwyLDEsNSw3PjogQ29zdCA0IHZzbGRvaTEyIDw3LDAsMSwyPiwgPDEsNSw3LDA+CisgIDM2OTI0MzUyNDZVLAkvLyA8MiwxLDUsdT46IENvc3QgNCB2c2xkb2k0IDwwLDIsMSw1PiwgTEhTCisgIDI2MTg2OTU4NTdVLAkvLyA8MiwxLDYsMD46IENvc3QgMyB2c2xkb2k0IDwwLDIsMSw2PiwgPDAsMiwxLDY+CisgIDIyMzA3OTcxMDhVLAkvLyA8MiwxLDYsMT46IENvc3QgMyB2bXJnaHcgPDIsNiwzLDc+LCA8MSwxLDEsMT4KKyAgMjYxODY5NzY1OFUsCS8vIDwyLDEsNiwyPjogQ29zdCAzIHZzbGRvaTQgPDAsMiwxLDY+LCA8Miw2LDMsNz4KKyAgMzY5MjQzOTcwMlUsCS8vIDwyLDEsNiwzPjogQ29zdCA0IHZzbGRvaTQgPDAsMiwxLDY+LCA8MywwLDEsMj4KKyAgMjYxODY5OTA2MlUsCS8vIDwyLDEsNiw0PjogQ29zdCAzIHZzbGRvaTQgPDAsMiwxLDY+LCBSSFMKKyAgMzM2NDkyOTg3NFUsCS8vIDwyLDEsNiw1PjogQ29zdCA0IHZtcmdsdyA8MSw1LDIsNj4sIDwwLDQsMSw1PgorICAzNjkyNDQyNDI0VSwJLy8gPDIsMSw2LDY+OiBDb3N0IDQgdnNsZG9pNCA8MCwyLDEsNj4sIDw2LDYsNiw2PgorICAzNzk4NzMzNjY0VSwJLy8gPDIsMSw2LDc+OiBDb3N0IDQgdnNsZG9pOCA8Niw3LDIsMT4sIDw2LDcsMiwxPgorICAyNjE4NzAxNjE0VSwJLy8gPDIsMSw2LHU+OiBDb3N0IDMgdnNsZG9pNCA8MCwyLDEsNj4sIExIUworICAzNzk5Mzk3MzcwVSwJLy8gPDIsMSw3LDA+OiBDb3N0IDQgdnNsZG9pOCA8Nix1LDIsMT4sIDw3LDAsMSwyPgorICAzMzcxNTczMjU4VSwJLy8gPDIsMSw3LDE+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMiw3PiwgPDAsMCwxLDE+CisgIDIzMzAzNTEyMzRVLAkvLyA8MiwxLDcsMj46IENvc3QgMyB2bXJnbHcgPHUsMSwyLDc+LCA8Nyx1LDEsMj4KKyAgMzc5OTM5NzY1OFUsCS8vIDwyLDEsNywzPjogQ29zdCA0IHZzbGRvaTggPDYsdSwyLDE+LCA8NywzLDYsMj4KKyAgMzc5OTM5NzczNFUsCS8vIDwyLDEsNyw0PjogQ29zdCA0IHZzbGRvaTggPDYsdSwyLDE+LCA8Nyw0LDUsNj4KKyAgMzM3MTU3MzU4NlUsCS8vIDwyLDEsNyw1PjogQ29zdCA0IHZtcmdsdyA8Miw2LDIsNz4sIDwwLDQsMSw1PgorICAzNzk5Mzk3ODcwVSwJLy8gPDIsMSw3LDY+OiBDb3N0IDQgdnNsZG9pOCA8Nix1LDIsMT4sIDw3LDYsMiw3PgorICAzNzk5Mzk3OTU2VSwJLy8gPDIsMSw3LDc+OiBDb3N0IDQgdnNsZG9pOCA8Nix1LDIsMT4sIDw3LDcsMywzPgorICAyMzMwMzUxMjM0VSwJLy8gPDIsMSw3LHU+OiBDb3N0IDMgdm1yZ2x3IDx1LDEsMiw3PiwgPDcsdSwxLDI+CisgIDIyODI1Nzc5MjlVLAkvLyA8MiwxLHUsMD46IENvc3QgMyB2bXJnbHcgTEhTLCA8MCwwLDEsMD4KKyAgMTIwODgzNjEwNlUsCS8vIDwyLDEsdSwxPjogQ29zdCAyIHZtcmdsdyBMSFMsIDwwLDAsMSwxPgorICAxMjA4ODM4Mjk0VSwJLy8gPDIsMSx1LDI+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDMsMCwxLDI+CisgIDIyODI1NzgwOTRVLAkvLyA8MiwxLHUsMz46IENvc3QgMyB2bXJnbHcgTEhTLCA8MCwyLDEsMz4KKyAgMjI4MjU3NzkzM1UsCS8vIDwyLDEsdSw0PjogQ29zdCAzIHZtcmdsdyBMSFMsIDwwLDAsMSw0PgorICAxMjA4ODM2NDM0VSwJLy8gPDIsMSx1LDU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDAsNCwxLDU+CisgIDIyODI1NzgwOTdVLAkvLyA8MiwxLHUsNj46IENvc3QgMyB2bXJnbHcgTEhTLCA8MCwyLDEsNj4KKyAgMjI4NzIyNDAxNVUsCS8vIDwyLDEsdSw3PjogQ29zdCAzIHZtcmdsdyBMSFMsIDwxLDYsMSw3PgorICAxMjA4ODM2MTEzVSwJLy8gPDIsMSx1LHU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDAsMCwxLHU+CisgIDIyMjY3NTkxMTdVLAkvLyA8MiwyLDAsMD46IENvc3QgMyB2bXJnaHcgPDIsMCwzLDA+LCA8MiwwLDMsMD4KKyAgMTYyNDA0NzcxOFUsCS8vIDwyLDIsMCwxPjogQ29zdCAyIHZzbGRvaTggPDIsMiwyLDI+LCBMSFMKKyAgMjY5Nzc4OTYxM1UsCS8vIDwyLDIsMCwyPjogQ29zdCAzIHZzbGRvaTggPDIsMiwyLDI+LCA8MCwyLDEsMj4KKyAgMjIyNjc2NzUyNlUsCS8vIDwyLDIsMCwzPjogQ29zdCAzIHZtcmdodyA8MiwwLDMsMT4sIDwyLDMsMCwxPgorICAyNjk3Nzg5Nzc4VSwJLy8gPDIsMiwwLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MiwyLDIsMj4sIDwwLDQsMSw1PgorICAzMzAwNjU3MDAwVSwJLy8gPDIsMiwwLDU+OiBDb3N0IDQgdm1yZ2h3IDwyLDAsNSwxPiwgPDIsNSwzLDY+CisgIDIyMjY5ODg5ODZVLAkvLyA8MiwyLDAsNj46IENvc3QgMyB2bXJnaHcgPDIsMCw2LDE+LCA8Miw2LDMsNz4KKyAgMzczNDI3MTEzOVUsCS8vIDwyLDIsMCw3PjogQ29zdCA0IHZzbGRvaTQgPDcsMiwyLDA+LCA8NywyLDIsMD4KKyAgMTYyNDA0ODI4NVUsCS8vIDwyLDIsMCx1PjogQ29zdCAyIHZzbGRvaTggPDIsMiwyLDI+LCBMSFMKKyAgMzgzMTI2ODg2OFUsCS8vIDwyLDIsMSwwPjogQ29zdCA0IHZzbGRvaTEyIDwxLDAsMSwyPiwgPDIsMSwwLDE+CisgIDIyOTMxMzg4MDRVLAkvLyA8MiwyLDEsMT46IENvc3QgMyB2bXJnbHcgPDEsdSwyLDE+LCA8MSx1LDIsMT4KKyAgMjY5Nzc5MDM1OFUsCS8vIDwyLDIsMSwyPjogQ29zdCAzIHZzbGRvaTggPDIsMiwyLDI+LCA8MSwyLDMsMD4KKyAgMjI5MzEzNzUxMFUsCS8vIDwyLDIsMSwzPjogQ29zdCAzIHZtcmdsdyA8MSx1LDIsMT4sIExIUworICAzNzcxNTMyMzMxVSwJLy8gPDIsMiwxLDQ+OiBDb3N0IDQgdnNsZG9pOCA8MiwyLDIsMj4sIDwxLDQsMSw1PgorICAzNzY3NTUxMTA2VSwJLy8gPDIsMiwxLDU+OiBDb3N0IDQgdnNsZG9pOCA8MSw1LDIsMj4sIDwxLDUsMiwyPgorICAzMzAxMTczMTc4VSwJLy8gPDIsMiwxLDY+OiBDb3N0IDQgdm1yZ2h3IDwyLDEsMywxPiwgPDIsNiwzLDc+CisgIDMzNzI4NTMxNjlVLAkvLyA8MiwyLDEsNz46IENvc3QgNCB2bXJnbHcgPDIsdSwyLDE+LCA8Miw2LDIsNz4KKyAgMjI5MzEzNzUxNVUsCS8vIDwyLDIsMSx1PjogQ29zdCAzIHZtcmdsdyA8MSx1LDIsMT4sIExIUworICAxNTU2OTM4ODU0VSwJLy8gPDIsMiwyLDA+OiBDb3N0IDIgdnNsZG9pNCA8MiwyLDIsMj4sIExIUworICAyMjk1MTM3NzMzVSwJLy8gPDIsMiwyLDE+OiBDb3N0IDMgdm1yZ2x3IDwyLDIsMiwyPiwgPDIsMCwyLDE+CisgIDMzNjM4MDAwNlUsCS8vIDwyLDIsMiwyPjogQ29zdCAxIHZzcGx0aXN3MiBMSFMKKyAgMTIyMTM5NDUzNFUsCS8vIDwyLDIsMiwzPjogQ29zdCAyIHZtcmdsdyA8MiwyLDIsMj4sIExIUworICAxNTU2OTQyMTM0VSwJLy8gPDIsMiwyLDQ+OiBDb3N0IDIgdnNsZG9pNCA8MiwyLDIsMj4sIFJIUworICAyMjk1MTM4MDYxVSwJLy8gPDIsMiwyLDU+OiBDb3N0IDMgdm1yZ2x3IDwyLDIsMiwyPiwgPDIsNCwyLDU+CisgIDIyMjgwMjkzNzBVLAkvLyA8MiwyLDIsNj46IENvc3QgMyB2bXJnaHcgPDIsMiwyLDI+LCA8Miw2LDMsNz4KKyAgMjY2MDU0NTcwMVUsCS8vIDwyLDIsMiw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMiwyLDI+LCA8NywyLDIsMj4KKyAgMzM2MzgwMDA2VSwJLy8gPDIsMiwyLHU+OiBDb3N0IDEgdnNwbHRpc3cyIExIUworICAyNjk3NzkxNjM4VSwJLy8gPDIsMiwzLDA+OiBDb3N0IDMgdnNsZG9pOCA8MiwyLDIsMj4sIDwzLDAsMSwyPgorICAyNzY1NDg5ODQwVSwJLy8gPDIsMiwzLDE+OiBDb3N0IDMgdnNsZG9pMTIgPDIsMywxLDI+LCA8MiwzLDEsMj4KKyAgMTIxMzQ0MTY0MFUsCS8vIDwyLDIsMywyPjogQ29zdCAyIHZtcmdsdyBMSFMsIDwyLDIsMiwyPgorICAxMzUwNTM0MTRVLAkvLyA8MiwyLDMsMz46IENvc3QgMSB2bXJnbHcgTEhTLCBMSFMKKyAgMjY5Nzc5MjAwMlUsCS8vIDwyLDIsMyw0PjogQ29zdCAzIHZzbGRvaTggPDIsMiwyLDI+LCA8Myw0LDUsNj4KKyAgMjMzMDMxMzc4MFUsCS8vIDwyLDIsMyw1PjogQ29zdCAzIHZtcmdsdyBMSFMsIDwxLDQsMiw1PgorICAyMjg3MTgzNTQ5VSwJLy8gPDIsMiwzLDY+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDIsMywyLDY+CisgIDI2NjA1NTM4OTRVLAkvLyA8MiwyLDMsNz46IENvc3QgMyB2c2xkb2k0IDw3LDIsMiwzPiwgPDcsMiwyLDM+CisgIDEzNTA1MzQxOVUsCS8vIDwyLDIsMyx1PjogQ29zdCAxIHZtcmdsdyBMSFMsIExIUworICAyNjMwNjk3MDYyVSwJLy8gPDIsMiw0LDA+OiBDb3N0IDMgdnNsZG9pNCA8MiwyLDIsND4sIExIUworICAzNzcxNTM0MjgyVSwJLy8gPDIsMiw0LDE+OiBDb3N0IDQgdnNsZG9pOCA8MiwyLDIsMj4sIDw0LDEsMiwzPgorICAyNzY0OTAwMTA5VSwJLy8gPDIsMiw0LDI+OiBDb3N0IDMgdnNsZG9pMTIgPDIsMiwyLDI+LCA8Miw0LDIsNT4KKyAgMjI5NTE1Mjc0MlUsCS8vIDwyLDIsNCwzPjogQ29zdCAzIHZtcmdsdyA8MiwyLDIsND4sIExIUworICAyMjk1MTU0MjgyVSwJLy8gPDIsMiw0LDQ+OiBDb3N0IDMgdm1yZ2x3IDwyLDIsMiw0PiwgPDIsMiwyLDQ+CisgIDE2MjQwNTA5OThVLAkvLyA8MiwyLDQsNT46IENvc3QgMiB2c2xkb2k4IDwyLDIsMiwyPiwgUkhTCisgIDIyMjk2NzU5NjJVLAkvLyA8MiwyLDQsNj46IENvc3QgMyB2bXJnaHcgPDIsNCw2LDU+LCA8Miw2LDMsNz4KKyAgMzM2ODg5NjQzM1UsCS8vIDwyLDIsNCw3PjogQ29zdCA0IHZtcmdsdyA8MiwyLDIsND4sIDwyLDYsMiw3PgorICAxNjI0MDUxMjQxVSwJLy8gPDIsMiw0LHU+OiBDb3N0IDIgdnNsZG9pOCA8MiwyLDIsMj4sIFJIUworICAzNzcxNTM0OTIwVSwJLy8gPDIsMiw1LDA+OiBDb3N0IDQgdnNsZG9pOCA8MiwyLDIsMj4sIDw1LDAsMSwyPgorICAzMzY0MjU4NTQwVSwJLy8gPDIsMiw1LDE+OiBDb3N0IDQgdm1yZ2x3IDwxLDQsMiw1PiwgPDEsMCwyLDE+CisgIDIyOTY0ODk1NzZVLAkvLyA8MiwyLDUsMj46IENvc3QgMyB2bXJnbHcgPDIsNCwyLDU+LCA8MiwyLDIsMj4KKyAgMjI5MDUxNjA3MFUsCS8vIDwyLDIsNSwzPjogQ29zdCAzIHZtcmdsdyA8MSw0LDIsNT4sIExIUworICAzNzcxNTM1Mjg0VSwJLy8gPDIsMiw1LDQ+OiBDb3N0IDQgdnNsZG9pOCA8MiwyLDIsMj4sIDw1LDQsNSw2PgorICAyMjkwNTE3MDQ0VSwJLy8gPDIsMiw1LDU+OiBDb3N0IDMgdm1yZ2x3IDwxLDQsMiw1PiwgPDEsNCwyLDU+CisgIDI2OTc3OTM2MzRVLAkvLyA8MiwyLDUsNj46IENvc3QgMyB2c2xkb2k4IDwyLDIsMiwyPiwgPDUsNiw3LDA+CisgIDMzNzAyMzE3MjlVLAkvLyA8MiwyLDUsNz46IENvc3QgNCB2bXJnbHcgPDIsNCwyLDU+LCA8Miw2LDIsNz4KKyAgMjI5MDUxNjA3NVUsCS8vIDwyLDIsNSx1PjogQ29zdCAzIHZtcmdsdyA8MSw0LDIsNT4sIExIUworICAyMjMwNzk3ODAxVSwJLy8gPDIsMiw2LDA+OiBDb3N0IDMgdm1yZ2h3IDwyLDYsMyw3PiwgPDIsMCw2LDE+CisgIDMzMDQ1Mzk2NzlVLAkvLyA8MiwyLDYsMT46IENvc3QgNCB2bXJnaHcgPDIsNiwzLDc+LCA8MiwxLDMsMT4KKyAgMjc2NDkwMDI3M1UsCS8vIDwyLDIsNiwyPjogQ29zdCAzIHZzbGRvaTEyIDwyLDIsMiwyPiwgPDIsNiwyLDc+CisgIDI3NjQ5MDAyODJVLAkvLyA8MiwyLDYsMz46IENvc3QgMyB2c2xkb2kxMiA8MiwyLDIsMj4sIDwyLDYsMyw3PgorICAyMjMwNzk4MTI5VSwJLy8gPDIsMiw2LDQ+OiBDb3N0IDMgdm1yZ2h3IDwyLDYsMyw3PiwgPDIsNCw2LDU+CisgIDMzMDQ1NDAwMDhVLAkvLyA8MiwyLDYsNT46IENvc3QgNCB2bXJnaHcgPDIsNiwzLDc+LCA8Miw1LDMsNj4KKyAgMTE1NzA1NjQ0MlUsCS8vIDwyLDIsNiw2PjogQ29zdCAyIHZtcmdodyA8Miw2LDMsNz4sIDwyLDYsMyw3PgorICAyNzI1MDAwMDMzVSwJLy8gPDIsMiw2LDc+OiBDb3N0IDMgdnNsZG9pOCA8Niw3LDIsMj4sIDw2LDcsMiwyPgorICAxMTU3MDU2NDQyVSwJLy8gPDIsMiw2LHU+OiBDb3N0IDIgdm1yZ2h3IDwyLDYsMyw3PiwgPDIsNiwzLDc+CisgIDI3OTMzNTkzMzhVLAkvLyA8MiwyLDcsMD46IENvc3QgMyB2c2xkb2kxMiA8NywwLDEsMj4sIDwyLDcsMCwxPgorICAzMzcxNTc0NzI1VSwJLy8gPDIsMiw3LDE+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMiw3PiwgPDIsMCwyLDE+CisgIDIyOTc4MzMwNjRVLAkvLyA8MiwyLDcsMj46IENvc3QgMyB2bXJnbHcgPDIsNiwyLDc+LCA8MiwyLDIsMj4KKyAgMjI5NzgzMTUyNlUsCS8vIDwyLDIsNywzPjogQ29zdCAzIHZtcmdsdyA8Miw2LDIsNz4sIExIUworICAyNjk3Nzk0OTE4VSwJLy8gPDIsMiw3LDQ+OiBDb3N0IDMgdnNsZG9pOCA8MiwyLDIsMj4sIDw3LDQsNSw2PgorICAzMzcxNTc1MDUzVSwJLy8gPDIsMiw3LDU+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMiw3PiwgPDIsNCwyLDU+CisgIDMzMDQ5MzMyOTdVLAkvLyA8MiwyLDcsNj46IENvc3QgNCB2bXJnaHcgPDIsNywwLDE+LCA8Miw2LDIsNz4KKyAgMjI5NzgzMzM5M1UsCS8vIDwyLDIsNyw3PjogQ29zdCAzIHZtcmdsdyA8Miw2LDIsNz4sIDwyLDYsMiw3PgorICAyMjk3ODMxNTMxVSwJLy8gPDIsMiw3LHU+OiBDb3N0IDMgdm1yZ2x3IDwyLDYsMiw3PiwgTEhTCisgIDE1NTY5Mzg4NTRVLAkvLyA8MiwyLHUsMD46IENvc3QgMiB2c2xkb2k0IDwyLDIsMiwyPiwgTEhTCisgIDE2MjQwNTM1NTBVLAkvLyA8MiwyLHUsMT46IENvc3QgMiB2c2xkb2k4IDwyLDIsMiwyPiwgTEhTCisgIDMzNjM4MDAwNlUsCS8vIDwyLDIsdSwyPjogQ29zdCAxIHZzcGx0aXN3MiBMSFMKKyAgMTM1MDk0Mzc0VSwJLy8gPDIsMix1LDM+OiBDb3N0IDEgdm1yZ2x3IExIUywgTEhTCisgIDE1NTY5NDIxMzRVLAkvLyA8MiwyLHUsND46IENvc3QgMiB2c2xkb2k0IDwyLDIsMiwyPiwgUkhTCisgIDE2MjQwNTM5MTRVLAkvLyA8MiwyLHUsNT46IENvc3QgMiB2c2xkb2k4IDwyLDIsMiwyPiwgUkhTCisgIDExNTcwNTY0NDJVLAkvLyA8MiwyLHUsNj46IENvc3QgMiB2bXJnaHcgPDIsNiwzLDc+LCA8Miw2LDMsNz4KKyAgMjY2MDU5NDg1OVUsCS8vIDwyLDIsdSw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMiwyLHU+LCA8NywyLDIsdT4KKyAgMTM1MDk0Mzc5VSwJLy8gPDIsMix1LHU+OiBDb3N0IDEgdm1yZ2x3IExIUywgTEhTCisgIDE2MTE0NDgzMjBVLAkvLyA8MiwzLDAsMD46IENvc3QgMiB2c2xkb2k4IExIUywgPDAsMCwwLDA+CisgIDUzNzcwNjU5OFUsCS8vIDwyLDMsMCwxPjogQ29zdCAxIHZzbGRvaTggTEhTLCBMSFMKKyAgMjY4OTgzNTE4MVUsCS8vIDwyLDMsMCwyPjogQ29zdCAzIHZzbGRvaTggTEhTLCA8MCwyLDEsMj4KKyAgMjY4OTgzNTI2MFUsCS8vIDwyLDMsMCwzPjogQ29zdCAzIHZzbGRvaTggTEhTLCA8MCwzLDEsMD4KKyAgMTYxMTQ0ODY1OFUsCS8vIDwyLDMsMCw0PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8MCw0LDEsNT4KKyAgMjczMjk2NjM1NFUsCS8vIDwyLDMsMCw1PjogQ29zdCAzIHZzbGRvaTggTEhTLCA8MCw1LDYsNz4KKyAgMjczMjk2NjM5MFUsCS8vIDwyLDMsMCw2PjogQ29zdCAzIHZzbGRvaTggTEhTLCA8MCw2LDEsNz4KKyAgMjY2MDYwMzA1MlUsCS8vIDwyLDMsMCw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMiwzLDA+LCA8NywyLDMsMD4KKyAgNTM3NzA3MTY1VSwJLy8gPDIsMywwLHU+OiBDb3N0IDEgdnNsZG9pOCBMSFMsIExIUworICAyNjg5ODM1NzQ4VSwJLy8gPDIsMywxLDA+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwxLDAsMSwyPgorICAxNjExNDQ5MTQwVSwJLy8gPDIsMywxLDE+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwxLDEsMSwxPgorICAxNjExNDQ5MjM4VSwJLy8gPDIsMywxLDI+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwxLDIsMywwPgorICAzNzYzNTc3ODA1VSwJLy8gPDIsMywxLDM+OiBDb3N0IDQgdnNsZG9pOCBMSFMsIDwxLDMsMCwxPgorICAyNjg5ODM2MTEyVSwJLy8gPDIsMywxLDQ+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwxLDQsNSw2PgorICAyNjg5ODM2MTQzVSwJLy8gPDIsMywxLDU+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwxLDUsMCwxPgorICAyNjg5ODM2MjM5VSwJLy8gPDIsMywxLDY+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwxLDYsMSw3PgorICAzMzY2ODgxMjEwVSwJLy8gPDIsMywxLDc+OiBDb3N0IDQgdm1yZ2x3IDwxLHUsMiwxPiwgPDIsNiwzLDc+CisgIDE2MTYwOTQ1ODhVLAkvLyA8MiwzLDEsdT46IENvc3QgMiB2c2xkb2k4IExIUywgPDEsdSwzLDA+CisgIDI2ODk4MzY0OTNVLAkvLyA8MiwzLDIsMD46IENvc3QgMyB2c2xkb2k4IExIUywgPDIsMCwzLDA+CisgIDI2ODUxOTE3MTFVLAkvLyA8MiwzLDIsMT46IENvc3QgMyB2c2xkb2k4IExIUywgPDIsMSwzLDE+CisgIDE2MTE0NDk5NjBVLAkvLyA8MiwzLDIsMj46IENvc3QgMiB2c2xkb2k4IExIUywgPDIsMiwyLDI+CisgIDE2MTE0NTAwMjJVLAkvLyA8MiwzLDIsMz46IENvc3QgMiB2c2xkb2k4IExIUywgPDIsMywwLDE+CisgIDI2ODk4MzY4MjJVLAkvLyA8MiwzLDIsND46IENvc3QgMyB2c2xkb2k4IExIUywgPDIsNCwzLDU+CisgIDI2ODk4MzY5MDRVLAkvLyA8MiwzLDIsNT46IENvc3QgMyB2c2xkb2k4IExIUywgPDIsNSwzLDY+CisgIDE2MTE0NTAyOThVLAkvLyA8MiwzLDIsNj46IENvc3QgMiB2c2xkb2k4IExIUywgPDIsNiwzLDc+CisgIDIyOTUxMzgyMzRVLAkvLyA8MiwzLDIsNz46IENvc3QgMyB2bXJnbHcgPDIsMiwyLDI+LCA8Miw2LDMsNz4KKyAgMTYxMTQ1MDQ1NlUsCS8vIDwyLDMsMix1PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8Mix1LDMsMz4KKyAgMTIxMzQ0MDkxOFUsCS8vIDwyLDMsMywwPjogQ29zdCAyIHZtcmdsdyBMSFMsIDwxLDIsMywwPgorICAyMjgyNTM4NTI3VSwJLy8gPDIsMywzLDE+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDIsMSwzLDE+CisgIDE1NTcwMjIzMjJVLAkvLyA8MiwzLDMsMj46IENvc3QgMiB2c2xkb2k0IDwyLDIsMywzPiwgPDIsMiwzLDM+CisgIDEyMDg3OTY3ODZVLAkvLyA8MiwzLDMsMz46IENvc3QgMiB2bXJnbHcgTEhTLCA8MiwyLDMsMz4KKyAgMTIxMzQ0MDkyMlUsCS8vIDwyLDMsMyw0PjogQ29zdCAyIHZtcmdsdyBMSFMsIDwxLDIsMyw0PgorICAyMjgyNTM4NTMxVSwJLy8gPDIsMywzLDU+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDIsMSwzLDU+CisgIDIyODcxODgwOTRVLAkvLyA8MiwzLDMsNj46IENvc3QgMyB2bXJnbHcgTEhTLCA8dSw1LDMsNj4KKyAgMTIxMzQ0MTk3OFUsCS8vIDwyLDMsMyw3PjogQ29zdCAyIHZtcmdsdyBMSFMsIDwyLDYsMyw3PgorICAxMjA4Nzk2NzkxVSwJLy8gPDIsMywzLHU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDIsMiwzLHU+CisgIDE1NTEwNTY5OThVLAkvLyA8MiwzLDQsMD46IENvc3QgMiB2c2xkb2k0IDwxLDIsMyw0PiwgTEhTCisgIDE1NTEwNTc4MThVLAkvLyA8MiwzLDQsMT46IENvc3QgMiB2c2xkb2k0IDwxLDIsMyw0PiwgPDEsMiwzLDQ+CisgIDI2MjQ4MDAzNjBVLAkvLyA8MiwzLDQsMj46IENvc3QgMyB2c2xkb2k0IDwxLDIsMyw0PiwgPDIsMiwyLDI+CisgIDI2MjQ4MDA5MThVLAkvLyA8MiwzLDQsMz46IENvc3QgMyB2c2xkb2k0IDwxLDIsMyw0PiwgPDMsMCwxLDI+CisgIDE1NTEwNjAyNzhVLAkvLyA8MiwzLDQsND46IENvc3QgMiB2c2xkb2k0IDwxLDIsMyw0PiwgUkhTCisgIDUzNzcwOTg3OFUsCS8vIDwyLDMsNCw1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBSSFMKKyAgMjczMjk2OTMzN1UsCS8vIDwyLDMsNCw2PjogQ29zdCAzIHZzbGRvaTggTEhTLCA8NCw2LDUsMj4KKyAgMjY2MDYzNTgyNFUsCS8vIDwyLDMsNCw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMiwzLDQ+LCA8NywyLDMsND4KKyAgNTM3NzEwMTIxVSwJLy8gPDIsMyw0LHU+OiBDb3N0IDEgdnNsZG9pOCBMSFMsIFJIUworICAyNjg5ODM4NjY0VSwJLy8gPDIsMyw1LDA+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDw1LDAsMSwyPgorICAyNzMyOTY5NjE1VSwJLy8gPDIsMyw1LDE+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDw1LDEsMCwxPgorICAyNzMyOTY5NzA3VSwJLy8gPDIsMyw1LDI+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDw1LDIsMSwzPgorICAzNzYzNTgwNzIxVSwJLy8gPDIsMyw1LDM+OiBDb3N0IDQgdnNsZG9pOCBMSFMsIDw1LDMsMCwxPgorICAyNjg5ODM5MDI4VSwJLy8gPDIsMyw1LDQ+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDw1LDQsNSw2PgorICAxNjU5MjI4MTY0VSwJLy8gPDIsMyw1LDU+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDw1LDUsNSw1PgorICAxNjU5MjI4MjU4VSwJLy8gPDIsMyw1LDY+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDw1LDYsNywwPgorICAzMzY0MjU5NzcwVSwJLy8gPDIsMyw1LDc+OiBDb3N0IDQgdm1yZ2x3IDwxLDQsMiw1PiwgPDIsNiwzLDc+CisgIDE2NTkyMjg0MjBVLAkvLyA8MiwzLDUsdT46IENvc3QgMiB2c2xkb2k4IExIUywgPDUsdSw3LDA+CisgIDIyMzA3OTg0ODZVLAkvLyA8MiwzLDYsMD46IENvc3QgMyB2bXJnaHcgPDIsNiwzLDc+LCA8MywwLDEsMj4KKyAgMjczMjk3MDQwN1UsCS8vIDwyLDMsNiwxPjogQ29zdCAzIHZzbGRvaTggTEhTLCA8NiwxLDcsMT4KKyAgMTY1OTIyODY2NlUsCS8vIDwyLDMsNiwyPjogQ29zdCAyIHZzbGRvaTggTEhTLCA8NiwyLDcsMz4KKyAgMjIzMDc5ODc0OFUsCS8vIDwyLDMsNiwzPjogQ29zdCAzIHZtcmdodyA8Miw2LDMsNz4sIDwzLDMsMywzPgorICAyMjMwNzk4ODUwVSwJLy8gPDIsMyw2LDQ+OiBDb3N0IDMgdm1yZ2h3IDwyLDYsMyw3PiwgPDMsNCw1LDY+CisgIDI3MzI5NzA3MzFVLAkvLyA8MiwzLDYsNT46IENvc3QgMyB2c2xkb2k4IExIUywgPDYsNSw3LDE+CisgIDE2NTkyMjg5ODRVLAkvLyA8MiwzLDYsNj46IENvc3QgMiB2c2xkb2k4IExIUywgPDYsNiw2LDY+CisgIDE2NTkyMjkwMDZVLAkvLyA8MiwzLDYsNz46IENvc3QgMiB2c2xkb2k4IExIUywgPDYsNywwLDE+CisgIDE2NTkyMjkwODdVLAkvLyA8MiwzLDYsdT46IENvc3QgMiB2c2xkb2k4IExIUywgPDYsdSwwLDE+CisgIDE2NTkyMjkxNzhVLAkvLyA8MiwzLDcsMD46IENvc3QgMiB2c2xkb2k4IExIUywgPDcsMCwxLDI+CisgIDI3MjY5OTkxMjVVLAkvLyA8MiwzLDcsMT46IENvc3QgMyB2c2xkb2k4IDw3LDEsMiwzPiwgPDcsMSwyLDM+CisgIDI3Mjc2NjI3NThVLAkvLyA8MiwzLDcsMj46IENvc3QgMyB2c2xkb2k4IDw3LDIsMiwzPiwgPDcsMiwyLDM+CisgIDI3MzI5NzEyMzVVLAkvLyA8MiwzLDcsMz46IENvc3QgMyB2c2xkb2k4IExIUywgPDcsMywwLDE+CisgIDE2NTkyMjk1NDJVLAkvLyA8MiwzLDcsND46IENvc3QgMiB2c2xkb2k4IExIUywgPDcsNCw1LDY+CisgIDI3MzI5NzE0NDZVLAkvLyA8MiwzLDcsNT46IENvc3QgMyB2c2xkb2k4IExIUywgPDcsNSw1LDU+CisgIDI3MzI5NzE0ODRVLAkvLyA8MiwzLDcsNj46IENvc3QgMyB2c2xkb2k4IExIUywgPDcsNiwwLDc+CisgIDE2NTkyMjk4MDRVLAkvLyA8MiwzLDcsNz46IENvc3QgMiB2c2xkb2k4IExIUywgPDcsNyw3LDc+CisgIDE2NTkyMjk4MjZVLAkvLyA8MiwzLDcsdT46IENvc3QgMiB2c2xkb2k4IExIUywgPDcsdSwxLDI+CisgIDEyMDg4MzcwMTRVLAkvLyA8MiwzLHUsMD46IENvc3QgMiB2bXJnbHcgTEhTLCA8MSwyLDMsMD4KKyAgNTM3NzEyNDMwVSwJLy8gPDIsMyx1LDE+OiBDb3N0IDEgdnNsZG9pOCBMSFMsIExIUworICAxNjE2MDk5MjA1VSwJLy8gPDIsMyx1LDI+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDx1LDIsMywwPgorICAxMjA4ODM3NzQ2VSwJLy8gPDIsMyx1LDM+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDIsMiwzLDM+CisgIDEyMDg4MzcwMThVLAkvLyA8MiwzLHUsND46IENvc3QgMiB2bXJnbHcgTEhTLCA8MSwyLDMsND4KKyAgNTM3NzEyNzk0VSwJLy8gPDIsMyx1LDU+OiBDb3N0IDEgdnNsZG9pOCBMSFMsIFJIUworICAxNjE2MDk5NTM2VSwJLy8gPDIsMyx1LDY+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDx1LDYsMyw3PgorICAxMjA4ODM4MDc0VSwJLy8gPDIsMyx1LDc+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDIsNiwzLDc+CisgIDUzNzcxMjk5N1UsCS8vIDwyLDMsdSx1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBMSFMKKyAgMzc3MTU0NzY0OFUsCS8vIDwyLDQsMCwwPjogQ29zdCA0IHZzbGRvaTggPDIsMiwyLDQ+LCA8MCwwLDAsMD4KKyAgMjY5NzgwNTkyNlUsCS8vIDwyLDQsMCwxPjogQ29zdCAzIHZzbGRvaTggPDIsMiwyLDQ+LCBMSFMKKyAgMzc3MDg4NDI2OVUsCS8vIDwyLDQsMCwyPjogQ29zdCA0IHZzbGRvaTggPDIsMSwyLDQ+LCA8MCwyLDEsMj4KKyAgMzgwNjcxNjE2NFUsCS8vIDwyLDQsMCwzPjogQ29zdCA0IHZzbGRvaTggPHUsMSwyLDQ+LCA8MCwzLDEsdT4KKyAgMzc3MTU0Nzk4NlUsCS8vIDwyLDQsMCw0PjogQ29zdCA0IHZzbGRvaTggPDIsMiwyLDQ+LCA8MCw0LDEsNT4KKyAgMjIyNjc2MTAxNFUsCS8vIDwyLDQsMCw1PjogQ29zdCAzIHZtcmdodyA8MiwwLDMsMD4sIFJIUworICAzODUzNDYyNDI3VSwJLy8gPDIsNCwwLDY+OiBDb3N0IDQgdnNsZG9pMTIgPDQsNiw1LDI+LCA8NCwwLDYsMT4KKyAgMzg2NzEwMjExNlUsCS8vIDwyLDQsMCw3PjogQ29zdCA0IHZzbGRvaTEyIDw3LDAsMSwyPiwgPDQsMCw3LDE+CisgIDIyMjY3NjEyNTdVLAkvLyA8Miw0LDAsdT46IENvc3QgMyB2bXJnaHcgPDIsMCwzLDA+LCBSSFMKKyAgMzg0OTE4NjIzMVUsCS8vIDwyLDQsMSwwPjogQ29zdCA0IHZzbGRvaTEyIDw0LDAsMSwyPiwgPDQsMSwwLDI+CisgIDMzMDEyMDcwMTBVLAkvLyA8Miw0LDEsMT46IENvc3QgNCB2bXJnaHcgPDIsMSwzLDU+LCA8NCwxLDUsMD4KKyAgMzc2NjI0MDE1MFUsCS8vIDwyLDQsMSwyPjogQ29zdCA0IHZzbGRvaTggPDEsMywyLDQ+LCA8MSwyLDMsMD4KKyAgMzc2NjI0MDIyNlUsCS8vIDwyLDQsMSwzPjogQ29zdCA0IHZzbGRvaTggPDEsMywyLDQ+LCA8MSwzLDIsND4KKyAgMzMwMTIwNzI0OFUsCS8vIDwyLDQsMSw0PjogQ29zdCA0IHZtcmdodyA8MiwxLDMsNT4sIDw0LDQsNCw0PgorICAyMjI3NDMyNzU4VSwJLy8gPDIsNCwxLDU+OiBDb3N0IDMgdm1yZ2h3IDwyLDEsMywxPiwgUkhTCisgIDM3NTg5NDE0MDBVLAkvLyA8Miw0LDEsNj46IENvc3QgNCB2c2xkb2k4IDwwLDEsMiw0PiwgPDEsNiwyLDc+CisgIDM3Njg4OTQ3NThVLAkvLyA8Miw0LDEsNz46IENvc3QgNCB2c2xkb2k4IDwxLDcsMiw0PiwgPDEsNywyLDQ+CisgIDIyMjc0MzMwMDFVLAkvLyA8Miw0LDEsdT46IENvc3QgMyB2bXJnaHcgPDIsMSwzLDE+LCBSSFMKKyAgMjIyODAzMDM1NFUsCS8vIDwyLDQsMiwwPjogQ29zdCAzIHZtcmdodyA8MiwyLDIsMj4sIDw0LDAsNSwxPgorICAzNzcwODg1NjU3VSwJLy8gPDIsNCwyLDE+OiBDb3N0IDQgdnNsZG9pOCA8MiwxLDIsND4sIDwyLDEsMiw0PgorICAyNjk3ODA3NDY2VSwJLy8gPDIsNCwyLDI+OiBDb3N0IDMgdnNsZG9pOCA8MiwyLDIsND4sIDwyLDIsMiw0PgorICAzMzY4ODgwNDY4VSwJLy8gPDIsNCwyLDM+OiBDb3N0IDQgdm1yZ2x3IDwyLDIsMiwyPiwgPDMsMiw0LDM+CisgIDIyMjgwMzA2NzJVLAkvLyA8Miw0LDIsND46IENvc3QgMyB2bXJnaHcgPDIsMiwyLDI+LCA8NCw0LDQsND4KKyAgMTE1NDI4ODk1MFUsCS8vIDwyLDQsMiw1PjogQ29zdCAyIHZtcmdodyA8MiwyLDIsMj4sIFJIUworICAzNzcxNTQ5NjE3VSwJLy8gPDIsNCwyLDY+OiBDb3N0IDQgdnNsZG9pOCA8MiwyLDIsND4sIDwyLDYsMiw3PgorICAzMzY4ODgwNzk2VSwJLy8gPDIsNCwyLDc+OiBDb3N0IDQgdm1yZ2x3IDwyLDIsMiwyPiwgPDMsNiw0LDc+CisgIDExNTQyODkxOTNVLAkvLyA8Miw0LDIsdT46IENvc3QgMiB2bXJnaHcgPDIsMiwyLDI+LCBSSFMKKyAgMjYzNjgwODI5NFUsCS8vIDwyLDQsMywwPjogQ29zdCAzIHZzbGRvaTQgPDMsMiw0LDM+LCBMSFMKKyAgMjI4NzE4MTg2MVUsCS8vIDwyLDQsMywxPjogQ29zdCAzIHZtcmdsdyBMSFMsIDwwLDAsNCwxPgorICAyMjI4ODY2MTAyVSwJLy8gPDIsNCwzLDI+OiBDb3N0IDMgdm1yZ2h3IDwyLDMsNCw1PiwgPDQsMiw1LDM+CisgIDI2MzY4MTA1ODBVLAkvLyA8Miw0LDMsMz46IENvc3QgMyB2c2xkb2k0IDwzLDIsNCwzPiwgPDMsMiw0LDM+CisgIDEyNTY1NzQxNjBVLAkvLyA8Miw0LDMsND46IENvc3QgMiB2bXJnbHcgTEhTLCA8NCw0LDQsND4KKyAgMTIxMzQ0MTc0MlUsCS8vIDwyLDQsMyw1PjogQ29zdCAyIHZtcmdsdyBMSFMsIDwyLDMsNCw1PgorICAyMjI4ODY2NDMwVSwJLy8gPDIsNCwzLDY+OiBDb3N0IDMgdm1yZ2h3IDwyLDMsNCw1PiwgPDQsNiw1LDc+CisgIDI2NjA3MDEzNjhVLAkvLyA8Miw0LDMsNz46IENvc3QgMyB2c2xkb2k0IDw3LDIsNCwzPiwgPDcsMiw0LDM+CisgIDEyMTM0NDE3NDVVLAkvLyA8Miw0LDMsdT46IENvc3QgMiB2bXJnbHcgTEhTLCA8MiwzLDQsdT4KKyAgMzcwNDU4NjM0MlUsCS8vIDwyLDQsNCwwPjogQ29zdCA0IHZzbGRvaTQgPDIsMiw0LDQ+LCBMSFMKKyAgMzc4MjgzMTA1MVUsCS8vIDwyLDQsNCwxPjogQ29zdCA0IHZzbGRvaTggPDQsMSwyLDQ+LCA8NCwxLDIsND4KKyAgMzcwNDU4NzkwMFUsCS8vIDwyLDQsNCwyPjogQ29zdCA0IHZzbGRvaTQgPDIsMiw0LDQ+LCA8MiwyLDQsND4KKyAgMzM2ODg5NjEyM1UsCS8vIDwyLDQsNCwzPjogQ29zdCA0IHZtcmdsdyA8MiwyLDIsND4sIDwyLDIsNCwzPgorICAyNzkzMzYwNTkyVSwJLy8gPDIsNCw0LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDcsMCwxLDI+LCA8NCw0LDQsND4KKyAgMjY5NzgwOTIwNlUsCS8vIDwyLDQsNCw1PjogQ29zdCAzIHZzbGRvaTggPDIsMiwyLDQ+LCBSSFMKKyAgMzMwMzE5ODA3OFUsCS8vIDwyLDQsNCw2PjogQ29zdCA0IHZtcmdodyA8Miw0LDMsNT4sIDw0LDYsNSw3PgorICAzODY3MTAyNDQ0VSwJLy8gPDIsNCw0LDc+OiBDb3N0IDQgdnNsZG9pMTIgPDcsMCwxLDI+LCA8NCw0LDcsNT4KKyAgMjY5NzgwOTQ0OVUsCS8vIDwyLDQsNCx1PjogQ29zdCAzIHZzbGRvaTggPDIsMiwyLDQ+LCBSSFMKKyAgMjYzMDg1MjcxMFUsCS8vIDwyLDQsNSwwPjogQ29zdCAzIHZzbGRvaTQgPDIsMiw0LDU+LCBMSFMKKyAgMjYyNDg4MTU3MlUsCS8vIDwyLDQsNSwxPjogQ29zdCAzIHZzbGRvaTQgPDEsMiw0LDU+LCA8MSwyLDQsNT4KKyAgMjYzMDg1NDI2OVUsCS8vIDwyLDQsNSwyPjogQ29zdCAzIHZzbGRvaTQgPDIsMiw0LDU+LCA8MiwyLDQsNT4KKyAgMjY2NjY4NjY3N1UsCS8vIDwyLDQsNSwzPjogQ29zdCAzIHZzbGRvaTQgPHUsMiw0LDU+LCA8MywwLHUsMj4KKyAgMjYzMDg1NTk5MFUsCS8vIDwyLDQsNSw0PjogQ29zdCAzIHZzbGRvaTQgPDIsMiw0LDU+LCBSSFMKKyAgMjIzMDEyNzkyNlUsCS8vIDwyLDQsNSw1PjogQ29zdCAzIHZtcmdodyA8Miw1LDMsNj4sIFJIUworICAxNjkxMTU5ODYyVSwJLy8gPDIsNCw1LDY+OiBDb3N0IDIgdnNsZG9pMTIgPDIsMiwyLDI+LCBSSFMKKyAgMzg2NzEwMjUyMFUsCS8vIDwyLDQsNSw3PjogQ29zdCA0IHZzbGRvaTEyIDw3LDAsMSwyPiwgPDQsNSw3LDA+CisgIDE2OTExNTk4ODBVLAkvLyA8Miw0LDUsdT46IENvc3QgMiB2c2xkb2kxMiA8MiwyLDIsMj4sIFJIUworICAyMjMwNzk5MjUwVSwJLy8gPDIsNCw2LDA+OiBDb3N0IDMgdm1yZ2h3IDwyLDYsMyw3PiwgPDQsMCw1LDE+CisgIDMzMDQ1NDExMzBVLAkvLyA8Miw0LDYsMT46IENvc3QgNCB2bXJnaHcgPDIsNiwzLDc+LCA8NCwxLDIsMz4KKyAgMjIzMDc5OTQxN1UsCS8vIDwyLDQsNiwyPjogQ29zdCAzIHZtcmdodyA8Miw2LDMsNz4sIDw0LDIsNSw2PgorICAzMzA0NTQxMzIzVSwJLy8gPDIsNCw2LDM+OiBDb3N0IDQgdm1yZ2h3IDwyLDYsMyw3PiwgPDQsMyw1LDc+CisgIDIyMzA3OTk1NjhVLAkvLyA8Miw0LDYsND46IENvc3QgMyB2bXJnaHcgPDIsNiwzLDc+LCA8NCw0LDQsND4KKyAgMTE1NzA1Nzg0NlUsCS8vIDwyLDQsNiw1PjogQ29zdCAyIHZtcmdodyA8Miw2LDMsNz4sIFJIUworICAzMzA0NTQxNTY2VSwJLy8gPDIsNCw2LDY+OiBDb3N0IDQgdm1yZ2h3IDwyLDYsMyw3PiwgPDQsNiw1LDc+CisgIDM3OTg3NTgyNDNVLAkvLyA8Miw0LDYsNz46IENvc3QgNCB2c2xkb2k4IDw2LDcsMiw0PiwgPDYsNywyLDQ+CisgIDExNTcwNTgwODlVLAkvLyA8Miw0LDYsdT46IENvc3QgMiB2bXJnaHcgPDIsNiwzLDc+LCBSSFMKKyAgMzgwNjcyMTAxOFUsCS8vIDwyLDQsNywwPjogQ29zdCA0IHZzbGRvaTggPHUsMSwyLDQ+LCA8NywwLDEsMj4KKyAgMzg1MzgzMTU5MFUsCS8vIDwyLDQsNywxPjogQ29zdCA0IHZzbGRvaTEyIDw0LDcsMSwyPiwgPDQsNywxLDI+CisgIDM4MDE0MTI3NzVVLAkvLyA8Miw0LDcsMj46IENvc3QgNCB2c2xkb2k4IDw3LDIsMiw0PiwgPDcsMiwyLDQ+CisgIDM4MDIwNzY0MDhVLAkvLyA8Miw0LDcsMz46IENvc3QgNCB2c2xkb2k4IDw3LDMsMiw0PiwgPDcsMywyLDQ+CisgIDM0MDE0MzYzNjhVLAkvLyA8Miw0LDcsND46IENvc3QgNCB2bXJnbHcgPDcsNiwyLDc+LCA8NCw0LDQsND4KKyAgMjc5MzM2MDg0MFUsCS8vIDwyLDQsNyw1PjogQ29zdCAzIHZzbGRvaTEyIDw3LDAsMSwyPiwgPDQsNyw1LDA+CisgIDM4MDQwNjczMDdVLAkvLyA8Miw0LDcsNj46IENvc3QgNCB2c2xkb2k4IDw3LDYsMiw0PiwgPDcsNiwyLDQ+CisgIDM4NjcxMDI2ODJVLAkvLyA8Miw0LDcsNz46IENvc3QgNCB2c2xkb2kxMiA8NywwLDEsMj4sIDw0LDcsNywwPgorICAyNzkzMzYwODY3VSwJLy8gPDIsNCw3LHU+OiBDb3N0IDMgdnNsZG9pMTIgPDcsMCwxLDI+LCA8NCw3LHUsMD4KKyAgMjYzMDg3NzI4NlUsCS8vIDwyLDQsdSwwPjogQ29zdCAzIHZzbGRvaTQgPDIsMiw0LHU+LCBMSFMKKyAgMjI4MjU4MDE0NFUsCS8vIDwyLDQsdSwxPjogQ29zdCAzIHZtcmdsdyBMSFMsIDwzLDAsNCwxPgorICAyNjMwODc4ODQ4VSwJLy8gPDIsNCx1LDI+OiBDb3N0IDMgdnNsZG9pNCA8MiwyLDQsdT4sIDwyLDIsNCx1PgorICAyNjM2ODUxNTQ1VSwJLy8gPDIsNCx1LDM+OiBDb3N0IDMgdnNsZG9pNCA8MywyLDQsdT4sIDwzLDIsNCx1PgorICAxMjU2NjE1MTIwVSwJLy8gPDIsNCx1LDQ+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDQsNCw0LDQ+CisgIDEyMDg4Mzc4MzhVLAkvLyA8Miw0LHUsNT46IENvc3QgMiB2bXJnbHcgTEhTLCA8MiwzLDQsNT4KKyAgMTY5MTE2MDEwNVUsCS8vIDwyLDQsdSw2PjogQ29zdCAyIHZzbGRvaTEyIDwyLDIsMiwyPiwgUkhTCisgIDI2NjA3NDIzMzNVLAkvLyA8Miw0LHUsNz46IENvc3QgMyB2c2xkb2k0IDw3LDIsNCx1PiwgPDcsMiw0LHU+CisgIDEyMDg4Mzc4NDFVLAkvLyA8Miw0LHUsdT46IENvc3QgMiB2bXJnbHcgTEhTLCA8MiwzLDQsdT4KKyAgMzc2NjkxMDk3NlUsCS8vIDwyLDUsMCwwPjogQ29zdCA0IHZzbGRvaTggPDEsNCwyLDU+LCA8MCwwLDAsMD4KKyAgMjY5MzE2OTI1NFUsCS8vIDwyLDUsMCwxPjogQ29zdCAzIHZzbGRvaTggPDEsNCwyLDU+LCBMSFMKKyAgMzc2MDkzOTE4MVUsCS8vIDwyLDUsMCwyPjogQ29zdCA0IHZzbGRvaTggPDAsNCwyLDU+LCA8MCwyLDEsMj4KKyAgMzg0MzIxNDkzNlUsCS8vIDwyLDUsMCwzPjogQ29zdCA0IHZzbGRvaTEyIDwzLDAsMSwyPiwgPDUsMCwzLDA+CisgIDM3NjA5MzkzNTVVLAkvLyA8Miw1LDAsND46IENvc3QgNCB2c2xkb2k4IDwwLDQsMiw1PiwgPDAsNCwyLDU+CisgIDM4NjcxMDI4MjdVLAkvLyA8Miw1LDAsNT46IENvc3QgNCB2c2xkb2kxMiA8NywwLDEsMj4sIDw1LDAsNSwxPgorICAzODY3MTAyODM2VSwJLy8gPDIsNSwwLDY+OiBDb3N0IDQgdnNsZG9pMTIgPDcsMCwxLDI+LCA8NSwwLDYsMT4KKyAgMzg2NzEwMjg0NFUsCS8vIDwyLDUsMCw3PjogQ29zdCA0IHZzbGRvaTEyIDw3LDAsMSwyPiwgPDUsMCw3LDA+CisgIDI2OTMxNjk4MjFVLAkvLyA8Miw1LDAsdT46IENvc3QgMyB2c2xkb2k4IDwxLDQsMiw1PiwgTEhTCisgIDM3NjY5MTE3MjRVLAkvLyA8Miw1LDEsMD46IENvc3QgNCB2c2xkb2k4IDwxLDQsMiw1PiwgPDEsMCwyLDE+CisgIDM3NjY5MTE3OTZVLAkvLyA8Miw1LDEsMT46IENvc3QgNCB2c2xkb2k4IDwxLDQsMiw1PiwgPDEsMSwxLDE+CisgIDI2OTMxNzAwNzBVLAkvLyA8Miw1LDEsMj46IENvc3QgMyB2c2xkb2k4IDwxLDQsMiw1PiwgPDEsMiwzLDA+CisgIDMzODQ3OTgyNjJVLAkvLyA8Miw1LDEsMz46IENvc3QgNCB2bXJnbHcgPDQsdSwyLDE+LCA8NCwyLDUsMz4KKyAgMjY5MzE3MDIyOFUsCS8vIDwyLDUsMSw0PjogQ29zdCAzIHZzbGRvaTggPDEsNCwyLDU+LCA8MSw0LDIsNT4KKyAgMzMwMTIwODA2OFUsCS8vIDwyLDUsMSw1PjogQ29zdCA0IHZtcmdodyA8MiwxLDMsNT4sIDw1LDUsNSw1PgorICAzMzY2ODc5NjA3VSwJLy8gPDIsNSwxLDY+OiBDb3N0IDQgdm1yZ2x3IDwxLHUsMiwxPiwgPDAsNCw1LDY+CisgIDM4NjcxMDI5MjVVLAkvLyA8Miw1LDEsNz46IENvc3QgNCB2c2xkb2kxMiA8NywwLDEsMj4sIDw1LDEsNywwPgorICAyNjk1ODI0NzYwVSwJLy8gPDIsNSwxLHU+OiBDb3N0IDMgdnNsZG9pOCA8MSx1LDIsNT4sIDwxLHUsMiw1PgorICAyNjQyODQ1Nzk4VSwJLy8gPDIsNSwyLDA+OiBDb3N0IDMgdnNsZG9pNCA8NCwyLDUsMj4sIExIUworICAyMjk1MTM5MjE4VSwJLy8gPDIsNSwyLDE+OiBDb3N0IDMgdm1yZ2x3IDwyLDIsMiwyPiwgPDQsMCw1LDE+CisgIDI2OTkxNDI3NjBVLAkvLyA8Miw1LDIsMj46IENvc3QgMyB2c2xkb2k4IDwyLDQsMiw1PiwgPDIsMiwyLDI+CisgIDM3NjY5MTI2NzhVLAkvLyA8Miw1LDIsMz46IENvc3QgNCB2c2xkb2k4IDwxLDQsMiw1PiwgPDIsMywwLDE+CisgIDI2OTkxNDI5MjVVLAkvLyA8Miw1LDIsND46IENvc3QgMyB2c2xkb2k4IDwyLDQsMiw1PiwgPDIsNCwyLDU+CisgIDIyMjgwMzE0OTJVLAkvLyA8Miw1LDIsNT46IENvc3QgMyB2bXJnaHcgPDIsMiwyLDI+LCA8NSw1LDUsNT4KKyAgMjI5NTEzODgxOFUsCS8vIDwyLDUsMiw2PjogQ29zdCAzIHZtcmdsdyA8MiwyLDIsMj4sIDwzLDQsNSw2PgorICAzMzY4ODc5MzQ3VSwJLy8gPDIsNSwyLDc+OiBDb3N0IDQgdm1yZ2x3IDwyLDIsMiwyPiwgPDEsNiw1LDc+CisgIDIyOTUxMzg4MjBVLAkvLyA8Miw1LDIsdT46IENvc3QgMyB2bXJnbHcgPDIsMiwyLDI+LCA8Myw0LDUsdT4KKyAgMjI4NzE4NDg2NlUsCS8vIDwyLDUsMywwPjogQ29zdCAzIHZtcmdsdyBMSFMsIDw0LDEsNSwwPgorICAxMjU2NTczODQyVSwJLy8gPDIsNSwzLDE+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDQsMCw1LDE+CisgIDI2NDI4NTU2MzBVLAkvLyA8Miw1LDMsMj46IENvc3QgMyB2c2xkb2k0IDw0LDIsNSwzPiwgPDIsMyw0LDU+CisgIDIyODcxODI3NjNVLAkvLyA8Miw1LDMsMz46IENvc3QgMyB2bXJnbHcgTEhTLCA8MSwyLDUsMz4KKyAgMjI4NzE4NDg3MFUsCS8vIDwyLDUsMyw0PjogQ29zdCAzIHZtcmdsdyBMSFMsIDw0LDEsNSw0PgorICAxMjU2NTc0MTcwVSwJLy8gPDIsNSwzLDU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDQsNCw1LDU+CisgIDEyMTM0NDI1NjJVLAkvLyA8Miw1LDMsNj46IENvc3QgMiB2bXJnbHcgTEhTLCA8Myw0LDUsNj4KKyAgMjI4NzE4MzA5MVUsCS8vIDwyLDUsMyw3PjogQ29zdCAzIHZtcmdsdyBMSFMsIDwxLDYsNSw3PgorICAxMjEzNDQyNTY0VSwJLy8gPDIsNSwzLHU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDMsNCw1LHU+CisgIDM3MTY2MDQwMDZVLAkvLyA8Miw1LDQsMD46IENvc3QgNCB2c2xkb2k0IDw0LDIsNSw0PiwgTEhTCisgIDM3MTY2MDQ4MjJVLAkvLyA8Miw1LDQsMT46IENvc3QgNCB2c2xkb2k0IDw0LDIsNSw0PiwgPDEsMiwzLDA+CisgIDM3NjY5MTQwOTlVLAkvLyA8Miw1LDQsMj46IENvc3QgNCB2c2xkb2k4IDwxLDQsMiw1PiwgPDQsMiw1LDA+CisgIDMzNjg4OTU0MDNVLAkvLyA8Miw1LDQsMz46IENvc3QgNSB2bXJnbHcgPDIsMiwyLDQ+LCA8MSwyLDUsMz4KKyAgMzcxNjYwNzAzMVUsCS8vIDwyLDUsNCw0PjogQ29zdCA0IHZzbGRvaTQgPDQsMiw1LDQ+LCA8NCwyLDUsND4KKyAgMjY5MzE3MjUzNFUsCS8vIDwyLDUsNCw1PjogQ29zdCAzIHZzbGRvaTggPDEsNCwyLDU+LCBSSFMKKyAgMzM2MzU4ODYxMFUsCS8vIDwyLDUsNCw2PjogQ29zdCA0IHZtcmdsdyA8MSwzLDIsND4sIDwzLDQsNSw2PgorICAzMzY4ODk1NzMxVSwJLy8gPDIsNSw0LDc+OiBDb3N0IDUgdm1yZ2x3IDwyLDIsMiw0PiwgPDEsNiw1LDc+CisgIDI2OTMxNzI3NzdVLAkvLyA8Miw1LDQsdT46IENvc3QgMyB2c2xkb2k4IDwxLDQsMiw1PiwgUkhTCisgIDM3MDQ2NjgyNjJVLAkvLyA8Miw1LDUsMD46IENvc3QgNCB2c2xkb2k0IDwyLDIsNSw1PiwgTEhTCisgIDM3MDQ2NjkwNzhVLAkvLyA8Miw1LDUsMT46IENvc3QgNCB2c2xkb2k0IDwyLDIsNSw1PiwgPDEsMiwzLDA+CisgIDM3MDQ2Njk4MzBVLAkvLyA8Miw1LDUsMj46IENvc3QgNCB2c2xkb2k0IDwyLDIsNSw1PiwgPDIsMiw1LDU+CisgIDMzNjQyNTk0NjBVLAkvLyA8Miw1LDUsMz46IENvc3QgNCB2bXJnbHcgPDEsNCwyLDU+LCA8MiwyLDUsMz4KKyAgMzcwNDY3MTU0MlUsCS8vIDwyLDUsNSw0PjogQ29zdCA0IHZzbGRvaTQgPDIsMiw1LDU+LCBSSFMKKyAgMjc5MzM2MTQxMlUsCS8vIDwyLDUsNSw1PjogQ29zdCAzIHZzbGRvaTEyIDw3LDAsMSwyPiwgPDUsNSw1LDU+CisgIDMzNjQyNTgxNjdVLAkvLyA8Miw1LDUsNj46IENvc3QgNCB2bXJnbHcgPDEsNCwyLDU+LCA8MCw0LDUsNj4KKyAgMzg2NzEwMzI0OVUsCS8vIDwyLDUsNSw3PjogQ29zdCA0IHZzbGRvaTEyIDw3LDAsMSwyPiwgPDUsNSw3LDA+CisgIDI3OTMzNjE0MTJVLAkvLyA8Miw1LDUsdT46IENvc3QgMyB2c2xkb2kxMiA8NywwLDEsMj4sIDw1LDUsNSw1PgorICAyNjQyODc4NTY2VSwJLy8gPDIsNSw2LDA+OiBDb3N0IDMgdnNsZG9pNCA8NCwyLDUsNj4sIExIUworICAzMzg2MTY2ODEwVSwJLy8gPDIsNSw2LDE+OiBDb3N0IDQgdm1yZ2x3IDw1LDEsMiw2PiwgPDQsdSw1LDE+CisgIDI3MjMwMzM1OTRVLAkvLyA8Miw1LDYsMj46IENvc3QgMyB2c2xkb2k4IDw2LDQsMiw1PiwgPDYsMiw3LDM+CisgIDM4NDg1MjM4NDJVLAkvLyA8Miw1LDYsMz46IENvc3QgNCB2c2xkb2kxMiA8Myx1LDEsMj4sIDw1LDYsMyw0PgorICAyNzIzMDMzNzEzVSwJLy8gPDIsNSw2LDQ+OiBDb3N0IDMgdnNsZG9pOCA8Niw0LDIsNT4sIDw2LDQsMiw1PgorICAyMjMwODAwMzg4VSwJLy8gPDIsNSw2LDU+OiBDb3N0IDMgdm1yZ2h3IDwyLDYsMyw3PiwgPDUsNSw1LDU+CisgIDIyMzA4MDA0ODJVLAkvLyA8Miw1LDYsNj46IENvc3QgMyB2bXJnaHcgPDIsNiwzLDc+LCA8NSw2LDcsMD4KKyAgMjc4NTg0MTI1MlUsCS8vIDwyLDUsNiw3PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNywyPiwgPDUsNiw3LDI+CisgIDI3ODU5MTQ5ODlVLAkvLyA8Miw1LDYsdT46IENvc3QgMyB2c2xkb2kxMiA8NSw2LHUsMj4sIDw1LDYsdSwyPgorICAzNzk2Nzc1OTMwVSwJLy8gPDIsNSw3LDA+OiBDb3N0IDQgdnNsZG9pOCA8Niw0LDIsNT4sIDw3LDAsMSwyPgorICAzODAwNzU3MzM1VSwJLy8gPDIsNSw3LDE+OiBDb3N0IDQgdnNsZG9pOCA8NywxLDIsNT4sIDw3LDEsMiw1PgorICAzODUzNDYzNjg5VSwJLy8gPDIsNSw3LDI+OiBDb3N0IDQgdnNsZG9pMTIgPDQsNiw1LDI+LCA8NSw3LDIsMz4KKyAgMzc5Njc3NjIxOFUsCS8vIDwyLDUsNywzPjogQ29zdCA0IHZzbGRvaTggPDYsNCwyLDU+LCA8NywzLDYsMj4KKyAgMzc5Njc3NjI5NFUsCS8vIDwyLDUsNyw0PjogQ29zdCA0IHZzbGRvaTggPDYsNCwyLDU+LCA8Nyw0LDUsNj4KKyAgMzgwMzQxMTg2N1UsCS8vIDwyLDUsNyw1PjogQ29zdCA0IHZzbGRvaTggPDcsNSwyLDU+LCA8Nyw1LDIsNT4KKyAgMzM3MTU3NTA4MVUsCS8vIDwyLDUsNyw2PjogQ29zdCA0IHZtcmdsdyA8Miw2LDIsNz4sIDwyLDQsNSw2PgorICAzNzk2Nzc2NTE2VSwJLy8gPDIsNSw3LDc+OiBDb3N0IDQgdnNsZG9pOCA8Niw0LDIsNT4sIDw3LDcsMywzPgorICAzMzcxNTc1MDgzVSwJLy8gPDIsNSw3LHU+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMiw3PiwgPDIsNCw1LHU+CisgIDIyODcyMjU4MjZVLAkvLyA8Miw1LHUsMD46IENvc3QgMyB2bXJnbHcgTEhTLCA8NCwxLDUsMD4KKyAgMTI1NjYxNDgwMlUsCS8vIDwyLDUsdSwxPjogQ29zdCAyIHZtcmdsdyBMSFMsIDw0LDAsNSwxPgorICAyNjQyODk2NTkwVSwJLy8gPDIsNSx1LDI+OiBDb3N0IDMgdnNsZG9pNCA8NCwyLDUsdT4sIDwyLDMsNCw1PgorICAyMjg3MjIzNzIzVSwJLy8gPDIsNSx1LDM+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDEsMiw1LDM+CisgIDIyODcyMjU4MzBVLAkvLyA8Miw1LHUsND46IENvc3QgMyB2bXJnbHcgTEhTLCA8NCwxLDUsND4KKyAgMTI1NjYxNTEzMFUsCS8vIDwyLDUsdSw1PjogQ29zdCAyIHZtcmdsdyBMSFMsIDw0LDQsNSw1PgorICAxMjA4ODM4NjU4VSwJLy8gPDIsNSx1LDY+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDMsNCw1LDY+CisgIDIyODcyMjQwNTFVLAkvLyA8Miw1LHUsNz46IENvc3QgMyB2bXJnbHcgTEhTLCA8MSw2LDUsNz4KKyAgMTIwODgzODY2MFUsCS8vIDwyLDUsdSx1PjogQ29zdCAyIHZtcmdsdyBMSFMsIDwzLDQsNSx1PgorICAzNzcyMjI3NTg0VSwJLy8gPDIsNiwwLDA+OiBDb3N0IDQgdnNsZG9pOCA8MiwzLDIsNj4sIDwwLDAsMCwwPgorICAyNjk4NDg1ODYyVSwJLy8gPDIsNiwwLDE+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDIsNj4sIExIUworICAzNzU5NjIwMjgyVSwJLy8gPDIsNiwwLDI+OiBDb3N0IDQgdnNsZG9pOCA8MCwyLDIsNj4sIDwwLDIsMiw2PgorICAzNzEwNjc1Mjk5VSwJLy8gPDIsNiwwLDM+OiBDb3N0IDQgdnNsZG9pNCA8MywyLDYsMD4sIDwzLDIsNiwwPgorICAzNzY3NTgzMDU4VSwJLy8gPDIsNiwwLDQ+OiBDb3N0IDQgdnNsZG9pOCA8MSw1LDIsNj4sIDwwLDQsMSw1PgorICAzMzc4MTUzMjY1VSwJLy8gPDIsNiwwLDU+OiBDb3N0IDUgdm1yZ2x3IDwzLDcsMiwwPiwgPDIsNCw2LDU+CisgIDM4NjUxODY2MzdVLAkvLyA8Miw2LDAsNj46IENvc3QgNCB2c2xkb2kxMiA8Niw2LDIsMj4sIDw2LDAsNiwxPgorICAyMzMwMjkxNTEwVSwJLy8gPDIsNiwwLDc+OiBDb3N0IDMgdm1yZ2x3IDx1LDEsMiwwPiwgUkhTCisgIDI2OTg0ODY0MjlVLAkvLyA8Miw2LDAsdT46IENvc3QgMyB2c2xkb2k4IDwyLDMsMiw2PiwgTEhTCisgIDM3MzQ1NjkwNjJVLAkvLyA8Miw2LDEsMD46IENvc3QgNCB2c2xkb2k0IDw3LDIsNiwxPiwgTEhTCisgIDM3NjQ5MjkzNDZVLAkvLyA8Miw2LDEsMT46IENvc3QgNCB2c2xkb2k4IDwxLDEsMiw2PiwgPDEsMSwyLDY+CisgIDM3NzIyMjg1MDJVLAkvLyA8Miw2LDEsMj46IENvc3QgNCB2c2xkb2k4IDwyLDMsMiw2PiwgPDEsMiwzLDA+CisgIDM3MzQ1NzExNThVLAkvLyA8Miw2LDEsMz46IENvc3QgNCB2c2xkb2k0IDw3LDIsNiwxPiwgPDMsMCwxLDI+CisgIDM3MzQ1NzIzNDJVLAkvLyA8Miw2LDEsND46IENvc3QgNCB2c2xkb2k0IDw3LDIsNiwxPiwgUkhTCisgIDM3Njc1ODM4NzhVLAkvLyA8Miw2LDEsNT46IENvc3QgNCB2c2xkb2k4IDwxLDUsMiw2PiwgPDEsNSwyLDY+CisgIDM3NjgyNDc1MTFVLAkvLyA8Miw2LDEsNj46IENvc3QgNCB2c2xkb2k4IDwxLDYsMiw2PiwgPDEsNiwyLDY+CisgIDIyOTMxNDA3OTBVLAkvLyA8Miw2LDEsNz46IENvc3QgMyB2bXJnbHcgPDEsdSwyLDE+LCBSSFMKKyAgMjI5MzE0MDc5MVUsCS8vIDwyLDYsMSx1PjogQ29zdCAzIHZtcmdsdyA8MSx1LDIsMT4sIFJIUworICAzNzA0NzE3NDE0VSwJLy8gPDIsNiwyLDA+OiBDb3N0IDQgdnNsZG9pNCA8MiwyLDYsMj4sIExIUworICAzMzk1NDI0NTg5VSwJLy8gPDIsNiwyLDE+OiBDb3N0IDQgdm1yZ2x3IDw2LDYsMiwyPiwgPDYsMCw2LDE+CisgIDIyMjgwMzE5OTNVLAkvLyA8Miw2LDIsMj46IENvc3QgMyB2bXJnaHcgPDIsMiwyLDI+LCA8NiwyLDcsMj4KKyAgMjY5ODQ4NzQ4NVUsCS8vIDwyLDYsMiwzPjogQ29zdCAzIHZzbGRvaTggPDIsMywyLDY+LCA8MiwzLDIsNj4KKyAgMzcwNDcyMDY5NFUsCS8vIDwyLDYsMiw0PjogQ29zdCA0IHZzbGRvaTQgPDIsMiw2LDI+LCBSSFMKKyAgMzc3MzU1NjU3NVUsCS8vIDwyLDYsMiw1PjogQ29zdCA0IHZzbGRvaTggPDIsNSwyLDY+LCA8Miw1LDIsNj4KKyAgMjY5ODQ4NzczOFUsCS8vIDwyLDYsMiw2PjogQ29zdCAzIHZzbGRvaTggPDIsMywyLDY+LCA8Miw2LDMsNz4KKyAgMTIyMTM5NzgxNFUsCS8vIDwyLDYsMiw3PjogQ29zdCAyIHZtcmdsdyA8MiwyLDIsMj4sIFJIUworICAxMjIxMzk3ODE1VSwJLy8gPDIsNiwyLHU+OiBDb3N0IDIgdm1yZ2x3IDwyLDIsMiwyPiwgUkhTCisgIDI2MzY5NTU3NTBVLAkvLyA8Miw2LDMsMD46IENvc3QgMyB2c2xkb2k0IDwzLDIsNiwzPiwgTEhTCisgIDIzMzAzMTQyMTdVLAkvLyA8Miw2LDMsMT46IENvc3QgMyB2bXJnbHcgTEhTLCA8MiwwLDYsMT4KKyAgMjYzNjk1NzYyNlUsCS8vIDwyLDYsMywyPjogQ29zdCAzIHZzbGRvaTQgPDMsMiw2LDM+LCA8Miw2LDMsNz4KKyAgMjI4NzE4NDIzMFUsCS8vIDwyLDYsMywzPjogQ29zdCAzIHZtcmdsdyBMSFMsIDwzLDIsNiwzPgorICAyNjM2OTU5MDMwVSwJLy8gPDIsNiwzLDQ+OiBDb3N0IDMgdnNsZG9pNCA8MywyLDYsMz4sIFJIUworICAyNjQ4OTAzNDQ4VSwJLy8gPDIsNiwzLDU+OiBDb3N0IDMgdnNsZG9pNCA8NSwyLDYsMz4sIDw1LDIsNiwzPgorICAxMjU2NTc1ODAwVSwJLy8gPDIsNiwzLDY+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDYsNiw2LDY+CisgIDEzNTA1NjY5NFUsCS8vIDwyLDYsMyw3PjogQ29zdCAxIHZtcmdsdyBMSFMsIFJIUworICAxMzUwNTY2OTVVLAkvLyA8Miw2LDMsdT46IENvc3QgMSB2bXJnbHcgTEhTLCBSSFMKKyAgMzcxMDcwNTc2NlUsCS8vIDwyLDYsNCwwPjogQ29zdCA0IHZzbGRvaTQgPDMsMiw2LDQ+LCBMSFMKKyAgMzY5ODc2MjY3N1UsCS8vIDwyLDYsNCwxPjogQ29zdCA1IHZzbGRvaTQgPDEsMiw2LDQ+LCA8MSwyLDYsND4KKyAgMzcxMDcwNzM4OVUsCS8vIDwyLDYsNCwyPjogQ29zdCA0IHZzbGRvaTQgPDMsMiw2LDQ+LCA8MiwzLDIsNj4KKyAgMzcxMDcwODA3MVUsCS8vIDwyLDYsNCwzPjogQ29zdCA0IHZzbGRvaTQgPDMsMiw2LDQ+LCA8MywyLDYsND4KKyAgMzcxMDcwOTA0NlUsCS8vIDwyLDYsNCw0PjogQ29zdCA0IHZzbGRvaTQgPDMsMiw2LDQ+LCBSSFMKKyAgMjY5ODQ4OTE0MlUsCS8vIDwyLDYsNCw1PjogQ29zdCAzIHZzbGRvaTggPDIsMywyLDY+LCBSSFMKKyAgMzc5Njc4MjQ1N1UsCS8vIDwyLDYsNCw2PjogQ29zdCA0IHZzbGRvaTggPDYsNCwyLDY+LCA8NCw2LDUsMj4KKyAgMjI5NTE1NjAyMlUsCS8vIDwyLDYsNCw3PjogQ29zdCAzIHZtcmdsdyA8MiwyLDIsND4sIFJIUworICAyMjk1MTU2MDIzVSwJLy8gPDIsNiw0LHU+OiBDb3N0IDMgdm1yZ2x3IDwyLDIsMiw0PiwgUkhTCisgIDMzMDM4NzA3NTNVLAkvLyA8Miw2LDUsMD46IENvc3QgNCB2bXJnaHcgPDIsNSwzLDY+LCA8NiwwLDEsMj4KKyAgMzc4ODgyMDEzNFUsCS8vIDwyLDYsNSwxPjogQ29zdCA0IHZzbGRvaTggPDUsMSwyLDY+LCA8NSwxLDIsNj4KKyAgMzc3OTUzMDUyMFUsCS8vIDwyLDYsNSwyPjogQ29zdCA0IHZzbGRvaTggPDMsNSwyLDY+LCA8NSwyLDYsMz4KKyAgMzMwMzg3MTAyNlUsCS8vIDwyLDYsNSwzPjogQ29zdCA0IHZtcmdodyA8Miw1LDMsNj4sIDw2LDMsNCw1PgorICAzMzAzODcxMTE3VSwJLy8gPDIsNiw1LDQ+OiBDb3N0IDQgdm1yZ2h3IDwyLDUsMyw2PiwgPDYsNCw1LDY+CisgIDM3OTE0NzQ2NjZVLAkvLyA8Miw2LDUsNT46IENvc3QgNCB2c2xkb2k4IDw1LDUsMiw2PiwgPDUsNSwyLDY+CisgIDM3OTIxMzgyOTlVLAkvLyA8Miw2LDUsNj46IENvc3QgNCB2c2xkb2k4IDw1LDYsMiw2PiwgPDUsNiwyLDY+CisgIDIyOTA1MTkzNTBVLAkvLyA8Miw2LDUsNz46IENvc3QgMyB2bXJnbHcgPDEsNCwyLDU+LCBSSFMKKyAgMjI5MDUxOTM1MVUsCS8vIDwyLDYsNSx1PjogQ29zdCAzIHZtcmdsdyA8MSw0LDIsNT4sIFJIUworICAyNjMxMDA4MzU4VSwJLy8gPDIsNiw2LDA+OiBDb3N0IDMgdnNsZG9pNCA8MiwyLDYsNj4sIExIUworICAzMzcyODkzNjczVSwJLy8gPDIsNiw2LDE+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsMiw2PiwgPDIsMCw2LDE+CisgIDI3OTE0NDUyNjRVLAkvLyA8Miw2LDYsMj46IENvc3QgMyB2c2xkb2kxMiA8Niw2LDIsMj4sIDw2LDYsMiwyPgorICAyMjMwODAwOTY4VSwJLy8gPDIsNiw2LDM+OiBDb3N0IDMgdm1yZ2h3IDwyLDYsMyw3PiwgPDYsMyw3LDA+CisgIDI2MzEwMTE2MzhVLAkvLyA8Miw2LDYsND46IENvc3QgMyB2c2xkb2k0IDwyLDIsNiw2PiwgUkhTCisgIDMzNzI4OTQwMDFVLAkvLyA8Miw2LDYsNT46IENvc3QgNCB2bXJnbHcgPDIsdSwyLDY+LCA8Miw0LDYsNT4KKyAgMjc5MzM2MjIzMlUsCS8vIDwyLDYsNiw2PjogQ29zdCAzIHZzbGRvaTEyIDw3LDAsMSwyPiwgPDYsNiw2LDY+CisgIDIyOTU4MzU5NThVLAkvLyA8Miw2LDYsNz46IENvc3QgMyB2bXJnbHcgPDIsMywyLDY+LCBSSFMKKyAgMjI5NTgzNTk1OVUsCS8vIDwyLDYsNix1PjogQ29zdCAzIHZtcmdsdyA8MiwzLDIsNj4sIFJIUworICAyNzkzMzYyMjU0VSwJLy8gPDIsNiw3LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDcsMCwxLDI+LCA8Niw3LDAsMT4KKyAgMjc5MjAzNTE2MFUsCS8vIDwyLDYsNywxPjogQ29zdCAzIHZzbGRvaTEyIDw2LDcsMSwyPiwgPDYsNywxLDI+CisgIDI3OTIxMDg4OTdVLAkvLyA8Miw2LDcsMj46IENvc3QgMyB2c2xkb2kxMiA8Niw3LDIsMj4sIDw2LDcsMiwyPgorICAyNzY5NDc0NDA4VSwJLy8gPDIsNiw3LDM+OiBDb3N0IDMgdnNsZG9pMTIgPDMsMCwxLDI+LCA8Niw3LDMsMD4KKyAgMjc5MzM2MjI5NFUsCS8vIDwyLDYsNyw0PjogQ29zdCAzIHZzbGRvaTEyIDw3LDAsMSwyPiwgPDYsNyw0LDU+CisgIDMzNzE1NzUwODlVLAkvLyA8Miw2LDcsNT46IENvc3QgNCB2bXJnbHcgPDIsNiwyLDc+LCA8Miw0LDYsNT4KKyAgMjc5MjQwMzg0NVUsCS8vIDwyLDYsNyw2PjogQ29zdCAzIHZzbGRvaTEyIDw2LDcsNiwyPiwgPDYsNyw2LDI+CisgIDIyOTc4MzQ4MDZVLAkvLyA8Miw2LDcsNz46IENvc3QgMyB2bXJnbHcgPDIsNiwyLDc+LCBSSFMKKyAgMjI5NzgzNDgwN1UsCS8vIDwyLDYsNyx1PjogQ29zdCAzIHZtcmdsdyA8Miw2LDIsNz4sIFJIUworICAyNjM2OTk2NzEwVSwJLy8gPDIsNix1LDA+OiBDb3N0IDMgdnNsZG9pNCA8MywyLDYsdT4sIExIUworICAyNjk4NDkxNjk0VSwJLy8gPDIsNix1LDE+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDIsNj4sIExIUworICAyNjM2OTk4NjMxVSwJLy8gPDIsNix1LDI+OiBDb3N0IDMgdnNsZG9pNCA8MywyLDYsdT4sIDwyLDYsdSw3PgorICAyMjgyNTgwMzI2VSwJLy8gPDIsNix1LDM+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDMsMiw2LDM+CisgIDI2MzY5OTk5OTBVLAkvLyA8Miw2LHUsND46IENvc3QgMyB2c2xkb2k0IDwzLDIsNix1PiwgUkhTCisgIDI2OTg0OTIwNThVLAkvLyA8Miw2LHUsNT46IENvc3QgMyB2c2xkb2k4IDwyLDMsMiw2PiwgUkhTCisgIDEyNTY2MTY3NjBVLAkvLyA8Miw2LHUsNj46IENvc3QgMiB2bXJnbHcgTEhTLCA8Niw2LDYsNj4KKyAgMTM1MDk3NjU0VSwJLy8gPDIsNix1LDc+OiBDb3N0IDEgdm1yZ2x3IExIUywgUkhTCisgIDEzNTA5NzY1NVUsCS8vIDwyLDYsdSx1PjogQ29zdCAxIHZtcmdsdyBMSFMsIFJIUworICAyNjY2ODY0NzQyVSwJLy8gPDIsNywwLDA+OiBDb3N0IDMgdnNsZG9pNCA8dSwyLDcsMD4sIExIUworICAxNzE5NjIwNjAyVSwJLy8gPDIsNywwLDE+OiBDb3N0IDIgdnNsZG9pMTIgPDcsMCwxLDI+LCA8NywwLDEsMj4KKyAgMzc2ODI1NDYzN1UsCS8vIDwyLDcsMCwyPjogQ29zdCA0IHZzbGRvaTggPDEsNiwyLDc+LCA8MCwyLDEsMj4KKyAgMzM5MzQxNzcyMlUsCS8vIDwyLDcsMCwzPjogQ29zdCA0IHZtcmdsdyA8NiwzLDIsMD4sIDw2LDIsNywzPgorICAyNjY2ODY4MDIyVSwJLy8gPDIsNywwLDQ+OiBDb3N0IDMgdnNsZG9pNCA8dSwyLDcsMD4sIFJIUworICAzODY3MTA0MjkwVSwJLy8gPDIsNywwLDU+OiBDb3N0IDQgdnNsZG9pMTIgPDcsMCwxLDI+LCA8NywwLDUsNj4KKyAgMzcyODY2NzEyN1UsCS8vIDwyLDcsMCw2PjogQ29zdCA0IHZzbGRvaTQgPDYsMiw3LDA+LCA8NiwyLDcsMD4KKyAgMjY2Njg2OTgxN1UsCS8vIDwyLDcsMCw3PjogQ29zdCAzIHZzbGRvaTQgPHUsMiw3LDA+LCA8NywwLHUsMj4KKyAgMTcyMDEzNjc2MVUsCS8vIDwyLDcsMCx1PjogQ29zdCAyIHZzbGRvaTEyIDw3LDAsdSwyPiwgPDcsMCx1LDI+CisgIDM3Mjg2NzA4MjJVLAkvLyA8Miw3LDEsMD46IENvc3QgNCB2c2xkb2k0IDw2LDIsNywxPiwgTEhTCisgIDM3NzQyMjcyNTJVLAkvLyA8Miw3LDEsMT46IENvc3QgNCB2c2xkb2k4IDwyLDYsMiw3PiwgPDEsMSwxLDE+CisgIDM3NzQyMjczNTBVLAkvLyA8Miw3LDEsMj46IENvc3QgNCB2c2xkb2k4IDwyLDYsMiw3PiwgPDEsMiwzLDA+CisgIDIzMjMwMDE4NTBVLAkvLyA8Miw3LDEsMz46IENvc3QgMyB2bXJnbHcgPDYsdSwyLDE+LCA8NiwyLDcsMz4KKyAgMzcyODY3NDEwMlUsCS8vIDwyLDcsMSw0PjogQ29zdCA0IHZzbGRvaTQgPDYsMiw3LDE+LCBSSFMKKyAgMzc3NDIyNzU2N1UsCS8vIDwyLDcsMSw1PjogQ29zdCA1IHZzbGRvaTggPDIsNiwyLDc+LCA8MSw1LDAsMT4KKyAgMjY5NDUxMzg4MFUsCS8vIDwyLDcsMSw2PjogQ29zdCAzIHZzbGRvaTggPDEsNiwyLDc+LCA8MSw2LDIsNz4KKyAgMzM5Njc0NDAwMlUsCS8vIDwyLDcsMSw3PjogQ29zdCA0IHZtcmdsdyA8Nix1LDIsMT4sIDw2LDYsNyw3PgorICAyMzIzMDAxODUwVSwJLy8gPDIsNywxLHU+OiBDb3N0IDMgdm1yZ2x3IDw2LHUsMiwxPiwgPDYsMiw3LDM+CisgIDI2NTQ5MzcxOTBVLAkvLyA8Miw3LDIsMD46IENvc3QgMyB2c2xkb2k0IDw2LDIsNywyPiwgTEhTCisgIDM3Mjg2Nzk3MzJVLAkvLyA8Miw3LDIsMT46IENvc3QgNCB2c2xkb2k0IDw2LDIsNywyPiwgPDEsMSwxLDE+CisgIDI3MDA0ODYyNDhVLAkvLyA8Miw3LDIsMj46IENvc3QgMyB2c2xkb2k4IDwyLDYsMiw3PiwgPDIsMiwyLDI+CisgIDIzMjE2ODI5MzhVLAkvLyA8Miw3LDIsMz46IENvc3QgMyB2bXJnbHcgPDYsNiwyLDI+LCA8NiwyLDcsMz4KKyAgMjY1NDk0MDQ3MFUsCS8vIDwyLDcsMiw0PjogQ29zdCAzIHZzbGRvaTQgPDYsMiw3LDI+LCBSSFMKKyAgMzg1OTU4NDE5NlUsCS8vIDwyLDcsMiw1PjogQ29zdCA0IHZzbGRvaTEyIDw1LDYsNywyPiwgPDcsMiw1LDY+CisgIDI3MDA0ODY1NzdVLAkvLyA8Miw3LDIsNj46IENvc3QgMyB2c2xkb2k4IDwyLDYsMiw3PiwgPDIsNiwyLDc+CisgIDIyMjgwMzMxMzJVLAkvLyA8Miw3LDIsNz46IENvc3QgMyB2bXJnaHcgPDIsMiwyLDI+LCA8Nyw3LDcsNz4KKyAgMjcwMTgxMzg0M1UsCS8vIDwyLDcsMix1PjogQ29zdCAzIHZzbGRvaTggPDIsdSwyLDc+LCA8Mix1LDIsNz4KKyAgMTU4MTIwMzU1OFUsCS8vIDwyLDcsMywwPjogQ29zdCAyIHZzbGRvaTQgPDYsMiw3LDM+LCBMSFMKKyAgMjY1NDk0NjEwMFUsCS8vIDwyLDcsMywxPjogQ29zdCAzIHZzbGRvaTQgPDYsMiw3LDM+LCA8MSwxLDEsMT4KKyAgMjYzNzAzMTM1NFUsCS8vIDwyLDcsMywyPjogQ29zdCAzIHZzbGRvaTQgPDMsMiw3LDM+LCA8Miw2LDMsNz4KKyAgMTI1NjU3NTQ4MlUsCS8vIDwyLDcsMywzPjogQ29zdCAyIHZtcmdsdyBMSFMsIDw2LDIsNywzPgorICAxNTgxMjA2ODM4VSwJLy8gPDIsNywzLDQ+OiBDb3N0IDIgdnNsZG9pNCA8NiwyLDcsMz4sIFJIUworICAyNjU0OTQ5MzgwVSwJLy8gPDIsNywzLDU+OiBDb3N0IDMgdnNsZG9pNCA8NiwyLDcsMz4sIDw1LDUsNSw1PgorICAxNTgxMjA4MDU4VSwJLy8gPDIsNywzLDY+OiBDb3N0IDIgdnNsZG9pNCA8NiwyLDcsMz4sIDw2LDIsNywzPgorICAxMjU2NTc1ODEwVSwJLy8gPDIsNywzLDc+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDYsNiw3LDc+CisgIDE1ODEyMDkzOTBVLAkvLyA8Miw3LDMsdT46IENvc3QgMiB2c2xkb2k0IDw2LDIsNywzPiwgTEhTCisgIDM3Mjg2OTUzOThVLAkvLyA8Miw3LDQsMD46IENvc3QgNCB2c2xkb2k0IDw2LDIsNyw0PiwgTEhTCisgIDM4Njk3NTg3ODJVLAkvLyA8Miw3LDQsMT46IENvc3QgNCB2c2xkb2kxMiA8Nyw0LDEsMj4sIDw3LDQsMSwyPgorICAzNzI4Njk2OTM2VSwJLy8gPDIsNyw0LDI+OiBDb3N0IDQgdnNsZG9pNCA8NiwyLDcsND4sIDwyLDIsMiwyPgorICAzMzkzNDUwNDkwVSwJLy8gPDIsNyw0LDM+OiBDb3N0IDQgdm1yZ2x3IDw2LDMsMiw0PiwgPDYsMiw3LDM+CisgIDM3Mjg2OTg2NzhVLAkvLyA8Miw3LDQsND46IENvc3QgNCB2c2xkb2k0IDw2LDIsNyw0PiwgUkhTCisgIDI3MDA0ODc5OTBVLAkvLyA8Miw3LDQsNT46IENvc3QgMyB2c2xkb2k4IDwyLDYsMiw3PiwgUkhTCisgIDM3Mjg2OTk4OTlVLAkvLyA8Miw3LDQsNj46IENvc3QgNCB2c2xkb2k0IDw2LDIsNyw0PiwgPDYsMiw3LDQ+CisgIDM4NjcxMDQ2MjZVLAkvLyA8Miw3LDQsNz46IENvc3QgNCB2c2xkb2kxMiA8NywwLDEsMj4sIDw3LDQsNywwPgorICAyNzAwNDg4MjMzVSwJLy8gPDIsNyw0LHU+OiBDb3N0IDMgdnNsZG9pOCA8Miw2LDIsNz4sIFJIUworICAzODU1MTYwNzA5VSwJLy8gPDIsNyw1LDA+OiBDb3N0IDQgdnNsZG9pMTIgPDUsMCwxLDI+LCA8Nyw1LDAsMT4KKyAgMzcyODcwNDQwNlUsCS8vIDwyLDcsNSwxPjogQ29zdCA0IHZzbGRvaTQgPDYsMiw3LDU+LCA8MSwyLDMsMD4KKyAgMzM3MDIzMzk1NlUsCS8vIDwyLDcsNSwyPjogQ29zdCA0IHZtcmdsdyA8Miw0LDIsNT4sIDw1LDYsNywyPgorICAyMzIwMzgwNDEwVSwJLy8gPDIsNyw1LDM+OiBDb3N0IDMgdm1yZ2x3IDw2LDQsMiw1PiwgPDYsMiw3LDM+CisgIDM3Mjg3MDY4NzBVLAkvLyA8Miw3LDUsND46IENvc3QgNCB2c2xkb2k0IDw2LDIsNyw1PiwgUkhTCisgIDM4NjcxMDQ2OTRVLAkvLyA8Miw3LDUsNT46IENvc3QgNCB2c2xkb2kxMiA8NywwLDEsMj4sIDw3LDUsNSw1PgorICAzNzkyMTQ2NDkyVSwJLy8gPDIsNyw1LDY+OiBDb3N0IDQgdnNsZG9pOCA8NSw2LDIsNz4sIDw1LDYsMiw3PgorICAzMzk0MTIyNTYyVSwJLy8gPDIsNyw1LDc+OiBDb3N0IDQgdm1yZ2x3IDw2LDQsMiw1PiwgPDYsNiw3LDc+CisgIDIzMjAzODA0MTBVLAkvLyA8Miw3LDUsdT46IENvc3QgMyB2bXJnbHcgPDYsNCwyLDU+LCA8NiwyLDcsMz4KKyAgMjIzMDgwMTQwMlUsCS8vIDwyLDcsNiwwPjogQ29zdCAzIHZtcmdodyA8Miw2LDMsNz4sIDw3LDAsMSwyPgorICAzNzY4MjU4OTg0VSwJLy8gPDIsNyw2LDE+OiBDb3N0IDQgdnNsZG9pOCA8MSw2LDIsNz4sIDw2LDEsNywyPgorICAyNzMwMzQ5MDUwVSwJLy8gPDIsNyw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8Nyw2LDIsNz4sIDw2LDIsNywzPgorICAzMzcyODk0NTc1VSwJLy8gPDIsNyw2LDM+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsMiw2PiwgPDMsMiw3LDM+CisgIDIyMzA4MDE3NjZVLAkvLyA8Miw3LDYsND46IENvc3QgMyB2bXJnaHcgPDIsNiwzLDc+LCA8Nyw0LDUsNj4KKyAgMzMwNDU0MzY3MFUsCS8vIDwyLDcsNiw1PjogQ29zdCA0IHZtcmdodyA8Miw2LDMsNz4sIDw3LDUsNSw1PgorICAzNzI4NzE2Mjg1VSwJLy8gPDIsNyw2LDY+OiBDb3N0IDQgdnNsZG9pNCA8NiwyLDcsNj4sIDw2LDIsNyw2PgorICAyMjMwODAyMDI4VSwJLy8gPDIsNyw2LDc+OiBDb3N0IDMgdm1yZ2h3IDwyLDYsMyw3PiwgPDcsNyw3LDc+CisgIDI3MzAzNDkwNTBVLAkvLyA8Miw3LDYsdT46IENvc3QgMyB2c2xkb2k4IDw3LDYsMiw3PiwgPDYsMiw3LDM+CisgIDI3OTMzNjI5ODNVLAkvLyA8Miw3LDcsMD46IENvc3QgMyB2c2xkb2kxMiA8NywwLDEsMj4sIDw3LDcsMCwxPgorICAzNzI4NzIxMTEyVSwJLy8gPDIsNyw3LDE+OiBDb3N0IDQgdnNsZG9pNCA8NiwyLDcsNz4sIDwxLDYsMiw3PgorICAzMzcxNTc0OTMzVSwJLy8gPDIsNyw3LDI+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMiw3PiwgPDIsMiw3LDI+CisgIDIzMjc2OTU4NjZVLAkvLyA8Miw3LDcsMz46IENvc3QgMyB2bXJnbHcgPDcsNiwyLDc+LCA8NiwyLDcsMz4KKyAgMzcyODcyMzI1NFUsCS8vIDwyLDcsNyw0PjogQ29zdCA0IHZzbGRvaTQgPDYsMiw3LDc+LCBSSFMKKyAgMzM3MTU3NDg1NVUsCS8vIDwyLDcsNyw1PjogQ29zdCA1IHZtcmdsdyA8Miw2LDIsNz4sIDwyLDEsNyw1PgorICAyNzMwMzUwMDYyVSwJLy8gPDIsNyw3LDY+OiBDb3N0IDMgdnNsZG9pOCA8Nyw2LDIsNz4sIDw3LDYsMiw3PgorICAyNzkzMzYzMDUyVSwJLy8gPDIsNyw3LDc+OiBDb3N0IDMgdnNsZG9pMTIgPDcsMCwxLDI+LCA8Nyw3LDcsNz4KKyAgMjc5ODY3MTQ3MVUsCS8vIDwyLDcsNyx1PjogQ29zdCAzIHZzbGRvaTEyIDw3LHUsMSwyPiwgPDcsNyx1LDE+CisgIDE1ODEyNDQ1MThVLAkvLyA8Miw3LHUsMD46IENvc3QgMiB2c2xkb2k0IDw2LDIsNyx1PiwgTEhTCisgIDE3MjQ5Mjk2NjZVLAkvLyA8Miw3LHUsMT46IENvc3QgMiB2c2xkb2kxMiA8Nyx1LDEsMj4sIDw3LHUsMSwyPgorICAyNjM3MDcyMzE0VSwJLy8gPDIsNyx1LDI+OiBDb3N0IDMgdnNsZG9pNCA8MywyLDcsdT4sIDwyLDYsMyw3PgorICAxMjU2NjE2NDQyVSwJLy8gPDIsNyx1LDM+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDYsMiw3LDM+CisgIDE1ODEyNDc3OThVLAkvLyA8Miw3LHUsND46IENvc3QgMiB2c2xkb2k0IDw2LDIsNyx1PiwgUkhTCisgIDI3MDA0OTA5MDZVLAkvLyA8Miw3LHUsNT46IENvc3QgMyB2c2xkb2k4IDwyLDYsMiw3PiwgUkhTCisgIDE1ODEyNDkwMjNVLAkvLyA8Miw3LHUsNj46IENvc3QgMiB2c2xkb2k0IDw2LDIsNyx1PiwgPDYsMiw3LHU+CisgIDEyNTY2MTY3NzBVLAkvLyA8Miw3LHUsNz46IENvc3QgMiB2bXJnbHcgTEhTLCA8Niw2LDcsNz4KKyAgMTU4MTI1MDM1MFUsCS8vIDwyLDcsdSx1PjogQ29zdCAyIHZzbGRvaTQgPDYsMiw3LHU+LCBMSFMKKyAgMTYxMTQ4OTI4MFUsCS8vIDwyLHUsMCwwPjogQ29zdCAyIHZzbGRvaTggTEhTLCA8MCwwLDAsMD4KKyAgNTM3NzQ3NTYzVSwJLy8gPDIsdSwwLDE+OiBDb3N0IDEgdnNsZG9pOCBMSFMsIExIUworICAyNjg1MjMxMjc3VSwJLy8gPDIsdSwwLDI+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwwLDIsMSwyPgorICAyNjg1MjMxMzU2VSwJLy8gPDIsdSwwLDM+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwwLDMsMSwwPgorICAxNjExNDg5NjE4VSwJLy8gPDIsdSwwLDQ+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwwLDQsMSw1PgorICAyMjI2NzYzOTMwVSwJLy8gPDIsdSwwLDU+OiBDb3N0IDMgdm1yZ2h3IDwyLDAsMywwPiwgUkhTCisgIDI3MzMwMDczNTBVLAkvLyA8Mix1LDAsNj46IENvc3QgMyB2c2xkb2k4IExIUywgPDAsNiwxLDc+CisgIDI2NjA5NzE3MzdVLAkvLyA8Mix1LDAsNz46IENvc3QgMyB2c2xkb2k0IDw3LDIsdSwwPiwgPDcsMix1LDA+CisgIDUzNzc0ODEyNVUsCS8vIDwyLHUsMCx1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBMSFMKKyAgMjY4OTg3NjcwOFUsCS8vIDwyLHUsMSwwPjogQ29zdCAzIHZzbGRvaTggTEhTLCA8MSwwLDEsMj4KKyAgMTYxMTQ5MDEwMFUsCS8vIDwyLHUsMSwxPjogQ29zdCAyIHZzbGRvaTggTEhTLCA8MSwxLDEsMT4KKyAgMTYxMTQ5MDE5OFUsCS8vIDwyLHUsMSwyPjogQ29zdCAyIHZzbGRvaTggTEhTLCA8MSwyLDMsMD4KKyAgMjI5MzEzNzU2NFUsCS8vIDwyLHUsMSwzPjogQ29zdCAzIHZtcmdsdyA8MSx1LDIsMT4sIExIUworICAyNjg5ODc3MDcyVSwJLy8gPDIsdSwxLDQ+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwxLDQsNSw2PgorICAyNjg5ODc3MTAzVSwJLy8gPDIsdSwxLDU+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwxLDUsMCwxPgorICAyNjg5ODc3MTk5VSwJLy8gPDIsdSwxLDY+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwxLDYsMSw3PgorICAyMjkzMTQwODA4VSwJLy8gPDIsdSwxLDc+OiBDb3N0IDMgdm1yZ2x3IDwxLHUsMiwxPiwgUkhTCisgIDE2MTYxMzU1NDhVLAkvLyA8Mix1LDEsdT46IENvc3QgMiB2c2xkb2k4IExIUywgPDEsdSwzLDA+CisgIDE1NTY5Mzg4NTRVLAkvLyA8Mix1LDIsMD46IENvc3QgMiB2c2xkb2k0IDwyLDIsMiwyPiwgTEhTCisgIDExNTQyOTE1MDJVLAkvLyA8Mix1LDIsMT46IENvc3QgMiB2bXJnaHcgPDIsMiwyLDI+LCBMSFMKKyAgMzM2MzgwMDA2VSwJLy8gPDIsdSwyLDI+OiBDb3N0IDEgdnNwbHRpc3cyIExIUworICAxNjExNDkwOTgyVSwJLy8gPDIsdSwyLDM+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwyLDMsMCwxPgorICAxNTU2OTQyMTM0VSwJLy8gPDIsdSwyLDQ+OiBDb3N0IDIgdnNsZG9pNCA8MiwyLDIsMj4sIFJIUworICAxMTU0MjkxODY2VSwJLy8gPDIsdSwyLDU+OiBDb3N0IDIgdm1yZ2h3IDwyLDIsMiwyPiwgUkhTCisgIDE2MTE0OTEyNThVLAkvLyA8Mix1LDIsNj46IENvc3QgMiB2c2xkb2k4IExIUywgPDIsNiwzLDc+CisgIDEyMjEzOTc4MzJVLAkvLyA8Mix1LDIsNz46IENvc3QgMiB2bXJnbHcgPDIsMiwyLDI+LCBSSFMKKyAgMzM2MzgwMDA2VSwJLy8gPDIsdSwyLHU+OiBDb3N0IDEgdnNwbHRpc3cyIExIUworICAxNjExNDkxNDc4VSwJLy8gPDIsdSwzLDA+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwzLDAsMSwyPgorICAxMjEzNDQwMDczVSwJLy8gPDIsdSwzLDE+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDAsMCx1LDE+CisgIDEyMTM0NDIyNjFVLAkvLyA8Mix1LDMsMj46IENvc3QgMiB2bXJnbHcgTEhTLCA8MywwLHUsMj4KKyAgMTM1MDUzNDY4VSwJLy8gPDIsdSwzLDM+OiBDb3N0IDEgdm1yZ2x3IExIUywgTEhTCisgIDE2MTE0OTE4NDJVLAkvLyA8Mix1LDMsND46IENvc3QgMiB2c2xkb2k4IExIUywgPDMsNCw1LDY+CisgIDEyMTM0NDA0MDFVLAkvLyA8Mix1LDMsNT46IENvc3QgMiB2bXJnbHcgTEhTLCA8MCw0LHUsNT4KKyAgMTIxMzQ0MjU4OVUsCS8vIDwyLHUsMyw2PjogQ29zdCAyIHZtcmdsdyBMSFMsIDwzLDQsdSw2PgorICAxMzUwNTY3MTJVLAkvLyA8Mix1LDMsNz46IENvc3QgMSB2bXJnbHcgTEhTLCBSSFMKKyAgMTM1MDUzNDczVSwJLy8gPDIsdSwzLHU+OiBDb3N0IDEgdm1yZ2x3IExIUywgTEhTCisgIDE1NTE0MjU2MzhVLAkvLyA8Mix1LDQsMD46IENvc3QgMiB2c2xkb2k0IDwxLDIsdSw0PiwgTEhTCisgIDE1NTE0MjY1MDNVLAkvLyA8Mix1LDQsMT46IENvc3QgMiB2c2xkb2k0IDwxLDIsdSw0PiwgPDEsMix1LDQ+CisgIDI2MjUxNjkwMDBVLAkvLyA8Mix1LDQsMj46IENvc3QgMyB2c2xkb2k0IDwxLDIsdSw0PiwgPDIsMiwyLDI+CisgIDI2MjUxNjk1NThVLAkvLyA8Mix1LDQsMz46IENvc3QgMyB2c2xkb2k0IDwxLDIsdSw0PiwgPDMsMCwxLDI+CisgIDE1NTE0Mjg5MThVLAkvLyA8Mix1LDQsND46IENvc3QgMiB2c2xkb2k0IDwxLDIsdSw0PiwgUkhTCisgIDUzNzc1MDgzOFUsCS8vIDwyLHUsNCw1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBSSFMKKyAgMjczMzAxMDI5N1UsCS8vIDwyLHUsNCw2PjogQ29zdCAzIHZzbGRvaTggTEhTLCA8NCw2LDUsMj4KKyAgMjI5NTE1NjA0MFUsCS8vIDwyLHUsNCw3PjogQ29zdCAzIHZtcmdsdyA8MiwyLDIsND4sIFJIUworICA1Mzc3NTEwODFVLAkvLyA8Mix1LDQsdT46IENvc3QgMSB2c2xkb2k4IExIUywgUkhTCisgIDI2ODk4Nzk2MjRVLAkvLyA8Mix1LDUsMD46IENvc3QgMyB2c2xkb2k4IExIUywgPDUsMCwxLDI+CisgIDIyMzAxMzA0NzhVLAkvLyA8Mix1LDUsMT46IENvc3QgMyB2bXJnaHcgPDIsNSwzLDY+LCBMSFMKKyAgMjYzMTE0OTIxN1UsCS8vIDwyLHUsNSwyPjogQ29zdCAzIHZzbGRvaTQgPDIsMix1LDU+LCA8MiwyLHUsNT4KKyAgMjI5MDUxNjEyNFUsCS8vIDwyLHUsNSwzPjogQ29zdCAzIHZtcmdsdyA8MSw0LDIsNT4sIExIUworICAyNjg5ODc5OTg4VSwJLy8gPDIsdSw1LDQ+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDw1LDQsNSw2PgorICAxNjU5MjY5MTI0VSwJLy8gPDIsdSw1LDU+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDw1LDUsNSw1PgorICAxNjkxMTYyNzc4VSwJLy8gPDIsdSw1LDY+OiBDb3N0IDIgdnNsZG9pMTIgPDIsMiwyLDI+LCBSSFMKKyAgMjI5MDUxOTM2OFUsCS8vIDwyLHUsNSw3PjogQ29zdCAzIHZtcmdsdyA8MSw0LDIsNT4sIFJIUworICAxNjkxMTYyNzk2VSwJLy8gPDIsdSw1LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDIsMiwyLDI+LCBSSFMKKyAgMjIzMDgwMjEzMVUsCS8vIDwyLHUsNiwwPjogQ29zdCAzIHZtcmdodyA8Miw2LDMsNz4sIDx1LDAsMSwyPgorICAxMTU3MDYwMzk4VSwJLy8gPDIsdSw2LDE+OiBDb3N0IDIgdm1yZ2h3IDwyLDYsMyw3PiwgTEhTCisgIDE2NTkyNjk2MjZVLAkvLyA8Mix1LDYsMj46IENvc3QgMiB2c2xkb2k4IExIUywgPDYsMiw3LDM+CisgIDI3NjQ5MDQ2NTZVLAkvLyA8Mix1LDYsMz46IENvc3QgMyB2c2xkb2kxMiA8MiwyLDIsMj4sIDx1LDYsMyw3PgorICAyMjMwODAyNDk1VSwJLy8gPDIsdSw2LDQ+OiBDb3N0IDMgdm1yZ2h3IDwyLDYsMyw3PiwgPHUsNCw1LDY+CisgIDExNTcwNjA3NjJVLAkvLyA8Mix1LDYsNT46IENvc3QgMiB2bXJnaHcgPDIsNiwzLDc+LCBSSFMKKyAgMTY1OTI2OTk0NFUsCS8vIDwyLHUsNiw2PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8Niw2LDYsNj4KKyAgMTY1OTI2OTk2NlUsCS8vIDwyLHUsNiw3PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8Niw3LDAsMT4KKyAgMTE1NzA2MDk2NVUsCS8vIDwyLHUsNix1PjogQ29zdCAyIHZtcmdodyA8Miw2LDMsNz4sIExIUworICAxNjU5MjcwMTM4VSwJLy8gPDIsdSw3LDA+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDw3LDAsMSwyPgorICAyNzI3MDQwMDkwVSwJLy8gPDIsdSw3LDE+OiBDb3N0IDMgdnNsZG9pOCA8NywxLDIsdT4sIDw3LDEsMix1PgorICAyNzI3NzAzNzIzVSwJLy8gPDIsdSw3LDI+OiBDb3N0IDMgdnNsZG9pOCA8NywyLDIsdT4sIDw3LDIsMix1PgorICAyMjk3ODMxNTgwVSwJLy8gPDIsdSw3LDM+OiBDb3N0IDMgdm1yZ2x3IDwyLDYsMiw3PiwgTEhTCisgIDE2NTkyNzA1MDJVLAkvLyA8Mix1LDcsND46IENvc3QgMiB2c2xkb2k4IExIUywgPDcsNCw1LDY+CisgIDI3MzMwMTI0MDZVLAkvLyA8Mix1LDcsNT46IENvc3QgMyB2c2xkb2k4IExIUywgPDcsNSw1LDU+CisgIDI3MzAzNTgyNTVVLAkvLyA8Mix1LDcsNj46IENvc3QgMyB2c2xkb2k4IDw3LDYsMix1PiwgPDcsNiwyLHU+CisgIDE2NTkyNzA3NjRVLAkvLyA8Mix1LDcsNz46IENvc3QgMiB2c2xkb2k4IExIUywgPDcsNyw3LDc+CisgIDE2NTkyNzA3ODZVLAkvLyA8Mix1LDcsdT46IENvc3QgMiB2c2xkb2k4IExIUywgPDcsdSwxLDI+CisgIDEyMTM0ODE5MjNVLAkvLyA8Mix1LHUsMD46IENvc3QgMiB2bXJnbHcgTEhTLCA8MSwyLHUsMD4KKyAgNTM3NzUzMzkwVSwJLy8gPDIsdSx1LDE+OiBDb3N0IDEgdnNsZG9pOCBMSFMsIExIUworICAzMzYzODAwMDZVLAkvLyA8Mix1LHUsMj46IENvc3QgMSB2c3BsdGlzdzIgTEhTCisgIDEzNTA5NDQyOFUsCS8vIDwyLHUsdSwzPjogQ29zdCAxIHZtcmdsdyBMSFMsIExIUworICAxMjEzNDgxOTI3VSwJLy8gPDIsdSx1LDQ+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDEsMix1LDQ+CisgIDUzNzc1Mzc1NFUsCS8vIDwyLHUsdSw1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBSSFMKKyAgMTIwODgzODY4NVUsCS8vIDwyLHUsdSw2PjogQ29zdCAyIHZtcmdsdyBMSFMsIDwzLDQsdSw2PgorICAxMzUwOTc2NzJVLAkvLyA8Mix1LHUsNz46IENvc3QgMSB2bXJnbHcgTEhTLCBSSFMKKyAgMTM1MDk0NDMzVSwJLy8gPDIsdSx1LHU+OiBDb3N0IDEgdm1yZ2x3IExIUywgTEhTCisgIDE2Nzg1NTcxODRVLAkvLyA8MywwLDAsMD46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwwLDAsMCwwPgorICAxNjc4NTU3MTk0VSwJLy8gPDMsMCwwLDE+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8MCwwLDEsMT4KKyAgMjYzMTE4MTk4OVUsCS8vIDwzLDAsMCwyPjogQ29zdCAzIHZzbGRvaTQgPDIsMywwLDA+LCA8MiwzLDAsMD4KKyAgMjI4OTIyMzk4NFUsCS8vIDwzLDAsMCwzPjogQ29zdCAzIHZtcmdsdyA8MSwyLDMsMD4sIDwzLDIsMCwzPgorICAyNzU2OTQzOTA5VSwJLy8gPDMsMCwwLDQ+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MCwwLDQsMT4KKyAgMzM2Mjk2NTcyOVUsCS8vIDwzLDAsMCw1PjogQ29zdCA0IHZtcmdsdyA8MSwyLDMsMD4sIDwzLDEsMCw1PgorICAzMzYyOTY2MDU0VSwJLy8gPDMsMCwwLDY+OiBDb3N0IDQgdm1yZ2x3IDwxLDIsMywwPiwgPDMsNSwwLDY+CisgIDIyODkyMjQzMTJVLAkvLyA8MywwLDAsNz46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDA+LCA8Myw2LDAsNz4KKyAgMTY4MzIwMjEyMVUsCS8vIDwzLDAsMCx1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDAsMCx1LDE+CisgIDE1NTc0NDY3NThVLAkvLyA8MywwLDEsMD46IENvc3QgMiB2c2xkb2k0IDwyLDMsMCwxPiwgTEhTCisgIDI3NTI3NDE0NjdVLAkvLyA8MywwLDEsMT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwwLDEsMSwxPgorICA2MDQ4MTU0NjJVLAkvLyA8MywwLDEsMj46IENvc3QgMSB2c2xkb2kxMiBMSFMsIExIUworICAyNjMxMTkwNjc2VSwJLy8gPDMsMCwxLDM+OiBDb3N0IDMgdnNsZG9pNCA8MiwzLDAsMT4sIDwzLDAsMSwwPgorICAxNTU3NDUwMDM4VSwJLy8gPDMsMCwxLDQ+OiBDb3N0IDIgdnNsZG9pNCA8MiwzLDAsMT4sIFJIUworICAyNjY3MDI0Mzg4VSwJLy8gPDMsMCwxLDU+OiBDb3N0IDMgdnNsZG9pNCA8dSwzLDAsMT4sIDw1LDUsNSw1PgorICAyODAwMDc0ODk0VSwJLy8gPDMsMCwxLDY+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MCwxLDYsNz4KKyAgMjY2MTA1MzY2N1UsCS8vIDwzLDAsMSw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMywwLDE+LCA8NywzLDAsMT4KKyAgNjA0ODE1NTE2VSwJLy8gPDMsMCwxLHU+OiBDb3N0IDEgdnNsZG9pMTIgTEhTLCBMSFMKKyAgMjY5NjUyMTE2NVUsCS8vIDwzLDAsMiwwPjogQ29zdCAzIHZzbGRvaTggPDIsMCwzLDA+LCA8MiwwLDMsMD4KKyAgMjc1Mjc0MTU0OVUsCS8vIDwzLDAsMiwxPjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDAsMiwxLDI+CisgIDI2OTE4NzY0NTZVLAkvLyA8MywwLDIsMj46IENvc3QgMyB2c2xkb2k4IDwxLDIsMywwPiwgPDIsMiwyLDI+CisgIDI2OTE4NzY1MThVLAkvLyA8MywwLDIsMz46IENvc3QgMyB2c2xkb2k4IDwxLDIsMywwPiwgPDIsMywwLDE+CisgIDM4MzA2ODU4OTVVLAkvLyA8MywwLDIsND46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDwwLDIsNCwxPgorICAzNzY1NjE4NTM2VSwJLy8gPDMsMCwyLDU+OiBDb3N0IDQgdnNsZG9pOCA8MSwyLDMsMD4sIDwyLDUsMyw2PgorICAyNjkxODc2Nzk0VSwJLy8gPDMsMCwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsMD4sIDwyLDYsMyw3PgorICAyNzAxMTY2NTk2VSwJLy8gPDMsMCwyLDc+OiBDb3N0IDMgdnNsZG9pOCA8Miw3LDMsMD4sIDwyLDcsMywwPgorICAyNzU2OTQ0MTA4VSwJLy8gPDMsMCwyLHU+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MCwyLHUsMj4KKyAgMjY5MTg3NzAxNFUsCS8vIDwzLDAsMywwPjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDA+LCA8MywwLDEsMj4KKyAgMTE2MTAwMzExMFUsCS8vIDwzLDAsMywxPjogQ29zdCAyIHZtcmdodyA8MywzLDMsMz4sIExIUworICAyNjkxODc3MTY4VSwJLy8gPDMsMCwzLDI+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsMD4sIDwzLDIsMCwzPgorICAyNjkxODc3MjQ2VSwJLy8gPDMsMCwzLDM+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsMD4sIDwzLDMsMCwwPgorICAyNjkxODc3Mzc4VSwJLy8gPDMsMCwzLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsMD4sIDwzLDQsNSw2PgorICAzNzY1NjE5MjM4VSwJLy8gPDMsMCwzLDU+OiBDb3N0IDQgdnNsZG9pOCA8MSwyLDMsMD4sIDwzLDUsMCw2PgorICAyNjkxODc3NDk2VSwJLy8gPDMsMCwzLDY+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsMD4sIDwzLDYsMCw3PgorICAzMzY4OTYyNjgwVSwJLy8gPDMsMCwzLDc+OiBDb3N0IDQgdm1yZ2x3IDwyLDIsMywzPiwgPDMsNiwwLDc+CisgIDExNjEwMDM2NzdVLAkvLyA8MywwLDMsdT46IENvc3QgMiB2bXJnaHcgPDMsMywzLDM+LCBMSFMKKyAgMjI4OTI1NDQwMFUsCS8vIDwzLDAsNCwwPjogQ29zdCAzIHZtcmdsdyA8MSwyLDMsND4sIDwwLDAsMCwwPgorICAxNjc4NTU3NTIyVSwJLy8gPDMsMCw0LDE+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8MCw0LDEsNT4KKyAgMjYzMTIxNDc2MVUsCS8vIDwzLDAsNCwyPjogQ29zdCAzIHZzbGRvaTQgPDIsMywwLDQ+LCA8MiwzLDAsND4KKyAgMjIzNTU4MDY3MlUsCS8vIDwzLDAsNCwzPjogQ29zdCAzIHZtcmdodyA8Myw0LDUsNj4sIDwwLDMsMSw0PgorICAyNzU2OTQ0MjM3VSwJLy8gPDMsMCw0LDQ+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MCw0LDQsNT4KKyAgMTYxODEzNjM3NFUsCS8vIDwzLDAsNCw1PjogQ29zdCAyIHZzbGRvaTggPDEsMiwzLDA+LCBSSFMKKyAgMzMwOTMyMjc0MlUsCS8vIDwzLDAsNCw2PjogQ29zdCA0IHZtcmdodyA8Myw0LDUsNj4sIDwwLDYsMSw3PgorICAzMzYyOTk4OTA0VSwJLy8gPDMsMCw0LDc+OiBDb3N0IDQgdm1yZ2x3IDwxLDIsMyw0PiwgPDMsNiwwLDc+CisgIDE2ODMyMDI0NDlVLAkvLyA8MywwLDQsdT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwwLDQsdSw1PgorICAzNzY1NjIwMjk2VSwJLy8gPDMsMCw1LDA+OiBDb3N0IDQgdnNsZG9pOCA8MSwyLDMsMD4sIDw1LDAsMSwyPgorICAyNzUyMjk5NDI3VSwJLy8gPDMsMCw1LDE+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MCw1LDEsNT4KKyAgMzc4OTUwODM0NlUsCS8vIDwzLDAsNSwyPjogQ29zdCA0IHZzbGRvaTggPDUsMiwzLDA+LCA8NSwyLDMsMD4KKyAgMzQwMzQ4Njg0MlUsCS8vIDwzLDAsNSwzPjogQ29zdCA0IHZtcmdsdyA8dSwwLDMsNT4sIDw3LHUsMCwzPgorICAzNzY1NjIwNjYwVSwJLy8gPDMsMCw1LDQ+OiBDb3N0IDQgdnNsZG9pOCA8MSwyLDMsMD4sIDw1LDQsNSw2PgorICAyNzMzNjgyNjkyVSwJLy8gPDMsMCw1LDU+OiBDb3N0IDMgdnNsZG9pOCA8dSwyLDMsMD4sIDw1LDUsNSw1PgorICAyODAwMDc1MjE4VSwJLy8gPDMsMCw1LDY+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MCw1LDYsNz4KKyAgMzg3MzgxNzA0NFUsCS8vIDwzLDAsNSw3PjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDAsNSw3LDA+CisgIDI4MDAwNzUyMzRVLAkvLyA8MywwLDUsdT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwwLDUsdSw1PgorICAyNzUyMjk5NTAxVSwJLy8gPDMsMCw2LDA+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MCw2LDAsNz4KKyAgMjIzNjU0NzE3NFUsCS8vIDwzLDAsNiwxPjogQ29zdCAzIHZtcmdodyA8Myw2LDAsNz4sIExIUworICAyNzMzNjgzMTk0VSwJLy8gPDMsMCw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8dSwyLDMsMD4sIDw2LDIsNywzPgorICAzODQ0NDczMzUyVSwJLy8gPDMsMCw2LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDMsMiwwLDM+LCA8MCw2LDMsNz4KKyAgMzMxMDI4OTIzNFUsCS8vIDwzLDAsNiw0PjogQ29zdCA0IHZtcmdodyA8Myw2LDAsNz4sIDwwLDQsMSw1PgorICAzODczODE3MTE0VSwJLy8gPDMsMCw2LDU+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8MCw2LDUsNz4KKyAgMjczMzY4MzUxMlUsCS8vIDwzLDAsNiw2PjogQ29zdCAzIHZzbGRvaTggPHUsMiwzLDA+LCA8Niw2LDYsNj4KKyAgMjcyNTA1NzM4NFUsCS8vIDwzLDAsNiw3PjogQ29zdCAzIHZzbGRvaTggPDYsNywzLDA+LCA8Niw3LDMsMD4KKyAgMjIzNjU0Nzc0MVUsCS8vIDwzLDAsNix1PjogQ29zdCAzIHZtcmdodyA8Myw2LDAsNz4sIExIUworICAyMjk3OTA1MTUyVSwJLy8gPDMsMCw3LDA+OiBDb3N0IDMgdm1yZ2x3IDwyLDYsMyw3PiwgPDAsMCwwLDA+CisgIDIyOTc5MDY4NTRVLAkvLyA8MywwLDcsMT46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MiwzLDAsMT4KKyAgMjcyNzcxMTkxNlUsCS8vIDwzLDAsNywyPjogQ29zdCAzIHZzbGRvaTggPDcsMiwzLDA+LCA8NywyLDMsMD4KKyAgMzM3MTY0OTMyOFUsCS8vIDwzLDAsNywzPjogQ29zdCA0IHZtcmdsdyA8Miw2LDMsNz4sIDwzLDIsMCwzPgorICAyNzMzNjg0MDcwVSwJLy8gPDMsMCw3LDQ+OiBDb3N0IDMgdnNsZG9pOCA8dSwyLDMsMD4sIDw3LDQsNSw2PgorICAzNzM0ODQzNDkwVSwJLy8gPDMsMCw3LDU+OiBDb3N0IDQgdnNsZG9pNCA8NywzLDAsNz4sIDw1LDYsNywwPgorICAzNzk4Nzk5ODk1VSwJLy8gPDMsMCw3LDY+OiBDb3N0IDQgdnNsZG9pOCA8Niw3LDMsMD4sIDw3LDYsNywzPgorICAyNzMzNjg0MzMyVSwJLy8gPDMsMCw3LDc+OiBDb3N0IDMgdnNsZG9pOCA8dSwyLDMsMD4sIDw3LDcsNyw3PgorICAyMjk3OTA2ODYxVSwJLy8gPDMsMCw3LHU+OiBDb3N0IDMgdm1yZ2x3IDwyLDYsMyw3PiwgPDIsMywwLHU+CisgIDE1NTc1MDQxMDJVLAkvLyA8MywwLHUsMD46IENvc3QgMiB2c2xkb2k0IDwyLDMsMCx1PiwgTEhTCisgIDE2Nzg1NTc4NDJVLAkvLyA8MywwLHUsMT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwwLHUsMSwxPgorICA2MDQ4MTYwMjlVLAkvLyA8MywwLHUsMj46IENvc3QgMSB2c2xkb2kxMiBMSFMsIExIUworICAyNjkxODgwODkyVSwJLy8gPDMsMCx1LDM+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsMD4sIDx1LDMsMCwxPgorICAxNTU3NTA3MzgyVSwJLy8gPDMsMCx1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8MiwzLDAsdT4sIFJIUworICAxNjE4MTM5MjkwVSwJLy8gPDMsMCx1LDU+OiBDb3N0IDIgdnNsZG9pOCA8MSwyLDMsMD4sIFJIUworICAyNjkxODgxMTY4VSwJLy8gPDMsMCx1LDY+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsMD4sIDx1LDYsMyw3PgorICAyNjYxMTExMDE4VSwJLy8gPDMsMCx1LDc+OiBDb3N0IDMgdnNsZG9pNCA8NywzLDAsdT4sIDw3LDMsMCx1PgorICA2MDQ4MTYwODNVLAkvLyA8MywwLHUsdT46IENvc3QgMSB2c2xkb2kxMiBMSFMsIExIUworICAyNjE5MzEwMzMyVSwJLy8gPDMsMSwwLDA+OiBDb3N0IDMgdnNsZG9pNCA8MCwzLDEsMD4sIDwwLDMsMSwwPgorICAyNzU2OTQ0NjEyVSwJLy8gPDMsMSwwLDE+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MSwwLDEsMj4KKyAgMjI4OTIyMTcyNFUsCS8vIDwzLDEsMCwyPjogQ29zdCAzIHZtcmdsdyA8MSwyLDMsMD4sIDwwLDEsMSwyPgorICAyNjE5MzEyMjc4VSwJLy8gPDMsMSwwLDM+OiBDb3N0IDMgdnNsZG9pNCA8MCwzLDEsMD4sIDwzLDAsMSwyPgorICAyNjE5MzEzNDYyVSwJLy8gPDMsMSwwLDQ+OiBDb3N0IDMgdnNsZG9pNCA8MCwzLDEsMD4sIFJIUworICAyMjg5MjIxOTcwVSwJLy8gPDMsMSwwLDU+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMywwPiwgPDAsNCwxLDU+CisgIDIyMzI1OTk3NjhVLAkvLyA8MywxLDAsNj46IENvc3QgMyB2bXJnaHcgPDMsMCwxLDI+LCA8MSw2LDIsNz4KKyAgMzM2Mjk2NDY4N1UsCS8vIDwzLDEsMCw3PjogQ29zdCA0IHZtcmdsdyA8MSwyLDMsMD4sIDwxLDYsMSw3PgorICAyNjE5MzE2MDE0VSwJLy8gPDMsMSwwLHU+OiBDb3N0IDMgdnNsZG9pNCA8MCwzLDEsMD4sIExIUworICAyNzU2OTQ0NjgzVSwJLy8gPDMsMSwxLDA+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MSwxLDAsMT4KKyAgMTY3ODU1ODAwNFUsCS8vIDwzLDEsMSwxPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDEsMSwxLDE+CisgIDI2OTE4ODM5MjdVLAkvLyA8MywxLDEsMj46IENvc3QgMyB2c2xkb2k4IDwxLDIsMywxPiwgPDEsMiwzLDE+CisgIDM4MjY2MzE0OTZVLAkvLyA8MywxLDEsMz46IENvc3QgNCB2c2xkb2kxMiA8MCwyLDEsMz4sIDwxLDEsMywzPgorICAyNzU2OTQ0NzIzVSwJLy8gPDMsMSwxLDQ+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MSwxLDQsNT4KKyAgMjc1Njk0NDczMlUsCS8vIDwzLDEsMSw1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDEsMSw1LDU+CisgIDM4MzA2ODY1NjFVLAkvLyA8MywxLDEsNj46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDwxLDEsNiwxPgorICAzNzM0ODY5MjI4VSwJLy8gPDMsMSwxLDc+OiBDb3N0IDQgdnNsZG9pNCA8NywzLDEsMT4sIDw3LDMsMSwxPgorICAxNjc4NTU4MDA0VSwJLy8gPDMsMSwxLHU+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8MSwxLDEsMT4KKyAgMjY5NjUyOTM1OFUsCS8vIDwzLDEsMiwwPjogQ29zdCAzIHZzbGRvaTggPDIsMCwzLDE+LCA8MiwwLDMsMT4KKyAgMjc1Njk0NDc3NVUsCS8vIDwzLDEsMiwxPjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDEsMiwxLDM+CisgIDIyOTQ1NDg2MzBVLAkvLyA8MywxLDIsMj46IENvc3QgMyB2bXJnbHcgPDIsMSwzLDI+LCA8MywwLDEsMj4KKyAgMTY3ODU1ODEwMlUsCS8vIDwzLDEsMiwzPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDEsMiwzLDA+CisgIDI2MzEyNzM3ODJVLAkvLyA8MywxLDIsND46IENvc3QgMyB2c2xkb2k0IDwyLDMsMSwyPiwgUkhTCisgIDI3NTY5NDQ4MTFVLAkvLyA8MywxLDIsNT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwxLDIsNSwzPgorICAzODMwNjg2NjQ0VSwJLy8gPDMsMSwyLDY+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8MSwyLDYsMz4KKyAgMjgwMDA3NTcwNlUsCS8vIDwzLDEsMiw3PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDEsMiw3LDA+CisgIDE2NzkwMDA1MTVVLAkvLyA8MywxLDIsdT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwxLDIsdSwwPgorICAyNjE5MzM0OTExVSwJLy8gPDMsMSwzLDA+OiBDb3N0IDMgdnNsZG9pNCA8MCwzLDEsMz4sIDwwLDMsMSwzPgorICAyMjk1MjE4MTg2VSwJLy8gPDMsMSwzLDE+OiBDb3N0IDMgdm1yZ2x3IDwyLDIsMywzPiwgPDAsMCwxLDE+CisgIDIyOTMyMjk3MThVLAkvLyA8MywxLDMsMj46IENvc3QgMyB2bXJnbHcgPDEsdSwzLDM+LCA8MywwLDEsMj4KKyAgMjYxOTMzNzExNlUsCS8vIDwzLDEsMywzPjogQ29zdCAzIHZzbGRvaTQgPDAsMywxLDM+LCA8MywzLDMsMz4KKyAgMjYxOTMzODAzOFUsCS8vIDwzLDEsMyw0PjogQ29zdCAzIHZzbGRvaTQgPDAsMywxLDM+LCBSSFMKKyAgMjI5NTIxODUxNFUsCS8vIDwzLDEsMyw1PjogQ29zdCAzIHZtcmdsdyA8MiwyLDMsMz4sIDwwLDQsMSw1PgorICAzODMwNjg2NzI5VSwJLy8gPDMsMSwzLDY+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8MSwzLDYsNz4KKyAgMzM2ODk2MTIzMVUsCS8vIDwzLDEsMyw3PjogQ29zdCA0IHZtcmdsdyA8MiwyLDMsMz4sIDwxLDYsMSw3PgorICAyNjE5MzQwNTkwVSwJLy8gPDMsMSwzLHU+OiBDb3N0IDMgdnNsZG9pNCA8MCwzLDEsMz4sIExIUworICAyNjE5MzQzMTA0VSwJLy8gPDMsMSw0LDA+OiBDb3N0IDMgdnNsZG9pNCA8MCwzLDEsND4sIDwwLDMsMSw0PgorICAyMjg5MjU0NDEwVSwJLy8gPDMsMSw0LDE+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMyw0PiwgPDAsMCwxLDE+CisgIDIyODkyNTY1OThVLAkvLyA8MywxLDQsMj46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDQ+LCA8MywwLDEsMj4KKyAgMjYxOTM0NTQxMFUsCS8vIDwzLDEsNCwzPjogQ29zdCAzIHZzbGRvaTQgPDAsMywxLDQ+LCA8Myw0LDUsNj4KKyAgMjYxOTM0NjIzMFUsCS8vIDwzLDEsNCw0PjogQ29zdCAzIHZzbGRvaTQgPDAsMywxLDQ+LCBSSFMKKyAgMjc1Njk0NDk3NlUsCS8vIDwzLDEsNCw1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDEsNCw1LDY+CisgIDMzNjI5OTY0MDFVLAkvLyA8MywxLDQsNj46IENvc3QgNCB2bXJnbHcgPDEsMiwzLDQ+LCA8MCwyLDEsNj4KKyAgMzM2Mjk5NzQ1NVUsCS8vIDwzLDEsNCw3PjogQ29zdCA0IHZtcmdsdyA8MSwyLDMsND4sIDwxLDYsMSw3PgorICAyNjE5MzQ4NzgyVSwJLy8gPDMsMSw0LHU+OiBDb3N0IDMgdnNsZG9pNCA8MCwzLDEsND4sIExIUworICAyNzU2OTQ1MDA3VSwJLy8gPDMsMSw1LDA+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MSw1LDAsMT4KKyAgMzgzMDY4Njg0MFUsCS8vIDwzLDEsNSwxPjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDEsNSwxLDE+CisgIDMzNTgzNjE3NTBVLAkvLyA8MywxLDUsMj46IENvc3QgNCB2bXJnbHcgPDAsNCwzLDU+LCA8MywwLDEsMj4KKyAgMzgzMDY4Njg1N1UsCS8vIDwzLDEsNSwzPjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDEsNSwzLDA+CisgIDI3NTY5NDUwNDdVLAkvLyA8MywxLDUsND46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwxLDUsNCw1PgorICAyMjk0NTcxMzQ2VSwJLy8gPDMsMSw1LDU+OiBDb3N0IDMgdm1yZ2x3IDwyLDEsMyw1PiwgPDAsNCwxLDU+CisgIDM4MDYxMDU2OThVLAkvLyA8MywxLDUsNj46IENvc3QgNCB2c2xkb2k4IDx1LDAsMywxPiwgPDUsNiw3LDA+CisgIDM4NzM4MTc3NzRVLAkvLyA8MywxLDUsNz46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDwxLDUsNywxPgorICAyNzU2OTQ1MDc5VSwJLy8gPDMsMSw1LHU+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MSw1LHUsMT4KKyAgMzgzMDY4NjkxMlUsCS8vIDwzLDEsNiwwPjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDEsNiwwLDE+CisgIDI3NTY5NDUxMDNVLAkvLyA8MywxLDYsMT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwxLDYsMSw3PgorICAyMjM2NTQ3OTkwVSwJLy8gPDMsMSw2LDI+OiBDb3N0IDMgdm1yZ2h3IDwzLDYsMCw3PiwgPDEsMiwzLDA+CisgIDM4MjY2MzE5MDVVLAkvLyA8MywxLDYsMz46IENvc3QgNCB2c2xkb2kxMiA8MCwyLDEsMz4sIDwxLDYsMyw3PgorICAzODMwNjg2OTUyVSwJLy8gPDMsMSw2LDQ+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8MSw2LDQsNT4KKyAgMjc1Njk0NTEzOVUsCS8vIDwzLDEsNiw1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDEsNiw1LDc+CisgIDM4MzA2ODY5NzJVLAkvLyA8MywxLDYsNj46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDwxLDYsNiw3PgorICAyODAwMDc2MDMwVSwJLy8gPDMsMSw2LDc+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MSw2LDcsMD4KKyAgMjc1Njk0NTE2NlUsCS8vIDwzLDEsNix1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDEsNix1LDc+CisgIDM2OTkwODEzMThVLAkvLyA8MywxLDcsMD46IENvc3QgNCB2c2xkb2k0IDwxLDMsMSw3PiwgTEhTCisgIDIyOTc5MDUxNjJVLAkvLyA8MywxLDcsMT46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MCwwLDEsMT4KKyAgMjI5NzkwNzM1MFUsCS8vIDwzLDEsNywyPjogQ29zdCAzIHZtcmdsdyA8Miw2LDMsNz4sIDwzLDAsMSwyPgorICAzMzY1Njc1MTgyVSwJLy8gPDMsMSw3LDM+OiBDb3N0IDQgdm1yZ2x3IDwxLDYsMyw3PiwgPDAsMiwxLDM+CisgIDM2OTkwODQ1OThVLAkvLyA8MywxLDcsND46IENvc3QgNCB2c2xkb2k0IDwxLDMsMSw3PiwgUkhTCisgIDIyOTc5MDU0OTBVLAkvLyA8MywxLDcsNT46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MCw0LDEsNT4KKyAgMjI5NzkwNTMyOVUsCS8vIDwzLDEsNyw2PjogQ29zdCAzIHZtcmdsdyA8Miw2LDMsNz4sIDwwLDIsMSw2PgorICAzMzY4MzMwNDQ3VSwJLy8gPDMsMSw3LDc+OiBDb3N0IDQgdm1yZ2x3IDwyLDEsMyw3PiwgPDEsNiwxLDc+CisgIDIyOTc5MDUxNjlVLAkvLyA8MywxLDcsdT46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MCwwLDEsdT4KKyAgMjYxOTM3NTg3NlUsCS8vIDwzLDEsdSwwPjogQ29zdCAzIHZzbGRvaTQgPDAsMywxLHU+LCA8MCwzLDEsdT4KKyAgMTY3ODU1ODAwNFUsCS8vIDwzLDEsdSwxPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDEsMSwxLDE+CisgIDIyODkyODkzNjZVLAkvLyA8MywxLHUsMj46IENvc3QgMyB2bXJnbHcgPDEsMiwzLHU+LCA8MywwLDEsMj4KKyAgMTY3OTAwMDk1NlUsCS8vIDwzLDEsdSwzPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDEsdSwzLDA+CisgIDI2MTkzNzg5OThVLAkvLyA8MywxLHUsND46IENvc3QgMyB2c2xkb2k0IDwwLDMsMSx1PiwgUkhTCisgIDI3NTY5NDUyOTdVLAkvLyA8MywxLHUsNT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwxLHUsNSwzPgorICAyMjk3OTA1MzI5VSwJLy8gPDMsMSx1LDY+OiBDb3N0IDMgdm1yZ2x3IDwyLDYsMyw3PiwgPDAsMiwxLDY+CisgIDI4MDAwNzYxOTJVLAkvLyA8MywxLHUsNz46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwxLHUsNywwPgorICAxNjgzMjAzNDk3VSwJLy8gPDMsMSx1LHU+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8MSx1LHUsMD4KKyAgMzM2Mjk2NDIwM1UsCS8vIDwzLDIsMCwwPjogQ29zdCA0IHZtcmdsdyA8MSwyLDMsMD4sIDwxLDAsMiwwPgorICAyMjg5MjIyMzgwVSwJLy8gPDMsMiwwLDE+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMywwPiwgPDEsMCwyLDE+CisgIDIyODkyMjI0NjJVLAkvLyA8MywyLDAsMj46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDA+LCA8MSwxLDIsMj4KKyAgMTIxNTQ3OTkxMFUsCS8vIDwzLDIsMCwzPjogQ29zdCAyIHZtcmdsdyA8MSwyLDMsMD4sIExIUworICAzMzYyOTY0MjA3VSwJLy8gPDMsMiwwLDQ+OiBDb3N0IDQgdm1yZ2x3IDwxLDIsMywwPiwgPDEsMCwyLDQ+CisgIDIyODkyMjI3MDhVLAkvLyA8MywyLDAsNT46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDA+LCA8MSw0LDIsNT4KKyAgMjIzMjYwMDUwNlUsCS8vIDwzLDIsMCw2PjogQ29zdCAzIHZtcmdodyA8MywwLDEsMj4sIDwyLDYsMyw3PgorICAzMzk2MTQyMjk2VSwJLy8gPDMsMiwwLDc+OiBDb3N0IDQgdm1yZ2x3IDw2LDcsMywwPiwgPDEsNiwyLDc+CisgIDEyMTU0Nzk5MTVVLAkvLyA8MywyLDAsdT46IENvc3QgMiB2bXJnbHcgPDEsMiwzLDA+LCBMSFMKKyAgMzY5OTEwNTg5NFUsCS8vIDwzLDIsMSwwPjogQ29zdCA0IHZzbGRvaTQgPDEsMywyLDE+LCBMSFMKKyAgMzc2NTYzMzg0NFUsCS8vIDwzLDIsMSwxPjogQ29zdCA0IHZzbGRvaTggPDEsMiwzLDI+LCA8MSwxLDEsMT4KKyAgMjY5MTg5MjEyMFUsCS8vIDwzLDIsMSwyPjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDI+LCA8MSwyLDMsMj4KKyAgMjc1MjMwMDU3NVUsCS8vIDwzLDIsMSwzPjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDIsMSwzLDE+CisgIDM2OTkxMDkxNzRVLAkvLyA8MywyLDEsND46IENvc3QgNCB2c2xkb2k0IDwxLDMsMiwxPiwgUkhTCisgIDM4MzA2ODcyODBVLAkvLyA8MywyLDEsNT46IENvc3QgNSB2c2xkb2kxMiBMSFMsIDwyLDEsNSwwPgorICAzODMwNjg3Mjg5VSwJLy8gPDMsMiwxLDY+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8MiwxLDYsMD4KKyAgMzg3NDI2MDU0OFUsCS8vIDwzLDIsMSw3PjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDIsMSw3LDI+CisgIDI3NTI3NDI5ODhVLAkvLyA8MywyLDEsdT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwyLDEsdSwxPgorICAyNjMxMzQ0MjMwVSwJLy8gPDMsMiwyLDA+OiBDb3N0IDMgdnNsZG9pNCA8MiwzLDIsMj4sIExIUworICAyNjk3MjAxMTg0VSwJLy8gPDMsMiwyLDE+OiBDb3N0IDMgdnNsZG9pOCA8MiwxLDMsMj4sIDwyLDEsMywyPgorICAxNjc4NTU4ODI0VSwJLy8gPDMsMiwyLDI+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8MiwyLDIsMj4KKyAgMTY3ODU1ODgzNFUsCS8vIDwzLDIsMiwzPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDIsMiwzLDM+CisgIDI2MzEzNDc1MTBVLAkvLyA8MywyLDIsND46IENvc3QgMyB2c2xkb2k0IDwyLDMsMiwyPiwgUkhTCisgIDMzNjg5NTM2MTNVLAkvLyA8MywyLDIsNT46IENvc3QgNCB2bXJnbHcgPDIsMiwzLDI+LCA8Miw0LDIsNT4KKyAgMjIzNDMwNDQ0MlUsCS8vIDwzLDIsMiw2PjogQ29zdCAzIHZtcmdodyA8MywyLDYsMz4sIDwyLDYsMyw3PgorICAzMzY4OTUzNzc3VSwJLy8gPDMsMiwyLDc+OiBDb3N0IDQgdm1yZ2x3IDwyLDIsMywyPiwgPDIsNiwyLDc+CisgIDE2NzkwMDEyNDdVLAkvLyA8MywyLDIsdT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwyLDIsdSwzPgorICAxNjc4NTU4ODg2VSwJLy8gPDMsMiwzLDA+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8MiwzLDAsMT4KKyAgMjc1MjMwMDcxOVUsCS8vIDwzLDIsMywxPjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDIsMywxLDE+CisgIDI3NTIzMDA3MjlVLAkvLyA8MywyLDMsMj46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwyLDMsMiwyPgorICAxMjIxNDc2NDU0VSwJLy8gPDMsMiwzLDM+OiBDb3N0IDIgdm1yZ2x3IDwyLDIsMywzPiwgTEhTCisgIDE2Nzg1NTg5MjZVLAkvLyA8MywyLDMsND46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwyLDMsNCw1PgorICAyODAwMDc2NTAzVSwJLy8gPDMsMiwzLDU+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MiwzLDUsNT4KKyAgMjIzNDc0NjgxMFUsCS8vIDwzLDIsMyw2PjogQ29zdCAzIHZtcmdodyA8MywzLDMsMz4sIDwyLDYsMyw3PgorICAyODAwMDc2NTE2VSwJLy8gPDMsMiwzLDc+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MiwzLDcsMD4KKyAgMTY3ODU1ODk1OFUsCS8vIDwzLDIsMyx1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDIsMyx1LDE+CisgIDM2OTkxMzA0NzBVLAkvLyA8MywyLDQsMD46IENvc3QgNCB2c2xkb2k0IDwxLDMsMiw0PiwgTEhTCisgIDMzNjI5OTY5NzJVLAkvLyA8MywyLDQsMT46IENvc3QgNCB2bXJnbHcgPDEsMiwzLDQ+LCA8MSwwLDIsMT4KKyAgMjI4OTI1NjA0MFUsCS8vIDwzLDIsNCwyPjogQ29zdCAzIHZtcmdsdyA8MSwyLDMsND4sIDwyLDIsMiwyPgorICAxMjE1NTEyNjc4VSwJLy8gPDMsMiw0LDM+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsMyw0PiwgTEhTCisgIDMzNjI5OTg2NzZVLAkvLyA8MywyLDQsND46IENvc3QgNCB2bXJnbHcgPDEsMiwzLDQ+LCA8MywzLDIsND4KKyAgMjY5MTg5NDU4MlUsCS8vIDwzLDIsNCw1PjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDI+LCBSSFMKKyAgMjIzNTU4MjM5NFUsCS8vIDwzLDIsNCw2PjogQ29zdCAzIHZtcmdodyA8Myw0LDUsNj4sIDwyLDYsMyw3PgorICAzNzM0OTY3NTQ0VSwJLy8gPDMsMiw0LDc+OiBDb3N0IDQgdnNsZG9pNCA8NywzLDIsND4sIDw3LDMsMiw0PgorICAxMjE1NTEyNjgzVSwJLy8gPDMsMiw0LHU+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsMyw0PiwgTEhTCisgIDM3MDUxMTA2MzBVLAkvLyA8MywyLDUsMD46IENvc3QgNCB2c2xkb2k0IDwyLDMsMiw1PiwgTEhTCisgIDMzNjgzMTM5ODVVLAkvLyA8MywyLDUsMT46IENvc3QgNCB2bXJnbHcgPDIsMSwzLDU+LCA8MSw1LDIsMT4KKyAgMzM2ODMxNDQ3MlUsCS8vIDwzLDIsNSwyPjogQ29zdCA0IHZtcmdsdyA8MiwxLDMsNT4sIDwyLDIsMiwyPgorICAyNzU2OTQ1NzY4VSwJLy8gPDMsMiw1LDM+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8Miw1LDMsNj4KKyAgMzcwNTExMzkxMFUsCS8vIDwzLDIsNSw0PjogQ29zdCA0IHZzbGRvaTQgPDIsMywyLDU+LCBSSFMKKyAgMzMxMDA2MTQxNlUsCS8vIDwzLDIsNSw1PjogQ29zdCA0IHZtcmdodyA8Myw1LDYsNj4sIDwyLDUsMyw2PgorICAzMzEwMTM1MjI2VSwJLy8gPDMsMiw1LDY+OiBDb3N0IDQgdm1yZ2h3IDwzLDUsNyw2PiwgPDIsNiwzLDc+CisgIDMzNzAzMDU0NTdVLAkvLyA8MywyLDUsNz46IENvc3QgNSB2bXJnbHcgPDIsNCwzLDU+LCA8Miw2LDIsNz4KKyAgMjc1Mjc0MzMxN1UsCS8vIDwzLDIsNSx1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDIsNSx1LDY+CisgIDI2MzEzNzY5OThVLAkvLyA8MywyLDYsMD46IENvc3QgMyB2c2xkb2k0IDwyLDMsMiw2PiwgTEhTCisgIDM3MDUxMTk1NDBVLAkvLyA8MywyLDYsMT46IENvc3QgNCB2c2xkb2k0IDwyLDMsMiw2PiwgPDEsMSwxLDE+CisgIDI2MzEzNzg2MjFVLAkvLyA8MywyLDYsMj46IENvc3QgMyB2c2xkb2k0IDwyLDMsMiw2PiwgPDIsMywyLDY+CisgIDE2Nzg1NTkxNjJVLAkvLyA8MywyLDYsMz46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwyLDYsMyw3PgorICAyNjMxMzgwMjc4VSwJLy8gPDMsMiw2LDQ+OiBDb3N0IDMgdnNsZG9pNCA8MiwzLDIsNj4sIFJIUworICAzMzcwOTc2OTU2VSwJLy8gPDMsMiw2LDU+OiBDb3N0IDQgdm1yZ2x3IDwyLDUsMyw2PiwgPDIsMywyLDU+CisgIDIyMzcwNjUxNDZVLAkvLyA8MywyLDYsNj46IENvc3QgMyB2bXJnaHcgPDMsNiw3LDc+LCA8Miw2LDMsNz4KKyAgMzc5ODgxNTU5NFUsCS8vIDwzLDIsNiw3PjogQ29zdCA0IHZzbGRvaTggPDYsNywzLDI+LCA8Niw3LDMsMj4KKyAgMTY3OTAwMTU3NVUsCS8vIDwzLDIsNix1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDIsNix1LDc+CisgIDI4MDAwNzY3NzhVLAkvLyA8MywyLDcsMD46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwyLDcsMCwxPgorICAzMzcxNjQ3NzI0VSwJLy8gPDMsMiw3LDE+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMyw3PiwgPDEsMCwyLDE+CisgIDIyOTc5MDY3OTJVLAkvLyA8MywyLDcsMj46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MiwyLDIsMj4KKyAgMTIyNDE2MzQzMFUsCS8vIDwzLDIsNywzPjogQ29zdCAyIHZtcmdsdyA8Miw2LDMsNz4sIExIUworICAzNzA1MTMwMjk0VSwJLy8gPDMsMiw3LDQ+OiBDb3N0IDQgdnNsZG9pNCA8MiwzLDIsNz4sIFJIUworICAzMzcxNjQ4MDUyVSwJLy8gPDMsMiw3LDU+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMyw3PiwgPDEsNCwyLDU+CisgIDIyOTc5MDY4NzdVLAkvLyA8MywyLDcsNj46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MiwzLDIsNj4KKyAgMzM3MTY0ODcwMlUsCS8vIDwzLDIsNyw3PjogQ29zdCA0IHZtcmdsdyA8Miw2LDMsNz4sIDwyLDMsMiw3PgorICAxMjI0MTYzNDM1VSwJLy8gPDMsMiw3LHU+OiBDb3N0IDIgdm1yZ2x3IDwyLDYsMyw3PiwgTEhTCisgIDE2NzkwMDE2NTlVLAkvLyA8MywyLHUsMD46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwyLHUsMCwxPgorICAyNzUyNzQzNDkyVSwJLy8gPDMsMix1LDE+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8Mix1LDEsMT4KKyAgMTY3ODU1ODgyNFUsCS8vIDwzLDIsdSwyPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDIsMiwyLDI+CisgIDE2Nzg1NTkzMjBVLAkvLyA8MywyLHUsMz46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwyLHUsMywzPgorICAxNjc5MDAxNjk5VSwJLy8gPDMsMix1LDQ+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8Mix1LDQsNT4KKyAgMjY5MTg5NzQ5OFUsCS8vIDwzLDIsdSw1PjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDI+LCBSSFMKKyAgMjIzNzkwODkyMlUsCS8vIDwzLDIsdSw2PjogQ29zdCAzIHZtcmdodyA8Myx1LDEsMj4sIDwyLDYsMyw3PgorICAyODAwNTE5Mjg5VSwJLy8gPDMsMix1LDc+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8Mix1LDcsMD4KKyAgMTY3OTAwMTczMVUsCS8vIDwzLDIsdSx1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDIsdSx1LDE+CisgIDEyMTU0ODA3MjZVLAkvLyA8MywzLDAsMD46IENvc3QgMiB2bXJnbHcgPDEsMiwzLDA+LCA8MSwyLDMsMD4KKyAgMTY3ODU1OTM4MlUsCS8vIDwzLDMsMCwxPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDMsMCwxLDI+CisgIDI2MzE0MDMyMDBVLAkvLyA8MywzLDAsMj46IENvc3QgMyB2c2xkb2k0IDwyLDMsMywwPiwgPDIsMywzLDA+CisgIDIyODkyMjMyODJVLAkvLyA8MywzLDAsMz46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDA+LCA8MiwyLDMsMz4KKyAgMjc1MjMwMTIzMlUsCS8vIDwzLDMsMCw0PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDMsMCw0LDE+CisgIDMzNjI5NjUwMjdVLAkvLyA8MywzLDAsNT46IENvc3QgNCB2bXJnbHcgPDEsMiwzLDA+LCA8MiwxLDMsNT4KKyAgMzM2Mjk2NTM1MlUsCS8vIDwzLDMsMCw2PjogQ29zdCA0IHZtcmdsdyA8MSwyLDMsMD4sIDwyLDUsMyw2PgorICAyMjg5MjIzNjEwVSwJLy8gPDMsMywwLDc+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMywwPiwgPDIsNiwzLDc+CisgIDE2Nzg1NTk0NDVVLAkvLyA8MywzLDAsdT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwzLDAsdSwyPgorICAzODMwNjg3OTY0VSwJLy8gPDMsMywxLDA+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8MywxLDAsMD4KKyAgMjc1MjMwMTI4NlUsCS8vIDwzLDMsMSwxPjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDMsMSwxLDE+CisgIDI3NTIzMDEyOTdVLAkvLyA8MywzLDEsMj46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwzLDEsMiwzPgorICAyMzA1MTU3NTMyVSwJLy8gPDMsMywxLDM+OiBDb3N0IDMgdm1yZ2x3IDwzLHUsMywxPiwgPDMsMywzLDM+CisgIDM4MzA2ODgwMDBVLAkvLyA8MywzLDEsND46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDwzLDEsNCwwPgorICAzODMwNjg4MDA5VSwJLy8gPDMsMywxLDU+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8MywxLDUsMD4KKyAgMzgzMDY4ODAxOVUsCS8vIDwzLDMsMSw2PjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDMsMSw2LDE+CisgIDMzNjI5NzM2MjZVLAkvLyA8MywzLDEsNz46IENvc3QgNCB2bXJnbHcgPDEsMiwzLDE+LCA8Miw2LDMsNz4KKyAgMjc1Mjc0MzcxOVUsCS8vIDwzLDMsMSx1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDMsMSx1LDM+CisgIDI2MzE0MTc5NThVLAkvLyA8MywzLDIsMD46IENvc3QgMyB2c2xkb2k0IDwyLDMsMywyPiwgTEhTCisgIDM4MjYwNDMxOTNVLAkvLyA8MywzLDIsMT46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDwzLDIsMSwzPgorICAxNjI0MTMxMTg2VSwJLy8gPDMsMywyLDI+OiBDb3N0IDIgdnNsZG9pOCA8MiwyLDMsMz4sIDwyLDIsMywzPgorICAyNzUyMzAxMzg0VSwJLy8gPDMsMywyLDM+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MywyLDMsMD4KKyAgMjYzMTQyMTIzOFUsCS8vIDwzLDMsMiw0PjogQ29zdCAzIHZzbGRvaTQgPDIsMywzLDI+LCBSSFMKKyAgMzgyNjQ4NTYwMlUsCS8vIDwzLDMsMiw1PjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDMsMiw1LHU+CisgIDI3NTIzMDE0MTRVLAkvLyA8MywzLDIsNj46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwzLDIsNiwzPgorICAyNzcxMjQ5NTE5VSwJLy8gPDMsMywyLDc+OiBDb3N0IDMgdnNsZG9pMTIgPDMsMiw3LDM+LCA8MywyLDcsMz4KKyAgMTYyODExMjk4NFUsCS8vIDwzLDMsMix1PjogQ29zdCAyIHZzbGRvaTggPDIsdSwzLDM+LCA8Mix1LDMsMz4KKyAgMTU2MzY1NjI5NFUsCS8vIDwzLDMsMywwPjogQ29zdCAyIHZzbGRvaTQgPDMsMywzLDM+LCBMSFMKKyAgMjMwMTg1NTkxMVUsCS8vIDwzLDMsMywxPjogQ29zdCAzIHZtcmdsdyA8MywzLDMsMz4sIDwzLDAsMywxPgorICAyNjk3ODczNzMwVSwJLy8gPDMsMywzLDI+OiBDb3N0IDMgdnNsZG9pOCA8MiwyLDMsMz4sIDwzLDIsMiwzPgorICA0MDM0ODg4NzBVLAkvLyA8MywzLDMsMz46IENvc3QgMSB2c3BsdGlzdzMgTEhTCisgIDE1NjM2NTk1NzRVLAkvLyA8MywzLDMsND46IENvc3QgMiB2c2xkb2k0IDwzLDMsMywzPiwgUkhTCisgIDIzMDE4NTYyMzlVLAkvLyA8MywzLDMsNT46IENvc3QgMyB2bXJnbHcgPDMsMywzLDM+LCA8Myw0LDMsNT4KKyAgMjY5Nzg3NDA2N1UsCS8vIDwzLDMsMyw2PjogQ29zdCAzIHZzbGRvaTggPDIsMiwzLDM+LCA8Myw2LDMsNz4KKyAgMjI5NTIyMDE1NFUsCS8vIDwzLDMsMyw3PjogQ29zdCAzIHZtcmdsdyA8MiwyLDMsMz4sIDwyLDYsMyw3PgorICA0MDM0ODg4NzBVLAkvLyA8MywzLDMsdT46IENvc3QgMSB2c3BsdGlzdzMgTEhTCisgIDIyODkyNTUzMThVLAkvLyA8MywzLDQsMD46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDQ+LCA8MSwyLDMsMD4KKyAgMjYzMTQzNTE2MlUsCS8vIDwzLDMsNCwxPjogQ29zdCAzIHZzbGRvaTQgPDIsMywzLDQ+LCA8MSwyLDMsND4KKyAgMjYzMTQzNTk3MlUsCS8vIDwzLDMsNCwyPjogQ29zdCAzIHZzbGRvaTQgPDIsMywzLDQ+LCA8MiwzLDMsND4KKyAgMjI4OTI1NjA1MFUsCS8vIDwzLDMsNCwzPjogQ29zdCAzIHZtcmdsdyA8MSwyLDMsND4sIDwyLDIsMywzPgorICAxMjE1NTEzNDk4VSwJLy8gPDMsMyw0LDQ+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsMyw0PiwgPDEsMiwzLDQ+CisgIDE2NzkwMDIxMTRVLAkvLyA8MywzLDQsNT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwzLDQsNSw2PgorICAzMzYyOTk4MTIwVSwJLy8gPDMsMyw0LDY+OiBDb3N0IDQgdm1yZ2x3IDwxLDIsMyw0PiwgPDIsNSwzLDY+CisgIDIyODkyNTYzNzhVLAkvLyA8MywzLDQsNz46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDQ+LCA8Miw2LDMsNz4KKyAgMTY3OTAwMjE0MVUsCS8vIDwzLDMsNCx1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDMsNCx1LDY+CisgIDM4MzExMzA2NTdVLAkvLyA8MywzLDUsMD46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDwzLDUsMCwxPgorICAzMzc2Mjc3NjcxVSwJLy8gPDMsMyw1LDE+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsMyw1PiwgPDMsMCwzLDE+CisgIDM3NzE2MTcwMTJVLAkvLyA8MywzLDUsMj46IENvc3QgNCB2c2xkb2k4IDwyLDIsMywzPiwgPDUsMiwyLDM+CisgIDIzMDI1MzYwOTJVLAkvLyA8MywzLDUsMz46IENvc3QgMyB2bXJnbHcgPDMsNCwzLDU+LCA8MywzLDMsMz4KKyAgMzgzMTEzMDY5N1UsCS8vIDwzLDMsNSw0PjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDMsNSw0LDU+CisgIDIyOTQ1NzI1NzlVLAkvLyA8MywzLDUsNT46IENvc3QgMyB2bXJnbHcgPDIsMSwzLDU+LCA8MiwxLDMsNT4KKyAgMjgwMDUxOTc3M1UsCS8vIDwzLDMsNSw2PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDMsNSw2LDc+CisgIDMzNjgzMTQ4MTBVLAkvLyA8MywzLDUsNz46IENvc3QgNCB2bXJnbHcgPDIsMSwzLDU+LCA8Miw2LDMsNz4KKyAgMjgwMDUxOTc5MVUsCS8vIDwzLDMsNSx1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDMsNSx1LDc+CisgIDI4MDAwNzc0MzJVLAkvLyA8MywzLDYsMD46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwzLDYsMCw3PgorICAzMzEwMjkxMTg1VSwJLy8gPDMsMyw2LDE+OiBDb3N0IDQgdm1yZ2h3IDwzLDYsMCw3PiwgPDMsMSwyLDM+CisgIDI3ODkxNjU3MDZVLAkvLyA8MywzLDYsMj46IENvc3QgMyB2c2xkb2kxMiA8NiwyLDcsMz4sIDwzLDYsMiw3PgorICAyNzY0OTgyOTMxVSwJLy8gPDMsMyw2LDM+OiBDb3N0IDMgdnNsZG9pMTIgPDIsMiwzLDM+LCA8Myw2LDMsNz4KKyAgMjgwMDA3NzQ2OFUsCS8vIDwzLDMsNiw0PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDMsNiw0LDc+CisgIDM4NzM4MTkzMDFVLAkvLyA8MywzLDYsNT46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDwzLDYsNSw3PgorICAyMjk3MjM1MzA0VSwJLy8gPDMsMyw2LDY+OiBDb3N0IDMgdm1yZ2x3IDwyLDUsMyw2PiwgPDIsNSwzLDY+CisgIDI3MjUwODE5NjNVLAkvLyA8MywzLDYsNz46IENvc3QgMyB2c2xkb2k4IDw2LDcsMywzPiwgPDYsNywzLDM+CisgIDI3MjU3NDU1OTZVLAkvLyA8MywzLDYsdT46IENvc3QgMyB2c2xkb2k4IDw2LHUsMywzPiwgPDYsdSwzLDM+CisgIDI2MzE0NTg5MThVLAkvLyA8MywzLDcsMD46IENvc3QgMyB2c2xkb2k0IDwyLDMsMyw3PiwgTEhTCisgIDM3MDUyMDE0NjBVLAkvLyA8MywzLDcsMT46IENvc3QgNCB2c2xkb2k0IDwyLDMsMyw3PiwgPDEsMSwxLDE+CisgIDI2MzE0NjA1NTFVLAkvLyA8MywzLDcsMj46IENvc3QgMyB2c2xkb2k0IDwyLDMsMyw3PiwgPDIsMywzLDc+CisgIDIyOTc5MDY4MDJVLAkvLyA8MywzLDcsMz46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MiwyLDMsMz4KKyAgMjYzMTQ2MjE5OFUsCS8vIDwzLDMsNyw0PjogQ29zdCAzIHZzbGRvaTQgPDIsMywzLDc+LCBSSFMKKyAgMzM3MTY0ODU0N1UsCS8vIDwzLDMsNyw1PjogQ29zdCA0IHZtcmdsdyA8Miw2LDMsNz4sIDwyLDEsMyw1PgorICAzMzcxNjQ4NTQ4VSwJLy8gPDMsMyw3LDY+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMyw3PiwgPDIsMSwzLDY+CisgIDEyMjQxNjUzMDZVLAkvLyA8MywzLDcsNz46IENvc3QgMiB2bXJnbHcgPDIsNiwzLDc+LCA8Miw2LDMsNz4KKyAgMTIyNDE2NTMwNlUsCS8vIDwzLDMsNyx1PjogQ29zdCAyIHZtcmdsdyA8Miw2LDMsNz4sIDwyLDYsMyw3PgorICAxMjE1NDgwNzI2VSwJLy8gPDMsMyx1LDA+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsMywwPiwgPDEsMiwzLDA+CisgIDE2NzkwMDIzOThVLAkvLyA8MywzLHUsMT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwzLHUsMSwyPgorICAxNjU5OTY3MzY4VSwJLy8gPDMsMyx1LDI+OiBDb3N0IDIgdnNsZG9pOCA8dSwyLDMsMz4sIDx1LDIsMywzPgorICA0MDM0ODg4NzBVLAkvLyA8MywzLHUsMz46IENvc3QgMSB2c3BsdGlzdzMgTEhTCisgIDE1NjM2NTk1NzRVLAkvLyA8MywzLHUsND46IENvc3QgMiB2c2xkb2k0IDwzLDMsMywzPiwgUkhTCisgIDE2NzkwMDI0MzhVLAkvLyA8MywzLHUsNT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwzLHUsNSw2PgorICAyNzU2OTQ2NzY0VSwJLy8gPDMsMyx1LDY+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8Myx1LDYsMz4KKyAgMTIyNDE2NTMwNlUsCS8vIDwzLDMsdSw3PjogQ29zdCAyIHZtcmdsdyA8Miw2LDMsNz4sIDwyLDYsMyw3PgorICA0MDM0ODg4NzBVLAkvLyA8MywzLHUsdT46IENvc3QgMSB2c3BsdGlzdzMgTEhTCisgIDI2OTE5MDc1ODRVLAkvLyA8Myw0LDAsMD46IENvc3QgMyB2c2xkb2k4IDwxLDIsMyw0PiwgPDAsMCwwLDA+CisgIDE2MTgxNjU4NjJVLAkvLyA8Myw0LDAsMT46IENvc3QgMiB2c2xkb2k4IDwxLDIsMyw0PiwgTEhTCisgIDI2MzE0NzY5MzdVLAkvLyA8Myw0LDAsMj46IENvc3QgMyB2c2xkb2k0IDwyLDMsNCwwPiwgPDIsMyw0LDA+CisgIDIyMzI2MDE3MzJVLAkvLyA8Myw0LDAsMz46IENvc3QgMyB2bXJnaHcgPDMsMCwxLDI+LCA8NCwzLDUsMD4KKyAgMjY5MTkwNzkyMlUsCS8vIDwzLDQsMCw0PjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDQ+LCA8MCw0LDEsNT4KKyAgMTE1ODg2MDA4NlUsCS8vIDwzLDQsMCw1PjogQ29zdCAyIHZtcmdodyA8MywwLDEsMj4sIFJIUworICAzMzA2MzQzODA2VSwJLy8gPDMsNCwwLDY+OiBDb3N0IDQgdm1yZ2h3IDwzLDAsMSwyPiwgPDQsNiw1LDc+CisgIDMzNjY5NDc0ODRVLAkvLyA8Myw0LDAsNz46IENvc3QgNCB2bXJnbHcgPDEsdSwzLDA+LCA8Myw2LDQsNz4KKyAgMTYxODE2NjQyOVUsCS8vIDwzLDQsMCx1PjogQ29zdCAyIHZzbGRvaTggPDEsMiwzLDQ+LCBMSFMKKyAgMjYzMTQ4MzQ5NFUsCS8vIDwzLDQsMSwwPjogQ29zdCAzIHZzbGRvaTQgPDIsMyw0LDE+LCBMSFMKKyAgMjY5MTkwODQwNFUsCS8vIDwzLDQsMSwxPjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDQ+LCA8MSwxLDEsMT4KKyAgMTYxODE2NjY4MlUsCS8vIDwzLDQsMSwyPjogQ29zdCAyIHZzbGRvaTggPDEsMiwzLDQ+LCA8MSwyLDMsND4KKyAgMzc2NTY1MDM5M1UsCS8vIDwzLDQsMSwzPjogQ29zdCA0IHZzbGRvaTggPDEsMiwzLDQ+LCA8MSwzLDEsND4KKyAgMjYzMTQ4Njc3NFUsCS8vIDwzLDQsMSw0PjogQ29zdCAzIHZzbGRvaTQgPDIsMyw0LDE+LCBSSFMKKyAgMjc1Njk0NjkxNFUsCS8vIDwzLDQsMSw1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDQsMSw1LDA+CisgIDM3NjU2NTA2MzlVLAkvLyA8Myw0LDEsNj46IENvc3QgNCB2c2xkb2k4IDwxLDIsMyw0PiwgPDEsNiwxLDc+CisgIDM3MzUwOTA0MzlVLAkvLyA8Myw0LDEsNz46IENvc3QgNCB2c2xkb2k0IDw3LDMsNCwxPiwgPDcsMyw0LDE+CisgIDE2MjIxNDg0ODBVLAkvLyA8Myw0LDEsdT46IENvc3QgMiB2c2xkb2k4IDwxLHUsMyw0PiwgPDEsdSwzLDQ+CisgIDM3NjU2NTA4OTNVLAkvLyA8Myw0LDIsMD46IENvc3QgNCB2c2xkb2k4IDwxLDIsMyw0PiwgPDIsMCwzLDA+CisgIDM4MzExMzExNTRVLAkvLyA8Myw0LDIsMT46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDw0LDIsMSwzPgorICAyNjkxOTA5MjI0VSwJLy8gPDMsNCwyLDI+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsND4sIDwyLDIsMiwyPgorICAyNjkxOTA5Mjg2VSwJLy8gPDMsNCwyLDM+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsND4sIDwyLDMsMCwxPgorICAyNjk5MjA4NDY5VSwJLy8gPDMsNCwyLDQ+OiBDb3N0IDMgdnNsZG9pOCA8Miw0LDMsND4sIDwyLDQsMyw0PgorICAyMjMzODYzNDc4VSwJLy8gPDMsNCwyLDU+OiBDb3N0IDMgdm1yZ2h3IDwzLDIsMCwzPiwgUkhTCisgIDI2OTE5MDk1NjJVLAkvLyA8Myw0LDIsNj46IENvc3QgMyB2c2xkb2k4IDwxLDIsMyw0PiwgPDIsNiwzLDc+CisgIDI3MDExOTkzNjhVLAkvLyA8Myw0LDIsNz46IENvc3QgMyB2c2xkb2k4IDwyLDcsMyw0PiwgPDIsNywzLDQ+CisgIDI2OTE5MDk2OTFVLAkvLyA8Myw0LDIsdT46IENvc3QgMyB2c2xkb2k4IDwxLDIsMyw0PiwgPDIsdSwwLDE+CisgIDI2OTE5MDk3ODJVLAkvLyA8Myw0LDMsMD46IENvc3QgMyB2c2xkb2k4IDwxLDIsMyw0PiwgPDMsMCwxLDI+CisgIDM3NjU2NTE2ODZVLAkvLyA8Myw0LDMsMT46IENvc3QgNCB2c2xkb2k4IDwxLDIsMyw0PiwgPDMsMSwxLDE+CisgIDI2OTE5MDk5NzJVLAkvLyA8Myw0LDMsMj46IENvc3QgMyB2c2xkb2k4IDwxLDIsMyw0PiwgPDMsMiw0LDM+CisgIDI2OTE5MTAwNDRVLAkvLyA8Myw0LDMsMz46IENvc3QgMyB2c2xkb2k4IDwxLDIsMyw0PiwgPDMsMywzLDM+CisgIDI2OTE5MTAwOTZVLAkvLyA8Myw0LDMsND46IENvc3QgMyB2c2xkb2k4IDwxLDIsMyw0PiwgPDMsNCwwLDE+CisgIDExNjEwMDYzOTBVLAkvLyA8Myw0LDMsNT46IENvc3QgMiB2bXJnaHcgPDMsMywzLDM+LCBSSFMKKyAgMjY5MTkxMDMwMFUsCS8vIDwzLDQsMyw2PjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDQ+LCA8Myw2LDQsNz4KKyAgMzM2ODk2MjcxNlUsCS8vIDwzLDQsMyw3PjogQ29zdCA0IHZtcmdsdyA8MiwyLDMsMz4sIDwzLDYsNCw3PgorICAxMTYxMDA2NjMzVSwJLy8gPDMsNCwzLHU+OiBDb3N0IDIgdm1yZ2h3IDwzLDMsMywzPiwgUkhTCisgIDI2MzE1MDgwNzBVLAkvLyA8Myw0LDQsMD46IENvc3QgMyB2c2xkb2k0IDwyLDMsNCw0PiwgTEhTCisgIDI2MzE1MDg4OTBVLAkvLyA8Myw0LDQsMT46IENvc3QgMyB2c2xkb2k0IDwyLDMsNCw0PiwgPDEsMiwzLDQ+CisgIDI2MzE1MDk3MDlVLAkvLyA8Myw0LDQsMj46IENvc3QgMyB2c2xkb2k0IDwyLDMsNCw0PiwgPDIsMyw0LDQ+CisgIDIyODkyNTY3ODhVLAkvLyA8Myw0LDQsMz46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDQ+LCA8MywyLDQsMz4KKyAgMTcyNjMzNjIwOFUsCS8vIDwzLDQsNCw0PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDQsNCw0LDQ+CisgIDE2MTgxNjkxNDJVLAkvLyA8Myw0LDQsNT46IENvc3QgMiB2c2xkb2k4IDwxLDIsMyw0PiwgUkhTCisgIDMzNjI5OTg4NThVLAkvLyA8Myw0LDQsNj46IENvc3QgNCB2bXJnbHcgPDEsMiwzLDQ+LCA8Myw1LDQsNj4KKyAgMjI4OTI1NzExNlUsCS8vIDwzLDQsNCw3PjogQ29zdCAzIHZtcmdsdyA8MSwyLDMsND4sIDwzLDYsNCw3PgorICAxNjE4MTY5Mzg1VSwJLy8gPDMsNCw0LHU+OiBDb3N0IDIgdnNsZG9pOCA8MSwyLDMsND4sIFJIUworICAxNTU3Nzc0NDM4VSwJLy8gPDMsNCw1LDA+OiBDb3N0IDIgdnNsZG9pNCA8MiwzLDQsNT4sIExIUworICAyNjMxNTE2OTgwVSwJLy8gPDMsNCw1LDE+OiBDb3N0IDMgdnNsZG9pNCA8MiwzLDQsNT4sIDwxLDEsMSwxPgorICAxNTU3Nzc2MDc4VSwJLy8gPDMsNCw1LDI+OiBDb3N0IDIgdnNsZG9pNCA8MiwzLDQsNT4sIDwyLDMsNCw1PgorICAyNjMxNTE4MzU4VSwJLy8gPDMsNCw1LDM+OiBDb3N0IDMgdnNsZG9pNCA8MiwzLDQsNT4sIDwzLDAsMSwyPgorICAxNTU3Nzc3NzE4VSwJLy8gPDMsNCw1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8MiwzLDQsNT4sIFJIUworICAyMjk2NTYzNDA2VSwJLy8gPDMsNCw1LDU+OiBDb3N0IDMgdm1yZ2x3IDwyLDQsMyw1PiwgPDIsMyw0LDU+CisgIDYwNDgxODc0MlUsCS8vIDwzLDQsNSw2PjogQ29zdCAxIHZzbGRvaTEyIExIUywgUkhTCisgIDI2NjEzODEzODdVLAkvLyA8Myw0LDUsNz46IENvc3QgMyB2c2xkb2k0IDw3LDMsNCw1PiwgPDcsMyw0LDU+CisgIDYwNDgxODc2MFUsCS8vIDwzLDQsNSx1PjogQ29zdCAxIHZzbGRvaTEyIExIUywgUkhTCisgIDM3MDUyNjYyNzhVLAkvLyA8Myw0LDYsMD46IENvc3QgNCB2c2xkb2k0IDwyLDMsNCw2PiwgTEhTCisgIDM4MzExMzE0ODJVLAkvLyA8Myw0LDYsMT46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDw0LDYsMSw3PgorICAyNzMzNzE1OTYyVSwJLy8gPDMsNCw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8dSwyLDMsND4sIDw2LDIsNywzPgorICAzODQ0NzcxMTgwVSwJLy8gPDMsNCw2LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDMsMiw0LDM+LCA8NCw2LDMsNz4KKyAgMjgwMDA3ODE5N1UsCS8vIDwzLDQsNiw0PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDQsNiw0LDc+CisgIDIyMzY1NTA0NTRVLAkvLyA8Myw0LDYsNT46IENvc3QgMyB2bXJnaHcgPDMsNiwwLDc+LCBSSFMKKyAgMjczMzcxNjI4MFUsCS8vIDwzLDQsNiw2PjogQ29zdCAzIHZzbGRvaTggPHUsMiwzLDQ+LCA8Niw2LDYsNj4KKyAgMjcyNTA5MDE1NlUsCS8vIDwzLDQsNiw3PjogQ29zdCAzIHZzbGRvaTggPDYsNywzLDQ+LCA8Niw3LDMsND4KKyAgMjIzNjU1MDY5N1UsCS8vIDwzLDQsNix1PjogQ29zdCAzIHZtcmdodyA8Myw2LDAsNz4sIFJIUworICAyNzMzNzE2NDc0VSwJLy8gPDMsNCw3LDA+OiBDb3N0IDMgdnNsZG9pOCA8dSwyLDMsND4sIDw3LDAsMSwyPgorICAzMzcxNjQ3MDEzVSwJLy8gPDMsNCw3LDE+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMyw3PiwgPDAsMCw0LDE+CisgIDI3Mjc3NDQ2ODhVLAkvLyA8Myw0LDcsMj46IENvc3QgMyB2c2xkb2k4IDw3LDIsMyw0PiwgPDcsMiwzLDQ+CisgIDMzNzE2NDkzNjRVLAkvLyA8Myw0LDcsMz46IENvc3QgNCB2bXJnbHcgPDIsNiwzLDc+LCA8MywyLDQsMz4KKyAgMjczMzcxNjgzOFUsCS8vIDwzLDQsNyw0PjogQ29zdCAzIHZzbGRvaTggPHUsMiwzLDQ+LCA8Nyw0LDUsNj4KKyAgMjI5NzkwNjg5NFUsCS8vIDwzLDQsNyw1PjogQ29zdCAzIHZtcmdsdyA8Miw2LDMsNz4sIDwyLDMsNCw1PgorICAzMzcxNjQ3MTgwVSwJLy8gPDMsNCw3LDY+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMyw3PiwgPDAsMiw0LDY+CisgIDI3MzM3MTcxMDBVLAkvLyA8Myw0LDcsNz46IENvc3QgMyB2c2xkb2k4IDx1LDIsMyw0PiwgPDcsNyw3LDc+CisgIDIyOTc5MDY4OTdVLAkvLyA8Myw0LDcsdT46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MiwzLDQsdT4KKyAgMTU1Nzc5OTAxNFUsCS8vIDwzLDQsdSwwPjogQ29zdCAyIHZzbGRvaTQgPDIsMyw0LHU+LCBMSFMKKyAgMTYxODE3MTY5NFUsCS8vIDwzLDQsdSwxPjogQ29zdCAyIHZzbGRvaTggPDEsMiwzLDQ+LCBMSFMKKyAgMTU1NzgwMDY1N1UsCS8vIDwzLDQsdSwyPjogQ29zdCAyIHZzbGRvaTQgPDIsMyw0LHU+LCA8MiwzLDQsdT4KKyAgMjY5MTkxMzY2MFUsCS8vIDwzLDQsdSwzPjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDQ+LCA8dSwzLDAsMT4KKyAgMTU1NzgwMjI5NFUsCS8vIDwzLDQsdSw0PjogQ29zdCAyIHZzbGRvaTQgPDIsMyw0LHU+LCBSSFMKKyAgMTYxODE3MjA1OFUsCS8vIDwzLDQsdSw1PjogQ29zdCAyIHZzbGRvaTggPDEsMiwzLDQ+LCBSSFMKKyAgNjA0ODE4OTg1VSwJLy8gPDMsNCx1LDY+OiBDb3N0IDEgdnNsZG9pMTIgTEhTLCBSSFMKKyAgMjY2MTQwNTk2NlUsCS8vIDwzLDQsdSw3PjogQ29zdCAzIHZzbGRvaTQgPDcsMyw0LHU+LCA8NywzLDQsdT4KKyAgNjA0ODE5MDAzVSwJLy8gPDMsNCx1LHU+OiBDb3N0IDEgdnNsZG9pMTIgTEhTLCBSSFMKKyAgMjY0MzQ5Mjk2NlUsCS8vIDwzLDUsMCwwPjogQ29zdCAzIHZzbGRvaTQgPDQsMyw1LDA+LCBMSFMKKyAgMjc1Njk0NzUyOFUsCS8vIDwzLDUsMCwxPjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDUsMCwxLDI+CisgIDIzMzEwMjkwMTlVLAkvLyA8Myw1LDAsMj46IENvc3QgMyB2bXJnbHcgPHUsMiwzLDA+LCA8NCx1LDUsMj4KKyAgMjY0MzQ5NTA2MlUsCS8vIDwzLDUsMCwzPjogQ29zdCAzIHZzbGRvaTQgPDQsMyw1LDA+LCA8MywwLDEsMj4KKyAgMjc1Njk0NzU1NFUsCS8vIDwzLDUsMCw0PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDUsMCw0LDE+CisgIDI4MDAwNzg0NDNVLAkvLyA8Myw1LDAsNT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw1LDAsNSwxPgorICAyMjg5MjI0MTk0VSwJLy8gPDMsNSwwLDY+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMywwPiwgPDMsNCw1LDY+CisgIDMzNjI5NjQ3MjNVLAkvLyA8Myw1LDAsNz46IENvc3QgNCB2bXJnbHcgPDEsMiwzLDA+LCA8MSw2LDUsNz4KKyAgMjc1Njk0NzU5MFUsCS8vIDwzLDUsMCx1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDUsMCx1LDE+CisgIDI4MDAwNzg0NzlVLAkvLyA8Myw1LDEsMD46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw1LDEsMCwxPgorICAyMzMzMDI3MjE4VSwJLy8gPDMsNSwxLDE+OiBDb3N0IDMgdm1yZ2x3IDx1LDUsMywxPiwgPDQsMCw1LDE+CisgIDI2OTE5MTY2OTlVLAkvLyA8Myw1LDEsMj46IENvc3QgMyB2c2xkb2k4IDwxLDIsMyw1PiwgPDEsMiwzLDU+CisgIDM4MzI5MDEyOTRVLAkvLyA8Myw1LDEsMz46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDUsMz4sIDw1LDEsMyw1PgorICAyODAwMDc4NTE5VSwJLy8gPDMsNSwxLDQ+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8NSwxLDQsNT4KKyAgMzgzMDY4OTQ2N1UsCS8vIDwzLDUsMSw1PjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDUsMSw1LDA+CisgIDM4MzA2ODk0ODFVLAkvLyA8Myw1LDEsNj46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDw1LDEsNiw1PgorICAzODczODIwMzY1VSwJLy8gPDMsNSwxLDc+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8NSwxLDcsMD4KKyAgMjgwMDA3ODU1MVUsCS8vIDwzLDUsMSx1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDUsMSx1LDE+CisgIDM3NzA5Njc0ODdVLAkvLyA8Myw1LDIsMD46IENvc3QgNCB2c2xkb2k4IDwyLDEsMyw1PiwgPDIsMCwxLDQ+CisgIDI2OTcyMjU3NjNVLAkvLyA8Myw1LDIsMT46IENvc3QgMyB2c2xkb2k4IDwyLDEsMyw1PiwgPDIsMSwzLDU+CisgIDM4MzA2ODk1MjNVLAkvLyA8Myw1LDIsMj46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDw1LDIsMiwyPgorICAyNjk5MjE2NTkwVSwJLy8gPDMsNSwyLDM+OiBDb3N0IDMgdnNsZG9pOCA8Miw0LDMsNT4sIDwyLDMsNCw1PgorICAyNjk5MjE2NjYyVSwJLy8gPDMsNSwyLDQ+OiBDb3N0IDMgdnNsZG9pOCA8Miw0LDMsNT4sIDwyLDQsMyw1PgorICAyNzgzMDQ3NDM5VSwJLy8gPDMsNSwyLDU+OiBDb3N0IDMgdnNsZG9pMTIgPDUsMiw1LDM+LCA8NSwyLDUsMz4KKyAgMjc4MzEyMTE3NlUsCS8vIDwzLDUsMiw2PjogQ29zdCAzIHZzbGRvaTEyIDw1LDIsNiwzPiwgPDUsMiw2LDM+CisgIDM4NTY5MzY3MzdVLAkvLyA8Myw1LDIsNz46IENvc3QgNCB2c2xkb2kxMiA8NSwyLDcsMz4sIDw1LDIsNywzPgorICAyNzAxODcxMTk0VSwJLy8gPDMsNSwyLHU+OiBDb3N0IDMgdnNsZG9pOCA8Mix1LDMsNT4sIDwyLHUsMyw1PgorICAyNjQzNTE3NTQyVSwJLy8gPDMsNSwzLDA+OiBDb3N0IDMgdnNsZG9pNCA8NCwzLDUsMz4sIExIUworICAyMzMxMDUyOTQ2VSwJLy8gPDMsNSwzLDE+OiBDb3N0IDMgdm1yZ2x3IDx1LDIsMywzPiwgPDQsMCw1LDE+CisgIDM2OTkzNDUwMTBVLAkvLyA8Myw1LDMsMj46IENvc3QgNCB2c2xkb2k0IDwxLDMsNSwzPiwgPDIsMiwzLDM+CisgIDI3MDUxODkyNzZVLAkvLyA8Myw1LDMsMz46IENvc3QgMyB2c2xkb2k4IDwzLDQsMyw1PiwgPDMsMywzLDM+CisgIDI3MDUxODkzNTlVLAkvLyA8Myw1LDMsND46IENvc3QgMyB2c2xkb2k4IDwzLDQsMyw1PiwgPDMsNCwzLDU+CisgIDIzMzEwNTMyNzRVLAkvLyA8Myw1LDMsNT46IENvc3QgMyB2bXJnbHcgPHUsMiwzLDM+LCA8NCw0LDUsNT4KKyAgMjI5NTIyMDczOFUsCS8vIDwzLDUsMyw2PjogQ29zdCAzIHZtcmdsdyA8MiwyLDMsMz4sIDwzLDQsNSw2PgorICAzMzY4OTYxMjY3VSwJLy8gPDMsNSwzLDc+OiBDb3N0IDQgdm1yZ2x3IDwyLDIsMywzPiwgPDEsNiw1LDc+CisgIDIyOTUyMjA3NDBVLAkvLyA8Myw1LDMsdT46IENvc3QgMyB2bXJnbHcgPDIsMiwzLDM+LCA8Myw0LDUsdT4KKyAgMjY0MzUyNTczNFUsCS8vIDwzLDUsNCwwPjogQ29zdCAzIHZzbGRvaTQgPDQsMyw1LDQ+LCBMSFMKKyAgMjMzMTA2MTEzOFUsCS8vIDwzLDUsNCwxPjogQ29zdCAzIHZtcmdsdyA8dSwyLDMsND4sIDw0LDAsNSwxPgorICAyMjM1NTg0MjgwVSwJLy8gPDMsNSw0LDI+OiBDb3N0IDMgdm1yZ2h3IDwzLDQsNSw2PiwgPDUsMiw2LDM+CisgIDI2NDM1MjgxOTRVLAkvLyA8Myw1LDQsMz46IENvc3QgMyB2c2xkb2k0IDw0LDMsNSw0PiwgPDMsNCw1LDY+CisgIDI3MzU3MTM0OThVLAkvLyA8Myw1LDQsND46IENvc3QgMyB2c2xkb2k4IDx1LDUsMyw1PiwgPDQsNCw1LDU+CisgIDI3NTY5NDc4OTJVLAkvLyA8Myw1LDQsNT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw1LDQsNSw2PgorICAyMjg5MjU2OTYyVSwJLy8gPDMsNSw0LDY+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMyw0PiwgPDMsNCw1LDY+CisgIDMzNjI5OTc0OTFVLAkvLyA8Myw1LDQsNz46IENvc3QgNCB2bXJnbHcgPDEsMiwzLDQ+LCA8MSw2LDUsNz4KKyAgMjc1Njk0NzkxOVUsCS8vIDwzLDUsNCx1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDUsNCx1LDY+CisgIDI4MDAwNzg4MDNVLAkvLyA8Myw1LDUsMD46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw1LDUsMCwxPgorICAyODAwMDc4ODEyVSwJLy8gPDMsNSw1LDE+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8NSw1LDEsMT4KKyAgMjYzMTU5MTYzOVUsCS8vIDwzLDUsNSwyPjogQ29zdCAzIHZzbGRvaTQgPDIsMyw1LDU+LCA8MiwzLDUsNT4KKyAgMzgzMjkwMTYxNlUsCS8vIDwzLDUsNSwzPjogQ29zdCA0IHZzbGRvaTEyIDwxLDIsNSwzPiwgPDUsNSwzLDM+CisgIDI4MDAwNzg4NDNVLAkvLyA8Myw1LDUsND46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw1LDUsNCw1PgorICAxNzI2MzM3MDI4VSwJLy8gPDMsNSw1LDU+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8NSw1LDUsNT4KKyAgMjgwMDA3ODg2MlUsCS8vIDwzLDUsNSw2PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDUsNSw2LDY+CisgIDMzNjgzMTQwOTlVLAkvLyA8Myw1LDUsNz46IENvc3QgNCB2bXJnbHcgPDIsMSwzLDU+LCA8MSw2LDUsNz4KKyAgMTcyNjMzNzAyOFUsCS8vIDwzLDUsNSx1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDUsNSw1LDU+CisgIDI4MDAwNzg4ODRVLAkvLyA8Myw1LDYsMD46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw1LDYsMCwxPgorICAyODAwMDc4ODk5VSwJLy8gPDMsNSw2LDE+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8NSw2LDEsNz4KKyAgMjYzMTU5OTgzMlUsCS8vIDwzLDUsNiwyPjogQ29zdCAzIHZzbGRvaTQgPDIsMyw1LDY+LCA8MiwzLDUsNj4KKyAgMjgwMDA3ODkxNFUsCS8vIDwzLDUsNiwzPjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDUsNiwzLDQ+CisgIDI4MDAwNzg5MjRVLAkvLyA8Myw1LDYsND46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw1LDYsNCw1PgorICAyODAwMDc4OTM1VSwJLy8gPDMsNSw2LDU+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8NSw2LDUsNz4KKyAgMjI5NzIzNTk3MFUsCS8vIDwzLDUsNiw2PjogQ29zdCAzIHZtcmdsdyA8Miw1LDMsNj4sIDwzLDQsNSw2PgorICAxNzI2MzM3MTIyVSwJLy8gPDMsNSw2LDc+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8NSw2LDcsMD4KKyAgMTcyNjMzNzEzMVUsCS8vIDwzLDUsNix1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDUsNix1LDA+CisgIDM2OTkzNzYyMzBVLAkvLyA8Myw1LDcsMD46IENvc3QgNCB2c2xkb2k0IDwxLDMsNSw3PiwgTEhTCisgIDIzMzM3Mzk5MjJVLAkvLyA8Myw1LDcsMT46IENvc3QgMyB2bXJnbHcgPHUsNiwzLDc+LCA8NCwwLDUsMT4KKyAgMzY5OTM3ODEwNlUsCS8vIDwzLDUsNywyPjogQ29zdCA0IHZzbGRvaTQgPDEsMyw1LDc+LCA8Miw2LDMsNz4KKyAgMzM3MTY0NzkxNVUsCS8vIDwzLDUsNywzPjogQ29zdCA0IHZtcmdsdyA8Miw2LDMsNz4sIDwxLDIsNSwzPgorICAzNjk5Mzc5NTEwVSwJLy8gPDMsNSw3LDQ+OiBDb3N0IDQgdnNsZG9pNCA8MSwzLDUsNz4sIFJIUworICAyMzMzNzQwMjUwVSwJLy8gPDMsNSw3LDU+OiBDb3N0IDMgdm1yZ2x3IDx1LDYsMyw3PiwgPDQsNCw1LDU+CisgIDIyOTc5MDc3MTRVLAkvLyA8Myw1LDcsNj46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8Myw0LDUsNj4KKyAgMzM3MDk4NDY5MVUsCS8vIDwzLDUsNyw3PjogQ29zdCA0IHZtcmdsdyA8Miw1LDMsNz4sIDwxLDYsNSw3PgorICAyMjk3OTA3NzE2VSwJLy8gPDMsNSw3LHU+OiBDb3N0IDMgdm1yZ2x3IDwyLDYsMyw3PiwgPDMsNCw1LHU+CisgIDI4MDAwNzkwNDZVLAkvLyA8Myw1LHUsMD46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw1LHUsMCwxPgorICAyNzU2OTQ4MTc2VSwJLy8gPDMsNSx1LDE+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8NSx1LDEsMj4KKyAgMjMzMTAyOTAxOVUsCS8vIDwzLDUsdSwyPjogQ29zdCAzIHZtcmdsdyA8dSwyLDMsMD4sIDw0LHUsNSwyPgorICAyODAwMDc5MDc2VSwJLy8gPDMsNSx1LDM+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8NSx1LDMsND4KKyAgMjgwMDA3OTA4NVUsCS8vIDwzLDUsdSw0PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDUsdSw0LDQ+CisgIDE3MjYzMzcwMjhVLAkvLyA8Myw1LHUsNT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDw1LDUsNSw1PgorICAyMjg5Mjg5NzMwVSwJLy8gPDMsNSx1LDY+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMyx1PiwgPDMsNCw1LDY+CisgIDE3MjYzMzcyODRVLAkvLyA8Myw1LHUsNz46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDw1LHUsNywwPgorICAxNzI2MzM3MjkzVSwJLy8gPDMsNSx1LHU+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8NSx1LHUsMD4KKyAgMzc3MzYyODQxNlUsCS8vIDwzLDYsMCwwPjogQ29zdCA0IHZzbGRvaTggPDIsNSwzLDY+LCA8MCwwLDAsMD4KKyAgMjY5OTg4NjY5NFUsCS8vIDwzLDYsMCwxPjogQ29zdCAzIHZzbGRvaTggPDIsNSwzLDY+LCBMSFMKKyAgMjc4OTE2NzQwMVUsCS8vIDwzLDYsMCwyPjogQ29zdCAzIHZzbGRvaTEyIDw2LDIsNywzPiwgPDYsMCwyLDE+CisgIDMzNjI5NjU4NjJVLAkvLyA8Myw2LDAsMz46IENvc3QgNCB2bXJnbHcgPDEsMiwzLDA+LCA8MywyLDYsMz4KKyAgMzc3MzYyODc1NFUsCS8vIDwzLDYsMCw0PjogQ29zdCA0IHZzbGRvaTggPDIsNSwzLDY+LCA8MCw0LDEsNT4KKyAgMzcyMzI4NDMyNlUsCS8vIDwzLDYsMCw1PjogQ29zdCA0IHZzbGRvaTQgPDUsMyw2LDA+LCA8NSwzLDYsMD4KKyAgMjgwMDA3OTE4MVUsCS8vIDwzLDYsMCw2PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDYsMCw2LDE+CisgIDEyMTU0ODMxOTBVLAkvLyA8Myw2LDAsNz46IENvc3QgMiB2bXJnbHcgPDEsMiwzLDA+LCBSSFMKKyAgMTIxNTQ4MzE5MVUsCS8vIDwzLDYsMCx1PjogQ29zdCAyIHZtcmdsdyA8MSwyLDMsMD4sIFJIUworICAzODczODIxMDMyVSwJLy8gPDMsNiwxLDA+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8NiwxLDAsMT4KKyAgMzc3MzYyOTIzNlUsCS8vIDwzLDYsMSwxPjogQ29zdCA0IHZzbGRvaTggPDIsNSwzLDY+LCA8MSwxLDEsMT4KKyAgMjY5MTkyNDg5MlUsCS8vIDwzLDYsMSwyPjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDY+LCA8MSwyLDMsNj4KKyAgMzgzMDY5MDE4NFUsCS8vIDwzLDYsMSwzPjogQ29zdCA1IHZzbGRvaTEyIExIUywgPDYsMSwzLDY+CisgIDM4NzM4MjEwNzJVLAkvLyA8Myw2LDEsND46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDw2LDEsNCw1PgorICAzODczODIxMDgyVSwJLy8gPDMsNiwxLDU+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8NiwxLDUsNj4KKyAgMzQwMzQ1MzI0MFUsCS8vIDwzLDYsMSw2PjogQ29zdCA0IHZtcmdsdyA8dSwwLDMsMT4sIDw2LDYsNiw2PgorICAyMjg5MjMzMjA2VSwJLy8gPDMsNiwxLDc+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMywxPiwgUkhTCisgIDIyODkyMzMyMDdVLAkvLyA8Myw2LDEsdT46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDE+LCBSSFMKKyAgMjY2MTQ5ODk4MlUsCS8vIDwzLDYsMiwwPjogQ29zdCAzIHZzbGRvaTQgPDcsMyw2LDI+LCBMSFMKKyAgMzc3MDk3NTc4MFUsCS8vIDwzLDYsMiwxPjogQ29zdCA0IHZzbGRvaTggPDIsMSwzLDY+LCA8MiwxLDMsNj4KKyAgMjYzMTY0MDc5N1UsCS8vIDwzLDYsMiwyPjogQ29zdCAzIHZzbGRvaTQgPDIsMyw2LDI+LCA8MiwzLDYsMj4KKyAgMzc3MTYzOTQ4NVUsCS8vIDwzLDYsMiwzPjogQ29zdCA0IHZzbGRvaTggPDIsMiwzLDY+LCA8MiwzLDIsNj4KKyAgMjY2MTUwMjI2MlUsCS8vIDwzLDYsMiw0PjogQ29zdCAzIHZzbGRvaTQgPDcsMyw2LDI+LCBSSFMKKyAgMjY5OTg4ODQ4OFUsCS8vIDwzLDYsMiw1PjogQ29zdCAzIHZzbGRvaTggPDIsNSwzLDY+LCA8Miw1LDMsNj4KKyAgMjY2MTUwMzQ4MlUsCS8vIDwzLDYsMiw2PjogQ29zdCAzIHZzbGRvaTQgPDcsMyw2LDI+LCA8NiwyLDcsMz4KKyAgMTcxNTQyNTc4NlUsCS8vIDwzLDYsMiw3PjogQ29zdCAyIHZzbGRvaTEyIDw2LDIsNywzPiwgPDYsMiw3LDM+CisgIDE3MTU0OTk1MjNVLAkvLyA8Myw2LDIsdT46IENvc3QgMiB2c2xkb2kxMiA8NiwyLHUsMz4sIDw2LDIsdSwzPgorICAzNzczNjMwNjE0VSwJLy8gPDMsNiwzLDA+OiBDb3N0IDQgdnNsZG9pOCA8Miw1LDMsNj4sIDwzLDAsMSwyPgorICAzMzcyOTQyODI1VSwJLy8gPDMsNiwzLDE+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsMywzPiwgPDIsMCw2LDE+CisgIDIyMzQ3NDk0MzRVLAkvLyA8Myw2LDMsMj46IENvc3QgMyB2bXJnaHcgPDMsMywzLDM+LCA8NiwyLDcsMz4KKyAgMzM2ODk2MjQwNlUsCS8vIDwzLDYsMywzPjogQ29zdCA0IHZtcmdsdyA8MiwyLDMsMz4sIDwzLDIsNiwzPgorICAyNjk5ODg5MTU0VSwJLy8gPDMsNiwzLDQ+OiBDb3N0IDMgdnNsZG9pOCA8Miw1LDMsNj4sIDwzLDQsNSw2PgorICAzNzczNjMxMDY4VSwJLy8gPDMsNiwzLDU+OiBDb3N0IDQgdnNsZG9pOCA8Miw1LDMsNj4sIDwzLDUsNiw2PgorICAyMzMxMDU0OTA0VSwJLy8gPDMsNiwzLDY+OiBDb3N0IDMgdm1yZ2x3IDx1LDIsMywzPiwgPDYsNiw2LDY+CisgIDEyMjE0Nzk3MzRVLAkvLyA8Myw2LDMsNz46IENvc3QgMiB2bXJnbHcgPDIsMiwzLDM+LCBSSFMKKyAgMTIyMTQ3OTczNVUsCS8vIDwzLDYsMyx1PjogQ29zdCAyIHZtcmdsdyA8MiwyLDMsMz4sIFJIUworICAyMjM1NTg0ODAxVSwJLy8gPDMsNiw0LDA+OiBDb3N0IDMgdm1yZ2h3IDwzLDQsNSw2PiwgPDYsMCwxLDI+CisgIDM3MTczNDIxMDZVLAkvLyA8Myw2LDQsMT46IENvc3QgNCB2c2xkb2k0IDw0LDMsNiw0PiwgPDEsMiwzLDQ+CisgIDI3ODkxNjc3MjlVLAkvLyA8Myw2LDQsMj46IENvc3QgMyB2c2xkb2kxMiA8NiwyLDcsMz4sIDw2LDQsMiw1PgorICAyMjM1NTg1MDc0VSwJLy8gPDMsNiw0LDM+OiBDb3N0IDMgdm1yZ2h3IDwzLDQsNSw2PiwgPDYsMyw0LDU+CisgIDIyMzU1ODUxNjVVLAkvLyA8Myw2LDQsND46IENvc3QgMyB2bXJnaHcgPDMsNCw1LDY+LCA8Niw0LDUsNj4KKyAgMjY5OTg4OTk3NFUsCS8vIDwzLDYsNCw1PjogQ29zdCAzIHZzbGRvaTggPDIsNSwzLDY+LCBSSFMKKyAgMjgwMDA3OTUwOVUsCS8vIDwzLDYsNCw2PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDYsNCw2LDU+CisgIDEyMTU1MTU5NThVLAkvLyA8Myw2LDQsNz46IENvc3QgMiB2bXJnbHcgPDEsMiwzLDQ+LCBSSFMKKyAgMTIxNTUxNTk1OVUsCS8vIDwzLDYsNCx1PjogQ29zdCAyIHZtcmdsdyA8MSwyLDMsND4sIFJIUworICAzODczODIxMzU2VSwJLy8gPDMsNiw1LDA+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8Niw1LDAsMT4KKyAgMzM3Mjk1OTIwOVUsCS8vIDwzLDYsNSwxPjogQ29zdCA1IHZtcmdsdyA8Mix1LDMsNT4sIDwyLDAsNiwxPgorICAzODYyOTA5NjI5VSwJLy8gPDMsNiw1LDI+OiBDb3N0IDQgdnNsZG9pMTIgPDYsMiw3LDM+LCA8Niw1LDIsMD4KKyAgMzc3MzYzMjM1OFUsCS8vIDwzLDYsNSwzPjogQ29zdCA0IHZzbGRvaTggPDIsNSwzLDY+LCA8NSwzLDYsMD4KKyAgMzg3MzgyMTM5NlUsCS8vIDwzLDYsNSw0PjogQ29zdCA0IHZzbGRvaTEyIExIUywgPDYsNSw0LDU+CisgIDM4NzM4MjE0MDVVLAkvLyA8Myw2LDUsNT46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDw2LDUsNSw1PgorICAzODYyOTA5NjcyVSwJLy8gPDMsNiw1LDY+OiBDb3N0IDQgdnNsZG9pMTIgPDYsMiw3LDM+LCA8Niw1LDYsNz4KKyAgMjI5NDU3NDM5MFUsCS8vIDwzLDYsNSw3PjogQ29zdCAzIHZtcmdsdyA8MiwxLDMsNT4sIFJIUworICAyMjk0NTc0MzkxVSwJLy8gPDMsNiw1LHU+OiBDb3N0IDMgdm1yZ2x3IDwyLDEsMyw1PiwgUkhTCisgIDI4MDAwNzk2MTNVLAkvLyA8Myw2LDYsMD46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw2LDYsMCwxPgorICAzODczODIxNDQ2VSwJLy8gPDMsNiw2LDE+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8Niw2LDEsMT4KKyAgMjc4OTE2Nzg4OFUsCS8vIDwzLDYsNiwyPjogQ29zdCAzIHZzbGRvaTEyIDw2LDIsNywzPiwgPDYsNiwyLDI+CisgIDM4NDQ5MjAwOTBVLAkvLyA8Myw2LDYsMz46IENvc3QgNCB2c2xkb2kxMiA8MywyLDYsMz4sIDw2LDYsMywzPgorICAyODAwMDc5NjUzVSwJLy8gPDMsNiw2LDQ+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8Niw2LDQsNT4KKyAgMzcyMzMzMzQ4NFUsCS8vIDwzLDYsNiw1PjogQ29zdCA0IHZzbGRvaTQgPDUsMyw2LDY+LCA8NSwzLDYsNj4KKyAgMTcyNjMzNzg0OFUsCS8vIDwzLDYsNiw2PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDYsNiw2LDY+CisgIDE3MjYzMzc4NThVLAkvLyA8Myw2LDYsNz46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDw2LDYsNyw3PgorICAxNzI2MzM3ODY3VSwJLy8gPDMsNiw2LHU+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8Niw2LHUsNz4KKyAgMTcyNjMzNzg3MFUsCS8vIDwzLDYsNywwPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDYsNywwLDE+CisgIDIyOTc5MDY2NjVVLAkvLyA8Myw2LDcsMT46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MiwwLDYsMT4KKyAgMjc5MjExNzA5MFUsCS8vIDwzLDYsNywyPjogQ29zdCAzIHZzbGRvaTEyIDw2LDcsMiwzPiwgPDYsNywyLDM+CisgIDIyOTc5MDc1NThVLAkvLyA8Myw2LDcsMz46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MywyLDYsMz4KKyAgMTcyNjMzNzkxMFUsCS8vIDwzLDYsNyw0PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDYsNyw0LDU+CisgIDIyOTc5MDY5OTNVLAkvLyA8Myw2LDcsNT46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8Miw0LDYsNT4KKyAgMjI5NzkwNjgzMlUsCS8vIDwzLDYsNyw2PjogQ29zdCAzIHZtcmdsdyA8Miw2LDMsNz4sIDwyLDIsNiw2PgorICAxMjI0MTY2NzEwVSwJLy8gPDMsNiw3LDc+OiBDb3N0IDIgdm1yZ2x3IDwyLDYsMyw3PiwgUkhTCisgIDEyMjQxNjY3MTFVLAkvLyA8Myw2LDcsdT46IENvc3QgMiB2bXJnbHcgPDIsNiwzLDc+LCBSSFMKKyAgMTcyNjMzNzk1MVUsCS8vIDwzLDYsdSwwPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDYsdSwwLDE+CisgIDI2OTk4OTI1MjZVLAkvLyA8Myw2LHUsMT46IENvc3QgMyB2c2xkb2k4IDwyLDUsMyw2PiwgTEhTCisgIDI3ODkxNjgwNDlVLAkvLyA8Myw2LHUsMj46IENvc3QgMyB2c2xkb2kxMiA8NiwyLDcsMz4sIDw2LHUsMiwxPgorICAyNzkyODU0NDYwVSwJLy8gPDMsNix1LDM+OiBDb3N0IDMgdnNsZG9pMTIgPDYsdSwzLDM+LCA8Nix1LDMsMz4KKyAgMTcyNjMzNzk5MVUsCS8vIDwzLDYsdSw0PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDYsdSw0LDU+CisgIDI2OTk4OTI4OTBVLAkvLyA8Myw2LHUsNT46IENvc3QgMyB2c2xkb2k4IDwyLDUsMyw2PiwgUkhTCisgIDE3MjYzMzc4NDhVLAkvLyA8Myw2LHUsNj46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDw2LDYsNiw2PgorICAxMjE1NTQ4NzI2VSwJLy8gPDMsNix1LDc+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsMyx1PiwgUkhTCisgIDEyMTU1NDg3MjdVLAkvLyA8Myw2LHUsdT46IENvc3QgMiB2bXJnbHcgPDEsMiwzLHU+LCBSSFMKKyAgMjcwMDU1ODMzNlUsCS8vIDwzLDcsMCwwPjogQ29zdCAzIHZzbGRvaTggPDIsNiwzLDc+LCA8MCwwLDAsMD4KKyAgMTYyNjgxNjYxNFUsCS8vIDwzLDcsMCwxPjogQ29zdCAyIHZzbGRvaTggPDIsNiwzLDc+LCBMSFMKKyAgMjcwMDU1ODUxM1UsCS8vIDwzLDcsMCwyPjogQ29zdCAzIHZzbGRvaTggPDIsNiwzLDc+LCA8MCwyLDEsNj4KKyAgMjMzMTAzMDAxMFUsCS8vIDwzLDcsMCwzPjogQ29zdCAzIHZtcmdsdyA8dSwyLDMsMD4sIDw2LDIsNywzPgorICAyNzAwNTU4Njc0VSwJLy8gPDMsNywwLDQ+OiBDb3N0IDMgdnNsZG9pOCA8Miw2LDMsNz4sIDwwLDQsMSw1PgorICAyODAwMDc5OTA2VSwJLy8gPDMsNywwLDU+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8NywwLDUsNj4KKyAgMjY1NTU4ODkzNlUsCS8vIDwzLDcsMCw2PjogQ29zdCAzIHZzbGRvaTQgPDYsMyw3LDA+LCA8NiwzLDcsMD4KKyAgMjgwMDA3OTkxOVUsCS8vIDwzLDcsMCw3PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDcsMCw3LDE+CisgIDE2MjY4MTcxODFVLAkvLyA8Myw3LDAsdT46IENvc3QgMiB2c2xkb2k4IDwyLDYsMyw3PiwgTEhTCisgIDM3NzQzMDA4OTlVLAkvLyA8Myw3LDEsMD46IENvc3QgNCB2c2xkb2k4IDwyLDYsMyw3PiwgPDEsMCwxLDE+CisgIDI3MDA1NTkxNTZVLAkvLyA8Myw3LDEsMT46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDEsMSwxLDE+CisgIDI3MDA1NTkyNTRVLAkvLyA8Myw3LDEsMj46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDEsMiwzLDA+CisgIDM3NzQzMDExNDhVLAkvLyA8Myw3LDEsMz46IENvc3QgNCB2c2xkb2k4IDwyLDYsMyw3PiwgPDEsMywxLDc+CisgIDM3NzQzMDEyMjdVLAkvLyA8Myw3LDEsND46IENvc3QgNCB2c2xkb2k4IDwyLDYsMyw3PiwgPDEsNCwxLDU+CisgIDM3NzQzMDEyOTVVLAkvLyA8Myw3LDEsNT46IENvc3QgNCB2c2xkb2k4IDwyLDYsMyw3PiwgPDEsNSwwLDE+CisgIDM3NjgzMjk0NDFVLAkvLyA8Myw3LDEsNj46IENvc3QgNCB2c2xkb2k4IDwxLDYsMyw3PiwgPDEsNiwzLDc+CisgIDM0MDM0NTMyNTBVLAkvLyA8Myw3LDEsNz46IENvc3QgNCB2bXJnbHcgPHUsMCwzLDE+LCA8Niw2LDcsNz4KKyAgMjcwMDU1OTc0MFUsCS8vIDwzLDcsMSx1PjogQ29zdCAzIHZzbGRvaTggPDIsNiwzLDc+LCA8MSx1LDMsMD4KKyAgMjcwMDU1OTg0OVUsCS8vIDwzLDcsMiwwPjogQ29zdCAzIHZzbGRvaTggPDIsNiwzLDc+LCA8MiwwLDYsMT4KKyAgMzc3MDk4Mzk3M1UsCS8vIDwzLDcsMiwxPjogQ29zdCA0IHZzbGRvaTggPDIsMSwzLDc+LCA8MiwxLDMsNz4KKyAgMjcwMDU1OTk3NlUsCS8vIDwzLDcsMiwyPjogQ29zdCAzIHZzbGRvaTggPDIsNiwzLDc+LCA8MiwyLDIsMj4KKyAgMjY5ODU2OTQxNVUsCS8vIDwzLDcsMiwzPjogQ29zdCAzIHZzbGRvaTggPDIsMywzLDc+LCA8MiwzLDMsNz4KKyAgMjcwMDU2MDE3N1UsCS8vIDwzLDcsMiw0PjogQ29zdCAzIHZzbGRvaTggPDIsNiwzLDc+LCA8Miw0LDYsNT4KKyAgMzc3MzYzODUwNVUsCS8vIDwzLDcsMiw1PjogQ29zdCA0IHZzbGRvaTggPDIsNSwzLDc+LCA8Miw1LDMsNz4KKyAgMTYyNjgxODQ5MFUsCS8vIDwzLDcsMiw2PjogQ29zdCAyIHZzbGRvaTggPDIsNiwzLDc+LCA8Miw2LDMsNz4KKyAgMjc5NTE0MDMwN1UsCS8vIDwzLDcsMiw3PjogQ29zdCAzIHZzbGRvaTEyIDw3LDIsNywzPiwgPDcsMiw3LDM+CisgIDE2MjgxNDU3NTZVLAkvLyA8Myw3LDIsdT46IENvc3QgMiB2c2xkb2k4IDwyLHUsMyw3PiwgPDIsdSwzLDc+CisgIDI3MDA1NjA1MzRVLAkvLyA8Myw3LDMsMD46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDMsMCwxLDI+CisgIDM3NzQzMDI0MzhVLAkvLyA8Myw3LDMsMT46IENvc3QgNCB2c2xkb2k4IDwyLDYsMyw3PiwgPDMsMSwxLDE+CisgIDI3MDA1NjA3NDJVLAkvLyA8Myw3LDMsMj46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDMsMiw2LDM+CisgIDI3MDA1NjA3OTZVLAkvLyA8Myw3LDMsMz46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDMsMywzLDM+CisgIDI3MDA1NjA4OThVLAkvLyA8Myw3LDMsND46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDMsNCw1LDY+CisgIDM3NzQzMDI4MjFVLAkvLyA8Myw3LDMsNT46IENvc3QgNCB2c2xkb2k4IDwyLDYsMyw3PiwgPDMsNSw3LDY+CisgIDI3MDA1NjEwNzlVLAkvLyA8Myw3LDMsNj46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDMsNiw3LDc+CisgIDI3MDA1NjEwOTFVLAkvLyA8Myw3LDMsNz46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDMsNywwLDE+CisgIDI3MDA1NjExODJVLAkvLyA8Myw3LDMsdT46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDMsdSwxLDI+CisgIDI2NTU2MTcxMjZVLAkvLyA8Myw3LDQsMD46IENvc3QgMyB2c2xkb2k0IDw2LDMsNyw0PiwgTEhTCisgIDM3NzQzMDMxNzhVLAkvLyA8Myw3LDQsMT46IENvc3QgNCB2c2xkb2k4IDwyLDYsMyw3PiwgPDQsMSwyLDM+CisgIDI2NTU2MTkwMDJVLAkvLyA8Myw3LDQsMj46IENvc3QgMyB2c2xkb2k0IDw2LDMsNyw0PiwgPDIsNiwzLDc+CisgIDIzMzEwNjI3NzhVLAkvLyA8Myw3LDQsMz46IENvc3QgMyB2bXJnbHcgPHUsMiwzLDQ+LCA8NiwyLDcsMz4KKyAgMjY1NTYyMDQwNlUsCS8vIDwzLDcsNCw0PjogQ29zdCAzIHZzbGRvaTQgPDYsMyw3LDQ+LCBSSFMKKyAgMTYyNjgxOTg5NFUsCS8vIDwzLDcsNCw1PjogQ29zdCAyIHZzbGRvaTggPDIsNiwzLDc+LCBSSFMKKyAgMjY1NTYyMTcwOFUsCS8vIDwzLDcsNCw2PjogQ29zdCAzIHZzbGRvaTQgPDYsMyw3LDQ+LCA8NiwzLDcsND4KKyAgMjgwMDA4MDI0N1UsCS8vIDwzLDcsNCw3PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDcsNCw3LDU+CisgIDE2MjY4MjAxMzdVLAkvLyA8Myw3LDQsdT46IENvc3QgMiB2c2xkb2k4IDwyLDYsMyw3PiwgUkhTCisgIDM3NzQzMDM4MTZVLAkvLyA8Myw3LDUsMD46IENvc3QgNCB2c2xkb2k4IDwyLDYsMyw3PiwgPDUsMCwxLDI+CisgIDM4NzM4MjIwOTNVLAkvLyA8Myw3LDUsMT46IENvc3QgNCB2c2xkb2kxMiBMSFMsIDw3LDUsMSwwPgorICAzNzc0MzAzOTk4VSwJLy8gPDMsNyw1LDI+OiBDb3N0IDQgdnNsZG9pOCA8Miw2LDMsNz4sIDw1LDIsMyw0PgorICAzODYyOTEwMzY4VSwJLy8gPDMsNyw1LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDYsMiw3LDM+LCA8Nyw1LDMsMT4KKyAgMzc3NDMwNDE4MFUsCS8vIDwzLDcsNSw0PjogQ29zdCA0IHZzbGRvaTggPDIsNiwzLDc+LCA8NSw0LDUsNj4KKyAgMjgwMDA4MDMxMFUsCS8vIDwzLDcsNSw1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDcsNSw1LDU+CisgIDI4MDAwODAzMjFVLAkvLyA8Myw3LDUsNj46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw3LDUsNiw3PgorICAzODczODIyMTQ3VSwJLy8gPDMsNyw1LDc+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8Nyw1LDcsMD4KKyAgMjgwMDA4MDMzOVUsCS8vIDwzLDcsNSx1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDcsNSx1LDc+CisgIDI4MDAwODAzNDhVLAkvLyA8Myw3LDYsMD46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw3LDYsMCw3PgorICAzODczODIyMTgxVSwJLy8gPDMsNyw2LDE+OiBDb3N0IDQgdnNsZG9pMTIgTEhTLCA8Nyw2LDEsNz4KKyAgMjc4OTE2ODYyMlUsCS8vIDwzLDcsNiwyPjogQ29zdCAzIHZzbGRvaTEyIDw2LDIsNywzPiwgPDcsNiwyLDc+CisgIDI3MDA1NjMwMTZVLAkvLyA8Myw3LDYsMz46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPDYsMyw3LDA+CisgIDI4MDAwODAzODRVLAkvLyA8Myw3LDYsND46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDw3LDYsNCw3PgorICAzODYyOTEwNDcyVSwJLy8gPDMsNyw2LDU+OiBDb3N0IDQgdnNsZG9pMTIgPDYsMiw3LDM+LCA8Nyw2LDUsNj4KKyAgMjcwMDU2MzI1NlUsCS8vIDwzLDcsNiw2PjogQ29zdCAzIHZzbGRvaTggPDIsNiwzLDc+LCA8Niw2LDYsNj4KKyAgMjgwMDA4MDQwNFUsCS8vIDwzLDcsNiw3PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDcsNiw3LDA+CisgIDI3OTMxNDk5ODhVLAkvLyA8Myw3LDYsdT46IENvc3QgMyB2c2xkb2kxMiA8Nix1LDcsMz4sIDw3LDYsdSw3PgorICAyNjM3NzI1Nzk4VSwJLy8gPDMsNyw3LDA+OiBDb3N0IDMgdnNsZG9pNCA8MywzLDcsNz4sIExIUworICAzMzcxNjQ5MjI3VSwJLy8gPDMsNyw3LDE+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsMyw3PiwgPDMsMCw3LDE+CisgIDI2Mzc3Mjc2NzRVLAkvLyA8Myw3LDcsMj46IENvc3QgMyB2c2xkb2k0IDwzLDMsNyw3PiwgPDIsNiwzLDc+CisgIDIyOTc5MDc1NjdVLAkvLyA8Myw3LDcsMz46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MywyLDcsMz4KKyAgMjYzNzcyOTA3OFUsCS8vIDwzLDcsNyw0PjogQ29zdCAzIHZzbGRvaTQgPDMsMyw3LDc+LCBSSFMKKyAgMzM3MTY0OTMxMlUsCS8vIDwzLDcsNyw1PjogQ29zdCA0IHZtcmdsdyA8Miw2LDMsNz4sIDwzLDEsNyw1PgorICAyNjU1NjQ2Mjg3VSwJLy8gPDMsNyw3LDY+OiBDb3N0IDMgdnNsZG9pNCA8NiwzLDcsNz4sIDw2LDMsNyw3PgorICAxNzI2MzM4NjY4VSwJLy8gPDMsNyw3LDc+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8Nyw3LDcsNz4KKyAgMTcyNjMzODY2OFUsCS8vIDwzLDcsNyx1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDcsNyw3LDc+CisgIDI3MDA1NjQxNzlVLAkvLyA8Myw3LHUsMD46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPHUsMCwxLDI+CisgIDE2MjY4MjI0NDZVLAkvLyA8Myw3LHUsMT46IENvc3QgMiB2c2xkb2k4IDwyLDYsMyw3PiwgTEhTCisgIDI3MDA1NjQzNTdVLAkvLyA8Myw3LHUsMj46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPHUsMiwzLDA+CisgIDI3MDA1NjQ0MTJVLAkvLyA8Myw3LHUsMz46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPHUsMywwLDE+CisgIDI3MDA1NjQ1NDNVLAkvLyA8Myw3LHUsND46IENvc3QgMyB2c2xkb2k4IDwyLDYsMyw3PiwgPHUsNCw1LDY+CisgIDE2MjY4MjI4MTBVLAkvLyA8Myw3LHUsNT46IENvc3QgMiB2c2xkb2k4IDwyLDYsMyw3PiwgUkhTCisgIDE2NjI2NTQ2NzJVLAkvLyA8Myw3LHUsNj46IENvc3QgMiB2c2xkb2k4IDx1LDYsMyw3PiwgPHUsNiwzLDc+CisgIDE3MjYzMzg2NjhVLAkvLyA8Myw3LHUsNz46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDw3LDcsNyw3PgorICAxNjI2ODIzMDEzVSwJLy8gPDMsNyx1LHU+OiBDb3N0IDIgdnNsZG9pOCA8Miw2LDMsNz4sIExIUworICAxNjc4NTU3MTg0VSwJLy8gPDMsdSwwLDA+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8MCwwLDAsMD4KKyAgMTY3OTAwNTM5NVUsCS8vIDwzLHUsMCwxPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPHUsMCwxLDI+CisgIDIyODkyMjE3ODdVLAkvLyA8Myx1LDAsMj46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDA+LCA8MCwxLHUsMj4KKyAgMTIxNTQ3OTk2NFUsCS8vIDwzLHUsMCwzPjogQ29zdCAyIHZtcmdsdyA8MSwyLDMsMD4sIExIUworICAyNzUyNzQ3MjQ1VSwJLy8gPDMsdSwwLDQ+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8dSwwLDQsMT4KKyAgMTE1ODg2MzAwMlUsCS8vIDwzLHUsMCw1PjogQ29zdCAyIHZtcmdodyA8MywwLDEsMj4sIFJIUworICAyMjg5MjI0MjIxVSwJLy8gPDMsdSwwLDY+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMywwPiwgPDMsNCx1LDY+CisgIDEyMTU0ODMyMDhVLAkvLyA8Myx1LDAsNz46IENvc3QgMiB2bXJnbHcgPDEsMiwzLDA+LCBSSFMKKyAgMTY3OTAwNTQ1OFUsCS8vIDwzLHUsMCx1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPHUsMCx1LDI+CisgIDE1NTgwMzY1ODJVLAkvLyA8Myx1LDEsMD46IENvc3QgMiB2c2xkb2k0IDwyLDMsdSwxPiwgTEhTCisgIDE2Nzg1NTgwMDRVLAkvLyA8Myx1LDEsMT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwxLDEsMSwxPgorICA2MDQ4MjEyOTRVLAkvLyA8Myx1LDEsMj46IENvc3QgMSB2c2xkb2kxMiBMSFMsIExIUworICAyNzUyNzQ3MzE3VSwJLy8gPDMsdSwxLDM+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8dSwxLDMsMT4KKyAgMTU1ODAzOTg2MlUsCS8vIDwzLHUsMSw0PjogQ29zdCAyIHZzbGRvaTQgPDIsMyx1LDE+LCBSSFMKKyAgMjc1Njk0OTgzMFUsCS8vIDwzLHUsMSw1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPHUsMSw1LDA+CisgIDI4MDAwODA3MjZVLAkvLyA8Myx1LDEsNj46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDx1LDEsNiw3PgorICAyMjg5MjMzMjI0VSwJLy8gPDMsdSwxLDc+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMywxPiwgUkhTCisgIDYwNDgyMTM0OFUsCS8vIDwzLHUsMSx1PjogQ29zdCAxIHZzbGRvaTEyIExIUywgTEhTCisgIDI2OTY1ODY3MDlVLAkvLyA8Myx1LDIsMD46IENvc3QgMyB2c2xkb2k4IDwyLDAsMyx1PiwgPDIsMCwzLHU+CisgIDI3NTczOTIyNDZVLAkvLyA8Myx1LDIsMT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDx1LDIsMSwzPgorICAxNjI0MTcyMTUxVSwJLy8gPDMsdSwyLDI+OiBDb3N0IDIgdnNsZG9pOCA8MiwyLDMsdT4sIDwyLDIsMyx1PgorICAxNjc5MDA1NTc2VSwJLy8gPDMsdSwyLDM+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8dSwyLDMsMz4KKyAgMjYzMTc4OTg3OFUsCS8vIDwzLHUsMiw0PjogQ29zdCAzIHZzbGRvaTQgPDIsMyx1LDI+LCBSSFMKKyAgMjY5OTkwNDg3NFUsCS8vIDwzLHUsMiw1PjogQ29zdCAzIHZzbGRvaTggPDIsNSwzLHU+LCA8Miw1LDMsdT4KKyAgMTYyNjgyNjY4M1UsCS8vIDwzLHUsMiw2PjogQ29zdCAyIHZzbGRvaTggPDIsNiwzLHU+LCA8Miw2LDMsdT4KKyAgMTcyNjMzODk4OFUsCS8vIDwzLHUsMiw3PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPHUsMiw3LDM+CisgIDE2ODMyMDgxMTdVLAkvLyA8Myx1LDIsdT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDx1LDIsdSwzPgorICAxNjc5MDA1NjI4VSwJLy8gPDMsdSwzLDA+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8dSwzLDAsMT4KKyAgMTE2MTAwODk0MlUsCS8vIDwzLHUsMywxPjogQ29zdCAyIHZtcmdodyA8MywzLDMsMz4sIExIUworICAyNzUyNzQ3NDcxVSwJLy8gPDMsdSwzLDI+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8dSwzLDIsMj4KKyAgNDAzNDg4ODcwVSwJLy8gPDMsdSwzLDM+OiBDb3N0IDEgdnNwbHRpc3czIExIUworICAxNjc5MDA1NjY4VSwJLy8gPDMsdSwzLDQ+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8dSwzLDQsNT4KKyAgMTE2MTAwOTMwNlUsCS8vIDwzLHUsMyw1PjogQ29zdCAyIHZtcmdodyA8MywzLDMsMz4sIFJIUworICAyNjkxOTQzMTA0VSwJLy8gPDMsdSwzLDY+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsdT4sIDwzLDYsdSw3PgorICAxMjIxNDc5NzUyVSwJLy8gPDMsdSwzLDc+OiBDb3N0IDIgdm1yZ2x3IDwyLDIsMywzPiwgUkhTCisgIDQwMzQ4ODg3MFUsCS8vIDwzLHUsMyx1PjogQ29zdCAxIHZzcGx0aXN3MyBMSFMKKyAgMjI4OTI1NTM2M1UsCS8vIDwzLHUsNCwwPjogQ29zdCAzIHZtcmdsdyA8MSwyLDMsND4sIDwxLDIsdSwwPgorICAxMTYxODQ0NTI2VSwJLy8gPDMsdSw0LDE+OiBDb3N0IDIgdm1yZ2h3IDwzLDQsNSw2PiwgTEhTCisgIDIyODkyNTY2NjFVLAkvLyA8Myx1LDQsMj46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDQ+LCA8MywwLHUsMj4KKyAgMTIxNTUxMjczMlUsCS8vIDwzLHUsNCwzPjogQ29zdCAyIHZtcmdsdyA8MSwyLDMsND4sIExIUworICAxMjE1NTEzNDk4VSwJLy8gPDMsdSw0LDQ+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsMyw0PiwgPDEsMiwzLDQ+CisgIDE2NzkwMDU3NTlVLAkvLyA8Myx1LDQsNT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDx1LDQsNSw2PgorICAyMjg5MjU2OTg5VSwJLy8gPDMsdSw0LDY+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsMyw0PiwgPDMsNCx1LDY+CisgIDEyMTU1MTU5NzZVLAkvLyA8Myx1LDQsNz46IENvc3QgMiB2bXJnbHcgPDEsMiwzLDQ+LCBSSFMKKyAgMTY3OTAwNTc4NlUsCS8vIDwzLHUsNCx1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPHUsNCx1LDY+CisgIDE1NTgwNjkzNTBVLAkvLyA8Myx1LDUsMD46IENvc3QgMiB2c2xkb2k0IDwyLDMsdSw1PiwgTEhTCisgIDI2MzE4MTE4OTJVLAkvLyA8Myx1LDUsMT46IENvc3QgMyB2c2xkb2k0IDwyLDMsdSw1PiwgPDEsMSwxLDE+CisgIDE1NTgwNzEwMjZVLAkvLyA8Myx1LDUsMj46IENvc3QgMiB2c2xkb2k0IDwyLDMsdSw1PiwgPDIsMyx1LDU+CisgIDI3NTI3NDc2NDZVLAkvLyA8Myx1LDUsMz46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDx1LDUsMyw2PgorICAxNTU4MDcyNjMwVSwJLy8gPDMsdSw1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8MiwzLHUsNT4sIFJIUworICAxNzI2MzM3MDI4VSwJLy8gPDMsdSw1LDU+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8NSw1LDUsNT4KKyAgNjA0ODIxNjU4VSwJLy8gPDMsdSw1LDY+OiBDb3N0IDEgdnNsZG9pMTIgTEhTLCBSSFMKKyAgMjI5NDU3NDQwOFUsCS8vIDwzLHUsNSw3PjogQ29zdCAzIHZtcmdsdyA8MiwxLDMsNT4sIFJIUworICA2MDQ4MjE2NzZVLAkvLyA8Myx1LDUsdT46IENvc3QgMSB2c2xkb2kxMiBMSFMsIFJIUworICAyNjMxODE5MzY2VSwJLy8gPDMsdSw2LDA+OiBDb3N0IDMgdnNsZG9pNCA8MiwzLHUsNj4sIExIUworICAyNzU3MzkyNTc0VSwJLy8gPDMsdSw2LDE+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8dSw2LDEsNz4KKyAgMjYzMTgyMTA0M1UsCS8vIDwzLHUsNiwyPjogQ29zdCAzIHZzbGRvaTQgPDIsMyx1LDY+LCA8MiwzLHUsNj4KKyAgMTY3OTAwNTkwNFUsCS8vIDwzLHUsNiwzPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPHUsNiwzLDc+CisgIDI2MzE4MjI2NDZVLAkvLyA8Myx1LDYsND46IENvc3QgMyB2c2xkb2k0IDwyLDMsdSw2PiwgUkhTCisgIDIyMzY1NTMzNzBVLAkvLyA8Myx1LDYsNT46IENvc3QgMyB2bXJnaHcgPDMsNiwwLDc+LCBSSFMKKyAgMTcyNjMzNzg0OFUsCS8vIDwzLHUsNiw2PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDYsNiw2LDY+CisgIDE3MjYzMzkzMDlVLAkvLyA8Myx1LDYsNz46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDx1LDYsNywwPgorICAxNjgzMjA4NDQ1VSwJLy8gPDMsdSw2LHU+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8dSw2LHUsNz4KKyAgMTcyNjMzOTMyOFUsCS8vIDwzLHUsNywwPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPHUsNywwLDE+CisgIDIyOTc5MDUyMjVVLAkvLyA8Myx1LDcsMT46IENvc3QgMyB2bXJnbHcgPDIsNiwzLDc+LCA8MCwwLHUsMT4KKyAgMjYzMTgyOTIzNlUsCS8vIDwzLHUsNywyPjogQ29zdCAzIHZzbGRvaTQgPDIsMyx1LDc+LCA8MiwzLHUsNz4KKyAgMTIyNDE2MzQ4NFUsCS8vIDwzLHUsNywzPjogQ29zdCAyIHZtcmdsdyA8Miw2LDMsNz4sIExIUworICAxNzI2MzM5MzY4VSwJLy8gPDMsdSw3LDQ+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8dSw3LDQsNT4KKyAgMjI5NzkwNTU1M1UsCS8vIDwzLHUsNyw1PjogQ29zdCAzIHZtcmdsdyA8Miw2LDMsNz4sIDwwLDQsdSw1PgorICAyMjk3OTA1MzkyVSwJLy8gPDMsdSw3LDY+OiBDb3N0IDMgdm1yZ2x3IDwyLDYsMyw3PiwgPDAsMix1LDY+CisgIDEyMjQxNjY3MjhVLAkvLyA8Myx1LDcsNz46IENvc3QgMiB2bXJnbHcgPDIsNiwzLDc+LCBSSFMKKyAgMTIyNDE2MzQ4OVUsCS8vIDwzLHUsNyx1PjogQ29zdCAyIHZtcmdsdyA8Miw2LDMsNz4sIExIUworICAxNjgzMjA4NTI5VSwJLy8gPDMsdSx1LDA+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8dSx1LDAsMT4KKyAgMTY3OTAwNjA0M1UsCS8vIDwzLHUsdSwxPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPHUsdSwxLDI+CisgIDYwNDgyMTg2MVUsCS8vIDwzLHUsdSwyPjogQ29zdCAxIHZzbGRvaTEyIExIUywgTEhTCisgIDQwMzQ4ODg3MFUsCS8vIDwzLHUsdSwzPjogQ29zdCAxIHZzcGx0aXN3MyBMSFMKKyAgMTY4MzIwODU2OVUsCS8vIDwzLHUsdSw0PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPHUsdSw0LDU+CisgIDE2NzkwMDYwODNVLAkvLyA8Myx1LHUsNT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDx1LHUsNSw2PgorICA2MDQ4MjE5MDFVLAkvLyA8Myx1LHUsNj46IENvc3QgMSB2c2xkb2kxMiBMSFMsIFJIUworICAxMjE1NTQ4NzQ0VSwJLy8gPDMsdSx1LDc+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsMyx1PiwgUkhTCisgIDYwNDgyMTkxNVUsCS8vIDwzLHUsdSx1PjogQ29zdCAxIHZzbGRvaTEyIExIUywgTEhTCisgIDI3NTkwMTY0NDhVLAkvLyA8NCwwLDAsMD46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsND4sIDwwLDAsMCwwPgorICAxMTY1MTE1NDk0VSwJLy8gPDQsMCwwLDE+OiBDb3N0IDIgdm1yZ2h3IDw0LDAsNSwxPiwgTEhTCisgIDM3MTc1MzEzMzdVLAkvLyA8NCwwLDAsMj46IENvc3QgNCB2c2xkb2k0IDw0LDQsMCwwPiwgPDIsMyw0LDA+CisgIDMzNjk2NzU3ODVVLAkvLyA8NCwwLDAsMz46IENvc3QgNCB2bXJnbHcgPDIsMyw0LDA+LCA8NCwyLDAsMz4KKyAgMjc1MTc5MTE0NFUsCS8vIDw0LDAsMCw0PjogQ29zdCAzIHZzbGRvaTEyIDwwLDAsNCw0PiwgPDAsMCw0LDQ+CisgIDIyMzg4NTc2MzBVLAkvLyA8NCwwLDAsNT46IENvc3QgMyB2bXJnaHcgPDQsMCw1LDE+LCA8MCw1LDEsMD4KKyAgMzMxMjU5MTM0MVUsCS8vIDw0LDAsMCw2PjogQ29zdCA0IHZtcmdodyA8NCwwLDUsMD4sIDwwLDYsMCw3PgorICAzMzY5Njc2MTEzVSwJLy8gPDQsMCwwLDc+OiBDb3N0IDQgdm1yZ2x3IDwyLDMsNCwwPiwgPDQsNiwwLDc+CisgIDExNjUxMTYwNjFVLAkvLyA8NCwwLDAsdT46IENvc3QgMiB2bXJnaHcgPDQsMCw1LDE+LCBMSFMKKyAgMjYzNzgyNDEwMlUsCS8vIDw0LDAsMSwwPjogQ29zdCAzIHZzbGRvaTQgPDMsNCwwLDE+LCBMSFMKKyAgMjYzNzgyNDkyMlUsCS8vIDw0LDAsMSwxPjogQ29zdCAzIHZzbGRvaTQgPDMsNCwwLDE+LCA8MSwyLDMsND4KKyAgMTY4NTI3NDcyNlUsCS8vIDw0LDAsMSwyPjogQ29zdCAyIHZzbGRvaTEyIDwxLDIsMyw0PiwgTEhTCisgIDI2Mzc4MjY1MTJVLAkvLyA8NCwwLDEsMz46IENvc3QgMyB2c2xkb2k0IDwzLDQsMCwxPiwgPDMsNCwwLDE+CisgIDI2Mzc4MjczODJVLAkvLyA8NCwwLDEsND46IENvc3QgMyB2c2xkb2k0IDwzLDQsMCwxPiwgUkhTCisgIDI2NjE3MTYwNzBVLAkvLyA8NCwwLDEsNT46IENvc3QgMyB2c2xkb2k0IDw3LDQsMCwxPiwgPDUsNiw3LDQ+CisgIDM3Mjk0ODY0MjdVLAkvLyA8NCwwLDEsNj46IENvc3QgNCB2c2xkb2k0IDw2LDQsMCwxPiwgPDYsNCwwLDE+CisgIDI2NjE3MTczMDBVLAkvLyA8NCwwLDEsNz46IENvc3QgMyB2c2xkb2k0IDw3LDQsMCwxPiwgPDcsNCwwLDE+CisgIDE2ODUyNzQ3ODBVLAkvLyA8NCwwLDEsdT46IENvc3QgMiB2c2xkb2kxMiA8MSwyLDMsND4sIExIUworICAzNzExNTc0MTE4VSwJLy8gPDQsMCwyLDA+OiBDb3N0IDQgdnNsZG9pNCA8Myw0LDAsMj4sIExIUworICAyMjQwMjAwODA2VSwJLy8gPDQsMCwyLDE+OiBDb3N0IDMgdm1yZ2h3IDw0LDIsNSwzPiwgTEhTCisgIDM3NzE2NjM5OTJVLAkvLyA8NCwwLDIsMj46IENvc3QgNCB2c2xkb2k4IDwyLDIsNCwwPiwgPDIsMiw0LDA+CisgIDI2OTg1ODU4MDFVLAkvLyA8NCwwLDIsMz46IENvc3QgMyB2c2xkb2k4IDwyLDMsNCwwPiwgPDIsMyw0LDA+CisgIDMzNzM2NzIxMDVVLAkvLyA8NCwwLDIsND46IENvc3QgNCB2bXJnbHcgPDMsMCw0LDI+LCA8MiwzLDAsND4KKyAgMzgxMDgxMzc5NVUsCS8vIDw0LDAsMiw1PjogQ29zdCA0IHZzbGRvaTggPHUsNyw0LDA+LCA8Miw1LDMsMT4KKyAgMzc3MjMyNzg2NlUsCS8vIDw0LDAsMiw2PjogQ29zdCA0IHZzbGRvaTggPDIsMyw0LDA+LCA8Miw2LDMsNz4KKyAgMzM4NjI4MDU2OFUsCS8vIDw0LDAsMiw3PjogQ29zdCA1IHZtcmdsdyA8NSwxLDQsMj4sIDwzLDYsMCw3PgorICAyNzAxOTAzOTY2VSwJLy8gPDQsMCwyLHU+OiBDb3N0IDMgdnNsZG9pOCA8Mix1LDQsMD4sIDwyLHUsNCwwPgorICAzNjk5NjM4Mzc0VSwJLy8gPDQsMCwzLDA+OiBDb3N0IDQgdnNsZG9pNCA8MSw0LDAsMz4sIExIUworICAyNzUzNTYwODMyVSwJLy8gPDQsMCwzLDE+OiBDb3N0IDMgdnNsZG9pMTIgPDAsMywxLDQ+LCA8MCwzLDEsND4KKyAgMzc3MjMyODI3NlUsCS8vIDw0LDAsMywyPjogQ29zdCA0IHZzbGRvaTggPDIsMyw0LDA+LCA8MywyLDQsMz4KKyAgMzgyNzMwMjY3NFUsCS8vIDw0LDAsMywzPjogQ29zdCA0IHZzbGRvaTEyIDwwLDMsMSw0PiwgPDAsMywzLDQ+CisgIDM2OTk2NDE2NTRVLAkvLyA8NCwwLDMsND46IENvc3QgNCB2c2xkb2k0IDwxLDQsMCwzPiwgUkhTCisgIDM3Nzk2Mjc1ODhVLAkvLyA8NCwwLDMsNT46IENvc3QgNCB2c2xkb2k4IDwzLDUsNCwwPiwgPDMsNSw0LDA+CisgIDM3NzIzMjg2MDRVLAkvLyA8NCwwLDMsNj46IENvc3QgNCB2c2xkb2k4IDwyLDMsNCwwPiwgPDMsNiw0LDc+CisgIDM3ODA5NTQ4NTRVLAkvLyA8NCwwLDMsNz46IENvc3QgNCB2c2xkb2k4IDwzLDcsNCwwPiwgPDMsNyw0LDA+CisgIDI3NTM1NjA4MzJVLAkvLyA8NCwwLDMsdT46IENvc3QgMyB2c2xkb2kxMiA8MCwzLDEsND4sIDwwLDMsMSw0PgorICAyNzI1MTI5MTA2VSwJLy8gPDQsMCw0LDA+OiBDb3N0IDMgdnNsZG9pOCA8Niw3LDQsMD4sIDw0LDAsNSwxPgorICAxMTY3NzIwNTUwVSwJLy8gPDQsMCw0LDE+OiBDb3N0IDIgdm1yZ2h3IDw0LDQsNCw0PiwgTEhTCisgIDM4MzkxNzI5NTNVLAkvLyA8NCwwLDQsMj46IENvc3QgNCB2c2xkb2kxMiA8MiwzLDAsND4sIDwwLDQsMiwzPgorICAzNzcyMzI5MDUxVSwJLy8gPDQsMCw0LDM+OiBDb3N0IDQgdnNsZG9pOCA8MiwzLDQsMD4sIDw0LDMsMCw0PgorICAyMjQxNDYyNjEwVSwJLy8gPDQsMCw0LDQ+OiBDb3N0IDMgdm1yZ2h3IDw0LDQsNCw0PiwgPDAsNCwxLDU+CisgIDI2OTg1ODc0NDZVLAkvLyA8NCwwLDQsNT46IENvc3QgMyB2c2xkb2k4IDwyLDMsNCwwPiwgUkhTCisgIDM3NzIzMjkyOTdVLAkvLyA8NCwwLDQsNj46IENvc3QgNCB2c2xkb2k4IDwyLDMsNCwwPiwgPDQsNiwwLDc+CisgIDM3MzU0ODM3MDNVLAkvLyA8NCwwLDQsNz46IENvc3QgNCB2c2xkb2k0IDw3LDQsMCw0PiwgPDcsNCwwLDQ+CisgIDExNjc3MjExMTdVLAkvLyA8NCwwLDQsdT46IENvc3QgMiB2bXJnaHcgPDQsNCw0LDQ+LCBMSFMKKyAgMTE2ODU1NjAzMlUsCS8vIDw0LDAsNSwwPjogQ29zdCAyIHZtcmdodyBSSFMsIDwwLDAsMCwwPgorICA5NDgxNDMxMFUsCS8vIDw0LDAsNSwxPjogQ29zdCAxIHZtcmdodyBSSFMsIExIUworICAyMjQyMjk4MDI5VSwJLy8gPDQsMCw1LDI+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDAsMiwxLDI+CisgIDI2Mzc4NTkyODRVLAkvLyA8NCwwLDUsMz46IENvc3QgMyB2c2xkb2k0IDwzLDQsMCw1PiwgPDMsNCwwLDU+CisgIDExNjg1NTYzNzBVLAkvLyA8NCwwLDUsND46IENvc3QgMiB2bXJnaHcgUkhTLCA8MCw0LDEsNT4KKyAgMjI0MjMwNjUzMFUsCS8vIDw0LDAsNSw1PjogQ29zdCAzIHZtcmdodyBSSFMsIDwwLDUsdSw1PgorICAyMjQyMjk4MzU4VSwJLy8gPDQsMCw1LDY+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDAsNiwxLDc+CisgIDI2NjE3NTAwNzJVLAkvLyA8NCwwLDUsNz46IENvc3QgMyB2c2xkb2k0IDw3LDQsMCw1PiwgPDcsNCwwLDU+CisgIDk0ODE0ODc3VSwJLy8gPDQsMCw1LHU+OiBDb3N0IDEgdm1yZ2h3IFJIUywgTEhTCisgIDMzMTY1ODAzNjJVLAkvLyA8NCwwLDYsMD46IENvc3QgNCB2bXJnaHcgPDQsNiw1LDE+LCA8MCwwLDEsMT4KKyAgMjI0Mjg0NjgyMlUsCS8vIDw0LDAsNiwxPjogQ29zdCAzIHZtcmdodyA8NCw2LDUsMj4sIExIUworICAzNzk4ODcyNTcwVSwJLy8gPDQsMCw2LDI+OiBDb3N0IDQgdnNsZG9pOCA8Niw3LDQsMD4sIDw2LDIsNywzPgorICAzNzk2MjE4NDEzVSwJLy8gPDQsMCw2LDM+OiBDb3N0IDQgdnNsZG9pOCA8NiwzLDQsMD4sIDw2LDMsNCwwPgorICAzODM0NTI4MjczVSwJLy8gPDQsMCw2LDQ+OiBDb3N0IDQgdnNsZG9pMTIgPDEsNSwwLDQ+LCA8MCw2LDQsNz4KKyAgMzc5ODg3MjgxMVUsCS8vIDw0LDAsNiw1PjogQ29zdCA0IHZzbGRvaTggPDYsNyw0LDA+LCA8Niw1LDcsMT4KKyAgMzMxNjYyMTg3NlUsCS8vIDw0LDAsNiw2PjogQ29zdCA0IHZtcmdodyA8NCw2LDUsNj4sIDwwLDYsdSw2PgorICAyNzI1MTMxMTIxVSwJLy8gPDQsMCw2LDc+OiBDb3N0IDMgdnNsZG9pOCA8Niw3LDQsMD4sIDw2LDcsNCwwPgorICAyMjQyODQ3Mzg5VSwJLy8gPDQsMCw2LHU+OiBDb3N0IDMgdm1yZ2h3IDw0LDYsNSwyPiwgTEhTCisgIDMzNzc2OTI2NzJVLAkvLyA8NCwwLDcsMD46IENvc3QgNCB2bXJnbHcgPDMsNiw0LDc+LCA8MCwwLDAsMD4KKyAgMjI0MzQ5Mzk5MFUsCS8vIDw0LDAsNywxPjogQ29zdCAzIHZtcmdodyA8NCw3LDUsMD4sIExIUworICAzNzc1NjQ4OTcwVSwJLy8gPDQsMCw3LDI+OiBDb3N0IDUgdnNsZG9pOCA8Mix1LDQsMD4sIDw3LDIsNiwzPgorICAzODAyMTkxMTEwVSwJLy8gPDQsMCw3LDM+OiBDb3N0IDQgdnNsZG9pOCA8NywzLDQsMD4sIDw3LDMsNCwwPgorICAzMzE3MjM2MDUwVSwJLy8gPDQsMCw3LDQ+OiBDb3N0IDQgdm1yZ2h3IDw0LDcsNSwwPiwgPDAsNCwxLDU+CisgIDM4MDM1MTgzNzZVLAkvLyA8NCwwLDcsNT46IENvc3QgNCB2c2xkb2k4IDw3LDUsNCwwPiwgPDcsNSw0LDA+CisgIDMzMTcyMzYyMTRVLAkvLyA8NCwwLDcsNj46IENvc3QgNSB2bXJnaHcgPDQsNyw1LDA+LCA8MCw2LDEsNz4KKyAgMzc5ODg3MzcwOFUsCS8vIDw0LDAsNyw3PjogQ29zdCA0IHZzbGRvaTggPDYsNyw0LDA+LCA8Nyw3LDcsNz4KKyAgMjI0MzQ5NDU1N1UsCS8vIDw0LDAsNyx1PjogQ29zdCAzIHZtcmdodyA8NCw3LDUsMD4sIExIUworICAxMTcwNTQ2Njg4VSwJLy8gPDQsMCx1LDA+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDAsMCwwLDA+CisgIDk2ODA0OTY2VSwJLy8gPDQsMCx1LDE+OiBDb3N0IDEgdm1yZ2h3IFJIUywgTEhTCisgIDE2ODUyNzUyOTNVLAkvLyA8NCwwLHUsMj46IENvc3QgMiB2c2xkb2kxMiA8MSwyLDMsND4sIExIUworICAyNjM3ODgzODYzVSwJLy8gPDQsMCx1LDM+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LDAsdT4sIDwzLDQsMCx1PgorICAxMTcwNTQ3MDI2VSwJLy8gPDQsMCx1LDQ+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDAsNCwxLDU+CisgIDI2OTg1OTAzNjJVLAkvLyA8NCwwLHUsNT46IENvc3QgMyB2c2xkb2k4IDwyLDMsNCwwPiwgUkhTCisgIDIyNDQyODkwMTRVLAkvLyA8NCwwLHUsNj46IENvc3QgMyB2bXJnaHcgUkhTLCA8MCw2LDEsNz4KKyAgMjY2MTc3NDY1MVUsCS8vIDw0LDAsdSw3PjogQ29zdCAzIHZzbGRvaTQgPDcsNCwwLHU+LCA8Nyw0LDAsdT4KKyAgOTY4MDU1MzNVLAkvLyA8NCwwLHUsdT46IENvc3QgMSB2bXJnaHcgUkhTLCBMSFMKKyAgMjY2Nzc0OTQ3OFUsCS8vIDw0LDEsMCwwPjogQ29zdCAzIHZzbGRvaTQgPHUsNCwxLDA+LCBMSFMKKyAgMjY4OTk2NjE4MlUsCS8vIDw0LDEsMCwxPjogQ29zdCAzIHZzbGRvaTggPDAsdSw0LDE+LCBMSFMKKyAgMjIzODU3MTQxOFUsCS8vIDw0LDEsMCwyPjogQ29zdCAzIHZtcmdodyA8NCwwLDEsMj4sIDwxLDIsMyw0PgorICAzNzExNjMzODgwVSwJLy8gPDQsMSwwLDM+OiBDb3N0IDQgdnNsZG9pNCA8Myw0LDEsMD4sIDwzLDQsMSwwPgorICAyNjg5OTY2NDE4VSwJLy8gPDQsMSwwLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MCx1LDQsMT4sIDwwLDQsMSw1PgorICAzMzYxMDQ2ODY2VSwJLy8gPDQsMSwwLDU+OiBDb3N0IDQgdm1yZ2x3IDwwLHUsNCwwPiwgPDAsNCwxLDU+CisgIDM3NDE0OTU4MDJVLAkvLyA8NCwxLDAsNj46IENvc3QgNCB2c2xkb2k0IDx1LDQsMSwwPiwgPDYsMiw3LDM+CisgIDM3NDE0OTYzMTRVLAkvLyA8NCwxLDAsNz46IENvc3QgNCB2c2xkb2k0IDx1LDQsMSwwPiwgPDcsMCwxLDI+CisgIDI2ODk5NjY3NjVVLAkvLyA8NCwxLDAsdT46IENvc3QgMyB2c2xkb2k4IDwwLHUsNCwxPiwgPDAsdSw0LDE+CisgIDM3NjQzNzIyMjJVLAkvLyA8NCwxLDEsMD46IENvc3QgNCB2c2xkb2k4IDwxLDAsNCwxPiwgPDEsMCw0LDE+CisgIDI3NTgyMDYyNjNVLAkvLyA8NCwxLDEsMT46IENvc3QgMyB2c2xkb2kxMiA8MSwxLDEsND4sIDwxLDEsMSw0PgorICAyNjk4NTkzMTc4VSwJLy8gPDQsMSwxLDI+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDQsMT4sIDwxLDIsMyw0PgorICAzMzYxMDU3ODEwVSwJLy8gPDQsMSwxLDM+OiBDb3N0IDQgdm1yZ2x3IDwwLHUsNCwxPiwgPDQsMiwxLDM+CisgIDM4MjczMDMyNTBVLAkvLyA8NCwxLDEsND46IENvc3QgNCB2c2xkb2kxMiA8MCwzLDEsND4sIDwxLDEsNCw0PgorICAyMjg3MzEzMjM0VSwJLy8gPDQsMSwxLDU+OiBDb3N0IDMgdm1yZ2x3IDwwLHUsNCwxPiwgPDAsNCwxLDU+CisgIDM3NjM3MDkxNzFVLAkvLyA8NCwxLDEsNj46IENvc3QgNCB2c2xkb2k4IDwwLHUsNCwxPiwgPDEsNiw1LDc+CisgIDMzNjEwNTgxMzhVLAkvLyA8NCwxLDEsNz46IENvc3QgNCB2bXJnbHcgPDAsdSw0LDE+LCA8NCw2LDEsNz4KKyAgMjIzOTc1OTc0NFUsCS8vIDw0LDEsMSx1PjogQ29zdCAzIHZtcmdodyA8NCwxLHUsMz4sIDwxLHUsMyw0PgorICAyNjM3OTA2MDIyVSwJLy8gPDQsMSwyLDA+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LDEsMj4sIExIUworICAyNjM3OTA2ODQyVSwJLy8gPDQsMSwyLDE+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LDEsMj4sIDwxLDIsMyw0PgorICAzNzYzNzA5NTQ0VSwJLy8gPDQsMSwyLDI+OiBDb3N0IDQgdnNsZG9pOCA8MCx1LDQsMT4sIDwyLDIsMiwyPgorICAxNjg1Mjc1NTQ2VSwJLy8gPDQsMSwyLDM+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8MSwyLDMsND4KKyAgMjYzNzkwOTMwMlUsCS8vIDw0LDEsMiw0PjogQ29zdCAzIHZzbGRvaTQgPDMsNCwxLDI+LCBSSFMKKyAgMzM2MTA2MzI1MFUsCS8vIDw0LDEsMiw1PjogQ29zdCA0IHZtcmdsdyA8MCx1LDQsMj4sIDwwLDQsMSw1PgorICAzNzYzNzA5ODgyVSwJLy8gPDQsMSwyLDY+OiBDb3N0IDQgdnNsZG9pOCA8MCx1LDQsMT4sIDwyLDYsMyw3PgorICAzNzM1NTQxMDU0VSwJLy8gPDQsMSwyLDc+OiBDb3N0IDQgdnNsZG9pNCA8Nyw0LDEsMj4sIDw3LDQsMSwyPgorICAxNjg1NjQ0MjMxVSwJLy8gPDQsMSwyLHU+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMix1LDQ+LCA8MSwyLHUsND4KKyAgMjcwMjU3NTc5MlUsCS8vIDw0LDEsMywwPjogQ29zdCAzIHZzbGRvaTggPDMsMCw0LDE+LCA8MywwLDQsMT4KKyAgMzgzMjc1OTI1N1UsCS8vIDw0LDEsMywxPjogQ29zdCA0IHZzbGRvaTEyIDwxLDIsMyw0PiwgPDEsMywxLDQ+CisgIDM4MzMzNDkwOTBVLAkvLyA8NCwxLDMsMj46IENvc3QgNCB2c2xkb2kxMiA8MSwzLDIsND4sIDwxLDMsMiw0PgorICAzNzYzNzEwMzY0VSwJLy8gPDQsMSwzLDM+OiBDb3N0IDQgdnNsZG9pOCA8MCx1LDQsMT4sIDwzLDMsMywzPgorICAyNzA3ODg0NTQ2VSwJLy8gPDQsMSwzLDQ+OiBDb3N0IDMgdnNsZG9pOCA8Myx1LDQsMT4sIDwzLDQsNSw2PgorICAzMzYxMDcxNDQyVSwJLy8gPDQsMSwzLDU+OiBDb3N0IDQgdm1yZ2x3IDwwLHUsNCwzPiwgPDAsNCwxLDU+CisgIDM3NzIzMzY3OTZVLAkvLyA8NCwxLDMsNj46IENvc3QgNCB2c2xkb2k4IDwyLDMsNCwxPiwgPDMsNiw0LDc+CisgIDM3NzU2NTQ1OTVVLAkvLyA8NCwxLDMsNz46IENvc3QgNSB2c2xkb2k4IDwyLHUsNCwxPiwgPDMsNywwLDE+CisgIDI3MDc4ODQ4NTZVLAkvLyA8NCwxLDMsdT46IENvc3QgMyB2c2xkb2k4IDwzLHUsNCwxPiwgPDMsdSw0LDE+CisgIDI2Njc3ODIyNDZVLAkvLyA8NCwxLDQsMD46IENvc3QgMyB2c2xkb2k0IDx1LDQsMSw0PiwgTEhTCisgIDIyNDE0NjMwOTJVLAkvLyA8NCwxLDQsMT46IENvc3QgMyB2bXJnaHcgPDQsNCw0LDQ+LCA8MSwxLDEsMT4KKyAgMjI0MTU1MzMwNlUsCS8vIDw0LDEsNCwyPjogQ29zdCAzIHZtcmdodyA8NCw0LDUsNj4sIDwxLDIsMyw0PgorICAzODI3MzAzNDg0VSwJLy8gPDQsMSw0LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDAsMywxLDQ+LCA8MSw0LDMsND4KKyAgMjY2Nzc4NTQyNFUsCS8vIDw0LDEsNCw0PjogQ29zdCAzIHZzbGRvaTQgPHUsNCwxLDQ+LCA8NCw0LDQsND4KKyAgMjY4OTk2OTQ2MlUsCS8vIDw0LDEsNCw1PjogQ29zdCAzIHZzbGRvaTggPDAsdSw0LDE+LCBSSFMKKyAgMzc2MzcxMTMyMlUsCS8vIDw0LDEsNCw2PjogQ29zdCA0IHZzbGRvaTggPDAsdSw0LDE+LCA8NCw2LDEsNz4KKyAgMzg2NzExNjYzNlUsCS8vIDw0LDEsNCw3PjogQ29zdCA0IHZzbGRvaTEyIDw3LDAsMSw0PiwgPDEsNCw3LDA+CisgIDI2ODk5Njk3MDVVLAkvLyA8NCwxLDQsdT46IENvc3QgMyB2c2xkb2k4IDwwLHUsNCwxPiwgUkhTCisgIDE1NDYyNzMxMDZVLAkvLyA8NCwxLDUsMD46IENvc3QgMiB2c2xkb2k0IDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDExNjg1NTY4NTJVLAkvLyA8NCwxLDUsMT46IENvc3QgMiB2bXJnaHcgUkhTLCA8MSwxLDEsMT4KKyAgMTE2ODU1Njk1MFUsCS8vIDw0LDEsNSwyPjogQ29zdCAyIHZtcmdodyBSSFMsIDwxLDIsMywwPgorICAyNjIwMDE2NzkwVSwJLy8gPDQsMSw1LDM+OiBDb3N0IDMgdnNsZG9pNCA8MCw0LDEsNT4sIDwzLDAsMSwyPgorICAxNTQ2Mjc2MTUwVSwJLy8gPDQsMSw1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8MCw0LDEsNT4sIFJIUworICAyNjIwMDE4NjkyVSwJLy8gPDQsMSw1LDU+OiBDb3N0IDMgdnNsZG9pNCA8MCw0LDEsNT4sIDw1LDUsNSw1PgorICAyMjQyMjk5MDg3VSwJLy8gPDQsMSw1LDY+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDEsNiwxLDc+CisgIDI2Njc3OTU0NTBVLAkvLyA8NCwxLDUsNz46IENvc3QgMyB2c2xkb2k0IDx1LDQsMSw1PiwgPDcsMCwxLDI+CisgIDE1NDYyNzg3MDJVLAkvLyA8NCwxLDUsdT46IENvc3QgMiB2c2xkb2k0IDwwLDQsMSw1PiwgTEhTCisgIDM3ODE2MjgxOTNVLAkvLyA8NCwxLDYsMD46IENvc3QgNCB2c2xkb2k4IDwzLHUsNCwxPiwgPDYsMCwxLDI+CisgIDM4MzI3NTk1MDNVLAkvLyA8NCwxLDYsMT46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsND4sIDwxLDYsMSw3PgorICAzMzE2MjYxNzg2VSwJLy8gPDQsMSw2LDI+OiBDb3N0IDQgdm1yZ2h3IDw0LDYsMCw3PiwgPDEsMiwzLDQ+CisgIDM3ODE2Mjg0NjZVLAkvLyA8NCwxLDYsMz46IENvc3QgNCB2c2xkb2k4IDwzLHUsNCwxPiwgPDYsMyw0LDU+CisgIDM4MjczMDM2NThVLAkvLyA8NCwxLDYsND46IENvc3QgNCB2c2xkb2kxMiA8MCwzLDEsND4sIDwxLDYsNCw3PgorICAzMzYxMDk2MDE4VSwJLy8gPDQsMSw2LDU+OiBDb3N0IDQgdm1yZ2x3IDwwLHUsNCw2PiwgPDAsNCwxLDU+CisgIDM3ODgyNjQyNDhVLAkvLyA8NCwxLDYsNj46IENvc3QgNCB2c2xkb2k4IDw1LDAsNCwxPiwgPDYsNiw2LDY+CisgIDM3ODgyNjQyNzBVLAkvLyA8NCwxLDYsNz46IENvc3QgNCB2c2xkb2k4IDw1LDAsNCwxPiwgPDYsNywwLDE+CisgIDM4MzI3NTk1NjZVLAkvLyA8NCwxLDYsdT46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsND4sIDwxLDYsdSw3PgorICAyNzI2NDY2NTgwVSwJLy8gPDQsMSw3LDA+OiBDb3N0IDMgdnNsZG9pOCA8NywwLDQsMT4sIDw3LDAsNCwxPgorICAzMzc3NjkyNjgyVSwJLy8gPDQsMSw3LDE+OiBDb3N0IDQgdm1yZ2x3IDwzLDYsNCw3PiwgPDAsMCwxLDE+CisgIDMzNzc2OTQ4NzBVLAkvLyA8NCwxLDcsMj46IENvc3QgNCB2bXJnbHcgPDMsNiw0LDc+LCA8MywwLDEsMj4KKyAgMzgwMjE5OTMwM1UsCS8vIDw0LDEsNywzPjogQ29zdCA0IHZzbGRvaTggPDcsMyw0LDE+LCA8NywzLDQsMT4KKyAgMjczMTc3NTMzNFUsCS8vIDw0LDEsNyw0PjogQ29zdCAzIHZzbGRvaTggPDcsdSw0LDE+LCA8Nyw0LDUsNj4KKyAgMzM3NzY5MzAxMFUsCS8vIDw0LDEsNyw1PjogQ29zdCA0IHZtcmdsdyA8Myw2LDQsNz4sIDwwLDQsMSw1PgorICAzMzY1NzQ5ODA0VSwJLy8gPDQsMSw3LDY+OiBDb3N0IDUgdm1yZ2x3IDwxLDYsNCw3PiwgPDEsNCwxLDY+CisgIDM3ODgyNjUwNjhVLAkvLyA8NCwxLDcsNz46IENvc3QgNCB2c2xkb2k4IDw1LDAsNCwxPiwgPDcsNyw3LDc+CisgIDI3MzE3NzU2NDRVLAkvLyA8NCwxLDcsdT46IENvc3QgMyB2c2xkb2k4IDw3LHUsNCwxPiwgPDcsdSw0LDE+CisgIDE1NDYyOTc2ODVVLAkvLyA8NCwxLHUsMD46IENvc3QgMiB2c2xkb2k0IDwwLDQsMSx1PiwgPDAsNCwxLHU+CisgIDExNzA1NDc1MDhVLAkvLyA8NCwxLHUsMT46IENvc3QgMiB2bXJnaHcgUkhTLCA8MSwxLDEsMT4KKyAgMTE3MDU0NzYwNlUsCS8vIDw0LDEsdSwyPjogQ29zdCAyIHZtcmdodyBSSFMsIDwxLDIsMywwPgorICAxNjg5MjU3MzQ0VSwJLy8gPDQsMSx1LDM+OiBDb3N0IDIgdnNsZG9pMTIgPDEsdSwzLDQ+LCA8MSx1LDMsND4KKyAgMTU0NjMwMDcyNlUsCS8vIDw0LDEsdSw0PjogQ29zdCAyIHZzbGRvaTQgPDAsNCwxLHU+LCBSSFMKKyAgMjI4NDcxNjM3MFUsCS8vIDw0LDEsdSw1PjogQ29zdCAzIHZtcmdsdyA8MCw0LDQsdT4sIDwwLDQsMSw1PgorICAyMjQ0Mjg5NzQzVSwJLy8gPDQsMSx1LDY+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDEsNiwxLDc+CisgIDI2Njc4MjAwMjZVLAkvLyA8NCwxLHUsNz46IENvc3QgMyB2c2xkb2k0IDx1LDQsMSx1PiwgPDcsMCwxLDI+CisgIDE1NDYzMDMyNzhVLAkvLyA8NCwxLHUsdT46IENvc3QgMiB2c2xkb2k0IDwwLDQsMSx1PiwgTEhTCisgIDM3Mjk2MjEwOTRVLAkvLyA8NCwyLDAsMD46IENvc3QgNCB2c2xkb2k0IDw2LDQsMiwwPiwgTEhTCisgIDM3NjM3MTYxOThVLAkvLyA8NCwyLDAsMT46IENvc3QgNCB2c2xkb2k4IDwwLHUsNCwyPiwgTEhTCisgIDIyMzg4NTg4NTZVLAkvLyA8NCwyLDAsMj46IENvc3QgMyB2bXJnaHcgPDQsMCw1LDE+LCA8MiwyLDIsMj4KKyAgMjI5NTkzMDk4MlUsCS8vIDw0LDIsMCwzPjogQ29zdCAzIHZtcmdsdyA8MiwzLDQsMD4sIExIUworICAzNzYzNzE2NDM0VSwJLy8gPDQsMiwwLDQ+OiBDb3N0IDQgdnNsZG9pOCA8MCx1LDQsMj4sIDwwLDQsMSw1PgorICAyMjM4ODU5MTA3VSwJLy8gPDQsMiwwLDU+OiBDb3N0IDMgdm1yZ2h3IDw0LDAsNSwxPiwgPDIsNSwzLDE+CisgIDIyMzg4NTkxOTRVLAkvLyA8NCwyLDAsNj46IENvc3QgMyB2bXJnaHcgPDQsMCw1LDE+LCA8Miw2LDMsNz4KKyAgMzMxMjYwMTA2NlUsCS8vIDw0LDIsMCw3PjogQ29zdCA0IHZtcmdodyA8NCwwLDUsMT4sIDwyLDcsMCwxPgorICAyMjk1OTMwOTg3VSwJLy8gPDQsMiwwLHU+OiBDb3N0IDMgdm1yZ2x3IDwyLDMsNCwwPiwgTEhTCisgIDM2OTk3Njk0NDZVLAkvLyA8NCwyLDEsMD46IENvc3QgNCB2c2xkb2k0IDwxLDQsMiwxPiwgTEhTCisgIDMzMTMyNTU5NzFVLAkvLyA8NCwyLDEsMT46IENvc3QgNCB2bXJnaHcgPDQsMSw1LDA+LCA8MiwxLDMsNT4KKyAgMzM2MTA1NjM2MFUsCS8vIDw0LDIsMSwyPjogQ29zdCA0IHZtcmdsdyA8MCx1LDQsMT4sIDwyLDIsMiwyPgorICAyMjg3MzEyOTk4VSwJLy8gPDQsMiwxLDM+OiBDb3N0IDMgdm1yZ2x3IDwwLHUsNCwxPiwgTEhTCisgIDM3ODg5MzIxNDhVLAkvLyA8NCwyLDEsND46IENvc3QgNCB2c2xkb2k4IDw1LDEsNCwyPiwgPDEsNCwyLDU+CisgIDMzMTMyNTYyOTBVLAkvLyA8NCwyLDEsNT46IENvc3QgNCB2bXJnaHcgPDQsMSw1LDA+LCA8Miw1LDMsMD4KKyAgMzgzODI4OTQ2OVUsCS8vIDw0LDIsMSw2PjogQ29zdCA0IHZzbGRvaTEyIDwyLDEsNiw0PiwgPDIsMSw2LDQ+CisgIDMzNjk2ODI4NjVVLAkvLyA8NCwyLDEsNz46IENvc3QgNSB2bXJnbHcgPDIsMyw0LDE+LCA8Miw2LDIsNz4KKyAgMjI4NzMxMzAwM1UsCS8vIDw0LDIsMSx1PjogQ29zdCAzIHZtcmdsdyA8MCx1LDQsMT4sIExIUworICAzODM4NjU4MTMzVSwJLy8gPDQsMiwyLDA+OiBDb3N0IDQgdnNsZG9pMTIgPDIsMiwyLDQ+LCA8MiwyLDAsMT4KKyAgMzcxMTcyMjM5NFUsCS8vIDw0LDIsMiwxPjogQ29zdCA0IHZzbGRvaTQgPDMsNCwyLDI+LCA8MSwyLDMsND4KKyAgMjc1OTAxODA4OFUsCS8vIDw0LDIsMiwyPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDIsMiwyLDI+CisgIDI3NTkwMTgwOThVLAkvLyA8NCwyLDIsMz46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsND4sIDwyLDIsMywzPgorICAzODM4NjU4MTY4VSwJLy8gPDQsMiwyLDQ+OiBDb3N0IDQgdnNsZG9pMTIgPDIsMiwyLDQ+LCA8MiwyLDQsMD4KKyAgMzM2OTAyNzM0MVUsCS8vIDw0LDIsMiw1PjogQ29zdCA0IHZtcmdsdyA8MiwyLDQsMj4sIDwyLDQsMiw1PgorICAyMjQwMjI3MjU4VSwJLy8gPDQsMiwyLDY+OiBDb3N0IDMgdm1yZ2h3IDw0LDIsNSw2PiwgPDIsNiwzLDc+CisgIDM3MzU2MTQ3OTFVLAkvLyA8NCwyLDIsNz46IENvc3QgNCB2c2xkb2k0IDw3LDQsMiwyPiwgPDcsNCwyLDI+CisgIDI3NTkwMTgxNDNVLAkvLyA8NCwyLDIsdT46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsND4sIDwyLDIsdSwzPgorICAyNzU5MDE4MTUwVSwJLy8gPDQsMiwzLDA+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8MiwzLDAsMT4KKyAgMzgzMTk0ODk3NVUsCS8vIDw0LDIsMywxPjogQ29zdCA0IHZzbGRvaTEyIDwxLDEsMSw0PiwgPDIsMywxLDE+CisgIDM4MzI3NTk5OTNVLAkvLyA8NCwyLDMsMj46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsND4sIDwyLDMsMiwyPgorICAyNzU5MDE4MTgwVSwJLy8gPDQsMiwzLDM+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8MiwzLDMsND4KKyAgMjc1OTAxODE4NVUsCS8vIDw0LDIsMyw0PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDIsMyw0LDA+CisgIDM4Mzk1NDI5OThVLAkvLyA8NCwyLDMsNT46IENvc3QgNCB2c2xkb2kxMiA8MiwzLDUsND4sIDwyLDMsNSw0PgorICAzMzE0NjQwODI2VSwJLy8gPDQsMiwzLDY+OiBDb3N0IDQgdm1yZ2h3IDw0LDMsNSw3PiwgPDIsNiwzLDc+CisgIDI3NjU5NDg2NDhVLAkvLyA8NCwyLDMsNz46IENvc3QgMyB2c2xkb2kxMiA8MiwzLDcsND4sIDwyLDMsNyw0PgorICAyNzU5MDE4MjIyVSwJLy8gPDQsMiwzLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8MiwzLHUsMT4KKyAgMzgzODY1ODI5NVUsCS8vIDw0LDIsNCwwPjogQ29zdCA0IHZzbGRvaTEyIDwyLDIsMiw0PiwgPDIsNCwwLDE+CisgIDMzMTUyMDU2NjdVLAkvLyA8NCwyLDQsMT46IENvc3QgNCB2bXJnaHcgPDQsNCw0LDQ+LCA8MiwxLDMsNT4KKyAgMjI0MTQ2MzkxMlUsCS8vIDw0LDIsNCwyPjogQ29zdCAzIHZtcmdodyA8NCw0LDQsND4sIDwyLDIsMiwyPgorICAxMjM0ODI5NDE0VSwJLy8gPDQsMiw0LDM+OiBDb3N0IDIgdm1yZ2x3IDw0LDQsNCw0PiwgTEhTCisgIDIyNDE0NjQwODVVLAkvLyA8NCwyLDQsND46IENvc3QgMyB2bXJnaHcgPDQsNCw0LDQ+LCA8Miw0LDMsND4KKyAgMjI0MTU0NjA4N1UsCS8vIDw0LDIsNCw1PjogQ29zdCAzIHZtcmdodyA8NCw0LDUsNT4sIDwyLDUsMyw1PgorICAyMjQxNDY0MjUwVSwJLy8gPDQsMiw0LDY+OiBDb3N0IDMgdm1yZ2h3IDw0LDQsNCw0PiwgPDIsNiwzLDc+CisgIDM3NDE2MDI4NzNVLAkvLyA8NCwyLDQsNz46IENvc3QgNCB2c2xkb2k0IDx1LDQsMiw0PiwgPDcsMCx1LDI+CisgIDEyMzQ4Mjk0MTlVLAkvLyA8NCwyLDQsdT46IENvc3QgMiB2bXJnbHcgPDQsNCw0LDQ+LCBMSFMKKyAgMjYyNjA2MDM5MFUsCS8vIDw0LDIsNSwwPjogQ29zdCAzIHZzbGRvaTQgPDEsNCwyLDU+LCBMSFMKKyAgMjYyNjA2MTM2NFUsCS8vIDw0LDIsNSwxPjogQ29zdCAzIHZzbGRvaTQgPDEsNCwyLDU+LCA8MSw0LDIsNT4KKyAgMTE2ODU1NzY3MlUsCS8vIDw0LDIsNSwyPjogQ29zdCAyIHZtcmdodyBSSFMsIDwyLDIsMiwyPgorICAxMjIyMjMwMTE4VSwJLy8gPDQsMiw1LDM+OiBDb3N0IDIgdm1yZ2x3IDwyLDMsNCw1PiwgTEhTCisgIDI2MjYwNjM2NzBVLAkvLyA8NCwyLDUsND46IENvc3QgMyB2c2xkb2k0IDwxLDQsMiw1PiwgUkhTCisgIDIyNDIyOTk3NTJVLAkvLyA8NCwyLDUsNT46IENvc3QgMyB2bXJnaHcgUkhTLCA8Miw1LDMsNj4KKyAgMTE2ODU1ODAxMFUsCS8vIDw0LDIsNSw2PjogQ29zdCAyIHZtcmdodyBSSFMsIDwyLDYsMyw3PgorICAyMjQyMjk5ODgyVSwJLy8gPDQsMiw1LDc+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDIsNywwLDE+CisgIDEyMjIyMzAxMjNVLAkvLyA8NCwyLDUsdT46IENvc3QgMiB2bXJnbHcgPDIsMyw0LDU+LCBMSFMKKyAgMzcxMTc1NDM0MlUsCS8vIDw0LDIsNiwwPjogQ29zdCA0IHZzbGRvaTQgPDMsNCwyLDY+LCBMSFMKKyAgMzcxMTc1NTE2MlUsCS8vIDw0LDIsNiwxPjogQ29zdCA0IHZzbGRvaTQgPDMsNCwyLDY+LCA8MSwyLDMsND4KKyAgMzgzODY1ODQ4MVUsCS8vIDw0LDIsNiwyPjogQ29zdCA0IHZzbGRvaTEyIDwyLDIsMiw0PiwgPDIsNiwyLDc+CisgIDI3NTkwMTg0MjZVLAkvLyA8NCwyLDYsMz46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsND4sIDwyLDYsMyw3PgorICAzODM4NjU4NDk5VSwJLy8gPDQsMiw2LDQ+OiBDb3N0IDQgdnNsZG9pMTIgPDIsMiwyLDQ+LCA8Miw2LDQsNz4KKyAgMzczNTY0NjMxMFUsCS8vIDw0LDIsNiw1PjogQ29zdCA0IHZzbGRvaTQgPDcsNCwyLDY+LCA8NSw2LDcsND4KKyAgMzMxNjU5MDUyMlUsCS8vIDw0LDIsNiw2PjogQ29zdCA0IHZtcmdodyA8NCw2LDUsMj4sIDwyLDYsMyw3PgorICAzNzk4ODg5MzMxVSwJLy8gPDQsMiw2LDc+OiBDb3N0IDQgdnNsZG9pOCA8Niw3LDQsMj4sIDw2LDcsNCwyPgorICAyNzU5MDE4NDcxVSwJLy8gPDQsMiw2LHU+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8Miw2LHUsNz4KKyAgMzg3NDU2NDA3NFUsCS8vIDw0LDIsNywwPjogQ29zdCA0IHZzbGRvaTEyIDx1LDIsMyw0PiwgPDIsNywwLDE+CisgIDM4MDA4ODAyMzBVLAkvLyA8NCwyLDcsMT46IENvc3QgNCB2c2xkb2k4IDw3LDEsNCwyPiwgPDcsMSw0LDI+CisgIDMzNzE3MjIzNDRVLAkvLyA8NCwyLDcsMj46IENvc3QgNCB2bXJnbHcgPDIsNiw0LDc+LCA8MiwyLDIsMj4KKyAgMjMwMzk1MDk1MFUsCS8vIDw0LDIsNywzPjogQ29zdCAzIHZtcmdsdyA8Myw2LDQsNz4sIExIUworICAzMzcxNzIyMzQ2VSwJLy8gPDQsMiw3LDQ+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsNCw3PiwgPDIsMiwyLDQ+CisgIDMzNzE3MjI1MDlVLAkvLyA8NCwyLDcsNT46IENvc3QgNSB2bXJnbHcgPDIsNiw0LDc+LCA8Miw0LDIsNT4KKyAgMzMxNzIzNzY5MFUsCS8vIDw0LDIsNyw2PjogQ29zdCA0IHZtcmdodyA8NCw3LDUsMD4sIDwyLDYsMyw3PgorICAzMzE3MjM3NzM4VSwJLy8gPDQsMiw3LDc+OiBDb3N0IDQgdm1yZ2h3IDw0LDcsNSwwPiwgPDIsNywwLDE+CisgIDIzMDM5NTA5NTVVLAkvLyA8NCwyLDcsdT46IENvc3QgMyB2bXJnbHcgPDMsNiw0LDc+LCBMSFMKKyAgMjc1OTAxODU1NVUsCS8vIDw0LDIsdSwwPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDIsdSwwLDE+CisgIDI2MjYwODU5NDNVLAkvLyA8NCwyLHUsMT46IENvc3QgMyB2c2xkb2k0IDwxLDQsMix1PiwgPDEsNCwyLHU+CisgIDExNzA1NDgzMjhVLAkvLyA8NCwyLHUsMj46IENvc3QgMiB2bXJnaHcgUkhTLCA8MiwyLDIsMj4KKyAgMTIyMjI1NDY5NFUsCS8vIDw0LDIsdSwzPjogQ29zdCAyIHZtcmdsdyA8MiwzLDQsdT4sIExIUworICAyNzU5MDE4NTk1VSwJLy8gPDQsMix1LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8Mix1LDQsNT4KKyAgMjI0NDI5MDQwOFUsCS8vIDw0LDIsdSw1PjogQ29zdCAzIHZtcmdodyBSSFMsIDwyLDUsMyw2PgorICAxMTcwNTQ4NjY2VSwJLy8gPDQsMix1LDY+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDIsNiwzLDc+CisgIDI3NjkyNjY4MTNVLAkvLyA8NCwyLHUsNz46IENvc3QgMyB2c2xkb2kxMiA8Mix1LDcsND4sIDwyLHUsNyw0PgorICAxMjIyMjU0Njk5VSwJLy8gPDQsMix1LHU+OiBDb3N0IDIgdm1yZ2x3IDwyLDMsNCx1PiwgTEhTCisgIDIyMzg4NTk0MTRVLAkvLyA8NCwzLDAsMD46IENvc3QgMyB2bXJnaHcgPDQsMCw1LDE+LCA8MywwLDEsMj4KKyAgMjc1OTAxODY0NlUsCS8vIDw0LDMsMCwxPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDMsMCwxLDI+CisgIDMzMTIzMTQ3MDhVLAkvLyA8NCwzLDAsMj46IENvc3QgNCB2bXJnaHcgPDQsMCwxLDI+LCA8MywyLDQsMz4KKyAgMjIzODg1OTY3NlUsCS8vIDw0LDMsMCwzPjogQ29zdCAzIHZtcmdodyA8NCwwLDUsMT4sIDwzLDMsMywzPgorICAyMjk1OTMxODAyVSwJLy8gPDQsMywwLDQ+OiBDb3N0IDMgdm1yZ2x3IDwyLDMsNCwwPiwgPDEsMiwzLDQ+CisgIDM3MzU2NzA4ODZVLAkvLyA8NCwzLDAsNT46IENvc3QgNCB2c2xkb2k0IDw3LDQsMywwPiwgPDUsNiw3LDQ+CisgIDMzMTIzMTUwMzZVLAkvLyA8NCwzLDAsNj46IENvc3QgNCB2bXJnaHcgPDQsMCwxLDI+LCA8Myw2LDQsNz4KKyAgMzM2OTY3NDY4MlUsCS8vIDw0LDMsMCw3PjogQ29zdCA0IHZtcmdsdyA8MiwzLDQsMD4sIDwyLDYsMyw3PgorICAyNzU5MDE4NzA5VSwJLy8gPDQsMywwLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8MywwLHUsMj4KKyAgMzM2MTA1NTYzOFUsCS8vIDw0LDMsMSwwPjogQ29zdCA0IHZtcmdsdyA8MCx1LDQsMT4sIDwxLDIsMywwPgorICAzODMxOTQ5NTQyVSwJLy8gPDQsMywxLDE+OiBDb3N0IDQgdnNsZG9pMTIgPDEsMSwxLDQ+LCA8MywxLDEsMT4KKyAgMjcwMzkxNzk3OFUsCS8vIDw0LDMsMSwyPjogQ29zdCAzIHZzbGRvaTggPDMsMiw0LDM+LCA8MSwyLDMsND4KKyAgMzM2MTA1NjM3MFUsCS8vIDw0LDMsMSwzPjogQ29zdCA0IHZtcmdsdyA8MCx1LDQsMT4sIDwyLDIsMywzPgorICAyMjk1OTM5OTk0VSwJLy8gPDQsMywxLDQ+OiBDb3N0IDMgdm1yZ2x3IDwyLDMsNCwxPiwgPDEsMiwzLDQ+CisgIDMzNjEwNTYyOTFVLAkvLyA8NCwzLDEsNT46IENvc3QgNCB2bXJnbHcgPDAsdSw0LDE+LCA8MiwxLDMsNT4KKyAgMzM3ODk3MjUyMFUsCS8vIDw0LDMsMSw2PjogQ29zdCA0IHZtcmdsdyA8Myx1LDQsMT4sIDwyLDUsMyw2PgorICAzMzYxMDU2Njk4VSwJLy8gPDQsMywxLDc+OiBDb3N0IDQgdm1yZ2x3IDwwLHUsNCwxPiwgPDIsNiwzLDc+CisgIDI3MDM5MTc5NzhVLAkvLyA8NCwzLDEsdT46IENvc3QgMyB2c2xkb2k4IDwzLDIsNCwzPiwgPDEsMiwzLDQ+CisgIDM4MzI3NjA2MjRVLAkvLyA8NCwzLDIsMD46IENvc3QgNCB2c2xkb2kxMiA8MSwyLDMsND4sIDwzLDIsMCwzPgorICAzNzExNzk2MTIyVSwJLy8gPDQsMywyLDE+OiBDb3N0IDQgdnNsZG9pNCA8Myw0LDMsMj4sIDwxLDIsMyw0PgorICAzODMyNzYwNjQxVSwJLy8gPDQsMywyLDI+OiBDb3N0IDQgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8MywyLDIsMj4KKyAgMjc3MDk2Mjc2NFUsCS8vIDw0LDMsMiwzPjogQ29zdCAzIHZzbGRvaTEyIDwzLDIsMyw0PiwgPDMsMiwzLDQ+CisgIDI3NTkwMTg4MzZVLAkvLyA8NCwzLDIsND46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsND4sIDwzLDIsNCwzPgorICAzODI3MzA0ODAyVSwJLy8gPDQsMywyLDU+OiBDb3N0IDUgdnNsZG9pMTIgPDAsMywxLDQ+LCA8MywyLDUsdT4KKyAgMzgzMjc2MDY3OFUsCS8vIDw0LDMsMiw2PjogQ29zdCA0IHZzbGRvaTEyIDwxLDIsMyw0PiwgPDMsMiw2LDM+CisgIDM4NTk1OTc2NzlVLAkvLyA8NCwzLDIsNz46IENvc3QgNCB2c2xkb2kxMiA8NSw2LDcsND4sIDwzLDIsNywzPgorICAyNzcxMzMxNDQ5VSwJLy8gPDQsMywyLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDMsMix1LDQ+LCA8MywyLHUsND4KKyAgMjI0MDg0MTg3OFUsCS8vIDw0LDMsMywwPjogQ29zdCAzIHZtcmdodyA8NCwzLDUsMD4sIDwzLDAsMSwyPgorICAzNzc2OTk3NjM1VSwJLy8gPDQsMywzLDE+OiBDb3N0IDQgdnNsZG9pOCA8MywxLDQsMz4sIDwzLDEsNCwzPgorICAyNzAzOTE5NDQ0VSwJLy8gPDQsMywzLDI+OiBDb3N0IDMgdnNsZG9pOCA8MywyLDQsMz4sIDwzLDIsNCwzPgorICAyNzU5MDE4OTA4VSwJLy8gPDQsMywzLDM+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8MywzLDMsMz4KKyAgMjc1OTAxODkxOFUsCS8vIDw0LDMsMyw0PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDMsMyw0LDQ+CisgIDMzODY5NTE0NDZVLAkvLyA8NCwzLDMsNT46IENvc3QgNCB2bXJnbHcgPDUsMiw0LDM+LCA8Miw0LDMsNT4KKyAgMzc3NzY2MTU5NlUsCS8vIDw0LDMsMyw2PjogQ29zdCA0IHZzbGRvaTggPDMsMiw0LDM+LCA8Myw2LDQsNz4KKyAgMzM3NTAwNzY3NFUsCS8vIDw0LDMsMyw3PjogQ29zdCA0IHZtcmdsdyA8MywyLDQsMz4sIDwyLDYsMyw3PgorICAyNzA3OTAxMjQyVSwJLy8gPDQsMywzLHU+OiBDb3N0IDMgdnNsZG9pOCA8Myx1LDQsMz4sIDwzLHUsNCwzPgorICAyNzU5MDE4OTYwVSwJLy8gPDQsMyw0LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8Myw0LDAsMT4KKyAgMjc1OTAxODk3MFUsCS8vIDw0LDMsNCwxPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDMsNCwxLDI+CisgIDI2MzIwOTk2MDVVLAkvLyA8NCwzLDQsMj46IENvc3QgMyB2c2xkb2k0IDwyLDQsMyw0PiwgPDIsNCwzLDQ+CisgIDIyNDE0NjQ3MzJVLAkvLyA8NCwzLDQsMz46IENvc3QgMyB2bXJnaHcgPDQsNCw0LDQ+LCA8MywzLDMsMz4KKyAgMjc1OTAxOTAwMFUsCS8vIDw0LDMsNCw0PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDMsNCw0LDU+CisgIDI3NTM1NjMxMzhVLAkvLyA8NCwzLDQsNT46IENvc3QgMyB2c2xkb2kxMiA8MCwzLDEsND4sIDwzLDQsNSw2PgorICAzNzc3NjYyMzE2VSwJLy8gPDQsMyw0LDY+OiBDb3N0IDQgdnNsZG9pOCA8MywyLDQsMz4sIDw0LDYsMyw3PgorICAyMzA4NTczMTE0VSwJLy8gPDQsMyw0LDc+OiBDb3N0IDMgdm1yZ2x3IDw0LDQsNCw0PiwgPDIsNiwzLDc+CisgIDI3NTkwMTkwMzJVLAkvLyA8NCwzLDQsdT46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDMsND4sIDwzLDQsdSwxPgorICAxMTY4NTU4MjMwVSwJLy8gPDQsMyw1LDA+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDMsMCwxLDI+CisgIDIyNDIzMDAxMzRVLAkvLyA8NCwzLDUsMT46IENvc3QgMyB2bXJnaHcgUkhTLCA8MywxLDEsMT4KKyAgMjYzMjEwNzc5OFUsCS8vIDw0LDMsNSwyPjogQ29zdCAzIHZzbGRvaTQgPDIsNCwzLDU+LCA8Miw0LDMsNT4KKyAgMTE2ODU1ODQ5MlUsCS8vIDw0LDMsNSwzPjogQ29zdCAyIHZtcmdodyBSSFMsIDwzLDMsMywzPgorICAxMTY4NTU4NTk0VSwJLy8gPDQsMyw1LDQ+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDMsNCw1LDY+CisgIDIyOTU5NzM2NTRVLAkvLyA8NCwzLDUsNT46IENvc3QgMyB2bXJnbHcgPDIsMyw0LDU+LCA8Miw0LDMsNT4KKyAgMjI0MjMwMDUzNlUsCS8vIDw0LDMsNSw2PjogQ29zdCAzIHZtcmdodyBSSFMsIDwzLDYsMCw3PgorICAyMjk1OTczODE4VSwJLy8gPDQsMyw1LDc+OiBDb3N0IDMgdm1yZ2x3IDwyLDMsNCw1PiwgPDIsNiwzLDc+CisgIDExNjg1NTg4NzhVLAkvLyA8NCwzLDUsdT46IENvc3QgMiB2bXJnaHcgUkhTLCA8Myx1LDEsMj4KKyAgMzgzMjc2MDk1MlUsCS8vIDw0LDMsNiwwPjogQ29zdCA0IHZzbGRvaTEyIDwxLDIsMyw0PiwgPDMsNiwwLDc+CisgIDM3MTE4Mjg4OTBVLAkvLyA8NCwzLDYsMT46IENvc3QgNCB2c2xkb2k0IDwzLDQsMyw2PiwgPDEsMiwzLDQ+CisgIDMzMTY0ODQ0MzZVLAkvLyA8NCwzLDYsMj46IENvc3QgNCB2bXJnaHcgPDQsNiwzLDc+LCA8MywyLDQsMz4KKyAgMzcxMTgzMDUxMlUsCS8vIDw0LDMsNiwzPjogQ29zdCA0IHZzbGRvaTQgPDMsNCwzLDY+LCA8Myw0LDMsNj4KKyAgMjc1OTAxOTE2NFUsCS8vIDw0LDMsNiw0PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDMsNiw0LDc+CisgIDMzNjEwOTcyNTFVLAkvLyA8NCwzLDYsNT46IENvc3QgNSB2bXJnbHcgPDAsdSw0LDY+LCA8MiwxLDMsNT4KKyAgMzMxNjYyNDA0NVUsCS8vIDw0LDMsNiw2PjogQ29zdCA0IHZtcmdodyA8NCw2LDUsNj4sIDwzLDYsNiw2PgorICAyNzczOTEyMjQ0VSwJLy8gPDQsMyw2LDc+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNiw3LDQ+LCA8Myw2LDcsND4KKyAgMjc1OTAxOTE2NFUsCS8vIDw0LDMsNix1PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDMsNiw0LDc+CisgIDMzNzc2OTM1OTBVLAkvLyA8NCwzLDcsMD46IENvc3QgNCB2bXJnbHcgPDMsNiw0LDc+LCA8MSwyLDMsMD4KKyAgMzM2NTc1MTY4MFUsCS8vIDw0LDMsNywxPjogQ29zdCA1IHZtcmdsdyA8MSw2LDQsNz4sIDw0LDAsMywxPgorICAyNzI3ODEwMjMyVSwJLy8gPDQsMyw3LDI+OiBDb3N0IDMgdnNsZG9pOCA8NywyLDQsMz4sIDw3LDIsNCwzPgorICAzMzc3Njk0MzIyVSwJLy8gPDQsMyw3LDM+OiBDb3N0IDQgdm1yZ2x3IDwzLDYsNCw3PiwgPDIsMiwzLDM+CisgIDIzMDM5NTE3NzBVLAkvLyA8NCwzLDcsND46IENvc3QgMyB2bXJnbHcgPDMsNiw0LDc+LCA8MSwyLDMsND4KKyAgMzc0MTcwMDE5OFUsCS8vIDw0LDMsNyw1PjogQ29zdCA0IHZzbGRvaTQgPHUsNCwzLDc+LCA8NSw2LDcsND4KKyAgMzM3NzY5NTIxNlUsCS8vIDw0LDMsNyw2PjogQ29zdCA0IHZtcmdsdyA8Myw2LDQsNz4sIDwzLDQsMyw2PgorICAzMzc1NzAzOTk0VSwJLy8gPDQsMyw3LDc+OiBDb3N0IDQgdm1yZ2x3IDwzLDMsNCw3PiwgPDIsNiwzLDc+CisgIDI3MzE3OTIwMzBVLAkvLyA8NCwzLDcsdT46IENvc3QgMyB2c2xkb2k4IDw3LHUsNCwzPiwgPDcsdSw0LDM+CisgIDExNzA1NDg4ODZVLAkvLyA8NCwzLHUsMD46IENvc3QgMiB2bXJnaHcgUkhTLCA8MywwLDEsMj4KKyAgMjc1OTAxOTI5NFUsCS8vIDw0LDMsdSwxPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDMsdSwxLDI+CisgIDI2MzIxMzIzNzdVLAkvLyA8NCwzLHUsMj46IENvc3QgMyB2c2xkb2k0IDwyLDQsMyx1PiwgPDIsNCwzLHU+CisgIDExNzA1NDkxNDhVLAkvLyA8NCwzLHUsMz46IENvc3QgMiB2bXJnaHcgUkhTLCA8MywzLDMsMz4KKyAgMTE3MDU0OTI1MFUsCS8vIDw0LDMsdSw0PjogQ29zdCAyIHZtcmdodyBSSFMsIDwzLDQsNSw2PgorICAyNzU5MDE5MzM0VSwJLy8gPDQsMyx1LDU+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8Myx1LDUsNj4KKyAgMjI0NDI5MTE5MlUsCS8vIDw0LDMsdSw2PjogQ29zdCAzIHZtcmdodyBSSFMsIDwzLDYsMCw3PgorICAyMjk1OTk4Mzk0VSwJLy8gPDQsMyx1LDc+OiBDb3N0IDMgdm1yZ2x3IDwyLDMsNCx1PiwgPDIsNiwzLDc+CisgIDExNzA1NDk1MzRVLAkvLyA8NCwzLHUsdT46IENvc3QgMiB2bXJnaHcgUkhTLCA8Myx1LDEsMj4KKyAgMTE2NTExODM1NFUsCS8vIDw0LDQsMCwwPjogQ29zdCAyIHZtcmdodyA8NCwwLDUsMT4sIDw0LDAsNSwxPgorICAxNjM3NDgyNTk4VSwJLy8gPDQsNCwwLDE+OiBDb3N0IDIgdnNsZG9pOCA8NCw0LDQsND4sIExIUworICAzNzExODU0Mjg1VSwJLy8gPDQsNCwwLDI+OiBDb3N0IDQgdnNsZG9pNCA8Myw0LDQsMD4sIDwyLDMsNCw0PgorICAzODI3MzA1MzQ0VSwJLy8gPDQsNCwwLDM+OiBDb3N0IDQgdnNsZG9pMTIgPDAsMywxLDQ+LCA8NCwwLDMsMT4KKyAgMjcxMTIyNDY1OFUsCS8vIDw0LDQsMCw0PjogQ29zdCAzIHZzbGRvaTggPDQsNCw0LDQ+LCA8MCw0LDEsNT4KKyAgMTE2NTExODc3NFUsCS8vIDw0LDQsMCw1PjogQ29zdCAyIHZtcmdodyA8NCwwLDUsMT4sIFJIUworICAzMzEyNjAyNDg5VSwJLy8gPDQsNCwwLDY+OiBDb3N0IDQgdm1yZ2h3IDw0LDAsNSwxPiwgPDQsNiw1LDI+CisgIDMzNjk2NzU0MjBVLAkvLyA8NCw0LDAsNz46IENvc3QgNCB2bXJnbHcgPDIsMyw0LDA+LCA8Myw2LDQsNz4KKyAgMTE2NTExOTAxN1UsCS8vIDw0LDQsMCx1PjogQ29zdCAyIHZtcmdodyA8NCwwLDUsMT4sIFJIUworICAzMzY5NjgyNjMzVSwJLy8gPDQsNCwxLDA+OiBDb3N0IDQgdm1yZ2x3IDwyLDMsNCwxPiwgPDIsMyw0LDA+CisgIDIyODczMTM1ODFVLAkvLyA8NCw0LDEsMT46IENvc3QgMyB2bXJnbHcgPDAsdSw0LDE+LCA8MCx1LDQsMT4KKyAgMjc1OTAxOTQ2NlUsCS8vIDw0LDQsMSwyPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPDQsMSwyLDM+CisgIDMzNjk2ODMyODRVLAkvLyA8NCw0LDEsMz46IENvc3QgNCB2bXJnbHcgPDIsMyw0LDE+LCA8MywyLDQsMz4KKyAgMjMxMTIwNDA0OFUsCS8vIDw0LDQsMSw0PjogQ29zdCAzIHZtcmdsdyA8NCx1LDQsMT4sIDw0LDQsNCw0PgorICAyMjM5MzE5MzUwVSwJLy8gPDQsNCwxLDU+OiBDb3N0IDMgdm1yZ2h3IDw0LDEsMiwzPiwgUkhTCisgIDM3ODQ5Njc0MTFVLAkvLyA8NCw0LDEsNj46IENvc3QgNCB2c2xkb2k4IDw0LDQsNCw0PiwgPDEsNiw1LDc+CisgIDMzNjk2ODM2MTJVLAkvLyA8NCw0LDEsNz46IENvc3QgNCB2bXJnbHcgPDIsMyw0LDE+LCA8Myw2LDQsNz4KKyAgMjc2MzAwMDgzMlUsCS8vIDw0LDQsMSx1PjogQ29zdCAzIHZzbGRvaTEyIDwxLHUsMyw0PiwgPDQsMSx1LDM+CisgIDM3MTE4NjkwMzBVLAkvLyA8NCw0LDIsMD46IENvc3QgNCB2c2xkb2k0IDwzLDQsNCwyPiwgTEhTCisgIDM3MTE4Njk4NTBVLAkvLyA8NCw0LDIsMT46IENvc3QgNCB2c2xkb2k0IDwzLDQsNCwyPiwgPDEsMiwzLDQ+CisgIDIyNDAyMDM4MzBVLAkvLyA8NCw0LDIsMj46IENvc3QgMyB2bXJnaHcgPDQsMiw1LDM+LCA8NCwyLDUsMz4KKyAgMjY5ODYxODU3M1UsCS8vIDw0LDQsMiwzPjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDQ+LCA8MiwzLDQsND4KKyAgMjcxMTIyNjEzM1UsCS8vIDw0LDQsMiw0PjogQ29zdCAzIHZzbGRvaTggPDQsNCw0LDQ+LCA8Miw0LDMsND4KKyAgMjI0MDIwNDA4NlUsCS8vIDw0LDQsMiw1PjogQ29zdCAzIHZtcmdodyA8NCwyLDUsMz4sIFJIUworICAyNzExMjI2Mjk4VSwJLy8gPDQsNCwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8NCw0LDQsND4sIDwyLDYsMyw3PgorICAzODMyNzYxNDE2VSwJLy8gPDQsNCwyLDc+OiBDb3N0IDQgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8NCwyLDcsMz4KKyAgMjcwMTkzNjczOFUsCS8vIDw0LDQsMix1PjogQ29zdCAzIHZzbGRvaTggPDIsdSw0LDQ+LCA8Mix1LDQsND4KKyAgMjcxMTIyNjUxOFUsCS8vIDw0LDQsMywwPjogQ29zdCAzIHZzbGRvaTggPDQsNCw0LDQ+LCA8MywwLDEsMj4KKyAgMzc3NzAwNTgyOFUsCS8vIDw0LDQsMywxPjogQ29zdCA0IHZzbGRvaTggPDMsMSw0LDQ+LCA8MywxLDQsND4KKyAgMzgzMjc2MTQ1M1UsCS8vIDw0LDQsMywyPjogQ29zdCA0IHZzbGRvaTEyIDwxLDIsMyw0PiwgPDQsMywyLDQ+CisgIDIzMDEyNjYyNjBVLAkvLyA8NCw0LDMsMz46IENvc3QgMyB2bXJnbHcgPDMsMiw0LDM+LCA8MywyLDQsMz4KKyAgMjcwNTI1NDkwM1UsCS8vIDw0LDQsMyw0PjogQ29zdCAzIHZzbGRvaTggPDMsNCw0LDQ+LCA8Myw0LDQsND4KKyAgMjI0MDg0MzA2MlUsCS8vIDw0LDQsMyw1PjogQ29zdCAzIHZtcmdodyA8NCwzLDUsMD4sIFJIUworICAzODMyNzYxNDg5VSwJLy8gPDQsNCwzLDY+OiBDb3N0IDQgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8NCwzLDYsND4KKyAgMzM3NTAwODQxMlUsCS8vIDw0LDQsMyw3PjogQ29zdCA0IHZtcmdsdyA8MywyLDQsMz4sIDwzLDYsNCw3PgorICAyMzAxMjY2MjYwVSwJLy8gPDQsNCwzLHU+OiBDb3N0IDMgdm1yZ2x3IDwzLDIsNCwzPiwgPDMsMiw0LDM+CisgIDE1NzAzNzM3MzRVLAkvLyA8NCw0LDQsMD46IENvc3QgMiB2c2xkb2k0IDw0LDQsNCw0PiwgTEhTCisgIDIzMDg1NzQwODlVLAkvLyA8NCw0LDQsMT46IENvc3QgMyB2bXJnbHcgPDQsNCw0LDQ+LCA8NCwwLDQsMT4KKyAgMjY0NDExNzA5NlUsCS8vIDw0LDQsNCwyPjogQ29zdCAzIHZzbGRvaTQgPDQsNCw0LDQ+LCA8MiwyLDIsMj4KKyAgMjYzODE0NjAzOVUsCS8vIDw0LDQsNCwzPjogQ29zdCAzIHZzbGRvaTQgPDMsNCw0LDQ+LCA8Myw0LDQsND4KKyAgMjI5MDM1MzE4VSwJLy8gPDQsNCw0LDQ+OiBDb3N0IDEgdnNwbHRpc3cwIFJIUworICAxMTY3NzIzODMwVSwJLy8gPDQsNCw0LDU+OiBDb3N0IDIgdm1yZ2h3IDw0LDQsNCw0PiwgUkhTCisgIDI2NDQxMjAwNThVLAkvLyA8NCw0LDQsNj46IENvc3QgMyB2c2xkb2k0IDw0LDQsNCw0PiwgPDYsMiw3LDM+CisgIDI2NjIwMzY4MjdVLAkvLyA8NCw0LDQsNz46IENvc3QgMyB2c2xkb2k0IDw3LDQsNCw0PiwgPDcsNCw0LDQ+CisgIDIyOTAzNTMxOFUsCS8vIDw0LDQsNCx1PjogQ29zdCAxIHZzcGx0aXN3MCBSSFMKKyAgMTE2ODU1ODk5NFUsCS8vIDw0LDQsNSwwPjogQ29zdCAyIHZtcmdodyBSSFMsIDw0LDAsNSwxPgorICAyNjM4MTUyNjAyVSwJLy8gPDQsNCw1LDE+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LDQsNT4sIDwxLDIsMyw0PgorICAyMjQyMzAwOTgxVSwJLy8gPDQsNCw1LDI+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDQsMiw1LDI+CisgIDI2MzgxNTQyMzJVLAkvLyA8NCw0LDUsMz46IENvc3QgMyB2c2xkb2k0IDwzLDQsNCw1PiwgPDMsNCw0LDU+CisgIDExNjg1NTkzMjJVLAkvLyA8NCw0LDUsND46IENvc3QgMiB2bXJnaHcgUkhTLCA8NCw0LDUsNT4KKyAgOTQ4MTc1OTBVLAkvLyA8NCw0LDUsNT46IENvc3QgMSB2bXJnaHcgUkhTLCBSSFMKKyAgMTY4NTI3ODAwNlUsCS8vIDw0LDQsNSw2PjogQ29zdCAyIHZzbGRvaTEyIDwxLDIsMyw0PiwgUkhTCisgIDIyNDIzMDk1NzZVLAkvLyA8NCw0LDUsNz46IENvc3QgMyB2bXJnaHcgUkhTLCA8NCw3LDUsMD4KKyAgOTQ4MTc4MzNVLAkvLyA8NCw0LDUsdT46IENvc3QgMSB2bXJnaHcgUkhTLCBSSFMKKyAgMzMxNjU5MTUwNlUsCS8vIDw0LDQsNiwwPjogQ29zdCA0IHZtcmdodyA8NCw2LDUsMj4sIDw0LDAsNSwxPgorICAzNzU4NDI4NTg3VSwJLy8gPDQsNCw2LDE+OiBDb3N0IDQgdnNsZG9pOCA8MCwwLDQsND4sIDw2LDEsNyw1PgorICAyNzExMjI4OTIyVSwJLy8gPDQsNCw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8NCw0LDQsND4sIDw2LDIsNywzPgorICAzNzk2MjUxMTg1VSwJLy8gPDQsNCw2LDM+OiBDb3N0IDQgdnNsZG9pOCA8NiwzLDQsND4sIDw2LDMsNCw0PgorICAyNzExMjI5MDg1VSwJLy8gPDQsNCw2LDQ+OiBDb3N0IDMgdnNsZG9pOCA8NCw0LDQsND4sIDw2LDQsNyw0PgorICAyMjQyODUwMTAyVSwJLy8gPDQsNCw2LDU+OiBDb3N0IDMgdm1yZ2h3IDw0LDYsNSwyPiwgUkhTCisgIDIyNDI4NTAxNjlVLAkvLyA8NCw0LDYsNj46IENvc3QgMyB2bXJnaHcgPDQsNiw1LDI+LCA8NCw2LDUsMj4KKyAgMjcyNTE2Mzg5M1UsCS8vIDw0LDQsNiw3PjogQ29zdCAzIHZzbGRvaTggPDYsNyw0LDQ+LCA8Niw3LDQsND4KKyAgMjI0Mjg1MDM0NVUsCS8vIDw0LDQsNix1PjogQ29zdCAzIHZtcmdodyA8NCw2LDUsMj4sIFJIUworICAyNzExMjI5NDM0VSwJLy8gPDQsNCw3LDA+OiBDb3N0IDMgdnNsZG9pOCA8NCw0LDQsND4sIDw3LDAsMSwyPgorICAzMzc3Njk0NDEwVSwJLy8gPDQsNCw3LDE+OiBDb3N0IDQgdm1yZ2x3IDwzLDYsNCw3PiwgPDIsMyw0LDE+CisgIDM4Njg1OTM1ODRVLAkvLyA8NCw0LDcsMj46IENvc3QgNCB2c2xkb2kxMiA8NywyLDMsND4sIDw0LDcsMiwzPgorICAzMzc3Njk1MDYwVSwJLy8gPDQsNCw3LDM+OiBDb3N0IDQgdm1yZ2x3IDwzLDYsNCw3PiwgPDMsMiw0LDM+CisgIDI3MjkxNDU2OTFVLAkvLyA8NCw0LDcsND46IENvc3QgMyB2c2xkb2k4IDw3LDQsNCw0PiwgPDcsNCw0LDQ+CisgIDIyNDM0OTcyNzBVLAkvLyA8NCw0LDcsNT46IENvc3QgMyB2bXJnaHcgPDQsNyw1LDA+LCBSSFMKKyAgMzg3MTU0Mjc0NFUsCS8vIDw0LDQsNyw2PjogQ29zdCA0IHZzbGRvaTEyIDw3LDYsNyw0PiwgPDQsNyw2LDc+CisgIDIzMDM5NTM1NjRVLAkvLyA8NCw0LDcsNz46IENvc3QgMyB2bXJnbHcgPDMsNiw0LDc+LCA8Myw2LDQsNz4KKyAgMjI0MzQ5NzUxM1UsCS8vIDw0LDQsNyx1PjogQ29zdCAzIHZtcmdodyA8NCw3LDUsMD4sIFJIUworICAxMTcwNTQ5NjUwVSwJLy8gPDQsNCx1LDA+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDQsMCw1LDE+CisgIDE2Mzc0ODg0MzBVLAkvLyA8NCw0LHUsMT46IENvc3QgMiB2c2xkb2k4IDw0LDQsNCw0PiwgTEhTCisgIDIyNDQyOTE2MzdVLAkvLyA8NCw0LHUsMj46IENvc3QgMyB2bXJnaHcgUkhTLCA8NCwyLDUsMj4KKyAgMjYzODE3ODgxMVUsCS8vIDw0LDQsdSwzPjogQ29zdCAzIHZzbGRvaTQgPDMsNCw0LHU+LCA8Myw0LDQsdT4KKyAgMjI5MDM1MzE4VSwJLy8gPDQsNCx1LDQ+OiBDb3N0IDEgdnNwbHRpc3cwIFJIUworICA5NjgwODI0NlUsCS8vIDw0LDQsdSw1PjogQ29zdCAxIHZtcmdodyBSSFMsIFJIUworICAxNjg1Mjc4MjQ5VSwJLy8gPDQsNCx1LDY+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMiwzLDQ+LCBSSFMKKyAgMjI0NDI5MjA0MFUsCS8vIDw0LDQsdSw3PjogQ29zdCAzIHZtcmdodyBSSFMsIDw0LDcsNSwwPgorICA5NjgwODQ4OVUsCS8vIDw0LDQsdSx1PjogQ29zdCAxIHZtcmdodyBSSFMsIFJIUworICAyNjk4NjI1MDI0VSwJLy8gPDQsNSwwLDA+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDQsNT4sIDwwLDAsMCwwPgorICAxNjI0ODgzMzAyVSwJLy8gPDQsNSwwLDE+OiBDb3N0IDIgdnNsZG9pOCA8MiwzLDQsNT4sIExIUworICAyNjM4MTg2MTkwVSwJLy8gPDQsNSwwLDI+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LDUsMD4sIDwyLDMsNCw1PgorICAyNjM4MTg3MDA0VSwJLy8gPDQsNSwwLDM+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LDUsMD4sIDwzLDQsNSwwPgorICAyNjg3MzQ1MDA1VSwJLy8gPDQsNSwwLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MCw0LDQsNT4sIDwwLDQsNCw1PgorICAyMjM4ODYxMzE2VSwJLy8gPDQsNSwwLDU+OiBDb3N0IDMgdm1yZ2h3IDw0LDAsNSwxPiwgPDUsNSw1LDU+CisgIDI2NjIwNzczMDJVLAkvLyA8NCw1LDAsNj46IENvc3QgMyB2c2xkb2k0IDw3LDQsNSwwPiwgPDYsNyw0LDU+CisgIDI2NjIwNzc3OTJVLAkvLyA8NCw1LDAsNz46IENvc3QgMyB2c2xkb2k0IDw3LDQsNSwwPiwgPDcsNCw1LDA+CisgIDE2MjQ4ODM4NjlVLAkvLyA8NCw1LDAsdT46IENvc3QgMiB2c2xkb2k4IDwyLDMsNCw1PiwgTEhTCisgIDMzNjEwNTc3NjJVLAkvLyA8NCw1LDEsMD46IENvc3QgNCB2bXJnbHcgPDAsdSw0LDE+LCA8NCwxLDUsMD4KKyAgMjY5MTMyNjgwM1UsCS8vIDw0LDUsMSwxPjogQ29zdCAzIHZzbGRvaTggPDEsMSw0LDU+LCA8MSwxLDQsNT4KKyAgMjY5ODYyNTk0MlUsCS8vIDw0LDUsMSwyPjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDU+LCA8MSwyLDMsMD4KKyAgMzM2MTA1NTY1OVUsCS8vIDw0LDUsMSwzPjogQ29zdCA0IHZtcmdsdyA8MCx1LDQsMT4sIDwxLDIsNSwzPgorICAzNzYxMDg3NTY3VSwJLy8gPDQsNSwxLDQ+OiBDb3N0IDQgdnNsZG9pOCA8MCw0LDQsNT4sIDwxLDQsNSw1PgorICAyNjkzOTgxMzM1VSwJLy8gPDQsNSwxLDU+OiBDb3N0IDMgdnNsZG9pOCA8MSw1LDQsNT4sIDwxLDUsNCw1PgorICAyMzA1MjMxMzYyVSwJLy8gPDQsNSwxLDY+OiBDb3N0IDMgdm1yZ2x3IDwzLHUsNCwxPiwgPDMsNCw1LDY+CisgIDMzNjEwNTU5ODdVLAkvLyA8NCw1LDEsNz46IENvc3QgNCB2bXJnbHcgPDAsdSw0LDE+LCA8MSw2LDUsNz4KKyAgMjY5NTk3MjIzNFUsCS8vIDw0LDUsMSx1PjogQ29zdCAzIHZzbGRvaTggPDEsdSw0LDU+LCA8MSx1LDQsNT4KKyAgMjYzODIwMDkzNFUsCS8vIDw0LDUsMiwwPjogQ29zdCAzIHZzbGRvaTQgPDMsNCw1LDI+LCBMSFMKKyAgMzc2MTA4ODAzNVUsCS8vIDw0LDUsMiwxPjogQ29zdCA0IHZzbGRvaTggPDAsNCw0LDU+LCA8MiwxLDMsNT4KKyAgMjY5Nzk2MzEzM1UsCS8vIDw0LDUsMiwyPjogQ29zdCAzIHZzbGRvaTggPDIsMiw0LDU+LCA8MiwyLDQsNT4KKyAgMTYyNDg4NDk0MlUsCS8vIDw0LDUsMiwzPjogQ29zdCAyIHZzbGRvaTggPDIsMyw0LDU+LCA8MiwzLDQsNT4KKyAgMjY5ODYyNjgzOFUsCS8vIDw0LDUsMiw0PjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDU+LCA8Miw0LDMsNT4KKyAgMzc3MjM2ODc0NFUsCS8vIDw0LDUsMiw1PjogQ29zdCA0IHZzbGRvaTggPDIsMyw0LDU+LCA8Miw1LDMsNj4KKyAgMjY5ODYyNzAwMlUsCS8vIDw0LDUsMiw2PjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDU+LCA8Miw2LDMsNz4KKyAgMzc3NTAyMzEyMlUsCS8vIDw0LDUsMiw3PjogQ29zdCA0IHZzbGRvaTggPDIsNyw0LDU+LCA8Miw3LDQsNT4KKyAgMTYyODIwMzEwN1UsCS8vIDw0LDUsMix1PjogQ29zdCAyIHZzbGRvaTggPDIsdSw0LDU+LCA8Mix1LDQsNT4KKyAgMjY5ODYyNzIyMlUsCS8vIDw0LDUsMywwPjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDU+LCA8MywwLDEsMj4KKyAgMzc2NTA3MDA1N1UsCS8vIDw0LDUsMywxPjogQ29zdCA0IHZzbGRvaTggPDEsMSw0LDU+LCA8MywxLDEsND4KKyAgMjY5ODYyNzQwNFUsCS8vIDw0LDUsMywyPjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDU+LCA8MywyLDMsND4KKyAgMjY5ODYyNzQ4NFUsCS8vIDw0LDUsMywzPjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDU+LCA8MywzLDMsMz4KKyAgMjY5ODYyNzU4MFUsCS8vIDw0LDUsMyw0PjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDU+LCA8Myw0LDUsMD4KKyAgMzc3OTY2ODU1M1UsCS8vIDw0LDUsMyw1PjogQ29zdCA0IHZzbGRvaTggPDMsNSw0LDU+LCA8Myw1LDQsNT4KKyAgMjcyNTE2OTg0NFUsCS8vIDw0LDUsMyw2PjogQ29zdCAzIHZzbGRvaTggPDYsNyw0LDU+LCA8Myw2LDcsND4KKyAgMjcwNzI1Mzk5NVUsCS8vIDw0LDUsMyw3PjogQ29zdCAzIHZzbGRvaTggPDMsNyw0LDU+LCA8Myw3LDQsNT4KKyAgMjY5ODYyNzg3MFUsCS8vIDw0LDUsMyx1PjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDU+LCA8Myx1LDEsMj4KKyAgMjYzODIxNzMxOFUsCS8vIDw0LDUsNCwwPjogQ29zdCAzIHZzbGRvaTQgPDMsNCw1LDQ+LCBMSFMKKyAgMjMwODU3NDA5OFUsCS8vIDw0LDUsNCwxPjogQ29zdCAzIHZtcmdsdyA8NCw0LDQsND4sIDw0LDAsNSwxPgorICAyNjk4NjI4MTUwVSwJLy8gPDQsNSw0LDI+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDQsNT4sIDw0LDIsNSwzPgorICAyNjM4MjE5Nzc2VSwJLy8gPDQsNSw0LDM+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LDUsND4sIDwzLDQsNSw0PgorICAyNjk4NjI4MzE0VSwJLy8gPDQsNSw0LDQ+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDQsNT4sIDw0LDQsNSw1PgorICAxNjI0ODg2NTgyVSwJLy8gPDQsNSw0LDU+OiBDb3N0IDIgdnNsZG9pOCA8MiwzLDQsNT4sIFJIUworICAyNjk4NjI4NDc4VSwJLy8gPDQsNSw0LDY+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDQsNT4sIDw0LDYsNSw3PgorICAyNjYyMTEwNTY0VSwJLy8gPDQsNSw0LDc+OiBDb3N0IDMgdnNsZG9pNCA8Nyw0LDUsND4sIDw3LDQsNSw0PgorICAxNjI0ODg2ODI1VSwJLy8gPDQsNSw0LHU+OiBDb3N0IDIgdnNsZG9pOCA8MiwzLDQsNT4sIFJIUworICAxNTcwNDU1NjU0VSwJLy8gPDQsNSw1LDA+OiBDb3N0IDIgdnNsZG9pNCA8NCw0LDUsNT4sIExIUworICAyMzEyNTY0MjUwVSwJLy8gPDQsNSw1LDE+OiBDb3N0IDMgdm1yZ2x3IDw1LDEsNCw1PiwgPDQsdSw1LDE+CisgIDI2NDQxOTkxMThVLAkvLyA8NCw1LDUsMj46IENvc3QgMyB2c2xkb2k0IDw0LDQsNSw1PiwgPDIsMyw0LDU+CisgIDIyOTU5NzQ5NjZVLAkvLyA8NCw1LDUsMz46IENvc3QgMyB2bXJnbHcgPDIsMyw0LDU+LCA8NCwyLDUsMz4KKyAgMTU3MDQ1ODg0MlUsCS8vIDw0LDUsNSw0PjogQ29zdCAyIHZzbGRvaTQgPDQsNCw1LDU+LCA8NCw0LDUsNT4KKyAgMTE2ODU2ODMyNFUsCS8vIDw0LDUsNSw1PjogQ29zdCAyIHZtcmdodyBSSFMsIDw1LDUsNSw1PgorICAxMTY4NTY4NDE4VSwJLy8gPDQsNSw1LDY+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDUsNiw3LDA+CisgIDIyOTU5NzUyOTRVLAkvLyA8NCw1LDUsNz46IENvc3QgMyB2bXJnbHcgPDIsMyw0LDU+LCA8NCw2LDUsNz4KKyAgMTE2ODcxNjAzNlUsCS8vIDw0LDUsNSx1PjogQ29zdCAyIHZtcmdodyBSSFMsIDw1LHUsNywwPgorICAxNTY0NDkxODc4VSwJLy8gPDQsNSw2LDA+OiBDb3N0IDIgdnNsZG9pNCA8Myw0LDUsNj4sIExIUworICAyNjI2MjkwNzY4VSwJLy8gPDQsNSw2LDE+OiBDb3N0IDMgdnNsZG9pNCA8MSw0LDUsNj4sIDwxLDQsNSw2PgorICAyNjMyMjYzNDY1VSwJLy8gPDQsNSw2LDI+OiBDb3N0IDMgdnNsZG9pNCA8Miw0LDUsNj4sIDwyLDQsNSw2PgorICAxNTY0NDk0MzM4VSwJLy8gPDQsNSw2LDM+OiBDb3N0IDIgdnNsZG9pNCA8Myw0LDUsNj4sIDwzLDQsNSw2PgorICAxNTY0NDk1MTU4VSwJLy8gPDQsNSw2LDQ+OiBDb3N0IDIgdnNsZG9pNCA8Myw0LDUsNj4sIFJIUworICAyNjM4MjM3NDY0VSwJLy8gPDQsNSw2LDU+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LDUsNj4sIDw1LDIsNiwzPgorICAyNjU2MTU0MjUzVSwJLy8gPDQsNSw2LDY+OiBDb3N0IDMgdnNsZG9pNCA8Niw0LDUsNj4sIDw2LDQsNSw2PgorICAyNzcwNTM0NFUsCS8vIDw0LDUsNiw3PjogQ29zdCAwIGNvcHkgUkhTCisgIDI3NzA1MzQ0VSwJLy8gPDQsNSw2LHU+OiBDb3N0IDAgY29weSBSSFMKKyAgMjcyNTE3MjIxOFUsCS8vIDw0LDUsNywwPjogQ29zdCAzIHZzbGRvaTggPDYsNyw0LDU+LCA8NywwLDEsMj4KKyAgMzg1OTU5OTQ4OVUsCS8vIDw0LDUsNywxPjogQ29zdCA0IHZzbGRvaTEyIDw1LDYsNyw0PiwgPDUsNywxLDQ+CisgIDI2OTg2MzAzMjBVLAkvLyA8NCw1LDcsMj46IENvc3QgMyB2c2xkb2k4IDwyLDMsNCw1PiwgPDcsMiwzLDQ+CisgIDI3Mjg0OTAyNTFVLAkvLyA8NCw1LDcsMz46IENvc3QgMyB2c2xkb2k4IDw3LDMsNCw1PiwgPDcsMyw0LDU+CisgIDI3MjUxNzI1NzZVLAkvLyA8NCw1LDcsND46IENvc3QgMyB2c2xkb2k4IDw2LDcsNCw1PiwgPDcsNCw1LDA+CisgIDMzMTcyMzk4MTJVLAkvLyA8NCw1LDcsNT46IENvc3QgNCB2bXJnaHcgPDQsNyw1LDA+LCA8NSw1LDUsNT4KKyAgMjcyNTE3Mjc2MFUsCS8vIDw0LDUsNyw2PjogQ29zdCAzIHZzbGRvaTggPDYsNyw0LDU+LCA8Nyw2LDcsND4KKyAgMjcyNTE3Mjg0NFUsCS8vIDw0LDUsNyw3PjogQ29zdCAzIHZzbGRvaTggPDYsNyw0LDU+LCA8Nyw3LDcsNz4KKyAgMjcyNTE3Mjg2NlUsCS8vIDw0LDUsNyx1PjogQ29zdCAzIHZzbGRvaTggPDYsNyw0LDU+LCA8Nyx1LDEsMj4KKyAgMTU2NDUwODI2MlUsCS8vIDw0LDUsdSwwPjogQ29zdCAyIHZzbGRvaTQgPDMsNCw1LHU+LCBMSFMKKyAgMTYyNDg4OTEzNFUsCS8vIDw0LDUsdSwxPjogQ29zdCAyIHZzbGRvaTggPDIsMyw0LDU+LCBMSFMKKyAgMjY5ODYzMTA0NVUsCS8vIDw0LDUsdSwyPjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LDU+LCA8dSwyLDMsMD4KKyAgMTU2NDUxMDcyNFUsCS8vIDw0LDUsdSwzPjogQ29zdCAyIHZzbGRvaTQgPDMsNCw1LHU+LCA8Myw0LDUsdT4KKyAgMTU2NDUxMTU0MlUsCS8vIDw0LDUsdSw0PjogQ29zdCAyIHZzbGRvaTQgPDMsNCw1LHU+LCBSSFMKKyAgMTYyNDg4OTQ5OFUsCS8vIDw0LDUsdSw1PjogQ29zdCAyIHZzbGRvaTggPDIsMyw0LDU+LCBSSFMKKyAgMTE3MDU1MDg4MlUsCS8vIDw0LDUsdSw2PjogQ29zdCAyIHZtcmdodyBSSFMsIDw1LDYsNywwPgorICAyNzcwNTM0NFUsCS8vIDw0LDUsdSw3PjogQ29zdCAwIGNvcHkgUkhTCisgIDI3NzA1MzQ0VSwJLy8gPDQsNSx1LHU+OiBDb3N0IDAgY29weSBSSFMKKyAgMzMxMjU5NTI4NVUsCS8vIDw0LDYsMCwwPjogQ29zdCA0IHZtcmdodyA8NCwwLDUsMD4sIDw2LDAsNywwPgorICAzNzYzNzQ4OTY2VSwJLy8gPDQsNiwwLDE+OiBDb3N0IDQgdnNsZG9pOCA8MCx1LDQsNj4sIExIUworICAyMjM4ODYxODE4VSwJLy8gPDQsNiwwLDI+OiBDb3N0IDMgdm1yZ2h3IDw0LDAsNSwxPiwgPDYsMiw3LDM+CisgIDM3Njc3MzA0MzJVLAkvLyA8NCw2LDAsMz46IENvc3QgNCB2c2xkb2k4IDwxLDUsNCw2PiwgPDAsMywxLDQ+CisgIDM3NjM3NDkyMDJVLAkvLyA8NCw2LDAsND46IENvc3QgNCB2c2xkb2k4IDwwLHUsNCw2PiwgPDAsNCwxLDU+CisgIDIyMzg4NjIwNTlVLAkvLyA8NCw2LDAsNT46IENvc3QgMyB2bXJnaHcgPDQsMCw1LDE+LCA8Niw1LDcsMT4KKyAgMjIzODg2MjEzNlUsCS8vIDw0LDYsMCw2PjogQ29zdCAzIHZtcmdodyA8NCwwLDUsMT4sIDw2LDYsNiw2PgorICAyMjk1OTM0MjYyVSwJLy8gPDQsNiwwLDc+OiBDb3N0IDMgdm1yZ2x3IDwyLDMsNCwwPiwgUkhTCisgIDIyOTU5MzQyNjNVLAkvLyA8NCw2LDAsdT46IENvc3QgMyB2bXJnbHcgPDIsMyw0LDA+LCBSSFMKKyAgMzM3ODk3Mzk5OVUsCS8vIDw0LDYsMSwwPjogQ29zdCA0IHZtcmdsdyA8Myx1LDQsMT4sIDw0LDUsNiwwPgorICAzMzc4OTc0NjQ4VSwJLy8gPDQsNiwxLDE+OiBDb3N0IDQgdm1yZ2x3IDwzLHUsNCwxPiwgPDUsNCw2LDE+CisgIDM3Nzk2NzUwMzRVLAkvLyA8NCw2LDEsMj46IENvc3QgNCB2c2xkb2k4IDwzLDUsNCw2PiwgPDEsMiwzLDQ+CisgIDMzNzg5NzQwMDJVLAkvLyA8NCw2LDEsMz46IENvc3QgNCB2bXJnbHcgPDMsdSw0LDE+LCA8NCw1LDYsMz4KKyAgMzM3ODk3NDAwM1UsCS8vIDw0LDYsMSw0PjogQ29zdCA0IHZtcmdsdyA8Myx1LDQsMT4sIDw0LDUsNiw0PgorICAzNzY3NzMxMzUyVSwJLy8gPDQsNiwxLDU+OiBDb3N0IDQgdnNsZG9pOCA8MSw1LDQsNj4sIDwxLDUsNCw2PgorICAzMzc4OTc0NzM0VSwJLy8gPDQsNiwxLDY+OiBDb3N0IDQgdm1yZ2x3IDwzLHUsNCwxPiwgPDUsNSw2LDY+CisgIDIyODczMTYyNzhVLAkvLyA8NCw2LDEsNz46IENvc3QgMyB2bXJnbHcgPDAsdSw0LDE+LCBSSFMKKyAgMjI4NzMxNjI3OVUsCS8vIDw0LDYsMSx1PjogQ29zdCAzIHZtcmdsdyA8MCx1LDQsMT4sIFJIUworICAzNzM1OTA0MzU4VSwJLy8gPDQsNiwyLDA+OiBDb3N0IDQgdnNsZG9pNCA8Nyw0LDYsMj4sIExIUworICAzNzYzNzUwNDM1VSwJLy8gPDQsNiwyLDE+OiBDb3N0IDUgdnNsZG9pOCA8MCx1LDQsNj4sIDwyLDEsMyw1PgorICAzMzEzOTM4OTM3VSwJLy8gPDQsNiwyLDI+OiBDb3N0IDQgdm1yZ2h3IDw0LDIsNSwyPiwgPDYsMiw3LDI+CisgIDM3NzIzNzY3ODJVLAkvLyA8NCw2LDIsMz46IENvc3QgNCB2c2xkb2k4IDwyLDMsNCw2PiwgPDIsMyw0LDU+CisgIDM4NTI4OTA1OTFVLAkvLyA8NCw2LDIsND46IENvc3QgNCB2c2xkb2kxMiA8NCw1LDYsND4sIDw2LDIsNCwzPgorICAzNzM1OTA4NDU0VSwJLy8gPDQsNiwyLDU+OiBDb3N0IDQgdnNsZG9pNCA8Nyw0LDYsMj4sIDw1LDYsNyw0PgorICAzODAxNTczMzA2VSwJLy8gPDQsNiwyLDY+OiBDb3N0IDQgdnNsZG9pOCA8NywyLDQsNj4sIDwyLDYsMyw3PgorICAyNzg1ODU4MDQyVSwJLy8gPDQsNiwyLDc+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDQ+LCA8NiwyLDcsMz4KKyAgMjc4NTg1ODA1MVUsCS8vIDw0LDYsMix1PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNyw0PiwgPDYsMix1LDM+CisgIDM4NjMwNjUxMDFVLAkvLyA8NCw2LDMsMD46IENvc3QgNCB2c2xkb2kxMiA8NiwzLDAsND4sIDw2LDMsMCw0PgorICAzMzE0NTg2MDI0VSwJLy8gPDQsNiwzLDE+OiBDb3N0IDQgdm1yZ2h3IDw0LDMsNSwwPiwgPDYsMSw3LDI+CisgIDM4NjMyMTI1NzVVLAkvLyA8NCw2LDMsMj46IENvc3QgNCB2c2xkb2kxMiA8NiwzLDIsND4sIDw2LDMsMiw0PgorICAzODYzMjg2MzEyVSwJLy8gPDQsNiwzLDM+OiBDb3N0IDQgdnNsZG9pMTIgPDYsMywzLDQ+LCA8NiwzLDMsND4KKyAgMzc2NzczMjczOFUsCS8vIDw0LDYsMyw0PjogQ29zdCA0IHZzbGRvaTggPDEsNSw0LDY+LCA8Myw0LDUsNj4KKyAgMzc3OTY3Njc0NlUsCS8vIDw0LDYsMyw1PjogQ29zdCA0IHZzbGRvaTggPDMsNSw0LDY+LCA8Myw1LDQsNj4KKyAgMzM5ODg5ODQ4OFUsCS8vIDw0LDYsMyw2PjogQ29zdCA0IHZtcmdsdyA8NywyLDQsMz4sIDw2LDYsNiw2PgorICAyMzAxMjY3MjU0VSwJLy8gPDQsNiwzLDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDIsNCwzPiwgUkhTCisgIDIzMDEyNjcyNTVVLAkvLyA8NCw2LDMsdT46IENvc3QgMyB2bXJnbHcgPDMsMiw0LDM+LCBSSFMKKyAgMzg1Mjg5MDcxNVUsCS8vIDw0LDYsNCwwPjogQ29zdCA0IHZzbGRvaTEyIDw0LDUsNiw0PiwgPDYsNCwwLDE+CisgIDMzMTUyMDg2MTVVLAkvLyA8NCw2LDQsMT46IENvc3QgNCB2bXJnaHcgPDQsNCw0LDQ+LCA8NiwxLDcsMT4KKyAgMjI0MTQ2Njg3NFUsCS8vIDw0LDYsNCwyPjogQ29zdCAzIHZtcmdodyA8NCw0LDQsND4sIDw2LDIsNywzPgorICAzODUyODkwNzQ1VSwJLy8gPDQsNiw0LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDQsNSw2LDQ+LCA8Niw0LDMsND4KKyAgMjI0MTQ2NzAzN1UsCS8vIDw0LDYsNCw0PjogQ29zdCAzIHZtcmdodyA8NCw0LDQsND4sIDw2LDQsNyw0PgorICAyMjQxNTQ5MDM5VSwJLy8gPDQsNiw0LDU+OiBDb3N0IDMgdm1yZ2h3IDw0LDQsNSw1PiwgPDYsNSw3LDU+CisgIDIyNDE0NjcxOTJVLAkvLyA8NCw2LDQsNj46IENvc3QgMyB2bXJnaHcgPDQsNCw0LDQ+LCA8Niw2LDYsNj4KKyAgMTIzNDgzMjY5NFUsCS8vIDw0LDYsNCw3PjogQ29zdCAyIHZtcmdsdyA8NCw0LDQsND4sIFJIUworICAxMjM0ODMyNjk1VSwJLy8gPDQsNiw0LHU+OiBDb3N0IDIgdm1yZ2x3IDw0LDQsNCw0PiwgUkhTCisgIDIyNDIzMDIyNDFVLAkvLyA8NCw2LDUsMD46IENvc3QgMyB2bXJnaHcgUkhTLCA8NiwwLDEsMj4KKyAgMjI0MjMxMDU2N1UsCS8vIDw0LDYsNSwxPjogQ29zdCAzIHZtcmdodyBSSFMsIDw2LDEsNywxPgorICAxMTY4NTY4ODI2VSwJLy8gPDQsNiw1LDI+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDYsMiw3LDM+CisgIDIyNDIzMDI1MTRVLAkvLyA8NCw2LDUsMz46IENvc3QgMyB2bXJnaHcgUkhTLCA8NiwzLDQsNT4KKyAgMjI0MjMwMjYwNVUsCS8vIDw0LDYsNSw0PjogQ29zdCAzIHZtcmdodyBSSFMsIDw2LDQsNSw2PgorICAyMjQyMzEwODkxVSwJLy8gPDQsNiw1LDU+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDYsNSw3LDE+CisgIDExNjg1NjkxNDRVLAkvLyA8NCw2LDUsNj46IENvc3QgMiB2bXJnaHcgUkhTLCA8Niw2LDYsNj4KKyAgMTIyMjIzMzM5OFUsCS8vIDw0LDYsNSw3PjogQ29zdCAyIHZtcmdsdyA8MiwzLDQsNT4sIFJIUworICAxMjIyMjMzMzk5VSwJLy8gPDQsNiw1LHU+OiBDb3N0IDIgdm1yZ2x3IDwyLDMsNCw1PiwgUkhTCisgIDMzMTY1NzY1NDVVLAkvLyA8NCw2LDYsMD46IENvc3QgNCB2bXJnaHcgPDQsNiw1LDA+LCA8NiwwLDEsMj4KKyAgMzMxNjU4NDg3MVUsCS8vIDw0LDYsNiwxPjogQ29zdCA0IHZtcmdodyA8NCw2LDUsMT4sIDw2LDEsNywxPgorICAyMjQyODUxMzIyVSwJLy8gPDQsNiw2LDI+OiBDb3N0IDMgdm1yZ2h3IDw0LDYsNSwyPiwgPDYsMiw3LDM+CisgIDMzMTY2MDEzOTRVLAkvLyA8NCw2LDYsMz46IENvc3QgNCB2bXJnaHcgPDQsNiw1LDM+LCA8NiwzLDQsNT4KKyAgMzg1Mjg5MDkxNlUsCS8vIDw0LDYsNiw0PjogQ29zdCA0IHZzbGRvaTEyIDw0LDUsNiw0PiwgPDYsNiw0LDQ+CisgIDMzMTY2MTc5NjNVLAkvLyA8NCw2LDYsNT46IENvc3QgNCB2bXJnaHcgPDQsNiw1LDU+LCA8Niw1LDcsMT4KKyAgMjI0Mjg4NDQwOFUsCS8vIDw0LDYsNiw2PjogQ29zdCAzIHZtcmdodyA8NCw2LDUsNj4sIDw2LDYsNiw2PgorICAyNzg1ODU4MzcwVSwJLy8gPDQsNiw2LDc+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDQ+LCA8Niw2LDcsNz4KKyAgMjc4NTg1ODM3OVUsCS8vIDw0LDYsNix1PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNyw0PiwgPDYsNix1LDc+CisgIDI3ODU4NTgzODJVLAkvLyA8NCw2LDcsMD46IENvc3QgMyB2c2xkb2kxMiA8NSw2LDcsND4sIDw2LDcsMCwxPgorICAzODU5NjAwMjE1VSwJLy8gPDQsNiw3LDE+OiBDb3N0IDQgdnNsZG9pMTIgPDUsNiw3LDQ+LCA8Niw3LDEsMT4KKyAgMzMxNzI0MDMxNFUsCS8vIDw0LDYsNywyPjogQ29zdCA0IHZtcmdodyA8NCw3LDUsMD4sIDw2LDIsNywzPgorICAyNzkyMTk5MDIwVSwJLy8gPDQsNiw3LDM+OiBDb3N0IDMgdnNsZG9pMTIgPDYsNywzLDQ+LCA8Niw3LDMsND4KKyAgMjc4NTg1ODQyMlUsCS8vIDw0LDYsNyw0PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNyw0PiwgPDYsNyw0LDU+CisgIDM4NTY2NTExMzJVLAkvLyA8NCw2LDcsNT46IENvc3QgNCB2c2xkb2kxMiA8NSwyLDMsND4sIDw2LDcsNSwyPgorICAzMzE3MjQwNjMyVSwJLy8gPDQsNiw3LDY+OiBDb3N0IDQgdm1yZ2h3IDw0LDcsNSwwPiwgPDYsNiw2LDY+CisgIDIzMDM5NTQyMzBVLAkvLyA8NCw2LDcsNz46IENvc3QgMyB2bXJnbHcgPDMsNiw0LDc+LCBSSFMKKyAgMjMwMzk1NDIzMVUsCS8vIDw0LDYsNyx1PjogQ29zdCAzIHZtcmdsdyA8Myw2LDQsNz4sIFJIUworICAyMjQ0MjkyODk3VSwJLy8gPDQsNix1LDA+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDYsMCwxLDI+CisgIDIyNDQyOTMwMzFVLAkvLyA8NCw2LHUsMT46IENvc3QgMyB2bXJnaHcgUkhTLCA8NiwxLDcsMT4KKyAgMTE3MDU1MTI5MFUsCS8vIDw0LDYsdSwyPjogQ29zdCAyIHZtcmdodyBSSFMsIDw2LDIsNywzPgorICAyMjQ0MjkzMTcwVSwJLy8gPDQsNix1LDM+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDYsMyw0LDU+CisgIDIyNDQyOTMyNjFVLAkvLyA8NCw2LHUsND46IENvc3QgMyB2bXJnaHcgUkhTLCA8Niw0LDUsNj4KKyAgMjI0NDI5MzM1NVUsCS8vIDw0LDYsdSw1PjogQ29zdCAzIHZtcmdodyBSSFMsIDw2LDUsNywxPgorICAxMTcwNTUxNjA4VSwJLy8gPDQsNix1LDY+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDYsNiw2LDY+CisgIDEyMjIyNTc5NzRVLAkvLyA8NCw2LHUsNz46IENvc3QgMiB2bXJnbHcgPDIsMyw0LHU+LCBSSFMKKyAgMTIyMjI1Nzk3NVUsCS8vIDw0LDYsdSx1PjogQ29zdCAyIHZtcmdsdyA8MiwzLDQsdT4sIFJIUworICAyMjM4ODYyMzMwVSwJLy8gPDQsNywwLDA+OiBDb3N0IDMgdm1yZ2h3IDw0LDAsNSwxPiwgPDcsMCwxLDI+CisgIDI3MDY2MDQxMzRVLAkvLyA8NCw3LDAsMT46IENvc3QgMyB2c2xkb2k4IDwzLDYsNCw3PiwgTEhTCisgIDMzMTI2MDQzMDhVLAkvLyA8NCw3LDAsMj46IENvc3QgNCB2bXJnaHcgPDQsMCw1LDE+LCA8NywyLDAsMz4KKyAgMzc2ODQwMjE3NlUsCS8vIDw0LDcsMCwzPjogQ29zdCA0IHZzbGRvaTggPDEsNiw0LDc+LCA8MCwzLDEsND4KKyAgMjIzODg2MjY0OFUsCS8vIDw0LDcsMCw0PjogQ29zdCAzIHZtcmdodyA8NCwwLDUsMT4sIDw3LDQsMCw1PgorICAzODU5NjAwNDE4VSwJLy8gPDQsNywwLDU+OiBDb3N0IDQgdnNsZG9pMTIgPDUsNiw3LDQ+LCA8NywwLDUsNj4KKyAgMzcyOTk5NDM5M1UsCS8vIDw0LDcsMCw2PjogQ29zdCA0IHZzbGRvaTQgPDYsNCw3LDA+LCA8Niw0LDcsMD4KKyAgMjIzODg2Mjk1NlUsCS8vIDw0LDcsMCw3PjogQ29zdCAzIHZtcmdodyA8NCwwLDUsMT4sIDw3LDcsNyw3PgorICAyNzA2NjA0NzAxVSwJLy8gPDQsNywwLHU+OiBDb3N0IDMgdnNsZG9pOCA8Myw2LDQsNz4sIExIUworICAzMzg1NjEwMzM4VSwJLy8gPDQsNywxLDA+OiBDb3N0IDQgdm1yZ2x3IDw1LDAsNCwxPiwgPDUsNiw3LDA+CisgIDM3ODAzNDY2NzZVLAkvLyA8NCw3LDEsMT46IENvc3QgNCB2c2xkb2k4IDwzLDYsNCw3PiwgPDEsMSwxLDE+CisgIDI3MDY2MDQ5NTRVLAkvLyA8NCw3LDEsMj46IENvc3QgMyB2c2xkb2k4IDwzLDYsNCw3PiwgPDEsMiwzLDQ+CisgIDMzODU2MTA3NDZVLAkvLyA8NCw3LDEsMz46IENvc3QgNCB2bXJnbHcgPDUsMCw0LDE+LCA8NiwyLDcsMz4KKyAgMzM4NTYxMDM0MlUsCS8vIDw0LDcsMSw0PjogQ29zdCA0IHZtcmdsdyA8NSwwLDQsMT4sIDw1LDYsNyw0PgorICAzMzg1NjEwNjY3VSwJLy8gPDQsNywxLDU+OiBDb3N0IDQgdm1yZ2x3IDw1LDAsNCwxPiwgPDYsMSw3LDU+CisgIDM3Njg0MDMxNzhVLAkvLyA8NCw3LDEsNj46IENvc3QgNCB2c2xkb2k4IDwxLDYsNCw3PiwgPDEsNiw0LDc+CisgIDMzODU2MTEwNzRVLAkvLyA8NCw3LDEsNz46IENvc3QgNCB2bXJnbHcgPDUsMCw0LDE+LCA8Niw2LDcsNz4KKyAgMjcwNjYwNDk1NFUsCS8vIDw0LDcsMSx1PjogQ29zdCAzIHZzbGRvaTggPDMsNiw0LDc+LCA8MSwyLDMsND4KKyAgMzg1OTYwMDUzMlUsCS8vIDw0LDcsMiwwPjogQ29zdCA0IHZzbGRvaTEyIDw1LDYsNyw0PiwgPDcsMiwwLDM+CisgIDM3MTIwOTEwMzRVLAkvLyA8NCw3LDIsMT46IENvc3QgNSB2c2xkb2k0IDwzLDQsNywyPiwgPDEsMiwzLDQ+CisgIDM3NzQzNzU1MjhVLAkvLyA8NCw3LDIsMj46IENvc3QgNCB2c2xkb2k4IDwyLDYsNCw3PiwgPDIsMiwyLDI+CisgIDI3OTQ4NTM1NTJVLAkvLyA8NCw3LDIsMz46IENvc3QgMyB2c2xkb2kxMiA8NywyLDMsND4sIDw3LDIsMyw0PgorICAyNzg1ODU4NzQ0VSwJLy8gPDQsNywyLDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDQ+LCA8NywyLDQsMz4KKyAgMzczNTk4MjE4MlUsCS8vIDw0LDcsMiw1PjogQ29zdCA0IHZzbGRvaTQgPDcsNCw3LDI+LCA8NSw2LDcsND4KKyAgMzc3NDM3NTg3NVUsCS8vIDw0LDcsMiw2PjogQ29zdCA0IHZzbGRvaTggPDIsNiw0LDc+LCA8Miw2LDQsNz4KKyAgMzczNTk4MzQ3NlUsCS8vIDw0LDcsMiw3PjogQ29zdCA0IHZzbGRvaTQgPDcsNCw3LDI+LCA8Nyw0LDcsMj4KKyAgMjc5NTIyMjIzN1UsCS8vIDw0LDcsMix1PjogQ29zdCAzIHZzbGRvaTEyIDw3LDIsdSw0PiwgPDcsMix1LDQ+CisgIDM3ODAzNDgwNTRVLAkvLyA8NCw3LDMsMD46IENvc3QgNCB2c2xkb2k4IDwzLDYsNCw3PiwgPDMsMCwxLDI+CisgIDM3MzAwMTUxMzBVLAkvLyA8NCw3LDMsMT46IENvc3QgNCB2c2xkb2k0IDw2LDQsNywzPiwgPDEsMiwzLDQ+CisgIDM3ODAzNDgyNDRVLAkvLyA8NCw3LDMsMj46IENvc3QgNCB2c2xkb2k4IDwzLDYsNCw3PiwgPDMsMiw0LDM+CisgIDM3NzgzNTc2NzNVLAkvLyA8NCw3LDMsMz46IENvc3QgNCB2c2xkb2k4IDwzLDMsNCw3PiwgPDMsMyw0LDc+CisgIDIzMjUxNTU5NDJVLAkvLyA8NCw3LDMsND46IENvc3QgMyB2bXJnbHcgPDcsMiw0LDM+LCA8NSw2LDcsND4KKyAgMzc3OTY4NDkzOVUsCS8vIDw0LDcsMyw1PjogQ29zdCA1IHZzbGRvaTggPDMsNSw0LDc+LCA8Myw1LDQsNz4KKyAgMjcwNjYwNjc0OFUsCS8vIDw0LDcsMyw2PjogQ29zdCAzIHZzbGRvaTggPDMsNiw0LDc+LCA8Myw2LDQsNz4KKyAgMzM5ODg5ODQ5OFUsCS8vIDw0LDcsMyw3PjogQ29zdCA0IHZtcmdsdyA8NywyLDQsMz4sIDw2LDYsNyw3PgorICAyNzA3OTM0MDE0VSwJLy8gPDQsNywzLHU+OiBDb3N0IDMgdnNsZG9pOCA8Myx1LDQsNz4sIDwzLHUsNCw3PgorICAyNzg1ODU4ODY4VSwJLy8gPDQsNyw0LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDQ+LCA8Nyw0LDAsMT4KKyAgMzc4MDM0ODg3NFUsCS8vIDw0LDcsNCwxPjogQ29zdCA0IHZzbGRvaTggPDMsNiw0LDc+LCA8NCwxLDIsMz4KKyAgMzc4MDM0OTAwMFUsCS8vIDw0LDcsNCwyPjogQ29zdCA0IHZzbGRvaTggPDMsNiw0LDc+LCA8NCwyLDcsMz4KKyAgMjMwODU3NTczOFUsCS8vIDw0LDcsNCwzPjogQ29zdCAzIHZtcmdsdyA8NCw0LDQsND4sIDw2LDIsNywzPgorICAyNjU2MjgzODU2VSwJLy8gPDQsNyw0LDQ+OiBDb3N0IDMgdnNsZG9pNCA8Niw0LDcsND4sIDw0LDQsNCw0PgorICAyNzA2NjA3NDE0VSwJLy8gPDQsNyw0LDU+OiBDb3N0IDMgdnNsZG9pOCA8Myw2LDQsNz4sIFJIUworICAyNjU2Mjg1MzQxVSwJLy8gPDQsNyw0LDY+OiBDb3N0IDMgdnNsZG9pNCA8Niw0LDcsND4sIDw2LDQsNyw0PgorICAyMjQxNDY4MDEyVSwJLy8gPDQsNyw0LDc+OiBDb3N0IDMgdm1yZ2h3IDw0LDQsNCw0PiwgPDcsNyw3LDc+CisgIDI3MDY2MDc2NTdVLAkvLyA8NCw3LDQsdT46IENvc3QgMyB2c2xkb2k4IDwzLDYsNCw3PiwgUkhTCisgIDExNjg1NjkzMzhVLAkvLyA8NCw3LDUsMD46IENvc3QgMiB2bXJnaHcgUkhTLCA8NywwLDEsMj4KKyAgMjI0MjMxMTI0MlUsCS8vIDw0LDcsNSwxPjogQ29zdCAzIHZtcmdodyBSSFMsIDw3LDEsMSwxPgorICAyMjQyMzAzMTc4VSwJLy8gPDQsNyw1LDI+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDcsMiw2LDM+CisgIDIyNDIzMTEzOTVVLAkvLyA8NCw3LDUsMz46IENvc3QgMyB2bXJnaHcgUkhTLCA8NywzLDAsMT4KKyAgMTE2ODU2OTcwMlUsCS8vIDw0LDcsNSw0PjogQ29zdCAyIHZtcmdodyBSSFMsIDw3LDQsNSw2PgorICAyMjQyMzExNjA2VSwJLy8gPDQsNyw1LDU+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDcsNSw1LDU+CisgIDIyNDIzMTE2NjJVLAkvLyA8NCw3LDUsNj46IENvc3QgMyB2bXJnaHcgUkhTLCA8Nyw2LDIsNz4KKyAgMTE2ODU2OTk2NFUsCS8vIDw0LDcsNSw3PjogQ29zdCAyIHZtcmdodyBSSFMsIDw3LDcsNyw3PgorICAxMTY4NTY5OTg2VSwJLy8gPDQsNyw1LHU+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDcsdSwxLDI+CisgIDMzMTY1OTM2NThVLAkvLyA8NCw3LDYsMD46IENvc3QgNCB2bXJnaHcgPDQsNiw1LDI+LCA8NywwLDEsMj4KKyAgMzMxNjU5MzczOFUsCS8vIDw0LDcsNiwxPjogQ29zdCA1IHZtcmdodyA8NCw2LDUsMj4sIDw3LDEsMSwxPgorICAzMzE2NjM0ODAwVSwJLy8gPDQsNyw2LDI+OiBDb3N0IDQgdm1yZ2h3IDw0LDYsNSw3PiwgPDcsMiwzLDQ+CisgIDMzODY5Nzg4MTBVLAkvLyA8NCw3LDYsMz46IENvc3QgNCB2bXJnbHcgPDUsMiw0LDY+LCA8NiwyLDcsMz4KKyAgMjc4NTg1OTA3MlUsCS8vIDw0LDcsNiw0PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNyw0PiwgPDcsNiw0LDc+CisgIDM3MzYwMTQ5NTBVLAkvLyA8NCw3LDYsNT46IENvc3QgNCB2c2xkb2k0IDw3LDQsNyw2PiwgPDUsNiw3LDQ+CisgIDMzMTY1OTQxNThVLAkvLyA8NCw3LDYsNj46IENvc3QgNCB2bXJnaHcgPDQsNiw1LDI+LCA8Nyw2LDIsNz4KKyAgMjc5NzgwMzAzMlUsCS8vIDw0LDcsNiw3PjogQ29zdCAzIHZzbGRvaTEyIDw3LDYsNyw0PiwgPDcsNiw3LDQ+CisgIDI3OTc4NzY3NjlVLAkvLyA8NCw3LDYsdT46IENvc3QgMyB2c2xkb2kxMiA8Nyw2LHUsND4sIDw3LDYsdSw0PgorICAyMjQzNDk5MDAyVSwJLy8gPDQsNyw3LDA+OiBDb3N0IDMgdm1yZ2h3IDw0LDcsNSwwPiwgPDcsMCwxLDI+CisgIDM3MTgxMDM5NjJVLAkvLyA8NCw3LDcsMT46IENvc3QgNCB2c2xkb2k0IDw0LDQsNyw3PiwgPDEsMiwzLDQ+CisgIDMzMTcyNTc0MThVLAkvLyA8NCw3LDcsMj46IENvc3QgNCB2bXJnaHcgPDQsNyw1LDI+LCA8NywyLDYsMz4KKyAgMzM3NzY5NTgxNlUsCS8vIDw0LDcsNywzPjogQ29zdCA0IHZtcmdsdyA8Myw2LDQsNz4sIDw0LDIsNywzPgorICAyMjQzNTMyMTM0VSwJLy8gPDQsNyw3LDQ+OiBDb3N0IDMgdm1yZ2h3IDw0LDcsNSw0PiwgPDcsNCw1LDY+CisgIDMzMTcyODIyMzBVLAkvLyA8NCw3LDcsNT46IENvc3QgNCB2bXJnaHcgPDQsNyw1LDU+LCA8Nyw1LDUsNT4KKyAgMjczMDQ5NzUzNlUsCS8vIDw0LDcsNyw2PjogQ29zdCAzIHZzbGRvaTggPDcsNiw0LDc+LCA8Nyw2LDQsNz4KKyAgMjI0MzU1Njk3MlUsCS8vIDw0LDcsNyw3PjogQ29zdCAzIHZtcmdodyA8NCw3LDUsNz4sIDw3LDcsNyw3PgorICAyMjQzNTY1MTg2VSwJLy8gPDQsNyw3LHU+OiBDb3N0IDMgdm1yZ2h3IDw0LDcsNSx1PiwgPDcsdSwxLDI+CisgIDExNzA1NTE4MDJVLAkvLyA8NCw3LHUsMD46IENvc3QgMiB2bXJnaHcgUkhTLCA8NywwLDEsMj4KKyAgMjcwNjYwOTk2NlUsCS8vIDw0LDcsdSwxPjogQ29zdCAzIHZzbGRvaTggPDMsNiw0LDc+LCBMSFMKKyAgMjI0NDI5Mzc5N1UsCS8vIDw0LDcsdSwyPjogQ29zdCAzIHZtcmdodyBSSFMsIDw3LDIsMiwyPgorICAyMjQ0MjkzODU5VSwJLy8gPDQsNyx1LDM+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDcsMywwLDE+CisgIDExNzA1NTIxNjZVLAkvLyA8NCw3LHUsND46IENvc3QgMiB2bXJnaHcgUkhTLCA8Nyw0LDUsNj4KKyAgMjcwNjYxMDMzMFUsCS8vIDw0LDcsdSw1PjogQ29zdCAzIHZzbGRvaTggPDMsNiw0LDc+LCBSSFMKKyAgMjI0NDI5NDEyNlUsCS8vIDw0LDcsdSw2PjogQ29zdCAzIHZtcmdodyBSSFMsIDw3LDYsMiw3PgorICAxMTcwNTUyNDI4VSwJLy8gPDQsNyx1LDc+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDcsNyw3LDc+CisgIDExNzA1NTI0NTBVLAkvLyA8NCw3LHUsdT46IENvc3QgMiB2bXJnaHcgUkhTLCA8Nyx1LDEsMj4KKyAgMTE2NTExODM1NFUsCS8vIDw0LHUsMCwwPjogQ29zdCAyIHZtcmdodyA8NCwwLDUsMT4sIDw0LDAsNSwxPgorICAxNjI0OTA3ODc4VSwJLy8gPDQsdSwwLDE+OiBDb3N0IDIgdnNsZG9pOCA8MiwzLDQsdT4sIExIUworICAyNjM4NDA3Mzc3VSwJLy8gPDQsdSwwLDI+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LHUsMD4sIDwyLDMsNCx1PgorICAyMjk1OTMxMDM2VSwJLy8gPDQsdSwwLDM+OiBDb3N0IDMgdm1yZ2x3IDwyLDMsNCwwPiwgTEhTCisgIDI2ODczNjk1ODRVLAkvLyA8NCx1LDAsND46IENvc3QgMyB2c2xkb2k4IDwwLDQsNCx1PiwgPDAsNCw0LHU+CisgIDExNjUxMjE2OTBVLAkvLyA8NCx1LDAsNT46IENvc3QgMiB2bXJnaHcgPDQsMCw1LDE+LCBSSFMKKyAgMjY2MjI5ODQ4OVUsCS8vIDw0LHUsMCw2PjogQ29zdCAzIHZzbGRvaTQgPDcsNCx1LDA+LCA8Niw3LDQsdT4KKyAgMjI5NTkzNDI4MFUsCS8vIDw0LHUsMCw3PjogQ29zdCAzIHZtcmdsdyA8MiwzLDQsMD4sIFJIUworICAxNjI0OTA4NDQ1VSwJLy8gPDQsdSwwLHU+OiBDb3N0IDIgdnNsZG9pOCA8MiwzLDQsdT4sIExIUworICAyNjM4NDEzOTI2VSwJLy8gPDQsdSwxLDA+OiBDb3N0IDMgdnNsZG9pNCA8Myw0LHUsMT4sIExIUworICAyNjkxMzUxMzgyVSwJLy8gPDQsdSwxLDE+OiBDb3N0IDMgdnNsZG9pOCA8MSwxLDQsdT4sIDwxLDEsNCx1PgorICAxNjg1MjgwNTU4VSwJLy8gPDQsdSwxLDI+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMiwzLDQ+LCBMSFMKKyAgMjI4NzMxMzA1MlUsCS8vIDw0LHUsMSwzPjogQ29zdCAzIHZtcmdsdyA8MCx1LDQsMT4sIExIUworICAyMjk5MjU3Nzk5VSwJLy8gPDQsdSwxLDQ+OiBDb3N0IDMgdm1yZ2x3IDwyLHUsNCwxPiwgPDEsMix1LDQ+CisgIDI2OTQwMDU5MTRVLAkvLyA8NCx1LDEsNT46IENvc3QgMyB2c2xkb2k4IDwxLDUsNCx1PiwgPDEsNSw0LHU+CisgIDIzMDUyMzEzNjJVLAkvLyA8NCx1LDEsNj46IENvc3QgMyB2bXJnbHcgPDMsdSw0LDE+LCA8Myw0LDUsNj4KKyAgMjI4NzMxNjI5NlUsCS8vIDw0LHUsMSw3PjogQ29zdCAzIHZtcmdsdyA8MCx1LDQsMT4sIFJIUworICAxNjg1MjgwNjEyVSwJLy8gPDQsdSwxLHU+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMiwzLDQ+LCBMSFMKKyAgMjYzODQyMjExOFUsCS8vIDw0LHUsMiwwPjogQ29zdCAzIHZzbGRvaTQgPDMsNCx1LDI+LCBMSFMKKyAgMjI0MDIwNjYzOFUsCS8vIDw0LHUsMiwxPjogQ29zdCAzIHZtcmdodyA8NCwyLDUsMz4sIExIUworICAyNjk3OTg3NzEyVSwJLy8gPDQsdSwyLDI+OiBDb3N0IDMgdnNsZG9pOCA8MiwyLDQsdT4sIDwyLDIsNCx1PgorICAxNjI0OTA5NTIxVSwJLy8gPDQsdSwyLDM+OiBDb3N0IDIgdnNsZG9pOCA8MiwzLDQsdT4sIDwyLDMsNCx1PgorICAyNzU5MzkxMTIxVSwJLy8gPDQsdSwyLDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMix1LDQ+LCA8dSwyLDQsMz4KKyAgMjI0MDIwNzAwMlUsCS8vIDw0LHUsMiw1PjogQ29zdCAzIHZtcmdodyA8NCwyLDUsMz4sIFJIUworICAyNjk4NjUxNTc4VSwJLy8gPDQsdSwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDQsdT4sIDwyLDYsMyw3PgorICAyNzg1ODU5NTAwVSwJLy8gPDQsdSwyLDc+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDQ+LCA8dSwyLDcsMz4KKyAgMTYyODIyNzY4NlUsCS8vIDw0LHUsMix1PjogQ29zdCAyIHZzbGRvaTggPDIsdSw0LHU+LCA8Mix1LDQsdT4KKyAgMjc1OTAyMjUyNFUsCS8vIDw0LHUsMywwPjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPHUsMywwLDE+CisgIDI4MDEzNDI0MDhVLAkvLyA8NCx1LDMsMT46IENvc3QgMyB2c2xkb2kxMiA8dSwzLDEsND4sIDx1LDMsMSw0PgorICAyNzAzOTYwNDA5VSwJLy8gPDQsdSwzLDI+OiBDb3N0IDMgdnNsZG9pOCA8MywyLDQsdT4sIDwzLDIsNCx1PgorICAyNzU5MDIyNTU0VSwJLy8gPDQsdSwzLDM+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8dSwzLDMsND4KKyAgMjc1OTAyMjU2NFUsCS8vIDw0LHUsMyw0PjogQ29zdCAzIHZzbGRvaTEyIDwxLDIsMyw0PiwgPHUsMyw0LDU+CisgIDIyNDA4NDU5NzhVLAkvLyA8NCx1LDMsNT46IENvc3QgMyB2bXJnaHcgPDQsMyw1LDA+LCBSSFMKKyAgMjcwNjYxNDk0MVUsCS8vIDw0LHUsMyw2PjogQ29zdCAzIHZzbGRvaTggPDMsNiw0LHU+LCA8Myw2LDQsdT4KKyAgMjMwMTI2NzI3MlUsCS8vIDw0LHUsMyw3PjogQ29zdCAzIHZtcmdsdyA8MywyLDQsMz4sIFJIUworICAyNzU5MDIyNTk2VSwJLy8gPDQsdSwzLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDEsMiwzLDQ+LCA8dSwzLHUsMT4KKyAgMTU3MDY2ODY0NlUsCS8vIDw0LHUsNCwwPjogQ29zdCAyIHZzbGRvaTQgPDQsNCx1LDQ+LCBMSFMKKyAgMTE2NzcyNjM4MlUsCS8vIDw0LHUsNCwxPjogQ29zdCAyIHZtcmdodyA8NCw0LDQsND4sIExIUworICAyNjk4NjUyNzUzVSwJLy8gPDQsdSw0LDI+OiBDb3N0IDMgdnNsZG9pOCA8MiwzLDQsdT4sIDw0LDIsdSwzPgorICAxMjM0ODI5NDY4VSwJLy8gPDQsdSw0LDM+OiBDb3N0IDIgdm1yZ2x3IDw0LDQsNCw0PiwgTEhTCisgIDIyOTAzNTMxOFUsCS8vIDw0LHUsNCw0PjogQ29zdCAxIHZzcGx0aXN3MCBSSFMKKyAgMTYyNDkxMTE1OFUsCS8vIDw0LHUsNCw1PjogQ29zdCAyIHZzbGRvaTggPDIsMyw0LHU+LCBSSFMKKyAgMjY5ODY1MzA4MVUsCS8vIDw0LHUsNCw2PjogQ29zdCAzIHZzbGRvaTggPDIsMyw0LHU+LCA8NCw2LHUsNz4KKyAgMTIzNDgzMjcxMlUsCS8vIDw0LHUsNCw3PjogQ29zdCAyIHZtcmdsdyA8NCw0LDQsND4sIFJIUworICAyMjkwMzUzMThVLAkvLyA8NCx1LDQsdT46IENvc3QgMSB2c3BsdGlzdzAgUkhTCisgIDExNjg1NjE4NzVVLAkvLyA8NCx1LDUsMD46IENvc3QgMiB2bXJnaHcgUkhTLCA8dSwwLDEsMj4KKyAgOTQ4MjAxNDJVLAkvLyA8NCx1LDUsMT46IENvc3QgMSB2bXJnaHcgUkhTLCBMSFMKKyAgMTE2ODU2MjA1M1UsCS8vIDw0LHUsNSwyPjogQ29zdCAyIHZtcmdodyBSSFMsIDx1LDIsMywwPgorICAxMjIyMjMwMTcyVSwJLy8gPDQsdSw1LDM+OiBDb3N0IDIgdm1yZ2x3IDwyLDMsNCw1PiwgTEhTCisgIDExNjg1NjIyMzlVLAkvLyA8NCx1LDUsND46IENvc3QgMiB2bXJnaHcgUkhTLCA8dSw0LDUsNj4KKyAgOTQ4MjA1MDZVLAkvLyA8NCx1LDUsNT46IENvc3QgMSB2bXJnaHcgUkhTLCBSSFMKKyAgMTY4NTI4MDkyMlUsCS8vIDw0LHUsNSw2PjogQ29zdCAyIHZzbGRvaTEyIDwxLDIsMyw0PiwgUkhTCisgIDEyMjIyMzM0MTZVLAkvLyA8NCx1LDUsNz46IENvc3QgMiB2bXJnbHcgPDIsMyw0LDU+LCBSSFMKKyAgOTQ4MjA3MDlVLAkvLyA8NCx1LDUsdT46IENvc3QgMSB2bXJnaHcgUkhTLCBMSFMKKyAgMTU2NDcxMzA2MlUsCS8vIDw0LHUsNiwwPjogQ29zdCAyIHZzbGRvaTQgPDMsNCx1LDY+LCBMSFMKKyAgMjYyNjUxMTk3OVUsCS8vIDw0LHUsNiwxPjogQ29zdCAzIHZzbGRvaTQgPDEsNCx1LDY+LCA8MSw0LHUsNj4KKyAgMjYzMjQ4NDY3NlUsCS8vIDw0LHUsNiwyPjogQ29zdCAzIHZzbGRvaTQgPDIsNCx1LDY+LCA8Miw0LHUsNj4KKyAgMTU2NDcxNTU0OVUsCS8vIDw0LHUsNiwzPjogQ29zdCAyIHZzbGRvaTQgPDMsNCx1LDY+LCA8Myw0LHUsNj4KKyAgMTU2NDcxNjM0MlUsCS8vIDw0LHUsNiw0PjogQ29zdCAyIHZzbGRvaTQgPDMsNCx1LDY+LCBSSFMKKyAgMjI0Mjg1MzAxOFUsCS8vIDw0LHUsNiw1PjogQ29zdCAzIHZtcmdodyA8NCw2LDUsMj4sIFJIUworICAyNjU2Mzc1NDY0VSwJLy8gPDQsdSw2LDY+OiBDb3N0IDMgdnNsZG9pNCA8Niw0LHUsNj4sIDw2LDQsdSw2PgorICAyNzcwNTM0NFUsCS8vIDw0LHUsNiw3PjogQ29zdCAwIGNvcHkgUkhTCisgIDI3NzA1MzQ0VSwJLy8gPDQsdSw2LHU+OiBDb3N0IDAgY29weSBSSFMKKyAgMjc4NTg1OTg0MFUsCS8vIDw0LHUsNywwPjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNyw0PiwgPHUsNywwLDE+CisgIDIyNDM0OTk4MjJVLAkvLyA8NCx1LDcsMT46IENvc3QgMyB2bXJnaHcgPDQsNyw1LDA+LCBMSFMKKyAgMjcyNzg1MTE5N1UsCS8vIDw0LHUsNywyPjogQ29zdCAzIHZzbGRvaTggPDcsMiw0LHU+LCA8NywyLDQsdT4KKyAgMjMwMzk1MTAwNFUsCS8vIDw0LHUsNywzPjogQ29zdCAzIHZtcmdsdyA8Myw2LDQsNz4sIExIUworICAyNzg1ODU5ODgwVSwJLy8gPDQsdSw3LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDQ+LCA8dSw3LDQsNT4KKyAgMjI0MzUwMDE4NlUsCS8vIDw0LHUsNyw1PjogQ29zdCAzIHZtcmdodyA8NCw3LDUsMD4sIFJIUworICAyNzMwNTA1NzI5VSwJLy8gPDQsdSw3LDY+OiBDb3N0IDMgdnNsZG9pOCA8Nyw2LDQsdT4sIDw3LDYsNCx1PgorICAyMzAzOTU0MjQ4VSwJLy8gPDQsdSw3LDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDYsNCw3PiwgUkhTCisgIDIzMDM5NTEwMDlVLAkvLyA8NCx1LDcsdT46IENvc3QgMyB2bXJnbHcgPDMsNiw0LDc+LCBMSFMKKyAgMTU2NDcyOTQ0NlUsCS8vIDw0LHUsdSwwPjogQ29zdCAyIHZzbGRvaTQgPDMsNCx1LHU+LCBMSFMKKyAgOTY4MTA3OThVLAkvLyA8NCx1LHUsMT46IENvc3QgMSB2bXJnaHcgUkhTLCBMSFMKKyAgMTY4NTI4MTEyNVUsCS8vIDw0LHUsdSwyPjogQ29zdCAyIHZzbGRvaTEyIDwxLDIsMyw0PiwgTEhTCisgIDEyMjIyNTQ3NDhVLAkvLyA8NCx1LHUsMz46IENvc3QgMiB2bXJnbHcgPDIsMyw0LHU+LCBMSFMKKyAgMjI5MDM1MzE4VSwJLy8gPDQsdSx1LDQ+OiBDb3N0IDEgdnNwbHRpc3cwIFJIUworICA5NjgxMTE2MlUsCS8vIDw0LHUsdSw1PjogQ29zdCAxIHZtcmdodyBSSFMsIFJIUworICAxNjg1MjgxMTY1VSwJLy8gPDQsdSx1LDY+OiBDb3N0IDIgdnNsZG9pMTIgPDEsMiwzLDQ+LCBSSFMKKyAgMjc3MDUzNDRVLAkvLyA8NCx1LHUsNz46IENvc3QgMCBjb3B5IFJIUworICAyNzcwNTM0NFUsCS8vIDw0LHUsdSx1PjogQ29zdCAwIGNvcHkgUkhTCisgIDI3NTQyMzIzMjBVLAkvLyA8NSwwLDAsMD46IENvc3QgMyB2c2xkb2kxMiA8MCw0LDEsNT4sIDwwLDAsMCwwPgorICAyNzU0MjMyMzMwVSwJLy8gPDUsMCwwLDE+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MCwwLDEsMT4KKyAgMzcxODE5NDg5NFUsCS8vIDw1LDAsMCwyPjogQ29zdCA0IHZzbGRvaTQgPDQsNSwwLDA+LCA8MiwzLDQsNT4KKyAgMzM3NjM4NTc2MlUsCS8vIDw1LDAsMCwzPjogQ29zdCA0IHZtcmdsdyA8Myw0LDUsMD4sIDw1LDIsMCwzPgorICAyNzU0MjMyMzU3VSwJLy8gPDUsMCwwLDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MCwwLDQsMT4KKyAgMzg0NTgxNjM3MFUsCS8vIDw1LDAsMCw1PjogQ29zdCA0IHZzbGRvaTEyIDwzLDQsMCw1PiwgPDAsMCw1LDU+CisgIDM3ODIzNTMzODlVLAkvLyA8NSwwLDAsNj46IENvc3QgNCB2c2xkb2k4IDw0LDAsNSwwPiwgPDAsNiwwLDc+CisgIDMzNzYzODYwOTBVLAkvLyA8NSwwLDAsNz46IENvc3QgNCB2bXJnbHcgPDMsNCw1LDA+LCA8NSw2LDAsNz4KKyAgMjc1NzQwMjY5N1UsCS8vIDw1LDAsMCx1PjogQ29zdCAzIHZzbGRvaTEyIDwwLHUsdSw1PiwgPDAsMCx1LDE+CisgIDI2MjY1NDM3MThVLAkvLyA8NSwwLDEsMD46IENvc3QgMyB2c2xkb2k0IDwxLDUsMCwxPiwgTEhTCisgIDI2MjY1NDQ3NTFVLAkvLyA8NSwwLDEsMT46IENvc3QgMyB2c2xkb2k0IDwxLDUsMCwxPiwgPDEsNSwwLDE+CisgIDE2ODA0OTA1OThVLAkvLyA8NSwwLDEsMj46IENvc3QgMiB2c2xkb2kxMiA8MCw0LDEsNT4sIExIUworICAzNzY2NDI4NjY1VSwJLy8gPDUsMCwxLDM+OiBDb3N0IDQgdnNsZG9pOCA8MSwzLDUsMD4sIDwxLDMsNSwwPgorICAyNjI2NTQ2OTk4VSwJLy8gPDUsMCwxLDQ+OiBDb3N0IDMgdnNsZG9pNCA8MSw1LDAsMT4sIFJIUworICAyNjUwNDM1NTM5VSwJLy8gPDUsMCwxLDU+OiBDb3N0IDMgdnNsZG9pNCA8NSw1LDAsMT4sIDw1LDUsMCwxPgorICAzNzgzMDE3NzE1VSwJLy8gPDUsMCwxLDY+OiBDb3N0IDQgdnNsZG9pOCA8NCwxLDUsMD4sIDwxLDYsNSw3PgorICAzMzg1MDE5MDAwVSwJLy8gPDUsMCwxLDc+OiBDb3N0IDQgdm1yZ2x3IDw0LHUsNSwxPiwgPDMsNiwwLDc+CisgIDE2ODA0OTA2NTJVLAkvLyA8NSwwLDEsdT46IENvc3QgMiB2c2xkb2kxMiA8MCw0LDEsNT4sIExIUworICAzMzc2Mzk4MzM2VSwJLy8gPDUsMCwyLDA+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsNSwyPiwgPDAsMCwwLDA+CisgIDIyNDU4Nzc4NjJVLAkvLyA8NSwwLDIsMT46IENvc3QgMyB2bXJnaHcgPDUsMiwxLDM+LCBMSFMKKyAgMzc3MzA2NDgwOFUsCS8vIDw1LDAsMiwyPjogQ29zdCA0IHZzbGRvaTggPDIsNCw1LDA+LCA8MiwyLDIsMj4KKyAgMjcwNTI5NTA1NFUsCS8vIDw1LDAsMiwzPjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDA+LCA8MiwzLDQsNT4KKyAgMzgyNzk3NDM0M1UsCS8vIDw1LDAsMiw0PjogQ29zdCA0IHZzbGRvaTEyIDwwLDQsMSw1PiwgPDAsMiw0LDE+CisgIDM4NDU4MTY1MzBVLAkvLyA8NSwwLDIsNT46IENvc3QgNCB2c2xkb2kxMiA8Myw0LDAsNT4sIDwwLDIsNSwzPgorICAzNzc5MDM3MTE0VSwJLy8gPDUsMCwyLDY+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDUsMD4sIDwyLDYsMyw3PgorICAzODEwODg3NjU4VSwJLy8gPDUsMCwyLDc+OiBDb3N0IDQgdnNsZG9pOCA8dSw3LDUsMD4sIDwyLDcsMCwxPgorICAyMjQ1ODc4NDI5VSwJLy8gPDUsMCwyLHU+OiBDb3N0IDMgdm1yZ2h3IDw1LDIsMSwzPiwgTEhTCisgIDI3MTA2MDM5MjZVLAkvLyA8NSwwLDMsMD46IENvc3QgMyB2c2xkb2k4IDw0LDMsNSwwPiwgPDMsMCwxLDI+CisgIDM4Mjc5NzQzOTZVLAkvLyA8NSwwLDMsMT46IENvc3QgNCB2c2xkb2kxMiA8MCw0LDEsNT4sIDwwLDMsMSwwPgorICAzNzc5MDM3NTE2VSwJLy8gPDUsMCwzLDI+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDUsMD4sIDwzLDIsMyw0PgorICAzNzc5MDM3NTk2VSwJLy8gPDUsMCwzLDM+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDUsMD4sIDwzLDMsMywzPgorICAyNzA1Mjk1ODY4VSwJLy8gPDUsMCwzLDQ+OiBDb3N0IDMgdnNsZG9pOCA8Myw0LDUsMD4sIDwzLDQsNSwwPgorICAzMzc5NzI2ODA0VSwJLy8gPDUsMCwzLDU+OiBDb3N0IDQgdm1yZ2x3IDw0LDAsNSwzPiwgPDMsNCwwLDU+CisgIDM4MDI5MjU3NDhVLAkvLyA8NSwwLDMsNj46IENvc3QgNCB2c2xkb2k4IDw3LDQsNSwwPiwgPDMsNiw3LDQ+CisgIDMzNjMxMzgxNjhVLAkvLyA8NSwwLDMsNz46IENvc3QgNSB2bXJnbHcgPDEsMiw1LDM+LCA8Myw2LDAsNz4KKyAgMjcwNzk1MDQwMFUsCS8vIDw1LDAsMyx1PjogQ29zdCAzIHZzbGRvaTggPDMsdSw1LDA+LCA8Myx1LDUsMD4KKyAgMjYyNjU2ODI5NFUsCS8vIDw1LDAsNCwwPjogQ29zdCAzIHZzbGRvaTQgPDEsNSwwLDQ+LCBMSFMKKyAgMTY4MDQ5MDgzNFUsCS8vIDw1LDAsNCwxPjogQ29zdCAyIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDM4MjgwNDgyMTlVLAkvLyA8NSwwLDQsMj46IENvc3QgNCB2c2xkb2kxMiA8MCw0LDIsNT4sIDwwLDQsMiw1PgorICAyNzEwNjA0OTMyVSwJLy8gPDUsMCw0LDM+OiBDb3N0IDMgdnNsZG9pOCA8NCwzLDUsMD4sIDw0LDMsNSwwPgorICAyNzU0MjMyNjg1VSwJLy8gPDUsMCw0LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MCw0LDQsNT4KKyAgMjcwNTI5NjY5NFUsCS8vIDw1LDAsNCw1PjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDA+LCBSSFMKKyAgMzc3OTAzODU5MFUsCS8vIDw1LDAsNCw2PjogQ29zdCA0IHZzbGRvaTggPDMsNCw1LDA+LCA8NCw2LDUsNz4KKyAgMjcxMzI1OTQ2NFUsCS8vIDw1LDAsNCw3PjogQ29zdCAzIHZzbGRvaTggPDQsNyw1LDA+LCA8NCw3LDUsMD4KKyAgMTY4MDQ5MDgzNFUsCS8vIDw1LDAsNCx1PjogQ29zdCAyIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDIzMTEzMDcyNjRVLAkvLyA8NSwwLDUsMD46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDU+LCA8MCwwLDAsMD4KKyAgMTE3NDQzNzk5MFUsCS8vIDw1LDAsNSwxPjogQ29zdCAyIHZtcmdodyA8NSw1LDUsNT4sIExIUworICAzNzc5MDM4OTQ2VSwJLy8gPDUsMCw1LDI+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDUsMD4sIDw1LDIsMCwzPgorICAzODQ1ODE2NzUyVSwJLy8gPDUsMCw1LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNCwwLDU+LCA8MCw1LDMsMD4KKyAgMjI0ODE4MDA1MFUsCS8vIDw1LDAsNSw0PjogQ29zdCAzIHZtcmdodyA8NSw1LDUsNT4sIDwwLDQsMSw1PgorICAyMjQ4MTgwMTk0VSwJLy8gPDUsMCw1LDU+OiBDb3N0IDMgdm1yZ2h3IDw1LDUsNSw1PiwgPDAsNSx1LDU+CisgIDM3NzkwMzkyNzRVLAkvLyA8NSwwLDUsNj46IENvc3QgNCB2c2xkb2k4IDwzLDQsNSwwPiwgPDUsNiwwLDc+CisgIDMzODUwNTE3NjhVLAkvLyA8NSwwLDUsNz46IENvc3QgNCB2bXJnbHcgPDQsdSw1LDU+LCA8Myw2LDAsNz4KKyAgMTE3NDQzODU1N1UsCS8vIDw1LDAsNSx1PjogQ29zdCAyIHZtcmdodyA8NSw1LDUsNT4sIExIUworICAyMzAyNjg5MjgwVSwJLy8gPDUsMCw2LDA+OiBDb3N0IDMgdm1yZ2x3IDwzLDQsNSw2PiwgPDAsMCwwLDA+CisgIDExNzUyMDgwMzhVLAkvLyA8NSwwLDYsMT46IENvc3QgMiB2bXJnaHcgPDUsNiw3LDA+LCBMSFMKKyAgMzc4NzAwMjM2MlUsCS8vIDw1LDAsNiwyPjogQ29zdCA0IHZzbGRvaTggPDQsNyw1LDA+LCA8NiwyLDcsMz4KKyAgMzM3NjQzMjE2MFUsCS8vIDw1LDAsNiwzPjogQ29zdCA0IHZtcmdsdyA8Myw0LDUsNj4sIDwxLDQsMCwzPgorICAyMjQ4OTUwMDk4VSwJLy8gPDUsMCw2LDQ+OiBDb3N0IDMgdm1yZ2h3IDw1LDYsNywwPiwgPDAsNCwxLDU+CisgIDIyNDg5NTAxODBVLAkvLyA8NSwwLDYsNT46IENvc3QgMyB2bXJnaHcgPDUsNiw3LDA+LCA8MCw1LDEsNj4KKyAgMzM3NjQzMzcwMlUsCS8vIDw1LDAsNiw2PjogQ29zdCA0IHZtcmdsdyA8Myw0LDUsNj4sIDwzLDUsMCw2PgorICAyNzI5MTg2MTY2VSwJLy8gPDUsMCw2LDc+OiBDb3N0IDMgdnNsZG9pOCA8Nyw0LDUsMD4sIDw2LDcsNCw1PgorICAxMTc1MjA4NjA1VSwJLy8gPDUsMCw2LHU+OiBDb3N0IDIgdm1yZ2h3IDw1LDYsNywwPiwgTEhTCisgIDI3MTMyNjEwNTBVLAkvLyA8NSwwLDcsMD46IENvc3QgMyB2c2xkb2k4IDw0LDcsNSwwPiwgPDcsMCwxLDI+CisgIDMzNjU4MjM1OTlVLAkvLyA8NSwwLDcsMT46IENvc3QgNCB2bXJnbHcgPDEsNiw1LDc+LCA8MSw1LDAsMT4KKyAgMzgwODkwMDMxN1UsCS8vIDw1LDAsNywyPjogQ29zdCA0IHZzbGRvaTggPHUsNCw1LDA+LCA8NywyLHUsND4KKyAgMzc4NDM0ODg5OVUsCS8vIDw1LDAsNywzPjogQ29zdCA0IHZzbGRvaTggPDQsMyw1LDA+LCA8NywzLDAsMT4KKyAgMjcyOTE4NjY1NlUsCS8vIDw1LDAsNyw0PjogQ29zdCAzIHZzbGRvaTggPDcsNCw1LDA+LCA8Nyw0LDUsMD4KKyAgMzc4NzAwMzI2OFUsCS8vIDw1LDAsNyw1PjogQ29zdCA0IHZzbGRvaTggPDQsNyw1LDA+LCA8Nyw1LDAsMD4KKyAgMzgwMjkyODY2NFUsCS8vIDw1LDAsNyw2PjogQ29zdCA0IHZzbGRvaTggPDcsNCw1LDA+LCA8Nyw2LDcsND4KKyAgMzc4NzAwMzQzMVUsCS8vIDw1LDAsNyw3PjogQ29zdCA0IHZzbGRvaTggPDQsNyw1LDA+LCA8Nyw3LDAsMT4KKyAgMjczMTg0MTE4OFUsCS8vIDw1LDAsNyx1PjogQ29zdCAzIHZzbGRvaTggPDcsdSw1LDA+LCA8Nyx1LDUsMD4KKyAgMjYyNjYwMTA2MlUsCS8vIDw1LDAsdSwwPjogQ29zdCAzIHZzbGRvaTQgPDEsNSwwLHU+LCBMSFMKKyAgMTY4MzE0NTM2NlUsCS8vIDw1LDAsdSwxPjogQ29zdCAyIHZzbGRvaTEyIDwwLHUsMSw1PiwgPDAsdSwxLDU+CisgIDE2ODA0OTExNjVVLAkvLyA8NSwwLHUsMj46IENvc3QgMiB2c2xkb2kxMiA8MCw0LDEsNT4sIExIUworICAyNzA1Mjk1MDU0VSwJLy8gPDUsMCx1LDM+OiBDb3N0IDMgdnNsZG9pOCA8Myw0LDUsMD4sIDwyLDMsNCw1PgorICAyNzU0MjMzMDA1VSwJLy8gPDUsMCx1LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MCx1LDQsMT4KKyAgMjcwNTI5OTYxMFUsCS8vIDw1LDAsdSw1PjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDA+LCBSSFMKKyAgMzc3OTA0MTQ4OFUsCS8vIDw1LDAsdSw2PjogQ29zdCA0IHZzbGRvaTggPDMsNCw1LDA+LCA8dSw2LDMsNz4KKyAgMjczNzE1MDI1MlUsCS8vIDw1LDAsdSw3PjogQ29zdCAzIHZzbGRvaTggPHUsNyw1LDA+LCA8dSw3LDUsMD4KKyAgMTY4MDQ5MTIxOVUsCS8vIDw1LDAsdSx1PjogQ29zdCAyIHZzbGRvaTEyIDwwLDQsMSw1PiwgTEhTCisgIDI3MTM5Mjc2ODBVLAkvLyA8NSwxLDAsMD46IENvc3QgMyB2c2xkb2k4IDw0LHUsNSwxPiwgPDAsMCwwLDA+CisgIDE2NDAxODU5NThVLAkvLyA8NSwxLDAsMT46IENvc3QgMiB2c2xkb2k4IDw0LHUsNSwxPiwgTEhTCisgIDIzMTA2MDc4NjZVLAkvLyA8NSwxLDAsMj46IENvc3QgMyB2bXJnbHcgPDQsNyw1LDA+LCA8NywwLDEsMj4KKyAgMzc4NzY2OTc1NlUsCS8vIDw1LDEsMCwzPjogQ29zdCA0IHZzbGRvaTggPDQsdSw1LDE+LCA8MCwzLDEsMD4KKyAgMjcxMzkyODAxOFUsCS8vIDw1LDEsMCw0PjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDE+LCA8MCw0LDEsNT4KKyAgMjMwNjYyMTc3OFUsCS8vIDw1LDEsMCw1PjogQ29zdCAzIHZtcmdsdyA8NCwxLDUsMD4sIDwwLDQsMSw1PgorICAzNzg3NjcwMDA2VSwJLy8gPDUsMSwwLDY+OiBDb3N0IDQgdnNsZG9pOCA8NCx1LDUsMT4sIDwwLDYsMSw3PgorICAzNzM2MTg4MzAxVSwJLy8gPDUsMSwwLDc+OiBDb3N0IDQgdnNsZG9pNCA8Nyw1LDEsMD4sIDw3LDUsMSwwPgorICAxNjQwMTg2NTI1VSwJLy8gPDUsMSwwLHU+OiBDb3N0IDIgdnNsZG9pOCA8NCx1LDUsMT4sIExIUworICAyNjUwNTA1MzE4VSwJLy8gPDUsMSwxLDA+OiBDb3N0IDMgdnNsZG9pNCA8NSw1LDEsMT4sIExIUworICAyNzU0MjMzMTQwVSwJLy8gPDUsMSwxLDE+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MSwxLDEsMT4KKyAgMjMxMTI3NjY5NFUsCS8vIDw1LDEsMSwyPjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsMT4sIDwzLDAsMSwyPgorICAyMzExMjc4MzE1VSwJLy8gPDUsMSwxLDM+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSwxPiwgPDUsMiwxLDM+CisgIDI3NTg0MzU2NjdVLAkvLyA8NSwxLDEsND46IENvc3QgMyB2c2xkb2kxMiA8MSwxLDQsNT4sIDwxLDEsNCw1PgorICAyNzU0MjMzMTgwVSwJLy8gPDUsMSwxLDU+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MSwxLDUsNT4KKyAgMzM4NTAxNjQ5N1UsCS8vIDw1LDEsMSw2PjogQ29zdCA0IHZtcmdsdyA8NCx1LDUsMT4sIDwwLDIsMSw2PgorICAyMzExMjc4NjQzVSwJLy8gPDUsMSwxLDc+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSwxPiwgPDUsNiwxLDc+CisgIDI3NTg3MzA2MTVVLAkvLyA8NSwxLDEsdT46IENvc3QgMyB2c2xkb2kxMiA8MSwxLHUsNT4sIDwxLDEsdSw1PgorICAzNzAwMzY3NDYyVSwJLy8gPDUsMSwyLDA+OiBDb3N0IDQgdnNsZG9pNCA8MSw1LDEsMj4sIExIUworICAzODMwNjI5MjU1VSwJLy8gPDUsMSwyLDE+OiBDb3N0IDQgdnNsZG9pMTIgPDAsdSwxLDU+LCA8MSwyLDEsMz4KKyAgMjcxMzkyOTMyMFUsCS8vIDw1LDEsMiwyPjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDE+LCA8MiwyLDIsMj4KKyAgMjc1NDIzMzIzOFUsCS8vIDw1LDEsMiwzPjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDEsMiwzLDA+CisgIDI3NTkwOTkzMDBVLAkvLyA8NSwxLDIsND46IENvc3QgMyB2c2xkb2kxMiA8MSwyLDQsNT4sIDwxLDIsNCw1PgorICAyNzU0MjMzMjU5VSwJLy8gPDUsMSwyLDU+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MSwyLDUsMz4KKyAgMjcxMzkyOTY1OFUsCS8vIDw1LDEsMiw2PjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDE+LCA8Miw2LDMsNz4KKyAgMzg3MjM1OTM1NFUsCS8vIDw1LDEsMiw3PjogQ29zdCA0IHZzbGRvaTEyIDw3LHUsMCw1PiwgPDEsMiw3LDA+CisgIDI3NTQyMzMyODNVLAkvLyA8NSwxLDIsdT46IENvc3QgMyB2c2xkb2kxMiA8MCw0LDEsNT4sIDwxLDIsdSwwPgorICAyNzEzOTI5ODc4VSwJLy8gPDUsMSwzLDA+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsMT4sIDwzLDAsMSwyPgorICAzMzYzMTM1NDk4VSwJLy8gPDUsMSwzLDE+OiBDb3N0IDQgdm1yZ2x3IDwxLDIsNSwzPiwgPDAsMCwxLDE+CisgIDMzNjMxMzc2ODZVLAkvLyA8NSwxLDMsMj46IENvc3QgNCB2bXJnbHcgPDEsMiw1LDM+LCA8MywwLDEsMj4KKyAgMjcxMzkzMDE0MFUsCS8vIDw1LDEsMywzPjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDE+LCA8MywzLDMsMz4KKyAgMjcxMzkzMDI0MlUsCS8vIDw1LDEsMyw0PjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDE+LCA8Myw0LDUsNj4KKyAgMjI4OTM5NDAwMlUsCS8vIDw1LDEsMyw1PjogQ29zdCAzIHZtcmdsdyA8MSwyLDUsMz4sIDwwLDQsMSw1PgorICAzNzg3NjcyMTg0VSwJLy8gPDUsMSwzLDY+OiBDb3N0IDQgdnNsZG9pOCA8NCx1LDUsMT4sIDwzLDYsMCw3PgorICAzNzg3NjcyMjU5VSwJLy8gPDUsMSwzLDc+OiBDb3N0IDQgdnNsZG9pOCA8NCx1LDUsMT4sIDwzLDcsMCwxPgorICAyNzEzOTMwNTI2VSwJLy8gPDUsMSwzLHU+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsMT4sIDwzLHUsMSwyPgorICAxNjM0ODgwNDAyVSwJLy8gPDUsMSw0LDA+OiBDb3N0IDIgdnNsZG9pOCA8NCwwLDUsMT4sIDw0LDAsNSwxPgorICAyNzYwMjA1MzU1VSwJLy8gPDUsMSw0LDE+OiBDb3N0IDMgdnNsZG9pMTIgPDEsNCwxLDU+LCA8MSw0LDEsNT4KKyAgMjc2MDI3OTA5MlUsCS8vIDw1LDEsNCwyPjogQ29zdCAzIHZzbGRvaTEyIDwxLDQsMiw1PiwgPDEsNCwyLDU+CisgIDM3ODc2NzI3MDhVLAkvLyA8NSwxLDQsMz46IENvc3QgNCB2c2xkb2k4IDw0LHUsNSwxPiwgPDQsMyw1LDA+CisgIDI3MTM5MzA5NjBVLAkvLyA8NSwxLDQsND46IENvc3QgMyB2c2xkb2k4IDw0LHUsNSwxPiwgPDQsNCw0LDQ+CisgIDE2NDAxODkyMzhVLAkvLyA8NSwxLDQsNT46IENvc3QgMiB2c2xkb2k4IDw0LHUsNSwxPiwgUkhTCisgIDM3ODYzNDU4NDhVLAkvLyA8NSwxLDQsNj46IENvc3QgNCB2c2xkb2k4IDw0LDYsNSwxPiwgPDQsNiw1LDE+CisgIDM3ODcwMDk0ODFVLAkvLyA8NSwxLDQsNz46IENvc3QgNCB2c2xkb2k4IDw0LDcsNSwxPiwgPDQsNyw1LDE+CisgIDE2NDAxODk0NjZVLAkvLyA8NSwxLDQsdT46IENvc3QgMiB2c2xkb2k4IDw0LHUsNSwxPiwgPDQsdSw1LDE+CisgIDI3NTQyMzM0NTVVLAkvLyA8NSwxLDUsMD46IENvc3QgMyB2c2xkb2kxMiA8MCw0LDEsNT4sIDwxLDUsMCwxPgorICAyNzEzOTMxNDA3VSwJLy8gPDUsMSw1LDE+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsMT4sIDw1LDEsMCwxPgorICAyNzEzOTMxNDk5VSwJLy8gPDUsMSw1LDI+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsMT4sIDw1LDIsMSwzPgorICAzODI3OTc1MzA1VSwJLy8gPDUsMSw1LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MSw1LDMsMD4KKyAgMjc1NDIzMzQ5NVUsCS8vIDw1LDEsNSw0PjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDEsNSw0LDU+CisgIDIyODg3NDY4MzRVLAkvLyA8NSwxLDUsNT46IENvc3QgMyB2bXJnbHcgPDEsMSw1LDU+LCA8MCw0LDEsNT4KKyAgMjcxMzkzMTgyN1UsCS8vIDw1LDEsNSw2PjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDE+LCA8NSw2LDEsNz4KKyAgMzc4NzY3MzcyNVUsCS8vIDw1LDEsNSw3PjogQ29zdCA0IHZzbGRvaTggPDQsdSw1LDE+LCA8NSw3LDEsMD4KKyAgMjc1NDIzMzUyN1UsCS8vIDw1LDEsNSx1PjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDEsNSx1LDE+CisgIDI2Njg0NjIxODJVLAkvLyA8NSwxLDYsMD46IENvc3QgMyB2c2xkb2k0IDx1LDUsMSw2PiwgTEhTCisgIDIyOTA3NDYwMDJVLAkvLyA8NSwxLDYsMT46IENvc3QgMyB2bXJnbHcgPDEsNCw1LDY+LCA8MCx1LDEsMT4KKyAgMjMwMjY5MTQ3OFUsCS8vIDw1LDEsNiwyPjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsNj4sIDwzLDAsMSwyPgorICAzMzY0NDg4MDcxVSwJLy8gPDUsMSw2LDM+OiBDb3N0IDQgdm1yZ2x3IDwxLDQsNSw2PiwgPDEsMiwxLDM+CisgIDIzMDI2ODk1MzZVLAkvLyA8NSwxLDYsND46IENvc3QgMyB2bXJnbHcgPDMsNCw1LDY+LCA8MCwzLDEsND4KKyAgMjc1NDIzMzU4N1UsCS8vIDw1LDEsNiw1PjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDEsNiw1LDc+CisgIDI3MTM5MzI2MDBVLAkvLyA8NSwxLDYsNj46IENvc3QgMyB2c2xkb2k4IDw0LHUsNSwxPiwgPDYsNiw2LDY+CisgIDI3MTM5MzI2MjJVLAkvLyA8NSwxLDYsNz46IENvc3QgMyB2c2xkb2k4IDw0LHUsNSwxPiwgPDYsNywwLDE+CisgIDIzMDI2ODkyOTdVLAkvLyA8NSwxLDYsdT46IENvc3QgMyB2bXJnbHcgPDMsNCw1LDY+LCA8MCwwLDEsdT4KKyAgMjcxMzkzMjc5NFUsCS8vIDw1LDEsNywwPjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDE+LCA8NywwLDEsMj4KKyAgMzM2NTgyMjQ3NFUsCS8vIDw1LDEsNywxPjogQ29zdCA0IHZtcmdsdyA8MSw2LDUsNz4sIDwwLDAsMSwxPgorICAzMzY1ODI0NjYyVSwJLy8gPDUsMSw3LDI+OiBDb3N0IDQgdm1yZ2x3IDwxLDYsNSw3PiwgPDMsMCwxLDI+CisgIDM3ODc2NzQ4NTFVLAkvLyA8NSwxLDcsMz46IENvc3QgNCB2c2xkb2k4IDw0LHUsNSwxPiwgPDcsMywwLDE+CisgIDI3MTM5MzMxNThVLAkvLyA8NSwxLDcsND46IENvc3QgMyB2c2xkb2k4IDw0LHUsNSwxPiwgPDcsNCw1LDY+CisgIDIyOTIwODA5NzhVLAkvLyA8NSwxLDcsNT46IENvc3QgMyB2bXJnbHcgPDEsNiw1LDc+LCA8MCw0LDEsNT4KKyAgMzM2NTgyMzYxM1UsCS8vIDw1LDEsNyw2PjogQ29zdCA0IHZtcmdsdyA8MSw2LDUsNz4sIDwxLDUsMSw2PgorICAyNzEzOTMzNDIwVSwJLy8gPDUsMSw3LDc+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsMT4sIDw3LDcsNyw3PgorICAyNzEzOTMzNDQyVSwJLy8gPDUsMSw3LHU+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsMT4sIDw3LHUsMSwyPgorICAxNjU4NzcxMTkwVSwJLy8gPDUsMSx1LDA+OiBDb3N0IDIgdnNsZG9pOCA8dSwwLDUsMT4sIDx1LDAsNSwxPgorICAxNjQwMTkxNzkwVSwJLy8gPDUsMSx1LDE+OiBDb3N0IDIgdnNsZG9pOCA8NCx1LDUsMT4sIExIUworICAyNzYyOTMzNjI0VSwJLy8gPDUsMSx1LDI+OiBDb3N0IDMgdnNsZG9pMTIgPDEsdSwyLDU+LCA8MSx1LDIsNT4KKyAgMjc1NDIzMzcyNFUsCS8vIDw1LDEsdSwzPjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDEsdSwzLDA+CisgIDI3NjMwODEwOThVLAkvLyA8NSwxLHUsND46IENvc3QgMyB2c2xkb2kxMiA8MSx1LDQsNT4sIDwxLHUsNCw1PgorICAxNjQwMTkyMTU0VSwJLy8gPDUsMSx1LDU+OiBDb3N0IDIgdnNsZG9pOCA8NCx1LDUsMT4sIFJIUworICAyNzEzOTM0MDMyVSwJLy8gPDUsMSx1LDY+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsMT4sIDx1LDYsMyw3PgorICAyNzEzOTM0MDgwVSwJLy8gPDUsMSx1LDc+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsMT4sIDx1LDcsMCwxPgorICAxNjQwMTkyMzU3VSwJLy8gPDUsMSx1LHU+OiBDb3N0IDIgdnNsZG9pOCA8NCx1LDUsMT4sIExIUworICAzNzc5MDUxNTIwVSwJLy8gPDUsMiwwLDA+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDUsMj4sIDwwLDAsMCwwPgorICAyNzA1MzA5Nzk4VSwJLy8gPDUsMiwwLDE+OiBDb3N0IDMgdnNsZG9pOCA8Myw0LDUsMj4sIExIUworICAzODM4ODEzNjM3VSwJLy8gPDUsMiwwLDI+OiBDb3N0IDQgdnNsZG9pMTIgPDIsMiw0LDU+LCA8MiwwLDIsMT4KKyAgMjMwMjY0MDIzMFUsCS8vIDw1LDIsMCwzPjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsMD4sIExIUworICAzNzY1MTE3MjY2VSwJLy8gPDUsMiwwLDQ+OiBDb3N0IDQgdnNsZG9pOCA8MSwxLDUsMj4sIDwwLDQsMSw1PgorICAzMzgxMDI3ODkyVSwJLy8gPDUsMiwwLDU+OiBDb3N0IDQgdm1yZ2x3IDw0LDIsNSwwPiwgPDEsNCwyLDU+CisgIDM4NDI3OTQ5ODVVLAkvLyA8NSwyLDAsNj46IENvc3QgNCB2c2xkb2kxMiA8Mix1LDQsNT4sIDwyLDAsNiwxPgorICAzNDA4MjMyNTU0VSwJLy8gPDUsMiwwLDc+OiBDb3N0IDQgdm1yZ2x3IDx1LDcsNSwwPiwgPDAsMSwyLDc+CisgIDIzMDI2NDAyMzVVLAkvLyA8NSwyLDAsdT46IENvc3QgMyB2bXJnbHcgPDMsNCw1LDA+LCBMSFMKKyAgMzcwMDQzMjk5OFUsCS8vIDw1LDIsMSwwPjogQ29zdCA0IHZzbGRvaTQgPDEsNSwyLDE+LCBMSFMKKyAgMzc2NTExNzc4NVUsCS8vIDw1LDIsMSwxPjogQ29zdCA0IHZzbGRvaTggPDEsMSw1LDI+LCA8MSwxLDUsMj4KKyAgMjMxMTI3NjEzNlUsCS8vIDw1LDIsMSwyPjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsMT4sIDwyLDIsMiwyPgorICAxMjM3NTMyNzc0VSwJLy8gPDUsMiwxLDM+OiBDb3N0IDIgdm1yZ2x3IDw0LHUsNSwxPiwgTEhTCisgIDM3MDA0MzYyNzhVLAkvLyA8NSwyLDEsND46IENvc3QgNCB2c2xkb2k0IDwxLDUsMiwxPiwgUkhTCisgIDMzODEwMzYwODRVLAkvLyA8NSwyLDEsNT46IENvc3QgNCB2bXJnbHcgPDQsMiw1LDE+LCA8MSw0LDIsNT4KKyAgMzM4NTAxODA0NVUsCS8vIDw1LDIsMSw2PjogQ29zdCA0IHZtcmdsdyA8NCx1LDUsMT4sIDwyLDMsMiw2PgorICAzMzg1MDE3NTYwVSwJLy8gPDUsMiwxLDc+OiBDb3N0IDQgdm1yZ2x3IDw0LHUsNSwxPiwgPDEsNiwyLDc+CisgIDEyMzc1MzI3NzlVLAkvLyA8NSwyLDEsdT46IENvc3QgMiB2bXJnbHcgPDQsdSw1LDE+LCBMSFMKKyAgMzcwMDQ0MTE5MFUsCS8vIDw1LDIsMiwwPjogQ29zdCA0IHZzbGRvaTQgPDEsNSwyLDI+LCBMSFMKKyAgMzcwMDQ0MjI0MlUsCS8vIDw1LDIsMiwxPjogQ29zdCA0IHZzbGRvaTQgPDEsNSwyLDI+LCA8MSw1LDIsMj4KKyAgMjc1NDIzMzk2MFUsCS8vIDw1LDIsMiwyPjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDIsMiwyLDI+CisgIDI3NTQyMzM5NzBVLAkvLyA8NSwyLDIsMz46IENvc3QgMyB2c2xkb2kxMiA8MCw0LDEsNT4sIDwyLDIsMywzPgorICAyNzY1MDcxOTk3VSwJLy8gPDUsMiwyLDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDIsMiw0LDU+LCA8MiwyLDQsNT4KKyAgMzgzNDAyMTUwOFUsCS8vIDw1LDIsMiw1PjogQ29zdCA0IHZzbGRvaTEyIDwxLDQsMiw1PiwgPDIsMiw1LDM+CisgIDM4NDI3OTUxNTJVLAkvLyA8NSwyLDIsNj46IENvc3QgNCB2c2xkb2kxMiA8Mix1LDQsNT4sIDwyLDIsNiw2PgorICAzMzc2NDAyNDkyVSwJLy8gPDUsMiwyLDc+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsNSwyPiwgPDUsNiwyLDc+CisgIDI3NTQyMzQwMTVVLAkvLyA8NSwyLDIsdT46IENvc3QgMyB2c2xkb2kxMiA8MCw0LDEsNT4sIDwyLDIsdSwzPgorICAyNzU0MjM0MDIyVSwJLy8gPDUsMiwzLDA+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MiwzLDAsMT4KKyAgMzgyNzk3NTg1NVUsCS8vIDw1LDIsMywxPjogQ29zdCA0IHZzbGRvaTEyIDwwLDQsMSw1PiwgPDIsMywxLDE+CisgIDI2NDQ2MjUxMDJVLAkvLyA8NSwyLDMsMj46IENvc3QgMyB2c2xkb2k0IDw0LDUsMiwzPiwgPDIsMyw0LDU+CisgIDIyODkzOTM3NjZVLAkvLyA8NSwyLDMsMz46IENvc3QgMyB2bXJnbHcgPDEsMiw1LDM+LCBMSFMKKyAgMTY5MTk5MzgwNlUsCS8vIDw1LDIsMyw0PjogQ29zdCAyIHZzbGRvaTEyIDwyLDMsNCw1PiwgPDIsMyw0LDU+CisgIDI3ODUwNTIzNzVVLAkvLyA8NSwyLDMsNT46IENvc3QgMyB2c2xkb2kxMiA8NSw1LDUsNT4sIDwyLDMsNSw1PgorICAzODU0ODEyODk3VSwJLy8gPDUsMiwzLDY+OiBDb3N0IDQgdnNsZG9pMTIgPDQsdSw1LDU+LCA8MiwzLDYsNj4KKyAgMzgwMjk0MjE4N1UsCS8vIDw1LDIsMyw3PjogQ29zdCA0IHZzbGRvaTggPDcsNCw1LDI+LCA8Myw3LDQsNT4KKyAgMTY5MjI4ODc1NFUsCS8vIDw1LDIsMyx1PjogQ29zdCAyIHZzbGRvaTEyIDwyLDMsdSw1PiwgPDIsMyx1LDU+CisgIDM4Mzk4NDYxMzlVLAkvLyA8NSwyLDQsMD46IENvc3QgNCB2c2xkb2kxMiA8Miw0LDAsNT4sIDwyLDQsMCw1PgorICAyNzA5Mjk0MDUyVSwJLy8gPDUsMiw0LDE+OiBDb3N0IDMgdnNsZG9pOCA8NCwxLDUsMj4sIDw0LDEsNSwyPgorICAyNzY2MjUxNzg5VSwJLy8gPDUsMiw0LDI+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNCwyLDU+LCA8Miw0LDIsNT4KKyAgMjc2NTczNTcwMlUsCS8vIDw1LDIsNCwzPjogQ29zdCAzIHZzbGRvaTEyIDwyLDMsNCw1PiwgPDIsNCwzLDU+CisgIDM4NDAxNDEwODdVLAkvLyA8NSwyLDQsND46IENvc3QgNCB2c2xkb2kxMiA8Miw0LDQsNT4sIDwyLDQsNCw1PgorICAyNzA1MzEzMDc4VSwJLy8gPDUsMiw0LDU+OiBDb3N0IDMgdnNsZG9pOCA8Myw0LDUsMj4sIFJIUworICAyNzEyNjEyMjE3VSwJLy8gPDUsMiw0LDY+OiBDb3N0IDMgdnNsZG9pOCA8NCw2LDUsMj4sIDw0LDYsNSwyPgorICAzNzg3MDE3Njc0VSwJLy8gPDUsMiw0LDc+OiBDb3N0IDQgdnNsZG9pOCA8NCw3LDUsMj4sIDw0LDcsNSwyPgorICAyNzY1NzM1NzQ3VSwJLy8gPDUsMiw0LHU+OiBDb3N0IDMgdnNsZG9pMTIgPDIsMyw0LDU+LCA8Miw0LHUsNT4KKyAgMzgzNDAyMTcwNFUsCS8vIDw1LDIsNSwwPjogQ29zdCA0IHZzbGRvaTEyIDwxLDQsMiw1PiwgPDIsNSwwLDE+CisgIDM4MzQwMjE3MTRVLAkvLyA8NSwyLDUsMT46IENvc3QgNCB2c2xkb2kxMiA8MSw0LDIsNT4sIDwyLDUsMSwyPgorICAyMzExMzA4OTA0VSwJLy8gPDUsMiw1LDI+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSw1PiwgPDIsMiwyLDI+CisgIDEyMzc1NjU1NDJVLAkvLyA8NSwyLDUsMz46IENvc3QgMiB2bXJnbHcgPDQsdSw1LDU+LCBMSFMKKyAgMzgzNDAyMTc0NFUsCS8vIDw1LDIsNSw0PjogQ29zdCA0IHZzbGRvaTEyIDwxLDQsMiw1PiwgPDIsNSw0LDU+CisgIDMzNjkxMjQ5MTZVLAkvLyA8NSwyLDUsNT46IENvc3QgNCB2bXJnbHcgPDIsMiw1LDU+LCA8MSw0LDIsNT4KKyAgMjI0ODE4MTY5MFUsCS8vIDw1LDIsNSw2PjogQ29zdCAzIHZtcmdodyA8NSw1LDUsNT4sIDwyLDYsMyw3PgorICAzNzg2MzU0ODI1VSwJLy8gPDUsMiw1LDc+OiBDb3N0IDQgdnNsZG9pOCA8NCw2LDUsMj4sIDw1LDcsMiwzPgorICAxMjM3NTY1NTQ3VSwJLy8gPDUsMiw1LHU+OiBDb3N0IDIgdm1yZ2x3IDw0LHUsNSw1PiwgTEhTCisgIDM3MDA0NzM5NThVLAkvLyA8NSwyLDYsMD46IENvc3QgNCB2c2xkb2k0IDwxLDUsMiw2PiwgTEhTCisgIDM3MDA0NzUwMTRVLAkvLyA8NSwyLDYsMT46IENvc3QgNCB2c2xkb2k0IDwxLDUsMiw2PiwgPDEsNSwyLDY+CisgIDIyOTY3MTg5NTJVLAkvLyA8NSwyLDYsMj46IENvc3QgMyB2bXJnbHcgPDIsNCw1LDY+LCA8MiwyLDIsMj4KKyAgMTIyODk0NzU1OFUsCS8vIDw1LDIsNiwzPjogQ29zdCAyIHZtcmdsdyA8Myw0LDUsNj4sIExIUworICAzNzAwNDc3MjM4VSwJLy8gPDUsMiw2LDQ+OiBDb3N0IDQgdnNsZG9pNCA8MSw1LDIsNj4sIFJIUworICAzODM0MDIxODM2VSwJLy8gPDUsMiw2LDU+OiBDb3N0IDQgdnNsZG9pMTIgPDEsNCwyLDU+LCA8Miw2LDUsNz4KKyAgMjI0ODk1MTczOFUsCS8vIDw1LDIsNiw2PjogQ29zdCAzIHZtcmdodyA8NSw2LDcsMD4sIDwyLDYsMyw3PgorICAzMzcwNDYxMTA1VSwJLy8gPDUsMiw2LDc+OiBDb3N0IDQgdm1yZ2x3IDwyLDQsNSw2PiwgPDIsNiwyLDc+CisgIDEyMjg5NDc1NjNVLAkvLyA8NSwyLDYsdT46IENvc3QgMiB2bXJnbHcgPDMsNCw1LDY+LCBMSFMKKyAgMzc4NjM1NTcwNlUsCS8vIDw1LDIsNywwPjogQ29zdCA0IHZzbGRvaTggPDQsNiw1LDI+LCA8NywwLDEsMj4KKyAgMzc4MzAzODAzN1UsCS8vIDw1LDIsNywxPjogQ29zdCA0IHZzbGRvaTggPDQsMSw1LDI+LCA8NywxLDIsMz4KKyAgMzM2NTgyNDEwNFUsCS8vIDw1LDIsNywyPjogQ29zdCA0IHZtcmdsdyA8MSw2LDUsNz4sIDwyLDIsMiwyPgorICAyMjkyMDgwNzQyVSwJLy8gPDUsMiw3LDM+OiBDb3N0IDMgdm1yZ2x3IDwxLDYsNSw3PiwgTEhTCisgIDM4NDIxMzE5ODZVLAkvLyA8NSwyLDcsND46IENvc3QgNCB2c2xkb2kxMiA8Miw3LDQsNT4sIDwyLDcsNCw1PgorICAzMzcxNzk1NTA4VSwJLy8gPDUsMiw3LDU+OiBDb3N0IDQgdm1yZ2x3IDwyLDYsNSw3PiwgPDEsNCwyLDU+CisgIDM3ODYzNTYyMDZVLAkvLyA8NSwyLDcsNj46IENvc3QgNCB2c2xkb2k4IDw0LDYsNSwyPiwgPDcsNiwyLDc+CisgIDM3ODYzNTYzMzJVLAkvLyA8NSwyLDcsNz46IENvc3QgNCB2c2xkb2k4IDw0LDYsNSwyPiwgPDcsNyw3LDc+CisgIDIyOTIwODA3NDdVLAkvLyA8NSwyLDcsdT46IENvc3QgMyB2bXJnbHcgPDEsNiw1LDc+LCBMSFMKKyAgMjc1NDIzNDQyN1UsCS8vIDw1LDIsdSwwPjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDIsdSwwLDE+CisgIDI3MDUzMTU2MzBVLAkvLyA8NSwyLHUsMT46IENvc3QgMyB2c2xkb2k4IDwzLDQsNSwyPiwgTEhTCisgIDIyOTY3MzUzMzZVLAkvLyA8NSwyLHUsMj46IENvc3QgMyB2bXJnbHcgPDIsNCw1LHU+LCA8MiwyLDIsMj4KKyAgMTIyODk2Mzk0MlUsCS8vIDw1LDIsdSwzPjogQ29zdCAyIHZtcmdsdyA8Myw0LDUsdT4sIExIUworICAxNjk1MzExOTcxVSwJLy8gPDUsMix1LDQ+OiBDb3N0IDIgdnNsZG9pMTIgPDIsdSw0LDU+LCA8Mix1LDQsNT4KKyAgMjcwNTMxNTk5NFUsCS8vIDw1LDIsdSw1PjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDI+LCBSSFMKKyAgMjc2OTIwMTI2OVUsCS8vIDw1LDIsdSw2PjogQ29zdCAzIHZzbGRvaTEyIDwyLHUsNiw1PiwgPDIsdSw2LDU+CisgIDMzNzA0Nzc0ODlVLAkvLyA8NSwyLHUsNz46IENvc3QgNCB2bXJnbHcgPDIsNCw1LHU+LCA8Miw2LDIsNz4KKyAgMTY5NTYwNjkxOVUsCS8vIDw1LDIsdSx1PjogQ29zdCAyIHZzbGRvaTEyIDwyLHUsdSw1PiwgPDIsdSx1LDU+CisgIDM4Mjc5NzYzMzFVLAkvLyA8NSwzLDAsMD46IENvc3QgNCB2c2xkb2kxMiA8MCw0LDEsNT4sIDwzLDAsMCwwPgorICAyNzU0MjM0NTE4VSwJLy8gPDUsMywwLDE+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MywwLDEsMj4KKyAgMzcwNjQ3MjI5MFUsCS8vIDw1LDMsMCwyPjogQ29zdCA0IHZzbGRvaTQgPDIsNSwzLDA+LCA8Miw1LDMsMD4KKyAgMzcwMDUwMDYzMFUsCS8vIDw1LDMsMCwzPjogQ29zdCA0IHZzbGRvaTQgPDEsNSwzLDA+LCA8MywwLDEsMj4KKyAgMjc1NDIzNDU0NFUsCS8vIDw1LDMsMCw0PjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDMsMCw0LDE+CisgIDMzNzYzODM3NjZVLAkvLyA8NSwzLDAsNT46IENvc3QgNCB2bXJnbHcgPDMsNCw1LDA+LCA8Miw0LDMsNT4KKyAgMzc2OTc3MDUxM1UsCS8vIDw1LDMsMCw2PjogQ29zdCA1IHZzbGRvaTggPDEsdSw1LDM+LCA8MCw2LDQsNz4KKyAgMzM3NjM4MzkzMFUsCS8vIDw1LDMsMCw3PjogQ29zdCA0IHZtcmdsdyA8Myw0LDUsMD4sIDwyLDYsMyw3PgorICAyNzU0MjM0NTgxVSwJLy8gPDUsMywwLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8MywwLHUsMj4KKyAgMjMxMTI3NTQxNFUsCS8vIDw1LDMsMSwwPjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsMT4sIDwxLDIsMywwPgorICAyMzA1OTY3OTcxVSwJLy8gPDUsMywxLDE+OiBDb3N0IDMgdm1yZ2x3IDw0LDAsNSwxPiwgPDIsNSwzLDE+CisgIDI2OTIwNDc3ODdVLAkvLyA8NSwzLDEsMj46IENvc3QgMyB2c2xkb2k4IDwxLDIsNSwzPiwgPDEsMiw1LDM+CisgIDIzMTEyNzYxNDZVLAkvLyA8NSwzLDEsMz46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDE+LCA8MiwyLDMsMz4KKyAgMjMxMTI3NTQxOFUsCS8vIDw1LDMsMSw0PjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsMT4sIDwxLDIsMyw0PgorICAzNzY1Nzg5ODA3VSwJLy8gPDUsMywxLDU+OiBDb3N0IDQgdnNsZG9pOCA8MSwyLDUsMz4sIDwxLDUsMCwxPgorICAzNzY1Nzg5OTM5VSwJLy8gPDUsMywxLDY+OiBDb3N0IDQgdnNsZG9pOCA8MSwyLDUsMz4sIDwxLDYsNSw3PgorICAyMzExMjc2NDc0VSwJLy8gPDUsMywxLDc+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSwxPiwgPDIsNiwzLDc+CisgIDI2OTYwMjk1ODVVLAkvLyA8NSwzLDEsdT46IENvc3QgMyB2c2xkb2k4IDwxLHUsNSwzPiwgPDEsdSw1LDM+CisgIDIzMTEyODg3MDlVLAkvLyA8NSwzLDIsMD46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDI+LCA8dSwyLDMsMD4KKyAgMzc2NTc5MDI0M1UsCS8vIDw1LDMsMiwxPjogQ29zdCA0IHZzbGRvaTggPDEsMiw1LDM+LCA8MiwxLDMsNT4KKyAgMzgyNzk3NjUxM1UsCS8vIDw1LDMsMiwyPjogQ29zdCA0IHZzbGRvaTEyIDwwLDQsMSw1PiwgPDMsMiwyLDI+CisgIDI3NjU3MzYyNjhVLAkvLyA8NSwzLDIsMz46IENvc3QgMyB2c2xkb2kxMiA8MiwzLDQsNT4sIDwzLDIsMyw0PgorICAyMjQ2MjQ4OTYyVSwJLy8gPDUsMywyLDQ+OiBDb3N0IDMgdm1yZ2h3IDw1LDIsNiwzPiwgPDMsNCw1LDY+CisgIDM3NjU3OTA1NjNVLAkvLyA8NSwzLDIsNT46IENvc3QgNCB2c2xkb2k4IDwxLDIsNSwzPiwgPDIsNSwzLDE+CisgIDM4Mjc5NzY1NTBVLAkvLyA8NSwzLDIsNj46IENvc3QgNCB2c2xkb2kxMiA8MCw0LDEsNT4sIDwzLDIsNiwzPgorICAzODQyNzk1ODg3VSwJLy8gPDUsMywyLDc+OiBDb3N0IDQgdnNsZG9pMTIgPDIsdSw0LDU+LCA8MywyLDcsMz4KKyAgMjc2OTA1NDA3M1UsCS8vIDw1LDMsMix1PjogQ29zdCAzIHZzbGRvaTEyIDwyLHUsNCw1PiwgPDMsMix1LDQ+CisgIDM4Mjc5NzY1NzVVLAkvLyA8NSwzLDMsMD46IENvc3QgNCB2c2xkb2kxMiA8MCw0LDEsNT4sIDwzLDMsMCwxPgorICAzNzY1NzkwOTYzVSwJLy8gPDUsMywzLDE+OiBDb3N0IDQgdnNsZG9pOCA8MSwyLDUsMz4sIDwzLDEsMiw1PgorICAzODM5NDc4MTYyVSwJLy8gPDUsMywzLDI+OiBDb3N0IDQgdnNsZG9pMTIgPDIsMyw0LDU+LCA8MywzLDIsMj4KKyAgMjc1NDIzNDc4MFUsCS8vIDw1LDMsMywzPjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDMsMywzLDM+CisgIDI3NzE3MDgzMjdVLAkvLyA8NSwzLDMsND46IENvc3QgMyB2c2xkb2kxMiA8MywzLDQsNT4sIDwzLDMsNCw1PgorICAzMzYzMTM3MDU5VSwJLy8gPDUsMywzLDU+OiBDb3N0IDQgdm1yZ2x3IDwxLDIsNSwzPiwgPDIsMSwzLDU+CisgIDMzNzUwODEzMjBVLAkvLyA8NSwzLDMsNj46IENvc3QgNCB2bXJnbHcgPDMsMiw1LDM+LCA8Miw1LDMsNj4KKyAgMzM2MzEzNzQ2NlUsCS8vIDw1LDMsMyw3PjogQ29zdCA0IHZtcmdsdyA8MSwyLDUsMz4sIDwyLDYsMyw3PgorICAyNzcyMDAzMjc1VSwJLy8gPDUsMywzLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDMsMyx1LDU+LCA8MywzLHUsNT4KKyAgMjc3MjA3NzAxMlUsCS8vIDw1LDMsNCwwPjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsMCw1PiwgPDMsNCwwLDU+CisgIDM3NjU3OTE3MTRVLAkvLyA8NSwzLDQsMT46IENvc3QgNCB2c2xkb2k4IDwxLDIsNSwzPiwgPDQsMSw1LDA+CisgIDI3MDk5NjU4NzhVLAkvLyA8NSwzLDQsMj46IENvc3QgMyB2c2xkb2k4IDw0LDIsNSwzPiwgPDQsMiw1LDM+CisgIDI3NzIyOTgyMjNVLAkvLyA8NSwzLDQsMz46IENvc3QgMyB2c2xkb2kxMiA8Myw0LDMsNT4sIDwzLDQsMyw1PgorICAyNzcyMzcxOTYwVSwJLy8gPDUsMyw0LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNCw0LDU+LCA8Myw0LDQsNT4KKyAgMjc1NDIzNDg4MlUsCS8vIDw1LDMsNCw1PjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDMsNCw1LDY+CisgIDM4Mzk0NzgyODJVLAkvLyA8NSwzLDQsNj46IENvc3QgNCB2c2xkb2kxMiA8MiwzLDQsNT4sIDwzLDQsNiw1PgorICAzMzc2NDE2Njk4VSwJLy8gPDUsMyw0LDc+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsNSw0PiwgPDIsNiwzLDc+CisgIDI3NTQyMzQ5MDlVLAkvLyA8NSwzLDQsdT46IENvc3QgMyB2c2xkb2kxMiA8MCw0LDEsNT4sIDwzLDQsdSw2PgorICAyMzExMzA4MTgyVSwJLy8gPDUsMyw1LDA+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSw1PiwgPDEsMiwzLDA+CisgIDM3NjU3OTI0MjFVLAkvLyA8NSwzLDUsMT46IENvc3QgNCB2c2xkb2k4IDwxLDIsNSwzPiwgPDUsMSwyLDU+CisgIDI3MTU5Mzg1NzVVLAkvLyA8NSwzLDUsMj46IENvc3QgMyB2c2xkb2k4IDw1LDIsNSwzPiwgPDUsMiw1LDM+CisgIDIzMTEzMDg5MTRVLAkvLyA8NSwzLDUsMz46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDU+LCA8MiwyLDMsMz4KKyAgMjMxMTMwODE4NlUsCS8vIDw1LDMsNSw0PjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsNT4sIDwxLDIsMyw0PgorICAyMjQ4MTgyMzU0VSwJLy8gPDUsMyw1LDU+OiBDb3N0IDMgdm1yZ2h3IDw1LDUsNSw1PiwgPDMsNSw1LDU+CisgIDM3NjU3OTI4MzdVLAkvLyA8NSwzLDUsNj46IENvc3QgNCB2c2xkb2k4IDwxLDIsNSwzPiwgPDUsNiwzLDc+CisgIDIzMTEzMDkyNDJVLAkvLyA8NSwzLDUsNz46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDU+LCA8Miw2LDMsNz4KKyAgMjMxMTMwODE5MFUsCS8vIDw1LDMsNSx1PjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsNT4sIDwxLDIsMyx1PgorICAyNjMyNzc3ODMwVSwJLy8gPDUsMyw2LDA+OiBDb3N0IDMgdnNsZG9pNCA8Miw1LDMsNj4sIExIUworICAzNzA2NTIwMzcyVSwJLy8gPDUsMyw2LDE+OiBDb3N0IDQgdnNsZG9pNCA8Miw1LDMsNj4sIDwxLDEsMSwxPgorICAyNjMyNzc5NjI0VSwJLy8gPDUsMyw2LDI+OiBDb3N0IDMgdnNsZG9pNCA8Miw1LDMsNj4sIDwyLDUsMyw2PgorICAyNjMyNzgwMjkwVSwJLy8gPDUsMyw2LDM+OiBDb3N0IDMgdnNsZG9pNCA8Miw1LDMsNj4sIDwzLDQsNSw2PgorICAyNjMyNzgxMTEwVSwJLy8gPDUsMyw2LDQ+OiBDb3N0IDMgdnNsZG9pNCA8Miw1LDMsNj4sIFJIUworICAyMjQ4OTUyNDEzVSwJLy8gPDUsMyw2LDU+OiBDb3N0IDMgdm1yZ2h3IDw1LDYsNywwPiwgPDMsNSw2LDc+CisgIDIzMDI2OTExNzZVLAkvLyA8NSwzLDYsNj46IENvc3QgMyB2bXJnbHcgPDMsNCw1LDY+LCA8Miw1LDMsNj4KKyAgMjMwMjY5MTI1OFUsCS8vIDw1LDMsNiw3PjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsNj4sIDwyLDYsMyw3PgorICAyNjMyNzgzNjYyVSwJLy8gPDUsMyw2LHU+OiBDb3N0IDMgdnNsZG9pNCA8Miw1LDMsNj4sIExIUworICAzMzY1ODIzMzgyVSwJLy8gPDUsMyw3LDA+OiBDb3N0IDQgdm1yZ2x3IDwxLDYsNSw3PiwgPDEsMiwzLDA+CisgIDM3MDY1MjkwMTFVLAkvLyA8NSwzLDcsMT46IENvc3QgNCB2c2xkb2k0IDwyLDUsMyw3PiwgPDEsNiw1LDc+CisgIDM3MDY1Mjk2NDFVLAkvLyA8NSwzLDcsMj46IENvc3QgNCB2c2xkb2k0IDwyLDUsMyw3PiwgPDIsNSwzLDc+CisgIDMzNjU4MjQxMTRVLAkvLyA8NSwzLDcsMz46IENvc3QgNCB2bXJnbHcgPDEsNiw1LDc+LCA8MiwyLDMsMz4KKyAgMjc3NDM2Mjg1OVUsCS8vIDw1LDMsNyw0PjogQ29zdCAzIHZzbGRvaTEyIDwzLDcsNCw1PiwgPDMsNyw0LDU+CisgIDMzNjU4MjQwMzVVLAkvLyA8NSwzLDcsNT46IENvc3QgNCB2bXJnbHcgPDEsNiw1LDc+LCA8MiwxLDMsNT4KKyAgMzM4Mzc0MDE4M1UsCS8vIDw1LDMsNyw2PjogQ29zdCA0IHZtcmdsdyA8NCw2LDUsNz4sIDwyLDQsMyw2PgorICAzMzYzODMzNzg2VSwJLy8gPDUsMyw3LDc+OiBDb3N0IDQgdm1yZ2x3IDwxLDMsNSw3PiwgPDIsNiwzLDc+CisgIDI3NzQ2NTc4MDdVLAkvLyA8NSwzLDcsdT46IENvc3QgMyB2c2xkb2kxMiA8Myw3LHUsNT4sIDwzLDcsdSw1PgorICAyNjMyNzk0MjE0VSwJLy8gPDUsMyx1LDA+OiBDb3N0IDMgdnNsZG9pNCA8Miw1LDMsdT4sIExIUworICAyNzU0MjM1MTY2VSwJLy8gPDUsMyx1LDE+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8Myx1LDEsMj4KKyAgMjYzMjc5NjAxMFUsCS8vIDw1LDMsdSwyPjogQ29zdCAzIHZzbGRvaTQgPDIsNSwzLHU+LCA8Miw1LDMsdT4KKyAgMjYzMjc5NjY3NlUsCS8vIDw1LDMsdSwzPjogQ29zdCAzIHZzbGRvaTQgPDIsNSwzLHU+LCA8Myw0LDUsdT4KKyAgMjYzMjc5NzQ5NFUsCS8vIDw1LDMsdSw0PjogQ29zdCAzIHZzbGRvaTQgPDIsNSwzLHU+LCBSSFMKKyAgMjc1NDIzNTIwNlUsCS8vIDw1LDMsdSw1PjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDMsdSw1LDY+CisgIDIzMDI2OTExNzZVLAkvLyA8NSwzLHUsNj46IENvc3QgMyB2bXJnbHcgPDMsNCw1LDY+LCA8Miw1LDMsNj4KKyAgMjMwMjcwNzY0MlUsCS8vIDw1LDMsdSw3PjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsdT4sIDwyLDYsMyw3PgorICAyNzU0MjM1MjI5VSwJLy8gPDUsMyx1LHU+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8Myx1LHUsMj4KKyAgMzc2NTEzMzMyNVUsCS8vIDw1LDQsMCwwPjogQ29zdCA0IHZzbGRvaTggPDEsMSw1LDQ+LCA8MCwwLDEsND4KKyAgMjcwNTMyNjE4MlUsCS8vIDw1LDQsMCwxPjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDQ+LCBMSFMKKyAgMzcxODQ4OTgwNlUsCS8vIDw1LDQsMCwyPjogQ29zdCA0IHZzbGRvaTQgPDQsNSw0LDA+LCA8MiwzLDQsNT4KKyAgMzcxODQ5MDYyNFUsCS8vIDw1LDQsMCwzPjogQ29zdCA0IHZzbGRvaTQgPDQsNSw0LDA+LCA8Myw0LDUsND4KKyAgMjcwOTMwNzczMFUsCS8vIDw1LDQsMCw0PjogQ29zdCAzIHZzbGRvaTggPDQsMSw1LDQ+LCA8MCw0LDEsNT4KKyAgMjMwMjY0MTg3MFUsCS8vIDw1LDQsMCw1PjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsMD4sIDwyLDMsNCw1PgorICAzMzc2MzgzNjk1VSwJLy8gPDUsNCwwLDY+OiBDb3N0IDUgdm1yZ2x3IDwzLDQsNSwwPiwgPDIsMyw0LDY+CisgIDMzODQzNTEwMThVLAkvLyA8NSw0LDAsNz46IENvc3QgNCB2bXJnbHcgPDQsNyw1LDA+LCA8dSw3LDQsNz4KKyAgMjcwNTMyNjc0OVUsCS8vIDw1LDQsMCx1PjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDQ+LCBMSFMKKyAgMjMwNTk3MTA1N1UsCS8vIDw1LDQsMSwwPjogQ29zdCAzIHZtcmdsdyA8NCwwLDUsMT4sIDw2LDcsNCwwPgorICAzNzY1MTM0MTcxVSwJLy8gPDUsNCwxLDE+OiBDb3N0IDQgdnNsZG9pOCA8MSwxLDUsND4sIDwxLDEsNSw0PgorICAzNzY2NDYxMzM4VSwJLy8gPDUsNCwxLDI+OiBDb3N0IDQgdnNsZG9pOCA8MSwzLDUsND4sIDwxLDIsMyw0PgorICAzNzY2NDYxNDM3VSwJLy8gPDUsNCwxLDM+OiBDb3N0IDQgdnNsZG9pOCA8MSwzLDUsND4sIDwxLDMsNSw0PgorICAyMzExMjc3Nzc2VSwJLy8gPDUsNCwxLDQ+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSwxPiwgPDQsNCw0LDQ+CisgIDI3NTQyMzUzNjJVLAkvLyA8NSw0LDEsNT46IENvc3QgMyB2c2xkb2kxMiA8MCw0LDEsNT4sIDw0LDEsNSwwPgorICAzNzgzMDUwNDgzVSwJLy8gPDUsNCwxLDY+OiBDb3N0IDQgdnNsZG9pOCA8NCwxLDUsND4sIDwxLDYsNSw3PgorICAzMzg1MDE5MDM2VSwJLy8gPDUsNCwxLDc+OiBDb3N0IDQgdm1yZ2x3IDw0LHUsNSwxPiwgPDMsNiw0LDc+CisgIDIzMTEyNzYyNDFVLAkvLyA8NSw0LDEsdT46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDE+LCA8MiwzLDQsdT4KKyAgMzcxODUwNDU1MFUsCS8vIDw1LDQsMiwwPjogQ29zdCA0IHZzbGRvaTQgPDQsNSw0LDI+LCBMSFMKKyAgMzc4MzA1MDc4N1UsCS8vIDw1LDQsMiwxPjogQ29zdCA0IHZzbGRvaTggPDQsMSw1LDQ+LCA8MiwxLDMsNT4KKyAgMzc3MzA5NzU3NlUsCS8vIDw1LDQsMiwyPjogQ29zdCA0IHZzbGRvaTggPDIsNCw1LDQ+LCA8MiwyLDIsMj4KKyAgMjcwNTMyNzgyMlUsCS8vIDw1LDQsMiwzPjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDQ+LCA8MiwzLDQsNT4KKyAgMzc3MzA5Nzc2N1UsCS8vIDw1LDQsMiw0PjogQ29zdCA0IHZzbGRvaTggPDIsNCw1LDQ+LCA8Miw0LDUsND4KKyAgMjc2NTczNzAxNFUsCS8vIDw1LDQsMiw1PjogQ29zdCAzIHZzbGRvaTEyIDwyLDMsNCw1PiwgPDQsMiw1LDM+CisgIDM3NzkwNjk4ODJVLAkvLyA8NSw0LDIsNj46IENvc3QgNCB2c2xkb2k4IDwzLDQsNSw0PiwgPDIsNiwzLDc+CisgIDMzNzY0MDEwNTJVLAkvLyA8NSw0LDIsNz46IENvc3QgNSB2bXJnbHcgPDMsNCw1LDI+LCA8Myw2LDQsNz4KKyAgMjI0NTg4MTM3MFUsCS8vIDw1LDQsMix1PjogQ29zdCAzIHZtcmdodyA8NSwyLDEsMz4sIDw0LHUsNSwxPgorICAzNzc5MDcwMTAyVSwJLy8gPDUsNCwzLDA+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDUsND4sIDwzLDAsMSwyPgorICAzMzYzMTM1NTI1VSwJLy8gPDUsNCwzLDE+OiBDb3N0IDQgdm1yZ2x3IDwxLDIsNSwzPiwgPDAsMCw0LDE+CisgIDM3NzkwNzAyODRVLAkvLyA8NSw0LDMsMj46IENvc3QgNCB2c2xkb2k4IDwzLDQsNSw0PiwgPDMsMiwzLDQ+CisgIDM3NzkwNzAzNjRVLAkvLyA8NSw0LDMsMz46IENvc3QgNCB2c2xkb2k4IDwzLDQsNSw0PiwgPDMsMywzLDM+CisgIDI3MDUzMjg2NDBVLAkvLyA8NSw0LDMsND46IENvc3QgMyB2c2xkb2k4IDwzLDQsNSw0PiwgPDMsNCw1LDQ+CisgIDIzMDczMTEzMTBVLAkvLyA8NSw0LDMsNT46IENvc3QgMyB2bXJnbHcgPDQsMiw1LDM+LCA8MiwzLDQsNT4KKyAgMzg2NjAyMTAxMlUsCS8vIDw1LDQsMyw2PjogQ29zdCA0IHZzbGRvaTEyIDw2LDcsNCw1PiwgPDQsMyw2LDc+CisgIDMzNjMxMzgyMDRVLAkvLyA8NSw0LDMsNz46IENvc3QgNSB2bXJnbHcgPDEsMiw1LDM+LCA8Myw2LDQsNz4KKyAgMjcwNzk4MzE3MlUsCS8vIDw1LDQsMyx1PjogQ29zdCAzIHZzbGRvaTggPDMsdSw1LDQ+LCA8Myx1LDUsND4KKyAgMjcwODY0NjgwNVUsCS8vIDw1LDQsNCwwPjogQ29zdCAzIHZzbGRvaTggPDQsMCw1LDQ+LCA8NCwwLDUsND4KKyAgMjcwOTMxMDQzOFUsCS8vIDw1LDQsNCwxPjogQ29zdCAzIHZzbGRvaTggPDQsMSw1LDQ+LCA8NCwxLDUsND4KKyAgMzc3OTA3MTAzMFUsCS8vIDw1LDQsNCwyPjogQ29zdCA0IHZzbGRvaTggPDMsNCw1LDQ+LCA8NCwyLDUsMz4KKyAgMjcxMDYzNzcwNFUsCS8vIDw1LDQsNCwzPjogQ29zdCAzIHZzbGRvaTggPDQsMyw1LDQ+LCA8NCwzLDUsND4KKyAgMjc1NDIzNTYwMFUsCS8vIDw1LDQsNCw0PjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDQsNCw0LDQ+CisgIDE3MDQ2NzY1NzBVLAkvLyA8NSw0LDQsNT46IENvc3QgMiB2c2xkb2kxMiA8NCw0LDUsNT4sIDw0LDQsNSw1PgorICAzNzc5MDcxMzU4VSwJLy8gPDUsNCw0LDY+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDUsND4sIDw0LDYsNSw3PgorICAyNzEzMjkyMjM2VSwJLy8gPDUsNCw0LDc+OiBDb3N0IDMgdnNsZG9pOCA8NCw3LDUsND4sIDw0LDcsNSw0PgorICAxNzA0ODk3NzgxVSwJLy8gPDUsNCw0LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDQsNCx1LDU+LCA8NCw0LHUsNT4KKyAgMjYyNjg3MTM5OFUsCS8vIDw1LDQsNSwwPjogQ29zdCAzIHZzbGRvaTQgPDEsNSw0LDU+LCBMSFMKKyAgMjYyNjg3MjQ3MVUsCS8vIDw1LDQsNSwxPjogQ29zdCAzIHZzbGRvaTQgPDEsNSw0LDU+LCA8MSw1LDQsNT4KKyAgMjc2NTczNzIzMFUsCS8vIDw1LDQsNSwyPjogQ29zdCAzIHZzbGRvaTEyIDwyLDMsNCw1PiwgPDQsNSwyLDM+CisgIDM3MDA2MTUzMThVLAkvLyA8NSw0LDUsMz46IENvc3QgNCB2c2xkb2k0IDwxLDUsNCw1PiwgPDMsMCwxLDI+CisgIDI2MjY4NzQ2NzhVLAkvLyA8NSw0LDUsND46IENvc3QgMyB2c2xkb2k0IDwxLDUsNCw1PiwgUkhTCisgIDExNzQ0NDEyNzBVLAkvLyA8NSw0LDUsNT46IENvc3QgMiB2bXJnaHcgPDUsNSw1LDU+LCBSSFMKKyAgMTY4MDQ5Mzg3OFUsCS8vIDw1LDQsNSw2PjogQ29zdCAyIHZzbGRvaTEyIDwwLDQsMSw1PiwgUkhTCisgIDMzODUwNTE4MDRVLAkvLyA8NSw0LDUsNz46IENvc3QgNCB2bXJnbHcgPDQsdSw1LDU+LCA8Myw2LDQsNz4KKyAgMTY4MDQ5Mzg5NlUsCS8vIDw1LDQsNSx1PjogQ29zdCAyIHZzbGRvaTEyIDwwLDQsMSw1PiwgUkhTCisgIDIyNDg5NTI3MjJVLAkvLyA8NSw0LDYsMD46IENvc3QgMyB2bXJnaHcgPDUsNiw3LDA+LCA8NCwwLDUsMT4KKyAgMjMwMjY5MjE1MlUsCS8vIDw1LDQsNiwxPjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsNj4sIDwzLHUsNCwxPgorICAzMzgyNDA2MTA3VSwJLy8gPDUsNCw2LDI+OiBDb3N0IDQgdm1yZ2x3IDw0LDQsNSw2PiwgPDQsMSw0LDI+CisgIDM3MDA2MjM4NzRVLAkvLyA8NSw0LDYsMz46IENvc3QgNCB2c2xkb2k0IDwxLDUsNCw2PiwgPDMsNCw1LDY+CisgIDIyNDg5NTMwNDBVLAkvLyA8NSw0LDYsND46IENvc3QgMyB2bXJnaHcgPDUsNiw3LDA+LCA8NCw0LDQsND4KKyAgMTE3NTIxMTMxOFUsCS8vIDw1LDQsNiw1PjogQ29zdCAyIHZtcmdodyA8NSw2LDcsMD4sIFJIUworICAzMzc2NDMyMjgwVSwJLy8gPDUsNCw2LDY+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsNSw2PiwgPDEsNSw0LDY+CisgIDI3MjkyMTg5MzRVLAkvLyA8NSw0LDYsNz46IENvc3QgMyB2c2xkb2k4IDw3LDQsNSw0PiwgPDYsNyw0LDU+CisgIDExNzUyMTE1NjFVLAkvLyA8NSw0LDYsdT46IENvc3QgMiB2bXJnaHcgPDUsNiw3LDA+LCBSSFMKKyAgMzc4NzAzNTY0MlUsCS8vIDw1LDQsNywwPjogQ29zdCA0IHZzbGRvaTggPDQsNyw1LDQ+LCA8NywwLDEsMj4KKyAgMzM2NTgyMjUwMVUsCS8vIDw1LDQsNywxPjogQ29zdCA0IHZtcmdsdyA8MSw2LDUsNz4sIDwwLDAsNCwxPgorICAzODA4OTMzMDg1VSwJLy8gPDUsNCw3LDI+OiBDb3N0IDQgdnNsZG9pOCA8dSw0LDUsND4sIDw3LDIsdSw0PgorICAzNzg0MzgxNzA3VSwJLy8gPDUsNCw3LDM+OiBDb3N0IDQgdnNsZG9pOCA8NCwzLDUsND4sIDw3LDMsNCw1PgorICAyNzEzMjk0MTgyVSwJLy8gPDUsNCw3LDQ+OiBDb3N0IDMgdnNsZG9pOCA8NCw3LDUsND4sIDw3LDQsNSw2PgorICAyMzA5OTk4Mjg2VSwJLy8gPDUsNCw3LDU+OiBDb3N0IDMgdm1yZ2x3IDw0LDYsNSw3PiwgPDIsMyw0LDU+CisgIDMzODM3NDAxMTFVLAkvLyA8NSw0LDcsNj46IENvc3QgNCB2bXJnbHcgPDQsNiw1LDc+LCA8MiwzLDQsNj4KKyAgMzc4NzAzNjIzOVUsCS8vIDw1LDQsNyw3PjogQ29zdCA0IHZzbGRvaTggPDQsNyw1LDQ+LCA8Nyw3LDQsNT4KKyAgMjczMTg3Mzk2MFUsCS8vIDw1LDQsNyx1PjogQ29zdCAzIHZzbGRvaTggPDcsdSw1LDQ+LCA8Nyx1LDUsND4KKyAgMjYyNjg5NTk3NFUsCS8vIDw1LDQsdSwwPjogQ29zdCAzIHZzbGRvaTQgPDEsNSw0LHU+LCBMSFMKKyAgMjYyNjg5NzA1MFUsCS8vIDw1LDQsdSwxPjogQ29zdCAzIHZzbGRvaTQgPDEsNSw0LHU+LCA8MSw1LDQsdT4KKyAgMjY0NDgxMzUxOFUsCS8vIDw1LDQsdSwyPjogQ29zdCAzIHZzbGRvaTQgPDQsNSw0LHU+LCA8MiwzLDQsNT4KKyAgMjcwNTMyNzgyMlUsCS8vIDw1LDQsdSwzPjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDQ+LCA8MiwzLDQsNT4KKyAgMjYyNjg5OTI1NFUsCS8vIDw1LDQsdSw0PjogQ29zdCAzIHZzbGRvaTQgPDEsNSw0LHU+LCBSSFMKKyAgMTcwNzMzMTEwMlUsCS8vIDw1LDQsdSw1PjogQ29zdCAyIHZzbGRvaTEyIDw0LHUsNSw1PiwgPDQsdSw1LDU+CisgIDE2ODA0OTQxMjFVLAkvLyA8NSw0LHUsNj46IENvc3QgMiB2c2xkb2kxMiA8MCw0LDEsNT4sIFJIUworICAyNzM3MTgzMDI0VSwJLy8gPDUsNCx1LDc+OiBDb3N0IDMgdnNsZG9pOCA8dSw3LDUsND4sIDx1LDcsNSw0PgorICAxNjgwNDk0MTM5VSwJLy8gPDUsNCx1LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDAsNCwxLDU+LCBSSFMKKyAgMjMwMjY0MjY4NFUsCS8vIDw1LDUsMCwwPjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsMD4sIDwzLDQsNSwwPgorICAxNjQwMjE4NzI2VSwJLy8gPDUsNSwwLDE+OiBDb3N0IDIgdnNsZG9pOCA8NCx1LDUsNT4sIExIUworICAzMzc2Mzg0NTEwVSwJLy8gPDUsNSwwLDI+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsNSwwPiwgPDMsNCw1LDI+CisgIDMzNzYzODUwNzhVLAkvLyA8NSw1LDAsMz46IENvc3QgNCB2bXJnbHcgPDMsNCw1LDA+LCA8NCwyLDUsMz4KKyAgMjc1NDIzNjAwMlUsCS8vIDw1LDUsMCw0PjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPDUsMCw0LDE+CisgIDI3MTc5NDIyNDJVLAkvLyA8NSw1LDAsNT46IENvc3QgMyB2c2xkb2k4IDw1LDUsNSw1PiwgPDAsNSx1LDU+CisgIDIyNDQ5MDcxMDZVLAkvLyA8NSw1LDAsNj46IENvc3QgMyB2bXJnaHcgPDUsMCw2LDE+LCA8NSw2LDcsMD4KKyAgMzM3NjM4NTQwNlUsCS8vIDw1LDUsMCw3PjogQ29zdCA0IHZtcmdsdyA8Myw0LDUsMD4sIDw0LDYsNSw3PgorICAxNjQwMjE5MjkzVSwJLy8gPDUsNSwwLHU+OiBDb3N0IDIgdnNsZG9pOCA8NCx1LDUsNT4sIExIUworICAyMzA1OTY5MzY1VSwJLy8gPDUsNSwxLDA+OiBDb3N0IDMgdm1yZ2x3IDw0LDAsNSwxPiwgPDQsNCw1LDA+CisgIDEyMzc1MzYyODJVLAkvLyA8NSw1LDEsMT46IENvc3QgMiB2bXJnbHcgPDQsdSw1LDE+LCA8NCx1LDUsMT4KKyAgMjcxMzk2MTM2NlUsCS8vIDw1LDUsMSwyPjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDU+LCA8MSwyLDMsMD4KKyAgMzc2NjQ2OTYzMFUsCS8vIDw1LDUsMSwzPjogQ29zdCA0IHZzbGRvaTggPDEsMyw1LDU+LCA8MSwzLDUsNT4KKyAgMjc4MjMyNjQ1NVUsCS8vIDw1LDUsMSw0PjogQ29zdCAzIHZzbGRvaTEyIDw1LDEsNCw1PiwgPDUsMSw0LDU+CisgIDIzMTEyNzc3ODZVLAkvLyA8NSw1LDEsNT46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDE+LCA8NCw0LDUsNT4KKyAgMjMxMTI3NzA1OFUsCS8vIDw1LDUsMSw2PjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsMT4sIDwzLDQsNSw2PgorICAzMzg1MDE3NTg3VSwJLy8gPDUsNSwxLDc+OiBDb3N0IDQgdm1yZ2x3IDw0LHUsNSwxPiwgPDEsNiw1LDc+CisgIDEyMzc1MzYyODJVLAkvLyA8NSw1LDEsdT46IENvc3QgMiB2bXJnbHcgPDQsdSw1LDE+LCA8NCx1LDUsMT4KKyAgMzM3NjQwMDg5MlUsCS8vIDw1LDUsMiwwPjogQ29zdCA0IHZtcmdsdyA8Myw0LDUsMj4sIDwzLDQsNSwwPgorICAzODI3OTc3OTYzVSwJLy8gPDUsNSwyLDE+OiBDb3N0IDQgdnNsZG9pMTIgPDAsNCwxLDU+LCA8NSwyLDEsMz4KKyAgMjMwMjY1OTA3MFUsCS8vIDw1LDUsMiwyPjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsMj4sIDwzLDQsNSwyPgorICAyNzY1NzM3NzI2VSwJLy8gPDUsNSwyLDM+OiBDb3N0IDMgdnNsZG9pMTIgPDIsMyw0LDU+LCA8NSwyLDMsND4KKyAgMzgzOTQ3OTU1OFUsCS8vIDw1LDUsMiw0PjogQ29zdCA0IHZzbGRvaTEyIDwyLDMsNCw1PiwgPDUsMiw0LDM+CisgIDI3ODEwNzMxNjdVLAkvLyA8NSw1LDIsNT46IENvc3QgMyB2c2xkb2kxMiA8NCx1LDUsNT4sIDw1LDIsNSwzPgorICAyNzEzOTYyNDI2VSwJLy8gPDUsNSwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsNT4sIDwyLDYsMyw3PgorICAzMzc2NDAxNzkwVSwJLy8gPDUsNSwyLDc+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsNSwyPiwgPDQsNiw1LDc+CisgIDI3NjkwNTU1MzFVLAkvLyA8NSw1LDIsdT46IENvc3QgMyB2c2xkb2kxMiA8Mix1LDQsNT4sIDw1LDIsdSw0PgorICAyNzEzOTYyNjQ2VSwJLy8gPDUsNSwzLDA+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsNT4sIDwzLDAsMSwyPgorICAzNzY1MTQzNzg2VSwJLy8gPDUsNSwzLDE+OiBDb3N0IDQgdnNsZG9pOCA8MSwxLDUsNT4sIDwzLDEsMSw1PgorICAzODM5NDc5NjIxVSwJLy8gPDUsNSwzLDI+OiBDb3N0IDQgdnNsZG9pMTIgPDIsMyw0LDU+LCA8NSwzLDIsMz4KKyAgMjI4OTM5NDYwM1UsCS8vIDw1LDUsMywzPjogQ29zdCAzIHZtcmdsdyA8MSwyLDUsMz4sIDwxLDIsNSwzPgorICAyNzEzOTYzMDEwVSwJLy8gPDUsNSwzLDQ+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsNT4sIDwzLDQsNSw2PgorICAyMzEzMjg1MTUwVSwJLy8gPDUsNSwzLDU+OiBDb3N0IDMgdm1yZ2x3IDw1LDIsNSwzPiwgPDQsdSw1LDU+CisgIDMzNjMxMzgwNTBVLAkvLyA8NSw1LDMsNj46IENvc3QgNCB2bXJnbHcgPDEsMiw1LDM+LCA8Myw0LDUsNj4KKyAgMzM2MzEzNjc1NVUsCS8vIDw1LDUsMyw3PjogQ29zdCA0IHZtcmdsdyA8MSwyLDUsMz4sIDwxLDYsNSw3PgorICAyNzEzOTYzMjk0VSwJLy8gPDUsNSwzLHU+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsNT4sIDwzLHUsMSwyPgorICAyNzEzOTYzNDEwVSwJLy8gPDUsNSw0LDA+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsNT4sIDw0LDAsNSwxPgorICAzODI3OTc4MTI3VSwJLy8gPDUsNSw0LDE+OiBDb3N0IDQgdnNsZG9pMTIgPDAsNCwxLDU+LCA8NSw0LDEsNT4KKyAgMzgzOTQ3OTcwNFUsCS8vIDw1LDUsNCwyPjogQ29zdCA0IHZzbGRvaTEyIDwyLDMsNCw1PiwgPDUsNCwyLDU+CisgIDMzNzY0MTc4NDZVLAkvLyA8NSw1LDQsMz46IENvc3QgNCB2bXJnbHcgPDMsNCw1LDQ+LCA8NCwyLDUsMz4KKyAgMTYzNzU2NzcwNlUsCS8vIDw1LDUsNCw0PjogQ29zdCAyIHZzbGRvaTggPDQsNCw1LDU+LCA8NCw0LDUsNT4KKyAgMTY0MDIyMjAwNlUsCS8vIDw1LDUsNCw1PjogQ29zdCAyIHZzbGRvaTggPDQsdSw1LDU+LCBSSFMKKyAgMjMxMDY0MDk5OFUsCS8vIDw1LDUsNCw2PjogQ29zdCAzIHZtcmdsdyA8NCw3LDUsND4sIDw3LDQsNSw2PgorICAzMzc2NDE4MTc0VSwJLy8gPDUsNSw0LDc+OiBDb3N0IDQgdm1yZ2x3IDwzLDQsNSw0PiwgPDQsNiw1LDc+CisgIDE2NDAyMjIyMzhVLAkvLyA8NSw1LDQsdT46IENvc3QgMiB2c2xkb2k4IDw0LHUsNSw1PiwgPDQsdSw1LDU+CisgIDE1NzcwOTExNzRVLAkvLyA8NSw1LDUsMD46IENvc3QgMiB2c2xkb2k0IDw1LDUsNSw1PiwgTEhTCisgIDIzMTEzMTAyMjZVLAkvLyA8NSw1LDUsMT46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDU+LCA8NCwwLDUsMT4KKyAgMjcxMzk2NDMwM1UsCS8vIDw1LDUsNSwyPjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDU+LCA8NSwyLDUsMz4KKyAgMjMxMTMxMTExOVUsCS8vIDw1LDUsNSwzPjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsNT4sIDw1LDIsNSwzPgorICAxNTc3MDk0NDU0VSwJLy8gPDUsNSw1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8NSw1LDUsNT4sIFJIUworICAyOTYxNDQxODJVLAkvLyA8NSw1LDUsNT46IENvc3QgMSB2c3BsdGlzdzEgUkhTCisgIDIzMTEzMDk4MjZVLAkvLyA8NSw1LDUsNj46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDU+LCA8Myw0LDUsNj4KKyAgMjMxMTMxMTQ0N1UsCS8vIDw1LDUsNSw3PjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsNT4sIDw1LDYsNSw3PgorICAyOTYxNDQxODJVLAkvLyA8NSw1LDUsdT46IENvc3QgMSB2c3BsdGlzdzEgUkhTCisgIDIyNDg5NTM0NjBVLAkvLyA8NSw1LDYsMD46IENvc3QgMyB2bXJnaHcgPDUsNiw3LDA+LCA8NSwwLDYsMT4KKyAgMjMyNjU4MDExNFUsCS8vIDw1LDUsNiwxPjogQ29zdCAzIHZtcmdsdyA8Nyw0LDUsNj4sIDw0LDAsNSwxPgorICAyNzEzOTY1MDUwVSwJLy8gPDUsNSw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsNT4sIDw2LDIsNywzPgorICAzNzAwNjk3NjAyVSwJLy8gPDUsNSw2LDM+OiBDb3N0IDQgdnNsZG9pNCA8MSw1LDUsNj4sIDwzLDQsNSw2PgorICAyNzg1NjQ0NjIwVSwJLy8gPDUsNSw2LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw0LDU+LCA8NSw2LDQsNT4KKyAgMjc4MTA3MzQ5NVUsCS8vIDw1LDUsNiw1PjogQ29zdCAzIHZzbGRvaTEyIDw0LHUsNSw1PiwgPDUsNiw1LDc+CisgIDEyMjg5NTAwMThVLAkvLyA8NSw1LDYsNj46IENvc3QgMiB2bXJnbHcgPDMsNCw1LDY+LCA8Myw0LDUsNj4KKyAgMjcxMzk2NTM5MFUsCS8vIDw1LDUsNiw3PjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDU+LCA8Niw3LDAsMT4KKyAgMTIyODk1MDAxOFUsCS8vIDw1LDUsNix1PjogQ29zdCAyIHZtcmdsdyA8Myw0LDUsNj4sIDwzLDQsNSw2PgorICAyNzEzOTY1NTYyVSwJLy8gPDUsNSw3LDA+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsNT4sIDw3LDAsMSwyPgorICAzMzgzNzQxMzMwVSwJLy8gPDUsNSw3LDE+OiBDb3N0IDQgdm1yZ2x3IDw0LDYsNSw3PiwgPDQsMCw1LDE+CisgIDM3MTg2MjA4NzhVLAkvLyA8NSw1LDcsMj46IENvc3QgNCB2c2xkb2k0IDw0LDUsNSw3PiwgPDIsMyw0LDU+CisgIDMzNjU4MjM0MDNVLAkvLyA8NSw1LDcsMz46IENvc3QgNCB2bXJnbHcgPDEsNiw1LDc+LCA8MSwyLDUsMz4KKyAgMjcxMzk2NTkyNlUsCS8vIDw1LDUsNyw0PjogQ29zdCAzIHZzbGRvaTggPDQsdSw1LDU+LCA8Nyw0LDUsNj4KKyAgMjcxNzk0NzMxOFUsCS8vIDw1LDUsNyw1PjogQ29zdCAzIHZzbGRvaTggPDUsNSw1LDU+LCA8Nyw1LDUsNT4KKyAgMzM2NTgyNTAyNlUsCS8vIDw1LDUsNyw2PjogQ29zdCA0IHZtcmdsdyA8MSw2LDUsNz4sIDwzLDQsNSw2PgorICAyMjkyMDgxOTA3VSwJLy8gPDUsNSw3LDc+OiBDb3N0IDMgdm1yZ2x3IDwxLDYsNSw3PiwgPDEsNiw1LDc+CisgIDI3MTM5NjYyMTBVLAkvLyA8NSw1LDcsdT46IENvc3QgMyB2c2xkb2k4IDw0LHUsNSw1PiwgPDcsdSwxLDI+CisgIDE1NzcwOTExNzRVLAkvLyA8NSw1LHUsMD46IENvc3QgMiB2c2xkb2k0IDw1LDUsNSw1PiwgTEhTCisgIDE2NDAyMjQ1NThVLAkvLyA8NSw1LHUsMT46IENvc3QgMiB2c2xkb2k4IDw0LHUsNSw1PiwgTEhTCisgIDI3MTM5NjY0NjlVLAkvLyA8NSw1LHUsMj46IENvc3QgMyB2c2xkb2k4IDw0LHUsNSw1PiwgPHUsMiwzLDA+CisgIDI3MTM5NjY1MjRVLAkvLyA8NSw1LHUsMz46IENvc3QgMyB2c2xkb2k4IDw0LHUsNSw1PiwgPHUsMywwLDE+CisgIDE1NzcwOTQ0NTRVLAkvLyA8NSw1LHUsND46IENvc3QgMiB2c2xkb2k0IDw1LDUsNSw1PiwgUkhTCisgIDI5NjE0NDE4MlUsCS8vIDw1LDUsdSw1PjogQ29zdCAxIHZzcGx0aXN3MSBSSFMKKyAgMTIyODk1MDAxOFUsCS8vIDw1LDUsdSw2PjogQ29zdCAyIHZtcmdsdyA8Myw0LDUsNj4sIDwzLDQsNSw2PgorICAyNzEzOTY2ODQ4VSwJLy8gPDUsNSx1LDc+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LDUsNT4sIDx1LDcsMCwxPgorICAyOTYxNDQxODJVLAkvLyA8NSw1LHUsdT46IENvc3QgMSB2c3BsdGlzdzEgUkhTCisgIDI3MDUzNDI0NjRVLAkvLyA8NSw2LDAsMD46IENvc3QgMyB2c2xkb2k4IDwzLDQsNSw2PiwgPDAsMCwwLDA+CisgIDE2MzE2MDA3NDJVLAkvLyA8NSw2LDAsMT46IENvc3QgMiB2c2xkb2k4IDwzLDQsNSw2PiwgTEhTCisgIDM3NzMxMTI0OTNVLAkvLyA8NSw2LDAsMj46IENvc3QgNCB2c2xkb2k4IDwyLDQsNSw2PiwgPDAsMiwxLDI+CisgIDI3MDUzNDI3MjBVLAkvLyA8NSw2LDAsMz46IENvc3QgMyB2c2xkb2k4IDwzLDQsNSw2PiwgPDAsMywxLDQ+CisgIDI3MDUzNDI4MDJVLAkvLyA8NSw2LDAsND46IENvc3QgMyB2c2xkb2k4IDwzLDQsNSw2PiwgPDAsNCwxLDU+CisgIDM3NzkwODQ3MDhVLAkvLyA8NSw2LDAsNT46IENvc3QgNCB2c2xkb2k4IDwzLDQsNSw2PiwgPDAsNSwxLDY+CisgIDM3NzkwODQ3OTBVLAkvLyA8NSw2LDAsNj46IENvc3QgNCB2c2xkb2k4IDwzLDQsNSw2PiwgPDAsNiwxLDc+CisgIDIzMDI2NDM1MTBVLAkvLyA8NSw2LDAsNz46IENvc3QgMyB2bXJnbHcgPDMsNCw1LDA+LCBSSFMKKyAgMTYzMTYwMTMwOVUsCS8vIDw1LDYsMCx1PjogQ29zdCAyIHZzbGRvaTggPDMsNCw1LDY+LCBMSFMKKyAgMzc2NzE0MTA5MlUsCS8vIDw1LDYsMSwwPjogQ29zdCA0IHZzbGRvaTggPDEsNCw1LDY+LCA8MSwwLDEsMj4KKyAgMjcwNTM0MzI4NFUsCS8vIDw1LDYsMSwxPjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDY+LCA8MSwxLDEsMT4KKyAgMjcwNTM0MzM4MlUsCS8vIDw1LDYsMSwyPjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDY+LCA8MSwyLDMsMD4KKyAgMzc3OTA4NTI4MlUsCS8vIDw1LDYsMSwzPjogQ29zdCA0IHZzbGRvaTggPDMsNCw1LDY+LCA8MSwzLDIsND4KKyAgMjY5MzM5OTYzMlUsCS8vIDw1LDYsMSw0PjogQ29zdCAzIHZzbGRvaTggPDEsNCw1LDY+LCA8MSw0LDUsNj4KKyAgMzc2NzgwNTA4OVUsCS8vIDw1LDYsMSw1PjogQ29zdCA0IHZzbGRvaTggPDEsNSw1LDY+LCA8MSw1LDUsNj4KKyAgMjMxMTI3OTQxNlUsCS8vIDw1LDYsMSw2PjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsMT4sIDw2LDYsNiw2PgorICAxMjM3NTM2MDU0VSwJLy8gPDUsNiwxLDc+OiBDb3N0IDIgdm1yZ2x3IDw0LHUsNSwxPiwgUkhTCisgIDEyMzc1MzYwNTVVLAkvLyA8NSw2LDEsdT46IENvc3QgMiB2bXJnbHcgPDQsdSw1LDE+LCBSSFMKKyAgMzc3MzExMzc4OVUsCS8vIDw1LDYsMiwwPjogQ29zdCA0IHZzbGRvaTggPDIsNCw1LDY+LCA8MiwwLDEsMj4KKyAgMzc3OTA4NTg1NVUsCS8vIDw1LDYsMiwxPjogQ29zdCA0IHZzbGRvaTggPDMsNCw1LDY+LCA8MiwxLDMsMT4KKyAgMjY5OTM3MjEzNlUsCS8vIDw1LDYsMiwyPjogQ29zdCAzIHZzbGRvaTggPDIsNCw1LDY+LCA8MiwyLDIsMj4KKyAgMjcwNTM0NDE2NlUsCS8vIDw1LDYsMiwzPjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDY+LCA8MiwzLDAsMT4KKyAgMjY5OTM3MjMyOVUsCS8vIDw1LDYsMiw0PjogQ29zdCAzIHZzbGRvaTggPDIsNCw1LDY+LCA8Miw0LDUsNj4KKyAgMjcwNTM0NDM2MFUsCS8vIDw1LDYsMiw1PjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDY+LCA8Miw1LDMsNj4KKyAgMjcwNTM0NDQ0MlUsCS8vIDw1LDYsMiw2PjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDY+LCA8Miw2LDMsNz4KKyAgMjMwMjY1OTg5NFUsCS8vIDw1LDYsMiw3PjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsMj4sIFJIUworICAyNzAyMDI2ODYxVSwJLy8gPDUsNiwyLHU+OiBDb3N0IDMgdnNsZG9pOCA8Mix1LDUsNj4sIDwyLHUsNSw2PgorICAyNzA1MzQ0NjYyVSwJLy8gPDUsNiwzLDA+OiBDb3N0IDMgdnNsZG9pOCA8Myw0LDUsNj4sIDwzLDAsMSwyPgorICAzNzY3MTQyNjYxVSwJLy8gPDUsNiwzLDE+OiBDb3N0IDQgdnNsZG9pOCA8MSw0LDUsNj4sIDwzLDEsNCw1PgorICAzNzczMTE0Njg5VSwJLy8gPDUsNiwzLDI+OiBDb3N0IDQgdnNsZG9pOCA8Miw0LDUsNj4sIDwzLDIsMiwyPgorICAyNzA1MzQ0OTI0VSwJLy8gPDUsNiwzLDM+OiBDb3N0IDMgdnNsZG9pOCA8Myw0LDUsNj4sIDwzLDMsMywzPgorICAxNjMxNjAzMjAyVSwJLy8gPDUsNiwzLDQ+OiBDb3N0IDIgdnNsZG9pOCA8Myw0LDUsNj4sIDwzLDQsNSw2PgorICAzODQyOTQ1NTk3VSwJLy8gPDUsNiwzLDU+OiBDb3N0IDQgdnNsZG9pMTIgPDIsdSw2LDU+LCA8NiwzLDUsNz4KKyAgMzc3OTA4Njk2MlUsCS8vIDw1LDYsMyw2PjogQ29zdCA0IHZzbGRvaTggPDMsNCw1LDY+LCA8Myw2LDAsMT4KKyAgMjI4OTM5NzA0NlUsCS8vIDw1LDYsMyw3PjogQ29zdCAzIHZtcmdsdyA8MSwyLDUsMz4sIFJIUworICAxNjM0MjU3NzM0VSwJLy8gPDUsNiwzLHU+OiBDb3N0IDIgdnNsZG9pOCA8Myx1LDUsNj4sIDwzLHUsNSw2PgorICAyNjQ0OTI2NTY2VSwJLy8gPDUsNiw0LDA+OiBDb3N0IDMgdnNsZG9pNCA8NCw1LDYsND4sIExIUworICAzNzc5MDg3MzA2VSwJLy8gPDUsNiw0LDE+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDUsNj4sIDw0LDEsMiwzPgorICAyNzkwMTQyNTc3VSwJLy8gPDUsNiw0LDI+OiBDb3N0IDMgdnNsZG9pMTIgPDYsNCwyLDU+LCA8Niw0LDIsNT4KKyAgMjY0NDkyOTAyNlUsCS8vIDw1LDYsNCwzPjogQ29zdCAzIHZzbGRvaTQgPDQsNSw2LDQ+LCA8Myw0LDUsNj4KKyAgMjcxMTMxNzcyM1UsCS8vIDw1LDYsNCw0PjogQ29zdCAzIHZzbGRvaTggPDQsNCw1LDY+LCA8NCw0LDUsNj4KKyAgMTYzMTYwNDAyMlUsCS8vIDw1LDYsNCw1PjogQ29zdCAyIHZzbGRvaTggPDMsNCw1LDY+LCBSSFMKKyAgMjcxMjY0NDk4OVUsCS8vIDw1LDYsNCw2PjogQ29zdCAzIHZzbGRvaTggPDQsNiw1LDY+LCA8NCw2LDUsNj4KKyAgMjMwMjY3NjI3OFUsCS8vIDw1LDYsNCw3PjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsND4sIFJIUworICAxNjMxNjA0MjY1VSwJLy8gPDUsNiw0LHU+OiBDb3N0IDIgdnNsZG9pOCA8Myw0LDUsNj4sIFJIUworICAzODQyOTQ1NzA4VSwJLy8gPDUsNiw1LDA+OiBDb3N0IDQgdnNsZG9pMTIgPDIsdSw2LDU+LCA8Niw1LDAsMT4KKyAgMzc2NzE0NDEzM1UsCS8vIDw1LDYsNSwxPjogQ29zdCA0IHZzbGRvaTggPDEsNCw1LDY+LCA8NSwxLDYsMT4KKyAgMjcwNTM0NjMyOFUsCS8vIDw1LDYsNSwyPjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDY+LCA8NSwyLDYsMz4KKyAgMzc3OTA4ODIwN1UsCS8vIDw1LDYsNSwzPjogQ29zdCA0IHZzbGRvaTggPDMsNCw1LDY+LCA8NSwzLDMsND4KKyAgMjcxNzI5MDQyMFUsCS8vIDw1LDYsNSw0PjogQ29zdCAzIHZzbGRvaTggPDUsNCw1LDY+LCA8NSw0LDUsNj4KKyAgMjcwNTM0NjU3NFUsCS8vIDw1LDYsNSw1PjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDY+LCA8NSw1LDYsNj4KKyAgMjcwNTM0NjU5NlUsCS8vIDw1LDYsNSw2PjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LDY+LCA8NSw2LDAsMT4KKyAgMTIzNzU2ODgyMlUsCS8vIDw1LDYsNSw3PjogQ29zdCAyIHZtcmdsdyA8NCx1LDUsNT4sIFJIUworICAxMjM3NTY4ODIzVSwJLy8gPDUsNiw1LHU+OiBDb3N0IDIgdm1yZ2x3IDw0LHUsNSw1PiwgUkhTCisgIDI2NTA5MTQ5MThVLAkvLyA8NSw2LDYsMD46IENvc3QgMyB2c2xkb2k0IDw1LDUsNiw2PiwgTEhTCisgIDMzNjQ0OTA5NDlVLAkvLyA8NSw2LDYsMT46IENvc3QgNCB2bXJnbHcgPDEsNCw1LDY+LCA8NSwxLDYsMT4KKyAgMjI0ODk1NDM2MlUsCS8vIDw1LDYsNiwyPjogQ29zdCAzIHZtcmdodyA8NSw2LDcsMD4sIDw2LDIsNywzPgorICAyMzAyNjkzMTQ0VSwJLy8gPDUsNiw2LDM+OiBDb3N0IDMgdm1yZ2x3IDwzLDQsNSw2PiwgPDUsMiw2LDM+CisgIDI2NTA5MTgxOThVLAkvLyA8NSw2LDYsND46IENvc3QgMyB2c2xkb2k0IDw1LDUsNiw2PiwgUkhTCisgIDI2NTA5MTg5MjZVLAkvLyA8NSw2LDYsNT46IENvc3QgMyB2c2xkb2k0IDw1LDUsNiw2PiwgPDUsNSw2LDY+CisgIDIzMDI2OTMzOTBVLAkvLyA8NSw2LDYsNj46IENvc3QgMyB2bXJnbHcgPDMsNCw1LDY+LCA8NSw1LDYsNj4KKyAgMTIyODk1MDgzOFUsCS8vIDw1LDYsNiw3PjogQ29zdCAyIHZtcmdsdyA8Myw0LDUsNj4sIFJIUworICAxMjI4OTUwODM5VSwJLy8gPDUsNiw2LHU+OiBDb3N0IDIgdm1yZ2x3IDwzLDQsNSw2PiwgUkhTCisgIDQ5NzQ2NzQ5NFUsCS8vIDw1LDYsNywwPjogQ29zdCAxIHZzbGRvaTQgUkhTLCBMSFMKKyAgMTU3MTIxMDAzNlUsCS8vIDw1LDYsNywxPjogQ29zdCAyIHZzbGRvaTQgUkhTLCA8MSwxLDEsMT4KKyAgMTU3MTIxMDg1NlUsCS8vIDw1LDYsNywyPjogQ29zdCAyIHZzbGRvaTQgUkhTLCA8MiwyLDIsMj4KKyAgMTU3MTIxMTQxNFUsCS8vIDw1LDYsNywzPjogQ29zdCAyIHZzbGRvaTQgUkhTLCA8MywwLDEsMj4KKyAgNDk3NDcwNzc0VSwJLy8gPDUsNiw3LDQ+OiBDb3N0IDEgdnNsZG9pNCBSSFMsIFJIUworICAxNTcxMjEzMzE2VSwJLy8gPDUsNiw3LDU+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDw1LDUsNSw1PgorICAxNTcxMjEzODE4VSwJLy8gPDUsNiw3LDY+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDw2LDIsNywzPgorICAxNTcxMjE0OTU2VSwJLy8gPDUsNiw3LDc+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDw3LDcsNyw3PgorICA0OTc0NzMzMjZVLAkvLyA8NSw2LDcsdT46IENvc3QgMSB2c2xkb2k0IFJIUywgTEhTCisgIDQ5NzQ3NTY4NlUsCS8vIDw1LDYsdSwwPjogQ29zdCAxIHZzbGRvaTQgUkhTLCBMSFMKKyAgMTYzMTYwNjU3NFUsCS8vIDw1LDYsdSwxPjogQ29zdCAyIHZzbGRvaTggPDMsNCw1LDY+LCBMSFMKKyAgMTU3MTIxOTA0OFUsCS8vIDw1LDYsdSwyPjogQ29zdCAyIHZzbGRvaTQgUkhTLCA8MiwyLDIsMj4KKyAgMTU3MTIxOTYwNlUsCS8vIDw1LDYsdSwzPjogQ29zdCAyIHZzbGRvaTQgUkhTLCA8MywwLDEsMj4KKyAgNDk3NDc4OTY3VSwJLy8gPDUsNix1LDQ+OiBDb3N0IDEgdnNsZG9pNCBSSFMsIFJIUworICAxNjMxNjA2OTM4VSwJLy8gPDUsNix1LDU+OiBDb3N0IDIgdnNsZG9pOCA8Myw0LDUsNj4sIFJIUworICAxNTcxMjIyMDEwVSwJLy8gPDUsNix1LDY+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDw2LDIsNywzPgorICAxMjI4OTY3MjIyVSwJLy8gPDUsNix1LDc+OiBDb3N0IDIgdm1yZ2x3IDwzLDQsNSx1PiwgUkhTCisgIDQ5NzQ4MTUxOFUsCS8vIDw1LDYsdSx1PjogQ29zdCAxIHZzbGRvaTQgUkhTLCBMSFMKKyAgMzc2ODQ3NTY0OFUsCS8vIDw1LDcsMCwwPjogQ29zdCA0IHZzbGRvaTggPDEsNiw1LDc+LCA8MCwwLDAsMD4KKyAgMjY5NDczMzkyNlUsCS8vIDw1LDcsMCwxPjogQ29zdCAzIHZzbGRvaTggPDEsNiw1LDc+LCBMSFMKKyAgMzcxODcxMTM5NVUsCS8vIDw1LDcsMCwyPjogQ29zdCA0IHZzbGRvaTQgPDQsNSw3LDA+LCA8Mix1LDQsNT4KKyAgMzM4NDM0OTE3OFUsCS8vIDw1LDcsMCwzPjogQ29zdCA0IHZtcmdsdyA8NCw3LDUsMD4sIDw2LDIsNywzPgorICAyNjk0NzM0MTYyVSwJLy8gPDUsNywwLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MSw2LDUsNz4sIDwwLDQsMSw1PgorICAzMzg0MzQ3ODg0VSwJLy8gPDUsNywwLDU+OiBDb3N0IDQgdm1yZ2x3IDw0LDcsNSwwPiwgPDQsNCw3LDU+CisgIDM3MzA2NTgwMjZVLAkvLyA8NSw3LDAsNj46IENvc3QgNCB2c2xkb2k0IDw2LDUsNywwPiwgPDYsNSw3LDA+CisgIDM3MTg3MTQzNjJVLAkvLyA8NSw3LDAsNz46IENvc3QgNCB2c2xkb2k0IDw0LDUsNywwPiwgPDcsMCwxLDI+CisgIDI2OTQ3MzQ0OTNVLAkvLyA8NSw3LDAsdT46IENvc3QgMyB2c2xkb2k4IDwxLDYsNSw3PiwgTEhTCisgIDIzMTEyNzg2OTBVLAkvLyA8NSw3LDEsMD46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDE+LCA8NSw2LDcsMD4KKyAgMjMwNTk3MDkyM1UsCS8vIDw1LDcsMSwxPjogQ29zdCAzIHZtcmdsdyA8NCwwLDUsMT4sIDw2LDUsNywxPgorICAzNzY4NDc2NTY2VSwJLy8gPDUsNywxLDI+OiBDb3N0IDQgdnNsZG9pOCA8MSw2LDUsNz4sIDwxLDIsMywwPgorICAyMzExMjc5MDk4VSwJLy8gPDUsNywxLDM+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSwxPiwgPDYsMiw3LDM+CisgIDIzMTEyNzg2OTRVLAkvLyA8NSw3LDEsND46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDE+LCA8NSw2LDcsND4KKyAgMzc2ODQ3Njc4M1UsCS8vIDw1LDcsMSw1PjogQ29zdCA0IHZzbGRvaTggPDEsNiw1LDc+LCA8MSw1LDAsMT4KKyAgMjY5NDczNTA5MVUsCS8vIDw1LDcsMSw2PjogQ29zdCAzIHZzbGRvaTggPDEsNiw1LDc+LCA8MSw2LDUsNz4KKyAgMjMxMTI3OTQyNlUsCS8vIDw1LDcsMSw3PjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsMT4sIDw2LDYsNyw3PgorICAyNjk2MDYyMzU3VSwJLy8gPDUsNywxLHU+OiBDb3N0IDMgdnNsZG9pOCA8MSx1LDUsNz4sIDwxLHUsNSw3PgorICAzMzgzNzAxNjAyVSwJLy8gPDUsNywyLDA+OiBDb3N0IDQgdm1yZ2x3IDw0LDYsNSwyPiwgPDUsNiw3LDA+CisgIDM3Njg0NzcyMTlVLAkvLyA8NSw3LDIsMT46IENvc3QgNCB2c2xkb2k4IDwxLDYsNSw3PiwgPDIsMSwzLDU+CisgIDM3Njg0NzcyODhVLAkvLyA8NSw3LDIsMj46IENvc3QgNCB2c2xkb2k4IDwxLDYsNSw3PiwgPDIsMiwyLDI+CisgIDIzMDk5NjAxODZVLAkvLyA8NSw3LDIsMz46IENvc3QgMyB2bXJnbHcgPDQsNiw1LDI+LCA8NiwyLDcsMz4KKyAgMzM4MzcwMTYwNlUsCS8vIDw1LDcsMiw0PjogQ29zdCA0IHZtcmdsdyA8NCw2LDUsMj4sIDw1LDYsNyw0PgorICAzNzY4NDc3NTQ1VSwJLy8gPDUsNywyLDU+OiBDb3N0IDQgdnNsZG9pOCA8MSw2LDUsNz4sIDwyLDUsMyw3PgorICAzNzY2NDg2OTcwVSwJLy8gPDUsNywyLDY+OiBDb3N0IDQgdnNsZG9pOCA8MSwzLDUsNz4sIDwyLDYsMyw3PgorICAzMzgzNzAyMzM4VSwJLy8gPDUsNywyLDc+OiBDb3N0IDQgdm1yZ2x3IDw0LDYsNSwyPiwgPDYsNiw3LDc+CisgIDIzMDk5NjAxODZVLAkvLyA8NSw3LDIsdT46IENvc3QgMyB2bXJnbHcgPDQsNiw1LDI+LCA8NiwyLDcsMz4KKyAgMzc2ODQ3Nzg0NlUsCS8vIDw1LDcsMywwPjogQ29zdCA0IHZzbGRvaTggPDEsNiw1LDc+LCA8MywwLDEsMj4KKyAgMzc2ODQ3Nzk3NVUsCS8vIDw1LDcsMywxPjogQ29zdCA0IHZzbGRvaTggPDEsNiw1LDc+LCA8MywxLDYsNT4KKyAgMzc4NjM5MzkzMlUsCS8vIDw1LDcsMywyPjogQ29zdCA0IHZzbGRvaTggPDQsNiw1LDc+LCA8MywyLDMsND4KKyAgMzc2ODQ3ODEwOFUsCS8vIDw1LDcsMywzPjogQ29zdCA0IHZzbGRvaTggPDEsNiw1LDc+LCA8MywzLDMsMz4KKyAgMjc5NTU5OTExNVUsCS8vIDw1LDcsMyw0PjogQ29zdCAzIHZzbGRvaTEyIDw3LDMsNCw1PiwgPDcsMyw0LDU+CisgIDMzODUwMzc0NzBVLAkvLyA8NSw3LDMsNT46IENvc3QgNCB2bXJnbHcgPDQsdSw1LDM+LCA8Niw0LDcsNT4KKyAgMzc4MDQyMjMwOVUsCS8vIDw1LDcsMyw2PjogQ29zdCA0IHZzbGRvaTggPDMsNiw1LDc+LCA8Myw2LDUsNz4KKyAgMzg0ODEwNzMwMVUsCS8vIDw1LDcsMyw3PjogQ29zdCA0IHZzbGRvaTEyIDwzLDcsNCw1PiwgPDcsMyw3LDQ+CisgIDI3OTU4OTQwNjNVLAkvLyA8NSw3LDMsdT46IENvc3QgMyB2c2xkb2kxMiA8NywzLHUsNT4sIDw3LDMsdSw1PgorICAyNzk1OTY3ODAwVSwJLy8gPDUsNyw0LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDcsNCwwLDU+LCA8Nyw0LDAsNT4KKyAgMzc2ODQ3ODY5MFUsCS8vIDw1LDcsNCwxPjogQ29zdCA0IHZzbGRvaTggPDEsNiw1LDc+LCA8NCwxLDUsMD4KKyAgMzcxODc0NDE2M1UsCS8vIDw1LDcsNCwyPjogQ29zdCA0IHZzbGRvaTQgPDQsNSw3LDQ+LCA8Mix1LDQsNT4KKyAgMzc4NDQwNDEwN1UsCS8vIDw1LDcsNCwzPjogQ29zdCA0IHZzbGRvaTggPDQsMyw1LDc+LCA8NCwzLDUsNz4KKyAgMjc5NjI2Mjc0OFUsCS8vIDw1LDcsNCw0PjogQ29zdCAzIHZzbGRvaTEyIDw3LDQsNCw1PiwgPDcsNCw0LDU+CisgIDI2OTQ3MzcyMDZVLAkvLyA8NSw3LDQsNT46IENvc3QgMyB2c2xkb2k4IDwxLDYsNSw3PiwgUkhTCisgIDI3MTI2NTMxODJVLAkvLyA8NSw3LDQsNj46IENvc3QgMyB2c2xkb2k4IDw0LDYsNSw3PiwgPDQsNiw1LDc+CisgIDI3MTMzMTY4MTVVLAkvLyA8NSw3LDQsNz46IENvc3QgMyB2c2xkb2k4IDw0LDcsNSw3PiwgPDQsNyw1LDc+CisgIDI2OTQ3Mzc0NDlVLAkvLyA8NSw3LDQsdT46IENvc3QgMyB2c2xkb2k4IDwxLDYsNSw3PiwgUkhTCisgIDIzMTEzMTE0NThVLAkvLyA8NSw3LDUsMD46IENvc3QgMyB2bXJnbHcgPDQsdSw1LDU+LCA8NSw2LDcsMD4KKyAgMzc2ODQ3OTQzM1UsCS8vIDw1LDcsNSwxPjogQ29zdCA0IHZzbGRvaTggPDEsNiw1LDc+LCA8NSwxLDYsNT4KKyAgMzc2ODQ3OTUyMVUsCS8vIDw1LDcsNSwyPjogQ29zdCA0IHZzbGRvaTggPDEsNiw1LDc+LCA8NSwyLDcsMz4KKyAgMjMxMTMxMTg2NlUsCS8vIDw1LDcsNSwzPjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsNT4sIDw2LDIsNywzPgorICAyMzExMzExNDYyVSwJLy8gPDUsNyw1LDQ+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSw1PiwgPDUsNiw3LDQ+CisgIDIyNDgxODUyNzBVLAkvLyA8NSw3LDUsNT46IENvc3QgMyB2bXJnaHcgPDUsNSw1LDU+LCA8Nyw1LDUsNT4KKyAgMjcxODYyNTg3OVUsCS8vIDw1LDcsNSw2PjogQ29zdCAzIHZzbGRvaTggPDUsNiw1LDc+LCA8NSw2LDUsNz4KKyAgMjMxMTMxMjE5NFUsCS8vIDw1LDcsNSw3PjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsNT4sIDw2LDYsNyw3PgorICAyMzExMzExNDY2VSwJLy8gPDUsNyw1LHU+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSw1PiwgPDUsNiw3LHU+CisgIDIyNDg5NTQ4NzRVLAkvLyA8NSw3LDYsMD46IENvc3QgMyB2bXJnaHcgPDUsNiw3LDA+LCA8NywwLDEsMj4KKyAgMzMyMjY5Njc3OFUsCS8vIDw1LDcsNiwxPjogQ29zdCA0IHZtcmdodyA8NSw2LDcsMD4sIDw3LDEsMSwxPgorICAyMjQ4OTU1MDI4VSwJLy8gPDUsNyw2LDI+OiBDb3N0IDMgdm1yZ2h3IDw1LDYsNywwPiwgPDcsMiwwLDM+CisgIDI2NTY5NjMwNzRVLAkvLyA8NSw3LDYsMz46IENvc3QgMyB2c2xkb2k0IDw2LDUsNyw2PiwgPDMsNCw1LDY+CisgIDIyNDg5NTUyMzhVLAkvLyA8NSw3LDYsND46IENvc3QgMyB2bXJnaHcgPDUsNiw3LDA+LCA8Nyw0LDUsNj4KKyAgMjI0ODk1NTMyOVUsCS8vIDw1LDcsNiw1PjogQ29zdCAzIHZtcmdodyA8NSw2LDcsMD4sIDw3LDUsNiw3PgorICAyNjU2OTY1MzYwVSwJLy8gPDUsNyw2LDY+OiBDb3N0IDMgdnNsZG9pNCA8Niw1LDcsNj4sIDw2LDUsNyw2PgorICAyMjQ4OTU1NTAwVSwJLy8gPDUsNyw2LDc+OiBDb3N0IDMgdm1yZ2h3IDw1LDYsNywwPiwgPDcsNyw3LDc+CisgIDIyNDg5NTU1MjJVLAkvLyA8NSw3LDYsdT46IENvc3QgMyB2bXJnaHcgPDUsNiw3LDA+LCA8Nyx1LDEsMj4KKyAgMzcxODc2NjY5NFUsCS8vIDw1LDcsNywwPjogQ29zdCA0IHZzbGRvaTQgPDQsNSw3LDc+LCBMSFMKKyAgMzcyNDczOTgyN1UsCS8vIDw1LDcsNywxPjogQ29zdCA0IHZzbGRvaTQgPDUsNSw3LDc+LCA8MSw2LDUsNz4KKyAgMzcxODc2ODczOVUsCS8vIDw1LDcsNywyPjogQ29zdCA0IHZzbGRvaTQgPDQsNSw3LDc+LCA8Mix1LDQsNT4KKyAgMzM2NTgyNjMzN1UsCS8vIDw1LDcsNywzPjogQ29zdCA0IHZtcmdsdyA8MSw2LDUsNz4sIDw1LDIsNywzPgorICAyNzk4MjUzNjQ3VSwJLy8gPDUsNyw3LDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDcsNyw0LDU+LCA8Nyw3LDQsNT4KKyAgMzM2NTgyNjI1OFUsCS8vIDw1LDcsNyw1PjogQ29zdCA0IHZtcmdsdyA8MSw2LDUsNz4sIDw1LDEsNyw1PgorICAzNzMwNzE1Mzc3VSwJLy8gPDUsNyw3LDY+OiBDb3N0IDQgdnNsZG9pNCA8Niw1LDcsNz4sIDw2LDUsNyw3PgorICAyMzEwNjY1ODM2VSwJLy8gPDUsNyw3LDc+OiBDb3N0IDMgdm1yZ2x3IDw0LDcsNSw3PiwgPDcsNyw3LDc+CisgIDI3OTg1NDg1OTVVLAkvLyA8NSw3LDcsdT46IENvc3QgMyB2c2xkb2kxMiA8Nyw3LHUsNT4sIDw3LDcsdSw1PgorICAyMzExMzM2MDM0VSwJLy8gPDUsNyx1LDA+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSx1PiwgPDUsNiw3LDA+CisgIDI2OTQ3Mzk3NThVLAkvLyA8NSw3LHUsMT46IENvc3QgMyB2c2xkb2k4IDwxLDYsNSw3PiwgTEhTCisgIDIyNDg5NTUwMjhVLAkvLyA8NSw3LHUsMj46IENvc3QgMyB2bXJnaHcgPDUsNiw3LDA+LCA8NywyLDAsMz4KKyAgMjMxMTMzNjQ0MlUsCS8vIDw1LDcsdSwzPjogQ29zdCAzIHZtcmdsdyA8NCx1LDUsdT4sIDw2LDIsNywzPgorICAyMzExMzM2MDM4VSwJLy8gPDUsNyx1LDQ+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSx1PiwgPDUsNiw3LDQ+CisgIDI2OTQ3NDAxMjJVLAkvLyA8NSw3LHUsNT46IENvc3QgMyB2c2xkb2k4IDwxLDYsNSw3PiwgUkhTCisgIDI2NTY5ODE3NDZVLAkvLyA8NSw3LHUsNj46IENvc3QgMyB2c2xkb2k0IDw2LDUsNyx1PiwgPDYsNSw3LHU+CisgIDIzMTEzMzY3NzBVLAkvLyA8NSw3LHUsNz46IENvc3QgMyB2bXJnbHcgPDQsdSw1LHU+LCA8Niw2LDcsNz4KKyAgMjY5NDc0MDMyNVUsCS8vIDw1LDcsdSx1PjogQ29zdCAzIHZzbGRvaTggPDEsNiw1LDc+LCBMSFMKKyAgMjcwNTM1ODg0OFUsCS8vIDw1LHUsMCwwPjogQ29zdCAzIHZzbGRvaTggPDMsNCw1LHU+LCA8MCwwLDAsMD4KKyAgMTYzMTYxNzEyNlUsCS8vIDw1LHUsMCwxPjogQ29zdCAyIHZzbGRvaTggPDMsNCw1LHU+LCBMSFMKKyAgMjMxMDYwNzg2NlUsCS8vIDw1LHUsMCwyPjogQ29zdCAzIHZtcmdsdyA8NCw3LDUsMD4sIDw3LDAsMSwyPgorICAyMzAyNjQwMjg0VSwJLy8gPDUsdSwwLDM+OiBDb3N0IDMgdm1yZ2x3IDwzLDQsNSwwPiwgTEhTCisgIDI3NTQyMzgxODlVLAkvLyA8NSx1LDAsND46IENvc3QgMyB2c2xkb2kxMiA8MCw0LDEsNT4sIDx1LDAsNCwxPgorICAyMzA1Mjk2MTE0VSwJLy8gPDUsdSwwLDU+OiBDb3N0IDMgdm1yZ2x3IDwzLHUsNSwwPiwgPDIsMyx1LDU+CisgIDIyNDQ5MDcxMDZVLAkvLyA8NSx1LDAsNj46IENvc3QgMyB2bXJnaHcgPDUsMCw2LDE+LCA8NSw2LDcsMD4KKyAgMjMwMjY0MzUyOFUsCS8vIDw1LHUsMCw3PjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsMD4sIFJIUworICAxNjMxNjE3NjkzVSwJLy8gPDUsdSwwLHU+OiBDb3N0IDIgdnNsZG9pOCA8Myw0LDUsdT4sIExIUworICAyNjI3MTMzNTQyVSwJLy8gPDUsdSwxLDA+OiBDb3N0IDMgdnNsZG9pNCA8MSw1LHUsMT4sIExIUworICAxMjM3NTM2MjgyVSwJLy8gPDUsdSwxLDE+OiBDb3N0IDIgdm1yZ2x3IDw0LHUsNSwxPiwgPDQsdSw1LDE+CisgIDE2ODA0OTY0MzBVLAkvLyA8NSx1LDEsMj46IENvc3QgMiB2c2xkb2kxMiA8MCw0LDEsNT4sIExIUworICAxMjM3NTMyODI4VSwJLy8gPDUsdSwxLDM+OiBDb3N0IDIgdm1yZ2x3IDw0LHUsNSwxPiwgTEhTCisgIDI2OTM0MTYwMThVLAkvLyA8NSx1LDEsND46IENvc3QgMyB2c2xkb2k4IDwxLDQsNSx1PiwgPDEsNCw1LHU+CisgIDI3NTY4OTI0ODZVLAkvLyA8NSx1LDEsNT46IENvc3QgMyB2c2xkb2kxMiA8MCx1LDEsNT4sIDx1LDEsNSwwPgorICAyNjk0NzQzMjg0VSwJLy8gPDUsdSwxLDY+OiBDb3N0IDMgdnNsZG9pOCA8MSw2LDUsdT4sIDwxLDYsNSx1PgorICAxMjM3NTM2MDcyVSwJLy8gPDUsdSwxLDc+OiBDb3N0IDIgdm1yZ2x3IDw0LHUsNSwxPiwgUkhTCisgIDE2ODA0OTY0ODRVLAkvLyA8NSx1LDEsdT46IENvc3QgMiB2c2xkb2kxMiA8MCw0LDEsNT4sIExIUworICAyMzExMjg4NzA5VSwJLy8gPDUsdSwyLDA+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsNSwyPiwgPHUsMiwzLDA+CisgIDIyNDU4ODM2OTRVLAkvLyA8NSx1LDIsMT46IENvc3QgMyB2bXJnaHcgPDUsMiwxLDM+LCBMSFMKKyAgMjY5OTM4ODUyMFUsCS8vIDw1LHUsMiwyPjogQ29zdCAzIHZzbGRvaTggPDIsNCw1LHU+LCA8MiwyLDIsMj4KKyAgMjc1NDIzODM0NFUsCS8vIDw1LHUsMiwzPjogQ29zdCAzIHZzbGRvaTEyIDwwLDQsMSw1PiwgPHUsMiwzLDM+CisgIDI2OTkzODg3MTVVLAkvLyA8NSx1LDIsND46IENvc3QgMyB2c2xkb2k4IDwyLDQsNSx1PiwgPDIsNCw1LHU+CisgIDI3NTc0MDg2NjZVLAkvLyA8NSx1LDIsNT46IENvc3QgMyB2c2xkb2kxMiA8MCx1LHUsNT4sIDx1LDIsNSwzPgorICAyNzA1MzYwODI2VSwJLy8gPDUsdSwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8Myw0LDUsdT4sIDwyLDYsMyw3PgorICAyMzAyNjU5OTEyVSwJLy8gPDUsdSwyLDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDQsNSwyPiwgUkhTCisgIDI3NTQyMzgzODlVLAkvLyA8NSx1LDIsdT46IENvc3QgMyB2c2xkb2kxMiA8MCw0LDEsNT4sIDx1LDIsdSwzPgorICAyNzU0MjM4Mzk2VSwJLy8gPDUsdSwzLDA+OiBDb3N0IDMgdnNsZG9pMTIgPDAsNCwxLDU+LCA8dSwzLDAsMT4KKyAgMzgyNzk4MDIyOVUsCS8vIDw1LHUsMywxPjogQ29zdCA0IHZzbGRvaTEyIDwwLDQsMSw1PiwgPHUsMywxLDE+CisgIDI2NDQ2MjUxMDJVLAkvLyA8NSx1LDMsMj46IENvc3QgMyB2c2xkb2k0IDw0LDUsMiwzPiwgPDIsMyw0LDU+CisgIDIyODkzOTM4MjBVLAkvLyA8NSx1LDMsMz46IENvc3QgMyB2bXJnbHcgPDEsMiw1LDM+LCBMSFMKKyAgMTYzMTYxOTU4OFUsCS8vIDw1LHUsMyw0PjogQ29zdCAyIHZzbGRvaTggPDMsNCw1LHU+LCA8Myw0LDUsdT4KKyAgMjc4NTA1Njc0OVUsCS8vIDw1LHUsMyw1PjogQ29zdCAzIHZzbGRvaTEyIDw1LDUsNSw1PiwgPHUsMyw1LDU+CisgIDMzNjMxMzgwNzdVLAkvLyA8NSx1LDMsNj46IENvc3QgNCB2bXJnbHcgPDEsMiw1LDM+LCA8Myw0LHUsNj4KKyAgMjI4OTM5NzA2NFUsCS8vIDw1LHUsMyw3PjogQ29zdCAzIHZtcmdsdyA8MSwyLDUsMz4sIFJIUworICAxNjM0Mjc0MTIwVSwJLy8gPDUsdSwzLHU+OiBDb3N0IDIgdnNsZG9pOCA8Myx1LDUsdT4sIDwzLHUsNSx1PgorICAxNjM0OTM3NzUzVSwJLy8gPDUsdSw0LDA+OiBDb3N0IDIgdnNsZG9pOCA8NCwwLDUsdT4sIDw0LDAsNSx1PgorICAxNzI4MjcyNDEwVSwJLy8gPDUsdSw0LDE+OiBDb3N0IDIgdnNsZG9pMTIgPHUsNCwxLDU+LCA8dSw0LDEsNT4KKyAgMjcxMDAwNjg0M1UsCS8vIDw1LHUsNCwyPjogQ29zdCAzIHZzbGRvaTggPDQsMiw1LHU+LCA8NCwyLDUsdT4KKyAgMjc2NTc0MDA3NlUsCS8vIDw1LHUsNCwzPjogQ29zdCAzIHZzbGRvaTEyIDwyLDMsNCw1PiwgPHUsNCwzLDU+CisgIDE2Mzc1OTIyODVVLAkvLyA8NSx1LDQsND46IENvc3QgMiB2c2xkb2k4IDw0LDQsNSx1PiwgPDQsNCw1LHU+CisgIDE2MzE2MjA0MDZVLAkvLyA8NSx1LDQsNT46IENvc3QgMiB2c2xkb2k4IDwzLDQsNSx1PiwgUkhTCisgIDI3MTI2NjEzNzVVLAkvLyA8NSx1LDQsNj46IENvc3QgMyB2c2xkb2k4IDw0LDYsNSx1PiwgPDQsNiw1LHU+CisgIDIzMDI2NzYyOTZVLAkvLyA8NSx1LDQsNz46IENvc3QgMyB2bXJnbHcgPDMsNCw1LDQ+LCBSSFMKKyAgMTYzMTYyMDY0OVUsCS8vIDw1LHUsNCx1PjogQ29zdCAyIHZzbGRvaTggPDMsNCw1LHU+LCBSSFMKKyAgMTU3NzA5MTE3NFUsCS8vIDw1LHUsNSwwPjogQ29zdCAyIHZzbGRvaTQgPDUsNSw1LDU+LCBMSFMKKyAgMTE3NDQ0MzgyMlUsCS8vIDw1LHUsNSwxPjogQ29zdCAyIHZtcmdodyA8NSw1LDUsNT4sIExIUworICAyNzY2MDM1MDU4VSwJLy8gPDUsdSw1LDI+OiBDb3N0IDMgdnNsZG9pMTIgPDIsMyx1LDU+LCA8dSw1LDIsMz4KKyAgMTIzNzU2NTU5NlUsCS8vIDw1LHUsNSwzPjogQ29zdCAyIHZtcmdsdyA8NCx1LDUsNT4sIExIUworICAxNTc3MDk0NDU0VSwJLy8gPDUsdSw1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8NSw1LDUsNT4sIFJIUworICAyOTYxNDQxODJVLAkvLyA8NSx1LDUsNT46IENvc3QgMSB2c3BsdGlzdzEgUkhTCisgIDE2ODA0OTY3OTRVLAkvLyA8NSx1LDUsNj46IENvc3QgMiB2c2xkb2kxMiA8MCw0LDEsNT4sIFJIUworICAxMjM3NTY4ODQwVSwJLy8gPDUsdSw1LDc+OiBDb3N0IDIgdm1yZ2x3IDw0LHUsNSw1PiwgUkhTCisgIDI5NjE0NDE4MlUsCS8vIDw1LHUsNSx1PjogQ29zdCAxIHZzcGx0aXN3MSBSSFMKKyAgMjYzMzE0NjQ3MFUsCS8vIDw1LHUsNiwwPjogQ29zdCAzIHZzbGRvaTQgPDIsNSx1LDY+LCBMSFMKKyAgMTE3NTIxMzg3MFUsCS8vIDw1LHUsNiwxPjogQ29zdCAyIHZtcmdodyA8NSw2LDcsMD4sIExIUworICAyNjMzMTQ4MzA5VSwJLy8gPDUsdSw2LDI+OiBDb3N0IDMgdnNsZG9pNCA8Miw1LHUsNj4sIDwyLDUsdSw2PgorICAxMjI4OTQ3NjEyVSwJLy8gPDUsdSw2LDM+OiBDb3N0IDIgdm1yZ2x3IDwzLDQsNSw2PiwgTEhTCisgIDI2MzMxNDk3NTBVLAkvLyA8NSx1LDYsND46IENvc3QgMyB2c2xkb2k0IDwyLDUsdSw2PiwgUkhTCisgIDExNzUyMTQyMzRVLAkvLyA8NSx1LDYsNT46IENvc3QgMiB2bXJnaHcgPDUsNiw3LDA+LCBSSFMKKyAgMTIyODk1MDAxOFUsCS8vIDw1LHUsNiw2PjogQ29zdCAyIHZtcmdsdyA8Myw0LDUsNj4sIDwzLDQsNSw2PgorICAxMjI4OTUwODU2VSwJLy8gPDUsdSw2LDc+OiBDb3N0IDIgdm1yZ2x3IDwzLDQsNSw2PiwgUkhTCisgIDEyMjg5NDc2MTdVLAkvLyA8NSx1LDYsdT46IENvc3QgMiB2bXJnbHcgPDMsNCw1LDY+LCBMSFMKKyAgNDk3NjE0OTUwVSwJLy8gPDUsdSw3LDA+OiBDb3N0IDEgdnNsZG9pNCBSSFMsIExIUworICAxNTcxMzU3NDkyVSwJLy8gPDUsdSw3LDE+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDwxLDEsMSwxPgorICAxNTcxMzU4MzEyVSwJLy8gPDUsdSw3LDI+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDwyLDIsMiwyPgorICAxNTcxMzU4ODcwVSwJLy8gPDUsdSw3LDM+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDwzLDAsMSwyPgorICA0OTc2MTgyNDhVLAkvLyA8NSx1LDcsND46IENvc3QgMSB2c2xkb2k0IFJIUywgUkhTCisgIDE1NzEzNjA3NzJVLAkvLyA8NSx1LDcsNT46IENvc3QgMiB2c2xkb2k0IFJIUywgPDUsNSw1LDU+CisgIDE1NzEzNjEyNzRVLAkvLyA8NSx1LDcsNj46IENvc3QgMiB2c2xkb2k0IFJIUywgPDYsMiw3LDM+CisgIDE1NzEzNjE3ODZVLAkvLyA8NSx1LDcsNz46IENvc3QgMiB2c2xkb2k0IFJIUywgPDcsMCwxLDI+CisgIDQ5NzYyMDc4MlUsCS8vIDw1LHUsNyx1PjogQ29zdCAxIHZzbGRvaTQgUkhTLCBMSFMKKyAgNDk3NjIzMTQyVSwJLy8gPDUsdSx1LDA+OiBDb3N0IDEgdnNsZG9pNCBSSFMsIExIUworICAxNjMxNjIyOTU4VSwJLy8gPDUsdSx1LDE+OiBDb3N0IDIgdnNsZG9pOCA8Myw0LDUsdT4sIExIUworICAxNjgwNDk2OTk3VSwJLy8gPDUsdSx1LDI+OiBDb3N0IDIgdnNsZG9pMTIgPDAsNCwxLDU+LCBMSFMKKyAgMTIyODk2Mzk5NlUsCS8vIDw1LHUsdSwzPjogQ29zdCAyIHZtcmdsdyA8Myw0LDUsdT4sIExIUworICA0OTc2MjY0NDFVLAkvLyA8NSx1LHUsND46IENvc3QgMSB2c2xkb2k0IFJIUywgUkhTCisgIDI5NjE0NDE4MlUsCS8vIDw1LHUsdSw1PjogQ29zdCAxIHZzcGx0aXN3MSBSSFMKKyAgMTY4MDQ5NzAzN1UsCS8vIDw1LHUsdSw2PjogQ29zdCAyIHZzbGRvaTEyIDwwLDQsMSw1PiwgUkhTCisgIDEyMjg5NjcyNDBVLAkvLyA8NSx1LHUsNz46IENvc3QgMiB2bXJnbHcgPDMsNCw1LHU+LCBSSFMKKyAgNDk3NjI4OTc0VSwJLy8gPDUsdSx1LHU+OiBDb3N0IDEgdnNsZG9pNCBSSFMsIExIUworICAyNzcyNDUxMzI4VSwJLy8gPDYsMCwwLDA+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MCwwLDAsMD4KKyAgMjc3MjQ1MTMzOFUsCS8vIDw2LDAsMCwxPjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsNSw2PiwgPDAsMCwxLDE+CisgIDM3NzExNDY0MTdVLAkvLyA8NiwwLDAsMj46IENvc3QgNCB2c2xkb2k4IDwyLDEsNiwwPiwgPDAsMiwxLDY+CisgIDMzODMwOTU3MzlVLAkvLyA8NiwwLDAsMz46IENvc3QgNCB2bXJnbHcgPDQsNSw2LDA+LCA8NiwyLDAsMz4KKyAgMzg0NjE5MzE4OVUsCS8vIDw2LDAsMCw0PjogQ29zdCA0IHZzbGRvaTEyIDwzLDQsNSw2PiwgPDAsMCw0LDE+CisgIDM3MjQ4MzI4MDNVLAkvLyA8NiwwLDAsNT46IENvc3QgNCB2c2xkb2k0IDw1LDYsMCwwPiwgPDUsNiwwLDA+CisgIDMzODMwOTU5ODVVLAkvLyA8NiwwLDAsNj46IENvc3QgNCB2bXJnbHcgPDQsNSw2LDA+LCA8Niw1LDAsNj4KKyAgMzM4MzA5NjA2N1UsCS8vIDw2LDAsMCw3PjogQ29zdCA0IHZtcmdsdyA8NCw1LDYsMD4sIDw2LDYsMCw3PgorICAyNzcyNDUxNDAxVSwJLy8gPDYsMCwwLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MCwwLHUsMT4KKyAgMjY1MTA5NTE0MlUsCS8vIDw2LDAsMSwwPjogQ29zdCAzIHZzbGRvaTQgPDUsNiwwLDE+LCBMSFMKKyAgMjI1MTYxMjI2MlUsCS8vIDw2LDAsMSwxPjogQ29zdCAzIHZtcmdodyA8NiwxLDcsMT4sIExIUworICAxNjk4NzA5NjA2VSwJLy8gPDYsMCwxLDI+OiBDb3N0IDIgdnNsZG9pMTIgPDMsNCw1LDY+LCBMSFMKKyAgMjY1MTA5NzYwMlUsCS8vIDw2LDAsMSwzPjogQ29zdCAzIHZzbGRvaTQgPDUsNiwwLDE+LCA8Myw0LDUsNj4KKyAgMjY1MTA5ODQyMlUsCS8vIDw2LDAsMSw0PjogQ29zdCAzIHZzbGRvaTQgPDUsNiwwLDE+LCBSSFMKKyAgMjY1MTA5OTE3MlUsCS8vIDw2LDAsMSw1PjogQ29zdCAzIHZzbGRvaTQgPDUsNiwwLDE+LCA8NSw2LDAsMT4KKyAgMjY1NzA3MTg2OVUsCS8vIDw2LDAsMSw2PjogQ29zdCAzIHZzbGRvaTQgPDYsNiwwLDE+LCA8Niw2LDAsMT4KKyAgMzcyNDg0MTk3OFUsCS8vIDw2LDAsMSw3PjogQ29zdCA0IHZzbGRvaTQgPDUsNiwwLDE+LCA8NywwLDEsMj4KKyAgMTY5ODcwOTY2MFUsCS8vIDw2LDAsMSx1PjogQ29zdCAyIHZzbGRvaTEyIDwzLDQsNSw2PiwgTEhTCisgIDIyNTIyOTIwOTZVLAkvLyA8NiwwLDIsMD46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8MCwwLDAsMD4KKyAgMTE3ODU1MDM3NFUsCS8vIDw2LDAsMiwxPjogQ29zdCAyIHZtcmdodyA8NiwyLDcsMz4sIExIUworICAzODI2NjU1NDE4VSwJLy8gPDYsMCwyLDI+OiBDb3N0IDQgdnNsZG9pMTIgPDAsMiwxLDY+LCA8MCwyLDIsNj4KKyAgMzc3Nzc4MzQ4NVUsCS8vIDw2LDAsMiwzPjogQ29zdCA0IHZzbGRvaTggPDMsMiw2LDA+LCA8MiwzLDIsNj4KKyAgMjI1MjI5MjQzNFUsCS8vIDw2LDAsMiw0PjogQ29zdCAzIHZtcmdodyA8NiwyLDcsMz4sIDwwLDQsMSw1PgorICAzNzg1NzQ2MjgwVSwJLy8gPDYsMCwyLDU+OiBDb3N0IDQgdnNsZG9pOCA8NCw1LDYsMD4sIDwyLDUsMyw2PgorICAyMjUyMjkyNTkzVSwJLy8gPDYsMCwyLDY+OiBDb3N0IDMgdm1yZ2h3IDw2LDIsNywzPiwgPDAsNiwxLDI+CisgIDM3MzY3OTQ1ODNVLAkvLyA8NiwwLDIsNz46IENvc3QgNCB2c2xkb2k0IDw3LDYsMCwyPiwgPDcsNiwwLDI+CisgIDExNzg1NTA5NDFVLAkvLyA8NiwwLDIsdT46IENvc3QgMiB2bXJnaHcgPDYsMiw3LDM+LCBMSFMKKyAgMzM3NTE1MzE1MlUsCS8vIDw2LDAsMywwPjogQ29zdCA0IHZtcmdsdyA8MywyLDYsMz4sIDwwLDAsMCwwPgorICAyNzcyNDUxNTg0VSwJLy8gPDYsMCwzLDE+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MCwzLDEsND4KKyAgMzc3Nzc4NDE2M1UsCS8vIDw2LDAsMywyPjogQ29zdCA0IHZzbGRvaTggPDMsMiw2LDA+LCA8MywyLDYsMD4KKyAgMzg0NjE5MzQyNlUsCS8vIDw2LDAsMywzPjogQ29zdCA0IHZzbGRvaTEyIDwzLDQsNSw2PiwgPDAsMywzLDQ+CisgIDI3MTIwMDUxMjJVLAkvLyA8NiwwLDMsND46IENvc3QgMyB2c2xkb2k4IDw0LDUsNiwwPiwgPDMsNCw1LDY+CisgIDM3MjQ4NTczODJVLAkvLyA8NiwwLDMsNT46IENvc3QgNCB2c2xkb2k0IDw1LDYsMCwzPiwgPDUsNiwwLDM+CisgIDM4MDIzMzU4NjRVLAkvLyA8NiwwLDMsNj46IENvc3QgNCB2c2xkb2k4IDw3LDMsNiwwPiwgPDMsNiwwLDc+CisgIDM4MDE2NzI0MTBVLAkvLyA8NiwwLDMsNz46IENvc3QgNCB2c2xkb2k4IDw3LDIsNiwwPiwgPDMsNywyLDY+CisgIDI3NzI0NTE2NDdVLAkvLyA8NiwwLDMsdT46IENvc3QgMyB2c2xkb2kxMiA8Myw0LDUsNj4sIDwwLDMsdSw0PgorICAzMzgzMTIzOTY4VSwJLy8gPDYsMCw0LDA+OiBDb3N0IDQgdm1yZ2x3IDw0LDUsNiw0PiwgPDAsMCwwLDA+CisgIDI3NzI0NTE2NjZVLAkvLyA8NiwwLDQsMT46IENvc3QgMyB2c2xkb2kxMiA8Myw0LDUsNj4sIDwwLDQsMSw1PgorICAzNzczODAzNTc3VSwJLy8gPDYsMCw0LDI+OiBDb3N0IDQgdnNsZG9pOCA8Miw1LDYsMD4sIDw0LDIsNSw2PgorICAzNzI0ODY0MDAyVSwJLy8gPDYsMCw0LDM+OiBDb3N0IDQgdnNsZG9pNCA8NSw2LDAsND4sIDwzLDQsNSw2PgorICAzODQ2MTkzNTE3VSwJLy8gPDYsMCw0LDQ+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MCw0LDQsNT4KKyAgMjcxMjAwNTkzNVUsCS8vIDw2LDAsNCw1PjogQ29zdCAzIHZzbGRvaTggPDQsNSw2LDA+LCA8NCw1LDYsMD4KKyAgMzMyNzAwOTI2NVUsCS8vIDw2LDAsNCw2PjogQ29zdCA0IHZtcmdodyA8Niw0LDIsNT4sIDwwLDYsMSwyPgorICAzMzgzMTI2NjQ4VSwJLy8gPDYsMCw0LDc+OiBDb3N0IDUgdm1yZ2x3IDw0LDUsNiw0PiwgPDMsNiwwLDc+CisgIDI3NzI0NTE3MjlVLAkvLyA8NiwwLDQsdT46IENvc3QgMyB2c2xkb2kxMiA8Myw0LDUsNj4sIDwwLDQsdSw1PgorICAzMzczMTc4ODgwVSwJLy8gPDYsMCw1LDA+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsNiw1PiwgPDAsMCwwLDA+CisgIDIyNTQyNjY0NzBVLAkvLyA8NiwwLDUsMT46IENvc3QgMyB2bXJnaHcgPDYsNSw3LDE+LCBMSFMKKyAgMzc4NTc0ODI0OFUsCS8vIDw2LDAsNSwyPjogQ29zdCA0IHZzbGRvaTggPDQsNSw2LDA+LCA8NSwyLDYsMz4KKyAgMzc5MDM5MzE5MFUsCS8vIDw2LDAsNSwzPjogQ29zdCA0IHZzbGRvaTggPDUsMyw2LDA+LCA8NSwzLDYsMD4KKyAgMzMyODAwMDMzOFUsCS8vIDw2LDAsNSw0PjogQ29zdCA0IHZtcmdodyA8Niw1LDcsMD4sIDwwLDQsMSw1PgorICAzNzg1NzQ4NDk0VSwJLy8gPDYsMCw1LDU+OiBDb3N0IDQgdnNsZG9pOCA8NCw1LDYsMD4sIDw1LDUsNiw2PgorICAzNzg1NzQ4NTE2VSwJLy8gPDYsMCw1LDY+OiBDb3N0IDQgdnNsZG9pOCA8NCw1LDYsMD4sIDw1LDYsMCwxPgorICAzMzc5MTUzNTI4VSwJLy8gPDYsMCw1LDc+OiBDb3N0IDQgdm1yZ2x3IDwzLHUsNiw1PiwgPDMsNiwwLDc+CisgIDIyNTQyNjcwMzdVLAkvLyA8NiwwLDUsdT46IENvc3QgMyB2bXJnaHcgPDYsNSw3LDE+LCBMSFMKKyAgMjI1NDg5NzE1MlUsCS8vIDw2LDAsNiwwPjogQ29zdCAzIHZtcmdodyA8Niw2LDYsNj4sIDwwLDAsMCwwPgorICAxMTgxMTU1NDMwVSwJLy8gPDYsMCw2LDE+OiBDb3N0IDIgdm1yZ2h3IDw2LDYsNiw2PiwgTEhTCisgIDM3ODU3NDg5MjNVLAkvLyA8NiwwLDYsMj46IENvc3QgNCB2c2xkb2k4IDw0LDUsNiwwPiwgPDYsMiwwLDM+CisgIDM3ODU3NDkwNDJVLAkvLyA8NiwwLDYsMz46IENvc3QgNCB2c2xkb2k4IDw0LDUsNiwwPiwgPDYsMyw0LDU+CisgIDIyNTQ4OTc0OTBVLAkvLyA8NiwwLDYsND46IENvc3QgMyB2bXJnaHcgPDYsNiw2LDY+LCA8MCw0LDEsNT4KKyAgMzc4NTc0OTE2OVUsCS8vIDw2LDAsNiw1PjogQ29zdCA0IHZzbGRvaTggPDQsNSw2LDA+LCA8Niw1LDAsNj4KKyAgMjcyNDYxNDk2MlUsCS8vIDw2LDAsNiw2PjogQ29zdCAzIHZzbGRvaTggPDYsNiw2LDA+LCA8Niw2LDYsMD4KKyAgMzc4NzczOTk4MlUsCS8vIDw2LDAsNiw3PjogQ29zdCA0IHZzbGRvaTggPDQsdSw2LDA+LCA8Niw3LDAsMT4KKyAgMTE4MTE1NTk5N1UsCS8vIDw2LDAsNix1PjogQ29zdCAyIHZtcmdodyA8Niw2LDYsNj4sIExIUworICAxMjM1NjY0ODk2VSwJLy8gPDYsMCw3LDA+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDAsMCwwLDA+CisgIDEyMzU2NjY1OThVLAkvLyA8NiwwLDcsMT46IENvc3QgMiB2bXJnbHcgUkhTLCA8MiwzLDAsMT4KKyAgMzcxMjk0MzcyMFUsCS8vIDw2LDAsNywyPjogQ29zdCA0IHZzbGRvaTQgPDMsNiwwLDc+LCA8MiwyLDIsMj4KKyAgMjYzOTIwMjkzNlUsCS8vIDw2LDAsNywzPjogQ29zdCAzIHZzbGRvaTQgPDMsNiwwLDc+LCA8Myw2LDAsNz4KKyAgMjYzOTIwMzYzOFUsCS8vIDw2LDAsNyw0PjogQ29zdCAzIHZzbGRvaTQgPDMsNiwwLDc+LCBSSFMKKyAgMjMwOTQwOTIzNlUsCS8vIDw2LDAsNyw1PjogQ29zdCAzIHZtcmdsdyBSSFMsIDwzLDQsMCw1PgorICAzNzEyOTQ2NTE3VSwJLy8gPDYsMCw3LDY+OiBDb3N0IDQgdnNsZG9pNCA8Myw2LDAsNz4sIDw2LDAsNywwPgorICAyMzA5NDA5NDAwVSwJLy8gPDYsMCw3LDc+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDMsNiwwLDc+CisgIDEyMzU2NjY2MDVVLAkvLyA8NiwwLDcsdT46IENvc3QgMiB2bXJnbHcgUkhTLCA8MiwzLDAsdT4KKyAgMTIzNTY3MzA4OFUsCS8vIDw2LDAsdSwwPjogQ29zdCAyIHZtcmdsdyBSSFMsIDwwLDAsMCwwPgorICAxMjM1Njc0NzkwVSwJLy8gPDYsMCx1LDE+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDIsMywwLDE+CisgIDE2OTg3MTAxNzNVLAkvLyA8NiwwLHUsMj46IENvc3QgMiB2c2xkb2kxMiA8Myw0LDUsNj4sIExIUworICAyNjM5MjExMTI5VSwJLy8gPDYsMCx1LDM+OiBDb3N0IDMgdnNsZG9pNCA8Myw2LDAsdT4sIDwzLDYsMCx1PgorICAyNjM5MjExODMwVSwJLy8gPDYsMCx1LDQ+OiBDb3N0IDMgdnNsZG9pNCA8Myw2LDAsdT4sIFJIUworICAyNzEyMDA4ODU4VSwJLy8gPDYsMCx1LDU+OiBDb3N0IDMgdnNsZG9pOCA8NCw1LDYsMD4sIFJIUworICAyNjU3MTI5MjIwVSwJLy8gPDYsMCx1LDY+OiBDb3N0IDMgdnNsZG9pNCA8Niw2LDAsdT4sIDw2LDYsMCx1PgorICAyMzA5NDE3NTkyVSwJLy8gPDYsMCx1LDc+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDMsNiwwLDc+CisgIDE2OTg3MTAyMjdVLAkvLyA8NiwwLHUsdT46IENvc3QgMiB2c2xkb2kxMiA8Myw0LDUsNj4sIExIUworICAzNzc1Nzk5Mjk2VSwJLy8gPDYsMSwwLDA+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsMT4sIDwwLDAsMCwwPgorICAyNzAyMDU3NTc0VSwJLy8gPDYsMSwwLDE+OiBDb3N0IDMgdnNsZG9pOCA8Mix1LDYsMT4sIExIUworICAzMzczMTQzNzYzVSwJLy8gPDYsMSwwLDI+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsNiwwPiwgPHUsMCwxLDI+CisgIDM2OTUwNDUxMjJVLAkvLyA8NiwxLDAsMz46IENvc3QgNCB2c2xkb2k0IDwwLDYsMSwwPiwgPDMsNCw1LDY+CisgIDM3NzU3OTk2MzRVLAkvLyA8NiwxLDAsND46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiwxPiwgPDAsNCwxLDU+CisgIDMzODMwOTE1MzhVLAkvLyA8NiwxLDAsNT46IENvc3QgNCB2bXJnbHcgPDQsNSw2LDA+LCA8MCw0LDEsNT4KKyAgMzM2ODQ5MzIzM1UsCS8vIDw2LDEsMCw2PjogQ29zdCA0IHZtcmdsdyA8MiwxLDYsMD4sIDwwLDIsMSw2PgorICAzMzYyNTIyMzE5VSwJLy8gPDYsMSwwLDc+OiBDb3N0IDUgdm1yZ2x3IDwxLDEsNiwwPiwgPDEsNiwxLDc+CisgIDI3MDIwNTgxNDFVLAkvLyA8NiwxLDAsdT46IENvc3QgMyB2c2xkb2k4IDwyLHUsNiwxPiwgTEhTCisgIDM4MzQyNTAwMjdVLAkvLyA8NiwxLDEsMD46IENvc3QgNCB2c2xkb2kxMiA8MSw0LDUsNj4sIDwxLDEsMCwxPgorICAyNzcyNDUyMTQ4VSwJLy8gPDYsMSwxLDE+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MSwxLDEsMT4KKyAgMzgzMjAzODIxMFUsCS8vIDw2LDEsMSwyPjogQ29zdCA0IHZzbGRvaTEyIDwxLDEsMiw2PiwgPDEsMSwyLDY+CisgIDMzNzMxNTA2NjBVLAkvLyA8NiwxLDEsMz46IENvc3QgNCB2bXJnbHcgPDIsdSw2LDE+LCA8NiwyLDEsMz4KKyAgMzgzNDI1MDA2N1UsCS8vIDw2LDEsMSw0PjogQ29zdCA0IHZzbGRvaTEyIDwxLDQsNSw2PiwgPDEsMSw0LDU+CisgIDMzNzMxNDY0NTBVLAkvLyA8NiwxLDEsNT46IENvc3QgNCB2bXJnbHcgPDIsdSw2LDE+LCA8MCw0LDEsNT4KKyAgMzgyNjY1NjEwMlUsCS8vIDw2LDEsMSw2PjogQ29zdCA0IHZzbGRvaTEyIDwwLDIsMSw2PiwgPDEsMSw2LDY+CisgIDMzNjI1MzA1MTFVLAkvLyA8NiwxLDEsNz46IENvc3QgNCB2bXJnbHcgPDEsMSw2LDE+LCA8MSw2LDEsNz4KKyAgMjc3MjQ1MjE0OFUsCS8vIDw2LDEsMSx1PjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsNSw2PiwgPDEsMSwxLDE+CisgIDI2NjkwOTI5NjZVLAkvLyA8NiwxLDIsMD46IENvc3QgMyB2c2xkb2k0IDx1LDYsMSwyPiwgTEhTCisgIDIyNTIyOTI5MTZVLAkvLyA8NiwxLDIsMT46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8MSwxLDEsMT4KKyAgMjI1MjI5MzAxNFUsCS8vIDw2LDEsMiwyPjogQ29zdCAzIHZtcmdodyA8NiwyLDcsMz4sIDwxLDIsMywwPgorICAyNzcyNDUyMjQ2VSwJLy8gPDYsMSwyLDM+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MSwyLDMsMD4KKyAgMjY2OTA5NjI0NlUsCS8vIDw2LDEsMiw0PjogQ29zdCAzIHZzbGRvaTQgPHUsNiwxLDI+LCBSSFMKKyAgMzg0NjE5NDA5MVUsCS8vIDw2LDEsMiw1PjogQ29zdCA0IHZzbGRvaTEyIDwzLDQsNSw2PiwgPDEsMiw1LDM+CisgIDI3MDIwNTk0NTBVLAkvLyA8NiwxLDIsNj46IENvc3QgMyB2c2xkb2k4IDwyLHUsNiwxPiwgPDIsNiwzLDc+CisgIDM4NzAwODE5NzhVLAkvLyA8NiwxLDIsNz46IENvc3QgNCB2c2xkb2kxMiA8Nyw0LDUsNj4sIDwxLDIsNywwPgorICAyNzAyMDU5NjMzVSwJLy8gPDYsMSwyLHU+OiBDb3N0IDMgdnNsZG9pOCA8Mix1LDYsMT4sIDwyLHUsNiwxPgorICAzNzc1ODAxNDk0VSwJLy8gPDYsMSwzLDA+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsMT4sIDwzLDAsMSwyPgorICAzNzc3MTI4NzIzVSwJLy8gPDYsMSwzLDE+OiBDb3N0IDQgdnNsZG9pOCA8MywxLDYsMT4sIDwzLDEsNiwxPgorICAzNzc1ODAxNzAyVSwJLy8gPDYsMSwzLDI+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsMT4sIDwzLDIsNiwzPgorICAzNzc1ODAxNzU2VSwJLy8gPDYsMSwzLDM+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsMT4sIDwzLDMsMywzPgorICAzNzc1ODAxODU4VSwJLy8gPDYsMSwzLDQ+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsMT4sIDwzLDQsNSw2PgorICAzMzc1MTUzNDkwVSwJLy8gPDYsMSwzLDU+OiBDb3N0IDQgdm1yZ2x3IDwzLDIsNiwzPiwgPDAsNCwxLDU+CisgIDM4MjY2NTYyNjVVLAkvLyA8NiwxLDMsNj46IENvc3QgNCB2c2xkb2kxMiA8MCwyLDEsNj4sIDwxLDMsNiw3PgorICAzNzc1ODAyMDUxVSwJLy8gPDYsMSwzLDc+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsMT4sIDwzLDcsMCwxPgorICAzNzc1ODAyMTQyVSwJLy8gPDYsMSwzLHU+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsMT4sIDwzLHUsMSwyPgorICAzODQ2MTk0MjA2VSwJLy8gPDYsMSw0LDA+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MSw0LDAsMT4KKyAgMzg0NjE5NDIxOVUsCS8vIDw2LDEsNCwxPjogQ29zdCA0IHZzbGRvaTEyIDwzLDQsNSw2PiwgPDEsNCwxLDU+CisgIDM4NDYxOTQyMjhVLAkvLyA8NiwxLDQsMj46IENvc3QgNCB2c2xkb2kxMiA8Myw0LDUsNj4sIDwxLDQsMiw1PgorICAzODQ2MTk0MjM2VSwJLy8gPDYsMSw0LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MSw0LDMsND4KKyAgMzg0NjE5NDI0NlUsCS8vIDw2LDEsNCw0PjogQ29zdCA0IHZzbGRvaTEyIDwzLDQsNSw2PiwgPDEsNCw0LDU+CisgIDI3NjA1MDg0OTZVLAkvLyA8NiwxLDQsNT46IENvc3QgMyB2c2xkb2kxMiA8MSw0LDUsNj4sIDwxLDQsNSw2PgorICAzMzY4NTI2MDAxVSwJLy8gPDYsMSw0LDY+OiBDb3N0IDQgdm1yZ2x3IDwyLDEsNiw0PiwgPDAsMiwxLDY+CisgIDM4NzAwODIxNDRVLAkvLyA8NiwxLDQsNz46IENvc3QgNCB2c2xkb2kxMiA8Nyw0LDUsNj4sIDwxLDQsNyw0PgorICAyNzYwNzI5NzA3VSwJLy8gPDYsMSw0LHU+OiBDb3N0IDMgdnNsZG9pMTIgPDEsNCx1LDY+LCA8MSw0LHUsNj4KKyAgMjcxNDY2ODY2MFUsCS8vIDw2LDEsNSwwPjogQ29zdCAzIHZzbGRvaTggPDUsMCw2LDE+LCA8NSwwLDYsMT4KKyAgMzgzNDYxOTAwNVUsCS8vIDw2LDEsNSwxPjogQ29zdCA0IHZzbGRvaTEyIDwxLDUsMSw2PiwgPDEsNSwxLDY+CisgIDM4MzQ2OTI3NDJVLAkvLyA8NiwxLDUsMj46IENvc3QgNCB2c2xkb2kxMiA8MSw1LDIsNj4sIDwxLDUsMiw2PgorICAzODQ2MTk0MzE3VSwJLy8gPDYsMSw1LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MSw1LDMsND4KKyAgMzgzNDg0MDIxNlUsCS8vIDw2LDEsNSw0PjogQ29zdCA0IHZzbGRvaTEyIDwxLDUsNCw2PiwgPDEsNSw0LDY+CisgIDM4MzQ5MTM5NTNVLAkvLyA8NiwxLDUsNT46IENvc3QgNCB2c2xkb2kxMiA8MSw1LDUsNj4sIDwxLDUsNSw2PgorICAyNzE5OTc3NTcwVSwJLy8gPDYsMSw1LDY+OiBDb3N0IDMgdnNsZG9pOCA8NSx1LDYsMT4sIDw1LDYsNywwPgorICAzMzY3MjA4MTQzVSwJLy8gPDYsMSw1LDc+OiBDb3N0IDQgdm1yZ2x3IDwxLHUsNiw1PiwgPDEsNiwxLDc+CisgIDI3MTk5Nzc3MjRVLAkvLyA8NiwxLDUsdT46IENvc3QgMyB2c2xkb2k4IDw1LHUsNiwxPiwgPDUsdSw2LDE+CisgIDI2NjkxMjU3MzRVLAkvLyA8NiwxLDYsMD46IENvc3QgMyB2c2xkb2k0IDx1LDYsMSw2PiwgTEhTCisgIDIyNTQ4OTc5NzJVLAkvLyA8NiwxLDYsMT46IENvc3QgMyB2bXJnaHcgPDYsNiw2LDY+LCA8MSwxLDEsMT4KKyAgMjI1NDg5ODA3MFUsCS8vIDw2LDEsNiwyPjogQ29zdCAzIHZtcmdodyA8Niw2LDYsNj4sIDwxLDIsMywwPgorICAzNzc1ODAzOTI5VSwJLy8gPDYsMSw2LDM+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsMT4sIDw2LDMsMSw3PgorICAyNjY5MTI5MDE0VSwJLy8gPDYsMSw2LDQ+OiBDb3N0IDMgdnNsZG9pNCA8dSw2LDEsNj4sIFJIUworICAyMzIyMDA2MzU0VSwJLy8gPDYsMSw2LDU+OiBDb3N0IDMgdm1yZ2x3IDw2LDYsNiw2PiwgPDAsNCwxLDU+CisgIDI3MjU5NTAyNjRVLAkvLyA8NiwxLDYsNj46IENvc3QgMyB2c2xkb2k4IDw2LHUsNiwxPiwgPDYsNiw2LDY+CisgIDM3OTM3MjAxNDJVLAkvLyA8NiwxLDYsNz46IENvc3QgNCB2c2xkb2k4IDw1LHUsNiwxPiwgPDYsNywwLDE+CisgIDIyNTQ4OTg1NTZVLAkvLyA8NiwxLDYsdT46IENvc3QgMyB2bXJnaHcgPDYsNiw2LDY+LCA8MSx1LDMsMD4KKyAgMjYyNzMzMDE1MFUsCS8vIDw2LDEsNywwPjogQ29zdCAzIHZzbGRvaTQgPDEsNiwxLDc+LCBMSFMKKyAgMTIzNTY2NDkwNlUsCS8vIDw2LDEsNywxPjogQ29zdCAyIHZtcmdsdyBSSFMsIDwwLDAsMSwxPgorICAxMjM1NjY3MDk0VSwJLy8gPDYsMSw3LDI+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDMsMCwxLDI+CisgIDIzMDk0MDY4OTRVLAkvLyA8NiwxLDcsMz46IENvc3QgMyB2bXJnbHcgUkhTLCA8MCwyLDEsMz4KKyAgMjYyNzMzMzQzMFUsCS8vIDw2LDEsNyw0PjogQ29zdCAzIHZzbGRvaTQgPDEsNiwxLDc+LCBSSFMKKyAgMTIzNTY2NTIzNFUsCS8vIDw2LDEsNyw1PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwwLDQsMSw1PgorICAyMzA5NDA2ODk3VSwJLy8gPDYsMSw3LDY+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDAsMiwxLDY+CisgIDIzMDk0MDcyMjJVLAkvLyA8NiwxLDcsNz46IENvc3QgMyB2bXJnbHcgUkhTLCA8MCw2LDEsNz4KKyAgMTIzNTY2NDkxM1UsCS8vIDw2LDEsNyx1PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwwLDAsMSx1PgorICAyNjI3MzM4MzQyVSwJLy8gPDYsMSx1LDA+OiBDb3N0IDMgdnNsZG9pNCA8MSw2LDEsdT4sIExIUworICAxMjM1NjczMDk4VSwJLy8gPDYsMSx1LDE+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDAsMCwxLDE+CisgIDEyMzU2NzUyODZVLAkvLyA8NiwxLHUsMj46IENvc3QgMiB2bXJnbHcgUkhTLCA8MywwLDEsMj4KKyAgMjc3MjQ1MjczMlUsCS8vIDw2LDEsdSwzPjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsNSw2PiwgPDEsdSwzLDA+CisgIDI2MjczNDE2MjJVLAkvLyA8NiwxLHUsND46IENvc3QgMyB2c2xkb2k0IDwxLDYsMSx1PiwgUkhTCisgIDEyMzU2NzM0MjZVLAkvLyA8NiwxLHUsNT46IENvc3QgMiB2bXJnbHcgUkhTLCA8MCw0LDEsNT4KKyAgMjMwOTQxNTA4OVUsCS8vIDw2LDEsdSw2PjogQ29zdCAzIHZtcmdsdyBSSFMsIDwwLDIsMSw2PgorICAyMzA5NDE1NDE0VSwJLy8gPDYsMSx1LDc+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDAsNiwxLDc+CisgIDEyMzU2NzMxMDVVLAkvLyA8NiwxLHUsdT46IENvc3QgMiB2bXJnbHcgUkhTLCA8MCwwLDEsdT4KKyAgMzMyNDY4MzcyNVUsCS8vIDw2LDIsMCwwPjogQ29zdCA0IHZtcmdodyA8NiwwLDcsMD4sIDwyLDAsMywwPgorICAyNzI1MjkwMDg2VSwJLy8gPDYsMiwwLDE+OiBDb3N0IDMgdnNsZG9pOCA8Niw3LDYsMj4sIExIUworICAzNzcxMTYyODAxVSwJLy8gPDYsMiwwLDI+OiBDb3N0IDQgdnNsZG9pOCA8MiwxLDYsMj4sIDwwLDIsMSw2PgorICAyMzA5MzQ5NDc4VSwJLy8gPDYsMiwwLDM+OiBDb3N0IDMgdm1yZ2x3IDw0LDUsNiwwPiwgTEhTCisgIDM3MzA5NTE0NzhVLAkvLyA8NiwyLDAsND46IENvc3QgNCB2c2xkb2k0IDw2LDYsMiwwPiwgUkhTCisgIDM4NDA3Mzg3ODRVLAkvLyA8NiwyLDAsNT46IENvc3QgNCB2c2xkb2kxMiA8Miw1LDMsNj4sIDwyLDAsNSwxPgorICAzODQyNjU1NzIxVSwJLy8gPDYsMiwwLDY+OiBDb3N0IDQgdnNsZG9pMTIgPDIsdSwyLDY+LCA8MiwwLDYsMT4KKyAgMzczNjkyNTY3MVUsCS8vIDw2LDIsMCw3PjogQ29zdCA0IHZzbGRvaTQgPDcsNiwyLDA+LCA8Nyw2LDIsMD4KKyAgMjMwOTM0OTQ4M1UsCS8vIDw2LDIsMCx1PjogQ29zdCAzIHZtcmdsdyA8NCw1LDYsMD4sIExIUworICAzMzY3ODQwNDY4VSwJLy8gPDYsMiwxLDA+OiBDb3N0IDQgdm1yZ2x3IDwyLDAsNiwxPiwgPDMsNywyLDA+CisgIDMzMjUzNTU1NTFVLAkvLyA8NiwyLDEsMT46IENvc3QgNCB2bXJnaHcgPDYsMSw3LDE+LCA8MiwxLDMsMT4KKyAgMzM3MzE0Nzc1MlUsCS8vIDw2LDIsMSwyPjogQ29zdCA0IHZtcmdsdyA8Mix1LDYsMT4sIDwyLDIsMiwyPgorICAyMjk5NDA0MzkwVSwJLy8gPDYsMiwxLDM+OiBDb3N0IDMgdm1yZ2x3IDwyLHUsNiwxPiwgTEhTCisgIDM3MDEwOTk4MzBVLAkvLyA8NiwyLDEsND46IENvc3QgNSB2c2xkb2k0IDwxLDYsMiwxPiwgUkhTCisgIDM3Njc4NDYwNTRVLAkvLyA8NiwyLDEsNT46IENvc3QgNCB2c2xkb2k4IDwxLDUsNiwyPiwgPDEsNSw2LDI+CisgIDM4MjY2NTY4MjVVLAkvLyA8NiwyLDEsNj46IENvc3QgNCB2c2xkb2kxMiA8MCwyLDEsNj4sIDwyLDEsNiwwPgorICAzMzczMTQ3ODM4VSwJLy8gPDYsMiwxLDc+OiBDb3N0IDUgdm1yZ2x3IDwyLHUsNiwxPiwgPDIsMywyLDc+CisgIDIyOTk0MDQzOTVVLAkvLyA8NiwyLDEsdT46IENvc3QgMyB2bXJnbHcgPDIsdSw2LDE+LCBMSFMKKyAgMjY1NzIyMjc1OFUsCS8vIDw2LDIsMiwwPjogQ29zdCAzIHZzbGRvaTQgPDYsNiwyLDI+LCBMSFMKKyAgMzc3MTE2NDIxOVUsCS8vIDw2LDIsMiwxPjogQ29zdCA0IHZzbGRvaTggPDIsMSw2LDI+LCA8MiwxLDYsMj4KKyAgMjc2NjQ4MTAwMFUsCS8vIDw2LDIsMiwyPjogQ29zdCAzIHZzbGRvaTEyIDwyLDQsNSw2PiwgPDIsMiwyLDI+CisgIDI3NzI0NTI5NzhVLAkvLyA8NiwyLDIsMz46IENvc3QgMyB2c2xkb2kxMiA8Myw0LDUsNj4sIDwyLDIsMywzPgorICAyNjU3MjI2MDM4VSwJLy8gPDYsMiwyLDQ+OiBDb3N0IDMgdnNsZG9pNCA8Niw2LDIsMj4sIFJIUworICAzNzkwNDA3NTI4VSwJLy8gPDYsMiwyLDU+OiBDb3N0IDQgdnNsZG9pOCA8NSwzLDYsMj4sIDwyLDUsMyw2PgorICAyMjUyMjk0MDc0VSwJLy8gPDYsMiwyLDY+OiBDb3N0IDMgdm1yZ2h3IDw2LDIsNywzPiwgPDIsNiwzLDc+CisgIDIyNTIyOTQxNDhVLAkvLyA8NiwyLDIsNz46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8Miw3LDMsMD4KKyAgMjc3MjQ1MzAyM1UsCS8vIDw2LDIsMix1PjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsNSw2PiwgPDIsMix1LDM+CisgIDI3NzI0NTMwMzBVLAkvLyA8NiwyLDMsMD46IENvc3QgMyB2c2xkb2kxMiA8Myw0LDUsNj4sIDwyLDMsMCwxPgorICAzODM0MjUwOTMwVSwJLy8gPDYsMiwzLDE+OiBDb3N0IDQgdnNsZG9pMTIgPDEsNCw1LDY+LCA8MiwzLDEsND4KKyAgMjc2NTU5NjM0OVUsCS8vIDw2LDIsMywyPjogQ29zdCAzIHZzbGRvaTEyIDwyLDMsMiw2PiwgPDIsMywyLDY+CisgIDIzMDE0MTE0MzBVLAkvLyA8NiwyLDMsMz46IENvc3QgMyB2bXJnbHcgPDMsMiw2LDM+LCBMSFMKKyAgMjc3MjQ1MzA3MFUsCS8vIDw2LDIsMyw0PjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsNSw2PiwgPDIsMyw0LDU+CisgIDI3NjU4MTc1NjBVLAkvLyA8NiwyLDMsNT46IENvc3QgMyB2c2xkb2kxMiA8MiwzLDUsNj4sIDwyLDMsNSw2PgorICAyMjUyOTMzMDUwVSwJLy8gPDYsMiwzLDY+OiBDb3N0IDMgdm1yZ2h3IDw2LDMsNywwPiwgPDIsNiwzLDc+CisgIDI3OTYzNDA5NjhVLAkvLyA8NiwyLDMsNz46IENvc3QgMyB2c2xkb2kxMiA8Nyw0LDUsNj4sIDwyLDMsNyw0PgorICAyNzY2MDM4NzcxVSwJLy8gPDYsMiwzLHU+OiBDb3N0IDMgdnNsZG9pMTIgPDIsMyx1LDY+LCA8MiwzLHUsNj4KKyAgMzcyNTAwODk5OFUsCS8vIDw2LDIsNCwwPjogQ29zdCA0IHZzbGRvaTQgPDUsNiwyLDQ+LCBMSFMKKyAgMzM2ODUzMDIxN1UsCS8vIDw2LDIsNCwxPjogQ29zdCA1IHZtcmdsdyA8MiwxLDYsND4sIDw2LDAsMiwxPgorICAzODQwMjIyOTg5VSwJLy8gPDYsMiw0LDI+OiBDb3N0IDQgdnNsZG9pMTIgPDIsNCw1LDY+LCA8Miw0LDIsNT4KKyAgMjMwOTM4MjI0NlUsCS8vIDw2LDIsNCwzPjogQ29zdCAzIHZtcmdsdyA8NCw1LDYsND4sIExIUworICAzNzI1MDEyMjc4VSwJLy8gPDYsMiw0LDQ+OiBDb3N0IDQgdnNsZG9pNCA8NSw2LDIsND4sIFJIUworICAyNzY2NDgxMTkzVSwJLy8gPDYsMiw0LDU+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNCw1LDY+LCA8Miw0LDUsNj4KKyAgMzg0MjY1NjA0OVUsCS8vIDw2LDIsNCw2PjogQ29zdCA0IHZzbGRvaTEyIDwyLHUsMiw2PiwgPDIsNCw2LDU+CisgIDMzMjcwMTA4MjBVLAkvLyA8NiwyLDQsNz46IENvc3QgNCB2bXJnaHcgPDYsNCwyLDU+LCA8Miw3LDMsMD4KKyAgMjc2NjcwMjQwNFUsCS8vIDw2LDIsNCx1PjogQ29zdCAzIHZzbGRvaTEyIDwyLDQsdSw2PiwgPDIsNCx1LDY+CisgIDM3MTMwNzMyNTRVLAkvLyA8NiwyLDUsMD46IENvc3QgNCB2c2xkb2k0IDwzLDYsMiw1PiwgTEhTCisgIDM3ODkwODIzMTBVLAkvLyA8NiwyLDUsMT46IENvc3QgNCB2c2xkb2k4IDw1LDEsNiwyPiwgPDUsMSw2LDI+CisgIDM4NDA2NjU0MzlVLAkvLyA8NiwyLDUsMj46IENvc3QgNCB2c2xkb2kxMiA8Miw1LDIsNj4sIDwyLDUsMiw2PgorICAyNzY2OTk3MzUyVSwJLy8gPDYsMiw1LDM+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNSwzLDY+LCA8Miw1LDMsNj4KKyAgMzcxMzA3NjUzNFUsCS8vIDw2LDIsNSw0PjogQ29zdCA0IHZzbGRvaTQgPDMsNiwyLDU+LCBSSFMKKyAgMzc5MTczNjg0MlUsCS8vIDw2LDIsNSw1PjogQ29zdCA0IHZzbGRvaTggPDUsNSw2LDI+LCA8NSw1LDYsMj4KKyAgMzM3MzE4MDYwNVUsCS8vIDw2LDIsNSw2PjogQ29zdCA0IHZtcmdsdyA8Mix1LDYsNT4sIDwyLDMsMiw2PgorICAzNzkzMDY0MTA4VSwJLy8gPDYsMiw1LDc+OiBDb3N0IDQgdnNsZG9pOCA8NSw3LDYsMj4sIDw1LDcsNiwyPgorICAyNzY3MzY2MDM3VSwJLy8gPDYsMiw1LHU+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNSx1LDY+LCA8Miw1LHUsNj4KKyAgMzcwMTEzNzUxMFUsCS8vIDw2LDIsNiwwPjogQ29zdCA0IHZzbGRvaTQgPDEsNiwyLDY+LCBMSFMKKyAgMzcwMTEzODY0N1UsCS8vIDw2LDIsNiwxPjogQ29zdCA0IHZzbGRvaTQgPDEsNiwyLDY+LCA8MSw2LDIsNj4KKyAgMjI1NDg5ODc5MlUsCS8vIDw2LDIsNiwyPjogQ29zdCAzIHZtcmdodyA8Niw2LDYsNj4sIDwyLDIsMiwyPgorICAxMjQ4MjY0Mjk0VSwJLy8gPDYsMiw2LDM+OiBDb3N0IDIgdm1yZ2x3IDw2LDYsNiw2PiwgTEhTCisgIDM3MDExNDA3OTBVLAkvLyA8NiwyLDYsND46IENvc3QgNCB2c2xkb2k0IDwxLDYsMiw2PiwgUkhTCisgIDM3MjUwMjk0MzVVLAkvLyA8NiwyLDYsNT46IENvc3QgNCB2c2xkb2k0IDw1LDYsMiw2PiwgPDUsNiwyLDY+CisgIDIyNTQ4OTkxMzBVLAkvLyA8NiwyLDYsNj46IENvc3QgMyB2bXJnaHcgPDYsNiw2LDY+LCA8Miw2LDMsNz4KKyAgMjcyNTI5NDk4MVUsCS8vIDw2LDIsNiw3PjogQ29zdCAzIHZzbGRvaTggPDYsNyw2LDI+LCA8Niw3LDYsMj4KKyAgMTI0ODI2NDI5OVUsCS8vIDw2LDIsNix1PjogQ29zdCAyIHZtcmdsdyA8Niw2LDYsNj4sIExIUworICAyNjMzMzc1ODQ2VSwJLy8gPDYsMiw3LDA+OiBDb3N0IDMgdnNsZG9pNCA8Miw2LDIsNz4sIExIUworICAyMzA5NDA3NDY4VSwJLy8gPDYsMiw3LDE+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDEsMCwyLDE+CisgIDEyMzU2NjY1MzZVLAkvLyA8NiwyLDcsMj46IENvc3QgMiB2bXJnbHcgUkhTLCA8MiwyLDIsMj4KKyAgMTYxOTIzMTc0VSwJLy8gPDYsMiw3LDM+OiBDb3N0IDEgdm1yZ2x3IFJIUywgTEhTCisgIDI2MzMzNzkxMjZVLAkvLyA8NiwyLDcsND46IENvc3QgMyB2c2xkb2k0IDwyLDYsMiw3PiwgUkhTCisgIDIzMDk0MDc3OTZVLAkvLyA8NiwyLDcsNT46IENvc3QgMyB2bXJnbHcgUkhTLCA8MSw0LDIsNT4KKyAgMjMwOTQwODQ0NVUsCS8vIDw2LDIsNyw2PjogQ29zdCAzIHZtcmdsdyBSSFMsIDwyLDMsMiw2PgorICAyMzA5NDA3OTYwVSwJLy8gPDYsMiw3LDc+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDEsNiwyLDc+CisgIDE2MTkyMzE3OVUsCS8vIDw2LDIsNyx1PjogQ29zdCAxIHZtcmdsdyBSSFMsIExIUworICAyNjMzMzg0MDM4VSwJLy8gPDYsMix1LDA+OiBDb3N0IDMgdnNsZG9pNCA8Miw2LDIsdT4sIExIUworICAyMzA5NDE1NjYwVSwJLy8gPDYsMix1LDE+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDEsMCwyLDE+CisgIDEyMzU2NzQ3MjhVLAkvLyA8NiwyLHUsMj46IENvc3QgMiB2bXJnbHcgUkhTLCA8MiwyLDIsMj4KKyAgMTYxOTMxMzY2VSwJLy8gPDYsMix1LDM+OiBDb3N0IDEgdm1yZ2x3IFJIUywgTEhTCisgIDI2MzMzODczMThVLAkvLyA8NiwyLHUsND46IENvc3QgMyB2c2xkb2k0IDwyLDYsMix1PiwgUkhTCisgIDI3NjkxMzU3MjVVLAkvLyA8NiwyLHUsNT46IENvc3QgMyB2c2xkb2kxMiA8Mix1LDUsNj4sIDwyLHUsNSw2PgorICAyMzA5NDE2NjM3VSwJLy8gPDYsMix1LDY+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDIsMywyLDY+CisgIDIzMDk0MTYxNTJVLAkvLyA8NiwyLHUsNz46IENvc3QgMyB2bXJnbHcgUkhTLCA8MSw2LDIsNz4KKyAgMTYxOTMxMzcxVSwJLy8gPDYsMix1LHU+OiBDb3N0IDEgdm1yZ2x3IFJIUywgTEhTCisgIDM3Nzc4MDYzMzZVLAkvLyA8NiwzLDAsMD46IENvc3QgNCB2c2xkb2k4IDwzLDIsNiwzPiwgPDAsMCwwLDA+CisgIDI3MDQwNjQ2MTRVLAkvLyA8NiwzLDAsMT46IENvc3QgMyB2c2xkb2k4IDwzLDIsNiwzPiwgTEhTCisgIDM3NjU4NjI1NzdVLAkvLyA8NiwzLDAsMj46IENvc3QgNCB2c2xkb2k4IDwxLDIsNiwzPiwgPDAsMiwxLDY+CisgIDM4NDMzOTM3MDhVLAkvLyA8NiwzLDAsMz46IENvc3QgNCB2c2xkb2kxMiA8MywwLDMsNj4sIDwzLDAsMyw2PgorICAyMjUwNTE2OTk0VSwJLy8gPDYsMywwLDQ+OiBDb3N0IDMgdm1yZ2h3IDw2LDAsMSwyPiwgPDMsNCw1LDY+CisgIDM3MjUwNTQwMTRVLAkvLyA8NiwzLDAsNT46IENvc3QgNCB2c2xkb2k0IDw1LDYsMywwPiwgPDUsNiwzLDA+CisgIDMzODMwOTMwOTZVLAkvLyA8NiwzLDAsNj46IENvc3QgNCB2bXJnbHcgPDQsNSw2LDA+LCA8Miw1LDMsNj4KKyAgMzM2ODQ5NTAzNFUsCS8vIDw2LDMsMCw3PjogQ29zdCA0IHZtcmdsdyA8MiwxLDYsMD4sIDwyLDYsMyw3PgorICAyNzA0MDY1MTgxVSwJLy8gPDYsMywwLHU+OiBDb3N0IDMgdnNsZG9pOCA8MywyLDYsMz4sIExIUworICAyMjUxNjIyNTUwVSwJLy8gPDYsMywxLDA+OiBDb3N0IDMgdm1yZ2h3IDw2LDEsNywyPiwgPDMsMCwxLDI+CisgIDM3Nzc4MDcxNTZVLAkvLyA8NiwzLDEsMT46IENvc3QgNCB2c2xkb2k4IDwzLDIsNiwzPiwgPDEsMSwxLDE+CisgIDM3NjU4NjMzNDhVLAkvLyA8NiwzLDEsMj46IENvc3QgNCB2c2xkb2k4IDwxLDIsNiwzPiwgPDEsMiw2LDM+CisgIDMzNzMxNDc3NjJVLAkvLyA8NiwzLDEsMz46IENvc3QgNCB2bXJnbHcgPDIsdSw2LDE+LCA8MiwyLDMsMz4KKyAgMzgzNDI1MTUyNVUsCS8vIDw2LDMsMSw0PjogQ29zdCA0IHZzbGRvaTEyIDwxLDQsNSw2PiwgPDMsMSw0LDU+CisgIDMzNzMxNDc2ODNVLAkvLyA8NiwzLDEsNT46IENvc3QgNSB2bXJnbHcgPDIsdSw2LDE+LCA8MiwxLDMsNT4KKyAgMzM5MTcyNzU0NVUsCS8vIDw2LDMsMSw2PjogQ29zdCA0IHZtcmdsdyA8NiwwLDYsMT4sIDwyLDYsMyw2PgorICAyMjk5NDA2MjY2VSwJLy8gPDYsMywxLDc+OiBDb3N0IDMgdm1yZ2x3IDwyLHUsNiwxPiwgPDIsNiwzLDc+CisgIDIyNTE2MjI1NTBVLAkvLyA8NiwzLDEsdT46IENvc3QgMyB2bXJnaHcgPDYsMSw3LDI+LCA8MywwLDEsMj4KKyAgMjI1MjI5NDI5NFUsCS8vIDw2LDMsMiwwPjogQ29zdCAzIHZtcmdodyA8NiwyLDcsMz4sIDwzLDAsMSwyPgorICAzMzI2MDM2MTk4VSwJLy8gPDYsMywyLDE+OiBDb3N0IDQgdm1yZ2h3IDw2LDIsNywzPiwgPDMsMSwxLDE+CisgIDM3NzE4MzYwNDVVLAkvLyA8NiwzLDIsMj46IENvc3QgNCB2c2xkb2k4IDwyLDIsNiwzPiwgPDIsMiw2LDM+CisgIDIyNTIyOTQ1NTZVLAkvLyA8NiwzLDIsMz46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8MywzLDMsMz4KKyAgMjI1MjI5NDY1OFUsCS8vIDw2LDMsMiw0PjogQ29zdCAzIHZtcmdodyA8NiwyLDcsMz4sIDwzLDQsNSw2PgorICAzODQwNzM5Njc3VSwJLy8gPDYsMywyLDU+OiBDb3N0IDQgdnNsZG9pMTIgPDIsNSwzLDY+LCA8MywyLDUsMz4KKyAgMjcwNDA2NjQ5MFUsCS8vIDw2LDMsMiw2PjogQ29zdCAzIHZzbGRvaTggPDMsMiw2LDM+LCA8Miw2LDMsNz4KKyAgMzM2ODUxMTQxOFUsCS8vIDw2LDMsMiw3PjogQ29zdCA0IHZtcmdsdyA8MiwxLDYsMj4sIDwyLDYsMyw3PgorICAyMjUyMjk0OTQyVSwJLy8gPDYsMywyLHU+OiBDb3N0IDMgdm1yZ2h3IDw2LDIsNywzPiwgPDMsdSwxLDI+CisgIDM3MDcxNTg2MzBVLAkvLyA8NiwzLDMsMD46IENvc3QgNCB2c2xkb2k0IDwyLDYsMywzPiwgTEhTCisgIDM3NjU4NjQ2OTJVLAkvLyA8NiwzLDMsMT46IENvc3QgNSB2c2xkb2k4IDwxLDIsNiwzPiwgPDMsMSwyLDY+CisgIDI3MDQwNjY5MThVLAkvLyA8NiwzLDMsMj46IENvc3QgMyB2c2xkb2k4IDwzLDIsNiwzPiwgPDMsMiw2LDM+CisgIDI3NzI0NTM3ODhVLAkvLyA8NiwzLDMsMz46IENvc3QgMyB2c2xkb2kxMiA8Myw0LDUsNj4sIDwzLDMsMywzPgorICAyNzcyNDUzNzk5VSwJLy8gPDYsMywzLDQ+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNCw1LDY+LCA8MywzLDQsNT4KKyAgMzc4OTc1Mjg4OFUsCS8vIDw2LDMsMyw1PjogQ29zdCA0IHZzbGRvaTggPDUsMiw2LDM+LCA8Myw1LDIsNj4KKyAgMzg0MDczOTc3MFUsCS8vIDw2LDMsMyw2PjogQ29zdCA0IHZzbGRvaTEyIDwyLDUsMyw2PiwgPDMsMyw2LDY+CisgIDIzMDE0MTMzMDZVLAkvLyA8NiwzLDMsNz46IENvc3QgMyB2bXJnbHcgPDMsMiw2LDM+LCA8Miw2LDMsNz4KKyAgMjc3NTEwODA0M1UsCS8vIDw2LDMsMyx1PjogQ29zdCAzIHZzbGRvaTEyIDwzLHUsNSw2PiwgPDMsMyx1LDU+CisgIDI2NTEzNDA5MDJVLAkvLyA8NiwzLDQsMD46IENvc3QgMyB2c2xkb2k0IDw1LDYsMyw0PiwgTEhTCisgIDM4NDYxOTU2NzRVLAkvLyA8NiwzLDQsMT46IENvc3QgNCB2c2xkb2kxMiA8Myw0LDUsNj4sIDwzLDQsMSwyPgorICAzODQ1OTc0NTAzVSwJLy8gPDYsMyw0LDI+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNCwyLDY+LCA8Myw0LDIsNj4KKyAgMjY1MTM0MzM2MlUsCS8vIDw2LDMsNCwzPjogQ29zdCAzIHZzbGRvaTQgPDUsNiwzLDQ+LCA8Myw0LDUsNj4KKyAgMjY1MTM0NDE4MlUsCS8vIDw2LDMsNCw0PjogQ29zdCAzIHZzbGRvaTQgPDUsNiwzLDQ+LCBSSFMKKyAgMTY5ODcxMjA2NlUsCS8vIDw2LDMsNCw1PjogQ29zdCAyIHZzbGRvaTEyIDwzLDQsNSw2PiwgPDMsNCw1LDY+CisgIDMzODMxMjU4NjRVLAkvLyA8NiwzLDQsNj46IENvc3QgNCB2bXJnbHcgPDQsNSw2LDQ+LCA8Miw1LDMsNj4KKyAgMzM2ODUyNzgwMlUsCS8vIDw2LDMsNCw3PjogQ29zdCA0IHZtcmdsdyA8MiwxLDYsND4sIDwyLDYsMyw3PgorICAxNjk4OTMzMjc3VSwJLy8gPDYsMyw0LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDMsNCx1LDY+LCA8Myw0LHUsNj4KKyAgMzM3MzE3OTc5OFUsCS8vIDw2LDMsNSwwPjogQ29zdCA0IHZtcmdsdyA8Mix1LDYsNT4sIDwxLDIsMywwPgorICAzNzA3MTc2MTc5VSwJLy8gPDYsMyw1LDE+OiBDb3N0IDUgdnNsZG9pNCA8Miw2LDMsNT4sIDwxLDYsNSw3PgorICAyNzE2MDEyMzEyVSwJLy8gPDYsMyw1LDI+OiBDb3N0IDMgdnNsZG9pOCA8NSwyLDYsMz4sIDw1LDIsNiwzPgorICAzMzczMTgwNTMwVSwJLy8gPDYsMyw1LDM+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsNiw1PiwgPDIsMiwzLDM+CisgIDIyNTQzMDk4OTBVLAkvLyA8NiwzLDUsND46IENvc3QgMyB2bXJnaHcgPDYsNSw3LDY+LCA8Myw0LDUsNj4KKyAgMzc4NTc3MzA3MFUsCS8vIDw2LDMsNSw1PjogQ29zdCA0IHZzbGRvaTggPDQsNSw2LDM+LCA8NSw1LDYsNj4KKyAgMzg0MDczOTkzMlUsCS8vIDw2LDMsNSw2PjogQ29zdCA0IHZzbGRvaTEyIDwyLDUsMyw2PiwgPDMsNSw2LDY+CisgIDIyOTk0MzkwMzRVLAkvLyA8NiwzLDUsNz46IENvc3QgMyB2bXJnbHcgPDIsdSw2LDU+LCA8Miw2LDMsNz4KKyAgMjcxOTk5NDExMFUsCS8vIDw2LDMsNSx1PjogQ29zdCAzIHZzbGRvaTggPDUsdSw2LDM+LCA8NSx1LDYsMz4KKyAgMjI1NDg5OTM1MFUsCS8vIDw2LDMsNiwwPjogQ29zdCAzIHZtcmdodyA8Niw2LDYsNj4sIDwzLDAsMSwyPgorICAzMzI4NjQxMjU0VSwJLy8gPDYsMyw2LDE+OiBDb3N0IDQgdm1yZ2h3IDw2LDYsNiw2PiwgPDMsMSwxLDE+CisgIDI2MzM0NDMyNTdVLAkvLyA8NiwzLDYsMj46IENvc3QgMyB2c2xkb2k0IDwyLDYsMyw2PiwgPDIsNiwzLDY+CisgIDIyNTQ4OTk2MTJVLAkvLyA8NiwzLDYsMz46IENvc3QgMyB2bXJnaHcgPDYsNiw2LDY+LCA8MywzLDMsMz4KKyAgMjI1NDg5OTcxNFUsCS8vIDw2LDMsNiw0PjogQ29zdCAzIHZtcmdodyA8Niw2LDYsNj4sIDwzLDQsNSw2PgorICAzNzg1NzczNzcyVSwJLy8gPDYsMyw2LDU+OiBDb3N0IDQgdnNsZG9pOCA8NCw1LDYsMz4sIDw2LDUsMyw2PgorICAyNzI1OTY2NjQ4VSwJLy8gPDYsMyw2LDY+OiBDb3N0IDMgdnNsZG9pOCA8Nix1LDYsMz4sIDw2LDYsNiw2PgorICAyMzIyMDA3OTk0VSwJLy8gPDYsMyw2LDc+OiBDb3N0IDMgdm1yZ2x3IDw2LDYsNiw2PiwgPDIsNiwzLDc+CisgIDIyNTQ4OTk5OThVLAkvLyA8NiwzLDYsdT46IENvc3QgMyB2bXJnaHcgPDYsNiw2LDY+LCA8Myx1LDEsMj4KKyAgMTU1OTcwNzc1MFUsCS8vIDw2LDMsNywwPjogQ29zdCAyIHZzbGRvaTQgPDIsNiwzLDc+LCBMSFMKKyAgMjYzMzQ1MDI5MlUsCS8vIDw2LDMsNywxPjogQ29zdCAzIHZzbGRvaTQgPDIsNiwzLDc+LCA8MSwxLDEsMT4KKyAgMTU1OTcwOTYyNlUsCS8vIDw2LDMsNywyPjogQ29zdCAyIHZzbGRvaTQgPDIsNiwzLDc+LCA8Miw2LDMsNz4KKyAgMTIzNTY2NjU0NlUsCS8vIDw2LDMsNywzPjogQ29zdCAyIHZtcmdsdyBSSFMsIDwyLDIsMywzPgorICAxNTU5NzExMDMwVSwJLy8gPDYsMyw3LDQ+OiBDb3N0IDIgdnNsZG9pNCA8Miw2LDMsNz4sIFJIUworICAyMzA5NDA4MjkxVSwJLy8gPDYsMyw3LDU+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDIsMSwzLDU+CisgIDI2MzM0NTQxNTJVLAkvLyA8NiwzLDcsNj46IENvc3QgMyB2c2xkb2k0IDwyLDYsMyw3PiwgPDYsMyw3LDA+CisgIDEyMzU2NjY4NzRVLAkvLyA8NiwzLDcsNz46IENvc3QgMiB2bXJnbHcgUkhTLCA8Miw2LDMsNz4KKyAgMTU1OTcxMzU4MlUsCS8vIDw2LDMsNyx1PjogQ29zdCAyIHZzbGRvaTQgPDIsNiwzLDc+LCBMSFMKKyAgMTU1OTcxNTk0MlUsCS8vIDw2LDMsdSwwPjogQ29zdCAyIHZzbGRvaTQgPDIsNiwzLHU+LCBMSFMKKyAgMjYzMzQ1ODQ4NFUsCS8vIDw2LDMsdSwxPjogQ29zdCAzIHZzbGRvaTQgPDIsNiwzLHU+LCA8MSwxLDEsMT4KKyAgMTU1OTcxNzgxOVUsCS8vIDw2LDMsdSwyPjogQ29zdCAyIHZzbGRvaTQgPDIsNiwzLHU+LCA8Miw2LDMsdT4KKyAgMTIzNTY3NDczOFUsCS8vIDw2LDMsdSwzPjogQ29zdCAyIHZtcmdsdyBSSFMsIDwyLDIsMywzPgorICAxNTU5NzE5MjIyVSwJLy8gPDYsMyx1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8Miw2LDMsdT4sIFJIUworICAxNzAxMzY2NTk4VSwJLy8gPDYsMyx1LDU+OiBDb3N0IDIgdnNsZG9pMTIgPDMsdSw1LDY+LCA8Myx1LDUsNj4KKyAgMjYzMzQ2MjM1M1UsCS8vIDw2LDMsdSw2PjogQ29zdCAzIHZzbGRvaTQgPDIsNiwzLHU+LCA8NiwzLHUsMD4KKyAgMTIzNTY3NTA2NlUsCS8vIDw2LDMsdSw3PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwyLDYsMyw3PgorICAxNTU5NzIxNzc0VSwJLy8gPDYsMyx1LHU+OiBDb3N0IDIgdnNsZG9pNCA8Miw2LDMsdT4sIExIUworICAzNzg1Nzc3MTUyVSwJLy8gPDYsNCwwLDA+OiBDb3N0IDQgdnNsZG9pOCA8NCw1LDYsND4sIDwwLDAsMCwwPgorICAyNzEyMDM1NDMwVSwJLy8gPDYsNCwwLDE+OiBDb3N0IDMgdnNsZG9pOCA8NCw1LDYsND4sIExIUworICAzNzcxMTc5MTg1VSwJLy8gPDYsNCwwLDI+OiBDb3N0IDQgdnNsZG9pOCA8MiwxLDYsND4sIDwwLDIsMSw2PgorICAzODQ2MTk2MDk2VSwJLy8gPDYsNCwwLDM+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNCw1LDY+LCA8NCwwLDMsMT4KKyAgMzc4NTc3NzQ5MFUsCS8vIDw2LDQsMCw0PjogQ29zdCA0IHZzbGRvaTggPDQsNSw2LDQ+LCA8MCw0LDEsNT4KKyAgMjI1MDUxNzgxNFUsCS8vIDw2LDQsMCw1PjogQ29zdCAzIHZtcmdodyA8NiwwLDEsMj4sIFJIUworICAzMzI0MjU5NzAzVSwJLy8gPDYsNCwwLDY+OiBDb3N0IDQgdm1yZ2h3IDw2LDAsMSwyPiwgPDQsNiw1LDA+CisgIDMzODMwOTI0NThVLAkvLyA8Niw0LDAsNz46IENvc3QgNSB2bXJnbHcgPDQsNSw2LDA+LCA8MSw2LDQsNz4KKyAgMjcxMjAzNTk5N1UsCS8vIDw2LDQsMCx1PjogQ29zdCAzIHZzbGRvaTggPDQsNSw2LDQ+LCBMSFMKKyAgMzMyNTM1Njk0NlUsCS8vIDw2LDQsMSwwPjogQ29zdCA0IHZtcmdodyA8NiwxLDcsMT4sIDw0LDAsNSwxPgorICAzNzg1Nzc3OTcyVSwJLy8gPDYsNCwxLDE+OiBDb3N0IDQgdnNsZG9pOCA8NCw1LDYsND4sIDwxLDEsMSwxPgorICAzODQ2MTk2MTcwVSwJLy8gPDYsNCwxLDI+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNCw1LDY+LCA8NCwxLDIsMz4KKyAgMzMyNTM2NTM4MFUsCS8vIDw2LDQsMSwzPjogQ29zdCA0IHZtcmdodyA8NiwxLDcsMj4sIDw0LDMsNSwwPgorICAzODUyMTY4MTU1VSwJLy8gPDYsNCwxLDQ+OiBDb3N0IDQgdnNsZG9pMTIgPDQsNCw1LDY+LCA8NCwxLDQsMj4KKyAgMjI1MTYxNTU0MlUsCS8vIDw2LDQsMSw1PjogQ29zdCAzIHZtcmdodyA8NiwxLDcsMT4sIFJIUworICAzMzI1MzU3NDMyVSwJLy8gPDYsNCwxLDY+OiBDb3N0IDQgdm1yZ2h3IDw2LDEsNywxPiwgPDQsNiw1LDE+CisgIDM4NzAwODQwODhVLAkvLyA8Niw0LDEsNz46IENvc3QgNCB2c2xkb2kxMiA8Nyw0LDUsNj4sIDw0LDEsNyw0PgorICAyMjUxNjE1Nzg1VSwJLy8gPDYsNCwxLHU+OiBDb3N0IDMgdm1yZ2h3IDw2LDEsNywxPiwgUkhTCisgIDIyNTIyOTUwNThVLAkvLyA8Niw0LDIsMD46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8NCwwLDUsMT4KKyAgMzc3MTE4MDYwNVUsCS8vIDw2LDQsMiwxPjogQ29zdCA0IHZzbGRvaTggPDIsMSw2LDQ+LCA8MiwxLDYsND4KKyAgMzc4NTc3ODc5MlUsCS8vIDw2LDQsMiwyPjogQ29zdCA0IHZzbGRvaTggPDQsNSw2LDQ+LCA8MiwyLDIsMj4KKyAgMzc3NzgxNjI1M1UsCS8vIDw2LDQsMiwzPjogQ29zdCA0IHZzbGRvaTggPDMsMiw2LDQ+LCA8MiwzLDIsNj4KKyAgMjI1MjI5NTM3NlUsCS8vIDw2LDQsMiw0PjogQ29zdCAzIHZtcmdodyA8NiwyLDcsMz4sIDw0LDQsNCw0PgorICAxMTc4NTUzNjU0VSwJLy8gPDYsNCwyLDU+OiBDb3N0IDIgdm1yZ2h3IDw2LDIsNywzPiwgUkhTCisgIDIyNTIyOTU1NDVVLAkvLyA8Niw0LDIsNj46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8NCw2LDUsMj4KKyAgMzMyNjAzNzQ0OFUsCS8vIDw2LDQsMiw3PjogQ29zdCA0IHZtcmdodyA8NiwyLDcsMz4sIDw0LDcsNSwwPgorICAxMTc4NTUzODk3VSwJLy8gPDYsNCwyLHU+OiBDb3N0IDIgdm1yZ2h3IDw2LDIsNywzPiwgUkhTCisgIDM3ODU3NzkzNTBVLAkvLyA8Niw0LDMsMD46IENvc3QgNCB2c2xkb2k4IDw0LDUsNiw0PiwgPDMsMCwxLDI+CisgIDMzODMxMTg2NDhVLAkvLyA8Niw0LDMsMT46IENvc3QgNCB2bXJnbHcgPDQsNSw2LDM+LCA8Myx1LDQsMT4KKyAgMzc3NzgxNjkzNVUsCS8vIDw2LDQsMywyPjogQ29zdCA0IHZzbGRvaTggPDMsMiw2LDQ+LCA8MywyLDYsND4KKyAgMzc4NTc3OTYxMlUsCS8vIDw2LDQsMywzPjogQ29zdCA0IHZzbGRvaTggPDQsNSw2LDQ+LCA8MywzLDMsMz4KKyAgMjcxMjAzNzg5MFUsCS8vIDw2LDQsMyw0PjogQ29zdCAzIHZzbGRvaTggPDQsNSw2LDQ+LCA8Myw0LDUsNj4KKyAgMjI1Mjc1NDIzMFUsCS8vIDw2LDQsMyw1PjogQ29zdCAzIHZtcmdodyA8NiwzLDQsNT4sIFJIUworICAzNzg0NDUyNzY0VSwJLy8gPDYsNCwzLDY+OiBDb3N0IDQgdnNsZG9pOCA8NCwzLDYsND4sIDwzLDYsNCw3PgorICAzODAxNzA1MTc4VSwJLy8gPDYsNCwzLDc+OiBDb3N0IDQgdnNsZG9pOCA8NywyLDYsND4sIDwzLDcsMiw2PgorICAyMjUyNzU0NDczVSwJLy8gPDYsNCwzLHU+OiBDb3N0IDMgdm1yZ2h3IDw2LDMsNCw1PiwgUkhTCisgIDM3ODc3NzA3NzBVLAkvLyA8Niw0LDQsMD46IENvc3QgNCB2c2xkb2k4IDw0LHUsNiw0PiwgPDQsMCw1LDE+CisgIDMzODMxMjY4NDBVLAkvLyA8Niw0LDQsMT46IENvc3QgNCB2bXJnbHcgPDQsNSw2LDQ+LCA8Myx1LDQsMT4KKyAgMzMyNzM4MDUzNFUsCS8vIDw2LDQsNCwyPjogQ29zdCA0IHZtcmdodyA8Niw0LDcsNT4sIDw0LDIsNSwzPgorICAzNzg0NDUzMjY1VSwJLy8gPDYsNCw0LDM+OiBDb3N0IDQgdnNsZG9pOCA8NCwzLDYsND4sIDw0LDMsNiw0PgorICAyMjUzNjMwNjcyVSwJLy8gPDYsNCw0LDQ+OiBDb3N0IDMgdm1yZ2h3IDw2LDQsNyw0PiwgPDQsNCw0LDQ+CisgIDI3Nzg0MjY1ODdVLAkvLyA8Niw0LDQsNT46IENvc3QgMyB2c2xkb2kxMiA8NCw0LDUsNj4sIDw0LDQsNSw2PgorICAzMzgzMTI4Nzg5VSwJLy8gPDYsNCw0LDY+OiBDb3N0IDQgdm1yZ2x3IDw0LDUsNiw0PiwgPDYsNSw0LDY+CisgIDMzODE3OTk1ODBVLAkvLyA8Niw0LDQsNz46IENvc3QgNCB2bXJnbHcgPDQsMyw2LDQ+LCA8Myw2LDQsNz4KKyAgMjc3ODY0Nzc5OFUsCS8vIDw2LDQsNCx1PjogQ29zdCAzIHZzbGRvaTEyIDw0LDQsdSw2PiwgPDQsNCx1LDY+CisgIDI2NTE0MjI4MjJVLAkvLyA8Niw0LDUsMD46IENvc3QgMyB2c2xkb2k0IDw1LDYsNCw1PiwgTEhTCisgIDM3MDEyNzc5MjhVLAkvLyA8Niw0LDUsMT46IENvc3QgNCB2c2xkb2k0IDwxLDYsNCw1PiwgPDEsNiw0LDU+CisgIDM3MDEyNzg2NTBVLAkvLyA8Niw0LDUsMj46IENvc3QgNCB2c2xkb2k0IDwxLDYsNCw1PiwgPDIsNiwzLDc+CisgIDI2NTE0MjUyODJVLAkvLyA8Niw0LDUsMz46IENvc3QgMyB2c2xkb2k0IDw1LDYsNCw1PiwgPDMsNCw1LDY+CisgIDI2NTE0MjYxMDJVLAkvLyA8Niw0LDUsND46IENvc3QgMyB2c2xkb2k0IDw1LDYsNCw1PiwgUkhTCisgIDI2NTE0MjY4OTJVLAkvLyA8Niw0LDUsNT46IENvc3QgMyB2c2xkb2k0IDw1LDYsNCw1PiwgPDUsNiw0LDU+CisgIDE2OTg3MTI4ODZVLAkvLyA8Niw0LDUsNj46IENvc3QgMiB2c2xkb2kxMiA8Myw0LDUsNj4sIFJIUworICAzNzI1MTY5NjU4VSwJLy8gPDYsNCw1LDc+OiBDb3N0IDQgdnNsZG9pNCA8NSw2LDQsNT4sIDw3LDAsMSwyPgorICAxNjk4NzEyOTA0VSwJLy8gPDYsNCw1LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDMsNCw1LDY+LCBSSFMKKyAgMjI1NDkwMDExNFUsCS8vIDw2LDQsNiwwPjogQ29zdCAzIHZtcmdodyA8Niw2LDYsNj4sIDw0LDAsNSwxPgorICAzMzg5MTE1MTkyVSwJLy8gPDYsNCw2LDE+OiBDb3N0IDQgdm1yZ2x3IDw1LDUsNiw2PiwgPDMsdSw0LDE+CisgIDM3ODU3ODE3MjdVLAkvLyA8Niw0LDYsMj46IENvc3QgNCB2c2xkb2k4IDw0LDUsNiw0PiwgPDYsMiw0LDM+CisgIDM3ODU3ODE4MTBVLAkvLyA8Niw0LDYsMz46IENvc3QgNCB2c2xkb2k4IDw0LDUsNiw0PiwgPDYsMyw0LDU+CisgIDIyNTQ5MDA0MzJVLAkvLyA8Niw0LDYsND46IENvc3QgMyB2bXJnaHcgPDYsNiw2LDY+LCA8NCw0LDQsND4KKyAgMTE4MTE1ODcxMFUsCS8vIDw2LDQsNiw1PjogQ29zdCAyIHZtcmdodyA8Niw2LDYsNj4sIFJIUworICAyMjU0OTAwNjA1VSwJLy8gPDYsNCw2LDY+OiBDb3N0IDMgdm1yZ2h3IDw2LDYsNiw2PiwgPDQsNiw1LDY+CisgIDM3ODc3NzI3NTBVLAkvLyA8Niw0LDYsNz46IENvc3QgNCB2c2xkb2k4IDw0LHUsNiw0PiwgPDYsNywwLDE+CisgIDExODExNTg5NTNVLAkvLyA8Niw0LDYsdT46IENvc3QgMiB2bXJnaHcgPDYsNiw2LDY+LCBSSFMKKyAgMjYzOTQ5NTI3MFUsCS8vIDw2LDQsNywwPjogQ29zdCAzIHZzbGRvaTQgPDMsNiw0LDc+LCBMSFMKKyAgMjYzOTQ5NjA5MFUsCS8vIDw2LDQsNywxPjogQ29zdCAzIHZzbGRvaTQgPDMsNiw0LDc+LCA8MSwyLDMsND4KKyAgMzcwNzI2NzAxMVUsCS8vIDw2LDQsNywyPjogQ29zdCA0IHZzbGRvaTQgPDIsNiw0LDc+LCA8Miw2LDQsNz4KKyAgMjYzOTQ5Nzg4NFUsCS8vIDw2LDQsNywzPjogQ29zdCAzIHZzbGRvaTQgPDMsNiw0LDc+LCA8Myw2LDQsNz4KKyAgMTIzNzY1ODgzMlUsCS8vIDw2LDQsNyw0PjogQ29zdCAyIHZtcmdsdyBSSFMsIDw0LDQsNCw0PgorICAxMjM1NjY2NjM4VSwJLy8gPDYsNCw3LDU+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDIsMyw0LDU+CisgIDM3MTMyNDE3NTNVLAkvLyA8Niw0LDcsNj46IENvc3QgNCB2c2xkb2k0IDwzLDYsNCw3PiwgPDYsNCw3LDA+CisgIDIzMDk0MDk0MzZVLAkvLyA8Niw0LDcsNz46IENvc3QgMyB2bXJnbHcgUkhTLCA8Myw2LDQsNz4KKyAgMTIzNTY2NjY0MVUsCS8vIDw2LDQsNyx1PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwyLDMsNCx1PgorICAyNjM5NTAzNDYyVSwJLy8gPDYsNCx1LDA+OiBDb3N0IDMgdnNsZG9pNCA8Myw2LDQsdT4sIExIUworICAyNjM5NTA0MjgyVSwJLy8gPDYsNCx1LDE+OiBDb3N0IDMgdnNsZG9pNCA8Myw2LDQsdT4sIDwxLDIsMyw0PgorICAzNzAxMzAzMjI2VSwJLy8gPDYsNCx1LDI+OiBDb3N0IDQgdnNsZG9pNCA8MSw2LDQsdT4sIDwyLDYsMyw3PgorICAyNjM5NTA2MDc3VSwJLy8gPDYsNCx1LDM+OiBDb3N0IDMgdnNsZG9pNCA8Myw2LDQsdT4sIDwzLDYsNCx1PgorICAxMjM1Njc2MzY4VSwJLy8gPDYsNCx1LDQ+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDQsNCw0LDQ+CisgIDEyMzU2NzQ4MzBVLAkvLyA8Niw0LHUsNT46IENvc3QgMiB2bXJnbHcgUkhTLCA8MiwzLDQsNT4KKyAgMTY5ODcxMzEyOVUsCS8vIDw2LDQsdSw2PjogQ29zdCAyIHZzbGRvaTEyIDwzLDQsNSw2PiwgUkhTCisgIDIzMDk0MTc2MjhVLAkvLyA8Niw0LHUsNz46IENvc3QgMyB2bXJnbHcgUkhTLCA8Myw2LDQsNz4KKyAgMTY5ODcxMzE0N1UsCS8vIDw2LDQsdSx1PjogQ29zdCAyIHZzbGRvaTEyIDwzLDQsNSw2PiwgUkhTCisgIDM3NzU4MzIwNjRVLAkvLyA8Niw1LDAsMD46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiw1PiwgPDAsMCwwLDA+CisgIDI3MDIwOTAzNDJVLAkvLyA8Niw1LDAsMT46IENvc3QgMyB2c2xkb2k4IDwyLHUsNiw1PiwgTEhTCisgIDM3NzU4MzIyNDFVLAkvLyA8Niw1LDAsMj46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiw1PiwgPDAsMiwxLDY+CisgIDM3MTkyMjc5MDZVLAkvLyA8Niw1LDAsMz46IENvc3QgNCB2c2xkb2k0IDw0LDYsNSwwPiwgPDMsNCw1LDY+CisgIDM3NzU4MzI0MDJVLAkvLyA8Niw1LDAsND46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiw1PiwgPDAsNCwxLDU+CisgIDMzODUwODUxNDZVLAkvLyA8Niw1LDAsNT46IENvc3QgNCB2bXJnbHcgPDQsdSw2LDA+LCA8NCw0LDUsNT4KKyAgMjMwOTM1MTkzOFUsCS8vIDw2LDUsMCw2PjogQ29zdCAzIHZtcmdsdyA8NCw1LDYsMD4sIDwzLDQsNSw2PgorICAzMzc2NDU5MTM0VSwJLy8gPDYsNSwwLDc+OiBDb3N0IDUgdm1yZ2x3IDwzLDQsNiwwPiwgPDQsNiw1LDc+CisgIDI3MDIwOTA5MDlVLAkvLyA8Niw1LDAsdT46IENvc3QgMyB2c2xkb2k4IDwyLHUsNiw1PiwgTEhTCisgIDM3MTkyMzM1NDZVLAkvLyA8Niw1LDEsMD46IENvc3QgNCB2c2xkb2k0IDw0LDYsNSwxPiwgPDAsMCwxLDE+CisgIDM3NzU4MzI4ODRVLAkvLyA8Niw1LDEsMT46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiw1PiwgPDEsMSwxLDE+CisgIDM3NzU4MzI5ODJVLAkvLyA8Niw1LDEsMj46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiw1PiwgPDEsMiwzLDA+CisgIDM4NDYxOTY5MDlVLAkvLyA8Niw1LDEsMz46IENvc3QgNCB2c2xkb2kxMiA8Myw0LDUsNj4sIDw1LDEsMyw0PgorICAzNzE5MjM2OTg0VSwJLy8gPDYsNSwxLDQ+OiBDb3N0IDQgdnNsZG9pNCA8NCw2LDUsMT4sIDw0LDYsNSwxPgorICAzODU2MTUwMjA5VSwJLy8gPDYsNSwxLDU+OiBDb3N0IDQgdnNsZG9pMTIgPDUsMSw1LDY+LCA8NSwxLDUsNj4KKyAgMzgzNDI1Mjk5N1UsCS8vIDw2LDUsMSw2PjogQ29zdCA0IHZzbGRvaTEyIDwxLDQsNSw2PiwgPDUsMSw2LDE+CisgIDM4NzAwODQ4MTdVLAkvLyA8Niw1LDEsNz46IENvc3QgNCB2c2xkb2kxMiA8Nyw0LDUsNj4sIDw1LDEsNyw0PgorICAzNzY5ODYxNTMyVSwJLy8gPDYsNSwxLHU+OiBDb3N0IDQgdnNsZG9pOCA8MSx1LDYsNT4sIDwxLHUsNiw1PgorICAyNjQ1NTAwMDA2VSwJLy8gPDYsNSwyLDA+OiBDb3N0IDMgdnNsZG9pNCA8NCw2LDUsMj4sIExIUworICAzNzE5MjQyNTQ4VSwJLy8gPDYsNSwyLDE+OiBDb3N0IDQgdnNsZG9pNCA8NCw2LDUsMj4sIDwxLDEsMSwxPgorICAzNzc1ODMzNzA0VSwJLy8gPDYsNSwyLDI+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsNT4sIDwyLDIsMiwyPgorICAzNzc1ODMzNzY2VSwJLy8gPDYsNSwyLDM+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsNT4sIDwyLDMsMCwxPgorICAyNjQ1NTAzMzUzVSwJLy8gPDYsNSwyLDQ+OiBDb3N0IDMgdnNsZG9pNCA8NCw2LDUsMj4sIDw0LDYsNSwyPgorICAyMjUyMjk2MTk2VSwJLy8gPDYsNSwyLDU+OiBDb3N0IDMgdm1yZ2h3IDw2LDIsNywzPiwgPDUsNSw1LDU+CisgIDI3MDIwOTIyMThVLAkvLyA8Niw1LDIsNj46IENvc3QgMyB2c2xkb2k4IDwyLHUsNiw1PiwgPDIsNiwzLDc+CisgIDM3MTkyNDY4NDJVLAkvLyA8Niw1LDIsNz46IENvc3QgNCB2c2xkb2k0IDw0LDYsNSwyPiwgPDcsMCwxLDI+CisgIDI3MDIwOTI0MDVVLAkvLyA8Niw1LDIsdT46IENvc3QgMyB2c2xkb2k4IDwyLHUsNiw1PiwgPDIsdSw2LDU+CisgIDM3NzU4MzQyNjJVLAkvLyA8Niw1LDMsMD46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiw1PiwgPDMsMCwxLDI+CisgIDM3NzcxNjE0OTVVLAkvLyA8Niw1LDMsMT46IENvc3QgNCB2c2xkb2k4IDwzLDEsNiw1PiwgPDMsMSw2LDU+CisgIDM3NzU4MzQ0NzBVLAkvLyA8Niw1LDMsMj46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiw1PiwgPDMsMiw2LDM+CisgIDM3NzU4MzQ1MjRVLAkvLyA8Niw1LDMsMz46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiw1PiwgPDMsMywzLDM+CisgIDM3NzU4MzQ2MjZVLAkvLyA8Niw1LDMsND46IENvc3QgNCB2c2xkb2k4IDwyLHUsNiw1PiwgPDMsNCw1LDY+CisgIDMzODUxMDk3MjJVLAkvLyA8Niw1LDMsNT46IENvc3QgNCB2bXJnbHcgPDQsdSw2LDM+LCA8NCw0LDUsNT4KKyAgMjMwOTM3NjUxNFUsCS8vIDw2LDUsMyw2PjogQ29zdCAzIHZtcmdsdyA8NCw1LDYsMz4sIDwzLDQsNSw2PgorICAzNzc1ODM0ODE5VSwJLy8gPDYsNSwzLDc+OiBDb3N0IDQgdnNsZG9pOCA8Mix1LDYsNT4sIDwzLDcsMCwxPgorICAyMzA5Mzc2NTE0VSwJLy8gPDYsNSwzLHU+OiBDb3N0IDMgdm1yZ2x3IDw0LDUsNiwzPiwgPDMsNCw1LDY+CisgIDM3MTkyNTgyMTRVLAkvLyA8Niw1LDQsMD46IENvc3QgNCB2c2xkb2k0IDw0LDYsNSw0PiwgTEhTCisgIDMzODUxMTc1ODZVLAkvLyA8Niw1LDQsMT46IENvc3QgNCB2bXJnbHcgPDQsdSw2LDQ+LCA8NCwwLDUsMT4KKyAgMzMyNzI0MjAwOFUsCS8vIDw2LDUsNCwyPjogQ29zdCA0IHZtcmdodyA8Niw0LDUsNj4sIDw1LDIsNiwzPgorICAzNzE5MjYwNjc0VSwJLy8gPDYsNSw0LDM+OiBDb3N0IDQgdnNsZG9pNCA8NCw2LDUsND4sIDwzLDQsNSw2PgorICAzNzE5MjYxNTYzVSwJLy8gPDYsNSw0LDQ+OiBDb3N0IDQgdnNsZG9pNCA8NCw2LDUsND4sIDw0LDYsNSw0PgorICAyNzAyMDkzNjIyVSwJLy8gPDYsNSw0LDU+OiBDb3N0IDMgdnNsZG9pOCA8Mix1LDYsNT4sIFJIUworICAyMzA5Mzg0NzA2VSwJLy8gPDYsNSw0LDY+OiBDb3N0IDMgdm1yZ2x3IDw0LDUsNiw0PiwgPDMsNCw1LDY+CisgIDM4NzAwODUwNjBVLAkvLyA8Niw1LDQsNz46IENvc3QgNCB2c2xkb2kxMiA8Nyw0LDUsNj4sIDw1LDQsNyw0PgorICAyNzAyMDkzODY1VSwJLy8gPDYsNSw0LHU+OiBDb3N0IDMgdnNsZG9pOCA8Mix1LDYsNT4sIFJIUworICAzNzE5MjY2NDA2VSwJLy8gPDYsNSw1LDA+OiBDb3N0IDQgdnNsZG9pNCA8NCw2LDUsNT4sIExIUworICAzNzg5MTA2ODg5VSwJLy8gPDYsNSw1LDE+OiBDb3N0IDQgdnNsZG9pOCA8NSwxLDYsNT4sIDw1LDEsNiw1PgorICAzNzg1Nzg5MjA4VSwJLy8gPDYsNSw1LDI+OiBDb3N0IDQgdnNsZG9pOCA8NCw1LDYsNT4sIDw1LDIsNiwzPgorICAzMzczMTgzOTUwVSwJLy8gPDYsNSw1LDM+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsNiw1PiwgPDYsdSw1LDM+CisgIDI3MTczNTU5NjRVLAkvLyA8Niw1LDUsND46IENvc3QgMyB2c2xkb2k4IDw1LDQsNiw1PiwgPDUsNCw2LDU+CisgIDI3OTE3NzIxNjRVLAkvLyA8Niw1LDUsNT46IENvc3QgMyB2c2xkb2kxMiA8Niw2LDYsNj4sIDw1LDUsNSw1PgorICAyNzcyNDU1NDM4VSwJLy8gPDYsNSw1LDY+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNCw1LDY+LCA8NSw1LDYsNj4KKyAgMzM3MzE4MzU0OVUsCS8vIDw2LDUsNSw3PjogQ29zdCA0IHZtcmdsdyA8Mix1LDYsNT4sIDw2LDMsNSw3PgorICAyNzIwMDEwNDk2VSwJLy8gPDYsNSw1LHU+OiBDb3N0IDMgdnNsZG9pOCA8NSx1LDYsNT4sIDw1LHUsNiw1PgorICAyNzcyNDU1NDYwVSwJLy8gPDYsNSw2LDA+OiBDb3N0IDMgdnNsZG9pMTIgPDMsNCw1LDY+LCA8NSw2LDAsMT4KKyAgMjMyMjAwODk3OFUsCS8vIDw2LDUsNiwxPjogQ29zdCAzIHZtcmdsdyA8Niw2LDYsNj4sIDw0LDAsNSwxPgorICAzODQwMjI1MzM1VSwJLy8gPDYsNSw2LDI+OiBDb3N0IDQgdnNsZG9pMTIgPDIsNCw1LDY+LCA8NSw2LDIsMj4KKyAgMjc3MjQ1NTQ5MFUsCS8vIDw2LDUsNiwzPjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsNSw2PiwgPDUsNiwzLDQ+CisgIDI3NzI0NTU1MDBVLAkvLyA8Niw1LDYsND46IENvc3QgMyB2c2xkb2kxMiA8Myw0LDUsNj4sIDw1LDYsNCw1PgorICAyMjU0OTAxMjUyVSwJLy8gPDYsNSw2LDU+OiBDb3N0IDMgdm1yZ2h3IDw2LDYsNiw2PiwgPDUsNSw1LDU+CisgIDI3NzI0NTU1MjBVLAkvLyA8Niw1LDYsNj46IENvc3QgMyB2c2xkb2kxMiA8Myw0LDUsNj4sIDw1LDYsNiw3PgorICAyNzg1ODc0MDI0VSwJLy8gPDYsNSw2LDc+OiBDb3N0IDMgdnNsZG9pMTIgPDUsNiw3LDY+LCA8NSw2LDcsNj4KKyAgMjc3MjQ1NTUzMlUsCS8vIDw2LDUsNix1PjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsNSw2PiwgPDUsNix1LDE+CisgIDI2Mjc2MjUwNjJVLAkvLyA8Niw1LDcsMD46IENvc3QgMyB2c2xkb2k0IDwxLDYsNSw3PiwgTEhTCisgIDEyMzU2Njc4NThVLAkvLyA8Niw1LDcsMT46IENvc3QgMiB2bXJnbHcgUkhTLCA8NCwwLDUsMT4KKyAgMjMwOTQwOTI3OFUsCS8vIDw2LDUsNywyPjogQ29zdCAzIHZtcmdsdyBSSFMsIDwzLDQsNSwyPgorICAyMzA5NDA3NjU5VSwJLy8gPDYsNSw3LDM+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDEsMiw1LDM+CisgIDI2Mjc2MjgzNDJVLAkvLyA8Niw1LDcsND46IENvc3QgMyB2c2xkb2k0IDwxLDYsNSw3PiwgUkhTCisgIDEyMzU2NjgxODZVLAkvLyA8Niw1LDcsNT46IENvc3QgMiB2bXJnbHcgUkhTLCA8NCw0LDUsNT4KKyAgMTIzNTY2NzQ1OFUsCS8vIDw2LDUsNyw2PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwzLDQsNSw2PgorICAyMzA5NDA3OTg3VSwJLy8gPDYsNSw3LDc+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDEsNiw1LDc+CisgIDEyMzU2Njc0NjBVLAkvLyA8Niw1LDcsdT46IENvc3QgMiB2bXJnbHcgUkhTLCA8Myw0LDUsdT4KKyAgMjYyNzYzMzI1NFUsCS8vIDw2LDUsdSwwPjogQ29zdCAzIHZzbGRvaTQgPDEsNiw1LHU+LCBMSFMKKyAgMTIzNTY3NjA1MFUsCS8vIDw2LDUsdSwxPjogQ29zdCAyIHZtcmdsdyBSSFMsIDw0LDAsNSwxPgorICAyMzA5NDE3NDcwVSwJLy8gPDYsNSx1LDI+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDMsNCw1LDI+CisgIDIzMDk0MTU4NTFVLAkvLyA8Niw1LHUsMz46IENvc3QgMyB2bXJnbHcgUkhTLCA8MSwyLDUsMz4KKyAgMjYyNzYzNjUzNFUsCS8vIDw2LDUsdSw0PjogQ29zdCAzIHZzbGRvaTQgPDEsNiw1LHU+LCBSSFMKKyAgMTIzNTY3NjM3OFUsCS8vIDw2LDUsdSw1PjogQ29zdCAyIHZtcmdsdyBSSFMsIDw0LDQsNSw1PgorICAxMjM1Njc1NjUwVSwJLy8gPDYsNSx1LDY+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDMsNCw1LDY+CisgIDIzMDk0MTYxNzlVLAkvLyA8Niw1LHUsNz46IENvc3QgMyB2bXJnbHcgUkhTLCA8MSw2LDUsNz4KKyAgMTIzNTY3NTY1MlUsCS8vIDw2LDUsdSx1PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwzLDQsNSx1PgorICAyMzA5MzUyNzUxVSwJLy8gPDYsNiwwLDA+OiBDb3N0IDMgdm1yZ2x3IDw0LDUsNiwwPiwgPDQsNSw2LDA+CisgIDE2NTA5MTc0NzhVLAkvLyA8Niw2LDAsMT46IENvc3QgMiB2c2xkb2k4IDw2LDYsNiw2PiwgTEhTCisgIDIyNTA1ODQ1NzBVLAkvLyA8Niw2LDAsMj46IENvc3QgMyB2bXJnaHcgPDYsMCwyLDE+LCA8NiwyLDcsMz4KKyAgMzg0NjE5NzU1NFUsCS8vIDw2LDYsMCwzPjogQ29zdCA0IHZzbGRvaTEyIDwzLDQsNSw2PiwgPDYsMCwzLDE+CisgIDI3MjQ2NTk1MzhVLAkvLyA8Niw2LDAsND46IENvc3QgMyB2c2xkb2k4IDw2LDYsNiw2PiwgPDAsNCwxLDU+CisgIDM3MjUyNzUyMjVVLAkvLyA8Niw2LDAsNT46IENvc3QgNCB2c2xkb2k0IDw1LDYsNiwwPiwgPDUsNiw2LDA+CisgIDI3OTE3NzI0OTNVLAkvLyA8Niw2LDAsNj46IENvc3QgMyB2c2xkb2kxMiA8Niw2LDYsNj4sIDw2LDAsNiwxPgorICAyMzA5MzUyNzU4VSwJLy8gPDYsNiwwLDc+OiBDb3N0IDMgdm1yZ2x3IDw0LDUsNiwwPiwgUkhTCisgIDE2NTA5MTgwNDVVLAkvLyA8Niw2LDAsdT46IENvc3QgMiB2c2xkb2k4IDw2LDYsNiw2PiwgTEhTCisgIDMzMjUzNTgzNjhVLAkvLyA8Niw2LDEsMD46IENvc3QgNCB2bXJnaHcgPDYsMSw3LDE+LCA8NiwwLDEsMT4KKyAgMjI5OTQwNjQ0OVUsCS8vIDw2LDYsMSwxPjogQ29zdCAzIHZtcmdsdyA8Mix1LDYsMT4sIDwyLHUsNiwxPgorICAyNzI0NjYwMTE4VSwJLy8gPDYsNiwxLDI+OiBDb3N0IDMgdnNsZG9pOCA8Niw2LDYsNj4sIDwxLDIsMywwPgorICAzMzczMTQ4NTE4VSwJLy8gPDYsNiwxLDM+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsNiwxPiwgPDMsMiw2LDM+CisgIDM4MzQyNTM3MTJVLAkvLyA8Niw2LDEsND46IENvc3QgNCB2c2xkb2kxMiA8MSw0LDUsNj4sIDw2LDEsNCw1PgorICAzMzczMTQ3OTUzVSwJLy8gPDYsNiwxLDU+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsNiwxPiwgPDIsNCw2LDU+CisgIDIzMjMyOTcwODBVLAkvLyA8Niw2LDEsNj46IENvc3QgMyB2bXJnbHcgPDYsdSw2LDE+LCA8Niw2LDYsNj4KKyAgMjI5OTQwNzY3MFUsCS8vIDw2LDYsMSw3PjogQ29zdCAzIHZtcmdsdyA8Mix1LDYsMT4sIFJIUworICAyMjk5NDA3NjcxVSwJLy8gPDYsNiwxLHU+OiBDb3N0IDMgdm1yZ2x3IDwyLHUsNiwxPiwgUkhTCisgIDIyNTIyOTY0ODlVLAkvLyA8Niw2LDIsMD46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8NiwwLDIsMT4KKyAgMzMyNjAzODM5NFUsCS8vIDw2LDYsMiwxPjogQ29zdCA0IHZtcmdodyA8NiwyLDcsMz4sIDw2LDEsMiwxPgorICAxMTc4NTU0ODc0VSwJLy8gPDYsNiwyLDI+OiBDb3N0IDIgdm1yZ2h3IDw2LDIsNywzPiwgPDYsMiw3LDM+CisgIDI3MjQ2NjA5MDJVLAkvLyA8Niw2LDIsMz46IENvc3QgMyB2c2xkb2k4IDw2LDYsNiw2PiwgPDIsMywwLDE+CisgIDIyNTIyOTY4MTdVLAkvLyA8Niw2LDIsND46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8Niw0LDIsNT4KKyAgMzg0MDc0MTg2NFUsCS8vIDw2LDYsMiw1PjogQ29zdCA0IHZzbGRvaTEyIDwyLDUsMyw2PiwgPDYsMiw1LDM+CisgIDIyNTIyOTY5NzZVLAkvLyA8Niw2LDIsNj46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8Niw2LDIsMj4KKyAgMjc4NTg3NDQyNlUsCS8vIDw2LDYsMiw3PjogQ29zdCAzIHZzbGRvaTEyIDw1LDYsNyw2PiwgPDYsMiw3LDM+CisgIDExNzg1NTQ4NzRVLAkvLyA8Niw2LDIsdT46IENvc3QgMiB2bXJnaHcgPDYsMiw3LDM+LCA8NiwyLDcsMz4KKyAgMjcyNDY2MTM5OFUsCS8vIDw2LDYsMywwPjogQ29zdCAzIHZzbGRvaTggPDYsNiw2LDY+LCA8MywwLDEsMj4KKyAgMzM3NTE1NDY2NVUsCS8vIDw2LDYsMywxPjogQ29zdCA0IHZtcmdsdyA8MywyLDYsMz4sIDwyLDAsNiwxPgorICAzMzc1MTU0OTA5VSwJLy8gPDYsNiwzLDI+OiBDb3N0IDQgdm1yZ2x3IDwzLDIsNiwzPiwgPDIsMyw2LDI+CisgIDIzMDE0MTM3MzRVLAkvLyA8Niw2LDMsMz46IENvc3QgMyB2bXJnbHcgPDMsMiw2LDM+LCA8MywyLDYsMz4KKyAgMjc3MjQ1NTk4NlUsCS8vIDw2LDYsMyw0PjogQ29zdCAzIHZzbGRvaTEyIDwzLDQsNSw2PiwgPDYsMyw0LDU+CisgIDMzNzUxNTQ5OTNVLAkvLyA8Niw2LDMsNT46IENvc3QgNCB2bXJnbHcgPDMsMiw2LDM+LCA8Miw0LDYsNT4KKyAgMjMyMzMxMzQ2NFUsCS8vIDw2LDYsMyw2PjogQ29zdCAzIHZtcmdsdyA8Nix1LDYsMz4sIDw2LDYsNiw2PgorICAyMzAxNDE0NzEwVSwJLy8gPDYsNiwzLDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDIsNiwzPiwgUkhTCisgIDIzMDE0MTQ3MTFVLAkvLyA8Niw2LDMsdT46IENvc3QgMyB2bXJnbHcgPDMsMiw2LDM+LCBSSFMKKyAgMjcyNDY2MjE2MlUsCS8vIDw2LDYsNCwwPjogQ29zdCAzIHZzbGRvaTggPDYsNiw2LDY+LCA8NCwwLDUsMT4KKyAgMzMyNjkzOTU1OVUsCS8vIDw2LDYsNCwxPjogQ29zdCA0IHZtcmdodyA8Niw0LDEsNT4sIDw2LDEsNywxPgorICAyMjUzMjcxNTQ2VSwJLy8gPDYsNiw0LDI+OiBDb3N0IDMgdm1yZ2h3IDw2LDQsMiw1PiwgPDYsMiw3LDM+CisgIDMzODMxMjczNDZVLAkvLyA8Niw2LDQsMz46IENvc3QgNCB2bXJnbHcgPDQsNSw2LDQ+LCA8NCw1LDYsMz4KKyAgMjMwOTM4NTUyM1UsCS8vIDw2LDYsNCw0PjogQ29zdCAzIHZtcmdsdyA8NCw1LDYsND4sIDw0LDUsNiw0PgorICAxNjUwOTIwNzU4VSwJLy8gPDYsNiw0LDU+OiBDb3N0IDIgdnNsZG9pOCA8Niw2LDYsNj4sIFJIUworICAyNzI0NjYyNjUzVSwJLy8gPDYsNiw0LDY+OiBDb3N0IDMgdnNsZG9pOCA8Niw2LDYsNj4sIDw0LDYsNSw2PgorICAyMzA5Mzg1NTI2VSwJLy8gPDYsNiw0LDc+OiBDb3N0IDMgdm1yZ2x3IDw0LDUsNiw0PiwgUkhTCisgIDE2NTA5MjEwMDFVLAkvLyA8Niw2LDQsdT46IENvc3QgMiB2c2xkb2k4IDw2LDYsNiw2PiwgUkhTCisgIDM3MjUzMTIxMDJVLAkvLyA8Niw2LDUsMD46IENvc3QgNCB2c2xkb2k0IDw1LDYsNiw1PiwgTEhTCisgIDMzNzMxODAzOTNVLAkvLyA8Niw2LDUsMT46IENvc3QgNCB2bXJnbHcgPDIsdSw2LDU+LCA8MiwwLDYsMT4KKyAgMzc5MTc2OTM2OFUsCS8vIDw2LDYsNSwyPjogQ29zdCA0IHZzbGRvaTggPDUsNSw2LDY+LCA8NSwyLDYsMz4KKyAgMzM3MzE4MTI4NlUsCS8vIDw2LDYsNSwzPjogQ29zdCA0IHZtcmdsdyA8Mix1LDYsNT4sIDwzLDIsNiwzPgorICAzNzI1MzE1MzgyVSwJLy8gPDYsNiw1LDQ+OiBDb3N0IDQgdnNsZG9pNCA8NSw2LDYsNT4sIFJIUworICAyMjk5NDM5MjIxVSwJLy8gPDYsNiw1LDU+OiBDb3N0IDMgdm1yZ2x3IDwyLHUsNiw1PiwgPDIsdSw2LDU+CisgIDI3MjQ2NjMzOTRVLAkvLyA8Niw2LDUsNj46IENvc3QgMyB2c2xkb2k4IDw2LDYsNiw2PiwgPDUsNiw3LDA+CisgIDIyOTk0NDA0MzhVLAkvLyA8Niw2LDUsNz46IENvc3QgMyB2bXJnbHcgPDIsdSw2LDU+LCBSSFMKKyAgMjI5OTQ0MDQzOVUsCS8vIDw2LDYsNSx1PjogQ29zdCAzIHZtcmdsdyA8Mix1LDYsNT4sIFJIUworICAxNTgzODA4NjE0VSwJLy8gPDYsNiw2LDA+OiBDb3N0IDIgdnNsZG9pNCA8Niw2LDYsNj4sIExIUworICAyMzIyMDEwNDQ1VSwJLy8gPDYsNiw2LDE+OiBDb3N0IDMgdm1yZ2x3IDw2LDYsNiw2PiwgPDYsMCw2LDE+CisgIDIyNTQ1NzQwNzRVLAkvLyA8Niw2LDYsMj46IENvc3QgMyB2bXJnaHcgPDYsNiwyLDI+LCA8NiwyLDcsMz4KKyAgMjMyMjAxMDYwOVUsCS8vIDw2LDYsNiwzPjogQ29zdCAzIHZtcmdsdyA8Niw2LDYsNj4sIDw2LDIsNiwzPgorICAxNTgzODExODk0VSwJLy8gPDYsNiw2LDQ+OiBDb3N0IDIgdnNsZG9pNCA8Niw2LDYsNj4sIFJIUworICAyMzIyMDEwNzczVSwJLy8gPDYsNiw2LDU+OiBDb3N0IDMgdm1yZ2x3IDw2LDYsNiw2PiwgPDYsNCw2LDU+CisgIDM2MzI1MzA0NlUsCS8vIDw2LDYsNiw2PjogQ29zdCAxIHZzcGx0aXN3MiBSSFMKKyAgMTI0ODI2NzU3NFUsCS8vIDw2LDYsNiw3PjogQ29zdCAyIHZtcmdsdyA8Niw2LDYsNj4sIFJIUworICAzNjMyNTMwNDZVLAkvLyA8Niw2LDYsdT46IENvc3QgMSB2c3BsdGlzdzIgUkhTCisgIDIzMDk0MTAwOTVVLAkvLyA8Niw2LDcsMD46IENvc3QgMyB2bXJnbHcgUkhTLCA8NCw1LDYsMD4KKyAgMjMwOTQwODIzM1UsCS8vIDw2LDYsNywxPjogQ29zdCAzIHZtcmdsdyBSSFMsIDwyLDAsNiwxPgorICAyMzExNDAyMzczVSwJLy8gPDYsNiw3LDI+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDYsNyw2LDI+CisgIDIzMDk0MDkxMjZVLAkvLyA8Niw2LDcsMz46IENvc3QgMyB2bXJnbHcgUkhTLCA8MywyLDYsMz4KKyAgMjMwOTQxMDA5OVUsCS8vIDw2LDYsNyw0PjogQ29zdCAzIHZtcmdsdyBSSFMsIDw0LDUsNiw0PgorICAyMzA5NDA4NTYxVSwJLy8gPDYsNiw3LDU+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDIsNCw2LDU+CisgIDEyMzc2NjA0NzJVLAkvLyA8Niw2LDcsNj46IENvc3QgMiB2bXJnbHcgUkhTLCA8Niw2LDYsNj4KKyAgMTYxOTI2NDU0VSwJLy8gPDYsNiw3LDc+OiBDb3N0IDEgdm1yZ2x3IFJIUywgUkhTCisgIDE2MTkyNjQ1NVUsCS8vIDw2LDYsNyx1PjogQ29zdCAxIHZtcmdsdyBSSFMsIFJIUworICAxNTgzODA4NjE0VSwJLy8gPDYsNix1LDA+OiBDb3N0IDIgdnNsZG9pNCA8Niw2LDYsNj4sIExIUworICAxNjUwOTIzMzEwVSwJLy8gPDYsNix1LDE+OiBDb3N0IDIgdnNsZG9pOCA8Niw2LDYsNj4sIExIUworICAxMTc4NTU0ODc0VSwJLy8gPDYsNix1LDI+OiBDb3N0IDIgdm1yZ2h3IDw2LDIsNywzPiwgPDYsMiw3LDM+CisgIDIzMDk0MTczMThVLAkvLyA8Niw2LHUsMz46IENvc3QgMyB2bXJnbHcgUkhTLCA8MywyLDYsMz4KKyAgMTU4MzgxMTg5NFUsCS8vIDw2LDYsdSw0PjogQ29zdCAyIHZzbGRvaTQgPDYsNiw2LDY+LCBSSFMKKyAgMTY1MDkyMzY3NFUsCS8vIDw2LDYsdSw1PjogQ29zdCAyIHZzbGRvaTggPDYsNiw2LDY+LCBSSFMKKyAgMzYzMjUzMDQ2VSwJLy8gPDYsNix1LDY+OiBDb3N0IDEgdnNwbHRpc3cyIFJIUworICAxNjE5MzQ2NDZVLAkvLyA8Niw2LHUsNz46IENvc3QgMSB2bXJnbHcgUkhTLCBSSFMKKyAgMTYxOTM0NjQ3VSwJLy8gPDYsNix1LHU+OiBDb3N0IDEgdm1yZ2x3IFJIUywgUkhTCisgIDE2MzgzMTgwODBVLAkvLyA8Niw3LDAsMD46IENvc3QgMiB2c2xkb2k4IFJIUywgPDAsMCwwLDA+CisgIDU2NDU3NjM1OFUsCS8vIDw2LDcsMCwxPjogQ29zdCAxIHZzbGRvaTggUkhTLCBMSFMKKyAgMjcxMjA2MDA3N1UsCS8vIDw2LDcsMCwyPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8MCwyLDEsMj4KKyAgMjcxMjA2MDE1NlUsCS8vIDw2LDcsMCwzPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8MCwzLDEsMD4KKyAgMTYzODMxODQxOFUsCS8vIDw2LDcsMCw0PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8MCw0LDEsNT4KKyAgMTU3Nzg2NTMxNFUsCS8vIDw2LDcsMCw1PjogQ29zdCAyIHZzbGRvaTQgPDUsNiw3LDA+LCA8NSw2LDcsMD4KKyAgMjcxMjA2MDQwNlUsCS8vIDw2LDcsMCw2PjogQ29zdCAzIHZzbGRvaTggUkhTLCA8MCw2LDEsNz4KKyAgMjY1MTYwODA1OFUsCS8vIDw2LDcsMCw3PjogQ29zdCAzIHZzbGRvaTQgPDUsNiw3LDA+LCA8NywwLDEsMj4KKyAgNTY0NTc2OTI1VSwJLy8gPDYsNywwLHU+OiBDb3N0IDEgdnNsZG9pOCBSSFMsIExIUworICAyNzEyMDYwNjQzVSwJLy8gPDYsNywxLDA+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwxLDAsMSwxPgorICAxNjM4MzE4OTAwVSwJLy8gPDYsNywxLDE+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDwxLDEsMSwxPgorICAxNjM4MzE4OTk4VSwJLy8gPDYsNywxLDI+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDwxLDIsMywwPgorICAzNzY2NTU5NzUzVSwJLy8gPDYsNywxLDM+OiBDb3N0IDQgdnNsZG9pOCA8MSwzLDYsNz4sIDwxLDMsNiw3PgorICAyNzEyMDYwOTcxVSwJLy8gPDYsNywxLDQ+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwxLDQsMSw1PgorICAyNzEyMDYxMDM5VSwJLy8gPDYsNywxLDU+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwxLDUsMCwxPgorICAyNzEyMDYxMTM1VSwJLy8gPDYsNywxLDY+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwxLDYsMSw3PgorICAzMzczMTQ4NjEyVSwJLy8gPDYsNywxLDc+OiBDb3N0IDQgdm1yZ2x3IDwyLHUsNiwxPiwgPDMsMyw3LDc+CisgIDE2MzgzMTk0ODRVLAkvLyA8Niw3LDEsdT46IENvc3QgMiB2c2xkb2k4IFJIUywgPDEsdSwzLDA+CisgIDI3MTIwNjEzNzNVLAkvLyA8Niw3LDIsMD46IENvc3QgMyB2c2xkb2k4IFJIUywgPDIsMCwxLDI+CisgIDI3MTIwNjE0NzFVLAkvLyA8Niw3LDIsMT46IENvc3QgMyB2c2xkb2k4IFJIUywgPDIsMSwzLDE+CisgIDE2MzgzMTk3MjBVLAkvLyA8Niw3LDIsMj46IENvc3QgMiB2c2xkb2k4IFJIUywgPDIsMiwyLDI+CisgIDE2MzgzMTk3ODJVLAkvLyA8Niw3LDIsMz46IENvc3QgMiB2c2xkb2k4IFJIUywgPDIsMywwLDE+CisgIDI3MTIwNjE3MDlVLAkvLyA8Niw3LDIsND46IENvc3QgMyB2c2xkb2k4IFJIUywgPDIsNCwyLDU+CisgIDI3MTIwNjE4MDBVLAkvLyA8Niw3LDIsNT46IENvc3QgMyB2c2xkb2k4IFJIUywgPDIsNSwzLDY+CisgIDE2MzgzMjAwNThVLAkvLyA8Niw3LDIsNj46IENvc3QgMiB2c2xkb2k4IFJIUywgPDIsNiwzLDc+CisgIDIyNTIyOTc4MzZVLAkvLyA8Niw3LDIsNz46IENvc3QgMyB2bXJnaHcgPDYsMiw3LDM+LCA8Nyw3LDcsNz4KKyAgMTYzODMyMDE4N1UsCS8vIDw2LDcsMix1PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8Mix1LDAsMT4KKyAgMTYzODMyMDI3OFUsCS8vIDw2LDcsMywwPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8MywwLDEsMj4KKyAgMjcxMjA2MjE4MlUsCS8vIDw2LDcsMywxPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8MywxLDEsMT4KKyAgMjcxMjA2MjI1NlUsCS8vIDw2LDcsMywyPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8MywyLDAsMz4KKyAgMTYzODMyMDU0MFUsCS8vIDw2LDcsMywzPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8MywzLDMsMz4KKyAgMTYzODMyMDY0MlUsCS8vIDw2LDcsMyw0PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8Myw0LDUsNj4KKyAgMjcxMjA2MjU0NlUsCS8vIDw2LDcsMyw1PjogQ29zdCAzIHZzbGRvaTggUkhTLCA8Myw1LDUsNT4KKyAgMjcxMjA2MjU4NFUsCS8vIDw2LDcsMyw2PjogQ29zdCAzIHZzbGRvaTggUkhTLCA8Myw2LDAsNz4KKyAgMjcxMjA2MjY1OVUsCS8vIDw2LDcsMyw3PjogQ29zdCAzIHZzbGRvaTggUkhTLCA8Myw3LDAsMT4KKyAgMTYzODMyMDkyNlUsCS8vIDw2LDcsMyx1PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8Myx1LDEsMj4KKyAgMTYzODMyMTA0MlUsCS8vIDw2LDcsNCwwPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8NCwwLDUsMT4KKyAgMjcxMjA2MjkyMlUsCS8vIDw2LDcsNCwxPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8NCwxLDIsMz4KKyAgMjcxMjA2MzAyOVUsCS8vIDw2LDcsNCwyPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8NCwyLDUsMj4KKyAgMjcxMjA2MzEwOFUsCS8vIDw2LDcsNCwzPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8NCwzLDUsMD4KKyAgMTYzODMyMTM2MFUsCS8vIDw2LDcsNCw0PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8NCw0LDQsND4KKyAgNTY0NTc5NjM4VSwJLy8gPDYsNyw0LDU+OiBDb3N0IDEgdnNsZG9pOCBSSFMsIFJIUworICAyNzEyMDYzMzU3VSwJLy8gPDYsNyw0LDY+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw0LDYsNSw2PgorICAyNzEyMDYzNDM5VSwJLy8gPDYsNyw0LDc+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw0LDcsNSw3PgorICA1NjQ1Nzk4ODFVLAkvLyA8Niw3LDQsdT46IENvc3QgMSB2c2xkb2k4IFJIUywgUkhTCisgIDI3MTIwNjM1NjBVLAkvLyA8Niw3LDUsMD46IENvc3QgMyB2c2xkb2k4IFJIUywgPDUsMCwxLDI+CisgIDI3MTQwNTQyODdVLAkvLyA8Niw3LDUsMT46IENvc3QgMyB2c2xkb2k4IFJIUywgPDUsMSwwLDE+CisgIDI3MTIwNjM3NDJVLAkvLyA8Niw3LDUsMj46IENvc3QgMyB2c2xkb2k4IFJIUywgPDUsMiwzLDQ+CisgIDMzNzMxODEyOTVVLAkvLyA8Niw3LDUsMz46IENvc3QgNCB2bXJnbHcgPDIsdSw2LDU+LCA8MywyLDcsMz4KKyAgMjcxMjA2MzkyNFUsCS8vIDw2LDcsNSw0PjogQ29zdCAzIHZzbGRvaTggUkhTLCA8NSw0LDUsNj4KKyAgMTYzODMyMjE4MFUsCS8vIDw2LDcsNSw1PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8NSw1LDUsNT4KKyAgMTYzODMyMjI3NFUsCS8vIDw2LDcsNSw2PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8NSw2LDcsMD4KKyAgMzM3MzE4MTM4MFUsCS8vIDw2LDcsNSw3PjogQ29zdCA0IHZtcmdsdyA8Mix1LDYsNT4sIDwzLDMsNyw3PgorICAxNjQwMzEzMDkyVSwJLy8gPDYsNyw1LHU+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw1LHUsNywwPgorICAyNzEyMDY0Mjg5VSwJLy8gPDYsNyw2LDA+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDAsMSwyPgorICAyNzEyMDY0NDIzVSwJLy8gPDYsNyw2LDE+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDEsNywxPgorICAxNjM4MzIyNjgyVSwJLy8gPDYsNyw2LDI+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LDIsNywzPgorICAyNzEyMDY0NTYyVSwJLy8gPDYsNyw2LDM+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDMsNCw1PgorICAyNzEyMDY0NjUzVSwJLy8gPDYsNyw2LDQ+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDQsNSw2PgorICAyNzEyMDY0NzQ3VSwJLy8gPDYsNyw2LDU+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDUsNywxPgorICAxNjM4MzIzMDAwVSwJLy8gPDYsNyw2LDY+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LDYsNiw2PgorICAxNjM4MzIzMDIyVSwJLy8gPDYsNyw2LDc+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LDcsMCwxPgorICAxNjM4MzIzMTY4VSwJLy8gPDYsNyw2LHU+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LHUsNywzPgorICAxMjM3NjU5NzQ2VSwJLy8gPDYsNyw3LDA+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDUsNiw3LDA+CisgIDIzMDk0MTExNThVLAkvLyA8Niw3LDcsMT46IENvc3QgMyB2bXJnbHcgUkhTLCA8NiwwLDcsMT4KKyAgMjYzOTcxODMzMFUsCS8vIDw2LDcsNywyPjogQ29zdCAzIHZzbGRvaTQgPDMsNiw3LDc+LCA8Miw2LDMsNz4KKyAgMTIzNTY2OTQ5OFUsCS8vIDw2LDcsNywzPjogQ29zdCAyIHZtcmdsdyBSSFMsIDw2LDIsNywzPgorICAxMjM3NjU5NzUwVSwJLy8gPDYsNyw3LDQ+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDUsNiw3LDQ+CisgIDIzMDk0MTEyNDNVLAkvLyA8Niw3LDcsNT46IENvc3QgMyB2bXJnbHcgUkhTLCA8NiwxLDcsNT4KKyAgMTU4Mzg5NTM2MlUsCS8vIDw2LDcsNyw2PjogQ29zdCAyIHZzbGRvaTQgPDYsNiw3LDc+LCA8Niw2LDcsNz4KKyAgMTIzNTY2OTgyNlUsCS8vIDw2LDcsNyw3PjogQ29zdCAyIHZtcmdsdyBSSFMsIDw2LDYsNyw3PgorICAxMjM1NjY5NTAzVSwJLy8gPDYsNyw3LHU+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDYsMiw3LHU+CisgIDE2MzgzMjM5MjNVLAkvLyA8Niw3LHUsMD46IENvc3QgMiB2c2xkb2k4IFJIUywgPHUsMCwxLDI+CisgIDU2NDU4MjE5MFUsCS8vIDw2LDcsdSwxPjogQ29zdCAxIHZzbGRvaTggUkhTLCBMSFMKKyAgMTYzODMyNDEwMVUsCS8vIDw2LDcsdSwyPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8dSwyLDMsMD4KKyAgMTYzODMyNDE1NlUsCS8vIDw2LDcsdSwzPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8dSwzLDAsMT4KKyAgMTYzODMyNDI4N1UsCS8vIDw2LDcsdSw0PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8dSw0LDUsNj4KKyAgNTY0NTgyNTU0VSwJLy8gPDYsNyx1LDU+OiBDb3N0IDEgdnNsZG9pOCBSSFMsIFJIUworICAxNjM4MzI0NDMyVSwJLy8gPDYsNyx1LDY+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDx1LDYsMyw3PgorICAxMjM1Njc4MDE4VSwJLy8gPDYsNyx1LDc+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDYsNiw3LDc+CisgIDU2NDU4Mjc1N1UsCS8vIDw2LDcsdSx1PjogQ29zdCAxIHZzbGRvaTggUkhTLCBMSFMKKyAgMTYzODMyNjI3MlUsCS8vIDw2LHUsMCwwPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8MCwwLDAsMD4KKyAgNTY0NTg0NTUwVSwJLy8gPDYsdSwwLDE+OiBDb3N0IDEgdnNsZG9pOCBSSFMsIExIUworICAyNzEyMDY4MjY5VSwJLy8gPDYsdSwwLDI+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwwLDIsMSwyPgorICAyMzA5MzQ5NTMyVSwJLy8gPDYsdSwwLDM+OiBDb3N0IDMgdm1yZ2x3IDw0LDUsNiwwPiwgTEhTCisgIDE2MzgzMjY2MTBVLAkvLyA8Nix1LDAsND46IENvc3QgMiB2c2xkb2k4IFJIUywgPDAsNCwxLDU+CisgIDE1Nzc5MzkwNTFVLAkvLyA8Nix1LDAsNT46IENvc3QgMiB2c2xkb2k0IDw1LDYsdSwwPiwgPDUsNix1LDA+CisgIDI3MTIwNjg1OThVLAkvLyA8Nix1LDAsNj46IENvc3QgMyB2c2xkb2k4IFJIUywgPDAsNiwxLDc+CisgIDIzMDkzNTI3NzZVLAkvLyA8Nix1LDAsNz46IENvc3QgMyB2bXJnbHcgPDQsNSw2LDA+LCBSSFMKKyAgNTY0NTg1MTE3VSwJLy8gPDYsdSwwLHU+OiBDb3N0IDEgdnNsZG9pOCBSSFMsIExIUworICAyNzEyMDY4ODM1VSwJLy8gPDYsdSwxLDA+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwxLDAsMSwxPgorICAxNjM4MzI3MDkyVSwJLy8gPDYsdSwxLDE+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDwxLDEsMSwxPgorICAxNjk4NzE1NDM4VSwJLy8gPDYsdSwxLDI+OiBDb3N0IDIgdnNsZG9pMTIgPDMsNCw1LDY+LCBMSFMKKyAgMjI5OTQwNDQ0NFUsCS8vIDw2LHUsMSwzPjogQ29zdCAzIHZtcmdsdyA8Mix1LDYsMT4sIExIUworICAyNzEyMDY5MTYzVSwJLy8gPDYsdSwxLDQ+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwxLDQsMSw1PgorICAyNzEyMDY5MjMxVSwJLy8gPDYsdSwxLDU+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwxLDUsMCwxPgorICAyNzEyMDY5MzI3VSwJLy8gPDYsdSwxLDY+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwxLDYsMSw3PgorICAyMjk5NDA3Njg4VSwJLy8gPDYsdSwxLDc+OiBDb3N0IDMgdm1yZ2x3IDwyLHUsNiwxPiwgUkhTCisgIDE2OTg3MTU0OTJVLAkvLyA8Nix1LDEsdT46IENvc3QgMiB2c2xkb2kxMiA8Myw0LDUsNj4sIExIUworICAyNzEyMDY5NTY1VSwJLy8gPDYsdSwyLDA+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwyLDAsMSwyPgorICAxMTc4NTU2MjA2VSwJLy8gPDYsdSwyLDE+OiBDb3N0IDIgdm1yZ2h3IDw2LDIsNywzPiwgTEhTCisgIDE2MzgzMjc5MTJVLAkvLyA8Nix1LDIsMj46IENvc3QgMiB2c2xkb2k4IFJIUywgPDIsMiwyLDI+CisgIDE2MzgzMjc5NzRVLAkvLyA8Nix1LDIsMz46IENvc3QgMiB2c2xkb2k4IFJIUywgPDIsMywwLDE+CisgIDI3MTIwNjk5MDFVLAkvLyA8Nix1LDIsND46IENvc3QgMyB2c2xkb2k4IFJIUywgPDIsNCwyLDU+CisgIDExNzg1NTY1NzBVLAkvLyA8Nix1LDIsNT46IENvc3QgMiB2bXJnaHcgPDYsMiw3LDM+LCBSSFMKKyAgMTYzODMyODI1MFUsCS8vIDw2LHUsMiw2PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8Miw2LDMsNz4KKyAgMjI1MjI5ODQ5NlUsCS8vIDw2LHUsMiw3PjogQ29zdCAzIHZtcmdodyA8NiwyLDcsMz4sIDx1LDcsMCwxPgorICAxNjM4MzI4Mzc5VSwJLy8gPDYsdSwyLHU+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDwyLHUsMCwxPgorICAxNjM4MzI4NDcwVSwJLy8gPDYsdSwzLDA+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDwzLDAsMSwyPgorICAyNzEyMDcwMzc0VSwJLy8gPDYsdSwzLDE+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwzLDEsMSwxPgorICAyNzA0MTA3ODgzVSwJLy8gPDYsdSwzLDI+OiBDb3N0IDMgdnNsZG9pOCA8MywyLDYsdT4sIDwzLDIsNix1PgorICAxNjM4MzI4NzMyVSwJLy8gPDYsdSwzLDM+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDwzLDMsMywzPgorICAxNjM4MzI4ODM0VSwJLy8gPDYsdSwzLDQ+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDwzLDQsNSw2PgorICAyNzEyMDcwNzM4VSwJLy8gPDYsdSwzLDU+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwzLDUsNSw1PgorICAyNzEyMDcwNzc2VSwJLy8gPDYsdSwzLDY+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwzLDYsMCw3PgorICAyMzAxNDE0NzI4VSwJLy8gPDYsdSwzLDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDIsNiwzPiwgUkhTCisgIDE2MzgzMjkxMThVLAkvLyA8Nix1LDMsdT46IENvc3QgMiB2c2xkb2k4IFJIUywgPDMsdSwxLDI+CisgIDE2MzgzMjkyMzRVLAkvLyA8Nix1LDQsMD46IENvc3QgMiB2c2xkb2k4IFJIUywgPDQsMCw1LDE+CisgIDI3MTIwNzExMTRVLAkvLyA8Nix1LDQsMT46IENvc3QgMyB2c2xkb2k4IFJIUywgPDQsMSwyLDM+CisgIDI3MTIwNzEyMjFVLAkvLyA8Nix1LDQsMj46IENvc3QgMyB2c2xkb2k4IFJIUywgPDQsMiw1LDI+CisgIDIzMDkzODIzMDBVLAkvLyA8Nix1LDQsMz46IENvc3QgMyB2bXJnbHcgPDQsNSw2LDQ+LCBMSFMKKyAgMTYzODMyOTU1MlUsCS8vIDw2LHUsNCw0PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8NCw0LDQsND4KKyAgNTY0NTg3ODMxVSwJLy8gPDYsdSw0LDU+OiBDb3N0IDEgdnNsZG9pOCBSSFMsIFJIUworICAyNzEyMDcxNTQ1VSwJLy8gPDYsdSw0LDY+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw0LDYsNSwyPgorICAyMzA5Mzg1NTQ0VSwJLy8gPDYsdSw0LDc+OiBDb3N0IDMgdm1yZ2x3IDw0LDUsNiw0PiwgUkhTCisgIDU2NDU4ODA3M1UsCS8vIDw2LHUsNCx1PjogQ29zdCAxIHZzbGRvaTggUkhTLCBSSFMKKyAgMjcxMjA3MTc1MlUsCS8vIDw2LHUsNSwwPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8NSwwLDEsMj4KKyAgMjcxNDA2MjQ3OVUsCS8vIDw2LHUsNSwxPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8NSwxLDAsMT4KKyAgMjcxMjA3MTkzNFUsCS8vIDw2LHUsNSwyPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8NSwyLDMsND4KKyAgMjI5OTQzNzIxMlUsCS8vIDw2LHUsNSwzPjogQ29zdCAzIHZtcmdsdyA8Mix1LDYsNT4sIExIUworICAyNzEyMDcyMTE2VSwJLy8gPDYsdSw1LDQ+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw1LDQsNSw2PgorICAxNjM4MzMwMzcyVSwJLy8gPDYsdSw1LDU+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw1LDUsNSw1PgorICAxNjk4NzE1ODAyVSwJLy8gPDYsdSw1LDY+OiBDb3N0IDIgdnNsZG9pMTIgPDMsNCw1LDY+LCBSSFMKKyAgMjI5OTQ0MDQ1NlUsCS8vIDw2LHUsNSw3PjogQ29zdCAzIHZtcmdsdyA8Mix1LDYsNT4sIFJIUworICAxNjk4NzE1ODIwVSwJLy8gPDYsdSw1LHU+OiBDb3N0IDIgdnNsZG9pMTIgPDMsNCw1LDY+LCBSSFMKKyAgMTU4MzgwODYxNFUsCS8vIDw2LHUsNiwwPjogQ29zdCAyIHZzbGRvaTQgPDYsNiw2LDY+LCBMSFMKKyAgMTE4MTE2MTI2MlUsCS8vIDw2LHUsNiwxPjogQ29zdCAyIHZtcmdodyA8Niw2LDYsNj4sIExIUworICAxNjM4MzMwODc0VSwJLy8gPDYsdSw2LDI+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LDIsNywzPgorICAxMjQ4MjY0MzQ4VSwJLy8gPDYsdSw2LDM+OiBDb3N0IDIgdm1yZ2x3IDw2LDYsNiw2PiwgTEhTCisgIDE1ODM4MTE4OTRVLAkvLyA8Nix1LDYsND46IENvc3QgMiB2c2xkb2k0IDw2LDYsNiw2PiwgUkhTCisgIDExODExNjE2MjZVLAkvLyA8Nix1LDYsNT46IENvc3QgMiB2bXJnaHcgPDYsNiw2LDY+LCBSSFMKKyAgMzYzMjUzMDQ2VSwJLy8gPDYsdSw2LDY+OiBDb3N0IDEgdnNwbHRpc3cyIFJIUworICAxNjM4MzMxMjE0VSwJLy8gPDYsdSw2LDc+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LDcsMCwxPgorICAzNjMyNTMwNDZVLAkvLyA8Nix1LDYsdT46IENvc3QgMSB2c3BsdGlzdzIgUkhTCisgIDE1NjAwNzYzOTBVLAkvLyA8Nix1LDcsMD46IENvc3QgMiB2c2xkb2k0IDwyLDYsdSw3PiwgTEhTCisgIDEyMzU2NjQ5NjlVLAkvLyA8Nix1LDcsMT46IENvc3QgMiB2bXJnbHcgUkhTLCA8MCwwLHUsMT4KKyAgMTU2MDA3ODMxMVUsCS8vIDw2LHUsNywyPjogQ29zdCAyIHZzbGRvaTQgPDIsNix1LDc+LCA8Miw2LHUsNz4KKyAgMTYxOTIzMjI4VSwJLy8gPDYsdSw3LDM+OiBDb3N0IDEgdm1yZ2x3IFJIUywgTEhTCisgIDE1NjAwNzk2NzBVLAkvLyA8Nix1LDcsND46IENvc3QgMiB2c2xkb2k0IDwyLDYsdSw3PiwgUkhTCisgIDEyMzU2NjUyOTdVLAkvLyA8Nix1LDcsNT46IENvc3QgMiB2bXJnbHcgUkhTLCA8MCw0LHUsNT4KKyAgMTIzNTY2NzQ4NVUsCS8vIDw2LHUsNyw2PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwzLDQsdSw2PgorICAxNjE5MjY0NzJVLAkvLyA8Nix1LDcsNz46IENvc3QgMSB2bXJnbHcgUkhTLCBSSFMKKyAgMTYxOTIzMjMzVSwJLy8gPDYsdSw3LHU+OiBDb3N0IDEgdm1yZ2x3IFJIUywgTEhTCisgIDE1NjAwODQ1ODJVLAkvLyA8Nix1LHUsMD46IENvc3QgMiB2c2xkb2k0IDwyLDYsdSx1PiwgTEhTCisgIDU2NDU5MDM4MlUsCS8vIDw2LHUsdSwxPjogQ29zdCAxIHZzbGRvaTggUkhTLCBMSFMKKyAgMTU2MDA4NjUwNFUsCS8vIDw2LHUsdSwyPjogQ29zdCAyIHZzbGRvaTQgPDIsNix1LHU+LCA8Miw2LHUsdT4KKyAgMTYxOTMxNDIwVSwJLy8gPDYsdSx1LDM+OiBDb3N0IDEgdm1yZ2x3IFJIUywgTEhTCisgIDE1NjAwODc4NjJVLAkvLyA8Nix1LHUsND46IENvc3QgMiB2c2xkb2k0IDwyLDYsdSx1PiwgUkhTCisgIDU2NDU5MDc0NlUsCS8vIDw2LHUsdSw1PjogQ29zdCAxIHZzbGRvaTggUkhTLCBSSFMKKyAgMzYzMjUzMDQ2VSwJLy8gPDYsdSx1LDY+OiBDb3N0IDEgdnNwbHRpc3cyIFJIUworICAxNjE5MzQ2NjRVLAkvLyA8Nix1LHUsNz46IENvc3QgMSB2bXJnbHcgUkhTLCBSSFMKKyAgMTYxOTMxNDI1VSwJLy8gPDYsdSx1LHU+OiBDb3N0IDEgdm1yZ2x3IFJIUywgTEhTCisgIDE3MDU0MjY5NDRVLAkvLyA8NywwLDAsMD46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwwLDAsMCwwPgorICAxNzA1NDI2OTU0VSwJLy8gPDcsMCwwLDE+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MCwwLDEsMT4KKyAgMzcxMzU1MDI2NlUsCS8vIDw3LDAsMCwyPjogQ29zdCA0IHZzbGRvaTQgPDMsNywwLDA+LCA8Miw2LDMsNz4KKyAgMjMxNjA2Mzg5MlUsCS8vIDw3LDAsMCwzPjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsMD4sIDw3LDIsMCwzPgorICAyNzc5MTY4ODA1VSwJLy8gPDcsMCwwLDQ+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MCwwLDQsMT4KKyAgMjY2MzY5ODUzMFUsCS8vIDw3LDAsMCw1PjogQ29zdCAzIHZzbGRvaTQgPDcsNywwLDA+LCA8NSw2LDcsMD4KKyAgMjY1NzcyNzMwOVUsCS8vIDw3LDAsMCw2PjogQ29zdCAzIHZzbGRvaTQgPDYsNywwLDA+LCA8Niw3LDAsMD4KKyAgMjMxNjA2NDIyMFUsCS8vIDw3LDAsMCw3PjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsMD4sIDw3LDYsMCw3PgorICAxNzA1NDI3MDE3VSwJLy8gPDcsMCwwLHU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MCwwLHUsMT4KKyAgMTU4Mzk4ODgzOFUsCS8vIDw3LDAsMSwwPjogQ29zdCAyIHZzbGRvaTQgPDYsNywwLDE+LCBMSFMKKyAgMjc3OTE2ODg1OVUsCS8vIDw3LDAsMSwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDAsMSwxLDE+CisgIDYzMTY4NTIyMlUsCS8vIDw3LDAsMSwyPjogQ29zdCAxIHZzbGRvaTEyIFJIUywgTEhTCisgIDI2Mzk4MTc0MTFVLAkvLyA8NywwLDEsMz46IENvc3QgMyB2c2xkb2k0IDwzLDcsMCwxPiwgPDMsNywwLDE+CisgIDE1ODM5OTIxMThVLAkvLyA8NywwLDEsND46IENvc3QgMiB2c2xkb2k0IDw2LDcsMCwxPiwgUkhTCisgIDI2NTc3MzQ2NjBVLAkvLyA8NywwLDEsNT46IENvc3QgMyB2c2xkb2k0IDw2LDcsMCwxPiwgPDUsNSw1LDU+CisgIDE1ODM5OTM2NzhVLAkvLyA8NywwLDEsNj46IENvc3QgMiB2c2xkb2k0IDw2LDcsMCwxPiwgPDYsNywwLDE+CisgIDI2NTc3MzU2NzJVLAkvLyA8NywwLDEsNz46IENvc3QgMyB2c2xkb2k0IDw2LDcsMCwxPiwgPDcsMCwxLDA+CisgIDYzMTY4NTI3NlUsCS8vIDw3LDAsMSx1PjogQ29zdCAxIHZzbGRvaTEyIFJIUywgTEhTCisgIDI3NzkxNjg5MzNVLAkvLyA8NywwLDIsMD46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwwLDIsMCwzPgorICAyNzY3NjY3Mzc3VSwJLy8gPDcsMCwyLDE+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNiwzLDc+LCA8MCwyLDEsNj4KKyAgMjcxODcxMzQ0OFUsCS8vIDw3LDAsMiwyPjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDA+LCA8MiwyLDIsMj4KKyAgMjcxODcxMzUxMFUsCS8vIDw3LDAsMiwzPjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDA+LCA8MiwzLDAsMT4KKyAgMzg0MTQwOTIyOFUsCS8vIDw3LDAsMiw0PjogQ29zdCA0IHZzbGRvaTEyIDwyLDYsMyw3PiwgPDAsMiw0LDY+CisgIDM4NTI5MTA4MDJVLAkvLyA8NywwLDIsNT46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwwLDIsNSwzPgorICAyNzE4NzEzNzg2VSwJLy8gPDcsMCwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsMD4sIDwyLDYsMyw3PgorICAzODQ3MTYwMDM2VSwJLy8gPDcsMCwyLDc+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNiwwLDc+LCA8MCwyLDcsMz4KKyAgMjc2NzY2NzQ0MFUsCS8vIDw3LDAsMix1PjogQ29zdCAzIHZzbGRvaTEyIDwyLDYsMyw3PiwgPDAsMix1LDY+CisgIDI3MTg3MTQwMDZVLAkvLyA8NywwLDMsMD46IENvc3QgMyB2c2xkb2k4IDw1LDYsNywwPiwgPDMsMCwxLDI+CisgIDI3NzkxNjkwMjBVLAkvLyA8NywwLDMsMT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwwLDMsMSwwPgorICAzODUyOTEwODUzVSwJLy8gPDcsMCwzLDI+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MCwzLDIsMD4KKyAgMjcxODcxNDI2OFUsCS8vIDw3LDAsMywzPjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDA+LCA8MywzLDMsMz4KKyAgMjcxODcxNDM3MFUsCS8vIDw3LDAsMyw0PjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDA+LCA8Myw0LDUsNj4KKyAgMjcxODcxNDQ2MVUsCS8vIDw3LDAsMyw1PjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDA+LCA8Myw1LDYsNz4KKyAgMjcwNjc3MDYwOFUsCS8vIDw3LDAsMyw2PjogQ29zdCAzIHZzbGRvaTggPDMsNiw3LDA+LCA8Myw2LDcsMD4KKyAgMzg0NzE2MDExNFUsCS8vIDw3LDAsMyw3PjogQ29zdCA0IHZzbGRvaTEyIDwzLDYsMCw3PiwgPDAsMyw3LDA+CisgIDI3NzkxNjkwODNVLAkvLyA8NywwLDMsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwwLDMsdSwwPgorICAyNzE4NzE0NzcwVSwJLy8gPDcsMCw0LDA+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsMD4sIDw0LDAsNSwxPgorICAxNzA1NDI3MjgyVSwJLy8gPDcsMCw0LDE+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MCw0LDEsNT4KKyAgMzcxMzU4MzAzNFUsCS8vIDw3LDAsNCwyPjogQ29zdCA0IHZzbGRvaTQgPDMsNywwLDQ+LCA8Miw2LDMsNz4KKyAgMzcxMzU4MzgxNFUsCS8vIDw3LDAsNCwzPjogQ29zdCA0IHZzbGRvaTQgPDMsNywwLDQ+LCA8Myw3LDAsND4KKyAgMjc3OTE2OTEzM1UsCS8vIDw3LDAsNCw0PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDAsNCw0LDU+CisgIDE2NDQ5NzMzNjZVLAkvLyA8NywwLDQsNT46IENvc3QgMiB2c2xkb2k4IDw1LDYsNywwPiwgUkhTCisgIDI2NTc3NjAwODFVLAkvLyA8NywwLDQsNj46IENvc3QgMyB2c2xkb2k0IDw2LDcsMCw0PiwgPDYsNywwLDQ+CisgIDIyNTk0Njg4NjhVLAkvLyA8NywwLDQsNz46IENvc3QgMyB2bXJnaHcgPDcsNCw1LDY+LCA8MCw3LDEsND4KKyAgMTcwNTQyNzM0NVUsCS8vIDw3LDAsNCx1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDAsNCx1LDU+CisgIDI3MTg3MTU1MDhVLAkvLyA8NywwLDUsMD46IENvc3QgMyB2c2xkb2k4IDw1LDYsNywwPiwgPDUsMCw2LDE+CisgIDIyNjAxMjM3NTBVLAkvLyA8NywwLDUsMT46IENvc3QgMyB2bXJnaHcgPDcsNSw1LDU+LCBMSFMKKyAgMzc5MjQ1NzQ1MVUsCS8vIDw3LDAsNSwyPjogQ29zdCA0IHZzbGRvaTggPDUsNiw3LDA+LCA8NSwyLDEsMz4KKyAgMzg1MjkxMTAyNFUsCS8vIDw3LDAsNSwzPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDAsNSwzLDA+CisgIDI3MTg3MTU4MzZVLAkvLyA8NywwLDUsND46IENvc3QgMyB2c2xkb2k4IDw1LDYsNywwPiwgPDUsNCw2LDU+CisgIDI3MTg3MTU5MDhVLAkvLyA8NywwLDUsNT46IENvc3QgMyB2c2xkb2k4IDw1LDYsNywwPiwgPDUsNSw1LDU+CisgIDE2NDQ5NzQxNzhVLAkvLyA8NywwLDUsNj46IENvc3QgMiB2c2xkb2k4IDw1LDYsNywwPiwgPDUsNiw3LDA+CisgIDM3OTI0NTc4NTNVLAkvLyA8NywwLDUsNz46IENvc3QgNCB2c2xkb2k4IDw1LDYsNywwPiwgPDUsNywxLDA+CisgIDE2NDYzMDE0NDRVLAkvLyA8NywwLDUsdT46IENvc3QgMiB2c2xkb2k4IDw1LHUsNywwPiwgPDUsdSw3LDA+CisgIDI3MjA3MDY5MDFVLAkvLyA8NywwLDYsMD46IENvc3QgMyB2c2xkb2k4IDw2LDAsNywwPiwgPDYsMCw3LDA+CisgIDI3NzkxNjkyNzBVLAkvLyA8NywwLDYsMT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwwLDYsMSw3PgorICAyNzE4NzE2NDEwVSwJLy8gPDcsMCw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsMD4sIDw2LDIsNywzPgorICAyNzIyNjk3ODAwVSwJLy8gPDcsMCw2LDM+OiBDb3N0IDMgdnNsZG9pOCA8NiwzLDcsMD4sIDw2LDMsNywwPgorICAzODUyOTExMTIxVSwJLy8gPDcsMCw2LDQ+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MCw2LDQsNz4KKyAgMzg1MjkxMTEzMFUsCS8vIDw3LDAsNiw1PjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDAsNiw1LDc+CisgIDI3MTg3MTY3MjhVLAkvLyA8NywwLDYsNj46IENvc3QgMyB2c2xkb2k4IDw1LDYsNywwPiwgPDYsNiw2LDY+CisgIDI3MTg3MTY3NTBVLAkvLyA8NywwLDYsNz46IENvc3QgMyB2c2xkb2k4IDw1LDYsNywwPiwgPDYsNywwLDE+CisgIDI3NzkxNjkzMzNVLAkvLyA8NywwLDYsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwwLDYsdSw3PgorICAyNzE4NzE2OTIyVSwJLy8gPDcsMCw3LDA+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsMD4sIDw3LDAsMSwyPgorICAxMTg3ODcyODcwVSwJLy8gPDcsMCw3LDE+OiBDb3N0IDIgdm1yZ2h3IDw3LDcsNyw3PiwgTEhTCisgIDI3MTg3MTcwNzZVLAkvLyA8NywwLDcsMj46IENvc3QgMyB2c2xkb2k4IDw1LDYsNywwPiwgPDcsMiwwLDM+CisgIDM4NDcxNjA0MDhVLAkvLyA8NywwLDcsMz46IENvc3QgNCB2c2xkb2kxMiA8Myw2LDAsNz4sIDwwLDcsMyw2PgorICAyNzE4NzE3Mjg2VSwJLy8gPDcsMCw3LDQ+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsMD4sIDw3LDQsNSw2PgorICAyNzE4NzE3Mzc3VSwJLy8gPDcsMCw3LDU+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsMD4sIDw3LDUsNiw3PgorICAyNzE4NzE3NDA0VSwJLy8gPDcsMCw3LDY+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsMD4sIDw3LDYsMCw3PgorICAyNzE4NzE3NDc4VSwJLy8gPDcsMCw3LDc+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsMD4sIDw3LDcsMCwwPgorICAxMTg3ODczNDM3VSwJLy8gPDcsMCw3LHU+OiBDb3N0IDIgdm1yZ2h3IDw3LDcsNyw3PiwgTEhTCisgIDE1ODQwNDYxODJVLAkvLyA8NywwLHUsMD46IENvc3QgMiB2c2xkb2k0IDw2LDcsMCx1PiwgTEhTCisgIDE3MDU0Mjc2MDJVLAkvLyA8NywwLHUsMT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwwLHUsMSwxPgorICA2MzE2ODU3ODlVLAkvLyA8NywwLHUsMj46IENvc3QgMSB2c2xkb2kxMiBSSFMsIExIUworICAyNjM5ODc0NzYyVSwJLy8gPDcsMCx1LDM+OiBDb3N0IDMgdnNsZG9pNCA8Myw3LDAsdT4sIDwzLDcsMCx1PgorICAxNTg0MDQ5NDYyVSwJLy8gPDcsMCx1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8Niw3LDAsdT4sIFJIUworICAxNjQ0OTc2MjgyVSwJLy8gPDcsMCx1LDU+OiBDb3N0IDIgdnNsZG9pOCA8NSw2LDcsMD4sIFJIUworICAxNTg0MDUxMDI5VSwJLy8gPDcsMCx1LDY+OiBDb3N0IDIgdnNsZG9pNCA8Niw3LDAsdT4sIDw2LDcsMCx1PgorICAyNzE4NzE4MjA4VSwJLy8gPDcsMCx1LDc+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsMD4sIDx1LDcsMCwxPgorICA2MzE2ODU4NDNVLAkvLyA8NywwLHUsdT46IENvc3QgMSB2c2xkb2kxMiBSSFMsIExIUworICAyNzIxMzc0MjE4VSwJLy8gPDcsMSwwLDA+OiBDb3N0IDMgdnNsZG9pOCA8NiwxLDcsMT4sIDwwLDAsMSwxPgorICAyNzc5MTY5NTA3VSwJLy8gPDcsMSwwLDE+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MSwwLDEsMT4KKyAgMjc3OTE2OTUxNlUsCS8vIDw3LDEsMCwyPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDEsMCwyLDE+CisgIDM4NTI5MTEzNDhVLAkvLyA8NywxLDAsMz46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwxLDAsMywwPgorICAyNjY5NzQzNDE0VSwJLy8gPDcsMSwwLDQ+OiBDb3N0IDMgdnNsZG9pNCA8dSw3LDEsMD4sIFJIUworICAyMzE2MDU4OTYyVSwJLy8gPDcsMSwwLDU+OiBDb3N0IDMgdm1yZ2x3IDw1LDYsNywwPiwgPDAsNCwxLDU+CisgIDIzMTYwNTkwNDRVLAkvLyA8NywxLDAsNj46IENvc3QgMyB2bXJnbHcgPDUsNiw3LDA+LCA8MCw1LDEsNj4KKyAgMjY2OTc0NTE0NlUsCS8vIDw3LDEsMCw3PjogQ29zdCAzIHZzbGRvaTQgPHUsNywxLDA+LCA8NywwLDEsMj4KKyAgMjc3OTE2OTU3MFUsCS8vIDw3LDEsMCx1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDEsMCx1LDE+CisgIDI3NzkxNjk1NzlVLAkvLyA8NywxLDEsMD46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwxLDEsMCwxPgorICAxNzA1NDI3NzY0VSwJLy8gPDcsMSwxLDE+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MSwxLDEsMT4KKyAgMjc3OTE2OTU5OFUsCS8vIDw3LDEsMSwyPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDEsMSwyLDI+CisgIDM3MTM2MzI5NzJVLAkvLyA8NywxLDEsMz46IENvc3QgNCB2c2xkb2k0IDwzLDcsMSwxPiwgPDMsNywxLDE+CisgIDI3NzkxNjk2MTlVLAkvLyA8NywxLDEsND46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwxLDEsNCw1PgorICAyNzc5MTY5NjI4VSwJLy8gPDcsMSwxLDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MSwxLDUsNT4KKyAgMjY1NzgwOTIzOVUsCS8vIDw3LDEsMSw2PjogQ29zdCAzIHZzbGRvaTQgPDYsNywxLDE+LCA8Niw3LDEsMT4KKyAgMzgzNTI5MDQ3NFUsCS8vIDw3LDEsMSw3PjogQ29zdCA0IHZzbGRvaTEyIDwxLDYsMSw3PiwgPDEsMSw3LDE+CisgIDE3MDU0Mjc3NjRVLAkvLyA8NywxLDEsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwxLDEsMSwxPgorICAyNzc5MTY5NjYwVSwJLy8gPDcsMSwyLDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MSwyLDAsMT4KKyAgMjc3OTE2OTY3MVUsCS8vIDw3LDEsMiwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDEsMiwxLDM+CisgIDI3NzkxNjk2ODBVLAkvLyA8NywxLDIsMj46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwxLDIsMiwzPgorICAxNzA1NDI3ODYyVSwJLy8gPDcsMSwyLDM+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MSwyLDMsMD4KKyAgMjc3OTE2OTcwMFUsCS8vIDw3LDEsMiw0PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDEsMiw0LDU+CisgIDI3NzkxNjk3MDdVLAkvLyA8NywxLDIsNT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwxLDIsNSwzPgorICAyNjU3ODE3NDMyVSwJLy8gPDcsMSwyLDY+OiBDb3N0IDMgdnNsZG9pNCA8Niw3LDEsMj4sIDw2LDcsMSwyPgorICAyODAzMDU3NTk0VSwJLy8gPDcsMSwyLDc+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MSwyLDcsMD4KKyAgMTcwNTQyNzkwN1UsCS8vIDw3LDEsMix1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDEsMix1LDA+CisgIDM3NzY1Mzg4MjdVLAkvLyA8NywxLDMsMD46IENvc3QgNCB2c2xkb2k4IDwzLDAsNywxPiwgPDMsMCw3LDE+CisgIDIzMTk0MDA5NzBVLAkvLyA8NywxLDMsMT46IENvc3QgMyB2bXJnbHcgPDYsMiw3LDM+LCA8MCwwLDEsMT4KKyAgMjMxNjA4NTM5OFUsCS8vIDw3LDEsMywyPjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsMz4sIDwzLDAsMSwyPgorICAzODUyOTExNTkxVSwJLy8gPDcsMSwzLDM+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MSwzLDMsMD4KKyAgMzg1MjkxMTYwMFUsCS8vIDw3LDEsMyw0PjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDEsMyw0LDA+CisgIDIzMTk0MDEyOThVLAkvLyA8NywxLDMsNT46IENvc3QgMyB2bXJnbHcgPDYsMiw3LDM+LCA8MCw0LDEsNT4KKyAgMzgzMzY2ODYxN1UsCS8vIDw3LDEsMyw2PjogQ29zdCA0IHZzbGRvaTEyIDwxLDMsNiw3PiwgPDEsMyw2LDc+CisgIDMzNjcyNjU0ODdVLAkvLyA8NywxLDMsNz46IENvc3QgNCB2bXJnbHcgPDEsdSw3LDM+LCA8MSw2LDEsNz4KKyAgMjMxOTQwMDk3N1UsCS8vIDw3LDEsMyx1PjogQ29zdCAzIHZtcmdsdyA8NiwyLDcsMz4sIDwwLDAsMSx1PgorICAyNzI0MDMxMzc4VSwJLy8gPDcsMSw0LDA+OiBDb3N0IDMgdnNsZG9pOCA8Niw1LDcsMT4sIDw0LDAsNSwxPgorICAyNzc5MTY5ODM1VSwJLy8gPDcsMSw0LDE+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MSw0LDEsNT4KKyAgMjc3OTE2OTg0NFUsCS8vIDw3LDEsNCwyPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDEsNCwyLDU+CisgIDM4NTI5MTE2NzJVLAkvLyA8NywxLDQsMz46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwxLDQsMywwPgorICAyNjY5Nzc2MTgyVSwJLy8gPDcsMSw0LDQ+OiBDb3N0IDMgdnNsZG9pNCA8dSw3LDEsND4sIFJIUworICAyNzc5MTY5ODcyVSwJLy8gPDcsMSw0LDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MSw0LDUsNj4KKyAgMzgzNTI5MDcxMlUsCS8vIDw3LDEsNCw2PjogQ29zdCA0IHZzbGRvaTEyIDwxLDYsMSw3PiwgPDEsNCw2LDU+CisgIDI2Njk3NzgyNzhVLAkvLyA8NywxLDQsNz46IENvc3QgMyB2c2xkb2k0IDx1LDcsMSw0PiwgPDcsNCw1LDY+CisgIDI3NzkxNjk4OThVLAkvLyA8NywxLDQsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwxLDQsdSw1PgorICAyNzc5MTY5OTAzVSwJLy8gPDcsMSw1LDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MSw1LDAsMT4KKyAgMzgzNTU4NTY2MVUsCS8vIDw3LDEsNSwxPjogQ29zdCA0IHZzbGRvaTEyIDwxLDYsNSw3PiwgPDEsNSwxLDY+CisgIDM4NDE0MTAxODJVLAkvLyA8NywxLDUsMj46IENvc3QgNCB2c2xkb2kxMiA8Miw2LDMsNz4sIDwxLDUsMiw2PgorICAzODUyOTExNzUzVSwJLy8gPDcsMSw1LDM+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MSw1LDMsMD4KKyAgMjc3OTE2OTk0M1UsCS8vIDw3LDEsNSw0PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDEsNSw0LDU+CisgIDIzMTg3NTQxMzBVLAkvLyA8NywxLDUsNT46IENvc3QgMyB2bXJnbHcgPDYsMSw3LDU+LCA8MCw0LDEsNT4KKyAgMjcxODcyNDE5NVUsCS8vIDw3LDEsNSw2PjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDE+LCA8NSw2LDcsMT4KKyAgMzg1OTE3ODY3MFUsCS8vIDw3LDEsNSw3PjogQ29zdCA0IHZzbGRvaTEyIDw1LDYsMSw3PiwgPDEsNSw3LDE+CisgIDI3NzkxNjk5NzVVLAkvLyA8NywxLDUsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwxLDUsdSwxPgorICAyNzIwNzE1MDk0VSwJLy8gPDcsMSw2LDA+OiBDb3N0IDMgdnNsZG9pOCA8NiwwLDcsMT4sIDw2LDAsNywxPgorICAyNzYxNTQ5MDA3VSwJLy8gPDcsMSw2LDE+OiBDb3N0IDMgdnNsZG9pMTIgPDEsNiwxLDc+LCA8MSw2LDEsNz4KKyAgMjc3OTE3MDAwOFUsCS8vIDw3LDEsNiwyPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDEsNiwyLDc+CisgIDM4MzU0MzgzMDVVLAkvLyA8NywxLDYsMz46IENvc3QgNCB2c2xkb2kxMiA8MSw2LDMsNz4sIDwxLDYsMyw3PgorICAzODM1NTEyMDQyVSwJLy8gPDcsMSw2LDQ+OiBDb3N0IDQgdnNsZG9pMTIgPDEsNiw0LDc+LCA8MSw2LDQsNz4KKyAgMjc2MTg0Mzk1NVUsCS8vIDw3LDEsNiw1PjogQ29zdCAzIHZzbGRvaTEyIDwxLDYsNSw3PiwgPDEsNiw1LDc+CisgIDM4MzU2NTk1MTZVLAkvLyA8NywxLDYsNj46IENvc3QgNCB2c2xkb2kxMiA8MSw2LDYsNz4sIDwxLDYsNiw3PgorICAyODAzMDU3OTE4VSwJLy8gPDcsMSw2LDc+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MSw2LDcsMD4KKyAgMjc2MjA2NTE2NlUsCS8vIDw3LDEsNix1PjogQ29zdCAzIHZzbGRvaTEyIDwxLDYsdSw3PiwgPDEsNix1LDc+CisgIDI2Njk3OTc0NzhVLAkvLyA8NywxLDcsMD46IENvc3QgMyB2c2xkb2k0IDx1LDcsMSw3PiwgTEhTCisgIDIzMjIwODc5NDZVLAkvLyA8NywxLDcsMT46IENvc3QgMyB2bXJnbHcgPDYsNiw3LDc+LCA8MCwwLDEsMT4KKyAgMjMxNzQ0ODE4NlUsCS8vIDw3LDEsNywyPjogQ29zdCAzIHZtcmdsdyA8NSx1LDcsNz4sIDw3LDAsMSwyPgorICAzMzk1ODI5OTM0VSwJLy8gPDcsMSw3LDM+OiBDb3N0IDQgdm1yZ2x3IDw2LDYsNyw3PiwgPDAsMiwxLDM+CisgIDI2Njk4MDA3NThVLAkvLyA8NywxLDcsND46IENvc3QgMyB2c2xkb2k0IDx1LDcsMSw3PiwgUkhTCisgIDIzMjIwODgyNzRVLAkvLyA8NywxLDcsNT46IENvc3QgMyB2bXJnbHcgPDYsNiw3LDc+LCA8MCw0LDEsNT4KKyAgMzM3NTkyMzM3N1UsCS8vIDw3LDEsNyw2PjogQ29zdCA0IHZtcmdsdyA8MywzLDcsNz4sIDwwLDIsMSw2PgorICAyNzMxOTk2NzgwVSwJLy8gPDcsMSw3LDc+OiBDb3N0IDMgdnNsZG9pOCA8Nyx1LDcsMT4sIDw3LDcsNyw3PgorICAyMzIyMDg3OTUzVSwJLy8gPDcsMSw3LHU+OiBDb3N0IDMgdm1yZ2x3IDw2LDYsNyw3PiwgPDAsMCwxLHU+CisgIDI3NzkxNzAxNDZVLAkvLyA8NywxLHUsMD46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwxLHUsMCwxPgorICAxNzA1NDI3NzY0VSwJLy8gPDcsMSx1LDE+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MSwxLDEsMT4KKyAgMjc3OTE3MDE2NFUsCS8vIDw3LDEsdSwyPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDEsdSwyLDE+CisgIDE3MDU0MjgzNDhVLAkvLyA8NywxLHUsMz46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwxLHUsMywwPgorICAyNzc5MTcwMTg2VSwJLy8gPDcsMSx1LDQ+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MSx1LDQsNT4KKyAgMjc2MzE3MTIyMVUsCS8vIDw3LDEsdSw1PjogQ29zdCAzIHZzbGRvaTEyIDwxLHUsNSw3PiwgPDEsdSw1LDc+CisgIDI2NTc4NjY1OTBVLAkvLyA8NywxLHUsNj46IENvc3QgMyB2c2xkb2k0IDw2LDcsMSx1PiwgPDYsNywxLHU+CisgIDI4MDMwNTgwODBVLAkvLyA8NywxLHUsNz46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwxLHUsNywwPgorICAxNzA1NDI4MzkzVSwJLy8gPDcsMSx1LHU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MSx1LHUsMD4KKyAgMzcxMzY5NTg0NlUsCS8vIDw3LDIsMCwwPjogQ29zdCA0IHZzbGRvaTQgPDMsNywyLDA+LCBMSFMKKyAgMjc3OTE3MDIzN1UsCS8vIDw3LDIsMCwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDIsMCwxLDI+CisgIDI3NzkxNzAyNDVVLAkvLyA8NywyLDAsMj46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwyLDAsMiwxPgorICAxMjQyMzE2OTAyVSwJLy8gPDcsMiwwLDM+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNywwPiwgTEhTCisgIDM3MTM2OTkxMjZVLAkvLyA8NywyLDAsND46IENvc3QgNCB2c2xkb2k0IDwzLDcsMiwwPiwgUkhTCisgIDM4NTI5MTIwOTZVLAkvLyA8NywyLDAsNT46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwyLDAsNSwxPgorICAyNzY3NjY4NzEzVSwJLy8gPDcsMiwwLDY+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNiwzLDc+LCA8MiwwLDYsMT4KKyAgMjI1NjQ4ODQyNlUsCS8vIDw3LDIsMCw3PjogQ29zdCAzIHZtcmdodyA8NywwLDEsMj4sIDwyLDcsMCwxPgorICAxMjQyMzE2OTA3VSwJLy8gPDcsMiwwLHU+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNywwPiwgTEhTCisgIDM4NTI5MTIxMzJVLAkvLyA8NywyLDEsMD46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwyLDEsMCwxPgorICAzODUyOTEyMTQxVSwJLy8gPDcsMiwxLDE+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MiwxLDEsMT4KKyAgMzg1MjkxMjE0OVUsCS8vIDw3LDIsMSwyPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDIsMSwyLDA+CisgIDI3NzkxNzAzMzVVLAkvLyA8NywyLDEsMz46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwyLDEsMywxPgorICAzODUyOTEyMTcyVSwJLy8gPDcsMiwxLDQ+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MiwxLDQsNT4KKyAgMzg0MDc0NzA2MlUsCS8vIDw3LDIsMSw1PjogQ29zdCA1IHZzbGRvaTEyIDwyLDUsMyw3PiwgPDIsMSw1LDY+CisgIDM4NDE0MTA2MTdVLAkvLyA8NywyLDEsNj46IENvc3QgNCB2c2xkb2kxMiA8Miw2LDMsNz4sIDwyLDEsNiwwPgorICAzNzk1MTI1NTM4VSwJLy8gPDcsMiwxLDc+OiBDb3N0IDQgdnNsZG9pOCA8NiwxLDcsMj4sIDwxLDcsMiwwPgorICAyNzc5MTcwMzgwVSwJLy8gPDcsMiwxLHU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MiwxLHUsMT4KKyAgMjc3OTE3MDM4OVUsCS8vIDw3LDIsMiwwPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDIsMiwwLDE+CisgIDM4NTI5MTIyMjJVLAkvLyA8NywyLDIsMT46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwyLDIsMSwxPgorICAxNzA1NDI4NTg0VSwJLy8gPDcsMiwyLDI+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MiwyLDIsMj4KKyAgMTcwNTQyODU5NFUsCS8vIDw3LDIsMiwzPjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDIsMiwzLDM+CisgIDI3NzkxNzA0MjlVLAkvLyA8NywyLDIsND46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwyLDIsNCw1PgorICAzODUyOTEyMjU5VSwJLy8gPDcsMiwyLDU+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MiwyLDUsMj4KKyAgMjc2NzY2ODg4MFUsCS8vIDw3LDIsMiw2PjogQ29zdCAzIHZzbGRvaTEyIDwyLDYsMyw3PiwgPDIsMiw2LDY+CisgIDM4NDEzMzY5ODFVLAkvLyA8NywyLDIsNz46IENvc3QgNCB2c2xkb2kxMiA8Miw2LDIsNz4sIDwyLDIsNywyPgorICAxNzA1NDI4NjM5VSwJLy8gPDcsMiwyLHU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MiwyLHUsMz4KKyAgMTcwNTQyODY0NlUsCS8vIDw3LDIsMywwPjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDIsMywwLDE+CisgIDI3NzkxNzA0NzlVLAkvLyA8NywyLDMsMT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwyLDMsMSwxPgorICAyNzY3NjY4OTI1VSwJLy8gPDcsMiwzLDI+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNiwzLDc+LCA8MiwzLDIsNj4KKyAgMTI0NTY1OTIzOFUsCS8vIDw3LDIsMywzPjogQ29zdCAyIHZtcmdsdyA8NiwyLDcsMz4sIExIUworICAxNzA1NDI4Njg2VSwJLy8gPDcsMiwzLDQ+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MiwzLDQsNT4KKyAgMjc3OTE3MDUxOVUsCS8vIDw3LDIsMyw1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDIsMyw1LDU+CisgIDI2NTc4OTkzNjJVLAkvLyA8NywyLDMsNj46IENvc3QgMyB2c2xkb2k0IDw2LDcsMiwzPiwgPDYsNywyLDM+CisgIDIzMTk0MDY1NzRVLAkvLyA8NywyLDMsNz46IENvc3QgMyB2bXJnbHcgPDYsMiw3LDM+LCA8Nyw2LDIsNz4KKyAgMTcwNTQyODcxOFUsCS8vIDw3LDIsMyx1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDIsMyx1LDE+CisgIDM3MTM3Mjg2MTRVLAkvLyA8NywyLDQsMD46IENvc3QgNCB2c2xkb2k0IDwzLDcsMiw0PiwgTEhTCisgIDM4NTI5MTIzODhVLAkvLyA8NywyLDQsMT46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwyLDQsMSw1PgorICAyNzc5MTcwNTczVSwJLy8gPDcsMiw0LDI+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Miw0LDIsNT4KKyAgMTI0MjM0OTY3MFUsCS8vIDw3LDIsNCwzPjogQ29zdCAyIHZtcmdsdyA8NSw2LDcsND4sIExIUworICAzNzEzNzMxODk0VSwJLy8gPDcsMiw0LDQ+OiBDb3N0IDQgdnNsZG9pNCA8Myw3LDIsND4sIFJIUworICAyNzc5MTcwNjAxVSwJLy8gPDcsMiw0LDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Miw0LDUsNj4KKyAgMjc2NzY2OTA0MVUsCS8vIDw3LDIsNCw2PjogQ29zdCAzIHZzbGRvaTEyIDwyLDYsMyw3PiwgPDIsNCw2LDU+CisgIDMzODk4MzQ0NTZVLAkvLyA8NywyLDQsNz46IENvc3QgNCB2bXJnbHcgPDUsNiw3LDQ+LCA8MSw2LDIsNz4KKyAgMTI0MjM0OTY3NVUsCS8vIDw3LDIsNCx1PjogQ29zdCAyIHZtcmdsdyA8NSw2LDcsND4sIExIUworICAzODUyOTEyNDU2VSwJLy8gPDcsMiw1LDA+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8Miw1LDAsMT4KKyAgMzg1MjkxMjQ2NlUsCS8vIDw3LDIsNSwxPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDIsNSwxLDI+CisgIDM4NTI5MTI0NzVVLAkvLyA8NywyLDUsMj46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwyLDUsMiwyPgorICAyNzc5MTcwNjY0VSwJLy8gPDcsMiw1LDM+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Miw1LDMsNj4KKyAgMzg1MjkxMjQ5NlUsCS8vIDw3LDIsNSw0PjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDIsNSw0LDU+CisgIDM3OTI0NzQxMTZVLAkvLyA8NywyLDUsNT46IENvc3QgNCB2c2xkb2k4IDw1LDYsNywyPiwgPDUsNSw1LDU+CisgIDI3MTg3MzIzODhVLAkvLyA8NywyLDUsNj46IENvc3QgMyB2c2xkb2k4IDw1LDYsNywyPiwgPDUsNiw3LDI+CisgIDM4NDEzMzcyMjhVLAkvLyA8NywyLDUsNz46IENvc3QgNSB2c2xkb2kxMiA8Miw2LDIsNz4sIDwyLDUsNyw2PgorICAyNzc5MTcwNzA5VSwJLy8gPDcsMiw1LHU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Miw1LHUsNj4KKyAgMjY0MDAwMzE3NFUsCS8vIDw3LDIsNiwwPjogQ29zdCAzIHZzbGRvaTQgPDMsNywyLDY+LCBMSFMKKyAgMjcyMTM4NjkyMFUsCS8vIDw3LDIsNiwxPjogQ29zdCAzIHZzbGRvaTggPDYsMSw3LDI+LCA8NiwxLDcsMj4KKyAgMjc2NzU5NTQ0MVUsCS8vIDw3LDIsNiwyPjogQ29zdCAzIHZzbGRvaTEyIDwyLDYsMiw3PiwgPDIsNiwyLDc+CisgIDE2OTM5MjczNTRVLAkvLyA8NywyLDYsMz46IENvc3QgMiB2c2xkb2kxMiA8Miw2LDMsNz4sIDwyLDYsMyw3PgorICAyNjQwMDA2NDU0VSwJLy8gPDcsMiw2LDQ+OiBDb3N0IDMgdnNsZG9pNCA8Myw3LDIsNj4sIFJIUworICAzODQxNTU4NDc2VSwJLy8gPDcsMiw2LDU+OiBDb3N0IDQgdnNsZG9pMTIgPDIsNiw1LDc+LCA8Miw2LDUsNz4KKyAgMjY1NzkyMzk0MVUsCS8vIDw3LDIsNiw2PjogQ29zdCAzIHZzbGRvaTQgPDYsNywyLDY+LCA8Niw3LDIsNj4KKyAgMzg0MTMzNzMxMFUsCS8vIDw3LDIsNiw3PjogQ29zdCA0IHZzbGRvaTEyIDwyLDYsMiw3PiwgPDIsNiw3LDc+CisgIDE2OTQyOTYwMzlVLAkvLyA8NywyLDYsdT46IENvc3QgMiB2c2xkb2kxMiA8Miw2LHUsNz4sIDwyLDYsdSw3PgorICAyODAzMDU4NjY2VSwJLy8gPDcsMiw3LDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Miw3LDAsMT4KKyAgMzg1MjkxMjYzMlUsCS8vIDw3LDIsNywxPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDIsNywxLDY+CisgIDIzMjIwODk1NzZVLAkvLyA8NywyLDcsMj46IENvc3QgMyB2bXJnbHcgPDYsNiw3LDc+LCA8MiwyLDIsMj4KKyAgMTI0ODM0NjIxNFUsCS8vIDw3LDIsNywzPjogQ29zdCAyIHZtcmdsdyA8Niw2LDcsNz4sIExIUworICAzODQxMzM3MzYyVSwJLy8gPDcsMiw3LDQ+OiBDb3N0IDQgdnNsZG9pMTIgPDIsNiwyLDc+LCA8Miw3LDQsNT4KKyAgMzM5NTgzMDgzNlUsCS8vIDw3LDIsNyw1PjogQ29zdCA0IHZtcmdsdyA8Niw2LDcsNz4sIDwxLDQsMiw1PgorICAyMjYxNjE2NTcwVSwJLy8gPDcsMiw3LDY+OiBDb3N0IDMgdm1yZ2h3IDw3LDcsNyw3PiwgPDIsNiwzLDc+CisgIDMzNzE5NDM4NTdVLAkvLyA8NywyLDcsNz46IENvc3QgNCB2bXJnbHcgPDIsNiw3LDc+LCA8Miw2LDIsNz4KKyAgMTI0ODM0NjIxOVUsCS8vIDw3LDIsNyx1PjogQ29zdCAyIHZtcmdsdyA8Niw2LDcsNz4sIExIUworICAxNzA1NDI5MDUxVSwJLy8gPDcsMix1LDA+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8Mix1LDAsMT4KKyAgMjc3OTE3MDg4NFUsCS8vIDw3LDIsdSwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDIsdSwxLDE+CisgIDE3MDU0Mjg1ODRVLAkvLyA8NywyLHUsMj46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwyLDIsMiwyPgorICAxNjk1MjU0NjIwVSwJLy8gPDcsMix1LDM+OiBDb3N0IDIgdnNsZG9pMTIgPDIsdSwzLDc+LCA8Mix1LDMsNz4KKyAgMTcwNTQyOTA5MVUsCS8vIDw3LDIsdSw0PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDIsdSw0LDU+CisgIDI3NzkxNzA5MjRVLAkvLyA8NywyLHUsNT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwyLHUsNSw1PgorICAyNzY3NjY5MzYxVSwJLy8gPDcsMix1LDY+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNiwzLDc+LCA8Mix1LDYsMT4KKyAgMjgwMzA1ODgwOVUsCS8vIDw3LDIsdSw3PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDIsdSw3LDA+CisgIDE2OTU2MjMzMDVVLAkvLyA8NywyLHUsdT46IENvc3QgMiB2c2xkb2kxMiA8Mix1LHUsNz4sIDwyLHUsdSw3PgorICAyNzc5MTcwOTU1VSwJLy8gPDcsMywwLDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MywwLDAsMD4KKyAgMTcwNTQyOTE0MlUsCS8vIDw3LDMsMCwxPjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDMsMCwxLDI+CisgIDI2MzQwNTc3MzJVLAkvLyA8NywzLDAsMj46IENvc3QgMyB2c2xkb2k0IDwyLDcsMywwPiwgPDIsNywzLDA+CisgIDI3NzkxNzA5ODNVLAkvLyA8NywzLDAsMz46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwzLDAsMywxPgorICAyNzc5MTcwOTkyVSwJLy8gPDcsMywwLDQ+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MywwLDQsMT4KKyAgMzg1MjkxMjgyOVUsCS8vIDw3LDMsMCw1PjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDMsMCw1LDU+CisgIDI2NTc5NDg1MjBVLAkvLyA8NywzLDAsNj46IENvc3QgMyB2c2xkb2k0IDw2LDcsMywwPiwgPDYsNywzLDA+CisgIDIzMTYwNjA2MDJVLAkvLyA8NywzLDAsNz46IENvc3QgMyB2bXJnbHcgPDUsNiw3LDA+LCA8Miw2LDMsNz4KKyAgMTcwNTQyOTIwNVUsCS8vIDw3LDMsMCx1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDMsMCx1LDI+CisgIDM4NTI5MTI4NjBVLAkvLyA8NywzLDEsMD46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwzLDEsMCwwPgorICAyNzc5MTcxMDQ2VSwJLy8gPDcsMywxLDE+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MywxLDEsMT4KKyAgMjc3OTE3MTA1N1UsCS8vIDw3LDMsMSwyPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDMsMSwyLDM+CisgIDM4NTI5MTI4ODdVLAkvLyA8NywzLDEsMz46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwzLDEsMywwPgorICAzODUyOTEyODk2VSwJLy8gPDcsMywxLDQ+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MywxLDQsMD4KKyAgMzg1MjkxMjkwNVUsCS8vIDw3LDMsMSw1PjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDMsMSw1LDA+CisgIDM4MzUyOTE5MjNVLAkvLyA8NywzLDEsNj46IENvc3QgNCB2c2xkb2kxMiA8MSw2LDEsNz4sIDwzLDEsNiwxPgorICAzODQxNDExMzU2VSwJLy8gPDcsMywxLDc+OiBDb3N0IDQgdnNsZG9pMTIgPDIsNiwzLDc+LCA8MywxLDcsMT4KKyAgMjc3OTE3MTExMVUsCS8vIDw3LDMsMSx1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDMsMSx1LDM+CisgIDI3NzkxNzExMjBVLAkvLyA8NywzLDIsMD46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwzLDIsMCwzPgorICAzODUyOTEyOTUyVSwJLy8gPDcsMywyLDE+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MywyLDEsMj4KKyAgMjc3OTE3MTEzN1UsCS8vIDw3LDMsMiwyPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDMsMiwyLDI+CisgIDI3NzkxNzExNDRVLAkvLyA8NywzLDIsMz46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwzLDIsMywwPgorICAyNzc5MTcxMTU2VSwJLy8gPDcsMywyLDQ+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8MywyLDQsMz4KKyAgMzg1MjkxMjk4OVUsCS8vIDw3LDMsMiw1PjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDMsMiw1LDM+CisgIDI3Njc2Njk2MDZVLAkvLyA8NywzLDIsNj46IENvc3QgMyB2c2xkb2kxMiA8Miw2LDMsNz4sIDwzLDIsNiwzPgorICAyNzY3NjY5NjE1VSwJLy8gPDcsMywyLDc+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNiwzLDc+LCA8MywyLDcsMz4KKyAgMjc3OTE3MTE4OVUsCS8vIDw3LDMsMix1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDMsMix1LDA+CisgIDI3NzkxNzExOThVLAkvLyA8NywzLDMsMD46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwzLDMsMCwwPgorICAzODUyOTEzMDMyVSwJLy8gPDcsMywzLDE+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MywzLDEsMT4KKyAgMjcwNDE0MDY1NVUsCS8vIDw3LDMsMywyPjogQ29zdCAzIHZzbGRvaTggPDMsMiw3LDM+LCA8MywyLDcsMz4KKyAgMTcwNTQyOTQwNFUsCS8vIDw3LDMsMywzPjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDMsMywzLDM+CisgIDI3NzkxNzEyMzhVLAkvLyA8NywzLDMsND46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwzLDMsNCw0PgorICAzODUyOTEzMDcwVSwJLy8gPDcsMywzLDU+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8MywzLDUsMz4KKyAgMjY1Nzk3MzA5OVUsCS8vIDw3LDMsMyw2PjogQ29zdCAzIHZzbGRvaTQgPDYsNywzLDM+LCA8Niw3LDMsMz4KKyAgMjc2NzY2OTcwMFUsCS8vIDw3LDMsMyw3PjogQ29zdCAzIHZzbGRvaTEyIDwyLDYsMyw3PiwgPDMsMyw3LDc+CisgIDE3MDU0Mjk0MDRVLAkvLyA8NywzLDMsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwzLDMsMywzPgorICAyNzc5MTcxMjgwVSwJLy8gPDcsMyw0LDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Myw0LDAsMT4KKyAgMjc3OTE3MTI5MFUsCS8vIDw3LDMsNCwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDMsNCwxLDI+CisgIDI2MzQwOTA1MDRVLAkvLyA8NywzLDQsMj46IENvc3QgMyB2c2xkb2k0IDwyLDcsMyw0PiwgPDIsNywzLDQ+CisgIDI3NzkxNzEzMTFVLAkvLyA8NywzLDQsMz46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDwzLDQsMyw1PgorICAyNzc5MTcxMzE5VSwJLy8gPDcsMyw0LDQ+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Myw0LDQsND4KKyAgMTcwNTQyOTUwNlUsCS8vIDw3LDMsNCw1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDMsNCw1LDY+CisgIDI3MjIwNTc1OTNVLAkvLyA8NywzLDQsNj46IENvc3QgMyB2c2xkb2k4IDw2LDIsNywzPiwgPDQsNiw1LDI+CisgIDIzMTYwOTMzNzBVLAkvLyA8NywzLDQsNz46IENvc3QgMyB2bXJnbHcgPDUsNiw3LDQ+LCA8Miw2LDMsNz4KKyAgMTcwNTQyOTUzM1UsCS8vIDw3LDMsNCx1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDMsNCx1LDY+CisgIDM4NTI5MTMxODVVLAkvLyA8NywzLDUsMD46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwzLDUsMCwxPgorICAzNzk1Nzk5Njk1VSwJLy8gPDcsMyw1LDE+OiBDb3N0IDQgdnNsZG9pOCA8NiwyLDcsMz4sIDw1LDEsMCwxPgorICAzODUyOTEzMjAzVSwJLy8gPDcsMyw1LDI+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8Myw1LDIsMT4KKyAgMzg1MjkxMzIxNFUsCS8vIDw3LDMsNSwzPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDMsNSwzLDM+CisgIDM4NTI5MTMyMjVVLAkvLyA8NywzLDUsND46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDwzLDUsNCw1PgorICAyNzc5MTcxNDEwVSwJLy8gPDcsMyw1LDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Myw1LDUsNT4KKyAgMjcxODc0MDU4MVUsCS8vIDw3LDMsNSw2PjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDM+LCA8NSw2LDcsMz4KKyAgMzg0MTQxMTY4NVUsCS8vIDw3LDMsNSw3PjogQ29zdCA0IHZzbGRvaTEyIDwyLDYsMyw3PiwgPDMsNSw3LDY+CisgIDI3MjAwNjc4NDdVLAkvLyA8NywzLDUsdT46IENvc3QgMyB2c2xkb2k4IDw1LHUsNywzPiwgPDUsdSw3LDM+CisgIDI3NzM0MjA2NjRVLAkvLyA8NywzLDYsMD46IENvc3QgMyB2c2xkb2kxMiA8Myw2LDAsNz4sIDwzLDYsMCw3PgorICAzODQ3MjM2MjI1VSwJLy8gPDcsMyw2LDE+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNiwxLDc+LCA8Myw2LDEsNz4KKyAgMTY0ODMxNjkyMlUsCS8vIDw3LDMsNiwyPjogQ29zdCAyIHZzbGRvaTggPDYsMiw3LDM+LCA8NiwyLDcsMz4KKyAgMjc3MzY0MTg3NVUsCS8vIDw3LDMsNiwzPjogQ29zdCAzIHZzbGRvaTEyIDwzLDYsMyw3PiwgPDMsNiwzLDc+CisgIDI3NzM3MTU2MTJVLAkvLyA8NywzLDYsND46IENvc3QgMyB2c2xkb2kxMiA8Myw2LDQsNz4sIDwzLDYsNCw3PgorICAzODQ3NTMxMTczVSwJLy8gPDcsMyw2LDU+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNiw1LDc+LCA8Myw2LDUsNz4KKyAgMjcyMjA1OTAyNFUsCS8vIDw3LDMsNiw2PjogQ29zdCAzIHZzbGRvaTggPDYsMiw3LDM+LCA8Niw2LDIsMj4KKyAgMjc2NzY2OTk0M1UsCS8vIDw3LDMsNiw3PjogQ29zdCAzIHZzbGRvaTEyIDwyLDYsMyw3PiwgPDMsNiw3LDc+CisgIDE2NTIyOTg3MjBVLAkvLyA8NywzLDYsdT46IENvc3QgMiB2c2xkb2k4IDw2LHUsNywzPiwgPDYsdSw3LDM+CisgIDI3Njc2Njk5NTVVLAkvLyA8NywzLDcsMD46IENvc3QgMyB2c2xkb2kxMiA8Miw2LDMsNz4sIDwzLDcsMCwxPgorICAzODQxNDExNzg4VSwJLy8gPDcsMyw3LDE+OiBDb3N0IDQgdnNsZG9pMTIgPDIsNiwzLDc+LCA8Myw3LDEsMT4KKyAgMjc2NzY2OTk3OFUsCS8vIDw3LDMsNywyPjogQ29zdCAzIHZzbGRvaTEyIDwyLDYsMyw3PiwgPDMsNywyLDY+CisgIDI3MjIwNTk1NDZVLAkvLyA8NywzLDcsMz46IENvc3QgMyB2c2xkb2k4IDw2LDIsNywzPiwgPDcsMyw2LDI+CisgIDI3Njc2Njk5OTVVLAkvLyA8NywzLDcsND46IENvc3QgMyB2c2xkb2kxMiA8Miw2LDMsNz4sIDwzLDcsNCw1PgorICAzODUyOTEzMzk2VSwJLy8gPDcsMyw3LDU+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8Myw3LDUsNT4KKyAgMjcyMjA1OTc1OFUsCS8vIDw3LDMsNyw2PjogQ29zdCAzIHZzbGRvaTggPDYsMiw3LDM+LCA8Nyw2LDIsNz4KKyAgMjMwMjE4MzM1NFUsCS8vIDw3LDMsNyw3PjogQ29zdCAzIHZtcmdsdyA8MywzLDcsNz4sIDwyLDYsMyw3PgorICAyNzY3NjcwMDI3VSwJLy8gPDcsMyw3LHU+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNiwzLDc+LCA8Myw3LHUsMT4KKyAgMjc3NDc0NzkzMFUsCS8vIDw3LDMsdSwwPjogQ29zdCAzIHZzbGRvaTEyIDwzLHUsMCw3PiwgPDMsdSwwLDc+CisgIDE3MDU0Mjk3OTBVLAkvLyA8NywzLHUsMT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwzLHUsMSwyPgorICAxNjYwMjYyMzE2VSwJLy8gPDcsMyx1LDI+OiBDb3N0IDIgdnNsZG9pOCA8dSwyLDcsMz4sIDx1LDIsNywzPgorICAxNzA1NDI5NDA0VSwJLy8gPDcsMyx1LDM+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MywzLDMsMz4KKyAgMjc3NTA0Mjg3OFUsCS8vIDw3LDMsdSw0PjogQ29zdCAzIHZzbGRvaTEyIDwzLHUsNCw3PiwgPDMsdSw0LDc+CisgIDE3MDU0Mjk4MzBVLAkvLyA8NywzLHUsNT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwzLHUsNSw2PgorICAyNzc5MTcxNjYwVSwJLy8gPDcsMyx1LDY+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Myx1LDYsMz4KKyAgMjc2NzY3MDEwMVUsCS8vIDw3LDMsdSw3PjogQ29zdCAzIHZzbGRvaTEyIDwyLDYsMyw3PiwgPDMsdSw3LDM+CisgIDE3MDU0Mjk4NTNVLAkvLyA8NywzLHUsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwzLHUsdSwyPgorICAyNzE4NzQ0NTc2VSwJLy8gPDcsNCwwLDA+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDwwLDAsMCwwPgorICAxNjQ1MDAyODU0VSwJLy8gPDcsNCwwLDE+OiBDb3N0IDIgdnNsZG9pOCA8NSw2LDcsND4sIExIUworICAzODUyOTEzNTI3VSwJLy8gPDcsNCwwLDI+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NCwwLDIsMT4KKyAgMzg1MjkxMzUzNlUsCS8vIDw3LDQsMCwzPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDQsMCwzLDE+CisgIDIzMTYwNjE5MDRVLAkvLyA8Nyw0LDAsND46IENvc3QgMyB2bXJnbHcgPDUsNiw3LDA+LCA8NCw0LDQsND4KKyAgMTcwNTQyOTkwNlUsCS8vIDw3LDQsMCw1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDQsMCw1LDE+CisgIDI2NTgwMjIyNTdVLAkvLyA8Nyw0LDAsNj46IENvc3QgMyB2c2xkb2k0IDw2LDcsNCwwPiwgPDYsNyw0LDA+CisgIDIyNTY0ODk5MjhVLAkvLyA8Nyw0LDAsNz46IENvc3QgMyB2bXJnaHcgPDcsMCwxLDI+LCA8NCw3LDUsMD4KKyAgMTcwNzQyMDU4OVUsCS8vIDw3LDQsMCx1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDQsMCx1LDE+CisgIDM4NTI5MTM1OTBVLAkvLyA8Nyw0LDEsMD46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw0LDEsMCwxPgorICAyNzE4NzQ1Mzk2VSwJLy8gPDcsNCwxLDE+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDwxLDEsMSwxPgorICAyNzc5MTcxNzg2VSwJLy8gPDcsNCwxLDI+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NCwxLDIsMz4KKyAgMzg1MjkxMzYxNlUsCS8vIDw3LDQsMSwzPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDQsMSwzLDA+CisgIDM4NTI5MTM2MjdVLAkvLyA8Nyw0LDEsND46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw0LDEsNCwyPgorICAyNzc5MTcxODEwVSwJLy8gPDcsNCwxLDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NCwxLDUsMD4KKyAgMzc5MjQ4NzYzMVUsCS8vIDw3LDQsMSw2PjogQ29zdCA0IHZzbGRvaTggPDUsNiw3LDQ+LCA8MSw2LDEsNz4KKyAgMzM5NDQ1NjIyMFUsCS8vIDw3LDQsMSw3PjogQ29zdCA0IHZtcmdsdyA8Niw0LDcsMT4sIDwzLDYsNCw3PgorICAyNzc5MTcxODM3VSwJLy8gPDcsNCwxLHU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NCwxLHUsMD4KKyAgMzg1MjkxMzY3M1UsCS8vIDw3LDQsMiwwPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDQsMiwwLDM+CisgIDM4NTI5MTM2ODJVLAkvLyA8Nyw0LDIsMT46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw0LDIsMSwzPgorICAyNzE4NzQ2MjE2VSwJLy8gPDcsNCwyLDI+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDwyLDIsMiwyPgorICAyNzE4NzQ2Mjc4VSwJLy8gPDcsNCwyLDM+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDwyLDMsMCwxPgorICAyNzc5MTcxODg1VSwJLy8gPDcsNCwyLDQ+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NCwyLDQsMz4KKyAgMjc3OTE3MTg5M1UsCS8vIDw3LDQsMiw1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDQsMiw1LDI+CisgIDI3MTg3NDY1NTRVLAkvLyA8Nyw0LDIsNj46IENvc3QgMyB2c2xkb2k4IDw1LDYsNyw0PiwgPDIsNiwzLDc+CisgIDM4NDc0NTc4NjRVLAkvLyA8Nyw0LDIsNz46IENvc3QgNCB2c2xkb2kxMiA8Myw2LDQsNz4sIDw0LDIsNywzPgorICAyNzc5MTcxOTIxVSwJLy8gPDcsNCwyLHU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NCwyLHUsMz4KKyAgMjcxODc0Njc3NFUsCS8vIDw3LDQsMywwPjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDQ+LCA8MywwLDEsMj4KKyAgMzg1MjkxMzc2MlUsCS8vIDw3LDQsMywxPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDQsMywxLDI+CisgIDM4NTI5MTM3NzJVLAkvLyA8Nyw0LDMsMj46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw0LDMsMiwzPgorICAyNzE4NzQ3MDM2VSwJLy8gPDcsNCwzLDM+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDwzLDMsMywzPgorICAyNzE4NzQ3MTM4VSwJLy8gPDcsNCwzLDQ+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDwzLDQsNSw2PgorICAyNzc5MTcxOTcyVSwJLy8gPDcsNCwzLDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NCwzLDUsMD4KKyAgMjcwNjgwMzM4MFUsCS8vIDw3LDQsMyw2PjogQ29zdCAzIHZzbGRvaTggPDMsNiw3LDQ+LCA8Myw2LDcsND4KKyAgMzg0NzQ1Nzk0NlUsCS8vIDw3LDQsMyw3PjogQ29zdCA0IHZzbGRvaTEyIDwzLDYsNCw3PiwgPDQsMyw3LDQ+CisgIDI3ODExNjI2NTVVLAkvLyA8Nyw0LDMsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw0LDMsdSwwPgorICAyNzE4NzQ3NTM4VSwJLy8gPDcsNCw0LDA+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDw0LDAsNSwxPgorICAzODUyOTEzODQyVSwJLy8gPDcsNCw0LDE+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NCw0LDEsMT4KKyAgMzg1MjkxMzg1MlUsCS8vIDw3LDQsNCwyPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDQsNCwyLDI+CisgIDIzMTYwOTY2OTZVLAkvLyA8Nyw0LDQsMz46IENvc3QgMyB2bXJnbHcgPDUsNiw3LDQ+LCA8NywyLDQsMz4KKyAgMTcwNTQzMDIyNFUsCS8vIDw3LDQsNCw0PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDQsNCw0LDQ+CisgIDE3MDU0MzAyMzRVLAkvLyA8Nyw0LDQsNT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw0LDQsNSw1PgorICAyNjU4MDU1MDI5VSwJLy8gPDcsNCw0LDY+OiBDb3N0IDMgdnNsZG9pNCA8Niw3LDQsND4sIDw2LDcsNCw0PgorICAyMzE2MDk3MDI0VSwJLy8gPDcsNCw0LDc+OiBDb3N0IDMgdm1yZ2x3IDw1LDYsNyw0PiwgPDcsNiw0LDc+CisgIDE3MDc0MjA5MTdVLAkvLyA8Nyw0LDQsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw0LDQsdSw1PgorICAxNTg0MzE2NTE4VSwJLy8gPDcsNCw1LDA+OiBDb3N0IDIgdnNsZG9pNCA8Niw3LDQsNT4sIExIUworICAyNjU4MDU5MDYwVSwJLy8gPDcsNCw1LDE+OiBDb3N0IDMgdnNsZG9pNCA8Niw3LDQsNT4sIDwxLDEsMSwxPgorICAyNjQwMTQ0MzE0VSwJLy8gPDcsNCw1LDI+OiBDb3N0IDMgdnNsZG9pNCA8Myw3LDQsNT4sIDwyLDYsMyw3PgorICAyNjQwMTQ1MTMxVSwJLy8gPDcsNCw1LDM+OiBDb3N0IDMgdnNsZG9pNCA8Myw3LDQsNT4sIDwzLDcsNCw1PgorICAxNTg0MzE5Nzk4VSwJLy8gPDcsNCw1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8Niw3LDQsNT4sIFJIUworICAyNzc5MTcyMTM0VSwJLy8gPDcsNCw1LDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NCw1LDUsMD4KKyAgNjMxNjg4NTAyVSwJLy8gPDcsNCw1LDY+OiBDb3N0IDEgdnNsZG9pMTIgUkhTLCBSSFMKKyAgMjY1ODA2MzM1NFUsCS8vIDw3LDQsNSw3PjogQ29zdCAzIHZzbGRvaTQgPDYsNyw0LDU+LCA8NywwLDEsMj4KKyAgNjMxNjg4NTIwVSwJLy8gPDcsNCw1LHU+OiBDb3N0IDEgdnNsZG9pMTIgUkhTLCBSSFMKKyAgMzg1MjkxNDAwMVUsCS8vIDw3LDQsNiwwPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDQsNiwwLDc+CisgIDM4NTI5MTQwMTBVLAkvLyA8Nyw0LDYsMT46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw0LDYsMSw3PgorICAyNzE4NzQ5MTc4VSwJLy8gPDcsNCw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDw2LDIsNywzPgorICAyNzIyNzMwNTcyVSwJLy8gPDcsNCw2LDM+OiBDb3N0IDMgdnNsZG9pOCA8NiwzLDcsND4sIDw2LDMsNyw0PgorICAyNzIzMzk0MjA1VSwJLy8gPDcsNCw2LDQ+OiBDb3N0IDMgdnNsZG9pOCA8Niw0LDcsND4sIDw2LDQsNyw0PgorICAyNzc5MTcyMjIxVSwJLy8gPDcsNCw2LDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NCw2LDUsNj4KKyAgMjcxODc0OTQ5NlUsCS8vIDw3LDQsNiw2PjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDQ+LCA8Niw2LDYsNj4KKyAgMjcxODc0OTUxOFUsCS8vIDw3LDQsNiw3PjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDQ+LCA8Niw3LDAsMT4KKyAgMjc3OTE3MjI0OVUsCS8vIDw3LDQsNix1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDQsNix1LDc+CisgIDI3MTg3NDk2OTBVLAkvLyA8Nyw0LDcsMD46IENvc3QgMyB2c2xkb2k4IDw1LDYsNyw0PiwgPDcsMCwxLDI+CisgIDM4NDc0NTgyMTRVLAkvLyA8Nyw0LDcsMT46IENvc3QgNCB2c2xkb2kxMiA8Myw2LDQsNz4sIDw0LDcsMSwyPgorICAyNzE4NzQ5ODgwVSwJLy8gPDcsNCw3LDI+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDw3LDIsNCwzPgorICAzODQ3NDU4MjM2VSwJLy8gPDcsNCw3LDM+OiBDb3N0IDQgdnNsZG9pMTIgPDMsNiw0LDc+LCA8NCw3LDMsNj4KKyAgMjcxODc1MDAwNFUsCS8vIDw3LDQsNyw0PjogQ29zdCAzIHZzbGRvaTggPDUsNiw3LDQ+LCA8Nyw0LDAsMT4KKyAgMTE4Nzg3NjE1MFUsCS8vIDw3LDQsNyw1PjogQ29zdCAyIHZtcmdodyA8Nyw3LDcsNz4sIFJIUworICAyNzE4NzUwMjA4VSwJLy8gPDcsNCw3LDY+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDw3LDYsNCw3PgorICAyNzE4NzUwMjg2VSwJLy8gPDcsNCw3LDc+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDw3LDcsNCw0PgorICAxMTg3ODc2MzkzVSwJLy8gPDcsNCw3LHU+OiBDb3N0IDIgdm1yZ2h3IDw3LDcsNyw3PiwgUkhTCisgIDE1ODQzNDEwOTRVLAkvLyA8Nyw0LHUsMD46IENvc3QgMiB2c2xkb2k0IDw2LDcsNCx1PiwgTEhTCisgIDE2NDUwMDg2ODZVLAkvLyA8Nyw0LHUsMT46IENvc3QgMiB2c2xkb2k4IDw1LDYsNyw0PiwgTEhTCisgIDI2NDAxNjg4OTBVLAkvLyA8Nyw0LHUsMj46IENvc3QgMyB2c2xkb2k0IDwzLDcsNCx1PiwgPDIsNiwzLDc+CisgIDI2NDAxNjk3MTBVLAkvLyA8Nyw0LHUsMz46IENvc3QgMyB2c2xkb2k0IDwzLDcsNCx1PiwgPDMsNyw0LHU+CisgIDE1ODQzNDQzNzRVLAkvLyA8Nyw0LHUsND46IENvc3QgMiB2c2xkb2k0IDw2LDcsNCx1PiwgUkhTCisgIDE3MDU0MzA1NTRVLAkvLyA8Nyw0LHUsNT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw0LHUsNSwxPgorICA2MzE2ODg3NDVVLAkvLyA8Nyw0LHUsNj46IENvc3QgMSB2c2xkb2kxMiBSSFMsIFJIUworICAyNzE4NzUwOTc2VSwJLy8gPDcsNCx1LDc+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LDcsND4sIDx1LDcsMCwxPgorICA2MzE2ODg3NjNVLAkvLyA8Nyw0LHUsdT46IENvc3QgMSB2c2xkb2kxMiBSSFMsIFJIUworICAyNjQ2MTQ3MTc0VSwJLy8gPDcsNSwwLDA+OiBDb3N0IDMgdnNsZG9pNCA8NCw3LDUsMD4sIExIUworICAyNzc5MTcyNDI0VSwJLy8gPDcsNSwwLDE+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSwwLDEsMj4KKyAgMzg1MjkxNDI1OFUsCS8vIDw3LDUsMCwyPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDUsMCwyLDM+CisgIDM4NTI5MTQyNjhVLAkvLyA8Nyw1LDAsMz46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw1LDAsMyw0PgorICAyNzc5MTcyNDUwVSwJLy8gPDcsNSwwLDQ+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSwwLDQsMT4KKyAgMjMxNjA2MTkxNFUsCS8vIDw3LDUsMCw1PjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsMD4sIDw0LDQsNSw1PgorICAyMzE2MDYxMTg2VSwJLy8gPDcsNSwwLDY+OiBDb3N0IDMgdm1yZ2x3IDw1LDYsNywwPiwgPDMsNCw1LDY+CisgIDI2NDYxNTIxODZVLAkvLyA8Nyw1LDAsNz46IENvc3QgMyB2c2xkb2k0IDw0LDcsNSwwPiwgPDcsMCwxLDI+CisgIDI3NzkxNzI0ODZVLAkvLyA8Nyw1LDAsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw1LDAsdSwxPgorICAyNzgxMTYzMTUxVSwJLy8gPDcsNSwxLDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSwxLDAsMT4KKyAgMjMyMTM3ODE5NFUsCS8vIDw3LDUsMSwxPjogQ29zdCAzIHZtcmdsdyA8Niw1LDcsMT4sIDw0LDAsNSwxPgorICAzODUyOTE0MzM5VSwJLy8gPDcsNSwxLDI+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NSwxLDIsMz4KKyAgMzg1MjkxNDM1MFUsCS8vIDw3LDUsMSwzPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDUsMSwzLDU+CisgIDI3ODExNjMxOTFVLAkvLyA8Nyw1LDEsND46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw1LDEsNCw1PgorICAzODUyOTE0MzYzVSwJLy8gPDcsNSwxLDU+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NSwxLDUsMD4KKyAgMzgzNTU4ODI5N1UsCS8vIDw3LDUsMSw2PjogQ29zdCA0IHZzbGRvaTEyIDwxLDYsNSw3PiwgPDUsMSw2LDU+CisgIDM4MzU1ODgzMDZVLAkvLyA8Nyw1LDEsNz46IENvc3QgNCB2c2xkb2kxMiA8MSw2LDUsNz4sIDw1LDEsNyw1PgorICAyNzgxMTYzMjIzVSwJLy8gPDcsNSwxLHU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSwxLHUsMT4KKyAgMzg1MjkxNDQwMFUsCS8vIDw3LDUsMiwwPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDUsMiwwLDE+CisgIDI3ODExNjMyNDNVLAkvLyA8Nyw1LDIsMT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw1LDIsMSwzPgorICAzODUyOTE0NDE5VSwJLy8gPDcsNSwyLDI+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NSwyLDIsMj4KKyAgMjc3OTE3MjYwNlUsCS8vIDw3LDUsMiwzPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDUsMiwzLDQ+CisgIDM3ODA1NTI0OTdVLAkvLyA8Nyw1LDIsND46IENvc3QgNCB2c2xkb2k4IDwzLDYsNyw1PiwgPDIsNCw2LDU+CisgIDI3ODExNjMyNzlVLAkvLyA8Nyw1LDIsNT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw1LDIsNSwzPgorICAyNzc5MTcyNjMyVSwJLy8gPDcsNSwyLDY+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSwyLDYsMz4KKyAgMzgzNTU4ODM4NVUsCS8vIDw3LDUsMiw3PjogQ29zdCA0IHZzbGRvaTEyIDwxLDYsNSw3PiwgPDUsMiw3LDM+CisgIDI3NzkxNzI2NTBVLAkvLyA8Nyw1LDIsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw1LDIsdSwzPgorICAzODUyOTE0NDgxVSwJLy8gPDcsNSwzLDA+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NSwzLDAsMT4KKyAgMjMxOTQwMzkyMlUsCS8vIDw3LDUsMywxPjogQ29zdCAzIHZtcmdsdyA8NiwyLDcsMz4sIDw0LDAsNSwxPgorICAyMzE5NDA0NDA5VSwJLy8gPDcsNSwzLDI+OiBDb3N0IDMgdm1yZ2x3IDw2LDIsNywzPiwgPDQsNiw1LDI+CisgIDM4NTI5MTQ1MTBVLAkvLyA8Nyw1LDMsMz46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw1LDMsMywzPgorICAzNzc5MjI2MTMxVSwJLy8gPDcsNSwzLDQ+OiBDb3N0IDQgdnNsZG9pOCA8Myw0LDcsNT4sIDwzLDQsNyw1PgorICAyMzE5NDA0MjUwVSwJLy8gPDcsNSwzLDU+OiBDb3N0IDMgdm1yZ2x3IDw2LDIsNywzPiwgPDQsNCw1LDU+CisgIDIzMTk0MDM1MjJVLAkvLyA8Nyw1LDMsNj46IENvc3QgMyB2bXJnbHcgPDYsMiw3LDM+LCA8Myw0LDUsNj4KKyAgMzg1MjkxNDU0N1UsCS8vIDw3LDUsMyw3PjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDUsMyw3LDQ+CisgIDIzMTk0MDM1MjRVLAkvLyA8Nyw1LDMsdT46IENvc3QgMyB2bXJnbHcgPDYsMiw3LDM+LCA8Myw0LDUsdT4KKyAgMjY0NjE3OTk0MlUsCS8vIDw3LDUsNCwwPjogQ29zdCAzIHZzbGRvaTQgPDQsNyw1LDQ+LCBMSFMKKyAgMjMxNjA5NDM1NFUsCS8vIDw3LDUsNCwxPjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsND4sIDw0LDAsNSwxPgorICAzODUyOTE0NTgyVSwJLy8gPDcsNSw0LDI+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NSw0LDIsMz4KKyAgMzg1MjkxNDU5MlUsCS8vIDw3LDUsNCwzPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDUsNCwzLDQ+CisgIDI2NDYxODMzNzJVLAkvLyA8Nyw1LDQsND46IENvc3QgMyB2c2xkb2k0IDw0LDcsNSw0PiwgPDQsNyw1LDQ+CisgIDI3NzkxNzI3ODhVLAkvLyA8Nyw1LDQsNT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw1LDQsNSw2PgorICAyMzE2MDkzOTU0VSwJLy8gPDcsNSw0LDY+OiBDb3N0IDMgdm1yZ2x3IDw1LDYsNyw0PiwgPDMsNCw1LDY+CisgIDI2NDYxODUzMThVLAkvLyA8Nyw1LDQsNz46IENvc3QgMyB2c2xkb2k0IDw0LDcsNSw0PiwgPDcsNCw1LDY+CisgIDI3NzkxNzI4MTVVLAkvLyA8Nyw1LDQsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw1LDQsdSw2PgorICAyNzgxMTYzNDc1VSwJLy8gPDcsNSw1LDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSw1LDAsMT4KKyAgMjc4MTE2MzQ4NFUsCS8vIDw3LDUsNSwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDUsNSwxLDE+CisgIDM4NTI5MTQ2NjJVLAkvLyA8Nyw1LDUsMj46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw1LDUsMiwyPgorICAzODUyOTE0NjcyVSwJLy8gPDcsNSw1LDM+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NSw1LDMsMz4KKyAgMjc4MTE2MzUxNVUsCS8vIDw3LDUsNSw0PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDUsNSw0LDU+CisgIDE3MDU0MzEwNDRVLAkvLyA8Nyw1LDUsNT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw1LDUsNSw1PgorICAyNzc5MTcyODc4VSwJLy8gPDcsNSw1LDY+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSw1LDYsNj4KKyAgMzgzNTU4ODYzMlUsCS8vIDw3LDUsNSw3PjogQ29zdCA0IHZzbGRvaTEyIDwxLDYsNSw3PiwgPDUsNSw3LDc+CisgIDE3MDU0MzEwNDRVLAkvLyA8Nyw1LDUsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw1LDUsNSw1PgorICAyNzc5MTcyOTAwVSwJLy8gPDcsNSw2LDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSw2LDAsMT4KKyAgMjc4MTE2MzU3MVUsCS8vIDw3LDUsNiwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDUsNiwxLDc+CisgIDM4NTI5MTQ3NDNVLAkvLyA8Nyw1LDYsMj46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw1LDYsMiwyPgorICAyNzc5MTcyOTMwVSwJLy8gPDcsNSw2LDM+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSw2LDMsND4KKyAgMjc3OTE3Mjk0MFUsCS8vIDw3LDUsNiw0PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDUsNiw0LDU+CisgIDI3ODExNjM2MDdVLAkvLyA8Nyw1LDYsNT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw1LDYsNSw3PgorICAyNzc5MTcyOTYwVSwJLy8gPDcsNSw2LDY+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSw2LDYsNz4KKyAgMTcwNTQzMTEzOFUsCS8vIDw3LDUsNiw3PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDUsNiw3LDA+CisgIDE3MDU1Nzg2MDNVLAkvLyA8Nyw1LDYsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw1LDYsdSwwPgorICAyNjQ2MjA0NTE4VSwJLy8gPDcsNSw3LDA+OiBDb3N0IDMgdnNsZG9pNCA8NCw3LDUsNz4sIExIUworICAyMzIyMDkwODk4VSwJLy8gPDcsNSw3LDE+OiBDb3N0IDMgdm1yZ2x3IDw2LDYsNyw3PiwgPDQsMCw1LDE+CisgIDM3MTk5NDc4ODBVLAkvLyA8Nyw1LDcsMj46IENvc3QgNCB2c2xkb2k0IDw0LDcsNSw3PiwgPDIsMiwyLDI+CisgIDM3MTk5NDg0MzhVLAkvLyA8Nyw1LDcsMz46IENvc3QgNCB2c2xkb2k0IDw0LDcsNSw3PiwgPDMsMCwxLDI+CisgIDI2NDYyMDc5NTFVLAkvLyA8Nyw1LDcsND46IENvc3QgMyB2c2xkb2k0IDw0LDcsNSw3PiwgPDQsNyw1LDc+CisgIDIzMjIwOTEyMjZVLAkvLyA8Nyw1LDcsNT46IENvc3QgMyB2bXJnbHcgPDYsNiw3LDc+LCA8NCw0LDUsNT4KKyAgMjMyMjA5MDQ5OFUsCS8vIDw3LDUsNyw2PjogQ29zdCAzIHZtcmdsdyA8Niw2LDcsNz4sIDwzLDQsNSw2PgorICAyNjQ2MjEwMTU2VSwJLy8gPDcsNSw3LDc+OiBDb3N0IDMgdnNsZG9pNCA8NCw3LDUsNz4sIDw3LDcsNyw3PgorICAyNjQ2MjEwMzUwVSwJLy8gPDcsNSw3LHU+OiBDb3N0IDMgdnNsZG9pNCA8NCw3LDUsNz4sIExIUworICAyNzc5MTczMDYyVSwJLy8gPDcsNSx1LDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSx1LDAsMT4KKyAgMjc3OTE3MzA3MlUsCS8vIDw3LDUsdSwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDUsdSwxLDI+CisgIDIzMTk0MDQ0MDlVLAkvLyA8Nyw1LHUsMj46IENvc3QgMyB2bXJnbHcgPDYsMiw3LDM+LCA8NCw2LDUsMj4KKyAgMjc3OTE3MzA5MlUsCS8vIDw3LDUsdSwzPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDUsdSwzLDQ+CisgIDI3NzkxNzMxMDFVLAkvLyA8Nyw1LHUsND46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw1LHUsNCw0PgorICAxNzA1NDMxMDQ0VSwJLy8gPDcsNSx1LDU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8NSw1LDUsNT4KKyAgMjc3OTE3MzExOFUsCS8vIDw3LDUsdSw2PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDUsdSw2LDM+CisgIDE3MDU1Nzg3NTZVLAkvLyA8Nyw1LHUsNz46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw1LHUsNywwPgorICAxNzA3NDIxOTY1VSwJLy8gPDcsNSx1LHU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8NSx1LHUsMD4KKyAgMzg1MjkxNDk2NlUsCS8vIDw3LDYsMCwwPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDYsMCwwLDA+CisgIDI3NzkxNzMxNTNVLAkvLyA8Nyw2LDAsMT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw2LDAsMSwyPgorICAyMjU2NDkxMDAyVSwJLy8gPDcsNiwwLDI+OiBDb3N0IDMgdm1yZ2h3IDw3LDAsMSwyPiwgPDYsMiw3LDM+CisgIDM4NTI5MTQ5OTRVLAkvLyA8Nyw2LDAsMz46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw2LDAsMywxPgorICAzODUyOTE1MDAzVSwJLy8gPDcsNiwwLDQ+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NiwwLDQsMT4KKyAgMjMxNjA2MjY1MlUsCS8vIDw3LDYsMCw1PjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsMD4sIDw1LDQsNiw1PgorICAyMzE2MDYzNTQ0VSwJLy8gPDcsNiwwLDY+OiBDb3N0IDMgdm1yZ2x3IDw1LDYsNywwPiwgPDYsNiw2LDY+CisgIDEyNDIzMjAxODJVLAkvLyA8Nyw2LDAsNz46IENvc3QgMiB2bXJnbHcgPDUsNiw3LDA+LCBSSFMKKyAgMTI0MjMyMDE4M1UsCS8vIDw3LDYsMCx1PjogQ29zdCAyIHZtcmdsdyA8NSw2LDcsMD4sIFJIUworICAzODUyOTE1MDQ4VSwJLy8gPDcsNiwxLDA+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NiwxLDAsMT4KKyAgMzM3Nzg2NjIxN1UsCS8vIDw3LDYsMSwxPjogQ29zdCA0IHZtcmdsdyA8Myw2LDcsMT4sIDwyLDAsNiwxPgorICAzODUyOTE1MDY4VSwJLy8gPDcsNiwxLDI+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NiwxLDIsMz4KKyAgMzgzMzY3MjA3MlUsCS8vIDw3LDYsMSwzPjogQ29zdCA1IHZzbGRvaTEyIDwxLDMsNiw3PiwgPDYsMSwzLDY+CisgIDM4NTI5MTUwODhVLAkvLyA8Nyw2LDEsND46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw2LDEsNCw1PgorICAzMzk1MTIyMDU2VSwJLy8gPDcsNiwxLDU+OiBDb3N0IDQgdm1yZ2x3IDw2LDUsNywxPiwgPDYsNyw2LDU+CisgIDMzODk4MTM1NjBVLAkvLyA8Nyw2LDEsNj46IENvc3QgNCB2bXJnbHcgPDUsNiw3LDE+LCA8Niw2LDYsNj4KKyAgMjc3OTE3MzI4N1UsCS8vIDw3LDYsMSw3PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDYsMSw3LDE+CisgIDI3NzkzMjA3NTJVLAkvLyA8Nyw2LDEsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw2LDEsdSwxPgorICAyNjU4MTgxMjIyVSwJLy8gPDcsNiwyLDA+OiBDb3N0IDMgdnNsZG9pNCA8Niw3LDYsMj4sIExIUworICAzODUyOTE1MTQwVSwJLy8gPDcsNiwyLDE+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NiwyLDEsMz4KKyAgMjI1Nzk3Mzc1NFUsCS8vIDw3LDYsMiwyPjogQ29zdCAzIHZtcmdodyA8NywyLDMsMz4sIDw2LDIsNywzPgorICAzODQxNDEzNTg5VSwJLy8gPDcsNiwyLDM+OiBDb3N0IDQgdnNsZG9pMTIgPDIsNiwzLDc+LCA8NiwyLDMsMj4KKyAgMjY1ODE4NDUwMlUsCS8vIDw3LDYsMiw0PjogQ29zdCAzIHZzbGRvaTQgPDYsNyw2LDI+LCBSSFMKKyAgMzg1MjkxNTE3NlUsCS8vIDw3LDYsMiw1PjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDYsMiw1LDM+CisgIDI2NTgxODYxMTdVLAkvLyA8Nyw2LDIsNj46IENvc3QgMyB2c2xkb2k0IDw2LDcsNiwyPiwgPDYsNyw2LDI+CisgIDE3MDU0MzE1NDZVLAkvLyA8Nyw2LDIsNz46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw2LDIsNywzPgorICAxNzA1NTc5MDExVSwJLy8gPDcsNiwyLHU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8NiwyLHUsMz4KKyAgMzcxNDAxNTMzNFUsCS8vIDw3LDYsMywwPjogQ29zdCA0IHZzbGRvaTQgPDMsNyw2LDM+LCBMSFMKKyAgMzc3NzI0MzQyNVUsCS8vIDw3LDYsMywxPjogQ29zdCA0IHZzbGRvaTggPDMsMSw3LDY+LCA8MywxLDcsNj4KKyAgMjMxOTQwNTk1N1UsCS8vIDw3LDYsMywyPjogQ29zdCAzIHZtcmdsdyA8NiwyLDcsMz4sIDw2LDcsNiwyPgorICAzMzc1MjI5Mjg2VSwJLy8gPDcsNiwzLDM+OiBDb3N0IDQgdm1yZ2x3IDwzLDIsNywzPiwgPDMsMiw2LDM+CisgIDI3NzkxNzM0MjZVLAkvLyA8Nyw2LDMsND46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw2LDMsNCw1PgorICAzMzc1MjI4NzIxVSwJLy8gPDcsNiwzLDU+OiBDb3N0IDQgdm1yZ2x3IDwzLDIsNywzPiwgPDIsNCw2LDU+CisgIDIzMTk0MDU4ODBVLAkvLyA8Nyw2LDMsNj46IENvc3QgMyB2bXJnbHcgPDYsMiw3LDM+LCA8Niw2LDYsNj4KKyAgMTI0NTY2MjUxOFUsCS8vIDw3LDYsMyw3PjogQ29zdCAyIHZtcmdsdyA8NiwyLDcsMz4sIFJIUworICAxMjQ1NjYyNTE5VSwJLy8gPDcsNiwzLHU+OiBDb3N0IDIgdm1yZ2x3IDw2LDIsNywzPiwgUkhTCisgIDM4NTI5MTUyOTFVLAkvLyA8Nyw2LDQsMD46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw2LDQsMCwxPgorICAzMzg5ODM0NzI5VSwJLy8gPDcsNiw0LDE+OiBDb3N0IDQgdm1yZ2x3IDw1LDYsNyw0PiwgPDIsMCw2LDE+CisgIDIyNTk0NzI4OTBVLAkvLyA8Nyw2LDQsMj46IENvc3QgMyB2bXJnaHcgPDcsNCw1LDY+LCA8NiwyLDcsMz4KKyAgMzg1MjkxNTMyMVUsCS8vIDw3LDYsNCwzPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDYsNCwzLDQ+CisgIDM4NTI5MTUzMzBVLAkvLyA8Nyw2LDQsND46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw2LDQsNCw0PgorICAyNzc5MTczNTE3VSwJLy8gPDcsNiw0LDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Niw0LDUsNj4KKyAgMjMxNjA5NjMxMlUsCS8vIDw3LDYsNCw2PjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsND4sIDw2LDYsNiw2PgorICAxMjQyMzUyOTUwVSwJLy8gPDcsNiw0LDc+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNyw0PiwgUkhTCisgIDEyNDIzNTI5NTFVLAkvLyA8Nyw2LDQsdT46IENvc3QgMiB2bXJnbHcgPDUsNiw3LDQ+LCBSSFMKKyAgMzg1MjkxNTM3MlUsCS8vIDw3LDYsNSwwPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDYsNSwwLDE+CisgIDM4MzUyOTQzOTJVLAkvLyA8Nyw2LDUsMT46IENvc3QgNSB2c2xkb2kxMiA8MSw2LDEsNz4sIDw2LDUsMSw0PgorICAzODUyOTE1Mzk1VSwJLy8gPDcsNiw1LDI+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8Niw1LDIsNj4KKyAgMzg1MjkxNTQwNFUsCS8vIDw3LDYsNSwzPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDYsNSwzLDY+CisgIDM4NTI5MTU0MTJVLAkvLyA8Nyw2LDUsND46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw2LDUsNCw1PgorICAzMzc3ODk5MzEzVSwJLy8gPDcsNiw1LDU+OiBDb3N0IDQgdm1yZ2x3IDwzLDYsNyw1PiwgPDIsNCw2LDU+CisgIDI3MTg3NjUxNjBVLAkvLyA8Nyw2LDUsNj46IENvc3QgMyB2c2xkb2k4IDw1LDYsNyw2PiwgPDUsNiw3LDY+CisgIDI3NzkxNzM2MTFVLAkvLyA8Nyw2LDUsNz46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw2LDUsNywxPgorICAyNzc5MzIxMDc2VSwJLy8gPDcsNiw1LHU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Niw1LHUsMT4KKyAgMjY1ODIxMzk5MFUsCS8vIDw3LDYsNiwwPjogQ29zdCAzIHZzbGRvaTQgPDYsNyw2LDY+LCBMSFMKKyAgMzg1MjkxNTQ2MlUsCS8vIDw3LDYsNiwxPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDYsNiwxLDE+CisgIDI3MTg3NjU1NjJVLAkvLyA8Nyw2LDYsMj46IENvc3QgMyB2c2xkb2k4IDw1LDYsNyw2PiwgPDYsMiw3LDM+CisgIDM3MTQwNDI2MjJVLAkvLyA8Nyw2LDYsMz46IENvc3QgNCB2c2xkb2k0IDwzLDcsNiw2PiwgPDMsNyw2LDY+CisgIDI2NTgyMTcyNzBVLAkvLyA8Nyw2LDYsND46IENvc3QgMyB2c2xkb2k0IDw2LDcsNiw2PiwgUkhTCisgIDI3MjQwNzQyMjRVLAkvLyA8Nyw2LDYsNT46IENvc3QgMyB2c2xkb2k4IDw2LDUsNyw2PiwgPDYsNSw3LDY+CisgIDE3MDU0MzE4NjRVLAkvLyA8Nyw2LDYsNj46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw2LDYsNiw2PgorICAxNzA1NDMxODc0VSwJLy8gPDcsNiw2LDc+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8Niw2LDcsNz4KKyAgMTcwNTU3OTMzOVUsCS8vIDw3LDYsNix1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDYsNix1LDc+CisgIDE3MDU0MzE4ODZVLAkvLyA8Nyw2LDcsMD46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw2LDcsMCwxPgorICAyNzc5MTczNzE5VSwJLy8gPDcsNiw3LDE+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Niw3LDEsMT4KKyAgMjc3OTE3MzcyOVUsCS8vIDw3LDYsNywyPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDYsNywyLDI+CisgIDI3NzkxNzM3MzZVLAkvLyA8Nyw2LDcsMz46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw2LDcsMywwPgorICAxNzA1NDMxOTI2VSwJLy8gPDcsNiw3LDQ+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8Niw3LDQsNT4KKyAgMjc3OTE3Mzc1OVUsCS8vIDw3LDYsNyw1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDYsNyw1LDU+CisgIDI3NzkxNzM3NjVVLAkvLyA8Nyw2LDcsNj46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw2LDcsNiwyPgorICAxMjQ4MzQ5NDk0VSwJLy8gPDcsNiw3LDc+OiBDb3N0IDIgdm1yZ2x3IDw2LDYsNyw3PiwgUkhTCisgIDE3MDU0MzE5NThVLAkvLyA8Nyw2LDcsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw2LDcsdSwxPgorICAxNzA1NTc5NDIzVSwJLy8gPDcsNix1LDA+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8Nix1LDAsMT4KKyAgMjc3OTE3MzgwMVUsCS8vIDw3LDYsdSwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDYsdSwxLDI+CisgIDI3NzkzMjEyNjZVLAkvLyA8Nyw2LHUsMj46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw2LHUsMiwyPgorICAyNzc5MzIxMjczVSwJLy8gPDcsNix1LDM+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Nix1LDMsMD4KKyAgMTcwNTU3OTQ2M1UsCS8vIDw3LDYsdSw0PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDYsdSw0LDU+CisgIDI3NzkxNzM4NDFVLAkvLyA8Nyw2LHUsNT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw2LHUsNSw2PgorICAxNzA1NDMxODY0VSwJLy8gPDcsNix1LDY+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8Niw2LDYsNj4KKyAgMTcwNTQzMjAzMlUsCS8vIDw3LDYsdSw3PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDYsdSw3LDM+CisgIDE3MDU1Nzk0OTVVLAkvLyA8Nyw2LHUsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw2LHUsdSwxPgorICAxMjQyMzIwOTk0VSwJLy8gPDcsNywwLDA+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNywwPiwgPDUsNiw3LDA+CisgIDE3MDU0MzIwNThVLAkvLyA8Nyw3LDAsMT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw3LDAsMSwyPgorICAzODQxNDE0MTQ2VSwJLy8gPDcsNywwLDI+OiBDb3N0IDQgdnNsZG9pMTIgPDIsNiwzLDc+LCA8NywwLDIsMT4KKyAgMjMxNjA2MzIyNlUsCS8vIDw3LDcsMCwzPjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsMD4sIDw2LDIsNywzPgorICAyNzc5MTczOTA4VSwJLy8gPDcsNywwLDQ+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NywwLDQsMT4KKyAgMjY1ODI0MjY1OFUsCS8vIDw3LDcsMCw1PjogQ29zdCAzIHZzbGRvaTQgPDYsNyw3LDA+LCA8NSw2LDcsMD4KKyAgMjY1ODI0MzQ2OFUsCS8vIDw3LDcsMCw2PjogQ29zdCAzIHZzbGRvaTQgPDYsNyw3LDA+LCA8Niw3LDcsMD4KKyAgMjMxNjA2MzU1NFUsCS8vIDw3LDcsMCw3PjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsMD4sIDw2LDYsNyw3PgorICAxNzA1NDMyMTIxVSwJLy8gPDcsNywwLHU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8NywwLHUsMj4KKyAgMzg1MjkxNTc3N1UsCS8vIDw3LDcsMSwwPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDcsMSwwLDE+CisgIDI3NzkxNzM5NjJVLAkvLyA8Nyw3LDEsMT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw3LDEsMSwxPgorICAyNzc5MTczOTczVSwJLy8gPDcsNywxLDI+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NywxLDIsMz4KKyAgMzM4OTgxMzI0MlUsCS8vIDw3LDcsMSwzPjogQ29zdCA0IHZtcmdsdyA8NSw2LDcsMT4sIDw2LDIsNywzPgorICAzODUyOTE1ODEzVSwJLy8gPDcsNywxLDQ+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NywxLDQsMT4KKyAgMzg1MjkxNTgyMVUsCS8vIDw3LDcsMSw1PjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDcsMSw1LDA+CisgIDM4MzUyOTQ4MzlVLAkvLyA8Nyw3LDEsNj46IENvc3QgNCB2c2xkb2kxMiA8MSw2LDEsNz4sIDw3LDEsNiwxPgorICAyMzI5MzQzNTk2VSwJLy8gPDcsNywxLDc+OiBDb3N0IDMgdm1yZ2x3IDw3LHUsNywxPiwgPDcsNyw3LDc+CisgIDI3NzkxNzQwMjdVLAkvLyA8Nyw3LDEsdT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw3LDEsdSwzPgorICAyODAzMDYxOTA4VSwJLy8gPDcsNywyLDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NywyLDAsMz4KKyAgMzg1MjkxNTg2OVUsCS8vIDw3LDcsMiwxPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDcsMiwxLDM+CisgIDI3NzkxNzQwNTNVLAkvLyA8Nyw3LDIsMj46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw3LDIsMiwyPgorICAyNzc5MTc0MDYwVSwJLy8gPDcsNywyLDM+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NywyLDMsMD4KKyAgMjgwMzA2MTk0NFUsCS8vIDw3LDcsMiw0PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDcsMiw0LDM+CisgIDM4NTI5MTU5MDVVLAkvLyA8Nyw3LDIsNT46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw3LDIsNSwzPgorICAyNzY3NjcyNTIyVSwJLy8gPDcsNywyLDY+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNiwzLDc+LCA8NywyLDYsMz4KKyAgMjc5MTg1NTMxNVUsCS8vIDw3LDcsMiw3PjogQ29zdCAzIHZzbGRvaTEyIDw2LDYsNyw3PiwgPDcsMiw3LDM+CisgIDI3Njg5OTk2NDRVLAkvLyA8Nyw3LDIsdT46IENvc3QgMyB2c2xkb2kxMiA8Mix1LDMsNz4sIDw3LDIsdSwzPgorICAyNzc5MTc0MTE1VSwJLy8gPDcsNywzLDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NywzLDAsMT4KKyAgMzg1MjkxNTk0OFUsCS8vIDw3LDcsMywxPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDcsMywxLDE+CisgIDM4NDE0MTQzOTRVLAkvLyA8Nyw3LDMsMj46IENvc3QgNCB2c2xkb2kxMiA8Miw2LDMsNz4sIDw3LDMsMiw2PgorICAxMjQ1NjYzNzM4VSwJLy8gPDcsNywzLDM+OiBDb3N0IDIgdm1yZ2x3IDw2LDIsNywzPiwgPDYsMiw3LDM+CisgIDI3NzkxNzQxNTVVLAkvLyA8Nyw3LDMsND46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw3LDMsNCw1PgorICAzODUyOTE1OTg4VSwJLy8gPDcsNywzLDU+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8NywzLDUsNT4KKyAgMjcwNjgyNzk1OVUsCS8vIDw3LDcsMyw2PjogQ29zdCAzIHZzbGRvaTggPDMsNiw3LDc+LCA8Myw2LDcsNz4KKyAgMjMxOTQwNTg5MFUsCS8vIDw3LDcsMyw3PjogQ29zdCAzIHZtcmdsdyA8NiwyLDcsMz4sIDw2LDYsNyw3PgorICAxMjQ1NjYzNzM4VSwJLy8gPDcsNywzLHU+OiBDb3N0IDIgdm1yZ2x3IDw2LDIsNywzPiwgPDYsMiw3LDM+CisgIDI3NzkxNzQyMDBVLAkvLyA8Nyw3LDQsMD46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDw3LDQsMCw1PgorICAzODUyOTE2MDMwVSwJLy8gPDcsNyw0LDE+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8Nyw0LDEsMj4KKyAgMzcxNDA5OTEzMFUsCS8vIDw3LDcsNCwyPjogQ29zdCA0IHZzbGRvaTQgPDMsNyw3LDQ+LCA8Miw2LDMsNz4KKyAgMjMxNjA5NTk5NFUsCS8vIDw3LDcsNCwzPjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsND4sIDw2LDIsNywzPgorICAxMjQyMzUzNzY2VSwJLy8gPDcsNyw0LDQ+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNyw0PiwgPDUsNiw3LDQ+CisgIDE3MDU0MzI0MjJVLAkvLyA8Nyw3LDQsNT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw3LDQsNSw2PgorICAyNjU4Mjc2MjQwVSwJLy8gPDcsNyw0LDY+OiBDb3N0IDMgdnNsZG9pNCA8Niw3LDcsND4sIDw2LDcsNyw0PgorICAyMzE2MDk2MzIyVSwJLy8gPDcsNyw0LDc+OiBDb3N0IDMgdm1yZ2x3IDw1LDYsNyw0PiwgPDYsNiw3LDc+CisgIDE3MDU0MzI0NDlVLAkvLyA8Nyw3LDQsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw3LDQsdSw2PgorICAzODUyOTE2MTAxVSwJLy8gPDcsNyw1LDA+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8Nyw1LDAsMT4KKyAgMzg1NDkwNjc2NVUsCS8vIDw3LDcsNSwxPjogQ29zdCA0IHZzbGRvaTEyIFJIUywgPDcsNSwxLDA+CisgIDM4NTI5MTYxMjFVLAkvLyA8Nyw3LDUsMj46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw3LDUsMiwzPgorICAzMzg5ODQ2MDEwVSwJLy8gPDcsNyw1LDM+OiBDb3N0IDQgdm1yZ2x3IDw1LDYsNyw1PiwgPDYsMiw3LDM+CisgIDM4NTI5MTYxNDFVLAkvLyA8Nyw3LDUsND46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw3LDUsNCw1PgorICAyNzc5MTc0MzI2VSwJLy8gPDcsNyw1LDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Nyw1LDUsNT4KKyAgMjc3OTE3NDMzN1UsCS8vIDw3LDcsNSw2PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDcsNSw2LDc+CisgIDIzMjkzNzYzNjRVLAkvLyA8Nyw3LDUsNz46IENvc3QgMyB2bXJnbHcgPDcsdSw3LDU+LCA8Nyw3LDcsNz4KKyAgMjc3OTMyMTgxMVUsCS8vIDw3LDcsNSx1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDcsNSx1LDc+CisgIDI2NTgyODc3MThVLAkvLyA8Nyw3LDYsMD46IENvc3QgMyB2c2xkb2k0IDw2LDcsNyw2PiwgTEhTCisgIDM4NTI5MTYxOTdVLAkvLyA8Nyw3LDYsMT46IENvc3QgNCB2c2xkb2kxMiBSSFMsIDw3LDYsMSw3PgorICAyNzc5MTc0MzgyVSwJLy8gPDcsNyw2LDI+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Nyw2LDIsNz4KKyAgMjMxNjExMjM3OFUsCS8vIDw3LDcsNiwzPjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsNj4sIDw2LDIsNywzPgorICAyNjU4MjkwOTk4VSwJLy8gPDcsNyw2LDQ+OiBDb3N0IDMgdnNsZG9pNCA8Niw3LDcsNj4sIFJIUworICAzODUyOTE2MjMzVSwJLy8gPDcsNyw2LDU+OiBDb3N0IDQgdnNsZG9pMTIgUkhTLCA8Nyw2LDUsNz4KKyAgMTY1MTAwNDIyNlUsCS8vIDw3LDcsNiw2PjogQ29zdCAyIHZzbGRvaTggPDYsNiw3LDc+LCA8Niw2LDcsNz4KKyAgMjc3OTE3NDQyMFUsCS8vIDw3LDcsNiw3PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDcsNiw3LDA+CisgIDE2NTIzMzE0OTJVLAkvLyA8Nyw3LDYsdT46IENvc3QgMiB2c2xkb2k4IDw2LHUsNyw3PiwgPDYsdSw3LDc+CisgIDE1OTA1MjYwNTRVLAkvLyA8Nyw3LDcsMD46IENvc3QgMiB2c2xkb2k0IDw3LDcsNyw3PiwgTEhTCisgIDIzMjg3Mjg2MjNVLAkvLyA8Nyw3LDcsMT46IENvc3QgMyB2bXJnbHcgPDcsNyw3LDc+LCA8NywwLDcsMT4KKyAgMjcyNDc0NjQ1MVUsCS8vIDw3LDcsNywyPjogQ29zdCAzIHZzbGRvaTggPDYsNiw3LDc+LCA8NywyLDcsMz4KKyAgMjMyMjA5MjUzOFUsCS8vIDw3LDcsNywzPjogQ29zdCAzIHZtcmdsdyA8Niw2LDcsNz4sIDw2LDIsNywzPgorICAxNTkwNTI5MzM0VSwJLy8gPDcsNyw3LDQ+OiBDb3N0IDIgdnNsZG9pNCA8Nyw3LDcsNz4sIFJIUworICAyMzI4NzI4OTUxVSwJLy8gPDcsNyw3LDU+OiBDb3N0IDMgdm1yZ2x3IDw3LDcsNyw3PiwgPDcsNCw3LDU+CisgIDI3MjQ3NDY3NzBVLAkvLyA8Nyw3LDcsNj46IENvc3QgMyB2c2xkb2k4IDw2LDYsNyw3PiwgPDcsNiw2LDc+CisgIDQzMDM2MTkxMFUsCS8vIDw3LDcsNyw3PjogQ29zdCAxIHZzcGx0aXN3MyBSSFMKKyAgNDMwMzYxOTEwVSwJLy8gPDcsNyw3LHU+OiBDb3N0IDEgdnNwbHRpc3czIFJIUworICAxMjQyMzIwOTk0VSwJLy8gPDcsNyx1LDA+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNywwPiwgPDUsNiw3LDA+CisgIDE3MDU1ODAxNjJVLAkvLyA8Nyw3LHUsMT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw3LHUsMSwyPgorICAyNzc5MzIxOTk2VSwJLy8gPDcsNyx1LDI+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Nyx1LDIsMz4KKyAgMTI0NTY2MzczOFUsCS8vIDw3LDcsdSwzPjogQ29zdCAyIHZtcmdsdyA8NiwyLDcsMz4sIDw2LDIsNywzPgorICAxMjQyMzUzNzY2VSwJLy8gPDcsNyx1LDQ+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNyw0PiwgPDUsNiw3LDQ+CisgIDE3MDU1ODAyMDJVLAkvLyA8Nyw3LHUsNT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw3LHUsNSw2PgorICAxNjYyOTQ5NjIwVSwJLy8gPDcsNyx1LDY+OiBDb3N0IDIgdnNsZG9pOCA8dSw2LDcsNz4sIDx1LDYsNyw3PgorICA0MzAzNjE5MTBVLAkvLyA8Nyw3LHUsNz46IENvc3QgMSB2c3BsdGlzdzMgUkhTCisgIDQzMDM2MTkxMFUsCS8vIDw3LDcsdSx1PjogQ29zdCAxIHZzcGx0aXN3MyBSSFMKKyAgMTcwNTQyNjk0NFUsCS8vIDw3LHUsMCwwPjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDAsMCwwLDA+CisgIDE3MDU0MzI3ODdVLAkvLyA8Nyx1LDAsMT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDx1LDAsMSwyPgorICAyMzE2MDYwODg1VSwJLy8gPDcsdSwwLDI+OiBDb3N0IDMgdm1yZ2x3IDw1LDYsNywwPiwgPDMsMCx1LDI+CisgIDEyNDIzMTY5NTZVLAkvLyA8Nyx1LDAsMz46IENvc3QgMiB2bXJnbHcgPDUsNiw3LDA+LCBMSFMKKyAgMjc3OTE3NDYzN1UsCS8vIDw3LHUsMCw0PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPHUsMCw0LDE+CisgIDExODI3NTA4NzRVLAkvLyA8Nyx1LDAsNT46IENvc3QgMiB2bXJnaHcgPDcsMCwxLDI+LCBSSFMKKyAgMjMxNjA2MTIxM1UsCS8vIDw3LHUsMCw2PjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsMD4sIDwzLDQsdSw2PgorICAxMjQyMzIwMjAwVSwJLy8gPDcsdSwwLDc+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNywwPiwgUkhTCisgIDE3MDU0MzI4NTBVLAkvLyA8Nyx1LDAsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDx1LDAsdSwyPgorICAxNTg0NTc4NjYyVSwJLy8gPDcsdSwxLDA+OiBDb3N0IDIgdnNsZG9pNCA8Niw3LHUsMT4sIExIUworICAxNzA1NDI3NzY0VSwJLy8gPDcsdSwxLDE+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8MSwxLDEsMT4KKyAgNjMxNjkxMDU0VSwJLy8gPDcsdSwxLDI+OiBDb3N0IDEgdnNsZG9pMTIgUkhTLCBMSFMKKyAgMjY0MDQwNzMwN1UsCS8vIDw3LHUsMSwzPjogQ29zdCAzIHZzbGRvaTQgPDMsNyx1LDE+LCA8Myw3LHUsMT4KKyAgMTU4NDU4MTk0MlUsCS8vIDw3LHUsMSw0PjogQ29zdCAyIHZzbGRvaTQgPDYsNyx1LDE+LCBSSFMKKyAgMjc3OTE3NDcyNlUsCS8vIDw3LHUsMSw1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPHUsMSw1LDA+CisgIDE1ODQ1ODM1NzRVLAkvLyA8Nyx1LDEsNj46IENvc3QgMiB2c2xkb2k0IDw2LDcsdSwxPiwgPDYsNyx1LDE+CisgIDI3NzkzMjIyMDFVLAkvLyA8Nyx1LDEsNz46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDx1LDEsNywxPgorICA2MzE2OTExMDhVLAkvLyA8Nyx1LDEsdT46IENvc3QgMSB2c2xkb2kxMiBSSFMsIExIUworICAyNzc5MTc0NzYzVSwJLy8gPDcsdSwyLDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8dSwyLDAsMT4KKyAgMjc3OTE3NDc3NFUsCS8vIDw3LHUsMiwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPHUsMiwxLDM+CisgIDE3MDU0Mjg1ODRVLAkvLyA8Nyx1LDIsMj46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDwyLDIsMiwyPgorICAxNzA1NDMyOTY1VSwJLy8gPDcsdSwyLDM+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8dSwyLDMsMD4KKyAgMjc3OTE3NDgwMVUsCS8vIDw3LHUsMiw0PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPHUsMiw0LDM+CisgIDI3NzkxNzQ4MTBVLAkvLyA8Nyx1LDIsNT46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDx1LDIsNSwzPgorICAyNzY3NjczMjUxVSwJLy8gPDcsdSwyLDY+OiBDb3N0IDMgdnNsZG9pMTIgPDIsNiwzLDc+LCA8dSwyLDYsMz4KKyAgMTcwNTU4MDQ2MFUsCS8vIDw3LHUsMiw3PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPHUsMiw3LDM+CisgIDE3MDU0MzMwMTBVLAkvLyA8Nyx1LDIsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDx1LDIsdSwwPgorICAxNzA1NDMzMDIwVSwJLy8gPDcsdSwzLDA+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8dSwzLDAsMT4KKyAgMjc3OTE3NDg1M1UsCS8vIDw3LHUsMywxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPHUsMywxLDE+CisgIDI3Njc2NzMyOTlVLAkvLyA8Nyx1LDMsMj46IENvc3QgMyB2c2xkb2kxMiA8Miw2LDMsNz4sIDx1LDMsMiw2PgorICAxMjQ1NjU5MjkyVSwJLy8gPDcsdSwzLDM+OiBDb3N0IDIgdm1yZ2x3IDw2LDIsNywzPiwgTEhTCisgIDE3MDU0MzMwNjBVLAkvLyA8Nyx1LDMsND46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDx1LDMsNCw1PgorICAyNzc5MTc0ODkzVSwJLy8gPDcsdSwzLDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8dSwzLDUsNT4KKyAgMjcwNjgzNjE1MlUsCS8vIDw3LHUsMyw2PjogQ29zdCAzIHZzbGRvaTggPDMsNiw3LHU+LCA8Myw2LDcsdT4KKyAgMTI0NTY2MjUzNlUsCS8vIDw3LHUsMyw3PjogQ29zdCAyIHZtcmdsdyA8NiwyLDcsMz4sIFJIUworICAxNzA1NDMzMDkyVSwJLy8gPDcsdSwzLHU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8dSwzLHUsMT4KKyAgMjc3OTE3NDkyNVUsCS8vIDw3LHUsNCwwPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPHUsNCwwLDE+CisgIDExODU3MzIzOThVLAkvLyA8Nyx1LDQsMT46IENvc3QgMiB2bXJnaHcgPDcsNCw1LDY+LCBMSFMKKyAgMjMxNjA5MzY1M1UsCS8vIDw3LHUsNCwyPjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsND4sIDwzLDAsdSwyPgorICAxMjQyMzQ5NzI0VSwJLy8gPDcsdSw0LDM+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNyw0PiwgTEhTCisgIDE3MDU0MzAyMjRVLAkvLyA8Nyx1LDQsND46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDw0LDQsNCw0PgorICAxNzA1NDMzMTUxVSwJLy8gPDcsdSw0LDU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8dSw0LDUsNj4KKyAgMjMxNjA5Mzk4MVUsCS8vIDw3LHUsNCw2PjogQ29zdCAzIHZtcmdsdyA8NSw2LDcsND4sIDwzLDQsdSw2PgorICAxMjQyMzUyOTY4VSwJLy8gPDcsdSw0LDc+OiBDb3N0IDIgdm1yZ2x3IDw1LDYsNyw0PiwgUkhTCisgIDE3MDU0MzMxNzhVLAkvLyA8Nyx1LDQsdT46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDx1LDQsdSw2PgorICAxNTg0NjExNDMwVSwJLy8gPDcsdSw1LDA+OiBDb3N0IDIgdnNsZG9pNCA8Niw3LHUsNT4sIExIUworICAyNzgxMTY1NjcwVSwJLy8gPDcsdSw1LDE+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8dSw1LDEsMD4KKyAgMjY0MDQzOTIyNlUsCS8vIDw3LHUsNSwyPjogQ29zdCAzIHZzbGRvaTQgPDMsNyx1LDU+LCA8Miw2LDMsNz4KKyAgMjY0MDQ0MDA3OVUsCS8vIDw3LHUsNSwzPjogQ29zdCAzIHZzbGRvaTQgPDMsNyx1LDU+LCA8Myw3LHUsNT4KKyAgMTU4NDYxNDcxMFUsCS8vIDw3LHUsNSw0PjogQ29zdCAyIHZzbGRvaTQgPDYsNyx1LDU+LCBSSFMKKyAgMTcwNTQzMTA0NFUsCS8vIDw3LHUsNSw1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPDUsNSw1LDU+CisgIDYzMTY5MTQxOFUsCS8vIDw3LHUsNSw2PjogQ29zdCAxIHZzbGRvaTEyIFJIUywgUkhTCisgIDI3NzkzMjI1MjVVLAkvLyA8Nyx1LDUsNz46IENvc3QgMyB2c2xkb2kxMiBSSFMsIDx1LDUsNywxPgorICA2MzE2OTE0MzZVLAkvLyA8Nyx1LDUsdT46IENvc3QgMSB2c2xkb2kxMiBSSFMsIFJIUworICAyNzc5MTc1MDg3VSwJLy8gPDcsdSw2LDA+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8dSw2LDAsMT4KKyAgMjc3OTE3NTEwMlUsCS8vIDw3LHUsNiwxPjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPHUsNiwxLDc+CisgIDE2NDgzNTc4ODdVLAkvLyA8Nyx1LDYsMj46IENvc3QgMiB2c2xkb2k4IDw2LDIsNyx1PiwgPDYsMiw3LHU+CisgIDE3MDU0MzMyOTZVLAkvLyA8Nyx1LDYsMz46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDx1LDYsMyw3PgorICAyNzc5MTc1MTI3VSwJLy8gPDcsdSw2LDQ+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8dSw2LDQsNT4KKyAgMjc3OTE3NTEzOFUsCS8vIDw3LHUsNiw1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPHUsNiw1LDc+CisgIDE2NTEwMTI0MTlVLAkvLyA8Nyx1LDYsNj46IENvc3QgMiB2c2xkb2k4IDw2LDYsNyx1PiwgPDYsNiw3LHU+CisgIDE3MDU1ODA3ODhVLAkvLyA8Nyx1LDYsNz46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDx1LDYsNyw3PgorICAxNzA1NDMzMzQxVSwJLy8gPDcsdSw2LHU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8dSw2LHUsNz4KKyAgMTcwNTU4MDgwMFUsCS8vIDw3LHUsNywwPjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPHUsNywwLDE+CisgIDExODc4Nzg3MDJVLAkvLyA8Nyx1LDcsMT46IENvc3QgMiB2bXJnaHcgPDcsNyw3LDc+LCBMSFMKKyAgMjc2ODA0MjI2M1UsCS8vIDw3LHUsNywyPjogQ29zdCAzIHZzbGRvaTEyIDwyLDYsdSw3PiwgPHUsNywyLDY+CisgIDEyNDgzNDYyNjhVLAkvLyA8Nyx1LDcsMz46IENvc3QgMiB2bXJnbHcgPDYsNiw3LDc+LCBMSFMKKyAgMTcwNTU4MDg0MFUsCS8vIDw3LHUsNyw0PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPHUsNyw0LDU+CisgIDExODc4NzkwNjZVLAkvLyA8Nyx1LDcsNT46IENvc3QgMiB2bXJnaHcgPDcsNyw3LDc+LCBSSFMKKyAgMjc3OTMyMjY3OVUsCS8vIDw3LHUsNyw2PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPHUsNyw2LDI+CisgIDQzMDM2MTkxMFUsCS8vIDw3LHUsNyw3PjogQ29zdCAxIHZzcGx0aXN3MyBSSFMKKyAgNDMwMzYxOTEwVSwJLy8gPDcsdSw3LHU+OiBDb3N0IDEgdnNwbHRpc3czIFJIUworICAxNzA1NDMzNDI1VSwJLy8gPDcsdSx1LDA+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8dSx1LDAsMT4KKyAgMTcwNTQzMzQzNVUsCS8vIDw3LHUsdSwxPjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPHUsdSwxLDI+CisgIDYzMTY5MTYyMVUsCS8vIDw3LHUsdSwyPjogQ29zdCAxIHZzbGRvaTEyIFJIUywgTEhTCisgIDE3MDU0MzM0NTFVLAkvLyA8Nyx1LHUsMz46IENvc3QgMiB2c2xkb2kxMiBSSFMsIDx1LHUsMywwPgorICAxNzA1NDMzNDY1VSwJLy8gPDcsdSx1LDQ+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8dSx1LDQsNT4KKyAgMTcwNTQzMzQ3NVUsCS8vIDw3LHUsdSw1PjogQ29zdCAyIHZzbGRvaTEyIFJIUywgPHUsdSw1LDY+CisgIDYzMTY5MTY2MVUsCS8vIDw3LHUsdSw2PjogQ29zdCAxIHZzbGRvaTEyIFJIUywgUkhTCisgIDQzMDM2MTkxMFUsCS8vIDw3LHUsdSw3PjogQ29zdCAxIHZzcGx0aXN3MyBSSFMKKyAgNjMxNjkxNjc1VSwJLy8gPDcsdSx1LHU+OiBDb3N0IDEgdnNsZG9pMTIgUkhTLCBMSFMKKyAgMjAyMTYyMjc4VSwJLy8gPHUsMCwwLDA+OiBDb3N0IDEgdnNwbHRpc3cwIExIUworICAxNjc4NTk4MTU0VSwJLy8gPHUsMCwwLDE+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8MCwwLDEsMT4KKyAgMjYzNDUwMDE1NFUsCS8vIDx1LDAsMCwyPjogQ29zdCAzIHZzbGRvaTQgPDIsdSwwLDA+LCA8Mix1LDAsMD4KKyAgMjI4OTU5NjI2OVUsCS8vIDx1LDAsMCwzPjogQ29zdCAzIHZtcmdsdyA8MSwyLHUsMD4sIDx1LDIsMCwzPgorICAxNTQ4ODE1NjcwVSwJLy8gPHUsMCwwLDQ+OiBDb3N0IDIgdnNsZG9pNCA8MCx1LDAsMD4sIFJIUworICAyNjYzNjk4NTMwVSwJLy8gPHUsMCwwLDU+OiBDb3N0IDMgdnNsZG9pNCA8Nyw3LDAsMD4sIDw1LDYsNywwPgorICAyNjU4MzkwOTQyVSwJLy8gPHUsMCwwLDY+OiBDb3N0IDMgdnNsZG9pNCA8Nix1LDAsMD4sIDw2LHUsMCwwPgorICAyMjg5NTk2NTk3VSwJLy8gPHUsMCwwLDc+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsdSwwPiwgPHUsNiwwLDc+CisgIDIwMjE2MjI3OFUsCS8vIDx1LDAsMCx1PjogQ29zdCAxIHZzcGx0aXN3MCBMSFMKKyAgMTU2MDc2NDUxOFUsCS8vIDx1LDAsMSwwPjogQ29zdCAyIHZzbGRvaTQgPDIsdSwwLDE+LCBMSFMKKyAgMTE1NzIwMjk0VSwJLy8gPHUsMCwxLDE+OiBDb3N0IDEgdm1yZ2h3IExIUywgTEhTCisgIDYwNDg1NjQyN1UsCS8vIDx1LDAsMSwyPjogQ29zdCAxIHZzbGRvaTEyIExIUywgTEhTCisgIDI2MzQ1MDg0MzhVLAkvLyA8dSwwLDEsMz46IENvc3QgMyB2c2xkb2k0IDwyLHUsMCwxPiwgPDMsMCwxLDI+CisgIDE1NjA3Njc3OThVLAkvLyA8dSwwLDEsND46IENvc3QgMiB2c2xkb2k0IDwyLHUsMCwxPiwgUkhTCisgIDI2NTI0MjY0MzhVLAkvLyA8dSwwLDEsNT46IENvc3QgMyB2c2xkb2k0IDw1LHUsMCwxPiwgPDUsdSwwLDE+CisgIDE1ODQ2NTczMTFVLAkvLyA8dSwwLDEsNj46IENvc3QgMiB2c2xkb2k0IDw2LHUsMCwxPiwgPDYsdSwwLDE+CisgIDI2NTgzOTkyMjZVLAkvLyA8dSwwLDEsNz46IENvc3QgMyB2c2xkb2k0IDw2LHUsMCwxPiwgPDcsMCwxLDI+CisgIDYwNDg1NjQ3NlUsCS8vIDx1LDAsMSx1PjogQ29zdCAxIHZzbGRvaTEyIExIUywgTEhTCisgIDI2OTY4ODk4NTBVLAkvLyA8dSwwLDIsMD46IENvc3QgMyB2c2xkb2k4IDwyLDAsdSwwPiwgPDIsMCx1LDA+CisgIDExOTAxNzQ4MjJVLAkvLyA8dSwwLDIsMT46IENvc3QgMiB2bXJnaHcgPHUsMiwzLDA+LCBMSFMKKyAgMjY5MjI0NTA5NlUsCS8vIDx1LDAsMiwyPjogQ29zdCAzIHZzbGRvaTggPDEsMix1LDA+LCA8MiwyLDIsMj4KKyAgMjY5MjI0NTE1OFUsCS8vIDx1LDAsMiwzPjogQ29zdCAzIHZzbGRvaTggPDEsMix1LDA+LCA8MiwzLDAsMT4KKyAgMjI2MzkxNjg4MlUsCS8vIDx1LDAsMiw0PjogQ29zdCAzIHZtcmdodyA8dSwyLDMsMD4sIDwwLDQsMSw1PgorICAyMjk5NzA5OTA4VSwJLy8gPHUsMCwyLDU+OiBDb3N0IDMgdm1yZ2x3IDwzLDAsMSwyPiwgPDMsNCwwLDU+CisgIDI2OTIyNDU0MzRVLAkvLyA8dSwwLDIsNj46IENvc3QgMyB2c2xkb2k4IDwxLDIsdSwwPiwgPDIsNiwzLDc+CisgIDI3MDE1MzUyODFVLAkvLyA8dSwwLDIsNz46IENvc3QgMyB2c2xkb2k4IDwyLDcsdSwwPiwgPDIsNyx1LDA+CisgIDExOTAxNzUzODlVLAkvLyA8dSwwLDIsdT46IENvc3QgMiB2bXJnaHcgPHUsMiwzLDA+LCBMSFMKKyAgMTIwOTIzNzUwNFUsCS8vIDx1LDAsMywwPjogQ29zdCAyIHZtcmdsdyBMSFMsIDwwLDAsMCwwPgorICAxMjA5MjM5MjA2VSwJLy8gPHUsMCwzLDE+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDIsMywwLDE+CisgIDI3MDQxODk4MTNVLAkvLyA8dSwwLDMsMj46IENvc3QgMyB2c2xkb2k4IDwzLDIsdSwwPiwgPDMsMix1LDA+CisgIDI2OTIyNDU5MTZVLAkvLyA8dSwwLDMsMz46IENvc3QgMyB2c2xkb2k4IDwxLDIsdSwwPiwgPDMsMywzLDM+CisgIDIyODI5ODEwMzNVLAkvLyA8dSwwLDMsND46IENvc3QgMyB2bXJnbHcgTEhTLCA8MiwzLDAsND4KKyAgMjY2NDM4NjY1OFUsCS8vIDx1LDAsMyw1PjogQ29zdCAzIHZzbGRvaTQgPDcsdSwwLDM+LCA8NSw2LDcsMD4KKyAgMjY5MTg3NzQ5NlUsCS8vIDx1LDAsMyw2PjogQ29zdCAzIHZzbGRvaTggPDEsMiwzLDA+LCA8Myw2LDAsNz4KKyAgMjY2NDM4ODIxOFUsCS8vIDx1LDAsMyw3PjogQ29zdCAzIHZzbGRvaTQgPDcsdSwwLDM+LCA8Nyx1LDAsMz4KKyAgMTIwOTIzOTIxM1UsCS8vIDx1LDAsMyx1PjogQ29zdCAyIHZtcmdsdyBMSFMsIDwyLDMsMCx1PgorICAyMjg5NjIzMDQwVSwJLy8gPHUsMCw0LDA+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsdSw0PiwgPDAsMCwwLDA+CisgIDE2Nzg1OTg0ODJVLAkvLyA8dSwwLDQsMT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwwLDQsMSw1PgorICAyNjM0NTMyOTI2VSwJLy8gPHUsMCw0LDI+OiBDb3N0IDMgdnNsZG9pNCA8Mix1LDAsND4sIDwyLHUsMCw0PgorICAyMjM1NTgwNjcyVSwJLy8gPHUsMCw0LDM+OiBDb3N0IDMgdm1yZ2h3IDwzLDQsNSw2PiwgPDAsMywxLDQ+CisgIDExNDM2MTk5MjJVLAkvLyA8dSwwLDQsND46IENvc3QgMiB2bXJnaHcgPDAsNCwxLDU+LCA8MCw0LDEsNT4KKyAgMTYxODUwNTAxNFUsCS8vIDx1LDAsNCw1PjogQ29zdCAyIHZzbGRvaTggPDEsMix1LDA+LCBSSFMKKyAgMjY1ODQyMzcxNFUsCS8vIDx1LDAsNCw2PjogQ29zdCAzIHZzbGRvaTQgPDYsdSwwLDQ+LCA8Nix1LDAsND4KKyAgMjcxMzI1OTQ2NFUsCS8vIDx1LDAsNCw3PjogQ29zdCAzIHZzbGRvaTggPDQsNyw1LDA+LCA8NCw3LDUsMD4KKyAgMTY4MzI0MzQwOVUsCS8vIDx1LDAsNCx1PjogQ29zdCAyIHZzbGRvaTEyIExIUywgPDAsNCx1LDU+CisgIDExOTI0NDM5MDRVLAkvLyA8dSwwLDUsMD46IENvc3QgMiB2bXJnaHcgUkhTLCA8MCwwLDAsMD4KKyAgMTE4NzAyMTgyVSwJLy8gPHUsMCw1LDE+OiBDb3N0IDEgdm1yZ2h3IFJIUywgTEhTCisgIDIyNjYxODU5MDFVLAkvLyA8dSwwLDUsMj46IENvc3QgMyB2bXJnaHcgUkhTLCA8MCwyLDEsMj4KKyAgMjY0MDUxMzgxNlUsCS8vIDx1LDAsNSwzPjogQ29zdCAzIHZzbGRvaTQgPDMsdSwwLDU+LCA8Myx1LDAsNT4KKyAgMTE5MjQ0NDI0MlUsCS8vIDx1LDAsNSw0PjogQ29zdCAyIHZtcmdodyBSSFMsIDwwLDQsMSw1PgorICAyNzE4Nzg5NjM2VSwJLy8gPHUsMCw1LDU+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LHUsMD4sIDw1LDUsNSw1PgorICAxNjQ1MDQ3OTE1VSwJLy8gPHUsMCw1LDY+OiBDb3N0IDIgdnNsZG9pOCA8NSw2LHUsMD4sIDw1LDYsdSwwPgorICAyNjY0NDA0NjA0VSwJLy8gPHUsMCw1LDc+OiBDb3N0IDMgdnNsZG9pNCA8Nyx1LDAsNT4sIDw3LHUsMCw1PgorICAxMTg3MDI3NDlVLAkvLyA8dSwwLDUsdT46IENvc3QgMSB2bXJnaHcgUkhTLCBMSFMKKyAgMjMwMjkxMDQ2NFUsCS8vIDx1LDAsNiwwPjogQ29zdCAzIHZtcmdsdyA8Myw0LHUsNj4sIDwwLDAsMCwwPgorICAxMTkyODg2Mzc0VSwJLy8gPHUsMCw2LDE+OiBDb3N0IDIgdm1yZ2h3IDx1LDYsMyw3PiwgTEhTCisgIDI3MTg3OTAxMzhVLAkvLyA8dSwwLDYsMj46IENvc3QgMyB2c2xkb2k4IDw1LDYsdSwwPiwgPDYsMiw3LDM+CisgIDI3MjI3NzE1MzdVLAkvLyA8dSwwLDYsMz46IENvc3QgMyB2c2xkb2k4IDw2LDMsdSwwPiwgPDYsMyx1LDA+CisgIDIyNjY2Mjg0MzRVLAkvLyA8dSwwLDYsND46IENvc3QgMyB2bXJnaHcgPHUsNiwzLDc+LCA8MCw0LDEsNT4KKyAgMjI0ODk1MDE4MFUsCS8vIDx1LDAsNiw1PjogQ29zdCAzIHZtcmdodyA8NSw2LDcsMD4sIDwwLDUsMSw2PgorICAyNzE4NzkwNDU2VSwJLy8gPHUsMCw2LDY+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LHUsMD4sIDw2LDYsNiw2PgorICAyNzE4NzkwNDc4VSwJLy8gPHUsMCw2LDc+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LHUsMD4sIDw2LDcsMCwxPgorICAxMTkyODg2OTQxVSwJLy8gPHUsMCw2LHU+OiBDb3N0IDIgdm1yZ2h3IDx1LDYsMyw3PiwgTEhTCisgIDEyMzU4MTIzNTJVLAkvLyA8dSwwLDcsMD46IENvc3QgMiB2bXJnbHcgUkhTLCA8MCwwLDAsMD4KKyAgMTIzNTgxNDA1NFUsCS8vIDx1LDAsNywxPjogQ29zdCAyIHZtcmdsdyBSSFMsIDwyLDMsMCwxPgorICAyNzI4MDgwNjAxVSwJLy8gPHUsMCw3LDI+OiBDb3N0IDMgdnNsZG9pOCA8NywyLHUsMD4sIDw3LDIsdSwwPgorICAyNjQwNTMwMjAyVSwJLy8gPHUsMCw3LDM+OiBDb3N0IDMgdnNsZG9pNCA8Myx1LDAsNz4sIDwzLHUsMCw3PgorICAyNjQwNTMwNzQyVSwJLy8gPHUsMCw3LDQ+OiBDb3N0IDMgdnNsZG9pNCA8Myx1LDAsNz4sIFJIUworICAyMzA5NTU2NjkyVSwJLy8gPHUsMCw3LDU+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDMsNCwwLDU+CisgIDI3MzA3MzUxMzNVLAkvLyA8dSwwLDcsNj46IENvc3QgMyB2c2xkb2k4IDw3LDYsdSwwPiwgPDcsNix1LDA+CisgIDIzMDk1NTY4NTZVLAkvLyA8dSwwLDcsNz46IENvc3QgMyB2bXJnbHcgUkhTLCA8Myw2LDAsNz4KKyAgMTIzNTgxNDA2MVUsCS8vIDx1LDAsNyx1PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwyLDMsMCx1PgorICAyMDIxNjIyNzhVLAkvLyA8dSwwLHUsMD46IENvc3QgMSB2c3BsdGlzdzAgTEhTCisgIDEyMDM2NTE1OFUsCS8vIDx1LDAsdSwxPjogQ29zdCAxIHZtcmdodyBMSFMsIExIUworICA2MDQ4NTY5ODlVLAkvLyA8dSwwLHUsMj46IENvc3QgMSB2c2xkb2kxMiBMSFMsIExIUworICAyNjkyMjQ5NTMyVSwJLy8gPHUsMCx1LDM+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLHUsMD4sIDx1LDMsMCwxPgorICAxNTYwODI1MTQyVSwJLy8gPHUsMCx1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8Mix1LDAsdT4sIFJIUworICAxNjE4NTA3OTMwVSwJLy8gPHUsMCx1LDU+OiBDb3N0IDIgdnNsZG9pOCA8MSwyLHUsMD4sIFJIUworICAxNTg0NzE0NjYyVSwJLy8gPHUsMCx1LDY+OiBDb3N0IDIgdnNsZG9pNCA8Nix1LDAsdT4sIDw2LHUsMCx1PgorICAyMzA5NTY1MDQ4VSwJLy8gPHUsMCx1LDc+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDMsNiwwLDc+CisgIDYwNDg1NzA0M1UsCS8vIDx1LDAsdSx1PjogQ29zdCAxIHZzbGRvaTEyIExIUywgTEhTCisgIDE2MTEyMTA4MjVVLAkvLyA8dSwxLDAsMD46IENvc3QgMiB2c2xkb2k4IDwwLDAsdSwxPiwgPDAsMCx1LDE+CisgIDE2MTY1MTkyNzBVLAkvLyA8dSwxLDAsMT46IENvc3QgMiB2c2xkb2k4IDwwLHUsdSwxPiwgTEhTCisgIDIyODc2MDU0NTlVLAkvLyA8dSwxLDAsMj46IENvc3QgMyB2bXJnbHcgPDAsdSx1LDA+LCA8dSwwLDEsMj4KKyAgMjY0MDU0NjU4OFUsCS8vIDx1LDEsMCwzPjogQ29zdCAzIHZzbGRvaTQgPDMsdSwxLDA+LCA8Myx1LDEsMD4KKyAgMjYyMjYzMTIyMlUsCS8vIDx1LDEsMCw0PjogQ29zdCAzIHZzbGRvaTQgPDAsdSwxLDA+LCBSSFMKKyAgMjI4OTU5MDYxMFUsCS8vIDx1LDEsMCw1PjogQ29zdCAzIHZtcmdsdyA8MSwyLHUsMD4sIDwwLDQsMSw1PgorICAyNjY0NDM2NjMwVSwJLy8gPHUsMSwwLDY+OiBDb3N0IDMgdnNsZG9pNCA8Nyx1LDEsMD4sIDw2LDcsdSwxPgorICAyNjY0NDM3Mzc2VSwJLy8gPHUsMSwwLDc+OiBDb3N0IDMgdnNsZG9pNCA8Nyx1LDEsMD4sIDw3LHUsMSwwPgorICAxNjE2NTE5ODg5VSwJLy8gPHUsMSwwLHU+OiBDb3N0IDIgdnNsZG9pOCA8MCx1LHUsMT4sIDwwLHUsdSwxPgorICAxNTQ4ODk0ODY2VSwJLy8gPHUsMSwxLDA+OiBDb3N0IDIgdnNsZG9pNCA8MCx1LDEsMT4sIDwwLHUsMSwxPgorICAyNjkyNzExNDJVLAkvLyA8dSwxLDEsMT46IENvc3QgMSB2c3BsdGlzdzEgTEhTCisgIDExODk0NjI5MzRVLAkvLyA8dSwxLDEsMj46IENvc3QgMiB2bXJnaHcgTEhTLCA8MSwyLDMsMD4KKyAgMjYyMjYzODIzMFUsCS8vIDx1LDEsMSwzPjogQ29zdCAzIHZzbGRvaTQgPDAsdSwxLDE+LCA8MywwLDEsMj4KKyAgMTU0ODg5NzU5MFUsCS8vIDx1LDEsMSw0PjogQ29zdCAyIHZzbGRvaTQgPDAsdSwxLDE+LCBSSFMKKyAgMjc1Njk4NTY5MlUsCS8vIDx1LDEsMSw1PjogQ29zdCAzIHZzbGRvaTEyIExIUywgPDEsMSw1LDU+CisgIDI2NTg0NzI4NzJVLAkvLyA8dSwxLDEsNj46IENvc3QgMyB2c2xkb2k0IDw2LHUsMSwxPiwgPDYsdSwxLDE+CisgIDIyODc2MTQxNDJVLAkvLyA8dSwxLDEsNz46IENvc3QgMyB2bXJnbHcgPDAsdSx1LDE+LCA8dSw2LDEsNz4KKyAgMjY5MjcxMTQyVSwJLy8gPHUsMSwxLHU+OiBDb3N0IDEgdnNwbHRpc3cxIExIUworICAxNTY2ODE4NDA2VSwJLy8gPHUsMSwyLDA+OiBDb3N0IDIgdnNsZG9pNCA8Myx1LDEsMj4sIExIUworICAyNzU2OTg1NzM1VSwJLy8gPHUsMSwyLDE+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MSwyLDEsMz4KKyAgMTE0ODM3MTg2MlUsCS8vIDx1LDEsMiwyPjogQ29zdCAyIHZtcmdodyA8MSwyLDMsMD4sIDwxLDIsMywwPgorICA4MzU1ODRVLAkvLyA8dSwxLDIsMz46IENvc3QgMCBjb3B5IExIUworICAxNTY2ODIxNjg2VSwJLy8gPHUsMSwyLDQ+OiBDb3N0IDIgdnNsZG9pNCA8Myx1LDEsMj4sIFJIUworICAyNzU2OTg1NzcxVSwJLy8gPHUsMSwyLDU+OiBDb3N0IDMgdnNsZG9pMTIgTEhTLCA8MSwyLDUsMz4KKyAgMjY5MDI2Mjk3MFUsCS8vIDx1LDEsMiw2PjogQ29zdCAzIHZzbGRvaTggPDAsdSx1LDE+LCA8Miw2LDMsNz4KKyAgMTU5MDcxMTkzOFUsCS8vIDx1LDEsMiw3PjogQ29zdCAyIHZzbGRvaTQgPDcsdSwxLDI+LCA8Nyx1LDEsMj4KKyAgODM1NTg0VSwJLy8gPHUsMSwyLHU+OiBDb3N0IDAgY29weSBMSFMKKyAgMjI4Mjk3OTMzN1UsCS8vIDx1LDEsMywwPjogQ29zdCAzIHZtcmdsdyBMSFMsIDwwLDAsMSwwPgorICAxMjA5MjM3NTE0VSwJLy8gPHUsMSwzLDE+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDAsMCwxLDE+CisgIDEyMDkyMzk3MDJVLAkvLyA8dSwxLDMsMj46IENvc3QgMiB2bXJnbHcgTEhTLCA8MywwLDEsMj4KKyAgMjI4Mjk3OTUwMlUsCS8vIDx1LDEsMywzPjogQ29zdCAzIHZtcmdsdyBMSFMsIDwwLDIsMSwzPgorICAyMjgyOTc5MzQxVSwJLy8gPHUsMSwzLDQ+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDAsMCwxLDQ+CisgIDEyMDkyMzc4NDJVLAkvLyA8dSwxLDMsNT46IENvc3QgMiB2bXJnbHcgTEhTLCA8MCw0LDEsNT4KKyAgMjI4Mjk3OTUwNVUsCS8vIDx1LDEsMyw2PjogQ29zdCAzIHZtcmdsdyBMSFMsIDwwLDIsMSw2PgorICAyMjg3NjI1NDIzVSwJLy8gPHUsMSwzLDc+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDEsNiwxLDc+CisgIDEyMDkyMzc1MjFVLAkvLyA8dSwxLDMsdT46IENvc3QgMiB2bXJnbHcgTEhTLCA8MCwwLDEsdT4KKyAgMTYzNTEwMTYxM1UsCS8vIDx1LDEsNCwwPjogQ29zdCAyIHZzbGRvaTggPDQsMCx1LDE+LCA8NCwwLHUsMT4KKyAgMjI4OTYyMzA1MFUsCS8vIDx1LDEsNCwxPjogQ29zdCAzIHZtcmdsdyA8MSwyLHUsND4sIDwwLDAsMSwxPgorICAyMjg5NjI1MjM4VSwJLy8gPHUsMSw0LDI+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsdSw0PiwgPDMsMCwxLDI+CisgIDI2NDA1NzkzNjBVLAkvLyA8dSwxLDQsMz46IENvc3QgMyB2c2xkb2k0IDwzLHUsMSw0PiwgPDMsdSwxLDQ+CisgIDI2MjI2NjM5OTBVLAkvLyA8dSwxLDQsND46IENvc3QgMyB2c2xkb2k0IDwwLHUsMSw0PiwgUkhTCisgIDE2MTY1MjI1NTBVLAkvLyA8dSwxLDQsNT46IENvc3QgMiB2c2xkb2k4IDwwLHUsdSwxPiwgUkhTCisgIDI2NjQ0NjkzOThVLAkvLyA8dSwxLDQsNj46IENvc3QgMyB2c2xkb2k0IDw3LHUsMSw0PiwgPDYsNyx1LDE+CisgIDI2NjQ0NzAxNDhVLAkvLyA8dSwxLDQsNz46IENvc3QgMyB2c2xkb2k0IDw3LHUsMSw0PiwgPDcsdSwxLDQ+CisgIDE2MTY1MjI3OTNVLAkvLyA8dSwxLDQsdT46IENvc3QgMiB2c2xkb2k4IDwwLHUsdSwxPiwgUkhTCisgIDE1NDg5Mjc2MzhVLAkvLyA8dSwxLDUsMD46IENvc3QgMiB2c2xkb2k0IDwwLHUsMSw1PiwgPDAsdSwxLDU+CisgIDExOTI0NDQ3MjRVLAkvLyA8dSwxLDUsMT46IENvc3QgMiB2bXJnaHcgUkhTLCA8MSwxLDEsMT4KKyAgMTE5MjQ0NDgyMlUsCS8vIDx1LDEsNSwyPjogQ29zdCAyIHZtcmdodyBSSFMsIDwxLDIsMywwPgorICAyNjIyNjcwOTk4VSwJLy8gPHUsMSw1LDM+OiBDb3N0IDMgdnNsZG9pNCA8MCx1LDEsNT4sIDwzLDAsMSwyPgorICAxNTQ4OTMwMzU4VSwJLy8gPHUsMSw1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8MCx1LDEsNT4sIFJIUworICAxMjEwNzI4Nzg2VSwJLy8gPHUsMSw1LDU+OiBDb3N0IDIgdm1yZ2x3IDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDI3MTQxNTMwNThVLAkvLyA8dSwxLDUsNj46IENvc3QgMyB2c2xkb2k4IDw0LHUsdSwxPiwgPDUsNiw3LDA+CisgIDI2NzA0NDk2NThVLAkvLyA8dSwxLDUsNz46IENvc3QgMyB2c2xkb2k0IDx1LHUsMSw1PiwgPDcsMCwxLDI+CisgIDE1NDg5MzI5MTBVLAkvLyA8dSwxLDUsdT46IENvc3QgMiB2c2xkb2k0IDwwLHUsMSw1PiwgTEhTCisgIDI2MjI2Nzc2NTVVLAkvLyA8dSwxLDYsMD46IENvc3QgMyB2c2xkb2k0IDwwLHUsMSw2PiwgPDAsdSwxLDY+CisgIDI3NTY5ODYwNjNVLAkvLyA8dSwxLDYsMT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwxLDYsMSw3PgorICAyMzAyOTEyNjYyVSwJLy8gPHUsMSw2LDI+OiBDb3N0IDMgdm1yZ2x3IDwzLDQsdSw2PiwgPDMsMCwxLDI+CisgIDM2OTY0MjEwMTRVLAkvLyA8dSwxLDYsMz46IENvc3QgNCB2c2xkb2k0IDwwLHUsMSw2PiwgPDMsMCwxLDI+CisgIDI2MjI2ODAzNzRVLAkvLyA8dSwxLDYsND46IENvc3QgMyB2c2xkb2k0IDwwLHUsMSw2PiwgUkhTCisgIDI3NTY5ODYwOTlVLAkvLyA8dSwxLDYsNT46IENvc3QgMyB2c2xkb2kxMiBMSFMsIDwxLDYsNSw3PgorICAyNzE0MTUzNzg0VSwJLy8gPHUsMSw2LDY+OiBDb3N0IDMgdnNsZG9pOCA8NCx1LHUsMT4sIDw2LDYsNiw2PgorICAxNjUxNjkyNDM4VSwJLy8gPHUsMSw2LDc+OiBDb3N0IDIgdnNsZG9pOCA8Niw3LHUsMT4sIDw2LDcsdSwxPgorICAxNjUyMzU2MDcxVSwJLy8gPHUsMSw2LHU+OiBDb3N0IDIgdnNsZG9pOCA8Nix1LHUsMT4sIDw2LHUsdSwxPgorICAyNjI4NjU3MjU0VSwJLy8gPHUsMSw3LDA+OiBDb3N0IDMgdnNsZG9pNCA8MSx1LDEsNz4sIExIUworICAxMjM1ODEyMzYyVSwJLy8gPHUsMSw3LDE+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDAsMCwxLDE+CisgIDEyMzU4MTQ1NTBVLAkvLyA8dSwxLDcsMj46IENvc3QgMiB2bXJnbHcgUkhTLCA8MywwLDEsMj4KKyAgMjMwOTU1NDM1MFUsCS8vIDx1LDEsNywzPjogQ29zdCAzIHZtcmdsdyBSSFMsIDwwLDIsMSwzPgorICAyNjI4NjYwNTM0VSwJLy8gPHUsMSw3LDQ+OiBDb3N0IDMgdnNsZG9pNCA8MSx1LDEsNz4sIFJIUworICAxMjM1ODEyNjkwVSwJLy8gPHUsMSw3LDU+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDAsNCwxLDU+CisgIDIzMDk1NTQzNTNVLAkvLyA8dSwxLDcsNj46IENvc3QgMyB2bXJnbHcgUkhTLCA8MCwyLDEsNj4KKyAgMjMwOTU1NDY3OFUsCS8vIDx1LDEsNyw3PjogQ29zdCAzIHZtcmdsdyBSSFMsIDwwLDYsMSw3PgorICAxMjM1ODEyMzY5VSwJLy8gPHUsMSw3LHU+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDAsMCwxLHU+CisgIDE1NDg5NTIyMTdVLAkvLyA8dSwxLHUsMD46IENvc3QgMiB2c2xkb2k0IDwwLHUsMSx1PiwgPDAsdSwxLHU+CisgIDI2OTI3MTE0MlUsCS8vIDx1LDEsdSwxPjogQ29zdCAxIHZzcGx0aXN3MSBMSFMKKyAgMTIwOTI4MDY2MlUsCS8vIDx1LDEsdSwyPjogQ29zdCAyIHZtcmdsdyBMSFMsIDwzLDAsMSwyPgorICA4MzU1ODRVLAkvLyA8dSwxLHUsMz46IENvc3QgMCBjb3B5IExIUworICAxNTQ4OTU0OTM0VSwJLy8gPHUsMSx1LDQ+OiBDb3N0IDIgdnNsZG9pNCA8MCx1LDEsdT4sIFJIUworICAxMjA5Mjc4ODAyVSwJLy8gPHUsMSx1LDU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDAsNCwxLDU+CisgIDIyODMwMjA0NjVVLAkvLyA8dSwxLHUsNj46IENvc3QgMyB2bXJnbHcgTEhTLCA8MCwyLDEsNj4KKyAgMTU5MDc2MTA5NlUsCS8vIDx1LDEsdSw3PjogQ29zdCAyIHZzbGRvaTQgPDcsdSwxLHU+LCA8Nyx1LDEsdT4KKyAgODM1NTg0VSwJLy8gPHUsMSx1LHU+OiBDb3N0IDAgY29weSBMSFMKKyAgMjcwMjg3NjY3MlUsCS8vIDx1LDIsMCwwPjogQ29zdCAzIHZzbGRvaTggPDMsMCx1LDI+LCA8MCwwLDAsMD4KKyAgMTYyOTEzNDk1MFUsCS8vIDx1LDIsMCwxPjogQ29zdCAyIHZzbGRvaTggPDMsMCx1LDI+LCBMSFMKKyAgMjI4OTU5MTkxMlUsCS8vIDx1LDIsMCwyPjogQ29zdCAzIHZtcmdsdyA8MSwyLHUsMD4sIDwyLDIsMiwyPgorICAxMjE1ODQ4NTUwVSwJLy8gPHUsMiwwLDM+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsdSwwPiwgTEhTCisgIDI3MDI4NzcwMTBVLAkvLyA8dSwyLDAsND46IENvc3QgMyB2c2xkb2k4IDwzLDAsdSwyPiwgPDAsNCwxLDU+CisgIDIyODkyMjI3MDhVLAkvLyA8dSwyLDAsNT46IENvc3QgMyB2bXJnbHcgPDEsMiwzLDA+LCA8MSw0LDIsNT4KKyAgMjc3OTE3ODQ3M1UsCS8vIDx1LDIsMCw2PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDIsMCw2LDE+CisgIDI3MjYyNDkwMjRVLAkvLyA8dSwyLDAsNz46IENvc3QgMyB2c2xkb2k4IDw3LDAsMSwyPiwgPDAsNywxLDA+CisgIDEyMTU4NDg1NTVVLAkvLyA8dSwyLDAsdT46IENvc3QgMiB2bXJnbHcgPDEsMix1LDA+LCBMSFMKKyAgMjY5MDkzMzUzOVUsCS8vIDx1LDIsMSwwPjogQ29zdCAzIHZzbGRvaTggPDEsMCx1LDI+LCA8MSwwLHUsMj4KKyAgMjYyODY4MzEyNFUsCS8vIDx1LDIsMSwxPjogQ29zdCAzIHZzbGRvaTQgPDEsdSwyLDE+LCA8MSx1LDIsMT4KKyAgMTE4OTQ2MzY1NlUsCS8vIDx1LDIsMSwyPjogQ29zdCAyIHZtcmdodyBMSFMsIDwyLDIsMiwyPgorICAxMjEzODY2MDg2VSwJLy8gPHUsMiwxLDM+OiBDb3N0IDIgdm1yZ2x3IDwwLHUsdSwxPiwgTEhTCisgIDI2Mjg2ODUxMTBVLAkvLyA8dSwyLDEsND46IENvc3QgMyB2c2xkb2k0IDwxLHUsMiwxPiwgUkhTCisgIDIyNjMyMDU3MzZVLAkvLyA8dSwyLDEsNT46IENvc3QgMyB2bXJnaHcgTEhTLCA8Miw1LDMsNj4KKyAgMTE4OTQ2Mzk5NFUsCS8vIDx1LDIsMSw2PjogQ29zdCAyIHZtcmdodyBMSFMsIDwyLDYsMyw3PgorICAyMjYzMjA1ODY2VSwJLy8gPHUsMiwxLDc+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDIsNywwLDE+CisgIDEyMTM4NjYwOTFVLAkvLyA8dSwyLDEsdT46IENvc3QgMiB2bXJnbHcgPDAsdSx1LDE+LCBMSFMKKyAgMTU1NjkzODg1NFUsCS8vIDx1LDIsMiwwPjogQ29zdCAyIHZzbGRvaTQgPDIsMiwyLDI+LCBMSFMKKyAgMjY5NzU2OTg2OVUsCS8vIDx1LDIsMiwxPjogQ29zdCAzIHZzbGRvaTggPDIsMSx1LDI+LCA8MiwxLHUsMj4KKyAgMzM2MzgwMDA2VSwJLy8gPHUsMiwyLDI+OiBDb3N0IDEgdnNwbHRpc3cyIExIUworICAxNjc4NTk5Nzk0VSwJLy8gPHUsMiwyLDM+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8MiwyLDMsMz4KKyAgMTU1Njk0MjEzNFUsCS8vIDx1LDIsMiw0PjogQ29zdCAyIHZzbGRvaTQgPDIsMiwyLDI+LCBSSFMKKyAgMjI5NTEzODA2MVUsCS8vIDx1LDIsMiw1PjogQ29zdCAzIHZtcmdsdyA8MiwyLDIsMj4sIDwyLDQsMiw1PgorICAyNzAyODc4NjUwVSwJLy8gPHUsMiwyLDY+OiBDb3N0IDMgdnNsZG9pOCA8MywwLHUsMj4sIDwyLDYsMyw3PgorICAyMzAwMjI5ODMxVSwJLy8gPHUsMiwyLDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDAsdSwyPiwgPHUsNiwyLDc+CisgIDMzNjM4MDAwNlUsCS8vIDx1LDIsMix1PjogQ29zdCAxIHZzcGx0aXN3MiBMSFMKKyAgNDc1MjQzMTY1VSwJLy8gPHUsMiwzLDA+OiBDb3N0IDEgdnNsZG9pNCBMSFMsIExIUworICAxNTQ4OTg1MTQwVSwJLy8gPHUsMiwzLDE+OiBDb3N0IDIgdnNsZG9pNCBMSFMsIDwxLDEsMSwxPgorICAxMjA5MjM5MTQ0VSwJLy8gPHUsMiwzLDI+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDIsMiwyLDI+CisgIDEzNTQ5NTc4MlUsCS8vIDx1LDIsMywzPjogQ29zdCAxIHZtcmdsdyBMSFMsIExIUworICA0NzUyNDU4NzhVLAkvLyA8dSwyLDMsND46IENvc3QgMSB2c2xkb2k0IExIUywgUkhTCisgIDE1OTY3NjQxNjRVLAkvLyA8dSwyLDMsNT46IENvc3QgMiB2c2xkb2k0IExIUywgPDUsNSw1LDU+CisgIDE1OTY3NjQ2NjZVLAkvLyA8dSwyLDMsNj46IENvc3QgMiB2c2xkb2k0IExIUywgPDYsMiw3LDM+CisgIDE1OTY3NjUxNzhVLAkvLyA8dSwyLDMsNz46IENvc3QgMiB2c2xkb2k0IExIUywgPDcsMCwxLDI+CisgIDEzNTQ5NTc4N1UsCS8vIDx1LDIsMyx1PjogQ29zdCAxIHZtcmdsdyBMSFMsIExIUworICAyNzA4ODUxNjMwVSwJLy8gPHUsMiw0LDA+OiBDb3N0IDMgdnNsZG9pOCA8NCwwLHUsMj4sIDw0LDAsdSwyPgorICAyMjE3MzYyOTc5VSwJLy8gPHUsMiw0LDE+OiBDb3N0IDMgdm1yZ2h3IDwwLDQsMSw1PiwgPDIsMSwzLDU+CisgIDIyODk2MjQ2ODBVLAkvLyA8dSwyLDQsMj46IENvc3QgMyB2bXJnbHcgPDEsMix1LDQ+LCA8MiwyLDIsMj4KKyAgMTIxNTg4MTMxOFUsCS8vIDx1LDIsNCwzPjogQ29zdCAyIHZtcmdsdyA8MSwyLHUsND4sIExIUworICAyNzI2NzY3ODI0VSwJLy8gPHUsMiw0LDQ+OiBDb3N0IDMgdnNsZG9pOCA8NywwLHUsMj4sIDw0LDQsNCw0PgorICAxNjI5MTM4MjMwVSwJLy8gPHUsMiw0LDU+OiBDb3N0IDIgdnNsZG9pOCA8MywwLHUsMj4sIFJIUworICAyNzc5MTc4ODAxVSwJLy8gPHUsMiw0LDY+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8Miw0LDYsNT4KKyAgMjcyNjI1MTk3NlUsCS8vIDx1LDIsNCw3PjogQ29zdCAzIHZzbGRvaTggPDcsMCwxLDI+LCA8NCw3LDUsMD4KKyAgMTIxNTg4MTMyM1UsCS8vIDx1LDIsNCx1PjogQ29zdCAyIHZtcmdsdyA8MSwyLHUsND4sIExIUworICAyNjI4NzE0NTk4VSwJLy8gPHUsMiw1LDA+OiBDb3N0IDMgdnNsZG9pNCA8MSx1LDIsNT4sIExIUworICAyNjI4NzE1ODk2VSwJLy8gPHUsMiw1LDE+OiBDb3N0IDMgdnNsZG9pNCA8MSx1LDIsNT4sIDwxLHUsMiw1PgorICAxMTkyNDQ1NTQ0VSwJLy8gPHUsMiw1LDI+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDIsMiwyLDI+CisgIDEyMTM4OTg4NTRVLAkvLyA8dSwyLDUsMz46IENvc3QgMiB2bXJnbHcgPDAsdSx1LDU+LCBMSFMKKyAgMjYyODcxNzg3OFUsCS8vIDx1LDIsNSw0PjogQ29zdCAzIHZzbGRvaTQgPDEsdSwyLDU+LCBSSFMKKyAgMjcyNjc2ODY0NFUsCS8vIDx1LDIsNSw1PjogQ29zdCAzIHZzbGRvaTggPDcsMCx1LDI+LCA8NSw1LDUsNT4KKyAgMTE5MjQ0NTg4MlUsCS8vIDx1LDIsNSw2PjogQ29zdCAyIHZtcmdodyBSSFMsIDwyLDYsMyw3PgorICAyMjY2MTg3NzU0VSwJLy8gPHUsMiw1LDc+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDIsNywwLDE+CisgIDEyMTM4OTg4NTlVLAkvLyA8dSwyLDUsdT46IENvc3QgMiB2bXJnbHcgPDAsdSx1LDU+LCBMSFMKKyAgMjYzNDY5NDc1OFUsCS8vIDx1LDIsNiwwPjogQ29zdCAzIHZzbGRvaTQgPDIsdSwyLDY+LCBMSFMKKyAgMjcyMTQ2MDY1N1UsCS8vIDx1LDIsNiwxPjogQ29zdCAzIHZzbGRvaTggPDYsMSx1LDI+LCA8NiwxLHUsMj4KKyAgMjI5Njk0MDEzNlUsCS8vIDx1LDIsNiwyPjogQ29zdCAzIHZtcmdsdyA8Miw0LHUsNj4sIDwyLDIsMiwyPgorICAxNjc4NjAwMTIyVSwJLy8gPHUsMiw2LDM+OiBDb3N0IDIgdnNsZG9pMTIgTEhTLCA8Miw2LDMsNz4KKyAgMjYzNDY5ODAzOFUsCS8vIDx1LDIsNiw0PjogQ29zdCAzIHZzbGRvaTQgPDIsdSwyLDY+LCBSSFMKKyAgMzM3MDY4MjEyNVUsCS8vIDx1LDIsNiw1PjogQ29zdCA0IHZtcmdsdyA8Miw0LHUsNj4sIDwyLDQsMiw1PgorICAxMTU3MDU2NDQyVSwJLy8gPHUsMiw2LDY+OiBDb3N0IDIgdm1yZ2h3IDwyLDYsMyw3PiwgPDIsNiwzLDc+CisgIDI3MjU0NDI0NTVVLAkvLyA8dSwyLDYsNz46IENvc3QgMyB2c2xkb2k4IDw2LDcsdSwyPiwgPDYsNyx1LDI+CisgIDE2Nzg2MDAxNjdVLAkvLyA8dSwyLDYsdT46IENvc3QgMiB2c2xkb2kxMiBMSFMsIDwyLDYsdSw3PgorICAxNjUzMDI3ODk3VSwJLy8gPHUsMiw3LDA+OiBDb3N0IDIgdnNsZG9pOCA8NywwLHUsMj4sIDw3LDAsdSwyPgorICAyMzA5NTU0OTI0VSwJLy8gPHUsMiw3LDE+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDEsMCwyLDE+CisgIDEyMzU4MTM5OTJVLAkvLyA8dSwyLDcsMj46IENvc3QgMiB2bXJnbHcgUkhTLCA8MiwyLDIsMj4KKyAgMTYyMDcwNjMwVSwJLy8gPHUsMiw3LDM+OiBDb3N0IDEgdm1yZ2x3IFJIUywgTEhTCisgIDI2MzQ3MDYyMzBVLAkvLyA8dSwyLDcsND46IENvc3QgMyB2c2xkb2k0IDwyLHUsMiw3PiwgUkhTCisgIDIzMDk1NTUyNTJVLAkvLyA8dSwyLDcsNT46IENvc3QgMyB2bXJnbHcgUkhTLCA8MSw0LDIsNT4KKyAgMjMwOTU1NTkwMVUsCS8vIDx1LDIsNyw2PjogQ29zdCAzIHZtcmdsdyBSSFMsIDwyLDMsMiw2PgorICAyMzA5NTU1NDE2VSwJLy8gPHUsMiw3LDc+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDEsNiwyLDc+CisgIDE2MjA3MDYzNVUsCS8vIDx1LDIsNyx1PjogQ29zdCAxIHZtcmdsdyBSSFMsIExIUworICA0NzUyODQxMzBVLAkvLyA8dSwyLHUsMD46IENvc3QgMSB2c2xkb2k0IExIUywgTEhTCisgIDE1NDkwMjYxMDBVLAkvLyA8dSwyLHUsMT46IENvc3QgMiB2c2xkb2k0IExIUywgPDEsMSwxLDE+CisgIDMzNjM4MDAwNlUsCS8vIDx1LDIsdSwyPjogQ29zdCAxIHZzcGx0aXN3MiBMSFMKKyAgMTM1NTM2NzQyVSwJLy8gPHUsMix1LDM+OiBDb3N0IDEgdm1yZ2x3IExIUywgTEhTCisgIDQ3NTI4NjgzOFUsCS8vIDx1LDIsdSw0PjogQ29zdCAxIHZzbGRvaTQgTEhTLCBSSFMKKyAgMTYyOTE0MTE0NlUsCS8vIDx1LDIsdSw1PjogQ29zdCAyIHZzbGRvaTggPDMsMCx1LDI+LCBSSFMKKyAgMTE5NDEwODg1OFUsCS8vIDx1LDIsdSw2PjogQ29zdCAyIHZtcmdodyBMSFMsIDwyLDYsMyw3PgorICAxNTk2ODA2MTM4VSwJLy8gPHUsMix1LDc+OiBDb3N0IDIgdnNsZG9pNCBMSFMsIDw3LDAsMSwyPgorICAxMzU1MzY3NDdVLAkvLyA8dSwyLHUsdT46IENvc3QgMSB2bXJnbHcgTEhTLCBMSFMKKyAgMTYxMTg5MDY4OFUsCS8vIDx1LDMsMCwwPjogQ29zdCAyIHZzbGRvaTggTEhTLCA8MCwwLDAsMD4KKyAgNTM4MTQ5MDIwVSwJLy8gPHUsMywwLDE+OiBDb3N0IDEgdnNsZG9pOCBMSFMsIExIUworICAyNjg1NjMyNjg1VSwJLy8gPHUsMywwLDI+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwwLDIsMSwyPgorICAyNjg1NjMyNzY0VSwJLy8gPHUsMywwLDM+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwwLDMsMSwwPgorICAxNjExODkxMDI2VSwJLy8gPHUsMywwLDQ+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwwLDQsMSw1PgorICAyNzMzNDA4NzIyVSwJLy8gPHUsMywwLDU+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwwLDUsNiw3PgorICAyNjU4NjEyMTUzVSwJLy8gPHUsMywwLDY+OiBDb3N0IDMgdnNsZG9pNCA8Nix1LDMsMD4sIDw2LHUsMywwPgorICAyMjg5NTkyMjUwVSwJLy8gPHUsMywwLDc+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsdSwwPiwgPDIsNiwzLDc+CisgIDUzODE0OTUzM1UsCS8vIDx1LDMsMCx1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBMSFMKKyAgMTE4OTQ2NDIxNFUsCS8vIDx1LDMsMSwwPjogQ29zdCAyIHZtcmdodyBMSFMsIDwzLDAsMSwyPgorICAxNjExODkxNTA4VSwJLy8gPHUsMywxLDE+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwxLDEsMSwxPgorICAxNjExODkxNjA2VSwJLy8gPHUsMywxLDI+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwxLDIsMywwPgorICAxMTg5NDY0NDc2VSwJLy8gPHUsMywxLDM+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDMsMywzLDM+CisgIDExODk0NjQ1NzhVLAkvLyA8dSwzLDEsND46IENvc3QgMiB2bXJnaHcgTEhTLCA8Myw0LDUsNj4KKyAgMjY5MDI3ODUxMVUsCS8vIDx1LDMsMSw1PjogQ29zdCAzIHZzbGRvaTggTEhTLCA8MSw1LDAsMT4KKyAgMjY5MDI3ODYwN1UsCS8vIDx1LDMsMSw2PjogQ29zdCAzIHZzbGRvaTggTEhTLCA8MSw2LDEsNz4KKyAgMjI4NzYwOTc4NlUsCS8vIDx1LDMsMSw3PjogQ29zdCAzIHZtcmdsdyA8MCx1LHUsMT4sIDwyLDYsMyw3PgorICAxNjExODkyMDkyVSwJLy8gPHUsMywxLHU+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwxLHUsMywwPgorICAyNjg1NjM0MDQyVSwJLy8gPHUsMywyLDA+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwyLDAsdSwwPgorICAyNjg1NjM0MDc5VSwJLy8gPHUsMywyLDE+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwyLDEsMywxPgorICAxNjExODkyMzI4VSwJLy8gPHUsMywyLDI+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwyLDIsMiwyPgorICAxNjExODkyMzkwVSwJLy8gPHUsMywyLDM+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwyLDMsMCwxPgorICAyNjg1NjM0MzcxVSwJLy8gPHUsMywyLDQ+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwyLDQsdSw1PgorICAyNjg1NjM0NDUzVSwJLy8gPHUsMywyLDU+OiBDb3N0IDMgdnNsZG9pOCBMSFMsIDwyLDUsdSw2PgorICAxNjExODkyNjY2VSwJLy8gPHUsMywyLDY+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDwyLDYsMyw3PgorICAyMzAwMjI1NDY2VSwJLy8gPHUsMywyLDc+OiBDb3N0IDMgdm1yZ2x3IDwzLDAsdSwyPiwgPDIsNiwzLDc+CisgIDE2MTE4OTI3OTVVLAkvLyA8dSwzLDIsdT46IENvc3QgMiB2c2xkb2k4IExIUywgPDIsdSwwLDE+CisgIDEyMDkyMzg0MjJVLAkvLyA8dSwzLDMsMD46IENvc3QgMiB2bXJnbHcgTEhTLCA8MSwyLDMsMD4KKyAgMjI4Mjk4MDI0N1UsCS8vIDx1LDMsMywxPjogQ29zdCAzIHZtcmdsdyBMSFMsIDwxLDIsMywxPgorICAxNTYxMDA0MTIwVSwJLy8gPHUsMywzLDI+OiBDb3N0IDIgdnNsZG9pNCA8Mix1LDMsMz4sIDwyLHUsMywzPgorICA0MDM0ODg4NzBVLAkvLyA8dSwzLDMsMz46IENvc3QgMSB2c3BsdGlzdzMgTEhTCisgIDEyMDkyMzg0MjZVLAkvLyA8dSwzLDMsND46IENvc3QgMiB2bXJnbHcgTEhTLCA8MSwyLDMsND4KKyAgMjI4Mjk4MDg5OVUsCS8vIDx1LDMsMyw1PjogQ29zdCAzIHZtcmdsdyBMSFMsIDwyLDEsMyw1PgorICAyMjgyOTg1NTk4VSwJLy8gPHUsMywzLDY+OiBDb3N0IDMgdm1yZ2x3IExIUywgPHUsNSwzLDY+CisgIDEyMDkyMzk0ODJVLAkvLyA8dSwzLDMsNz46IENvc3QgMiB2bXJnbHcgTEhTLCA8Miw2LDMsNz4KKyAgNDAzNDg4ODcwVSwJLy8gPHUsMywzLHU+OiBDb3N0IDEgdnNwbHRpc3czIExIUworICAxNTU1MDM4MzEwVSwJLy8gPHUsMyw0LDA+OiBDb3N0IDIgdnNsZG9pNCA8MSx1LDMsND4sIExIUworICAxNTU1MDM5NjE2VSwJLy8gPHUsMyw0LDE+OiBDb3N0IDIgdnNsZG9pNCA8MSx1LDMsND4sIDwxLHUsMyw0PgorICAyNjI4NzgxNjcyVSwJLy8gPHUsMyw0LDI+OiBDb3N0IDMgdnNsZG9pNCA8MSx1LDMsND4sIDwyLDIsMiwyPgorICAyMjg5NjI0NjkwVSwJLy8gPHUsMyw0LDM+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsdSw0PiwgPDIsMiwzLDM+CisgIDE1NTUwNDE1OTBVLAkvLyA8dSwzLDQsND46IENvc3QgMiB2c2xkb2k0IDwxLHUsMyw0PiwgUkhTCisgIDUzODE1MjI0NlUsCS8vIDx1LDMsNCw1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBSSFMKKyAgMjY1ODY0NDkyNVUsCS8vIDx1LDMsNCw2PjogQ29zdCAzIHZzbGRvaTQgPDYsdSwzLDQ+LCA8Nix1LDMsND4KKyAgMjI4OTYyNTAxOFUsCS8vIDx1LDMsNCw3PjogQ29zdCAzIHZtcmdsdyA8MSwyLHUsND4sIDwyLDYsMyw3PgorICA1MzgxNTI0ODlVLAkvLyA8dSwzLDQsdT46IENvc3QgMSB2c2xkb2k4IExIUywgUkhTCisgIDExOTI0NDYxMDJVLAkvLyA8dSwzLDUsMD46IENvc3QgMiB2bXJnaHcgUkhTLCA8MywwLDEsMj4KKyAgMjczMzQxMTk4M1UsCS8vIDx1LDMsNSwxPjogQ29zdCAzIHZzbGRvaTggTEhTLCA8NSwxLDAsMT4KKyAgMjYzNDc2MjMzMFUsCS8vIDx1LDMsNSwyPjogQ29zdCAzIHZzbGRvaTQgPDIsdSwzLDU+LCA8Mix1LDMsNT4KKyAgMTE5MjQ0NjM2NFUsCS8vIDx1LDMsNSwzPjogQ29zdCAyIHZtcmdodyBSSFMsIDwzLDMsMywzPgorICAxMTkyNDQ2NDY2VSwJLy8gPHUsMyw1LDQ+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDMsNCw1LDY+CisgIDE2NTk2NzA1MzJVLAkvLyA8dSwzLDUsNT46IENvc3QgMiB2c2xkb2k4IExIUywgPDUsNSw1LDU+CisgIDE2NTk2NzA2MjZVLAkvLyA8dSwzLDUsNj46IENvc3QgMiB2c2xkb2k4IExIUywgPDUsNiw3LDA+CisgIDIyODc2NDI1NTRVLAkvLyA8dSwzLDUsNz46IENvc3QgMyB2bXJnbHcgPDAsdSx1LDU+LCA8Miw2LDMsNz4KKyAgMTY1OTY3MDc4OFUsCS8vIDx1LDMsNSx1PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8NSx1LDcsMD4KKyAgMjYzNDc2ODQ4NlUsCS8vIDx1LDMsNiwwPjogQ29zdCAzIHZzbGRvaTQgPDIsdSwzLDY+LCBMSFMKKyAgMjczMzQxMjc3NVUsCS8vIDx1LDMsNiwxPjogQ29zdCAzIHZzbGRvaTggTEhTLCA8NiwxLDcsMT4KKyAgMTY0ODM5MDY1OVUsCS8vIDx1LDMsNiwyPjogQ29zdCAyIHZzbGRvaTggPDYsMix1LDM+LCA8NiwyLHUsMz4KKyAgMjYzNDc3MDk3M1UsCS8vIDx1LDMsNiwzPjogQ29zdCAzIHZzbGRvaTQgPDIsdSwzLDY+LCA8Myw0LHUsNj4KKyAgMjYzNDc3MTc2NlUsCS8vIDx1LDMsNiw0PjogQ29zdCAzIHZzbGRvaTQgPDIsdSwzLDY+LCBSSFMKKyAgMjczMzQxMzA5OVUsCS8vIDx1LDMsNiw1PjogQ29zdCAzIHZzbGRvaTggTEhTLCA8Niw1LDcsMT4KKyAgMTY1OTY3MTM1MlUsCS8vIDx1LDMsNiw2PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8Niw2LDYsNj4KKyAgMTY1OTY3MTM3NFUsCS8vIDx1LDMsNiw3PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8Niw3LDAsMT4KKyAgMTY1MjM3MjQ1N1UsCS8vIDx1LDMsNix1PjogQ29zdCAyIHZzbGRvaTggPDYsdSx1LDM+LCA8Nix1LHUsMz4KKyAgMTU2MTAzNDg1NFUsCS8vIDx1LDMsNywwPjogQ29zdCAyIHZzbGRvaTQgPDIsdSwzLDc+LCBMSFMKKyAgMjYzNDc3NzM5NlUsCS8vIDx1LDMsNywxPjogQ29zdCAzIHZzbGRvaTQgPDIsdSwzLDc+LCA8MSwxLDEsMT4KKyAgMTU2MTAzNjg5MlUsCS8vIDx1LDMsNywyPjogQ29zdCAyIHZzbGRvaTQgPDIsdSwzLDc+LCA8Mix1LDMsNz4KKyAgMTIzNTgxNDAwMlUsCS8vIDx1LDMsNywzPjogQ29zdCAyIHZtcmdsdyBSSFMsIDwyLDIsMywzPgorICAxNTYxMDM4MTM0VSwJLy8gPHUsMyw3LDQ+OiBDb3N0IDIgdnNsZG9pNCA8Mix1LDMsNz4sIFJIUworICAyMzA5NTU1NzQ3VSwJLy8gPHUsMyw3LDU+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDIsMSwzLDU+CisgIDIzMDk1NTYwNzJVLAkvLyA8dSwzLDcsNj46IENvc3QgMyB2bXJnbHcgUkhTLCA8Miw1LDMsNj4KKyAgMTIzNTgxNDMzMFUsCS8vIDx1LDMsNyw3PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwyLDYsMyw3PgorICAxNTYxMDQwNjg2VSwJLy8gPHUsMyw3LHU+OiBDb3N0IDIgdnNsZG9pNCA8Mix1LDMsNz4sIExIUworICAxNjExODk2NTMxVSwJLy8gPHUsMyx1LDA+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDx1LDAsMSwyPgorICA1MzgxNTQ3OThVLAkvLyA8dSwzLHUsMT46IENvc3QgMSB2c2xkb2k4IExIUywgTEhTCisgIDE2MTE4OTY3MTJVLAkvLyA8dSwzLHUsMj46IENvc3QgMiB2c2xkb2k4IExIUywgPHUsMiwzLDM+CisgIDQwMzQ4ODg3MFUsCS8vIDx1LDMsdSwzPjogQ29zdCAxIHZzcGx0aXN3MyBMSFMKKyAgMTYxMTg5Njg5NVUsCS8vIDx1LDMsdSw0PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8dSw0LDUsNj4KKyAgNTM4MTU1MTYyVSwJLy8gPHUsMyx1LDU+OiBDb3N0IDEgdnNsZG9pOCBMSFMsIFJIUworICAxNjExODk3MDQwVSwJLy8gPHUsMyx1LDY+OiBDb3N0IDIgdnNsZG9pOCBMSFMsIDx1LDYsMyw3PgorICAxMjA5MjgwNDQyVSwJLy8gPHUsMyx1LDc+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDIsNiwzLDc+CisgIDUzODE1NTM2NVUsCS8vIDx1LDMsdSx1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBMSFMKKyAgMTE2NTExODM1NFUsCS8vIDx1LDQsMCwwPjogQ29zdCAyIHZtcmdodyA8NCwwLDUsMT4sIDw0LDAsNSwxPgorICAxNjE4NTM0NTAyVSwJLy8gPHUsNCwwLDE+OiBDb3N0IDIgdnNsZG9pOCA8MSwyLHUsND4sIExIUworICAyNjM0Nzk1MTAyVSwJLy8gPHUsNCwwLDI+OiBDb3N0IDMgdnNsZG9pNCA8Mix1LDQsMD4sIDwyLHUsNCwwPgorICAyNjg2NDUxOTY4VSwJLy8gPHUsNCwwLDM+OiBDb3N0IDMgdnNsZG9pOCA8MCwzLDEsND4sIDwwLDMsMSw0PgorICAyNjkyMjc2NTYyVSwJLy8gPHUsNCwwLDQ+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLHUsND4sIDwwLDQsMSw1PgorICAxNzA1NDM4MDk4VSwJLy8gPHUsNCwwLDU+OiBDb3N0IDIgdnNsZG9pMTIgUkhTLCA8NCwwLDUsMT4KKyAgMjY1ODY4NTg5MFUsCS8vIDx1LDQsMCw2PjogQ29zdCAzIHZzbGRvaTQgPDYsdSw0LDA+LCA8Nix1LDQsMD4KKyAgMjI1NjQ4OTkyOFUsCS8vIDx1LDQsMCw3PjogQ29zdCAzIHZtcmdodyA8NywwLDEsMj4sIDw0LDcsNSwwPgorICAxNjE4NTM1MDY5VSwJLy8gPHUsNCwwLHU+OiBDb3N0IDIgdnNsZG9pOCA8MSwyLHUsND4sIExIUworICAxMTg5NDY0OTc4VSwJLy8gPHUsNCwxLDA+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDQsMCw1LDE+CisgIDI2OTIyNzcwNDRVLAkvLyA8dSw0LDEsMT46IENvc3QgMyB2c2xkb2k4IDwxLDIsdSw0PiwgPDEsMSwxLDE+CisgIDE2MTg1MzUzNjdVLAkvLyA8dSw0LDEsMj46IENvc3QgMiB2c2xkb2k4IDwxLDIsdSw0PiwgPDEsMix1LDQ+CisgIDI2NDA3NzU5OTJVLAkvLyA8dSw0LDEsMz46IENvc3QgMyB2c2xkb2k0IDwzLHUsNCwxPiwgPDMsdSw0LDE+CisgIDExODk0NjUyOTZVLAkvLyA8dSw0LDEsND46IENvc3QgMiB2bXJnaHcgTEhTLCA8NCw0LDQsND4KKyAgMTE1NzIzNTc0VSwJLy8gPHUsNCwxLDU+OiBDb3N0IDEgdm1yZ2h3IExIUywgUkhTCisgIDIyNjMyMDcyODlVLAkvLyA8dSw0LDEsNj46IENvc3QgMyB2bXJnaHcgTEhTLCA8NCw2LDUsMj4KKyAgMjY2NDY2Njc4MFUsCS8vIDx1LDQsMSw3PjogQ29zdCAzIHZzbGRvaTQgPDcsdSw0LDE+LCA8Nyx1LDQsMT4KKyAgMTE1NzIzODE3VSwJLy8gPHUsNCwxLHU+OiBDb3N0IDEgdm1yZ2h3IExIUywgUkhTCisgIDIyNjM5MTk1MDZVLAkvLyA8dSw0LDIsMD46IENvc3QgMyB2bXJnaHcgPHUsMiwzLDA+LCA8NCwwLDUsMT4KKyAgMjIyMjExNTgxMlUsCS8vIDx1LDQsMiwxPjogQ29zdCAzIHZtcmdodyA8MSwyLDMsMD4sIDw0LDEsNSwyPgorICAyNjkyMjc3ODY0VSwJLy8gPHUsNCwyLDI+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLHUsND4sIDwyLDIsMiwyPgorICAyNjkyMjc3OTI2VSwJLy8gPHUsNCwyLDM+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLHUsND4sIDwyLDMsMCwxPgorICAyMzI0MTE0NjQwVSwJLy8gPHUsNCwyLDQ+OiBDb3N0IDMgdm1yZ2x3IDw3LDAsdSwyPiwgPDQsNCw0LDQ+CisgIDExOTAxNzgxMDJVLAkvLyA8dSw0LDIsNT46IENvc3QgMiB2bXJnaHcgPHUsMiwzLDA+LCBSSFMKKyAgMjY5MjI3ODIwMlUsCS8vIDx1LDQsMiw2PjogQ29zdCAzIHZzbGRvaTggPDEsMix1LDQ+LCA8Miw2LDMsNz4KKyAgMjcwMTU2ODA1M1UsCS8vIDx1LDQsMiw3PjogQ29zdCAzIHZzbGRvaTggPDIsNyx1LDQ+LCA8Miw3LHUsND4KKyAgMTE5MDE3ODM0NVUsCS8vIDx1LDQsMix1PjogQ29zdCAyIHZtcmdodyA8dSwyLDMsMD4sIFJIUworICAyNjkyMjc4NDIyVSwJLy8gPHUsNCwzLDA+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLHUsND4sIDwzLDAsMSwyPgorICAyMjgyOTgxNTUyVSwJLy8gPHUsNCwzLDE+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDMsMCw0LDE+CisgIDI3MDQyMjI1ODVVLAkvLyA8dSw0LDMsMj46IENvc3QgMyB2c2xkb2k4IDwzLDIsdSw0PiwgPDMsMix1LDQ+CisgIDI2OTIyNzg2ODRVLAkvLyA8dSw0LDMsMz46IENvc3QgMyB2c2xkb2k4IDwxLDIsdSw0PiwgPDMsMywzLDM+CisgIDEyNTcwMTY1MjhVLAkvLyA8dSw0LDMsND46IENvc3QgMiB2bXJnbHcgTEhTLCA8NCw0LDQsND4KKyAgMTIwOTIzOTI0NlUsCS8vIDx1LDQsMyw1PjogQ29zdCAyIHZtcmdsdyBMSFMsIDwyLDMsNCw1PgorICAyNjkxOTEwMzAwVSwJLy8gPHUsNCwzLDY+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLDMsND4sIDwzLDYsNCw3PgorICAyNjY0NjgzMTY2VSwJLy8gPHUsNCwzLDc+OiBDb3N0IDMgdnNsZG9pNCA8Nyx1LDQsMz4sIDw3LHUsNCwzPgorICAxMjA5MjM5MjQ5VSwJLy8gPHUsNCwzLHU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDIsMyw0LHU+CisgIDE1NzMwMjc5NDJVLAkvLyA8dSw0LDQsMD46IENvc3QgMiB2c2xkb2k0IDw0LHUsNCw0PiwgTEhTCisgIDI2MzQ4MjY2OTVVLAkvLyA8dSw0LDQsMT46IENvc3QgMyB2c2xkb2k0IDwyLHUsNCw0PiwgPDEsMix1LDQ+CisgIDI2MzQ4Mjc4NzRVLAkvLyA8dSw0LDQsMj46IENvc3QgMyB2c2xkb2k0IDwyLHUsNCw0PiwgPDIsdSw0LDQ+CisgIDIyODk2MjkwNzNVLAkvLyA8dSw0LDQsMz46IENvc3QgMyB2bXJnbHcgPDEsMix1LDQ+LCA8dSwyLDQsMz4KKyAgMjI5MDM1MzE4VSwJLy8gPHUsNCw0LDQ+OiBDb3N0IDEgdnNwbHRpc3cwIFJIUworICAxNjE4NTM3NzgyVSwJLy8gPHUsNCw0LDU+OiBDb3N0IDIgdnNsZG9pOCA8MSwyLHUsND4sIFJIUworICAyNjU4NzE4NjYyVSwJLy8gPHUsNCw0LDY+OiBDb3N0IDMgdnNsZG9pNCA8Nix1LDQsND4sIDw2LHUsNCw0PgorICAyMjg5NjI5NDAxVSwJLy8gPHUsNCw0LDc+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsdSw0PiwgPHUsNiw0LDc+CisgIDIyOTAzNTMxOFUsCS8vIDx1LDQsNCx1PjogQ29zdCAxIHZzcGx0aXN3MCBSSFMKKyAgMTU2MTA5MjE5OFUsCS8vIDx1LDQsNSwwPjogQ29zdCAyIHZzbGRvaTQgPDIsdSw0LDU+LCBMSFMKKyAgMjYyODg2MzM3MFUsCS8vIDx1LDQsNSwxPjogQ29zdCAzIHZzbGRvaTQgPDEsdSw0LDU+LCA8MSx1LDQsNT4KKyAgMTU2MTA5NDI0M1UsCS8vIDx1LDQsNSwyPjogQ29zdCAyIHZzbGRvaTQgPDIsdSw0LDU+LCA8Mix1LDQsNT4KKyAgMjYzNDgzNjExOFUsCS8vIDx1LDQsNSwzPjogQ29zdCAzIHZzbGRvaTQgPDIsdSw0LDU+LCA8MywwLDEsMj4KKyAgMTU2MTA5NTQ3OFUsCS8vIDx1LDQsNSw0PjogQ29zdCAyIHZzbGRvaTQgPDIsdSw0LDU+LCBSSFMKKyAgMTE4NzA1NDYyVSwJLy8gPHUsNCw1LDU+OiBDb3N0IDEgdm1yZ2h3IFJIUywgUkhTCisgIDYwNDg1OTcwMlUsCS8vIDx1LDQsNSw2PjogQ29zdCAxIHZzbGRvaTEyIExIUywgUkhTCisgIDI2NTg3MjY5MDZVLAkvLyA8dSw0LDUsNz46IENvc3QgMyB2c2xkb2k0IDw2LHUsNCw1PiwgPDcsMCwxLDI+CisgIDYwNDg1OTcyMFUsCS8vIDx1LDQsNSx1PjogQ29zdCAxIHZzbGRvaTEyIExIUywgUkhTCisgIDIyNjY2MzEwNThVLAkvLyA8dSw0LDYsMD46IENvc3QgMyB2bXJnaHcgPHUsNiwzLDc+LCA8NCwwLDUsMT4KKyAgMjMwMjY5MjE1MlUsCS8vIDx1LDQsNiwxPjogQ29zdCAzIHZtcmdsdyA8Myw0LDUsNj4sIDwzLHUsNCwxPgorICAyNzE4ODIyOTA2VSwJLy8gPHUsNCw2LDI+OiBDb3N0IDMgdnNsZG9pOCA8NSw2LHUsND4sIDw2LDIsNywzPgorICAyNzIyODA0MzA5VSwJLy8gPHUsNCw2LDM+OiBDb3N0IDMgdnNsZG9pOCA8NiwzLHUsND4sIDw2LDMsdSw0PgorICAyNzIzNDY3OTQyVSwJLy8gPHUsNCw2LDQ+OiBDb3N0IDMgdnNsZG9pOCA8Niw0LHUsND4sIDw2LDQsdSw0PgorICAxMTkyODg5NjU0VSwJLy8gPHUsNCw2LDU+OiBDb3N0IDIgdm1yZ2h3IDx1LDYsMyw3PiwgUkhTCisgIDI3MTg4MjMyMjRVLAkvLyA8dSw0LDYsNj46IENvc3QgMyB2c2xkb2k4IDw1LDYsdSw0PiwgPDYsNiw2LDY+CisgIDI3MTg4MjMyNDZVLAkvLyA8dSw0LDYsNz46IENvc3QgMyB2c2xkb2k4IDw1LDYsdSw0PiwgPDYsNywwLDE+CisgIDExOTI4ODk4OTdVLAkvLyA8dSw0LDYsdT46IENvc3QgMiB2bXJnaHcgPHUsNiwzLDc+LCBSSFMKKyAgMjY0MDgyMjM3NFUsCS8vIDx1LDQsNywwPjogQ29zdCAzIHZzbGRvaTQgPDMsdSw0LDc+LCBMSFMKKyAgMjY0MDgyMzE5NFUsCS8vIDx1LDQsNywxPjogQ29zdCAzIHZzbGRvaTQgPDMsdSw0LDc+LCA8MSwyLDMsND4KKyAgMjcyODExMzM3M1UsCS8vIDx1LDQsNywyPjogQ29zdCAzIHZzbGRvaTggPDcsMix1LDQ+LCA8NywyLHUsND4KKyAgMjY0MDgyNTE1MFUsCS8vIDx1LDQsNywzPjogQ29zdCAzIHZzbGRvaTQgPDMsdSw0LDc+LCA8Myx1LDQsNz4KKyAgMTIzNTgxNTYzMlUsCS8vIDx1LDQsNyw0PjogQ29zdCAyIHZtcmdsdyBSSFMsIDw0LDQsNCw0PgorICAxMjM1ODE0MDk0VSwJLy8gPHUsNCw3LDU+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDIsMyw0LDU+CisgIDI3MzA3Njc5MDVVLAkvLyA8dSw0LDcsNj46IENvc3QgMyB2c2xkb2k4IDw3LDYsdSw0PiwgPDcsNix1LDQ+CisgIDIzMDk1NTY4OTJVLAkvLyA8dSw0LDcsNz46IENvc3QgMyB2bXJnbHcgUkhTLCA8Myw2LDQsNz4KKyAgMTIzNTgxNDA5N1UsCS8vIDx1LDQsNyx1PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwyLDMsNCx1PgorICAxNTYxMTE2Nzc0VSwJLy8gPHUsNCx1LDA+OiBDb3N0IDIgdnNsZG9pNCA8Mix1LDQsdT4sIExIUworICAxNjE4NTQwMzM0VSwJLy8gPHUsNCx1LDE+OiBDb3N0IDIgdnNsZG9pOCA8MSwyLHUsND4sIExIUworICAxNTYxMTE4ODIyVSwJLy8gPHUsNCx1LDI+OiBDb3N0IDIgdnNsZG9pNCA8Mix1LDQsdT4sIDwyLHUsNCx1PgorICAyNjkyMjgyMzAwVSwJLy8gPHUsNCx1LDM+OiBDb3N0IDMgdnNsZG9pOCA8MSwyLHUsND4sIDx1LDMsMCwxPgorICAyMjkwMzUzMThVLAkvLyA8dSw0LHUsND46IENvc3QgMSB2c3BsdGlzdzAgUkhTCisgIDEyMDM2ODQzOFUsCS8vIDx1LDQsdSw1PjogQ29zdCAxIHZtcmdodyBMSFMsIFJIUworICA2MDQ4NTk5NDVVLAkvLyA8dSw0LHUsNj46IENvc3QgMSB2c2xkb2kxMiBMSFMsIFJIUworICAyMzA5NTY1MDg0VSwJLy8gPHUsNCx1LDc+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDMsNiw0LDc+CisgIDYwNDg1OTk2M1UsCS8vIDx1LDQsdSx1PjogQ29zdCAxIHZzbGRvaTEyIExIUywgUkhTCisgIDI2OTAyOTM3NjBVLAkvLyA8dSw1LDAsMD46IENvc3QgMyB2c2xkb2k4IDwwLHUsdSw1PiwgPDAsMCwwLDA+CisgIDE2MTY1NTIwMzhVLAkvLyA8dSw1LDAsMT46IENvc3QgMiB2c2xkb2k4IDwwLHUsdSw1PiwgTEhTCisgIDI2NDA4NDA0MzRVLAkvLyA8dSw1LDAsMj46IENvc3QgMyB2c2xkb2k0IDwzLHUsNSwwPiwgPDIsMyx1LDU+CisgIDI2NDA4NDE1MzZVLAkvLyA8dSw1LDAsMz46IENvc3QgMyB2c2xkb2k0IDwzLHUsNSwwPiwgPDMsdSw1LDA+CisgIDE2MTMzODE5NzBVLAkvLyA8dSw1LDAsND46IENvc3QgMiB2c2xkb2k4IDwwLDQsMSw1PiwgPDAsNCwxLDU+CisgIDIzMTYxMzU2NDJVLAkvLyA8dSw1LDAsNT46IENvc3QgMyB2bXJnbHcgPDUsNix1LDA+LCA8NCw0LDUsNT4KKyAgMjI4OTU5MjgzNFUsCS8vIDx1LDUsMCw2PjogQ29zdCAzIHZtcmdsdyA8MSwyLHUsMD4sIDwzLDQsNSw2PgorICAyNjY0NzMyMzI0VSwJLy8gPHUsNSwwLDc+OiBDb3N0IDMgdnNsZG9pNCA8Nyx1LDUsMD4sIDw3LHUsNSwwPgorICAxNjE2NTUyNjYxVSwJLy8gPHUsNSwwLHU+OiBDb3N0IDIgdnNsZG9pOCA8MCx1LHUsNT4sIDwwLHUsdSw1PgorICAxNTczMDc3MDk0VSwJLy8gPHUsNSwxLDA+OiBDb3N0IDIgdnNsZG9pNCA8NCx1LDUsMT4sIExIUworICAxMjM3NTM2MjgyVSwJLy8gPHUsNSwxLDE+OiBDb3N0IDIgdm1yZ2x3IDw0LHUsNSwxPiwgPDQsdSw1LDE+CisgIDI2OTAyOTQ2NzhVLAkvLyA8dSw1LDEsMj46IENvc3QgMyB2c2xkb2k4IDwwLHUsdSw1PiwgPDEsMiwzLDA+CisgIDI2NDY4MjEwMTRVLAkvLyA8dSw1LDEsMz46IENvc3QgMyB2c2xkb2k0IDw0LHUsNSwxPiwgPDMsMCwxLDI+CisgIDE1NzMwODA2MDJVLAkvLyA8dSw1LDEsND46IENvc3QgMiB2c2xkb2k0IDw0LHUsNSwxPiwgPDQsdSw1LDE+CisgIDExODk0NjYxMTZVLAkvLyA8dSw1LDEsNT46IENvc3QgMiB2bXJnaHcgTEhTLCA8NSw1LDUsNT4KKyAgMTE4OTQ2NjIxMFUsCS8vIDx1LDUsMSw2PjogQ29zdCAyIHZtcmdodyBMSFMsIDw1LDYsNywwPgorICAyNjQ2ODIzOTMwVSwJLy8gPHUsNSwxLDc+OiBDb3N0IDMgdnNsZG9pNCA8NCx1LDUsMT4sIDw3LDAsMSwyPgorICAxNTczMDgyOTI2VSwJLy8gPHUsNSwxLHU+OiBDb3N0IDIgdnNsZG9pNCA8NCx1LDUsMT4sIExIUworICAyNjQwODU1MTQyVSwJLy8gPHUsNSwyLDA+OiBDb3N0IDMgdnNsZG9pNCA8Myx1LDUsMj4sIExIUworICAyNjk3NTk0NDQ4VSwJLy8gPHUsNSwyLDE+OiBDb3N0IDMgdnNsZG9pOCA8MiwxLHUsNT4sIDwyLDEsdSw1PgorICAyNjkwMjk1NDAwVSwJLy8gPHUsNSwyLDI+OiBDb3N0IDMgdnNsZG9pOCA8MCx1LHUsNT4sIDwyLDIsMiwyPgorICAxNjI1MTc5ODkwVSwJLy8gPHUsNSwyLDM+OiBDb3N0IDIgdnNsZG9pOCA8MiwzLHUsNT4sIDwyLDMsdSw1PgorICAyNjk5NTg1MzQ3VSwJLy8gPHUsNSwyLDQ+OiBDb3N0IDMgdnNsZG9pOCA8Miw0LHUsNT4sIDwyLDQsdSw1PgorICAyNzgxMTcxNDcxVSwJLy8gPHUsNSwyLDU+OiBDb3N0IDMgdnNsZG9pMTIgUkhTLCA8NSwyLDUsMz4KKyAgMjY5MDI5NTczOFUsCS8vIDx1LDUsMiw2PjogQ29zdCAzIHZzbGRvaTggPDAsdSx1LDU+LCA8Miw2LDMsNz4KKyAgMzc3NTMxODA3MFUsCS8vIDx1LDUsMiw3PjogQ29zdCA0IHZzbGRvaTggPDIsNyx1LDU+LCA8Miw3LHUsNT4KKyAgMTYyODQ5ODA1NVUsCS8vIDx1LDUsMix1PjogQ29zdCAyIHZzbGRvaTggPDIsdSx1LDU+LCA8Mix1LHUsNT4KKyAgMjI4NzYyNzIzNFUsCS8vIDx1LDUsMywwPjogQ29zdCAzIHZtcmdsdyBMSFMsIDw0LDEsNSwwPgorICAxMjU3MDE2MjEwVSwJLy8gPHUsNSwzLDE+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDQsMCw1LDE+CisgIDI2NDY4MzY5NDJVLAkvLyA8dSw1LDMsMj46IENvc3QgMyB2c2xkb2k0IDw0LHUsNSwzPiwgPDIsMyw0LDU+CisgIDIyODc2MjUxMzFVLAkvLyA8dSw1LDMsMz46IENvc3QgMyB2bXJnbHcgTEhTLCA8MSwyLDUsMz4KKyAgMjI4NzYyNzIzOFUsCS8vIDx1LDUsMyw0PjogQ29zdCAzIHZtcmdsdyBMSFMsIDw0LDEsNSw0PgorICAxMjU3MDE2NTM4VSwJLy8gPHUsNSwzLDU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDQsNCw1LDU+CisgIDEyMDkyNDAwNjZVLAkvLyA8dSw1LDMsNj46IENvc3QgMiB2bXJnbHcgTEhTLCA8Myw0LDUsNj4KKyAgMjI4NzYyNTQ1OVUsCS8vIDx1LDUsMyw3PjogQ29zdCAzIHZtcmdsdyBMSFMsIDwxLDYsNSw3PgorICAxMjA5MjQwMDY4VSwJLy8gPHUsNSwzLHU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDMsNCw1LHU+CisgIDI2NDA4NzE1MjZVLAkvLyA8dSw1LDQsMD46IENvc3QgMyB2c2xkb2k0IDwzLHUsNSw0PiwgTEhTCisgIDIzMTYxNjgwODJVLAkvLyA8dSw1LDQsMT46IENvc3QgMyB2bXJnbHcgPDUsNix1LDQ+LCA8NCwwLDUsMT4KKyAgMjY0MDg3MzIwMlUsCS8vIDx1LDUsNCwyPjogQ29zdCAzIHZzbGRvaTQgPDMsdSw1LDQ+LCA8MiwzLHUsNT4KKyAgMjY0MDg3NDMwOFUsCS8vIDx1LDUsNCwzPjogQ29zdCAzIHZzbGRvaTQgPDMsdSw1LDQ+LCA8Myx1LDUsND4KKyAgMTYzNzc4ODkxN1UsCS8vIDx1LDUsNCw0PjogQ29zdCAyIHZzbGRvaTggPDQsNCx1LDU+LCA8NCw0LHUsNT4KKyAgMTYxNjU1NTMxOFUsCS8vIDx1LDUsNCw1PjogQ29zdCAyIHZzbGRvaTggPDAsdSx1LDU+LCBSSFMKKyAgMjI4NzYzODU5MVUsCS8vIDx1LDUsNCw2PjogQ29zdCAzIHZtcmdsdyA8MCx1LHUsND4sIDx1LDQsNSw2PgorICAyNjY0NzY1MDk2VSwJLy8gPHUsNSw0LDc+OiBDb3N0IDMgdnNsZG9pNCA8Nyx1LDUsND4sIDw3LHUsNSw0PgorICAxNjE2NTU1NTYxVSwJLy8gPHUsNSw0LHU+OiBDb3N0IDIgdnNsZG9pOCA8MCx1LHUsNT4sIFJIUworICAxNTczMTA5ODYyVSwJLy8gPHUsNSw1LDA+OiBDb3N0IDIgdnNsZG9pNCA8NCx1LDUsNT4sIExIUworICAyNjQ2ODUyNDA0VSwJLy8gPHUsNSw1LDE+OiBDb3N0IDMgdnNsZG9pNCA8NCx1LDUsNT4sIDwxLDEsMSwxPgorICAyNjQ2ODUzMjI0VSwJLy8gPHUsNSw1LDI+OiBDb3N0IDMgdnNsZG9pNCA8NCx1LDUsNT4sIDwyLDIsMiwyPgorICAyMjg3NjQ2NjE4VSwJLy8gPHUsNSw1LDM+OiBDb3N0IDMgdm1yZ2x3IDwwLHUsdSw1PiwgPHUsMiw1LDM+CisgIDE1NzMxMTMzNzRVLAkvLyA8dSw1LDUsND46IENvc3QgMiB2c2xkb2k0IDw0LHUsNSw1PiwgPDQsdSw1LDU+CisgIDI5NjE0NDE4MlUsCS8vIDx1LDUsNSw1PjogQ29zdCAxIHZzcGx0aXN3MSBSSFMKKyAgMTE5MjQ0ODA5OFUsCS8vIDx1LDUsNSw2PjogQ29zdCAyIHZtcmdodyBSSFMsIDw1LDYsNywwPgorICAyMjg3NjQ2OTQ2VSwJLy8gPHUsNSw1LDc+OiBDb3N0IDMgdm1yZ2x3IDwwLHUsdSw1PiwgPHUsNiw1LDc+CisgIDI5NjE0NDE4MlUsCS8vIDx1LDUsNSx1PjogQ29zdCAxIHZzcGx0aXN3MSBSSFMKKyAgMTU2NzE0NjA4NlUsCS8vIDx1LDUsNiwwPjogQ29zdCAyIHZzbGRvaTQgPDMsdSw1LDY+LCBMSFMKKyAgMjYyODk0NTMwMFUsCS8vIDx1LDUsNiwxPjogQ29zdCAzIHZzbGRvaTQgPDEsdSw1LDY+LCA8MSx1LDUsNj4KKyAgMjYzNDkxNzk5N1UsCS8vIDx1LDUsNiwyPjogQ29zdCAzIHZzbGRvaTQgPDIsdSw1LDY+LCA8Mix1LDUsNj4KKyAgMTU2NzE0ODg3MFUsCS8vIDx1LDUsNiwzPjogQ29zdCAyIHZzbGRvaTQgPDMsdSw1LDY+LCA8Myx1LDUsNj4KKyAgMTU2NzE0OTM2NlUsCS8vIDx1LDUsNiw0PjogQ29zdCAyIHZzbGRvaTQgPDMsdSw1LDY+LCBSSFMKKyAgMjc4MTE3MTc5OVUsCS8vIDx1LDUsNiw1PjogQ29zdCAzIHZzbGRvaTEyIFJIUywgPDUsNiw1LDc+CisgIDEyMjg5NTAwMThVLAkvLyA8dSw1LDYsNj46IENvc3QgMiB2bXJnbHcgPDMsNCw1LDY+LCA8Myw0LDUsNj4KKyAgMjc3MDUzNDRVLAkvLyA8dSw1LDYsNz46IENvc3QgMCBjb3B5IFJIUworICAyNzcwNTM0NFUsCS8vIDx1LDUsNix1PjogQ29zdCAwIGNvcHkgUkhTCisgIDI2Mjg5NTIxNjZVLAkvLyA8dSw1LDcsMD46IENvc3QgMyB2c2xkb2k0IDwxLHUsNSw3PiwgTEhTCisgIDEyMzU4MTUzMTRVLAkvLyA8dSw1LDcsMT46IENvc3QgMiB2bXJnbHcgUkhTLCA8NCwwLDUsMT4KKyAgMjMwOTU1NjczNFUsCS8vIDx1LDUsNywyPjogQ29zdCAzIHZtcmdsdyBSSFMsIDwzLDQsNSwyPgorICAyMzA5NTU1MTE1VSwJLy8gPHUsNSw3LDM+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDEsMiw1LDM+CisgIDI2Mjg5NTU0NDZVLAkvLyA8dSw1LDcsND46IENvc3QgMyB2c2xkb2k0IDwxLHUsNSw3PiwgUkhTCisgIDEyMzU4MTU2NDJVLAkvLyA8dSw1LDcsNT46IENvc3QgMiB2bXJnbHcgUkhTLCA8NCw0LDUsNT4KKyAgMTIzNTgxNDkxNFUsCS8vIDx1LDUsNyw2PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwzLDQsNSw2PgorICAyMzA5NTU1NDQzVSwJLy8gPHUsNSw3LDc+OiBDb3N0IDMgdm1yZ2x3IFJIUywgPDEsNiw1LDc+CisgIDEyMzU4MTQ5MTZVLAkvLyA8dSw1LDcsdT46IENvc3QgMiB2bXJnbHcgUkhTLCA8Myw0LDUsdT4KKyAgMTU2NzE2MjQ3MFUsCS8vIDx1LDUsdSwwPjogQ29zdCAyIHZzbGRvaTQgPDMsdSw1LHU+LCBMSFMKKyAgMTYxNjU1Nzg3MFUsCS8vIDx1LDUsdSwxPjogQ29zdCAyIHZzbGRvaTggPDAsdSx1LDU+LCBMSFMKKyAgMjY5MDI5OTc4MVUsCS8vIDx1LDUsdSwyPjogQ29zdCAzIHZzbGRvaTggPDAsdSx1LDU+LCA8dSwyLDMsMD4KKyAgMTU2NzE2NTI1NlUsCS8vIDx1LDUsdSwzPjogQ29zdCAyIHZzbGRvaTQgPDMsdSw1LHU+LCA8Myx1LDUsdT4KKyAgMTU2NzE2NTc1MFUsCS8vIDx1LDUsdSw0PjogQ29zdCAyIHZzbGRvaTQgPDMsdSw1LHU+LCBSSFMKKyAgMjk2MTQ0MTgyVSwJLy8gPHUsNSx1LDU+OiBDb3N0IDEgdnNwbHRpc3cxIFJIUworICAxMjA5MjgxMDI2VSwJLy8gPHUsNSx1LDY+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDMsNCw1LDY+CisgIDI3NzA1MzQ0VSwJLy8gPHUsNSx1LDc+OiBDb3N0IDAgY29weSBSSFMKKyAgMjc3MDUzNDRVLAkvLyA8dSw1LHUsdT46IENvc3QgMCBjb3B5IFJIUworICAyNzA1NTYzNjQ4VSwJLy8gPHUsNiwwLDA+OiBDb3N0IDMgdnNsZG9pOCA8Myw0LHUsNj4sIDwwLDAsMCwwPgorICAxNjMxODIxOTI2VSwJLy8gPHUsNiwwLDE+OiBDb3N0IDIgdnNsZG9pOCA8Myw0LHUsNj4sIExIUworICAyMjYyNDYyOTcwVSwJLy8gPHUsNiwwLDI+OiBDb3N0IDMgdm1yZ2h3IDx1LDAsMSwyPiwgPDYsMiw3LDM+CisgIDI2NDY4ODY5NDFVLAkvLyA8dSw2LDAsMz46IENvc3QgMyB2c2xkb2k0IDw0LHUsNiwwPiwgPDMsNCx1LDY+CisgIDI3MDU1NjM5ODZVLAkvLyA8dSw2LDAsND46IENvc3QgMyB2c2xkb2k4IDwzLDQsdSw2PiwgPDAsNCwxLDU+CisgIDIzMTYwNjI2NTJVLAkvLyA8dSw2LDAsNT46IENvc3QgMyB2bXJnbHcgPDUsNiw3LDA+LCA8NSw0LDYsNT4KKyAgMjMxNjEzNzI3MlUsCS8vIDx1LDYsMCw2PjogQ29zdCAzIHZtcmdsdyA8NSw2LHUsMD4sIDw2LDYsNiw2PgorICAxMjE1ODUxODMwVSwJLy8gPHUsNiwwLDc+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsdSwwPiwgUkhTCisgIDEyMTU4NTE4MzFVLAkvLyA8dSw2LDAsdT46IENvc3QgMiB2bXJnbHcgPDEsMix1LDA+LCBSSFMKKyAgMjYzNDk0ODcxMFUsCS8vIDx1LDYsMSwwPjogQ29zdCAzIHZzbGRvaTQgPDIsdSw2LDE+LCBMSFMKKyAgMjcwNTU2NDQ2OFUsCS8vIDx1LDYsMSwxPjogQ29zdCAzIHZzbGRvaTggPDMsNCx1LDY+LCA8MSwxLDEsMT4KKyAgMTE4OTQ2NjYxOFUsCS8vIDx1LDYsMSwyPjogQ29zdCAyIHZtcmdodyBMSFMsIDw2LDIsNywzPgorICAyMjYzMjA4NDk4VSwJLy8gPHUsNiwxLDM+OiBDb3N0IDMgdm1yZ2h3IExIUywgPDYsMyw0LDU+CisgIDI2OTM2MjA4NDNVLAkvLyA8dSw2LDEsND46IENvc3QgMyB2c2xkb2k4IDwxLDQsdSw2PiwgPDEsNCx1LDY+CisgIDI2NTI4Njg4NjBVLAkvLyA8dSw2LDEsNT46IENvc3QgMyB2c2xkb2k0IDw1LHUsNiwxPiwgPDUsdSw2LDE+CisgIDExODk0NjY5MzZVLAkvLyA8dSw2LDEsNj46IENvc3QgMiB2bXJnaHcgTEhTLCA8Niw2LDYsNj4KKyAgMTIxMzg2OTM2NlUsCS8vIDx1LDYsMSw3PjogQ29zdCAyIHZtcmdsdyA8MCx1LHUsMT4sIFJIUworICAxMjEzODY5MzY3VSwJLy8gPHUsNiwxLHU+OiBDb3N0IDIgdm1yZ2x3IDwwLHUsdSwxPiwgUkhTCisgIDI2NTg4NDQ3NzRVLAkvLyA8dSw2LDIsMD46IENvc3QgMyB2c2xkb2k0IDw2LHUsNiwyPiwgTEhTCisgIDM3NzEzNDQ0NjVVLAkvLyA8dSw2LDIsMT46IENvc3QgNCB2c2xkb2k4IDwyLDEsdSw2PiwgPDIsMSx1LDY+CisgIDExNzg1NTQ4NzRVLAkvLyA8dSw2LDIsMj46IENvc3QgMiB2bXJnaHcgPDYsMiw3LDM+LCA8NiwyLDcsMz4KKyAgMjY5ODkyOTkwN1UsCS8vIDx1LDYsMiwzPjogQ29zdCAzIHZzbGRvaTggPDIsMyx1LDY+LCA8MiwzLHUsNj4KKyAgMjY5OTU5MzU0MFUsCS8vIDx1LDYsMiw0PjogQ29zdCAzIHZzbGRvaTggPDIsNCx1LDY+LCA8Miw0LHUsNj4KKyAgMjcwMDI1NzE3M1UsCS8vIDx1LDYsMiw1PjogQ29zdCAzIHZzbGRvaTggPDIsNSx1LDY+LCA8Miw1LHUsNj4KKyAgMjcwNTU2NTYyNlUsCS8vIDx1LDYsMiw2PjogQ29zdCAzIHZzbGRvaTggPDMsNCx1LDY+LCA8Miw2LDMsNz4KKyAgMTIyNjQ4NTA0NlUsCS8vIDx1LDYsMiw3PjogQ29zdCAyIHZtcmdsdyA8MywwLHUsMj4sIFJIUworICAxMjI2NDg1MDQ3VSwJLy8gPHUsNiwyLHU+OiBDb3N0IDIgdm1yZ2x3IDwzLDAsdSwyPiwgUkhTCisgIDI3MDU1NjU4NDZVLAkvLyA8dSw2LDMsMD46IENvc3QgMyB2c2xkb2k4IDwzLDQsdSw2PiwgPDMsMCwxLDI+CisgIDIzMzA3NTY1ODVVLAkvLyA8dSw2LDMsMT46IENvc3QgMyB2bXJnbHcgTEhTLCA8MiwwLDYsMT4KKyAgMjMzMDc1NjgyOVUsCS8vIDx1LDYsMywyPjogQ29zdCAzIHZtcmdsdyBMSFMsIDwyLDMsNiwyPgorICAyMjgyOTgxNzM0VSwJLy8gPHUsNiwzLDM+OiBDb3N0IDMgdm1yZ2x3IExIUywgPDMsMiw2LDM+CisgIDE2MzE4MjQ0MTNVLAkvLyA8dSw2LDMsND46IENvc3QgMiB2c2xkb2k4IDwzLDQsdSw2PiwgPDMsNCx1LDY+CisgIDI2NTI4ODUyNDZVLAkvLyA8dSw2LDMsNT46IENvc3QgMyB2c2xkb2k0IDw1LHUsNiwzPiwgPDUsdSw2LDM+CisgIDEyNTcwMTgxNjhVLAkvLyA8dSw2LDMsNj46IENvc3QgMiB2bXJnbHcgTEhTLCA8Niw2LDYsNj4KKyAgMTM1NDk5MDYyVSwJLy8gPHUsNiwzLDc+OiBDb3N0IDEgdm1yZ2x3IExIUywgUkhTCisgIDEzNTQ5OTA2M1UsCS8vIDx1LDYsMyx1PjogQ29zdCAxIHZtcmdsdyBMSFMsIFJIUworICAyNjQ2OTE3MjIyVSwJLy8gPHUsNiw0LDA+OiBDb3N0IDMgdnNsZG9pNCA8NCx1LDYsND4sIExIUworICAyMjE3MzY1OTMxVSwJLy8gPHUsNiw0LDE+OiBDb3N0IDMgdm1yZ2h3IDwwLDQsMSw1PiwgPDYsMSw3LDU+CisgIDI3OTAxNjcxNTZVLAkvLyA8dSw2LDQsMj46IENvc3QgMyB2c2xkb2kxMiA8Niw0LDIsdT4sIDw2LDQsMix1PgorICAyNjQ2OTE5NzA5VSwJLy8gPHUsNiw0LDM+OiBDb3N0IDMgdnNsZG9pNCA8NCx1LDYsND4sIDwzLDQsdSw2PgorICAyNzExNTM4OTM0VSwJLy8gPHUsNiw0LDQ+OiBDb3N0IDMgdnNsZG9pOCA8NCw0LHUsNj4sIDw0LDQsdSw2PgorICAxNjMxODI1MjA2VSwJLy8gPHUsNiw0LDU+OiBDb3N0IDIgdnNsZG9pOCA8Myw0LHUsNj4sIFJIUworICAyMzE2MTcwMDQwVSwJLy8gPHUsNiw0LDY+OiBDb3N0IDMgdm1yZ2x3IDw1LDYsdSw0PiwgPDYsNiw2LDY+CisgIDEyMTU4ODQ1OThVLAkvLyA8dSw2LDQsNz46IENvc3QgMiB2bXJnbHcgPDEsMix1LDQ+LCBSSFMKKyAgMTIxNTg4NDU5OVUsCS8vIDx1LDYsNCx1PjogQ29zdCAyIHZtcmdsdyA8MSwyLHUsND4sIFJIUworICAyNjM0OTgxNDc4VSwJLy8gPHUsNiw1LDA+OiBDb3N0IDMgdnNsZG9pNCA8Mix1LDYsNT4sIExIUworICAyMjY2MTkwMjQ3VSwJLy8gPHUsNiw1LDE+OiBDb3N0IDMgdm1yZ2h3IFJIUywgPDYsMSw3LDE+CisgIDExOTI0NDg1MDZVLAkvLyA8dSw2LDUsMj46IENvc3QgMiB2bXJnaHcgUkhTLCA8NiwyLDcsMz4KKyAgMjI2NjE5MDM4NlUsCS8vIDx1LDYsNSwzPjogQ29zdCAzIHZtcmdodyBSSFMsIDw2LDMsNCw1PgorICAyNjM0OTg0NzU4VSwJLy8gPHUsNiw1LDQ+OiBDb3N0IDMgdnNsZG9pNCA8Mix1LDYsNT4sIFJIUworICAyNjUyOTAxNjMyVSwJLy8gPHUsNiw1LDU+OiBDb3N0IDMgdnNsZG9pNCA8NSx1LDYsNT4sIDw1LHUsNiw1PgorICAxMTkyNDQ4ODI0VSwJLy8gPHUsNiw1LDY+OiBDb3N0IDIgdm1yZ2h3IFJIUywgPDYsNiw2LDY+CisgIDEyMTM5MDIxMzRVLAkvLyA8dSw2LDUsNz46IENvc3QgMiB2bXJnbHcgPDAsdSx1LDU+LCBSSFMKKyAgMTIxMzkwMjEzNVUsCS8vIDx1LDYsNSx1PjogQ29zdCAyIHZtcmdsdyA8MCx1LHUsNT4sIFJIUworICAxNTgzODA4NjE0VSwJLy8gPHUsNiw2LDA+OiBDb3N0IDIgdnNsZG9pNCA8Niw2LDYsNj4sIExIUworICAyMzIyMDEwNDQ1VSwJLy8gPHUsNiw2LDE+OiBDb3N0IDMgdm1yZ2x3IDw2LDYsNiw2PiwgPDYsMCw2LDE+CisgIDI3MTg4MzkyOTBVLAkvLyA8dSw2LDYsMj46IENvc3QgMyB2c2xkb2k4IDw1LDYsdSw2PiwgPDYsMiw3LDM+CisgIDI2NzA4MjM5NjVVLAkvLyA8dSw2LDYsMz46IENvc3QgMyB2c2xkb2k0IDx1LHUsNiw2PiwgPDMsNCx1LDY+CisgIDE1ODM4MTE4OTRVLAkvLyA8dSw2LDYsND46IENvc3QgMiB2c2xkb2k0IDw2LDYsNiw2PiwgUkhTCisgIDI3MjQxNDc5NjFVLAkvLyA8dSw2LDYsNT46IENvc3QgMyB2c2xkb2k4IDw2LDUsdSw2PiwgPDYsNSx1LDY+CisgIDM2MzI1MzA0NlUsCS8vIDx1LDYsNiw2PjogQ29zdCAxIHZzcGx0aXN3MiBSSFMKKyAgMTIyOTE3MjAyMlUsCS8vIDx1LDYsNiw3PjogQ29zdCAyIHZtcmdsdyA8Myw0LHUsNj4sIFJIUworICAzNjMyNTMwNDZVLAkvLyA8dSw2LDYsdT46IENvc3QgMSB2c3BsdGlzdzIgUkhTCisgIDQ5OTQ1ODE1MFUsCS8vIDx1LDYsNywwPjogQ29zdCAxIHZzbGRvaTQgUkhTLCBMSFMKKyAgMTU3MzIwMDY5MlUsCS8vIDx1LDYsNywxPjogQ29zdCAyIHZzbGRvaTQgUkhTLCA8MSwxLDEsMT4KKyAgMTU3MzIwMTUxMlUsCS8vIDx1LDYsNywyPjogQ29zdCAyIHZzbGRvaTQgUkhTLCA8MiwyLDIsMj4KKyAgMTU3MzIwMjA3MFUsCS8vIDx1LDYsNywzPjogQ29zdCAyIHZzbGRvaTQgUkhTLCA8MywwLDEsMj4KKyAgNDk5NDYxNjczVSwJLy8gPHUsNiw3LDQ+OiBDb3N0IDEgdnNsZG9pNCBSSFMsIFJIUworICAxNTczMjAzOTcyVSwJLy8gPHUsNiw3LDU+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDw1LDUsNSw1PgorICAxMjM1ODE3MjcyVSwJLy8gPHUsNiw3LDY+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDYsNiw2LDY+CisgIDE2MjA3MzkxMFUsCS8vIDx1LDYsNyw3PjogQ29zdCAxIHZtcmdsdyBSSFMsIFJIUworICAxNjIwNzM5MTFVLAkvLyA8dSw2LDcsdT46IENvc3QgMSB2bXJnbHcgUkhTLCBSSFMKKyAgNDk5NDY2MzQyVSwJLy8gPHUsNix1LDA+OiBDb3N0IDEgdnNsZG9pNCBSSFMsIExIUworICAxNjMxODI3NzU4VSwJLy8gPHUsNix1LDE+OiBDb3N0IDIgdnNsZG9pOCA8Myw0LHUsNj4sIExIUworICAxNTczMjA5NzA0VSwJLy8gPHUsNix1LDI+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDwyLDIsMiwyPgorICAxNTczMjEwMjYyVSwJLy8gPHUsNix1LDM+OiBDb3N0IDIgdnNsZG9pNCBSSFMsIDwzLDAsMSwyPgorICA0OTk0Njk4NjZVLAkvLyA8dSw2LHUsND46IENvc3QgMSB2c2xkb2k0IFJIUywgUkhTCisgIDE2MzE4MjgxMjJVLAkvLyA8dSw2LHUsNT46IENvc3QgMiB2c2xkb2k4IDwzLDQsdSw2PiwgUkhTCisgIDM2MzI1MzA0NlUsCS8vIDx1LDYsdSw2PjogQ29zdCAxIHZzcGx0aXN3MiBSSFMKKyAgMTM1NTQwMDIyVSwJLy8gPHUsNix1LDc+OiBDb3N0IDEgdm1yZ2x3IExIUywgUkhTCisgIDEzNTU0MDAyM1UsCS8vIDx1LDYsdSx1PjogQ29zdCAxIHZtcmdsdyBMSFMsIFJIUworICAxNjM4NDY1NTM2VSwJLy8gPHUsNywwLDA+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDwwLDAsMCwwPgorICA1NjQ3MjM4MTRVLAkvLyA8dSw3LDAsMT46IENvc3QgMSB2c2xkb2k4IFJIUywgTEhTCisgIDI3MTIyMDc1MzNVLAkvLyA8dSw3LDAsMj46IENvc3QgMyB2c2xkb2k4IFJIUywgPDAsMiwxLDI+CisgIDI3MTIyMDc2MTJVLAkvLyA8dSw3LDAsMz46IENvc3QgMyB2c2xkb2k4IFJIUywgPDAsMywxLDA+CisgIDE2Mzg0NjU4NzRVLAkvLyA8dSw3LDAsND46IENvc3QgMiB2c2xkb2k4IFJIUywgPDAsNCwxLDU+CisgIDE1NzkxOTI1ODBVLAkvLyA8dSw3LDAsNT46IENvc3QgMiB2c2xkb2k0IDw1LHUsNywwPiwgPDUsdSw3LDA+CisgIDI3MTIyMDc4NjJVLAkvLyA8dSw3LDAsNj46IENvc3QgMyB2c2xkb2k4IFJIUywgPDAsNiwxLDc+CisgIDIzMTYxMzcyODJVLAkvLyA8dSw3LDAsNz46IENvc3QgMyB2bXJnbHcgPDUsNix1LDA+LCA8Niw2LDcsNz4KKyAgNTY0NzI0MzgxVSwJLy8gPHUsNywwLHU+OiBDb3N0IDEgdnNsZG9pOCBSSFMsIExIUworICAxMTg5NDY3MTMwVSwJLy8gPHUsNywxLDA+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDcsMCwxLDI+CisgIDE2Mzg0NjYzNTZVLAkvLyA8dSw3LDEsMT46IENvc3QgMiB2c2xkb2k4IFJIUywgPDEsMSwxLDE+CisgIDE2Mzg0NjY0NTRVLAkvLyA8dSw3LDEsMj46IENvc3QgMiB2c2xkb2k4IFJIUywgPDEsMiwzLDA+CisgIDIzMTE1MDAyODJVLAkvLyA8dSw3LDEsMz46IENvc3QgMyB2bXJnbHcgPDQsdSx1LDE+LCA8NiwyLDcsMz4KKyAgMTE4OTQ2NzQ5NFUsCS8vIDx1LDcsMSw0PjogQ29zdCAyIHZtcmdodyBMSFMsIDw3LDQsNSw2PgorICAyNzEyMjA4NDk1VSwJLy8gPHUsNywxLDU+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDwxLDUsMCwxPgorICAyNjk0OTU2MzAyVSwJLy8gPHUsNywxLDY+OiBDb3N0IDMgdnNsZG9pOCA8MSw2LHUsNz4sIDwxLDYsdSw3PgorICAxMTg5NDY3NzU2VSwJLy8gPHUsNywxLDc+OiBDb3N0IDIgdm1yZ2h3IExIUywgPDcsNyw3LDc+CisgIDE2Mzg0NjY5NDBVLAkvLyA8dSw3LDEsdT46IENvc3QgMiB2c2xkb2k4IFJIUywgPDEsdSwzLDA+CisgIDI3MTIyMDg4MjlVLAkvLyA8dSw3LDIsMD46IENvc3QgMyB2c2xkb2k4IFJIUywgPDIsMCwxLDI+CisgIDI3MTIyMDg5MjdVLAkvLyA8dSw3LDIsMT46IENvc3QgMyB2c2xkb2k4IFJIUywgPDIsMSwzLDE+CisgIDE2Mzg0NjcxNzZVLAkvLyA8dSw3LDIsMj46IENvc3QgMiB2c2xkb2k4IFJIUywgPDIsMiwyLDI+CisgIDE2Mzg0NjcyMzhVLAkvLyA8dSw3LDIsMz46IENvc3QgMiB2c2xkb2k4IFJIUywgPDIsMywwLDE+CisgIDI3MTIyMDkxNjVVLAkvLyA8dSw3LDIsND46IENvc3QgMyB2c2xkb2k4IFJIUywgPDIsNCwyLDU+CisgIDI3MTIyMDkyNTZVLAkvLyA8dSw3LDIsNT46IENvc3QgMyB2c2xkb2k4IFJIUywgPDIsNSwzLDY+CisgIDE2MjcxODcxNzVVLAkvLyA8dSw3LDIsNj46IENvc3QgMiB2c2xkb2k4IDwyLDYsdSw3PiwgPDIsNix1LDc+CisgIDIzMjQxMTYyOTBVLAkvLyA8dSw3LDIsNz46IENvc3QgMyB2bXJnbHcgPDcsMCx1LDI+LCA8Niw2LDcsNz4KKyAgMTYyODUxNDQ0MVUsCS8vIDx1LDcsMix1PjogQ29zdCAyIHZzbGRvaTggPDIsdSx1LDc+LCA8Mix1LHUsNz4KKyAgMTYzODQ2NzczNFUsCS8vIDx1LDcsMywwPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8MywwLDEsMj4KKyAgMjcxMjIwOTYzOFUsCS8vIDx1LDcsMywxPjogQ29zdCAzIHZzbGRvaTggUkhTLCA8MywxLDEsMT4KKyAgMjcwMDkyOTM4N1UsCS8vIDx1LDcsMywyPjogQ29zdCAzIHZzbGRvaTggPDIsNix1LDc+LCA8MywyLDYsdT4KKyAgMTYzODQ2Nzk5NlUsCS8vIDx1LDcsMywzPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8MywzLDMsMz4KKyAgMTYzODQ2ODA5OFUsCS8vIDx1LDcsMyw0PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8Myw0LDUsNj4KKyAgMjcxMjIxMDAwMlUsCS8vIDx1LDcsMyw1PjogQ29zdCAzIHZzbGRvaTggUkhTLCA8Myw1LDUsNT4KKyAgMTU4NTE4OTg1NlUsCS8vIDx1LDcsMyw2PjogQ29zdCAyIHZzbGRvaTQgPDYsdSw3LDM+LCA8Nix1LDcsMz4KKyAgMTI1NzAxODE3OFUsCS8vIDx1LDcsMyw3PjogQ29zdCAyIHZtcmdsdyBMSFMsIDw2LDYsNyw3PgorICAxNjM4NDY4MzgyVSwJLy8gPHUsNywzLHU+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDwzLHUsMSwyPgorICAxNjM4NDY4NDk4VSwJLy8gPHUsNyw0LDA+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw0LDAsNSwxPgorICAyNzEyMjEwMzc4VSwJLy8gPHUsNyw0LDE+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw0LDEsMiwzPgorICAyNzEyMjEwNDg1VSwJLy8gPHUsNyw0LDI+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw0LDIsNSwyPgorICAyNzEyMjEwNTY0VSwJLy8gPHUsNyw0LDM+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw0LDMsNSwwPgorICAxNjM4NDY4ODE2VSwJLy8gPHUsNyw0LDQ+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw0LDQsNCw0PgorICA1NjQ3MjcxMTJVLAkvLyA8dSw3LDQsNT46IENvc3QgMSB2c2xkb2k4IFJIUywgUkhTCisgIDI3MTIyMTA4MDlVLAkvLyA8dSw3LDQsNj46IENvc3QgMyB2c2xkb2k4IFJIUywgPDQsNiw1LDI+CisgIDI3MTIyMTA4ODhVLAkvLyA8dSw3LDQsNz46IENvc3QgMyB2c2xkb2k4IFJIUywgPDQsNyw1LDA+CisgIDU2NDcyNzMzN1UsCS8vIDx1LDcsNCx1PjogQ29zdCAxIHZzbGRvaTggUkhTLCBSSFMKKyAgMTE5MjQ0OTAxOFUsCS8vIDx1LDcsNSwwPjogQ29zdCAyIHZtcmdodyBSSFMsIDw3LDAsMSwyPgorICAyNzE0MjAxNzQzVSwJLy8gPHUsNyw1LDE+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw1LDEsMCwxPgorICAyNzEyMjExMTk4VSwJLy8gPHUsNyw1LDI+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw1LDIsMyw0PgorICAyMzExNTMzMDUwVSwJLy8gPHUsNyw1LDM+OiBDb3N0IDMgdm1yZ2x3IDw0LHUsdSw1PiwgPDYsMiw3LDM+CisgIDExOTI0NDkzODJVLAkvLyA8dSw3LDUsND46IENvc3QgMiB2bXJnaHcgUkhTLCA8Nyw0LDUsNj4KKyAgMTYzODQ2OTYzNlUsCS8vIDx1LDcsNSw1PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8NSw1LDUsNT4KKyAgMTYzODQ2OTczMFUsCS8vIDx1LDcsNSw2PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8NSw2LDcsMD4KKyAgMTE5MjQ0OTY0NFUsCS8vIDx1LDcsNSw3PjogQ29zdCAyIHZtcmdodyBSSFMsIDw3LDcsNyw3PgorICAxNjM4NDY5ODkyVSwJLy8gPHUsNyw1LHU+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw1LHUsNywwPgorICAyNzEyMjExNzQ1VSwJLy8gPHUsNyw2LDA+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDAsMSwyPgorICAyNzEyMjExODc5VSwJLy8gPHUsNyw2LDE+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDEsNywxPgorICAxNjM4NDcwMTM4VSwJLy8gPHUsNyw2LDI+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LDIsNywzPgorICAyNzEyMjEyMDE4VSwJLy8gPHUsNyw2LDM+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDMsNCw1PgorICAyNzEyMjEyMTA5VSwJLy8gPHUsNyw2LDQ+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDQsNSw2PgorICAyNzEyMjEyMjAzVSwJLy8gPHUsNyw2LDU+OiBDb3N0IDMgdnNsZG9pOCBSSFMsIDw2LDUsNywxPgorICAxNjM4NDcwNDU2VSwJLy8gPHUsNyw2LDY+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LDYsNiw2PgorICAxNjM4NDcwNDc4VSwJLy8gPHUsNyw2LDc+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LDcsMCwxPgorICAxNjM4NDcwNTU5VSwJLy8gPHUsNyw2LHU+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDw2LHUsMCwxPgorICAxMjM1ODE2NTQ2VSwJLy8gPHUsNyw3LDA+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDUsNiw3LDA+CisgIDIzMDk1NTgzNzFVLAkvLyA8dSw3LDcsMT46IENvc3QgMyB2bXJnbHcgUkhTLCA8NSw2LDcsMT4KKyAgMjY0MTA0NTQzNFUsCS8vIDx1LDcsNywyPjogQ29zdCAzIHZzbGRvaTQgPDMsdSw3LDc+LCA8Miw2LDMsNz4KKyAgMTIzNTgxNjk1NFUsCS8vIDx1LDcsNywzPjogQ29zdCAyIHZtcmdsdyBSSFMsIDw2LDIsNywzPgorICAxMjM1ODE2NTUwVSwJLy8gPHUsNyw3LDQ+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDUsNiw3LDQ+CisgIDIzMDk1NTgzNzVVLAkvLyA8dSw3LDcsNT46IENvc3QgMyB2bXJnbHcgUkhTLCA8NSw2LDcsNT4KKyAgMTU4NTIyMjYyOFUsCS8vIDx1LDcsNyw2PjogQ29zdCAyIHZzbGRvaTQgPDYsdSw3LDc+LCA8Nix1LDcsNz4KKyAgNDMwMzYxOTEwVSwJLy8gPHUsNyw3LDc+OiBDb3N0IDEgdnNwbHRpc3czIFJIUworICA0MzAzNjE5MTBVLAkvLyA8dSw3LDcsdT46IENvc3QgMSB2c3BsdGlzdzMgUkhTCisgIDE2Mzg0NzEzNzlVLAkvLyA8dSw3LHUsMD46IENvc3QgMiB2c2xkb2k4IFJIUywgPHUsMCwxLDI+CisgIDU2NDcyOTY0NlUsCS8vIDx1LDcsdSwxPjogQ29zdCAxIHZzbGRvaTggUkhTLCBMSFMKKyAgMTYzODQ3MTU1N1UsCS8vIDx1LDcsdSwyPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8dSwyLDMsMD4KKyAgMTYzODQ3MTYxMlUsCS8vIDx1LDcsdSwzPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8dSwzLDAsMT4KKyAgMTYzODQ3MTc0M1UsCS8vIDx1LDcsdSw0PjogQ29zdCAyIHZzbGRvaTggUkhTLCA8dSw0LDUsNj4KKyAgNTY0NzMwMDEwVSwJLy8gPHUsNyx1LDU+OiBDb3N0IDEgdnNsZG9pOCBSSFMsIFJIUworICAxNjM4NDcxODg4VSwJLy8gPHUsNyx1LDY+OiBDb3N0IDIgdnNsZG9pOCBSSFMsIDx1LDYsMyw3PgorICA0MzAzNjE5MTBVLAkvLyA8dSw3LHUsNz46IENvc3QgMSB2c3BsdGlzdzMgUkhTCisgIDU2NDczMDIxM1UsCS8vIDx1LDcsdSx1PjogQ29zdCAxIHZzbGRvaTggUkhTLCBMSFMKKyAgMjAyMTYyMjc4VSwJLy8gPHUsdSwwLDA+OiBDb3N0IDEgdnNwbHRpc3cwIExIUworICA1MzgxODk5ODVVLAkvLyA8dSx1LDAsMT46IENvc3QgMSB2c2xkb2k4IExIUywgTEhTCisgIDI2ODU2NzM2NDVVLAkvLyA8dSx1LDAsMj46IENvc3QgMyB2c2xkb2k4IExIUywgPDAsMiwxLDI+CisgIDEyMTU4NDg2MDRVLAkvLyA8dSx1LDAsMz46IENvc3QgMiB2bXJnbHcgPDEsMix1LDA+LCBMSFMKKyAgMTYxMTkzMTk4NlUsCS8vIDx1LHUsMCw0PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8MCw0LDEsNT4KKyAgMTU3OTI2NjMxN1UsCS8vIDx1LHUsMCw1PjogQ29zdCAyIHZzbGRvaTQgPDUsdSx1LDA+LCA8NSx1LHUsMD4KKyAgMjI4OTU5Mjg2MVUsCS8vIDx1LHUsMCw2PjogQ29zdCAzIHZtcmdsdyA8MSwyLHUsMD4sIDwzLDQsdSw2PgorICAxMjE1ODUxODQ4VSwJLy8gPHUsdSwwLDc+OiBDb3N0IDIgdm1yZ2x3IDwxLDIsdSwwPiwgUkhTCisgIDUzODE5MDQ5M1UsCS8vIDx1LHUsMCx1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBMSFMKKyAgMTU0OTQxMTAyNVUsCS8vIDx1LHUsMSwwPjogQ29zdCAyIHZzbGRvaTQgPDAsdSx1LDE+LCA8MCx1LHUsMT4KKyAgMTE1NzI2MTI2VSwJLy8gPHUsdSwxLDE+OiBDb3N0IDEgdm1yZ2h3IExIUywgTEhTCisgIDYwNDg2MjI1NFUsCS8vIDx1LHUsMSwyPjogQ29zdCAxIHZzbGRvaTEyIExIUywgTEhTCisgIDEyMTM4NjYxNDBVLAkvLyA8dSx1LDEsMz46IENvc3QgMiB2bXJnbHcgPDAsdSx1LDE+LCBMSFMKKyAgMTU0OTQxMzY4NlUsCS8vIDx1LHUsMSw0PjogQ29zdCAyIHZzbGRvaTQgPDAsdSx1LDE+LCBSSFMKKyAgMTE1NzI2NDkwVSwJLy8gPHUsdSwxLDU+OiBDb3N0IDEgdm1yZ2h3IExIUywgUkhTCisgIDE1ODUyNDcyMDdVLAkvLyA8dSx1LDEsNj46IENvc3QgMiB2c2xkb2k0IDw2LHUsdSwxPiwgPDYsdSx1LDE+CisgIDEyMTM4NjkzODRVLAkvLyA8dSx1LDEsNz46IENvc3QgMiB2bXJnbHcgPDAsdSx1LDE+LCBSSFMKKyAgNjA0ODYyMzA4VSwJLy8gPHUsdSwxLHU+OiBDb3N0IDEgdnNsZG9pMTIgTEhTLCBMSFMKKyAgMTU2NzMzNDUwMlUsCS8vIDx1LHUsMiwwPjogQ29zdCAyIHZzbGRvaTQgPDMsdSx1LDI+LCBMSFMKKyAgMTE5MDE4MDY1NFUsCS8vIDx1LHUsMiwxPjogQ29zdCAyIHZtcmdodyA8dSwyLDMsMD4sIExIUworICAzMzYzODAwMDZVLAkvLyA8dSx1LDIsMj46IENvc3QgMSB2c3BsdGlzdzIgTEhTCisgIDgzNTU4NFUsCS8vIDx1LHUsMiwzPjogQ29zdCAwIGNvcHkgTEhTCisgIDE1NjczMzc3ODJVLAkvLyA8dSx1LDIsND46IENvc3QgMiB2c2xkb2k0IDwzLHUsdSwyPiwgUkhTCisgIDExOTAxODEwMThVLAkvLyA8dSx1LDIsNT46IENvc3QgMiB2bXJnaHcgPHUsMiwzLDA+LCBSSFMKKyAgMTYxMTkzMzYyNlUsCS8vIDx1LHUsMiw2PjogQ29zdCAyIHZzbGRvaTggTEhTLCA8Miw2LDMsNz4KKyAgMTIyNjQ4NTA2NFUsCS8vIDx1LHUsMiw3PjogQ29zdCAyIHZtcmdsdyA8MywwLHUsMj4sIFJIUworICA4MzU1ODRVLAkvLyA8dSx1LDIsdT46IENvc3QgMCBjb3B5IExIUworICA0NzU2ODU1ODdVLAkvLyA8dSx1LDMsMD46IENvc3QgMSB2c2xkb2k0IExIUywgTEhTCisgIDEyMDkyMzkyNzhVLAkvLyA8dSx1LDMsMT46IENvc3QgMiB2bXJnbHcgTEhTLCA8MiwzLHUsMT4KKyAgMTIwOTIzOTc2NVUsCS8vIDx1LHUsMywyPjogQ29zdCAyIHZtcmdsdyBMSFMsIDwzLDAsdSwyPgorICAxMzU0OTU4MzZVLAkvLyA8dSx1LDMsMz46IENvc3QgMSB2bXJnbHcgTEhTLCBMSFMKKyAgNDc1Njg4MjQ2VSwJLy8gPHUsdSwzLDQ+OiBDb3N0IDEgdnNsZG9pNCBMSFMsIFJIUworICAxMjA5MjM5MjgyVSwJLy8gPHUsdSwzLDU+OiBDb3N0IDIgdm1yZ2x3IExIUywgPDIsMyx1LDU+CisgIDEyMDkyNDAwOTNVLAkvLyA8dSx1LDMsNj46IENvc3QgMiB2bXJnbHcgTEhTLCA8Myw0LHUsNj4KKyAgMTM1NDk5MDgwVSwJLy8gPHUsdSwzLDc+OiBDb3N0IDEgdm1yZ2x3IExIUywgUkhTCisgIDEzNTQ5NTg0MVUsCS8vIDx1LHUsMyx1PjogQ29zdCAxIHZtcmdsdyBMSFMsIExIUworICAxNTU1NDA2OTUwVSwJLy8gPHUsdSw0LDA+OiBDb3N0IDIgdnNsZG9pNCA8MSx1LHUsND4sIExIUworICAxNTU1NDA4MzAxVSwJLy8gPHUsdSw0LDE+OiBDb3N0IDIgdnNsZG9pNCA8MSx1LHUsND4sIDwxLHUsdSw0PgorICAyMjg5NjI1MzAxVSwJLy8gPHUsdSw0LDI+OiBDb3N0IDMgdm1yZ2x3IDwxLDIsdSw0PiwgPDMsMCx1LDI+CisgIDEyMTU4ODEzNzJVLAkvLyA8dSx1LDQsMz46IENvc3QgMiB2bXJnbHcgPDEsMix1LDQ+LCBMSFMKKyAgMjI5MDM1MzE4VSwJLy8gPHUsdSw0LDQ+OiBDb3N0IDEgdnNwbHRpc3cwIFJIUworICA1MzgxOTMyMDZVLAkvLyA8dSx1LDQsNT46IENvc3QgMSB2c2xkb2k4IExIUywgUkhTCisgIDIyODk2MjU2MjlVLAkvLyA8dSx1LDQsNj46IENvc3QgMyB2bXJnbHcgPDEsMix1LDQ+LCA8Myw0LHUsNj4KKyAgMTIxNTg4NDYxNlUsCS8vIDx1LHUsNCw3PjogQ29zdCAyIHZtcmdsdyA8MSwyLHUsND4sIFJIUworICA1MzgxOTM0NDlVLAkvLyA8dSx1LDQsdT46IENvc3QgMSB2c2xkb2k4IExIUywgUkhTCisgIDE1NDk0NDM3OTdVLAkvLyA8dSx1LDUsMD46IENvc3QgMiB2c2xkb2k0IDwwLHUsdSw1PiwgPDAsdSx1LDU+CisgIDExODcwODAxNFUsCS8vIDx1LHUsNSwxPjogQ29zdCAxIHZtcmdodyBSSFMsIExIUworICAxNTYxMzg5MTkxVSwJLy8gPHUsdSw1LDI+OiBDb3N0IDIgdnNsZG9pNCA8Mix1LHUsNT4sIDwyLHUsdSw1PgorICAxMjEzODk4OTA4VSwJLy8gPHUsdSw1LDM+OiBDb3N0IDIgdm1yZ2x3IDwwLHUsdSw1PiwgTEhTCisgIDE1NDk0NDY0NTRVLAkvLyA8dSx1LDUsND46IENvc3QgMiB2c2xkb2k0IDwwLHUsdSw1PiwgUkhTCisgIDExODcwODM3OFUsCS8vIDx1LHUsNSw1PjogQ29zdCAxIHZtcmdodyBSSFMsIFJIUworICA2MDQ4NjI2MThVLAkvLyA8dSx1LDUsNj46IENvc3QgMSB2c2xkb2kxMiBMSFMsIFJIUworICAxMjEzOTAyMTUyVSwJLy8gPHUsdSw1LDc+OiBDb3N0IDIgdm1yZ2x3IDwwLHUsdSw1PiwgUkhTCisgIDYwNDg2MjYzNlUsCS8vIDx1LHUsNSx1PjogQ29zdCAxIHZzbGRvaTEyIExIUywgUkhTCisgIDE1NjczNjcyNzBVLAkvLyA8dSx1LDYsMD46IENvc3QgMiB2c2xkb2k0IDwzLHUsdSw2PiwgTEhTCisgIDExOTI4OTIyMDZVLAkvLyA8dSx1LDYsMT46IENvc3QgMiB2bXJnaHcgPHUsNiwzLDc+LCBMSFMKKyAgMTYzODQ3ODMzMFUsCS8vIDx1LHUsNiwyPjogQ29zdCAyIHZzbGRvaTggUkhTLCA8NiwyLDcsMz4KKyAgMTY3OTA0Njg2NFUsCS8vIDx1LHUsNiwzPjogQ29zdCAyIHZzbGRvaTEyIExIUywgPHUsNiwzLDc+CisgIDE1NjczNzA1NTBVLAkvLyA8dSx1LDYsND46IENvc3QgMiB2c2xkb2k0IDwzLHUsdSw2PiwgUkhTCisgIDExOTI4OTI1NzBVLAkvLyA8dSx1LDYsNT46IENvc3QgMiB2bXJnaHcgPHUsNiwzLDc+LCBSSFMKKyAgMzYzMjUzMDQ2VSwJLy8gPHUsdSw2LDY+OiBDb3N0IDEgdnNwbHRpc3cyIFJIUworICAyNzcwNTM0NFUsCS8vIDx1LHUsNiw3PjogQ29zdCAwIGNvcHkgUkhTCisgIDI3NzA1MzQ0VSwJLy8gPHUsdSw2LHU+OiBDb3N0IDAgY29weSBSSFMKKyAgNDk5NjA1NjA2VSwJLy8gPHUsdSw3LDA+OiBDb3N0IDEgdnNsZG9pNCBSSFMsIExIUworICAxMjM1ODEyNDI1VSwJLy8gPHUsdSw3LDE+OiBDb3N0IDIgdm1yZ2x3IFJIUywgPDAsMCx1LDE+CisgIDE1NjE0MDU1NzdVLAkvLyA8dSx1LDcsMj46IENvc3QgMiB2c2xkb2k0IDwyLHUsdSw3PiwgPDIsdSx1LDc+CisgIDE2MjA3MDY4NFUsCS8vIDx1LHUsNywzPjogQ29zdCAxIHZtcmdsdyBSSFMsIExIUworICA0OTk2MDkxNDdVLAkvLyA8dSx1LDcsND46IENvc3QgMSB2c2xkb2k0IFJIUywgUkhTCisgIDEyMzU4MTI3NTNVLAkvLyA8dSx1LDcsNT46IENvc3QgMiB2bXJnbHcgUkhTLCA8MCw0LHUsNT4KKyAgMTIzNTgxNDk0MVUsCS8vIDx1LHUsNyw2PjogQ29zdCAyIHZtcmdsdyBSSFMsIDwzLDQsdSw2PgorICAxNjIwNzM5MjhVLAkvLyA8dSx1LDcsNz46IENvc3QgMSB2bXJnbHcgUkhTLCBSSFMKKyAgMTYyMDcwNjg5VSwJLy8gPHUsdSw3LHU+OiBDb3N0IDEgdm1yZ2x3IFJIUywgTEhTCisgIDQ3NTcyNjU1MlUsCS8vIDx1LHUsdSwwPjogQ29zdCAxIHZzbGRvaTQgTEhTLCBMSFMKKyAgNTM4MTk1NzU4VSwJLy8gPHUsdSx1LDE+OiBDb3N0IDEgdnNsZG9pOCBMSFMsIExIUworICA2MDQ4NjI4MjFVLAkvLyA8dSx1LHUsMj46IENvc3QgMSB2c2xkb2kxMiBMSFMsIExIUworICA4MzU1ODRVLAkvLyA8dSx1LHUsMz46IENvc3QgMCBjb3B5IExIUworICA0NzU3MjkyMDZVLAkvLyA8dSx1LHUsND46IENvc3QgMSB2c2xkb2k0IExIUywgUkhTCisgIDUzODE5NjEyMlUsCS8vIDx1LHUsdSw1PjogQ29zdCAxIHZzbGRvaTggTEhTLCBSSFMKKyAgNjA0ODYyODYxVSwJLy8gPHUsdSx1LDY+OiBDb3N0IDEgdnNsZG9pMTIgTEhTLCBSSFMKKyAgMjc3MDUzNDRVLAkvLyA8dSx1LHUsNz46IENvc3QgMCBjb3B5IFJIUworICA4MzU1ODRVLAkvLyA8dSx1LHUsdT46IENvc3QgMCBjb3B5IExIUworICAwCit9OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1ByZWRpY2F0ZXMuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1ByZWRpY2F0ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYmIwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDUHJlZGljYXRlcy5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tLSBQUENQcmVkaWNhdGVzLmNwcCAtIFBQQyBCcmFuY2ggUHJlZGljYXRlIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgUG93ZXJQQyBicmFuY2ggcHJlZGljYXRlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiUFBDUHJlZGljYXRlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitQUEM6OlByZWRpY2F0ZSBQUEM6OkludmVydFByZWRpY2F0ZShQUEM6OlByZWRpY2F0ZSBPcGNvZGUpIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBQUEMgYnJhbmNoIG9wY29kZSEiKTsKKyAgY2FzZSBQUEM6OlBSRURfRVE6IHJldHVybiBQUEM6OlBSRURfTkU7CisgIGNhc2UgUFBDOjpQUkVEX05FOiByZXR1cm4gUFBDOjpQUkVEX0VROworICBjYXNlIFBQQzo6UFJFRF9MVDogcmV0dXJuIFBQQzo6UFJFRF9HRTsKKyAgY2FzZSBQUEM6OlBSRURfR0U6IHJldHVybiBQUEM6OlBSRURfTFQ7CisgIGNhc2UgUFBDOjpQUkVEX0dUOiByZXR1cm4gUFBDOjpQUkVEX0xFOworICBjYXNlIFBQQzo6UFJFRF9MRTogcmV0dXJuIFBQQzo6UFJFRF9HVDsKKyAgY2FzZSBQUEM6OlBSRURfTlU6IHJldHVybiBQUEM6OlBSRURfVU47CisgIGNhc2UgUFBDOjpQUkVEX1VOOiByZXR1cm4gUFBDOjpQUkVEX05VOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDUHJlZGljYXRlcy5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1ByZWRpY2F0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmM4MzE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1ByZWRpY2F0ZXMuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0tIFBQQ1ByZWRpY2F0ZXMuaCAtIFBQQyBCcmFuY2ggUHJlZGljYXRlIEluZm9ybWF0aW9uIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIFBvd2VyUEMgYnJhbmNoIHByZWRpY2F0ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9QT1dFUlBDX1BQQ1BSRURJQ0FURVNfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9QT1dFUlBDX1BQQ1BSRURJQ0FURVNfSAorCisjaW5jbHVkZSAiUFBDLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBQUEMgeworICAvLy8gUHJlZGljYXRlIC0gVGhlc2UgYXJlICIoQkkgPDwgNSkgfCBCTyIgIGZvciB2YXJpb3VzIHByZWRpY2F0ZXMuCisgIGVudW0gUHJlZGljYXRlIHsKKyAgICBQUkVEX0FMV0FZUyA9ICgwIDw8IDUpIHwgMjAsCisgICAgUFJFRF9MVCAgICAgPSAoMCA8PCA1KSB8IDEyLAorICAgIFBSRURfTEUgICAgID0gKDEgPDwgNSkgfCAgNCwKKyAgICBQUkVEX0VRICAgICA9ICgyIDw8IDUpIHwgMTIsCisgICAgUFJFRF9HRSAgICAgPSAoMCA8PCA1KSB8ICA0LAorICAgIFBSRURfR1QgICAgID0gKDEgPDwgNSkgfCAxMiwKKyAgICBQUkVEX05FICAgICA9ICgyIDw8IDUpIHwgIDQsCisgICAgUFJFRF9VTiAgICAgPSAoMyA8PCA1KSB8IDEyLAorICAgIFBSRURfTlUgICAgID0gKDMgPDwgNSkgfCAgNAorICB9OworICAKKyAgLy8vIEludmVydCB0aGUgc3BlY2lmaWVkIHByZWRpY2F0ZS4gICE9IC0+ID09LCA8IC0+ID49LgorICBQcmVkaWNhdGUgSW52ZXJ0UHJlZGljYXRlKFByZWRpY2F0ZSBPcGNvZGUpOworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENSZWdpc3RlckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1JlZ2lzdGVySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzYzlmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENSZWdpc3RlckluZm8uY3BwCkBAIC0wLDAgKzEsMTYyNyBAQAorLy89PT0tIFBQQ1JlZ2lzdGVySW5mby5jcHAgLSBQb3dlclBDIFJlZ2lzdGVyIEluZm9ybWF0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFBvd2VyUEMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbworLy8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJyZWdpbmZvIgorI2luY2x1ZGUgIlBQQy5oIgorI2luY2x1ZGUgIlBQQ0luc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgIlBQQ01hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJQUENSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJQUENGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJQUENTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorCisvLyBGSVhNRSBUaGlzIGRpc2FibGVzIHNvbWUgY29kZSB0aGF0IGFsaWducyB0aGUgc3RhY2sgdG8gYSBib3VuZGFyeQorLy8gYmlnZ2VyIHRoYW4gdGhlIGRlZmF1bHQgKDE2IGJ5dGVzIG9uIERhcndpbikgd2hlbiB0aGVyZSBpcyBhIHN0YWNrIGxvY2FsCisvLyBvZiBncmVhdGVyIGFsaWdubWVudC4gIFRoaXMgZG9lcyBub3QgY3VycmVudGx5IHdvcmssIGJlY2F1c2UgdGhlIGRlbHRhCisvLyBiZXR3ZWVuIG9sZCBhbmQgbmV3IHN0YWNrIHBvaW50ZXJzIGlzIGFkZGVkIHRvIG9mZnNldHMgdGhhdCByZWZlcmVuY2UKKy8vIGluY29taW5nIHBhcmFtZXRlcnMgYWZ0ZXIgdGhlIHByb2xvZyBpcyBnZW5lcmF0ZWQsIGFuZCB0aGUgY29kZSB0aGF0IAorLy8gZG9lcyB0aGF0IGRvZXNuJ3QgaGFuZGxlIGEgdmFyaWFibGUgZGVsdGEuICBZb3UgZG9uJ3Qgd2FudCB0byBkbyB0aGF0CisvLyBhbnl3YXk7IGEgYmV0dGVyIGFwcHJvYWNoIGlzIHRvIHJlc2VydmUgYW5vdGhlciByZWdpc3RlciB0aGF0IHJldGFpbnMKKy8vIHRvIHRoZSBpbmNvbWluZyBzdGFjayBwb2ludGVyLCBhbmQgcmVmZXJlbmNlIHBhcmFtZXRlcnMgcmVsYXRpdmUgdG8gdGhhdC4KKyNkZWZpbmUgQUxJR05fU1RBQ0sgMAorCisvLyBGSVhNRSAoNjQtYml0KTogRXZlbnR1YWxseSBlbmFibGUgYnkgZGVmYXVsdC4KK25hbWVzcGFjZSBsbHZtIHsKK2NsOjpvcHQ8Ym9vbD4gRW5hYmxlUFBDMzJSUygiZW5hYmxlLXBwYzMyLXJlZ3NjYXZlbmdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkVuYWJsZSBQUEMzMiByZWdpc3RlciBzY2F2ZW5nZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OkhpZGRlbik7CitjbDo6b3B0PGJvb2w+IEVuYWJsZVBQQzY0UlMoImVuYWJsZS1wcGM2NC1yZWdzY2F2ZW5nZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJFbmFibGUgUFBDNjQgcmVnaXN0ZXIgc2NhdmVuZ2VyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpIaWRkZW4pOworfQorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworI2RlZmluZSBFbmFibGVSZWdpc3RlclNjYXZlbmdpbmcgXAorICAoKEVuYWJsZVBQQzMyUlMgJiYgIVN1YnRhcmdldC5pc1BQQzY0KCkpIHx8IFwKKyAgIChFbmFibGVQUEM2NFJTICYmIFN1YnRhcmdldC5pc1BQQzY0KCkpKQorCisvLyBGSVhNRSAoNjQtYml0KTogU2hvdWxkIGJlIGlubGluZWQuCitib29sCitQUENSZWdpc3RlckluZm86OnJlcXVpcmVzUmVnaXN0ZXJTY2F2ZW5naW5nKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmKSBjb25zdCB7CisgIHJldHVybiBFbmFibGVSZWdpc3RlclNjYXZlbmdpbmc7Cit9CisKKy8vLyBnZXRSZWdpc3Rlck51bWJlcmluZyAtIEdpdmVuIHRoZSBlbnVtIHZhbHVlIGZvciBzb21lIHJlZ2lzdGVyLCBlLmcuCisvLy8gUFBDOjpGMTQsIHJldHVybiB0aGUgbnVtYmVyIHRoYXQgaXQgY29ycmVzcG9uZHMgdG8gKGUuZy4gMTQpLgordW5zaWduZWQgUFBDUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyh1bnNpZ25lZCBSZWdFbnVtKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBQUEM7CisgIHN3aXRjaCAoUmVnRW51bSkgeworICBjYXNlIDA6IHJldHVybiAwOworICBjYXNlIFIwIDogIGNhc2UgWDAgOiAgY2FzZSBGMCA6ICBjYXNlIFYwIDogY2FzZSBDUjA6ICBjYXNlIENSMExUOiByZXR1cm4gIDA7CisgIGNhc2UgUjEgOiAgY2FzZSBYMSA6ICBjYXNlIEYxIDogIGNhc2UgVjEgOiBjYXNlIENSMTogIGNhc2UgQ1IwR1Q6IHJldHVybiAgMTsKKyAgY2FzZSBSMiA6ICBjYXNlIFgyIDogIGNhc2UgRjIgOiAgY2FzZSBWMiA6IGNhc2UgQ1IyOiAgY2FzZSBDUjBFUTogcmV0dXJuICAyOworICBjYXNlIFIzIDogIGNhc2UgWDMgOiAgY2FzZSBGMyA6ICBjYXNlIFYzIDogY2FzZSBDUjM6ICBjYXNlIENSMFVOOiByZXR1cm4gIDM7CisgIGNhc2UgUjQgOiAgY2FzZSBYNCA6ICBjYXNlIEY0IDogIGNhc2UgVjQgOiBjYXNlIENSNDogIGNhc2UgQ1IxTFQ6IHJldHVybiAgNDsKKyAgY2FzZSBSNSA6ICBjYXNlIFg1IDogIGNhc2UgRjUgOiAgY2FzZSBWNSA6IGNhc2UgQ1I1OiAgY2FzZSBDUjFHVDogcmV0dXJuICA1OworICBjYXNlIFI2IDogIGNhc2UgWDYgOiAgY2FzZSBGNiA6ICBjYXNlIFY2IDogY2FzZSBDUjY6ICBjYXNlIENSMUVROiByZXR1cm4gIDY7CisgIGNhc2UgUjcgOiAgY2FzZSBYNyA6ICBjYXNlIEY3IDogIGNhc2UgVjcgOiBjYXNlIENSNzogIGNhc2UgQ1IxVU46IHJldHVybiAgNzsKKyAgY2FzZSBSOCA6ICBjYXNlIFg4IDogIGNhc2UgRjggOiAgY2FzZSBWOCA6IGNhc2UgQ1IyTFQ6IHJldHVybiAgODsKKyAgY2FzZSBSOSA6ICBjYXNlIFg5IDogIGNhc2UgRjkgOiAgY2FzZSBWOSA6IGNhc2UgQ1IyR1Q6IHJldHVybiAgOTsKKyAgY2FzZSBSMTA6ICBjYXNlIFgxMDogIGNhc2UgRjEwOiAgY2FzZSBWMTA6IGNhc2UgQ1IyRVE6IHJldHVybiAxMDsKKyAgY2FzZSBSMTE6ICBjYXNlIFgxMTogIGNhc2UgRjExOiAgY2FzZSBWMTE6IGNhc2UgQ1IyVU46IHJldHVybiAxMTsKKyAgY2FzZSBSMTI6ICBjYXNlIFgxMjogIGNhc2UgRjEyOiAgY2FzZSBWMTI6IGNhc2UgQ1IzTFQ6IHJldHVybiAxMjsKKyAgY2FzZSBSMTM6ICBjYXNlIFgxMzogIGNhc2UgRjEzOiAgY2FzZSBWMTM6IGNhc2UgQ1IzR1Q6IHJldHVybiAxMzsKKyAgY2FzZSBSMTQ6ICBjYXNlIFgxNDogIGNhc2UgRjE0OiAgY2FzZSBWMTQ6IGNhc2UgQ1IzRVE6IHJldHVybiAxNDsKKyAgY2FzZSBSMTU6ICBjYXNlIFgxNTogIGNhc2UgRjE1OiAgY2FzZSBWMTU6IGNhc2UgQ1IzVU46IHJldHVybiAxNTsKKyAgY2FzZSBSMTY6ICBjYXNlIFgxNjogIGNhc2UgRjE2OiAgY2FzZSBWMTY6IGNhc2UgQ1I0TFQ6IHJldHVybiAxNjsKKyAgY2FzZSBSMTc6ICBjYXNlIFgxNzogIGNhc2UgRjE3OiAgY2FzZSBWMTc6IGNhc2UgQ1I0R1Q6IHJldHVybiAxNzsKKyAgY2FzZSBSMTg6ICBjYXNlIFgxODogIGNhc2UgRjE4OiAgY2FzZSBWMTg6IGNhc2UgQ1I0RVE6IHJldHVybiAxODsKKyAgY2FzZSBSMTk6ICBjYXNlIFgxOTogIGNhc2UgRjE5OiAgY2FzZSBWMTk6IGNhc2UgQ1I0VU46IHJldHVybiAxOTsKKyAgY2FzZSBSMjA6ICBjYXNlIFgyMDogIGNhc2UgRjIwOiAgY2FzZSBWMjA6IGNhc2UgQ1I1TFQ6IHJldHVybiAyMDsKKyAgY2FzZSBSMjE6ICBjYXNlIFgyMTogIGNhc2UgRjIxOiAgY2FzZSBWMjE6IGNhc2UgQ1I1R1Q6IHJldHVybiAyMTsKKyAgY2FzZSBSMjI6ICBjYXNlIFgyMjogIGNhc2UgRjIyOiAgY2FzZSBWMjI6IGNhc2UgQ1I1RVE6IHJldHVybiAyMjsKKyAgY2FzZSBSMjM6ICBjYXNlIFgyMzogIGNhc2UgRjIzOiAgY2FzZSBWMjM6IGNhc2UgQ1I1VU46IHJldHVybiAyMzsKKyAgY2FzZSBSMjQ6ICBjYXNlIFgyNDogIGNhc2UgRjI0OiAgY2FzZSBWMjQ6IGNhc2UgQ1I2TFQ6IHJldHVybiAyNDsKKyAgY2FzZSBSMjU6ICBjYXNlIFgyNTogIGNhc2UgRjI1OiAgY2FzZSBWMjU6IGNhc2UgQ1I2R1Q6IHJldHVybiAyNTsKKyAgY2FzZSBSMjY6ICBjYXNlIFgyNjogIGNhc2UgRjI2OiAgY2FzZSBWMjY6IGNhc2UgQ1I2RVE6IHJldHVybiAyNjsKKyAgY2FzZSBSMjc6ICBjYXNlIFgyNzogIGNhc2UgRjI3OiAgY2FzZSBWMjc6IGNhc2UgQ1I2VU46IHJldHVybiAyNzsKKyAgY2FzZSBSMjg6ICBjYXNlIFgyODogIGNhc2UgRjI4OiAgY2FzZSBWMjg6IGNhc2UgQ1I3TFQ6IHJldHVybiAyODsKKyAgY2FzZSBSMjk6ICBjYXNlIFgyOTogIGNhc2UgRjI5OiAgY2FzZSBWMjk6IGNhc2UgQ1I3R1Q6IHJldHVybiAyOTsKKyAgY2FzZSBSMzA6ICBjYXNlIFgzMDogIGNhc2UgRjMwOiAgY2FzZSBWMzA6IGNhc2UgQ1I3RVE6IHJldHVybiAzMDsKKyAgY2FzZSBSMzE6ICBjYXNlIFgzMTogIGNhc2UgRjMxOiAgY2FzZSBWMzE6IGNhc2UgQ1I3VU46IHJldHVybiAzMTsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgcmVnIGluIFBQQ1JlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmchIik7CisgIH0KK30KKworUFBDUmVnaXN0ZXJJbmZvOjpQUENSZWdpc3RlckluZm8oY29uc3QgUFBDU3VidGFyZ2V0ICZTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpKQorICA6IFBQQ0dlblJlZ2lzdGVySW5mbyhQUEM6OkFESkNBTExTVEFDS0RPV04sIFBQQzo6QURKQ0FMTFNUQUNLVVApLAorICAgIFN1YnRhcmdldChTVCksIFRJSSh0aWkpIHsKKyAgSW1tVG9JZHhNYXBbUFBDOjpMRF0gICA9IFBQQzo6TERYOyAgICBJbW1Ub0lkeE1hcFtQUEM6OlNURF0gID0gUFBDOjpTVERYOworICBJbW1Ub0lkeE1hcFtQUEM6OkxCWl0gID0gUFBDOjpMQlpYOyAgIEltbVRvSWR4TWFwW1BQQzo6U1RCXSAgPSBQUEM6OlNUQlg7CisgIEltbVRvSWR4TWFwW1BQQzo6TEhaXSAgPSBQUEM6OkxIWlg7ICAgSW1tVG9JZHhNYXBbUFBDOjpMSEFdICA9IFBQQzo6TEhBWDsKKyAgSW1tVG9JZHhNYXBbUFBDOjpMV1pdICA9IFBQQzo6TFdaWDsgICBJbW1Ub0lkeE1hcFtQUEM6OkxXQV0gID0gUFBDOjpMV0FYOworICBJbW1Ub0lkeE1hcFtQUEM6OkxGU10gID0gUFBDOjpMRlNYOyAgIEltbVRvSWR4TWFwW1BQQzo6TEZEXSAgPSBQUEM6OkxGRFg7CisgIEltbVRvSWR4TWFwW1BQQzo6U1RIXSAgPSBQUEM6OlNUSFg7ICAgSW1tVG9JZHhNYXBbUFBDOjpTVFddICA9IFBQQzo6U1RXWDsKKyAgSW1tVG9JZHhNYXBbUFBDOjpTVEZTXSA9IFBQQzo6U1RGU1g7ICBJbW1Ub0lkeE1hcFtQUEM6OlNURkRdID0gUFBDOjpTVEZEWDsKKyAgSW1tVG9JZHhNYXBbUFBDOjpBRERJXSA9IFBQQzo6QURENDsKKworICAvLyA2NC1iaXQKKyAgSW1tVG9JZHhNYXBbUFBDOjpMSEE4XSA9IFBQQzo6TEhBWDg7IEltbVRvSWR4TWFwW1BQQzo6TEJaOF0gPSBQUEM6OkxCWlg4OworICBJbW1Ub0lkeE1hcFtQUEM6OkxIWjhdID0gUFBDOjpMSFpYODsgSW1tVG9JZHhNYXBbUFBDOjpMV1o4XSA9IFBQQzo6TFdaWDg7CisgIEltbVRvSWR4TWFwW1BQQzo6U1RCOF0gPSBQUEM6OlNUQlg4OyBJbW1Ub0lkeE1hcFtQUEM6OlNUSDhdID0gUFBDOjpTVEhYODsKKyAgSW1tVG9JZHhNYXBbUFBDOjpTVFc4XSA9IFBQQzo6U1RXWDg7IEltbVRvSWR4TWFwW1BQQzo6U1REVV0gPSBQUEM6OlNURFVYOworICBJbW1Ub0lkeE1hcFtQUEM6OkFEREk4XSA9IFBQQzo6QUREODsgSW1tVG9JZHhNYXBbUFBDOjpTVERfMzJdID0gUFBDOjpTVERYXzMyOworfQorCisvLy8gZ2V0UG9pbnRlclJlZ0NsYXNzIC0gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyB0byB1c2UgdG8gaG9sZCBwb2ludGVycy4KKy8vLyBUaGlzIGlzIHVzZWQgZm9yIGFkZHJlc3NpbmcgbW9kZXMuCitjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKK1BQQ1JlZ2lzdGVySW5mbzo6Z2V0UG9pbnRlclJlZ0NsYXNzKHVuc2lnbmVkIEtpbmQpIGNvbnN0IHsKKyAgaWYgKFN1YnRhcmdldC5pc1BQQzY0KCkpCisgICAgcmV0dXJuICZQUEM6Okc4UkNSZWdDbGFzczsKKyAgcmV0dXJuICZQUEM6OkdQUkNSZWdDbGFzczsKK30KKworY29uc3QgdW5zaWduZWQqCitQUENSZWdpc3RlckluZm86OmdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GKSBjb25zdCB7CisgIC8vIDMyLWJpdCBEYXJ3aW4gY2FsbGluZyBjb252ZW50aW9uLiAKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIERhcndpbjMyX0NhbGxlZVNhdmVkUmVnc1tdID0geworICAgICAgICAgICAgICBQUEM6OlIxMywgUFBDOjpSMTQsIFBQQzo6UjE1LAorICAgIFBQQzo6UjE2LCBQUEM6OlIxNywgUFBDOjpSMTgsIFBQQzo6UjE5LAorICAgIFBQQzo6UjIwLCBQUEM6OlIyMSwgUFBDOjpSMjIsIFBQQzo6UjIzLAorICAgIFBQQzo6UjI0LCBQUEM6OlIyNSwgUFBDOjpSMjYsIFBQQzo6UjI3LAorICAgIFBQQzo6UjI4LCBQUEM6OlIyOSwgUFBDOjpSMzAsIFBQQzo6UjMxLAorCisgICAgUFBDOjpGMTQsIFBQQzo6RjE1LCBQUEM6OkYxNiwgUFBDOjpGMTcsCisgICAgUFBDOjpGMTgsIFBQQzo6RjE5LCBQUEM6OkYyMCwgUFBDOjpGMjEsCisgICAgUFBDOjpGMjIsIFBQQzo6RjIzLCBQUEM6OkYyNCwgUFBDOjpGMjUsCisgICAgUFBDOjpGMjYsIFBQQzo6RjI3LCBQUEM6OkYyOCwgUFBDOjpGMjksCisgICAgUFBDOjpGMzAsIFBQQzo6RjMxLAorICAgIAorICAgIFBQQzo6Q1IyLCBQUEM6OkNSMywgUFBDOjpDUjQsCisgICAgUFBDOjpWMjAsIFBQQzo6VjIxLCBQUEM6OlYyMiwgUFBDOjpWMjMsCisgICAgUFBDOjpWMjQsIFBQQzo6VjI1LCBQUEM6OlYyNiwgUFBDOjpWMjcsCisgICAgUFBDOjpWMjgsIFBQQzo6VjI5LCBQUEM6OlYzMCwgUFBDOjpWMzEsCisgICAgCisgICAgUFBDOjpDUjJMVCwgUFBDOjpDUjJHVCwgUFBDOjpDUjJFUSwgUFBDOjpDUjJVTiwKKyAgICBQUEM6OkNSM0xULCBQUEM6OkNSM0dULCBQUEM6OkNSM0VRLCBQUEM6OkNSM1VOLAorICAgIFBQQzo6Q1I0TFQsIFBQQzo6Q1I0R1QsIFBQQzo6Q1I0RVEsIFBQQzo6Q1I0VU4sCisgICAgCisgICAgUFBDOjpMUiwgIDAKKyAgfTsKKworICAvLyAzMi1iaXQgU1ZSNCBjYWxsaW5nIGNvbnZlbnRpb24uCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTVlI0X0NhbGxlZVNhdmVkUmVnc1tdID0geworICAgICAgICAgICAgICAgICAgICAgICAgUFBDOjpSMTQsIFBQQzo6UjE1LAorICAgIFBQQzo6UjE2LCBQUEM6OlIxNywgUFBDOjpSMTgsIFBQQzo6UjE5LAorICAgIFBQQzo6UjIwLCBQUEM6OlIyMSwgUFBDOjpSMjIsIFBQQzo6UjIzLAorICAgIFBQQzo6UjI0LCBQUEM6OlIyNSwgUFBDOjpSMjYsIFBQQzo6UjI3LAorICAgIFBQQzo6UjI4LCBQUEM6OlIyOSwgUFBDOjpSMzAsIFBQQzo6UjMxLAorCisgICAgUFBDOjpGMTQsIFBQQzo6RjE1LCBQUEM6OkYxNiwgUFBDOjpGMTcsCisgICAgUFBDOjpGMTgsIFBQQzo6RjE5LCBQUEM6OkYyMCwgUFBDOjpGMjEsCisgICAgUFBDOjpGMjIsIFBQQzo6RjIzLCBQUEM6OkYyNCwgUFBDOjpGMjUsCisgICAgUFBDOjpGMjYsIFBQQzo6RjI3LCBQUEM6OkYyOCwgUFBDOjpGMjksCisgICAgUFBDOjpGMzAsIFBQQzo6RjMxLAorICAgIAorICAgIFBQQzo6Q1IyLCBQUEM6OkNSMywgUFBDOjpDUjQsCisgICAgCisgICAgUFBDOjpWUlNBVkUsCisgICAgCisgICAgUFBDOjpWMjAsIFBQQzo6VjIxLCBQUEM6OlYyMiwgUFBDOjpWMjMsCisgICAgUFBDOjpWMjQsIFBQQzo6VjI1LCBQUEM6OlYyNiwgUFBDOjpWMjcsCisgICAgUFBDOjpWMjgsIFBQQzo6VjI5LCBQUEM6OlYzMCwgUFBDOjpWMzEsCisgICAgCisgICAgUFBDOjpDUjJMVCwgUFBDOjpDUjJHVCwgUFBDOjpDUjJFUSwgUFBDOjpDUjJVTiwKKyAgICBQUEM6OkNSM0xULCBQUEM6OkNSM0dULCBQUEM6OkNSM0VRLCBQUEM6OkNSM1VOLAorICAgIFBQQzo6Q1I0TFQsIFBQQzo6Q1I0R1QsIFBQQzo6Q1I0RVEsIFBQQzo6Q1I0VU4sCisgICAgCisgICAgMAorICB9OworICAvLyA2NC1iaXQgRGFyd2luIGNhbGxpbmcgY29udmVudGlvbi4gCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBEYXJ3aW42NF9DYWxsZWVTYXZlZFJlZ3NbXSA9IHsKKyAgICBQUEM6OlgxNCwgUFBDOjpYMTUsCisgICAgUFBDOjpYMTYsIFBQQzo6WDE3LCBQUEM6OlgxOCwgUFBDOjpYMTksCisgICAgUFBDOjpYMjAsIFBQQzo6WDIxLCBQUEM6OlgyMiwgUFBDOjpYMjMsCisgICAgUFBDOjpYMjQsIFBQQzo6WDI1LCBQUEM6OlgyNiwgUFBDOjpYMjcsCisgICAgUFBDOjpYMjgsIFBQQzo6WDI5LCBQUEM6OlgzMCwgUFBDOjpYMzEsCisgICAgCisgICAgUFBDOjpGMTQsIFBQQzo6RjE1LCBQUEM6OkYxNiwgUFBDOjpGMTcsCisgICAgUFBDOjpGMTgsIFBQQzo6RjE5LCBQUEM6OkYyMCwgUFBDOjpGMjEsCisgICAgUFBDOjpGMjIsIFBQQzo6RjIzLCBQUEM6OkYyNCwgUFBDOjpGMjUsCisgICAgUFBDOjpGMjYsIFBQQzo6RjI3LCBQUEM6OkYyOCwgUFBDOjpGMjksCisgICAgUFBDOjpGMzAsIFBQQzo6RjMxLAorICAgIAorICAgIFBQQzo6Q1IyLCBQUEM6OkNSMywgUFBDOjpDUjQsCisgICAgUFBDOjpWMjAsIFBQQzo6VjIxLCBQUEM6OlYyMiwgUFBDOjpWMjMsCisgICAgUFBDOjpWMjQsIFBQQzo6VjI1LCBQUEM6OlYyNiwgUFBDOjpWMjcsCisgICAgUFBDOjpWMjgsIFBQQzo6VjI5LCBQUEM6OlYzMCwgUFBDOjpWMzEsCisgICAgCisgICAgUFBDOjpDUjJMVCwgUFBDOjpDUjJHVCwgUFBDOjpDUjJFUSwgUFBDOjpDUjJVTiwKKyAgICBQUEM6OkNSM0xULCBQUEM6OkNSM0dULCBQUEM6OkNSM0VRLCBQUEM6OkNSM1VOLAorICAgIFBQQzo6Q1I0TFQsIFBQQzo6Q1I0R1QsIFBQQzo6Q1I0RVEsIFBQQzo6Q1I0VU4sCisgICAgCisgICAgUFBDOjpMUjgsICAwCisgIH07CisKKyAgLy8gNjQtYml0IFNWUjQgY2FsbGluZyBjb252ZW50aW9uLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU1ZSNF82NF9DYWxsZWVTYXZlZFJlZ3NbXSA9IHsKKyAgICBQUEM6OlgxNCwgUFBDOjpYMTUsCisgICAgUFBDOjpYMTYsIFBQQzo6WDE3LCBQUEM6OlgxOCwgUFBDOjpYMTksCisgICAgUFBDOjpYMjAsIFBQQzo6WDIxLCBQUEM6OlgyMiwgUFBDOjpYMjMsCisgICAgUFBDOjpYMjQsIFBQQzo6WDI1LCBQUEM6OlgyNiwgUFBDOjpYMjcsCisgICAgUFBDOjpYMjgsIFBQQzo6WDI5LCBQUEM6OlgzMCwgUFBDOjpYMzEsCisKKyAgICBQUEM6OkYxNCwgUFBDOjpGMTUsIFBQQzo6RjE2LCBQUEM6OkYxNywKKyAgICBQUEM6OkYxOCwgUFBDOjpGMTksIFBQQzo6RjIwLCBQUEM6OkYyMSwKKyAgICBQUEM6OkYyMiwgUFBDOjpGMjMsIFBQQzo6RjI0LCBQUEM6OkYyNSwKKyAgICBQUEM6OkYyNiwgUFBDOjpGMjcsIFBQQzo6RjI4LCBQUEM6OkYyOSwKKyAgICBQUEM6OkYzMCwgUFBDOjpGMzEsCisKKyAgICBQUEM6OkNSMiwgUFBDOjpDUjMsIFBQQzo6Q1I0LAorCisgICAgUFBDOjpWUlNBVkUsCisKKyAgICBQUEM6OlYyMCwgUFBDOjpWMjEsIFBQQzo6VjIyLCBQUEM6OlYyMywKKyAgICBQUEM6OlYyNCwgUFBDOjpWMjUsIFBQQzo6VjI2LCBQUEM6OlYyNywKKyAgICBQUEM6OlYyOCwgUFBDOjpWMjksIFBQQzo6VjMwLCBQUEM6OlYzMSwKKworICAgIFBQQzo6Q1IyTFQsIFBQQzo6Q1IyR1QsIFBQQzo6Q1IyRVEsIFBQQzo6Q1IyVU4sCisgICAgUFBDOjpDUjNMVCwgUFBDOjpDUjNHVCwgUFBDOjpDUjNFUSwgUFBDOjpDUjNVTiwKKyAgICBQUEM6OkNSNExULCBQUEM6OkNSNEdULCBQUEM6OkNSNEVRLCBQUEM6OkNSNFVOLAorCisgICAgMAorICB9OworICAKKyAgaWYgKFN1YnRhcmdldC5pc0RhcndpbkFCSSgpKQorICAgIHJldHVybiBTdWJ0YXJnZXQuaXNQUEM2NCgpID8gRGFyd2luNjRfQ2FsbGVlU2F2ZWRSZWdzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhcndpbjMyX0NhbGxlZVNhdmVkUmVnczsKKworICByZXR1cm4gU3VidGFyZ2V0LmlzUFBDNjQoKSA/IFNWUjRfNjRfQ2FsbGVlU2F2ZWRSZWdzIDogU1ZSNF9DYWxsZWVTYXZlZFJlZ3M7Cit9CisKKy8vIG5lZWRzRlAgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGEgZGVkaWNhdGVkIGZyYW1lCisvLyBwb2ludGVyIHJlZ2lzdGVyLiAgVGhpcyBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBoYXMgdmFyaWFibGUgc2l6ZWQgYWxsb2NhcyBvcgorLy8gaWYgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbiBpcyBkaXNhYmxlZC4KKy8vCitzdGF0aWMgYm9vbCBuZWVkc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIC8vIE5ha2VkIGZ1bmN0aW9ucyBoYXZlIG5vIHN0YWNrIGZyYW1lIHB1c2hlZCwgc28gd2UgZG9uJ3QgaGF2ZSBhIGZyYW1lIHBvaW50ZXIuCisgIGlmIChNRi5nZXRGdW5jdGlvbigpLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpOYWtlZCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gRGlzYWJsZUZyYW1lUG9pbnRlckVsaW0oTUYpIHx8IE1GSS0+aGFzVmFyU2l6ZWRPYmplY3RzKCkgfHwKKyAgICAoR3VhcmFudGVlZFRhaWxDYWxsT3B0ICYmIE1GLmdldEluZm88UFBDRnVuY3Rpb25JbmZvPigpLT5oYXNGYXN0Q2FsbCgpKTsKK30KKworc3RhdGljIGJvb2wgc3BpbGxzQ1IoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgeworICBjb25zdCBQUENGdW5jdGlvbkluZm8gKkZ1bmNJbmZvID0gTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCk7CisgIHJldHVybiBGdW5jSW5mby0+aXNDUlNwaWxsZWQoKTsKK30KKworQml0VmVjdG9yIFBQQ1JlZ2lzdGVySW5mbzo6Z2V0UmVzZXJ2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgQml0VmVjdG9yIFJlc2VydmVkKGdldE51bVJlZ3MoKSk7CisgIFJlc2VydmVkLnNldChQUEM6OlIwKTsKKyAgUmVzZXJ2ZWQuc2V0KFBQQzo6UjEpOworICBSZXNlcnZlZC5zZXQoUFBDOjpMUik7CisgIFJlc2VydmVkLnNldChQUEM6OkxSOCk7CisgIFJlc2VydmVkLnNldChQUEM6OlJNKTsKKworICAvLyBUaGUgU1ZSNCBBQkkgcmVzZXJ2ZXMgcjIgYW5kIHIxMworICBpZiAoU3VidGFyZ2V0LmlzU1ZSNEFCSSgpKSB7CisgICAgUmVzZXJ2ZWQuc2V0KFBQQzo6UjIpOyAgLy8gU3lzdGVtLXJlc2VydmVkIHJlZ2lzdGVyCisgICAgUmVzZXJ2ZWQuc2V0KFBQQzo6UjEzKTsgLy8gU21hbGwgRGF0YSBBcmVhIHBvaW50ZXIgcmVnaXN0ZXIKKyAgfQorICAvLyBSZXNlcnZlIFIyIG9uIERhcndpbiB0byBoYWNrIGFyb3VuZCB0aGUgcHJvYmxlbSBvZiBzYXZlL3Jlc3RvcmUgb2YgQ1IKKyAgLy8gd2hlbiB0aGUgc3RhY2sgZnJhbWUgaXMgdG9vIGJpZyB0byBhZGRyZXNzIGRpcmVjdGx5OyB3ZSBuZWVkIHR3byByZWdzLgorICAvLyBUaGlzIGlzIGEgaGFjay4KKyAgaWYgKFN1YnRhcmdldC5pc0RhcndpbkFCSSgpKSB7CisgICAgUmVzZXJ2ZWQuc2V0KFBQQzo6UjIpOworICB9CisgIAorICAvLyBPbiBQUEM2NCwgcjEzIGlzIHRoZSB0aHJlYWQgcG9pbnRlci4gTmV2ZXIgYWxsb2NhdGUgdGhpcyByZWdpc3Rlci4KKyAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgb3ZlciBjb25zZXJ2YXRpdmUsIGFzIGl0IGFsc28gcHJldmVudHMgYWxsb2NhdGlvbiBvZiBSMzEKKyAgLy8gd2hlbiB0aGUgRlAgaXMgbm90IG5lZWRlZC4KKyAgaWYgKFN1YnRhcmdldC5pc1BQQzY0KCkpIHsKKyAgICBSZXNlcnZlZC5zZXQoUFBDOjpSMTMpOworICAgIFJlc2VydmVkLnNldChQUEM6OlIzMSk7CisKKyAgICBpZiAoIUVuYWJsZVJlZ2lzdGVyU2NhdmVuZ2luZykKKyAgICAgIFJlc2VydmVkLnNldChQUEM6OlIwKTsgICAgLy8gRklYTUUgKDY0LWJpdCk6IFJlbW92ZQorCisgICAgUmVzZXJ2ZWQuc2V0KFBQQzo6WDApOworICAgIFJlc2VydmVkLnNldChQUEM6OlgxKTsKKyAgICBSZXNlcnZlZC5zZXQoUFBDOjpYMTMpOworICAgIFJlc2VydmVkLnNldChQUEM6OlgzMSk7CisKKyAgICAvLyBUaGUgNjQtYml0IFNWUjQgQUJJIHJlc2VydmVzIHIyIGZvciB0aGUgVE9DIHBvaW50ZXIuCisgICAgaWYgKFN1YnRhcmdldC5pc1NWUjRBQkkoKSkgeworICAgICAgUmVzZXJ2ZWQuc2V0KFBQQzo6WDIpOworICAgIH0KKyAgICAvLyBSZXNlcnZlIFIyIG9uIERhcndpbiB0byBoYWNrIGFyb3VuZCB0aGUgcHJvYmxlbSBvZiBzYXZlL3Jlc3RvcmUgb2YgQ1IKKyAgICAvLyB3aGVuIHRoZSBzdGFjayBmcmFtZSBpcyB0b28gYmlnIHRvIGFkZHJlc3MgZGlyZWN0bHk7IHdlIG5lZWQgdHdvIHJlZ3MuCisgICAgLy8gVGhpcyBpcyBhIGhhY2suCisgICAgaWYgKFN1YnRhcmdldC5pc0RhcndpbkFCSSgpKSB7CisgICAgICBSZXNlcnZlZC5zZXQoUFBDOjpYMik7CisgICAgfQorICB9CisKKyAgaWYgKG5lZWRzRlAoTUYpKQorICAgIFJlc2VydmVkLnNldChQUEM6OlIzMSk7CisKKyAgcmV0dXJuIFJlc2VydmVkOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3RhY2sgRnJhbWUgUHJvY2Vzc2luZyBtZXRob2RzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBoYXNGUCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gYWN0dWFsbHkgaGFzIGEgZGVkaWNhdGVkIGZyYW1lCisvLyBwb2ludGVyIHJlZ2lzdGVyLiAgVGhpcyBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBuZWVkcyBhIGZyYW1lIHBvaW50ZXIgYW5kIGhhcworLy8gYSBub24temVybyBzdGFjayBzaXplLgorYm9vbCBQUENSZWdpc3RlckluZm86Omhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIHJldHVybiBNRkktPmdldFN0YWNrU2l6ZSgpICYmIG5lZWRzRlAoTUYpOworfQorCisvLy8gTXVzdFNhdmVMUiAtIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCB3ZSBzYXZlIHRoZSBMUgorLy8vIHJlZ2lzdGVyIG9udG8gdGhlIHN0YWNrIGluIHRoZSBwcm9sb2cgYW5kIHJlc3RvcmUgaXQgaW4gdGhlIGVwaWxvZyBvZiB0aGUKKy8vLyBmdW5jdGlvbi4KK3N0YXRpYyBib29sIE11c3RTYXZlTFIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwgdW5zaWduZWQgTFIpIHsKKyAgY29uc3QgUFBDRnVuY3Rpb25JbmZvICpNRkkgPSBNRi5nZXRJbmZvPFBQQ0Z1bmN0aW9uSW5mbz4oKTsKKyAgCisgIC8vIFdlIG5lZWQgYSBzYXZlL3Jlc3RvcmUgb2YgTFIgaWYgdGhlcmUgaXMgYW55IGRlZiBvZiBMUiAod2hpY2ggaXMKKyAgLy8gZGVmaW5lZCBieSBjYWxscywgaW5jbHVkaW5nIHRoZSBQSUMgc2V0dXAgc2VxdWVuY2UpLCBvciBpZiB0aGVyZSBpcworICAvLyBzb21lIHVzZSBvZiB0aGUgTFIgc3RhY2sgc2xvdCAoZS5nLiBmb3IgYnVpbHRpbl9yZXR1cm5fYWRkcmVzcykuCisgIC8vIChMUiBjb21lcyBpbiAzMiBhbmQgNjQgYml0IHZlcnNpb25zLikKKyAgTWFjaGluZVJlZ2lzdGVySW5mbzo6ZGVmX2l0ZXJhdG9yIFJJID0gTUYuZ2V0UmVnSW5mbygpLmRlZl9iZWdpbihMUik7CisgIHJldHVybiBSSSAhPU1GLmdldFJlZ0luZm8oKS5kZWZfZW5kKCkgfHwgTUZJLT5pc0xSU3RvcmVSZXF1aXJlZCgpOworfQorCisKKwordm9pZCBQUENSZWdpc3RlckluZm86OgorZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdCB7CisgIGlmIChHdWFyYW50ZWVkVGFpbENhbGxPcHQgJiYgSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpBREpDQUxMU1RBQ0tVUCkgeworICAgIC8vIEFkZCAoYWN0dWFsbHkgc3VidHJhY3QpIGJhY2sgdGhlIGFtb3VudCB0aGUgY2FsbGVlIHBvcHBlZCBvbiByZXR1cm4uCisgICAgaWYgKGludCBDYWxsZWVBbXQgPSAgSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKSkgeworICAgICAgYm9vbCBpczY0Qml0ID0gU3VidGFyZ2V0LmlzUFBDNjQoKTsKKyAgICAgIENhbGxlZUFtdCAqPSAtMTsKKyAgICAgIHVuc2lnbmVkIFN0YWNrUmVnID0gaXM2NEJpdCA/IFBQQzo6WDEgOiBQUEM6OlIxOworICAgICAgdW5zaWduZWQgVG1wUmVnID0gaXM2NEJpdCA/IFBQQzo6WDAgOiBQUEM6OlIwOworICAgICAgdW5zaWduZWQgQURESUluc3RyID0gaXM2NEJpdCA/IFBQQzo6QURESTggOiBQUEM6OkFEREk7CisgICAgICB1bnNpZ25lZCBBRERJbnN0ciA9IGlzNjRCaXQgPyBQUEM6OkFERDggOiBQUEM6OkFERDQ7CisgICAgICB1bnNpZ25lZCBMSVNJbnN0ciA9IGlzNjRCaXQgPyBQUEM6OkxJUzggOiBQUEM6OkxJUzsKKyAgICAgIHVuc2lnbmVkIE9SSUluc3RyID0gaXM2NEJpdCA/IFBQQzo6T1JJOCA6IFBQQzo6T1JJOworICAgICAgTWFjaGluZUluc3RyICpNSSA9IEk7CisgICAgICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgICAgICBpZiAoaXNJbnQ8MTY+KENhbGxlZUFtdCkpIHsKKyAgICAgICAgQnVpbGRNSShNQkIsIEksIGRsLCBUSUkuZ2V0KEFERElJbnN0ciksIFN0YWNrUmVnKS5hZGRSZWcoU3RhY2tSZWcpLgorICAgICAgICAgIGFkZEltbShDYWxsZWVBbXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBJOworICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoTElTSW5zdHIpLCBUbXBSZWcpCisgICAgICAgICAgLmFkZEltbShDYWxsZWVBbXQgPj4gMTYpOworICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoT1JJSW5zdHIpLCBUbXBSZWcpCisgICAgICAgICAgLmFkZFJlZyhUbXBSZWcsIFJlZ1N0YXRlOjpLaWxsKQorICAgICAgICAgIC5hZGRJbW0oQ2FsbGVlQW10ICYgMHhGRkZGKTsKKyAgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFEREluc3RyKSkKKyAgICAgICAgICAuYWRkUmVnKFN0YWNrUmVnKQorICAgICAgICAgIC5hZGRSZWcoU3RhY2tSZWcpCisgICAgICAgICAgLmFkZFJlZyhUbXBSZWcpOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBTaW1wbHkgZGlzY2FyZCBBREpDQUxMU1RBQ0tET1dOLCBBREpDQUxMU1RBQ0tVUCBpbnN0cnVjdGlvbnMuCisgIE1CQi5lcmFzZShJKTsKK30KKworLy8vIGZpbmRTY3JhdGNoUmVnaXN0ZXIgLSBGaW5kIGEgJ2ZyZWUnIFBQQyByZWdpc3Rlci4gVHJ5IGZvciBhIGNhbGwtY2xvYmJlcmVkCisvLy8gcmVnaXN0ZXIgZmlyc3QgYW5kIHRoZW4gYSBzcGlsbGVkIGNhbGxlZS1zYXZlZCByZWdpc3RlciBpZiB0aGF0IGZhaWxzLgorc3RhdGljCit1bnNpZ25lZCBmaW5kU2NyYXRjaFJlZ2lzdGVyKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwgUmVnU2NhdmVuZ2VyICpSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsIGludCBTUEFkaikgeworICBhc3NlcnQoUlMgJiYgIlJlZ2lzdGVyIHNjYXZlbmdpbmcgbXVzdCBiZSBvbiIpOworICB1bnNpZ25lZCBSZWcgPSBSUy0+RmluZFVudXNlZFJlZyhSQyk7CisgIC8vIEZJWE1FOiBtb3ZlIEFSTSBjYWxsZWUtc2F2ZWQgcmVnIHNjYW4gdG8gdGFyZ2V0IGluZGVwZW5kZW50IGNvZGUsIHRoZW4gCisgIC8vIHNlYXJjaCBmb3IgYWxyZWFkeSBzcGlsbGVkIENTIHJlZ2lzdGVyIGhlcmUuCisgIGlmIChSZWcgPT0gMCkKKyAgICBSZWcgPSBSUy0+c2NhdmVuZ2VSZWdpc3RlcihSQywgSUksIFNQQWRqKTsKKyAgcmV0dXJuIFJlZzsKK30KKworLy8vIGxvd2VyRHluYW1pY0FsbG9jIC0gR2VuZXJhdGUgdGhlIGNvZGUgZm9yIGFsbG9jYXRpbmcgYW4gb2JqZWN0IGluIHRoZQorLy8vIGN1cnJlbnQgZnJhbWUuICBUaGUgc2VxdWVuY2Ugb2YgY29kZSB3aXRoIGJlIGluIHRoZSBnZW5lcmFsIGZvcm0KKy8vLworLy8vICAgYWRkaSAgIFIwLCBTUCwgXCNmcmFtZVNpemUgOyBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHByZXZpb3VzIGZyYW1lCisvLy8gICBzdHd4dSAgUjAsIFNQLCBSbmVnc2l6ZSAgIDsgYWRkIGFuZCB1cGRhdGUgdGhlIFNQIHdpdGggdGhlIG5lZ2F0ZWQgc2l6ZQorLy8vICAgYWRkaSAgIFJuZXcsIFNQLCBcI21heENhbEZyYW1lU2l6ZSA7IGdldCB0aGUgdG9wIG9mIHRoZSBhbGxvY2F0aW9uCisvLy8KK3ZvaWQgUFBDUmVnaXN0ZXJJbmZvOjpsb3dlckR5bmFtaWNBbGxvYyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBSZWdTY2F2ZW5nZXIgKlJTKSBjb25zdCB7CisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ciAmTUkgPSAqSUk7CisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24ncyBiYXNpYyBibG9jay4KKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9ICpNSS5nZXRQYXJlbnQoKTsKKyAgLy8gR2V0IHRoZSBiYXNpYyBibG9jaydzIGZ1bmN0aW9uLgorICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgLy8gR2V0IHRoZSBmcmFtZSBpbmZvLgorICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgNjQtYml0IHBvaW50ZXJzIGFyZSB1c2VkLgorICBib29sIExQNjQgPSBTdWJ0YXJnZXQuaXNQUEM2NCgpOworICBEZWJ1Z0xvYyBkbCA9IE1JLmdldERlYnVnTG9jKCk7CisKKyAgLy8gR2V0IHRoZSBtYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZS4KKyAgdW5zaWduZWQgbWF4Q2FsbEZyYW1lU2l6ZSA9IE1GSS0+Z2V0TWF4Q2FsbEZyYW1lU2l6ZSgpOworICAvLyBHZXQgdGhlIHRvdGFsIGZyYW1lIHNpemUuCisgIHVuc2lnbmVkIEZyYW1lU2l6ZSA9IE1GSS0+Z2V0U3RhY2tTaXplKCk7CisgIAorICAvLyBHZXQgc3RhY2sgYWxpZ25tZW50cy4KKyAgdW5zaWduZWQgVGFyZ2V0QWxpZ24gPSBNRi5nZXRUYXJnZXQoKS5nZXRGcmFtZUluZm8oKS0+Z2V0U3RhY2tBbGlnbm1lbnQoKTsKKyAgdW5zaWduZWQgTWF4QWxpZ24gPSBNRkktPmdldE1heEFsaWdubWVudCgpOworICBpZiAoTWF4QWxpZ24gPiBUYXJnZXRBbGlnbikKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkR5bmFtaWMgYWxsb2NhIHdpdGggbGFyZ2UgYWxpZ25zIG5vdCBzdXBwb3J0ZWQiKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIHByZXZpb3VzIGZyYW1lJ3MgYWRkcmVzcy4gIElmIEZyYW1lU2l6ZSBjYW4ndCBiZQorICAvLyByZXByZXNlbnRlZCBhcyAxNiBiaXRzIG9yIHdlIG5lZWQgc3BlY2lhbCBhbGlnbm1lbnQsIHRoZW4gd2UgbG9hZCB0aGUKKyAgLy8gcHJldmlvdXMgZnJhbWUncyBhZGRyZXNzIGZyb20gMChTUCkuICBXaHkgbm90IGRvIGFuIGFkZGlzIG9mIHRoZSBoaT8gCisgIC8vIEJlY2F1c2UgUjAgaXMgb3VyIG9ubHkgc2FmZSB0bXAgcmVnaXN0ZXIgYW5kIGFkZGkvYWRkaXMgdHJlYXQgUjAgYXMgemVyby4gCisgIC8vIENvbnN0cnVjdGluZyB0aGUgY29uc3RhbnQgYW5kIGFkZGluZyB3b3VsZCB0YWtlIDMgaW5zdHJ1Y3Rpb25zLiAKKyAgLy8gRm9ydHVuYXRlbHksIGEgZnJhbWUgZ3JlYXRlciB0aGFuIDMySyBpcyByYXJlLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpHOFJDID0gJlBQQzo6RzhSQ1JlZ0NsYXNzOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpHUFJDID0gJlBQQzo6R1BSQ1JlZ0NsYXNzOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IExQNjQgPyBHOFJDIDogR1BSQzsKKworICAvLyBGSVhNRSAoNjQtYml0KTogVXNlICJmaW5kU2NyYXRjaFJlZ2lzdGVyIgorICB1bnNpZ25lZCBSZWc7CisgIGlmIChFbmFibGVSZWdpc3RlclNjYXZlbmdpbmcpCisgICAgUmVnID0gZmluZFNjcmF0Y2hSZWdpc3RlcihJSSwgUlMsIFJDLCBTUEFkaik7CisgIGVsc2UKKyAgICBSZWcgPSBQUEM6OlIwOworICAKKyAgaWYgKE1heEFsaWduIDwgVGFyZ2V0QWxpZ24gJiYgaXNJbnQ8MTY+KEZyYW1lU2l6ZSkpIHsKKyAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KFBQQzo6QURESSksIFJlZykKKyAgICAgIC5hZGRSZWcoUFBDOjpSMzEpCisgICAgICAuYWRkSW1tKEZyYW1lU2l6ZSk7CisgIH0gZWxzZSBpZiAoTFA2NCkgeworICAgIGlmIChFbmFibGVSZWdpc3RlclNjYXZlbmdpbmcpIC8vIEZJWE1FICg2NC1iaXQpOiBVc2UgInRydWUiIHBhcnQuCisgICAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KFBQQzo6TEQpLCBSZWcpCisgICAgICAgIC5hZGRJbW0oMCkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgxKTsKKyAgICBlbHNlCisgICAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KFBQQzo6TEQpLCBQUEM6OlgwKQorICAgICAgICAuYWRkSW1tKDApCisgICAgICAgIC5hZGRSZWcoUFBDOjpYMSk7CisgIH0gZWxzZSB7CisgICAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChQUEM6OkxXWiksIFJlZykKKyAgICAgIC5hZGRJbW0oMCkKKyAgICAgIC5hZGRSZWcoUFBDOjpSMSk7CisgIH0KKyAgCisgIC8vIEdyb3cgdGhlIHN0YWNrIGFuZCB1cGRhdGUgdGhlIHN0YWNrIHBvaW50ZXIgbGluaywgdGhlbiBkZXRlcm1pbmUgdGhlCisgIC8vIGFkZHJlc3Mgb2YgbmV3IGFsbG9jYXRlZCBzcGFjZS4KKyAgaWYgKExQNjQpIHsKKyAgICBpZiAoRW5hYmxlUmVnaXN0ZXJTY2F2ZW5naW5nKSAvLyBGSVhNRSAoNjQtYml0KTogVXNlICJ0cnVlIiBwYXJ0LgorICAgICAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChQUEM6OlNURFVYKSkKKyAgICAgICAgLmFkZFJlZyhSZWcsIFJlZ1N0YXRlOjpLaWxsKQorICAgICAgICAuYWRkUmVnKFBQQzo6WDEpCisgICAgICAgIC5hZGRSZWcoTUkuZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKSk7CisgICAgZWxzZQorICAgICAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChQUEM6OlNURFVYKSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgwLCBSZWdTdGF0ZTo6S2lsbCkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgxKQorICAgICAgICAuYWRkUmVnKE1JLmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpOworCisgICAgaWYgKCFNSS5nZXRPcGVyYW5kKDEpLmlzS2lsbCgpKQorICAgICAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChQUEM6OkFEREk4KSwgTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgxKQorICAgICAgICAuYWRkSW1tKG1heENhbGxGcmFtZVNpemUpOworICAgIGVsc2UKKyAgICAgIC8vIEltcGxpY2l0bHkga2lsbCB0aGUgcmVnaXN0ZXIuCisgICAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KFBQQzo6QURESTgpLCBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpKQorICAgICAgICAuYWRkUmVnKFBQQzo6WDEpCisgICAgICAgIC5hZGRJbW0obWF4Q2FsbEZyYW1lU2l6ZSkKKyAgICAgICAgLmFkZFJlZyhNSS5nZXRPcGVyYW5kKDEpLmdldFJlZygpLCBSZWdTdGF0ZTo6SW1wbGljaXRLaWxsKTsKKyAgfSBlbHNlIHsKKyAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KFBQQzo6U1RXVVgpKQorICAgICAgLmFkZFJlZyhSZWcsIFJlZ1N0YXRlOjpLaWxsKQorICAgICAgLmFkZFJlZyhQUEM6OlIxKQorICAgICAgLmFkZFJlZyhNSS5nZXRPcGVyYW5kKDEpLmdldFJlZygpKTsKKworICAgIGlmICghTUkuZ2V0T3BlcmFuZCgxKS5pc0tpbGwoKSkKKyAgICAgIEJ1aWxkTUkoTUJCLCBJSSwgZGwsIFRJSS5nZXQoUFBDOjpBRERJKSwgTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlIxKQorICAgICAgICAuYWRkSW1tKG1heENhbGxGcmFtZVNpemUpOworICAgIGVsc2UKKyAgICAgIC8vIEltcGxpY2l0bHkga2lsbCB0aGUgcmVnaXN0ZXIuCisgICAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KFBQQzo6QURESSksIE1JLmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMSkKKyAgICAgICAgLmFkZEltbShtYXhDYWxsRnJhbWVTaXplKQorICAgICAgICAuYWRkUmVnKE1JLmdldE9wZXJhbmQoMSkuZ2V0UmVnKCksIFJlZ1N0YXRlOjpJbXBsaWNpdEtpbGwpOworICB9CisgIAorICAvLyBEaXNjYXJkIHRoZSBEWU5BTExPQyBpbnN0cnVjdGlvbi4KKyAgTUJCLmVyYXNlKElJKTsKK30KKworLy8vIGxvd2VyQ1JTcGlsbGluZyAtIEdlbmVyYXRlIHRoZSBjb2RlIGZvciBzcGlsbGluZyBhIENSIHJlZ2lzdGVyLiBJbnN0ZWFkIG9mCisvLy8gcmVzZXJ2aW5nIGEgd2hvbGUgcmVnaXN0ZXIgKFIwKSwgd2Ugc2Nyb3VuZ2UgZm9yIG9uZSBoZXJlLiBUaGlzIGdlbmVyYXRlcworLy8vIGNvZGUgbGlrZSB0aGlzOgorLy8vCisvLy8gICBtZmNyIHJBICAgICAgICAgICAgICAgICAgOyBNb3ZlIHRoZSBjb25kaXRpb25hbCByZWdpc3RlciBpbnRvIEdQUiByQS4KKy8vLyAgIHJsd2lubSByQSwgckEsIFNCLCAwLCAzMSA7IFNoaWZ0IHRoZSBiaXRzIGxlZnQgc28gdGhleSBhcmUgaW4gQ1IwJ3Mgc2xvdC4KKy8vLyAgIHN0dyByQSwgRkkgICAgICAgICAgICAgICA7IFN0b3JlIHJBIHRvIHRoZSBmcmFtZS4KKy8vLwordm9pZCBQUENSZWdpc3RlckluZm86Omxvd2VyQ1JTcGlsbGluZyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZyYW1lSW5kZXgsIGludCBTUEFkaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3QgeworICAvLyBHZXQgdGhlIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHIgJk1JID0gKklJOyAgICAgICAvLyA7IFNQSUxMX0NSIDxTcmNSZWc+LCA8b2Zmc2V0PiwgPEZJPgorICAvLyBHZXQgdGhlIGluc3RydWN0aW9uJ3MgYmFzaWMgYmxvY2suCisgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIgPSAqTUkuZ2V0UGFyZW50KCk7CisgIERlYnVnTG9jIGRsID0gTUkuZ2V0RGVidWdMb2MoKTsKKworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpHOFJDID0gJlBQQzo6RzhSQ1JlZ0NsYXNzOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpHUFJDID0gJlBQQzo6R1BSQ1JlZ0NsYXNzOworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IFN1YnRhcmdldC5pc1BQQzY0KCkgPyBHOFJDIDogR1BSQzsKKyAgdW5zaWduZWQgUmVnID0gZmluZFNjcmF0Y2hSZWdpc3RlcihJSSwgUlMsIFJDLCBTUEFkaik7CisgIHVuc2lnbmVkIFNyY1JlZyA9IE1JLmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisKKyAgLy8gV2UgbmVlZCB0byBzdG9yZSB0aGUgQ1IgaW4gdGhlIGxvdyA0LWJpdHMgb2YgdGhlIHNhdmVkIHZhbHVlLiBGaXJzdCwgaXNzdWUKKyAgLy8gYW4gTUZDUnBzdWVkIHRvIHNhdmUgYWxsIG9mIHRoZSBDUkJpdHMgYW5kLCBpZiBuZWVkZWQsIGtpbGwgdGhlIFNyY1JlZy4KKyAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChQUEM6Ok1GQ1Jwc2V1ZCksIFJlZykKKyAgICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKE1JLmdldE9wZXJhbmQoMCkuaXNLaWxsKCkpKTsKKyAgICAKKyAgLy8gSWYgdGhlIHNhdmVkIHJlZ2lzdGVyIHdhc24ndCBDUjAsIHNoaWZ0IHRoZSBiaXRzIGxlZnQgc28gdGhhdCB0aGV5IGFyZSBpbgorICAvLyBDUjAncyBzbG90LgorICBpZiAoU3JjUmVnICE9IFBQQzo6Q1IwKQorICAgIC8vIHJsd2lubSByQSwgckEsIFNoaWZ0Qml0cywgMCwgMzEuCisgICAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChQUEM6OlJMV0lOTSksIFJlZykKKyAgICAgIC5hZGRSZWcoUmVnLCBSZWdTdGF0ZTo6S2lsbCkKKyAgICAgIC5hZGRJbW0oUFBDUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZyhTcmNSZWcpICogNCkKKyAgICAgIC5hZGRJbW0oMCkKKyAgICAgIC5hZGRJbW0oMzEpOworCisgIGFkZEZyYW1lUmVmZXJlbmNlKEJ1aWxkTUkoTUJCLCBJSSwgZGwsIFRJSS5nZXQoUFBDOjpTVFcpKQorICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKFJlZywgZ2V0S2lsbFJlZ1N0YXRlKE1JLmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgRnJhbWVJbmRleCk7CisKKyAgLy8gRGlzY2FyZCB0aGUgcHNldWRvIGluc3RydWN0aW9uLgorICBNQkIuZXJhc2UoSUkpOworfQorCit1bnNpZ25lZAorUFBDUmVnaXN0ZXJJbmZvOjplbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGosIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3QgeworICBhc3NlcnQoU1BBZGogPT0gMCAmJiAiVW5leHBlY3RlZCIpOworCisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ciAmTUkgPSAqSUk7CisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24ncyBiYXNpYyBibG9jay4KKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9ICpNSS5nZXRQYXJlbnQoKTsKKyAgLy8gR2V0IHRoZSBiYXNpYyBibG9jaydzIGZ1bmN0aW9uLgorICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgLy8gR2V0IHRoZSBmcmFtZSBpbmZvLgorICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgRGVidWdMb2MgZGwgPSBNSS5nZXREZWJ1Z0xvYygpOworCisgIC8vIEZpbmQgb3V0IHdoaWNoIG9wZXJhbmQgaXMgdGhlIGZyYW1lIGluZGV4LgorICB1bnNpZ25lZCBGSU9wZXJhbmRObyA9IDA7CisgIHdoaWxlICghTUkuZ2V0T3BlcmFuZChGSU9wZXJhbmRObykuaXNGSSgpKSB7CisgICAgKytGSU9wZXJhbmRObzsKKyAgICBhc3NlcnQoRklPcGVyYW5kTm8gIT0gTUkuZ2V0TnVtT3BlcmFuZHMoKSAmJgorICAgICAgICAgICAiSW5zdHIgZG9lc24ndCBoYXZlIEZyYW1lSW5kZXggb3BlcmFuZCEiKTsKKyAgfQorICAvLyBUYWtlIGludG8gYWNjb3VudCB3aGV0aGVyIGl0J3MgYW4gYWRkIG9yIG1lbSBpbnN0cnVjdGlvbgorICB1bnNpZ25lZCBPZmZzZXRPcGVyYW5kTm8gPSAoRklPcGVyYW5kTm8gPT0gMikgPyAxIDogMjsKKyAgaWYgKE1JLmlzSW5saW5lQXNtKCkpCisgICAgT2Zmc2V0T3BlcmFuZE5vID0gRklPcGVyYW5kTm8tMTsKKworICAvLyBHZXQgdGhlIGZyYW1lIGluZGV4LgorICBpbnQgRnJhbWVJbmRleCA9IE1JLmdldE9wZXJhbmQoRklPcGVyYW5kTm8pLmdldEluZGV4KCk7CisKKyAgLy8gR2V0IHRoZSBmcmFtZSBwb2ludGVyIHNhdmUgaW5kZXguICBVc2VycyBvZiB0aGlzIGluZGV4IGFyZSBwcmltYXJpbHkKKyAgLy8gRFlOQUxMT0MgaW5zdHJ1Y3Rpb25zLgorICBQUENGdW5jdGlvbkluZm8gKkZJID0gTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCk7CisgIGludCBGUFNJID0gRkktPmdldEZyYW1lUG9pbnRlclNhdmVJbmRleCgpOworICAvLyBHZXQgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KKyAgdW5zaWduZWQgT3BDID0gTUkuZ2V0T3Bjb2RlKCk7CisgIAorICAvLyBTcGVjaWFsIGNhc2UgZm9yIGR5bmFtaWMgYWxsb2NhLgorICBpZiAoRlBTSSAmJiBGcmFtZUluZGV4ID09IEZQU0kgJiYKKyAgICAgIChPcEMgPT0gUFBDOjpEWU5BTExPQyB8fCBPcEMgPT0gUFBDOjpEWU5BTExPQzgpKSB7CisgICAgbG93ZXJEeW5hbWljQWxsb2MoSUksIFNQQWRqLCBSUyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBTcGVjaWFsIGNhc2UgZm9yIHBzZXVkby1vcCBTUElMTF9DUi4KKyAgaWYgKEVuYWJsZVJlZ2lzdGVyU2NhdmVuZ2luZykgLy8gRklYTUUgKDY0LWJpdCk6IEVuYWJsZSBieSBkZWZhdWx0LgorICAgIGlmIChPcEMgPT0gUFBDOjpTUElMTF9DUikgeworICAgICAgbG93ZXJDUlNwaWxsaW5nKElJLCBGcmFtZUluZGV4LCBTUEFkaiwgUlMpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8vIFJlcGxhY2UgdGhlIEZyYW1lSW5kZXggd2l0aCBiYXNlIHJlZ2lzdGVyIHdpdGggR1BSMSAoU1ApIG9yIEdQUjMxIChGUCkuCisgIE1JLmdldE9wZXJhbmQoRklPcGVyYW5kTm8pLkNoYW5nZVRvUmVnaXN0ZXIoaGFzRlAoTUYpID8gUFBDOjpSMzEgOiBQUEM6OlIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICAvLyBGaWd1cmUgb3V0IGlmIHRoZSBvZmZzZXQgaW4gdGhlIGluc3RydWN0aW9uIGlzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuIFRoaXMKKyAgLy8gaXMgdHJ1ZSBmb3IgaW5zdHJ1Y3Rpb25zIGxpa2UgIlNURCIsIHdoaWNoIHRoZSBtYWNoaW5lIGltcGxpY2l0bHkgYWRkcyB0d28KKyAgLy8gbG93IHplcm9zIHRvLgorICBib29sIGlzSVhBZGRyID0gZmFsc2U7CisgIHN3aXRjaCAoT3BDKSB7CisgIGNhc2UgUFBDOjpMV0E6CisgIGNhc2UgUFBDOjpMRDoKKyAgY2FzZSBQUEM6OlNURDoKKyAgY2FzZSBQUEM6OlNURF8zMjoKKyAgICBpc0lYQWRkciA9IHRydWU7CisgICAgYnJlYWs7CisgIH0KKyAgCisgIC8vIE5vdyBhZGQgdGhlIGZyYW1lIG9iamVjdCBvZmZzZXQgdG8gdGhlIG9mZnNldCBmcm9tIHIxLgorICBpbnQgT2Zmc2V0ID0gTUZJLT5nZXRPYmplY3RPZmZzZXQoRnJhbWVJbmRleCk7CisgIGlmICghaXNJWEFkZHIpCisgICAgT2Zmc2V0ICs9IE1JLmdldE9wZXJhbmQoT2Zmc2V0T3BlcmFuZE5vKS5nZXRJbW0oKTsKKyAgZWxzZQorICAgIE9mZnNldCArPSBNSS5nZXRPcGVyYW5kKE9mZnNldE9wZXJhbmRObykuZ2V0SW1tKCkgPDwgMjsKKworICAvLyBJZiB3ZSdyZSBub3QgdXNpbmcgYSBGcmFtZSBQb2ludGVyIHRoYXQgaGFzIGJlZW4gc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUKKyAgLy8gU1AgYmVmb3JlIGhhdmluZyB0aGUgc3RhY2sgc2l6ZSBzdWJ0cmFjdGVkIGZyb20gaXQsIHRoZW4gYWRkIHRoZSBzdGFjayBzaXplCisgIC8vIHRvIE9mZnNldCB0byBnZXQgdGhlIGNvcnJlY3Qgb2Zmc2V0LgorICAvLyBOYWtlZCBmdW5jdGlvbnMgaGF2ZSBzdGFjayBzaXplIDAsIGFsdGhvdWdoIGdldFN0YWNrU2l6ZSBtYXkgbm90IHJlZmxlY3QgdGhhdAorICAvLyBiZWNhdXNlIHdlIGRpZG4ndCBjYWxsIGFsbCB0aGUgcGllY2VzIHRoYXQgY29tcHV0ZSBpdCBmb3IgbmFrZWQgZnVuY3Rpb25zLgorICBpZiAoIU1GLmdldEZ1bmN0aW9uKCktPmhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5ha2VkKSkKKyAgICBPZmZzZXQgKz0gTUZJLT5nZXRTdGFja1NpemUoKTsKKworICAvLyBJZiB3ZSBjYW4sIGVuY29kZSB0aGUgb2Zmc2V0IGRpcmVjdGx5IGludG8gdGhlIGluc3RydWN0aW9uLiAgSWYgdGhpcyBpcyBhCisgIC8vIG5vcm1hbCBQUEMgInJpIiBpbnN0cnVjdGlvbiwgYW55IDE2LWJpdCB2YWx1ZSBjYW4gYmUgc2FmZWx5IGVuY29kZWQuICBJZgorICAvLyB0aGlzIGlzIGEgUFBDNjQgIml4IiBpbnN0cnVjdGlvbiwgb25seSBhIDE2LWJpdCB2YWx1ZSB3aXRoIHRoZSBsb3cgdHdvIGJpdHMKKyAgLy8gY2xlYXIgY2FuIGJlIGVuY29kZWQuICBUaGlzIGlzIGV4dHJlbWVseSB1bmNvbW1vbiwgYmVjYXVzZSBub3JtYWxseSB5b3UKKyAgLy8gb25seSAic3RkIiB0byBhIHN0YWNrIHNsb3QgdGhhdCBpcyBhdCBsZWFzdCA0LWJ5dGUgYWxpZ25lZCwgYnV0IGl0IGNhbgorICAvLyBoYXBwZW4gaW4gaW52YWxpZCBjb2RlLgorICBpZiAoaXNJbnQ8MTY+KE9mZnNldCkgJiYgKCFpc0lYQWRkciB8fCAoT2Zmc2V0ICYgMykgPT0gMCkpIHsKKyAgICBpZiAoaXNJWEFkZHIpCisgICAgICBPZmZzZXQgPj49IDI7ICAgIC8vIFRoZSBhY3R1YWwgZW5jb2RlZCB2YWx1ZSBoYXMgdGhlIGxvdyB0d28gYml0cyB6ZXJvLgorICAgIE1JLmdldE9wZXJhbmQoT2Zmc2V0T3BlcmFuZE5vKS5DaGFuZ2VUb0ltbWVkaWF0ZShPZmZzZXQpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gVGhlIG9mZnNldCBkb2Vzbid0IGZpdCBpbnRvIGEgc2luZ2xlIHJlZ2lzdGVyLCBzY2F2ZW5nZSBvbmUgdG8gYnVpbGQgdGhlCisgIC8vIG9mZnNldCBpbi4KKyAgLy8gRklYTUU6IGZpZ3VyZSBvdXQgd2hhdCBTUEFkaiBpcyBkb2luZyBoZXJlLgorCisgIC8vIEZJWE1FICg2NC1iaXQpOiBVc2UgImZpbmRTY3JhdGNoUmVnaXN0ZXIiLgorICB1bnNpZ25lZCBTUmVnOworICBpZiAoRW5hYmxlUmVnaXN0ZXJTY2F2ZW5naW5nKQorICAgIFNSZWcgPSBmaW5kU2NyYXRjaFJlZ2lzdGVyKElJLCBSUywgJlBQQzo6R1BSQ1JlZ0NsYXNzLCBTUEFkaik7CisgIGVsc2UKKyAgICBTUmVnID0gUFBDOjpSMDsKKworICAvLyBJbnNlcnQgYSBzZXQgb2YgckEgd2l0aCB0aGUgZnVsbCBvZmZzZXQgdmFsdWUgYmVmb3JlIHRoZSBsZCwgc3QsIG9yIGFkZAorICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KFBQQzo6TElTKSwgU1JlZykKKyAgICAuYWRkSW1tKE9mZnNldCA+PiAxNik7CisgIEJ1aWxkTUkoTUJCLCBJSSwgZGwsIFRJSS5nZXQoUFBDOjpPUkkpLCBTUmVnKQorICAgIC5hZGRSZWcoU1JlZywgUmVnU3RhdGU6OktpbGwpCisgICAgLmFkZEltbShPZmZzZXQpOworCisgIC8vIENvbnZlcnQgaW50byBpbmRleGVkIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uOgorICAvLyAKKyAgLy8gICBzdGggMDpyQSwgMTppbW0gMjoockIpID09PiBzdGh4IDA6ckEsIDI6ckIsIDE6cjAKKyAgLy8gICBhZGRpIDA6ckEgMTpyQiwgMiwgaW1tID09PiBhZGQgMDpyQSwgMTpyQiwgMjpyMAorICB1bnNpZ25lZCBPcGVyYW5kQmFzZTsKKworICBpZiAoT3BDICE9IFRhcmdldE9wY29kZTo6SU5MSU5FQVNNKSB7CisgICAgYXNzZXJ0KEltbVRvSWR4TWFwLmNvdW50KE9wQykgJiYKKyAgICAgICAgICAgIk5vIGluZGV4ZWQgZm9ybSBvZiBsb2FkIG9yIHN0b3JlIGF2YWlsYWJsZSEiKTsKKyAgICB1bnNpZ25lZCBOZXdPcGNvZGUgPSBJbW1Ub0lkeE1hcC5maW5kKE9wQyktPnNlY29uZDsKKyAgICBNSS5zZXREZXNjKFRJSS5nZXQoTmV3T3Bjb2RlKSk7CisgICAgT3BlcmFuZEJhc2UgPSAxOworICB9IGVsc2UgeworICAgIE9wZXJhbmRCYXNlID0gT2Zmc2V0T3BlcmFuZE5vOworICB9CisgICAgCisgIHVuc2lnbmVkIFN0YWNrUmVnID0gTUkuZ2V0T3BlcmFuZChGSU9wZXJhbmRObykuZ2V0UmVnKCk7CisgIE1JLmdldE9wZXJhbmQoT3BlcmFuZEJhc2UpLkNoYW5nZVRvUmVnaXN0ZXIoU3RhY2tSZWcsIGZhbHNlKTsKKyAgTUkuZ2V0T3BlcmFuZChPcGVyYW5kQmFzZSArIDEpLkNoYW5nZVRvUmVnaXN0ZXIoU1JlZywgZmFsc2UpOworICByZXR1cm4gMDsKK30KKworLy8vIFZSUmVnTm8gLSBNYXAgZnJvbSBhIG51bWJlcmVkIFZSIHJlZ2lzdGVyIHRvIGl0cyBlbnVtIHZhbHVlLgorLy8vCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgVlJSZWdOb1tdID0geworIFBQQzo6VjAgLCBQUEM6OlYxICwgUFBDOjpWMiAsIFBQQzo6VjMgLCBQUEM6OlY0ICwgUFBDOjpWNSAsIFBQQzo6VjYgLCBQUEM6OlY3ICwKKyBQUEM6OlY4ICwgUFBDOjpWOSAsIFBQQzo6VjEwLCBQUEM6OlYxMSwgUFBDOjpWMTIsIFBQQzo6VjEzLCBQUEM6OlYxNCwgUFBDOjpWMTUsCisgUFBDOjpWMTYsIFBQQzo6VjE3LCBQUEM6OlYxOCwgUFBDOjpWMTksIFBQQzo6VjIwLCBQUEM6OlYyMSwgUFBDOjpWMjIsIFBQQzo6VjIzLAorIFBQQzo6VjI0LCBQUEM6OlYyNSwgUFBDOjpWMjYsIFBQQzo6VjI3LCBQUEM6OlYyOCwgUFBDOjpWMjksIFBQQzo6VjMwLCBQUEM6OlYzMQorfTsKKworLy8vIFJlbW92ZVZSU2F2ZUNvZGUgLSBXZSBoYXZlIGZvdW5kIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBuZWVkIGFueSBjb2RlCisvLy8gdG8gbWFuaXB1bGF0ZSB0aGUgVlJTQVZFIHJlZ2lzdGVyLCBldmVuIHRob3VnaCBpdCB1c2VzIHZlY3RvciByZWdpc3RlcnMuCisvLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIG9ubHkgcmVnaXN0ZXJzIHVzZWQgYXJlIGtub3duIHRvIGJlIGxpdmUgaW4gb3Igb3V0CisvLy8gb2YgdGhlIGZ1bmN0aW9uLiAgUmVtb3ZlIGFsbCBvZiB0aGUgVlJTQVZFIHJlbGF0ZWQgY29kZSBmcm9tIHRoZSBmdW5jdGlvbi4KK3N0YXRpYyB2b2lkIFJlbW92ZVZSU2F2ZUNvZGUoTWFjaGluZUluc3RyICpNSSkgeworICBNYWNoaW5lQmFzaWNCbG9jayAqRW50cnkgPSBNSS0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBFbnRyeS0+Z2V0UGFyZW50KCk7CisKKyAgLy8gV2Uga25vdyB0aGF0IHRoZSBNVFZSU0FWRSBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseSBmb2xsb3dzIE1JLiAgUmVtb3ZlIGl0LgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IE1JOworICArK01CQkk7CisgIGFzc2VydChNQkJJICE9IEVudHJ5LT5lbmQoKSAmJiBNQkJJLT5nZXRPcGNvZGUoKSA9PSBQUEM6Ok1UVlJTQVZFKTsKKyAgTUJCSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIAorICBib29sIFJlbW92ZWRBbGxNVFZSU0FWRXMgPSB0cnVlOworICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYW5kIHJlbW92ZSB0aGUgTVRWUlNBVkUgaW5zdHJ1Y3Rpb24gZnJvbSBhbGwgb2YgdGhlCisgIC8vIGVwaWxvZyBibG9ja3MuCisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBJID0gTUYtPmJlZ2luKCksIEUgPSBNRi0+ZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgLy8gSWYgbGFzdCBpbnN0cnVjdGlvbiBpcyBhIHJldHVybiBpbnN0cnVjdGlvbiwgYWRkIGFuIGVwaWxvZ3VlCisgICAgaWYgKCFJLT5lbXB0eSgpICYmIEktPmJhY2soKS5nZXREZXNjKCkuaXNSZXR1cm4oKSkgeworICAgICAgYm9vbCBGb3VuZEl0ID0gZmFsc2U7CisgICAgICBmb3IgKE1CQkkgPSBJLT5lbmQoKTsgTUJCSSAhPSBJLT5iZWdpbigpOyApIHsKKyAgICAgICAgLS1NQkJJOworICAgICAgICBpZiAoTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gUFBDOjpNVFZSU0FWRSkgeworICAgICAgICAgIE1CQkktPmVyYXNlRnJvbVBhcmVudCgpOyAgLy8gcmVtb3ZlIGl0LgorICAgICAgICAgIEZvdW5kSXQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBSZW1vdmVkQWxsTVRWUlNBVkVzICY9IEZvdW5kSXQ7CisgICAgfQorICB9CisKKyAgLy8gSWYgd2UgZm91bmQgYW5kIHJlbW92ZWQgYWxsIE1UVlJTQVZFIGluc3RydWN0aW9ucywgcmVtb3ZlIHRoZSByZWFkIG9mCisgIC8vIFZSU0FWRSBhcyB3ZWxsLgorICBpZiAoUmVtb3ZlZEFsbE1UVlJTQVZFcykgeworICAgIE1CQkkgPSBNSTsKKyAgICBhc3NlcnQoTUJCSSAhPSBFbnRyeS0+YmVnaW4oKSAmJiAiVVBEQVRFX1ZSU0FWRSBpcyBmaXJzdCBpbnN0ciBpbiBibG9jaz8iKTsKKyAgICAtLU1CQkk7CisgICAgYXNzZXJ0KE1CQkktPmdldE9wY29kZSgpID09IFBQQzo6TUZWUlNBVkUgJiYgIlZSU0FWRSBpbnN0cnMgd2FuZGVyZWQ/Iik7CisgICAgTUJCSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KKyAgCisgIC8vIEZpbmFsbHksIG51a2UgdGhlIFVQREFURV9WUlNBVkUuCisgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsKK30KKworLy8gSGFuZGxlVlJTYXZlVXBkYXRlIC0gTUkgaXMgdGhlIFVQREFURV9WUlNBVkUgaW5zdHJ1Y3Rpb24gaW50cm9kdWNlZCBieSB0aGUKKy8vIGluc3RydWN0aW9uIHNlbGVjdG9yLiAgQmFzZWQgb24gdGhlIHZlY3RvciByZWdpc3RlcnMgdGhhdCBoYXZlIGJlZW4gdXNlZCwKKy8vIHRyYW5zZm9ybSB0aGlzIGludG8gdGhlIGFwcHJvcHJpYXRlIE9SSSBpbnN0cnVjdGlvbi4KK3N0YXRpYyB2b2lkIEhhbmRsZVZSU2F2ZVVwZGF0ZShNYWNoaW5lSW5zdHIgKk1JLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSkgeworICBNYWNoaW5lRnVuY3Rpb24gKk1GID0gTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgRGVidWdMb2MgZGwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKworICB1bnNpZ25lZCBVc2VkUmVnTWFzayA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gMzI7ICsraSkKKyAgICBpZiAoTUYtPmdldFJlZ0luZm8oKS5pc1BoeXNSZWdVc2VkKFZSUmVnTm9baV0pKQorICAgICAgVXNlZFJlZ01hc2sgfD0gMSA8PCAoMzEtaSk7CisgIAorICAvLyBMaXZlIGluIGFuZCBsaXZlIG91dCB2YWx1ZXMgYWxyZWFkeSBtdXN0IGJlIGluIHRoZSBtYXNrLCBzbyBkb24ndCBib3RoZXIKKyAgLy8gbWFya2luZyB0aGVtLgorICBmb3IgKE1hY2hpbmVSZWdpc3RlckluZm86OmxpdmVpbl9pdGVyYXRvcgorICAgICAgIEkgPSBNRi0+Z2V0UmVnSW5mbygpLmxpdmVpbl9iZWdpbigpLAorICAgICAgIEUgPSBNRi0+Z2V0UmVnSW5mbygpLmxpdmVpbl9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICB1bnNpZ25lZCBSZWdObyA9IFBQQ1JlZ2lzdGVySW5mbzo6Z2V0UmVnaXN0ZXJOdW1iZXJpbmcoSS0+Zmlyc3QpOworICAgIGlmIChWUlJlZ05vW1JlZ05vXSA9PSBJLT5maXJzdCkgICAgICAgIC8vIElmIHRoaXMgcmVhbGx5IGlzIGEgdmVjdG9yIHJlZy4KKyAgICAgIFVzZWRSZWdNYXNrICY9IH4oMSA8PCAoMzEtUmVnTm8pKTsgICAvLyBEb2Vzbid0IG5lZWQgdG8gYmUgbWFya2VkLgorICB9CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6bGl2ZW91dF9pdGVyYXRvcgorICAgICAgIEkgPSBNRi0+Z2V0UmVnSW5mbygpLmxpdmVvdXRfYmVnaW4oKSwKKyAgICAgICBFID0gTUYtPmdldFJlZ0luZm8oKS5saXZlb3V0X2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIHVuc2lnbmVkIFJlZ05vID0gUFBDUmVnaXN0ZXJJbmZvOjpnZXRSZWdpc3Rlck51bWJlcmluZygqSSk7CisgICAgaWYgKFZSUmVnTm9bUmVnTm9dID09ICpJKSAgICAgICAgICAgICAgLy8gSWYgdGhpcyByZWFsbHkgaXMgYSB2ZWN0b3IgcmVnLgorICAgICAgVXNlZFJlZ01hc2sgJj0gfigxIDw8ICgzMS1SZWdObykpOyAgIC8vIERvZXNuJ3QgbmVlZCB0byBiZSBtYXJrZWQuCisgIH0KKyAgCisgIC8vIElmIG5vIHJlZ2lzdGVycyBhcmUgdXNlZCwgdHVybiB0aGlzIGludG8gYSBjb3B5LgorICBpZiAoVXNlZFJlZ01hc2sgPT0gMCkgeworICAgIC8vIFJlbW92ZSBhbGwgVlJTQVZFIGNvZGUuCisgICAgUmVtb3ZlVlJTYXZlQ29kZShNSSk7CisgICAgcmV0dXJuOworICB9CisKKyAgdW5zaWduZWQgU3JjUmVnID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgIHVuc2lnbmVkIERzdFJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworCisgIGlmICgoVXNlZFJlZ01hc2sgJiAweEZGRkYpID09IFVzZWRSZWdNYXNrKSB7CisgICAgaWYgKERzdFJlZyAhPSBTcmNSZWcpCisgICAgICBCdWlsZE1JKCpNSS0+Z2V0UGFyZW50KCksIE1JLCBkbCwgVElJLmdldChQUEM6Ok9SSSksIERzdFJlZykKKyAgICAgICAgLmFkZFJlZyhTcmNSZWcpCisgICAgICAgIC5hZGRJbW0oVXNlZFJlZ01hc2spOworICAgIGVsc2UKKyAgICAgIEJ1aWxkTUkoKk1JLT5nZXRQYXJlbnQoKSwgTUksIGRsLCBUSUkuZ2V0KFBQQzo6T1JJKSwgRHN0UmVnKQorICAgICAgICAuYWRkUmVnKFNyY1JlZywgUmVnU3RhdGU6OktpbGwpCisgICAgICAgIC5hZGRJbW0oVXNlZFJlZ01hc2spOworICB9IGVsc2UgaWYgKChVc2VkUmVnTWFzayAmIDB4RkZGRjAwMDApID09IFVzZWRSZWdNYXNrKSB7CisgICAgaWYgKERzdFJlZyAhPSBTcmNSZWcpCisgICAgICBCdWlsZE1JKCpNSS0+Z2V0UGFyZW50KCksIE1JLCBkbCwgVElJLmdldChQUEM6Ok9SSVMpLCBEc3RSZWcpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnKQorICAgICAgICAuYWRkSW1tKFVzZWRSZWdNYXNrID4+IDE2KTsKKyAgICBlbHNlCisgICAgICBCdWlsZE1JKCpNSS0+Z2V0UGFyZW50KCksIE1JLCBkbCwgVElJLmdldChQUEM6Ok9SSVMpLCBEc3RSZWcpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBSZWdTdGF0ZTo6S2lsbCkKKyAgICAgICAgLmFkZEltbShVc2VkUmVnTWFzayA+PiAxNik7CisgIH0gZWxzZSB7CisgICAgaWYgKERzdFJlZyAhPSBTcmNSZWcpCisgICAgICBCdWlsZE1JKCpNSS0+Z2V0UGFyZW50KCksIE1JLCBkbCwgVElJLmdldChQUEM6Ok9SSVMpLCBEc3RSZWcpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnKQorICAgICAgICAuYWRkSW1tKFVzZWRSZWdNYXNrID4+IDE2KTsKKyAgICBlbHNlCisgICAgICBCdWlsZE1JKCpNSS0+Z2V0UGFyZW50KCksIE1JLCBkbCwgVElJLmdldChQUEM6Ok9SSVMpLCBEc3RSZWcpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBSZWdTdGF0ZTo6S2lsbCkKKyAgICAgICAgLmFkZEltbShVc2VkUmVnTWFzayA+PiAxNik7CisKKyAgICBCdWlsZE1JKCpNSS0+Z2V0UGFyZW50KCksIE1JLCBkbCwgVElJLmdldChQUEM6Ok9SSSksIERzdFJlZykKKyAgICAgIC5hZGRSZWcoRHN0UmVnLCBSZWdTdGF0ZTo6S2lsbCkKKyAgICAgIC5hZGRJbW0oVXNlZFJlZ01hc2sgJiAweEZGRkYpOworICB9CisgIAorICAvLyBSZW1vdmUgdGhlIG9sZCBVUERBVEVfVlJTQVZFIGluc3RydWN0aW9uLgorICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7Cit9CisKKy8vLyBkZXRlcm1pbmVGcmFtZUxheW91dCAtIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgYW5kIG1heGltdW0gY2FsbAorLy8vIGZyYW1lIHNpemUuCit2b2lkIFBQQ1JlZ2lzdGVySW5mbzo6ZGV0ZXJtaW5lRnJhbWVMYXlvdXQoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKworICAvLyBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBGcmFtZUluZm8KKyAgdW5zaWduZWQgRnJhbWVTaXplID0gTUZJLT5nZXRTdGFja1NpemUoKTsKKyAgCisgIC8vIEdldCB0aGUgYWxpZ25tZW50cyBwcm92aWRlZCBieSB0aGUgdGFyZ2V0LCBhbmQgdGhlIG1heGltdW0gYWxpZ25tZW50CisgIC8vIChpZiBhbnkpIG9mIHRoZSBmaXhlZCBmcmFtZSBvYmplY3RzLgorICB1bnNpZ25lZCBNYXhBbGlnbiA9IE1GSS0+Z2V0TWF4QWxpZ25tZW50KCk7CisgIHVuc2lnbmVkIFRhcmdldEFsaWduID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrQWxpZ25tZW50KCk7CisgIHVuc2lnbmVkIEFsaWduTWFzayA9IFRhcmdldEFsaWduIC0gMTsgIC8vCisKKyAgLy8gSWYgd2UgYXJlIGEgbGVhZiBmdW5jdGlvbiwgYW5kIHVzZSB1cCB0byAyMjQgYnl0ZXMgb2Ygc3RhY2sgc3BhY2UsCisgIC8vIGRvbid0IGhhdmUgYSBmcmFtZSBwb2ludGVyLCBjYWxscywgb3IgZHluYW1pYyBhbGxvY2EgdGhlbiB3ZSBkbyBub3QgbmVlZAorICAvLyB0byBhZGp1c3QgdGhlIHN0YWNrIHBvaW50ZXIgKHdlIGZpdCBpbiB0aGUgUmVkIFpvbmUpLgorICBib29sIERpc2FibGVSZWRab25lID0gTUYuZ2V0RnVuY3Rpb24oKS0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6Tm9SZWRab25lKTsKKyAgLy8gRklYTUUgU1ZSNCBUaGUgMzItYml0IFNWUjQgQUJJIGhhcyBubyByZWQgem9uZS4KKyAgaWYgKCFEaXNhYmxlUmVkWm9uZSAmJgorICAgICAgRnJhbWVTaXplIDw9IDIyNCAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml0cyBpbiByZWQgem9uZS4KKyAgICAgICFNRkktPmhhc1ZhclNpemVkT2JqZWN0cygpICYmICAgICAgICAgICAgICAgIC8vIE5vIGR5bmFtaWMgYWxsb2NhLgorICAgICAgIU1GSS0+YWRqdXN0c1N0YWNrKCkgJiYgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gY2FsbHMuCisgICAgICAoIUFMSUdOX1NUQUNLIHx8IE1heEFsaWduIDw9IFRhcmdldEFsaWduKSkgeyAvLyBObyBzcGVjaWFsIGFsaWdubWVudC4KKyAgICAvLyBObyBuZWVkIGZvciBmcmFtZQorICAgIE1GSS0+c2V0U3RhY2tTaXplKDApOworICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gR2V0IHRoZSBtYXhpbXVtIGNhbGwgZnJhbWUgc2l6ZSBvZiBhbGwgdGhlIGNhbGxzLgorICB1bnNpZ25lZCBtYXhDYWxsRnJhbWVTaXplID0gTUZJLT5nZXRNYXhDYWxsRnJhbWVTaXplKCk7CisgIAorICAvLyBNYXhpbXVtIGNhbGwgZnJhbWUgbmVlZHMgdG8gYmUgYXQgbGVhc3QgYmlnIGVub3VnaCBmb3IgbGlua2FnZSBhbmQgOCBhcmdzLgorICB1bnNpZ25lZCBtaW5DYWxsRnJhbWVTaXplID0KKyAgICBQUENGcmFtZUluZm86OmdldE1pbkNhbGxGcmFtZVNpemUoU3VidGFyZ2V0LmlzUFBDNjQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnRhcmdldC5pc0RhcndpbkFCSSgpKTsKKyAgbWF4Q2FsbEZyYW1lU2l6ZSA9IHN0ZDo6bWF4KG1heENhbGxGcmFtZVNpemUsIG1pbkNhbGxGcmFtZVNpemUpOworCisgIC8vIElmIHdlIGhhdmUgZHluYW1pYyBhbGxvY2EgdGhlbiBtYXhDYWxsRnJhbWVTaXplIG5lZWRzIHRvIGJlIGFsaWduZWQgc28KKyAgLy8gdGhhdCBhbGxvY2F0aW9ucyB3aWxsIGJlIGFsaWduZWQuCisgIGlmIChNRkktPmhhc1ZhclNpemVkT2JqZWN0cygpKQorICAgIG1heENhbGxGcmFtZVNpemUgPSAobWF4Q2FsbEZyYW1lU2l6ZSArIEFsaWduTWFzaykgJiB+QWxpZ25NYXNrOworICAKKyAgLy8gVXBkYXRlIG1heGltdW0gY2FsbCBmcmFtZSBzaXplLgorICBNRkktPnNldE1heENhbGxGcmFtZVNpemUobWF4Q2FsbEZyYW1lU2l6ZSk7CisgIAorICAvLyBJbmNsdWRlIGNhbGwgZnJhbWUgc2l6ZSBpbiB0b3RhbC4KKyAgRnJhbWVTaXplICs9IG1heENhbGxGcmFtZVNpemU7CisgIAorICAvLyBNYWtlIHN1cmUgdGhlIGZyYW1lIGlzIGFsaWduZWQuCisgIEZyYW1lU2l6ZSA9IChGcmFtZVNpemUgKyBBbGlnbk1hc2spICYgfkFsaWduTWFzazsKKworICAvLyBVcGRhdGUgZnJhbWUgaW5mby4KKyAgTUZJLT5zZXRTdGFja1NpemUoRnJhbWVTaXplKTsKK30KKwordm9pZAorUFBDUmVnaXN0ZXJJbmZvOjpwcm9jZXNzRnVuY3Rpb25CZWZvcmVDYWxsZWVTYXZlZFNjYW4oTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMpIGNvbnN0IHsKKyAgLy8gIFNhdmUgYW5kIGNsZWFyIHRoZSBMUiBzdGF0ZS4KKyAgUFBDRnVuY3Rpb25JbmZvICpGSSA9IE1GLmdldEluZm88UFBDRnVuY3Rpb25JbmZvPigpOworICB1bnNpZ25lZCBMUiA9IGdldFJBUmVnaXN0ZXIoKTsKKyAgRkktPnNldE11c3RTYXZlTFIoTXVzdFNhdmVMUihNRiwgTFIpKTsKKyAgTUYuZ2V0UmVnSW5mbygpLnNldFBoeXNSZWdVbnVzZWQoTFIpOworCisgIC8vICBTYXZlIFIzMSBpZiBuZWNlc3NhcnkKKyAgaW50IEZQU0kgPSBGSS0+Z2V0RnJhbWVQb2ludGVyU2F2ZUluZGV4KCk7CisgIGJvb2wgaXNQUEM2NCA9IFN1YnRhcmdldC5pc1BQQzY0KCk7CisgIGJvb2wgaXNEYXJ3aW5BQkkgID0gU3VidGFyZ2V0LmlzRGFyd2luQUJJKCk7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworIAorICAvLyBJZiB0aGUgZnJhbWUgcG9pbnRlciBzYXZlIGluZGV4IGhhc24ndCBiZWVuIGRlZmluZWQgeWV0LgorICBpZiAoIUZQU0kgJiYgbmVlZHNGUChNRikpIHsKKyAgICAvLyBGaW5kIG91dCB3aGF0IHRoZSBmaXggb2Zmc2V0IG9mIHRoZSBmcmFtZSBwb2ludGVyIHNhdmUgYXJlYS4KKyAgICBpbnQgRlBPZmZzZXQgPSBQUENGcmFtZUluZm86OmdldEZyYW1lUG9pbnRlclNhdmVPZmZzZXQoaXNQUEM2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEYXJ3aW5BQkkpOworICAgIC8vIEFsbG9jYXRlIHRoZSBmcmFtZSBpbmRleCBmb3IgZnJhbWUgcG9pbnRlciBzYXZlIGFyZWEuCisgICAgRlBTSSA9IE1GLmdldEZyYW1lSW5mbygpLT5DcmVhdGVGaXhlZE9iamVjdChpc1BQQzY0PyA4IDogNCwgRlBPZmZzZXQsIHRydWUpOworICAgIC8vIFNhdmUgdGhlIHJlc3VsdC4KKyAgICBGSS0+c2V0RnJhbWVQb2ludGVyU2F2ZUluZGV4KEZQU0kpOyAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIC8vIFJlc2VydmUgc3RhY2sgc3BhY2UgdG8gbW92ZSB0aGUgbGlua2FnZSBhcmVhIHRvIGluIGNhc2Ugb2YgYSB0YWlsIGNhbGwuCisgIGludCBUQ1NQRGVsdGEgPSAwOworICBpZiAoR3VhcmFudGVlZFRhaWxDYWxsT3B0ICYmIChUQ1NQRGVsdGEgPSBGSS0+Z2V0VGFpbENhbGxTUERlbHRhKCkpIDwgMCkgeworICAgIE1GLmdldEZyYW1lSW5mbygpLT5DcmVhdGVGaXhlZE9iamVjdCgtMSAqIFRDU1BEZWx0YSwgVENTUERlbHRhLCB0cnVlKTsKKyAgfQorICAKKyAgLy8gUmVzZXJ2ZSBhIHNsb3QgY2xvc2VzdCB0byBTUCBvciBmcmFtZSBwb2ludGVyIGlmIHdlIGhhdmUgYSBkeW5hbGxvYyBvcgorICAvLyBhIGxhcmdlIHN0YWNrLCB3aGljaCB3aWxsIHJlcXVpcmUgc2NhdmVuZ2luZyBhIHJlZ2lzdGVyIHRvIG1hdGVyaWFsaXplIGEKKyAgLy8gbGFyZ2Ugb2Zmc2V0LgorICAvLyBGSVhNRTogdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGNoZWNrIHN0YWNrIHNpemUsIHNvIGlzIGEgYml0IHBlc3NpbWlzdGljCisgIC8vIEZJWE1FOiBkb2Vzbid0IGRldGVjdCB3aGV0aGVyIG9yIG5vdCB3ZSBuZWVkIHRvIHNwaWxsIHZYWCwgd2hpY2ggcmVxdWlyZXMKKyAgLy8gICAgICAgIHIwIGZvciBub3cuCisKKyAgaWYgKEVuYWJsZVJlZ2lzdGVyU2NhdmVuZ2luZykgLy8gRklYTUUgKDY0LWJpdCk6IEVuYWJsZS4KKyAgICBpZiAobmVlZHNGUChNRikgfHwgc3BpbGxzQ1IoTUYpKSB7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpHUFJDID0gJlBQQzo6R1BSQ1JlZ0NsYXNzOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqRzhSQyA9ICZQUEM6Okc4UkNSZWdDbGFzczsKKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gaXNQUEM2NCA/IEc4UkMgOiBHUFJDOworICAgICAgUlMtPnNldFNjYXZlbmdpbmdGcmFtZUluZGV4KE1GSS0+Q3JlYXRlU3RhY2tPYmplY3QoUkMtPmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDLT5nZXRBbGlnbm1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisgICAgfQorfQorCit2b2lkCitQUENSZWdpc3RlckluZm86OnByb2Nlc3NGdW5jdGlvbkJlZm9yZUZyYW1lRmluYWxpemVkKE1hY2hpbmVGdW5jdGlvbiAmTUYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKKyAgLy8gRWFybHkgZXhpdCBpZiBub3QgdXNpbmcgdGhlIFNWUjQgQUJJLgorICBpZiAoIVN1YnRhcmdldC5pc1NWUjRBQkkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEdldCBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgaW5mb3JtYXRpb24uCisgIE1hY2hpbmVGcmFtZUluZm8gKkZGSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZDU0kgPSBGRkktPmdldENhbGxlZVNhdmVkSW5mbygpOworCisgIC8vIEVhcmx5IGV4aXQgaWYgbm8gY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyBhcmUgbW9kaWZpZWQhCisgIGlmIChDU0kuZW1wdHkoKSAmJiAhbmVlZHNGUChNRikpIHsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIHVuc2lnbmVkIE1pbkdQUiA9IFBQQzo6UjMxOworICB1bnNpZ25lZCBNaW5HOFIgPSBQUEM6OlgzMTsKKyAgdW5zaWduZWQgTWluRlBSID0gUFBDOjpGMzE7CisgIHVuc2lnbmVkIE1pblZSID0gUFBDOjpWMzE7CisgIAorICBib29sIEhhc0dQU2F2ZUFyZWEgPSBmYWxzZTsKKyAgYm9vbCBIYXNHOFNhdmVBcmVhID0gZmFsc2U7CisgIGJvb2wgSGFzRlBTYXZlQXJlYSA9IGZhbHNlOworICBib29sIEhhc0NSU2F2ZUFyZWEgPSBmYWxzZTsKKyAgYm9vbCBIYXNWUlNBVkVTYXZlQXJlYSA9IGZhbHNlOworICBib29sIEhhc1ZSU2F2ZUFyZWEgPSBmYWxzZTsKKyAgCisgIFNtYWxsVmVjdG9yPENhbGxlZVNhdmVkSW5mbywgMTg+IEdQUmVnczsKKyAgU21hbGxWZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvLCAxOD4gRzhSZWdzOworICBTbWFsbFZlY3RvcjxDYWxsZWVTYXZlZEluZm8sIDE4PiBGUFJlZ3M7CisgIFNtYWxsVmVjdG9yPENhbGxlZVNhdmVkSW5mbywgMTg+IFZSZWdzOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gQ1NJW2ldLmdldFJlZygpOworICAgIGlmIChQUEM6OkdQUkNSZWdpc3RlckNsYXNzLT5jb250YWlucyhSZWcpKSB7CisgICAgICBIYXNHUFNhdmVBcmVhID0gdHJ1ZTsKKyAgICAgIAorICAgICAgR1BSZWdzLnB1c2hfYmFjayhDU0lbaV0pOworICAgICAgCisgICAgICBpZiAoUmVnIDwgTWluR1BSKSB7CisgICAgICAgIE1pbkdQUiA9IFJlZzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFBQQzo6RzhSQ1JlZ2lzdGVyQ2xhc3MtPmNvbnRhaW5zKFJlZykpIHsKKyAgICAgIEhhc0c4U2F2ZUFyZWEgPSB0cnVlOworCisgICAgICBHOFJlZ3MucHVzaF9iYWNrKENTSVtpXSk7CisKKyAgICAgIGlmIChSZWcgPCBNaW5HOFIpIHsKKyAgICAgICAgTWluRzhSID0gUmVnOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoUFBDOjpGOFJDUmVnaXN0ZXJDbGFzcy0+Y29udGFpbnMoUmVnKSkgeworICAgICAgSGFzRlBTYXZlQXJlYSA9IHRydWU7CisgICAgICAKKyAgICAgIEZQUmVncy5wdXNoX2JhY2soQ1NJW2ldKTsKKyAgICAgIAorICAgICAgaWYgKFJlZyA8IE1pbkZQUikgeworICAgICAgICBNaW5GUFIgPSBSZWc7CisgICAgICB9CisvLyBGSVhNRSBTVlI0OiBEaXNhYmxlIENSIHNhdmUgYXJlYSBmb3Igbm93LgorICAgIH0gZWxzZSBpZiAoUFBDOjpDUkJJVFJDUmVnaXN0ZXJDbGFzcy0+Y29udGFpbnMoUmVnKQorICAgICAgICAgICAgICAgfHwgUFBDOjpDUlJDUmVnaXN0ZXJDbGFzcy0+Y29udGFpbnMoUmVnKSkgeworLy8gICAgICBIYXNDUlNhdmVBcmVhID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKFBQQzo6VlJTQVZFUkNSZWdpc3RlckNsYXNzLT5jb250YWlucyhSZWcpKSB7CisgICAgICBIYXNWUlNBVkVTYXZlQXJlYSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChQUEM6OlZSUkNSZWdpc3RlckNsYXNzLT5jb250YWlucyhSZWcpKSB7CisgICAgICBIYXNWUlNhdmVBcmVhID0gdHJ1ZTsKKyAgICAgIAorICAgICAgVlJlZ3MucHVzaF9iYWNrKENTSVtpXSk7CisgICAgICAKKyAgICAgIGlmIChSZWcgPCBNaW5WUikgeworICAgICAgICBNaW5WUiA9IFJlZzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBSZWdpc3RlckNsYXNzISIpOworICAgIH0KKyAgfQorCisgIFBQQ0Z1bmN0aW9uSW5mbyAqUEZJID0gTUYuZ2V0SW5mbzxQUENGdW5jdGlvbkluZm8+KCk7CisgIAorICBpbnQ2NF90IExvd2VyQm91bmQgPSAwOworCisgIC8vIFRha2UgaW50byBhY2NvdW50IHN0YWNrIHNwYWNlIHJlc2VydmVkIGZvciB0YWlsIGNhbGxzLgorICBpbnQgVENTUERlbHRhID0gMDsKKyAgaWYgKEd1YXJhbnRlZWRUYWlsQ2FsbE9wdCAmJiAoVENTUERlbHRhID0gUEZJLT5nZXRUYWlsQ2FsbFNQRGVsdGEoKSkgPCAwKSB7CisgICAgTG93ZXJCb3VuZCA9IFRDU1BEZWx0YTsKKyAgfQorCisgIC8vIFRoZSBGbG9hdGluZy1wb2ludCByZWdpc3RlciBzYXZlIGFyZWEgaXMgcmlnaHQgYmVsb3cgdGhlIGJhY2sgY2hhaW4gd29yZAorICAvLyBvZiB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUuCisgIGlmIChIYXNGUFNhdmVBcmVhKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZQUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpbnQgRkkgPSBGUFJlZ3NbaV0uZ2V0RnJhbWVJZHgoKTsKKyAgICAgIAorICAgICAgRkZJLT5zZXRPYmplY3RPZmZzZXQoRkksIExvd2VyQm91bmQgKyBGRkktPmdldE9iamVjdE9mZnNldChGSSkpOworICAgIH0KKyAgICAKKyAgICBMb3dlckJvdW5kIC09ICgzMSAtIGdldFJlZ2lzdGVyTnVtYmVyaW5nKE1pbkZQUikgKyAxKSAqIDg7IAorICB9CisKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3RlciBpcyBhbGxvY2F0ZWQuIElmIHNvLCBtYWtlIHN1cmUgaXQKKyAgLy8gaXMgc3BpbGxlZCB0byB0aGUgY29ycmVjdCBvZmZzZXQuCisgIGlmIChuZWVkc0ZQKE1GKSkgeworICAgIEhhc0dQU2F2ZUFyZWEgPSB0cnVlOworICAgIAorICAgIGludCBGSSA9IFBGSS0+Z2V0RnJhbWVQb2ludGVyU2F2ZUluZGV4KCk7CisgICAgYXNzZXJ0KEZJICYmICJObyBGcmFtZSBQb2ludGVyIFNhdmUgU2xvdCEiKTsKKyAgICAKKyAgICBGRkktPnNldE9iamVjdE9mZnNldChGSSwgTG93ZXJCb3VuZCArIEZGSS0+Z2V0T2JqZWN0T2Zmc2V0KEZJKSk7CisgIH0KKyAgCisgIC8vIEdlbmVyYWwgcmVnaXN0ZXIgc2F2ZSBhcmVhIHN0YXJ0cyByaWdodCBiZWxvdyB0aGUgRmxvYXRpbmctcG9pbnQKKyAgLy8gcmVnaXN0ZXIgc2F2ZSBhcmVhLgorICBpZiAoSGFzR1BTYXZlQXJlYSB8fCBIYXNHOFNhdmVBcmVhKSB7CisgICAgLy8gTW92ZSBnZW5lcmFsIHJlZ2lzdGVyIHNhdmUgYXJlYSBzcGlsbCBzbG90cyBkb3duLCB0YWtpbmcgaW50byBhY2NvdW50CisgICAgLy8gdGhlIHNpemUgb2YgdGhlIEZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIHNhdmUgYXJlYS4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gR1BSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGludCBGSSA9IEdQUmVnc1tpXS5nZXRGcmFtZUlkeCgpOworICAgICAgCisgICAgICBGRkktPnNldE9iamVjdE9mZnNldChGSSwgTG93ZXJCb3VuZCArIEZGSS0+Z2V0T2JqZWN0T2Zmc2V0KEZJKSk7CisgICAgfQorICAgIAorICAgIC8vIE1vdmUgZ2VuZXJhbCByZWdpc3RlciBzYXZlIGFyZWEgc3BpbGwgc2xvdHMgZG93biwgdGFraW5nIGludG8gYWNjb3VudAorICAgIC8vIHRoZSBzaXplIG9mIHRoZSBGbG9hdGluZy1wb2ludCByZWdpc3RlciBzYXZlIGFyZWEuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEc4UmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpbnQgRkkgPSBHOFJlZ3NbaV0uZ2V0RnJhbWVJZHgoKTsKKworICAgICAgRkZJLT5zZXRPYmplY3RPZmZzZXQoRkksIExvd2VyQm91bmQgKyBGRkktPmdldE9iamVjdE9mZnNldChGSSkpOworICAgIH0KKworICAgIHVuc2lnbmVkIE1pblJlZyA9IHN0ZDo6bWluPHVuc2lnbmVkPihnZXRSZWdpc3Rlck51bWJlcmluZyhNaW5HUFIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWdpc3Rlck51bWJlcmluZyhNaW5HOFIpKTsKKworICAgIGlmIChTdWJ0YXJnZXQuaXNQUEM2NCgpKSB7CisgICAgICBMb3dlckJvdW5kIC09ICgzMSAtIE1pblJlZyArIDEpICogODsKKyAgICB9IGVsc2UgeworICAgICAgTG93ZXJCb3VuZCAtPSAoMzEgLSBNaW5SZWcgKyAxKSAqIDQ7CisgICAgfQorICB9CisgIAorICAvLyBUaGUgQ1Igc2F2ZSBhcmVhIGlzIGJlbG93IHRoZSBnZW5lcmFsIHJlZ2lzdGVyIHNhdmUgYXJlYS4KKyAgaWYgKEhhc0NSU2F2ZUFyZWEpIHsKKyAgICAvLyBGSVhNRSBTVlI0OiBJcyBpdCBhY3R1YWxseSBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGVsZW1lbnRzIGluIENTSQorICAgIC8vICAgICAgICAgICAgIHdoaWNoIGhhdmUgdGhlIENSL0NSQklUIHJlZ2lzdGVyIGNsYXNzPworICAgIC8vIEFkanVzdCB0aGUgZnJhbWUgaW5kZXggb2YgdGhlIENSIHNwaWxsIHNsb3QuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaV0uZ2V0UmVnKCk7CisgICAgCisgICAgICBpZiAoUFBDOjpDUkJJVFJDUmVnaXN0ZXJDbGFzcy0+Y29udGFpbnMoUmVnKSB8fAorICAgICAgICAgIFBQQzo6Q1JSQ1JlZ2lzdGVyQ2xhc3MtPmNvbnRhaW5zKFJlZykpIHsKKyAgICAgICAgaW50IEZJID0gQ1NJW2ldLmdldEZyYW1lSWR4KCk7CisKKyAgICAgICAgRkZJLT5zZXRPYmplY3RPZmZzZXQoRkksIExvd2VyQm91bmQgKyBGRkktPmdldE9iamVjdE9mZnNldChGSSkpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBMb3dlckJvdW5kIC09IDQ7IC8vIFRoZSBDUiBzYXZlIGFyZWEgaXMgYWx3YXlzIDQgYnl0ZXMgbG9uZy4KKyAgfQorICAKKyAgaWYgKEhhc1ZSU0FWRVNhdmVBcmVhKSB7CisgICAgLy8gRklYTUUgU1ZSNDogSXMgaXQgYWN0dWFsbHkgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBlbGVtZW50cyBpbiBDU0kKKyAgICAvLyAgICAgICAgICAgICB3aGljaCBoYXZlIHRoZSBWUlNBVkUgcmVnaXN0ZXIgY2xhc3M/CisgICAgLy8gQWRqdXN0IHRoZSBmcmFtZSBpbmRleCBvZiB0aGUgVlJTQVZFIHNwaWxsIHNsb3QuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaV0uZ2V0UmVnKCk7CisgICAgCisgICAgICBpZiAoUFBDOjpWUlNBVkVSQ1JlZ2lzdGVyQ2xhc3MtPmNvbnRhaW5zKFJlZykpIHsKKyAgICAgICAgaW50IEZJID0gQ1NJW2ldLmdldEZyYW1lSWR4KCk7CisKKyAgICAgICAgRkZJLT5zZXRPYmplY3RPZmZzZXQoRkksIExvd2VyQm91bmQgKyBGRkktPmdldE9iamVjdE9mZnNldChGSSkpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBMb3dlckJvdW5kIC09IDQ7IC8vIFRoZSBWUlNBVkUgc2F2ZSBhcmVhIGlzIGFsd2F5cyA0IGJ5dGVzIGxvbmcuCisgIH0KKyAgCisgIGlmIChIYXNWUlNhdmVBcmVhKSB7CisgICAgLy8gSW5zZXJ0IGFsaWdubWVudCBwYWRkaW5nLCB3ZSBuZWVkIDE2LWJ5dGUgYWxpZ25tZW50LgorICAgIExvd2VyQm91bmQgPSAoTG93ZXJCb3VuZCAtIDE1KSAmIH4oMTUpOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpbnQgRkkgPSBWUmVnc1tpXS5nZXRGcmFtZUlkeCgpOworICAgICAgCisgICAgICBGRkktPnNldE9iamVjdE9mZnNldChGSSwgTG93ZXJCb3VuZCArIEZGSS0+Z2V0T2JqZWN0T2Zmc2V0KEZJKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK1BQQ1JlZ2lzdGVySW5mbzo6ZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9IE1GLmZyb250KCk7ICAgLy8gUHJvbG9nIGdvZXMgaW4gZW50cnkgQkIKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBNQkIuYmVnaW4oKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVNb2R1bGVJbmZvICZNTUkgPSBNRi5nZXRNTUkoKTsKKyAgRGVidWdMb2MgZGw7CisgIGJvb2wgbmVlZHNGcmFtZU1vdmVzID0gTU1JLmhhc0RlYnVnSW5mbygpIHx8CisgICAgICAgIU1GLmdldEZ1bmN0aW9uKCktPmRvZXNOb3RUaHJvdygpIHx8CisgICAgICAgVW53aW5kVGFibGVzTWFuZGF0b3J5OworICAKKyAgLy8gUHJlcGFyZSBmb3IgZnJhbWUgaW5mby4KKyAgTUNTeW1ib2wgKkZyYW1lTGFiZWwgPSAwOworCisgIC8vIFNjYW4gdGhlIHByb2xvZywgbG9va2luZyBmb3IgYW4gVVBEQVRFX1ZSU0FWRSBpbnN0cnVjdGlvbi4gIElmIHdlIGZpbmQgaXQsCisgIC8vIHByb2Nlc3MgaXQuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IE1CQkkgIT0gTUJCLmVuZCgpOyArK2ksICsrTUJCSSkgeworICAgIGlmIChNQkJJLT5nZXRPcGNvZGUoKSA9PSBQUEM6OlVQREFURV9WUlNBVkUpIHsKKyAgICAgIEhhbmRsZVZSU2F2ZVVwZGF0ZShNQkJJLCBUSUkpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIAorICAvLyBNb3ZlIE1CQkkgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbi4KKyAgTUJCSSA9IE1CQi5iZWdpbigpOworCisgIC8vIFdvcmsgb3V0IGZyYW1lIHNpemVzLgorICBkZXRlcm1pbmVGcmFtZUxheW91dChNRik7CisgIHVuc2lnbmVkIEZyYW1lU2l6ZSA9IE1GSS0+Z2V0U3RhY2tTaXplKCk7CisgIAorICBpbnQgTmVnRnJhbWVTaXplID0gLUZyYW1lU2l6ZTsKKyAgCisgIC8vIEdldCBwcm9jZXNzb3IgdHlwZS4KKyAgYm9vbCBpc1BQQzY0ID0gU3VidGFyZ2V0LmlzUFBDNjQoKTsKKyAgLy8gR2V0IG9wZXJhdGluZyBzeXN0ZW0KKyAgYm9vbCBpc0RhcndpbkFCSSA9IFN1YnRhcmdldC5pc0RhcndpbkFCSSgpOworICAvLyBDaGVjayBpZiB0aGUgbGluayByZWdpc3RlciAoTFIpIG11c3QgYmUgc2F2ZWQuCisgIFBQQ0Z1bmN0aW9uSW5mbyAqRkkgPSBNRi5nZXRJbmZvPFBQQ0Z1bmN0aW9uSW5mbz4oKTsKKyAgYm9vbCBNdXN0U2F2ZUxSID0gRkktPm11c3RTYXZlTFIoKTsKKyAgLy8gRG8gd2UgaGF2ZSBhIGZyYW1lIHBvaW50ZXIgZm9yIHRoaXMgZnVuY3Rpb24/CisgIGJvb2wgSGFzRlAgPSBoYXNGUChNRikgJiYgRnJhbWVTaXplOworICAKKyAgaW50IExST2Zmc2V0ID0gUFBDRnJhbWVJbmZvOjpnZXRSZXR1cm5TYXZlT2Zmc2V0KGlzUFBDNjQsIGlzRGFyd2luQUJJKTsKKworICBpbnQgRlBPZmZzZXQgPSAwOworICBpZiAoSGFzRlApIHsKKyAgICBpZiAoU3VidGFyZ2V0LmlzU1ZSNEFCSSgpKSB7CisgICAgICBNYWNoaW5lRnJhbWVJbmZvICpGRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgICAgIGludCBGUEluZGV4ID0gRkktPmdldEZyYW1lUG9pbnRlclNhdmVJbmRleCgpOworICAgICAgYXNzZXJ0KEZQSW5kZXggJiYgIk5vIEZyYW1lIFBvaW50ZXIgU2F2ZSBTbG90ISIpOworICAgICAgRlBPZmZzZXQgPSBGRkktPmdldE9iamVjdE9mZnNldChGUEluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgRlBPZmZzZXQgPSBQUENGcmFtZUluZm86OmdldEZyYW1lUG9pbnRlclNhdmVPZmZzZXQoaXNQUEM2NCwgaXNEYXJ3aW5BQkkpOworICAgIH0KKyAgfQorCisgIGlmIChpc1BQQzY0KSB7CisgICAgaWYgKE11c3RTYXZlTFIpCisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpNRkxSOCksIFBQQzo6WDApOworICAgICAgCisgICAgaWYgKEhhc0ZQKQorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6U1REKSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgzMSkKKyAgICAgICAgLmFkZEltbShGUE9mZnNldC80KQorICAgICAgICAuYWRkUmVnKFBQQzo6WDEpOworICAgIAorICAgIGlmIChNdXN0U2F2ZUxSKQorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6U1REKSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgwKQorICAgICAgICAuYWRkSW1tKExST2Zmc2V0IC8gNCkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgxKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoTXVzdFNhdmVMUikKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6Ok1GTFIpLCBQUEM6OlIwKTsKKyAgICAgIAorICAgIGlmIChIYXNGUCkKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlNUVykpCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMzEpCisgICAgICAgIC5hZGRJbW0oRlBPZmZzZXQpCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMSk7CisKKyAgICBpZiAoTXVzdFNhdmVMUikKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlNUVykpCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMCkKKyAgICAgICAgLmFkZEltbShMUk9mZnNldCkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlIxKTsKKyAgfQorICAKKyAgLy8gU2tpcCBpZiBhIGxlYWYgcm91dGluZS4KKyAgaWYgKCFGcmFtZVNpemUpIHJldHVybjsKKyAgCisgIC8vIEdldCBzdGFjayBhbGlnbm1lbnRzLgorICB1bnNpZ25lZCBUYXJnZXRBbGlnbiA9IE1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja0FsaWdubWVudCgpOworICB1bnNpZ25lZCBNYXhBbGlnbiA9IE1GSS0+Z2V0TWF4QWxpZ25tZW50KCk7CisKKyAgLy8gQWRqdXN0IHN0YWNrIHBvaW50ZXI6IHIxICs9IE5lZ0ZyYW1lU2l6ZS4KKyAgLy8gSWYgdGhlcmUgaXMgYSBwcmVmZXJyZWQgc3RhY2sgYWxpZ25tZW50LCBhbGlnbiBSMSBub3cKKyAgaWYgKCFpc1BQQzY0KSB7CisgICAgLy8gUFBDMzIuCisgICAgaWYgKEFMSUdOX1NUQUNLICYmIE1heEFsaWduID4gVGFyZ2V0QWxpZ24pIHsKKyAgICAgIGFzc2VydChpc1Bvd2VyT2YyXzMyKE1heEFsaWduKSAmJiBpc0ludDwxNj4oTWF4QWxpZ24pICYmCisgICAgICAgICAgICAgIkludmFsaWQgYWxpZ25tZW50ISIpOworICAgICAgYXNzZXJ0KGlzSW50PDE2PihOZWdGcmFtZVNpemUpICYmICJVbmhhbmRsZWQgc3RhY2sgc2l6ZSBhbmQgYWxpZ25tZW50ISIpOworCisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpSTFdJTk0pLCBQUEM6OlIwKQorICAgICAgICAuYWRkUmVnKFBQQzo6UjEpCisgICAgICAgIC5hZGRJbW0oMCkKKyAgICAgICAgLmFkZEltbSgzMiAtIExvZzJfMzIoTWF4QWxpZ24pKQorICAgICAgICAuYWRkSW1tKDMxKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlNVQkZJQykgLFBQQzo6UjApCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMCwgUmVnU3RhdGU6OktpbGwpCisgICAgICAgIC5hZGRJbW0oTmVnRnJhbWVTaXplKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlNUV1VYKSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlIxKQorICAgICAgICAuYWRkUmVnKFBQQzo6UjEpCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMCk7CisgICAgfSBlbHNlIGlmIChpc0ludDwxNj4oTmVnRnJhbWVTaXplKSkgeworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6U1RXVSksIFBQQzo6UjEpCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMSkKKyAgICAgICAgLmFkZEltbShOZWdGcmFtZVNpemUpCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OkxJUyksIFBQQzo6UjApCisgICAgICAgIC5hZGRJbW0oTmVnRnJhbWVTaXplID4+IDE2KTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6Ok9SSSksIFBQQzo6UjApCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMCwgUmVnU3RhdGU6OktpbGwpCisgICAgICAgIC5hZGRJbW0oTmVnRnJhbWVTaXplICYgMHhGRkZGKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlNUV1VYKSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlIxKQorICAgICAgICAuYWRkUmVnKFBQQzo6UjEpCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMCk7CisgICAgfQorICB9IGVsc2UgeyAgICAvLyBQUEM2NC4KKyAgICBpZiAoQUxJR05fU1RBQ0sgJiYgTWF4QWxpZ24gPiBUYXJnZXRBbGlnbikgeworICAgICAgYXNzZXJ0KGlzUG93ZXJPZjJfMzIoTWF4QWxpZ24pICYmIGlzSW50PDE2PihNYXhBbGlnbikgJiYKKyAgICAgICAgICAgICAiSW52YWxpZCBhbGlnbm1lbnQhIik7CisgICAgICBhc3NlcnQoaXNJbnQ8MTY+KE5lZ0ZyYW1lU2l6ZSkgJiYgIlVuaGFuZGxlZCBzdGFjayBzaXplIGFuZCBhbGlnbm1lbnQhIik7CisKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlJMRElDTCksIFBQQzo6WDApCisgICAgICAgIC5hZGRSZWcoUFBDOjpYMSkKKyAgICAgICAgLmFkZEltbSgwKQorICAgICAgICAuYWRkSW1tKDY0IC0gTG9nMl8zMihNYXhBbGlnbikpOworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6U1VCRklDOCksIFBQQzo6WDApCisgICAgICAgIC5hZGRSZWcoUFBDOjpYMCkKKyAgICAgICAgLmFkZEltbShOZWdGcmFtZVNpemUpOworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6U1REVVgpKQorICAgICAgICAuYWRkUmVnKFBQQzo6WDEpCisgICAgICAgIC5hZGRSZWcoUFBDOjpYMSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgwKTsKKyAgICB9IGVsc2UgaWYgKGlzSW50PDE2PihOZWdGcmFtZVNpemUpKSB7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpTVERVKSwgUFBDOjpYMSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgxKQorICAgICAgICAuYWRkSW1tKE5lZ0ZyYW1lU2l6ZSAvIDQpCisgICAgICAgIC5hZGRSZWcoUFBDOjpYMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OkxJUzgpLCBQUEM6OlgwKQorICAgICAgICAuYWRkSW1tKE5lZ0ZyYW1lU2l6ZSA+PiAxNik7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpPUkk4KSwgUFBDOjpYMCkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgwLCBSZWdTdGF0ZTo6S2lsbCkKKyAgICAgICAgLmFkZEltbShOZWdGcmFtZVNpemUgJiAweEZGRkYpOworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6U1REVVgpKQorICAgICAgICAuYWRkUmVnKFBQQzo6WDEpCisgICAgICAgIC5hZGRSZWcoUFBDOjpYMSkKKyAgICAgICAgLmFkZFJlZyhQUEM6OlgwKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnZlY3RvcjxNYWNoaW5lTW92ZT4gJk1vdmVzID0gTU1JLmdldEZyYW1lTW92ZXMoKTsKKyAgCisgIC8vIEFkZCB0aGUgIm1hY2hpbmUgbW92ZXMiIGZvciB0aGUgaW5zdHJ1Y3Rpb25zIHdlIGdlbmVyYXRlZCBhYm92ZSwgYnV0IGluCisgIC8vIHJldmVyc2Ugb3JkZXIuCisgIGlmIChuZWVkc0ZyYW1lTW92ZXMpIHsKKyAgICAvLyBNYXJrIGVmZmVjdGl2ZSBiZWdpbm5pbmcgb2Ygd2hlbiBmcmFtZSBwb2ludGVyIGJlY29tZXMgdmFsaWQuCisgICAgRnJhbWVMYWJlbCA9IE1NSS5nZXRDb250ZXh0KCkuQ3JlYXRlVGVtcFN5bWJvbCgpOworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlBST0xPR19MQUJFTCkpLmFkZFN5bShGcmFtZUxhYmVsKTsKKyAgCisgICAgLy8gU2hvdyB1cGRhdGUgb2YgU1AuCisgICAgaWYgKE5lZ0ZyYW1lU2l6ZSkgeworICAgICAgTWFjaGluZUxvY2F0aW9uIFNQRHN0KE1hY2hpbmVMb2NhdGlvbjo6VmlydHVhbEZQKTsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBTUFNyYyhNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCwgTmVnRnJhbWVTaXplKTsKKyAgICAgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZShGcmFtZUxhYmVsLCBTUERzdCwgU1BTcmMpKTsKKyAgICB9IGVsc2UgeworICAgICAgTWFjaGluZUxvY2F0aW9uIFNQKGlzUFBDNjQgPyBQUEM6OlgzMSA6IFBQQzo6UjMxKTsKKyAgICAgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZShGcmFtZUxhYmVsLCBTUCwgU1ApKTsKKyAgICB9CisgICAgCisgICAgaWYgKEhhc0ZQKSB7CisgICAgICBNYWNoaW5lTG9jYXRpb24gRlBEc3QoTWFjaGluZUxvY2F0aW9uOjpWaXJ0dWFsRlAsIEZQT2Zmc2V0KTsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBGUFNyYyhpc1BQQzY0ID8gUFBDOjpYMzEgOiBQUEM6OlIzMSk7CisgICAgICBNb3Zlcy5wdXNoX2JhY2soTWFjaGluZU1vdmUoRnJhbWVMYWJlbCwgRlBEc3QsIEZQU3JjKSk7CisgICAgfQorCisgICAgaWYgKE11c3RTYXZlTFIpIHsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBMUkRzdChNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCwgTFJPZmZzZXQpOworICAgICAgTWFjaGluZUxvY2F0aW9uIExSU3JjKGlzUFBDNjQgPyBQUEM6OkxSOCA6IFBQQzo6TFIpOworICAgICAgTW92ZXMucHVzaF9iYWNrKE1hY2hpbmVNb3ZlKEZyYW1lTGFiZWwsIExSRHN0LCBMUlNyYykpOworICAgIH0KKyAgfQorCisgIE1DU3ltYm9sICpSZWFkeUxhYmVsID0gMDsKKworICAvLyBJZiB0aGVyZSBpcyBhIGZyYW1lIHBvaW50ZXIsIGNvcHkgUjEgaW50byBSMzEKKyAgaWYgKEhhc0ZQKSB7CisgICAgaWYgKCFpc1BQQzY0KSB7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpPUiksIFBQQzo6UjMxKQorICAgICAgICAuYWRkUmVnKFBQQzo6UjEpCisgICAgICAgIC5hZGRSZWcoUFBDOjpSMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6Ok9SOCksIFBQQzo6WDMxKQorICAgICAgICAuYWRkUmVnKFBQQzo6WDEpCisgICAgICAgIC5hZGRSZWcoUFBDOjpYMSk7CisgICAgfQorCisgICAgaWYgKG5lZWRzRnJhbWVNb3ZlcykgeworICAgICAgUmVhZHlMYWJlbCA9IE1NSS5nZXRDb250ZXh0KCkuQ3JlYXRlVGVtcFN5bWJvbCgpOworCisgICAgICAvLyBNYXJrIGVmZmVjdGl2ZSBiZWdpbm5pbmcgb2Ygd2hlbiBmcmFtZSBwb2ludGVyIGlzIHJlYWR5LgorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6UFJPTE9HX0xBQkVMKSkuYWRkU3ltKFJlYWR5TGFiZWwpOworCisgICAgICBNYWNoaW5lTG9jYXRpb24gRlBEc3QoSGFzRlAgPyAoaXNQUEM2NCA/IFBQQzo6WDMxIDogUFBDOjpSMzEpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1BQQzY0ID8gUFBDOjpYMSA6IFBQQzo6UjEpKTsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBGUFNyYyhNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCk7CisgICAgICBNb3Zlcy5wdXNoX2JhY2soTWFjaGluZU1vdmUoUmVhZHlMYWJlbCwgRlBEc3QsIEZQU3JjKSk7CisgICAgfQorICB9CisKKyAgaWYgKG5lZWRzRnJhbWVNb3ZlcykgeworICAgIE1DU3ltYm9sICpMYWJlbCA9IEhhc0ZQID8gUmVhZHlMYWJlbCA6IEZyYW1lTGFiZWw7CisKKyAgICAvLyBBZGQgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyB0byBtb3ZlIGxpc3QuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJID0gTUZJLT5nZXRDYWxsZWVTYXZlZEluZm8oKTsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gQ1NJLnNpemUoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGludCBPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChDU0lbSV0uZ2V0RnJhbWVJZHgoKSk7CisgICAgICB1bnNpZ25lZCBSZWcgPSBDU0lbSV0uZ2V0UmVnKCk7CisgICAgICBpZiAoUmVnID09IFBQQzo6TFIgfHwgUmVnID09IFBQQzo6TFI4IHx8IFJlZyA9PSBQUEM6OlJNKSBjb250aW51ZTsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBDU0RzdChNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCwgT2Zmc2V0KTsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBDU1NyYyhSZWcpOworICAgICAgTW92ZXMucHVzaF9iYWNrKE1hY2hpbmVNb3ZlKExhYmVsLCBDU0RzdCwgQ1NTcmMpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBQUENSZWdpc3RlckluZm86OmVtaXRFcGlsb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gcHJpb3IoTUJCLmVuZCgpKTsKKyAgdW5zaWduZWQgUmV0T3Bjb2RlID0gTUJCSS0+Z2V0T3Bjb2RlKCk7CisgIERlYnVnTG9jIGRsOworCisgIGFzc2VydCggKFJldE9wY29kZSA9PSBQUEM6OkJMUiB8fAorICAgICAgICAgICBSZXRPcGNvZGUgPT0gUFBDOjpUQ1JFVFVSTnJpIHx8CisgICAgICAgICAgIFJldE9wY29kZSA9PSBQUEM6OlRDUkVUVVJOZGkgfHwKKyAgICAgICAgICAgUmV0T3Bjb2RlID09IFBQQzo6VENSRVRVUk5haSB8fAorICAgICAgICAgICBSZXRPcGNvZGUgPT0gUFBDOjpUQ1JFVFVSTnJpOCB8fAorICAgICAgICAgICBSZXRPcGNvZGUgPT0gUFBDOjpUQ1JFVFVSTmRpOCB8fAorICAgICAgICAgICBSZXRPcGNvZGUgPT0gUFBDOjpUQ1JFVFVSTmFpOCkgJiYKKyAgICAgICAgICJDYW4gb25seSBpbnNlcnQgZXBpbG9nIGludG8gcmV0dXJuaW5nIGJsb2NrcyIpOworCisgIC8vIEdldCBhbGlnbm1lbnQgaW5mbyBzbyB3ZSBrbm93IGhvdyB0byByZXN0b3JlIHIxCisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICB1bnNpZ25lZCBUYXJnZXRBbGlnbiA9IE1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja0FsaWdubWVudCgpOworICB1bnNpZ25lZCBNYXhBbGlnbiA9IE1GSS0+Z2V0TWF4QWxpZ25tZW50KCk7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZyb20gdGhlIEZyYW1lSW5mby4KKyAgaW50IEZyYW1lU2l6ZSA9IE1GSS0+Z2V0U3RhY2tTaXplKCk7CisKKyAgLy8gR2V0IHByb2Nlc3NvciB0eXBlLgorICBib29sIGlzUFBDNjQgPSBTdWJ0YXJnZXQuaXNQUEM2NCgpOworICAvLyBHZXQgb3BlcmF0aW5nIHN5c3RlbQorICBib29sIGlzRGFyd2luQUJJID0gU3VidGFyZ2V0LmlzRGFyd2luQUJJKCk7CisgIC8vIENoZWNrIGlmIHRoZSBsaW5rIHJlZ2lzdGVyIChMUikgaGFzIGJlZW4gc2F2ZWQuCisgIFBQQ0Z1bmN0aW9uSW5mbyAqRkkgPSBNRi5nZXRJbmZvPFBQQ0Z1bmN0aW9uSW5mbz4oKTsKKyAgYm9vbCBNdXN0U2F2ZUxSID0gRkktPm11c3RTYXZlTFIoKTsKKyAgLy8gRG8gd2UgaGF2ZSBhIGZyYW1lIHBvaW50ZXIgZm9yIHRoaXMgZnVuY3Rpb24/CisgIGJvb2wgSGFzRlAgPSBoYXNGUChNRikgJiYgRnJhbWVTaXplOworICAKKyAgaW50IExST2Zmc2V0ID0gUFBDRnJhbWVJbmZvOjpnZXRSZXR1cm5TYXZlT2Zmc2V0KGlzUFBDNjQsIGlzRGFyd2luQUJJKTsKKworICBpbnQgRlBPZmZzZXQgPSAwOworICBpZiAoSGFzRlApIHsKKyAgICBpZiAoU3VidGFyZ2V0LmlzU1ZSNEFCSSgpKSB7CisgICAgICBNYWNoaW5lRnJhbWVJbmZvICpGRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgICAgIGludCBGUEluZGV4ID0gRkktPmdldEZyYW1lUG9pbnRlclNhdmVJbmRleCgpOworICAgICAgYXNzZXJ0KEZQSW5kZXggJiYgIk5vIEZyYW1lIFBvaW50ZXIgU2F2ZSBTbG90ISIpOworICAgICAgRlBPZmZzZXQgPSBGRkktPmdldE9iamVjdE9mZnNldChGUEluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgRlBPZmZzZXQgPSBQUENGcmFtZUluZm86OmdldEZyYW1lUG9pbnRlclNhdmVPZmZzZXQoaXNQUEM2NCwgaXNEYXJ3aW5BQkkpOworICAgIH0KKyAgfQorICAKKyAgYm9vbCBVc2VzVENSZXQgPSAgUmV0T3Bjb2RlID09IFBQQzo6VENSRVRVUk5yaSB8fAorICAgIFJldE9wY29kZSA9PSBQUEM6OlRDUkVUVVJOZGkgfHwKKyAgICBSZXRPcGNvZGUgPT0gUFBDOjpUQ1JFVFVSTmFpIHx8CisgICAgUmV0T3Bjb2RlID09IFBQQzo6VENSRVRVUk5yaTggfHwKKyAgICBSZXRPcGNvZGUgPT0gUFBDOjpUQ1JFVFVSTmRpOCB8fAorICAgIFJldE9wY29kZSA9PSBQUEM6OlRDUkVUVVJOYWk4OworCisgIGlmIChVc2VzVENSZXQpIHsKKyAgICBpbnQgTWF4VENSZXREZWx0YSA9IEZJLT5nZXRUYWlsQ2FsbFNQRGVsdGEoKTsKKyAgICBNYWNoaW5lT3BlcmFuZCAmU3RhY2tBZGp1c3QgPSBNQkJJLT5nZXRPcGVyYW5kKDEpOworICAgIGFzc2VydChTdGFja0FkanVzdC5pc0ltbSgpICYmICJFeHBlY3RpbmcgaW1tZWRpYXRlIHZhbHVlLiIpOworICAgIC8vIEFkanVzdCBzdGFjayBwb2ludGVyLgorICAgIGludCBTdGFja0FkaiA9IFN0YWNrQWRqdXN0LmdldEltbSgpOworICAgIGludCBEZWx0YSA9IFN0YWNrQWRqIC0gTWF4VENSZXREZWx0YTsKKyAgICBhc3NlcnQoKERlbHRhID49IDApICYmICJEZWx0YSBtdXN0IGJlIHBvc2l0aXZlIik7CisgICAgaWYgKE1heFRDUmV0RGVsdGE+MCkKKyAgICAgIEZyYW1lU2l6ZSArPSAoU3RhY2tBZGogK0RlbHRhKTsKKyAgICBlbHNlCisgICAgICBGcmFtZVNpemUgKz0gU3RhY2tBZGo7CisgIH0KKworICBpZiAoRnJhbWVTaXplKSB7CisgICAgLy8gVGhlIGxvYWRlZCAob3IgcGVyc2lzdGVudCkgc3RhY2sgcG9pbnRlciB2YWx1ZSBpcyBvZmZzZXQgYnkgdGhlICdzdHd1JworICAgIC8vIG9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbi4gIEFkZCB0aGlzIG9mZnNldCBiYWNrIG5vdy4KKyAgICBpZiAoIWlzUFBDNjQpIHsKKyAgICAgIC8vIElmIHRoaXMgZnVuY3Rpb24gY29udGFpbmVkIGEgZmFzdGNjIGNhbGwgYW5kIEd1YXJhbnRlZWRUYWlsQ2FsbE9wdCBpcworICAgICAgLy8gZW5hYmxlZCAoPT4gaGFzRmFzdENhbGwoKT09dHJ1ZSkgdGhlIGZhc3RjYyBjYWxsIG1pZ2h0IGNvbnRhaW4gYSB0YWlsCisgICAgICAvLyBjYWxsIHdoaWNoIGludmFsaWRhdGVzIHRoZSBzdGFjayBwb2ludGVyIHZhbHVlIGluIFNQKDApLiBTbyB3ZSB1c2UgdGhlCisgICAgICAvLyB2YWx1ZSBvZiBSMzEgaW4gdGhpcyBjYXNlLgorICAgICAgaWYgKEZJLT5oYXNGYXN0Q2FsbCgpICYmIGlzSW50PDE2PihGcmFtZVNpemUpKSB7CisgICAgICAgIGFzc2VydChoYXNGUChNRikgJiYgIkV4cGVjdGluZyBhIHZhbGlkIHRoZSBmcmFtZSBwb2ludGVyLiIpOworICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpBRERJKSwgUFBDOjpSMSkKKyAgICAgICAgICAuYWRkUmVnKFBQQzo6UjMxKS5hZGRJbW0oRnJhbWVTaXplKTsKKyAgICAgIH0gZWxzZSBpZihGSS0+aGFzRmFzdENhbGwoKSkgeworICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpMSVMpLCBQUEM6OlIwKQorICAgICAgICAgIC5hZGRJbW0oRnJhbWVTaXplID4+IDE2KTsKKyAgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6T1JJKSwgUFBDOjpSMCkKKyAgICAgICAgICAuYWRkUmVnKFBQQzo6UjAsIFJlZ1N0YXRlOjpLaWxsKQorICAgICAgICAgIC5hZGRJbW0oRnJhbWVTaXplICYgMHhGRkZGKTsKKyAgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6QURENCkpCisgICAgICAgICAgLmFkZFJlZyhQUEM6OlIxKQorICAgICAgICAgIC5hZGRSZWcoUFBDOjpSMzEpCisgICAgICAgICAgLmFkZFJlZyhQUEM6OlIwKTsKKyAgICAgIH0gZWxzZSBpZiAoaXNJbnQ8MTY+KEZyYW1lU2l6ZSkgJiYKKyAgICAgICAgICAgICAgICAgKCFBTElHTl9TVEFDSyB8fCBUYXJnZXRBbGlnbiA+PSBNYXhBbGlnbikgJiYKKyAgICAgICAgICAgICAgICAgIU1GSS0+aGFzVmFyU2l6ZWRPYmplY3RzKCkpIHsKKyAgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6QURESSksIFBQQzo6UjEpCisgICAgICAgICAgLmFkZFJlZyhQUEM6OlIxKS5hZGRJbW0oRnJhbWVTaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OkxXWiksUFBDOjpSMSkKKyAgICAgICAgICAuYWRkSW1tKDApLmFkZFJlZyhQUEM6OlIxKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKEZJLT5oYXNGYXN0Q2FsbCgpICYmIGlzSW50PDE2PihGcmFtZVNpemUpKSB7CisgICAgICAgIGFzc2VydChoYXNGUChNRikgJiYgIkV4cGVjdGluZyBhIHZhbGlkIHRoZSBmcmFtZSBwb2ludGVyLiIpOworICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpBRERJOCksIFBQQzo6WDEpCisgICAgICAgICAgLmFkZFJlZyhQUEM6OlgzMSkuYWRkSW1tKEZyYW1lU2l6ZSk7CisgICAgICB9IGVsc2UgaWYoRkktPmhhc0Zhc3RDYWxsKCkpIHsKKyAgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6TElTOCksIFBQQzo6WDApCisgICAgICAgICAgLmFkZEltbShGcmFtZVNpemUgPj4gMTYpOworICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpPUkk4KSwgUFBDOjpYMCkKKyAgICAgICAgICAuYWRkUmVnKFBQQzo6WDAsIFJlZ1N0YXRlOjpLaWxsKQorICAgICAgICAgIC5hZGRJbW0oRnJhbWVTaXplICYgMHhGRkZGKTsKKyAgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6QUREOCkpCisgICAgICAgICAgLmFkZFJlZyhQUEM6OlgxKQorICAgICAgICAgIC5hZGRSZWcoUFBDOjpYMzEpCisgICAgICAgICAgLmFkZFJlZyhQUEM6OlgwKTsKKyAgICAgIH0gZWxzZSBpZiAoaXNJbnQ8MTY+KEZyYW1lU2l6ZSkgJiYgVGFyZ2V0QWxpZ24gPj0gTWF4QWxpZ24gJiYKKyAgICAgICAgICAgICFNRkktPmhhc1ZhclNpemVkT2JqZWN0cygpKSB7CisgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OkFEREk4KSwgUFBDOjpYMSkKKyAgICAgICAgICAgLmFkZFJlZyhQUEM6OlgxKS5hZGRJbW0oRnJhbWVTaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OkxEKSwgUFBDOjpYMSkKKyAgICAgICAgICAgLmFkZEltbSgwKS5hZGRSZWcoUFBDOjpYMSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGlzUFBDNjQpIHsKKyAgICBpZiAoTXVzdFNhdmVMUikKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OkxEKSwgUFBDOjpYMCkKKyAgICAgICAgLmFkZEltbShMUk9mZnNldC80KS5hZGRSZWcoUFBDOjpYMSk7CisgICAgICAgIAorICAgIGlmIChIYXNGUCkKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OkxEKSwgUFBDOjpYMzEpCisgICAgICAgIC5hZGRJbW0oRlBPZmZzZXQvNCkuYWRkUmVnKFBQQzo6WDEpOworICAgICAgICAKKyAgICBpZiAoTXVzdFNhdmVMUikKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6Ok1UTFI4KSkuYWRkUmVnKFBQQzo6WDApOworICB9IGVsc2UgeworICAgIGlmIChNdXN0U2F2ZUxSKQorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6TFdaKSwgUFBDOjpSMCkKKyAgICAgICAgICAuYWRkSW1tKExST2Zmc2V0KS5hZGRSZWcoUFBDOjpSMSk7CisgICAgICAgIAorICAgIGlmIChIYXNGUCkKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OkxXWiksIFBQQzo6UjMxKQorICAgICAgICAgIC5hZGRJbW0oRlBPZmZzZXQpLmFkZFJlZyhQUEM6OlIxKTsKKyAgICAgICAgICAKKyAgICBpZiAoTXVzdFNhdmVMUikKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6Ok1UTFIpKS5hZGRSZWcoUFBDOjpSMCk7CisgIH0KKworICAvLyBDYWxsZWUgcG9wIGNhbGxpbmcgY29udmVudGlvbi4gUG9wIHBhcmFtZXRlci9saW5rYWdlIGFyZWEuIFVzZWQgZm9yIHRhaWwKKyAgLy8gY2FsbCBvcHRpbWl6YXRpb24KKyAgaWYgKEd1YXJhbnRlZWRUYWlsQ2FsbE9wdCAmJiBSZXRPcGNvZGUgPT0gUFBDOjpCTFIgJiYKKyAgICAgIE1GLmdldEZ1bmN0aW9uKCktPmdldENhbGxpbmdDb252KCkgPT0gQ2FsbGluZ0NvbnY6OkZhc3QpIHsKKyAgICAgUFBDRnVuY3Rpb25JbmZvICpGSSA9IE1GLmdldEluZm88UFBDRnVuY3Rpb25JbmZvPigpOworICAgICB1bnNpZ25lZCBDYWxsZXJBbGxvY2F0ZWRBbXQgPSBGSS0+Z2V0TWluUmVzZXJ2ZWRBcmVhKCk7CisgICAgIHVuc2lnbmVkIFN0YWNrUmVnID0gaXNQUEM2NCA/IFBQQzo6WDEgOiBQUEM6OlIxOworICAgICB1bnNpZ25lZCBGUFJlZyA9IGlzUFBDNjQgPyBQUEM6OlgzMSA6IFBQQzo6UjMxOworICAgICB1bnNpZ25lZCBUbXBSZWcgPSBpc1BQQzY0ID8gUFBDOjpYMCA6IFBQQzo6UjA7CisgICAgIHVuc2lnbmVkIEFERElJbnN0ciA9IGlzUFBDNjQgPyBQUEM6OkFEREk4IDogUFBDOjpBRERJOworICAgICB1bnNpZ25lZCBBRERJbnN0ciA9IGlzUFBDNjQgPyBQUEM6OkFERDggOiBQUEM6OkFERDQ7CisgICAgIHVuc2lnbmVkIExJU0luc3RyID0gaXNQUEM2NCA/IFBQQzo6TElTOCA6IFBQQzo6TElTOworICAgICB1bnNpZ25lZCBPUklJbnN0ciA9IGlzUFBDNjQgPyBQUEM6Ok9SSTggOiBQUEM6Ok9SSTsKKworICAgICBpZiAoQ2FsbGVyQWxsb2NhdGVkQW10ICYmIGlzSW50PDE2PihDYWxsZXJBbGxvY2F0ZWRBbXQpKSB7CisgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KEFERElJbnN0ciksIFN0YWNrUmVnKQorICAgICAgICAgLmFkZFJlZyhTdGFja1JlZykuYWRkSW1tKENhbGxlckFsbG9jYXRlZEFtdCk7CisgICAgIH0gZWxzZSB7CisgICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KExJU0luc3RyKSwgVG1wUmVnKQorICAgICAgICAgIC5hZGRJbW0oQ2FsbGVyQWxsb2NhdGVkQW10ID4+IDE2KTsKKyAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoT1JJSW5zdHIpLCBUbXBSZWcpCisgICAgICAgICAgLmFkZFJlZyhUbXBSZWcsIFJlZ1N0YXRlOjpLaWxsKQorICAgICAgICAgIC5hZGRJbW0oQ2FsbGVyQWxsb2NhdGVkQW10ICYgMHhGRkZGKTsKKyAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoQURESW5zdHIpKQorICAgICAgICAgIC5hZGRSZWcoU3RhY2tSZWcpCisgICAgICAgICAgLmFkZFJlZyhGUFJlZykKKyAgICAgICAgICAuYWRkUmVnKFRtcFJlZyk7CisgICAgIH0KKyAgfSBlbHNlIGlmIChSZXRPcGNvZGUgPT0gUFBDOjpUQ1JFVFVSTmRpKSB7CisgICAgTUJCSSA9IHByaW9yKE1CQi5lbmQoKSk7CisgICAgTWFjaGluZU9wZXJhbmQgJkp1bXBUYXJnZXQgPSBNQkJJLT5nZXRPcGVyYW5kKDApOworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlRBSUxCKSkuCisgICAgICBhZGRHbG9iYWxBZGRyZXNzKEp1bXBUYXJnZXQuZ2V0R2xvYmFsKCksIEp1bXBUYXJnZXQuZ2V0T2Zmc2V0KCkpOworICB9IGVsc2UgaWYgKFJldE9wY29kZSA9PSBQUEM6OlRDUkVUVVJOcmkpIHsKKyAgICBNQkJJID0gcHJpb3IoTUJCLmVuZCgpKTsKKyAgICBhc3NlcnQoTUJCSS0+Z2V0T3BlcmFuZCgwKS5pc1JlZygpICYmICJFeHBlY3RpbmcgcmVnaXN0ZXIgb3BlcmFuZC4iKTsKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoUFBDOjpUQUlMQkNUUikpOworICB9IGVsc2UgaWYgKFJldE9wY29kZSA9PSBQUEM6OlRDUkVUVVJOYWkpIHsKKyAgICBNQkJJID0gcHJpb3IoTUJCLmVuZCgpKTsKKyAgICBNYWNoaW5lT3BlcmFuZCAmSnVtcFRhcmdldCA9IE1CQkktPmdldE9wZXJhbmQoMCk7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFBQQzo6VEFJTEJBKSkuYWRkSW1tKEp1bXBUYXJnZXQuZ2V0SW1tKCkpOworICB9IGVsc2UgaWYgKFJldE9wY29kZSA9PSBQUEM6OlRDUkVUVVJOZGk4KSB7CisgICAgTUJCSSA9IHByaW9yKE1CQi5lbmQoKSk7CisgICAgTWFjaGluZU9wZXJhbmQgJkp1bXBUYXJnZXQgPSBNQkJJLT5nZXRPcGVyYW5kKDApOworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlRBSUxCOCkpLgorICAgICAgYWRkR2xvYmFsQWRkcmVzcyhKdW1wVGFyZ2V0LmdldEdsb2JhbCgpLCBKdW1wVGFyZ2V0LmdldE9mZnNldCgpKTsKKyAgfSBlbHNlIGlmIChSZXRPcGNvZGUgPT0gUFBDOjpUQ1JFVFVSTnJpOCkgeworICAgIE1CQkkgPSBwcmlvcihNQkIuZW5kKCkpOworICAgIGFzc2VydChNQkJJLT5nZXRPcGVyYW5kKDApLmlzUmVnKCkgJiYgIkV4cGVjdGluZyByZWdpc3RlciBvcGVyYW5kLiIpOworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlRBSUxCQ1RSOCkpOworICB9IGVsc2UgaWYgKFJldE9wY29kZSA9PSBQUEM6OlRDUkVUVVJOYWk4KSB7CisgICAgTUJCSSA9IHByaW9yKE1CQi5lbmQoKSk7CisgICAgTWFjaGluZU9wZXJhbmQgJkp1bXBUYXJnZXQgPSBNQkJJLT5nZXRPcGVyYW5kKDApOworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChQUEM6OlRBSUxCQTgpKS5hZGRJbW0oSnVtcFRhcmdldC5nZXRJbW0oKSk7CisgIH0KK30KKwordW5zaWduZWQgUFBDUmVnaXN0ZXJJbmZvOjpnZXRSQVJlZ2lzdGVyKCkgY29uc3QgeworICByZXR1cm4gIVN1YnRhcmdldC5pc1BQQzY0KCkgPyBQUEM6OkxSIDogUFBDOjpMUjg7Cit9CisKK3Vuc2lnbmVkIFBQQ1JlZ2lzdGVySW5mbzo6Z2V0RnJhbWVSZWdpc3Rlcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIGlmICghU3VidGFyZ2V0LmlzUFBDNjQoKSkKKyAgICByZXR1cm4gaGFzRlAoTUYpID8gUFBDOjpSMzEgOiBQUEM6OlIxOworICBlbHNlCisgICAgcmV0dXJuIGhhc0ZQKE1GKSA/IFBQQzo6WDMxIDogUFBDOjpYMTsKK30KKwordm9pZCBQUENSZWdpc3RlckluZm86OmdldEluaXRpYWxGcmFtZVN0YXRlKHN0ZDo6dmVjdG9yPE1hY2hpbmVNb3ZlPiAmTW92ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeworICAvLyBJbml0aWFsIHN0YXRlIG9mIHRoZSBmcmFtZSBwb2ludGVyIGlzIFIxLgorICBNYWNoaW5lTG9jYXRpb24gRHN0KE1hY2hpbmVMb2NhdGlvbjo6VmlydHVhbEZQKTsKKyAgTWFjaGluZUxvY2F0aW9uIFNyYyhQUEM6OlIxLCAwKTsKKyAgTW92ZXMucHVzaF9iYWNrKE1hY2hpbmVNb3ZlKDAsIERzdCwgU3JjKSk7Cit9CisKK3Vuc2lnbmVkIFBQQ1JlZ2lzdGVySW5mbzo6Z2V0RUhFeGNlcHRpb25SZWdpc3RlcigpIGNvbnN0IHsKKyAgcmV0dXJuICFTdWJ0YXJnZXQuaXNQUEM2NCgpID8gUFBDOjpSMyA6IFBQQzo6WDM7Cit9CisKK3Vuc2lnbmVkIFBQQ1JlZ2lzdGVySW5mbzo6Z2V0RUhIYW5kbGVyUmVnaXN0ZXIoKSBjb25zdCB7CisgIHJldHVybiAhU3VidGFyZ2V0LmlzUFBDNjQoKSA/IFBQQzo6UjQgOiBQUEM6Olg0OworfQorCitpbnQgUFBDUmVnaXN0ZXJJbmZvOjpnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3QgeworICAvLyBGSVhNRTogTW9zdCBwcm9iYWJseSBkd2FyZiBudW1iZXJzIGRpZmZlcnMgZm9yIExpbnV4IGFuZCBEYXJ3aW4KKyAgcmV0dXJuIFBQQ0dlblJlZ2lzdGVySW5mbzo6Z2V0RHdhcmZSZWdOdW1GdWxsKFJlZ051bSwgMCk7Cit9CisKKyNpbmNsdWRlICJQUENHZW5SZWdpc3RlckluZm8uaW5jIgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1JlZ2lzdGVySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1JlZ2lzdGVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjY4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDUmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSw5NSBAQAorLy89PT0tIFBQQ1JlZ2lzdGVySW5mby5oIC0gUG93ZXJQQyBSZWdpc3RlciBJbmZvcm1hdGlvbiBJbXBsIC0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFBvd2VyUEMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbworLy8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQT1dFUlBDMzJfUkVHSVNURVJJTkZPX0gKKyNkZWZpbmUgUE9XRVJQQzMyX1JFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJQUEMuaCIKKyNpbmNsdWRlICJQUENHZW5SZWdpc3RlckluZm8uaC5pbmMiCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBQUENTdWJ0YXJnZXQ7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUeXBlOworCitjbGFzcyBQUENSZWdpc3RlckluZm8gOiBwdWJsaWMgUFBDR2VuUmVnaXN0ZXJJbmZvIHsKKyAgc3RkOjptYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBJbW1Ub0lkeE1hcDsKKyAgY29uc3QgUFBDU3VidGFyZ2V0ICZTdWJ0YXJnZXQ7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJOworcHVibGljOgorICBQUENSZWdpc3RlckluZm8oY29uc3QgUFBDU3VidGFyZ2V0ICZTdWJUYXJnZXQsIGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpKTsKKyAgCisgIC8vLyBnZXRSZWdpc3Rlck51bWJlcmluZyAtIEdpdmVuIHRoZSBlbnVtIHZhbHVlIGZvciBzb21lIHJlZ2lzdGVyLCBlLmcuCisgIC8vLyBQUEM6OkYxNCwgcmV0dXJuIHRoZSBudW1iZXIgdGhhdCBpdCBjb3JyZXNwb25kcyB0byAoZS5nLiAxNCkuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRSZWdpc3Rlck51bWJlcmluZyh1bnNpZ25lZCBSZWdFbnVtKTsKKworICAvLy8gZ2V0UG9pbnRlclJlZ0NsYXNzIC0gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyB0byB1c2UgdG8gaG9sZCBwb2ludGVycy4KKyAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgYWRkcmVzc2luZyBtb2Rlcy4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpnZXRQb2ludGVyUmVnQ2xhc3ModW5zaWduZWQgS2luZD0wKSBjb25zdDsgIAorCisgIC8vLyBDb2RlIEdlbmVyYXRpb24gdmlydHVhbCBtZXRob2RzLi4uCisgIGNvbnN0IHVuc2lnbmVkICpnZXRDYWxsZWVTYXZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uKiBNRiA9IDApIGNvbnN0OworCisgIEJpdFZlY3RvciBnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIHRhcmdldEhhbmRsZXNTdGFja0ZyYW1lUm91bmRpbmcgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBpcworICAvLy8gcmVzcG9uc2libGUgZm9yIHJvdW5kaW5nIHVwIHRoZSBzdGFjayBmcmFtZSAocHJvYmFibHkgYXQgZW1pdFByb2xvZ3VlCisgIC8vLyB0aW1lKS4KKyAgYm9vbCB0YXJnZXRIYW5kbGVzU3RhY2tGcmFtZVJvdW5kaW5nKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyByZXF1aXJlc1JlZ2lzdGVyU2NhdmVuZ2luZyAtIFdlIHJlcXVpcmUgYSByZWdpc3RlciBzY2F2ZW5nZXIuCisgIC8vLyBGSVhNRSAoNjQtYml0KTogU2hvdWxkIGJlIGlubGluZWQuCisgIGJvb2wgcmVxdWlyZXNSZWdpc3RlclNjYXZlbmdpbmcoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgYm9vbCBoYXNGUChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2b2lkIGVsaW1pbmF0ZUNhbGxGcmFtZVBzZXVkb0luc3RyKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgY29uc3Q7CisKKyAgdm9pZCBsb3dlckR5bmFtaWNBbGxvYyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBSZWdTY2F2ZW5nZXIgKlJTKSBjb25zdDsKKyAgdm9pZCBsb3dlckNSU3BpbGxpbmcoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLCB1bnNpZ25lZCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGosIFJlZ1NjYXZlbmdlciAqUlMpIGNvbnN0OworICB1bnNpZ25lZCBlbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGosIEZyYW1lSW5kZXhWYWx1ZSAqVmFsdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMgPSBOVUxMKSBjb25zdDsKKworICAvLy8gZGV0ZXJtaW5lRnJhbWVMYXlvdXQgLSBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGZyYW1lIGFuZCBtYXhpbXVtIGNhbGwKKyAgLy8vIGZyYW1lIHNpemUuCisgIHZvaWQgZGV0ZXJtaW5lRnJhbWVMYXlvdXQoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVDYWxsZWVTYXZlZFNjYW4oTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IE5VTEwpIGNvbnN0OworICB2b2lkIHByb2Nlc3NGdW5jdGlvbkJlZm9yZUZyYW1lRmluYWxpemVkKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIHZvaWQgZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB2b2lkIGVtaXRFcGlsb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdDsKKworICAvLyBEZWJ1ZyBpbmZvcm1hdGlvbiBxdWVyaWVzLgorICB1bnNpZ25lZCBnZXRSQVJlZ2lzdGVyKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIHZvaWQgZ2V0SW5pdGlhbEZyYW1lU3RhdGUoc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+ICZNb3ZlcykgY29uc3Q7CisKKyAgLy8gRXhjZXB0aW9uIGhhbmRsaW5nIHF1ZXJpZXMuCisgIHVuc2lnbmVkIGdldEVIRXhjZXB0aW9uUmVnaXN0ZXIoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0RUhIYW5kbGVyUmVnaXN0ZXIoKSBjb25zdDsKKworICBpbnQgZ2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDUmVnaXN0ZXJJbmZvLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1JlZ2lzdGVySW5mby50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWUzMWVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1JlZ2lzdGVySW5mby50ZApAQCAtMCwwICsxLDM4NiBAQAorLy89PT0tIFBQQ1JlZ2lzdGVySW5mby50ZCAtIFRoZSBQb3dlclBDIFJlZ2lzdGVyIEZpbGUgLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitsZXQgTmFtZXNwYWNlID0gIlBQQyIgaW4gew0KK2RlZiBzdWJfbHQgOiBTdWJSZWdJbmRleDsNCitkZWYgc3ViX2d0IDogU3ViUmVnSW5kZXg7DQorZGVmIHN1Yl9lcSA6IFN1YlJlZ0luZGV4Ow0KK2RlZiBzdWJfdW4gOiBTdWJSZWdJbmRleDsNCitkZWYgc3ViXzMyIDogU3ViUmVnSW5kZXg7DQorfQ0KKw0KKw0KK2NsYXNzIFBQQ1JlZzxzdHJpbmcgbj4gOiBSZWdpc3RlcjxuPiB7DQorICBsZXQgTmFtZXNwYWNlID0gIlBQQyI7DQorfQ0KKw0KKy8vIFdlIGlkZW50aWZ5IGFsbCBvdXIgcmVnaXN0ZXJzIHdpdGggYSA1LWJpdCBJRCwgZm9yIGNvbnNpc3RlbmN5J3Mgc2FrZS4NCisNCisvLyBHUFIgLSBPbmUgb2YgdGhlIDMyIDMyLWJpdCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzDQorY2xhc3MgR1BSPGJpdHM8NT4gbnVtLCBzdHJpbmcgbj4gOiBQUENSZWc8bj4gew0KKyAgZmllbGQgYml0czw1PiBOdW0gPSBudW07DQorfQ0KKw0KKy8vIEdQOCAtIE9uZSBvZiB0aGUgMzIgNjQtYml0IGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMNCitjbGFzcyBHUDg8R1BSIFN1YlJlZywgc3RyaW5nIG4+IDogUFBDUmVnPG4+IHsNCisgIGZpZWxkIGJpdHM8NT4gTnVtID0gU3ViUmVnLk51bTsNCisgIGxldCBTdWJSZWdzID0gW1N1YlJlZ107DQorICBsZXQgU3ViUmVnSW5kaWNlcyA9IFtzdWJfMzJdOw0KK30NCisNCisvLyBTUFIgLSBPbmUgb2YgdGhlIDMyLWJpdCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXJzDQorY2xhc3MgU1BSPGJpdHM8MTA+IG51bSwgc3RyaW5nIG4+IDogUFBDUmVnPG4+IHsNCisgIGZpZWxkIGJpdHM8MTA+IE51bSA9IG51bTsNCit9DQorDQorLy8gRlBSIC0gT25lIG9mIHRoZSAzMiA2NC1iaXQgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzDQorY2xhc3MgRlBSPGJpdHM8NT4gbnVtLCBzdHJpbmcgbj4gOiBQUENSZWc8bj4gew0KKyAgZmllbGQgYml0czw1PiBOdW0gPSBudW07DQorfQ0KKw0KKy8vIFZSIC0gT25lIG9mIHRoZSAzMiAxMjgtYml0IHZlY3RvciByZWdpc3RlcnMNCitjbGFzcyBWUjxiaXRzPDU+IG51bSwgc3RyaW5nIG4+IDogUFBDUmVnPG4+IHsNCisgIGZpZWxkIGJpdHM8NT4gTnVtID0gbnVtOw0KK30NCisNCisvLyBDUiAtIE9uZSBvZiB0aGUgOCA0LWJpdCBjb25kaXRpb24gcmVnaXN0ZXJzDQorY2xhc3MgQ1I8Yml0czwzPiBudW0sIHN0cmluZyBuLCBsaXN0PFJlZ2lzdGVyPiBzdWJyZWdzPiA6IFBQQ1JlZzxuPiB7DQorICBmaWVsZCBiaXRzPDM+IE51bSA9IG51bTsNCisgIGxldCBTdWJSZWdzID0gc3VicmVnczsNCit9DQorDQorLy8gQ1JCSVQgLSBPbmUgb2YgdGhlIDMyIDEtYml0IGNvbmRpdGlvbiByZWdpc3RlciBmaWVsZHMNCitjbGFzcyBDUkJJVDxiaXRzPDU+IG51bSwgc3RyaW5nIG4+IDogUFBDUmVnPG4+IHsNCisgIGZpZWxkIGJpdHM8NT4gTnVtID0gbnVtOw0KK30NCisNCisNCisvLyBHZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzDQorZGVmIFIwICA6IEdQUjwgMCwgICJyMCI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBSMSAgOiBHUFI8IDEsICAicjEiPiwgRHdhcmZSZWdOdW08WzFdPjsNCitkZWYgUjIgIDogR1BSPCAyLCAgInIyIj4sIER3YXJmUmVnTnVtPFsyXT47DQorZGVmIFIzICA6IEdQUjwgMywgICJyMyI+LCBEd2FyZlJlZ051bTxbM10+Ow0KK2RlZiBSNCAgOiBHUFI8IDQsICAicjQiPiwgRHdhcmZSZWdOdW08WzRdPjsNCitkZWYgUjUgIDogR1BSPCA1LCAgInI1Ij4sIER3YXJmUmVnTnVtPFs1XT47DQorZGVmIFI2ICA6IEdQUjwgNiwgICJyNiI+LCBEd2FyZlJlZ051bTxbNl0+Ow0KK2RlZiBSNyAgOiBHUFI8IDcsICAicjciPiwgRHdhcmZSZWdOdW08WzddPjsNCitkZWYgUjggIDogR1BSPCA4LCAgInI4Ij4sIER3YXJmUmVnTnVtPFs4XT47DQorZGVmIFI5ICA6IEdQUjwgOSwgICJyOSI+LCBEd2FyZlJlZ051bTxbOV0+Ow0KK2RlZiBSMTAgOiBHUFI8MTAsICJyMTAiPiwgRHdhcmZSZWdOdW08WzEwXT47DQorZGVmIFIxMSA6IEdQUjwxMSwgInIxMSI+LCBEd2FyZlJlZ051bTxbMTFdPjsNCitkZWYgUjEyIDogR1BSPDEyLCAicjEyIj4sIER3YXJmUmVnTnVtPFsxMl0+Ow0KK2RlZiBSMTMgOiBHUFI8MTMsICJyMTMiPiwgRHdhcmZSZWdOdW08WzEzXT47DQorZGVmIFIxNCA6IEdQUjwxNCwgInIxNCI+LCBEd2FyZlJlZ051bTxbMTRdPjsNCitkZWYgUjE1IDogR1BSPDE1LCAicjE1Ij4sIER3YXJmUmVnTnVtPFsxNV0+Ow0KK2RlZiBSMTYgOiBHUFI8MTYsICJyMTYiPiwgRHdhcmZSZWdOdW08WzE2XT47DQorZGVmIFIxNyA6IEdQUjwxNywgInIxNyI+LCBEd2FyZlJlZ051bTxbMTddPjsNCitkZWYgUjE4IDogR1BSPDE4LCAicjE4Ij4sIER3YXJmUmVnTnVtPFsxOF0+Ow0KK2RlZiBSMTkgOiBHUFI8MTksICJyMTkiPiwgRHdhcmZSZWdOdW08WzE5XT47DQorZGVmIFIyMCA6IEdQUjwyMCwgInIyMCI+LCBEd2FyZlJlZ051bTxbMjBdPjsNCitkZWYgUjIxIDogR1BSPDIxLCAicjIxIj4sIER3YXJmUmVnTnVtPFsyMV0+Ow0KK2RlZiBSMjIgOiBHUFI8MjIsICJyMjIiPiwgRHdhcmZSZWdOdW08WzIyXT47DQorZGVmIFIyMyA6IEdQUjwyMywgInIyMyI+LCBEd2FyZlJlZ051bTxbMjNdPjsNCitkZWYgUjI0IDogR1BSPDI0LCAicjI0Ij4sIER3YXJmUmVnTnVtPFsyNF0+Ow0KK2RlZiBSMjUgOiBHUFI8MjUsICJyMjUiPiwgRHdhcmZSZWdOdW08WzI1XT47DQorZGVmIFIyNiA6IEdQUjwyNiwgInIyNiI+LCBEd2FyZlJlZ051bTxbMjZdPjsNCitkZWYgUjI3IDogR1BSPDI3LCAicjI3Ij4sIER3YXJmUmVnTnVtPFsyN10+Ow0KK2RlZiBSMjggOiBHUFI8MjgsICJyMjgiPiwgRHdhcmZSZWdOdW08WzI4XT47DQorZGVmIFIyOSA6IEdQUjwyOSwgInIyOSI+LCBEd2FyZlJlZ051bTxbMjldPjsNCitkZWYgUjMwIDogR1BSPDMwLCAicjMwIj4sIER3YXJmUmVnTnVtPFszMF0+Ow0KK2RlZiBSMzEgOiBHUFI8MzEsICJyMzEiPiwgRHdhcmZSZWdOdW08WzMxXT47DQorDQorLy8gNjQtYml0IEdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMNCitkZWYgWDAgIDogR1A4PCBSMCwgICJyMCI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBYMSAgOiBHUDg8IFIxLCAgInIxIj4sIER3YXJmUmVnTnVtPFsxXT47DQorZGVmIFgyICA6IEdQODwgUjIsICAicjIiPiwgRHdhcmZSZWdOdW08WzJdPjsNCitkZWYgWDMgIDogR1A4PCBSMywgICJyMyI+LCBEd2FyZlJlZ051bTxbM10+Ow0KK2RlZiBYNCAgOiBHUDg8IFI0LCAgInI0Ij4sIER3YXJmUmVnTnVtPFs0XT47DQorZGVmIFg1ICA6IEdQODwgUjUsICAicjUiPiwgRHdhcmZSZWdOdW08WzVdPjsNCitkZWYgWDYgIDogR1A4PCBSNiwgICJyNiI+LCBEd2FyZlJlZ051bTxbNl0+Ow0KK2RlZiBYNyAgOiBHUDg8IFI3LCAgInI3Ij4sIER3YXJmUmVnTnVtPFs3XT47DQorZGVmIFg4ICA6IEdQODwgUjgsICAicjgiPiwgRHdhcmZSZWdOdW08WzhdPjsNCitkZWYgWDkgIDogR1A4PCBSOSwgICJyOSI+LCBEd2FyZlJlZ051bTxbOV0+Ow0KK2RlZiBYMTAgOiBHUDg8UjEwLCAicjEwIj4sIER3YXJmUmVnTnVtPFsxMF0+Ow0KK2RlZiBYMTEgOiBHUDg8UjExLCAicjExIj4sIER3YXJmUmVnTnVtPFsxMV0+Ow0KK2RlZiBYMTIgOiBHUDg8UjEyLCAicjEyIj4sIER3YXJmUmVnTnVtPFsxMl0+Ow0KK2RlZiBYMTMgOiBHUDg8UjEzLCAicjEzIj4sIER3YXJmUmVnTnVtPFsxM10+Ow0KK2RlZiBYMTQgOiBHUDg8UjE0LCAicjE0Ij4sIER3YXJmUmVnTnVtPFsxNF0+Ow0KK2RlZiBYMTUgOiBHUDg8UjE1LCAicjE1Ij4sIER3YXJmUmVnTnVtPFsxNV0+Ow0KK2RlZiBYMTYgOiBHUDg8UjE2LCAicjE2Ij4sIER3YXJmUmVnTnVtPFsxNl0+Ow0KK2RlZiBYMTcgOiBHUDg8UjE3LCAicjE3Ij4sIER3YXJmUmVnTnVtPFsxN10+Ow0KK2RlZiBYMTggOiBHUDg8UjE4LCAicjE4Ij4sIER3YXJmUmVnTnVtPFsxOF0+Ow0KK2RlZiBYMTkgOiBHUDg8UjE5LCAicjE5Ij4sIER3YXJmUmVnTnVtPFsxOV0+Ow0KK2RlZiBYMjAgOiBHUDg8UjIwLCAicjIwIj4sIER3YXJmUmVnTnVtPFsyMF0+Ow0KK2RlZiBYMjEgOiBHUDg8UjIxLCAicjIxIj4sIER3YXJmUmVnTnVtPFsyMV0+Ow0KK2RlZiBYMjIgOiBHUDg8UjIyLCAicjIyIj4sIER3YXJmUmVnTnVtPFsyMl0+Ow0KK2RlZiBYMjMgOiBHUDg8UjIzLCAicjIzIj4sIER3YXJmUmVnTnVtPFsyM10+Ow0KK2RlZiBYMjQgOiBHUDg8UjI0LCAicjI0Ij4sIER3YXJmUmVnTnVtPFsyNF0+Ow0KK2RlZiBYMjUgOiBHUDg8UjI1LCAicjI1Ij4sIER3YXJmUmVnTnVtPFsyNV0+Ow0KK2RlZiBYMjYgOiBHUDg8UjI2LCAicjI2Ij4sIER3YXJmUmVnTnVtPFsyNl0+Ow0KK2RlZiBYMjcgOiBHUDg8UjI3LCAicjI3Ij4sIER3YXJmUmVnTnVtPFsyN10+Ow0KK2RlZiBYMjggOiBHUDg8UjI4LCAicjI4Ij4sIER3YXJmUmVnTnVtPFsyOF0+Ow0KK2RlZiBYMjkgOiBHUDg8UjI5LCAicjI5Ij4sIER3YXJmUmVnTnVtPFsyOV0+Ow0KK2RlZiBYMzAgOiBHUDg8UjMwLCAicjMwIj4sIER3YXJmUmVnTnVtPFszMF0+Ow0KK2RlZiBYMzEgOiBHUDg8UjMxLCAicjMxIj4sIER3YXJmUmVnTnVtPFszMV0+Ow0KKw0KKy8vIEZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycw0KK2RlZiBGMCAgOiBGUFI8IDAsICAiZjAiPiwgRHdhcmZSZWdOdW08WzMyXT47DQorZGVmIEYxICA6IEZQUjwgMSwgICJmMSI+LCBEd2FyZlJlZ051bTxbMzNdPjsNCitkZWYgRjIgIDogRlBSPCAyLCAgImYyIj4sIER3YXJmUmVnTnVtPFszNF0+Ow0KK2RlZiBGMyAgOiBGUFI8IDMsICAiZjMiPiwgRHdhcmZSZWdOdW08WzM1XT47DQorZGVmIEY0ICA6IEZQUjwgNCwgICJmNCI+LCBEd2FyZlJlZ051bTxbMzZdPjsNCitkZWYgRjUgIDogRlBSPCA1LCAgImY1Ij4sIER3YXJmUmVnTnVtPFszN10+Ow0KK2RlZiBGNiAgOiBGUFI8IDYsICAiZjYiPiwgRHdhcmZSZWdOdW08WzM4XT47DQorZGVmIEY3ICA6IEZQUjwgNywgICJmNyI+LCBEd2FyZlJlZ051bTxbMzldPjsNCitkZWYgRjggIDogRlBSPCA4LCAgImY4Ij4sIER3YXJmUmVnTnVtPFs0MF0+Ow0KK2RlZiBGOSAgOiBGUFI8IDksICAiZjkiPiwgRHdhcmZSZWdOdW08WzQxXT47DQorZGVmIEYxMCA6IEZQUjwxMCwgImYxMCI+LCBEd2FyZlJlZ051bTxbNDJdPjsNCitkZWYgRjExIDogRlBSPDExLCAiZjExIj4sIER3YXJmUmVnTnVtPFs0M10+Ow0KK2RlZiBGMTIgOiBGUFI8MTIsICJmMTIiPiwgRHdhcmZSZWdOdW08WzQ0XT47DQorZGVmIEYxMyA6IEZQUjwxMywgImYxMyI+LCBEd2FyZlJlZ051bTxbNDVdPjsNCitkZWYgRjE0IDogRlBSPDE0LCAiZjE0Ij4sIER3YXJmUmVnTnVtPFs0Nl0+Ow0KK2RlZiBGMTUgOiBGUFI8MTUsICJmMTUiPiwgRHdhcmZSZWdOdW08WzQ3XT47DQorZGVmIEYxNiA6IEZQUjwxNiwgImYxNiI+LCBEd2FyZlJlZ051bTxbNDhdPjsNCitkZWYgRjE3IDogRlBSPDE3LCAiZjE3Ij4sIER3YXJmUmVnTnVtPFs0OV0+Ow0KK2RlZiBGMTggOiBGUFI8MTgsICJmMTgiPiwgRHdhcmZSZWdOdW08WzUwXT47DQorZGVmIEYxOSA6IEZQUjwxOSwgImYxOSI+LCBEd2FyZlJlZ051bTxbNTFdPjsNCitkZWYgRjIwIDogRlBSPDIwLCAiZjIwIj4sIER3YXJmUmVnTnVtPFs1Ml0+Ow0KK2RlZiBGMjEgOiBGUFI8MjEsICJmMjEiPiwgRHdhcmZSZWdOdW08WzUzXT47DQorZGVmIEYyMiA6IEZQUjwyMiwgImYyMiI+LCBEd2FyZlJlZ051bTxbNTRdPjsNCitkZWYgRjIzIDogRlBSPDIzLCAiZjIzIj4sIER3YXJmUmVnTnVtPFs1NV0+Ow0KK2RlZiBGMjQgOiBGUFI8MjQsICJmMjQiPiwgRHdhcmZSZWdOdW08WzU2XT47DQorZGVmIEYyNSA6IEZQUjwyNSwgImYyNSI+LCBEd2FyZlJlZ051bTxbNTddPjsNCitkZWYgRjI2IDogRlBSPDI2LCAiZjI2Ij4sIER3YXJmUmVnTnVtPFs1OF0+Ow0KK2RlZiBGMjcgOiBGUFI8MjcsICJmMjciPiwgRHdhcmZSZWdOdW08WzU5XT47DQorZGVmIEYyOCA6IEZQUjwyOCwgImYyOCI+LCBEd2FyZlJlZ051bTxbNjBdPjsNCitkZWYgRjI5IDogRlBSPDI5LCAiZjI5Ij4sIER3YXJmUmVnTnVtPFs2MV0+Ow0KK2RlZiBGMzAgOiBGUFI8MzAsICJmMzAiPiwgRHdhcmZSZWdOdW08WzYyXT47DQorZGVmIEYzMSA6IEZQUjwzMSwgImYzMSI+LCBEd2FyZlJlZ051bTxbNjNdPjsNCisNCisvLyBWZWN0b3IgcmVnaXN0ZXJzDQorZGVmIFYwICA6IFZSPCAwLCAgInYwIj4sIER3YXJmUmVnTnVtPFs3N10+Ow0KK2RlZiBWMSAgOiBWUjwgMSwgICJ2MSI+LCBEd2FyZlJlZ051bTxbNzhdPjsNCitkZWYgVjIgIDogVlI8IDIsICAidjIiPiwgRHdhcmZSZWdOdW08Wzc5XT47DQorZGVmIFYzICA6IFZSPCAzLCAgInYzIj4sIER3YXJmUmVnTnVtPFs4MF0+Ow0KK2RlZiBWNCAgOiBWUjwgNCwgICJ2NCI+LCBEd2FyZlJlZ051bTxbODFdPjsNCitkZWYgVjUgIDogVlI8IDUsICAidjUiPiwgRHdhcmZSZWdOdW08WzgyXT47DQorZGVmIFY2ICA6IFZSPCA2LCAgInY2Ij4sIER3YXJmUmVnTnVtPFs4M10+Ow0KK2RlZiBWNyAgOiBWUjwgNywgICJ2NyI+LCBEd2FyZlJlZ051bTxbODRdPjsNCitkZWYgVjggIDogVlI8IDgsICAidjgiPiwgRHdhcmZSZWdOdW08Wzg1XT47DQorZGVmIFY5ICA6IFZSPCA5LCAgInY5Ij4sIER3YXJmUmVnTnVtPFs4Nl0+Ow0KK2RlZiBWMTAgOiBWUjwxMCwgInYxMCI+LCBEd2FyZlJlZ051bTxbODddPjsNCitkZWYgVjExIDogVlI8MTEsICJ2MTEiPiwgRHdhcmZSZWdOdW08Wzg4XT47DQorZGVmIFYxMiA6IFZSPDEyLCAidjEyIj4sIER3YXJmUmVnTnVtPFs4OV0+Ow0KK2RlZiBWMTMgOiBWUjwxMywgInYxMyI+LCBEd2FyZlJlZ051bTxbOTBdPjsNCitkZWYgVjE0IDogVlI8MTQsICJ2MTQiPiwgRHdhcmZSZWdOdW08WzkxXT47DQorZGVmIFYxNSA6IFZSPDE1LCAidjE1Ij4sIER3YXJmUmVnTnVtPFs5Ml0+Ow0KK2RlZiBWMTYgOiBWUjwxNiwgInYxNiI+LCBEd2FyZlJlZ051bTxbOTNdPjsNCitkZWYgVjE3IDogVlI8MTcsICJ2MTciPiwgRHdhcmZSZWdOdW08Wzk0XT47DQorZGVmIFYxOCA6IFZSPDE4LCAidjE4Ij4sIER3YXJmUmVnTnVtPFs5NV0+Ow0KK2RlZiBWMTkgOiBWUjwxOSwgInYxOSI+LCBEd2FyZlJlZ051bTxbOTZdPjsNCitkZWYgVjIwIDogVlI8MjAsICJ2MjAiPiwgRHdhcmZSZWdOdW08Wzk3XT47DQorZGVmIFYyMSA6IFZSPDIxLCAidjIxIj4sIER3YXJmUmVnTnVtPFs5OF0+Ow0KK2RlZiBWMjIgOiBWUjwyMiwgInYyMiI+LCBEd2FyZlJlZ051bTxbOTldPjsNCitkZWYgVjIzIDogVlI8MjMsICJ2MjMiPiwgRHdhcmZSZWdOdW08WzEwMF0+Ow0KK2RlZiBWMjQgOiBWUjwyNCwgInYyNCI+LCBEd2FyZlJlZ051bTxbMTAxXT47DQorZGVmIFYyNSA6IFZSPDI1LCAidjI1Ij4sIER3YXJmUmVnTnVtPFsxMDJdPjsNCitkZWYgVjI2IDogVlI8MjYsICJ2MjYiPiwgRHdhcmZSZWdOdW08WzEwM10+Ow0KK2RlZiBWMjcgOiBWUjwyNywgInYyNyI+LCBEd2FyZlJlZ051bTxbMTA0XT47DQorZGVmIFYyOCA6IFZSPDI4LCAidjI4Ij4sIER3YXJmUmVnTnVtPFsxMDVdPjsNCitkZWYgVjI5IDogVlI8MjksICJ2MjkiPiwgRHdhcmZSZWdOdW08WzEwNl0+Ow0KK2RlZiBWMzAgOiBWUjwzMCwgInYzMCI+LCBEd2FyZlJlZ051bTxbMTA3XT47DQorZGVmIFYzMSA6IFZSPDMxLCAidjMxIj4sIER3YXJmUmVnTnVtPFsxMDhdPjsNCisNCisvLyBDb25kaXRpb24gcmVnaXN0ZXIgYml0cw0KK2RlZiBDUjBMVCA6IENSQklUPCAwLCAiMCI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjBHVCA6IENSQklUPCAxLCAiMSI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjBFUSA6IENSQklUPCAyLCAiMiI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjBVTiA6IENSQklUPCAzLCAiMyI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjFMVCA6IENSQklUPCA0LCAiNCI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjFHVCA6IENSQklUPCA1LCAiNSI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjFFUSA6IENSQklUPCA2LCAiNiI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjFVTiA6IENSQklUPCA3LCAiNyI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjJMVCA6IENSQklUPCA4LCAiOCI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjJHVCA6IENSQklUPCA5LCAiOSI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjJFUSA6IENSQklUPDEwLCAiMTAiPiwgRHdhcmZSZWdOdW08WzBdPjsNCitkZWYgQ1IyVU4gOiBDUkJJVDwxMSwgIjExIj4sIER3YXJmUmVnTnVtPFswXT47DQorZGVmIENSM0xUIDogQ1JCSVQ8MTIsICIxMiI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjNHVCA6IENSQklUPDEzLCAiMTMiPiwgRHdhcmZSZWdOdW08WzBdPjsNCitkZWYgQ1IzRVEgOiBDUkJJVDwxNCwgIjE0Ij4sIER3YXJmUmVnTnVtPFswXT47DQorZGVmIENSM1VOIDogQ1JCSVQ8MTUsICIxNSI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjRMVCA6IENSQklUPDE2LCAiMTYiPiwgRHdhcmZSZWdOdW08WzBdPjsNCitkZWYgQ1I0R1QgOiBDUkJJVDwxNywgIjE3Ij4sIER3YXJmUmVnTnVtPFswXT47DQorZGVmIENSNEVRIDogQ1JCSVQ8MTgsICIxOCI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjRVTiA6IENSQklUPDE5LCAiMTkiPiwgRHdhcmZSZWdOdW08WzBdPjsNCitkZWYgQ1I1TFQgOiBDUkJJVDwyMCwgIjIwIj4sIER3YXJmUmVnTnVtPFswXT47DQorZGVmIENSNUdUIDogQ1JCSVQ8MjEsICIyMSI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjVFUSA6IENSQklUPDIyLCAiMjIiPiwgRHdhcmZSZWdOdW08WzBdPjsNCitkZWYgQ1I1VU4gOiBDUkJJVDwyMywgIjIzIj4sIER3YXJmUmVnTnVtPFswXT47DQorZGVmIENSNkxUIDogQ1JCSVQ8MjQsICIyNCI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjZHVCA6IENSQklUPDI1LCAiMjUiPiwgRHdhcmZSZWdOdW08WzBdPjsNCitkZWYgQ1I2RVEgOiBDUkJJVDwyNiwgIjI2Ij4sIER3YXJmUmVnTnVtPFswXT47DQorZGVmIENSNlVOIDogQ1JCSVQ8MjcsICIyNyI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjdMVCA6IENSQklUPDI4LCAiMjgiPiwgRHdhcmZSZWdOdW08WzBdPjsNCitkZWYgQ1I3R1QgOiBDUkJJVDwyOSwgIjI5Ij4sIER3YXJmUmVnTnVtPFswXT47DQorZGVmIENSN0VRIDogQ1JCSVQ8MzAsICIzMCI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KK2RlZiBDUjdVTiA6IENSQklUPDMxLCAiMzEiPiwgRHdhcmZSZWdOdW08WzBdPjsNCisNCisvLyBDb25kaXRpb24gcmVnaXN0ZXJzDQorbGV0IFN1YlJlZ0luZGljZXMgPSBbc3ViX2x0LCBzdWJfZ3QsIHN1Yl9lcSwgc3ViX3VuXSBpbiB7DQorZGVmIENSMCA6IENSPDAsICJjcjAiLCBbQ1IwTFQsIENSMEdULCBDUjBFUSwgQ1IwVU5dPiwgRHdhcmZSZWdOdW08WzY4XT47DQorZGVmIENSMSA6IENSPDEsICJjcjEiLCBbQ1IxTFQsIENSMUdULCBDUjFFUSwgQ1IxVU5dPiwgRHdhcmZSZWdOdW08WzY5XT47DQorZGVmIENSMiA6IENSPDIsICJjcjIiLCBbQ1IyTFQsIENSMkdULCBDUjJFUSwgQ1IyVU5dPiwgRHdhcmZSZWdOdW08WzcwXT47DQorZGVmIENSMyA6IENSPDMsICJjcjMiLCBbQ1IzTFQsIENSM0dULCBDUjNFUSwgQ1IzVU5dPiwgRHdhcmZSZWdOdW08WzcxXT47DQorZGVmIENSNCA6IENSPDQsICJjcjQiLCBbQ1I0TFQsIENSNEdULCBDUjRFUSwgQ1I0VU5dPiwgRHdhcmZSZWdOdW08WzcyXT47DQorZGVmIENSNSA6IENSPDUsICJjcjUiLCBbQ1I1TFQsIENSNUdULCBDUjVFUSwgQ1I1VU5dPiwgRHdhcmZSZWdOdW08WzczXT47DQorZGVmIENSNiA6IENSPDYsICJjcjYiLCBbQ1I2TFQsIENSNkdULCBDUjZFUSwgQ1I2VU5dPiwgRHdhcmZSZWdOdW08Wzc0XT47DQorZGVmIENSNyA6IENSPDcsICJjcjciLCBbQ1I3TFQsIENSN0dULCBDUjdFUSwgQ1I3VU5dPiwgRHdhcmZSZWdOdW08Wzc1XT47DQorfQ0KKw0KKy8vIExpbmsgcmVnaXN0ZXINCitkZWYgTFIgIDogU1BSPDgsICJsciI+LCBEd2FyZlJlZ051bTxbNjVdPjsNCisvL2xldCBBbGlhc2VzID0gW0xSXSBpbg0KK2RlZiBMUjggOiBTUFI8OCwgImxyIj4sIER3YXJmUmVnTnVtPFs2NV0+Ow0KKw0KKy8vIENvdW50IHJlZ2lzdGVyDQorZGVmIENUUiAgOiBTUFI8OSwgImN0ciI+LCBEd2FyZlJlZ051bTxbNjZdPjsNCitkZWYgQ1RSOCA6IFNQUjw5LCAiY3RyIj4sIER3YXJmUmVnTnVtPFs2Nl0+Ow0KKw0KKy8vIFZSc2F2ZSByZWdpc3Rlcg0KK2RlZiBWUlNBVkU6IFNQUjwyNTYsICJWUnNhdmUiPiwgRHdhcmZSZWdOdW08WzEwN10+Ow0KKw0KKy8vIENhcnJ5IGJpdC4gIEluIHRoZSBhcmNoaXRlY3R1cmUgdGhpcyBpcyByZWFsbHkgYml0IDAgb2YgdGhlIFhFUiByZWdpc3Rlcg0KKy8vICh3aGljaCByZWFsbHkgaXMgU1BSIHJlZ2lzdGVyIDEpOyAgdGhpcyBpcyB0aGUgb25seSBiaXQgaW50ZXJlc3RpbmcgdG8gYQ0KKy8vIGNvbXBpbGVyLg0KK2RlZiBDQVJSWTogU1BSPDEsICJjYSI+LCBEd2FyZlJlZ051bTxbMF0+Ow0KKw0KKy8vIEZQIHJvdW5kaW5nIG1vZGU6ICBiaXRzIDMwIGFuZCAzMSBvZiB0aGUgRlAgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVyDQorLy8gVGhpcyBpcyBub3QgYWxsb2NhdGVkIGFzIGEgbm9ybWFsIHJlZ2lzdGVyOyBpdCBhcHBlYXJzIG9ubHkgaW4NCisvLyBVc2VzIGFuZCBEZWZzLiAgVGhlIEFCSSBzYXlzIGl0IG5lZWRzIHRvIGJlIHByZXNlcnZlZCBieSBhIGZ1bmN0aW9uLA0KKy8vIGJ1dCB0aGlzIGlzIG5vdCBhY2hpZXZlZCBieSBzYXZpbmcgYW5kIHJlc3RvcmluZyBpdCBhcyB3aXRoDQorLy8gbW9zdCByZWdpc3RlcnMsIGl0IGhhcyB0byBiZSBkb25lIGluIGNvZGU7IHRvIG1ha2UgdGhpcyB3b3JrIGFsbCB0aGUNCisvLyByZXR1cm4gYW5kIGNhbGwgaW5zdHJ1Y3Rpb25zIGFyZSBkZXNjcmliZWQgYXMgVXNlcyBvZiBSTSwgc28gaW5zdHJ1Y3Rpb25zDQorLy8gdGhhdCBkbyBub3RoaW5nIGJ1dCBjaGFuZ2UgUk0gd2lsbCBub3QgZ2V0IGRlbGV0ZWQuDQorLy8gQWxzbywgaW4gdGhlIGFyY2hpdGVjdHVyZSBpdCBpcyBub3QgcmVhbGx5IGEgU1BSOyA1MTIgaXMgYXJiaXRyYXJ5Lg0KK2RlZiBSTTogU1BSPDUxMiwgIioqUk9VTkRJTkcgTU9ERSoqIj4sIER3YXJmUmVnTnVtPFswXT47DQorDQorLy8vIFJlZ2lzdGVyIGNsYXNzZXMNCisvLyBBbGxvY2F0ZSB2b2xhdGlsZXMgZmlyc3QNCisvLyB0aGVuIG5vbnZvbGF0aWxlcyBpbiByZXZlcnNlIG9yZGVyIHNpbmNlIHN0bXcvbG13IHNhdmUgZnJvbSByTiB0byByMzENCitkZWYgR1BSQyA6IFJlZ2lzdGVyQ2xhc3M8IlBQQyIsIFtpMzJdLCAzMiwNCisgICAgIFtSMiwgUjMsIFI0LCBSNSwgUjYsIFI3LCBSOCwgUjksIFIxMCwgUjExLCBSMTIsDQorICAgICAgUjMwLCBSMjksIFIyOCwgUjI3LCBSMjYsIFIyNSwgUjI0LCBSMjMsIFIyMiwgUjIxLCBSMjAsIFIxOSwgUjE4LCBSMTcsDQorICAgICAgUjE2LCBSMTUsIFIxNCwgUjEzLCBSMzEsIFIwLCBSMSwgTFJdPg0KK3sNCisgIGxldCBNZXRob2RQcm90b3MgPSBbew0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgIH1dOw0KKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7DQorICAgIEdQUkNDbGFzczo6aXRlcmF0b3INCisgICAgR1BSQ0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICAvLyAzMi1iaXQgU1ZSNCBBQkk6IHIyIGlzIHJlc2VydmVkIGZvciB0aGUgT1MuDQorICAgICAgLy8gNjQtYml0IFNWUjQgQUJJOiByMiBpcyByZXNlcnZlZCBmb3IgdGhlIFRPQyBwb2ludGVyLg0KKyAgICAgIC8vIERhcndpbjogUjIgaXMgcmVzZXJ2ZWQgZm9yIENSIHNhdmUvcmVzdG9yZSBzZXF1ZW5jZS4NCisgICAgICByZXR1cm4gYmVnaW4oKSsxOw0KKyAgICB9DQorICAgIEdQUkNDbGFzczo6aXRlcmF0b3INCisgICAgR1BSQ0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgLy8gT24gUFBDNjQsIHIxMyBpcyB0aGUgdGhyZWFkIHBvaW50ZXIuICBOZXZlciBhbGxvY2F0ZSB0aGlzIHJlZ2lzdGVyLg0KKyAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG92ZXJjb25zZXJ2YXRpdmUsIGFzIGl0IGFsc28gcHJldmVudHMgYWxsb2NhdGlvbiBvZg0KKyAgICAgIC8vIFIzMSB3aGVuIHRoZSBGUCBpcyBub3QgbmVlZGVkLg0KKyAgICAgIC8vIFdoZW4gdXNpbmcgdGhlIDMyLWJpdCBTVlI0IEFCSSwgcjEzIGlzIHJlc2VydmVkIGZvciB0aGUgU21hbGwgRGF0YSBBcmVhDQorICAgICAgLy8gcG9pbnRlci4NCisgICAgICBjb25zdCBQUENTdWJ0YXJnZXQgJlN1YnRhcmdldA0KKyAgICAgICAgPSBNRi5nZXRUYXJnZXQoKS5nZXRTdWJ0YXJnZXQ8UFBDU3VidGFyZ2V0PigpOw0KKyAgICAgICAgIA0KKyAgICAgIGlmIChTdWJ0YXJnZXQuaXNQUEM2NCgpIHx8IFN1YnRhcmdldC5pc1NWUjRBQkkoKSkNCisgICAgICAgIHJldHVybiBlbmQoKS01OyAgLy8gZG9uJ3QgYWxsb2NhdGUgUjEzLCBSMzEsIFIwLCBSMSwgTFINCisgICAgICAgIA0KKyAgICAgIGlmIChuZWVkc0ZQKE1GKSkNCisgICAgICAgIHJldHVybiBlbmQoKS00OyAgLy8gZG9uJ3QgYWxsb2NhdGUgUjMxLCBSMCwgUjEsIExSDQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIGVuZCgpLTM7ICAvLyBkb24ndCBhbGxvY2F0ZSBSMCwgUjEsIExSDQorICAgIH0NCisgIH1dOw0KK30NCitkZWYgRzhSQyA6IFJlZ2lzdGVyQ2xhc3M8IlBQQyIsIFtpNjRdLCA2NCwNCisgICAgIFtYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsDQorICAgICAgWDMwLCBYMjksIFgyOCwgWDI3LCBYMjYsIFgyNSwgWDI0LCBYMjMsIFgyMiwgWDIxLCBYMjAsIFgxOSwgWDE4LCBYMTcsDQorICAgICAgWDE2LCBYMTUsIFgxNCwgWDMxLCBYMTMsIFgwLCBYMSwgTFI4XT4NCit7DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBHOFJDQ2xhc3M6Oml0ZXJhdG9yDQorICAgIEc4UkNDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgLy8gNjQtYml0IFNWUjQgQUJJOiByMiBpcyByZXNlcnZlZCBmb3IgdGhlIFRPQyBwb2ludGVyLg0KKyAgICAgIC8vIERhcndpbjogcjIgaXMgcmVzZXJ2ZWQgZm9yIENSIHNhdmUvcmVzdG9yZSBzZXF1ZW5jZS4NCisgICAgICByZXR1cm4gYmVnaW4oKSsxOw0KKyAgICB9DQorICAgIEc4UkNDbGFzczo6aXRlcmF0b3INCisgICAgRzhSQ0NsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgaWYgKG5lZWRzRlAoTUYpKQ0KKyAgICAgICAgcmV0dXJuIGVuZCgpLTU7DQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIGVuZCgpLTQ7DQorICAgIH0NCisgIH1dOw0KK30NCisNCisvLyBBbGxvY2F0ZSB2b2xhdGlsZXMgZmlyc3QsIHRoZW4gbm9uLXZvbGF0aWxlcyBpbiByZXZlcnNlIG9yZGVyLiBXaXRoIHRoZSBTVlI0DQorLy8gQUJJIHRoZSBzaXplIG9mIHRoZSBGbG9hdGluZy1wb2ludCByZWdpc3RlciBzYXZlIGFyZWEgaXMgZGV0ZXJtaW5lZCBieSB0aGUNCisvLyBhbGxvY2F0ZWQgbm9uLXZvbGF0aWxlIHJlZ2lzdGVyIHdpdGggdGhlIGxvd2VzdCByZWdpc3RlciBudW1iZXIsIGFzIEZQDQorLy8gcmVnaXN0ZXIgTiBpcyBzcGlsbGVkIHRvIG9mZnNldCA4ICogKDMyIC0gTikgYmVsb3cgdGhlIGJhY2sgY2hhaW4gd29yZCBvZiB0aGUNCisvLyBwcmV2aW91cyBzdGFjayBmcmFtZS4gQnkgYWxsb2NhdGluZyBub24tdm9sYXRpbGVzIGluIHJldmVyc2Ugb3JkZXIgd2UgbWFrZQ0KKy8vIHN1cmUgdGhhdCB0aGUgRmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIgc2F2ZSBhcmVhIGlzIGFsd2F5cyBhcyBzbWFsbCBhcw0KKy8vIHBvc3NpYmxlIGJlY2F1c2UgdGhlcmUgYXJlbid0IGFueSB1bnVzZWQgc3BpbGwgc2xvdHMuDQorZGVmIEY4UkMgOiBSZWdpc3RlckNsYXNzPCJQUEMiLCBbZjY0XSwgNjQsIFtGMCwgRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjcsDQorICBGOCwgRjksIEYxMCwgRjExLCBGMTIsIEYxMywgRjMxLCBGMzAsIEYyOSwgRjI4LCBGMjcsIEYyNiwgRjI1LCBGMjQsIEYyMywNCisgIEYyMiwgRjIxLCBGMjAsIEYxOSwgRjE4LCBGMTcsIEYxNiwgRjE1LCBGMTRdPjsNCitkZWYgRjRSQyA6IFJlZ2lzdGVyQ2xhc3M8IlBQQyIsIFtmMzJdLCAzMiwgW0YwLCBGMSwgRjIsIEYzLCBGNCwgRjUsIEY2LCBGNywNCisgIEY4LCBGOSwgRjEwLCBGMTEsIEYxMiwgRjEzLCBGMzEsIEYzMCwgRjI5LCBGMjgsIEYyNywgRjI2LCBGMjUsIEYyNCwgRjIzLA0KKyAgRjIyLCBGMjEsIEYyMCwgRjE5LCBGMTgsIEYxNywgRjE2LCBGMTUsIEYxNF0+Ow0KKw0KK2RlZiBWUlJDIDogUmVnaXN0ZXJDbGFzczwiUFBDIiwgW3YxNmk4LHY4aTE2LHY0aTMyLHY0ZjMyXSwgMTI4LA0KKyBbVjIsIFYzLCBWNCwgVjUsIFYwLCBWMSwgDQorICBWNiwgVjcsIFY4LCBWOSwgVjEwLCBWMTEsIFYxMiwgVjEzLCBWMTQsIFYxNSwgVjE2LCBWMTcsIFYxOCwgVjE5LCBWMzEsIFYzMCwNCisgIFYyOSwgVjI4LCBWMjcsIFYyNiwgVjI1LCBWMjQsIFYyMywgVjIyLCBWMjEsIFYyMF0+Ow0KKw0KK2RlZiBDUkJJVFJDIDogUmVnaXN0ZXJDbGFzczwiUFBDIiwgW2kzMl0sIDMyLA0KKyAgW0NSMExULCBDUjBHVCwgQ1IwRVEsIENSMFVOLA0KKyAgIENSMUxULCBDUjFHVCwgQ1IxRVEsIENSMVVOLA0KKyAgIENSMkxULCBDUjJHVCwgQ1IyRVEsIENSMlVOLA0KKyAgIENSM0xULCBDUjNHVCwgQ1IzRVEsIENSM1VOLA0KKyAgIENSNExULCBDUjRHVCwgQ1I0RVEsIENSNFVOLA0KKyAgIENSNUxULCBDUjVHVCwgQ1I1RVEsIENSNVVOLA0KKyAgIENSNkxULCBDUjZHVCwgQ1I2RVEsIENSNlVOLA0KKyAgIENSN0xULCBDUjdHVCwgQ1I3RVEsIENSN1VODQorICBdPg0KK3sNCisgIGxldCBDb3B5Q29zdCA9IC0xOw0KK30NCisNCitkZWYgQ1JSQyA6IFJlZ2lzdGVyQ2xhc3M8IlBQQyIsIFtpMzJdLCAzMiwgW0NSMCwgQ1IxLCBDUjUsIENSNiwgQ1I3LCBDUjIsIA0KKyAgQ1IzLCBDUjRdPg0KK3sNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhDUkJJVFJDIHN1Yl9sdCwgc3ViX2d0LCBzdWJfZXEsIHN1Yl91bildOw0KK30NCisNCitkZWYgQ1RSUkMgOiBSZWdpc3RlckNsYXNzPCJQUEMiLCBbaTMyXSwgMzIsIFtDVFJdPjsNCitkZWYgQ1RSUkM4IDogUmVnaXN0ZXJDbGFzczwiUFBDIiwgW2k2NF0sIDY0LCBbQ1RSOF0+Ow0KK2RlZiBWUlNBVkVSQyA6IFJlZ2lzdGVyQ2xhc3M8IlBQQyIsIFtpMzJdLCAzMiwgW1ZSU0FWRV0+Ow0KK2RlZiBDQVJSWVJDIDogUmVnaXN0ZXJDbGFzczwiUFBDIiwgW2kzMl0sIDMyLCBbQ0FSUlldPiB7DQorICBsZXQgQ29weUNvc3QgPSAtMTsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1JlbG9jYXRpb25zLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDUmVsb2NhdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzNlN2UwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1JlbG9jYXRpb25zLmgKQEAgLTAsMCArMSw1NiBAQAorLy89PT0tIFBQQ1JlbG9jYXRpb25zLmggLSBQUEMzMiBDb2RlIFJlbG9jYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUG93ZXJQQyAzMi1iaXQgdGFyZ2V0LXNwZWNpZmljIHJlbG9jYXRpb24gdHlwZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBQUEMzMlJFTE9DQVRJT05TX0gKKyNkZWZpbmUgUFBDMzJSRUxPQ0FUSU9OU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlbG9jYXRpb24uaCIKKworLy8gSGFjayB0byByaWQgdXMgb2YgYSBQUEMgcHJlLXByb2Nlc3NvciBzeW1ib2wgd2hpY2ggaXMgZXJyb25lb3VzbHkKKy8vIGRlZmluZWQgaW4gYSBQb3dlclBDIGhlYWRlciBmaWxlIChidWcgaW4gTGludXgvUFBDKQorI2lmZGVmIFBQQworI3VuZGVmIFBQQworI2VuZGlmCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgbmFtZXNwYWNlIFBQQyB7CisgICAgZW51bSBSZWxvY2F0aW9uVHlwZSB7CisgICAgICAvLyByZWxvY192YW5pbGxhIC0gQSBzdGFuZGFyZCByZWxvY2F0aW9uLCB3aGVyZSB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgIC8vIHJlbG9jYXRlZCBvYmplY3QgY29tcGxldGVseSBvdmVyd3JpdGVzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLgorICAgICAgcmVsb2NfdmFuaWxsYSwKKyAgICAKKyAgICAgIC8vIHJlbG9jX3BjcmVsX2J4IC0gUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiwgZm9yIHRoZSBiIG9yIGJsIGluc3RydWN0aW9ucy4KKyAgICAgIHJlbG9jX3BjcmVsX2J4LAorCisgICAgICAvLyByZWxvY19wY3JlbF9iY3ggLSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLCBmb3IgQkxULEJMRSxCRVEsQkdFLEJHVCxCTkUsCisgICAgICAvLyBhbmQgb3RoZXIgYmN4IGluc3RydWN0aW9ucy4KKyAgICAgIHJlbG9jX3BjcmVsX2JjeCwKKworICAgICAgLy8gcmVsb2NfYWJzb2x1dGVfaGlnaCAtIEFic29sdXRlIHJlbG9jYXRpb24sIGZvciB0aGUgbG9hZGhpIGluc3RydWN0aW9uCisgICAgICAvLyAod2hpY2ggaXMgcmVhbGx5IGFkZGlzKS4gIEFkZCB0aGUgaGlnaCAxNi1iaXRzIG9mIHRoZSBzcGVjaWZpZWQgZ2xvYmFsCisgICAgICAvLyBhZGRyZXNzIGludG8gdGhlIGxvdyAxNi1iaXRzIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgIHJlbG9jX2Fic29sdXRlX2hpZ2gsCisKKyAgICAgIC8vIHJlbG9jX2Fic29sdXRlX2xvdyAtIEFic29sdXRlIHJlbG9jYXRpb24sIGZvciB0aGUgbGEgaW5zdHJ1Y3Rpb24gKHdoaWNoCisgICAgICAvLyBpcyByZWFsbHkgYW4gYWRkaSkuICBBZGQgdGhlIGxvdyAxNi1iaXRzIG9mIHRoZSBzcGVjaWZpZWQgZ2xvYmFsCisgICAgICAvLyBhZGRyZXNzIGludG8gdGhlIGxvdyAxNi1iaXRzIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgIHJlbG9jX2Fic29sdXRlX2xvdywKKyAgICAgIAorICAgICAgLy8gcmVsb2NfYWJzb2x1dGVfbG93X2l4IC0gQWJzb2x1dGUgcmVsb2NhdGlvbiBmb3IgdGhlIDY0LWJpdCBsb2FkL3N0b3JlCisgICAgICAvLyBpbnN0cnVjdGlvbiB3aGljaCBoYXZlIHR3byBpbXBsaWNpdCB6ZXJvIGJpdHMuCisgICAgICByZWxvY19hYnNvbHV0ZV9sb3dfaXgKKyAgICB9OworICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NjaGVkdWxlLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NjaGVkdWxlLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhY2NmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU2NoZWR1bGUudGQKQEAgLTAsMCArMSw1MDUgQEAKKy8vPT09LSBQUENTY2hlZHVsZS50ZCAtIFBvd2VyUEMgU2NoZWR1bGluZyBEZWZpbml0aW9ucyAtLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBGdW5jdGlvbmFsIHVuaXRzIGFjcm9zcyBQb3dlclBDIGNoaXBzIHNldHMNCisvLw0KK2RlZiBCUFUgICAgOiBGdW5jVW5pdDsgLy8gQnJhbmNoIHVuaXQNCitkZWYgU0xVICAgIDogRnVuY1VuaXQ7IC8vIFN0b3JlL2xvYWQgdW5pdA0KK2RlZiBTUlUgICAgOiBGdW5jVW5pdDsgLy8gc3BlY2lhbCByZWdpc3RlciB1bml0DQorZGVmIElVMSAgICA6IEZ1bmNVbml0OyAvLyBpbnRlZ2VyIHVuaXQgMSAoc2ltcGxlKQ0KK2RlZiBJVTIgICAgOiBGdW5jVW5pdDsgLy8gaW50ZWdlciB1bml0IDIgKGNvbXBsZXgpDQorZGVmIEZQVTEgICA6IEZ1bmNVbml0OyAvLyBmbG9hdGluZyBwb2ludCB1bml0IDENCitkZWYgRlBVMiAgIDogRnVuY1VuaXQ7IC8vIGZsb2F0aW5nIHBvaW50IHVuaXQgMg0KK2RlZiBWUFUgICAgOiBGdW5jVW5pdDsgLy8gdmVjdG9yIHBlcm11dGF0aW9uIHVuaXQNCitkZWYgVklVMSAgIDogRnVuY1VuaXQ7IC8vIHZlY3RvciBpbnRlZ2VyIHVuaXQgMSAoc2ltcGxlKQ0KK2RlZiBWSVUyICAgOiBGdW5jVW5pdDsgLy8gdmVjdG9yIGludGVnZXIgdW5pdCAyIChjb21wbGV4KQ0KK2RlZiBWRlBVICAgOiBGdW5jVW5pdDsgLy8gdmVjdG9yIGZsb2F0aW5nIHBvaW50IHVuaXQNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEluc3RydWN0aW9uIEl0aW5lcmFyeSBjbGFzc2VzIHVzZWQgZm9yIFBvd2VyUEMNCisvLw0KK2RlZiBJbnRHZW5lcmFsICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgSW50Q29tcGFyZSAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIEludERpdkQgICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBJbnREaXZXICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgSW50TUZGUyAgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIEludE1GVlNDUiAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBJbnRNVEZTQjAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgSW50TVRTUkQgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIEludE11bEhEICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBJbnRNdWxIVyAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgSW50TXVsSFdVICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIEludE11bExJICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBJbnRSRklEICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgSW50Um90YXRlRCAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIEludFJvdGF0ZSAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBJbnRTaGlmdCAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgSW50VHJhcEQgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIEludFRyYXBXICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBCckIgICAgICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgQnJDUiAgICAgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIEJyTUNSICAgICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBCck1DUlggICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgTGRTdERDQkEgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIExkU3REQ0JGICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBMZFN0RENCSSAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgTGRTdEdlbmVyYWwgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIExkU3REU1MgICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBMZFN0SUNCSSAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgTGRTdFVYICAgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIExkU3RMRCAgICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBMZFN0TERBUlggICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgTGRTdExGRCAgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIExkU3RMRkRVICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBMZFN0TEhBICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgTGRTdExNVyAgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIExkU3RMVmVjWCAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBMZFN0TFdBICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgTGRTdExXQVJYICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIExkU3RTTEJJQSAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBMZFN0U0xCSUUgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgTGRTdFNURCAgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIExkU3RTVERDWCAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBMZFN0U1RWRUJYICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgTGRTdFNUV0NYICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIExkU3RTeW5jICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBTcHJJU1lOQyAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgU3ByTUZTUiAgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIFNwck1UTVNSICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBTcHJNVFNSICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgU3ByVExCU1lOQyAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIFNwck1GQ1IgICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBTcHJNRk1TUiAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgU3ByTUZTUFIgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIFNwck1GVEIgICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBTcHJNVFNQUiAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgU3ByTVRTUklOICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIFNwclJGSSAgICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBTcHJTQyAgICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgRlBHZW5lcmFsICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIEZQQ29tcGFyZSAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBGUERpdkQgICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgRlBEaXZTICAgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIEZQRnVzZWQgICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBGUFJlcyAgICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgRlBTcXJ0ICAgICAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIFZlY0dlbmVyYWwgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBWZWNGUCAgICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgVmVjRlBDb21wYXJlIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIFZlY0NvbXBsZXggICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBWZWNQZXJtICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCitkZWYgVmVjRlBSb3VuZCAgIDogSW5zdHJJdGluQ2xhc3M7DQorZGVmIFZlY1ZTTCAgICAgICA6IEluc3RySXRpbkNsYXNzOw0KK2RlZiBWZWNWU1IgICAgICAgOiBJbnN0ckl0aW5DbGFzczsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFByb2Nlc3NvciBpbnN0cnVjdGlvbiBpdGluZXJhcmllcy4NCisNCitpbmNsdWRlICJQUENTY2hlZHVsZUczLnRkIg0KK2luY2x1ZGUgIlBQQ1NjaGVkdWxlRzQudGQiDQoraW5jbHVkZSAiUFBDU2NoZWR1bGVHNFBsdXMudGQiDQoraW5jbHVkZSAiUFBDU2NoZWR1bGVHNS50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEluc3RydWN0aW9uIHRvIGl0aW5lcmFyeSBjbGFzcyBtYXAgLSBXaGVuIGFkZCBuZXcgb3Bjb2RlcyB0byB0aGUgc3VwcG9ydGVkDQorLy8gc2V0LCByZWZlciB0byB0aGUgZm9sbG93aW5nIHRhYmxlIHRvIGRldGVybWluZSB3aGljaCBpdGluZXJhcnkgY2xhc3MgdGhlDQorLy8gb3Bjb2RlIGJlbG9uZ3MuDQorLy8NCisvLyAgICBvcGNvZGUgICAgIGl0aW5lcmFyeSBjbGFzcw0KKy8vICAgID09PT09PSAgICAgPT09PT09PT09PT09PT09DQorLy8gICAgYWRkICAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYWRkYyAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYWRkZSAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYWRkaSAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYWRkaWMgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYWRkaWMuICAgICBJbnRHZW5lcmFsDQorLy8gICAgYWRkaXMgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYWRkbWUgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYWRkemUgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYW5kICAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYW5kYyAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgYW5kaS4gICAgICBJbnRHZW5lcmFsDQorLy8gICAgYW5kaXMuICAgICBJbnRHZW5lcmFsDQorLy8gICAgYiAgICAgICAgICBCckINCisvLyAgICBiYyAgICAgICAgIEJyQg0KKy8vICAgIGJjY3RyICAgICAgQnJCDQorLy8gICAgYmNsciAgICAgICBCckINCisvLyAgICBjbXAgICAgICAgIEludENvbXBhcmUNCisvLyAgICBjbXBpICAgICAgIEludENvbXBhcmUNCisvLyAgICBjbXBsICAgICAgIEludENvbXBhcmUNCisvLyAgICBjbXBsaSAgICAgIEludENvbXBhcmUNCisvLyAgICBjbnRsemQgICAgIEludFJvdGF0ZUQNCisvLyAgICBjbnRsencgICAgIEludEdlbmVyYWwNCisvLyAgICBjcmFuZCAgICAgIEJyQ1INCisvLyAgICBjcmFuZGMgICAgIEJyQ1INCisvLyAgICBjcmVxdiAgICAgIEJyQ1INCisvLyAgICBjcm5hbmQgICAgIEJyQ1INCisvLyAgICBjcm5vciAgICAgIEJyQ1INCisvLyAgICBjcm9yICAgICAgIEJyQ1INCisvLyAgICBjcm9yYyAgICAgIEJyQ1INCisvLyAgICBjcnhvciAgICAgIEJyQ1INCisvLyAgICBkY2JhICAgICAgIExkU3REQ0JBDQorLy8gICAgZGNiZiAgICAgICBMZFN0RENCRg0KKy8vICAgIGRjYmkgICAgICAgTGRTdERDQkkNCisvLyAgICBkY2JzdCAgICAgIExkU3REQ0JGDQorLy8gICAgZGNidCAgICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIGRjYnRzdCAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBkY2J6ICAgICAgIExkU3REQ0JGDQorLy8gICAgZGl2ZCAgICAgICBJbnREaXZEDQorLy8gICAgZGl2ZHUgICAgICBJbnREaXZEDQorLy8gICAgZGl2dyAgICAgICBJbnREaXZXDQorLy8gICAgZGl2d3UgICAgICBJbnREaXZXDQorLy8gICAgZHNzICAgICAgICBMZFN0RFNTDQorLy8gICAgZHN0ICAgICAgICBMZFN0RFNTDQorLy8gICAgZHN0c3QgICAgICBMZFN0RFNTDQorLy8gICAgZWNpd3ggICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIGVjb3d4ICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBlaWVpbyAgICAgIExkU3RHZW5lcmFsDQorLy8gICAgZXF2ICAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgZXh0c2IgICAgICBJbnRHZW5lcmFsDQorLy8gICAgZXh0c2ggICAgICBJbnRHZW5lcmFsDQorLy8gICAgZXh0c3cgICAgICBJbnRSb3RhdGVEDQorLy8gICAgZmFicyAgICAgICBGUEdlbmVyYWwNCisvLyAgICBmYWRkICAgICAgIEZQR2VuZXJhbA0KKy8vICAgIGZhZGRzICAgICAgRlBHZW5lcmFsDQorLy8gICAgZmNmaWQgICAgICBGUEdlbmVyYWwNCisvLyAgICBmY21wbyAgICAgIEZQQ29tcGFyZQ0KKy8vICAgIGZjbXB1ICAgICAgRlBDb21wYXJlDQorLy8gICAgZmN0aWQgICAgICBGUEdlbmVyYWwNCisvLyAgICBmY3RpZHogICAgIEZQR2VuZXJhbA0KKy8vICAgIGZjdGl3ICAgICAgRlBHZW5lcmFsDQorLy8gICAgZmN0aXd6ICAgICBGUEdlbmVyYWwNCisvLyAgICBmZGl2ICAgICAgIEZQRGl2RA0KKy8vICAgIGZkaXZzICAgICAgRlBEaXZTDQorLy8gICAgZm1hZGQgICAgICBGUEZ1c2VkDQorLy8gICAgZm1hZGRzICAgICBGUEdlbmVyYWwNCisvLyAgICBmbXIgICAgICAgIEZQR2VuZXJhbA0KKy8vICAgIGZtc3ViICAgICAgRlBGdXNlZA0KKy8vICAgIGZtc3VicyAgICAgRlBHZW5lcmFsDQorLy8gICAgZm11bCAgICAgICBGUEZ1c2VkDQorLy8gICAgZm11bHMgICAgICBGUEdlbmVyYWwNCisvLyAgICBmbmFicyAgICAgIEZQR2VuZXJhbA0KKy8vICAgIGZuZWcgICAgICAgRlBHZW5lcmFsDQorLy8gICAgZm5tYWRkICAgICBGUEZ1c2VkDQorLy8gICAgZm5tYWRkcyAgICBGUEdlbmVyYWwNCisvLyAgICBmbm1zdWIgICAgIEZQRnVzZWQNCisvLyAgICBmbm1zdWJzICAgIEZQR2VuZXJhbA0KKy8vICAgIGZyZXMgICAgICAgRlBSZXMNCisvLyAgICBmcnNwICAgICAgIEZQR2VuZXJhbA0KKy8vICAgIGZyc3FydGUgICAgRlBHZW5lcmFsDQorLy8gICAgZnNlbCAgICAgICBGUEdlbmVyYWwNCisvLyAgICBmc3FydCAgICAgIEZQU3FydA0KKy8vICAgIGZzcXJ0cyAgICAgRlBTcXJ0DQorLy8gICAgZnN1YiAgICAgICBGUEdlbmVyYWwNCisvLyAgICBmc3VicyAgICAgIEZQR2VuZXJhbA0KKy8vICAgIGljYmkgICAgICAgTGRTdElDQkkNCisvLyAgICBpc3luYyAgICAgIFNwcklTWU5DDQorLy8gICAgbGJ6ICAgICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIGxienUgICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBsYnp1eCAgICAgIExkU3RVWA0KKy8vICAgIGxienggICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBsZCAgICAgICAgIExkU3RMRA0KKy8vICAgIGxkYXJ4ICAgICAgTGRTdExEQVJYDQorLy8gICAgbGR1ICAgICAgICBMZFN0TEQNCisvLyAgICBsZHV4ICAgICAgIExkU3RMRA0KKy8vICAgIGxkeCAgICAgICAgTGRTdExEDQorLy8gICAgbGZkICAgICAgICBMZFN0TEZEDQorLy8gICAgbGZkdSAgICAgICBMZFN0TEZEVQ0KKy8vICAgIGxmZHV4ICAgICAgTGRTdExGRFUNCisvLyAgICBsZmR4ICAgICAgIExkU3RMRkRVDQorLy8gICAgbGZzICAgICAgICBMZFN0TEZEVQ0KKy8vICAgIGxmc3UgICAgICAgTGRTdExGRFUNCisvLyAgICBsZnN1eCAgICAgIExkU3RMRkRVDQorLy8gICAgbGZzeCAgICAgICBMZFN0TEZEVQ0KKy8vICAgIGxoYSAgICAgICAgTGRTdExIQQ0KKy8vICAgIGxoYXUgICAgICAgTGRTdExIQQ0KKy8vICAgIGxoYXV4ICAgICAgTGRTdExIQQ0KKy8vICAgIGxoYXggICAgICAgTGRTdExIQQ0KKy8vICAgIGxoYnJ4ICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBsaHogICAgICAgIExkU3RHZW5lcmFsDQorLy8gICAgbGh6dSAgICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIGxoenV4ICAgICAgTGRTdFVYDQorLy8gICAgbGh6eCAgICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIGxtdyAgICAgICAgTGRTdExNVw0KKy8vICAgIGxzd2kgICAgICAgTGRTdExNVw0KKy8vICAgIGxzd3ggICAgICAgTGRTdExNVw0KKy8vICAgIGx2ZWJ4ICAgICAgTGRTdExWZWNYDQorLy8gICAgbHZlaHggICAgICBMZFN0TFZlY1gNCisvLyAgICBsdmV3eCAgICAgIExkU3RMVmVjWA0KKy8vICAgIGx2c2wgICAgICAgTGRTdExWZWNYDQorLy8gICAgbHZzciAgICAgICBMZFN0TFZlY1gNCisvLyAgICBsdnggICAgICAgIExkU3RMVmVjWA0KKy8vICAgIGx2eGwgICAgICAgTGRTdExWZWNYDQorLy8gICAgbHdhICAgICAgICBMZFN0TFdBDQorLy8gICAgbHdhcnggICAgICBMZFN0TFdBUlgNCisvLyAgICBsd2F1eCAgICAgIExkU3RMSEENCisvLyAgICBsd2F4ICAgICAgIExkU3RMSEENCisvLyAgICBsd2JyeCAgICAgIExkU3RHZW5lcmFsDQorLy8gICAgbHd6ICAgICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIGx3enUgICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBsd3p1eCAgICAgIExkU3RVWA0KKy8vICAgIGx3enggICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBtY3JmICAgICAgIEJyTUNSDQorLy8gICAgbWNyZnMgICAgICBGUEdlbmVyYWwNCisvLyAgICBtY3J4ciAgICAgIEJyTUNSWA0KKy8vICAgIG1mY3IgICAgICAgU3ByTUZDUg0KKy8vICAgIG1mZnMgICAgICAgSW50TUZGUw0KKy8vICAgIG1mbXNyICAgICAgU3ByTUZNU1INCisvLyAgICBtZnNwciAgICAgIFNwck1GU1BSDQorLy8gICAgbWZzciAgICAgICBTcHJNRlNSDQorLy8gICAgbWZzcmluICAgICBTcHJNRlNSDQorLy8gICAgbWZ0YiAgICAgICBTcHJNRlRCDQorLy8gICAgbWZ2c2NyICAgICBJbnRNRlZTQ1INCisvLyAgICBtdGNyZiAgICAgIEJyTUNSWA0KKy8vICAgIG10ZnNiMCAgICAgSW50TVRGU0IwDQorLy8gICAgbXRmc2IxICAgICBJbnRNVEZTQjANCisvLyAgICBtdGZzZiAgICAgIEludE1URlNCMA0KKy8vICAgIG10ZnNmaSAgICAgSW50TVRGU0IwDQorLy8gICAgbXRtc3IgICAgICBTcHJNVE1TUg0KKy8vICAgIG10bXNyZCAgICAgTGRTdExEDQorLy8gICAgbXRzcHIgICAgICBTcHJNVFNQUg0KKy8vICAgIG10c3IgICAgICAgU3ByTVRTUg0KKy8vICAgIG10c3JkICAgICAgSW50TVRTUkQNCisvLyAgICBtdHNyZGluICAgIEludE1UU1JEDQorLy8gICAgbXRzcmluICAgICBTcHJNVFNSSU4NCisvLyAgICBtdHZzY3IgICAgIEludE1GVlNDUg0KKy8vICAgIG11bGhkICAgICAgSW50TXVsSEQNCisvLyAgICBtdWxoZHUgICAgIEludE11bEhEDQorLy8gICAgbXVsaHcgICAgICBJbnRNdWxIVw0KKy8vICAgIG11bGh3dSAgICAgSW50TXVsSFdVDQorLy8gICAgbXVsbGQgICAgICBJbnRNdWxIRA0KKy8vICAgIG11bGxpICAgICAgSW50TXVsTEkNCisvLyAgICBtdWxsdyAgICAgIEludE11bEhXDQorLy8gICAgbmFuZCAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgbmVnICAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgbm9yICAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgb3IgICAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgb3JjICAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgb3JpICAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgb3JpcyAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgcmZpICAgICAgICBTcHJSRkkNCisvLyAgICByZmlkICAgICAgIEludFJGSUQNCisvLyAgICBybGRjbCAgICAgIEludFJvdGF0ZUQNCisvLyAgICBybGRjciAgICAgIEludFJvdGF0ZUQNCisvLyAgICBybGRpYyAgICAgIEludFJvdGF0ZUQNCisvLyAgICBybGRpY2wgICAgIEludFJvdGF0ZUQNCisvLyAgICBybGRpY3IgICAgIEludFJvdGF0ZUQNCisvLyAgICBybGRpbWkgICAgIEludFJvdGF0ZUQNCisvLyAgICBybHdpbWkgICAgIEludFJvdGF0ZQ0KKy8vICAgIHJsd2lubSAgICAgSW50R2VuZXJhbA0KKy8vICAgIHJsd25tICAgICAgSW50R2VuZXJhbA0KKy8vICAgIHNjICAgICAgICAgU3ByU0MNCisvLyAgICBzbGJpYSAgICAgIExkU3RTTEJJQQ0KKy8vICAgIHNsYmllICAgICAgTGRTdFNMQklFDQorLy8gICAgc2xkICAgICAgICBJbnRSb3RhdGVEDQorLy8gICAgc2x3ICAgICAgICBJbnRHZW5lcmFsDQorLy8gICAgc3JhZCAgICAgICBJbnRSb3RhdGVEDQorLy8gICAgc3JhZGkgICAgICBJbnRSb3RhdGVEDQorLy8gICAgc3JhdyAgICAgICBJbnRTaGlmdA0KKy8vICAgIHNyYXdpICAgICAgSW50U2hpZnQNCisvLyAgICBzcmQgICAgICAgIEludFJvdGF0ZUQNCisvLyAgICBzcncgICAgICAgIEludEdlbmVyYWwNCisvLyAgICBzdGIgICAgICAgIExkU3RHZW5lcmFsDQorLy8gICAgc3RidSAgICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIHN0YnV4ICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBzdGJ4ICAgICAgIExkU3RHZW5lcmFsDQorLy8gICAgc3RkICAgICAgICBMZFN0U1REDQorLy8gICAgc3RkY3guICAgICBMZFN0U1REQ1gNCisvLyAgICBzdGR1ICAgICAgIExkU3RTVEQNCisvLyAgICBzdGR1eCAgICAgIExkU3RTVEQNCisvLyAgICBzdGR4ICAgICAgIExkU3RTVEQNCisvLyAgICBzdGZkICAgICAgIExkU3RVWA0KKy8vICAgIHN0ZmR1ICAgICAgTGRTdFVYDQorLy8gICAgc3RmZHV4ICAgICBMZFN0VVgNCisvLyAgICBzdGZkeCAgICAgIExkU3RVWA0KKy8vICAgIHN0Zml3eCAgICAgTGRTdFVYDQorLy8gICAgc3RmcyAgICAgICBMZFN0VVgNCisvLyAgICBzdGZzdSAgICAgIExkU3RVWA0KKy8vICAgIHN0ZnN1eCAgICAgTGRTdFVYDQorLy8gICAgc3Rmc3ggICAgICBMZFN0VVgNCisvLyAgICBzdGggICAgICAgIExkU3RHZW5lcmFsDQorLy8gICAgc3RoYnJ4ICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIHN0aHUgICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBzdGh1eCAgICAgIExkU3RHZW5lcmFsDQorLy8gICAgc3RoeCAgICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIHN0bXcgICAgICAgTGRTdExNVw0KKy8vICAgIHN0c3dpICAgICAgTGRTdExNVw0KKy8vICAgIHN0c3d4ICAgICAgTGRTdExNVw0KKy8vICAgIHN0dmVieCAgICAgTGRTdFNUVkVCWA0KKy8vICAgIHN0dmVoeCAgICAgTGRTdFNUVkVCWA0KKy8vICAgIHN0dmV3eCAgICAgTGRTdFNUVkVCWA0KKy8vICAgIHN0dnggICAgICAgTGRTdFNUVkVCWA0KKy8vICAgIHN0dnhsICAgICAgTGRTdFNUVkVCWA0KKy8vICAgIHN0dyAgICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBzdHdicnggICAgIExkU3RHZW5lcmFsDQorLy8gICAgc3R3Y3guICAgICBMZFN0U1RXQ1gNCisvLyAgICBzdHd1ICAgICAgIExkU3RHZW5lcmFsDQorLy8gICAgc3R3dXggICAgICBMZFN0R2VuZXJhbA0KKy8vICAgIHN0d3ggICAgICAgTGRTdEdlbmVyYWwNCisvLyAgICBzdWJmICAgICAgIEludEdlbmVyYWwNCisvLyAgICBzdWJmYyAgICAgIEludEdlbmVyYWwNCisvLyAgICBzdWJmZSAgICAgIEludEdlbmVyYWwNCisvLyAgICBzdWJmaWMgICAgIEludEdlbmVyYWwNCisvLyAgICBzdWJmbWUgICAgIEludEdlbmVyYWwNCisvLyAgICBzdWJmemUgICAgIEludEdlbmVyYWwNCisvLyAgICBzeW5jICAgICAgIExkU3RTeW5jDQorLy8gICAgdGQgICAgICAgICBJbnRUcmFwRA0KKy8vICAgIHRkaSAgICAgICAgSW50VHJhcEQNCisvLyAgICB0bGJpYSAgICAgIExkU3RTTEJJQQ0KKy8vICAgIHRsYmllICAgICAgTGRTdERDQkYNCisvLyAgICB0bGJzeW5jICAgIFNwclRMQlNZTkMNCisvLyAgICB0dyAgICAgICAgIEludFRyYXBXDQorLy8gICAgdHdpICAgICAgICBJbnRUcmFwVw0KKy8vICAgIHZhZGRjdXcgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZhZGRmcCAgICAgVmVjRlANCisvLyAgICB2YWRkc2JzICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YWRkc2hzICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YWRkc3dzICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YWRkdWJtICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YWRkdWJzICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YWRkdWhtICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YWRkdWhzICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YWRkdXdtICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YWRkdXdzICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YW5kICAgICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YW5kYyAgICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YXZnc2IgICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YXZnc2ggICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YXZnc3cgICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YXZndWIgICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YXZndWggICAgIFZlY0dlbmVyYWwNCisvLyAgICB2YXZndXcgICAgIFZlY0dlbmVyYWwNCisvLyAgICB2Y2ZzeCAgICAgIFZlY0ZQDQorLy8gICAgdmNmdXggICAgICBWZWNGUA0KKy8vICAgIHZjbXBiZnAgICAgVmVjRlBDb21wYXJlDQorLy8gICAgdmNtcGVxZnAgICBWZWNGUENvbXBhcmUNCisvLyAgICB2Y21wZXF1YiAgIFZlY0dlbmVyYWwNCisvLyAgICB2Y21wZXF1aCAgIFZlY0dlbmVyYWwNCisvLyAgICB2Y21wZXF1dyAgIFZlY0dlbmVyYWwNCisvLyAgICB2Y21wZ2VmcCAgIFZlY0ZQQ29tcGFyZQ0KKy8vICAgIHZjbXBndGZwICAgVmVjRlBDb21wYXJlDQorLy8gICAgdmNtcGd0c2IgICBWZWNHZW5lcmFsDQorLy8gICAgdmNtcGd0c2ggICBWZWNHZW5lcmFsDQorLy8gICAgdmNtcGd0c3cgICBWZWNHZW5lcmFsDQorLy8gICAgdmNtcGd0dWIgICBWZWNHZW5lcmFsDQorLy8gICAgdmNtcGd0dWggICBWZWNHZW5lcmFsDQorLy8gICAgdmNtcGd0dXcgICBWZWNHZW5lcmFsDQorLy8gICAgdmN0c3hzICAgICBWZWNGUA0KKy8vICAgIHZjdHV4cyAgICAgVmVjRlANCisvLyAgICB2ZXhwdGVmcCAgIFZlY0ZQDQorLy8gICAgdmxvZ2VmcCAgICBWZWNGUA0KKy8vICAgIHZtYWRkZnAgICAgVmVjRlANCisvLyAgICB2bWF4ZnAgICAgIFZlY0ZQQ29tcGFyZQ0KKy8vICAgIHZtYXhzYiAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZtYXhzaCAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZtYXhzdyAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZtYXh1YiAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZtYXh1aCAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZtYXh1dyAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZtaGFkZHNocyAgVmVjQ29tcGxleA0KKy8vICAgIHZtaHJhZGRzaHMgVmVjQ29tcGxleA0KKy8vICAgIHZtaW5mcCAgICAgVmVjRlBDb21wYXJlDQorLy8gICAgdm1pbnNiICAgICBWZWNHZW5lcmFsDQorLy8gICAgdm1pbnNoICAgICBWZWNHZW5lcmFsDQorLy8gICAgdm1pbnN3ICAgICBWZWNHZW5lcmFsDQorLy8gICAgdm1pbnViICAgICBWZWNHZW5lcmFsDQorLy8gICAgdm1pbnVoICAgICBWZWNHZW5lcmFsDQorLy8gICAgdm1pbnV3ICAgICBWZWNHZW5lcmFsDQorLy8gICAgdm1sYWRkdWhtICBWZWNDb21wbGV4DQorLy8gICAgdm1yZ2hiICAgICBWZWNQZXJtDQorLy8gICAgdm1yZ2hoICAgICBWZWNQZXJtDQorLy8gICAgdm1yZ2h3ICAgICBWZWNQZXJtDQorLy8gICAgdm1yZ2xiICAgICBWZWNQZXJtDQorLy8gICAgdm1yZ2xoICAgICBWZWNQZXJtDQorLy8gICAgdm1yZ2x3ICAgICBWZWNQZXJtDQorLy8gICAgdm1zdWJmcCAgICBWZWNGUA0KKy8vICAgIHZtc3VtbWJtICAgVmVjQ29tcGxleA0KKy8vICAgIHZtc3Vtc2htICAgVmVjQ29tcGxleA0KKy8vICAgIHZtc3Vtc2hzICAgVmVjQ29tcGxleA0KKy8vICAgIHZtc3VtdWJtICAgVmVjQ29tcGxleA0KKy8vICAgIHZtc3VtdWhtICAgVmVjQ29tcGxleA0KKy8vICAgIHZtc3VtdWhzICAgVmVjQ29tcGxleA0KKy8vICAgIHZtdWxlc2IgICAgVmVjQ29tcGxleA0KKy8vICAgIHZtdWxlc2ggICAgVmVjQ29tcGxleA0KKy8vICAgIHZtdWxldWIgICAgVmVjQ29tcGxleA0KKy8vICAgIHZtdWxldWggICAgVmVjQ29tcGxleA0KKy8vICAgIHZtdWxvc2IgICAgVmVjQ29tcGxleA0KKy8vICAgIHZtdWxvc2ggICAgVmVjQ29tcGxleA0KKy8vICAgIHZtdWxvdWIgICAgVmVjQ29tcGxleA0KKy8vICAgIHZtdWxvdWggICAgVmVjQ29tcGxleA0KKy8vICAgIHZub3IgICAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZvciAgICAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZwZXJtICAgICAgVmVjUGVybQ0KKy8vICAgIHZwa3B4ICAgICAgVmVjUGVybQ0KKy8vICAgIHZwa3Noc3MgICAgVmVjUGVybQ0KKy8vICAgIHZwa3NodXMgICAgVmVjUGVybQ0KKy8vICAgIHZwa3N3c3MgICAgVmVjUGVybQ0KKy8vICAgIHZwa3N3dXMgICAgVmVjUGVybQ0KKy8vICAgIHZwa3VodW0gICAgVmVjUGVybQ0KKy8vICAgIHZwa3VodXMgICAgVmVjUGVybQ0KKy8vICAgIHZwa3V3dW0gICAgVmVjUGVybQ0KKy8vICAgIHZwa3V3dXMgICAgVmVjUGVybQ0KKy8vICAgIHZyZWZwICAgICAgVmVjRlBSb3VuZA0KKy8vICAgIHZyZmltICAgICAgVmVjRlBSb3VuZA0KKy8vICAgIHZyZmluICAgICAgVmVjRlBSb3VuZA0KKy8vICAgIHZyZmlwICAgICAgVmVjRlBSb3VuZA0KKy8vICAgIHZyZml6ICAgICAgVmVjRlBSb3VuZA0KKy8vICAgIHZybGIgICAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZybGggICAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZybHcgICAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZyc3FydGVmcCAgVmVjRlANCisvLyAgICB2c2VsICAgICAgIFZlY0dlbmVyYWwNCisvLyAgICB2c2wgICAgICAgIFZlY1ZTTA0KKy8vICAgIHZzbGIgICAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzbGRvaSAgICAgVmVjUGVybQ0KKy8vICAgIHZzbGggICAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzbG8gICAgICAgVmVjUGVybQ0KKy8vICAgIHZzbHcgICAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzcGx0YiAgICAgVmVjUGVybQ0KKy8vICAgIHZzcGx0aCAgICAgVmVjUGVybQ0KKy8vICAgIHZzcGx0aXNiICAgVmVjUGVybQ0KKy8vICAgIHZzcGx0aXNoICAgVmVjUGVybQ0KKy8vICAgIHZzcGx0aXN3ICAgVmVjUGVybQ0KKy8vICAgIHZzcGx0dyAgICAgVmVjUGVybQ0KKy8vICAgIHZzciAgICAgICAgVmVjVlNSDQorLy8gICAgdnNyYWIgICAgICBWZWNHZW5lcmFsDQorLy8gICAgdnNyYWggICAgICBWZWNHZW5lcmFsDQorLy8gICAgdnNyYXcgICAgICBWZWNHZW5lcmFsDQorLy8gICAgdnNyYiAgICAgICBWZWNHZW5lcmFsDQorLy8gICAgdnNyaCAgICAgICBWZWNHZW5lcmFsDQorLy8gICAgdnNybyAgICAgICBWZWNQZXJtDQorLy8gICAgdnNydyAgICAgICBWZWNHZW5lcmFsDQorLy8gICAgdnN1YmN1dyAgICBWZWNHZW5lcmFsDQorLy8gICAgdnN1YmZwICAgICBWZWNGUA0KKy8vICAgIHZzdWJzYnMgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzdWJzaHMgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzdWJzd3MgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzdWJ1Ym0gICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzdWJ1YnMgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzdWJ1aG0gICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzdWJ1aHMgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzdWJ1d20gICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzdWJ1d3MgICAgVmVjR2VuZXJhbA0KKy8vICAgIHZzdW0yc3dzICAgVmVjQ29tcGxleA0KKy8vICAgIHZzdW00c2JzICAgVmVjQ29tcGxleA0KKy8vICAgIHZzdW00c2hzICAgVmVjQ29tcGxleA0KKy8vICAgIHZzdW00dWJzICAgVmVjQ29tcGxleA0KKy8vICAgIHZzdW1zd3MgICAgVmVjQ29tcGxleA0KKy8vICAgIHZ1cGtocHggICAgVmVjUGVybQ0KKy8vICAgIHZ1cGtoc2IgICAgVmVjUGVybQ0KKy8vICAgIHZ1cGtoc2ggICAgVmVjUGVybQ0KKy8vICAgIHZ1cGtscHggICAgVmVjUGVybQ0KKy8vICAgIHZ1cGtsc2IgICAgVmVjUGVybQ0KKy8vICAgIHZ1cGtsc2ggICAgVmVjUGVybQ0KKy8vICAgIHZ4b3IgICAgICAgVmVjR2VuZXJhbA0KKy8vICAgIHhvciAgICAgICAgSW50R2VuZXJhbA0KKy8vICAgIHhvcmkgICAgICAgSW50R2VuZXJhbA0KKy8vICAgIHhvcmlzICAgICAgSW50R2VuZXJhbA0KKy8vDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NjaGVkdWxlRzMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU2NoZWR1bGVHMy50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQyN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NjaGVkdWxlRzMudGQKQEAgLTAsMCArMSw2NCBAQAorLy89PT0tIFBQQ1NjaGVkdWxlRzMudGQgLSBQUEMgRzMgU2NoZWR1bGluZyBEZWZpbml0aW9ucyAtLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpdGluZXJhcnkgY2xhc3MgZGF0YSBmb3IgdGhlIEczICg3NTApIHByb2Nlc3Nvci4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorDQorZGVmIEczSXRpbmVyYXJpZXMgOiBQcm9jZXNzb3JJdGluZXJhcmllczwNCisgIFtJVTEsIElVMiwgRlBVMSwgQlBVLCBTUlUsIFNMVV0sIFsNCisgIEluc3RySXRpbkRhdGE8SW50R2VuZXJhbCAgLCBbSW5zdHJTdGFnZTwxLCBbSVUxLCBJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRDb21wYXJlICAsIFtJbnN0clN0YWdlPDEsIFtJVTEsIElVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludERpdlcgICAgICwgW0luc3RyU3RhZ2U8MTksIFtJVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRNRkZTICAgICAsIFtJbnN0clN0YWdlPDEsIFtGUFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50TVRGU0IwICAgLCBbSW5zdHJTdGFnZTwzLCBbRlBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE11bEhXICAgICwgW0luc3RyU3RhZ2U8NSwgW0lVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE11bEhXVSAgICwgW0luc3RyU3RhZ2U8NiwgW0lVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE11bExJICAgICwgW0luc3RyU3RhZ2U8MywgW0lVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludFJvdGF0ZSAgICwgW0luc3RyU3RhZ2U8MSwgW0lVMSwgSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50U2hpZnQgICAgLCBbSW5zdHJTdGFnZTwxLCBbSVUxLCBJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRUcmFwVyAgICAsIFtJbnN0clN0YWdlPDIsIFtJVTEsIElVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEJyQiAgICAgICAgICwgW0luc3RyU3RhZ2U8MSwgW0JQVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEJyQ1IgICAgICAgICwgW0luc3RyU3RhZ2U8MSwgW1NSVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEJyTUNSICAgICAgICwgW0luc3RyU3RhZ2U8MSwgW1NSVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEJyTUNSWCAgICAgICwgW0luc3RyU3RhZ2U8MSwgW1NSVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3REQ0JBICAgICwgW0luc3RyU3RhZ2U8MiwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3REQ0JGICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3REQ0JJICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RHZW5lcmFsICwgW0luc3RyU3RhZ2U8MiwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RJQ0JJICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RVWCAgICAgICwgW0luc3RyU3RhZ2U8MiwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMRkQgICAgICwgW0luc3RyU3RhZ2U8MiwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMRkRVICAgICwgW0luc3RyU3RhZ2U8MiwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMSEEgICAgICwgW0luc3RyU3RhZ2U8MiwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMTVcgICAgICwgW0luc3RyU3RhZ2U8MzQsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TFdBUlggICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0U1RXQ1ggICAsIFtJbnN0clN0YWdlPDgsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0U3luYyAgICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJJU1lOQyAgICAsIFtJbnN0clN0YWdlPDIsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNRlNSICAgICAsIFtJbnN0clN0YWdlPDMsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNVE1TUiAgICAsIFtJbnN0clN0YWdlPDEsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNVFNSICAgICAsIFtJbnN0clN0YWdlPDIsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJUTEJTWU5DICAsIFtJbnN0clN0YWdlPDMsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNRkNSICAgICAsIFtJbnN0clN0YWdlPDEsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNRk1TUiAgICAsIFtJbnN0clN0YWdlPDEsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNRlNQUiAgICAsIFtJbnN0clN0YWdlPDMsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNRlRCICAgICAsIFtJbnN0clN0YWdlPDMsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNVFNQUiAgICAsIFtJbnN0clN0YWdlPDIsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNVFNSSU4gICAsIFtJbnN0clN0YWdlPDIsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJSRkkgICAgICAsIFtJbnN0clN0YWdlPDIsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJTQyAgICAgICAsIFtJbnN0clN0YWdlPDIsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxGUEdlbmVyYWwgICAsIFtJbnN0clN0YWdlPDEsIFtGUFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBDb21wYXJlICAgLCBbSW5zdHJTdGFnZTwxLCBbRlBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEZQRGl2RCAgICAgICwgW0luc3RyU3RhZ2U8MzEsIFtGUFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBEaXZTICAgICAgLCBbSW5zdHJTdGFnZTwxNywgW0ZQVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxGUEZ1c2VkICAgICAsIFtJbnN0clN0YWdlPDIsIFtGUFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBSZXMgICAgICAgLCBbSW5zdHJTdGFnZTwxMCwgW0ZQVTFdPl0+DQorXT47DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NjaGVkdWxlRzQudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU2NoZWR1bGVHNC50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTY3MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NjaGVkdWxlRzQudGQKQEAgLTAsMCArMSw3NCBAQAorLy89PT0tIFBQQ1NjaGVkdWxlRzQudGQgLSBQUEMgRzQgU2NoZWR1bGluZyBEZWZpbml0aW9ucyAtLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpdGluZXJhcnkgY2xhc3MgZGF0YSBmb3IgdGhlIEc0ICg3NDAwKSBwcm9jZXNzb3IuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2RlZiBHNEl0aW5lcmFyaWVzIDogUHJvY2Vzc29ySXRpbmVyYXJpZXM8DQorICBbSVUxLCBJVTIsIFNMVSwgU1JVLCBCUFUsIEZQVTEsIFZJVTEsIFZJVTIsIFZQVSwgVkZQVV0sIFsNCisgIEluc3RySXRpbkRhdGE8SW50R2VuZXJhbCAgLCBbSW5zdHJTdGFnZTwxLCBbSVUxLCBJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRDb21wYXJlICAsIFtJbnN0clN0YWdlPDEsIFtJVTEsIElVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludERpdlcgICAgICwgW0luc3RyU3RhZ2U8MTksIFtJVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRNRkZTICAgICAsIFtJbnN0clN0YWdlPDMsIFtGUFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50TUZWU0NSICAgLCBbSW5zdHJTdGFnZTwxLCBbVklVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE1URlNCMCAgICwgW0luc3RyU3RhZ2U8MywgW0ZQVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRNdWxIVyAgICAsIFtJbnN0clN0YWdlPDUsIFtJVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRNdWxIV1UgICAsIFtJbnN0clN0YWdlPDYsIFtJVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRNdWxMSSAgICAsIFtJbnN0clN0YWdlPDMsIFtJVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRSb3RhdGUgICAsIFtJbnN0clN0YWdlPDEsIFtJVTEsIElVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludFNoaWZ0ICAgICwgW0luc3RyU3RhZ2U8MSwgW0lVMSwgSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50VHJhcFcgICAgLCBbSW5zdHJTdGFnZTwyLCBbSVUxLCBJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxCckIgICAgICAgICAsIFtJbnN0clN0YWdlPDEsIFtCUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxCckNSICAgICAgICAsIFtJbnN0clN0YWdlPDEsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxCck1DUiAgICAgICAsIFtJbnN0clN0YWdlPDEsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxCck1DUlggICAgICAsIFtJbnN0clN0YWdlPDEsIFtTUlVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0RENCRiAgICAsIFtJbnN0clN0YWdlPDIsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0RENCSSAgICAsIFtJbnN0clN0YWdlPDIsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0R2VuZXJhbCAsIFtJbnN0clN0YWdlPDIsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0RFNTICAgICAsIFtJbnN0clN0YWdlPDIsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0SUNCSSAgICAsIFtJbnN0clN0YWdlPDIsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0VVggICAgICAsIFtJbnN0clN0YWdlPDIsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TEZEICAgICAsIFtJbnN0clN0YWdlPDIsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TEZEVSAgICAsIFtJbnN0clN0YWdlPDIsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TEhBICAgICAsIFtJbnN0clN0YWdlPDIsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TE1XICAgICAsIFtJbnN0clN0YWdlPDM0LCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdExWZWNYICAgLCBbSW5zdHJTdGFnZTwyLCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdExXQVJYICAgLCBbSW5zdHJTdGFnZTwzLCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdFNUVkVCWCAgLCBbSW5zdHJTdGFnZTwyLCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdFNUV0NYICAgLCBbSW5zdHJTdGFnZTw1LCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdFN5bmMgICAgLCBbSW5zdHJTdGFnZTw4LCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3BySVNZTkMgICAgLCBbSW5zdHJTdGFnZTwyLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZTUiAgICAgLCBbSW5zdHJTdGFnZTwzLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTVRNU1IgICAgLCBbSW5zdHJTdGFnZTwxLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTVRTUiAgICAgLCBbSW5zdHJTdGFnZTwyLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByVExCU1lOQyAgLCBbSW5zdHJTdGFnZTw4LCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZDUiAgICAgLCBbSW5zdHJTdGFnZTwxLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZNU1IgICAgLCBbSW5zdHJTdGFnZTwxLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZTUFIgICAgLCBbSW5zdHJTdGFnZTwzLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZUQiAgICAgLCBbSW5zdHJTdGFnZTwxLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTVRTUFIgICAgLCBbSW5zdHJTdGFnZTwyLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTVRTUklOICAgLCBbSW5zdHJTdGFnZTwyLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByUkZJICAgICAgLCBbSW5zdHJTdGFnZTwyLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByU0MgICAgICAgLCBbSW5zdHJTdGFnZTwyLCBbU1JVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBHZW5lcmFsICAgLCBbSW5zdHJTdGFnZTwxLCBbRlBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEZQQ29tcGFyZSAgICwgW0luc3RyU3RhZ2U8MSwgW0ZQVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxGUERpdkQgICAgICAsIFtJbnN0clN0YWdlPDMxLCBbRlBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEZQRGl2UyAgICAgICwgW0luc3RyU3RhZ2U8MTcsIFtGUFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBGdXNlZCAgICAgLCBbSW5zdHJTdGFnZTwxLCBbRlBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEZQUmVzICAgICAgICwgW0luc3RyU3RhZ2U8MTAsIFtGUFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8VmVjR2VuZXJhbCAgLCBbSW5zdHJTdGFnZTwxLCBbVklVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFZlY0ZQICAgICAgICwgW0luc3RyU3RhZ2U8NCwgW1ZGUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxWZWNGUENvbXBhcmUsIFtJbnN0clN0YWdlPDEsIFtWSVUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8VmVjQ29tcGxleCAgLCBbSW5zdHJTdGFnZTwzLCBbVklVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFZlY1Blcm0gICAgICwgW0luc3RyU3RhZ2U8MSwgW1ZQVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFZlY0ZQUm91bmQgICwgW0luc3RyU3RhZ2U8NCwgW1ZGUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxWZWNWU0wgICAgICAsIFtJbnN0clN0YWdlPDEsIFtWSVUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8VmVjVlNSICAgICAgLCBbSW5zdHJTdGFnZTwxLCBbVklVMV0+XT4NCitdPjsNCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU2NoZWR1bGVHNFBsdXMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU2NoZWR1bGVHNFBsdXMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiN2EzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENTY2hlZHVsZUc0UGx1cy50ZApAQCAtMCwwICsxLDgwIEBACisvLz09PS0gUFBDU2NoZWR1bGVHNFBsdXMudGQgLSBQUEMgRzQrIFNjaGVkdWxpbmcgRGVmcy4gLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGl0aW5lcmFyeSBjbGFzcyBkYXRhIGZvciB0aGUgRzQrICg3NDUwKSBwcm9jZXNzb3IuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2RlZiBJVTMgICAgOiBGdW5jVW5pdDsgLy8gaW50ZWdlciB1bml0IDMgKDc0NTAgc2ltcGxlKQ0KK2RlZiBJVTQgICAgOiBGdW5jVW5pdDsgLy8gaW50ZWdlciB1bml0IDQgKDc0NTAgc2ltcGxlKQ0KKw0KK2RlZiBHNFBsdXNJdGluZXJhcmllcyA6IFByb2Nlc3Nvckl0aW5lcmFyaWVzPA0KKyAgW0lVMSwgSVUyLCBJVTMsIElVNCwgQlBVLCBTTFUsIEZQVTEsIFZGUFUsIFZJVTEsIFZJVTIsIFZQVV0sIFsNCisgIEluc3RySXRpbkRhdGE8SW50R2VuZXJhbCAgLCBbSW5zdHJTdGFnZTwxLCBbSVUxLCBJVTIsIElVMywgSVU0XT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50Q29tcGFyZSAgLCBbSW5zdHJTdGFnZTwxLCBbSVUxLCBJVTIsIElVMywgSVU0XT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50RGl2VyAgICAgLCBbSW5zdHJTdGFnZTwyMywgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE1GRlMgICAgICwgW0luc3RyU3RhZ2U8NSwgW0ZQVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRNRlZTQ1IgICAsIFtJbnN0clN0YWdlPDIsIFtWRlBVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50TVRGU0IwICAgLCBbSW5zdHJTdGFnZTw1LCBbRlBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE11bEhXICAgICwgW0luc3RyU3RhZ2U8NCwgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE11bEhXVSAgICwgW0luc3RyU3RhZ2U8NCwgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE11bExJICAgICwgW0luc3RyU3RhZ2U8MywgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludFJvdGF0ZSAgICwgW0luc3RyU3RhZ2U8MSwgW0lVMSwgSVUyLCBJVTMsIElVNF0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludFNoaWZ0ICAgICwgW0luc3RyU3RhZ2U8MiwgW0lVMSwgSVUyLCBJVTMsIElVNF0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludFRyYXBXICAgICwgW0luc3RyU3RhZ2U8MiwgW0lVMSwgSVUyLCBJVTMsIElVNF0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEJyQiAgICAgICAgICwgW0luc3RyU3RhZ2U8MSwgW0JQVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEJyQ1IgICAgICAgICwgW0luc3RyU3RhZ2U8MiwgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEJyTUNSICAgICAgICwgW0luc3RyU3RhZ2U8MiwgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEJyTUNSWCAgICAgICwgW0luc3RyU3RhZ2U8MiwgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3REQ0JGICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3REQ0JJICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RHZW5lcmFsICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3REU1MgICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RJQ0JJICAgICwgW0luc3RyU3RhZ2U8MywgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RVWCAgICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMRkQgICAgICwgW0luc3RyU3RhZ2U8NCwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMRkRVICAgICwgW0luc3RyU3RhZ2U8NCwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMSEEgICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMTVcgICAgICwgW0luc3RyU3RhZ2U8MzcsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TFZlY1ggICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TFdBICAgICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TFdBUlggICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0U1REICAgICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0U1REQ1ggICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0U1RWRUJYICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0U1RXQ1ggICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0U3luYyAgICAsIFtJbnN0clN0YWdlPDM1LCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3BySVNZTkMgICAgLCBbSW5zdHJTdGFnZTwwLCBbSVUxLCBJVTIsIElVMywgSVU0XT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZTUiAgICAgLCBbSW5zdHJTdGFnZTw0LCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTVRNU1IgICAgLCBbSW5zdHJTdGFnZTwyLCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTVRTUiAgICAgLCBbSW5zdHJTdGFnZTwyLCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByVExCU1lOQyAgLCBbSW5zdHJTdGFnZTwzLCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZDUiAgICAgLCBbSW5zdHJTdGFnZTwyLCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZNU1IgICAgLCBbSW5zdHJTdGFnZTwzLCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZTUFIgICAgLCBbSW5zdHJTdGFnZTw0LCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTUZUQiAgICAgLCBbSW5zdHJTdGFnZTw1LCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTVRTUFIgICAgLCBbSW5zdHJTdGFnZTwyLCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByTVRTUklOICAgLCBbSW5zdHJTdGFnZTwyLCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByUkZJICAgICAgLCBbSW5zdHJTdGFnZTwxLCBbSVUxLCBJVTIsIElVMywgSVU0XT5dPiwNCisgIEluc3RySXRpbkRhdGE8U3ByU0MgICAgICAgLCBbSW5zdHJTdGFnZTwwLCBbSVUxLCBJVTIsIElVMywgSVU0XT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBHZW5lcmFsICAgLCBbSW5zdHJTdGFnZTw1LCBbRlBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEZQQ29tcGFyZSAgICwgW0luc3RyU3RhZ2U8NSwgW0ZQVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxGUERpdkQgICAgICAsIFtJbnN0clN0YWdlPDM1LCBbRlBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEZQRGl2UyAgICAgICwgW0luc3RyU3RhZ2U8MjEsIFtGUFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBGdXNlZCAgICAgLCBbSW5zdHJTdGFnZTw1LCBbRlBVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEZQUmVzICAgICAgICwgW0luc3RyU3RhZ2U8MTQsIFtGUFUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8VmVjR2VuZXJhbCAgLCBbSW5zdHJTdGFnZTwxLCBbVklVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFZlY0ZQICAgICAgICwgW0luc3RyU3RhZ2U8NCwgW1ZGUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxWZWNGUENvbXBhcmUsIFtJbnN0clN0YWdlPDIsIFtWRlBVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8VmVjQ29tcGxleCAgLCBbSW5zdHJTdGFnZTw0LCBbVklVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFZlY1Blcm0gICAgICwgW0luc3RyU3RhZ2U8MiwgW1ZQVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFZlY0ZQUm91bmQgICwgW0luc3RyU3RhZ2U8NCwgW1ZJVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxWZWNWU0wgICAgICAsIFtJbnN0clN0YWdlPDIsIFtWUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxWZWNWU1IgICAgICAsIFtJbnN0clN0YWdlPDIsIFtWUFVdPl0+DQorXT47DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NjaGVkdWxlRzUudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU2NoZWR1bGVHNS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY3NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NjaGVkdWxlRzUudGQKQEAgLTAsMCArMSw4NCBAQAorLy89PT0tIFBQQ1NjaGVkdWxlRzUudGQgLSBQUEMgRzUgU2NoZWR1bGluZyBEZWZpbml0aW9ucyAtLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpdGluZXJhcnkgY2xhc3MgZGF0YSBmb3IgdGhlIEc1ICg5NzApIHByb2Nlc3Nvci4NCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorZGVmIEc1SXRpbmVyYXJpZXMgOiBQcm9jZXNzb3JJdGluZXJhcmllczwNCisgIFtJVTEsIElVMiwgU0xVLCBCUFUsIEZQVTEsIEZQVTIsIFZGUFUsIFZJVTEsIFZJVTIsIFZQVV0sIFsNCisgIEluc3RySXRpbkRhdGE8SW50R2VuZXJhbCAgLCBbSW5zdHJTdGFnZTwyLCBbSVUxLCBJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRDb21wYXJlICAsIFtJbnN0clN0YWdlPDMsIFtJVTEsIElVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludERpdkQgICAgICwgW0luc3RyU3RhZ2U8NjgsIFtJVTFdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnREaXZXICAgICAsIFtJbnN0clN0YWdlPDM2LCBbSVUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50TUZGUyAgICAgLCBbSW5zdHJTdGFnZTw2LCBbSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50TUZWU0NSICAgLCBbSW5zdHJTdGFnZTwxLCBbVkZQVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE1URlNCMCAgICwgW0luc3RyU3RhZ2U8NiwgW0ZQVTEsIEZQVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRNdWxIRCAgICAsIFtJbnN0clN0YWdlPDcsIFtJVTEsIElVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludE11bEhXICAgICwgW0luc3RyU3RhZ2U8NSwgW0lVMSwgSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50TXVsSFdVICAgLCBbSW5zdHJTdGFnZTw1LCBbSVUxLCBJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRNdWxMSSAgICAsIFtJbnN0clN0YWdlPDQsIFtJVTEsIElVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludFJGSUQgICAgICwgW0luc3RyU3RhZ2U8MSwgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludFJvdGF0ZUQgICwgW0luc3RyU3RhZ2U8MiwgW0lVMSwgSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50Um90YXRlICAgLCBbSW5zdHJTdGFnZTw0LCBbSVUxLCBJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxJbnRTaGlmdCAgICAsIFtJbnN0clN0YWdlPDIsIFtJVTEsIElVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEludFRyYXBEICAgICwgW0luc3RyU3RhZ2U8MSwgW0lVMSwgSVUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8SW50VHJhcFcgICAgLCBbSW5zdHJTdGFnZTwxLCBbSVUxLCBJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxCckIgICAgICAgICAsIFtJbnN0clN0YWdlPDEsIFtCUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxCckNSICAgICAgICAsIFtJbnN0clN0YWdlPDQsIFtCUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxCck1DUiAgICAgICAsIFtJbnN0clN0YWdlPDIsIFtCUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxCck1DUlggICAgICAsIFtJbnN0clN0YWdlPDMsIFtCUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0RENCRiAgICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0R2VuZXJhbCAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0RFNTICAgICAsIFtJbnN0clN0YWdlPDEwLCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdElDQkkgICAgLCBbSW5zdHJTdGFnZTw0MCwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RVWCAgICAgICwgW0luc3RyU3RhZ2U8NCwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMRCAgICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RMREFSWCAgICwgW0luc3RyU3RhZ2U8MTEsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TEZEICAgICAsIFtJbnN0clN0YWdlPDMsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TEZEVSAgICAsIFtJbnN0clN0YWdlPDUsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TEhBICAgICAsIFtJbnN0clN0YWdlPDUsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0TE1XICAgICAsIFtJbnN0clN0YWdlPDY0LCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdExWZWNYICAgLCBbSW5zdHJTdGFnZTwzLCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdExXQSAgICAgLCBbSW5zdHJTdGFnZTw1LCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdExXQVJYICAgLCBbSW5zdHJTdGFnZTwxMSwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RTTEJJQSAgICwgW0luc3RyU3RhZ2U8NDAsIFtTTFVdPl0+LCAvLyBuZWVkcyB3b3JrDQorICBJbnN0ckl0aW5EYXRhPExkU3RTTEJJRSAgICwgW0luc3RyU3RhZ2U8MiwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RTVEQgICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPExkU3RTVERDWCAgICwgW0luc3RyU3RhZ2U8MTEsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0U1RWRUJYICAsIFtJbnN0clN0YWdlPDUsIFtTTFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxMZFN0U1RXQ1ggICAsIFtJbnN0clN0YWdlPDExLCBbU0xVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8TGRTdFN5bmMgICAgLCBbSW5zdHJTdGFnZTwzNSwgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFNwcklTWU5DICAgICwgW0luc3RyU3RhZ2U8NDAsIFtTTFVdPl0+LCAvLyBuZWVkcyB3b3JrDQorICBJbnN0ckl0aW5EYXRhPFNwck1GU1IgICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFNwck1UTVNSICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFNwck1UU1IgICAgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFNwclRMQlNZTkMgICwgW0luc3RyU3RhZ2U8MywgW1NMVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFNwck1GQ1IgICAgICwgW0luc3RyU3RhZ2U8MiwgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFNwck1GTVNSICAgICwgW0luc3RyU3RhZ2U8MywgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFNwck1GU1BSICAgICwgW0luc3RyU3RhZ2U8MywgW0lVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFNwck1GVEIgICAgICwgW0luc3RyU3RhZ2U8MTAsIFtJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJNVFNQUiAgICAsIFtJbnN0clN0YWdlPDgsIFtJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxTcHJTQyAgICAgICAsIFtJbnN0clN0YWdlPDEsIFtJVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxGUEdlbmVyYWwgICAsIFtJbnN0clN0YWdlPDYsIFtGUFUxLCBGUFUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBDb21wYXJlICAgLCBbSW5zdHJTdGFnZTw4LCBbRlBVMSwgRlBVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEZQRGl2RCAgICAgICwgW0luc3RyU3RhZ2U8MzMsIFtGUFUxLCBGUFUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBEaXZTICAgICAgLCBbSW5zdHJTdGFnZTwzMywgW0ZQVTEsIEZQVTJdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxGUEZ1c2VkICAgICAsIFtJbnN0clN0YWdlPDYsIFtGUFUxLCBGUFUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8RlBSZXMgICAgICAgLCBbSW5zdHJTdGFnZTw2LCBbRlBVMSwgRlBVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPEZQU3FydCAgICAgICwgW0luc3RyU3RhZ2U8NDAsIFtGUFUxLCBGUFUyXT5dPiwNCisgIEluc3RySXRpbkRhdGE8VmVjR2VuZXJhbCAgLCBbSW5zdHJTdGFnZTwyLCBbVklVMV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFZlY0ZQICAgICAgICwgW0luc3RyU3RhZ2U8OCwgW1ZGUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxWZWNGUENvbXBhcmUsIFtJbnN0clN0YWdlPDIsIFtWRlBVXT5dPiwNCisgIEluc3RySXRpbkRhdGE8VmVjQ29tcGxleCAgLCBbSW5zdHJTdGFnZTw1LCBbVklVMl0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFZlY1Blcm0gICAgICwgW0luc3RyU3RhZ2U8MywgW1ZQVV0+XT4sDQorICBJbnN0ckl0aW5EYXRhPFZlY0ZQUm91bmQgICwgW0luc3RyU3RhZ2U8OCwgW1ZGUFVdPl0+LA0KKyAgSW5zdHJJdGluRGF0YTxWZWNWU0wgICAgICAsIFtJbnN0clN0YWdlPDIsIFtWSVUxXT5dPiwNCisgIEluc3RySXRpbkRhdGE8VmVjVlNSICAgICAgLCBbSW5zdHJTdGFnZTwzLCBbVlBVXT5dPg0KK10+Ow0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENTZWxlY3Rpb25EQUdJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENTZWxlY3Rpb25EQUdJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDI1OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NlbGVjdGlvbkRBR0luZm8uY3BwCkBAIC0wLDAgKzEsMjMgQEAKKy8vPT09LS0gUFBDU2VsZWN0aW9uREFHSW5mby5jcHAgLSBQb3dlclBDIFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFBQQ1NlbGVjdGlvbkRBR0luZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwb3dlcnBjLXNlbGVjdGlvbmRhZy1pbmZvIgorI2luY2x1ZGUgIlBQQ1RhcmdldE1hY2hpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitQUENTZWxlY3Rpb25EQUdJbmZvOjpQUENTZWxlY3Rpb25EQUdJbmZvKGNvbnN0IFBQQ1RhcmdldE1hY2hpbmUgJlRNKQorICA6IFRhcmdldFNlbGVjdGlvbkRBR0luZm8oVE0pIHsKK30KKworUFBDU2VsZWN0aW9uREFHSW5mbzo6flBQQ1NlbGVjdGlvbkRBR0luZm8oKSB7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU2VsZWN0aW9uREFHSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NlbGVjdGlvbkRBR0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDFiNjljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1NlbGVjdGlvbkRBR0luZm8uaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0tIFBQQ1NlbGVjdGlvbkRBR0luZm8uaCAtIFBvd2VyUEMgU2VsZWN0aW9uREFHIEluZm8gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQb3dlclBDIHN1YmNsYXNzIGZvciBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgUE9XRVJQQ0NTRUxFQ1RJT05EQUdJTkZPX0gKKyNkZWZpbmUgUE9XRVJQQ0NTRUxFQ1RJT05EQUdJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBR0luZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBQUENUYXJnZXRNYWNoaW5lOworCitjbGFzcyBQUENTZWxlY3Rpb25EQUdJbmZvIDogcHVibGljIFRhcmdldFNlbGVjdGlvbkRBR0luZm8geworcHVibGljOgorICBleHBsaWNpdCBQUENTZWxlY3Rpb25EQUdJbmZvKGNvbnN0IFBQQ1RhcmdldE1hY2hpbmUgJlRNKTsKKyAgflBQQ1NlbGVjdGlvbkRBR0luZm8oKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU3VidGFyZ2V0LmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENTdWJ0YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNDYwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU3VidGFyZ2V0LmNwcApAQCAtMCwwICsxLDE0MiBAQAorLy89PT0tIFBvd2VyUENTdWJ0YXJnZXQuY3BwIC0gUFBDIFN1YnRhcmdldCBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgUFBDIHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiUFBDU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiUFBDLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJQUENHZW5TdWJ0YXJnZXQuaW5jIgorI2luY2x1ZGUgPGNzdGRsaWI+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorI2luY2x1ZGUgPG1hY2gvbWFjaC5oPgorI2luY2x1ZGUgPG1hY2gvbWFjaF9ob3N0Lmg+CisjaW5jbHVkZSA8bWFjaC9ob3N0X2luZm8uaD4KKyNpbmNsdWRlIDxtYWNoL21hY2hpbmUuaD4KKworLy8vIEdldEN1cnJlbnRQb3dlclBDRmVhdHVyZXMgLSBSZXR1cm5zIHRoZSBjdXJyZW50IENQVXMgZmVhdHVyZXMuCitzdGF0aWMgY29uc3QgY2hhciAqR2V0Q3VycmVudFBvd2VyUENDUFUoKSB7CisgIGhvc3RfYmFzaWNfaW5mb19kYXRhX3QgaG9zdEluZm87CisgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgaW5mb0NvdW50OworCisgIGluZm9Db3VudCA9IEhPU1RfQkFTSUNfSU5GT19DT1VOVDsKKyAgaG9zdF9pbmZvKG1hY2hfaG9zdF9zZWxmKCksIEhPU1RfQkFTSUNfSU5GTywgKGhvc3RfaW5mb190KSZob3N0SW5mbywgCisgICAgICAgICAgICAmaW5mb0NvdW50KTsKKyAgICAgICAgICAgIAorICBpZiAoaG9zdEluZm8uY3B1X3R5cGUgIT0gQ1BVX1RZUEVfUE9XRVJQQykgcmV0dXJuICJnZW5lcmljIjsKKworICBzd2l0Y2goaG9zdEluZm8uY3B1X3N1YnR5cGUpIHsKKyAgY2FzZSBDUFVfU1VCVFlQRV9QT1dFUlBDXzYwMTogICByZXR1cm4gIjYwMSI7CisgIGNhc2UgQ1BVX1NVQlRZUEVfUE9XRVJQQ182MDI6ICAgcmV0dXJuICI2MDIiOworICBjYXNlIENQVV9TVUJUWVBFX1BPV0VSUENfNjAzOiAgIHJldHVybiAiNjAzIjsKKyAgY2FzZSBDUFVfU1VCVFlQRV9QT1dFUlBDXzYwM2U6ICByZXR1cm4gIjYwM2UiOworICBjYXNlIENQVV9TVUJUWVBFX1BPV0VSUENfNjAzZXY6IHJldHVybiAiNjAzZXYiOworICBjYXNlIENQVV9TVUJUWVBFX1BPV0VSUENfNjA0OiAgIHJldHVybiAiNjA0IjsKKyAgY2FzZSBDUFVfU1VCVFlQRV9QT1dFUlBDXzYwNGU6ICByZXR1cm4gIjYwNGUiOworICBjYXNlIENQVV9TVUJUWVBFX1BPV0VSUENfNjIwOiAgIHJldHVybiAiNjIwIjsKKyAgY2FzZSBDUFVfU1VCVFlQRV9QT1dFUlBDXzc1MDogICByZXR1cm4gIjc1MCI7CisgIGNhc2UgQ1BVX1NVQlRZUEVfUE9XRVJQQ183NDAwOiAgcmV0dXJuICI3NDAwIjsKKyAgY2FzZSBDUFVfU1VCVFlQRV9QT1dFUlBDXzc0NTA6ICByZXR1cm4gIjc0NTAiOworICBjYXNlIENQVV9TVUJUWVBFX1BPV0VSUENfOTcwOiAgIHJldHVybiAiOTcwIjsKKyAgZGVmYXVsdDogOworICB9CisgIAorICByZXR1cm4gImdlbmVyaWMiOworfQorI2VuZGlmCisKKworUFBDU3VidGFyZ2V0OjpQUENTdWJ0YXJnZXQoY29uc3Qgc3RkOjpzdHJpbmcgJlRULCBjb25zdCBzdGQ6OnN0cmluZyAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzNjRCaXQpCisgIDogU3RhY2tBbGlnbm1lbnQoMTYpCisgICwgRGFyd2luRGlyZWN0aXZlKFBQQzo6RElSX05PTkUpCisgICwgSXNHaWdhUHJvY2Vzc29yKGZhbHNlKQorICAsIEhhczY0Qml0U3VwcG9ydChmYWxzZSkKKyAgLCBVc2U2NEJpdFJlZ3MoZmFsc2UpCisgICwgSXNQUEM2NChpczY0Qml0KQorICAsIEhhc0FsdGl2ZWMoZmFsc2UpCisgICwgSGFzRlNRUlQoZmFsc2UpCisgICwgSGFzU1RGSVdYKGZhbHNlKQorICAsIEhhc0xhenlSZXNvbHZlclN0dWJzKGZhbHNlKQorICAsIElzSklUQ29kZU1vZGVsKGZhbHNlKQorICAsIERhcndpblZlcnMoMCkgeworCisgIC8vIERldGVybWluZSBkZWZhdWx0IGFuZCB1c2VyIHNwZWNpZmllZCBjaGFyYWN0ZXJpc3RpY3MKKyAgc3RkOjpzdHJpbmcgQ1BVID0gImdlbmVyaWMiOworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorICBDUFUgPSBHZXRDdXJyZW50UG93ZXJQQ0NQVSgpOworI2VuZGlmCisKKyAgLy8gUGFyc2UgZmVhdHVyZXMgc3RyaW5nLgorICBQYXJzZVN1YnRhcmdldEZlYXR1cmVzKEZTLCBDUFUpOworCisgIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIGNvZGUgZm9yIHBwYzY0LCB2ZXJpZnkgdGhhdCBvcHRpb25zIG1ha2Ugc2Vuc2UuCisgIGlmIChpczY0Qml0KSB7CisgICAgSGFzNjRCaXRTdXBwb3J0ID0gdHJ1ZTsKKyAgICAvLyBTaWxlbnRseSBmb3JjZSA2NC1iaXQgcmVnaXN0ZXIgdXNlIG9uIHBwYzY0LgorICAgIFVzZTY0Qml0UmVncyA9IHRydWU7CisgIH0KKyAgCisgIC8vIElmIHRoZSB1c2VyIHJlcXVlc3RlZCB1c2Ugb2YgNjQtYml0IHJlZ3MsIGJ1dCB0aGUgY3B1IHNlbGVjdGVkIGRvZXNuJ3QKKyAgLy8gc3VwcG9ydCBpdCwgaWdub3JlLgorICBpZiAodXNlNjRCaXRSZWdzKCkgJiYgIWhhczY0Qml0U3VwcG9ydCgpKQorICAgIFVzZTY0Qml0UmVncyA9IGZhbHNlOworICAKKyAgLy8gU2V0IHRoZSBib29sZWFuIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgdGFyZ2V0IHRyaXBsZSwgb3IgdGhlIGRlZmF1bHQKKyAgLy8gaWYgb25lIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCB0byB0cnVlLgorICBpZiAoVFQubGVuZ3RoKCkgPiA3KSB7CisgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHZlcnNpb24gb2YgZGFyd2luIHRoaXMgaXMuCisgICAgc2l6ZV90IERhcndpblBvcyA9IFRULmZpbmQoIi1kYXJ3aW4iKTsKKyAgICBpZiAoRGFyd2luUG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBpZiAoaXNkaWdpdChUVFtEYXJ3aW5Qb3MrN10pKQorICAgICAgICBEYXJ3aW5WZXJzID0gYXRvaSgmVFRbRGFyd2luUG9zKzddKTsKKyAgICAgIGVsc2UKKyAgICAgICAgRGFyd2luVmVycyA9IDg7ICAvLyBNaW5pbXVtIHN1cHBvcnRlZCBkYXJ3aW4gaXMgVGlnZXIuCisgICAgfQorICB9CisKKyAgLy8gU2V0IHVwIGRhcndpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzLgorICBpZiAoaXNEYXJ3aW4oKSkKKyAgICBIYXNMYXp5UmVzb2x2ZXJTdHVicyA9IHRydWU7Cit9CisKKy8vLyBTZXRKSVRNb2RlIC0gVGhpcyBpcyBjYWxsZWQgdG8gaW5mb3JtIHRoZSBzdWJ0YXJnZXQgaW5mbyB0aGF0IHdlIGFyZQorLy8vIHByb2R1Y2luZyBjb2RlIGZvciB0aGUgSklULgordm9pZCBQUENTdWJ0YXJnZXQ6OlNldEpJVE1vZGUoKSB7CisgIC8vIEpJVCBtb2RlIGRvZXNuJ3Qgd2FudCBsYXp5IHJlc29sdmVyIHN0dWJzLCBpdCBrbm93cyBleGFjdGx5IHdoZXJlCisgIC8vIGV2ZXJ5dGhpbmcgaXMuICBUaGlzIG1hdHRlcnMgZm9yIFBQQzY0LCB3aGljaCBjb2RlZ2VucyBpbiBQSUMgbW9kZSB3aXRob3V0CisgIC8vIHN0dWJzLgorICBIYXNMYXp5UmVzb2x2ZXJTdHVicyA9IGZhbHNlOworCisgIC8vIENhbGxzIHRvIGV4dGVybmFsIGZ1bmN0aW9ucyBuZWVkIHRvIHVzZSBpbmRpcmVjdCBjYWxscworICBJc0pJVENvZGVNb2RlbCA9IHRydWU7Cit9CisKKworLy8vIGhhc0xhenlSZXNvbHZlclN0dWIgLSBSZXR1cm4gdHJ1ZSBpZiBhY2Nlc3NlcyB0byB0aGUgc3BlY2lmaWVkIGdsb2JhbCBoYXZlCisvLy8gdG8gZ28gdGhyb3VnaCBhIGR5bGQgbGF6eSByZXNvbHV0aW9uIHN0dWIuICBUaGlzIG1lYW5zIHRoYXQgYW4gZXh0cmEgbG9hZAorLy8vIGlzIHJlcXVpcmVkIHRvIGdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2xvYmFsLgorYm9vbCBQUENTdWJ0YXJnZXQ6Omhhc0xhenlSZXNvbHZlclN0dWIoY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IHsKKyAgLy8gV2UgbmV2ZXIgaGFlIHN0dWJzIGlmIEhhc0xhenlSZXNvbHZlclN0dWJzPWZhbHNlIG9yIGlmIGluIHN0YXRpYyBtb2RlLgorICBpZiAoIUhhc0xhenlSZXNvbHZlclN0dWJzIHx8IFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpTdGF0aWMpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBJZiBzeW1ib2wgdmlzaWJpbGl0eSBpcyBoaWRkZW4sIHRoZSBleHRyYSBsb2FkIGlzIG5vdCBuZWVkZWQgaWYKKyAgLy8gdGhlIHN5bWJvbCBpcyBkZWZpbml0ZWx5IGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4KKyAgYm9vbCBpc0RlY2wgPSBHVi0+aXNEZWNsYXJhdGlvbigpICYmICFHVi0+aXNNYXRlcmlhbGl6YWJsZSgpOworICBpZiAoR1YtPmhhc0hpZGRlblZpc2liaWxpdHkoKSAmJiAhaXNEZWNsICYmICFHVi0+aGFzQ29tbW9uTGlua2FnZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIEdWLT5oYXNXZWFrTGlua2FnZSgpIHx8IEdWLT5oYXNMaW5rT25jZUxpbmthZ2UoKSB8fAorICAgICAgICAgR1YtPmhhc0NvbW1vbkxpbmthZ2UoKSB8fCBpc0RlY2w7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU3VidGFyZ2V0LmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDU3VidGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlYzc0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9QUENTdWJ0YXJnZXQuaApAQCAtMCwwICsxLDE1MSBAQAorLy89PT09PS0tIFBQQ1N1YnRhcmdldC5oIC0gRGVmaW5lIFN1YnRhcmdldCBmb3IgdGhlIFBQQyAtLS0tLS0tKi0gQysrIC0qLS09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFBvd2VyUEMgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0U3VidGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgUE9XRVJQQ1NVQlRBUkdFVF9ICisjZGVmaW5lIFBPV0VSUENTVUJUQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJdGluZXJhcmllcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFN1YnRhcmdldC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBHQ0MgI2RlZmluZXMgUFBDIG9uIExpbnV4IGJ1dCB3ZSB1c2UgaXQgYXMgb3VyIG5hbWVzcGFjZSBuYW1lCisjdW5kZWYgUFBDCisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIFBQQyB7CisgIC8vIC1tIGRpcmVjdGl2ZSB2YWx1ZXMuCisgIGVudW0geworICAgIERJUl9OT05FLAorICAgIERJUl8zMiwKKyAgICBESVJfNjAxLCAKKyAgICBESVJfNjAyLCAKKyAgICBESVJfNjAzLCAKKyAgICBESVJfNzQwMCwKKyAgICBESVJfNzUwLCAKKyAgICBESVJfOTcwLCAKKyAgICBESVJfNjQgIAorICB9OworfQorCitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisgIAorY2xhc3MgUFBDU3VidGFyZ2V0IDogcHVibGljIFRhcmdldFN1YnRhcmdldCB7Citwcm90ZWN0ZWQ6CisgIC8vLyBzdGFja0FsaWdubWVudCAtIFRoZSBtaW5pbXVtIGFsaWdubWVudCBrbm93biB0byBob2xkIG9mIHRoZSBzdGFjayBmcmFtZSBvbgorICAvLy8gZW50cnkgdG8gdGhlIGZ1bmN0aW9uIGFuZCB3aGljaCBtdXN0IGJlIG1haW50YWluZWQgYnkgZXZlcnkgZnVuY3Rpb24uCisgIHVuc2lnbmVkIFN0YWNrQWxpZ25tZW50OworICAKKyAgLy8vIFNlbGVjdGVkIGluc3RydWN0aW9uIGl0aW5lcmFyaWVzIChvbmUgZW50cnkgcGVyIGl0aW5lcmFyeSBjbGFzcy4pCisgIEluc3RySXRpbmVyYXJ5RGF0YSBJbnN0ckl0aW5zOworICAKKyAgLy8vIFdoaWNoIGNwdSBkaXJlY3RpdmUgd2FzIHVzZWQuCisgIHVuc2lnbmVkIERhcndpbkRpcmVjdGl2ZTsKKworICAvLy8gVXNlZCBieSB0aGUgSVNlbCB0byB0dXJuIGluIG9wdGltaXphdGlvbnMgZm9yIFBPV0VSNC1kZXJpdmVkIGFyY2hpdGVjdHVyZXMKKyAgYm9vbCBJc0dpZ2FQcm9jZXNzb3I7CisgIGJvb2wgSGFzNjRCaXRTdXBwb3J0OworICBib29sIFVzZTY0Qml0UmVnczsKKyAgYm9vbCBJc1BQQzY0OworICBib29sIEhhc0FsdGl2ZWM7CisgIGJvb2wgSGFzRlNRUlQ7CisgIGJvb2wgSGFzU1RGSVdYOworICBib29sIEhhc0xhenlSZXNvbHZlclN0dWJzOworICBib29sIElzSklUQ29kZU1vZGVsOworICAKKyAgLy8vIERhcndpblZlcnMgLSBOb256ZXJvIGlmIHRoaXMgaXMgYSBkYXJ3aW4gcGxhdGZvcm0uICBPdGhlcndpc2UsIHRoZSBudW1lcmljCisgIC8vLyB2ZXJzaW9uIG9mIHRoZSBwbGF0Zm9ybSwgZS5nLiA4ID0gMTAuNCAoVGlnZXIpLCA5ID0gMTAuNSAoTGVvcGFyZCksIGV0Yy4KKyAgdW5zaWduZWQgY2hhciBEYXJ3aW5WZXJzOyAvLyBJcyBhbnkgZGFyd2luLXBwYyBwbGF0Zm9ybS4KK3B1YmxpYzoKKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIGRhdGEgbWVtYmVycyB0byBtYXRjaCB0aGF0CisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHRyaXBsZS4KKyAgLy8vCisgIFBQQ1N1YnRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVFQsIGNvbnN0IHN0ZDo6c3RyaW5nICZGUywgYm9vbCBpczY0Qml0KTsKKyAgCisgIC8vLyBQYXJzZVN1YnRhcmdldEZlYXR1cmVzIC0gUGFyc2VzIGZlYXR1cmVzIHN0cmluZyBzZXR0aW5nIHNwZWNpZmllZCAKKyAgLy8vIHN1YnRhcmdldCBvcHRpb25zLiAgRGVmaW5pdGlvbiBvZiBmdW5jdGlvbiBpcyBhdXRvIGdlbmVyYXRlZCBieSB0YmxnZW4uCisgIHN0ZDo6c3RyaW5nIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcgJkZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZDUFUpOworCisgIAorICAvLy8gU2V0SklUTW9kZSAtIFRoaXMgaXMgY2FsbGVkIHRvIGluZm9ybSB0aGUgc3VidGFyZ2V0IGluZm8gdGhhdCB3ZSBhcmUKKyAgLy8vIHByb2R1Y2luZyBjb2RlIGZvciB0aGUgSklULgorICB2b2lkIFNldEpJVE1vZGUoKTsKKworICAvLy8gZ2V0U3RhY2tBbGlnbm1lbnQgLSBSZXR1cm5zIHRoZSBtaW5pbXVtIGFsaWdubWVudCBrbm93biB0byBob2xkIG9mIHRoZQorICAvLy8gc3RhY2sgZnJhbWUgb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uIGFuZCB3aGljaCBtdXN0IGJlIG1haW50YWluZWQgYnkgZXZlcnkKKyAgLy8vIGZ1bmN0aW9uIGZvciB0aGlzIHN1YnRhcmdldC4KKyAgdW5zaWduZWQgZ2V0U3RhY2tBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBTdGFja0FsaWdubWVudDsgfQorICAKKyAgLy8vIGdldERhcndpbkRpcmVjdGl2ZSAtIFJldHVybnMgdGhlIC1tIGRpcmVjdGl2ZSBzcGVjaWZpZWQgZm9yIHRoZSBjcHUuCisgIC8vLworICB1bnNpZ25lZCBnZXREYXJ3aW5EaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBEYXJ3aW5EaXJlY3RpdmU7IH0KKyAgCisgIC8vLyBnZXRJbnN0ckl0aW5zIC0gUmV0dXJuIHRoZSBpbnN0cnVjdGlvbiBpdGluZXJhaWVzIGJhc2VkIG9uIHN1YnRhcmdldCAKKyAgLy8vIHNlbGVjdGlvbi4KKyAgY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICZnZXRJbnN0ckl0aW5lcmFyeURhdGEoKSBjb25zdCB7IHJldHVybiBJbnN0ckl0aW5zOyB9CisKKyAgLy8vIGdldFRhcmdldERhdGFTdHJpbmcgLSBSZXR1cm4gdGhlIHBvaW50ZXIgc2l6ZSBhbmQgdHlwZSBhbGlnbm1lbnQKKyAgLy8vIHByb3BlcnRpZXMgb2YgdGhpcyBzdWJ0YXJnZXQuCisgIGNvbnN0IGNoYXIgKmdldFRhcmdldERhdGFTdHJpbmcoKSBjb25zdCB7CisgICAgLy8gTm90ZSwgdGhlIGFsaWdubWVudCB2YWx1ZXMgZm9yIGY2NCBhbmQgaTY0IG9uIHBwYzY0IGluIERhcndpbgorICAgIC8vIGRvY3VtZW50YXRpb24gYXJlIHdyb25nOyB0aGVzZSBhcmUgY29ycmVjdCAoaS5lLiAid2hhdCBnY2MgZG9lcyIpLgorICAgIHJldHVybiBpc1BQQzY0KCkgPyAiRS1wOjY0OjY0LWY2NDo2NDo2NC1pNjQ6NjQ6NjQtZjEyODo2NDoxMjgtbjMyOjY0IgorICAgICAgICAgICAgICAgICAgICAgOiAiRS1wOjMyOjMyLWY2NDozMjo2NC1pNjQ6MzI6NjQtZjEyODo2NDoxMjgtbjMyIjsKKyAgfQorCisgIC8vLyBpc1BQQzY0IC0gUmV0dXJuIHRydWUgaWYgd2UgYXJlIGdlbmVyYXRpbmcgY29kZSBmb3IgNjQtYml0IHBvaW50ZXIgbW9kZS4KKyAgLy8vCisgIGJvb2wgaXNQUEM2NCgpIGNvbnN0IHsgcmV0dXJuIElzUFBDNjQ7IH0KKyAgCisgIC8vLyBoYXM2NEJpdFN1cHBvcnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2VsZWN0ZWQgQ1BVIHN1cHBvcnRzIDY0LWJpdAorICAvLy8gaW5zdHJ1Y3Rpb25zLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgYXJlIGluIDMyLWJpdCBvciA2NC1iaXQgbW9kZS4KKyAgYm9vbCBoYXM2NEJpdFN1cHBvcnQoKSBjb25zdCB7IHJldHVybiBIYXM2NEJpdFN1cHBvcnQ7IH0KKyAgCisgIC8vLyB1c2U2NEJpdFJlZ3MgLSBSZXR1cm4gdHJ1ZSBpZiBpbiA2NC1iaXQgbW9kZSBvciBpZiB3ZSBzaG91bGQgdXNlIDY0LWJpdAorICAvLy8gcmVnaXN0ZXJzIGluIDMyLWJpdCBtb2RlIHdoZW4gcG9zc2libGUuICBUaGlzIGNhbiBvbmx5IHRydWUgaWYKKyAgLy8vIGhhczY0Qml0U3VwcG9ydCgpIHJldHVybnMgdHJ1ZS4KKyAgYm9vbCB1c2U2NEJpdFJlZ3MoKSBjb25zdCB7IHJldHVybiBVc2U2NEJpdFJlZ3M7IH0KKyAgCisgIC8vLyBoYXNMYXp5UmVzb2x2ZXJTdHViIC0gUmV0dXJuIHRydWUgaWYgYWNjZXNzZXMgdG8gdGhlIHNwZWNpZmllZCBnbG9iYWwgaGF2ZQorICAvLy8gdG8gZ28gdGhyb3VnaCBhIGR5bGQgbGF6eSByZXNvbHV0aW9uIHN0dWIuICBUaGlzIG1lYW5zIHRoYXQgYW4gZXh0cmEgbG9hZAorICAvLy8gaXMgcmVxdWlyZWQgdG8gZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBnbG9iYWwuCisgIGJvb2wgaGFzTGF6eVJlc29sdmVyU3R1Yihjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0OworICAKKyAgLy8gaXNKSVRDb2RlTW9kZWwgLSBUcnVlIGlmIHdlJ3JlIGdlbmVyYXRpbmcgY29kZSBmb3IgdGhlIEpJVAorICBib29sIGlzSklUQ29kZU1vZGVsKCkgY29uc3QgeyByZXR1cm4gSXNKSVRDb2RlTW9kZWw7IH0KKworICAvLyBTcGVjaWZpYyBvYnZpb3VzIGZlYXR1cmVzLgorICBib29sIGhhc0ZTUVJUKCkgY29uc3QgeyByZXR1cm4gSGFzRlNRUlQ7IH0KKyAgYm9vbCBoYXNTVEZJV1goKSBjb25zdCB7IHJldHVybiBIYXNTVEZJV1g7IH0KKyAgYm9vbCBoYXNBbHRpdmVjKCkgY29uc3QgeyByZXR1cm4gSGFzQWx0aXZlYzsgfQorICBib29sIGlzR2lnYVByb2Nlc3NvcigpIGNvbnN0IHsgcmV0dXJuIElzR2lnYVByb2Nlc3NvcjsgfQorCisgIC8vLyBpc0RhcndpbiAtIFRydWUgaWYgdGhpcyBpcyBhbnkgZGFyd2luIHBsYXRmb3JtLgorICBib29sIGlzRGFyd2luKCkgY29uc3QgeyByZXR1cm4gRGFyd2luVmVycyAhPSAwOyB9CisgIC8vLyBpc0RhcndpbiAtIFRydWUgaWYgdGhpcyBpcyBkYXJ3aW45IChsZW9wYXJkLCAxMC41KSBvciBhYm92ZS4KKyAgYm9vbCBpc0RhcndpbjkoKSBjb25zdCB7IHJldHVybiBEYXJ3aW5WZXJzID49IDk7IH0KKworICAvLy8gZ2V0RGFyd2luVmVycyAtIFJldHVybiB0aGUgZGFyd2luIHZlcnNpb24gbnVtYmVyLCA4ID0gdGlnZXIsIDkgPSBsZW9wYXJkLgorICB1bnNpZ25lZCBnZXREYXJ3aW5WZXJzKCkgY29uc3QgeyByZXR1cm4gRGFyd2luVmVyczsgfQorCisgIGJvb2wgaXNEYXJ3aW5BQkkoKSBjb25zdCB7IHJldHVybiBpc0RhcndpbigpOyB9CisgIGJvb2wgaXNTVlI0QUJJKCkgY29uc3QgeyByZXR1cm4gIWlzRGFyd2luKCk7IH0KKworfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1RhcmdldE1hY2hpbmUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1RhcmdldE1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwY2QxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDVGFyZ2V0TWFjaGluZS5jcHAKQEAgLTAsMCArMSwxMTggQEAKKy8vPT09LS0gUFBDVGFyZ2V0TWFjaGluZS5jcHAgLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgUG93ZXJQQyAtLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVG9wLWxldmVsIGltcGxlbWVudGF0aW9uIGZvciB0aGUgUG93ZXJQQyB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlBQQy5oIgorI2luY2x1ZGUgIlBQQ01DQXNtSW5mby5oIgorI2luY2x1ZGUgIlBQQ1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBNQ0FzbUluZm8gKmNyZWF0ZU1DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCkgeworICBUcmlwbGUgVGhlVHJpcGxlKFRUKTsKKyAgYm9vbCBpc1BQQzY0ID0gVGhlVHJpcGxlLmdldEFyY2goKSA9PSBUcmlwbGU6OnBwYzY0OworICBpZiAoVGhlVHJpcGxlLmdldE9TKCkgPT0gVHJpcGxlOjpEYXJ3aW4pCisgICAgcmV0dXJuIG5ldyBQUENNQ0FzbUluZm9EYXJ3aW4oaXNQUEM2NCk7CisgIHJldHVybiBuZXcgUFBDTGludXhNQ0FzbUluZm8oaXNQUEM2NCk7CisgIAorfQorCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVQb3dlclBDVGFyZ2V0KCkgeworICAvLyBSZWdpc3RlciB0aGUgdGFyZ2V0cworICBSZWdpc3RlclRhcmdldE1hY2hpbmU8UFBDMzJUYXJnZXRNYWNoaW5lPiBBKFRoZVBQQzMyVGFyZ2V0KTsgIAorICBSZWdpc3RlclRhcmdldE1hY2hpbmU8UFBDNjRUYXJnZXRNYWNoaW5lPiBCKFRoZVBQQzY0VGFyZ2V0KTsKKyAgCisgIFJlZ2lzdGVyQXNtSW5mb0ZuIEMoVGhlUFBDMzJUYXJnZXQsIGNyZWF0ZU1DQXNtSW5mbyk7CisgIFJlZ2lzdGVyQXNtSW5mb0ZuIEQoVGhlUFBDNjRUYXJnZXQsIGNyZWF0ZU1DQXNtSW5mbyk7Cit9CisKKworUFBDVGFyZ2V0TWFjaGluZTo6UFBDVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTLCBib29sIGlzNjRCaXQpCisgIDogTExWTVRhcmdldE1hY2hpbmUoVCwgVFQpLAorICAgIFN1YnRhcmdldChUVCwgRlMsIGlzNjRCaXQpLAorICAgIERhdGFMYXlvdXQoU3VidGFyZ2V0LmdldFRhcmdldERhdGFTdHJpbmcoKSksIEluc3RySW5mbygqdGhpcyksCisgICAgRnJhbWVJbmZvKCp0aGlzLCBpczY0Qml0KSwgSklUSW5mbygqdGhpcywgaXM2NEJpdCksCisgICAgVExJbmZvKCp0aGlzKSwgVFNJbmZvKCp0aGlzKSwKKyAgICBJbnN0ckl0aW5zKFN1YnRhcmdldC5nZXRJbnN0ckl0aW5lcmFyeURhdGEoKSkgeworCisgIGlmIChnZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6RGVmYXVsdCkgeworICAgIGlmIChTdWJ0YXJnZXQuaXNEYXJ3aW4oKSkKKyAgICAgIHNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6RHluYW1pY05vUElDKTsKKyAgICBlbHNlCisgICAgICBzZXRSZWxvY2F0aW9uTW9kZWwoUmVsb2M6OlN0YXRpYyk7CisgIH0KK30KKworLy8vIE92ZXJyaWRlIHRoaXMgZm9yIFBvd2VyUEMuICBUYWlsIG1lcmdpbmcgaGFwcGlseSBicmVha3MgdXAgaW5zdHJ1Y3Rpb24gaXNzdWUKKy8vLyBncm91cHMsIHdoaWNoIHR5cGljYWxseSBkZWdyYWRlcyBwZXJmb3JtYW5jZS4KK2Jvb2wgUFBDVGFyZ2V0TWFjaGluZTo6Z2V0RW5hYmxlVGFpbE1lcmdlRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKK1BQQzMyVGFyZ2V0TWFjaGluZTo6UFBDMzJUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGUykgCisgIDogUFBDVGFyZ2V0TWFjaGluZShULCBUVCwgRlMsIGZhbHNlKSB7Cit9CisKKworUFBDNjRUYXJnZXRNYWNoaW5lOjpQUEM2NFRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKQorICA6IFBQQ1RhcmdldE1hY2hpbmUoVCwgVFQsIEZTLCB0cnVlKSB7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhc3MgUGlwZWxpbmUgQ29uZmlndXJhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworYm9vbCBQUENUYXJnZXRNYWNoaW5lOjphZGRJbnN0U2VsZWN0b3IoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIC8vIEluc3RhbGwgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuCisgIFBNLmFkZChjcmVhdGVQUENJU2VsRGFnKCp0aGlzKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBQUENUYXJnZXRNYWNoaW5lOjphZGRQcmVFbWl0UGFzcyhQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICAvLyBNdXN0IHJ1biBicmFuY2ggc2VsZWN0aW9uIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUgYXNtIHByaW50ZXIuCisgIFBNLmFkZChjcmVhdGVQUENCcmFuY2hTZWxlY3Rpb25QYXNzKCkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUFBDVGFyZ2V0TWFjaGluZTo6YWRkQ29kZUVtaXR0ZXIoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpIHsKKyAgLy8gVGhlIEpJVCBzaG91bGQgdXNlIHRoZSBzdGF0aWMgcmVsb2NhdGlvbiBtb2RlbCBpbiBwcGMzMiBtb2RlLCBQSUMgaW4gcHBjNjQuCisgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBUYXJnZXRKSVRJbmZvISEKKyAgaWYgKFN1YnRhcmdldC5pc1BQQzY0KCkpIHsKKyAgICAvLyBXZSB1c2UgUElDIGNvZGVnZW4gaW4gcHBjNjQgbW9kZSwgYmVjYXVzZSBvdGhlcndpc2Ugd2UnZCBoYXZlIHRvIHVzZSBtYW55CisgICAgLy8gaW5zdHJ1Y3Rpb25zIHRvIG1hdGVyaWFsaXplIGFyYml0cmFyeSBnbG9iYWwgdmFyaWFibGUgKyBmdW5jdGlvbiArCisgICAgLy8gY29uc3RhbnQgcG9vbCBhZGRyZXNzZXMuCisgICAgc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpQSUNfKTsKKyAgICAvLyBUZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgdGhlIGluYWJpbGl0eSBvZiBQUEM2NCBKSVQgdG8gaGFuZGxlIGp1bXAKKyAgICAvLyB0YWJsZXMuCisgICAgRGlzYWJsZUp1bXBUYWJsZXMgPSB0cnVlOyAgICAgIAorICB9IGVsc2UgeworICAgIHNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6U3RhdGljKTsKKyAgfQorICAKKyAgLy8gSW5mb3JtIHRoZSBzdWJ0YXJnZXQgdGhhdCB3ZSBhcmUgaW4gSklUIG1vZGUuICBGSVhNRTogZG9lcyB0aGlzIGJyZWFrIG1hY2hvCisgIC8vIHdyaXRpbmc/CisgIFN1YnRhcmdldC5TZXRKSVRNb2RlKCk7CisgIAorICAvLyBNYWNoaW5lIGNvZGUgZW1pdHRlciBwYXNzIGZvciBQb3dlclBDLgorICBQTS5hZGQoY3JlYXRlUFBDSklUQ29kZUVtaXR0ZXJQYXNzKCp0aGlzLCBKQ0UpKTsKKworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUFBDVGFyZ2V0TWFjaGluZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1RhcmdldE1hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjZkZGJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1BQQ1RhcmdldE1hY2hpbmUuaApAQCAtMCwwICsxLDkxIEBACisvLz09PS0tIFBQQ1RhcmdldE1hY2hpbmUuaCAtIERlZmluZSBUYXJnZXRNYWNoaW5lIGZvciBQb3dlclBDIC0tLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgUG93ZXJQQyBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRNYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgUFBDX1RBUkdFVE1BQ0hJTkVfSAorI2RlZmluZSBQUENfVEFSR0VUTUFDSElORV9ICisKKyNpbmNsdWRlICJQUENGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJQUENTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJQUENKSVRJbmZvLmgiCisjaW5jbHVkZSAiUFBDSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiUFBDSVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiUFBDU2VsZWN0aW9uREFHSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFBhc3NNYW5hZ2VyOworY2xhc3MgR2xvYmFsVmFsdWU7CisKKy8vLyBQUENUYXJnZXRNYWNoaW5lIC0gQ29tbW9uIGNvZGUgYmV0d2VlbiAzMi1iaXQgYW5kIDY0LWJpdCBQb3dlclBDIHRhcmdldHMuCisvLy8KK2NsYXNzIFBQQ1RhcmdldE1hY2hpbmUgOiBwdWJsaWMgTExWTVRhcmdldE1hY2hpbmUgeworICBQUENTdWJ0YXJnZXQgICAgICAgIFN1YnRhcmdldDsKKyAgY29uc3QgVGFyZ2V0RGF0YSAgICBEYXRhTGF5b3V0OyAgICAgICAvLyBDYWxjdWxhdGVzIHR5cGUgc2l6ZSAmIGFsaWdubWVudAorICBQUENJbnN0ckluZm8gICAgICAgIEluc3RySW5mbzsKKyAgUFBDRnJhbWVJbmZvICAgICAgICBGcmFtZUluZm87CisgIFBQQ0pJVEluZm8gICAgICAgICAgSklUSW5mbzsKKyAgUFBDVGFyZ2V0TG93ZXJpbmcgICBUTEluZm87CisgIFBQQ1NlbGVjdGlvbkRBR0luZm8gVFNJbmZvOworICBJbnN0ckl0aW5lcmFyeURhdGEgIEluc3RySXRpbnM7CisKK3B1YmxpYzoKKyAgUFBDVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMsIGJvb2wgaXM2NEJpdCk7CisKKyAgdmlydHVhbCBjb25zdCBQUENJbnN0ckluZm8gICAgICpnZXRJbnN0ckluZm8oKSBjb25zdCB7IHJldHVybiAmSW5zdHJJbmZvOyB9CisgIHZpcnR1YWwgY29uc3QgUFBDRnJhbWVJbmZvICAgICAqZ2V0RnJhbWVJbmZvKCkgY29uc3QgeyByZXR1cm4gJkZyYW1lSW5mbzsgfQorICB2aXJ0dWFsICAgICAgIFBQQ0pJVEluZm8gICAgICAgKmdldEpJVEluZm8oKSAgICAgICAgIHsgcmV0dXJuICZKSVRJbmZvOyB9CisgIHZpcnR1YWwgY29uc3QgUFBDVGFyZ2V0TG93ZXJpbmcgKmdldFRhcmdldExvd2VyaW5nKCkgY29uc3QgeyAKKyAgIHJldHVybiAmVExJbmZvOworICB9CisgIHZpcnR1YWwgY29uc3QgUFBDU2VsZWN0aW9uREFHSW5mbyogZ2V0U2VsZWN0aW9uREFHSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gJlRTSW5mbzsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IFBQQ1JlZ2lzdGVySW5mbyAgKmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gJkluc3RySW5mby5nZXRSZWdpc3RlckluZm8oKTsKKyAgfQorICAKKyAgdmlydHVhbCBjb25zdCBUYXJnZXREYXRhICAgICpnZXRUYXJnZXREYXRhKCkgY29uc3QgICAgeyByZXR1cm4gJkRhdGFMYXlvdXQ7IH0KKyAgdmlydHVhbCBjb25zdCBQUENTdWJ0YXJnZXQgICpnZXRTdWJ0YXJnZXRJbXBsKCkgY29uc3QgeyByZXR1cm4gJlN1YnRhcmdldDsgfQorICB2aXJ0dWFsIGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSBnZXRJbnN0ckl0aW5lcmFyeURhdGEoKSBjb25zdCB7ICAKKyAgICByZXR1cm4gSW5zdHJJdGluczsKKyAgfQorCisgIC8vIFBhc3MgUGlwZWxpbmUgQ29uZmlndXJhdGlvbgorICB2aXJ0dWFsIGJvb2wgYWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKyAgdmlydHVhbCBib29sIGFkZFByZUVtaXRQYXNzKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKyAgdmlydHVhbCBib29sIGFkZENvZGVFbWl0dGVyKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJkpDRSk7CisgIHZpcnR1YWwgYm9vbCBnZXRFbmFibGVUYWlsTWVyZ2VEZWZhdWx0KCkgY29uc3Q7Cit9OworCisvLy8gUFBDMzJUYXJnZXRNYWNoaW5lIC0gUG93ZXJQQyAzMi1iaXQgdGFyZ2V0IG1hY2hpbmUuCisvLy8KK2NsYXNzIFBQQzMyVGFyZ2V0TWFjaGluZSA6IHB1YmxpYyBQUENUYXJnZXRNYWNoaW5lIHsKK3B1YmxpYzoKKyAgUFBDMzJUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKK307CisKKy8vLyBQUEM2NFRhcmdldE1hY2hpbmUgLSBQb3dlclBDIDY0LWJpdCB0YXJnZXQgbWFjaGluZS4KKy8vLworY2xhc3MgUFBDNjRUYXJnZXRNYWNoaW5lIDogcHVibGljIFBQQ1RhcmdldE1hY2hpbmUgeworcHVibGljOgorICBQUEM2NFRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUkVBRE1FLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NjU3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDkxNCBAQAorLy89PT0tIFJFQURNRS50eHQgLSBOb3RlcyBmb3IgaW1wcm92aW5nIFBvd2VyUEMtc3BlY2lmaWMgY29kZSBnZW4gLS0tLS0tLS0tPT09Ly8KKworVE9ETzoKKyogZ3ByMCBhbGxvY2F0aW9uCisqIGltcGxlbWVudCBkby1sb29wIC0+IGJkbnogdHJhbnNmb3JtCisqIGxtdy9zdG13IHBhc3MgYSBsYSBhcm0gbG9hZCBzdG9yZSBvcHRpbWl6ZXIgZm9yIHByb2xvZy9lcGlsb2cKKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitPbiBQUEM2NCwgdGhpczoKKworbG9uZyBmMiAobG9uZyB4KSB7IHJldHVybiAweGZmZmZmZmYwMDAwMDAwMDBVTDsgfQorbG9uZyBmMyAobG9uZyB4KSB7IHJldHVybiAweDFmZmZmZmZmZlVMOyB9CisKK2NvdWxkIGNvbXBpbGUgaW50bzoKKworX2YyOgorCWxpIHIzLC0xCisJcmxkaWNyIHIzLHIzLDAsMjcKKwlibHIKK19mMzoKKwlsaSByMywtMQorCXJsZGljbCByMyxyMywwLDMxCisJYmxyCisKK3dlIHByb2R1Y2U6CisKK19mMjoKKwlsaXMgcjIsIDQwOTUKKwlvcmkgcjIsIHIyLCA2NTUzNQorCXNsZGkgcjMsIHIyLCAzNgorCWJsciAKK19mMzoKKwlsaSByMiwgMQorCXNsZGkgcjIsIHIyLCAzMgorCW9yaXMgcjIsIHIyLCA2NTUzNQorCW9yaSByMywgcjIsIDY1NTM1CisJYmxyIAorCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworU3VwcG9ydCAndXBkYXRlJyBsb2FkL3N0b3JlIGluc3RydWN0aW9ucy4gIFRoZXNlIGFyZSBjcmFja2VkIG9uIHRoZSBHNSwgYnV0IGFyZQorc3RpbGwgYSBjb2Rlc2l6ZSB3aW4uCisKK1dpdGggcHJlaW5jIGVuYWJsZWQsIHRoaXM6CisKK2xvbmcgKiV0ZXN0NChsb25nIColWCwgbG9uZyAqJWRlc3QpIHsKKyAgICAgICAgJVkgPSBnZXRlbGVtZW50cHRyIGxvbmcqICVYLCBpbnQgNAorICAgICAgICAlQSA9IGxvYWQgbG9uZyogJVkKKyAgICAgICAgc3RvcmUgbG9uZyAlQSwgbG9uZyogJWRlc3QKKyAgICAgICAgcmV0IGxvbmcqICVZCit9CisKK2NvbXBpbGVzIHRvOgorCitfdGVzdDQ6CisgICAgICAgIG1yIHIyLCByMworICAgICAgICBsd3p1IHI1LCAzMihyMikKKyAgICAgICAgbHd6IHIzLCAzNihyMykKKyAgICAgICAgc3R3IHI1LCAwKHI0KQorICAgICAgICBzdHcgcjMsIDQocjQpCisgICAgICAgIG1yIHIzLCByMgorICAgICAgICBibHIgCisKK3dpdGggLXNjaGVkPWxpc3QtYnVyciwgSSBnZXQ6CisKK190ZXN0NDoKKyAgICAgICAgbHd6IHIyLCAzNihyMykKKyAgICAgICAgbHd6dSByNSwgMzIocjMpCisgICAgICAgIHN0dyByMiwgNChyNCkKKyAgICAgICAgc3R3IHI1LCAwKHI0KQorICAgICAgICBibHIgCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworV2UgY29tcGlsZSB0aGUgaG90dGVzdCBpbm5lciBsb29wIG9mIHZpdGVyYmkgdG86CisKKyAgICAgICAgbGkgcjYsIDAKKyAgICAgICAgYiBMQkIxXzg0ICAgICAgIDtiYjQzMi5pCitMQkIxXzgzOiAgICAgICAgO2JiNDIwLmkKKyAgICAgICAgbGJ6eCByOCwgcjUsIHI3CisgICAgICAgIGFkZGkgcjYsIHI3LCAxCisgICAgICAgIHN0YnggcjgsIHI0LCByNworTEJCMV84NDogICAgICAgIDtiYjQzMi5pCisgICAgICAgIG1yIHI3LCByNgorICAgICAgICBjbXBsd2kgY3IwLCByNywgMTQzCisgICAgICAgIGJuZSBjcjAsIExCQjFfODMgICAgICAgIDtiYjQyMC5pCisKK1RoZSBDQkUgbWFuYWdlcyB0byBwcm9kdWNlOgorCisJbGkgcjAsIDE0MworCW10Y3RyIHIwCitsb29wOgorCWxienggcjIsIHIyLCByMTEKKwlzdGJ4IHIwLCByMiwgcjkKKwlhZGRpIHIyLCByMiwgMQorCWJkeiBsYXRlcgorCWIgbG9vcAorCitUaGlzIGNvdWxkIGJlIG11Y2ggYmV0dGVyIChiZG56IGluc3RlYWQgb2YgYmR6KSBidXQgaXQgc3RpbGwgYmVhdHMgdXMuICBJZiB3ZQorcHJvZHVjZWQgdGhpcyB3aXRoIGJkbnosIHRoZSBsb29wIHdvdWxkIGJlIGEgc2luZ2xlIGRpc3BhdGNoIGdyb3VwLgorCis9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisKK0NvbXBpbGU6CisKK3ZvaWQgZm9vKGludCAqUCkgeworIGlmIChQKSAgKlAgPSAwOworfQorCitpbnRvOgorCitfZm9vOgorICAgICAgICBjbXB3aSBjcjAscjMsMAorICAgICAgICBiZXFsciBjcjAKKyAgICAgICAgbGkgcjAsMAorICAgICAgICBzdHcgcjAsMChyMykKKyAgICAgICAgYmxyCisKK1RoaXMgaXMgZWZmZWN0aXZlbHkgYSBzaW1wbGUgZm9ybSBvZiBwcmVkaWNhdGlvbi4KKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitMdW1wIHRoZSBjb25zdGFudCBwb29sIGZvciBlYWNoIGZ1bmN0aW9uIGludG8gT05FIHBpYyBvYmplY3QsIGFuZCByZWZlcmVuY2UKK3BpZWNlcyBvZiBpdCBhcyBvZmZzZXRzIGZyb20gdGhlIHN0YXJ0LiAgRm9yIGZ1bmN0aW9ucyBsaWtlIHRoaXMgKGNvbnRyaXZlZAordG8gaGF2ZSBsb3RzIG9mIGNvbnN0YW50cyBvYnZpb3VzbHkpOgorCitkb3VibGUgWChkb3VibGUgWSkgeyByZXR1cm4gKFkqMS4yMyArIDQuNTEyKSoyLjM0ICsgMTQuMzg7IH0KKworV2UgZ2VuZXJhdGU6CisKK19YOgorICAgICAgICBsaXMgcjIsIGhhMTYoLkNQSV9YXzApCisgICAgICAgIGxmZCBmMCwgbG8xNiguQ1BJX1hfMCkocjIpCisgICAgICAgIGxpcyByMiwgaGExNiguQ1BJX1hfMSkKKyAgICAgICAgbGZkIGYyLCBsbzE2KC5DUElfWF8xKShyMikKKyAgICAgICAgZm1hZGQgZjAsIGYxLCBmMCwgZjIKKyAgICAgICAgbGlzIHIyLCBoYTE2KC5DUElfWF8yKQorICAgICAgICBsZmQgZjEsIGxvMTYoLkNQSV9YXzIpKHIyKQorICAgICAgICBsaXMgcjIsIGhhMTYoLkNQSV9YXzMpCisgICAgICAgIGxmZCBmMiwgbG8xNiguQ1BJX1hfMykocjIpCisgICAgICAgIGZtYWRkIGYxLCBmMCwgZjEsIGYyCisgICAgICAgIGJscgorCitJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gbWF0ZXJpYWxpemUgLkNQSV9YIGludG8gYSByZWdpc3RlciwgdGhlbiB1c2UgaW1tZWRpYXRlcworb2ZmIG9mIHRoZSByZWdpc3RlciB0byBhdm9pZCB0aGUgbGlzJ3MuICBUaGlzIGlzIGV2ZW4gbW9yZSBpbXBvcnRhbnQgaW4gUElDIAorbW9kZS4KKworTm90ZSB0aGF0IHRoaXMgKGFuZCB0aGUgc3RhdGljIHZhcmlhYmxlIHZlcnNpb24pIGlzIGRpc2N1c3NlZCBoZXJlIGZvciBHQ0M6CitodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwNi0wMi9tc2cwMDEzMy5odG1sCisKK0hlcmUncyBhbm90aGVyIGV4YW1wbGUgKHRoZSBzZ24gZnVuY3Rpb24pOgorZG91YmxlIHRlc3RmKGRvdWJsZSBhKSB7CisgICAgICAgcmV0dXJuIGEgPT0gMC4wID8gMC4wIDogKGEgPiAwLjAgPyAxLjAgOiAtMS4wKTsKK30KKworaXQgcHJvZHVjZXMgYSBCQiBsaWtlIHRoaXM6CitMQkIxXzE6IDsgY29uZF90cnVlCisgICAgICAgIGxpcyByMiwgaGExNihMQ1BJMV8wKQorICAgICAgICBsZnMgZjAsIGxvMTYoTENQSTFfMCkocjIpCisgICAgICAgIGxpcyByMiwgaGExNihMQ1BJMV8xKQorICAgICAgICBsaXMgcjMsIGhhMTYoTENQSTFfMikKKyAgICAgICAgbGZzIGYyLCBsbzE2KExDUEkxXzIpKHIzKQorICAgICAgICBsZnMgZjMsIGxvMTYoTENQSTFfMSkocjIpCisgICAgICAgIGZzdWIgZjAsIGYwLCBmMQorICAgICAgICBmc2VsIGYxLCBmMCwgZjIsIGYzCisgICAgICAgIGJsciAKKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitQSUMgQ29kZSBHZW4gSVBPIG9wdGltaXphdGlvbjoKKworU3F1aXNoIHNtYWxsIHNjYWxhciBnbG9iYWxzIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgZ2xvYmFsIHN0cnVjdCwgYWxsb3dpbmcgdGhlIAorYWRkcmVzcyBvZiB0aGUgc3RydWN0IHRvIGJlIENTRSdkLCBhdm9pZGluZyBQSUMgYWNjZXNzZXMgKGFsc28gcmVkdWNlcyB0aGUgc2l6ZQorb2YgdGhlIEdPVCBvbiB0YXJnZXRzIHdpdGggb25lKS4KKworTm90ZSB0aGF0IHRoaXMgaXMgZGlzY3Vzc2VkIGhlcmUgZm9yIEdDQzoKK2h0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDA2LTAyL21zZzAwMTMzLmh0bWwKKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitJbXBsZW1lbnQgTmV3dG9uLVJoYXBzb24gbWV0aG9kIGZvciBpbXByb3ZpbmcgZXN0aW1hdGUgaW5zdHJ1Y3Rpb25zIHRvIHRoZQorY29ycmVjdCBhY2N1cmFjeSwgYW5kIGltcGxlbWVudGluZyBkaXZpZGUgYXMgbXVsdGlwbHkgYnkgcmVjaXByb2NhbCB3aGVuIGl0IGhhcworbW9yZSB0aGFuIG9uZSB1c2UuICBJdGFuaXVtIHdvdWxkIHdhbnQgdGhpcyB0b28uCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworQ29tcGlsZSBvZmZzZXRzIGZyb20gYWxsb2NhczoKKworaW50IColdGVzdCgpIHsKKyAgICAgICAgJVggPSBhbGxvY2EgeyBpbnQsIGludCB9CisgICAgICAgICVZID0gZ2V0ZWxlbWVudHB0ciB7aW50LGludH0qICVYLCBpbnQgMCwgdWludCAxCisgICAgICAgIHJldCBpbnQqICVZCit9CisKK2ludG8gYSBzaW5nbGUgYWRkLCBub3QgdHdvOgorCitfdGVzdDoKKyAgICAgICAgYWRkaSByMiwgcjEsIC04CisgICAgICAgIGFkZGkgcjMsIHIyLCA0CisgICAgICAgIGJscgorCistLT4gaW1wb3J0YW50IGZvciBDKysuCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworTm8gbG9hZHMgb3Igc3RvcmVzIG9mIHRoZSBjb25zdGFudHMgc2hvdWxkIGJlIG5lZWRlZDoKKworc3RydWN0IGZvbyB7IGRvdWJsZSBYLCBZOyB9Owordm9pZCB4eHgoc3RydWN0IGZvbyBGKTsKK3ZvaWQgYmFyKCkgeyBzdHJ1Y3QgZm9vIFIgPSB7IDEuMCwgMi4wIH07IHh4eChSKTsgfQorCis9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisKK0RhcndpbiBTdHViIHJlbW92YWw6CisKK1dlIHN0aWxsIGdlbmVyYXRlIGNhbGxzIHRvIGZvbyRzdHViLCBhbmQgc3R1YnMsIG9uIERhcndpbi4gIFRoaXMgaXMgbm90CituZWNlc3Nhcnkgd2hlbiBidWlsZGluZyB3aXRoIHRoZSBMZW9wYXJkICgxMC41KSBvciBsYXRlciBsaW5rZXIsIGFzIHN0dWJzIGFyZQorZ2VuZXJhdGVkIGJ5IGxkIHdoZW4gbmVjZXNzYXJ5LiAgUGFyYW1ldGVyaXppbmcgdGhpcyBiYXNlZCBvbiB0aGUgZGVwbG95bWVudAordGFyZ2V0ICgtbW1hY29zeC12ZXJzaW9uLW1pbikgaXMgcHJvYmFibHkgZW5vdWdoLiAgeDg2LTMyIGRvZXMgdGhpcyByaWdodCwgc2VlCitpdHMgbG9naWMuCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworRGFyd2luIFN0dWIgTElDTSBvcHRpbWl6YXRpb246CisKK0xvb3BzIGxpa2UgdGhpczoKKyAgCisgIGZvciAoLi4uKSAgYmFyKCk7CisKK0hhdmUgdG8gZ28gdGhyb3VnaCBhbiBpbmRpcmVjdCBzdHViIGlmIGJhciBpcyBleHRlcm5hbCBvciBsaW5rb25jZS4gIEl0IHdvdWxkIAorYmUgYmV0dGVyIHRvIGNvbXBpbGUgaXQgYXM6CisKKyAgICAgZnAgPSAmYmFyOworICAgICBmb3IgKC4uLikgIGZwKCk7CisKK3doaWNoIG9ubHkgY29tcHV0ZXMgdGhlIGFkZHJlc3Mgb2YgYmFyIG9uY2UgKGluc3RlYWQgb2YgZWFjaCB0aW1lIHRocm91Z2ggdGhlIAorc3R1YikuICBUaGlzIGlzIERhcndpbiBzcGVjaWZpYyBhbmQgd291bGQgaGF2ZSB0byBiZSBkb25lIGluIHRoZSBjb2RlIGdlbmVyYXRvci4KK1Byb2JhYmx5IG5vdCBhIHdpbiBvbiB4ODYuCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworU2ltcGxlIElQTyBmb3IgYXJndW1lbnQgcGFzc2luZywgY2hhbmdlOgorICB2b2lkIGZvbyhpbnQgWCwgZG91YmxlIFksIGludCBaKSAtPiB2b2lkIGZvbyhpbnQgWCwgaW50IFosIGRvdWJsZSBZKQorCit0aGUgRGFyd2luIEFCSSBzcGVjaWZpZXMgdGhhdCBhbnkgaW50ZWdlciBhcmd1bWVudHMgaW4gdGhlIGZpcnN0IDMyIGJ5dGVzIHdvcnRoCitvZiBhcmd1bWVudHMgZ2V0IGFzc2lnbmVkIHRvIHIzIHRocm91Z2ggcjEwLiBUaGF0IGlzLCBpZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uCitmb28oaW50LCBkb3VibGUsIGludCkgeW91IGdldCByMywgZjEsIHI2LCBzaW5jZSB0aGUgNjQgYml0IGRvdWJsZSBhdGUgdXAgdGhlCithcmd1bWVudCBieXRlcyBmb3IgcjQgYW5kIHI1LiBUaGUgdHJpY2sgdGhlbiB3b3VsZCBiZSB0byBzaHVmZmxlIHRoZSBhcmd1bWVudAorb3JkZXIgZm9yIGZ1bmN0aW9ucyB3ZSBjYW4gaW50ZXJuYWxpemUgc28gdGhhdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgCitpbnRlZ2Vycy9wb2ludGVycyBnZXQgcGFzc2VkIGluIHJlZ3MgYmVmb3JlIHlvdSBzZWUgYW55IG9mIHRoZSBmcCBhcmd1bWVudHMuCisKK0luc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRoaXMsIGl0IHdvdWxkIGFjdHVhbGx5IHByb2JhYmx5IGJlIGVhc2llciB0byBqdXN0IAoraW1wbGVtZW50IGEgUFBDIGZhc3RjYywgd2hlcmUgd2UgY291bGQgZG8gd2hhdGV2ZXIgd2Ugd2FudGVkIHRvIHRoZSBDQywgCitpbmNsdWRpbmcgaGF2aW5nIHRoaXMgd29yayBzYW5lbHkuCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworRml4IERhcndpbiBGUC1Jbi1JbnRlZ2VyIFJlZ2lzdGVycyBBQkkKKworRGFyd2luIHBhc3NlcyBkb3VibGVzIGluIHN0cnVjdHVyZXMgaW4gaW50ZWdlciByZWdpc3RlcnMsIHdoaWNoIGlzIHZlcnkgdmVyeSAKK2JhZC4gIEFkZCBzb21ldGhpbmcgbGlrZSBhIEJJVF9DT05WRVJUIHRvIExMVk0sIHRoZW4gZG8gYW4gaS1wIHRyYW5zZm9ybWF0aW9uIAordGhhdCBwZXJjb2xhdGVzIHRoZXNlIHRoaW5ncyBvdXQgb2YgZnVuY3Rpb25zLgorCitDaGVjayBvdXQgaG93IGhvcnJpYmxlIHRoaXMgaXM6CitodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLzIwMDUtMTAvbXNnMDEwMzYuaHRtbAorCitUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiAiaW50ZXJwcm9jZWR1cmFsIENDIHVubXVuZ2luZyIgdGhhdCBjYW4ndCBiZSBkb25lIHdpdGgKK2p1c3QgZmFzdGNjLgorCis9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisKK0NvbXBpbGUgdGhpczoKKworaW50IGZvbyhpbnQgYSkgeworICBpbnQgYiA9IChhIDwgOCk7CisgIGlmIChiKSB7CisgICAgcmV0dXJuIGIgKiAzOyAgICAgLy8gaWdub3JlIHRoZSBmYWN0IHRoYXQgdGhpcyBpcyBhbHdheXMgMy4KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMjsKKyAgfQorfQorCitpbnRvIHNvbWV0aGluZyBub3QgdGhpczoKKworX2ZvbzoKKzEpICAgICAgY21wd2kgY3I3LCByMywgOAorICAgICAgICBtZmNyIHIyLCAxCisgICAgICAgIHJsd2lubSByMiwgcjIsIDI5LCAzMSwgMzEKKzEpICAgICAgY21wd2kgY3IwLCByMywgNworICAgICAgICBiZ3QgY3IwLCBMQkIxXzIgOyBVbmlmaWVkUmV0dXJuQmxvY2sKK0xCQjFfMTogOyB0aGVuCisgICAgICAgIHJsd2lubSByMiwgcjIsIDAsIDMxLCAzMQorICAgICAgICBtdWxsaSByMywgcjIsIDMKKyAgICAgICAgYmxyCitMQkIxXzI6IDsgVW5pZmllZFJldHVybkJsb2NrCisgICAgICAgIGxpIHIzLCAyCisgICAgICAgIGJscgorCitJbiBwYXJ0aWN1bGFyLCB0aGUgdHdvIGNvbXBhcmVzIChtYXJrZWQgMSkgY291bGQgYmUgc2hhcmVkIGJ5IHJldmVyc2luZyBvbmUuCitUaGlzIGNvdWxkIGJlIGRvbmUgaW4gdGhlIGRhZyBjb21iaW5lciwgYnkgc3dhcHBpbmcgYSBCUl9DQyB3aGVuIGEgU0VUQ0Mgb2YgdGhlCitzYW1lIG9wZXJhbmRzIChidXQgYmFja3dhcmRzKSBleGlzdHMuICBJbiB0aGlzIGNhc2UsIHRoaXMgd291bGRuJ3Qgc2F2ZSB1cyAKK2FueXRoaW5nIHRob3VnaCwgYmVjYXVzZSB0aGUgY29tcGFyZXMgc3RpbGwgd291bGRuJ3QgYmUgc2hhcmVkLgorCis9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisKK1dlIHNob3VsZCBjdXN0b20gZXhwYW5kIHNldGNjIGluc3RlYWQgb2YgcHJldGVuZGluZyB0aGF0IHdlIGhhdmUgaXQuICBUaGF0Cit3b3VsZCBhbGxvdyB1cyB0byBleHBvc2UgdGhlIGFjY2VzcyBvZiB0aGUgY3JiaXQgYWZ0ZXIgdGhlIG1mY3IsIGFsbG93aW5nCit0aGF0IGFjY2VzcyB0byBiZSB0cml2aWFsbHkgZm9sZGVkIGludG8gb3RoZXIgb3BzLiAgQSBzaW1wbGUgZXhhbXBsZToKKworaW50IGZvbyhpbnQgYSwgaW50IGIpIHsgcmV0dXJuIChhIDwgYikgPDwgNDsgfQorCitjb21waWxlcyBpbnRvOgorCitfZm9vOgorICAgICAgICBjbXB3IGNyNywgcjMsIHI0CisgICAgICAgIG1mY3IgcjIsIDEKKyAgICAgICAgcmx3aW5tIHIyLCByMiwgMjksIDMxLCAzMQorICAgICAgICBzbHdpIHIzLCByMiwgNAorICAgICAgICBibHIKKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitGb2xkIGFkZCBhbmQgc3ViIHdpdGggY29uc3RhbnQgaW50byBub24tZXh0ZXJuLCBub24td2VhayBhZGRyZXNzZXMgc28gdGhpczoKKworc3RhdGljIGludCBhOwordm9pZCBiYXIoaW50IGIpIHsgYSA9IGI7IH0KK3ZvaWQgZm9vKHVuc2lnbmVkIGNoYXIgKmMpIHsKKyAgKmMgPSBhOworfQorCitTbyB0aGF0IAorCitfZm9vOgorICAgICAgICBsaXMgcjIsIGhhMTYoX2EpCisgICAgICAgIGxhIHIyLCBsbzE2KF9hKShyMikKKyAgICAgICAgbGJ6IHIyLCAzKHIyKQorICAgICAgICBzdGIgcjIsIDAocjMpCisgICAgICAgIGJscgorCitCZWNvbWVzCisKK19mb286CisgICAgICAgIGxpcyByMiwgaGExNihfYSszKQorICAgICAgICBsYnogcjIsIGxvMTYoX2ErMykocjIpCisgICAgICAgIHN0YiByMiwgMChyMykKKyAgICAgICAgYmxyCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworV2UgZ2VuZXJhdGUgcmVhbGx5IGJhZCBjb2RlIGZvciB0aGlzOgorCitpbnQgZihzaWduZWQgY2hhciAqYSwgX0Jvb2wgYiwgX0Jvb2wgYykgeworICAgc2lnbmVkIGNoYXIgdCA9IDA7CisgIGlmIChiKSAgdCA9ICphOworICBpZiAoYykgICphID0gdDsKK30KKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitUaGlzOgoraW50IHRlc3QodW5zaWduZWQgKlApIHsgcmV0dXJuICpQID4+IDI0OyB9CisKK1Nob3VsZCBjb21waWxlIHRvOgorCitfdGVzdDoKKyAgICAgICAgbGJ6IHIzLDAocjMpCisgICAgICAgIGJscgorCitub3Q6CisKK190ZXN0OgorICAgICAgICBsd3ogcjIsIDAocjMpCisgICAgICAgIHNyd2kgcjMsIHIyLCAyNAorICAgICAgICBibHIKKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitPbiB0aGUgRzUsIGxvZ2ljYWwgQ1Igb3BlcmF0aW9ucyBhcmUgbW9yZSBleHBlbnNpdmUgaW4gdGhlaXIgdGhyZWUKK2FkZHJlc3MgZm9ybTogb3BzIHRoYXQgcmVhZC93cml0ZSB0aGUgc2FtZSByZWdpc3RlciBhcmUgaGFsZiBhcyBleHBlbnNpdmUgYXMKK3Rob3NlIHRoYXQgcmVhZCBmcm9tIHR3byByZWdpc3RlcnMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhlaXIgZGVzdGluYXRpb24uCisKK1dlIHNob3VsZCBtb2RlbCB0aGlzIHdpdGggdHdvIHNlcGFyYXRlIGluc3RydWN0aW9ucy4gIFRoZSBpc2VsIHNob3VsZCBnZW5lcmF0ZQordGhlICJ0d28gYWRkcmVzcyIgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb25zLiAgV2hlbiB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIAorZGV0ZWN0cyB0aGF0IGl0IG5lZWRzIHRvIGluc2VydCBhIGNvcHkgZHVlIHRvIHRoZSB0d28tYWRkcmVzbmVzcyBvZiB0aGUgQ1IKK2xvZ2ljYWwgb3AsIGl0IHdpbGwgaW52b2tlIFBQQ0luc3RySW5mbzo6Y29udmVydFRvVGhyZWVBZGRyZXNzLiAgQXQgdGhpcyBwb2ludAord2UgY2FuIGNvbnZlcnQgdG8gdGhlICJ0aHJlZSBhZGRyZXNzIiBpbnN0cnVjdGlvbiwgdG8gc2F2ZSBjb2RlIHNwYWNlLgorCitUaGlzIG9ubHkgbWF0dGVycyB3aGVuIHdlIHN0YXJ0IGdlbmVyYXRpbmcgY3IgbG9naWNhbCBvcHMuCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworV2Ugc2hvdWxkIGNvbXBpbGUgdGhlc2UgdHdvIGZ1bmN0aW9ucyB0byB0aGUgc2FtZSB0aGluZzoKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgordm9pZCBmKGludCBhLCBpbnQgYiwgaW50ICpQKSB7CisgICpQID0gKGEtYik+PTA/KGEtYik6KGItYSk7Cit9Cit2b2lkIGcoaW50IGEsIGludCBiLCBpbnQgKlApIHsKKyAgKlAgPSBhYnMoYS1iKTsKK30KKworRnVydGhlciwgdGhleSBzaG91bGQgY29tcGlsZSB0byBzb21ldGhpbmcgYmV0dGVyIHRoYW46CisKK19nOgorICAgICAgICBzdWJmIHIyLCByNCwgcjMKKyAgICAgICAgc3ViZmljIHIzLCByMiwgMAorICAgICAgICBjbXB3aSBjcjAsIHIyLCAtMQorICAgICAgICBiZ3QgY3IwLCBMQkIyXzIgOyBlbnRyeQorTEJCMl8xOiA7IGVudHJ5CisgICAgICAgIG1yIHIyLCByMworTEJCMl8yOiA7IGVudHJ5CisgICAgICAgIHN0dyByMiwgMChyNSkKKyAgICAgICAgYmxyCisKK0dDQyBwcm9kdWNlczoKKworX2c6CisgICAgICAgIHN1YmYgcjQscjQscjMKKyAgICAgICAgc3Jhd2kgcjIscjQsMzEKKyAgICAgICAgeG9yIHIwLHIyLHI0CisgICAgICAgIHN1YmYgcjAscjIscjAKKyAgICAgICAgc3R3IHIwLDAocjUpCisgICAgICAgIGJscgorCisuLi4gd2hpY2ggaXMgbXVjaCBuaWNlci4KKworVGhpcyB0aGVvcmV0aWNhbGx5IG1heSBoZWxwIGltcHJvdmUgdHdvbGYgc2xpZ2h0bHkgKHVzZWQgaW4gZGltYm94LmM6MTQyPykuCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworUFI1OTQ1OiBUaGlzOiAKK2RlZmluZSBpMzIgQGNsYW1wMGcoaTMyICVhKSB7CitlbnRyeToKKyAgICAgICAgJWNtcCA9IGljbXAgc2x0IGkzMiAlYSwgMAorICAgICAgICAlc2VsID0gc2VsZWN0IGkxICVjbXAsIGkzMiAwLCBpMzIgJWEKKyAgICAgICAgcmV0IGkzMiAlc2VsCit9CisKK0lzIGNvbXBpbGUgdG8gdGhpcyB3aXRoIHRoZSBQb3dlclBDICgzMi1iaXQpIGJhY2tlbmQ6CisKK19jbGFtcDBnOgorICAgICAgICBjbXB3aSBjcjAsIHIzLCAwCisgICAgICAgIGxpIHIyLCAwCisgICAgICAgIGJsdCBjcjAsIExCQjFfMgorOyBCQiMxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAlZW50cnkKKyAgICAgICAgbXIgcjIsIHIzCitMQkIxXzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICVlbnRyeQorICAgICAgICBtciByMywgcjIKKyAgICAgICAgYmxyCisKK1RoaXMgY291bGQgYmUgcmVkdWNlZCB0byB0aGUgbXVjaCBzaW1wbGVyOgorCitfY2xhbXAwZzoKKyAgICAgICAgc3Jhd2kgcjIsIHIzLCAzMQorICAgICAgICBhbmRjIHIzLCByMywgcjIKKyAgICAgICAgYmxyCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworaW50IGZvbyhpbnQgTiwgaW50ICoqKlcsIGludCAqKlRLLCBpbnQgWCkgeworICBpbnQgdCwgaTsKKyAgCisgIGZvciAodCA9IDA7IHQgPCBOOyArK3QpCisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKyAgICAgIFdbdCAvIFhdW2ldW3QgJSBYXSA9IFRLW2ldW3RdOworICAgICAgCisgIHJldHVybiA1OworfQorCitXZSBnZW5lcmF0ZSByZWxhdGl2ZWx5IGF0cm9jaW91cyBjb2RlIGZvciB0aGlzIGxvb3AgY29tcGFyZWQgdG8gZ2NjLgorCitXZSBjb3VsZCBhbHNvIHN0cmVuZ3RoIHJlZHVjZSB0aGUgcmVtIGFuZCB0aGUgZGl2OgoraHR0cDovL3d3dy5sY3MubWl0LmVkdS9wdWJzL3BkZi9NSVQtTENTLVRNLTYwMC5wZGYKKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitmbG9hdCBmb28oZmxvYXQgWCkgeyByZXR1cm4gKGludCkoWCk7IH0KKworQ3VycmVudGx5IHByb2R1Y2VzOgorCitfZm9vOgorICAgICAgICBmY3Rpd3ogZjAsIGYxCisgICAgICAgIHN0ZmQgZjAsIC04KHIxKQorICAgICAgICBsd3ogcjIsIC00KHIxKQorICAgICAgICBleHRzdyByMiwgcjIKKyAgICAgICAgc3RkIHIyLCAtMTYocjEpCisgICAgICAgIGxmZCBmMCwgLTE2KHIxKQorICAgICAgICBmY2ZpZCBmMCwgZjAKKyAgICAgICAgZnJzcCBmMSwgZjAKKyAgICAgICAgYmxyCisKK1dlIGNvdWxkIHVzZSBhIHRhcmdldCBkYWcgY29tYmluZSB0byB0dXJuIHRoZSBsd3ovZXh0c3cgaW50byBhbiBsd2Egd2hlbiB0aGUgCitsd3ogaGFzIGEgc2luZ2xlIHVzZS4gIFNpbmNlIExXQSBpcyBjcmFja2VkIGFueXdheSwgdGhpcyB3b3VsZCBiZSBhIGNvZGVzaXplCit3aW4gb25seS4KKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitXZSBnZW5lcmF0ZSB1Z2x5IGNvZGUgZm9yIHRoaXM6CisKK3ZvaWQgZnVuYyh1bnNpZ25lZCBpbnQgKnJldCwgZmxvYXQgZHgsIGZsb2F0IGR5LCBmbG9hdCBkeiwgZmxvYXQgZHcpIHsKKyAgdW5zaWduZWQgY29kZSA9IDA7CisgIGlmKGR4IDwgLWR3KSBjb2RlIHw9IDE7CisgIGlmKGR4ID4gZHcpICBjb2RlIHw9IDI7CisgIGlmKGR5IDwgLWR3KSBjb2RlIHw9IDQ7CisgIGlmKGR5ID4gZHcpICBjb2RlIHw9IDg7CisgIGlmKGR6IDwgLWR3KSBjb2RlIHw9IDE2OworICBpZihkeiA+IGR3KSAgY29kZSB8PSAzMjsKKyAgKnJldCA9IGNvZGU7Cit9CisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworQ29tcGxldGUgdGhlIHNpZ25lZCBpMzIgdG8gRlAgY29udmVyc2lvbiBjb2RlIHVzaW5nIDY0LWJpdCByZWdpc3RlcnMKK3RyYW5zZm9ybWF0aW9uLCBnb29kIGZvciBQSS4gIFNlZSBQUENJU2VsTG93ZXJpbmcuY3BwLCB0aGlzIGNvbW1lbnQ6CisKKyAgICAgLy8gRklYTUU6IGRpc2FibGUgdGhpcyBsb3dlcmVkIGNvZGUuICBUaGlzIGdlbmVyYXRlcyA2NC1iaXQgcmVnaXN0ZXIgdmFsdWVzLAorICAgICAvLyBhbmQgd2UgZG9uJ3QgbW9kZWwgdGhlIGZhY3QgdGhhdCB0aGUgdG9wIHBhcnQgaXMgY2xvYmJlcmVkIGJ5IGNhbGxzLiAgV2UKKyAgICAgLy8gbmVlZCB0byBmbGFnIHRoZXNlIHRvZ2V0aGVyIHNvIHRoYXQgdGhlIHZhbHVlIGlzbid0IGxpdmUgYWNyb3NzIGEgY2FsbC4KKyAgICAgLy9zZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKworQWxzbywgaWYgdGhlIHJlZ2lzdGVycyBhcmUgc3BpbGxlZCB0byB0aGUgc3RhY2ssIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgYWxsCis2NC1iaXRzIG9mIHRoZW0gYXJlIHNhdmUvcmVzdG9yZWQsIG90aGVyd2lzZSB3ZSB3aWxsIG1pc2NvbXBpbGUgdGhlIGNvZGUuICBJdAorc291bmRzIGxpa2Ugd2UgbmVlZCB0byBnZXQgdGhlIDY0LWJpdCByZWdpc3RlciBjbGFzc2VzIGdvaW5nLgorCis9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisKKyVzdHJ1Y3QuQiA9IHR5cGUgeyBpOCwgWzMgeCBpOF0gfQorCitkZWZpbmUgdm9pZCBAYmFyKCVzdHJ1Y3QuQiogJWIpIHsKK2VudHJ5OgorICAgICAgICAldG1wID0gYml0Y2FzdCAlc3RydWN0LkIqICViIHRvIGkzMiogICAgICAgICAgICAgIDsgPHVpbnQqPiBbI3VzZXM9MV0KKyAgICAgICAgJXRtcCA9IGxvYWQgaTMyKiAldG1wICAgICAgICAgIDsgPHVpbnQ+IFsjdXNlcz0xXQorICAgICAgICAldG1wMyA9IGJpdGNhc3QgJXN0cnVjdC5CKiAlYiB0byBpMzIqICAgICAgICAgICAgIDsgPHVpbnQqPiBbI3VzZXM9MV0KKyAgICAgICAgJXRtcDQgPSBsb2FkIGkzMiogJXRtcDMgICAgICAgICAgICAgICAgOyA8dWludD4gWyN1c2VzPTFdCisgICAgICAgICV0bXA4ID0gYml0Y2FzdCAlc3RydWN0LkIqICViIHRvIGkzMiogICAgICAgICAgICAgOyA8dWludCo+IFsjdXNlcz0yXQorICAgICAgICAldG1wOSA9IGxvYWQgaTMyKiAldG1wOCAgICAgICAgICAgICAgICA7IDx1aW50PiBbI3VzZXM9MV0KKyAgICAgICAgJXRtcDQubWFzazE3ID0gc2hsIGkzMiAldG1wNCwgaTggMSAgICAgICAgICA7IDx1aW50PiBbI3VzZXM9MV0KKyAgICAgICAgJXRtcDE0MTUgPSBhbmQgaTMyICV0bXA0Lm1hc2sxNywgMjE0NzQ4MzY0OCAgICAgICAgICAgIDsgPHVpbnQ+IFsjdXNlcz0xXQorICAgICAgICAldG1wLm1hc2tlZCA9IGFuZCBpMzIgJXRtcCwgMjE0NzQ4MzY0OCAgICAgICAgIDsgPHVpbnQ+IFsjdXNlcz0xXQorICAgICAgICAldG1wMTEgPSBvciBpMzIgJXRtcDE0MTUsICV0bXAubWFza2VkICAgICAgICAgIDsgPHVpbnQ+IFsjdXNlcz0xXQorICAgICAgICAldG1wMTIgPSBhbmQgaTMyICV0bXA5LCAyMTQ3NDgzNjQ3ICAgICAgICAgICAgIDsgPHVpbnQ+IFsjdXNlcz0xXQorICAgICAgICAldG1wMTMgPSBvciBpMzIgJXRtcDEyLCAldG1wMTEgICAgICAgICA7IDx1aW50PiBbI3VzZXM9MV0KKyAgICAgICAgc3RvcmUgaTMyICV0bXAxMywgaTMyKiAldG1wOAorICAgICAgICByZXQgdm9pZAorfQorCitXZSBlbWl0OgorCitfZm9vOgorICAgICAgICBsd3ogcjIsIDAocjMpCisgICAgICAgIHNsd2kgcjQsIHIyLCAxCisgICAgICAgIG9yIHI0LCByNCwgcjIKKyAgICAgICAgcmx3aW1pIHIyLCByNCwgMCwgMCwgMAorICAgICAgICBzdHcgcjIsIDAocjMpCisgICAgICAgIGJscgorCitXZSBjb3VsZCBjb2xsYXBzZSBhIGJ1bmNoIG9mIHRob3NlIE9ScyBhbmQgQU5EcyBhbmQgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZworZXF1aXZhbGVudCBjb2RlOgorCitfZm9vOgorICAgICAgICBsd3ogcjIsIDAocjMpCisgICAgICAgIHJsd2lubSByNCwgcjIsIDEsIDAsIDAKKyAgICAgICAgb3IgcjIsIHIyLCByNAorICAgICAgICBzdHcgcjIsIDAocjMpCisgICAgICAgIGJscgorCis9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisKK1dlIGNvbXBpbGU6CisKK3Vuc2lnbmVkIHRlc3Q2KHVuc2lnbmVkIHgpIHsgCisgIHJldHVybiAoKHggJiAweDAwRkYwMDAwKSA+PiAxNikgfCAoKHggJiAweDAwMDAwMEZGKSA8PCAxNik7Cit9CisKK2ludG86CisKK190ZXN0NjoKKyAgICAgICAgbGlzIHIyLCAyNTUKKyAgICAgICAgcmx3aW5tIHIzLCByMywgMTYsIDAsIDMxCisgICAgICAgIG9yaSByMiwgcjIsIDI1NQorICAgICAgICBhbmQgcjMsIHIzLCByMgorICAgICAgICBibHIKKworR0NDIGdldHMgaXQgZG93biB0bzoKKworX3Rlc3Q2OgorICAgICAgICBybHdpbm0gcjAscjMsMTYsOCwxNQorICAgICAgICBybHdpbm0gcjMscjMsMTYsMjQsMzEKKyAgICAgICAgb3IgcjMscjMscjAKKyAgICAgICAgYmxyCisKKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitDb25zaWRlciBhIGZ1bmN0aW9uIGxpa2UgdGhpczoKKworZmxvYXQgZm9vKGZsb2F0IFgpIHsgcmV0dXJuIFggKyAxMjM0LjQxMjNmOyB9CisKK1RoZSBGUCBjb25zdGFudCBlbmRzIHVwIGluIHRoZSBjb25zdGFudCBwb29sLCBzbyB3ZSBuZWVkIHRvIGdldCB0aGUgTFIgcmVnaXN0ZXIuCisgVGhpcyBlbmRzIHVwIHByb2R1Y2luZyBjb2RlIGxpa2UgdGhpczoKKworX2ZvbzoKKy5MQkJfZm9vXzA6ICAgICA7IGVudHJ5CisgICAgICAgIG1mbHIgcjExCisqKiogICAgIHN0dyByMTEsIDgocjEpCisgICAgICAgIGJsICJMMDAwMDAkcGIiCisiTDAwMDAwJHBiIjoKKyAgICAgICAgbWZsciByMgorICAgICAgICBhZGRpcyByMiwgcjIsIGhhMTYoLkNQSV9mb29fMC0iTDAwMDAwJHBiIikKKyAgICAgICAgbGZzIGYwLCBsbzE2KC5DUElfZm9vXzAtIkwwMDAwMCRwYiIpKHIyKQorICAgICAgICBmYWRkcyBmMSwgZjEsIGYwCisqKiogICAgIGx3eiByMTEsIDgocjEpCisgICAgICAgIG10bHIgcjExCisgICAgICAgIGJscgorCitUaGlzIGlzIGZ1bmN0aW9uYWwsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gdG8gc3BpbGwgdGhlIExSIHJlZ2lzdGVyIGFsbCB0aGUgd2F5Cit0byB0aGUgc3RhY2sgKHRoZSB0d28gbWFya2VkIGluc3Rycyk6IHNwaWxsaW5nIGl0IHRvIGEgR1BSIGlzIHF1aXRlIGVub3VnaC4KKworSW1wbGVtZW50aW5nIHRoaXMgd2lsbCByZXF1aXJlIHNvbWUgY29kZWdlbiBpbXByb3ZlbWVudHMuICBOYXRlIHdyaXRlczoKKworIlNvIGJhc2ljYWxseSB3aGF0IHdlIG5lZWQgdG8gc3VwcG9ydCB0aGUgIm5vIHN0YWNrIGZyYW1lIHNhdmUgYW5kIHJlc3RvcmUiIGlzIGEKK2dlbmVyYWxpemF0aW9uIG9mIHRoZSBMUiBvcHRpbWl6YXRpb24gdG8gImNhbGxlZS1zYXZlIHJlZ3MiLgorCitDdXJyZW50bHksIHdlIGhhdmUgTFIgbWFya2VkIGFzIGEgY2FsbGVlLXNhdmUgcmVnLiAgVGhlIHJlZ2lzdGVyIGFsbG9jYXRvciBzZWVzCit0aGF0IGl0J3MgY2FsbGVlIHNhdmUsIGFuZCBzcGlsbHMgaXQgZGlyZWN0bHkgdG8gdGhlIHN0YWNrLgorCitJZGVhbGx5LCBzb21ldGhpbmcgbGlrZSB0aGlzIHdvdWxkIGhhcHBlbjoKKworTFIgd291bGQgYmUgaW4gYSBzZXBhcmF0ZSByZWdpc3RlciBjbGFzcyBmcm9tIHRoZSBHUFJzLiBUaGUgY2xhc3Mgb2YgTFIgd291bGQgYmUKK21hcmtlZCAidW5zcGlsbGFibGUiLiAgV2hlbiB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIGNhbWUgYWNyb3NzIGFuIHVuc3BpbGxhYmxlCityZWcsIGl0IHdvdWxkIGFzayAid2hhdCBpcyB0aGUgYmVzdCBjbGFzcyB0byBjb3B5IHRoaXMgaW50byB0aGF0IEkgKmNhbiogc3BpbGwiCitJZiBpdCBnZXRzIGEgY2xhc3MgYmFjaywgd2hpY2ggaXQgd2lsbCBpbiB0aGlzIGNhc2UgKHRoZSBncHJzKSwgaXQgZ3JhYnMgYSBmcmVlCityZWdpc3RlciBvZiB0aGF0IGNsYXNzLiAgSWYgaXQgaXMgdGhlbiBsYXRlciBuZWNlc3NhcnkgdG8gc3BpbGwgdGhhdCByZWcsIHNvIGJlCitpdC4KKworPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorCitXZSBjb21waWxlIHRoaXM6CitpbnQgdGVzdChfQm9vbCBYKSB7CisgIHJldHVybiBYID8gNTI0Mjg4IDogMDsKK30KKwordG86IAorX3Rlc3Q6CisgICAgICAgIGNtcGx3aSBjcjAsIHIzLCAwCisgICAgICAgIGxpcyByMiwgOAorICAgICAgICBsaSByMywgMAorICAgICAgICBiZXEgY3IwLCBMQkIxXzIgO2VudHJ5CitMQkIxXzE6IDtlbnRyeQorICAgICAgICBtciByMywgcjIKK0xCQjFfMjogO2VudHJ5CisgICAgICAgIGJsciAKKworaW5zdGVhZCBvZjoKK190ZXN0OgorICAgICAgICBhZGRpYyByMixyMywtMQorICAgICAgICBzdWJmZSByMCxyMixyMworICAgICAgICBzbHdpIHIzLHIwLDE5CisgICAgICAgIGJscgorCitUaGlzIHNvcnQgb2YgdGhpbmcgb2NjdXJzIGEgbG90IGR1ZSB0byBnbG9iYWxvcHQuCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworV2UgY29tcGlsZToKKworZGVmaW5lIGkzMiBAYmFyKGkzMiAleCkgbm91bndpbmQgcmVhZG5vbmUgc3NwIHsKK2VudHJ5OgorICAlMCA9IGljbXAgZXEgaTMyICV4LCAwICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMT4gWyN1c2VzPTFdCisgICVuZWcgPSBzZXh0IGkxICUwIHRvIGkzMiAgICAgICAgICAgICAgOyA8aTMyPiBbI3VzZXM9MV0KKyAgcmV0IGkzMiAlbmVnCit9CisKK3RvOgorCitfYmFyOgorCWNudGx6dyByMiwgcjMKKwlzbHdpIHIyLCByMiwgMjYKKwlzcmF3aSByMywgcjIsIDMxCisJYmxyIAorCitpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gcHJvZHVjZToKKworX2JhcjogCisgICAgICAgIGFkZGljIHIzLHIzLC0xCisgICAgICAgIHN1YmZlIHIzLHIzLHIzCisgICAgICAgIGJscgorCis9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisKK1dlIGN1cnJlbnRseSBjb21waWxlIDMyLWJpdCBic3dhcDoKKworZGVjbGFyZSBpMzIgQGxsdm0uYnN3YXAuaTMyKGkzMiAlQSkKK2RlZmluZSBpMzIgQHRlc3QoaTMyICVBKSB7CisgICAgICAgICVCID0gY2FsbCBpMzIgQGxsdm0uYnN3YXAuaTMyKGkzMiAlQSkKKyAgICAgICAgcmV0IGkzMiAlQgorfQorCit0bzoKKworX3Rlc3Q6CisgICAgICAgIHJsd2lubSByMiwgcjMsIDI0LCAxNiwgMjMKKyAgICAgICAgc2x3aSByNCwgcjMsIDI0CisgICAgICAgIHJsd2ltaSByMiwgcjMsIDgsIDI0LCAzMQorICAgICAgICBybHdpbWkgcjQsIHIzLCA4LCA4LCAxNQorICAgICAgICBybHdpbWkgcjQsIHIyLCAwLCAxNiwgMzEKKyAgICAgICAgbXIgcjMsIHI0CisgICAgICAgIGJsciAKKworaXQgd291bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8gcHJvZHVjZToKKworX2ZvbzogICBtciByMCxyMworICAgICAgICBybHdpbm0gcjMscjMsOCwweGZmZmZmZmZmCisgICAgICAgIHJsd2ltaSByMyxyMCwyNCwwLDcKKyAgICAgICAgcmx3aW1pIHIzLHIwLDI0LDE2LDIzCisgICAgICAgIGJscgorCis9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisKK3Rlc3QvQ29kZUdlbi9Qb3dlclBDLzIwMDctMDMtMjQtY250bHpkLmxsIGNvbXBpbGVzIHRvOgorCitfX1pOSzRsbHZtNUFQSW50MTdjb3VudExlYWRpbmdaZXJvc0V2OgorICAgICAgICBsZCByMiwgMChyMykKKyAgICAgICAgY250bHpkIHIyLCByMgorICAgICAgICBvciByMiwgcjIsIHIyICAgICA8PC0tIHNpbGx5LgorICAgICAgICBhZGRpIHIzLCByMiwgLTY0CisgICAgICAgIGJsciAKKworVGhlIGRlYWQgb3IgaXMgYSAndHJ1bmNhdGUnIGZyb20gNjQtIHRvIDMyLWJpdHMuCisKKz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworV2UgZ2VuZXJhdGUgaG9ycmlibGUgcHBjIGNvZGUgZm9yIHRoaXM6CisKKyNkZWZpbmUgTiAgMjAwMDAwMAorZG91YmxlICAgYVtOXSxjW05dOwordm9pZCBzaW1wbGVsb29wKCkgeworICAgaW50IGo7CisgICBmb3IgKGo9MDsgajxOOyBqKyspCisgICAgIGNbal0gPSBhW2pdOworfQorCitMQkIxXzE6IDtiYgorICAgICAgICBsZmR4IGYwLCByMywgcjQKKyAgICAgICAgYWRkaSByNSwgcjUsIDEgICAgICAgICAgICAgICAgIDs7IEV4dHJhIElWIGZvciB0aGUgZXhpdCB2YWx1ZSBjb21wYXJlLgorICAgICAgICBzdGZkeCBmMCwgcjIsIHI0CisgICAgICAgIGFkZGkgcjQsIHI0LCA4CisKKyAgICAgICAgeG9yaXMgcjYsIHI1LCAzMCAgICAgICAgICAgICAgIDs7IFRoaXMgaXMgZHVlIHRvIGEgbGFyZ2UgaW1tZWRpYXRlLgorICAgICAgICBjbXBsd2kgY3IwLCByNiwgMzM5MjAKKyAgICAgICAgYm5lIGNyMCwgTEJCMV8xCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpczoKKyAgICAgICAgI2luY2x1ZGUgPGFsZ29yaXRobT4KKyAgICAgICAgaW5saW5lIHN0ZDo6cGFpcjx1bnNpZ25lZCwgYm9vbD4gZnVsbF9hZGQodW5zaWduZWQgYSwgdW5zaWduZWQgYikKKyAgICAgICAgeyByZXR1cm4gc3RkOjptYWtlX3BhaXIoYSArIGIsIGEgKyBiIDwgYSk7IH0KKyAgICAgICAgYm9vbCBub19vdmVyZmxvdyh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQorICAgICAgICB7IHJldHVybiAhZnVsbF9hZGQoYSwgYikuc2Vjb25kOyB9CisKK1Nob3VsZCBjb21waWxlIHRvOgorCitfX1oxMW5vX292ZXJmbG93amo6CisgICAgICAgIGFkZCByNCxyMyxyNAorICAgICAgICBzdWJmYyByMyxyMyxyNAorICAgICAgICBsaSByMywwCisgICAgICAgIGFkZGUgcjMscjMscjMKKyAgICAgICAgYmxyCisKKyhvciBiZXR0ZXIpIG5vdDoKKworX19aMTFub19vdmVyZmxvd2pqOgorICAgICAgICBhZGQgcjIsIHI0LCByMworICAgICAgICBjbXBsdyBjcjcsIHIyLCByMworICAgICAgICBtZmNyIHIyCisgICAgICAgIHJsd2lubSByMiwgcjIsIDI5LCAzMSwgMzEKKyAgICAgICAgeG9yaSByMywgcjIsIDEKKyAgICAgICAgYmxyIAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIGNvbXBpbGUgc29tZSBGUCBjb21wYXJpc29ucyBpbnRvIGFuIG1mY3Igd2l0aCB0d28gcmx3aW5tcyBhbmQgYW4gb3IuICBGb3IKK2V4YW1wbGU6CisjaW5jbHVkZSA8bWF0aC5oPgoraW50IHRlc3QoZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiBpc2xlc3NlcXVhbCh4LCB5KTt9CitpbnQgdGVzdDIoZG91YmxlIHgsIGRvdWJsZSB5KSB7ICByZXR1cm4gaXNsZXNzZ3JlYXRlcih4LCB5KTt9CitpbnQgdGVzdDMoZG91YmxlIHgsIGRvdWJsZSB5KSB7ICByZXR1cm4gIWlzbGVzc2VxdWFsKHgsIHkpO30KKworQ29tcGlsZXMgaW50byAoYWxsIHRocmVlIGFyZSBzaW1pbGFyLCBidXQgdGhlIGJpdHMgZGlmZmVyKToKKworX3Rlc3Q6CisJZmNtcHUgY3I3LCBmMSwgZjIKKwltZmNyIHIyCisJcmx3aW5tIHIzLCByMiwgMjksIDMxLCAzMQorCXJsd2lubSByMiwgcjIsIDMxLCAzMSwgMzEKKwlvciByMywgcjIsIHIzCisJYmxyIAorCitHQ0MgY29tcGlsZXMgdGhpcyBpbnRvOgorCisgX3Rlc3Q6CisJZmNtcHUgY3I3LGYxLGYyCisJY3JvciAzMCwyOCwzMAorCW1mY3IgcjMKKwlybHdpbm0gcjMscjMsMzEsMQorCWJscgorICAgICAgICAKK3doaWNoIGlzIG1vcmUgZWZmaWNpZW50IGFuZCBjYW4gdXNlIG1mb2NyLiAgU2VlIFBSNjQyIGZvciBzb21lIG1vcmUgY29udGV4dC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIGZvbyhmbG9hdCAqZGF0YSwgZmxvYXQgZCkgeworICAgbG9uZyBpOworICAgZm9yIChpID0gMDsgaSA8IDgwMDA7IGkrKykKKyAgICAgIGRhdGFbaV0gPSBkOworfQordm9pZCBmb28yKGZsb2F0ICpkYXRhLCBmbG9hdCBkKSB7CisgICBsb25nIGk7CisgICBkYXRhLS07CisgICBmb3IgKGkgPSAwOyBpIDwgODAwMDsgaSsrKSB7CisgICAgICBkYXRhWzFdID0gZDsKKyAgICAgIGRhdGErKzsKKyAgIH0KK30KKworVGhlc2UgY29tcGlsZSB0bzoKKworX2ZvbzoKKwlsaSByMiwgMAorTEJCMV8xOgk7IGJiCisJYWRkaSByNCwgcjIsIDQKKwlzdGZzeCBmMSwgcjMsIHIyCisJY21wbHdpIGNyMCwgcjQsIDMyMDAwCisJbXIgcjIsIHI0CisJYm5lIGNyMCwgTEJCMV8xCTsgYmIKKwlibHIgCitfZm9vMjoKKwlsaSByMiwgMAorTEJCMl8xOgk7IGJiCisJYWRkaSByNCwgcjIsIDQKKwlzdGZzeCBmMSwgcjMsIHIyCisJY21wbHdpIGNyMCwgcjQsIDMyMDAwCisJbXIgcjIsIHI0CisJYm5lIGNyMCwgTEJCMl8xCTsgYmIKKwlibHIgCisKK1RoZSAnbXInIGNvdWxkIGJlIGVsaW1pbmF0ZWQgdG8gZm9sZGluZyB0aGUgYWRkIGludG8gdGhlIGNtcCBiZXR0ZXIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK0NvZGVnZW4gZm9yIHRoZSBmb2xsb3dpbmcgKGxvdy1wcm9iYWJpbGl0eSkgY2FzZSBkZXRlcmlvcmF0ZWQgY29uc2lkZXJhYmx5IAord2hlbiB0aGUgY29ycmVjdG5lc3MgZml4ZXMgZm9yIHVub3JkZXJlZCBjb21wYXJpc29ucyB3ZW50IGluIChQUiA2NDIsIDU4ODcxKS4KK0l0IHNob3VsZCBiZSBwb3NzaWJsZSB0byByZWNvdmVyIHRoZSBjb2RlIHF1YWxpdHkgZGVzY3JpYmVkIGluIHRoZSBjb21tZW50cy4KKworOyBSVU46IGxsdm0tYXMgPCAlcyB8IGxsYyAtbWFyY2g9cHBjMzIgIHwgZ3JlcCBvciB8IGNvdW50IDMKKzsgVGhpcyBzaG91bGQgcHJvZHVjZSBvbmUgJ29yJyBvciAnY3JvcicgaW5zdHJ1Y3Rpb24gcGVyIGZ1bmN0aW9uLgorCis7IFJVTjogbGx2bS1hcyA8ICVzIHwgbGxjIC1tYXJjaD1wcGMzMiAgfCBncmVwIG1mY3IgfCBjb3VudCAzCis7IFBSMjk2NAorCitkZWZpbmUgaTMyIEB0ZXN0KGRvdWJsZSAleCwgZG91YmxlICV5KSBub3Vud2luZCAgeworZW50cnk6CisJJXRtcDMgPSBmY21wIG9sZSBkb3VibGUgJXgsICV5CQk7IDxpMT4gWyN1c2VzPTFdCisJJXRtcDM0NSA9IHpleHQgaTEgJXRtcDMgdG8gaTMyCQk7IDxpMzI+IFsjdXNlcz0xXQorCXJldCBpMzIgJXRtcDM0NQorfQorCitkZWZpbmUgaTMyIEB0ZXN0Mihkb3VibGUgJXgsIGRvdWJsZSAleSkgbm91bndpbmQgIHsKK2VudHJ5OgorCSV0bXAzID0gZmNtcCBvbmUgZG91YmxlICV4LCAleQkJOyA8aTE+IFsjdXNlcz0xXQorCSV0bXAzNDUgPSB6ZXh0IGkxICV0bXAzIHRvIGkzMgkJOyA8aTMyPiBbI3VzZXM9MV0KKwlyZXQgaTMyICV0bXAzNDUKK30KKworZGVmaW5lIGkzMiBAdGVzdDMoZG91YmxlICV4LCBkb3VibGUgJXkpIG5vdW53aW5kICB7CitlbnRyeToKKwkldG1wMyA9IGZjbXAgdWd0IGRvdWJsZSAleCwgJXkJCTsgPGkxPiBbI3VzZXM9MV0KKwkldG1wMzQgPSB6ZXh0IGkxICV0bXAzIHRvIGkzMgkJOyA8aTMyPiBbI3VzZXM9MV0KKwlyZXQgaTMyICV0bXAzNAorfQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKzsgUlVOOiBsbHZtLWFzIDwgJXMgfCBsbGMgLW1hcmNoPXBwYzMyIHwgbm90IGdyZXAgZm5lZworCis7IFRoaXMgY291bGQgZ2VuZXJhdGUgRlNFTCB3aXRoIGFwcHJvcHJpYXRlIGZsYWdzIChGU0VMIGlzIG5vdCBJRUVFLXNhZmUsIGFuZCAKKzsgc2hvdWxkIG5vdCBiZSBnZW5lcmF0ZWQgZXhjZXB0IHdpdGggLWVuYWJsZS1maW5pdGUtb25seS1mcC1tYXRoIG9yIHRoZSBsaWtlKS4KKzsgV2l0aCB0aGUgY29ycmVjdG5lc3MgZml4ZXMgZm9yIFBSNjQyICg1ODg3MSkgTG93ZXJTRUxFQ1RfQ0Mgd291bGQgbmVlZCB0bworOyByZWNvZ25pemUgYSBtb3JlIGVsYWJvcmF0ZSB0cmVlIHRoYW4gYSBzaW1wbGUgU0VUeHguCisKK2RlZmluZSBkb3VibGUgQHRlc3RfRk5FR19zZWwoZG91YmxlICVBLCBkb3VibGUgJUIsIGRvdWJsZSAlQykgeworICAgICAgICAlRCA9IGZzdWIgZG91YmxlIC0wLjAwMDAwMGUrMDAsICVBICAgICAgICAgICAgICAgOyA8ZG91YmxlPiBbI3VzZXM9MV0KKyAgICAgICAgJUNvbmQgPSBmY21wIHVndCBkb3VibGUgJUQsIC0wLjAwMDAwMGUrMDAgICAgICAgICAgICAgICA7IDxpMT4gWyN1c2VzPTFdCisgICAgICAgICVFID0gc2VsZWN0IGkxICVDb25kLCBkb3VibGUgJUIsIGRvdWJsZSAlQyAgICAgICAgICAgICAgOyA8ZG91YmxlPiBbI3VzZXM9MV0KKyAgICAgICAgcmV0IGRvdWJsZSAlRQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworVGhlIHNhdmUvcmVzdG9yZSBzZXF1ZW5jZSBmb3IgQ1IgaW4gcHJvbG9nL2VwaWxvZyBpcyB0ZXJyaWJsZToKKy0gRWFjaCBDUiBzdWJyZWcgaXMgc2F2ZWQgaW5kaXZpZHVhbGx5LCByYXRoZXIgdGhhbiBkb2luZyBvbmUgc2F2ZSBhcyBhIHVuaXQuCistIE9uIERhcndpbiwgdGhlIHNhdmUgaXMgZG9uZSBhZnRlciB0aGUgZGVjcmVtZW50IG9mIFNQLCB3aGljaCBtZWFucyB0aGUgb2Zmc2V0Citmcm9tIFNQIG9mIHRoZSBzYXZlIHNsb3QgY2FuIGJlIHRvbyBiaWcgZm9yIGEgc3RvcmUgaW5zdHJ1Y3Rpb24sIHdoaWNoIG1lYW5zIHdlCituZWVkIGFuIGFkZGl0aW9uYWwgcmVnaXN0ZXIgKGN1cnJlbnRseSBoYWNrZWQgaW4gOTYwMTUrOTYwMjA7IHRoZSBzb2x1dGlvbiB0aGVyZQoraXMgY29ycmVjdCwgYnV0IHBvb3IpLgorLSBPbiBTVlI0IHRoZSBzYW1lIHRoaW5nIGNhbiBoYXBwZW4sIGFuZCBJIGRvbid0IHRoaW5rIHNhdmluZyBiZWZvcmUgdGhlIFNQCitkZWNyZW1lbnQgaXMgc2FmZSBvbiB0aGF0IHRhcmdldCwgYXMgdGhlcmUgaXMgbm8gcmVkIHpvbmUuICBUaGlzIGlzIGN1cnJlbnRseQorYnJva2VuIEFGQUlLLCBhbHRob3VnaCBpdCdzIG5vdCBhIHRhcmdldCBJIGNhbiBleGVyY2lzZS4KK1RoZSBmb2xsb3dpbmcgZGVtb25zdHJhdGVzIHRoZSBwcm9ibGVtOgorZXh0ZXJuIHZvaWQgYmFyKGNoYXIgKnApOwordm9pZCBmb28oKSB7CisgIGNoYXIgeFsxMDAwMDBdOworICBiYXIoeCk7CisgIF9fYXNtX18oIiIgOjo6ICJjcjIiKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9SRUFETUVfQUxUSVZFQy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUkVBRE1FX0FMVElWRUMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNGM2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvUkVBRE1FX0FMVElWRUMudHh0CkBAIC0wLDAgKzEsMjExIEBACisvLz09PS0gUkVBRE1FX0FMVElWRUMudHh0IC0gTm90ZXMgZm9yIGltcHJvdmluZyBBbHRpdmVjIGNvZGUgZ2VuIC0tLS0tLS0tLS09PT0vLworCitJbXBsZW1lbnQgUFBDSW5zdHJJbmZvOjppc0xvYWRGcm9tU3RhY2tTbG90L2lzU3RvcmVUb1N0YWNrU2xvdCBmb3IgdmVjdG9yCityZWdpc3RlcnMsIHRvIGdlbmVyYXRlIGJldHRlciBzcGlsbCBjb2RlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGUgZmlyc3Qgc2hvdWxkIGJlIGEgc2luZ2xlIGx2eCBmcm9tIHRoZSBjb25zdGFudCBwb29sLCB0aGUgc2Vjb25kIHNob3VsZCBiZSAKK2EgeG9yL3N0dng6CisKK3ZvaWQgZm9vKHZvaWQpIHsKKyAgaW50IHhbOF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxMjgpKSkgPSB7IDEsIDEsIDEsIDE3LCAxLCAxLCAxLCAxIH07CisgIGJhciAoeCk7Cit9CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK3ZvaWQgZm9vKHZvaWQpIHsKKyAgaW50IHhbOF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxMjgpKSk7CisgIG1lbXNldCAoeCwgMCwgc2l6ZW9mICh4KSk7CisgIGJhciAoeCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0FsdGl2ZWM6IENvZGVnZW4naW5nIE1VTCB3aXRoIHZlY3RvciBGTUFERCBzaG91bGQgYWRkIC0wLjAsIG5vdCAwLjA6CitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTg3NjMKKworV2hlbiAtZmZhc3QtbWF0aCBpcyBvbiwgd2UgY2FuIHVzZSAwLjAuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc2lkZXIgdGhpczoKKyAgdjRmMzIgVmVjdG9yOworICB2NGYzMiBWZWN0b3IyID0geyBWZWN0b3IuWCwgVmVjdG9yLlgsIFZlY3Rvci5YLCBWZWN0b3IuWCB9OworCitTaW5jZSB3ZSBrbm93IHRoYXQgIlZlY3RvciIgaXMgMTYtYnl0ZSBhbGlnbmVkIGFuZCB3ZSBrbm93IHRoZSBlbGVtZW50IG9mZnNldCAKK29mICIuWCIsIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGxvYWQgaW50byBhIGx2ZSp4IGluc3RydWN0aW9uLCBpbnN0ZWFkIG9mIGRvaW5nCithIGxvYWQvc3RvcmUvbHZlKnggc2VxdWVuY2UuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0ZvciBmdW5jdGlvbnMgdGhhdCB1c2UgYWx0aXZlYyBBTkQgaGF2ZSBjYWxscywgd2UgYXJlIFZSU0FWRSdpbmcgYWxsIGNhbGwKK2Nsb2JiZXJlZCByZWdzLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbXBsZW1lbnQgcGFzc2luZyB2ZWN0b3JzIGJ5IHZhbHVlIGludG8gY2FsbHMgYW5kIHJlY2VpdmluZyB0aGVtIGFzIGFyZ3VtZW50cy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworR0NDIGFwcGFyZW50bHkgdHJpZXMgdG8gY29kZWdlbiB7IEMxLCBDMiwgVmFyaWFibGUsIEMzIH0gYXMgYSBjb25zdGFudCBwb29sIGxvYWQKK29mIEMxL0MyL0MzLCB0aGVuIGEgbG9hZCBhbmQgdnBlcm0gb2YgVmFyaWFibGUuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIG5lZWQgYSB3YXkgdG8gdGVhY2ggdGJsZ2VuIHRoYXQgc29tZSBvcGVyYW5kcyBvZiBhbiBpbnRyaW5zaWMgYXJlIHJlcXVpcmVkIHRvCitiZSBjb25zdGFudHMuICBUaGUgdmVyaWZpZXIgc2hvdWxkIGVuZm9yY2UgdGhpcyBjb25zdHJhaW50LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBjdXJyZW50bHkgY29kZWdlbiBTQ0FMQVJfVE9fVkVDVE9SIGFzIGEgc3RvcmUgb2YgdGhlIHNjYWxhciB0byBhIDE2LWJ5dGUKK2FsaWduZWQgc3RhY2sgc2xvdCwgZm9sbG93ZWQgYnkgYSBsb2FkL3ZwZXJtLiAgV2Ugc2hvdWxkIHByb2JhYmx5IGp1c3Qgc3RvcmUgaXQKK3RvIGEgc2NhbGFyIHN0YWNrIHNsb3QsIHRoZW4gdXNlIGx2c2wvdnBlcm0gdG8gbG9hZCBpdC4gIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5CitpbiBtZW1vcnkgdGhpcyBpcyBhIGJpZyB3aW4uCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2V4dHJhY3RfdmVjdG9yX2VsdCBvZiBhbiBhcmJpdHJhcnkgY29uc3RhbnQgdmVjdG9yIGNhbiBiZSBkb25lIHdpdGggdGhlIAorZm9sbG93aW5nIGluc3RydWN0aW9uczoKKwordlRlbXAgPSB2ZWNfc3BsYXQodjAsMik7ICAgIC8vIDIgaXMgdGhlIGVsZW1lbnQgdGhlIHNyYyBpcyBpbi4KK3ZlY19zdGUoJmRlc3Rsb2MsMCx2VGVtcCk7CisKK1dlIGNhbiBkbyBhbiBhcmJpdHJhcnkgbm9uLWNvbnN0YW50IHZhbHVlIGJ5IHVzaW5nIGx2c3IvcGVybS9zdGUuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0lmIHdlIHdhbnQgdG8gdGllIGluc3RydWN0aW9uIHNlbGVjdGlvbiBpbnRvIHRoZSBzY2hlZHVsZXIsIHdlIGNhbiBkbyBzb21lCitjb25zdGFudCBmb3JtYXRpb24gd2l0aCBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zLiAgRm9yIGV4YW1wbGUsIHdlIGNhbiBnZW5lcmF0ZQorInZzcGx0aSAtMSIgd2l0aCAidmNtcGVxdXcgUixSIiBhbmQgMSwxLDEsMSB3aXRoICJ2c3ViY3V3IFIsUiIsIGFuZCAwLDAsMCwwIHdpdGgKKyJ2c3BsdGkgMCIgb3IgInZ4b3IiLCBlYWNoIG9mIHdoaWNoIHVzZSBkaWZmZXJlbnQgZXhlY3V0aW9uIHVuaXRzLCB0aHVzIGNvdWxkCitoZWxwIHNjaGVkdWxpbmcuCisKK1RoaXMgaXMgcHJvYmFibHkgb25seSByZWFzb25hYmxlIGZvciBhIHBvc3QtcGFzcyBzY2hlZHVsZXIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0ZvciB0aGlzIGZ1bmN0aW9uOgorCit2b2lkIHRlc3QodmVjdG9yIGZsb2F0ICpBLCB2ZWN0b3IgZmxvYXQgKkIpIHsKKyAgdmVjdG9yIGZsb2F0IEMgPSAodmVjdG9yIGZsb2F0KXZlY19jbXBlcSgqQSwgKkIpOworICBpZiAoIXZlY19hbnlfZXEoKkEsICpCKSkKKyAgICAqQiA9ICh2ZWN0b3IgZmxvYXQpezAsMCwwLDB9OworICAqQSA9IEM7Cit9CisKK3dlIGdldCB0aGUgZm9sbG93aW5nIGJhc2ljIGJsb2NrOgorCisJLi4uCisgICAgICAgIGx2eCB2MiwgMCwgcjQKKyAgICAgICAgbHZ4IHYzLCAwLCByMworICAgICAgICB2Y21wZXFmcCB2NCwgdjMsIHYyCisgICAgICAgIHZjbXBlcWZwLiB2MiwgdjMsIHYyCisgICAgICAgIGJuZSBjcjYsIExCQjFfMiA7IGNvbmRfbmV4dAorCitUaGUgdmNtcGVxZnAvdmNtcGVxZnAuIGluc3RydWN0aW9ucyBjdXJyZW50bHkgY2Fubm90IGJlIG1lcmdlZCB3aGVuIHRoZQordmNtcGVxZnAuIHJlc3VsdCBpcyB1c2VkIGJ5IGEgYnJhbmNoLiAgVGhpcyBjYW4gYmUgaW1wcm92ZWQuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZSBjb2RlIGdlbmVyYXRlZCBmb3IgdGhpcyBpcyB0cnVseSBhd2VmdWw6CisKK3ZlY3RvciBmbG9hdCB0ZXN0KGZsb2F0IGEsIGZsb2F0IGIpIHsKKyByZXR1cm4gKHZlY3RvciBmbG9hdCl7IDAuMCwgYSwgMC4wLCAwLjB9OyAKK30KKworTENQSTFfMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgZmxvYXQKKyAgICAgICAgLnNwYWNlICA0CisgICAgICAgIC50ZXh0CisgICAgICAgIC5nbG9ibCAgX3Rlc3QKKyAgICAgICAgLmFsaWduICA0CitfdGVzdDoKKyAgICAgICAgbWZzcHIgcjIsIDI1NgorICAgICAgICBvcmlzIHIzLCByMiwgNDA5NgorICAgICAgICBtdHNwciAyNTYsIHIzCisgICAgICAgIGxpcyByMywgaGExNihMQ1BJMV8wKQorICAgICAgICBhZGRpIHI0LCByMSwgLTMyCisgICAgICAgIHN0ZnMgZjEsIC0xNihyMSkKKyAgICAgICAgYWRkaSByNSwgcjEsIC0xNgorICAgICAgICBsZnMgZjAsIGxvMTYoTENQSTFfMCkocjMpCisgICAgICAgIHN0ZnMgZjAsIC0zMihyMSkKKyAgICAgICAgbHZ4IHYyLCAwLCByNAorICAgICAgICBsdnggdjMsIDAsIHI1CisgICAgICAgIHZtcmdodyB2MywgdjMsIHYyCisgICAgICAgIHZzcGx0dyB2MiwgdjIsIDAKKyAgICAgICAgdm1yZ2h3IHYyLCB2MiwgdjMKKyAgICAgICAgbXRzcHIgMjU2LCByMgorICAgICAgICBibHIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW50IGZvbyh2ZWN0b3IgZmxvYXQgKngsIHZlY3RvciBmbG9hdCAqeSkgeworICAgICAgICBpZiAodmVjX2FsbF9lcSgqeCwqeSkpIHJldHVybiAzMjQ1OyAKKyAgICAgICAgZWxzZSByZXR1cm4gMTI7Cit9CisKK0EgcHJlZGljYXRlIGNvbXBhcmUgYmVpbmcgdXNlZCBpbiBhIHNlbGVjdF9jYyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBwZWVwaG9sZQorYXBwbGllZCB0byBpdCBhcyBhIHByZWRpY2F0ZSBjb21wYXJlIHVzZWQgYnkgYSBicl9jYy4gIFRoZXJlIHNob3VsZCBiZSBubworbWZjciBoZXJlOgorCitfZm9vOgorICAgICAgICBtZnNwciByMiwgMjU2CisgICAgICAgIG9yaXMgcjUsIHIyLCAxMjI4OAorICAgICAgICBtdHNwciAyNTYsIHI1CisgICAgICAgIGxpIHI1LCAxMgorICAgICAgICBsaSByNiwgMzI0NQorICAgICAgICBsdnggdjIsIDAsIHI0CisgICAgICAgIGx2eCB2MywgMCwgcjMKKyAgICAgICAgdmNtcGVxZnAuIHYyLCB2MywgdjIKKyAgICAgICAgbWZjciByMywgMgorICAgICAgICBybHdpbm0gcjMsIHIzLCAyNSwgMzEsIDMxCisgICAgICAgIGNtcHdpIGNyMCwgcjMsIDAKKyAgICAgICAgYm5lIGNyMCwgTEJCMV8yIDsgZW50cnkKK0xCQjFfMTogOyBlbnRyeQorICAgICAgICBtciByNiwgcjUKK0xCQjFfMjogOyBlbnRyeQorICAgICAgICBtciByMywgcjYKKyAgICAgICAgbXRzcHIgMjU2LCByMgorICAgICAgICBibHIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQ29kZUdlbi9Qb3dlclBDL3ZlY19jb25zdGFudHMubGwgaGFzIGFuIGFuZCBvcGVyYXRpb24gdGhhdCBzaG91bGQgYmUKK2NvZGVnZW4nZCB0byBhbmRjLiAgVGhlIGlzc3VlIGlzIHRoYXQgdGhlICdhbGwgb25lcycgYnVpbGQgdmVjdG9yIGlzCitTZWxlY3ROb2RlVG8nZCBhIFZTUExUSVNCIGluc3RydWN0aW9uIG5vZGUgYmVmb3JlIHRoZSBhbmQveG9yIGlzIHNlbGVjdGVkCit3aGljaCBwcmV2ZW50cyB0aGUgdm5vdCBwYXR0ZXJuIGZyb20gbWF0Y2hpbmcuCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN0b3JlL3N0b3JlL2xvYWQgYXBwcm9hY2ggZm9yIGlsbGVnYWwgaW5zZXJ0IGVsZW1lbnQgCitsb3dlcmluZyB3b3VsZCBiZToKKworMS4gc3RvcmUgZWxlbWVudCB0byBhbnkgb2wnIHNsb3QKKzIuIGx2eCB0aGUgc2xvdAorMy4gbHZzbCAwOyBzcGxhdCBpbmRleDsgdmNtcGVxIHRvIGdlbmVyYXRlIGEgc2VsZWN0IG1hc2sKKzQuIGx2c2wgc2xvdCArIHg7IHZwZXJtIHRvIHJvdGF0ZSByZXN1bHQgaW50byBjb3JyZWN0IHNsb3QKKzUuIHZzZWwgcmVzdWx0IHRvZ2V0aGVyLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTaG91bGQgY29kZWdlbiBicmFuY2hlcyBvbiB2ZWNfYW55L3ZlY19hbGwgdG8gYXZvaWQgbWZjci4gIFR3byBleGFtcGxlczoKKworI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyBpbnQgZih2ZWN0b3IgZmxvYXQgYSwgdmVjdG9yIGZsb2F0IGIpCisgeworICBpbnQgYWEgPSAwOworICBpZiAodmVjX2FsbF9nZShhLCBiKSkKKyAgICBhYSB8PSAweDE7CisgIGlmICh2ZWNfYW55X2dlKGEsYikpCisgICAgYWEgfD0gMHgyOworICByZXR1cm4gYWE7Cit9CisKK3ZlY3RvciBmbG9hdCBmKHZlY3RvciBmbG9hdCBhLCB2ZWN0b3IgZmxvYXQgYikgeyAKKyAgaWYgKHZlY19hbnlfZXEoYSwgYikpIAorICAgIHJldHVybiBhOyAKKyAgZWxzZSAKKyAgICByZXR1cm4gYjsgCit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4ZDU5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTVBvd2VyUENJbmZvCisgIFBvd2VyUENUYXJnZXRJbmZvLmNwcAorICApCisKK2FkZF9kZXBlbmRlbmNpZXMoTExWTVBvd2VyUENJbmZvIFBvd2VyUENDb2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1RhcmdldEluZm8vTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvVGFyZ2V0SW5mby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTAxYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9Qb3dlclBDL1RhcmdldEluZm8vTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvUG93ZXJQQy9UYXJnZXRJbmZvL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVBvd2VyUENJbmZvCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFBGTEFHUyA9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvVGFyZ2V0SW5mby9Qb3dlclBDVGFyZ2V0SW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1Bvd2VyUEMvVGFyZ2V0SW5mby9Qb3dlclBDVGFyZ2V0SW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2MDdkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvUG93ZXJQQy9UYXJnZXRJbmZvL1Bvd2VyUENUYXJnZXRJbmZvLmNwcApAQCAtMCwwICsxLDIzIEBACisvLz09PS0tIFBvd2VyUENUYXJnZXRJbmZvLmNwcCAtIFBvd2VyUEMgVGFyZ2V0IEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiUFBDLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1RhcmdldCBsbHZtOjpUaGVQUEMzMlRhcmdldCwgbGx2bTo6VGhlUFBDNjRUYXJnZXQ7CisKK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZVBvd2VyUENUYXJnZXRJbmZvKCkgeyAKKyAgUmVnaXN0ZXJUYXJnZXQ8VHJpcGxlOjpwcGMsIC8qSGFzSklUPSovdHJ1ZT4KKyAgICBYKFRoZVBQQzMyVGFyZ2V0LCAicHBjMzIiLCAiUG93ZXJQQyAzMiIpOworCisgIFJlZ2lzdGVyVGFyZ2V0PFRyaXBsZTo6cHBjNjQsIC8qSGFzSklUPSovdHJ1ZT4KKyAgICBZKFRoZVBQQzY0VGFyZ2V0LCAicHBjNjQiLCAiUG93ZXJQQyA2NCIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9SRUFETUUudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYWY4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1JFQURNRS50eHQKQEAgLTAsMCArMSwxOTM5IEBACitUYXJnZXQgSW5kZXBlbmRlbnQgT3Bwb3J0dW5pdGllczoKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitEZWFkIGFyZ3VtZW50IGVsaW1pbmF0aW9uIHNob3VsZCBiZSBlbmhhbmNlZCB0byBoYW5kbGUgY2FzZXMgd2hlbiBhbiBhcmd1bWVudCBpcworZGVhZCB0byBhbiBleHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24uICBUaG91Z2ggdGhlIGFyZ3VtZW50IGNhbid0IGJlIHJlbW92ZWQKK2Zyb20gdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbiwgdGhlIGNhbGxlciBkb2Vzbid0IG5lZWQgdG8gcGFzcyBpdCBpbi4KK0ZvciBleGFtcGxlIGluIHRoaXMgdGVzdGNhc2U6CisKKyAgdm9pZCBmb28oaW50IFgpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7CisgIHZvaWQgZm9vKGludCBYKSB7IHNpZGVlZmZlY3QoKTsgfQorICB2b2lkIGJhcihpbnQgQSkgeyBmb28oQSsxKTsgfQorCitXZSBjb21waWxlIGJhciB0bzoKKworZGVmaW5lIHZvaWQgQGJhcihpMzIgJUEpIG5vdW53aW5kIHNzcCB7CisgICUwID0gYWRkIG5zdyBpMzIgJUEsIDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgPGkzMj4gWyN1c2VzPTFdCisgIHRhaWwgY2FsbCB2b2lkIEBmb28oaTMyICUwKSBub3Vud2luZCBub2lubGluZSBzc3AKKyAgcmV0IHZvaWQKK30KKworVGhlIGFkZCBpcyBkZWFkLCB3ZSBjb3VsZCBwYXNzIGluICdpMzIgdW5kZWYnIGluc3RlYWQuICBUaGlzIG9jY3VycyBmb3IgQysrCit0ZW1wbGF0ZXMgZXRjLCB3aGljaCB1c3VhbGx5IGhhdmUgbGlua29uY2Vfb2RyL3dlYWtfb2RyIGxpbmthZ2UsIG5vdCBpbnRlcm5hbAorbGlua2FnZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXaXRoIHRoZSByZWNlbnQgY2hhbmdlcyB0byBtYWtlIHRoZSBpbXBsaWNpdCBkZWYvdXNlIHNldCBleHBsaWNpdCBpbgorbWFjaGluZWluc3Rycywgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgdGFyZ2V0IGRlc2NyaXB0aW9ucyBmb3IgJ2NhbGwnIGluc3RydWN0aW9ucworc28gdGhhdCB0aGUgLnRkIGZpbGVzIGRvbid0IGxpc3QgYWxsIHRoZSBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcnMgYXMgaW1wbGljaXQKK2RlZnMuICBJbnN0ZWFkLCB0aGVzZSBzaG91bGQgYmUgYWRkZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIChlLmcuIG9uIHRoZSBkYWcpLgorCitUaGlzIGhhcyBhIG51bWJlciBvZiB1c2VzOgorCisxLiBQUEMzMi82NCBhbmQgWDg2IDMyLzY0IGNhbiBhdm9pZCBoYXZpbmcgbXVsdGlwbGUgY29waWVzIG9mIGNhbGwgaW5zdHJ1Y3Rpb25zCisgICBmb3IgdGhlaXIgZGlmZmVyZW50IGltcGRlZiBzZXRzLgorMi4gVGFyZ2V0cyB3aXRoIG11bHRpcGxlIGNhbGxpbmcgY29udnMgKGUuZy4geDg2KSB3aGljaCBoYXZlIGRpZmZlcmVudCBjbG9iYmVyCisgICBzZXRzIGRvbid0IG5lZWQgY29waWVzIG9mIGNhbGwgaW5zdHJ1Y3Rpb25zLgorMy4gJ0ludGVycHJvY2VkdXJhbCByZWdpc3RlciBhbGxvY2F0aW9uJyBjYW4gYmUgZG9uZSB0byByZWR1Y2UgdGhlIGNsb2JiZXIgc2V0cworICAgb2YgY2FsbHMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworTWFrZSB0aGUgUFBDIGJyYW5jaCBzZWxlY3RvciB0YXJnZXQgaW5kZXBlbmRhbnQKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitHZXQgdGhlIEMgZnJvbnQtZW5kIHRvIGV4cGFuZCBoeXBvdCh4LHkpIC0+IGxsdm0uc3FydCh4KngreSp5KSB3aGVuIGVycm5vIGFuZAorcHJlY2lzaW9uIGRvbid0IG1hdHRlciAoZmZhc3RtYXRoKS4gIE1pc2MvbWFuZGVsIHdpbGwgbGlrZSB0aGlzLiA6KSAgVGhpcyBpc24ndAorc2FmZSBpbiBnZW5lcmFsLCBldmVuIG9uIGRhcndpbi4gIFNlZSB0aGUgbGlibSBpbXBsZW1lbnRhdGlvbiBvZiBoeXBvdCBmb3IKK2V4YW1wbGVzICh3aGljaCBzcGVjaWFsIGNhc2Ugd2hlbiB4L3kgYXJlIGV4YWN0bHkgemVybyB0byBnZXQgc2lnbmVkIHplcm9zIGV0YworcmlnaHQpLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NvbHZlIHRoaXMgREFHIGlzZWwgZm9sZGluZyBkZWZpY2llbmN5OgorCitpbnQgWCwgWTsKKwordm9pZCBmbjEodm9pZCkKK3sKKyAgWCA9IFggfCAoWSA8PCAzKTsKK30KKworY29tcGlsZXMgdG8KKworZm4xOgorCW1vdmwgWSwgJWVheAorCXNobGwgJDMsICVlYXgKKwlvcmwgWCwgJWVheAorCW1vdmwgJWVheCwgWAorCXJldAorCitUaGUgcHJvYmxlbSBpcyB0aGUgc3RvcmUncyBjaGFpbiBvcGVyYW5kIGlzIG5vdCB0aGUgbG9hZCBYIGJ1dCByYXRoZXIKK2EgVG9rZW5GYWN0b3Igb2YgdGhlIGxvYWQgWCBhbmQgbG9hZCBZLCB3aGljaCBwcmV2ZW50cyB0aGUgZm9sZGluZy4KKworVGhlcmUgYXJlIHR3byB3YXlzIHRvIGZpeCB0aGlzOgorCisxLiBUaGUgZGFnIGNvbWJpbmVyIGNhbiBzdGFydCB1c2luZyBhbGlhcyBhbmFseXNpcyB0byByZWFsaXplIHRoYXQgeS94CisgICBkb24ndCBhbGlhcywgbWFraW5nIHRoZSBzdG9yZSB0byBYIG5vdCBkZXBlbmRlbnQgb24gdGhlIGxvYWQgZnJvbSBZLgorMi4gVGhlIGdlbmVyYXRlZCBpc2VsIGNvdWxkIGJlIG1hZGUgc21hcnRlciBpbiB0aGUgY2FzZSBpdCBjYW4ndAorICAgZGlzYW1iaWd1YXRlIHRoZSBwb2ludGVycy4KKworTnVtYmVyIDEgaXMgdGhlIHByZWZlcnJlZCBzb2x1dGlvbi4KKworVGhpcyBoYXMgYmVlbiAiZml4ZWQiIGJ5IGEgVGFibGVHZW4gaGFjay4gQnV0IHRoYXQgaXMgYSBzaG9ydCB0ZXJtIHdvcmthcm91bmQKK3doaWNoIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBwcm9wZXIgZml4IGlzIG1hZGUuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworT24gdGFyZ2V0cyB3aXRoIGV4cGVuc2l2ZSA2NC1iaXQgbXVsdGlwbHksIHdlIGNvdWxkIExTUiB0aGlzOgorCitmb3IgKGkgPSAuLi47ICsraSkgeworICAgeCA9IDFVTEwgPDwgaTsKKworaW50bzoKKyBsb25nIGxvbmcgdG1wID0gMTsKKyBmb3IgKGkgPSAuLi47ICsraSwgdG1wKz10bXApCisgICB4ID0gdG1wOworCitUaGlzIHdvdWxkIGJlIGEgd2luIG9uIHBwYzMyLCBidXQgbm90IHg4NiBvciBwcGM2NC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTaHJpbms6IChzZXRsdCAobG9hZGkzMiBQKSwgMCkgLT4gKHNldGx0IChsb2FkaTggUGhpKSwgMCkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitSZWFzc29jaWF0ZSBzaG91bGQgdHVybiB0aGluZ3MgbGlrZToKKworaW50IGZhY3RvcmlhbChpbnQgWCkgeworIHJldHVybiBYKlgqWCpYKlgqWCpYKlg7Cit9CisKK2ludG8gbGx2bS5wb3dpIGNhbGxzLCBhbGxvd2luZyB0aGUgY29kZSBnZW5lcmF0b3IgdG8gcHJvZHVjZSBiYWxhbmNlZAorbXVsdGlwbGljYXRpb24gdHJlZXMuCisKK0ZpcnN0LCB0aGUgaW50cmluc2ljIG5lZWRzIHRvIGJlIGV4dGVuZGVkIHRvIHN1cHBvcnQgaW50ZWdlcnMsIGFuZCBzZWNvbmQgdGhlCitjb2RlIGdlbmVyYXRvciBuZWVkcyB0byBiZSBlbmhhbmNlZCB0byBsb3dlciB0aGVzZSB0byBtdWx0aXBsaWNhdGlvbiB0cmVlcy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbnRlcmVzdGluZz8gdGVzdGNhc2UgZm9yIGFkZC9zaGlmdC9tdWwgcmVhc3NvYzoKKworaW50IGJhcihpbnQgeCwgaW50IHkpIHsKKyAgcmV0dXJuIHgqeCp4K3kreCp4KngqeCp4KnkqeSp5Knk7Cit9CitpbnQgZm9vKGludCB6LCBpbnQgbikgeworICByZXR1cm4gYmFyKHosIG4pICsgYmFyKDIqeiwgMipuKTsKK30KKworVGhpcyBpcyBibG9ja2VkIG9uIG5vdCBoYW5kbGluZyBYKlgqWCAtPiBwb3dpKFgsIDMpIChzZWUgbm90ZSBhYm92ZSkuICBUaGUgaXNzdWUKK2lzIHRoYXQgd2UgZW5kIHVwIGdldHRpbmcgdCA9IDIqWCAgcyA9IHQqdCAgIGFuZCBkb24ndCB0dXJuIHRoaXMgaW50byA0KlgqWCwKK3doaWNoIGlzIHRoZSBzYW1lIG51bWJlciBvZiBtdWx0aXBsaWVzIGFuZCBpcyBjYW5vbmljYWwsIGJlY2F1c2UgdGhlIDIqWCBoYXMKK211bHRpcGxlIHVzZXMuICBIZXJlJ3MgYSBzaW1wbGUgZXhhbXBsZToKKworZGVmaW5lIGkzMiBAdGVzdDE1KGkzMiAlWDEpIHsKKyAgJUIgPSBtdWwgaTMyICVYMSwgNDcgICA7IFgxKjQ3CisgICVDID0gbXVsIGkzMiAlQiwgJUIKKyAgcmV0IGkzMiAlQworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworUmVhc3NvY2lhdGUgc2hvdWxkIGhhbmRsZSB0aGUgZXhhbXBsZSBpbiBHQ0MgUFIxNjE1NzoKKworZXh0ZXJuIGludCBhMCwgYTEsIGEyLCBhMywgYTQ7IGV4dGVybiBpbnQgYjAsIGIxLCBiMiwgYjMsIGI0OyAKK3ZvaWQgZiAoKSB7ICAvKiB0aGlzIGNhbiBiZSBvcHRpbWl6ZWQgdG8gZm91ciBhZGRpdGlvbnMuLi4gKi8gCisgICAgICAgIGI0ID0gYTQgKyBhMyArIGEyICsgYTEgKyBhMDsgCisgICAgICAgIGIzID0gYTMgKyBhMiArIGExICsgYTA7IAorICAgICAgICBiMiA9IGEyICsgYTEgKyBhMDsgCisgICAgICAgIGIxID0gYTEgKyBhMDsgCit9IAorCitUaGlzIHJlcXVpcmVzIHJlYXNzb2NpYXRpbmcgdG8gZm9ybXMgb2YgZXhwcmVzc2lvbnMgdGhhdCBhcmUgYWxyZWFkeSBhdmFpbGFibGUsCitzb21ldGhpbmcgdGhhdCByZWFzc29jIGRvZXNuJ3QgdGhpbmsgYWJvdXQgeWV0LgorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpcyBmdW5jdGlvbjogKGRlcml2ZWQgZnJvbSBHQ0MgUFIxOTk4OCkKK2RvdWJsZSBmb28oZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiAoKHggKyAwLjEyMzQgKiB5KSAqICh4ICsgLTAuMTIzNCAqIHkpKTsKK30KKworY29tcGlsZXMgdG86CitfZm9vOgorCW1vdmFwZAkleG1tMSwgJXhtbTIKKwltdWxzZAlMQ1BJMV8xKCVyaXApLCAleG1tMQorCW11bHNkCUxDUEkxXzAoJXJpcCksICV4bW0yCisJYWRkc2QJJXhtbTAsICV4bW0xCisJYWRkc2QJJXhtbTAsICV4bW0yCisJbW92YXBkCSV4bW0xLCAleG1tMAorCW11bHNkCSV4bW0yLCAleG1tMAorCXJldAorCitSZWFzc29jaWF0ZSBzaG91bGQgYmUgYWJsZSB0byB0dXJuIGl0IGludG86CisKK2RvdWJsZSBmb28oZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiAoKHggKyAwLjEyMzQgKiB5KSAqICh4IC0gMC4xMjM0ICogeSkpOworfQorCitXaGljaCBhbGxvd3MgdGhlIG11bHRpcGx5IGJ5IGNvbnN0YW50IHRvIGJlIENTRSdkLCBwcm9kdWNpbmc6CisKK19mb286CisJbXVsc2QJTENQSTFfMCglcmlwKSwgJXhtbTEKKwltb3ZhcGQJJXhtbTEsICV4bW0yCisJYWRkc2QJJXhtbTAsICV4bW0yCisJc3Vic2QJJXhtbTEsICV4bW0wCisJbXVsc2QJJXhtbTIsICV4bW0wCisJcmV0CisKK1RoaXMgZG9lc24ndCBuZWVkIC1mZmFzdC1tYXRoIHN1cHBvcnQgYXQgYWxsLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgYmFkIGJlY2F1c2UKK3RoZSBsbHZtLWdjYyBmcm9udGVuZCBpcyBjYW5vbmljYWxpemluZyB0aGUgbGF0ZXIgaW50byB0aGUgZm9ybWVyLCBidXQgY2xhbmcKK2RvZXNuJ3QgaGF2ZSB0aGlzIHByb2JsZW0uCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlc2UgdHdvIGZ1bmN0aW9ucyBzaG91bGQgZ2VuZXJhdGUgdGhlIHNhbWUgY29kZSBvbiBiaWctZW5kaWFuIHN5c3RlbXM6CisKK2ludCBnKGludCAqaixpbnQgKmwpICB7ICByZXR1cm4gbWVtY21wKGosbCw0KTsgIH0KK2ludCBoKGludCAqaiwgaW50ICpsKSB7ICByZXR1cm4gKmogLSAqbDsgfQorCit0aGlzIGNvdWxkIGJlIGRvbmUgaW4gU2VsZWN0aW9uREFHSVNlbC5jcHAsIGFsb25nIHdpdGggb3RoZXIgc3BlY2lhbCBjYXNlcywKK2ZvciAxLDIsNCw4IGJ5dGVzLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0l0IHdvdWxkIGJlIG5pY2UgdG8gcmV2ZXJ0IHRoaXMgcGF0Y2g6CitodHRwOi8vbGlzdHMuY3MudWl1Yy5lZHUvcGlwZXJtYWlsL2xsdm0tY29tbWl0cy9XZWVrLW9mLU1vbi0yMDA2MDIxMy8wMzE5ODYuaHRtbAorCitBbmQgdGVhY2ggdGhlIGRhZyBjb21iaW5lciBlbm91Z2ggdG8gc2ltcGxpZnkgdGhlIGNvZGUgZXhwYW5kZWQgYmVmb3JlIAorbGVnYWxpemUuICBJdCBzZWVtcyBwbGF1c2libGUgdGhhdCB0aGlzIGtub3dsZWRnZSB3b3VsZCBsZXQgaXQgc2ltcGxpZnkgb3RoZXIKK3N0dWZmIHRvby4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitGb3IgdmVjdG9yIHR5cGVzLCBUYXJnZXREYXRhLmNwcDo6Z2V0VHlwZUluZm8oKSByZXR1cm5zIGFsaWdubWVudCB0aGF0IGlzIGVxdWFsCit0byB0aGUgdHlwZSBzaXplLiBJdCB3b3JrcyBidXQgY2FuIGJlIG92ZXJseSBjb25zZXJ2YXRpdmUgYXMgdGhlIGFsaWdubWVudCBvZgorc3BlY2lmaWMgdmVjdG9yIHR5cGVzIGFyZSB0YXJnZXQgZGVwZW5kZW50LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIHNob3VsZCBwcm9kdWNlIGFuIHVuYWxpZ25lZCBsb2FkIGZyb20gY29kZSBsaWtlIHRoaXM6CisKK3Y0c2YgZXhhbXBsZShmbG9hdCAqUCkgeworICByZXR1cm4gKHY0c2Ype1BbMF0sIFBbMV0sIFBbMl0sIFBbM10gfTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitBZGQgc3VwcG9ydCBmb3IgY29uZGl0aW9uYWwgaW5jcmVtZW50cywgYW5kIG90aGVyIHJlbGF0ZWQgcGF0dGVybnMuICBJbnN0ZWFkCitvZjoKKworCW1vdmwgMTM2KCVlc3ApLCAlZWF4CisJY21wbCAkMCwgJWVheAorCWplIExCQjE2XzIJI2NvbmRfbmV4dAorTEJCMTZfMToJI2NvbmRfdHJ1ZQorCWluY2wgX2ZvbworTEJCMTZfMjoJI2NvbmRfbmV4dAorCitlbWl0OgorCW1vdmwJX2ZvbywgJWVheAorCWNtcGwJJDEsICVlZGkKKwlzYmJsCSQtMSwgJWVheAorCW1vdmwJJWVheCwgX2ZvbworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0NvbWJpbmU6IGEgPSBzaW4oeCksIGIgPSBjb3MoeCkgaW50byBhLGIgPSBzaW5jb3MoeCkuCisKK0V4cGFuZCB0aGVzZSB0byBjYWxscyBvZiBzaW4vY29zIGFuZCBzdG9yZXM6CisgICAgICBkb3VibGUgc2luY29zKGRvdWJsZSB4LCBkb3VibGUgKnNpbiwgZG91YmxlICpjb3MpOworICAgICAgZmxvYXQgc2luY29zZihmbG9hdCB4LCBmbG9hdCAqc2luLCBmbG9hdCAqY29zKTsKKyAgICAgIGxvbmcgZG91YmxlIHNpbmNvc2wobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgKnNpbiwgbG9uZyBkb3VibGUgKmNvcyk7CisKK0RvaW5nIHNvIGNvdWxkIGFsbG93IFNST0Egb2YgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXJzLiAgU2VlIGFsc286CitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3Njg3CisKK1RoaXMgaXMgbm93IGVhc2lseSBkb2FibGUgd2l0aCBNUlZzLiAgV2UgY291bGQgZXZlbiBtYWtlIGFuIGludHJpbnNpYyBmb3IgdGhpcworaWYgYW55b25lIGNhcmVkIGVub3VnaCBhYm91dCBzaW5jb3MuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcXVhbnR1bV9zaWdtYV94IGluIDQ2Mi5saWJxdWFudHVtIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbG9vcDoKKworICAgICAgZm9yKGk9MDsgaTxyZWctPnNpemU7IGkrKykKKwl7CisJICAvKiBGbGlwIHRoZSB0YXJnZXQgYml0IG9mIGVhY2ggYmFzaXMgc3RhdGUgKi8KKwkgIHJlZy0+bm9kZVtpXS5zdGF0ZSBePSAoKE1BWF9VTlNJR05FRCkgMSA8PCB0YXJnZXQpOworCX0gCisKK1doZXJlIE1BWF9VTlNJR05FRC9zdGF0ZSBpcyBhIDY0LWJpdCBpbnQuICBPbiBhIDMyLWJpdCBwbGF0Zm9ybSBpdCB3b3VsZCBiZSBqdXN0CitzbyBjb29sIHRvIHR1cm4gaXQgaW50byBzb21ldGhpbmcgbGlrZToKKworICAgbG9uZyBsb25nIFJlcyA9ICgoTUFYX1VOU0lHTkVEKSAxIDw8IHRhcmdldCk7CisgICBpZiAodGFyZ2V0IDwgMzIpIHsKKyAgICAgZm9yKGk9MDsgaTxyZWctPnNpemU7IGkrKykKKyAgICAgICByZWctPm5vZGVbaV0uc3RhdGUgXj0gUmVzICYgMHhGRkZGRkZGRlVMTDsKKyAgIH0gZWxzZSB7CisgICAgIGZvcihpPTA7IGk8cmVnLT5zaXplOyBpKyspCisgICAgICAgcmVnLT5ub2RlW2ldLnN0YXRlIF49IFJlcyAmIDB4RkZGRkZGRkYwMDAwMDAwMFVMTAorICAgfQorICAgCisuLi4gd2hpY2ggd291bGQgb25seSBkbyBvbmUgMzItYml0IFhPUiBwZXIgbG9vcCBpdGVyYXRpb24gaW5zdGVhZCBvZiB0d28uCisKK0l0IHdvdWxkIGFsc28gYmUgbmljZSB0byByZWNvZ25pemUgdGhlIHJlZy0+c2l6ZSBkb2Vzbid0IGFsaWFzIHJlZy0+bm9kZVtpXSwgYnV0Cit0aGlzIHJlcXVpcmVzIFRCQUEuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpcyBpc24ndCByZWNvZ25pemVkIGFzIGJzd2FwIGJ5IGluc3Rjb21iaW5lICh5ZXMsIGl0IHJlYWxseSBpcyBic3dhcCk6CisKK3Vuc2lnbmVkIGxvbmcgcmV2ZXJzZSh1bnNpZ25lZCB2KSB7CisgICAgdW5zaWduZWQgdDsKKyAgICB0ID0gdiBeICgodiA8PCAxNikgfCAodiA+PiAxNikpOworICAgIHQgJj0gfjB4ZmYwMDAwOworICAgIHYgPSAodiA8PCAyNCkgfCAodiA+PiA4KTsKKyAgICByZXR1cm4gdiBeICh0ID4+IDgpOworfQorCitOZWl0aGVyIGlzIHRoaXMgKHZlcnkgc3RhbmRhcmQgaWRpb20pOgorCitpbnQgZihpbnQgbikKK3sKKyAgcmV0dXJuICgoKG4pIDw8IDI0KSB8ICgoKG4pICYgMHhmZjAwKSA8PCA4KSAKKyAgICAgICB8ICgoKG4pID4+IDgpICYgMHhmZjAwKSB8ICgobikgPj4gMjQpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitbTE9PUCBSRUNPR05JVElPTl0KKworVGhlc2UgaWRpb21zIHNob3VsZCBiZSByZWNvZ25pemVkIGFzIHBvcGNvdW50IChzZWUgUFIxNDg4KToKKwordW5zaWduZWQgY291bnRiaXRzX3Nsb3codW5zaWduZWQgdikgeworICB1bnNpZ25lZCBjOworICBmb3IgKGMgPSAwOyB2OyB2ID4+PSAxKQorICAgIGMgKz0gdiAmIDE7CisgIHJldHVybiBjOworfQordW5zaWduZWQgY291bnRiaXRzX2Zhc3QodW5zaWduZWQgdil7CisgIHVuc2lnbmVkIGM7CisgIGZvciAoYyA9IDA7IHY7IGMrKykKKyAgICB2ICY9IHYgLSAxOyAvLyBjbGVhciB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHNldAorICByZXR1cm4gYzsKK30KKworQklUQk9BUkQgPSB1bnNpZ25lZCBsb25nIGxvbmcKK2ludCBQb3BDbnQocmVnaXN0ZXIgQklUQk9BUkQgYSkgeworICByZWdpc3RlciBpbnQgYz0wOworICB3aGlsZShhKSB7CisgICAgYysrOworICAgIGEgJj0gYSAtIDE7CisgIH0KKyAgcmV0dXJuIGM7Cit9Cit1bnNpZ25lZCBpbnQgcG9wY291bnQodW5zaWduZWQgaW50IGlucHV0KSB7CisgIHVuc2lnbmVkIGludCBjb3VudCA9IDA7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAgMDsgaSA8IDQgKiA4OyBpKyspCisgICAgY291bnQgKz0gKGlucHV0ID4+IGkpICYgaTsKKyAgcmV0dXJuIGNvdW50OworfQorCitUaGlzIGlzIGEgZm9ybSBvZiBpZGlvbSByZWNvZ25pdGlvbiBmb3IgbG9vcHMsIHRoZSBzYW1lIHRoaW5nIHRoYXQgY291bGQgYmUKK3VzZWZ1bCBmb3IgcmVjb2duaXppbmcgbWVtc2V0L21lbWNweS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGVzZSBzaG91bGQgdHVybiBpbnRvIHNpbmdsZSAxNi1iaXQgKHVuYWxpZ25lZD8pIGxvYWRzIG9uIGxpdHRsZS9iaWcgZW5kaWFuCitwcm9jZXNzb3JzLgorCit1bnNpZ25lZCBzaG9ydCByZWFkXzE2X2xlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkcikgeworICByZXR1cm4gYWRyWzBdIHwgKGFkclsxXSA8PCA4KTsKK30KK3Vuc2lnbmVkIHNob3J0IHJlYWRfMTZfYmUoY29uc3QgdW5zaWduZWQgY2hhciAqYWRyKSB7CisgIHJldHVybiAoYWRyWzBdIDw8IDgpIHwgYWRyWzFdOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy1pbnN0Y29tYmluZSBzaG91bGQgaGFuZGxlIHRoaXMgdHJhbnNmb3JtOgorICAgaWNtcCBwcmVkIChzZGl2IFggLyBDMSApLCBDMgord2hlbiBYLCBDMSwgYW5kIEMyIGFyZSB1bnNpZ25lZC4gIFNpbWlsYXJseSBmb3IgdWRpdiBhbmQgc2lnbmVkIG9wZXJhbmRzLiAKKworQ3VycmVudGx5IEluc3RDb21iaW5lIGF2b2lkcyB0aGlzIHRyYW5zZm9ybSBidXQgd2lsbCBkbyBpdCB3aGVuIHRoZSBzaWducyBvZgordGhlIG9wZXJhbmRzIGFuZCB0aGUgc2lnbiBvZiB0aGUgZGl2aWRlIG1hdGNoLiBTZWUgdGhlIEZJWE1FIGluIAorSW5zdHJ1Y3Rpb25Db21iaW5pbmcuY3BwIGluIHRoZSB2aXNpdFNldENvbmRJbnN0IG1ldGhvZCBhZnRlciB0aGUgc3dpdGNoIGNhc2UgCitmb3IgSW5zdHJ1Y3Rpb246OlVEaXYgKGFyb3VuZCBsaW5lIDQ0NDcpIGZvciBtb3JlIGRldGFpbHMuCisKK1RoZSBTaW5nbGVTb3VyY2UvQmVuY2htYXJrcy9TaG9vdG91dC1DKysvaGFzaCBhbmQgaGFzaDIgdGVzdHMgaGF2ZSBleGFtcGxlcyBvZgordGhpcyBjb25zdHJ1Y3QuIAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1tMT09QIFJFQ09HTklUSU9OXQorCit2aXRlcmJpIHNwZWVkcyB1cCAqc2lnbmlmaWNhbnRseSogaWYgdGhlIHZhcmlvdXMgImhpc3RvcnkiIHJlbGF0ZWQgY29weSBsb29wcworYXJlIHR1cm5lZCBpbnRvIG1lbWNweSBjYWxscyBhdCB0aGUgc291cmNlIGxldmVsLiAgV2UgbmVlZCBhICJsb29wcyB0byBtZW1jcHkiCitwYXNzLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1tMT09QIE9QVElNSVpBVElPTl0KKworU2luZ2xlU291cmNlL0JlbmNobWFya3MvTWlzYy9kdC5jIHNob3dzIHNldmVyYWwgaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9uCitvcHBvcnR1bml0aWVzIGluIGl0cyBkb3VibGVfYXJyYXlfZGl2c192YXJpYWJsZSBmdW5jdGlvbjogaXQgbmVlZHMgbG9vcAoraW50ZXJjaGFuZ2UsIG1lbW9yeSBwcm9tb3Rpb24gKHdoaWNoIExJQ00gYWxyZWFkeSBkb2VzKSwgdmVjdG9yaXphdGlvbiBhbmQKK3ZhcmlhYmxlIHRyaXAgY291bnQgbG9vcCB1bnJvbGxpbmcgKHNpbmNlIGl0IGhhcyBhIGNvbnN0YW50IHRyaXAgY291bnQpLiBJQ0MKK2FwcGFyZW50bHkgcHJvZHVjZXMgdGhpcyB2ZXJ5IG5pY2UgY29kZSB3aXRoIC1mZmFzdC1tYXRoOgorCisuLkIxLjcwOiAgICAgICAgICAgICAgICAgICAgICAgICMgUHJlZHMgLi5CMS43MCAuLkIxLjY5CisgICAgICAgbXVscGQgICAgICV4bW0wLCAleG1tMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjMTA4LjIKKyAgICAgICBtdWxwZCAgICAgJXhtbTAsICV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMxMDguMgorICAgICAgIG11bHBkICAgICAleG1tMCwgJXhtbTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzEwOC4yCisgICAgICAgbXVscGQgICAgICV4bW0wLCAleG1tMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjMTA4LjIKKyAgICAgICBhZGRsICAgICAgJDgsICVlZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyAgICAgICBjbXBsICAgICAgJDEzMTA3MiwgJWVkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMxMDguMgorICAgICAgIGpiICAgICAgICAuLkIxLjcwICAgICAgICMgUHJvYiA5OSUgICAgICAgICAgICAgICAgICAgICAgIzEwOC4yCisKK0l0IHdvdWxkIGJlIGJldHRlciB0byBjb3VudCBkb3duIHRvIHplcm8sIGJ1dCB0aGlzIGlzIGEgbG90IGJldHRlciB0aGFuIHdoYXQgd2UKK2RvLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0NvbnNpZGVyOgorCit0eXBlZGVmIHVuc2lnbmVkIFUzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFU2NDsKK2ludCB0ZXN0IChVMzIgKmluc3QsIFU2NCAqcmVncykgeworICAgIFU2NCBlZmZlY3RpdmVfYWRkcjI7CisgICAgVTMyIHRlbXAgPSAqaW5zdDsKKyAgICBpbnQgcjEgPSAodGVtcCA+PiAyMCkgJiAweGY7CisgICAgaW50IGIyID0gKHRlbXAgPj4gMTYpICYgMHhmOworICAgIGVmZmVjdGl2ZV9hZGRyMiA9IHRlbXAgJiAweGZmZjsKKyAgICBpZiAoYjIpIGVmZmVjdGl2ZV9hZGRyMiArPSByZWdzW2IyXTsKKyAgICBiMiA9ICh0ZW1wID4+IDEyKSAmIDB4ZjsKKyAgICBpZiAoYjIpIGVmZmVjdGl2ZV9hZGRyMiArPSByZWdzW2IyXTsKKyAgICBlZmZlY3RpdmVfYWRkcjIgJj0gcmVnc1s0XTsKKyAgICAgaWYgKChlZmZlY3RpdmVfYWRkcjIgJiAzKSA9PSAwKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworTm90ZSB0aGF0IG9ubHkgdGhlIGxvdyAyIGJpdHMgb2YgZWZmZWN0aXZlX2FkZHIyIGFyZSB1c2VkLiAgT24gMzItYml0IHN5c3RlbXMsCit3ZSBkb24ndCBlbGltaW5hdGUgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSB0b3AgaGFsZiBvZiBlZmZlY3RpdmVfYWRkcjIgYmVjYXVzZQord2UgZG9uJ3QgaGF2ZSB3aG9sZS1mdW5jdGlvbiBzZWxlY3Rpb24gZGFncy4gIE9uIHg4NiwgdGhpcyBtZWFucyB3ZSB1c2Ugb25lCitleHRyYSByZWdpc3RlciBmb3IgdGhlIGZ1bmN0aW9uIHdoZW4gZWZmZWN0aXZlX2FkZHIyIGlzIGRlY2xhcmVkIGFzIFU2NCB0aGFuCit3aGVuIGl0IGlzIGRlY2xhcmVkIFUzMi4KKworUEhJIFNsaWNpbmcgY291bGQgYmUgZXh0ZW5kZWQgdG8gZG8gdGhpcy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitMU1Igc2hvdWxkIGtub3cgd2hhdCBHUFIgdHlwZXMgYSB0YXJnZXQgaGFzIGZyb20gVGFyZ2V0RGF0YS4gIFRoaXMgY29kZToKKwordm9sYXRpbGUgc2hvcnQgWCwgWTsgLy8gZ2xvYmFscworCit2b2lkIGZvbyhpbnQgTikgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgeyBYID0gaTsgWSA9IGkqNDsgfQorfQorCitwcm9kdWNlcyB0d28gbmVhciBpZGVudGljYWwgSVYncyAoYWZ0ZXIgcHJvbW90aW9uKSBvbiBQUEMvQVJNOgorCitMQkIxXzI6CisJbGRyIHIzLCBMQ1BJMV8wCisJbGRyIHIzLCBbcjNdCisJc3RyaCByMiwgW3IzXQorCWxkciByMywgTENQSTFfMQorCWxkciByMywgW3IzXQorCXN0cmggcjEsIFtyM10KKwlhZGQgcjEsIHIxLCAjNAorCWFkZCByMiwgcjIsICMxICAgPC0gWzAsKywxXQorCXN1YiByMCwgcjAsICMxICAgPC0gWzAsLSwxXQorCWNtcCByMCwgIzAKKwlibmUgTEJCMV8yCisKK0xTUiBzaG91bGQgcmV1c2UgdGhlICIrIiBJViBmb3IgdGhlIGV4aXQgdGVzdC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUYWlsIGNhbGwgZWxpbSBzaG91bGQgYmUgbW9yZSBhZ2dyZXNzaXZlLCBjaGVja2luZyB0byBzZWUgaWYgdGhlIGNhbGwgaXMKK2ZvbGxvd2VkIGJ5IGFuIHVuY29uZCBicmFuY2ggdG8gYW4gZXhpdCBibG9jay4KKworOyBUaGlzIHRlc3RjYXNlIGlzIGR1ZSB0byB0YWlsLWR1cGxpY2F0aW9uIG5vdCB3YW50aW5nIHRvIGNvcHkgdGhlIHJldHVybgorOyBpbnN0cnVjdGlvbiBpbnRvIHRoZSB0ZXJtaW5hdGluZyBibG9ja3MgYmVjYXVzZSB0aGVyZSB3YXMgb3RoZXIgY29kZQorOyBvcHRpbWl6ZWQgb3V0IG9mIHRoZSBmdW5jdGlvbiBhZnRlciB0aGUgdGFpbGR1cCBoYXBwZW5lZC4KKzsgUlVOOiBsbHZtLWFzIDwgJXMgfCBvcHQgLXRhaWxjYWxsZWxpbSB8IGxsdm0tZGlzIHwgbm90IGdyZXAgY2FsbAorCitkZWZpbmUgaTMyIEB0NChpMzIgJWEpIHsKK2VudHJ5OgorCSV0bXAuMSA9IGFuZCBpMzIgJWEsIDEJCTsgPGkzMj4gWyN1c2VzPTFdCisJJXRtcC4yID0gaWNtcCBuZSBpMzIgJXRtcC4xLCAwCQk7IDxpMT4gWyN1c2VzPTFdCisJYnIgaTEgJXRtcC4yLCBsYWJlbCAldGhlbi4wLCBsYWJlbCAlZWxzZS4wCisKK3RoZW4uMDoJCTsgcHJlZHMgPSAlZW50cnkKKwkldG1wLjUgPSBhZGQgaTMyICVhLCAtMQkJOyA8aTMyPiBbI3VzZXM9MV0KKwkldG1wLjMgPSBjYWxsIGkzMiBAdDQoIGkzMiAldG1wLjUgKQkJOyA8aTMyPiBbI3VzZXM9MV0KKwliciBsYWJlbCAlcmV0dXJuCisKK2Vsc2UuMDoJCTsgcHJlZHMgPSAlZW50cnkKKwkldG1wLjcgPSBpY21wIG5lIGkzMiAlYSwgMAkJOyA8aTE+IFsjdXNlcz0xXQorCWJyIGkxICV0bXAuNywgbGFiZWwgJXRoZW4uMSwgbGFiZWwgJXJldHVybgorCit0aGVuLjE6CQk7IHByZWRzID0gJWVsc2UuMAorCSV0bXAuMTEgPSBhZGQgaTMyICVhLCAtMgkJOyA8aTMyPiBbI3VzZXM9MV0KKwkldG1wLjkgPSBjYWxsIGkzMiBAdDQoIGkzMiAldG1wLjExICkJCTsgPGkzMj4gWyN1c2VzPTFdCisJYnIgbGFiZWwgJXJldHVybgorCityZXR1cm46CQk7IHByZWRzID0gJXRoZW4uMSwgJWVsc2UuMCwgJXRoZW4uMAorCSVyZXN1bHQuMCA9IHBoaSBpMzIgWyAwLCAlZWxzZS4wIF0sIFsgJXRtcC4zLCAldGhlbi4wIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAldG1wLjksICV0aGVuLjEgXQorCXJldCBpMzIgJXJlc3VsdC4wCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGFpbCByZWN1cnNpb24gZWxpbWluYXRpb24gc2hvdWxkIGhhbmRsZToKKworaW50IHBvdzJtMShpbnQgbikgeworIGlmIChuID09IDApCisgICByZXR1cm4gMDsKKyByZXR1cm4gMiAqIHBvdzJtMSAobiAtIDEpICsgMTsKK30KKworQWxzbywgbXVsdGlwbGllcyBjYW4gYmUgdHVybmVkIGludG8gU0hMJ3MsIHNvIHRoZXkgc2hvdWxkIGJlIGhhbmRsZWQgYXMgaWYKK3RoZXkgd2VyZSBhc3NvY2lhdGl2ZS4gICJyZXR1cm4gZm9vKCkgPDwgMSIgY2FuIGJlIHRhaWwgcmVjdXJzaW9uIGVsaW1pbmF0ZWQuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQXJndW1lbnQgcHJvbW90aW9uIHNob3VsZCBwcm9tb3RlIGFyZ3VtZW50cyBmb3IgcmVjdXJzaXZlIGZ1bmN0aW9ucywgbGlrZSAKK3RoaXM6CisKKzsgUlVOOiBsbHZtLWFzIDwgJXMgfCBvcHQgLWFyZ3Byb21vdGlvbiB8IGxsdm0tZGlzIHwgZ3JlcCB4LnZhbAorCitkZWZpbmUgaW50ZXJuYWwgaTMyIEBmb28oaTMyKiAleCkgeworZW50cnk6CisJJXRtcCA9IGxvYWQgaTMyKiAleAkJOyA8aTMyPiBbI3VzZXM9MF0KKwkldG1wLmZvbyA9IGNhbGwgaTMyIEBmb28oIGkzMiogJXggKQkJOyA8aTMyPiBbI3VzZXM9MV0KKwlyZXQgaTMyICV0bXAuZm9vCit9CisKK2RlZmluZSBpMzIgQGJhcihpMzIqICV4KSB7CitlbnRyeToKKwkldG1wMyA9IGNhbGwgaTMyIEBmb28oIGkzMiogJXggKQkJOyA8aTMyPiBbI3VzZXM9MV0KKwlyZXQgaTMyICV0bXAzCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2Ugc2hvdWxkIGludmVzdGlnYXRlIGFuIGluc3RydWN0aW9uIHNpbmtpbmcgcGFzcy4gIENvbnNpZGVyIHRoaXMgc2lsbHkKK2V4YW1wbGUgaW4gcGljIG1vZGU6CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK3ZvaWQgZm9vKGludCB4KSB7CisgIGFzc2VydCh4KTsKKyAgLy8uLi4KK30KKword2UgY29tcGlsZSB0aGlzIHRvOgorX2ZvbzoKKwlzdWJsCSQyOCwgJWVzcAorCWNhbGwJIkwxJHBiIgorIkwxJHBiIjoKKwlwb3BsCSVlYXgKKwljbXBsCSQwLCAzMiglZXNwKQorCWplCUxCQjFfMgkjIGNvbmRfdHJ1ZQorTEJCMV8xOgkjIHJldHVybgorCSMgLi4uCisJYWRkbAkkMjgsICVlc3AKKwlyZXQKK0xCQjFfMjoJIyBjb25kX3RydWUKKy4uLgorCitUaGUgUElDIGJhc2UgY29tcHV0YXRpb24gKGNhbGwrcG9wbCkgaXMgb25seSB1c2VkIG9uIG9uZSBwYXRoIHRocm91Z2ggdGhlIAorY29kZSwgYnV0IGlzIGN1cnJlbnRseSBhbHdheXMgY29tcHV0ZWQgaW4gdGhlIGVudHJ5IGJsb2NrLiAgSXQgd291bGQgYmUgCitiZXR0ZXIgdG8gc2luayB0aGUgcGljYmFzZSBjb21wdXRhdGlvbiBkb3duIGludG8gdGhlIGJsb2NrIGZvciB0aGUgCithc3NlcnRpb24sIGFzIGl0IGlzIHRoZSBvbmx5IG9uZSB0aGF0IHVzZXMgaXQuICBUaGlzIGhhcHBlbnMgZm9yIGEgbG90IG9mIAorY29kZSB3aXRoIGVhcmx5IG91dHMuCisKK0Fub3RoZXIgZXhhbXBsZSBpcyBsb2FkcyBvZiBhcmd1bWVudHMsIHdoaWNoIGFyZSB1c3VhbGx5IGVtaXR0ZWQgaW50byB0aGUgCitlbnRyeSBibG9jayBvbiB0YXJnZXRzIGxpa2UgeDg2LiAgSWYgbm90IHVzZWQgaW4gYWxsIHBhdGhzIHRocm91Z2ggYSAKK2Z1bmN0aW9uLCB0aGV5IHNob3VsZCBiZSBzdW5rIGludG8gdGhlIG9uZXMgdGhhdCBkby4KKworSW4gdGhpcyBjYXNlLCB3aG9sZS1mdW5jdGlvbi1pc2VsIHdvdWxkIGFsc28gaGFuZGxlIHRoaXMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSW52ZXN0aWdhdGUgbG93ZXJpbmcgb2Ygc3BhcnNlIHN3aXRjaCBzdGF0ZW1lbnRzIGludG8gcGVyZmVjdCBoYXNoIHRhYmxlczoKK2h0dHA6Ly9idXJ0bGVidXJ0bGUubmV0L2JvYi9oYXNoL3BlcmZlY3QuaHRtbAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIHNob3VsZCB0dXJuIHRoaW5ncyBsaWtlICJsb2FkK2ZhYnMrc3RvcmUiIGFuZCAibG9hZCtmbmVnK3N0b3JlIiBpbnRvIHRoZQorY29ycmVzcG9uZGluZyBpbnRlZ2VyIG9wZXJhdGlvbnMuICBPbiBhIHlvbmFoLCB0aGlzIGxvb3A6CisKK2RvdWJsZSBhWzI1Nl07Cit2b2lkIGZvbygpIHsKKyAgaW50IGksIGI7CisgIGZvciAoYiA9IDA7IGIgPCAxMDAwMDAwMDsgYisrKQorICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgYVtpXSA9IC1hW2ldOworfQorCitpcyB0d2ljZSBhcyBzbG93IGFzIHRoaXMgbG9vcDoKKworbG9uZyBsb25nIGFbMjU2XTsKK3ZvaWQgZm9vKCkgeworICBpbnQgaSwgYjsKKyAgZm9yIChiID0gMDsgYiA8IDEwMDAwMDAwOyBiKyspCisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBhW2ldIF49ICgxVUxMIDw8IDYzKTsKK30KKworYW5kIEkgc3VzcGVjdCBvdGhlciBwcm9jZXNzb3JzIGFyZSBzaW1pbGFyLiAgT24gWDg2IGluIHBhcnRpY3VsYXIgdGhpcyBpcyBhCitiaWcgd2luIGJlY2F1c2UgZG9pbmcgdGhpcyB3aXRoIGludGVnZXJzIGFsbG93cyB0aGUgdXNlIG9mIHJlYWQvbW9kaWZ5L3dyaXRlCitpbnN0cnVjdGlvbnMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworREFHIENvbWJpbmVyIHNob3VsZCB0cnkgdG8gY29tYmluZSBzbWFsbCBsb2FkcyBpbnRvIGxhcmdlciBsb2FkcyB3aGVuIAorcHJvZml0YWJsZS4gIEZvciBleGFtcGxlLCB3ZSBjb21waWxlIHRoaXMgQysrIGV4YW1wbGU6CisKK3N0cnVjdCBUSG90S2V5IHsgc2hvcnQgS2V5OyBib29sIENvbnRyb2w7IGJvb2wgU2hpZnQ7IGJvb2wgQWx0OyB9OworZXh0ZXJuIFRIb3RLZXkgbV9Ib3RLZXk7CitUSG90S2V5IEdldEhvdEtleSAoKSB7IHJldHVybiBtX0hvdEtleTsgfQorCitpbnRvICgtTzMgLWZuby1leGNlcHRpb25zIC1zdGF0aWMgLWZvbWl0LWZyYW1lLXBvaW50ZXIpOgorCitfX1o5R2V0SG90S2V5djoKKwlwdXNobAklZXNpCisJbW92bAk4KCVlc3ApLCAlZWF4CisJbW92YglfbV9Ib3RLZXkrMywgJWNsCisJbW92YglfbV9Ib3RLZXkrNCwgJWRsCisJbW92YglfbV9Ib3RLZXkrMiwgJWNoCisJbW92dwlfbV9Ib3RLZXksICVzaQorCW1vdncJJXNpLCAoJWVheCkKKwltb3ZiCSVjaCwgMiglZWF4KQorCW1vdmIJJWNsLCAzKCVlYXgpCisJbW92YgklZGwsIDQoJWVheCkKKwlwb3BsCSVlc2kKKwlyZXQJJDQKKworR0NDIHByb2R1Y2VzOgorCitfX1o5R2V0SG90S2V5djoKKwltb3ZsCV9tX0hvdEtleSwgJWVkeAorCW1vdmwJNCglZXNwKSwgJWVheAorCW1vdmwJJWVkeCwgKCVlYXgpCisJbW92endsCV9tX0hvdEtleSs0LCAlZWR4CisJbW92dwklZHgsIDQoJWVheCkKKwlyZXQJJDQKKworVGhlIExMVk0gSVIgY29udGFpbnMgdGhlIG5lZWRlZCBhbGlnbm1lbnQgaW5mbywgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gCittZXJnZSB0aGUgbG9hZHMgYW5kIHN0b3JlcyBpbnRvIDQtYnl0ZSBsb2FkczoKKworCSVzdHJ1Y3QuVEhvdEtleSA9IHR5cGUgeyBpMTYsIGk4LCBpOCwgaTggfQorZGVmaW5lIHZvaWQgQF9aOUdldEhvdEtleXYoJXN0cnVjdC5USG90S2V5KiBzcmV0ICAlYWdnLnJlc3VsdCkgbm91bndpbmQgIHsKKy4uLgorCSV0bXAyID0gbG9hZCBpMTYqIGdldGVsZW1lbnRwdHIgKEBtX0hvdEtleSwgaTMyIDAsIGkzMiAwKSwgYWxpZ24gOAorCSV0bXA1ID0gbG9hZCBpOCogZ2V0ZWxlbWVudHB0ciAoQG1fSG90S2V5LCBpMzIgMCwgaTMyIDEpLCBhbGlnbiAyCisJJXRtcDggPSBsb2FkIGk4KiBnZXRlbGVtZW50cHRyIChAbV9Ib3RLZXksIGkzMiAwLCBpMzIgMiksIGFsaWduIDEKKwkldG1wMTEgPSBsb2FkIGk4KiBnZXRlbGVtZW50cHRyIChAbV9Ib3RLZXksIGkzMiAwLCBpMzIgMyksIGFsaWduIDIKKworQWx0ZXJuYXRpdmVseSwgd2Ugc2hvdWxkIHVzZSBhIHNtYWxsIGFtb3VudCBvZiBiYXNlLW9mZnNldCBhbGlhcyBhbmFseXNpcwordG8gbWFrZSBpdCBzbyB0aGUgc2NoZWR1bGVyIGRvZXNuJ3QgbmVlZCB0byBob2xkIGFsbCB0aGUgbG9hZHMgaW4gcmVncyBhdAorb25jZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBzaG91bGQgYWRkIGFuIEZSSU5UIG5vZGUgdG8gdGhlIERBRyB0byBtb2RlbCB0YXJnZXRzIHRoYXQgaGF2ZSBsZWdhbAoraW1wbGVtZW50YXRpb25zIG9mIGNlaWwvZmxvb3IvcmludC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitDb25zaWRlcjoKKworaW50IHRlc3QoKSB7CisgIGxvbmcgbG9uZyBpbnB1dFs4XSA9IHsxLDEsMSwxLDEsMSwxLDF9OworICBmb28oaW5wdXQpOworfQorCitXZSBjdXJyZW50bHkgY29tcGlsZSB0aGlzIGludG8gYSBtZW1jcHkgZnJvbSBhIGdsb2JhbCBhcnJheSBzaW5jZSB0aGUgCitpbml0aWFsaXplciBpcyBmYWlybHkgbGFyZ2UgYW5kIG5vdCBtZW1zZXQnYWJsZS4gIFRoaXMgaXMgZ29vZCwgYnV0IHRoZSBtZW1jcHkKK2dldHMgbG93ZXJlZCB0byBsb2FkL3N0b3JlcyBpbiB0aGUgY29kZSBnZW5lcmF0b3IuICBUaGlzIGlzIGFsc28gb2ssIGV4Y2VwdAordGhhdCB0aGUgY29kZWdlbiBsb3dlcmluZyBmb3IgbWVtY3B5IGRvZXNuJ3QgaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIHNvdXJjZQoraXMgYSBjb25zdGFudCBnbG9iYWwuICBUaGlzIGdpdmVzIHVzIGF0cm9jaW91cyBjb2RlIGxpa2UgdGhpczoKKworCWNhbGwJIkwxJHBiIgorIkwxJHBiIjoKKwlwb3BsCSVlYXgKKwltb3ZsCV9DLjAuMTQ0NC0iTDEkcGIiKzMyKCVlYXgpLCAlZWN4CisJbW92bAklZWN4LCA0MCglZXNwKQorCW1vdmwJX0MuMC4xNDQ0LSJMMSRwYiIrMjAoJWVheCksICVlY3gKKwltb3ZsCSVlY3gsIDI4KCVlc3ApCisJbW92bAlfQy4wLjE0NDQtIkwxJHBiIiszNiglZWF4KSwgJWVjeAorCW1vdmwJJWVjeCwgNDQoJWVzcCkKKwltb3ZsCV9DLjAuMTQ0NC0iTDEkcGIiKzQ0KCVlYXgpLCAlZWN4CisJbW92bAklZWN4LCA1MiglZXNwKQorCW1vdmwJX0MuMC4xNDQ0LSJMMSRwYiIrNDAoJWVheCksICVlY3gKKwltb3ZsCSVlY3gsIDQ4KCVlc3ApCisJbW92bAlfQy4wLjE0NDQtIkwxJHBiIisxMiglZWF4KSwgJWVjeAorCW1vdmwJJWVjeCwgMjAoJWVzcCkKKwltb3ZsCV9DLjAuMTQ0NC0iTDEkcGIiKzQoJWVheCksICVlY3gKKy4uLgorCitpbnN0ZWFkIG9mOgorCW1vdmwJJDEsIDE2KCVlc3ApCisJbW92bAkkMCwgMjAoJWVzcCkKKwltb3ZsCSQxLCAyNCglZXNwKQorCW1vdmwJJDAsIDI4KCVlc3ApCisJbW92bAkkMSwgMzIoJWVzcCkKKwltb3ZsCSQwLCAzNiglZXNwKQorCS4uLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2h0dHA6Ly9sbHZtLm9yZy9QUjcxNzoKKworVGhlIGZvbGxvd2luZyBjb2RlIHNob3VsZCBjb21waWxlIGludG8gInJldCBpbnQgdW5kZWYiLiBJbnN0ZWFkLCBMTFZNCitwcm9kdWNlcyAicmV0IGludCAwIjoKKworaW50IGYoKSB7CisgIGludCB4ID0gNDsKKyAgaW50IHk7CisgIGlmICh4ID09IDMpIHkgPSAwOworICByZXR1cm4geTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGUgbG9vcCB1bnJvbGxlciBzaG91bGQgcGFydGlhbGx5IHVucm9sbCBsb29wcyAoaW5zdGVhZCBvZiBwZWVsaW5nIHRoZW0pCit3aGVuIGNvZGUgZ3Jvd3RoIGlzbid0IHRvbyBiYWQgYW5kIHdoZW4gYW4gdW5yb2xsIGNvdW50IGFsbG93cyBzaW1wbGlmaWNhdGlvbgorb2Ygc29tZSBjb2RlIHdpdGhpbiB0aGUgbG9vcC4gIE9uZSB0cml2aWFsIGV4YW1wbGUgaXM6CisKKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4oKSB7CisgICAgaW50IG5SZXQgPSAxNzsKKyAgICBpbnQgbkxvb3A7CisgICAgZm9yICggbkxvb3AgPSAwOyBuTG9vcCA8IDEwMDA7IG5Mb29wKysgKSB7CisgICAgICAgIGlmICggbkxvb3AgJiAxICkKKyAgICAgICAgICAgIG5SZXQgKz0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgblJldCAtPSAxOworICAgIH0KKyAgICByZXR1cm4gblJldDsKK30KKworVW5yb2xsaW5nIGJ5IDIgd291bGQgZWxpbWluYXRlIHRoZSAnJjEnIGluIGJvdGggY29waWVzLCBsZWFkaW5nIHRvIGEgbmV0CityZWR1Y3Rpb24gaW4gY29kZSBzaXplLiAgVGhlIHJlc3VsdGFudCBjb2RlIHdvdWxkIHRoZW4gYWxzbyBiZSBzdWl0YWJsZSBmb3IKK2V4aXQgdmFsdWUgY29tcHV0YXRpb24uCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2UgbWlzcyBhIGJ1bmNoIG9mIHJvdGF0ZSBvcHBvcnR1bml0aWVzIG9uIHZhcmlvdXMgdGFyZ2V0cywgaW5jbHVkaW5nIHBwYywgeDg2LAorZXRjLiAgT24gWDg2LCB3ZSBtaXNzIGEgYnVuY2ggb2YgJ3JvdGF0ZSBieSB2YXJpYWJsZScgY2FzZXMgYmVjYXVzZSB0aGUgcm90YXRlCittYXRjaGluZyBjb2RlIGluIGRhZyBjb21iaW5lIGRvZXNuJ3QgbG9vayB0aHJvdWdoIHRydW5jYXRlcyBhZ2dyZXNzaXZlbHkgCitlbm91Z2guICBIZXJlIGFyZSBzb21lIHRlc3RjYXNlcyByZWR1Y2VzIGZyb20gR0NDIFBSMTc4ODY6CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBmKHVuc2lnbmVkIGxvbmcgbG9uZyB4LCBpbnQgeSkgeworICByZXR1cm4gKHggPDwgeSkgfCAoeCA+PiA2NC15KTsgCit9IAordW5zaWduZWQgZjIodW5zaWduZWQgeCwgaW50IHkpeworICByZXR1cm4gKHggPDwgeSkgfCAoeCA+PiAzMi15KTsgCit9IAordW5zaWduZWQgbG9uZyBsb25nIGYzKHVuc2lnbmVkIGxvbmcgbG9uZyB4KXsKKyAgaW50IHkgPSA5OworICByZXR1cm4gKHggPDwgeSkgfCAoeCA+PiA2NC15KTsgCit9IAordW5zaWduZWQgZjQodW5zaWduZWQgeCl7CisgIGludCB5ID0gMTA7CisgIHJldHVybiAoeCA8PCB5KSB8ICh4ID4+IDMyLXkpOyAKK30KK3Vuc2lnbmVkIGxvbmcgbG9uZyBmNSh1bnNpZ25lZCBsb25nIGxvbmcgeCwgdW5zaWduZWQgbG9uZyBsb25nIHkpIHsKKyAgcmV0dXJuICh4IDw8IDgpIHwgKCh5ID4+IDQ4KSAmIDB4ZmZ1bGwpOworfQordW5zaWduZWQgbG9uZyBsb25nIGY2KHVuc2lnbmVkIGxvbmcgbG9uZyB4LCB1bnNpZ25lZCBsb25nIGxvbmcgeSwgaW50IHopIHsKKyAgc3dpdGNoKHopIHsKKyAgY2FzZSAxOgorICAgIHJldHVybiAoeCA8PCA4KSB8ICgoeSA+PiA0OCkgJiAweGZmdWxsKTsKKyAgY2FzZSAyOgorICAgIHJldHVybiAoeCA8PCAxNikgfCAoKHkgPj4gNDApICYgMHhmZmZmdWxsKTsKKyAgY2FzZSAzOgorICAgIHJldHVybiAoeCA8PCAyNCkgfCAoKHkgPj4gMzIpICYgMHhmZmZmZmZ1bGwpOworICBjYXNlIDQ6CisgICAgcmV0dXJuICh4IDw8IDMyKSB8ICgoeSA+PiAyNCkgJiAweGZmZmZmZmZmdWxsKTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gKHggPDwgNDApIHwgKCh5ID4+IDE2KSAmIDB4ZmZmZmZmZmZmZnVsbCk7CisgIH0KK30KKworT24gWDg2LTY0LCB3ZSBvbmx5IGhhbmRsZSBmMi9mMy9mNCByaWdodC4gIE9uIHg4Ni0zMiwgYSBmZXcgb2YgdGhlc2UgCitnZW5lcmF0ZSB0cnVseSBob3JyaWJsZSBjb2RlLCBpbnN0ZWFkIG9mIHVzaW5nIHNobGQgYW5kIGZyaWVuZHMuICBPbgorQVJNLCB3ZSBlbmQgdXAgd2l0aCBjYWxscyB0byBMX19fbHNocmRpMy9MX19fYXNobGRpMyBpbiBmLCB3aGljaCBpcworYmFkbmVzcy4gIFBQQzY0IG1pc3NlcyBmLCBmNSBhbmQgZjYuICBDZWxsU1BVIGFib3J0cyBpbiBpc2VsLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIGRvIGEgbnVtYmVyIG9mIHNpbXBsaWZpY2F0aW9ucyBpbiBzaW1wbGlmeSBsaWJjYWxscyB0byBzdHJlbmd0aCByZWR1Y2UKK3N0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zLCBidXQgd2UgZG9uJ3QgY3VycmVudGx5IG1lcmdlIHRoZW0gdG9nZXRoZXIuICBGb3IKK2V4YW1wbGUsIGl0IGlzIHVzZWZ1bCB0byBtZXJnZSBtZW1jcHkoYSxiLHN0cmxlbihiKSkgLT4gc3RyY3B5LiAgVGhpcyBjYW4gb25seQorYmUgZG9uZSBzYWZlbHkgaWYgImIiIGlzbid0IG1vZGlmaWVkIGJldHdlZW4gdGhlIHN0cmxlbiBhbmQgbWVtY3B5IG9mIGNvdXJzZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBjb21waWxlIHRoaXMgcHJvZ3JhbTogKGZyb20gR0NDIFBSMTE2ODApCitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvYXR0YWNobWVudC5jZ2k/aWQ9NDQ4NworCitJbnRvIGNvZGUgdGhhdCBydW5zIHRoZSBzYW1lIHNwZWVkIGluIGZhc3Qvc2xvdyBtb2RlcywgYnV0IGJvdGggbW9kZXMgcnVuIDJ4CitzbG93ZXIgdGhhbiB3aGVuIGNvbXBpbGUgd2l0aCBHQ0MgKGVpdGhlciA0LjAgb3IgNC4yKToKKworJCBsbHZtLWcrKyBwZXJmLmNwcCAtTzMgLWZuby1leGNlcHRpb25zCiskIHRpbWUgLi9hLm91dCBmYXN0CisxLjgyMXUgMC4wMDNzIDA6MDEuODIgMTAwLjAlCTArMGsgMCswaW8gMHBmKzB3CisKKyQgZysrIHBlcmYuY3BwIC1PMyAtZm5vLWV4Y2VwdGlvbnMKKyQgdGltZSAuL2Eub3V0IGZhc3QKKzAuODIxdSAwLjAwMXMgMDowMC44MiAxMDAuMCUJMCswayAwKzBpbyAwcGYrMHcKKworSXQgbG9va3MgbGlrZSB3ZSBhcmUgbWFraW5nIHRoZSBzYW1lIGlubGluaW5nIGRlY2lzaW9ucywgc28gdGhpcyBtYXkgYmUgcmF3Citjb2RlZ2VuIGJhZG5lc3Mgb3Igc29tZXRoaW5nIGVsc2UgKGhhdmVuJ3QgaW52ZXN0aWdhdGVkKS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBtaXNzIHNvbWUgaW5zdGNvbWJpbmVzIGZvciBzdHVmZiBsaWtlIHRoaXM6Cit2b2lkIGJhciAodm9pZCk7Cit2b2lkIGZvbyAodW5zaWduZWQgaW50IGEpIHsKKyAgLyogVGhpcyBvbmUgaXMgZXF1aXZhbGVudCB0byBhID49ICgzIDw8IDIpLiAgKi8KKyAgaWYgKChhID4+IDIpID49IDMpCisgICAgYmFyICgpOworfQorCitBIGZldyBvdGhlciByZWxhdGVkIG9uZXMgYXJlIGluIEdDQyBQUjE0NzUzLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0RpdmlzaWJpbGl0eSBieSBjb25zdGFudCBjYW4gYmUgc2ltcGxpZmllZCAoYWNjb3JkaW5nIHRvIEdDQyBQUjEyODQ5KSBmcm9tCitiZWluZyBhIG11bGhpIHRvIGJlaW5nIGEgbXVsIGxvIChjaGVhcGVyKS4gIFRlc3RjYXNlOgorCit2b2lkIGJhcih1bnNpZ25lZCBuKSB7CisgIGlmIChuICUgMyA9PSAwKQorICAgIHRydWUoKTsKK30KKworVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcsIHdoZXJlIDI4NjMzMTE1MzEgaXMgdGhlIG11bHRpcGxpY2F0aXZlCitpbnZlcnNlIG9mIDMsIGFuZCAxNDMxNjU1NzY2IGlzICgoMl4zMiktMSkvMysxOgordm9pZCBiYXIodW5zaWduZWQgbikgeworICBpZiAobiAqIDI4NjMzMTE1MzFVIDwgMTQzMTY1NTc2NlUpCisgICAgdHJ1ZSgpOworfQorCitUaGUgc2FtZSB0cmFuc2Zvcm1hdGlvbiBjYW4gd29yayB3aXRoIGFuIGV2ZW4gbW9kdWxvIHdpdGggdGhlIGFkZGl0aW9uIG9mIGEKK3JvdGF0ZTogcm90YXRlIHRoZSByZXN1bHQgb2YgdGhlIG11bHRpcGx5IHRvIHRoZSByaWdodCBieSB0aGUgbnVtYmVyIG9mIGJpdHMKK3doaWNoIG5lZWQgdG8gYmUgemVybyBmb3IgdGhlIGNvbmRpdGlvbiB0byBiZSB0cnVlLCBhbmQgc2hyaW5rIHRoZSBjb21wYXJlIFJIUworYnkgdGhlIHNhbWUgYW1vdW50LiAgVW5sZXNzIHRoZSB0YXJnZXQgc3VwcG9ydHMgcm90YXRlcywgdGhvdWdoLCB0aGF0Cit0cmFuc2Zvcm1hdGlvbiBwcm9iYWJseSBpc24ndCB3b3J0aHdoaWxlLgorCitUaGUgdHJhbnNmb3JtYXRpb24gY2FuIGFsc28gZWFzaWx5IGJlIG1hZGUgdG8gd29yayB3aXRoIG5vbi16ZXJvIGVxdWFsaXR5Citjb21wYXJpc29uczoganVzdCB0cmFuc2Zvcm0sIGZvciBleGFtcGxlLCAibiAlIDMgPT0gMSIgdG8gIihuLTEpICUgMyA9PSAwIi4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitCZXR0ZXIgbW9kL3JlZiBhbmFseXNpcyBmb3Igc2NhbmYgd291bGQgYWxsb3cgdXMgdG8gZWxpbWluYXRlIHRoZSB2dGFibGUgYW5kIGEKK2J1bmNoIG9mIG90aGVyIHN0dWZmIGZyb20gdGhpcyBleGFtcGxlIChzZWUgUFIxNjA0KTogCisKKyNpbmNsdWRlIDxjc3RkaW8+CitzdHJ1Y3QgdGVzdCB7CisgICAgaW50IHZhbDsKKyAgICB2aXJ0dWFsIH50ZXN0KCkge30KK307CisKK2ludCBtYWluKCkgeworICAgIHRlc3QgdDsKKyAgICBzdGQ6OnNjYW5mKCIlZCIsICZ0LnZhbCk7CisgICAgc3RkOjpwcmludGYoIiVkXG4iLCB0LnZhbCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlc2UgZnVuY3Rpb25zIHBlcmZvcm0gdGhlIHNhbWUgY29tcHV0YXRpb24sIGJ1dCBwcm9kdWNlIGRpZmZlcmVudCBhc3NlbWJseS4KKworZGVmaW5lIGk4IEBzZWxlY3QoaTggJXgpIHJlYWRub25lIG5vdW53aW5kIHsKKyAgJUEgPSBpY21wIHVsdCBpOCAleCwgMjUwCisgICVCID0gc2VsZWN0IGkxICVBLCBpOCAwLCBpOCAxCisgIHJldCBpOCAlQiAKK30KKworZGVmaW5lIGk4IEBhZGRzaHIoaTggJXgpIHJlYWRub25lIG5vdW53aW5kIHsKKyAgJUEgPSB6ZXh0IGk4ICV4IHRvIGk5CisgICVCID0gYWRkIGk5ICVBLCA2ICAgICAgIDs7IDI1NiAtIDI1MCA9PSA2CisgICVDID0gbHNociBpOSAlQiwgOAorICAlRCA9IHRydW5jIGk5ICVDIHRvIGk4CisgIHJldCBpOCAlRAorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0Zyb20gZ2NjIGJ1ZyAyNDY5NjoKK2ludAorZiAodW5zaWduZWQgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGIsIHVuc2lnbmVkIGxvbmcgYykKK3sKKyAgcmV0dXJuICgoYSAmIChjIC0gMSkpICE9IDApIHx8ICgoYiAmIChjIC0gMSkpICE9IDApOworfQoraW50CitmICh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYiwgdW5zaWduZWQgbG9uZyBjKQoreworICByZXR1cm4gKChhICYgKGMgLSAxKSkgIT0gMCkgfCAoKGIgJiAoYyAtIDEpKSAhPSAwKTsKK30KK0JvdGggc2hvdWxkIGNvbWJpbmUgdG8gKChhfGIpICYgKGMtMSkpICE9IDAuICBDdXJyZW50bHkgbm90IG9wdGltaXplZCB3aXRoCisiY2xhbmcgLWVtaXQtbGx2bS1iYyB8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworRnJvbSBHQ0MgQnVnIDIwMTkyOgorI2RlZmluZSBQTURfTUFTSyAgICAofigoMVVMIDw8IDIzKSAtIDEpKQordm9pZCBjbGVhcl9wbWRfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisgICBpZiAoIShzdGFydCAmIH5QTURfTUFTSykgJiYgIShlbmQgJiB+UE1EX01BU0spKQorICAgICAgIGYoKTsKK30KK1RoZSBleHByZXNzaW9uIHNob3VsZCBvcHRpbWl6ZSB0byBzb21ldGhpbmcgbGlrZQorIiEoKHN0YXJ0fGVuZCkmflBNRF9NQVNLKS4gQ3VycmVudGx5IG5vdCBvcHRpbWl6ZWQgd2l0aCAiY2xhbmcKKy1lbWl0LWxsdm0tYmMgfCBvcHQgLXN0ZC1jb21waWxlLW9wdHMiLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgYShpbnQgdmFyaWFibGUpCit7CisgaWYgKHZhcmlhYmxlID09IDQgfHwgdmFyaWFibGUgPT0gNikKKyAgIGJhcigpOworfQorVGhpcyBzaG91bGQgb3B0aW1pemUgdG8gImlmICgodmFyaWFibGUgfCAyKSA9PSA2KSIuICBDdXJyZW50bHkgbm90CitvcHRpbWl6ZWQgd2l0aCAiY2xhbmcgLWVtaXQtbGx2bS1iYyB8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyB8IGxsYyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordW5zaWduZWQgaW50IGYodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBuKSB7KytpOyBpZiAoaSA9PSBuKSArK2k7IHJldHVybgoraTt9Cit1bnNpZ25lZCBpbnQgZjIodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBuKSB7KytpOyBpICs9IGkgPT0gbjsgcmV0dXJuIGk7fQorVGhlc2Ugc2hvdWxkIGNvbWJpbmUgdG8gdGhlIHNhbWUgdGhpbmcuICBDdXJyZW50bHksIHRoZSBmaXJzdCBmdW5jdGlvbgorcHJvZHVjZXMgYmV0dGVyIGNvZGUgb24gWDg2LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0Zyb20gR0NDIEJ1ZyAxNTc4NDoKKyNkZWZpbmUgYWJzKHgpIHg+MD94Oi14CitpbnQgZihpbnQgeCwgaW50IHkpCit7CisgcmV0dXJuIChhYnMoeCkpID49IDA7Cit9CitUaGlzIHNob3VsZCBvcHRpbWl6ZSB0byB4ID09IElOVF9NSU4uIChXaXRoIC1md3JhcHYuKSAgQ3VycmVudGx5IG5vdAorb3B0aW1pemVkIHdpdGggImNsYW5nIC1lbWl0LWxsdm0tYmMgfCBvcHQgLXN0ZC1jb21waWxlLW9wdHMiLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0Zyb20gR0NDIEJ1ZyAxNDc1MzoKK3ZvaWQKK3JvdGF0ZV9jc3QgKHVuc2lnbmVkIGludCBhKQoreworIGEgPSAoYSA8PCAxMCkgfCAoYSA+PiAyMik7CisgaWYgKGEgPT0gMTIzKQorICAgYmFyICgpOworfQordm9pZAorbWludXNfY3N0ICh1bnNpZ25lZCBpbnQgYSkKK3sKKyB1bnNpZ25lZCBpbnQgdGVtOworCisgdGVtID0gMjAgLSBhOworIGlmICh0ZW0gPT0gNSkKKyAgIGJhciAoKTsKK30KK3ZvaWQKK21hc2tfZ3QgKHVuc2lnbmVkIGludCBhKQoreworIC8qIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhID4gMTUuICAqLworIGlmICgoYSAmIH43KSA+IDgpCisgICBiYXIgKCk7Cit9Cit2b2lkCityc2hpZnRfZ3QgKHVuc2lnbmVkIGludCBhKQoreworIC8qIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhID4gMjMuICAqLworIGlmICgoYSA+PiAyKSA+IDUpCisgICBiYXIgKCk7Cit9CitBbGwgc2hvdWxkIHNpbXBsaWZ5IHRvIGEgc2luZ2xlIGNvbXBhcmlzb24uICBBbGwgb2YgdGhlc2UgYXJlCitjdXJyZW50bHkgbm90IG9wdGltaXplZCB3aXRoICJjbGFuZyAtZW1pdC1sbHZtLWJjIHwgb3B0Cistc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworRnJvbSBHQ0MgQnVnIDMyNjA1OgoraW50IGMoaW50KiB4KSB7cmV0dXJuIChjaGFyKil4KzIgPT0gKGNoYXIqKXg7fQorU2hvdWxkIGNvbWJpbmUgdG8gMC4gIEN1cnJlbnRseSBub3Qgb3B0aW1pemVkIHdpdGggImNsYW5nCistZW1pdC1sbHZtLWJjIHwgb3B0IC1zdGQtY29tcGlsZS1vcHRzIiAoYWx0aG91Z2ggbGxjIGNhbiBvcHRpbWl6ZSBpdCkuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW50IGEodW5zaWduZWQgYikge3JldHVybiAoKGIgPDwgMzEpIHwgKGIgPDwgMzApKSA+PiAzMTt9CitTaG91bGQgYmUgY29tYmluZWQgdG8gICIoKGIgPj4gMSkgfCBiKSAmIDEiLiAgQ3VycmVudGx5IG5vdCBvcHRpbWl6ZWQKK3dpdGggImNsYW5nIC1lbWl0LWxsdm0tYmMgfCBvcHQgLXN0ZC1jb21waWxlLW9wdHMiLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3Vuc2lnbmVkIGEodW5zaWduZWQgeCwgdW5zaWduZWQgeSkgeyByZXR1cm4geCB8ICh5ICYgMSkgfCAoeSAmIDIpO30KK1Nob3VsZCBjb21iaW5lIHRvICJ4IHwgKHkgJiAzKSIuICBDdXJyZW50bHkgbm90IG9wdGltaXplZCB3aXRoICJjbGFuZworLWVtaXQtbGx2bS1iYyB8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW50IGEoaW50IGEsIGludCBiLCBpbnQgYykge3JldHVybiAofmEgJiBjKSB8ICgoY3xhKSAmIGIpO30KK1Nob3VsZCBmb2xkIHRvICIofmEgJiBjKSB8IChhICYgYikiLiAgQ3VycmVudGx5IG5vdCBvcHRpbWl6ZWQgd2l0aAorImNsYW5nIC1lbWl0LWxsdm0tYmMgfCBvcHQgLXN0ZC1jb21waWxlLW9wdHMiLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2ludCBhKGludCBhLGludCBiKSB7cmV0dXJuICh+KGF8YikpfGE7fQorU2hvdWxkIGZvbGQgdG8gImF8fmIiLiAgQ3VycmVudGx5IG5vdCBvcHRpbWl6ZWQgd2l0aCAiY2xhbmcKKy1lbWl0LWxsdm0tYmMgfCBvcHQgLXN0ZC1jb21waWxlLW9wdHMiLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2ludCBhKGludCBhLCBpbnQgYikge3JldHVybiAoYSYmYikgfHwgKGEmJiFiKTt9CitTaG91bGQgZm9sZCB0byAiYSIuICBDdXJyZW50bHkgbm90IG9wdGltaXplZCB3aXRoICJjbGFuZyAtZW1pdC1sbHZtLWJjCit8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW50IGEoaW50IGEsIGludCBiLCBpbnQgYykge3JldHVybiAoYSYmYikgfHwgKCFhJiZjKTt9CitTaG91bGQgZm9sZCB0byAiYSA/IGIgOiBjIiwgb3IgYXQgbGVhc3Qgc29tZXRoaW5nIHNhbmUuICBDdXJyZW50bHkgbm90CitvcHRpbWl6ZWQgd2l0aCAiY2xhbmcgLWVtaXQtbGx2bS1iYyB8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW50IGEoaW50IGEsIGludCBiLCBpbnQgYykge3JldHVybiAoYSYmYikgfHwgKGEmJmMpIHx8IChhJiZiJiZjKTt9CitTaG91bGQgZm9sZCB0byBhICYmIChiIHx8IGMpLiAgQ3VycmVudGx5IG5vdCBvcHRpbWl6ZWQgd2l0aCAiY2xhbmcKKy1lbWl0LWxsdm0tYmMgfCBvcHQgLXN0ZC1jb21waWxlLW9wdHMiLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2ludCBhKGludCB4KSB7cmV0dXJuIHggfCAoKHggJiA4KSBeIDgpO30KK1Nob3VsZCBjb21iaW5lIHRvIHggfCA4LiAgQ3VycmVudGx5IG5vdCBvcHRpbWl6ZWQgd2l0aCAiY2xhbmcKKy1lbWl0LWxsdm0tYmMgfCBvcHQgLXN0ZC1jb21waWxlLW9wdHMiLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2ludCBhKGludCB4KSB7cmV0dXJuIHggXiAoKHggJiA4KSBeIDgpO30KK1Nob3VsZCBhbHNvIGNvbWJpbmUgdG8geCB8IDguICBDdXJyZW50bHkgbm90IG9wdGltaXplZCB3aXRoICJjbGFuZworLWVtaXQtbGx2bS1iYyB8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW50IGEoaW50IHgpIHtyZXR1cm4gKHggJiA4KSA9PSAwID8gLTEgOiAtOTt9CitTaG91bGQgY29tYmluZSB0byAoeCB8IC05KSBeIDguICBDdXJyZW50bHkgbm90IG9wdGltaXplZCB3aXRoICJjbGFuZworLWVtaXQtbGx2bS1iYyB8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW50IGEoaW50IHgpIHtyZXR1cm4gKHggJiA4KSA9PSAwID8gLTkgOiAtMTt9CitTaG91bGQgY29tYmluZSB0byB4IHwgLTkuICBDdXJyZW50bHkgbm90IG9wdGltaXplZCB3aXRoICJjbGFuZworLWVtaXQtbGx2bS1iYyB8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW50IGEoaW50IHgpIHtyZXR1cm4gKCh4IHwgLTkpIF4gOCkgJiB4O30KK1Nob3VsZCBjb21iaW5lIHRvIHggJiAtOS4gIEN1cnJlbnRseSBub3Qgb3B0aW1pemVkIHdpdGggImNsYW5nCistZW1pdC1sbHZtLWJjIHwgb3B0IC1zdGQtY29tcGlsZS1vcHRzIi4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit1bnNpZ25lZCBhKHVuc2lnbmVkIGEpIHtyZXR1cm4gYSAqIDB4MTExMTExMTEgPj4gMjggJiAxO30KK1Nob3VsZCBjb21iaW5lIHRvICJhICogMHg4ODg4ODg4OCA+PiAzMSIuICBDdXJyZW50bHkgbm90IG9wdGltaXplZAord2l0aCAiY2xhbmcgLWVtaXQtbGx2bS1iYyB8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordW5zaWduZWQgYShjaGFyKiB4KSB7aWYgKCgqeCAmIDMyKSA9PSAwKSByZXR1cm4gYigpO30KK1RoZXJlJ3MgYW4gdW5uZWNlc3NhcnkgemV4dCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2l0aCAiY2xhbmcKKy1lbWl0LWxsdm0tYmMgfCBvcHQgLXN0ZC1jb21waWxlLW9wdHMiLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3Vuc2lnbmVkIGEodW5zaWduZWQgbG9uZyBsb25nIHgpIHtyZXR1cm4gNDAgKiAoeCA+PiAxKTt9CitTaG91bGQgY29tYmluZSB0byAiMjAgKiAoKCh1bnNpZ25lZCl4KSAmIC0yKSIuICBDdXJyZW50bHkgbm90CitvcHRpbWl6ZWQgd2l0aCAiY2xhbmcgLWVtaXQtbGx2bS1iYyB8IG9wdCAtc3RkLWNvbXBpbGUtb3B0cyIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpcyB3YXMgbm90aWNlZCBpbiB0aGUgZW50cnlibG9jayBmb3IgZ3Jva2RlY2xhcmF0b3IgaW4gNDAzLmdjYzoKKworICAgICAgICAldG1wID0gaWNtcCBlcSBpMzIgJWRlY2xfY29udGV4dCwgNCAgICAgICAgICAKKyAgICAgICAgJWRlY2xfY29udGV4dF9hZGRyLjAgPSBzZWxlY3QgaTEgJXRtcCwgaTMyIDMsIGkzMiAlZGVjbF9jb250ZXh0IAorICAgICAgICAldG1wMSA9IGljbXAgZXEgaTMyICVkZWNsX2NvbnRleHRfYWRkci4wLCAxIAorICAgICAgICAlZGVjbF9jb250ZXh0X2FkZHIuMSA9IHNlbGVjdCBpMSAldG1wMSwgaTMyIDAsIGkzMiAlZGVjbF9jb250ZXh0X2FkZHIuMAorCit0bXAxIHNob3VsZCBiZSBzaW1wbGlmaWVkIHRvIHNvbWV0aGluZyBsaWtlOgorICAoIXRtcCB8fCBkZWNsX2NvbnRleHQgPT0gMSkKKworVGhpcyBhbGxvd3MgcmVjdXJzaXZlIHNpbXBsaWZpY2F0aW9ucywgdG1wMSBpcyB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZSBpbgordGhlIGZ1bmN0aW9uLCBlLmcuIGJ5OgorCisgICAgICAgICV0bXAyMyA9IGljbXAgZXEgaTMyICVkZWNsX2NvbnRleHRfYWRkci4xLCAwICAgICAgICAgICAgOyA8aTE+IFsjdXNlcz0xXQorICAgICAgICAldG1wMjQgPSB4b3IgaTEgJXRtcDEsIHRydWUgICAgICAgICAgICAgOyA8aTE+IFsjdXNlcz0xXQorICAgICAgICAlb3IuY29uZDggPSBhbmQgaTEgJXRtcDIzLCAldG1wMjQgICAgICAgICAgICAgICA7IDxpMT4gWyN1c2VzPTFdCisKK2xhdGVyLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1tTVE9SRSBTSU5LSU5HXQorCitTdG9yZSBzaW5raW5nOiBUaGlzIGNvZGU6CisKK3ZvaWQgZiAoaW50IG4sIGludCAqY29uZCwgaW50ICpyZXMpIHsKKyAgICBpbnQgaTsKKyAgICAqcmVzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoKmNvbmQpCisgICAgICAgICAgICAqcmVzIF49IDIzNDsgLyogKCopICovCit9CisKK09uIHRoaXMgZnVuY3Rpb24gR1ZOIGhvaXN0cyB0aGUgZnVsbHkgcmVkdW5kYW50IHZhbHVlIG9mICpyZXMsIGJ1dCBub3RoaW5nCittb3ZlcyB0aGUgc3RvcmUgb3V0LiAgVGhpcyBnaXZlcyB1cyB0aGlzIGNvZGU6CisKK2JiOgkJOyBwcmVkcyA9ICViYjIsICVlbnRyeQorCSUucmxlID0gcGhpIGkzMiBbIDAsICVlbnRyeSBdLCBbICUucmxlNiwgJWJiMiBdCQorCSVpLjA1ID0gcGhpIGkzMiBbIDAsICVlbnRyeSBdLCBbICVpbmR2YXIubmV4dCwgJWJiMiBdCisJJTEgPSBsb2FkIGkzMiogJWNvbmQsIGFsaWduIDQKKwklMiA9IGljbXAgZXEgaTMyICUxLCAwCisJYnIgaTEgJTIsIGxhYmVsICViYjIsIGxhYmVsICViYjEKKworYmIxOgkJOyBwcmVkcyA9ICViYgorCSUzID0geG9yIGkzMiAlLnJsZSwgMjM0CQorCXN0b3JlIGkzMiAlMywgaTMyKiAlcmVzLCBhbGlnbiA0CisJYnIgbGFiZWwgJWJiMgorCitiYjI6CQk7IHByZWRzID0gJWJiLCAlYmIxCisJJS5ybGU2ID0gcGhpIGkzMiBbICUzLCAlYmIxIF0sIFsgJS5ybGUsICViYiBdCQorCSVpbmR2YXIubmV4dCA9IGFkZCBpMzIgJWkuMDUsIDEJCisJJWV4aXRjb25kID0gaWNtcCBlcSBpMzIgJWluZHZhci5uZXh0LCAlbgorCWJyIGkxICVleGl0Y29uZCwgbGFiZWwgJXJldHVybiwgbGFiZWwgJWJiCisKK0RTRSBzaG91bGQgc2luayBwYXJ0aWFsbHkgZGVhZCBzdG9yZXMgdG8gZ2V0IHRoZSBzdG9yZSBvdXQgb2YgdGhlIGxvb3AuCisKK0hlcmUncyBhbm90aGVyIHBhcnRpYWwgZGVhZCBjYXNlOgoraHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMjM5NQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NjYWxhciBQUkUgaG9pc3RzIHRoZSBtdWwgaW4gdGhlIGNvbW1vbiBibG9jayB1cCB0byB0aGUgZWxzZToKKworaW50IHRlc3QgKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBnKSB7CisgIGludCBkLCBlOworICBpZiAoYSkKKyAgICBkID0gYiAqIGM7CisgIGVsc2UKKyAgICBkID0gYiAtIGM7CisgIGUgPSBiICogYyArIGc7CisgIHJldHVybiBkICsgZTsKK30KKworSXQgd291bGQgYmUgYmV0dGVyIHRvIGRvIHRoZSBtdWwgb25jZSB0byByZWR1Y2UgY29kZXNpemUgYWJvdmUgdGhlIGlmLgorVGhpcyBpcyBHQ0MgUFIzODIwNC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitbU1RPUkUgU0lOS0lOR10KKworR0NDIFBSMzc4MTAgaXMgYW4gaW50ZXJlc3RpbmcgY2FzZSB3aGVyZSB3ZSBzaG91bGQgc2luayBsb2FkL3N0b3JlIHJlbG9hZAoraW50byB0aGUgaWYgYmxvY2sgYW5kIG91dHNpZGUgdGhlIGxvb3AsIHNvIHdlIGRvbid0IHJlbG9hZC9zdG9yZSBpdCBvbiB0aGUKK25vbi1jYWxsIHBhdGguCisKK2ZvciAoKSB7CisgICpQICs9IDE7CisgIGlmICgpCisgICAgY2FsbCgpOworICBlbHNlCisgICAgLi4uCistPgordG1wID0gKlAKK2ZvciAoKSB7CisgIHRtcCArPSAxOworICBpZiAoKSB7CisgICAgKlAgPSB0bXA7CisgICAgY2FsbCgpOworICAgIHRtcCA9ICpQOworICB9IGVsc2UgLi4uCit9CisqUCA9IHRtcDsKKworV2Ugbm93IGhvaXN0IHRoZSByZWxvYWQgYWZ0ZXIgdGhlIGNhbGwgKFRyYW5zZm9ybXMvR1ZOL2xwcmUtY2FsbC13cmFwLmxsKSwgYnV0Cit3ZSBkb24ndCBzaW5rIHRoZSBzdG9yZS4gIFdlIG5lZWQgcGFydGlhbGx5IGRlYWQgc3RvcmUgc2lua2luZy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitbTE9BRCBQUkUgQ1JJVCBFREdFIFNQTElUVElOR10KKworR0NDIFBSMzcxNjY6IFNpbmtpbmcgb2YgbG9hZHMgcHJldmVudHMgU1JPQSdpbmcgdGhlICJnIiBzdHJ1Y3Qgb24gdGhlIHN0YWNrCitsZWFkaW5nIHRvIGV4Y2VzcyBzdGFjayB0cmFmZmljLiBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgYnkgR1ZOIHdpdGggc29tZSBjcmF6eQorc3ltYm9saWMgcGhpIHRyYW5zbGF0aW9uLiAgVGhlIGNvZGUgd2UgZ2V0IGxvb2tzIGxpa2UgKGcgaXMgb24gdGhlIHN0YWNrKToKKworYmIyOgkJOyBwcmVkcyA9ICViYjEKKy4uCisJJTkgPSBnZXRlbGVtZW50cHRyICVzdHJ1Y3QuZiogJWcsIGkzMiAwLCBpMzIgMAkJCisJc3RvcmUgaTMyICU4LCBpMzIqICU5LCBhbGlnbiAgYmVsICViYjMKKworYmIzOgkJOyBwcmVkcyA9ICViYjEsICViYjIsICViYgorCSVjX2FkZHIuMCA9IHBoaSAlc3RydWN0LmYqIFsgJWcsICViYjIgXSwgWyAlYywgJWJiIF0sIFsgJWMsICViYjEgXQorCSViX2FkZHIuMCA9IHBoaSAlc3RydWN0LmYqIFsgJWIsICViYjIgXSwgWyAlZywgJWJiIF0sIFsgJWIsICViYjEgXQorCSUxMCA9IGdldGVsZW1lbnRwdHIgJXN0cnVjdC5mKiAlY19hZGRyLjAsIGkzMiAwLCBpMzIgMAorCSUxMSA9IGxvYWQgaTMyKiAlMTAsIGFsaWduIDQKKworJTExIGlzIHBhcnRpYWxseSByZWR1bmRhbnQsIGFuIGluIEJCMiBpdCBzaG91bGQgaGF2ZSB0aGUgdmFsdWUgJTguCisKK0dDQyBQUjMzMzQ0IGFuZCBQUjM1Mjg3IGFyZSBzaW1pbGFyIGNhc2VzLgorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworW0xPQUQgUFJFXQorCitUaGVyZSBhcmUgbWFueSBsb2FkIFBSRSB0ZXN0Y2FzZXMgaW4gdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9sb2FkcHJlKiBpbiB0aGUKK0dDQyB0ZXN0c3VpdGUsIG9uZXMgd2UgZG9uJ3QgZ2V0IHlldCBhcmUgKGNoZWNrZWQgdGhyb3VnaCBsb2FkcHJlMjUpOgorCitbQ1JJVCBFREdFIEJSRUFLSU5HXQorbG9hZHByZTMuYyBwcmVkY29tLTQuYworCitbUFJFIE9GIFJFQURPTkxZIENBTExdCitsb2FkcHJlNS5jCisKK1tUVVJOIFNFTEVDVCBJTlRPIEJSQU5DSF0KK2xvYWRwcmUxNC5jIGxvYWRwcmUxNS5jIAorCithY3R1YWxseSBhIGNvbmRpdGlvbmFsIGluY3JlbWVudDogbG9hZHByZTE4LmMgbG9hZHByZTE5LmMKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1tTQ0FMQVIgUFJFXQorVGhlcmUgYXJlIG1hbnkgUFJFIHRlc3RjYXNlcyBpbiB0ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3NzYS1wcmUtKi5jIGluIHRoZQorR0NDIHRlc3RzdWl0ZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGVyZSBhcmUgc29tZSBpbnRlcmVzdGluZyBjYXNlcyBpbiB0ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ByZWQtY29tbSogaW4gdGhlCitHQ0MgdGVzdHN1aXRlLiAgRm9yIGV4YW1wbGUsIHdlIGdldCB0aGUgZmlyc3QgZXhhbXBsZSBpbiBwcmVkY29tLTEuYywgYnV0IAorbWlzcyB0aGUgc2Vjb25kIG9uZToKKwordW5zaWduZWQgZmliWzEwMDBdOwordW5zaWduZWQgYXZnWzEwMDBdOworCitfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQordm9pZCBjb3VudF9hdmVyYWdlcyhpbnQgbikgeworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IG47IGkrKykKKyAgICBhdmdbaV0gPSAoKCh1bnNpZ25lZCBsb25nKSBmaWJbaSAtIDFdICsgZmliW2ldICsgZmliW2kgKyAxXSkgLyAzKSAmIDB4ZmZmZjsKK30KKword2hpY2ggY29tcGlsZXMgaW50byB0d28gbG9hZHMgaW5zdGVhZCBvZiBvbmUgaW4gdGhlIGxvb3AuCisKK3ByZWRjb20tMi5jIGlzIHRoZSBzYW1lIGFzIHByZWRjb20tMS5jCisKK3ByZWRjb20tMy5jIGlzIHZlcnkgc2ltaWxhciBidXQgbmVlZHMgbG9hZHMgZmVlZGluZyBlYWNoIG90aGVyIGluc3RlYWQgb2YKK3N0b3JlLT5sb2FkLgorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworW0FMSUFTIEFOQUxZU0lTXQorCitUeXBlIGJhc2VkIGFsaWFzIGFuYWx5c2lzOgoraHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xNDcwNQorCitXZSBzaG91bGQgZG8gYmV0dGVyIGFuYWx5c2lzIG9mIHBvc2l4X21lbWFsaWduLiAgQXQgdGhlIGxlYXN0IGl0IHNob3VsZAorbm8tY2FwdHVyZSBpdHMgcG9pbnRlciBhcmd1bWVudCwgYXQgYmVzdCwgd2Ugc2hvdWxkIGtub3cgdGhhdCB0aGUgb3V0LXZhbHVlCityZXN1bHQgZG9lc24ndCBwb2ludCB0byBhbnl0aGluZyAobGlrZSBtYWxsb2MpLiAgT25lIGV4YW1wbGUgb2YgdGhpcyBpcyBpbgorU2luZ2xlU291cmNlL0JlbmNobWFya3MvTWlzYy9kdC5jCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQS9CIGdldCBwaW5uZWQgdG8gdGhlIHN0YWNrIGJlY2F1c2Ugd2UgdHVybiBhbiBpZi90aGVuIGludG8gYSBzZWxlY3QgaW5zdGVhZAorb2YgUFJFJ2luZyB0aGUgbG9hZC9zdG9yZS4gIFRoaXMgbWF5IGJlIGZpeGFibGUgaW4gaW5zdGNvbWJpbmU6CitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3ODkyCisKK3N0cnVjdCBYIHsgaW50IGk7IH07CitpbnQgZm9vIChpbnQgeCkgeworICBzdHJ1Y3QgWCBhOworICBzdHJ1Y3QgWCBiOworICBzdHJ1Y3QgWCAqcDsKKyAgYS5pID0gMTsKKyAgYi5pID0gMjsKKyAgaWYgKHgpCisgICAgcCA9ICZhOworICBlbHNlCisgICAgcCA9ICZiOworICByZXR1cm4gcC0+aTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbnRlcmVzdGluZyBtaXNzZWQgY2FzZSBiZWNhdXNlIG9mIGNvbnRyb2wgZmxvdyBmbGF0dGVuaW5nIChzaG91bGQgYmUgMiBsb2Fkcyk6CitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI2NjI5CitXaXRoOiBsbHZtLWdjYyB0Mi5jIC1TIC1vIC0gLU8wIC1lbWl0LWxsdm0gfCBsbHZtLWFzIHwgCisgICAgICAgICAgICAgb3B0IC1tZW0ycmVnIC1ndm4gLWluc3Rjb21iaW5lIHwgbGx2bS1kaXMKK3dlIG1pc3MgaXQgYmVjYXVzZSB3ZSBuZWVkIDEpIENSSVQgRURHRSAyKSBNVUxUSVBMRSBESUZGRVJFTlQKK1ZBTFMgUFJPRFVDRUQgQlkgT05FIEJMT0NLIE9WRVIgRElGRkVSRU5UIFBBVEhTCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xOTYzMworV2UgY291bGQgZWxpbWluYXRlIHRoZSBicmFuY2ggY29uZGl0aW9uIGhlcmUsIGxvYWRpbmcgZnJvbSBudWxsIGlzIHVuZGVmaW5lZDoKKworc3RydWN0IFMgeyBpbnQgdywgeCwgeSwgejsgfTsKK3N0cnVjdCBUIHsgaW50IHI7IHN0cnVjdCBTIHM7IH07Cit2b2lkIGJhciAoc3RydWN0IFMsIGludCk7Cit2b2lkIGZvbyAoaW50IGEsIHN0cnVjdCBUIGIpCit7CisgIHN0cnVjdCBTICpjID0gMDsKKyAgaWYgKGEpCisgICAgYyA9ICZiLnM7CisgIGJhciAoKmMsIGEpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3NpbXBsaWZ5bGliY2FsbHMgc2hvdWxkIGRvIHNldmVyYWwgb3B0aW1pemF0aW9ucyBmb3Igc3Ryc3BuL3N0cmNzcG46CisKK3N0cmNzcG4oeCwgIiIpIC0+IHN0cmxlbih4KQorc3RyY3NwbigiIiwgeCkgLT4gMAorc3Ryc3BuKCIiLCB4KSAtPiAwCitzdHJzcG4oeCwgIiIpIC0+IHN0cmxlbih4KQorc3Ryc3BuKHgsICJhIikgLT4gc3RyY2hyKHgsICdhJykteAorCitzdHJjc3BuKHgsICJhIikgLT4gaW5saW5lZCBsb29wIGZvciB1cCB0byAzIGxldHRlcnMgKHNpbWlsYXJseSBmb3Igc3Ryc3BuKToKKworc2l6ZV90IF9fc3RyY3Nwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsIGludCBfX3JlamVjdDIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgX19yZWplY3QzKSB7CisgIHJlZ2lzdGVyIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgIHdoaWxlIChfX3NbX19yZXN1bHRdICE9ICdcMCcgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDEgJiYKKyAgICAgICAgIF9fc1tfX3Jlc3VsdF0gIT0gX19yZWplY3QyICYmIF9fc1tfX3Jlc3VsdF0gIT0gX19yZWplY3QzKQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworVGhpcyBzaG91bGQgdHVybiBpbnRvIGEgc3dpdGNoIG9uIHRoZSBjaGFyYWN0ZXIuICBTZWUgUFIzMjUzIGZvciBzb21lIG5vdGVzIG9uCitjb2RlZ2VuLgorCis0NTYuaG1tZXIgYXBwYXJlbnRseSB1c2VzIHN0cmNzcG4gYW5kIHN0cnNwbiBhIGxvdC4gIDQ3MS5vbW5ldHBwIHVzZXMgc3Ryc3BuLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyJnYXMiIHVzZXMgdGhpcyBpZGlvbToKKyAgZWxzZSBpZiAoc3RyY2hyICgiKy0vKiV8Jl46W10oKX4iLCAqaW50ZWxfcGFyc2VyLm9wX3N0cmluZykpCisuLgorICBlbHNlIGlmIChzdHJjaHIgKCI8PiIsICppbnRlbF9wYXJzZXIub3Bfc3RyaW5nKQorCitUaG9zZSBzaG91bGQgYmUgdHVybmVkIGludG8gYSBzd2l0Y2guCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworMjUyLmVvbiBjb250YWlucyB0aGlzIGludGVyZXN0aW5nIGNvZGU6CisKKyAgICAgICAgJTMwNzIgPSBnZXRlbGVtZW50cHRyIFsxMDAgeCBpOF0qICV0ZW1wU3RyaW5nLCBpMzIgMCwgaTMyIDAKKyAgICAgICAgJTMwNzMgPSBjYWxsIGk4KiBAc3RyY3B5KGk4KiAlMzA3MiwgaTgqICUzMDcxKSBub3Vud2luZAorICAgICAgICAlc3RybGVuID0gY2FsbCBpMzIgQHN0cmxlbihpOCogJTMwNzIpICAgIDsgdXNlcyA9IDEKKyAgICAgICAgJWVuZHB0ciA9IGdldGVsZW1lbnRwdHIgWzEwMCB4IGk4XSogJXRlbXBTdHJpbmcsIGkzMiAwLCBpMzIgJXN0cmxlbgorICAgICAgICBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LmkzMihpOCogJWVuZHB0ciwgCisgICAgICAgICAgaTgqIGdldGVsZW1lbnRwdHIgKFs1IHggaThdKiBAIlwwMUxDNDIiLCBpMzIgMCwgaTMyIDApLCBpMzIgNSwgaTMyIDEpCisgICAgICAgICUzMDc0ID0gY2FsbCBpMzIgQHN0cmxlbihpOCogJWVuZHB0cikgbm91bndpbmQgcmVhZG9ubHkgCisgICAgICAgIAorVGhpcyBpcyBpbnRlcmVzdGluZyBmb3IgYSBjb3VwbGUgcmVhc29ucy4gIEZpcnN0LCBpbiB0aGlzOgorCisgICAgICAgICUzMDczID0gY2FsbCBpOCogQHN0cmNweShpOCogJTMwNzIsIGk4KiAlMzA3MSkgbm91bndpbmQKKyAgICAgICAgJXN0cmxlbiA9IGNhbGwgaTMyIEBzdHJsZW4oaTgqICUzMDcyKSAgCisKK1RoZSBzdHJsZW4gY291bGQgYmUgcmVwbGFjZWQgd2l0aDogJXN0cmxlbiA9IHN1YiAlMzA3MiwgJTMwNzMsIGJlY2F1c2UgdGhlCitzdHJjcHkgY2FsbCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICBCYXNlZCBvbiB0aGF0LCB0aGUKK2VuZHB0ciBHRVAganVzdCBiZWNvbWVzIGVxdWFsIHRvIDMwNzMsIHdoaWNoIGVsaW1pbmF0ZXMgYSBzdHJsZW4gY2FsbCBhbmQgR0VQLgorCitTZWNvbmQsIHRoZSBtZW1jcHkrc3RybGVuIHN0cmxlbiBjYW4gYmUgcmVwbGFjZWQgd2l0aDoKKworICAgICAgICAlMzA3NCA9IGNhbGwgaTMyIEBzdHJsZW4oWzUgeCBpOF0qIEAiXDAxTEM0MiIpIG5vdW53aW5kIHJlYWRvbmx5IAorCitCZWNhdXNlIHRoZSBkZXN0aW5hdGlvbiB3YXMganVzdCBjb3BpZWQgaW50byB0aGUgc3BlY2lmaWVkIG1lbW9yeSBidWZmZXIuICBUaGlzLAoraW4gdHVybiwgY2FuIGJlIGNvbnN0YW50IGZvbGRlZCB0byAiNCIuCisKK0luIG90aGVyIGNvZGUsIGl0IGNvbnRhaW5zOgorCisgICAgICAgICVlbmRwdHI2OTc4ID0gYml0Y2FzdCBpOCogJWVuZHB0cjY5IHRvIGkzMiogICAgICAgICAgICAKKyAgICAgICAgc3RvcmUgaTMyIDcxMDczNzQsIGkzMiogJWVuZHB0cjY5NzgsIGFsaWduIDEKKyAgICAgICAgJTMxNjcgPSBjYWxsIGkzMiBAc3RybGVuKGk4KiAlZW5kcHRyNjkpIG5vdW53aW5kIHJlYWRvbmx5ICAgIAorCitXaGljaCBjb3VsZCBhbHNvIGJlIGNvbnN0YW50IGZvbGRlZC4gIFdoYXRldmVyIGlzIHByb2R1Y2luZyB0aGlzIHNob3VsZCBwcm9iYWJseQorYmUgZml4ZWQgdG8gbGVhdmUgdGhpcyBhcyBhIG1lbWNweSBmcm9tIGEgc3RyaW5nLgorCitGdXJ0aGVyLCBlb24gYWxzbyBoYXMgYW4gaW50ZXJlc3RpbmcgcGFydGlhbGx5IHJlZHVuZGFudCBzdHJsZW4gY2FsbDoKKworYmI4OiAgICAgICAgICAgIDsgcHJlZHMgPSAlX1pOMThlb25JbWFnZUNhbGN1bGF0b3JDMUV2LmV4aXQKKyAgICAgICAgJTY4MiA9IGdldGVsZW1lbnRwdHIgaTgqKiAlYXJndiwgaTMyIDYgICAgICAgICAgOyA8aTgqKj4gWyN1c2VzPTJdCisgICAgICAgICU2ODMgPSBsb2FkIGk4KiogJTY4MiwgYWxpZ24gNCAgICAgICAgICA7IDxpOCo+IFsjdXNlcz00XQorICAgICAgICAlNjg0ID0gbG9hZCBpOCogJTY4MywgYWxpZ24gMSAgICAgICAgICAgOyA8aTg+IFsjdXNlcz0xXQorICAgICAgICAlNjg1ID0gaWNtcCBlcSBpOCAlNjg0LCAwICAgICAgICAgICAgICAgOyA8aTE+IFsjdXNlcz0xXQorICAgICAgICBiciBpMSAlNjg1LCBsYWJlbCAlYmIxMCwgbGFiZWwgJWJiOQorCitiYjk6ICAgICAgICAgICAgOyBwcmVkcyA9ICViYjgKKyAgICAgICAgJTY4NiA9IGNhbGwgaTMyIEBzdHJsZW4oaTgqICU2ODMpIG5vdW53aW5kIHJlYWRvbmx5ICAgICAgICAgIAorICAgICAgICAlNjg3ID0gaWNtcCB1Z3QgaTMyICU2ODYsIDI1NCAgICAgICAgICAgOyA8aTE+IFsjdXNlcz0xXQorICAgICAgICBiciBpMSAlNjg3LCBsYWJlbCAlYmIxMCwgbGFiZWwgJWJiMTEKKworYmIxMDogICAgICAgICAgIDsgcHJlZHMgPSAlYmI5LCAlYmI4CisgICAgICAgICU2ODggPSBjYWxsIGkzMiBAc3RybGVuKGk4KiAlNjgzKSBub3Vud2luZCByZWFkb25seSAgICAgICAgICAKKworVGhpcyBjb3VsZCBiZSBlbGltaW5hdGVkIGJ5IGRvaW5nIHRoZSBzdHJsZW4gb25jZSBpbiBiYjgsIHNhdmluZyBjb2RlIHNpemUgYW5kCitpbXByb3ZpbmcgcGVyZiBvbiB0aGUgYmI4LT45LT4xMCBwYXRoLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0kgc2VlIGFuIGludGVyZXN0aW5nIGZ1bGx5IHJlZHVuZGFudCBjYWxsIHRvIHN0cmxlbiBsZWZ0IGluIDE4Ni5jcmFmdHk6SW5wdXRNb3ZlCit3aGljaCBsb29rcyBsaWtlOgorICAgICAgICVtb3ZldGV4dDExID0gZ2V0ZWxlbWVudHB0ciBbMTI4IHggaThdKiAlbW92ZXRleHQsIGkzMiAwLCBpMzIgMCAKKyAKKworYmI2MjogICAgICAgICAgIDsgcHJlZHMgPSAlYmI1NSwgJWJiNTMKKyAgICAgICAgJXByb21vdGUuMCA9IHBoaSBpMzIgWyAlMTY5LCAlYmI1NSBdLCBbIDAsICViYjUzIF0gICAgICAgICAgICAgCisgICAgICAgICUxNzEgPSBjYWxsIGkzMiBAc3RybGVuKGk4KiAlbW92ZXRleHQxMSkgbm91bndpbmQgcmVhZG9ubHkgYWxpZ24gMQorICAgICAgICAlMTcyID0gYWRkIGkzMiAlMTcxLCAtMSAgICAgICAgIDsgPGkzMj4gWyN1c2VzPTFdCisgICAgICAgICUxNzMgPSBnZXRlbGVtZW50cHRyIFsxMjggeCBpOF0qICVtb3ZldGV4dCwgaTMyIDAsIGkzMiAlMTcyICAgICAgIAorCisuLi4gIG5vIHN0b3JlcyAuLi4KKyAgICAgICBiciBpMSAlb3IuY29uZCwgbGFiZWwgJWJiNjUsIGxhYmVsICViYjcyCisKK2JiNjU6ICAgICAgICAgICA7IHByZWRzID0gJWJiNjIKKyAgICAgICAgc3RvcmUgaTggMCwgaTgqICUxNzMsIGFsaWduIDEKKyAgICAgICAgYnIgbGFiZWwgJWJiNzIKKworYmI3MjogICAgICAgICAgIDsgcHJlZHMgPSAlYmI2NSwgJWJiNjIKKyAgICAgICAgJXRyYW5rLjEgPSBwaGkgaTMyIFsgJTE3NiwgJWJiNjUgXSwgWyAtMSwgJWJiNjIgXSAgICAgICAgICAgIAorICAgICAgICAlMTc3ID0gY2FsbCBpMzIgQHN0cmxlbihpOCogJW1vdmV0ZXh0MTEpIG5vdW53aW5kIHJlYWRvbmx5IGFsaWduIDEKKworTm90ZSB0aGF0IG9uIHRoZSBiYjYyLT5iYjcyIHBhdGgsIHRoYXQgdGhlICUxNzcgc3RybGVuIGNhbGwgaXMgcGFydGlhbGx5CityZWR1bmRhbnQgd2l0aCB0aGUgJTE3MSBjYWxsLiAgQXQgd29yc3QsIHdlIGNvdWxkIHNob3ZlIHRoZSAlMTc3IHN0cmxlbiBjYWxsCit1cCBpbnRvIHRoZSBiYjY1IGJsb2NrIG1vdmluZyBpdCBvdXQgb2YgdGhlIGJiNjItPmJiNzIgcGF0aC4gICBIb3dldmVyLCBub3RlCit0aGF0IGJiNjUgc3RvcmVzIHRvIHRoZSBzdHJpbmcsIHplcm9pbmcgb3V0IHRoZSBsYXN0IGJ5dGUuICBUaGlzIG1lYW5zIHRoYXQgb24KK3RoYXQgcGF0aCB0aGUgdmFsdWUgb2YgJTE3NyBpcyBhY3R1YWxseSBqdXN0ICUxNzEtMS4gIEEgc3ViIGlzIGNoZWFwZXIgdGhhbiBhCitzdHJsZW4hCisKK1RoaXMgcGF0dGVybiByZXBlYXRzIHNldmVyYWwgdGltZXMsIGJhc2ljYWxseSBkb2luZzoKKworICBBID0gc3RybGVuKFApOworICBQW0EtMV0gPSAwOworICBCID0gc3RybGVuKFApOworICB3aGVyZSBpdCBpcyAib2J2aW91cyIgdGhhdCBCID0gQS0xLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKzE4Ni5jcmFmdHkgYWxzbyBjb250YWlucyB0aGlzIGNvZGU6CisKKyUxOTA2ID0gY2FsbCBpMzIgQHN0cmxlbihpOCogZ2V0ZWxlbWVudHB0ciAoWzMyIHggaThdKiBAcGduX2V2ZW50LCBpMzIgMCxpMzIgMCkpCislMTkwNyA9IGdldGVsZW1lbnRwdHIgWzMyIHggaThdKiBAcGduX2V2ZW50LCBpMzIgMCwgaTMyICUxOTA2CislMTkwOCA9IGNhbGwgaTgqIEBzdHJjcHkoaTgqICUxOTA3LCBpOCogJTE5MDUpIG5vdW53aW5kIGFsaWduIDEKKyUxOTA5ID0gY2FsbCBpMzIgQHN0cmxlbihpOCogZ2V0ZWxlbWVudHB0ciAoWzMyIHggaThdKiBAcGduX2V2ZW50LCBpMzIgMCxpMzIgMCkpCislMTkxMCA9IGdldGVsZW1lbnRwdHIgWzMyIHggaThdKiBAcGduX2V2ZW50LCBpMzIgMCwgaTMyICUxOTA5ICAgICAgICAgCisKK1RoZSBsYXN0IHN0cmxlbiBpcyBjb21wdXRhYmxlIGFzIDE5MDgtQHBnbl9ldmVudCwgd2hpY2ggbWVhbnMgMTkxMD0xOTA4LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKzE4Ni5jcmFmdHkgaGFzIHRoaXMgaW50ZXJlc3RpbmcgcGF0dGVybiB3aXRoIHRoZSAib3V0LjQ1NDMiIHZhcmlhYmxlOgorCitjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LmkzMigKKyAgICAgICAgaTgqIGdldGVsZW1lbnRwdHIgKFsxMCB4IGk4XSogQG91dC40NTQzLCBpMzIgMCwgaTMyIDApLAorICAgICAgIGk4KiBnZXRlbGVtZW50cHRyIChbNyB4IGk4XSogQCJcMDFMQzI4NzAwIiwgaTMyIDAsIGkzMiAwKSwgaTMyIDcsIGkzMiAxKSAKKyUxMDEgPSBjYWxsQHByaW50ZihpOCogLi4uICAgQG91dC40NTQzLCBpMzIgMCwgaTMyIDApKSBub3Vud2luZCAKKworSXQgaXMgYmFzaWNhbGx5IGRvaW5nOgorCisgIG1lbWNweShnbG9iYWxhcnJheSwgInN0cmluZyIpOworICBwcmludGYoLi4uLCAgZ2xvYmFsYXJyYXkpOworICAKK0FueXdheSwgYnkga25vd2luZyB0aGF0IHByaW50ZiBqdXN0IHJlYWRzIHRoZSBtZW1vcnkgYW5kIGZvcndhcmQgc3Vic3RpdHV0aW5nCit0aGUgc3RyaW5nIGRpcmVjdGx5IGludG8gdGhlIHByaW50ZiwgdGhpcyBlbGltaW5hdGVzIHJlYWRzIGZyb20gZ2xvYmFsYXJyYXkuCitTaW5jZSB0aGlzIHBhdHRlcm4gb2NjdXJzIGZyZXF1ZW50bHkgaW4gY3JhZnR5IChkdWUgdG8gdGhlICJEaXNwbGF5VGltZSIgYW5kCitvdGhlciBzaW1pbGFyIGZ1bmN0aW9ucykgdGhlcmUgYXJlIG1hbnkgc3RvcmVzIHRvICJvdXQiLiAgT25jZSBhbGwgdGhlIHByaW50ZnMKK3N0b3AgdXNpbmcgIm91dCIsIGFsbCB0aGF0IGlzIGxlZnQgaXMgdGhlIG1lbWNweSdzIGludG8gaXQuICBUaGlzIHNob3VsZCBhbGxvdworZ2xvYmFsb3B0IHRvIHJlbW92ZSB0aGUgInN0b3JlZCBvbmx5IiBnbG9iYWwuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpcyBjb2RlOgorCitkZWZpbmUgaW5yZWcgaTMyIEBmb28oaTgqIGlucmVnICVwKSBub3Vud2luZCB7CisgICV0bXAwID0gbG9hZCBpOCogJXAKKyAgJXRtcDEgPSBhc2hyIGk4ICV0bXAwLCA1CisgICV0bXAyID0gc2V4dCBpOCAldG1wMSB0byBpMzIKKyAgcmV0IGkzMiAldG1wMgorfQorCitjb3VsZCBiZSBkYWdjb21iaW5lJ2QgdG8gYSBzaWduLWV4dGVuZGluZyBsb2FkIHdpdGggYSBzaGlmdC4KK0ZvciBleGFtcGxlLCBvbiB4ODYgdGhpcyBjdXJyZW50bHkgZ2V0cyB0aGlzOgorCisJbW92YgkoJWVheCksICVhbAorCXNhcmIJJDUsICVhbAorCW1vdnNibAklYWwsICVlYXgKKword2hpbGUgaXQgY291bGQgZ2V0IHRoaXM6CisKKwltb3ZzYmwJKCVlYXgpLCAlZWF4CisJc2FybAkkNSwgJWVheAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0dDQyBQUjMxMDI5OgorCitpbnQgdGVzdChpbnQgeCkgeyByZXR1cm4gMS14ID09IHg7IH0gICAgIC8vIC0tPiByZXR1cm4gZmFsc2UKK2ludCB0ZXN0MihpbnQgeCkgeyByZXR1cm4gMi14ID09IHg7IH0gICAgLy8gLS0+IHJldHVybiB4ID09IDEgPworCitBbHdheXMgZm9sZGFibGUgZm9yIG9kZCBjb25zdGFudHMsIHdoYXQgaXMgdGhlIHJ1bGUgZm9yIGV2ZW4/CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworUFIgMzM4MTogR0VQIHRvIGZpZWxkIG9mIHNpemUgMCBpbnNpZGUgYSBzdHJ1Y3QgY291bGQgYmUgdHVybmVkIGludG8gR0VQCitmb3IgbmV4dCBmaWVsZCBpbiBzdHJ1Y3QgKHdoaWNoIGlzIGF0IHNhbWUgYWRkcmVzcykuCisKK0ZvciBleGFtcGxlOiBzdG9yZSBvZiBmbG9hdCBpbnRvIHsge3t9fSwgZmxvYXQgfSBjb3VsZCBiZSB0dXJuZWQgaW50byBhIHN0b3JlIHRvCit0aGUgZmxvYXQgZGlyZWN0bHkuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgPG1hdGguaD4KK2RvdWJsZSBmb28oZG91YmxlIGEpIHsgICAgcmV0dXJuIHNpbihhKTsgfQorCitUaGlzIGNvbXBpbGVzIGludG8gdGhpcyBvbiB4ODYtNjQgTGludXg6Citmb286CisJc3VicQkkOCwgJXJzcAorCWNhbGwJc2luCisJYWRkcQkkOCwgJXJzcAorCXJldAordnM6CisKK2ZvbzoKKyAgICAgICAgam1wIHNpbgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZSBhcmcgcHJvbW90aW9uIHBhc3Mgc2hvdWxkIG1ha2UgdXNlIG9mIG5vY2FwdHVyZSB0byBtYWtlIGl0cyBhbGlhcyBhbmFseXNpcworc3R1ZmYgbXVjaCBtb3JlIHByZWNpc2UuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc2hvdWxkIGJlIG9wdGltaXplZCB0byB1c2UgYSBzZWxlY3QgaW5zdGVhZCBvZiBhCiticmFuY2ggKGZyb20gZ2NjIFBSNDAwNzIpOgorCitjaGFyIGNoYXJfaW50KGludCBtKSB7aWYobT43KSByZXR1cm4gMDsgcmV0dXJuIG07fQoraW50IGludF9jaGFyKGNoYXIgbSkge2lmKG0+NykgcmV0dXJuIDA7IHJldHVybiBtO30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitpbnQgZnVuYyhpbnQgYSwgaW50IGIpIHsgaWYgKGEgJiAweDgwKSBiIHw9IDB4ODA7IGVsc2UgYiAmPSB+MHg4MDsgcmV0dXJuIGI7IH0KKworR2VuZXJhdGVzIHRoaXM6CisKK2RlZmluZSBpMzIgQGZ1bmMoaTMyICVhLCBpMzIgJWIpIG5vdW53aW5kIHJlYWRub25lIHNzcCB7CitlbnRyeToKKyAgJTAgPSBhbmQgaTMyICVhLCAxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgOyA8aTMyPiBbI3VzZXM9MV0KKyAgJTEgPSBpY21wIGVxIGkzMiAlMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgOyA8aTE+IFsjdXNlcz0xXQorICAlMiA9IG9yIGkzMiAlYiwgMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMzI+IFsjdXNlcz0xXQorICAlMyA9IGFuZCBpMzIgJWIsIC0xMjkgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMzI+IFsjdXNlcz0xXQorICAlYl9hZGRyLjAgPSBzZWxlY3QgaTEgJTEsIGkzMiAlMywgaTMyICUyICAgICAgICA7IDxpMzI+IFsjdXNlcz0xXQorICByZXQgaTMyICViX2FkZHIuMAorfQorCitIb3dldmVyLCBpdCdzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvOgorCisgICAgICAgICBiID0gKGIgJiB+MHg4MCkgfCAoYSAmIDB4ODApOworCitXaGljaCBnZW5lcmF0ZXMgdGhpczoKKworZGVmaW5lIGkzMiBAZnVuYyhpMzIgJWEsIGkzMiAlYikgbm91bndpbmQgcmVhZG5vbmUgc3NwIHsKK2VudHJ5OgorICAlMCA9IGFuZCBpMzIgJWIsIC0xMjkgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMzI+IFsjdXNlcz0xXQorICAlMSA9IGFuZCBpMzIgJWEsIDEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMzI+IFsjdXNlcz0xXQorICAlMiA9IG9yIGkzMiAlMCwgJTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMzI+IFsjdXNlcz0xXQorICByZXQgaTMyICUyCit9CisKK1RoaXMgY2FuIGJlIGdlbmVyYWxpemVkIGZvciBvdGhlciBmb3JtczoKKworICAgICBiID0gKGIgJiB+MHg4MCkgfCAoYSAmIDB4NDApIDw8IDE7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlc2UgdHdvIGZ1bmN0aW9ucyBwcm9kdWNlIGRpZmZlcmVudCBjb2RlLiBUaGV5IHNob3VsZG4ndDoKKworI2luY2x1ZGUgPHN0ZGludC5oPgorIAordWludDhfdCBwMSh1aW50OF90IGIsIHVpbnQ4X3QgYSkgeworICBiID0gKGIgJiB+MHhjMCkgfCAoYSAmIDB4YzApOworICByZXR1cm4gKGIpOworfQorIAordWludDhfdCBwMih1aW50OF90IGIsIHVpbnQ4X3QgYSkgeworICBiID0gKGIgJiB+MHg0MCkgfCAoYSAmIDB4NDApOworICBiID0gKGIgJiB+MHg4MCkgfCAoYSAmIDB4ODApOworICByZXR1cm4gKGIpOworfQorCitkZWZpbmUgemVyb2V4dCBpOCBAcDEoaTggemVyb2V4dCAlYiwgaTggemVyb2V4dCAlYSkgbm91bndpbmQgcmVhZG5vbmUgc3NwIHsKK2VudHJ5OgorICAlMCA9IGFuZCBpOCAlYiwgNjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpOD4gWyN1c2VzPTFdCisgICUxID0gYW5kIGk4ICVhLCAtNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgPGk4PiBbI3VzZXM9MV0KKyAgJTIgPSBvciBpOCAlMSwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyA8aTg+IFsjdXNlcz0xXQorICByZXQgaTggJTIKK30KKworZGVmaW5lIHplcm9leHQgaTggQHAyKGk4IHplcm9leHQgJWIsIGk4IHplcm9leHQgJWEpIG5vdW53aW5kIHJlYWRub25lIHNzcCB7CitlbnRyeToKKyAgJTAgPSBhbmQgaTggJWIsIDYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyA8aTg+IFsjdXNlcz0xXQorICAlLm1hc2tlZCA9IGFuZCBpOCAlYSwgNjQgICAgICAgICAgICAgICAgICAgICAgICA7IDxpOD4gWyN1c2VzPTFdCisgICUxID0gYW5kIGk4ICVhLCAtMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgPGk4PiBbI3VzZXM9MV0KKyAgJTIgPSBvciBpOCAlMSwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyA8aTg+IFsjdXNlcz0xXQorICAlMyA9IG9yIGk4ICUyLCAlLm1hc2tlZCAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpOD4gWyN1c2VzPTFdCisgIHJldCBpOCAlMworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0lQU0NDUCBkb2VzIG5vdCBjdXJyZW50bHkgcHJvcGFnYXRlIGFyZ3VtZW50IGRlcGVuZGVudCBjb25zdGFudHMgdGhyb3VnaAorZnVuY3Rpb25zIHdoZXJlIGl0IGRvZXMgbm90IG5vdCBhbGwgb2YgdGhlIGNhbGxlcnMuICBUaGlzIGluY2x1ZGVzIGZ1bmN0aW9ucword2l0aCBub3JtYWwgZXh0ZXJuYWwgbGlua2FnZSBhcyB3ZWxsIGFzIHRlbXBsYXRlcywgQzk5IGlubGluZSBmdW5jdGlvbnMgZXRjLgorU3BlY2lmaWNhbGx5LCBpdCBkb2VzIG5vdGhpbmcgdG86CisKK2RlZmluZSBpMzIgQHRlc3QoaTMyICV4LCBpMzIgJXksIGkzMiAleikgbm91bndpbmQgeworZW50cnk6CisgICUwID0gYWRkIG5zdyBpMzIgJXksICV6ICAgICAgICAgICAgICAgICAgICAgICAgIAorICAlMSA9IG11bCBpMzIgJTAsICV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgJTIgPSBtdWwgaTMyICV5LCAleiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICUzID0gYWRkIG5zdyBpMzIgJTEsICUyICAgICAgICAgICAgICAgICAgICAgICAgIAorICByZXQgaTMyICUzCit9CisKK2RlZmluZSBpMzIgQHRlc3QyKCkgbm91bndpbmQgeworZW50cnk6CisgICUwID0gY2FsbCBpMzIgQHRlc3QoaTMyIDEsIGkzMiAyLCBpMzIgNCkgbm91bndpbmQKKyAgcmV0IGkzMiAlMAorfQorCitJdCB3b3VsZCBiZSBpbnRlcmVzdGluZyBleHRlbmQgSVBTQ0NQIHRvIGJlIGFibGUgdG8gaGFuZGxlIHNpbXBsZSBjYXNlcyBsaWtlCit0aGlzLCB3aGVyZSBhbGwgb2YgdGhlIGFyZ3VtZW50cyB0byBhIGNhbGwgYXJlIGNvbnN0YW50LiAgQmVjYXVzZSBJUFNDQ1AgcnVucworYmVmb3JlIGlubGluaW5nLCB0cml2aWFsIHRlbXBsYXRlcyBhbmQgaW5saW5lIGZ1bmN0aW9ucyBhcmUgbm90IHlldCBpbmxpbmVkLgorVGhlIHJlc3VsdHMgZm9yIGEgZnVuY3Rpb24gKyBzZXQgb2YgY29uc3RhbnQgYXJndW1lbnRzIHNob3VsZCBiZSBtZW1vaXplZCBpbiBhCittYXAuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlIGxpYmNhbGwgY29uc3RhbnQgZm9sZGluZyBzdHVmZiBzaG91bGQgYmUgbW92ZWQgb3V0IG9mIFNpbXBsaWZ5TGliY2FsbHMgaW50bworbGliYW5hbHlzaXMnIGNvbnN0YW50Zm9sZGluZyBsb2dpYy4gIFRoaXMgd291bGQgYWxsb3cgSVBTQ0NQIHRvIGJlIGFibGUgdG8KK2hhbmRsZSBzaW1wbGUgdGhpbmdzIGxpa2UgdGhpczoKKworc3RhdGljIGludCBmb28oY29uc3QgY2hhciAqWCkgeyByZXR1cm4gc3RybGVuKFgpOyB9CitpbnQgYmFyKCkgeyByZXR1cm4gZm9vKCJhYmNkIik7IH0KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbnN0Q29tYmluZSBzaG91bGQgdXNlIFNpbXBsaWZ5RGVtYW5kZWRCaXRzIHRvIHJlbW92ZSB0aGUgb3IgaW5zdHJ1Y3Rpb246CisKK2RlZmluZSBpMSBAdGVzdChpOCAleCwgaTggJXkpIHsKKyAgJUEgPSBvciBpOCAleCwgMQorICAlQiA9IGljbXAgdWd0IGk4ICVBLCAzCisgIHJldCBpMSAlQgorfQorCitDdXJyZW50bHkgaW5zdGNvbWJpbmUgY2FsbHMgU2ltcGxpZnlEZW1hbmRlZEJpdHMgd2l0aCBlaXRoZXIgYWxsIGJpdHMgb3IganVzdAordGhlIHNpZ24gYml0LCBpZiB0aGUgY29tcGFyaXNvbiBpcyBvYnZpb3VzbHkgYSBzaWduIHRlc3QuIEluIHRoaXMgY2FzZSwgd2Ugb25seQorbmVlZCBhbGwgYnV0IHRoZSBib3R0b20gdHdvIGJpdHMgZnJvbSAlQSwgYW5kIGlmIHdlIGdhdmUgdGhhdCBtYXNrIHRvIFNEQiBpdAord291bGQgZGVsZXRlIHRoZSBvciBpbnN0cnVjdGlvbiBmb3IgdXMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZnVuY3Rpb25hdHRycyBkb2Vzbid0IGtub3cgbXVjaCBhYm91dCBtZW1jcHkvbWVtc2V0LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUKK21hcmtlZCByZWFkbm9uZSByYXRoZXIgdGhhbiByZWFkb25seSwgc2luY2UgaXQgb25seSB0d2lkZGxlcyBsb2NhbCBtZW1vcnksIGJ1dAorZnVuY3Rpb25hdHRycyBkb2Vzbid0IGhhbmRsZSBtZW1zZXQvbWVtY3B5L21lbW1vdmUgYWdncmVzc2l2ZWx5OgorCitzdHJ1Y3QgWCB7IGludCAqcDsgaW50ICpxOyB9OworaW50IGZvbygpIHsKKyBpbnQgaSA9IDAsIGogPSAxOworIHN0cnVjdCBYIHgsIHk7CisgaW50ICoqcDsKKyB5LnAgPSAmaTsKKyB4LnEgPSAmajsKKyBwID0gX19idWlsdGluX21lbWNweSAoJngsICZ5LCBzaXplb2YgKGludCAqKSk7CisgcmV0dXJuICoqcDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNaXNzZWQgaW5zdGNvbWJpbmUgdHJhbnNmb3JtYXRpb246CitkZWZpbmUgaTEgQGEoaTMyICV4KSBub3Vud2luZCByZWFkbm9uZSB7CitlbnRyeToKKyAgJWNtcCA9IGljbXAgZXEgaTMyICV4LCAzMAorICAlc3ViID0gYWRkIGkzMiAleCwgLTMwCisgICVjbXAyID0gaWNtcCB1Z3QgaTMyICVzdWIsIDkKKyAgJW9yID0gb3IgaTEgJWNtcCwgJWNtcDIKKyAgcmV0IGkxICVvcgorfQorVGhpcyBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGEgc2luZ2xlIGNvbXBhcmUuICBUZXN0Y2FzZSBkZXJpdmVkIGZyb20gZ2NjLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK01pc3NlZCBpbnN0Y29tYmluZSB0cmFuc2Zvcm1hdGlvbjoKK3ZvaWQgYigpOwordm9pZCBhKGludCB4KSB7IGlmICgoKDE8PHgpJjgpPT0wKSBiKCk7IH0KKworVGhlIHNoaWZ0IHNob3VsZCBiZSBvcHRpbWl6ZWQgb3V0LiAgVGVzdGNhc2UgZGVyaXZlZCBmcm9tIGdjYy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNaXNzZWQgaW5zdGNvbWJpbmUgb3IgcmVhc3NvY2lhdGUgdHJhbnNmb3JtYXRpb246CitpbnQgYShpbnQgYSwgaW50IGIpIHsgcmV0dXJuIChhPT0xMikmKGI+NDcpJihiPDU4KTsgfQorCitUaGUgc2d0IGFuZCBzbHQgc2hvdWxkIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgY29tcGFyaXNvbi4gVGVzdGNhc2UgZGVyaXZlZAorZnJvbSBnY2MuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworTWlzc2VkIGluc3Rjb21iaW5lIHRyYW5zZm9ybWF0aW9uOgorZGVmaW5lIGkzMiBAYShpMzIgJXgpIG5vdW53aW5kIHJlYWRub25lIHsKK2VudHJ5OgorICAlcmVtID0gc3JlbSBpMzIgJXgsIDMyCisgICVzaGwgPSBzaGwgaTMyIDEsICVyZW0KKyAgcmV0IGkzMiAlc2hsCit9CisKK1RoZSBzcmVtIGNhbiBiZSB0cmFuc2Zvcm1lZCB0byBhbiBhbmQgYmVjYXVzZSBpZiB4IGlzIG5lZ2F0aXZlLCB0aGUgc2hpZnQgaXMKK3VuZGVmaW5lZC4gVGVzdGNhc2UgZGVyaXZlZCBmcm9tIGdjYy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNaXNzZWQgaW5zdGNvbWJpbmUvZGFnY29tYmluZSB0cmFuc2Zvcm1hdGlvbjoKK2RlZmluZSBpMzIgQGEoaTMyICV4LCBpMzIgJXkpIG5vdW53aW5kIHJlYWRub25lIHsKK2VudHJ5OgorICAlbXVsID0gbXVsIGkzMiAleSwgLTgKKyAgJXN1YiA9IHN1YiBpMzIgJXgsICVtdWwKKyAgcmV0IGkzMiAlc3ViCit9CisKK1Nob3VsZCBjb21waWxlIHRvIHNvbWV0aGluZyBsaWtlIHgreSo4LCBidXQgY3VycmVudGx5IGNvbXBpbGVzIHRvIGFuCitpbmVmZmljaWVudCByZXN1bHQuICBUZXN0Y2FzZSBkZXJpdmVkIGZyb20gZ2NjLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK01pc3NlZCBpbnN0Y29tYmluZS9kYWdjb21iaW5lIHRyYW5zZm9ybWF0aW9uOgorZGVmaW5lIHZvaWQgQGxzaGlmdF9sdChpOCB6ZXJvZXh0ICVhKSBub3Vud2luZCB7CitlbnRyeToKKyAgJWNvbnYgPSB6ZXh0IGk4ICVhIHRvIGkzMgorICAlc2hsID0gc2hsIGkzMiAlY29udiwgMworICAlY21wID0gaWNtcCB1bHQgaTMyICVzaGwsIDMzCisgIGJyIGkxICVjbXAsIGxhYmVsICVpZi50aGVuLCBsYWJlbCAlaWYuZW5kCisKK2lmLnRoZW46CisgIHRhaWwgY2FsbCB2b2lkIEBiYXIoKSBub3Vud2luZAorICByZXQgdm9pZAorCitpZi5lbmQ6CisgIHJldCB2b2lkCit9CitkZWNsYXJlIHZvaWQgQGJhcigpIG5vdW53aW5kCisKK1RoZSBzaGlmdCBzaG91bGQgYmUgZWxpbWluYXRlZC4gIFRlc3RjYXNlIGRlcml2ZWQgZnJvbSBnY2MuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlc2UgY29tcGlsZSBpbnRvIGRpZmZlcmVudCBjb2RlLCBvbmUgZ2V0cyByZWNvZ25pemVkIGFzIGEgc3dpdGNoIGFuZCB0aGUKK290aGVyIGRvZXNuJ3QgZHVlIHRvIHBoYXNlIG9yZGVyaW5nIGlzc3VlcyAoUFI2MjEyKToKKworaW50IHRlc3QxKGludCBtYWluVHlwZSwgaW50IHN1YlR5cGUpIHsKKyAgaWYgKG1haW5UeXBlID09IDcpCisgICAgc3ViVHlwZSA9IDQ7CisgIGVsc2UgaWYgKG1haW5UeXBlID09IDkpCisgICAgc3ViVHlwZSA9IDY7CisgIGVsc2UgaWYgKG1haW5UeXBlID09IDExKQorICAgIHN1YlR5cGUgPSA5OworICByZXR1cm4gc3ViVHlwZTsKK30KKworaW50IHRlc3QyKGludCBtYWluVHlwZSwgaW50IHN1YlR5cGUpIHsKKyAgaWYgKG1haW5UeXBlID09IDcpCisgICAgc3ViVHlwZSA9IDQ7CisgIGlmIChtYWluVHlwZSA9PSA5KQorICAgIHN1YlR5cGUgPSA2OworICBpZiAobWFpblR5cGUgPT0gMTEpCisgICAgc3ViVHlwZSA9IDk7CisgIHJldHVybiBzdWJUeXBlOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZSBmb2xsb3dpbmcgdGVzdCBjYXNlIChmcm9tIFBSNjU3Nik6CisKK2RlZmluZSBpMzIgQG11bChpMzIgJWEsIGkzMiAlYikgbm91bndpbmQgcmVhZG5vbmUgeworZW50cnk6CisgJWNvbmQxID0gaWNtcCBlcSBpMzIgJWIsIDAgICAgICAgICAgICAgICAgICAgICAgOyA8aTE+IFsjdXNlcz0xXQorIGJyIGkxICVjb25kMSwgbGFiZWwgJWV4aXQsIGxhYmVsICViYi5ucGgKK2JiLm5waDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwcmVkcyA9ICVlbnRyeQorICV0bXAgPSBtdWwgaTMyICViLCAlYSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgPGkzMj4gWyN1c2VzPTFdCisgcmV0IGkzMiAldG1wCitleGl0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcHJlZHMgPSAlZW50cnkKKyByZXQgaTMyIDAKK30KKworY291bGQgYmUgcmVkdWNlZCB0bzoKKworZGVmaW5lIGkzMiBAbXVsKGkzMiAlYSwgaTMyICViKSBub3Vud2luZCByZWFkbm9uZSB7CitlbnRyeToKKyAldG1wID0gbXVsIGkzMiAlYiwgJWEKKyByZXQgaTMyICV0bXAKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBzaG91bGQgdXNlIERTRSArIGxsdm0ubGlmZXRpbWUuZW5kIHRvIGRlbGV0ZSBkZWFkIHZ0YWJsZSBwb2ludGVyIHVwZGF0ZXMuCitTZWUgR0NDIFBSMzQ5NDkKKworQW5vdGhlciBpbnRlcmVzdGluZyBjYXNlIGlzIHRoYXQgc29tZXRoaW5nIHJlbGF0ZWQgY291bGQgYmUgdXNlZCBmb3IgdmFyaWFibGVzCit0aGF0IGdvIGNvbnN0IGFmdGVyIHRoZWlyIGN0b3IgaGFzIGZpbmlzaGVkLiAgSW4gdGhlc2UgY2FzZXMsIGdsb2JhbG9wdCAod2hpY2gKK2NhbiBzdGF0aWNhbGx5IHJ1biB0aGUgY29uc3RydWN0b3IpIGNvdWxkIG1hcmsgdGhlIGdsb2JhbCBjb25zdCAoc28gaXQgZ2V0cyBwdXQKK2luIHRoZSByZWFkb25seSBzZWN0aW9uKS4gIEEgdGVzdGNhc2Ugd291bGQgYmU6CisKKyNpbmNsdWRlIDxjb21wbGV4PgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK2NvbnN0IGNvbXBsZXg8Y2hhcj4gc2hvdWxkX2JlX2luX3JvZGF0YSAoNDIsLTQyKTsKK2NvbXBsZXg8Y2hhcj4gc2hvdWxkX2JlX2luX2RhdGEgKDQyLC00Mik7Citjb21wbGV4PGNoYXI+IHNob3VsZF9iZV9pbl9ic3M7CisKK1doZXJlIHdlIGN1cnJlbnRseSBldmFsdWF0ZSB0aGUgY3RvcnMgYnV0IHRoZSBnbG9iYWxzIGRvbid0IGJlY29tZSBjb25zdCBiZWNhdXNlCit0aGUgb3B0aW1pemVyIGRvZXNuJ3Qga25vdyB0aGV5ICJiZWNvbWUgY29uc3QiIGFmdGVyIHRoZSBjdG9yIGlzIGRvbmUuICBTZWUKK0dDQyBQUjQxMzEgZm9yIG1vcmUgZXhhbXBsZXMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSW4gdGhpcyBjb2RlOgorCitsb25nIGZvbyhsb25nIHgpIHsKKyAgcmV0dXJuIHggPiAxID8geCA6IDE7Cit9CisKK0xMVk0gZW1pdHMgYSBjb21wYXJpc29uIHdpdGggMSBpbnN0ZWFkIG9mIDAuIDAgd291bGQgYmUgZXF1aXZhbGVudAorYW5kIGNoZWFwZXIgb24gbW9zdCB0YXJnZXRzLgorCitMTFZNIHByZWZlcnMgY29tcGFyaXNvbnMgd2l0aCB6ZXJvIG92ZXIgbm9uLXplcm8gaW4gZ2VuZXJhbCwgYnV0IGluIHRoaXMKK2Nhc2UgaXQgY2hvc2VzIGluc3RlYWQgdG8ga2VlcCB0aGUgbWF4IG9wZXJhdGlvbiBvYnZpb3VzLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1Rha2UgdGhlIGZvbGxvd2luZyB0ZXN0Y2FzZSBvbiB4ODYtNjQgKHNpbWlsYXIgdGVzdGNhc2VzIGV4aXN0IGZvciBhbGwgdGFyZ2V0cword2l0aCBhZGRjL2FkZGUpOgorCitkZWZpbmUgdm9pZCBAYShpNjQqIG5vY2FwdHVyZSAlcywgaTY0KiBub2NhcHR1cmUgJXQsIGk2NCAlYSwgaTY0ICViLAoraTY0ICVjKSBub3Vud2luZCB7CitlbnRyeToKKyAlMCA9IHpleHQgaTY0ICVhIHRvIGkxMjggICAgICAgICAgICAgICAgICAgICAgICA7IDxpMTI4PiBbI3VzZXM9MV0KKyAlMSA9IHpleHQgaTY0ICViIHRvIGkxMjggICAgICAgICAgICAgICAgICAgICAgICA7IDxpMTI4PiBbI3VzZXM9MV0KKyAlMiA9IGFkZCBpMTI4ICUxLCAlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMTI4PiBbI3VzZXM9Ml0KKyAlMyA9IHpleHQgaTY0ICVjIHRvIGkxMjggICAgICAgICAgICAgICAgICAgICAgICA7IDxpMTI4PiBbI3VzZXM9MV0KKyAlNCA9IHNobCBpMTI4ICUzLCA2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMTI4PiBbI3VzZXM9MV0KKyAlNSA9IGFkZCBpMTI4ICU0LCAlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMTI4PiBbI3VzZXM9MV0KKyAlNiA9IGxzaHIgaTEyOCAlNSwgNjQgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDxpMTI4PiBbI3VzZXM9MV0KKyAlNyA9IHRydW5jIGkxMjggJTYgdG8gaTY0ICAgICAgICAgICAgICAgICAgICAgICA7IDxpNjQ+IFsjdXNlcz0xXQorIHN0b3JlIGk2NCAlNywgaTY0KiAlcywgYWxpZ24gOAorICU4ID0gdHJ1bmMgaTEyOCAlMiB0byBpNjQgICAgICAgICAgICAgICAgICAgICAgIDsgPGk2ND4gWyN1c2VzPTFdCisgc3RvcmUgaTY0ICU4LCBpNjQqICV0LCBhbGlnbiA4CisgcmV0IHZvaWQKK30KKworR2VuZXJhdGVkIGNvZGU6CisgICAgICAgYWRkcSAgICAlcmN4LCAlcmR4CisgICAgICAgbW92bCAgICAkMCwgJWVheAorICAgICAgIGFkY3EgICAgJDAsICVyYXgKKyAgICAgICBhZGRxICAgICVyOCwgJXJheAorICAgICAgIG1vdnEgICAgJXJheCwgKCVyZGkpCisgICAgICAgbW92cSAgICAlcmR4LCAoJXJzaSkKKyAgICAgICByZXQKKworRXhwZWN0ZWQgY29kZToKKyAgICAgICBhZGRxICAgICVyY3gsICVyZHgKKyAgICAgICBhZGNxICAgICQwLCAlcjgKKyAgICAgICBtb3ZxICAgICVyOCwgKCVyZGkpCisgICAgICAgbW92cSAgICAlcmR4LCAoJXJzaSkKKyAgICAgICByZXQKKworVGhlIGdlbmVyYXRlZCBTZWxlY3Rpb25EQUcgaGFzIGFuIEFERCBvZiBhbiBBRERFLCB3aGVyZSBib3RoIG9wZXJhbmRzIG9mIHRoZQorQURERSBhcmUgemVyby4gUmVwbGFjaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIEFEREUgd2l0aCB0aGUgb3RoZXIgb3BlcmFuZAorb2YgdGhlIEFERCwgYW5kIHJlcGxhY2luZyB0aGUgQUREIHdpdGggdGhlIEFEREUsIHNob3VsZCBnaXZlIHRoZSBkZXNpcmVkIHJlc3VsdC4KKworKFRoYXQgc2FpZCwgd2UgYXJlIGRvaW5nIGEgbG90IGJldHRlciB0aGFuIGdjYyBvbiB0aGlzIHRlc3RjYXNlLiA6KSApCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworU3dpdGNoIGxvd2VyaW5nIGdlbmVyYXRlcyBsZXNzIHRoYW4gaWRlYWwgY29kZSBmb3IgdGhlIGZvbGxvd2luZyBzd2l0Y2g6CitkZWZpbmUgdm9pZCBAYShpMzIgJXgpIG5vdW53aW5kIHsKK2VudHJ5OgorICBzd2l0Y2ggaTMyICV4LCBsYWJlbCAlaWYuZW5kIFsKKyAgICBpMzIgMCwgbGFiZWwgJWlmLnRoZW4KKyAgICBpMzIgMSwgbGFiZWwgJWlmLnRoZW4KKyAgICBpMzIgMiwgbGFiZWwgJWlmLnRoZW4KKyAgICBpMzIgMywgbGFiZWwgJWlmLnRoZW4KKyAgICBpMzIgNSwgbGFiZWwgJWlmLnRoZW4KKyAgXQoraWYudGhlbjoKKyAgdGFpbCBjYWxsIHZvaWQgQGZvbygpIG5vdW53aW5kCisgIHJldCB2b2lkCitpZi5lbmQ6CisgIHJldCB2b2lkCit9CitkZWNsYXJlIHZvaWQgQGZvbygpCisKK0dlbmVyYXRlZCBjb2RlIG9uIHg4Ni02NCAob3RoZXIgcGxhdGZvcm1zIGdpdmUgc2ltaWxhciByZXN1bHRzKToKK2E6CisJY21wbAkkNSwgJWVkaQorCWphCS5MQkIwXzIKKwltb3ZsCSVlZGksICVlYXgKKwltb3ZsCSQ0NywgJWVjeAorCWJ0cQklcmF4LCAlcmN4CisJamIJLkxCQjBfMworLkxCQjBfMjoKKwlyZXQKKy5MQkIwXzM6CisJam1wCWZvbyAgIyBUQUlMQ0FMTAorCitUaGUgbW92bCttb3ZsK2J0cStqYiBjb3VsZCBiZSBzaW1wbGlmaWVkIHRvIGEgY21wbCtqbmUuCisKK09yLCBpZiB3ZSB3YW50ZWQgdG8gYmUgcmVhbGx5IGNsZXZlciwgd2UgY291bGQgc2ltcGxpZnkgdGhlIHdob2xlIHRoaW5nIHRvCitzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nLCB3aGljaCBlbGltaW5hdGVzIGEgYnJhbmNoOgorCXhvcmwgICAgJDEsICVlZGkKKwljbXBsCSQ0LCAlZWRpCisJamEJLkxCQjBfMgorCXJldAorLkxCQjBfMjoKKwlqbXAJZm9vICAjIFRBSUxDQUxMCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitHaXZlbiBhIGJyYW5jaCB3aGVyZSB0aGUgdHdvIHRhcmdldCBibG9ja3MgYXJlIGlkZW50aWNhbCAoInJldCBpMzIgJWIiIGluCitib3RoKSwgc2ltcGxpZnljZmcgd2lsbCBzaW1wbGlmeSB0aGVtIGF3YXkuIEJ1dCBub3Qgc28gZm9yIGEgc3dpdGNoIHN0YXRlbWVudDoKKworZGVmaW5lIGkzMiBAZihpMzIgJWEsIGkzMiAlYikgbm91bndpbmQgcmVhZG5vbmUgeworZW50cnk6CisgICAgICAgIHN3aXRjaCBpMzIgJWEsIGxhYmVsICViYjMgWworICAgICAgICAgICAgICAgIGkzMiA0LCBsYWJlbCAlYmIKKyAgICAgICAgICAgICAgICBpMzIgNiwgbGFiZWwgJWJiCisgICAgICAgIF0KKworYmI6ICAgICAgICAgICAgIDsgcHJlZHMgPSAlZW50cnksICVlbnRyeQorICAgICAgICByZXQgaTMyICViCisKK2JiMzogICAgICAgICAgICA7IHByZWRzID0gJWVudHJ5CisgICAgICAgIHJldCBpMzIgJWIKK30KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTYyOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9Bc21QcmludGVyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTVNwYXJjQXNtUHJpbnRlcgorICBTcGFyY0FzbVByaW50ZXIuY3BwCisgICkKK2FkZF9kZXBlbmRlbmNpZXMoTExWTVNwYXJjQXNtUHJpbnRlciBTcGFyY0NvZGVHZW5UYWJsZV9nZW4pCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL0FzbVByaW50ZXIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL0FzbVByaW50ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0NzUzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvQXNtUHJpbnRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RhcmdldC9TcGFyYy9Bc21QcmludGVyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNU3BhcmNBc21QcmludGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBTcGFyYyB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFAuRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvQXNtUHJpbnRlci9TcGFyY0FzbVByaW50ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9Bc21QcmludGVyL1NwYXJjQXNtUHJpbnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5NDhiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvQXNtUHJpbnRlci9TcGFyY0FzbVByaW50ZXIuY3BwCkBAIC0wLDAgKzEsMjQ5IEBACisvLz09PS0tIFNwYXJjQXNtUHJpbnRlci5jcHAgLSBTcGFyYyBMTFZNIGFzc2VtYmx5IHdyaXRlciAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHByaW50ZXIgdGhhdCBjb252ZXJ0cyBmcm9tIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorLy8gb2YgbWFjaGluZS1kZXBlbmRlbnQgTExWTSBjb2RlIHRvIEdBUy1mb3JtYXQgU1BBUkMgYXNzZW1ibHkgbGFuZ3VhZ2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJhc20tcHJpbnRlciIKKyNpbmNsdWRlICJTcGFyYy5oIgorI2luY2x1ZGUgIlNwYXJjSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiU3BhcmNUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3RyZWFtZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBjbGFzcyBTcGFyY0FzbVByaW50ZXIgOiBwdWJsaWMgQXNtUHJpbnRlciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTcGFyY0FzbVByaW50ZXIoVGFyZ2V0TWFjaGluZSAmVE0sIE1DU3RyZWFtZXIgJlN0cmVhbWVyKQorICAgICAgOiBBc21QcmludGVyKFRNLCBTdHJlYW1lcikge30KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIlNwYXJjIEFzc2VtYmx5IFByaW50ZXIiOworICAgIH0KKworICAgIHZvaWQgcHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwgcmF3X29zdHJlYW0gJk9TKTsKKyAgICB2b2lkIHByaW50TWVtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllciA9IDApOworICAgIHZvaWQgcHJpbnRDQ09wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLCByYXdfb3N0cmVhbSAmT1MpOworCisgICAgdmlydHVhbCB2b2lkIEVtaXRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgICBTbWFsbFN0cmluZzwxMjg+IFN0cjsKKyAgICAgIHJhd19zdmVjdG9yX29zdHJlYW0gT1MoU3RyKTsKKyAgICAgIHByaW50SW5zdHJ1Y3Rpb24oTUksIE9TKTsKKyAgICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KE9TLnN0cigpKTsKKyAgICB9CisgICAgdm9pZCBwcmludEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHJhd19vc3RyZWFtICZPUyk7Ly8gYXV0b2dlbidkLgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRSZWdpc3Rlck5hbWUodW5zaWduZWQgUmVnTm8pOworCisgICAgYm9vbCBQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworICAgIGJvb2wgUHJpbnRBc21NZW1vcnlPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXNtVmFyaWFudCwgY29uc3QgY2hhciAqRXh0cmFDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKTsKKworICAgIGJvb2wgcHJpbnRHZXRQQ1goY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk9TKTsKKyAgICAKKyAgICB2aXJ0dWFsIGJvb2wgaXNCbG9ja09ubHlSZWFjaGFibGVCeUZhbGx0aHJvdWdoKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0OworICB9OworfSAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisjaW5jbHVkZSAiU3BhcmNHZW5Bc21Xcml0ZXIuaW5jIgorCit2b2lkIFNwYXJjQXNtUHJpbnRlcjo6cHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQgKG9wTnVtKTsKKyAgYm9vbCBDbG9zZVBhcmVuID0gZmFsc2U7CisgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gU1A6OlNFVEhJaSAmJiAhTU8uaXNSZWcoKSAmJiAhTU8uaXNJbW0oKSkgeworICAgIE8gPDwgIiVoaSgiOworICAgIENsb3NlUGFyZW4gPSB0cnVlOworICB9IGVsc2UgaWYgKChNSS0+Z2V0T3Bjb2RlKCkgPT0gU1A6Ok9ScmkgfHwgTUktPmdldE9wY29kZSgpID09IFNQOjpBRERyaSkgJiYKKyAgICAgICAgICAgICAhTU8uaXNSZWcoKSAmJiAhTU8uaXNJbW0oKSkgeworICAgIE8gPDwgIiVsbygiOworICAgIENsb3NlUGFyZW4gPSB0cnVlOworICB9CisgIHN3aXRjaCAoTU8uZ2V0VHlwZSgpKSB7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyOgorICAgIE8gPDwgIiUiIDw8IExvd2VyY2FzZVN0cmluZyhnZXRSZWdpc3Rlck5hbWUoTU8uZ2V0UmVnKCkpKTsKKyAgICBicmVhazsKKworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgTyA8PCAoaW50KU1PLmdldEltbSgpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19NYWNoaW5lQmFzaWNCbG9jazoKKyAgICBPIDw8ICpNTy5nZXRNQkIoKS0+Z2V0U3ltYm9sKCk7CisgICAgcmV0dXJuOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOgorICAgIE8gPDwgKk1hbmctPmdldFN5bWJvbChNTy5nZXRHbG9iYWwoKSk7CisgICAgYnJlYWs7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOgorICAgIE8gPDwgTU8uZ2V0U3ltYm9sTmFtZSgpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19Db25zdGFudFBvb2xJbmRleDoKKyAgICBPIDw8IE1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJDUEkiIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkgPDwgIl8iCisgICAgICA8PCBNTy5nZXRJbmRleCgpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIjx1bmtub3duIG9wZXJhbmQgdHlwZT4iKTsKKyAgfQorICBpZiAoQ2xvc2VQYXJlbikgTyA8PCAiKSI7Cit9CisKK3ZvaWQgU3BhcmNBc21QcmludGVyOjpwcmludE1lbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywgY29uc3QgY2hhciAqTW9kaWZpZXIpIHsKKyAgcHJpbnRPcGVyYW5kKE1JLCBvcE51bSwgTyk7CisKKyAgLy8gSWYgdGhpcyBpcyBhbiBBREQgb3BlcmFuZCwgZW1pdCBpdCBsaWtlIG5vcm1hbCBvcGVyYW5kcy4KKyAgaWYgKE1vZGlmaWVyICYmICFzdHJjbXAoTW9kaWZpZXIsICJhcml0aCIpKSB7CisgICAgTyA8PCAiLCAiOworICAgIHByaW50T3BlcmFuZChNSSwgb3BOdW0rMSwgTyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKE1JLT5nZXRPcGVyYW5kKG9wTnVtKzEpLmlzUmVnKCkgJiYKKyAgICAgIE1JLT5nZXRPcGVyYW5kKG9wTnVtKzEpLmdldFJlZygpID09IFNQOjpHMCkKKyAgICByZXR1cm47ICAgLy8gZG9uJ3QgcHJpbnQgIislZzAiCisgIGlmIChNSS0+Z2V0T3BlcmFuZChvcE51bSsxKS5pc0ltbSgpICYmCisgICAgICBNSS0+Z2V0T3BlcmFuZChvcE51bSsxKS5nZXRJbW0oKSA9PSAwKQorICAgIHJldHVybjsgICAvLyBkb24ndCBwcmludCAiKzAiCisKKyAgTyA8PCAiKyI7CisgIGlmIChNSS0+Z2V0T3BlcmFuZChvcE51bSsxKS5pc0dsb2JhbCgpIHx8CisgICAgICBNSS0+Z2V0T3BlcmFuZChvcE51bSsxKS5pc0NQSSgpKSB7CisgICAgTyA8PCAiJWxvKCI7CisgICAgcHJpbnRPcGVyYW5kKE1JLCBvcE51bSsxLCBPKTsKKyAgICBPIDw8ICIpIjsKKyAgfSBlbHNlIHsKKyAgICBwcmludE9wZXJhbmQoTUksIG9wTnVtKzEsIE8pOworICB9Cit9CisKK2Jvb2wgU3BhcmNBc21QcmludGVyOjpwcmludEdldFBDWChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBvcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBzdGQ6OnN0cmluZyBvcGVyYW5kID0gIiI7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKG9wTnVtKTsKKyAgc3dpdGNoIChNTy5nZXRUeXBlKCkpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIk9wZXJhbmQgaXMgbm90IGEgcmVnaXN0ZXIgIik7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyOgorICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihNTy5nZXRSZWcoKSkgJiYKKyAgICAgICAgICAgIk9wZXJhbmQgaXMgbm90IGEgcGh5c2ljYWwgcmVnaXN0ZXIgIik7CisgICAgb3BlcmFuZCA9ICIlIiArIExvd2VyY2FzZVN0cmluZyhnZXRSZWdpc3Rlck5hbWUoTU8uZ2V0UmVnKCkpKTsKKyAgICBicmVhazsKKyAgfQorCisgIHVuc2lnbmVkIG1mTnVtID0gTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0RnVuY3Rpb25OdW1iZXIoKTsKKyAgdW5zaWduZWQgYmJOdW0gPSBNSS0+Z2V0UGFyZW50KCktPmdldE51bWJlcigpOworCisgIE8gPDwgJ1xuJyA8PCAiLkxMR0VUUENIIiA8PCBtZk51bSA8PCAnXycgPDwgYmJOdW0gPDwgIjpcbiI7CisgIE8gPDwgIlx0Y2FsbFx0LkxMR0VUUEMiIDw8IG1mTnVtIDw8ICdfJyA8PCBiYk51bSA8PCAnXG4nIDsKKworICBPIDw8ICJcdCAgc2V0aGlcdCIKKyAgICA8PCAiJWhpKF9HTE9CQUxfT0ZGU0VUX1RBQkxFXysoLi0uTExHRVRQQ0giIDw8IG1mTnVtIDw8ICdfJyA8PCBiYk51bSA8PCAiKSksICIgIAorICAgIDw8IG9wZXJhbmQgPDwgJ1xuJyA7CisKKyAgTyA8PCAiLkxMR0VUUEMiIDw8IG1mTnVtIDw8ICdfJyA8PCBiYk51bSA8PCAiOlxuIiA7CisgIE8gPDwgIlx0b3JcdCIgPDwgb3BlcmFuZCAgCisgICAgPDwgIiwgJWxvKF9HTE9CQUxfT0ZGU0VUX1RBQkxFXysoLi0uTExHRVRQQ0giIDw8IG1mTnVtIDw8ICdfJyA8PCBiYk51bQorICAgIDw8ICIpKSwgIiA8PCBvcGVyYW5kIDw8ICdcbic7CisgIE8gPDwgIlx0YWRkXHQiIDw8IG9wZXJhbmQgPDwgIiwgJW83LCAiIDw8IG9wZXJhbmQgPDwgJ1xuJzsgCisgIAorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTcGFyY0FzbVByaW50ZXI6OnByaW50Q0NPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBpbnQgQ0MgPSAoaW50KU1JLT5nZXRPcGVyYW5kKG9wTnVtKS5nZXRJbW0oKTsKKyAgTyA8PCBTUEFSQ0NvbmRDb2RlVG9TdHJpbmcoKFNQQ0M6OkNvbmRDb2RlcylDQyk7Cit9CisKKy8vLyBQcmludEFzbU9wZXJhbmQgLSBQcmludCBvdXQgYW4gb3BlcmFuZCBmb3IgYW4gaW5saW5lIGFzbSBleHByZXNzaW9uLgorLy8vCitib29sIFNwYXJjQXNtUHJpbnRlcjo6UHJpbnRBc21PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgaWYgKEV4dHJhQ29kZSAmJiBFeHRyYUNvZGVbMF0pIHsKKyAgICBpZiAoRXh0cmFDb2RlWzFdICE9IDApIHJldHVybiB0cnVlOyAvLyBVbmtub3duIG1vZGlmaWVyLgorCisgICAgc3dpdGNoIChFeHRyYUNvZGVbMF0pIHsKKyAgICBkZWZhdWx0OiByZXR1cm4gdHJ1ZTsgIC8vIFVua25vd24gbW9kaWZpZXIuCisgICAgY2FzZSAncic6CisgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHByaW50T3BlcmFuZChNSSwgT3BObywgTyk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNwYXJjQXNtUHJpbnRlcjo6UHJpbnRBc21NZW1vcnlPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wTm8sIHVuc2lnbmVkIEFzbVZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgaWYgKEV4dHJhQ29kZSAmJiBFeHRyYUNvZGVbMF0pCisgICAgcmV0dXJuIHRydWU7ICAvLyBVbmtub3duIG1vZGlmaWVyCisKKyAgTyA8PCAnWyc7CisgIHByaW50TWVtT3BlcmFuZChNSSwgT3BObywgTyk7CisgIE8gPDwgJ10nOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzQmxvY2tPbmx5UmVhY2hhYmxlQnlGYWxsdGhvdWdoIC0gUmV0dXJuIHRydWUgaWYgdGhlIGJhc2ljIGJsb2NrIGhhcworLy8vIGV4YWN0bHkgb25lIHByZWRlY2Vzc29yIGFuZCB0aGUgY29udHJvbCB0cmFuc2ZlciBtZWNoYW5pc20gYmV0d2VlbgorLy8vIHRoZSBwcmVkZWNlc3NvciBhbmQgdGhpcyBibG9jayBpcyBhIGZhbGwtdGhyb3VnaC4KKy8vLworLy8vIFRoaXMgb3ZlcnJpZGVzIEFzbVByaW50ZXIncyBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUgZGVsYXkgc2xvdHMuCitib29sIFNwYXJjQXNtUHJpbnRlcjo6Citpc0Jsb2NrT25seVJlYWNoYWJsZUJ5RmFsbHRocm91Z2goY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3QgeworICAvLyBJZiB0aGlzIGlzIGEgbGFuZGluZyBwYWQsIGl0IGlzbid0IGEgZmFsbCB0aHJvdWdoLiAgSWYgaXQgaGFzIG5vIHByZWRzLAorICAvLyB0aGVuIG5vdGhpbmcgZmFsbHMgdGhyb3VnaCB0byBpdC4KKyAgaWYgKE1CQi0+aXNMYW5kaW5nUGFkKCkgfHwgTUJCLT5wcmVkX2VtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gSWYgdGhlcmUgaXNuJ3QgZXhhY3RseSBvbmUgcHJlZGVjZXNzb3IsIGl0IGNhbid0IGJlIGEgZmFsbCB0aHJvdWdoLgorICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfcHJlZF9pdGVyYXRvciBQSSA9IE1CQi0+cHJlZF9iZWdpbigpLCBQSTIgPSBQSTsKKyAgKytQSTI7CisgIGlmIChQSTIgIT0gTUJCLT5wcmVkX2VuZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIFRoZSBwcmVkZWNlc3NvciBoYXMgdG8gYmUgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgYmxvY2suCisgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkID0gKlBJOworICAKKyAgaWYgKCFQcmVkLT5pc0xheW91dFN1Y2Nlc3NvcihNQkIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIENoZWNrIGlmIHRoZSBsYXN0IHRlcm1pbmF0b3IgaXMgYW4gdW5jb25kaXRpb25hbCBicmFuY2guCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBJID0gUHJlZC0+ZW5kKCk7CisgIHdoaWxlIChJICE9IFByZWQtPmJlZ2luKCkgJiYgISgtLUkpLT5nZXREZXNjKCkuaXNUZXJtaW5hdG9yKCkpCisgICAgOyAvLyBOb29wCisgIHJldHVybiBJID09IFByZWQtPmVuZCgpIHx8ICFJLT5nZXREZXNjKCkuaXNCYXJyaWVyKCk7Cit9CisKKworCisvLyBGb3JjZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVTcGFyY0FzbVByaW50ZXIoKSB7IAorICBSZWdpc3RlckFzbVByaW50ZXI8U3BhcmNBc21QcmludGVyPiBYKFRoZVNwYXJjVGFyZ2V0KTsKKyAgUmVnaXN0ZXJBc21QcmludGVyPFNwYXJjQXNtUHJpbnRlcj4gWShUaGVTcGFyY1Y5VGFyZ2V0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NGNhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjYgQEAKK3NldChMTFZNX1RBUkdFVF9ERUZJTklUSU9OUyBTcGFyYy50ZCkKKwordGFibGVnZW4oU3BhcmNHZW5SZWdpc3RlckluZm8uaC5pbmMgLWdlbi1yZWdpc3Rlci1kZXNjLWhlYWRlcikKK3RhYmxlZ2VuKFNwYXJjR2VuUmVnaXN0ZXJOYW1lcy5pbmMgLWdlbi1yZWdpc3Rlci1lbnVtcykKK3RhYmxlZ2VuKFNwYXJjR2VuUmVnaXN0ZXJJbmZvLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MpCit0YWJsZWdlbihTcGFyY0dlbkluc3RyTmFtZXMuaW5jIC1nZW4taW5zdHItZW51bXMpCit0YWJsZWdlbihTcGFyY0dlbkluc3RySW5mby5pbmMgLWdlbi1pbnN0ci1kZXNjKQordGFibGVnZW4oU3BhcmNHZW5Bc21Xcml0ZXIuaW5jIC1nZW4tYXNtLXdyaXRlcikKK3RhYmxlZ2VuKFNwYXJjR2VuREFHSVNlbC5pbmMgLWdlbi1kYWctaXNlbCkKK3RhYmxlZ2VuKFNwYXJjR2VuU3VidGFyZ2V0LmluYyAtZ2VuLXN1YnRhcmdldCkKK3RhYmxlZ2VuKFNwYXJjR2VuQ2FsbGluZ0NvbnYuaW5jIC1nZW4tY2FsbGluZ2NvbnYpCisKK2FkZF9sbHZtX3RhcmdldChTcGFyY0NvZGVHZW4KKyAgRGVsYXlTbG90RmlsbGVyLmNwcAorICBGUE1vdmVyLmNwcAorICBTcGFyY0luc3RySW5mby5jcHAKKyAgU3BhcmNJU2VsREFHVG9EQUcuY3BwCisgIFNwYXJjSVNlbExvd2VyaW5nLmNwcAorICBTcGFyY01DQXNtSW5mby5jcHAKKyAgU3BhcmNSZWdpc3RlckluZm8uY3BwCisgIFNwYXJjU3VidGFyZ2V0LmNwcAorICBTcGFyY1RhcmdldE1hY2hpbmUuY3BwCisgIFNwYXJjU2VsZWN0aW9uREFHSW5mby5jcHAKKyAgKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMgKExMVk1TcGFyY0NvZGVHZW4gTExWTVNlbGVjdGlvbkRBRykKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvRGVsYXlTbG90RmlsbGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvRGVsYXlTbG90RmlsbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWU1ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9EZWxheVNsb3RGaWxsZXIuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8vPT09LS0gRGVsYXlTbG90RmlsbGVyLmNwcCAtIFNQQVJDIGRlbGF5IHNsb3QgZmlsbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpcyBhIHNpbXBsZSBsb2NhbCBwYXNzIHRoYXQgZmlsbHMgZGVsYXkgc2xvdHMgd2l0aCBOT1BzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiZGVsYXlzbG90ZmlsbGVyIgorI2luY2x1ZGUgIlNwYXJjLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoRmlsbGVkU2xvdHMsICJOdW1iZXIgb2YgZGVsYXkgc2xvdHMgZmlsbGVkIik7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBGaWxsZXIgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgLy8vIFRhcmdldCBtYWNoaW5lIGRlc2NyaXB0aW9uIHdoaWNoIHdlIHF1ZXJ5IGZvciByZWcuIG5hbWVzLCBkYXRhCisgICAgLy8vIGxheW91dCwgZXRjLgorICAgIC8vLworICAgIFRhcmdldE1hY2hpbmUgJlRNOworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworCisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgRmlsbGVyKFRhcmdldE1hY2hpbmUgJnRtKSAKKyAgICAgIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCksIFRNKHRtKSwgVElJKHRtLmdldEluc3RySW5mbygpKSB7IH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIlNQQVJDIERlbGF5IFNsb3QgRmlsbGVyIjsKKyAgICB9CisKKyAgICBib29sIHJ1bk9uTWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisgICAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIHsKKyAgICAgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICAgICAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEZJID0gRi5iZWdpbigpLCBGRSA9IEYuZW5kKCk7CisgICAgICAgICAgIEZJICE9IEZFOyArK0ZJKQorICAgICAgICBDaGFuZ2VkIHw9IHJ1bk9uTWFjaGluZUJhc2ljQmxvY2soKkZJKTsKKyAgICAgIHJldHVybiBDaGFuZ2VkOworICAgIH0KKworICB9OworICBjaGFyIEZpbGxlcjo6SUQgPSAwOworfSAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLy8gY3JlYXRlU3BhcmNEZWxheVNsb3RGaWxsZXJQYXNzIC0gUmV0dXJucyBhIHBhc3MgdGhhdCBmaWxscyBpbiBkZWxheQorLy8vIHNsb3RzIGluIFNwYXJjIE1hY2hpbmVGdW5jdGlvbnMKKy8vLworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVTcGFyY0RlbGF5U2xvdEZpbGxlclBhc3MoVGFyZ2V0TWFjaGluZSAmdG0pIHsKKyAgcmV0dXJuIG5ldyBGaWxsZXIodG0pOworfQorCisvLy8gcnVuT25NYWNoaW5lQmFzaWNCbG9jayAtIEZpbGwgaW4gZGVsYXkgc2xvdHMgZm9yIHRoZSBnaXZlbiBiYXNpYyBibG9jay4KKy8vLyBDdXJyZW50bHksIHdlIGZpbGwgZGVsYXkgc2xvdHMgd2l0aCBOT1BzLiBXZSBhc3N1bWUgdGhlcmUgaXMgb25seSBvbmUKKy8vLyBkZWxheSBzbG90IHBlciBkZWxheWVkIGluc3RydWN0aW9uLgorLy8vCitib29sIEZpbGxlcjo6cnVuT25NYWNoaW5lQmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLmJlZ2luKCk7IEkgIT0gTUJCLmVuZCgpOyArK0kpCisgICAgaWYgKEktPmdldERlc2MoKS5oYXNEZWxheVNsb3QoKSkgeworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEogPSBJOworICAgICAgKytKOworICAgICAgQnVpbGRNSShNQkIsIEosIERlYnVnTG9jKCksIFRJSS0+Z2V0KFNQOjpOT1ApKTsKKyAgICAgICsrRmlsbGVkU2xvdHM7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgIHJldHVybiBDaGFuZ2VkOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9GUE1vdmVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvRlBNb3Zlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyM2IxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvRlBNb3Zlci5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8vPT09LS0gRlBNb3Zlci5jcHAgLSBTcGFyYyBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG1vdmUgZml4ZXIgLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRXhwYW5kIEZwTU9WRC9GcEFCU0QvRnBORUdEIGluc3RydWN0aW9ucyBpbnRvIHRoZWlyIHNpbmdsZS1wcmVjaXNpb24gcGllY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiZnBtb3ZlciIKKyNpbmNsdWRlICJTcGFyYy5oIgorI2luY2x1ZGUgIlNwYXJjU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1GcERzICwgIk51bWJlciBvZiBpbnN0cnVjdGlvbnMgdHJhbnNsYXRlZCIpOworU1RBVElTVElDKE5vb3BGcERzLCAiTnVtYmVyIG9mIG5vb3AgaW5zdHJ1Y3Rpb25zIHJlbW92ZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEZQTW92ZXIgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgICAgLy8vIFRhcmdldCBtYWNoaW5lIGRlc2NyaXB0aW9uIHdoaWNoIHdlIHF1ZXJ5IGZvciByZWcuIG5hbWVzLCBkYXRhCisgICAgLy8vIGxheW91dCwgZXRjLgorICAgIC8vLworICAgIFRhcmdldE1hY2hpbmUgJlRNOworICAgIAorICAgIHN0YXRpYyBjaGFyIElEOworICAgIGV4cGxpY2l0IEZQTW92ZXIoVGFyZ2V0TWFjaGluZSAmdG0pIAorICAgICAgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwgVE0odG0pIHsgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiU3BhcmMgRG91YmxlLUZQIE1vdmUgRml4ZXIiOworICAgIH0KKworICAgIGJvb2wgcnVuT25NYWNoaW5lQmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKyAgICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRik7CisgIH07CisgIGNoYXIgRlBNb3Zlcjo6SUQgPSAwOworfSAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLy8gY3JlYXRlU3BhcmNGUE1vdmVyUGFzcyAtIFJldHVybnMgYSBwYXNzIHRoYXQgdHVybnMgRnBNT1ZECisvLy8gaW5zdHJ1Y3Rpb25zIGludG8gRk1PVlMgaW5zdHJ1Y3Rpb25zCisvLy8KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlU3BhcmNGUE1vdmVyUGFzcyhUYXJnZXRNYWNoaW5lICZ0bSkgeworICByZXR1cm4gbmV3IEZQTW92ZXIodG0pOworfQorCisvLy8gZ2V0RG91YmxlUmVnUGFpciAtIEdpdmVuIGEgREZQIHJlZ2lzdGVyLCByZXR1cm4gdGhlIGV2ZW4gYW5kIG9kZCBGUAorLy8vIHJlZ2lzdGVycyB0aGF0IGNvcnJlc3BvbmQgdG8gaXQuCitzdGF0aWMgdm9pZCBnZXREb3VibGVSZWdQYWlyKHVuc2lnbmVkIERvdWJsZVJlZywgdW5zaWduZWQgJkV2ZW5SZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZPZGRSZWcpIHsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEV2ZW5IYWx2ZXNPZlBhaXJzW10gPSB7CisgICAgU1A6OkYwLCBTUDo6RjIsIFNQOjpGNCwgU1A6OkY2LCBTUDo6RjgsIFNQOjpGMTAsIFNQOjpGMTIsIFNQOjpGMTQsCisgICAgU1A6OkYxNiwgU1A6OkYxOCwgU1A6OkYyMCwgU1A6OkYyMiwgU1A6OkYyNCwgU1A6OkYyNiwgU1A6OkYyOCwgU1A6OkYzMAorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgT2RkSGFsdmVzT2ZQYWlyc1tdID0geworICAgIFNQOjpGMSwgU1A6OkYzLCBTUDo6RjUsIFNQOjpGNywgU1A6OkY5LCBTUDo6RjExLCBTUDo6RjEzLCBTUDo6RjE1LAorICAgIFNQOjpGMTcsIFNQOjpGMTksIFNQOjpGMjEsIFNQOjpGMjMsIFNQOjpGMjUsIFNQOjpGMjcsIFNQOjpGMjksIFNQOjpGMzEKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIERvdWJsZVJlZ3NJbk9yZGVyW10gPSB7CisgICAgU1A6OkQwLCBTUDo6RDEsIFNQOjpEMiwgU1A6OkQzLCBTUDo6RDQsIFNQOjpENSwgU1A6OkQ2LCBTUDo6RDcsIFNQOjpEOCwKKyAgICBTUDo6RDksIFNQOjpEMTAsIFNQOjpEMTEsIFNQOjpEMTIsIFNQOjpEMTMsIFNQOjpEMTQsIFNQOjpEMTUKKyAgfTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZihEb3VibGVSZWdzSW5PcmRlcikvc2l6ZW9mKHVuc2lnbmVkKTsgKytpKQorICAgIGlmIChEb3VibGVSZWdzSW5PcmRlcltpXSA9PSBEb3VibGVSZWcpIHsKKyAgICAgIEV2ZW5SZWcgPSBFdmVuSGFsdmVzT2ZQYWlyc1tpXTsKKyAgICAgIE9kZFJlZyA9IE9kZEhhbHZlc09mUGFpcnNbaV07CisgICAgICByZXR1cm47CisgICAgfQorICBsbHZtX3VucmVhY2hhYmxlKCJDYW4ndCBmaW5kIHJlZyIpOworfQorCisvLy8gcnVuT25NYWNoaW5lQmFzaWNCbG9jayAtIEZpeHVwIEZwTU9WRCBpbnN0cnVjdGlvbnMgaW4gdGhpcyBNQkIuCisvLy8KK2Jvb2wgRlBNb3Zlcjo6cnVuT25NYWNoaW5lQmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLmJlZ2luKCk7IEkgIT0gTUJCLmVuZCgpOyApIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gSSsrOworICAgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisgICAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBTUDo6RnBNT1ZEIHx8IE1JLT5nZXRPcGNvZGUoKSA9PSBTUDo6RnBBQlNEIHx8CisgICAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBTUDo6RnBORUdEKSB7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIHVuc2lnbmVkIERlc3REUmVnID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgICB1bnNpZ25lZCBTcmNEUmVnICA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgICAgaWYgKERlc3REUmVnID09IFNyY0RSZWcgJiYgTUktPmdldE9wY29kZSgpID09IFNQOjpGcE1PVkQpIHsKKyAgICAgICAgTUJCLmVyYXNlKE1JKTsgICAvLyBFbGltaW5hdGUgdGhlIG5vb3AgY29weS4KKyAgICAgICAgKytOb29wRnBEczsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIHVuc2lnbmVkIEV2ZW5TcmNSZWcgPSAwLCBPZGRTcmNSZWcgPSAwLCBFdmVuRGVzdFJlZyA9IDAsIE9kZERlc3RSZWcgPSAwOworICAgICAgZ2V0RG91YmxlUmVnUGFpcihEZXN0RFJlZywgRXZlbkRlc3RSZWcsIE9kZERlc3RSZWcpOworICAgICAgZ2V0RG91YmxlUmVnUGFpcihTcmNEUmVnLCBFdmVuU3JjUmVnLCBPZGRTcmNSZWcpOworCisgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IFRNLmdldEluc3RySW5mbygpOworICAgICAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBTUDo6RnBNT1ZEKQorICAgICAgICBNSS0+c2V0RGVzYyhUSUktPmdldChTUDo6Rk1PVlMpKTsKKyAgICAgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBTUDo6RnBORUdEKQorICAgICAgICBNSS0+c2V0RGVzYyhUSUktPmdldChTUDo6Rk5FR1MpKTsKKyAgICAgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBTUDo6RnBBQlNEKQorICAgICAgICBNSS0+c2V0RGVzYyhUSUktPmdldChTUDo6RkFCU1MpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBvcGNvZGUhIik7CisgICAgICAgIAorICAgICAgTUktPmdldE9wZXJhbmQoMCkuc2V0UmVnKEV2ZW5EZXN0UmVnKTsKKyAgICAgIE1JLT5nZXRPcGVyYW5kKDEpLnNldFJlZyhFdmVuU3JjUmVnKTsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiRlBNb3ZlcjogdGhlIG1vZGlmaWVkIGluc3RyIGlzOiAiIDw8ICpNSSk7CisgICAgICAvLyBJbnNlcnQgY29weSBmb3IgdGhlIG90aGVyIGhhbGYgb2YgdGhlIGRvdWJsZS4KKyAgICAgIGlmIChEZXN0RFJlZyAhPSBTcmNEUmVnKSB7CisgICAgICAgIE1JID0gQnVpbGRNSShNQkIsIEksIGRsLCBUTS5nZXRJbnN0ckluZm8oKS0+Z2V0KFNQOjpGTU9WUyksIE9kZERlc3RSZWcpCisgICAgICAgICAgLmFkZFJlZyhPZGRTcmNSZWcpOworICAgICAgICBERUJVRyhlcnJzKCkgPDwgIkZQTW92ZXI6IHRoZSBpbnNlcnRlZCBpbnN0ciBpczogIiA8PCAqTUkpOworICAgICAgfQorICAgICAgKytOdW1GcERzOworICAgIH0KKyAgfQorICByZXR1cm4gQ2hhbmdlZDsKK30KKworYm9vbCBGUE1vdmVyOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIHsKKyAgLy8gSWYgdGhlIHRhcmdldCBoYXMgVjkgaW5zdHJ1Y3Rpb25zLCB0aGUgZnAtbW92ZXIgcHNldWRvcyB3aWxsIG5ldmVyIGJlCisgIC8vIGVtaXR0ZWQuICBBdm9pZCBhIHNjYW4gb2YgdGhlIGluc3RydWN0aW9ucyB0byBpbXByb3ZlIGNvbXBpbGUgdGltZS4KKyAgaWYgKFRNLmdldFN1YnRhcmdldDxTcGFyY1N1YnRhcmdldD4oKS5pc1Y5KCkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGZvciAoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBGSSA9IEYuYmVnaW4oKSwgRkUgPSBGLmVuZCgpOworICAgICAgIEZJICE9IEZFOyArK0ZJKQorICAgIENoYW5nZWQgfD0gcnVuT25NYWNoaW5lQmFzaWNCbG9jaygqRkkpOworICByZXR1cm4gQ2hhbmdlZDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDc4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L1NwYXJjL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVNwYXJjQ29kZUdlbgorVEFSR0VUID0gU3BhcmMKKworIyBNYWtlIHN1cmUgdGhhdCB0YmxnZW4gaXMgcnVuLCBmaXJzdCB0aGluZy4KK0JVSUxUX1NPVVJDRVMgPSBTcGFyY0dlblJlZ2lzdGVySW5mby5oLmluYyBTcGFyY0dlblJlZ2lzdGVyTmFtZXMuaW5jIFwKKyAgICAgICAgICAgICAgICBTcGFyY0dlblJlZ2lzdGVySW5mby5pbmMgU3BhcmNHZW5JbnN0ck5hbWVzLmluYyBcCisgICAgICAgICAgICAgICAgU3BhcmNHZW5JbnN0ckluZm8uaW5jIFNwYXJjR2VuQXNtV3JpdGVyLmluYyBcCisgICAgICAgICAgICAgICAgU3BhcmNHZW5EQUdJU2VsLmluYyBTcGFyY0dlblN1YnRhcmdldC5pbmMgU3BhcmNHZW5DYWxsaW5nQ29udi5pbmMKKworRElSUyA9IEFzbVByaW50ZXIgVGFyZ2V0SW5mbworCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1JFQURNRS50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5OTFmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDU5IEBACisKK1RvLWRvCistLS0tLQorCisqIEtlZXAgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbnN0YW50IHBvb2wgaW4gYSByZWdpc3RlciBpbnN0ZWFkIG9mIGZvcm1pbmcgaXRzCisgIGFkZHJlc3MgYWxsIG9mIHRoZSB0aW1lLgorKiBXZSBjYW4gZm9sZCBzbWFsbCBjb25zdGFudCBvZmZzZXRzIGludG8gdGhlICVoaS8lbG8gcmVmZXJlbmNlcyB0byBjb25zdGFudAorICBwb29sIGFkZHJlc3NlcyBhcyB3ZWxsLgorKiBXaGVuIGluIFY5IG1vZGUsIHJlZ2lzdGVyIGFsbG9jYXRlICVpY2NbMC0zXS4KKyogQWRkIHN1cHBvcnQgZm9yIGlzZWwnaW5nIFVNVUxfTE9ISSBpbnN0ZWFkIG9mIG1hcmtpbmcgaXQgYXMgRXhwYW5kLgorKiBFbWl0IHRoZSAnQnJhbmNoIG9uIEludGVnZXIgUmVnaXN0ZXIgd2l0aCBQcmVkaWN0aW9uJyBpbnN0cnVjdGlvbnMuICBJdCdzCisgIG5vdCBjbGVhciBob3cgdG8gd3JpdGUgYSBwYXR0ZXJuIGZvciB0aGlzIHRob3VnaDoKKworZmxvYXQgJXQxKGludCAlYSwgaW50KiAlcCkgeworICAgICAgICAlQyA9IHNldGVxIGludCAlYSwgMAorICAgICAgICBiciBib29sICVDLCBsYWJlbCAlVCwgbGFiZWwgJUYKK1Q6CisgICAgICAgIHN0b3JlIGludCAxMjMsIGludCogJXAKKyAgICAgICAgYnIgbGFiZWwgJUYKK0Y6CisgICAgICAgIHJldCBmbG9hdCB1bmRlZgorfQorCitjb2RlZ2VucyB0byB0aGlzOgorCit0MToKKyAgICAgICAgc2F2ZSAtOTYsICVvNiwgJW82CisxKSAgICAgIHN1YmNjICVpMCwgMCwgJWwwCisxKSAgICAgIGJuZSAuTEJCdDFfMiAgICAhIEYKKyAgICAgICAgbm9wCisuTEJCdDFfMTogICAgICAgISBUCisgICAgICAgIG9yICVnMCwgMTIzLCAlbDAKKyAgICAgICAgc3QgJWwwLCBbJWkxXQorLkxCQnQxXzI6ICAgICAgICEgRgorICAgICAgICByZXN0b3JlICVnMCwgJWcwLCAlZzAKKyAgICAgICAgcmV0bAorICAgICAgICBub3AKKworMSkgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBicnogaW4gVjkgbW9kZS4KKworKiBTYW1lIGFzIGFib3ZlLCBidXQgZW1pdCBjb25kaXRpb25hbCBtb3ZlIG9uIHJlZ2lzdGVyIHplcm8gKHAxOTIpIGluIFY5IAorICBtb2RlLiAgVGVzdGNhc2U6CisKK2ludCAldDEoaW50ICVhLCBpbnQgJWIpIHsKKyAgICAgICAgJUMgPSBzZXRlcSBpbnQgJWEsIDAKKyAgICAgICAgJUQgPSBzZWxlY3QgYm9vbCAlQywgaW50ICVhLCBpbnQgJWIKKyAgICAgICAgcmV0IGludCAlRAorfQorCisqIEVtaXQgTVVMWC9bU1VdRElWWCBpbnN0cnVjdGlvbnMgaW4gVjkgbW9kZSBpbnN0ZWFkIG9mIGZpZGRsaW5nIAorICB3aXRoIHRoZSBZIHJlZ2lzdGVyLCBpZiB0aGV5IGFyZSBmYXN0ZXIuCisKKyogQ29kZWdlbiBic3dhcChsb2FkKS9zdG9yZShic3dhcCkgLT4gbG9hZC9zdG9yZSBBU0kKKworKiBJbXBsZW1lbnQgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbiwgZS5nLiBlbGltaW5hdGUgc2F2ZS9yZXN0b3JlIGZvciAKKyAgbGVhZiBmbnMuCisqIEZpbGwgZGVsYXkgc2xvdHMKKworKiBJbXBsZW1lbnQgSklUIHN1cHBvcnQKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmMuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzc5MjBkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyYy5oCkBAIC0wLDAgKzEsMTIxIEBACisvLz09PS0tIFNwYXJjLmggLSBUb3AtbGV2ZWwgaW50ZXJmYWNlIGZvciBTcGFyYyByZXByZXNlbnRhdGlvbiAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZW50cnkgcG9pbnRzIGZvciBnbG9iYWwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIExMVk0KKy8vIFNwYXJjIGJhY2stZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVEFSR0VUX1NQQVJDX0gKKyNkZWZpbmUgVEFSR0VUX1NQQVJDX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBjbGFzcyBTcGFyY1RhcmdldE1hY2hpbmU7CisgIGNsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVNwYXJjSVNlbERhZyhTcGFyY1RhcmdldE1hY2hpbmUgJlRNKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVTcGFyY0RlbGF5U2xvdEZpbGxlclBhc3MoVGFyZ2V0TWFjaGluZSAmVE0pOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVNwYXJjRlBNb3ZlclBhc3MoVGFyZ2V0TWFjaGluZSAmVE0pOworCisgIGV4dGVybiBUYXJnZXQgVGhlU3BhcmNUYXJnZXQ7CisgIGV4dGVybiBUYXJnZXQgVGhlU3BhcmNWOVRhcmdldDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm07CisKKy8vIERlZmluZXMgc3ltYm9saWMgbmFtZXMgZm9yIFNwYXJjIHJlZ2lzdGVycy4gIFRoaXMgZGVmaW5lcyBhIG1hcHBpbmcgZnJvbQorLy8gcmVnaXN0ZXIgbmFtZSB0byByZWdpc3RlciBudW1iZXIuCisvLworI2luY2x1ZGUgIlNwYXJjR2VuUmVnaXN0ZXJOYW1lcy5pbmMiCisKKy8vIERlZmluZXMgc3ltYm9saWMgbmFtZXMgZm9yIHRoZSBTcGFyYyBpbnN0cnVjdGlvbnMuCisvLworI2luY2x1ZGUgIlNwYXJjR2VuSW5zdHJOYW1lcy5pbmMiCisKKworbmFtZXNwYWNlIGxsdm0geworICAvLyBFbnVtcyBjb3JyZXNwb25kaW5nIHRvIFNwYXJjIGNvbmRpdGlvbiBjb2RlcywgYm90aCBpY2MncyBhbmQgZmNjJ3MuICBUaGVzZQorICAvLyB2YWx1ZXMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgb25lcyBpbiB0aGUgLnRkIGZpbGUuCisgIG5hbWVzcGFjZSBTUENDIHsKKyAgICBlbnVtIENvbmRDb2RlcyB7CisgICAgICAvL0lDQ19BICAgPSAgOCAgICwgIC8vIEFsd2F5cworICAgICAgLy9JQ0NfTiAgID0gIDAgICAsICAvLyBOZXZlcgorICAgICAgSUNDX05FICA9ICA5ICAgLCAgLy8gTm90IEVxdWFsCisgICAgICBJQ0NfRSAgID0gIDEgICAsICAvLyBFcXVhbAorICAgICAgSUNDX0cgICA9IDEwICAgLCAgLy8gR3JlYXRlcgorICAgICAgSUNDX0xFICA9ICAyICAgLCAgLy8gTGVzcyBvciBFcXVhbAorICAgICAgSUNDX0dFICA9IDExICAgLCAgLy8gR3JlYXRlciBvciBFcXVhbAorICAgICAgSUNDX0wgICA9ICAzICAgLCAgLy8gTGVzcworICAgICAgSUNDX0dVICA9IDEyICAgLCAgLy8gR3JlYXRlciBVbnNpZ25lZAorICAgICAgSUNDX0xFVSA9ICA0ICAgLCAgLy8gTGVzcyBvciBFcXVhbCBVbnNpZ25lZAorICAgICAgSUNDX0NDICA9IDEzICAgLCAgLy8gQ2FycnkgQ2xlYXIvR3JlYXQgb3IgRXF1YWwgVW5zaWduZWQKKyAgICAgIElDQ19DUyAgPSAgNSAgICwgIC8vIENhcnJ5IFNldC9MZXNzIFVuc2lnbmVkCisgICAgICBJQ0NfUE9TID0gMTQgICAsICAvLyBQb3NpdGl2ZQorICAgICAgSUNDX05FRyA9ICA2ICAgLCAgLy8gTmVnYXRpdmUKKyAgICAgIElDQ19WQyAgPSAxNSAgICwgIC8vIE92ZXJmbG93IENsZWFyCisgICAgICBJQ0NfVlMgID0gIDcgICAsICAvLyBPdmVyZmxvdyBTZXQKKyAgICAgIAorICAgICAgLy9GQ0NfQSAgID0gIDgrMTYsICAvLyBBbHdheXMKKyAgICAgIC8vRkNDX04gICA9ICAwKzE2LCAgLy8gTmV2ZXIKKyAgICAgIEZDQ19VICAgPSAgNysxNiwgIC8vIFVub3JkZXJlZAorICAgICAgRkNDX0cgICA9ICA2KzE2LCAgLy8gR3JlYXRlcgorICAgICAgRkNDX1VHICA9ICA1KzE2LCAgLy8gVW5vcmRlcmVkIG9yIEdyZWF0ZXIKKyAgICAgIEZDQ19MICAgPSAgNCsxNiwgIC8vIExlc3MKKyAgICAgIEZDQ19VTCAgPSAgMysxNiwgIC8vIFVub3JkZXJlZCBvciBMZXNzCisgICAgICBGQ0NfTEcgID0gIDIrMTYsICAvLyBMZXNzIG9yIEdyZWF0ZXIKKyAgICAgIEZDQ19ORSAgPSAgMSsxNiwgIC8vIE5vdCBFcXVhbAorICAgICAgRkNDX0UgICA9ICA5KzE2LCAgLy8gRXF1YWwKKyAgICAgIEZDQ19VRSAgPSAxMCsxNiwgIC8vIFVub3JkZXJlZCBvciBFcXVhbAorICAgICAgRkNDX0dFICA9IDExKzE2LCAgLy8gR3JlYXRlciBvciBFcXVhbAorICAgICAgRkNDX1VHRSA9IDEyKzE2LCAgLy8gVW5vcmRlcmVkIG9yIEdyZWF0ZXIgb3IgRXF1YWwKKyAgICAgIEZDQ19MRSAgPSAxMysxNiwgIC8vIExlc3Mgb3IgRXF1YWwKKyAgICAgIEZDQ19VTEUgPSAxNCsxNiwgIC8vIFVub3JkZXJlZCBvciBMZXNzIG9yIEVxdWFsCisgICAgICBGQ0NfTyAgID0gMTUrMTYgICAvLyBPcmRlcmVkCisgICAgfTsKKyAgfQorICAKKyAgaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICpTUEFSQ0NvbmRDb2RlVG9TdHJpbmcoU1BDQzo6Q29uZENvZGVzIENDKSB7CisgICAgc3dpdGNoIChDQykgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29uZGl0aW9uIGNvZGUiKTsKKyAgICBjYXNlIFNQQ0M6OklDQ19ORTogIHJldHVybiAibmUiOworICAgIGNhc2UgU1BDQzo6SUNDX0U6ICAgcmV0dXJuICJlIjsKKyAgICBjYXNlIFNQQ0M6OklDQ19HOiAgIHJldHVybiAiZyI7CisgICAgY2FzZSBTUENDOjpJQ0NfTEU6ICByZXR1cm4gImxlIjsKKyAgICBjYXNlIFNQQ0M6OklDQ19HRTogIHJldHVybiAiZ2UiOworICAgIGNhc2UgU1BDQzo6SUNDX0w6ICAgcmV0dXJuICJsIjsKKyAgICBjYXNlIFNQQ0M6OklDQ19HVTogIHJldHVybiAiZ3UiOworICAgIGNhc2UgU1BDQzo6SUNDX0xFVTogcmV0dXJuICJsZXUiOworICAgIGNhc2UgU1BDQzo6SUNDX0NDOiAgcmV0dXJuICJjYyI7CisgICAgY2FzZSBTUENDOjpJQ0NfQ1M6ICByZXR1cm4gImNzIjsKKyAgICBjYXNlIFNQQ0M6OklDQ19QT1M6IHJldHVybiAicG9zIjsKKyAgICBjYXNlIFNQQ0M6OklDQ19ORUc6IHJldHVybiAibmVnIjsKKyAgICBjYXNlIFNQQ0M6OklDQ19WQzogIHJldHVybiAidmMiOworICAgIGNhc2UgU1BDQzo6SUNDX1ZTOiAgcmV0dXJuICJ2cyI7CisgICAgY2FzZSBTUENDOjpGQ0NfVTogICByZXR1cm4gInUiOworICAgIGNhc2UgU1BDQzo6RkNDX0c6ICAgcmV0dXJuICJnIjsKKyAgICBjYXNlIFNQQ0M6OkZDQ19VRzogIHJldHVybiAidWciOworICAgIGNhc2UgU1BDQzo6RkNDX0w6ICAgcmV0dXJuICJsIjsKKyAgICBjYXNlIFNQQ0M6OkZDQ19VTDogIHJldHVybiAidWwiOworICAgIGNhc2UgU1BDQzo6RkNDX0xHOiAgcmV0dXJuICJsZyI7CisgICAgY2FzZSBTUENDOjpGQ0NfTkU6ICByZXR1cm4gIm5lIjsKKyAgICBjYXNlIFNQQ0M6OkZDQ19FOiAgIHJldHVybiAiZSI7CisgICAgY2FzZSBTUENDOjpGQ0NfVUU6ICByZXR1cm4gInVlIjsKKyAgICBjYXNlIFNQQ0M6OkZDQ19HRTogIHJldHVybiAiZ2UiOworICAgIGNhc2UgU1BDQzo6RkNDX1VHRTogcmV0dXJuICJ1Z2UiOworICAgIGNhc2UgU1BDQzo6RkNDX0xFOiAgcmV0dXJuICJsZSI7CisgICAgY2FzZSBTUENDOjpGQ0NfVUxFOiByZXR1cm4gInVsZSI7CisgICAgY2FzZSBTUENDOjpGQ0NfTzogICByZXR1cm4gIm8iOworICAgIH0gICAgICAgCisgIH0KK30gIC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyYy50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZjYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyYy50ZApAQCAtMCwwICsxLDcyIEBACisvLz09PS0gU3BhcmMudGQgLSBEZXNjcmliZSB0aGUgU3BhcmMgVGFyZ2V0IE1hY2hpbmUgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gVGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMgd2hpY2ggd2UgYXJlIGltcGxlbWVudGluZw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQoraW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0LnRkIg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1BBUkMgU3VidGFyZ2V0IGZlYXR1cmVzLg0KKy8vDQorIA0KK2RlZiBGZWF0dXJlVjkNCisgIDogU3VidGFyZ2V0RmVhdHVyZTwidjkiLCAiSXNWOSIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlIFNQQVJDLVY5IGluc3RydWN0aW9ucyI+Ow0KK2RlZiBGZWF0dXJlVjhEZXByZWNhdGVkDQorICA6IFN1YnRhcmdldEZlYXR1cmU8ImRlcHJlY2F0ZWQtdjgiLCAiVjhEZXByZWNhdGVkSW5zdHMiLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBkZXByZWNhdGVkIFY4IGluc3RydWN0aW9ucyBpbiBWOSBtb2RlIj47DQorZGVmIEZlYXR1cmVWSVMNCisgIDogU3VidGFyZ2V0RmVhdHVyZTwidmlzIiwgIklzVklTIiwgInRydWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgVWx0cmFTUEFSQyBWaXN1YWwgSW5zdHJ1Y3Rpb24gU2V0IGV4dGVuc2lvbnMiPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFJlZ2lzdGVyIEZpbGUsIENhbGxpbmcgQ29udiwgSW5zdHJ1Y3Rpb24gRGVzY3JpcHRpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitpbmNsdWRlICJTcGFyY1JlZ2lzdGVySW5mby50ZCINCitpbmNsdWRlICJTcGFyY0NhbGxpbmdDb252LnRkIg0KK2luY2x1ZGUgIlNwYXJjSW5zdHJJbmZvLnRkIg0KKw0KK2RlZiBTcGFyY0luc3RySW5mbyA6IEluc3RySW5mbzsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNQQVJDIHByb2Nlc3NvcnMgc3VwcG9ydGVkLg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorY2xhc3MgUHJvYzxzdHJpbmcgTmFtZSwgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBGZWF0dXJlcz4NCisgOiBQcm9jZXNzb3I8TmFtZSwgTm9JdGluZXJhcmllcywgRmVhdHVyZXM+Ow0KKw0KK2RlZiA6IFByb2M8ImdlbmVyaWMiLCAgICAgICAgIFtdPjsNCitkZWYgOiBQcm9jPCJ2OCIsICAgICAgICAgICAgICBbXT47DQorZGVmIDogUHJvYzwic3VwZXJzcGFyYyIsICAgICAgW10+Ow0KK2RlZiA6IFByb2M8InNwYXJjbGl0ZSIsICAgICAgIFtdPjsNCitkZWYgOiBQcm9jPCJmOTM0IiwgICAgICAgICAgICBbXT47DQorZGVmIDogUHJvYzwiaHlwZXJzcGFyYyIsICAgICAgW10+Ow0KK2RlZiA6IFByb2M8InNwYXJjbGl0ZTg2eCIsICAgIFtdPjsNCitkZWYgOiBQcm9jPCJzcGFyY2xldCIsICAgICAgICBbXT47DQorZGVmIDogUHJvYzwidHNjNzAxIiwgICAgICAgICAgW10+Ow0KK2RlZiA6IFByb2M8InY5IiwgICAgICAgICAgICAgIFtGZWF0dXJlVjldPjsNCitkZWYgOiBQcm9jPCJ1bHRyYXNwYXJjIiwgICAgICBbRmVhdHVyZVY5LCBGZWF0dXJlVjhEZXByZWNhdGVkXT47DQorZGVmIDogUHJvYzwidWx0cmFzcGFyYzMiLCAgICAgW0ZlYXR1cmVWOSwgRmVhdHVyZVY4RGVwcmVjYXRlZF0+Ow0KK2RlZiA6IFByb2M8InVsdHJhc3BhcmMzLXZpcyIsIFtGZWF0dXJlVjksIEZlYXR1cmVWOERlcHJlY2F0ZWQsIEZlYXR1cmVWSVNdPjsNCisNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIERlY2xhcmUgdGhlIHRhcmdldCB3aGljaCB3ZSBhcmUgaW1wbGVtZW50aW5nDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitkZWYgU3BhcmMgOiBUYXJnZXQgew0KKyAgLy8gUHVsbCBpbiBJbnN0cnVjdGlvbiBJbmZvOg0KKyAgbGV0IEluc3RydWN0aW9uU2V0ID0gU3BhcmNJbnN0ckluZm87DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNDYWxsaW5nQ29udi50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNDYWxsaW5nQ29udi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2VjZmRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0NhbGxpbmdDb252LnRkCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LSBTcGFyY0NhbGxpbmdDb252LnRkIC0gQ2FsbGluZyBDb252ZW50aW9ucyBTcGFyYyAtLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGRlc2NyaWJlcyB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgdGhlIFNwYXJjIGFyY2hpdGVjdHVyZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJldHVybiBWYWx1ZSBDYWxsaW5nIENvbnZlbnRpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBTcGFyYyAzMi1iaXQgQyByZXR1cm4tdmFsdWUgY29udmVudGlvbi4KK2RlZiBSZXRDQ19TcGFyYzMyIDogQ2FsbGluZ0NvbnY8WworICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbSTAsIEkxLCBJMiwgSTMsIEk0LCBJNV0+PiwKKyAgQ0NJZlR5cGU8W2YzMl0sIENDQXNzaWduVG9SZWc8W0YwLCBGMSwgRjIsIEYzXT4+LAorICBDQ0lmVHlwZTxbZjY0XSwgQ0NBc3NpZ25Ub1JlZzxbRDAsIEQxXT4+CitdPjsKKworLy8gU3BhcmMgMzItYml0IEMgQ2FsbGluZyBjb252ZW50aW9uLgorZGVmIENDX1NwYXJjMzIgOiBDYWxsaW5nQ29udjxbCisgIC8vIEFsbCBhcmd1bWVudHMgZ2V0IHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVycyBpZiB0aGVyZSBpcyBzcGFjZS4KKyAgQ0NJZlR5cGU8W2kzMiwgZjMyLCBmNjRdLCBDQ0Fzc2lnblRvUmVnPFtJMCwgSTEsIEkyLCBJMywgSTQsIEk1XT4+LAorICAKKyAgLy8gQWx0ZXJuYXRpdmVseSwgdGhleSBhcmUgYXNzaWduZWQgdG8gdGhlIHN0YWNrIGluIDQtYnl0ZSBhbGlnbmVkIHVuaXRzLgorICBDQ0Fzc2lnblRvU3RhY2s8NCwgND4KK10+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0lTZWxEQUdUb0RBRy5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjSVNlbERBR1RvREFHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg5MjNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0lTZWxEQUdUb0RBRy5jcHAKQEAgLTAsMCArMSwyMTQgQEAKKy8vPT09LS0gU3BhcmNJU2VsREFHVG9EQUcuY3BwIC0gQSBkYWcgdG8gZGFnIGluc3Qgc2VsZWN0b3IgZm9yIFNwYXJjIC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgZm9yIHRoZSBTUEFSQyB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNwYXJjVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gU2VsZWN0b3IgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFNwYXJjREFHVG9EQUdJU2VsIC0gU1BBUkMgc3BlY2lmaWMgY29kZSB0byBzZWxlY3QgU1BBUkMgbWFjaGluZQorLy8vIGluc3RydWN0aW9ucyBmb3IgU2VsZWN0aW9uREFHIG9wZXJhdGlvbnMuCisvLy8KK25hbWVzcGFjZSB7CitjbGFzcyBTcGFyY0RBR1RvREFHSVNlbCA6IHB1YmxpYyBTZWxlY3Rpb25EQUdJU2VsIHsKKyAgLy8vIFN1YnRhcmdldCAtIEtlZXAgYSBwb2ludGVyIHRvIHRoZSBTcGFyYyBTdWJ0YXJnZXQgYXJvdW5kIHNvIHRoYXQgd2UgY2FuCisgIC8vLyBtYWtlIHRoZSByaWdodCBkZWNpc2lvbiB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgZGlmZmVyZW50IHRhcmdldHMuCisgIGNvbnN0IFNwYXJjU3VidGFyZ2V0ICZTdWJ0YXJnZXQ7CisgIFNwYXJjVGFyZ2V0TWFjaGluZSYgVE07CitwdWJsaWM6CisgIGV4cGxpY2l0IFNwYXJjREFHVG9EQUdJU2VsKFNwYXJjVGFyZ2V0TWFjaGluZSAmdG0pCisgICAgOiBTZWxlY3Rpb25EQUdJU2VsKHRtKSwKKyAgICAgIFN1YnRhcmdldCh0bS5nZXRTdWJ0YXJnZXQ8U3BhcmNTdWJ0YXJnZXQ+KCkpLAorICAgICAgVE0odG0pIHsKKyAgfQorCisgIFNETm9kZSAqU2VsZWN0KFNETm9kZSAqTik7CisKKyAgLy8gQ29tcGxleCBQYXR0ZXJuIFNlbGVjdG9ycy4KKyAgYm9vbCBTZWxlY3RBRERScnIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZSMSwgU0RWYWx1ZSAmUjIpOworICBib29sIFNlbGVjdEFERFJyaShTRE5vZGUgKk9wLCBTRFZhbHVlIE4sIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCk7CisKKyAgLy8vIFNlbGVjdElubGluZUFzbU1lbW9yeU9wZXJhbmQgLSBJbXBsZW1lbnQgYWRkcmVzc2luZyBtb2RlIHNlbGVjdGlvbiBmb3IKKyAgLy8vIGlubGluZSBhc20gZXhwcmVzc2lvbnMuCisgIHZpcnR1YWwgYm9vbCBTZWxlY3RJbmxpbmVBc21NZW1vcnlPcGVyYW5kKGNvbnN0IFNEVmFsdWUgJk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbnN0cmFpbnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3V0T3BzKTsKKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiU1BBUkMgREFHLT5EQUcgUGF0dGVybiBJbnN0cnVjdGlvbiBTZWxlY3Rpb24iOworICB9CisKKyAgLy8gSW5jbHVkZSB0aGUgcGllY2VzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0aW9uLgorI2luY2x1ZGUgIlNwYXJjR2VuREFHSVNlbC5pbmMiCisKK3ByaXZhdGU6CisgIFNETm9kZSogZ2V0R2xvYmFsQmFzZVJlZygpOworfTsKK30gIC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK1NETm9kZSogU3BhcmNEQUdUb0RBR0lTZWw6OmdldEdsb2JhbEJhc2VSZWcoKSB7CisgIHVuc2lnbmVkIEdsb2JhbEJhc2VSZWcgPSBUTS5nZXRJbnN0ckluZm8oKS0+Z2V0R2xvYmFsQmFzZVJlZyhNRik7CisgIHJldHVybiBDdXJEQUctPmdldFJlZ2lzdGVyKEdsb2JhbEJhc2VSZWcsIFRMSS5nZXRQb2ludGVyVHkoKSkuZ2V0Tm9kZSgpOworfQorCitib29sIFNwYXJjREFHVG9EQUdJU2VsOjpTZWxlY3RBRERScmkoU0ROb2RlICpPcCwgU0RWYWx1ZSBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJk9mZnNldCkgeworICBpZiAoRnJhbWVJbmRleFNETm9kZSAqRklOID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4oQWRkcikpIHsKKyAgICBCYXNlID0gQ3VyREFHLT5nZXRUYXJnZXRGcmFtZUluZGV4KEZJTi0+Z2V0SW5kZXgoKSwgTVZUOjppMzIpOworICAgIE9mZnNldCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChBZGRyLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0RXh0ZXJuYWxTeW1ib2wgfHwKKyAgICAgIEFkZHIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzKQorICAgIHJldHVybiBmYWxzZTsgIC8vIGRpcmVjdCBjYWxscy4KKworICBpZiAoQWRkci5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIGlmIChDb25zdGFudFNETm9kZSAqQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oQWRkci5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgaWYgKFByZWRpY2F0ZV9zaW1tMTMoQ04pKSB7CisgICAgICAgIGlmIChGcmFtZUluZGV4U0ROb2RlICpGSU4gPQorICAgICAgICAgICAgICAgIGR5bl9jYXN0PEZyYW1lSW5kZXhTRE5vZGU+KEFkZHIuZ2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgICAvLyBDb25zdGFudCBvZmZzZXQgZnJvbSBmcmFtZSByZWYuCisgICAgICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSU4tPmdldEluZGV4KCksIE1WVDo6aTMyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBCYXNlID0gQWRkci5nZXRPcGVyYW5kKDApOworICAgICAgICB9CisgICAgICAgIE9mZnNldCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQ04tPmdldFpFeHRWYWx1ZSgpLCBNVlQ6OmkzMik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoQWRkci5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IFNQSVNEOjpMbykgeworICAgICAgQmFzZSA9IEFkZHIuZ2V0T3BlcmFuZCgxKTsKKyAgICAgIE9mZnNldCA9IEFkZHIuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDApOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChBZGRyLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gU1BJU0Q6OkxvKSB7CisgICAgICBCYXNlID0gQWRkci5nZXRPcGVyYW5kKDApOworICAgICAgT2Zmc2V0ID0gQWRkci5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgQmFzZSA9IEFkZHI7CisgIE9mZnNldCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTcGFyY0RBR1RvREFHSVNlbDo6U2VsZWN0QUREUnJyKFNETm9kZSAqT3AsIFNEVmFsdWUgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZSMSwgIFNEVmFsdWUgJlIyKSB7CisgIGlmIChBZGRyLmdldE9wY29kZSgpID09IElTRDo6RnJhbWVJbmRleCkgcmV0dXJuIGZhbHNlOworICBpZiAoQWRkci5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEV4dGVybmFsU3ltYm9sIHx8CisgICAgICBBZGRyLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsQWRkcmVzcykKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBkaXJlY3QgY2FsbHMuCisKKyAgaWYgKEFkZHIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQpIHsKKyAgICBpZiAoaXNhPENvbnN0YW50U0ROb2RlPihBZGRyLmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgIFByZWRpY2F0ZV9zaW1tMTMoQWRkci5nZXRPcGVyYW5kKDEpLmdldE5vZGUoKSkpCisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBMZXQgdGhlIHJlZytpbW0gcGF0dGVybiBjYXRjaCB0aGlzIQorICAgIGlmIChBZGRyLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gU1BJU0Q6OkxvIHx8CisgICAgICAgIEFkZHIuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBTUElTRDo6TG8pCisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBMZXQgdGhlIHJlZytpbW0gcGF0dGVybiBjYXRjaCB0aGlzIQorICAgIFIxID0gQWRkci5nZXRPcGVyYW5kKDApOworICAgIFIyID0gQWRkci5nZXRPcGVyYW5kKDEpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgUjEgPSBBZGRyOworICBSMiA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoU1A6OkcwLCBNVlQ6OmkzMik7CisgIHJldHVybiB0cnVlOworfQorCitTRE5vZGUgKlNwYXJjREFHVG9EQUdJU2VsOjpTZWxlY3QoU0ROb2RlICpOKSB7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgaWYgKE4tPmlzTWFjaGluZU9wY29kZSgpKQorICAgIHJldHVybiBOVUxMOyAgIC8vIEFscmVhZHkgc2VsZWN0ZWQuCisKKyAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBTUElTRDo6R0xPQkFMX0JBU0VfUkVHOgorICAgIHJldHVybiBnZXRHbG9iYWxCYXNlUmVnKCk7CisKKyAgY2FzZSBJU0Q6OlNESVY6CisgIGNhc2UgSVNEOjpVRElWOiB7CisgICAgLy8gRklYTUU6IHNob3VsZCB1c2UgYSBjdXN0b20gZXhwYW5kZXIgdG8gZXhwb3NlIHRoZSBTUkEgdG8gdGhlIGRhZy4KKyAgICBTRFZhbHVlIERpdkxIUyA9IE4tPmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBEaXZSSFMgPSBOLT5nZXRPcGVyYW5kKDEpOworCisgICAgLy8gU2V0IHRoZSBZIHJlZ2lzdGVyIHRvIHRoZSBoaWdoLXBhcnQuCisgICAgU0RWYWx1ZSBUb3BQYXJ0OworICAgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNESVYpIHsKKyAgICAgIFRvcFBhcnQgPSBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoU1A6OlNSQXJpLCBkbCwgTVZUOjppMzIsIERpdkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgzMSwgTVZUOjppMzIpKSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFRvcFBhcnQgPSBDdXJEQUctPmdldFJlZ2lzdGVyKFNQOjpHMCwgTVZUOjppMzIpOworICAgIH0KKyAgICBUb3BQYXJ0ID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNQOjpXUllyciwgZGwsIE1WVDo6RmxhZywgVG9wUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFJlZ2lzdGVyKFNQOjpHMCwgTVZUOjppMzIpKSwgMCk7CisKKyAgICAvLyBGSVhNRTogSGFuZGxlIGRpdiBieSBpbW1lZGlhdGUuCisgICAgdW5zaWduZWQgT3Bjb2RlID0gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTRElWID8gU1A6OlNESVZyciA6IFNQOjpVRElWcnI7CisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIE9wY29kZSwgTVZUOjppMzIsIERpdkxIUywgRGl2UkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3BQYXJ0KTsKKyAgfQorICBjYXNlIElTRDo6TVVMSFU6CisgIGNhc2UgSVNEOjpNVUxIUzogeworICAgIC8vIEZJWE1FOiBIYW5kbGUgbXVsIGJ5IGltbWVkaWF0ZS4KKyAgICBTRFZhbHVlIE11bExIUyA9IE4tPmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBNdWxSSFMgPSBOLT5nZXRPcGVyYW5kKDEpOworICAgIHVuc2lnbmVkIE9wY29kZSA9IE4tPmdldE9wY29kZSgpID09IElTRDo6TVVMSFUgPyBTUDo6VU1VTHJyIDogU1A6OlNNVUxycjsKKyAgICBTRE5vZGUgKk11bCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3Bjb2RlLCBkbCwgTVZUOjppMzIsIE1WVDo6RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsTEhTLCBNdWxSSFMpOworICAgIC8vIFRoZSBoaWdoIHBhcnQgaXMgaW4gdGhlIFkgcmVnaXN0ZXIuCisgICAgcmV0dXJuIEN1ckRBRy0+U2VsZWN0Tm9kZVRvKE4sIFNQOjpSRFksIE1WVDo6aTMyLCBTRFZhbHVlKE11bCwgMSkpOworICAgIHJldHVybiBOVUxMOworICB9CisgIH0KKworICByZXR1cm4gU2VsZWN0Q29kZShOKTsKK30KKworCisvLy8gU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZCAtIEltcGxlbWVudCBhZGRyZXNzaW5nIG1vZGUgc2VsZWN0aW9uIGZvcgorLy8vIGlubGluZSBhc20gZXhwcmVzc2lvbnMuCitib29sCitTcGFyY0RBR1RvREFHSVNlbDo6U2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChjb25zdCBTRFZhbHVlICZPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgQ29uc3RyYWludENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3V0T3BzKSB7CisgIFNEVmFsdWUgT3AwLCBPcDE7CisgIHN3aXRjaCAoQ29uc3RyYWludENvZGUpIHsKKyAgZGVmYXVsdDogcmV0dXJuIHRydWU7CisgIGNhc2UgJ20nOiAgIC8vIG1lbW9yeQorICAgaWYgKCFTZWxlY3RBRERScnIoT3AuZ2V0Tm9kZSgpLCBPcCwgT3AwLCBPcDEpKQorICAgICBTZWxlY3RBRERScmkoT3AuZ2V0Tm9kZSgpLCBPcCwgT3AwLCBPcDEpOworICAgYnJlYWs7CisgIH0KKworICBPdXRPcHMucHVzaF9iYWNrKE9wMCk7CisgIE91dE9wcy5wdXNoX2JhY2soT3AxKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gY3JlYXRlU3BhcmNJU2VsRGFnIC0gVGhpcyBwYXNzIGNvbnZlcnRzIGEgbGVnYWxpemVkIERBRyBpbnRvIGEKKy8vLyBTUEFSQy1zcGVjaWZpYyBEQUcsIHJlYWR5IGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorLy8vCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZVNwYXJjSVNlbERhZyhTcGFyY1RhcmdldE1hY2hpbmUgJlRNKSB7CisgIHJldHVybiBuZXcgU3BhcmNEQUdUb0RBR0lTZWwoVE0pOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0lTZWxMb3dlcmluZy5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjSVNlbExvd2VyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDk5YTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0lTZWxMb3dlcmluZy5jcHAKQEAgLTAsMCArMSwxMTA3IEBACisvLz09PS0tIFNwYXJjSVNlbExvd2VyaW5nLmNwcCAtIFNwYXJjIERBRyBMb3dlcmluZyBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2VzIHRoYXQgU3BhcmMgdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50byBhCisvLyBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJTcGFyY0lTZWxMb3dlcmluZy5oIgorI2luY2x1ZGUgIlNwYXJjVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlNwYXJjTWFjaGluZUZ1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZUltcGwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9WZWN0b3JFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENhbGxpbmcgQ29udmVudGlvbiBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNwYXJjR2VuQ2FsbGluZ0NvbnYuaW5jIgorCitTRFZhbHVlCitTcGFyY1RhcmdldExvd2VyaW5nOjpMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworCisgIC8vIENDVmFsQXNzaWduIC0gcmVwcmVzZW50IHRoZSBhc3NpZ25tZW50IG9mIHRoZSByZXR1cm4gdmFsdWUgdG8gbG9jYXRpb25zLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKworICAvLyBDQ1N0YXRlIC0gSW5mbyBhYm91dCB0aGUgcmVnaXN0ZXJzIGFuZCBzdGFjayBzbG90LgorICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIERBRy5nZXRUYXJnZXQoKSwKKyAgICAgICAgICAgICAgICAgUlZMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisKKyAgLy8gQW5hbGl6ZSByZXR1cm4gdmFsdWVzLgorICBDQ0luZm8uQW5hbHl6ZVJldHVybihPdXRzLCBSZXRDQ19TcGFyYzMyKTsKKworICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXR1cm4gbG93ZXJlZCBmb3IgdGhpcyBmdW5jdGlvbiwgYWRkIHRoZSByZWdzIHRvIHRoZQorICAvLyBsaXZlb3V0IHNldCBmb3IgdGhlIGZ1bmN0aW9uLgorICBpZiAoREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5saXZlb3V0X2VtcHR5KCkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkKKyAgICAgIGlmIChSVkxvY3NbaV0uaXNSZWdMb2MoKSkKKyAgICAgICAgREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKS5hZGRMaXZlT3V0KFJWTG9jc1tpXS5nZXRMb2NSZWcoKSk7CisgIH0KKworICBTRFZhbHVlIEZsYWc7CisKKyAgLy8gQ29weSB0aGUgcmVzdWx0IHZhbHVlcyBpbnRvIHRoZSBvdXRwdXQgcmVnaXN0ZXJzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkgeworICAgIENDVmFsQXNzaWduICZWQSA9IFJWTG9jc1tpXTsKKyAgICBhc3NlcnQoVkEuaXNSZWdMb2MoKSAmJiAiQ2FuIG9ubHkgcmV0dXJuIGluIHJlZ2lzdGVycyEiKTsKKworICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFZBLmdldExvY1JlZygpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0VmFsc1tpXSwgRmxhZyk7CisKKyAgICAvLyBHdWFyYW50ZWUgdGhhdCBhbGwgZW1pdHRlZCBjb3BpZXMgYXJlIHN0dWNrIHRvZ2V0aGVyIHdpdGggZmxhZ3MuCisgICAgRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisKKyAgaWYgKEZsYWcuZ2V0Tm9kZSgpKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShTUElTRDo6UkVUX0ZMQUcsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbiwgRmxhZyk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShTUElTRDo6UkVUX0ZMQUcsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbik7Cit9CisKKy8vLyBMb3dlckZvcm1hbEFyZ3VtZW50cyAtIFY4IHVzZXMgYSB2ZXJ5IHNpbXBsZSBBQkksIHdoZXJlIGFsbCB2YWx1ZXMgYXJlCisvLy8gcGFzc2VkIGluIGVpdGhlciBvbmUgb3IgdHdvIEdQUnMsIGluY2x1ZGluZyBGUCB2YWx1ZXMuICBUT0RPOiB3ZSBzaG91bGQKKy8vLyBwYXNzIEZQIHZhbHVlcyBpbiBGUCByZWdpc3RlcnMgZm9yIGZhc3RjYyBmdW5jdGlvbnMuCitTRFZhbHVlCitTcGFyY1RhcmdldExvd2VyaW5nOjpMb3dlckZvcm1hbEFyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeworCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8gPSBNRi5nZXRSZWdJbmZvKCk7CisgIFNwYXJjTWFjaGluZUZ1bmN0aW9uSW5mbyAqRnVuY0luZm8gPSBNRi5nZXRJbmZvPFNwYXJjTWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKworICAvLyBBc3NpZ24gbG9jYXRpb25zIHRvIGFsbCBvZiB0aGUgaW5jb21pbmcgYXJndW1lbnRzLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IEFyZ0xvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICBBcmdMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisgIENDSW5mby5BbmFseXplRm9ybWFsQXJndW1lbnRzKElucywgQ0NfU3BhcmMzMik7CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEFyZ1JlZ3NbXSA9IHsKKyAgICBTUDo6STAsIFNQOjpJMSwgU1A6OkkyLCBTUDo6STMsIFNQOjpJNCwgU1A6Okk1CisgIH07CisgIGNvbnN0IHVuc2lnbmVkICpDdXJBcmdSZWcgPSBBcmdSZWdzLCAqQXJnUmVnRW5kID0gQXJnUmVncys2OworICB1bnNpZ25lZCBBcmdPZmZzZXQgPSA2ODsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgU0RWYWx1ZSBBcmdWYWx1ZTsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBBcmdMb2NzW2ldOworICAgIC8vIEZJWE1FOiBXZSBpZ25vcmUgdGhlIHJlZ2lzdGVyIGFzc2lnbm1lbnRzIG9mIEFuYWx5emVGb3JtYWxBcmd1bWVudHMKKyAgICAvLyBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyBob3cgdG8gc3BsaXQgYSBkb3VibGUgaW50byB0d28gaTMyIHJlZ2lzdGVycy4KKyAgICBFVlQgT2JqZWN0VlQgPSBWQS5nZXRWYWxWVCgpOworICAgIHN3aXRjaCAoT2JqZWN0VlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBhcmd1bWVudCB0eXBlISIpOworICAgIGNhc2UgTVZUOjppMToKKyAgICBjYXNlIE1WVDo6aTg6CisgICAgY2FzZSBNVlQ6OmkxNjoKKyAgICBjYXNlIE1WVDo6aTMyOgorICAgICAgaWYgKCFJbnNbaV0uVXNlZCkgeyAgICAgICAgICAgICAgICAgIC8vIEFyZ3VtZW50IGlzIGRlYWQuCisgICAgICAgIGlmIChDdXJBcmdSZWcgPCBBcmdSZWdFbmQpICsrQ3VyQXJnUmVnOworICAgICAgICBJblZhbHMucHVzaF9iYWNrKERBRy5nZXRVTkRFRihPYmplY3RWVCkpOworICAgICAgfSBlbHNlIGlmIChDdXJBcmdSZWcgPCBBcmdSZWdFbmQpIHsgIC8vIExpdmVzIGluIGFuIGluY29taW5nIEdQUgorICAgICAgICB1bnNpZ25lZCBWUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoJlNQOjpJbnRSZWdzUmVnQ2xhc3MpOworICAgICAgICBNRi5nZXRSZWdJbmZvKCkuYWRkTGl2ZUluKCpDdXJBcmdSZWcrKywgVlJlZyk7CisgICAgICAgIFNEVmFsdWUgQXJnID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgVlJlZywgTVZUOjppMzIpOworICAgICAgICBpZiAoT2JqZWN0VlQgIT0gTVZUOjppMzIpIHsKKyAgICAgICAgICB1bnNpZ25lZCBBc3NlcnRPcCA9IElTRDo6QXNzZXJ0U2V4dDsKKyAgICAgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShBc3NlcnRPcCwgZGwsIE1WVDo6aTMyLCBBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShPYmplY3RWVCkpOworICAgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBPYmplY3RWVCwgQXJnKTsKKyAgICAgICAgfQorICAgICAgICBJblZhbHMucHVzaF9iYWNrKEFyZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgRnJhbWVJZHggPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlRml4ZWRPYmplY3QoNCwgQXJnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIFNEVmFsdWUgRklQdHIgPSBEQUcuZ2V0RnJhbWVJbmRleChGcmFtZUlkeCwgTVZUOjppMzIpOworICAgICAgICBTRFZhbHVlIExvYWQ7CisgICAgICAgIGlmIChPYmplY3RWVCA9PSBNVlQ6OmkzMikgeworICAgICAgICAgIExvYWQgPSBEQUcuZ2V0TG9hZChNVlQ6OmkzMiwgZGwsIENoYWluLCBGSVB0ciwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBJU0Q6OkxvYWRFeHRUeXBlIExvYWRPcCA9IElTRDo6U0VYVExPQUQ7CisKKyAgICAgICAgICAvLyBTcGFyYyBpcyBiaWcgZW5kaWFuLCBzbyBhZGQgYW4gb2Zmc2V0IGJhc2VkIG9uIHRoZSBPYmplY3RWVC4KKyAgICAgICAgICB1bnNpZ25lZCBPZmZzZXQgPSA0LXN0ZDo6bWF4KDFVLCBPYmplY3RWVC5nZXRTaXplSW5CaXRzKCkvOCk7CisgICAgICAgICAgRklQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCBGSVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChPZmZzZXQsIE1WVDo6aTMyKSk7CisgICAgICAgICAgTG9hZCA9IERBRy5nZXRFeHRMb2FkKExvYWRPcCwgTVZUOjppMzIsIGRsLCBDaGFpbiwgRklQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE9iamVjdFZULCBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICAgIExvYWQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgT2JqZWN0VlQsIExvYWQpOworICAgICAgICB9CisgICAgICAgIEluVmFscy5wdXNoX2JhY2soTG9hZCk7CisgICAgICB9CisKKyAgICAgIEFyZ09mZnNldCArPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNVlQ6OmYzMjoKKyAgICAgIGlmICghSW5zW2ldLlVzZWQpIHsgICAgICAgICAgICAgICAgICAvLyBBcmd1bWVudCBpcyBkZWFkLgorICAgICAgICBpZiAoQ3VyQXJnUmVnIDwgQXJnUmVnRW5kKSArK0N1ckFyZ1JlZzsKKyAgICAgICAgSW5WYWxzLnB1c2hfYmFjayhEQUcuZ2V0VU5ERUYoT2JqZWN0VlQpKTsKKyAgICAgIH0gZWxzZSBpZiAoQ3VyQXJnUmVnIDwgQXJnUmVnRW5kKSB7ICAvLyBMaXZlcyBpbiBhbiBpbmNvbWluZyBHUFIKKyAgICAgICAgLy8gRlAgdmFsdWUgaXMgcGFzc2VkIGluIGFuIGludGVnZXIgcmVnaXN0ZXIuCisgICAgICAgIHVuc2lnbmVkIFZSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcigmU1A6OkludFJlZ3NSZWdDbGFzcyk7CisgICAgICAgIE1GLmdldFJlZ0luZm8oKS5hZGRMaXZlSW4oKkN1ckFyZ1JlZysrLCBWUmVnKTsKKyAgICAgICAgU0RWYWx1ZSBBcmcgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBWUmVnLCBNVlQ6OmkzMik7CisKKyAgICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6ZjMyLCBBcmcpOworICAgICAgICBJblZhbHMucHVzaF9iYWNrKEFyZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgRnJhbWVJZHggPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlRml4ZWRPYmplY3QoNCwgQXJnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIFNEVmFsdWUgRklQdHIgPSBEQUcuZ2V0RnJhbWVJbmRleChGcmFtZUlkeCwgTVZUOjppMzIpOworICAgICAgICBTRFZhbHVlIExvYWQgPSBEQUcuZ2V0TG9hZChNVlQ6OmYzMiwgZGwsIENoYWluLCBGSVB0ciwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgICAgSW5WYWxzLnB1c2hfYmFjayhMb2FkKTsKKyAgICAgIH0KKyAgICAgIEFyZ09mZnNldCArPSA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1WVDo6aTY0OgorICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICBpZiAoIUluc1tpXS5Vc2VkKSB7ICAgICAgICAgICAgICAgIC8vIEFyZ3VtZW50IGlzIGRlYWQuCisgICAgICAgIGlmIChDdXJBcmdSZWcgPCBBcmdSZWdFbmQpICsrQ3VyQXJnUmVnOworICAgICAgICBpZiAoQ3VyQXJnUmVnIDwgQXJnUmVnRW5kKSArK0N1ckFyZ1JlZzsKKyAgICAgICAgSW5WYWxzLnB1c2hfYmFjayhEQUcuZ2V0VU5ERUYoT2JqZWN0VlQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNEVmFsdWUgSGlWYWw7CisgICAgICAgIGlmIChDdXJBcmdSZWcgPCBBcmdSZWdFbmQpIHsgIC8vIExpdmVzIGluIGFuIGluY29taW5nIEdQUgorICAgICAgICAgIHVuc2lnbmVkIFZSZWdIaSA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKCZTUDo6SW50UmVnc1JlZ0NsYXNzKTsKKyAgICAgICAgICBNRi5nZXRSZWdJbmZvKCkuYWRkTGl2ZUluKCpDdXJBcmdSZWcrKywgVlJlZ0hpKTsKKyAgICAgICAgICBIaVZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWdIaSwgTVZUOjppMzIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludCBGcmFtZUlkeCA9IE1GLmdldEZyYW1lSW5mbygpLT5DcmVhdGVGaXhlZE9iamVjdCg0LCBBcmdPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgIFNEVmFsdWUgRklQdHIgPSBEQUcuZ2V0RnJhbWVJbmRleChGcmFtZUlkeCwgTVZUOjppMzIpOworICAgICAgICAgIEhpVmFsID0gREFHLmdldExvYWQoTVZUOjppMzIsIGRsLCBDaGFpbiwgRklQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICB9CisKKyAgICAgICAgU0RWYWx1ZSBMb1ZhbDsKKyAgICAgICAgaWYgKEN1ckFyZ1JlZyA8IEFyZ1JlZ0VuZCkgeyAgLy8gTGl2ZXMgaW4gYW4gaW5jb21pbmcgR1BSCisgICAgICAgICAgdW5zaWduZWQgVlJlZ0xvID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoJlNQOjpJbnRSZWdzUmVnQ2xhc3MpOworICAgICAgICAgIE1GLmdldFJlZ0luZm8oKS5hZGRMaXZlSW4oKkN1ckFyZ1JlZysrLCBWUmVnTG8pOworICAgICAgICAgIExvVmFsID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgVlJlZ0xvLCBNVlQ6OmkzMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IEZyYW1lSWR4ID0gTUYuZ2V0RnJhbWVJbmZvKCktPkNyZWF0ZUZpeGVkT2JqZWN0KDQsIEFyZ09mZnNldCs0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICBTRFZhbHVlIEZJUHRyID0gREFHLmdldEZyYW1lSW5kZXgoRnJhbWVJZHgsIE1WVDo6aTMyKTsKKyAgICAgICAgICBMb1ZhbCA9IERBRy5nZXRMb2FkKE1WVDo6aTMyLCBkbCwgQ2hhaW4sIEZJUHRyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbXBvc2UgdGhlIHR3byBoYWx2ZXMgdG9nZXRoZXIgaW50byBhbiBpNjQgdW5pdC4KKyAgICAgICAgU0RWYWx1ZSBXaG9sZVZhbHVlID0KKyAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1BBSVIsIGRsLCBNVlQ6Omk2NCwgTG9WYWwsIEhpVmFsKTsKKworICAgICAgICAvLyBJZiB3ZSB3YW50IGEgZG91YmxlLCBkbyBhIGJpdCBjb252ZXJ0LgorICAgICAgICBpZiAoT2JqZWN0VlQgPT0gTVZUOjpmNjQpCisgICAgICAgICAgV2hvbGVWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OmY2NCwgV2hvbGVWYWx1ZSk7CisKKyAgICAgICAgSW5WYWxzLnB1c2hfYmFjayhXaG9sZVZhbHVlKTsKKyAgICAgIH0KKyAgICAgIEFyZ09mZnNldCArPSA4OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gU3RvcmUgcmVtYWluaW5nIEFyZ1JlZ3MgdG8gdGhlIHN0YWNrIGlmIHRoaXMgaXMgYSB2YXJhcmdzIGZ1bmN0aW9uLgorICBpZiAoaXNWYXJBcmcpIHsKKyAgICAvLyBSZW1lbWJlciB0aGUgdmFyYXJnIG9mZnNldCBmb3IgdGhlIHZhX3N0YXJ0IGltcGxlbWVudGF0aW9uLgorICAgIEZ1bmNJbmZvLT5zZXRWYXJBcmdzRnJhbWVPZmZzZXQoQXJnT2Zmc2V0KTsKKworICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+IE91dENoYWluczsKKworICAgIGZvciAoOyBDdXJBcmdSZWcgIT0gQXJnUmVnRW5kOyArK0N1ckFyZ1JlZykgeworICAgICAgdW5zaWduZWQgVlJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKCZTUDo6SW50UmVnc1JlZ0NsYXNzKTsKKyAgICAgIE1GLmdldFJlZ0luZm8oKS5hZGRMaXZlSW4oKkN1ckFyZ1JlZywgVlJlZyk7CisgICAgICBTRFZhbHVlIEFyZyA9IERBRy5nZXRDb3B5RnJvbVJlZyhEQUcuZ2V0Um9vdCgpLCBkbCwgVlJlZywgTVZUOjppMzIpOworCisgICAgICBpbnQgRnJhbWVJZHggPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlRml4ZWRPYmplY3QoNCwgQXJnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgU0RWYWx1ZSBGSVB0ciA9IERBRy5nZXRGcmFtZUluZGV4KEZyYW1lSWR4LCBNVlQ6OmkzMik7CisKKyAgICAgIE91dENoYWlucy5wdXNoX2JhY2soREFHLmdldFN0b3JlKERBRy5nZXRSb290KCksIGRsLCBBcmcsIEZJUHRyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisgICAgICBBcmdPZmZzZXQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoIU91dENoYWlucy5lbXB0eSgpKSB7CisgICAgICBPdXRDaGFpbnMucHVzaF9iYWNrKENoYWluKTsKKyAgICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZPdXRDaGFpbnNbMF0sIE91dENoYWlucy5zaXplKCkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBDaGFpbjsKK30KKworU0RWYWx1ZQorU3BhcmNUYXJnZXRMb3dlcmluZzo6TG93ZXJDYWxsKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworICAvLyBTcGFyYyB0YXJnZXQgZG9lcyBub3QgeWV0IHN1cHBvcnQgdGFpbCBjYWxsIG9wdGltaXphdGlvbi4KKyAgaXNUYWlsQ2FsbCA9IGZhbHNlOworCisjaWYgMAorICAvLyBBbmFseXplIG9wZXJhbmRzIG9mIHRoZSBjYWxsLCBhc3NpZ25pbmcgbG9jYXRpb25zIHRvIGVhY2ggb3BlcmFuZC4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIERBRy5nZXRUYXJnZXQoKSwgQXJnTG9jcyk7CisgIENDSW5mby5BbmFseXplQ2FsbE9wZXJhbmRzKE91dHMsIENDX1NwYXJjMzIpOworCisgIC8vIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0Z29pbmcgYXJndW1lbnRzIHN0YWNrIHNwYWNlIHJlcXVpcmVtZW50LgorICB1bnNpZ25lZCBBcmdzU2l6ZSA9IENDSW5mby5nZXROZXh0U3RhY2tPZmZzZXQoKTsKKyAgLy8gRklYTUU6IFdlIGNhbid0IHVzZSB0aGlzIHVudGlsIGY2NCBpcyBrbm93biB0byB0YWtlIHR3byBHUFJzLgorI2Vsc2UKKyAgKHZvaWQpQ0NfU3BhcmMzMjsKKworICAvLyBDb3VudCB0aGUgc2l6ZSBvZiB0aGUgb3V0Z29pbmcgYXJndW1lbnRzLgorICB1bnNpZ25lZCBBcmdzU2l6ZSA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPdXRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBzd2l0Y2ggKE91dHNbaV0uVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB2YWx1ZSB0eXBlISIpOworICAgICAgY2FzZSBNVlQ6OmkxOgorICAgICAgY2FzZSBNVlQ6Omk4OgorICAgICAgY2FzZSBNVlQ6OmkxNjoKKyAgICAgIGNhc2UgTVZUOjppMzI6CisgICAgICBjYXNlIE1WVDo6ZjMyOgorICAgICAgICBBcmdzU2l6ZSArPSA0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppNjQ6CisgICAgICBjYXNlIE1WVDo6ZjY0OgorICAgICAgICBBcmdzU2l6ZSArPSA4OworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKEFyZ3NTaXplID4gNCo2KQorICAgIEFyZ3NTaXplIC09IDQqNjsgICAgLy8gU3BhY2UgZm9yIGZpcnN0IDYgYXJndW1lbnRzIGlzIHByZXJlc2VydmVkLgorICBlbHNlCisgICAgQXJnc1NpemUgPSAwOworI2VuZGlmCisKKyAgLy8gS2VlcCBzdGFjayBmcmFtZXMgOC1ieXRlIGFsaWduZWQuCisgIEFyZ3NTaXplID0gKEFyZ3NTaXplKzcpICYgfjc7CisKKyAgQ2hhaW4gPSBEQUcuZ2V0Q0FMTFNFUV9TVEFSVChDaGFpbiwgREFHLmdldEludFB0ckNvbnN0YW50KEFyZ3NTaXplLCB0cnVlKSk7CisKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBTRFZhbHVlPiwgOD4gUmVnc1RvUGFzczsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gTWVtT3BDaGFpbnM7CisKKyNpZiAwCisgIC8vIFdhbGsgdGhlIHJlZ2lzdGVyL21lbWxvYyBhc3NpZ25tZW50cywgaW5zZXJ0aW5nIGNvcGllcy9sb2Fkcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ0xvY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENDVmFsQXNzaWduICZWQSA9IEFyZ0xvY3NbaV07CisgICAgU0RWYWx1ZSBBcmcgPSBPdXRWYWxzW2ldOworCisgICAgLy8gUHJvbW90ZSB0aGUgdmFsdWUgaWYgbmVlZGVkLgorICAgIHN3aXRjaCAoVkEuZ2V0TG9jSW5mbygpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBsb2MgaW5mbyEiKTsKKyAgICBjYXNlIENDVmFsQXNzaWduOjpGdWxsOiBicmVhazsKKyAgICBjYXNlIENDVmFsQXNzaWduOjpTRXh0OgorICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgVkEuZ2V0TG9jVlQoKSwgQXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OlpFeHQ6CisgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6QUV4dDoKKyAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgVkEuZ2V0TG9jVlQoKSwgQXJnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEFyZ3VtZW50cyB0aGF0IGNhbiBiZSBwYXNzZWQgb24gcmVnaXN0ZXIgbXVzdCBiZSBrZXB0IGF0CisgICAgLy8gUmVnc1RvUGFzcyB2ZWN0b3IKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoVkEuZ2V0TG9jUmVnKCksIEFyZykpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgYXNzZXJ0KFZBLmlzTWVtTG9jKCkpOworCisgICAgLy8gQ3JlYXRlIGEgc3RvcmUgb2ZmIHRoZSBzdGFjayBwb2ludGVyIGZvciB0aGlzIGFyZ3VtZW50LgorICAgIFNEVmFsdWUgU3RhY2tQdHIgPSBEQUcuZ2V0UmVnaXN0ZXIoU1A6Ok82LCBNVlQ6OmkzMik7CisgICAgLy8gRklYTUU6IFZFUklGWSBUSEFUIDY4IElTIFJJR0hULgorICAgIFNEVmFsdWUgUHRyT2ZmID0gREFHLmdldEludFB0ckNvbnN0YW50KFZBLmdldExvY01lbU9mZnNldCgpKzY4KTsKKyAgICBQdHJPZmYgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgTVZUOjppMzIsIFN0YWNrUHRyLCBQdHJPZmYpOworICAgIE1lbU9wQ2hhaW5zLnB1c2hfYmFjayhEQUcuZ2V0U3RvcmUoQ2hhaW4sIEFyZywgUHRyT2ZmLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisgIH0KKworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEFyZ1JlZ3NbXSA9IHsKKyAgICBTUDo6STAsIFNQOjpJMSwgU1A6OkkyLCBTUDo6STMsIFNQOjpJNCwgU1A6Okk1CisgIH07CisgIHVuc2lnbmVkIEFyZ09mZnNldCA9IDY4OworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPdXRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBTRFZhbHVlIFZhbCA9IE91dFZhbHNbaV07CisgICAgRVZUIE9iamVjdFZUID0gT3V0c1tpXS5WVDsKKyAgICBTRFZhbHVlIFZhbFRvU3RvcmUoMCwgMCk7CisgICAgdW5zaWduZWQgT2JqU2l6ZTsKKyAgICBzd2l0Y2ggKE9iamVjdFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgYXJndW1lbnQgdHlwZSEiKTsKKyAgICBjYXNlIE1WVDo6aTMyOgorICAgICAgT2JqU2l6ZSA9IDQ7CisKKyAgICAgIGlmIChSZWdzVG9QYXNzLnNpemUoKSA+PSA2KSB7CisgICAgICAgIFZhbFRvU3RvcmUgPSBWYWw7CisgICAgICB9IGVsc2UgeworICAgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBcmdSZWdzW1JlZ3NUb1Bhc3Muc2l6ZSgpXSwgVmFsKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE1WVDo6ZjMyOgorICAgICAgT2JqU2l6ZSA9IDQ7CisgICAgICBpZiAoUmVnc1RvUGFzcy5zaXplKCkgPj0gNikgeworICAgICAgICBWYWxUb1N0b3JlID0gVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ29udmVydCB0aGlzIHRvIGEgRlAgdmFsdWUgaW4gYW4gaW50IHJlZy4KKyAgICAgICAgVmFsID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6aTMyLCBWYWwpOworICAgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBcmdSZWdzW1JlZ3NUb1Bhc3Muc2l6ZSgpXSwgVmFsKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE1WVDo6ZjY0OiB7CisgICAgICBPYmpTaXplID0gODsKKyAgICAgIGlmIChSZWdzVG9QYXNzLnNpemUoKSA+PSA2KSB7CisgICAgICAgIFZhbFRvU3RvcmUgPSBWYWw7ICAgIC8vIFdob2xlIHRoaW5nIGlzIHBhc3NlZCBpbiBtZW1vcnkuCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBCcmVhayBpbnRvIHRvcCBhbmQgYm90dG9tIHBhcnRzIGJ5IHN0b3JpbmcgdG8gdGhlIHN0YWNrIGFuZCBsb2FkaW5nCisgICAgICAvLyBvdXQgdGhlIHBhcnRzIGFzIGludGVnZXJzLiAgVG9wIHBhcnQgZ29lcyBpbiBhIHJlZy4KKyAgICAgIFNEVmFsdWUgU3RhY2tQdHIgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoTVZUOjpmNjQsIE1WVDo6aTMyKTsKKyAgICAgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbCwgU3RhY2tQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICAvLyBTcGFyYyBpcyBiaWctZW5kaWFuLCBzbyB0aGUgaGlnaCBwYXJ0IGNvbWVzIGZpcnN0LgorICAgICAgU0RWYWx1ZSBIaSA9IERBRy5nZXRMb2FkKE1WVDo6aTMyLCBkbCwgU3RvcmUsIFN0YWNrUHRyLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICAvLyBJbmNyZW1lbnQgdGhlIHBvaW50ZXIgdG8gdGhlIG90aGVyIGhhbGYuCisgICAgICBTdGFja1B0ciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgU3RhY2tQdHIuZ2V0VmFsdWVUeXBlKCksIFN0YWNrUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoNCkpOworICAgICAgLy8gTG9hZCB0aGUgbG93IHBhcnQuCisgICAgICBTRFZhbHVlIExvID0gREFHLmdldExvYWQoTVZUOjppMzIsIGRsLCBTdG9yZSwgU3RhY2tQdHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQXJnUmVnc1tSZWdzVG9QYXNzLnNpemUoKV0sIEhpKSk7CisKKyAgICAgIGlmIChSZWdzVG9QYXNzLnNpemUoKSA+PSA2KSB7CisgICAgICAgIFZhbFRvU3RvcmUgPSBMbzsKKyAgICAgICAgQXJnT2Zmc2V0ICs9IDQ7CisgICAgICAgIE9ialNpemUgPSA0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQXJnUmVnc1tSZWdzVG9QYXNzLnNpemUoKV0sIExvKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBNVlQ6Omk2NDogeworICAgICAgT2JqU2l6ZSA9IDg7CisgICAgICBpZiAoUmVnc1RvUGFzcy5zaXplKCkgPj0gNikgeworICAgICAgICBWYWxUb1N0b3JlID0gVmFsOyAgICAvLyBXaG9sZSB0aGluZyBpcyBwYXNzZWQgaW4gbWVtb3J5LgorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gU3BsaXQgdGhlIHZhbHVlIGludG8gdG9wIGFuZCBib3R0b20gcGFydC4gIFRvcCBwYXJ0IGdvZXMgaW4gYSByZWcuCisgICAgICBTRFZhbHVlIEhpID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTMyKSk7CisgICAgICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSk7CisgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBcmdSZWdzW1JlZ3NUb1Bhc3Muc2l6ZSgpXSwgSGkpKTsKKworICAgICAgaWYgKFJlZ3NUb1Bhc3Muc2l6ZSgpID49IDYpIHsKKyAgICAgICAgVmFsVG9TdG9yZSA9IExvOworICAgICAgICBBcmdPZmZzZXQgKz0gNDsKKyAgICAgICAgT2JqU2l6ZSA9IDQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBcmdSZWdzW1JlZ3NUb1Bhc3Muc2l6ZSgpXSwgTG8pKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICBpZiAoVmFsVG9TdG9yZS5nZXROb2RlKCkpIHsKKyAgICAgIFNEVmFsdWUgU3RhY2tQdHIgPSBEQUcuZ2V0UmVnaXN0ZXIoU1A6Ok82LCBNVlQ6OmkzMik7CisgICAgICBTRFZhbHVlIFB0ck9mZiA9IERBRy5nZXRDb25zdGFudChBcmdPZmZzZXQsIE1WVDo6aTMyKTsKKyAgICAgIFB0ck9mZiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppMzIsIFN0YWNrUHRyLCBQdHJPZmYpOworICAgICAgTWVtT3BDaGFpbnMucHVzaF9iYWNrKERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIFZhbFRvU3RvcmUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJPZmYsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCkpOworICAgIH0KKyAgICBBcmdPZmZzZXQgKz0gT2JqU2l6ZTsKKyAgfQorI2VuZGlmCisKKyAgLy8gRW1pdCBhbGwgc3RvcmVzLCBtYWtlIHN1cmUgdGhlIG9jY3VyIGJlZm9yZSBhbnkgY29waWVzIGludG8gcGh5c3JlZ3MuCisgIGlmICghTWVtT3BDaGFpbnMuZW1wdHkoKSkKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJk1lbU9wQ2hhaW5zWzBdLCBNZW1PcENoYWlucy5zaXplKCkpOworCisgIC8vIEJ1aWxkIGEgc2VxdWVuY2Ugb2YgY29weS10by1yZWcgbm9kZXMgY2hhaW5lZCB0b2dldGhlciB3aXRoIHRva2VuCisgIC8vIGNoYWluIGFuZCBmbGFnIG9wZXJhbmRzIHdoaWNoIGNvcHkgdGhlIG91dGdvaW5nIGFyZ3MgaW50byByZWdpc3RlcnMuCisgIC8vIFRoZSBJbkZsYWcgaW4gbmVjZXNzYXJ5IHNpbmNlIGFsbCBlbWl0ZWQgaW5zdHJ1Y3Rpb25zIG11c3QgYmUKKyAgLy8gc3R1Y2sgdG9nZXRoZXIuCisgIFNEVmFsdWUgSW5GbGFnOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gUmVnc1RvUGFzc1tpXS5maXJzdDsKKyAgICAvLyBSZW1hcCBJMC0+STcgLT4gTzAtPk83LgorICAgIGlmIChSZWcgPj0gU1A6OkkwICYmIFJlZyA8PSBTUDo6STcpCisgICAgICBSZWcgPSBSZWctU1A6OkkwK1NQOjpPMDsKKworICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFJlZywgUmVnc1RvUGFzc1tpXS5zZWNvbmQsIEluRmxhZyk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIH0KKworICAvLyBJZiB0aGUgY2FsbGVlIGlzIGEgR2xvYmFsQWRkcmVzcyBub2RlIChxdWl0ZSBjb21tb24sIGV2ZXJ5IGRpcmVjdCBjYWxsIGlzKQorICAvLyB0dXJuIGl0IGludG8gYSBUYXJnZXRHbG9iYWxBZGRyZXNzIG5vZGUgc28gdGhhdCBsZWdhbGl6ZSBkb2Vzbid0IGhhY2sgaXQuCisgIC8vIExpa2V3aXNlIEV4dGVybmFsU3ltYm9sIC0+IFRhcmdldEV4dGVybmFsU3ltYm9sLgorICBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KENhbGxlZSkpCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoRy0+Z2V0R2xvYmFsKCksIGRsLCBNVlQ6OmkzMik7CisgIGVsc2UgaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpFID0gZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKEUtPmdldFN5bWJvbCgpLCBNVlQ6OmkzMik7CisKKyAgc3RkOjp2ZWN0b3I8RVZUPiBOb2RlVHlzOworICBOb2RlVHlzLnB1c2hfYmFjayhNVlQ6Ok90aGVyKTsgICAvLyBSZXR1cm5zIGEgY2hhaW4KKyAgTm9kZVR5cy5wdXNoX2JhY2soTVZUOjpGbGFnKTsgICAgLy8gUmV0dXJucyBhIGZsYWcgZm9yIHJldHZhbCBjb3B5IHRvIHVzZS4KKyAgU0RWYWx1ZSBPcHNbXSA9IHsgQ2hhaW4sIENhbGxlZSwgSW5GbGFnIH07CisgIENoYWluID0gREFHLmdldE5vZGUoU1BJU0Q6OkNBTEwsIGRsLCBOb2RlVHlzLCBPcHMsIEluRmxhZy5nZXROb2RlKCkgPyAzIDogMik7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIENoYWluID0gREFHLmdldENBTExTRVFfRU5EKENoYWluLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoQXJnc1NpemUsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCwgdHJ1ZSksIEluRmxhZyk7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIEFzc2lnbiBsb2NhdGlvbnMgdG8gZWFjaCB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGNhbGwuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gUlZMb2NzOworICBDQ1N0YXRlIFJWSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIERBRy5nZXRUYXJnZXQoKSwKKyAgICAgICAgICAgICAgICAgUlZMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisKKyAgUlZJbmZvLkFuYWx5emVDYWxsUmVzdWx0KElucywgUmV0Q0NfU3BhcmMzMik7CisKKyAgLy8gQ29weSBhbGwgb2YgdGhlIHJlc3VsdCByZWdpc3RlcnMgb3V0IG9mIHRoZWlyIHNwZWNpZmllZCBwaHlzcmVnLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkgeworICAgIHVuc2lnbmVkIFJlZyA9IFJWTG9jc1tpXS5nZXRMb2NSZWcoKTsKKworICAgIC8vIFJlbWFwIEkwLT5JNyAtPiBPMC0+TzcuCisgICAgaWYgKFJlZyA+PSBTUDo6STAgJiYgUmVnIDw9IFNQOjpJNykKKyAgICAgIFJlZyA9IFJlZy1TUDo6STArU1A6Ok8wOworCisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlZMb2NzW2ldLmdldFZhbFZUKCksIEluRmxhZykuZ2V0VmFsdWUoMSk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMik7CisgICAgSW5WYWxzLnB1c2hfYmFjayhDaGFpbi5nZXRWYWx1ZSgwKSk7CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGFyZ2V0TG93ZXJpbmcgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBJbnRDb25kQ0NvZGVUb0lDQyAtIENvbnZlcnQgYSBEQUcgaW50ZWdlciBjb25kaXRpb24gY29kZSB0byBhIFNQQVJDIElDQworLy8vIGNvbmRpdGlvbi4KK3N0YXRpYyBTUENDOjpDb25kQ29kZXMgSW50Q29uZENDb2RlVG9JQ0MoSVNEOjpDb25kQ29kZSBDQykgeworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW50ZWdlciBjb25kaXRpb24gY29kZSEiKTsKKyAgY2FzZSBJU0Q6OlNFVEVROiAgcmV0dXJuIFNQQ0M6OklDQ19FOworICBjYXNlIElTRDo6U0VUTkU6ICByZXR1cm4gU1BDQzo6SUNDX05FOworICBjYXNlIElTRDo6U0VUTFQ6ICByZXR1cm4gU1BDQzo6SUNDX0w7CisgIGNhc2UgSVNEOjpTRVRHVDogIHJldHVybiBTUENDOjpJQ0NfRzsKKyAgY2FzZSBJU0Q6OlNFVExFOiAgcmV0dXJuIFNQQ0M6OklDQ19MRTsKKyAgY2FzZSBJU0Q6OlNFVEdFOiAgcmV0dXJuIFNQQ0M6OklDQ19HRTsKKyAgY2FzZSBJU0Q6OlNFVFVMVDogcmV0dXJuIFNQQ0M6OklDQ19DUzsKKyAgY2FzZSBJU0Q6OlNFVFVMRTogcmV0dXJuIFNQQ0M6OklDQ19MRVU7CisgIGNhc2UgSVNEOjpTRVRVR1Q6IHJldHVybiBTUENDOjpJQ0NfR1U7CisgIGNhc2UgSVNEOjpTRVRVR0U6IHJldHVybiBTUENDOjpJQ0NfQ0M7CisgIH0KK30KKworLy8vIEZQQ29uZENDb2RlVG9GQ0MgLSBDb252ZXJ0IGEgREFHIGZsb2F0aW5ncCBvaW50IGNvbmRpdGlvbiBjb2RlIHRvIGEgU1BBUkMKKy8vLyBGQ0MgY29uZGl0aW9uLgorc3RhdGljIFNQQ0M6OkNvbmRDb2RlcyBGUENvbmRDQ29kZVRvRkNDKElTRDo6Q29uZENvZGUgQ0MpIHsKKyAgc3dpdGNoIChDQykgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGZwIGNvbmRpdGlvbiBjb2RlISIpOworICBjYXNlIElTRDo6U0VURVE6CisgIGNhc2UgSVNEOjpTRVRPRVE6IHJldHVybiBTUENDOjpGQ0NfRTsKKyAgY2FzZSBJU0Q6OlNFVE5FOgorICBjYXNlIElTRDo6U0VUVU5FOiByZXR1cm4gU1BDQzo6RkNDX05FOworICBjYXNlIElTRDo6U0VUTFQ6CisgIGNhc2UgSVNEOjpTRVRPTFQ6IHJldHVybiBTUENDOjpGQ0NfTDsKKyAgY2FzZSBJU0Q6OlNFVEdUOgorICBjYXNlIElTRDo6U0VUT0dUOiByZXR1cm4gU1BDQzo6RkNDX0c7CisgIGNhc2UgSVNEOjpTRVRMRToKKyAgY2FzZSBJU0Q6OlNFVE9MRTogcmV0dXJuIFNQQ0M6OkZDQ19MRTsKKyAgY2FzZSBJU0Q6OlNFVEdFOgorICBjYXNlIElTRDo6U0VUT0dFOiByZXR1cm4gU1BDQzo6RkNDX0dFOworICBjYXNlIElTRDo6U0VUVUxUOiByZXR1cm4gU1BDQzo6RkNDX1VMOworICBjYXNlIElTRDo6U0VUVUxFOiByZXR1cm4gU1BDQzo6RkNDX1VMRTsKKyAgY2FzZSBJU0Q6OlNFVFVHVDogcmV0dXJuIFNQQ0M6OkZDQ19VRzsKKyAgY2FzZSBJU0Q6OlNFVFVHRTogcmV0dXJuIFNQQ0M6OkZDQ19VR0U7CisgIGNhc2UgSVNEOjpTRVRVTzogIHJldHVybiBTUENDOjpGQ0NfVTsKKyAgY2FzZSBJU0Q6OlNFVE86ICAgcmV0dXJuIFNQQ0M6OkZDQ19POworICBjYXNlIElTRDo6U0VUT05FOiByZXR1cm4gU1BDQzo6RkNDX0xHOworICBjYXNlIElTRDo6U0VUVUVROiByZXR1cm4gU1BDQzo6RkNDX1VFOworICB9Cit9CisKK1NwYXJjVGFyZ2V0TG93ZXJpbmc6OlNwYXJjVGFyZ2V0TG93ZXJpbmcoVGFyZ2V0TWFjaGluZSAmVE0pCisgIDogVGFyZ2V0TG93ZXJpbmcoVE0sIG5ldyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEYoKSkgeworCisgIC8vIFNldCB1cCB0aGUgcmVnaXN0ZXIgY2xhc3Nlcy4KKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmkzMiwgU1A6OkludFJlZ3NSZWdpc3RlckNsYXNzKTsKKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmYzMiwgU1A6OkZQUmVnc1JlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjY0LCBTUDo6REZQUmVnc1JlZ2lzdGVyQ2xhc3MpOworCisgIC8vIFR1cm4gRlAgZXh0bG9hZCBpbnRvIGxvYWQvZmV4dGVuZAorICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6RVhUTE9BRCwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIC8vIFNwYXJjIGRvZXNuJ3QgaGF2ZSBpMSBzaWduIGV4dGVuZGluZyBsb2FkCisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpTRVhUTE9BRCwgTVZUOjppMSwgUHJvbW90ZSk7CisgIC8vIFR1cm4gRlAgdHJ1bmNzdG9yZSBpbnRvIHRydW5jICsgc3RvcmUuCisgIHNldFRydW5jU3RvcmVBY3Rpb24oTVZUOjpmNjQsIE1WVDo6ZjMyLCBFeHBhbmQpOworCisgIC8vIEN1c3RvbSBsZWdhbGl6ZSBHbG9iYWxBZGRyZXNzIG5vZGVzIGludG8gTE8vSEkgcGFydHMuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbEFkZHJlc3MsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxUTFNBZGRyZXNzLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q29uc3RhbnRQb29sICwgTVZUOjppMzIsIEN1c3RvbSk7CisKKyAgLy8gU3BhcmMgZG9lc24ndCBoYXZlIHNleHRfaW5yZWcsIHJlcGxhY2UgdGhlbSB3aXRoIHNobC9zcmEKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTE2LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSUdOX0VYVEVORF9JTlJFRywgTVZUOjppOCAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBNVlQ6OmkxICwgRXhwYW5kKTsKKworICAvLyBTcGFyYyBoYXMgbm8gUkVNIG9yIERJVlJFTSBvcGVyYXRpb25zLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVZSRU0sIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWUkVNLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKworICAvLyBDdXN0b20gZXhwYW5kIGZwPC0+c2ludAorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19TSU5ULCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCwgTVZUOjppMzIsIEN1c3RvbSk7CisKKyAgLy8gRXhwYW5kIGZwPC0+dWludAorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5ULCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUlOVF9UT19GUCwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCSVRfQ09OVkVSVCwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgLy8gU3BhcmMgaGFzIG5vIHNlbGVjdCBvciBzZXRjYzogZXhwYW5kIHRvIFNFTEVDVF9DQy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MsIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRVRDQywgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFVENDLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKworICAvLyBTcGFyYyBkb2Vzbid0IGhhdmUgQlJDT05EIGVpdGhlciwgaXQgaGFzIEJSX0NDLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUkNPTkQsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSSU5ELCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUl9KVCwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJfQ0MsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUl9DQywgTVZUOjpmMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0NDLCBNVlQ6OmY2NCwgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIE1WVDo6ZjMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIE1WVDo6ZjY0LCBDdXN0b20pOworCisgIC8vIFNQQVJDIGhhcyBubyBpbnRyaW5zaWNzIGZvciB0aGVzZSBwYXJ0aWN1bGFyIG9wZXJhdGlvbnMuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1FTUJBUlJJRVIsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNJTiAsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TICwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSRU0gLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNJTiAsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TICwgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSRU0gLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AsIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFRaICwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUTFogLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Uk9UTCAsIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RSICwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJTV0FQLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBPVyAsIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUE9XICwgTVZUOjpmMzIsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0hMX1BBUlRTLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JBX1BBUlRTLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JMX1BBUlRTLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKworICAvLyBGSVhNRTogU3BhcmMgcHJvdmlkZXMgdGhlc2UgbXVsdGlwbGllcywgYnV0IHdlIGRvbid0IGhhdmUgdGhlbSB5ZXQuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVNVUxfTE9ISSwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNNVUxfTE9ISSwgTVZUOjppMzIsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RUhfTEFCRUwsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisKKyAgLy8gVkFTVEFSVCBuZWVkcyB0byBiZSBjdXN0b20gbG93ZXJlZCB0byB1c2UgdGhlIFZhckFyZ3NGcmFtZUluZGV4LgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQVNUQVJUICAgICAgICAgICAsIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisgIC8vIFZBQVJHIG5lZWRzIHRvIGJlIGxvd2VyZWQgdG8gbm90IGRvIHVuYWxpZ25lZCBhY2Nlc3NlcyBmb3IgZG91Ymxlcy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFBUkcgICAgICAgICAgICAgLCBNVlQ6Ok90aGVyLCBDdXN0b20pOworCisgIC8vIFVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFDT1BZICAgICAgICAgICAgLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQUVORCAgICAgICAgICAgICAsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUQUNLU0FWRSAgICAgICAgICwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RBQ0tSRVNUT1JFICAgICAgLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0MsIE1WVDo6aTMyICAsIEN1c3RvbSk7CisKKyAgLy8gTm8gZGVidWcgaW5mbyBzdXBwb3J0IHlldC4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RUhfTEFCRUwsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisKKyAgc2V0U3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlKFNQOjpPNik7CisKKyAgaWYgKFRNLmdldFN1YnRhcmdldDxTcGFyY1N1YnRhcmdldD4oKS5pc1Y5KCkpCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AsIE1WVDo6aTMyLCBMZWdhbCk7CisKKyAgY29tcHV0ZVJlZ2lzdGVyUHJvcGVydGllcygpOworfQorCitjb25zdCBjaGFyICpTcGFyY1RhcmdldExvd2VyaW5nOjpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogcmV0dXJuIDA7CisgIGNhc2UgU1BJU0Q6OkNNUElDQzogICAgIHJldHVybiAiU1BJU0Q6OkNNUElDQyI7CisgIGNhc2UgU1BJU0Q6OkNNUEZDQzogICAgIHJldHVybiAiU1BJU0Q6OkNNUEZDQyI7CisgIGNhc2UgU1BJU0Q6OkJSSUNDOiAgICAgIHJldHVybiAiU1BJU0Q6OkJSSUNDIjsKKyAgY2FzZSBTUElTRDo6QlJGQ0M6ICAgICAgcmV0dXJuICJTUElTRDo6QlJGQ0MiOworICBjYXNlIFNQSVNEOjpTRUxFQ1RfSUNDOiByZXR1cm4gIlNQSVNEOjpTRUxFQ1RfSUNDIjsKKyAgY2FzZSBTUElTRDo6U0VMRUNUX0ZDQzogcmV0dXJuICJTUElTRDo6U0VMRUNUX0ZDQyI7CisgIGNhc2UgU1BJU0Q6OkhpOiAgICAgICAgIHJldHVybiAiU1BJU0Q6OkhpIjsKKyAgY2FzZSBTUElTRDo6TG86ICAgICAgICAgcmV0dXJuICJTUElTRDo6TG8iOworICBjYXNlIFNQSVNEOjpGVE9JOiAgICAgICByZXR1cm4gIlNQSVNEOjpGVE9JIjsKKyAgY2FzZSBTUElTRDo6SVRPRjogICAgICAgcmV0dXJuICJTUElTRDo6SVRPRiI7CisgIGNhc2UgU1BJU0Q6OkNBTEw6ICAgICAgIHJldHVybiAiU1BJU0Q6OkNBTEwiOworICBjYXNlIFNQSVNEOjpSRVRfRkxBRzogICByZXR1cm4gIlNQSVNEOjpSRVRfRkxBRyI7CisgIH0KK30KKworLy8vIGlzTWFza2VkVmFsdWVaZXJvRm9yVGFyZ2V0Tm9kZSAtIFJldHVybiB0cnVlIGlmICdPcCAmIE1hc2snIGlzIGtub3duIHRvCisvLy8gYmUgemVyby4gT3AgaXMgZXhwZWN0ZWQgdG8gYmUgYSB0YXJnZXQgc3BlY2lmaWMgbm9kZS4gVXNlZCBieSBEQUcKKy8vLyBjb21iaW5lci4KK3ZvaWQgU3BhcmNUYXJnZXRMb3dlcmluZzo6Y29tcHV0ZU1hc2tlZEJpdHNGb3JUYXJnZXROb2RlKGNvbnN0IFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSBjb25zdCB7CisgIEFQSW50IEtub3duWmVybzIsIEtub3duT25lMjsKKyAgS25vd25aZXJvID0gS25vd25PbmUgPSBBUEludChNYXNrLmdldEJpdFdpZHRoKCksIDApOyAgIC8vIERvbid0IGtub3cgYW55dGhpbmcuCisKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBTUElTRDo6U0VMRUNUX0lDQzoKKyAgY2FzZSBTUElTRDo6U0VMRUNUX0ZDQzoKKyAgICBEQUcuQ29tcHV0ZU1hc2tlZEJpdHMoT3AuZ2V0T3BlcmFuZCgxKSwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwdGgrMSk7CisgICAgREFHLkNvbXB1dGVNYXNrZWRCaXRzKE9wLmdldE9wZXJhbmQoMCksIE1hc2ssIEtub3duWmVybzIsIEtub3duT25lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwdGgrMSk7CisgICAgYXNzZXJ0KChLbm93blplcm8gJiBLbm93bk9uZSkgPT0gMCAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7CisgICAgYXNzZXJ0KChLbm93blplcm8yICYgS25vd25PbmUyKSA9PSAwICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsKKworICAgIC8vIE9ubHkga25vd24gaWYga25vd24gaW4gYm90aCB0aGUgTEhTIGFuZCBSSFMuCisgICAgS25vd25PbmUgJj0gS25vd25PbmUyOworICAgIEtub3duWmVybyAmPSBLbm93blplcm8yOworICAgIGJyZWFrOworICB9Cit9CisKKy8vIExvb2sgYXQgTEhTL1JIUy9DQyBhbmQgc2VlIGlmIHRoZXkgYXJlIGEgbG93ZXJlZCBzZXRjYyBpbnN0cnVjdGlvbi4gIElmIHNvCisvLyBzZXQgTEhTL1JIUyBhbmQgU1BDQyB0byB0aGUgTEhTL1JIUyBvZiB0aGUgc2V0Y2MgYW5kIFNQQ0MgdG8gdGhlIGNvbmRpdGlvbi4KK3N0YXRpYyB2b2lkIExvb2tUaHJvdWdoU2V0Q0MoU0RWYWx1ZSAmTEhTLCBTRFZhbHVlICZSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Q29uZENvZGUgQ0MsIHVuc2lnbmVkICZTUENDKSB7CisgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KFJIUykgJiYKKyAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KFJIUyktPmlzTnVsbFZhbHVlKCkgJiYKKyAgICAgIENDID09IElTRDo6U0VUTkUgJiYKKyAgICAgICgoTEhTLmdldE9wY29kZSgpID09IFNQSVNEOjpTRUxFQ1RfSUNDICYmCisgICAgICAgIExIUy5nZXRPcGVyYW5kKDMpLmdldE9wY29kZSgpID09IFNQSVNEOjpDTVBJQ0MpIHx8CisgICAgICAgKExIUy5nZXRPcGNvZGUoKSA9PSBTUElTRDo6U0VMRUNUX0ZDQyAmJgorICAgICAgICBMSFMuZ2V0T3BlcmFuZCgzKS5nZXRPcGNvZGUoKSA9PSBTUElTRDo6Q01QRkNDKSkgJiYKKyAgICAgIGlzYTxDb25zdGFudFNETm9kZT4oTEhTLmdldE9wZXJhbmQoMCkpICYmCisgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KExIUy5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTEhTLmdldE9wZXJhbmQoMCkpLT5pc09uZSgpICYmCisgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihMSFMuZ2V0T3BlcmFuZCgxKSktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICBTRFZhbHVlIENNUENDID0gTEhTLmdldE9wZXJhbmQoMyk7CisgICAgU1BDQyA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KExIUy5nZXRPcGVyYW5kKDIpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgTEhTID0gQ01QQ0MuZ2V0T3BlcmFuZCgwKTsKKyAgICBSSFMgPSBDTVBDQy5nZXRPcGVyYW5kKDEpOworICB9Cit9CisKK1NEVmFsdWUgU3BhcmNUYXJnZXRMb3dlcmluZzo6TG93ZXJHbG9iYWxBZGRyZXNzKFNEVmFsdWUgT3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihPcCktPmdldEdsb2JhbCgpOworICAvLyBGSVhNRSB0aGVyZSBpc24ndCByZWFsbHkgYW55IGRlYnVnIGluZm8gaGVyZQorICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgR0EgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgZGwsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKFNQSVNEOjpIaSwgZGwsIE1WVDo6aTMyLCBHQSk7CisgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Tm9kZShTUElTRDo6TG8sIGRsLCBNVlQ6OmkzMiwgR0EpOworCisgIGlmIChnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgIT0gUmVsb2M6OlBJQ18pIAorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCBMbywgSGkpOworICAKKyAgU0RWYWx1ZSBHbG9iYWxCYXNlID0gREFHLmdldE5vZGUoU1BJU0Q6OkdMT0JBTF9CQVNFX1JFRywgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBvaW50ZXJUeSgpKTsKKyAgU0RWYWx1ZSBSZWxBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgTG8sIEhpKTsKKyAgU0RWYWx1ZSBBYnNBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbEJhc2UsIFJlbEFkZHIpOworICByZXR1cm4gREFHLmdldExvYWQoZ2V0UG9pbnRlclR5KCksIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksIAorICAgICAgICAgICAgICAgICAgICAgQWJzQWRkciwgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKK30KKworU0RWYWx1ZSBTcGFyY1RhcmdldExvd2VyaW5nOjpMb3dlckNvbnN0YW50UG9vbChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBDb25zdGFudFBvb2xTRE5vZGUgKk4gPSBjYXN0PENvbnN0YW50UG9vbFNETm9kZT4oT3ApOworICAvLyBGSVhNRSB0aGVyZSBpc24ndCByZWFsbHkgYW55IGRlYnVnIGluZm8gaGVyZQorICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGNvbnN0IENvbnN0YW50ICpDID0gTi0+Z2V0Q29uc3RWYWwoKTsKKyAgU0RWYWx1ZSBDUCA9IERBRy5nZXRUYXJnZXRDb25zdGFudFBvb2woQywgTVZUOjppMzIsIE4tPmdldEFsaWdubWVudCgpKTsKKyAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKFNQSVNEOjpIaSwgZGwsIE1WVDo6aTMyLCBDUCk7CisgIFNEVmFsdWUgTG8gPSBEQUcuZ2V0Tm9kZShTUElTRDo6TG8sIGRsLCBNVlQ6OmkzMiwgQ1ApOworICBpZiAoZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFJlbG9jYXRpb25Nb2RlbCgpICE9IFJlbG9jOjpQSUNfKSAKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgTG8sIEhpKTsKKworICBTRFZhbHVlIEdsb2JhbEJhc2UgPSBEQUcuZ2V0Tm9kZShTUElTRDo6R0xPQkFMX0JBU0VfUkVHLCBkbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBvaW50ZXJUeSgpKTsKKyAgU0RWYWx1ZSBSZWxBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgTG8sIEhpKTsKKyAgU0RWYWx1ZSBBYnNBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsQmFzZSwgUmVsQWRkcik7CisgIHJldHVybiBEQUcuZ2V0TG9hZChnZXRQb2ludGVyVHkoKSwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwgCisgICAgICAgICAgICAgICAgICAgICBBYnNBZGRyLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworfQorCitzdGF0aWMgU0RWYWx1ZSBMb3dlckZQX1RPX1NJTlQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICAvLyBDb252ZXJ0IHRoZSBmcCB2YWx1ZSB0byBpbnRlZ2VyIGluIGFuIEZQIHJlZ2lzdGVyLgorICBhc3NlcnQoT3AuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIpOworICBPcCA9IERBRy5nZXROb2RlKFNQSVNEOjpGVE9JLCBkbCwgTVZUOjpmMzIsIE9wLmdldE9wZXJhbmQoMCkpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6aTMyLCBPcCk7Cit9CisKK3N0YXRpYyBTRFZhbHVlIExvd2VyU0lOVF9UT19GUChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGFzc2VydChPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBUbXAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjpmMzIsIE9wLmdldE9wZXJhbmQoMCkpOworICAvLyBDb252ZXJ0IHRoZSBpbnQgdmFsdWUgdG8gRlAgaW4gYW4gRlAgcmVnaXN0ZXIuCisgIHJldHVybiBEQUcuZ2V0Tm9kZShTUElTRDo6SVRPRiwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLCBUbXApOworfQorCitzdGF0aWMgU0RWYWx1ZSBMb3dlckJSX0NDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmdldCgpOworICBTRFZhbHVlIExIUyA9IE9wLmdldE9wZXJhbmQoMik7CisgIFNEVmFsdWUgUkhTID0gT3AuZ2V0T3BlcmFuZCgzKTsKKyAgU0RWYWx1ZSBEZXN0ID0gT3AuZ2V0T3BlcmFuZCg0KTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICB1bnNpZ25lZCBPcGMsIFNQQ0MgPSB+MFU7CisKKyAgLy8gSWYgdGhpcyBpcyBhIGJyX2NjIG9mIGEgInNldGNjIiwgYW5kIGlmIHRoZSBzZXRjYyBnb3QgbG93ZXJlZCBpbnRvCisgIC8vIGFuIENNUFtJRl1DQy9TRUxFQ1RfW0lGXUNDIHBhaXIsIGZpbmQgdGhlIG9yaWdpbmFsIGNvbXBhcmVkIHZhbHVlcy4KKyAgTG9va1Rocm91Z2hTZXRDQyhMSFMsIFJIUywgQ0MsIFNQQ0MpOworCisgIC8vIEdldCB0aGUgY29uZGl0aW9uIGZsYWcuCisgIFNEVmFsdWUgQ29tcGFyZUZsYWc7CisgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIpIHsKKyAgICBzdGQ6OnZlY3RvcjxFVlQ+IFZUczsKKyAgICBWVHMucHVzaF9iYWNrKE1WVDo6aTMyKTsKKyAgICBWVHMucHVzaF9iYWNrKE1WVDo6RmxhZyk7CisgICAgU0RWYWx1ZSBPcHNbMl0gPSB7IExIUywgUkhTIH07CisgICAgQ29tcGFyZUZsYWcgPSBEQUcuZ2V0Tm9kZShTUElTRDo6Q01QSUNDLCBkbCwgVlRzLCBPcHMsIDIpLmdldFZhbHVlKDEpOworICAgIGlmIChTUENDID09IH4wVSkgU1BDQyA9IEludENvbmRDQ29kZVRvSUNDKENDKTsKKyAgICBPcGMgPSBTUElTRDo6QlJJQ0M7CisgIH0gZWxzZSB7CisgICAgQ29tcGFyZUZsYWcgPSBEQUcuZ2V0Tm9kZShTUElTRDo6Q01QRkNDLCBkbCwgTVZUOjpGbGFnLCBMSFMsIFJIUyk7CisgICAgaWYgKFNQQ0MgPT0gfjBVKSBTUENDID0gRlBDb25kQ0NvZGVUb0ZDQyhDQyk7CisgICAgT3BjID0gU1BJU0Q6OkJSRkNDOworICB9CisgIHJldHVybiBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbiwgRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChTUENDLCBNVlQ6OmkzMiksIENvbXBhcmVGbGFnKTsKK30KKworc3RhdGljIFNEVmFsdWUgTG93ZXJTRUxFQ1RfQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgU0RWYWx1ZSBMSFMgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFJIUyA9IE9wLmdldE9wZXJhbmQoMSk7CisgIElTRDo6Q29uZENvZGUgQ0MgPSBjYXN0PENvbmRDb2RlU0ROb2RlPihPcC5nZXRPcGVyYW5kKDQpKS0+Z2V0KCk7CisgIFNEVmFsdWUgVHJ1ZVZhbCA9IE9wLmdldE9wZXJhbmQoMik7CisgIFNEVmFsdWUgRmFsc2VWYWwgPSBPcC5nZXRPcGVyYW5kKDMpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIHVuc2lnbmVkIE9wYywgU1BDQyA9IH4wVTsKKworICAvLyBJZiB0aGlzIGlzIGEgc2VsZWN0X2NjIG9mIGEgInNldGNjIiwgYW5kIGlmIHRoZSBzZXRjYyBnb3QgbG93ZXJlZCBpbnRvCisgIC8vIGFuIENNUFtJRl1DQy9TRUxFQ1RfW0lGXUNDIHBhaXIsIGZpbmQgdGhlIG9yaWdpbmFsIGNvbXBhcmVkIHZhbHVlcy4KKyAgTG9va1Rocm91Z2hTZXRDQyhMSFMsIFJIUywgQ0MsIFNQQ0MpOworCisgIFNEVmFsdWUgQ29tcGFyZUZsYWc7CisgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIpIHsKKyAgICBzdGQ6OnZlY3RvcjxFVlQ+IFZUczsKKyAgICBWVHMucHVzaF9iYWNrKExIUy5nZXRWYWx1ZVR5cGUoKSk7ICAgLy8gc3ViY2MgcmV0dXJucyBhIHZhbHVlCisgICAgVlRzLnB1c2hfYmFjayhNVlQ6OkZsYWcpOworICAgIFNEVmFsdWUgT3BzWzJdID0geyBMSFMsIFJIUyB9OworICAgIENvbXBhcmVGbGFnID0gREFHLmdldE5vZGUoU1BJU0Q6OkNNUElDQywgZGwsIFZUcywgT3BzLCAyKS5nZXRWYWx1ZSgxKTsKKyAgICBPcGMgPSBTUElTRDo6U0VMRUNUX0lDQzsKKyAgICBpZiAoU1BDQyA9PSB+MFUpIFNQQ0MgPSBJbnRDb25kQ0NvZGVUb0lDQyhDQyk7CisgIH0gZWxzZSB7CisgICAgQ29tcGFyZUZsYWcgPSBEQUcuZ2V0Tm9kZShTUElTRDo6Q01QRkNDLCBkbCwgTVZUOjpGbGFnLCBMSFMsIFJIUyk7CisgICAgT3BjID0gU1BJU0Q6OlNFTEVDVF9GQ0M7CisgICAgaWYgKFNQQ0MgPT0gfjBVKSBTUENDID0gRlBDb25kQ0NvZGVUb0ZDQyhDQyk7CisgIH0KKyAgcmV0dXJuIERBRy5nZXROb2RlKE9wYywgZGwsIFRydWVWYWwuZ2V0VmFsdWVUeXBlKCksIFRydWVWYWwsIEZhbHNlVmFsLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFNQQ0MsIE1WVDo6aTMyKSwgQ29tcGFyZUZsYWcpOworfQorCitzdGF0aWMgU0RWYWx1ZSBMb3dlclZBU1RBUlQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcmNUYXJnZXRMb3dlcmluZyAmVExJKSB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIFNwYXJjTWFjaGluZUZ1bmN0aW9uSW5mbyAqRnVuY0luZm8gPSBNRi5nZXRJbmZvPFNwYXJjTWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKworICAvLyB2YXN0YXJ0IGp1c3Qgc3RvcmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBWYXJBcmdzRnJhbWVJbmRleCBzbG90IGludG8gdGhlCisgIC8vIG1lbW9yeSBsb2NhdGlvbiBhcmd1bWVudC4KKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIE9mZnNldCA9CisgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICBEQUcuZ2V0UmVnaXN0ZXIoU1A6Okk2LCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEZ1bmNJbmZvLT5nZXRWYXJBcmdzRnJhbWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpKTsKKyAgY29uc3QgVmFsdWUgKlNWID0gY2FzdDxTcmNWYWx1ZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCgyKSktPmdldFZhbHVlKCk7CisgIHJldHVybiBEQUcuZ2V0U3RvcmUoT3AuZ2V0T3BlcmFuZCgwKSwgZGwsIE9mZnNldCwgT3AuZ2V0T3BlcmFuZCgxKSwgU1YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKK30KKworc3RhdGljIFNEVmFsdWUgTG93ZXJWQUFSRyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgeworICBTRE5vZGUgKk5vZGUgPSBPcC5nZXROb2RlKCk7CisgIEVWVCBWVCA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgU0RWYWx1ZSBJbkNoYWluID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBWQUxpc3RQdHIgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworICBjb25zdCBWYWx1ZSAqU1YgPSBjYXN0PFNyY1ZhbHVlU0ROb2RlPihOb2RlLT5nZXRPcGVyYW5kKDIpKS0+Z2V0VmFsdWUoKTsKKyAgRGVidWdMb2MgZGwgPSBOb2RlLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIFZBTGlzdCA9IERBRy5nZXRMb2FkKE1WVDo6aTMyLCBkbCwgSW5DaGFpbiwgVkFMaXN0UHRyLCBTViwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAvLyBJbmNyZW1lbnQgdGhlIHBvaW50ZXIsIFZBTGlzdCwgdG8gdGhlIG5leHQgdmFhcmcKKyAgU0RWYWx1ZSBOZXh0UHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgVkFMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChWVC5nZXRTaXplSW5CaXRzKCkvOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpKTsKKyAgLy8gU3RvcmUgdGhlIGluY3JlbWVudGVkIFZBTGlzdCB0byB0aGUgbGVnYWxpemVkIHBvaW50ZXIKKyAgSW5DaGFpbiA9IERBRy5nZXRTdG9yZShWQUxpc3QuZ2V0VmFsdWUoMSksIGRsLCBOZXh0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZBTGlzdFB0ciwgU1YsIDAsIGZhbHNlLCBmYWxzZSwgMCk7CisgIC8vIExvYWQgdGhlIGFjdHVhbCBhcmd1bWVudCBvdXQgb2YgdGhlIHBvaW50ZXIgVkFMaXN0LCB1bmxlc3MgdGhpcyBpcyBhbgorICAvLyBmNjQgbG9hZC4KKyAgaWYgKFZUICE9IE1WVDo6ZjY0KQorICAgIHJldHVybiBEQUcuZ2V0TG9hZChWVCwgZGwsIEluQ2hhaW4sIFZBTGlzdCwgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAvLyBPdGhlcndpc2UsIGxvYWQgaXQgYXMgaTY0LCB0aGVuIGRvIGEgYml0Y29udmVydC4KKyAgU0RWYWx1ZSBWID0gREFHLmdldExvYWQoTVZUOjppNjQsIGRsLCBJbkNoYWluLCBWQUxpc3QsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgLy8gQml0LUNvbnZlcnQgdGhlIHZhbHVlIHRvIGY2NC4KKyAgU0RWYWx1ZSBPcHNbMl0gPSB7CisgICAgREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6ZjY0LCBWKSwKKyAgICBWLmdldFZhbHVlKDEpCisgIH07CisgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMoT3BzLCAyLCBkbCk7Cit9CisKK3N0YXRpYyBTRFZhbHVlIExvd2VyRFlOQU1JQ19TVEFDS0FMTE9DKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOyAgLy8gTGVnYWxpemUgdGhlIGNoYWluLgorICBTRFZhbHVlIFNpemUgID0gT3AuZ2V0T3BlcmFuZCgxKTsgIC8vIExlZ2FsaXplIHRoZSBzaXplLgorICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgdW5zaWduZWQgU1BSZWcgPSBTUDo6TzY7CisgIFNEVmFsdWUgU1AgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBTUFJlZywgTVZUOjppMzIpOworICBTRFZhbHVlIE5ld1NQID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBNVlQ6OmkzMiwgU1AsIFNpemUpOyAvLyBWYWx1ZQorICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoU1AuZ2V0VmFsdWUoMSksIGRsLCBTUFJlZywgTmV3U1ApOyAgICAvLyBPdXRwdXQgY2hhaW4KKworICAvLyBUaGUgcmVzdWx0YW50IHBvaW50ZXIgaXMgYWN0dWFsbHkgMTYgd29yZHMgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBzdGFjaywKKyAgLy8gdG8gcHJvdmlkZSBhIHJlZ2lzdGVyIHNwaWxsIGFyZWEuCisgIFNEVmFsdWUgTmV3VmFsID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgTmV3U1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoOTYsIE1WVDo6aTMyKSk7CisgIFNEVmFsdWUgT3BzWzJdID0geyBOZXdWYWwsIENoYWluIH07CisgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMoT3BzLCAyLCBkbCk7Cit9CisKKworU0RWYWx1ZSBTcGFyY1RhcmdldExvd2VyaW5nOjoKK0xvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIHN3aXRjaCAoT3AuZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjdXN0b20gbG93ZXIgdGhpcyEiKTsKKyAgLy8gRnJhbWUgJiBSZXR1cm4gYWRkcmVzcy4gIEN1cnJlbnRseSB1bmltcGxlbWVudGVkCisgIGNhc2UgSVNEOjpSRVRVUk5BRERSOiByZXR1cm4gU0RWYWx1ZSgpOworICBjYXNlIElTRDo6RlJBTUVBRERSOiAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgY2FzZSBJU0Q6Okdsb2JhbFRMU0FkZHJlc3M6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVExTIG5vdCBpbXBsZW1lbnRlZCBmb3IgU3BhcmMuIik7CisgIGNhc2UgSVNEOjpHbG9iYWxBZGRyZXNzOiAgICAgIHJldHVybiBMb3dlckdsb2JhbEFkZHJlc3MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpDb25zdGFudFBvb2w6ICAgICAgIHJldHVybiBMb3dlckNvbnN0YW50UG9vbChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkZQX1RPX1NJTlQ6ICAgICAgICAgcmV0dXJuIExvd2VyRlBfVE9fU0lOVChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlNJTlRfVE9fRlA6ICAgICAgICAgcmV0dXJuIExvd2VyU0lOVF9UT19GUChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkJSX0NDOiAgICAgICAgICAgICAgcmV0dXJuIExvd2VyQlJfQ0MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6ICAgICAgICAgIHJldHVybiBMb3dlclNFTEVDVF9DQyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlZBU1RBUlQ6ICAgICAgICAgICAgcmV0dXJuIExvd2VyVkFTVEFSVChPcCwgREFHLCAqdGhpcyk7CisgIGNhc2UgSVNEOjpWQUFSRzogICAgICAgICAgICAgIHJldHVybiBMb3dlclZBQVJHKE9wLCBEQUcpOworICBjYXNlIElTRDo6RFlOQU1JQ19TVEFDS0FMTE9DOiByZXR1cm4gTG93ZXJEWU5BTUlDX1NUQUNLQUxMT0MoT3AsIERBRyk7CisgIH0KK30KKworTWFjaGluZUJhc2ljQmxvY2sgKgorU3BhcmNUYXJnZXRMb3dlcmluZzo6RW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJID0gKmdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKyAgdW5zaWduZWQgQlJPcGNvZGU7CisgIHVuc2lnbmVkIENDOworICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworICAvLyBGaWd1cmUgb3V0IHRoZSBjb25kaXRpb25hbCBicmFuY2ggb3Bjb2RlIHRvIHVzZSBmb3IgdGhpcyBzZWxlY3RfY2MuCisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gU0VMRUNUX0NDISIpOworICBjYXNlIFNQOjpTRUxFQ1RfQ0NfSW50X0lDQzoKKyAgY2FzZSBTUDo6U0VMRUNUX0NDX0ZQX0lDQzoKKyAgY2FzZSBTUDo6U0VMRUNUX0NDX0RGUF9JQ0M6CisgICAgQlJPcGNvZGUgPSBTUDo6QkNPTkQ7CisgICAgYnJlYWs7CisgIGNhc2UgU1A6OlNFTEVDVF9DQ19JbnRfRkNDOgorICBjYXNlIFNQOjpTRUxFQ1RfQ0NfRlBfRkNDOgorICBjYXNlIFNQOjpTRUxFQ1RfQ0NfREZQX0ZDQzoKKyAgICBCUk9wY29kZSA9IFNQOjpGQkNPTkQ7CisgICAgYnJlYWs7CisgIH0KKworICBDQyA9IChTUENDOjpDb25kQ29kZXMpTUktPmdldE9wZXJhbmQoMykuZ2V0SW1tKCk7CisKKyAgLy8gVG8gImluc2VydCIgYSBTRUxFQ1RfQ0MgaW5zdHJ1Y3Rpb24sIHdlIGFjdHVhbGx5IGhhdmUgdG8gaW5zZXJ0IHRoZSBkaWFtb25kCisgIC8vIGNvbnRyb2wtZmxvdyBwYXR0ZXJuLiAgVGhlIGluY29taW5nIGluc3RydWN0aW9uIGtub3dzIHRoZSBkZXN0aW5hdGlvbiB2cmVnCisgIC8vIHRvIHNldCwgdGhlIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyIHRvIGJyYW5jaCBvbiwgdGhlIHRydWUvZmFsc2UgdmFsdWVzIHRvCisgIC8vIHNlbGVjdCBiZXR3ZWVuLCBhbmQgYSBicmFuY2ggb3Bjb2RlIHRvIHVzZS4KKyAgY29uc3QgQmFzaWNCbG9jayAqTExWTV9CQiA9IEJCLT5nZXRCYXNpY0Jsb2NrKCk7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSXQgPSBCQjsKKyAgKytJdDsKKworICAvLyAgdGhpc01CQjoKKyAgLy8gIC4uLgorICAvLyAgIFRydWVWYWwgPSAuLi4KKyAgLy8gICBbZl1iQ0MgY29weTFNQkIKKyAgLy8gICBmYWxsdGhyb3VnaCAtLT4gY29weTBNQkIKKyAgTWFjaGluZUJhc2ljQmxvY2sgKnRoaXNNQkIgPSBCQjsKKyAgTWFjaGluZUZ1bmN0aW9uICpGID0gQkItPmdldFBhcmVudCgpOworICBNYWNoaW5lQmFzaWNCbG9jayAqY29weTBNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKnNpbmtNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKworICAvLyBUcmFuc2ZlciB0aGUgcmVtYWluZGVyIG9mIEJCIGFuZCBpdHMgc3VjY2Vzc29yIGVkZ2VzIHRvIHNpbmtNQkIuCisgIHNpbmtNQkItPnNwbGljZShzaW5rTUJCLT5iZWdpbigpLCBCQiwKKyAgICAgICAgICAgICAgICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKE1JKSksCisgICAgICAgICAgICAgICAgICBCQi0+ZW5kKCkpOworICBzaW5rTUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKEJCKTsKKworICAvLyBBZGQgdGhlIHRydWUgYW5kIGZhbGx0aHJvdWdoIGJsb2NrcyBhcyBpdHMgc3VjY2Vzc29ycy4KKyAgQkItPmFkZFN1Y2Nlc3Nvcihjb3B5ME1CQik7CisgIEJCLT5hZGRTdWNjZXNzb3Ioc2lua01CQik7CisKKyAgQnVpbGRNSShCQiwgZGwsIFRJSS5nZXQoQlJPcGNvZGUpKS5hZGRNQkIoc2lua01CQikuYWRkSW1tKENDKTsKKyAgRi0+aW5zZXJ0KEl0LCBjb3B5ME1CQik7CisgIEYtPmluc2VydChJdCwgc2lua01CQik7CisKKyAgLy8gIGNvcHkwTUJCOgorICAvLyAgICVGYWxzZVZhbHVlID0gLi4uCisgIC8vICAgIyBmYWxsdGhyb3VnaCB0byBzaW5rTUJCCisgIEJCID0gY29weTBNQkI7CisKKyAgLy8gVXBkYXRlIG1hY2hpbmUtQ0ZHIGVkZ2VzCisgIEJCLT5hZGRTdWNjZXNzb3Ioc2lua01CQik7CisKKyAgLy8gIHNpbmtNQkI6CisgIC8vICAgJVJlc3VsdCA9IHBoaSBbICVGYWxzZVZhbHVlLCBjb3B5ME1CQiBdLCBbICVUcnVlVmFsdWUsIHRoaXNNQkIgXQorICAvLyAgLi4uCisgIEJCID0gc2lua01CQjsKKyAgQnVpbGRNSSgqQkIsIEJCLT5iZWdpbigpLCBkbCwgVElJLmdldChTUDo6UEhJKSwgTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpCisgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSkuYWRkTUJCKGNvcHkwTUJCKQorICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpLmFkZE1CQih0aGlzTUJCKTsKKworICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7ICAgLy8gVGhlIHBzZXVkbyBpbnN0cnVjdGlvbiBpcyBnb25lIG5vdy4KKyAgcmV0dXJuIEJCOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3BhcmMgSW5saW5lIEFzc2VtYmx5IFN1cHBvcnQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBnZXRDb25zdHJhaW50VHlwZSAtIEdpdmVuIGEgY29uc3RyYWludCBsZXR0ZXIsIHJldHVybiB0aGUgdHlwZSBvZgorLy8vIGNvbnN0cmFpbnQgaXQgaXMgZm9yIHRoaXMgdGFyZ2V0LgorU3BhcmNUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUKK1NwYXJjVGFyZ2V0TG93ZXJpbmc6OmdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdCB7CisgIGlmIChDb25zdHJhaW50LnNpemUoKSA9PSAxKSB7CisgICAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgZGVmYXVsdDogIGJyZWFrOworICAgIGNhc2UgJ3InOiByZXR1cm4gQ19SZWdpc3RlckNsYXNzOworICAgIH0KKyAgfQorCisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0Q29uc3RyYWludFR5cGUoQ29uc3RyYWludCk7Cit9CisKK3N0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+CitTcGFyY1RhcmdldExvd2VyaW5nOjpnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0IHsKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICBjYXNlICdyJzoKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgU1A6OkludFJlZ3NSZWdpc3RlckNsYXNzKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVGFyZ2V0TG93ZXJpbmc6OmdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoQ29uc3RyYWludCwgVlQpOworfQorCitzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gU3BhcmNUYXJnZXRMb3dlcmluZzo6CitnZXRSZWdDbGFzc0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCB7CisgIGlmIChDb25zdHJhaW50LnNpemUoKSAhPSAxKQorICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKKworICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgJ3InOgorICAgIHJldHVybiBtYWtlX3ZlY3Rvcjx1bnNpZ25lZD4oU1A6OkwwLCBTUDo6TDEsIFNQOjpMMiwgU1A6OkwzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1A6Okw0LCBTUDo6TDUsIFNQOjpMNiwgU1A6Okw3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1A6OkkwLCBTUDo6STEsIFNQOjpJMiwgU1A6OkkzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1A6Okk0LCBTUDo6STUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUDo6TzAsIFNQOjpPMSwgU1A6Ok8yLCBTUDo6TzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUDo6TzQsIFNQOjpPNSwgU1A6Ok83LCAwKTsKKyAgfQorCisgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKK30KKworYm9vbAorU3BhcmNUYXJnZXRMb3dlcmluZzo6aXNPZmZzZXRGb2xkaW5nTGVnYWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EpIGNvbnN0IHsKKyAgLy8gVGhlIFNwYXJjIHRhcmdldCBpc24ndCB5ZXQgYXdhcmUgb2Ygb2Zmc2V0cy4KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gZ2V0RnVuY3Rpb25BbGlnbm1lbnQgLSBSZXR1cm4gdGhlIExvZzIgYWxpZ25tZW50IG9mIHRoaXMgZnVuY3Rpb24uCit1bnNpZ25lZCBTcGFyY1RhcmdldExvd2VyaW5nOjpnZXRGdW5jdGlvbkFsaWdubWVudChjb25zdCBGdW5jdGlvbiAqKSBjb25zdCB7CisgIHJldHVybiAyOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0lTZWxMb3dlcmluZy5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0lTZWxMb3dlcmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMzllMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjSVNlbExvd2VyaW5nLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8vPT09LS0gU3BhcmNJU2VsTG93ZXJpbmcuaCAtIFNwYXJjIERBRyBMb3dlcmluZyBJbnRlcmZhY2UgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZXMgdGhhdCBTcGFyYyB1c2VzIHRvIGxvd2VyIExMVk0gY29kZSBpbnRvIGEKKy8vIHNlbGVjdGlvbiBEQUcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTUEFSQ19JU0VMTE9XRVJJTkdfSAorI2RlZmluZSBTUEFSQ19JU0VMTE9XRVJJTkdfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJTcGFyYy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIG5hbWVzcGFjZSBTUElTRCB7CisgICAgZW51bSB7CisgICAgICBGSVJTVF9OVU1CRVIgPSBJU0Q6OkJVSUxUSU5fT1BfRU5ELAorICAgICAgQ01QSUNDLCAgICAgIC8vIENvbXBhcmUgdHdvIEdQUiBvcGVyYW5kcywgc2V0IGljYy4KKyAgICAgIENNUEZDQywgICAgICAvLyBDb21wYXJlIHR3byBGUCBvcGVyYW5kcywgc2V0IGZjYy4KKyAgICAgIEJSSUNDLCAgICAgICAvLyBCcmFuY2ggdG8gZGVzdCBvbiBpY2MgY29uZGl0aW9uCisgICAgICBCUkZDQywgICAgICAgLy8gQnJhbmNoIHRvIGRlc3Qgb24gZmNjIGNvbmRpdGlvbgorICAgICAgU0VMRUNUX0lDQywgIC8vIFNlbGVjdCBiZXR3ZWVuIHR3byB2YWx1ZXMgdXNpbmcgdGhlIGN1cnJlbnQgSUNDIGZsYWdzLgorICAgICAgU0VMRUNUX0ZDQywgIC8vIFNlbGVjdCBiZXR3ZWVuIHR3byB2YWx1ZXMgdXNpbmcgdGhlIGN1cnJlbnQgRkNDIGZsYWdzLgorCisgICAgICBIaSwgTG8sICAgICAgLy8gSGkvTG8gb3BlcmF0aW9ucywgdHlwaWNhbGx5IG9uIGEgZ2xvYmFsIGFkZHJlc3MuCisKKyAgICAgIEZUT0ksICAgICAgICAvLyBGUCB0byBJbnQgd2l0aGluIGEgRlAgcmVnaXN0ZXIuCisgICAgICBJVE9GLCAgICAgICAgLy8gSW50IHRvIEZQIHdpdGhpbiBhIEZQIHJlZ2lzdGVyLgorCisgICAgICBDQUxMLCAgICAgICAgLy8gQSBjYWxsIGluc3RydWN0aW9uLgorICAgICAgUkVUX0ZMQUcsICAgIC8vIFJldHVybiB3aXRoIGEgZmxhZyBvcGVyYW5kLgorICAgICAgR0xPQkFMX0JBU0VfUkVHIC8vIEdsb2JhbCBiYXNlIHJlZyBmb3IgUElDCisgICAgfTsKKyAgfQorCisgIGNsYXNzIFNwYXJjVGFyZ2V0TG93ZXJpbmcgOiBwdWJsaWMgVGFyZ2V0TG93ZXJpbmcgeworICBwdWJsaWM6CisgICAgU3BhcmNUYXJnZXRMb3dlcmluZyhUYXJnZXRNYWNoaW5lICZUTSk7CisgICAgdmlydHVhbCBTRFZhbHVlIExvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIC8vLyBjb21wdXRlTWFza2VkQml0c0ZvclRhcmdldE5vZGUgLSBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGJpdHMgc3BlY2lmaWVkCisgICAgLy8vIGluIE1hc2sgYXJlIGtub3duIHRvIGJlIGVpdGhlciB6ZXJvIG9yIG9uZSBhbmQgcmV0dXJuIHRoZW0gaW4gdGhlCisgICAgLy8vIEtub3duWmVyby9Lbm93bk9uZSBiaXRzZXRzLgorICAgIHZpcnR1YWwgdm9pZCBjb21wdXRlTWFza2VkQml0c0ZvclRhcmdldE5vZGUoY29uc3QgU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2sgKgorICAgICAgRW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgICBDb25zdHJhaW50VHlwZSBnZXRDb25zdHJhaW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCkgY29uc3Q7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4KKyAgICBnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LCBFVlQgVlQpIGNvbnN0OworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPgorICAgIGdldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBpc09mZnNldEZvbGRpbmdMZWdhbChjb25zdCBHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSkgY29uc3Q7CisKKyAgICAvLy8gZ2V0RnVuY3Rpb25BbGlnbm1lbnQgLSBSZXR1cm4gdGhlIExvZzIgYWxpZ25tZW50IG9mIHRoaXMgZnVuY3Rpb24uCisgICAgdmlydHVhbCB1bnNpZ25lZCBnZXRGdW5jdGlvbkFsaWdubWVudChjb25zdCBGdW5jdGlvbiAqRikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyRm9ybWFsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICBTRFZhbHVlIExvd2VyR2xvYmFsQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckNvbnN0YW50UG9vbChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgICAgLy8gU1BBUkNfSVNFTExPV0VSSU5HX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNJbnN0ckZvcm1hdHMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjSW5zdHJGb3JtYXRzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MGQwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjSW5zdHJGb3JtYXRzLnRkCkBAIC0wLDAgKzEsMTE0IEBACisvLz09PS0gU3BhcmNJbnN0ckZvcm1hdHMudGQgLSBTcGFyYyBJbnN0cnVjdGlvbiBGb3JtYXRzIC0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLw0KKy8vIA0KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisvLw0KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisvLyANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2NsYXNzIEluc3RTUDxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+IDogSW5zdHJ1Y3Rpb24gew0KKyAgZmllbGQgYml0czwzMj4gSW5zdDsNCisNCisgIGxldCBOYW1lc3BhY2UgPSAiU1AiOw0KKw0KKyAgYml0czwyPiBvcDsNCisgIGxldCBJbnN0ezMxLTMwfSA9IG9wOyAgICAgICAgICAgICAgIC8vIFRvcCB0d28gYml0cyBhcmUgdGhlICdvcCcgZmllbGQNCisgIA0KKyAgZGFnIE91dE9wZXJhbmRMaXN0ID0gb3V0czsNCisgIGRhZyBJbk9wZXJhbmRMaXN0ID0gaW5zOw0KKyAgbGV0IEFzbVN0cmluZyAgID0gYXNtc3RyOw0KKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEZvcm1hdCAjMiBpbnN0cnVjdGlvbiBjbGFzc2VzIGluIHRoZSBTcGFyYw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gRm9ybWF0IDIgaW5zdHJ1Y3Rpb25zDQorY2xhc3MgRjI8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyAgIDogSW5zdFNQPG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7DQorICBiaXRzPDM+ICBvcDI7DQorICBiaXRzPDIyPiBpbW0yMjsNCisgIGxldCBvcCAgICAgICAgICA9IDA7ICAgIC8vIG9wID0gMA0KKyAgbGV0IEluc3R7MjQtMjJ9ID0gb3AyOw0KKyAgbGV0IEluc3R7MjEtMH0gID0gaW1tMjI7DQorfQ0KKw0KKy8vIFNwZWNpZmljIEYyIGNsYXNzZXM6IFNwYXJjVjggbWFudWFsLCBwYWdlIDQ0DQorLy8NCitjbGFzcyBGMl8xPGJpdHM8Mz4gb3AyVmFsLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+DQorICAgOiBGMjxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj4gew0KKyAgYml0czw1PiAgcmQ7DQorDQorICBsZXQgb3AyICAgICAgICAgPSBvcDJWYWw7DQorDQorICBsZXQgSW5zdHsyOS0yNX0gPSByZDsNCit9DQorDQorY2xhc3MgRjJfMjxiaXRzPDQ+IGNvbmRWYWwsIGJpdHM8Mz4gb3AyVmFsLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgDQorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4gOiBGMjxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj4gew0KKyAgYml0czw0PiAgIGNvbmQ7DQorICBiaXQgICAgICAgYW5udWwgPSAwOyAgICAgLy8gY3VycmVudGx5IHVudXNlZA0KKw0KKyAgbGV0IGNvbmQgICAgICAgID0gY29uZFZhbDsNCisgIGxldCBvcDIgICAgICAgICA9IG9wMlZhbDsNCisNCisgIGxldCBJbnN0ezI5fSAgICA9IGFubnVsOw0KKyAgbGV0IEluc3R7MjgtMjV9ID0gY29uZDsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBGb3JtYXQgIzMgaW5zdHJ1Y3Rpb24gY2xhc3NlcyBpbiB0aGUgU3BhcmMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2NsYXNzIEYzPGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICAgOiBJbnN0U1A8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsNCisgIGJpdHM8NT4gcmQ7DQorICBiaXRzPDY+IG9wMzsNCisgIGJpdHM8NT4gcnMxOw0KKyAgbGV0IG9wezF9ID0gMTsgICAvLyBPcCA9IDIgb3IgMw0KKyAgbGV0IEluc3R7MjktMjV9ID0gcmQ7DQorICBsZXQgSW5zdHsyNC0xOX0gPSBvcDM7DQorICBsZXQgSW5zdHsxOC0xNH0gPSByczE7DQorfQ0KKw0KKy8vIFNwZWNpZmljIEYzIGNsYXNzZXM6IFNwYXJjVjggbWFudWFsLCBwYWdlIDQ0DQorLy8NCitjbGFzcyBGM18xPGJpdHM8Mj4gb3BWYWwsIGJpdHM8Nj4gb3AzdmFsLCBkYWcgb3V0cywgZGFnIGlucywNCisgICAgICAgICAgIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6IEYzPG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7DQorICBiaXRzPDg+IGFzaSA9IDA7IC8vIGFzaSBub3QgY3VycmVudGx5IHVzZWQNCisgIGJpdHM8NT4gcnMyOw0KKw0KKyAgbGV0IG9wICAgICAgICAgPSBvcFZhbDsNCisgIGxldCBvcDMgICAgICAgID0gb3AzdmFsOw0KKw0KKyAgbGV0IEluc3R7MTN9ICAgPSAwOyAgICAgLy8gaSBmaWVsZCA9IDANCisgIGxldCBJbnN0ezEyLTV9ID0gYXNpOyAgIC8vIGFkZHJlc3Mgc3BhY2UgaWRlbnRpZmllcg0KKyAgbGV0IEluc3R7NC0wfSAgPSByczI7DQorfQ0KKw0KK2NsYXNzIEYzXzI8Yml0czwyPiBvcFZhbCwgYml0czw2PiBvcDN2YWwsIGRhZyBvdXRzLCBkYWcgaW5zLCANCisgICAgICAgICAgIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6IEYzPG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7DQorICBiaXRzPDEzPiBzaW1tMTM7DQorDQorICBsZXQgb3AgICAgICAgICA9IG9wVmFsOw0KKyAgbGV0IG9wMyAgICAgICAgPSBvcDN2YWw7DQorDQorICBsZXQgSW5zdHsxM30gICA9IDE7ICAgICAvLyBpIGZpZWxkID0gMQ0KKyAgbGV0IEluc3R7MTItMH0gPSBzaW1tMTM7DQorfQ0KKw0KKy8vIGZsb2F0aW5nLXBvaW50DQorY2xhc3MgRjNfMzxiaXRzPDI+IG9wVmFsLCBiaXRzPDY+IG9wM3ZhbCwgYml0czw5PiBvcGZ2YWwsIGRhZyBvdXRzLCBkYWcgaW5zLA0KKyAgICAgICAgICAgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+IDogRjM8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsNCisgIGJpdHM8NT4gcnMyOw0KKw0KKyAgbGV0IG9wICAgICAgICAgPSBvcFZhbDsNCisgIGxldCBvcDMgICAgICAgID0gb3AzdmFsOw0KKw0KKyAgbGV0IEluc3R7MTMtNX0gPSBvcGZ2YWw7ICAgLy8gZnAgb3Bjb2RlDQorICBsZXQgSW5zdHs0LTB9ICA9IHJzMjsNCit9DQorDQorDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0luc3RySW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjSW5zdHJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWRlOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0luc3RySW5mby5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8vPT09LSBTcGFyY0luc3RySW5mby5jcHAgLSBTcGFyYyBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBTcGFyYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJTcGFyY0luc3RySW5mby5oIgorI2luY2x1ZGUgIlNwYXJjU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiU3BhcmMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgIlNwYXJjR2VuSW5zdHJJbmZvLmluYyIKKyNpbmNsdWRlICJTcGFyY01hY2hpbmVGdW5jdGlvbkluZm8uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTcGFyY0luc3RySW5mbzo6U3BhcmNJbnN0ckluZm8oU3BhcmNTdWJ0YXJnZXQgJlNUKQorICA6IFRhcmdldEluc3RySW5mb0ltcGwoU3BhcmNJbnN0cywgYXJyYXlfbGVuZ3Rob2YoU3BhcmNJbnN0cykpLAorICAgIFJJKFNULCAqdGhpcyksIFN1YnRhcmdldChTVCkgeworfQorCisvLy8gaXNMb2FkRnJvbVN0YWNrU2xvdCAtIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBhIGRpcmVjdAorLy8vIGxvYWQgZnJvbSBhIHN0YWNrIHNsb3QsIHJldHVybiB0aGUgdmlydHVhbCBvciBwaHlzaWNhbCByZWdpc3RlciBudW1iZXIgb2YKKy8vLyB0aGUgZGVzdGluYXRpb24gYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QuICBJZgorLy8vIG5vdCwgcmV0dXJuIDAuICBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiAwIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMKKy8vLyBhbnkgc2lkZSBlZmZlY3RzIG90aGVyIHRoYW4gbG9hZGluZyBmcm9tIHRoZSBzdGFjayBzbG90LgordW5zaWduZWQgU3BhcmNJbnN0ckluZm86OmlzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICBpZiAoTUktPmdldE9wY29kZSgpID09IFNQOjpMRHJpIHx8CisgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gU1A6OkxERnJpIHx8CisgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gU1A6OkxEREZyaSkgeworICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgxKS5pc0ZJKCkgJiYgTUktPmdldE9wZXJhbmQoMikuaXNJbW0oKSAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSA9PSAwKSB7CisgICAgICBGcmFtZUluZGV4ID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0SW5kZXgoKTsKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBpc1N0b3JlVG9TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKy8vLyBzdG9yZSB0byBhIHN0YWNrIHNsb3QsIHJldHVybiB0aGUgdmlydHVhbCBvciBwaHlzaWNhbCByZWdpc3RlciBudW1iZXIgb2YKKy8vLyB0aGUgc291cmNlIHJlZyBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4IG9mIHRoZSBsb2FkZWQgc3RhY2sgc2xvdC4gIElmCisvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBzdG9yaW5nIHRvIHRoZSBzdGFjayBzbG90LgordW5zaWduZWQgU3BhcmNJbnN0ckluZm86OmlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBTUDo6U1RyaSB8fAorICAgICAgTUktPmdldE9wY29kZSgpID09IFNQOjpTVEZyaSB8fAorICAgICAgTUktPmdldE9wY29kZSgpID09IFNQOjpTVERGcmkpIHsKKyAgICBpZiAoTUktPmdldE9wZXJhbmQoMCkuaXNGSSgpICYmIE1JLT5nZXRPcGVyYW5kKDEpLmlzSW1tKCkgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkgPT0gMCkgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDApLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCit1bnNpZ25lZAorU3BhcmNJbnN0ckluZm86Okluc2VydEJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKWNvbnN0eworICAvLyBDYW4gb25seSBpbnNlcnQgdW5jb25kIGJyYW5jaGVzIHNvIGZhci4KKyAgYXNzZXJ0KENvbmQuZW1wdHkoKSAmJiAhRkJCICYmIFRCQiAmJiAiQ2FuIG9ubHkgaGFuZGxlIHVuY29uZCBicmFuY2hlcyEiKTsKKyAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KFNQOjpCQSkpLmFkZE1CQihUQkIpOworICByZXR1cm4gMTsKK30KKwordm9pZCBTcGFyY0luc3RySW5mbzo6Y29weVBoeXNSZWcoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLCBEZWJ1Z0xvYyBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgS2lsbFNyYykgY29uc3QgeworICBpZiAoU1A6OkludFJlZ3NSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KFNQOjpPUnJyKSwgRGVzdFJlZykuYWRkUmVnKFNQOjpHMCkKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICBlbHNlIGlmIChTUDo6RlBSZWdzUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChTUDo6Rk1PVlMpLCBEZXN0UmVnKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSk7CisgIGVsc2UgaWYgKFNQOjpERlBSZWdzUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChTdWJ0YXJnZXQuaXNWOSgpID8gU1A6OkZNT1ZEIDogU1A6OkZwTU9WRCksIERlc3RSZWcpCisgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkltcG9zc2libGUgcmVnLXRvLXJlZyBjb3B5Iik7Cit9CisKK3ZvaWQgU3BhcmNJbnN0ckluZm86Ogorc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZJLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgRGVidWdMb2MgREw7CisgIGlmIChJICE9IE1CQi5lbmQoKSkgREwgPSBJLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIE9uIHRoZSBvcmRlciBvZiBvcGVyYW5kcyBoZXJlOiB0aGluayAiW0ZyYW1lSWR4ICsgMF0gPSBTcmNSZWciLgorICBpZiAoUkMgPT0gU1A6OkludFJlZ3NSZWdpc3RlckNsYXNzKQorICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KFNQOjpTVHJpKSkuYWRkRnJhbWVJbmRleChGSSkuYWRkSW1tKDApCisgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpOworICBlbHNlIGlmIChSQyA9PSBTUDo6RlBSZWdzUmVnaXN0ZXJDbGFzcykKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChTUDo6U1RGcmkpKS5hZGRGcmFtZUluZGV4KEZJKS5hZGRJbW0oMCkKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCAgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpOworICBlbHNlIGlmIChSQyA9PSBTUDo6REZQUmVnc1JlZ2lzdGVyQ2xhc3MpCisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoU1A6OlNUREZyaSkpLmFkZEZyYW1lSW5kZXgoRkkpLmFkZEltbSgwKQorICAgICAgLmFkZFJlZyhTcmNSZWcsICBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSk7CisgIGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDYW4ndCBzdG9yZSB0aGlzIHJlZ2lzdGVyIHRvIHN0YWNrIHNsb3QiKTsKK30KKwordm9pZCBTcGFyY0luc3RySW5mbzo6Citsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgRGVidWdMb2MgREw7CisgIGlmIChJICE9IE1CQi5lbmQoKSkgREwgPSBJLT5nZXREZWJ1Z0xvYygpOworCisgIGlmIChSQyA9PSBTUDo6SW50UmVnc1JlZ2lzdGVyQ2xhc3MpCisgICAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoU1A6OkxEcmkpLCBEZXN0UmVnKS5hZGRGcmFtZUluZGV4KEZJKS5hZGRJbW0oMCk7CisgIGVsc2UgaWYgKFJDID09IFNQOjpGUFJlZ3NSZWdpc3RlckNsYXNzKQorICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KFNQOjpMREZyaSksIERlc3RSZWcpLmFkZEZyYW1lSW5kZXgoRkkpLmFkZEltbSgwKTsKKyAgZWxzZSBpZiAoUkMgPT0gU1A6OkRGUFJlZ3NSZWdpc3RlckNsYXNzKQorICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KFNQOjpMRERGcmkpLCBEZXN0UmVnKS5hZGRGcmFtZUluZGV4KEZJKS5hZGRJbW0oMCk7CisgIGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDYW4ndCBsb2FkIHRoaXMgcmVnaXN0ZXIgZnJvbSBzdGFjayBzbG90Iik7Cit9CisKK3Vuc2lnbmVkIFNwYXJjSW5zdHJJbmZvOjpnZXRHbG9iYWxCYXNlUmVnKE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0Cit7CisgIFNwYXJjTWFjaGluZUZ1bmN0aW9uSW5mbyAqU3BhcmNGSSA9IE1GLT5nZXRJbmZvPFNwYXJjTWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKyAgdW5zaWduZWQgR2xvYmFsQmFzZVJlZyA9IFNwYXJjRkktPmdldEdsb2JhbEJhc2VSZWcoKTsKKyAgaWYgKEdsb2JhbEJhc2VSZWcgIT0gMCkKKyAgICByZXR1cm4gR2xvYmFsQmFzZVJlZzsKKworICAvLyBJbnNlcnQgdGhlIHNldCBvZiBHbG9iYWxCYXNlUmVnIGludG8gdGhlIGZpcnN0IE1CQiBvZiB0aGUgZnVuY3Rpb24KKyAgTWFjaGluZUJhc2ljQmxvY2sgJkZpcnN0TUJCID0gTUYtPmZyb250KCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gRmlyc3RNQkIuYmVnaW4oKTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmUmVnSW5mbyA9IE1GLT5nZXRSZWdJbmZvKCk7CisKKyAgR2xvYmFsQmFzZVJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKCZTUDo6SW50UmVnc1JlZ0NsYXNzKTsKKworCisgIERlYnVnTG9jIGRsOworCisgIEJ1aWxkTUkoRmlyc3RNQkIsIE1CQkksIGRsLCBnZXQoU1A6OkdFVFBDWCksIEdsb2JhbEJhc2VSZWcpOworICBTcGFyY0ZJLT5zZXRHbG9iYWxCYXNlUmVnKEdsb2JhbEJhc2VSZWcpOworICByZXR1cm4gR2xvYmFsQmFzZVJlZzsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNJbnN0ckluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNJbnN0ckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDBiZDIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0luc3RySW5mby5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vPT09LSBTcGFyY0luc3RySW5mby5oIC0gU3BhcmMgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBTcGFyYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0SW5zdHJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU1BBUkNJTlNUUlVDVElPTklORk9fSAorI2RlZmluZSBTUEFSQ0lOU1RSVUNUSU9OSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJTcGFyY1JlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTUElJIC0gVGhpcyBuYW1lc3BhY2UgaG9sZHMgYWxsIG9mIHRoZSB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgdGhhdAorLy8vIGluc3RydWN0aW9uIGluZm8gdHJhY2tzLgorLy8vCituYW1lc3BhY2UgU1BJSSB7CisgIGVudW0geworICAgIFBzZXVkbyA9ICgxPDwwKSwKKyAgICBMb2FkID0gKDE8PDEpLAorICAgIFN0b3JlID0gKDE8PDIpLAorICAgIERlbGF5U2xvdCA9ICgxPDwzKQorICB9OworfQorCitjbGFzcyBTcGFyY0luc3RySW5mbyA6IHB1YmxpYyBUYXJnZXRJbnN0ckluZm9JbXBsIHsKKyAgY29uc3QgU3BhcmNSZWdpc3RlckluZm8gUkk7CisgIGNvbnN0IFNwYXJjU3VidGFyZ2V0JiBTdWJ0YXJnZXQ7CitwdWJsaWM6CisgIGV4cGxpY2l0IFNwYXJjSW5zdHJJbmZvKFNwYXJjU3VidGFyZ2V0ICZTVCk7CisKKyAgLy8vIGdldFJlZ2lzdGVySW5mbyAtIFRhcmdldEluc3RySW5mbyBpcyBhIHN1cGVyc2V0IG9mIE1SZWdpc3RlciBpbmZvLiAgQXMKKyAgLy8vIHN1Y2gsIHdoZW5ldmVyIGEgY2xpZW50IGhhcyBhbiBpbnN0YW5jZSBvZiBpbnN0cnVjdGlvbiBpbmZvLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBiZSBhYmxlIHRvIGdldCByZWdpc3RlciBpbmZvIGFzIHdlbGwgKHRocm91Z2ggdGhpcyBtZXRob2QpLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBTcGFyY1JlZ2lzdGVySW5mbyAmZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeyByZXR1cm4gUkk7IH0KKworICAvLy8gaXNMb2FkRnJvbVN0YWNrU2xvdCAtIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBhIGRpcmVjdAorICAvLy8gbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorICAvLy8gdGhlIGRlc3RpbmF0aW9uIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKyAgLy8vIG5vdCwgcmV0dXJuIDAuICBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiAwIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMKKyAgLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBsb2FkaW5nIGZyb20gdGhlIHN0YWNrIHNsb3QuCisgIHZpcnR1YWwgdW5zaWduZWQgaXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdDsKKyAgCisgIC8vLyBpc1N0b3JlVG9TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKyAgLy8vIHN0b3JlIHRvIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorICAvLy8gdGhlIHNvdXJjZSByZWcgYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QuICBJZgorICAvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworICAvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIHN0b3JpbmcgdG8gdGhlIHN0YWNrIHNsb3QuCisgIHZpcnR1YWwgdW5zaWduZWQgaXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisgIAorICAKKyAgdmlydHVhbCB1bnNpZ25lZCBJbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdDsKKyAgCisgIHZpcnR1YWwgdm9pZCBzdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgbG9hZFJlZ0Zyb21TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKyAgCisgIHVuc2lnbmVkIGdldEdsb2JhbEJhc2VSZWcoTWFjaGluZUZ1bmN0aW9uICpNRikgY29uc3Q7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY0luc3RySW5mby50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNJbnN0ckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhZWJjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNJbnN0ckluZm8udGQKQEAgLTAsMCArMSw3ODQgQEAKKy8vPT09LSBTcGFyY0luc3RySW5mby50ZCAtIFRhcmdldCBEZXNjcmlwdGlvbiBmb3IgU3BhcmMgVGFyZ2V0IC0tLS0tLS0tLS0tLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBTcGFyYyBpbnN0cnVjdGlvbnMgaW4gVGFibGVHZW4gZm9ybWF0Lg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEluc3RydWN0aW9uIGZvcm1hdCBzdXBlcmNsYXNzDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitpbmNsdWRlICJTcGFyY0luc3RyRm9ybWF0cy50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEZlYXR1cmUgcHJlZGljYXRlcy4NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIEhhc1Y5IC0gVGhpcyBwcmVkaWNhdGUgaXMgdHJ1ZSB3aGVuIHRoZSB0YXJnZXQgcHJvY2Vzc29yIHN1cHBvcnRzIFY5DQorLy8gaW5zdHJ1Y3Rpb25zLiAgTm90ZSB0aGF0IHRoZSBtYWNoaW5lIG1heSBiZSBydW5uaW5nIGluIDMyLWJpdCBtb2RlLg0KK2RlZiBIYXNWOSAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQuaXNWOSgpIj47DQorDQorLy8gSGFzTm9WOSAtIFRoaXMgcHJlZGljYXRlIGlzIHRydWUgd2hlbiB0aGUgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBWOQ0KKy8vIGluc3RydWN0aW9ucy4gIFVzZSBvZiB0aGlzIGlzIGp1c3QgYSBoYWNrIGZvciB0aGUgaXNlbCBub3QgaGF2aW5nIHByb3Blcg0KKy8vIGNvc3RzIGZvciBWOCBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgbW9yZSBleHBlbnNpdmUgdGhhbiB0aGVpciBWOSBvbmVzLg0KK2RlZiBIYXNOb1Y5IDogUHJlZGljYXRlPCIhU3VidGFyZ2V0LmlzVjkoKSI+Ow0KKw0KKy8vIEhhc1ZJUyAtIFRoaXMgaXMgdHJ1ZSB3aGVuIHRoZSB0YXJnZXQgcHJvY2Vzc29yIGhhcyBWSVMgZXh0ZW5zaW9ucy4NCitkZWYgSGFzVklTIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQuaXNWSVMoKSI+Ow0KKw0KKy8vIFVzZURlcHJlY2F0ZWRJbnN0cyAtIFRoaXMgcHJlZGljYXRlIGlzIHRydWUgd2hlbiB0aGUgdGFyZ2V0IHByb2Nlc3NvciBpcyBhDQorLy8gVjgsIG9yIHdoZW4gaXQgaXMgVjkgYnV0IHRoZSBWOCBkZXByZWNhdGVkIGluc3RydWN0aW9ucyBhcmUgZWZmaWNpZW50IGVub3VnaA0KKy8vIHRvIHVzZSB3aGVuIGFwcHJvcHJpYXRlLiAgSW4gZWl0aGVyIG9mIHRoZXNlIGNhc2VzLCB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3INCisvLyB3aWxsIHBpY2sgZGVwcmVjYXRlZCBpbnN0cnVjdGlvbnMuDQorZGVmIFVzZURlcHJlY2F0ZWRJbnN0cyA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LnVzZURlcHJlY2F0ZWRWOEluc3RydWN0aW9ucygpIj47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBJbnN0cnVjdGlvbiBQYXR0ZXJuIFN0dWZmDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitkZWYgc2ltbTExICA6IFBhdExlYWY8KGltbSksIFt7DQorICAvLyBzaW1tMTEgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgaW1tIGZpdHMgaW4gYSAxMS1iaXQgc2lnbiBleHRlbmRlZCBmaWVsZC4NCisgIHJldHVybiAoKChpbnQpTi0+Z2V0WkV4dFZhbHVlKCkgPDwgKDMyLTExKSkgPj4gKDMyLTExKSkgPT0NCisgICAgICAgICAoaW50KU4tPmdldFpFeHRWYWx1ZSgpOw0KK31dPjsNCisNCitkZWYgc2ltbTEzICA6IFBhdExlYWY8KGltbSksIFt7DQorICAvLyBzaW1tMTMgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgaW1tIGZpdHMgaW4gYSAxMy1iaXQgc2lnbiBleHRlbmRlZCBmaWVsZC4NCisgIHJldHVybiAoKChpbnQpTi0+Z2V0WkV4dFZhbHVlKCkgPDwgKDMyLTEzKSkgPj4gKDMyLTEzKSkgPT0NCisgICAgICAgICAoaW50KU4tPmdldFpFeHRWYWx1ZSgpOw0KK31dPjsNCisNCitkZWYgTE8xMCA6IFNETm9kZVhGb3JtPGltbSwgW3sNCisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KCh1bnNpZ25lZClOLT5nZXRaRXh0VmFsdWUoKSAmIDEwMjMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMik7DQorfV0+Ow0KKw0KK2RlZiBISTIyIDogU0ROb2RlWEZvcm08aW1tLCBbew0KKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IHNoaWZ0IHRoZSBpbW1lZGlhdGUgdmFsdWUgZG93biBpbnRvIHRoZSBsb3cgYml0cy4NCisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KCh1bnNpZ25lZClOLT5nZXRaRXh0VmFsdWUoKSA+PiAxMCwgTVZUOjppMzIpOw0KK31dPjsNCisNCitkZWYgU0VUSElpbW0gOiBQYXRMZWFmPChpbW0pLCBbew0KKyAgcmV0dXJuICgoKHVuc2lnbmVkKU4tPmdldFpFeHRWYWx1ZSgpID4+IDEwKSA8PCAxMCkgPT0NCisgICAgICAgICAodW5zaWduZWQpTi0+Z2V0WkV4dFZhbHVlKCk7DQorfV0sIEhJMjI+Ow0KKw0KKy8vIEFkZHJlc3NpbmcgbW9kZXMuDQorZGVmIEFERFJyciA6IENvbXBsZXhQYXR0ZXJuPGkzMiwgMiwgIlNlbGVjdEFERFJyciIsIFtdLCBbXT47DQorZGVmIEFERFJyaSA6IENvbXBsZXhQYXR0ZXJuPGkzMiwgMiwgIlNlbGVjdEFERFJyaSIsIFtmcmFtZWluZGV4XSwgW10+Ow0KKw0KKy8vIEFkZHJlc3Mgb3BlcmFuZHMNCitkZWYgTUVNcnIgOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50TWVtT3BlcmFuZCI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgSW50UmVncywgSW50UmVncyk7DQorfQ0KK2RlZiBNRU1yaSA6IE9wZXJhbmQ8aTMyPiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRNZW1PcGVyYW5kIjsNCisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBJbnRSZWdzLCBpMzJpbW0pOw0KK30NCisNCisvLyBCcmFuY2ggdGFyZ2V0cyBoYXZlIE90aGVyVlQgdHlwZS4NCitkZWYgYnJ0YXJnZXQgOiBPcGVyYW5kPE90aGVyVlQ+Ow0KK2RlZiBjYWxsdGFyZ2V0IDogT3BlcmFuZDxpMzI+Ow0KKw0KKy8vIE9wZXJhbmQgZm9yIHByaW50aW5nIG91dCBhIGNvbmRpdGlvbiBjb2RlLg0KK2xldCBQcmludE1ldGhvZCA9ICJwcmludENDT3BlcmFuZCIgaW4NCisgIGRlZiBDQ09wIDogT3BlcmFuZDxpMzI+Ow0KKw0KK2RlZiBTRFRTUGNtcGZjYyA6IA0KK1NEVHlwZVByb2ZpbGU8MCwgMiwgW1NEVENpc0ZQPDA+LCBTRFRDaXNTYW1lQXM8MCwgMT5dPjsNCitkZWYgU0RUU1BicmNjIDogDQorU0RUeXBlUHJvZmlsZTwwLCAyLCBbU0RUQ2lzVlQ8MCwgT3RoZXJWVD4sIFNEVENpc1ZUPDEsIGkzMj5dPjsNCitkZWYgU0RUU1BzZWxlY3RjYyA6DQorU0RUeXBlUHJvZmlsZTwxLCAzLCBbU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNTYW1lQXM8MSwgMj4sIFNEVENpc1ZUPDMsIGkzMj5dPjsNCitkZWYgU0RUU1BGVE9JIDoNCitTRFR5cGVQcm9maWxlPDEsIDEsIFtTRFRDaXNWVDwwLCBmMzI+LCBTRFRDaXNGUDwxPl0+Ow0KK2RlZiBTRFRTUElUT0YgOg0KK1NEVHlwZVByb2ZpbGU8MSwgMSwgW1NEVENpc0ZQPDA+LCBTRFRDaXNWVDwxLCBmMzI+XT47DQorDQorZGVmIFNQY21waWNjIDogU0ROb2RlPCJTUElTRDo6Q01QSUNDIiwgU0RUSW50QmluT3AsIFtTRE5QT3V0RmxhZ10+Ow0KK2RlZiBTUGNtcGZjYyA6IFNETm9kZTwiU1BJU0Q6OkNNUEZDQyIsIFNEVFNQY21wZmNjLCBbU0ROUE91dEZsYWddPjsNCitkZWYgU1BicmljYyA6IFNETm9kZTwiU1BJU0Q6OkJSSUNDIiwgU0RUU1BicmNjLCBbU0ROUEhhc0NoYWluLCBTRE5QSW5GbGFnXT47DQorZGVmIFNQYnJmY2MgOiBTRE5vZGU8IlNQSVNEOjpCUkZDQyIsIFNEVFNQYnJjYywgW1NETlBIYXNDaGFpbiwgU0ROUEluRmxhZ10+Ow0KKw0KK2RlZiBTUGhpICAgIDogU0ROb2RlPCJTUElTRDo6SGkiLCBTRFRJbnRVbmFyeU9wPjsNCitkZWYgU1BsbyAgICA6IFNETm9kZTwiU1BJU0Q6OkxvIiwgU0RUSW50VW5hcnlPcD47DQorDQorZGVmIFNQZnRvaSAgOiBTRE5vZGU8IlNQSVNEOjpGVE9JIiwgU0RUU1BGVE9JPjsNCitkZWYgU1BpdG9mICA6IFNETm9kZTwiU1BJU0Q6OklUT0YiLCBTRFRTUElUT0Y+Ow0KKw0KK2RlZiBTUHNlbGVjdGljYyA6IFNETm9kZTwiU1BJU0Q6OlNFTEVDVF9JQ0MiLCBTRFRTUHNlbGVjdGNjLCBbU0ROUEluRmxhZ10+Ow0KK2RlZiBTUHNlbGVjdGZjYyA6IFNETm9kZTwiU1BJU0Q6OlNFTEVDVF9GQ0MiLCBTRFRTUHNlbGVjdGNjLCBbU0ROUEluRmxhZ10+Ow0KKw0KKy8vICBUaGVzZSBhcmUgdGFyZ2V0LWluZGVwZW5kZW50IG5vZGVzLCBidXQgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgZm9ybWF0cy4NCitkZWYgU0RUX1NQQ2FsbFNlcVN0YXJ0IDogU0RDYWxsU2VxU3RhcnQ8WyBTRFRDaXNWVDwwLCBpMzI+IF0+Ow0KK2RlZiBTRFRfU1BDYWxsU2VxRW5kICAgOiBTRENhbGxTZXFFbmQ8WyBTRFRDaXNWVDwwLCBpMzI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwxLCBpMzI+IF0+Ow0KKw0KK2RlZiBjYWxsc2VxX3N0YXJ0IDogU0ROb2RlPCJJU0Q6OkNBTExTRVFfU1RBUlQiLCBTRFRfU1BDYWxsU2VxU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE91dEZsYWddPjsNCitkZWYgY2FsbHNlcV9lbmQgICA6IFNETm9kZTwiSVNEOjpDQUxMU0VRX0VORCIsICAgU0RUX1NQQ2FsbFNlcUVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZ10+Ow0KKw0KK2RlZiBTRFRfU1BDYWxsICAgIDogU0RUeXBlUHJvZmlsZTwwLCAxLCBbU0RUQ2lzVlQ8MCwgaTMyPl0+Ow0KK2RlZiBjYWxsICAgICAgICAgIDogU0ROb2RlPCJTUElTRDo6Q0FMTCIsIFNEVF9TUENhbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZywgU0ROUE91dEZsYWddPjsNCisNCitkZWYgcmV0ZmxhZyAgICAgICA6IFNETm9kZTwiU1BJU0Q6OlJFVF9GTEFHIiwgU0RUTm9uZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnXT47DQorDQorZGVmIGdldFBDWCAgICAgICAgOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50R2V0UENYIjsNCit9ICANCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNQQVJDIEZsYWcgQ29uZGl0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gTm90ZSB0aGF0IHRoZXNlIHZhbHVlcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBDQ09wOjpDb25kQ29kZSBlbnVtDQorLy8gdmFsdWVzLg0KK2NsYXNzIElDQ19WQUw8aW50IE4+IDogUGF0TGVhZjwoaTMyIE4pPjsNCitkZWYgSUNDX05FICA6IElDQ19WQUw8IDk+OyAgLy8gTm90IEVxdWFsDQorZGVmIElDQ19FICAgOiBJQ0NfVkFMPCAxPjsgIC8vIEVxdWFsDQorZGVmIElDQ19HICAgOiBJQ0NfVkFMPDEwPjsgIC8vIEdyZWF0ZXINCitkZWYgSUNDX0xFICA6IElDQ19WQUw8IDI+OyAgLy8gTGVzcyBvciBFcXVhbA0KK2RlZiBJQ0NfR0UgIDogSUNDX1ZBTDwxMT47ICAvLyBHcmVhdGVyIG9yIEVxdWFsDQorZGVmIElDQ19MICAgOiBJQ0NfVkFMPCAzPjsgIC8vIExlc3MNCitkZWYgSUNDX0dVICA6IElDQ19WQUw8MTI+OyAgLy8gR3JlYXRlciBVbnNpZ25lZA0KK2RlZiBJQ0NfTEVVIDogSUNDX1ZBTDwgND47ICAvLyBMZXNzIG9yIEVxdWFsIFVuc2lnbmVkDQorZGVmIElDQ19DQyAgOiBJQ0NfVkFMPDEzPjsgIC8vIENhcnJ5IENsZWFyL0dyZWF0IG9yIEVxdWFsIFVuc2lnbmVkDQorZGVmIElDQ19DUyAgOiBJQ0NfVkFMPCA1PjsgIC8vIENhcnJ5IFNldC9MZXNzIFVuc2lnbmVkDQorZGVmIElDQ19QT1MgOiBJQ0NfVkFMPDE0PjsgIC8vIFBvc2l0aXZlDQorZGVmIElDQ19ORUcgOiBJQ0NfVkFMPCA2PjsgIC8vIE5lZ2F0aXZlDQorZGVmIElDQ19WQyAgOiBJQ0NfVkFMPDE1PjsgIC8vIE92ZXJmbG93IENsZWFyDQorZGVmIElDQ19WUyAgOiBJQ0NfVkFMPCA3PjsgIC8vIE92ZXJmbG93IFNldA0KKw0KK2NsYXNzIEZDQ19WQUw8aW50IE4+IDogUGF0TGVhZjwoaTMyIE4pPjsNCitkZWYgRkNDX1UgICA6IEZDQ19WQUw8MjM+OyAgLy8gVW5vcmRlcmVkDQorZGVmIEZDQ19HICAgOiBGQ0NfVkFMPDIyPjsgIC8vIEdyZWF0ZXINCitkZWYgRkNDX1VHICA6IEZDQ19WQUw8MjE+OyAgLy8gVW5vcmRlcmVkIG9yIEdyZWF0ZXINCitkZWYgRkNDX0wgICA6IEZDQ19WQUw8MjA+OyAgLy8gTGVzcw0KK2RlZiBGQ0NfVUwgIDogRkNDX1ZBTDwxOT47ICAvLyBVbm9yZGVyZWQgb3IgTGVzcw0KK2RlZiBGQ0NfTEcgIDogRkNDX1ZBTDwxOD47ICAvLyBMZXNzIG9yIEdyZWF0ZXINCitkZWYgRkNDX05FICA6IEZDQ19WQUw8MTc+OyAgLy8gTm90IEVxdWFsDQorZGVmIEZDQ19FICAgOiBGQ0NfVkFMPDI1PjsgIC8vIEVxdWFsDQorZGVmIEZDQ19VRSAgOiBGQ0NfVkFMPDI0PjsgIC8vIFVub3JkZXJlZCBvciBFcXVhbA0KK2RlZiBGQ0NfR0UgIDogRkNDX1ZBTDwyNT47ICAvLyBHcmVhdGVyIG9yIEVxdWFsDQorZGVmIEZDQ19VR0UgOiBGQ0NfVkFMPDI2PjsgIC8vIFVub3JkZXJlZCBvciBHcmVhdGVyIG9yIEVxdWFsDQorZGVmIEZDQ19MRSAgOiBGQ0NfVkFMPDI3PjsgIC8vIExlc3Mgb3IgRXF1YWwNCitkZWYgRkNDX1VMRSA6IEZDQ19WQUw8Mjg+OyAgLy8gVW5vcmRlcmVkIG9yIExlc3Mgb3IgRXF1YWwNCitkZWYgRkNDX08gICA6IEZDQ19WQUw8Mjk+OyAgLy8gT3JkZXJlZA0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gSW5zdHJ1Y3Rpb24gQ2xhc3MgVGVtcGxhdGVzDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLy8gRjNfMTIgbXVsdGljbGFzcyAtIERlZmluZSBhIG5vcm1hbCBGM18xL0YzXzIgcGF0dGVybiBpbiBvbmUgc2hvdC4NCittdWx0aWNsYXNzIEYzXzEyPHN0cmluZyBPcGNTdHIsIGJpdHM8Nj4gT3AzVmFsLCBTRE5vZGUgT3BOb2RlPiB7DQorICBkZWYgcnIgIDogRjNfMTwyLCBPcDNWYWwsIA0KKyAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBJbnRSZWdzOiRiLCBJbnRSZWdzOiRjKSwNCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRiLCAkYywgJGRzdCIpLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgSW50UmVnczokZHN0LCAoT3BOb2RlIEludFJlZ3M6JGIsIEludFJlZ3M6JGMpKV0+Ow0KKyAgZGVmIHJpICA6IEYzXzI8MiwgT3AzVmFsLA0KKyAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBJbnRSZWdzOiRiLCBpMzJpbW06JGMpLA0KKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGIsICRjLCAkZHN0IiksDQorICAgICAgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsIChPcE5vZGUgSW50UmVnczokYiwgc2ltbTEzOiRjKSldPjsNCit9DQorDQorLy8vIEYzXzEybnAgbXVsdGljbGFzcyAtIERlZmluZSBhIG5vcm1hbCBGM18xL0YzXzIgcGF0dGVybiBpbiBvbmUgc2hvdCwgd2l0aCBubw0KKy8vLyBwYXR0ZXJuLg0KK211bHRpY2xhc3MgRjNfMTJucDxzdHJpbmcgT3BjU3RyLCBiaXRzPDY+IE9wM1ZhbD4gew0KKyAgZGVmIHJyICA6IEYzXzE8MiwgT3AzVmFsLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEludFJlZ3M6JGRzdCksIChpbnMgSW50UmVnczokYiwgSW50UmVnczokYyksDQorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkYiwgJGMsICRkc3QiKSwgW10+Ow0KKyAgZGVmIHJpICA6IEYzXzI8MiwgT3AzVmFsLA0KKyAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBJbnRSZWdzOiRiLCBpMzJpbW06JGMpLA0KKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGIsICRjLCAkZHN0IiksIFtdPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIFBzZXVkbyBpbnN0cnVjdGlvbnMuDQorY2xhc3MgUHNldWRvPGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4NCisgICA6IEluc3RTUDxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj47DQorDQorLy8gR0VUUENYIGZvciBQSUMNCitsZXQgRGVmcyA9IFtPN10sIFVzZXMgPSBbTzddIGluIHsNCisgIGRlZiBHRVRQQ1ggOiBQc2V1ZG88KG91dHMgZ2V0UENYOiRnZXRwY3NlcSksIChpbnMpLCAiJGdldHBjc2VxIiwgW10gPjsNCit9DQorDQorbGV0IERlZnMgPSBbTzZdLCBVc2VzID0gW082XSBpbiB7DQorZGVmIEFESkNBTExTVEFDS0RPV04gOiBQc2V1ZG88KG91dHMpLCAoaW5zIGkzMmltbTokYW10KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiFBREpDQUxMU1RBQ0tET1dOICRhbXQiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGNhbGxzZXFfc3RhcnQgdGltbTokYW10KV0+Ow0KK2RlZiBBREpDQUxMU1RBQ0tVUCA6IFBzZXVkbzwob3V0cyksIChpbnMgaTMyaW1tOiRhbXQxLCBpMzJpbW06JGFtdDIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIUFESkNBTExTVEFDS1VQICRhbXQxIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhjYWxsc2VxX2VuZCB0aW1tOiRhbXQxLCB0aW1tOiRhbXQyKV0+Ow0KK30NCisNCisvLyBGcE1PVkQvRnBORUdEL0ZwQUJTRCAtIFRoZXNlIGFyZSBsb3dlcmVkIHRvIHNpbmdsZS1wcmVjaXNpb24gb3BzIGJ5IHRoZSANCisvLyBmcG1vdmVyIHBhc3MuDQorbGV0IFByZWRpY2F0ZXMgPSBbSGFzTm9WOV0gaW4geyAgLy8gT25seSBlbWl0IHRoZXNlIGluIFY4IG1vZGUuDQorICBkZWYgRnBNT1ZEIDogUHNldWRvPChvdXRzIERGUFJlZ3M6JGRzdCksIChpbnMgREZQUmVnczokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIiFGcE1PVkQgJHNyYywgJGRzdCIsIFtdPjsNCisgIGRlZiBGcE5FR0QgOiBQc2V1ZG88KG91dHMgREZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiIUZwTkVHRCAkc3JjLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgREZQUmVnczokZHN0LCAoZm5lZyBERlBSZWdzOiRzcmMpKV0+Ow0KKyAgZGVmIEZwQUJTRCA6IFBzZXVkbzwob3V0cyBERlBSZWdzOiRkc3QpLCAoaW5zIERGUFJlZ3M6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICIhRnBBQlNEICRzcmMsICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBERlBSZWdzOiRkc3QsIChmYWJzIERGUFJlZ3M6JHNyYykpXT47DQorfQ0KKw0KKy8vIFNFTEVDVF9DQ18qIC0gVXNlZCB0byBpbXBsZW1lbnQgdGhlIFNFTEVDVF9DQyBEQUcgb3BlcmF0aW9uLiAgRXhwYW5kZWQgYWZ0ZXINCisvLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gaW50byBhIGJyYW5jaCBzZXF1ZW5jZS4gIFRoaXMgaGFzIHRvIGhhbmRsZSBhbGwNCisvLyBwZXJtdXRhdGlvbnMgb2Ygc2VsZWN0aW9uIGJldHdlZW4gaTMyL2YzMi9mNjQgb24gSUNDIGFuZCBGQ0MuDQorbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4geyAgIC8vIEV4cGFuZGVkIGFmdGVyIGluc3RydWN0aW9uIHNlbGVjdGlvbi4NCisgIGRlZiBTRUxFQ1RfQ0NfSW50X0lDQw0KKyAgIDogUHNldWRvPChvdXRzIEludFJlZ3M6JGRzdCksIChpbnMgSW50UmVnczokVCwgSW50UmVnczokRiwgaTMyaW1tOiRDb25kKSwNCisgICAgICAgICAgICAiOyBTRUxFQ1RfQ0NfSW50X0lDQyBQU0VVRE8hIiwNCisgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsIChTUHNlbGVjdGljYyBJbnRSZWdzOiRULCBJbnRSZWdzOiRGLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokQ29uZCkpXT47DQorICBkZWYgU0VMRUNUX0NDX0ludF9GQ0MNCisgICA6IFBzZXVkbzwob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zIEludFJlZ3M6JFQsIEludFJlZ3M6JEYsIGkzMmltbTokQ29uZCksDQorICAgICAgICAgICAgIjsgU0VMRUNUX0NDX0ludF9GQ0MgUFNFVURPISIsDQorICAgICAgICAgICAgWyhzZXQgSW50UmVnczokZHN0LCAoU1BzZWxlY3RmY2MgSW50UmVnczokVCwgSW50UmVnczokRiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JENvbmQpKV0+Ow0KKyAgZGVmIFNFTEVDVF9DQ19GUF9JQ0MNCisgICA6IFBzZXVkbzwob3V0cyBGUFJlZ3M6JGRzdCksIChpbnMgRlBSZWdzOiRULCBGUFJlZ3M6JEYsIGkzMmltbTokQ29uZCksDQorICAgICAgICAgICAgIjsgU0VMRUNUX0NDX0ZQX0lDQyBQU0VVRE8hIiwNCisgICAgICAgICAgICBbKHNldCBGUFJlZ3M6JGRzdCwgKFNQc2VsZWN0aWNjIEZQUmVnczokVCwgRlBSZWdzOiRGLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRDb25kKSldPjsNCisgIGRlZiBTRUxFQ1RfQ0NfRlBfRkNDDQorICAgOiBQc2V1ZG88KG91dHMgRlBSZWdzOiRkc3QpLCAoaW5zIEZQUmVnczokVCwgRlBSZWdzOiRGLCBpMzJpbW06JENvbmQpLA0KKyAgICAgICAgICAgICI7IFNFTEVDVF9DQ19GUF9GQ0MgUFNFVURPISIsDQorICAgICAgICAgICAgWyhzZXQgRlBSZWdzOiRkc3QsIChTUHNlbGVjdGZjYyBGUFJlZ3M6JFQsIEZQUmVnczokRiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokQ29uZCkpXT47DQorICBkZWYgU0VMRUNUX0NDX0RGUF9JQ0MNCisgICA6IFBzZXVkbzwob3V0cyBERlBSZWdzOiRkc3QpLCAoaW5zIERGUFJlZ3M6JFQsIERGUFJlZ3M6JEYsIGkzMmltbTokQ29uZCksDQorICAgICAgICAgICAgIjsgU0VMRUNUX0NDX0RGUF9JQ0MgUFNFVURPISIsDQorICAgICAgICAgICAgWyhzZXQgREZQUmVnczokZHN0LCAoU1BzZWxlY3RpY2MgREZQUmVnczokVCwgREZQUmVnczokRiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JENvbmQpKV0+Ow0KKyAgZGVmIFNFTEVDVF9DQ19ERlBfRkNDDQorICAgOiBQc2V1ZG88KG91dHMgREZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRULCBERlBSZWdzOiRGLCBpMzJpbW06JENvbmQpLA0KKyAgICAgICAgICAgICI7IFNFTEVDVF9DQ19ERlBfRkNDIFBTRVVETyEiLA0KKyAgICAgICAgICAgIFsoc2V0IERGUFJlZ3M6JGRzdCwgKFNQc2VsZWN0ZmNjIERGUFJlZ3M6JFQsIERGUFJlZ3M6JEYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRDb25kKSldPjsNCit9DQorDQorDQorLy8gU2VjdGlvbiBBLjMgLSBTeW50aGV0aWMgSW5zdHJ1Y3Rpb25zLCBwLiA4NQ0KKy8vIHNwZWNpYWwgY2FzZXMgb2YgSk1QTDoNCitsZXQgaXNSZXR1cm4gPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBoYXNEZWxheVNsb3QgPSAxLCBpc0JhcnJpZXIgPSAxIGluIHsNCisgIGxldCByZCA9IE83Lk51bSwgcnMxID0gRzAuTnVtLCBzaW1tMTMgPSA4IGluDQorICAgIGRlZiBSRVRMOiBGM18yPDIsIDBiMTExMDAwLCAob3V0cyksIChpbnMpLCAicmV0bCIsIFsocmV0ZmxhZyldPjsNCit9DQorDQorLy8gU2VjdGlvbiBCLjEgLSBMb2FkIEludGVnZXIgSW5zdHJ1Y3Rpb25zLCBwLiA5MA0KK2RlZiBMRFNCcnIgOiBGM18xPDMsIDBiMDAxMDAxLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEludFJlZ3M6JGRzdCksIChpbnMgTUVNcnI6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICJsZHNiIFskYWRkcl0sICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEludFJlZ3M6JGRzdCwgKHNleHRsb2FkaTggQUREUnJyOiRhZGRyKSldPjsNCitkZWYgTERTQnJpIDogRjNfMjwzLCAwYjAwMTAwMSwNCisgICAgICAgICAgICAgICAgICAob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zIE1FTXJpOiRhZGRyKSwNCisgICAgICAgICAgICAgICAgICAibGRzYiBbJGFkZHJdLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsIChzZXh0bG9hZGk4IEFERFJyaTokYWRkcikpXT47DQorZGVmIExEU0hyciA6IEYzXzE8MywgMGIwMDEwMTAsDQorICAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBNRU1ycjokYWRkciksDQorICAgICAgICAgICAgICAgICAgImxkc2ggWyRhZGRyXSwgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgSW50UmVnczokZHN0LCAoc2V4dGxvYWRpMTYgQUREUnJyOiRhZGRyKSldPjsNCitkZWYgTERTSHJpIDogRjNfMjwzLCAwYjAwMTAxMCwNCisgICAgICAgICAgICAgICAgICAob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zIE1FTXJpOiRhZGRyKSwNCisgICAgICAgICAgICAgICAgICAibGRzaCBbJGFkZHJdLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsIChzZXh0bG9hZGkxNiBBRERScmk6JGFkZHIpKV0+Ow0KK2RlZiBMRFVCcnIgOiBGM18xPDMsIDBiMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEludFJlZ3M6JGRzdCksIChpbnMgTUVNcnI6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICJsZHViIFskYWRkcl0sICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEludFJlZ3M6JGRzdCwgKHpleHRsb2FkaTggQUREUnJyOiRhZGRyKSldPjsNCitkZWYgTERVQnJpIDogRjNfMjwzLCAwYjAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zIE1FTXJpOiRhZGRyKSwNCisgICAgICAgICAgICAgICAgICAibGR1YiBbJGFkZHJdLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsICh6ZXh0bG9hZGk4IEFERFJyaTokYWRkcikpXT47DQorZGVmIExEVUhyciA6IEYzXzE8MywgMGIwMDAwMTAsDQorICAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBNRU1ycjokYWRkciksDQorICAgICAgICAgICAgICAgICAgImxkdWggWyRhZGRyXSwgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgSW50UmVnczokZHN0LCAoemV4dGxvYWRpMTYgQUREUnJyOiRhZGRyKSldPjsNCitkZWYgTERVSHJpIDogRjNfMjwzLCAwYjAwMDAxMCwNCisgICAgICAgICAgICAgICAgICAob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zIE1FTXJpOiRhZGRyKSwNCisgICAgICAgICAgICAgICAgICAibGR1aCBbJGFkZHJdLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsICh6ZXh0bG9hZGkxNiBBRERScmk6JGFkZHIpKV0+Ow0KK2RlZiBMRHJyICAgOiBGM18xPDMsIDBiMDAwMDAwLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEludFJlZ3M6JGRzdCksIChpbnMgTUVNcnI6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICJsZCBbJGFkZHJdLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsIChsb2FkIEFERFJycjokYWRkcikpXT47DQorZGVmIExEcmkgICA6IEYzXzI8MywgMGIwMDAwMDAsDQorICAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBNRU1yaTokYWRkciksDQorICAgICAgICAgICAgICAgICAgImxkIFskYWRkcl0sICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEludFJlZ3M6JGRzdCwgKGxvYWQgQUREUnJpOiRhZGRyKSldPjsNCisNCisvLyBTZWN0aW9uIEIuMiAtIExvYWQgRmxvYXRpbmctcG9pbnQgSW5zdHJ1Y3Rpb25zLCBwLiA5Mg0KK2RlZiBMREZyciAgOiBGM18xPDMsIDBiMTAwMDAwLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEZQUmVnczokZHN0KSwgKGlucyBNRU1ycjokYWRkciksDQorICAgICAgICAgICAgICAgICAgImxkIFskYWRkcl0sICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEZQUmVnczokZHN0LCAobG9hZCBBRERScnI6JGFkZHIpKV0+Ow0KK2RlZiBMREZyaSAgOiBGM18yPDMsIDBiMTAwMDAwLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEZQUmVnczokZHN0KSwgKGlucyBNRU1yaTokYWRkciksDQorICAgICAgICAgICAgICAgICAgImxkIFskYWRkcl0sICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEZQUmVnczokZHN0LCAobG9hZCBBRERScmk6JGFkZHIpKV0+Ow0KK2RlZiBMRERGcnIgOiBGM18xPDMsIDBiMTAwMDExLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIERGUFJlZ3M6JGRzdCksIChpbnMgTUVNcnI6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICJsZGQgWyRhZGRyXSwgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgREZQUmVnczokZHN0LCAobG9hZCBBRERScnI6JGFkZHIpKV0+Ow0KK2RlZiBMRERGcmkgOiBGM18yPDMsIDBiMTAwMDExLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIERGUFJlZ3M6JGRzdCksIChpbnMgTUVNcmk6JGFkZHIpLA0KKyAgICAgICAgICAgICAgICAgICJsZGQgWyRhZGRyXSwgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgREZQUmVnczokZHN0LCAobG9hZCBBRERScmk6JGFkZHIpKV0+Ow0KKw0KKy8vIFNlY3Rpb24gQi40IC0gU3RvcmUgSW50ZWdlciBJbnN0cnVjdGlvbnMsIHAuIDk1DQorZGVmIFNUQnJyIDogRjNfMTwzLCAwYjAwMDEwMSwNCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBNRU1ycjokYWRkciwgSW50UmVnczokc3JjKSwNCisgICAgICAgICAgICAgICAgICJzdGIgJHNyYywgWyRhZGRyXSIsDQorICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpOCBJbnRSZWdzOiRzcmMsIEFERFJycjokYWRkcildPjsNCitkZWYgU1RCcmkgOiBGM18yPDMsIDBiMDAwMTAxLA0KKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIE1FTXJpOiRhZGRyLCBJbnRSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgInN0YiAkc3JjLCBbJGFkZHJdIiwNCisgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWk4IEludFJlZ3M6JHNyYywgQUREUnJpOiRhZGRyKV0+Ow0KK2RlZiBTVEhyciA6IEYzXzE8MywgMGIwMDAxMTAsDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgTUVNcnI6JGFkZHIsIEludFJlZ3M6JHNyYyksDQorICAgICAgICAgICAgICAgICAic3RoICRzcmMsIFskYWRkcl0iLA0KKyAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTE2IEludFJlZ3M6JHNyYywgQUREUnJyOiRhZGRyKV0+Ow0KK2RlZiBTVEhyaSA6IEYzXzI8MywgMGIwMDAxMTAsDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgTUVNcmk6JGFkZHIsIEludFJlZ3M6JHNyYyksDQorICAgICAgICAgICAgICAgICAic3RoICRzcmMsIFskYWRkcl0iLA0KKyAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTE2IEludFJlZ3M6JHNyYywgQUREUnJpOiRhZGRyKV0+Ow0KK2RlZiBTVHJyICA6IEYzXzE8MywgMGIwMDAxMDAsDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgTUVNcnI6JGFkZHIsIEludFJlZ3M6JHNyYyksDQorICAgICAgICAgICAgICAgICAic3QgJHNyYywgWyRhZGRyXSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIEludFJlZ3M6JHNyYywgQUREUnJyOiRhZGRyKV0+Ow0KK2RlZiBTVHJpICA6IEYzXzI8MywgMGIwMDAxMDAsDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgTUVNcmk6JGFkZHIsIEludFJlZ3M6JHNyYyksDQorICAgICAgICAgICAgICAgICAic3QgJHNyYywgWyRhZGRyXSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIEludFJlZ3M6JHNyYywgQUREUnJpOiRhZGRyKV0+Ow0KKw0KKy8vIFNlY3Rpb24gQi41IC0gU3RvcmUgRmxvYXRpbmctcG9pbnQgSW5zdHJ1Y3Rpb25zLCBwLiA5Nw0KK2RlZiBTVEZyciAgIDogRjNfMTwzLCAwYjEwMDEwMCwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIE1FTXJyOiRhZGRyLCBGUFJlZ3M6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJzdCAkc3JjLCBbJGFkZHJdIiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBGUFJlZ3M6JHNyYywgQUREUnJyOiRhZGRyKV0+Ow0KK2RlZiBTVEZyaSAgIDogRjNfMjwzLCAwYjEwMDEwMCwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIE1FTXJpOiRhZGRyLCBGUFJlZ3M6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJzdCAkc3JjLCBbJGFkZHJdIiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBGUFJlZ3M6JHNyYywgQUREUnJpOiRhZGRyKV0+Ow0KK2RlZiBTVERGcnIgIDogRjNfMTwzLCAwYjEwMDExMSwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIE1FTXJyOiRhZGRyLCBERlBSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAic3RkICAkc3JjLCBbJGFkZHJdIiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBERlBSZWdzOiRzcmMsIEFERFJycjokYWRkcildPjsNCitkZWYgU1RERnJpICA6IEYzXzI8MywgMGIxMDAxMTEsDQorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBNRU1yaTokYWRkciwgREZQUmVnczokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgInN0ZCAkc3JjLCBbJGFkZHJdIiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBERlBSZWdzOiRzcmMsIEFERFJyaTokYWRkcildPjsNCisNCisvLyBTZWN0aW9uIEIuOSAtIFNFVEhJIEluc3RydWN0aW9uLCBwLiAxMDQNCitkZWYgU0VUSElpOiBGMl8xPDBiMTAwLA0KKyAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAic2V0aGkgJHNyYywgJGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsIFNFVEhJaW1tOiRzcmMpXT47DQorDQorLy8gU2VjdGlvbiBCLjEwIC0gTk9QIEluc3RydWN0aW9uLCBwLiAxMDUNCisvLyAoSXQncyBhIHNwZWNpYWwgY2FzZSBvZiBTRVRISSkNCitsZXQgcmQgPSAwLCBpbW0yMiA9IDAgaW4NCisgIGRlZiBOT1AgOiBGMl8xPDBiMTAwLCAob3V0cyksIChpbnMpLCAibm9wIiwgW10+Ow0KKw0KKy8vIFNlY3Rpb24gQi4xMSAtIExvZ2ljYWwgSW5zdHJ1Y3Rpb25zLCBwLiAxMDYNCitkZWZtIEFORCAgICA6IEYzXzEyPCJhbmQiLCAwYjAwMDAwMSwgYW5kPjsNCisNCitkZWYgQU5ETnJyICA6IEYzXzE8MiwgMGIwMDAxMDEsDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEludFJlZ3M6JGRzdCksIChpbnMgSW50UmVnczokYiwgSW50UmVnczokYyksDQorICAgICAgICAgICAgICAgICAgICJhbmRuICRiLCAkYywgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEludFJlZ3M6JGRzdCwgKGFuZCBJbnRSZWdzOiRiLCAobm90IEludFJlZ3M6JGMpKSldPjsNCitkZWYgQU5ETnJpICA6IEYzXzI8MiwgMGIwMDAxMDEsDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEludFJlZ3M6JGRzdCksIChpbnMgSW50UmVnczokYiwgaTMyaW1tOiRjKSwNCisgICAgICAgICAgICAgICAgICAgImFuZG4gJGIsICRjLCAkZHN0IiwgW10+Ow0KKw0KK2RlZm0gT1IgICAgIDogRjNfMTI8Im9yIiwgMGIwMDAwMTAsIG9yPjsNCisNCitkZWYgT1JOcnIgICA6IEYzXzE8MiwgMGIwMDAxMTAsDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEludFJlZ3M6JGRzdCksIChpbnMgSW50UmVnczokYiwgSW50UmVnczokYyksDQorICAgICAgICAgICAgICAgICAgICJvcm4gJGIsICRjLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgSW50UmVnczokZHN0LCAob3IgSW50UmVnczokYiwgKG5vdCBJbnRSZWdzOiRjKSkpXT47DQorZGVmIE9STnJpICAgOiBGM18yPDIsIDBiMDAwMTEwLA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zIEludFJlZ3M6JGIsIGkzMmltbTokYyksDQorICAgICAgICAgICAgICAgICAgICJvcm4gJGIsICRjLCAkZHN0IiwgW10+Ow0KK2RlZm0gWE9SICAgIDogRjNfMTI8InhvciIsIDBiMDAwMDExLCB4b3I+Ow0KKw0KK2RlZiBYTk9ScnIgIDogRjNfMTwyLCAwYjAwMDExMSwNCisgICAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBJbnRSZWdzOiRiLCBJbnRSZWdzOiRjKSwNCisgICAgICAgICAgICAgICAgICAgInhub3IgJGIsICRjLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgSW50UmVnczokZHN0LCAobm90ICh4b3IgSW50UmVnczokYiwgSW50UmVnczokYykpKV0+Ow0KK2RlZiBYTk9ScmkgIDogRjNfMjwyLCAwYjAwMDExMSwNCisgICAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBJbnRSZWdzOiRiLCBpMzJpbW06JGMpLA0KKyAgICAgICAgICAgICAgICAgICAieG5vciAkYiwgJGMsICRkc3QiLCBbXT47DQorDQorLy8gU2VjdGlvbiBCLjEyIC0gU2hpZnQgSW5zdHJ1Y3Rpb25zLCBwLiAxMDcNCitkZWZtIFNMTCA6IEYzXzEyPCJzbGwiLCAwYjEwMDEwMSwgc2hsPjsNCitkZWZtIFNSTCA6IEYzXzEyPCJzcmwiLCAwYjEwMDExMCwgc3JsPjsNCitkZWZtIFNSQSA6IEYzXzEyPCJzcmEiLCAwYjEwMDExMSwgc3JhPjsNCisNCisvLyBTZWN0aW9uIEIuMTMgLSBBZGQgSW5zdHJ1Y3Rpb25zLCBwLiAxMDgNCitkZWZtIEFERCAgIDogRjNfMTI8ImFkZCIsIDBiMDAwMDAwLCBhZGQ+Ow0KKw0KKy8vICJMRUEiIGZvcm1zIG9mIGFkZCAocGF0dGVybnMgdG8gbWFrZSB0YmxnZW4gaGFwcHkpDQorZGVmIExFQV9BRERyaSAgIDogRjNfMjwyLCAwYjAwMDAwMCwNCisgICAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBNRU1yaTokYWRkciksDQorICAgICAgICAgICAgICAgICAgICJhZGQgJHthZGRyOmFyaXRofSwgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEludFJlZ3M6JGRzdCwgQUREUnJpOiRhZGRyKV0+Ow0KKw0KK2xldCBEZWZzID0gW0lDQ10gaW4gICAgICAgICAgICAgICAgICAgDQorICBkZWZtIEFERENDICA6IEYzXzEyPCJhZGRjYyIsIDBiMDEwMDAwLCBhZGRjPjsNCisNCitkZWZtIEFERFggIDogRjNfMTI8ImFkZHgiLCAwYjAwMTAwMCwgYWRkZT47DQorDQorLy8gU2VjdGlvbiBCLjE1IC0gU3VidHJhY3QgSW5zdHJ1Y3Rpb25zLCBwLiAxMTANCitkZWZtIFNVQiAgICA6IEYzXzEyICA8InN1YiIgICwgMGIwMDAxMDAsIHN1Yj47DQorZGVmbSBTVUJYICAgOiBGM18xMiAgPCJzdWJ4IiAsIDBiMDAxMTAwLCBzdWJlPjsNCisNCitsZXQgRGVmcyA9IFtJQ0NdIGluIHsNCisgIGRlZm0gU1VCQ0MgIDogRjNfMTIgIDwic3ViY2MiLCAwYjAxMDEwMCwgU1BjbXBpY2M+Ow0KKw0KKyAgZGVmIFNVQlhDQ3JyOiBGM18xPDIsIDBiMDExMTAwLCANCisgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBJbnRSZWdzOiRiLCBJbnRSZWdzOiRjKSwNCisgICAgICAgICAgICAgICAgInN1YnhjYyAkYiwgJGMsICRkc3QiLCBbXT47DQorfQ0KKw0KKy8vIFNlY3Rpb24gQi4xOCAtIE11bHRpcGx5IEluc3RydWN0aW9ucywgcC4gMTEzDQorZGVmbSBVTVVMIDogRjNfMTJucDwidW11bCIsIDBiMDAxMDEwPjsNCitkZWZtIFNNVUwgOiBGM18xMiAgPCJzbXVsIiwgMGIwMDEwMTEsIG11bD47DQorDQorDQorLy8gU2VjdGlvbiBCLjE5IC0gRGl2aWRlIEluc3RydWN0aW9ucywgcC4gMTE1DQorZGVmbSBVRElWIDogRjNfMTJucDwidWRpdiIsIDBiMDAxMTEwPjsNCitkZWZtIFNESVYgOiBGM18xMm5wPCJzZGl2IiwgMGIwMDExMTE+Ow0KKw0KKy8vIFNlY3Rpb24gQi4yMCAtIFNBVkUgYW5kIFJFU1RPUkUsIHAuIDExNw0KK2RlZm0gU0FWRSAgICA6IEYzXzEybnA8InNhdmUiICAgLCAwYjExMTEwMD47DQorZGVmbSBSRVNUT1JFIDogRjNfMTJucDwicmVzdG9yZSIsIDBiMTExMTAxPjsNCisNCisvLyBTZWN0aW9uIEIuMjEgLSBCcmFuY2ggb24gSW50ZWdlciBDb25kaXRpb24gQ29kZXMgSW5zdHJ1Y3Rpb25zLCBwLiAxMTkNCisNCisvLyBjb25kaXRpb25hbCBicmFuY2ggY2xhc3M6DQorY2xhc3MgQnJhbmNoU1A8Yml0czw0PiBjYywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+DQorIDogRjJfMjxjYywgMGIwMTAsIChvdXRzKSwgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsNCisgIGxldCBpc0JyYW5jaCA9IDE7DQorICBsZXQgaXNUZXJtaW5hdG9yID0gMTsNCisgIGxldCBoYXNEZWxheVNsb3QgPSAxOw0KK30NCisNCitsZXQgaXNCYXJyaWVyID0gMSBpbg0KKyAgZGVmIEJBICAgOiBCcmFuY2hTUDwwYjEwMDAsIChpbnMgYnJ0YXJnZXQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICJiYSAkZHN0IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhiciBiYjokZHN0KV0+Ow0KKw0KKy8vIEZJWE1FOiB0aGUgZW5jb2RpbmcgZm9yIHRoZSBKSVQgc2hvdWxkIGxvb2sgYXQgdGhlIGNvbmRpdGlvbiBmaWVsZC4NCitsZXQgVXNlcyA9IFtJQ0NdIGluDQorICBkZWYgQkNPTkQgOiBCcmFuY2hTUDwwLCAoaW5zIGJydGFyZ2V0OiRkc3QsIENDT3A6JGNjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImIkY2MgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhTUGJyaWNjIGJiOiRkc3QsIGltbTokY2MpXT47DQorDQorDQorLy8gU2VjdGlvbiBCLjIyIC0gQnJhbmNoIG9uIEZsb2F0aW5nLXBvaW50IENvbmRpdGlvbiBDb2RlcyBJbnN0cnVjdGlvbnMsIHAuIDEyMQ0KKw0KKy8vIGZsb2F0aW5nLXBvaW50IGNvbmRpdGlvbmFsIGJyYW5jaCBjbGFzczoNCitjbGFzcyBGUEJyYW5jaFNQPGJpdHM8ND4gY2MsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPg0KKyA6IEYyXzI8Y2MsIDBiMTEwLCAob3V0cyksIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7DQorICBsZXQgaXNCcmFuY2ggPSAxOw0KKyAgbGV0IGlzVGVybWluYXRvciA9IDE7DQorICBsZXQgaGFzRGVsYXlTbG90ID0gMTsNCit9DQorDQorLy8gRklYTUU6IHRoZSBlbmNvZGluZyBmb3IgdGhlIEpJVCBzaG91bGQgbG9vayBhdCB0aGUgY29uZGl0aW9uIGZpZWxkLg0KK2xldCBVc2VzID0gW0ZDQ10gaW4NCisgIGRlZiBGQkNPTkQgIDogRlBCcmFuY2hTUDwwLCAoaW5zIGJydGFyZ2V0OiRkc3QsIENDT3A6JGNjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmIkY2MgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhTUGJyZmNjIGJiOiRkc3QsIGltbTokY2MpXT47DQorDQorDQorLy8gU2VjdGlvbiBCLjI0IC0gQ2FsbCBhbmQgTGluayBJbnN0cnVjdGlvbiwgcC4gMTI1DQorLy8gVGhpcyBpcyB0aGUgb25seSBGb3JtYXQgMSBpbnN0cnVjdGlvbg0KK2xldCBVc2VzID0gW08wLCBPMSwgTzIsIE8zLCBPNCwgTzVdLA0KKyAgICBoYXNEZWxheVNsb3QgPSAxLCBpc0NhbGwgPSAxLA0KKyAgICBEZWZzID0gW08wLCBPMSwgTzIsIE8zLCBPNCwgTzUsIE83LCBHMSwgRzIsIEczLCBHNCwgRzUsIEc2LCBHNywNCisgICAgRDAsIEQxLCBEMiwgRDMsIEQ0LCBENSwgRDYsIEQ3LCBEOCwgRDksIEQxMCwgRDExLCBEMTIsIEQxMywgRDE0LCBEMTVdIGluIHsgDQorICBkZWYgQ0FMTCA6IEluc3RTUDwob3V0cyksIChpbnMgY2FsbHRhcmdldDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICJjYWxsICRkc3QiLCBbXT4gew0KKyAgICBiaXRzPDMwPiBkaXNwOw0KKyAgICBsZXQgb3AgPSAxOw0KKyAgICBsZXQgSW5zdHsyOS0wfSA9IGRpc3A7DQorICB9DQorICANCisgIC8vIGluZGlyZWN0IGNhbGxzDQorICBkZWYgSk1QTHJyIDogRjNfMTwyLCAwYjExMTAwMCwNCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBNRU1ycjokcHRyKSwNCisgICAgICAgICAgICAgICAgICAgICJjYWxsICRwdHIiLA0KKyAgICAgICAgICAgICAgICAgICAgWyhjYWxsIEFERFJycjokcHRyKV0+Ow0KKyAgZGVmIEpNUExyaSA6IEYzXzI8MiwgMGIxMTEwMDAsDQorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgTUVNcmk6JHB0ciksDQorICAgICAgICAgICAgICAgICAgICAiY2FsbCAkcHRyIiwNCisgICAgICAgICAgICAgICAgICAgIFsoY2FsbCBBRERScmk6JHB0cildPjsNCit9DQorDQorLy8gU2VjdGlvbiBCLjI4IC0gUmVhZCBTdGF0ZSBSZWdpc3RlciBJbnN0cnVjdGlvbnMNCitkZWYgUkRZIDogRjNfMTwyLCAwYjEwMTAwMCwNCisgICAgICAgICAgICAgICAob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAicmQgJXksICRkc3QiLCBbXT47DQorDQorLy8gU2VjdGlvbiBCLjI5IC0gV3JpdGUgU3RhdGUgUmVnaXN0ZXIgSW5zdHJ1Y3Rpb25zDQorZGVmIFdSWXJyIDogRjNfMTwyLCAwYjExMDAwMCwNCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBJbnRSZWdzOiRiLCBJbnRSZWdzOiRjKSwNCisgICAgICAgICAgICAgICAgICJ3ciAkYiwgJGMsICV5IiwgW10+Ow0KK2RlZiBXUllyaSA6IEYzXzI8MiwgMGIxMTAwMDAsDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgSW50UmVnczokYiwgaTMyaW1tOiRjKSwNCisgICAgICAgICAgICAgICAgICJ3ciAkYiwgJGMsICV5IiwgW10+Ow0KKw0KKy8vIENvbnZlcnQgSW50ZWdlciB0byBGbG9hdGluZy1wb2ludCBJbnN0cnVjdGlvbnMsIHAuIDE0MQ0KK2RlZiBGSVRPUyA6IEYzXzM8MiwgMGIxMTAxMDAsIDBiMDExMDAwMTAwLA0KKyAgICAgICAgICAgICAgICAgKG91dHMgRlBSZWdzOiRkc3QpLCAoaW5zIEZQUmVnczokc3JjKSwNCisgICAgICAgICAgICAgICAgICJmaXRvcyAkc3JjLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEZQUmVnczokZHN0LCAoU1BpdG9mIEZQUmVnczokc3JjKSldPjsNCitkZWYgRklUT0QgOiBGM18zPDIsIDBiMTEwMTAwLCAwYjAxMTAwMTAwMCwgDQorICAgICAgICAgICAgICAgICAob3V0cyBERlBSZWdzOiRkc3QpLCAoaW5zIEZQUmVnczokc3JjKSwNCisgICAgICAgICAgICAgICAgICJmaXRvZCAkc3JjLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IERGUFJlZ3M6JGRzdCwgKFNQaXRvZiBGUFJlZ3M6JHNyYykpXT47DQorDQorLy8gQ29udmVydCBGbG9hdGluZy1wb2ludCB0byBJbnRlZ2VyIEluc3RydWN0aW9ucywgcC4gMTQyDQorZGVmIEZTVE9JIDogRjNfMzwyLCAwYjExMDEwMCwgMGIwMTEwMTAwMDEsDQorICAgICAgICAgICAgICAgICAob3V0cyBGUFJlZ3M6JGRzdCksIChpbnMgRlBSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImZzdG9pICRzcmMsICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgRlBSZWdzOiRkc3QsIChTUGZ0b2kgRlBSZWdzOiRzcmMpKV0+Ow0KK2RlZiBGRFRPSSA6IEYzXzM8MiwgMGIxMTAxMDAsIDBiMDExMDEwMDEwLA0KKyAgICAgICAgICAgICAgICAgKG91dHMgRlBSZWdzOiRkc3QpLCAoaW5zIERGUFJlZ3M6JHNyYyksDQorICAgICAgICAgICAgICAgICAiZmR0b2kgJHNyYywgJGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBGUFJlZ3M6JGRzdCwgKFNQZnRvaSBERlBSZWdzOiRzcmMpKV0+Ow0KKw0KKy8vIENvbnZlcnQgYmV0d2VlbiBGbG9hdGluZy1wb2ludCBGb3JtYXRzIEluc3RydWN0aW9ucywgcC4gMTQzDQorZGVmIEZTVE9EIDogRjNfMzwyLCAwYjExMDEwMCwgMGIwMTEwMDEwMDEsIA0KKyAgICAgICAgICAgICAgICAgKG91dHMgREZQUmVnczokZHN0KSwgKGlucyBGUFJlZ3M6JHNyYyksDQorICAgICAgICAgICAgICAgICAiZnN0b2QgJHNyYywgJGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBERlBSZWdzOiRkc3QsIChmZXh0ZW5kIEZQUmVnczokc3JjKSldPjsNCitkZWYgRkRUT1MgOiBGM18zPDIsIDBiMTEwMTAwLCAwYjAxMTAwMDExMCwNCisgICAgICAgICAgICAgICAgIChvdXRzIEZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImZkdG9zICRzcmMsICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgRlBSZWdzOiRkc3QsIChmcm91bmQgREZQUmVnczokc3JjKSldPjsNCisNCisvLyBGbG9hdGluZy1wb2ludCBNb3ZlIEluc3RydWN0aW9ucywgcC4gMTQ0DQorZGVmIEZNT1ZTIDogRjNfMzwyLCAwYjExMDEwMCwgMGIwMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAob3V0cyBGUFJlZ3M6JGRzdCksIChpbnMgRlBSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImZtb3ZzICRzcmMsICRkc3QiLCBbXT47DQorZGVmIEZORUdTIDogRjNfMzwyLCAwYjExMDEwMCwgMGIwMDAwMDAxMDEsIA0KKyAgICAgICAgICAgICAgICAgKG91dHMgRlBSZWdzOiRkc3QpLCAoaW5zIEZQUmVnczokc3JjKSwNCisgICAgICAgICAgICAgICAgICJmbmVncyAkc3JjLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEZQUmVnczokZHN0LCAoZm5lZyBGUFJlZ3M6JHNyYykpXT47DQorZGVmIEZBQlNTIDogRjNfMzwyLCAwYjExMDEwMCwgMGIwMDAwMDEwMDEsIA0KKyAgICAgICAgICAgICAgICAgKG91dHMgRlBSZWdzOiRkc3QpLCAoaW5zIEZQUmVnczokc3JjKSwNCisgICAgICAgICAgICAgICAgICJmYWJzcyAkc3JjLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEZQUmVnczokZHN0LCAoZmFicyBGUFJlZ3M6JHNyYykpXT47DQorDQorDQorLy8gRmxvYXRpbmctcG9pbnQgU3F1YXJlIFJvb3QgSW5zdHJ1Y3Rpb25zLCBwLjE0NQ0KK2RlZiBGU1FSVFMgOiBGM18zPDIsIDBiMTEwMTAwLCAwYjAwMDEwMTAwMSwgDQorICAgICAgICAgICAgICAgICAgKG91dHMgRlBSZWdzOiRkc3QpLCAoaW5zIEZQUmVnczokc3JjKSwNCisgICAgICAgICAgICAgICAgICAiZnNxcnRzICRzcmMsICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEZQUmVnczokZHN0LCAoZnNxcnQgRlBSZWdzOiRzcmMpKV0+Ow0KK2RlZiBGU1FSVEQgOiBGM18zPDIsIDBiMTEwMTAwLCAwYjAwMDEwMTAxMCwgDQorICAgICAgICAgICAgICAgICAgKG91dHMgREZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJmc3FydGQgJHNyYywgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgREZQUmVnczokZHN0LCAoZnNxcnQgREZQUmVnczokc3JjKSldPjsNCisNCisNCisNCisvLyBGbG9hdGluZy1wb2ludCBBZGQgYW5kIFN1YnRyYWN0IEluc3RydWN0aW9ucywgcC4gMTQ2DQorZGVmIEZBRERTICA6IEYzXzM8MiwgMGIxMTAxMDAsIDBiMDAxMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEZQUmVnczokZHN0KSwgKGlucyBGUFJlZ3M6JHNyYzEsIEZQUmVnczokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImZhZGRzICRzcmMxLCAkc3JjMiwgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgRlBSZWdzOiRkc3QsIChmYWRkIEZQUmVnczokc3JjMSwgRlBSZWdzOiRzcmMyKSldPjsNCitkZWYgRkFEREQgIDogRjNfMzwyLCAwYjExMDEwMCwgMGIwMDEwMDAwMTAsDQorICAgICAgICAgICAgICAgICAgKG91dHMgREZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRzcmMxLCBERlBSZWdzOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiZmFkZGQgJHNyYzEsICRzcmMyLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBERlBSZWdzOiRkc3QsIChmYWRkIERGUFJlZ3M6JHNyYzEsIERGUFJlZ3M6JHNyYzIpKV0+Ow0KK2RlZiBGU1VCUyAgOiBGM18zPDIsIDBiMTEwMTAwLCAwYjAwMTAwMDEwMSwNCisgICAgICAgICAgICAgICAgICAob3V0cyBGUFJlZ3M6JGRzdCksIChpbnMgRlBSZWdzOiRzcmMxLCBGUFJlZ3M6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJmc3VicyAkc3JjMSwgJHNyYzIsICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEZQUmVnczokZHN0LCAoZnN1YiBGUFJlZ3M6JHNyYzEsIEZQUmVnczokc3JjMikpXT47DQorZGVmIEZTVUJEICA6IEYzXzM8MiwgMGIxMTAxMDAsIDBiMDAxMDAwMTEwLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIERGUFJlZ3M6JGRzdCksIChpbnMgREZQUmVnczokc3JjMSwgREZQUmVnczokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImZzdWJkICRzcmMxLCAkc3JjMiwgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgREZQUmVnczokZHN0LCAoZnN1YiBERlBSZWdzOiRzcmMxLCBERlBSZWdzOiRzcmMyKSldPjsNCisNCisvLyBGbG9hdGluZy1wb2ludCBNdWx0aXBseSBhbmQgRGl2aWRlIEluc3RydWN0aW9ucywgcC4gMTQ3DQorZGVmIEZNVUxTICA6IEYzXzM8MiwgMGIxMTAxMDAsIDBiMDAxMDAxMDAxLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEZQUmVnczokZHN0KSwgKGlucyBGUFJlZ3M6JHNyYzEsIEZQUmVnczokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImZtdWxzICRzcmMxLCAkc3JjMiwgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgRlBSZWdzOiRkc3QsIChmbXVsIEZQUmVnczokc3JjMSwgRlBSZWdzOiRzcmMyKSldPjsNCitkZWYgRk1VTEQgIDogRjNfMzwyLCAwYjExMDEwMCwgMGIwMDEwMDEwMTAsDQorICAgICAgICAgICAgICAgICAgKG91dHMgREZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRzcmMxLCBERlBSZWdzOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiZm11bGQgJHNyYzEsICRzcmMyLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBERlBSZWdzOiRkc3QsIChmbXVsIERGUFJlZ3M6JHNyYzEsIERGUFJlZ3M6JHNyYzIpKV0+Ow0KK2RlZiBGU01VTEQgOiBGM18zPDIsIDBiMTEwMTAwLCAwYjAwMTEwMTAwMSwNCisgICAgICAgICAgICAgICAgICAob3V0cyBERlBSZWdzOiRkc3QpLCAoaW5zIEZQUmVnczokc3JjMSwgRlBSZWdzOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiZnNtdWxkICRzcmMxLCAkc3JjMiwgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgREZQUmVnczokZHN0LCAoZm11bCAoZmV4dGVuZCBGUFJlZ3M6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZleHRlbmQgRlBSZWdzOiRzcmMyKSkpXT47DQorZGVmIEZESVZTICA6IEYzXzM8MiwgMGIxMTAxMDAsIDBiMDAxMDAxMTAxLA0KKyAgICAgICAgICAgICAgICAgKG91dHMgRlBSZWdzOiRkc3QpLCAoaW5zIEZQUmVnczokc3JjMSwgRlBSZWdzOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJmZGl2cyAkc3JjMSwgJHNyYzIsICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgRlBSZWdzOiRkc3QsIChmZGl2IEZQUmVnczokc3JjMSwgRlBSZWdzOiRzcmMyKSldPjsNCitkZWYgRkRJVkQgIDogRjNfMzwyLCAwYjExMDEwMCwgMGIwMDEwMDExMTAsDQorICAgICAgICAgICAgICAgICAob3V0cyBERlBSZWdzOiRkc3QpLCAoaW5zIERGUFJlZ3M6JHNyYzEsIERGUFJlZ3M6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImZkaXZkICRzcmMxLCAkc3JjMiwgJGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBERlBSZWdzOiRkc3QsIChmZGl2IERGUFJlZ3M6JHNyYzEsIERGUFJlZ3M6JHNyYzIpKV0+Ow0KKw0KKy8vIEZsb2F0aW5nLXBvaW50IENvbXBhcmUgSW5zdHJ1Y3Rpb25zLCBwLiAxNDgNCisvLyBOb3RlOiB0aGUgMm5kIHRlbXBsYXRlIGFyZyBpcyBkaWZmZXJlbnQgZm9yIHRoZXNlIGd1eXMuDQorLy8gTm90ZSAyOiB0aGUgcmVzdWx0IG9mIGEgRkNNUCBpcyBub3QgYXZhaWxhYmxlIHVudGlsIHRoZSAybmQgY3ljbGUNCisvLyBhZnRlciB0aGUgaW5zdHIgaXMgcmV0aXJlZCwgYnV0IHRoZXJlIGlzIG5vIGludGVybG9jay4gVGhpcyBiZWhhdmlvcg0KKy8vIGlzIG1vZGVsbGVkIHdpdGggYSBmb3JjZWQgbm9vcCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24uDQorbGV0IERlZnMgPSBbRkNDXSBpbiB7DQorICBkZWYgRkNNUFMgIDogRjNfMzwyLCAwYjExMDEwMSwgMGIwMDEwMTAwMDEsDQorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBGUFJlZ3M6JHNyYzEsIEZQUmVnczokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJmY21wcyAkc3JjMSwgJHNyYzJcblx0bm9wIiwNCisgICAgICAgICAgICAgICAgICAgWyhTUGNtcGZjYyBGUFJlZ3M6JHNyYzEsIEZQUmVnczokc3JjMildPjsNCisgIGRlZiBGQ01QRCAgOiBGM18zPDIsIDBiMTEwMTAxLCAwYjAwMTAxMDAxMCwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIERGUFJlZ3M6JHNyYzEsIERGUFJlZ3M6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiZmNtcGQgJHNyYzEsICRzcmMyXG5cdG5vcCIsDQorICAgICAgICAgICAgICAgICAgIFsoU1BjbXBmY2MgREZQUmVnczokc3JjMSwgREZQUmVnczokc3JjMildPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBWOSBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIFY5IENvbmRpdGlvbmFsIE1vdmVzLg0KK2xldCBQcmVkaWNhdGVzID0gW0hhc1Y5XSwgQ29uc3RyYWludHMgPSAiJFQgPSAkZHN0IiBpbiB7DQorICAvLyBNb3ZlIEludGVnZXIgUmVnaXN0ZXIgb24gQ29uZGl0aW9uIChNT1ZjYykgcC4gMTk0IG9mIHRoZSBWOSBtYW51YWwuDQorICAvLyBGSVhNRTogQWRkIGluc3RydWN0aW9uIGVuY29kaW5ncyBmb3IgdGhlIEpJVCBzb21lIGRheS4NCisgIGRlZiBNT1ZJQ0Nycg0KKyAgICA6IFBzZXVkbzwob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zIEludFJlZ3M6JFQsIEludFJlZ3M6JEYsIENDT3A6JGNjKSwNCisgICAgICAgICAgICAgIm1vdiRjYyAlaWNjLCAkRiwgJGRzdCIsDQorICAgICAgICAgICAgIFsoc2V0IEludFJlZ3M6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKFNQc2VsZWN0aWNjIEludFJlZ3M6JEYsIEludFJlZ3M6JFQsIGltbTokY2MpKV0+Ow0KKyAgZGVmIE1PVklDQ3JpDQorICAgIDogUHNldWRvPChvdXRzIEludFJlZ3M6JGRzdCksIChpbnMgSW50UmVnczokVCwgaTMyaW1tOiRGLCBDQ09wOiRjYyksDQorICAgICAgICAgICAgICJtb3YkY2MgJWljYywgJEYsICRkc3QiLA0KKyAgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoU1BzZWxlY3RpY2Mgc2ltbTExOiRGLCBJbnRSZWdzOiRULCBpbW06JGNjKSldPjsNCisNCisgIGRlZiBNT1ZGQ0Nycg0KKyAgICA6IFBzZXVkbzwob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zIEludFJlZ3M6JFQsIEludFJlZ3M6JEYsIENDT3A6JGNjKSwNCisgICAgICAgICAgICAgIm1vdiRjYyAlZmNjMCwgJEYsICRkc3QiLA0KKyAgICAgICAgICAgICBbKHNldCBJbnRSZWdzOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChTUHNlbGVjdGZjYyBJbnRSZWdzOiRGLCBJbnRSZWdzOiRULCBpbW06JGNjKSldPjsNCisgIGRlZiBNT1ZGQ0NyaQ0KKyAgICA6IFBzZXVkbzwob3V0cyBJbnRSZWdzOiRkc3QpLCAoaW5zIEludFJlZ3M6JFQsIGkzMmltbTokRiwgQ0NPcDokY2MpLA0KKyAgICAgICAgICAgICAibW92JGNjICVmY2MwLCAkRiwgJGRzdCIsDQorICAgICAgICAgICAgIFsoc2V0IEludFJlZ3M6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChTUHNlbGVjdGZjYyBzaW1tMTE6JEYsIEludFJlZ3M6JFQsIGltbTokY2MpKV0+Ow0KKw0KKyAgZGVmIEZNT1ZTX0lDQw0KKyAgICA6IFBzZXVkbzwob3V0cyBGUFJlZ3M6JGRzdCksIChpbnMgRlBSZWdzOiRULCBGUFJlZ3M6JEYsIENDT3A6JGNjKSwNCisgICAgICAgICAgICAgImZtb3ZzJGNjICVpY2MsICRGLCAkZHN0IiwNCisgICAgICAgICAgICAgWyhzZXQgRlBSZWdzOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChTUHNlbGVjdGljYyBGUFJlZ3M6JEYsIEZQUmVnczokVCwgaW1tOiRjYykpXT47DQorICBkZWYgRk1PVkRfSUNDDQorICAgIDogUHNldWRvPChvdXRzIERGUFJlZ3M6JGRzdCksIChpbnMgREZQUmVnczokVCwgREZQUmVnczokRiwgQ0NPcDokY2MpLA0KKyAgICAgICAgICAgICAiZm1vdmQkY2MgJWljYywgJEYsICRkc3QiLA0KKyAgICAgICAgICAgICBbKHNldCBERlBSZWdzOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChTUHNlbGVjdGljYyBERlBSZWdzOiRGLCBERlBSZWdzOiRULCBpbW06JGNjKSldPjsNCisgIGRlZiBGTU9WU19GQ0MNCisgICAgOiBQc2V1ZG88KG91dHMgRlBSZWdzOiRkc3QpLCAoaW5zIEZQUmVnczokVCwgRlBSZWdzOiRGLCBDQ09wOiRjYyksDQorICAgICAgICAgICAgICJmbW92cyRjYyAlZmNjMCwgJEYsICRkc3QiLA0KKyAgICAgICAgICAgICBbKHNldCBGUFJlZ3M6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKFNQc2VsZWN0ZmNjIEZQUmVnczokRiwgRlBSZWdzOiRULCBpbW06JGNjKSldPjsNCisgIGRlZiBGTU9WRF9GQ0MNCisgICAgOiBQc2V1ZG88KG91dHMgREZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRULCBERlBSZWdzOiRGLCBDQ09wOiRjYyksDQorICAgICAgICAgICAgICJmbW92ZCRjYyAlZmNjMCwgJEYsICRkc3QiLA0KKyAgICAgICAgICAgICBbKHNldCBERlBSZWdzOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChTUHNlbGVjdGZjYyBERlBSZWdzOiRGLCBERlBSZWdzOiRULCBpbW06JGNjKSldPjsNCisNCit9DQorDQorLy8gRmxvYXRpbmctUG9pbnQgTW92ZSBJbnN0cnVjdGlvbnMsIHAuIDE2NCBvZiB0aGUgVjkgbWFudWFsLg0KK2xldCBQcmVkaWNhdGVzID0gW0hhc1Y5XSBpbiB7DQorICBkZWYgRk1PVkQgOiBGM18zPDIsIDBiMTEwMTAwLCAwYjAwMDAwMDAxMCwNCisgICAgICAgICAgICAgICAgICAgKG91dHMgREZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiZm1vdmQgJHNyYywgJGRzdCIsIFtdPjsNCisgIGRlZiBGTkVHRCA6IEYzXzM8MiwgMGIxMTAxMDAsIDBiMDAwMDAwMTEwLCANCisgICAgICAgICAgICAgICAgICAgKG91dHMgREZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiZm5lZ2QgJHNyYywgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IERGUFJlZ3M6JGRzdCwgKGZuZWcgREZQUmVnczokc3JjKSldPjsNCisgIGRlZiBGQUJTRCA6IEYzXzM8MiwgMGIxMTAxMDAsIDBiMDAwMDAxMDEwLCANCisgICAgICAgICAgICAgICAgICAgKG91dHMgREZQUmVnczokZHN0KSwgKGlucyBERlBSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiZmFic2QgJHNyYywgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IERGUFJlZ3M6JGRzdCwgKGZhYnMgREZQUmVnczokc3JjKSldPjsNCit9DQorDQorLy8gUE9QQ3JyIC0gVGhpcyBkb2VzIGEgY3Rwb3Agb2YgYSA2NC1iaXQgcmVnaXN0ZXIuICBBcyBzdWNoLCB3ZSBoYXZlIHRvIGNsZWFyDQorLy8gdGhlIHRvcCAzMi1iaXRzIGJlZm9yZSB1c2luZyBpdC4gIFRvIGRvIHRoaXMgY2xlYXJpbmcsIHdlIHVzZSBhIFNMTHJpIFgsMC4NCitkZWYgUE9QQ3JyIDogRjNfMTwyLCAwYjEwMTExMCwgDQorICAgICAgICAgICAgICAgICAgKG91dHMgSW50UmVnczokZHN0KSwgKGlucyBJbnRSZWdzOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJwb3BjICRzcmMsICRkc3QiLCBbXT4sIFJlcXVpcmVzPFtIYXNWOV0+Ow0KK2RlZiA6IFBhdDwoY3Rwb3AgSW50UmVnczokc3JjKSwNCisgICAgICAgICAgKFBPUENyciAoU0xMcmkgSW50UmVnczokc3JjLCAwKSk+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTm9uLUluc3RydWN0aW9uIFBhdHRlcm5zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBTbWFsbCBpbW1lZGlhdGVzLg0KK2RlZiA6IFBhdDwoaTMyIHNpbW0xMzokdmFsKSwNCisgICAgICAgICAgKE9ScmkgRzAsIGltbTokdmFsKT47DQorLy8gQXJiaXRyYXJ5IGltbWVkaWF0ZXMuDQorZGVmIDogUGF0PChpMzIgaW1tOiR2YWwpLA0KKyAgICAgICAgICAoT1JyaSAoU0VUSElpIChISTIyIGltbTokdmFsKSksIChMTzEwIGltbTokdmFsKSk+Ow0KKw0KKy8vIHN1YmMNCitkZWYgOiBQYXQ8KHN1YmMgSW50UmVnczokYiwgSW50UmVnczokYyksDQorICAgICAgICAgIChTVUJDQ3JyIEludFJlZ3M6JGIsIEludFJlZ3M6JGMpPjsNCitkZWYgOiBQYXQ8KHN1YmMgSW50UmVnczokYiwgc2ltbTEzOiR2YWwpLA0KKyAgICAgICAgICAoU1VCQ0NyaSBJbnRSZWdzOiRiLCBpbW06JHZhbCk+Ow0KKw0KKy8vIEdsb2JhbCBhZGRyZXNzZXMsIGNvbnN0YW50IHBvb2wgZW50cmllcw0KK2RlZiA6IFBhdDwoU1BoaSB0Z2xvYmFsYWRkcjokaW4pLCAoU0VUSElpIHRnbG9iYWxhZGRyOiRpbik+Ow0KK2RlZiA6IFBhdDwoU1BsbyB0Z2xvYmFsYWRkcjokaW4pLCAoT1JyaSBHMCwgdGdsb2JhbGFkZHI6JGluKT47DQorZGVmIDogUGF0PChTUGhpIHRjb25zdHBvb2w6JGluKSwgKFNFVEhJaSB0Y29uc3Rwb29sOiRpbik+Ow0KK2RlZiA6IFBhdDwoU1BsbyB0Y29uc3Rwb29sOiRpbiksIChPUnJpIEcwLCB0Y29uc3Rwb29sOiRpbik+Ow0KKw0KKy8vIEFkZCByZWcsIGxvLiAgVGhpcyBpcyB1c2VkIHdoZW4gdGFraW5nIHRoZSBhZGRyIG9mIGEgZ2xvYmFsL2NvbnN0cG9vbCBlbnRyeS4NCitkZWYgOiBQYXQ8KGFkZCBJbnRSZWdzOiRyLCAoU1BsbyB0Z2xvYmFsYWRkcjokaW4pKSwNCisgICAgICAgICAgKEFERHJpIEludFJlZ3M6JHIsIHRnbG9iYWxhZGRyOiRpbik+Ow0KK2RlZiA6IFBhdDwoYWRkIEludFJlZ3M6JHIsIChTUGxvIHRjb25zdHBvb2w6JGluKSksDQorICAgICAgICAgIChBRERyaSBJbnRSZWdzOiRyLCB0Y29uc3Rwb29sOiRpbik+Ow0KKw0KKy8vIENhbGxzOiANCitkZWYgOiBQYXQ8KGNhbGwgdGdsb2JhbGFkZHI6JGRzdCksDQorICAgICAgICAgIChDQUxMIHRnbG9iYWxhZGRyOiRkc3QpPjsNCitkZWYgOiBQYXQ8KGNhbGwgdGV4dGVybmFsc3ltOiRkc3QpLA0KKyAgICAgICAgICAoQ0FMTCB0ZXh0ZXJuYWxzeW06JGRzdCk+Ow0KKw0KKy8vIE1hcCBpbnRlZ2VyIGV4dGxvYWQncyB0byB6ZXh0bG9hZHMuDQorZGVmIDogUGF0PChpMzIgKGV4dGxvYWRpMSBBRERScnI6JHNyYykpLCAoTERVQnJyIEFERFJycjokc3JjKT47DQorZGVmIDogUGF0PChpMzIgKGV4dGxvYWRpMSBBRERScmk6JHNyYykpLCAoTERVQnJpIEFERFJyaTokc3JjKT47DQorZGVmIDogUGF0PChpMzIgKGV4dGxvYWRpOCBBRERScnI6JHNyYykpLCAoTERVQnJyIEFERFJycjokc3JjKT47DQorZGVmIDogUGF0PChpMzIgKGV4dGxvYWRpOCBBRERScmk6JHNyYykpLCAoTERVQnJpIEFERFJyaTokc3JjKT47DQorZGVmIDogUGF0PChpMzIgKGV4dGxvYWRpMTYgQUREUnJyOiRzcmMpKSwgKExEVUhyciBBRERScnI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoaTMyIChleHRsb2FkaTE2IEFERFJyaTokc3JjKSksIChMRFVIcmkgQUREUnJpOiRzcmMpPjsNCisNCisvLyB6ZXh0bG9hZCBib29sIC0+IHpleHRsb2FkIGJ5dGUNCitkZWYgOiBQYXQ8KGkzMiAoemV4dGxvYWRpMSBBRERScnI6JHNyYykpLCAoTERVQnJyIEFERFJycjokc3JjKT47DQorZGVmIDogUGF0PChpMzIgKHpleHRsb2FkaTEgQUREUnJpOiRzcmMpKSwgKExEVUJyaSBBRERScmk6JHNyYyk+Ow0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNNQ0FzbUluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY01DQXNtSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3ZDZkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNNQ0FzbUluZm8uY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LS0gU3BhcmNNQ0FzbUluZm8uY3BwIC0gU3BhcmMgYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2YgdGhlIFNwYXJjTUNBc21JbmZvIHByb3BlcnRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNwYXJjTUNBc21JbmZvLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU3BhcmNFTEZNQ0FzbUluZm86OlNwYXJjRUxGTUNBc21JbmZvKGNvbnN0IFRhcmdldCAmVCwgU3RyaW5nUmVmIFRUKSB7CisgIERhdGExNmJpdHNEaXJlY3RpdmUgPSAiXHQuaGFsZlx0IjsKKyAgRGF0YTMyYml0c0RpcmVjdGl2ZSA9ICJcdC53b3JkXHQiOworICBEYXRhNjRiaXRzRGlyZWN0aXZlID0gMDsgIC8vIC54d29yZCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWOS4KKyAgWmVyb0RpcmVjdGl2ZSA9ICJcdC5za2lwXHQiOworICBDb21tZW50U3RyaW5nID0gIiEiOworICBIYXNMRUIxMjggPSB0cnVlOworICBTdXBwb3J0c0RlYnVnSW5mb3JtYXRpb24gPSB0cnVlOworICAKKyAgU3VuU3R5bGVFTEZTZWN0aW9uU3dpdGNoU3ludGF4ID0gdHJ1ZTsKKyAgVXNlc0VMRlNlY3Rpb25EaXJlY3RpdmVGb3JCU1MgPSB0cnVlOworCisgIFdlYWtSZWZEaXJlY3RpdmUgPSAiXHQud2Vha1x0IjsKKworICBQcml2YXRlR2xvYmFsUHJlZml4ID0gIi5MIjsKK30KKworCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjTUNBc21JbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjTUNBc21JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiNjgyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNNQ0FzbUluZm8uaApAQCAtMCwwICsxLDI5IEBACisvLz09PT09LS0gU3BhcmNNQ0FzbUluZm8uaCAtIFNwYXJjIGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIFNwYXJjTUNBc21JbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU1BBUkNUQVJHRVRBU01JTkZPX0gKKyNkZWZpbmUgU1BBUkNUQVJHRVRBU01JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgVGFyZ2V0OworCisgIHN0cnVjdCBTcGFyY0VMRk1DQXNtSW5mbyA6IHB1YmxpYyBNQ0FzbUluZm8geworICAgIGV4cGxpY2l0IFNwYXJjRUxGTUNBc21JbmZvKGNvbnN0IFRhcmdldCAmVCwgU3RyaW5nUmVmIFRUKTsKKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNNYWNoaW5lRnVuY3Rpb25JbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjTWFjaGluZUZ1bmN0aW9uSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNGMxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjTWFjaGluZUZ1bmN0aW9uSW5mby5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBTcGFyY01hY2hpbmVGdW5jdGlvbkluZm8uaCAtIFNwYXJjIE1hY2hpbmUgRnVuY3Rpb24gSW5mbyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzICBTcGFyYyBzcGVjaWZpYyBwZXItbWFjaGluZS1mdW5jdGlvbiBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBTUEFSQ01BQ0hJTkVGVU5DVElPTklORk9fSAorI2RlZmluZSBTUEFSQ01BQ0hJTkVGVU5DVElPTklORk9fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgU3BhcmNNYWNoaW5lRnVuY3Rpb25JbmZvIDogcHVibGljIE1hY2hpbmVGdW5jdGlvbkluZm8geworICBwcml2YXRlOgorICAgIHVuc2lnbmVkIEdsb2JhbEJhc2VSZWc7CisKKyAgICAvLy8gVmFyQXJnc0ZyYW1lT2Zmc2V0IC0gRnJhbWUgb2Zmc2V0IHRvIHN0YXJ0IG9mIHZhcmFyZ3MgYXJlYS4KKyAgICBpbnQgVmFyQXJnc0ZyYW1lT2Zmc2V0OworCisgIHB1YmxpYzoKKyAgICBTcGFyY01hY2hpbmVGdW5jdGlvbkluZm8oKSA6IEdsb2JhbEJhc2VSZWcoMCksIFZhckFyZ3NGcmFtZU9mZnNldCgwKSB7fQorICAgIGV4cGxpY2l0IFNwYXJjTWFjaGluZUZ1bmN0aW9uSW5mbyhNYWNoaW5lRnVuY3Rpb24gJk1GKQorICAgICAgOiBHbG9iYWxCYXNlUmVnKDApLCBWYXJBcmdzRnJhbWVPZmZzZXQoMCkge30KKworICAgIHVuc2lnbmVkIGdldEdsb2JhbEJhc2VSZWcoKSBjb25zdCB7IHJldHVybiBHbG9iYWxCYXNlUmVnOyB9CisgICAgdm9pZCBzZXRHbG9iYWxCYXNlUmVnKHVuc2lnbmVkIFJlZykgeyBHbG9iYWxCYXNlUmVnID0gUmVnOyB9CisKKyAgICBpbnQgZ2V0VmFyQXJnc0ZyYW1lT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gVmFyQXJnc0ZyYW1lT2Zmc2V0OyB9CisgICAgdm9pZCBzZXRWYXJBcmdzRnJhbWVPZmZzZXQoaW50IE9mZnNldCkgeyBWYXJBcmdzRnJhbWVPZmZzZXQgPSBPZmZzZXQ7IH0KKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjUmVnaXN0ZXJJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNSZWdpc3RlckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2NjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjUmVnaXN0ZXJJbmZvLmNwcApAQCAtMCwwICsxLDE4OSBAQAorLy89PT0tIFNwYXJjUmVnaXN0ZXJJbmZvLmNwcCAtIFNQQVJDIFJlZ2lzdGVyIEluZm9ybWF0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFNQQVJDIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRSZWdpc3RlckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNwYXJjLmgiCisjaW5jbHVkZSAiU3BhcmNSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJTcGFyY1N1YnRhcmdldC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU3BhcmNSZWdpc3RlckluZm86OlNwYXJjUmVnaXN0ZXJJbmZvKFNwYXJjU3VidGFyZ2V0ICZzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJnRpaSkKKyAgOiBTcGFyY0dlblJlZ2lzdGVySW5mbyhTUDo6QURKQ0FMTFNUQUNLRE9XTiwgU1A6OkFESkNBTExTVEFDS1VQKSwKKyAgICBTdWJ0YXJnZXQoc3QpLCBUSUkodGlpKSB7Cit9CisKK2NvbnN0IHVuc2lnbmVkKiBTcGFyY1JlZ2lzdGVySW5mbzo6Z2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ2FsbGVlU2F2ZWRSZWdzW10gPSB7IDAgfTsKKyAgcmV0dXJuIENhbGxlZVNhdmVkUmVnczsKK30KKworQml0VmVjdG9yIFNwYXJjUmVnaXN0ZXJJbmZvOjpnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBCaXRWZWN0b3IgUmVzZXJ2ZWQoZ2V0TnVtUmVncygpKTsKKyAgUmVzZXJ2ZWQuc2V0KFNQOjpHMik7CisgIFJlc2VydmVkLnNldChTUDo6RzMpOworICBSZXNlcnZlZC5zZXQoU1A6Okc0KTsKKyAgUmVzZXJ2ZWQuc2V0KFNQOjpPNik7CisgIFJlc2VydmVkLnNldChTUDo6STYpOworICBSZXNlcnZlZC5zZXQoU1A6Okk3KTsKKyAgUmVzZXJ2ZWQuc2V0KFNQOjpHMCk7CisgIFJlc2VydmVkLnNldChTUDo6RzUpOworICBSZXNlcnZlZC5zZXQoU1A6Okc2KTsKKyAgUmVzZXJ2ZWQuc2V0KFNQOjpHNyk7CisgIHJldHVybiBSZXNlcnZlZDsKK30KKworYm9vbCBTcGFyY1JlZ2lzdGVySW5mbzo6aGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU3BhcmNSZWdpc3RlckluZm86OgorZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSBjb25zdCB7CisgIE1hY2hpbmVJbnN0ciAmTUkgPSAqSTsKKyAgRGVidWdMb2MgZGwgPSBNSS5nZXREZWJ1Z0xvYygpOworICBpbnQgU2l6ZSA9IE1JLmdldE9wZXJhbmQoMCkuZ2V0SW1tKCk7CisgIGlmIChNSS5nZXRPcGNvZGUoKSA9PSBTUDo6QURKQ0FMTFNUQUNLRE9XTikKKyAgICBTaXplID0gLVNpemU7CisgIGlmIChTaXplKQorICAgIEJ1aWxkTUkoTUJCLCBJLCBkbCwgVElJLmdldChTUDo6QUREcmkpLCBTUDo6TzYpLmFkZFJlZyhTUDo6TzYpLmFkZEltbShTaXplKTsKKyAgTUJCLmVyYXNlKEkpOworfQorCit1bnNpZ25lZAorU3BhcmNSZWdpc3RlckluZm86OmVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3QgeworICBhc3NlcnQoU1BBZGogPT0gMCAmJiAiVW5leHBlY3RlZCIpOworCisgIHVuc2lnbmVkIGkgPSAwOworICBNYWNoaW5lSW5zdHIgJk1JID0gKklJOworICBEZWJ1Z0xvYyBkbCA9IE1JLmdldERlYnVnTG9jKCk7CisgIHdoaWxlICghTUkuZ2V0T3BlcmFuZChpKS5pc0ZJKCkpIHsKKyAgICArK2k7CisgICAgYXNzZXJ0KGkgPCBNSS5nZXROdW1PcGVyYW5kcygpICYmICJJbnN0ciBkb2Vzbid0IGhhdmUgRnJhbWVJbmRleCBvcGVyYW5kISIpOworICB9CisKKyAgaW50IEZyYW1lSW5kZXggPSBNSS5nZXRPcGVyYW5kKGkpLmdldEluZGV4KCk7CisKKyAgLy8gQWRkcmVzc2FibGUgc3RhY2sgb2JqZWN0cyBhcmUgYWNjZXNzZWQgdXNpbmcgbmVnLiBvZmZzZXRzIGZyb20gJWZwCisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUkuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICBpbnQgT2Zmc2V0ID0gTUYuZ2V0RnJhbWVJbmZvKCktPmdldE9iamVjdE9mZnNldChGcmFtZUluZGV4KSArCisgICAgICAgICAgICAgICBNSS5nZXRPcGVyYW5kKGkrMSkuZ2V0SW1tKCk7CisKKyAgLy8gUmVwbGFjZSBmcmFtZSBpbmRleCB3aXRoIGEgZnJhbWUgcG9pbnRlciByZWZlcmVuY2UuCisgIGlmIChPZmZzZXQgPj0gLTQwOTYgJiYgT2Zmc2V0IDw9IDQwOTUpIHsKKyAgICAvLyBJZiB0aGUgb2Zmc2V0IGlzIHNtYWxsIGVub3VnaCB0byBmaXQgaW4gdGhlIGltbWVkaWF0ZSBmaWVsZCwgZGlyZWN0bHkKKyAgICAvLyBlbmNvZGUgaXQuCisgICAgTUkuZ2V0T3BlcmFuZChpKS5DaGFuZ2VUb1JlZ2lzdGVyKFNQOjpJNiwgZmFsc2UpOworICAgIE1JLmdldE9wZXJhbmQoaSsxKS5DaGFuZ2VUb0ltbWVkaWF0ZShPZmZzZXQpOworICB9IGVsc2UgeworICAgIC8vIE90aGVyd2lzZSwgZW1pdCBhIEcxID0gU0VUSEkgJWhpKG9mZnNldCkuICBGSVhNRTogaXQgd291bGQgYmUgYmV0dGVyIHRvIAorICAgIC8vIHNjYXZlbmdlIGEgcmVnaXN0ZXIgaGVyZSBpbnN0ZWFkIG9mIHJlc2VydmluZyBHMSBhbGwgb2YgdGhlIHRpbWUuCisgICAgdW5zaWduZWQgT2ZmSGkgPSAodW5zaWduZWQpT2Zmc2V0ID4+IDEwVTsKKyAgICBCdWlsZE1JKCpNSS5nZXRQYXJlbnQoKSwgSUksIGRsLCBUSUkuZ2V0KFNQOjpTRVRISWkpLCBTUDo6RzEpLmFkZEltbShPZmZIaSk7CisgICAgLy8gRW1pdCBHMSA9IEcxICsgSTYKKyAgICBCdWlsZE1JKCpNSS5nZXRQYXJlbnQoKSwgSUksIGRsLCBUSUkuZ2V0KFNQOjpBRERyciksIFNQOjpHMSkuYWRkUmVnKFNQOjpHMSkKKyAgICAgIC5hZGRSZWcoU1A6Okk2KTsKKyAgICAvLyBJbnNlcnQ6IEcxKyVsbyhvZmZzZXQpIGludG8gdGhlIHVzZXIuCisgICAgTUkuZ2V0T3BlcmFuZChpKS5DaGFuZ2VUb1JlZ2lzdGVyKFNQOjpHMSwgZmFsc2UpOworICAgIE1JLmdldE9wZXJhbmQoaSsxKS5DaGFuZ2VUb0ltbWVkaWF0ZShPZmZzZXQgJiAoKDEgPDwgMTApLTEpKTsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBTcGFyY1JlZ2lzdGVySW5mbzo6Citwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZChNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7fQorCit2b2lkIFNwYXJjUmVnaXN0ZXJJbmZvOjplbWl0UHJvbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gTUYuZnJvbnQoKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gTUJCLmJlZ2luKCk7CisgIERlYnVnTG9jIGRsID0gTUJCSSAhPSBNQkIuZW5kKCkgPyBNQkJJLT5nZXREZWJ1Z0xvYygpIDogRGVidWdMb2MoKTsKKworICAvLyBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBGcmFtZUluZm8KKyAgaW50IE51bUJ5dGVzID0gKGludCkgTUZJLT5nZXRTdGFja1NpemUoKTsKKworICAvLyBFbWl0IHRoZSBjb3JyZWN0IHNhdmUgaW5zdHJ1Y3Rpb24gYmFzZWQgb24gdGhlIG51bWJlciBvZiBieXRlcyBpbgorICAvLyB0aGUgZnJhbWUuIE1pbmltdW0gc3RhY2sgZnJhbWUgc2l6ZSBhY2NvcmRpbmcgdG8gVjggQUJJIGlzOgorICAvLyAgIDE2IHdvcmRzIGZvciByZWdpc3RlciB3aW5kb3cgc3BpbGwKKyAgLy8gICAgMSB3b3JkIGZvciBhZGRyZXNzIG9mIHJldHVybmVkIGFnZ3JlZ2F0ZS12YWx1ZQorICAvLyArICA2IHdvcmRzIGZvciBwYXNzaW5nIHBhcmFtZXRlcnMgb24gdGhlIHN0YWNrCisgIC8vIC0tLS0tLS0tLS0KKyAgLy8gICAyMyB3b3JkcyAqIDQgYnl0ZXMgcGVyIHdvcmQgPSA5MiBieXRlcworICBOdW1CeXRlcyArPSA5MjsKKworICAvLyBSb3VuZCB1cCB0byBuZXh0IGRvdWJsZXdvcmQgYm91bmRhcnkgLS0gYSBkb3VibGUtd29yZCBib3VuZGFyeQorICAvLyBpcyByZXF1aXJlZCBieSB0aGUgQUJJLgorICBOdW1CeXRlcyA9IChOdW1CeXRlcyArIDcpICYgfjc7CisgIE51bUJ5dGVzID0gLU51bUJ5dGVzOworICAKKyAgaWYgKE51bUJ5dGVzID49IC00MDk2KSB7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFNQOjpTQVZFcmkpLCBTUDo6TzYpCisgICAgICAuYWRkUmVnKFNQOjpPNikuYWRkSW1tKE51bUJ5dGVzKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBFbWl0IHRoaXMgdGhlIGhhcmQgd2F5LiAgVGhpcyBjbG9iYmVycyBHMSB3aGljaCB3ZSBhbHdheXMga25vdyBpcyAKKyAgICAvLyBhdmFpbGFibGUgaGVyZS4KKyAgICB1bnNpZ25lZCBPZmZIaSA9ICh1bnNpZ25lZClOdW1CeXRlcyA+PiAxMFU7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFNQOjpTRVRISWkpLCBTUDo6RzEpLmFkZEltbShPZmZIaSk7CisgICAgLy8gRW1pdCBHMSA9IEcxICsgSTYKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1A6Ok9ScmkpLCBTUDo6RzEpCisgICAgICAuYWRkUmVnKFNQOjpHMSkuYWRkSW1tKE51bUJ5dGVzICYgKCgxIDw8IDEwKS0xKSk7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFNQOjpTQVZFcnIpLCBTUDo6TzYpCisgICAgICAuYWRkUmVnKFNQOjpPNikuYWRkUmVnKFNQOjpHMSk7CisgIH0KK30KKwordm9pZCBTcGFyY1JlZ2lzdGVySW5mbzo6ZW1pdEVwaWxvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgeworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IHByaW9yKE1CQi5lbmQoKSk7CisgIERlYnVnTG9jIGRsID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKyAgYXNzZXJ0KE1CQkktPmdldE9wY29kZSgpID09IFNQOjpSRVRMICYmCisgICAgICAgICAiQ2FuIG9ubHkgcHV0IGVwaWxvZyBiZWZvcmUgJ3JldGwnIGluc3RydWN0aW9uISIpOworICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoU1A6OlJFU1RPUkVyciksIFNQOjpHMCkuYWRkUmVnKFNQOjpHMCkKKyAgICAuYWRkUmVnKFNQOjpHMCk7Cit9CisKK3Vuc2lnbmVkIFNwYXJjUmVnaXN0ZXJJbmZvOjpnZXRSQVJlZ2lzdGVyKCkgY29uc3QgeworICByZXR1cm4gU1A6Okk3OworfQorCit1bnNpZ25lZCBTcGFyY1JlZ2lzdGVySW5mbzo6Z2V0RnJhbWVSZWdpc3Rlcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIHJldHVybiBTUDo6STY7Cit9CisKK3Vuc2lnbmVkIFNwYXJjUmVnaXN0ZXJJbmZvOjpnZXRFSEV4Y2VwdGlvblJlZ2lzdGVyKCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJXaGF0IGlzIHRoZSBleGNlcHRpb24gcmVnaXN0ZXIiKTsKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIFNwYXJjUmVnaXN0ZXJJbmZvOjpnZXRFSEhhbmRsZXJSZWdpc3RlcigpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiV2hhdCBpcyB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgcmVnaXN0ZXIiKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBTcGFyY1JlZ2lzdGVySW5mbzo6Z2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0IHsKKyAgcmV0dXJuIFNwYXJjR2VuUmVnaXN0ZXJJbmZvOjpnZXREd2FyZlJlZ051bUZ1bGwoUmVnTnVtLCAwKTsKK30KKworI2luY2x1ZGUgIlNwYXJjR2VuUmVnaXN0ZXJJbmZvLmluYyIKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY1JlZ2lzdGVySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY1JlZ2lzdGVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMGNkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjUmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tIFNwYXJjUmVnaXN0ZXJJbmZvLmggLSBTcGFyYyBSZWdpc3RlciBJbmZvcm1hdGlvbiBJbXBsIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFNwYXJjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRSZWdpc3RlckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTUEFSQ1JFR0lTVEVSSU5GT19ICisjZGVmaW5lIFNQQVJDUkVHSVNURVJJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgIlNwYXJjR2VuUmVnaXN0ZXJJbmZvLmguaW5jIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFNwYXJjU3VidGFyZ2V0OworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVHlwZTsKKworc3RydWN0IFNwYXJjUmVnaXN0ZXJJbmZvIDogcHVibGljIFNwYXJjR2VuUmVnaXN0ZXJJbmZvIHsKKyAgU3BhcmNTdWJ0YXJnZXQgJlN1YnRhcmdldDsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUk7CisgIAorICBTcGFyY1JlZ2lzdGVySW5mbyhTcGFyY1N1YnRhcmdldCAmc3QsIGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpKTsKKworICAvLy8gQ29kZSBHZW5lcmF0aW9uIHZpcnR1YWwgbWV0aG9kcy4uLiAgCisgIGNvbnN0IHVuc2lnbmVkICpnZXRDYWxsZWVTYXZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IDApIGNvbnN0OworCisgIEJpdFZlY3RvciBnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgYm9vbCBoYXNGUChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2b2lkIGVsaW1pbmF0ZUNhbGxGcmFtZVBzZXVkb0luc3RyKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgY29uc3Q7CisKKyAgdW5zaWduZWQgZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gTlVMTCkgY29uc3Q7CisKKyAgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZChNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2b2lkIGVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgdm9pZCBlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisgIAorICAvLyBEZWJ1ZyBpbmZvcm1hdGlvbiBxdWVyaWVzLgorICB1bnNpZ25lZCBnZXRSQVJlZ2lzdGVyKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8gRXhjZXB0aW9uIGhhbmRsaW5nIHF1ZXJpZXMuCisgIHVuc2lnbmVkIGdldEVIRXhjZXB0aW9uUmVnaXN0ZXIoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0RUhIYW5kbGVyUmVnaXN0ZXIoKSBjb25zdDsKKworICBpbnQgZ2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjUmVnaXN0ZXJJbmZvLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY1JlZ2lzdGVySW5mby50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2JkN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY1JlZ2lzdGVySW5mby50ZApAQCAtMCwwICsxLDE3MiBAQAorLy89PT0tIFNwYXJjUmVnaXN0ZXJJbmZvLnRkIC0gU3BhcmMgUmVnaXN0ZXIgZGVmcyAtLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBEZWNsYXJhdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgU3BhcmMgcmVnaXN0ZXIgZmlsZSANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2NsYXNzIFNwYXJjUmVnPHN0cmluZyBuPiA6IFJlZ2lzdGVyPG4+IHsNCisgIGZpZWxkIGJpdHM8NT4gTnVtOw0KKyAgbGV0IE5hbWVzcGFjZSA9ICJTUCI7DQorfQ0KKw0KK2NsYXNzIFNwYXJjQ3RybFJlZzxzdHJpbmcgbj46IFJlZ2lzdGVyPG4+IHsNCisgIGxldCBOYW1lc3BhY2UgPSAiU1AiOw0KK30NCisNCitsZXQgTmFtZXNwYWNlID0gIlNQIiBpbiB7DQorZGVmIHN1Yl9ldmVuIDogU3ViUmVnSW5kZXg7DQorZGVmIHN1Yl9vZGQgIDogU3ViUmVnSW5kZXg7DQorfQ0KKw0KKy8vIFJlZ2lzdGVycyBhcmUgaWRlbnRpZmllZCB3aXRoIDUtYml0IElEIG51bWJlcnMuDQorLy8gUmkgLSAzMi1iaXQgaW50ZWdlciByZWdpc3RlcnMNCitjbGFzcyBSaTxiaXRzPDU+IG51bSwgc3RyaW5nIG4+IDogU3BhcmNSZWc8bj4gew0KKyAgbGV0IE51bSA9IG51bTsNCit9DQorLy8gUmYgLSAzMi1iaXQgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzDQorY2xhc3MgUmY8Yml0czw1PiBudW0sIHN0cmluZyBuPiA6IFNwYXJjUmVnPG4+IHsNCisgIGxldCBOdW0gPSBudW07DQorfQ0KKy8vIFJkIC0gU2xvdHMgaW4gdGhlIEZQIHJlZ2lzdGVyIGZpbGUgZm9yIDY0LWJpdCBmbG9hdGluZy1wb2ludCB2YWx1ZXMuDQorY2xhc3MgUmQ8Yml0czw1PiBudW0sIHN0cmluZyBuLCBsaXN0PFJlZ2lzdGVyPiBzdWJyZWdzPiA6IFNwYXJjUmVnPG4+IHsNCisgIGxldCBOdW0gPSBudW07DQorICBsZXQgU3ViUmVncyA9IHN1YnJlZ3M7DQorICBsZXQgU3ViUmVnSW5kaWNlcyA9IFtzdWJfZXZlbiwgc3ViX29kZF07DQorfQ0KKw0KKy8vIENvbnRyb2wgUmVnaXN0ZXJzDQorZGVmIElDQyA6IFNwYXJjQ3RybFJlZzwiSUNDIj47DQorZGVmIEZDQyA6IFNwYXJjQ3RybFJlZzwiRkNDIj47DQorDQorLy8gSW50ZWdlciByZWdpc3RlcnMNCitkZWYgRzAgOiBSaTwgMCwgIkcwIj4sIER3YXJmUmVnTnVtPFswXT47DQorZGVmIEcxIDogUmk8IDEsICJHMSI+LCBEd2FyZlJlZ051bTxbMV0+Ow0KK2RlZiBHMiA6IFJpPCAyLCAiRzIiPiwgRHdhcmZSZWdOdW08WzJdPjsgDQorZGVmIEczIDogUmk8IDMsICJHMyI+LCBEd2FyZlJlZ051bTxbM10+Ow0KK2RlZiBHNCA6IFJpPCA0LCAiRzQiPiwgRHdhcmZSZWdOdW08WzRdPjsNCitkZWYgRzUgOiBSaTwgNSwgIkc1Ij4sIER3YXJmUmVnTnVtPFs1XT47IA0KK2RlZiBHNiA6IFJpPCA2LCAiRzYiPiwgRHdhcmZSZWdOdW08WzZdPjsNCitkZWYgRzcgOiBSaTwgNywgIkc3Ij4sIER3YXJmUmVnTnVtPFs3XT47DQorZGVmIE8wIDogUmk8IDgsICJPMCI+LCBEd2FyZlJlZ051bTxbOF0+Ow0KK2RlZiBPMSA6IFJpPCA5LCAiTzEiPiwgRHdhcmZSZWdOdW08WzldPjsNCitkZWYgTzIgOiBSaTwxMCwgIk8yIj4sIER3YXJmUmVnTnVtPFsxMF0+OyANCitkZWYgTzMgOiBSaTwxMSwgIk8zIj4sIER3YXJmUmVnTnVtPFsxMV0+Ow0KK2RlZiBPNCA6IFJpPDEyLCAiTzQiPiwgRHdhcmZSZWdOdW08WzEyXT47DQorZGVmIE81IDogUmk8MTMsICJPNSI+LCBEd2FyZlJlZ051bTxbMTNdPjsgDQorZGVmIE82IDogUmk8MTQsICJTUCI+LCBEd2FyZlJlZ051bTxbMTRdPjsNCitkZWYgTzcgOiBSaTwxNSwgIk83Ij4sIER3YXJmUmVnTnVtPFsxNV0+Ow0KK2RlZiBMMCA6IFJpPDE2LCAiTDAiPiwgRHdhcmZSZWdOdW08WzE2XT47DQorZGVmIEwxIDogUmk8MTcsICJMMSI+LCBEd2FyZlJlZ051bTxbMTddPjsNCitkZWYgTDIgOiBSaTwxOCwgIkwyIj4sIER3YXJmUmVnTnVtPFsxOF0+OyANCitkZWYgTDMgOiBSaTwxOSwgIkwzIj4sIER3YXJmUmVnTnVtPFsxOV0+Ow0KK2RlZiBMNCA6IFJpPDIwLCAiTDQiPiwgRHdhcmZSZWdOdW08WzIwXT47DQorZGVmIEw1IDogUmk8MjEsICJMNSI+LCBEd2FyZlJlZ051bTxbMjFdPjsgDQorZGVmIEw2IDogUmk8MjIsICJMNiI+LCBEd2FyZlJlZ051bTxbMjJdPjsNCitkZWYgTDcgOiBSaTwyMywgIkw3Ij4sIER3YXJmUmVnTnVtPFsyM10+Ow0KK2RlZiBJMCA6IFJpPDI0LCAiSTAiPiwgRHdhcmZSZWdOdW08WzI0XT47DQorZGVmIEkxIDogUmk8MjUsICJJMSI+LCBEd2FyZlJlZ051bTxbMjVdPjsNCitkZWYgSTIgOiBSaTwyNiwgIkkyIj4sIER3YXJmUmVnTnVtPFsyNl0+OyANCitkZWYgSTMgOiBSaTwyNywgIkkzIj4sIER3YXJmUmVnTnVtPFsyN10+Ow0KK2RlZiBJNCA6IFJpPDI4LCAiSTQiPiwgRHdhcmZSZWdOdW08WzI4XT47DQorZGVmIEk1IDogUmk8MjksICJJNSI+LCBEd2FyZlJlZ051bTxbMjldPjsgDQorZGVmIEk2IDogUmk8MzAsICJGUCI+LCBEd2FyZlJlZ051bTxbMzBdPjsNCitkZWYgSTcgOiBSaTwzMSwgIkk3Ij4sIER3YXJmUmVnTnVtPFszMV0+Ow0KKw0KKy8vIEZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycw0KK2RlZiBGMCAgOiBSZjwgMCwgICJGMCI+LCBEd2FyZlJlZ051bTxbMzJdPjsNCitkZWYgRjEgIDogUmY8IDEsICAiRjEiPiwgRHdhcmZSZWdOdW08WzMzXT47DQorZGVmIEYyICA6IFJmPCAyLCAgIkYyIj4sIER3YXJmUmVnTnVtPFszNF0+OyANCitkZWYgRjMgIDogUmY8IDMsICAiRjMiPiwgRHdhcmZSZWdOdW08WzM1XT47DQorZGVmIEY0ICA6IFJmPCA0LCAgIkY0Ij4sIER3YXJmUmVnTnVtPFszNl0+Ow0KK2RlZiBGNSAgOiBSZjwgNSwgICJGNSI+LCBEd2FyZlJlZ051bTxbMzddPjsgDQorZGVmIEY2ICA6IFJmPCA2LCAgIkY2Ij4sIER3YXJmUmVnTnVtPFszOF0+Ow0KK2RlZiBGNyAgOiBSZjwgNywgICJGNyI+LCBEd2FyZlJlZ051bTxbMzldPjsNCitkZWYgRjggIDogUmY8IDgsICAiRjgiPiwgRHdhcmZSZWdOdW08WzQwXT47IA0KK2RlZiBGOSAgOiBSZjwgOSwgICJGOSI+LCBEd2FyZlJlZ051bTxbNDFdPjsNCitkZWYgRjEwIDogUmY8MTAsICJGMTAiPiwgRHdhcmZSZWdOdW08WzQyXT47DQorZGVmIEYxMSA6IFJmPDExLCAiRjExIj4sIER3YXJmUmVnTnVtPFs0M10+OyANCitkZWYgRjEyIDogUmY8MTIsICJGMTIiPiwgRHdhcmZSZWdOdW08WzQ0XT47DQorZGVmIEYxMyA6IFJmPDEzLCAiRjEzIj4sIER3YXJmUmVnTnVtPFs0NV0+Ow0KK2RlZiBGMTQgOiBSZjwxNCwgIkYxNCI+LCBEd2FyZlJlZ051bTxbNDZdPjsgDQorZGVmIEYxNSA6IFJmPDE1LCAiRjE1Ij4sIER3YXJmUmVnTnVtPFs0N10+Ow0KK2RlZiBGMTYgOiBSZjwxNiwgIkYxNiI+LCBEd2FyZlJlZ051bTxbNDhdPjsNCitkZWYgRjE3IDogUmY8MTcsICJGMTciPiwgRHdhcmZSZWdOdW08WzQ5XT47IA0KK2RlZiBGMTggOiBSZjwxOCwgIkYxOCI+LCBEd2FyZlJlZ051bTxbNTBdPjsNCitkZWYgRjE5IDogUmY8MTksICJGMTkiPiwgRHdhcmZSZWdOdW08WzUxXT47DQorZGVmIEYyMCA6IFJmPDIwLCAiRjIwIj4sIER3YXJmUmVnTnVtPFs1Ml0+OyANCitkZWYgRjIxIDogUmY8MjEsICJGMjEiPiwgRHdhcmZSZWdOdW08WzUzXT47DQorZGVmIEYyMiA6IFJmPDIyLCAiRjIyIj4sIER3YXJmUmVnTnVtPFs1NF0+Ow0KK2RlZiBGMjMgOiBSZjwyMywgIkYyMyI+LCBEd2FyZlJlZ051bTxbNTVdPjsNCitkZWYgRjI0IDogUmY8MjQsICJGMjQiPiwgRHdhcmZSZWdOdW08WzU2XT47DQorZGVmIEYyNSA6IFJmPDI1LCAiRjI1Ij4sIER3YXJmUmVnTnVtPFs1N10+Ow0KK2RlZiBGMjYgOiBSZjwyNiwgIkYyNiI+LCBEd2FyZlJlZ051bTxbNThdPjsgDQorZGVmIEYyNyA6IFJmPDI3LCAiRjI3Ij4sIER3YXJmUmVnTnVtPFs1OV0+Ow0KK2RlZiBGMjggOiBSZjwyOCwgIkYyOCI+LCBEd2FyZlJlZ051bTxbNjBdPjsNCitkZWYgRjI5IDogUmY8MjksICJGMjkiPiwgRHdhcmZSZWdOdW08WzYxXT47IA0KK2RlZiBGMzAgOiBSZjwzMCwgIkYzMCI+LCBEd2FyZlJlZ051bTxbNjJdPjsNCitkZWYgRjMxIDogUmY8MzEsICJGMzEiPiwgRHdhcmZSZWdOdW08WzYzXT47DQorDQorLy8gQWxpYXNlcyBvZiB0aGUgRiogcmVnaXN0ZXJzIHVzZWQgdG8gaG9sZCA2NC1iaXQgZnAgdmFsdWVzIChkb3VibGVzKQ0KK2RlZiBEMCAgOiBSZDwgMCwgICJGMCIsIFtGMCwgICBGMV0+LCBEd2FyZlJlZ051bTxbMzJdPjsNCitkZWYgRDEgIDogUmQ8IDIsICAiRjIiLCBbRjIsICAgRjNdPiwgRHdhcmZSZWdOdW08WzM0XT47IA0KK2RlZiBEMiAgOiBSZDwgNCwgICJGNCIsIFtGNCwgICBGNV0+LCBEd2FyZlJlZ051bTxbMzZdPjsNCitkZWYgRDMgIDogUmQ8IDYsICAiRjYiLCBbRjYsICAgRjddPiwgRHdhcmZSZWdOdW08WzM4XT47IA0KK2RlZiBENCAgOiBSZDwgOCwgICJGOCIsIFtGOCwgICBGOV0+LCBEd2FyZlJlZ051bTxbNDBdPjsNCitkZWYgRDUgIDogUmQ8MTAsICJGMTAiLCBbRjEwLCBGMTFdPiwgRHdhcmZSZWdOdW08WzQyXT47DQorZGVmIEQ2ICA6IFJkPDEyLCAiRjEyIiwgW0YxMiwgRjEzXT4sIER3YXJmUmVnTnVtPFs0NF0+Ow0KK2RlZiBENyAgOiBSZDwxNCwgIkYxNCIsIFtGMTQsIEYxNV0+LCBEd2FyZlJlZ051bTxbNDZdPjsgDQorZGVmIEQ4ICA6IFJkPDE2LCAiRjE2IiwgW0YxNiwgRjE3XT4sIER3YXJmUmVnTnVtPFs0OF0+Ow0KK2RlZiBEOSAgOiBSZDwxOCwgIkYxOCIsIFtGMTgsIEYxOV0+LCBEd2FyZlJlZ051bTxbNTBdPjsgDQorZGVmIEQxMCA6IFJkPDIwLCAiRjIwIiwgW0YyMCwgRjIxXT4sIER3YXJmUmVnTnVtPFs1Ml0+Ow0KK2RlZiBEMTEgOiBSZDwyMiwgIkYyMiIsIFtGMjIsIEYyM10+LCBEd2FyZlJlZ051bTxbNTRdPjsNCitkZWYgRDEyIDogUmQ8MjQsICJGMjQiLCBbRjI0LCBGMjVdPiwgRHdhcmZSZWdOdW08WzU2XT47DQorZGVmIEQxMyA6IFJkPDI2LCAiRjI2IiwgW0YyNiwgRjI3XT4sIER3YXJmUmVnTnVtPFs1OF0+OyANCitkZWYgRDE0IDogUmQ8MjgsICJGMjgiLCBbRjI4LCBGMjldPiwgRHdhcmZSZWdOdW08WzYwXT47DQorZGVmIEQxNSA6IFJkPDMwLCAiRjMwIiwgW0YzMCwgRjMxXT4sIER3YXJmUmVnTnVtPFs2Ml0+Ow0KKw0KKy8vIFJlZ2lzdGVyIGNsYXNzZXMuDQorLy8NCisvLyBGSVhNRTogdGhlIHJlZ2lzdGVyIG9yZGVyIHNob3VsZCBiZSBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBwcmVmZXJyZWQNCisvLyBhbGxvY2F0aW9uIG9yZGVyLi4uDQorLy8NCitkZWYgSW50UmVncyA6IFJlZ2lzdGVyQ2xhc3M8IlNQIiwgW2kzMl0sIDMyLCBbTDAsIEwxLCBMMiwgTDMsIEw0LCBMNSwgTDYsIEw3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEsIEkyLCBJMywgSTQsIEk1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPMCwgTzEsIE8yLCBPMywgTzQsIE81LCBPNywNCisNCisgICAvLyBGSVhNRTogRzEgcmVzZXJ2ZWQgZm9yIG5vdyBmb3IgbGFyZ2UgaW1tIGdlbmVyYXRpb24gYnkgZnJhbWUgY29kZS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1hbGxvY2F0YWJsZSByZWdzOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHMiwgRzMsIEc0LCAvLyBGSVhNRTogT0sgZm9yIHVzZSBvbmx5IGluDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9ucywgbm90IGxpYnJhcmllcy4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTzYsIC8vIHN0YWNrIHB0cg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJNiwgLy8gZnJhbWUgcHRyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEk3LCAvLyByZXR1cm4gYWRkcmVzcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHMCwgLy8gY29uc3RhbnQgemVybw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHNSwgRzYsIEc3IC8vIHJlc2VydmVkIGZvciBrZXJuZWwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4gew0KKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgfV07DQorICBsZXQgTWV0aG9kQm9kaWVzID0gW3sNCisgICAgSW50UmVnc0NsYXNzOjppdGVyYXRvcg0KKyAgICBJbnRSZWdzQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICAvLyBGSVhNRTogVGhlc2Ugc3BlY2lhbCByZWdzIHNob3VsZCBiZSB0YWtlbiBvdXQgb2YgdGhlIHJlZ2NsYXNzIQ0KKyAgICAgIHJldHVybiBlbmQoKS0xMCAgLy8gRG9uJ3QgYWxsb2NhdGUgc3BlY2lhbCByZWdpc3RlcnMNCisgICAgICAgICAtMTsgIC8vIEZJWE1FOiBHMSByZXNlcnZlZCBmb3IgbGFyZ2UgaW1tIGdlbmVyYXRpb24gYnkgZnJhbWUgY29kZS4NCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KK2RlZiBGUFJlZ3MgOiBSZWdpc3RlckNsYXNzPCJTUCIsIFtmMzJdLCAzMiwgW0YwLCBGMSwgRjIsIEYzLCBGNCwgRjUsIEY2LCBGNywgRjgsDQorICBGOSwgRjEwLCBGMTEsIEYxMiwgRjEzLCBGMTQsIEYxNSwgRjE2LCBGMTcsIEYxOCwgRjE5LCBGMjAsIEYyMSwgRjIyLA0KKyAgRjIzLCBGMjQsIEYyNSwgRjI2LCBGMjcsIEYyOCwgRjI5LCBGMzAsIEYzMV0+Ow0KKw0KK2RlZiBERlBSZWdzIDogUmVnaXN0ZXJDbGFzczwiU1AiLCBbZjY0XSwgNjQsIFtEMCwgRDEsIEQyLCBEMywgRDQsIEQ1LCBENiwgRDcsDQorICBEOCwgRDksIEQxMCwgRDExLCBEMTIsIEQxMywgRDE0LCBEMTVdPjsNCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjU2VsZWN0aW9uREFHSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjU2VsZWN0aW9uREFHSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwYzU3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNTZWxlY3Rpb25EQUdJbmZvLmNwcApAQCAtMCwwICsxLDIzIEBACisvLz09PS0tIFNwYXJjU2VsZWN0aW9uREFHSW5mby5jcHAgLSBTcGFyYyBTZWxlY3Rpb25EQUcgSW5mbyAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTcGFyY1NlbGVjdGlvbkRBR0luZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzcGFyYy1zZWxlY3Rpb25kYWctaW5mbyIKKyNpbmNsdWRlICJTcGFyY1RhcmdldE1hY2hpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTcGFyY1NlbGVjdGlvbkRBR0luZm86OlNwYXJjU2VsZWN0aW9uREFHSW5mbyhjb25zdCBTcGFyY1RhcmdldE1hY2hpbmUgJlRNKQorICA6IFRhcmdldFNlbGVjdGlvbkRBR0luZm8oVE0pIHsKK30KKworU3BhcmNTZWxlY3Rpb25EQUdJbmZvOjp+U3BhcmNTZWxlY3Rpb25EQUdJbmZvKCkgeworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY1NlbGVjdGlvbkRBR0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNTZWxlY3Rpb25EQUdJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkNDIwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNTZWxlY3Rpb25EQUdJbmZvLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tLSBTcGFyY1NlbGVjdGlvbkRBR0luZm8uaCAtIFNwYXJjIFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU3BhcmMgc3ViY2xhc3MgZm9yIFRhcmdldFNlbGVjdGlvbkRBR0luZm8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTUEFSQ1NFTEVDVElPTkRBR0lORk9fSAorI2RlZmluZSBTUEFSQ1NFTEVDVElPTkRBR0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFNwYXJjVGFyZ2V0TWFjaGluZTsKKworY2xhc3MgU3BhcmNTZWxlY3Rpb25EQUdJbmZvIDogcHVibGljIFRhcmdldFNlbGVjdGlvbkRBR0luZm8geworcHVibGljOgorICBleHBsaWNpdCBTcGFyY1NlbGVjdGlvbkRBR0luZm8oY29uc3QgU3BhcmNUYXJnZXRNYWNoaW5lICZUTSk7CisgIH5TcGFyY1NlbGVjdGlvbkRBR0luZm8oKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjU3VidGFyZ2V0LmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNTdWJ0YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTFhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1NwYXJjU3VidGFyZ2V0LmNwcApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gU3BhcmNTdWJ0YXJnZXQuY3BwIC0gU1BBUkMgU3VidGFyZ2V0IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTUEFSQyBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNwYXJjU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiU3BhcmNHZW5TdWJ0YXJnZXQuaW5jIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NwYXJjU3VidGFyZ2V0OjpTcGFyY1N1YnRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVFQsIGNvbnN0IHN0ZDo6c3RyaW5nICZGUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpczY0Qml0KSA6CisgIElzVjkoZmFsc2UpLAorICBWOERlcHJlY2F0ZWRJbnN0cyhmYWxzZSksCisgIElzVklTKGZhbHNlKSwKKyAgSXM2NEJpdChpczY0Qml0KSB7CisgIAorICAvLyBEZXRlcm1pbmUgZGVmYXVsdCBhbmQgdXNlciBzcGVjaWZpZWQgY2hhcmFjdGVyaXN0aWNzCisgIGNvbnN0IGNoYXIgKkNQVSA9ICJ2OCI7CisgIGlmIChpczY0Qml0KSB7CisgICAgQ1BVID0gInY5IjsKKyAgICBJc1Y5ID0gdHJ1ZTsKKyAgfQorCisgIC8vIFBhcnNlIGZlYXR1cmVzIHN0cmluZy4KKyAgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhGUywgQ1BVKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNTdWJ0YXJnZXQuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNTdWJ0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWMwYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY1N1YnRhcmdldC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09PT0tLSBTcGFyY1N1YnRhcmdldC5oIC0gRGVmaW5lIFN1YnRhcmdldCBmb3IgdGhlIFNQQVJDIC0tLS0qLSBDKysgLSotPT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTUEFSQyBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTUEFSQ19TVUJUQVJHRVRfSAorI2RlZmluZSBTUEFSQ19TVUJUQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFNwYXJjU3VidGFyZ2V0IDogcHVibGljIFRhcmdldFN1YnRhcmdldCB7CisgIGJvb2wgSXNWOTsKKyAgYm9vbCBWOERlcHJlY2F0ZWRJbnN0czsKKyAgYm9vbCBJc1ZJUzsKKyAgYm9vbCBJczY0Qml0OworICAKK3B1YmxpYzoKKyAgU3BhcmNTdWJ0YXJnZXQoY29uc3Qgc3RkOjpzdHJpbmcgJlRULCBjb25zdCBzdGQ6OnN0cmluZyAmRlMsIGJvb2wgaXM2NGJpdCk7CisKKyAgYm9vbCBpc1Y5KCkgY29uc3QgeyByZXR1cm4gSXNWOTsgfQorICBib29sIGlzVklTKCkgY29uc3QgeyByZXR1cm4gSXNWSVM7IH0KKyAgYm9vbCB1c2VEZXByZWNhdGVkVjhJbnN0cnVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBWOERlcHJlY2F0ZWRJbnN0czsgfQorICAKKyAgLy8vIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMgLSBQYXJzZXMgZmVhdHVyZXMgc3RyaW5nIHNldHRpbmcgc3BlY2lmaWVkIAorICAvLy8gc3VidGFyZ2V0IG9wdGlvbnMuICBEZWZpbml0aW9uIG9mIGZ1bmN0aW9uIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRibGdlbi4KKyAgc3RkOjpzdHJpbmcgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhjb25zdCBzdGQ6OnN0cmluZyAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkNQVSk7CisgIAorICBib29sIGlzNjRCaXQoKSBjb25zdCB7IHJldHVybiBJczY0Qml0OyB9CisgIHN0ZDo6c3RyaW5nIGdldERhdGFMYXlvdXQoKSBjb25zdCB7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBpZiAoaXM2NEJpdCgpKSB7CisgICAgICBwID0gIkUtcDo2NDo2NDo2NC1pNjQ6NjQ6NjQtZjY0OjY0OjY0LWYxMjg6MTI4OjEyOC1uMzI6NjQiOworICAgIH0gZWxzZSB7CisgICAgICBwID0gIkUtcDozMjozMjozMi1pNjQ6NjQ6NjQtZjY0OjY0OjY0LWYxMjg6NjQ6NjQtbjMyIjsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHApOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNUYXJnZXRNYWNoaW5lLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNUYXJnZXRNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThkNmJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY1RhcmdldE1hY2hpbmUuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8vPT09LS0gU3BhcmNUYXJnZXRNYWNoaW5lLmNwcCAtIERlZmluZSBUYXJnZXRNYWNoaW5lIGZvciBTcGFyYyAtLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJTcGFyY01DQXNtSW5mby5oIgorI2luY2x1ZGUgIlNwYXJjVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlNwYXJjLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplU3BhcmNUYXJnZXQoKSB7CisgIC8vIFJlZ2lzdGVyIHRoZSB0YXJnZXQuCisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxTcGFyY1Y4VGFyZ2V0TWFjaGluZT4gWChUaGVTcGFyY1RhcmdldCk7CisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxTcGFyY1Y5VGFyZ2V0TWFjaGluZT4gWShUaGVTcGFyY1Y5VGFyZ2V0KTsKKworICBSZWdpc3RlckFzbUluZm88U3BhcmNFTEZNQ0FzbUluZm8+IEEoVGhlU3BhcmNUYXJnZXQpOworICBSZWdpc3RlckFzbUluZm88U3BhcmNFTEZNQ0FzbUluZm8+IEIoVGhlU3BhcmNWOVRhcmdldCk7CisKK30KKworLy8vIFNwYXJjVGFyZ2V0TWFjaGluZSBjdG9yIC0gQ3JlYXRlIGFuIElMUDMyIGFyY2hpdGVjdHVyZSBtb2RlbAorLy8vCitTcGFyY1RhcmdldE1hY2hpbmU6OlNwYXJjVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMsIGJvb2wgaXM2NGJpdCkKKyAgOiBMTFZNVGFyZ2V0TWFjaGluZShULCBUVCksCisgICAgU3VidGFyZ2V0KFRULCBGUywgaXM2NGJpdCksCisgICAgRGF0YUxheW91dChTdWJ0YXJnZXQuZ2V0RGF0YUxheW91dCgpKSwKKyAgICAgVExJbmZvKCp0aGlzKSwgVFNJbmZvKCp0aGlzKSwgSW5zdHJJbmZvKFN1YnRhcmdldCksCisgICAgRnJhbWVJbmZvKFRhcmdldEZyYW1lSW5mbzo6U3RhY2tHcm93c0Rvd24sIDgsIDApIHsKK30KKworYm9vbCBTcGFyY1RhcmdldE1hY2hpbmU6OmFkZEluc3RTZWxlY3RvcihQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICBQTS5hZGQoY3JlYXRlU3BhcmNJU2VsRGFnKCp0aGlzKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGFkZFByZUVtaXRQYXNzIC0gVGhpcyBwYXNzIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBydW4KKy8vLyBwYXNzZXMgaW1tZWRpYXRlbHkgYmVmb3JlIG1hY2hpbmUgY29kZSBpcyBlbWl0dGVkLiAgVGhpcyBzaG91bGQgcmV0dXJuCisvLy8gdHJ1ZSBpZiAtcHJpbnQtbWFjaGluZWluc3RycyBzaG91bGQgcHJpbnQgb3V0IHRoZSBjb2RlIGFmdGVyIHRoZSBwYXNzZXMuCitib29sIFNwYXJjVGFyZ2V0TWFjaGluZTo6YWRkUHJlRW1pdFBhc3MoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCl7CisgIFBNLmFkZChjcmVhdGVTcGFyY0ZQTW92ZXJQYXNzKCp0aGlzKSk7CisgIFBNLmFkZChjcmVhdGVTcGFyY0RlbGF5U2xvdEZpbGxlclBhc3MoKnRoaXMpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1NwYXJjVjhUYXJnZXRNYWNoaW5lOjpTcGFyY1Y4VGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlRULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpCisgIDogU3BhcmNUYXJnZXRNYWNoaW5lKFQsIFRULCBGUywgZmFsc2UpIHsKK30KKworU3BhcmNWOVRhcmdldE1hY2hpbmU6OlNwYXJjVjlUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlRULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpCisgIDogU3BhcmNUYXJnZXRNYWNoaW5lKFQsIFRULCBGUywgdHJ1ZSkgeworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9TcGFyY1RhcmdldE1hY2hpbmUuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNUYXJnZXRNYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyYzgyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3BhcmMvU3BhcmNUYXJnZXRNYWNoaW5lLmgKQEAgLTAsMCArMSw3NSBAQAorLy89PT0tLSBTcGFyY1RhcmdldE1hY2hpbmUuaCAtIERlZmluZSBUYXJnZXRNYWNoaW5lIGZvciBTcGFyYyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFNwYXJjIHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldE1hY2hpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTUEFSQ1RBUkdFVE1BQ0hJTkVfSAorI2RlZmluZSBTUEFSQ1RBUkdFVE1BQ0hJTkVfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJTcGFyY0luc3RySW5mby5oIgorI2luY2x1ZGUgIlNwYXJjU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiU3BhcmNJU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJTcGFyY1NlbGVjdGlvbkRBR0luZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTcGFyY1RhcmdldE1hY2hpbmUgOiBwdWJsaWMgTExWTVRhcmdldE1hY2hpbmUgeworICBTcGFyY1N1YnRhcmdldCBTdWJ0YXJnZXQ7CisgIGNvbnN0IFRhcmdldERhdGEgRGF0YUxheW91dDsgICAgICAgLy8gQ2FsY3VsYXRlcyB0eXBlIHNpemUgJiBhbGlnbm1lbnQKKyAgU3BhcmNUYXJnZXRMb3dlcmluZyBUTEluZm87CisgIFNwYXJjU2VsZWN0aW9uREFHSW5mbyBUU0luZm87CisgIFNwYXJjSW5zdHJJbmZvIEluc3RySW5mbzsKKyAgVGFyZ2V0RnJhbWVJbmZvIEZyYW1lSW5mbzsKK3B1YmxpYzoKKyAgU3BhcmNUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTLCBib29sIGlzNjRiaXQpOworCisgIHZpcnR1YWwgY29uc3QgU3BhcmNJbnN0ckluZm8gKmdldEluc3RySW5mbygpIGNvbnN0IHsgcmV0dXJuICZJbnN0ckluZm87IH0KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRGcmFtZUluZm8gICpnZXRGcmFtZUluZm8oKSBjb25zdCB7IHJldHVybiAmRnJhbWVJbmZvOyB9CisgIHZpcnR1YWwgY29uc3QgU3BhcmNTdWJ0YXJnZXQgICAqZ2V0U3VidGFyZ2V0SW1wbCgpIGNvbnN0eyByZXR1cm4gJlN1YnRhcmdldDsgfQorICB2aXJ0dWFsIGNvbnN0IFNwYXJjUmVnaXN0ZXJJbmZvICpnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuICZJbnN0ckluZm8uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIH0KKyAgdmlydHVhbCBjb25zdCBTcGFyY1RhcmdldExvd2VyaW5nKiBnZXRUYXJnZXRMb3dlcmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gJlRMSW5mbzsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IFNwYXJjU2VsZWN0aW9uREFHSW5mbyogZ2V0U2VsZWN0aW9uREFHSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gJlRTSW5mbzsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IFRhcmdldERhdGEgICAgICAgKmdldFRhcmdldERhdGEoKSBjb25zdCB7IHJldHVybiAmRGF0YUxheW91dDsgfQorCisgIC8vIFBhc3MgUGlwZWxpbmUgQ29uZmlndXJhdGlvbgorICB2aXJ0dWFsIGJvb2wgYWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKyAgdmlydHVhbCBib29sIGFkZFByZUVtaXRQYXNzKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKK307CisKKy8vLyBTcGFyY1Y4VGFyZ2V0TWFjaGluZSAtIFNwYXJjIDMyLWJpdCB0YXJnZXQgbWFjaGluZQorLy8vCitjbGFzcyBTcGFyY1Y4VGFyZ2V0TWFjaGluZSA6IHB1YmxpYyBTcGFyY1RhcmdldE1hY2hpbmUgeworcHVibGljOgorICBTcGFyY1Y4VGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKK307CisKKy8vLyBTcGFyY1Y5VGFyZ2V0TWFjaGluZSAtIFNwYXJjIDY0LWJpdCB0YXJnZXQgbWFjaGluZQorLy8vCitjbGFzcyBTcGFyY1Y5VGFyZ2V0TWFjaGluZSA6IHB1YmxpYyBTcGFyY1RhcmdldE1hY2hpbmUgeworcHVibGljOgorICBTcGFyY1Y5VGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGI1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw3IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uICkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNU3BhcmNJbmZvCisgIFNwYXJjVGFyZ2V0SW5mby5jcHAKKyAgKQorCithZGRfZGVwZW5kZW5jaWVzKExMVk1TcGFyY0luZm8gU3BhcmNDb2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9UYXJnZXRJbmZvL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9UYXJnZXRJbmZvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MWVkODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1RhcmdldEluZm8vTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvU3BhcmMvVGFyZ2V0SW5mby9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVNwYXJjSW5mbworCisjIEhhY2s6IHdlIG5lZWQgdG8gaW5jbHVkZSAnbWFpbicgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQRkxBR1MgPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9UYXJnZXRJbmZvL1NwYXJjVGFyZ2V0SW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1NwYXJjL1RhcmdldEluZm8vU3BhcmNUYXJnZXRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzA2ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TcGFyYy9UYXJnZXRJbmZvL1NwYXJjVGFyZ2V0SW5mby5jcHAKQEAgLTAsMCArMSwyMSBAQAorLy89PT0tLSBTcGFyY1RhcmdldEluZm8uY3BwIC0gU3BhcmMgVGFyZ2V0IEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlNwYXJjLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1RhcmdldCBsbHZtOjpUaGVTcGFyY1RhcmdldDsKK1RhcmdldCBsbHZtOjpUaGVTcGFyY1Y5VGFyZ2V0OworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVTcGFyY1RhcmdldEluZm8oKSB7IAorICBSZWdpc3RlclRhcmdldDxUcmlwbGU6OnNwYXJjPiBYKFRoZVNwYXJjVGFyZ2V0LCAic3BhcmMiLCAiU3BhcmMiKTsKKyAgUmVnaXN0ZXJUYXJnZXQ8VHJpcGxlOjpzcGFyY3Y5PiBZKFRoZVNwYXJjVjlUYXJnZXQsICJzcGFyY3Y5IiwgIlNwYXJjIFY5Iik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N1YnRhcmdldEZlYXR1cmUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TdWJ0YXJnZXRGZWF0dXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzUxOTBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TdWJ0YXJnZXRGZWF0dXJlLmNwcApAQCAtMCwwICsxLDM4MyBAQAorLy89PT0tIFN1YnRhcmdldEZlYXR1cmUuY3BwIC0gQ1BVIGNoYXJhY3RlcmlzdGljcyBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU3VidGFyZ2V0RmVhdHVyZSBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1N1YnRhcmdldEZlYXR1cmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjY3R5cGU+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWMgSGVscGVyIEZ1bmN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGhhc0ZsYWcgLSBEZXRlcm1pbmUgaWYgYSBmZWF0dXJlIGhhcyBhIGZsYWc7ICcrJyBvciAnLScKKy8vLworc3RhdGljIGlubGluZSBib29sIGhhc0ZsYWcoY29uc3Qgc3RkOjpzdHJpbmcgJkZlYXR1cmUpIHsKKyAgYXNzZXJ0KCFGZWF0dXJlLmVtcHR5KCkgJiYgIkVtcHR5IHN0cmluZyIpOworICAvLyBHZXQgZmlyc3QgY2hhcmFjdGVyCisgIGNoYXIgQ2ggPSBGZWF0dXJlWzBdOworICAvLyBDaGVjayBpZiBmaXJzdCBjaGFyYWN0ZXIgaXMgJysnIG9yICctJyBmbGFnCisgIHJldHVybiBDaCA9PSAnKycgfHwgQ2ggPT0nLSc7Cit9CisKKy8vLyBTdHJpcEZsYWcgLSBSZXR1cm4gc3RyaW5nIHN0cmlwcGVkIG9mIGZsYWcuCisvLy8KK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgU3RyaXBGbGFnKGNvbnN0IHN0ZDo6c3RyaW5nICZGZWF0dXJlKSB7CisgIHJldHVybiBoYXNGbGFnKEZlYXR1cmUpID8gRmVhdHVyZS5zdWJzdHIoMSkgOiBGZWF0dXJlOworfQorCisvLy8gaXNFbmFibGVkIC0gUmV0dXJuIHRydWUgaWYgZW5hYmxlIGZsYWc7ICcrJy4KKy8vLworc3RhdGljIGlubGluZSBib29sIGlzRW5hYmxlZChjb25zdCBzdGQ6OnN0cmluZyAmRmVhdHVyZSkgeworICBhc3NlcnQoIUZlYXR1cmUuZW1wdHkoKSAmJiAiRW1wdHkgc3RyaW5nIik7CisgIC8vIEdldCBmaXJzdCBjaGFyYWN0ZXIKKyAgY2hhciBDaCA9IEZlYXR1cmVbMF07CisgIC8vIENoZWNrIGlmIGZpcnN0IGNoYXJhY3RlciBpcyAnKycgZm9yIGVuYWJsZWQKKyAgcmV0dXJuIENoID09ICcrJzsKK30KKworLy8vIFByZXBlbmRGbGFnIC0gUmV0dXJuIGEgc3RyaW5nIHdpdGggYSBwcmVwZW5kZWQgZmxhZzsgJysnIG9yICctJy4KKy8vLworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBQcmVwZW5kRmxhZyhjb25zdCBzdGQ6OnN0cmluZyAmRmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0VuYWJsZWQpIHsKKyAgYXNzZXJ0KCFGZWF0dXJlLmVtcHR5KCkgJiYgIkVtcHR5IHN0cmluZyIpOworICBpZiAoaGFzRmxhZyhGZWF0dXJlKSkgcmV0dXJuIEZlYXR1cmU7CisgIHJldHVybiBzdGQ6OnN0cmluZyhJc0VuYWJsZWQgPyAiKyIgOiAiLSIpICsgRmVhdHVyZTsKK30KKworLy8vIFNwbGl0IC0gU3BsaXRzIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCBpdGVtcyBpbiB0byBhIHZlY3RvciBvZiBzdHJpbmdzLgorLy8vCitzdGF0aWMgdm9pZCBTcGxpdChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJlYsIGNvbnN0IHN0ZDo6c3RyaW5nICZTKSB7CisgIC8vIFN0YXJ0IGF0IGJlZ2lubmluZyBvZiBzdHJpbmcuCisgIHNpemVfdCBQb3MgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIEZpbmQgdGhlIG5leHQgY29tbWEKKyAgICBzaXplX3QgQ29tbWEgPSBTLmZpbmQoJywnLCBQb3MpOworICAgIC8vIElmIG5vIGNvbW1hIGZvdW5kIHRoZW4gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBpcyB1c2VkCisgICAgaWYgKENvbW1hID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBBZGQgc3RyaW5nIHRvIHZlY3RvcgorICAgICAgVi5wdXNoX2JhY2soUy5zdWJzdHIoUG9zKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gT3RoZXJ3aXNlIGFkZCBzdWJzdHJpbmcgdG8gdmVjdG9yCisgICAgVi5wdXNoX2JhY2soUy5zdWJzdHIoUG9zLCBDb21tYSAtIFBvcykpOworICAgIC8vIEFkdmFuY2UgdG8gbmV4dCBpdGVtCisgICAgUG9zID0gQ29tbWEgKyAxOworICB9Cit9CisKKy8vLyBKb2luIGEgdmVjdG9yIG9mIHN0cmluZ3MgdG8gYSBzdHJpbmcgd2l0aCBhIGNvbW1hIHNlcGFyYXRpbmcgZWFjaCBlbGVtZW50LgorLy8vCitzdGF0aWMgc3RkOjpzdHJpbmcgSm9pbihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJlYpIHsKKyAgLy8gU3RhcnQgd2l0aCBlbXB0eSBzdHJpbmcuCisgIHN0ZDo6c3RyaW5nIFJlc3VsdDsKKyAgLy8gSWYgdGhlIHZlY3RvciBpcyBub3QgZW1wdHkgCisgIGlmICghVi5lbXB0eSgpKSB7CisgICAgLy8gU3RhcnQgd2l0aCB0aGUgQ1BVIGZlYXR1cmUKKyAgICBSZXN1bHQgPSBWWzBdOworICAgIC8vIEZvciBlYWNoIHN1Y2Nlc3NpdmUgZmVhdHVyZQorICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgVi5zaXplKCk7IGkrKykgeworICAgICAgLy8gQWRkIGEgY29tbWEKKyAgICAgIFJlc3VsdCArPSAiLCI7CisgICAgICAvLyBBZGQgdGhlIGZlYXR1cmUKKyAgICAgIFJlc3VsdCArPSBWW2ldOworICAgIH0KKyAgfQorICAvLyBSZXR1cm4gdGhlIGZlYXR1cmVzIHN0cmluZyAKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8vIEFkZGluZyBmZWF0dXJlcy4KK3ZvaWQgU3VidGFyZ2V0RmVhdHVyZXM6OkFkZEZlYXR1cmUoY29uc3Qgc3RkOjpzdHJpbmcgJlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0VuYWJsZWQpIHsKKyAgLy8gRG9uJ3QgYWRkIGVtcHR5IGZlYXR1cmVzCisgIGlmICghU3RyaW5nLmVtcHR5KCkpIHsKKyAgICAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZSwgcHJlcGVuZCBmbGFnIGFuZCBhZGQgdG8gdmVjdG9yCisgICAgRmVhdHVyZXMucHVzaF9iYWNrKFByZXBlbmRGbGFnKExvd2VyY2FzZVN0cmluZyhTdHJpbmcpLCBJc0VuYWJsZWQpKTsKKyAgfQorfQorCisvLy8gRmluZCBLViBpbiBhcnJheSB1c2luZyBiaW5hcnkgc2VhcmNoLgordGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCAqRmluZChjb25zdCBzdGQ6OnN0cmluZyAmUywgY29uc3QgVCAqQSwgc2l6ZV90IEwpIHsKKyAgLy8gTWFrZSB0aGUgbG93ZXIgYm91bmQgZWxlbWVudCB3ZSdyZSBsb29raW5nIGZvcgorICBUIEtWOworICBLVi5LZXkgPSBTLmNfc3RyKCk7CisgIC8vIERldGVybWluZSB0aGUgZW5kIG9mIHRoZSBhcnJheQorICBjb25zdCBUICpIaSA9IEEgKyBMOworICAvLyBCaW5hcnkgc2VhcmNoIHRoZSBhcnJheQorICBjb25zdCBUICpGID0gc3RkOjpsb3dlcl9ib3VuZChBLCBIaSwgS1YpOworICAvLyBJZiBub3QgZm91bmQgdGhlbiByZXR1cm4gTlVMTAorICBpZiAoRiA9PSBIaSB8fCBzdGQ6OnN0cmluZyhGLT5LZXkpICE9IFMpIHJldHVybiBOVUxMOworICAvLyBSZXR1cm4gdGhlIGZvdW5kIGFycmF5IGl0ZW0KKyAgcmV0dXJuIEY7Cit9CisKKy8vLyBnZXRMb25nZXN0RW50cnlMZW5ndGggLSBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBlbnRyeSBpbiB0aGUgdGFibGUuCisvLy8KK3N0YXRpYyBzaXplX3QgZ2V0TG9uZ2VzdEVudHJ5TGVuZ3RoKGNvbnN0IFN1YnRhcmdldEZlYXR1cmVLViAqVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgU2l6ZSkgeworICBzaXplX3QgTWF4TGVuID0gMDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBTaXplOyBpKyspCisgICAgTWF4TGVuID0gc3RkOjptYXgoTWF4TGVuLCBzdGQ6OnN0cmxlbihUYWJsZVtpXS5LZXkpKTsKKyAgcmV0dXJuIE1heExlbjsKK30KKworLy8vIERpc3BsYXkgaGVscCBmb3IgZmVhdHVyZSBjaG9pY2VzLgorLy8vCitzdGF0aWMgdm9pZCBIZWxwKGNvbnN0IFN1YnRhcmdldEZlYXR1cmVLViAqQ1BVVGFibGUsIHNpemVfdCBDUFVUYWJsZVNpemUsCisgICAgICAgICAgICAgICAgIGNvbnN0IFN1YnRhcmdldEZlYXR1cmVLViAqRmVhdFRhYmxlLCBzaXplX3QgRmVhdFRhYmxlU2l6ZSkgeworICAvLyBEZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBDUFUgYW5kIEZlYXR1cmUgZW50cmllcy4KKyAgdW5zaWduZWQgTWF4Q1BVTGVuICA9IGdldExvbmdlc3RFbnRyeUxlbmd0aChDUFVUYWJsZSwgQ1BVVGFibGVTaXplKTsKKyAgdW5zaWduZWQgTWF4RmVhdExlbiA9IGdldExvbmdlc3RFbnRyeUxlbmd0aChGZWF0VGFibGUsIEZlYXRUYWJsZVNpemUpOworCisgIC8vIFByaW50IHRoZSBDUFUgdGFibGUuCisgIGVycnMoKSA8PCAiQXZhaWxhYmxlIENQVXMgZm9yIHRoaXMgdGFyZ2V0OlxuXG4iOworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBDUFVUYWJsZVNpemU7IGkrKykKKyAgICBlcnJzKCkgPDwgIiAgIiA8PCBDUFVUYWJsZVtpXS5LZXkKKyAgICAgICAgIDw8IHN0ZDo6c3RyaW5nKE1heENQVUxlbiAtIHN0ZDo6c3RybGVuKENQVVRhYmxlW2ldLktleSksICcgJykKKyAgICAgICAgIDw8ICIgLSAiIDw8IENQVVRhYmxlW2ldLkRlc2MgPDwgIi5cbiI7CisgIGVycnMoKSA8PCAiXG4iOworICAKKyAgLy8gUHJpbnQgdGhlIEZlYXR1cmUgdGFibGUuCisgIGVycnMoKSA8PCAiQXZhaWxhYmxlIGZlYXR1cmVzIGZvciB0aGlzIHRhcmdldDpcblxuIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gRmVhdFRhYmxlU2l6ZTsgaSsrKQorICAgIGVycnMoKSA8PCAiICAiIDw8IEZlYXRUYWJsZVtpXS5LZXkKKyAgICAgICAgIDw8IHN0ZDo6c3RyaW5nKE1heEZlYXRMZW4gLSBzdGQ6OnN0cmxlbihGZWF0VGFibGVbaV0uS2V5KSwgJyAnKQorICAgICAgICAgPDwgIiAtICIgPDwgRmVhdFRhYmxlW2ldLkRlc2MgPDwgIi5cbiI7CisgIGVycnMoKSA8PCAiXG4iOworICAKKyAgZXJycygpIDw8ICJVc2UgK2ZlYXR1cmUgdG8gZW5hYmxlIGEgZmVhdHVyZSwgb3IgLWZlYXR1cmUgdG8gZGlzYWJsZSBpdC5cbiIKKyAgICAgICA8PCAiRm9yIGV4YW1wbGUsIGxsYyAtbWNwdT1teWNwdSAtbWF0dHI9K2ZlYXR1cmUxLC1mZWF0dXJlMlxuIjsKKyAgZXhpdCgxKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICBTdWJ0YXJnZXRGZWF0dXJlcyBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworU3VidGFyZ2V0RmVhdHVyZXM6OlN1YnRhcmdldEZlYXR1cmVzKGNvbnN0IHN0ZDo6c3RyaW5nICZJbml0aWFsKSB7CisgIC8vIEJyZWFrIHVwIHN0cmluZyBpbnRvIHNlcGFyYXRlIGZlYXR1cmVzCisgIFNwbGl0KEZlYXR1cmVzLCBJbml0aWFsKTsKK30KKworCitzdGQ6OnN0cmluZyBTdWJ0YXJnZXRGZWF0dXJlczo6Z2V0U3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gSm9pbihGZWF0dXJlcyk7Cit9Cit2b2lkIFN1YnRhcmdldEZlYXR1cmVzOjpzZXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJkluaXRpYWwpIHsKKyAgLy8gVGhyb3cgb3V0IG9sZCBmZWF0dXJlcworICBGZWF0dXJlcy5jbGVhcigpOworICAvLyBCcmVhayB1cCBzdHJpbmcgaW50byBzZXBhcmF0ZSBmZWF0dXJlcworICBTcGxpdChGZWF0dXJlcywgTG93ZXJjYXNlU3RyaW5nKEluaXRpYWwpKTsKK30KKworCisvLy8gc2V0Q1BVIC0gU2V0IHRoZSBDUFUgc3RyaW5nLiAgUmVwbGFjZXMgcHJldmlvdXMgc2V0dGluZy4gIFNldHRpbmcgdG8gIiIKKy8vLyBjbGVhcnMgQ1BVLgordm9pZCBTdWJ0YXJnZXRGZWF0dXJlczo6c2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHJpbmcpIHsKKyAgRmVhdHVyZXNbMF0gPSBMb3dlcmNhc2VTdHJpbmcoU3RyaW5nKTsKK30KKworCisvLy8gc2V0Q1BVSWZOb25lIC0gU2V0dGluZyBDUFUgc3RyaW5nIG9ubHkgaWYgbm8gc3RyaW5nIGlzIHNldC4KKy8vLwordm9pZCBTdWJ0YXJnZXRGZWF0dXJlczo6c2V0Q1BVSWZOb25lKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHJpbmcpIHsKKyAgaWYgKEZlYXR1cmVzWzBdLmVtcHR5KCkpIHNldENQVShTdHJpbmcpOworfQorCisvLy8gZ2V0Q1BVIC0gUmV0dXJucyBjdXJyZW50IENQVS4KKy8vLworY29uc3Qgc3RkOjpzdHJpbmcgJiBTdWJ0YXJnZXRGZWF0dXJlczo6Z2V0Q1BVKCkgY29uc3QgeworICByZXR1cm4gRmVhdHVyZXNbMF07Cit9CisKKworLy8vIFNldEltcGxpZWRCaXRzIC0gRm9yIGVhY2ggZmVhdHVyZSB0aGF0IGlzICh0cmFuc2l0aXZlbHkpIGltcGxpZWQgYnkgdGhpcworLy8vIGZlYXR1cmUsIHNldCBpdC4KKy8vLworc3RhdGljCit2b2lkIFNldEltcGxpZWRCaXRzKHVpbnQzMl90ICZCaXRzLCBjb25zdCBTdWJ0YXJnZXRGZWF0dXJlS1YgKkZlYXR1cmVFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3VidGFyZ2V0RmVhdHVyZUtWICpGZWF0dXJlVGFibGUsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBGZWF0dXJlVGFibGVTaXplKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRmVhdHVyZVRhYmxlU2l6ZTsgKytpKSB7CisgICAgY29uc3QgU3VidGFyZ2V0RmVhdHVyZUtWICZGRSA9IEZlYXR1cmVUYWJsZVtpXTsKKworICAgIGlmIChGZWF0dXJlRW50cnktPlZhbHVlID09IEZFLlZhbHVlKSBjb250aW51ZTsKKworICAgIGlmIChGZWF0dXJlRW50cnktPkltcGxpZXMgJiBGRS5WYWx1ZSkgeworICAgICAgQml0cyB8PSBGRS5WYWx1ZTsKKyAgICAgIFNldEltcGxpZWRCaXRzKEJpdHMsICZGRSwgRmVhdHVyZVRhYmxlLCBGZWF0dXJlVGFibGVTaXplKTsKKyAgICB9CisgIH0KK30KKworLy8vIENsZWFySW1wbGllZEJpdHMgLSBGb3IgZWFjaCBmZWF0dXJlIHRoYXQgKHRyYW5zaXRpdmVseSkgaW1wbGllcyB0aGlzCisvLy8gZmVhdHVyZSwgY2xlYXIgaXQuCisvLy8gCitzdGF0aWMKK3ZvaWQgQ2xlYXJJbXBsaWVkQml0cyh1aW50MzJfdCAmQml0cywgY29uc3QgU3VidGFyZ2V0RmVhdHVyZUtWICpGZWF0dXJlRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3VidGFyZ2V0RmVhdHVyZUtWICpGZWF0dXJlVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEZlYXR1cmVUYWJsZVNpemUpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGZWF0dXJlVGFibGVTaXplOyArK2kpIHsKKyAgICBjb25zdCBTdWJ0YXJnZXRGZWF0dXJlS1YgJkZFID0gRmVhdHVyZVRhYmxlW2ldOworCisgICAgaWYgKEZlYXR1cmVFbnRyeS0+VmFsdWUgPT0gRkUuVmFsdWUpIGNvbnRpbnVlOworCisgICAgaWYgKEZFLkltcGxpZXMgJiBGZWF0dXJlRW50cnktPlZhbHVlKSB7CisgICAgICBCaXRzICY9IH5GRS5WYWx1ZTsKKyAgICAgIENsZWFySW1wbGllZEJpdHMoQml0cywgJkZFLCBGZWF0dXJlVGFibGUsIEZlYXR1cmVUYWJsZVNpemUpOworICAgIH0KKyAgfQorfQorCisvLy8gZ2V0Qml0cyAtIEdldCBmZWF0dXJlIGJpdHMuCisvLy8KK3VpbnQzMl90IFN1YnRhcmdldEZlYXR1cmVzOjpnZXRCaXRzKGNvbnN0IFN1YnRhcmdldEZlYXR1cmVLViAqQ1BVVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgQ1BVVGFibGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3VidGFyZ2V0RmVhdHVyZUtWICpGZWF0dXJlVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgRmVhdHVyZVRhYmxlU2l6ZSkgeworICBhc3NlcnQoQ1BVVGFibGUgJiYgIm1pc3NpbmcgQ1BVIHRhYmxlIik7CisgIGFzc2VydChGZWF0dXJlVGFibGUgJiYgIm1pc3NpbmcgZmVhdHVyZXMgdGFibGUiKTsKKyNpZm5kZWYgTkRFQlVHCisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgQ1BVVGFibGVTaXplOyBpKyspIHsKKyAgICBhc3NlcnQoc3RyY21wKENQVVRhYmxlW2kgLSAxXS5LZXksIENQVVRhYmxlW2ldLktleSkgPCAwICYmCisgICAgICAgICAgICJDUFUgdGFibGUgaXMgbm90IHNvcnRlZCIpOworICB9CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgRmVhdHVyZVRhYmxlU2l6ZTsgaSsrKSB7CisgICAgYXNzZXJ0KHN0cmNtcChGZWF0dXJlVGFibGVbaSAtIDFdLktleSwgRmVhdHVyZVRhYmxlW2ldLktleSkgPCAwICYmCisgICAgICAgICAgIkNQVSBmZWF0dXJlcyB0YWJsZSBpcyBub3Qgc29ydGVkIik7CisgIH0KKyNlbmRpZgorICB1aW50MzJfdCBCaXRzID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIFJlc3VsdGluZyBiaXRzCisKKyAgLy8gQ2hlY2sgaWYgaGVscCBpcyBuZWVkZWQKKyAgaWYgKEZlYXR1cmVzWzBdID09ICJoZWxwIikKKyAgICBIZWxwKENQVVRhYmxlLCBDUFVUYWJsZVNpemUsIEZlYXR1cmVUYWJsZSwgRmVhdHVyZVRhYmxlU2l6ZSk7CisgIAorICAvLyBGaW5kIENQVSBlbnRyeQorICBjb25zdCBTdWJ0YXJnZXRGZWF0dXJlS1YgKkNQVUVudHJ5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kKEZlYXR1cmVzWzBdLCBDUFVUYWJsZSwgQ1BVVGFibGVTaXplKTsKKyAgLy8gSWYgdGhlcmUgaXMgYSBtYXRjaAorICBpZiAoQ1BVRW50cnkpIHsKKyAgICAvLyBTZXQgYmFzZSBmZWF0dXJlIGJpdHMKKyAgICBCaXRzID0gQ1BVRW50cnktPlZhbHVlOworCisgICAgLy8gU2V0IHRoZSBmZWF0dXJlIGltcGxpZWQgYnkgdGhpcyBDUFUgZmVhdHVyZSwgaWYgYW55LgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRmVhdHVyZVRhYmxlU2l6ZTsgKytpKSB7CisgICAgICBjb25zdCBTdWJ0YXJnZXRGZWF0dXJlS1YgJkZFID0gRmVhdHVyZVRhYmxlW2ldOworICAgICAgaWYgKENQVUVudHJ5LT5WYWx1ZSAmIEZFLlZhbHVlKQorICAgICAgICBTZXRJbXBsaWVkQml0cyhCaXRzLCAmRkUsIEZlYXR1cmVUYWJsZSwgRmVhdHVyZVRhYmxlU2l6ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGVycnMoKSA8PCAiJyIgPDwgRmVhdHVyZXNbMF0KKyAgICAgICAgICAgPDwgIicgaXMgbm90IGEgcmVjb2duaXplZCBwcm9jZXNzb3IgZm9yIHRoaXMgdGFyZ2V0IgorICAgICAgICAgICA8PCAiIChpZ25vcmluZyBwcm9jZXNzb3IpXG4iOworICB9CisgIC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGZlYXR1cmUKKyAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBGZWF0dXJlcy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGZWF0dXJlID0gRmVhdHVyZXNbaV07CisgICAgCisgICAgLy8gQ2hlY2sgZm9yIGhlbHAKKyAgICBpZiAoRmVhdHVyZSA9PSAiK2hlbHAiKQorICAgICAgSGVscChDUFVUYWJsZSwgQ1BVVGFibGVTaXplLCBGZWF0dXJlVGFibGUsIEZlYXR1cmVUYWJsZVNpemUpOworICAgIAorICAgIC8vIEZpbmQgZmVhdHVyZSBpbiB0YWJsZS4KKyAgICBjb25zdCBTdWJ0YXJnZXRGZWF0dXJlS1YgKkZlYXR1cmVFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgICAgIEZpbmQoU3RyaXBGbGFnKEZlYXR1cmUpLCBGZWF0dXJlVGFibGUsIEZlYXR1cmVUYWJsZVNpemUpOworICAgIC8vIElmIHRoZXJlIGlzIGEgbWF0Y2gKKyAgICBpZiAoRmVhdHVyZUVudHJ5KSB7CisgICAgICAvLyBFbmFibGUvZGlzYWJsZSBmZWF0dXJlIGluIGJpdHMKKyAgICAgIGlmIChpc0VuYWJsZWQoRmVhdHVyZSkpIHsKKyAgICAgICAgQml0cyB8PSAgRmVhdHVyZUVudHJ5LT5WYWx1ZTsKKworICAgICAgICAvLyBGb3IgZWFjaCBmZWF0dXJlIHRoYXQgdGhpcyBpbXBsaWVzLCBzZXQgaXQuCisgICAgICAgIFNldEltcGxpZWRCaXRzKEJpdHMsIEZlYXR1cmVFbnRyeSwgRmVhdHVyZVRhYmxlLCBGZWF0dXJlVGFibGVTaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEJpdHMgJj0gfkZlYXR1cmVFbnRyeS0+VmFsdWU7CisKKyAgICAgICAgLy8gRm9yIGVhY2ggZmVhdHVyZSB0aGF0IGltcGxpZXMgdGhpcywgY2xlYXIgaXQuCisgICAgICAgIENsZWFySW1wbGllZEJpdHMoQml0cywgRmVhdHVyZUVudHJ5LCBGZWF0dXJlVGFibGUsIEZlYXR1cmVUYWJsZVNpemUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlcnJzKCkgPDwgIiciIDw8IEZlYXR1cmUKKyAgICAgICAgICAgICA8PCAiJyBpcyBub3QgYSByZWNvZ25pemVkIGZlYXR1cmUgZm9yIHRoaXMgdGFyZ2V0IgorICAgICAgICAgICAgIDw8ICIgKGlnbm9yaW5nIGZlYXR1cmUpXG4iOworICAgIH0KKyAgfQorCisgIHJldHVybiBCaXRzOworfQorCisvLy8gR2V0IGluZm8gcG9pbnRlcgordm9pZCAqU3VidGFyZ2V0RmVhdHVyZXM6OmdldEluZm8oY29uc3QgU3VidGFyZ2V0SW5mb0tWICpUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBUYWJsZVNpemUpIHsKKyAgYXNzZXJ0KFRhYmxlICYmICJtaXNzaW5nIHRhYmxlIik7CisjaWZuZGVmIE5ERUJVRworICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IFRhYmxlU2l6ZTsgaSsrKSB7CisgICAgYXNzZXJ0KHN0cmNtcChUYWJsZVtpIC0gMV0uS2V5LCBUYWJsZVtpXS5LZXkpIDwgMCAmJiAiVGFibGUgaXMgbm90IHNvcnRlZCIpOworICB9CisjZW5kaWYKKworICAvLyBGaW5kIGVudHJ5CisgIGNvbnN0IFN1YnRhcmdldEluZm9LViAqRW50cnkgPSBGaW5kKEZlYXR1cmVzWzBdLCBUYWJsZSwgVGFibGVTaXplKTsKKyAgCisgIGlmIChFbnRyeSkgeworICAgIHJldHVybiBFbnRyeS0+VmFsdWU7CisgIH0gZWxzZSB7CisgICAgZXJycygpIDw8ICInIiA8PCBGZWF0dXJlc1swXQorICAgICAgICAgICA8PCAiJyBpcyBub3QgYSByZWNvZ25pemVkIHByb2Nlc3NvciBmb3IgdGhpcyB0YXJnZXQiCisgICAgICAgICAgIDw8ICIgKGlnbm9yaW5nIHByb2Nlc3NvcilcbiI7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLy8vIHByaW50IC0gUHJpbnQgZmVhdHVyZSBzdHJpbmcuCisvLy8KK3ZvaWQgU3VidGFyZ2V0RmVhdHVyZXM6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IEZlYXR1cmVzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgT1MgPDwgRmVhdHVyZXNbaV0gPDwgIiAgIjsKKyAgT1MgPDwgIlxuIjsKK30KKworLy8vIGR1bXAgLSBEdW1wIGZlYXR1cmUgaW5mby4KKy8vLwordm9pZCBTdWJ0YXJnZXRGZWF0dXJlczo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsKK30KKworLy8vIGdldERlZmF1bHRTdWJ0YXJnZXRGZWF0dXJlcyAtIFJldHVybiBhIHN0cmluZyBsaXN0aW5nIHRoZSBmZWF0dXJlcworLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFyZ2V0IHRyaXBsZS4KKy8vLworLy8vIEZJWE1FOiBUaGlzIGlzIGFuIGluZWxlZ2FudCB3YXkgb2Ygc3BlY2lmeWluZyB0aGUgZmVhdHVyZXMgb2YgYQorLy8vIHN1YnRhcmdldC4gSXQgd291bGQgYmUgYmV0dGVyIGlmIHdlIGNvdWxkIGVuY29kZSB0aGlzIGluZm9ybWF0aW9uCisvLy8gaW50byB0aGUgSVIuIFNlZSA8cmRhcjovLzU5NzI0NTY+LgorLy8vCit2b2lkIFN1YnRhcmdldEZlYXR1cmVzOjpnZXREZWZhdWx0U3VidGFyZ2V0RmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcgJkNQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmlwbGUmIFRyaXBsZSkgeworICBzZXRDUFUoQ1BVKTsKKworICBpZiAoVHJpcGxlLmdldFZlbmRvcigpID09IFRyaXBsZTo6QXBwbGUpIHsKKyAgICBpZiAoVHJpcGxlLmdldEFyY2goKSA9PSBUcmlwbGU6OnBwYykgeworICAgICAgLy8gcG93ZXJwYy1hcHBsZS0qCisgICAgICBBZGRGZWF0dXJlKCJhbHRpdmVjIik7CisgICAgfSBlbHNlIGlmIChUcmlwbGUuZ2V0QXJjaCgpID09IFRyaXBsZTo6cHBjNjQpIHsKKyAgICAgIC8vIHBvd2VycGM2NC1hcHBsZS0qCisgICAgICBBZGRGZWF0dXJlKCI2NGJpdCIpOworICAgICAgQWRkRmVhdHVyZSgiYWx0aXZlYyIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmJlODNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uICkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNU3lzdGVtWkFzbVByaW50ZXIKKyAgU3lzdGVtWkFzbVByaW50ZXIuY3BwCisgICkKK2FkZF9kZXBlbmRlbmNpZXMoTExWTVN5c3RlbVpBc21QcmludGVyIFN5c3RlbVpDb2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL0FzbVByaW50ZXIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovQXNtUHJpbnRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjkwZWQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL0FzbVByaW50ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvU3lzdGVtWi9Bc21QcmludGVyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVN5c3RlbVpBc21QcmludGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBTeXN0ZW1aIHRhcmdldCBkaXJlY3RvcnkgdG8gZ3JhYiBwcml2YXRlIGhlYWRlcnMKK0NQUC5GbGFncyArPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL0FzbVByaW50ZXIvU3lzdGVtWkFzbVByaW50ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL0FzbVByaW50ZXIvU3lzdGVtWkFzbVByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YWM4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovQXNtUHJpbnRlci9TeXN0ZW1aQXNtUHJpbnRlci5jcHAKQEAgLTAsMCArMSwyMTcgQEAKKy8vPT09LS0gU3lzdGVtWkFzbVByaW50ZXIuY3BwIC0gU3lzdGVtWiBMTFZNIGFzc2VtYmx5IHdyaXRlciAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHByaW50ZXIgdGhhdCBjb252ZXJ0cyBmcm9tIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorLy8gb2YgbWFjaGluZS1kZXBlbmRlbnQgTExWTSBjb2RlIHRvIHRoZSBTeXN0ZW1aIGFzc2VtYmx5IGxhbmd1YWdlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXNtLXByaW50ZXIiCisjaW5jbHVkZSAiU3lzdGVtWi5oIgorI2luY2x1ZGUgIlN5c3RlbVpJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJTeXN0ZW1aVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgU3lzdGVtWkFzbVByaW50ZXIgOiBwdWJsaWMgQXNtUHJpbnRlciB7CisgIHB1YmxpYzoKKyAgICBTeXN0ZW1aQXNtUHJpbnRlcihUYXJnZXRNYWNoaW5lICZUTSwgTUNTdHJlYW1lciAmU3RyZWFtZXIpCisgICAgICA6IEFzbVByaW50ZXIoVE0sIFN0cmVhbWVyKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiU3lzdGVtWiBBc3NlbWJseSBQcmludGVyIjsKKyAgICB9CisKKyAgICB2b2lkIHByaW50T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIE1vZGlmaWVyID0gMCk7CisgICAgdm9pZCBwcmludFBDUmVsSW1tT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIHByaW50UklBZGRyT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgT3BOdW0sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIE1vZGlmaWVyID0gMCk7CisgICAgdm9pZCBwcmludFJSSUFkZHJPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIE1vZGlmaWVyID0gMCk7CisgICAgdm9pZCBwcmludFMxNkltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLCByYXdfb3N0cmVhbSAmTykgeworICAgICAgTyA8PCAoaW50MTZfdClNSS0+Z2V0T3BlcmFuZChPcE51bSkuZ2V0SW1tKCk7CisgICAgfQorICAgIHZvaWQgcHJpbnRTMzJJbW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIE8gPDwgKGludDMyX3QpTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldEltbSgpOworICAgIH0KKworICAgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmTyk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFJlZ2lzdGVyTmFtZSh1bnNpZ25lZCBSZWdObyk7CisKKyAgICB2b2lkIEVtaXRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKTsKKyAgfTsKK30gLy8gZW5kIG9mIGFub255bW91cyBuYW1lc3BhY2UKKworI2luY2x1ZGUgIlN5c3RlbVpHZW5Bc21Xcml0ZXIuaW5jIgorCit2b2lkIFN5c3RlbVpBc21QcmludGVyOjpFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSkgeworICBTbWFsbFN0cmluZzwxMjg+IFN0cjsKKyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhTdHIpOworICBwcmludEluc3RydWN0aW9uKE1JLCBPUyk7CisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KE9TLnN0cigpKTsKK30KKwordm9pZCBTeXN0ZW1aQXNtUHJpbnRlcjo6cHJpbnRQQ1JlbEltbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBzd2l0Y2ggKE1PLmdldFR5cGUoKSkgeworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgTyA8PCBNTy5nZXRJbW0oKTsKKyAgICByZXR1cm47CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrOgorICAgIE8gPDwgKk1PLmdldE1CQigpLT5nZXRTeW1ib2woKTsKKyAgICByZXR1cm47CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0dsb2JhbEFkZHJlc3M6IHsKKyAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBNTy5nZXRHbG9iYWwoKTsKKyAgICBPIDw8ICpNYW5nLT5nZXRTeW1ib2woR1YpOworCisgICAgLy8gQXNzZW1ibGUgY2FsbHMgdmlhIFBMVCBmb3IgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMgaWYgUElDLgorICAgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6UElDXyAmJgorICAgICAgICAhR1YtPmhhc0hpZGRlblZpc2liaWxpdHkoKSAmJiAhR1YtPmhhc1Byb3RlY3RlZFZpc2liaWxpdHkoKSAmJgorICAgICAgICAhR1YtPmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgTyA8PCAiQFBMVCI7CisKKyAgICBwcmludE9mZnNldChNTy5nZXRPZmZzZXQoKSwgTyk7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOiB7CisgICAgc3RkOjpzdHJpbmcgTmFtZShNQUktPmdldEdsb2JhbFByZWZpeCgpKTsKKyAgICBOYW1lICs9IE1PLmdldFN5bWJvbE5hbWUoKTsKKyAgICBPIDw8IE5hbWU7CisKKyAgICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pCisgICAgICBPIDw8ICJAUExUIjsKKworICAgIHJldHVybjsKKyAgfQorICBkZWZhdWx0OgorICAgIGFzc2VydCgwICYmICJOb3QgaW1wbGVtZW50ZWQgeWV0ISIpOworICB9Cit9CisKKwordm9pZCBTeXN0ZW1aQXNtUHJpbnRlcjo6cHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywgY29uc3QgY2hhciAqTW9kaWZpZXIpIHsKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBzd2l0Y2ggKE1PLmdldFR5cGUoKSkgeworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19SZWdpc3RlcjogeworICAgIGFzc2VydCAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoTU8uZ2V0UmVnKCkpICYmCisgICAgICAgICAgICAiVmlydHVhbCByZWdpc3RlcnMgc2hvdWxkIGJlIGFscmVhZHkgbWFwcGVkISIpOworICAgIHVuc2lnbmVkIFJlZyA9IE1PLmdldFJlZygpOworICAgIGlmIChNb2RpZmllciAmJiBzdHJuY21wKE1vZGlmaWVyLCAic3VicmVnIiwgNikgPT0gMCkgeworICAgICAgaWYgKHN0cm5jbXAoTW9kaWZpZXIgKyA3LCAiZXZlbiIsIDQpID09IDApCisgICAgICAgIFJlZyA9IFRNLmdldFJlZ2lzdGVySW5mbygpLT5nZXRTdWJSZWcoUmVnLCBTeXN0ZW1aOjpzdWJyZWdfMzJiaXQpOworICAgICAgZWxzZSBpZiAoc3RybmNtcChNb2RpZmllciArIDcsICJvZGQiLCAzKSA9PSAwKQorICAgICAgICBSZWcgPSBUTS5nZXRSZWdpc3RlckluZm8oKS0+Z2V0U3ViUmVnKFJlZywgU3lzdGVtWjo6c3VicmVnX29kZDMyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkludmFsaWQgc3VicmVnIG1vZGlmaWVyIik7CisgICAgfQorCisgICAgTyA8PCAnJScgPDwgZ2V0UmVnaXN0ZXJOYW1lKFJlZyk7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0ltbWVkaWF0ZToKKyAgICBPIDw8IE1PLmdldEltbSgpOworICAgIHJldHVybjsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fTWFjaGluZUJhc2ljQmxvY2s6CisgICAgTyA8PCAqTU8uZ2V0TUJCKCktPmdldFN5bWJvbCgpOworICAgIHJldHVybjsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSA8PCAiSlRJIiA8PCBnZXRGdW5jdGlvbk51bWJlcigpIDw8ICdfJworICAgICAgPDwgTU8uZ2V0SW5kZXgoKTsKKworICAgIHJldHVybjsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fQ29uc3RhbnRQb29sSW5kZXg6CisgICAgTyA8PCBNQUktPmdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSA8PCAiQ1BJIiA8PCBnZXRGdW5jdGlvbk51bWJlcigpIDw8ICdfJworICAgICAgPDwgTU8uZ2V0SW5kZXgoKTsKKworICAgIHByaW50T2Zmc2V0KE1PLmdldE9mZnNldCgpLCBPKTsKKyAgICBicmVhazsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fR2xvYmFsQWRkcmVzczoKKyAgICBPIDw8ICpNYW5nLT5nZXRTeW1ib2woTU8uZ2V0R2xvYmFsKCkpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19FeHRlcm5hbFN5bWJvbDogeworICAgIE8gPDwgKkdldEV4dGVybmFsU3ltYm9sU3ltYm9sKE1PLmdldFN5bWJvbE5hbWUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoMCAmJiAiTm90IGltcGxlbWVudGVkIHlldCEiKTsKKyAgfQorCisgIHN3aXRjaCAoTU8uZ2V0VGFyZ2V0RmxhZ3MoKSkgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biB0YXJnZXQgZmxhZyBvbiBHViBvcGVyYW5kIik7CisgIGNhc2UgU3lzdGVtWklJOjpNT19OT19GTEFHOgorICAgIGJyZWFrOworICBjYXNlIFN5c3RlbVpJSTo6TU9fR09URU5UOiAgICBPIDw8ICJAR09URU5UIjsgICAgYnJlYWs7CisgIGNhc2UgU3lzdGVtWklJOjpNT19QTFQ6ICAgICAgIE8gPDwgIkBQTFQiOyAgICAgICBicmVhazsKKyAgfQorCisgIHByaW50T2Zmc2V0KE1PLmdldE9mZnNldCgpLCBPKTsKK30KKwordm9pZCBTeXN0ZW1aQXNtUHJpbnRlcjo6cHJpbnRSSUFkZHJPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllcikgeworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmQmFzZSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKTsKKworICAvLyBQcmludCBkaXNwbGFjZW1lbnQgb3BlcmFuZC4KKyAgcHJpbnRPcGVyYW5kKE1JLCBPcE51bSsxLCBPKTsKKworICAvLyBQcmludCBiYXNlIG9wZXJhbmQgKGlmIGFueSkKKyAgaWYgKEJhc2UuZ2V0UmVnKCkpIHsKKyAgICBPIDw8ICcoJzsKKyAgICBwcmludE9wZXJhbmQoTUksIE9wTnVtLCBPKTsKKyAgICBPIDw8ICcpJzsKKyAgfQorfQorCit2b2lkIFN5c3RlbVpBc21QcmludGVyOjpwcmludFJSSUFkZHJPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZCYXNlID0gTUktPmdldE9wZXJhbmQoT3BOdW0pOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmSW5kZXggPSBNSS0+Z2V0T3BlcmFuZChPcE51bSsyKTsKKworICAvLyBQcmludCBkaXNwbGFjZW1lbnQgb3BlcmFuZC4KKyAgcHJpbnRPcGVyYW5kKE1JLCBPcE51bSsxLCBPKTsKKworICAvLyBQcmludCBiYXNlIG9wZXJhbmQgKGlmIGFueSkKKyAgaWYgKEJhc2UuZ2V0UmVnKCkpIHsKKyAgICBPIDw8ICcoJzsKKyAgICBwcmludE9wZXJhbmQoTUksIE9wTnVtLCBPKTsKKyAgICBpZiAoSW5kZXguZ2V0UmVnKCkpIHsKKyAgICAgIE8gPDwgJywnOworICAgICAgcHJpbnRPcGVyYW5kKE1JLCBPcE51bSsyLCBPKTsKKyAgICB9CisgICAgTyA8PCAnKSc7CisgIH0gZWxzZQorICAgIGFzc2VydCghSW5kZXguZ2V0UmVnKCkgJiYgIlNob3VsZCBhbGxvY2F0ZSBiYXNlIHJlZ2lzdGVyIGZpcnN0ISIpOworfQorCisvLyBGb3JjZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVTeXN0ZW1aQXNtUHJpbnRlcigpIHsKKyAgUmVnaXN0ZXJBc21QcmludGVyPFN5c3RlbVpBc21QcmludGVyPiBYKFRoZVN5c3RlbVpUYXJnZXQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MGU1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNCBAQAorc2V0KExMVk1fVEFSR0VUX0RFRklOSVRJT05TIFN5c3RlbVoudGQpCisKK3RhYmxlZ2VuKFN5c3RlbVpHZW5SZWdpc3RlckluZm8uaC5pbmMgLWdlbi1yZWdpc3Rlci1kZXNjLWhlYWRlcikKK3RhYmxlZ2VuKFN5c3RlbVpHZW5SZWdpc3Rlck5hbWVzLmluYyAtZ2VuLXJlZ2lzdGVyLWVudW1zKQordGFibGVnZW4oU3lzdGVtWkdlblJlZ2lzdGVySW5mby5pbmMgLWdlbi1yZWdpc3Rlci1kZXNjKQordGFibGVnZW4oU3lzdGVtWkdlbkluc3RyTmFtZXMuaW5jIC1nZW4taW5zdHItZW51bXMpCit0YWJsZWdlbihTeXN0ZW1aR2VuSW5zdHJJbmZvLmluYyAtZ2VuLWluc3RyLWRlc2MpCit0YWJsZWdlbihTeXN0ZW1aR2VuQXNtV3JpdGVyLmluYyAtZ2VuLWFzbS13cml0ZXIpCit0YWJsZWdlbihTeXN0ZW1aR2VuREFHSVNlbC5pbmMgLWdlbi1kYWctaXNlbCkKK3RhYmxlZ2VuKFN5c3RlbVpHZW5DYWxsaW5nQ29udi5pbmMgLWdlbi1jYWxsaW5nY29udikKK3RhYmxlZ2VuKFN5c3RlbVpHZW5TdWJ0YXJnZXQuaW5jIC1nZW4tc3VidGFyZ2V0KQorCithZGRfbGx2bV90YXJnZXQoU3lzdGVtWkNvZGVHZW4KKyAgU3lzdGVtWklTZWxEQUdUb0RBRy5jcHAKKyAgU3lzdGVtWklTZWxMb3dlcmluZy5jcHAKKyAgU3lzdGVtWkluc3RySW5mby5jcHAKKyAgU3lzdGVtWk1DQXNtSW5mby5jcHAKKyAgU3lzdGVtWlJlZ2lzdGVySW5mby5jcHAKKyAgU3lzdGVtWlN1YnRhcmdldC5jcHAKKyAgU3lzdGVtWlRhcmdldE1hY2hpbmUuY3BwCisgIFN5c3RlbVpTZWxlY3Rpb25EQUdJbmZvLmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoTExWTVN5c3RlbVpDb2RlR2VuIExMVk1TZWxlY3Rpb25EQUcpCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0NDA5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACisjIz09PS0gbGliL1RhcmdldC9TeXN0ZW1aL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVN5c3RlbVpDb2RlR2VuCitUQVJHRVQgPSBTeXN0ZW1aCisKKyMgTWFrZSBzdXJlIHRoYXQgdGJsZ2VuIGlzIHJ1biwgZmlyc3QgdGhpbmcuCitCVUlMVF9TT1VSQ0VTID0gU3lzdGVtWkdlblJlZ2lzdGVySW5mby5oLmluYyBTeXN0ZW1aR2VuUmVnaXN0ZXJOYW1lcy5pbmMgXAorICAgICAgICAgICAgICAgIFN5c3RlbVpHZW5SZWdpc3RlckluZm8uaW5jIFN5c3RlbVpHZW5JbnN0ck5hbWVzLmluYyBcCisgICAgICAgICAgICAgICAgU3lzdGVtWkdlbkluc3RySW5mby5pbmMgU3lzdGVtWkdlbkFzbVdyaXRlci5pbmMgXAorICAgICAgICAgICAgICAgIFN5c3RlbVpHZW5EQUdJU2VsLmluYyBTeXN0ZW1aR2VuU3VidGFyZ2V0LmluYyBTeXN0ZW1aR2VuQ2FsbGluZ0NvbnYuaW5jCisKK0RJUlMgPSBBc21QcmludGVyIFRhcmdldEluZm8KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVouaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1MjQwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aLmgKQEAgLTAsMCArMSw2MSBAQAorLy89LS0gU3lzdGVtWi5oIC0gVG9wLWxldmVsIGludGVyZmFjZSBmb3IgU3lzdGVtWiByZXByZXNlbnRhdGlvbiAtKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGVudHJ5IHBvaW50cyBmb3IgZ2xvYmFsIGZ1bmN0aW9ucyBkZWZpbmVkIGluCisvLyB0aGUgTExWTSBTeXN0ZW1aIGJhY2tlbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9TeXN0ZW1aX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfU3lzdGVtWl9ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgU3lzdGVtWlRhcmdldE1hY2hpbmU7CisgIGNsYXNzIEZ1bmN0aW9uUGFzczsKKyAgY2xhc3MgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOworCisgIG5hbWVzcGFjZSBTeXN0ZW1aQ0MgeworICAgIC8vIFN5c3RlbVogc3BlY2lmaWMgY29uZGl0aW9uIGNvZGUuIFRoZXNlIGNvcnJlc3BvbmQgdG8gU1lTVEVNWl8qX0NPTkQgaW4KKyAgICAvLyBTeXN0ZW1aSW5zdHJJbmZvLnRkLiBUaGV5IG11c3QgYmUga2VwdCBpbiBzeW5jaC4KKyAgICBlbnVtIENvbmRDb2RlcyB7CisgICAgICBPICAgPSAwLAorICAgICAgSCAgID0gMSwKKyAgICAgIE5MRSA9IDIsCisgICAgICBMICAgPSAzLAorICAgICAgTkhFID0gNCwKKyAgICAgIExIICA9IDUsCisgICAgICBORSAgPSA2LAorICAgICAgRSAgID0gNywKKyAgICAgIE5MSCA9IDgsCisgICAgICBIRSAgPSA5LAorICAgICAgTkwgID0gMTAsCisgICAgICBMRSAgPSAxMSwKKyAgICAgIE5IICA9IDEyLAorICAgICAgTk8gID0gMTMsCisgICAgICBJTlZBTElEID0gLTEKKyAgICB9OworICB9CisKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVTeXN0ZW1aSVNlbERhZyhTeXN0ZW1aVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKKyAgZXh0ZXJuIFRhcmdldCBUaGVTeXN0ZW1aVGFyZ2V0OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bTsKKworLy8gRGVmaW5lcyBzeW1ib2xpYyBuYW1lcyBmb3IgU3lzdGVtWiByZWdpc3RlcnMuCisvLyBUaGlzIGRlZmluZXMgYSBtYXBwaW5nIGZyb20gcmVnaXN0ZXIgbmFtZSB0byByZWdpc3RlciBudW1iZXIuCisjaW5jbHVkZSAiU3lzdGVtWkdlblJlZ2lzdGVyTmFtZXMuaW5jIgorCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciB0aGUgU3lzdGVtWiBpbnN0cnVjdGlvbnMuCisjaW5jbHVkZSAiU3lzdGVtWkdlbkluc3RyTmFtZXMuaW5jIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVoudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwOGMwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aLnRkCkBAIC0wLDAgKzEsNjEgQEAKKy8vPT09LSBTeXN0ZW1aLnRkIC0gRGVzY3JpYmUgdGhlIFN5c3RlbVogVGFyZ2V0IE1hY2hpbmUgLS0tLS0tKi0gdGJsZ2VuIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgZW50cnkgcG9pbnQgZm9yIHRoZSBTeXN0ZW1aIHRhcmdldC4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYXJnZXQtaW5kZXBlbmRlbnQgaW50ZXJmYWNlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0LnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3VidGFyZ2V0IEZlYXR1cmVzLiAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgRmVhdHVyZVoxMCA6IFN1YnRhcmdldEZlYXR1cmU8InoxMCIsICJIYXNaMTBJbnN0cyIsICJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VwcG9ydCBaMTAgaW5zdHJ1Y3Rpb25zIj47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTeXN0ZW1aIHN1cHBvcnRlZCBwcm9jZXNzb3JzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIFByb2M8c3RyaW5nIE5hbWUsIGxpc3Q8U3VidGFyZ2V0RmVhdHVyZT4gRmVhdHVyZXM+CisgOiBQcm9jZXNzb3I8TmFtZSwgTm9JdGluZXJhcmllcywgRmVhdHVyZXM+OworCitkZWYgOiBQcm9jPCJ6OSIsICBbXT47CitkZWYgOiBQcm9jPCJ6MTAiLCBbRmVhdHVyZVoxMF0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmVnaXN0ZXIgRmlsZSBEZXNjcmlwdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW5jbHVkZSAiU3lzdGVtWlJlZ2lzdGVySW5mby50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENhbGxpbmcgQ29udmVudGlvbiBEZXNjcmlwdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW5jbHVkZSAiU3lzdGVtWkNhbGxpbmdDb252LnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gRGVzY3JpcHRpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitpbmNsdWRlICJTeXN0ZW1aSW5zdHJJbmZvLnRkIgoraW5jbHVkZSAiU3lzdGVtWkluc3RyRlAudGQiCisKK2RlZiBTeXN0ZW1aSW5zdHJJbmZvIDogSW5zdHJJbmZvIHt9IAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGFyZ2V0IERlY2xhcmF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgU3lzdGVtWiA6IFRhcmdldCB7CisgIGxldCBJbnN0cnVjdGlvblNldCA9IFN5c3RlbVpJbnN0ckluZm87Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aQ2FsbGluZ0NvbnYudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWkNhbGxpbmdDb252LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTlhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWkNhbGxpbmdDb252LnRkCkBAIC0wLDAgKzEsNDYgQEAKKy8vPS0gU3lzdGVtWkNhbGxpbmdDb252LnRkIC0gQ2FsbGluZyBDb252ZW50aW9ucyBmb3IgU3lzdGVtWiAtKi0gdGFibGVnZW4gLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUaGlzIGRlc2NyaWJlcyB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgU3lzdGVtWiBhcmNoaXRlY3R1cmUuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3lzdGVtWiBSZXR1cm4gVmFsdWUgQ2FsbGluZyBDb252ZW50aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIFJldENDX1N5c3RlbVogOiBDYWxsaW5nQ29udjxbCisgIC8vIFByb21vdGUgaTgvaTE2L2kzMiBhcmd1bWVudHMgdG8gaTY0LgorICBDQ0lmVHlwZTxbaTgsIGkxNiwgaTMyXSwgQ0NQcm9tb3RlVG9UeXBlPGk2ND4+LAorCisgIC8vIGk2NCBpcyByZXR1cm5lZCBpbiByZWdpc3RlciBSMgorICBDQ0lmVHlwZTxbaTY0XSwgQ0NBc3NpZ25Ub1JlZzxbUjJELCBSM0QsIFI0RCwgUjVEXT4+LAorCisgIC8vIGYzMiAvIGY2NCBhcmUgcmV0dXJuZWQgaW4gRjAKKyAgQ0NJZlR5cGU8W2YzMl0sIENDQXNzaWduVG9SZWc8W0YwUywgRjJTLCBGNFMsIEY2U10+PiwKKyAgQ0NJZlR5cGU8W2Y2NF0sIENDQXNzaWduVG9SZWc8W0YwTCwgRjJMLCBGNEwsIEY2TF0+PgorXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTeXN0ZW1aIEFyZ3VtZW50IENhbGxpbmcgQ29udmVudGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgQ0NfU3lzdGVtWiA6IENhbGxpbmdDb252PFsKKyAgLy8gUHJvbW90ZSBpOC9pMTYvaTMyIGFyZ3VtZW50cyB0byBpNjQuCisgIENDSWZUeXBlPFtpOCwgaTE2LCBpMzJdLCBDQ1Byb21vdGVUb1R5cGU8aTY0Pj4sCisKKyAgLy8gVGhlIGZpcnN0IDUgaW50ZWdlciBhcmd1bWVudHMgb2Ygbm9uLXZhcmFyZ3MgZnVuY3Rpb25zIGFyZSBwYXNzZWQgaW4KKyAgLy8gaW50ZWdlciByZWdpc3RlcnMuCisgIENDSWZUeXBlPFtpNjRdLCBDQ0Fzc2lnblRvUmVnPFtSMkQsIFIzRCwgUjRELCBSNUQsIFI2RF0+PiwKKworICAvLyBUaGUgZmlyc3QgNCBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgb2Ygbm9uLXZhcmFyZ3MgZnVuY3Rpb25zIGFyZSBwYXNzZWQKKyAgLy8gaW4gRlAgcmVnaXN0ZXJzLgorICBDQ0lmVHlwZTxbZjMyXSwgQ0NBc3NpZ25Ub1JlZzxbRjBTLCBGMlMsIEY0UywgRjZTXT4+LAorICBDQ0lmVHlwZTxbZjY0XSwgQ0NBc3NpZ25Ub1JlZzxbRjBMLCBGMkwsIEY0TCwgRjZMXT4+LAorCisgIC8vIEludGVnZXIgdmFsdWVzIGdldCBzdG9yZWQgaW4gc3RhY2sgc2xvdHMgdGhhdCBhcmUgOCBieXRlcyBpbgorICAvLyBzaXplIGFuZCA4LWJ5dGUgYWxpZ25lZC4KKyAgQ0NJZlR5cGU8W2k2NCwgZjMyLCBmNjRdLCBDQ0Fzc2lnblRvU3RhY2s8OCwgOD4+CitdPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSVNlbERBR1RvREFHLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSVNlbERBR1RvREFHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI5MGNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpJU2VsREFHVG9EQUcuY3BwCkBAIC0wLDAgKzEsNzgyIEBACisvLz09LS0gU3lzdGVtWklTZWxEQUdUb0RBRy5jcHAgLSBBIGRhZyB0byBkYWcgaW5zdCBzZWxlY3RvciBmb3IgU3lzdGVtWiAtLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGluc3RydWN0aW9uIHNlbGVjdG9yIGZvciB0aGUgU3lzdGVtWiB0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlN5c3RlbVouaCIKKyNpbmNsdWRlICJTeXN0ZW1aVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIC8vLyBTeXN0ZW1aUlJJQWRkcmVzc01vZGUgLSBUaGlzIGNvcnJlc3BvbmRzIHRvIHJyaWFkZHIsIGJ1dCB1c2VzIFNEVmFsdWUncworICAvLy8gaW5zdGVhZCBvZiByZWdpc3RlciBudW1iZXJzIGZvciB0aGUgbGVhdmVzIG9mIHRoZSBtYXRjaGVkIHRyZWUuCisgIHN0cnVjdCBTeXN0ZW1aUlJJQWRkcmVzc01vZGUgeworICAgIGVudW0geworICAgICAgUmVnQmFzZSwKKyAgICAgIEZyYW1lSW5kZXhCYXNlCisgICAgfSBCYXNlVHlwZTsKKworICAgIHN0cnVjdCB7ICAgICAgICAgICAgLy8gVGhpcyBpcyByZWFsbHkgYSB1bmlvbiwgZGlzY3JpbWluYXRlZCBieSBCYXNlVHlwZSEKKyAgICAgIFNEVmFsdWUgUmVnOworICAgICAgaW50IEZyYW1lSW5kZXg7CisgICAgfSBCYXNlOworCisgICAgU0RWYWx1ZSBJbmRleFJlZzsKKyAgICBpbnQ2NF90IERpc3A7CisgICAgYm9vbCBpc1JJOworCisgICAgU3lzdGVtWlJSSUFkZHJlc3NNb2RlKGJvb2wgUkkgPSBmYWxzZSkKKyAgICAgIDogQmFzZVR5cGUoUmVnQmFzZSksIEluZGV4UmVnKCksIERpc3AoMCksIGlzUkkoUkkpIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoKSB7CisgICAgICBlcnJzKCkgPDwgIlN5c3RlbVpSUklBZGRyZXNzTW9kZSAiIDw8IHRoaXMgPDwgJ1xuJzsKKyAgICAgIGlmIChCYXNlVHlwZSA9PSBSZWdCYXNlKSB7CisgICAgICAgIGVycnMoKSA8PCAiQmFzZS5SZWcgIjsKKyAgICAgICAgaWYgKEJhc2UuUmVnLmdldE5vZGUoKSAhPSAwKQorICAgICAgICAgIEJhc2UuUmVnLmdldE5vZGUoKS0+ZHVtcCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgZXJycygpIDw8ICJudWwiOworICAgICAgICBlcnJzKCkgPDwgJ1xuJzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVycnMoKSA8PCAiIEJhc2UuRnJhbWVJbmRleCAiIDw8IEJhc2UuRnJhbWVJbmRleCA8PCAnXG4nOworICAgICAgfQorICAgICAgaWYgKCFpc1JJKSB7CisgICAgICAgIGVycnMoKSA8PCAiSW5kZXhSZWcgIjsKKyAgICAgICAgaWYgKEluZGV4UmVnLmdldE5vZGUoKSAhPSAwKSBJbmRleFJlZy5nZXROb2RlKCktPmR1bXAoKTsKKyAgICAgICAgZWxzZSBlcnJzKCkgPDwgIm51bCI7CisgICAgICB9CisgICAgICBlcnJzKCkgPDwgIiBEaXNwICIgPDwgRGlzcCA8PCAnXG4nOworICAgIH0KKyAgfTsKK30KKworLy8vIFN5c3RlbVpEQUdUb0RBR0lTZWwgLSBTeXN0ZW1aIHNwZWNpZmljIGNvZGUgdG8gc2VsZWN0IFN5c3RlbVogbWFjaGluZQorLy8vIGluc3RydWN0aW9ucyBmb3IgU2VsZWN0aW9uREFHIG9wZXJhdGlvbnMuCisvLy8KK25hbWVzcGFjZSB7CisgIGNsYXNzIFN5c3RlbVpEQUdUb0RBR0lTZWwgOiBwdWJsaWMgU2VsZWN0aW9uREFHSVNlbCB7CisgICAgY29uc3QgU3lzdGVtWlRhcmdldExvd2VyaW5nICZMb3dlcmluZzsKKyAgICBjb25zdCBTeXN0ZW1aU3VidGFyZ2V0ICZTdWJ0YXJnZXQ7CisKKyAgICB2b2lkIGdldEFkZHJlc3NPcGVyYW5kc1JJKGNvbnN0IFN5c3RlbVpSUklBZGRyZXNzTW9kZSAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmRGlzcCk7CisgICAgdm9pZCBnZXRBZGRyZXNzT3BlcmFuZHMoY29uc3QgU3lzdGVtWlJSSUFkZHJlc3NNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZEaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkluZGV4KTsKKworICBwdWJsaWM6CisgICAgU3lzdGVtWkRBR1RvREFHSVNlbChTeXN0ZW1aVGFyZ2V0TWFjaGluZSAmVE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKQorICAgICAgOiBTZWxlY3Rpb25EQUdJU2VsKFRNLCBPcHRMZXZlbCksCisgICAgICAgIExvd2VyaW5nKCpUTS5nZXRUYXJnZXRMb3dlcmluZygpKSwKKyAgICAgICAgU3VidGFyZ2V0KCpUTS5nZXRTdWJ0YXJnZXRJbXBsKCkpIHsgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiU3lzdGVtWiBEQUctPkRBRyBQYXR0ZXJuIEluc3RydWN0aW9uIFNlbGVjdGlvbiI7CisgICAgfQorCisgICAgLy8vIGdldEk4SW1tIC0gUmV0dXJuIGEgdGFyZ2V0IGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSwgb2YgdHlwZQorICAgIC8vLyBpOC4KKyAgICBpbmxpbmUgU0RWYWx1ZSBnZXRJOEltbSh1aW50NjRfdCBJbW0pIHsKKyAgICAgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEltbSwgTVZUOjppOCk7CisgICAgfQorCisgICAgLy8vIGdldEkxNkltbSAtIFJldHVybiBhIHRhcmdldCBjb25zdGFudCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUsIG9mIHR5cGUKKyAgICAvLy8gaTE2LgorICAgIGlubGluZSBTRFZhbHVlIGdldEkxNkltbSh1aW50NjRfdCBJbW0pIHsKKyAgICAgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEltbSwgTVZUOjppMTYpOworICAgIH0KKworICAgIC8vLyBnZXRJMzJJbW0gLSBSZXR1cm4gYSB0YXJnZXQgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLCBvZiB0eXBlCisgICAgLy8vIGkzMi4KKyAgICBpbmxpbmUgU0RWYWx1ZSBnZXRJMzJJbW0odWludDY0X3QgSW1tKSB7CisgICAgICByZXR1cm4gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChJbW0sIE1WVDo6aTMyKTsKKyAgICB9CisKKyAgICAvLyBJbmNsdWRlIHRoZSBwaWVjZXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSB0YXJnZXQgZGVzY3JpcHRpb24uCisgICAgI2luY2x1ZGUgIlN5c3RlbVpHZW5EQUdJU2VsLmluYyIKKworICBwcml2YXRlOgorICAgIGJvb2wgU2VsZWN0QWRkclJJMTJPbmx5KFNETm9kZSAqT3AsIFNEVmFsdWUmIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmRGlzcCk7CisgICAgYm9vbCBTZWxlY3RBZGRyUkkxMihTRE5vZGUgKk9wLCBTRFZhbHVlJiBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmRGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXMxMkJpdE9ubHkgPSBmYWxzZSk7CisgICAgYm9vbCBTZWxlY3RBZGRyUkkoU0ROb2RlICpPcCwgU0RWYWx1ZSYgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZEaXNwKTsKKyAgICBib29sIFNlbGVjdEFkZHJSUkkxMihTRE5vZGUgKk9wLCBTRFZhbHVlIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmRGlzcCwgU0RWYWx1ZSAmSW5kZXgpOworICAgIGJvb2wgU2VsZWN0QWRkclJSSTIwKFNETm9kZSAqT3AsIFNEVmFsdWUgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZEaXNwLCBTRFZhbHVlICZJbmRleCk7CisgICAgYm9vbCBTZWxlY3RMQUFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJkRpc3AsIFNEVmFsdWUgJkluZGV4KTsKKworICAgIFNETm9kZSAqU2VsZWN0KFNETm9kZSAqTm9kZSk7CisKKyAgICBib29sIFRyeUZvbGRMb2FkKFNETm9kZSAqUCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmRGlzcCwgU0RWYWx1ZSAmSW5kZXgpOworCisgICAgYm9vbCBNYXRjaEFkZHJlc3MoU0RWYWx1ZSBOLCBTeXN0ZW1aUlJJQWRkcmVzc01vZGUgJkFNLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXMxMkJpdCwgdW5zaWduZWQgRGVwdGggPSAwKTsKKyAgICBib29sIE1hdGNoQWRkcmVzc0Jhc2UoU0RWYWx1ZSBOLCBTeXN0ZW1aUlJJQWRkcmVzc01vZGUgJkFNKTsKKyAgICBib29sIE1hdGNoQWRkcmVzc1JJKFNEVmFsdWUgTiwgU3lzdGVtWlJSSUFkZHJlc3NNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXMxMkJpdCk7CisgIH07Cit9ICAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLy8gY3JlYXRlU3lzdGVtWklTZWxEYWcgLSBUaGlzIHBhc3MgY29udmVydHMgYSBsZWdhbGl6ZWQgREFHIGludG8gYQorLy8vIFN5c3RlbVotc3BlY2lmaWMgREFHLCByZWFkeSBmb3IgaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZy4KKy8vLworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVTeXN0ZW1aSVNlbERhZyhTeXN0ZW1aVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgcmV0dXJuIG5ldyBTeXN0ZW1aREFHVG9EQUdJU2VsKFRNLCBPcHRMZXZlbCk7Cit9CisKKy8vLyBpc0ltbVNFeHQyMCAtIFRoaXMgbWV0aG9kIHRlc3RzIHRvIHNlZSBpZiB0aGUgbm9kZSBpcyBlaXRoZXIgYSAzMi1iaXQKKy8vLyBvciA2NC1iaXQgaW1tZWRpYXRlLCBhbmQgaWYgdGhlIHZhbHVlIGNhbiBiZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkIGFzIGEKKy8vLyBzaWduIGV4dGVuc2lvbiBmcm9tIGEgMjAtYml0IHZhbHVlLiBJZiBzbywgdGhpcyByZXR1cm5zIHRydWUgYW5kIHRoZQorLy8vIGltbWVkaWF0ZS4KK3N0YXRpYyBib29sIGlzSW1tU0V4dDIwKGludDY0X3QgVmFsLCBpbnQ2NF90ICZJbW0pIHsKKyAgaWYgKFZhbCA+PSAtNTI0Mjg4ICYmIFZhbCA8PSA1MjQyODcpIHsKKyAgICBJbW0gPSBWYWw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNJbW1aRXh0MTIgLSBUaGlzIG1ldGhvZCB0ZXN0cyB0byBzZWUgaWYgdGhlIG5vZGUgaXMgZWl0aGVyIGEgMzItYml0CisvLy8gb3IgNjQtYml0IGltbWVkaWF0ZSwgYW5kIGlmIHRoZSB2YWx1ZSBjYW4gYmUgYWNjdXJhdGVseSByZXByZXNlbnRlZCBhcyBhCisvLy8gemVybyBleHRlbnNpb24gZnJvbSBhIDEyLWJpdCB2YWx1ZS4gSWYgc28sIHRoaXMgcmV0dXJucyB0cnVlIGFuZCB0aGUKKy8vLyBpbW1lZGlhdGUuCitzdGF0aWMgYm9vbCBpc0ltbVpFeHQxMihpbnQ2NF90IFZhbCwgaW50NjRfdCAmSW1tKSB7CisgIGlmIChWYWwgPj0gMCAmJiBWYWwgPD0gMHhGRkYpIHsKKyAgICBJbW0gPSBWYWw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gTWF0Y2hBZGRyZXNzIC0gQWRkIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3NpbmcgbW9kZSwKKy8vLyByZXR1cm5pbmcgdHJ1ZSBpZiBpdCBjYW5ub3QgYmUgZG9uZS4gIFRoaXMganVzdCBwYXR0ZXJuIG1hdGNoZXMgZm9yIHRoZQorLy8vIGFkZHJlc3NpbmcgbW9kZS4KK2Jvb2wgU3lzdGVtWkRBR1RvREFHSVNlbDo6TWF0Y2hBZGRyZXNzKFNEVmFsdWUgTiwgU3lzdGVtWlJSSUFkZHJlc3NNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXMxMkJpdCwgdW5zaWduZWQgRGVwdGgpIHsKKyAgRGVidWdMb2MgZGwgPSBOLmdldERlYnVnTG9jKCk7CisgIERFQlVHKGVycnMoKSA8PCAiTWF0Y2hBZGRyZXNzOiAiOyBBTS5kdW1wKCkpOworICAvLyBMaW1pdCByZWN1cnNpb24uCisgIGlmIChEZXB0aCA+IDUpCisgICAgcmV0dXJuIE1hdGNoQWRkcmVzc0Jhc2UoTiwgQU0pOworCisgIC8vIEZJWE1FOiBXZSBjYW4gcGVyZm9ybSBiZXR0ZXIgaGVyZS4gSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZQorICAvLyAoc2hpZnQgKGFkZCBBLCBpbW0pLCBOKSwgd2UgY2FuIHRyeSB0byByZWFzc29jaWF0ZSBzdHVmZiBhbmQgZm9sZCBzaGlmdCBvZgorICAvLyBpbW0gaW50byBhZGRyZXNzaW5nIG1vZGUuCisgIHN3aXRjaCAoTi5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6OkNvbnN0YW50OiB7CisgICAgaW50NjRfdCBWYWwgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOKS0+Z2V0U0V4dFZhbHVlKCk7CisgICAgaW50NjRfdCBJbW0gPSAwOworICAgIGJvb2wgTWF0Y2ggPSAoaXMxMkJpdCA/CisgICAgICAgICAgICAgICAgICBpc0ltbVpFeHQxMihBTS5EaXNwICsgVmFsLCBJbW0pIDoKKyAgICAgICAgICAgICAgICAgIGlzSW1tU0V4dDIwKEFNLkRpc3AgKyBWYWwsIEltbSkpOworICAgIGlmIChNYXRjaCkgeworICAgICAgQU0uRGlzcCA9IEltbTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIElTRDo6RnJhbWVJbmRleDoKKyAgICBpZiAoQU0uQmFzZVR5cGUgPT0gU3lzdGVtWlJSSUFkZHJlc3NNb2RlOjpSZWdCYXNlICYmCisgICAgICAgIEFNLkJhc2UuUmVnLmdldE5vZGUoKSA9PSAwKSB7CisgICAgICBBTS5CYXNlVHlwZSA9IFN5c3RlbVpSUklBZGRyZXNzTW9kZTo6RnJhbWVJbmRleEJhc2U7CisgICAgICBBTS5CYXNlLkZyYW1lSW5kZXggPSBjYXN0PEZyYW1lSW5kZXhTRE5vZGU+KE4pLT5nZXRJbmRleCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIElTRDo6U1VCOiB7CisgICAgLy8gR2l2ZW4gQS1CLCBpZiBBIGNhbiBiZSBjb21wbGV0ZWx5IGZvbGRlZCBpbnRvIHRoZSBhZGRyZXNzIGFuZAorICAgIC8vIHRoZSBpbmRleCBmaWVsZCB3aXRoIHRoZSBpbmRleCBmaWVsZCB1bnVzZWQsIHVzZSAtQiBhcyB0aGUgaW5kZXguCisgICAgLy8gVGhpcyBpcyBhIHdpbiBpZiBhIGhhcyBtdWx0aXBsZSBwYXJ0cyB0aGF0IGNhbiBiZSBmb2xkZWQgaW50bworICAgIC8vIHRoZSBhZGRyZXNzLiBBbHNvLCB0aGlzIHNhdmVzIGEgbW92IGlmIHRoZSBiYXNlIHJlZ2lzdGVyIGhhcworICAgIC8vIG90aGVyIHVzZXMsIHNpbmNlIGl0IGF2b2lkcyBhIHR3by1hZGRyZXNzIHN1YiBpbnN0cnVjdGlvbiwgaG93ZXZlcgorICAgIC8vIGl0IGNvc3RzIGFuIGFkZGl0aW9uYWwgbW92IGlmIHRoZSBpbmRleCByZWdpc3RlciBoYXMgb3RoZXIgdXNlcy4KKworICAgIC8vIFRlc3QgaWYgdGhlIExIUyBvZiB0aGUgc3ViIGNhbiBiZSBmb2xkZWQuCisgICAgU3lzdGVtWlJSSUFkZHJlc3NNb2RlIEJhY2t1cCA9IEFNOworICAgIGlmIChNYXRjaEFkZHJlc3MoTi5nZXROb2RlKCktPmdldE9wZXJhbmQoMCksIEFNLCBpczEyQml0LCBEZXB0aCsxKSkgeworICAgICAgQU0gPSBCYWNrdXA7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gVGVzdCBpZiB0aGUgaW5kZXggZmllbGQgaXMgZnJlZSBmb3IgdXNlLgorICAgIGlmIChBTS5JbmRleFJlZy5nZXROb2RlKCkgfHwgQU0uaXNSSSkgeworICAgICAgQU0gPSBCYWNrdXA7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgYmFzZSBpcyBhIHJlZ2lzdGVyIHdpdGggbXVsdGlwbGUgdXNlcywgdGhpcyB0cmFuc2Zvcm1hdGlvbiBtYXkKKyAgICAvLyBzYXZlIGEgbW92LiBPdGhlcndpc2UgaXQncyBwcm9iYWJseSBiZXR0ZXIgbm90IHRvIGRvIGl0LgorICAgIGlmIChBTS5CYXNlVHlwZSA9PSBTeXN0ZW1aUlJJQWRkcmVzc01vZGU6OlJlZ0Jhc2UgJiYKKyAgICAgICAgKCFBTS5CYXNlLlJlZy5nZXROb2RlKCkgfHwgQU0uQmFzZS5SZWcuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkpIHsKKyAgICAgIEFNID0gQmFja3VwOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gT2ssIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBsZWdhbCBhbmQgYXBwZWFycyBwcm9maXRhYmxlLiBHbyBmb3IgaXQuCisgICAgU0RWYWx1ZSBSSFMgPSBOLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBTRFZhbHVlIFplcm8gPSBDdXJEQUctPmdldENvbnN0YW50KDAsIE4uZ2V0VmFsdWVUeXBlKCkpOworICAgIFNEVmFsdWUgTmVnID0gQ3VyREFHLT5nZXROb2RlKElTRDo6U1VCLCBkbCwgTi5nZXRWYWx1ZVR5cGUoKSwgWmVybywgUkhTKTsKKyAgICBBTS5JbmRleFJlZyA9IE5lZzsKKworICAgIC8vIEluc2VydCB0aGUgbmV3IG5vZGVzIGludG8gdGhlIHRvcG9sb2dpY2FsIG9yZGVyaW5nLgorICAgIGlmIChaZXJvLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPT0gLTEgfHwKKyAgICAgICAgWmVyby5nZXROb2RlKCktPmdldE5vZGVJZCgpID4gTi5nZXROb2RlKCktPmdldE5vZGVJZCgpKSB7CisgICAgICBDdXJEQUctPlJlcG9zaXRpb25Ob2RlKE4uZ2V0Tm9kZSgpLCBaZXJvLmdldE5vZGUoKSk7CisgICAgICBaZXJvLmdldE5vZGUoKS0+c2V0Tm9kZUlkKE4uZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSk7CisgICAgfQorICAgIGlmIChOZWcuZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSA9PSAtMSB8fAorICAgICAgICBOZWcuZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSA+IE4uZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSkgeworICAgICAgQ3VyREFHLT5SZXBvc2l0aW9uTm9kZShOLmdldE5vZGUoKSwgTmVnLmdldE5vZGUoKSk7CisgICAgICBOZWcuZ2V0Tm9kZSgpLT5zZXROb2RlSWQoTi5nZXROb2RlKCktPmdldE5vZGVJZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY2FzZSBJU0Q6OkFERDogeworICAgIFN5c3RlbVpSUklBZGRyZXNzTW9kZSBCYWNrdXAgPSBBTTsKKyAgICBpZiAoIU1hdGNoQWRkcmVzcyhOLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKSwgQU0sIGlzMTJCaXQsIERlcHRoKzEpICYmCisgICAgICAgICFNYXRjaEFkZHJlc3MoTi5nZXROb2RlKCktPmdldE9wZXJhbmQoMSksIEFNLCBpczEyQml0LCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBBTSA9IEJhY2t1cDsKKyAgICBpZiAoIU1hdGNoQWRkcmVzcyhOLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgxKSwgQU0sIGlzMTJCaXQsIERlcHRoKzEpICYmCisgICAgICAgICFNYXRjaEFkZHJlc3MoTi5nZXROb2RlKCktPmdldE9wZXJhbmQoMCksIEFNLCBpczEyQml0LCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBBTSA9IEJhY2t1cDsKKworICAgIC8vIElmIHdlIGNvdWxkbid0IGZvbGQgYm90aCBvcGVyYW5kcyBpbnRvIHRoZSBhZGRyZXNzIGF0IHRoZSBzYW1lIHRpbWUsCisgICAgLy8gc2VlIGlmIHdlIGNhbiBqdXN0IHB1dCBlYWNoIG9wZXJhbmQgaW50byBhIHJlZ2lzdGVyIGFuZCBmb2xkIGF0IGxlYXN0CisgICAgLy8gdGhlIGFkZC4KKyAgICBpZiAoIUFNLmlzUkkgJiYKKyAgICAgICAgQU0uQmFzZVR5cGUgPT0gU3lzdGVtWlJSSUFkZHJlc3NNb2RlOjpSZWdCYXNlICYmCisgICAgICAgICFBTS5CYXNlLlJlZy5nZXROb2RlKCkgJiYgIUFNLkluZGV4UmVnLmdldE5vZGUoKSkgeworICAgICAgQU0uQmFzZS5SZWcgPSBOLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIEFNLkluZGV4UmVnID0gTi5nZXROb2RlKCktPmdldE9wZXJhbmQoMSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBJU0Q6Ok9SOgorICAgIC8vIEhhbmRsZSAiWCB8IEMiIGFzICJYICsgQyIgaWZmIFggaXMga25vd24gdG8gaGF2ZSBDIGJpdHMgY2xlYXIuCisgICAgaWYgKENvbnN0YW50U0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBTeXN0ZW1aUlJJQWRkcmVzc01vZGUgQmFja3VwID0gQU07CisgICAgICBpbnQ2NF90IE9mZnNldCA9IENOLT5nZXRTRXh0VmFsdWUoKTsKKyAgICAgIGludDY0X3QgSW1tID0gMDsKKyAgICAgIGJvb2wgTWF0Y2hPZmZzZXQgPSAoaXMxMkJpdCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW1tWkV4dDEyKEFNLkRpc3AgKyBPZmZzZXQsIEltbSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ltbVNFeHQyMChBTS5EaXNwICsgT2Zmc2V0LCBJbW0pKTsKKyAgICAgIC8vIFRoZSByZXN1bHRhbnQgZGlzcCBtdXN0IGZpdCBpbiAxMiBvciAyMC1iaXRzLgorICAgICAgaWYgKE1hdGNoT2Zmc2V0ICYmCisgICAgICAgICAgLy8gTEhTIHNob3VsZCBiZSBhbiBhZGRyIG1vZGUuCisgICAgICAgICAgIU1hdGNoQWRkcmVzcyhOLmdldE9wZXJhbmQoMCksIEFNLCBpczEyQml0LCBEZXB0aCsxKSAmJgorICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgTEhTICYgQyBpcyB6ZXJvLgorICAgICAgICAgIEN1ckRBRy0+TWFza2VkVmFsdWVJc1plcm8oTi5nZXRPcGVyYW5kKDApLCBDTi0+Z2V0QVBJbnRWYWx1ZSgpKSkgeworICAgICAgICBBTS5EaXNwID0gSW1tOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBBTSA9IEJhY2t1cDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gTWF0Y2hBZGRyZXNzQmFzZShOLCBBTSk7Cit9CisKKy8vLyBNYXRjaEFkZHJlc3NCYXNlIC0gSGVscGVyIGZvciBNYXRjaEFkZHJlc3MuIEFkZCB0aGUgc3BlY2lmaWVkIG5vZGUgdG8gdGhlCisvLy8gc3BlY2lmaWVkIGFkZHJlc3NpbmcgbW9kZSB3aXRob3V0IGFueSBmdXJ0aGVyIHJlY3Vyc2lvbi4KK2Jvb2wgU3lzdGVtWkRBR1RvREFHSVNlbDo6TWF0Y2hBZGRyZXNzQmFzZShTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtWlJSSUFkZHJlc3NNb2RlICZBTSkgeworICAvLyBJcyB0aGUgYmFzZSByZWdpc3RlciBhbHJlYWR5IG9jY3VwaWVkPworICBpZiAoQU0uQmFzZVR5cGUgIT0gU3lzdGVtWlJSSUFkZHJlc3NNb2RlOjpSZWdCYXNlIHx8IEFNLkJhc2UuUmVnLmdldE5vZGUoKSkgeworICAgIC8vIElmIHNvLCBjaGVjayB0byBzZWUgaWYgdGhlIGluZGV4IHJlZ2lzdGVyIGlzIHNldC4KKyAgICBpZiAoQU0uSW5kZXhSZWcuZ2V0Tm9kZSgpID09IDAgJiYgIUFNLmlzUkkpIHsKKyAgICAgIEFNLkluZGV4UmVnID0gTjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlIGNhbm5vdCBzZWxlY3QgaXQuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBEZWZhdWx0LCBnZW5lcmF0ZSBpdCBhcyBhIHJlZ2lzdGVyLgorICBBTS5CYXNlVHlwZSA9IFN5c3RlbVpSUklBZGRyZXNzTW9kZTo6UmVnQmFzZTsKKyAgQU0uQmFzZS5SZWcgPSBOOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU3lzdGVtWkRBR1RvREFHSVNlbDo6Z2V0QWRkcmVzc09wZXJhbmRzUkkoY29uc3QgU3lzdGVtWlJSSUFkZHJlc3NNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmRGlzcCkgeworICBpZiAoQU0uQmFzZVR5cGUgPT0gU3lzdGVtWlJSSUFkZHJlc3NNb2RlOjpSZWdCYXNlKQorICAgIEJhc2UgPSBBTS5CYXNlLlJlZzsKKyAgZWxzZQorICAgIEJhc2UgPSBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoQU0uQmFzZS5GcmFtZUluZGV4LCBUTEkuZ2V0UG9pbnRlclR5KCkpOworICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBTS5EaXNwLCBNVlQ6Omk2NCk7Cit9CisKK3ZvaWQgU3lzdGVtWkRBR1RvREFHSVNlbDo6Z2V0QWRkcmVzc09wZXJhbmRzKGNvbnN0IFN5c3RlbVpSUklBZGRyZXNzTW9kZSAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZEaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSW5kZXgpIHsKKyAgZ2V0QWRkcmVzc09wZXJhbmRzUkkoQU0sIEJhc2UsIERpc3ApOworICBJbmRleCA9IEFNLkluZGV4UmVnOworfQorCisvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGNhbiBiZSByZXByZXNlbnRlZCBieSBhIGJhc2UgcmVnaXN0ZXIgcGx1cworLy8vIGFuIHVuc2lnbmVkIDEyLWJpdCBkaXNwbGFjZW1lbnQgW3IraW1tXS4KK2Jvb2wgU3lzdGVtWkRBR1RvREFHSVNlbDo6U2VsZWN0QWRkclJJMTJPbmx5KFNETm9kZSAqT3AsIFNEVmFsdWUmIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZEaXNwKSB7CisgIHJldHVybiBTZWxlY3RBZGRyUkkxMihPcCwgQWRkciwgQmFzZSwgRGlzcCwgLyppczEyQml0T25seSovdHJ1ZSk7Cit9CisKK2Jvb2wgU3lzdGVtWkRBR1RvREFHSVNlbDo6U2VsZWN0QWRkclJJMTIoU0ROb2RlICpPcCwgU0RWYWx1ZSYgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmRGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpczEyQml0T25seSkgeworICBTeXN0ZW1aUlJJQWRkcmVzc01vZGUgQU0yMCgvKmlzUkkqL3RydWUpLCBBTTEyKC8qaXNSSSovdHJ1ZSk7CisgIGJvb2wgRG9uZSA9IGZhbHNlOworCisgIGlmICghQWRkci5oYXNPbmVVc2UoKSkgeworICAgIHVuc2lnbmVkIE9wY29kZSA9IEFkZHIuZ2V0T3Bjb2RlKCk7CisgICAgaWYgKE9wY29kZSAhPSBJU0Q6OkNvbnN0YW50ICYmIE9wY29kZSAhPSBJU0Q6OkZyYW1lSW5kZXgpIHsKKyAgICAgIC8vIElmIHdlIGFyZSBhYmxlIHRvIGZvbGQgTiBpbnRvIGFkZHJlc3NpbmcgbW9kZSwgdGhlbiB3ZSdsbCBhbGxvdyBpdCBldmVuCisgICAgICAvLyBpZiBOIGhhcyBtdWx0aXBsZSB1c2VzLiBJbiBnZW5lcmFsLCBhZGRyZXNzaW5nIGNvbXB1dGF0aW9uIGlzIHVzZWQgYXMKKyAgICAgIC8vIGFkZHJlc3NlcyBieSBhbGwgb2YgaXRzIHVzZXMuIEJ1dCB3YXRjaCBvdXQgZm9yIENvcHlUb1JlZyB1c2VzLCB0aGF0CisgICAgICAvLyBtZWFucyB0aGUgYWRkcmVzcyBjb21wdXRhdGlvbiBpcyBsaXZlb3V0LiBJdCB3aWxsIGJlIGNvbXB1dGVkIGJ5IGEgTEEKKyAgICAgIC8vIHNvIHdlIHdhbnQgdG8gYXZvaWQgY29tcHV0aW5nIHRoZSBhZGRyZXNzIHR3aWNlLgorICAgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IEFkZHIuZ2V0Tm9kZSgpLT51c2VfYmVnaW4oKSwKKyAgICAgICAgICAgICBVRSA9IEFkZHIuZ2V0Tm9kZSgpLT51c2VfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgICAgIGlmIChVSS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb3B5VG9SZWcpIHsKKyAgICAgICAgICBNYXRjaEFkZHJlc3NCYXNlKEFkZHIsIEFNMTIpOworICAgICAgICAgIERvbmUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghRG9uZSAmJiBNYXRjaEFkZHJlc3MoQWRkciwgQU0xMiwgLyogaXMxMkJpdCAqLyB0cnVlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2hlY2ssIHdoZXRoZXIgd2UgY2FuIG1hdGNoIHN0dWZmIHVzaW5nIDIwLWJpdCBkaXNwbGFjZW1lbnRzCisgIGlmICghRG9uZSAmJiAhaXMxMkJpdE9ubHkgJiYKKyAgICAgICFNYXRjaEFkZHJlc3MoQWRkciwgQU0yMCwgLyogaXMxMkJpdCAqLyBmYWxzZSkpCisgICAgaWYgKEFNMTIuRGlzcCA9PSAwICYmIEFNMjAuRGlzcCAhPSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIERFQlVHKGVycnMoKSA8PCAiTWF0Y2hBZGRyZXNzIChmaW5hbCk6ICI7IEFNMTIuZHVtcCgpKTsKKworICBFVlQgVlQgPSBBZGRyLmdldFZhbHVlVHlwZSgpOworICBpZiAoQU0xMi5CYXNlVHlwZSA9PSBTeXN0ZW1aUlJJQWRkcmVzc01vZGU6OlJlZ0Jhc2UpIHsKKyAgICBpZiAoIUFNMTIuQmFzZS5SZWcuZ2V0Tm9kZSgpKQorICAgICAgQU0xMi5CYXNlLlJlZyA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgVlQpOworICB9CisKKyAgYXNzZXJ0KEFNMTIuSW5kZXhSZWcuZ2V0Tm9kZSgpID09IDAgJiYgIkludmFsaWQgcmVnLWltbSBhZGRyZXNzIG1vZGUhIik7CisKKyAgZ2V0QWRkcmVzc09wZXJhbmRzUkkoQU0xMiwgQmFzZSwgRGlzcCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IGEgYmFzZSByZWdpc3RlciBwbHVzCisvLy8gYSBzaWduZWQgMjAtYml0IGRpc3BsYWNlbWVudCBbcitpbW1dLgorYm9vbCBTeXN0ZW1aREFHVG9EQUdJU2VsOjpTZWxlY3RBZGRyUkkoU0ROb2RlICpPcCwgU0RWYWx1ZSYgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJkRpc3ApIHsKKyAgU3lzdGVtWlJSSUFkZHJlc3NNb2RlIEFNKC8qaXNSSSovdHJ1ZSk7CisgIGJvb2wgRG9uZSA9IGZhbHNlOworCisgIGlmICghQWRkci5oYXNPbmVVc2UoKSkgeworICAgIHVuc2lnbmVkIE9wY29kZSA9IEFkZHIuZ2V0T3Bjb2RlKCk7CisgICAgaWYgKE9wY29kZSAhPSBJU0Q6OkNvbnN0YW50ICYmIE9wY29kZSAhPSBJU0Q6OkZyYW1lSW5kZXgpIHsKKyAgICAgIC8vIElmIHdlIGFyZSBhYmxlIHRvIGZvbGQgTiBpbnRvIGFkZHJlc3NpbmcgbW9kZSwgdGhlbiB3ZSdsbCBhbGxvdyBpdCBldmVuCisgICAgICAvLyBpZiBOIGhhcyBtdWx0aXBsZSB1c2VzLiBJbiBnZW5lcmFsLCBhZGRyZXNzaW5nIGNvbXB1dGF0aW9uIGlzIHVzZWQgYXMKKyAgICAgIC8vIGFkZHJlc3NlcyBieSBhbGwgb2YgaXRzIHVzZXMuIEJ1dCB3YXRjaCBvdXQgZm9yIENvcHlUb1JlZyB1c2VzLCB0aGF0CisgICAgICAvLyBtZWFucyB0aGUgYWRkcmVzcyBjb21wdXRhdGlvbiBpcyBsaXZlb3V0LiBJdCB3aWxsIGJlIGNvbXB1dGVkIGJ5IGEgTEEKKyAgICAgIC8vIHNvIHdlIHdhbnQgdG8gYXZvaWQgY29tcHV0aW5nIHRoZSBhZGRyZXNzIHR3aWNlLgorICAgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IEFkZHIuZ2V0Tm9kZSgpLT51c2VfYmVnaW4oKSwKKyAgICAgICAgICAgICBVRSA9IEFkZHIuZ2V0Tm9kZSgpLT51c2VfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgICAgIGlmIChVSS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb3B5VG9SZWcpIHsKKyAgICAgICAgICBNYXRjaEFkZHJlc3NCYXNlKEFkZHIsIEFNKTsKKyAgICAgICAgICBEb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIURvbmUgJiYgTWF0Y2hBZGRyZXNzKEFkZHIsIEFNLCAvKiBpczEyQml0ICovIGZhbHNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgREVCVUcoZXJycygpIDw8ICJNYXRjaEFkZHJlc3MgKGZpbmFsKTogIjsgQU0uZHVtcCgpKTsKKworICBFVlQgVlQgPSBBZGRyLmdldFZhbHVlVHlwZSgpOworICBpZiAoQU0uQmFzZVR5cGUgPT0gU3lzdGVtWlJSSUFkZHJlc3NNb2RlOjpSZWdCYXNlKSB7CisgICAgaWYgKCFBTS5CYXNlLlJlZy5nZXROb2RlKCkpCisgICAgICBBTS5CYXNlLlJlZyA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgVlQpOworICB9CisKKyAgYXNzZXJ0KEFNLkluZGV4UmVnLmdldE5vZGUoKSA9PSAwICYmICJJbnZhbGlkIHJlZy1pbW0gYWRkcmVzcyBtb2RlISIpOworCisgIGdldEFkZHJlc3NPcGVyYW5kc1JJKEFNLCBCYXNlLCBEaXNwKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBiYXNlIHJlZ2lzdGVyIHBsdXMKKy8vLyBpbmRleCByZWdpc3RlciBwbHVzIGFuIHVuc2lnbmVkIDEyLWJpdCBkaXNwbGFjZW1lbnQgW2Jhc2UgKyBpZHggKyBpbW1dLgorYm9vbCBTeXN0ZW1aREFHVG9EQUdJU2VsOjpTZWxlY3RBZGRyUlJJMTIoU0ROb2RlICpPcCwgU0RWYWx1ZSBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZEaXNwLCBTRFZhbHVlICZJbmRleCkgeworICBTeXN0ZW1aUlJJQWRkcmVzc01vZGUgQU0yMCwgQU0xMjsKKyAgYm9vbCBEb25lID0gZmFsc2U7CisKKyAgaWYgKCFBZGRyLmhhc09uZVVzZSgpKSB7CisgICAgdW5zaWduZWQgT3Bjb2RlID0gQWRkci5nZXRPcGNvZGUoKTsKKyAgICBpZiAoT3Bjb2RlICE9IElTRDo6Q29uc3RhbnQgJiYgT3Bjb2RlICE9IElTRDo6RnJhbWVJbmRleCkgeworICAgICAgLy8gSWYgd2UgYXJlIGFibGUgdG8gZm9sZCBOIGludG8gYWRkcmVzc2luZyBtb2RlLCB0aGVuIHdlJ2xsIGFsbG93IGl0IGV2ZW4KKyAgICAgIC8vIGlmIE4gaGFzIG11bHRpcGxlIHVzZXMuIEluIGdlbmVyYWwsIGFkZHJlc3NpbmcgY29tcHV0YXRpb24gaXMgdXNlZCBhcworICAgICAgLy8gYWRkcmVzc2VzIGJ5IGFsbCBvZiBpdHMgdXNlcy4gQnV0IHdhdGNoIG91dCBmb3IgQ29weVRvUmVnIHVzZXMsIHRoYXQKKyAgICAgIC8vIG1lYW5zIHRoZSBhZGRyZXNzIGNvbXB1dGF0aW9uIGlzIGxpdmVvdXQuIEl0IHdpbGwgYmUgY29tcHV0ZWQgYnkgYSBMQQorICAgICAgLy8gc28gd2Ugd2FudCB0byBhdm9pZCBjb21wdXRpbmcgdGhlIGFkZHJlc3MgdHdpY2UuCisgICAgICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIFVJID0gQWRkci5nZXROb2RlKCktPnVzZV9iZWdpbigpLAorICAgICAgICAgICAgIFVFID0gQWRkci5nZXROb2RlKCktPnVzZV9lbmQoKTsgVUkgIT0gVUU7ICsrVUkpIHsKKyAgICAgICAgaWYgKFVJLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvcHlUb1JlZykgeworICAgICAgICAgIE1hdGNoQWRkcmVzc0Jhc2UoQWRkciwgQU0xMik7CisgICAgICAgICAgRG9uZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFEb25lICYmIE1hdGNoQWRkcmVzcyhBZGRyLCBBTTEyLCAvKiBpczEyQml0ICovIHRydWUpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBDaGVjaywgd2hldGhlciB3ZSBjYW4gbWF0Y2ggc3R1ZmYgdXNpbmcgMjAtYml0IGRpc3BsYWNlbWVudHMKKyAgaWYgKCFEb25lICYmICFNYXRjaEFkZHJlc3MoQWRkciwgQU0yMCwgLyogaXMxMkJpdCAqLyBmYWxzZSkpCisgICAgaWYgKEFNMTIuRGlzcCA9PSAwICYmIEFNMjAuRGlzcCAhPSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIERFQlVHKGVycnMoKSA8PCAiTWF0Y2hBZGRyZXNzIChmaW5hbCk6ICI7IEFNMTIuZHVtcCgpKTsKKworICBFVlQgVlQgPSBBZGRyLmdldFZhbHVlVHlwZSgpOworICBpZiAoQU0xMi5CYXNlVHlwZSA9PSBTeXN0ZW1aUlJJQWRkcmVzc01vZGU6OlJlZ0Jhc2UpIHsKKyAgICBpZiAoIUFNMTIuQmFzZS5SZWcuZ2V0Tm9kZSgpKQorICAgICAgQU0xMi5CYXNlLlJlZyA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgVlQpOworICB9CisKKyAgaWYgKCFBTTEyLkluZGV4UmVnLmdldE5vZGUoKSkKKyAgICBBTTEyLkluZGV4UmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBWVCk7CisKKyAgZ2V0QWRkcmVzc09wZXJhbmRzKEFNMTIsIEJhc2UsIERpc3AsIEluZGV4KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBiYXNlIHJlZ2lzdGVyIHBsdXMKKy8vLyBpbmRleCByZWdpc3RlciBwbHVzIGEgc2lnbmVkIDIwLWJpdCBkaXNwbGFjZW1lbnQgW2Jhc2UgKyBpZHggKyBpbW1dLgorYm9vbCBTeXN0ZW1aREFHVG9EQUdJU2VsOjpTZWxlY3RBZGRyUlJJMjAoU0ROb2RlICpPcCwgU0RWYWx1ZSBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZEaXNwLCBTRFZhbHVlICZJbmRleCkgeworICBTeXN0ZW1aUlJJQWRkcmVzc01vZGUgQU07CisgIGJvb2wgRG9uZSA9IGZhbHNlOworCisgIGlmICghQWRkci5oYXNPbmVVc2UoKSkgeworICAgIHVuc2lnbmVkIE9wY29kZSA9IEFkZHIuZ2V0T3Bjb2RlKCk7CisgICAgaWYgKE9wY29kZSAhPSBJU0Q6OkNvbnN0YW50ICYmIE9wY29kZSAhPSBJU0Q6OkZyYW1lSW5kZXgpIHsKKyAgICAgIC8vIElmIHdlIGFyZSBhYmxlIHRvIGZvbGQgTiBpbnRvIGFkZHJlc3NpbmcgbW9kZSwgdGhlbiB3ZSdsbCBhbGxvdyBpdCBldmVuCisgICAgICAvLyBpZiBOIGhhcyBtdWx0aXBsZSB1c2VzLiBJbiBnZW5lcmFsLCBhZGRyZXNzaW5nIGNvbXB1dGF0aW9uIGlzIHVzZWQgYXMKKyAgICAgIC8vIGFkZHJlc3NlcyBieSBhbGwgb2YgaXRzIHVzZXMuIEJ1dCB3YXRjaCBvdXQgZm9yIENvcHlUb1JlZyB1c2VzLCB0aGF0CisgICAgICAvLyBtZWFucyB0aGUgYWRkcmVzcyBjb21wdXRhdGlvbiBpcyBsaXZlb3V0LiBJdCB3aWxsIGJlIGNvbXB1dGVkIGJ5IGEgTEEKKyAgICAgIC8vIHNvIHdlIHdhbnQgdG8gYXZvaWQgY29tcHV0aW5nIHRoZSBhZGRyZXNzIHR3aWNlLgorICAgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IEFkZHIuZ2V0Tm9kZSgpLT51c2VfYmVnaW4oKSwKKyAgICAgICAgICAgICBVRSA9IEFkZHIuZ2V0Tm9kZSgpLT51c2VfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgICAgIGlmIChVSS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb3B5VG9SZWcpIHsKKyAgICAgICAgICBNYXRjaEFkZHJlc3NCYXNlKEFkZHIsIEFNKTsKKyAgICAgICAgICBEb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIURvbmUgJiYgTWF0Y2hBZGRyZXNzKEFkZHIsIEFNLCAvKiBpczEyQml0ICovIGZhbHNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgREVCVUcoZXJycygpIDw8ICJNYXRjaEFkZHJlc3MgKGZpbmFsKTogIjsgQU0uZHVtcCgpKTsKKworICBFVlQgVlQgPSBBZGRyLmdldFZhbHVlVHlwZSgpOworICBpZiAoQU0uQmFzZVR5cGUgPT0gU3lzdGVtWlJSSUFkZHJlc3NNb2RlOjpSZWdCYXNlKSB7CisgICAgaWYgKCFBTS5CYXNlLlJlZy5nZXROb2RlKCkpCisgICAgICBBTS5CYXNlLlJlZyA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgVlQpOworICB9CisKKyAgaWYgKCFBTS5JbmRleFJlZy5nZXROb2RlKCkpCisgICAgQU0uSW5kZXhSZWcgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIFZUKTsKKworICBnZXRBZGRyZXNzT3BlcmFuZHMoQU0sIEJhc2UsIERpc3AsIEluZGV4KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFNlbGVjdExBQWRkciAtIGl0IGNhbGxzIFNlbGVjdEFkZHIgYW5kIGRldGVybWluZXMgaWYgdGhlIG1heGltYWwgYWRkcmVzc2luZworLy8vIG1vZGUgaXQgbWF0Y2hlcyBjYW4gYmUgY29zdCBlZmZlY3RpdmVseSBlbWl0dGVkIGFzIGFuIExBL0xBWSBpbnN0cnVjdGlvbi4KK2Jvb2wgU3lzdGVtWkRBR1RvREFHSVNlbDo6U2VsZWN0TEFBZGRyKFNETm9kZSAqT3AsIFNEVmFsdWUgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZEaXNwLCBTRFZhbHVlICZJbmRleCkgeworICBTeXN0ZW1aUlJJQWRkcmVzc01vZGUgQU07CisKKyAgaWYgKE1hdGNoQWRkcmVzcyhBZGRyLCBBTSwgZmFsc2UpKQorICAgIHJldHVybiBmYWxzZTsKKworICBFVlQgVlQgPSBBZGRyLmdldFZhbHVlVHlwZSgpOworICB1bnNpZ25lZCBDb21wbGV4aXR5ID0gMDsKKyAgaWYgKEFNLkJhc2VUeXBlID09IFN5c3RlbVpSUklBZGRyZXNzTW9kZTo6UmVnQmFzZSkKKyAgICBpZiAoQU0uQmFzZS5SZWcuZ2V0Tm9kZSgpKQorICAgICAgQ29tcGxleGl0eSA9IDE7CisgICAgZWxzZQorICAgICAgQU0uQmFzZS5SZWcgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIFZUKTsKKyAgZWxzZSBpZiAoQU0uQmFzZVR5cGUgPT0gU3lzdGVtWlJSSUFkZHJlc3NNb2RlOjpGcmFtZUluZGV4QmFzZSkKKyAgICBDb21wbGV4aXR5ID0gNDsKKworICBpZiAoQU0uSW5kZXhSZWcuZ2V0Tm9kZSgpKQorICAgIENvbXBsZXhpdHkgKz0gMTsKKyAgZWxzZQorICAgIEFNLkluZGV4UmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBWVCk7CisKKyAgaWYgKEFNLkRpc3AgJiYgKEFNLkJhc2UuUmVnLmdldE5vZGUoKSB8fCBBTS5JbmRleFJlZy5nZXROb2RlKCkpKQorICAgIENvbXBsZXhpdHkgKz0gMTsKKworICBpZiAoQ29tcGxleGl0eSA+IDIpIHsKKyAgICBnZXRBZGRyZXNzT3BlcmFuZHMoQU0sIEJhc2UsIERpc3AsIEluZGV4KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTeXN0ZW1aREFHVG9EQUdJU2VsOjpUcnlGb2xkTG9hZChTRE5vZGUgKlAsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJkRpc3AsIFNEVmFsdWUgJkluZGV4KSB7CisgIGlmIChJU0Q6OmlzTk9OX0VYVExvYWQoTi5nZXROb2RlKCkpICYmCisgICAgICBJc0xlZ2FsVG9Gb2xkKE4sIFAsIFAsIE9wdExldmVsKSkKKyAgICByZXR1cm4gU2VsZWN0QWRkclJSSTIwKFAsIE4uZ2V0T3BlcmFuZCgxKSwgQmFzZSwgRGlzcCwgSW5kZXgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK1NETm9kZSAqU3lzdGVtWkRBR1RvREFHSVNlbDo6U2VsZWN0KFNETm9kZSAqTm9kZSkgeworICBFVlQgTlZUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICBEZWJ1Z0xvYyBkbCA9IE5vZGUtPmdldERlYnVnTG9jKCk7CisgIHVuc2lnbmVkIE9wY29kZSA9IE5vZGUtPmdldE9wY29kZSgpOworCisgIC8vIER1bXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE5vZGUgYmVpbmcgc2VsZWN0ZWQKKyAgREVCVUcoZXJycygpIDw8ICJTZWxlY3Rpbmc6ICI7IE5vZGUtPmR1bXAoQ3VyREFHKTsgZXJycygpIDw8ICJcbiIpOworCisgIC8vIElmIHdlIGhhdmUgYSBjdXN0b20gbm9kZSwgd2UgYWxyZWFkeSBoYXZlIHNlbGVjdGVkIQorICBpZiAoTm9kZS0+aXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICBERUJVRyhlcnJzKCkgPDwgIj09ICI7IE5vZGUtPmR1bXAoQ3VyREFHKTsgZXJycygpIDw8ICJcbiIpOworICAgIHJldHVybiBOVUxMOyAvLyBBbHJlYWR5IHNlbGVjdGVkLgorICB9CisKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpTRElWUkVNOiB7CisgICAgdW5zaWduZWQgT3BjLCBNT3BjOworICAgIFNEVmFsdWUgTjAgPSBOb2RlLT5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgTjEgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworCisgICAgRVZUIFJlc1ZUOworICAgIGJvb2wgaXMzMkJpdCA9IGZhbHNlOworICAgIHN3aXRjaCAoTlZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5zdXBwb3J0ZWQgVlQhIik7CisgICAgY2FzZSBNVlQ6OmkzMjoKKyAgICAgIE9wYyA9IFN5c3RlbVo6OlNESVZSRU0zMnI7IE1PcGMgPSBTeXN0ZW1aOjpTRElWUkVNMzJtOworICAgICAgUmVzVlQgPSBNVlQ6OnYyaTY0OworICAgICAgaXMzMkJpdCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1WVDo6aTY0OgorICAgICAgT3BjID0gU3lzdGVtWjo6U0RJVlJFTTY0cjsgTU9wYyA9IFN5c3RlbVo6OlNESVZSRU02NG07CisgICAgICBSZXNWVCA9IE1WVDo6djJpNjQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBTRFZhbHVlIFRtcDAsIFRtcDEsIFRtcDI7CisgICAgYm9vbCBmb2xkZWRMb2FkID0gVHJ5Rm9sZExvYWQoTm9kZSwgTjEsIFRtcDAsIFRtcDEsIFRtcDIpOworCisgICAgLy8gUHJlcGFyZSB0aGUgZGl2aWRlbmQKKyAgICBTRE5vZGUgKkRpdmlkZW5kOworICAgIGlmIChpczMyQml0KQorICAgICAgRGl2aWRlbmQgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFN5c3RlbVo6Ok1PVlNYNjRycjMyLCBkbCwgTVZUOjppNjQsIE4wKTsKKyAgICBlbHNlCisgICAgICBEaXZpZGVuZCA9IE4wLmdldE5vZGUoKTsKKworICAgIC8vIEluc2VydCBwcmVwYXJlZCBkaXZpZGVuZCBpbnRvIHN1aXRhYmxlICdzdWJyZWcnCisgICAgU0ROb2RlICpUbXAgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCwgUmVzVlQpOworICAgIERpdmlkZW5kID0KKyAgICAgIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpJTlNFUlRfU1VCUkVHLCBkbCwgUmVzVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVG1wLCAwKSwgU0RWYWx1ZShEaXZpZGVuZCwgMCksCisgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KFN5c3RlbVo6OnN1YnJlZ19vZGQsIE1WVDo6aTMyKSk7CisKKyAgICBTRE5vZGUgKlJlc3VsdDsKKyAgICBTRFZhbHVlIERpdlZhbCA9IFNEVmFsdWUoRGl2aWRlbmQsIDApOworICAgIGlmIChmb2xkZWRMb2FkKSB7CisgICAgICBTRFZhbHVlIE9wc1tdID0geyBEaXZWYWwsIFRtcDAsIFRtcDEsIFRtcDIsIE4xLmdldE9wZXJhbmQoMCkgfTsKKyAgICAgIFJlc3VsdCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoTU9wYywgZGwsIFJlc1ZULCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsIGFycmF5X2xlbmd0aG9mKE9wcykpOworICAgICAgLy8gVXBkYXRlIHRoZSBjaGFpbi4KKyAgICAgIFJlcGxhY2VVc2VzKE4xLmdldFZhbHVlKDEpLCBTRFZhbHVlKFJlc3VsdCwgMSkpOworICAgIH0gZWxzZSB7CisgICAgICBSZXN1bHQgPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE9wYywgZGwsIFJlc1ZULCBTRFZhbHVlKERpdmlkZW5kLCAwKSwgTjEpOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGRpdmlzaW9uIChvZGQgc3VicmVnKSByZXN1bHQsIGlmIGl0IGlzIG5lZWRlZC4KKyAgICBpZiAoIVNEVmFsdWUoTm9kZSwgMCkudXNlX2VtcHR5KCkpIHsKKyAgICAgIHVuc2lnbmVkIFN1YlJlZ0lkeCA9IChpczMyQml0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1aOjpzdWJyZWdfb2RkMzIgOiBTeXN0ZW1aOjpzdWJyZWdfb2RkKTsKKyAgICAgIFNETm9kZSAqRGl2ID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OkVYVFJBQ1RfU1VCUkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBOVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShSZXN1bHQsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoU3ViUmVnSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpKTsKKworICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOb2RlLCAwKSwgU0RWYWx1ZShEaXYsIDApKTsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiPT4gIjsgUmVzdWx0LT5kdW1wKEN1ckRBRyk7IGVycnMoKSA8PCAiXG4iKTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSByZW1haW5kZXIgKGV2ZW4gc3VicmVnKSByZXN1bHQsIGlmIGl0IGlzIG5lZWRlZC4KKyAgICBpZiAoIVNEVmFsdWUoTm9kZSwgMSkudXNlX2VtcHR5KCkpIHsKKyAgICAgIHVuc2lnbmVkIFN1YlJlZ0lkeCA9IChpczMyQml0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1aOjpzdWJyZWdfMzJiaXQgOiBTeXN0ZW1aOjpzdWJyZWdfZXZlbik7CisgICAgICBTRE5vZGUgKlJlbSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpFWFRSQUNUX1NVQlJFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCwgTlZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoUmVzdWx0LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KFN1YlJlZ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTMyKSk7CisKKyAgICAgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTm9kZSwgMSksIFNEVmFsdWUoUmVtLCAwKSk7CisgICAgICBERUJVRyhlcnJzKCkgPDwgIj0+ICI7IFJlc3VsdC0+ZHVtcChDdXJEQUcpOyBlcnJzKCkgPDwgIlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY2FzZSBJU0Q6OlVESVZSRU06IHsKKyAgICB1bnNpZ25lZCBPcGMsIE1PcGMsIENsck9wYzsKKyAgICBTRFZhbHVlIE4wID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIE4xID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBFVlQgUmVzVlQ7CisKKyAgICBib29sIGlzMzJCaXQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKE5WVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVuc3VwcG9ydGVkIFZUISIpOworICAgIGNhc2UgTVZUOjppMzI6CisgICAgICBPcGMgPSBTeXN0ZW1aOjpVRElWUkVNMzJyOyBNT3BjID0gU3lzdGVtWjo6VURJVlJFTTMybTsKKyAgICAgIENsck9wYyA9IFN5c3RlbVo6Ok1PVjY0UHIwX2V2ZW47CisgICAgICBSZXNWVCA9IE1WVDo6djJpMzI7CisgICAgICBpczMyQml0ID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVZUOjppNjQ6CisgICAgICBPcGMgPSBTeXN0ZW1aOjpVRElWUkVNNjRyOyBNT3BjID0gU3lzdGVtWjo6VURJVlJFTTY0bTsKKyAgICAgIENsck9wYyA9IFN5c3RlbVo6Ok1PVjEyOHIwX2V2ZW47CisgICAgICBSZXNWVCA9IE1WVDo6djJpNjQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBTRFZhbHVlIFRtcDAsIFRtcDEsIFRtcDI7CisgICAgYm9vbCBmb2xkZWRMb2FkID0gVHJ5Rm9sZExvYWQoTm9kZSwgTjEsIFRtcDAsIFRtcDEsIFRtcDIpOworCisgICAgLy8gUHJlcGFyZSB0aGUgZGl2aWRlbmQKKyAgICBTRE5vZGUgKkRpdmlkZW5kID0gTjAuZ2V0Tm9kZSgpOworCisgICAgLy8gSW5zZXJ0IHByZXBhcmVkIGRpdmlkZW5kIGludG8gc3VpdGFibGUgJ3N1YnJlZycKKyAgICBTRE5vZGUgKlRtcCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoVGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBSZXNWVCk7CisgICAgeworICAgICAgdW5zaWduZWQgU3ViUmVnSWR4ID0gKGlzMzJCaXQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVo6OnN1YnJlZ19vZGQzMiA6IFN5c3RlbVo6OnN1YnJlZ19vZGQpOworICAgICAgRGl2aWRlbmQgPQorICAgICAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFRhcmdldE9wY29kZTo6SU5TRVJUX1NVQlJFRywgZGwsIFJlc1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoVG1wLCAwKSwgU0RWYWx1ZShEaXZpZGVuZCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChTdWJSZWdJZHgsIE1WVDo6aTMyKSk7CisgICAgfQorCisgICAgLy8gWmVybyBvdXQgZXZlbiBzdWJyZWcKKyAgICBEaXZpZGVuZCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoQ2xyT3BjLCBkbCwgUmVzVlQsIFNEVmFsdWUoRGl2aWRlbmQsIDApKTsKKworICAgIFNEVmFsdWUgRGl2VmFsID0gU0RWYWx1ZShEaXZpZGVuZCwgMCk7CisgICAgU0ROb2RlICpSZXN1bHQ7CisgICAgaWYgKGZvbGRlZExvYWQpIHsKKyAgICAgIFNEVmFsdWUgT3BzW10gPSB7IERpdlZhbCwgVG1wMCwgVG1wMSwgVG1wMiwgTjEuZ2V0T3BlcmFuZCgwKSB9OworICAgICAgUmVzdWx0ID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShNT3BjLCBkbCwgUmVzVlQsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7CisgICAgICAvLyBVcGRhdGUgdGhlIGNoYWluLgorICAgICAgUmVwbGFjZVVzZXMoTjEuZ2V0VmFsdWUoMSksIFNEVmFsdWUoUmVzdWx0LCAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFJlc3VsdCA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3BjLCBkbCwgUmVzVlQsIERpdlZhbCwgTjEpOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGRpdmlzaW9uIChvZGQgc3VicmVnKSByZXN1bHQsIGlmIGl0IGlzIG5lZWRlZC4KKyAgICBpZiAoIVNEVmFsdWUoTm9kZSwgMCkudXNlX2VtcHR5KCkpIHsKKyAgICAgIHVuc2lnbmVkIFN1YlJlZ0lkeCA9IChpczMyQml0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1aOjpzdWJyZWdfb2RkMzIgOiBTeXN0ZW1aOjpzdWJyZWdfb2RkKTsKKyAgICAgIFNETm9kZSAqRGl2ID0gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OkVYVFJBQ1RfU1VCUkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBOVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShSZXN1bHQsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoU3ViUmVnSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpKTsKKyAgICAgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTm9kZSwgMCksIFNEVmFsdWUoRGl2LCAwKSk7CisgICAgICBERUJVRyhlcnJzKCkgPDwgIj0+ICI7IFJlc3VsdC0+ZHVtcChDdXJEQUcpOyBlcnJzKCkgPDwgIlxuIik7CisgICAgfQorCisgICAgLy8gQ29weSB0aGUgcmVtYWluZGVyIChldmVuIHN1YnJlZykgcmVzdWx0LCBpZiBpdCBpcyBuZWVkZWQuCisgICAgaWYgKCFTRFZhbHVlKE5vZGUsIDEpLnVzZV9lbXB0eSgpKSB7CisgICAgICB1bnNpZ25lZCBTdWJSZWdJZHggPSAoaXMzMkJpdCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtWjo6c3VicmVnXzMyYml0IDogU3lzdGVtWjo6c3VicmVnX2V2ZW4pOworICAgICAgU0ROb2RlICpSZW0gPSBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFRhcmdldE9wY29kZTo6RVhUUkFDVF9TVUJSRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIE5WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlKFJlc3VsdCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChTdWJSZWdJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMikpOworICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOb2RlLCAxKSwgU0RWYWx1ZShSZW0sIDApKTsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiPT4gIjsgUmVzdWx0LT5kdW1wKEN1ckRBRyk7IGVycnMoKSA8PCAiXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB9CisKKyAgLy8gU2VsZWN0IHRoZSBkZWZhdWx0IGluc3RydWN0aW9uCisgIFNETm9kZSAqUmVzTm9kZSA9IFNlbGVjdENvZGUoTm9kZSk7CisKKyAgREVCVUcoZXJycygpIDw8ICI9PiAiOworICAgICAgICBpZiAoUmVzTm9kZSA9PSBOVUxMIHx8IFJlc05vZGUgPT0gTm9kZSkKKyAgICAgICAgICBOb2RlLT5kdW1wKEN1ckRBRyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBSZXNOb2RlLT5kdW1wKEN1ckRBRyk7CisgICAgICAgIGVycnMoKSA8PCAiXG4iOworICAgICAgICApOworICByZXR1cm4gUmVzTm9kZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSVNlbExvd2VyaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSVNlbExvd2VyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Y3MzlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpJU2VsTG93ZXJpbmcuY3BwCkBAIC0wLDAgKzEsODY2IEBACisvLz09PS0tIFN5c3RlbVpJU2VsTG93ZXJpbmcuY3BwIC0gU3lzdGVtWiBEQUcgTG93ZXJpbmcgSW1wbGVtZW50YXRpb24gIC0tLS0tPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTeXN0ZW1aVGFyZ2V0TG93ZXJpbmcgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzeXN0ZW16LWxvd2VyIgorCisjaW5jbHVkZSAiU3lzdGVtWklTZWxMb3dlcmluZy5oIgorI2luY2x1ZGUgIlN5c3RlbVouaCIKKyNpbmNsdWRlICJTeXN0ZW1aVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlN5c3RlbVpTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsQWxpYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVJbXBsLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9WZWN0b3JFeHRyYXMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTeXN0ZW1aVGFyZ2V0TG93ZXJpbmc6OlN5c3RlbVpUYXJnZXRMb3dlcmluZyhTeXN0ZW1aVGFyZ2V0TWFjaGluZSAmdG0pIDoKKyAgVGFyZ2V0TG93ZXJpbmcodG0sIG5ldyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEYoKSksCisgIFN1YnRhcmdldCgqdG0uZ2V0U3VidGFyZ2V0SW1wbCgpKSwgVE0odG0pIHsKKworICBSZWdJbmZvID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisKKyAgLy8gU2V0IHVwIHRoZSByZWdpc3RlciBjbGFzc2VzLgorICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6aTMyLCAgU3lzdGVtWjo6R1IzMlJlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6aTY0LCAgU3lzdGVtWjo6R1I2NFJlZ2lzdGVyQ2xhc3MpOworICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6djJpMzIsU3lzdGVtWjo6R1I2NFBSZWdpc3RlckNsYXNzKTsKKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnYyaTY0LFN5c3RlbVo6OkdSMTI4UmVnaXN0ZXJDbGFzcyk7CisKKyAgaWYgKCFVc2VTb2Z0RmxvYXQpIHsKKyAgICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjMyLCBTeXN0ZW1aOjpGUDMyUmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmY2NCwgU3lzdGVtWjo6RlA2NFJlZ2lzdGVyQ2xhc3MpOworICB9CisKKyAgLy8gQ29tcHV0ZSBkZXJpdmVkIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVnaXN0ZXIgY2xhc3NlcworICBjb21wdXRlUmVnaXN0ZXJQcm9wZXJ0aWVzKCk7CisKKyAgLy8gU2V0IHNoaWZ0cyBwcm9wZXJ0aWVzCisgIHNldFNoaWZ0QW1vdW50VHlwZShNVlQ6Omk2NCk7CisKKyAgLy8gUHJvdmlkZSBhbGwgc29ydHMgb2Ygb3BlcmF0aW9uIGFjdGlvbnMKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlNFWFRMT0FELCBNVlQ6OmkxLCBQcm9tb3RlKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlpFWFRMT0FELCBNVlQ6OmkxLCBQcm9tb3RlKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OkVYVExPQUQsICBNVlQ6OmkxLCBQcm9tb3RlKTsKKworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6U0VYVExPQUQsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6WkVYVExPQUQsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6RVhUTE9BRCwgIE1WVDo6ZjMyLCBFeHBhbmQpOworCisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpTRVhUTE9BRCwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpaRVhUTE9BRCwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCAgTVZUOjpmNjQsIEV4cGFuZCk7CisKKyAgc2V0U3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlKFN5c3RlbVo6OlIxNUQpOworCisgIC8vIFRPRE86IEl0IG1heSBiZSBiZXR0ZXIgdG8gZGVmYXVsdCB0byBsYXRlbmN5LW9yaWVudGVkIHNjaGVkdWxpbmcsIGhvd2V2ZXIKKyAgLy8gTExWTSdzIGN1cnJlbnQgbGF0ZW5jeS1vcmllbnRlZCBzY2hlZHVsZXIgY2FuJ3QgaGFuZGxlIHBoeXNyZWcgZGVmaW5pdGlvbnMKKyAgLy8gc3VjaCBhcyBTeXN0ZW1aIGhhcyB3aXRoIFBTVywgc28gc2V0IHRoaXMgdG8gdGhlIHJlZ2lzdGVyLXByZXNzdXJlCisgIC8vIHNjaGVkdWxlciwgYmVjYXVzZSBpdCBjYW4uCisgIHNldFNjaGVkdWxpbmdQcmVmZXJlbmNlKFNjaGVkOjpSZWdQcmVzc3VyZSk7CisKKyAgc2V0Qm9vbGVhbkNvbnRlbnRzKFplcm9Pck9uZUJvb2xlYW5Db250ZW50KTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUl9KVCwgICAgICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUkNPTkQsICAgICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUl9DQywgICAgICAgICAgICBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJfQ0MsICAgICAgICAgICAgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0NDLCAgICAgICAgICAgIE1WVDo6ZjMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUl9DQywgICAgICAgICAgICBNVlQ6OmY2NCwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q29uc3RhbnRQb29sLCAgICAgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50UG9vbCwgICAgIE1WVDo6aTY0LCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxBZGRyZXNzLCAgICBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SnVtcFRhYmxlLCAgICAgICAgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkRZTkFNSUNfU1RBQ0tBTExPQywgTVZUOjppNjQsIEV4cGFuZCk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0RJViwgICAgICAgICAgICAgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVESVYsICAgICAgICAgICAgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRElWLCAgICAgICAgICAgICBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VURJViwgICAgICAgICAgICAgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSRU0sICAgICAgICAgICAgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCAgICAgICAgICAgICBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSwgICAgICAgICAgICAgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVSRU0sICAgICAgICAgICAgIE1WVDo6aTY0LCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBNVlQ6OmkxLCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUUE9QLCAgICAgICAgICAgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVFBPUCwgICAgICAgICAgICBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RUWiwgICAgICAgICAgICAgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUVFosICAgICAgICAgICAgIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaLCAgICAgICAgICAgICBNVlQ6OmkzMiwgUHJvbW90ZSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUTFosICAgICAgICAgICAgIE1WVDo6aTY0LCBMZWdhbCk7CisKKyAgLy8gRklYTUU6IENhbiB3ZSBsb3dlciB0aGVzZSAyIGVmZmljaWVudGx5PworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRVRDQywgICAgICAgICAgICBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MsICAgICAgICAgICAgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFVENDLCAgICAgICAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRVRDQywgICAgICAgICAgICBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCAgICAgICAgICAgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgICAgICAgICAgIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsICAgICAgICAgICBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCAgICAgICAgICAgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVF9DQywgICAgICAgIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsICAgICAgICBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUX0NDLCAgICAgICAgTVZUOjpmMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVF9DQywgICAgICAgIE1WVDo6ZjY0LCBDdXN0b20pOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTEhTLCAgICAgICAgICAgIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTTVVMX0xPSEksICAgICAgICBNVlQ6Omk2NCwgRXhwYW5kKTsKKworICAvLyBGSVhNRTogQ2FuIHdlIHN1cHBvcnQgdGhlc2UgbmF0aXZlbHk/CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVNVUxfTE9ISSwgICAgICAgIE1WVDo6aTY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkxfUEFSVFMsICAgICAgICBNVlQ6Omk2NCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0hMX1BBUlRTLCAgICAgICAgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQV9QQVJUUywgICAgICAgIE1WVDo6aTY0LCBFeHBhbmQpOworCisgIC8vIExvd2VyIHNvbWUgRlAgc3R1ZmYKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNJTiwgICAgICAgICAgICAgTVZUOjpmMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTSU4sICAgICAgICAgICAgIE1WVDo6ZjY0LCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TLCAgICAgICAgICAgICBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUywgICAgICAgICAgICAgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSRU0sICAgICAgICAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUkVNLCAgICAgICAgICAgICBNVlQ6OmY2NCwgRXhwYW5kKTsKKworICAvLyBXZSBoYXZlIG9ubHkgNjQtYml0IGJpdGNvbnZlcnRzCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJULCAgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCSVRfQ09OVkVSVCwgICAgICBNVlQ6OmkzMiwgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQLCAgICAgICBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUlOVF9UT19GUCwgICAgICAgTVZUOjppNjQsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1VJTlQsICAgICAgIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5ULCAgICAgICBNVlQ6Omk2NCwgRXhwYW5kKTsKKworICBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVDo6ZjY0LCBNVlQ6OmYzMiwgRXhwYW5kKTsKK30KKworU0RWYWx1ZSBTeXN0ZW1aVGFyZ2V0TG93ZXJpbmc6Okxvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBjYXNlIElTRDo6QlJfQ0M6ICAgICAgICAgICAgcmV0dXJuIExvd2VyQlJfQ0MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6ICAgICAgICByZXR1cm4gTG93ZXJTRUxFQ1RfQ0MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpHbG9iYWxBZGRyZXNzOiAgICByZXR1cm4gTG93ZXJHbG9iYWxBZGRyZXNzKE9wLCBEQUcpOworICBjYXNlIElTRDo6SnVtcFRhYmxlOiAgICAgICAgcmV0dXJuIExvd2VySnVtcFRhYmxlKE9wLCBEQUcpOworICBjYXNlIElTRDo6Q29uc3RhbnRQb29sOiAgICAgcmV0dXJuIExvd2VyQ29uc3RhbnRQb29sKE9wLCBEQUcpOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlNob3VsZCBub3QgY3VzdG9tIGxvd2VyIHRoaXMhIik7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorfQorCitib29sIFN5c3RlbVpUYXJnZXRMb3dlcmluZzo6aXNGUEltbUxlZ2FsKGNvbnN0IEFQRmxvYXQgJkltbSwgRVZUIFZUKSBjb25zdCB7CisgIGlmIChVc2VTb2Z0RmxvYXQgfHwgKFZUICE9IE1WVDo6ZjMyICYmIFZUICE9IE1WVDo6ZjY0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gKzAuMCAgbHplcgorICAvLyArMC4wZiBsemRyCisgIC8vIC0wLjAgIGx6ZXIgKyBsbmVyCisgIC8vIC0wLjBmIGx6ZHIgKyBsbmRyCisgIHJldHVybiBJbW0uaXNaZXJvKCkgfHwgSW1tLmlzTmVnWmVybygpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVogSW5saW5lIEFzc2VtYmx5IFN1cHBvcnQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBnZXRDb25zdHJhaW50VHlwZSAtIEdpdmVuIGEgY29uc3RyYWludCBsZXR0ZXIsIHJldHVybiB0aGUgdHlwZSBvZgorLy8vIGNvbnN0cmFpbnQgaXQgaXMgZm9yIHRoaXMgdGFyZ2V0LgorVGFyZ2V0TG93ZXJpbmc6OkNvbnN0cmFpbnRUeXBlCitTeXN0ZW1aVGFyZ2V0TG93ZXJpbmc6OmdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdCB7CisgIGlmIChDb25zdHJhaW50LnNpemUoKSA9PSAxKSB7CisgICAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgY2FzZSAncic6CisgICAgICByZXR1cm4gQ19SZWdpc3RlckNsYXNzOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjpnZXRDb25zdHJhaW50VHlwZShDb25zdHJhaW50KTsKK30KKworc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4KK1N5c3RlbVpUYXJnZXRMb3dlcmluZzo6CitnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0IHsKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICAvLyBHQ0MgQ29uc3RyYWludCBMZXR0ZXJzCisgICAgc3dpdGNoIChDb25zdHJhaW50WzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAncic6ICAgLy8gR0VORVJBTF9SRUdTCisgICAgICBpZiAoVlQgPT0gTVZUOjppMzIpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgU3lzdGVtWjo6R1IzMlJlZ2lzdGVyQ2xhc3MpOworICAgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjppMTI4KQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFN5c3RlbVo6OkdSMTI4UmVnaXN0ZXJDbGFzcyk7CisKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgU3lzdGVtWjo6R1I2NFJlZ2lzdGVyQ2xhc3MpOworICAgIH0KKyAgfQorCisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChDb25zdHJhaW50LCBWVCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nIENvbnZlbnRpb24gSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJTeXN0ZW1aR2VuQ2FsbGluZ0NvbnYuaW5jIgorCitTRFZhbHVlCitTeXN0ZW1aVGFyZ2V0TG93ZXJpbmc6Okxvd2VyRm9ybWFsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CisKKyAgc3dpdGNoIChDYWxsQ29udikgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIGNhbGxpbmcgY29udmVudGlvbiIpOworICBjYXNlIENhbGxpbmdDb252OjpDOgorICBjYXNlIENhbGxpbmdDb252OjpGYXN0OgorICAgIHJldHVybiBMb3dlckNDQ0FyZ3VtZW50cyhDaGFpbiwgQ2FsbENvbnYsIGlzVmFyQXJnLCBJbnMsIGRsLCBEQUcsIEluVmFscyk7CisgIH0KK30KKworU0RWYWx1ZQorU3lzdGVtWlRhcmdldExvd2VyaW5nOjpMb3dlckNhbGwoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgLy8gU3lzdGVtWiB0YXJnZXQgZG9lcyBub3QgeWV0IHN1cHBvcnQgdGFpbCBjYWxsIG9wdGltaXphdGlvbi4KKyAgaXNUYWlsQ2FsbCA9IGZhbHNlOworCisgIHN3aXRjaCAoQ2FsbENvbnYpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBjYWxsaW5nIGNvbnZlbnRpb24iKTsKKyAgY2FzZSBDYWxsaW5nQ29udjo6RmFzdDoKKyAgY2FzZSBDYWxsaW5nQ29udjo6QzoKKyAgICByZXR1cm4gTG93ZXJDQ0NDYWxsVG8oQ2hhaW4sIENhbGxlZSwgQ2FsbENvbnYsIGlzVmFyQXJnLCBpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRzLCBPdXRWYWxzLCBJbnMsIGRsLCBEQUcsIEluVmFscyk7CisgIH0KK30KKworLy8vIExvd2VyQ0NDQXJndW1lbnRzIC0gdHJhbnNmb3JtIHBoeXNpY2FsIHJlZ2lzdGVycyBpbnRvIHZpcnR1YWwgcmVnaXN0ZXJzIGFuZAorLy8vIGdlbmVyYXRlIGxvYWQgb3BlcmF0aW9ucyBmb3IgYXJndW1lbnRzIHBsYWNlcyBvbiB0aGUgc3RhY2suCisvLyBGSVhNRTogc3RydWN0IHJldHVybiBzdHVmZgorLy8gRklYTUU6IHZhcmFyZ3MKK1NEVmFsdWUKK1N5c3RlbVpUYXJnZXRMb3dlcmluZzo6TG93ZXJDQ0NBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmUmVnSW5mbyA9IE1GLmdldFJlZ0luZm8oKTsKKworICAvLyBBc3NpZ24gbG9jYXRpb25zIHRvIGFsbCBvZiB0aGUgaW5jb21pbmcgYXJndW1lbnRzLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IEFyZ0xvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICBBcmdMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisgIENDSW5mby5BbmFseXplRm9ybWFsQXJndW1lbnRzKElucywgQ0NfU3lzdGVtWik7CisKKyAgaWYgKGlzVmFyQXJnKQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiVmFyYXJncyBub3Qgc3VwcG9ydGVkIHlldCIpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBTRFZhbHVlIEFyZ1ZhbHVlOworICAgIENDVmFsQXNzaWduICZWQSA9IEFyZ0xvY3NbaV07CisgICAgRVZUIExvY1ZUID0gVkEuZ2V0TG9jVlQoKTsKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgLy8gQXJndW1lbnRzIHBhc3NlZCBpbiByZWdpc3RlcnMKKyAgICAgIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDOworICAgICAgc3dpdGNoIChMb2NWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICBkZWZhdWx0OgorI2lmbmRlZiBOREVCVUcKKyAgICAgICAgZXJycygpIDw8ICJMb3dlckZvcm1hbEFyZ3VtZW50cyBVbmhhbmRsZWQgYXJndW1lbnQgdHlwZTogIgorICAgICAgICAgICAgIDw8IExvY1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkKKyAgICAgICAgICAgICA8PCAiXG4iOworI2VuZGlmCisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7CisgICAgICBjYXNlIE1WVDo6aTY0OgorICAgICAgICBSQyA9IFN5c3RlbVo6OkdSNjRSZWdpc3RlckNsYXNzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjpmMzI6CisgICAgICAgIFJDID0gU3lzdGVtWjo6RlAzMlJlZ2lzdGVyQ2xhc3M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmY2NDoKKyAgICAgICAgUkMgPSBTeXN0ZW1aOjpGUDY0UmVnaXN0ZXJDbGFzczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHVuc2lnbmVkIFZSZWcgPSBSZWdJbmZvLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgICAgICBSZWdJbmZvLmFkZExpdmVJbihWQS5nZXRMb2NSZWcoKSwgVlJlZyk7CisgICAgICBBcmdWYWx1ZSA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIExvY1ZUKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgICBhc3NlcnQoVkEuaXNNZW1Mb2MoKSk7CisKKyAgICAgIC8vIENyZWF0ZSB0aGUgbm9kZXMgY29ycmVzcG9uZGluZyB0byBhIGxvYWQgZnJvbSB0aGlzIHBhcmFtZXRlciBzbG90LgorICAgICAgLy8gQ3JlYXRlIHRoZSBmcmFtZSBpbmRleCBvYmplY3QgZm9yIHRoaXMgaW5jb21pbmcgcGFyYW1ldGVyLi4uCisgICAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KExvY1ZULmdldFNpemVJbkJpdHMoKS84LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQS5nZXRMb2NNZW1PZmZzZXQoKSwgdHJ1ZSk7CisKKyAgICAgIC8vIENyZWF0ZSB0aGUgU2VsZWN0aW9uREFHIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gYSBsb2FkCisgICAgICAvLyBmcm9tIHRoaXMgcGFyYW1ldGVyCisgICAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZJLCBnZXRQb2ludGVyVHkoKSk7CisgICAgICBBcmdWYWx1ZSA9IERBRy5nZXRMb2FkKExvY1ZULCBkbCwgQ2hhaW4sIEZJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgIH0KKworICAgIC8vIElmIHRoaXMgaXMgYW4gOC8xNi8zMi1iaXQgdmFsdWUsIGl0IGlzIHJlYWxseSBwYXNzZWQgcHJvbW90ZWQgdG8gNjQKKyAgICAvLyBiaXRzLiBJbnNlcnQgYW4gYXNzZXJ0W3N6XWV4dCB0byBjYXB0dXJlIHRoaXMsIHRoZW4gdHJ1bmNhdGUgdG8gdGhlCisgICAgLy8gcmlnaHQgc2l6ZS4KKyAgICBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpTRXh0KQorICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFNleHQsIGRsLCBMb2NWVCwgQXJnVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWYWx1ZVR5cGUoVkEuZ2V0VmFsVlQoKSkpOworICAgIGVsc2UgaWYgKFZBLmdldExvY0luZm8oKSA9PSBDQ1ZhbEFzc2lnbjo6WkV4dCkKKyAgICAgIEFyZ1ZhbHVlID0gREFHLmdldE5vZGUoSVNEOjpBc3NlcnRaZXh0LCBkbCwgTG9jVlQsIEFyZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKFZBLmdldFZhbFZUKCkpKTsKKworICAgIGlmIChWQS5nZXRMb2NJbmZvKCkgIT0gQ0NWYWxBc3NpZ246OkZ1bGwpCisgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBWQS5nZXRWYWxWVCgpLCBBcmdWYWx1ZSk7CisKKyAgICBJblZhbHMucHVzaF9iYWNrKEFyZ1ZhbHVlKTsKKyAgfQorCisgIHJldHVybiBDaGFpbjsKK30KKworLy8vIExvd2VyQ0NDQ2FsbFRvIC0gZnVuY3Rpb25zIGFyZ3VtZW50cyBhcmUgY29waWVkIGZyb20gdmlydHVhbCByZWdzIHRvCisvLy8gKHBoeXNpY2FsIHJlZ3MpLyhzdGFjayBmcmFtZSksIENBTExTRVFfU1RBUlQgYW5kIENBTExTRVFfRU5EIGFyZSBlbWl0dGVkLgorLy8vIFRPRE86IHNyZXQuCitTRFZhbHVlCitTeXN0ZW1aVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ0NDQ2FsbFRvKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdCB7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKworICAvLyBPZmZzZXQgdG8gZmlyc3QgYXJndW1lbnQgc3RhY2sgc2xvdC4KKyAgY29uc3QgdW5zaWduZWQgRmlyc3RBcmdPZmZzZXQgPSAxNjA7CisKKyAgLy8gQW5hbHl6ZSBvcGVyYW5kcyBvZiB0aGUgY2FsbCwgYXNzaWduaW5nIGxvY2F0aW9ucyB0byBlYWNoIG9wZXJhbmQuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gQXJnTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIEFyZ0xvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKworICBDQ0luZm8uQW5hbHl6ZUNhbGxPcGVyYW5kcyhPdXRzLCBDQ19TeXN0ZW1aKTsKKworICAvLyBHZXQgYSBjb3VudCBvZiBob3cgbWFueSBieXRlcyBhcmUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjay4KKyAgdW5zaWduZWQgTnVtQnl0ZXMgPSBDQ0luZm8uZ2V0TmV4dFN0YWNrT2Zmc2V0KCk7CisKKyAgQ2hhaW4gPSBEQUcuZ2V0Q0FMTFNFUV9TVEFSVChDaGFpbiAsREFHLmdldENvbnN0YW50KE51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCksIHRydWUpKTsKKworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIFNEVmFsdWU+LCA0PiBSZWdzVG9QYXNzOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxMj4gTWVtT3BDaGFpbnM7CisgIFNEVmFsdWUgU3RhY2tQdHI7CisKKyAgLy8gV2FsayB0aGUgcmVnaXN0ZXIvbWVtbG9jIGFzc2lnbm1lbnRzLCBpbnNlcnRpbmcgY29waWVzL2xvYWRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tpXTsKKworICAgIFNEVmFsdWUgQXJnID0gT3V0VmFsc1tpXTsKKworICAgIC8vIFByb21vdGUgdGhlIHZhbHVlIGlmIG5lZWRlZC4KKyAgICBzd2l0Y2ggKFZBLmdldExvY0luZm8oKSkgeworICAgICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gbG9jIGluZm8hIik7CisgICAgICBjYXNlIENDVmFsQXNzaWduOjpGdWxsOiBicmVhazsKKyAgICAgIGNhc2UgQ0NWYWxBc3NpZ246OlNFeHQ6CisgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0NWYWxBc3NpZ246OlpFeHQ6CisgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBBcmcpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0NWYWxBc3NpZ246OkFFeHQ6CisgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIFZBLmdldExvY1ZUKCksIEFyZyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEFyZ3VtZW50cyB0aGF0IGNhbiBiZSBwYXNzZWQgb24gcmVnaXN0ZXIgbXVzdCBiZSBrZXB0IGF0IFJlZ3NUb1Bhc3MKKyAgICAvLyB2ZWN0b3IKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgUmVnc1RvUGFzcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoVkEuZ2V0TG9jUmVnKCksIEFyZykpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoVkEuaXNNZW1Mb2MoKSk7CisKKyAgICAgIGlmIChTdGFja1B0ci5nZXROb2RlKCkgPT0gMCkKKyAgICAgICAgU3RhY2tQdHIgPQorICAgICAgICAgIERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZWdJbmZvLT5oYXNGUChNRikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtWjo6UjExRCA6IFN5c3RlbVo6OlIxNUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSk7CisKKyAgICAgIHVuc2lnbmVkIE9mZnNldCA9IEZpcnN0QXJnT2Zmc2V0ICsgVkEuZ2V0TG9jTWVtT2Zmc2V0KCk7CisgICAgICBTRFZhbHVlIFB0ck9mZiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoT2Zmc2V0KSk7CisKKyAgICAgIE1lbU9wQ2hhaW5zLnB1c2hfYmFjayhEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBBcmcsIFB0ck9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldFN0YWNrKCksIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisgICAgfQorICB9CisKKyAgLy8gVHJhbnNmb3JtIGFsbCBzdG9yZSBub2RlcyBpbnRvIG9uZSBzaW5nbGUgbm9kZSBiZWNhdXNlIGFsbCBzdG9yZSBub2RlcyBhcmUKKyAgLy8gaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlci4KKyAgaWYgKCFNZW1PcENoYWlucy5lbXB0eSgpKQorICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAmTWVtT3BDaGFpbnNbMF0sIE1lbU9wQ2hhaW5zLnNpemUoKSk7CisKKyAgLy8gQnVpbGQgYSBzZXF1ZW5jZSBvZiBjb3B5LXRvLXJlZyBub2RlcyBjaGFpbmVkIHRvZ2V0aGVyIHdpdGggdG9rZW4gY2hhaW4gYW5kCisgIC8vIGZsYWcgb3BlcmFuZHMgd2hpY2ggY29weSB0aGUgb3V0Z29pbmcgYXJncyBpbnRvIHJlZ2lzdGVycy4gIFRoZSBJbkZsYWcgaW4KKyAgLy8gbmVjZXNzYXJ5IHNpbmNlIGFsbCBlbWl0ZWQgaW5zdHJ1Y3Rpb25zIG11c3QgYmUgc3R1Y2sgdG9nZXRoZXIuCisgIFNEVmFsdWUgSW5GbGFnOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgUmVnc1RvUGFzc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQsIEluRmxhZyk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIH0KKworICAvLyBJZiB0aGUgY2FsbGVlIGlzIGEgR2xvYmFsQWRkcmVzcyBub2RlIChxdWl0ZSBjb21tb24sIGV2ZXJ5IGRpcmVjdCBjYWxsIGlzKQorICAvLyB0dXJuIGl0IGludG8gYSBUYXJnZXRHbG9iYWxBZGRyZXNzIG5vZGUgc28gdGhhdCBsZWdhbGl6ZSBkb2Vzbid0IGhhY2sgaXQuCisgIC8vIExpa2V3aXNlIEV4dGVybmFsU3ltYm9sIC0+IFRhcmdldEV4dGVybmFsU3ltYm9sLgorICBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KENhbGxlZSkpCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoRy0+Z2V0R2xvYmFsKCksIGRsLCBnZXRQb2ludGVyVHkoKSk7CisgIGVsc2UgaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpFID0gZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKEUtPmdldFN5bWJvbCgpLCBnZXRQb2ludGVyVHkoKSk7CisKKyAgLy8gUmV0dXJucyBhIGNoYWluICYgYSBmbGFnIGZvciByZXR2YWwgY29weSB0byB1c2UuCisgIFNEVlRMaXN0IE5vZGVUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wczsKKyAgT3BzLnB1c2hfYmFjayhDaGFpbik7CisgIE9wcy5wdXNoX2JhY2soQ2FsbGVlKTsKKworICAvLyBBZGQgYXJndW1lbnQgcmVnaXN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gdGhhdCB0aGV5IGFyZQorICAvLyBrbm93biBsaXZlIGludG8gdGhlIGNhbGwuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzVG9QYXNzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0UmVnaXN0ZXIoUmVnc1RvUGFzc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdzVG9QYXNzW2ldLnNlY29uZC5nZXRWYWx1ZVR5cGUoKSkpOworCisgIGlmIChJbkZsYWcuZ2V0Tm9kZSgpKQorICAgIE9wcy5wdXNoX2JhY2soSW5GbGFnKTsKKworICBDaGFpbiA9IERBRy5nZXROb2RlKFN5c3RlbVpJU0Q6OkNBTEwsIGRsLCBOb2RlVHlzLCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBDQUxMU0VRX0VORCBub2RlLgorICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX0VORChDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE51bUJ5dGVzLCBnZXRQb2ludGVyVHkoKSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBnZXRQb2ludGVyVHkoKSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRmxhZyk7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIEhhbmRsZSByZXN1bHQgdmFsdWVzLCBjb3B5aW5nIHRoZW0gb3V0IG9mIHBoeXNyZWdzIGludG8gdnJlZ3MgdGhhdCB3ZQorICAvLyByZXR1cm4uCisgIHJldHVybiBMb3dlckNhbGxSZXN1bHQoQ2hhaW4sIEluRmxhZywgQ2FsbENvbnYsIGlzVmFyQXJnLCBJbnMsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRywgSW5WYWxzKTsKK30KKworLy8vIExvd2VyQ2FsbFJlc3VsdCAtIExvd2VyIHRoZSByZXN1bHQgdmFsdWVzIG9mIGEgY2FsbCBpbnRvIHRoZQorLy8vIGFwcHJvcHJpYXRlIGNvcGllcyBvdXQgb2YgYXBwcm9wcmlhdGUgcGh5c2ljYWwgcmVnaXN0ZXJzLgorLy8vCitTRFZhbHVlCitTeXN0ZW1aVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbFJlc3VsdChTRFZhbHVlIENoYWluLCBTRFZhbHVlIEluRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKworICAvLyBBc3NpZ24gbG9jYXRpb25zIHRvIGVhY2ggdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBjYWxsLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksIFJWTG9jcywKKyAgICAgICAgICAgICAgICAgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIENDSW5mby5BbmFseXplQ2FsbFJlc3VsdChJbnMsIFJldENDX1N5c3RlbVopOworCisgIC8vIENvcHkgYWxsIG9mIHRoZSByZXN1bHQgcmVnaXN0ZXJzIG91dCBvZiB0aGVpciBzcGVjaWZpZWQgcGh5c3JlZy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBSVkxvY3NbaV07CisKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZBLmdldExvY1JlZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBLmdldExvY1ZUKCksIEluRmxhZykuZ2V0VmFsdWUoMSk7CisgICAgU0RWYWx1ZSBSZXRWYWx1ZSA9IENoYWluLmdldFZhbHVlKDApOworICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDIpOworCisgICAgLy8gSWYgdGhpcyBpcyBhbiA4LzE2LzMyLWJpdCB2YWx1ZSwgaXQgaXMgcmVhbGx5IHBhc3NlZCBwcm9tb3RlZCB0byA2NAorICAgIC8vIGJpdHMuIEluc2VydCBhbiBhc3NlcnRbc3pdZXh0IHRvIGNhcHR1cmUgdGhpcywgdGhlbiB0cnVuY2F0ZSB0byB0aGUKKyAgICAvLyByaWdodCBzaXplLgorICAgIGlmIChWQS5nZXRMb2NJbmZvKCkgPT0gQ0NWYWxBc3NpZ246OlNFeHQpCisgICAgICBSZXRWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0U2V4dCwgZGwsIFZBLmdldExvY1ZUKCksIFJldFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKFZBLmdldFZhbFZUKCkpKTsKKyAgICBlbHNlIGlmIChWQS5nZXRMb2NJbmZvKCkgPT0gQ0NWYWxBc3NpZ246OlpFeHQpCisgICAgICBSZXRWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0WmV4dCwgZGwsIFZBLmdldExvY1ZUKCksIFJldFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKFZBLmdldFZhbFZUKCkpKTsKKworICAgIGlmIChWQS5nZXRMb2NJbmZvKCkgIT0gQ0NWYWxBc3NpZ246OkZ1bGwpCisgICAgICBSZXRWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBWQS5nZXRWYWxWVCgpLCBSZXRWYWx1ZSk7CisKKyAgICBJblZhbHMucHVzaF9iYWNrKFJldFZhbHVlKTsKKyAgfQorCisgIHJldHVybiBDaGFpbjsKK30KKworCitTRFZhbHVlCitTeXN0ZW1aVGFyZ2V0TG93ZXJpbmc6Okxvd2VyUmV0dXJuKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKworICAvLyBDQ1ZhbEFzc2lnbiAtIHJlcHJlc2VudCB0aGUgYXNzaWdubWVudCBvZiB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgbG9jYXRpb24KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBSVkxvY3M7CisKKyAgLy8gQ0NTdGF0ZSAtIEluZm8gYWJvdXQgdGhlIHJlZ2lzdGVycyBhbmQgc3RhY2sgc2xvdC4KKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIFJWTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIC8vIEFuYWxpemUgcmV0dXJuIHZhbHVlcy4KKyAgQ0NJbmZvLkFuYWx5emVSZXR1cm4oT3V0cywgUmV0Q0NfU3lzdGVtWik7CisKKyAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgcmV0dXJuIGxvd2VyZWQgZm9yIHRoaXMgZnVuY3Rpb24sIGFkZCB0aGUgcmVncyB0byB0aGUKKyAgLy8gbGl2ZW91dCBzZXQgZm9yIHRoZSBmdW5jdGlvbi4KKyAgaWYgKERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkubGl2ZW91dF9lbXB0eSgpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpCisgICAgICBpZiAoUlZMb2NzW2ldLmlzUmVnTG9jKCkpCisgICAgICAgIERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRSZWdJbmZvKCkuYWRkTGl2ZU91dChSVkxvY3NbaV0uZ2V0TG9jUmVnKCkpOworICB9CisKKyAgU0RWYWx1ZSBGbGFnOworCisgIC8vIENvcHkgdGhlIHJlc3VsdCB2YWx1ZXMgaW50byB0aGUgb3V0cHV0IHJlZ2lzdGVycy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBSVkxvY3NbaV07CisgICAgU0RWYWx1ZSBSZXNWYWx1ZSA9IE91dFZhbHNbaV07CisgICAgYXNzZXJ0KFZBLmlzUmVnTG9jKCkgJiYgIkNhbiBvbmx5IHJldHVybiBpbiByZWdpc3RlcnMhIik7CisKKyAgICAvLyBJZiB0aGlzIGlzIGFuIDgvMTYvMzItYml0IHZhbHVlLCBpdCBpcyByZWFsbHkgc2hvdWxkIGJlIHBhc3NlZCBwcm9tb3RlZAorICAgIC8vIHRvIDY0IGJpdHMuCisgICAgaWYgKFZBLmdldExvY0luZm8oKSA9PSBDQ1ZhbEFzc2lnbjo6U0V4dCkKKyAgICAgIFJlc1ZhbHVlID0gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgZGwsIFZBLmdldExvY1ZUKCksIFJlc1ZhbHVlKTsKKyAgICBlbHNlIGlmIChWQS5nZXRMb2NJbmZvKCkgPT0gQ0NWYWxBc3NpZ246OlpFeHQpCisgICAgICBSZXNWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBSZXNWYWx1ZSk7CisgICAgZWxzZSBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpBRXh0KQorICAgICAgUmVzVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLCBWQS5nZXRMb2NWVCgpLCBSZXNWYWx1ZSk7CisKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwgUmVzVmFsdWUsIEZsYWcpOworCisgICAgLy8gR3VhcmFudGVlIHRoYXQgYWxsIGVtaXR0ZWQgY29waWVzIGFyZSBzdHVjayB0b2dldGhlciwKKyAgICAvLyBhdm9pZGluZyBzb21ldGhpbmcgYmFkLgorICAgIEZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIGlmIChGbGFnLmdldE5vZGUoKSkKKyAgICByZXR1cm4gREFHLmdldE5vZGUoU3lzdGVtWklTRDo6UkVUX0ZMQUcsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbiwgRmxhZyk7CisKKyAgLy8gUmV0dXJuIFZvaWQKKyAgcmV0dXJuIERBRy5nZXROb2RlKFN5c3RlbVpJU0Q6OlJFVF9GTEFHLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4pOworfQorCitTRFZhbHVlIFN5c3RlbVpUYXJnZXRMb3dlcmluZzo6RW1pdENtcChTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkNvbmRDb2RlIENDLCBTRFZhbHVlICZTeXN0ZW1aQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvLyBGSVhNRTogRW1pdCBhIHRlc3QgaWYgUkhTIGlzIHplcm8KKworICBib29sIGlzVW5zaWduZWQgPSBmYWxzZTsKKyAgU3lzdGVtWkNDOjpDb25kQ29kZXMgVENDOworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBpbnRlZ2VyIGNvbmRpdGlvbiEiKTsKKyAgY2FzZSBJU0Q6OlNFVEVROgorICBjYXNlIElTRDo6U0VUT0VROgorICAgIFRDQyA9IFN5c3RlbVpDQzo6RTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVFVFUToKKyAgICBUQ0MgPSBTeXN0ZW1aQ0M6Ok5MSDsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVE5FOgorICBjYXNlIElTRDo6U0VUT05FOgorICAgIFRDQyA9IFN5c3RlbVpDQzo6TkU7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRVTkU6CisgICAgVENDID0gU3lzdGVtWkNDOjpMSDsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVE86CisgICAgVENDID0gU3lzdGVtWkNDOjpPOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUVU86CisgICAgVENDID0gU3lzdGVtWkNDOjpOTzsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVFVMRToKKyAgICBpZiAoTEhTLmdldFZhbHVlVHlwZSgpLmlzRmxvYXRpbmdQb2ludCgpKSB7CisgICAgICBUQ0MgPSBTeXN0ZW1aQ0M6Ok5IOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlzVW5zaWduZWQgPSB0cnVlOyAgIC8vIEZBTExUSFJPVUdICisgIGNhc2UgSVNEOjpTRVRMRToKKyAgY2FzZSBJU0Q6OlNFVE9MRToKKyAgICBUQ0MgPSBTeXN0ZW1aQ0M6OkxFOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUVUdFOgorICAgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCkpIHsKKyAgICAgIFRDQyA9IFN5c3RlbVpDQzo6Tkw7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaXNVbnNpZ25lZCA9IHRydWU7ICAgLy8gRkFMTFRIUk9VR0gKKyAgY2FzZSBJU0Q6OlNFVEdFOgorICBjYXNlIElTRDo6U0VUT0dFOgorICAgIFRDQyA9IFN5c3RlbVpDQzo6SEU7CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRVR1Q6CisgICAgaWYgKExIUy5nZXRWYWx1ZVR5cGUoKS5pc0Zsb2F0aW5nUG9pbnQoKSkgeworICAgICAgVENDID0gU3lzdGVtWkNDOjpOTEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaXNVbnNpZ25lZCA9IHRydWU7ICAvLyBGQUxMVEhST1VHSAorICBjYXNlIElTRDo6U0VUR1Q6CisgIGNhc2UgSVNEOjpTRVRPR1Q6CisgICAgVENDID0gU3lzdGVtWkNDOjpIOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0VUVUxUOgorICAgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCkpIHsKKyAgICAgIFRDQyA9IFN5c3RlbVpDQzo6TkhFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlzVW5zaWduZWQgPSB0cnVlOyAgLy8gRkFMTFRIUk9VR0gKKyAgY2FzZSBJU0Q6OlNFVExUOgorICBjYXNlIElTRDo6U0VUT0xUOgorICAgIFRDQyA9IFN5c3RlbVpDQzo6TDsKKyAgICBicmVhazsKKyAgfQorCisgIFN5c3RlbVpDQyA9IERBRy5nZXRDb25zdGFudChUQ0MsIE1WVDo6aTMyKTsKKworICBEZWJ1Z0xvYyBkbCA9IExIUy5nZXREZWJ1Z0xvYygpOworICByZXR1cm4gREFHLmdldE5vZGUoKGlzVW5zaWduZWQgPyBTeXN0ZW1aSVNEOjpVQ01QIDogU3lzdGVtWklTRDo6Q01QKSwKKyAgICAgICAgICAgICAgICAgICAgIGRsLCBNVlQ6Omk2NCwgTEhTLCBSSFMpOworfQorCisKK1NEVmFsdWUgU3lzdGVtWlRhcmdldExvd2VyaW5nOjpMb3dlckJSX0NDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmdldCgpOworICBTRFZhbHVlIExIUyAgID0gT3AuZ2V0T3BlcmFuZCgyKTsKKyAgU0RWYWx1ZSBSSFMgICA9IE9wLmdldE9wZXJhbmQoMyk7CisgIFNEVmFsdWUgRGVzdCAgPSBPcC5nZXRPcGVyYW5kKDQpOworICBEZWJ1Z0xvYyBkbCAgID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBTRFZhbHVlIFN5c3RlbVpDQzsKKyAgU0RWYWx1ZSBGbGFnID0gRW1pdENtcChMSFMsIFJIUywgQ0MsIFN5c3RlbVpDQywgREFHKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKFN5c3RlbVpJU0Q6OkJSQ09ORCwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgQ2hhaW4sIERlc3QsIFN5c3RlbVpDQywgRmxhZyk7Cit9CisKK1NEVmFsdWUgU3lzdGVtWlRhcmdldExvd2VyaW5nOjpMb3dlclNFTEVDVF9DQyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgTEhTICAgID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBSSFMgICAgPSBPcC5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIFRydWVWICA9IE9wLmdldE9wZXJhbmQoMik7CisgIFNEVmFsdWUgRmFsc2VWID0gT3AuZ2V0T3BlcmFuZCgzKTsKKyAgSVNEOjpDb25kQ29kZSBDQyA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KE9wLmdldE9wZXJhbmQoNCkpLT5nZXQoKTsKKyAgRGVidWdMb2MgZGwgICA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgU0RWYWx1ZSBTeXN0ZW1aQ0M7CisgIFNEVmFsdWUgRmxhZyA9IEVtaXRDbXAoTEhTLCBSSFMsIENDLCBTeXN0ZW1aQ0MsIERBRyk7CisKKyAgU0RWVExpc3QgVlRzID0gREFHLmdldFZUTGlzdChPcC5nZXRWYWx1ZVR5cGUoKSwgTVZUOjpGbGFnKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gT3BzOworICBPcHMucHVzaF9iYWNrKFRydWVWKTsKKyAgT3BzLnB1c2hfYmFjayhGYWxzZVYpOworICBPcHMucHVzaF9iYWNrKFN5c3RlbVpDQyk7CisgIE9wcy5wdXNoX2JhY2soRmxhZyk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKFN5c3RlbVpJU0Q6OlNFTEVDVCwgZGwsIFZUcywgJk9wc1swXSwgT3BzLnNpemUoKSk7Cit9CisKK1NEVmFsdWUgU3lzdGVtWlRhcmdldExvd2VyaW5nOjpMb3dlckdsb2JhbEFkZHJlc3MoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKS0+Z2V0R2xvYmFsKCk7CisgIGludDY0X3QgT2Zmc2V0ID0gY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihPcCktPmdldE9mZnNldCgpOworCisgIGJvb2wgSXNQaWMgPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ187CisgIGJvb2wgRXh0cmFMb2FkUmVxdWlyZWQgPQorICAgIFN1YnRhcmdldC5HVlJlcXVpcmVzRXh0cmFMb2FkKEdWLCBnZXRUYXJnZXRNYWNoaW5lKCksIGZhbHNlKTsKKworICBTRFZhbHVlIFJlc3VsdDsKKyAgaWYgKCFJc1BpYyAmJiAhRXh0cmFMb2FkUmVxdWlyZWQpIHsKKyAgICBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgZGwsIGdldFBvaW50ZXJUeSgpLCBPZmZzZXQpOworICAgIE9mZnNldCA9IDA7CisgIH0gZWxzZSB7CisgICAgdW5zaWduZWQgY2hhciBPcEZsYWdzID0gMDsKKyAgICBpZiAoRXh0cmFMb2FkUmVxdWlyZWQpCisgICAgICBPcEZsYWdzID0gU3lzdGVtWklJOjpNT19HT1RFTlQ7CisKKyAgICBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgZGwsIGdldFBvaW50ZXJUeSgpLCAwLCBPcEZsYWdzKTsKKyAgfQorCisgIFJlc3VsdCA9IERBRy5nZXROb2RlKFN5c3RlbVpJU0Q6OlBDUmVsYXRpdmVXcmFwcGVyLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCksIFJlc3VsdCk7CisKKyAgaWYgKEV4dHJhTG9hZFJlcXVpcmVkKQorICAgIFJlc3VsdCA9IERBRy5nZXRMb2FkKGdldFBvaW50ZXJUeSgpLCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEdPVCgpLCAwLCBmYWxzZSwgZmFsc2UsIDApOworCisgIC8vIElmIHRoZXJlIHdhcyBhIG5vbi16ZXJvIG9mZnNldCB0aGF0IHdlIGRpZG4ndCBmb2xkLCBjcmVhdGUgYW4gZXhwbGljaXQKKyAgLy8gYWRkaXRpb24gZm9yIGl0LgorICBpZiAoT2Zmc2V0ICE9IDApCisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwgUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChPZmZzZXQsIGdldFBvaW50ZXJUeSgpKSk7CisKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8gRklYTUU6IFBJQyBoZXJlCitTRFZhbHVlIFN5c3RlbVpUYXJnZXRMb3dlcmluZzo6TG93ZXJKdW1wVGFibGUoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIEp1bXBUYWJsZVNETm9kZSAqSlQgPSBjYXN0PEp1bXBUYWJsZVNETm9kZT4oT3ApOworICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRKdW1wVGFibGUoSlQtPmdldEluZGV4KCksIGdldFBvaW50ZXJUeSgpKTsKKworICByZXR1cm4gREFHLmdldE5vZGUoU3lzdGVtWklTRDo6UENSZWxhdGl2ZVdyYXBwZXIsIGRsLCBnZXRQb2ludGVyVHkoKSwgUmVzdWx0KTsKK30KKworCisvLyBGSVhNRTogUElDIGhlcmUKKy8vIEZJWE1FOiBUaGlzIGlzIGp1c3QgZGlydHkgaGFjay4gV2UgbmVlZCB0byBsb3dlciBjcG9vbCBwcm9wZXJseQorU0RWYWx1ZSBTeXN0ZW1aVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ29uc3RhbnRQb29sKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBDb25zdGFudFBvb2xTRE5vZGUgKkNQID0gY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KE9wKTsKKworICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRDb25zdGFudFBvb2woQ1AtPmdldENvbnN0VmFsKCksIGdldFBvaW50ZXJUeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1AtPmdldEFsaWdubWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1AtPmdldE9mZnNldCgpKTsKKworICByZXR1cm4gREFHLmdldE5vZGUoU3lzdGVtWklTRDo6UENSZWxhdGl2ZVdyYXBwZXIsIGRsLCBnZXRQb2ludGVyVHkoKSwgUmVzdWx0KTsKK30KKworY29uc3QgY2hhciAqU3lzdGVtWlRhcmdldExvd2VyaW5nOjpnZXRUYXJnZXROb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgY2FzZSBTeXN0ZW1aSVNEOjpSRVRfRkxBRzogICAgICAgICAgIHJldHVybiAiU3lzdGVtWklTRDo6UkVUX0ZMQUciOworICBjYXNlIFN5c3RlbVpJU0Q6OkNBTEw6ICAgICAgICAgICAgICAgcmV0dXJuICJTeXN0ZW1aSVNEOjpDQUxMIjsKKyAgY2FzZSBTeXN0ZW1aSVNEOjpCUkNPTkQ6ICAgICAgICAgICAgIHJldHVybiAiU3lzdGVtWklTRDo6QlJDT05EIjsKKyAgY2FzZSBTeXN0ZW1aSVNEOjpDTVA6ICAgICAgICAgICAgICAgIHJldHVybiAiU3lzdGVtWklTRDo6Q01QIjsKKyAgY2FzZSBTeXN0ZW1aSVNEOjpVQ01QOiAgICAgICAgICAgICAgIHJldHVybiAiU3lzdGVtWklTRDo6VUNNUCI7CisgIGNhc2UgU3lzdGVtWklTRDo6U0VMRUNUOiAgICAgICAgICAgICByZXR1cm4gIlN5c3RlbVpJU0Q6OlNFTEVDVCI7CisgIGNhc2UgU3lzdGVtWklTRDo6UENSZWxhdGl2ZVdyYXBwZXI6ICByZXR1cm4gIlN5c3RlbVpJU0Q6OlBDUmVsYXRpdmVXcmFwcGVyIjsKKyAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBPdGhlciBMb3dlcmluZyBDb2RlCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNYWNoaW5lQmFzaWNCbG9jayoKK1N5c3RlbVpUYXJnZXRMb3dlcmluZzo6RW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgY29uc3QgU3lzdGVtWkluc3RySW5mbyAmVElJID0gKlRNLmdldEluc3RySW5mbygpOworICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworICBhc3NlcnQoKE1JLT5nZXRPcGNvZGUoKSA9PSBTeXN0ZW1aOjpTZWxlY3QzMiAgfHwKKyAgICAgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gU3lzdGVtWjo6U2VsZWN0RjMyIHx8CisgICAgICAgICAgTUktPmdldE9wY29kZSgpID09IFN5c3RlbVo6OlNlbGVjdDY0ICB8fAorICAgICAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBTeXN0ZW1aOjpTZWxlY3RGNjQpICYmCisgICAgICAgICAiVW5leHBlY3RlZCBpbnN0ciB0eXBlIHRvIGluc2VydCIpOworCisgIC8vIFRvICJpbnNlcnQiIGEgU0VMRUNUIGluc3RydWN0aW9uLCB3ZSBhY3R1YWxseSBoYXZlIHRvIGluc2VydCB0aGUgZGlhbW9uZAorICAvLyBjb250cm9sLWZsb3cgcGF0dGVybi4gIFRoZSBpbmNvbWluZyBpbnN0cnVjdGlvbiBrbm93cyB0aGUgZGVzdGluYXRpb24gdnJlZworICAvLyB0byBzZXQsIHRoZSBjb25kaXRpb24gY29kZSByZWdpc3RlciB0byBicmFuY2ggb24sIHRoZSB0cnVlL2ZhbHNlIHZhbHVlcyB0bworICAvLyBzZWxlY3QgYmV0d2VlbiwgYW5kIGEgYnJhbmNoIG9wY29kZSB0byB1c2UuCisgIGNvbnN0IEJhc2ljQmxvY2sgKkxMVk1fQkIgPSBCQi0+Z2V0QmFzaWNCbG9jaygpOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBCQjsKKyAgKytJOworCisgIC8vICB0aGlzTUJCOgorICAvLyAgLi4uCisgIC8vICAgVHJ1ZVZhbCA9IC4uLgorICAvLyAgIGNtcFRZIGNjWCwgcjEsIHIyCisgIC8vICAgakNDIGNvcHkxTUJCCisgIC8vICAgZmFsbHRocm91Z2ggLS0+IGNvcHkwTUJCCisgIE1hY2hpbmVCYXNpY0Jsb2NrICp0aGlzTUJCID0gQkI7CisgIE1hY2hpbmVGdW5jdGlvbiAqRiA9IEJCLT5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmNvcHkwTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpjb3B5MU1CQiA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICBTeXN0ZW1aQ0M6OkNvbmRDb2RlcyBDQyA9IChTeXN0ZW1aQ0M6OkNvbmRDb2RlcylNSS0+Z2V0T3BlcmFuZCgzKS5nZXRJbW0oKTsKKyAgRi0+aW5zZXJ0KEksIGNvcHkwTUJCKTsKKyAgRi0+aW5zZXJ0KEksIGNvcHkxTUJCKTsKKyAgLy8gVXBkYXRlIG1hY2hpbmUtQ0ZHIGVkZ2VzIGJ5IHRyYW5zZmVycmluZyBhbGwgc3VjY2Vzc29ycyBvZiB0aGUgY3VycmVudAorICAvLyBibG9jayB0byB0aGUgbmV3IGJsb2NrIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgUGhpIG5vZGUgZm9yIHRoZSBzZWxlY3QuCisgIGNvcHkxTUJCLT5zcGxpY2UoY29weTFNQkItPmJlZ2luKCksIEJCLAorICAgICAgICAgICAgICAgICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKE1JKSksCisgICAgICAgICAgICAgICAgICAgQkItPmVuZCgpKTsKKyAgY29weTFNQkItPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXMoQkIpOworICAvLyBOZXh0LCBhZGQgdGhlIHRydWUgYW5kIGZhbGx0aHJvdWdoIGJsb2NrcyBhcyBpdHMgc3VjY2Vzc29ycy4KKyAgQkItPmFkZFN1Y2Nlc3Nvcihjb3B5ME1CQik7CisgIEJCLT5hZGRTdWNjZXNzb3IoY29weTFNQkIpOworCisgIEJ1aWxkTUkoQkIsIGRsLCBUSUkuZ2V0QnJDb25kKENDKSkuYWRkTUJCKGNvcHkxTUJCKTsKKworICAvLyAgY29weTBNQkI6CisgIC8vICAgJUZhbHNlVmFsdWUgPSAuLi4KKyAgLy8gICAjIGZhbGx0aHJvdWdoIHRvIGNvcHkxTUJCCisgIEJCID0gY29weTBNQkI7CisKKyAgLy8gVXBkYXRlIG1hY2hpbmUtQ0ZHIGVkZ2VzCisgIEJCLT5hZGRTdWNjZXNzb3IoY29weTFNQkIpOworCisgIC8vICBjb3B5MU1CQjoKKyAgLy8gICAlUmVzdWx0ID0gcGhpIFsgJUZhbHNlVmFsdWUsIGNvcHkwTUJCIF0sIFsgJVRydWVWYWx1ZSwgdGhpc01CQiBdCisgIC8vICAuLi4KKyAgQkIgPSBjb3B5MU1CQjsKKyAgQnVpbGRNSSgqQkIsIEJCLT5iZWdpbigpLCBkbCwgVElJLmdldChTeXN0ZW1aOjpQSEkpLAorICAgICAgICAgIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKQorICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCkpLmFkZE1CQihjb3B5ME1CQikKKyAgICAuYWRkUmVnKE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpKS5hZGRNQkIodGhpc01CQik7CisKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisgIHJldHVybiBCQjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSVNlbExvd2VyaW5nLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWklTZWxMb3dlcmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDJkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWklTZWxMb3dlcmluZy5oCkBAIC0wLDAgKzEsMTQ4IEBACisvLz09LS0gU3lzdGVtWklTZWxMb3dlcmluZy5oIC0gU3lzdGVtWiBEQUcgTG93ZXJpbmcgSW50ZXJmYWNlIC0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgU3lzdGVtWiB1c2VzIHRvIGxvd2VyIExMVk0gY29kZSBpbnRvIGEKKy8vIHNlbGVjdGlvbiBEQUcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9TeXN0ZW1aX0lTRUxMT1dFUklOR19ICisjZGVmaW5lIExMVk1fVEFSR0VUX1N5c3RlbVpfSVNFTExPV0VSSU5HX0gKKworI2luY2x1ZGUgIlN5c3RlbVouaCIKKyNpbmNsdWRlICJTeXN0ZW1aUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgbmFtZXNwYWNlIFN5c3RlbVpJU0QgeworICAgIGVudW0geworICAgICAgRklSU1RfTlVNQkVSID0gSVNEOjpCVUlMVElOX09QX0VORCwKKworICAgICAgLy8vIFJldHVybiB3aXRoIGEgZmxhZyBvcGVyYW5kLiBPcGVyYW5kIDAgaXMgdGhlIGNoYWluIG9wZXJhbmQuCisgICAgICBSRVRfRkxBRywKKworICAgICAgLy8vIENBTEwgLSBUaGVzZSBvcGVyYXRpb25zIHJlcHJlc2VudCBhbiBhYnN0cmFjdCBjYWxsCisgICAgICAvLy8gaW5zdHJ1Y3Rpb24sIHdoaWNoIGluY2x1ZGVzIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24uCisgICAgICBDQUxMLAorCisgICAgICAvLy8gUENSZWxhdGl2ZVdyYXBwZXIgLSBQQyByZWxhdGl2ZSBhZGRyZXNzCisgICAgICBQQ1JlbGF0aXZlV3JhcHBlciwKKworICAgICAgLy8vIENNUCwgVUNNUCAtIENvbXBhcmUgaW5zdHJ1Y3Rpb24KKyAgICAgIENNUCwKKyAgICAgIFVDTVAsCisKKyAgICAgIC8vLyBCUkNPTkQgLSBDb25kaXRpb25hbCBicmFuY2guIE9wZXJhbmQgMCBpcyBjaGFpbiBvcGVyYW5kLCBvcGVyYW5kIDEgaXMKKyAgICAgIC8vLyB0aGUgYmxvY2sgdG8gYnJhbmNoIGlmIGNvbmRpdGlvbiBpcyB0cnVlLCBvcGVyYW5kIDIgaXMgY29uZGl0aW9uIGNvZGUKKyAgICAgIC8vLyBhbmQgb3BlcmFuZCAzIGlzIHRoZSBmbGFnIG9wZXJhbmQgcHJvZHVjZWQgYnkgYSBDTVAgaW5zdHJ1Y3Rpb24uCisgICAgICBCUkNPTkQsCisKKyAgICAgIC8vLyBTRUxFQ1QgLSBPcGVyYW5kcyAwIGFuZCAxIGFyZSBzZWxlY3Rpb24gdmFyaWFibGVzLCBvcGVyYW5kIDIgaXMKKyAgICAgIC8vLyBjb25kaXRpb24gY29kZSBhbmQgb3BlcmFuZCAzIGlzIHRoZSBmbGFnIG9wZXJhbmQuCisgICAgICBTRUxFQ1QKKyAgICB9OworICB9CisKKyAgY2xhc3MgU3lzdGVtWlN1YnRhcmdldDsKKyAgY2xhc3MgU3lzdGVtWlRhcmdldE1hY2hpbmU7CisKKyAgY2xhc3MgU3lzdGVtWlRhcmdldExvd2VyaW5nIDogcHVibGljIFRhcmdldExvd2VyaW5nIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFN5c3RlbVpUYXJnZXRMb3dlcmluZyhTeXN0ZW1aVGFyZ2V0TWFjaGluZSAmVE0pOworCisgICAgLy8vIExvd2VyT3BlcmF0aW9uIC0gUHJvdmlkZSBjdXN0b20gbG93ZXJpbmcgaG9va3MgZm9yIHNvbWUgb3BlcmF0aW9ucy4KKyAgICB2aXJ0dWFsIFNEVmFsdWUgTG93ZXJPcGVyYXRpb24oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgLy8vIGdldFRhcmdldE5vZGVOYW1lIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiBhIHRhcmdldCBzcGVjaWZpYworICAgIC8vLyBEQUcgbm9kZS4KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgICAvLy8gZ2V0RnVuY3Rpb25BbGlnbm1lbnQgLSBSZXR1cm4gdGhlIExvZzIgYWxpZ25tZW50IG9mIHRoaXMgZnVuY3Rpb24uCisgICAgdmlydHVhbCB1bnNpZ25lZCBnZXRGdW5jdGlvbkFsaWdubWVudChjb25zdCBGdW5jdGlvbiAqRikgY29uc3QgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4KKyAgICBnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LCBFVlQgVlQpIGNvbnN0OworICAgIFRhcmdldExvd2VyaW5nOjpDb25zdHJhaW50VHlwZQorICAgIGdldENvbnN0cmFpbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50KSBjb25zdDsKKworICAgIFNEVmFsdWUgTG93ZXJCUl9DQyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclNFTEVDVF9DQyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckdsb2JhbEFkZHJlc3MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJKdW1wVGFibGUoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJDb25zdGFudFBvb2woU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgU0RWYWx1ZSBFbWl0Q21wKFNEVmFsdWUgTEhTLCBTRFZhbHVlIFJIUywKKyAgICAgICAgICAgICAgICAgICAgSVNEOjpDb25kQ29kZSBDQywgU0RWYWx1ZSAmU3lzdGVtWkNDLAorICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgICAvLy8gaXNGUEltbUxlZ2FsIC0gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgY2FuIGluc3RydWN0aW9uIHNlbGVjdCB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIEZQIGltbWVkaWF0ZSBuYXRpdmVseS4gSWYgZmFsc2UsIHRoZSBsZWdhbGl6ZXIgd2lsbAorICAgIC8vLyBtYXRlcmlhbGl6ZSB0aGUgRlAgaW1tZWRpYXRlIGFzIGEgbG9hZCBmcm9tIGEgY29uc3RhbnQgcG9vbC4KKyAgICB2aXJ0dWFsIGJvb2wgaXNGUEltbUxlZ2FsKGNvbnN0IEFQRmxvYXQgJkltbSwgRVZUIFZUKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIFNEVmFsdWUgTG93ZXJDQ0NDYWxsVG8oU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICBTRFZhbHVlIExvd2VyQ0NDQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgU0RWYWx1ZSBMb3dlckNhbGxSZXN1bHQoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBJbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyRm9ybWFsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsIGJvb2wgJmlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJSZXR1cm4oU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgY29uc3QgU3lzdGVtWlN1YnRhcmdldCAmU3VidGFyZ2V0OworICAgIGNvbnN0IFN5c3RlbVpUYXJnZXRNYWNoaW5lICZUTTsKKyAgICBjb25zdCBTeXN0ZW1aUmVnaXN0ZXJJbmZvICpSZWdJbmZvOworICB9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UQVJHRVRfU3lzdGVtWl9JU0VMTE9XRVJJTkdfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpJbnN0ckJ1aWxkZXIuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSW5zdHJCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4NzA2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSW5zdHJCdWlsZGVyLmgKQEAgLTAsMCArMSwxMjggQEAKKy8vPT09LSBTeXN0ZW1aSW5zdHJCdWlsZGVyLmggLSBGdW5jdGlvbnMgdG8gYWlkIGJ1aWxkaW5nICBpbnN0cyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgZnVuY3Rpb25zIHRoYXQgbWF5IGJlIHVzZWQgd2l0aCBCdWlsZE1JIGZyb20gdGhlCisvLyBNYWNoaW5lSW5zdHJCdWlsZGVyLmggZmlsZSB0byBoYW5kbGUgU3lzdGVtWidpc21zIGluIGEgY2xlYW4gd2F5LgorLy8KKy8vIFRoZSBCdWlsZE1lbSBmdW5jdGlvbiBtYXkgYmUgdXNlZCB3aXRoIHRoZSBCdWlsZE1JIGZ1bmN0aW9uIHRvIGFkZCBlbnRpcmUKKy8vIG1lbW9yeSByZWZlcmVuY2VzIGluIGEgc2luZ2xlLCB0eXBlZCwgZnVuY3Rpb24gY2FsbC4KKy8vCisvLyBGb3IgcmVmZXJlbmNlLCB0aGUgb3JkZXIgb2Ygb3BlcmFuZHMgZm9yIG1lbW9yeSByZWZlcmVuY2VzIGlzOgorLy8gKE9wZXJhbmQpLCBCYXNlLCBEaXNwbGFjZW1lbnQsIEluZGV4LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU1lTVEVNWklOU1RSQlVJTERFUl9ICisjZGVmaW5lIFNZU1RFTVpJTlNUUkJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTeXN0ZW1aQWRkcmVzc01vZGUgLSBUaGlzIHN0cnVjdCBob2xkcyBhIGdlbmVyYWxpemVkIGZ1bGwgeDg2IGFkZHJlc3MgbW9kZS4KKy8vLyBUaGUgYmFzZSByZWdpc3RlciBjYW4gYmUgYSBmcmFtZSBpbmRleCwgd2hpY2ggd2lsbCBldmVudHVhbGx5IGJlIHJlcGxhY2VkCisvLy8gd2l0aCBSMTUgb3IgUjExIGFuZCBEaXNwIGJlaW5nIG9mZnNldHRlZCBhY2NvcmRpbmdseS4KK3N0cnVjdCBTeXN0ZW1aQWRkcmVzc01vZGUgeworICBlbnVtIHsKKyAgICBSZWdCYXNlLAorICAgIEZyYW1lSW5kZXhCYXNlCisgIH0gQmFzZVR5cGU7CisKKyAgdW5pb24geworICAgIHVuc2lnbmVkIFJlZzsKKyAgICBpbnQgRnJhbWVJbmRleDsKKyAgfSBCYXNlOworCisgIHVuc2lnbmVkIEluZGV4UmVnOworICBpbnQzMl90IERpc3A7CisgIGNvbnN0IEdsb2JhbFZhbHVlICpHVjsKKworICBTeXN0ZW1aQWRkcmVzc01vZGUoKSA6IEJhc2VUeXBlKFJlZ0Jhc2UpLCBJbmRleFJlZygwKSwgRGlzcCgwKSB7CisgICAgQmFzZS5SZWcgPSAwOworICB9Cit9OworCisvLy8gYWRkRGlyZWN0TWVtIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBhIGRpcmVjdCBtZW1vcnkgcmVmZXJlbmNlIHRvIHRoZQorLy8vIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gLS0gdGhhdCBpcywgYSBkZXJlZmVyZW5jZSBvZiBhbiBhZGRyZXNzIGluIGEgcmVnaXN0ZXIsCisvLy8gd2l0aCBubyBpbmRleCBvciBkaXNwbGFjZW1lbnQuCisvLy8KK3N0YXRpYyBpbmxpbmUgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmCithZGREaXJlY3RNZW0oY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmTUlCLCB1bnNpZ25lZCBSZWcpIHsKKyAgLy8gQmVjYXVzZSBtZW1vcnkgcmVmZXJlbmNlcyBhcmUgYWx3YXlzIHJlcHJlc2VudGVkIHdpdGggMworICAvLyB2YWx1ZXMsIHRoaXMgYWRkczogUmVnLCBbMCwgTm9SZWddIHRvIHRoZSBpbnN0cnVjdGlvbi4KKyAgcmV0dXJuIE1JQi5hZGRSZWcoUmVnKS5hZGRJbW0oMCkuYWRkUmVnKDApOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJgorYWRkT2Zmc2V0KGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQiwgaW50IE9mZnNldCkgeworICByZXR1cm4gTUlCLmFkZEltbShPZmZzZXQpLmFkZFJlZygwKTsKK30KKworLy8vIGFkZFJlZ09mZnNldCAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYSBtZW1vcnkgcmVmZXJlbmNlIG9mIHRoZSBmb3JtCisvLy8gW1JlZyArIE9mZnNldF0sIGkuZS4sIG9uZSB3aXRoIG5vIG9yIGluZGV4LCBidXQgd2l0aCBhCisvLy8gZGlzcGxhY2VtZW50LiBBbiBleGFtcGxlIGlzOiAxMCglcjE1KS4KKy8vLworc3RhdGljIGlubGluZSBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICYKK2FkZFJlZ09mZnNldChjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZNSUIsCisgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBib29sIGlzS2lsbCwgaW50IE9mZnNldCkgeworICByZXR1cm4gYWRkT2Zmc2V0KE1JQi5hZGRSZWcoUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSksIE9mZnNldCk7Cit9CisKKy8vLyBhZGRSZWdSZWcgLSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGEgbWVtb3J5IHJlZmVyZW5jZSBvZiB0aGUgZm9ybToKKy8vLyBbUmVnICsgUmVnXS4KK3N0YXRpYyBpbmxpbmUgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmCithZGRSZWdSZWcoY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmTUlCLAorICAgICAgICAgICAgdW5zaWduZWQgUmVnMSwgYm9vbCBpc0tpbGwxLCB1bnNpZ25lZCBSZWcyLCBib29sIGlzS2lsbDIpIHsKKyAgcmV0dXJuIE1JQi5hZGRSZWcoUmVnMSwgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbDEpKS5hZGRJbW0oMCkKKyAgICAuYWRkUmVnKFJlZzIsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmCithZGRGdWxsQWRkcmVzcyhjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZNSUIsIGNvbnN0IFN5c3RlbVpBZGRyZXNzTW9kZSAmQU0pIHsKKyAgaWYgKEFNLkJhc2VUeXBlID09IFN5c3RlbVpBZGRyZXNzTW9kZTo6UmVnQmFzZSkKKyAgICBNSUIuYWRkUmVnKEFNLkJhc2UuUmVnKTsKKyAgZWxzZSBpZiAoQU0uQmFzZVR5cGUgPT0gU3lzdGVtWkFkZHJlc3NNb2RlOjpGcmFtZUluZGV4QmFzZSkKKyAgICBNSUIuYWRkRnJhbWVJbmRleChBTS5CYXNlLkZyYW1lSW5kZXgpOworICBlbHNlCisgICAgYXNzZXJ0KDApOworCisgIHJldHVybiBNSUIuYWRkSW1tKEFNLkRpc3ApLmFkZFJlZyhBTS5JbmRleFJlZyk7Cit9CisKKy8vLyBhZGRGcmFtZVJlZmVyZW5jZSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYSByZWZlcmVuY2UgdG8gdGhlIGJhc2Ugb2YKKy8vLyBhbiBhYnN0cmFjdCBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhpcworLy8vIHJlZmVyZW5jZSBoYXMgYmFzZSByZWdpc3RlciBhcyB0aGUgRnJhbWVJbmRleCBvZmZzZXQgdW50aWwgaXQgaXMgcmVzb2x2ZWQuCisvLy8gVGhpcyBhbGxvd3MgYSBjb25zdGFudCBvZmZzZXQgdG8gYmUgc3BlY2lmaWVkIGFzIHdlbGwuLi4KKy8vLworc3RhdGljIGlubGluZSBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICYKK2FkZEZyYW1lUmVmZXJlbmNlKGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQiwgaW50IEZJLCBpbnQgT2Zmc2V0ID0gMCkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gTUlCOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1JLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVGcmFtZUluZm8gJk1GSSA9ICpNRi5nZXRGcmFtZUluZm8oKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS0+Z2V0RGVzYygpOworICB1bnNpZ25lZCBGbGFncyA9IDA7CisgIGlmIChUSUQubWF5TG9hZCgpKQorICAgIEZsYWdzIHw9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT0xvYWQ7CisgIGlmIChUSUQubWF5U3RvcmUoKSkKKyAgICBGbGFncyB8PSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9TdG9yZTsKKyAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgTUYuZ2V0TWFjaGluZU1lbU9wZXJhbmQoUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZJLmdldE9iamVjdFNpemUoRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RBbGlnbm1lbnQoRkkpKTsKKyAgcmV0dXJuIGFkZE9mZnNldChNSUIuYWRkRnJhbWVJbmRleChGSSksIE9mZnNldCkKKyAgICAgICAgICAgIC5hZGRNZW1PcGVyYW5kKE1NTyk7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpJbnN0ckZQLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpJbnN0ckZQLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NTgyODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWkluc3RyRlAudGQKQEAgLTAsMCArMSwzNDAgQEAKKy8vPT09LSBTeXN0ZW1aSW5zdHJGUC50ZCAtIFN5c3RlbVogRlAgSW5zdHJ1Y3Rpb24gZGVmcyAtLS0tLS0tLSotIHRibGdlbi0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIFN5c3RlbVogKGJpbmFyeSkgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGluIAorLy8gVGFibGVHZW4gZm9ybWF0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEZJWE1FOiBtdWx0aWNsYXNzaWZ5IQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRlAgUGF0dGVybiBmcmFnbWVudHMKKworZGVmIGZwaW1tMCA6IFBhdExlYWY8KGZwaW1tKSwgW3sKKyAgcmV0dXJuIE4tPmlzRXhhY3RseVZhbHVlKCswLjApOworfV0+OworCitkZWYgZnBpbW1uZWcwIDogUGF0TGVhZjwoZnBpbW0pLCBbeworICByZXR1cm4gTi0+aXNFeGFjdGx5VmFsdWUoLTAuMCk7Cit9XT47CisKK2xldCBVc2VzID0gW1BTV10sIHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4geworICBkZWYgU2VsZWN0RjMyIDogUHNldWRvPChvdXRzIEZQMzI6JGRzdCksIChpbnMgRlAzMjokc3JjMSwgRlAzMjokc3JjMiwgaThpbW06JGNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIjIFNlbGVjdEYzMiBQU0VVRE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlAzMjokZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbVpzZWxlY3QgRlAzMjokc3JjMSwgRlAzMjokc3JjMiwgaW1tOiRjYywgUFNXKSldPjsKKyAgZGVmIFNlbGVjdEY2NCA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYzEsIEZQNjQ6JHNyYzIsIGk4aW1tOiRjYyksCisgICAgICAgICAgICAgICAgICAgICAgICAiIyBTZWxlY3RGNjQgUFNFVURPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW1ac2VsZWN0IEZQNjQ6JHNyYzEsIEZQNjQ6JHNyYzIsIGltbTokY2MsIFBTVykpXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNb3ZlIEluc3RydWN0aW9ucworCisvLyBGbG9hdGluZyBwb2ludCBjb25zdGFudCBsb2Fkcy4KK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxLCBpc0FzQ2hlYXBBc0FNb3ZlID0gMSBpbiB7CitkZWYgTERfRnAwMzIgOiBQc2V1ZG88KG91dHMgRlAzMjokZHN0KSwgKGlucyksCisgICAgICAgICAgICAgICAgICAgICAgImx6ZXJcdHskZHN0fSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlAzMjokZHN0LCBmcGltbTApXT47CitkZWYgTERfRnAwNjQgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyksCisgICAgICAgICAgICAgICAgICAgICAgImx6ZHJcdHskZHN0fSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlA2NDokZHN0LCBmcGltbTApXT47Cit9CisKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7CitkZWYgRk1PVjMycnIgOiBQc2V1ZG88KG91dHMgRlAzMjokZHN0KSwgKGlucyBGUDMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICJsZXJcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgW10+OworZGVmIEZNT1Y2NHJyIDogUHNldWRvPChvdXRzIEZQNjQ6JGRzdCksIChpbnMgRlA2NDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAibGRyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK30KKworbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluIHsKK2RlZiBGTU9WMzJybSAgOiBQc2V1ZG88KG91dHMgRlAzMjokZHN0KSwgKGlucyBycmlhZGRyMTI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgImxlXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQMzI6JGRzdCwgKGxvYWQgcnJpYWRkcjEyOiRzcmMpKV0+OworZGVmIEZNT1YzMnJteSA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIHJyaWFkZHI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgImxleVx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDMyOiRkc3QsIChsb2FkIHJyaWFkZHI6JHNyYykpXT47CitkZWYgRk1PVjY0cm0gIDogUHNldWRvPChvdXRzIEZQNjQ6JGRzdCksIChpbnMgcnJpYWRkcjEyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICJsZFx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChsb2FkIHJyaWFkZHIxMjokc3JjKSldPjsKK2RlZiBGTU9WNjRybXkgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBycmlhZGRyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICJsZHlcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlA2NDokZHN0LCAobG9hZCBycmlhZGRyOiRzcmMpKV0+OworfQorCitkZWYgRk1PVjMybXIgIDogUHNldWRvPChvdXRzKSwgKGlucyBycmlhZGRyMTI6JGRzdCwgRlAzMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgInN0ZVx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBGUDMyOiRzcmMsIHJyaWFkZHIxMjokZHN0KV0+OworZGVmIEZNT1YzMm1yeSA6IFBzZXVkbzwob3V0cyksIChpbnMgcnJpYWRkcjokZHN0LCBGUDMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAic3RleVx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBGUDMyOiRzcmMsIHJyaWFkZHI6JGRzdCldPjsKK2RlZiBGTU9WNjRtciAgOiBQc2V1ZG88KG91dHMpLCAoaW5zIHJyaWFkZHIxMjokZHN0LCBGUDY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAic3RkXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIEZQNjQ6JHNyYywgcnJpYWRkcjEyOiRkc3QpXT47CitkZWYgRk1PVjY0bXJ5IDogUHNldWRvPChvdXRzKSwgKGlucyBycmlhZGRyOiRkc3QsIEZQNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJzdGR5XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIEZQNjQ6JHNyYywgcnJpYWRkcjokZHN0KV0+OworCitkZWYgRkNPUFlTSUdOMzIgOiBQc2V1ZG88KG91dHMgRlAzMjokZHN0KSwgKGlucyBGUDMyOiRzcmMxLCBGUDMyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY3BzZHJcdHskZHN0LCAkc3JjMiwgJHNyYzF9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDMyOiRkc3QsIChmY29weXNpZ24gRlAzMjokc3JjMSwgRlAzMjokc3JjMikpXT47CitkZWYgRkNPUFlTSUdONjQgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBGUDY0OiRzcmMxLCBGUDY0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY3BzZHJcdHskZHN0LCAkc3JjMiwgJHNyYzF9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChmY29weXNpZ24gRlA2NDokc3JjMSwgRlA2NDokc3JjMikpXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBcml0aG1ldGljIEluc3RydWN0aW9ucworCisKK2xldCBEZWZzID0gW1BTV10gaW4geworZGVmIEZORUczMnJyIDogUHNldWRvPChvdXRzIEZQMzI6JGRzdCksIChpbnMgRlAzMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgImxjZWJyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDMyOiRkc3QsIChmbmVnIEZQMzI6JHNyYykpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBGTkVHNjRyciA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJsY2Riclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlA2NDokZHN0LCAoZm5lZyBGUDY0OiRzcmMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CisKK2RlZiBGQUJTMzJyciA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEZQMzI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJscGViclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlAzMjokZHN0LCAoZmFicyBGUDMyOiRzcmMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgRkFCUzY0cnIgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBGUDY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAibHBkYnJcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGZhYnMgRlA2NDokc3JjKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworCitkZWYgRk5BQlMzMnJyIDogUHNldWRvPChvdXRzIEZQMzI6JGRzdCksIChpbnMgRlAzMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgImxuZWJyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDMyOiRkc3QsIChmbmVnKGZhYnMgRlAzMjokc3JjKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBGTkFCUzY0cnIgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBGUDY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAibG5kYnJcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGZuZWcoZmFicyBGUDY0OiRzcmMpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworfQorCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7CitsZXQgRGVmcyA9IFtQU1ddIGluIHsKK2xldCBpc0NvbW11dGFibGUgPSAxIGluIHsgLy8gWCA9IEFERCBZLCBaICA9PSBYID0gQUREIFosIFkKK2RlZiBGQUREMzJyciA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEZQMzI6JHNyYzEsIEZQMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAiYWViclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQMzI6JGRzdCwgKGZhZGQgRlAzMjokc3JjMSwgRlAzMjokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBGQURENjRyciA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYzEsIEZQNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAiYWRiclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGZhZGQgRlA2NDokc3JjMSwgRlA2NDokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK30KKworZGVmIEZBREQzMnJtIDogUHNldWRvPChvdXRzIEZQMzI6JGRzdCksIChpbnMgRlAzMjokc3JjMSwgcnJpYWRkcjEyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgImFlYlx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQMzI6JGRzdCwgKGZhZGQgRlAzMjokc3JjMSwgKGxvYWQgcnJpYWRkcjEyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBGQURENjRybSA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYzEsIHJyaWFkZHIxMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICJhZGJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChmYWRkIEZQNjQ6JHNyYzEsIChsb2FkIHJyaWFkZHIxMjokc3JjMikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CisKK2RlZiBGU1VCMzJyciA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEZQMzI6JHNyYzEsIEZQMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAic2Viclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQMzI6JGRzdCwgKGZzdWIgRlAzMjokc3JjMSwgRlAzMjokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBGU1VCNjRyciA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYzEsIEZQNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAic2Riclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGZzdWIgRlA2NDokc3JjMSwgRlA2NDokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKKworZGVmIEZTVUIzMnJtIDogUHNldWRvPChvdXRzIEZQMzI6JGRzdCksIChpbnMgRlAzMjokc3JjMSwgcnJpYWRkcjEyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgInNlYlx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQMzI6JGRzdCwgKGZzdWIgRlAzMjokc3JjMSwgKGxvYWQgcnJpYWRkcjEyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBGU1VCNjRybSA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYzEsIHJyaWFkZHIxMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICJzZGJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChmc3ViIEZQNjQ6JHNyYzEsIChsb2FkIHJyaWFkZHIxMjokc3JjMikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47Cit9IC8vIERlZnMgPSBbUFNXXQorCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7IC8vIFggPSBNVUwgWSwgWiAgPT0gWCA9IE1VTCBaLCBZCitkZWYgRk1VTDMycnIgOiBQc2V1ZG88KG91dHMgRlAzMjokZHN0KSwgKGlucyBGUDMyOiRzcmMxLCBGUDMyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm1lZWJyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlAzMjokZHN0LCAoZm11bCBGUDMyOiRzcmMxLCBGUDMyOiRzcmMyKSldPjsKK2RlZiBGTVVMNjRyciA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYzEsIEZQNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAibWRiclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGZtdWwgRlA2NDokc3JjMSwgRlA2NDokc3JjMikpXT47Cit9CisKK2RlZiBGTVVMMzJybSA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEZQMzI6JHNyYzEsIHJyaWFkZHIxMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICJtZWViXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlAzMjokZHN0LCAoZm11bCBGUDMyOiRzcmMxLCAobG9hZCBycmlhZGRyMTI6JHNyYzIpKSldPjsKK2RlZiBGTVVMNjRybSA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYzEsIHJyaWFkZHIxMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICJtZGJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChmbXVsIEZQNjQ6JHNyYzEsIChsb2FkIHJyaWFkZHIxMjokc3JjMikpKV0+OworCitkZWYgRk1BREQzMnJyIDogUHNldWRvPChvdXRzIEZQMzI6JGRzdCksIChpbnMgRlAzMjokc3JjMSwgRlAzMjokc3JjMiwgRlAzMjokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICAgICJtYWViclx0eyRkc3QsICRzcmMzLCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDMyOiRkc3QsIChmYWRkIChmbXVsIEZQMzI6JHNyYzIsIEZQMzI6JHNyYzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQMzI6JHNyYzEpKV0+OworZGVmIEZNQUREMzJybSA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEZQMzI6JHNyYzEsIHJyaWFkZHIxMjokc3JjMiwgRlAzMjokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICAgICJtYWViXHR7JGRzdCwgJHNyYzMsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQMzI6JGRzdCwgKGZhZGQgKGZtdWwgKGxvYWQgcnJpYWRkcjEyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlAzMjokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlAzMjokc3JjMSkpXT47CisKK2RlZiBGTUFERDY0cnIgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBGUDY0OiRzcmMxLCBGUDY0OiRzcmMyLCBGUDY0OiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm1hZGJyXHR7JGRzdCwgJHNyYzMsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGZhZGQgKGZtdWwgRlA2NDokc3JjMiwgRlA2NDokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlA2NDokc3JjMSkpXT47CitkZWYgRk1BREQ2NHJtIDogUHNldWRvPChvdXRzIEZQNjQ6JGRzdCksIChpbnMgRlA2NDokc3JjMSwgcnJpYWRkcjEyOiRzcmMyLCBGUDY0OiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm1hZGJcdHskZHN0LCAkc3JjMywgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlA2NDokZHN0LCAoZmFkZCAoZm11bCAobG9hZCBycmlhZGRyMTI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUDY0OiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUDY0OiRzcmMxKSldPjsKKworZGVmIEZNU1VCMzJyciA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEZQMzI6JHNyYzEsIEZQMzI6JHNyYzIsIEZQMzI6JHNyYzMpLAorICAgICAgICAgICAgICAgICAgICAgICAibXNlYnJcdHskZHN0LCAkc3JjMywgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlAzMjokZHN0LCAoZnN1YiAoZm11bCBGUDMyOiRzcmMyLCBGUDMyOiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUDMyOiRzcmMxKSldPjsKK2RlZiBGTVNVQjMycm0gOiBQc2V1ZG88KG91dHMgRlAzMjokZHN0KSwgKGlucyBGUDMyOiRzcmMxLCBycmlhZGRyMTI6JHNyYzIsIEZQMzI6JHNyYzMpLAorICAgICAgICAgICAgICAgICAgICAgICAibXNlYlx0eyRkc3QsICRzcmMzLCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDMyOiRkc3QsIChmc3ViIChmbXVsIChsb2FkIHJyaWFkZHIxMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQMzI6JHNyYzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQMzI6JHNyYzEpKV0+OworCitkZWYgRk1TVUI2NHJyIDogUHNldWRvPChvdXRzIEZQNjQ6JGRzdCksIChpbnMgRlA2NDokc3JjMSwgRlA2NDokc3JjMiwgRlA2NDokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICAgICJtc2Riclx0eyRkc3QsICRzcmMzLCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChmc3ViIChmbXVsIEZQNjQ6JHNyYzIsIEZQNjQ6JHNyYzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQNjQ6JHNyYzEpKV0+OworZGVmIEZNU1VCNjRybSA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYzEsIHJyaWFkZHIxMjokc3JjMiwgRlA2NDokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICAgICJtc2RiXHR7JGRzdCwgJHNyYzMsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGZzdWIgKGZtdWwgKGxvYWQgcnJpYWRkcjEyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlA2NDokc3JjMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlA2NDokc3JjMSkpXT47CisKK2RlZiBGRElWMzJyciA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEZQMzI6JHNyYzEsIEZQMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAiZGViclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQMzI6JGRzdCwgKGZkaXYgRlAzMjokc3JjMSwgRlAzMjokc3JjMikpXT47CitkZWYgRkRJVjY0cnIgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBGUDY0OiRzcmMxLCBGUDY0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgImRkYnJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChmZGl2IEZQNjQ6JHNyYzEsIEZQNjQ6JHNyYzIpKV0+OworCitkZWYgRkRJVjMycm0gOiBQc2V1ZG88KG91dHMgRlAzMjokZHN0KSwgKGlucyBGUDMyOiRzcmMxLCBycmlhZGRyMTI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAiZGViXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlAzMjokZHN0LCAoZmRpdiBGUDMyOiRzcmMxLCAobG9hZCBycmlhZGRyMTI6JHNyYzIpKSldPjsKK2RlZiBGRElWNjRybSA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIEZQNjQ6JHNyYzEsIHJyaWFkZHIxMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICJkZGJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChmZGl2IEZQNjQ6JHNyYzEsIChsb2FkIHJyaWFkZHIxMjokc3JjMikpKV0+OworCit9IC8vIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIKKworZGVmIEZTUVJUMzJyciA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEZQMzI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJzcWViclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlAzMjokZHN0LCAoZnNxcnQgRlAzMjokc3JjKSldPjsKK2RlZiBGU1FSVDY0cnIgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBGUDY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAic3FkYnJcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGZzcXJ0IEZQNjQ6JHNyYykpXT47CisKK2RlZiBGU1FSVDMycm0gOiBQc2V1ZG88KG91dHMgRlAzMjokZHN0KSwgKGlucyBycmlhZGRyMTI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJzcWViXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDMyOiRkc3QsIChmc3FydCAobG9hZCBycmlhZGRyMTI6JHNyYykpKV0+OworZGVmIEZTUVJUNjRybSA6IFBzZXVkbzwob3V0cyBGUDY0OiRkc3QpLCAoaW5zIHJyaWFkZHIxMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgInNxZGJcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGZzcXJ0IChsb2FkIHJyaWFkZHIxMjokc3JjKSkpXT47CisKK2RlZiBGUk9VTkQ2NHIzMiA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEZQNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgImxlZGJyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQMzI6JGRzdCwgKGZyb3VuZCBGUDY0OiRzcmMpKV0+OworCitkZWYgRkVYVDMycjY0ICAgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBGUDMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJsZGViclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChmZXh0ZW5kIEZQMzI6JHNyYykpXT47CitkZWYgRkVYVDMybTY0ICAgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBycmlhZGRyMTI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgImxkZWJcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlA2NDokZHN0LCAoZmV4dGVuZCAobG9hZCBycmlhZGRyMTI6JHNyYykpKV0+OworCitsZXQgRGVmcyA9IFtQU1ddIGluIHsKK2RlZiBGQ09OVkZQMzIgICA6IFBzZXVkbzwob3V0cyBGUDMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgImNlZmJyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQMzI6JGRzdCwgKHNpbnRfdG9fZnAgR1IzMjokc3JjKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgRkNPTlZGUDMycjY0OiBQc2V1ZG88KG91dHMgRlAzMjokZHN0KSwgKGlucyBHUjY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjZWdiclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDMyOiRkc3QsIChzaW50X3RvX2ZwIEdSNjQ6JHNyYykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworCitkZWYgRkNPTlZGUDY0cjMyOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBHUjMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjZGZiclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUDY0OiRkc3QsIChzaW50X3RvX2ZwIEdSMzI6JHNyYykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworZGVmIEZDT05WRlA2NCAgIDogUHNldWRvPChvdXRzIEZQNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2RnYnJcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlA2NDokZHN0LCAoc2ludF90b19mcCBHUjY0OiRzcmMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKKworZGVmIEZDT05WR1IzMiAgIDogUHNldWRvPChvdXRzIEdSMzI6JGRzdCksIChpbnMgRlAzMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2ZlYnJcdHskZHN0LCA1LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoZnBfdG9fc2ludCBGUDMyOiRzcmMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBGQ09OVkdSMzJyNjQ6IFBzZXVkbzwob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEZQNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgImNmZGJyXHR7JGRzdCwgNSwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKGZwX3RvX3NpbnQgRlA2NDokc3JjKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CisKK2RlZiBGQ09OVkdSNjRyMzI6IFBzZXVkbzwob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEZQMzI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgImNnZWJyXHR7JGRzdCwgNSwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGZwX3RvX3NpbnQgRlAzMjokc3JjKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgRkNPTlZHUjY0ICAgOiBQc2V1ZG88KG91dHMgR1I2NDokZHN0KSwgKGlucyBGUDY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjZ2Riclx0eyRkc3QsIDUsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChmcF90b19zaW50IEZQNjQ6JHNyYykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworfSAvLyBEZWZzID0gW1BTV10KKworZGVmIEZCQ09OVkc2NCAgIDogUHNldWRvPChvdXRzIEdSNjQ6JGRzdCksIChpbnMgRlA2NDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibGdkclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChiaXRjb252ZXJ0IEZQNjQ6JHNyYykpXT47CitkZWYgRkJDT05WRjY0ICAgOiBQc2V1ZG88KG91dHMgRlA2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJsZGdyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZQNjQ6JGRzdCwgKGJpdGNvbnZlcnQgR1I2NDokc3JjKSldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRlc3QgaW5zdHJ1Y3Rpb25zIChsaWtlIEFORCBidXQgZG8gbm90IHByb2R1Y2UgYW55IHJlc3VsdCkKKworLy8gSW50ZWdlciBjb21wYXJpc29ucworbGV0IERlZnMgPSBbUFNXXSBpbiB7CitkZWYgRkNNUDMycnIgOiBQc2V1ZG88KG91dHMpLCAoaW5zIEZQMzI6JHNyYzEsIEZQMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJjZWJyXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFBTVywgKFN5c3RlbVpjbXAgRlAzMjokc3JjMSwgRlAzMjokc3JjMikpXT47CitkZWYgRkNNUDY0cnIgOiBQc2V1ZG88KG91dHMpLCAoaW5zIEZQNjQ6JHNyYzEsIEZQNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJjZGJyXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFBTVywgKFN5c3RlbVpjbXAgRlA2NDokc3JjMSwgRlA2NDokc3JjMikpXT47CisKK2RlZiBGQ01QMzJybSA6IFBzZXVkbzwob3V0cyksIChpbnMgRlAzMjokc3JjMSwgcnJpYWRkcjEyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiY2ViXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFBTVywgKFN5c3RlbVpjbXAgRlAzMjokc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkIHJyaWFkZHIxMjokc3JjMikpKV0+OworZGVmIEZDTVA2NHJtIDogUHNldWRvPChvdXRzKSwgKGlucyBGUDY0OiRzcmMxLCBycmlhZGRyMTI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJjZGJcdCRzcmMxLCAkc3JjMiIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUFNXLCAoU3lzdGVtWmNtcCBGUDY0OiRzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgcnJpYWRkcjEyOiRzcmMyKSkpXT47Cit9IC8vIERlZnMgPSBbUFNXXQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTm9uLUluc3RydWN0aW9uIFBhdHRlcm5zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBGbG9hdGluZyBwb2ludCBjb25zdGFudCAtMC4wCitkZWYgOiBQYXQ8KGYzMiBmcGltbW5lZzApLCAoRk5FRzMycnIgKExEX0ZwMDMyKSk+OworZGVmIDogUGF0PChmNjQgZnBpbW1uZWcwKSwgKEZORUc2NHJyIChMRF9GcDA2NCkpPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSW5zdHJGb3JtYXRzLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpJbnN0ckZvcm1hdHMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhODk5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSW5zdHJGb3JtYXRzLnRkCkBAIC0wLDAgKzEsMTMzIEBACisvLz09PS0gU3lzdGVtWkluc3RyRm9ybWF0cy50ZCAtIFN5c3RlbVogSW5zdHJ1Y3Rpb24gRm9ybWF0cyAtLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBGb3JtYXQgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGJ5IHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcGFydCBvZiB0aGUKKy8vIGFkLWhvYyBzb2x1dGlvbiB1c2VkIHRvIGVtaXQgbWFjaGluZSBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgYnkgb3VyIG1hY2hpbmUKKy8vIGNvZGUgZW1pdHRlci4KK2NsYXNzIEZvcm1hdDxiaXRzPDU+IHZhbD4geworICBiaXRzPDU+IFZhbHVlID0gdmFsOworfQorCitkZWYgUHNldWRvICAgOiBGb3JtYXQ8MD47CitkZWYgRUZvcm0gICAgOiBGb3JtYXQ8MT47CitkZWYgSUZvcm0gICAgOiBGb3JtYXQ8Mj47CitkZWYgUklGb3JtICAgOiBGb3JtYXQ8Mz47CitkZWYgUklFRm9ybSAgOiBGb3JtYXQ8ND47CitkZWYgUklMRm9ybSAgOiBGb3JtYXQ8NT47CitkZWYgUklTRm9ybSAgOiBGb3JtYXQ8Nj47CitkZWYgUlJGb3JtICAgOiBGb3JtYXQ8Nz47CitkZWYgUlJFRm9ybSAgOiBGb3JtYXQ8OD47CitkZWYgUlJGRm9ybSAgOiBGb3JtYXQ8OT47CitkZWYgUlJSRm9ybSAgOiBGb3JtYXQ8MTA+OworZGVmIFJSU0Zvcm0gIDogRm9ybWF0PDExPjsKK2RlZiBSU0Zvcm0gICA6IEZvcm1hdDwxMj47CitkZWYgUlNJRm9ybSAgOiBGb3JtYXQ8MTM+OworZGVmIFJTSUxGb3JtIDogRm9ybWF0PDE0PjsKK2RlZiBSU1lGb3JtICA6IEZvcm1hdDwxNT47CitkZWYgUlhGb3JtICAgOiBGb3JtYXQ8MTY+OworZGVmIFJYRUZvcm0gIDogRm9ybWF0PDE3PjsKK2RlZiBSWEZGb3JtICA6IEZvcm1hdDwxOD47CitkZWYgUlhZRm9ybSAgOiBGb3JtYXQ8MTk+OworZGVmIFNGb3JtICAgIDogRm9ybWF0PDIwPjsKK2RlZiBTSUZvcm0gICA6IEZvcm1hdDwyMT47CitkZWYgU0lMRm9ybSAgOiBGb3JtYXQ8MjI+OworZGVmIFNJWUZvcm0gIDogRm9ybWF0PDIzPjsKK2RlZiBTU0Zvcm0gICA6IEZvcm1hdDwyND47CitkZWYgU1NFRm9ybSAgOiBGb3JtYXQ8MjU+OworZGVmIFNTRkZvcm0gIDogRm9ybWF0PDI2PjsKKworY2xhc3MgSW5zdFN5c3RlbVo8Yml0czwxNj4gb3AsIEZvcm1hdCBmLCBkYWcgb3V0cywgZGFnIGlucz4gOiBJbnN0cnVjdGlvbiB7CisgIGxldCBOYW1lc3BhY2UgPSAiU3lzdGVtWiI7CisKKyAgYml0czwxNj4gT3Bjb2RlID0gb3A7CisKKyAgRm9ybWF0IEZvcm0gPSBmOworICBiaXRzPDU+IEZvcm1CaXRzID0gRm9ybS5WYWx1ZTsKKworICBkYWcgT3V0T3BlcmFuZExpc3QgPSBvdXRzOworICBkYWcgSW5PcGVyYW5kTGlzdCA9IGluczsKK30KKworY2xhc3MgSTg8Yml0czw4PiBvcCwgRm9ybWF0IGYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCAKKyAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPiAKKyAgOiBJbnN0U3lzdGVtWjwwLCBmLCBvdXRzLCBpbnM+IHsKKyAgbGV0IE9wY29kZXswLTd9ID0gb3A7CisgIGxldCBPcGNvZGV7OC0xNX0gPSAwOworCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGV0IEFzbVN0cmluZyA9IGFzbXN0cjsKK30KKworY2xhc3MgSTEyPGJpdHM8MTI+IG9wLCBGb3JtYXQgZiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIAorICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+IAorICA6IEluc3RTeXN0ZW1aPDAsIGYsIG91dHMsIGlucz4geworICBsZXQgT3Bjb2RlezAtMTF9ID0gb3A7CisgIGxldCBPcGNvZGV7MTItMTV9ID0gMDsKKworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxldCBBc21TdHJpbmcgPSBhc21zdHI7Cit9CisKK2NsYXNzIEkxNjxiaXRzPDE2PiBvcCwgRm9ybWF0IGYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLAorICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSW5zdFN5c3RlbVo8b3AsIGYsIG91dHMsIGlucz4geworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxldCBBc21TdHJpbmcgPSBhc21zdHI7Cit9CisKK2NsYXNzIFJSSTxiaXRzPDg+IG9wLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTg8b3AsIFJSRm9ybSwgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBSSUk8Yml0czwxMj4gb3AsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJMTI8b3AsIFJJRm9ybSwgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBSSUxJPGJpdHM8MTI+IG9wLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTEyPG9wLCBSSUxGb3JtLCBvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj47CisKK2NsYXNzIFJSRUk8Yml0czwxNj4gb3AsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJMTY8b3AsIFJSRUZvcm0sIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworY2xhc3MgUlhJPGJpdHM8OD4gb3AsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJODxvcCwgUlhGb3JtLCBvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj4geworICBsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTsKK30KKworY2xhc3MgUlhZSTxiaXRzPDE2PiBvcCwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEkxNjxvcCwgUlhZRm9ybSwgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCitjbGFzcyBSU0k8Yml0czw4PiBvcCwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEk4PG9wLCBSU0Zvcm0sIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBBZGRlZENvbXBsZXhpdHkgPSAxOworfQorCitjbGFzcyBSU1lJPGJpdHM8MTY+IG9wLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTE2PG9wLCBSU1lGb3JtLCBvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj47CisKK2NsYXNzIFNJSTxiaXRzPDg+IG9wLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogSTg8b3AsIFNJRm9ybSwgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEFkZGVkQ29tcGxleGl0eSA9IDE7Cit9CisKK2NsYXNzIFNJWUk8Yml0czwxNj4gb3AsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBJMTY8b3AsIFNJWUZvcm0sIG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPjsKKworY2xhc3MgU0lMSTxiaXRzPDE2PiBvcCwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IEkxNjxvcCwgU0lMRm9ybSwgb3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQc2V1ZG8gaW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBQc2V1ZG88ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgOiBJbnN0U3lzdGVtWjwwLCBQc2V1ZG8sIG91dHMsIGlucz4geworCisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGV0IEFzbVN0cmluZyA9IGFzbXN0cjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSW5zdHJJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSW5zdHJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdiZWQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpJbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsNTg1IEBACisvLz09PS0gU3lzdGVtWkluc3RySW5mby5jcHAgLSBTeXN0ZW1aIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFN5c3RlbVogaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiU3lzdGVtWi5oIgorI2luY2x1ZGUgIlN5c3RlbVpJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJTeXN0ZW1aSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiU3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJTeXN0ZW1aVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlN5c3RlbVpHZW5JbnN0ckluZm8uaW5jIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1N5c3RlbVpJbnN0ckluZm86OlN5c3RlbVpJbnN0ckluZm8oU3lzdGVtWlRhcmdldE1hY2hpbmUgJnRtKQorICA6IFRhcmdldEluc3RySW5mb0ltcGwoU3lzdGVtWkluc3RzLCBhcnJheV9sZW5ndGhvZihTeXN0ZW1aSW5zdHMpKSwKKyAgICBSSSh0bSwgKnRoaXMpLCBUTSh0bSkgeworICAvLyBGaWxsIHRoZSBzcGlsbCBvZmZzZXRzIG1hcAorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3BpbGxPZmZzVGFiW11bMl0gPSB7CisgICAgeyBTeXN0ZW1aOjpSMkQsICAweDEwIH0sCisgICAgeyBTeXN0ZW1aOjpSM0QsICAweDE4IH0sCisgICAgeyBTeXN0ZW1aOjpSNEQsICAweDIwIH0sCisgICAgeyBTeXN0ZW1aOjpSNUQsICAweDI4IH0sCisgICAgeyBTeXN0ZW1aOjpSNkQsICAweDMwIH0sCisgICAgeyBTeXN0ZW1aOjpSN0QsICAweDM4IH0sCisgICAgeyBTeXN0ZW1aOjpSOEQsICAweDQwIH0sCisgICAgeyBTeXN0ZW1aOjpSOUQsICAweDQ4IH0sCisgICAgeyBTeXN0ZW1aOjpSMTBELCAweDUwIH0sCisgICAgeyBTeXN0ZW1aOjpSMTFELCAweDU4IH0sCisgICAgeyBTeXN0ZW1aOjpSMTJELCAweDYwIH0sCisgICAgeyBTeXN0ZW1aOjpSMTNELCAweDY4IH0sCisgICAgeyBTeXN0ZW1aOjpSMTRELCAweDcwIH0sCisgICAgeyBTeXN0ZW1aOjpSMTVELCAweDc4IH0KKyAgfTsKKworICBSZWdTcGlsbE9mZnNldHMuZ3JvdyhTeXN0ZW1aOjpOVU1fVEFSR0VUX1JFR1MpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBhcnJheV9sZW5ndGhvZihTcGlsbE9mZnNUYWIpOyBpICE9IGU7ICsraSkKKyAgICBSZWdTcGlsbE9mZnNldHNbU3BpbGxPZmZzVGFiW2ldWzBdXSA9IFNwaWxsT2Zmc1RhYltpXVsxXTsKK30KKworLy8vIGlzR1ZTdHViIC0gUmV0dXJuIHRydWUgaWYgdGhlIEdWIHJlcXVpcmVzIGFuIGV4dHJhIGxvYWQgdG8gZ2V0IHRoZQorLy8vIHJlYWwgYWRkcmVzcy4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0dWU3R1YihHbG9iYWxWYWx1ZSAqR1YsIFN5c3RlbVpUYXJnZXRNYWNoaW5lICZUTSkgeworICByZXR1cm4gVE0uZ2V0U3VidGFyZ2V0PFN5c3RlbVpTdWJ0YXJnZXQ+KCkuR1ZSZXF1aXJlc0V4dHJhTG9hZChHViwgVE0sIGZhbHNlKTsKK30KKwordm9pZCBTeXN0ZW1aSW5zdHJJbmZvOjpzdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLCBpbnQgRnJhbWVJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgdW5zaWduZWQgT3BjID0gMDsKKyAgaWYgKFJDID09ICZTeXN0ZW1aOjpHUjMyUmVnQ2xhc3MgfHwKKyAgICAgIFJDID09ICZTeXN0ZW1aOjpBRERSMzJSZWdDbGFzcykKKyAgICBPcGMgPSBTeXN0ZW1aOjpNT1YzMm1yOworICBlbHNlIGlmIChSQyA9PSAmU3lzdGVtWjo6R1I2NFJlZ0NsYXNzIHx8CisgICAgICAgICAgIFJDID09ICZTeXN0ZW1aOjpBRERSNjRSZWdDbGFzcykgeworICAgIE9wYyA9IFN5c3RlbVo6Ok1PVjY0bXI7CisgIH0gZWxzZSBpZiAoUkMgPT0gJlN5c3RlbVo6OkZQMzJSZWdDbGFzcykgeworICAgIE9wYyA9IFN5c3RlbVo6OkZNT1YzMm1yOworICB9IGVsc2UgaWYgKFJDID09ICZTeXN0ZW1aOjpGUDY0UmVnQ2xhc3MpIHsKKyAgICBPcGMgPSBTeXN0ZW1aOjpGTU9WNjRtcjsKKyAgfSBlbHNlIGlmIChSQyA9PSAmU3lzdGVtWjo6R1I2NFBSZWdDbGFzcykgeworICAgIE9wYyA9IFN5c3RlbVo6Ok1PVjY0UG1yOworICB9IGVsc2UgaWYgKFJDID09ICZTeXN0ZW1aOjpHUjEyOFJlZ0NsYXNzKSB7CisgICAgT3BjID0gU3lzdGVtWjo6TU9WMTI4bXI7CisgIH0gZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIHJlZ2NsYXNzIHRvIHN0b3JlIik7CisKKyAgYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KE9wYykpLCBGcmFtZUlkeCkKKyAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpOworfQorCit2b2lkIFN5c3RlbVpJbnN0ckluZm86OmxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdHsKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgdW5zaWduZWQgT3BjID0gMDsKKyAgaWYgKFJDID09ICZTeXN0ZW1aOjpHUjMyUmVnQ2xhc3MgfHwKKyAgICAgIFJDID09ICZTeXN0ZW1aOjpBRERSMzJSZWdDbGFzcykKKyAgICBPcGMgPSBTeXN0ZW1aOjpNT1YzMnJtOworICBlbHNlIGlmIChSQyA9PSAmU3lzdGVtWjo6R1I2NFJlZ0NsYXNzIHx8CisgICAgICAgICAgIFJDID09ICZTeXN0ZW1aOjpBRERSNjRSZWdDbGFzcykgeworICAgIE9wYyA9IFN5c3RlbVo6Ok1PVjY0cm07CisgIH0gZWxzZSBpZiAoUkMgPT0gJlN5c3RlbVo6OkZQMzJSZWdDbGFzcykgeworICAgIE9wYyA9IFN5c3RlbVo6OkZNT1YzMnJtOworICB9IGVsc2UgaWYgKFJDID09ICZTeXN0ZW1aOjpGUDY0UmVnQ2xhc3MpIHsKKyAgICBPcGMgPSBTeXN0ZW1aOjpGTU9WNjRybTsKKyAgfSBlbHNlIGlmIChSQyA9PSAmU3lzdGVtWjo6R1I2NFBSZWdDbGFzcykgeworICAgIE9wYyA9IFN5c3RlbVo6Ok1PVjY0UHJtOworICB9IGVsc2UgaWYgKFJDID09ICZTeXN0ZW1aOjpHUjEyOFJlZ0NsYXNzKSB7CisgICAgT3BjID0gU3lzdGVtWjo6TU9WMTI4cm07CisgIH0gZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIHJlZ2NsYXNzIHRvIGxvYWQiKTsKKworICBhZGRGcmFtZVJlZmVyZW5jZShCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoT3BjKSwgRGVzdFJlZyksIEZyYW1lSWR4KTsKK30KKwordm9pZCBTeXN0ZW1aSW5zdHJJbmZvOjpjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgRGVidWdMb2MgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdCB7CisgIHVuc2lnbmVkIE9wYzsKKyAgaWYgKFN5c3RlbVo6OkdSNjRSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIE9wYyA9IFN5c3RlbVo6Ok1PVjY0cnI7CisgIGVsc2UgaWYgKFN5c3RlbVo6OkdSMzJSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIE9wYyA9IFN5c3RlbVo6Ok1PVjMycnI7CisgIGVsc2UgaWYgKFN5c3RlbVo6OkdSNjRQUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBPcGMgPSBTeXN0ZW1aOjpNT1Y2NHJyUDsKKyAgZWxzZSBpZiAoU3lzdGVtWjo6R1IxMjhSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIE9wYyA9IFN5c3RlbVo6Ok1PVjEyOHJyOworICBlbHNlIGlmIChTeXN0ZW1aOjpGUDMyUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBPcGMgPSBTeXN0ZW1aOjpGTU9WMzJycjsKKyAgZWxzZSBpZiAoU3lzdGVtWjo6RlA2NFJlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpCisgICAgT3BjID0gU3lzdGVtWjo6Rk1PVjY0cnI7CisgIGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbXBvc3NpYmxlIHJlZy10by1yZWcgY29weSIpOworCisgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE9wYyksIERlc3RSZWcpCisgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSk7Cit9CisKK3Vuc2lnbmVkIFN5c3RlbVpJbnN0ckluZm86OmlzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIFN5c3RlbVo6Ok1PVjMycm06CisgIGNhc2UgU3lzdGVtWjo6TU9WMzJybXk6CisgIGNhc2UgU3lzdGVtWjo6TU9WNjRybToKKyAgY2FzZSBTeXN0ZW1aOjpNT1ZTWDMycm04OgorICBjYXNlIFN5c3RlbVo6Ok1PVlNYMzJybTE2eToKKyAgY2FzZSBTeXN0ZW1aOjpNT1ZTWDY0cm04OgorICBjYXNlIFN5c3RlbVo6Ok1PVlNYNjRybTE2OgorICBjYXNlIFN5c3RlbVo6Ok1PVlNYNjRybTMyOgorICBjYXNlIFN5c3RlbVo6Ok1PVlpYMzJybTg6CisgIGNhc2UgU3lzdGVtWjo6TU9WWlgzMnJtMTY6CisgIGNhc2UgU3lzdGVtWjo6TU9WWlg2NHJtODoKKyAgY2FzZSBTeXN0ZW1aOjpNT1ZaWDY0cm0xNjoKKyAgY2FzZSBTeXN0ZW1aOjpNT1ZaWDY0cm0zMjoKKyAgY2FzZSBTeXN0ZW1aOjpGTU9WMzJybToKKyAgY2FzZSBTeXN0ZW1aOjpGTU9WMzJybXk6CisgIGNhc2UgU3lzdGVtWjo6Rk1PVjY0cm06CisgIGNhc2UgU3lzdGVtWjo6Rk1PVjY0cm15OgorICBjYXNlIFN5c3RlbVo6Ok1PVjY0UHJtOgorICBjYXNlIFN5c3RlbVo6Ok1PVjY0UHJteToKKyAgY2FzZSBTeXN0ZW1aOjpNT1YxMjhybToKKyAgICBpZiAoTUktPmdldE9wZXJhbmQoMSkuaXNGSSgpICYmCisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDIpLmlzSW1tKCkgJiYgTUktPmdldE9wZXJhbmQoMykuaXNSZWcoKSAmJgorICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSA9PSAwICYmIE1JLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpID09IDApIHsKKyAgICAgIEZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOworICAgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgU3lzdGVtWkluc3RySW5mbzo6aXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIFN5c3RlbVo6Ok1PVjMybXI6CisgIGNhc2UgU3lzdGVtWjo6TU9WMzJtcnk6CisgIGNhc2UgU3lzdGVtWjo6TU9WNjRtcjoKKyAgY2FzZSBTeXN0ZW1aOjpNT1YzMm04cjoKKyAgY2FzZSBTeXN0ZW1aOjpNT1YzMm04cnk6CisgIGNhc2UgU3lzdGVtWjo6TU9WMzJtMTZyOgorICBjYXNlIFN5c3RlbVo6Ok1PVjMybTE2cnk6CisgIGNhc2UgU3lzdGVtWjo6TU9WNjRtOHI6CisgIGNhc2UgU3lzdGVtWjo6TU9WNjRtOHJ5OgorICBjYXNlIFN5c3RlbVo6Ok1PVjY0bTE2cjoKKyAgY2FzZSBTeXN0ZW1aOjpNT1Y2NG0xNnJ5OgorICBjYXNlIFN5c3RlbVo6Ok1PVjY0bTMycjoKKyAgY2FzZSBTeXN0ZW1aOjpNT1Y2NG0zMnJ5OgorICBjYXNlIFN5c3RlbVo6OkZNT1YzMm1yOgorICBjYXNlIFN5c3RlbVo6OkZNT1YzMm1yeToKKyAgY2FzZSBTeXN0ZW1aOjpGTU9WNjRtcjoKKyAgY2FzZSBTeXN0ZW1aOjpGTU9WNjRtcnk6CisgIGNhc2UgU3lzdGVtWjo6TU9WNjRQbXI6CisgIGNhc2UgU3lzdGVtWjo6TU9WNjRQbXJ5OgorICBjYXNlIFN5c3RlbVo6Ok1PVjEyOG1yOgorICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgwKS5pc0ZJKCkgJiYKKyAgICAgICAgTUktPmdldE9wZXJhbmQoMSkuaXNJbW0oKSAmJiBNSS0+Z2V0T3BlcmFuZCgyKS5pc1JlZygpICYmCisgICAgICAgIE1JLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpID09IDAgJiYgTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCkgPT0gMCkgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDApLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMykuZ2V0UmVnKCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCitib29sCitTeXN0ZW1aSW5zdHJJbmZvOjpzcGlsbENhbGxlZVNhdmVkUmVnaXN0ZXJzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGlmIChDU0kuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNQkIuZ2V0UGFyZW50KCk7CisgIFN5c3RlbVpNYWNoaW5lRnVuY3Rpb25JbmZvICpNRkkgPSBNRi5nZXRJbmZvPFN5c3RlbVpNYWNoaW5lRnVuY3Rpb25JbmZvPigpOworICB1bnNpZ25lZCBDYWxsZWVGcmFtZVNpemUgPSAwOworCisgIC8vIFNjYW4gdGhlIGNhbGxlZS1zYXZlZCBhbmQgZmluZCB0aGUgYm91bmRzIG9mIHJlZ2lzdGVyIHNwaWxsIGFyZWEuCisgIHVuc2lnbmVkIExvd1JlZyA9IDAsIEhpZ2hSZWcgPSAwLCBTdGFydE9mZnNldCA9IC0xVSwgRW5kT2Zmc2V0ID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gQ1NJW2ldLmdldFJlZygpOworICAgIGlmICghU3lzdGVtWjo6RlA2NFJlZ0NsYXNzLmNvbnRhaW5zKFJlZykpIHsKKyAgICAgIHVuc2lnbmVkIE9mZnNldCA9IFJlZ1NwaWxsT2Zmc2V0c1tSZWddOworICAgICAgQ2FsbGVlRnJhbWVTaXplICs9IDg7CisgICAgICBpZiAoU3RhcnRPZmZzZXQgPiBPZmZzZXQpIHsKKyAgICAgICAgTG93UmVnID0gUmVnOyBTdGFydE9mZnNldCA9IE9mZnNldDsKKyAgICAgIH0KKyAgICAgIGlmIChFbmRPZmZzZXQgPCBPZmZzZXQpIHsKKyAgICAgICAgSGlnaFJlZyA9IFJlZzsgRW5kT2Zmc2V0ID0gUmVnU3BpbGxPZmZzZXRzW1JlZ107CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gU2F2ZSBpbmZvcm1hdGlvbiBmb3IgZXBpbG9ndWUgaW5zZXJ0ZXIuCisgIE1GSS0+c2V0Q2FsbGVlU2F2ZWRGcmFtZVNpemUoQ2FsbGVlRnJhbWVTaXplKTsKKyAgTUZJLT5zZXRMb3dSZWcoTG93UmVnKTsgTUZJLT5zZXRIaWdoUmVnKEhpZ2hSZWcpOworCisgIC8vIFNhdmUgR1BScworICBpZiAoU3RhcnRPZmZzZXQpIHsKKyAgICAvLyBCdWlsZCBhIHN0b3JlIGluc3RydWN0aW9uLiBVc2UgU1RPUkUgTVVMVElQTEUgaW5zdHJ1Y3Rpb24gaWYgdGhlcmUgYXJlIG1hbnkKKyAgICAvLyByZWdpc3RlcnMgdG8gc3RvcmUsIG90aGVyd2lzZSAtIGp1c3QgU1RPUkUuCisgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPQorICAgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KChMb3dSZWcgPT0gSGlnaFJlZyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVo6Ok1PVjY0bXIgOiBTeXN0ZW1aOjpNT1Y2NG1ybSkpKTsKKworICAgIC8vIEFkZCBzdG9yZSBvcGVyYW5kcy4KKyAgICBNSUIuYWRkUmVnKFN5c3RlbVo6OlIxNUQpLmFkZEltbShTdGFydE9mZnNldCk7CisgICAgaWYgKExvd1JlZyA9PSBIaWdoUmVnKQorICAgICAgTUlCLmFkZFJlZygwKTsKKyAgICBNSUIuYWRkUmVnKExvd1JlZywgUmVnU3RhdGU6OktpbGwpOworICAgIGlmIChMb3dSZWcgIT0gSGlnaFJlZykKKyAgICAgIE1JQi5hZGRSZWcoSGlnaFJlZywgUmVnU3RhdGU6OktpbGwpOworCisgICAgLy8gRG8gYSBzZWNvbmQgc2NhbiBhZGRpbmcgcmVncyBhcyBiZWluZyBraWxsZWQgYnkgaW5zdHJ1Y3Rpb24KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ1NJLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIHVuc2lnbmVkIFJlZyA9IENTSVtpXS5nZXRSZWcoKTsKKyAgICAgIC8vIEFkZCB0aGUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIGFzIGxpdmUtaW4uIEl0J3Mga2lsbGVkIGF0IHRoZSBzcGlsbC4KKyAgICAgIE1CQi5hZGRMaXZlSW4oUmVnKTsKKyAgICAgIGlmIChSZWcgIT0gTG93UmVnICYmIFJlZyAhPSBIaWdoUmVnKQorICAgICAgICBNSUIuYWRkUmVnKFJlZywgUmVnU3RhdGU6OkltcGxpY2l0S2lsbCk7CisgICAgfQorICB9CisKKyAgLy8gU2F2ZSBGUFJzCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDU0kuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIFJlZyA9IENTSVtpXS5nZXRSZWcoKTsKKyAgICBpZiAoU3lzdGVtWjo6RlA2NFJlZ0NsYXNzLmNvbnRhaW5zKFJlZykpIHsKKyAgICAgIE1CQi5hZGRMaXZlSW4oUmVnKTsKKyAgICAgIHN0b3JlUmVnVG9TdGFja1Nsb3QoTUJCLCBNSSwgUmVnLCB0cnVlLCBDU0lbaV0uZ2V0RnJhbWVJZHgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlN5c3RlbVo6OkZQNjRSZWdDbGFzcywgJlJJKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbAorU3lzdGVtWkluc3RySW5mbzo6cmVzdG9yZUNhbGxlZVNhdmVkUmVnaXN0ZXJzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgaWYgKENTSS5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBEZWJ1Z0xvYyBETDsKKyAgaWYgKE1JICE9IE1CQi5lbmQoKSkgREwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSZWdJbmZvPSBNRi5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKyAgU3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8gKk1GSSA9IE1GLmdldEluZm88U3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisKKyAgLy8gUmVzdG9yZSBGUCByZWdpc3RlcnMKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gQ1NJW2ldLmdldFJlZygpOworICAgIGlmIChTeXN0ZW1aOjpGUDY0UmVnQ2xhc3MuY29udGFpbnMoUmVnKSkKKyAgICAgIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1CQiwgTUksIFJlZywgQ1NJW2ldLmdldEZyYW1lSWR4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3lzdGVtWjo6RlA2NFJlZ0NsYXNzLCAmUkkpOworICB9CisKKyAgLy8gUmVzdG9yZSBHUCByZWdpc3RlcnMKKyAgdW5zaWduZWQgTG93UmVnID0gTUZJLT5nZXRMb3dSZWcoKSwgSGlnaFJlZyA9IE1GSS0+Z2V0SGlnaFJlZygpOworICB1bnNpZ25lZCBTdGFydE9mZnNldCA9IFJlZ1NwaWxsT2Zmc2V0c1tMb3dSZWddOworCisgIGlmIChTdGFydE9mZnNldCkgeworICAgIC8vIEJ1aWxkIGEgbG9hZCBpbnN0cnVjdGlvbi4gVXNlIExPQUQgTVVMVElQTEUgaW5zdHJ1Y3Rpb24gaWYgdGhlcmUgYXJlIG1hbnkKKyAgICAvLyByZWdpc3RlcnMgdG8gbG9hZCwgb3RoZXJ3aXNlIC0ganVzdCBMT0FELgorICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0KKyAgICAgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldCgoTG93UmVnID09IEhpZ2hSZWcgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1aOjpNT1Y2NHJtIDogU3lzdGVtWjo6TU9WNjRybW0pKSk7CisgICAgLy8gQWRkIHN0b3JlIG9wZXJhbmRzLgorICAgIE1JQi5hZGRSZWcoTG93UmVnLCBSZWdTdGF0ZTo6RGVmaW5lKTsKKyAgICBpZiAoTG93UmVnICE9IEhpZ2hSZWcpCisgICAgICBNSUIuYWRkUmVnKEhpZ2hSZWcsIFJlZ1N0YXRlOjpEZWZpbmUpOworCisgICAgTUlCLmFkZFJlZygoUmVnSW5mby0+aGFzRlAoTUYpID8gU3lzdGVtWjo6UjExRCA6IFN5c3RlbVo6OlIxNUQpKTsKKyAgICBNSUIuYWRkSW1tKFN0YXJ0T2Zmc2V0KTsKKyAgICBpZiAoTG93UmVnID09IEhpZ2hSZWcpCisgICAgICBNSUIuYWRkUmVnKDApOworCisgICAgLy8gRG8gYSBzZWNvbmQgc2NhbiBhZGRpbmcgcmVncyBhcyBiZWluZyBkZWZpbmVkIGJ5IGluc3RydWN0aW9uCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSBDU0lbaV0uZ2V0UmVnKCk7CisgICAgICBpZiAoUmVnICE9IExvd1JlZyAmJiBSZWcgIT0gSGlnaFJlZykKKyAgICAgICAgTUlCLmFkZFJlZyhSZWcsIFJlZ1N0YXRlOjpJbXBsaWNpdERlZmluZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3lzdGVtWkluc3RySW5mbzo6CitSZXZlcnNlQnJhbmNoQ29uZGl0aW9uKFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQpIGNvbnN0IHsKKyAgYXNzZXJ0KENvbmQuc2l6ZSgpID09IDEgJiYgIkludmFsaWQgWGJyYW5jaCBjb25kaXRpb24hIik7CisKKyAgU3lzdGVtWkNDOjpDb25kQ29kZXMgQ0MgPSBzdGF0aWNfY2FzdDxTeXN0ZW1aQ0M6OkNvbmRDb2Rlcz4oQ29uZFswXS5nZXRJbW0oKSk7CisgIENvbmRbMF0uc2V0SW1tKGdldE9wcG9zaXRlQ29uZGl0aW9uKENDKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTeXN0ZW1aSW5zdHJJbmZvOjppc1VucHJlZGljYXRlZFRlcm1pbmF0b3IoY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgIGlmICghVElELmlzVGVybWluYXRvcigpKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ29uZGl0aW9uYWwgYnJhbmNoIGlzIGEgc3BlY2lhbCBjYXNlLgorICBpZiAoVElELmlzQnJhbmNoKCkgJiYgIVRJRC5pc0JhcnJpZXIoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFUSUQuaXNQcmVkaWNhYmxlKCkpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiAhaXNQcmVkaWNhdGVkKE1JKTsKK30KKworYm9vbCBTeXN0ZW1aSW5zdHJJbmZvOjpBbmFseXplQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TW9kaWZ5KSBjb25zdCB7CisgIC8vIFN0YXJ0IGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgYmxvY2sgYW5kIHdvcmsgdXAsIGV4YW1pbmluZyB0aGUKKyAgLy8gdGVybWluYXRvciBpbnN0cnVjdGlvbnMuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLmVuZCgpOworICB3aGlsZSAoSSAhPSBNQkIuYmVnaW4oKSkgeworICAgIC0tSTsKKyAgICBpZiAoSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBXb3JraW5nIGZyb20gdGhlIGJvdHRvbSwgd2hlbiB3ZSBzZWUgYSBub24tdGVybWluYXRvcgorICAgIC8vIGluc3RydWN0aW9uLCB3ZSdyZSBkb25lLgorICAgIGlmICghaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKEkpKQorICAgICAgYnJlYWs7CisKKyAgICAvLyBBIHRlcm1pbmF0b3IgdGhhdCBpc24ndCBhIGJyYW5jaCBjYW4ndCBlYXNpbHkgYmUgaGFuZGxlZAorICAgIC8vIGJ5IHRoaXMgYW5hbHlzaXMuCisgICAgaWYgKCFJLT5nZXREZXNjKCkuaXNCcmFuY2goKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gSGFuZGxlIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMuCisgICAgaWYgKEktPmdldE9wY29kZSgpID09IFN5c3RlbVo6OkpNUCkgeworICAgICAgaWYgKCFBbGxvd01vZGlmeSkgeworICAgICAgICBUQkIgPSBJLT5nZXRPcGVyYW5kKDApLmdldE1CQigpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBhbnkgaW5zdHJ1Y3Rpb25zIGFmdGVyIGEgSk1QLCBkZWxldGUgdGhlbS4KKyAgICAgIHdoaWxlIChsbHZtOjpuZXh0KEkpICE9IE1CQi5lbmQoKSkKKyAgICAgICAgbGx2bTo6bmV4dChJKS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBDb25kLmNsZWFyKCk7CisgICAgICBGQkIgPSAwOworCisgICAgICAvLyBEZWxldGUgdGhlIEpNUCBpZiBpdCdzIGVxdWl2YWxlbnQgdG8gYSBmYWxsLXRocm91Z2guCisgICAgICBpZiAoTUJCLmlzTGF5b3V0U3VjY2Vzc29yKEktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCkpKSB7CisgICAgICAgIFRCQiA9IDA7CisgICAgICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICBJID0gTUJCLmVuZCgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gVEJCIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHVuY29uZGl0aW5hbCBkZXN0aW5hdGlvbi4KKyAgICAgIFRCQiA9IEktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgY29uZGl0aW9uYWwgYnJhbmNoZXMuCisgICAgU3lzdGVtWkNDOjpDb25kQ29kZXMgQnJhbmNoQ29kZSA9IGdldENvbmRGcm9tQnJhbmNoT3BjKEktPmdldE9wY29kZSgpKTsKKyAgICBpZiAoQnJhbmNoQ29kZSA9PSBTeXN0ZW1aQ0M6OklOVkFMSUQpCisgICAgICByZXR1cm4gdHJ1ZTsgIC8vIENhbid0IGhhbmRsZSBpbmRpcmVjdCBicmFuY2guCisKKyAgICAvLyBXb3JraW5nIGZyb20gdGhlIGJvdHRvbSwgaGFuZGxlIHRoZSBmaXJzdCBjb25kaXRpb25hbCBicmFuY2guCisgICAgaWYgKENvbmQuZW1wdHkoKSkgeworICAgICAgRkJCID0gVEJCOworICAgICAgVEJCID0gSS0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICAgIENvbmQucHVzaF9iYWNrKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVJbW0oQnJhbmNoQ29kZSkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSGFuZGxlIHN1YnNlcXVlbnQgY29uZGl0aW9uYWwgYnJhbmNoZXMuIE9ubHkgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFsbAorICAgIC8vIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJyYW5jaCB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbi4KKyAgICBhc3NlcnQoQ29uZC5zaXplKCkgPT0gMSk7CisgICAgYXNzZXJ0KFRCQik7CisKKyAgICAvLyBPbmx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbGwgY29uZGl0aW9uYWwgYnJhbmNoZXMgYnJhbmNoIHRvCisgICAgLy8gdGhlIHNhbWUgZGVzdGluYXRpb24uCisgICAgaWYgKFRCQiAhPSBJLT5nZXRPcGVyYW5kKDApLmdldE1CQigpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBTeXN0ZW1aQ0M6OkNvbmRDb2RlcyBPbGRCcmFuY2hDb2RlID0gKFN5c3RlbVpDQzo6Q29uZENvZGVzKUNvbmRbMF0uZ2V0SW1tKCk7CisgICAgLy8gSWYgdGhlIGNvbmRpdGlvbnMgYXJlIHRoZSBzYW1lLCB3ZSBjYW4gbGVhdmUgdGhlbSBhbG9uZS4KKyAgICBpZiAoT2xkQnJhbmNoQ29kZSA9PSBCcmFuY2hDb2RlKQorICAgICAgY29udGludWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKwordW5zaWduZWQgU3lzdGVtWkluc3RySW5mbzo6UmVtb3ZlQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBNQkIuZW5kKCk7CisgIHVuc2lnbmVkIENvdW50ID0gMDsKKworICB3aGlsZSAoSSAhPSBNQkIuYmVnaW4oKSkgeworICAgIC0tSTsKKyAgICBpZiAoSS0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgIT0gU3lzdGVtWjo6Sk1QICYmCisgICAgICAgIGdldENvbmRGcm9tQnJhbmNoT3BjKEktPmdldE9wY29kZSgpKSA9PSBTeXN0ZW1aQ0M6OklOVkFMSUQpCisgICAgICBicmVhazsKKyAgICAvLyBSZW1vdmUgdGhlIGJyYW5jaC4KKyAgICBJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBJID0gTUJCLmVuZCgpOworICAgICsrQ291bnQ7CisgIH0KKworICByZXR1cm4gQ291bnQ7Cit9CisKK3Vuc2lnbmVkCitTeXN0ZW1aSW5zdHJJbmZvOjpJbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0IHsKKyAgLy8gU2hvdWxkbid0IGJlIGEgZmFsbCB0aHJvdWdoLgorICBhc3NlcnQoVEJCICYmICJJbnNlcnRCcmFuY2ggbXVzdCBub3QgYmUgdG9sZCB0byBpbnNlcnQgYSBmYWxsdGhyb3VnaCIpOworICBhc3NlcnQoKENvbmQuc2l6ZSgpID09IDEgfHwgQ29uZC5zaXplKCkgPT0gMCkgJiYKKyAgICAgICAgICJTeXN0ZW1aIGJyYW5jaCBjb25kaXRpb25zIGhhdmUgb25lIGNvbXBvbmVudCEiKTsKKworICBpZiAoQ29uZC5lbXB0eSgpKSB7CisgICAgLy8gVW5jb25kaXRpb25hbCBicmFuY2g/CisgICAgYXNzZXJ0KCFGQkIgJiYgIlVuY29uZGl0aW9uYWwgYnJhbmNoIHdpdGggbXVsdGlwbGUgc3VjY2Vzc29ycyEiKTsKKyAgICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoU3lzdGVtWjo6Sk1QKSkuYWRkTUJCKFRCQik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBDb25kaXRpb25hbCBicmFuY2guCisgIHVuc2lnbmVkIENvdW50ID0gMDsKKyAgU3lzdGVtWkNDOjpDb25kQ29kZXMgQ0MgPSAoU3lzdGVtWkNDOjpDb25kQ29kZXMpQ29uZFswXS5nZXRJbW0oKTsKKyAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0QnJDb25kKENDKSkuYWRkTUJCKFRCQik7CisgICsrQ291bnQ7CisKKyAgaWYgKEZCQikgeworICAgIC8vIFR3by13YXkgQ29uZGl0aW9uYWwgYnJhbmNoLiBJbnNlcnQgdGhlIHNlY29uZCBicmFuY2guCisgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KFN5c3RlbVo6OkpNUCkpLmFkZE1CQihGQkIpOworICAgICsrQ291bnQ7CisgIH0KKyAgcmV0dXJuIENvdW50OworfQorCitjb25zdCBUYXJnZXRJbnN0ckRlc2MmCitTeXN0ZW1aSW5zdHJJbmZvOjpnZXRCckNvbmQoU3lzdGVtWkNDOjpDb25kQ29kZXMgQ0MpIGNvbnN0IHsKKyAgc3dpdGNoIChDQykgeworICBkZWZhdWx0OgorICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBjb25kaXRpb24gY29kZSEiKTsKKyAgY2FzZSBTeXN0ZW1aQ0M6Ok86ICAgcmV0dXJuIGdldChTeXN0ZW1aOjpKTyk7CisgIGNhc2UgU3lzdGVtWkNDOjpIOiAgIHJldHVybiBnZXQoU3lzdGVtWjo6SkgpOworICBjYXNlIFN5c3RlbVpDQzo6TkxFOiByZXR1cm4gZ2V0KFN5c3RlbVo6OkpOTEUpOworICBjYXNlIFN5c3RlbVpDQzo6TDogICByZXR1cm4gZ2V0KFN5c3RlbVo6OkpMKTsKKyAgY2FzZSBTeXN0ZW1aQ0M6Ok5IRTogcmV0dXJuIGdldChTeXN0ZW1aOjpKTkhFKTsKKyAgY2FzZSBTeXN0ZW1aQ0M6OkxIOiAgcmV0dXJuIGdldChTeXN0ZW1aOjpKTEgpOworICBjYXNlIFN5c3RlbVpDQzo6TkU6ICByZXR1cm4gZ2V0KFN5c3RlbVo6OkpORSk7CisgIGNhc2UgU3lzdGVtWkNDOjpFOiAgIHJldHVybiBnZXQoU3lzdGVtWjo6SkUpOworICBjYXNlIFN5c3RlbVpDQzo6TkxIOiByZXR1cm4gZ2V0KFN5c3RlbVo6OkpOTEgpOworICBjYXNlIFN5c3RlbVpDQzo6SEU6ICByZXR1cm4gZ2V0KFN5c3RlbVo6OkpIRSk7CisgIGNhc2UgU3lzdGVtWkNDOjpOTDogIHJldHVybiBnZXQoU3lzdGVtWjo6Sk5MKTsKKyAgY2FzZSBTeXN0ZW1aQ0M6OkxFOiAgcmV0dXJuIGdldChTeXN0ZW1aOjpKTEUpOworICBjYXNlIFN5c3RlbVpDQzo6Tkg6ICByZXR1cm4gZ2V0KFN5c3RlbVo6OkpOSCk7CisgIGNhc2UgU3lzdGVtWkNDOjpOTzogIHJldHVybiBnZXQoU3lzdGVtWjo6Sk5PKTsKKyAgfQorfQorCitTeXN0ZW1aQ0M6OkNvbmRDb2RlcworU3lzdGVtWkluc3RySW5mbzo6Z2V0Q29uZEZyb21CcmFuY2hPcGModW5zaWduZWQgT3BjKSBjb25zdCB7CisgIHN3aXRjaCAoT3BjKSB7CisgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIFN5c3RlbVpDQzo6SU5WQUxJRDsKKyAgY2FzZSBTeXN0ZW1aOjpKTzogICByZXR1cm4gU3lzdGVtWkNDOjpPOworICBjYXNlIFN5c3RlbVo6OkpIOiAgIHJldHVybiBTeXN0ZW1aQ0M6Okg7CisgIGNhc2UgU3lzdGVtWjo6Sk5MRTogcmV0dXJuIFN5c3RlbVpDQzo6TkxFOworICBjYXNlIFN5c3RlbVo6OkpMOiAgIHJldHVybiBTeXN0ZW1aQ0M6Okw7CisgIGNhc2UgU3lzdGVtWjo6Sk5IRTogcmV0dXJuIFN5c3RlbVpDQzo6TkhFOworICBjYXNlIFN5c3RlbVo6OkpMSDogIHJldHVybiBTeXN0ZW1aQ0M6OkxIOworICBjYXNlIFN5c3RlbVo6OkpORTogIHJldHVybiBTeXN0ZW1aQ0M6Ok5FOworICBjYXNlIFN5c3RlbVo6OkpFOiAgIHJldHVybiBTeXN0ZW1aQ0M6OkU7CisgIGNhc2UgU3lzdGVtWjo6Sk5MSDogcmV0dXJuIFN5c3RlbVpDQzo6TkxIOworICBjYXNlIFN5c3RlbVo6OkpIRTogIHJldHVybiBTeXN0ZW1aQ0M6OkhFOworICBjYXNlIFN5c3RlbVo6OkpOTDogIHJldHVybiBTeXN0ZW1aQ0M6Ok5MOworICBjYXNlIFN5c3RlbVo6OkpMRTogIHJldHVybiBTeXN0ZW1aQ0M6OkxFOworICBjYXNlIFN5c3RlbVo6OkpOSDogIHJldHVybiBTeXN0ZW1aQ0M6Ok5IOworICBjYXNlIFN5c3RlbVo6OkpOTzogIHJldHVybiBTeXN0ZW1aQ0M6Ok5POworICB9Cit9CisKK1N5c3RlbVpDQzo6Q29uZENvZGVzCitTeXN0ZW1aSW5zdHJJbmZvOjpnZXRPcHBvc2l0ZUNvbmRpdGlvbihTeXN0ZW1aQ0M6OkNvbmRDb2RlcyBDQykgY29uc3QgeworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBjb25kaXRpb24hIik7CisgIGNhc2UgU3lzdGVtWkNDOjpPOiAgIHJldHVybiBTeXN0ZW1aQ0M6Ok5POworICBjYXNlIFN5c3RlbVpDQzo6SDogICByZXR1cm4gU3lzdGVtWkNDOjpOSDsKKyAgY2FzZSBTeXN0ZW1aQ0M6Ok5MRTogcmV0dXJuIFN5c3RlbVpDQzo6TEU7CisgIGNhc2UgU3lzdGVtWkNDOjpMOiAgIHJldHVybiBTeXN0ZW1aQ0M6Ok5MOworICBjYXNlIFN5c3RlbVpDQzo6TkhFOiByZXR1cm4gU3lzdGVtWkNDOjpIRTsKKyAgY2FzZSBTeXN0ZW1aQ0M6OkxIOiAgcmV0dXJuIFN5c3RlbVpDQzo6TkxIOworICBjYXNlIFN5c3RlbVpDQzo6TkU6ICByZXR1cm4gU3lzdGVtWkNDOjpFOworICBjYXNlIFN5c3RlbVpDQzo6RTogICByZXR1cm4gU3lzdGVtWkNDOjpORTsKKyAgY2FzZSBTeXN0ZW1aQ0M6Ok5MSDogcmV0dXJuIFN5c3RlbVpDQzo6TEg7CisgIGNhc2UgU3lzdGVtWkNDOjpIRTogIHJldHVybiBTeXN0ZW1aQ0M6Ok5IRTsKKyAgY2FzZSBTeXN0ZW1aQ0M6Ok5MOiAgcmV0dXJuIFN5c3RlbVpDQzo6TDsKKyAgY2FzZSBTeXN0ZW1aQ0M6OkxFOiAgcmV0dXJuIFN5c3RlbVpDQzo6TkxFOworICBjYXNlIFN5c3RlbVpDQzo6Tkg6ICByZXR1cm4gU3lzdGVtWkNDOjpIOworICBjYXNlIFN5c3RlbVpDQzo6Tk86ICByZXR1cm4gU3lzdGVtWkNDOjpPOworICB9Cit9CisKK2NvbnN0IFRhcmdldEluc3RyRGVzYyYKK1N5c3RlbVpJbnN0ckluZm86OmdldExvbmdEaXNwT3BjKHVuc2lnbmVkIE9wYykgY29uc3QgeworICBzd2l0Y2ggKE9wYykgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkRvbid0IGhhdmUgbG9uZyBkaXNwIHZlcnNpb24gb2YgdGhpcyBpbnN0cnVjdGlvbiIpOworICBjYXNlIFN5c3RlbVo6Ok1PVjMybXI6ICAgcmV0dXJuIGdldChTeXN0ZW1aOjpNT1YzMm1yeSk7CisgIGNhc2UgU3lzdGVtWjo6TU9WMzJybTogICByZXR1cm4gZ2V0KFN5c3RlbVo6Ok1PVjMycm15KTsKKyAgY2FzZSBTeXN0ZW1aOjpNT1ZTWDMycm0xNjogcmV0dXJuIGdldChTeXN0ZW1aOjpNT1ZTWDMycm0xNnkpOworICBjYXNlIFN5c3RlbVo6Ok1PVjMybThyOiAgcmV0dXJuIGdldChTeXN0ZW1aOjpNT1YzMm04cnkpOworICBjYXNlIFN5c3RlbVo6Ok1PVjMybTE2cjogcmV0dXJuIGdldChTeXN0ZW1aOjpNT1YzMm0xNnJ5KTsKKyAgY2FzZSBTeXN0ZW1aOjpNT1Y2NG04cjogIHJldHVybiBnZXQoU3lzdGVtWjo6TU9WNjRtOHJ5KTsKKyAgY2FzZSBTeXN0ZW1aOjpNT1Y2NG0xNnI6IHJldHVybiBnZXQoU3lzdGVtWjo6TU9WNjRtMTZyeSk7CisgIGNhc2UgU3lzdGVtWjo6TU9WNjRtMzJyOiByZXR1cm4gZ2V0KFN5c3RlbVo6Ok1PVjY0bTMycnkpOworICBjYXNlIFN5c3RlbVo6Ok1PVjhtaTogICAgcmV0dXJuIGdldChTeXN0ZW1aOjpNT1Y4bWl5KTsKKyAgY2FzZSBTeXN0ZW1aOjpNVUwzMnJtOiAgIHJldHVybiBnZXQoU3lzdGVtWjo6TVVMMzJybXkpOworICBjYXNlIFN5c3RlbVo6OkNNUDMycm06ICAgcmV0dXJuIGdldChTeXN0ZW1aOjpDTVAzMnJteSk7CisgIGNhc2UgU3lzdGVtWjo6VUNNUDMycm06ICByZXR1cm4gZ2V0KFN5c3RlbVo6OlVDTVAzMnJteSk7CisgIGNhc2UgU3lzdGVtWjo6Rk1PVjMybXI6ICByZXR1cm4gZ2V0KFN5c3RlbVo6OkZNT1YzMm1yeSk7CisgIGNhc2UgU3lzdGVtWjo6Rk1PVjY0bXI6ICByZXR1cm4gZ2V0KFN5c3RlbVo6OkZNT1Y2NG1yeSk7CisgIGNhc2UgU3lzdGVtWjo6Rk1PVjMycm06ICByZXR1cm4gZ2V0KFN5c3RlbVo6OkZNT1YzMnJteSk7CisgIGNhc2UgU3lzdGVtWjo6Rk1PVjY0cm06ICByZXR1cm4gZ2V0KFN5c3RlbVo6OkZNT1Y2NHJteSk7CisgIGNhc2UgU3lzdGVtWjo6TU9WNjRQbXI6ICByZXR1cm4gZ2V0KFN5c3RlbVo6Ok1PVjY0UG1yeSk7CisgIGNhc2UgU3lzdGVtWjo6TU9WNjRQcm06ICByZXR1cm4gZ2V0KFN5c3RlbVo6Ok1PVjY0UHJteSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aSW5zdHJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWkluc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDhmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWkluc3RySW5mby5oCkBAIC0wLDAgKzEsMTIwIEBACisvLz09PS0gU3lzdGVtWkluc3RySW5mby5oIC0gU3lzdGVtWiBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBTeXN0ZW1aIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9TWVNURU1aSU5TVFJJTkZPX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfU1lTVEVNWklOU1RSSU5GT19ICisKKyNpbmNsdWRlICJTeXN0ZW1aLmgiCisjaW5jbHVkZSAiU3lzdGVtWlJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL0luZGV4ZWRNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTeXN0ZW1aVGFyZ2V0TWFjaGluZTsKKworLy8vIFN5c3RlbVpJSSAtIFRoaXMgbmFtZXNwYWNlIGhvbGRzIGFsbCBvZiB0aGUgdGFyZ2V0IHNwZWNpZmljIGZsYWdzIHRoYXQKKy8vLyBpbnN0cnVjdGlvbiBpbmZvIHRyYWNrcy4KKy8vLworbmFtZXNwYWNlIFN5c3RlbVpJSSB7CisgIGVudW0geworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgICAvLyBTeXN0ZW1aIFNwZWNpZmljIE1hY2hpbmVPcGVyYW5kIGZsYWdzLgorCisgICAgTU9fTk9fRkxBRyA9IDAsCisKKyAgICAvLy8gTU9fR09URU5UIC0gT24gYSBzeW1ib2wgb3BlcmFuZCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBpbW1lZGlhdGUgaXMKKyAgICAvLy8gdGhlIG9mZnNldCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbCBuYW1lIGZyb20gdGhlIGJhc2Ugb2YgdGhlIEdPVC4KKyAgICAvLy8KKyAgICAvLy8gICAgU1lNQk9MX0xBQkVMIEBHT1RFTlQKKyAgICBNT19HT1RFTlQgPSAxLAorCisgICAgLy8vIE1PX1BMVCAtIE9uIGEgc3ltYm9sIG9wZXJhbmQgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1tZWRpYXRlIGlzCisgICAgLy8vIG9mZnNldCB0byB0aGUgUExUIGVudHJ5IG9mIHN5bWJvbCBuYW1lIGZyb20gdGhlIGN1cnJlbnQgY29kZSBsb2NhdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gICAgU1lNQk9MX0xBQkVMIEBQTFQKKyAgICBNT19QTFQgPSAyCisgIH07Cit9CisKK2NsYXNzIFN5c3RlbVpJbnN0ckluZm8gOiBwdWJsaWMgVGFyZ2V0SW5zdHJJbmZvSW1wbCB7CisgIGNvbnN0IFN5c3RlbVpSZWdpc3RlckluZm8gUkk7CisgIFN5c3RlbVpUYXJnZXRNYWNoaW5lICZUTTsKKyAgSW5kZXhlZE1hcDx1bnNpZ25lZD4gUmVnU3BpbGxPZmZzZXRzOworcHVibGljOgorICBleHBsaWNpdCBTeXN0ZW1aSW5zdHJJbmZvKFN5c3RlbVpUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgLy8vIGdldFJlZ2lzdGVySW5mbyAtIFRhcmdldEluc3RySW5mbyBpcyBhIHN1cGVyc2V0IG9mIE1SZWdpc3RlciBpbmZvLiAgQXMKKyAgLy8vIHN1Y2gsIHdoZW5ldmVyIGEgY2xpZW50IGhhcyBhbiBpbnN0YW5jZSBvZiBpbnN0cnVjdGlvbiBpbmZvLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBiZSBhYmxlIHRvIGdldCByZWdpc3RlciBpbmZvIGFzIHdlbGwgKHRocm91Z2ggdGhpcyBtZXRob2QpLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBTeXN0ZW1aUmVnaXN0ZXJJbmZvICZnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBSSTsgfQorCisgIHZpcnR1YWwgdm9pZCBjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdDsKKworICB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisgIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBzdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIHNwaWxsQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgcmVzdG9yZUNhbGxlZVNhdmVkUmVnaXN0ZXJzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgYm9vbCBSZXZlcnNlQnJhbmNoQ29uZGl0aW9uKFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgQW5hbHl6ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqJlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dNb2RpZnkpIGNvbnN0OworICB2aXJ0dWFsIHVuc2lnbmVkIEluc2VydEJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jayAqVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBETCkgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgUmVtb3ZlQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0OworCisgIFN5c3RlbVpDQzo6Q29uZENvZGVzIGdldE9wcG9zaXRlQ29uZGl0aW9uKFN5c3RlbVpDQzo6Q29uZENvZGVzIENDKSBjb25zdDsKKyAgU3lzdGVtWkNDOjpDb25kQ29kZXMgZ2V0Q29uZEZyb21CcmFuY2hPcGModW5zaWduZWQgT3BjKSBjb25zdDsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjJiBnZXRCckNvbmQoU3lzdGVtWkNDOjpDb25kQ29kZXMgQ0MpIGNvbnN0OworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MmIGdldExvbmdEaXNwT3BjKHVuc2lnbmVkIE9wYykgY29uc3Q7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjJiBnZXRNZW1vcnlJbnN0cih1bnNpZ25lZCBPcGMsIGludDY0X3QgT2Zmc2V0ID0gMCkgY29uc3QgeworICAgIGlmIChPZmZzZXQgPCAwIHx8IE9mZnNldCA+PSA0MDk2KQorICAgICAgcmV0dXJuIGdldExvbmdEaXNwT3BjKE9wYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGdldChPcGMpOworICB9Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpJbnN0ckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWkluc3RySW5mby50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGYwN2MwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpJbnN0ckluZm8udGQKQEAgLTAsMCArMSwxMTQ3IEBACisvLz09PS0gU3lzdGVtWkluc3RySW5mby50ZCAtIFN5c3RlbVogSW5zdHJ1Y3Rpb24gZGVmcyAtLS0tLS0tLS0qLSB0YmxnZW4tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBTeXN0ZW1aIGluc3RydWN0aW9ucyBpbiBUYWJsZUdlbiBmb3JtYXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFN5c3RlbVogSW5zdHJ1Y3Rpb24gUHJlZGljYXRlIERlZmluaXRpb25zLgorZGVmIElzWjEwIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQuaXNaMTAoKSI+OworCitpbmNsdWRlICJTeXN0ZW1aSW5zdHJGb3JtYXRzLnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVHlwZSBDb25zdHJhaW50cy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBTRFRDaXNJODxpbnQgT3BOdW0+IDogU0RUQ2lzVlQ8T3BOdW0sIGk4PjsKK2NsYXNzIFNEVENpc0kxNjxpbnQgT3BOdW0+IDogU0RUQ2lzVlQ8T3BOdW0sIGkxNj47CitjbGFzcyBTRFRDaXNJMzI8aW50IE9wTnVtPiA6IFNEVENpc1ZUPE9wTnVtLCBpMzI+OworY2xhc3MgU0RUQ2lzSTY0PGludCBPcE51bT4gOiBTRFRDaXNWVDxPcE51bSwgaTY0PjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFR5cGUgUHJvZmlsZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworZGVmIFNEVF9TeXN0ZW1aQ2FsbCAgICAgICAgIDogU0RUeXBlUHJvZmlsZTwwLCAtMSwgW1NEVENpc1B0clR5PDA+XT47CitkZWYgU0RUX1N5c3RlbVpDYWxsU2VxU3RhcnQgOiBTRENhbGxTZXFTdGFydDxbU0RUQ2lzSTY0PDA+XT47CitkZWYgU0RUX1N5c3RlbVpDYWxsU2VxRW5kICAgOiBTRENhbGxTZXFFbmQ8W1NEVENpc0k2NDwwPiwgU0RUQ2lzSTY0PDE+XT47CitkZWYgU0RUX0NtcFRlc3QgICAgICAgICAgICAgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFtTRFRDaXNJNjQ8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNTYW1lQXM8MSwgMj5dPjsKK2RlZiBTRFRfQnJDb25kICAgICAgICAgICAgICA6IFNEVHlwZVByb2ZpbGU8MCwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0RUQ2lzVlQ8MCwgT3RoZXJWVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc0k4PDE+LCBTRFRDaXNWVDwyLCBpNjQ+XT47CitkZWYgU0RUX1NlbGVjdENDICAgICAgICAgICAgOiBTRFR5cGVQcm9maWxlPDEsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDEsIDI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNJODwzPiwgU0RUQ2lzVlQ8NCwgaTY0Pl0+OworZGVmIFNEVF9BZGRyZXNzICAgICAgICAgICAgIDogU0RUeXBlUHJvZmlsZTwxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNQdHJUeTwwPl0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3lzdGVtWiBTcGVjaWZpYyBOb2RlIERlZmluaXRpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2RlZiBTeXN0ZW1acmV0ZmxhZyA6IFNETm9kZTwiU3lzdGVtWklTRDo6UkVUX0ZMQUciLCBTRFROb25lLAorICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZ10+OworZGVmIFN5c3RlbVpjYWxsICAgIDogU0ROb2RlPCJTeXN0ZW1aSVNEOjpDQUxMIiwgU0RUX1N5c3RlbVpDYWxsLAorICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE91dEZsYWcsIFNETlBPcHRJbkZsYWcsIFNETlBWYXJpYWRpY10+OworZGVmIFN5c3RlbVpjYWxsc2VxX3N0YXJ0IDoKKyAgICAgICAgICAgICAgICAgU0ROb2RlPCJJU0Q6OkNBTExTRVFfU1RBUlQiLCBTRFRfU3lzdGVtWkNhbGxTZXFTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPdXRGbGFnXT47CitkZWYgU3lzdGVtWmNhbGxzZXFfZW5kIDoKKyAgICAgICAgICAgICAgICAgU0ROb2RlPCJJU0Q6OkNBTExTRVFfRU5EIiwgICBTRFRfU3lzdGVtWkNhbGxTZXFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZ10+OworZGVmIFN5c3RlbVpjbXAgICAgIDogU0ROb2RlPCJTeXN0ZW1aSVNEOjpDTVAiLCBTRFRfQ21wVGVzdD47CitkZWYgU3lzdGVtWnVjbXAgICAgOiBTRE5vZGU8IlN5c3RlbVpJU0Q6OlVDTVAiLCBTRFRfQ21wVGVzdD47CitkZWYgU3lzdGVtWmJyY29uZCAgOiBTRE5vZGU8IlN5c3RlbVpJU0Q6OkJSQ09ORCIsIFNEVF9CckNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+OworZGVmIFN5c3RlbVpzZWxlY3QgIDogU0ROb2RlPCJTeXN0ZW1aSVNEOjpTRUxFQ1QiLCBTRFRfU2VsZWN0Q0M+OworZGVmIFN5c3RlbVpwY3JlbHdyYXBwZXIgOiBTRE5vZGU8IlN5c3RlbVpJU0Q6OlBDUmVsYXRpdmVXcmFwcGVyIiwgU0RUX0FkZHJlc3MsIFtdPjsKKworCitpbmNsdWRlICJTeXN0ZW1aT3BlcmFuZHMudGQiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBsaXN0Li4KKworZGVmIEFESkNBTExTVEFDS0RPV04gOiBQc2V1ZG88KG91dHMpLCAoaW5zIGk2NGltbTokYW10KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjQURKQ0FMTFNUQUNLRE9XTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFN5c3RlbVpjYWxsc2VxX3N0YXJ0IHRpbW06JGFtdCldPjsKK2RlZiBBREpDQUxMU1RBQ0tVUCAgIDogUHNldWRvPChvdXRzKSwgKGlucyBpNjRpbW06JGFtdDEsIGk2NGltbTokYW10MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0FESkNBTExTVEFDS1VQIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoU3lzdGVtWmNhbGxzZXFfZW5kIHRpbW06JGFtdDEsIHRpbW06JGFtdDIpXT47CisKK2xldCBVc2VzID0gW1BTV10sIHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4geworICBkZWYgU2VsZWN0MzIgOiBQc2V1ZG88KG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyLCBpOGltbTokY2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiMgU2VsZWN0MzIgUFNFVURPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW1ac2VsZWN0IEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsIGltbTokY2MsIFBTVykpXT47CisgIGRlZiBTZWxlY3Q2NCA6IFBzZXVkbzwob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIsIGk4aW1tOiRjYyksCisgICAgICAgICAgICAgICAgICAgICAgICAiIyBTZWxlY3Q2NCBQU0VVRE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbVpzZWxlY3QgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwgaW1tOiRjYywgUFNXKSldPjsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIENvbnRyb2wgRmxvdyBJbnN0cnVjdGlvbnMuLi4KKy8vCisKKy8vIEZJWE1FOiBQcm92aWRlIHByb3BlciBlbmNvZGluZyEKK2xldCBpc1JldHVybiA9IDEsIGlzVGVybWluYXRvciA9IDEsIGlzQmFycmllciA9IDEsIGhhc0N0cmxEZXAgPSAxIGluIHsKKyAgZGVmIFJFVCA6IFBzZXVkbzwob3V0cyksIChpbnMpLCAiYnJcdCVyMTQiLCBbKFN5c3RlbVpyZXRmbGFnKV0+OworfQorCitsZXQgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxIGluIHsKKyAgbGV0IGlzQmFycmllciA9IDEgaW4geworICAgIGRlZiBKTVAgIDogUHNldWRvPChvdXRzKSwgKGlucyBicnRhcmdldDokZHN0KSwgImpcdHskZHN0fSIsIFsoYnIgYmI6JGRzdCldPjsKKworICAgIGxldCBpc0luZGlyZWN0QnJhbmNoID0gMSBpbgorICAgICAgZGVmIEpNUHIgICA6IFBzZXVkbzwob3V0cyksIChpbnMgR1I2NDokZHN0KSwgImJyXHR7JGRzdH0iLCBbKGJyaW5kIEdSNjQ6JGRzdCldPjsKKyAgfQorCisgIGxldCBVc2VzID0gW1BTV10gaW4geworICAgIGRlZiBKTyAgOiBQc2V1ZG88KG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgImpvXHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoU3lzdGVtWmJyY29uZCBiYjokZHN0LCBTWVNURU1aX0NPTkRfTywgUFNXKV0+OworICAgIGRlZiBKSCAgOiBQc2V1ZG88KG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgImpoXHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoU3lzdGVtWmJyY29uZCBiYjokZHN0LCBTWVNURU1aX0NPTkRfSCwgUFNXKV0+OworICAgIGRlZiBKTkxFOiBQc2V1ZG88KG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgImpubGVcdCRkc3QiLAorICAgICAgICAgICAgICAgICAgICAgWyhTeXN0ZW1aYnJjb25kIGJiOiRkc3QsIFNZU1RFTVpfQ09ORF9OTEUsIFBTVyldPjsKKyAgICBkZWYgSkwgIDogUHNldWRvPChvdXRzKSwgKGlucyBicnRhcmdldDokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICJqbFx0JGRzdCIsCisgICAgICAgICAgICAgICAgICAgICBbKFN5c3RlbVpicmNvbmQgYmI6JGRzdCwgU1lTVEVNWl9DT05EX0wsIFBTVyldPjsKKyAgICBkZWYgSk5IRTogUHNldWRvPChvdXRzKSwgKGlucyBicnRhcmdldDokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICJqbmhlXHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoU3lzdGVtWmJyY29uZCBiYjokZHN0LCBTWVNURU1aX0NPTkRfTkhFLCBQU1cpXT47CisgICAgZGVmIEpMSCA6IFBzZXVkbzwob3V0cyksIChpbnMgYnJ0YXJnZXQ6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAiamxoXHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoU3lzdGVtWmJyY29uZCBiYjokZHN0LCBTWVNURU1aX0NPTkRfTEgsIFBTVyldPjsKKyAgICBkZWYgSk5FIDogUHNldWRvPChvdXRzKSwgKGlucyBicnRhcmdldDokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICJqbmVcdCRkc3QiLAorICAgICAgICAgICAgICAgICAgICAgWyhTeXN0ZW1aYnJjb25kIGJiOiRkc3QsIFNZU1RFTVpfQ09ORF9ORSwgUFNXKV0+OworICAgIGRlZiBKRSAgOiBQc2V1ZG88KG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgImplXHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoU3lzdGVtWmJyY29uZCBiYjokZHN0LCBTWVNURU1aX0NPTkRfRSwgUFNXKV0+OworICAgIGRlZiBKTkxIOiBQc2V1ZG88KG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgImpubGhcdCRkc3QiLAorICAgICAgICAgICAgICAgICAgICAgWyhTeXN0ZW1aYnJjb25kIGJiOiRkc3QsIFNZU1RFTVpfQ09ORF9OTEgsIFBTVyldPjsKKyAgICBkZWYgSkhFIDogUHNldWRvPChvdXRzKSwgKGlucyBicnRhcmdldDokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICJqaGVcdCRkc3QiLAorICAgICAgICAgICAgICAgICAgICAgWyhTeXN0ZW1aYnJjb25kIGJiOiRkc3QsIFNZU1RFTVpfQ09ORF9IRSwgUFNXKV0+OworICAgIGRlZiBKTkwgOiBQc2V1ZG88KG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgImpubFx0JGRzdCIsCisgICAgICAgICAgICAgICAgICAgICBbKFN5c3RlbVpicmNvbmQgYmI6JGRzdCwgU1lTVEVNWl9DT05EX05MLCBQU1cpXT47CisgICAgZGVmIEpMRSA6IFBzZXVkbzwob3V0cyksIChpbnMgYnJ0YXJnZXQ6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAiamxlXHQkZHN0IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoU3lzdGVtWmJyY29uZCBiYjokZHN0LCBTWVNURU1aX0NPTkRfTEUsIFBTVyldPjsKKyAgICBkZWYgSk5IIDogUHNldWRvPChvdXRzKSwgKGlucyBicnRhcmdldDokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICJqbmhcdCRkc3QiLAorICAgICAgICAgICAgICAgICAgICAgWyhTeXN0ZW1aYnJjb25kIGJiOiRkc3QsIFNZU1RFTVpfQ09ORF9OSCwgUFNXKV0+OworICAgIGRlZiBKTk8gOiBQc2V1ZG88KG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgImpub1x0JGRzdCIsCisgICAgICAgICAgICAgICAgICAgICBbKFN5c3RlbVpicmNvbmQgYmI6JGRzdCwgU1lTVEVNWl9DT05EX05PLCBQU1cpXT47CisgIH0gLy8gVXNlcyA9IFtQU1ddCit9IC8vIGlzQnJhbmNoID0gMQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIENhbGwgSW5zdHJ1Y3Rpb25zLi4uCisvLworCitsZXQgaXNDYWxsID0gMSBpbgorICAvLyBBbGwgY2FsbHMgY2xvYmJlciB0aGUgbm9uLWNhbGxlZSBzYXZlZCByZWdpc3RlcnMuIFVzZXMgZm9yIGFyZ3VtZW50CisgIC8vIHJlZ2lzdGVycyBhcmUgYWRkZWQgbWFudWFsbHkuCisgIGxldCBEZWZzID0gW1IwRCwgUjFELCBSMkQsIFIzRCwgUjRELCBSNUQsIFIxNEQsCisgICAgICAgICAgICAgIEYwTCwgRjFMLCBGMkwsIEYzTCwgRjRMLCBGNUwsIEY2TCwgRjdMXSBpbiB7CisgICAgZGVmIENBTExpICAgICA6IFBzZXVkbzwob3V0cyksIChpbnMgaW1tX3BjcmVsOiRkc3QsIHZhcmlhYmxlX29wcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnJhc2xcdCVyMTQsICRkc3QiLCBbKFN5c3RlbVpjYWxsIGltbTokZHN0KV0+OworICAgIGRlZiBDQUxMciAgICAgOiBQc2V1ZG88KG91dHMpLCAoaW5zIEFERFI2NDokZHN0LCB2YXJpYWJsZV9vcHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc3JcdCVyMTQsICRkc3QiLCBbKFN5c3RlbVpjYWxsIEFERFI2NDokZHN0KV0+OworICB9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTWlzY2VsbGFuZW91cyBJbnN0cnVjdGlvbnMuCisvLworCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbgorLy8gRklYTUU6IFByb3ZpZGUgaW1tMTIgdmFyaWFudAorLy8gRklYTUU6IEFkZHJlc3Mgc2hvdWxkIGJlIGhhbGZ3b3JkIGFsaWduZWQuLi4KK2RlZiBMQTY0ciAgOiBSWEk8MHg0NywKKyAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBsYWFkZHI6JHNyYyksCisgICAgICAgICAgICAgICAgICJsYXlcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgbGFhZGRyOiRzcmMpXT47CitkZWYgTEE2NHJtIDogUlhZSTwweDcxRTMsCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIGk2NGltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICJsYXJsXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbVpwY3JlbHdyYXBwZXIgdGdsb2JhbGFkZHI6JHNyYykpXT47CisKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbgorZGVmIE5PUCA6IFBzZXVkbzwob3V0cyksIChpbnMpLCAiIyBuby1vcCIsIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1vdmUgSW5zdHJ1Y3Rpb25zCisKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7CitkZWYgTU9WMzJyciA6IFJSSTwweDE4LAorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgImxyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgW10+OworZGVmIE1PVjY0cnIgOiBSUkVJPDB4QjkwNCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgImxnclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICBbXT47CitkZWYgTU9WMTI4cnIgOiBQc2V1ZG88KG91dHMgR1IxMjg6JGRzdCksIChpbnMgR1IxMjg6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAiIyBNT1YxMjggUFNFVURPIVxuIgorICAgICAgICAgICAgICAgICAgICAgIlx0bGdyXHQke2RzdDpzdWJyZWdfb2RkfSwgJHtzcmM6c3VicmVnX29kZH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICJcdGxnclx0JHtkc3Q6c3VicmVnX2V2ZW59LCAke3NyYzpzdWJyZWdfZXZlbn0iLAorICAgICAgICAgICAgICAgICAgICAgW10+OworZGVmIE1PVjY0cnJQIDogUHNldWRvPChvdXRzIEdSNjRQOiRkc3QpLCAoaW5zIEdSNjRQOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgIiMgTU9WNjRQIFBTRVVETyFcbiIKKyAgICAgICAgICAgICAgICAgICAgICJcdGxyXHQke2RzdDpzdWJyZWdfb2RkfSwgJHtzcmM6c3VicmVnX29kZH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICJcdGxyXHQke2RzdDpzdWJyZWdfZXZlbn0sICR7c3JjOnN1YnJlZ19ldmVufSIsCisgICAgICAgICAgICAgICAgICAgICBbXT47Cit9CisKK2RlZiBNT1ZTWDY0cnIzMiA6IFJSRUk8MHhCOTE0LAorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJsZ2ZyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzZXh0IEdSMzI6JHNyYykpXT47CitkZWYgTU9WWlg2NHJyMzIgOiBSUkVJPDB4QjkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAibGxnZnJcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHpleHQgR1IzMjokc3JjKSldPjsKKworbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEsIGlzQXNDaGVhcEFzQU1vdmUgPSAxIGluIHsKK2RlZiBNT1YzMnJpMTYgOiBSSUk8MHg4QTcsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgczE2aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAibGhpXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIGltbVNFeHQxNjokc3JjKV0+OworZGVmIE1PVjY0cmkxNiA6IFJJSTwweDlBNywKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBzMTZpbW02NDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgImxnaGlcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgaW1tU0V4dDE2OiRzcmMpXT47CisKK2RlZiBNT1Y2NHJpbGwxNiA6IFJJSTwweEZBNSwKKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIGk2NGltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAibGxpbGxcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBpNjRsbDE2OiRzcmMpXT47CitkZWYgTU9WNjRyaWxoMTYgOiBSSUk8MHhFQTUsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpNjRpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgImxsaWxoXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgaTY0bGgxNjokc3JjKV0+OworZGVmIE1PVjY0cmlobDE2IDogUklJPDB4REE1LAorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTY0aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICJsbGlobFx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIGk2NGhsMTY6JHNyYyldPjsKK2RlZiBNT1Y2NHJpaGgxNiA6IFJJSTwweENBNSwKKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIGk2NGltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAibGxpaGhcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBpNjRoaDE2OiRzcmMpXT47CisKK2RlZiBNT1Y2NHJpMzIgOiBSSUxJPDB4MUMwLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBzMzJpbW02NDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICJsZ2ZpXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBpbW1TRXh0MzI6JHNyYyldPjsKK2RlZiBNT1Y2NHJpbG8zMiA6IFJJTEk8MHhGQzAsCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTY0aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAibGxpbGZcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgaTY0bG8zMjokc3JjKV0+OworZGVmIE1PVjY0cmloaTMyIDogUklMSTwweEVDMCwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpNjRpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJsbGloZlx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBpNjRoaTMyOiRzcmMpXT47Cit9CisKK2xldCBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbiB7CitkZWYgTU9WMzJybSAgOiBSWEk8MHg1OCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIHJyaWFkZHIxMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAibFx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChsb2FkIHJyaWFkZHIxMjokc3JjKSldPjsKK2RlZiBNT1YzMnJteSA6IFJYWUk8MHg1OEUzLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIHJyaWFkZHI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJseVx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAobG9hZCBycmlhZGRyOiRzcmMpKV0+OworZGVmIE1PVjY0cm0gIDogUlhZSTwweDA0RTMsCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgcnJpYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgImxnXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChsb2FkIHJyaWFkZHI6JHNyYykpXT47CitkZWYgTU9WNjRQcm0gOiBQc2V1ZG88KG91dHMgR1I2NFA6JGRzdCksIChpbnMgcnJpYWRkcjEyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICIjIE1PVjY0UCBQU0VVRE8hXG4iCisgICAgICAgICAgICAgICAgICAgICAgIlx0bFx0JHtkc3Q6c3VicmVnX29kZH0sICAkc3JjXG4iCisgICAgICAgICAgICAgICAgICAgICAgIlx0bFx0JHtkc3Q6c3VicmVnX2V2ZW59LCA0KyRzcmMiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjRQOiRkc3QsIChsb2FkIHJyaWFkZHIxMjokc3JjKSldPjsKK2RlZiBNT1Y2NFBybXkgOiBQc2V1ZG88KG91dHMgR1I2NFA6JGRzdCksIChpbnMgcnJpYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIiMgTU9WNjRQIFBTRVVETyFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIlx0bHlcdCR7ZHN0OnN1YnJlZ19vZGR9LCAgJHNyY1xuIgorICAgICAgICAgICAgICAgICAgICAgICAiXHRseVx0JHtkc3Q6c3VicmVnX2V2ZW59LCA0KyRzcmMiLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0UDokZHN0LCAobG9hZCBycmlhZGRyOiRzcmMpKV0+OworZGVmIE1PVjEyOHJtIDogUHNldWRvPChvdXRzIEdSMTI4OiRkc3QpLCAoaW5zIHJyaWFkZHI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgIiMgTU9WMTI4IFBTRVVETyFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiXHRsZ1x0JHtkc3Q6c3VicmVnX29kZH0sICAkc3JjXG4iCisgICAgICAgICAgICAgICAgICAgICAgIlx0bGdcdCR7ZHN0OnN1YnJlZ19ldmVufSwgOCskc3JjIiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjEyODokZHN0LCAobG9hZCBycmlhZGRyOiRzcmMpKV0+OworfQorCitkZWYgTU9WMzJtciAgOiBSWEk8MHg1MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgcnJpYWRkcjEyOiRkc3QsIEdSMzI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgInN0XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgR1IzMjokc3JjLCBycmlhZGRyMTI6JGRzdCldPjsKK2RlZiBNT1YzMm1yeSA6IFJYWUk8MHg1MEUzLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgcnJpYWRkcjokZHN0LCBHUjMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAic3R5XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIEdSMzI6JHNyYywgcnJpYWRkcjokZHN0KV0+OworZGVmIE1PVjY0bXIgIDogUlhZSTwweDI0RTMsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBycmlhZGRyOiRkc3QsIEdSNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICJzdGdcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgR1I2NDokc3JjLCBycmlhZGRyOiRkc3QpXT47CitkZWYgTU9WNjRQbXIgOiBQc2V1ZG88KG91dHMpLCAoaW5zIHJyaWFkZHIxMjokZHN0LCBHUjY0UDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAiIyBNT1Y2NFAgUFNFVURPIVxuIgorICAgICAgICAgICAgICAgICAgICAgICJcdHN0XHQke3NyYzpzdWJyZWdfb2RkfSwgJGRzdFxuIgorICAgICAgICAgICAgICAgICAgICAgICJcdHN0XHQke3NyYzpzdWJyZWdfZXZlbn0sIDQrJGRzdCIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBHUjY0UDokc3JjLCBycmlhZGRyMTI6JGRzdCldPjsKK2RlZiBNT1Y2NFBtcnkgOiBQc2V1ZG88KG91dHMpLCAoaW5zIHJyaWFkZHI6JGRzdCwgR1I2NFA6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICIjIE1PVjY0UCBQU0VVRE8hXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJcdHN0eVx0JHtzcmM6c3VicmVnX29kZH0sICRkc3RcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIlx0c3R5XHQke3NyYzpzdWJyZWdfZXZlbn0sIDQrJGRzdCIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgR1I2NFA6JHNyYywgcnJpYWRkcjokZHN0KV0+OworZGVmIE1PVjEyOG1yIDogUHNldWRvPChvdXRzKSwgKGlucyBycmlhZGRyOiRkc3QsIEdSMTI4OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICIjIE1PVjEyOCBQU0VVRE8hXG4iCisgICAgICAgICAgICAgICAgICAgICAgIlx0c3RnXHQke3NyYzpzdWJyZWdfb2RkfSwgJGRzdFxuIgorICAgICAgICAgICAgICAgICAgICAgICJcdHN0Z1x0JHtzcmM6c3VicmVnX2V2ZW59LCA4KyRkc3QiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgR1IxMjg6JHNyYywgcnJpYWRkcjokZHN0KV0+OworCitkZWYgTU9WOG1pICAgIDogU0lJPDB4OTIsCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyByaWFkZHIxMjokZHN0LCBpMzJpOGltbTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgIm12aVx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTggKGkzMiBpMzJpbW1TRXh0ODokc3JjKSwgcmlhZGRyMTI6JGRzdCldPjsKK2RlZiBNT1Y4bWl5ICAgOiBTSVlJPDB4NTJFQiwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyByaWFkZHI6JGRzdCwgaTMyaThpbW06JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAibXZpeVx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWk4IChpMzIgaTMyaW1tU0V4dDg6JHNyYyksIHJpYWRkcjokZHN0KV0+OworCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMiBpbiB7CitkZWYgTU9WMTZtaSAgIDogU0lMSTwweEU1NDQsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgcmlhZGRyMTI6JGRzdCwgczE2aW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgIm12aGhpXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTE2IChpMzIgaTMyaW1tU0V4dDE2OiRzcmMpLCByaWFkZHIxMjokZHN0KV0+LAorICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzWjEwXT47CitkZWYgTU9WMzJtaTE2IDogU0lMSTwweEU1NEMsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgcmlhZGRyMTI6JGRzdCwgczMyaW1tOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgIm12aGlcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChpMzIgaW1tU0V4dDE2OiRzcmMpLCByaWFkZHIxMjokZHN0KV0+LAorICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzWjEwXT47CitkZWYgTU9WNjRtaTE2IDogU0lMSTwweEU1NDgsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgcmlhZGRyMTI6JGRzdCwgczMyaW1tNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAibXZnaGlcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChpNjQgaW1tU0V4dDE2OiRzcmMpLCByaWFkZHIxMjokZHN0KV0+LAorICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzWjEwXT47Cit9CisKKy8vIHNleHRzCitkZWYgTU9WU1gzMnJyOCAgOiBSUkVJPDB4QjkyNiwKKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAibGJyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChzZXh0X2lucmVnIEdSMzI6JHNyYywgaTgpKV0+OworZGVmIE1PVlNYNjRycjggIDogUlJFSTwweEI5MDYsCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgImxnYnJcdHskZHN0LCAkc3JjfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNleHRfaW5yZWcgR1I2NDokc3JjLCBpOCkpXT47CitkZWYgTU9WU1gzMnJyMTYgOiBSUkVJPDB4QjkyNywKKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAibGhyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChzZXh0X2lucmVnIEdSMzI6JHNyYywgaTE2KSldPjsKK2RlZiBNT1ZTWDY0cnIxNiA6IFJSRUk8MHhCOTA3LAorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJsZ2hyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzZXh0X2lucmVnIEdSNjQ6JHNyYywgaTE2KSldPjsKKworLy8gZXh0bG9hZHMKK2RlZiBNT1ZTWDMycm04ICAgOiBSWFlJPDB4NzZFMywKKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgcnJpYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsYlx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHNleHRsb2FkaTMyaTggcnJpYWRkcjokc3JjKSldPjsKK2RlZiBNT1ZTWDMycm0xNiAgOiBSWEk8MHg0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBycmlhZGRyMTI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJsaFx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoc2V4dGxvYWRpMzJpMTYgcnJpYWRkcjEyOiRzcmMpKV0+OworZGVmIE1PVlNYMzJybTE2eSA6IFJYWUk8MHg3OEUzLAorICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBycmlhZGRyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgImxoeVx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHNleHRsb2FkaTMyaTE2IHJyaWFkZHI6JHNyYykpXT47CitkZWYgTU9WU1g2NHJtOCAgIDogUlhZSTwweDc3RTMsCisgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIHJyaWFkZHI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAibGdiXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoc2V4dGxvYWRpNjRpOCBycmlhZGRyOiRzcmMpKV0+OworZGVmIE1PVlNYNjRybTE2ICA6IFJYWUk8MHgxNUUzLAorICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBycmlhZGRyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgImxnaFx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNleHRsb2FkaTY0aTE2IHJyaWFkZHI6JHNyYykpXT47CitkZWYgTU9WU1g2NHJtMzIgIDogUlhZSTwweDE0RTMsCisgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIHJyaWFkZHI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAibGdmXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoc2V4dGxvYWRpNjRpMzIgcnJpYWRkcjokc3JjKSldPjsKKworZGVmIE1PVlpYMzJybTggIDogUlhZSTwweDk0RTMsCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgcnJpYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgImxsY1x0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoemV4dGxvYWRpMzJpOCBycmlhZGRyOiRzcmMpKV0+OworZGVmIE1PVlpYMzJybTE2IDogUlhZSTwweDk1RTMsCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgcnJpYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgImxsaFx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoemV4dGxvYWRpMzJpMTYgcnJpYWRkcjokc3JjKSldPjsKK2RlZiBNT1ZaWDY0cm04ICA6IFJYWUk8MHg5MEUzLAorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIHJyaWFkZHI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJsbGdjXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsICh6ZXh0bG9hZGk2NGk4IHJyaWFkZHI6JHNyYykpXT47CitkZWYgTU9WWlg2NHJtMTYgOiBSWFlJPDB4OTFFMywKKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBycmlhZGRyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAibGxnaFx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoemV4dGxvYWRpNjRpMTYgcnJpYWRkcjokc3JjKSldPjsKK2RlZiBNT1ZaWDY0cm0zMiA6IFJYWUk8MHgxNkUzLAorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIHJyaWFkZHI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICJsbGdmXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsICh6ZXh0bG9hZGk2NGkzMiBycmlhZGRyOiRzcmMpKV0+OworCisvLyB0cnVuY3N0b3JlcworZGVmIE1PVjMybThyICAgOiBSWEk8MHg0MiwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBycmlhZGRyMTI6JGRzdCwgR1IzMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICJzdGNcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpOCBHUjMyOiRzcmMsIHJyaWFkZHIxMjokZHN0KV0+OworCitkZWYgTU9WMzJtOHJ5ICA6IFJYWUk8MHg3MkUzLAorICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBycmlhZGRyOiRkc3QsIEdSMzI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgInN0Y3lcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTggR1IzMjokc3JjLCBycmlhZGRyOiRkc3QpXT47CisKK2RlZiBNT1YzMm0xNnIgIDogUlhJPDB4NDAsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgcnJpYWRkcjEyOiRkc3QsIEdSMzI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAic3RoXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTE2IEdSMzI6JHNyYywgcnJpYWRkcjEyOiRkc3QpXT47CisKK2RlZiBNT1YzMm0xNnJ5IDogUlhZSTwweDcwRTMsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIHJyaWFkZHI6JGRzdCwgR1IzMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAic3RoeVx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVpMTYgR1IzMjokc3JjLCBycmlhZGRyOiRkc3QpXT47CisKK2RlZiBNT1Y2NG04ciAgIDogUlhJPDB4NDIsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgcnJpYWRkcjEyOiRkc3QsIEdSNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAic3RjXHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTggR1I2NDokc3JjLCBycmlhZGRyMTI6JGRzdCldPjsKKworZGVmIE1PVjY0bThyeSAgOiBSWFlJPDB4NzJFMywKKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgcnJpYWRkcjokZHN0LCBHUjY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICJzdGN5XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWk4IEdSNjQ6JHNyYywgcnJpYWRkcjokZHN0KV0+OworCitkZWYgTU9WNjRtMTZyICA6IFJYSTwweDQwLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIHJyaWFkZHIxMjokZHN0LCBHUjY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgInN0aFx0eyRzcmMsICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWkxNiBHUjY0OiRzcmMsIHJyaWFkZHIxMjokZHN0KV0+OworCitkZWYgTU9WNjRtMTZyeSA6IFJYWUk8MHg3MEUzLAorICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBycmlhZGRyOiRkc3QsIEdSNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgInN0aHlcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTE2IEdSNjQ6JHNyYywgcnJpYWRkcjokZHN0KV0+OworCitkZWYgTU9WNjRtMzJyICA6IFJYSTwweDUwLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIHJyaWFkZHIxMjokZHN0LCBHUjY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgInN0XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICAgWyh0cnVuY3N0b3JlaTMyIEdSNjQ6JHNyYywgcnJpYWRkcjEyOiRkc3QpXT47CisKK2RlZiBNT1Y2NG0zMnJ5IDogUlhZSTwweDUwRTMsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIHJyaWFkZHI6JGRzdCwgR1I2NDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAic3R5XHR7JHNyYywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWkzMiBHUjY0OiRzcmMsIHJyaWFkZHI6JGRzdCldPjsKKworLy8gbXVsdGlwbGUgcmVncyBtb3ZlcworLy8gRklYTUU6IHNob3VsZCB3ZSB1c2UgbXVsdGlwbGUgYXJnIG5vZGVzPworZGVmIE1PVjMybXJtICA6IFJTWUk8MHg5MEVCLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIHJpYWRkcjokZHN0LCBHUjMyOiRmcm9tLCBHUjMyOiR0byksCisgICAgICAgICAgICAgICAgICAgICAic3RteVx0eyRmcm9tLCAkdG8sICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiBNT1Y2NG1ybSAgOiBSU1lJPDB4MjRFQiwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyByaWFkZHI6JGRzdCwgR1I2NDokZnJvbSwgR1I2NDokdG8pLAorICAgICAgICAgICAgICAgICAgICAgInN0bWdcdHskZnJvbSwgJHRvLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgICBbXT47CitkZWYgTU9WMzJybW0gIDogUlNZSTwweDkwRUIsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRmcm9tLCBHUjMyOiR0byksIChpbnMgcmlhZGRyOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAgImxteVx0eyRmcm9tLCAkdG8sICRkc3R9IiwKKyAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiBNT1Y2NHJtbSAgOiBSU1lJPDB4MDRFQiwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGZyb20sIEdSNjQ6JHRvKSwgKGlucyByaWFkZHI6JGRzdCksCisgICAgICAgICAgICAgICAgICAgICAibG1nXHR7JGZyb20sICR0bywgJGRzdH0iLAorICAgICAgICAgICAgICAgICAgICAgW10+OworCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSwgaXNBc0NoZWFwQXNBTW92ZSA9IDEsCisgICAgQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiIGluIHsKK2RlZiBNT1Y2NFByMF9ldmVuIDogUHNldWRvPChvdXRzIEdSNjRQOiRkc3QpLCAoaW5zIEdSNjRQOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxoaVx0JHtkc3Q6c3VicmVnX2V2ZW59LCAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiBNT1YxMjhyMF9ldmVuIDogUHNldWRvPChvdXRzIEdSMTI4OiRkc3QpLCAoaW5zIEdSMTI4OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxnaGlcdCR7ZHN0OnN1YnJlZ19ldmVufSwgMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47Cit9CisKKy8vIEJ5dGUgc3dhcHMKK2RlZiBCU1dBUDMycnIgOiBSUkVJPDB4QjkxRiwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICJscnZyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYnN3YXAgR1IzMjokc3JjKSldPjsKK2RlZiBCU1dBUDY0cnIgOiBSUkVJPDB4QjkwRiwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICJscnZnclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGJzd2FwIEdSNjQ6JHNyYykpXT47CisKKy8vIEZJWE1FOiB0aGlzIGlzIGludmFsaWQgcGF0dGVybiBmb3IgYmlnLWVuZGlhbgorLy9kZWYgQlNXQVAxNnJtIDogUlhZSTwweDFGRTMsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgcnJpYWRkcjokc3JjKSwKKy8vICAgICAgICAgICAgICAgICAgICAgImxydmhcdHskZHN0LCAkc3JjfSIsCisvLyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKGJzd2FwIChleHRsb2FkaTMyaTE2IHJyaWFkZHI6JHNyYykpKV0+OworZGVmIEJTV0FQMzJybSA6IFJYWUk8MHgxRUUzLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIHJyaWFkZHI6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAibHJ2XHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYnN3YXAgKGxvYWQgcnJpYWRkcjokc3JjKSkpXT47CitkZWYgQlNXQVA2NHJtIDogUlhZSTwweDBGRTMsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgcnJpYWRkcjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICJscnZnXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoYnN3YXAgKGxvYWQgcnJpYWRkcjokc3JjKSkpXT47CisKKy8vZGVmIEJTV0FQMTZtciA6IFJYWUk8MHhFMzNGLCAob3V0cyksIChpbnMgcnJpYWRkcjokZHN0LCBHUjMyOiRzcmMpLAorLy8gICAgICAgICAgICAgICAgICAgICAic3RydmhcdHskc3JjLCAkZHN0fSIsCisvLyAgICAgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWkxNiAoYnN3YXAgR1IzMjokc3JjKSwgcnJpYWRkcjokZHN0KV0+OworZGVmIEJTV0FQMzJtciA6IFJYWUk8MHhFMzNFLCAob3V0cyksIChpbnMgcnJpYWRkcjokZHN0LCBHUjMyOiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgInN0cnZcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChic3dhcCBHUjMyOiRzcmMpLCBycmlhZGRyOiRkc3QpXT47CitkZWYgQlNXQVA2NG1yIDogUlhZSTwweEUzMkYsIChvdXRzKSwgKGlucyBycmlhZGRyOiRkc3QsIEdSNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAic3RydmdcdHskc3JjLCAkZHN0fSIsCisgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChic3dhcCBHUjY0OiRzcmMpLCBycmlhZGRyOiRkc3QpXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBcml0aG1ldGljIEluc3RydWN0aW9ucworCitsZXQgRGVmcyA9IFtQU1ddIGluIHsKK2RlZiBORUczMnJyIDogUlJJPDB4MTMsCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksCisgICAgICAgICAgICAgICAgICAibGNyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoaW5lZyBHUjMyOiRzcmMpKSwKKyAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworZGVmIE5FRzY0cnIgOiBSUkVJPDB4QjkwMywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICJsY2dyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGluZWcgR1I2NDokc3JjKSksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgTkVHNjRycjMyIDogUlJFSTwweEI5MTMsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1IzMjokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICJsY2dmclx0eyRkc3QsICRzcmN9IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGluZWcgKHNleHQgR1IzMjokc3JjKSkpLAorICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47Cit9CisKK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsKKworbGV0IERlZnMgPSBbUFNXXSBpbiB7CisKK2xldCBpc0NvbW11dGFibGUgPSAxIGluIHsgLy8gWCA9IEFERCBZLCBaICA9PSBYID0gQUREIFosIFkKK2RlZiBBREQzMnJyIDogUlJJPDB4MUEsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAiYXJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYWRkIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpKSwKKyAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworZGVmIEFERDY0cnIgOiBSUkVJPDB4QjkwOCwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiYWdyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChhZGQgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworfQorCitkZWYgQUREMzJybSAgIDogUlhJPDB4NUEsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgcnJpYWRkcjEyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgImFcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhZGQgR1IzMjokc3JjMSwgKGxvYWQgcnJpYWRkcjEyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBBREQzMnJteSAgOiBSWFlJPDB4RTM1QSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBycmlhZGRyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICJheVx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhZGQgR1IzMjokc3JjMSwgKGxvYWQgcnJpYWRkcjokc3JjMikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworZGVmIEFERDY0cm0gICA6IFJYWUk8MHhFMzA4LCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIHJyaWFkZHI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgImFnXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFkZCBHUjY0OiRzcmMxLCAobG9hZCBycmlhZGRyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CisKKworZGVmIEFERDMycmkxNiA6IFJJSTwweEE3QSwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBzMTZpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiYWhpXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYWRkIEdSMzI6JHNyYzEsIGltbVNFeHQxNjokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBBREQzMnJpICAgOiBSSUxJPDB4QzI5LAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBzMzJpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgImFmaVx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhZGQgR1IzMjokc3JjMSwgaW1tOiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBBREQ2NHJpMTYgOiBSSUxJPDB4QTdCLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBzMTZpbW02NDokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAiYWdoaVx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChhZGQgR1I2NDokc3JjMSwgaW1tU0V4dDE2OiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBBREQ2NHJpMzIgOiBSSUxJPDB4QzI4LAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBzMzJpbW02NDokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAiYWdmaVx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChhZGQgR1I2NDokc3JjMSwgaW1tU0V4dDMyOiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKKworbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4geyAvLyBYID0gQURDIFksIFogID09IFggPSBBREMgWiwgWQorZGVmIEFEQzMycnIgOiBSUkk8MHgxRSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICJhbHJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYWRkYyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSldPjsKK2RlZiBBREM2NHJyIDogUlJFSTwweEI5MEEsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksCisgICAgICAgICAgICAgICAgICAgImFsZ3JcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFkZGMgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpXT47Cit9CisKK2RlZiBBREMzMnJpICAgOiBSSUxJPDB4QzJCLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBzMzJpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgImFsZmlcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYWRkYyBHUjMyOiRzcmMxLCBpbW06JHNyYzIpKV0+OworZGVmIEFEQzY0cmkzMiA6IFJJTEk8MHhDMkEsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIHMzMmltbTY0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICJhbGdmaVx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChhZGRjIEdSNjQ6JHNyYzEsIGltbVNFeHQzMjokc3JjMikpXT47CisKK2xldCBVc2VzID0gW1BTV10gaW4geworZGVmIEFEREUzMnJyIDogUlJFSTwweEI5OTgsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJhbGNyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYWRkZSBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworZGVmIEFEREU2NHJyIDogUlJFSTwweEI5ODgsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJhbGNnclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFkZGUgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpLAorICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK30KKworbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4geyAvLyBYID0gQU5EIFksIFogID09IFggPSBBTkQgWiwgWQorZGVmIEFORDMycnIgOiBSUkk8MHgxNCwKKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAibnJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYW5kIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpKV0+OworZGVmIEFORDY0cnIgOiBSUkVJPDB4Qjk4MCwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJuZ3JcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFuZCBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSldPjsKK30KKworZGVmIEFORDMycm0gICA6IFJYSTwweDU0LCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIHJyaWFkZHIxMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJuXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYW5kIEdSMzI6JHNyYzEsIChsb2FkIHJyaWFkZHIxMjokc3JjMikpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgQU5EMzJybXkgIDogUlhZSTwweEUzNTQsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgcnJpYWRkcjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAibnlcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYW5kIEdSMzI6JHNyYzEsIChsb2FkIHJyaWFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKK2RlZiBBTkQ2NHJtICAgOiBSWFlJPDB4RTM2MCwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBycmlhZGRyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICJuZ1x0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChhbmQgR1I2NDokc3JjMSwgKGxvYWQgcnJpYWRkcjokc3JjMikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworCitkZWYgQU5EMzJyaWxsMTYgOiBSSUk8MHhBNTcsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBpMzJpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJuaWxsXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhbmQgR1IzMjokc3JjMSwgaTMybGwxNmM6JHNyYzIpKV0+OworZGVmIEFORDY0cmlsbDE2IDogUklJPDB4QTU3LAorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAibmlsbFx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoYW5kIEdSNjQ6JHNyYzEsIGk2NGxsMTZjOiRzcmMyKSldPjsKKworZGVmIEFORDMycmlsaDE2IDogUklJPDB4QTU2LAorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMyaW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAibmlsaFx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYW5kIEdSMzI6JHNyYzEsIGkzMmxoMTZjOiRzcmMyKSldPjsKK2RlZiBBTkQ2NHJpbGgxNiA6IFJJSTwweEE1NiwKKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NGltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgIm5pbGhcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFuZCBHUjY0OiRzcmMxLCBpNjRsaDE2Yzokc3JjMikpXT47CisKK2RlZiBBTkQ2NHJpaGwxNiA6IFJJSTwweEE1NSwKKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NGltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgIm5paGxcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFuZCBHUjY0OiRzcmMxLCBpNjRobDE2Yzokc3JjMikpXT47CitkZWYgQU5ENjRyaWhoMTYgOiBSSUk8MHhBNTQsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJuaWhoXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChhbmQgR1I2NDokc3JjMSwgaTY0aGgxNmM6JHNyYzIpKV0+OworCitkZWYgQU5EMzJyaSAgICAgOiBSSUxJPDB4QzBCLAorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMmltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICJuaWxmXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYW5kIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT47CitkZWYgQU5ENjRyaWxvMzIgOiBSSUxJPDB4QzBCLAorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NGltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICJuaWxmXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoYW5kIEdSNjQ6JHNyYzEsIGk2NGxvMzJjOiRzcmMyKSldPjsKK2RlZiBBTkQ2NHJpaGkzMiA6IFJJTEk8MHhDMEEsCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm5paGZcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChhbmQgR1I2NDokc3JjMSwgaTY0aGkzMmM6JHNyYzIpKV0+OworCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7IC8vIFggPSBPUiBZLCBaICA9PSBYID0gT1IgWiwgWQorZGVmIE9SMzJyciA6IFJSSTwweDE2LAorICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAib3JcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChvciBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSldPjsKK2RlZiBPUjY0cnIgOiBSUkVJPDB4Qjk4MSwKKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksCisgICAgICAgICAgICAgICAgICAib2dyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKG9yIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpKV0+OworfQorCitkZWYgT1IzMnJtICAgOiBSWEk8MHg1NiwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBycmlhZGRyMTI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJvXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChvciBHUjMyOiRzcmMxLCAobG9hZCBycmlhZGRyMTI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgT1IzMnJteSAgOiBSWFlJPDB4RTM1NiwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBycmlhZGRyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgIm95XHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAob3IgR1IzMjokc3JjMSwgKGxvYWQgcnJpYWRkcjokc3JjMikpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgT1I2NHJtICAgOiBSWFlJPDB4RTM4MSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBycmlhZGRyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgIm9nXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAob3IgR1I2NDokc3JjMSwgKGxvYWQgcnJpYWRkcjokc3JjMikpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CisKKyAvLyBGSVhNRTogUHJvdmlkZSBwcm9wZXIgZW5jb2RpbmchCitkZWYgT1IzMnJpMTYgIDogUklJPDB4QTVCLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMmltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJvaWxsXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAob3IgR1IzMjokc3JjMSwgaTMybGwxNjokc3JjMikpXT47CitkZWYgT1IzMnJpMTZoIDogUklJPDB4QTVBLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMmltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJvaWxoXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAob3IgR1IzMjokc3JjMSwgaTMybGgxNjokc3JjMikpXT47CitkZWYgT1IzMnJpIDogUklMSTwweEMwRCwKKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMyaW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICJvaWxmXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKG9yIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT47CisKK2RlZiBPUjY0cmlsbDE2IDogUklJPDB4QTVCLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgIm9pbGxcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAob3IgR1I2NDokc3JjMSwgaTY0bGwxNjokc3JjMikpXT47CitkZWYgT1I2NHJpbGgxNiA6IFJJSTwweEE1QSwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICJvaWxoXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKG9yIEdSNjQ6JHNyYzEsIGk2NGxoMTY6JHNyYzIpKV0+OworZGVmIE9SNjRyaWhsMTYgOiBSSUk8MHhBNTksCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NGltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAib2lobFx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChvciBHUjY0OiRzcmMxLCBpNjRobDE2OiRzcmMyKSldPjsKK2RlZiBPUjY0cmloaDE2IDogUklJPDB4QTU4LAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgIm9paGhcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAob3IgR1I2NDokc3JjMSwgaTY0aGgxNjokc3JjMikpXT47CisKK2RlZiBPUjY0cmlsbzMyIDogUklMSTwweEMwRCwKKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NGltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgIm9pbGZcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKG9yIEdSNjQ6JHNyYzEsIGk2NGxvMzI6JHNyYzIpKV0+OworZGVmIE9SNjRyaWhpMzIgOiBSSUxJPDB4QzBDLAorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0aW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAib2loZlx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAob3IgR1I2NDokc3JjMSwgaTY0aGkzMjokc3JjMikpXT47CisKK2RlZiBTVUIzMnJyIDogUlJJPDB4MUIsCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgInNyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHN1YiBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSldPjsKK2RlZiBTVUI2NHJyIDogUlJFSTwweEI5MDksCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAic2dyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzdWIgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpXT47CisKK2RlZiBTVUIzMnJtICAgOiBSWEk8MHg1QiwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBycmlhZGRyMTI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAic1x0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHN1YiBHUjMyOiRzcmMxLCAobG9hZCBycmlhZGRyMTI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworZGVmIFNVQjMycm15ICA6IFJYWUk8MHhFMzVCLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIHJyaWFkZHI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgInN5XHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHN1YiBHUjMyOiRzcmMxLCAobG9hZCBycmlhZGRyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgU1VCNjRybSAgIDogUlhZSTwweEUzMDksIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgcnJpYWRkcjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAic2dcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoc3ViIEdSNjQ6JHNyYzEsIChsb2FkIHJyaWFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKKyAKK2RlZiBTQkMzMnJyIDogUlJJPDB4MUYsCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgInNsclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChzdWJjIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpKV0+OworZGVmIFNCQzY0cnIgOiBSUkVJPDB4QjkwQiwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJzbGdyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzdWJjIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpKV0+OworCitkZWYgU0JDMzJyaSAgIDogUklMSTwweEMyNSwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgczMyaW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICJzbGxmaVx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChzdWJjIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT47CitkZWYgU0JDNjRyaTMyIDogUklMSTwweEMyNCwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgczMyaW1tNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgInNsZ2ZpXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHN1YmMgR1I2NDokc3JjMSwgaW1tU0V4dDMyOiRzcmMyKSldPjsKKworbGV0IFVzZXMgPSBbUFNXXSBpbiB7CitkZWYgU1VCRTMycnIgOiBSUkVJPDB4Qjk5OSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgInNsYnJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChzdWJlIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgU1VCRTY0cnIgOiBSUkVJPDB4Qjk4OSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgInNsYmdyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoc3ViZSBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworfQorCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7IC8vIFggPSBYT1IgWSwgWiAgPT0gWCA9IFhPUiBaLCBZCitkZWYgWE9SMzJyciA6IFJSSTwweDE3LAorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICJ4clx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsICh4b3IgR1IzMjokc3JjMSwgR1IzMjokc3JjMikpXT47CitkZWYgWE9SNjRyciA6IFJSRUk8MHhCOTgyLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksCisgICAgICAgICAgICAgICAgICAgInhnclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoeG9yIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpKV0+OworfQorCitkZWYgWE9SMzJybSAgIDogUlhJPDB4NTcsKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBycmlhZGRyMTI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAieFx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHhvciBHUjMyOiRzcmMxLCAobG9hZCBycmlhZGRyMTI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgUFNXKV0+OworZGVmIFhPUjMycm15ICA6IFJYWUk8MHhFMzU3LCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIHJyaWFkZHI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgInh5XHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHhvciBHUjMyOiRzcmMxLCAobG9hZCBycmlhZGRyOiRzcmMyKSkpLAorICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CitkZWYgWE9SNjRybSAgIDogUlhZSTwweEUzODIsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgcnJpYWRkcjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAieGdcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoeG9yIEdSNjQ6JHNyYzEsIChsb2FkIHJyaWFkZHI6JHNyYzIpKSksCisgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IFBTVyldPjsKKworZGVmIFhPUjMycmkgOiBSSUxJPDB4QzA3LAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMyaW1tOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAieGlsZlx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoeG9yIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT47CisKK30gLy8gRGVmcyA9IFtQU1ddCisKK2xldCBpc0NvbW11dGFibGUgPSAxIGluIHsgLy8gWCA9IE1VTCBZLCBaID09IFggPSBNVUwgWiwgWQorZGVmIE1VTDMycnIgOiBSUkVJPDB4QjI1MiwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICJtc3JcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKG11bCBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSldPjsKK2RlZiBNVUw2NHJyIDogUlJFSTwweEI5MEMsCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAibXNnclx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAobXVsIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpKV0+OworfQorCitkZWYgTVVMNjRyclAgICA6IFJSSTwweDFDLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NFA6JGRzdCksIChpbnMgR1I2NFA6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgIm1yXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiBVTVVMNjRyclAgIDogUlJFSTwweEI5OTYsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NFA6JGRzdCksIChpbnMgR1I2NFA6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJtbHJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiBVTVVMMTI4cnJQIDogUlJFSTwweEI5ODYsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxMjg6JGRzdCksIChpbnMgR1IxMjg6JHNyYzEsIEdSNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJtbGdyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBNVUwzMnJpMTYgICA6IFJJSTwweEE3QywKKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIHMxNmltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgIm1oaVx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAobXVsIEdSMzI6JHNyYzEsIGkzMmltbVNFeHQxNjokc3JjMikpXT47CitkZWYgTVVMNjRyaTE2ICAgOiBSSUk8MHhBN0QsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBzMTZpbW02NDokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgIm1naGlcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKG11bCBHUjY0OiRzcmMxLCBpbW1TRXh0MTY6JHNyYzIpKV0+OworCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMiBpbiB7CitkZWYgTVVMMzJyaSAgICAgOiBSSUxJPDB4QzIxLAorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIHMzMmltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICJtc2ZpXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAobXVsIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT4sCisgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc1oxMF0+OworZGVmIE1VTDY0cmkzMiAgIDogUklMSTwweEMyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBzMzJpbW02NDokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgICJtc2dmaVx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKG11bCBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0MzI6JHNyYzIpKV0+LAorICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSXNaMTBdPjsKK30KKworZGVmIE1VTDMycm0gOiBSWEk8MHg3MSwKKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgcnJpYWRkcjEyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICJtc1x0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChtdWwgR1IzMjokc3JjMSwgKGxvYWQgcnJpYWRkcjEyOiRzcmMyKSkpXT47CitkZWYgTVVMMzJybXkgOiBSWFlJPDB4RTM1MSwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBycmlhZGRyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgIm1zeVx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKG11bCBHUjMyOiRzcmMxLCAobG9hZCBycmlhZGRyOiRzcmMyKSkpXT47CitkZWYgTVVMNjRybSAgOiBSWFlJPDB4RTMwQywKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBycmlhZGRyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgIm1zZ1x0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKG11bCBHUjY0OiRzcmMxLCAobG9hZCBycmlhZGRyOiRzcmMyKSkpXT47CisKK2RlZiBNVUxTWDY0cnIzMiA6IFJSRUk8MHhCOTFDLAorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAibXNnZnJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChtdWwgR1I2NDokc3JjMSwgKHNleHQgR1IzMjokc3JjMikpKV0+OworCitkZWYgU0RJVlJFTTMyciA6IFJSRUk8MHhCOTFELAorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTI4OiRkc3QpLCAoaW5zIEdSMTI4OiRzcmMxLCBHUjMyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiZHNnZnJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiBTRElWUkVNNjRyIDogUlJFSTwweEI5MEQsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxMjg6JGRzdCksIChpbnMgR1IxMjg6JHNyYzEsIEdSNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJkc2dyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBVRElWUkVNMzJyIDogUlJFSTwweEI5OTcsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NFA6JGRzdCksIChpbnMgR1I2NFA6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJkbHJcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiBVRElWUkVNNjRyIDogUlJFSTwweEI5ODcsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxMjg6JGRzdCksIChpbnMgR1IxMjg6JHNyYzEsIEdSNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJkbGdyXHR7JGRzdCwgJHNyYzJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICBbXT47CitsZXQgbWF5TG9hZCA9IDEgaW4geworZGVmIFNESVZSRU0zMm0gOiBSWFlJPDB4RTMxRCwKKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjEyODokZHN0KSwgKGlucyBHUjEyODokc3JjMSwgcnJpYWRkcjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgImRzZ2ZcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK2RlZiBTRElWUkVNNjRtIDogUlhZSTwweEUzMEQsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxMjg6JGRzdCksIChpbnMgR1IxMjg6JHNyYzEsIHJyaWFkZHI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJkc2dcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIFVESVZSRU0zMm0gOiBSWFlJPDB4RTM5NywgKG91dHMgR1I2NFA6JGRzdCksIChpbnMgR1I2NFA6JHNyYzEsIHJyaWFkZHI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJkbFx0eyRkc3QsICRzcmMyfSIsCisgICAgICAgICAgICAgICAgICAgICAgW10+OworZGVmIFVESVZSRU02NG0gOiBSWFlJPDB4RTM4NywgKG91dHMgR1IxMjg6JGRzdCksIChpbnMgR1IxMjg6JHNyYzEsIHJyaWFkZHI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJkbGdcdHskZHN0LCAkc3JjMn0iLAorICAgICAgICAgICAgICAgICAgICAgIFtdPjsKK30gLy8gbWF5TG9hZAorfSAvLyBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTaGlmdHMKKworbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiBpbgorZGVmIFNSTDMycnJpIDogUlNJPDB4ODgsCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMsIHJpYWRkcjMyOiRhbXQpLAorICAgICAgICAgICAgICAgICAgICJzcmxcdHskc3JjLCAkYW10fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoc3JsIEdSMzI6JHNyYywgcmlhZGRyMzI6JGFtdCkpXT47CitkZWYgU1JMNjRycmkgOiBSU1lJPDB4RUIwQywKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMsIHJpYWRkcjokYW10KSwKKyAgICAgICAgICAgICAgICAgICAgInNybGdcdHskZHN0LCAkc3JjLCAkYW10fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNybCBHUjY0OiRzcmMsIHJpYWRkcjokYW10KSldPjsKKworbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiBpbgorZGVmIFNITDMycnJpIDogUlNJPDB4ODksCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMsIHJpYWRkcjMyOiRhbXQpLAorICAgICAgICAgICAgICAgICAgICJzbGxcdHskc3JjLCAkYW10fSIsCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoc2hsIEdSMzI6JHNyYywgcmlhZGRyMzI6JGFtdCkpXT47CitkZWYgU0hMNjRycmkgOiBSU1lJPDB4RUIwRCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMsIHJpYWRkcjokYW10KSwKKyAgICAgICAgICAgICAgICAgICAgInNsbGdcdHskZHN0LCAkc3JjLCAkYW10fSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNobCBHUjY0OiRzcmMsIHJpYWRkcjokYW10KSldPjsKKworbGV0IERlZnMgPSBbUFNXXSBpbiB7CitsZXQgQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiIGluCitkZWYgU1JBMzJycmkgOiBSU0k8MHg4QSwKKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYywgcmlhZGRyMzI6JGFtdCksCisgICAgICAgICAgICAgICAgICAgInNyYVx0eyRzcmMsICRhbXR9IiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChzcmEgR1IzMjokc3JjLCByaWFkZHIzMjokYW10KSksCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47CisKK2RlZiBTUkE2NHJyaSA6IFJTWUk8MHhFQjBBLAorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYywgcmlhZGRyOiRhbXQpLAorICAgICAgICAgICAgICAgICAgICAic3JhZ1x0eyRkc3QsICRzcmMsICRhbXR9IiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoc3JhIEdSNjQ6JHNyYywgcmlhZGRyOiRhbXQpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBQU1cpXT47Cit9IC8vIERlZnMgPSBbUFNXXQorCitkZWYgUk9UTDMycnJpIDogUlNZSTwweEVCMUQsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYywgcmlhZGRyMzI6JGFtdCksCisgICAgICAgICAgICAgICAgICAgICAicmxsXHR7JGRzdCwgJHNyYywgJGFtdH0iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAocm90bCBHUjMyOiRzcmMsIHJpYWRkcjMyOiRhbXQpKV0+OworZGVmIFJPVEw2NHJyaSA6IFJTWUk8MHhFQjFDLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMsIHJpYWRkcjokYW10KSwKKyAgICAgICAgICAgICAgICAgICAgICJybGxnXHR7JGRzdCwgJHNyYywgJGFtdH0iLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAocm90bCBHUjY0OiRzcmMsIHJpYWRkcjokYW10KSldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRlc3QgaW5zdHJ1Y3Rpb25zIChsaWtlIEFORCBidXQgZG8gbm90IHByb2R1Y2UgYW55IHJlc3VsdCkKKworLy8gSW50ZWdlciBjb21wYXJpc29ucworbGV0IERlZnMgPSBbUFNXXSBpbiB7CitkZWYgQ01QMzJyciA6IFJSSTwweDE5LAorICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgImNyXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgWyhzZXQgUFNXLCAoU3lzdGVtWmNtcCBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSldPjsgCitkZWYgQ01QNjRyciA6IFJSRUk8MHhCOTIwLAorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAiY2dyXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgIFsoc2V0IFBTVywgKFN5c3RlbVpjbXAgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpXT47CisKK2RlZiBDTVAzMnJpICAgOiBSSUxJPDB4QzJELAorICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSMzI6JHNyYzEsIHMzMmltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAiY2ZpXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUFNXLCAoU3lzdGVtWmNtcCBHUjMyOiRzcmMxLCBpbW06JHNyYzIpKV0+OworZGVmIENNUDY0cmkzMiA6IFJJTEk8MHhDMkMsCisgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgczMyaW1tNjQ6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgImNnZmlcdCRzcmMxLCAkc3JjMiIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBQU1csIChTeXN0ZW1aY21wIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQzMjokc3JjMikpXT47CisKK2RlZiBDTVAzMnJtIDogUlhJPDB4NTksCisgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1IzMjokc3JjMSwgcnJpYWRkcjEyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICJjXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgWyhzZXQgUFNXLCAoU3lzdGVtWmNtcCBHUjMyOiRzcmMxLCAobG9hZCBycmlhZGRyMTI6JHNyYzIpKSldPjsKK2RlZiBDTVAzMnJteSA6IFJYWUk8MHhFMzU5LAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1IzMjokc3JjMSwgcnJpYWRkcjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJjeVx0JHNyYzEsICRzcmMyIiwKKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgUFNXLCAoU3lzdGVtWmNtcCBHUjMyOiRzcmMxLCAobG9hZCBycmlhZGRyOiRzcmMyKSkpXT47CitkZWYgQ01QNjRybSAgOiBSWFlJPDB4RTMyMCwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSNjQ6JHNyYzEsIHJyaWFkZHI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAiY2dcdCRzcmMxLCAkc3JjMiIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFBTVywgKFN5c3RlbVpjbXAgR1I2NDokc3JjMSwgKGxvYWQgcnJpYWRkcjokc3JjMikpKV0+OworCitkZWYgVUNNUDMycnIgOiBSUkk8MHgxNSwKKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksCisgICAgICAgICAgICAgICAgICAgImNsclx0JHNyYzEsICRzcmMyIiwKKyAgICAgICAgICAgICAgICAgICBbKHNldCBQU1csIChTeXN0ZW1adWNtcCBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSldPjsKK2RlZiBVQ01QNjRyciA6IFJSRUk8MHhCOTIxLAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICJjbGdyXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBQU1csIChTeXN0ZW1adWNtcCBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSldPjsKKworZGVmIFVDTVAzMnJpICAgOiBSSUxJPDB4QzJGLAorICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjMyOiRzcmMxLCBpMzJpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICJjbGZpXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFBTVywgKFN5c3RlbVp1Y21wIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT47CitkZWYgVUNNUDY0cmkzMiA6IFJJTEk8MHhDMkUsCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NGkzMmltbTokc3JjMiksCisgICAgICAgICAgICAgICAgICAgICAgImNsZ2ZpXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFBTVywoU3lzdGVtWnVjbXAgR1I2NDokc3JjMSwgaTY0aW1tWkV4dDMyOiRzcmMyKSldPjsKKworZGVmIFVDTVAzMnJtICA6IFJYSTwweDU1LAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1IzMjokc3JjMSwgcnJpYWRkcjEyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgImNsXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBQU1csIChTeXN0ZW1adWNtcCBHUjMyOiRzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZCBycmlhZGRyMTI6JHNyYzIpKSldPjsKK2RlZiBVQ01QMzJybXkgOiBSWFlJPDB4RTM1NSwKKyAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjMyOiRzcmMxLCBycmlhZGRyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICJjbHlcdCRzcmMxLCAkc3JjMiIsCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBQU1csIChTeXN0ZW1adWNtcCBHUjMyOiRzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgcnJpYWRkcjokc3JjMikpKV0+OworZGVmIFVDTVA2NHJtICA6IFJYWUk8MHhFMzUxLAorICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSNjQ6JHNyYzEsIHJyaWFkZHI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgImNsZ1x0JHNyYzEsICRzcmMyIiwKKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFBTVywgKFN5c3RlbVp1Y21wIEdSNjQ6JHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZCBycmlhZGRyOiRzcmMyKSkpXT47CisKK2RlZiBDTVBTWDY0cnIzMiAgOiBSUkVJPDB4QjkzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjY0OiRzcmMxLCBHUjMyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjZ2ZyXHQkc3JjMSwgJHNyYzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUFNXLCAoU3lzdGVtWnVjbXAgR1I2NDokc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXh0IEdSMzI6JHNyYzIpKSldPjsKK2RlZiBVQ01QWlg2NHJyMzIgOiBSUkVJPDB4QjkzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjY0OiRzcmMxLCBHUjMyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGdmclx0JHNyYzEsICRzcmMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFBTVywgKFN5c3RlbVp1Y21wIEdSNjQ6JHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoemV4dCBHUjMyOiRzcmMyKSkpXT47CisKK2RlZiBDTVBTWDY0cm0zMiAgIDogUlhZSTwweEUzMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSNjQ6JHNyYzEsIHJyaWFkZHI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjZ2ZcdCRzcmMxLCAkc3JjMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUFNXLCAoU3lzdGVtWnVjbXAgR1I2NDokc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXh0bG9hZGk2NGkzMiBycmlhZGRyOiRzcmMyKSkpXT47CitkZWYgVUNNUFpYNjRybTMyICA6IFJYWUk8MHhFMzMxLAorICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjY0OiRzcmMxLCBycmlhZGRyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2xnZlx0JHNyYzEsICRzcmMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBQU1csIChTeXN0ZW1adWNtcCBHUjY0OiRzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHpleHRsb2FkaTY0aTMyIHJyaWFkZHI6JHNyYzIpKSldPjsKKworLy8gRklYTUU6IEFkZCBvdGhlciBjcmF6eSB1Y21wIGZvcm1zCisKK30gLy8gRGVmcyA9IFtQU1ddCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPdGhlciBjcmF6eSBzdHVmZgorbGV0IERlZnMgPSBbUFNXXSBpbiB7CitkZWYgRkxPR1I2NCA6IFJSRUk8MHhCOTgzLAorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTI4OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksCisgICAgICAgICAgICAgICAgICAgImZsb2dyXHR7JGRzdCwgJHNyY30iLAorICAgICAgICAgICAgICAgICAgIFtdPjsKK30gLy8gRGVmcyA9IFtQU1ddCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBOb24tSW5zdHJ1Y3Rpb24gUGF0dGVybnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBDb25zdFBvb2xzLCBKdW1wVGFibGVzCitkZWYgOiBQYXQ8KFN5c3RlbVpwY3JlbHdyYXBwZXIgdGp1bXB0YWJsZTokc3JjKSwgKExBNjRybSB0anVtcHRhYmxlOiRzcmMpPjsKK2RlZiA6IFBhdDwoU3lzdGVtWnBjcmVsd3JhcHBlciB0Y29uc3Rwb29sOiRzcmMpLCAoTEE2NHJtIHRjb25zdHBvb2w6JHNyYyk+OworCisvLyBhbnlleHQKK2RlZiA6IFBhdDwoaTY0IChhbnlleHQgR1IzMjokc3JjKSksCisgICAgICAgICAgKElOU0VSVF9TVUJSRUcgKGk2NCAoSU1QTElDSVRfREVGKSksIEdSMzI6JHNyYywgc3VicmVnXzMyYml0KT47CisKKy8vIGNhbGxzCitkZWYgOiBQYXQ8KFN5c3RlbVpjYWxsIChpNjQgdGdsb2JhbGFkZHI6JGRzdCkpLCAoQ0FMTGkgdGdsb2JhbGFkZHI6JGRzdCk+OworZGVmIDogUGF0PChTeXN0ZW1aY2FsbCAoaTY0IHRleHRlcm5hbHN5bTokZHN0KSksIChDQUxMaSB0ZXh0ZXJuYWxzeW06JGRzdCk+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGVlcGhvbGVzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRklYTUU6IHVzZSBhZGQvc3ViIHRyaWNrcyB3aXRoIDMyNjc4Ly0zMjc2OAorCisvLyBBcmJpdHJhcnkgaW1tZWRpYXRlIHN1cHBvcnQuCitkZWYgOiBQYXQ8KGkzMiBpbW06JHNyYyksCisgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChNT1Y2NHJpMzIgKEdldEk2NEZyb21JMzIgKGkzMiBpbW06JHNyYykpKSwKKyAgICAgICAgICAgICBzdWJyZWdfMzJiaXQpPjsKKworLy8gSW1wbGVtZW50IGluIHRlcm1zIG9mIExMSUhGL09JTEYuCitkZWYgOiBQYXQ8KGk2NCBpbW06JGltbSksCisgICAgICAgICAgKE9SNjRyaWxvMzIgKE1PVjY0cmloaTMyIChISTMyIGltbTokaW1tKSksIChMTzMyIGltbTokaW1tKSk+OworCisvLyB0cnVuYyBwYXR0ZXJucworZGVmIDogUGF0PChpMzIgKHRydW5jIEdSNjQ6JHNyYykpLAorICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyBHUjY0OiRzcmMsIHN1YnJlZ18zMmJpdCk+OworCisvLyBzZXh0X2lucmVnIHBhdHRlcm5zCitkZWYgOiBQYXQ8KHNleHRfaW5yZWcgR1I2NDokc3JjLCBpMzIpLAorICAgICAgICAgIChNT1ZTWDY0cnIzMiAoRVhUUkFDVF9TVUJSRUcgR1I2NDokc3JjLCBzdWJyZWdfMzJiaXQpKT47CisKKy8vIGV4dGxvYWQgcGF0dGVybnMKK2RlZiA6IFBhdDwoZXh0bG9hZGkzMmk4ICBycmlhZGRyOiRzcmMpLCAoTU9WWlgzMnJtOCAgcnJpYWRkcjokc3JjKT47CitkZWYgOiBQYXQ8KGV4dGxvYWRpMzJpMTYgcnJpYWRkcjokc3JjKSwgKE1PVlpYMzJybTE2IHJyaWFkZHI6JHNyYyk+OworZGVmIDogUGF0PChleHRsb2FkaTY0aTggIHJyaWFkZHI6JHNyYyksIChNT1ZaWDY0cm04ICBycmlhZGRyOiRzcmMpPjsKK2RlZiA6IFBhdDwoZXh0bG9hZGk2NGkxNiBycmlhZGRyOiRzcmMpLCAoTU9WWlg2NHJtMTYgcnJpYWRkcjokc3JjKT47CitkZWYgOiBQYXQ8KGV4dGxvYWRpNjRpMzIgcnJpYWRkcjokc3JjKSwgKE1PVlpYNjRybTMyIHJyaWFkZHI6JHNyYyk+OworCisvLyBtdWxzCitkZWYgOiBQYXQ8KG11bGhzIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLAorICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyAoTVVMNjRyclAgKElOU0VSVF9TVUJSRUcgKHYyaTMyIChJTVBMSUNJVF9ERUYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSMzI6JHNyYzEsIHN1YnJlZ19vZGQzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUjMyOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicmVnXzMyYml0KT47CisKK2RlZiA6IFBhdDwobXVsaHUgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksCisgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChVTVVMNjRyclAgKElOU0VSVF9TVUJSRUcgKHYyaTMyIChJTVBMSUNJVF9ERUYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUjMyOiRzcmMxLCBzdWJyZWdfb2RkMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSMzI6JHNyYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyZWdfMzJiaXQpPjsKK2RlZiA6IFBhdDwobXVsaHUgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksCisgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChVTVVMMTI4cnJQIChJTlNFUlRfU1VCUkVHICh2Mmk2NCAoSU1QTElDSVRfREVGKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSNjQ6JHNyYzEsIHN1YnJlZ19vZGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUjY0OiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicmVnX2V2ZW4pPjsKKworZGVmIDogUGF0PChjdGx6IEdSNjQ6JHNyYyksCisgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChGTE9HUjY0IEdSNjQ6JHNyYyksIHN1YnJlZ19ldmVuKT47CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWk1DQXNtSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWk1DQXNtSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3ZjcwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aTUNBc21JbmZvLmNwcApAQCAtMCwwICsxLDI5IEBACisvLz09PS0tIFN5c3RlbVpNQ0FzbUluZm8uY3BwIC0gU3lzdGVtWiBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBTeXN0ZW1aTUNBc21JbmZvIHByb3BlcnRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlN5c3RlbVpNQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uRUxGLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU3lzdGVtWk1DQXNtSW5mbzo6U3lzdGVtWk1DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCkgeworICBQcml2YXRlR2xvYmFsUHJlZml4ID0gIi5MIjsKKyAgV2Vha1JlZkRpcmVjdGl2ZSA9ICJcdC53ZWFrXHQiOworICBQQ1N5bWJvbCA9ICIuIjsKK30KKworY29uc3QgTUNTZWN0aW9uICpTeXN0ZW1aTUNBc21JbmZvOjoKK2dldE5vbmV4ZWN1dGFibGVTdGFja1NlY3Rpb24oTUNDb250ZXh0ICZDdHgpIGNvbnN0eworICByZXR1cm4gQ3R4LmdldEVMRlNlY3Rpb24oIi5ub3RlLkdOVS1zdGFjayIsIE1DU2VjdGlvbkVMRjo6U0hUX1BST0dCSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU2VjdGlvbktpbmQ6OmdldE1ldGFkYXRhKCksIGZhbHNlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aTUNBc21JbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWk1DQXNtSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTI3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWk1DQXNtSW5mby5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vPT09PS0tIFN5c3RlbVpNQ0FzbUluZm8uaCAtIFN5c3RlbVogYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgU3lzdGVtWk1DQXNtSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFN5c3RlbVpUQVJHRVRBU01JTkZPX0gKKyNkZWZpbmUgU3lzdGVtWlRBUkdFVEFTTUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBUYXJnZXQ7CisgIGNsYXNzIFN0cmluZ1JlZjsKKworICBzdHJ1Y3QgU3lzdGVtWk1DQXNtSW5mbyA6IHB1YmxpYyBNQ0FzbUluZm8geworICAgIGV4cGxpY2l0IFN5c3RlbVpNQ0FzbUluZm8oY29uc3QgVGFyZ2V0ICZULCBTdHJpbmdSZWYgVFQpOworICAgIHZpcnR1YWwgY29uc3QgTUNTZWN0aW9uICpnZXROb25leGVjdXRhYmxlU3RhY2tTZWN0aW9uKE1DQ29udGV4dCAmQ3R4KSBjb25zdDsKKyAgfTsKKyAgCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpNYWNoaW5lRnVuY3Rpb25JbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDZlMzMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpNYWNoaW5lRnVuY3Rpb25JbmZvLmgKQEAgLTAsMCArMSw1MSBAQAorLy89PS0gU3lzdGVtWk1hY2hpbmVGdWN0aW9uSW5mby5oIC0gU3lzdGVtWiBtYWNoaW5lIGZ1bmN0aW9uIGluZm8gLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgU3lzdGVtWi1zcGVjaWZpYyBwZXItbWFjaGluZS1mdW5jdGlvbiBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFNZU1RFTVpNQUNISU5FRlVOQ1RJT05JTkZPX0gKKyNkZWZpbmUgU1lTVEVNWk1BQ0hJTkVGVU5DVElPTklORk9fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTeXN0ZW1aTWFjaGluZUZ1bmN0aW9uSW5mbyAtIFRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIE1hY2hpbmVGdW5jdGlvbiBhbmQKKy8vLyBjb250YWlucyBwcml2YXRlIFN5c3RlbVogdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBlYWNoIE1hY2hpbmVGdW5jdGlvbi4KK2NsYXNzIFN5c3RlbVpNYWNoaW5lRnVuY3Rpb25JbmZvIDogcHVibGljIE1hY2hpbmVGdW5jdGlvbkluZm8geworICAvLy8gQ2FsbGVlU2F2ZWRGcmFtZVNpemUgLSBTaXplIG9mIHRoZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIgcG9ydGlvbiBvZiB0aGUKKyAgLy8vIHN0YWNrIGZyYW1lIGluIGJ5dGVzLgorICB1bnNpZ25lZCBDYWxsZWVTYXZlZEZyYW1lU2l6ZTsKKworICAvLy8gTG93UmVnIC0gTG93IHJlZ2lzdGVyIG9mIHJhbmdlIG9mIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgdG8gc3RvcmUuCisgIHVuc2lnbmVkIExvd1JlZzsKKworICAvLy8gSGlnaFJlZyAtIEhpZ2ggcmVnaXN0ZXIgb2YgcmFuZ2Ugb2YgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyB0byBzdG9yZS4KKyAgdW5zaWduZWQgSGlnaFJlZzsKK3B1YmxpYzoKKyAgU3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8oKSA6IENhbGxlZVNhdmVkRnJhbWVTaXplKDApIHt9CisKKyAgZXhwbGljaXQgU3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8oTWFjaGluZUZ1bmN0aW9uICZNRikKKyAgICA6IENhbGxlZVNhdmVkRnJhbWVTaXplKDApIHt9CisKKyAgdW5zaWduZWQgZ2V0Q2FsbGVlU2F2ZWRGcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBDYWxsZWVTYXZlZEZyYW1lU2l6ZTsgfQorICB2b2lkIHNldENhbGxlZVNhdmVkRnJhbWVTaXplKHVuc2lnbmVkIGJ5dGVzKSB7IENhbGxlZVNhdmVkRnJhbWVTaXplID0gYnl0ZXM7IH0KKworICB1bnNpZ25lZCBnZXRMb3dSZWcoKSBjb25zdCB7IHJldHVybiBMb3dSZWc7IH0KKyAgdm9pZCBzZXRMb3dSZWcodW5zaWduZWQgUmVnKSB7IExvd1JlZyA9IFJlZzsgfQorCisgIHVuc2lnbmVkIGdldEhpZ2hSZWcoKSBjb25zdCB7IHJldHVybiBIaWdoUmVnOyB9CisgIHZvaWQgc2V0SGlnaFJlZyh1bnNpZ25lZCBSZWcpIHsgSGlnaFJlZyA9IFJlZzsgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWk9wZXJhbmRzLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpPcGVyYW5kcy50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGU1MGZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpPcGVyYW5kcy50ZApAQCAtMCwwICsxLDMxMCBAQAorLy89PT09PS0gU3lzdGVtWk9wZXJhbmRzLnRkIC0gU3lzdGVtWiBPcGVyYW5kcyBkZWZzIC0tLS0tLS0tLSotIHRibGdlbi0qLT09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgdmFyaW91cyBTeXN0ZW1aIGluc3RydWN0aW9uIG9wZXJhbmRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBQYXR0ZXJuIFN0dWZmLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gU3lzdGVtWiBzcGVjaWZpYyBjb25kaXRpb24gY29kZS4gVGhlc2UgY29ycmVzcG9uZCB0byBDb25kQ29kZSBpbgorLy8gU3lzdGVtWi5oLiBUaGV5IG11c3QgYmUga2VwdCBpbiBzeW5jaC4KK2RlZiBTWVNURU1aX0NPTkRfTyAgIDogUGF0TGVhZjwoaTggMCk+OworZGVmIFNZU1RFTVpfQ09ORF9IICAgOiBQYXRMZWFmPChpOCAxKT47CitkZWYgU1lTVEVNWl9DT05EX05MRSA6IFBhdExlYWY8KGk4IDIpPjsKK2RlZiBTWVNURU1aX0NPTkRfTCAgIDogUGF0TGVhZjwoaTggMyk+OworZGVmIFNZU1RFTVpfQ09ORF9OSEUgOiBQYXRMZWFmPChpOCA0KT47CitkZWYgU1lTVEVNWl9DT05EX0xIICA6IFBhdExlYWY8KGk4IDUpPjsKK2RlZiBTWVNURU1aX0NPTkRfTkUgIDogUGF0TGVhZjwoaTggNik+OworZGVmIFNZU1RFTVpfQ09ORF9FICAgOiBQYXRMZWFmPChpOCA3KT47CitkZWYgU1lTVEVNWl9DT05EX05MSCA6IFBhdExlYWY8KGk4IDgpPjsKK2RlZiBTWVNURU1aX0NPTkRfSEUgIDogUGF0TGVhZjwoaTggOSk+OworZGVmIFNZU1RFTVpfQ09ORF9OTCAgOiBQYXRMZWFmPChpOCAxMCk+OworZGVmIFNZU1RFTVpfQ09ORF9MRSAgOiBQYXRMZWFmPChpOCAxMSk+OworZGVmIFNZU1RFTVpfQ09ORF9OSCAgOiBQYXRMZWFmPChpOCAxMik+OworZGVmIFNZU1RFTVpfQ09ORF9OTyAgOiBQYXRMZWFmPChpOCAxMyk+OworCitkZWYgTE84IDogU0ROb2RlWEZvcm08aW1tLCBbeworICAvLyBUcmFuc2Zvcm1hdGlvbiBmdW5jdGlvbjogcmV0dXJuIGxvdyA4IGJpdHMuCisgIHJldHVybiBnZXRJOEltbShOLT5nZXRaRXh0VmFsdWUoKSAmIDB4MDAwMDAwMDAwMDAwMDBGRlVMTCk7Cit9XT47CisKK2RlZiBMTDE2IDogU0ROb2RlWEZvcm08aW1tLCBbeworICAvLyBUcmFuc2Zvcm1hdGlvbiBmdW5jdGlvbjogcmV0dXJuIGxvdyAxNiBiaXRzLgorICByZXR1cm4gZ2V0STE2SW1tKE4tPmdldFpFeHRWYWx1ZSgpICYgMHgwMDAwMDAwMDAwMDBGRkZGVUxMKTsKK31dPjsKKworZGVmIExIMTYgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiByZXR1cm4gYml0cyAxNi0zMS4KKyAgcmV0dXJuIGdldEkxNkltbSgoTi0+Z2V0WkV4dFZhbHVlKCkgJiAweDAwMDAwMDAwRkZGRjAwMDBVTEwpID4+IDE2KTsKK31dPjsKKworZGVmIEhMMTYgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiByZXR1cm4gYml0cyAzMi00Ny4KKyAgcmV0dXJuIGdldEkxNkltbSgoTi0+Z2V0WkV4dFZhbHVlKCkgJiAweDAwMDBGRkZGMDAwMDAwMDBVTEwpID4+IDMyKTsKK31dPjsKKworZGVmIEhIMTYgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiByZXR1cm4gYml0cyA0OC02My4KKyAgcmV0dXJuIGdldEkxNkltbSgoTi0+Z2V0WkV4dFZhbHVlKCkgJiAweEZGRkYwMDAwMDAwMDAwMDBVTEwpID4+IDQ4KTsKK31dPjsKKworZGVmIExPMzIgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiByZXR1cm4gbG93IDMyIGJpdHMuCisgIHJldHVybiBnZXRJMzJJbW0oTi0+Z2V0WkV4dFZhbHVlKCkgJiAweDAwMDAwMDAwRkZGRkZGRkZVTEwpOworfV0+OworCitkZWYgSEkzMiA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IHJldHVybiBiaXRzIDMyLTYzLgorICByZXR1cm4gZ2V0STMySW1tKE4tPmdldFpFeHRWYWx1ZSgpID4+IDMyKTsKK31dPjsKKworZGVmIEdldEk2NEZyb21JMzIgOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KE4tPmdldFNFeHRWYWx1ZSgpLCBNVlQ6Omk2NCk7Cit9XT47CisKK2RlZiBpMzJsbDE2IDogUGF0TGVhZjwoaTMyIGltbSksIFt7CisgIC8vIGkzMmxsMTYgcHJlZGljYXRlIC0gdHJ1ZSBpZiB0aGUgMzItYml0IGltbWVkaWF0ZSBoYXMgb25seSByaWdodG1vc3QgMTYKKyAgLy8gYml0cyBzZXQuCisgIHJldHVybiAoKE4tPmdldFpFeHRWYWx1ZSgpICYgMHgwMDAwMDAwMDAwMDBGRkZGVUxMKSA9PSBOLT5nZXRaRXh0VmFsdWUoKSk7Cit9XSwgTEwxNj47CisKK2RlZiBpMzJsaDE2IDogUGF0TGVhZjwoaTMyIGltbSksIFt7CisgIC8vIGkzMmxoMTYgcHJlZGljYXRlIC0gdHJ1ZSBpZiB0aGUgMzItYml0IGltbWVkaWF0ZSBoYXMgb25seSBiaXRzIDE2LTMxIHNldC4KKyAgcmV0dXJuICgoTi0+Z2V0WkV4dFZhbHVlKCkgJiAweDAwMDAwMDAwRkZGRjAwMDBVTEwpID09IE4tPmdldFpFeHRWYWx1ZSgpKTsKK31dLCBMSDE2PjsKKworZGVmIGkzMmxsMTZjIDogUGF0TGVhZjwoaTMyIGltbSksIFt7CisgIC8vIGkzMmxsMTZjIHByZWRpY2F0ZSAtIHRydWUgaWYgdGhlIDMyLWJpdCBpbW1lZGlhdGUgaGFzIGFsbCBiaXRzIDE2LTMxIHNldC4KKyAgcmV0dXJuICgoTi0+Z2V0WkV4dFZhbHVlKCkgfCAweDAwMDAwMDAwRkZGRjAwMDBVTEwpID09IE4tPmdldFpFeHRWYWx1ZSgpKTsKK31dLCBMTDE2PjsKKworZGVmIGkzMmxoMTZjIDogUGF0TGVhZjwoaTMyIGltbSksIFt7CisgIC8vIGkzMmxoMTZjIHByZWRpY2F0ZSAtIHRydWUgaWYgdGhlIDMyLWJpdCBpbW1lZGlhdGUgaGFzIGFsbCByaWdodG1vc3QgMTYKKyAgLy8gIGJpdHMgc2V0LgorICByZXR1cm4gKChOLT5nZXRaRXh0VmFsdWUoKSB8IDB4MDAwMDAwMDAwMDAwRkZGRlVMTCkgPT0gTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIExIMTY+OworCitkZWYgaTY0bGwxNiA6IFBhdExlYWY8KGk2NCBpbW0pLCBbeyAgCisgIC8vIGk2NGxsMTYgcHJlZGljYXRlIC0gdHJ1ZSBpZiB0aGUgNjQtYml0IGltbWVkaWF0ZSBoYXMgb25seSByaWdodG1vc3QgMTYKKyAgLy8gYml0cyBzZXQuCisgIHJldHVybiAoKE4tPmdldFpFeHRWYWx1ZSgpICYgMHgwMDAwMDAwMDAwMDBGRkZGVUxMKSA9PSBOLT5nZXRaRXh0VmFsdWUoKSk7Cit9XSwgTEwxNj47CisKK2RlZiBpNjRsaDE2IDogUGF0TGVhZjwoaTY0IGltbSksIFt7ICAKKyAgLy8gaTY0bGgxNiBwcmVkaWNhdGUgLSB0cnVlIGlmIHRoZSA2NC1iaXQgaW1tZWRpYXRlIGhhcyBvbmx5IGJpdHMgMTYtMzEgc2V0LgorICByZXR1cm4gKChOLT5nZXRaRXh0VmFsdWUoKSAmIDB4MDAwMDAwMDBGRkZGMDAwMFVMTCkgPT0gTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIExIMTY+OworCitkZWYgaTY0aGwxNiA6IFBhdExlYWY8KGk2NCBpbW0pLCBbeyAgCisgIC8vIGk2NGhsMTYgcHJlZGljYXRlIC0gdHJ1ZSBpZiB0aGUgNjQtYml0IGltbWVkaWF0ZSBoYXMgb25seSBiaXRzIDMyLTQ3IHNldC4KKyAgcmV0dXJuICgoTi0+Z2V0WkV4dFZhbHVlKCkgJiAweDAwMDBGRkZGMDAwMDAwMDBVTEwpID09IE4tPmdldFpFeHRWYWx1ZSgpKTsKK31dLCBITDE2PjsKKworZGVmIGk2NGhoMTYgOiBQYXRMZWFmPChpNjQgaW1tKSwgW3sgIAorICAvLyBpNjRoaDE2IHByZWRpY2F0ZSAtIHRydWUgaWYgdGhlIDY0LWJpdCBpbW1lZGlhdGUgaGFzIG9ubHkgYml0cyA0OC02MyBzZXQuCisgIHJldHVybiAoKE4tPmdldFpFeHRWYWx1ZSgpICYgMHhGRkZGMDAwMDAwMDAwMDAwVUxMKSA9PSBOLT5nZXRaRXh0VmFsdWUoKSk7Cit9XSwgSEgxNj47CisKK2RlZiBpNjRsbDE2YyA6IFBhdExlYWY8KGk2NCBpbW0pLCBbeyAgCisgIC8vIGk2NGxsMTZjIHByZWRpY2F0ZSAtIHRydWUgaWYgdGhlIDY0LWJpdCBpbW1lZGlhdGUgaGFzIG9ubHkgcmlnaHRtb3N0IDE2CisgIC8vIGJpdHMgc2V0LgorICByZXR1cm4gKChOLT5nZXRaRXh0VmFsdWUoKSB8IDB4RkZGRkZGRkZGRkZGMDAwMFVMTCkgPT0gTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIExMMTY+OworCitkZWYgaTY0bGgxNmMgOiBQYXRMZWFmPChpNjQgaW1tKSwgW3sgIAorICAvLyBpNjRsaDE2YyBwcmVkaWNhdGUgLSB0cnVlIGlmIHRoZSA2NC1iaXQgaW1tZWRpYXRlIGhhcyBvbmx5IGJpdHMgMTYtMzEgc2V0LgorICByZXR1cm4gKChOLT5nZXRaRXh0VmFsdWUoKSB8IDB4RkZGRkZGRkYwMDAwRkZGRlVMTCkgPT0gTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIExIMTY+OworCitkZWYgaTY0aGwxNmMgOiBQYXRMZWFmPChpNjQgaW1tKSwgW3sgIAorICAvLyBpNjRobDE2YyBwcmVkaWNhdGUgLSB0cnVlIGlmIHRoZSA2NC1iaXQgaW1tZWRpYXRlIGhhcyBvbmx5IGJpdHMgMzItNDcgc2V0LgorICByZXR1cm4gKChOLT5nZXRaRXh0VmFsdWUoKSB8IDB4RkZGRjAwMDBGRkZGRkZGRlVMTCkgPT0gTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIEhMMTY+OworCitkZWYgaTY0aGgxNmMgOiBQYXRMZWFmPChpNjQgaW1tKSwgW3sgIAorICAvLyBpNjRoaDE2YyBwcmVkaWNhdGUgLSB0cnVlIGlmIHRoZSA2NC1iaXQgaW1tZWRpYXRlIGhhcyBvbmx5IGJpdHMgNDgtNjMgc2V0LgorICByZXR1cm4gKChOLT5nZXRaRXh0VmFsdWUoKSB8IDB4MDAwMEZGRkZGRkZGRkZGRlVMTCkgPT0gTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIEhIMTY+OworCitkZWYgaW1tU0V4dDE2IDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgLy8gaW1tU0V4dDE2IHByZWRpY2F0ZSAtIHRydWUgaWYgdGhlIGltbWVkaWF0ZSBmaXRzIGluIGEgMTYtYml0IHNpZ24gZXh0ZW5kZWQKKyAgLy8gZmllbGQuCisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppNjQpIHsKKyAgICB1aW50NjRfdCB2YWwgPSBOLT5nZXRaRXh0VmFsdWUoKTsKKyAgICByZXR1cm4gKChpbnQ2NF90KXZhbCA9PSAoaW50MTZfdCl2YWwpOworICB9IGVsc2UgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMikgeworICAgIHVpbnQzMl90IHZhbCA9IE4tPmdldFpFeHRWYWx1ZSgpOworICAgIHJldHVybiAoKGludDMyX3QpdmFsID09IChpbnQxNl90KXZhbCk7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9XSwgTEwxNj47CisKK2RlZiBpbW1TRXh0MzIgOiBQYXRMZWFmPChpNjQgaW1tKSwgW3sKKyAgLy8gaW1tU0V4dDMyIHByZWRpY2F0ZSAtIHRydWUgaWYgdGhlIGltbWVkaWF0ZSBmaXRzIGluIGEgMzItYml0IHNpZ24gZXh0ZW5kZWQKKyAgLy8gZmllbGQuCisgIHVpbnQ2NF90IHZhbCA9IE4tPmdldFpFeHRWYWx1ZSgpOworICByZXR1cm4gKChpbnQ2NF90KXZhbCA9PSAoaW50MzJfdCl2YWwpOworfV0sIExPMzI+OworCitkZWYgaTY0bG8zMiA6IFBhdExlYWY8KGk2NCBpbW0pLCBbeworICAvLyBpNjRsbzMyIHByZWRpY2F0ZSAtIHRydWUgaWYgdGhlIDY0LWJpdCBpbW1lZGlhdGUgaGFzIG9ubHkgcmlnaHRtb3N0IDMyCisgIC8vIGJpdHMgc2V0LgorICByZXR1cm4gKChOLT5nZXRaRXh0VmFsdWUoKSAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMTCkgPT0gTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIExPMzI+OworCitkZWYgaTY0aGkzMiA6IFBhdExlYWY8KGk2NCBpbW0pLCBbeworICAvLyBpNjRoaTMyIHByZWRpY2F0ZSAtIHRydWUgaWYgdGhlIDY0LWJpdCBpbW1lZGlhdGUgaGFzIG9ubHkgYml0cyAzMi02MyBzZXQuCisgIHJldHVybiAoKE4tPmdldFpFeHRWYWx1ZSgpICYgMHhGRkZGRkZGRjAwMDAwMDAwVUxMKSA9PSBOLT5nZXRaRXh0VmFsdWUoKSk7Cit9XSwgSEkzMj47CisKK2RlZiBpNjRsbzMyYyA6IFBhdExlYWY8KGk2NCBpbW0pLCBbeworICAvLyBpNjRsbzMyIHByZWRpY2F0ZSAtIHRydWUgaWYgdGhlIDY0LWJpdCBpbW1lZGlhdGUgaGFzIG9ubHkgcmlnaHRtb3N0IDMyCisgIC8vIGJpdHMgc2V0LgorICByZXR1cm4gKChOLT5nZXRaRXh0VmFsdWUoKSB8IDB4RkZGRkZGRkYwMDAwMDAwMFVMTCkgPT0gTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIExPMzI+OworCitkZWYgaTY0aGkzMmMgOiBQYXRMZWFmPChpNjQgaW1tKSwgW3sKKyAgLy8gaTY0aGkzMiBwcmVkaWNhdGUgLSB0cnVlIGlmIHRoZSA2NC1iaXQgaW1tZWRpYXRlIGhhcyBvbmx5IGJpdHMgMzItNjMgc2V0LgorICByZXR1cm4gKChOLT5nZXRaRXh0VmFsdWUoKSB8IDB4MDAwMDAwMDBGRkZGRkZGRlVMTCkgPT0gTi0+Z2V0WkV4dFZhbHVlKCkpOworfV0sIEhJMzI+OworCitkZWYgaTMyaW1tU0V4dDggIDogUGF0TGVhZjwoaTMyIGltbSksIFt7CisgIC8vIGkzMmltbVNFeHQ4IHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIDMyLWJpdCBpbW1lZGlhdGUgZml0cyBpbiBhIDgtYml0CisgIC8vIHNpZ24gZXh0ZW5kZWQgZmllbGQuCisgIHJldHVybiAoaW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSA9PSAoaW50OF90KU4tPmdldFpFeHRWYWx1ZSgpOworfV0sIExPOD47CisKK2RlZiBpMzJpbW1TRXh0MTYgOiBQYXRMZWFmPChpMzIgaW1tKSwgW3sKKyAgLy8gaTMyaW1tU0V4dDE2IHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIDMyLWJpdCBpbW1lZGlhdGUgZml0cyBpbiBhIDE2LWJpdAorICAvLyBzaWduIGV4dGVuZGVkIGZpZWxkLgorICByZXR1cm4gKGludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkgPT0gKGludDE2X3QpTi0+Z2V0WkV4dFZhbHVlKCk7Cit9XSwgTEwxNj47CisKK2RlZiBpNjRpbW1TRXh0MzIgOiBQYXRMZWFmPChpNjQgaW1tKSwgW3sKKyAgLy8gaTY0aW1tU0V4dDMyIHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIDY0LWJpdCBpbW1lZGlhdGUgZml0cyBpbiBhIDMyLWJpdAorICAvLyBzaWduIGV4dGVuZGVkIGZpZWxkLgorICByZXR1cm4gKGludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkgPT0gKGludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCk7Cit9XSwgTE8zMj47CisKK2RlZiBpNjRpbW1aRXh0MzIgOiBQYXRMZWFmPChpNjQgaW1tKSwgW3sKKyAgLy8gaTY0aW1tWkV4dDMyIHByZWRpY2F0ZSAtIFRydWUgaWYgdGhlIDY0LWJpdCBpbW1lZGlhdGUgZml0cyBpbiBhIDMyLWJpdAorICAvLyB6ZXJvIGV4dGVuZGVkIGZpZWxkLgorICByZXR1cm4gKHVpbnQ2NF90KU4tPmdldFpFeHRWYWx1ZSgpID09ICh1aW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKTsKK31dLCBMTzMyPjsKKworLy8gZXh0bG9hZHMKK2RlZiBleHRsb2FkaTMyaTggICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTMyIChleHRsb2FkaTggIG5vZGU6JHB0cikpPjsKK2RlZiBleHRsb2FkaTMyaTE2ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTMyIChleHRsb2FkaTE2IG5vZGU6JHB0cikpPjsKK2RlZiBleHRsb2FkaTY0aTggICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTY0IChleHRsb2FkaTggIG5vZGU6JHB0cikpPjsKK2RlZiBleHRsb2FkaTY0aTE2ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTY0IChleHRsb2FkaTE2IG5vZGU6JHB0cikpPjsKK2RlZiBleHRsb2FkaTY0aTMyICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTY0IChleHRsb2FkaTMyIG5vZGU6JHB0cikpPjsKKworZGVmIHNleHRsb2FkaTMyaTggICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTMyIChzZXh0bG9hZGk4ICBub2RlOiRwdHIpKT47CitkZWYgc2V4dGxvYWRpMzJpMTYgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpMzIgKHNleHRsb2FkaTE2IG5vZGU6JHB0cikpPjsKK2RlZiBzZXh0bG9hZGk2NGk4ICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGk2NCAoc2V4dGxvYWRpOCAgbm9kZTokcHRyKSk+OworZGVmIHNleHRsb2FkaTY0aTE2ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTY0IChzZXh0bG9hZGkxNiBub2RlOiRwdHIpKT47CitkZWYgc2V4dGxvYWRpNjRpMzIgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpNjQgKHNleHRsb2FkaTMyIG5vZGU6JHB0cikpPjsKKworZGVmIHpleHRsb2FkaTMyaTggICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTMyICh6ZXh0bG9hZGk4ICBub2RlOiRwdHIpKT47CitkZWYgemV4dGxvYWRpMzJpMTYgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpMzIgKHpleHRsb2FkaTE2IG5vZGU6JHB0cikpPjsKK2RlZiB6ZXh0bG9hZGk2NGk4ICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGk2NCAoemV4dGxvYWRpOCAgbm9kZTokcHRyKSk+OworZGVmIHpleHRsb2FkaTY0aTE2ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTY0ICh6ZXh0bG9hZGkxNiBub2RlOiRwdHIpKT47CitkZWYgemV4dGxvYWRpNjRpMzIgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpNjQgKHpleHRsb2FkaTMyIG5vZGU6JHB0cikpPjsKKworLy8gQSBjb3VwbGUgb2YgbW9yZSBkZXNjcmlwdGl2ZSBvcGVyYW5kIGRlZmluaXRpb25zLgorLy8gMzItYml0cyBidXQgb25seSA4IGJpdHMgYXJlIHNpZ25pZmljYW50LgorZGVmIGkzMmk4aW1tICA6IE9wZXJhbmQ8aTMyPjsKKy8vIDMyLWJpdHMgYnV0IG9ubHkgMTYgYml0cyBhcmUgc2lnbmlmaWNhbnQuCitkZWYgaTMyaTE2aW1tIDogT3BlcmFuZDxpMzI+OworLy8gNjQtYml0cyBidXQgb25seSAzMiBiaXRzIGFyZSBzaWduaWZpY2FudC4KK2RlZiBpNjRpMzJpbW0gOiBPcGVyYW5kPGk2ND47CisvLyBCcmFuY2ggdGFyZ2V0cyBoYXZlIE90aGVyVlQgdHlwZS4KK2RlZiBicnRhcmdldCA6IE9wZXJhbmQ8T3RoZXJWVD47CisKKy8vIFVuc2lnbmVkIGkxMgorZGVmIHUxMmltbSA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFUxMkltbU9wZXJhbmQiOworfQorZGVmIHUxMmltbTY0IDogT3BlcmFuZDxpNjQ+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50VTEySW1tT3BlcmFuZCI7Cit9CisKKy8vIFNpZ25lZCBpMTYKK2RlZiBzMTZpbW0gOiBPcGVyYW5kPGkzMj4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTMTZJbW1PcGVyYW5kIjsKK30KK2RlZiBzMTZpbW02NCA6IE9wZXJhbmQ8aTY0PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFMxNkltbU9wZXJhbmQiOworfQorLy8gU2lnbmVkIGkyMAorZGVmIHMyMGltbSA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFMyMEltbU9wZXJhbmQiOworfQorZGVmIHMyMGltbTY0IDogT3BlcmFuZDxpNjQ+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UzIwSW1tT3BlcmFuZCI7Cit9CisvLyBTaWduZWQgaTMyCitkZWYgczMyaW1tIDogT3BlcmFuZDxpMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UzMySW1tT3BlcmFuZCI7Cit9CitkZWYgczMyaW1tNjQgOiBPcGVyYW5kPGk2ND4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRTMzJJbW1PcGVyYW5kIjsKK30KKworZGVmIGltbV9wY3JlbCA6IE9wZXJhbmQ8aTY0PiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFBDUmVsSW1tT3BlcmFuZCI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTeXN0ZW1aIE9wZXJhbmQgRGVmaW5pdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBBZGRyZXNzIG9wZXJhbmRzCisKKy8vIHJpYWRkciA6PSByZWcgKyBpbW0KK2RlZiByaWFkZHIzMiA6IE9wZXJhbmQ8aTY0PiwKKyAgICAgICAgICAgICAgIENvbXBsZXhQYXR0ZXJuPGk2NCwgMiwgIlNlbGVjdEFkZHJSSTEyT25seSIsIFtdPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFJJQWRkck9wZXJhbmQiOworICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgQUREUjY0OiRiYXNlLCB1MTJpbW06JGRpc3ApOworfQorCitkZWYgcmlhZGRyMTIgOiBPcGVyYW5kPGk2ND4sCisgICAgICAgICAgICAgICBDb21wbGV4UGF0dGVybjxpNjQsIDIsICJTZWxlY3RBZGRyUkkxMiIsIFtdPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFJJQWRkck9wZXJhbmQiOworICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgQUREUjY0OiRiYXNlLCB1MTJpbW02NDokZGlzcCk7Cit9CisKK2RlZiByaWFkZHIgOiBPcGVyYW5kPGk2ND4sCisgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTY0LCAyLCAiU2VsZWN0QWRkclJJIiwgW10+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50UklBZGRyT3BlcmFuZCI7CisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBBRERSNjQ6JGJhc2UsIHMyMGltbTY0OiRkaXNwKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gcnJpYWRkciA6PSByZWcgKyByZWcgKyBpbW0KK2RlZiBycmlhZGRyMTIgOiBPcGVyYW5kPGk2ND4sCisgICAgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTY0LCAzLCAiU2VsZWN0QWRkclJSSTEyIiwgW10sIFtdPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFJSSUFkZHJPcGVyYW5kIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEFERFI2NDokYmFzZSwgdTEyaW1tNjQ6JGRpc3AsIEFERFI2NDokaW5kZXgpOworfQorZGVmIHJyaWFkZHIgOiBPcGVyYW5kPGk2ND4sCisgICAgICAgICAgICAgIENvbXBsZXhQYXR0ZXJuPGk2NCwgMywgIlNlbGVjdEFkZHJSUkkyMCIsIFtdLCBbXT4geworICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRSUklBZGRyT3BlcmFuZCI7CisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBBRERSNjQ6JGJhc2UsIHMyMGltbTY0OiRkaXNwLCBBRERSNjQ6JGluZGV4KTsKK30KK2RlZiBsYWFkZHIgOiBPcGVyYW5kPGk2ND4sCisgICAgICAgICAgICAgQ29tcGxleFBhdHRlcm48aTY0LCAzLCAiU2VsZWN0TEFBZGRyIiwgW2FkZCwgc3ViLCBvciwgZnJhbWVpbmRleF0sIFtdPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFJSSUFkZHJPcGVyYW5kIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEFERFI2NDokYmFzZSwgczIwaW1tNjQ6JGRpc3AsIEFERFI2NDokaW5kZXgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpSZWdpc3RlckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpSZWdpc3RlckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTZiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWlJlZ2lzdGVySW5mby5jcHAKQEAgLTAsMCArMSwzMjcgQEAKKy8vPT09LSBTeXN0ZW1aUmVnaXN0ZXJJbmZvLmNwcCAtIFN5c3RlbVogUmVnaXN0ZXIgSW5mb3JtYXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgU3lzdGVtWiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJTeXN0ZW1aLmgiCisjaW5jbHVkZSAiU3lzdGVtWkluc3RySW5mby5oIgorI2luY2x1ZGUgIlN5c3RlbVpNYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAiU3lzdGVtWlJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgIlN5c3RlbVpTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTeXN0ZW1aUmVnaXN0ZXJJbmZvOjpTeXN0ZW1aUmVnaXN0ZXJJbmZvKFN5c3RlbVpUYXJnZXRNYWNoaW5lICZ0bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3lzdGVtWkluc3RySW5mbyAmdGlpKQorICA6IFN5c3RlbVpHZW5SZWdpc3RlckluZm8oU3lzdGVtWjo6QURKQ0FMTFNUQUNLVVAsIFN5c3RlbVo6OkFESkNBTExTVEFDS0RPV04pLAorICAgIFRNKHRtKSwgVElJKHRpaSkgeworfQorCitjb25zdCB1bnNpZ25lZCoKK1N5c3RlbVpSZWdpc3RlckluZm86OmdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GKSBjb25zdCB7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBDYWxsZWVTYXZlZFJlZ3NbXSA9IHsKKyAgICBTeXN0ZW1aOjpSNkQsICBTeXN0ZW1aOjpSN0QsICBTeXN0ZW1aOjpSOEQsICBTeXN0ZW1aOjpSOUQsCisgICAgU3lzdGVtWjo6UjEwRCwgU3lzdGVtWjo6UjExRCwgU3lzdGVtWjo6UjEyRCwgU3lzdGVtWjo6UjEzRCwKKyAgICBTeXN0ZW1aOjpSMTRELCBTeXN0ZW1aOjpSMTVELAorICAgIFN5c3RlbVo6OkY4TCwgIFN5c3RlbVo6OkY5TCwgIFN5c3RlbVo6OkYxMEwsIFN5c3RlbVo6OkYxMUwsCisgICAgU3lzdGVtWjo6RjEyTCwgU3lzdGVtWjo6RjEzTCwgU3lzdGVtWjo6RjE0TCwgU3lzdGVtWjo6RjE1TCwKKyAgICAwCisgIH07CisKKyAgcmV0dXJuIENhbGxlZVNhdmVkUmVnczsKK30KKworQml0VmVjdG9yIFN5c3RlbVpSZWdpc3RlckluZm86OmdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIEJpdFZlY3RvciBSZXNlcnZlZChnZXROdW1SZWdzKCkpOworICBpZiAoaGFzRlAoTUYpKQorICAgIFJlc2VydmVkLnNldChTeXN0ZW1aOjpSMTFEKTsKKyAgUmVzZXJ2ZWQuc2V0KFN5c3RlbVo6OlIxNEQpOworICBSZXNlcnZlZC5zZXQoU3lzdGVtWjo6UjE1RCk7CisgIHJldHVybiBSZXNlcnZlZDsKK30KKworLy8vIG5lZWRzRlAgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGEgZGVkaWNhdGVkCisvLy8gZnJhbWUgcG9pbnRlciByZWdpc3Rlci4gIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaGFzIHZhcmlhYmxlIHNpemVkCisvLy8gYWxsb2NhcyBvciBpZiBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uIGlzIGRpc2FibGVkLgorYm9vbCBTeXN0ZW1aUmVnaXN0ZXJJbmZvOjpoYXNGUChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICByZXR1cm4gRGlzYWJsZUZyYW1lUG9pbnRlckVsaW0oTUYpIHx8IE1GSS0+aGFzVmFyU2l6ZWRPYmplY3RzKCk7Cit9CisKK3ZvaWQgU3lzdGVtWlJlZ2lzdGVySW5mbzo6CitlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIGNvbnN0IHsKKyAgTUJCLmVyYXNlKEkpOworfQorCitpbnQgU3lzdGVtWlJlZ2lzdGVySW5mbzo6Z2V0RnJhbWVJbmRleE9mZnNldChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZJKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEZyYW1lSW5mbyAmVEZJID0gKk1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpOworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgY29uc3QgU3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8gKlN5c3RlbVpNRkkgPQorICAgIE1GLmdldEluZm88U3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisgIGludCBPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChGSSkgKyBNRkktPmdldE9mZnNldEFkanVzdG1lbnQoKTsKKyAgdWludDY0X3QgU3RhY2tTaXplID0gTUZJLT5nZXRTdGFja1NpemUoKTsKKworICAvLyBGaXhlZCBvYmplY3RzIGFyZSByZWFsbHkgbG9jYXRlZCBpbiB0aGUgInByZXZpb3VzIiBmcmFtZS4KKyAgaWYgKEZJIDwgMCkKKyAgICBTdGFja1NpemUgLT0gU3lzdGVtWk1GSS0+Z2V0Q2FsbGVlU2F2ZWRGcmFtZVNpemUoKTsKKworICBPZmZzZXQgKz0gU3RhY2tTaXplIC0gVEZJLmdldE9mZnNldE9mTG9jYWxBcmVhKCk7CisKKyAgLy8gU2tpcCB0aGUgcmVnaXN0ZXIgc2F2ZSBhcmVhIGlmIHdlIGdlbmVyYXRlZCB0aGUgc3RhY2sgZnJhbWUuCisgIGlmIChTdGFja1NpemUgfHwgTUZJLT5oYXNDYWxscygpKQorICAgIE9mZnNldCAtPSBURkkuZ2V0T2Zmc2V0T2ZMb2NhbEFyZWEoKTsKKworICByZXR1cm4gT2Zmc2V0OworfQorCit1bnNpZ25lZAorU3lzdGVtWlJlZ2lzdGVySW5mbzo6ZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUEFkaiwgRnJhbWVJbmRleFZhbHVlICpWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3QgeworICBhc3NlcnQoU1BBZGogPT0gMCAmJiAiVW54cGVjdGVkIik7CisKKyAgdW5zaWduZWQgaSA9IDA7CisgIE1hY2hpbmVJbnN0ciAmTUkgPSAqSUk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUkuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICB3aGlsZSAoIU1JLmdldE9wZXJhbmQoaSkuaXNGSSgpKSB7CisgICAgKytpOworICAgIGFzc2VydChpIDwgTUkuZ2V0TnVtT3BlcmFuZHMoKSAmJiAiSW5zdHIgZG9lc24ndCBoYXZlIEZyYW1lSW5kZXggb3BlcmFuZCEiKTsKKyAgfQorCisgIGludCBGcmFtZUluZGV4ID0gTUkuZ2V0T3BlcmFuZChpKS5nZXRJbmRleCgpOworCisgIHVuc2lnbmVkIEJhc2VQdHIgPSAoaGFzRlAoTUYpID8gU3lzdGVtWjo6UjExRCA6IFN5c3RlbVo6OlIxNUQpOworCisgIC8vIFRoaXMgbXVzdCBiZSBwYXJ0IG9mIGEgcnJpIG9yIHJpIG9wZXJhbmQgbWVtb3J5IHJlZmVyZW5jZS4gIFJlcGxhY2UgdGhlCisgIC8vIEZyYW1lSW5kZXggd2l0aCBiYXNlIHJlZ2lzdGVyIHdpdGggQmFzZVB0ci4gIEFkZCBhbiBvZmZzZXQgdG8gdGhlCisgIC8vIGRpc3BsYWNlbWVudCBmaWVsZC4KKyAgTUkuZ2V0T3BlcmFuZChpKS5DaGFuZ2VUb1JlZ2lzdGVyKEJhc2VQdHIsIGZhbHNlKTsKKworICAvLyBPZmZzZXQgaXMgYSBlaXRoZXIgMTItYml0IHVuc2lnbmVkIG9yIDIwLWJpdCBzaWduZWQgaW50ZWdlci4KKyAgLy8gRklYTUU6IGhhbmRsZSAidG9vIGxvbmciIGRpc3BsYWNlbWVudHMuCisgIGludCBPZmZzZXQgPSBnZXRGcmFtZUluZGV4T2Zmc2V0KE1GLCBGcmFtZUluZGV4KSArIE1JLmdldE9wZXJhbmQoaSsxKS5nZXRJbW0oKTsKKworICAvLyBDaGVjayB3aGV0aGVyIGRpc3BsYWNlbWVudCBpcyB0b28gbG9uZyB0byBmaXQgaW50byAxMiBiaXQgemV4dCBmaWVsZC4KKyAgTUkuc2V0RGVzYyhUSUkuZ2V0TWVtb3J5SW5zdHIoTUkuZ2V0T3Bjb2RlKCksIE9mZnNldCkpOworCisgIE1JLmdldE9wZXJhbmQoaSsxKS5DaGFuZ2VUb0ltbWVkaWF0ZShPZmZzZXQpOworICByZXR1cm4gMDsKK30KKwordm9pZAorU3lzdGVtWlJlZ2lzdGVySW5mbzo6cHJvY2Vzc0Z1bmN0aW9uQmVmb3JlQ2FsbGVlU2F2ZWRTY2FuKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3QgeworICAvLyBEZXRlcm1pbmUgd2hldGhlciBSMTUvUjE0IHdpbGwgZXZlciBiZSBjbG9iYmVyZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gQW5kCisgIC8vIGlmIHllcyAtIG1hcmsgaXQgYXMgJ2NhbGxlZScgc2F2ZWQuCisgIE1hY2hpbmVGcmFtZUluZm8gKkZGSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkgPSBNRi5nZXRSZWdJbmZvKCk7CisKKyAgLy8gQ2hlY2sgd2hldGhlciBoaWdoIEZQUnMgYXJlIGV2ZXIgdXNlZCwgaWYgeWVzIC0gd2UgbmVlZCB0byBzYXZlIFIxNSBhcworICAvLyB3ZWxsLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSGlnaEZQUnNbXSA9IHsKKyAgICBTeXN0ZW1aOjpGOEwsICBTeXN0ZW1aOjpGOUwsICBTeXN0ZW1aOjpGMTBMLCBTeXN0ZW1aOjpGMTFMLAorICAgIFN5c3RlbVo6OkYxMkwsIFN5c3RlbVo6OkYxM0wsIFN5c3RlbVo6OkYxNEwsIFN5c3RlbVo6OkYxNUwsCisgICAgU3lzdGVtWjo6RjhTLCAgU3lzdGVtWjo6RjlTLCAgU3lzdGVtWjo6RjEwUywgU3lzdGVtWjo6RjExUywKKyAgICBTeXN0ZW1aOjpGMTJTLCBTeXN0ZW1aOjpGMTNTLCBTeXN0ZW1aOjpGMTRTLCBTeXN0ZW1aOjpGMTVTLAorICB9OworCisgIGJvb2wgSGlnaEZQUnNVc2VkID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBhcnJheV9sZW5ndGhvZihIaWdoRlBScyk7IGkgIT0gZTsgKytpKQorICAgIEhpZ2hGUFJzVXNlZCB8PSBNUkkuaXNQaHlzUmVnVXNlZChIaWdoRlBSc1tpXSk7CisKKyAgaWYgKEZGSS0+aGFzQ2FsbHMoKSkKKyAgICAvKiBGSVhNRTogZnVuY3Rpb24gaXMgdmFyYXJncyAqLworICAgIC8qIEZJWE1FOiBmdW5jdGlvbiBncmFicyBSQSAqLworICAgIC8qIEZJWE1FOiBmdW5jdGlvbiBjYWxscyBlaF9yZXR1cm4gKi8KKyAgICBNUkkuc2V0UGh5c1JlZ1VzZWQoU3lzdGVtWjo6UjE0RCk7CisKKyAgaWYgKEhpZ2hGUFJzVXNlZCB8fAorICAgICAgRkZJLT5oYXNDYWxscygpIHx8CisgICAgICBGRkktPmdldE9iamVjdEluZGV4RW5kKCkgIT0gMCB8fCAvLyBDb250YWlucyBhdXRvbWF0aWMgdmFyaWFibGVzCisgICAgICBGRkktPmhhc1ZhclNpemVkT2JqZWN0cygpIC8vIEZ1bmN0aW9uIGNhbGxzIGR5bmFtaWMgYWxsb2NhJ3MKKyAgICAgIC8qIEZJWE1FOiBmdW5jdGlvbiBpcyB2YXJhcmdzICovKQorICAgIE1SSS5zZXRQaHlzUmVnVXNlZChTeXN0ZW1aOjpSMTVEKTsKK30KKworLy8vIGVtaXRTUFVwZGF0ZSAtIEVtaXQgYSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zIHRvIGluY3JlbWVudCAvIGRlY3JlbWVudCB0aGUKKy8vLyBzdGFjayBwb2ludGVyIGJ5IGEgY29uc3RhbnQgdmFsdWUuCitzdGF0aWMKK3ZvaWQgZW1pdFNQVXBkYXRlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUJCSSwKKyAgICAgICAgICAgICAgICAgIGludDY0X3QgTnVtQnl0ZXMsIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJKSB7CisgIHVuc2lnbmVkIE9wYzsgdWludDY0X3QgQ2h1bms7CisgIGJvb2wgaXNTdWIgPSBOdW1CeXRlcyA8IDA7CisgIHVpbnQ2NF90IE9mZnNldCA9IGlzU3ViID8gLU51bUJ5dGVzIDogTnVtQnl0ZXM7CisKKyAgaWYgKE9mZnNldCA+PSAoMUxMIDw8IDE1KSAtIDEpIHsKKyAgICBPcGMgPSBTeXN0ZW1aOjpBREQ2NHJpMzI7CisgICAgQ2h1bmsgPSAoMUxMIDw8IDMxKSAtIDE7CisgIH0gZWxzZSB7CisgICAgT3BjID0gU3lzdGVtWjo6QURENjRyaTE2OworICAgIENodW5rID0gKDFMTCA8PCAxNSkgLSAxOworICB9CisKKyAgRGVidWdMb2MgREwgPSBNQkJJICE9IE1CQi5lbmQoKSA/IE1CQkktPmdldERlYnVnTG9jKCkgOiBEZWJ1Z0xvYygpOworCisgIHdoaWxlIChPZmZzZXQpIHsKKyAgICB1aW50NjRfdCBUaGlzVmFsID0gKE9mZnNldCA+IENodW5rKSA/IENodW5rIDogT2Zmc2V0OworICAgIE1hY2hpbmVJbnN0ciAqTUkgPQorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KE9wYyksIFN5c3RlbVo6OlIxNUQpCisgICAgICAuYWRkUmVnKFN5c3RlbVo6OlIxNUQpLmFkZEltbShpc1N1YiA/IC1UaGlzVmFsIDogVGhpc1ZhbCk7CisgICAgLy8gVGhlIFBTVyBpbXBsaWNpdCBkZWYgaXMgZGVhZC4KKyAgICBNSS0+Z2V0T3BlcmFuZCgzKS5zZXRJc0RlYWQoKTsKKyAgICBPZmZzZXQgLT0gVGhpc1ZhbDsKKyAgfQorfQorCit2b2lkIFN5c3RlbVpSZWdpc3RlckluZm86OmVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIgPSBNRi5mcm9udCgpOyAgIC8vIFByb2xvZyBnb2VzIGluIGVudHJ5IEJCCisgIGNvbnN0IFRhcmdldEZyYW1lSW5mbyAmVEZJID0gKk1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgU3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8gKlN5c3RlbVpNRkkgPQorICAgIE1GLmdldEluZm88U3lzdGVtWk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gTUJCLmJlZ2luKCk7CisgIERlYnVnTG9jIERMID0gTUJCSSAhPSBNQkIuZW5kKCkgPyBNQkJJLT5nZXREZWJ1Z0xvYygpIDogRGVidWdMb2MoKTsKKworICAvLyBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBGcmFtZUluZm8uCisgIC8vIE5vdGUgdGhhdCBhcmVhIGZvciBjYWxsZWUtc2F2ZWQgc3R1ZmYgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIHRodXMgd2UgbmVlZCB0bworICAvLyAndW5kbycgdGhlIHN0YWNrIG1vdmVtZW50LgorICB1aW50NjRfdCBTdGFja1NpemUgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworICBTdGFja1NpemUgLT0gU3lzdGVtWk1GSS0+Z2V0Q2FsbGVlU2F2ZWRGcmFtZVNpemUoKTsKKworICB1aW50NjRfdCBOdW1CeXRlcyA9IFN0YWNrU2l6ZSAtIFRGSS5nZXRPZmZzZXRPZkxvY2FsQXJlYSgpOworCisgIC8vIFNraXAgdGhlIGNhbGxlZS1zYXZlZCBwdXNoIGluc3RydWN0aW9ucy4KKyAgd2hpbGUgKE1CQkkgIT0gTUJCLmVuZCgpICYmCisgICAgICAgICAoTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gU3lzdGVtWjo6TU9WNjRtciB8fAorICAgICAgICAgIE1CQkktPmdldE9wY29kZSgpID09IFN5c3RlbVo6Ok1PVjY0bXJtKSkKKyAgICArK01CQkk7CisKKyAgaWYgKE1CQkkgIT0gTUJCLmVuZCgpKQorICAgIERMID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBhZGp1c3Qgc3RhY2sgcG9pbnRlcjogUjE1IC09IG51bWJ5dGVzCisgIGlmIChTdGFja1NpemUgfHwgTUZJLT5oYXNDYWxscygpKSB7CisgICAgYXNzZXJ0KE1GLmdldFJlZ0luZm8oKS5pc1BoeXNSZWdVc2VkKFN5c3RlbVo6OlIxNUQpICYmCisgICAgICAgICAgICJJbnZhbGlkIHN0YWNrIGZyYW1lIGNhbGN1bGF0aW9uISIpOworICAgIGVtaXRTUFVwZGF0ZShNQkIsIE1CQkksIC0oaW50NjRfdClOdW1CeXRlcywgVElJKTsKKyAgfQorCisgIGlmIChoYXNGUChNRikpIHsKKyAgICAvLyBVcGRhdGUgUjExIHdpdGggdGhlIG5ldyBiYXNlIHZhbHVlLi4uCisgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KFN5c3RlbVo6Ok1PVjY0cnIpLCBTeXN0ZW1aOjpSMTFEKQorICAgICAgLmFkZFJlZyhTeXN0ZW1aOjpSMTVEKTsKKworICAgIC8vIE1hcmsgdGhlIEZyYW1lUHRyIGFzIGxpdmUtaW4gaW4gZXZlcnkgYmxvY2sgZXhjZXB0IHRoZSBlbnRyeS4KKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IGxsdm06Om5leHQoTUYuYmVnaW4oKSksIEUgPSBNRi5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgSS0+YWRkTGl2ZUluKFN5c3RlbVo6OlIxMUQpOworCisgIH0KK30KKwordm9pZCBTeXN0ZW1aUmVnaXN0ZXJJbmZvOjplbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBjb25zdCBUYXJnZXRGcmFtZUluZm8gJlRGSSA9ICpNRi5nZXRUYXJnZXQoKS5nZXRGcmFtZUluZm8oKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBwcmlvcihNQkIuZW5kKCkpOworICBTeXN0ZW1aTWFjaGluZUZ1bmN0aW9uSW5mbyAqU3lzdGVtWk1GSSA9CisgICAgTUYuZ2V0SW5mbzxTeXN0ZW1aTWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKyAgdW5zaWduZWQgUmV0T3Bjb2RlID0gTUJCSS0+Z2V0T3Bjb2RlKCk7CisKKyAgc3dpdGNoIChSZXRPcGNvZGUpIHsKKyAgY2FzZSBTeXN0ZW1aOjpSRVQ6IGJyZWFrOyAgLy8gVGhlc2UgYXJlIG9rCisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIkNhbiBvbmx5IGluc2VydCBlcGlsb2cgaW50byByZXR1cm5pbmcgYmxvY2tzIik7CisgIH0KKworICAvLyBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBGcmFtZUluZm8KKyAgLy8gTm90ZSB0aGF0IGFyZWEgZm9yIGNhbGxlZS1zYXZlZCBzdHVmZiBpcyBhbHJlYWR5IGFsbG9jYXRlZCwgdGh1cyB3ZSBuZWVkIHRvCisgIC8vICd1bmRvJyB0aGUgc3RhY2sgbW92ZW1lbnQuCisgIHVpbnQ2NF90IFN0YWNrU2l6ZSA9CisgICAgTUZJLT5nZXRTdGFja1NpemUoKSAtIFN5c3RlbVpNRkktPmdldENhbGxlZVNhdmVkRnJhbWVTaXplKCk7CisgIHVpbnQ2NF90IE51bUJ5dGVzID0gU3RhY2tTaXplIC0gVEZJLmdldE9mZnNldE9mTG9jYWxBcmVhKCk7CisKKyAgLy8gU2tpcCB0aGUgZmluYWwgdGVybWluYXRvciBpbnN0cnVjdGlvbi4KKyAgd2hpbGUgKE1CQkkgIT0gTUJCLmJlZ2luKCkpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUEkgPSBwcmlvcihNQkJJKTsKKyAgICAtLU1CQkk7CisgICAgaWYgKCFQSS0+Z2V0RGVzYygpLmlzVGVybWluYXRvcigpKQorICAgICAgYnJlYWs7CisgIH0KKworICAvLyBEdXJpbmcgY2FsbGVlLXNhdmVkIHJlc3RvcmVzIGVtaXNzaW9uIHN0YWNrIGZyYW1lIHdhcyBub3QgeWV0IGZpbmlhbGl6ZWQKKyAgLy8gKGFuZCB0aHVzIC0gdGhlIHN0YWNrIHNpemUgd2FzIHVua25vd24pLiBUdW5lIHRoZSBvZmZzZXQgaGF2aW5nIGZ1bGwgc3RhY2sKKyAgLy8gc2l6ZSBpbiBoYW5kcy4KKyAgaWYgKFN0YWNrU2l6ZSB8fCBNRkktPmhhc0NhbGxzKCkpIHsKKyAgICBhc3NlcnQoKE1CQkktPmdldE9wY29kZSgpID09IFN5c3RlbVo6Ok1PVjY0cm1tIHx8CisgICAgICAgICAgICBNQkJJLT5nZXRPcGNvZGUoKSA9PSBTeXN0ZW1aOjpNT1Y2NHJtKSAmJgorICAgICAgICAgICAiRXhwZWN0ZWQgdG8gc2VlIGNhbGxlZS1zYXZlIHJlZ2lzdGVyIHJlc3RvcmUgY29kZSIpOworICAgIGFzc2VydChNRi5nZXRSZWdJbmZvKCkuaXNQaHlzUmVnVXNlZChTeXN0ZW1aOjpSMTVEKSAmJgorICAgICAgICAgICAiSW52YWxpZCBzdGFjayBmcmFtZSBjYWxjdWxhdGlvbiEiKTsKKworICAgIHVuc2lnbmVkIGkgPSAwOworICAgIE1hY2hpbmVJbnN0ciAmTUkgPSAqTUJCSTsKKyAgICB3aGlsZSAoIU1JLmdldE9wZXJhbmQoaSkuaXNJbW0oKSkgeworICAgICAgKytpOworICAgICAgYXNzZXJ0KGkgPCBNSS5nZXROdW1PcGVyYW5kcygpICYmICJVbmV4cGVjdGVkIHJlc3RvcmUgY29kZSEiKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBPZmZzZXQgPSBOdW1CeXRlcyArIE1JLmdldE9wZXJhbmQoaSkuZ2V0SW1tKCk7CisgICAgLy8gSWYgT2Zmc2V0IGRvZXMgbm90IGZpdCBpbnRvIDIwLWJpdCBzaWduZWQgZGlzcGxhY2VtZW50IGZpZWxkIHdlIG5lZWQgdG8KKyAgICAvLyBlbWl0IHNvbWUgYWRkaXRpb25hbCBjb2RlLi4uCisgICAgaWYgKE9mZnNldCA+IDUyNDI4NykgeworICAgICAgLy8gRm9sZCB0aGUgZGlzcGxhY2VtZW50IGludG8gbG9hZCBpbnN0cnVjdGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgICAgTnVtQnl0ZXMgPSBPZmZzZXQgLSA1MjQyODc7CisgICAgICBPZmZzZXQgPSA1MjQyODc7CisgICAgICBlbWl0U1BVcGRhdGUoTUJCLCBNQkJJLCBOdW1CeXRlcywgVElJKTsKKyAgICB9CisKKyAgICBNSS5nZXRPcGVyYW5kKGkpLkNoYW5nZVRvSW1tZWRpYXRlKE9mZnNldCk7CisgIH0KK30KKwordW5zaWduZWQgU3lzdGVtWlJlZ2lzdGVySW5mbzo6Z2V0UkFSZWdpc3RlcigpIGNvbnN0IHsKKyAgYXNzZXJ0KDAgJiYgIldoYXQgaXMgdGhlIHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyIik7CisgIHJldHVybiAwOworfQorCit1bnNpZ25lZAorU3lzdGVtWlJlZ2lzdGVySW5mbzo6Z2V0RnJhbWVSZWdpc3Rlcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIGFzc2VydCgwICYmICJXaGF0IGlzIHRoZSBmcmFtZSByZWdpc3RlciIpOworICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgU3lzdGVtWlJlZ2lzdGVySW5mbzo6Z2V0RUhFeGNlcHRpb25SZWdpc3RlcigpIGNvbnN0IHsKKyAgYXNzZXJ0KDAgJiYgIldoYXQgaXMgdGhlIGV4Y2VwdGlvbiByZWdpc3RlciIpOworICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgU3lzdGVtWlJlZ2lzdGVySW5mbzo6Z2V0RUhIYW5kbGVyUmVnaXN0ZXIoKSBjb25zdCB7CisgIGFzc2VydCgwICYmICJXaGF0IGlzIHRoZSBleGNlcHRpb24gaGFuZGxlciByZWdpc3RlciIpOworICByZXR1cm4gMDsKK30KKworaW50IFN5c3RlbVpSZWdpc3RlckluZm86OmdldER3YXJmUmVnTnVtKHVuc2lnbmVkIFJlZ051bSwgYm9vbCBpc0VIKSBjb25zdCB7CisgIGFzc2VydCgwICYmICJXaGF0IGlzIHRoZSBkd2FyZiByZWdpc3RlciBudW1iZXIiKTsKKyAgcmV0dXJuIC0xOworfQorCisjaW5jbHVkZSAiU3lzdGVtWkdlblJlZ2lzdGVySW5mby5pbmMiCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWlJlZ2lzdGVySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpSZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzdiZTdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpSZWdpc3RlckluZm8uaApAQCAtMCwwICsxLDcwIEBACisvLz09PS0tIFN5c3RlbVpSZWdpc3RlckluZm8uaCAtIFN5c3RlbVogUmVnaXN0ZXIgSW5mb3JtYXRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgU3lzdGVtWiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU3lzdGVtWlJFR0lTVEVSSU5GT19ICisjZGVmaW5lIFN5c3RlbVpSRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAiU3lzdGVtWkdlblJlZ2lzdGVySW5mby5oLmluYyIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTeXN0ZW1aU3VidGFyZ2V0OworY2xhc3MgU3lzdGVtWkluc3RySW5mbzsKK2NsYXNzIFR5cGU7CisKK3N0cnVjdCBTeXN0ZW1aUmVnaXN0ZXJJbmZvIDogcHVibGljIFN5c3RlbVpHZW5SZWdpc3RlckluZm8geworICBTeXN0ZW1aVGFyZ2V0TWFjaGluZSAmVE07CisgIGNvbnN0IFN5c3RlbVpJbnN0ckluZm8gJlRJSTsKKworICBTeXN0ZW1aUmVnaXN0ZXJJbmZvKFN5c3RlbVpUYXJnZXRNYWNoaW5lICZ0bSwgY29uc3QgU3lzdGVtWkluc3RySW5mbyAmdGlpKTsKKworICAvLy8gQ29kZSBHZW5lcmF0aW9uIHZpcnR1YWwgbWV0aG9kcy4uLgorICBjb25zdCB1bnNpZ25lZCAqZ2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYgPSAwKSBjb25zdDsKKworICBCaXRWZWN0b3IgZ2V0UmVzZXJ2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIGJvb2wgaGFzUmVzZXJ2ZWRDYWxsRnJhbWUoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIGhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIGludCBnZXRGcmFtZUluZGV4T2Zmc2V0KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludCBGSSkgY29uc3Q7CisKKyAgdm9pZCBlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIGNvbnN0OworCisgIHVuc2lnbmVkIGVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUEFkaiwgRnJhbWVJbmRleFZhbHVlICpWYWx1ZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IE5VTEwpIGNvbnN0OworCisKKyAgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVDYWxsZWVTYXZlZFNjYW4oTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3Q7CisKKyAgdm9pZCBlbWl0UHJvbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIHZvaWQgZW1pdEVwaWxvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0OworCisgIC8vIERlYnVnIGluZm9ybWF0aW9uIHF1ZXJpZXMuCisgIHVuc2lnbmVkIGdldFJBUmVnaXN0ZXIoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0RnJhbWVSZWdpc3Rlcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLyBFeGNlcHRpb24gaGFuZGxpbmcgcXVlcmllcy4KKyAgdW5zaWduZWQgZ2V0RUhFeGNlcHRpb25SZWdpc3RlcigpIGNvbnN0OworICB1bnNpZ25lZCBnZXRFSEhhbmRsZXJSZWdpc3RlcigpIGNvbnN0OworCisgIGludCBnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aUmVnaXN0ZXJJbmZvLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpSZWdpc3RlckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiZThkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aUmVnaXN0ZXJJbmZvLnRkCkBAIC0wLDAgKzEsNDc4IEBACisvLz09PS0gU3lzdGVtWlJlZ2lzdGVySW5mby50ZCAtIFRoZSBQb3dlclBDIFJlZ2lzdGVyIEZpbGUgLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBTeXN0ZW1aUmVnPHN0cmluZyBuPiA6IFJlZ2lzdGVyPG4+IHsKKyAgbGV0IE5hbWVzcGFjZSA9ICJTeXN0ZW1aIjsKK30KKworY2xhc3MgU3lzdGVtWlJlZ1dpdGhTdWJyZWdzPHN0cmluZyBuLCBsaXN0PFJlZ2lzdGVyPiBzdWJyZWdzPgorICA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8biwgc3VicmVncz4geworICBsZXQgTmFtZXNwYWNlID0gIlN5c3RlbVoiOworfQorCisvLyBXZSBpZGVudGlmeSBhbGwgb3VyIHJlZ2lzdGVycyB3aXRoIGEgNC1iaXQgSUQsIGZvciBjb25zaXN0ZW5jeSdzIHNha2UuCisKKy8vIEdQUjMyIC0gTG93ZXIgMzIgYml0cyBvZiBvbmUgb2YgdGhlIDE2IDY0LWJpdCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzCitjbGFzcyBHUFIzMjxiaXRzPDQ+IG51bSwgc3RyaW5nIG4+IDogU3lzdGVtWlJlZzxuPiB7CisgIGZpZWxkIGJpdHM8ND4gTnVtID0gbnVtOworfQorCisvLyBHUFI2NCAtIE9uZSBvZiB0aGUgMTYgNjQtYml0IGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMKK2NsYXNzIEdQUjY0PGJpdHM8ND4gbnVtLCBzdHJpbmcgbiwgbGlzdDxSZWdpc3Rlcj4gc3VicmVncywKKyAgICAgICAgICAgIGxpc3Q8UmVnaXN0ZXI+IGFsaWFzZXMgPSBbXT4KKyA6IFN5c3RlbVpSZWdXaXRoU3VicmVnczxuLCBzdWJyZWdzPiB7CisgIGZpZWxkIGJpdHM8ND4gTnVtID0gbnVtOworICBsZXQgQWxpYXNlcyA9IGFsaWFzZXM7Cit9CisKKy8vIEdQUjEyOCAtIDggZXZlbi1vZGQgcmVnaXN0ZXIgcGFpcnMKK2NsYXNzIEdQUjEyODxiaXRzPDQ+IG51bSwgc3RyaW5nIG4sIGxpc3Q8UmVnaXN0ZXI+IHN1YnJlZ3MsCisgICAgICAgICAgICAgbGlzdDxSZWdpc3Rlcj4gYWxpYXNlcyA9IFtdPgorIDogU3lzdGVtWlJlZ1dpdGhTdWJyZWdzPG4sIHN1YnJlZ3M+IHsKKyAgZmllbGQgYml0czw0PiBOdW0gPSBudW07CisgIGxldCBBbGlhc2VzID0gYWxpYXNlczsKK30KKworLy8gRlBSUyAtIExvd2VyIDMyIGJpdHMgb2Ygb25lIG9mIHRoZSAxNiA2NC1iaXQgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzCitjbGFzcyBGUFJTPGJpdHM8ND4gbnVtLCBzdHJpbmcgbj4gOiBTeXN0ZW1aUmVnPG4+IHsKKyAgZmllbGQgYml0czw0PiBOdW0gPSBudW07Cit9CisKKy8vIEZQUkwgLSBPbmUgb2YgdGhlIDE2IDY0LWJpdCBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMKK2NsYXNzIEZQUkw8Yml0czw0PiBudW0sIHN0cmluZyBuLCBsaXN0PFJlZ2lzdGVyPiBzdWJyZWdzPgorIDogU3lzdGVtWlJlZ1dpdGhTdWJyZWdzPG4sIHN1YnJlZ3M+IHsKKyAgZmllbGQgYml0czw0PiBOdW0gPSBudW07Cit9CisKK2xldCBOYW1lc3BhY2UgPSAiU3lzdGVtWiIgaW4geworZGVmIHN1YnJlZ18zMmJpdCAgOiBTdWJSZWdJbmRleDsKK2RlZiBzdWJyZWdfb2RkMzIgIDogU3ViUmVnSW5kZXg7CitkZWYgc3VicmVnX2V2ZW4gICA6IFN1YlJlZ0luZGV4OworZGVmIHN1YnJlZ19vZGQgICAgOiBTdWJSZWdJbmRleDsKK30KKworLy8gR2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycworZGVmIFIwVyAgOiBHUFIzMjwgMCwgICJyMCI+LCBEd2FyZlJlZ051bTxbMF0+OworZGVmIFIxVyAgOiBHUFIzMjwgMSwgICJyMSI+LCBEd2FyZlJlZ051bTxbMV0+OworZGVmIFIyVyAgOiBHUFIzMjwgMiwgICJyMiI+LCBEd2FyZlJlZ051bTxbMl0+OworZGVmIFIzVyAgOiBHUFIzMjwgMywgICJyMyI+LCBEd2FyZlJlZ051bTxbM10+OworZGVmIFI0VyAgOiBHUFIzMjwgNCwgICJyNCI+LCBEd2FyZlJlZ051bTxbNF0+OworZGVmIFI1VyAgOiBHUFIzMjwgNSwgICJyNSI+LCBEd2FyZlJlZ051bTxbNV0+OworZGVmIFI2VyAgOiBHUFIzMjwgNiwgICJyNiI+LCBEd2FyZlJlZ051bTxbNl0+OworZGVmIFI3VyAgOiBHUFIzMjwgNywgICJyNyI+LCBEd2FyZlJlZ051bTxbN10+OworZGVmIFI4VyAgOiBHUFIzMjwgOCwgICJyOCI+LCBEd2FyZlJlZ051bTxbOF0+OworZGVmIFI5VyAgOiBHUFIzMjwgOSwgICJyOSI+LCBEd2FyZlJlZ051bTxbOV0+OworZGVmIFIxMFcgOiBHUFIzMjwxMCwgInIxMCI+LCBEd2FyZlJlZ051bTxbMTBdPjsKK2RlZiBSMTFXIDogR1BSMzI8MTEsICJyMTEiPiwgRHdhcmZSZWdOdW08WzExXT47CitkZWYgUjEyVyA6IEdQUjMyPDEyLCAicjEyIj4sIER3YXJmUmVnTnVtPFsxMl0+OworZGVmIFIxM1cgOiBHUFIzMjwxMywgInIxMyI+LCBEd2FyZlJlZ051bTxbMTNdPjsKK2RlZiBSMTRXIDogR1BSMzI8MTQsICJyMTQiPiwgRHdhcmZSZWdOdW08WzE0XT47CitkZWYgUjE1VyA6IEdQUjMyPDE1LCAicjE1Ij4sIER3YXJmUmVnTnVtPFsxNV0+OworCitsZXQgU3ViUmVnSW5kaWNlcyA9IFtzdWJyZWdfMzJiaXRdIGluIHsKK2RlZiBSMEQgIDogR1BSNjQ8IDAsICAicjAiLCBbUjBXXT4sICBEd2FyZlJlZ051bTxbMF0+OworZGVmIFIxRCAgOiBHUFI2NDwgMSwgICJyMSIsIFtSMVddPiwgIER3YXJmUmVnTnVtPFsxXT47CitkZWYgUjJEICA6IEdQUjY0PCAyLCAgInIyIiwgW1IyV10+LCAgRHdhcmZSZWdOdW08WzJdPjsKK2RlZiBSM0QgIDogR1BSNjQ8IDMsICAicjMiLCBbUjNXXT4sICBEd2FyZlJlZ051bTxbM10+OworZGVmIFI0RCAgOiBHUFI2NDwgNCwgICJyNCIsIFtSNFddPiwgIER3YXJmUmVnTnVtPFs0XT47CitkZWYgUjVEICA6IEdQUjY0PCA1LCAgInI1IiwgW1I1V10+LCAgRHdhcmZSZWdOdW08WzVdPjsKK2RlZiBSNkQgIDogR1BSNjQ8IDYsICAicjYiLCBbUjZXXT4sICBEd2FyZlJlZ051bTxbNl0+OworZGVmIFI3RCAgOiBHUFI2NDwgNywgICJyNyIsIFtSN1ddPiwgIER3YXJmUmVnTnVtPFs3XT47CitkZWYgUjhEICA6IEdQUjY0PCA4LCAgInI4IiwgW1I4V10+LCAgRHdhcmZSZWdOdW08WzhdPjsKK2RlZiBSOUQgIDogR1BSNjQ8IDksICAicjkiLCBbUjlXXT4sICBEd2FyZlJlZ051bTxbOV0+OworZGVmIFIxMEQgOiBHUFI2NDwxMCwgInIxMCIsIFtSMTBXXT4sIER3YXJmUmVnTnVtPFsxMF0+OworZGVmIFIxMUQgOiBHUFI2NDwxMSwgInIxMSIsIFtSMTFXXT4sIER3YXJmUmVnTnVtPFsxMV0+OworZGVmIFIxMkQgOiBHUFI2NDwxMiwgInIxMiIsIFtSMTJXXT4sIER3YXJmUmVnTnVtPFsxMl0+OworZGVmIFIxM0QgOiBHUFI2NDwxMywgInIxMyIsIFtSMTNXXT4sIER3YXJmUmVnTnVtPFsxM10+OworZGVmIFIxNEQgOiBHUFI2NDwxNCwgInIxNCIsIFtSMTRXXT4sIER3YXJmUmVnTnVtPFsxNF0+OworZGVmIFIxNUQgOiBHUFI2NDwxNSwgInIxNSIsIFtSMTVXXT4sIER3YXJmUmVnTnVtPFsxNV0+OworfQorCisvLyBSZWdpc3RlciBwYWlycworbGV0IFN1YlJlZ0luZGljZXMgPSBbc3VicmVnXzMyYml0LCBzdWJyZWdfb2RkMzJdIGluIHsKK2RlZiBSMFAgIDogR1BSNjQ8IDAsICAicjAiLCBbUjBXLCAgUjFXXSwgIFtSMEQsICBSMURdPiwgIER3YXJmUmVnTnVtPFswXT47CitkZWYgUjJQICA6IEdQUjY0PCAyLCAgInIyIiwgW1IyVywgIFIzV10sICBbUjJELCAgUjNEXT4sICBEd2FyZlJlZ051bTxbMl0+OworZGVmIFI0UCAgOiBHUFI2NDwgNCwgICJyNCIsIFtSNFcsICBSNVddLCAgW1I0RCwgIFI1RF0+LCAgRHdhcmZSZWdOdW08WzRdPjsKK2RlZiBSNlAgIDogR1BSNjQ8IDYsICAicjYiLCBbUjZXLCAgUjdXXSwgIFtSNkQsICBSN0RdPiwgIER3YXJmUmVnTnVtPFs2XT47CitkZWYgUjhQICA6IEdQUjY0PCA4LCAgInI4IiwgW1I4VywgIFI5V10sICBbUjhELCAgUjlEXT4sICBEd2FyZlJlZ051bTxbOF0+OworZGVmIFIxMFAgOiBHUFI2NDwxMCwgInIxMCIsIFtSMTBXLCBSMTFXXSwgW1IxMEQsIFIxMURdPiwgRHdhcmZSZWdOdW08WzEwXT47CitkZWYgUjEyUCA6IEdQUjY0PDEyLCAicjEyIiwgW1IxMlcsIFIxM1ddLCBbUjEyRCwgUjEzRF0+LCBEd2FyZlJlZ051bTxbMTJdPjsKK2RlZiBSMTRQIDogR1BSNjQ8MTQsICJyMTQiLCBbUjE0VywgUjE1V10sIFtSMTRELCBSMTVEXT4sIER3YXJmUmVnTnVtPFsxNF0+OworfQorCitsZXQgU3ViUmVnSW5kaWNlcyA9IFtzdWJyZWdfZXZlbiwgc3VicmVnX29kZF0sCisgQ29tcG9zaXRlSW5kaWNlcyA9IFsoc3VicmVnX29kZDMyICBzdWJyZWdfb2RkLCAgc3VicmVnXzMyYml0KV0gaW4geworZGVmIFIwUSAgOiBHUFIxMjg8IDAsICAicjAiLCBbUjBELCAgUjFEXSwgIFtSMFBdPiwgIER3YXJmUmVnTnVtPFswXT47CitkZWYgUjJRICA6IEdQUjEyODwgMiwgICJyMiIsIFtSMkQsICBSM0RdLCAgW1IyUF0+LCAgRHdhcmZSZWdOdW08WzJdPjsKK2RlZiBSNFEgIDogR1BSMTI4PCA0LCAgInI0IiwgW1I0RCwgIFI1RF0sICBbUjRQXT4sICBEd2FyZlJlZ051bTxbNF0+OworZGVmIFI2USAgOiBHUFIxMjg8IDYsICAicjYiLCBbUjZELCAgUjdEXSwgIFtSNlBdPiwgIER3YXJmUmVnTnVtPFs2XT47CitkZWYgUjhRICA6IEdQUjEyODwgOCwgICJyOCIsIFtSOEQsICBSOURdLCAgW1I4UF0+LCAgRHdhcmZSZWdOdW08WzhdPjsKK2RlZiBSMTBRIDogR1BSMTI4PDEwLCAicjEwIiwgW1IxMEQsIFIxMURdLCBbUjEwUF0+LCBEd2FyZlJlZ051bTxbMTBdPjsKK2RlZiBSMTJRIDogR1BSMTI4PDEyLCAicjEyIiwgW1IxMkQsIFIxM0RdLCBbUjEyUF0+LCBEd2FyZlJlZ051bTxbMTJdPjsKK2RlZiBSMTRRIDogR1BSMTI4PDE0LCAicjE0IiwgW1IxNEQsIFIxNURdLCBbUjE0UF0+LCBEd2FyZlJlZ051bTxbMTRdPjsKK30KKworLy8gRmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzCitkZWYgRjBTICA6IEZQUlM8IDAsICAiZjAiPiwgRHdhcmZSZWdOdW08WzE2XT47CitkZWYgRjFTICA6IEZQUlM8IDEsICAiZjEiPiwgRHdhcmZSZWdOdW08WzE3XT47CitkZWYgRjJTICA6IEZQUlM8IDIsICAiZjIiPiwgRHdhcmZSZWdOdW08WzE4XT47CitkZWYgRjNTICA6IEZQUlM8IDMsICAiZjMiPiwgRHdhcmZSZWdOdW08WzE5XT47CitkZWYgRjRTICA6IEZQUlM8IDQsICAiZjQiPiwgRHdhcmZSZWdOdW08WzIwXT47CitkZWYgRjVTICA6IEZQUlM8IDUsICAiZjUiPiwgRHdhcmZSZWdOdW08WzIxXT47CitkZWYgRjZTICA6IEZQUlM8IDYsICAiZjYiPiwgRHdhcmZSZWdOdW08WzIyXT47CitkZWYgRjdTICA6IEZQUlM8IDcsICAiZjciPiwgRHdhcmZSZWdOdW08WzIzXT47CitkZWYgRjhTICA6IEZQUlM8IDgsICAiZjgiPiwgRHdhcmZSZWdOdW08WzI0XT47CitkZWYgRjlTICA6IEZQUlM8IDksICAiZjkiPiwgRHdhcmZSZWdOdW08WzI1XT47CitkZWYgRjEwUyA6IEZQUlM8MTAsICJmMTAiPiwgRHdhcmZSZWdOdW08WzI2XT47CitkZWYgRjExUyA6IEZQUlM8MTEsICJmMTEiPiwgRHdhcmZSZWdOdW08WzI3XT47CitkZWYgRjEyUyA6IEZQUlM8MTIsICJmMTIiPiwgRHdhcmZSZWdOdW08WzI4XT47CitkZWYgRjEzUyA6IEZQUlM8MTMsICJmMTMiPiwgRHdhcmZSZWdOdW08WzI5XT47CitkZWYgRjE0UyA6IEZQUlM8MTQsICJmMTQiPiwgRHdhcmZSZWdOdW08WzMwXT47CitkZWYgRjE1UyA6IEZQUlM8MTUsICJmMTUiPiwgRHdhcmZSZWdOdW08WzMxXT47CisKK2xldCBTdWJSZWdJbmRpY2VzID0gW3N1YnJlZ18zMmJpdF0gaW4geworZGVmIEYwTCAgOiBGUFJMPCAwLCAgImYwIiwgW0YwU10+LCAgRHdhcmZSZWdOdW08WzE2XT47CitkZWYgRjFMICA6IEZQUkw8IDEsICAiZjEiLCBbRjFTXT4sICBEd2FyZlJlZ051bTxbMTddPjsKK2RlZiBGMkwgIDogRlBSTDwgMiwgICJmMiIsIFtGMlNdPiwgIER3YXJmUmVnTnVtPFsxOF0+OworZGVmIEYzTCAgOiBGUFJMPCAzLCAgImYzIiwgW0YzU10+LCAgRHdhcmZSZWdOdW08WzE5XT47CitkZWYgRjRMICA6IEZQUkw8IDQsICAiZjQiLCBbRjRTXT4sICBEd2FyZlJlZ051bTxbMjBdPjsKK2RlZiBGNUwgIDogRlBSTDwgNSwgICJmNSIsIFtGNVNdPiwgIER3YXJmUmVnTnVtPFsyMV0+OworZGVmIEY2TCAgOiBGUFJMPCA2LCAgImY2IiwgW0Y2U10+LCAgRHdhcmZSZWdOdW08WzIyXT47CitkZWYgRjdMICA6IEZQUkw8IDcsICAiZjciLCBbRjdTXT4sICBEd2FyZlJlZ051bTxbMjNdPjsKK2RlZiBGOEwgIDogRlBSTDwgOCwgICJmOCIsIFtGOFNdPiwgIER3YXJmUmVnTnVtPFsyNF0+OworZGVmIEY5TCAgOiBGUFJMPCA5LCAgImY5IiwgW0Y5U10+LCAgRHdhcmZSZWdOdW08WzI1XT47CitkZWYgRjEwTCA6IEZQUkw8MTAsICJmMTAiLCBbRjEwU10+LCBEd2FyZlJlZ051bTxbMjZdPjsKK2RlZiBGMTFMIDogRlBSTDwxMSwgImYxMSIsIFtGMTFTXT4sIER3YXJmUmVnTnVtPFsyN10+OworZGVmIEYxMkwgOiBGUFJMPDEyLCAiZjEyIiwgW0YxMlNdPiwgRHdhcmZSZWdOdW08WzI4XT47CitkZWYgRjEzTCA6IEZQUkw8MTMsICJmMTMiLCBbRjEzU10+LCBEd2FyZlJlZ051bTxbMjldPjsKK2RlZiBGMTRMIDogRlBSTDwxNCwgImYxNCIsIFtGMTRTXT4sIER3YXJmUmVnTnVtPFszMF0+OworZGVmIEYxNUwgOiBGUFJMPDE1LCAiZjE1IiwgW0YxNVNdPiwgRHdhcmZSZWdOdW08WzMxXT47Cit9CisKKy8vIFN0YXR1cyByZWdpc3RlcgorZGVmIFBTVyA6IFN5c3RlbVpSZWc8InBzdyI+OworCisvLy8gUmVnaXN0ZXIgY2xhc3NlcworZGVmIEdSMzIgOiBSZWdpc3RlckNsYXNzPCJTeXN0ZW1aIiwgW2kzMl0sIDMyLAorICAgLy8gVm9sYXRpbGUgcmVnaXN0ZXJzCisgIFtSMFcsIFIxVywgUjJXLCBSM1csIFI0VywgUjVXLCBSNlcsIFI3VywgUjhXLCBSOVcsIFIxMFcsIFIxMlcsIFIxM1csCisgICAvLyBGcmFtZSBwb2ludGVyLCBzb21ldGltZXMgYWxsb2NhYmxlCisgICBSMTFXLAorICAgLy8gVm9sYXRpbGUsIGJ1dCBub3QgYWxsb2NhYmxlCisgICBSMTRXLCBSMTVXXT4KK3sKKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTeXN0ZW1aX1JFRzMyW10gPSB7CisgICAgICBTeXN0ZW1aOjpSMVcsICBTeXN0ZW1aOjpSMlcsICBTeXN0ZW1aOjpSM1csICBTeXN0ZW1aOjpSNFcsCisgICAgICBTeXN0ZW1aOjpSNVcsICBTeXN0ZW1aOjpSMFcsICBTeXN0ZW1aOjpSMTJXLCBTeXN0ZW1aOjpSMTFXLAorICAgICAgU3lzdGVtWjo6UjEwVywgU3lzdGVtWjo6UjlXLCAgU3lzdGVtWjo6UjhXLCAgU3lzdGVtWjo6UjdXLAorICAgICAgU3lzdGVtWjo6UjZXLCAgU3lzdGVtWjo6UjE0VywgU3lzdGVtWjo6UjEzVworICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN5c3RlbVpfUkVHMzJfbm9mcFtdID0geworICAgICAgU3lzdGVtWjo6UjFXLCAgU3lzdGVtWjo6UjJXLCAgU3lzdGVtWjo6UjNXLCAgU3lzdGVtWjo6UjRXLAorICAgICAgU3lzdGVtWjo6UjVXLCAgU3lzdGVtWjo6UjBXLCAgU3lzdGVtWjo6UjEyVywgLyogTm8gUjExVyAqLworICAgICAgU3lzdGVtWjo6UjEwVywgU3lzdGVtWjo6UjlXLCAgU3lzdGVtWjo6UjhXLCAgU3lzdGVtWjo6UjdXLAorICAgICAgU3lzdGVtWjo6UjZXLCAgU3lzdGVtWjo6UjE0VywgU3lzdGVtWjo6UjEzVworICAgIH07CisgICAgR1IzMkNsYXNzOjppdGVyYXRvcgorICAgIEdSMzJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICAgICAgaWYgKFJJLT5oYXNGUChNRikpCisgICAgICAgIHJldHVybiBTeXN0ZW1aX1JFRzMyX25vZnA7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBTeXN0ZW1aX1JFRzMyOworICAgIH0KKyAgICBHUjMyQ2xhc3M6Oml0ZXJhdG9yCisgICAgR1IzMkNsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICAgICAgaWYgKFJJLT5oYXNGUChNRikpCisgICAgICAgIHJldHVybiBTeXN0ZW1aX1JFRzMyX25vZnAgKyAoc2l6ZW9mKFN5c3RlbVpfUkVHMzJfbm9mcCkgLyBzaXplb2YodW5zaWduZWQpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFN5c3RlbVpfUkVHMzIgKyAoc2l6ZW9mKFN5c3RlbVpfUkVHMzIpIC8gc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgfQorICB9XTsKK30KKworLy8vIFJlZ2lzdGVycyB1c2VkIHRvIGdlbmVyYXRlIGFkZHJlc3MuIEV2ZXJ5dGhpbmcgZXhjZXB0IFIwLgorZGVmIEFERFIzMiA6IFJlZ2lzdGVyQ2xhc3M8IlN5c3RlbVoiLCBbaTMyXSwgMzIsCisgICAvLyBWb2xhdGlsZSByZWdpc3RlcnMKKyAgW1IxVywgUjJXLCBSM1csIFI0VywgUjVXLCBSNlcsIFI3VywgUjhXLCBSOVcsIFIxMFcsIFIxMlcsIFIxM1csCisgICAvLyBGcmFtZSBwb2ludGVyLCBzb21ldGltZXMgYWxsb2NhYmxlCisgICBSMTFXLAorICAgLy8gVm9sYXRpbGUsIGJ1dCBub3QgYWxsb2NhYmxlCisgICBSMTRXLCBSMTVXXT4KK3sKKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTeXN0ZW1aX0FERFIzMltdID0geworICAgICAgU3lzdGVtWjo6UjFXLCAgU3lzdGVtWjo6UjJXLCAgU3lzdGVtWjo6UjNXLCAgU3lzdGVtWjo6UjRXLAorICAgICAgU3lzdGVtWjo6UjVXLCAgLyogTm8gUjBXICovICAgU3lzdGVtWjo6UjEyVywgU3lzdGVtWjo6UjExVywKKyAgICAgIFN5c3RlbVo6OlIxMFcsIFN5c3RlbVo6OlI5VywgIFN5c3RlbVo6OlI4VywgIFN5c3RlbVo6OlI3VywKKyAgICAgIFN5c3RlbVo6OlI2VywgIFN5c3RlbVo6OlIxNFcsIFN5c3RlbVo6OlIxM1cKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTeXN0ZW1aX0FERFIzMl9ub2ZwW10gPSB7CisgICAgICBTeXN0ZW1aOjpSMVcsICBTeXN0ZW1aOjpSMlcsICBTeXN0ZW1aOjpSM1csICBTeXN0ZW1aOjpSNFcsCisgICAgICBTeXN0ZW1aOjpSNVcsICAvKiBObyBSMFcgKi8gICBTeXN0ZW1aOjpSMTJXLCAvKiBObyBSMTFXICovCisgICAgICBTeXN0ZW1aOjpSMTBXLCBTeXN0ZW1aOjpSOVcsICBTeXN0ZW1aOjpSOFcsICBTeXN0ZW1aOjpSN1csCisgICAgICBTeXN0ZW1aOjpSNlcsICBTeXN0ZW1aOjpSMTRXLCBTeXN0ZW1aOjpSMTNXCisgICAgfTsKKyAgICBBRERSMzJDbGFzczo6aXRlcmF0b3IKKyAgICBBRERSMzJDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICAgICAgaWYgKFJJLT5oYXNGUChNRikpCisgICAgICAgIHJldHVybiBTeXN0ZW1aX0FERFIzMl9ub2ZwOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gU3lzdGVtWl9BRERSMzI7CisgICAgfQorICAgIEFERFIzMkNsYXNzOjppdGVyYXRvcgorICAgIEFERFIzMkNsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICAgICAgaWYgKFJJLT5oYXNGUChNRikpCisgICAgICAgIHJldHVybiBTeXN0ZW1aX0FERFIzMl9ub2ZwICsgKHNpemVvZihTeXN0ZW1aX0FERFIzMl9ub2ZwKSAvIHNpemVvZih1bnNpZ25lZCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gU3lzdGVtWl9BRERSMzIgKyAoc2l6ZW9mKFN5c3RlbVpfQUREUjMyKSAvIHNpemVvZih1bnNpZ25lZCkpOworICAgIH0KKyAgfV07Cit9CisKK2RlZiBHUjY0IDogUmVnaXN0ZXJDbGFzczwiU3lzdGVtWiIsIFtpNjRdLCA2NCwKKyAgIC8vIFZvbGF0aWxlIHJlZ2lzdGVycworICBbUjBELCBSMUQsIFIyRCwgUjNELCBSNEQsIFI1RCwgUjZELCBSN0QsIFI4RCwgUjlELCBSMTBELCBSMTJELCBSMTNELAorICAgLy8gRnJhbWUgcG9pbnRlciwgc29tZXRpbWVzIGFsbG9jYWJsZQorICAgUjExRCwKKyAgIC8vIFZvbGF0aWxlLCBidXQgbm90IGFsbG9jYWJsZQorICAgUjE0RCwgUjE1RF0+Cit7CisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjMyIHN1YnJlZ18zMmJpdCldOworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB9XTsKKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN5c3RlbVpfUkVHNjRbXSA9IHsKKyAgICAgIFN5c3RlbVo6OlIxRCwgIFN5c3RlbVo6OlIyRCwgIFN5c3RlbVo6OlIzRCwgIFN5c3RlbVo6OlI0RCwKKyAgICAgIFN5c3RlbVo6OlI1RCwgIFN5c3RlbVo6OlIwRCwgIFN5c3RlbVo6OlIxMkQsIFN5c3RlbVo6OlIxMUQsCisgICAgICBTeXN0ZW1aOjpSMTBELCBTeXN0ZW1aOjpSOUQsICBTeXN0ZW1aOjpSOEQsICBTeXN0ZW1aOjpSN0QsCisgICAgICBTeXN0ZW1aOjpSNkQsICBTeXN0ZW1aOjpSMTRELCBTeXN0ZW1aOjpSMTNECisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3lzdGVtWl9SRUc2NF9ub2ZwW10gPSB7CisgICAgICBTeXN0ZW1aOjpSMUQsICBTeXN0ZW1aOjpSMkQsICBTeXN0ZW1aOjpSM0QsICBTeXN0ZW1aOjpSNEQsCisgICAgICBTeXN0ZW1aOjpSNUQsICBTeXN0ZW1aOjpSMEQsICBTeXN0ZW1aOjpSMTJELCAvKiBObyBSMTFEICovCisgICAgICBTeXN0ZW1aOjpSMTBELCBTeXN0ZW1aOjpSOUQsICBTeXN0ZW1aOjpSOEQsICBTeXN0ZW1aOjpSN0QsCisgICAgICBTeXN0ZW1aOjpSNkQsICBTeXN0ZW1aOjpSMTRELCBTeXN0ZW1aOjpSMTNECisgICAgfTsKKyAgICBHUjY0Q2xhc3M6Oml0ZXJhdG9yCisgICAgR1I2NENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSkKKyAgICAgICAgcmV0dXJuIFN5c3RlbVpfUkVHNjRfbm9mcDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFN5c3RlbVpfUkVHNjQ7CisgICAgfQorICAgIEdSNjRDbGFzczo6aXRlcmF0b3IKKyAgICBHUjY0Q2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSkKKyAgICAgICAgcmV0dXJuIFN5c3RlbVpfUkVHNjRfbm9mcCArIChzaXplb2YoU3lzdGVtWl9SRUc2NF9ub2ZwKSAvIHNpemVvZih1bnNpZ25lZCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gU3lzdGVtWl9SRUc2NCArIChzaXplb2YoU3lzdGVtWl9SRUc2NCkgLyBzaXplb2YodW5zaWduZWQpKTsKKyAgICB9CisgIH1dOworfQorCitkZWYgQUREUjY0IDogUmVnaXN0ZXJDbGFzczwiU3lzdGVtWiIsIFtpNjRdLCA2NCwKKyAgIC8vIFZvbGF0aWxlIHJlZ2lzdGVycworICBbUjFELCBSMkQsIFIzRCwgUjRELCBSNUQsIFI2RCwgUjdELCBSOEQsIFI5RCwgUjEwRCwgUjEyRCwgUjEzRCwKKyAgIC8vIEZyYW1lIHBvaW50ZXIsIHNvbWV0aW1lcyBhbGxvY2FibGUKKyAgIFIxMUQsCisgICAvLyBWb2xhdGlsZSwgYnV0IG5vdCBhbGxvY2FibGUKKyAgIFIxNEQsIFIxNURdPgoreworICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoQUREUjMyIHN1YnJlZ18zMmJpdCldOworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB9XTsKKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN5c3RlbVpfQUREUjY0W10gPSB7CisgICAgICBTeXN0ZW1aOjpSMUQsICBTeXN0ZW1aOjpSMkQsICBTeXN0ZW1aOjpSM0QsICBTeXN0ZW1aOjpSNEQsCisgICAgICBTeXN0ZW1aOjpSNUQsICAvKiBObyBSMEQgKi8gICBTeXN0ZW1aOjpSMTJELCBTeXN0ZW1aOjpSMTFELAorICAgICAgU3lzdGVtWjo6UjEwRCwgU3lzdGVtWjo6UjlELCAgU3lzdGVtWjo6UjhELCAgU3lzdGVtWjo6UjdELAorICAgICAgU3lzdGVtWjo6UjZELCAgU3lzdGVtWjo6UjE0RCwgU3lzdGVtWjo6UjEzRAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN5c3RlbVpfQUREUjY0X25vZnBbXSA9IHsKKyAgICAgIFN5c3RlbVo6OlIxRCwgIFN5c3RlbVo6OlIyRCwgIFN5c3RlbVo6OlIzRCwgIFN5c3RlbVo6OlI0RCwKKyAgICAgIFN5c3RlbVo6OlI1RCwgIC8qIE5vIFIwRCAqLyAgIFN5c3RlbVo6OlIxMkQsIC8qIE5vIFIxMUQgKi8KKyAgICAgIFN5c3RlbVo6OlIxMEQsIFN5c3RlbVo6OlI5RCwgIFN5c3RlbVo6OlI4RCwgIFN5c3RlbVo6OlI3RCwKKyAgICAgIFN5c3RlbVo6OlI2RCwgIFN5c3RlbVo6OlIxNEQsIFN5c3RlbVo6OlIxM0QKKyAgICB9OworICAgIEFERFI2NENsYXNzOjppdGVyYXRvcgorICAgIEFERFI2NENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSkKKyAgICAgICAgcmV0dXJuIFN5c3RlbVpfQUREUjY0X25vZnA7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBTeXN0ZW1aX0FERFI2NDsKKyAgICB9CisgICAgQUREUjY0Q2xhc3M6Oml0ZXJhdG9yCisgICAgQUREUjY0Q2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSkKKyAgICAgICAgcmV0dXJuIFN5c3RlbVpfQUREUjY0X25vZnAgKyAoc2l6ZW9mKFN5c3RlbVpfQUREUjY0X25vZnApIC8gc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBTeXN0ZW1aX0FERFI2NCArIChzaXplb2YoU3lzdGVtWl9BRERSNjQpIC8gc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgfQorICB9XTsKK30KKworLy8gRXZlbi1vZGQgcmVnaXN0ZXIgcGFpcnMKK2RlZiBHUjY0UCA6IFJlZ2lzdGVyQ2xhc3M8IlN5c3RlbVoiLCBbdjJpMzJdLCA2NCwKKyAgW1IwUCwgUjJQLCBSNFAsIFI2UCwgUjhQLCBSMTBQLCBSMTJQLCBSMTRQXT4KK3sKKyAgbGV0IFN1YlJlZ0NsYXNzZXMgPSBbKEdSMzIgc3VicmVnXzMyYml0LCBzdWJyZWdfb2RkMzIpXTsKKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgfV07CisgIGxldCBNZXRob2RCb2RpZXMgPSBbeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTeXN0ZW1aX1JFRzY0UFtdID0geworICAgICAgU3lzdGVtWjo6UjBQLCAgU3lzdGVtWjo6UjJQLCAgU3lzdGVtWjo6UjRQLCBTeXN0ZW1aOjpSMTBQLAorICAgICAgU3lzdGVtWjo6UjhQLCAgU3lzdGVtWjo6UjZQIH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN5c3RlbVpfUkVHNjRQX25vZnBbXSA9IHsKKyAgICAgIFN5c3RlbVo6OlIwUCwgIFN5c3RlbVo6OlIyUCwgIFN5c3RlbVo6OlI0UCwgLyogTk8gUjEwUCAqLworICAgICAgU3lzdGVtWjo6UjhQLCAgU3lzdGVtWjo6UjZQIH07CisgICAgR1I2NFBDbGFzczo6aXRlcmF0b3IKKyAgICBHUjY0UENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSkKKyAgICAgICAgcmV0dXJuIFN5c3RlbVpfUkVHNjRQX25vZnA7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBTeXN0ZW1aX1JFRzY0UDsKKyAgICB9CisgICAgR1I2NFBDbGFzczo6aXRlcmF0b3IKKyAgICBHUjY0UENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICAgICAgaWYgKFJJLT5oYXNGUChNRikpCisgICAgICAgIHJldHVybiBTeXN0ZW1aX1JFRzY0UF9ub2ZwICsgKHNpemVvZihTeXN0ZW1aX1JFRzY0UF9ub2ZwKSAvIHNpemVvZih1bnNpZ25lZCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gU3lzdGVtWl9SRUc2NFAgKyAoc2l6ZW9mKFN5c3RlbVpfUkVHNjRQKSAvIHNpemVvZih1bnNpZ25lZCkpOworICAgIH0KKyAgfV07Cit9CisKK2RlZiBHUjEyOCA6IFJlZ2lzdGVyQ2xhc3M8IlN5c3RlbVoiLCBbdjJpNjRdLCAxMjgsCisgIFtSMFEsIFIyUSwgUjRRLCBSNlEsIFI4USwgUjEwUSwgUjEyUSwgUjE0UV0+Cit7CisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjMyIHN1YnJlZ18zMmJpdCwgc3VicmVnX29kZDMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoR1I2NCBzdWJyZWdfZXZlbiwgc3VicmVnX29kZCldOworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB9XTsKKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN5c3RlbVpfUkVHMTI4W10gPSB7CisgICAgICBTeXN0ZW1aOjpSMFEsICBTeXN0ZW1aOjpSMlEsICBTeXN0ZW1aOjpSNFEsICBTeXN0ZW1aOjpSMTBRLAorICAgICAgU3lzdGVtWjo6UjhRLCAgU3lzdGVtWjo6UjZRIH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN5c3RlbVpfUkVHMTI4X25vZnBbXSA9IHsKKyAgICAgIFN5c3RlbVo6OlIwUSwgIFN5c3RlbVo6OlIyUSwgIFN5c3RlbVo6OlI0USwgLyogTk8gUjEwUSAqLworICAgICAgU3lzdGVtWjo6UjhRLCAgU3lzdGVtWjo6UjZRIH07CisgICAgR1IxMjhDbGFzczo6aXRlcmF0b3IKKyAgICBHUjEyOENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSkKKyAgICAgICAgcmV0dXJuIFN5c3RlbVpfUkVHMTI4X25vZnA7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBTeXN0ZW1aX1JFRzEyODsKKyAgICB9CisgICAgR1IxMjhDbGFzczo6aXRlcmF0b3IKKyAgICBHUjEyOENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICAgICAgaWYgKFJJLT5oYXNGUChNRikpCisgICAgICAgIHJldHVybiBTeXN0ZW1aX1JFRzEyOF9ub2ZwICsgKHNpemVvZihTeXN0ZW1aX1JFRzEyOF9ub2ZwKSAvIHNpemVvZih1bnNpZ25lZCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gU3lzdGVtWl9SRUcxMjggKyAoc2l6ZW9mKFN5c3RlbVpfUkVHMTI4KSAvIHNpemVvZih1bnNpZ25lZCkpOworICAgIH0KKyAgfV07Cit9CisKK2RlZiBGUDMyIDogUmVnaXN0ZXJDbGFzczwiU3lzdGVtWiIsIFtmMzJdLCAzMiwKKyBbRjBTLCBGMVMsICBGMlMsICBGM1MsICBGNFMsICBGNVMsICBGNlMsICBGN1MsCisgIEY4UywgRjlTLCBGMTBTLCBGMTFTLCBGMTJTLCBGMTNTLCBGMTRTLCBGMTVTXT4geworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB9XTsKKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN5c3RlbVpfUkVHRlAzMltdID0geworICAgICAgU3lzdGVtWjo6RjBTLCAgU3lzdGVtWjo6RjJTLCAgU3lzdGVtWjo6RjRTLCAgU3lzdGVtWjo6RjZTLAorICAgICAgU3lzdGVtWjo6RjFTLCAgU3lzdGVtWjo6RjNTLCAgU3lzdGVtWjo6RjVTLCAgU3lzdGVtWjo6RjdTLAorICAgICAgU3lzdGVtWjo6RjhTLCAgU3lzdGVtWjo6RjlTLCAgU3lzdGVtWjo6RjEwUywgU3lzdGVtWjo6RjExUywKKyAgICAgIFN5c3RlbVo6OkYxMlMsIFN5c3RlbVo6OkYxM1MsIFN5c3RlbVo6OkYxNFMsIFN5c3RlbVo6OkYxNVMgfTsKKyAgICBGUDMyQ2xhc3M6Oml0ZXJhdG9yCisgICAgRlAzMkNsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTeXN0ZW1aX1JFR0ZQMzI7CisgICAgfQorICAgIEZQMzJDbGFzczo6aXRlcmF0b3IKKyAgICBGUDMyQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTeXN0ZW1aX1JFR0ZQMzIgKyAoc2l6ZW9mKFN5c3RlbVpfUkVHRlAzMikgLyBzaXplb2YodW5zaWduZWQpKTsKKyAgICB9CisgIH1dOworfQorCitkZWYgRlA2NCA6IFJlZ2lzdGVyQ2xhc3M8IlN5c3RlbVoiLCBbZjY0XSwgNjQsCisgW0YwTCwgRjFMLCAgRjJMLCAgRjNMLCAgRjRMLCAgRjVMLCAgRjZMLCAgRjdMLCAKKyAgRjhMLCBGOUwsIEYxMEwsIEYxMUwsIEYxMkwsIEYxM0wsIEYxNEwsIEYxNUxdPiB7CisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhGUDMyIHN1YnJlZ18zMmJpdCldOworICBsZXQgTWV0aG9kUHJvdG9zID0gW3sKKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB9XTsKKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN5c3RlbVpfUkVHRlA2NFtdID0geworICAgICAgU3lzdGVtWjo6RjBMLCAgU3lzdGVtWjo6RjJMLCAgU3lzdGVtWjo6RjRMLCAgU3lzdGVtWjo6RjZMLAorICAgICAgU3lzdGVtWjo6RjFMLCAgU3lzdGVtWjo6RjNMLCAgU3lzdGVtWjo6RjVMLCAgU3lzdGVtWjo6RjdMLAorICAgICAgU3lzdGVtWjo6RjhMLCAgU3lzdGVtWjo6RjlMLCAgU3lzdGVtWjo6RjEwTCwgU3lzdGVtWjo6RjExTCwKKyAgICAgIFN5c3RlbVo6OkYxMkwsIFN5c3RlbVo6OkYxM0wsIFN5c3RlbVo6OkYxNEwsIFN5c3RlbVo6OkYxNUwgfTsKKyAgICBGUDY0Q2xhc3M6Oml0ZXJhdG9yCisgICAgRlA2NENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTeXN0ZW1aX1JFR0ZQNjQ7CisgICAgfQorICAgIEZQNjRDbGFzczo6aXRlcmF0b3IKKyAgICBGUDY0Q2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTeXN0ZW1aX1JFR0ZQNjQgKyAoc2l6ZW9mKFN5c3RlbVpfUkVHRlA2NCkgLyBzaXplb2YodW5zaWduZWQpKTsKKyAgICB9CisgIH1dOworfQorCisvLyBTdGF0dXMgZmxhZ3MgcmVnaXN0ZXJzLgorZGVmIENDUiA6IFJlZ2lzdGVyQ2xhc3M8IlN5c3RlbVoiLCBbaTY0XSwgNjQsIFtQU1ddPiB7CisgIGxldCBDb3B5Q29zdCA9IC0xOyAgLy8gRG9uJ3QgYWxsb3cgY29weWluZyBvZiBzdGF0dXMgcmVnaXN0ZXJzLgorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpTZWxlY3Rpb25EQUdJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aU2VsZWN0aW9uREFHSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhYmNkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aU2VsZWN0aW9uREFHSW5mby5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy89PT0tLSBTeXN0ZW1aU2VsZWN0aW9uREFHSW5mby5jcHAgLSBTeXN0ZW1aIFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU3lzdGVtWlNlbGVjdGlvbkRBR0luZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzeXN0ZW16LXNlbGVjdGlvbmRhZy1pbmZvIgorI2luY2x1ZGUgIlN5c3RlbVpUYXJnZXRNYWNoaW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU3lzdGVtWlNlbGVjdGlvbkRBR0luZm86OlN5c3RlbVpTZWxlY3Rpb25EQUdJbmZvKGNvbnN0IFN5c3RlbVpUYXJnZXRNYWNoaW5lICZUTSkKKyAgOiBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvKFRNKSB7Cit9CisKK1N5c3RlbVpTZWxlY3Rpb25EQUdJbmZvOjp+U3lzdGVtWlNlbGVjdGlvbkRBR0luZm8oKSB7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWlNlbGVjdGlvbkRBR0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aU2VsZWN0aW9uREFHSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTA0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWlNlbGVjdGlvbkRBR0luZm8uaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0tIFN5c3RlbVpTZWxlY3Rpb25EQUdJbmZvLmggLSBTeXN0ZW1aIFNlbGVjdGlvbkRBRyBJbmZvIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTeXN0ZW1aIHN1YmNsYXNzIGZvciBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU1lTVEVNWlNFTEVDVElPTkRBR0lORk9fSAorI2RlZmluZSBTWVNURU1aU0VMRUNUSU9OREFHSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTZWxlY3Rpb25EQUdJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU3lzdGVtWlRhcmdldE1hY2hpbmU7CisKK2NsYXNzIFN5c3RlbVpTZWxlY3Rpb25EQUdJbmZvIDogcHVibGljIFRhcmdldFNlbGVjdGlvbkRBR0luZm8geworcHVibGljOgorICBleHBsaWNpdCBTeXN0ZW1aU2VsZWN0aW9uREFHSW5mbyhjb25zdCBTeXN0ZW1aVGFyZ2V0TWFjaGluZSAmVE0pOworICB+U3lzdGVtWlNlbGVjdGlvbkRBR0luZm8oKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWlN1YnRhcmdldC5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWlN1YnRhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiNWUxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aU3VidGFyZ2V0LmNwcApAQCAtMCwwICsxLDQ3IEBACisvLz09PS0gU3lzdGVtWlN1YnRhcmdldC5jcHAgLSBTeXN0ZW1aIFN1YnRhcmdldCBJbmZvcm1hdGlvbiAtLS0tLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTeXN0ZW1aIHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiU3lzdGVtWlN1YnRhcmdldC5oIgorI2luY2x1ZGUgIlN5c3RlbVouaCIKKyNpbmNsdWRlICJTeXN0ZW1aR2VuU3VidGFyZ2V0LmluYyIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU3lzdGVtWlN1YnRhcmdldDo6U3lzdGVtWlN1YnRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVFQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpOgorICBIYXNaMTBJbnN0cyhmYWxzZSkgeworICBzdGQ6OnN0cmluZyBDUFUgPSAiejkiOworCisgIC8vIFBhcnNlIGZlYXR1cmVzIHN0cmluZy4KKyAgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhGUywgQ1BVKTsKK30KKworLy8vIFRydWUgaWYgYWNjZXNzaW5nIHRoZSBHViByZXF1aXJlcyBhbiBleHRyYSBsb2FkLgorYm9vbCBTeXN0ZW1aU3VidGFyZ2V0OjpHVlJlcXVpcmVzRXh0cmFMb2FkKGNvbnN0IEdsb2JhbFZhbHVlKiBHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lJiBUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGlyZWN0Q2FsbCkgY29uc3QgeworICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pIHsKKyAgICAvLyBFeHRyYSBsb2FkIGlzIG5lZWRlZCBmb3IgYWxsIGV4dGVybmFsbHkgdmlzaWJsZS4KKyAgICBpZiAoaXNEaXJlY3RDYWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKEdWLT5oYXNMb2NhbExpbmthZ2UoKSB8fCBHVi0+aGFzSGlkZGVuVmlzaWJpbGl0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWlN1YnRhcmdldC5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpTdWJ0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDVkNmU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpTdWJ0YXJnZXQuaApAQCAtMCwwICsxLDQ1IEBACisvLz09LS0gU3lzdGVtWlN1YnRhcmdldC5oIC0gRGVmaW5lIFN1YnRhcmdldCBmb3IgdGhlIFN5c3RlbVogLS0tKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgU3lzdGVtWiBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRTdWJ0YXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9TeXN0ZW1aX1NVQlRBUkdFVF9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1N5c3RlbVpfU1VCVEFSR0VUX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFN1YnRhcmdldC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKK2NsYXNzIFN5c3RlbVpTdWJ0YXJnZXQgOiBwdWJsaWMgVGFyZ2V0U3VidGFyZ2V0IHsKKyAgYm9vbCBIYXNaMTBJbnN0czsKK3B1YmxpYzoKKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIGRhdGEgbWVtYmVycyB0byBtYXRjaCB0aGF0CisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHRyaXBsZS4KKyAgLy8vCisgIFN5c3RlbVpTdWJ0YXJnZXQoY29uc3Qgc3RkOjpzdHJpbmcgJlRULCBjb25zdCBzdGQ6OnN0cmluZyAmRlMpOworCisgIC8vLyBQYXJzZVN1YnRhcmdldEZlYXR1cmVzIC0gUGFyc2VzIGZlYXR1cmVzIHN0cmluZyBzZXR0aW5nIHNwZWNpZmllZAorICAvLy8gc3VidGFyZ2V0IG9wdGlvbnMuICBEZWZpbml0aW9uIG9mIGZ1bmN0aW9uIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRibGdlbi4KKyAgc3RkOjpzdHJpbmcgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhjb25zdCBzdGQ6OnN0cmluZyAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkNQVSk7CisKKyAgYm9vbCBpc1oxMCgpIGNvbnN0IHsgcmV0dXJuIEhhc1oxMEluc3RzOyB9CisKKyAgYm9vbCBHVlJlcXVpcmVzRXh0cmFMb2FkKGNvbnN0IEdsb2JhbFZhbHVlKiBHViwgY29uc3QgVGFyZ2V0TWFjaGluZSYgVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGlyZWN0Q2FsbCkgY29uc3Q7Cit9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmICAvLyBMTFZNX1RBUkdFVF9TeXN0ZW1aX1NVQlRBUkdFVF9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovU3lzdGVtWlRhcmdldE1hY2hpbmUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpUYXJnZXRNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDU4MjdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpUYXJnZXRNYWNoaW5lLmNwcApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0tIFN5c3RlbVpUYXJnZXRNYWNoaW5lLmNwcCAtIERlZmluZSBUYXJnZXRNYWNoaW5lIGZvciBTeXN0ZW1aIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiU3lzdGVtWk1DQXNtSW5mby5oIgorI2luY2x1ZGUgIlN5c3RlbVpUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiU3lzdGVtWi5oIgorI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZVN5c3RlbVpUYXJnZXQoKSB7CisgIC8vIFJlZ2lzdGVyIHRoZSB0YXJnZXQuCisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxTeXN0ZW1aVGFyZ2V0TWFjaGluZT4gWChUaGVTeXN0ZW1aVGFyZ2V0KTsKKyAgUmVnaXN0ZXJBc21JbmZvPFN5c3RlbVpNQ0FzbUluZm8+IFkoVGhlU3lzdGVtWlRhcmdldCk7Cit9CisKKy8vLyBTeXN0ZW1aVGFyZ2V0TWFjaGluZSBjdG9yIC0gQ3JlYXRlIGFuIElMUDY0IGFyY2hpdGVjdHVyZSBtb2RlbAorLy8vCitTeXN0ZW1aVGFyZ2V0TWFjaGluZTo6U3lzdGVtWlRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpCisgIDogTExWTVRhcmdldE1hY2hpbmUoVCwgVFQpLAorICAgIFN1YnRhcmdldChUVCwgRlMpLAorICAgIERhdGFMYXlvdXQoIkUtcDo2NDo2NDo2NC1pODo4OjE2LWkxNjoxNjoxNi1pMzI6MzI6MzItaTY0OjY0OjY0LWYzMjozMjozMiIKKyAgICAgICAgICAgICAgICItZjY0OjY0OjY0LWYxMjg6MTI4OjEyOC1hMDoxNjoxNi1uMzI6NjQiKSwKKyAgICBJbnN0ckluZm8oKnRoaXMpLCBUTEluZm8oKnRoaXMpLCBUU0luZm8oKnRoaXMpLAorICAgIEZyYW1lSW5mbyhUYXJnZXRGcmFtZUluZm86OlN0YWNrR3Jvd3NEb3duLCA4LCAtMTYwKSB7CisKKyAgaWYgKGdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpEZWZhdWx0KQorICAgIHNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6U3RhdGljKTsKK30KKworYm9vbCBTeXN0ZW1aVGFyZ2V0TWFjaGluZTo6YWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICAvLyBJbnN0YWxsIGFuIGluc3RydWN0aW9uIHNlbGVjdG9yLgorICBQTS5hZGQoY3JlYXRlU3lzdGVtWklTZWxEYWcoKnRoaXMsIE9wdExldmVsKSk7CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aVGFyZ2V0TWFjaGluZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1N5c3RlbVpUYXJnZXRNYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmODI5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9TeXN0ZW1aVGFyZ2V0TWFjaGluZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vPT0tIFN5c3RlbVpUYXJnZXRNYWNoaW5lLmggLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgU3lzdGVtWiAtLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTeXN0ZW1aIHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldE1hY2hpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIExMVk1fVEFSR0VUX1NZU1RFTVpfVEFSR0VUTUFDSElORV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1NZU1RFTVpfVEFSR0VUTUFDSElORV9ICisKKyNpbmNsdWRlICJTeXN0ZW1aSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiU3lzdGVtWklTZWxMb3dlcmluZy5oIgorI2luY2x1ZGUgIlN5c3RlbVpTZWxlY3Rpb25EQUdJbmZvLmgiCisjaW5jbHVkZSAiU3lzdGVtWlJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgIlN5c3RlbVpTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTeXN0ZW1aVGFyZ2V0TWFjaGluZQorLy8vCitjbGFzcyBTeXN0ZW1aVGFyZ2V0TWFjaGluZSA6IHB1YmxpYyBMTFZNVGFyZ2V0TWFjaGluZSB7CisgIFN5c3RlbVpTdWJ0YXJnZXQgICAgICAgIFN1YnRhcmdldDsKKyAgY29uc3QgVGFyZ2V0RGF0YSAgICAgICAgRGF0YUxheW91dDsgICAgICAgLy8gQ2FsY3VsYXRlcyB0eXBlIHNpemUgJiBhbGlnbm1lbnQKKyAgU3lzdGVtWkluc3RySW5mbyAgICAgICAgSW5zdHJJbmZvOworICBTeXN0ZW1aVGFyZ2V0TG93ZXJpbmcgICBUTEluZm87CisgIFN5c3RlbVpTZWxlY3Rpb25EQUdJbmZvIFRTSW5mbzsKKworICAvLyBTeXN0ZW1aIGRvZXMgbm90IGhhdmUgYW55IGNhbGwgc3RhY2sgZnJhbWUsIHRoZXJlZm9yZSBub3QgaGF2aW5nCisgIC8vIGFueSBTeXN0ZW1aIHNwZWNpZmljIEZyYW1lSW5mbyBjbGFzcy4KKyAgVGFyZ2V0RnJhbWVJbmZvICAgICAgIEZyYW1lSW5mbzsKK3B1YmxpYzoKKyAgU3lzdGVtWlRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGUyk7CisKKyAgdmlydHVhbCBjb25zdCBUYXJnZXRGcmFtZUluZm8gKmdldEZyYW1lSW5mbygpIGNvbnN0IHsgcmV0dXJuICZGcmFtZUluZm87IH0KKyAgdmlydHVhbCBjb25zdCBTeXN0ZW1aSW5zdHJJbmZvICpnZXRJbnN0ckluZm8oKSBjb25zdCAgeyByZXR1cm4gJkluc3RySW5mbzsgfQorICB2aXJ0dWFsIGNvbnN0IFRhcmdldERhdGEgKmdldFRhcmdldERhdGEoKSBjb25zdCAgICAgeyByZXR1cm4gJkRhdGFMYXlvdXQ7fQorICB2aXJ0dWFsIGNvbnN0IFN5c3RlbVpTdWJ0YXJnZXQgKmdldFN1YnRhcmdldEltcGwoKSBjb25zdCB7IHJldHVybiAmU3VidGFyZ2V0OyB9CisKKyAgdmlydHVhbCBjb25zdCBTeXN0ZW1aUmVnaXN0ZXJJbmZvICpnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuICZJbnN0ckluZm8uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IFN5c3RlbVpUYXJnZXRMb3dlcmluZyAqZ2V0VGFyZ2V0TG93ZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICZUTEluZm87CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IFN5c3RlbVpTZWxlY3Rpb25EQUdJbmZvKiBnZXRTZWxlY3Rpb25EQUdJbmZvKCkgY29uc3QgeworICAgIHJldHVybiAmVFNJbmZvOworICB9CisKKyAgdmlydHVhbCBib29sIGFkZEluc3RTZWxlY3RvcihQYXNzTWFuYWdlckJhc2UgJlBNLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7Cit9OyAvLyBTeXN0ZW1aVGFyZ2V0TWFjaGluZS4KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVEFSR0VUX1N5c3RlbVpfVEFSR0VUTUFDSElORV9ICmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0M2Q4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDcgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4gKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1TeXN0ZW1aSW5mbworICBTeXN0ZW1aVGFyZ2V0SW5mby5jcHAKKyAgKQorCithZGRfZGVwZW5kZW5jaWVzKExMVk1TeXN0ZW1aSW5mbyBTeXN0ZW1aQ29kZUdlblRhYmxlX2dlbikKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9UYXJnZXRJbmZvL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1RhcmdldEluZm8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlODBlYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvU3lzdGVtWi9UYXJnZXRJbmZvL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L1N5c3RlbVovVGFyZ2V0SW5mby9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCitMRVZFTCA9IC4uLy4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1TeXN0ZW1aSW5mbworCisjIEhhY2s6IHdlIG5lZWQgdG8gaW5jbHVkZSAnbWFpbicgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQRkxBR1MgPSAtSSQoUFJPSl9PQkpfRElSKS8uLiAtSSQoUFJPSl9TUkNfRElSKS8uLgorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1RhcmdldEluZm8vU3lzdGVtWlRhcmdldEluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9TeXN0ZW1aL1RhcmdldEluZm8vU3lzdGVtWlRhcmdldEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzJiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1N5c3RlbVovVGFyZ2V0SW5mby9TeXN0ZW1aVGFyZ2V0SW5mby5jcHAKQEAgLTAsMCArMSwxOSBAQAorLy89PT0tLSBTeXN0ZW1aVGFyZ2V0SW5mby5jcHAgLSBTeXN0ZW1aIFRhcmdldCBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlN5c3RlbVouaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGFyZ2V0IGxsdm06OlRoZVN5c3RlbVpUYXJnZXQ7CisKK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZVN5c3RlbVpUYXJnZXRJbmZvKCkgeworICBSZWdpc3RlclRhcmdldDxUcmlwbGU6OnN5c3RlbXo+IFgoVGhlU3lzdGVtWlRhcmdldCwgInN5c3RlbXoiLCAiU3lzdGVtWiIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXQuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Yzk2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1RhcmdldC5jcHAKQEAgLTAsMCArMSw5NSBAQAorLy89PT0tLSBUYXJnZXQuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQyBiaW5kaW5ncyBmb3IgbGliTExWTVRhcmdldC5hLCB3aGljaCBpbXBsZW1lbnRzCisvLyB0YXJnZXQgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0tYy9UYXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworTExWTVRhcmdldERhdGFSZWYgTExWTUNyZWF0ZVRhcmdldERhdGEoY29uc3QgY2hhciAqU3RyaW5nUmVwKSB7CisgIHJldHVybiB3cmFwKG5ldyBUYXJnZXREYXRhKFN0cmluZ1JlcCkpOworfQorCit2b2lkIExMVk1BZGRUYXJnZXREYXRhKExMVk1UYXJnZXREYXRhUmVmIFRELCBMTFZNUGFzc01hbmFnZXJSZWYgUE0pIHsKKyAgdW53cmFwKFBNKS0+YWRkKG5ldyBUYXJnZXREYXRhKCp1bndyYXAoVEQpKSk7Cit9CisKK2NoYXIgKkxMVk1Db3B5U3RyaW5nUmVwT2ZUYXJnZXREYXRhKExMVk1UYXJnZXREYXRhUmVmIFREKSB7CisgIHN0ZDo6c3RyaW5nIFN0cmluZ1JlcCA9IHVud3JhcChURCktPmdldFN0cmluZ1JlcHJlc2VudGF0aW9uKCk7CisgIHJldHVybiBzdHJkdXAoU3RyaW5nUmVwLmNfc3RyKCkpOworfQorCitMTFZNQnl0ZU9yZGVyaW5nIExMVk1CeXRlT3JkZXIoTExWTVRhcmdldERhdGFSZWYgVEQpIHsKKyAgcmV0dXJuIHVud3JhcChURCktPmlzTGl0dGxlRW5kaWFuKCkgPyBMTFZNTGl0dGxlRW5kaWFuIDogTExWTUJpZ0VuZGlhbjsKK30KKwordW5zaWduZWQgTExWTVBvaW50ZXJTaXplKExMVk1UYXJnZXREYXRhUmVmIFREKSB7CisgIHJldHVybiB1bndyYXAoVEQpLT5nZXRQb2ludGVyU2l6ZSgpOworfQorCitMTFZNVHlwZVJlZiBMTFZNSW50UHRyVHlwZShMTFZNVGFyZ2V0RGF0YVJlZiBURCkgeworICByZXR1cm4gd3JhcCh1bndyYXAoVEQpLT5nZXRJbnRQdHJUeXBlKGdldEdsb2JhbENvbnRleHQoKSkpOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgTExWTVNpemVPZlR5cGVJbkJpdHMoTExWTVRhcmdldERhdGFSZWYgVEQsIExMVk1UeXBlUmVmIFR5KSB7CisgIHJldHVybiB1bndyYXAoVEQpLT5nZXRUeXBlU2l6ZUluQml0cyh1bndyYXAoVHkpKTsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIExMVk1TdG9yZVNpemVPZlR5cGUoTExWTVRhcmdldERhdGFSZWYgVEQsIExMVk1UeXBlUmVmIFR5KSB7CisgIHJldHVybiB1bndyYXAoVEQpLT5nZXRUeXBlU3RvcmVTaXplKHVud3JhcChUeSkpOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgTExWTUFCSVNpemVPZlR5cGUoTExWTVRhcmdldERhdGFSZWYgVEQsIExMVk1UeXBlUmVmIFR5KSB7CisgIHJldHVybiB1bndyYXAoVEQpLT5nZXRUeXBlQWxsb2NTaXplKHVud3JhcChUeSkpOworfQorCit1bnNpZ25lZCBMTFZNQUJJQWxpZ25tZW50T2ZUeXBlKExMVk1UYXJnZXREYXRhUmVmIFRELCBMTFZNVHlwZVJlZiBUeSkgeworICByZXR1cm4gdW53cmFwKFREKS0+Z2V0QUJJVHlwZUFsaWdubWVudCh1bndyYXAoVHkpKTsKK30KKwordW5zaWduZWQgTExWTUNhbGxGcmFtZUFsaWdubWVudE9mVHlwZShMTFZNVGFyZ2V0RGF0YVJlZiBURCwgTExWTVR5cGVSZWYgVHkpIHsKKyAgcmV0dXJuIHVud3JhcChURCktPmdldENhbGxGcmFtZVR5cGVBbGlnbm1lbnQodW53cmFwKFR5KSk7Cit9CisKK3Vuc2lnbmVkIExMVk1QcmVmZXJyZWRBbGlnbm1lbnRPZlR5cGUoTExWTVRhcmdldERhdGFSZWYgVEQsIExMVk1UeXBlUmVmIFR5KSB7CisgIHJldHVybiB1bndyYXAoVEQpLT5nZXRQcmVmVHlwZUFsaWdubWVudCh1bndyYXAoVHkpKTsKK30KKwordW5zaWduZWQgTExWTVByZWZlcnJlZEFsaWdubWVudE9mR2xvYmFsKExMVk1UYXJnZXREYXRhUmVmIFRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBHbG9iYWxWYXIpIHsKKyAgcmV0dXJuIHVud3JhcChURCktPmdldFByZWZlcnJlZEFsaWdubWVudCh1bndyYXA8R2xvYmFsVmFyaWFibGU+KEdsb2JhbFZhcikpOworfQorCit1bnNpZ25lZCBMTFZNRWxlbWVudEF0T2Zmc2V0KExMVk1UYXJnZXREYXRhUmVmIFRELCBMTFZNVHlwZVJlZiBTdHJ1Y3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIE9mZnNldCkgeworICBjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSB1bndyYXA8U3RydWN0VHlwZT4oU3RydWN0VHkpOworICByZXR1cm4gdW53cmFwKFREKS0+Z2V0U3RydWN0TGF5b3V0KFNUeSktPmdldEVsZW1lbnRDb250YWluaW5nT2Zmc2V0KE9mZnNldCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBMTFZNT2Zmc2V0T2ZFbGVtZW50KExMVk1UYXJnZXREYXRhUmVmIFRELCBMTFZNVHlwZVJlZiBTdHJ1Y3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVsZW1lbnQpIHsKKyAgY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gdW53cmFwPFN0cnVjdFR5cGU+KFN0cnVjdFR5KTsKKyAgcmV0dXJuIHVud3JhcChURCktPmdldFN0cnVjdExheW91dChTVHkpLT5nZXRFbGVtZW50T2Zmc2V0KEVsZW1lbnQpOworfQorCit2b2lkIExMVk1JbnZhbGlkYXRlU3RydWN0TGF5b3V0KExMVk1UYXJnZXREYXRhUmVmIFRELCBMTFZNVHlwZVJlZiBTdHJ1Y3RUeSkgeworICB1bndyYXAoVEQpLT5JbnZhbGlkYXRlU3RydWN0TGF5b3V0SW5mbyh1bndyYXA8U3RydWN0VHlwZT4oU3RydWN0VHkpKTsKK30KKwordm9pZCBMTFZNRGlzcG9zZVRhcmdldERhdGEoTExWTVRhcmdldERhdGFSZWYgVEQpIHsKKyAgZGVsZXRlIHVud3JhcChURCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1RhcmdldEFzbUxleGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0QXNtTGV4ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODkzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1RhcmdldEFzbUxleGVyLmNwcApAQCAtMCwwICsxLDE0IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldEFzbUxleGVyLmNwcCAtIFRhcmdldCBBc3NlbWJseSBMZXhlciAtLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtTGV4ZXIuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitUYXJnZXRBc21MZXhlcjo6VGFyZ2V0QXNtTGV4ZXIoY29uc3QgVGFyZ2V0ICZUKSA6IFRoZVRhcmdldChUKSwgTGV4ZXIoTlVMTCkge30KK1RhcmdldEFzbUxleGVyOjp+VGFyZ2V0QXNtTGV4ZXIoKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXREYXRhLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0RGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2ZDI4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0RGF0YS5jcHAKQEAgLTAsMCArMSw2NjAgQEAKKy8vPT09LS0gVGFyZ2V0RGF0YS5jcHAgLSBEYXRhIHNpemUgJiBhbGlnbm1lbnQgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGFyZ2V0IHByb3BlcnRpZXMgcmVsYXRlZCB0byBkYXRhdHlwZSBzaXplL29mZnNldC9hbGlnbm1lbnQKKy8vIGluZm9ybWF0aW9uLgorLy8KKy8vIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBjcmVhdGVkIG9uY2UsIGZpbGxlZCBpbiBpZiB0aGUgZGVmYXVsdHMgYXJlIG5vdAorLy8gY29ycmVjdCBhbmQgdGhlbiBwYXNzZWQgYXJvdW5kIGJ5IGNvbnN0Ji4gIE5vbmUgb2YgdGhlIG1lbWJlcnMgZnVuY3Rpb25zCisvLyByZXF1aXJlIG1vZGlmaWNhdGlvbiB0byB0aGUgb2JqZWN0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NdXRleC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRsaWI+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gSGFuZGxlIHRoZSBQYXNzIHJlZ2lzdHJhdGlvbiBzdHVmZiBuZWNlc3NhcnkgdG8gdXNlIFRhcmdldERhdGEncy4KKworLy8gUmVnaXN0ZXIgdGhlIGRlZmF1bHQgU3BhcmNWOSBpbXBsZW1lbnRhdGlvbi4uLgorSU5JVElBTElaRV9QQVNTKFRhcmdldERhdGEsICJ0YXJnZXRkYXRhIiwgIlRhcmdldCBEYXRhIExheW91dCIsIGZhbHNlLCB0cnVlKTsKK2NoYXIgVGFyZ2V0RGF0YTo6SUQgPSAwOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3VwcG9ydCBmb3IgU3RydWN0TGF5b3V0CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTdHJ1Y3RMYXlvdXQ6OlN0cnVjdExheW91dChjb25zdCBTdHJ1Y3RUeXBlICpTVCwgY29uc3QgVGFyZ2V0RGF0YSAmVEQpIHsKKyAgU3RydWN0QWxpZ25tZW50ID0gMDsKKyAgU3RydWN0U2l6ZSA9IDA7CisgIE51bUVsZW1lbnRzID0gU1QtPmdldE51bUVsZW1lbnRzKCk7CisKKyAgLy8gTG9vcCBvdmVyIGVhY2ggb2YgdGhlIGVsZW1lbnRzLCBwbGFjaW5nIHRoZW0gaW4gbWVtb3J5LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtRWxlbWVudHM7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgVHlwZSAqVHkgPSBTVC0+Z2V0RWxlbWVudFR5cGUoaSk7CisgICAgdW5zaWduZWQgVHlBbGlnbiA9IFNULT5pc1BhY2tlZCgpID8gMSA6IFRELmdldEFCSVR5cGVBbGlnbm1lbnQoVHkpOworCisgICAgLy8gQWRkIHBhZGRpbmcgaWYgbmVjZXNzYXJ5IHRvIGFsaWduIHRoZSBkYXRhIGVsZW1lbnQgcHJvcGVybHkuCisgICAgaWYgKChTdHJ1Y3RTaXplICYgKFR5QWxpZ24tMSkpICE9IDApCisgICAgICBTdHJ1Y3RTaXplID0gVGFyZ2V0RGF0YTo6Um91bmRVcEFsaWdubWVudChTdHJ1Y3RTaXplLCBUeUFsaWduKTsKKworICAgIC8vIEtlZXAgdHJhY2sgb2YgbWF4aW11bSBhbGlnbm1lbnQgY29uc3RyYWludC4KKyAgICBTdHJ1Y3RBbGlnbm1lbnQgPSBzdGQ6Om1heChUeUFsaWduLCBTdHJ1Y3RBbGlnbm1lbnQpOworCisgICAgTWVtYmVyT2Zmc2V0c1tpXSA9IFN0cnVjdFNpemU7CisgICAgU3RydWN0U2l6ZSArPSBURC5nZXRUeXBlQWxsb2NTaXplKFR5KTsgLy8gQ29uc3VtZSBzcGFjZSBmb3IgdGhpcyBkYXRhIGl0ZW0KKyAgfQorCisgIC8vIEVtcHR5IHN0cnVjdHVyZXMgaGF2ZSBhbGlnbm1lbnQgb2YgMSBieXRlLgorICBpZiAoU3RydWN0QWxpZ25tZW50ID09IDApIFN0cnVjdEFsaWdubWVudCA9IDE7CisKKyAgLy8gQWRkIHBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgc3RydWN0IHNvIHRoYXQgaXQgY291bGQgYmUgcHV0IGluIGFuIGFycmF5CisgIC8vIGFuZCBhbGwgYXJyYXkgZWxlbWVudHMgd291bGQgYmUgYWxpZ25lZCBjb3JyZWN0bHkuCisgIGlmICgoU3RydWN0U2l6ZSAmIChTdHJ1Y3RBbGlnbm1lbnQtMSkpICE9IDApCisgICAgU3RydWN0U2l6ZSA9IFRhcmdldERhdGE6OlJvdW5kVXBBbGlnbm1lbnQoU3RydWN0U2l6ZSwgU3RydWN0QWxpZ25tZW50KTsKK30KKworCisvLy8gZ2V0RWxlbWVudENvbnRhaW5pbmdPZmZzZXQgLSBHaXZlbiBhIHZhbGlkIG9mZnNldCBpbnRvIHRoZSBzdHJ1Y3R1cmUsCisvLy8gcmV0dXJuIHRoZSBzdHJ1Y3R1cmUgaW5kZXggdGhhdCBjb250YWlucyBpdC4KK3Vuc2lnbmVkIFN0cnVjdExheW91dDo6Z2V0RWxlbWVudENvbnRhaW5pbmdPZmZzZXQodWludDY0X3QgT2Zmc2V0KSBjb25zdCB7CisgIGNvbnN0IHVpbnQ2NF90ICpTSSA9CisgICAgc3RkOjp1cHBlcl9ib3VuZCgmTWVtYmVyT2Zmc2V0c1swXSwgJk1lbWJlck9mZnNldHNbTnVtRWxlbWVudHNdLCBPZmZzZXQpOworICBhc3NlcnQoU0kgIT0gJk1lbWJlck9mZnNldHNbMF0gJiYgIk9mZnNldCBub3QgaW4gc3RydWN0dXJlIHR5cGUhIik7CisgIC0tU0k7CisgIGFzc2VydCgqU0kgPD0gT2Zmc2V0ICYmICJ1cHBlcl9ib3VuZCBkaWRuJ3Qgd29yayIpOworICBhc3NlcnQoKFNJID09ICZNZW1iZXJPZmZzZXRzWzBdIHx8ICooU0ktMSkgPD0gT2Zmc2V0KSAmJgorICAgICAgICAgKFNJKzEgPT0gJk1lbWJlck9mZnNldHNbTnVtRWxlbWVudHNdIHx8ICooU0krMSkgPiBPZmZzZXQpICYmCisgICAgICAgICAiVXBwZXIgYm91bmQgZGlkbid0IHdvcmshIik7CisgIAorICAvLyBNdWx0aXBsZSBmaWVsZHMgY2FuIGhhdmUgdGhlIHNhbWUgb2Zmc2V0IGlmIGFueSBvZiB0aGVtIGFyZSB6ZXJvIHNpemVkLgorICAvLyBGb3IgZXhhbXBsZSwgaW4geyBpMzIsIFswIHggaTMyXSwgaTMyIH0sIHNlYXJjaGluZyBmb3Igb2Zmc2V0IDQgd2lsbCBzdG9wCisgIC8vIGF0IHRoZSBpMzIgZWxlbWVudCwgYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBlbGVtZW50IGF0IHRoYXQgb2Zmc2V0LiAgVGhpcyBpcworICAvLyB0aGUgcmlnaHQgb25lIHRvIHJldHVybiwgYmVjYXVzZSBhbnl0aGluZyBhZnRlciBpdCB3aWxsIGhhdmUgYSBoaWdoZXIKKyAgLy8gb2Zmc2V0LCBpbXBseWluZyB0aGF0IHRoaXMgZWxlbWVudCBpcyBub24tZW1wdHkuCisgIHJldHVybiBTSS0mTWVtYmVyT2Zmc2V0c1swXTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhcmdldEFsaWduRWxlbSwgVGFyZ2V0QWxpZ24gc3VwcG9ydAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGFyZ2V0QWxpZ25FbGVtCitUYXJnZXRBbGlnbkVsZW06OmdldChBbGlnblR5cGVFbnVtIGFsaWduX3R5cGUsIHVuc2lnbmVkIGNoYXIgYWJpX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwcmVmX2FsaWduLCB1aW50MzJfdCBiaXRfd2lkdGgpIHsKKyAgYXNzZXJ0KGFiaV9hbGlnbiA8PSBwcmVmX2FsaWduICYmICJQcmVmZXJyZWQgYWxpZ25tZW50IHdvcnNlIHRoYW4gQUJJISIpOworICBUYXJnZXRBbGlnbkVsZW0gcmV0dmFsOworICByZXR2YWwuQWxpZ25UeXBlID0gYWxpZ25fdHlwZTsKKyAgcmV0dmFsLkFCSUFsaWduID0gYWJpX2FsaWduOworICByZXR2YWwuUHJlZkFsaWduID0gcHJlZl9hbGlnbjsKKyAgcmV0dmFsLlR5cGVCaXRXaWR0aCA9IGJpdF93aWR0aDsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworYm9vbAorVGFyZ2V0QWxpZ25FbGVtOjpvcGVyYXRvcj09KGNvbnN0IFRhcmdldEFsaWduRWxlbSAmcmhzKSBjb25zdCB7CisgIHJldHVybiAoQWxpZ25UeXBlID09IHJocy5BbGlnblR5cGUKKyAgICAgICAgICAmJiBBQklBbGlnbiA9PSByaHMuQUJJQWxpZ24KKyAgICAgICAgICAmJiBQcmVmQWxpZ24gPT0gcmhzLlByZWZBbGlnbgorICAgICAgICAgICYmIFR5cGVCaXRXaWR0aCA9PSByaHMuVHlwZUJpdFdpZHRoKTsKK30KKworY29uc3QgVGFyZ2V0QWxpZ25FbGVtIFRhcmdldERhdGE6OkludmFsaWRBbGlnbm1lbnRFbGVtID0KKyAgICAgICAgICAgICAgICBUYXJnZXRBbGlnbkVsZW06OmdldCgoQWxpZ25UeXBlRW51bSkgLTEsIDAsIDAsIDApOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgIFRhcmdldERhdGEgQ2xhc3MgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBnZXRJbnQgLSBHZXQgYW4gaW50ZWdlciBpZ25vcmluZyBlcnJvcnMuCitzdGF0aWMgdW5zaWduZWQgZ2V0SW50KFN0cmluZ1JlZiBSKSB7CisgIHVuc2lnbmVkIFJlc3VsdCA9IDA7CisgIFIuZ2V0QXNJbnRlZ2VyKDEwLCBSZXN1bHQpOworICByZXR1cm4gUmVzdWx0OworfQorCit2b2lkIFRhcmdldERhdGE6OmluaXQoU3RyaW5nUmVmIERlc2MpIHsKKyAgTGF5b3V0TWFwID0gMDsKKyAgTGl0dGxlRW5kaWFuID0gZmFsc2U7CisgIFBvaW50ZXJNZW1TaXplID0gODsKKyAgUG9pbnRlckFCSUFsaWduID0gODsKKyAgUG9pbnRlclByZWZBbGlnbiA9IFBvaW50ZXJBQklBbGlnbjsKKworICAvLyBEZWZhdWx0IGFsaWdubWVudHMKKyAgc2V0QWxpZ25tZW50KElOVEVHRVJfQUxJR04sICAgMSwgIDEsIDEpOyAgIC8vIGkxCisgIHNldEFsaWdubWVudChJTlRFR0VSX0FMSUdOLCAgIDEsICAxLCA4KTsgICAvLyBpOAorICBzZXRBbGlnbm1lbnQoSU5URUdFUl9BTElHTiwgICAyLCAgMiwgMTYpOyAgLy8gaTE2CisgIHNldEFsaWdubWVudChJTlRFR0VSX0FMSUdOLCAgIDQsICA0LCAzMik7ICAvLyBpMzIKKyAgc2V0QWxpZ25tZW50KElOVEVHRVJfQUxJR04sICAgNCwgIDgsIDY0KTsgIC8vIGk2NAorICBzZXRBbGlnbm1lbnQoRkxPQVRfQUxJR04sICAgICA0LCAgNCwgMzIpOyAgLy8gZmxvYXQKKyAgc2V0QWxpZ25tZW50KEZMT0FUX0FMSUdOLCAgICAgOCwgIDgsIDY0KTsgIC8vIGRvdWJsZQorICBzZXRBbGlnbm1lbnQoVkVDVE9SX0FMSUdOLCAgICA4LCAgOCwgNjQpOyAgLy8gdjJpMzIsIHYxaTY0LCAuLi4KKyAgc2V0QWxpZ25tZW50KFZFQ1RPUl9BTElHTiwgICAxNiwgMTYsIDEyOCk7IC8vIHYxNmk4LCB2OGkxNiwgdjRpMzIsIC4uLgorICBzZXRBbGlnbm1lbnQoQUdHUkVHQVRFX0FMSUdOLCAwLCAgOCwgIDApOyAgLy8gc3RydWN0CisKKyAgd2hpbGUgKCFEZXNjLmVtcHR5KCkpIHsKKyAgICBzdGQ6OnBhaXI8U3RyaW5nUmVmLCBTdHJpbmdSZWY+IFNwbGl0ID0gRGVzYy5zcGxpdCgnLScpOworICAgIFN0cmluZ1JlZiBUb2tlbiA9IFNwbGl0LmZpcnN0OworICAgIERlc2MgPSBTcGxpdC5zZWNvbmQ7CisgICAgCisgICAgaWYgKFRva2VuLmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICBTcGxpdCA9IFRva2VuLnNwbGl0KCc6Jyk7CisgICAgU3RyaW5nUmVmIFNwZWNpZmllciA9IFNwbGl0LmZpcnN0OworICAgIFRva2VuID0gU3BsaXQuc2Vjb25kOworICAgIAorICAgIGFzc2VydCghU3BlY2lmaWVyLmVtcHR5KCkgJiYgIkNhbid0IGJlIGVtcHR5IGhlcmUiKTsKKyAgICAKKyAgICBzd2l0Y2ggKFNwZWNpZmllclswXSkgeworICAgIGNhc2UgJ0UnOgorICAgICAgTGl0dGxlRW5kaWFuID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlICdlJzoKKyAgICAgIExpdHRsZUVuZGlhbiA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdwJzoKKyAgICAgIFNwbGl0ID0gVG9rZW4uc3BsaXQoJzonKTsKKyAgICAgIFBvaW50ZXJNZW1TaXplID0gZ2V0SW50KFNwbGl0LmZpcnN0KSAvIDg7CisgICAgICBTcGxpdCA9IFNwbGl0LnNlY29uZC5zcGxpdCgnOicpOworICAgICAgUG9pbnRlckFCSUFsaWduID0gZ2V0SW50KFNwbGl0LmZpcnN0KSAvIDg7CisgICAgICBTcGxpdCA9IFNwbGl0LnNlY29uZC5zcGxpdCgnOicpOworICAgICAgUG9pbnRlclByZWZBbGlnbiA9IGdldEludChTcGxpdC5maXJzdCkgLyA4OworICAgICAgaWYgKFBvaW50ZXJQcmVmQWxpZ24gPT0gMCkKKyAgICAgICAgUG9pbnRlclByZWZBbGlnbiA9IFBvaW50ZXJBQklBbGlnbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgIGNhc2UgJ3YnOgorICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ2EnOgorICAgIGNhc2UgJ3MnOiB7CisgICAgICBBbGlnblR5cGVFbnVtIEFsaWduVHlwZTsKKyAgICAgIHN3aXRjaCAoU3BlY2lmaWVyWzBdKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSAnaSc6IEFsaWduVHlwZSA9IElOVEVHRVJfQUxJR047IGJyZWFrOworICAgICAgY2FzZSAndic6IEFsaWduVHlwZSA9IFZFQ1RPUl9BTElHTjsgYnJlYWs7CisgICAgICBjYXNlICdmJzogQWxpZ25UeXBlID0gRkxPQVRfQUxJR047IGJyZWFrOworICAgICAgY2FzZSAnYSc6IEFsaWduVHlwZSA9IEFHR1JFR0FURV9BTElHTjsgYnJlYWs7CisgICAgICBjYXNlICdzJzogQWxpZ25UeXBlID0gU1RBQ0tfQUxJR047IGJyZWFrOworICAgICAgfQorICAgICAgdW5zaWduZWQgU2l6ZSA9IGdldEludChTcGVjaWZpZXIuc3Vic3RyKDEpKTsKKyAgICAgIFNwbGl0ID0gVG9rZW4uc3BsaXQoJzonKTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgQUJJQWxpZ24gPSBnZXRJbnQoU3BsaXQuZmlyc3QpIC8gODsKKyAgICAgIAorICAgICAgU3BsaXQgPSBTcGxpdC5zZWNvbmQuc3BsaXQoJzonKTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgUHJlZkFsaWduID0gZ2V0SW50KFNwbGl0LmZpcnN0KSAvIDg7CisgICAgICBpZiAoUHJlZkFsaWduID09IDApCisgICAgICAgIFByZWZBbGlnbiA9IEFCSUFsaWduOworICAgICAgc2V0QWxpZ25tZW50KEFsaWduVHlwZSwgQUJJQWxpZ24sIFByZWZBbGlnbiwgU2l6ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnbic6ICAvLyBOYXRpdmUgaW50ZWdlciB0eXBlcy4KKyAgICAgIFNwZWNpZmllciA9IFNwZWNpZmllci5zdWJzdHIoMSk7CisgICAgICBkbyB7CisgICAgICAgIGlmICh1bnNpZ25lZCBXaWR0aCA9IGdldEludChTcGVjaWZpZXIpKQorICAgICAgICAgIExlZ2FsSW50V2lkdGhzLnB1c2hfYmFjayhXaWR0aCk7CisgICAgICAgIFNwbGl0ID0gVG9rZW4uc3BsaXQoJzonKTsKKyAgICAgICAgU3BlY2lmaWVyID0gU3BsaXQuZmlyc3Q7CisgICAgICAgIFRva2VuID0gU3BsaXQuc2Vjb25kOworICAgICAgfSB3aGlsZSAoIVNwZWNpZmllci5lbXB0eSgpIHx8ICFUb2tlbi5lbXB0eSgpKTsKKyAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8vLyBEZWZhdWx0IGN0b3IuCisvLy8KKy8vLyBAbm90ZSBUaGlzIGhhcyB0byBleGlzdCwgYmVjYXVzZSB0aGlzIGlzIGEgcGFzcywgYnV0IGl0IHNob3VsZCBuZXZlciBiZQorLy8vIHVzZWQuCitUYXJnZXREYXRhOjpUYXJnZXREYXRhKCkgOiBJbW11dGFibGVQYXNzKElEKSB7CisgIHJlcG9ydF9mYXRhbF9lcnJvcigiQmFkIFRhcmdldERhdGEgY3RvciB1c2VkLiAgIgorICAgICAgICAgICAgICAgICAgICAiVG9vbCBkaWQgbm90IHNwZWNpZnkgYSBUYXJnZXREYXRhIHRvIHVzZT8iKTsKK30KKworVGFyZ2V0RGF0YTo6VGFyZ2V0RGF0YShjb25zdCBNb2R1bGUgKk0pIAorICA6IEltbXV0YWJsZVBhc3MoSUQpIHsKKyAgaW5pdChNLT5nZXREYXRhTGF5b3V0KCkpOworfQorCit2b2lkCitUYXJnZXREYXRhOjpzZXRBbGlnbm1lbnQoQWxpZ25UeXBlRW51bSBhbGlnbl90eXBlLCB1bnNpZ25lZCBjaGFyIGFiaV9hbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHByZWZfYWxpZ24sIHVpbnQzMl90IGJpdF93aWR0aCkgeworICBhc3NlcnQoYWJpX2FsaWduIDw9IHByZWZfYWxpZ24gJiYgIlByZWZlcnJlZCBhbGlnbm1lbnQgd29yc2UgdGhhbiBBQkkhIik7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBbGlnbm1lbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoQWxpZ25tZW50c1tpXS5BbGlnblR5cGUgPT0gYWxpZ25fdHlwZSAmJgorICAgICAgICBBbGlnbm1lbnRzW2ldLlR5cGVCaXRXaWR0aCA9PSBiaXRfd2lkdGgpIHsKKyAgICAgIC8vIFVwZGF0ZSB0aGUgYWJpLCBwcmVmZXJyZWQgYWxpZ25tZW50cy4KKyAgICAgIEFsaWdubWVudHNbaV0uQUJJQWxpZ24gPSBhYmlfYWxpZ247CisgICAgICBBbGlnbm1lbnRzW2ldLlByZWZBbGlnbiA9IHByZWZfYWxpZ247CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIAorICBBbGlnbm1lbnRzLnB1c2hfYmFjayhUYXJnZXRBbGlnbkVsZW06OmdldChhbGlnbl90eXBlLCBhYmlfYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZfYWxpZ24sIGJpdF93aWR0aCkpOworfQorCisvLy8gZ2V0QWxpZ25tZW50SW5mbyAtIFJldHVybiB0aGUgYWxpZ25tZW50IChlaXRoZXIgQUJJIGlmIEFCSUluZm8gPSB0cnVlIG9yIAorLy8vIHByZWZlcnJlZCBpZiBBQklJbmZvID0gZmFsc2UpIHRoZSB0YXJnZXQgd2FudHMgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YXR5cGUuCit1bnNpZ25lZCBUYXJnZXREYXRhOjpnZXRBbGlnbm1lbnRJbmZvKEFsaWduVHlwZUVudW0gQWxpZ25UeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQml0V2lkdGgsIGJvb2wgQUJJSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIGNvbnN0IHsKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhhY3QgbWF0Y2ggYW5kIHJlbWVtYmVyIHRoZSBiZXN0IG1hdGNoIHdlIHNlZS4KKyAgaW50IEJlc3RNYXRjaElkeCA9IC0xOworICBpbnQgTGFyZ2VzdEludCA9IC0xOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQWxpZ25tZW50cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKEFsaWdubWVudHNbaV0uQWxpZ25UeXBlID09IEFsaWduVHlwZSAmJgorICAgICAgICBBbGlnbm1lbnRzW2ldLlR5cGVCaXRXaWR0aCA9PSBCaXRXaWR0aCkKKyAgICAgIHJldHVybiBBQklJbmZvID8gQWxpZ25tZW50c1tpXS5BQklBbGlnbiA6IEFsaWdubWVudHNbaV0uUHJlZkFsaWduOworICAgIAorICAgIC8vIFRoZSBiZXN0IG1hdGNoIHNvIGZhciBkZXBlbmRzIG9uIHdoYXQgd2UncmUgbG9va2luZyBmb3IuCisgICAgIGlmIChBbGlnblR5cGUgPT0gSU5URUdFUl9BTElHTiAmJiAKKyAgICAgICAgIEFsaWdubWVudHNbaV0uQWxpZ25UeXBlID09IElOVEVHRVJfQUxJR04pIHsKKyAgICAgIC8vIFRoZSAiYmVzdCBtYXRjaCIgZm9yIGludGVnZXJzIGlzIHRoZSBzbWFsbGVzdCBzaXplIHRoYXQgaXMgbGFyZ2VyIHRoYW4KKyAgICAgIC8vIHRoZSBCaXRXaWR0aCByZXF1ZXN0ZWQuCisgICAgICBpZiAoQWxpZ25tZW50c1tpXS5UeXBlQml0V2lkdGggPiBCaXRXaWR0aCAmJiAoQmVzdE1hdGNoSWR4ID09IC0xIHx8IAorICAgICAgICAgICBBbGlnbm1lbnRzW2ldLlR5cGVCaXRXaWR0aCA8IEFsaWdubWVudHNbQmVzdE1hdGNoSWR4XS5UeXBlQml0V2lkdGgpKQorICAgICAgICBCZXN0TWF0Y2hJZHggPSBpOworICAgICAgLy8gSG93ZXZlciwgaWYgdGhlcmUgaXNuJ3Qgb25lIHRoYXQncyBsYXJnZXIsIHRoZW4gd2UgbXVzdCB1c2UgdGhlCisgICAgICAvLyBsYXJnZXN0IG9uZSB3ZSBoYXZlIChzZWUgYmVsb3cpCisgICAgICBpZiAoTGFyZ2VzdEludCA9PSAtMSB8fCAKKyAgICAgICAgICBBbGlnbm1lbnRzW2ldLlR5cGVCaXRXaWR0aCA+IEFsaWdubWVudHNbTGFyZ2VzdEludF0uVHlwZUJpdFdpZHRoKQorICAgICAgICBMYXJnZXN0SW50ID0gaTsKKyAgICB9CisgIH0KKworICAvLyBPa2F5LCB3ZSBkaWRuJ3QgZmluZCBhbiBleGFjdCBzb2x1dGlvbi4gIEZhbGwgYmFjayBoZXJlIGRlcGVuZGluZyBvbiB3aGF0CisgIC8vIGlzIGJlaW5nIGxvb2tlZCBmb3IuCisgIGlmIChCZXN0TWF0Y2hJZHggPT0gLTEpIHsKKyAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbiBpbnRlZ2VyIGFsaWdubWVudCwgZmFsbCBiYWNrIG9uIG1vc3QgY29uc2VydmF0aXZlLgorICAgIGlmIChBbGlnblR5cGUgPT0gSU5URUdFUl9BTElHTikgeworICAgICAgQmVzdE1hdGNoSWR4ID0gTGFyZ2VzdEludDsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KEFsaWduVHlwZSA9PSBWRUNUT1JfQUxJR04gJiYgIlVua25vd24gYWxpZ25tZW50IHR5cGUhIik7CisKKyAgICAgIC8vIEJ5IGRlZmF1bHQsIHVzZSBuYXR1cmFsIGFsaWdubWVudCBmb3IgdmVjdG9yIHR5cGVzLiBUaGlzIGlzIGNvbnNpc3RlbnQKKyAgICAgIC8vIHdpdGggd2hhdCBjbGFuZyBhbmQgbGx2bS1nY2MgZG8uCisgICAgICB1bnNpZ25lZCBBbGlnbiA9IGdldFR5cGVBbGxvY1NpemUoY2FzdDxWZWN0b3JUeXBlPihUeSktPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgQWxpZ24gKj0gY2FzdDxWZWN0b3JUeXBlPihUeSktPmdldE51bUVsZW1lbnRzKCk7CisgICAgICAvLyBJZiB0aGUgYWxpZ25tZW50IGlzIG5vdCBhIHBvd2VyIG9mIDIsIHJvdW5kIHVwIHRvIHRoZSBuZXh0IHBvd2VyIG9mIDIuCisgICAgICAvLyBUaGlzIGhhcHBlbnMgZm9yIG5vbi1wb3dlci1vZi0yIGxlbmd0aCB2ZWN0b3JzLgorICAgICAgaWYgKEFsaWduICYgKEFsaWduLTEpKQorICAgICAgICBBbGlnbiA9IGxsdm06Ok5leHRQb3dlck9mMihBbGlnbik7CisgICAgICByZXR1cm4gQWxpZ247CisgICAgfQorICB9CisKKyAgLy8gU2luY2Ugd2UgZ290IGEgImJlc3QgbWF0Y2giIGluZGV4LCBqdXN0IHJldHVybiBpdC4KKyAgcmV0dXJuIEFCSUluZm8gPyBBbGlnbm1lbnRzW0Jlc3RNYXRjaElkeF0uQUJJQWxpZ24KKyAgICAgICAgICAgICAgICAgOiBBbGlnbm1lbnRzW0Jlc3RNYXRjaElkeF0uUHJlZkFsaWduOworfQorCituYW1lc3BhY2UgeworCitjbGFzcyBTdHJ1Y3RMYXlvdXRNYXAgOiBwdWJsaWMgQWJzdHJhY3RUeXBlVXNlciB7CisgIHR5cGVkZWYgRGVuc2VNYXA8Y29uc3QgU3RydWN0VHlwZSosIFN0cnVjdExheW91dCo+IExheW91dEluZm9UeTsKKyAgTGF5b3V0SW5mb1R5IExheW91dEluZm87CisKKyAgdm9pZCBSZW1vdmVFbnRyeShMYXlvdXRJbmZvVHk6Oml0ZXJhdG9yIEksIGJvb2wgV2FzQWJzdHJhY3QpIHsKKyAgICBJLT5zZWNvbmQtPn5TdHJ1Y3RMYXlvdXQoKTsKKyAgICBmcmVlKEktPnNlY29uZCk7CisgICAgaWYgKFdhc0Fic3RyYWN0KQorICAgICAgSS0+Zmlyc3QtPnJlbW92ZUFic3RyYWN0VHlwZVVzZXIodGhpcyk7CisgICAgTGF5b3V0SW5mby5lcmFzZShJKTsKKyAgfQorICAKKyAgCisgIC8vLyByZWZpbmVBYnN0cmFjdFR5cGUgLSBUaGUgY2FsbGJhY2sgbWV0aG9kIGludm9rZWQgd2hlbiBhbiBhYnN0cmFjdCB0eXBlIGlzCisgIC8vLyByZXNvbHZlZCB0byBhbm90aGVyIHR5cGUuICBBbiBvYmplY3QgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byB1cGRhdGUKKyAgLy8vIGl0cyBpbnRlcm5hbCBzdGF0ZSB0byByZWZlcmVuY2UgTmV3VHlwZSBpbnN0ZWFkIG9mIE9sZFR5cGUuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgcmVmaW5lQWJzdHJhY3RUeXBlKGNvbnN0IERlcml2ZWRUeXBlICpPbGRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICopIHsKKyAgICBMYXlvdXRJbmZvVHk6Oml0ZXJhdG9yIEkgPSBMYXlvdXRJbmZvLmZpbmQoY2FzdDxjb25zdCBTdHJ1Y3RUeXBlPihPbGRUeSkpOworICAgIGFzc2VydChJICE9IExheW91dEluZm8uZW5kKCkgJiYgIlVzaW5nIHR5cGUgYnV0IG5vdCBpbiBtYXA/Iik7CisgICAgUmVtb3ZlRW50cnkoSSwgdHJ1ZSk7CisgIH0KKworICAvLy8gdHlwZUJlY2FtZUNvbmNyZXRlIC0gVGhlIG90aGVyIGNhc2Ugd2hpY2ggQWJzdHJhY3RUeXBlVXNlcnMgbXVzdCBiZSBhd2FyZQorICAvLy8gb2YgaXMgd2hlbiBhIHR5cGUgbWFrZXMgdGhlIHRyYW5zaXRpb24gZnJvbSBiZWluZyBhYnN0cmFjdCAod2hlcmUgaXQgaGFzCisgIC8vLyBjbGllbnRzIG9uIGl0cyBBYnN0cmFjdFR5cGVVc2VycyBsaXN0KSB0byBjb25jcmV0ZSAod2hlcmUgaXQgZG9lcyBub3QpLgorICAvLy8gVGhpcyBtZXRob2Qgbm90aWZpZXMgQVRVJ3Mgd2hlbiB0aGlzIG9jY3VycyBmb3IgYSB0eXBlLgorICAvLy8KKyAgdmlydHVhbCB2b2lkIHR5cGVCZWNhbWVDb25jcmV0ZShjb25zdCBEZXJpdmVkVHlwZSAqQWJzVHkpIHsKKyAgICBMYXlvdXRJbmZvVHk6Oml0ZXJhdG9yIEkgPSBMYXlvdXRJbmZvLmZpbmQoY2FzdDxjb25zdCBTdHJ1Y3RUeXBlPihBYnNUeSkpOworICAgIGFzc2VydChJICE9IExheW91dEluZm8uZW5kKCkgJiYgIlVzaW5nIHR5cGUgYnV0IG5vdCBpbiBtYXA/Iik7CisgICAgUmVtb3ZlRW50cnkoSSwgdHJ1ZSk7CisgIH0KKworcHVibGljOgorICB2aXJ0dWFsIH5TdHJ1Y3RMYXlvdXRNYXAoKSB7CisgICAgLy8gUmVtb3ZlIGFueSBsYXlvdXRzLgorICAgIGZvciAoTGF5b3V0SW5mb1R5OjppdGVyYXRvcgorICAgICAgICAgICBJID0gTGF5b3V0SW5mby5iZWdpbigpLCBFID0gTGF5b3V0SW5mby5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGNvbnN0IFR5cGUgKktleSA9IEktPmZpcnN0OworICAgICAgU3RydWN0TGF5b3V0ICpWYWx1ZSA9IEktPnNlY29uZDsKKworICAgICAgaWYgKEtleS0+aXNBYnN0cmFjdCgpKQorICAgICAgICBLZXktPnJlbW92ZUFic3RyYWN0VHlwZVVzZXIodGhpcyk7CisKKyAgICAgIFZhbHVlLT5+U3RydWN0TGF5b3V0KCk7CisgICAgICBmcmVlKFZhbHVlKTsKKyAgICB9CisgIH0KKworICB2b2lkIEludmFsaWRhdGVFbnRyeShjb25zdCBTdHJ1Y3RUeXBlICpUeSkgeworICAgIExheW91dEluZm9UeTo6aXRlcmF0b3IgSSA9IExheW91dEluZm8uZmluZChUeSk7CisgICAgaWYgKEkgPT0gTGF5b3V0SW5mby5lbmQoKSkgcmV0dXJuOworICAgIFJlbW92ZUVudHJ5KEksIFR5LT5pc0Fic3RyYWN0KCkpOworICB9CisKKyAgU3RydWN0TGF5b3V0IComb3BlcmF0b3JbXShjb25zdCBTdHJ1Y3RUeXBlICpTVHkpIHsKKyAgICByZXR1cm4gTGF5b3V0SW5mb1tTVHldOworICB9CisKKyAgLy8gZm9yIGRlYnVnZ2luZy4uLgorICB2aXJ0dWFsIHZvaWQgZHVtcCgpIGNvbnN0IHt9Cit9OworCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK1RhcmdldERhdGE6On5UYXJnZXREYXRhKCkgeworICBkZWxldGUgc3RhdGljX2Nhc3Q8U3RydWN0TGF5b3V0TWFwKj4oTGF5b3V0TWFwKTsKK30KKworY29uc3QgU3RydWN0TGF5b3V0ICpUYXJnZXREYXRhOjpnZXRTdHJ1Y3RMYXlvdXQoY29uc3QgU3RydWN0VHlwZSAqVHkpIGNvbnN0IHsKKyAgaWYgKCFMYXlvdXRNYXApCisgICAgTGF5b3V0TWFwID0gbmV3IFN0cnVjdExheW91dE1hcCgpOworICAKKyAgU3RydWN0TGF5b3V0TWFwICpTVE0gPSBzdGF0aWNfY2FzdDxTdHJ1Y3RMYXlvdXRNYXAqPihMYXlvdXRNYXApOworICBTdHJ1Y3RMYXlvdXQgKiZTTCA9ICgqU1RNKVtUeV07CisgIGlmIChTTCkgcmV0dXJuIFNMOworCisgIC8vIE90aGVyd2lzZSwgY3JlYXRlIHRoZSBzdHJ1Y3QgbGF5b3V0LiAgQmVjYXVzZSBpdCBpcyB2YXJpYWJsZSBsZW5ndGgsIHdlIAorICAvLyBtYWxsb2MgaXQsIHRoZW4gdXNlIHBsYWNlbWVudCBuZXcuCisgIGludCBOdW1FbHRzID0gVHktPmdldE51bUVsZW1lbnRzKCk7CisgIFN0cnVjdExheW91dCAqTCA9CisgICAgKFN0cnVjdExheW91dCAqKW1hbGxvYyhzaXplb2YoU3RydWN0TGF5b3V0KSsoTnVtRWx0cy0xKSAqIHNpemVvZih1aW50NjRfdCkpOworICAKKyAgLy8gU2V0IFNMIGJlZm9yZSBjYWxsaW5nIFN0cnVjdExheW91dCdzIGN0b3IuICBUaGUgY3RvciBjb3VsZCBjYXVzZSBvdGhlcgorICAvLyBlbnRyaWVzIHRvIGJlIGFkZGVkIHRvIFRoZU1hcCwgaW52YWxpZGF0aW5nIG91ciByZWZlcmVuY2UuCisgIFNMID0gTDsKKyAgCisgIG5ldyAoTCkgU3RydWN0TGF5b3V0KFR5LCAqdGhpcyk7CisKKyAgaWYgKFR5LT5pc0Fic3RyYWN0KCkpCisgICAgVHktPmFkZEFic3RyYWN0VHlwZVVzZXIoU1RNKTsKKworICByZXR1cm4gTDsKK30KKworLy8vIEludmFsaWRhdGVTdHJ1Y3RMYXlvdXRJbmZvIC0gVGFyZ2V0RGF0YSBzcGVjdWxhdGl2ZWx5IGNhY2hlcyBTdHJ1Y3RMYXlvdXQKKy8vLyBvYmplY3RzLiAgSWYgYSBUYXJnZXREYXRhIG9iamVjdCBpcyBhbGl2ZSB3aGVuIHR5cGVzIGFyZSBiZWluZyByZWZpbmVkIGFuZAorLy8vIHJlbW92ZWQsIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHdoZW5ldmVyIGEgU3RydWN0VHlwZSBpcyByZW1vdmVkIHRvCisvLy8gYXZvaWQgYSBkYW5nbGluZyBwb2ludGVyIGluIHRoaXMgY2FjaGUuCit2b2lkIFRhcmdldERhdGE6OkludmFsaWRhdGVTdHJ1Y3RMYXlvdXRJbmZvKGNvbnN0IFN0cnVjdFR5cGUgKlR5KSBjb25zdCB7CisgIGlmICghTGF5b3V0TWFwKSByZXR1cm47ICAvLyBObyBjYWNoZS4KKyAgCisgIHN0YXRpY19jYXN0PFN0cnVjdExheW91dE1hcCo+KExheW91dE1hcCktPkludmFsaWRhdGVFbnRyeShUeSk7Cit9CisKK3N0ZDo6c3RyaW5nIFRhcmdldERhdGE6OmdldFN0cmluZ1JlcHJlc2VudGF0aW9uKCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBSZXN1bHQ7CisgIHJhd19zdHJpbmdfb3N0cmVhbSBPUyhSZXN1bHQpOworICAKKyAgT1MgPDwgKExpdHRsZUVuZGlhbiA/ICJlIiA6ICJFIikKKyAgICAgPDwgIi1wOiIgPDwgUG9pbnRlck1lbVNpemUqOCA8PCAnOicgPDwgUG9pbnRlckFCSUFsaWduKjgKKyAgICAgPDwgJzonIDw8IFBvaW50ZXJQcmVmQWxpZ24qODsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFsaWdubWVudHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IFRhcmdldEFsaWduRWxlbSAmQUkgPSBBbGlnbm1lbnRzW2ldOworICAgIE9TIDw8ICctJyA8PCAoY2hhcilBSS5BbGlnblR5cGUgPDwgQUkuVHlwZUJpdFdpZHRoIDw8ICc6JworICAgICAgIDw8IEFJLkFCSUFsaWduKjggPDwgJzonIDw8IEFJLlByZWZBbGlnbio4OworICB9CisgIAorICBpZiAoIUxlZ2FsSW50V2lkdGhzLmVtcHR5KCkpIHsKKyAgICBPUyA8PCAiLW4iIDw8ICh1bnNpZ25lZClMZWdhbEludFdpZHRoc1swXTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gTGVnYWxJbnRXaWR0aHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIE9TIDw8ICc6JyA8PCAodW5zaWduZWQpTGVnYWxJbnRXaWR0aHNbaV07CisgIH0KKyAgcmV0dXJuIE9TLnN0cigpOworfQorCisKK3VpbnQ2NF90IFRhcmdldERhdGE6OmdldFR5cGVTaXplSW5CaXRzKGNvbnN0IFR5cGUgKlR5KSBjb25zdCB7CisgIGFzc2VydChUeS0+aXNTaXplZCgpICYmICJDYW5ub3QgZ2V0VHlwZUluZm8oKSBvbiBhIHR5cGUgdGhhdCBpcyB1bnNpemVkISIpOworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICBjYXNlIFR5cGU6OkxhYmVsVHlJRDoKKyAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICByZXR1cm4gZ2V0UG9pbnRlclNpemVJbkJpdHMoKTsKKyAgY2FzZSBUeXBlOjpBcnJheVR5SUQ6IHsKKyAgICBjb25zdCBBcnJheVR5cGUgKkFUeSA9IGNhc3Q8QXJyYXlUeXBlPihUeSk7CisgICAgcmV0dXJuIGdldFR5cGVBbGxvY1NpemVJbkJpdHMoQVR5LT5nZXRFbGVtZW50VHlwZSgpKSpBVHktPmdldE51bUVsZW1lbnRzKCk7CisgIH0KKyAgY2FzZSBUeXBlOjpTdHJ1Y3RUeUlEOgorICAgIC8vIEdldCB0aGUgbGF5b3V0IGFubm90YXRpb24uLi4gd2hpY2ggaXMgbGF6aWx5IGNyZWF0ZWQgb24gZGVtYW5kLgorICAgIHJldHVybiBnZXRTdHJ1Y3RMYXlvdXQoY2FzdDxTdHJ1Y3RUeXBlPihUeSkpLT5nZXRTaXplSW5CaXRzKCk7CisgIGNhc2UgVHlwZTo6VW5pb25UeUlEOiB7CisgICAgY29uc3QgVW5pb25UeXBlICpVblR5ID0gY2FzdDxVbmlvblR5cGU+KFR5KTsKKyAgICB1aW50NjRfdCBTaXplID0gMDsKKyAgICBmb3IgKFVuaW9uVHlwZTo6ZWxlbWVudF9pdGVyYXRvciBpID0gVW5UeS0+ZWxlbWVudF9iZWdpbigpLAorICAgICAgICAgICAgIGUgPSBVblR5LT5lbGVtZW50X2VuZCgpOyBpICE9IGU7ICsraSkgeworICAgICAgU2l6ZSA9IHN0ZDo6bWF4KFNpemUsIGdldFR5cGVTaXplSW5CaXRzKCppKSk7CisgICAgfQorICAgIHJldHVybiBTaXplOworICB9CisgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6CisgICAgcmV0dXJuIGNhc3Q8SW50ZWdlclR5cGU+KFR5KS0+Z2V0Qml0V2lkdGgoKTsKKyAgY2FzZSBUeXBlOjpWb2lkVHlJRDoKKyAgICByZXR1cm4gODsKKyAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6CisgICAgcmV0dXJuIDMyOworICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6CisgICAgcmV0dXJuIDY0OworICBjYXNlIFR5cGU6OlBQQ19GUDEyOFR5SUQ6CisgIGNhc2UgVHlwZTo6RlAxMjhUeUlEOgorICAgIHJldHVybiAxMjg7CisgIC8vIEluIG1lbW9yeSBvYmplY3RzIHRoaXMgaXMgYWx3YXlzIGFsaWduZWQgdG8gYSBoaWdoZXIgYm91bmRhcnksIGJ1dAorICAvLyBvbmx5IDgwIGJpdHMgY29udGFpbiBpbmZvcm1hdGlvbi4KKyAgY2FzZSBUeXBlOjpYODZfRlA4MFR5SUQ6CisgICAgcmV0dXJuIDgwOworICBjYXNlIFR5cGU6OlZlY3RvclR5SUQ6CisgICAgcmV0dXJuIGNhc3Q8VmVjdG9yVHlwZT4oVHkpLT5nZXRCaXRXaWR0aCgpOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldERhdGE6OmdldFR5cGVTaXplSW5CaXRzKCk6IFVuc3VwcG9ydGVkIHR5cGUiKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyohCisgIFxwYXJhbSBhYmlfb3JfcHJlZiBGbGFnIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBhbGlnbm1lbnQgaXMgcmV0dXJuZWQuIHRydWUKKyAgcmV0dXJucyB0aGUgQUJJIGFsaWdubWVudCwgZmFsc2UgcmV0dXJucyB0aGUgcHJlZmVycmVkIGFsaWdubWVudC4KKyAgXHBhcmFtIFR5IFRoZSB1bmRlcmx5aW5nIHR5cGUgZm9yIHdoaWNoIGFsaWdubWVudCBpcyBkZXRlcm1pbmVkLgorCisgIEdldCB0aGUgQUJJIChcYSBhYmlfb3JfcHJlZiA9PSB0cnVlKSBvciBwcmVmZXJyZWQgYWxpZ25tZW50IChcYSBhYmlfb3JfcHJlZgorICA9PSBmYWxzZSkgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZSBcYSBUeS4KKyAqLwordW5zaWduZWQgY2hhciBUYXJnZXREYXRhOjpnZXRBbGlnbm1lbnQoY29uc3QgVHlwZSAqVHksIGJvb2wgYWJpX29yX3ByZWYpIGNvbnN0IHsKKyAgaW50IEFsaWduVHlwZSA9IC0xOworCisgIGFzc2VydChUeS0+aXNTaXplZCgpICYmICJDYW5ub3QgZ2V0VHlwZUluZm8oKSBvbiBhIHR5cGUgdGhhdCBpcyB1bnNpemVkISIpOworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICAvLyBFYXJseSBlc2NhcGUgZm9yIHRoZSBub24tbnVtZXJpYyB0eXBlcy4KKyAgY2FzZSBUeXBlOjpMYWJlbFR5SUQ6CisgIGNhc2UgVHlwZTo6UG9pbnRlclR5SUQ6CisgICAgcmV0dXJuIChhYmlfb3JfcHJlZgorICAgICAgICAgICAgPyBnZXRQb2ludGVyQUJJQWxpZ25tZW50KCkKKyAgICAgICAgICAgIDogZ2V0UG9pbnRlclByZWZBbGlnbm1lbnQoKSk7CisgIGNhc2UgVHlwZTo6QXJyYXlUeUlEOgorICAgIHJldHVybiBnZXRBbGlnbm1lbnQoY2FzdDxBcnJheVR5cGU+KFR5KS0+Z2V0RWxlbWVudFR5cGUoKSwgYWJpX29yX3ByZWYpOworCisgIGNhc2UgVHlwZTo6U3RydWN0VHlJRDogeworICAgIC8vIFBhY2tlZCBzdHJ1Y3R1cmUgdHlwZXMgYWx3YXlzIGhhdmUgYW4gQUJJIGFsaWdubWVudCBvZiBvbmUuCisgICAgaWYgKGNhc3Q8U3RydWN0VHlwZT4oVHkpLT5pc1BhY2tlZCgpICYmIGFiaV9vcl9wcmVmKQorICAgICAgcmV0dXJuIDE7CisKKyAgICAvLyBHZXQgdGhlIGxheW91dCBhbm5vdGF0aW9uLi4uIHdoaWNoIGlzIGxhemlseSBjcmVhdGVkIG9uIGRlbWFuZC4KKyAgICBjb25zdCBTdHJ1Y3RMYXlvdXQgKkxheW91dCA9IGdldFN0cnVjdExheW91dChjYXN0PFN0cnVjdFR5cGU+KFR5KSk7CisgICAgdW5zaWduZWQgQWxpZ24gPSBnZXRBbGlnbm1lbnRJbmZvKEFHR1JFR0FURV9BTElHTiwgMCwgYWJpX29yX3ByZWYsIFR5KTsKKyAgICByZXR1cm4gc3RkOjptYXgoQWxpZ24sICh1bnNpZ25lZClMYXlvdXQtPmdldEFsaWdubWVudCgpKTsKKyAgfQorICBjYXNlIFR5cGU6OlVuaW9uVHlJRDogeworICAgIGNvbnN0IFVuaW9uVHlwZSAqVW5UeSA9IGNhc3Q8VW5pb25UeXBlPihUeSk7CisgICAgdW5zaWduZWQgQWxpZ24gPSAxOworCisgICAgLy8gVW5pb25zIG5lZWQgdGhlIG1heGltdW0gYWxpZ25tZW50IG9mIGFsbCB0aGVpciBlbnRyaWVzCisgICAgZm9yIChVbmlvblR5cGU6OmVsZW1lbnRfaXRlcmF0b3IgaSA9IFVuVHktPmVsZW1lbnRfYmVnaW4oKSwgCisgICAgICAgICAgICAgZSA9IFVuVHktPmVsZW1lbnRfZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBBbGlnbiA9IHN0ZDo6bWF4KEFsaWduLCAodW5zaWduZWQpZ2V0QWxpZ25tZW50KCppLCBhYmlfb3JfcHJlZikpOworICAgIH0KKyAgICByZXR1cm4gQWxpZ247CisgIH0KKyAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgY2FzZSBUeXBlOjpWb2lkVHlJRDoKKyAgICBBbGlnblR5cGUgPSBJTlRFR0VSX0FMSUdOOworICAgIGJyZWFrOworICBjYXNlIFR5cGU6OkZsb2F0VHlJRDoKKyAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOgorICAvLyBQUENfRlAxMjhUeUlEIGFuZCBGUDEyOFR5SUQgaGF2ZSBkaWZmZXJlbnQgZGF0YSBjb250ZW50cywgYnV0IHRoZQorICAvLyBzYW1lIHNpemUgYW5kIGFsaWdubWVudCwgc28gdGhleSBsb29rIHRoZSBzYW1lIGhlcmUuCisgIGNhc2UgVHlwZTo6UFBDX0ZQMTI4VHlJRDoKKyAgY2FzZSBUeXBlOjpGUDEyOFR5SUQ6CisgIGNhc2UgVHlwZTo6WDg2X0ZQODBUeUlEOgorICAgIEFsaWduVHlwZSA9IEZMT0FUX0FMSUdOOworICAgIGJyZWFrOworICBjYXNlIFR5cGU6OlZlY3RvclR5SUQ6CisgICAgQWxpZ25UeXBlID0gVkVDVE9SX0FMSUdOOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkJhZCB0eXBlIGZvciBnZXRBbGlnbm1lbnQhISEiKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBnZXRBbGlnbm1lbnRJbmZvKChBbGlnblR5cGVFbnVtKUFsaWduVHlwZSwgZ2V0VHlwZVNpemVJbkJpdHMoVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYmlfb3JfcHJlZiwgVHkpOworfQorCit1bnNpZ25lZCBjaGFyIFRhcmdldERhdGE6OmdldEFCSVR5cGVBbGlnbm1lbnQoY29uc3QgVHlwZSAqVHkpIGNvbnN0IHsKKyAgcmV0dXJuIGdldEFsaWdubWVudChUeSwgdHJ1ZSk7Cit9CisKKy8vLyBnZXRBQklJbnRlZ2VyVHlwZUFsaWdubWVudCAtIFJldHVybiB0aGUgbWluaW11bSBBQkktcmVxdWlyZWQgYWxpZ25tZW50IGZvcgorLy8vIGFuIGludGVnZXIgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGJpdHdpZHRoLgordW5zaWduZWQgY2hhciBUYXJnZXREYXRhOjpnZXRBQklJbnRlZ2VyVHlwZUFsaWdubWVudCh1bnNpZ25lZCBCaXRXaWR0aCkgY29uc3QgeworICByZXR1cm4gZ2V0QWxpZ25tZW50SW5mbyhJTlRFR0VSX0FMSUdOLCBCaXRXaWR0aCwgdHJ1ZSwgMCk7Cit9CisKKwordW5zaWduZWQgY2hhciBUYXJnZXREYXRhOjpnZXRDYWxsRnJhbWVUeXBlQWxpZ25tZW50KGNvbnN0IFR5cGUgKlR5KSBjb25zdCB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBbGlnbm1lbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKEFsaWdubWVudHNbaV0uQWxpZ25UeXBlID09IFNUQUNLX0FMSUdOKQorICAgICAgcmV0dXJuIEFsaWdubWVudHNbaV0uQUJJQWxpZ247CisKKyAgcmV0dXJuIGdldEFCSVR5cGVBbGlnbm1lbnQoVHkpOworfQorCit1bnNpZ25lZCBjaGFyIFRhcmdldERhdGE6OmdldFByZWZUeXBlQWxpZ25tZW50KGNvbnN0IFR5cGUgKlR5KSBjb25zdCB7CisgIHJldHVybiBnZXRBbGlnbm1lbnQoVHksIGZhbHNlKTsKK30KKwordW5zaWduZWQgY2hhciBUYXJnZXREYXRhOjpnZXRQcmVmZXJyZWRUeXBlQWxpZ25tZW50U2hpZnQoY29uc3QgVHlwZSAqVHkpIGNvbnN0IHsKKyAgdW5zaWduZWQgQWxpZ24gPSAodW5zaWduZWQpIGdldFByZWZUeXBlQWxpZ25tZW50KFR5KTsKKyAgYXNzZXJ0KCEoQWxpZ24gJiAoQWxpZ24tMSkpICYmICJBbGlnbm1lbnQgaXMgbm90IGEgcG93ZXIgb2YgdHdvISIpOworICByZXR1cm4gTG9nMl8zMihBbGlnbik7Cit9CisKKy8vLyBnZXRJbnRQdHJUeXBlIC0gUmV0dXJuIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSB0aGF0IGlzIHRoZSBzYW1lIHNpemUgb3IKKy8vLyBncmVhdGVyIHRvIHRoZSBob3N0IHBvaW50ZXIgc2l6ZS4KK2NvbnN0IEludGVnZXJUeXBlICpUYXJnZXREYXRhOjpnZXRJbnRQdHJUeXBlKExMVk1Db250ZXh0ICZDKSBjb25zdCB7CisgIHJldHVybiBJbnRlZ2VyVHlwZTo6Z2V0KEMsIGdldFBvaW50ZXJTaXplSW5CaXRzKCkpOworfQorCisKK3VpbnQ2NF90IFRhcmdldERhdGE6OmdldEluZGV4ZWRPZmZzZXQoY29uc3QgVHlwZSAqcHRyVHksIFZhbHVlKiBjb25zdCogSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSW5kaWNlcykgY29uc3QgeworICBjb25zdCBUeXBlICpUeSA9IHB0clR5OworICBhc3NlcnQoVHktPmlzUG9pbnRlclR5KCkgJiYgIklsbGVnYWwgYXJndW1lbnQgZm9yIGdldEluZGV4ZWRPZmZzZXQoKSIpOworICB1aW50NjRfdCBSZXN1bHQgPSAwOworCisgIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3I8VmFsdWUqIGNvbnN0Kj4KKyAgICBUSSA9IGdlcF90eXBlX2JlZ2luKHB0clR5LCBJbmRpY2VzLCBJbmRpY2VzK051bUluZGljZXMpOworICBmb3IgKHVuc2lnbmVkIEN1cklEWCA9IDA7IEN1cklEWCAhPSBOdW1JbmRpY2VzOyArK0N1cklEWCwgKytUSSkgeworICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPigqVEkpKSB7CisgICAgICBhc3NlcnQoSW5kaWNlc1tDdXJJRFhdLT5nZXRUeXBlKCkgPT0KKyAgICAgICAgICAgICBUeXBlOjpnZXRJbnQzMlR5KHB0clR5LT5nZXRDb250ZXh0KCkpICYmCisgICAgICAgICAgICAgIklsbGVnYWwgc3RydWN0IGlkeCIpOworICAgICAgdW5zaWduZWQgRmllbGRObyA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEluZGljZXNbQ3VySURYXSktPmdldFpFeHRWYWx1ZSgpOworCisgICAgICAvLyBHZXQgc3RydWN0dXJlIGxheW91dCBpbmZvcm1hdGlvbi4uLgorICAgICAgY29uc3QgU3RydWN0TGF5b3V0ICpMYXlvdXQgPSBnZXRTdHJ1Y3RMYXlvdXQoU1R5KTsKKworICAgICAgLy8gQWRkIGluIHRoZSBvZmZzZXQsIGFzIGNhbGN1bGF0ZWQgYnkgdGhlIHN0cnVjdHVyZSBsYXlvdXQgaW5mby4uLgorICAgICAgUmVzdWx0ICs9IExheW91dC0+Z2V0RWxlbWVudE9mZnNldChGaWVsZE5vKTsKKworICAgICAgLy8gVXBkYXRlIFR5IHRvIHJlZmVyIHRvIGN1cnJlbnQgZWxlbWVudAorICAgICAgVHkgPSBTVHktPmdldEVsZW1lbnRUeXBlKEZpZWxkTm8pOworICAgIH0gZWxzZSBpZiAoY29uc3QgVW5pb25UeXBlICpVblR5ID0gZHluX2Nhc3Q8VW5pb25UeXBlPigqVEkpKSB7CisgICAgICAgIHVuc2lnbmVkIEZpZWxkTm8gPSBjYXN0PENvbnN0YW50SW50PihJbmRpY2VzW0N1cklEWF0pLT5nZXRaRXh0VmFsdWUoKTsKKworICAgICAgICAvLyBPZmZzZXQgaW50byB1bmlvbiBpcyBjYW5vbmljYWxseSAwLCBidXQgdHlwZSBjaGFuZ2VzCisgICAgICAgIFR5ID0gVW5UeS0+Z2V0RWxlbWVudFR5cGUoRmllbGRObyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFVwZGF0ZSBUeSB0byByZWZlciB0byBjdXJyZW50IGVsZW1lbnQKKyAgICAgIFR5ID0gY2FzdDxTZXF1ZW50aWFsVHlwZT4oVHkpLT5nZXRFbGVtZW50VHlwZSgpOworCisgICAgICAvLyBHZXQgdGhlIGFycmF5IGluZGV4IGFuZCB0aGUgc2l6ZSBvZiBlYWNoIGFycmF5IGVsZW1lbnQuCisgICAgICBpZiAoaW50NjRfdCBhcnJheUlkeCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEluZGljZXNbQ3VySURYXSktPmdldFNFeHRWYWx1ZSgpKQorICAgICAgICBSZXN1bHQgKz0gKHVpbnQ2NF90KWFycmF5SWR4ICogZ2V0VHlwZUFsbG9jU2l6ZShUeSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8vIGdldFByZWZlcnJlZEFsaWdubWVudCAtIFJldHVybiB0aGUgcHJlZmVycmVkIGFsaWdubWVudCBvZiB0aGUgc3BlY2lmaWVkCisvLy8gZ2xvYmFsLiAgVGhpcyBpbmNsdWRlcyBhbiBleHBsaWNpdGx5IHJlcXVlc3RlZCBhbGlnbm1lbnQgKGlmIHRoZSBnbG9iYWwKKy8vLyBoYXMgb25lKS4KK3Vuc2lnbmVkIFRhcmdldERhdGE6OmdldFByZWZlcnJlZEFsaWdubWVudChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIGNvbnN0IHsKKyAgY29uc3QgVHlwZSAqRWxlbVR5cGUgPSBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpOworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBnZXRQcmVmVHlwZUFsaWdubWVudChFbGVtVHlwZSk7CisgIGlmIChHVi0+Z2V0QWxpZ25tZW50KCkgPiBBbGlnbm1lbnQpCisgICAgQWxpZ25tZW50ID0gR1YtPmdldEFsaWdubWVudCgpOworCisgIGlmIChHVi0+aGFzSW5pdGlhbGl6ZXIoKSkgeworICAgIGlmIChBbGlnbm1lbnQgPCAxNikgeworICAgICAgLy8gSWYgdGhlIGdsb2JhbCBpcyBub3QgZXh0ZXJuYWwsIHNlZSBpZiBpdCBpcyBsYXJnZS4gIElmIHNvLCBnaXZlIGl0IGEKKyAgICAgIC8vIGxhcmdlciBhbGlnbm1lbnQuCisgICAgICBpZiAoZ2V0VHlwZVNpemVJbkJpdHMoRWxlbVR5cGUpID4gMTI4KQorICAgICAgICBBbGlnbm1lbnQgPSAxNjsgICAgLy8gMTYtYnl0ZSBhbGlnbm1lbnQuCisgICAgfQorICB9CisgIHJldHVybiBBbGlnbm1lbnQ7Cit9CisKKy8vLyBnZXRQcmVmZXJyZWRBbGlnbm1lbnRMb2cgLSBSZXR1cm4gdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQgb2YgdGhlCisvLy8gc3BlY2lmaWVkIGdsb2JhbCwgcmV0dXJuZWQgaW4gbG9nIGZvcm0uICBUaGlzIGluY2x1ZGVzIGFuIGV4cGxpY2l0bHkKKy8vLyByZXF1ZXN0ZWQgYWxpZ25tZW50IChpZiB0aGUgZ2xvYmFsIGhhcyBvbmUpLgordW5zaWduZWQgVGFyZ2V0RGF0YTo6Z2V0UHJlZmVycmVkQWxpZ25tZW50TG9nKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgY29uc3QgeworICByZXR1cm4gTG9nMl8zMihnZXRQcmVmZXJyZWRBbGlnbm1lbnQoR1YpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzNkNjBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uY3BwCkBAIC0wLDAgKzEsMTkgQEAKKy8vPT09LS0gVGFyZ2V0RnJhbWVJbmZvLmNwcCAtIEltcGxlbWVudCBtYWNoaW5lIGZyYW1lIGludGVyZmFjZSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW1wbGVtZW50cyB0aGUgbGF5b3V0IG9mIGEgc3RhY2sgZnJhbWUgb24gdGhlIHRhcmdldCBtYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlIDxjc3RkbGliPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1RhcmdldEZyYW1lSW5mbzo6flRhcmdldEZyYW1lSW5mbygpIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDk5YTdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8vPT09LS0gVGFyZ2V0SW5zdHJJbmZvLmNwcCAtIFRhcmdldCBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgVGFyZ2V0T3BlcmFuZEluZm8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBnZXRSZWdDbGFzcyAtIEdldCB0aGUgcmVnaXN0ZXIgY2xhc3MgZm9yIHRoZSBvcGVyYW5kLCBoYW5kbGluZyByZXNvbHV0aW9uCisvLy8gb2YgInN5bWJvbGljIiBwb2ludGVyIHJlZ2lzdGVyIGNsYXNzZXMgZXRjLiAgSWYgdGhpcyBpcyBub3QgYSByZWdpc3RlcgorLy8vIG9wZXJhbmQsIHRoaXMgcmV0dXJucyBudWxsLgorY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCitUYXJnZXRPcGVyYW5kSW5mbzo6Z2V0UmVnQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgaWYgKGlzTG9va3VwUHRyUmVnQ2xhc3MoKSkKKyAgICByZXR1cm4gVFJJLT5nZXRQb2ludGVyUmVnQ2xhc3MoUmVnQ2xhc3MpOworICAvLyBJbnN0cnVjdGlvbnMgbGlrZSBJTlNFUlRfU1VCUkVHIGRvIG5vdCBoYXZlIGZpeGVkIHJlZ2lzdGVyIGNsYXNzZXMuCisgIGlmIChSZWdDbGFzcyA8IDApCisgICAgcmV0dXJuIDA7CisgIC8vIE90aGVyd2lzZSBqdXN0IGxvb2sgaXQgdXAgbm9ybWFsbHkuCisgIHJldHVybiBUUkktPmdldFJlZ0NsYXNzKFJlZ0NsYXNzKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBUYXJnZXRJbnN0ckluZm8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RhcmdldEluc3RySW5mbzo6VGFyZ2V0SW5zdHJJbmZvKGNvbnN0IFRhcmdldEluc3RyRGVzYyogRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bU9wY29kZXMpCisgIDogRGVzY3JpcHRvcnMoRGVzYyksIE51bU9wY29kZXMobnVtT3Bjb2RlcykgeworfQorCitUYXJnZXRJbnN0ckluZm86On5UYXJnZXRJbnN0ckluZm8oKSB7Cit9CisKKy8vLyBpbnNlcnROb29wIC0gSW5zZXJ0IGEgbm9vcCBpbnRvIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZAorLy8vIHBvaW50Lgordm9pZCBUYXJnZXRJbnN0ckluZm86Omluc2VydE5vb3AoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgaW5zZXJ0Tm9vcCEiKTsKK30KKworCitib29sIFRhcmdldEluc3RySW5mbzo6aXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0IHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS0+Z2V0RGVzYygpOworICBpZiAoIVRJRC5pc1Rlcm1pbmF0b3IoKSkgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gQ29uZGl0aW9uYWwgYnJhbmNoIGlzIGEgc3BlY2lhbCBjYXNlLgorICBpZiAoVElELmlzQnJhbmNoKCkgJiYgIVRJRC5pc0JhcnJpZXIoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFUSUQuaXNQcmVkaWNhYmxlKCkpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiAhaXNQcmVkaWNhdGVkKE1JKTsKK30KKworCisvLy8gTWVhc3VyZSB0aGUgc3BlY2lmaWVkIGlubGluZSBhc20gdG8gZGV0ZXJtaW5lIGFuIGFwcHJveGltYXRpb24gb2YgaXRzCisvLy8gbGVuZ3RoLgorLy8vIENvbW1lbnRzICh3aGljaCBydW4gdGlsbCB0aGUgbmV4dCBTZXBhcmF0b3JDaGFyIG9yIG5ld2xpbmUpIGRvIG5vdAorLy8vIGNvdW50IGFzIGFuIGluc3RydWN0aW9uLgorLy8vIEFueSBvdGhlciBub24td2hpdGVzcGFjZSB0ZXh0IGlzIGNvbnNpZGVyZWQgYW4gaW5zdHJ1Y3Rpb24sIHdpdGgKKy8vLyBtdWx0aXBsZSBpbnN0cnVjdGlvbnMgc2VwYXJhdGVkIGJ5IFNlcGFyYXRvckNoYXIgb3IgbmV3bGluZXMuCisvLy8gVmFyaWFibGUtbGVuZ3RoIGluc3RydWN0aW9ucyBhcmUgbm90IGhhbmRsZWQgaGVyZTsgdGhpcyBmdW5jdGlvbgorLy8vIG1heSBiZSBvdmVybG9hZGVkIGluIHRoZSB0YXJnZXQgY29kZSB0byBkbyB0aGF0LgordW5zaWduZWQgVGFyZ2V0SW5zdHJJbmZvOjpnZXRJbmxpbmVBc21MZW5ndGgoY29uc3QgY2hhciAqU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICZNQUkpIGNvbnN0IHsKKyAgCisgIAorICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgYXNtLgorICBib29sIGF0SW5zblN0YXJ0ID0gdHJ1ZTsKKyAgdW5zaWduZWQgTGVuZ3RoID0gMDsKKyAgZm9yICg7ICpTdHI7ICsrU3RyKSB7CisgICAgaWYgKCpTdHIgPT0gJ1xuJyB8fCAqU3RyID09IE1BSS5nZXRTZXBhcmF0b3JDaGFyKCkpCisgICAgICBhdEluc25TdGFydCA9IHRydWU7CisgICAgaWYgKGF0SW5zblN0YXJ0ICYmICFpc3NwYWNlKCpTdHIpKSB7CisgICAgICBMZW5ndGggKz0gTUFJLmdldE1heEluc3RMZW5ndGgoKTsKKyAgICAgIGF0SW5zblN0YXJ0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChhdEluc25TdGFydCAmJiBzdHJuY21wKFN0ciwgTUFJLmdldENvbW1lbnRTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oTUFJLmdldENvbW1lbnRTdHJpbmcoKSkpID09IDApCisgICAgICBhdEluc25TdGFydCA9IGZhbHNlOworICB9CisgIAorICByZXR1cm4gTGVuZ3RoOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXRJbnRyaW5zaWNJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0SW50cmluc2ljSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0OWExZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0SW50cmluc2ljSW5mby5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy89PT0tLSBUYXJnZXRJbnRyaW5zaWNJbmZvLmNwcCAtIFRhcmdldCBJbnN0cnVjdGlvbiBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgVGFyZ2V0SW50cmluc2ljSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW50cmluc2ljSW5mby5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitUYXJnZXRJbnRyaW5zaWNJbmZvOjpUYXJnZXRJbnRyaW5zaWNJbmZvKCkgeworfQorCitUYXJnZXRJbnRyaW5zaWNJbmZvOjp+VGFyZ2V0SW50cmluc2ljSW5mbygpIHsKK30KKwordW5zaWduZWQgVGFyZ2V0SW50cmluc2ljSW5mbzo6Z2V0SW50cmluc2ljSUQoRnVuY3Rpb24gKkYpIGNvbnN0IHsKKyAgY29uc3QgVmFsdWVOYW1lICpWYWxOYW1lID0gRi0+Z2V0VmFsdWVOYW1lKCk7CisgIGlmICghVmFsTmFtZSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIGxvb2t1cE5hbWUoVmFsTmFtZS0+Z2V0S2V5RGF0YSgpLCBWYWxOYW1lLT5nZXRLZXlMZW5ndGgoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1RhcmdldE1hY2hpbmUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXRNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDViMWMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXRNYWNoaW5lLmNwcApAQCAtMCwwICsxLDMwNCBAQAorLy89PT0tLSBUYXJnZXRNYWNoaW5lLmNwcCAtIEdlbmVyYWwgVGFyZ2V0IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBnZW5lcmFsIHBhcnRzIG9mIGEgVGFyZ2V0IG1hY2hpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbWFuZC1saW5lIG9wdGlvbnMgdGhhdCB0ZW5kIHRvIGJlIHVzZWZ1bCBvbiBtb3JlIHRoYW4gb25lIGJhY2stZW5kLgorLy8KKworbmFtZXNwYWNlIGxsdm0geworICBib29sIExlc3NQcmVjaXNlRlBNQURPcHRpb247CisgIGJvb2wgUHJpbnRNYWNoaW5lQ29kZTsKKyAgYm9vbCBOb0ZyYW1lUG9pbnRlckVsaW07CisgIGJvb2wgTm9GcmFtZVBvaW50ZXJFbGltTm9uTGVhZjsKKyAgYm9vbCBOb0V4Y2Vzc0ZQUHJlY2lzaW9uOworICBib29sIFVuc2FmZUZQTWF0aDsKKyAgYm9vbCBOb0luZnNGUE1hdGg7CisgIGJvb2wgTm9OYU5zRlBNYXRoOworICBib29sIEhvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nRlBNYXRoT3B0aW9uOworICBib29sIFVzZVNvZnRGbG9hdDsKKyAgRmxvYXRBQkk6OkFCSVR5cGUgRmxvYXRBQklUeXBlOworICBib29sIE5vSW1wbGljaXRGbG9hdDsKKyAgYm9vbCBOb1plcm9zSW5CU1M7CisgIGJvb2wgSklURXhjZXB0aW9uSGFuZGxpbmc7CisgIGJvb2wgSklURW1pdERlYnVnSW5mbzsKKyAgYm9vbCBKSVRFbWl0RGVidWdJbmZvVG9EaXNrOworICBib29sIFVud2luZFRhYmxlc01hbmRhdG9yeTsKKyAgUmVsb2M6Ok1vZGVsIFJlbG9jYXRpb25Nb2RlbDsKKyAgQ29kZU1vZGVsOjpNb2RlbCBDTU1vZGVsOworICBib29sIEd1YXJhbnRlZWRUYWlsQ2FsbE9wdDsKKyAgdW5zaWduZWQgU3RhY2tBbGlnbm1lbnQ7CisgIGJvb2wgUmVhbGlnblN0YWNrOworICBib29sIERpc2FibGVKdW1wVGFibGVzOworICBib29sIFN0cm9uZ1BISUVsaW07CisgIGJvb2wgQXNtVmVyYm9zaXR5RGVmYXVsdChmYWxzZSk7Cit9CisKK3N0YXRpYyBjbDo6b3B0PGJvb2wsIHRydWU+CitQcmludENvZGUoInByaW50LW1hY2hpbmVpbnN0cnMiLAorICBjbDo6ZGVzYygiUHJpbnQgZ2VuZXJhdGVkIG1hY2hpbmUgY29kZSIpLAorICBjbDo6bG9jYXRpb24oUHJpbnRNYWNoaW5lQ29kZSksIGNsOjppbml0KGZhbHNlKSk7CitzdGF0aWMgY2w6Om9wdDxib29sLCB0cnVlPgorRGlzYWJsZUZQRWxpbSgiZGlzYWJsZS1mcC1lbGltIiwKKyAgY2w6OmRlc2MoIkRpc2FibGUgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbiBvcHRpbWl6YXRpb24iKSwKKyAgY2w6OmxvY2F0aW9uKE5vRnJhbWVQb2ludGVyRWxpbSksCisgIGNsOjppbml0KGZhbHNlKSk7CitzdGF0aWMgY2w6Om9wdDxib29sLCB0cnVlPgorRGlzYWJsZUZQRWxpbU5vbkxlYWYoImRpc2FibGUtbm9uLWxlYWYtZnAtZWxpbSIsCisgIGNsOjpkZXNjKCJEaXNhYmxlIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24gb3B0aW1pemF0aW9uIGZvciBub24tbGVhZiBmdW5jcyIpLAorICBjbDo6bG9jYXRpb24oTm9GcmFtZVBvaW50ZXJFbGltTm9uTGVhZiksCisgIGNsOjppbml0KGZhbHNlKSk7CitzdGF0aWMgY2w6Om9wdDxib29sLCB0cnVlPgorRGlzYWJsZUV4Y2Vzc1ByZWNpc2lvbigiZGlzYWJsZS1leGNlc3MtZnAtcHJlY2lzaW9uIiwKKyAgY2w6OmRlc2MoIkRpc2FibGUgb3B0aW1pemF0aW9ucyB0aGF0IG1heSBpbmNyZWFzZSBGUCBwcmVjaXNpb24iKSwKKyAgY2w6OmxvY2F0aW9uKE5vRXhjZXNzRlBQcmVjaXNpb24pLAorICBjbDo6aW5pdChmYWxzZSkpOworc3RhdGljIGNsOjpvcHQ8Ym9vbCwgdHJ1ZT4KK0VuYWJsZUZQTUFEKCJlbmFibGUtZnAtbWFkIiwKKyAgY2w6OmRlc2MoIkVuYWJsZSBsZXNzIHByZWNpc2UgTUFEIGluc3RydWN0aW9ucyB0byBiZSBnZW5lcmF0ZWQiKSwKKyAgY2w6OmxvY2F0aW9uKExlc3NQcmVjaXNlRlBNQURPcHRpb24pLAorICBjbDo6aW5pdChmYWxzZSkpOworc3RhdGljIGNsOjpvcHQ8Ym9vbCwgdHJ1ZT4KK0VuYWJsZVVuc2FmZUZQTWF0aCgiZW5hYmxlLXVuc2FmZS1mcC1tYXRoIiwKKyAgY2w6OmRlc2MoIkVuYWJsZSBvcHRpbWl6YXRpb25zIHRoYXQgbWF5IGRlY3JlYXNlIEZQIHByZWNpc2lvbiIpLAorICBjbDo6bG9jYXRpb24oVW5zYWZlRlBNYXRoKSwKKyAgY2w6OmluaXQoZmFsc2UpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2wsIHRydWU+CitFbmFibGVOb0luZnNGUE1hdGgoImVuYWJsZS1uby1pbmZzLWZwLW1hdGgiLAorICBjbDo6ZGVzYygiRW5hYmxlIEZQIG1hdGggb3B0aW1pemF0aW9ucyB0aGF0IGFzc3VtZSBubyArLUluZnMiKSwKKyAgY2w6OmxvY2F0aW9uKE5vSW5mc0ZQTWF0aCksCisgIGNsOjppbml0KGZhbHNlKSk7CitzdGF0aWMgY2w6Om9wdDxib29sLCB0cnVlPgorRW5hYmxlTm9OYU5zRlBNYXRoKCJlbmFibGUtbm8tbmFucy1mcC1tYXRoIiwKKyAgY2w6OmRlc2MoIkVuYWJsZSBGUCBtYXRoIG9wdGltaXphdGlvbnMgdGhhdCBhc3N1bWUgbm8gTmFOcyIpLAorICBjbDo6bG9jYXRpb24oTm9OYU5zRlBNYXRoKSwKKyAgY2w6OmluaXQoZmFsc2UpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2wsIHRydWU+CitFbmFibGVIb25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aCgiZW5hYmxlLXNpZ24tZGVwZW5kZW50LXJvdW5kaW5nLWZwLW1hdGgiLAorICBjbDo6SGlkZGVuLAorICBjbDo6ZGVzYygiRm9yY2UgY29kZWdlbiB0byBhc3N1bWUgcm91bmRpbmcgbW9kZSBjYW4gY2hhbmdlIGR5bmFtaWNhbGx5IiksCisgIGNsOjpsb2NhdGlvbihIb25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aE9wdGlvbiksCisgIGNsOjppbml0KGZhbHNlKSk7CitzdGF0aWMgY2w6Om9wdDxib29sLCB0cnVlPgorR2VuZXJhdGVTb2Z0RmxvYXRDYWxscygic29mdC1mbG9hdCIsCisgIGNsOjpkZXNjKCJHZW5lcmF0ZSBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBsaWJyYXJ5IGNhbGxzIiksCisgIGNsOjpsb2NhdGlvbihVc2VTb2Z0RmxvYXQpLAorICBjbDo6aW5pdChmYWxzZSkpOworc3RhdGljIGNsOjpvcHQ8bGx2bTo6RmxvYXRBQkk6OkFCSVR5cGUsIHRydWU+CitGbG9hdEFCSUZvckNhbGxzKCJmbG9hdC1hYmkiLAorICBjbDo6ZGVzYygiQ2hvb3NlIGZsb2F0IEFCSSB0eXBlIiksCisgIGNsOjpsb2NhdGlvbihGbG9hdEFCSVR5cGUpLAorICBjbDo6aW5pdChGbG9hdEFCSTo6RGVmYXVsdCksCisgIGNsOjp2YWx1ZXMoCisgICAgY2xFbnVtVmFsTihGbG9hdEFCSTo6RGVmYXVsdCwgImRlZmF1bHQiLAorICAgICAgICAgICAgICAgIlRhcmdldCBkZWZhdWx0IGZsb2F0IEFCSSB0eXBlIiksCisgICAgY2xFbnVtVmFsTihGbG9hdEFCSTo6U29mdCwgInNvZnQiLAorICAgICAgICAgICAgICAgIlNvZnQgZmxvYXQgQUJJIChpbXBsaWVkIGJ5IC1zb2Z0LWZsb2F0KSIpLAorICAgIGNsRW51bVZhbE4oRmxvYXRBQkk6OkhhcmQsICJoYXJkIiwKKyAgICAgICAgICAgICAgICJIYXJkIGZsb2F0IEFCSSAodXNlcyBGUCByZWdpc3RlcnMpIiksCisgICAgY2xFbnVtVmFsRW5kKSk7CitzdGF0aWMgY2w6Om9wdDxib29sLCB0cnVlPgorRG9udFBsYWNlWmVyb3NJbkJTUygibm96ZXJvLWluaXRpYWxpemVkLWluLWJzcyIsCisgIGNsOjpkZXNjKCJEb24ndCBwbGFjZSB6ZXJvLWluaXRpYWxpemVkIHN5bWJvbHMgaW50byBic3Mgc2VjdGlvbiIpLAorICBjbDo6bG9jYXRpb24oTm9aZXJvc0luQlNTKSwKKyAgY2w6OmluaXQoZmFsc2UpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2wsIHRydWU+CitFbmFibGVKSVRFeGNlcHRpb25IYW5kbGluZygiaml0LWVuYWJsZS1laCIsCisgIGNsOjpkZXNjKCJFbWl0IGV4Y2VwdGlvbiBoYW5kbGluZyBpbmZvcm1hdGlvbiIpLAorICBjbDo6bG9jYXRpb24oSklURXhjZXB0aW9uSGFuZGxpbmcpLAorICBjbDo6aW5pdChmYWxzZSkpOworLy8gSW4gZGVidWcgYnVpbGRzLCBtYWtlIHRoaXMgZGVmYXVsdCB0byB0cnVlLgorI2lmZGVmIE5ERUJVRworI2RlZmluZSBFTUlUX0RFQlVHIGZhbHNlCisjZWxzZQorI2RlZmluZSBFTUlUX0RFQlVHIHRydWUKKyNlbmRpZgorc3RhdGljIGNsOjpvcHQ8Ym9vbCwgdHJ1ZT4KK0VtaXRKaXREZWJ1Z0luZm8oImppdC1lbWl0LWRlYnVnIiwKKyAgY2w6OmRlc2MoIkVtaXQgZGVidWcgaW5mb3JtYXRpb24gdG8gZGVidWdnZXIiKSwKKyAgY2w6OmxvY2F0aW9uKEpJVEVtaXREZWJ1Z0luZm8pLAorICBjbDo6aW5pdChFTUlUX0RFQlVHKSk7CisjdW5kZWYgRU1JVF9ERUJVRworc3RhdGljIGNsOjpvcHQ8Ym9vbCwgdHJ1ZT4KK0VtaXRKaXREZWJ1Z0luZm9Ub0Rpc2soImppdC1lbWl0LWRlYnVnLXRvLWRpc2siLAorICBjbDo6SGlkZGVuLAorICBjbDo6ZGVzYygiRW1pdCBkZWJ1ZyBpbmZvIG9iamZpbGVzIHRvIGRpc2siKSwKKyAgY2w6OmxvY2F0aW9uKEpJVEVtaXREZWJ1Z0luZm9Ub0Rpc2spLAorICBjbDo6aW5pdChmYWxzZSkpOworc3RhdGljIGNsOjpvcHQ8Ym9vbCwgdHJ1ZT4KK0VuYWJsZVVud2luZFRhYmxlcygidW53aW5kLXRhYmxlcyIsCisgIGNsOjpkZXNjKCJHZW5lcmF0ZSB1bndpbmRpbmcgdGFibGVzIGZvciBhbGwgZnVuY3Rpb25zIiksCisgIGNsOjpsb2NhdGlvbihVbndpbmRUYWJsZXNNYW5kYXRvcnkpLAorICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxsbHZtOjpSZWxvYzo6TW9kZWwsIHRydWU+CitEZWZSZWxvY2F0aW9uTW9kZWwoInJlbG9jYXRpb24tbW9kZWwiLAorICBjbDo6ZGVzYygiQ2hvb3NlIHJlbG9jYXRpb24gbW9kZWwiKSwKKyAgY2w6OmxvY2F0aW9uKFJlbG9jYXRpb25Nb2RlbCksCisgIGNsOjppbml0KFJlbG9jOjpEZWZhdWx0KSwKKyAgY2w6OnZhbHVlcygKKyAgICBjbEVudW1WYWxOKFJlbG9jOjpEZWZhdWx0LCAiZGVmYXVsdCIsCisgICAgICAgICAgICAgICAiVGFyZ2V0IGRlZmF1bHQgcmVsb2NhdGlvbiBtb2RlbCIpLAorICAgIGNsRW51bVZhbE4oUmVsb2M6OlN0YXRpYywgInN0YXRpYyIsCisgICAgICAgICAgICAgICAiTm9uLXJlbG9jYXRhYmxlIGNvZGUiKSwKKyAgICBjbEVudW1WYWxOKFJlbG9jOjpQSUNfLCAicGljIiwKKyAgICAgICAgICAgICAgICJGdWxseSByZWxvY2F0YWJsZSwgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSIpLAorICAgIGNsRW51bVZhbE4oUmVsb2M6OkR5bmFtaWNOb1BJQywgImR5bmFtaWMtbm8tcGljIiwKKyAgICAgICAgICAgICAgICJSZWxvY2F0YWJsZSBleHRlcm5hbCByZWZlcmVuY2VzLCBub24tcmVsb2NhdGFibGUgY29kZSIpLAorICAgIGNsRW51bVZhbEVuZCkpOworc3RhdGljIGNsOjpvcHQ8bGx2bTo6Q29kZU1vZGVsOjpNb2RlbCwgdHJ1ZT4KK0RlZkNvZGVNb2RlbCgiY29kZS1tb2RlbCIsCisgIGNsOjpkZXNjKCJDaG9vc2UgY29kZSBtb2RlbCIpLAorICBjbDo6bG9jYXRpb24oQ01Nb2RlbCksCisgIGNsOjppbml0KENvZGVNb2RlbDo6RGVmYXVsdCksCisgIGNsOjp2YWx1ZXMoCisgICAgY2xFbnVtVmFsTihDb2RlTW9kZWw6OkRlZmF1bHQsICJkZWZhdWx0IiwKKyAgICAgICAgICAgICAgICJUYXJnZXQgZGVmYXVsdCBjb2RlIG1vZGVsIiksCisgICAgY2xFbnVtVmFsTihDb2RlTW9kZWw6OlNtYWxsLCAic21hbGwiLAorICAgICAgICAgICAgICAgIlNtYWxsIGNvZGUgbW9kZWwiKSwKKyAgICBjbEVudW1WYWxOKENvZGVNb2RlbDo6S2VybmVsLCAia2VybmVsIiwKKyAgICAgICAgICAgICAgICJLZXJuZWwgY29kZSBtb2RlbCIpLAorICAgIGNsRW51bVZhbE4oQ29kZU1vZGVsOjpNZWRpdW0sICJtZWRpdW0iLAorICAgICAgICAgICAgICAgIk1lZGl1bSBjb2RlIG1vZGVsIiksCisgICAgY2xFbnVtVmFsTihDb2RlTW9kZWw6OkxhcmdlLCAibGFyZ2UiLAorICAgICAgICAgICAgICAgIkxhcmdlIGNvZGUgbW9kZWwiKSwKKyAgICBjbEVudW1WYWxFbmQpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2wsIHRydWU+CitFbmFibGVHdWFyYW50ZWVkVGFpbENhbGxPcHQoInRhaWxjYWxsb3B0IiwKKyAgY2w6OmRlc2MoIlR1cm4gZmFzdGNjIGNhbGxzIGludG8gdGFpbCBjYWxscyBieSAocG90ZW50aWFsbHkpIGNoYW5naW5nIEFCSS4iKSwKKyAgY2w6OmxvY2F0aW9uKEd1YXJhbnRlZWRUYWlsQ2FsbE9wdCksCisgIGNsOjppbml0KGZhbHNlKSk7CitzdGF0aWMgY2w6Om9wdDx1bnNpZ25lZCwgdHJ1ZT4KK092ZXJyaWRlU3RhY2tBbGlnbm1lbnQoInN0YWNrLWFsaWdubWVudCIsCisgIGNsOjpkZXNjKCJPdmVycmlkZSBkZWZhdWx0IHN0YWNrIGFsaWdubWVudCIpLAorICBjbDo6bG9jYXRpb24oU3RhY2tBbGlnbm1lbnQpLAorICBjbDo6aW5pdCgwKSk7CitzdGF0aWMgY2w6Om9wdDxib29sLCB0cnVlPgorRW5hYmxlUmVhbGlnblN0YWNrKCJyZWFsaWduLXN0YWNrIiwKKyAgY2w6OmRlc2MoIlJlYWxpZ24gc3RhY2sgaWYgbmVlZGVkIiksCisgIGNsOjpsb2NhdGlvbihSZWFsaWduU3RhY2spLAorICBjbDo6aW5pdCh0cnVlKSk7CitzdGF0aWMgY2w6Om9wdDxib29sLCB0cnVlPgorRGlzYWJsZVN3aXRjaFRhYmxlcyhjbDo6SGlkZGVuLCAiZGlzYWJsZS1qdW1wLXRhYmxlcyIsIAorICBjbDo6ZGVzYygiRG8gbm90IGdlbmVyYXRlIGp1bXAgdGFibGVzLiIpLAorICBjbDo6bG9jYXRpb24oRGlzYWJsZUp1bXBUYWJsZXMpLAorICBjbDo6aW5pdChmYWxzZSkpOworc3RhdGljIGNsOjpvcHQ8Ym9vbCwgdHJ1ZT4KK0VuYWJsZVN0cm9uZ1BISUVsaW0oY2w6OkhpZGRlbiwgInN0cm9uZy1waGktZWxpbSIsCisgIGNsOjpkZXNjKCJVc2Ugc3Ryb25nIFBISSBlbGltaW5hdGlvbi4iKSwKKyAgY2w6OmxvY2F0aW9uKFN0cm9uZ1BISUVsaW0pLAorICBjbDo6aW5pdChmYWxzZSkpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0RhdGFTZWN0aW9ucygiZmRhdGEtc2VjdGlvbnMiLAorICBjbDo6ZGVzYygiRW1pdCBkYXRhIGludG8gc2VwYXJhdGUgc2VjdGlvbnMiKSwKKyAgY2w6OmluaXQoZmFsc2UpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitGdW5jdGlvblNlY3Rpb25zKCJmZnVuY3Rpb24tc2VjdGlvbnMiLAorICBjbDo6ZGVzYygiRW1pdCBmdW5jdGlvbnMgaW50byBzZXBhcmF0ZSBzZWN0aW9ucyIpLAorICBjbDo6aW5pdChmYWxzZSkpOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRhcmdldE1hY2hpbmUgQ2xhc3MKKy8vCisKK1RhcmdldE1hY2hpbmU6OlRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZUKSAKKyAgOiBUaGVUYXJnZXQoVCksIEFzbUluZm8oMCksCisgICAgTUNSZWxheEFsbChmYWxzZSkgeworICAvLyBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzdWJ0YXJnZXRzIHRoYXQgd2lsbCBhZGp1c3QgRmxvYXRBQklUeXBlIGZyb20gRGVmYXVsdAorICAvLyB0byBTb2Z0IG9yIEhhcmQuCisgIGlmIChVc2VTb2Z0RmxvYXQpCisgICAgRmxvYXRBQklUeXBlID0gRmxvYXRBQkk6OlNvZnQ7Cit9CisKK1RhcmdldE1hY2hpbmU6On5UYXJnZXRNYWNoaW5lKCkgeworICBkZWxldGUgQXNtSW5mbzsKK30KKworLy8vIGdldFJlbG9jYXRpb25Nb2RlbCAtIFJldHVybnMgdGhlIGNvZGUgZ2VuZXJhdGlvbiByZWxvY2F0aW9uIG1vZGVsLiBUaGUKKy8vLyBjaG9pY2VzIGFyZSBzdGF0aWMsIFBJQywgYW5kIGR5bmFtaWMtbm8tcGljLCBhbmQgdGFyZ2V0IGRlZmF1bHQuCitSZWxvYzo6TW9kZWwgVGFyZ2V0TWFjaGluZTo6Z2V0UmVsb2NhdGlvbk1vZGVsKCkgeworICByZXR1cm4gUmVsb2NhdGlvbk1vZGVsOworfQorCisvLy8gc2V0UmVsb2NhdGlvbk1vZGVsIC0gU2V0cyB0aGUgY29kZSBnZW5lcmF0aW9uIHJlbG9jYXRpb24gbW9kZWwuCit2b2lkIFRhcmdldE1hY2hpbmU6OnNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6TW9kZWwgTW9kZWwpIHsKKyAgUmVsb2NhdGlvbk1vZGVsID0gTW9kZWw7Cit9CisKKy8vLyBnZXRDb2RlTW9kZWwgLSBSZXR1cm5zIHRoZSBjb2RlIG1vZGVsLiBUaGUgY2hvaWNlcyBhcmUgc21hbGwsIGtlcm5lbCwKKy8vLyBtZWRpdW0sIGxhcmdlLCBhbmQgdGFyZ2V0IGRlZmF1bHQuCitDb2RlTW9kZWw6Ok1vZGVsIFRhcmdldE1hY2hpbmU6OmdldENvZGVNb2RlbCgpIHsKKyAgcmV0dXJuIENNTW9kZWw7Cit9CisKKy8vLyBzZXRDb2RlTW9kZWwgLSBTZXRzIHRoZSBjb2RlIG1vZGVsLgordm9pZCBUYXJnZXRNYWNoaW5lOjpzZXRDb2RlTW9kZWwoQ29kZU1vZGVsOjpNb2RlbCBNb2RlbCkgeworICBDTU1vZGVsID0gTW9kZWw7Cit9CisKK2Jvb2wgVGFyZ2V0TWFjaGluZTo6Z2V0QXNtVmVyYm9zaXR5RGVmYXVsdCgpIHsKKyAgcmV0dXJuIEFzbVZlcmJvc2l0eURlZmF1bHQ7Cit9CisKK3ZvaWQgVGFyZ2V0TWFjaGluZTo6c2V0QXNtVmVyYm9zaXR5RGVmYXVsdChib29sIFYpIHsKKyAgQXNtVmVyYm9zaXR5RGVmYXVsdCA9IFY7Cit9CisKK2Jvb2wgVGFyZ2V0TWFjaGluZTo6Z2V0RnVuY3Rpb25TZWN0aW9ucygpIHsKKyAgcmV0dXJuIEZ1bmN0aW9uU2VjdGlvbnM7Cit9CisKK2Jvb2wgVGFyZ2V0TWFjaGluZTo6Z2V0RGF0YVNlY3Rpb25zKCkgeworICByZXR1cm4gRGF0YVNlY3Rpb25zOworfQorCit2b2lkIFRhcmdldE1hY2hpbmU6OnNldEZ1bmN0aW9uU2VjdGlvbnMoYm9vbCBWKSB7CisgIEZ1bmN0aW9uU2VjdGlvbnMgPSBWOworfQorCit2b2lkIFRhcmdldE1hY2hpbmU6OnNldERhdGFTZWN0aW9ucyhib29sIFYpIHsKKyAgRGF0YVNlY3Rpb25zID0gVjsKK30KKworbmFtZXNwYWNlIGxsdm0geworICAvLy8gRGlzYWJsZUZyYW1lUG9pbnRlckVsaW0gLSBUaGlzIHJldHVybnMgdHJ1ZSBpZiBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uCisgIC8vLyBvcHRpbWl6YXRpb24gc2hvdWxkIGJlIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gbWFjaGluZSBmdW5jdGlvbi4KKyAgYm9vbCBEaXNhYmxlRnJhbWVQb2ludGVyRWxpbShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBlbGltaW5hdGUgbm9uLWxlYWYgZnJhbWUgcG9pbnRlcnMgYW5kIHRoZW4KKyAgICAvLyBjaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIGVsaW1pbmF0ZSBhbGwgZnJhbWUgcG9pbnRlcnMuCisgICAgaWYgKE5vRnJhbWVQb2ludGVyRWxpbU5vbkxlYWYgJiYgIU5vRnJhbWVQb2ludGVyRWxpbSkgeworICAgICAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgICAgICByZXR1cm4gTUZJLT5oYXNDYWxscygpOworICAgIH0KKworICAgIHJldHVybiBOb0ZyYW1lUG9pbnRlckVsaW07CisgIH0KKworICAvLy8gTGVzc1ByZWNpc2VGUE1BRCAtIFRoaXMgZmxhZyByZXR1cm4gdHJ1ZSB3aGVuIC1lbmFibGUtZnAtbWFkIG9wdGlvbgorICAvLy8gaXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBXaGVuIHRoaXMgZmxhZyBpcyBvZmYoZGVmYXVsdCksIHRoZQorICAvLy8gY29kZSBnZW5lcmF0b3IgaXMgbm90IGFsbG93ZWQgdG8gZ2VuZXJhdGUgbWFkIChtdWx0aXBseSBhZGQpIGlmIHRoZQorICAvLy8gcmVzdWx0IGlzICJsZXNzIHByZWNpc2UiIHRoYW4gZG9pbmcgdGhvc2Ugb3BlcmF0aW9ucyBpbmRpdmlkdWFsbHkuCisgIGJvb2wgTGVzc1ByZWNpc2VGUE1BRCgpIHsgcmV0dXJuIFVuc2FmZUZQTWF0aCB8fCBMZXNzUHJlY2lzZUZQTUFET3B0aW9uOyB9CisKKyAgLy8vIEhvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nRlBNYXRoIC0gUmV0dXJuIHRydWUgaWYgdGhlIGNvZGVnZW4gbXVzdCBhc3N1bWUKKyAgLy8vIHRoYXQgdGhlIHJvdW5kaW5nIG1vZGUgb2YgdGhlIEZQVSBjYW4gY2hhbmdlIGZyb20gaXRzIGRlZmF1bHQuCisgIGJvb2wgSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGgoKSB7CisgICAgcmV0dXJuICFVbnNhZmVGUE1hdGggJiYgSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGhPcHRpb247CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWJmYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uY3BwCkBAIC0wLDAgKzEsMTQ1IEBACisvLz09PS0gVGFyZ2V0UmVnaXN0ZXJJbmZvLmNwcCAtIFRhcmdldCBSZWdpc3RlciBJbmZvcm1hdGlvbiBJbXBsZW1lbnRhdGlvbiA9PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBUYXJnZXRSZWdpc3RlckluZm8gaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitUYXJnZXRSZWdpc3RlckluZm86OlRhcmdldFJlZ2lzdGVySW5mbyhjb25zdCBUYXJnZXRSZWdpc3RlckRlc2MgKkQsIHVuc2lnbmVkIE5SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdjbGFzc19pdGVyYXRvciBSQ0IsIHJlZ2NsYXNzX2l0ZXJhdG9yIFJDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKnN1YnJlZ2luZGV4bmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDRlNPLCBpbnQgQ0ZETywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQqIHN1YnJlZ3MsIGNvbnN0IHVuc2lnbmVkIHN1YnJlZ3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQqIGFsaWFzZXMsIGNvbnN0IHVuc2lnbmVkIGFsaWFzZXNzaXplKQorICA6IFN1YnJlZ0hhc2goc3VicmVncyksIFN1YnJlZ0hhc2hTaXplKHN1YnJlZ3NpemUpLAorICAgIEFsaWFzZXNIYXNoKGFsaWFzZXMpLCBBbGlhc2VzSGFzaFNpemUoYWxpYXNlc3NpemUpLAorICAgIERlc2MoRCksIFN1YlJlZ0luZGV4TmFtZXMoc3VicmVnaW5kZXhuYW1lcyksIE51bVJlZ3MoTlIpLAorICAgIFJlZ0NsYXNzQmVnaW4oUkNCKSwgUmVnQ2xhc3NFbmQoUkNFKSB7CisgIGFzc2VydChOdW1SZWdzIDwgRmlyc3RWaXJ0dWFsUmVnaXN0ZXIgJiYKKyAgICAgICAgICJUYXJnZXQgaGFzIHRvbyBtYW55IHBoeXNpY2FsIHJlZ2lzdGVycyEiKTsKKworICBDYWxsRnJhbWVTZXR1cE9wY29kZSAgID0gQ0ZTTzsKKyAgQ2FsbEZyYW1lRGVzdHJveU9wY29kZSA9IENGRE87Cit9CisKK1RhcmdldFJlZ2lzdGVySW5mbzo6flRhcmdldFJlZ2lzdGVySW5mbygpIHt9CisKKy8vLyBnZXRNaW5pbWFsUGh5c1JlZ0NsYXNzIC0gUmV0dXJucyB0aGUgUmVnaXN0ZXIgQ2xhc3Mgb2YgYSBwaHlzaWNhbAorLy8vIHJlZ2lzdGVyIG9mIHRoZSBnaXZlbiB0eXBlLCBwaWNraW5nIHRoZSBtb3N0IHN1YiByZWdpc3RlciBjbGFzcyBvZgorLy8vIHRoZSByaWdodCB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBwaHlzcmVnLgorY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCitUYXJnZXRSZWdpc3RlckluZm86OmdldE1pbmltYWxQaHlzUmVnQ2xhc3ModW5zaWduZWQgcmVnLCBFVlQgVlQpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzUGh5c2ljYWxSZWdpc3RlcihyZWcpICYmICJyZWcgbXVzdCBiZSBhIHBoeXNpY2FsIHJlZ2lzdGVyIik7CisKKyAgLy8gUGljayB0aGUgbW9zdCBzdWIgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIHJpZ2h0IHR5cGUgdGhhdCBjb250YWlucworICAvLyB0aGlzIHBoeXNyZWcuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIEJlc3RSQyA9IDA7CisgIGZvciAocmVnY2xhc3NfaXRlcmF0b3IgSSA9IHJlZ2NsYXNzX2JlZ2luKCksIEUgPSByZWdjbGFzc19lbmQoKTsgSSAhPSBFOyArK0kpeworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIFJDID0gKkk7CisgICAgaWYgKChWVCA9PSBNVlQ6Ok90aGVyIHx8IFJDLT5oYXNUeXBlKFZUKSkgJiYgUkMtPmNvbnRhaW5zKHJlZykgJiYKKyAgICAgICAgKCFCZXN0UkMgfHwgQmVzdFJDLT5oYXNTdWJDbGFzcyhSQykpKQorICAgICAgQmVzdFJDID0gUkM7CisgIH0KKworICBhc3NlcnQoQmVzdFJDICYmICJDb3VsZG4ndCBmaW5kIHRoZSByZWdpc3RlciBjbGFzcyIpOworICByZXR1cm4gQmVzdFJDOworfQorCisvLy8gZ2V0QWxsb2NhdGFibGVTZXRGb3JSQyAtIFRvZ2dsZSB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCBhbGxvY2F0YWJsZQorLy8vIHJlZ2lzdGVycyBmb3IgdGhlIHNwZWNpZmljIHJlZ2lzdGVyIGNsYXNzLgorc3RhdGljIHZvaWQgZ2V0QWxsb2NhdGFibGVTZXRGb3JSQyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgQml0VmVjdG9yICZSKXsgIAorICBmb3IgKFRhcmdldFJlZ2lzdGVyQ2xhc3M6Oml0ZXJhdG9yIEkgPSBSQy0+YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihNRiksCisgICAgICAgICBFID0gUkMtPmFsbG9jYXRpb25fb3JkZXJfZW5kKE1GKTsgSSAhPSBFOyArK0kpCisgICAgUi5zZXQoKkkpOworfQorCitCaXRWZWN0b3IgVGFyZ2V0UmVnaXN0ZXJJbmZvOjpnZXRBbGxvY2F0YWJsZVNldChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0IHsKKyAgQml0VmVjdG9yIEFsbG9jYXRhYmxlKE51bVJlZ3MpOworICBpZiAoUkMpIHsKKyAgICBnZXRBbGxvY2F0YWJsZVNldEZvclJDKE1GLCBSQywgQWxsb2NhdGFibGUpOworICAgIHJldHVybiBBbGxvY2F0YWJsZTsKKyAgfQorCisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjpyZWdjbGFzc19pdGVyYXRvciBJID0gcmVnY2xhc3NfYmVnaW4oKSwKKyAgICAgICAgIEUgPSByZWdjbGFzc19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgZ2V0QWxsb2NhdGFibGVTZXRGb3JSQyhNRiwgKkksIEFsbG9jYXRhYmxlKTsKKyAgcmV0dXJuIEFsbG9jYXRhYmxlOworfQorCisvLy8gZ2V0RnJhbWVJbmRleE9mZnNldCAtIFJldHVybnMgdGhlIGRpc3BsYWNlbWVudCBmcm9tIHRoZSBmcmFtZSByZWdpc3RlciB0bworLy8vIHRoZSBzdGFjayBmcmFtZSBvZiB0aGUgc3BlY2lmaWVkIGluZGV4LiBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisvLy8gd2hpY2ggaXMgb3ZlcnJpZGRlbiBmb3Igc29tZSB0YXJnZXRzLgoraW50IFRhcmdldFJlZ2lzdGVySW5mbzo6Z2V0RnJhbWVJbmRleE9mZnNldChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRkkpIGNvbnN0IHsKKyAgY29uc3QgVGFyZ2V0RnJhbWVJbmZvICZURkkgPSAqTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCk7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICByZXR1cm4gTUZJLT5nZXRPYmplY3RPZmZzZXQoRkkpICsgTUZJLT5nZXRTdGFja1NpemUoKSAtCisgICAgVEZJLmdldE9mZnNldE9mTG9jYWxBcmVhKCkgKyBNRkktPmdldE9mZnNldEFkanVzdG1lbnQoKTsKK30KKworLy8vIGdldEluaXRpYWxGcmFtZVN0YXRlIC0gUmV0dXJucyBhIGxpc3Qgb2YgbWFjaGluZSBtb3ZlcyB0aGF0IGFyZSBhc3N1bWVkCisvLy8gb24gZW50cnkgdG8gYSBmdW5jdGlvbi4KK3ZvaWQKK1RhcmdldFJlZ2lzdGVySW5mbzo6Z2V0SW5pdGlhbEZyYW1lU3RhdGUoc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+ICZNb3ZlcykgY29uc3R7CisgIC8vIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KK30KKworY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCitsbHZtOjpnZXRDb21tb25TdWJDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQikgeworICAvLyBGaXJzdCB0YWtlIGNhcmUgb2YgdGhlIHRyaXZpYWwgY2FzZXMKKyAgaWYgKEEgPT0gQikKKyAgICByZXR1cm4gQTsKKyAgaWYgKCFBIHx8ICFCKQorICAgIHJldHVybiAwOworCisgIC8vIElmIEIgaXMgYSBzdWJjbGFzcyBvZiBBLCBpdCB3aWxsIGJlIGhhbmRsZWQgaW4gdGhlIGxvb3AgYmVsb3cKKyAgaWYgKEItPmhhc1N1YkNsYXNzKEEpKQorICAgIHJldHVybiBBOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkJlc3QgPSAwOworICBmb3IgKFRhcmdldFJlZ2lzdGVyQ2xhc3M6OnNjX2l0ZXJhdG9yIEkgPSBBLT5zdWJjbGFzc2VzX2JlZ2luKCk7CisgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqWCA9ICpJOyArK0kpIHsKKyAgICBpZiAoWCA9PSBCKQorICAgICAgcmV0dXJuIEI7ICAgICAgICAgICAgICAgICAvLyBCIGlzIGEgc3ViY2xhc3Mgb2YgQQorCisgICAgLy8gWCBtdXN0IGJlIGEgY29tbW9uIHN1YmNsYXNzIG9mIEEgYW5kIEIKKyAgICBpZiAoIUItPmhhc1N1YkNsYXNzKFgpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBBIHN1cGVyY2xhc3MgaXMgZGVmaW5pdGVseSBiZXR0ZXIuCisgICAgaWYgKCFCZXN0IHx8IEJlc3QtPmhhc1N1cGVyQ2xhc3MoWCkpIHsKKyAgICAgIEJlc3QgPSBYOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gQSBzdWJjbGFzcyBpcyBkZWZpbml0ZWx5IHdvcnNlCisgICAgaWYgKEJlc3QtPmhhc1N1YkNsYXNzKFgpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBCZXN0IGFuZCAqSSBoYXZlIG5vIHN1cGVyL3N1YiBjbGFzcyByZWxhdGlvbiAtIHBpY2sgdGhlIGxhcmdlciBjbGFzcywgb3IKKyAgICAvLyB0aGUgc21hbGxlciBzcGlsbCBzaXplLgorICAgIGludCBuYiA9IHN0ZDo6ZGlzdGFuY2UoQmVzdC0+YmVnaW4oKSwgQmVzdC0+ZW5kKCkpOworICAgIGludCBuaSA9IHN0ZDo6ZGlzdGFuY2UoWC0+YmVnaW4oKSwgWC0+ZW5kKCkpOworICAgIGlmIChuaT5uYiB8fCAobmk9PW5iICYmIFgtPmdldFNpemUoKSA8IEJlc3QtPmdldFNpemUoKSkpCisgICAgICBCZXN0ID0gWDsKKyAgfQorICByZXR1cm4gQmVzdDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGI3NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LS0gVGFyZ2V0U3VidGFyZ2V0LmNwcCAtIEdlbmVyYWwgVGFyZ2V0IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgZ2VuZXJhbCBwYXJ0cyBvZiBhIFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGFyZ2V0U3VidGFyZ2V0IENsYXNzCisvLworVGFyZ2V0U3VidGFyZ2V0OjpUYXJnZXRTdWJ0YXJnZXQoKSB7fQorCitUYXJnZXRTdWJ0YXJnZXQ6On5UYXJnZXRTdWJ0YXJnZXQoKSB7fQorCitib29sIFRhcmdldFN1YnRhcmdldDo6ZW5hYmxlUG9zdFJBU2NoZWR1bGVyKAorICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgICAgIEFudGlEZXBCcmVha01vZGUmIE1vZGUsCisgICAgICAgICAgUmVnQ2xhc3NWZWN0b3ImIENyaXRpY2FsUGF0aFJDcykgY29uc3QgeworICBNb2RlID0gQU5USURFUF9OT05FOworICBDcml0aWNhbFBhdGhSQ3MuY2xlYXIoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9Bc21QYXJzZXIvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9Bc21QYXJzZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkYmRkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVBhcnNlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDcgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4gKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1YODZBc21QYXJzZXIKKyAgWDg2QXNtTGV4ZXIuY3BwCisgIFg4NkFzbVBhcnNlci5jcHAKKyAgKQorYWRkX2RlcGVuZGVuY2llcyhMTFZNWDg2QXNtUGFyc2VyIFg4NkNvZGVHZW5UYWJsZV9nZW4pCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9Bc21QYXJzZXIvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9Bc21QYXJzZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5NzYwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVBhcnNlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RhcmdldC9YODYvQXNtUGFyc2VyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNWDg2QXNtUGFyc2VyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyB4ODYgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQLkZsYWdzICs9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9Bc21QYXJzZXIvWDg2QXNtTGV4ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQXNtUGFyc2VyL1g4NkFzbUxleGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc5N2FiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQXNtUGFyc2VyL1g4NkFzbUxleGVyLmNwcApAQCAtMCwwICsxLDE2OCBAQAorLy89PT0tLSBYODZBc21MZXhlci5jcHAgLSBUb2tlbml6ZSBYODYgYXNzZW1ibHkgdG8gQXNtVG9rZW5zIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ1BhcnNlZEFzbU9wZXJhbmQuaCIKKyNpbmNsdWRlICJYODYuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIAorY2xhc3MgWDg2QXNtTGV4ZXIgOiBwdWJsaWMgVGFyZ2V0QXNtTGV4ZXIgeworICBjb25zdCBNQ0FzbUluZm8gJkFzbUluZm87CisgIAorICBib29sIHRlbnRhdGl2ZUlzVmFsaWQ7CisgIEFzbVRva2VuIHRlbnRhdGl2ZVRva2VuOworICAKKyAgY29uc3QgQXNtVG9rZW4gJmxleFRlbnRhdGl2ZSgpIHsKKyAgICB0ZW50YXRpdmVUb2tlbiA9IGdldExleGVyKCktPkxleCgpOworICAgIHRlbnRhdGl2ZUlzVmFsaWQgPSB0cnVlOworICAgIHJldHVybiB0ZW50YXRpdmVUb2tlbjsKKyAgfQorICAKKyAgY29uc3QgQXNtVG9rZW4gJmxleERlZmluaXRlKCkgeworICAgIGlmICh0ZW50YXRpdmVJc1ZhbGlkKSB7CisgICAgICB0ZW50YXRpdmVJc1ZhbGlkID0gZmFsc2U7CisgICAgICByZXR1cm4gdGVudGF0aXZlVG9rZW47CisgICAgfQorICAgIHJldHVybiBnZXRMZXhlcigpLT5MZXgoKTsKKyAgfQorICAKKyAgQXNtVG9rZW4gTGV4VG9rZW5BVFQoKTsKKyAgQXNtVG9rZW4gTGV4VG9rZW5JbnRlbCgpOworcHJvdGVjdGVkOgorICBBc21Ub2tlbiBMZXhUb2tlbigpIHsKKyAgICBpZiAoIUxleGVyKSB7CisgICAgICBTZXRFcnJvcihTTUxvYygpLCAiTm8gTUNBc21MZXhlciBpbnN0YWxsZWQiKTsKKyAgICAgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6RXJyb3IsICIiLCAwKTsKKyAgICB9CisgICAgCisgICAgc3dpdGNoIChBc21JbmZvLmdldEFzc2VtYmxlckRpYWxlY3QoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICBTZXRFcnJvcihTTUxvYygpLCAiVW5oYW5kbGVkIGRpYWxlY3QiKTsKKyAgICAgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6RXJyb3IsICIiLCAwKTsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gTGV4VG9rZW5BVFQoKTsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gTGV4VG9rZW5JbnRlbCgpOworICAgIH0KKyAgfQorcHVibGljOgorICBYODZBc21MZXhlcihjb25zdCBUYXJnZXQgJlQsIGNvbnN0IE1DQXNtSW5mbyAmTUFJKQorICAgIDogVGFyZ2V0QXNtTGV4ZXIoVCksIEFzbUluZm8oTUFJKSwgdGVudGF0aXZlSXNWYWxpZChmYWxzZSkgeworICB9Cit9OworCit9CisKK3N0YXRpYyB1bnNpZ25lZCBNYXRjaFJlZ2lzdGVyTmFtZShTdHJpbmdSZWYgTmFtZSk7CisKK0FzbVRva2VuIFg4NkFzbUxleGVyOjpMZXhUb2tlbkFUVCgpIHsKKyAgQXNtVG9rZW4gbGV4ZWRUb2tlbiA9IGxleERlZmluaXRlKCk7CisgIAorICBzd2l0Y2ggKGxleGVkVG9rZW4uZ2V0S2luZCgpKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGxleGVkVG9rZW47CisgIGNhc2UgQXNtVG9rZW46OkVycm9yOgorICAgIFNldEVycm9yKExleGVyLT5nZXRFcnJMb2MoKSwgTGV4ZXItPmdldEVycigpKTsKKyAgICByZXR1cm4gbGV4ZWRUb2tlbjsKKyAgICAgIAorICBjYXNlIEFzbVRva2VuOjpQZXJjZW50OiB7CisgICAgY29uc3QgQXNtVG9rZW4gJm5leHRUb2tlbiA9IGxleFRlbnRhdGl2ZSgpOworICAgIGlmIChuZXh0VG9rZW4uZ2V0S2luZCgpICE9IEFzbVRva2VuOjpJZGVudGlmaWVyKQorICAgICAgcmV0dXJuIGxleGVkVG9rZW47CisKKyAgICAgIAorICAgIGlmICh1bnNpZ25lZCByZWdJRCA9IE1hdGNoUmVnaXN0ZXJOYW1lKG5leHRUb2tlbi5nZXRTdHJpbmcoKSkpIHsKKyAgICAgIGxleERlZmluaXRlKCk7CisgICAgICAgIAorICAgICAgLy8gRklYTUU6IFRoaXMgaXMgY29tcGxldGVseSB3cm9uZyB3aGVuIHRoZXJlIGlzIGEgc3BhY2Ugb3Igb3RoZXIKKyAgICAgIC8vIHB1bmN0dWF0aW9uIGJldHdlZW4gdGhlICUgYW5kIHRoZSByZWdpc3RlciBuYW1lLgorICAgICAgU3RyaW5nUmVmIHJlZ1N0cihsZXhlZFRva2VuLmdldFN0cmluZygpLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGV4ZWRUb2tlbi5nZXRTdHJpbmcoKS5zaXplKCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRva2VuLmdldFN0cmluZygpLnNpemUoKSk7CisgICAgICAKKyAgICAgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6UmVnaXN0ZXIsIHJlZ1N0ciwgCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmVnSUQpKTsKKyAgICB9CisgICAgCisgICAgLy8gTWF0Y2ggcmVnaXN0ZXIgbmFtZSBmYWlsZWQuICBJZiB0aGlzIGlzICJkYlswLTddIiwgbWF0Y2ggaXQgYXMgYW4gYWxpYXMKKyAgICAvLyBmb3IgZHJbMC03XS4KKyAgICBpZiAobmV4dFRva2VuLmdldFN0cmluZygpLnNpemUoKSA9PSAzICYmCisgICAgICAgIG5leHRUb2tlbi5nZXRTdHJpbmcoKS5zdGFydHN3aXRoKCJkYiIpKSB7CisgICAgICBpbnQgUmVnTm8gPSAtMTsKKyAgICAgIHN3aXRjaCAobmV4dFRva2VuLmdldFN0cmluZygpWzJdKSB7CisgICAgICBjYXNlICcwJzogUmVnTm8gPSBYODY6OkRSMDsgYnJlYWs7CisgICAgICBjYXNlICcxJzogUmVnTm8gPSBYODY6OkRSMTsgYnJlYWs7CisgICAgICBjYXNlICcyJzogUmVnTm8gPSBYODY6OkRSMjsgYnJlYWs7CisgICAgICBjYXNlICczJzogUmVnTm8gPSBYODY6OkRSMzsgYnJlYWs7CisgICAgICBjYXNlICc0JzogUmVnTm8gPSBYODY6OkRSNDsgYnJlYWs7CisgICAgICBjYXNlICc1JzogUmVnTm8gPSBYODY6OkRSNTsgYnJlYWs7CisgICAgICBjYXNlICc2JzogUmVnTm8gPSBYODY6OkRSNjsgYnJlYWs7CisgICAgICBjYXNlICc3JzogUmVnTm8gPSBYODY6OkRSNzsgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChSZWdObyAhPSAtMSkgeworICAgICAgICBsZXhEZWZpbml0ZSgpOworCisgICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGNvbXBsZXRlbHkgd3Jvbmcgd2hlbiB0aGVyZSBpcyBhIHNwYWNlIG9yIG90aGVyCisgICAgICAgIC8vIHB1bmN0dWF0aW9uIGJldHdlZW4gdGhlICUgYW5kIHRoZSByZWdpc3RlciBuYW1lLgorICAgICAgICBTdHJpbmdSZWYgcmVnU3RyKGxleGVkVG9rZW4uZ2V0U3RyaW5nKCkuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxleGVkVG9rZW4uZ2V0U3RyaW5nKCkuc2l6ZSgpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRva2VuLmdldFN0cmluZygpLnNpemUoKSk7CisgICAgICAgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6UmVnaXN0ZXIsIHJlZ1N0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihSZWdObykpOworICAgICAgfQorICAgIH0KKyAgICAgIAorICAgCisgICAgcmV0dXJuIGxleGVkVG9rZW47CisgIH0gICAgCisgIH0KK30KKworQXNtVG9rZW4gWDg2QXNtTGV4ZXI6OkxleFRva2VuSW50ZWwoKSB7CisgIGNvbnN0IEFzbVRva2VuICZsZXhlZFRva2VuID0gbGV4RGVmaW5pdGUoKTsKKyAgCisgIHN3aXRjaChsZXhlZFRva2VuLmdldEtpbmQoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBsZXhlZFRva2VuOworICBjYXNlIEFzbVRva2VuOjpFcnJvcjoKKyAgICBTZXRFcnJvcihMZXhlci0+Z2V0RXJyTG9jKCksIExleGVyLT5nZXRFcnIoKSk7CisgICAgcmV0dXJuIGxleGVkVG9rZW47CisgIGNhc2UgQXNtVG9rZW46OklkZW50aWZpZXI6IHsKKyAgICBzdGQ6OnN0cmluZyB1cHBlckNhc2UgPSBsZXhlZFRva2VuLmdldFN0cmluZygpLnN0cigpOworICAgIHN0ZDo6c3RyaW5nIGxvd2VyQ2FzZSA9IExvd2VyY2FzZVN0cmluZyh1cHBlckNhc2UpOworICAgIFN0cmluZ1JlZiBsb3dlclJlZihsb3dlckNhc2UpOworICAgIAorICAgIHVuc2lnbmVkIHJlZ0lEID0gTWF0Y2hSZWdpc3Rlck5hbWUobG93ZXJSZWYpOworICAgIAorICAgIGlmIChyZWdJRCkKKyAgICAgIHJldHVybiBBc21Ub2tlbihBc21Ub2tlbjo6UmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgbGV4ZWRUb2tlbi5nZXRTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihyZWdJRCkpOworICAgIHJldHVybiBsZXhlZFRva2VuOworICB9CisgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplWDg2QXNtTGV4ZXIoKSB7CisgIFJlZ2lzdGVyQXNtTGV4ZXI8WDg2QXNtTGV4ZXI+IFgoVGhlWDg2XzMyVGFyZ2V0KTsKKyAgUmVnaXN0ZXJBc21MZXhlcjxYODZBc21MZXhlcj4gWShUaGVYODZfNjRUYXJnZXQpOworfQorCisjZGVmaW5lIFJFR0lTVEVSU19PTkxZCisjaW5jbHVkZSAiWDg2R2VuQXNtTWF0Y2hlci5pbmMiCisjdW5kZWYgUkVHSVNURVJTX09OTFkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVBhcnNlci9YODZBc21QYXJzZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQXNtUGFyc2VyL1g4NkFzbVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxMjQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVBhcnNlci9YODZBc21QYXJzZXIuY3BwCkBAIC0wLDAgKzEsOTMxIEBACisvLz09PS0tIFg4NkFzbVBhcnNlci5jcHAgLSBQYXJzZSBYODYgYXNzZW1ibHkgdG8gTUNJbnN0IGluc3RydWN0aW9ucyAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0QXNtUGFyc2VyLmgiCisjaW5jbHVkZSAiWDg2LmgiCisjaW5jbHVkZSAiWDg2U3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTd2l0Y2guaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTdHJlYW1lci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ1BhcnNlZEFzbU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRBc21QYXJzZXIuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2Ugeworc3RydWN0IFg4Nk9wZXJhbmQ7CisKK2NsYXNzIFg4NkFUVEFzbVBhcnNlciA6IHB1YmxpYyBUYXJnZXRBc21QYXJzZXIgeworICBNQ0FzbVBhcnNlciAmUGFyc2VyOworICBUYXJnZXRNYWNoaW5lICZUTTsKKworcHJvdGVjdGVkOgorICB1bnNpZ25lZCBJczY0Qml0IDogMTsKKworcHJpdmF0ZToKKyAgTUNBc21QYXJzZXIgJmdldFBhcnNlcigpIGNvbnN0IHsgcmV0dXJuIFBhcnNlcjsgfQorCisgIE1DQXNtTGV4ZXIgJmdldExleGVyKCkgY29uc3QgeyByZXR1cm4gUGFyc2VyLmdldExleGVyKCk7IH0KKworICB2b2lkIFdhcm5pbmcoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1zZykgeyBQYXJzZXIuV2FybmluZyhMLCBNc2cpOyB9CisKKyAgYm9vbCBFcnJvcihTTUxvYyBMLCBjb25zdCBUd2luZSAmTXNnKSB7IHJldHVybiBQYXJzZXIuRXJyb3IoTCwgTXNnKTsgfQorCisgIGJvb2wgUGFyc2VSZWdpc3Rlcih1bnNpZ25lZCAmUmVnTm8sIFNNTG9jICZTdGFydExvYywgU01Mb2MgJkVuZExvYyk7CisKKyAgWDg2T3BlcmFuZCAqUGFyc2VPcGVyYW5kKCk7CisgIFg4Nk9wZXJhbmQgKlBhcnNlTWVtT3BlcmFuZCh1bnNpZ25lZCBTZWdSZWcsIFNNTG9jIFN0YXJ0TG9jKTsKKworICBib29sIFBhcnNlRGlyZWN0aXZlV29yZCh1bnNpZ25lZCBTaXplLCBTTUxvYyBMKTsKKworICBib29sIE1hdGNoSW5zdHJ1Y3Rpb24oY29uc3QgU21hbGxWZWN0b3JJbXBsPE1DUGFyc2VkQXNtT3BlcmFuZCo+ICZPcGVyYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1DSW5zdCAmSW5zdCk7CisKKyAgLy8vIEBuYW1lIEF1dG8tZ2VuZXJhdGVkIE1hdGNoZXIgRnVuY3Rpb25zCisgIC8vLyB7CisKKyAgdW5zaWduZWQgQ29tcHV0ZUF2YWlsYWJsZUZlYXR1cmVzKGNvbnN0IFg4NlN1YnRhcmdldCAqU3VidGFyZ2V0KSBjb25zdDsKKworICBib29sIE1hdGNoSW5zdHJ1Y3Rpb25JbXBsKAorICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNQ1BhcnNlZEFzbU9wZXJhbmQqPiAmT3BlcmFuZHMsIE1DSW5zdCAmSW5zdCk7CisKKyAgLy8vIH0KKworcHVibGljOgorICBYODZBVFRBc21QYXJzZXIoY29uc3QgVGFyZ2V0ICZULCBNQ0FzbVBhcnNlciAmX1BhcnNlciwgVGFyZ2V0TWFjaGluZSAmVE0pCisgICAgOiBUYXJnZXRBc21QYXJzZXIoVCksIFBhcnNlcihfUGFyc2VyKSwgVE0oVE0pIHsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHNldCBvZiBhdmFpbGFibGUgZmVhdHVyZXMuCisgICAgc2V0QXZhaWxhYmxlRmVhdHVyZXMoQ29tcHV0ZUF2YWlsYWJsZUZlYXR1cmVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkpKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBQYXJzZUluc3RydWN0aW9uKFN0cmluZ1JlZiBOYW1lLCBTTUxvYyBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TUNQYXJzZWRBc21PcGVyYW5kKj4gJk9wZXJhbmRzKTsKKworICB2aXJ0dWFsIGJvb2wgUGFyc2VEaXJlY3RpdmUoQXNtVG9rZW4gRGlyZWN0aXZlSUQpOworfTsKKworY2xhc3MgWDg2XzMyQVRUQXNtUGFyc2VyIDogcHVibGljIFg4NkFUVEFzbVBhcnNlciB7CitwdWJsaWM6CisgIFg4Nl8zMkFUVEFzbVBhcnNlcihjb25zdCBUYXJnZXQgJlQsIE1DQXNtUGFyc2VyICZfUGFyc2VyLCBUYXJnZXRNYWNoaW5lICZUTSkKKyAgICA6IFg4NkFUVEFzbVBhcnNlcihULCBfUGFyc2VyLCBUTSkgeworICAgIElzNjRCaXQgPSBmYWxzZTsKKyAgfQorfTsKKworY2xhc3MgWDg2XzY0QVRUQXNtUGFyc2VyIDogcHVibGljIFg4NkFUVEFzbVBhcnNlciB7CitwdWJsaWM6CisgIFg4Nl82NEFUVEFzbVBhcnNlcihjb25zdCBUYXJnZXQgJlQsIE1DQXNtUGFyc2VyICZfUGFyc2VyLCBUYXJnZXRNYWNoaW5lICZUTSkKKyAgICA6IFg4NkFUVEFzbVBhcnNlcihULCBfUGFyc2VyLCBUTSkgeworICAgIElzNjRCaXQgPSB0cnVlOworICB9Cit9OworCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vLyBAbmFtZSBBdXRvLWdlbmVyYXRlZCBNYXRjaCBGdW5jdGlvbnMKKy8vLyB7CisKK3N0YXRpYyB1bnNpZ25lZCBNYXRjaFJlZ2lzdGVyTmFtZShTdHJpbmdSZWYgTmFtZSk7CisKKy8vLyB9CisKK25hbWVzcGFjZSB7CisKKy8vLyBYODZPcGVyYW5kIC0gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcGFyc2VkIFg4NiBtYWNoaW5lCisvLy8gaW5zdHJ1Y3Rpb24uCitzdHJ1Y3QgWDg2T3BlcmFuZCA6IHB1YmxpYyBNQ1BhcnNlZEFzbU9wZXJhbmQgeworICBlbnVtIEtpbmRUeSB7CisgICAgVG9rZW4sCisgICAgUmVnaXN0ZXIsCisgICAgSW1tZWRpYXRlLAorICAgIE1lbW9yeQorICB9IEtpbmQ7CisKKyAgU01Mb2MgU3RhcnRMb2MsIEVuZExvYzsKKworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIGNvbnN0IGNoYXIgKkRhdGE7CisgICAgICB1bnNpZ25lZCBMZW5ndGg7CisgICAgfSBUb2s7CisKKyAgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgUmVnTm87CisgICAgfSBSZWc7CisKKyAgICBzdHJ1Y3QgeworICAgICAgY29uc3QgTUNFeHByICpWYWw7CisgICAgfSBJbW07CisKKyAgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgU2VnUmVnOworICAgICAgY29uc3QgTUNFeHByICpEaXNwOworICAgICAgdW5zaWduZWQgQmFzZVJlZzsKKyAgICAgIHVuc2lnbmVkIEluZGV4UmVnOworICAgICAgdW5zaWduZWQgU2NhbGU7CisgICAgfSBNZW07CisgIH07CisKKyAgWDg2T3BlcmFuZChLaW5kVHkgSywgU01Mb2MgU3RhcnQsIFNNTG9jIEVuZCkKKyAgICA6IEtpbmQoSyksIFN0YXJ0TG9jKFN0YXJ0KSwgRW5kTG9jKEVuZCkge30KKworICAvLy8gZ2V0U3RhcnRMb2MgLSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGlzIG9wZXJhbmQuCisgIFNNTG9jIGdldFN0YXJ0TG9jKCkgY29uc3QgeyByZXR1cm4gU3RhcnRMb2M7IH0KKyAgLy8vIGdldEVuZExvYyAtIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgdG9rZW4gb2YgdGhpcyBvcGVyYW5kLgorICBTTUxvYyBnZXRFbmRMb2MoKSBjb25zdCB7IHJldHVybiBFbmRMb2M7IH0KKworICBTdHJpbmdSZWYgZ2V0VG9rZW4oKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gVG9rZW4gJiYgIkludmFsaWQgYWNjZXNzISIpOworICAgIHJldHVybiBTdHJpbmdSZWYoVG9rLkRhdGEsIFRvay5MZW5ndGgpOworICB9CisgIHZvaWQgc2V0VG9rZW5WYWx1ZShTdHJpbmdSZWYgVmFsdWUpIHsKKyAgICBhc3NlcnQoS2luZCA9PSBUb2tlbiAmJiAiSW52YWxpZCBhY2Nlc3MhIik7CisgICAgVG9rLkRhdGEgPSBWYWx1ZS5kYXRhKCk7CisgICAgVG9rLkxlbmd0aCA9IFZhbHVlLnNpemUoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFJlZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBSZWdpc3RlciAmJiAiSW52YWxpZCBhY2Nlc3MhIik7CisgICAgcmV0dXJuIFJlZy5SZWdObzsKKyAgfQorCisgIGNvbnN0IE1DRXhwciAqZ2V0SW1tKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IEltbWVkaWF0ZSAmJiAiSW52YWxpZCBhY2Nlc3MhIik7CisgICAgcmV0dXJuIEltbS5WYWw7CisgIH0KKworICBjb25zdCBNQ0V4cHIgKmdldE1lbURpc3AoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gTWVtb3J5ICYmICJJbnZhbGlkIGFjY2VzcyEiKTsKKyAgICByZXR1cm4gTWVtLkRpc3A7CisgIH0KKyAgdW5zaWduZWQgZ2V0TWVtU2VnUmVnKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IE1lbW9yeSAmJiAiSW52YWxpZCBhY2Nlc3MhIik7CisgICAgcmV0dXJuIE1lbS5TZWdSZWc7CisgIH0KKyAgdW5zaWduZWQgZ2V0TWVtQmFzZVJlZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBNZW1vcnkgJiYgIkludmFsaWQgYWNjZXNzISIpOworICAgIHJldHVybiBNZW0uQmFzZVJlZzsKKyAgfQorICB1bnNpZ25lZCBnZXRNZW1JbmRleFJlZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBNZW1vcnkgJiYgIkludmFsaWQgYWNjZXNzISIpOworICAgIHJldHVybiBNZW0uSW5kZXhSZWc7CisgIH0KKyAgdW5zaWduZWQgZ2V0TWVtU2NhbGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gTWVtb3J5ICYmICJJbnZhbGlkIGFjY2VzcyEiKTsKKyAgICByZXR1cm4gTWVtLlNjYWxlOworICB9CisKKyAgYm9vbCBpc1Rva2VuKCkgY29uc3Qge3JldHVybiBLaW5kID09IFRva2VuOyB9CisKKyAgYm9vbCBpc0ltbSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gSW1tZWRpYXRlOyB9CisKKyAgYm9vbCBpc0ltbVNFeHRpMTZpOCgpIGNvbnN0IHsKKyAgICBpZiAoIWlzSW1tKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB0aGlzIGlzbid0IGEgY29uc3RhbnQgZXhwciwganVzdCBhc3N1bWUgaXQgZml0cyBhbmQgbGV0IHJlbGF4YXRpb24KKyAgICAvLyBoYW5kbGUgaXQuCisgICAgY29uc3QgTUNDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8TUNDb25zdGFudEV4cHI+KGdldEltbSgpKTsKKyAgICBpZiAoIUNFKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBPdGhlcndpc2UsIGNoZWNrIHRoZSB2YWx1ZSBpcyBpbiBhIHJhbmdlIHRoYXQgbWFrZXMgc2Vuc2UgZm9yIHRoaXMKKyAgICAvLyBleHRlbnNpb24uCisgICAgdWludDY0X3QgVmFsdWUgPSBDRS0+Z2V0VmFsdWUoKTsKKyAgICByZXR1cm4gKCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPD0gMHgwMDAwMDAwMDAwMDAwMDdGVUxMKXx8CisgICAgICAgICAgICAoMHgwMDAwMDAwMDAwMDBGRjgwVUxMIDw9IFZhbHVlICYmIFZhbHVlIDw9IDB4MDAwMDAwMDAwMDAwRkZGRlVMTCl8fAorICAgICAgICAgICAgKDB4RkZGRkZGRkZGRkZGRkY4MFVMTCA8PSBWYWx1ZSAmJiBWYWx1ZSA8PSAweEZGRkZGRkZGRkZGRkZGRkZVTEwpKTsKKyAgfQorICBib29sIGlzSW1tU0V4dGkzMmk4KCkgY29uc3QgeworICAgIGlmICghaXNJbW0oKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHRoaXMgaXNuJ3QgYSBjb25zdGFudCBleHByLCBqdXN0IGFzc3VtZSBpdCBmaXRzIGFuZCBsZXQgcmVsYXhhdGlvbgorICAgIC8vIGhhbmRsZSBpdC4KKyAgICBjb25zdCBNQ0NvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxNQ0NvbnN0YW50RXhwcj4oZ2V0SW1tKCkpOworICAgIGlmICghQ0UpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE90aGVyd2lzZSwgY2hlY2sgdGhlIHZhbHVlIGlzIGluIGEgcmFuZ2UgdGhhdCBtYWtlcyBzZW5zZSBmb3IgdGhpcworICAgIC8vIGV4dGVuc2lvbi4KKyAgICB1aW50NjRfdCBWYWx1ZSA9IENFLT5nZXRWYWx1ZSgpOworICAgIHJldHVybiAoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA8PSAweDAwMDAwMDAwMDAwMDAwN0ZVTEwpfHwKKyAgICAgICAgICAgICgweDAwMDAwMDAwRkZGRkZGODBVTEwgPD0gVmFsdWUgJiYgVmFsdWUgPD0gMHgwMDAwMDAwMEZGRkZGRkZGVUxMKXx8CisgICAgICAgICAgICAoMHhGRkZGRkZGRkZGRkZGRjgwVUxMIDw9IFZhbHVlICYmIFZhbHVlIDw9IDB4RkZGRkZGRkZGRkZGRkZGRlVMTCkpOworICB9CisgIGJvb2wgaXNJbW1TRXh0aTY0aTgoKSBjb25zdCB7CisgICAgaWYgKCFpc0ltbSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhpcyBpc24ndCBhIGNvbnN0YW50IGV4cHIsIGp1c3QgYXNzdW1lIGl0IGZpdHMgYW5kIGxldCByZWxheGF0aW9uCisgICAgLy8gaGFuZGxlIGl0LgorICAgIGNvbnN0IE1DQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PE1DQ29uc3RhbnRFeHByPihnZXRJbW0oKSk7CisgICAgaWYgKCFDRSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayB0aGUgdmFsdWUgaXMgaW4gYSByYW5nZSB0aGF0IG1ha2VzIHNlbnNlIGZvciB0aGlzCisgICAgLy8gZXh0ZW5zaW9uLgorICAgIHVpbnQ2NF90IFZhbHVlID0gQ0UtPmdldFZhbHVlKCk7CisgICAgcmV0dXJuICgoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIDw9IDB4MDAwMDAwMDAwMDAwMDA3RlVMTCl8fAorICAgICAgICAgICAgKDB4RkZGRkZGRkZGRkZGRkY4MFVMTCA8PSBWYWx1ZSAmJiBWYWx1ZSA8PSAweEZGRkZGRkZGRkZGRkZGRkZVTEwpKTsKKyAgfQorICBib29sIGlzSW1tU0V4dGk2NGkzMigpIGNvbnN0IHsKKyAgICBpZiAoIWlzSW1tKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB0aGlzIGlzbid0IGEgY29uc3RhbnQgZXhwciwganVzdCBhc3N1bWUgaXQgZml0cyBhbmQgbGV0IHJlbGF4YXRpb24KKyAgICAvLyBoYW5kbGUgaXQuCisgICAgY29uc3QgTUNDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8TUNDb25zdGFudEV4cHI+KGdldEltbSgpKTsKKyAgICBpZiAoIUNFKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBPdGhlcndpc2UsIGNoZWNrIHRoZSB2YWx1ZSBpcyBpbiBhIHJhbmdlIHRoYXQgbWFrZXMgc2Vuc2UgZm9yIHRoaXMKKyAgICAvLyBleHRlbnNpb24uCisgICAgdWludDY0X3QgVmFsdWUgPSBDRS0+Z2V0VmFsdWUoKTsKKyAgICByZXR1cm4gKCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPD0gMHgwMDAwMDAwMDdGRkZGRkZGVUxMKXx8CisgICAgICAgICAgICAoMHhGRkZGRkZGRjgwMDAwMDAwVUxMIDw9IFZhbHVlICYmIFZhbHVlIDw9IDB4RkZGRkZGRkZGRkZGRkZGRlVMTCkpOworICB9CisKKyAgYm9vbCBpc01lbSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gTWVtb3J5OyB9CisKKyAgYm9vbCBpc0Fic01lbSgpIGNvbnN0IHsKKyAgICByZXR1cm4gS2luZCA9PSBNZW1vcnkgJiYgIWdldE1lbVNlZ1JlZygpICYmICFnZXRNZW1CYXNlUmVnKCkgJiYKKyAgICAgICFnZXRNZW1JbmRleFJlZygpICYmIGdldE1lbVNjYWxlKCkgPT0gMTsKKyAgfQorCisgIGJvb2wgaXNOb1NlZ01lbSgpIGNvbnN0IHsKKyAgICByZXR1cm4gS2luZCA9PSBNZW1vcnkgJiYgIWdldE1lbVNlZ1JlZygpOworICB9CisKKyAgYm9vbCBpc1JlZygpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gUmVnaXN0ZXI7IH0KKworICB2b2lkIGFkZEV4cHIoTUNJbnN0ICZJbnN0LCBjb25zdCBNQ0V4cHIgKkV4cHIpIGNvbnN0IHsKKyAgICAvLyBBZGQgYXMgaW1tZWRpYXRlcyB3aGVuIHBvc3NpYmxlLgorICAgIGlmIChjb25zdCBNQ0NvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxNQ0NvbnN0YW50RXhwcj4oRXhwcikpCisgICAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oQ0UtPmdldFZhbHVlKCkpKTsKKyAgICBlbHNlCisgICAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVFeHByKEV4cHIpKTsKKyAgfQorCisgIHZvaWQgYWRkUmVnT3BlcmFuZHMoTUNJbnN0ICZJbnN0LCB1bnNpZ25lZCBOKSBjb25zdCB7CisgICAgYXNzZXJ0KE4gPT0gMSAmJiAiSW52YWxpZCBudW1iZXIgb2Ygb3BlcmFuZHMhIik7CisgICAgSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGdldFJlZygpKSk7CisgIH0KKworICB2b2lkIGFkZEltbU9wZXJhbmRzKE1DSW5zdCAmSW5zdCwgdW5zaWduZWQgTikgY29uc3QgeworICAgIGFzc2VydChOID09IDEgJiYgIkludmFsaWQgbnVtYmVyIG9mIG9wZXJhbmRzISIpOworICAgIGFkZEV4cHIoSW5zdCwgZ2V0SW1tKCkpOworICB9CisKKyAgdm9pZCBhZGRNZW1PcGVyYW5kcyhNQ0luc3QgJkluc3QsIHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoKE4gPT0gNSkgJiYgIkludmFsaWQgbnVtYmVyIG9mIG9wZXJhbmRzISIpOworICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRNZW1CYXNlUmVnKCkpKTsKKyAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oZ2V0TWVtU2NhbGUoKSkpOworICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRNZW1JbmRleFJlZygpKSk7CisgICAgYWRkRXhwcihJbnN0LCBnZXRNZW1EaXNwKCkpOworICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhnZXRNZW1TZWdSZWcoKSkpOworICB9CisKKyAgdm9pZCBhZGRBYnNNZW1PcGVyYW5kcyhNQ0luc3QgJkluc3QsIHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoKE4gPT0gMSkgJiYgIkludmFsaWQgbnVtYmVyIG9mIG9wZXJhbmRzISIpOworICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUV4cHIoZ2V0TWVtRGlzcCgpKSk7CisgIH0KKworICB2b2lkIGFkZE5vU2VnTWVtT3BlcmFuZHMoTUNJbnN0ICZJbnN0LCB1bnNpZ25lZCBOKSBjb25zdCB7CisgICAgYXNzZXJ0KChOID09IDQpICYmICJJbnZhbGlkIG51bWJlciBvZiBvcGVyYW5kcyEiKTsKKyAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0TWVtQmFzZVJlZygpKSk7CisgICAgSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlSW1tKGdldE1lbVNjYWxlKCkpKTsKKyAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoZ2V0TWVtSW5kZXhSZWcoKSkpOworICAgIGFkZEV4cHIoSW5zdCwgZ2V0TWVtRGlzcCgpKTsKKyAgfQorCisgIHN0YXRpYyBYODZPcGVyYW5kICpDcmVhdGVUb2tlbihTdHJpbmdSZWYgU3RyLCBTTUxvYyBMb2MpIHsKKyAgICBYODZPcGVyYW5kICpSZXMgPSBuZXcgWDg2T3BlcmFuZChUb2tlbiwgTG9jLCBMb2MpOworICAgIFJlcy0+VG9rLkRhdGEgPSBTdHIuZGF0YSgpOworICAgIFJlcy0+VG9rLkxlbmd0aCA9IFN0ci5zaXplKCk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIHN0YXRpYyBYODZPcGVyYW5kICpDcmVhdGVSZWcodW5zaWduZWQgUmVnTm8sIFNNTG9jIFN0YXJ0TG9jLCBTTUxvYyBFbmRMb2MpIHsKKyAgICBYODZPcGVyYW5kICpSZXMgPSBuZXcgWDg2T3BlcmFuZChSZWdpc3RlciwgU3RhcnRMb2MsIEVuZExvYyk7CisgICAgUmVzLT5SZWcuUmVnTm8gPSBSZWdObzsKKyAgICByZXR1cm4gUmVzOworICB9CisKKyAgc3RhdGljIFg4Nk9wZXJhbmQgKkNyZWF0ZUltbShjb25zdCBNQ0V4cHIgKlZhbCwgU01Mb2MgU3RhcnRMb2MsIFNNTG9jIEVuZExvYyl7CisgICAgWDg2T3BlcmFuZCAqUmVzID0gbmV3IFg4Nk9wZXJhbmQoSW1tZWRpYXRlLCBTdGFydExvYywgRW5kTG9jKTsKKyAgICBSZXMtPkltbS5WYWwgPSBWYWw7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIC8vLyBDcmVhdGUgYW4gYWJzb2x1dGUgbWVtb3J5IG9wZXJhbmQuCisgIHN0YXRpYyBYODZPcGVyYW5kICpDcmVhdGVNZW0oY29uc3QgTUNFeHByICpEaXNwLCBTTUxvYyBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBFbmRMb2MpIHsKKyAgICBYODZPcGVyYW5kICpSZXMgPSBuZXcgWDg2T3BlcmFuZChNZW1vcnksIFN0YXJ0TG9jLCBFbmRMb2MpOworICAgIFJlcy0+TWVtLlNlZ1JlZyAgID0gMDsKKyAgICBSZXMtPk1lbS5EaXNwICAgICA9IERpc3A7CisgICAgUmVzLT5NZW0uQmFzZVJlZyAgPSAwOworICAgIFJlcy0+TWVtLkluZGV4UmVnID0gMDsKKyAgICBSZXMtPk1lbS5TY2FsZSAgICA9IDE7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIC8vLyBDcmVhdGUgYSBnZW5lcmFsaXplZCBtZW1vcnkgb3BlcmFuZC4KKyAgc3RhdGljIFg4Nk9wZXJhbmQgKkNyZWF0ZU1lbSh1bnNpZ25lZCBTZWdSZWcsIGNvbnN0IE1DRXhwciAqRGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCYXNlUmVnLCB1bnNpZ25lZCBJbmRleFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTY2FsZSwgU01Mb2MgU3RhcnRMb2MsIFNNTG9jIEVuZExvYykgeworICAgIC8vIFdlIHNob3VsZCBuZXZlciBqdXN0IGhhdmUgYSBkaXNwbGFjZW1lbnQsIHRoYXQgc2hvdWxkIGJlIHBhcnNlZCBhcyBhbgorICAgIC8vIGFic29sdXRlIG1lbW9yeSBvcGVyYW5kLgorICAgIGFzc2VydCgoU2VnUmVnIHx8IEJhc2VSZWcgfHwgSW5kZXhSZWcpICYmICJJbnZhbGlkIG1lbW9yeSBvcGVyYW5kISIpOworCisgICAgLy8gVGhlIHNjYWxlIHNob3VsZCBhbHdheXMgYmUgb25lIG9mIHsxLDIsNCw4fS4KKyAgICBhc3NlcnQoKChTY2FsZSA9PSAxIHx8IFNjYWxlID09IDIgfHwgU2NhbGUgPT0gNCB8fCBTY2FsZSA9PSA4KSkgJiYKKyAgICAgICAgICAgIkludmFsaWQgc2NhbGUhIik7CisgICAgWDg2T3BlcmFuZCAqUmVzID0gbmV3IFg4Nk9wZXJhbmQoTWVtb3J5LCBTdGFydExvYywgRW5kTG9jKTsKKyAgICBSZXMtPk1lbS5TZWdSZWcgICA9IFNlZ1JlZzsKKyAgICBSZXMtPk1lbS5EaXNwICAgICA9IERpc3A7CisgICAgUmVzLT5NZW0uQmFzZVJlZyAgPSBCYXNlUmVnOworICAgIFJlcy0+TWVtLkluZGV4UmVnID0gSW5kZXhSZWc7CisgICAgUmVzLT5NZW0uU2NhbGUgICAgPSBTY2FsZTsKKyAgICByZXR1cm4gUmVzOworICB9Cit9OworCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlLgorCisKK2Jvb2wgWDg2QVRUQXNtUGFyc2VyOjpQYXJzZVJlZ2lzdGVyKHVuc2lnbmVkICZSZWdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jICZTdGFydExvYywgU01Mb2MgJkVuZExvYykgeworICBSZWdObyA9IDA7CisgIGNvbnN0IEFzbVRva2VuICZUb2tQZXJjZW50ID0gUGFyc2VyLmdldFRvaygpOworICBhc3NlcnQoVG9rUGVyY2VudC5pcyhBc21Ub2tlbjo6UGVyY2VudCkgJiYgIkludmFsaWQgdG9rZW4ga2luZCEiKTsKKyAgU3RhcnRMb2MgPSBUb2tQZXJjZW50LmdldExvYygpOworICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBwZXJjZW50IHRva2VuLgorCisgIGNvbnN0IEFzbVRva2VuICZUb2sgPSBQYXJzZXIuZ2V0VG9rKCk7CisgIGlmIChUb2suaXNOb3QoQXNtVG9rZW46OklkZW50aWZpZXIpKQorICAgIHJldHVybiBFcnJvcihUb2suZ2V0TG9jKCksICJpbnZhbGlkIHJlZ2lzdGVyIG5hbWUiKTsKKworICAvLyBGSVhNRTogVmFsaWRhdGUgcmVnaXN0ZXIgZm9yIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZTsgd2UgaGF2ZSB0byBkbworICAvLyB2YWxpZGF0aW9uIGxhdGVyLCBzbyBtYXliZSB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGlzIGhlcmUuCisgIFJlZ05vID0gTWF0Y2hSZWdpc3Rlck5hbWUoVG9rLmdldFN0cmluZygpKTsKKworICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZG9uZSB1c2luZyBSZXF1aXJlczxJbjMyQml0TW9kZT4gYW5kCisgIC8vIFJlcXVpcmVzPEluNjRCaXRNb2RlPiBzbyAiZWl6IiB1c2FnZSBpbiA2NC1iaXQgaW5zdHJ1Y3Rpb25zCisgIC8vIGNhbiBiZSBhbHNvIGNoZWNrZWQuCisgIGlmIChSZWdObyA9PSBYODY6OlJJWiAmJiAhSXM2NEJpdCkKKyAgICByZXR1cm4gRXJyb3IoVG9rLmdldExvYygpLCAicml6IHJlZ2lzdGVyIGluIDY0LWJpdCBtb2RlIG9ubHkiKTsKKworICAvLyBQYXJzZSAlc3QoMSkgYW5kICIlc3QiIGFzICIlc3QoMCkiCisgIGlmIChSZWdObyA9PSAwICYmIFRvay5nZXRTdHJpbmcoKSA9PSAic3QiKSB7CisgICAgUmVnTm8gPSBYODY6OlNUMDsKKyAgICBFbmRMb2MgPSBUb2suZ2V0TG9jKCk7CisgICAgUGFyc2VyLkxleCgpOyAvLyBFYXQgJ3N0JworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgJyg0KScgYWZ0ZXIgJXN0LgorICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpMUGFyZW4pKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIExleCB0aGUgcGFyZW4uCisgICAgZ2V0UGFyc2VyKCkuTGV4KCk7CisKKyAgICBjb25zdCBBc21Ub2tlbiAmSW50VG9rID0gUGFyc2VyLmdldFRvaygpOworICAgIGlmIChJbnRUb2suaXNOb3QoQXNtVG9rZW46OkludGVnZXIpKQorICAgICAgcmV0dXJuIEVycm9yKEludFRvay5nZXRMb2MoKSwgImV4cGVjdGVkIHN0YWNrIGluZGV4Iik7CisgICAgc3dpdGNoIChJbnRUb2suZ2V0SW50VmFsKCkpIHsKKyAgICBjYXNlIDA6IFJlZ05vID0gWDg2OjpTVDA7IGJyZWFrOworICAgIGNhc2UgMTogUmVnTm8gPSBYODY6OlNUMTsgYnJlYWs7CisgICAgY2FzZSAyOiBSZWdObyA9IFg4Njo6U1QyOyBicmVhazsKKyAgICBjYXNlIDM6IFJlZ05vID0gWDg2OjpTVDM7IGJyZWFrOworICAgIGNhc2UgNDogUmVnTm8gPSBYODY6OlNUNDsgYnJlYWs7CisgICAgY2FzZSA1OiBSZWdObyA9IFg4Njo6U1Q1OyBicmVhazsKKyAgICBjYXNlIDY6IFJlZ05vID0gWDg2OjpTVDY7IGJyZWFrOworICAgIGNhc2UgNzogUmVnTm8gPSBYODY6OlNUNzsgYnJlYWs7CisgICAgZGVmYXVsdDogcmV0dXJuIEVycm9yKEludFRvay5nZXRMb2MoKSwgImludmFsaWQgc3RhY2sgaW5kZXgiKTsKKyAgICB9CisKKyAgICBpZiAoZ2V0UGFyc2VyKCkuTGV4KCkuaXNOb3QoQXNtVG9rZW46OlJQYXJlbikpCisgICAgICByZXR1cm4gRXJyb3IoUGFyc2VyLmdldFRvaygpLmdldExvYygpLCAiZXhwZWN0ZWQgJyknIik7CisKKyAgICBFbmRMb2MgPSBUb2suZ2V0TG9jKCk7CisgICAgUGFyc2VyLkxleCgpOyAvLyBFYXQgJyknCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYgdGhpcyBpcyAiZGJbMC03XSIsIG1hdGNoIGl0IGFzIGFuIGFsaWFzCisgIC8vIGZvciBkclswLTddLgorICBpZiAoUmVnTm8gPT0gMCAmJiBUb2suZ2V0U3RyaW5nKCkuc2l6ZSgpID09IDMgJiYKKyAgICAgIFRvay5nZXRTdHJpbmcoKS5zdGFydHN3aXRoKCJkYiIpKSB7CisgICAgc3dpdGNoIChUb2suZ2V0U3RyaW5nKClbMl0pIHsKKyAgICBjYXNlICcwJzogUmVnTm8gPSBYODY6OkRSMDsgYnJlYWs7CisgICAgY2FzZSAnMSc6IFJlZ05vID0gWDg2OjpEUjE7IGJyZWFrOworICAgIGNhc2UgJzInOiBSZWdObyA9IFg4Njo6RFIyOyBicmVhazsKKyAgICBjYXNlICczJzogUmVnTm8gPSBYODY6OkRSMzsgYnJlYWs7CisgICAgY2FzZSAnNCc6IFJlZ05vID0gWDg2OjpEUjQ7IGJyZWFrOworICAgIGNhc2UgJzUnOiBSZWdObyA9IFg4Njo6RFI1OyBicmVhazsKKyAgICBjYXNlICc2JzogUmVnTm8gPSBYODY6OkRSNjsgYnJlYWs7CisgICAgY2FzZSAnNyc6IFJlZ05vID0gWDg2OjpEUjc7IGJyZWFrOworICAgIH0KKworICAgIGlmIChSZWdObyAhPSAwKSB7CisgICAgICBFbmRMb2MgPSBUb2suZ2V0TG9jKCk7CisgICAgICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBpdC4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBpZiAoUmVnTm8gPT0gMCkKKyAgICByZXR1cm4gRXJyb3IoVG9rLmdldExvYygpLCAiaW52YWxpZCByZWdpc3RlciBuYW1lIik7CisKKyAgRW5kTG9jID0gVG9rLmdldExvYygpOworICBQYXJzZXIuTGV4KCk7IC8vIEVhdCBpZGVudGlmaWVyIHRva2VuLgorICByZXR1cm4gZmFsc2U7Cit9CisKK1g4Nk9wZXJhbmQgKlg4NkFUVEFzbVBhcnNlcjo6UGFyc2VPcGVyYW5kKCkgeworICBzd2l0Y2ggKGdldExleGVyKCkuZ2V0S2luZCgpKSB7CisgIGRlZmF1bHQ6CisgICAgLy8gUGFyc2UgYSBtZW1vcnkgb3BlcmFuZCB3aXRoIG5vIHNlZ21lbnQgcmVnaXN0ZXIuCisgICAgcmV0dXJuIFBhcnNlTWVtT3BlcmFuZCgwLCBQYXJzZXIuZ2V0VG9rKCkuZ2V0TG9jKCkpOworICBjYXNlIEFzbVRva2VuOjpQZXJjZW50OiB7CisgICAgLy8gUmVhZCB0aGUgcmVnaXN0ZXIuCisgICAgdW5zaWduZWQgUmVnTm87CisgICAgU01Mb2MgU3RhcnQsIEVuZDsKKyAgICBpZiAoUGFyc2VSZWdpc3RlcihSZWdObywgU3RhcnQsIEVuZCkpIHJldHVybiAwOworICAgIGlmIChSZWdObyA9PSBYODY6OkVJWiB8fCBSZWdObyA9PSBYODY6OlJJWikgeworICAgICAgRXJyb3IoU3RhcnQsICJlaXogYW5kIHJpeiBjYW4gb25seSBiZSB1c2VkIGFzIGluZGV4IHJlZ2lzdGVycyIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBpcyBhIHNlZ21lbnQgcmVnaXN0ZXIgZm9sbG93ZWQgYnkgYSAnOicsIHRoZW4gdGhpcyBpcyB0aGUgc3RhcnQKKyAgICAvLyBvZiBhIG1lbW9yeSByZWZlcmVuY2UsIG90aGVyd2lzZSB0aGlzIGlzIGEgbm9ybWFsIHJlZ2lzdGVyIHJlZmVyZW5jZS4KKyAgICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6Q29sb24pKQorICAgICAgcmV0dXJuIFg4Nk9wZXJhbmQ6OkNyZWF0ZVJlZyhSZWdObywgU3RhcnQsIEVuZCk7CisKKworICAgIGdldFBhcnNlcigpLkxleCgpOyAvLyBFYXQgdGhlIGNvbG9uLgorICAgIHJldHVybiBQYXJzZU1lbU9wZXJhbmQoUmVnTm8sIFN0YXJ0KTsKKyAgfQorICBjYXNlIEFzbVRva2VuOjpEb2xsYXI6IHsKKyAgICAvLyAkNDIgLT4gaW1tZWRpYXRlLgorICAgIFNNTG9jIFN0YXJ0ID0gUGFyc2VyLmdldFRvaygpLmdldExvYygpLCBFbmQ7CisgICAgUGFyc2VyLkxleCgpOworICAgIGNvbnN0IE1DRXhwciAqVmFsOworICAgIGlmIChnZXRQYXJzZXIoKS5QYXJzZUV4cHJlc3Npb24oVmFsLCBFbmQpKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFg4Nk9wZXJhbmQ6OkNyZWF0ZUltbShWYWwsIFN0YXJ0LCBFbmQpOworICB9CisgIH0KK30KKworLy8vIFBhcnNlTWVtT3BlcmFuZDogc2VnbWVudDogZGlzcChiYXNlcmVnLCBpbmRleHJlZywgc2NhbGUpLiAgVGhlICclZHM6JyBwcmVmaXgKKy8vLyBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCBpZiBwcmVzZW50LgorWDg2T3BlcmFuZCAqWDg2QVRUQXNtUGFyc2VyOjpQYXJzZU1lbU9wZXJhbmQodW5zaWduZWQgU2VnUmVnLCBTTUxvYyBNZW1TdGFydCkgeworCisgIC8vIFdlIGhhdmUgdG8gZGlzYW1iaWd1YXRlIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uICIoNCs1KSIgZnJvbSB0aGUgc3RhcnQKKyAgLy8gb2YgYSBtZW1vcnkgb3BlcmFuZCB3aXRoIGEgbWlzc2luZyBkaXNwbGFjZW1lbnQgIiglZWJ4KSIgb3IgIigsJWVheCkiLiAgVGhlCisgIC8vIG9ubHkgd2F5IHRvIGRvIHRoaXMgd2l0aG91dCBsb29rYWhlYWQgaXMgdG8gZWF0IHRoZSAnKCcgYW5kIHNlZSB3aGF0IGlzCisgIC8vIGFmdGVyIGl0LgorICBjb25zdCBNQ0V4cHIgKkRpc3AgPSBNQ0NvbnN0YW50RXhwcjo6Q3JlYXRlKDAsIGdldFBhcnNlcigpLmdldENvbnRleHQoKSk7CisgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpMUGFyZW4pKSB7CisgICAgU01Mb2MgRXhwckVuZDsKKyAgICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VFeHByZXNzaW9uKERpc3AsIEV4cHJFbmQpKSByZXR1cm4gMDsKKworICAgIC8vIEFmdGVyIHBhcnNpbmcgdGhlIGJhc2UgZXhwcmVzc2lvbiB3ZSBjb3VsZCBlaXRoZXIgaGF2ZSBhIHBhcmVudGhlc2l6ZWQKKyAgICAvLyBtZW1vcnkgYWRkcmVzcyBvciBub3QuICBJZiBub3QsIHJldHVybiBub3cuICBJZiBzbywgZWF0IHRoZSAoLgorICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpMUGFyZW4pKSB7CisgICAgICAvLyBVbmxlc3Mgd2UgaGF2ZSBhIHNlZ21lbnQgcmVnaXN0ZXIsIHRyZWF0IHRoaXMgYXMgYW4gaW1tZWRpYXRlLgorICAgICAgaWYgKFNlZ1JlZyA9PSAwKQorICAgICAgICByZXR1cm4gWDg2T3BlcmFuZDo6Q3JlYXRlTWVtKERpc3AsIE1lbVN0YXJ0LCBFeHByRW5kKTsKKyAgICAgIHJldHVybiBYODZPcGVyYW5kOjpDcmVhdGVNZW0oU2VnUmVnLCBEaXNwLCAwLCAwLCAxLCBNZW1TdGFydCwgRXhwckVuZCk7CisgICAgfQorCisgICAgLy8gRWF0IHRoZSAnKCcuCisgICAgUGFyc2VyLkxleCgpOworICB9IGVsc2UgeworICAgIC8vIE9rYXksIHdlIGhhdmUgYSAnKCcuICBXZSBkb24ndCBrbm93IGlmIHRoaXMgaXMgYW4gZXhwcmVzc2lvbiBvciBub3QsIGJ1dAorICAgIC8vIHNvIHdlIGhhdmUgdG8gZWF0IHRoZSAoIHRvIHNlZSBiZXlvbmQgaXQuCisgICAgU01Mb2MgTFBhcmVuTG9jID0gUGFyc2VyLmdldFRvaygpLmdldExvYygpOworICAgIFBhcnNlci5MZXgoKTsgLy8gRWF0IHRoZSAnKCcuCisKKyAgICBpZiAoZ2V0TGV4ZXIoKS5pcyhBc21Ub2tlbjo6UGVyY2VudCkgfHwgZ2V0TGV4ZXIoKS5pcyhBc21Ub2tlbjo6Q29tbWEpKSB7CisgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUsIGZhbGwgaW50byB0aGUgY29kZSBiZWxvdyB3aXRoIHRoZSAnKCcgcGFydCBvZiB0aGUKKyAgICAgIC8vIG1lbW9yeSBvcGVyYW5kIGNvbnN1bWVkLgorICAgIH0gZWxzZSB7CisgICAgICBTTUxvYyBFeHByRW5kOworCisgICAgICAvLyBJdCBtdXN0IGJlIGFuIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiwgcGFyc2UgaXQgbm93LgorICAgICAgaWYgKGdldFBhcnNlcigpLlBhcnNlUGFyZW5FeHByZXNzaW9uKERpc3AsIEV4cHJFbmQpKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgLy8gQWZ0ZXIgcGFyc2luZyB0aGUgYmFzZSBleHByZXNzaW9uIHdlIGNvdWxkIGVpdGhlciBoYXZlIGEgcGFyZW50aGVzaXplZAorICAgICAgLy8gbWVtb3J5IGFkZHJlc3Mgb3Igbm90LiAgSWYgbm90LCByZXR1cm4gbm93LiAgSWYgc28sIGVhdCB0aGUgKC4KKyAgICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpMUGFyZW4pKSB7CisgICAgICAgIC8vIFVubGVzcyB3ZSBoYXZlIGEgc2VnbWVudCByZWdpc3RlciwgdHJlYXQgdGhpcyBhcyBhbiBpbW1lZGlhdGUuCisgICAgICAgIGlmIChTZWdSZWcgPT0gMCkKKyAgICAgICAgICByZXR1cm4gWDg2T3BlcmFuZDo6Q3JlYXRlTWVtKERpc3AsIExQYXJlbkxvYywgRXhwckVuZCk7CisgICAgICAgIHJldHVybiBYODZPcGVyYW5kOjpDcmVhdGVNZW0oU2VnUmVnLCBEaXNwLCAwLCAwLCAxLCBNZW1TdGFydCwgRXhwckVuZCk7CisgICAgICB9CisKKyAgICAgIC8vIEVhdCB0aGUgJygnLgorICAgICAgUGFyc2VyLkxleCgpOworICAgIH0KKyAgfQorCisgIC8vIElmIHdlIHJlYWNoZWQgaGVyZSwgdGhlbiB3ZSBqdXN0IGF0ZSB0aGUgKCBvZiB0aGUgbWVtb3J5IG9wZXJhbmQuICBQcm9jZXNzCisgIC8vIHRoZSByZXN0IG9mIHRoZSBtZW1vcnkgb3BlcmFuZC4KKyAgdW5zaWduZWQgQmFzZVJlZyA9IDAsIEluZGV4UmVnID0gMCwgU2NhbGUgPSAxOworCisgIGlmIChnZXRMZXhlcigpLmlzKEFzbVRva2VuOjpQZXJjZW50KSkgeworICAgIFNNTG9jIEw7CisgICAgaWYgKFBhcnNlUmVnaXN0ZXIoQmFzZVJlZywgTCwgTCkpIHJldHVybiAwOworICAgIGlmIChCYXNlUmVnID09IFg4Njo6RUlaIHx8IEJhc2VSZWcgPT0gWDg2OjpSSVopIHsKKyAgICAgIEVycm9yKEwsICJlaXogYW5kIHJpeiBjYW4gb25seSBiZSB1c2VkIGFzIGluZGV4IHJlZ2lzdGVycyIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKGdldExleGVyKCkuaXMoQXNtVG9rZW46OkNvbW1hKSkgeworICAgIFBhcnNlci5MZXgoKTsgLy8gRWF0IHRoZSBjb21tYS4KKworICAgIC8vIEZvbGxvd2luZyB0aGUgY29tbWEgd2Ugc2hvdWxkIGhhdmUgZWl0aGVyIGFuIGluZGV4IHJlZ2lzdGVyLCBvciBhIHNjYWxlCisgICAgLy8gdmFsdWUuIFdlIGRvbid0IHN1cHBvcnQgdGhlIGxhdGVyIGZvcm0sIGJ1dCB3ZSB3YW50IHRvIHBhcnNlIGl0CisgICAgLy8gY29ycmVjdGx5LgorICAgIC8vCisgICAgLy8gTm90IHRoYXQgZXZlbiB0aG91Z2ggaXQgd291bGQgYmUgY29tcGxldGVseSBjb25zaXN0ZW50IHRvIHN1cHBvcnQgc3ludGF4CisgICAgLy8gbGlrZSAiMSglZWF4LCwxKSIsIHRoZSBhc3NlbWJsZXIgZG9lc24ndC4gVXNlICJlaXoiIG9yICJyaXoiIGZvciB0aGlzLgorICAgIGlmIChnZXRMZXhlcigpLmlzKEFzbVRva2VuOjpQZXJjZW50KSkgeworICAgICAgU01Mb2MgTDsKKyAgICAgIGlmIChQYXJzZVJlZ2lzdGVyKEluZGV4UmVnLCBMLCBMKSkgcmV0dXJuIDA7CisKKyAgICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpSUGFyZW4pKSB7CisgICAgICAgIC8vIFBhcnNlIHRoZSBzY2FsZSBhbW91bnQ6CisgICAgICAgIC8vICA6Oj0gJywnIFtzY2FsZS1leHByZXNzaW9uXQorICAgICAgICBpZiAoZ2V0TGV4ZXIoKS5pc05vdChBc21Ub2tlbjo6Q29tbWEpKSB7CisgICAgICAgICAgRXJyb3IoUGFyc2VyLmdldFRvaygpLmdldExvYygpLAorICAgICAgICAgICAgICAgICJleHBlY3RlZCBjb21tYSBpbiBzY2FsZSBleHByZXNzaW9uIik7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgUGFyc2VyLkxleCgpOyAvLyBFYXQgdGhlIGNvbW1hLgorCisgICAgICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpSUGFyZW4pKSB7CisgICAgICAgICAgU01Mb2MgTG9jID0gUGFyc2VyLmdldFRvaygpLmdldExvYygpOworCisgICAgICAgICAgaW50NjRfdCBTY2FsZVZhbDsKKyAgICAgICAgICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VBYnNvbHV0ZUV4cHJlc3Npb24oU2NhbGVWYWwpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgc2NhbGUgYW1vdW50LgorICAgICAgICAgIGlmIChTY2FsZVZhbCAhPSAxICYmIFNjYWxlVmFsICE9IDIgJiYgU2NhbGVWYWwgIT0gNCAmJiBTY2FsZVZhbCAhPSA4KXsKKyAgICAgICAgICAgIEVycm9yKExvYywgInNjYWxlIGZhY3RvciBpbiBhZGRyZXNzIG11c3QgYmUgMSwgMiwgNCBvciA4Iik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgU2NhbGUgPSAodW5zaWduZWQpU2NhbGVWYWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OlJQYXJlbikpIHsKKyAgICAgIC8vIE90aGVyd2lzZSB3ZSBoYXZlIHRoZSB1bnN1cHBvcnRlZCBmb3JtIG9mIGEgc2NhbGUgYW1vdW50IHdpdGhvdXQgYW4KKyAgICAgIC8vIGluZGV4LgorICAgICAgU01Mb2MgTG9jID0gUGFyc2VyLmdldFRvaygpLmdldExvYygpOworCisgICAgICBpbnQ2NF90IFZhbHVlOworICAgICAgaWYgKGdldFBhcnNlcigpLlBhcnNlQWJzb2x1dGVFeHByZXNzaW9uKFZhbHVlKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIEVycm9yKExvYywgImNhbm5vdCBoYXZlIHNjYWxlIGZhY3RvciB3aXRob3V0IGluZGV4IHJlZ2lzdGVyIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICAvLyBPaywgd2UndmUgZWF0ZW4gdGhlIG1lbW9yeSBvcGVyYW5kLCB2ZXJpZnkgd2UgaGF2ZSBhICcpJyBhbmQgZWF0IGl0IHRvby4KKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OlJQYXJlbikpIHsKKyAgICBFcnJvcihQYXJzZXIuZ2V0VG9rKCkuZ2V0TG9jKCksICJ1bmV4cGVjdGVkIHRva2VuIGluIG1lbW9yeSBvcGVyYW5kIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgU01Mb2MgTWVtRW5kID0gUGFyc2VyLmdldFRvaygpLmdldExvYygpOworICBQYXJzZXIuTGV4KCk7IC8vIEVhdCB0aGUgJyknLgorCisgIHJldHVybiBYODZPcGVyYW5kOjpDcmVhdGVNZW0oU2VnUmVnLCBEaXNwLCBCYXNlUmVnLCBJbmRleFJlZywgU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU3RhcnQsIE1lbUVuZCk7Cit9CisKK2Jvb2wgWDg2QVRUQXNtUGFyc2VyOjoKK1BhcnNlSW5zdHJ1Y3Rpb24oU3RyaW5nUmVmIE5hbWUsIFNNTG9jIE5hbWVMb2MsCisgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNQ1BhcnNlZEFzbU9wZXJhbmQqPiAmT3BlcmFuZHMpIHsKKyAgLy8gVGhlIHZhcmlvdXMgZmxhdm9ycyBvZiBwdXNoZiBhbmQgcG9wZiB1c2UgUmVxdWlyZXM8SW4zMkJpdE1vZGU+IGFuZAorICAvLyBSZXF1aXJlczxJbjY0Qml0TW9kZT4sIGJ1dCB0aGUgYXNzZW1ibGVyIGRvZXNuJ3QgeWV0IGltcGxlbWVudCB0aGF0LgorICAvLyBGb3Igbm93LCBqdXN0IGRvIGEgbWFudWFsIGNoZWNrIHRvIHByZXZlbnQgc2lsZW50IG1pc2VuY29kaW5nLgorICBpZiAoSXM2NEJpdCkgeworICAgIGlmIChOYW1lID09ICJwb3BmbCIpCisgICAgICByZXR1cm4gRXJyb3IoTmFtZUxvYywgInBvcGZsIGNhbm5vdCBiZSBlbmNvZGVkIGluIDY0LWJpdCBtb2RlIik7CisgICAgZWxzZSBpZiAoTmFtZSA9PSAicHVzaGZsIikKKyAgICAgIHJldHVybiBFcnJvcihOYW1lTG9jLCAicHVzaGZsIGNhbm5vdCBiZSBlbmNvZGVkIGluIDY0LWJpdCBtb2RlIik7CisgICAgZWxzZSBpZiAoTmFtZSA9PSAicHVzaGEiKQorICAgICAgcmV0dXJuIEVycm9yKE5hbWVMb2MsICJwdXNoYSBjYW5ub3QgYmUgZW5jb2RlZCBpbiA2NC1iaXQgbW9kZSIpOworICB9IGVsc2UgeworICAgIGlmIChOYW1lID09ICJwb3BmcSIpCisgICAgICByZXR1cm4gRXJyb3IoTmFtZUxvYywgInBvcGZxIGNhbm5vdCBiZSBlbmNvZGVkIGluIDMyLWJpdCBtb2RlIik7CisgICAgZWxzZSBpZiAoTmFtZSA9PSAicHVzaGZxIikKKyAgICAgIHJldHVybiBFcnJvcihOYW1lTG9jLCAicHVzaGZxIGNhbm5vdCBiZSBlbmNvZGVkIGluIDMyLWJpdCBtb2RlIik7CisgIH0KKworICAvLyBUaGUgIkp1bXAgaWYgckNYIFplcm8iIGZvcm0gamN4eiBpcyBub3QgYWxsb3dlZCBpbiA2NC1iaXQgbW9kZSBhbmQKKyAgLy8gdGhlIGZvcm0ganJjeHogaXMgbm90IGFsbG93ZWQgaW4gMzItYml0IG1vZGUuCisgIGlmIChJczY0Qml0KSB7CisgICAgaWYgKE5hbWUgPT0gImpjeHoiKQorICAgICAgcmV0dXJuIEVycm9yKE5hbWVMb2MsICJqY3h6IGNhbm5vdCBiZSBlbmNvZGVkIGluIDY0LWJpdCBtb2RlIik7CisgIH0gZWxzZSB7CisgICAgaWYgKE5hbWUgPT0gImpyY3h6IikKKyAgICAgIHJldHVybiBFcnJvcihOYW1lTG9jLCAianJjeHogY2Fubm90IGJlIGVuY29kZWQgaW4gMzItYml0IG1vZGUiKTsKKyAgfQorCisgIC8vIEZJWE1FOiBIYWNrIHRvIHJlY29nbml6ZSAic2FsLi4uIiBhbmQgInJlcC4uLiIgZm9yIG5vdy4gV2UgbmVlZCBhIHdheSB0bworICAvLyByZXByZXNlbnQgYWx0ZXJuYXRpdmUgc3ludGF4ZXMgaW4gdGhlIC50ZCBmaWxlLCB3aXRob3V0IHJlcXVpcmluZworICAvLyBpbnN0cnVjdGlvbiBkdXBsaWNhdGlvbi4KKyAgU3RyaW5nUmVmIFBhdGNoZWROYW1lID0gU3RyaW5nU3dpdGNoPFN0cmluZ1JlZj4oTmFtZSkKKyAgICAuQ2FzZSgic2FsIiwgInNobCIpCisgICAgLkNhc2UoInNhbGIiLCAic2hsYiIpCisgICAgLkNhc2UoInNhbGwiLCAic2hsbCIpCisgICAgLkNhc2UoInNhbHEiLCAic2hscSIpCisgICAgLkNhc2UoInNhbHciLCAic2hsdyIpCisgICAgLkNhc2UoInJlcGUiLCAicmVwIikKKyAgICAuQ2FzZSgicmVweiIsICJyZXAiKQorICAgIC5DYXNlKCJyZXBueiIsICJyZXBuZSIpCisgICAgLkNhc2UoInB1c2hmIiwgSXM2NEJpdCA/ICJwdXNoZnEiIDogInB1c2hmbCIpCisgICAgLkNhc2UoInBvcGYiLCAgSXM2NEJpdCA/ICJwb3BmcSIgIDogInBvcGZsIikKKyAgICAuQ2FzZSgicmV0bCIsIElzNjRCaXQgPyAicmV0bCIgOiAicmV0IikKKyAgICAuQ2FzZSgicmV0cSIsIElzNjRCaXQgPyAicmV0IiA6ICJyZXRxIikKKyAgICAuQ2FzZSgic2V0eiIsICJzZXRlIikKKyAgICAuQ2FzZSgic2V0bnoiLCAic2V0bmUiKQorICAgIC5DYXNlKCJqeiIsICJqZSIpCisgICAgLkNhc2UoImpueiIsICJqbmUiKQorICAgIC5DYXNlKCJqYyIsICJqYiIpCisgICAgLy8gRklYTUU6IGluIDMyLWJpdCBtb2RlIGpjeHogcmVxdWlyZXMgYW4gQWRTaXplIHByZWZpeC4gSW4gNjQtYml0IG1vZGUKKyAgICAvLyBqZWN4eiByZXF1aXJlcyBhbiBBZFNpemUgcHJlZml4IGJ1dCBqZWN4eiBkb2VzIG5vdCBoYXZlIGEgcHJlZml4IGluCisgICAgLy8gMzItYml0IG1vZGUuCisgICAgLkNhc2UoImplY3h6IiwgImpjeHoiKQorICAgIC5DYXNlKCJqcmN4eiIsICJqY3h6IikKKyAgICAuQ2FzZSgiam5hIiwgImpiZSIpCisgICAgLkNhc2UoImpuYWUiLCAiamIiKQorICAgIC5DYXNlKCJqbmIiLCAiamFlIikKKyAgICAuQ2FzZSgiam5iZSIsICJqYSIpCisgICAgLkNhc2UoImpuYyIsICJqYWUiKQorICAgIC5DYXNlKCJqbmciLCAiamxlIikKKyAgICAuQ2FzZSgiam5nZSIsICJqbCIpCisgICAgLkNhc2UoImpubCIsICJqZ2UiKQorICAgIC5DYXNlKCJqbmxlIiwgImpnIikKKyAgICAuQ2FzZSgianBlIiwgImpwIikKKyAgICAuQ2FzZSgianBvIiwgImpucCIpCisgICAgLkNhc2UoImNtb3ZjbCIsICJjbW92YmwiKQorICAgIC5DYXNlKCJjbW92Y2wiLCAiY21vdmJsIikKKyAgICAuQ2FzZSgiY21vdm5hbCIsICJjbW92YmVsIikKKyAgICAuQ2FzZSgiY21vdm5ibCIsICJjbW92YWVsIikKKyAgICAuQ2FzZSgiY21vdm5iZWwiLCAiY21vdmFsIikKKyAgICAuQ2FzZSgiY21vdm5jbCIsICJjbW92YWVsIikKKyAgICAuQ2FzZSgiY21vdm5nbCIsICJjbW92bGVsIikKKyAgICAuQ2FzZSgiY21vdm5sIiwgImNtb3ZnZWwiKQorICAgIC5DYXNlKCJjbW92bmdsIiwgImNtb3ZsZWwiKQorICAgIC5DYXNlKCJjbW92bmdlbCIsICJjbW92bGwiKQorICAgIC5DYXNlKCJjbW92bmxsIiwgImNtb3ZnZWwiKQorICAgIC5DYXNlKCJjbW92bmxlbCIsICJjbW92Z2wiKQorICAgIC5DYXNlKCJjbW92bnpsIiwgImNtb3ZuZWwiKQorICAgIC5DYXNlKCJjbW92emwiLCAiY21vdmVsIikKKyAgICAuQ2FzZSgiZndhaXQiLCAid2FpdCIpCisgICAgLkNhc2UoIm1vdnp4IiwgIm1vdnpiIikKKyAgICAuRGVmYXVsdChOYW1lKTsKKworICAvLyBGSVhNRTogSGFjayB0byByZWNvZ25pemUgY21wPGNvbXBhcmlzb24gY29kZT57c3Msc2QscHMscGR9LgorICBjb25zdCBNQ0V4cHIgKkV4dHJhSW1tT3AgPSAwOworICBpZiAoKFBhdGNoZWROYW1lLnN0YXJ0c3dpdGgoImNtcCIpIHx8IFBhdGNoZWROYW1lLnN0YXJ0c3dpdGgoInZjbXAiKSkgJiYKKyAgICAgIChQYXRjaGVkTmFtZS5lbmRzd2l0aCgic3MiKSB8fCBQYXRjaGVkTmFtZS5lbmRzd2l0aCgic2QiKSB8fAorICAgICAgIFBhdGNoZWROYW1lLmVuZHN3aXRoKCJwcyIpIHx8IFBhdGNoZWROYW1lLmVuZHN3aXRoKCJwZCIpKSkgeworICAgIGJvb2wgSXNWQ01QID0gUGF0Y2hlZE5hbWUuc3RhcnRzd2l0aCgidmNtcCIpOworICAgIHVuc2lnbmVkIFNTRUNDSWR4ID0gSXNWQ01QID8gNCA6IDM7CisgICAgdW5zaWduZWQgU1NFQ29tcGFyaXNvbkNvZGUgPSBTdHJpbmdTd2l0Y2g8dW5zaWduZWQ+KAorICAgICAgUGF0Y2hlZE5hbWUuc2xpY2UoU1NFQ0NJZHgsIFBhdGNoZWROYW1lLnNpemUoKSAtIDIpKQorICAgICAgLkNhc2UoImVxIiwgICAgICAgICAgMCkKKyAgICAgIC5DYXNlKCJsdCIsICAgICAgICAgIDEpCisgICAgICAuQ2FzZSgibGUiLCAgICAgICAgICAyKQorICAgICAgLkNhc2UoInVub3JkIiwgICAgICAgMykKKyAgICAgIC5DYXNlKCJuZXEiLCAgICAgICAgIDQpCisgICAgICAuQ2FzZSgibmx0IiwgICAgICAgICA1KQorICAgICAgLkNhc2UoIm5sZSIsICAgICAgICAgNikKKyAgICAgIC5DYXNlKCJvcmQiLCAgICAgICAgIDcpCisgICAgICAuQ2FzZSgiZXFfdXEiLCAgICAgICA4KQorICAgICAgLkNhc2UoIm5nZSIsICAgICAgICAgOSkKKyAgICAgIC5DYXNlKCJuZ3QiLCAgICAgIDB4MEEpCisgICAgICAuQ2FzZSgiZmFsc2UiLCAgICAweDBCKQorICAgICAgLkNhc2UoIm5lcV9vcSIsICAgMHgwQykKKyAgICAgIC5DYXNlKCJnZSIsICAgICAgIDB4MEQpCisgICAgICAuQ2FzZSgiZ3QiLCAgICAgICAweDBFKQorICAgICAgLkNhc2UoInRydWUiLCAgICAgMHgwRikKKyAgICAgIC5DYXNlKCJlcV9vcyIsICAgIDB4MTApCisgICAgICAuQ2FzZSgibHRfb3EiLCAgICAweDExKQorICAgICAgLkNhc2UoImxlX29xIiwgICAgMHgxMikKKyAgICAgIC5DYXNlKCJ1bm9yZF9zIiwgIDB4MTMpCisgICAgICAuQ2FzZSgibmVxX3VzIiwgICAweDE0KQorICAgICAgLkNhc2UoIm5sdF91cSIsICAgMHgxNSkKKyAgICAgIC5DYXNlKCJubGVfdXEiLCAgIDB4MTYpCisgICAgICAuQ2FzZSgib3JkX3MiLCAgICAweDE3KQorICAgICAgLkNhc2UoImVxX3VzIiwgICAgMHgxOCkKKyAgICAgIC5DYXNlKCJuZ2VfdXEiLCAgIDB4MTkpCisgICAgICAuQ2FzZSgibmd0X3VxIiwgICAweDFBKQorICAgICAgLkNhc2UoImZhbHNlX29zIiwgMHgxQikKKyAgICAgIC5DYXNlKCJuZXFfb3MiLCAgIDB4MUMpCisgICAgICAuQ2FzZSgiZ2Vfb3EiLCAgICAweDFEKQorICAgICAgLkNhc2UoImd0X29xIiwgICAgMHgxRSkKKyAgICAgIC5DYXNlKCJ0cnVlX3VzIiwgIDB4MUYpCisgICAgICAuRGVmYXVsdCh+MFUpOworICAgIGlmIChTU0VDb21wYXJpc29uQ29kZSAhPSB+MFUpIHsKKyAgICAgIEV4dHJhSW1tT3AgPSBNQ0NvbnN0YW50RXhwcjo6Q3JlYXRlKFNTRUNvbXBhcmlzb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2VyKCkuZ2V0Q29udGV4dCgpKTsKKyAgICAgIGlmIChQYXRjaGVkTmFtZS5lbmRzd2l0aCgic3MiKSkgeworICAgICAgICBQYXRjaGVkTmFtZSA9IElzVkNNUCA/ICJ2Y21wc3MiIDogImNtcHNzIjsKKyAgICAgIH0gZWxzZSBpZiAoUGF0Y2hlZE5hbWUuZW5kc3dpdGgoInNkIikpIHsKKyAgICAgICAgUGF0Y2hlZE5hbWUgPSBJc1ZDTVAgPyAidmNtcHNkIiA6ICJjbXBzZCI7CisgICAgICB9IGVsc2UgaWYgKFBhdGNoZWROYW1lLmVuZHN3aXRoKCJwcyIpKSB7CisgICAgICAgIFBhdGNoZWROYW1lID0gSXNWQ01QID8gInZjbXBwcyIgOiAiY21wcHMiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KFBhdGNoZWROYW1lLmVuZHN3aXRoKCJwZCIpICYmICJVbmV4cGVjdGVkIG1uZW1vbmljISIpOworICAgICAgICBQYXRjaGVkTmFtZSA9IElzVkNNUCA/ICJ2Y21wcGQiIDogImNtcHBkIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBGSVhNRTogSGFjayB0byByZWNvZ25pemUgdnBjbG11bDxzcmMxX3F1YWR3b3JkLCBzcmMyX3F1YWR3b3JkPmRxCisgIGlmIChQYXRjaGVkTmFtZS5zdGFydHN3aXRoKCJ2cGNsbXVsIikpIHsKKyAgICB1bnNpZ25lZCBDTE1VTFF1YWRXb3JkU2VsZWN0ID0gU3RyaW5nU3dpdGNoPHVuc2lnbmVkPigKKyAgICAgIFBhdGNoZWROYW1lLnNsaWNlKDcsIFBhdGNoZWROYW1lLnNpemUoKSAtIDIpKQorICAgICAgLkNhc2UoImxxbHEiLCAweDAwKSAvLyBzcmMxWzYzOjBdLCAgIHNyYzJbNjM6MF0KKyAgICAgIC5DYXNlKCJocWxxIiwgMHgwMSkgLy8gc3JjMVsxMjc6NjRdLCBzcmMyWzYzOjBdCisgICAgICAuQ2FzZSgibHFocSIsIDB4MTApIC8vIHNyYzFbNjM6MF0sICAgc3JjMlsxMjc6NjRdCisgICAgICAuQ2FzZSgiaHFocSIsIDB4MTEpIC8vIHNyYzFbMTI3OjY0XSwgc3JjMlsxMjc6NjRdCisgICAgICAuRGVmYXVsdCh+MFUpOworICAgIGlmIChDTE1VTFF1YWRXb3JkU2VsZWN0ICE9IH4wVSkgeworICAgICAgRXh0cmFJbW1PcCA9IE1DQ29uc3RhbnRFeHByOjpDcmVhdGUoQ0xNVUxRdWFkV29yZFNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhcnNlcigpLmdldENvbnRleHQoKSk7CisgICAgICBhc3NlcnQoUGF0Y2hlZE5hbWUuZW5kc3dpdGgoImRxIikgJiYgIlVuZXhwZWN0ZWQgbW5lbW9uaWMhIik7CisgICAgICBQYXRjaGVkTmFtZSA9ICJ2cGNsbXVscWRxIjsKKyAgICB9CisgIH0KKyAgT3BlcmFuZHMucHVzaF9iYWNrKFg4Nk9wZXJhbmQ6OkNyZWF0ZVRva2VuKFBhdGNoZWROYW1lLCBOYW1lTG9jKSk7CisKKyAgaWYgKEV4dHJhSW1tT3ApCisgICAgT3BlcmFuZHMucHVzaF9iYWNrKFg4Nk9wZXJhbmQ6OkNyZWF0ZUltbShFeHRyYUltbU9wLCBOYW1lTG9jLCBOYW1lTG9jKSk7CisKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkgeworCisgICAgLy8gUGFyc2UgJyonIG1vZGlmaWVyLgorICAgIGlmIChnZXRMZXhlcigpLmlzKEFzbVRva2VuOjpTdGFyKSkgeworICAgICAgU01Mb2MgTG9jID0gUGFyc2VyLmdldFRvaygpLmdldExvYygpOworICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKFg4Nk9wZXJhbmQ6OkNyZWF0ZVRva2VuKCIqIiwgTG9jKSk7CisgICAgICBQYXJzZXIuTGV4KCk7IC8vIEVhdCB0aGUgc3Rhci4KKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBmaXJzdCBvcGVyYW5kLgorICAgIGlmIChYODZPcGVyYW5kICpPcCA9IFBhcnNlT3BlcmFuZCgpKQorICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKE9wKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHdoaWxlIChnZXRMZXhlcigpLmlzKEFzbVRva2VuOjpDb21tYSkpIHsKKyAgICAgIFBhcnNlci5MZXgoKTsgIC8vIEVhdCB0aGUgY29tbWEuCisKKyAgICAgIC8vIFBhcnNlIGFuZCByZW1lbWJlciB0aGUgb3BlcmFuZC4KKyAgICAgIGlmIChYODZPcGVyYW5kICpPcCA9IFBhcnNlT3BlcmFuZCgpKQorICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soT3ApOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBGSVhNRTogSGFjayB0byBoYW5kbGUgcmVjb2duaXppbmcgc3tocixhcixobH0/ICQxLgorICBpZiAoKE5hbWUuc3RhcnRzd2l0aCgic2hyIikgfHwgTmFtZS5zdGFydHN3aXRoKCJzYXIiKSB8fAorICAgICAgIE5hbWUuc3RhcnRzd2l0aCgic2hsIikpICYmCisgICAgICBPcGVyYW5kcy5zaXplKCkgPT0gMyAmJgorICAgICAgc3RhdGljX2Nhc3Q8WDg2T3BlcmFuZCo+KE9wZXJhbmRzWzFdKS0+aXNJbW0oKSAmJgorICAgICAgaXNhPE1DQ29uc3RhbnRFeHByPihzdGF0aWNfY2FzdDxYODZPcGVyYW5kKj4oT3BlcmFuZHNbMV0pLT5nZXRJbW0oKSkgJiYKKyAgICAgIGNhc3Q8TUNDb25zdGFudEV4cHI+KHN0YXRpY19jYXN0PFg4Nk9wZXJhbmQqPihPcGVyYW5kc1sxXSktPmdldEltbSgpKS0+Z2V0VmFsdWUoKSA9PSAxKSB7CisgICAgZGVsZXRlIE9wZXJhbmRzWzFdOworICAgIE9wZXJhbmRzLmVyYXNlKE9wZXJhbmRzLmJlZ2luKCkgKyAxKTsKKyAgfQorCisgIC8vIEZJWE1FOiBIYWNrIHRvIGhhbmRsZSAiZnttdWwqLGFkZCosc3ViKixkaXYqfSAkb3AsIHN0KDApIiB0aGUgc2FtZSBhcworICAvLyAiZnttdWwqLGFkZCosc3ViKixkaXYqfSAkb3AiCisgIGlmICgoTmFtZS5zdGFydHN3aXRoKCJmbXVsIikgfHwgTmFtZS5zdGFydHN3aXRoKCJmYWRkIikgfHwKKyAgICAgICBOYW1lLnN0YXJ0c3dpdGgoImZzdWIiKSB8fCBOYW1lLnN0YXJ0c3dpdGgoImZkaXYiKSkgJiYKKyAgICAgIE9wZXJhbmRzLnNpemUoKSA9PSAzICYmCisgICAgICBzdGF0aWNfY2FzdDxYODZPcGVyYW5kKj4oT3BlcmFuZHNbMl0pLT5pc1JlZygpICYmCisgICAgICBzdGF0aWNfY2FzdDxYODZPcGVyYW5kKj4oT3BlcmFuZHNbMl0pLT5nZXRSZWcoKSA9PSBYODY6OlNUMCkgeworICAgIGRlbGV0ZSBPcGVyYW5kc1syXTsKKyAgICBPcGVyYW5kcy5lcmFzZShPcGVyYW5kcy5iZWdpbigpICsgMik7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgWDg2QVRUQXNtUGFyc2VyOjpQYXJzZURpcmVjdGl2ZShBc21Ub2tlbiBEaXJlY3RpdmVJRCkgeworICBTdHJpbmdSZWYgSURWYWwgPSBEaXJlY3RpdmVJRC5nZXRJZGVudGlmaWVyKCk7CisgIGlmIChJRFZhbCA9PSAiLndvcmQiKQorICAgIHJldHVybiBQYXJzZURpcmVjdGl2ZVdvcmQoMiwgRGlyZWN0aXZlSUQuZ2V0TG9jKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFBhcnNlRGlyZWN0aXZlV29yZAorLy8vICA6Oj0gLndvcmQgWyBleHByZXNzaW9uICgsIGV4cHJlc3Npb24pKiBdCitib29sIFg4NkFUVEFzbVBhcnNlcjo6UGFyc2VEaXJlY3RpdmVXb3JkKHVuc2lnbmVkIFNpemUsIFNNTG9jIEwpIHsKKyAgaWYgKGdldExleGVyKCkuaXNOb3QoQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50KSkgeworICAgIGZvciAoOzspIHsKKyAgICAgIGNvbnN0IE1DRXhwciAqVmFsdWU7CisgICAgICBpZiAoZ2V0UGFyc2VyKCkuUGFyc2VFeHByZXNzaW9uKFZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGdldFBhcnNlcigpLmdldFN0cmVhbWVyKCkuRW1pdFZhbHVlKFZhbHVlLCBTaXplLCAwIC8qYWRkcnNwYWNlKi8pOworCisgICAgICBpZiAoZ2V0TGV4ZXIoKS5pcyhBc21Ub2tlbjo6RW5kT2ZTdGF0ZW1lbnQpKQorICAgICAgICBicmVhazsKKworICAgICAgLy8gRklYTUU6IEltcHJvdmUgZGlhZ25vc3RpYy4KKyAgICAgIGlmIChnZXRMZXhlcigpLmlzTm90KEFzbVRva2VuOjpDb21tYSkpCisgICAgICAgIHJldHVybiBFcnJvcihMLCAidW5leHBlY3RlZCB0b2tlbiBpbiBkaXJlY3RpdmUiKTsKKyAgICAgIFBhcnNlci5MZXgoKTsKKyAgICB9CisgIH0KKworICBQYXJzZXIuTGV4KCk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbAorWDg2QVRUQXNtUGFyc2VyOjpNYXRjaEluc3RydWN0aW9uKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNQ1BhcnNlZEFzbU9wZXJhbmQqPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DSW5zdCAmSW5zdCkgeworICAvLyBGaXJzdCwgdHJ5IGEgZGlyZWN0IG1hdGNoLgorICBpZiAoIU1hdGNoSW5zdHJ1Y3Rpb25JbXBsKE9wZXJhbmRzLCBJbnN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWdub3JlIGFueXRoaW5nIHdoaWNoIGlzIG9idmlvdXNseSBub3QgYSBzdWZmaXggbWF0Y2guCisgIGlmIChPcGVyYW5kcy5zaXplKCkgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgWDg2T3BlcmFuZCAqT3AgPSBzdGF0aWNfY2FzdDxYODZPcGVyYW5kKj4oT3BlcmFuZHNbMF0pOworICBpZiAoIU9wLT5pc1Rva2VuKCkgfHwgT3AtPmdldFRva2VuKCkuc2l6ZSgpID4gMTUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gRklYTUU6IElkZWFsbHksIHdlIHdvdWxkIG9ubHkgYXR0ZW1wdCBzdWZmaXggbWF0Y2hlcyBmb3IgdGhpbmdzIHdoaWNoIGFyZQorICAvLyB2YWxpZCBwcmVmaXhlcywgYW5kIHdlIGNvdWxkIGp1c3QgaW5mZXIgdGhlIHJpZ2h0IHVuYW1iaWd1b3VzCisgIC8vIHR5cGUuIEhvd2V2ZXIsIHRoYXQgcmVxdWlyZXMgc3Vic3RhbnRpYWxseSBtb3JlIG1hdGNoZXIgc3VwcG9ydCB0aGFuIHRoZQorICAvLyBmb2xsb3dpbmcgaGFjay4KKworICAvLyBDaGFuZ2UgdGhlIG9wZXJhbmQgdG8gcG9pbnQgdG8gYSB0ZW1wb3JhcnkgdG9rZW4uCisgIGNoYXIgVG1wWzE2XTsKKyAgU3RyaW5nUmVmIEJhc2UgPSBPcC0+Z2V0VG9rZW4oKTsKKyAgbWVtY3B5KFRtcCwgQmFzZS5kYXRhKCksIEJhc2Uuc2l6ZSgpKTsKKyAgT3AtPnNldFRva2VuVmFsdWUoU3RyaW5nUmVmKFRtcCwgQmFzZS5zaXplKCkgKyAxKSk7CisKKyAgLy8gQ2hlY2sgZm9yIHRoZSB2YXJpb3VzIHN1ZmZpeCBtYXRjaGVzLgorICBUbXBbQmFzZS5zaXplKCldID0gJ2InOworICBib29sIE1hdGNoQiA9IE1hdGNoSW5zdHJ1Y3Rpb25JbXBsKE9wZXJhbmRzLCBJbnN0KTsKKyAgVG1wW0Jhc2Uuc2l6ZSgpXSA9ICd3JzsKKyAgYm9vbCBNYXRjaFcgPSBNYXRjaEluc3RydWN0aW9uSW1wbChPcGVyYW5kcywgSW5zdCk7CisgIFRtcFtCYXNlLnNpemUoKV0gPSAnbCc7CisgIGJvb2wgTWF0Y2hMID0gTWF0Y2hJbnN0cnVjdGlvbkltcGwoT3BlcmFuZHMsIEluc3QpOworICBUbXBbQmFzZS5zaXplKCldID0gJ3EnOworICBib29sIE1hdGNoUSA9IE1hdGNoSW5zdHJ1Y3Rpb25JbXBsKE9wZXJhbmRzLCBJbnN0KTsKKworICAvLyBSZXN0b3JlIHRoZSBvbGQgdG9rZW4uCisgIE9wLT5zZXRUb2tlblZhbHVlKEJhc2UpOworCisgIC8vIElmIGV4YWN0bHkgb25lIG1hdGNoZWQsIHRoZW4gd2UgdHJlYXQgdGhhdCBhcyBhIHN1Y2Nlc3NmdWwgbWF0Y2ggKGFuZCB0aGUKKyAgLy8gaW5zdHJ1Y3Rpb24gd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBmaWxsZWQgaW4gY29ycmVjdGx5LCBzaW5jZSB0aGUgZmFpbGluZworICAvLyBtYXRjaGVzIHdvbid0IGhhdmUgbW9kaWZpZWQgaXQpLgorICBpZiAoTWF0Y2hCICsgTWF0Y2hXICsgTWF0Y2hMICsgTWF0Y2hRID09IDMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE90aGVyd2lzZSwgdGhlIG1hdGNoIGZhaWxlZC4KKyAgcmV0dXJuIHRydWU7Cit9CisKKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplWDg2QXNtTGV4ZXIoKTsKKworLy8gRm9yY2Ugc3RhdGljIGluaXRpYWxpemF0aW9uLgorZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplWDg2QXNtUGFyc2VyKCkgeworICBSZWdpc3RlckFzbVBhcnNlcjxYODZfMzJBVFRBc21QYXJzZXI+IFgoVGhlWDg2XzMyVGFyZ2V0KTsKKyAgUmVnaXN0ZXJBc21QYXJzZXI8WDg2XzY0QVRUQXNtUGFyc2VyPiBZKFRoZVg4Nl82NFRhcmdldCk7CisgIExMVk1Jbml0aWFsaXplWDg2QXNtTGV4ZXIoKTsKK30KKworI2luY2x1ZGUgIlg4NkdlbkFzbU1hdGNoZXIuaW5jIgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiNjNmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw3IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uICkKKworYWRkX2xsdm1fbGlicmFyeShMTFZNWDg2QXNtUHJpbnRlcgorICBYODZBVFRJbnN0UHJpbnRlci5jcHAKKyAgWDg2SW50ZWxJbnN0UHJpbnRlci5jcHAKKyAgKQorYWRkX2RlcGVuZGVuY2llcyhMTFZNWDg2QXNtUHJpbnRlciBYODZDb2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQXNtUHJpbnRlci9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyYWEzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVg4NkFzbVByaW50ZXIKKworIyBIYWNrOiB3ZSBuZWVkIHRvIGluY2x1ZGUgJ21haW4nIHg4NiB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFAuRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvWDg2QVRUSW5zdFByaW50ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQXNtUHJpbnRlci9YODZBVFRJbnN0UHJpbnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjZGI1YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvWDg2QVRUSW5zdFByaW50ZXIuY3BwCkBAIC0wLDAgKzEsMTI0IEBACisvLz09PS0tIFg4NkFUVEluc3RQcmludGVyLmNwcCAtIEFUJlQgYXNzZW1ibHkgaW5zdHJ1Y3Rpb24gcHJpbnRpbmcgLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbmNsdWRlcyBjb2RlIGZvciByZW5kZXJpbmcgTUNJbnN0IGluc3RhbmNlcyBhcyBBVCZULXN0eWxlCisvLyBhc3NlbWJseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFzbS1wcmludGVyIgorI2luY2x1ZGUgIlg4NkFUVEluc3RQcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oIgorI2luY2x1ZGUgIlg4Nkdlbkluc3RyTmFtZXMuaW5jIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIEluY2x1ZGUgdGhlIGF1dG8tZ2VuZXJhdGVkIHBvcnRpb24gb2YgdGhlIGFzc2VtYmx5IHdyaXRlci4KKyNkZWZpbmUgTWFjaGluZUluc3RyIE1DSW5zdAorI2RlZmluZSBHRVRfSU5TVFJVQ1RJT05fTkFNRQorI2luY2x1ZGUgIlg4NkdlbkFzbVdyaXRlci5pbmMiCisjdW5kZWYgTWFjaGluZUluc3RyCisKK3ZvaWQgWDg2QVRUSW5zdFByaW50ZXI6OnByaW50SW5zdChjb25zdCBNQ0luc3QgKk1JLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgcHJpbnRJbnN0cnVjdGlvbihNSSwgT1MpOworfQorU3RyaW5nUmVmIFg4NkFUVEluc3RQcmludGVyOjpnZXRPcGNvZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3QgeworICByZXR1cm4gZ2V0SW5zdHJ1Y3Rpb25OYW1lKE9wY29kZSk7Cit9CisKKwordm9pZCBYODZBVFRJbnN0UHJpbnRlcjo6cHJpbnRTU0VDQyhjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgc3dpdGNoIChNSS0+Z2V0T3BlcmFuZChPcCkuZ2V0SW1tKCkpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIkludmFsaWQgc3NlY2MgYXJndW1lbnQhIik7CisgIGNhc2UgMDogTyA8PCAiZXEiOyBicmVhazsKKyAgY2FzZSAxOiBPIDw8ICJsdCI7IGJyZWFrOworICBjYXNlIDI6IE8gPDwgImxlIjsgYnJlYWs7CisgIGNhc2UgMzogTyA8PCAidW5vcmQiOyBicmVhazsKKyAgY2FzZSA0OiBPIDw8ICJuZXEiOyBicmVhazsKKyAgY2FzZSA1OiBPIDw8ICJubHQiOyBicmVhazsKKyAgY2FzZSA2OiBPIDw8ICJubGUiOyBicmVhazsKKyAgY2FzZSA3OiBPIDw8ICJvcmQiOyBicmVhazsKKyAgfQorfQorCisvLy8gcHJpbnRfcGNyZWxfaW1tIC0gVGhpcyBpcyB1c2VkIHRvIHByaW50IGFuIGltbWVkaWF0ZSB2YWx1ZSB0aGF0IGVuZHMgdXAKKy8vLyBiZWluZyBlbmNvZGVkIGFzIGEgcGMtcmVsYXRpdmUgdmFsdWUgKGUuZy4gZm9yIGp1bXBzIGFuZCBjYWxscykuICBUaGVzZQorLy8vIHByaW50IHNsaWdodGx5IGRpZmZlcmVudGx5IHRoYW4gbm9ybWFsIGltbWVkaWF0ZXMuICBGb3IgZXhhbXBsZSwgYSAkIGlzIG5vdAorLy8vIGVtaXR0ZWQuCit2b2lkIFg4NkFUVEluc3RQcmludGVyOjpwcmludF9wY3JlbF9pbW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk9wID0gTUktPmdldE9wZXJhbmQoT3BObyk7CisgIGlmIChPcC5pc0ltbSgpKQorICAgIC8vIFByaW50IHRoaXMgYXMgYSBzaWduZWQgMzItYml0IHZhbHVlLgorICAgIE8gPDwgKGludClPcC5nZXRJbW0oKTsKKyAgZWxzZSB7CisgICAgYXNzZXJ0KE9wLmlzRXhwcigpICYmICJ1bmtub3duIHBjcmVsIGltbWVkaWF0ZSBvcGVyYW5kIik7CisgICAgTyA8PCAqT3AuZ2V0RXhwcigpOworICB9Cit9CisKK3ZvaWQgWDg2QVRUSW5zdFByaW50ZXI6OnByaW50T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1DT3BlcmFuZCAmT3AgPSBNSS0+Z2V0T3BlcmFuZChPcE5vKTsKKyAgaWYgKE9wLmlzUmVnKCkpIHsKKyAgICBPIDw8ICclJyA8PCBnZXRSZWdpc3Rlck5hbWUoT3AuZ2V0UmVnKCkpOworICB9IGVsc2UgaWYgKE9wLmlzSW1tKCkpIHsKKyAgICBPIDw8ICckJyA8PCBPcC5nZXRJbW0oKTsKKyAgICAKKyAgICBpZiAoQ29tbWVudFN0cmVhbSAmJiAoT3AuZ2V0SW1tKCkgPiAyNTUgfHwgT3AuZ2V0SW1tKCkgPCAtMjU2KSkKKyAgICAgICpDb21tZW50U3RyZWFtIDw8IGZvcm1hdCgiaW1tID0gMHglbGxYXG4iLCAobG9uZyBsb25nKU9wLmdldEltbSgpKTsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoT3AuaXNFeHByKCkgJiYgInVua25vd24gb3BlcmFuZCBraW5kIGluIHByaW50T3BlcmFuZCIpOworICAgIE8gPDwgJyQnIDw8ICpPcC5nZXRFeHByKCk7CisgIH0KK30KKwordm9pZCBYODZBVFRJbnN0UHJpbnRlcjo6cHJpbnRNZW1SZWZlcmVuY2UoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJkJhc2VSZWcgID0gTUktPmdldE9wZXJhbmQoT3ApOworICBjb25zdCBNQ09wZXJhbmQgJkluZGV4UmVnID0gTUktPmdldE9wZXJhbmQoT3ArMik7CisgIGNvbnN0IE1DT3BlcmFuZCAmRGlzcFNwZWMgPSBNSS0+Z2V0T3BlcmFuZChPcCszKTsKKyAgY29uc3QgTUNPcGVyYW5kICZTZWdSZWcgPSBNSS0+Z2V0T3BlcmFuZChPcCs0KTsKKyAgCisgIC8vIElmIHRoaXMgaGFzIGEgc2VnbWVudCByZWdpc3RlciwgcHJpbnQgaXQuCisgIGlmIChTZWdSZWcuZ2V0UmVnKCkpIHsKKyAgICBwcmludE9wZXJhbmQoTUksIE9wKzQsIE8pOworICAgIE8gPDwgJzonOworICB9CisgIAorICBpZiAoRGlzcFNwZWMuaXNJbW0oKSkgeworICAgIGludDY0X3QgRGlzcFZhbCA9IERpc3BTcGVjLmdldEltbSgpOworICAgIGlmIChEaXNwVmFsIHx8ICghSW5kZXhSZWcuZ2V0UmVnKCkgJiYgIUJhc2VSZWcuZ2V0UmVnKCkpKQorICAgICAgTyA8PCBEaXNwVmFsOworICB9IGVsc2UgeworICAgIGFzc2VydChEaXNwU3BlYy5pc0V4cHIoKSAmJiAibm9uLWltbWVkaWF0ZSBkaXNwbGFjZW1lbnQgZm9yIExFQT8iKTsKKyAgICBPIDw8ICpEaXNwU3BlYy5nZXRFeHByKCk7CisgIH0KKyAgCisgIGlmIChJbmRleFJlZy5nZXRSZWcoKSB8fCBCYXNlUmVnLmdldFJlZygpKSB7CisgICAgTyA8PCAnKCc7CisgICAgaWYgKEJhc2VSZWcuZ2V0UmVnKCkpCisgICAgICBwcmludE9wZXJhbmQoTUksIE9wLCBPKTsKKyAgICAKKyAgICBpZiAoSW5kZXhSZWcuZ2V0UmVnKCkpIHsKKyAgICAgIE8gPDwgJywnOworICAgICAgcHJpbnRPcGVyYW5kKE1JLCBPcCsyLCBPKTsKKyAgICAgIHVuc2lnbmVkIFNjYWxlVmFsID0gTUktPmdldE9wZXJhbmQoT3ArMSkuZ2V0SW1tKCk7CisgICAgICBpZiAoU2NhbGVWYWwgIT0gMSkKKyAgICAgICAgTyA8PCAnLCcgPDwgU2NhbGVWYWw7CisgICAgfQorICAgIE8gPDwgJyknOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9Bc21QcmludGVyL1g4NkFUVEluc3RQcmludGVyLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9Bc21QcmludGVyL1g4NkFUVEluc3RQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5ODY2NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvWDg2QVRUSW5zdFByaW50ZXIuaApAQCAtMCwwICsxLDgxIEBACisvLz09PS0tIFg4NkFUVEluc3RQcmludGVyLmggLSBDb252ZXJ0IFg4NiBNQ0luc3QgdG8gYXNzZW1ibHkgc3ludGF4IC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgcHJpbnRzIGFuIFg4NiBNQ0luc3QgdG8gQVQmVCBzdHlsZSAucyBmaWxlIHN5bnRheC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFg4Nl9BVFRfSU5TVF9QUklOVEVSX0gKKyNkZWZpbmUgWDg2X0FUVF9JTlNUX1BSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3RQcmludGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTUNPcGVyYW5kOworICAKK2NsYXNzIFg4NkFUVEluc3RQcmludGVyIDogcHVibGljIE1DSW5zdFByaW50ZXIgeworcHVibGljOgorICBYODZBVFRJbnN0UHJpbnRlcihjb25zdCBNQ0FzbUluZm8gJk1BSSkgOiBNQ0luc3RQcmludGVyKE1BSSkge30KKworICAKKyAgdmlydHVhbCB2b2lkIHByaW50SW5zdChjb25zdCBNQ0luc3QgKk1JLCByYXdfb3N0cmVhbSAmT1MpOworICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRPcGNvZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgLy8gQXV0b2dlbmVyYXRlZCBieSB0YmxnZW4uCisgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgKk1JLCByYXdfb3N0cmVhbSAmT1MpOworICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0UmVnaXN0ZXJOYW1lKHVuc2lnbmVkIFJlZ05vKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldEluc3RydWN0aW9uTmFtZSh1bnNpZ25lZCBPcGNvZGUpOworCisgIHZvaWQgcHJpbnRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPUyk7CisgIHZvaWQgcHJpbnRNZW1SZWZlcmVuY2UoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3AsIHJhd19vc3RyZWFtICZPUyk7CisgIHZvaWQgcHJpbnRTU0VDQyhjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcCwgcmF3X29zdHJlYW0gJk9TKTsKKyAgdm9pZCBwcmludF9wY3JlbF9pbW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk9TKTsKKyAgCisgIHZvaWQgcHJpbnRvcGFxdWVtZW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICBwcmludE1lbVJlZmVyZW5jZShNSSwgT3BObywgTyk7CisgIH0KKyAgCisgIHZvaWQgcHJpbnRpOG1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50aTE2bWVtKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgcHJpbnRNZW1SZWZlcmVuY2UoTUksIE9wTm8sIE8pOworICB9CisgIHZvaWQgcHJpbnRpMzJtZW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICBwcmludE1lbVJlZmVyZW5jZShNSSwgT3BObywgTyk7CisgIH0KKyAgdm9pZCBwcmludGk2NG1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50aTEyOG1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50aTI1Nm1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50ZjMybWVtKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgcHJpbnRNZW1SZWZlcmVuY2UoTUksIE9wTm8sIE8pOworICB9CisgIHZvaWQgcHJpbnRmNjRtZW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICBwcmludE1lbVJlZmVyZW5jZShNSSwgT3BObywgTyk7CisgIH0KKyAgdm9pZCBwcmludGY4MG1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50ZjEyOG1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50ZjI1Nm1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorfTsKKyAgCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQXNtUHJpbnRlci9YODZJbnRlbEluc3RQcmludGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvWDg2SW50ZWxJbnN0UHJpbnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzMjA0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0FzbVByaW50ZXIvWDg2SW50ZWxJbnN0UHJpbnRlci5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKy8vPT09LS0gWDg2SW50ZWxJbnN0UHJpbnRlci5jcHAgLSBBVCZUIGFzc2VtYmx5IGluc3RydWN0aW9uIHByaW50aW5nIC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGluY2x1ZGVzIGNvZGUgZm9yIHJlbmRlcmluZyBNQ0luc3QgaW5zdGFuY2VzIGFzIEFUJlQtc3R5bGUKKy8vIGFzc2VtYmx5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXNtLXByaW50ZXIiCisjaW5jbHVkZSAiWDg2SW50ZWxJbnN0UHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oIgorI2luY2x1ZGUgIlg4Nkdlbkluc3RyTmFtZXMuaW5jIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIEluY2x1ZGUgdGhlIGF1dG8tZ2VuZXJhdGVkIHBvcnRpb24gb2YgdGhlIGFzc2VtYmx5IHdyaXRlci4KKyNkZWZpbmUgTWFjaGluZUluc3RyIE1DSW5zdAorI2RlZmluZSBHRVRfSU5TVFJVQ1RJT05fTkFNRQorI2luY2x1ZGUgIlg4NkdlbkFzbVdyaXRlcjEuaW5jIgorI3VuZGVmIE1hY2hpbmVJbnN0cgorCit2b2lkIFg4NkludGVsSW5zdFByaW50ZXI6OnByaW50SW5zdChjb25zdCBNQ0luc3QgKk1JLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgcHJpbnRJbnN0cnVjdGlvbihNSSwgT1MpOworfQorU3RyaW5nUmVmIFg4NkludGVsSW5zdFByaW50ZXI6OmdldE9wY29kZU5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdCB7CisgIHJldHVybiBnZXRJbnN0cnVjdGlvbk5hbWUoT3Bjb2RlKTsKK30KKwordm9pZCBYODZJbnRlbEluc3RQcmludGVyOjpwcmludFNTRUNDKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIHN3aXRjaCAoTUktPmdldE9wZXJhbmQoT3ApLmdldEltbSgpKSB7CisgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJJbnZhbGlkIHNzZWNjIGFyZ3VtZW50ISIpOworICBjYXNlIDA6IE8gPDwgImVxIjsgYnJlYWs7CisgIGNhc2UgMTogTyA8PCAibHQiOyBicmVhazsKKyAgY2FzZSAyOiBPIDw8ICJsZSI7IGJyZWFrOworICBjYXNlIDM6IE8gPDwgInVub3JkIjsgYnJlYWs7CisgIGNhc2UgNDogTyA8PCAibmVxIjsgYnJlYWs7CisgIGNhc2UgNTogTyA8PCAibmx0IjsgYnJlYWs7CisgIGNhc2UgNjogTyA8PCAibmxlIjsgYnJlYWs7CisgIGNhc2UgNzogTyA8PCAib3JkIjsgYnJlYWs7CisgIH0KK30KKworLy8vIHByaW50X3BjcmVsX2ltbSAtIFRoaXMgaXMgdXNlZCB0byBwcmludCBhbiBpbW1lZGlhdGUgdmFsdWUgdGhhdCBlbmRzIHVwCisvLy8gYmVpbmcgZW5jb2RlZCBhcyBhIHBjLXJlbGF0aXZlIHZhbHVlLgordm9pZCBYODZJbnRlbEluc3RQcmludGVyOjpwcmludF9wY3JlbF9pbW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1DT3BlcmFuZCAmT3AgPSBNSS0+Z2V0T3BlcmFuZChPcE5vKTsKKyAgaWYgKE9wLmlzSW1tKCkpCisgICAgTyA8PCBPcC5nZXRJbW0oKTsKKyAgZWxzZSB7CisgICAgYXNzZXJ0KE9wLmlzRXhwcigpICYmICJ1bmtub3duIHBjcmVsIGltbWVkaWF0ZSBvcGVyYW5kIik7CisgICAgTyA8PCAqT3AuZ2V0RXhwcigpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFByaW50UmVnTmFtZShyYXdfb3N0cmVhbSAmTywgU3RyaW5nUmVmIFJlZ05hbWUpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ05hbWUuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBPIDw8IChjaGFyKXRvdXBwZXIoUmVnTmFtZVtpXSk7Cit9CisKK3ZvaWQgWDg2SW50ZWxJbnN0UHJpbnRlcjo6cHJpbnRPcGVyYW5kKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmTykgeworICBjb25zdCBNQ09wZXJhbmQgJk9wID0gTUktPmdldE9wZXJhbmQoT3BObyk7CisgIGlmIChPcC5pc1JlZygpKSB7CisgICAgUHJpbnRSZWdOYW1lKE8sIGdldFJlZ2lzdGVyTmFtZShPcC5nZXRSZWcoKSkpOworICB9IGVsc2UgaWYgKE9wLmlzSW1tKCkpIHsKKyAgICBPIDw8IE9wLmdldEltbSgpOworICB9IGVsc2UgeworICAgIGFzc2VydChPcC5pc0V4cHIoKSAmJiAidW5rbm93biBvcGVyYW5kIGtpbmQgaW4gcHJpbnRPcGVyYW5kIik7CisgICAgTyA8PCAqT3AuZ2V0RXhwcigpOworICB9Cit9CisKK3ZvaWQgWDg2SW50ZWxJbnN0UHJpbnRlcjo6cHJpbnRNZW1SZWZlcmVuY2UoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1DT3BlcmFuZCAmQmFzZVJlZyAgPSBNSS0+Z2V0T3BlcmFuZChPcCk7CisgIHVuc2lnbmVkIFNjYWxlVmFsICAgICAgICAgPSBNSS0+Z2V0T3BlcmFuZChPcCsxKS5nZXRJbW0oKTsKKyAgY29uc3QgTUNPcGVyYW5kICZJbmRleFJlZyA9IE1JLT5nZXRPcGVyYW5kKE9wKzIpOworICBjb25zdCBNQ09wZXJhbmQgJkRpc3BTcGVjID0gTUktPmdldE9wZXJhbmQoT3ArMyk7CisgIGNvbnN0IE1DT3BlcmFuZCAmU2VnUmVnICAgPSBNSS0+Z2V0T3BlcmFuZChPcCs0KTsKKyAgCisgIC8vIElmIHRoaXMgaGFzIGEgc2VnbWVudCByZWdpc3RlciwgcHJpbnQgaXQuCisgIGlmIChTZWdSZWcuZ2V0UmVnKCkpIHsKKyAgICBwcmludE9wZXJhbmQoTUksIE9wKzQsIE8pOworICAgIE8gPDwgJzonOworICB9CisgIAorICBPIDw8ICdbJzsKKyAgCisgIGJvb2wgTmVlZFBsdXMgPSBmYWxzZTsKKyAgaWYgKEJhc2VSZWcuZ2V0UmVnKCkpIHsKKyAgICBwcmludE9wZXJhbmQoTUksIE9wLCBPKTsKKyAgICBOZWVkUGx1cyA9IHRydWU7CisgIH0KKyAgCisgIGlmIChJbmRleFJlZy5nZXRSZWcoKSkgeworICAgIGlmIChOZWVkUGx1cykgTyA8PCAiICsgIjsKKyAgICBpZiAoU2NhbGVWYWwgIT0gMSkKKyAgICAgIE8gPDwgU2NhbGVWYWwgPDwgJyonOworICAgIHByaW50T3BlcmFuZChNSSwgT3ArMiwgTyk7CisgICAgTmVlZFBsdXMgPSB0cnVlOworICB9CisgIAorICAKKyAgaWYgKCFEaXNwU3BlYy5pc0ltbSgpKSB7CisgICAgaWYgKE5lZWRQbHVzKSBPIDw8ICIgKyAiOworICAgIGFzc2VydChEaXNwU3BlYy5pc0V4cHIoKSAmJiAibm9uLWltbWVkaWF0ZSBkaXNwbGFjZW1lbnQgZm9yIExFQT8iKTsKKyAgICBPIDw8ICpEaXNwU3BlYy5nZXRFeHByKCk7CisgIH0gZWxzZSB7CisgICAgaW50NjRfdCBEaXNwVmFsID0gRGlzcFNwZWMuZ2V0SW1tKCk7CisgICAgaWYgKERpc3BWYWwgfHwgKCFJbmRleFJlZy5nZXRSZWcoKSAmJiAhQmFzZVJlZy5nZXRSZWcoKSkpIHsKKyAgICAgIGlmIChOZWVkUGx1cykgeworICAgICAgICBpZiAoRGlzcFZhbCA+IDApCisgICAgICAgICAgTyA8PCAiICsgIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgTyA8PCAiIC0gIjsKKyAgICAgICAgICBEaXNwVmFsID0gLURpc3BWYWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIE8gPDwgRGlzcFZhbDsKKyAgICB9CisgIH0KKyAgCisgIE8gPDwgJ10nOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQXNtUHJpbnRlci9YODZJbnRlbEluc3RQcmludGVyLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9Bc21QcmludGVyL1g4NkludGVsSW5zdFByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjEyMDMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQXNtUHJpbnRlci9YODZJbnRlbEluc3RQcmludGVyLmgKQEAgLTAsMCArMSw5NSBAQAorLy89PT0tLSBYODZJbnRlbEluc3RQcmludGVyLmggLSBDb252ZXJ0IFg4NiBNQ0luc3QgdG8gYXNzZW1ibHkgc3ludGF4IC0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHByaW50cyBhbiBYODYgTUNJbnN0IHRvIGludGVsIHN0eWxlIC5zIGZpbGUgc3ludGF4LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWDg2X0lOVEVMX0lOU1RfUFJJTlRFUl9ICisjZGVmaW5lIFg4Nl9JTlRFTF9JTlNUX1BSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3RQcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTUNPcGVyYW5kOworICAKK2NsYXNzIFg4NkludGVsSW5zdFByaW50ZXIgOiBwdWJsaWMgTUNJbnN0UHJpbnRlciB7CitwdWJsaWM6CisgIFg4NkludGVsSW5zdFByaW50ZXIoY29uc3QgTUNBc21JbmZvICZNQUkpCisgICAgOiBNQ0luc3RQcmludGVyKE1BSSkge30KKyAgCisgIHZpcnR1YWwgdm9pZCBwcmludEluc3QoY29uc3QgTUNJbnN0ICpNSSwgcmF3X29zdHJlYW0gJk9TKTsKKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0T3Bjb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworICAKKyAgLy8gQXV0b2dlbmVyYXRlZCBieSB0YmxnZW4uCisgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgKk1JLCByYXdfb3N0cmVhbSAmTyk7CisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRSZWdpc3Rlck5hbWUodW5zaWduZWQgUmVnTm8pOworICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0SW5zdHJ1Y3Rpb25OYW1lKHVuc2lnbmVkIE9wY29kZSk7CisKKworICB2b2lkIHByaW50T3BlcmFuZChjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTyk7CisgIHZvaWQgcHJpbnRNZW1SZWZlcmVuY2UoY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3AsIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludFNTRUNDKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wLCByYXdfb3N0cmVhbSAmTyk7CisgIHZvaWQgcHJpbnRfcGNyZWxfaW1tKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKTsKKyAgCisgIHZvaWQgcHJpbnRvcGFxdWVtZW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICBPIDw8ICJPUEFRVUUgUFRSICI7CisgICAgcHJpbnRNZW1SZWZlcmVuY2UoTUksIE9wTm8sIE8pOworICB9CisgIAorICB2b2lkIHByaW50aThtZW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICBPIDw8ICJCWVRFIFBUUiAiOworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50aTE2bWVtKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgTyA8PCAiV09SRCBQVFIgIjsKKyAgICBwcmludE1lbVJlZmVyZW5jZShNSSwgT3BObywgTyk7CisgIH0KKyAgdm9pZCBwcmludGkzMm1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIE8gPDwgIkRXT1JEIFBUUiAiOworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50aTY0bWVtKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgTyA8PCAiUVdPUkQgUFRSICI7CisgICAgcHJpbnRNZW1SZWZlcmVuY2UoTUksIE9wTm8sIE8pOworICB9CisgIHZvaWQgcHJpbnRpMTI4bWVtKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgTyA8PCAiWE1NV09SRCBQVFIgIjsKKyAgICBwcmludE1lbVJlZmVyZW5jZShNSSwgT3BObywgTyk7CisgIH0KKyAgdm9pZCBwcmludGkyNTZtZW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICBPIDw8ICJZTU1XT1JEIFBUUiAiOworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50ZjMybWVtKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgTyA8PCAiRFdPUkQgUFRSICI7CisgICAgcHJpbnRNZW1SZWZlcmVuY2UoTUksIE9wTm8sIE8pOworICB9CisgIHZvaWQgcHJpbnRmNjRtZW0oY29uc3QgTUNJbnN0ICpNSSwgdW5zaWduZWQgT3BObywgcmF3X29zdHJlYW0gJk8pIHsKKyAgICBPIDw8ICJRV09SRCBQVFIgIjsKKyAgICBwcmludE1lbVJlZmVyZW5jZShNSSwgT3BObywgTyk7CisgIH0KKyAgdm9pZCBwcmludGY4MG1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIE8gPDwgIlhXT1JEIFBUUiAiOworICAgIHByaW50TWVtUmVmZXJlbmNlKE1JLCBPcE5vLCBPKTsKKyAgfQorICB2b2lkIHByaW50ZjEyOG1lbShjb25zdCBNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTykgeworICAgIE8gPDwgIlhNTVdPUkQgUFRSICI7CisgICAgcHJpbnRNZW1SZWZlcmVuY2UoTUksIE9wTm8sIE8pOworICB9CisgIHZvaWQgcHJpbnRmMjU2bWVtKGNvbnN0IE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPKSB7CisgICAgTyA8PCAiWU1NV09SRCBQVFIgIjsKKyAgICBwcmludE1lbVJlZmVyZW5jZShNSSwgT3BObywgTyk7CisgIH0KK307CisgIAorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzOTlmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNTIgQEAKK3NldChMTFZNX1RBUkdFVF9ERUZJTklUSU9OUyBYODYudGQpCisKK3RhYmxlZ2VuKFg4NkdlblJlZ2lzdGVySW5mby5oLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MtaGVhZGVyKQordGFibGVnZW4oWDg2R2VuUmVnaXN0ZXJOYW1lcy5pbmMgLWdlbi1yZWdpc3Rlci1lbnVtcykKK3RhYmxlZ2VuKFg4NkdlblJlZ2lzdGVySW5mby5pbmMgLWdlbi1yZWdpc3Rlci1kZXNjKQordGFibGVnZW4oWDg2R2VuRGlzYXNzZW1ibGVyVGFibGVzLmluYyAtZ2VuLWRpc2Fzc2VtYmxlcikKK3RhYmxlZ2VuKFg4Nkdlbkluc3RyTmFtZXMuaW5jIC1nZW4taW5zdHItZW51bXMpCit0YWJsZWdlbihYODZHZW5JbnN0ckluZm8uaW5jIC1nZW4taW5zdHItZGVzYykKK3RhYmxlZ2VuKFg4NkdlbkFzbVdyaXRlci5pbmMgLWdlbi1hc20td3JpdGVyKQordGFibGVnZW4oWDg2R2VuQXNtV3JpdGVyMS5pbmMgLWdlbi1hc20td3JpdGVyIC1hc213cml0ZXJudW09MSkKK3RhYmxlZ2VuKFg4NkdlbkFzbU1hdGNoZXIuaW5jIC1nZW4tYXNtLW1hdGNoZXIpCit0YWJsZWdlbihYODZHZW5EQUdJU2VsLmluYyAtZ2VuLWRhZy1pc2VsKQordGFibGVnZW4oWDg2R2VuRmFzdElTZWwuaW5jIC1nZW4tZmFzdC1pc2VsKQordGFibGVnZW4oWDg2R2VuQ2FsbGluZ0NvbnYuaW5jIC1nZW4tY2FsbGluZ2NvbnYpCit0YWJsZWdlbihYODZHZW5TdWJ0YXJnZXQuaW5jIC1nZW4tc3VidGFyZ2V0KQordGFibGVnZW4oWDg2R2VuRURJbmZvLmluYyAtZ2VuLWVuaGFuY2VkLWRpc2Fzc2VtYmx5LWluZm8pCisKK3NldChzb3VyY2VzCisgIFNTRURvbWFpbkZpeC5jcHAKKyAgWDg2QXNtQmFja2VuZC5jcHAKKyAgWDg2QXNtUHJpbnRlci5jcHAKKyAgWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvLmNwcAorICBYODZDb2RlRW1pdHRlci5jcHAKKyAgWDg2RUxGV3JpdGVySW5mby5jcHAKKyAgWDg2RmFzdElTZWwuY3BwCisgIFg4NkZsb2F0aW5nUG9pbnQuY3BwCisgIFg4NklTZWxEQUdUb0RBRy5jcHAKKyAgWDg2SVNlbExvd2VyaW5nLmNwcAorICBYODZJbnN0ckluZm8uY3BwCisgIFg4NkpJVEluZm8uY3BwCisgIFg4Nk1DQXNtSW5mby5jcHAKKyAgWDg2TUNDb2RlRW1pdHRlci5jcHAgCisgIFg4Nk1DSW5zdExvd2VyLmNwcAorICBYODZSZWdpc3RlckluZm8uY3BwCisgIFg4NlNlbGVjdGlvbkRBR0luZm8uY3BwCisgIFg4NlN1YnRhcmdldC5jcHAKKyAgWDg2VGFyZ2V0TWFjaGluZS5jcHAKKyAgWDg2VGFyZ2V0T2JqZWN0RmlsZS5jcHAKKyAgKQorCitpZiggQ01BS0VfQ0xfNjQgKQorICBlbmFibGVfbGFuZ3VhZ2UoQVNNX01BU00pCisgIEFERF9DVVNUT01fQ09NTUFORCgKKyAgICBPVVRQVVQgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1g4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfV2luNjQub2JqCisgICAgQ09NTUFORCAke0NNQUtFX0FTTV9NQVNNX0NPTVBJTEVSfSAvRm8gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1g4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfV2luNjQub2JqIC9jICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9YODZDb21waWxhdGlvbkNhbGxiYWNrX1dpbjY0LmFzbQorICAgIERFUEVORFMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1g4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfV2luNjQuYXNtCisgICApCisgICBzZXQoc291cmNlcyAke3NvdXJjZXN9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9YODZDb21waWxhdGlvbkNhbGxiYWNrX1dpbjY0Lm9iaikKK2VuZGlmKCkKKworYWRkX2xsdm1fdGFyZ2V0KFg4NkNvZGVHZW4gJHtzb3VyY2VzfSkKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvRGlzYXNzZW1ibGVyL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvRGlzYXNzZW1ibGVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTg5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9EaXNhc3NlbWJsZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNCBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTVg4NkRpc2Fzc2VtYmxlcgorICBYODZEaXNhc3NlbWJsZXIuY3BwCisgIFg4NkRpc2Fzc2VtYmxlckRlY29kZXIuYworICApCisjIHdvcmthcm91bmQgZm9yIGhhbmdpbmcgY29tcGlsYXRpb24gb24gTVNWQzkgYW5kIDEwCitpZiggTVNWQ19WRVJTSU9OIEVRVUFMIDE1MDAgT1IgTVNWQ19WRVJTSU9OIEVRVUFMIDE2MDAgKQorc2V0X3Byb3BlcnR5KAorICBTT1VSQ0UgWDg2RGlzYXNzZW1ibGVyLmNwcAorICBQUk9QRVJUWSBDT01QSUxFX0ZMQUdTICIvT2QiCisgICkKK2VuZGlmKCkKK2FkZF9kZXBlbmRlbmNpZXMoTExWTVg4NkRpc2Fzc2VtYmxlciBYODZDb2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvRGlzYXNzZW1ibGVyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvRGlzYXNzZW1ibGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NjlmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9EaXNhc3NlbWJsZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIyM9PT0tIGxpYi9UYXJnZXQvWDg2L0Rpc2Fzc2VtYmxlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNWDg2RGlzYXNzZW1ibGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyB4ODYgdGFyZ2V0IGRpcmVjdG9yeSB0byBncmFiIHByaXZhdGUgaGVhZGVycworQ1BQLkZsYWdzICs9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9EaXNhc3NlbWJsZXIvWDg2RGlzYXNzZW1ibGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0Rpc2Fzc2VtYmxlci9YODZEaXNhc3NlbWJsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjE1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9EaXNhc3NlbWJsZXIvWDg2RGlzYXNzZW1ibGVyLmNwcApAQCAtMCwwICsxLDU1NyBAQAorLy89PT0tIFg4NkRpc2Fzc2VtYmxlci5jcHAgLSBEaXNhc3NlbWJsZXIgZm9yIHg4NiBhbmQgeDg2XzY0IC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgWDg2IERpc2Fzc2VtYmxlci4KKy8vIEl0IGNvbnRhaW5zIGNvZGUgdG8gdHJhbnNsYXRlIHRoZSBkYXRhIHByb2R1Y2VkIGJ5IHRoZSBkZWNvZGVyIGludG8KKy8vICBNQ0luc3RzLgorLy8gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRpc2Fzc2VtYmxlciBjYW4gYmUgZm91bmQgaW4gWDg2RGlzYXNzZW1ibGVyLmguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlg4NkRpc2Fzc2VtYmxlci5oIgorI2luY2x1ZGUgIlg4NkRpc2Fzc2VtYmxlckRlY29kZXIuaCIKKworI2luY2x1ZGUgImxsdm0vTUMvRURJbnN0SW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEaXNhc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRGlzYXNzZW1ibGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlPYmplY3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworI2luY2x1ZGUgIlg4NkdlblJlZ2lzdGVyTmFtZXMuaW5jIgorI2luY2x1ZGUgIlg4NkdlbkVESW5mby5pbmMiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIGxsdm06Olg4NkRpc2Fzc2VtYmxlcjsKKwordm9pZCB4ODZEaXNhc3NlbWJsZXJEZWJ1Zyhjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzKSB7CisgIGRiZ3MoKSA8PCBmaWxlIDw8ICI6IiA8PCBsaW5lIDw8ICI6ICIgPDwgczsKK30KKworI2RlZmluZSBkZWJ1ZyhzKSBERUJVRyh4ODZEaXNhc3NlbWJsZXJEZWJ1ZyhfX0ZJTEVfXywgX19MSU5FX18sIHMpKTsKKworbmFtZXNwYWNlIGxsdm0geyAgCisgIAorLy8gRmlsbC1pbnMgdG8gbWFrZSB0aGUgY29tcGlsZXIgaGFwcHkuICBUaGVzZSBjb25zdGFudHMgYXJlIG5ldmVyIGFjdHVhbGx5CisvLyAgIGFzc2lnbmVkOyB0aGV5IGFyZSBqdXN0IGZpbGxlciB0byBtYWtlIGFuIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIHN3aXRjaAorLy8gICBzdGF0ZW1lbnQgd29yay4KK25hbWVzcGFjZSBYODYgeworICBlbnVtIHsKKyAgICBCWF9TSSA9IDUwMCwKKyAgICBCWF9ESSA9IDUwMSwKKyAgICBCUF9TSSA9IDUwMiwKKyAgICBCUF9ESSA9IDUwMywKKyAgICBzaWIgICA9IDUwNCwKKyAgICBzaWI2NCA9IDUwNQorICB9OworfQorCitleHRlcm4gVGFyZ2V0IFRoZVg4Nl8zMlRhcmdldCwgVGhlWDg2XzY0VGFyZ2V0OworCit9CisKK3N0YXRpYyBib29sIHRyYW5zbGF0ZUluc3RydWN0aW9uKE1DSW5zdCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEluc3RydWN0aW9uICZzb3VyY2UpOworCitYODZHZW5lcmljRGlzYXNzZW1ibGVyOjpYODZHZW5lcmljRGlzYXNzZW1ibGVyKERpc2Fzc2VtYmxlck1vZGUgbW9kZSkgOgorICAgIE1DRGlzYXNzZW1ibGVyKCksCisgICAgZk1vZGUobW9kZSkgeworfQorCitYODZHZW5lcmljRGlzYXNzZW1ibGVyOjp+WDg2R2VuZXJpY0Rpc2Fzc2VtYmxlcigpIHsKK30KKworRURJbnN0SW5mbyAqWDg2R2VuZXJpY0Rpc2Fzc2VtYmxlcjo6Z2V0RURJbmZvKCkgY29uc3QgeworICByZXR1cm4gaW5zdEluZm9YODY7Cit9CisKKy8vLyByZWdpb25SZWFkZXIgLSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHJlYWRCeXRlIG1ldGhvZCBmcm9tCisvLy8gICBNZW1vcnlPYmplY3QuCisvLy8KKy8vLyBAcGFyYW0gYXJnICAgICAgLSBUaGUgZ2VuZXJpYyBjYWxsYmFjayBwYXJhbWV0ZXIuICBJbiB0aGlzIGNhc2UsIHRoaXMgc2hvdWxkCisvLy8gICAgICAgICAgICAgICAgICAgYmUgYSBwb2ludGVyIHRvIGEgTWVtb3J5T2JqZWN0LgorLy8vIEBwYXJhbSBieXRlICAgICAtIEEgcG9pbnRlciB0byB0aGUgYnl0ZSB0byBiZSByZWFkLgorLy8vIEBwYXJhbSBhZGRyZXNzICAtIFRoZSBhZGRyZXNzIHRvIGJlIHJlYWQuCitzdGF0aWMgaW50IHJlZ2lvblJlYWRlcih2b2lkKiBhcmcsIHVpbnQ4X3QqIGJ5dGUsIHVpbnQ2NF90IGFkZHJlc3MpIHsKKyAgTWVtb3J5T2JqZWN0KiByZWdpb24gPSBzdGF0aWNfY2FzdDxNZW1vcnlPYmplY3QqPihhcmcpOworICByZXR1cm4gcmVnaW9uLT5yZWFkQnl0ZShhZGRyZXNzLCBieXRlKTsKK30KKworLy8vIGxvZ2dlciAtIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgb3BlcmF0b3I8PCBtZXRob2QgZnJvbQorLy8vICAgcmF3X29zdHJlYW0uCisvLy8KKy8vLyBAcGFyYW0gYXJnICAgICAgLSBUaGUgZ2VuZXJpYyBjYWxsYmFjayBwYXJhbWV0ZXIuICBUaGlzIHNob3VsZCBiZSBhIHBvaW50ZQorLy8vICAgICAgICAgICAgICAgICAgIHRvIGEgcmF3X29zdHJlYW0uCisvLy8gQHBhcmFtIGxvZyAgICAgIC0gQSBzdHJpbmcgdG8gYmUgbG9nZ2VkLiAgbG9nZ2VyKCkgYWRkcyBhIG5ld2xpbmUuCitzdGF0aWMgdm9pZCBsb2dnZXIodm9pZCogYXJnLCBjb25zdCBjaGFyKiBsb2cpIHsKKyAgaWYgKCFhcmcpCisgICAgcmV0dXJuOworICAKKyAgcmF3X29zdHJlYW0gJnZTdHJlYW0gPSAqKHN0YXRpY19jYXN0PHJhd19vc3RyZWFtKj4oYXJnKSk7CisgIHZTdHJlYW0gPDwgbG9nIDw8ICJcbiI7Cit9ICAKKyAgCisvLworLy8gUHVibGljIGludGVyZmFjZSBmb3IgdGhlIGRpc2Fzc2VtYmxlcgorLy8KKworYm9vbCBYODZHZW5lcmljRGlzYXNzZW1ibGVyOjpnZXRJbnN0cnVjdGlvbihNQ0luc3QgJmluc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5T2JqZWN0ICZyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZ2U3RyZWFtKSBjb25zdCB7CisgIEludGVybmFsSW5zdHJ1Y3Rpb24gaW50ZXJuYWxJbnN0cjsKKyAgCisgIGludCByZXQgPSBkZWNvZGVJbnN0cnVjdGlvbigmaW50ZXJuYWxJbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvblJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSZ2U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNb2RlKTsKKworICBpZiAocmV0KSB7CisgICAgc2l6ZSA9IGludGVybmFsSW5zdHIucmVhZGVyQ3Vyc29yIC0gYWRkcmVzczsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZWxzZSB7CisgICAgc2l6ZSA9IGludGVybmFsSW5zdHIubGVuZ3RoOworICAgIHJldHVybiAhdHJhbnNsYXRlSW5zdHJ1Y3Rpb24oaW5zdHIsIGludGVybmFsSW5zdHIpOworICB9Cit9CisKKy8vCisvLyBQcml2YXRlIGNvZGUgdGhhdCB0cmFuc2xhdGVzIGZyb20gc3RydWN0IEludGVybmFsSW5zdHJ1Y3Rpb25zIHRvIE1DSW5zdHMuCisvLworCisvLy8gdHJhbnNsYXRlUmVnaXN0ZXIgLSBUcmFuc2xhdGVzIGFuIGludGVybmFsIHJlZ2lzdGVyIHRvIHRoZSBhcHByb3ByaWF0ZSBMTFZNCisvLy8gICByZWdpc3RlciwgYW5kIGFwcGVuZHMgaXQgYXMgYW4gb3BlcmFuZCB0byBhbiBNQ0luc3QuCisvLy8KKy8vLyBAcGFyYW0gbWNJbnN0ICAgICAtIFRoZSBNQ0luc3QgdG8gYXBwZW5kIHRvLgorLy8vIEBwYXJhbSByZWcgICAgICAgIC0gVGhlIFJlZyB0byBhcHBlbmQuCitzdGF0aWMgdm9pZCB0cmFuc2xhdGVSZWdpc3RlcihNQ0luc3QgJm1jSW5zdCwgUmVnIHJlZykgeworI2RlZmluZSBFTlRSWSh4KSBYODY6OngsCisgIHVpbnQ4X3QgbGx2bVJlZ251bXNbXSA9IHsKKyAgICBBTExfUkVHUworICAgIDAKKyAgfTsKKyN1bmRlZiBFTlRSWQorCisgIHVpbnQ4X3QgbGx2bVJlZ251bSA9IGxsdm1SZWdudW1zW3JlZ107CisgIG1jSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKGxsdm1SZWdudW0pKTsKK30KKworLy8vIHRyYW5zbGF0ZUltbWVkaWF0ZSAgLSBBcHBlbmRzIGFuIGltbWVkaWF0ZSBvcGVyYW5kIHRvIGFuIE1DSW5zdC4KKy8vLworLy8vIEBwYXJhbSBtY0luc3QgICAgICAgLSBUaGUgTUNJbnN0IHRvIGFwcGVuZCB0by4KKy8vLyBAcGFyYW0gaW1tZWRpYXRlICAgIC0gVGhlIGltbWVkaWF0ZSB2YWx1ZSB0byBhcHBlbmQuCisvLy8gQHBhcmFtIG9wZXJhbmQgICAgICAtIFRoZSBvcGVyYW5kLCBhcyBzdG9yZWQgaW4gdGhlIGRlc2NyaXB0b3IgdGFibGUuCisvLy8gQHBhcmFtIGluc24gICAgICAgICAtIFRoZSBpbnRlcm5hbCBpbnN0cnVjdGlvbi4KK3N0YXRpYyB2b2lkIHRyYW5zbGF0ZUltbWVkaWF0ZShNQ0luc3QgJm1jSW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgaW1tZWRpYXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kU3BlY2lmaWVyICZvcGVyYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsSW5zdHJ1Y3Rpb24gJmluc24pIHsKKyAgLy8gU2lnbi1leHRlbmQgdGhlIGltbWVkaWF0ZSBpZiBuZWNlc3NhcnkuCisKKyAgT3BlcmFuZFR5cGUgdHlwZSA9IG9wZXJhbmQudHlwZTsKKworICBpZiAodHlwZSA9PSBUWVBFX1JFTHYpIHsKKyAgICBzd2l0Y2ggKGluc24uZGlzcGxhY2VtZW50U2l6ZSkgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICB0eXBlID0gVFlQRV9NT0ZGUzg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgdHlwZSA9IFRZUEVfTU9GRlMxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICB0eXBlID0gVFlQRV9NT0ZGUzMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2NDoKKyAgICAgIHR5cGUgPSBUWVBFX01PRkZTNjQ7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUWVBFX01PRkZTODoKKyAgY2FzZSBUWVBFX1JFTDg6CisgICAgaWYoaW1tZWRpYXRlICYgMHg4MCkKKyAgICAgIGltbWVkaWF0ZSB8PSB+KDB4ZmZ1bGwpOworICAgIGJyZWFrOworICBjYXNlIFRZUEVfTU9GRlMxNjoKKyAgICBpZihpbW1lZGlhdGUgJiAweDgwMDApCisgICAgICBpbW1lZGlhdGUgfD0gfigweGZmZmZ1bGwpOworICAgIGJyZWFrOworICBjYXNlIFRZUEVfTU9GRlMzMjoKKyAgY2FzZSBUWVBFX1JFTDMyOgorICBjYXNlIFRZUEVfUkVMNjQ6CisgICAgaWYoaW1tZWRpYXRlICYgMHg4MDAwMDAwMCkKKyAgICAgIGltbWVkaWF0ZSB8PSB+KDB4ZmZmZmZmZmZ1bGwpOworICAgIGJyZWFrOworICBjYXNlIFRZUEVfTU9GRlM2NDoKKyAgZGVmYXVsdDoKKyAgICAvLyBvcGVyYW5kIGlzIDY0IGJpdHMgd2lkZS4gIERvIG5vdGhpbmcuCisgICAgYnJlYWs7CisgIH0KKyAgICAKKyAgbWNJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVJbW0oaW1tZWRpYXRlKSk7Cit9CisKKy8vLyB0cmFuc2xhdGVSTVJlZ2lzdGVyIC0gVHJhbnNsYXRlcyBhIHJlZ2lzdGVyIHN0b3JlZCBpbiB0aGUgUi9NIGZpZWxkIG9mIHRoZQorLy8vICAgTW9kUi9NIGJ5dGUgdG8gaXRzIExMVk0gZXF1aXZhbGVudCBhbmQgYXBwZW5kcyBpdCB0byBhbiBNQ0luc3QuCisvLy8gQHBhcmFtIG1jSW5zdCAgICAgICAtIFRoZSBNQ0luc3QgdG8gYXBwZW5kIHRvLgorLy8vIEBwYXJhbSBpbnNuICAgICAgICAgLSBUaGUgaW50ZXJuYWwgaW5zdHJ1Y3Rpb24gdG8gZXh0cmFjdCB0aGUgUi9NIGZpZWxkCisvLy8gICAgICAgICAgICAgICAgICAgICAgIGZyb20uCisvLy8gQHJldHVybiAgICAgICAgICAgICAtIDAgb24gc3VjY2VzczsgLTEgb3RoZXJ3aXNlCitzdGF0aWMgYm9vbCB0cmFuc2xhdGVSTVJlZ2lzdGVyKE1DSW5zdCAmbWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEluc3RydWN0aW9uICZpbnNuKSB7CisgIGlmIChpbnNuLmVhQmFzZSA9PSBFQV9CQVNFX3NpYiB8fCBpbnNuLmVhQmFzZSA9PSBFQV9CQVNFX3NpYjY0KSB7CisgICAgZGVidWcoIkEgUi9NIHJlZ2lzdGVyIG9wZXJhbmQgbWF5IG5vdCBoYXZlIGEgU0lCIGJ5dGUiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgc3dpdGNoIChpbnNuLmVhQmFzZSkgeworICBkZWZhdWx0OgorICAgIGRlYnVnKCJVbmV4cGVjdGVkIEVBIGJhc2UgcmVnaXN0ZXIiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBFQV9CQVNFX05PTkU6CisgICAgZGVidWcoIkVBX0JBU0VfTk9ORSBmb3IgTW9kUi9NIGJhc2UiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyNkZWZpbmUgRU5UUlkoeCkgY2FzZSBFQV9CQVNFXyMjeDoKKyAgQUxMX0VBX0JBU0VTCisjdW5kZWYgRU5UUlkKKyAgICBkZWJ1ZygiQSBSL00gcmVnaXN0ZXIgb3BlcmFuZCBtYXkgbm90IGhhdmUgYSBiYXNlOyAiCisgICAgICAgICAgInRoZSBvcGVyYW5kIG11c3QgYmUgYSByZWdpc3Rlci4iKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyNkZWZpbmUgRU5UUlkoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgRUFfUkVHXyMjeDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1jSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Q3JlYXRlUmVnKFg4Njo6eCkpOyBicmVhazsKKyAgQUxMX1JFR1MKKyN1bmRlZiBFTlRSWQorICB9CisgIAorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyB0cmFuc2xhdGVSTU1lbW9yeSAtIFRyYW5zbGF0ZXMgYSBtZW1vcnkgb3BlcmFuZCBzdG9yZWQgaW4gdGhlIE1vZCBhbmQgUi9NCisvLy8gICBmaWVsZHMgb2YgYW4gaW50ZXJuYWwgaW5zdHJ1Y3Rpb24gKGFuZCBwb3NzaWJseSBpdHMgU0lCIGJ5dGUpIHRvIGEgbWVtb3J5CisvLy8gICBvcGVyYW5kIGluIExMVk0ncyBmb3JtYXQsIGFuZCBhcHBlbmRzIGl0IHRvIGFuIE1DSW5zdC4KKy8vLworLy8vIEBwYXJhbSBtY0luc3QgICAgICAgLSBUaGUgTUNJbnN0IHRvIGFwcGVuZCB0by4KKy8vLyBAcGFyYW0gaW5zbiAgICAgICAgIC0gVGhlIGluc3RydWN0aW9uIHRvIGV4dHJhY3QgTW9kLCBSL00sIGFuZCBTSUIgZmllbGRzCisvLy8gICAgICAgICAgICAgICAgICAgICAgIGZyb20uCisvLy8gQHJldHVybiAgICAgICAgICAgICAtIDAgb24gc3VjY2Vzczsgbm9uemVybyBvdGhlcndpc2UKK3N0YXRpYyBib29sIHRyYW5zbGF0ZVJNTWVtb3J5KE1DSW5zdCAmbWNJbnN0LCBJbnRlcm5hbEluc3RydWN0aW9uICZpbnNuKSB7CisgIC8vIEFkZHJlc3NlcyBpbiBhbiBNQ0luc3QgYXJlIHJlcHJlc2VudGVkIGFzIGZpdmUgb3BlcmFuZHM6CisgIC8vICAgMS4gYmFzZXJlZyAgICAgICAocmVnaXN0ZXIpICBUaGUgUi9NIGJhc2UsIG9yIChpZiB0aGVyZSBpcyBhIFNJQikgdGhlIAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lCIGJhc2UKKyAgLy8gICAyLiBzY2FsZWFtb3VudCAgIChpbW1lZGlhdGUpIDEsIG9yIChpZiB0aGVyZSBpcyBhIFNJQikgdGhlIHNwZWNpZmllZCAKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlIGFtb3VudAorICAvLyAgIDMuIGluZGV4cmVnICAgICAgKHJlZ2lzdGVyKSAgeDg2X3JlZ2lzdGVyTk9ORSwgb3IgKGlmIHRoZXJlIGlzIGEgU0lCKQorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluZGV4ICh3aGljaCBpcyBtdWx0aXBsaWVkIGJ5IHRoZSAKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlIGFtb3VudCkKKyAgLy8gICA0LiBkaXNwbGFjZW1lbnQgIChpbW1lZGlhdGUpIDAsIG9yIHRoZSBkaXNwbGFjZW1lbnQgaWYgdGhlcmUgaXMgb25lCisgIC8vICAgNS4gc2VnbWVudHJlZyAgICAocmVnaXN0ZXIpICB4ODZfcmVnaXN0ZXJOT05FIGZvciBub3csIGJ1dCBjb3VsZCBiZSBzZXQKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdlIGhhdmUgc2VnbWVudCBvdmVycmlkZXMKKyAgCisgIE1DT3BlcmFuZCBiYXNlUmVnOworICBNQ09wZXJhbmQgc2NhbGVBbW91bnQ7CisgIE1DT3BlcmFuZCBpbmRleFJlZzsKKyAgTUNPcGVyYW5kIGRpc3BsYWNlbWVudDsKKyAgTUNPcGVyYW5kIHNlZ21lbnRSZWc7CisgIAorICBpZiAoaW5zbi5lYUJhc2UgPT0gRUFfQkFTRV9zaWIgfHwgaW5zbi5lYUJhc2UgPT0gRUFfQkFTRV9zaWI2NCkgeworICAgIGlmIChpbnNuLnNpYkJhc2UgIT0gU0lCX0JBU0VfTk9ORSkgeworICAgICAgc3dpdGNoIChpbnNuLnNpYkJhc2UpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGRlYnVnKCJVbmV4cGVjdGVkIHNpYkJhc2UiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisjZGVmaW5lIEVOVFJZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBTSUJfQkFTRV8jI3g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmFzZVJlZyA9IE1DT3BlcmFuZDo6Q3JlYXRlUmVnKFg4Njo6eCk7IGJyZWFrOworICAgICAgQUxMX1NJQl9CQVNFUworI3VuZGVmIEVOVFJZCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGJhc2VSZWcgPSBNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKTsKKyAgICB9CisgICAgCisgICAgaWYgKGluc24uc2liSW5kZXggIT0gU0lCX0lOREVYX05PTkUpIHsKKyAgICAgIHN3aXRjaCAoaW5zbi5zaWJJbmRleCkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZGVidWcoIlVuZXhwZWN0ZWQgc2liSW5kZXgiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisjZGVmaW5lIEVOVFJZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBTSUJfSU5ERVhfIyN4OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW5kZXhSZWcgPSBNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhYODY6OngpOyBicmVhazsKKyAgICAgIEVBX0JBU0VTXzMyQklUCisgICAgICBFQV9CQVNFU182NEJJVAorI3VuZGVmIEVOVFJZCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGV4UmVnID0gTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCk7CisgICAgfQorICAgIAorICAgIHNjYWxlQW1vdW50ID0gTUNPcGVyYW5kOjpDcmVhdGVJbW0oaW5zbi5zaWJTY2FsZSk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChpbnNuLmVhQmFzZSkgeworICAgIGNhc2UgRUFfQkFTRV9OT05FOgorICAgICAgaWYgKGluc24uZWFEaXNwbGFjZW1lbnQgPT0gRUFfRElTUF9OT05FKSB7CisgICAgICAgIGRlYnVnKCJFQV9CQVNFX05PTkUgYW5kIEVBX0RJU1BfTk9ORSBmb3IgTW9kUi9NIGJhc2UiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAoaW5zbi5tb2RlID09IE1PREVfNjRCSVQpCisgICAgICAgIGJhc2VSZWcgPSBNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhYODY6OlJJUCk7IC8vIFNlY3Rpb24gMi4yLjEuNgorICAgICAgZWxzZQorICAgICAgICBiYXNlUmVnID0gTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCk7CisgICAgICAKKyAgICAgIGluZGV4UmVnID0gTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVBX0JBU0VfQlhfU0k6CisgICAgICBiYXNlUmVnID0gTUNPcGVyYW5kOjpDcmVhdGVSZWcoWDg2OjpCWCk7CisgICAgICBpbmRleFJlZyA9IE1DT3BlcmFuZDo6Q3JlYXRlUmVnKFg4Njo6U0kpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFQV9CQVNFX0JYX0RJOgorICAgICAgYmFzZVJlZyA9IE1DT3BlcmFuZDo6Q3JlYXRlUmVnKFg4Njo6QlgpOworICAgICAgaW5kZXhSZWcgPSBNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhYODY6OkRJKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRUFfQkFTRV9CUF9TSToKKyAgICAgIGJhc2VSZWcgPSBNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhYODY6OkJQKTsKKyAgICAgIGluZGV4UmVnID0gTUNPcGVyYW5kOjpDcmVhdGVSZWcoWDg2OjpTSSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVBX0JBU0VfQlBfREk6CisgICAgICBiYXNlUmVnID0gTUNPcGVyYW5kOjpDcmVhdGVSZWcoWDg2OjpCUCk7CisgICAgICBpbmRleFJlZyA9IE1DT3BlcmFuZDo6Q3JlYXRlUmVnKFg4Njo6REkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGluZGV4UmVnID0gTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCk7CisgICAgICBzd2l0Y2ggKGluc24uZWFCYXNlKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBkZWJ1ZygiVW5leHBlY3RlZCBlYUJhc2UiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIEhlcmUsIHdlIHdpbGwgdXNlIHRoZSBmaWxsLWlucyBkZWZpbmVkIGFib3ZlLiAgSG93ZXZlciwKKyAgICAgICAgLy8gICBCWF9TSSwgQlhfREksIEJQX1NJLCBhbmQgQlBfREkgYXJlIGFsbCBoYW5kbGVkIGFib3ZlIGFuZAorICAgICAgICAvLyAgIHNpYiBhbmQgc2liNjQgd2VyZSBoYW5kbGVkIGluIHRoZSB0b3AtbGV2ZWwgaWYsIHNvIHRoZXkncmUgb25seQorICAgICAgICAvLyAgIHBsYWNlaG9sZGVycyB0byBrZWVwIHRoZSBjb21waWxlciBoYXBweS4KKyNkZWZpbmUgRU5UUlkoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBFQV9CQVNFXyMjeDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJhc2VSZWcgPSBNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhYODY6OngpOyBicmVhazsgCisgICAgICBBTExfRUFfQkFTRVMKKyN1bmRlZiBFTlRSWQorI2RlZmluZSBFTlRSWSh4KSBjYXNlIEVBX1JFR18jI3g6CisgICAgICBBTExfUkVHUworI3VuZGVmIEVOVFJZCisgICAgICAgIGRlYnVnKCJBIFIvTSBtZW1vcnkgb3BlcmFuZCBtYXkgbm90IGJlIGEgcmVnaXN0ZXI7ICIKKyAgICAgICAgICAgICAgInRoZSBiYXNlIGZpZWxkIG11c3QgYmUgYSBiYXNlLiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgc2NhbGVBbW91bnQgPSBNQ09wZXJhbmQ6OkNyZWF0ZUltbSgxKTsKKyAgfQorICAKKyAgZGlzcGxhY2VtZW50ID0gTUNPcGVyYW5kOjpDcmVhdGVJbW0oaW5zbi5kaXNwbGFjZW1lbnQpOworICAKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2VnbWVudFJlZ251bXNbU0VHX09WRVJSSURFX21heF0gPSB7CisgICAgMCwgICAgICAgIC8vIFNFR19PVkVSUklERV9OT05FCisgICAgWDg2OjpDUywKKyAgICBYODY6OlNTLAorICAgIFg4Njo6RFMsCisgICAgWDg2OjpFUywKKyAgICBYODY6OkZTLAorICAgIFg4Njo6R1MKKyAgfTsKKyAgCisgIHNlZ21lbnRSZWcgPSBNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhzZWdtZW50UmVnbnVtc1tpbnNuLnNlZ21lbnRPdmVycmlkZV0pOworICAKKyAgbWNJbnN0LmFkZE9wZXJhbmQoYmFzZVJlZyk7CisgIG1jSW5zdC5hZGRPcGVyYW5kKHNjYWxlQW1vdW50KTsKKyAgbWNJbnN0LmFkZE9wZXJhbmQoaW5kZXhSZWcpOworICBtY0luc3QuYWRkT3BlcmFuZChkaXNwbGFjZW1lbnQpOworICBtY0luc3QuYWRkT3BlcmFuZChzZWdtZW50UmVnKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gdHJhbnNsYXRlUk0gLSBUcmFuc2xhdGVzIGFuIG9wZXJhbmQgc3RvcmVkIGluIHRoZSBSL00gKGFuZCBwb3NzaWJseSBTSUIpCisvLy8gICBieXRlIG9mIGFuIGluc3RydWN0aW9uIHRvIExMVk0gZm9ybSwgYW5kIGFwcGVuZHMgaXQgdG8gYW4gTUNJbnN0LgorLy8vCisvLy8gQHBhcmFtIG1jSW5zdCAgICAgICAtIFRoZSBNQ0luc3QgdG8gYXBwZW5kIHRvLgorLy8vIEBwYXJhbSBvcGVyYW5kICAgICAgLSBUaGUgb3BlcmFuZCwgYXMgc3RvcmVkIGluIHRoZSBkZXNjcmlwdG9yIHRhYmxlLgorLy8vIEBwYXJhbSBpbnNuICAgICAgICAgLSBUaGUgaW5zdHJ1Y3Rpb24gdG8gZXh0cmFjdCBNb2QsIFIvTSwgYW5kIFNJQiBmaWVsZHMKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgZnJvbS4KKy8vLyBAcmV0dXJuICAgICAgICAgICAgIC0gMCBvbiBzdWNjZXNzOyBub256ZXJvIG90aGVyd2lzZQorc3RhdGljIGJvb2wgdHJhbnNsYXRlUk0oTUNJbnN0ICZtY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRTcGVjaWZpZXIgJm9wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsSW5zdHJ1Y3Rpb24gJmluc24pIHsKKyAgc3dpdGNoIChvcGVyYW5kLnR5cGUpIHsKKyAgZGVmYXVsdDoKKyAgICBkZWJ1ZygiVW5leHBlY3RlZCB0eXBlIGZvciBhIFIvTSBvcGVyYW5kIik7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgVFlQRV9SODoKKyAgY2FzZSBUWVBFX1IxNjoKKyAgY2FzZSBUWVBFX1IzMjoKKyAgY2FzZSBUWVBFX1I2NDoKKyAgY2FzZSBUWVBFX1J2OgorICBjYXNlIFRZUEVfTU06CisgIGNhc2UgVFlQRV9NTTMyOgorICBjYXNlIFRZUEVfTU02NDoKKyAgY2FzZSBUWVBFX1hNTToKKyAgY2FzZSBUWVBFX1hNTTMyOgorICBjYXNlIFRZUEVfWE1NNjQ6CisgIGNhc2UgVFlQRV9YTU0xMjg6CisgIGNhc2UgVFlQRV9ERUJVR1JFRzoKKyAgY2FzZSBUWVBFX0NPTlRST0xSRUc6CisgICAgcmV0dXJuIHRyYW5zbGF0ZVJNUmVnaXN0ZXIobWNJbnN0LCBpbnNuKTsKKyAgY2FzZSBUWVBFX006CisgIGNhc2UgVFlQRV9NODoKKyAgY2FzZSBUWVBFX00xNjoKKyAgY2FzZSBUWVBFX00zMjoKKyAgY2FzZSBUWVBFX002NDoKKyAgY2FzZSBUWVBFX00xMjg6CisgIGNhc2UgVFlQRV9NNTEyOgorICBjYXNlIFRZUEVfTXY6CisgIGNhc2UgVFlQRV9NMzJGUDoKKyAgY2FzZSBUWVBFX002NEZQOgorICBjYXNlIFRZUEVfTTgwRlA6CisgIGNhc2UgVFlQRV9NMTZJTlQ6CisgIGNhc2UgVFlQRV9NMzJJTlQ6CisgIGNhc2UgVFlQRV9NNjRJTlQ6CisgIGNhc2UgVFlQRV9NMTYxNjoKKyAgY2FzZSBUWVBFX00xNjMyOgorICBjYXNlIFRZUEVfTTE2NjQ6CisgIGNhc2UgVFlQRV9MRUE6CisgICAgcmV0dXJuIHRyYW5zbGF0ZVJNTWVtb3J5KG1jSW5zdCwgaW5zbik7CisgIH0KK30KKyAgCisvLy8gdHJhbnNsYXRlRlBSZWdpc3RlciAtIFRyYW5zbGF0ZXMgYSBzdGFjayBwb3NpdGlvbiBvbiB0aGUgRlBVIHN0YWNrIHRvIGl0cworLy8vICAgTExWTSBmb3JtLCBhbmQgYXBwZW5kcyBpdCB0byBhbiBNQ0luc3QuCisvLy8KKy8vLyBAcGFyYW0gbWNJbnN0ICAgICAgIC0gVGhlIE1DSW5zdCB0byBhcHBlbmQgdG8uCisvLy8gQHBhcmFtIHN0YWNrUG9zICAgICAtIFRoZSBzdGFjayBwb3NpdGlvbiB0byB0cmFuc2xhdGUuCisvLy8gQHJldHVybiAgICAgICAgICAgICAtIDAgb24gc3VjY2Vzczsgbm9uemVybyBvdGhlcndpc2UuCitzdGF0aWMgYm9vbCB0cmFuc2xhdGVGUFJlZ2lzdGVyKE1DSW5zdCAmbWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhY2tQb3MpIHsKKyAgaWYgKHN0YWNrUG9zID49IDgpIHsKKyAgICBkZWJ1ZygiSW52YWxpZCBGUCBzdGFjayBwb3NpdGlvbiIpOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBtY0luc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhYODY6OlNUMCArIHN0YWNrUG9zKSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gdHJhbnNsYXRlT3BlcmFuZCAtIFRyYW5zbGF0ZXMgYW4gb3BlcmFuZCBzdG9yZWQgaW4gYW4gaW50ZXJuYWwgaW5zdHJ1Y3Rpb24gCisvLy8gICB0byBMTFZNJ3MgZm9ybWF0IGFuZCBhcHBlbmRzIGl0IHRvIGFuIE1DSW5zdC4KKy8vLworLy8vIEBwYXJhbSBtY0luc3QgICAgICAgLSBUaGUgTUNJbnN0IHRvIGFwcGVuZCB0by4KKy8vLyBAcGFyYW0gb3BlcmFuZCAgICAgIC0gVGhlIG9wZXJhbmQsIGFzIHN0b3JlZCBpbiB0aGUgZGVzY3JpcHRvciB0YWJsZS4KKy8vLyBAcGFyYW0gaW5zbiAgICAgICAgIC0gVGhlIGludGVybmFsIGluc3RydWN0aW9uLgorLy8vIEByZXR1cm4gICAgICAgICAgICAgLSBmYWxzZSBvbiBzdWNjZXNzOyB0cnVlIG90aGVyd2lzZS4KK3N0YXRpYyBib29sIHRyYW5zbGF0ZU9wZXJhbmQoTUNJbnN0ICZtY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZFNwZWNpZmllciAmb3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEluc3RydWN0aW9uICZpbnNuKSB7CisgIHN3aXRjaCAob3BlcmFuZC5lbmNvZGluZykgeworICBkZWZhdWx0OgorICAgIGRlYnVnKCJVbmhhbmRsZWQgb3BlcmFuZCBlbmNvZGluZyBkdXJpbmcgdHJhbnNsYXRpb24iKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBFTkNPRElOR19SRUc6CisgICAgdHJhbnNsYXRlUmVnaXN0ZXIobWNJbnN0LCBpbnNuLnJlZyk7CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIEVOQ09ESU5HX1JNOgorICAgIHJldHVybiB0cmFuc2xhdGVSTShtY0luc3QsIG9wZXJhbmQsIGluc24pOworICBjYXNlIEVOQ09ESU5HX0NCOgorICBjYXNlIEVOQ09ESU5HX0NXOgorICBjYXNlIEVOQ09ESU5HX0NEOgorICBjYXNlIEVOQ09ESU5HX0NQOgorICBjYXNlIEVOQ09ESU5HX0NPOgorICBjYXNlIEVOQ09ESU5HX0NUOgorICAgIGRlYnVnKCJUcmFuc2xhdGlvbiBvZiBjb2RlIG9mZnNldHMgaXNuJ3Qgc3VwcG9ydGVkLiIpOworICAgIHJldHVybiB0cnVlOworICBjYXNlIEVOQ09ESU5HX0lCOgorICBjYXNlIEVOQ09ESU5HX0lXOgorICBjYXNlIEVOQ09ESU5HX0lEOgorICBjYXNlIEVOQ09ESU5HX0lPOgorICBjYXNlIEVOQ09ESU5HX0l2OgorICBjYXNlIEVOQ09ESU5HX0lhOgorICAgIHRyYW5zbGF0ZUltbWVkaWF0ZShtY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGluc24uaW1tZWRpYXRlc1tpbnNuLm51bUltbWVkaWF0ZXNUcmFuc2xhdGVkKytdLAorICAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kLAorICAgICAgICAgICAgICAgICAgICAgICBpbnNuKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgRU5DT0RJTkdfUkI6CisgIGNhc2UgRU5DT0RJTkdfUlc6CisgIGNhc2UgRU5DT0RJTkdfUkQ6CisgIGNhc2UgRU5DT0RJTkdfUk86CisgICAgdHJhbnNsYXRlUmVnaXN0ZXIobWNJbnN0LCBpbnNuLm9wY29kZVJlZ2lzdGVyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgRU5DT0RJTkdfSToKKyAgICByZXR1cm4gdHJhbnNsYXRlRlBSZWdpc3RlcihtY0luc3QsIGluc24ub3Bjb2RlTW9kaWZpZXIpOworICBjYXNlIEVOQ09ESU5HX1J2OgorICAgIHRyYW5zbGF0ZVJlZ2lzdGVyKG1jSW5zdCwgaW5zbi5vcGNvZGVSZWdpc3Rlcik7CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIEVOQ09ESU5HX0RVUDoKKyAgICByZXR1cm4gdHJhbnNsYXRlT3BlcmFuZChtY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zbi5zcGVjLT5vcGVyYW5kc1tvcGVyYW5kLnR5cGUgLSBUWVBFX0RVUDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc24pOworICB9Cit9CisgIAorLy8vIHRyYW5zbGF0ZUluc3RydWN0aW9uIC0gVHJhbnNsYXRlcyBhbiBpbnRlcm5hbCBpbnN0cnVjdGlvbiBhbmQgYWxsIGl0cworLy8vICAgb3BlcmFuZHMgdG8gYW4gTUNJbnN0LgorLy8vCisvLy8gQHBhcmFtIG1jSW5zdCAgICAgICAtIFRoZSBNQ0luc3QgdG8gcG9wdWxhdGUgd2l0aCB0aGUgaW5zdHJ1Y3Rpb24ncyBkYXRhLgorLy8vIEBwYXJhbSBpbnNuICAgICAgICAgLSBUaGUgaW50ZXJuYWwgaW5zdHJ1Y3Rpb24uCisvLy8gQHJldHVybiAgICAgICAgICAgICAtIGZhbHNlIG9uIHN1Y2Nlc3M7IHRydWUgb3RoZXJ3aXNlLgorc3RhdGljIGJvb2wgdHJhbnNsYXRlSW5zdHJ1Y3Rpb24oTUNJbnN0ICZtY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsSW5zdHJ1Y3Rpb24gJmluc24pIHsgIAorICBpZiAoIWluc24uc3BlYykgeworICAgIGRlYnVnKCJJbnN0cnVjdGlvbiBoYXMgbm8gc3BlY2lmaWNhdGlvbiIpOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBtY0luc3Quc2V0T3Bjb2RlKGluc24uaW5zdHJ1Y3Rpb25JRCk7CisgIAorICBpbnQgaW5kZXg7CisgIAorICBpbnNuLm51bUltbWVkaWF0ZXNUcmFuc2xhdGVkID0gMDsKKyAgCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IFg4Nl9NQVhfT1BFUkFORFM7ICsraW5kZXgpIHsKKyAgICBpZiAoaW5zbi5zcGVjLT5vcGVyYW5kc1tpbmRleF0uZW5jb2RpbmcgIT0gRU5DT0RJTkdfTk9ORSkgeworICAgICAgaWYgKHRyYW5zbGF0ZU9wZXJhbmQobWNJbnN0LCBpbnNuLnNwZWMtPm9wZXJhbmRzW2luZGV4XSwgaW5zbikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIAorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBNQ0Rpc2Fzc2VtYmxlciAqY3JlYXRlWDg2XzMyRGlzYXNzZW1ibGVyKGNvbnN0IFRhcmdldCAmVCkgeworICByZXR1cm4gbmV3IFg4NkRpc2Fzc2VtYmxlcjo6WDg2XzMyRGlzYXNzZW1ibGVyOworfQorCitzdGF0aWMgTUNEaXNhc3NlbWJsZXIgKmNyZWF0ZVg4Nl82NERpc2Fzc2VtYmxlcihjb25zdCBUYXJnZXQgJlQpIHsKKyAgcmV0dXJuIG5ldyBYODZEaXNhc3NlbWJsZXI6Olg4Nl82NERpc2Fzc2VtYmxlcjsKK30KKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplWDg2RGlzYXNzZW1ibGVyKCkgeyAKKyAgLy8gUmVnaXN0ZXIgdGhlIGRpc2Fzc2VtYmxlci4KKyAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNEaXNhc3NlbWJsZXIoVGhlWDg2XzMyVGFyZ2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlWDg2XzMyRGlzYXNzZW1ibGVyKTsKKyAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNEaXNhc3NlbWJsZXIoVGhlWDg2XzY0VGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVYODZfNjREaXNhc3NlbWJsZXIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvRGlzYXNzZW1ibGVyL1g4NkRpc2Fzc2VtYmxlci5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvRGlzYXNzZW1ibGVyL1g4NkRpc2Fzc2VtYmxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTQyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9EaXNhc3NlbWJsZXIvWDg2RGlzYXNzZW1ibGVyLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8vPT09LSBYODZEaXNhc3NlbWJsZXIuaCAtIERpc2Fzc2VtYmxlciBmb3IgeDg2IGFuZCB4ODZfNjQgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIFg4NiBkaXNhc3NlbWJsZXIgaXMgYSB0YWJsZS1kcml2ZW4gZGlzYXNzZW1ibGVyIGZvciB0aGUgMTYtLCAzMi0sIGFuZAorLy8gNjQtYml0IFg4NiBpbnN0cnVjdGlvbiBzZXRzLiAgVGhlIG1haW4gZGVjb2RlIHNlcXVlbmNlIGZvciBhbiBhc3NlbWJseQorLy8gaW5zdHJ1Y3Rpb24gaW4gdGhpcyBkaXNhc3NlbWJsZXIgaXM6CisvLworLy8gMS4gUmVhZCB0aGUgcHJlZml4IGJ5dGVzIGFuZCBkZXRlcm1pbmUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RydWN0aW9uLgorLy8gICAgVGhlc2UgYXR0cmlidXRlcywgcmVjb3JkZWQgaW4gZW51bSBhdHRyaWJ1dGVCaXRzCisvLyAgICAoWDg2RGlzYXNzZW1ibGVyRGVjb2RlckNvbW1vbi5oKSwgZm9ybSBhIGJpdG1hc2suICBUaGUgdGFibGUgQ09OVEVYVFNfU1lNCisvLyAgICBwcm92aWRlcyBhIG1hcHBpbmcgZnJvbSBiaXRtYXNrcyB0byBjb250ZXh0cywgd2hpY2ggYXJlIHJlcHJlc2VudGVkIGJ5CisvLyAgICBlbnVtIEluc3RydWN0aW9uQ29udGV4dCAoaWJpZC4pLgorLy8KKy8vIDIuIFJlYWQgdGhlIG9wY29kZSwgYW5kIGRldGVybWluZSB3aGF0IGtpbmQgb2Ygb3Bjb2RlIGl0IGlzLiAgVGhlCisvLyAgICBkaXNhc3NlbWJsZXIgZGlzdGluZ3Vpc2hlcyBmb3VyIGtpbmRzIG9mIG9wY29kZXMsIHdoaWNoIGFyZSBlbnVtZXJhdGVkIGluCisvLyAgICBPcGNvZGVUeXBlIChYODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmgpOiBvbmUtYnl0ZSAoMHhubiksIHR3by1ieXRlCisvLyAgICAoMHgwZiAweG5uKSwgdGhyZWUtYnl0ZS0zOCAoMHgwZiAweDM4IDB4bm4pLCBvciB0aHJlZS1ieXRlLTNhIAorLy8gICAgKDB4MGYgMHgzYSAweG5uKS4gIE1hbmRhdG9yeSBwcmVmaXhlcyBhcmUgdHJlYXRlZCBhcyBwYXJ0IG9mIHRoZSBjb250ZXh0LgorLy8KKy8vIDMuIERlcGVuZGluZyBvbiB0aGUgb3Bjb2RlIHR5cGUsIGxvb2sgaW4gb25lIG9mIGZvdXIgQ2xhc3NEZWNpc2lvbiBzdHJ1Y3R1cmVzCisvLyAgICAoWDg2RGlzYXNzZW1ibGVyRGVjb2RlckNvbW1vbi5oKS4gIFVzZSB0aGUgb3Bjb2RlIGNsYXNzIHRvIGRldGVybWluZSB3aGljaAorLy8gICAgT3Bjb2RlRGVjaXNpb24gKGliaWQuKSB0byBsb29rIHRoZSBvcGNvZGUgaW4uICBMb29rIHVwIHRoZSBvcGNvZGUsIHRvIGdldAorLy8gICAgYSBNb2RSTURlY2lzaW9uIChpYmlkLikuCisvLworLy8gNC4gU29tZSBpbnN0cnVjdGlvbnMsIHN1Y2ggYXMgZXNjYXBlIG9wY29kZXMgb3IgZXh0ZW5kZWQgb3Bjb2Rlcywgb3IgZXZlbgorLy8gICAgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSBNb2RSTSpSZWcgLyBNb2RSTSpNZW0gZm9ybXMgaW4gTExWTSwgbmVlZCB0aGUKKy8vICAgIE1vZFIvTSBieXRlIHRvIGNvbXBsZXRlIGRlY29kZS4gIFRoZSBNb2RSTURlY2lzaW9uJ3MgdHlwZSBpcyBhbiBlbnRyeSBmcm9tCisvLyAgICBNb2RSTURlY2lzaW9uVHlwZSAoWDg2RGlzYXNzZW1ibGVyRGVjb2RlckNvbW1vbi5oKSB0aGF0IGluZGljYXRlcyBpZiB0aGUKKy8vICAgIE1vZFIvTSBieXRlIGlzIHJlcXVpcmVkIGFuZCBob3cgdG8gaW50ZXJwcmV0IGl0LgorLy8KKy8vIDUuIEFmdGVyIHJlc29sdmluZyB0aGUgTW9kUk1EZWNpc2lvbiwgdGhlIGRpc2Fzc2VtYmxlciBoYXMgYSB1bmlxdWUgSUQKKy8vICAgIG9mIHR5cGUgSW5zdHJVSUQgKFg4NkRpc2Fzc2VtYmxlckRlY29kZXJDb21tb24uaCkuICBMb29raW5nIHRoaXMgSUQgdXAgaW4KKy8vICAgIElOU1RSVUNUSU9OU19TWU0geWllbGRzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbiBhbmQgdGhlIGVuY29kaW5ncyBhbmQKKy8vICAgIG1lYW5pbmdzIG9mIGl0cyBvcGVyYW5kcy4KKy8vCisvLyA2LiBGb3IgZWFjaCBvcGVyYW5kLCBpdHMgZW5jb2RpbmcgaXMgYW4gZW50cnkgZnJvbSBPcGVyYW5kRW5jb2RpbmcKKy8vICAgIChYODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmgpIGFuZCBpdHMgdHlwZSBpcyBhbiBlbnRyeSBmcm9tCisvLyAgICBPcGVyYW5kVHlwZSAoaWJpZC4pLiAgVGhlIGVuY29kaW5nIGluZGljYXRlcyBob3cgdG8gcmVhZCBpdCBmcm9tIHRoZQorLy8gICAgaW5zdHJ1Y3Rpb247IHRoZSB0eXBlIGluZGljYXRlcyBob3cgdG8gaW50ZXJwcmV0IHRoZSB2YWx1ZSBvbmNlIGl0IGhhcworLy8gICAgYmVlbiByZWFkLiAgRm9yIGV4YW1wbGUsIGEgcmVnaXN0ZXIgb3BlcmFuZCBjb3VsZCBiZSBzdG9yZWQgaW4gdGhlIFIvTQorLy8gICAgZmllbGQgb2YgdGhlIE1vZFIvTSBieXRlLCB0aGUgUkVHIGZpZWxkIG9mIHRoZSBNb2RSL00gYnl0ZSwgb3IgYWRkZWQgdG8KKy8vICAgIHRoZSBtYWluIG9wY29kZS4gIFRoaXMgaXMgb3J0aG9nb25hbCBmcm9tIGl0cyBtZWFuaW5nIChhbiBHUFIgb3IgYW4gWE1NCisvLyAgICByZWdpc3RlciwgZm9yIGluc3RhbmNlKS4gIEdpdmVuIHRoaXMgaW5mb3JtYXRpb24sIHRoZSBvcGVyYW5kcyBjYW4gYmUKKy8vICAgIGV4dHJhY3RlZCBhbmQgaW50ZXJwcmV0ZWQuCisvLworLy8gNy4gQXMgdGhlIGxhc3Qgc3RlcCwgdGhlIGRpc2Fzc2VtYmxlciB0cmFuc2xhdGVzIHRoZSBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbgorLy8gICAgYW5kIG9wZXJhbmRzIGludG8gYSBmb3JtYXQgdW5kZXJzdGFuZGFibGUgYnkgdGhlIGNsaWVudCAtIGluIHRoaXMgY2FzZSwgYW4KKy8vICAgIE1DSW5zdCBmb3IgdXNlIGJ5IHRoZSBNQyBpbmZyYXN0cnVjdHVyZS4KKy8vCisvLyBUaGUgZGlzYXNzZW1ibGVyIGlzIGJyb2tlbiBicm9hZGx5IGludG8gdHdvIHBhcnRzOiB0aGUgdGFibGUgZW1pdHRlciB0aGF0CisvLyBlbWl0cyB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlIHRhYmxlcyBkaXNjdXNzZWQgYWJvdmUgZHVyaW5nIGNvbXBpbGF0aW9uLCBhbmQKKy8vIHRoZSBkaXNhc3NlbWJsZXIgaXRzZWxmLiAgVGhlIHRhYmxlIGVtaXR0ZXIgaXMgZG9jdW1lbnRlZCBpbiBtb3JlIGRldGFpbCBpbgorLy8gdXRpbHMvVGFibGVHZW4vWDg2RGlzYXNzZW1ibGVyRW1pdHRlci5oLgorLy8KKy8vIFg4NkRpc2Fzc2VtYmxlci5oIGNvbnRhaW5zIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZvciB0aGUgZGlzYXNzZW1ibGVyLAorLy8gICBhZGhlcmluZyB0byB0aGUgTUNEaXNhc3NlbWJsZXIgaW50ZXJmYWNlLgorLy8gWDg2RGlzYXNzZW1ibGVyLmNwcCBjb250YWlucyB0aGUgY29kZSByZXNwb25zaWJsZSBmb3Igc3RlcCA3LCBhbmQgZm9yCisvLyAgIGludm9raW5nIHRoZSBkZWNvZGVyIHRvIGV4ZWN1dGUgc3RlcHMgMS02LgorLy8gWDg2RGlzYXNzZW1ibGVyRGVjb2RlckNvbW1vbi5oIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBuZWVkZWQgYnkgYm90aCB0aGUKKy8vICAgdGFibGUgZW1pdHRlciBhbmQgdGhlIGRpc2Fzc2VtYmxlci4KKy8vIFg4NkRpc2Fzc2VtYmxlckRlY29kZXIuaCBjb250YWlucyB0aGUgcHVibGljIGludGVyZmFjZSBvZiB0aGUgZGVjb2RlciwKKy8vICAgZmFjdG9yZWQgb3V0IGludG8gQyBmb3IgcG9zc2libGUgdXNlIGJ5IG90aGVyIHByb2plY3RzLgorLy8gWDg2RGlzYXNzZW1ibGVyRGVjb2Rlci5jIGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgZGVjb2Rlciwgd2hpY2ggaXMKKy8vICAgcmVzcG9uc2libGUgZm9yIHN0ZXBzIDEtNi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFg4NkRJU0FTU0VNQkxFUl9ICisjZGVmaW5lIFg4NkRJU0FTU0VNQkxFUl9ICisKKyNkZWZpbmUgSU5TVFJVQ1RJT05fU1BFQ0lGSUVSX0ZJRUxEUyAgXAorICBjb25zdCBjaGFyKiAgICAgICAgICAgICBuYW1lOworCisjZGVmaW5lIElOU1RSVUNUSU9OX0lEUyAgICAgICAgICAgICAgIFwKKyAgSW5zdHJVSUQqICBpbnN0cnVjdGlvbklEczsKKworI2luY2x1ZGUgIlg4NkRpc2Fzc2VtYmxlckRlY29kZXJDb21tb24uaCIKKworI3VuZGVmIElOU1RSVUNUSU9OX1NQRUNJRklFUl9GSUVMRFMKKyN1bmRlZiBJTlNUUlVDVElPTl9JRFMKKworI2luY2x1ZGUgImxsdm0vTUMvTUNEaXNhc3NlbWJsZXIuaCIKKworc3RydWN0IEludGVybmFsSW5zdHJ1Y3Rpb247CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgCitjbGFzcyBNQ0luc3Q7CitjbGFzcyBNZW1vcnlPYmplY3Q7CitjbGFzcyByYXdfb3N0cmVhbTsKKworc3RydWN0IEVESW5zdEluZm87CisgIAorbmFtZXNwYWNlIFg4NkRpc2Fzc2VtYmxlciB7CisKKy8vLyBYODZHZW5lcmljRGlzYXNzZW1ibGVyIC0gR2VuZXJpYyBkaXNhc3NlbWJsZXIgZm9yIGFsbCBYODYgcGxhdGZvcm1zLgorLy8vICAgQWxsIGVhY2ggcGxhdGZvcm0gY2xhc3Mgc2hvdWxkIGhhdmUgdG8gZG8gaXMgc3ViY2xhc3MgdGhlIGNvbnN0cnVjdG9yLCBhbmQKKy8vLyAgIHByb3ZpZGUgYSBkaWZmZXJlbnQgZGlzYXNzZW1ibGVyTW9kZSB2YWx1ZS4KK2NsYXNzIFg4NkdlbmVyaWNEaXNhc3NlbWJsZXIgOiBwdWJsaWMgTUNEaXNhc3NlbWJsZXIgeworcHJvdGVjdGVkOgorICAvLy8gQ29uc3RydWN0b3IgICAgIC0gSW5pdGlhbGl6ZXMgdGhlIGRpc2Fzc2VtYmxlci4KKyAgLy8vCisgIC8vLyBAcGFyYW0gbW9kZSAgICAgLSBUaGUgWDg2IGFyY2hpdGVjdHVyZSBtb2RlIHRvIGRlY29kZSBmb3IuCisgIFg4NkdlbmVyaWNEaXNhc3NlbWJsZXIoRGlzYXNzZW1ibGVyTW9kZSBtb2RlKTsKK3B1YmxpYzoKKyAgflg4NkdlbmVyaWNEaXNhc3NlbWJsZXIoKTsKKworICAvLy8gZ2V0SW5zdHJ1Y3Rpb24gLSBTZWUgTUNEaXNhc3NlbWJsZXIuCisgIGJvb2wgZ2V0SW5zdHJ1Y3Rpb24oTUNJbnN0ICZpbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlPYmplY3QgJnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZ2U3RyZWFtKSBjb25zdDsKKworICAvLy8gZ2V0RURJbmZvIC0gU2VlIE1DRGlzYXNzZW1ibGVyLgorICBFREluc3RJbmZvICpnZXRFREluZm8oKSBjb25zdDsKK3ByaXZhdGU6CisgIERpc2Fzc2VtYmxlck1vZGUgICAgICAgICAgICAgIGZNb2RlOworfTsKKworLy8vIFg4Nl8xNkRpc2Fzc2VtYmxlciAtIDE2LWJpdCBYODYgZGlzYXNzZW1ibGVyLgorY2xhc3MgWDg2XzE2RGlzYXNzZW1ibGVyIDogcHVibGljIFg4NkdlbmVyaWNEaXNhc3NlbWJsZXIgeworcHVibGljOgorICBYODZfMTZEaXNhc3NlbWJsZXIoKSA6CisgICAgWDg2R2VuZXJpY0Rpc2Fzc2VtYmxlcihNT0RFXzE2QklUKSB7CisgIH0KK307ICAKKworLy8vIFg4Nl8xNkRpc2Fzc2VtYmxlciAtIDMyLWJpdCBYODYgZGlzYXNzZW1ibGVyLgorY2xhc3MgWDg2XzMyRGlzYXNzZW1ibGVyIDogcHVibGljIFg4NkdlbmVyaWNEaXNhc3NlbWJsZXIgeworcHVibGljOgorICBYODZfMzJEaXNhc3NlbWJsZXIoKSA6CisgICAgWDg2R2VuZXJpY0Rpc2Fzc2VtYmxlcihNT0RFXzMyQklUKSB7CisgIH0KK307CisKKy8vLyBYODZfMTZEaXNhc3NlbWJsZXIgLSA2NC1iaXQgWDg2IGRpc2Fzc2VtYmxlci4KK2NsYXNzIFg4Nl82NERpc2Fzc2VtYmxlciA6IHB1YmxpYyBYODZHZW5lcmljRGlzYXNzZW1ibGVyIHsKK3B1YmxpYzoKKyAgWDg2XzY0RGlzYXNzZW1ibGVyKCkgOgorICAgIFg4NkdlbmVyaWNEaXNhc3NlbWJsZXIoTU9ERV82NEJJVCkgeworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBYODZEaXNhc3NlbWJsZXIKKyAgCit9IC8vIG5hbWVzcGFjZSBsbHZtCisgIAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9EaXNhc3NlbWJsZXIvWDg2RGlzYXNzZW1ibGVyRGVjb2Rlci5jIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvRGlzYXNzZW1ibGVyL1g4NkRpc2Fzc2VtYmxlckRlY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzNmZjZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvRGlzYXNzZW1ibGVyL1g4NkRpc2Fzc2VtYmxlckRlY29kZXIuYwpAQCAtMCwwICsxLDEzODggQEAKKy8qPT09LSBYODZEaXNhc3NlbWJsZXJEZWNvZGVyLmMgLSBEaXNhc3NlbWJsZXIgZGVjb2RlciAtLS0tLS0tLS0tLS0tKi0gQyAtKi09PSoKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisgKiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBYODYgRGlzYXNzZW1ibGVyLgorICogSXQgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyLgorICogRG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRpc2Fzc2VtYmxlciBjYW4gYmUgZm91bmQgaW4gWDg2RGlzYXNzZW1ibGVyLmguCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPiAgIC8qIGZvciB2YV8qKCkgICAgICAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPiAgICAvKiBmb3IgdnNucHJpbnRmKCkgICovCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgLyogZm9yIGV4aXQoKSAgICAgICAqLworI2luY2x1ZGUgPHN0cmluZy5oPiAgIC8qIGZvciBtZW1zZXQoKSAgICAgKi8KKworI2luY2x1ZGUgIlg4NkRpc2Fzc2VtYmxlckRlY29kZXIuaCIKKworI2luY2x1ZGUgIlg4NkdlbkRpc2Fzc2VtYmxlclRhYmxlcy5pbmMiCisKKyNkZWZpbmUgVFJVRSAgMQorI2RlZmluZSBGQUxTRSAwCisKK3R5cGVkZWYgaW50OF90IGJvb2w7CisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZWxzZQorI2RlZmluZSBOT1JFVFVSTgorI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIGRlYnVnKHMpIGRvIHsgeDg2RGlzYXNzZW1ibGVyRGVidWcoX19GSUxFX18sIF9fTElORV9fLCBzKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGRlYnVnKHMpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qCisgKiBjb250ZXh0Rm9yQXR0cnMgLSBDbGllbnQgZm9yIHRoZSBpbnN0cnVjdGlvbiBjb250ZXh0IHRhYmxlLiAgVGFrZXMgYSBzZXQgb2YKKyAqICAgYXR0cmlidXRlcyBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZGVjb2RlIGNvbnRleHQuCisgKgorICogQHBhcmFtIGF0dHJNYXNrICAtIEF0dHJpYnV0ZXMsIGZyb20gdGhlIGVudW1lcmF0aW9uIGF0dHJpYnV0ZUJpdHMuCisgKiBAcmV0dXJuICAgICAgICAgIC0gVGhlIEluc3RydWN0aW9uQ29udGV4dCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGFuCisgKiAgICAgICAgICAgICAgICAgICAgYW4gaW5zdHJ1Y3Rpb24gd2l0aCB0aGVzZSBhdHRyaWJ1dGVzLgorICovCitzdGF0aWMgSW5zdHJ1Y3Rpb25Db250ZXh0IGNvbnRleHRGb3JBdHRycyh1aW50OF90IGF0dHJNYXNrKSB7CisgIHJldHVybiBDT05URVhUU19TWU1bYXR0ck1hc2tdOworfQorCisvKgorICogbW9kUk1SZXF1aXJlZCAtIFJlYWRzIHRoZSBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbiB0YWJsZSB0byBkZXRlcm1pbmUgd2hldGhlcgorICogICB0aGUgTW9kUi9NIGJ5dGUgaXMgcmVxdWlyZWQgdG8gZGVjb2RlIGEgcGFydGljdWxhciBpbnN0cnVjdGlvbi4KKyAqCisgKiBAcGFyYW0gdHlwZSAgICAgICAgLSBUaGUgb3Bjb2RlIHR5cGUgKGkuZS4sIGhvdyBtYW55IGJ5dGVzIGl0IGhhcykuCisgKiBAcGFyYW0gaW5zbkNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIGluc3RydWN0aW9uLCBhcyByZXR1cm5lZCBieQorICogICAgICAgICAgICAgICAgICAgICAgY29udGV4dEZvckF0dHJzLgorICogQHBhcmFtIG9wY29kZSAgICAgIC0gVGhlIGxhc3QgYnl0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24ncyBvcGNvZGUsIG5vdCBjb3VudGluZworICogICAgICAgICAgICAgICAgICAgICAgTW9kUi9NIGV4dGVuc2lvbnMgYW5kIGVzY2FwZXMuCisgKiBAcmV0dXJuICAgICAgICAgICAgLSBUUlVFIGlmIHRoZSBNb2RSL00gYnl0ZSBpcyByZXF1aXJlZCwgRkFMU0Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IG1vZFJNUmVxdWlyZWQoT3Bjb2RlVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbkNvbnRleHQgaW5zbkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3Bjb2RlKSB7CisgIGNvbnN0IHN0cnVjdCBDb250ZXh0RGVjaXNpb24qIGRlY2lzaW9uID0gMDsKKyAgCisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIE9ORUJZVEU6CisgICAgZGVjaXNpb24gPSAmT05FQllURV9TWU07CisgICAgYnJlYWs7CisgIGNhc2UgVFdPQllURToKKyAgICBkZWNpc2lvbiA9ICZUV09CWVRFX1NZTTsKKyAgICBicmVhazsKKyAgY2FzZSBUSFJFRUJZVEVfMzg6CisgICAgZGVjaXNpb24gPSAmVEhSRUVCWVRFMzhfU1lNOworICAgIGJyZWFrOworICBjYXNlIFRIUkVFQllURV8zQToKKyAgICBkZWNpc2lvbiA9ICZUSFJFRUJZVEUzQV9TWU07CisgICAgYnJlYWs7CisgIH0KKyAgCisgIHJldHVybiBkZWNpc2lvbi0+b3Bjb2RlRGVjaXNpb25zW2luc25Db250ZXh0XS5tb2RSTURlY2lzaW9uc1tvcGNvZGVdLgorICAgIG1vZHJtX3R5cGUgIT0gTU9EUk1fT05FRU5UUlk7CisgIAorICByZXR1cm4gMDsKK30KKworLyoKKyAqIGRlY29kZSAtIFJlYWRzIHRoZSBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbiB0YWJsZSB0byBvYnRhaW4gdGhlIHVuaXF1ZSBJRCBvZgorICogICBhbiBpbnN0cnVjdGlvbi4KKyAqCisgKiBAcGFyYW0gdHlwZSAgICAgICAgLSBTZWUgbW9kUk1SZXF1aXJlZCgpLgorICogQHBhcmFtIGluc25Db250ZXh0IC0gU2VlIG1vZFJNUmVxdWlyZWQoKS4KKyAqIEBwYXJhbSBvcGNvZGUgICAgICAtIFNlZSBtb2RSTVJlcXVpcmVkKCkuCisgKiBAcGFyYW0gbW9kUk0gICAgICAgLSBUaGUgTW9kUi9NIGJ5dGUgaWYgcmVxdWlyZWQsIG9yIGFueSB2YWx1ZSBpZiBub3QuCisgKiBAcmV0dXJuICAgICAgICAgICAgLSBUaGUgVUlEIG9mIHRoZSBpbnN0cnVjdGlvbiwgb3IgMCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgSW5zdHJVSUQgZGVjb2RlKE9wY29kZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb25Db250ZXh0IGluc25Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtb2RSTSkgeworICBzdHJ1Y3QgTW9kUk1EZWNpc2lvbiogZGVjOworICAKKyAgc3dpdGNoICh0eXBlKSB7CisgIGRlZmF1bHQ6CisgICAgZGVidWcoIlVua25vd24gb3Bjb2RlIHR5cGUiKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBPTkVCWVRFOgorICAgIGRlYyA9ICZPTkVCWVRFX1NZTS5vcGNvZGVEZWNpc2lvbnNbaW5zbkNvbnRleHRdLm1vZFJNRGVjaXNpb25zW29wY29kZV07CisgICAgYnJlYWs7CisgIGNhc2UgVFdPQllURToKKyAgICBkZWMgPSAmVFdPQllURV9TWU0ub3Bjb2RlRGVjaXNpb25zW2luc25Db250ZXh0XS5tb2RSTURlY2lzaW9uc1tvcGNvZGVdOworICAgIGJyZWFrOworICBjYXNlIFRIUkVFQllURV8zODoKKyAgICBkZWMgPSAmVEhSRUVCWVRFMzhfU1lNLm9wY29kZURlY2lzaW9uc1tpbnNuQ29udGV4dF0ubW9kUk1EZWNpc2lvbnNbb3Bjb2RlXTsKKyAgICBicmVhazsKKyAgY2FzZSBUSFJFRUJZVEVfM0E6CisgICAgZGVjID0gJlRIUkVFQllURTNBX1NZTS5vcGNvZGVEZWNpc2lvbnNbaW5zbkNvbnRleHRdLm1vZFJNRGVjaXNpb25zW29wY29kZV07CisgICAgYnJlYWs7CisgIH0KKyAgCisgIHN3aXRjaCAoZGVjLT5tb2RybV90eXBlKSB7CisgIGRlZmF1bHQ6CisgICAgZGVidWcoIkNvcnJ1cHQgdGFibGUhICBVbmtub3duIG1vZHJtX3R5cGUiKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBNT0RSTV9PTkVFTlRSWToKKyAgICByZXR1cm4gZGVjLT5pbnN0cnVjdGlvbklEc1swXTsKKyAgY2FzZSBNT0RSTV9TUExJVFJNOgorICAgIGlmIChtb2RGcm9tTW9kUk0obW9kUk0pID09IDB4MykKKyAgICAgIHJldHVybiBkZWMtPmluc3RydWN0aW9uSURzWzFdOworICAgIGVsc2UKKyAgICAgIHJldHVybiBkZWMtPmluc3RydWN0aW9uSURzWzBdOworICBjYXNlIE1PRFJNX0ZVTEw6CisgICAgcmV0dXJuIGRlYy0+aW5zdHJ1Y3Rpb25JRHNbbW9kUk1dOworICB9Cit9CisKKy8qCisgKiBzcGVjaWZpZXJGb3JVSUQgLSBHaXZlbiBhIFVJRCwgcmV0dXJucyB0aGUgbmFtZSBhbmQgb3BlcmFuZCBzcGVjaWZpY2F0aW9uIGZvcgorICogICB0aGF0IGluc3RydWN0aW9uLgorICoKKyAqIEBwYXJhbSB1aWQgLSBUaGUgdW5pcXVlIElEIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIHNob3VsZCBiZSByZXR1cm5lZCBieQorICogICAgICAgICAgICAgIGRlY29kZSgpOyBzcGVjaWZpZXJGb3JVSUQgd2lsbCBub3QgY2hlY2sgYm91bmRzLgorICogQHJldHVybiAgICAtIEEgcG9pbnRlciB0byB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhhdCBpbnN0cnVjdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBJbnN0cnVjdGlvblNwZWNpZmllciogc3BlY2lmaWVyRm9yVUlEKEluc3RyVUlEIHVpZCkgeworICByZXR1cm4gJklOU1RSVUNUSU9OU19TWU1bdWlkXTsKK30KKworLyoKKyAqIGNvbnN1bWVCeXRlIC0gVXNlcyB0aGUgcmVhZGVyIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIHRvIGNvbnN1bWUgb25lCisgKiAgIGJ5dGUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24ncyBtZW1vcnkgYW5kIGFkdmFuY2UgdGhlIGN1cnNvci4KKyAqCisgKiBAcGFyYW0gaW5zbiAgLSBUaGUgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgcmVhZGVyIGZ1bmN0aW9uIHRvIHVzZS4gIFRoZSBjdXJzb3IKKyAqICAgICAgICAgICAgICAgIGZvciB0aGlzIGluc3RydWN0aW9uIGlzIGFkdmFuY2VkLgorICogQHBhcmFtIGJ5dGUgIC0gQSBwb2ludGVyIHRvIGEgcHJlLWFsbG9jYXRlZCBtZW1vcnkgYnVmZmVyIHRvIGJlIHBvcHVsYXRlZAorICogICAgICAgICAgICAgICAgd2l0aCB0aGUgZGF0YSByZWFkLgorICogQHJldHVybiAgICAgIC0gMCBpZiB0aGUgcmVhZCB3YXMgc3VjY2Vzc2Z1bDsgbm9uemVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgY29uc3VtZUJ5dGUoc3RydWN0IEludGVybmFsSW5zdHJ1Y3Rpb24qIGluc24sIHVpbnQ4X3QqIGJ5dGUpIHsKKyAgaW50IHJldCA9IGluc24tPnJlYWRlcihpbnNuLT5yZWFkZXJBcmcsIGJ5dGUsIGluc24tPnJlYWRlckN1cnNvcik7CisgIAorICBpZiAoIXJldCkKKyAgICArKyhpbnNuLT5yZWFkZXJDdXJzb3IpOworICAKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGxvb2tBdEJ5dGUgLSBMaWtlIGNvbnN1bWVCeXRlLCBidXQgZG9lcyBub3QgYWR2YW5jZSB0aGUgY3Vyc29yLgorICoKKyAqIEBwYXJhbSBpbnNuICAtIFNlZSBjb25zdW1lQnl0ZSgpLgorICogQHBhcmFtIGJ5dGUgIC0gU2VlIGNvbnN1bWVCeXRlKCkuCisgKiBAcmV0dXJuICAgICAgLSBTZWUgY29uc3VtZUJ5dGUoKS4KKyAqLworc3RhdGljIGludCBsb29rQXRCeXRlKHN0cnVjdCBJbnRlcm5hbEluc3RydWN0aW9uKiBpbnNuLCB1aW50OF90KiBieXRlKSB7CisgIHJldHVybiBpbnNuLT5yZWFkZXIoaW5zbi0+cmVhZGVyQXJnLCBieXRlLCBpbnNuLT5yZWFkZXJDdXJzb3IpOworfQorCitzdGF0aWMgdm9pZCB1bmNvbnN1bWVCeXRlKHN0cnVjdCBJbnRlcm5hbEluc3RydWN0aW9uKiBpbnNuKSB7CisgIGluc24tPnJlYWRlckN1cnNvci0tOworfQorCisjZGVmaW5lIENPTlNVTUVfRlVOQyhuYW1lLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBpbnQgbmFtZShzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbiwgdHlwZSogcHRyKSB7ICBcCisgICAgdHlwZSBjb21iaW5lZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBzaXplb2YodHlwZSk7ICsrb2Zmc2V0KSB7ICAgICAgICAgICBcCisgICAgICB1aW50OF90IGJ5dGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgcmV0ID0gaW5zbi0+cmVhZGVyKGluc24tPnJlYWRlckFyZywgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc24tPnJlYWRlckN1cnNvciArIG9mZnNldCk7ICAgICAgICBcCisgICAgICBpZiAocmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb21iaW5lZCA9IGNvbWJpbmVkIHwgKCh0eXBlKWJ5dGUgPDwgKCh0eXBlKW9mZnNldCAqIDgpKTsgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKnB0ciA9IGNvbWJpbmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5zbi0+cmVhZGVyQ3Vyc29yICs9IHNpemVvZih0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyoKKyAqIGNvbnN1bWUqIC0gVXNlIHRoZSByZWFkZXIgZnVuY3Rpb24gcHJvdmlkZWQgYnkgdGhlIHVzZXIgdG8gY29uc3VtZSBkYXRhCisgKiAgIHZhbHVlcyBvZiB2YXJpb3VzIHNpemVzIGZyb20gdGhlIGluc3RydWN0aW9uJ3MgbWVtb3J5IGFuZCBhZHZhbmNlIHRoZQorICogICBjdXJzb3IgYXBwcm9wcmlhdGVseS4gIFRoZXNlIHJlYWRlcnMgcGVyZm9ybSBlbmRpYW4gY29udmVyc2lvbi4KKyAqCisgKiBAcGFyYW0gaW5zbiAgICAtIFNlZSBjb25zdW1lQnl0ZSgpLgorICogQHBhcmFtIHB0ciAgICAgLSBBIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBvZiBhcHByb3ByaWF0ZSBzaXplIHRvCisgKiAgICAgICAgICAgICAgICAgIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBkYXRhIHJlYWQuCisgKiBAcmV0dXJuICAgICAgICAtIFNlZSBjb25zdW1lQnl0ZSgpLgorICovCitDT05TVU1FX0ZVTkMoY29uc3VtZUludDgsIGludDhfdCkKK0NPTlNVTUVfRlVOQyhjb25zdW1lSW50MTYsIGludDE2X3QpCitDT05TVU1FX0ZVTkMoY29uc3VtZUludDMyLCBpbnQzMl90KQorQ09OU1VNRV9GVU5DKGNvbnN1bWVVSW50MTYsIHVpbnQxNl90KQorQ09OU1VNRV9GVU5DKGNvbnN1bWVVSW50MzIsIHVpbnQzMl90KQorQ09OU1VNRV9GVU5DKGNvbnN1bWVVSW50NjQsIHVpbnQ2NF90KQorCisvKgorICogZGJncHJpbnRmIC0gVXNlcyB0aGUgbG9nZ2luZyBmdW5jdGlvbiBwcm92aWRlZCBieSB0aGUgdXNlciB0byBsb2cgYSBzaW5nbGUKKyAqICAgbWVzc2FnZSwgdHlwaWNhbGx5IHdpdGhvdXQgYSBjYXJyaWFnZS1yZXR1cm4uCisgKgorICogQHBhcmFtIGluc24gICAgLSBUaGUgaW5zdHJ1Y3Rpb24gY29udGFpbmluZyB0aGUgbG9nZ2luZyBmdW5jdGlvbi4KKyAqIEBwYXJhbSBmb3JtYXQgIC0gU2VlIHByaW50ZigpLgorICogQHBhcmFtIC4uLiAgICAgLSBTZWUgcHJpbnRmKCkuCisgKi8KK3N0YXRpYyB2b2lkIGRiZ3ByaW50ZihzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgLi4uKSB7ICAKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgdmFfbGlzdCBhcDsKKyAgCisgIGlmICghaW5zbi0+ZGxvZykKKyAgICByZXR1cm47CisgICAgCisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICAodm9pZCl2c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZm9ybWF0LCBhcCk7CisgIHZhX2VuZChhcCk7CisgIAorICBpbnNuLT5kbG9nKGluc24tPmRsb2dBcmcsIGJ1ZmZlcik7CisgIAorICByZXR1cm47Cit9CisKKy8qCisgKiBzZXRQcmVmaXhQcmVzZW50IC0gTWFya3MgdGhhdCBhIHBhcnRpY3VsYXIgcHJlZml4IGlzIHByZXNlbnQgYXQgYSBwYXJ0aWN1bGFyCisgKiAgIGxvY2F0aW9uLgorICoKKyAqIEBwYXJhbSBpbnNuICAgICAgLSBUaGUgaW5zdHJ1Y3Rpb24gdG8gYmUgbWFya2VkIGFzIGhhdmluZyB0aGUgcHJlZml4LgorICogQHBhcmFtIHByZWZpeCAgICAtIFRoZSBwcmVmaXggdGhhdCBpcyBwcmVzZW50LgorICogQHBhcmFtIGxvY2F0aW9uICAtIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcHJlZml4IGlzIGxvY2F0ZWQgKGluIHRoZSBhZGRyZXNzCisgKiAgICAgICAgICAgICAgICAgICAgc3BhY2Ugb2YgdGhlIGluc3RydWN0aW9uJ3MgcmVhZGVyKS4KKyAqLworc3RhdGljIHZvaWQgc2V0UHJlZml4UHJlc2VudChzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbG9jYXRpb24pCit7CisgIGluc24tPnByZWZpeFByZXNlbnRbcHJlZml4XSA9IDE7CisgIGluc24tPnByZWZpeExvY2F0aW9uc1twcmVmaXhdID0gbG9jYXRpb247Cit9CisKKy8qCisgKiBpc1ByZWZpeEF0TG9jYXRpb24gLSBRdWVyaWVzIGFuIGluc3RydWN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgcHJlZml4IGlzCisgKiAgIHByZXNlbnQgYXQgYSBnaXZlbiBsb2NhdGlvbi4KKyAqCisgKiBAcGFyYW0gaW5zbiAgICAgIC0gVGhlIGluc3RydWN0aW9uIHRvIGJlIHF1ZXJpZWQuCisgKiBAcGFyYW0gcHJlZml4ICAgIC0gVGhlIHByZWZpeC4KKyAqIEBwYXJhbSBsb2NhdGlvbiAgLSBUaGUgbG9jYXRpb24gdG8gcXVlcnkuCisgKiBAcmV0dXJuICAgICAgICAgIC0gV2hldGhlciB0aGUgcHJlZml4IGlzIGF0IHRoYXQgbG9jYXRpb24uCisgKi8KK3N0YXRpYyBCT09MIGlzUHJlZml4QXRMb2NhdGlvbihzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBsb2NhdGlvbikKK3sKKyAgaWYgKGluc24tPnByZWZpeFByZXNlbnRbcHJlZml4XSA9PSAxICYmCisgICAgIGluc24tPnByZWZpeExvY2F0aW9uc1twcmVmaXhdID09IGxvY2F0aW9uKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogcmVhZFByZWZpeGVzIC0gQ29uc3VtZXMgYWxsIG9mIGFuIGluc3RydWN0aW9uJ3MgcHJlZml4IGJ5dGVzLCBhbmQgbWFya3MgdGhlCisgKiAgIGluc3RydWN0aW9uIGFzIGhhdmluZyB0aGVtLiAgQWxzbyBzZXRzIHRoZSBpbnN0cnVjdGlvbidzIGRlZmF1bHQgb3BlcmFuZCwKKyAqICAgYWRkcmVzcywgYW5kIG90aGVyIHJlbGV2YW50IGRhdGEgc2l6ZXMgdG8gcmVwb3J0IG9wZXJhbmRzIGNvcnJlY3RseS4KKyAqCisgKiBAcGFyYW0gaW5zbiAgLSBUaGUgaW5zdHJ1Y3Rpb24gd2hvc2UgcHJlZml4ZXMgYXJlIHRvIGJlIHJlYWQuCisgKiBAcmV0dXJuICAgICAgLSAwIGlmIHRoZSBpbnN0cnVjdGlvbiBjb3VsZCBiZSByZWFkIHVudGlsIHRoZSBlbmQgb2YgdGhlIHByZWZpeAorICogICAgICAgICAgICAgICAgYnl0ZXMsIGFuZCBubyBwcmVmaXhlcyBjb25mbGljdGVkOyBub256ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCByZWFkUHJlZml4ZXMoc3RydWN0IEludGVybmFsSW5zdHJ1Y3Rpb24qIGluc24pIHsKKyAgQk9PTCBpc1ByZWZpeCA9IFRSVUU7CisgIEJPT0wgcHJlZml4R3JvdXBzWzRdID0geyBGQUxTRSB9OworICB1aW50NjRfdCBwcmVmaXhMb2NhdGlvbjsKKyAgdWludDhfdCBieXRlOworICAKKyAgQk9PTCBoYXNBZFNpemUgPSBGQUxTRTsKKyAgQk9PTCBoYXNPcFNpemUgPSBGQUxTRTsKKyAgCisgIGRiZ3ByaW50ZihpbnNuLCAicmVhZFByZWZpeGVzKCkiKTsKKyAgICAKKyAgd2hpbGUgKGlzUHJlZml4KSB7CisgICAgcHJlZml4TG9jYXRpb24gPSBpbnNuLT5yZWFkZXJDdXJzb3I7CisgICAgCisgICAgaWYgKGNvbnN1bWVCeXRlKGluc24sICZieXRlKSkKKyAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBzd2l0Y2ggKGJ5dGUpIHsKKyAgICBjYXNlIDB4ZjA6ICAvKiBMT0NLICovCisgICAgY2FzZSAweGYyOiAgLyogUkVQTkUvUkVQTlogKi8KKyAgICBjYXNlIDB4ZjM6ICAvKiBSRVAgb3IgUkVQRS9SRVBaICovCisgICAgICBpZiAocHJlZml4R3JvdXBzWzBdKQorICAgICAgICBkYmdwcmludGYoaW5zbiwgIlJlZHVuZGFudCBHcm91cCAxIHByZWZpeCIpOworICAgICAgcHJlZml4R3JvdXBzWzBdID0gVFJVRTsKKyAgICAgIHNldFByZWZpeFByZXNlbnQoaW5zbiwgYnl0ZSwgcHJlZml4TG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDJlOiAgLyogQ1Mgc2VnbWVudCBvdmVycmlkZSAtT1ItIEJyYW5jaCBub3QgdGFrZW4gKi8KKyAgICBjYXNlIDB4MzY6ICAvKiBTUyBzZWdtZW50IG92ZXJyaWRlIC1PUi0gQnJhbmNoIHRha2VuICovCisgICAgY2FzZSAweDNlOiAgLyogRFMgc2VnbWVudCBvdmVycmlkZSAqLworICAgIGNhc2UgMHgyNjogIC8qIEVTIHNlZ21lbnQgb3ZlcnJpZGUgKi8KKyAgICBjYXNlIDB4NjQ6ICAvKiBGUyBzZWdtZW50IG92ZXJyaWRlICovCisgICAgY2FzZSAweDY1OiAgLyogR1Mgc2VnbWVudCBvdmVycmlkZSAqLworICAgICAgc3dpdGNoIChieXRlKSB7CisgICAgICBjYXNlIDB4MmU6CisgICAgICAgIGluc24tPnNlZ21lbnRPdmVycmlkZSA9IFNFR19PVkVSUklERV9DUzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MzY6CisgICAgICAgIGluc24tPnNlZ21lbnRPdmVycmlkZSA9IFNFR19PVkVSUklERV9TUzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4M2U6CisgICAgICAgIGluc24tPnNlZ21lbnRPdmVycmlkZSA9IFNFR19PVkVSUklERV9EUzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MjY6CisgICAgICAgIGluc24tPnNlZ21lbnRPdmVycmlkZSA9IFNFR19PVkVSUklERV9FUzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4NjQ6CisgICAgICAgIGluc24tPnNlZ21lbnRPdmVycmlkZSA9IFNFR19PVkVSUklERV9GUzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4NjU6CisgICAgICAgIGluc24tPnNlZ21lbnRPdmVycmlkZSA9IFNFR19PVkVSUklERV9HUzsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBkZWJ1ZygiVW5oYW5kbGVkIG92ZXJyaWRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChwcmVmaXhHcm91cHNbMV0pCisgICAgICAgIGRiZ3ByaW50ZihpbnNuLCAiUmVkdW5kYW50IEdyb3VwIDIgcHJlZml4Iik7CisgICAgICBwcmVmaXhHcm91cHNbMV0gPSBUUlVFOworICAgICAgc2V0UHJlZml4UHJlc2VudChpbnNuLCBieXRlLCBwcmVmaXhMb2NhdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NjY6ICAvKiBPcGVyYW5kLXNpemUgb3ZlcnJpZGUgKi8KKyAgICAgIGlmIChwcmVmaXhHcm91cHNbMl0pCisgICAgICAgIGRiZ3ByaW50ZihpbnNuLCAiUmVkdW5kYW50IEdyb3VwIDMgcHJlZml4Iik7CisgICAgICBwcmVmaXhHcm91cHNbMl0gPSBUUlVFOworICAgICAgaGFzT3BTaXplID0gVFJVRTsKKyAgICAgIHNldFByZWZpeFByZXNlbnQoaW5zbiwgYnl0ZSwgcHJlZml4TG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDY3OiAgLyogQWRkcmVzcy1zaXplIG92ZXJyaWRlICovCisgICAgICBpZiAocHJlZml4R3JvdXBzWzNdKQorICAgICAgICBkYmdwcmludGYoaW5zbiwgIlJlZHVuZGFudCBHcm91cCA0IHByZWZpeCIpOworICAgICAgcHJlZml4R3JvdXBzWzNdID0gVFJVRTsKKyAgICAgIGhhc0FkU2l6ZSA9IFRSVUU7CisgICAgICBzZXRQcmVmaXhQcmVzZW50KGluc24sIGJ5dGUsIHByZWZpeExvY2F0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIC8qIE5vdCBhIHByZWZpeCBieXRlICovCisgICAgICBpc1ByZWZpeCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlmIChpc1ByZWZpeCkKKyAgICAgIGRiZ3ByaW50ZihpbnNuLCAiRm91bmQgcHJlZml4IDB4JWhoeCIsIGJ5dGUpOworICB9CisgIAorICBpZiAoaW5zbi0+bW9kZSA9PSBNT0RFXzY0QklUKSB7CisgICAgaWYgKChieXRlICYgMHhmMCkgPT0gMHg0MCkgeworICAgICAgdWludDhfdCBvcGNvZGVCeXRlOworICAgICAgCisgICAgICBpZiAobG9va0F0Qnl0ZShpbnNuLCAmb3Bjb2RlQnl0ZSkgfHwgKChvcGNvZGVCeXRlICYgMHhmMCkgPT0gMHg0MCkpIHsKKyAgICAgICAgZGJncHJpbnRmKGluc24sICJSZWR1bmRhbnQgUkVYIHByZWZpeCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICAKKyAgICAgIGluc24tPnJleFByZWZpeCA9IGJ5dGU7CisgICAgICBpbnNuLT5uZWNlc3NhcnlQcmVmaXhMb2NhdGlvbiA9IGluc24tPnJlYWRlckN1cnNvciAtIDI7CisgICAgICAKKyAgICAgIGRiZ3ByaW50ZihpbnNuLCAiRm91bmQgUkVYIHByZWZpeCAweCVoaHgiLCBieXRlKTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAKKyAgICAgIHVuY29uc3VtZUJ5dGUoaW5zbik7CisgICAgICBpbnNuLT5uZWNlc3NhcnlQcmVmaXhMb2NhdGlvbiA9IGluc24tPnJlYWRlckN1cnNvciAtIDE7CisgICAgfQorICB9IGVsc2UgeworICAgIHVuY29uc3VtZUJ5dGUoaW5zbik7CisgIH0KKyAgCisgIGlmIChpbnNuLT5tb2RlID09IE1PREVfMTZCSVQpIHsKKyAgICBpbnNuLT5yZWdpc3RlclNpemUgICAgICAgPSAoaGFzT3BTaXplID8gNCA6IDIpOworICAgIGluc24tPmFkZHJlc3NTaXplICAgICAgICA9IChoYXNBZFNpemUgPyA0IDogMik7CisgICAgaW5zbi0+ZGlzcGxhY2VtZW50U2l6ZSAgID0gKGhhc0FkU2l6ZSA/IDQgOiAyKTsKKyAgICBpbnNuLT5pbW1lZGlhdGVTaXplICAgICAgPSAoaGFzT3BTaXplID8gNCA6IDIpOworICB9IGVsc2UgaWYgKGluc24tPm1vZGUgPT0gTU9ERV8zMkJJVCkgeworICAgIGluc24tPnJlZ2lzdGVyU2l6ZSAgICAgICA9IChoYXNPcFNpemUgPyAyIDogNCk7CisgICAgaW5zbi0+YWRkcmVzc1NpemUgICAgICAgID0gKGhhc0FkU2l6ZSA/IDIgOiA0KTsKKyAgICBpbnNuLT5kaXNwbGFjZW1lbnRTaXplICAgPSAoaGFzQWRTaXplID8gMiA6IDQpOworICAgIGluc24tPmltbWVkaWF0ZVNpemUgICAgICA9IChoYXNBZFNpemUgPyAyIDogNCk7CisgIH0gZWxzZSBpZiAoaW5zbi0+bW9kZSA9PSBNT0RFXzY0QklUKSB7CisgICAgaWYgKGluc24tPnJleFByZWZpeCAmJiB3RnJvbVJFWChpbnNuLT5yZXhQcmVmaXgpKSB7CisgICAgICBpbnNuLT5yZWdpc3RlclNpemUgICAgICAgPSA4OworICAgICAgaW5zbi0+YWRkcmVzc1NpemUgICAgICAgID0gKGhhc0FkU2l6ZSA/IDQgOiA4KTsKKyAgICAgIGluc24tPmRpc3BsYWNlbWVudFNpemUgICA9IDQ7CisgICAgICBpbnNuLT5pbW1lZGlhdGVTaXplICAgICAgPSA0OworICAgIH0gZWxzZSBpZiAoaW5zbi0+cmV4UHJlZml4KSB7CisgICAgICBpbnNuLT5yZWdpc3RlclNpemUgICAgICAgPSAoaGFzT3BTaXplID8gMiA6IDQpOworICAgICAgaW5zbi0+YWRkcmVzc1NpemUgICAgICAgID0gKGhhc0FkU2l6ZSA/IDQgOiA4KTsKKyAgICAgIGluc24tPmRpc3BsYWNlbWVudFNpemUgICA9IChoYXNPcFNpemUgPyAyIDogNCk7CisgICAgICBpbnNuLT5pbW1lZGlhdGVTaXplICAgICAgPSAoaGFzT3BTaXplID8gMiA6IDQpOworICAgIH0gZWxzZSB7CisgICAgICBpbnNuLT5yZWdpc3RlclNpemUgICAgICAgPSAoaGFzT3BTaXplID8gMiA6IDQpOworICAgICAgaW5zbi0+YWRkcmVzc1NpemUgICAgICAgID0gKGhhc0FkU2l6ZSA/IDQgOiA4KTsKKyAgICAgIGluc24tPmRpc3BsYWNlbWVudFNpemUgICA9IChoYXNPcFNpemUgPyAyIDogNCk7CisgICAgICBpbnNuLT5pbW1lZGlhdGVTaXplICAgICAgPSAoaGFzT3BTaXplID8gMiA6IDQpOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWFkT3Bjb2RlIC0gUmVhZHMgdGhlIG9wY29kZSAoZXhjZXB0aW5nIHRoZSBNb2RSL00gYnl0ZSBpbiB0aGUgY2FzZSBvZgorICogICBleHRlbmRlZCBvciBlc2NhcGUgb3Bjb2RlcykuCisgKgorICogQHBhcmFtIGluc24gIC0gVGhlIGluc3RydWN0aW9uIHdob3NlIG9wY29kZSBpcyB0byBiZSByZWFkLgorICogQHJldHVybiAgICAgIC0gMCBpZiB0aGUgb3Bjb2RlIGNvdWxkIGJlIHJlYWQgc3VjY2Vzc2Z1bGx5OyBub256ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCByZWFkT3Bjb2RlKHN0cnVjdCBJbnRlcm5hbEluc3RydWN0aW9uKiBpbnNuKSB7ICAKKyAgLyogRGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIHByaW1hcnkgb3Bjb2RlICovCisgIAorICB1aW50OF90IGN1cnJlbnQ7CisgIAorICBkYmdwcmludGYoaW5zbiwgInJlYWRPcGNvZGUoKSIpOworICAKKyAgaW5zbi0+b3Bjb2RlVHlwZSA9IE9ORUJZVEU7CisgIGlmIChjb25zdW1lQnl0ZShpbnNuLCAmY3VycmVudCkpCisgICAgcmV0dXJuIC0xOworICAKKyAgaWYgKGN1cnJlbnQgPT0gMHgwZikgeworICAgIGRiZ3ByaW50ZihpbnNuLCAiRm91bmQgYSB0d28tYnl0ZSBlc2NhcGUgcHJlZml4ICgweCVoaHgpIiwgY3VycmVudCk7CisgICAgCisgICAgaW5zbi0+dHdvQnl0ZUVzY2FwZSA9IGN1cnJlbnQ7CisgICAgCisgICAgaWYgKGNvbnN1bWVCeXRlKGluc24sICZjdXJyZW50KSkKKyAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBpZiAoY3VycmVudCA9PSAweDM4KSB7CisgICAgICBkYmdwcmludGYoaW5zbiwgIkZvdW5kIGEgdGhyZWUtYnl0ZSBlc2NhcGUgcHJlZml4ICgweCVoaHgpIiwgY3VycmVudCk7CisgICAgICAKKyAgICAgIGluc24tPnRocmVlQnl0ZUVzY2FwZSA9IGN1cnJlbnQ7CisgICAgICAKKyAgICAgIGlmIChjb25zdW1lQnl0ZShpbnNuLCAmY3VycmVudCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIAorICAgICAgaW5zbi0+b3Bjb2RlVHlwZSA9IFRIUkVFQllURV8zODsKKyAgICB9IGVsc2UgaWYgKGN1cnJlbnQgPT0gMHgzYSkgeworICAgICAgZGJncHJpbnRmKGluc24sICJGb3VuZCBhIHRocmVlLWJ5dGUgZXNjYXBlIHByZWZpeCAoMHglaGh4KSIsIGN1cnJlbnQpOworICAgICAgCisgICAgICBpbnNuLT50aHJlZUJ5dGVFc2NhcGUgPSBjdXJyZW50OworICAgICAgCisgICAgICBpZiAoY29uc3VtZUJ5dGUoaW5zbiwgJmN1cnJlbnQpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICAKKyAgICAgIGluc24tPm9wY29kZVR5cGUgPSBUSFJFRUJZVEVfM0E7CisgICAgfSBlbHNlIHsKKyAgICAgIGRiZ3ByaW50ZihpbnNuLCAiRGlkbid0IGZpbmQgYSB0aHJlZS1ieXRlIGVzY2FwZSBwcmVmaXgiKTsKKyAgICAgIAorICAgICAgaW5zbi0+b3Bjb2RlVHlwZSA9IFRXT0JZVEU7CisgICAgfQorICB9CisgIAorICAvKgorICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgY29uc3VtZWQgdGhlIGZ1bGwgb3Bjb2RlLgorICAgKiBBbnl0aGluZyB3ZSBjb25zdW1lIGZyb20gaGVyZSBvbiBtdXN0IGJlIHVuY29uc3VtZWQuCisgICAqLworICAKKyAgaW5zbi0+b3Bjb2RlID0gY3VycmVudDsKKyAgCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRNb2RSTShzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbik7CisKKy8qCisgKiBnZXRJRFdpdGhBdHRyTWFzayAtIERldGVybWluZXMgdGhlIElEIG9mIGFuIGluc3RydWN0aW9uLCBjb25zdW1pbmcKKyAqICAgdGhlIE1vZFIvTSBieXRlIGFzIGFwcHJvcHJpYXRlIGZvciBleHRlbmRlZCBhbmQgZXNjYXBlIG9wY29kZXMsCisgKiAgIGFuZCB1c2luZyBhIHN1cHBsaWVkIGF0dHJpYnV0ZSBtYXNrLgorICoKKyAqIEBwYXJhbSBpbnN0cnVjdGlvbklEIC0gQSBwb2ludGVyIHdob3NlIHRhcmdldCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgSUQgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLgorICogQHBhcmFtIGluc24gICAgICAgICAgLSBUaGUgaW5zdHJ1Y3Rpb24gd2hvc2UgSUQgaXMgdG8gYmUgZGV0ZXJtaW5lZC4KKyAqIEBwYXJhbSBhdHRyTWFzayAgICAgIC0gVGhlIGF0dHJpYnV0ZSBtYXNrIHRvIHNlYXJjaC4KKyAqIEByZXR1cm4gICAgICAgICAgICAgIC0gMCBpZiB0aGUgTW9kUi9NIGNvdWxkIGJlIHJlYWQgd2hlbiBuZWVkZWQgb3Igd2FzIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQ7IG5vbnplcm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGdldElEV2l0aEF0dHJNYXNrKHVpbnQxNl90KiBpbnN0cnVjdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhdHRyTWFzaykgeworICBCT09MIGhhc01vZFJNRXh0ZW5zaW9uOworICAKKyAgdWludDhfdCBpbnN0cnVjdGlvbkNsYXNzOworCisgIGluc3RydWN0aW9uQ2xhc3MgPSBjb250ZXh0Rm9yQXR0cnMoYXR0ck1hc2spOworICAKKyAgaGFzTW9kUk1FeHRlbnNpb24gPSBtb2RSTVJlcXVpcmVkKGluc24tPm9wY29kZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zbi0+b3Bjb2RlKTsKKyAgCisgIGlmIChoYXNNb2RSTUV4dGVuc2lvbikgeworICAgIHJlYWRNb2RSTShpbnNuKTsKKyAgICAKKyAgICAqaW5zdHJ1Y3Rpb25JRCA9IGRlY29kZShpbnNuLT5vcGNvZGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zbi0+b3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc24tPm1vZFJNKTsKKyAgfSBlbHNlIHsKKyAgICAqaW5zdHJ1Y3Rpb25JRCA9IGRlY29kZShpbnNuLT5vcGNvZGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zbi0+b3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICB9CisgICAgICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpczE2Qml0RXF1aXZhbGVudCAtIERldGVybWluZXMgd2hldGhlciB0d28gaW5zdHJ1Y3Rpb24gbmFtZXMgcmVmZXIgdG8KKyAqIGVxdWl2YWxlbnQgaW5zdHJ1Y3Rpb25zIGJ1dCBvbmUgaXMgMTYtYml0IHdoZXJlYXMgdGhlIG90aGVyIGlzIG5vdC4KKyAqCisgKiBAcGFyYW0gb3JpZyAgLSBUaGUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBub3QgMTYtYml0CisgKiBAcGFyYW0gZXF1aXYgLSBUaGUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyAxNi1iaXQKKyAqLworc3RhdGljIEJPT0wgaXMxNkJpdEVxdXZhbGVudChjb25zdCBjaGFyKiBvcmlnLCBjb25zdCBjaGFyKiBlcXVpdikgeworICBvZmZfdCBpOworICAKKyAgZm9yIChpID0gMDs7IGkrKykgeworICAgIGlmIChvcmlnW2ldID09ICdcMCcgJiYgZXF1aXZbaV0gPT0gJ1wwJykKKyAgICAgIHJldHVybiBUUlVFOworICAgIGlmIChvcmlnW2ldID09ICdcMCcgfHwgZXF1aXZbaV0gPT0gJ1wwJykKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAob3JpZ1tpXSAhPSBlcXVpdltpXSkgeworICAgICAgaWYgKChvcmlnW2ldID09ICdRJyB8fCBvcmlnW2ldID09ICdMJykgJiYgZXF1aXZbaV0gPT0gJ1cnKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmICgob3JpZ1tpXSA9PSAnNicgfHwgb3JpZ1tpXSA9PSAnMycpICYmIGVxdWl2W2ldID09ICcxJykKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoKG9yaWdbaV0gPT0gJzQnIHx8IG9yaWdbaV0gPT0gJzInKSAmJiBlcXVpdltpXSA9PSAnNicpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorfQorCisvKgorICogaXM2NEJpdEVxdWl2YWxlbnQgLSBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIGluc3RydWN0aW9uIG5hbWVzIHJlZmVyIHRvCisgKiBlcXVpdmFsZW50IGluc3RydWN0aW9ucyBidXQgb25lIGlzIDY0LWJpdCB3aGVyZWFzIHRoZSBvdGhlciBpcyBub3QuCisgKgorICogQHBhcmFtIG9yaWcgIC0gVGhlIGluc3RydWN0aW9uIHRoYXQgaXMgbm90IDY0LWJpdAorICogQHBhcmFtIGVxdWl2IC0gVGhlIGluc3RydWN0aW9uIHRoYXQgaXMgNjQtYml0CisgKi8KK3N0YXRpYyBCT09MIGlzNjRCaXRFcXVpdmFsZW50KGNvbnN0IGNoYXIqIG9yaWcsIGNvbnN0IGNoYXIqIGVxdWl2KSB7CisgIG9mZl90IGk7CisgIAorICBmb3IgKGkgPSAwOzsgaSsrKSB7CisgICAgaWYgKG9yaWdbaV0gPT0gJ1wwJyAmJiBlcXVpdltpXSA9PSAnXDAnKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKG9yaWdbaV0gPT0gJ1wwJyB8fCBlcXVpdltpXSA9PSAnXDAnKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChvcmlnW2ldICE9IGVxdWl2W2ldKSB7CisgICAgICBpZiAoKG9yaWdbaV0gPT0gJ1cnIHx8IG9yaWdbaV0gPT0gJ0wnKSAmJiBlcXVpdltpXSA9PSAnUScpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKChvcmlnW2ldID09ICcxJyB8fCBvcmlnW2ldID09ICczJykgJiYgZXF1aXZbaV0gPT0gJzYnKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmICgob3JpZ1tpXSA9PSAnNicgfHwgb3JpZ1tpXSA9PSAnMicpICYmIGVxdWl2W2ldID09ICc0JykKKyAgICAgICAgY29udGludWU7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIGdldElEIC0gRGV0ZXJtaW5lcyB0aGUgSUQgb2YgYW4gaW5zdHJ1Y3Rpb24sIGNvbnN1bWluZyB0aGUgTW9kUi9NIGJ5dGUgYXMgCisgKiAgIGFwcHJvcHJpYXRlIGZvciBleHRlbmRlZCBhbmQgZXNjYXBlIG9wY29kZXMuICBEZXRlcm1pbmVzIHRoZSBhdHRyaWJ1dGVzIGFuZCAKKyAqICAgY29udGV4dCBmb3IgdGhlIGluc3RydWN0aW9uIGJlZm9yZSBkb2luZyBzby4KKyAqCisgKiBAcGFyYW0gaW5zbiAgLSBUaGUgaW5zdHJ1Y3Rpb24gd2hvc2UgSUQgaXMgdG8gYmUgZGV0ZXJtaW5lZC4KKyAqIEByZXR1cm4gICAgICAtIDAgaWYgdGhlIE1vZFIvTSBjb3VsZCBiZSByZWFkIHdoZW4gbmVlZGVkIG9yIHdhcyBub3QgbmVlZGVkOworICogICAgICAgICAgICAgICAgbm9uemVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZ2V0SUQoc3RydWN0IEludGVybmFsSW5zdHJ1Y3Rpb24qIGluc24pIHsgIAorICB1aW50OF90IGF0dHJNYXNrOworICB1aW50MTZfdCBpbnN0cnVjdGlvbklEOworICAKKyAgZGJncHJpbnRmKGluc24sICJnZXRJRCgpIik7CisgICAgCisgIGF0dHJNYXNrID0gQVRUUl9OT05FOworICAKKyAgaWYgKGluc24tPm1vZGUgPT0gTU9ERV82NEJJVCkKKyAgICBhdHRyTWFzayB8PSBBVFRSXzY0QklUOworICAKKyAgaWYgKGluc24tPnJleFByZWZpeCAmIDB4MDgpCisgICAgYXR0ck1hc2sgfD0gQVRUUl9SRVhXOworICAKKyAgaWYgKGlzUHJlZml4QXRMb2NhdGlvbihpbnNuLCAweDY2LCBpbnNuLT5uZWNlc3NhcnlQcmVmaXhMb2NhdGlvbikpCisgICAgYXR0ck1hc2sgfD0gQVRUUl9PUFNJWkU7CisgIGVsc2UgaWYgKGlzUHJlZml4QXRMb2NhdGlvbihpbnNuLCAweGYzLCBpbnNuLT5uZWNlc3NhcnlQcmVmaXhMb2NhdGlvbikpCisgICAgYXR0ck1hc2sgfD0gQVRUUl9YUzsKKyAgZWxzZSBpZiAoaXNQcmVmaXhBdExvY2F0aW9uKGluc24sIDB4ZjIsIGluc24tPm5lY2Vzc2FyeVByZWZpeExvY2F0aW9uKSkKKyAgICBhdHRyTWFzayB8PSBBVFRSX1hEOworICAKKyAgaWYgKGdldElEV2l0aEF0dHJNYXNrKCZpbnN0cnVjdGlvbklELCBpbnNuLCBhdHRyTWFzaykpCisgICAgcmV0dXJuIC0xOworICAKKyAgLyogVGhlIGZvbGxvd2luZyBjbGF1c2VzIGNvbXBlbnNhdGUgZm9yIGxpbWl0YXRpb25zIG9mIHRoZSB0YWJsZXMuICovCisgIAorICBpZiAoKGF0dHJNYXNrICYgQVRUUl9YRCkgJiYgKGF0dHJNYXNrICYgQVRUUl9SRVhXKSkgeworICAgIC8qCisgICAgICogQWx0aG91Z2ggZm9yIFNTRSBpbnN0cnVjdGlvbnMgaXQgaXMgdXN1YWxseSBuZWNlc3NhcnkgdG8gdHJlYXQgUkVYLlcrRjIKKyAgICAgKiBhcyBGMiBmb3IgZGVjb2RlIChpbiB0aGUgYWJzZW5jZSBvZiBhIDY0QklUX1JFWFdfWEQgY2F0ZWdvcnkpIHRoZXJlIGlzCisgICAgICogYW4gb2NjYXNpb25hbCBpbnN0cnVjdGlvbiB3aGVyZSBGMiBpcyBpbmNpZGVudGFsIGFuZCBSRVguVyBpcyB0aGUgbW9yZQorICAgICAqIHNpZ25pZmljYW50LiAgSWYgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24gaXMgMzItYml0IGFuZCBhZGRpbmcgUkVYLlcKKyAgICAgKiBpbnN0ZWFkIG9mIEYyIGNoYW5nZXMgYSAzMiB0byBhIDY0LCB3ZSBhZG9wdCB0aGUgbmV3IGVuY29kaW5nLgorICAgICAqLworICAgIAorICAgIHN0cnVjdCBJbnN0cnVjdGlvblNwZWNpZmllciogc3BlYzsKKyAgICB1aW50MTZfdCBpbnN0cnVjdGlvbklEV2l0aFJFWHc7CisgICAgc3RydWN0IEluc3RydWN0aW9uU3BlY2lmaWVyKiBzcGVjV2l0aFJFWHc7CisgICAgCisgICAgc3BlYyA9IHNwZWNpZmllckZvclVJRChpbnN0cnVjdGlvbklEKTsKKyAgICAKKyAgICBpZiAoZ2V0SURXaXRoQXR0ck1hc2soJmluc3RydWN0aW9uSURXaXRoUkVYdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck1hc2sgJiAofkFUVFJfWEQpKSkgeworICAgICAgLyoKKyAgICAgICAqIERlY29kaW5nIHdpdGggUkVYLncgd291bGQgeWllbGQgbm90aGluZzsgZ2l2ZSB1cCBhbmQgcmV0dXJuIG9yaWdpbmFsCisgICAgICAgKiBkZWNvZGUuCisgICAgICAgKi8KKyAgICAgIAorICAgICAgaW5zbi0+aW5zdHJ1Y3Rpb25JRCA9IGluc3RydWN0aW9uSUQ7CisgICAgICBpbnNuLT5zcGVjID0gc3BlYzsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBzcGVjV2l0aFJFWHcgPSBzcGVjaWZpZXJGb3JVSUQoaW5zdHJ1Y3Rpb25JRFdpdGhSRVh3KTsKKyAgICAKKyAgICBpZiAoaXM2NEJpdEVxdWl2YWxlbnQoc3BlYy0+bmFtZSwgc3BlY1dpdGhSRVh3LT5uYW1lKSkgeworICAgICAgaW5zbi0+aW5zdHJ1Y3Rpb25JRCA9IGluc3RydWN0aW9uSURXaXRoUkVYdzsKKyAgICAgIGluc24tPnNwZWMgPSBzcGVjV2l0aFJFWHc7CisgICAgfSBlbHNlIHsKKyAgICAgIGluc24tPmluc3RydWN0aW9uSUQgPSBpbnN0cnVjdGlvbklEOworICAgICAgaW5zbi0+c3BlYyA9IHNwZWM7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisgIAorICBpZiAoaW5zbi0+cHJlZml4UHJlc2VudFsweDY2XSAmJiAhKGF0dHJNYXNrICYgQVRUUl9PUFNJWkUpKSB7CisgICAgLyoKKyAgICAgKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGVzIG1ha2Ugbm8gZGlzdGluY3Rpb24gYmV0d2VlbiBpbnN0cnVjdGlvbnMgdGhhdAorICAgICAqIGFsbG93IE9wU2l6ZSBhbnl3aGVyZSAoaS5lLiwgMTYtYml0IG9wZXJhdGlvbnMpIGFuZCB0aGF0IG5lZWQgaXQgaW4gYQorICAgICAqIHBhcnRpY3VsYXIgc3BvdCAoaS5lLiwgbWFueSBNTVggb3BlcmF0aW9ucykuICBJbiBnZW5lcmFsIHdlJ3JlCisgICAgICogY29uc2VydmF0aXZlLCBidXQgaW4gdGhlIHNwZWNpZmljIGNhc2Ugd2hlcmUgT3BTaXplIGlzIHByZXNlbnQgYnV0IG5vdAorICAgICAqIGluIHRoZSByaWdodCBwbGFjZSB3ZSBjaGVjayBpZiB0aGVyZSdzIGEgMTYtYml0IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICAKKyAgICBzdHJ1Y3QgSW5zdHJ1Y3Rpb25TcGVjaWZpZXIqIHNwZWM7CisgICAgdWludDE2X3QgaW5zdHJ1Y3Rpb25JRFdpdGhPcHNpemU7CisgICAgc3RydWN0IEluc3RydWN0aW9uU3BlY2lmaWVyKiBzcGVjV2l0aE9wc2l6ZTsKKyAgICAKKyAgICBzcGVjID0gc3BlY2lmaWVyRm9yVUlEKGluc3RydWN0aW9uSUQpOworICAgIAorICAgIGlmIChnZXRJRFdpdGhBdHRyTWFzaygmaW5zdHJ1Y3Rpb25JRFdpdGhPcHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJNYXNrIHwgQVRUUl9PUFNJWkUpKSB7CisgICAgICAvKiAKKyAgICAgICAqIE1vZFJNIHJlcXVpcmVkIHdpdGggT3BTaXplIGJ1dCBub3QgcHJlc2VudDsgZ2l2ZSB1cCBhbmQgcmV0dXJuIHZlcnNpb24KKyAgICAgICAqIHdpdGhvdXQgT3BTaXplIHNldAorICAgICAgICovCisgICAgICAKKyAgICAgIGluc24tPmluc3RydWN0aW9uSUQgPSBpbnN0cnVjdGlvbklEOworICAgICAgaW5zbi0+c3BlYyA9IHNwZWM7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgc3BlY1dpdGhPcHNpemUgPSBzcGVjaWZpZXJGb3JVSUQoaW5zdHJ1Y3Rpb25JRFdpdGhPcHNpemUpOworICAgIAorICAgIGlmIChpczE2Qml0RXF1dmFsZW50KHNwZWMtPm5hbWUsIHNwZWNXaXRoT3BzaXplLT5uYW1lKSkgeworICAgICAgaW5zbi0+aW5zdHJ1Y3Rpb25JRCA9IGluc3RydWN0aW9uSURXaXRoT3BzaXplOworICAgICAgaW5zbi0+c3BlYyA9IHNwZWNXaXRoT3BzaXplOworICAgIH0gZWxzZSB7CisgICAgICBpbnNuLT5pbnN0cnVjdGlvbklEID0gaW5zdHJ1Y3Rpb25JRDsKKyAgICAgIGluc24tPnNwZWMgPSBzcGVjOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaW5zbi0+aW5zdHJ1Y3Rpb25JRCA9IGluc3RydWN0aW9uSUQ7CisgIGluc24tPnNwZWMgPSBzcGVjaWZpZXJGb3JVSUQoaW5zbi0+aW5zdHJ1Y3Rpb25JRCk7CisgIAorICByZXR1cm4gMDsKK30KKworLyoKKyAqIHJlYWRTSUIgLSBDb25zdW1lcyB0aGUgU0lCIGJ5dGUgdG8gZGV0ZXJtaW5lIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gZm9yIGFuCisgKiAgIGluc3RydWN0aW9uLgorICoKKyAqIEBwYXJhbSBpbnNuICAtIFRoZSBpbnN0cnVjdGlvbiB3aG9zZSBTSUIgYnl0ZSBpcyB0byBiZSByZWFkLgorICogQHJldHVybiAgICAgIC0gMCBpZiB0aGUgU0lCIGJ5dGUgd2FzIHN1Y2Nlc3NmdWxseSByZWFkOyBub256ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCByZWFkU0lCKHN0cnVjdCBJbnRlcm5hbEluc3RydWN0aW9uKiBpbnNuKSB7CisgIFNJQkluZGV4IHNpYkluZGV4QmFzZSA9IDA7CisgIFNJQkJhc2Ugc2liQmFzZUJhc2UgPSAwOworICB1aW50OF90IGluZGV4LCBiYXNlOworICAKKyAgZGJncHJpbnRmKGluc24sICJyZWFkU0lCKCkiKTsKKyAgCisgIGlmIChpbnNuLT5jb25zdW1lZFNJQikKKyAgICByZXR1cm4gMDsKKyAgCisgIGluc24tPmNvbnN1bWVkU0lCID0gVFJVRTsKKyAgCisgIHN3aXRjaCAoaW5zbi0+YWRkcmVzc1NpemUpIHsKKyAgY2FzZSAyOgorICAgIGRiZ3ByaW50ZihpbnNuLCAiU0lCLWJhc2VkIGFkZHJlc3NpbmcgZG9lc24ndCB3b3JrIGluIDE2LWJpdCBtb2RlIik7CisgICAgcmV0dXJuIC0xOworICAgIGJyZWFrOworICBjYXNlIDQ6CisgICAgc2liSW5kZXhCYXNlID0gU0lCX0lOREVYX0VBWDsKKyAgICBzaWJCYXNlQmFzZSA9IFNJQl9CQVNFX0VBWDsKKyAgICBicmVhazsKKyAgY2FzZSA4OgorICAgIHNpYkluZGV4QmFzZSA9IFNJQl9JTkRFWF9SQVg7CisgICAgc2liQmFzZUJhc2UgPSBTSUJfQkFTRV9SQVg7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoY29uc3VtZUJ5dGUoaW5zbiwgJmluc24tPnNpYikpCisgICAgcmV0dXJuIC0xOworICAKKyAgaW5kZXggPSBpbmRleEZyb21TSUIoaW5zbi0+c2liKSB8ICh4RnJvbVJFWChpbnNuLT5yZXhQcmVmaXgpIDw8IDMpOworICAKKyAgc3dpdGNoIChpbmRleCkgeworICBjYXNlIDB4NDoKKyAgICBpbnNuLT5zaWJJbmRleCA9IFNJQl9JTkRFWF9OT05FOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGluc24tPnNpYkluZGV4ID0gKEVBQmFzZSkoc2liSW5kZXhCYXNlICsgaW5kZXgpOworICAgIGlmIChpbnNuLT5zaWJJbmRleCA9PSBTSUJfSU5ERVhfc2liIHx8CisgICAgICAgIGluc24tPnNpYkluZGV4ID09IFNJQl9JTkRFWF9zaWI2NCkKKyAgICAgIGluc24tPnNpYkluZGV4ID0gU0lCX0lOREVYX05PTkU7CisgICAgYnJlYWs7CisgIH0KKyAgCisgIHN3aXRjaCAoc2NhbGVGcm9tU0lCKGluc24tPnNpYikpIHsKKyAgY2FzZSAwOgorICAgIGluc24tPnNpYlNjYWxlID0gMTsKKyAgICBicmVhazsKKyAgY2FzZSAxOgorICAgIGluc24tPnNpYlNjYWxlID0gMjsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIGluc24tPnNpYlNjYWxlID0gNDsKKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgIGluc24tPnNpYlNjYWxlID0gODsKKyAgICBicmVhazsKKyAgfQorICAKKyAgYmFzZSA9IGJhc2VGcm9tU0lCKGluc24tPnNpYikgfCAoYkZyb21SRVgoaW5zbi0+cmV4UHJlZml4KSA8PCAzKTsKKyAgCisgIHN3aXRjaCAoYmFzZSkgeworICBjYXNlIDB4NToKKyAgICBzd2l0Y2ggKG1vZEZyb21Nb2RSTShpbnNuLT5tb2RSTSkpIHsKKyAgICBjYXNlIDB4MDoKKyAgICAgIGluc24tPmVhRGlzcGxhY2VtZW50ID0gRUFfRElTUF8zMjsKKyAgICAgIGluc24tPnNpYkJhc2UgPSBTSUJfQkFTRV9OT05FOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDE6CisgICAgICBpbnNuLT5lYURpc3BsYWNlbWVudCA9IEVBX0RJU1BfODsKKyAgICAgIGluc24tPnNpYkJhc2UgPSAoaW5zbi0+YWRkcmVzc1NpemUgPT0gNCA/IAorICAgICAgICAgICAgICAgICAgICAgICBTSUJfQkFTRV9FQlAgOiBTSUJfQkFTRV9SQlApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDI6CisgICAgICBpbnNuLT5lYURpc3BsYWNlbWVudCA9IEVBX0RJU1BfMzI7CisgICAgICBpbnNuLT5zaWJCYXNlID0gKGluc24tPmFkZHJlc3NTaXplID09IDQgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgU0lCX0JBU0VfRUJQIDogU0lCX0JBU0VfUkJQKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzOgorICAgICAgZGVidWcoIkNhbm5vdCBoYXZlIE1vZCA9IDBiMTEgYW5kIGEgU0lCIGJ5dGUiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgaW5zbi0+c2liQmFzZSA9IChFQUJhc2UpKHNpYkJhc2VCYXNlICsgYmFzZSk7CisgICAgYnJlYWs7CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCisvKgorICogcmVhZERpc3BsYWNlbWVudCAtIENvbnN1bWVzIHRoZSBkaXNwbGFjZW1lbnQgb2YgYW4gaW5zdHJ1Y3Rpb24uCisgKgorICogQHBhcmFtIGluc24gIC0gVGhlIGluc3RydWN0aW9uIHdob3NlIGRpc3BsYWNlbWVudCBpcyB0byBiZSByZWFkLgorICogQHJldHVybiAgICAgIC0gMCBpZiB0aGUgZGlzcGxhY2VtZW50IGJ5dGUgd2FzIHN1Y2Nlc3NmdWxseSByZWFkOyBub256ZXJvIAorICogICAgICAgICAgICAgICAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHJlYWREaXNwbGFjZW1lbnQoc3RydWN0IEludGVybmFsSW5zdHJ1Y3Rpb24qIGluc24pIHsgIAorICBpbnQ4X3QgZDg7CisgIGludDE2X3QgZDE2OworICBpbnQzMl90IGQzMjsKKyAgCisgIGRiZ3ByaW50ZihpbnNuLCAicmVhZERpc3BsYWNlbWVudCgpIik7CisgIAorICBpZiAoaW5zbi0+Y29uc3VtZWREaXNwbGFjZW1lbnQpCisgICAgcmV0dXJuIDA7CisgIAorICBpbnNuLT5jb25zdW1lZERpc3BsYWNlbWVudCA9IFRSVUU7CisgIAorICBzd2l0Y2ggKGluc24tPmVhRGlzcGxhY2VtZW50KSB7CisgIGNhc2UgRUFfRElTUF9OT05FOgorICAgIGluc24tPmNvbnN1bWVkRGlzcGxhY2VtZW50ID0gRkFMU0U7CisgICAgYnJlYWs7CisgIGNhc2UgRUFfRElTUF84OgorICAgIGlmIChjb25zdW1lSW50OChpbnNuLCAmZDgpKQorICAgICAgcmV0dXJuIC0xOworICAgIGluc24tPmRpc3BsYWNlbWVudCA9IGQ4OworICAgIGJyZWFrOworICBjYXNlIEVBX0RJU1BfMTY6CisgICAgaWYgKGNvbnN1bWVJbnQxNihpbnNuLCAmZDE2KSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBpbnNuLT5kaXNwbGFjZW1lbnQgPSBkMTY7CisgICAgYnJlYWs7CisgIGNhc2UgRUFfRElTUF8zMjoKKyAgICBpZiAoY29uc3VtZUludDMyKGluc24sICZkMzIpKQorICAgICAgcmV0dXJuIC0xOworICAgIGluc24tPmRpc3BsYWNlbWVudCA9IGQzMjsKKyAgICBicmVhazsKKyAgfQorICAKKyAgaW5zbi0+Y29uc3VtZWREaXNwbGFjZW1lbnQgPSBUUlVFOworICByZXR1cm4gMDsKK30KKworLyoKKyAqIHJlYWRNb2RSTSAtIENvbnN1bWVzIGFsbCBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIChNb2RSL00gYnl0ZSwgU0lCIGJ5dGUsIGFuZAorICogICBkaXNwbGFjZW1lbnQpIGZvciBhbiBpbnN0cnVjdGlvbiBhbmQgaW50ZXJwcmV0cyBpdC4KKyAqCisgKiBAcGFyYW0gaW5zbiAgLSBUaGUgaW5zdHJ1Y3Rpb24gd2hvc2UgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBpcyB0byBiZSByZWFkLgorICogQHJldHVybiAgICAgIC0gMCBpZiB0aGUgaW5mb3JtYXRpb24gd2FzIHN1Y2Nlc3NmdWxseSByZWFkOyBub256ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCByZWFkTW9kUk0oc3RydWN0IEludGVybmFsSW5zdHJ1Y3Rpb24qIGluc24pIHsgIAorICB1aW50OF90IG1vZCwgcm0sIHJlZzsKKyAgCisgIGRiZ3ByaW50ZihpbnNuLCAicmVhZE1vZFJNKCkiKTsKKyAgCisgIGlmIChpbnNuLT5jb25zdW1lZE1vZFJNKQorICAgIHJldHVybiAwOworICAKKyAgY29uc3VtZUJ5dGUoaW5zbiwgJmluc24tPm1vZFJNKTsKKyAgaW5zbi0+Y29uc3VtZWRNb2RSTSA9IFRSVUU7CisgIAorICBtb2QgICAgID0gbW9kRnJvbU1vZFJNKGluc24tPm1vZFJNKTsKKyAgcm0gICAgICA9IHJtRnJvbU1vZFJNKGluc24tPm1vZFJNKTsKKyAgcmVnICAgICA9IHJlZ0Zyb21Nb2RSTShpbnNuLT5tb2RSTSk7CisgIAorICAvKgorICAgKiBUaGlzIGdvZXMgYnkgaW5zbi0+cmVnaXN0ZXJTaXplIHRvIHBpY2sgdGhlIGNvcnJlY3QgcmVnaXN0ZXIsIHdoaWNoIG1lc3NlcworICAgKiB1cCBpZiB3ZSdyZSB1c2luZyAoc2F5KSBYTU0gb3IgOC1iaXQgcmVnaXN0ZXIgb3BlcmFuZHMuICBUaGF0IGdldHMgZml4ZWQgaW4KKyAgICogZml4dXBSZWcoKS4KKyAgICovCisgIHN3aXRjaCAoaW5zbi0+cmVnaXN0ZXJTaXplKSB7CisgIGNhc2UgMjoKKyAgICBpbnNuLT5yZWdCYXNlID0gTU9EUk1fUkVHX0FYOworICAgIGluc24tPmVhUmVnQmFzZSA9IEVBX1JFR19BWDsKKyAgICBicmVhazsKKyAgY2FzZSA0OgorICAgIGluc24tPnJlZ0Jhc2UgPSBNT0RSTV9SRUdfRUFYOworICAgIGluc24tPmVhUmVnQmFzZSA9IEVBX1JFR19FQVg7CisgICAgYnJlYWs7CisgIGNhc2UgODoKKyAgICBpbnNuLT5yZWdCYXNlID0gTU9EUk1fUkVHX1JBWDsKKyAgICBpbnNuLT5lYVJlZ0Jhc2UgPSBFQV9SRUdfUkFYOworICAgIGJyZWFrOworICB9CisgIAorICByZWcgfD0gckZyb21SRVgoaW5zbi0+cmV4UHJlZml4KSA8PCAzOworICBybSAgfD0gYkZyb21SRVgoaW5zbi0+cmV4UHJlZml4KSA8PCAzOworICAKKyAgaW5zbi0+cmVnID0gKFJlZykoaW5zbi0+cmVnQmFzZSArIHJlZyk7CisgIAorICBzd2l0Y2ggKGluc24tPmFkZHJlc3NTaXplKSB7CisgIGNhc2UgMjoKKyAgICBpbnNuLT5lYUJhc2VCYXNlID0gRUFfQkFTRV9CWF9TSTsKKyAgICAgCisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDB4MDoKKyAgICAgIGlmIChybSA9PSAweDYpIHsKKyAgICAgICAgaW5zbi0+ZWFCYXNlID0gRUFfQkFTRV9OT05FOworICAgICAgICBpbnNuLT5lYURpc3BsYWNlbWVudCA9IEVBX0RJU1BfMTY7CisgICAgICAgIGlmIChyZWFkRGlzcGxhY2VtZW50KGluc24pKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluc24tPmVhQmFzZSA9IChFQUJhc2UpKGluc24tPmVhQmFzZUJhc2UgKyBybSk7CisgICAgICAgIGluc24tPmVhRGlzcGxhY2VtZW50ID0gRUFfRElTUF9OT05FOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAweDE6CisgICAgICBpbnNuLT5lYUJhc2UgPSAoRUFCYXNlKShpbnNuLT5lYUJhc2VCYXNlICsgcm0pOworICAgICAgaW5zbi0+ZWFEaXNwbGFjZW1lbnQgPSBFQV9ESVNQXzg7CisgICAgICBpZiAocmVhZERpc3BsYWNlbWVudChpbnNuKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDI6CisgICAgICBpbnNuLT5lYUJhc2UgPSAoRUFCYXNlKShpbnNuLT5lYUJhc2VCYXNlICsgcm0pOworICAgICAgaW5zbi0+ZWFEaXNwbGFjZW1lbnQgPSBFQV9ESVNQXzE2OworICAgICAgaWYgKHJlYWREaXNwbGFjZW1lbnQoaW5zbikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzOgorICAgICAgaW5zbi0+ZWFCYXNlID0gKEVBQmFzZSkoaW5zbi0+ZWFSZWdCYXNlICsgcm0pOworICAgICAgaWYgKHJlYWREaXNwbGFjZW1lbnQoaW5zbikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA0OgorICBjYXNlIDg6CisgICAgaW5zbi0+ZWFCYXNlQmFzZSA9IChpbnNuLT5hZGRyZXNzU2l6ZSA9PSA0ID8gRUFfQkFTRV9FQVggOiBFQV9CQVNFX1JBWCk7CisgICAgCisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDB4MDoKKyAgICAgIGluc24tPmVhRGlzcGxhY2VtZW50ID0gRUFfRElTUF9OT05FOyAvKiByZWFkU0lCIG1heSBvdmVycmlkZSB0aGlzICovCisgICAgICBzd2l0Y2ggKHJtKSB7CisgICAgICBjYXNlIDB4NDoKKyAgICAgIGNhc2UgMHhjOiAgIC8qIGluIGNhc2UgUkVYVy5iIGlzIHNldCAqLworICAgICAgICBpbnNuLT5lYUJhc2UgPSAoaW5zbi0+YWRkcmVzc1NpemUgPT0gNCA/IAorICAgICAgICAgICAgICAgICAgICAgICAgRUFfQkFTRV9zaWIgOiBFQV9CQVNFX3NpYjY0KTsKKyAgICAgICAgcmVhZFNJQihpbnNuKTsKKyAgICAgICAgaWYgKHJlYWREaXNwbGFjZW1lbnQoaW5zbikpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHg1OgorICAgICAgICBpbnNuLT5lYUJhc2UgPSBFQV9CQVNFX05PTkU7CisgICAgICAgIGluc24tPmVhRGlzcGxhY2VtZW50ID0gRUFfRElTUF8zMjsKKyAgICAgICAgaWYgKHJlYWREaXNwbGFjZW1lbnQoaW5zbikpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGluc24tPmVhQmFzZSA9IChFQUJhc2UpKGluc24tPmVhQmFzZUJhc2UgKyBybSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAweDE6CisgICAgY2FzZSAweDI6CisgICAgICBpbnNuLT5lYURpc3BsYWNlbWVudCA9IChtb2QgPT0gMHgxID8gRUFfRElTUF84IDogRUFfRElTUF8zMik7CisgICAgICBzd2l0Y2ggKHJtKSB7CisgICAgICBjYXNlIDB4NDoKKyAgICAgIGNhc2UgMHhjOiAgIC8qIGluIGNhc2UgUkVYVy5iIGlzIHNldCAqLworICAgICAgICBpbnNuLT5lYUJhc2UgPSBFQV9CQVNFX3NpYjsKKyAgICAgICAgcmVhZFNJQihpbnNuKTsKKyAgICAgICAgaWYgKHJlYWREaXNwbGFjZW1lbnQoaW5zbikpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGluc24tPmVhQmFzZSA9IChFQUJhc2UpKGluc24tPmVhQmFzZUJhc2UgKyBybSk7CisgICAgICAgIGlmIChyZWFkRGlzcGxhY2VtZW50KGluc24pKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MzoKKyAgICAgIGluc24tPmVhRGlzcGxhY2VtZW50ID0gRUFfRElTUF9OT05FOworICAgICAgaW5zbi0+ZWFCYXNlID0gKEVBQmFzZSkoaW5zbi0+ZWFSZWdCYXNlICsgcm0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICB9IC8qIHN3aXRjaCAoaW5zbi0+YWRkcmVzc1NpemUpICovCisgIAorICByZXR1cm4gMDsKK30KKworI2RlZmluZSBHRU5FUklDX0ZJWFVQX0ZVTkMobmFtZSwgYmFzZSwgcHJlZml4KSAgICAgICAgICAgIFwKKyAgc3RhdGljIHVpbnQ4X3QgbmFtZShzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiAqaW5zbiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZFR5cGUgdHlwZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5kZXgsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp2YWxpZCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgKnZhbGlkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN3aXRjaCAodHlwZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkZWJ1ZygiVW5oYW5kbGVkIHJlZ2lzdGVyIHR5cGUiKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgKnZhbGlkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBUWVBFX1J2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGJhc2UgKyBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIFRZUEVfUjg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoaW5zbi0+cmV4UHJlZml4ICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgaW5kZXggPj0gNCAmJiBpbmRleCA8PSA3KSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHByZWZpeCMjX1NQTCArIChpbmRleCAtIDQpOyAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gcHJlZml4IyNfQUwgKyBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBUWVBFX1IxNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIHByZWZpeCMjX0FYICsgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIFRZUEVfUjMyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gcHJlZml4IyNfRUFYICsgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgVFlQRV9SNjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBwcmVmaXgjI19SQVggKyBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBUWVBFX1hNTTEyODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgVFlQRV9YTU02NDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIFRZUEVfWE1NMzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBUWVBFX1hNTTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIHByZWZpeCMjX1hNTTAgKyBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIFRZUEVfTU02NDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBUWVBFX01NMzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgVFlQRV9NTTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChpbmRleCA+IDcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICp2YWxpZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIHByZWZpeCMjX01NMCArIGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIFRZUEVfU0VHTUVOVFJFRzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoaW5kZXggPiA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqdmFsaWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBwcmVmaXgjI19FUyArIGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBUWVBFX0RFQlVHUkVHOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKGluZGV4ID4gNykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKnZhbGlkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gcHJlZml4IyNfRFIwICsgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgVFlQRV9DT05UUk9MUkVHOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChpbmRleCA+IDgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICp2YWxpZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIHByZWZpeCMjX0NSMCArIGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyoKKyAqIGZpeHVwKlZhbHVlIC0gQ29uc3VsdHMgYW4gb3BlcmFuZCB0eXBlIHRvIGRldGVybWluZSB0aGUgbWVhbmluZyBvZiB0aGUKKyAqICAgcmVnIG9yIFIvTSBmaWVsZC4gIElmIHRoZSBvcGVyYW5kIGlzIGFuIFhNTSBvcGVyYW5kLCBmb3IgZXhhbXBsZSwgYW4KKyAqICAgb3BlcmFuZCB3b3VsZCBiZSBYTU0wIGluc3RlYWQgb2YgQVgsIHdoaWNoIHJlYWRNb2RSTSgpIHdvdWxkIG90aGVyd2lzZQorICogICBtaXNpbnRlcnByZXQgaXQgYXMuCisgKgorICogQHBhcmFtIGluc24gIC0gVGhlIGluc3RydWN0aW9uIGNvbnRhaW5pbmcgdGhlIG9wZXJhbmQuCisgKiBAcGFyYW0gdHlwZSAgLSBUaGUgb3BlcmFuZCB0eXBlLgorICogQHBhcmFtIGluZGV4IC0gVGhlIGV4aXN0aW5nIHZhbHVlIG9mIHRoZSBmaWVsZCBhcyByZXBvcnRlZCBieSByZWFkTW9kUk0oKS4KKyAqIEBwYXJhbSB2YWxpZCAtIFRoZSBhZGRyZXNzIG9mIGEgdWludDhfdC4gIFRoZSB0YXJnZXQgaXMgc2V0IHRvIDEgaWYgdGhlCisgKiAgICAgICAgICAgICAgICBmaWVsZCBpcyB2YWxpZCBmb3IgdGhlIHJlZ2lzdGVyIGNsYXNzOyAwIGlmIG5vdC4KKyAqIEByZXR1cm4gICAgICAtIFRoZSBwcm9wZXIgdmFsdWUuCisgKi8KK0dFTkVSSUNfRklYVVBfRlVOQyhmaXh1cFJlZ1ZhbHVlLCBpbnNuLT5yZWdCYXNlLCAgICBNT0RSTV9SRUcpCitHRU5FUklDX0ZJWFVQX0ZVTkMoZml4dXBSTVZhbHVlLCAgaW5zbi0+ZWFSZWdCYXNlLCAgRUFfUkVHKQorCisvKgorICogZml4dXBSZWcgLSBDb25zdWx0cyBhbiBvcGVyYW5kIHNwZWNpZmllciB0byBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlCisgKiAgIGZpeHVwKlZhbHVlIGZ1bmN0aW9ucyB0byB1c2UgaW4gY29ycmVjdGluZyByZWFkTW9kUk0oKSdzcyBpbnRlcnByZXRhdGlvbi4KKyAqCisgKiBAcGFyYW0gaW5zbiAgLSBTZWUgZml4dXAqVmFsdWUoKS4KKyAqIEBwYXJhbSBvcCAgICAtIFRoZSBvcGVyYW5kIHNwZWNpZmllci4KKyAqIEByZXR1cm4gICAgICAtIDAgaWYgZml4dXAgd2FzIHN1Y2Nlc3NmdWw7IC0xIGlmIHRoZSByZWdpc3RlciByZXR1cm5lZCB3YXMKKyAqICAgICAgICAgICAgICAgIGludmFsaWQgZm9yIGl0cyBjbGFzcy4KKyAqLworc3RhdGljIGludCBmaXh1cFJlZyhzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiAqaW5zbiwgCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBPcGVyYW5kU3BlY2lmaWVyICpvcCkgeworICB1aW50OF90IHZhbGlkOworICAKKyAgZGJncHJpbnRmKGluc24sICJmaXh1cFJlZygpIik7CisgIAorICBzd2l0Y2ggKChPcGVyYW5kRW5jb2Rpbmcpb3AtPmVuY29kaW5nKSB7CisgIGRlZmF1bHQ6CisgICAgZGVidWcoIkV4cGVjdGVkIGEgUkVHIG9yIFIvTSBlbmNvZGluZyBpbiBmaXh1cFJlZyIpOworICAgIHJldHVybiAtMTsKKyAgY2FzZSBFTkNPRElOR19SRUc6CisgICAgaW5zbi0+cmVnID0gKFJlZylmaXh1cFJlZ1ZhbHVlKGluc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPcGVyYW5kVHlwZSlvcC0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zbi0+cmVnIC0gaW5zbi0+cmVnQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBpZiAoIXZhbGlkKQorICAgICAgcmV0dXJuIC0xOworICAgIGJyZWFrOworICBjYXNlIEVOQ09ESU5HX1JNOgorICAgIGlmIChpbnNuLT5lYUJhc2UgPj0gaW5zbi0+ZWFSZWdCYXNlKSB7CisgICAgICBpbnNuLT5lYUJhc2UgPSAoRUFCYXNlKWZpeHVwUk1WYWx1ZShpbnNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9wZXJhbmRUeXBlKW9wLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zbi0+ZWFCYXNlIC0gaW5zbi0+ZWFSZWdCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICAgIGlmICghdmFsaWQpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCisvKgorICogcmVhZE9wY29kZU1vZGlmaWVyIC0gUmVhZHMgYW4gb3BlcmFuZCBmcm9tIHRoZSBvcGNvZGUgZmllbGQgb2YgYW4gCisgKiAgIGluc3RydWN0aW9uLiAgSGFuZGxlcyBBZGRSZWdGcm0gaW5zdHJ1Y3Rpb25zLgorICoKKyAqIEBwYXJhbSBpbnNuICAgIC0gVGhlIGluc3RydWN0aW9uIHdob3NlIG9wY29kZSBmaWVsZCBpcyB0byBiZSByZWFkLgorICogQHBhcmFtIGluTW9kUk0gLSBJbmRpY2F0ZXMgdGhhdCB0aGUgb3Bjb2RlIGZpZWxkIGlzIHRvIGJlIHJlYWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgTW9kUi9NIGV4dGVuc2lvbjsgdXNlZnVsIGZvciBlc2NhcGUgb3Bjb2RlcworICogQHJldHVybiAgICAgICAgLSAwIG9uIHN1Y2Nlc3M7IG5vbnplcm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHJlYWRPcGNvZGVNb2RpZmllcihzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbikgeworICBkYmdwcmludGYoaW5zbiwgInJlYWRPcGNvZGVNb2RpZmllcigpIik7CisgIAorICBpZiAoaW5zbi0+Y29uc3VtZWRPcGNvZGVNb2RpZmllcikKKyAgICByZXR1cm4gMDsKKyAgCisgIGluc24tPmNvbnN1bWVkT3Bjb2RlTW9kaWZpZXIgPSBUUlVFOworICAKKyAgc3dpdGNoIChpbnNuLT5zcGVjLT5tb2RpZmllclR5cGUpIHsKKyAgZGVmYXVsdDoKKyAgICBkZWJ1ZygiVW5rbm93biBtb2RpZmllciB0eXBlLiIpOworICAgIHJldHVybiAtMTsKKyAgY2FzZSBNT0RJRklFUl9OT05FOgorICAgIGRlYnVnKCJObyBtb2RpZmllciBidXQgYW4gb3BlcmFuZCBleHBlY3RzIG9uZS4iKTsKKyAgICByZXR1cm4gLTE7CisgIGNhc2UgTU9ESUZJRVJfT1BDT0RFOgorICAgIGluc24tPm9wY29kZU1vZGlmaWVyID0gaW5zbi0+b3Bjb2RlIC0gaW5zbi0+c3BlYy0+bW9kaWZpZXJCYXNlOworICAgIHJldHVybiAwOworICBjYXNlIE1PRElGSUVSX01PRFJNOgorICAgIGluc24tPm9wY29kZU1vZGlmaWVyID0gaW5zbi0+bW9kUk0gLSBpbnNuLT5zcGVjLT5tb2RpZmllckJhc2U7CisgICAgcmV0dXJuIDA7CisgIH0gIAorfQorCisvKgorICogcmVhZE9wY29kZVJlZ2lzdGVyIC0gUmVhZHMgYW4gb3BlcmFuZCBmcm9tIHRoZSBvcGNvZGUgZmllbGQgb2YgYW4gCisgKiAgIGluc3RydWN0aW9uIGFuZCBpbnRlcnByZXRzIGl0IGFwcHJvcHJpYXRlbHkgZ2l2ZW4gdGhlIG9wZXJhbmQgd2lkdGguCisgKiAgIEhhbmRsZXMgQWRkUmVnRnJtIGluc3RydWN0aW9ucy4KKyAqCisgKiBAcGFyYW0gaW5zbiAgLSBTZWUgcmVhZE9wY29kZU1vZGlmaWVyKCkuCisgKiBAcGFyYW0gc2l6ZSAgLSBUaGUgd2lkdGggKGluIGJ5dGVzKSBvZiB0aGUgcmVnaXN0ZXIgYmVpbmcgc3BlY2lmaWVkLgorICogICAgICAgICAgICAgICAgMSBtZWFucyBBTCBhbmQgZnJpZW5kcywgMiBtZWFucyBBWCwgNCBtZWFucyBFQVgsIGFuZCA4IG1lYW5zCisgKiAgICAgICAgICAgICAgICBSQVguCisgKiBAcmV0dXJuICAgICAgLSAwIG9uIHN1Y2Nlc3M7IG5vbnplcm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHJlYWRPcGNvZGVSZWdpc3RlcihzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbiwgdWludDhfdCBzaXplKSB7CisgIGRiZ3ByaW50ZihpbnNuLCAicmVhZE9wY29kZVJlZ2lzdGVyKCkiKTsKKworICBpZiAocmVhZE9wY29kZU1vZGlmaWVyKGluc24pKQorICAgIHJldHVybiAtMTsKKyAgCisgIGlmIChzaXplID09IDApCisgICAgc2l6ZSA9IGluc24tPnJlZ2lzdGVyU2l6ZTsKKyAgCisgIHN3aXRjaCAoc2l6ZSkgeworICBjYXNlIDE6CisgICAgaW5zbi0+b3Bjb2RlUmVnaXN0ZXIgPSAoUmVnKShNT0RSTV9SRUdfQUwgKyAoKGJGcm9tUkVYKGluc24tPnJleFByZWZpeCkgPDwgMykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5zbi0+b3Bjb2RlTW9kaWZpZXIpKTsKKyAgICBpZiAoaW5zbi0+cmV4UHJlZml4ICYmIAorICAgICAgICBpbnNuLT5vcGNvZGVSZWdpc3RlciA+PSBNT0RSTV9SRUdfQUwgKyAweDQgJiYKKyAgICAgICAgaW5zbi0+b3Bjb2RlUmVnaXN0ZXIgPCBNT0RSTV9SRUdfQUwgKyAweDgpIHsKKyAgICAgIGluc24tPm9wY29kZVJlZ2lzdGVyID0gKFJlZykoTU9EUk1fUkVHX1NQTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChpbnNuLT5vcGNvZGVSZWdpc3RlciAtIE1PRFJNX1JFR19BTCAtIDQpKTsKKyAgICB9CisgICAgICAKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIGluc24tPm9wY29kZVJlZ2lzdGVyID0gKFJlZykoTU9EUk1fUkVHX0FYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoYkZyb21SRVgoaW5zbi0+cmV4UHJlZml4KSA8PCAzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5zbi0+b3Bjb2RlTW9kaWZpZXIpKTsKKyAgICBicmVhazsKKyAgY2FzZSA0OgorICAgIGluc24tPm9wY29kZVJlZ2lzdGVyID0gKFJlZykoTU9EUk1fUkVHX0VBWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKGJGcm9tUkVYKGluc24tPnJleFByZWZpeCkgPDwgMykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluc24tPm9wY29kZU1vZGlmaWVyKSk7CisgICAgYnJlYWs7CisgIGNhc2UgODoKKyAgICBpbnNuLT5vcGNvZGVSZWdpc3RlciA9IChSZWcpKE1PRFJNX1JFR19SQVggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoYkZyb21SRVgoaW5zbi0+cmV4UHJlZml4KSA8PCAzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5zbi0+b3Bjb2RlTW9kaWZpZXIpKTsKKyAgICBicmVhazsKKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWFkSW1tZWRpYXRlIC0gQ29uc3VtZXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQgZnJvbSBhbiBpbnN0cnVjdGlvbiwgZ2l2ZW4gdGhlCisgKiAgIGRlc2lyZWQgb3BlcmFuZCBzaXplLgorICoKKyAqIEBwYXJhbSBpbnNuICAtIFRoZSBpbnN0cnVjdGlvbiB3aG9zZSBvcGVyYW5kIGlzIHRvIGJlIHJlYWQuCisgKiBAcGFyYW0gc2l6ZSAgLSBUaGUgd2lkdGggKGluIGJ5dGVzKSBvZiB0aGUgb3BlcmFuZC4KKyAqIEByZXR1cm4gICAgICAtIDAgaWYgdGhlIGltbWVkaWF0ZSB3YXMgc3VjY2Vzc2Z1bGx5IGNvbnN1bWVkOyBub256ZXJvCisgKiAgICAgICAgICAgICAgICBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgcmVhZEltbWVkaWF0ZShzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbiwgdWludDhfdCBzaXplKSB7CisgIHVpbnQ4X3QgaW1tODsKKyAgdWludDE2X3QgaW1tMTY7CisgIHVpbnQzMl90IGltbTMyOworICB1aW50NjRfdCBpbW02NDsKKyAgCisgIGRiZ3ByaW50ZihpbnNuLCAicmVhZEltbWVkaWF0ZSgpIik7CisgIAorICBpZiAoaW5zbi0+bnVtSW1tZWRpYXRlc0NvbnN1bWVkID09IDIpIHsKKyAgICBkZWJ1ZygiQWxyZWFkeSBjb25zdW1lZCB0d28gaW1tZWRpYXRlcyIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAKKyAgaWYgKHNpemUgPT0gMCkKKyAgICBzaXplID0gaW5zbi0+aW1tZWRpYXRlU2l6ZTsKKyAgZWxzZQorICAgIGluc24tPmltbWVkaWF0ZVNpemUgPSBzaXplOworICAKKyAgc3dpdGNoIChzaXplKSB7CisgIGNhc2UgMToKKyAgICBpZiAoY29uc3VtZUJ5dGUoaW5zbiwgJmltbTgpKQorICAgICAgcmV0dXJuIC0xOworICAgIGluc24tPmltbWVkaWF0ZXNbaW5zbi0+bnVtSW1tZWRpYXRlc0NvbnN1bWVkXSA9IGltbTg7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBpZiAoY29uc3VtZVVJbnQxNihpbnNuLCAmaW1tMTYpKQorICAgICAgcmV0dXJuIC0xOworICAgIGluc24tPmltbWVkaWF0ZXNbaW5zbi0+bnVtSW1tZWRpYXRlc0NvbnN1bWVkXSA9IGltbTE2OworICAgIGJyZWFrOworICBjYXNlIDQ6CisgICAgaWYgKGNvbnN1bWVVSW50MzIoaW5zbiwgJmltbTMyKSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBpbnNuLT5pbW1lZGlhdGVzW2luc24tPm51bUltbWVkaWF0ZXNDb25zdW1lZF0gPSBpbW0zMjsKKyAgICBicmVhazsKKyAgY2FzZSA4OgorICAgIGlmIChjb25zdW1lVUludDY0KGluc24sICZpbW02NCkpCisgICAgICByZXR1cm4gLTE7CisgICAgaW5zbi0+aW1tZWRpYXRlc1tpbnNuLT5udW1JbW1lZGlhdGVzQ29uc3VtZWRdID0gaW1tNjQ7CisgICAgYnJlYWs7CisgIH0KKyAgCisgIGluc24tPm51bUltbWVkaWF0ZXNDb25zdW1lZCsrOworICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWFkT3BlcmFuZHMgLSBDb25zdWx0cyB0aGUgc3BlY2lmaWVyIGZvciBhbiBpbnN0cnVjdGlvbiBhbmQgY29uc3VtZXMgYWxsCisgKiAgIG9wZXJhbmRzIGZvciB0aGF0IGluc3RydWN0aW9uLCBpbnRlcnByZXRpbmcgdGhlbSBhcyBpdCBnb2VzLgorICoKKyAqIEBwYXJhbSBpbnNuICAtIFRoZSBpbnN0cnVjdGlvbiB3aG9zZSBvcGVyYW5kcyBhcmUgdG8gYmUgcmVhZCBhbmQgaW50ZXJwcmV0ZWQuCisgKiBAcmV0dXJuICAgICAgLSAwIGlmIGFsbCBvcGVyYW5kcyBjb3VsZCBiZSByZWFkOyBub256ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCByZWFkT3BlcmFuZHMoc3RydWN0IEludGVybmFsSW5zdHJ1Y3Rpb24qIGluc24pIHsKKyAgaW50IGluZGV4OworICAKKyAgZGJncHJpbnRmKGluc24sICJyZWFkT3BlcmFuZHMoKSIpOworICAKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgWDg2X01BWF9PUEVSQU5EUzsgKytpbmRleCkgeworICAgIHN3aXRjaCAoaW5zbi0+c3BlYy0+b3BlcmFuZHNbaW5kZXhdLmVuY29kaW5nKSB7CisgICAgY2FzZSBFTkNPRElOR19OT05FOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkNPRElOR19SRUc6CisgICAgY2FzZSBFTkNPRElOR19STToKKyAgICAgIGlmIChyZWFkTW9kUk0oaW5zbikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmIChmaXh1cFJlZyhpbnNuLCAmaW5zbi0+c3BlYy0+b3BlcmFuZHNbaW5kZXhdKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkNPRElOR19DQjoKKyAgICBjYXNlIEVOQ09ESU5HX0NXOgorICAgIGNhc2UgRU5DT0RJTkdfQ0Q6CisgICAgY2FzZSBFTkNPRElOR19DUDoKKyAgICBjYXNlIEVOQ09ESU5HX0NPOgorICAgIGNhc2UgRU5DT0RJTkdfQ1Q6CisgICAgICBkYmdwcmludGYoaW5zbiwgIldlIGN1cnJlbnRseSBkb24ndCBoYW5kZSBjb2RlLW9mZnNldCBlbmNvZGluZ3MiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEVOQ09ESU5HX0lCOgorICAgICAgaWYgKHJlYWRJbW1lZGlhdGUoaW5zbiwgMSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmIChpbnNuLT5zcGVjLT5vcGVyYW5kc1tpbmRleF0udHlwZSA9PSBUWVBFX0lNTTMgJiYKKyAgICAgICAgICBpbnNuLT5pbW1lZGlhdGVzW2luc24tPm51bUltbWVkaWF0ZXNDb25zdW1lZCAtIDFdID4gNykKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkNPRElOR19JVzoKKyAgICAgIGlmIChyZWFkSW1tZWRpYXRlKGluc24sIDIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVOQ09ESU5HX0lEOgorICAgICAgaWYgKHJlYWRJbW1lZGlhdGUoaW5zbiwgNCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRU5DT0RJTkdfSU86CisgICAgICBpZiAocmVhZEltbWVkaWF0ZShpbnNuLCA4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkNPRElOR19JdjoKKyAgICAgIGlmIChyZWFkSW1tZWRpYXRlKGluc24sIGluc24tPmltbWVkaWF0ZVNpemUpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVOQ09ESU5HX0lhOgorICAgICAgaWYgKHJlYWRJbW1lZGlhdGUoaW5zbiwgaW5zbi0+YWRkcmVzc1NpemUpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVOQ09ESU5HX1JCOgorICAgICAgaWYgKHJlYWRPcGNvZGVSZWdpc3RlcihpbnNuLCAxKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkNPRElOR19SVzoKKyAgICAgIGlmIChyZWFkT3Bjb2RlUmVnaXN0ZXIoaW5zbiwgMikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRU5DT0RJTkdfUkQ6CisgICAgICBpZiAocmVhZE9wY29kZVJlZ2lzdGVyKGluc24sIDQpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVOQ09ESU5HX1JPOgorICAgICAgaWYgKHJlYWRPcGNvZGVSZWdpc3RlcihpbnNuLCA4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkNPRElOR19SdjoKKyAgICAgIGlmIChyZWFkT3Bjb2RlUmVnaXN0ZXIoaW5zbiwgMCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRU5DT0RJTkdfSToKKyAgICAgIGlmIChyZWFkT3Bjb2RlTW9kaWZpZXIoaW5zbikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEVOQ09ESU5HX0RVUDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBkYmdwcmludGYoaW5zbiwgIkVuY291bnRlcmVkIGFuIG9wZXJhbmQgd2l0aCBhbiB1bmtub3duIGVuY29kaW5nLiIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZWNvZGVJbnN0cnVjdGlvbiAtIFJlYWRzIGFuZCBpbnRlcnByZXRzIGEgZnVsbCBpbnN0cnVjdGlvbiBwcm92aWRlZCBieSB0aGUKKyAqICAgdXNlci4KKyAqCisgKiBAcGFyYW0gaW5zbiAgICAgIC0gQSBwb2ludGVyIHRvIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBwb3B1bGF0ZWQuICBNdXN0IGJlIAorICogICAgICAgICAgICAgICAgICAgIHByZS1hbGxvY2F0ZWQuCisgKiBAcGFyYW0gcmVhZGVyICAgIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gcmVhZCB0aGUgaW5zdHJ1Y3Rpb24ncyBieXRlcy4KKyAqIEBwYXJhbSByZWFkZXJBcmcgLSBBIGdlbmVyaWMgYXJndW1lbnQgdG8gYmUgcGFzc2VkIHRvIHRoZSByZWFkZXIgdG8gc3RvcmUKKyAqICAgICAgICAgICAgICAgICAgICBhbnkgaW50ZXJuYWwgc3RhdGUuCisgKiBAcGFyYW0gbG9nZ2VyICAgIC0gSWYgbm9uLU5VTEwsIHRoZSBmdW5jdGlvbiB0byBiZSB1c2VkIHRvIHdyaXRlIGxvZyBtZXNzYWdlcworICogICAgICAgICAgICAgICAgICAgIGFuZCB3YXJuaW5ncy4KKyAqIEBwYXJhbSBsb2dnZXJBcmcgLSBBIGdlbmVyaWMgYXJndW1lbnQgdG8gYmUgcGFzc2VkIHRvIHRoZSBsb2dnZXIgdG8gc3RvcmUKKyAqICAgICAgICAgICAgICAgICAgICBhbnkgaW50ZXJuYWwgc3RhdGUuCisgKiBAcGFyYW0gc3RhcnRMb2MgIC0gVGhlIGFkZHJlc3MgKGluIHRoZSByZWFkZXIncyBhZGRyZXNzIHNwYWNlKSBvZiB0aGUgZmlyc3QKKyAqICAgICAgICAgICAgICAgICAgICBieXRlIGluIHRoZSBpbnN0cnVjdGlvbi4KKyAqIEBwYXJhbSBtb2RlICAgICAgLSBUaGUgbW9kZSAocmVhbCBtb2RlLCBJQS0zMmUsIG9yIElBLTMyZSBpbiA2NC1iaXQgbW9kZSkgdG8KKyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGUgdGhlIGluc3RydWN0aW9uIGluLgorICogQHJldHVybiAgICAgICAgICAtIDAgaWYgdGhlIGluc3RydWN0aW9uJ3MgbWVtb3J5IGNvdWxkIGJlIHJlYWQ7IG5vbnplcm8gaWYKKyAqICAgICAgICAgICAgICAgICAgICBub3QuCisgKi8KK2ludCBkZWNvZGVJbnN0cnVjdGlvbihzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICBieXRlUmVhZGVyX3QgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlYWRlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICBkbG9nX3QgbG9nZ2VyLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxvZ2dlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICBEaXNhc3NlbWJsZXJNb2RlIG1vZGUpIHsKKyAgbWVtc2V0KGluc24sIDAsIHNpemVvZihzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbikpOworICAgIAorICBpbnNuLT5yZWFkZXIgPSByZWFkZXI7CisgIGluc24tPnJlYWRlckFyZyA9IHJlYWRlckFyZzsKKyAgaW5zbi0+ZGxvZyA9IGxvZ2dlcjsKKyAgaW5zbi0+ZGxvZ0FyZyA9IGxvZ2dlckFyZzsKKyAgaW5zbi0+c3RhcnRMb2NhdGlvbiA9IHN0YXJ0TG9jOworICBpbnNuLT5yZWFkZXJDdXJzb3IgPSBzdGFydExvYzsKKyAgaW5zbi0+bW9kZSA9IG1vZGU7CisgIGluc24tPm51bUltbWVkaWF0ZXNDb25zdW1lZCA9IDA7CisgIAorICBpZiAocmVhZFByZWZpeGVzKGluc24pICAgICAgIHx8CisgICAgICByZWFkT3Bjb2RlKGluc24pICAgICAgICAgfHwKKyAgICAgIGdldElEKGluc24pICAgICAgICAgICAgICB8fAorICAgICAgaW5zbi0+aW5zdHJ1Y3Rpb25JRCA9PSAwIHx8CisgICAgICByZWFkT3BlcmFuZHMoaW5zbikpCisgICAgcmV0dXJuIC0xOworICAKKyAgaW5zbi0+bGVuZ3RoID0gaW5zbi0+cmVhZGVyQ3Vyc29yIC0gaW5zbi0+c3RhcnRMb2NhdGlvbjsKKyAgCisgIGRiZ3ByaW50ZihpbnNuLCAiUmVhZCBmcm9tIDB4JWxseCB0byAweCVsbHg6IGxlbmd0aCAlenUiLAorICAgICAgICAgICAgc3RhcnRMb2MsIGluc24tPnJlYWRlckN1cnNvciwgaW5zbi0+bGVuZ3RoKTsKKyAgICAKKyAgaWYgKGluc24tPmxlbmd0aCA+IDE1KQorICAgIGRiZ3ByaW50ZihpbnNuLCAiSW5zdHJ1Y3Rpb24gZXhjZWVkcyAxNS1ieXRlIGxpbWl0Iik7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0Rpc2Fzc2VtYmxlci9YODZEaXNhc3NlbWJsZXJEZWNvZGVyLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9EaXNhc3NlbWJsZXIvWDg2RGlzYXNzZW1ibGVyRGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmE4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9EaXNhc3NlbWJsZXIvWDg2RGlzYXNzZW1ibGVyRGVjb2Rlci5oCkBAIC0wLDAgKzEsNTE1IEBACisvKj09PS0gWDg2RGlzYXNzZW1ibGVyRGVjb2RlckludGVybmFsLmggLSBEaXNhc3NlbWJsZXIgZGVjb2RlciAtLS0tLSotIEMgLSotPT0qCisgKgorICogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorICogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgWDg2IERpc2Fzc2VtYmxlci4KKyAqIEl0IGNvbnRhaW5zIHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyLgorICogRG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRpc2Fzc2VtYmxlciBjYW4gYmUgZm91bmQgaW4gWDg2RGlzYXNzZW1ibGVyLmguCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBYODZESVNBU1NFTUJMRVJERUNPREVSX0gKKyNkZWZpbmUgWDg2RElTQVNTRU1CTEVSREVDT0RFUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKyAgCisjZGVmaW5lIElOU1RSVUNUSU9OX1NQRUNJRklFUl9GSUVMRFMgIFwKKyAgY29uc3QgY2hhciogICAgICAgICAgICAgbmFtZTsKKworI2RlZmluZSBJTlNUUlVDVElPTl9JRFMgICAgIFwKKyAgSW5zdHJVSUQqICBpbnN0cnVjdGlvbklEczsKKworI2luY2x1ZGUgIlg4NkRpc2Fzc2VtYmxlckRlY29kZXJDb21tb24uaCIKKyAgCisjdW5kZWYgSU5TVFJVQ1RJT05fU1BFQ0lGSUVSX0ZJRUxEUworI3VuZGVmIElOU1RSVUNUSU9OX0lEUworICAKKy8qCisgKiBBY2Nlc3NvciBmdW5jdGlvbnMgZm9yIHZhcmlvdXMgZmllbGRzIG9mIGFuIEludGVsIGluc3RydWN0aW9uCisgKi8KKyNkZWZpbmUgbW9kRnJvbU1vZFJNKG1vZFJNKSAgKChtb2RSTSAmIDB4YzApID4+IDYpCisjZGVmaW5lIHJlZ0Zyb21Nb2RSTShtb2RSTSkgICgobW9kUk0gJiAweDM4KSA+PiAzKQorI2RlZmluZSBybUZyb21Nb2RSTShtb2RSTSkgICAobW9kUk0gJiAweDcpCisjZGVmaW5lIHNjYWxlRnJvbVNJQihzaWIpICAgICgoc2liICYgMHhjMCkgPj4gNikKKyNkZWZpbmUgaW5kZXhGcm9tU0lCKHNpYikgICAgKChzaWIgJiAweDM4KSA+PiAzKQorI2RlZmluZSBiYXNlRnJvbVNJQihzaWIpICAgICAoc2liICYgMHg3KQorI2RlZmluZSB3RnJvbVJFWChyZXgpICAgICAgICAoKHJleCAmIDB4OCkgPj4gMykKKyNkZWZpbmUgckZyb21SRVgocmV4KSAgICAgICAgKChyZXggJiAweDQpID4+IDIpCisjZGVmaW5lIHhGcm9tUkVYKHJleCkgICAgICAgICgocmV4ICYgMHgyKSA+PiAxKQorI2RlZmluZSBiRnJvbVJFWChyZXgpICAgICAgICAocmV4ICYgMHgxKQorCisvKgorICogVGhlc2UgZW51bXMgcmVwcmVzZW50IEludGVsIHJlZ2lzdGVycyBmb3IgdXNlIGJ5IHRoZSBkZWNvZGVyLgorICovCisKKyNkZWZpbmUgUkVHU184QklUICAgICBcCisgIEVOVFJZKEFMKSAgICAgICAgICAgXAorICBFTlRSWShDTCkgICAgICAgICAgIFwKKyAgRU5UUlkoREwpICAgICAgICAgICBcCisgIEVOVFJZKEJMKSAgICAgICAgICAgXAorICBFTlRSWShBSCkgICAgICAgICAgIFwKKyAgRU5UUlkoQ0gpICAgICAgICAgICBcCisgIEVOVFJZKERIKSAgICAgICAgICAgXAorICBFTlRSWShCSCkgICAgICAgICAgIFwKKyAgRU5UUlkoUjhCKSAgICAgICAgICBcCisgIEVOVFJZKFI5QikgICAgICAgICAgXAorICBFTlRSWShSMTBCKSAgICAgICAgIFwKKyAgRU5UUlkoUjExQikgICAgICAgICBcCisgIEVOVFJZKFIxMkIpICAgICAgICAgXAorICBFTlRSWShSMTNCKSAgICAgICAgIFwKKyAgRU5UUlkoUjE0QikgICAgICAgICBcCisgIEVOVFJZKFIxNUIpICAgICAgICAgXAorICBFTlRSWShTUEwpICAgICAgICAgIFwKKyAgRU5UUlkoQlBMKSAgICAgICAgICBcCisgIEVOVFJZKFNJTCkgICAgICAgICAgXAorICBFTlRSWShESUwpCisKKyNkZWZpbmUgRUFfQkFTRVNfMTZCSVQgIFwKKyAgRU5UUlkoQlhfU0kpICAgICAgICAgIFwKKyAgRU5UUlkoQlhfREkpICAgICAgICAgIFwKKyAgRU5UUlkoQlBfU0kpICAgICAgICAgIFwKKyAgRU5UUlkoQlBfREkpICAgICAgICAgIFwKKyAgRU5UUlkoU0kpICAgICAgICAgICAgIFwKKyAgRU5UUlkoREkpICAgICAgICAgICAgIFwKKyAgRU5UUlkoQlApICAgICAgICAgICAgIFwKKyAgRU5UUlkoQlgpICAgICAgICAgICAgIFwKKyAgRU5UUlkoUjhXKSAgICAgICAgICAgIFwKKyAgRU5UUlkoUjlXKSAgICAgICAgICAgIFwKKyAgRU5UUlkoUjEwVykgICAgICAgICAgIFwKKyAgRU5UUlkoUjExVykgICAgICAgICAgIFwKKyAgRU5UUlkoUjEyVykgICAgICAgICAgIFwKKyAgRU5UUlkoUjEzVykgICAgICAgICAgIFwKKyAgRU5UUlkoUjE0VykgICAgICAgICAgIFwKKyAgRU5UUlkoUjE1VykKKworI2RlZmluZSBSRUdTXzE2QklUICAgIFwKKyAgRU5UUlkoQVgpICAgICAgICAgICBcCisgIEVOVFJZKENYKSAgICAgICAgICAgXAorICBFTlRSWShEWCkgICAgICAgICAgIFwKKyAgRU5UUlkoQlgpICAgICAgICAgICBcCisgIEVOVFJZKFNQKSAgICAgICAgICAgXAorICBFTlRSWShCUCkgICAgICAgICAgIFwKKyAgRU5UUlkoU0kpICAgICAgICAgICBcCisgIEVOVFJZKERJKSAgICAgICAgICAgXAorICBFTlRSWShSOFcpICAgICAgICAgIFwKKyAgRU5UUlkoUjlXKSAgICAgICAgICBcCisgIEVOVFJZKFIxMFcpICAgICAgICAgXAorICBFTlRSWShSMTFXKSAgICAgICAgIFwKKyAgRU5UUlkoUjEyVykgICAgICAgICBcCisgIEVOVFJZKFIxM1cpICAgICAgICAgXAorICBFTlRSWShSMTRXKSAgICAgICAgIFwKKyAgRU5UUlkoUjE1VykKKworI2RlZmluZSBFQV9CQVNFU18zMkJJVCAgXAorICBFTlRSWShFQVgpICAgICAgICAgICAgXAorICBFTlRSWShFQ1gpICAgICAgICAgICAgXAorICBFTlRSWShFRFgpICAgICAgICAgICAgXAorICBFTlRSWShFQlgpICAgICAgICAgICAgXAorICBFTlRSWShzaWIpICAgICAgICAgICAgXAorICBFTlRSWShFQlApICAgICAgICAgICAgXAorICBFTlRSWShFU0kpICAgICAgICAgICAgXAorICBFTlRSWShFREkpICAgICAgICAgICAgXAorICBFTlRSWShSOEQpICAgICAgICAgICAgXAorICBFTlRSWShSOUQpICAgICAgICAgICAgXAorICBFTlRSWShSMTBEKSAgICAgICAgICAgXAorICBFTlRSWShSMTFEKSAgICAgICAgICAgXAorICBFTlRSWShSMTJEKSAgICAgICAgICAgXAorICBFTlRSWShSMTNEKSAgICAgICAgICAgXAorICBFTlRSWShSMTREKSAgICAgICAgICAgXAorICBFTlRSWShSMTVEKQorCisjZGVmaW5lIFJFR1NfMzJCSVQgIFwKKyAgRU5UUlkoRUFYKSAgICAgICAgXAorICBFTlRSWShFQ1gpICAgICAgICBcCisgIEVOVFJZKEVEWCkgICAgICAgIFwKKyAgRU5UUlkoRUJYKSAgICAgICAgXAorICBFTlRSWShFU1ApICAgICAgICBcCisgIEVOVFJZKEVCUCkgICAgICAgIFwKKyAgRU5UUlkoRVNJKSAgICAgICAgXAorICBFTlRSWShFREkpICAgICAgICBcCisgIEVOVFJZKFI4RCkgICAgICAgIFwKKyAgRU5UUlkoUjlEKSAgICAgICAgXAorICBFTlRSWShSMTBEKSAgICAgICBcCisgIEVOVFJZKFIxMUQpICAgICAgIFwKKyAgRU5UUlkoUjEyRCkgICAgICAgXAorICBFTlRSWShSMTNEKSAgICAgICBcCisgIEVOVFJZKFIxNEQpICAgICAgIFwKKyAgRU5UUlkoUjE1RCkKKworI2RlZmluZSBFQV9CQVNFU182NEJJVCAgXAorICBFTlRSWShSQVgpICAgICAgICAgICAgXAorICBFTlRSWShSQ1gpICAgICAgICAgICAgXAorICBFTlRSWShSRFgpICAgICAgICAgICAgXAorICBFTlRSWShSQlgpICAgICAgICAgICAgXAorICBFTlRSWShzaWI2NCkgICAgICAgICAgXAorICBFTlRSWShSQlApICAgICAgICAgICAgXAorICBFTlRSWShSU0kpICAgICAgICAgICAgXAorICBFTlRSWShSREkpICAgICAgICAgICAgXAorICBFTlRSWShSOCkgICAgICAgICAgICAgXAorICBFTlRSWShSOSkgICAgICAgICAgICAgXAorICBFTlRSWShSMTApICAgICAgICAgICAgXAorICBFTlRSWShSMTEpICAgICAgICAgICAgXAorICBFTlRSWShSMTIpICAgICAgICAgICAgXAorICBFTlRSWShSMTMpICAgICAgICAgICAgXAorICBFTlRSWShSMTQpICAgICAgICAgICAgXAorICBFTlRSWShSMTUpCisKKyNkZWZpbmUgUkVHU182NEJJVCAgXAorICBFTlRSWShSQVgpICAgICAgICBcCisgIEVOVFJZKFJDWCkgICAgICAgIFwKKyAgRU5UUlkoUkRYKSAgICAgICAgXAorICBFTlRSWShSQlgpICAgICAgICBcCisgIEVOVFJZKFJTUCkgICAgICAgIFwKKyAgRU5UUlkoUkJQKSAgICAgICAgXAorICBFTlRSWShSU0kpICAgICAgICBcCisgIEVOVFJZKFJESSkgICAgICAgIFwKKyAgRU5UUlkoUjgpICAgICAgICAgXAorICBFTlRSWShSOSkgICAgICAgICBcCisgIEVOVFJZKFIxMCkgICAgICAgIFwKKyAgRU5UUlkoUjExKSAgICAgICAgXAorICBFTlRSWShSMTIpICAgICAgICBcCisgIEVOVFJZKFIxMykgICAgICAgIFwKKyAgRU5UUlkoUjE0KSAgICAgICAgXAorICBFTlRSWShSMTUpCisKKyNkZWZpbmUgUkVHU19NTVggIFwKKyAgRU5UUlkoTU0wKSAgICAgIFwKKyAgRU5UUlkoTU0xKSAgICAgIFwKKyAgRU5UUlkoTU0yKSAgICAgIFwKKyAgRU5UUlkoTU0zKSAgICAgIFwKKyAgRU5UUlkoTU00KSAgICAgIFwKKyAgRU5UUlkoTU01KSAgICAgIFwKKyAgRU5UUlkoTU02KSAgICAgIFwKKyAgRU5UUlkoTU03KQorCisjZGVmaW5lIFJFR1NfWE1NICBcCisgIEVOVFJZKFhNTTApICAgICBcCisgIEVOVFJZKFhNTTEpICAgICBcCisgIEVOVFJZKFhNTTIpICAgICBcCisgIEVOVFJZKFhNTTMpICAgICBcCisgIEVOVFJZKFhNTTQpICAgICBcCisgIEVOVFJZKFhNTTUpICAgICBcCisgIEVOVFJZKFhNTTYpICAgICBcCisgIEVOVFJZKFhNTTcpICAgICBcCisgIEVOVFJZKFhNTTgpICAgICBcCisgIEVOVFJZKFhNTTkpICAgICBcCisgIEVOVFJZKFhNTTEwKSAgICBcCisgIEVOVFJZKFhNTTExKSAgICBcCisgIEVOVFJZKFhNTTEyKSAgICBcCisgIEVOVFJZKFhNTTEzKSAgICBcCisgIEVOVFJZKFhNTTE0KSAgICBcCisgIEVOVFJZKFhNTTE1KQorICAKKyNkZWZpbmUgUkVHU19TRUdNRU5UIFwKKyAgRU5UUlkoRVMpICAgICAgICAgIFwKKyAgRU5UUlkoQ1MpICAgICAgICAgIFwKKyAgRU5UUlkoU1MpICAgICAgICAgIFwKKyAgRU5UUlkoRFMpICAgICAgICAgIFwKKyAgRU5UUlkoRlMpICAgICAgICAgIFwKKyAgRU5UUlkoR1MpCisgIAorI2RlZmluZSBSRUdTX0RFQlVHICBcCisgIEVOVFJZKERSMCkgICAgICAgIFwKKyAgRU5UUlkoRFIxKSAgICAgICAgXAorICBFTlRSWShEUjIpICAgICAgICBcCisgIEVOVFJZKERSMykgICAgICAgIFwKKyAgRU5UUlkoRFI0KSAgICAgICAgXAorICBFTlRSWShEUjUpICAgICAgICBcCisgIEVOVFJZKERSNikgICAgICAgIFwKKyAgRU5UUlkoRFI3KQorCisjZGVmaW5lIFJFR1NfQ09OVFJPTCAgXAorICBFTlRSWShDUjApICAgICAgICAgIFwKKyAgRU5UUlkoQ1IxKSAgICAgICAgICBcCisgIEVOVFJZKENSMikgICAgICAgICAgXAorICBFTlRSWShDUjMpICAgICAgICAgIFwKKyAgRU5UUlkoQ1I0KSAgICAgICAgICBcCisgIEVOVFJZKENSNSkgICAgICAgICAgXAorICBFTlRSWShDUjYpICAgICAgICAgIFwKKyAgRU5UUlkoQ1I3KSAgICAgICAgICBcCisgIEVOVFJZKENSOCkKKyAgCisjZGVmaW5lIEFMTF9FQV9CQVNFUyAgXAorICBFQV9CQVNFU18xNkJJVCAgICAgIFwKKyAgRUFfQkFTRVNfMzJCSVQgICAgICBcCisgIEVBX0JBU0VTXzY0QklUCisgIAorI2RlZmluZSBBTExfU0lCX0JBU0VTIFwKKyAgUkVHU18zMkJJVCAgICAgICAgICBcCisgIFJFR1NfNjRCSVQKKworI2RlZmluZSBBTExfUkVHUyAgICAgIFwKKyAgUkVHU184QklUICAgICAgICAgICBcCisgIFJFR1NfMTZCSVQgICAgICAgICAgXAorICBSRUdTXzMyQklUICAgICAgICAgIFwKKyAgUkVHU182NEJJVCAgICAgICAgICBcCisgIFJFR1NfTU1YICAgICAgICAgICAgXAorICBSRUdTX1hNTSAgICAgICAgICAgIFwKKyAgUkVHU19TRUdNRU5UICAgICAgICBcCisgIFJFR1NfREVCVUcgICAgICAgICAgXAorICBSRUdTX0NPTlRST0wgICAgICAgIFwKKyAgRU5UUlkoUklQKQorCisvKgorICogRUFCYXNlIC0gQWxsIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgYmFzZSBmaWVsZCBmb3IgZWZmZWN0aXZlLWFkZHJlc3MgCisgKiAgIGNvbXB1dGF0aW9ucywgYS5rLmEuIHRoZSBNb2QgYW5kIFIvTSBmaWVsZHMgb2YgdGhlIE1vZFIvTSBieXRlLiAgV2UKKyAqICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBiYXNlcyAoRUFfQkFTRV8qKSBhbmQgcmVnaXN0ZXJzIHRoYXQganVzdCBoYXBwZW4gdG8gYmUKKyAqICAgcmVmZXJyZWQgdG8gd2hlbiBNb2QgPT0gMGIxMSAoRUFfUkVHXyopLgorICovCit0eXBlZGVmIGVudW0geworICBFQV9CQVNFX05PTkUsCisjZGVmaW5lIEVOVFJZKHgpIEVBX0JBU0VfIyN4LAorICBBTExfRUFfQkFTRVMKKyN1bmRlZiBFTlRSWQorI2RlZmluZSBFTlRSWSh4KSBFQV9SRUdfIyN4LAorICBBTExfUkVHUworI3VuZGVmIEVOVFJZCisgIEVBX21heAorfSBFQUJhc2U7CisgIAorLyogCisgKiBTSUJJbmRleCAtIEFsbCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIFNJQiBpbmRleCBmaWVsZC4KKyAqICAgQm9ycm93cyBlbnRyaWVzIGZyb20gQUxMX0VBX0JBU0VTIHdpdGggdGhlIHNwZWNpYWwgY2FzZSB0aGF0CisgKiAgIHNpYiBpcyBzeW5vbnltb3VzIHdpdGggTk9ORS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0lCX0lOREVYX05PTkUsCisjZGVmaW5lIEVOVFJZKHgpIFNJQl9JTkRFWF8jI3gsCisgIEFMTF9FQV9CQVNFUworI3VuZGVmIEVOVFJZCisgIFNJQl9JTkRFWF9tYXgKK30gU0lCSW5kZXg7CisgIAorLyoKKyAqIFNJQkJhc2UgLSBBbGwgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBTSUIgYmFzZSBmaWVsZC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0lCX0JBU0VfTk9ORSwKKyNkZWZpbmUgRU5UUlkoeCkgU0lCX0JBU0VfIyN4LAorICBBTExfU0lCX0JBU0VTCisjdW5kZWYgRU5UUlkKKyAgU0lCX0JBU0VfbWF4Cit9IFNJQkJhc2U7CisKKy8qCisgKiBFQURpc3BsYWNlbWVudCAtIFBvc3NpYmxlIGRpc3BsYWNlbWVudCB0eXBlcyBmb3IgZWZmZWN0aXZlLWFkZHJlc3MKKyAqICAgY29tcHV0YXRpb25zLgorICovCit0eXBlZGVmIGVudW0geworICBFQV9ESVNQX05PTkUsCisgIEVBX0RJU1BfOCwKKyAgRUFfRElTUF8xNiwKKyAgRUFfRElTUF8zMgorfSBFQURpc3BsYWNlbWVudDsKKworLyoKKyAqIFJlZyAtIEFsbCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHJlZyBmaWVsZCBpbiB0aGUgTW9kUi9NIGJ5dGUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIEVOVFJZKHgpIE1PRFJNX1JFR18jI3gsCisgIEFMTF9SRUdTCisjdW5kZWYgRU5UUlkKKyAgTU9EUk1fUkVHX21heAorfSBSZWc7CisgIAorLyoKKyAqIFNlZ21lbnRPdmVycmlkZSAtIEFsbCBwb3NzaWJsZSBzZWdtZW50IG92ZXJyaWRlcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0VHX09WRVJSSURFX05PTkUsCisgIFNFR19PVkVSUklERV9DUywKKyAgU0VHX09WRVJSSURFX1NTLAorICBTRUdfT1ZFUlJJREVfRFMsCisgIFNFR19PVkVSUklERV9FUywKKyAgU0VHX09WRVJSSURFX0ZTLAorICBTRUdfT1ZFUlJJREVfR1MsCisgIFNFR19PVkVSUklERV9tYXgKK30gU2VnbWVudE92ZXJyaWRlOworCit0eXBlZGVmIHVpbnQ4X3QgQk9PTDsKKworLyoKKyAqIGJ5dGVSZWFkZXJfdCAtIFR5cGUgZm9yIHRoZSBieXRlIHJlYWRlciB0aGF0IHRoZSBjb25zdW1lciBtdXN0IHByb3ZpZGUgdG8KKyAqICAgdGhlIGRlY29kZXIuICBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhlIGluc3RydWN0aW9uJ3MgYWRkcmVzcyBzcGFjZS4KKyAqIEBwYXJhbSBhcmcgICAgIC0gQSBiYXRvbiB0aGF0IHRoZSBjb25zdW1lciBjYW4gYXNzb2NpYXRlIHdpdGggYW55IGludGVybmFsCisgKiAgICAgICAgICAgICAgICAgIHN0YXRlIHRoYXQgaXQgbmVlZHMuCisgKiBAcGFyYW0gYnl0ZSAgICAtIEEgcG9pbnRlciB0byBhIHNpbmdsZSBieXRlIGluIG1lbW9yeSB0aGF0IHNob3VsZCBiZSBzZXQgdG8KKyAqICAgICAgICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWUgYXQgYWRkcmVzcy4KKyAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgaW4gdGhlIGluc3RydWN0aW9uJ3MgYWRkcmVzcyBzcGFjZSB0aGF0IHNob3VsZAorICogICAgICAgICAgICAgICAgICBiZSByZWFkIGZyb20uCisgKiBAcmV0dXJuICAgICAgICAtIC0xIGlmIHRoZSBieXRlIGNhbm5vdCBiZSByZWFkIGZvciBhbnkgcmVhc29uOyAwIG90aGVyd2lzZS4KKyAqLwordHlwZWRlZiBpbnQgKCpieXRlUmVhZGVyX3QpKHZvaWQqIGFyZywgdWludDhfdCogYnl0ZSwgdWludDY0X3QgYWRkcmVzcyk7CisKKy8qCisgKiBkbG9nX3QgLSBUeXBlIGZvciB0aGUgbG9nZ2luZyBmdW5jdGlvbiB0aGF0IHRoZSBjb25zdW1lciBjYW4gcHJvdmlkZSB0bworICogICBnZXQgZGVidWdnaW5nIG91dHB1dCBmcm9tIHRoZSBkZWNvZGVyLgorICogQHBhcmFtIGFyZyAgICAgLSBBIGJhdG9uIHRoYXQgdGhlIGNvbnN1bWVyIGNhbiBhc3NvY2lhdGUgd2l0aCBhbnkgaW50ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgc3RhdGUgdGhhdCBpdCBuZWVkcy4KKyAqIEBwYXJhbSBsb2cgICAgIC0gQSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4gIFdpbGwgYmUgcmV1c2VkIGFmdGVyCisgKiAgICAgICAgICAgICAgICAgIHRoZSBsb2dnZXIgcmV0dXJucy4KKyAqLwordHlwZWRlZiB2b2lkICgqZGxvZ190KSh2b2lkKiBhcmcsIGNvbnN0IGNoYXIgKmxvZyk7CisKKy8qCisgKiBUaGUgeDg2IGludGVybmFsIGluc3RydWN0aW9uLCB3aGljaCBpcyBwcm9kdWNlZCBieSB0aGUgZGVjb2Rlci4KKyAqLworc3RydWN0IEludGVybmFsSW5zdHJ1Y3Rpb24geworICAvKiBSZWFkZXIgaW50ZXJmYWNlIChDKSAqLworICBieXRlUmVhZGVyX3QgcmVhZGVyOworICAvKiBPcGFxdWUgdmFsdWUgcGFzc2VkIHRvIHRoZSByZWFkZXIgKi8KKyAgdm9pZCogcmVhZGVyQXJnOworICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBieXRlIHRvIHJlYWQgdmlhIHRoZSByZWFkZXIgKi8KKyAgdWludDY0X3QgcmVhZGVyQ3Vyc29yOworCisgIC8qIExvZ2dlciBpbnRlcmZhY2UgKEMpICovCisgIGRsb2dfdCBkbG9nOworICAvKiBPcGFxdWUgdmFsdWUgcGFzc2VkIHRvIHRoZSBsb2dnZXIgKi8KKyAgdm9pZCogZGxvZ0FyZzsKKworICAvKiBHZW5lcmFsIGluc3RydWN0aW9uIGluZm9ybWF0aW9uICovCisgIAorICAvKiBUaGUgbW9kZSB0byBkaXNhc3NlbWJsZSBmb3IgKDY0LWJpdCwgcHJvdGVjdGVkLCByZWFsKSAqLworICBEaXNhc3NlbWJsZXJNb2RlIG1vZGU7CisgIC8qIFRoZSBzdGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHVzYWJsZSB3aXRoIHRoZSByZWFkZXIgKi8KKyAgdWludDY0X3Qgc3RhcnRMb2NhdGlvbjsKKyAgLyogVGhlIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzICovCisgIHNpemVfdCBsZW5ndGg7CisgIAorICAvKiBQcmVmaXggc3RhdGUgKi8KKyAgCisgIC8qIDEgaWYgdGhlIHByZWZpeCBieXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVudHJ5IGlzIHByZXNlbnQ7IDAgaWYgbm90ICovCisgIHVpbnQ4X3QgcHJlZml4UHJlc2VudFsweDEwMF07CisgIC8qIGNvbnRhaW5zIHRoZSBsb2NhdGlvbiAoZm9yIHVzZSB3aXRoIHRoZSByZWFkZXIpIG9mIHRoZSBwcmVmaXggYnl0ZSAqLworICB1aW50NjRfdCBwcmVmaXhMb2NhdGlvbnNbMHgxMDBdOworICAvKiBUaGUgdmFsdWUgb2YgdGhlIFJFWCBwcmVmaXgsIGlmIHByZXNlbnQgKi8KKyAgdWludDhfdCByZXhQcmVmaXg7CisgIC8qIFRoZSBsb2NhdGlvbiBvZiB0aGUgUkVYIHByZWZpeCAqLworICB1aW50NjRfdCByZXhMb2NhdGlvbjsKKyAgLyogVGhlIGxvY2F0aW9uIHdoZXJlIGEgbWFuZGF0b3J5IHByZWZpeCB3b3VsZCBoYXZlIHRvIGJlIChpLmUuLCByaWdodCBiZWZvcmUKKyAgICAgdGhlIG9wY29kZSwgb3IgcmlnaHQgYmVmb3JlIHRoZSBSRVggcHJlZml4IGlmIG9uZSBpcyBwcmVzZW50KSAqLworICB1aW50NjRfdCBuZWNlc3NhcnlQcmVmaXhMb2NhdGlvbjsKKyAgLyogVGhlIHNlZ21lbnQgb3ZlcnJpZGUgdHlwZSAqLworICBTZWdtZW50T3ZlcnJpZGUgc2VnbWVudE92ZXJyaWRlOworICAKKyAgLyogU2l6ZXMgb2YgdmFyaW91cyBjcml0aWNhbCBwaWVjZXMgb2YgZGF0YSAqLworICB1aW50OF90IHJlZ2lzdGVyU2l6ZTsKKyAgdWludDhfdCBhZGRyZXNzU2l6ZTsKKyAgdWludDhfdCBkaXNwbGFjZW1lbnRTaXplOworICB1aW50OF90IGltbWVkaWF0ZVNpemU7CisgIAorICAvKiBvcGNvZGUgc3RhdGUgKi8KKyAgCisgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgdHdvLWJ5dGUgZXNjYXBlIHByZWZpeCAodXN1YWxseSAweDBmKSAqLworICB1aW50OF90IHR3b0J5dGVFc2NhcGU7CisgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgdGhyZWUtYnl0ZSBlc2NhcGUgcHJlZml4ICh1c3VhbGx5IDB4Mzggb3IgMHgzYSkgKi8KKyAgdWludDhfdCB0aHJlZUJ5dGVFc2NhcGU7CisgIC8qIFRoZSBsYXN0IGJ5dGUgb2YgdGhlIG9wY29kZSwgbm90IGNvdW50aW5nIGFueSBNb2RSL00gZXh0ZW5zaW9uICovCisgIHVpbnQ4X3Qgb3Bjb2RlOworICAvKiBUaGUgTW9kUi9NIGJ5dGUgb2YgdGhlIGluc3RydWN0aW9uLCBpZiBpdCBpcyBhbiBvcGNvZGUgZXh0ZW5zaW9uICovCisgIHVpbnQ4X3QgbW9kUk1FeHRlbnNpb247CisgIAorICAvKiBkZWNvZGUgc3RhdGUgKi8KKyAgCisgIC8qIFRoZSB0eXBlIG9mIG9wY29kZSwgdXNlZCBmb3IgaW5kZXhpbmcgaW50byB0aGUgYXJyYXkgb2YgZGVjb2RlIHRhYmxlcyAqLworICBPcGNvZGVUeXBlIG9wY29kZVR5cGU7CisgIC8qIFRoZSBpbnN0cnVjdGlvbiBJRCwgZXh0cmFjdGVkIGZyb20gdGhlIGRlY29kZSB0YWJsZSAqLworICB1aW50MTZfdCBpbnN0cnVjdGlvbklEOworICAvKiBUaGUgc3BlY2lmaWVyIGZvciB0aGUgaW5zdHJ1Y3Rpb24sIGZyb20gdGhlIGluc3RydWN0aW9uIGluZm8gdGFibGUgKi8KKyAgc3RydWN0IEluc3RydWN0aW9uU3BlY2lmaWVyKiBzcGVjOworICAKKyAgLyogc3RhdGUgZm9yIGFkZGl0aW9uYWwgYnl0ZXMsIGNvbnN1bWVkIGR1cmluZyBvcGVyYW5kIGRlY29kZS4gIFBhdHRlcm46CisgICAgIGNvbnN1bWVkX19fIGluZGljYXRlcyB0aGF0IHRoZSBieXRlIHdhcyBhbHJlYWR5IGNvbnN1bWVkIGFuZCBkb2VzIG5vdAorICAgICBuZWVkIHRvIGJlIGNvbnN1bWVkIGFnYWluICovCisgIAorICAvKiBUaGUgTW9kUi9NIGJ5dGUsIHdoaWNoIGNvbnRhaW5zIG1vc3QgcmVnaXN0ZXIgb3BlcmFuZHMgYW5kIHNvbWUgcG9ydGlvbiBvZgorICAgICBhbGwgbWVtb3J5IG9wZXJhbmRzICovCisgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkTW9kUk07CisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgIG1vZFJNOworICAKKyAgLyogVGhlIFNJQiBieXRlLCB1c2VkIGZvciBtb3JlIGNvbXBsZXggMzItIG9yIDY0LWJpdCBtZW1vcnkgb3BlcmFuZHMgKi8KKyAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWRTSUI7CisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgIHNpYjsKKworICAvKiBUaGUgZGlzcGxhY2VtZW50LCB1c2VkIGZvciBtZW1vcnkgb3BlcmFuZHMgKi8KKyAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWREaXNwbGFjZW1lbnQ7CisgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudDsKKyAgCisgIC8qIEltbWVkaWF0ZXMuICBUaGVyZSBjYW4gYmUgdHdvIGluIHNvbWUgY2FzZXMgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgbnVtSW1tZWRpYXRlc0NvbnN1bWVkOworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICBudW1JbW1lZGlhdGVzVHJhbnNsYXRlZDsKKyAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlc1syXTsKKyAgCisgIC8qIEEgcmVnaXN0ZXIgb3IgaW1tZWRpYXRlIG9wZXJhbmQgZW5jb2RlZCBpbnRvIHRoZSBvcGNvZGUgKi8KKyAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWRPcGNvZGVNb2RpZmllcjsKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlTW9kaWZpZXI7CisgIFJlZyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZVJlZ2lzdGVyOworICAKKyAgLyogUG9ydGlvbnMgb2YgdGhlIE1vZFIvTSBieXRlICovCisgIAorICAvKiBUaGVzZSBmaWVsZHMgZGV0ZXJtaW5lIHRoZSBhbGxvd2FibGUgdmFsdWVzIGZvciB0aGUgTW9kUi9NIGZpZWxkcywgd2hpY2gKKyAgICAgZGVwZW5kIG9uIG9wZXJhbmQgYW5kIGFkZHJlc3Mgd2lkdGhzICovCisgIEVBQmFzZSAgICAgICAgICAgICAgICAgICAgICAgIGVhQmFzZUJhc2U7CisgIEVBQmFzZSAgICAgICAgICAgICAgICAgICAgICAgIGVhUmVnQmFzZTsKKyAgUmVnICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnQmFzZTsKKworICAvKiBUaGUgTW9kIGFuZCBSL00gZmllbGRzIGNhbiBlbmNvZGUgYSBiYXNlIGZvciBhbiBlZmZlY3RpdmUgYWRkcmVzcywgb3IgYQorICAgICByZWdpc3Rlci4gIFRoZXNlIGFyZSBzZXBhcmF0ZWQgaW50byB0d28gZmllbGRzIGhlcmUgKi8KKyAgRUFCYXNlICAgICAgICAgICAgICAgICAgICAgICAgZWFCYXNlOworICBFQURpc3BsYWNlbWVudCAgICAgICAgICAgICAgICBlYURpc3BsYWNlbWVudDsKKyAgLyogVGhlIHJlZyBmaWVsZCBhbHdheXMgZW5jb2RlcyBhIHJlZ2lzdGVyICovCisgIFJlZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZzsKKyAgCisgIC8qIFNJQiBzdGF0ZSAqLworICBTSUJJbmRleCAgICAgICAgICAgICAgICAgICAgICBzaWJJbmRleDsKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgc2liU2NhbGU7CisgIFNJQkJhc2UgICAgICAgICAgICAgICAgICAgICAgIHNpYkJhc2U7Cit9OworCisvKiBkZWNvZGVJbnN0cnVjdGlvbiAtIERlY29kZSBvbmUgaW5zdHJ1Y3Rpb24gYW5kIHN0b3JlIHRoZSBkZWNvZGluZyByZXN1bHRzIGluCisgKiAgIGEgYnVmZmVyIHByb3ZpZGVkIGJ5IHRoZSBjb25zdW1lci4KKyAqIEBwYXJhbSBpbnNuICAgICAgLSBUaGUgYnVmZmVyIHRvIHN0b3JlIHRoZSBpbnN0cnVjdGlvbiBpbi4gIEFsbG9jYXRlZCBieSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBjb25zdW1lci4KKyAqIEBwYXJhbSByZWFkZXIgICAgLSBUaGUgYnl0ZVJlYWRlcl90IGZvciB0aGUgYnl0ZXMgdG8gYmUgcmVhZC4KKyAqIEBwYXJhbSByZWFkZXJBcmcgLSBBbiBhcmd1bWVudCB0byBwYXNzIHRvIHRoZSByZWFkZXIgZm9yIHN0b3JpbmcgY29udGV4dAorICogICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIHRvIHRoZSBjb25zdW1lci4gIE1heSBiZSBOVUxMLgorICogQHBhcmFtIGxvZ2dlciAgICAtIFRoZSBkbG9nX3QgdG8gYmUgdXNlZCBpbiBwcmludGluZyBzdGF0dXMgbWVzc2FnZXMgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBkaXNhc3NlbWJsZXIuICBNYXkgYmUgTlVMTC4KKyAqIEBwYXJhbSBsb2dnZXJBcmcgLSBBbiBhcmd1bWVudCB0byBwYXNzIHRvIHRoZSBsb2dnZXIgZm9yIHN0b3JpbmcgY29udGV4dAorICogICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIHRvIHRoZSBsb2dnZXIuICBNYXkgYmUgTlVMTC4KKyAqIEBwYXJhbSBzdGFydExvYyAgLSBUaGUgYWRkcmVzcyAoaW4gdGhlIHJlYWRlcidzIGFkZHJlc3Mgc3BhY2UpIG9mIHRoZSBmaXJzdAorICogICAgICAgICAgICAgICAgICAgIGJ5dGUgaW4gdGhlIGluc3RydWN0aW9uLgorICogQHBhcmFtIG1vZGUgICAgICAtIFRoZSBtb2RlICgxNi1iaXQsIDMyLWJpdCwgNjQtYml0KSB0byBkZWNvZGUgaW4uCisgKiBAcmV0dXJuICAgICAgICAgIC0gTm9uemVybyBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIGRlY29kZSwgMCBvdGhlcndpc2UuCisgKi8KK2ludCBkZWNvZGVJbnN0cnVjdGlvbihzdHJ1Y3QgSW50ZXJuYWxJbnN0cnVjdGlvbiogaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICBieXRlUmVhZGVyX3QgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlYWRlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICBkbG9nX3QgbG9nZ2VyLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxvZ2dlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICBEaXNhc3NlbWJsZXJNb2RlIG1vZGUpOworCisvKiB4ODZEaXNhc3NlbWJsZXJEZWJ1ZyAtIEMtYWNjZXNzaWJsZSBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgYSBtZXNzYWdlIHRvCisgKiAgIGRlYnVncygpCisgKiBAcGFyYW0gZmlsZSAgLSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBwcmludGluZyB0aGUgZGVidWcgbWVzc2FnZS4KKyAqIEBwYXJhbSBsaW5lICAtIFRoZSBsaW5lIG51bWJlciB0aGF0IHByaW50ZWQgdGhlIGRlYnVnIG1lc3NhZ2UuCisgKiBAcGFyYW0gcyAgICAgLSBUaGUgbWVzc2FnZSB0byBwcmludC4KKyAqLworICAKK3ZvaWQgeDg2RGlzYXNzZW1ibGVyRGVidWcoY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK30KKyNlbmRpZgorICAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvRGlzYXNzZW1ibGVyL1g4NkRpc2Fzc2VtYmxlckRlY29kZXJDb21tb24uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0Rpc2Fzc2VtYmxlci9YODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzM2Y1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L0Rpc2Fzc2VtYmxlci9YODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmgKQEAgLTAsMCArMSwzNTUgQEAKKy8qPT09LSBYODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmggLSBEaXNhc3NlbWJsZXIgZGVjb2RlciAtLS0tLS0tKi0gQyAtKi09PSoKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisgKiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBYODYgRGlzYXNzZW1ibGVyLgorICogSXQgY29udGFpbnMgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgYnkgYm90aCB0aGUgZGlzYXNzZW1ibGVyIGFuZCB0aGUgdGFibGUKKyAqICBnZW5lcmF0b3IuCisgKiBEb2N1bWVudGF0aW9uIGZvciB0aGUgZGlzYXNzZW1ibGVyIGNhbiBiZSBmb3VuZCBpbiBYODZEaXNhc3NlbWJsZXIuaC4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKgorICogVGhpcyBoZWFkZXIgZmlsZSBwcm92aWRlcyB0aG9zZSBkZWZpbml0aW9ucyB0aGF0IG5lZWQgdG8gYmUgc2hhcmVkIGJldHdlZW4KKyAqIHRoZSBkZWNvZGVyIGFuZCB0aGUgdGFibGUgZ2VuZXJhdG9yIGluIGEgQy1mcmllbmRseSBtYW5uZXIuCisgKi8KKworI2lmbmRlZiBYODZESVNBU1NFTUJMRVJERUNPREVSQ09NTU9OX0gKKyNkZWZpbmUgWDg2RElTQVNTRU1CTEVSREVDT0RFUkNPTU1PTl9ICisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKworI2RlZmluZSBJTlNUUlVDVElPTlNfU1lNICB4ODZEaXNhc3NlbWJsZXJJbnN0clNwZWNpZmllcnMKKyNkZWZpbmUgQ09OVEVYVFNfU1lNICAgICAgeDg2RGlzYXNzZW1ibGVyQ29udGV4dHMKKyNkZWZpbmUgT05FQllURV9TWU0gICAgICAgeDg2RGlzYXNzZW1ibGVyT25lQnl0ZU9wY29kZXMKKyNkZWZpbmUgVFdPQllURV9TWU0gICAgICAgeDg2RGlzYXNzZW1ibGVyVHdvQnl0ZU9wY29kZXMKKyNkZWZpbmUgVEhSRUVCWVRFMzhfU1lNICAgeDg2RGlzYXNzZW1ibGVyVGhyZWVCeXRlMzhPcGNvZGVzCisjZGVmaW5lIFRIUkVFQllURTNBX1NZTSAgIHg4NkRpc2Fzc2VtYmxlclRocmVlQnl0ZTNBT3Bjb2RlcworCisjZGVmaW5lIElOU1RSVUNUSU9OU19TVFIgICJ4ODZEaXNhc3NlbWJsZXJJbnN0clNwZWNpZmllcnMiCisjZGVmaW5lIENPTlRFWFRTX1NUUiAgICAgICJ4ODZEaXNhc3NlbWJsZXJDb250ZXh0cyIKKyNkZWZpbmUgT05FQllURV9TVFIgICAgICAgIng4NkRpc2Fzc2VtYmxlck9uZUJ5dGVPcGNvZGVzIgorI2RlZmluZSBUV09CWVRFX1NUUiAgICAgICAieDg2RGlzYXNzZW1ibGVyVHdvQnl0ZU9wY29kZXMiCisjZGVmaW5lIFRIUkVFQllURTM4X1NUUiAgICJ4ODZEaXNhc3NlbWJsZXJUaHJlZUJ5dGUzOE9wY29kZXMiCisjZGVmaW5lIFRIUkVFQllURTNBX1NUUiAgICJ4ODZEaXNhc3NlbWJsZXJUaHJlZUJ5dGUzQU9wY29kZXMiCisKKy8qCisgKiBBdHRyaWJ1dGVzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQgbXVzdCBiZSBrbm93biBiZWZvcmUgdGhlIG9wY29kZSBjYW4gYmUKKyAqIHByb2Nlc3NlZCBjb3JyZWN0bHkuICBNb3N0IG9mIHRoZXNlIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiBwYXJ0aWN1bGFyCisgKiBwcmVmaXhlcywgYnV0IEFUVFJfNjRCSVQgaXMgc2ltcGx5IGFuIGF0dHJpYnV0ZSBvZiB0aGUgZGVjb2RpbmcgY29udGV4dC4KKyAqLworI2RlZmluZSBBVFRSSUJVVEVfQklUUyAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoQVRUUl9OT05FLCAgIDB4MDApIFwKKyAgRU5VTV9FTlRSWShBVFRSXzY0QklULCAgMHgwMSkgXAorICBFTlVNX0VOVFJZKEFUVFJfWFMsICAgICAweDAyKSBcCisgIEVOVU1fRU5UUlkoQVRUUl9YRCwgICAgIDB4MDQpIFwKKyAgRU5VTV9FTlRSWShBVFRSX1JFWFcsICAgMHgwOCkgXAorICBFTlVNX0VOVFJZKEFUVFJfT1BTSVpFLCAweDEwKQorCisjZGVmaW5lIEVOVU1fRU5UUlkobiwgdikgbiA9IHYsCitlbnVtIGF0dHJpYnV0ZUJpdHMgeworICBBVFRSSUJVVEVfQklUUworICBBVFRSX21heAorfTsKKyN1bmRlZiBFTlVNX0VOVFJZCisKKy8qCisgKiBDb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gaW5zdHJ1Y3Rpb24KKyAqIGRlY29kZS4gIEFsdGhvdWdoIG90aGVyIGNvbWJpbmF0aW9ucyBhcmUgcG9zc2libGUsIHRoZXkgY2FuIGJlIHJlZHVjZWQgdG8KKyAqIHRoZXNlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSB1bHRpbWF0ZWx5IGRlY29kZWQgaW5zdHJ1Y3Rpb24uCisgKi8KKworLyogICAgICAgICAgIENsYXNzIG5hbWUgICAgICAgICAgIFJhbmsgIFJhdGlvbmFsZSBmb3IgcmFuayBhc3NpZ25tZW50ICAgICAgICAgKi8KKyNkZWZpbmUgSU5TVFJVQ1RJT05fQ09OVEVYVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUMsICAgICAgICAgICAgICAgICAgICAwLCAgInNheXMgbm90aGluZyBhYm91dCB0aGUgaW5zdHJ1Y3Rpb24iKSAgXAorICBFTlVNX0VOVFJZKElDXzY0QklULCAgICAgICAgICAgICAgMSwgICJzYXlzIHRoZSBpbnN0cnVjdGlvbiBhcHBsaWVzIGluICIgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNjQtYml0IG1vZGUgYnV0IG5vIG1vcmUiKSAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfT1BTSVpFLCAgICAgICAgICAgICAzLCAgInJlcXVpcmVzIGFuIE9QU0laRSBwcmVmaXgsIHNvICIgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYW5kcyBjaGFuZ2Ugd2lkdGgiKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19YRCwgICAgICAgICAgICAgICAgIDIsICAibWF5IHNheSBzb21ldGhpbmcgYWJvdXQgdGhlIG9wY29kZSAiICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBub3QgdGhlIG9wZXJhbmRzIikgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX1hTLCAgICAgICAgICAgICAgICAgMiwgICJtYXkgc2F5IHNvbWV0aGluZyBhYm91dCB0aGUgb3Bjb2RlICIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IG5vdCB0aGUgb3BlcmFuZHMiKSAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfUkVYVywgICAgICAgICA0LCAgInJlcXVpcmVzIGEgUkVYLlcgcHJlZml4LCBzbyBvcGVyYW5kcyAiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFuZ2Ugd2lkdGg7IG92ZXJyaWRlcyBJQ19PUFNJWkUiKSAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9PUFNJWkUsICAgICAgIDMsICAiSnVzdCBhcyBtZWFuaW5nZnVsIGFzIElDX09QU0laRSIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfWEQsICAgICAgICAgICA1LCAgIlhEIGluc3RydWN0aW9ucyBhcmUgU1NFOyBSRVguVyBpcyAiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmRhcnkiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9YUywgICAgICAgICAgIDUsICAiSnVzdCBhcyBtZWFuaW5nZnVsIGFzIElDXzY0QklUX1hEIikgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfUkVYV19YUywgICAgICA2LCAgIk9QU0laRSBjb3VsZCBtZWFuIGEgZGlmZmVyZW50ICIgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGNvZGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9SRVhXX1hELCAgICAgIDYsICAiSnVzdCBhcyBtZWFuaW5nZnVsIGFzICIgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklDXzY0QklUX1JFWFdfWFMiKSAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDXzY0QklUX1JFWFdfT1BTSVpFLCAgNywgICJUaGUgRHluYW1pYyBEdW8hICBQcmVmZXIgb3ZlciBhbGwgIiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxzZSBiZWNhdXNlIHRoaXMgY2hhbmdlcyBtb3N0ICIgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhbmRzJyBtZWFuaW5nIikKKworI2RlZmluZSBFTlVNX0VOVFJZKG4sIHIsIGQpIG4sICAgIAordHlwZWRlZiBlbnVtIHsKKyAgSU5TVFJVQ1RJT05fQ09OVEVYVFMKKyAgSUNfbWF4Cit9IEluc3RydWN0aW9uQ29udGV4dDsKKyN1bmRlZiBFTlVNX0VOVFJZCisKKy8qCisgKiBPcGNvZGUgdHlwZXMsIHdoaWNoIGRldGVybWluZSB3aGljaCBkZWNvZGUgdGFibGUgdG8gdXNlLCBib3RoIGluIHRoZSBJbnRlbAorICogbWFudWFsIGFuZCBhbHNvIGZvciB0aGUgZGVjb2Rlci4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgT05FQllURSAgICAgICA9IDAsCisgIFRXT0JZVEUgICAgICAgPSAxLAorICBUSFJFRUJZVEVfMzggID0gMiwKKyAgVEhSRUVCWVRFXzNBICA9IDMKK30gT3Bjb2RlVHlwZTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0cyBhcmUgdXNlZCBmb3IgdGhlIGhpZXJhcmNoaWNhbCBkZWNvZGUgdGFibGUuICBBZnRlcgorICogZGV0ZXJtaW5pbmcgdGhlIGluc3RydWN0aW9uJ3MgY2xhc3MgKGkuZS4sIHdoaWNoIElDXyogY29uc3RhbnQgYXBwbGllcyB0bworICogaXQpLCB0aGUgZGVjb2RlciByZWFkcyB0aGUgb3Bjb2RlLiAgU29tZSBpbnN0cnVjdGlvbnMgcmVxdWlyZSBzcGVjaWZpYworICogdmFsdWVzIG9mIHRoZSBNb2RSL00gYnl0ZSwgc28gdGhlIE1vZFIvTSBieXRlIGluZGV4ZXMgaW50byB0aGUgZmluYWwgdGFibGUuCisgKgorICogSWYgYSBNb2RSL00gYnl0ZSBpcyBub3QgcmVxdWlyZWQsICJyZXF1aXJlZCIgaXMgbGVmdCB1bnNldCwgYW5kIHRoZSB2YWx1ZXMKKyAqIGZvciBlYWNoIGluc3RydWN0aW9uSUQgYXJlIGlkZW50aWNhbC4KKyAqLworIAordHlwZWRlZiB1aW50MTZfdCBJbnN0clVJRDsKKworLyoKKyAqIE1vZFJNRGVjaXNpb25UeXBlIC0gZGVzY3JpYmVzIHRoZSB0eXBlIG9mIE1vZFIvTSBkZWNpc2lvbiwgYWxsb3dpbmcgdGhlIAorICogY29uc3VtZXIgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBpdC4KKyAqCisgKiBNT0RSTV9PTkVFTlRSWSAtIE5vIG1hdHRlciB3aGF0IHRoZSB2YWx1ZSBvZiB0aGUgTW9kUi9NIGJ5dGUgaXMsIHRoZSBkZWNvZGVkCisgKiAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uIGlzIHRoZSBzYW1lLgorICogTU9EUk1fU1BMSVRSTSAgLSBJZiB0aGUgTW9kUi9NIGJ5dGUgaXMgYmV0d2VlbiAweDAwIGFuZCAweGJmLCB0aGUgb3Bjb2RlCisgKiAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIG9uZSBpbnN0cnVjdGlvbjsgb3RoZXJ3aXNlLCBpdCBjb3JyZXNwb25kcyB0bworICogICAgICAgICAgICAgICAgICBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbi4KKyAqIE1PRFJNX0ZVTEwgICAgIC0gUG90ZW50aWFsbHksIGVhY2ggdmFsdWUgb2YgdGhlIE1vZFIvTSBieXRlIGNvdWxkIGNvcnJlc3BvbmQKKyAqICAgICAgICAgICAgICAgICAgdG8gYSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24uCisgKi8KKworI2RlZmluZSBNT0RSTVRZUEVTICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKE1PRFJNX09ORUVOVFJZKSAgXAorICBFTlVNX0VOVFJZKE1PRFJNX1NQTElUUk0pICAgXAorICBFTlVNX0VOVFJZKE1PRFJNX0ZVTEwpCisKKyNkZWZpbmUgRU5VTV9FTlRSWShuKSBuLCAgICAKK3R5cGVkZWYgZW51bSB7CisgIE1PRFJNVFlQRVMKKyAgTU9EUk1fbWF4Cit9IE1vZFJNRGVjaXNpb25UeXBlOworI3VuZGVmIEVOVU1fRU5UUlkKKworLyoKKyAqIE1vZFJNRGVjaXNpb24gLSBTcGVjaWZpZXMgd2hldGhlciBhIE1vZFIvTSBieXRlIGlzIG5lZWRlZCBhbmQgKGlmIHNvKSB3aGljaCAKKyAqICBpbnN0cnVjdGlvbiBlYWNoIHBvc3NpYmxlIHZhbHVlIG9mIHRoZSBNb2RSL00gYnl0ZSBjb3JyZXNwb25kcyB0by4gIE9uY2UKKyAqICB0aGlzIGluZm9ybWF0aW9uIGlzIGtub3duLCB3ZSBoYXZlIG5hcnJvd2VkIGRvd24gdG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgKi8KK3N0cnVjdCBNb2RSTURlY2lzaW9uIHsKKyAgdWludDhfdCAgICAgbW9kcm1fdHlwZTsKKyAgCisgIC8qIFRoZSBtYWNybyBiZWxvdyBtdXN0IGJlIGRlZmluZWQgd2hlcmV2ZXIgdGhpcyBmaWxlIGlzIGluY2x1ZGVkLiAqLworICBJTlNUUlVDVElPTl9JRFMKK307CisKKy8qCisgKiBPcGNvZGVEZWNpc2lvbiAtIFNwZWNpZmllcyB3aGljaCBzZXQgb2YgTW9kUi9NLT5pbnN0cnVjdGlvbiB0YWJsZXMgdG8gbG9vayBhdAorICogICBnaXZlbiBhIHBhcnRpY3VsYXIgb3Bjb2RlLgorICovCitzdHJ1Y3QgT3Bjb2RlRGVjaXNpb24geworICBzdHJ1Y3QgTW9kUk1EZWNpc2lvbiBtb2RSTURlY2lzaW9uc1syNTZdOworfTsKKworLyoKKyAqIENvbnRleHREZWNpc2lvbiAtIFNwZWNpZmllcyB3aGljaCBvcGNvZGUtPmluc3RydWN0aW9uIHRhYmxlcyB0byBsb29rIGF0IGdpdmVuCisgKiAgIGEgcGFydGljdWxhciBjb250ZXh0IChzZXQgb2YgYXR0cmlidXRlcykuICBTaW5jZSB0aGVyZSBhcmUgbWFueSBwb3NzaWJsZQorICogICBjb250ZXh0cywgdGhlIGRlY29kZXIgZmlyc3QgdXNlcyBDT05URVhUU19TWU0gdG8gZGV0ZXJtaW5lIHdoaWNoIGNvbnRleHQKKyAqICAgYXBwbGllcyBnaXZlbiBhIHNwZWNpZmljIHNldCBvZiBhdHRyaWJ1dGVzLiAgSGVuY2UgdGhlcmUgYXJlIG9ubHkgSUNfbWF4CisgKiAgIGVudHJpZXMgaW4gdGhpcyB0YWJsZSwgcmF0aGVyIHRoYW4gMl4oQVRUUl9tYXgpLgorICovCitzdHJ1Y3QgQ29udGV4dERlY2lzaW9uIHsKKyAgc3RydWN0IE9wY29kZURlY2lzaW9uIG9wY29kZURlY2lzaW9uc1tJQ19tYXhdOworfTsKKworLyogCisgKiBQaHlzaWNhbCBlbmNvZGluZ3Mgb2YgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMuCisgKi8KKworI2RlZmluZSBFTkNPRElOR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19OT05FLCAgICIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUkVHLCAgICAiUmVnaXN0ZXIgb3BlcmFuZCBpbiBNb2RSL00gYnl0ZS4iKSAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JNLCAgICAgIlIvTSBvcGVyYW5kIGluIE1vZFIvTSBieXRlLiIpICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19DQiwgICAgICIxLWJ5dGUgY29kZSBvZmZzZXQgKHBvc3NpYmxlIG5ldyBDUyB2YWx1ZSkiKSAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfQ1csICAgICAiMi1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX0NELCAgICAgIjQtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19DUCwgICAgICI2LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfQ08sICAgICAiOC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX0NULCAgICAgIjEwLWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19JQiwgICAgICIxLWJ5dGUgaW1tZWRpYXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfSVcsICAgICAiMi1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX0lELCAgICAgIjQtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19JTywgICAgICI4LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUkIsICAgICAiKEFMLi5ESUwsIFI4TC4uUjE1TCkgUmVnaXN0ZXIgY29kZSBhZGRlZCB0byAiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBvcGNvZGUgYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19SVywgICAgICIoQVguLkRJLCBSOFcuLlIxNVcpIikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUkQsICAgICAiKEVBWC4uRURJLCBSOEQuLlIxNUQpIikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JPLCAgICAgIihSQVguLlJESSwgUjguLlIxNSkiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19JLCAgICAgICJQb3NpdGlvbiBvbiBmbG9hdGluZy1wb2ludCBzdGFjayBhZGRlZCB0byB0aGUgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3Bjb2RlIGJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19JdiwgICAgICJJbW1lZGlhdGUgb2Ygb3BlcmFuZCBzaXplIikgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfSWEsICAgICAiSW1tZWRpYXRlIG9mIGFkZHJlc3Mgc2l6ZSIpICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1J2LCAgICAgIlJlZ2lzdGVyIGNvZGUgb2Ygb3BlcmFuZCBzaXplIGFkZGVkIHRvIHRoZSAiICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGNvZGUgYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfRFVQLCAgICAiRHVwbGljYXRlIG9mIGFub3RoZXIgb3BlcmFuZDsgSUQgaXMgZW5jb2RlZCAiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIHR5cGUiKQorCisjZGVmaW5lIEVOVU1fRU5UUlkobiwgZCkgbiwgICAgCisgIHR5cGVkZWYgZW51bSB7CisgICAgRU5DT0RJTkdTCisgICAgRU5DT0RJTkdfbWF4CisgIH0gT3BlcmFuZEVuY29kaW5nOworI3VuZGVmIEVOVU1fRU5UUlkKKworLyogCisgKiBTZW1hbnRpYyBpbnRlcnByZXRhdGlvbnMgb2YgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMuCisgKi8KKworI2RlZmluZSBUWVBFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX05PTkUsICAgICAgICIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9SRUw4LCAgICAgICAiMS1ieXRlIGltbWVkaWF0ZSBhZGRyZXNzIikgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUkVMMTYsICAgICAgIjItYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1JFTDMyLCAgICAgICI0LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9SRUw2NCwgICAgICAiOC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUFRSMTYxNiwgICAgIjIrMi1ieXRlIHNlZ21lbnQrb2Zmc2V0IGFkZHJlc3MiKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1BUUjE2MzIsICAgICIyKzQtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9QVFIxNjY0LCAgICAiMis4LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUjgsICAgICAgICAgIjEtYnl0ZSByZWdpc3RlciBvcGVyYW5kIikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1IxNiwgICAgICAgICIyLWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9SMzIsICAgICAgICAiNC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUjY0LCAgICAgICAgIjgtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0lNTTgsICAgICAgICIxLWJ5dGUgaW1tZWRpYXRlIG9wZXJhbmQiKSAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9JTU0xNiwgICAgICAiMi1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfSU1NMzIsICAgICAgIjQtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0lNTTY0LCAgICAgICI4LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9JTU0zLCAgICAgICAiMS1ieXRlIGltbWVkaWF0ZSBvcGVyYW5kIGJldHdlZW4gMCBhbmQgNyIpICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUk04LCAgICAgICAgIjEtYnl0ZSByZWdpc3RlciBvciBtZW1vcnkgb3BlcmFuZCIpICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1JNMTYsICAgICAgICIyLWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9STTMyLCAgICAgICAiNC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUk02NCwgICAgICAgIjgtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX00sICAgICAgICAgICJNZW1vcnkgb3BlcmFuZCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NOCwgICAgICAgICAiMS1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTTE2LCAgICAgICAgIjItYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX00zMiwgICAgICAgICI0LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NNjQsICAgICAgICAiOC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTEVBLCAgICAgICAgIkVmZmVjdGl2ZSBhZGRyZXNzIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX00xMjgsICAgICAgICIxNi1ieXRlIChTU0UvU1NFMikiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NMTYxNiwgICAgICAiMisyLWJ5dGUgc2VnbWVudCtvZmZzZXQgYWRkcmVzcyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTTE2MzIsICAgICAgIjIrNC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX00xNjY0LCAgICAgICIyKzgtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NMTZfMzIsICAgICAiMis0LWJ5dGUgdHdvLXBhcnQgbWVtb3J5IG9wZXJhbmQgKExJRFQsIExHRFQpIikgXAorICBFTlVNX0VOVFJZKFRZUEVfTTE2XzE2LCAgICAgIjIrMi1ieXRlIChCT1VORCkiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX00zMl8zMiwgICAgICI0KzQtYnl0ZSAoQk9VTkQpIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NMTZfNjQsICAgICAiMis4LWJ5dGUgKExJRFQsIExHRFQpIikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTU9GRlM4LCAgICAgIjEtYnl0ZSBtZW1vcnkgb2Zmc2V0IChyZWxhdGl2ZSB0byBzZWdtZW50ICIgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlKSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NT0ZGUzE2LCAgICAiMi1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTU9GRlMzMiwgICAgIjQtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX01PRkZTNjQsICAgICI4LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9TUkVHLCAgICAgICAiQnl0ZSB3aXRoIHNpbmdsZSBiaXQgc2V0OiAwID0gRVMsIDEgPSBDUywgIiAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIgPSBTUywgMyA9IERTLCA0ID0gRlMsIDUgPSBHUyIpICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX00zMkZQLCAgICAgICIzMi1iaXQgSUVFNzU0IG1lbW9yeSBmbG9hdGluZy1wb2ludCBvcGVyYW5kIikgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NNjRGUCwgICAgICAiNjQtYml0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTTgwRlAsICAgICAgIjgwLWJpdCBleHRlbmRlZCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX00xNklOVCwgICAgICIyLWJ5dGUgbWVtb3J5IGludGVnZXIgb3BlcmFuZCBmb3IgdXNlIGluICIgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXRpbmctcG9pbnQgaW5zdHJ1Y3Rpb25zIikgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTTMySU5ULCAgICAgIjQtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX002NElOVCwgICAgICI4LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9TVCwgICAgICAgICAiUG9zaXRpb24gb24gdGhlIGZsb2F0aW5nLXBvaW50IHN0YWNrIikgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTU0sICAgICAgICAgIk1NWCByZWdpc3RlciBvcGVyYW5kIikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX01NMzIsICAgICAgICI0LWJ5dGUgTU1YIHJlZ2lzdGVyIG9yIG1lbW9yeSBvcGVyYW5kIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NTTY0LCAgICAgICAiOC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfWE1NLCAgICAgICAgIlhNTSByZWdpc3RlciBvcGVyYW5kIikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1hNTTMyLCAgICAgICI0LWJ5dGUgWE1NIHJlZ2lzdGVyIG9yIG1lbW9yeSBvcGVyYW5kIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9YTU02NCwgICAgICAiOC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfWE1NMTI4LCAgICAgIjE2LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1hNTTAsICAgICAgICJJbXBsaWNpdCB1c2Ugb2YgWE1NMCIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9TRUdNRU5UUkVHLCAiU2VnbWVudCByZWdpc3RlciBvcGVyYW5kIikgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfREVCVUdSRUcsICAgIkRlYnVnIHJlZ2lzdGVyIG9wZXJhbmQiKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0NPTlRST0xSRUcsICJDb250cm9sIHJlZ2lzdGVyIG9wZXJhbmQiKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTXYsICAgICAgICAgIk1lbW9yeSBvcGVyYW5kIG9mIG9wZXJhbmQgc2l6ZSIpICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1J2LCAgICAgICAgICJSZWdpc3RlciBvcGVyYW5kIG9mIG9wZXJhbmQgc2l6ZSIpICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9JTU12LCAgICAgICAiSW1tZWRpYXRlIG9wZXJhbmQgb2Ygb3BlcmFuZCBzaXplIikgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUkVMdiwgICAgICAgIkltbWVkaWF0ZSBhZGRyZXNzIG9mIG9wZXJhbmQgc2l6ZSIpICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0RVUDAsICAgICAgICJEdXBsaWNhdGUgb2Ygb3BlcmFuZCAwIikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9EVVAxLCAgICAgICAib3BlcmFuZCAxIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfRFVQMiwgICAgICAgIm9wZXJhbmQgMiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0RVUDMsICAgICAgICJvcGVyYW5kIDMiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9EVVA0LCAgICAgICAib3BlcmFuZCA0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTTUxMiwgICAgICAgIjUxMi1iaXQgRlBVL01NWC9YTU0vTVhDU1Igc3RhdGUiKQorCisjZGVmaW5lIEVOVU1fRU5UUlkobiwgZCkgbiwgICAgCit0eXBlZGVmIGVudW0geworICBUWVBFUworICBUWVBFX21heAorfSBPcGVyYW5kVHlwZTsKKyN1bmRlZiBFTlVNX0VOVFJZCisKKy8qIAorICogT3BlcmFuZFNwZWNpZmllciAtIFRoZSBzcGVjaWZpY2F0aW9uIGZvciBob3cgdG8gZXh0cmFjdCBhbmQgaW50ZXJwcmV0IG9uZQorICogICBvcGVyYW5kLgorICovCitzdHJ1Y3QgT3BlcmFuZFNwZWNpZmllciB7CisgIE9wZXJhbmRFbmNvZGluZyAgZW5jb2Rpbmc7CisgIE9wZXJhbmRUeXBlICAgICAgdHlwZTsKK307CisKKy8qCisgKiBJbmRpY2F0ZXMgd2hlcmUgdGhlIG9wY29kZSBtb2RpZmllciAoaWYgYW55KSBpcyB0byBiZSBmb3VuZC4gIEV4dGVuZGVkCisgKiBvcGNvZGVzIHdpdGggQWRkUmVnRnJtIGhhdmUgdGhlIG9wY29kZSBtb2RpZmllciBpbiB0aGUgTW9kUi9NIGJ5dGUuCisgKi8KKworI2RlZmluZSBNT0RJRklFUl9UWVBFUyAgICAgICAgXAorICBFTlVNX0VOVFJZKE1PRElGSUVSX05PTkUpICAgXAorICBFTlVNX0VOVFJZKE1PRElGSUVSX09QQ09ERSkgXAorICBFTlVNX0VOVFJZKE1PRElGSUVSX01PRFJNKQorCisjZGVmaW5lIEVOVU1fRU5UUlkobikgbiwKK3R5cGVkZWYgZW51bSB7CisgIE1PRElGSUVSX1RZUEVTCisgIE1PRElGSUVSX21heAorfSBNb2RpZmllclR5cGU7CisjdW5kZWYgRU5VTV9FTlRSWQorCisjZGVmaW5lIFg4Nl9NQVhfT1BFUkFORFMgNQorCisvKgorICogVGhlIHNwZWNpZmljYXRpb24gZm9yIGhvdyB0byBleHRyYWN0IGFuZCBpbnRlcnByZXQgYSBmdWxsIGluc3RydWN0aW9uIGFuZAorICogaXRzIG9wZXJhbmRzLgorICovCitzdHJ1Y3QgSW5zdHJ1Y3Rpb25TcGVjaWZpZXIgeworICBNb2RpZmllclR5cGUgbW9kaWZpZXJUeXBlOworICB1aW50OF90IG1vZGlmaWVyQmFzZTsKKyAgc3RydWN0IE9wZXJhbmRTcGVjaWZpZXIgb3BlcmFuZHNbWDg2X01BWF9PUEVSQU5EU107CisgIAorICAvKiBUaGUgbWFjcm8gYmVsb3cgbXVzdCBiZSBkZWZpbmVkIHdoZXJldmVyIHRoaXMgZmlsZSBpcyBpbmNsdWRlZC4gKi8KKyAgSU5TVFJVQ1RJT05fU1BFQ0lGSUVSX0ZJRUxEUworfTsKKworLyoKKyAqIERlY29kaW5nIG1vZGUgZm9yIHRoZSBJbnRlbCBkaXNhc3NlbWJsZXIuICAxNi1iaXQsIDMyLWJpdCwgYW5kIDY0LWJpdCBtb2RlCisgKiBhcmUgc3VwcG9ydGVkLCBhbmQgcmVwcmVzZW50IHJlYWwgbW9kZSwgSUEtMzJlLCBhbmQgSUEtMzJlIGluIDY0LWJpdCBtb2RlLAorICogcmVzcGVjdGl2ZWx5LgorICovCit0eXBlZGVmIGVudW0geworICBNT0RFXzE2QklULAorICBNT0RFXzMyQklULAorICBNT0RFXzY0QklUCit9IERpc2Fzc2VtYmxlck1vZGU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGZmODk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorIyM9PT0tIGxpYi9UYXJnZXQvWDg2L01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNWDg2Q29kZUdlbgorVEFSR0VUID0gWDg2CisKKyMgTWFrZSBzdXJlIHRoYXQgdGJsZ2VuIGlzIHJ1biwgZmlyc3QgdGhpbmcuCitCVUlMVF9TT1VSQ0VTID0gWDg2R2VuUmVnaXN0ZXJJbmZvLmguaW5jIFg4NkdlblJlZ2lzdGVyTmFtZXMuaW5jIFwKKyAgICAgICAgICAgICAgICBYODZHZW5SZWdpc3RlckluZm8uaW5jIFg4Nkdlbkluc3RyTmFtZXMuaW5jIFwKKyAgICAgICAgICAgICAgICBYODZHZW5JbnN0ckluZm8uaW5jIFg4NkdlbkFzbVdyaXRlci5pbmMgWDg2R2VuQXNtTWF0Y2hlci5pbmMgXAorICAgICAgICAgICAgICAgIFg4NkdlbkFzbVdyaXRlcjEuaW5jIFg4NkdlbkRBR0lTZWwuaW5jICBcCisgICAgICAgICAgICAgICAgWDg2R2VuRGlzYXNzZW1ibGVyVGFibGVzLmluYyBYODZHZW5GYXN0SVNlbC5pbmMgXAorICAgICAgICAgICAgICAgIFg4NkdlbkNhbGxpbmdDb252LmluYyBYODZHZW5TdWJ0YXJnZXQuaW5jIFwKKwkJWDg2R2VuRURJbmZvLmluYworCitESVJTID0gQXNtUHJpbnRlciBBc21QYXJzZXIgRGlzYXNzZW1ibGVyIFRhcmdldEluZm8KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1GUFN0YWNrLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1GUFN0YWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWVmZDJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvUkVBRE1FLUZQU3RhY2sudHh0CkBAIC0wLDAgKzEsODUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJhbmRvbSBpZGVhcyBmb3IgdGhlIFg4NiBiYWNrZW5kOiBGUCBzdGFjayByZWxhdGVkIHN0dWZmCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworU29tZSB0YXJnZXRzIChlLmcuIGF0aGxvbnMpIHByZWZlciBmcmVlcCB0byBmc3RwIFNUKDApOgoraHR0cDovL2djYy5nbnUub3JnL21sL2djYy1wYXRjaGVzLzIwMDQtMDQvbXNnMDA2NTkuaHRtbAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoaXMgc2hvdWxkIHVzZSBmaWFkZCBvbiBjaGlwcyB3aGVyZSBpdCBpcyBwcm9maXRhYmxlOgorZG91YmxlIGZvbyhkb3VibGUgUCwgaW50ICpJKSB7IHJldHVybiBQKypJOyB9CisKK1dlIGhhdmUgZmlhZGQgcGF0dGVybnMgbm93IGJ1dCB0aGUgZm9sbG93aW5ncyBoYXZlIHRoZSBzYW1lIGNvc3QgYW5kCitjb21wbGV4aXR5LiBXZSBuZWVkIGEgd2F5IHRvIHNwZWNpZnkgdGhlIGxhdGVyIGlzIG1vcmUgcHJvZml0YWJsZS4KKworZGVmIEZwQUREMzJtICA6IEZwSTwob3BzIFJGUDokZHN0LCBSRlA6JHNyYzEsIGYzMm1lbTokc3JjMiksIE9uZUFyZ0ZQUlcsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDokZHN0LCAoZmFkZCBSRlA6JHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4dGxvYWRmNjRmMzIgYWRkcjokc3JjMikpKV0+OworICAgICAgICAgICAgICAgIC8vIFNUKDApID0gU1QoMCkgKyBbbWVtMzJdCisKK2RlZiBGcElBREQzMm0gOiBGcEk8KG9wcyBSRlA6JGRzdCwgUkZQOiRzcmMxLCBpMzJtZW06JHNyYzIpLCBPbmVBcmdGUFJXLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBSRlA6JGRzdCwgKGZhZGQgUkZQOiRzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZmaWxkIGFkZHI6JHNyYzIsIGkzMikpKV0+OworICAgICAgICAgICAgICAgIC8vIFNUKDApID0gU1QoMCkgKyBbbWVtMzJpbnRdCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlIEZQIHN0YWNraWZpZXIgc2hvdWxkIGhhbmRsZSBzaW1wbGUgcGVybXV0YXRlcyB0byByZWR1Y2UgbnVtYmVyIG9mIHNodWZmbGUKK2luc3RydWN0aW9ucywgZS5nLiB0dXJuaW5nOgorCitmbGQgUAktPgkJZmxkIFEKK2ZsZCBRCQkJZmxkIFAKK2Z4Y2gKKworb3I6CisKK2Z4Y2gJLT4JCWZ1Y29taQorZnVjb21pCQkJamwgWAoramcgWAorCitJZGVhczoKK2h0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDA0LTExL21zZzAyNDEwLmh0bWwKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0FkZCBhIHRhcmdldCBzcGVjaWZpYyBob29rIHRvIERBRyBjb21iaW5lciB0byBoYW5kbGUgU0lOVF9UT19GUCBhbmQKK0ZQX1RPX1NJTlQgd2hlbiB0aGUgc291cmNlIG9wZXJhbmQgaXMgYWxyZWFkeSBpbiBtZW1vcnkuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworT3BlbiBjb2RlIHJpbnQsZmxvb3IsY2VpbCx0cnVuYzoKK2h0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDA0LTA4L21zZzAyMDA2Lmh0bWwKK2h0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDA0LTA4L21zZzAyMDExLmh0bWwKKworT3BlbmNvZGUgdGhlIHNpbmNvc1tmXSBsaWJjYWxsLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK05vbmUgb2YgdGhlIEZQU3RhY2sgaW5zdHJ1Y3Rpb25zIGFyZSBoYW5kbGVkIGluCitYODZSZWdpc3RlckluZm86OmZvbGRNZW1vcnlPcGVyYW5kLCB3aGljaCBwcmV2ZW50cyB0aGUgc3BpbGxlciBmcm9tCitmb2xkaW5nIHNwaWxsIGNvZGUgaW50byB0aGUgaW5zdHJ1Y3Rpb25zLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0N1cnJlbnRseSB0aGUgeDg2IGNvZGVnZW4gaXNuJ3QgdmVyeSBnb29kIGF0IG1peGluZyBTU0UgYW5kIEZQU3RhY2sKK2NvZGU6CisKK3Vuc2lnbmVkIGludCBmb28oZG91YmxlIHgpIHsgcmV0dXJuIHg7IH0KKworZm9vOgorCXN1YmwgJDIwLCAlZXNwCisJbW92c2QgMjQoJWVzcCksICV4bW0wCisJbW92c2QgJXhtbTAsIDgoJWVzcCkKKwlmbGRsIDgoJWVzcCkKKwlmaXN0dHBsbCAoJWVzcCkKKwltb3ZsICglZXNwKSwgJWVheAorCWFkZGwgJDIwLCAlZXNwCisJcmV0CisKK1RoaXMganVzdCByZXF1aXJlcyBiZWluZyBzbWFydGVyIHdoZW4gY3VzdG9tIGV4cGFuZGluZyBmcHRvdWkuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1NTVgudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvUkVBRE1FLU1NWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjODYxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1NTVgudHh0CkBAIC0wLDAgKzEsNzEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJhbmRvbSBpZGVhcyBmb3IgdGhlIFg4NiBiYWNrZW5kOiBNTVgtc3BlY2lmaWMgc3R1ZmYuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpczoKKworI2luY2x1ZGUgPG1taW50cmluLmg+CisKK19fdjJzaSBxdXgoaW50IEEpIHsKKyAgcmV0dXJuIChfX3Yyc2kpeyAwLCBBIH07Cit9CisKK2lzIGNvbXBpbGVkIGludG86CisKK19xdXg6CisgICAgICAgIHN1YmwgJDI4LCAlZXNwCisgICAgICAgIG1vdmwgMzIoJWVzcCksICVlYXgKKyAgICAgICAgbW92ZCAlZWF4LCAlbW0wCisgICAgICAgIG1vdnEgJW1tMCwgKCVlc3ApCisgICAgICAgIG1vdmwgKCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgJWVheCwgMjAoJWVzcCkKKyAgICAgICAgbW92cSAlbW0wLCA4KCVlc3ApCisgICAgICAgIG1vdmwgMTIoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAlZWF4LCAxNiglZXNwKQorICAgICAgICBtb3ZxIDE2KCVlc3ApLCAlbW0wCisgICAgICAgIGFkZGwgJDI4LCAlZXNwCisgICAgICAgIHJldAorCitZdWNrIQorCitHQ0MgZ2l2ZXMgdXM6CisKK19xdXg6CisgICAgICAgIHN1YmwgICAgJDEyLCAlZXNwCisgICAgICAgIG1vdmwgICAgMTYoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAgICAyMCglZXNwKSwgJWVkeAorICAgICAgICBtb3ZsICAgICQwLCAoJWVheCkKKyAgICAgICAgbW92bCAgICAlZWR4LCA0KCVlYXgpCisgICAgICAgIGFkZGwgICAgJDEyLCAlZXNwCisgICAgICAgIHJldCAgICAgJDQKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBnZW5lcmF0ZSBjcmFwcHkgY29kZSBmb3IgdGhpczoKKworX19tNjQgdCgpIHsKKyAgcmV0dXJuIF9tbV9jdnRzaTMyX3NpNjQoMSk7Cit9CisKK190OgorCXN1YmwJJDEyLCAlZXNwCisJbW92bAkkMSwgJWVheAorCW1vdmQJJWVheCwgJW1tMAorCW1vdnEJJW1tMCwgKCVlc3ApCisJbW92bAkoJWVzcCksICVlYXgKKwltb3ZsCTQoJWVzcCksICVlZHgKKwlhZGRsCSQxMiwgJWVzcAorCXJldAorCitUaGUgZXh0cmEgc3RhY2sgdHJhZmZpYyBpcyBjb3ZlcmVkIGluIHRoZSBwcmV2aW91cyBlbnRyeS4gQnV0IHRoZSBvdGhlciByZWFzb24KK2lzIHdlIGFyZSBub3Qgc21hcnQgYWJvdXQgbWF0ZXJpYWxpemluZyBjb25zdGFudHMgaW4gTU1YIHJlZ2lzdGVycy4gV2l0aCAtbTY0CisKKwltb3ZsCSQxLCAlZWF4CisJbW92ZAklZWF4LCAlbW0wCisJbW92ZAklbW0wLCAlcmF4CisJcmV0CisKK1dlIHNob3VsZCBiZSB1c2luZyBhIGNvbnN0YW50cG9vbCBsb2FkIGluc3RlYWQ6CisJbW92cQlMQzAoJXJpcCksICVyYXgKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1TU0UudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvUkVBRE1FLVNTRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhYmE5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1TU0UudHh0CkBAIC0wLDAgKzEsODY5IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSYW5kb20gaWRlYXMgZm9yIHRoZSBYODYgYmFja2VuZDogU1NFLXNwZWNpZmljIHN0dWZmLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCistIENvbnNpZGVyIGVsaW1pbmF0aW5nIHRoZSB1bmFsaWduZWQgU1NFIGxvYWQgaW50cmluc2ljcywgcmVwbGFjaW5nIHRoZW0gd2l0aAorICB1bmFsaWduZWQgTExWTSBsb2FkIGluc3RydWN0aW9ucy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitFeHBhbmQgbGlibSByb3VuZGluZyBmdW5jdGlvbnMgaW5saW5lOiAgU2lnbmlmaWNhbnQgc3BlZWR1cHMgcG9zc2libGUuCitodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwNi0xMC9tc2cwMDkwOS5odG1sCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2hlbiBjb21waWxlZCB3aXRoIHVuc2FmZW1hdGggZW5hYmxlZCwgIm1haW4iIHNob3VsZCBlbmFibGUgU1NFIERBWiBtb2RlIGFuZAorb3RoZXIgZmFzdCBTU0UgbW9kZXMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpbmsgYWJvdXQgZG9pbmcgaTY0IG1hdGggaW4gU1NFIHJlZ3Mgb24geDg2LTMyLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoaXMgdGVzdGNhc2Ugc2hvdWxkIGhhdmUgbm8gU1NFIGluc3RydWN0aW9ucyBpbiBpdCwgYW5kIG9ubHkgb25lIGxvYWQgZnJvbQorYSBjb25zdGFudCBwb29sOgorCitkb3VibGUgJXRlc3QzKGJvb2wgJUIpIHsKKyAgICAgICAgJUMgPSBzZWxlY3QgYm9vbCAlQiwgZG91YmxlIDEyMy40MTIsIGRvdWJsZSA1MjMuMDExMjMxMjMKKyAgICAgICAgcmV0IGRvdWJsZSAlQworfQorCitDdXJyZW50bHksIHRoZSBzZWxlY3QgaXMgYmVpbmcgbG93ZXJlZCwgd2hpY2ggcHJldmVudHMgdGhlIGRhZyBjb21iaW5lciBmcm9tCit0dXJuaW5nICdzZWxlY3QgKGxvYWQgQ1BJMSksIChsb2FkIENQSTIpJyAtPiAnbG9hZCAoc2VsZWN0IENQSTEsIENQSTIpJworCitUaGUgcGF0dGVybiBpc2VsIGdvdCB0aGlzIG9uZSByaWdodC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTU0Ugc2hvdWxkIGltcGxlbWVudCAnc2VsZWN0X2NjJyB1c2luZyAnZW11bGF0ZWQgY29uZGl0aW9uYWwgbW92ZXMnIHRoYXQgdXNlCitwY21wL3BhbmQvcGFuZG4vcG9yIHRvIGRvIGEgc2VsZWN0aW9uIGluc3RlYWQgb2YgYSBjb25kaXRpb25hbCBicmFuY2g6CisKK2RvdWJsZSAlWChkb3VibGUgJVksIGRvdWJsZSAlWiwgZG91YmxlICVBLCBkb3VibGUgJUIpIHsKKyAgICAgICAgJUMgPSBzZXRsdCBkb3VibGUgJUEsICVCCisgICAgICAgICV6ID0gZmFkZCBkb3VibGUgJVosIDAuMCAgICA7OyBzZWxlY3Qgb3BlcmFuZCBpcyBub3QgYSBsb2FkCisgICAgICAgICVEID0gc2VsZWN0IGJvb2wgJUMsIGRvdWJsZSAlWSwgZG91YmxlICV6CisgICAgICAgIHJldCBkb3VibGUgJUQKK30KKworV2UgY3VycmVudGx5IGVtaXQ6CisKK19YOgorICAgICAgICBzdWJsICQxMiwgJWVzcAorICAgICAgICB4b3JwZCAleG1tMCwgJXhtbTAKKyAgICAgICAgYWRkc2QgMjQoJWVzcCksICV4bW0wCisgICAgICAgIG1vdnNkIDMyKCVlc3ApLCAleG1tMQorICAgICAgICBtb3ZzZCAxNiglZXNwKSwgJXhtbTIKKyAgICAgICAgdWNvbWlzZCA0MCglZXNwKSwgJXhtbTEKKyAgICAgICAgamIgTEJCX1hfMgorTEJCX1hfMToKKyAgICAgICAgbW92c2QgJXhtbTAsICV4bW0yCitMQkJfWF8yOgorICAgICAgICBtb3ZzZCAleG1tMiwgKCVlc3ApCisgICAgICAgIGZsZGwgKCVlc3ApCisgICAgICAgIGFkZGwgJDEyLCAlZXNwCisgICAgICAgIHJldAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0xvd2VyIG1lbWNweSAvIG1lbXNldCB0byBhIHNlcmllcyBvZiBTU0UgMTI4IGJpdCBtb3ZlIGluc3RydWN0aW9ucyB3aGVuIGl0J3MKK2ZlYXNpYmxlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0NvZGVnZW46CisgIGlmIChjb3B5c2lnbigxLjAsIHgpID09IGNvcHlzaWduKDEuMCwgeSkpCitpbnRvOgorICBpZiAoeF55ICYgbWFzaykKK3doZW4gdXNpbmcgU1NFLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1VzZSBtb3ZocHMgdG8gdXBkYXRlIHVwcGVyIDY0LWJpdHMgb2YgYSB2NHNmIHZhbHVlLiBBbHNvIG1vdmxwcyBvbiBsb3dlciBoYWxmCitvZiBhIHY0c2YgdmFsdWUuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQmV0dGVyIGNvZGVnZW4gZm9yIHZlY3Rvcl9zaHVmZmxlcyBsaWtlIHRoaXMgeyB4LCAwLCAwLCAwIH0gb3IgeyB4LCAwLCB4LCAwfS4KK1BlcmhhcHMgdXNlIHB4b3IgLyB4b3JwKiB0byBjbGVhciBhIFhNTSByZWdpc3RlciBmaXJzdD8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitFeHRlcm5hbCB0ZXN0IE51cmJzIGV4cG9zZWQgc29tZSBwcm9ibGVtcy4gTG9vayBmb3IKK19fWk4xNU51cmJzX1NTRV9DdWJpYzE3VGVzc2VsbGF0ZVN1cmZhY2VFLCBiYiBjb25kX25leHQxNDAuIFRoaXMgaXMgd2hhdCBpY2MKK2VtaXRzOgorCisgICAgICAgIG1vdmFwcyAgICAoJWVkeCksICV4bW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzU5LjIxCisgICAgICAgIG1vdmFwcyAgICAoJWVkeCksICV4bW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzYwLjIxCisgICAgICAgIG1vdmFwcyAgICAoJWVkeCksICV4bW00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzYxLjIxCisgICAgICAgIG1vdmFwcyAgICAoJWVkeCksICV4bW0zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzYyLjIxCisgICAgICAgIG1vdmwgICAgICA0MCglZWN4KSwgJWVicCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzY5LjQ5CisgICAgICAgIHNodWZwcyAgICAkMCwgJXhtbTIsICV4bW01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzYwLjIxCisgICAgICAgIG1vdmwgICAgICAxMDAoJWVzcCksICVlYnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzY5LjIwCisgICAgICAgIG1vdmwgICAgICAoJWVieCksICVlZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzY5LjIwCisgICAgICAgIGltdWxsICAgICAlZWJwLCAlZWRpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzY5LjQ5CisgICAgICAgIGFkZGwgICAgICAoJWVheCksICVlZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzcwLjMzCisgICAgICAgIHNodWZwcyAgICAkODUsICV4bW0yLCAleG1tNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzYxLjIxCisgICAgICAgIHNodWZwcyAgICAkMTcwLCAleG1tMiwgJXhtbTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzYyLjIxCisgICAgICAgIHNodWZwcyAgICAkMjU1LCAleG1tMiwgJXhtbTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzYzLjIxCisgICAgICAgIGxlYSAgICAgICAoJWVicCwlZWJwLDIpLCAlZWJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIzY5LjQ5CisgICAgICAgIG5lZ2wgICAgICAlZWJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzY5LjQ5CisgICAgICAgIGxlYSAgICAgICAtMyglZWRpLCVlYngpLCAlZWJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIzcwLjMzCisgICAgICAgIHNobGwgICAgICAkNCwgJWVieCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzY4LjM3CisgICAgICAgIGFkZGwgICAgICAzMiglZWN4KSwgJWVieCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzY4LjM3CisgICAgICAgIHRlc3RiICAgICAkMTUsICVibCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzkxLjEzCisgICAgICAgIGpuZSAgICAgICBMX0IxLjI0ICAgICAgICMgUHJvYiA1JSAgICAgICAgICAgICAgICAgICAgICAgIzkxLjEzCisKK1RoaXMgaXMgdGhlIGxsdm0gY29kZSBhZnRlciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nOgorCitjb25kX25leHQxNDAgKDB4YTkxMDc0MCwgTExWTSBCQiBAMHhhOTBiZWIwKToKKwklcmVnMTA3OCA9IE1PVjMycmkgLTMKKwklcmVnMTA3OSA9IEFERDMycm0gJXJlZzEwNzgsICVyZWcxMDY4LCAxLCAlTk9SRUcsIDAKKwklcmVnMTAzNyA9IE1PVjMycm0gJXJlZzEwMjQsIDEsICVOT1JFRywgNDAKKwklcmVnMTA4MCA9IElNVUwzMnJyICVyZWcxMDc5LCAlcmVnMTAzNworCSVyZWcxMDgxID0gTU9WMzJybSAlcmVnMTA1OCwgMSwgJU5PUkVHLCAwCisJJXJlZzEwMzggPSBMRUEzMnIgJXJlZzEwODEsIDEsICVyZWcxMDgwLCAtMworCSVyZWcxMDM2ID0gTU9WMzJybSAlcmVnMTAyNCwgMSwgJU5PUkVHLCAzMgorCSVyZWcxMDgyID0gU0hMMzJyaSAlcmVnMTAzOCwgNAorCSVyZWcxMDM5ID0gQUREMzJyciAlcmVnMTAzNiwgJXJlZzEwODIKKwklcmVnMTA4MyA9IE1PVkFQU3JtICVyZWcxMDU5LCAxLCAlTk9SRUcsIDAKKwklcmVnMTAzNCA9IFNIVUZQU3JyICVyZWcxMDgzLCAlcmVnMTA4MywgMTcwCisJJXJlZzEwMzIgPSBTSFVGUFNyciAlcmVnMTA4MywgJXJlZzEwODMsIDAKKwklcmVnMTAzNSA9IFNIVUZQU3JyICVyZWcxMDgzLCAlcmVnMTA4MywgMjU1CisJJXJlZzEwMzMgPSBTSFVGUFNyciAlcmVnMTA4MywgJXJlZzEwODMsIDg1CisJJXJlZzEwNDAgPSBNT1YzMnJyICVyZWcxMDM5CisJJXJlZzEwODQgPSBBTkQzMnJpOCAlcmVnMTAzOSwgMTUKKwlDTVAzMnJpOCAlcmVnMTA4NCwgMAorCUpFIG1iYjxjb25kX25leHQyMDQsMHhhOTE0ZDMwPgorCitTdGlsbCBvay4gQWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbjoKKworY29uZF9uZXh0MTQwICgweGE5MTA3NDAsIExMVk0gQkIgQDB4YTkwYmViMCk6CisJJUVBWCA9IE1PVjMycmkgLTMKKwklRURYID0gTU9WMzJybSA8ZmkjMz4sIDEsICVOT1JFRywgMAorCUFERDMycm0gJUVBWDxkZWYmdXNlPiwgJUVEWCwgMSwgJU5PUkVHLCAwCisJJUVEWCA9IE1PVjMycm0gPGZpIzc+LCAxLCAlTk9SRUcsIDAKKwklRURYID0gTU9WMzJybSAlRURYLCAxLCAlTk9SRUcsIDQwCisJSU1VTDMycnIgJUVBWDxkZWYmdXNlPiwgJUVEWAorCSVFU0kgPSBNT1YzMnJtIDxmaSM1PiwgMSwgJU5PUkVHLCAwCisJJUVTSSA9IE1PVjMycm0gJUVTSSwgMSwgJU5PUkVHLCAwCisJTU9WMzJtciA8ZmkjND4sIDEsICVOT1JFRywgMCwgJUVTSQorCSVFQVggPSBMRUEzMnIgJUVTSSwgMSwgJUVBWCwgLTMKKwklRVNJID0gTU9WMzJybSA8ZmkjNz4sIDEsICVOT1JFRywgMAorCSVFU0kgPSBNT1YzMnJtICVFU0ksIDEsICVOT1JFRywgMzIKKwklRURJID0gTU9WMzJyciAlRUFYCisJU0hMMzJyaSAlRURJPGRlZiZ1c2U+LCA0CisJQUREMzJyciAlRURJPGRlZiZ1c2U+LCAlRVNJCisJJVhNTTAgPSBNT1ZBUFNybSAlRUNYLCAxLCAlTk9SRUcsIDAKKwklWE1NMSA9IE1PVkFQU3JyICVYTU0wCisJU0hVRlBTcnIgJVhNTTE8ZGVmJnVzZT4sICVYTU0xLCAxNzAKKwklWE1NMiA9IE1PVkFQU3JyICVYTU0wCisJU0hVRlBTcnIgJVhNTTI8ZGVmJnVzZT4sICVYTU0yLCAwCisJJVhNTTMgPSBNT1ZBUFNyciAlWE1NMAorCVNIVUZQU3JyICVYTU0zPGRlZiZ1c2U+LCAlWE1NMywgMjU1CisJU0hVRlBTcnIgJVhNTTA8ZGVmJnVzZT4sICVYTU0wLCA4NQorCSVFQlggPSBNT1YzMnJyICVFREkKKwlBTkQzMnJpOCAlRUJYPGRlZiZ1c2U+LCAxNQorCUNNUDMycmk4ICVFQlgsIDAKKwlKRSBtYmI8Y29uZF9uZXh0MjA0LDB4YTkxNGQzMD4KKworVGhpcyBsb29rcyByZWFsbHkgYmFkLiBUaGUgcHJvYmxlbSBpcyBzaHVmcHMgaXMgYSBkZXN0cnVjdGl2ZSBvcGNvZGUuIFNpbmNlIGl0CithcHBlYXJzIGFzIG9wZXJhbmQgdHdvIGluIG1vcmUgdGhhbiBvbmUgc2h1ZnBzIG9wcy4gSXQgcmVzdWx0ZWQgaW4gYSBudW1iZXIgb2YKK2NvcGllcy4gTm90ZSBpY2MgYWxzbyBzdWZmZXJzIGZyb20gdGhlIHNhbWUgcHJvYmxlbS4gRWl0aGVyIHRoZSBpbnN0cnVjdGlvbgorc2VsZWN0b3Igc2hvdWxkIHNlbGVjdCBwc2h1ZmQgb3IgVGhlIHJlZ2lzdGVyIGFsbG9jYXRvciBjYW4gbWFkZSB0aGUgdHdvLWFkZHJlc3MKK3RvIHRocmVlLWFkZHJlc3MgdHJhbnNmb3JtYXRpb24uCisKK0l0IGFsc28gZXhwb3NlcyBzb21lIG90aGVyIHByb2JsZW1zLiBTZWUgTU9WMzJyaSAtMyBhbmQgdGhlIHNwaWxscy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitDb25zaWRlcjoKKworX19tMTI4IHRlc3QoZmxvYXQgYSkgeworICByZXR1cm4gX21tX3NldF9wcygwLjAsIDAuMCwgMC4wLCBhKmEpOworfQorCitUaGlzIGNvbXBpbGVzIGludG86CisKK21vdnNzIDQoJWVzcCksICV4bW0xCittdWxzcyAleG1tMSwgJXhtbTEKK3hvcnBzICV4bW0wLCAleG1tMAorbW92c3MgJXhtbTEsICV4bW0wCityZXQKKworQmVjYXVzZSBtdWxzcyBkb2Vzbid0IG1vZGlmeSB0aGUgdG9wIDMgZWxlbWVudHMsIHRoZSB0b3AgZWxlbWVudHMgb2YgCit4bW0xIGFyZSBhbHJlYWR5IHplcm8nZC4gIFdlIGNvdWxkIGNvbXBpbGUgdGhpcyB0bzoKKworbW92c3MgNCglZXNwKSwgJXhtbTAKK211bHNzICV4bW0wLCAleG1tMAorcmV0CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSGVyZSdzIGEgc2ljayBhbmQgdHdpc3RlZCBpZGVhLiAgQ29uc2lkZXIgY29kZSBsaWtlIHRoaXM6CisKK19fbTEyOCB0ZXN0KF9fbTEyOCBhKSB7CisgIGZsb2F0IGIgPSAqKGZsb2F0KikmQTsKKyAgLi4uCisgIHJldHVybiBfbW1fc2V0X3BzKDAuMCwgMC4wLCAwLjAsIGIpOworfQorCitUaGlzIG1pZ2h0IGNvbXBpbGUgdG8gdGhpcyBjb2RlOgorCittb3ZhcHMgYyglZXNwKSwgJXhtbTEKK3hvcnBzICV4bW0wLCAleG1tMAorbW92c3MgJXhtbTEsICV4bW0wCityZXQKKworTm93IGNvbnNpZGVyIGlmIHRoZSAuLi4gY29kZSBjYXVzZWQgeG1tMSB0byBnZXQgc3BpbGxlZC4gIFRoaXMgbWlnaHQgcHJvZHVjZQordGhpcyBjb2RlOgorCittb3ZhcHMgYyglZXNwKSwgJXhtbTEKK21vdmFwcyAleG1tMSwgYzIoJWVzcCkKKy4uLgorCit4b3JwcyAleG1tMCwgJXhtbTAKK21vdmFwcyBjMiglZXNwKSwgJXhtbTEKK21vdnNzICV4bW0xLCAleG1tMAorcmV0CisKK0hvd2V2ZXIsIHNpbmNlIHRoZSByZWxvYWQgaXMgb25seSB1c2VkIGJ5IHRoZXNlIGluc3RydWN0aW9ucywgd2UgY291bGQgCisiZm9sZCIgaXQgaW50byB0aGUgdXNlcywgcHJvZHVjaW5nIHNvbWV0aGluZyBsaWtlIHRoaXM6CisKK21vdmFwcyBjKCVlc3ApLCAleG1tMQorbW92YXBzICV4bW0xLCBjMiglZXNwKQorLi4uCisKK21vdnNzIGMyKCVlc3ApLCAleG1tMAorcmV0CisKKy4uLiBzYXZpbmcgdHdvIGluc3RydWN0aW9ucy4KKworVGhlIGJhc2ljIGlkZWEgaXMgdGhhdCBhIHJlbG9hZCBmcm9tIGEgc3BpbGwgc2xvdCwgY2FuLCBpZiBvbmx5IG9uZSA0LWJ5dGUgCitjaHVuayBpcyB1c2VkLCBicmluZyBpbiAzIHplcm9zIHRoZSBvbmUgZWxlbWVudCBpbnN0ZWFkIG9mIDQgZWxlbWVudHMuCitUaGlzIGNhbiBiZSB1c2VkIHRvIHNpbXBsaWZ5IGEgdmFyaWV0eSBvZiBzaHVmZmxlIG9wZXJhdGlvbnMsIHdoZXJlIHRoZQorZWxlbWVudHMgYXJlIGZpeGVkIHplcm9zLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoaXMgY29kZSBnZW5lcmF0ZXMgdWdseSBjb2RlLCBwcm9iYWJseSBkdWUgdG8gY29zdHMgYmVpbmcgb2ZmIG9yIHNvbWV0aGluZzoKKworZGVmaW5lIHZvaWQgQHRlc3QoZmxvYXQqICVQLCA8NCB4IGZsb2F0PiogJVAyICkgeworICAgICAgICAleEZsb2F0MC42ODggPSBsb2FkIGZsb2F0KiAlUAorICAgICAgICAldG1wID0gbG9hZCA8NCB4IGZsb2F0PiogJVAyCisgICAgICAgICVpbkZsb2F0My43MTMgPSBpbnNlcnRlbGVtZW50IDw0IHggZmxvYXQ+ICV0bXAsIGZsb2F0IDAuMCwgaTMyIDMKKyAgICAgICAgc3RvcmUgPDQgeCBmbG9hdD4gJWluRmxvYXQzLjcxMywgPDQgeCBmbG9hdD4qICVQMgorICAgICAgICByZXQgdm9pZAorfQorCitHZW5lcmF0ZXM6CisKK190ZXN0OgorCW1vdmwJOCglZXNwKSwgJWVheAorCW1vdmFwcwkoJWVheCksICV4bW0wCisJcHhvcgkleG1tMSwgJXhtbTEKKwltb3ZhcHMJJXhtbTAsICV4bW0yCisJc2h1ZnBzCSQ1MCwgJXhtbTEsICV4bW0yCisJc2h1ZnBzCSQxMzIsICV4bW0yLCAleG1tMAorCW1vdmFwcwkleG1tMCwgKCVlYXgpCisJcmV0CisKK1dvdWxkIGl0IGJlIGJldHRlciB0byBnZW5lcmF0ZToKKworX3Rlc3Q6CisgICAgICAgIG1vdmwgOCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZhcHMgKCVlY3gpLCAleG1tMAorCXhvciAlZWF4LCAlZWF4CisgICAgICAgIHBpbnNydyAkNiwgJWVheCwgJXhtbTAKKyAgICAgICAgcGluc3J3ICQ3LCAlZWF4LCAleG1tMAorICAgICAgICBtb3ZhcHMgJXhtbTAsICglZWN4KQorICAgICAgICByZXQKKworPworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NvbWUgdXNlZnVsIGluZm9ybWF0aW9uIGluIHRoZSBBcHBsZSBBbHRpdmVjIC8gU1NFIE1pZ3JhdGlvbiBHdWlkZToKKworaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9QZXJmb3JtYW5jZS9Db25jZXB0dWFsLworQWNjZWxlcmF0ZV9zc2VfbWlncmF0aW9uL2luZGV4Lmh0bWwKKworZS5nLiBTU0Ugc2VsZWN0IHVzaW5nIGFuZCwgYW5kbm90LCBvci4gVmFyaW91cyBTU0UgY29tcGFyZSB0cmFuc2xhdGlvbnMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQWRkIGhvb2tzIHRvIGNvbW11dGUgc29tZSBDTVBQIG9wZXJhdGlvbnMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQXBwbHkgdGhlIHNhbWUgdHJhbnNmb3JtYXRpb24gdGhhdCBtZXJnZWQgZm91ciBmbG9hdCBpbnRvIGEgc2luZ2xlIDEyOC1iaXQgbG9hZAordG8gbG9hZHMgZnJvbSBjb25zdGFudCBwb29sLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0Zsb2F0aW5nIHBvaW50IG1heCAvIG1pbiBhcmUgY29tbXV0YWJsZSB3aGVuIC1lbmFibGUtdW5zYWZlLWZwLXBhdGggaXMKK3NwZWNpZmllZC4gV2Ugc2hvdWxkIHR1cm4gaW50X3g4Nl9zc2VfbWF4X3NzIGFuZCBYODZJU0Q6OkZNSU4gZXRjLiBpbnRvIG90aGVyCitub2RlcyB3aGljaCBhcmUgc2VsZWN0ZWQgdG8gbWF4IC8gbWluIGluc3RydWN0aW9ucyB0aGF0IGFyZSBtYXJrZWQgY29tbXV0YWJsZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBzaG91bGQgbWF0ZXJpYWxpemUgdmVjdG9yIGNvbnN0YW50cyBsaWtlICJhbGwgb25lcyIgYW5kICJzaWduYml0IiB3aXRoIAorY29kZSBsaWtlOgorCisgICAgIGNtcGVxcHMgeG1tMSwgeG1tMSAgIDsgeG1tMSA9IGFsbC1vbmVzCisKK2FuZDoKKyAgICAgY21wZXFwcyB4bW0xLCB4bW0xICAgOyB4bW0xID0gYWxsLW9uZXMKKyAgICAgcHNybHEgICB4bW0xLCAzMSAgICAgOyB4bW0xID0gYWxsIDEwMDAwMDAwMDAwMC4uLgorCitpbnN0ZWFkIG9mIHVzaW5nIGEgbG9hZCBmcm9tIHRoZSBjb25zdGFudCBwb29sLiAgVGhlIGxhdGVyIGlzIGltcG9ydGFudCBmb3IKK0FCUy9ORUcvY29weXNpZ24gZXRjLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZXNlIGZ1bmN0aW9uczoKKworI2luY2x1ZGUgPHhtbWludHJpbi5oPgorX19tMTI4aSBhOwordm9pZCB4KHVuc2lnbmVkIHNob3J0IG4pIHsKKyAgYSA9IF9tbV9zbGxpX2VwaTMyIChhLCBuKTsKK30KK3ZvaWQgeSh1bnNpZ25lZCBuKSB7CisgIGEgPSBfbW1fc2xsaV9lcGkzMiAoYSwgbik7Cit9CisKK2NvbXBpbGUgdG8gKCAtTzMgLXN0YXRpYyAtZm9taXQtZnJhbWUtcG9pbnRlcik6CitfeDoKKyAgICAgICAgbW92endsICA0KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmQgICAgJWVheCwgJXhtbTAKKyAgICAgICAgbW92YXBzICBfYSwgJXhtbTEKKyAgICAgICAgcHNsbGQgICAleG1tMCwgJXhtbTEKKyAgICAgICAgbW92YXBzICAleG1tMSwgX2EKKyAgICAgICAgcmV0CitfeToKKyAgICAgICAgbW92ZCAgICA0KCVlc3ApLCAleG1tMAorICAgICAgICBtb3ZhcHMgIF9hLCAleG1tMQorICAgICAgICBwc2xsZCAgICV4bW0wLCAleG1tMQorICAgICAgICBtb3ZhcHMgICV4bW0xLCBfYQorICAgICAgICByZXQKKworInkiIGxvb2tzIGdvb2QsIGJ1dCAieCIgZG9lcyBzaWxseSBtb3Z6d2wgc3R1ZmYgYXJvdW5kIGludG8gYSBHUFIuICBJdCBzZWVtcworbGlrZSBtb3ZkIHdvdWxkIGJlIHN1ZmZpY2llbnQgaW4gYm90aCBjYXNlcyBhcyB0aGUgdmFsdWUgaXMgYWxyZWFkeSB6ZXJvIAorZXh0ZW5kZWQgaW4gdGhlIDMyLWJpdCBzdGFjayBzbG90IElJUkMuICBGb3Igc2lnbmVkIHNob3J0LCBpdCBzaG91bGQgYWxzbyBiZQorc2F2ZSwgYXMgYSByZWFsbHktc2lnbmVkIHZhbHVlIHdvdWxkIGJlIHVuZGVmaW5lZCBmb3IgcHNsbGQuCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSA8bWF0aC5oPgoraW50IHQxKGRvdWJsZSBkKSB7IHJldHVybiBzaWduYml0KGQpOyB9CisKK1RoaXMgY3VycmVudGx5IGNvbXBpbGVzIHRvOgorCXN1YmwJJDEyLCAlZXNwCisJbW92c2QJMTYoJWVzcCksICV4bW0wCisJbW92c2QJJXhtbTAsICglZXNwKQorCW1vdmwJNCglZXNwKSwgJWVheAorCXNocmwJJDMxLCAlZWF4CisJYWRkbAkkMTIsICVlc3AKKwlyZXQKKworV2Ugc2hvdWxkIHVzZSBtb3Ztc2twe3N8ZH0gaW5zdGVhZC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitDb2RlR2VuL1g4Ni92ZWNfYWxpZ24ubGwgdGVzdHMgd2hldGhlciB3ZSBjYW4gdHVybiA0IHNjYWxhciBsb2FkcyBpbnRvIGEgc2luZ2xlCisoYWxpZ25lZCkgdmVjdG9yIGxvYWQuICBUaGlzIGZ1bmN0aW9uYWxpdHkgaGFzIGEgY291cGxlIG9mIHByb2JsZW1zLgorCisxLiBUaGUgY29kZSB0byBpbmZlciBhbGlnbm1lbnQgZnJvbSBsb2FkcyBvZiBnbG9iYWxzIGlzIGluIHRoZSBYODYgYmFja2VuZCwKKyAgIG5vdCB0aGUgZGFnIGNvbWJpbmVyLiAgVGhpcyBpcyBiZWNhdXNlIGRhZ2NvbWJpbmUyIG5lZWRzIHRvIGJlIGFibGUgdG8gc2VlCisgICB0aHJvdWdoIHRoZSBYODZJU0Q6OldyYXBwZXIgbm9kZSwgd2hpY2ggREFHQ29tYmluZSBjYW4ndCByZWFsbHkgZG8uCisyLiBUaGUgY29kZSBmb3IgdHVybmluZyA0IHggbG9hZCBpbnRvIGEgc2luZ2xlIHZlY3RvciBsb2FkIGlzIHRhcmdldCAKKyAgIGluZGVwZW5kZW50IGFuZCBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGRhZyBjb21iaW5lci4KKzMuIFRoZSBjb2RlIGZvciB0dXJuaW5nIDQgeCBsb2FkIGludG8gYSB2ZWN0b3IgbG9hZCBjYW4gb25seSBoYW5kbGUgYSBkaXJlY3QgCisgICBsb2FkIGZyb20gYSBnbG9iYWwgb3IgYSBkaXJlY3QgbG9hZCBmcm9tIHRoZSBzdGFjay4gIEl0IHNob3VsZCBiZSBnZW5lcmFsaXplZAorICAgdG8gaGFuZGxlIGFueSBsb2FkIGZyb20gUCwgUCs0LCBQKzgsIFArMTIsIHdoZXJlIFAgY2FuIGJlIGFueXRoaW5nLgorNC4gVGhlIGFsaWdubWVudCBpbmZlcmVuY2UgY29kZSBjYW5ub3QgaGFuZGxlIGxvYWRzIGZyb20gZ2xvYmFscyBpbiBub24tc3RhdGljCisgICBtb2RlIGJlY2F1c2UgaXQgZG9lc24ndCBsb29rIHRocm91Z2ggdGhlIGV4dHJhIGR5bGQgc3R1YiBsb2FkLiAgSWYgeW91IHRyeQorICAgdmVjX2FsaWduLmxsIHdpdGhvdXQgLXJlbG9jYXRpb24tbW9kZWw9c3RhdGljLCB5b3UnbGwgc2VlIHdoYXQgSSBtZWFuLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIHNob3VsZCBsb3dlciBzdG9yZShmbmVnKGxvYWQgcCksIHEpIGludG8gYW4gaW50ZWdlciBsb2FkK3hvcitzdG9yZSwgd2hpY2gKK2VsaW1pbmF0ZXMgYSBjb25zdGFudCBwb29sIGxvYWQuICBGb3IgZXhhbXBsZSwgY29uc2lkZXI6CisKK2RlZmluZSBpNjQgQGNjb3NmKGZsb2F0ICV6LjAsIGZsb2F0ICV6LjEpIG5vdW53aW5kIHJlYWRvbmx5ICB7CitlbnRyeToKKyAldG1wNiA9IGZzdWIgZmxvYXQgLTAuMDAwMDAwZSswMCwgJXouMQkJOyA8ZmxvYXQ+IFsjdXNlcz0xXQorICV0bXAyMCA9IHRhaWwgY2FsbCBpNjQgQGNjb3NoZiggZmxvYXQgJXRtcDYsIGZsb2F0ICV6LjAgKSBub3Vud2luZCByZWFkb25seQorIHJldCBpNjQgJXRtcDIwCit9CitkZWNsYXJlIGk2NCBAY2Nvc2hmKGZsb2F0ICV6LjAsIGZsb2F0ICV6LjEpIG5vdW53aW5kIHJlYWRvbmx5CisKK1RoaXMgY3VycmVudGx5IGNvbXBpbGVzIHRvOgorCitMQ1BJMV8wOgkJCQkJIyAgPDQgeCBmbG9hdD4KKwkubG9uZwkyMTQ3NDgzNjQ4CSMgZmxvYXQgLTAKKwkubG9uZwkyMTQ3NDgzNjQ4CSMgZmxvYXQgLTAKKwkubG9uZwkyMTQ3NDgzNjQ4CSMgZmxvYXQgLTAKKwkubG9uZwkyMTQ3NDgzNjQ4CSMgZmxvYXQgLTAKK19jY29zZjoKKwlzdWJsCSQxMiwgJWVzcAorCW1vdnNzCTE2KCVlc3ApLCAleG1tMAorCW1vdnNzCSV4bW0wLCA0KCVlc3ApCisJbW92c3MJMjAoJWVzcCksICV4bW0wCisJeG9ycHMJTENQSTFfMCwgJXhtbTAKKwltb3ZzcwkleG1tMCwgKCVlc3ApCisJY2FsbAlMX2Njb3NoZiRzdHViCisJYWRkbAkkMTIsICVlc3AKKwlyZXQKKworTm90ZSB0aGUgbG9hZCBpbnRvIHhtbTAsIHRoZW4geG9yICh0byBuZWdhdGUpLCB0aGVuIHN0b3JlLiAgSW4gUElDIG1vZGUsCit0aGlzIGNvZGUgY29tcHV0ZXMgdGhlIHBpYyBiYXNlIGFuZCBkb2VzIHR3byBsb2FkcyB0byBkbyB0aGUgY29uc3RhbnQgcG9vbCAKK2xvYWQsIHNvIHRoZSBpbXByb3ZlbWVudCBpcyBtdWNoIGJpZ2dlci4KKworVGhlIHRyaWNreSBwYXJ0IGFib3V0IHRoaXMgeGZvcm0gaXMgdGhhdCB0aGUgYXJndW1lbnQgbG9hZC9zdG9yZSBpc24ndCBleHBvc2VkCit1bnRpbCBwb3N0LWxlZ2FsaXplLCBhbmQgYXQgdGhhdCBwb2ludCwgdGhlIGZuZWcgaGFzIGJlZW4gY3VzdG9tIGV4cGFuZGVkIGludG8gCithbiBYODYgZnhvci4gIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGlzIGNhc2UgaW4gdGhlIHg4NiBiYWNrZW5kCitpbnN0ZWFkIG9mIGluIHRhcmdldCBpbmRlcGVuZGVudCBjb2RlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK05vbi1TU0U0IGluc2VydCBpbnRvIDE2IHggaTggaXMgYXRyb2Npb3VzbHkgYmFkLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKzwyIHggaTY0PiBleHRyYWN0IGlzIHN1YnN0YW50aWFsbHkgd29yc2UgdGhhbiA8MiB4IGY2ND4sIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uCitpcyBtZW1vcnkuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworU1NFNCBleHRyYWN0LXRvLW1lbSBvcHMgYXJlbid0IGJlaW5nIHBhdHRlcm4gbWF0Y2hlZCBiZWNhdXNlIG9mIHRoZSBBc3NlcnRaZXh0CitzaXR0aW5nIGJldHdlZW4gdGhlIHRydW5jYXRlIGFuZCB0aGUgZXh0cmFjdC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJTlNFUlRQUyBjYW4gbWF0Y2ggYW55IGluc2VydCAoZXh0cmFjdCwgaW1tMSksIGltbTIgZm9yIDQgeCBmbG9hdCwgYW5kIGluc2VydAorYW55IG51bWJlciBvZiAwLjAgc2ltdWx0YW5lb3VzbHkuICBDdXJyZW50bHkgd2Ugb25seSB1c2UgaXQgZm9yIHNpbXBsZQoraW5zZXJ0aW9ucy4KKworU2VlIGNvbW1lbnRzIGluIExvd2VySU5TRVJUX1ZFQ1RPUl9FTFRfU1NFNC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitPbiBhIHJhbmRvbSBub3RlLCBTU0UyIHNob3VsZCBkZWNsYXJlIGluc2VydC9leHRyYWN0IG9mIDIgeCBmNjQgYXMgbGVnYWwsIG5vdAorQ3VzdG9tLiAgQWxsIGNvbWJpbmF0aW9ucyBvZiBpbnNlcnQvZXh0cmFjdCByZWctcmVnLCByZWctbWVtLCBhbmQgbWVtLXJlZyBhcmUKK2xlZ2FsLCBpdCdsbCBqdXN0IHRha2UgYSBmZXcgZXh0cmEgcGF0dGVybnMgd3JpdHRlbiBpbiB0aGUgLnRkIGZpbGUuCisKK05vdGU6IHRoaXMgaXMgbm90IGEgY29kZSBxdWFsaXR5IGlzc3VlOyB0aGUgY3VzdG9tIGxvd2VyZWQgY29kZSBoYXBwZW5zIHRvIGJlCityaWdodCwgYnV0IHdlIHNob3VsZG4ndCBoYXZlIHRvIGN1c3RvbSBsb3dlciBhbnl0aGluZy4gIFRoaXMgaXMgcHJvYmFibHkgcmVsYXRlZAordG8gPDIgeCBpNjQ+IG9wcyBiZWluZyBzbyBiYWQuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworJ3NlbGVjdCcgb24gdmVjdG9ycyBhbmQgc2NhbGFycyBjb3VsZCBiZSBhIHdob2xlIGxvdCBiZXR0ZXIuICBXZSBjdXJyZW50bHkgCitsb3dlciB0aGVtIHRvIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgT24geDg2LTY0IGZvciBleGFtcGxlLCB3ZSBjb21waWxlIHRoaXM6CisKK2RvdWJsZSB0ZXN0KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkKSB7IHJldHVybiBhPGIgPyBjIDogZDsgfQorCit0bzoKKworX3Rlc3Q6CisJdWNvbWlzZAkleG1tMCwgJXhtbTEKKwlqYQlMQkIxXzIJIyBlbnRyeQorTEJCMV8xOgkjIGVudHJ5CisJbW92YXBkCSV4bW0zLCAleG1tMgorTEJCMV8yOgkjIGVudHJ5CisJbW92YXBkCSV4bW0yLCAleG1tMAorCXJldAorCitpbnN0ZWFkIG9mOgorCitfdGVzdDoKKwljbXBsdHNkCSV4bW0xLCAleG1tMAorCWFuZHBkCSV4bW0wLCAleG1tMgorCWFuZG5wZAkleG1tMywgJXhtbTAKKwlvcnBkCSV4bW0yLCAleG1tMAorCXJldAorCitGb3IgdW5wcmVkaWN0YWJsZSBicmFuY2hlcywgdGhlIGxhdGVyIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQuICBUaGlzIHNob3VsZAoranVzdCBiZSBhIG1hdHRlciBvZiBoYXZpbmcgc2NhbGFyIHNzZSBtYXAgdG8gU0VMRUNUX0NDIGFuZCBjdXN0b20gZXhwYW5kaW5nCitvciBpc2VsaW5nIGl0LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0xMVk0gY3VycmVudGx5IGdlbmVyYXRlcyBzdGFjayByZWFsaWdubWVudCBjb2RlLCB3aGVuIGl0IGlzIG5vdCBuZWNlc3NhcnkKK25lZWRlZC4gVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBuZWVkIHRvIGtub3cgYWJvdXQgc3RhY2sgYWxpZ25tZW50IHRvbyBlYXJseSwKK2JlZm9yZSBSQSBydW5zLgorCitBdCB0aGF0IHBvaW50IHdlIGRvbid0IGtub3csIHdoZXRoZXIgdGhlcmUgd2lsbCBiZSB2ZWN0b3Igc3BpbGwsIG9yIG5vdC4KK1N0YWNrIHJlYWxpZ25tZW50IGxvZ2ljIGlzIG92ZXJseSBjb25zZXJ2YXRpdmUgaGVyZSwgYnV0IG90aGVyd2lzZSB3ZSBjYW4KK3Byb2R1Y2UgdW5hbGlnbmVkIGxvYWRzL3N0b3Jlcy4KKworRml4aW5nIHRoaXMgd2lsbCByZXF1aXJlIHNvbWUgaHVnZSBSQSBjaGFuZ2VzLgorCitUZXN0Y2FzZToKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKwordHlwZWRlZiBzaG9ydCB2U0ludDE2IF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOworCitzdGF0aWMgY29uc3QgdlNJbnQxNiBhID0gey0gMjI3MjUsIC0gMTI4NzMsIC0gMjI3MjUsIC0gMTI4NzMsIC0gMjI3MjUsIC0gMTI4NzMsCistIDIyNzI1LCAtIDEyODczfTs7CisKK3ZTSW50MTYgbWFkZCh2U0ludDE2IGIpCit7CisgICAgcmV0dXJuIF9tbV9tYWRkX2VwaTE2KGEsIGIpOworfQorCitHZW5lcmF0ZWQgY29kZSAoeDg2LTMyLCBsaW51eCk6CittYWRkOgorICAgICAgICBwdXNobCAgICVlYnAKKyAgICAgICAgbW92bCAgICAlZXNwLCAlZWJwCisgICAgICAgIGFuZGwgICAgJC0xNiwgJWVzcAorICAgICAgICBtb3ZhcHMgIC5MQ1BJMV8wLCAleG1tMQorICAgICAgICBwbWFkZHdkICV4bW0xLCAleG1tMAorICAgICAgICBtb3ZsICAgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgICAlZWJwCisgICAgICAgIHJldAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0NvbnNpZGVyOgorI2luY2x1ZGUgPGVtbWludHJpbi5oPiAKK19fbTEyOCBmb28yIChmbG9hdCB4KSB7CisgcmV0dXJuIF9tbV9zZXRfcHMgKDAsIDAsIHgsIDApOworfQorCitJbiB4ODYtMzIgbW9kZSwgd2UgZ2VuZXJhdGUgdGhpcyBzcGlmZnkgY29kZToKKworX2ZvbzI6CisJbW92c3MJNCglZXNwKSwgJXhtbTAKKwlwc2h1ZmQJJDgxLCAleG1tMCwgJXhtbTAKKwlyZXQKKworaW4geDg2LTY0IG1vZGUsIHdlIGdlbmVyYXRlIHRoaXMgY29kZSwgd2hpY2ggY291bGQgYmUgYmV0dGVyOgorCitfZm9vMjoKKwl4b3JwcwkleG1tMSwgJXhtbTEKKwltb3ZzcwkleG1tMCwgJXhtbTEKKwlwc2h1ZmQJJDgxLCAleG1tMSwgJXhtbTAKKwlyZXQKKworSW4gc3NlNCBtb2RlLCB3ZSBjb3VsZCB1c2UgaW5zZXJ0cHMgdG8gbWFrZSBib3RoIGJldHRlci4KKworSGVyZSdzIGFub3RoZXIgdGVzdGNhc2UgdGhhdCBjb3VsZCB1c2UgaW5zZXJ0cHMgW21lbV06CisKKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KK2V4dGVybiBmbG9hdCB4MiwgeDM7CitfX20xMjggZm9vMSAoZmxvYXQgeDEsIGZsb2F0IHg0KSB7CisgcmV0dXJuIF9tbV9zZXRfcHMgKHgyLCB4MSwgeDMsIHg0KTsKK30KKworZ2NjIG1haW5saW5lIGNvbXBpbGVzIGl0IHRvOgorCitmb28xOgorICAgICAgIGluc2VydHBzICAgICAgICAkMHgxMCwgeDIoJXJpcCksICV4bW0wCisgICAgICAgaW5zZXJ0cHMgICAgICAgICQweDEwLCB4MyglcmlwKSwgJXhtbTEKKyAgICAgICBtb3ZhcHMgICV4bW0xLCAleG1tMgorICAgICAgIG1vdmxocHMgJXhtbTAsICV4bW0yCisgICAgICAgbW92YXBzICAleG1tMiwgJXhtbTAKKyAgICAgICByZXQKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBjb21waWxlIHZlY3RvciBtdWx0aXBseS1ieS1jb25zdGFudCBpbnRvIHBvb3IgY29kZToKKworZGVmaW5lIDw0IHggaTMyPiBAZig8NCB4IGkzMj4gJWkpIG5vdW53aW5kICB7CisJJUEgPSBtdWwgPDQgeCBpMzI+ICVpLCA8IGkzMiAxMCwgaTMyIDEwLCBpMzIgMTAsIGkzMiAxMCA+CisJcmV0IDw0IHggaTMyPiAlQQorfQorCitPbiB0YXJnZXRzIHdpdGhvdXQgU1NFNC4xLCB0aGlzIGNvbXBpbGVzIGludG86CisKK0xDUEkxXzA6CQkJCQkjIyAgPDQgeCBpMzI+CisJLmxvbmcJMTAKKwkubG9uZwkxMAorCS5sb25nCTEwCisJLmxvbmcJMTAKKwkudGV4dAorCS5hbGlnbgk0LDB4OTAKKwkuZ2xvYmwJX2YKK19mOgorCXBzaHVmZAkkMywgJXhtbTAsICV4bW0xCisJbW92ZAkleG1tMSwgJWVheAorCWltdWxsCUxDUEkxXzArMTIsICVlYXgKKwltb3ZkCSVlYXgsICV4bW0xCisJcHNodWZkCSQxLCAleG1tMCwgJXhtbTIKKwltb3ZkCSV4bW0yLCAlZWF4CisJaW11bGwJTENQSTFfMCs0LCAlZWF4CisJbW92ZAklZWF4LCAleG1tMgorCXB1bnBja2xkcQkleG1tMSwgJXhtbTIKKwltb3ZkCSV4bW0wLCAlZWF4CisJaW11bGwJTENQSTFfMCwgJWVheAorCW1vdmQJJWVheCwgJXhtbTEKKwltb3ZobHBzCSV4bW0wLCAleG1tMAorCW1vdmQJJXhtbTAsICVlYXgKKwlpbXVsbAlMQ1BJMV8wKzgsICVlYXgKKwltb3ZkCSVlYXgsICV4bW0wCisJcHVucGNrbGRxCSV4bW0wLCAleG1tMQorCW1vdmFwcwkleG1tMSwgJXhtbTAKKwlwdW5wY2tsZHEJJXhtbTIsICV4bW0wCisJcmV0CisKK0l0IHdvdWxkIGJlIGJldHRlciB0byBzeW50aGVzaXplIGludGVnZXIgdmVjdG9yIG11bHRpcGxpY2F0aW9uIGJ5IGNvbnN0YW50cwordXNpbmcgc2hpZnRzIGFuZCBhZGRzLCBwc2xsZCBhbmQgcGFkZGQgaGVyZS4gQW5kIGV2ZW4gb24gdGFyZ2V0cyB3aXRoIFNTRTQuMSwKK3NpbXBsZSBjYXNlcyBzdWNoIGFzIG11bHRpcGxpY2F0aW9uIGJ5IHBvd2VycyBvZiB0d28gd291bGQgYmUgYmV0dGVyIGFzCit2ZWN0b3Igc2hpZnRzIHRoYW4gYXMgbXVsdGlwbGljYXRpb25zLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIGNvbXBpbGUgdGhpczoKKworX19tMTI4aQorZm9vMiAoY2hhciB4KQoreworICByZXR1cm4gX21tX3NldF9lcGk4ICgxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCB4LCAwLCAxLCAwLCAwLCAwLCAwKTsKK30KKworaW50bzoKKwltb3ZsCSQxLCAlZWF4CisJeG9ycHMJJXhtbTAsICV4bW0wCisJcGluc3J3CSQyLCAlZWF4LCAleG1tMAorCW1vdnpibAk0KCVlc3ApLCAlZWF4CisJcGluc3J3CSQzLCAlZWF4LCAleG1tMAorCW1vdmwJJDI1NiwgJWVheAorCXBpbnNydwkkNywgJWVheCwgJXhtbTAKKwlyZXQKKworCitnY2MtNC4yOgorCXN1YmwJJDEyLCAlZXNwCisJbW92emJsCTE2KCVlc3ApLCAlZWF4CisJbW92ZHFhCUxDMCwgJXhtbTAKKwlwaW5zcncJJDMsICVlYXgsICV4bW0wCisJYWRkbAkkMTIsICVlc3AKKwlyZXQKKwkuY29uc3QKKwkuYWxpZ24gNAorTEMwOgorCS53b3JkCTAKKwkud29yZAkwCisJLndvcmQJMQorCS53b3JkCTAKKwkud29yZAkwCisJLndvcmQJMAorCS53b3JkCTAKKwkud29yZAkyNTYKKworV2l0aCBTU0U0LCBpdCBzaG91bGQgYmUKKyAgICAgIG1vdmRxYSAgLkxDMCglcmlwKSwgJXhtbTAKKyAgICAgIHBpbnNyYiAgJDYsICVlZGksICV4bW0wCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2Ugc2hvdWxkIHRyYW5zZm9ybSBhIHNodWZmbGUgb2YgdHdvIHZlY3RvcnMgb2YgY29uc3RhbnRzIGludG8gYSBzaW5nbGUgdmVjdG9yCitvZiBjb25zdGFudHMuIEFsc28sIGluc2VydGVsZW1lbnQgb2YgYSBjb25zdGFudCBpbnRvIGEgdmVjdG9yIG9mIGNvbnN0YW50cworc2hvdWxkIGFsc28gcmVzdWx0IGluIGEgdmVjdG9yIG9mIGNvbnN0YW50cy4gZS5nLiAyMDA4LTA2LTI1LVZlY0lTZWxCdWcubGwuCisKK1dlIGNvbXBpbGVkIGl0IHRvIHNvbWV0aGluZyBob3JyaWJsZToKKworCS5hbGlnbgk0CitMQ1BJMV8xOgkJCQkJIyMgIGZsb2F0CisJLmxvbmcJMTA2NTM1MzIxNgkjIyBmbG9hdCAxCisJLmNvbnN0CisKKwkuYWxpZ24JNAorTENQSTFfMDoJCQkJCSMjICA8NCB4IGZsb2F0PgorCS5zcGFjZQk0CisJLmxvbmcJMTA2NTM1MzIxNgkjIyBmbG9hdCAxCisJLnNwYWNlCTQKKwkubG9uZwkxMDY1MzUzMjE2CSMjIGZsb2F0IDEKKwkudGV4dAorCS5hbGlnbgk0LDB4OTAKKwkuZ2xvYmwJX3QKK190OgorCXhvcnBzCSV4bW0wLCAleG1tMAorCW1vdmhwcwlMQ1BJMV8wLCAleG1tMAorCW1vdnNzCUxDUEkxXzEsICV4bW0xCisJbW92YXBzCSV4bW0wLCAleG1tMgorCXNodWZwcwkkMiwgJXhtbTEsICV4bW0yCisJc2h1ZnBzCSQxMzIsICV4bW0yLCAleG1tMAorCW1vdmFwcwkleG1tMCwgMAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCityZGFyOi8vNTkwNzY0OAorCitUaGlzIGZ1bmN0aW9uOgorCitmbG9hdCBmb28odW5zaWduZWQgY2hhciB4KSB7CisgIHJldHVybiB4OworfQorCitjb21waWxlcyB0byAoeDg2LTMyKToKKworZGVmaW5lIGZsb2F0IEBmb28oaTggemVyb2V4dCAgJXgpIG5vdW53aW5kICB7CisJJXRtcDEyID0gdWl0b2ZwIGk4ICV4IHRvIGZsb2F0CQk7IDxmbG9hdD4gWyN1c2VzPTFdCisJcmV0IGZsb2F0ICV0bXAxMgorfQorCitjb21waWxlcyB0bzoKKworX2ZvbzoKKwlzdWJsCSQ0LCAlZXNwCisJbW92emJsCTgoJWVzcCksICVlYXgKKwljdnRzaTJzcwklZWF4LCAleG1tMAorCW1vdnNzCSV4bW0wLCAoJWVzcCkKKwlmbGRzCSglZXNwKQorCWFkZGwJJDQsICVlc3AKKwlyZXQKKworV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlOgorICBjdnRzaTJzcyA4KCRlc3ApLCAleG1tMAorc2luY2Ugd2Uga25vdyB0aGUgc3RhY2sgc2xvdCBpcyBhbHJlYWR5IHpleHQnZC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitDb25zaWRlciB1c2luZyBtb3ZscHMgaW5zdGVhZCBvZiBtb3ZzZCB0byBpbXBsZW1lbnQgKHNjYWxhcl90b192ZWN0b3IgKGxvYWRmNjQpKQord2hlbiBjb2RlIHNpemUgaXMgY3JpdGljYWwuIG1vdmxwcyBpcyBzbG93ZXIgdGhhbiBtb3ZzZCBvbiBjb3JlMiBidXQgaXQncyBvbmUKK2J5dGUgc2hvcnRlci4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBzaG91bGQgdXNlIGEgZHluYW1pYyBwcm9ncmFtbWluZyBiYXNlZCBhcHByb2FjaCB0byB0ZWxsIHdoZW4gdXNpbmcgRlBTdGFjaworb3BlcmF0aW9ucyBpcyBjaGVhcGVyIHRoYW4gU1NFLiAgU2NpTWFyayBtb250ZWNhcmxvIGNvbnRhaW5zIGNvZGUgbGlrZSB0aGlzCitmb3IgZXhhbXBsZToKKworZG91YmxlIE1vbnRlQ2FybG9fbnVtX2Zsb3BzKGludCBOdW1fc2FtcGxlcykgeworICAgIHJldHVybiAoKGRvdWJsZSkgTnVtX3NhbXBsZXMpKiA0LjA7Cit9CisKK0luIGZwc3RhY2sgbW9kZSwgdGhpcyBjb21waWxlcyBpbnRvOgorCitMQ1BJMV8wOgkJCQkJCisJLmxvbmcJMTA4MjEzMDQzMgkjIyBmbG9hdCA0LjAwMDAwMGUrMDAKK19Nb250ZUNhcmxvX251bV9mbG9wczoKKwlzdWJsCSQ0LCAlZXNwCisJbW92bAk4KCVlc3ApLCAlZWF4CisJbW92bAklZWF4LCAoJWVzcCkKKwlmaWxkbAkoJWVzcCkKKwlmbXVscwlMQ1BJMV8wCisJYWRkbAkkNCwgJWVzcAorCXJldAorICAgICAgICAKK2luIFNTRSBtb2RlLCBpdCBjb21waWxlcyBpbnRvIHNpZ25pZmljYW50bHkgc2xvd2VyIGNvZGU6CisKK19Nb250ZUNhcmxvX251bV9mbG9wczoKKwlzdWJsCSQxMiwgJWVzcAorCWN2dHNpMnNkCTE2KCVlc3ApLCAleG1tMAorCW11bHNkCUxDUEkxXzAsICV4bW0wCisJbW92c2QJJXhtbTAsICglZXNwKQorCWZsZGwJKCVlc3ApCisJYWRkbAkkMTIsICVlc3AKKwlyZXQKKworVGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgaW4gc2NpbWFyayB3aGVyZSB1c2luZyBmcHN0YWNrIGlzIGJldHRlciwgaXQgaXMKK2NoZWFwZXIgdG8gZG8gZmxkMSB0aGFuIGxvYWQgZnJvbSBhIGNvbnN0YW50IHBvb2wgZm9yIGV4YW1wbGUsIHNvCisibG9hZCwgYWRkIDEuMCwgc3RvcmUiIGlzIGJldHRlciBkb25lIGluIHRoZSBmcCBzdGFjaywgZXRjLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZSBYODYgYmFja2VuZCBzaG91bGQgYmUgYWJsZSB0byBpZi1jb252ZXJ0IFNTRSBjb21wYXJpc29ucyBsaWtlICJ1Y29taXNkIiB0bworImNtcHNkIi4gIEZvciBleGFtcGxlLCB0aGlzIGNvZGU6CisKK2RvdWJsZSBkMShkb3VibGUgeCkgeyByZXR1cm4geCA9PSB4ID8geCA6IHggKyB4OyB9CisKK0NvbXBpbGVzIGludG86CisKK19kMToKKwl1Y29taXNkCSV4bW0wLCAleG1tMAorCWpucAlMQkIxXzIKKwlhZGRzZAkleG1tMCwgJXhtbTAKKwlyZXQKK0xCQjFfMjoKKwlyZXQKKworQWxzbywgdGhlICdyZXQncyBzaG91bGQgYmUgc2hhcmVkLiAgVGhpcyBpcyBQUjYwMzIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlc2Ugc2hvdWxkIGNvbXBpbGUgaW50byB0aGUgc2FtZSBjb2RlIChQUjYyMTQpOiBQZXJoYXBzIGluc3Rjb21iaW5lIHNob3VsZAorY2Fub25pY2FsaXplIHRoZSBmb3JtZXIgaW50byB0aGUgbGF0ZXI/CisKK2RlZmluZSBmbG9hdCBAZm9vKGZsb2F0ICV4KSBub3Vud2luZCB7CisgICV0ID0gYml0Y2FzdCBmbG9hdCAleCB0byBpMzIKKyAgJXMgPSBhbmQgaTMyICV0LCAyMTQ3NDgzNjQ3CisgICVkID0gYml0Y2FzdCBpMzIgJXMgdG8gZmxvYXQKKyAgcmV0IGZsb2F0ICVkCit9CisKK2RlY2xhcmUgZmxvYXQgQGZhYnNmKGZsb2F0ICVuKQorZGVmaW5lIGZsb2F0IEBiYXIoZmxvYXQgJXgpIG5vdW53aW5kIHsKKyAgJWQgPSBjYWxsIGZsb2F0IEBmYWJzZihmbG9hdCAleCkKKyAgcmV0IGZsb2F0ICVkCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpcyBJUiAoZnJvbSBQUjYxOTQpOgorCit0YXJnZXQgZGF0YWxheW91dCA9ICJlLXA6NjQ6NjQ6NjQtaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLWk2NDo2NDo2NC1mMzI6MzI6MzItZjY0OjY0OjY0LXY2NDo2NDo2NC12MTI4OjEyODoxMjgtYTA6MDo2NC1zMDo2NDo2NC1mODA6MTI4OjEyOC1uODoxNjozMjo2NCIKK3RhcmdldCB0cmlwbGUgPSAieDg2XzY0LWFwcGxlLWRhcndpbjEwLjAuMCIKKworJTAgPSB0eXBlIHsgZG91YmxlLCBkb3VibGUgfQorJXN0cnVjdC5mbG9hdDMgPSB0eXBlIHsgZmxvYXQsIGZsb2F0LCBmbG9hdCB9CisKK2RlZmluZSB2b2lkIEB0ZXN0KCUwLCAlc3RydWN0LmZsb2F0Myogbm9jYXB0dXJlICVyZXMpIG5vdW53aW5kIG5vaW5saW5lIHNzcCB7CitlbnRyeToKKyAgJXRtcDE4ID0gZXh0cmFjdHZhbHVlICUwICUwLCAwICAgICAgICAgICAgICAgICAgOyA8ZG91YmxlPiBbI3VzZXM9MV0KKyAgJXRtcDE5ID0gYml0Y2FzdCBkb3VibGUgJXRtcDE4IHRvIGk2NCAgICAgICAgICAgOyA8aTY0PiBbI3VzZXM9MV0KKyAgJXRtcDIwID0gemV4dCBpNjQgJXRtcDE5IHRvIGkxMjggICAgICAgICAgICAgICAgOyA8aTEyOD4gWyN1c2VzPTFdCisgICV0bXAxMCA9IGxzaHIgaTEyOCAldG1wMjAsIDMyICAgICAgICAgICAgICAgICAgIDsgPGkxMjg+IFsjdXNlcz0xXQorICAldG1wMTEgPSB0cnVuYyBpMTI4ICV0bXAxMCB0byBpMzIgICAgICAgICAgICAgICA7IDxpMzI+IFsjdXNlcz0xXQorICAldG1wMTIgPSBiaXRjYXN0IGkzMiAldG1wMTEgdG8gZmxvYXQgICAgICAgICAgICA7IDxmbG9hdD4gWyN1c2VzPTFdCisgICV0bXA1ID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LmZsb2F0MyogJXJlcywgaTY0IDAsIGkzMiAxIDsgPGZsb2F0Kj4gWyN1c2VzPTFdCisgIHN0b3JlIGZsb2F0ICV0bXAxMiwgZmxvYXQqICV0bXA1CisgIHJldCB2b2lkCit9CisKK0NvbXBpbGVzIHRvOgorCitfdGVzdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgQHRlc3QKKwltb3ZkCSV4bW0wLCAlcmF4CisJc2hycQkkMzIsICVyYXgKKwltb3ZsCSVlYXgsIDQoJXJkaSkKKwlyZXQKKworVGhpcyB3b3VsZCBiZSBiZXR0ZXIga2VwdCBpbiB0aGUgU1NFIHVuaXQgYnkgdHJlYXRpbmcgWE1NMCBhcyBhIDR4ZmxvYXQgYW5kCitkb2luZyBhIHNodWZmbGUgZnJvbSB2WzFdIHRvIHZbMF0gdGhlbiBhIGZsb2F0IHN0b3JlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK09uIFNTRTQgbWFjaGluZXMsIHdlIGNvbXBpbGUgdGhpcyBjb2RlOgorCitkZWZpbmUgPDIgeCBmbG9hdD4gQHRlc3QyKDwyIHggZmxvYXQ+ICVRLCA8MiB4IGZsb2F0PiAlUiwKKyAgICAgICA8MiB4IGZsb2F0PiAqJVApIG5vdW53aW5kIHsKKyAgJVogPSBmYWRkIDwyIHggZmxvYXQ+ICVRLCAlUgorCisgIHN0b3JlIDwyIHggZmxvYXQ+ICVaLCA8MiB4IGZsb2F0PiAqJVAKKyAgcmV0IDwyIHggZmxvYXQ+ICVaCit9CisKK2ludG86CisKK190ZXN0MjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBAdGVzdDIKKyMjIEJCIzA6CisJaW5zZXJ0cHMJJDAsICV4bW0yLCAleG1tMgorCWluc2VydHBzCSQxNiwgJXhtbTMsICV4bW0yCisJaW5zZXJ0cHMJJDAsICV4bW0wLCAleG1tMworCWluc2VydHBzCSQxNiwgJXhtbTEsICV4bW0zCisJYWRkcHMJJXhtbTIsICV4bW0zCisJbW92cQkleG1tMywgKCVyZGkpCisJbW92YXBzCSV4bW0zLCAleG1tMAorCXBzaHVmZAkkMSwgJXhtbTMsICV4bW0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMga2lsbDogWE1NMTxkZWY+IFhNTTE8a2lsbD4KKwlyZXQKKworVGhlIGluc2VydHBzJ3Mgb2YgJDAgYXJlIHBvaW50bGVzcyBjb21wbGV4IGNvcGllcy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1VTklNUExFTUVOVEVELnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1VTklNUExFTUVOVEVELnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjZjNzVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvUkVBRE1FLVVOSU1QTEVNRU5URUQudHh0CkBAIC0wLDAgKzEsMTQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRlc3RjYXNlcyB0aGF0IGNyYXNoIHRoZSBYODYgYmFja2VuZCBiZWNhdXNlIHRoZXkgYXJlbid0IGltcGxlbWVudGVkCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZXNlIGFyZSBjYXNlcyB3ZSBrbm93IHRoZSBYODYgYmFja2VuZCBkb2Vzbid0IGhhbmRsZS4gIFBhdGNoZXMgYXJlIHdlbGNvbWUKK2FuZCBhcHByZWNpYXRlZCwgYmVjYXVzZSBubyBvbmUgaGFzIHNpZ25lZCB1cCB0byBpbXBsZW1lbnRlZCB0aGVzZSB5ZXQuCitJbXBsZW1lbnRpbmcgdGhlc2Ugd291bGQgYWxsb3cgZWxpbWluYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgaW50cmluc2ljcywKK3doaWNoIHdvdWxkIGJlIGdyZWF0LgorCisxKSB2ZWN0b3Igc2hpZnRzCisyKSB2ZWN0b3IgY29tcGFyaXNvbnMKKzMpIHZlY3RvciBmcDwtPmludCBjb252ZXJzaW9uczogUFIyNjgzLCBQUjI2ODQsIFBSMjY4NSwgUFIyNjg2LCBQUjI2ODgKKzQpIGJpdGNhc3RzIGZyb20gdmVjdG9ycyB0byBzY2FsYXJzOiBQUjI4MDQKKzUpIGxsdm0uYXRvbWljLmNtcC5zd2FwLmkxMjgucDBpMTI4OiBQUjM0NjIKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1YODYtNjQudHh0IGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvUkVBRE1FLVg4Ni02NC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjNGRjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS1YODYtNjQudHh0CkBAIC0wLDAgKzEsMjczIEBACisvLz09PS0gUkVBRE1FX1g4Nl82NC50eHQgLSBOb3RlcyBmb3IgWDg2LTY0IGNvZGUgZ2VuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitBTUQ2NCBPcHRpbWl6YXRpb24gTWFudWFsIDguMiBoYXMgc29tZSBuaWNlIGluZm9ybWF0aW9uIGFib3V0IG9wdGltaXppbmcgaW50ZWdlcgorbXVsdGlwbGljYXRpb24gYnkgYSBjb25zdGFudC4gSG93IG11Y2ggb2YgaXQgYXBwbGllcyB0byBJbnRlbCdzIFg4Ni02NAoraW1wbGVtZW50YXRpb24/IFRoZXJlIGFyZSBkZWZpbml0ZSB0cmFkZS1vZmZzIHRvIGNvbnNpZGVyOiBsYXRlbmN5IHZzLiByZWdpc3RlcgorcHJlc3N1cmUgdnMuIGNvZGUgc2l6ZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitBcmUgd2UgYmV0dGVyIG9mZiB1c2luZyBicmFuY2hlcyBpbnN0ZWFkIG9mIGNtb3ZlIHRvIGltcGxlbWVudCBGUCB0bwordW5zaWduZWQgaTY0PworCitfY29udjoKKwl1Y29taXNzCUxDMCglcmlwKSwgJXhtbTAKKwljdnR0c3Myc2lxCSV4bW0wLCAlcmR4CisJamIJTDMKKwlzdWJzcwlMQzAoJXJpcCksICV4bW0wCisJbW92YWJzcQkkLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICVyYXgKKwljdnR0c3Myc2lxCSV4bW0wLCAlcmR4CisJeG9ycQklcmF4LCAlcmR4CitMMzoKKwltb3ZxCSVyZHgsICVyYXgKKwlyZXQKKworaW5zdGVhZCBvZgorCitfY29udjoKKwltb3ZzcyBMQ1BJMV8wKCVyaXApLCAleG1tMQorCWN2dHRzczJzaXEgJXhtbTAsICVyY3gKKwltb3ZhcHMgJXhtbTAsICV4bW0yCisJc3Vic3MgJXhtbTEsICV4bW0yCisJY3Z0dHNzMnNpcSAleG1tMiwgJXJheAorCW1vdmFic3EgJC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAlcmR4CisJeG9ycSAlcmR4LCAlcmF4CisJdWNvbWlzcyAleG1tMSwgJXhtbTAKKwljbW92YiAlcmN4LCAlcmF4CisJcmV0CisKK1NlZW1zIGxpa2UgdGhlIGpiIGJyYW5jaCBoYXMgaGlnaCBsaWtlbHlob29kIG9mIGJlaW5nIHRha2VuLiBJdCB3b3VsZCBoYXZlCitzYXZlZCBhIGZldyBpbnN0cnVjdGlvbnMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworUG9vciBjb2RlZ2VuOgorCitpbnQgWFsyXTsKK2ludCBiOwordm9pZCB0ZXN0KHZvaWQpIHsKKyAgbWVtc2V0KFgsIGIsIDIqc2l6ZW9mKFhbMF0pKTsKK30KKworbGxjOgorCW1vdnEgX2JAR09UUENSRUwoJXJpcCksICVyYXgKKwltb3Z6YnEgKCVyYXgpLCAlcmF4CisJbW92cSAlcmF4LCAlcmN4CisJc2hscSAkOCwgJXJjeAorCW9ycSAlcmF4LCAlcmN4CisJbW92cSAlcmN4LCAlcmF4CisJc2hscSAkMTYsICVyYXgKKwlvcnEgJXJjeCwgJXJheAorCW1vdnEgJXJheCwgJXJjeAorCXNobHEgJDMyLCAlcmN4CisJbW92cSBfWEBHT1RQQ1JFTCglcmlwKSwgJXJkeAorCW9ycSAlcmF4LCAlcmN4CisJbW92cSAlcmN4LCAoJXJkeCkKKwlyZXQKKworZ2NjOgorCW1vdnEJX2JAR09UUENSRUwoJXJpcCksICVyYXgKKwltb3ZhYnNxCSQ3MjM0MDE3MjgzODA3NjY3MywgJXJkeAorCW1vdnpicQkoJXJheCksICVyYXgKKwlpbXVscQklcmR4LCAlcmF4CisJbW92cQlfWEBHT1RQQ1JFTCglcmlwKSwgJXJkeAorCW1vdnEJJXJheCwgKCVyZHgpCisJcmV0CisKK0FuZCB0aGUgY29kZWdlbiBpcyBldmVuIHdvcnNlIGZvciB0aGUgZm9sbG93aW5nCisoZnJvbSBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMzMTAzKToKKyAgdm9pZCBmaWxsMShjaGFyICpzLCBpbnQgYSkKKyAgeworICAgIF9fYnVpbHRpbl9tZW1zZXQocywgYSwgMTUpOworICB9CisKK0ZvciB0aGlzIHZlcnNpb24sIHdlIGR1cGxpY2F0ZSB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGNvbnN0YW50IHRvIHN0b3JlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0l0J3Mgbm90IHBvc3NpYmxlIHRvIHJlZmVyZW5jZSBBSCwgQkgsIENILCBhbmQgREggcmVnaXN0ZXJzIGluIGFuIGluc3RydWN0aW9uCityZXF1aXJpbmcgUkVYIHByZWZpeC4gSG93ZXZlciwgZGl2YiBhbmQgbXVsYiBib3RoIHByb2R1Y2UgcmVzdWx0cyBpbiBBSC4gSWYgaXNlbAorZW1pdHMgYSBDb3B5RnJvbVJlZyB3aGljaCBnZXRzIHR1cm5lZCBpbnRvIGEgbW92YiBhbmQgdGhhdCBjYW4gYmUgYWxsb2NhdGVkIGEKK3I4YiAtIHIxNWIuCisKK1RvIGdldCBhcm91bmQgdGhpcywgaXNlbCBlbWl0cyBhIENvcHlGcm9tUmVnIGZyb20gQVggYW5kIHRoZW4gcmlnaHQgc2hpZnQgaXQKK2Rvd24gYnkgOCBhbmQgdHJ1bmNhdGUgaXQuIEl0J3Mgbm90IHByZXR0eSBidXQgaXQgd29ya3MuIFdlIG5lZWQgc29tZSByZWdpc3RlcgorYWxsb2NhdGlvbiBtYWdpYyB0byBtYWtlIHRoZSBoYWNrIGdvIGF3YXkgKGUuZy4gcHV0dGluZyBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzCitvbiB0aGUgcmVzdWx0IG9mIHRoZSBtb3ZiKS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGUgeDg2LTY0IEFCSSBmb3IgaGlkZGVuLWFyZ3VtZW50IHN0cnVjdCByZXR1cm5zIHJlcXVpcmVzIHRoYXQgdGhlCitpbmNvbWluZyB2YWx1ZSBvZiAlcmRpIGJlIGNvcGllZCBpbnRvICVyYXggYnkgdGhlIGNhbGxlZSB1cG9uIHJldHVybi4KKworVGhlIGlkZWEgaXMgdGhhdCBpdCBzYXZlcyBjYWxsZXJzIGZyb20gaGF2aW5nIHRvIHJlbWVtYmVyIHRoaXMgdmFsdWUsCit3aGljaCB3b3VsZCBvZnRlbiByZXF1aXJlIGEgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyLiBDYWxsZWVzIHVzdWFsbHkKK25lZWQgdG8ga2VlcCB0aGlzIHZhbHVlIGxpdmUgZm9yIG1vc3Qgb2YgdGhlaXIgYm9keSBhbnl3YXksIHNvIGl0Citkb2Vzbid0IGFkZCBhIHNpZ25pZmljYW50IGJ1cmRlbiBvbiB0aGVtLgorCitXZSBjdXJyZW50bHkgaW1wbGVtZW50IHRoaXMgaW4gY29kZWdlbiwgaG93ZXZlciB0aGlzIGlzIHN1Ym9wdGltYWwKK2JlY2F1c2UgaXQgbWVhbnMgdGhhdCBpdCB3b3VsZCBiZSBxdWl0ZSBhd2t3YXJkIHRvIGltcGxlbWVudCB0aGUKK29wdGltaXphdGlvbiBmb3IgY2FsbGVycy4KKworQSBiZXR0ZXIgaW1wbGVtZW50YXRpb24gd291bGQgYmUgdG8gcmVsYXggdGhlIExMVk0gSVIgcnVsZXMgZm9yIHNyZXQKK2FyZ3VtZW50cyB0byBhbGxvdyBhIGZ1bmN0aW9uIHdpdGggYW4gc3JldCBhcmd1bWVudCB0byBoYXZlIGEgbm9uLXZvaWQKK3JldHVybiB0eXBlLCBhbmQgdG8gaGF2ZSB0aGUgZnJvbnQtZW5kIHRvIHNldCB1cCB0aGUgc3JldCBhcmd1bWVudCB2YWx1ZQorYXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmcm9udC1lbmQgY291bGQgbW9yZSBlYXNpbHkKK2VtaXQgdXNlcyBvZiB0aGUgcmV0dXJuZWQgc3RydWN0IHZhbHVlIHRvIGJlIGluIHRlcm1zIG9mIHRoZSBmdW5jdGlvbidzCitsb3dlcmVkIHJldHVybiB2YWx1ZSwgYW5kIGl0IHdvdWxkIGZyZWUgbm9uLUMgZnJvbnRlbmRzIGZyb20gYQorY29tcGxpY2F0aW9uIG9ubHkgcmVxdWlyZWQgYnkgYSBDLWJhc2VkIEFCSS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBnZXQgYSByZWR1bmRhbnQgemVybyBleHRlbnNpb24gZm9yIGNvZGUgbGlrZSB0aGlzOgorCitpbnQgbWFza1sxMDAwXTsKK2ludCBmb28odW5zaWduZWQgeCkgeworIGlmICh4IDwgMTApCisgICB4ID0geCAqIDQ1OworIGVsc2UKKyAgIHggPSB4ICogNzg7CisgcmV0dXJuIG1hc2tbeF07Cit9CisKK19mb286CitMQkIxXzA6CSMjIGVudHJ5CisJY21wbAkkOSwgJWVkaQorCWpiZQlMQkIxXzMJIyMgYmIKK0xCQjFfMToJIyMgYmIxCisJaW11bGwJJDc4LCAlZWRpLCAlZWF4CitMQkIxXzI6CSMjIGJiMgorCW1vdmwJJWVheCwgJWVheCAgICAgICAgICAgICAgICAgICAgPC0tLS0KKwltb3ZxCV9tYXNrQEdPVFBDUkVMKCVyaXApLCAlcmN4CisJbW92bAkoJXJjeCwlcmF4LDQpLCAlZWF4CisJcmV0CitMQkIxXzM6CSMjIGJiCisJaW11bGwJJDQ1LCAlZWRpLCAlZWF4CisJam1wCUxCQjFfMgkjIyBiYjIKKyAgCitCZWZvcmUgcmVnYWxsb2MsIHdlIGhhdmU6CisKKyAgICAgICAgJXJlZzEwMjU8ZGVmPiA9IElNVUwzMnJyaTggJXJlZzEwMjQsIDQ1LCAlRUZMQUdTPGltcC1kZWY+CisgICAgICAgIEpNUCBtYmI8YmIyLDB4MjAzYWZiMD4KKyAgICBTdWNjZXNzb3JzIGFjY29yZGluZyB0byBDRkc6IDB4MjAzYWZiMCAoIzMpCisKK2JiMTogMHgyMDNhZjYwLCBMTFZNIEJCIEAweDFlMDIzMTAsIElEIzI6CisgICAgUHJlZGVjZXNzb3JzIGFjY29yZGluZyB0byBDRkc6IDB4MjAzYWVjMCAoIzApCisgICAgICAgICVyZWcxMDI2PGRlZj4gPSBJTVVMMzJycmk4ICVyZWcxMDI0LCA3OCwgJUVGTEFHUzxpbXAtZGVmPgorICAgIFN1Y2Nlc3NvcnMgYWNjb3JkaW5nIHRvIENGRzogMHgyMDNhZmIwICgjMykKKworYmIyOiAweDIwM2FmYjAsIExMVk0gQkIgQDB4MWUwMjM0MCwgSUQjMzoKKyAgICBQcmVkZWNlc3NvcnMgYWNjb3JkaW5nIHRvIENGRzogMHgyMDNhZjEwICgjMSkgMHgyMDNhZjYwICgjMikKKyAgICAgICAgJXJlZzEwMjc8ZGVmPiA9IFBISSAlcmVnMTAyNSwgbWJiPGJiLDB4MjAzYWYxMD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXJlZzEwMjYsIG1iYjxiYjEsMHgyMDNhZjYwPgorICAgICAgICAlcmVnMTAyOTxkZWY+ID0gTU9WWlg2NHJyMzIgJXJlZzEwMjcKKworc28gd2UnZCBoYXZlIHRvIGtub3cgdGhhdCBJTVVMMzJycmk4IGxlYXZlcyB0aGUgaGlnaCB3b3JkIHplcm8gZXh0ZW5kZWQgYW5kIHRvCitiZSBhYmxlIHRvIHJlY29nbml6ZSB0aGUgemVybyBleHRlbmQuICBUaGlzIGNvdWxkIGFsc28gcHJlc3VtYWJseSBiZSBpbXBsZW1lbnRlZAoraWYgd2UgaGF2ZSB3aG9sZS1mdW5jdGlvbiBzZWxlY3Rpb25kYWdzLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1Rha2UgdGhlIGZvbGxvd2luZyBDIGNvZGUKKyhmcm9tIGh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDM2NDApOgorCitzdHJ1Y3QgdTEKK3sKKyAgICAgICAgZmxvYXQgeDsKKyAgICAgICAgZmxvYXQgeTsKK307CisKK2Zsb2F0IGZvbyhzdHJ1Y3QgdTEgdSkKK3sKKyAgICAgICAgcmV0dXJuIHUueCArIHUueTsKK30KKworT3B0aW1pemVzIHRvIHRoZSBmb2xsb3dpbmcgSVI6CitkZWZpbmUgZmxvYXQgQGZvbyhkb3VibGUgJXUuMCkgbm91bndpbmQgcmVhZG5vbmUgeworZW50cnk6CisgICV0bXA4ID0gYml0Y2FzdCBkb3VibGUgJXUuMCB0byBpNjQgICAgICAgICAgICAgIDsgPGk2ND4gWyN1c2VzPTJdCisgICV0bXA2ID0gdHJ1bmMgaTY0ICV0bXA4IHRvIGkzMiAgICAgICAgICAgICAgICAgIDsgPGkzMj4gWyN1c2VzPTFdCisgICV0bXA3ID0gYml0Y2FzdCBpMzIgJXRtcDYgdG8gZmxvYXQgICAgICAgICAgICAgIDsgPGZsb2F0PiBbI3VzZXM9MV0KKyAgJXRtcDIgPSBsc2hyIGk2NCAldG1wOCwgMzIgICAgICAgICAgICAgICAgICAgICAgOyA8aTY0PiBbI3VzZXM9MV0KKyAgJXRtcDMgPSB0cnVuYyBpNjQgJXRtcDIgdG8gaTMyICAgICAgICAgICAgICAgICAgOyA8aTMyPiBbI3VzZXM9MV0KKyAgJXRtcDQgPSBiaXRjYXN0IGkzMiAldG1wMyB0byBmbG9hdCAgICAgICAgICAgICAgOyA8ZmxvYXQ+IFsjdXNlcz0xXQorICAlMCA9IGZhZGQgZmxvYXQgJXRtcDcsICV0bXA0ICAgICAgICAgICAgICAgICAgICA7IDxmbG9hdD4gWyN1c2VzPTFdCisgIHJldCBmbG9hdCAlMAorfQorCitBbmQgY3VycmVudCBsbHZtLWdjYy9jbGFuZyBvdXRwdXQ6CisJbW92ZAkleG1tMCwgJXJheAorCW1vdmQJJWVheCwgJXhtbTEKKwlzaHJxCSQzMiwgJXJheAorCW1vdmQJJWVheCwgJXhtbTAKKwlhZGRzcwkleG1tMSwgJXhtbTAKKwlyZXQKKworV2UgcmVhbGx5IHNob3VsZG4ndCBtb3ZlIHRoZSBmbG9hdHMgdG8gUkFYLCBvbmx5IHRvIGltbWVkaWF0ZWx5IG1vdmUgdGhlbQorc3RyYWlnaHQgYmFjayB0byB0aGUgWE1NIHJlZ2lzdGVycy4KKworVGhlcmUgcmVhbGx5IGlzbid0IGFueSBnb29kIHdheSB0byBoYW5kbGUgdGhpcyBwdXJlbHkgaW4gSVIgb3B0aW1pemVyczsgaXQKK2NvdWxkIHBvc3NpYmx5IGJlIGhhbmRsZWQgYnkgY2hhbmdpbmcgdGhlIG91dHB1dCBvZiB0aGUgZnJvbnRlZCwgdGhvdWdoLiAgSXQKK3dvdWxkIGFsc28gYmUgZmVhc2libGUgdG8gYWRkIGEgeDg2LXNwZWNpZmljIERBR0NvbWJpbmUgdG8gb3B0aW1pemUgdGhlCitiaXRjYXN0K3RydW5jKyhsc2hyKyliaXRjYXN0IGNvbWJpbmF0aW9uLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1Rha2UgdGhlIGZvbGxvd2luZyBjb2RlCisoZnJvbSBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM0NjUzKToKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRhYmxlW107Cit1bnNpZ25lZCBsb25nIGZvbyh1bnNpZ25lZCBjaGFyICpwKSB7CisgIHVuc2lnbmVkIGxvbmcgdGFnID0gKnA7CisgIHJldHVybiB0YWJsZVt0YWcgPj4gNF0gKyB0YWJsZVt0YWcgJiAweGZdOworfQorCitDdXJyZW50IGNvZGUgZ2VuZXJhdGVkOgorCW1vdnpibAkoJXJkaSksICVlYXgKKwltb3ZxCSVyYXgsICVyY3gKKwlhbmRxCSQyNDAsICVyY3gKKwlzaHJxCSVyY3gKKwlhbmRxCSQxNSwgJXJheAorCW1vdnEJdGFibGUoLCVyYXgsOCksICVyYXgKKwlhZGRxCXRhYmxlKCVyY3gpLCAlcmF4CisJcmV0CisKK0lzc3VlczoKKzEuIEZpcnN0IG1vdnEgc2hvdWxkIGJlIG1vdmw7IHNhdmVzIGEgYnl0ZS4KKzIuIEJvdGggYW5kcSdzIHNob3VsZCBiZSBhbmRsOyBzYXZlcyBhbm90aGVyIHR3byBieXRlcy4gIEkgdGhpbmsgdGhpcyB3YXMKKyAgIGltcGxlbWVudGVkIGF0IG9uZSBwb2ludCwgYnV0IHN1YnNlcXVlbnRseSByZWdyZXNzZWQuCiszLiBzaHJxIHNob3VsZCBiZSBzaHJsOyBzYXZlcyBhbm90aGVyIGJ5dGUuCis0LiBUaGUgZmlyc3QgYW5kcSBjYW4gYmUgY29tcGxldGVseSBlbGltaW5hdGVkIGJ5IHVzaW5nIGEgc2xpZ2h0bHkgbW9yZQorICAgZXhwZW5zaXZlIGFkZHJlc3NpbmcgbW9kZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitDb25zaWRlciB0aGUgZm9sbG93aW5nIChjb250cml2ZWQgdGVzdGNhc2UsIGJ1dCBjb250YWlucyBjb21tb24gZmFjdG9ycyk6CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KK2ludCB0ZXN0KGludCB4LCAuLi4pIHsKKyAgaW50IHN1bSwgaTsKKyAgdmFfbGlzdCBsOworICB2YV9zdGFydChsLCB4KTsKKyAgZm9yIChpID0gMDsgaSA8IHg7IGkrKykKKyAgICBzdW0gKz0gdmFfYXJnKGwsIGludCk7CisgIHZhX2VuZChsKTsKKyAgcmV0dXJuIHN1bTsKK30KKworVGVzdGNhc2UgZ2l2ZW4gaW4gQyBiZWNhdXNlIGZpeGluZyBpdCB3aWxsIGxpa2VseSBpbnZvbHZlIGNoYW5naW5nIHRoZSBJUgorZ2VuZXJhdGVkIGZvciBpdC4gIFRoZSBwcmltYXJ5IGlzc3VlIHdpdGggdGhlIHJlc3VsdCBpcyB0aGF0IGl0IGRvZXNuJ3QgZG8gYW55CitvZiB0aGUgb3B0aW1pemF0aW9ucyB3aGljaCBhcmUgcG9zc2libGUgaWYgd2Uga25vdyB0aGUgYWRkcmVzcyBvZiBhIHZhX2xpc3QKK2luIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzIG5ldmVyIHRha2VuOgorMS4gV2Ugc2hvdWxkbid0IHNwaWxsIHRoZSBYTU0gcmVnaXN0ZXJzIGJlY2F1c2Ugd2Ugb25seSBjYWxsIHZhX2FyZyB3aXRoICJpbnQiLgorMi4gSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBzY2FsYXJyZXBsIHRoZSB2YV9saXN0LgorMy4gUHJvYmFibHkgb3ZlcmtpbGwsIGJ1dCBpdCdkIGJlIGNvb2wgaWYgd2UgY291bGQgcGVlbCBvZmYgdGhlIGZpcnN0IGZpdmUKK2l0ZXJhdGlvbnMgb2YgdGhlIGxvb3AuCisKK090aGVyIG9wdGltaXphdGlvbnMgaW52b2x2aW5nIGZ1bmN0aW9ucyB3aGljaCB1c2UgdmFfYXJnIG9uIGZsb2F0cyB3aGljaCBkb24ndAoraGF2ZSB0aGUgYWRkcmVzcyBvZiBhIHZhX2xpc3QgdGFrZW46CisxLiBDb252ZXJzZWx5IHRvIHRoZSBhYm92ZSwgd2Ugc2hvdWxkbid0IHNwaWxsIGdlbmVyYWwgcmVnaXN0ZXJzIGlmIHdlIG9ubHkKKyAgIGNhbGwgdmFfYXJnIG9uICJkb3VibGUiLgorMi4gSWYgd2Uga25vdyBub3RoaW5nIG1vcmUgdGhhbiA2NCBiaXRzIHdpZGUgaXMgcmVhZCBmcm9tIHRoZSBYTU0gcmVnaXN0ZXJzLAorICAgd2UgY2FuIGNoYW5nZSB0aGUgc3BpbGxpbmcgY29kZSB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBzdGFjayB1c2VkIGJ5IGhhbGYuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1JFQURNRS50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMzRhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTg2NSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmFuZG9tIGlkZWFzIGZvciB0aGUgWDg2IGJhY2tlbmQuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIHNob3VsZCBhZGQgc3VwcG9ydCBmb3IgdGhlICJtb3ZiZSIgaW5zdHJ1Y3Rpb24sIHdoaWNoIGRvZXMgYSBieXRlLXN3YXBwaW5nCitjb3B5ICgzLWFkZHIgYnN3YXAgKyBtZW1vcnkgc3VwcG9ydD8pICBUaGlzIGlzIGF2YWlsYWJsZSBvbiBBdG9tIHByb2Nlc3NvcnMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQ29kZUdlbi9YODYvbGVhLTMubGw6dGVzdDMgc2hvdWxkIGJlIGEgc2luZ2xlIExFQSwgbm90IGEgc2hpZnQvbW92ZS4gIFRoZSBYODYKK2JhY2tlbmQga25vd3MgaG93IHRvIHRocmVlLWFkZHJlc3NpZnkgdGhpcyBzaGlmdCwgYnV0IGl0IGFwcGVhcnMgdGhlIHJlZ2lzdGVyCithbGxvY2F0b3IgaXNuJ3QgZXZlbiBhc2tpbmcgaXQgdG8gZG8gc28gaW4gdGhpcyBjYXNlLiAgV2Ugc2hvdWxkIGludmVzdGlnYXRlCit3aHkgdGhpcyBpc24ndCBoYXBwZW5pbmcsIGl0IGNvdWxkIGhhdmUgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIG90aGVyIGltcG9ydGFudAorY2FzZXMgZm9yIFg4NiBhcyB3ZWxsLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoaXMgc2hvdWxkIGJlIG9uZSBESVYvSURJViBpbnN0cnVjdGlvbiwgbm90IGEgbGliY2FsbDoKKwordW5zaWduZWQgdGVzdCh1bnNpZ25lZCBsb25nIGxvbmcgWCwgdW5zaWduZWQgWSkgeworICAgICAgICByZXR1cm4gWC9ZOworfQorCitUaGlzIGNhbiBiZSBkb25lIHRyaXZpYWxseSB3aXRoIGEgY3VzdG9tIGxlZ2FsaXplci4gIFdoYXQgYWJvdXQgb3ZlcmZsb3cgCit0aG91Z2g/ICBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE0MjI0CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSW1wcm92ZW1lbnRzIHRvIHRoZSBtdWx0aXBseSAtPiBzaGlmdC9hZGQgYWxnb3JpdGhtOgoraHR0cDovL2djYy5nbnUub3JnL21sL2djYy1wYXRjaGVzLzIwMDQtMDgvbXNnMDE1OTAuaHRtbAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0ltcHJvdmUgY29kZSBsaWtlIHRoaXMgKG9jY3VycyBmYWlybHkgZnJlcXVlbnRseSwgZS5nLiBpbiBMTFZNKToKK2xvbmcgbG9uZyBmb28oaW50IHgpIHsgcmV0dXJuIDFMTCA8PCB4OyB9CisKK2h0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDA0LTA5L21zZzAxMTA5Lmh0bWwKK2h0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDA0LTA5L21zZzAxMTI4Lmh0bWwKK2h0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDA0LTA5L21zZzAxMTM2Lmh0bWwKKworQW5vdGhlciB1c2VmdWwgb25lIHdvdWxkIGJlICB+MFVMTCA+PiBYIGFuZCB+MFVMTCA8PCBYLgorCitPbmUgYmV0dGVyIHNvbHV0aW9uIGZvciAxTEwgPDwgeCBpczoKKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4CisgICAgICAgIHhvcmwgICAgJWVkeCwgJWVkeAorICAgICAgICB0ZXN0YiAgICQzMiwgJWNsCisgICAgICAgIHNldGUgICAgJWFsCisgICAgICAgIHNldG5lICAgJWRsCisgICAgICAgIHNhbGwgICAgJWNsLCAlZWF4CisgICAgICAgIHNhbGwgICAgJWNsLCAlZWR4CisKK0J1dCB0aGF0IHJlcXVpcmVzIGdvb2QgOC1iaXQgc3VicmVnIHN1cHBvcnQuCisKK0Fsc28sIHRoaXMgbWlnaHQgYmUgYmV0dGVyLiAgSXQncyBhbiBleHRyYSBzaGlmdCwgYnV0IGl0J3Mgb25lIGluc3RydWN0aW9uCitzaG9ydGVyLCBhbmQgZG9lc24ndCBzdHJlc3MgOC1iaXQgc3VicmVnIHN1cHBvcnQuCisoRnJvbSBodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwNC0wOS9tc2cwMTE0OC5odG1sLAorYnV0IHdpdGhvdXQgdGhlIHVubmVjZXNzYXJ5IGFuZC4pCisgICAgICAgIG1vdmwgJWVjeCwgJWVheAorICAgICAgICBzaHJsICQ1LCAlZWF4CisgICAgICAgIG1vdmwgJWVheCwgJWVkeAorICAgICAgICB4b3JsICQxLCAlZWR4CisgICAgICAgIHNhbGwgJWNsLCAlZWF4CisgICAgICAgIHNhbGwgJWNsLiAlZWR4CisKKzY0LWJpdCBzaGlmdHMgKGluIGdlbmVyYWwpIGV4cGFuZCB0byByZWFsbHkgYmFkIGNvZGUuICBJbnN0ZWFkIG9mIHVzaW5nCitjbW92cywgd2Ugc2hvdWxkIGV4cGFuZCB0byBhIGNvbmRpdGlvbmFsIGJyYW5jaCBsaWtlIEdDQyBwcm9kdWNlcy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitDb21waWxlIHRoaXM6CitfQm9vbCBmKF9Cb29sIGEpIHsgcmV0dXJuIGEhPTE7IH0KKworaW50bzoKKyAgICAgICAgbW92emJsICAlZGlsLCAlZWF4CisgICAgICAgIHhvcmwgICAgJDEsICVlYXgKKyAgICAgICAgcmV0CisKKyhBbHRob3VnaCBub3RlIHRoYXQgdGhpcyBpc24ndCBhIGxlZ2FsIHdheSB0byBleHByZXNzIHRoZSBjb2RlIHRoYXQgbGx2bS1nY2MKK2N1cnJlbnRseSBnZW5lcmF0ZXMgZm9yIHRoYXQgZnVuY3Rpb24uKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NvbWUgaXNlbCBpZGVhczoKKworMS4gRHluYW1pYyBwcm9ncmFtbWluZyBiYXNlZCBhcHByb2FjaCB3aGVuIGNvbXBpbGUgdGltZSBpZiBub3QgYW4KKyAgIGlzc3VlLgorMi4gQ29kZSBkdXBsaWNhdGlvbiAoYWRkcmVzc2luZyBtb2RlKSBkdXJpbmcgaXNlbC4KKzMuIE90aGVyIGlkZWFzIGZyb20gIlJlZ2lzdGVyLVNlbnNpdGl2ZSBTZWxlY3Rpb24sIER1cGxpY2F0aW9uLCBhbmQKKyAgIFNlcXVlbmNpbmcgb2YgSW5zdHJ1Y3Rpb25zIi4KKzQuIFNjaGVkdWxpbmcgZm9yIHJlZHVjZWQgcmVnaXN0ZXIgcHJlc3N1cmUuICBFLmcuICJNaW5pbXVtIFJlZ2lzdGVyIAorICAgSW5zdHJ1Y3Rpb24gU2VxdWVuY2UgUHJvYmxlbTogUmV2aXNpdGluZyBPcHRpbWFsIENvZGUgR2VuZXJhdGlvbiBmb3IgREFHcyIgCisgICBhbmQgb3RoZXIgcmVsYXRlZCBwYXBlcnMuCisgICBodHRwOi8vY2l0ZXNlZXIuaXN0LnBzdS5lZHUvZ292aW5kYXJhamFuMDFtaW5pbXVtLmh0bWwKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTaG91bGQgd2UgcHJvbW90ZSBpMTYgdG8gaTMyIHRvIGF2b2lkIHBhcnRpYWwgcmVnaXN0ZXIgdXBkYXRlIHN0YWxscz8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitMZWF2ZSBhbnlfZXh0ZW5kIGFzIHBzZXVkbyBpbnN0cnVjdGlvbiBhbmQgaGludCB0byByZWdpc3RlcgorYWxsb2NhdG9yLiBEZWxheSBjb2RlZ2VuIHVudGlsIHBvc3QgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KK05vdGUuIGFueV9leHRlbmQgaXMgbm93IHR1cm5lZCBpbnRvIGFuIElOU0VSVF9TVUJSRUcuIFdlIHN0aWxsIG5lZWQgdG8gdGVhY2gKK3RoZSBjb2FsZXNjZXIgaG93IHRvIGRlYWwgd2l0aCBpdCB0aG91Z2guCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSXQgYXBwZWFycyBpY2MgdXNlIHB1c2ggZm9yIHBhcmFtZXRlciBwYXNzaW5nLiBOZWVkIHRvIGludmVzdGlnYXRlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK09ubHkgdXNlIGluYy9uZWcvbm90IGluc3RydWN0aW9ucyBvbiBwcm9jZXNzb3JzIHdoZXJlIHRoZXkgYXJlIGZhc3RlciB0aGFuCithZGQvc3ViL3hvci4gIFRoZXkgYXJlIHNsb3dlciBvbiB0aGUgUDQgZHVlIHRvIG9ubHkgdXBkYXRpbmcgc29tZSBwcm9jZXNzb3IKK2ZsYWdzLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZSBpbnN0cnVjdGlvbiBzZWxlY3RvciBzb21ldGltZXMgbWlzc2VzIGZvbGRpbmcgYSBsb2FkIGludG8gYSBjb21wYXJlLiAgVGhlCitwYXR0ZXJuIGlzIHdyaXR0ZW4gYXMgKGNtcCByZWcsIChsb2FkIHApKS4gIEJlY2F1c2UgdGhlIGNvbXBhcmUgaXNuJ3QgCitjb21tdXRhdGl2ZSwgaXQgaXMgbm90IG1hdGNoZWQgd2l0aCB0aGUgbG9hZCBvbiBib3RoIHNpZGVzLiAgVGhlIGRhZyBjb21iaW5lcgorc2hvdWxkIGJlIG1hZGUgc21hcnQgZW5vdWdoIHRvIGNhbm5vbmljYWxpemUgdGhlIGxvYWQgaW50byB0aGUgUkhTIG9mIGEgY29tcGFyZQord2hlbiBpdCBjYW4gaW52ZXJ0IHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmUgZm9yIGZyZWUuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSW4gbWFueSBjYXNlcywgTExWTSBnZW5lcmF0ZXMgY29kZSBsaWtlIHRoaXM6CisKK190ZXN0OgorICAgICAgICBtb3ZsIDgoJWVzcCksICVlYXgKKyAgICAgICAgY21wbCAlZWF4LCA0KCVlc3ApCisgICAgICAgIHNldGwgJWFsCisgICAgICAgIG1vdnpibCAlYWwsICVlYXgKKyAgICAgICAgcmV0CisKK29uIHNvbWUgcHJvY2Vzc29ycyAod2hpY2ggb25lcz8pLCBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBkbyB0aGlzOgorCitfdGVzdDoKKyAgICAgICAgbW92bCA4KCVlc3ApLCAlZWJ4CisgICAgICAgIHhvciAgJWVheCwgJWVheAorICAgICAgICBjbXBsICVlYngsIDQoJWVzcCkKKyAgICAgICAgc2V0bCAlYWwKKyAgICAgICAgcmV0CisKK0RvaW5nIHRoaXMgY29ycmVjdGx5IGlzIHRyaWNreSB0aG91Z2gsIGFzIHRoZSB4b3IgY2xvYmJlcnMgdGhlIGZsYWdzLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIHNob3VsZCBnZW5lcmF0ZSBidHMvYnRyL2V0YyBpbnN0cnVjdGlvbnMgb24gdGFyZ2V0cyB3aGVyZSB0aGV5IGFyZSBjaGVhcCBvcgord2hlbiBjb2Rlc2l6ZSBpcyBpbXBvcnRhbnQuICBlLmcuLCBmb3I6CisKK3ZvaWQgc2V0Yml0KGludCAqdGFyZ2V0LCBpbnQgYml0KSB7CisgICAgKnRhcmdldCB8PSAoMSA8PCBiaXQpOworfQordm9pZCBjbGVhcmJpdChpbnQgKnRhcmdldCwgaW50IGJpdCkgeworICAgICp0YXJnZXQgJj0gfigxIDw8IGJpdCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIGZvciBtZW1zZXQgY2hhciosIDEsIDEwOgorCisJbW92bCAkMTY4NDMwMDksIDQoJWVkeCkKKwltb3ZsICQxNjg0MzAwOSwgKCVlZHgpCisJbW92dyAkMjU3LCA4KCVlZHgpCisKK0l0IG1pZ2h0IGJlIGJldHRlciB0byBnZW5lcmF0ZQorCisJbW92bCAkMTY4NDMwMDksICVlYXgKKwltb3ZsICVlYXgsIDQoJWVkeCkKKwltb3ZsICVlYXgsICglZWR4KQorCW1vdncgYWwsIDgoJWVkeCkKKwkKK3doZW4gd2UgY2FuIHNwYXJlIGEgcmVnaXN0ZXIuIEl0IHJlZHVjZXMgY29kZSBzaXplLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0V2YWx1YXRlIHdoYXQgdGhlIGJlc3Qgd2F5IHRvIGNvZGVnZW4gc2RpdiBYLCAoMl5DKSBpcy4gIEZvciBYLzgsIHdlIGN1cnJlbnRseQorZ2V0IHRoaXM6CisKK2RlZmluZSBpMzIgQHRlc3QxKGkzMiAlWCkgeworICAgICVZID0gc2RpdiBpMzIgJVgsIDgKKyAgICByZXQgaTMyICVZCit9CisKK190ZXN0MToKKyAgICAgICAgbW92bCA0KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgJWVheCwgJWVjeAorICAgICAgICBzYXJsICQzMSwgJWVjeAorICAgICAgICBzaHJsICQyOSwgJWVjeAorICAgICAgICBhZGRsICVlY3gsICVlYXgKKyAgICAgICAgc2FybCAkMywgJWVheAorICAgICAgICByZXQKKworR0NDIGtub3dzIHNldmVyYWwgZGlmZmVyZW50IHdheXMgdG8gY29kZWdlbiBpdCwgb25lIG9mIHdoaWNoIGlzIHRoaXM6CisKK190ZXN0MToKKyAgICAgICAgbW92bCAgICA0KCVlc3ApLCAlZWF4CisgICAgICAgIGNtcGwgICAgJC0xLCAlZWF4CisgICAgICAgIGxlYWwgICAgNyglZWF4KSwgJWVjeAorICAgICAgICBjbW92bGUgICVlY3gsICVlYXgKKyAgICAgICAgc2FybCAgICAkMywgJWVheAorICAgICAgICByZXQKKword2hpY2ggaXMgcHJvYmFibHkgc2xvd2VyLCBidXQgaXQncyBpbnRlcmVzdGluZyBhdCBsZWFzdCA6KQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1dlIGFyZSBjdXJyZW50bHkgbG93ZXJpbmcgbGFyZ2UgKDFNQispIG1lbW1vdmUvbWVtY3B5IHRvIHJlcC9zdG9zbCBhbmQgcmVwL21vdnNsCitXZSBzaG91bGQgbGVhdmUgdGhlc2UgYXMgbGliY2FsbHMgZm9yIGV2ZXJ5dGhpbmcgb3ZlciBhIG11Y2ggbG93ZXIgdGhyZXNob2xkLAorc2luY2UgbGliYyBpcyBoYW5kIHR1bmVkIGZvciBtZWRpdW0gYW5kIGxhcmdlIG1lbSBvcHMgKGF2b2lkaW5nIFJGTyBmb3IgbGFyZ2UKK3N0b3JlcywgVExCIHByZWhlYXRpbmcsIGV0YykKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitPcHRpbWl6ZSB0aGlzIGludG8gc29tZXRoaW5nIHJlYXNvbmFibGU6CisgeCAqIGNvcHlzaWduKDEuMCwgeSkgKiBjb3B5c2lnbigxLjAsIHopCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworT3B0aW1pemUgY29weXNpZ24oeCwgKnkpIHRvIHVzZSBhbiBpbnRlZ2VyIGxvYWQgZnJvbSB5LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZSBmb2xsb3dpbmcgdGVzdHMgcGVyZm9ybSB3b3JzZSB3aXRoIExTUjoKKworbGFtYmRhLCBzaW9kLCBvcHRpbWl6ZXItZXZhbCwgYWNrZXJtYW5uLCBoYXNoMiwgbmVzdGVkbG9vcCwgc3RyY2F0LCBhbmQgVHJlZXNvci4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitBZGRpbmcgdG8gdGhlIGxpc3Qgb2YgY21wIC8gdGVzdCBwb29yIGNvZGVnZW4gaXNzdWVzOgorCitpbnQgdGVzdChfX20xMjggKkEsIF9fbTEyOCAqQikgeworICBpZiAoX21tX2NvbWlnZV9zcygqQSwgKkIpKQorICAgIHJldHVybiAzOworICBlbHNlCisgICAgcmV0dXJuIDQ7Cit9CisKK190ZXN0OgorCW1vdmwgOCglZXNwKSwgJWVheAorCW1vdmFwcyAoJWVheCksICV4bW0wCisJbW92bCA0KCVlc3ApLCAlZWF4CisJbW92YXBzICglZWF4KSwgJXhtbTEKKwljb21pc3MgJXhtbTAsICV4bW0xCisJc2V0YWUgJWFsCisJbW92emJsICVhbCwgJWVjeAorCW1vdmwgJDMsICVlYXgKKwltb3ZsICQ0LCAlZWR4CisJY21wbCAkMCwgJWVjeAorCWNtb3ZlICVlZHgsICVlYXgKKwlyZXQKKworTm90ZSB0aGUgc2V0YWUsIG1vdnpibCwgY21wbCwgY21vdmUgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgY21vdmFlLiBUaGVyZQorYXJlIGEgbnVtYmVyIG9mIGlzc3Vlcy4gMSkgV2UgYXJlIGludHJvZHVjaW5nIGEgc2V0Y2MgYmV0d2VlbiB0aGUgcmVzdWx0IG9mIHRoZQoraW50cmlzaWMgY2FsbCBhbmQgc2VsZWN0LiAyKSBUaGUgaW50cmluc2ljIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBpMzIgdmFsdWUKK3NvIGEgYW55IGV4dGVuZCAod2hpY2ggYmVjb21lcyBhIHplcm8gZXh0ZW5kKSBpcyBhZGRlZC4KKworV2UgcHJvYmFibHkgbmVlZCBzb21lIGtpbmQgb2YgdGFyZ2V0IERBRyBjb21iaW5lIGhvb2sgdG8gZml4IHRoaXMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2UgZ2VuZXJhdGUgc2lnbmlmaWNhbnRseSB3b3JzZSBjb2RlIGZvciB0aGlzIHRoYW4gR0NDOgoraHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yMTE1MAoraHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL2F0dGFjaG1lbnQuY2dpP2lkPTg3MDEKKworVGhlcmUgaXMgYWxzbyBvbmUgY2FzZSB3ZSBkbyB3b3JzZSBvbiBQUEMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworRm9yIHRoaXM6CisKK2ludCB0ZXN0KGludCBhKQoreworICByZXR1cm4gYSAqIDM7Cit9CisKK1dlIGN1cnJlbnRseSBlbWl0cworCWltdWxsICQzLCA0KCVlc3ApLCAlZWF4CisKK1BlcmhhcHMgdGhpcyBpcyB3aGF0IHdlIHJlYWxseSBzaG91bGQgZ2VuZXJhdGUgaXM/IElzIGltdWxsIHRocmVlIG9yIGZvdXIKK2N5Y2xlcz8gTm90ZTogSUNDIGdlbmVyYXRlcyB0aGlzOgorCW1vdmwJNCglZXNwKSwgJWVheAorCWxlYWwJKCVlYXgsJWVheCwyKSwgJWVheAorCitUaGUgY3VycmVudCBpbnN0cnVjdGlvbiBwcmlvcml0eSBpcyBiYXNlZCBvbiBwYXR0ZXJuIGNvbXBsZXhpdHkuIFRoZSBmb3JtZXIgaXMKK21vcmUgImNvbXBsZXgiIGJlY2F1c2UgaXQgZm9sZHMgYSBsb2FkIHNvIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgZW1pdHRlZC4KKworUGVyaGFwcyB3ZSBzaG91bGQgdXNlIEFkZGVkQ29tcGxleGl0eSB0byBnaXZlIExFQTMyciBhIGhpZ2hlciBwcmlvcml0eT8gV2UKK3Nob3VsZCBhbHdheXMgdHJ5IHRvIG1hdGNoIExFQSBmaXJzdCBzaW5jZSB0aGUgTEVBIG1hdGNoaW5nIGNvZGUgZG9lcyBzb21lCitlc3RpbWF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgbWF0Y2ggaXMgcHJvZml0YWJsZS4KKworSG93ZXZlciwgaWYgd2UgY2FyZSBtb3JlIGFib3V0IGNvZGUgc2l6ZSwgdGhlbiBpbXVsbCBpcyBiZXR0ZXIuIEl0J3MgdHdvIGJ5dGVzCitzaG9ydGVyIHRoYW4gbW92bCArIGxlYWwuCisKK09uIGEgUGVudGl1bSBNLCBib3RoIHZhcmlhbnRzIGhhdmUgdGhlIHNhbWUgY2hhcmFjdGVyaXN0aWNzIHdpdGggcmVnYXJkCit0byB0aHJvdWdocHV0OyBob3dldmVyLCB0aGUgbXVsdGlwbGljYXRpb24gaGFzIGEgbGF0ZW5jeSBvZiBmb3VyIGN5Y2xlcywgYXMKK29wcG9zZWQgdG8gdHdvIGN5Y2xlcyBmb3IgdGhlIG1vdmwrbGVhIHZhcmlhbnQuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworX19idWlsdGluX2ZmcyBjb2RlZ2VuIGlzIG1lc3N5LgorCitpbnQgZmZzXyh1bnNpZ25lZCBYKSB7IHJldHVybiBfX2J1aWx0aW5fZmZzKFgpOyB9CisKK2xsdm0gcHJvZHVjZXM6CitmZnNfOgorICAgICAgICBtb3ZsICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgYnNmbCAgICAlZWN4LCAlZWF4CisgICAgICAgIG1vdmwgICAgJDMyLCAlZWR4CisgICAgICAgIGNtb3ZlICAgJWVkeCwgJWVheAorICAgICAgICBpbmNsICAgICVlYXgKKyAgICAgICAgeG9ybCAgICAlZWR4LCAlZWR4CisgICAgICAgIHRlc3RsICAgJWVjeCwgJWVjeAorICAgICAgICBjbW92ZSAgICVlZHgsICVlYXgKKyAgICAgICAgcmV0CisKK3ZzIGdjYzoKKworX2Zmc186CisgICAgICAgIG1vdmwgICAgJC0xLCAlZWR4CisgICAgICAgIGJzZmwgICAgNCglZXNwKSwgJWVheAorICAgICAgICBjbW92ZSAgICVlZHgsICVlYXgKKyAgICAgICAgYWRkbCAgICAkMSwgJWVheAorICAgICAgICByZXQKKworQW5vdGhlciBleGFtcGxlIG9mIF9fYnVpbHRpbl9mZnMgKHVzZSBwcmVkc2ltcGxpZnkgdG8gZWxpbWluYXRlIGEgc2VsZWN0KToKKworaW50IGZvbyAodW5zaWduZWQgbG9uZyBqKSB7CisgIGlmIChqKQorICAgIHJldHVybiBfX2J1aWx0aW5fZmZzIChqKSAtIDE7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJdCBhcHBlYXJzIGdjYyBwbGFjZSBzdHJpbmcgZGF0YSB3aXRoIGxpbmtvbmNlIGxpbmthZ2UgaW4KKy5zZWN0aW9uIF9fVEVYVCxfX2NvbnN0X2NvYWwsY29hbGVzY2VkIGluc3RlYWQgb2YKKy5zZWN0aW9uIF9fREFUQSxfX2NvbnN0X2NvYWwsY29hbGVzY2VkLgorVGFrZSBhIGxvb2sgYXQgZGFyd2luLmgsIHRoZXJlIGFyZSBvdGhlciBEYXJ3aW4gYXNzZW1ibGVyIGRpcmVjdGl2ZXMgdGhhdCB3ZQorZG8gbm90IG1ha2UgdXNlIG9mLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZmluZSBpMzIgQGZvbyhpMzIqICVhLCBpMzIgJXQpIHsKK2VudHJ5OgorCWJyIGxhYmVsICVjb25kX3RydWUKKworY29uZF90cnVlOgkJOyBwcmVkcyA9ICVjb25kX3RydWUsICVlbnRyeQorCSV4LjAuMCA9IHBoaSBpMzIgWyAwLCAlZW50cnkgXSwgWyAldG1wOSwgJWNvbmRfdHJ1ZSBdCQk7IDxpMzI+IFsjdXNlcz0zXQorCSV0X2FkZHIuMC4wID0gcGhpIGkzMiBbICV0LCAlZW50cnkgXSwgWyAldG1wNywgJWNvbmRfdHJ1ZSBdCQk7IDxpMzI+IFsjdXNlcz0xXQorCSV0bXAyID0gZ2V0ZWxlbWVudHB0ciBpMzIqICVhLCBpMzIgJXguMC4wCQk7IDxpMzIqPiBbI3VzZXM9MV0KKwkldG1wMyA9IGxvYWQgaTMyKiAldG1wMgkJOyA8aTMyPiBbI3VzZXM9MV0KKwkldG1wNSA9IGFkZCBpMzIgJXRfYWRkci4wLjAsICV4LjAuMAkJOyA8aTMyPiBbI3VzZXM9MV0KKwkldG1wNyA9IGFkZCBpMzIgJXRtcDUsICV0bXAzCQk7IDxpMzI+IFsjdXNlcz0yXQorCSV0bXA5ID0gYWRkIGkzMiAleC4wLjAsIDEJCTsgPGkzMj4gWyN1c2VzPTJdCisJJXRtcCA9IGljbXAgc2d0IGkzMiAldG1wOSwgMzkJCTsgPGkxPiBbI3VzZXM9MV0KKwliciBpMSAldG1wLCBsYWJlbCAlYmIxMiwgbGFiZWwgJWNvbmRfdHJ1ZQorCitiYjEyOgkJOyBwcmVkcyA9ICVjb25kX3RydWUKKwlyZXQgaTMyICV0bXA3Cit9CitpcyBwZXNzaW1pemVkIGJ5IC1sb29wLXJlZHVjZSBhbmQgLWluZHZhcnMKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit1MzIgdG8gZmxvYXQgY29udmVyc2lvbiBpbXByb3ZlbWVudDoKKworZmxvYXQgdWludDMyXzJfZmxvYXQoIHVuc2lnbmVkIHUgKSB7CisgIGZsb2F0IGZsID0gKGludCkgKHUgJiAweGZmZmYpOworICBmbG9hdCBmaCA9IChpbnQpICh1ID4+IDE2KTsKKyAgZmggKj0gMHgxLjBwMTZmOworICByZXR1cm4gZmggKyBmbDsKK30KKworMDAwMDAwMDAgICAgICAgIHN1YmwgICAgJDB4MDQsJWVzcAorMDAwMDAwMDMgICAgICAgIG1vdmwgICAgMHgwOCglZXNwLDEpLCVlYXgKKzAwMDAwMDA3ICAgICAgICBtb3ZsICAgICVlYXgsJWVjeAorMDAwMDAwMDkgICAgICAgIHNocmwgICAgJDB4MTAsJWVjeAorMDAwMDAwMGMgICAgICAgIGN2dHNpMnNzICAgICAgICAlZWN4LCV4bW0wCiswMDAwMDAxMCAgICAgICAgYW5kbCAgICAkMHgwMDAwZmZmZiwlZWF4CiswMDAwMDAxNSAgICAgICAgY3Z0c2kyc3MgICAgICAgICVlYXgsJXhtbTEKKzAwMDAwMDE5ICAgICAgICBtdWxzcyAgIDB4MDAwMDAwNzgsJXhtbTAKKzAwMDAwMDIxICAgICAgICBhZGRzcyAgICV4bW0xLCV4bW0wCiswMDAwMDAyNSAgICAgICAgbW92c3MgICAleG1tMCwoJWVzcCwxKQorMDAwMDAwMmEgICAgICAgIGZsZHMgICAgKCVlc3AsMSkKKzAwMDAwMDJkICAgICAgICBhZGRsICAgICQweDA0LCVlc3AKKzAwMDAwMDMwICAgICAgICByZXQKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXaGVuIHVzaW5nIGZhc3RjYyBhYmksIGFsaWduIHN0YWNrIHNsb3Qgb2YgYXJndW1lbnQgb2YgdHlwZSBkb3VibGUgb24gOCBieXRlCitib3VuZGFyeSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0NvZGVnZW46CisKK2ludCBmKGludCBhLCBpbnQgYikgeworICBpZiAoYSA9PSA0IHx8IGEgPT0gNikKKyAgICBiKys7CisgIHJldHVybiBiOworfQorCisKK2FzOgorCitvciBlYXgsIDIKK2NtcCBlYXgsIDYKK2p6IGxhYmVsCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworR0NDJ3MgaXg4Nl9leHBhbmRfaW50X21vdmNjIGZ1bmN0aW9uIChpbiBpMzg2LmMpIGhhcyBhIHRvbiBvZiBpbnRlcmVzdGluZworc2ltcGxpZmljYXRpb25zIGZvciBpbnRlZ2VyICJ4IGNtcCB5ID8gYSA6IGIiLiAgRm9yIGV4YW1wbGUsIGluc3RlYWQgb2Y6CisKK2ludCBHOwordm9pZCBmKGludCBYLCBpbnQgWSkgeworICBHID0gWCA8IDAgPyAxNCA6IDEzOworfQorCitjb21waWxpbmcgdG86CisKK19mOgorICAgICAgICBtb3ZsICQxNCwgJWVheAorICAgICAgICBtb3ZsICQxMywgJWVjeAorICAgICAgICBtb3ZsIDQoJWVzcCksICVlZHgKKyAgICAgICAgdGVzdGwgJWVkeCwgJWVkeAorICAgICAgICBjbW92bCAlZWF4LCAlZWN4CisgICAgICAgIG1vdmwgJWVjeCwgX0cKKyAgICAgICAgcmV0CisKK2l0IGNvdWxkIGJlOgorX2Y6CisgICAgICAgIG1vdmwgICAgNCglZXNwKSwgJWVheAorICAgICAgICBzYXJsICAgICQzMSwgJWVheAorICAgICAgICBub3RsICAgICVlYXgKKyAgICAgICAgYWRkbCAgICAkMTQsICVlYXgKKyAgICAgICAgbW92bCAgICAlZWF4LCBfRworICAgICAgICByZXQKKworZXRjLgorCitBbm90aGVyIGlzOgoraW50IHVzZXNiYih1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IGIpIHsKKyAgICAgICByZXR1cm4gKGEgPCBiID8gLTEgOiAwKTsKK30KK3RvOgorX3VzZXNiYjoKKwltb3ZsCTgoJWVzcCksICVlYXgKKwljbXBsCSVlYXgsIDQoJWVzcCkKKwlzYmJsCSVlYXgsICVlYXgKKwlyZXQKKworaW5zdGVhZCBvZjoKK191c2VzYmI6CisJeG9ybAklZWF4LCAlZWF4CisJbW92bAk4KCVlc3ApLCAlZWN4CisJY21wbAklZWN4LCA0KCVlc3ApCisJbW92bAkkNDI5NDk2NzI5NSwgJWVjeAorCWNtb3ZiCSVlY3gsICVlYXgKKwlyZXQKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitDb25zaWRlciB0aGUgZXhwYW5zaW9uIG9mOgorCitkZWZpbmUgaTMyIEB0ZXN0MyhpMzIgJVgpIHsKKyAgICAgICAgJXRtcDEgPSB1cmVtIGkzMiAlWCwgMjU1CisgICAgICAgIHJldCBpMzIgJXRtcDEKK30KKworQ3VycmVudGx5IGl0IGNvbXBpbGVzIHRvOgorCisuLi4KKyAgICAgICAgbW92bCAkMjE1NTkwNTE1MywgJWVjeAorICAgICAgICBtb3ZsIDgoJWVzcCksICVlc2kKKyAgICAgICAgbW92bCAlZXNpLCAlZWF4CisgICAgICAgIG11bGwgJWVjeAorLi4uCisKK1RoaXMgY291bGQgYmUgInJlYXNzb2NpYXRlZCIgaW50bzoKKworICAgICAgICBtb3ZsICQyMTU1OTA1MTUzLCAlZWF4CisgICAgICAgIG1vdmwgOCglZXNwKSwgJWVjeAorICAgICAgICBtdWxsICVlY3gKKwordG8gYXZvaWQgdGhlIGNvcHkuICBJbiBmYWN0LCB0aGUgZXhpc3RpbmcgdHdvLWFkZHJlc3Mgc3R1ZmYgd291bGQgZG8gdGhpcworZXhjZXB0IHRoYXQgbXVsIGlzbid0IGEgY29tbXV0YXRpdmUgMi1hZGRyIGluc3RydWN0aW9uLiAgSSBndWVzcyB0aGlzIGhhcwordG8gYmUgZG9uZSBhdCBpc2VsIHRpbWUgYmFzZWQgb24gdGhlICN1c2VzIHRvIG11bD8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNYWtlIHN1cmUgdGhlIGluc3RydWN0aW9uIHdoaWNoIHN0YXJ0cyBhIGxvb3AgZG9lcyBub3QgY3Jvc3MgYSBjYWNoZWxpbmUKK2JvdW5kYXJ5LiBUaGlzIHJlcXVpcmVzIGtub3duaW5nIHRoZSBleGFjdCBsZW5ndGggb2YgZWFjaCBtYWNoaW5lIGluc3RydWN0aW9uLgorVGhhdCBpcyBzb21ld2hhdCBjb21wbGljYXRlZCwgYnV0IGRvYWJsZS4gRXhhbXBsZSAyNTYuYnppcDI6CisKK0luIHRoZSBuZXcgdHJhY2UsIHRoZSBob3QgbG9vcCBoYXMgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggY3Jvc3NlcyBhIGNhY2hlbGluZQorYm91bmRhcnkuICBJbiBhZGRpdGlvbiB0byBwb3RlbnRpYWwgY2FjaGUgbWlzc2VzLCB0aGlzIGNhbid0IGhlbHAgZGVjb2RpbmcgYXMgSQoraW1hZ2luZSB0aGVyZSBoYXMgdG8gYmUgc29tZSBraW5kIG9mIGNvbXBsaWNhdGVkIGRlY29kZXIgcmVzZXQgYW5kIHJlYWxpZ25tZW50Cit0byBncmFiIHRoZSBieXRlcyBmcm9tIHRoZSBuZXh0IGNhY2hlbGluZS4KKworNTMyICA1MzIgMHgzY2ZjIG1vdmIgICAgICgxODA5KCVlc3AsICVlc2kpLCAlYmwgICA8PDwtLS0gc3BhbnMgMiA2NCBieXRlIGxpbmVzCis5NDIgIDk0MiAweDNkMDMgbW92bCAgICAgJWRoLCAoMTgwOSglZXNwLCAlZXNpKQorOTM3ICA5MzcgMHgzZDBhIGluY2wgICAgICVlc2kKKzMgICAgMyAgIDB4M2QwYiBjbXBiICAgICAlYmwsICVkbAorMjcgICAyNyAgMHgzZDBkIGpueiAgICAgIDB4MDAwMDYyZGIgPG1haW4rMTE3MDc+CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworSW4gYzk5IG1vZGUsIHRoZSBwcmVwcm9jZXNzb3IgZG9lc24ndCBsaWtlIGFzc2VtYmx5IGNvbW1lbnRzIGxpa2UgI1RSVU5DQVRFLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoaXMgY291bGQgYmUgYSBzaW5nbGUgMTYtYml0IGxvYWQuCisKK2ludCBmKGNoYXIgKnApIHsKKyAgICBpZiAoKHBbMF0gPT0gMSkgJiAocFsxXSA9PSAyKSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2Ugc2hvdWxkIGlubGluZSBscmludGYgYW5kIHByb2JhYmx5IG90aGVyIGxpYmMgZnVuY3Rpb25zLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1VzZSB0aGUgRkxBR1MgdmFsdWVzIGZyb20gYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgbW9yZS4gIEZvciBleGFtcGxlLCBjb21waWxlOgorCitpbnQgYWRkX3pmKGludCAqeCwgaW50IHksIGludCBhLCBpbnQgYikgeworICAgICBpZiAoKCp4ICs9IHkpID09IDApCisgICAgICAgICAgcmV0dXJuIGE7CisgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gYjsKK30KKwordG86CisgICAgICAgYWRkbCAgICAlZXNpLCAoJXJkaSkKKyAgICAgICBtb3ZsICAgICVlZHgsICVlYXgKKyAgICAgICBjbW92bmUgICVlY3gsICVlYXgKKyAgICAgICByZXQKK2luc3RlYWQgb2Y6CisKK19hZGRfemY6CisgICAgICAgIGFkZGwgKCVyZGkpLCAlZXNpCisgICAgICAgIG1vdmwgJWVzaSwgKCVyZGkpCisgICAgICAgIHRlc3RsICVlc2ksICVlc2kKKyAgICAgICAgY21vdmUgJWVkeCwgJWVjeAorICAgICAgICBtb3ZsICVlY3gsICVlYXgKKyAgICAgICAgcmV0CisKK0FzIGFub3RoZXIgZXhhbXBsZSwgY29tcGlsZSBmdW5jdGlvbiBmMiBpbiB0ZXN0L0NvZGVHZW4vWDg2L2NtcC10ZXN0LmxsCit3aXRob3V0IGEgdGVzdCBpbnN0cnVjdGlvbi4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGVzZSB0d28gZnVuY3Rpb25zIGhhdmUgaWRlbnRpY2FsIGVmZmVjdHM6CisKK3Vuc2lnbmVkIGludCBmKHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgbikgeysraTsgaWYgKGkgPT0gbikgKytpOyByZXR1cm4gaTt9Cit1bnNpZ25lZCBpbnQgZjIodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBuKSB7KytpOyBpICs9IGkgPT0gbjsgcmV0dXJuIGk7fQorCitXZSBjdXJyZW50bHkgY29tcGlsZSB0aGVtIHRvOgorCitfZjoKKyAgICAgICAgbW92bCA0KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgJWVheCwgJWVjeAorICAgICAgICBpbmNsICVlY3gKKyAgICAgICAgbW92bCA4KCVlc3ApLCAlZWR4CisgICAgICAgIGNtcGwgJWVkeCwgJWVjeAorICAgICAgICBqbmUgTEJCMV8yICAgICAgI1VuaWZpZWRSZXR1cm5CbG9jaworTEJCMV8xOiAjY29uZF90cnVlCisgICAgICAgIGFkZGwgJDIsICVlYXgKKyAgICAgICAgcmV0CitMQkIxXzI6ICNVbmlmaWVkUmV0dXJuQmxvY2sKKyAgICAgICAgbW92bCAlZWN4LCAlZWF4CisgICAgICAgIHJldAorX2YyOgorICAgICAgICBtb3ZsIDQoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAlZWF4LCAlZWN4CisgICAgICAgIGluY2wgJWVjeAorICAgICAgICBjbXBsIDgoJWVzcCksICVlY3gKKyAgICAgICAgc2V0ZSAlY2wKKyAgICAgICAgbW92emJsICVjbCwgJWVjeAorICAgICAgICBsZWFsIDEoJWVjeCwlZWF4KSwgJWVheAorICAgICAgICByZXQKKworYm90aCBvZiB3aGljaCBhcmUgaW5mZXJpb3IgdG8gR0NDJ3M6CisKK19mOgorICAgICAgICBtb3ZsICAgIDQoJWVzcCksICVlZHgKKyAgICAgICAgbGVhbCAgICAxKCVlZHgpLCAlZWF4CisgICAgICAgIGFkZGwgICAgJDIsICVlZHgKKyAgICAgICAgY21wbCAgICA4KCVlc3ApLCAlZWF4CisgICAgICAgIGNtb3ZlICAgJWVkeCwgJWVheAorICAgICAgICByZXQKK19mMjoKKyAgICAgICAgbW92bCAgICA0KCVlc3ApLCAlZWF4CisgICAgICAgIGFkZGwgICAgJDEsICVlYXgKKyAgICAgICAgeG9ybCAgICAlZWR4LCAlZWR4CisgICAgICAgIGNtcGwgICAgOCglZXNwKSwgJWVheAorICAgICAgICBzZXRlICAgICVkbAorICAgICAgICBhZGRsICAgICVlZHgsICVlYXgKKyAgICAgICAgcmV0CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpcyBjb2RlOgorCit2b2lkIHRlc3QoaW50IFgpIHsKKyAgaWYgKFgpIGFib3J0KCk7Cit9CisKK2lzIGN1cnJlbnRseSBjb21waWxlZCB0bzoKKworX3Rlc3Q6CisgICAgICAgIHN1YmwgJDEyLCAlZXNwCisgICAgICAgIGNtcGwgJDAsIDE2KCVlc3ApCisgICAgICAgIGpuZSBMQkIxXzEKKyAgICAgICAgYWRkbCAkMTIsICVlc3AKKyAgICAgICAgcmV0CitMQkIxXzE6CisgICAgICAgIGNhbGwgTF9hYm9ydCRzdHViCisKK0l0IHdvdWxkIGJlIGJldHRlciB0byBwcm9kdWNlOgorCitfdGVzdDoKKyAgICAgICAgc3VibCAkMTIsICVlc3AKKyAgICAgICAgY21wbCAkMCwgMTYoJWVzcCkKKyAgICAgICAgam5lIExfYWJvcnQkc3R1YgorICAgICAgICBhZGRsICQxMiwgJWVzcAorICAgICAgICByZXQKKworVGhpcyBjYW4gYmUgYXBwbGllZCB0byBhbnkgbm8tcmV0dXJuIGZ1bmN0aW9uIGNhbGwgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgZXRjLgorQWx0ZXJuYXRpdmVseSwgdGhlIHN0YWNrIHNhdmUvcmVzdG9yZSBsb2dpYyBjb3VsZCBiZSBzaHJpbmstd3JhcHBlZCwgcHJvZHVjaW5nCitzb21ldGhpbmcgbGlrZSB0aGlzOgorCitfdGVzdDoKKyAgICAgICAgY21wbCAkMCwgNCglZXNwKQorICAgICAgICBqbmUgTEJCMV8xCisgICAgICAgIHJldAorTEJCMV8xOgorICAgICAgICBzdWJsICQxMiwgJWVzcAorICAgICAgICBjYWxsIExfYWJvcnQkc3R1YgorCitCb3RoIGFyZSB1c2VmdWwgaW4gZGlmZmVyZW50IHNpdHVhdGlvbnMuICBGaW5hbGx5LCBpdCBjb3VsZCBiZSBzaHJpbmstd3JhcHBlZAorYW5kIHRhaWwgY2FsbGVkLCBsaWtlIHRoaXM6CisKK190ZXN0OgorICAgICAgICBjbXBsICQwLCA0KCVlc3ApCisgICAgICAgIGpuZSBMQkIxXzEKKyAgICAgICAgcmV0CitMQkIxXzE6CisgICAgICAgIHBvcCAlZWF4ICAgIyByZWFsaWduIHN0YWNrLgorICAgICAgICBjYWxsIExfYWJvcnQkc3R1YgorCitUaG91Z2ggdGhpcyBwcm9iYWJseSBpc24ndCB3b3J0aCBpdC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTb21ldGltZXMgaXQgaXMgYmV0dGVyIHRvIGNvZGVnZW4gc3VidHJhY3Rpb25zIGZyb20gYSBjb25zdGFudCAoZS5nLiA3LXgpIHdpdGgKK2EgbmVnIGluc3RlYWQgb2YgYSBzdWIgaW5zdHJ1Y3Rpb24uICBDb25zaWRlcjoKKworaW50IHRlc3QoY2hhciBYKSB7IHJldHVybiA3LVg7IH0KKword2UgY3VycmVudGx5IHByb2R1Y2U6CitfdGVzdDoKKyAgICAgICAgbW92bCAkNywgJWVheAorICAgICAgICBtb3ZzYmwgNCglZXNwKSwgJWVjeAorICAgICAgICBzdWJsICVlY3gsICVlYXgKKyAgICAgICAgcmV0CisKK1dlIHdvdWxkIHVzZSBvbmUgZmV3ZXIgcmVnaXN0ZXIgaWYgY29kZWdlbidkIGFzOgorCisgICAgICAgIG1vdnNibCA0KCVlc3ApLCAlZWF4CisJbmVnICVlYXgKKyAgICAgICAgYWRkICQ3LCAlZWF4CisgICAgICAgIHJldAorCitOb3RlIHRoYXQgdGhpcyBpc24ndCBiZW5lZmljaWFsIGlmIHRoZSBsb2FkIGNhbiBiZSBmb2xkZWQgaW50byB0aGUgc3ViLiAgSW4KK3RoaXMgY2FzZSwgd2Ugd2FudCBhIHN1YjoKKworaW50IHRlc3QoaW50IFgpIHsgcmV0dXJuIDctWDsgfQorX3Rlc3Q6CisgICAgICAgIG1vdmwgJDcsICVlYXgKKyAgICAgICAgc3VibCA0KCVlc3ApLCAlZWF4CisgICAgICAgIHJldAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0xlYWYgZnVuY3Rpb25zIHRoYXQgcmVxdWlyZSBvbmUgNC1ieXRlIHNwaWxsIHNsb3QgaGF2ZSBhIHByb2xvZyBsaWtlIHRoaXM6CisKK19mb286CisgICAgICAgIHB1c2hsICAgJWVzaQorICAgICAgICBzdWJsICAgICQ0LCAlZXNwCisuLi4KK2FuZCBhbiBlcGlsb2cgbGlrZSB0aGlzOgorICAgICAgICBhZGRsICAgICQ0LCAlZXNwCisgICAgICAgIHBvcGwgICAgJWVzaQorICAgICAgICByZXQKKworSXQgd291bGQgYmUgc21hbGxlciwgYW5kIHBvdGVudGlhbGx5IGZhc3RlciwgdG8gcHVzaCBlYXggb24gZW50cnkgYW5kIHRvCitwb3AgaW50byBhIGR1bW15IHJlZ2lzdGVyIGluc3RlYWQgb2YgdXNpbmcgYWRkbC9zdWJsIG9mIGVzcC4gIEp1c3QgZG9uJ3QgcG9wIAoraW50byBhbnkgcmV0dXJuIHJlZ2lzdGVycyA6KQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoZSBYODYgYmFja2VuZCBzaG91bGQgZm9sZCAoYnJhbmNoIChvciAoc2V0Y2MsIHNldGNjKSkpIGludG8gbXVsdGlwbGUgCiticmFuY2hlcy4gIFdlIGdlbmVyYXRlIHJlYWxseSBwb29yIGNvZGUgZm9yOgorCitkb3VibGUgdGVzdGYoZG91YmxlIGEpIHsKKyAgICAgICByZXR1cm4gYSA9PSAwLjAgPyAwLjAgOiAoYSA+IDAuMCA/IDEuMCA6IC0xLjApOworfQorCitGb3IgZXhhbXBsZSwgdGhlIGVudHJ5IEJCIGlzOgorCitfdGVzdGY6CisgICAgICAgIHN1YmwgICAgJDIwLCAlZXNwCisgICAgICAgIHB4b3IgICAgJXhtbTAsICV4bW0wCisgICAgICAgIG1vdnNkICAgMjQoJWVzcCksICV4bW0xCisgICAgICAgIHVjb21pc2QgJXhtbTAsICV4bW0xCisgICAgICAgIHNldG5wICAgJWFsCisgICAgICAgIHNldGUgICAgJWNsCisgICAgICAgIHRlc3RiICAgJWNsLCAlYWwKKyAgICAgICAgam5lICAgICBMQkIxXzUgICMgVW5pZmllZFJldHVybkJsb2NrCitMQkIxXzE6ICMgY29uZF90cnVlCisKKworaXQgd291bGQgYmUgYmV0dGVyIHRvIHJlcGxhY2UgdGhlIGxhc3QgZm91ciBpbnN0cnVjdGlvbnMgd2l0aDoKKworCWpwIExCQjFfMQorCWplIExCQjFfNQorTEJCMV8xOgorCitXZSBhbHNvIGNvZGVnZW4gdGhlIGlubmVyID86IGludG8gYSBkaWFtb25kOgorCisgICAgICAgY3Z0c3Myc2QgICAgICAgIExDUEkxXzAoJXJpcCksICV4bW0yCisgICAgICAgIGN2dHNzMnNkICAgICAgICBMQ1BJMV8xKCVyaXApLCAleG1tMworICAgICAgICB1Y29taXNkICV4bW0xLCAleG1tMAorICAgICAgICBqYSAgICAgIExCQjFfMyAgIyBjb25kX3RydWUKK0xCQjFfMjogIyBjb25kX3RydWUKKyAgICAgICAgbW92YXBkICAleG1tMywgJXhtbTIKK0xCQjFfMzogIyBjb25kX3RydWUKKyAgICAgICAgbW92YXBkICAleG1tMiwgJXhtbTAKKyAgICAgICAgcmV0CisKK1dlIHNob3VsZCBzaW5rIHRoZSBsb2FkIGludG8geG1tMyBpbnRvIHRoZSBMQkIxXzIgYmxvY2suICBUaGlzIHNob3VsZAorYmUgcHJldHR5IGVhc3ksIGFuZCB3aWxsIG51a2UgYWxsIHRoZSBjb3BpZXMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhpczoKKyAgICAgICAgI2luY2x1ZGUgPGFsZ29yaXRobT4KKyAgICAgICAgaW5saW5lIHN0ZDo6cGFpcjx1bnNpZ25lZCwgYm9vbD4gZnVsbF9hZGQodW5zaWduZWQgYSwgdW5zaWduZWQgYikKKyAgICAgICAgeyByZXR1cm4gc3RkOjptYWtlX3BhaXIoYSArIGIsIGEgKyBiIDwgYSk7IH0KKyAgICAgICAgYm9vbCBub19vdmVyZmxvdyh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQorICAgICAgICB7IHJldHVybiAhZnVsbF9hZGQoYSwgYikuc2Vjb25kOyB9CisKK1Nob3VsZCBjb21waWxlIHRvOgorCisKKyAgICAgICAgX1oxMW5vX292ZXJmbG93amo6CisgICAgICAgICAgICAgICAgYWRkbCAgICAlZWRpLCAlZXNpCisgICAgICAgICAgICAgICAgc2V0YWUgICAlYWwKKyAgICAgICAgICAgICAgICByZXQKKworRklYTUU6IFRoYXQgY29kZSBsb29rcyB3cm9uZzsgYm9vbCByZXR1cm4gaXMgbm9ybWFsbHkgZGVmaW5lZCBhcyB6ZXh0LgorCitvbiB4ODYtNjQsIG5vdDoKKworX19aMTFub19vdmVyZmxvd2pqOgorICAgICAgICBhZGRsICAgICVlZGksICVlc2kKKyAgICAgICAgY21wbCAgICAlZWRpLCAlZXNpCisgICAgICAgIHNldGFlICAgJWFsCisgICAgICAgIG1vdnpibCAgJWFsLCAlZWF4CisgICAgICAgIHJldAorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlIGZvbGxvd2luZyBjb2RlOgorCitiYjExNC5wcmVoZWFkZXI6CQk7IHByZWRzID0gJWNvbmRfbmV4dDk0CisJJXRtcDIzMTIzMiA9IHNleHQgaTE2ICV0bXA2MiB0byBpMzIJCTsgPGkzMj4gWyN1c2VzPTFdCisJJXRtcDIzMyA9IHN1YiBpMzIgMzIsICV0bXAyMzEyMzIJCTsgPGkzMj4gWyN1c2VzPTFdCisJJXRtcDI0NTI0NiA9IHNleHQgaTE2ICV0bXA2NSB0byBpMzIJCTsgPGkzMj4gWyN1c2VzPTFdCisJJXRtcDI1MjI1MyA9IHNleHQgaTE2ICV0bXA2OCB0byBpMzIJCTsgPGkzMj4gWyN1c2VzPTFdCisJJXRtcDI1NCA9IHN1YiBpMzIgMzIsICV0bXAyNTIyNTMJCTsgPGkzMj4gWyN1c2VzPTFdCisJJXRtcDU1MzU1NCA9IGJpdGNhc3QgaTE2KiAldG1wMzcgdG8gaTgqCQk7IDxpOCo+IFsjdXNlcz0yXQorCSV0bXA1ODM1ODQgPSBzZXh0IGkxNiAldG1wOTggdG8gaTMyCQk7IDxpMzI+IFsjdXNlcz0xXQorCSV0bXA1ODUgPSBzdWIgaTMyIDMyLCAldG1wNTgzNTg0CQk7IDxpMzI+IFsjdXNlcz0xXQorCSV0bXA2MTQ2MTUgPSBzZXh0IGkxNiAldG1wMTAxIHRvIGkzMgkJOyA8aTMyPiBbI3VzZXM9MV0KKwkldG1wNjIxNjIyID0gc2V4dCBpMTYgJXRtcDEwNCB0byBpMzIJCTsgPGkzMj4gWyN1c2VzPTFdCisJJXRtcDYyMyA9IHN1YiBpMzIgMzIsICV0bXA2MjE2MjIJCTsgPGkzMj4gWyN1c2VzPTFdCisJYnIgbGFiZWwgJWJiMTE0CisKK3Byb2R1Y2VzOgorCitMQkIzXzU6CSMgYmIxMTQucHJlaGVhZGVyCisJbW92c3dsCS02OCglZWJwKSwgJWVheAorCW1vdmwJJDMyLCAlZWN4CisJbW92bAklZWN4LCAtODAoJWVicCkKKwlzdWJsCSVlYXgsIC04MCglZWJwKQorCW1vdnN3bAktNTIoJWVicCksICVlYXgKKwltb3ZsCSVlY3gsIC04NCglZWJwKQorCXN1YmwJJWVheCwgLTg0KCVlYnApCisJbW92c3dsCS03MCglZWJwKSwgJWVheAorCW1vdmwJJWVjeCwgLTg4KCVlYnApCisJc3VibAklZWF4LCAtODgoJWVicCkKKwltb3Zzd2wJLTUwKCVlYnApLCAlZWF4CisJc3VibAklZWF4LCAlZWN4CisJbW92bAklZWN4LCAtNzYoJWVicCkKKwltb3Zzd2wJLTQyKCVlYnApLCAlZWF4CisJbW92bAklZWF4LCAtOTIoJWVicCkKKwltb3Zzd2wJLTY2KCVlYnApLCAlZWF4CisJbW92bAklZWF4LCAtOTYoJWVicCkKKwltb3Z3CSQwLCAtOTgoJWVicCkKKworVGhpcyBhcHBlYXJzIHRvIGJlIGJhZCBiZWNhdXNlIHRoZSBSQSBpcyBub3QgZm9sZGluZyB0aGUgc3RvcmUgdG8gdGhlIHN0YWNrIAorc2xvdCBpbnRvIHRoZSBtb3ZsLiAgVGhlIGFib3ZlIGluc3RydWN0aW9ucyBjb3VsZCBiZToKKwltb3ZsICAgICQzMiwgLTgwKCVlYnApCisuLi4KKwltb3ZsICAgICQzMiwgLTg0KCVlYnApCisuLi4KK1RoaXMgc2VlbXMgbGlrZSBhIGNyb3NzIGJldHdlZW4gcmVtYXQgYW5kIHNwaWxsIGZvbGRpbmcuCisKK1RoaXMgaGFzIHJlZHVuZGFudCBzdWJ0cmFjdGlvbnMgb2YgJWVheCBmcm9tIGEgc3RhY2sgc2xvdC4gSG93ZXZlciwgJWVjeCBkb2Vzbid0CitjaGFuZ2UsIHNvIHdlIGNvdWxkIHNpbXBseSBzdWJ0cmFjdCAlZWF4IGZyb20gJWVjeCBmaXJzdCBhbmQgdGhlbiB1c2UgJWVjeCAob3IKK3ZpY2UtdmVyc2EpLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoaXMgY29kZToKKworCSV0bXA2NTkgPSBpY21wIHNsdCBpMTYgJXRtcDY1NCwgMAkJOyA8aTE+IFsjdXNlcz0xXQorCWJyIGkxICV0bXA2NTksIGxhYmVsICVjb25kX3RydWU2NjIsIGxhYmVsICVjb25kX25leHQ3MTUKKworcHJvZHVjZXMgdGhpczoKKworCXRlc3R3CSVjeCwgJWN4CisJbW92c3dsCSVjeCwgJWVzaQorCWpucwlMQkI0XzEwOQkjIGNvbmRfbmV4dDcxNQorCitTaGFyayB0ZWxscyB1cyB0aGF0IHVzaW5nICVjeCBpbiB0aGUgdGVzdHcgaW5zdHJ1Y3Rpb24gaXMgc3ViLW9wdGltYWwuIEl0CitzdWdnZXN0cyB1c2luZyB0aGUgMzItYml0IHJlZ2lzdGVyICh3aGljaCBpcyB3aGF0IElDQyB1c2VzKS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBjb21waWxlIHRoaXM6CisKK3ZvaWQgY29tcGFyZSAobG9uZyBsb25nIGZvbykgeworICBpZiAoZm9vIDwgNDI5NDk2NzI5N0xMKQorICAgIGFib3J0KCk7Cit9CisKK3RvOgorCitjb21wYXJlOgorICAgICAgICBzdWJsICAgICQ0LCAlZXNwCisgICAgICAgIGNtcGwgICAgJDAsIDgoJWVzcCkKKyAgICAgICAgc2V0bmUgICAlYWwKKyAgICAgICAgbW92emJ3ICAlYWwsICVheAorICAgICAgICBjbXBsICAgICQxLCAxMiglZXNwKQorICAgICAgICBzZXRnICAgICVjbAorICAgICAgICBtb3Z6YncgICVjbCwgJWN4CisgICAgICAgIGNtb3ZlICAgJWF4LCAlY3gKKyAgICAgICAgdGVzdGIgICAkMSwgJWNsCisgICAgICAgIGpuZSAgICAgLkxCQjFfMiAjIFVuaWZpZWRSZXR1cm5CbG9jaworLkxCQjFfMTogICAgICAgICMgaWZ0aGVuCisgICAgICAgIGNhbGwgICAgYWJvcnQKKy5MQkIxXzI6ICAgICAgICAjIFVuaWZpZWRSZXR1cm5CbG9jaworICAgICAgICBhZGRsICAgICQ0LCAlZXNwCisgICAgICAgIHJldAorCisoYWxzbyByZWFsbHkgaG9ycmlibGUgY29kZSBvbiBwcGMpLiAgVGhpcyBpcyBkdWUgdG8gdGhlIGV4cGFuZCBjb2RlIGZvciA2NC1iaXQKK2NvbXBhcmVzLiAgR0NDIHByb2R1Y2VzIG11bHRpcGxlIGJyYW5jaGVzLCB3aGljaCBpcyBtdWNoIG5pY2VyOgorCitjb21wYXJlOgorICAgICAgICBzdWJsICAgICQxMiwgJWVzcAorICAgICAgICBtb3ZsICAgIDIwKCVlc3ApLCAlZWR4CisgICAgICAgIG1vdmwgICAgMTYoJWVzcCksICVlYXgKKyAgICAgICAgZGVjbCAgICAlZWR4CisgICAgICAgIGpsZSAgICAgLkw3CisuTDU6CisgICAgICAgIGFkZGwgICAgJDEyLCAlZXNwCisgICAgICAgIHJldAorICAgICAgICAucDJhbGlnbiA0LCw3CisuTDc6CisgICAgICAgIGpsICAgICAgLkw0CisgICAgICAgIGNtcGwgICAgJDAsICVlYXgKKyAgICAgICAgLnAyYWxpZ24gNCwsOAorICAgICAgICBqYSAgICAgIC5MNQorLkw0OgorICAgICAgICAucDJhbGlnbiA0LCw5CisgICAgICAgIGNhbGwgICAgYWJvcnQKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUYWlsIGNhbGwgb3B0aW1pemF0aW9uIGltcHJvdmVtZW50czogVGFpbCBjYWxsIG9wdGltaXphdGlvbiBjdXJyZW50bHkKK3B1c2hlcyBhbGwgYXJndW1lbnRzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrICh0aGVpciBub3JtYWwgcGxhY2UgZm9yCitub24tdGFpbCBjYWxsIG9wdGltaXplZCBjYWxscykgdGhhdCBzb3VyY2UgZnJvbSB0aGUgY2FsbGVycyBhcmd1bWVudHMKK29yICB0aGF0IHNvdXJjZSBmcm9tIGEgdmlydHVhbCByZWdpc3RlciAoYWxzbyBwb3NzaWJseSBzb3VyY2luZyBmcm9tCitjYWxsZXJzIGFyZ3VtZW50cykuCitUaGlzIGlzIGRvbmUgdG8gcHJldmVudCBvdmVyd3JpdGluZyBvZiBwYXJhbWV0ZXJzIChzZWUgZXhhbXBsZQorYmVsb3cpIHRoYXQgbWlnaHQgYmUgdXNlZCBsYXRlci4KKworZXhhbXBsZTogIAorCitpbnQgY2FsbGVlKGludDMyLCBpbnQ2NCk7IAoraW50IGNhbGxlcihpbnQzMiBhcmcxLCBpbnQzMiBhcmcyKSB7IAorICBpbnQ2NCBsb2NhbCA9IGFyZzIgKiAyOyAKKyAgcmV0dXJuIGNhbGxlZShhcmcyLCAoaW50NjQpbG9jYWwpOyAKK30KKworW2FyZzFdICAgICAgICAgIFshYXJnMiBubyBsb25nZXIgdmFsaWQgc2luY2Ugd2UgbW92ZWQgbG9jYWwgb250byBpdF0KK1thcmcyXSAgICAgIC0+ICBbKGludDY0KQorW1JFVEFERFJdICAgICAgICBsb2NhbCAgXQorCitNb3ZpbmcgYXJnMSBvbnRvIHRoZSBzdGFjayBzbG90IG9mIGNhbGxlZSBmdW5jdGlvbiB3b3VsZCBvdmVyd3JpdGUKK2FyZzIgb2YgdGhlIGNhbGxlci4KKworUG9zc2libGUgb3B0aW1pemF0aW9uczoKKworCisgLSBBbmFseXNlIHRoZSBhY3R1YWwgcGFyYW1ldGVycyBvZiB0aGUgY2FsbGVlIHRvIHNlZSB3aGljaCB3b3VsZAorICAgb3ZlcndyaXRlIGEgY2FsbGVyIHBhcmFtZXRlciB3aGljaCBpcyB1c2VkIGJ5IHRoZSBjYWxsZWUgYW5kIG9ubHkKKyAgIHB1c2ggdGhlbSBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorCisgICBpbnQgY2FsbGVlIChpbnQzMiBhcmcxLCBpbnQzMiBhcmcyKTsKKyAgIGludCBjYWxsZXIgKGludDMyIGFyZzEsIGludDMyIGFyZzIpIHsKKyAgICAgICByZXR1cm4gY2FsbGVlKGFyZzEsYXJnMik7CisgICB9CisKKyAgIEhlcmUgd2UgZG9uJ3QgbmVlZCB0byB3cml0ZSBhbnkgdmFyaWFibGVzIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCisgICBzaW5jZSB0aGV5IGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyLgorCisgICBpbnQgY2FsbGVlIChpbnQzMiBhcmcxLCBpbnQzMiBhcmcyKTsKKyAgIGludCBjYWxsZXIgKGludDMyIGFyZzEsIGludDMyIGFyZzIpIHsKKyAgICAgICByZXR1cm4gY2FsbGVlKGFyZzIsYXJnMSk7CisgICB9CisKKyAgIEhlcmUgd2UgbmVlZCB0byBwdXNoIHRoZSBhcmd1bWVudHMgYmVjYXVzZSB0aGV5IG92ZXJ3cml0ZSBlYWNoCisgICBvdGhlci4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCittYWluICgpCit7CisgIGludCBpID0gMDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgeiA9IDA7CisKKyAgZG8geworICAgIHogLT0gMHgwMDAwNDAwMDsKKyAgICBpKys7CisgICAgaWYgKGkgPiAweDAwMDQwMDAwKQorICAgICAgYWJvcnQgKCk7CisgIH0gd2hpbGUgKHogPiAwKTsKKyAgZXhpdCAoMCk7Cit9CisKK2djYyBjb21waWxlcyB0aGlzIHRvOgorCitfbWFpbjoKKwlzdWJsCSQyOCwgJWVzcAorCXhvcmwJJWVheCwgJWVheAorCWptcAlMMgorTDM6CisJY21wbAkkMjYyMTQ0LCAlZWF4CisJamUJTDEwCitMMjoKKwlhZGRsCSQxLCAlZWF4CisJY21wbAkkMjYyMTQ1LCAlZWF4CisJam5lCUwzCisJY2FsbAlMX2Fib3J0JHN0dWIKK0wxMDoKKwltb3ZsCSQwLCAoJWVzcCkKKwljYWxsCUxfZXhpdCRzdHViCisKK2xsdm06CisKK19tYWluOgorCXN1YmwJJDEyLCAlZXNwCisJbW92bAkkMSwgJWVheAorCW1vdmwJJDE2Mzg0LCAlZWN4CitMQkIxXzE6CSMgYmIKKwljbXBsCSQyNjIxNDUsICVlYXgKKwlqZ2UJTEJCMV80CSMgY29uZF90cnVlCitMQkIxXzI6CSMgY29uZF9uZXh0CisJaW5jbAklZWF4CisJYWRkbAkkNDI5NDk1MDkxMiwgJWVjeAorCWNtcGwJJDE2Mzg0LCAlZWN4CisJam5lCUxCQjFfMQkjIGJiCitMQkIxXzM6CSMgYmIxMQorCXhvcmwJJWVheCwgJWVheAorCWFkZGwJJDEyLCAlZXNwCisJcmV0CitMQkIxXzQ6CSMgY29uZF90cnVlCisJY2FsbAlMX2Fib3J0JHN0dWIKKworMS4gTFNSIHNob3VsZCByZXdyaXRlIHRoZSBmaXJzdCBjbXAgd2l0aCBpbmR1Y3Rpb24gdmFyaWFibGUgJWVjeC4KKzIuIERBRyBjb21iaW5lciBzaG91bGQgZm9sZAorICAgICAgICBsZWFsICAgIDEoJWVheCksICVlZHgKKyAgICAgICAgY21wbCAgICAkMjYyMTQ1LCAlZWR4CisgICA9PgorICAgICAgICBjbXBsICAgICQyNjIxNDQsICVlYXgKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWZpbmUgaTY0IEB0ZXN0KGRvdWJsZSAlWCkgeworCSVZID0gZnB0b3NpIGRvdWJsZSAlWCB0byBpNjQKKwlyZXQgaTY0ICVZCit9CisKK2NvbXBpbGVzIHRvOgorCitfdGVzdDoKKwlzdWJsCSQyMCwgJWVzcAorCW1vdnNkCTI0KCVlc3ApLCAleG1tMAorCW1vdnNkCSV4bW0wLCA4KCVlc3ApCisJZmxkbAk4KCVlc3ApCisJZmlzdHRwbGwJKCVlc3ApCisJbW92bAk0KCVlc3ApLCAlZWR4CisJbW92bAkoJWVzcCksICVlYXgKKwlhZGRsCSQyMCwgJWVzcAorCSNGUF9SRUdfS0lMTAorCXJldAorCitUaGlzIHNob3VsZCBqdXN0IGZsZGwgZGlyZWN0bHkgZnJvbSB0aGUgaW5wdXQgc3RhY2sgc2xvdC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGlzIGNvZGU6CitpbnQgZm9vIChpbnQgeCkgeyByZXR1cm4gKHggJiA2NTUzNSkgfCAyNTU7IH0KKworU2hvdWxkIGNvbXBpbGUgaW50bzoKKworX2ZvbzoKKyAgICAgICAgbW92endsICA0KCVlc3ApLCAlZWF4CisgICAgICAgIG9ybCAgICAgJDI1NSwgJWVheAorICAgICAgICByZXQKKworaW5zdGVhZCBvZjoKK19mb286CisgICAgICAgIG1vdmwgICAgJDI1NSwgJWVheAorICAgICAgICBvcmwgICAgIDQoJWVzcCksICVlYXgKKyAgICAgICAgYW5kbCAgICAkNjU1MzUsICVlYXgKKyAgICAgICAgcmV0CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2UncmUgY29kZWdlbidpbmcgbXVsdGlwbHkgb2YgbG9uZyBsb25ncyBpbmVmZmljaWVudGx5OgorCit1bnNpZ25lZCBsb25nIGxvbmcgTExNKHVuc2lnbmVkIGxvbmcgbG9uZyBhcmcxLCB1bnNpZ25lZCBsb25nIGxvbmcgYXJnMikgeworICByZXR1cm4gYXJnMSAqICBhcmcyOworfQorCitXZSBjb21waWxlIHRvIChmb21pdC1mcmFtZS1wb2ludGVyKToKKworX0xMTToKKwlwdXNobAklZXNpCisJbW92bAk4KCVlc3ApLCAlZWN4CisJbW92bAkxNiglZXNwKSwgJWVzaQorCW1vdmwJJWVzaSwgJWVheAorCW11bGwJJWVjeAorCWltdWxsCTEyKCVlc3ApLCAlZXNpCisJYWRkbAklZWR4LCAlZXNpCisJaW11bGwJMjAoJWVzcCksICVlY3gKKwltb3ZsCSVlc2ksICVlZHgKKwlhZGRsCSVlY3gsICVlZHgKKwlwb3BsCSVlc2kKKwlyZXQKKworVGhpcyBsb29rcyBsaWtlIGEgc2NoZWR1bGluZyBkZWZpY2llbmN5IGFuZCBsYWNrIG9mIHJlbWF0IG9mIHRoZSBsb2FkIGZyb20KK3RoZSBhcmd1bWVudCBhcmVhLiAgSUNDIGFwcGFyZW50bHkgcHJvZHVjZXM6CisKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlY3gKKyAgICAgICAgaW11bGwgICAgIDEyKCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmwgICAgICAxNiglZXNwKSwgJWVheAorICAgICAgICBpbXVsbCAgICAgNCglZXNwKSwgJWVheCAKKyAgICAgICAgYWRkbCAgICAgICVlYXgsICVlY3ggIAorICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVheAorICAgICAgICBtdWxsICAgICAgMTIoJWVzcCkgCisgICAgICAgIGFkZGwgICAgICAlZWN4LCAlZWR4CisgICAgICAgIHJldAorCitOb3RlIHRoYXQgaXQgcmVtYXQnZCBsb2FkcyBmcm9tIDQoZXNwKSBhbmQgMTIoZXNwKS4gIFNlZSB0aGlzIEdDQyBQUjoKK2h0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTcyMzYKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitXZSBjYW4gZm9sZCBhIHN0b3JlIGludG8gInplcm9pbmcgYSByZWciLiAgSW5zdGVhZCBvZjoKKworeG9ybCAgICAlZWF4LCAlZWF4Cittb3ZsICAgICVlYXgsIDEyNCglZXNwKQorCit3ZSBzaG91bGQgZ2V0OgorCittb3ZsICAgICQwLCAxMjQoJWVzcCkKKworaWYgdGhlIGZsYWdzIG9mIHRoZSB4b3IgYXJlIGRlYWQuCisKK0xpa2V3aXNlLCB3ZSBpc2VsICJ4PDwxIiBpbnRvICJhZGQgcmVnLHJlZyIuICBJZiByZWcgaXMgc3BpbGxlZCwgdGhpcyBzaG91bGQKK2JlIGZvbGRlZCBpbnRvOiBzaGwgW21lbV0sIDEKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbiBTU0UgbW9kZSwgd2UgdHVybiBhYnMgYW5kIG5lZyBpbnRvIGEgbG9hZCBmcm9tIHRoZSBjb25zdGFudCBwb29sIHBsdXMgYSB4b3IKK29yIGFuZCBpbnN0cnVjdGlvbiwgZm9yIGV4YW1wbGU6CisKKwl4b3JwZAlMQ1BJMV8wLCAleG1tMgorCitIb3dldmVyLCBpZiB4bW0yIGdldHMgc3BpbGxlZCwgd2UgZW5kIHVwIHdpdGggcmVhbGx5IHVnbHkgY29kZSBsaWtlIHRoaXM6CisKKwltb3ZzZAkoJWVzcCksICV4bW0wCisJeG9ycGQJTENQSTFfMCwgJXhtbTAKKwltb3ZzZAkleG1tMCwgKCVlc3ApCisKK1NpbmNlIHdlICdrbm93JyB0aGF0IHRoaXMgaXMgYSAnbmVnJywgd2UgY2FuIGFjdHVhbGx5ICJmb2xkIiB0aGUgc3BpbGwgaW50bwordGhlIG5lZy9hYnMgaW5zdHJ1Y3Rpb24sIHR1cm5pbmcgaXQgaW50byBhbiAqaW50ZWdlciogb3BlcmF0aW9uLCBsaWtlIHRoaXM6CisKKwl4b3JsIDIxNDc0ODM2NDgsIFttZW0rNF0gICAgICMjIDIxNDc0ODM2NDggPSAoMSA8PCAzMSkKKworeW91IGNvdWxkIGFsc28gdXNlIHhvcmIsIGJ1dCB4b3JsIGlzIGxlc3MgbGlrZWx5IHRvIGxlYWQgdG8gYSBwYXJ0aWFsIHJlZ2lzdGVyCitzdGFsbC4gIEhlcmUgaXMgYSBjb250cml2ZWQgdGVzdGNhc2U6CisKK2RvdWJsZSBhLCBiLCBjOwordm9pZCB0ZXN0KGRvdWJsZSAqUCkgeworICBkb3VibGUgWCA9ICpQOworICBhID0gWDsKKyAgYmFyKCk7CisgIFggPSAtWDsKKyAgYiA9IFg7CisgIGJhcigpOworICBjID0gWDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGUgZ2VuZXJhdGVkIGNvZGUgb24geDg2IGZvciBjaGVja2luZyBmb3Igc2lnbmVkIG92ZXJmbG93IG9uIGEgbXVsdGlwbHkgdGhlCitvYnZpb3VzIHdheSBpcyBtdWNoIGxvbmdlciB0aGFuIGl0IG5lZWRzIHRvIGJlLgorCitpbnQgeChpbnQgYSwgaW50IGIpIHsKKyAgbG9uZyBsb25nIHByb2QgPSAobG9uZyBsb25nKWEqYjsKKyAgcmV0dXJuICBwcm9kID4gMHg3RkZGRkZGRiB8fCBwcm9kIDwgKC0weDdGRkZGRkZGLTEpOworfQorCitTZWUgUFIyMDUzIGZvciBtb3JlIGRldGFpbHMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2Ugc2hvdWxkIGludmVzdGlnYXRlIHVzaW5nIGNkcS9jdGxkIChlZmZlY3Q6IGVkeCA9IHNhciBlYXgsIDMxKQorbW9yZSBhZ2dyZXNzaXZlbHk7IGl0IHNob3VsZCBjb3N0IHRoZSBzYW1lIGFzIGEgbW92ZStzaGlmdCBvbiBhbnkgbW9kZXJuCitwcm9jZXNzb3IsIGJ1dCBpdCdzIGEgbG90IHNob3J0ZXIuIERvd25zaWRlIGlzIHRoYXQgaXQgcHV0cyBtb3JlCitwcmVzc3VyZSBvbiByZWdpc3RlciBhbGxvY2F0aW9uIGJlY2F1c2UgaXQgaGFzIGZpeGVkIG9wZXJhbmRzLgorCitFeGFtcGxlOgoraW50IGFicyhpbnQgeCkge3JldHVybiB4IDwgMCA/IC14IDogeDt9CisKK2djYyBjb21waWxlcyB0aGlzIHRvIHRoZSBmb2xsb3dpbmcgd2hlbiB1c2luZyBtYXJjaC9tdHVuZT1wZW50aXVtMi8zLzQvbS9ldGMuOgorYWJzOgorICAgICAgICBtb3ZsICAgIDQoJWVzcCksICVlYXgKKyAgICAgICAgY2x0ZAorICAgICAgICB4b3JsICAgICVlZHgsICVlYXgKKyAgICAgICAgc3VibCAgICAlZWR4LCAlZWF4CisgICAgICAgIHJldAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0NvbnNpZGVyOgoraW50IHRlc3QodW5zaWduZWQgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGIpIHsgcmV0dXJuIC0oYSA8IGIpOyB9CisKK1dlIGN1cnJlbnRseSBjb21waWxlIHRoaXMgdG86CisKK2RlZmluZSBpMzIgQHRlc3QoaTMyICVhLCBpMzIgJWIpIG5vdW53aW5kICB7CisJJXRtcDMgPSBpY21wIHVsdCBpMzIgJWEsICViCQk7IDxpMT4gWyN1c2VzPTFdCisJJXRtcDM0ID0gemV4dCBpMSAldG1wMyB0byBpMzIJCTsgPGkzMj4gWyN1c2VzPTFdCisJJXRtcDUgPSBzdWIgaTMyIDAsICV0bXAzNAkJOyA8aTMyPiBbI3VzZXM9MV0KKwlyZXQgaTMyICV0bXA1Cit9CisKK2FuZAorCitfdGVzdDoKKwltb3ZsCTgoJWVzcCksICVlYXgKKwljbXBsCSVlYXgsIDQoJWVzcCkKKwlzZXRiCSVhbAorCW1vdnpibAklYWwsICVlYXgKKwluZWdsCSVlYXgKKwlyZXQKKworU2V2ZXJhbCBkZWZpY2llbmNpZXMgaGVyZS4gIEZpcnN0LCB3ZSBzaG91bGQgaW5zdGNvbWJpbmUgemV4dCtuZWcgaW50byBzZXh0OgorCitkZWZpbmUgaTMyIEB0ZXN0MihpMzIgJWEsIGkzMiAlYikgbm91bndpbmQgIHsKKwkldG1wMyA9IGljbXAgdWx0IGkzMiAlYSwgJWIJCTsgPGkxPiBbI3VzZXM9MV0KKwkldG1wMzQgPSBzZXh0IGkxICV0bXAzIHRvIGkzMgkJOyA8aTMyPiBbI3VzZXM9MV0KKwlyZXQgaTMyICV0bXAzNAorfQorCitIb3dldmVyLCBiZWZvcmUgd2UgY2FuIGRvIHRoYXQsIHdlIGhhdmUgdG8gZml4IHRoZSBiYWQgY29kZWdlbiB0aGF0IHdlIGdldCBmb3IKK3NleHQgZnJvbSBib29sOgorCitfdGVzdDI6CisJbW92bAk4KCVlc3ApLCAlZWF4CisJY21wbAklZWF4LCA0KCVlc3ApCisJc2V0YgklYWwKKwltb3Z6YmwJJWFsLCAlZWF4CisJc2hsbAkkMzEsICVlYXgKKwlzYXJsCSQzMSwgJWVheAorCXJldAorCitUaGlzIGNvZGUgc2hvdWxkIGJlIGF0IGxlYXN0IGFzIGdvb2QgYXMgdGhlIGNvZGUgYWJvdmUuICBPbmNlIHRoaXMgaXMgZml4ZWQsIHdlCitjYW4gb3B0aW1pemUgdGhpcyBzcGVjaWZpYyBjYXNlIGV2ZW4gbW9yZSB0bzoKKworCW1vdmwJOCglZXNwKSwgJWVheAorCXhvcmwJJWVjeCwgJWVjeAorICAgICAgICBjbXBsICAgICVlYXgsIDQoJWVzcCkKKyAgICAgICAgc2JibCAgICAlZWN4LCAlZWN4CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGFrZSB0aGUgZm9sbG93aW5nIGNvZGUgKGZyb20gCitodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE2NTQxKToKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgZmlyc3Rfb25lWzY1NTM2XTsKK2ludCBGaXJzdE9uZXQodW5zaWduZWQgbG9uZyBsb25nIGFyZzEpCit7CisgIGlmIChhcmcxID4+IDQ4KQorICAgIHJldHVybiAoZmlyc3Rfb25lW2FyZzEgPj4gNDhdKTsKKyAgcmV0dXJuIDA7Cit9CisKKworVGhlIGZvbGxvd2luZyBjb2RlIGlzIGN1cnJlbnRseSBnZW5lcmF0ZWQ6CitGaXJzdE9uZXQ6CisgICAgICAgIG1vdmwgICAgOCglZXNwKSwgJWVheAorICAgICAgICBjbXBsICAgICQ2NTUzNiwgJWVheAorICAgICAgICBtb3ZsICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgamIgICAgICAuTEJCMV8yICMgVW5pZmllZFJldHVybkJsb2NrCisuTEJCMV8xOiAgICAgICAgIyBpZnRoZW4KKyAgICAgICAgc2hybCAgICAkMTYsICVlYXgKKyAgICAgICAgbW92emJsICBmaXJzdF9vbmUoJWVheCksICVlYXgKKyAgICAgICAgcmV0CisuTEJCMV8yOiAgICAgICAgIyBVbmlmaWVkUmV0dXJuQmxvY2sKKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4CisgICAgICAgIHJldAorCitXZSBjb3VsZCBjaGFuZ2UgdGhlICJtb3ZsIDgoJWVzcCksICVlYXgiIGludG8gIm1vdnp3bCAxMCglZXNwKSwgJWVheCI7IHRoaXMKK2xldHMgdXMgY2hhbmdlIHRoZSBjbXBsIGludG8gYSB0ZXN0bCwgd2hpY2ggaXMgc2hvcnRlciwgYW5kIGVsaW1pbmF0ZSB0aGUgc2hpZnQuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2UgY29tcGlsZSB0aGlzIGZ1bmN0aW9uOgorCitkZWZpbmUgaTMyIEBmb28oaTMyICVhLCBpMzIgJWIsIGkzMiAlYywgaTggemVyb2V4dCAgJWQpIG5vdW53aW5kICB7CitlbnRyeToKKwkldG1wMiA9IGljbXAgZXEgaTggJWQsIDAJCTsgPGkxPiBbI3VzZXM9MV0KKwliciBpMSAldG1wMiwgbGFiZWwgJWJiNywgbGFiZWwgJWJiCisKK2JiOgkJOyBwcmVkcyA9ICVlbnRyeQorCSV0bXA2ID0gYWRkIGkzMiAlYiwgJWEJCTsgPGkzMj4gWyN1c2VzPTFdCisJcmV0IGkzMiAldG1wNgorCitiYjc6CQk7IHByZWRzID0gJWVudHJ5CisJJXRtcDEwID0gc3ViIGkzMiAlYSwgJWMJCTsgPGkzMj4gWyN1c2VzPTFdCisJcmV0IGkzMiAldG1wMTAKK30KKwordG86CisKK2ZvbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEBmb28KKyMgQkIjMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICVlbnRyeQorCW1vdmwJNCglZXNwKSwgJWVjeAorCWNtcGIJJDAsIDE2KCVlc3ApCisJamUJLkxCQjBfMgorIyBCQiMxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJWJiCisJbW92bAk4KCVlc3ApLCAlZWF4CisJYWRkbAklZWN4LCAlZWF4CisJcmV0CisuTEJCMF8yOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlYmI3CisJbW92bAkxMiglZXNwKSwgJWVkeAorCW1vdmwJJWVjeCwgJWVheAorCXN1YmwJJWVkeCwgJWVheAorCXJldAorCitUaGVyZSdzIGFuIG9idmlvdXNseSB1bm5lY2Vzc2FyeSBtb3ZsIGluIC5MQkIwXzIsIGFuZCB3ZSBjb3VsZCBlbGltaW5hdGUgYQorY291cGxlIG1vcmUgbW92bHMgYnkgcHV0dGluZyA0KCVlc3ApIGludG8gJWVheCBpbnN0ZWFkIG9mICVlY3guCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworU2VlIHJkYXI6Ly80NjUzNjgyLgorCitGcm9tIGZsb3BzOgorCitMQkIxXzE1OiAgICAgICAgIyBiYjMxMAorICAgICAgICBjdnRzczJzZCAgICAgICAgTENQSTFfMCwgJXhtbTEKKyAgICAgICAgYWRkc2QgICAleG1tMSwgJXhtbTAKKyAgICAgICAgbW92c2QgICAxNzYoJWVzcCksICV4bW0yCisgICAgICAgIG11bHNkICAgJXhtbTAsICV4bW0yCisgICAgICAgIG1vdmFwZCAgJXhtbTIsICV4bW0zCisgICAgICAgIG11bHNkICAgJXhtbTMsICV4bW0zCisgICAgICAgIG1vdmFwZCAgJXhtbTMsICV4bW00CisgICAgICAgIG11bHNkICAgTENQSTFfMjMsICV4bW00CisgICAgICAgIGFkZHNkICAgTENQSTFfMjQsICV4bW00CisgICAgICAgIG11bHNkICAgJXhtbTMsICV4bW00CisgICAgICAgIGFkZHNkICAgTENQSTFfMjUsICV4bW00CisgICAgICAgIG11bHNkICAgJXhtbTMsICV4bW00CisgICAgICAgIGFkZHNkICAgTENQSTFfMjYsICV4bW00CisgICAgICAgIG11bHNkICAgJXhtbTMsICV4bW00CisgICAgICAgIGFkZHNkICAgTENQSTFfMjcsICV4bW00CisgICAgICAgIG11bHNkICAgJXhtbTMsICV4bW00CisgICAgICAgIGFkZHNkICAgTENQSTFfMjgsICV4bW00CisgICAgICAgIG11bHNkICAgJXhtbTMsICV4bW00CisgICAgICAgIGFkZHNkICAgJXhtbTEsICV4bW00CisgICAgICAgIG11bHNkICAgJXhtbTIsICV4bW00CisgICAgICAgIG1vdnNkICAgMTUyKCVlc3ApLCAleG1tMQorICAgICAgICBhZGRzZCAgICV4bW00LCAleG1tMQorICAgICAgICBtb3ZzZCAgICV4bW0xLCAxNTIoJWVzcCkKKyAgICAgICAgaW5jbCAgICAlZWF4CisgICAgICAgIGNtcGwgICAgJWVheCwgJWVzaQorICAgICAgICBqZ2UgICAgIExCQjFfMTUgIyBiYjMxMAorTEJCMV8xNjogICAgICAgICMgYmIzNTgubG9vcGV4aXQKKyAgICAgICAgbW92c2QgICAxNTIoJWVzcCksICV4bW0wCisgICAgICAgIGFkZHNkICAgJXhtbTAsICV4bW0wCisgICAgICAgIGFkZHNkICAgTENQSTFfMjIsICV4bW0wCisgICAgICAgIG1vdnNkICAgJXhtbTAsIDE1MiglZXNwKQorCitSYXRoZXIgdGhhbiBzcGlsbGluZyB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGFkZHNkIGluIHRoZSBsb29wLCB3ZSBzaG91bGQgaGF2ZQoraW5zZXJ0IGEgY29weSB0byBzcGxpdCB0aGUgaW50ZXJ2YWwgKG9uZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBsb29wLCBvbmUKK2V4dGVuZGluZyB0byB0aGUgZmFsbCB0aHJvdWdoKS4gVGhlIHJlZ2lzdGVyIHByZXNzdXJlIGluIHRoZSBsb29wIGlzbid0IGhpZ2gKK2Vub3VnaCB0byB3YXJyYW50IHRoZSBzcGlsbC4KKworQWxzbyBjaGVjayB3aHkgeG1tNyBpcyBub3QgdXNlZCBhdCBhbGwgaW4gdGhlIGZ1bmN0aW9uLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1Rha2UgdGhlIGZvbGxvd2luZzoKKwordGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi1pNjQ6MzI6NjQtZjMyOjMyOjMyLWY2NDozMjo2NC12NjQ6NjQ6NjQtdjEyODoxMjg6MTI4LWEwOjA6NjQtZjgwOjEyODoxMjgiCit0YXJnZXQgdHJpcGxlID0gImkzODYtYXBwbGUtZGFyd2luOCIKK0Bpbl9leGl0LjQ4NzAuYiA9IGludGVybmFsIGdsb2JhbCBpMSBmYWxzZQkJOyA8aTEqPiBbI3VzZXM9Ml0KK2RlZmluZSBmYXN0Y2Mgdm9pZCBAYWJvcnRfZ3ppcCgpIG5vcmV0dXJuIG5vdW53aW5kICB7CitlbnRyeToKKwkldG1wLmIuaSA9IGxvYWQgaTEqIEBpbl9leGl0LjQ4NzAuYgkJOyA8aTE+IFsjdXNlcz0xXQorCWJyIGkxICV0bXAuYi5pLCBsYWJlbCAlYmIuaSwgbGFiZWwgJWJiNC5pCitiYi5pOgkJOyBwcmVkcyA9ICVlbnRyeQorCXRhaWwgY2FsbCB2b2lkIEBleGl0KCBpMzIgMSApIG5vcmV0dXJuIG5vdW53aW5kIAorCXVucmVhY2hhYmxlCitiYjQuaToJCTsgcHJlZHMgPSAlZW50cnkKKwlzdG9yZSBpMSB0cnVlLCBpMSogQGluX2V4aXQuNDg3MC5iCisJdGFpbCBjYWxsIHZvaWQgQGV4aXQoIGkzMiAxICkgbm9yZXR1cm4gbm91bndpbmQgCisJdW5yZWFjaGFibGUKK30KK2RlY2xhcmUgdm9pZCBAZXhpdChpMzIpIG5vcmV0dXJuIG5vdW53aW5kIAorCitUaGlzIGNvbXBpbGVzIGludG86CitfYWJvcnRfZ3ppcDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgQGFib3J0X2d6aXAKKyMjIEJCIzA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAlZW50cnkKKwlzdWJsCSQxMiwgJWVzcAorCW1vdmIJX2luX2V4aXQuNDg3MC5iLCAlYWwKKwljbXBiCSQxLCAlYWwKKwlqbmUJTEJCMF8yCisKK1dlIHNvbWVob3cgbWlzcyBmb2xkaW5nIHRoZSBtb3ZiIGludG8gdGhlIGNtcGIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2UgY29tcGlsZToKKworaW50IHRlc3QoaW50IHgsIGludCB5KSB7CisgIHJldHVybiB4LXktMTsKK30KKworaW50byAoLW02NCk6CisKK190ZXN0OgorCWRlY2wJJWVkaQorCW1vdmwJJWVkaSwgJWVheAorCXN1YmwJJWVzaSwgJWVheAorCXJldAorCitpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gY29kZWdlbiBhczogeCt+eSAgKG5vdGwrYWRkbCkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUaGlzIGNvZGU6CisKK2ludCBmb28oY29uc3QgY2hhciAqc3RyLC4uLikKK3sKKyBfX2J1aWx0aW5fdmFfbGlzdCBhOyBpbnQgeDsKKyBfX2J1aWx0aW5fdmFfc3RhcnQoYSxzdHIpOyB4ID0gX19idWlsdGluX3ZhX2FyZyhhLGludCk7IF9fYnVpbHRpbl92YV9lbmQoYSk7CisgcmV0dXJuIHg7Cit9CisKK2dldHMgY29tcGlsZWQgaW50byB0aGlzIG9uIHg4Ni02NDoKKwlzdWJxICAgICQyMDAsICVyc3AKKyAgICAgICAgbW92YXBzICAleG1tNywgMTYwKCVyc3ApCisgICAgICAgIG1vdmFwcyAgJXhtbTYsIDE0NCglcnNwKQorICAgICAgICBtb3ZhcHMgICV4bW01LCAxMjgoJXJzcCkKKyAgICAgICAgbW92YXBzICAleG1tNCwgMTEyKCVyc3ApCisgICAgICAgIG1vdmFwcyAgJXhtbTMsIDk2KCVyc3ApCisgICAgICAgIG1vdmFwcyAgJXhtbTIsIDgwKCVyc3ApCisgICAgICAgIG1vdmFwcyAgJXhtbTEsIDY0KCVyc3ApCisgICAgICAgIG1vdmFwcyAgJXhtbTAsIDQ4KCVyc3ApCisgICAgICAgIG1vdnEgICAgJXI5LCA0MCglcnNwKQorICAgICAgICBtb3ZxICAgICVyOCwgMzIoJXJzcCkKKyAgICAgICAgbW92cSAgICAlcmN4LCAyNCglcnNwKQorICAgICAgICBtb3ZxICAgICVyZHgsIDE2KCVyc3ApCisgICAgICAgIG1vdnEgICAgJXJzaSwgOCglcnNwKQorICAgICAgICBsZWFxICAgICglcnNwKSwgJXJheAorICAgICAgICBtb3ZxICAgICVyYXgsIDE5MiglcnNwKQorICAgICAgICBsZWFxICAgIDIwOCglcnNwKSwgJXJheAorICAgICAgICBtb3ZxICAgICVyYXgsIDE4NCglcnNwKQorICAgICAgICBtb3ZsICAgICQ0OCwgMTgwKCVyc3ApCisgICAgICAgIG1vdmwgICAgJDgsIDE3NiglcnNwKQorICAgICAgICBtb3ZsICAgIDE3NiglcnNwKSwgJWVheAorICAgICAgICBjbXBsICAgICQ0NywgJWVheAorICAgICAgICBqYmUgICAgIC5MQkIxXzMgIyBiYgorLkxCQjFfMTogICAgICAgICMgYmIzCisgICAgICAgIG1vdnEgICAgMTg0KCVyc3ApLCAlcmN4CisgICAgICAgIGxlYXEgICAgOCglcmN4KSwgJXJheAorICAgICAgICBtb3ZxICAgICVyYXgsIDE4NCglcnNwKQorLkxCQjFfMjogICAgICAgICMgYmI0CisgICAgICAgIG1vdmwgICAgKCVyY3gpLCAlZWF4CisgICAgICAgIGFkZHEgICAgJDIwMCwgJXJzcAorICAgICAgICByZXQKKy5MQkIxXzM6ICAgICAgICAjIGJiCisgICAgICAgIG1vdmwgICAgJWVheCwgJWVjeAorICAgICAgICBhZGRsICAgICQ4LCAlZWF4CisgICAgICAgIGFkZHEgICAgMTkyKCVyc3ApLCAlcmN4CisgICAgICAgIG1vdmwgICAgJWVheCwgMTc2KCVyc3ApCisgICAgICAgIGptcCAgICAgLkxCQjFfMiAjIGJiNAorCitnY2MgNC4zIGdlbmVyYXRlczoKKwlzdWJxICAgICQ5NiwgJXJzcAorLkxDRkkwOgorICAgICAgICBsZWFxICAgIDEwNCglcnNwKSwgJXJheAorICAgICAgICBtb3ZxICAgICVyc2ksIC04MCglcnNwKQorICAgICAgICBtb3ZsICAgICQ4LCAtMTIwKCVyc3ApCisgICAgICAgIG1vdnEgICAgJXJheCwgLTExMiglcnNwKQorICAgICAgICBsZWFxICAgIC04OCglcnNwKSwgJXJheAorICAgICAgICBtb3ZxICAgICVyYXgsIC0xMDQoJXJzcCkKKyAgICAgICAgbW92bCAgICAkOCwgJWVheAorICAgICAgICBjbXBsICAgICQ0OCwgJWVheAorICAgICAgICBqYiAgICAgIC5MNgorICAgICAgICBtb3ZxICAgIC0xMTIoJXJzcCksICVyZHgKKyAgICAgICAgbW92bCAgICAoJXJkeCksICVlYXgKKyAgICAgICAgYWRkcSAgICAkOTYsICVyc3AKKyAgICAgICAgcmV0CisgICAgICAgIC5wMmFsaWduIDQsLDEwCisgICAgICAgIC5wMmFsaWduIDMKKy5MNjoKKyAgICAgICAgbW92ICAgICAlZWF4LCAlZWR4CisgICAgICAgIGFkZHEgICAgLTEwNCglcnNwKSwgJXJkeAorICAgICAgICBhZGRsICAgICQ4LCAlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCwgLTEyMCglcnNwKQorICAgICAgICBtb3ZsICAgICglcmR4KSwgJWVheAorICAgICAgICBhZGRxICAgICQ5NiwgJXJzcAorICAgICAgICByZXQKKworYW5kIGl0IGdldHMgY29tcGlsZWQgaW50byB0aGlzIG9uIHg4NjoKKwlwdXNobCAgICVlYnAKKyAgICAgICAgbW92bCAgICAlZXNwLCAlZWJwCisgICAgICAgIHN1YmwgICAgJDQsICVlc3AKKyAgICAgICAgbGVhbCAgICAxMiglZWJwKSwgJWVheAorICAgICAgICBtb3ZsICAgICVlYXgsIC00KCVlYnApCisgICAgICAgIGxlYWwgICAgMTYoJWVicCksICVlYXgKKyAgICAgICAgbW92bCAgICAlZWF4LCAtNCglZWJwKQorICAgICAgICBtb3ZsICAgIDEyKCVlYnApLCAlZWF4CisgICAgICAgIGFkZGwgICAgJDQsICVlc3AKKyAgICAgICAgcG9wbCAgICAlZWJwCisgICAgICAgIHJldAorCitnY2MgNC4zIGdlbmVyYXRlczoKKwlwdXNobCAgICVlYnAKKyAgICAgICAgbW92bCAgICAlZXNwLCAlZWJwCisgICAgICAgIG1vdmwgICAgMTIoJWVicCksICVlYXgKKyAgICAgICAgcG9wbCAgICAlZWJwCisgICAgICAgIHJldAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RlYWNoIHRibGdlbiBub3QgdG8gY2hlY2sgYml0Y29udmVydCBzb3VyY2UgdHlwZSBpbiBzb21lIGNhc2VzLiBUaGlzIGFsbG93cyB1cwordG8gY29uc29saWRhdGUgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBpbiBYODZJbnN0ck1NWC50ZDoKKworZGVmIDogUGF0PCh2MmkzMiAoYml0Y29udmVydCAoaTY0ICh2ZWN0b3JfZXh0cmFjdCAodjJpNjQgVlIxMjg6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpUFRSIDApKSkpKSwKKyAgICAgICAgICAodjJpMzIgKE1NWF9NT1ZEUTJRcnIgVlIxMjg6JHNyYykpPjsKK2RlZiA6IFBhdDwodjRpMTYgKGJpdGNvbnZlcnQgKGk2NCAodmVjdG9yX2V4dHJhY3QgKHYyaTY0IFZSMTI4OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaVBUUiAwKSkpKSksCisgICAgICAgICAgKHY0aTE2IChNTVhfTU9WRFEyUXJyIFZSMTI4OiRzcmMpKT47CitkZWYgOiBQYXQ8KHY4aTggKGJpdGNvbnZlcnQgKGk2NCAodmVjdG9yX2V4dHJhY3QgKHYyaTY0IFZSMTI4OiRzcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaVBUUiAwKSkpKSksCisgICAgICAgICAgKHY4aTggKE1NWF9NT1ZEUTJRcnIgVlIxMjg6JHNyYykpPjsKKworVGhlcmUgYXJlIG90aGVyIGNhc2VzIGluIHZhcmlvdXMgdGQgZmlsZXMuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGFrZSBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIG9uIHg4Ni0zMjoKK3Vuc2lnbmVkIGEodW5zaWduZWQgbG9uZyBsb25nIHgsIHVuc2lnbmVkIHkpIHtyZXR1cm4geCAlIHk7fQorCitXZSBjdXJyZW50bHkgZ2VuZXJhdGUgYSBsaWJjYWxsLCBidXQgd2UgcmVhbGx5IHNob3VsZG4ndDogdGhlIGV4cGFuc2lvbiBpcworc2hvcnRlciBhbmQgbGlrZWx5IGZhc3RlciB0aGFuIHRoZSBsaWJjYWxsLiAgVGhlIGV4cGVjdGVkIGNvZGUgaXMgc29tZXRoaW5nCitsaWtlIHRoZSBmb2xsb3dpbmc6CisKKwltb3ZsCTEyKCVlYnApLCAlZWF4CisJbW92bAkxNiglZWJwKSwgJWVjeAorCXhvcmwJJWVkeCwgJWVkeAorCWRpdmwJJWVjeAorCW1vdmwJOCglZWJwKSwgJWVheAorCWRpdmwJJWVjeAorCW1vdmwJJWVkeCwgJWVheAorCXJldAorCitBIHNpbWlsYXIgY29kZSBzZXF1ZW5jZSB3b3JrcyBmb3IgZGl2aXNpb24uCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGhlc2Ugc2hvdWxkIGNvbXBpbGUgdG8gdGhlIHNhbWUgY29kZSwgYnV0IHRoZSBsYXRlciBjb2RlZ2VuJ3MgdG8gdXNlbGVzcworaW5zdHJ1Y3Rpb25zIG9uIFg4Ni4gVGhpcyBtYXkgYmUgYSB0cml2aWFsIGRhZyBjb21iaW5lIChHQ0MgUFI3MDYxKToKKworc3RydWN0IHMxIHsgdW5zaWduZWQgY2hhciBhLCBiOyB9OwordW5zaWduZWQgbG9uZyBmMShzdHJ1Y3QgczEgeCkgeworICAgIHJldHVybiB4LmEgKyB4LmI7Cit9CitzdHJ1Y3QgczIgeyB1bnNpZ25lZCBhOiA4LCBiOiA4OyB9OwordW5zaWduZWQgbG9uZyBmMihzdHJ1Y3QgczIgeCkgeworICAgIHJldHVybiB4LmEgKyB4LmI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworV2UgY3VycmVudGx5IGNvbXBpbGUgdGhpczoKKworZGVmaW5lIGkzMiBAZnVuYzEoaTMyICV2MSwgaTMyICV2Mikgbm91bndpbmQgeworZW50cnk6CisgICV0ID0gY2FsbCB7aTMyLCBpMX0gQGxsdm0uc2FkZC53aXRoLm92ZXJmbG93LmkzMihpMzIgJXYxLCBpMzIgJXYyKQorICAlc3VtID0gZXh0cmFjdHZhbHVlIHtpMzIsIGkxfSAldCwgMAorICAlb2JpdCA9IGV4dHJhY3R2YWx1ZSB7aTMyLCBpMX0gJXQsIDEKKyAgYnIgaTEgJW9iaXQsIGxhYmVsICVvdmVyZmxvdywgbGFiZWwgJW5vcm1hbAorbm9ybWFsOgorICByZXQgaTMyICVzdW0KK292ZXJmbG93OgorICBjYWxsIHZvaWQgQGxsdm0udHJhcCgpCisgIHVucmVhY2hhYmxlCit9CitkZWNsYXJlIHtpMzIsIGkxfSBAbGx2bS5zYWRkLndpdGgub3ZlcmZsb3cuaTMyKGkzMiwgaTMyKQorZGVjbGFyZSB2b2lkIEBsbHZtLnRyYXAoKQorCit0bzoKKworX2Z1bmMxOgorCW1vdmwJNCglZXNwKSwgJWVheAorCWFkZGwJOCglZXNwKSwgJWVheAorCWpvCUxCQjFfMgkjIyBvdmVyZmxvdworTEJCMV8xOgkjIyBub3JtYWwKKwlyZXQKK0xCQjFfMjoJIyMgb3ZlcmZsb3cKKwl1ZDIKKworaXQgd291bGQgYmUgbmljZSB0byBwcm9kdWNlICJpbnRvIiBzb21lZGF5LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RoaXMgY29kZToKKwordm9pZCB2ZWNfbXB5czEoaW50IHlbXSwgY29uc3QgaW50IHhbXSwgaW50IHNjYWxlcikgeworaW50IGk7Citmb3IgKGkgPSAwOyBpIDwgMTUwOyBpKyspCisgeVtpXSArPSAoKChsb25nIGxvbmcpc2NhbGVyICogKGxvbmcgbG9uZyl4W2ldKSA+PiAzMSk7Cit9CisKK0NvbXBpbGVzIHRvIHRoaXMgbG9vcCB3aXRoIEdDQyAzLng6CisKKy5MNToKKwltb3ZsCSVlYngsICVlYXgKKwlpbXVsbAkoJWVkaSwlZWN4LDQpCisJc2hyZGwJJDMxLCAlZWR4LCAlZWF4CisJYWRkbAklZWF4LCAoJWVzaSwlZWN4LDQpCisJaW5jbAklZWN4CisJY21wbAkkMTQ5LCAlZWN4CisJamxlCS5MNQorCitsbHZtLWdjYyBjb21waWxlcyBpdCB0byB0aGUgbXVjaCB1Z2xpZXI6CisKK0xCQjFfMToJIyMgYmIxCisJbW92bAkyNCglZXNwKSwgJWVheAorCW1vdmwJKCVlYXgsJWVkaSw0KSwgJWVieAorCW1vdmwJJWVieCwgJWVicAorCWltdWxsCSVlc2ksICVlYnAKKwltb3ZsCSVlYngsICVlYXgKKwltdWxsCSVlY3gKKwlhZGRsCSVlYnAsICVlZHgKKwlzYXJsCSQzMSwgJWVieAorCWltdWxsCSVlY3gsICVlYngKKwlhZGRsCSVlZHgsICVlYngKKwlzaGxkbAkkMSwgJWVheCwgJWVieAorCW1vdmwJMjAoJWVzcCksICVlYXgKKwlhZGRsCSVlYngsICglZWF4LCVlZGksNCkKKwlpbmNsCSVlZGkKKwljbXBsCSQxNTAsICVlZGkKKwlqbmUJTEJCMV8xCSMjIGJiMQorCitUaGUgaXNzdWUgaXMgdGhhdCB3ZSBob2lzdCB0aGUgY2FzdCBvZiAic2NhbGVyIiB0byBsb25nIGxvbmcgb3V0c2lkZSBvZiB0aGUKK2xvb3AsIHRoZSB2YWx1ZSBjb21lcyBpbnRvIHRoZSBsb29wIGFzIHR3byB2YWx1ZXMsIGFuZAorUmVnc0ZvclZhbHVlOjpnZXRDb3B5RnJvbVJlZ3MgZG9lc24ndCBrbm93IGhvdyB0byBwdXQgYW4gQXNzZXJ0U2V4dCBvbiB0aGUKK2NvbnN0cnVjdGVkIEJVSUxEX1BBSVIgd2hpY2ggcmVwcmVzZW50cyB0aGUgY2FzdCB2YWx1ZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUZXN0IGluc3RydWN0aW9ucyBjYW4gYmUgZWxpbWluYXRlZCBieSB1c2luZyBFRkxBR1MgdmFsdWVzIGZyb20gYXJpdGhtZXRpYworaW5zdHJ1Y3Rpb25zLiBUaGlzIGlzIGN1cnJlbnRseSBub3QgZG9uZSBmb3IgbXVsLCBhbmQsIG9yLCB4b3IsIG5lZywgc2hsLAorc3JhLCBzcmwsIHNobGQsIHNocmQsIGF0b21pYyBvcHMsIGFuZCBvdGhlcnMuIEl0IGlzIGFsc28gY3VycmVudGx5IG5vdCBkb25lCitmb3IgcmVhZC1tb2RpZnktd3JpdGUgaW5zdHJ1Y3Rpb25zLiBJdCBpcyBhbHNvIGN1cnJlbnQgbm90IGRvbmUgaWYgdGhlCitPRiBvciBDRiBmbGFncyBhcmUgbmVlZGVkLgorCitUaGUgc2hpZnQgb3BlcmF0b3JzIGhhdmUgdGhlIGNvbXBsaWNhdGlvbiB0aGF0IHdoZW4gdGhlIHNoaWZ0IGNvdW50IGlzCit6ZXJvLCBFRkxBR1MgaXMgbm90IHNldCwgc28gdGhleSBjYW4gb25seSBzdWJzdW1lIGEgdGVzdCBpbnN0cnVjdGlvbiBpZgordGhlIHNoaWZ0IGNvdW50IGlzIGtub3duIHRvIGJlIG5vbi16ZXJvLiBBbHNvLCB1c2luZyB0aGUgRUZMQUdTIHZhbHVlCitmcm9tIGEgc2hpZnQgaXMgYXBwYXJlbnRseSB2ZXJ5IHNsb3cgb24gc29tZSB4ODYgaW1wbGVtZW50YXRpb25zLgorCitJbiByZWFkLW1vZGlmeS13cml0ZSBpbnN0cnVjdGlvbnMsIHRoZSByb290IG5vZGUgaW4gdGhlIGlzZWwgbWF0Y2ggaXMKK3RoZSBzdG9yZSwgYW5kIGlzZWwgaGFzIG5vIHdheSBmb3IgdGhlIHVzZSBvZiB0aGUgRUZMQUdTIHJlc3VsdCBvZiB0aGUKK2FyaXRobWV0aWMgdG8gYmUgcmVtYXBwZWQgdG8gdGhlIG5ldyBub2RlLgorCitBZGQgYW5kIHN1YnRyYWN0IGluc3RydWN0aW9ucyBzZXQgT0Ygb24gc2lnbmVkIG92ZXJmbG93IGFuZCBDRiBvbiB1bnNpZ2VkCitvdmVyZmxvdywgd2hpbGUgdGVzdCBpbnN0cnVjdGlvbnMgYWx3YXlzIGNsZWFyIE9GIGFuZCBDRi4gSW4gb3JkZXIgdG8KK3JlcGxhY2UgYSB0ZXN0IHdpdGggYW4gYWRkIG9yIHN1YnRyYWN0IGluIGEgc2l0dWF0aW9uIHdoZXJlIE9GIG9yIENGIGlzCituZWVkZWQsIGNvZGVnZW4gbXVzdCBiZSBhYmxlIHRvIHByb3ZlIHRoYXQgdGhlIG9wZXJhdGlvbiBjYW5ub3Qgc2VlCitzaWduZWQgb3IgdW5zaWduZWQgb3ZlcmZsb3csIHJlc3BlY3RpdmVseS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCittZW1jcHkvbWVtbW92ZSBkbyBub3QgbG93ZXIgdG8gU1NFIGNvcGllcyB3aGVuIHBvc3NpYmxlLiAgQSBzaWxseSBleGFtcGxlIGlzOgorZGVmaW5lIDwxNiB4IGZsb2F0PiBAZm9vKDwxNiB4IGZsb2F0PiAlQSkgbm91bndpbmQgeworCSV0bXAgPSBhbGxvY2EgPDE2IHggZmxvYXQ+LCBhbGlnbiAxNgorCSV0bXAyID0gYWxsb2NhIDwxNiB4IGZsb2F0PiwgYWxpZ24gMTYKKwlzdG9yZSA8MTYgeCBmbG9hdD4gJUEsIDwxNiB4IGZsb2F0PiogJXRtcAorCSVzID0gYml0Y2FzdCA8MTYgeCBmbG9hdD4qICV0bXAgdG8gaTgqCisJJXMyID0gYml0Y2FzdCA8MTYgeCBmbG9hdD4qICV0bXAyIHRvIGk4KgorCWNhbGwgdm9pZCBAbGx2bS5tZW1jcHkuaTY0KGk4KiAlcywgaTgqICVzMiwgaTY0IDY0LCBpMzIgMTYpCisJJVIgPSBsb2FkIDwxNiB4IGZsb2F0PiogJXRtcDIKKwlyZXQgPDE2IHggZmxvYXQ+ICVSCit9CisKK2RlY2xhcmUgdm9pZCBAbGx2bS5tZW1jcHkuaTY0KGk4KiBub2NhcHR1cmUsIGk4KiBub2NhcHR1cmUsIGk2NCwgaTMyKSBub3Vud2luZAorCit3aGljaCBjb21waWxlcyB0bzoKKworX2ZvbzoKKwlzdWJsCSQxNDAsICVlc3AKKwltb3ZhcHMJJXhtbTMsIDExMiglZXNwKQorCW1vdmFwcwkleG1tMiwgOTYoJWVzcCkKKwltb3ZhcHMJJXhtbTEsIDgwKCVlc3ApCisJbW92YXBzCSV4bW0wLCA2NCglZXNwKQorCW1vdmwJNjAoJWVzcCksICVlYXgKKwltb3ZsCSVlYXgsIDEyNCglZXNwKQorCW1vdmwJNTYoJWVzcCksICVlYXgKKwltb3ZsCSVlYXgsIDEyMCglZXNwKQorCW1vdmwJNTIoJWVzcCksICVlYXgKKyAgICAgICAgPG1hbnkgbWFueSBtb3JlIDMyLWJpdCBjb3BpZXM+CisgICAgICAJbW92YXBzCSglZXNwKSwgJXhtbTAKKwltb3ZhcHMJMTYoJWVzcCksICV4bW0xCisJbW92YXBzCTMyKCVlc3ApLCAleG1tMgorCW1vdmFwcwk0OCglZXNwKSwgJXhtbTMKKwlhZGRsCSQxNDAsICVlc3AKKwlyZXQKKworT24gTmVoYWxlbSwgaXQgbWF5IGV2ZW4gYmUgY2hlYXBlciB0byBqdXN0IHVzZSBtb3Z1cHMgd2hlbiB1bmFsaWduZWQgdGhhbiB0bworZmFsbCBiYWNrIHRvIGxvd2VyLWdyYW51bGFyaXR5IGNodW5rcy4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbXBsZW1lbnQgcHJvY2Vzc29yLXNwZWNpZmljIG9wdGltaXphdGlvbnMgZm9yIHBhcml0eSB3aXRoIEdDQyBvbiB0aGVzZQorcHJvY2Vzc29ycy4gIEdDQyBkb2VzIHR3byBvcHRpbWl6YXRpb25zOgorCisxLiBpeDg2X3BhZF9yZXR1cm5zIGluc2VydHMgYSBub29wIGJlZm9yZSByZXQgaW5zdHJ1Y3Rpb25zIGlmIGltbWVkaWF0ZWx5CisgICBwcmVjZWVkZWQgYnkgYSBjb25kaXRpb25hbCBicmFuY2ggb3IgaXMgdGhlIHRhcmdldCBvZiBhIGp1bXAuCisyLiBpeDg2X2F2b2lkX2p1bXBfbWlzc3ByZWRpY3RzIGluc2VydHMgbm9vcHMgaW4gY2FzZXMgd2hlcmUgYSAxNi1ieXRlIGJsb2NrIG9mCisgICBjb2RlIGNvbnRhaW5zIG1vcmUgdGhhbiAzIGJyYW5jaGVzLgorICAgCitUaGUgZmlyc3Qgb25lIGlzIGRvbmUgZm9yIGFsbCBBTURzLCBDb3JlMiwgYW5kICJHZW5lcmljIgorVGhlIHNlY29uZCBvbmUgaXMgZG9uZSBmb3I6IEF0b20sIFBlbnRpdW0gUHJvLCBhbGwgQU1EcywgUGVudGl1bSA0LCBOb2NvbmEsCisgIENvcmUgMiwgYW5kICJHZW5lcmljIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1Rlc3RjYXNlOgoraW50IGEoaW50IHgpIHsgcmV0dXJuICh4ICYgMTI3KSA+IDMxOyB9CisKK0N1cnJlbnQgb3V0cHV0OgorCW1vdmwJNCglZXNwKSwgJWVheAorCWFuZGwJJDEyNywgJWVheAorCWNtcGwJJDMxLCAlZWF4CisJc2V0YQklYWwKKwltb3Z6YmwJJWFsLCAlZWF4CisJcmV0CisKK0lkZWFsIG91dHB1dDoKKwl4b3JsCSVlYXgsICVlYXgKKwl0ZXN0bAkkOTYsIDQoJWVzcCkKKwlzZXRuZQklYWwKKwlyZXQKKworVGhpcyBzaG91bGQgZGVmaW5pdGVseSBiZSBkb25lIGluIGluc3Rjb21iaW5lLCBjYW5vbmljYWxpemluZyB0aGUgcmFuZ2UKK2NvbmRpdGlvbiBpbnRvIGEgIT0gY29uZGl0aW9uLiAgV2UgZ2V0IHRoaXMgSVI6CisKK2RlZmluZSBpMzIgQGEoaTMyICV4KSBub3Vud2luZCByZWFkbm9uZSB7CitlbnRyeToKKwklMCA9IGFuZCBpMzIgJXgsIDEyNwkJOyA8aTMyPiBbI3VzZXM9MV0KKwklMSA9IGljbXAgdWd0IGkzMiAlMCwgMzEJCTsgPGkxPiBbI3VzZXM9MV0KKwklMiA9IHpleHQgaTEgJTEgdG8gaTMyCQk7IDxpMzI+IFsjdXNlcz0xXQorCXJldCBpMzIgJTIKK30KKworSW5zdGNvbWJpbmUgcHJlZmVycyB0byBzdHJlbmd0aCByZWR1Y2UgcmVsYXRpb25hbCBjb21wYXJpc29ucyB0byBlcXVhbGl0eQorY29tcGFyaXNvbnMgd2hlbiBwb3NzaWJsZSwgdGhpcyBzaG91bGQgYmUgYW5vdGhlciBjYXNlIG9mIHRoYXQuICBUaGlzIGNvdWxkCitiZSBoYW5kbGVkIHByZXR0eSBlYXNpbHkgaW4gSW5zdENvbWJpbmVyOjp2aXNpdElDbXBJbnN0V2l0aEluc3RBbmRJbnRDc3QsIGJ1dCBpdAorbG9va3MgbGlrZSBJbnN0Q29tYmluZXI6OnZpc2l0SUNtcEluc3RXaXRoSW5zdEFuZEludENzdCBzaG91bGQgcmVhbGx5IGFscmVhZHkKK2JlIHJlZGVzaWduZWQgdG8gdXNlIENvbXB1dGVNYXNrZWRCaXRzIGFuZCBmcmllbmRzLgorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK1Rlc3RjYXNlOgoraW50IHgoaW50IGEpIHsgcmV0dXJuIChhJjB4ZjApPj40OyB9CisKK0N1cnJlbnQgb3V0cHV0OgorCW1vdmwJNCglZXNwKSwgJWVheAorCXNocmwJJDQsICVlYXgKKwlhbmRsCSQxNSwgJWVheAorCXJldAorCitJZGVhbCBvdXRwdXQ6CisJbW92emJsCTQoJWVzcCksICVlYXgKKwlzaHJsCSQ0LCAlZWF4CisJcmV0CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVGVzdGNhc2U6CitpbnQgeChpbnQgYSkgeyByZXR1cm4gKGEgJiAweDgwKSA/IDB4MTAwIDogMDsgfQoraW50IHkoaW50IGEpIHsgcmV0dXJuIChhICYgMHg4MCkgKjI7IH0KKworQ3VycmVudDoKKwl0ZXN0bAkkMTI4LCA0KCVlc3ApCisJc2V0bmUJJWFsCisJbW92emJsCSVhbCwgJWVheAorCXNobGwJJDgsICVlYXgKKwlyZXQKKworQmV0dGVyOgorCW1vdmwJNCglZXNwKSwgJWVheAorCWFkZGwJJWVheCwgJWVheAorCWFuZGwJJDI1NiwgJWVheAorCXJldAorCitUaGlzIGlzIGFub3RoZXIgZ2VuZXJhbCBpbnN0Y29tYmluZSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGlzIHByb2ZpdGFibGUgb24gYWxsCit0YXJnZXRzLiAgSW4gTExWTSBJUiwgdGhlc2UgZnVuY3Rpb25zIGxvb2sgbGlrZSB0aGlzOgorCitkZWZpbmUgaTMyIEB4KGkzMiAlYSkgbm91bndpbmQgcmVhZG5vbmUgeworZW50cnk6CisJJTAgPSBhbmQgaTMyICVhLCAxMjgKKwklMSA9IGljbXAgZXEgaTMyICUwLCAwCisJJWlmdG1wLjAuMCA9IHNlbGVjdCBpMSAlMSwgaTMyIDAsIGkzMiAyNTYKKwlyZXQgaTMyICVpZnRtcC4wLjAKK30KKworZGVmaW5lIGkzMiBAeShpMzIgJWEpIG5vdW53aW5kIHJlYWRub25lIHsKK2VudHJ5OgorCSUwID0gc2hsIGkzMiAlYSwgMQorCSUxID0gYW5kIGkzMiAlMCwgMjU2CisJcmV0IGkzMiAlMQorfQorCitSZXBsYWNpbmcgYW4gaWNtcCtzZWxlY3Qgd2l0aCBhIHNoaWZ0IHNob3VsZCBhbHdheXMgYmUgY29uc2lkZXJlZCBwcm9maXRhYmxlIGluCitpbnN0Y29tYmluZS4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitSZS1pbXBsZW1lbnQgYXRvbWljIGJ1aWx0aW5zIF9fc3luY19hZGRfYW5kX2ZldGNoKCkgYW5kIF9fc3luY19zdWJfYW5kX2ZldGNoCitwcm9wZXJseS4KKworV2hlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCB1c2VkIChpLmUuIG9ubHkgY2FyZSBhYm91dCB0aGUgdmFsdWUgaW4gdGhlCittZW1vcnkpLCB4ODYgZG9lcyBub3QgaGF2ZSB0byB1c2UgYWRkIHRvIGltcGxlbWVudCB0aGVzZS4gSW5zdGVhZCwgaXQgY2FuIHVzZQorYWRkLCBzdWIsIGluYywgZGVjIGluc3RydWN0aW9ucyB3aXRoIHRoZSAibG9jayIgcHJlZml4LgorCitUaGlzIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCB1c2luZyBhIGJpdCBvZiBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gdHJpY2suIFRoZQoraXNzdWUgaXMgdGhlIHRhcmdldCBpbmRlcGVuZGVudCBwYXR0ZXJuIHByb2R1Y2VzIG9uZSBvdXRwdXQgYW5kIGEgY2hhaW4gYW5kIHdlCit3YW50IHRvIG1hcCBpdCBpbnRvIG9uZSB0aGF0IGp1c3Qgb3V0cHV0IGEgY2hhaW4uIFRoZSBjdXJyZW50IHRyaWNrIGlzIHRvIHNlbGVjdAoraXQgaW50byBhIE1FUkdFX1ZBTFVFUyB3aXRoIHRoZSBmaXJzdCBkZWZpbml0aW9uIGJlaW5nIGFuIGltcGxpY2l0X2RlZi4gVGhlCitwcm9wZXIgc29sdXRpb24gaXMgdG8gYWRkIG5ldyBJU0Qgb3Bjb2RlcyBmb3IgdGhlIG5vLW91dHB1dCB2YXJpYW50LiBEQUcKK2NvbWJpbmVyIGNhbiB0aGVuIHRyYW5zZm9ybSB0aGUgbm9kZSBiZWZvcmUgaXQgZ2V0cyB0byB0YXJnZXQgbm9kZSBzZWxlY3Rpb24uCisKK1Byb2JsZW0gIzIgaXMgd2UgYXJlIGFkZGluZyBhIHdob2xlIGJ1bmNoIG9mIHg4NiBhdG9taWMgaW5zdHJ1Y3Rpb25zIHdoZW4gaW4KK2ZhY3QgdGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBpZGVudGljYWwgdG8gdGhlIG5vbi1sb2NrIHZlcnNpb25zLiBXZSBuZWVkIGEgd2F5IHRvCithZGQgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIHRvIHRhcmdldCBub2RlcyBhbmQgaGF2ZSB0aGlzIGluZm9ybWF0aW9uCitjYXJyaWVkIG92ZXIgdG8gbWFjaGluZSBpbnN0cnVjdGlvbnMuIEFzbSBwcmludGVyIChvciBKSVQpIGNhbiB1c2UgdGhpcworaW5mb3JtYXRpb24gdG8gYWRkIHRoZSAibG9jayIgcHJlZml4LgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK19Cb29sIGJhcihpbnQgKngpIHsgcmV0dXJuICp4ICYgMTsgfQorCitkZWZpbmUgemVyb2V4dCBpMSBAYmFyKGkzMiogbm9jYXB0dXJlICV4KSBub3Vud2luZCByZWFkb25seSB7CitlbnRyeToKKyAgJXRtcDEgPSBsb2FkIGkzMiogJXggICAgICAgICAgICAgICAgICAgICAgICAgICAgOyA8aTMyPiBbI3VzZXM9MV0KKyAgJWFuZCA9IGFuZCBpMzIgJXRtcDEsIDEgICAgICAgICAgICAgICAgICAgICAgICAgOyA8aTMyPiBbI3VzZXM9MV0KKyAgJXRvYm9vbCA9IGljbXAgbmUgaTMyICVhbmQsIDAgICAgICAgICAgICAgICAgICAgOyA8aTE+IFsjdXNlcz0xXQorICByZXQgaTEgJXRvYm9vbAorfQorCitiYXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEBiYXIKKyMgQkIjMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJWVudHJ5CisJbW92bAk0KCVlc3ApLCAlZWF4CisJbW92YgkoJWVheCksICVhbAorCWFuZGIJJDEsICVhbAorCW1vdnpibAklYWwsICVlYXgKKwlyZXQKKworTWlzc2VkIG9wdGltaXphdGlvbjogc2hvdWxkIGJlIG1vdmwrYW5kbC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitDb25zaWRlciB0aGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgY29tcGlsZWQgd2l0aCBjbGFuZzoKK19Cb29sIGZvbyhpbnQgKngpIHsgcmV0dXJuICEoKnggJiA0KTsgfQordW5zaWduZWQgYmFyKGludCAqeCkgeyByZXR1cm4gISgqeCAmIDQpOyB9CisKK2ZvbzoKKwltb3ZsCTQoJWVzcCksICVlYXgKKwl0ZXN0YgkkNCwgKCVlYXgpCisJc2V0ZQklYWwKKwltb3Z6YmwJJWFsLCAlZWF4CisJcmV0CisKK2JhcjoKKwltb3ZsCTQoJWVzcCksICVlYXgKKwltb3ZsCSglZWF4KSwgJWVheAorCXNocmwJJDIsICVlYXgKKwlhbmRsCSQxLCAlZWF4CisJeG9ybAkkMSwgJWVheAorCXJldAorCitUaGUgc2Vjb25kIGZ1bmN0aW9uIGdlbmVyYXRlcyBtb3JlIGNvZGUgZXZlbiB0aG91Z2ggdGhlIHR3byBmdW5jdGlvbnMgYXJlCithcmUgZnVuY3Rpb25hbGx5IGlkZW50aWNhbC4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitUYWtlIHRoZSBmb2xsb3dpbmcgQyBjb2RlOgoraW50IHgoaW50IHkpIHsgcmV0dXJuICh5ICYgNjMpIDw8IDE0OyB9CisKK0NvZGUgcHJvZHVjZWQgYnkgZ2NjOgorCWFuZGwJJDYzLCAlZWRpCisJc2FsbAkkMTQsICVlZGkKKwltb3ZsCSVlZGksICVlYXgKKwlyZXQKKworQ29kZSBwcm9kdWNlZCBieSBjbGFuZzoKKwlzaGxsCSQxNCwgJWVkaQorCW1vdmwJJWVkaSwgJWVheAorCWFuZGwJJDEwMzIxOTIsICVlYXgKKwlyZXQKKworVGhlIGNvZGUgcHJvZHVjZWQgYnkgZ2NjIGlzIDMgYnl0ZXMgc2hvcnRlci4gIFRoaXMgc29ydCBvZiBjb25zdHJ1Y3Qgb2Z0ZW4KK3Nob3dzIHVwIHdpdGggYml0ZmllbGRzLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9TU0VEb21haW5GaXguY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvU1NFRG9tYWluRml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzY4MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvU1NFRG9tYWluRml4LmNwcApAQCAtMCwwICsxLDUwNiBAQAorLy89PT0tIFNTRURvbWFpbkZpeC5jcHAgLSBVc2UgcHJvcGVyIGludC9mbG9hdCBkb21haW4gZm9yIFNTRSAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFNTRURvbWFpbkZpeCBwYXNzLgorLy8KKy8vIFNvbWUgU1NFIGluc3RydWN0aW9ucyBsaWtlIG1vdiwgYW5kLCBvciwgeG9yIGFyZSBhdmFpbGFibGUgaW4gZGlmZmVyZW50CisvLyB2YXJpYW50cyBmb3IgZGlmZmVyZW50IG9wZXJhbmQgdHlwZXMuIFRoZXNlIHZhcmlhbnQgaW5zdHJ1Y3Rpb25zIGFyZQorLy8gZXF1aXZhbGVudCwgYnV0IG9uIE5laGFsZW0gYW5kIG5ld2VyIGNwdXMgdGhlcmUgaXMgZXh0cmEgbGF0ZW5jeQorLy8gdHJhbnNmZXJyaW5nIGRhdGEgYmV0d2VlbiBpbnRlZ2VyIGFuZCBmbG9hdGluZyBwb2ludCBkb21haW5zLgorLy8KKy8vIFRoaXMgcGFzcyBjaGFuZ2VzIHRoZSB2YXJpYW50IGluc3RydWN0aW9ucyB0byBtaW5pbWl6ZSBkb21haW4gY3Jvc3NpbmdzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAic3NlLWRvbWFpbi1maXgiCisjaW5jbHVkZSAiWDg2SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gQSBEb21haW5WYWx1ZSBpcyBhIGJpdCBsaWtlIExpdmVJbnRlcnZhbHMnIFZhbE5vLCBidXQgaXQgYWxzbyBrZWVwcyB0cmFjaworLy8vIG9mIGV4ZWN1dGlvbiBkb21haW5zLgorLy8vCisvLy8gQW4gb3BlbiBEb21haW5WYWx1ZSByZXByZXNlbnRzIGEgc2V0IG9mIGluc3RydWN0aW9ucyB0aGF0IGNhbiBzdGlsbCBzd2l0Y2gKKy8vLyBleGVjdXRpb24gZG9tYWluLiBNdWx0aXBsZSByZWdpc3RlcnMgbWF5IHJlZmVyIHRvIHRoZSBzYW1lIG9wZW4KKy8vLyBEb21haW5WYWx1ZSAtIHRoZXkgd2lsbCBldmVudHVhbGx5IGJlIGNvbGxhcHNlZCB0byB0aGUgc2FtZSBleGVjdXRpb24KKy8vLyBkb21haW4uCisvLy8KKy8vLyBBIGNvbGxhcHNlZCBEb21haW5WYWx1ZSByZXByZXNlbnRzIGEgc2luZ2xlIHJlZ2lzdGVyIHRoYXQgaGFzIGJlZW4gZm9yY2VkCisvLy8gaW50byBvbmUgb2YgbW9yZSBleGVjdXRpb24gZG9tYWlucy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSBjb2xsYXBzZWQKKy8vLyBEb21haW5WYWx1ZSBmb3IgZWFjaCByZWdpc3RlciwgYnV0IGl0IG1heSBjb250YWluIG11bHRpcGxlIGV4ZWN1dGlvbgorLy8vIGRvbWFpbnMuIEEgcmVnaXN0ZXIgdmFsdWUgaXMgaW5pdGlhbGx5IGNyZWF0ZWQgaW4gYSBzaW5nbGUgZXhlY3V0aW9uCisvLy8gZG9tYWluLCBidXQgaWYgd2Ugd2VyZSBmb3JjZWQgdG8gcGF5IHRoZSBwZW5hbHR5IG9mIGEgZG9tYWluIGNyb3NzaW5nLCB3ZQorLy8vIGtlZXAgdHJhY2sgb2YgdGhlIGZhY3QgdGhlIHRoZSByZWdpc3RlciBpcyBub3cgYXZhaWxhYmxlIGluIG11bHRpcGxlCisvLy8gZG9tYWlucy4KK25hbWVzcGFjZSB7CitzdHJ1Y3QgRG9tYWluVmFsdWUgeworICAvLyBCYXNpYyByZWZlcmVuY2UgY291bnRpbmcuCisgIHVuc2lnbmVkIFJlZnM7CisKKyAgLy8gQml0bWFzayBvZiBhdmFpbGFibGUgZG9tYWlucy4gRm9yIGFuIG9wZW4gRG9tYWluVmFsdWUsIGl0IGlzIHRoZSBzdGlsbAorICAvLyBwb3NzaWJsZSBkb21haW5zIGZvciBjb2xsYXBzaW5nLiBGb3IgYSBjb2xsYXBzZWQgRG9tYWluVmFsdWUgaXQgaXMgdGhlCisgIC8vIGRvbWFpbnMgd2hlcmUgdGhlIHJlZ2lzdGVyIGlzIGF2YWlsYWJsZSBmb3IgZnJlZS4KKyAgdW5zaWduZWQgQXZhaWxhYmxlRG9tYWluczsKKworICAvLyBQb3NpdGlvbiBvZiB0aGUgbGFzdCBkZWZpbmluZyBpbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgRGlzdDsKKworICAvLyBUd2lkZGxlYWJsZSBpbnN0cnVjdGlvbnMgdXNpbmcgb3IgZGVmaW5pbmcgdGhlc2UgcmVnaXN0ZXJzLgorICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA4PiBJbnN0cnM7CisKKyAgLy8gQSBjb2xsYXBzZWQgRG9tYWluVmFsdWUgaGFzIG5vIGluc3RydWN0aW9ucyB0byB0d2lkZGxlIC0gaXQgc2ltcGx5IGtlZXBzCisgIC8vIHRyYWNrIG9mIHRoZSBkb21haW5zIHdoZXJlIHRoZSByZWdpc3RlcnMgYXJlIGFscmVhZHkgYXZhaWxhYmxlLgorICBib29sIGlzQ29sbGFwc2VkKCkgY29uc3QgeyByZXR1cm4gSW5zdHJzLmVtcHR5KCk7IH0KKworICAvLyBJcyBkb21haW4gYXZhaWxhYmxlPworICBib29sIGhhc0RvbWFpbih1bnNpZ25lZCBkb21haW4pIGNvbnN0IHsKKyAgICByZXR1cm4gQXZhaWxhYmxlRG9tYWlucyAmICgxdSA8PCBkb21haW4pOworICB9CisKKyAgLy8gTWFyayBkb21haW4gYXMgYXZhaWxhYmxlLgorICB2b2lkIGFkZERvbWFpbih1bnNpZ25lZCBkb21haW4pIHsKKyAgICBBdmFpbGFibGVEb21haW5zIHw9IDF1IDw8IGRvbWFpbjsKKyAgfQorCisgIC8vIFJlc3RyaWN0IHRvIGEgc2luZ2xlIGRvbWFpbiBhdmFpbGFibGUuCisgIHZvaWQgc2V0U2luZ2xlRG9tYWluKHVuc2lnbmVkIGRvbWFpbikgeworICAgIEF2YWlsYWJsZURvbWFpbnMgPSAxdSA8PCBkb21haW47CisgIH0KKworICAvLyBSZXR1cm4gYml0bWFzayBvZiBkb21haW5zIHRoYXQgYXJlIGF2YWlsYWJsZSBhbmQgaW4gbWFzay4KKyAgdW5zaWduZWQgZ2V0Q29tbW9uRG9tYWlucyh1bnNpZ25lZCBtYXNrKSBjb25zdCB7CisgICAgcmV0dXJuIEF2YWlsYWJsZURvbWFpbnMgJiBtYXNrOworICB9CisKKyAgLy8gRmlyc3QgZG9tYWluIGF2YWlsYWJsZS4KKyAgdW5zaWduZWQgZ2V0Rmlyc3REb21haW4oKSBjb25zdCB7CisgICAgcmV0dXJuIENvdW50VHJhaWxpbmdaZXJvc18zMihBdmFpbGFibGVEb21haW5zKTsKKyAgfQorCisgIERvbWFpblZhbHVlKCkgeyBjbGVhcigpOyB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBSZWZzID0gQXZhaWxhYmxlRG9tYWlucyA9IERpc3QgPSAwOworICAgIEluc3Rycy5jbGVhcigpOworICB9Cit9OworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgTnVtUmVncyA9IDE2OworCituYW1lc3BhY2UgeworY2xhc3MgU1NFRG9tYWluRml4UGFzcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgc3RhdGljIGNoYXIgSUQ7CisgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxEb21haW5WYWx1ZT4gQWxsb2NhdG9yOworICBTbWFsbFZlY3RvcjxEb21haW5WYWx1ZSosMTY+IEF2YWlsOworCisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIGNvbnN0IFg4Nkluc3RySW5mbyAqVElJOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQjsKKyAgRG9tYWluVmFsdWUgKipMaXZlUmVnczsKKyAgdHlwZWRlZiBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosRG9tYWluVmFsdWUqKj4gTGl2ZU91dE1hcDsKKyAgTGl2ZU91dE1hcCBMaXZlT3V0czsKKyAgdW5zaWduZWQgRGlzdGFuY2U7CisKK3B1YmxpYzoKKyAgU1NFRG9tYWluRml4UGFzcygpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICB9CisKKyAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJTU0UgZXhlY3V0aW9uIGRvbWFpbiBmaXh1cCI7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gUmVnaXN0ZXIgbWFwcGluZy4KKyAgaW50IFJlZ0luZGV4KHVuc2lnbmVkIFJlZyk7CisKKyAgLy8gRG9tYWluVmFsdWUgYWxsb2NhdGlvbi4KKyAgRG9tYWluVmFsdWUgKkFsbG9jKGludCBkb21haW4gPSAtMSk7CisgIHZvaWQgUmVjeWNsZShEb21haW5WYWx1ZSopOworCisgIC8vIExpdmVSZWdzIG1hbmlwdWxhdGlvbnMuCisgIHZvaWQgU2V0TGl2ZVJlZyhpbnQgcngsIERvbWFpblZhbHVlICpEVik7CisgIHZvaWQgS2lsbChpbnQgcngpOworICB2b2lkIEZvcmNlKGludCByeCwgdW5zaWduZWQgZG9tYWluKTsKKyAgdm9pZCBDb2xsYXBzZShEb21haW5WYWx1ZSAqZHYsIHVuc2lnbmVkIGRvbWFpbik7CisgIGJvb2wgTWVyZ2UoRG9tYWluVmFsdWUgKkEsIERvbWFpblZhbHVlICpCKTsKKworICB2b2lkIGVudGVyQmFzaWNCbG9jaygpOworICB2b2lkIHZpc2l0R2VuZXJpY0luc3RyKE1hY2hpbmVJbnN0ciopOworICB2b2lkIHZpc2l0U29mdEluc3RyKE1hY2hpbmVJbnN0ciosIHVuc2lnbmVkIG1hc2spOworICB2b2lkIHZpc2l0SGFyZEluc3RyKE1hY2hpbmVJbnN0ciosIHVuc2lnbmVkIGRvbWFpbik7Cit9OworfQorCitjaGFyIFNTRURvbWFpbkZpeFBhc3M6OklEID0gMDsKKworLy8vIFRyYW5zbGF0ZSBUUkkgcmVnaXN0ZXIgbnVtYmVyIHRvIGFuIGluZGV4IGludG8gb3VyIHNtYWxsZXIgdGFibGVzIG9mCisvLy8gaW50ZXJlc3RpbmcgcmVnaXN0ZXJzLiBSZXR1cm4gLTEgZm9yIGJvcmluZyByZWdpc3RlcnMuCitpbnQgU1NFRG9tYWluRml4UGFzczo6UmVnSW5kZXgodW5zaWduZWQgcmVnKSB7CisgIGFzc2VydChYODY6OlhNTTE1ID09IFg4Njo6WE1NMCtOdW1SZWdzLTEgJiYgIlVuZXhwZWN0ZWQgc29ydCIpOworICByZWcgLT0gWDg2OjpYTU0wOworICByZXR1cm4gcmVnIDwgTnVtUmVncyA/IChpbnQpIHJlZyA6IC0xOworfQorCitEb21haW5WYWx1ZSAqU1NFRG9tYWluRml4UGFzczo6QWxsb2MoaW50IGRvbWFpbikgeworICBEb21haW5WYWx1ZSAqZHYgPSBBdmFpbC5lbXB0eSgpID8KKyAgICAgICAgICAgICAgICAgICAgICBuZXcoQWxsb2NhdG9yLkFsbG9jYXRlKCkpIERvbWFpblZhbHVlIDoKKyAgICAgICAgICAgICAgICAgICAgICBBdmFpbC5wb3BfYmFja192YWwoKTsKKyAgZHYtPkRpc3QgPSBEaXN0YW5jZTsKKyAgaWYgKGRvbWFpbiA+PSAwKQorICAgIGR2LT5hZGREb21haW4oZG9tYWluKTsKKyAgcmV0dXJuIGR2OworfQorCit2b2lkIFNTRURvbWFpbkZpeFBhc3M6OlJlY3ljbGUoRG9tYWluVmFsdWUgKmR2KSB7CisgIGFzc2VydChkdiAmJiAiQ2Fubm90IHJlY3ljbGUgTlVMTCIpOworICBkdi0+Y2xlYXIoKTsKKyAgQXZhaWwucHVzaF9iYWNrKGR2KTsKK30KKworLy8vIFNldCBMaXZlUmVnc1tyeF0gPSBkdiwgdXBkYXRpbmcgcmVmZXJlbmNlIGNvdW50cy4KK3ZvaWQgU1NFRG9tYWluRml4UGFzczo6U2V0TGl2ZVJlZyhpbnQgcngsIERvbWFpblZhbHVlICpkdikgeworICBhc3NlcnQodW5zaWduZWQocngpIDwgTnVtUmVncyAmJiAiSW52YWxpZCBpbmRleCIpOworICBpZiAoIUxpdmVSZWdzKSB7CisgICAgTGl2ZVJlZ3MgPSBuZXcgRG9tYWluVmFsdWUqW051bVJlZ3NdOworICAgIHN0ZDo6ZmlsbChMaXZlUmVncywgTGl2ZVJlZ3MrTnVtUmVncywgKERvbWFpblZhbHVlKikwKTsKKyAgfQorCisgIGlmIChMaXZlUmVnc1tyeF0gPT0gZHYpCisgICAgcmV0dXJuOworICBpZiAoTGl2ZVJlZ3NbcnhdKSB7CisgICAgYXNzZXJ0KExpdmVSZWdzW3J4XS0+UmVmcyAmJiAiQmFkIHJlZmNvdW50Iik7CisgICAgaWYgKC0tTGl2ZVJlZ3NbcnhdLT5SZWZzID09IDApIFJlY3ljbGUoTGl2ZVJlZ3NbcnhdKTsKKyAgfQorICBMaXZlUmVnc1tyeF0gPSBkdjsKKyAgaWYgKGR2KSArK2R2LT5SZWZzOworfQorCisvLyBLaWxsIHJlZ2lzdGVyIHJ4LCByZWN5Y2xlIG9yIGNvbGxhcHNlIGFueSBEb21haW5WYWx1ZS4KK3ZvaWQgU1NFRG9tYWluRml4UGFzczo6S2lsbChpbnQgcngpIHsKKyAgYXNzZXJ0KHVuc2lnbmVkKHJ4KSA8IE51bVJlZ3MgJiYgIkludmFsaWQgaW5kZXgiKTsKKyAgaWYgKCFMaXZlUmVncyB8fCAhTGl2ZVJlZ3NbcnhdKSByZXR1cm47CisKKyAgLy8gQmVmb3JlIGtpbGxpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGFuIG9wZW4gRG9tYWluVmFsdWUsIGNvbGxhcHNlIGl0IHRvCisgIC8vIHRoZSBmaXJzdCBhdmFpbGFibGUgZG9tYWluLgorICBpZiAoTGl2ZVJlZ3NbcnhdLT5SZWZzID09IDEgJiYgIUxpdmVSZWdzW3J4XS0+aXNDb2xsYXBzZWQoKSkKKyAgICBDb2xsYXBzZShMaXZlUmVnc1tyeF0sIExpdmVSZWdzW3J4XS0+Z2V0Rmlyc3REb21haW4oKSk7CisgIGVsc2UKKyAgICBTZXRMaXZlUmVnKHJ4LCAwKTsKK30KKworLy8vIEZvcmNlIHJlZ2lzdGVyIHJ4IGludG8gZG9tYWluLgordm9pZCBTU0VEb21haW5GaXhQYXNzOjpGb3JjZShpbnQgcngsIHVuc2lnbmVkIGRvbWFpbikgeworICBhc3NlcnQodW5zaWduZWQocngpIDwgTnVtUmVncyAmJiAiSW52YWxpZCBpbmRleCIpOworICBEb21haW5WYWx1ZSAqZHY7CisgIGlmIChMaXZlUmVncyAmJiAoZHYgPSBMaXZlUmVnc1tyeF0pKSB7CisgICAgaWYgKGR2LT5pc0NvbGxhcHNlZCgpKQorICAgICAgZHYtPmFkZERvbWFpbihkb21haW4pOworICAgIGVsc2UgaWYgKGR2LT5oYXNEb21haW4oZG9tYWluKSkKKyAgICAgIENvbGxhcHNlKGR2LCBkb21haW4pOworICAgIGVsc2UgeworICAgICAgLy8gVGhpcyBpcyBhbiBpbmNvbXBhdGlibGUgb3BlbiBEb21haW5WYWx1ZS4gQ29sbGFwc2UgaXQgdG8gd2hhdGV2ZXIgYW5kIGZvcmNlCisgICAgICAvLyB0aGUgbmV3IHZhbHVlIGludG8gZG9tYWluLiBUaGlzIGNvc3RzIGEgZG9tYWluIGNyb3NzaW5nLgorICAgICAgQ29sbGFwc2UoZHYsIGR2LT5nZXRGaXJzdERvbWFpbigpKTsKKyAgICAgIGFzc2VydChMaXZlUmVnc1tyeF0gJiYgIk5vdCBsaXZlIGFmdGVyIGNvbGxhcHNlPyIpOworICAgICAgTGl2ZVJlZ3NbcnhdLT5hZGREb21haW4oZG9tYWluKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gU2V0IHVwIGJhc2ljIGNvbGxhcHNlZCBEb21haW5WYWx1ZS4KKyAgICBTZXRMaXZlUmVnKHJ4LCBBbGxvYyhkb21haW4pKTsKKyAgfQorfQorCisvLy8gQ29sbGFwc2Ugb3BlbiBEb21haW5WYWx1ZSBpbnRvIGdpdmVuIGRvbWFpbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCisvLy8gcmVnaXN0ZXJzIHVzaW5nIGR2LCB0aGV5IGVhY2ggZ2V0IGEgdW5pcXVlIGNvbGxhcHNlZCBEb21haW5WYWx1ZS4KK3ZvaWQgU1NFRG9tYWluRml4UGFzczo6Q29sbGFwc2UoRG9tYWluVmFsdWUgKmR2LCB1bnNpZ25lZCBkb21haW4pIHsKKyAgYXNzZXJ0KGR2LT5oYXNEb21haW4oZG9tYWluKSAmJiAiQ2Fubm90IGNvbGxhcHNlIik7CisKKyAgLy8gQ29sbGFwc2UgYWxsIHRoZSBpbnN0cnVjdGlvbnMuCisgIHdoaWxlICghZHYtPkluc3Rycy5lbXB0eSgpKQorICAgIFRJSS0+U2V0U1NFRG9tYWluKGR2LT5JbnN0cnMucG9wX2JhY2tfdmFsKCksIGRvbWFpbik7CisgIGR2LT5zZXRTaW5nbGVEb21haW4oZG9tYWluKTsKKworICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgdXNlcnMsIGdpdmUgdGhlbSBuZXcsIHVuaXF1ZSBEb21haW5WYWx1ZXMuCisgIGlmIChMaXZlUmVncyAmJiBkdi0+UmVmcyA+IDEpCisgICAgZm9yICh1bnNpZ25lZCByeCA9IDA7IHJ4ICE9IE51bVJlZ3M7ICsrcngpCisgICAgICBpZiAoTGl2ZVJlZ3NbcnhdID09IGR2KQorICAgICAgICBTZXRMaXZlUmVnKHJ4LCBBbGxvYyhkb21haW4pKTsKK30KKworLy8vIE1lcmdlIC0gQWxsIGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzIGluIEIgYXJlIG1vdmVkIHRvIEEsIGFuZCBCIGlzCisvLy8gcmVsZWFzZWQuCitib29sIFNTRURvbWFpbkZpeFBhc3M6Ok1lcmdlKERvbWFpblZhbHVlICpBLCBEb21haW5WYWx1ZSAqQikgeworICBhc3NlcnQoIUEtPmlzQ29sbGFwc2VkKCkgJiYgIkNhbm5vdCBtZXJnZSBpbnRvIGNvbGxhcHNlZCIpOworICBhc3NlcnQoIUItPmlzQ29sbGFwc2VkKCkgJiYgIkNhbm5vdCBtZXJnZSBmcm9tIGNvbGxhcHNlZCIpOworICBpZiAoQSA9PSBCKQorICAgIHJldHVybiB0cnVlOworICAvLyBSZXN0cmljdCB0byB0aGUgZG9tYWlucyB0aGF0IEEgYW5kIEIgaGF2ZSBpbiBjb21tb24uCisgIHVuc2lnbmVkIGNvbW1vbiA9IEEtPmdldENvbW1vbkRvbWFpbnMoQi0+QXZhaWxhYmxlRG9tYWlucyk7CisgIGlmICghY29tbW9uKQorICAgIHJldHVybiBmYWxzZTsKKyAgQS0+QXZhaWxhYmxlRG9tYWlucyA9IGNvbW1vbjsKKyAgQS0+RGlzdCA9IHN0ZDo6bWF4KEEtPkRpc3QsIEItPkRpc3QpOworICBBLT5JbnN0cnMuYXBwZW5kKEItPkluc3Rycy5iZWdpbigpLCBCLT5JbnN0cnMuZW5kKCkpOworICBmb3IgKHVuc2lnbmVkIHJ4ID0gMDsgcnggIT0gTnVtUmVnczsgKytyeCkKKyAgICBpZiAoTGl2ZVJlZ3NbcnhdID09IEIpCisgICAgICBTZXRMaXZlUmVnKHJ4LCBBKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU1NFRG9tYWluRml4UGFzczo6ZW50ZXJCYXNpY0Jsb2NrKCkgeworICAvLyBUcnkgdG8gY29hbGVzY2UgbGl2ZS1vdXQgcmVnaXN0ZXJzIGZyb20gcHJlZGVjZXNzb3JzLgorICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjpsaXZlaW5faXRlcmF0b3IgaSA9IE1CQi0+bGl2ZWluX2JlZ2luKCksCisgICAgICAgICBlID0gTUJCLT5saXZlaW5fZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaW50IHJ4ID0gUmVnSW5kZXgoKmkpOworICAgIGlmIChyeCA8IDApIGNvbnRpbnVlOworICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X3ByZWRfaXRlcmF0b3IgcGkgPSBNQkItPnByZWRfYmVnaW4oKSwKKyAgICAgICAgICAgcGUgPSBNQkItPnByZWRfZW5kKCk7IHBpICE9IHBlOyArK3BpKSB7CisgICAgICBMaXZlT3V0TWFwOjpjb25zdF9pdGVyYXRvciBmaSA9IExpdmVPdXRzLmZpbmQoKnBpKTsKKyAgICAgIGlmIChmaSA9PSBMaXZlT3V0cy5lbmQoKSkgY29udGludWU7CisgICAgICBEb21haW5WYWx1ZSAqcGR2ID0gZmktPnNlY29uZFtyeF07CisgICAgICBpZiAoIXBkdikgY29udGludWU7CisgICAgICBpZiAoIUxpdmVSZWdzIHx8ICFMaXZlUmVnc1tyeF0pIHsKKyAgICAgICAgU2V0TGl2ZVJlZyhyeCwgcGR2KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFdlIGhhdmUgYSBsaXZlIERvbWFpblZhbHVlIGZyb20gbW9yZSB0aGFuIG9uZSBwcmVkZWNlc3Nvci4KKyAgICAgIGlmIChMaXZlUmVnc1tyeF0tPmlzQ29sbGFwc2VkKCkpIHsKKyAgICAgICAgLy8gV2UgYXJlIGFscmVhZHkgY29sbGFwc2VkLCBidXQgcHJlZGVjZXNzb3IgaXMgbm90LiBGb3JjZSBoaW0uCisgICAgICAgIHVuc2lnbmVkIGRvbWFpbiA9IExpdmVSZWdzW3J4XS0+Z2V0Rmlyc3REb21haW4oKTsKKyAgICAgICAgaWYgKCFwZHYtPmlzQ29sbGFwc2VkKCkgJiYgcGR2LT5oYXNEb21haW4oZG9tYWluKSkKKyAgICAgICAgICBDb2xsYXBzZShwZHYsIGRvbWFpbik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBDdXJyZW50bHkgb3BlbiwgbWVyZ2UgaW4gcHJlZGVjZXNzb3IuCisgICAgICBpZiAoIXBkdi0+aXNDb2xsYXBzZWQoKSkKKyAgICAgICAgTWVyZ2UoTGl2ZVJlZ3NbcnhdLCBwZHYpOworICAgICAgZWxzZQorICAgICAgICBGb3JjZShyeCwgcGR2LT5nZXRGaXJzdERvbWFpbigpKTsKKyAgICB9CisgIH0KK30KKworLy8gQSBoYXJkIGluc3RydWN0aW9uIG9ubHkgd29ya3MgaW4gb25lIGRvbWFpbi4gQWxsIGlucHV0IHJlZ2lzdGVycyB3aWxsIGJlCisvLyBmb3JjZWQgaW50byB0aGF0IGRvbWFpbi4KK3ZvaWQgU1NFRG9tYWluRml4UGFzczo6dmlzaXRIYXJkSW5zdHIoTWFjaGluZUluc3RyICptaSwgdW5zaWduZWQgZG9tYWluKSB7CisgIC8vIENvbGxhcHNlIGFsbCB1c2VzLgorICBmb3IgKHVuc2lnbmVkIGkgPSBtaS0+Z2V0RGVzYygpLmdldE51bURlZnMoKSwKKyAgICAgICAgICAgICAgICBlID0gbWktPmdldERlc2MoKS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZtbyA9IG1pLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghbW8uaXNSZWcoKSkgY29udGludWU7CisgICAgaW50IHJ4ID0gUmVnSW5kZXgobW8uZ2V0UmVnKCkpOworICAgIGlmIChyeCA8IDApIGNvbnRpbnVlOworICAgIEZvcmNlKHJ4LCBkb21haW4pOworICB9CisKKyAgLy8gS2lsbCBhbGwgZGVmcyBhbmQgZm9yY2UgdGhlbS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IG1pLT5nZXREZXNjKCkuZ2V0TnVtRGVmcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZtbyA9IG1pLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghbW8uaXNSZWcoKSkgY29udGludWU7CisgICAgaW50IHJ4ID0gUmVnSW5kZXgobW8uZ2V0UmVnKCkpOworICAgIGlmIChyeCA8IDApIGNvbnRpbnVlOworICAgIEtpbGwocngpOworICAgIEZvcmNlKHJ4LCBkb21haW4pOworICB9Cit9CisKKy8vIEEgc29mdCBpbnN0cnVjdGlvbiBjYW4gYmUgY2hhbmdlZCB0byB3b3JrIGluIG90aGVyIGRvbWFpbnMgZ2l2ZW4gYnkgbWFzay4KK3ZvaWQgU1NFRG9tYWluRml4UGFzczo6dmlzaXRTb2Z0SW5zdHIoTWFjaGluZUluc3RyICptaSwgdW5zaWduZWQgbWFzaykgeworICAvLyBCaXRtYXNrIG9mIGF2YWlsYWJsZSBkb21haW5zIGZvciB0aGlzIGluc3RydWN0aW9uIGFmdGVyIHRha2luZyBjb2xsYXBzZWQKKyAgLy8gb3BlcmFuZHMgaW50byBhY2NvdW50LgorICB1bnNpZ25lZCBhdmFpbGFibGUgPSBtYXNrOworCisgIC8vIFNjYW4gdGhlIGV4cGxpY2l0IHVzZSBvcGVyYW5kcyBmb3IgaW5jb21pbmcgZG9tYWlucy4KKyAgU21hbGxWZWN0b3I8aW50LCA0PiB1c2VkOworICBpZiAoTGl2ZVJlZ3MpCisgICAgZm9yICh1bnNpZ25lZCBpID0gbWktPmdldERlc2MoKS5nZXROdW1EZWZzKCksCisgICAgICAgICAgICAgICAgICBlID0gbWktPmdldERlc2MoKS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJm1vID0gbWktPmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoIW1vLmlzUmVnKCkpIGNvbnRpbnVlOworICAgICAgaW50IHJ4ID0gUmVnSW5kZXgobW8uZ2V0UmVnKCkpOworICAgICAgaWYgKHJ4IDwgMCkgY29udGludWU7CisgICAgICBpZiAoRG9tYWluVmFsdWUgKmR2ID0gTGl2ZVJlZ3NbcnhdKSB7CisgICAgICAgIC8vIEJpdG1hc2sgb2YgZG9tYWlucyB0aGF0IGR2IGFuZCBhdmFpbGFibGUgaGF2ZSBpbiBjb21tb24uCisgICAgICAgIHVuc2lnbmVkIGNvbW1vbiA9IGR2LT5nZXRDb21tb25Eb21haW5zKGF2YWlsYWJsZSk7CisgICAgICAgIC8vIElzIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGlzIGNvbGxhcHNlZCByZWdpc3RlciBmb3IgZnJlZT8KKyAgICAgICAgaWYgKGR2LT5pc0NvbGxhcHNlZCgpKSB7CisgICAgICAgICAgLy8gUmVzdHJpY3QgYXZhaWxhYmxlIGRvbWFpbnMgdG8gdGhlIG9uZXMgaW4gY29tbW9uIHdpdGggdGhlIG9wZXJhbmQuCisgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGNvbW1vbiBkb21haW5zLCB3ZSBtdXN0IHBheSB0aGUgY3Jvc3MtZG9tYWluIAorICAgICAgICAgIC8vIHBlbmFsdHkgZm9yIHRoaXMgb3BlcmFuZC4KKyAgICAgICAgICBpZiAoY29tbW9uKSBhdmFpbGFibGUgPSBjb21tb247CisgICAgICAgIH0gZWxzZSBpZiAoY29tbW9uKQorICAgICAgICAgIC8vIE9wZW4gRG9tYWluVmFsdWUgaXMgY29tcGF0aWJsZSwgc2F2ZSBpdCBmb3IgbWVyZ2luZy4KKyAgICAgICAgICB1c2VkLnB1c2hfYmFjayhyeCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvLyBPcGVuIERvbWFpblZhbHVlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggaW5zdHJ1Y3Rpb24uIEl0IGlzIHVzZWxlc3MKKyAgICAgICAgICAvLyBub3cuCisgICAgICAgICAgS2lsbChyeCk7CisgICAgICB9CisgICAgfQorCisgIC8vIElmIHRoZSBjb2xsYXBzZWQgb3BlcmFuZHMgZm9yY2UgYSBzaW5nbGUgZG9tYWluLCBwcm9wYWdhdGUgdGhlIGNvbGxhcHNlLgorICBpZiAoaXNQb3dlck9mMl8zMihhdmFpbGFibGUpKSB7CisgICAgdW5zaWduZWQgZG9tYWluID0gQ291bnRUcmFpbGluZ1plcm9zXzMyKGF2YWlsYWJsZSk7CisgICAgVElJLT5TZXRTU0VEb21haW4obWksIGRvbWFpbik7CisgICAgdmlzaXRIYXJkSW5zdHIobWksIGRvbWFpbik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gS2lsbCBvZmYgYW55IHJlbWFpbmluZyB1c2VzIHRoYXQgZG9uJ3QgbWF0Y2ggYXZhaWxhYmxlLCBhbmQgYnVpbGQgYSBsaXN0IG9mCisgIC8vIGluY29taW5nIERvbWFpblZhbHVlcyB0aGF0IHdlIHdhbnQgdG8gbWVyZ2UuCisgIFNtYWxsVmVjdG9yPERvbWFpblZhbHVlKiw0PiBkb21zOworICBmb3IgKFNtYWxsVmVjdG9yPGludCwgND46Oml0ZXJhdG9yIGk9dXNlZC5iZWdpbigpLCBlPXVzZWQuZW5kKCk7IGkhPWU7ICsraSkgeworICAgIGludCByeCA9ICppOworICAgIERvbWFpblZhbHVlICpkdiA9IExpdmVSZWdzW3J4XTsKKyAgICAvLyBUaGlzIHVzZWxlc3MgRG9tYWluVmFsdWUgY291bGQgaGF2ZSBiZWVuIG1pc3NlZCBhYm92ZS4KKyAgICBpZiAoIWR2LT5nZXRDb21tb25Eb21haW5zKGF2YWlsYWJsZSkpIHsKKyAgICAgIEtpbGwoKmkpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIHNvcnRlZCwgdW5pcXVlZCBpbnNlcnQuCisgICAgYm9vbCBpbnNlcnRlZCA9IGZhbHNlOworICAgIGZvciAoU21hbGxWZWN0b3I8RG9tYWluVmFsdWUqLDQ+OjppdGVyYXRvciBpID0gZG9tcy5iZWdpbigpLCBlID0gZG9tcy5lbmQoKTsKKyAgICAgICAgICAgaSAhPSBlICYmICFpbnNlcnRlZDsgKytpKSB7CisgICAgICBpZiAoZHYgPT0gKmkpCisgICAgICAgIGluc2VydGVkID0gdHJ1ZTsKKyAgICAgIGVsc2UgaWYgKGR2LT5EaXN0IDwgKCppKS0+RGlzdCkgeworICAgICAgICBpbnNlcnRlZCA9IHRydWU7CisgICAgICAgIGRvbXMuaW5zZXJ0KGksIGR2KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpbnNlcnRlZCkKKyAgICAgIGRvbXMucHVzaF9iYWNrKGR2KTsKKyAgfQorCisgIC8vIGRvbXMgYXJlIG5vdyBzb3J0ZWQgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZS4gVHJ5IHRvIG1lcmdlIHRoZW0gYWxsLCBnaXZpbmcKKyAgLy8gcHJpb3JpdHkgdG8gdGhlIGxhdGVzdCBvbmVzLgorICBEb21haW5WYWx1ZSAqZHYgPSAwOworICB3aGlsZSAoIWRvbXMuZW1wdHkoKSkgeworICAgIGlmICghZHYpIHsKKyAgICAgIGR2ID0gZG9tcy5wb3BfYmFja192YWwoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIERvbWFpblZhbHVlICpsYXRlc3QgPSBkb21zLnBvcF9iYWNrX3ZhbCgpOworICAgIGlmIChNZXJnZShkdiwgbGF0ZXN0KSkgY29udGludWU7CisKKyAgICAvLyBJZiBsYXRlc3QgZGlkbid0IG1lcmdlLCBpdCBpcyB1c2VsZXNzIG5vdy4gS2lsbCBhbGwgcmVnaXN0ZXJzIHVzaW5nIGl0LgorICAgIGZvciAoU21hbGxWZWN0b3I8aW50LDQ+OjppdGVyYXRvciBpPXVzZWQuYmVnaW4oKSwgZT11c2VkLmVuZCgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChMaXZlUmVnc1sqaV0gPT0gbGF0ZXN0KQorICAgICAgICBLaWxsKCppKTsKKyAgfQorCisgIC8vIGR2IGlzIHRoZSBEb21haW5WYWx1ZSB3ZSBhcmUgZ29pbmcgdG8gdXNlIGZvciB0aGlzIGluc3RydWN0aW9uLgorICBpZiAoIWR2KQorICAgIGR2ID0gQWxsb2MoKTsKKyAgZHYtPkRpc3QgPSBEaXN0YW5jZTsKKyAgZHYtPkF2YWlsYWJsZURvbWFpbnMgPSBhdmFpbGFibGU7CisgIGR2LT5JbnN0cnMucHVzaF9iYWNrKG1pKTsKKworICAvLyBGaW5hbGx5IHNldCBhbGwgZGVmcyBhbmQgbm9uLWNvbGxhcHNlZCB1c2VzIHRvIGR2LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gbWktPmdldERlc2MoKS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZtbyA9IG1pLT5nZXRPcGVyYW5kKGkpOworICAgIGlmICghbW8uaXNSZWcoKSkgY29udGludWU7CisgICAgaW50IHJ4ID0gUmVnSW5kZXgobW8uZ2V0UmVnKCkpOworICAgIGlmIChyeCA8IDApIGNvbnRpbnVlOworICAgIGlmICghTGl2ZVJlZ3MgfHwgIUxpdmVSZWdzW3J4XSB8fCAobW8uaXNEZWYoKSAmJiBMaXZlUmVnc1tyeF0hPWR2KSkgeworICAgICAgS2lsbChyeCk7CisgICAgICBTZXRMaXZlUmVnKHJ4LCBkdik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU1NFRG9tYWluRml4UGFzczo6dmlzaXRHZW5lcmljSW5zdHIoTWFjaGluZUluc3RyICptaSkgeworICAvLyBQcm9jZXNzIGV4cGxpY2l0IGRlZnMsIGtpbGwgYW55IFhNTSByZWdpc3RlcnMgcmVkZWZpbmVkLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gbWktPmdldERlc2MoKS5nZXROdW1EZWZzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJm1vID0gbWktPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKCFtby5pc1JlZygpKSBjb250aW51ZTsKKyAgICBpbnQgcnggPSBSZWdJbmRleChtby5nZXRSZWcoKSk7CisgICAgaWYgKHJ4IDwgMCkgY29udGludWU7CisgICAgS2lsbChyeCk7CisgIH0KK30KKworYm9vbCBTU0VEb21haW5GaXhQYXNzOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJm1mKSB7CisgIE1GID0gJm1mOworICBUSUkgPSBzdGF0aWNfY2FzdDxjb25zdCBYODZJbnN0ckluZm8qPihNRi0+Z2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCkpOworICBUUkkgPSBNRi0+Z2V0VGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIE1CQiA9IDA7CisgIExpdmVSZWdzID0gMDsKKyAgRGlzdGFuY2UgPSAwOworICBhc3NlcnQoTnVtUmVncyA9PSBYODY6OlZSMTI4UmVnQ2xhc3MuZ2V0TnVtUmVncygpICYmICJCYWQgcmVnY2xhc3MiKTsKKworICAvLyBJZiBubyBYTU0gcmVnaXN0ZXJzIGFyZSB1c2VkIGluIHRoZSBmdW5jdGlvbiwgd2UgY2FuIHNraXAgaXQgY29tcGxldGVseS4KKyAgYm9vbCBhbnlyZWdzID0gZmFsc2U7CisgIGZvciAoVGFyZ2V0UmVnaXN0ZXJDbGFzczo6Y29uc3RfaXRlcmF0b3IgSSA9IFg4Njo6VlIxMjhSZWdDbGFzcy5iZWdpbigpLAorICAgICAgICAgRSA9IFg4Njo6VlIxMjhSZWdDbGFzcy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKE1GLT5nZXRSZWdJbmZvKCkuaXNQaHlzUmVnVXNlZCgqSSkpIHsKKyAgICAgIGFueXJlZ3MgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICBpZiAoIWFueXJlZ3MpIHJldHVybiBmYWxzZTsKKworICBNYWNoaW5lQmFzaWNCbG9jayAqRW50cnkgPSBNRi0+YmVnaW4oKTsKKyAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLCAxNj4gVmlzaXRlZDsKKyAgZm9yIChkZl9leHRfaXRlcmF0b3I8TWFjaGluZUJhc2ljQmxvY2sqLCBTbWFsbFB0clNldDxNYWNoaW5lQmFzaWNCbG9jayosIDE2PiA+CisgICAgICAgICBERkkgPSBkZl9leHRfYmVnaW4oRW50cnksIFZpc2l0ZWQpLCBERkUgPSBkZl9leHRfZW5kKEVudHJ5LCBWaXNpdGVkKTsKKyAgICAgICAgIERGSSAhPSBERkU7ICsrREZJKSB7CisgICAgTUJCID0gKkRGSTsKKyAgICBlbnRlckJhc2ljQmxvY2soKTsKKyAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLT5iZWdpbigpLCBFID0gTUJCLT5lbmQoKTsgSSAhPSBFOworICAgICAgICArK0kpIHsKKyAgICAgIE1hY2hpbmVJbnN0ciAqbWkgPSBJOworICAgICAgaWYgKG1pLT5pc0RlYnVnVmFsdWUoKSkgY29udGludWU7CisgICAgICArK0Rpc3RhbmNlOworICAgICAgc3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MTZfdD4gZG9tcCA9IFRJSS0+R2V0U1NFRG9tYWluKG1pKTsKKyAgICAgIGlmIChkb21wLmZpcnN0KQorICAgICAgICBpZiAoZG9tcC5zZWNvbmQpCisgICAgICAgICAgdmlzaXRTb2Z0SW5zdHIobWksIGRvbXAuc2Vjb25kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZpc2l0SGFyZEluc3RyKG1pLCBkb21wLmZpcnN0KTsKKyAgICAgIGVsc2UgaWYgKExpdmVSZWdzKQorICAgICAgICB2aXNpdEdlbmVyaWNJbnN0cihtaSk7CisgICAgfQorCisgICAgLy8gU2F2ZSBsaXZlIHJlZ2lzdGVycyBhdCBlbmQgb2YgTUJCIC0gdXNlZCBieSBlbnRlckJhc2ljQmxvY2soKS4KKyAgICBpZiAoTGl2ZVJlZ3MpCisgICAgICBMaXZlT3V0cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTUJCLCBMaXZlUmVncykpOworICAgIExpdmVSZWdzID0gMDsKKyAgfQorCisgIC8vIENsZWFyIHRoZSBMaXZlT3V0cyB2ZWN0b3JzLiBTaG91bGQgd2UgYWxzbyBjb2xsYXBzZSBhbnkgcmVtYWluaW5nCisgIC8vIERvbWFpblZhbHVlcz8KKyAgZm9yIChMaXZlT3V0TWFwOjpjb25zdF9pdGVyYXRvciBpID0gTGl2ZU91dHMuYmVnaW4oKSwgZSA9IExpdmVPdXRzLmVuZCgpOworICAgICAgICAgaSAhPSBlOyArK2kpCisgICAgZGVsZXRlW10gaS0+c2Vjb25kOworICBMaXZlT3V0cy5jbGVhcigpOworICBBdmFpbC5jbGVhcigpOworICBBbGxvY2F0b3IuRGVzdHJveUFsbCgpOworCisgIHJldHVybiBmYWxzZTsKK30KKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVTU0VEb21haW5GaXhQYXNzKCkgeworICByZXR1cm4gbmV3IFNTRURvbWFpbkZpeFBhc3MoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1RhcmdldEluZm8vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYmU5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTVg4NkluZm8KKyAgWDg2VGFyZ2V0SW5mby5jcHAKKyAgKQorCithZGRfZGVwZW5kZW5jaWVzKExMVk1YODZJbmZvIFg4NkNvZGVHZW5UYWJsZV9nZW4pCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9UYXJnZXRJbmZvL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvVGFyZ2V0SW5mby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTkxOTgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvVGFyZ2V0SW5mby9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjIz09PS0gbGliL1RhcmdldC9YODYvVGFyZ2V0SW5mby9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1YODZJbmZvCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFAuRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1RhcmdldEluZm8vWDg2VGFyZ2V0SW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9UYXJnZXRJbmZvL1g4NlRhcmdldEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZDRkODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9UYXJnZXRJbmZvL1g4NlRhcmdldEluZm8uY3BwCkBAIC0wLDAgKzEsMjMgQEAKKy8vPT09LS0gWDg2VGFyZ2V0SW5mby5jcHAgLSBYODYgVGFyZ2V0IEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJYODYuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGFyZ2V0IGxsdm06OlRoZVg4Nl8zMlRhcmdldCwgbGx2bTo6VGhlWDg2XzY0VGFyZ2V0OworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVYODZUYXJnZXRJbmZvKCkgeyAKKyAgUmVnaXN0ZXJUYXJnZXQ8VHJpcGxlOjp4ODYsIC8qSGFzSklUPSovdHJ1ZT4KKyAgICBYKFRoZVg4Nl8zMlRhcmdldCwgIng4NiIsICIzMi1iaXQgWDg2OiBQZW50aXVtLVBybyBhbmQgYWJvdmUiKTsKKworICBSZWdpc3RlclRhcmdldDxUcmlwbGU6Ong4Nl82NCwgLypIYXNKSVQ9Ki90cnVlPgorICAgIFkoVGhlWDg2XzY0VGFyZ2V0LCAieDg2LTY0IiwgIjY0LWJpdCBYODY6IEVNNjRUIGFuZCBBTUQ2NCIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2LmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2U4ODUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2LmgKQEAgLTAsMCArMSw5MCBAQAorLy89PT0tLSBYODYuaCAtIFRvcC1sZXZlbCBpbnRlcmZhY2UgZm9yIFg4NiByZXByZXNlbnRhdGlvbiAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGVudHJ5IHBvaW50cyBmb3IgZ2xvYmFsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSB4ODYKKy8vIHRhcmdldCBsaWJyYXJ5LCBhcyB1c2VkIGJ5IHRoZSBMTFZNIEpJVC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFRBUkdFVF9YODZfSAorI2RlZmluZSBUQVJHRVRfWDg2X0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBKSVRDb2RlRW1pdHRlcjsKK2NsYXNzIE1DQ29kZUVtaXR0ZXI7CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNYWNoaW5lQ29kZUVtaXR0ZXI7CitjbGFzcyBUYXJnZXQ7CitjbGFzcyBUYXJnZXRBc21CYWNrZW5kOworY2xhc3MgWDg2VGFyZ2V0TWFjaGluZTsKK2NsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKworLy8vIGNyZWF0ZVg4NklTZWxEYWcgLSBUaGlzIHBhc3MgY29udmVydHMgYSBsZWdhbGl6ZWQgREFHIGludG8gYSAKKy8vLyBYODYtc3BlY2lmaWMgREFHLCByZWFkeSBmb3IgaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZy4KKy8vLworRnVuY3Rpb25QYXNzICpjcmVhdGVYODZJU2VsRGFnKFg4NlRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKworLy8vIGNyZWF0ZUdsb2JhbEJhc2VSZWdQYXNzIC0gVGhpcyBwYXNzIGluaXRpYWxpemVzIGEgZ2xvYmFsIGJhc2UKKy8vLyByZWdpc3RlciBmb3IgUElDIG9uIHg4Ni0zMi4KK0Z1bmN0aW9uUGFzcyogY3JlYXRlR2xvYmFsQmFzZVJlZ1Bhc3MoKTsKKworLy8vIGNyZWF0ZVg4NkZsb2F0aW5nUG9pbnRTdGFja2lmaWVyUGFzcyAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBhc3Mgd2hpY2gKKy8vLyBjb252ZXJ0cyBmbG9hdGluZyBwb2ludCByZWdpc3RlciByZWZlcmVuY2VzIGFuZCBwc2V1ZG8gaW5zdHJ1Y3Rpb25zIGludG8KKy8vLyBmbG9hdGluZyBwb2ludCBzdGFjayByZWZlcmVuY2VzIGFuZCBwaHlzaWNhbCBpbnN0cnVjdGlvbnMuCisvLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlWDg2RmxvYXRpbmdQb2ludFN0YWNraWZpZXJQYXNzKCk7CisKKy8vLyBjcmVhdGVTU0VEb21haW5GaXhQYXNzIC0gVGhpcyBwYXNzIHR3aWRkbGVzIFNTRSBvcGNvZGVzIHRvIHByZXZlbnQgZG9tYWluCisvLy8gY3Jvc3NpbmdzLgorRnVuY3Rpb25QYXNzICpjcmVhdGVTU0VEb21haW5GaXhQYXNzKCk7CisKKy8vLyBjcmVhdGVYODZDb2RlRW1pdHRlclBhc3MgLSBSZXR1cm4gYSBwYXNzIHRoYXQgZW1pdHMgdGhlIGNvbGxlY3RlZCBYODYgY29kZQorLy8vIHRvIHRoZSBzcGVjaWZpZWQgTUNFIG9iamVjdC4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlWDg2SklUQ29kZUVtaXR0ZXJQYXNzKFg4NlRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUQ29kZUVtaXR0ZXIgJkpDRSk7CisKK01DQ29kZUVtaXR0ZXIgKmNyZWF0ZVg4Nl8zMk1DQ29kZUVtaXR0ZXIoY29uc3QgVGFyZ2V0ICYsIFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCk7CitNQ0NvZGVFbWl0dGVyICpjcmVhdGVYODZfNjRNQ0NvZGVFbWl0dGVyKGNvbnN0IFRhcmdldCAmLCBUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpOworCitUYXJnZXRBc21CYWNrZW5kICpjcmVhdGVYODZfMzJBc21CYWNrZW5kKGNvbnN0IFRhcmdldCAmLCBjb25zdCBzdGQ6OnN0cmluZyAmKTsKK1RhcmdldEFzbUJhY2tlbmQgKmNyZWF0ZVg4Nl82NEFzbUJhY2tlbmQoY29uc3QgVGFyZ2V0ICYsIGNvbnN0IHN0ZDo6c3RyaW5nICYpOworCisvLy8gY3JlYXRlWDg2RW1pdENvZGVUb01lbW9yeSAtIFJldHVybnMgYSBwYXNzIHRoYXQgY29udmVydHMgYSByZWdpc3RlcgorLy8vIGFsbG9jYXRlZCBmdW5jdGlvbiBpbnRvIHJhdyBtYWNoaW5lIGNvZGUgaW4gYSBkeW5hbWljYWxseQorLy8vIGFsbG9jYXRlZCBjaHVuayBvZiBtZW1vcnkuCisvLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlRW1pdFg4NkNvZGVUb01lbW9yeSgpOworCisvLy8gY3JlYXRlWDg2TWF4U3RhY2tBbGlnbm1lbnRIZXVyaXN0aWNQYXNzIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcGFzcworLy8vIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3RlciBzaG91bGQgYmUKKy8vLyByZXNlcnZlZCBpbiBjYXNlIGR5bmFtaWMgc3RhY2sgYWxpZ25tZW50IGlzIGxhdGVyIHJlcXVpcmVkLgorLy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVg4Nk1heFN0YWNrQWxpZ25tZW50SGV1cmlzdGljUGFzcygpOworCitleHRlcm4gVGFyZ2V0IFRoZVg4Nl8zMlRhcmdldCwgVGhlWDg2XzY0VGFyZ2V0OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisvLyBEZWZpbmVzIHN5bWJvbGljIG5hbWVzIGZvciBYODYgcmVnaXN0ZXJzLiAgVGhpcyBkZWZpbmVzIGEgbWFwcGluZyBmcm9tCisvLyByZWdpc3RlciBuYW1lIHRvIHJlZ2lzdGVyIG51bWJlci4KKy8vCisjaW5jbHVkZSAiWDg2R2VuUmVnaXN0ZXJOYW1lcy5pbmMiCisKKy8vIERlZmluZXMgc3ltYm9saWMgbmFtZXMgZm9yIHRoZSBYODYgaW5zdHJ1Y3Rpb25zLgorLy8KKyNpbmNsdWRlICJYODZHZW5JbnN0ck5hbWVzLmluYyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODYudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODYudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMTM2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Ni50ZApAQCAtMCwwICsxLDIxMyBAQAorLy89PT0tIFg4Ni50ZCAtIFRhcmdldCBkZWZpbml0aW9uIGZpbGUgZm9yIHRoZSBJbnRlbCBYODYgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgaXMgYSB0YXJnZXQgZGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIEludGVsIGkzODYgYXJjaGl0ZWN0dXJlLCByZWZlcmVkIHRvDQorLy8gaGVyZSBhcyB0aGUgIlg4NiIgYXJjaGl0ZWN0dXJlLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBHZXQgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHdoaWNoIHdlIGFyZSBpbXBsZW1lbnRpbmcuLi4NCisvLw0KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldC50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFg4NiBTdWJ0YXJnZXQgZmVhdHVyZXMuDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitkZWYgRmVhdHVyZUNNT1YgICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJjbW92IiwiSGFzQ01vdiIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgY29uZGl0aW9uYWwgbW92ZSBpbnN0cnVjdGlvbnMiPjsNCisNCisNCitkZWYgRmVhdHVyZU1NWCAgICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJtbXgiLCJYODZTU0VMZXZlbCIsICJNTVgiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBNTVggaW5zdHJ1Y3Rpb25zIj47DQorZGVmIEZlYXR1cmVTU0UxICAgIDogU3VidGFyZ2V0RmVhdHVyZTwic3NlIiwgIlg4NlNTRUxldmVsIiwgIlNTRTEiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBTU0UgaW5zdHJ1Y3Rpb25zIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNTRSBjb2RlZ2VuIGRlcGVuZHMgb24gY21vdnMsIGFuZCBhbGwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNTRTErIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGVtLiANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtGZWF0dXJlTU1YLCBGZWF0dXJlQ01PVl0+Ow0KK2RlZiBGZWF0dXJlU1NFMiAgICA6IFN1YnRhcmdldEZlYXR1cmU8InNzZTIiLCAiWDg2U1NFTGV2ZWwiLCAiU1NFMiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlIFNTRTIgaW5zdHJ1Y3Rpb25zIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtGZWF0dXJlU1NFMV0+Ow0KK2RlZiBGZWF0dXJlU1NFMyAgICA6IFN1YnRhcmdldEZlYXR1cmU8InNzZTMiLCAiWDg2U1NFTGV2ZWwiLCAiU1NFMyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlIFNTRTMgaW5zdHJ1Y3Rpb25zIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtGZWF0dXJlU1NFMl0+Ow0KK2RlZiBGZWF0dXJlU1NTRTMgICA6IFN1YnRhcmdldEZlYXR1cmU8InNzc2UzIiwgIlg4NlNTRUxldmVsIiwgIlNTU0UzIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgU1NTRTMgaW5zdHJ1Y3Rpb25zIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtGZWF0dXJlU1NFM10+Ow0KK2RlZiBGZWF0dXJlU1NFNDEgICA6IFN1YnRhcmdldEZlYXR1cmU8InNzZTQxIiwgIlg4NlNTRUxldmVsIiwgIlNTRTQxIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgU1NFIDQuMSBpbnN0cnVjdGlvbnMiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ZlYXR1cmVTU1NFM10+Ow0KK2RlZiBGZWF0dXJlU1NFNDIgICA6IFN1YnRhcmdldEZlYXR1cmU8InNzZTQyIiwgIlg4NlNTRUxldmVsIiwgIlNTRTQyIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgU1NFIDQuMiBpbnN0cnVjdGlvbnMiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ZlYXR1cmVTU0U0MV0+Ow0KK2RlZiBGZWF0dXJlM0ROb3cgICA6IFN1YnRhcmdldEZlYXR1cmU8IjNkbm93IiwgIlg4NjNETm93TGV2ZWwiLCAiVGhyZWVETm93IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgM0ROb3chIGluc3RydWN0aW9ucyI+Ow0KK2RlZiBGZWF0dXJlM0ROb3dBICA6IFN1YnRhcmdldEZlYXR1cmU8IjNkbm93YSIsICJYODYzRE5vd0xldmVsIiwgIlRocmVlRE5vd0EiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSAzRE5vdyEgQXRobG9uIGluc3RydWN0aW9ucyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRmVhdHVyZTNETm93XT47DQorLy8gQWxsIHg4Ni02NCBoYXJkd2FyZSBoYXMgU1NFMiwgYnV0IHdlIGRvbid0IG1hcmsgU1NFMiBhcyBhbiBpbXBsaWVkDQorLy8gZmVhdHVyZSwgYmVjYXVzZSBTU0UyIGNhbiBiZSBkaXNhYmxlZCAoZS5nLiBmb3IgY29tcGlsaW5nIE9TIGtlcm5lbHMpDQorLy8gd2l0aG91dCBkaXNhYmxpbmcgNjQtYml0IG1vZGUuDQorZGVmIEZlYXR1cmU2NEJpdCAgIDogU3VidGFyZ2V0RmVhdHVyZTwiNjRiaXQiLCAiSGFzWDg2XzY0IiwgInRydWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1cHBvcnQgNjQtYml0IGluc3RydWN0aW9ucyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRmVhdHVyZUNNT1ZdPjsNCitkZWYgRmVhdHVyZVNsb3dCVE1lbSA6IFN1YnRhcmdldEZlYXR1cmU8InNsb3ctYnQtbWVtIiwgIklzQlRNZW1TbG93IiwgInRydWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCaXQgdGVzdGluZyBvZiBtZW1vcnkgaXMgc2xvdyI+Ow0KK2RlZiBGZWF0dXJlRmFzdFVBTWVtIDogU3VidGFyZ2V0RmVhdHVyZTwiZmFzdC11bmFsaWduZWQtbWVtIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklzVUFNZW1GYXN0IiwgInRydWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFzdCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyI+Ow0KK2RlZiBGZWF0dXJlU1NFNEEgICA6IFN1YnRhcmdldEZlYXR1cmU8InNzZTRhIiwgIkhhc1NTRTRBIiwgInRydWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1cHBvcnQgU1NFIDRhIGluc3RydWN0aW9ucyI+Ow0KKw0KK2RlZiBGZWF0dXJlQVZYICAgICA6IFN1YnRhcmdldEZlYXR1cmU8ImF2eCIsICJIYXNBVlgiLCAidHJ1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5hYmxlIEFWWCBpbnN0cnVjdGlvbnMiPjsNCitkZWYgRmVhdHVyZUNMTVVMICAgOiBTdWJ0YXJnZXRGZWF0dXJlPCJjbG11bCIsICJIYXNDTE1VTCIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSBjYXJyeS1sZXNzIG11bHRpcGxpY2F0aW9uIGluc3RydWN0aW9ucyI+Ow0KK2RlZiBGZWF0dXJlRk1BMyAgICA6IFN1YnRhcmdldEZlYXR1cmU8ImZtYTMiLCAiSGFzRk1BMyIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuYWJsZSB0aHJlZS1vcGVyYW5kIGZ1c2VkIG11bHRpcGxlLWFkZCI+Ow0KK2RlZiBGZWF0dXJlRk1BNCAgICA6IFN1YnRhcmdldEZlYXR1cmU8ImZtYTQiLCAiSGFzRk1BNCIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgZm91ci1vcGVyYW5kIGZ1c2VkIG11bHRpcGxlLWFkZCI+Ow0KK2RlZiBGZWF0dXJlVmVjdG9yVUFNZW0gOiBTdWJ0YXJnZXRGZWF0dXJlPCJ2ZWN0b3ItdW5hbGlnbmVkLW1lbSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhc1ZlY3RvclVBTWVtIiwgInRydWUiLA0KKyAgICAgICAgICAgICAgICAgIkFsbG93IHVuYWxpZ25lZCBtZW1vcnkgb3BlcmFuZHMgb24gdmVjdG9yL1NJTUQgaW5zdHJ1Y3Rpb25zIj47DQorZGVmIEZlYXR1cmVBRVMgICAgIDogU3VidGFyZ2V0RmVhdHVyZTwiYWVzIiwgIkhhc0FFUyIsICJ0cnVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmFibGUgQUVTIGluc3RydWN0aW9ucyI+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gWDg2IHByb2Nlc3NvcnMgc3VwcG9ydGVkLg0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorY2xhc3MgUHJvYzxzdHJpbmcgTmFtZSwgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBGZWF0dXJlcz4NCisgOiBQcm9jZXNzb3I8TmFtZSwgTm9JdGluZXJhcmllcywgRmVhdHVyZXM+Ow0KKw0KK2RlZiA6IFByb2M8ImdlbmVyaWMiLCAgICAgICAgIFtdPjsNCitkZWYgOiBQcm9jPCJpMzg2IiwgICAgICAgICAgICBbXT47DQorZGVmIDogUHJvYzwiaTQ4NiIsICAgICAgICAgICAgW10+Ow0KK2RlZiA6IFByb2M8Imk1ODYiLCAgICAgICAgICAgIFtdPjsNCitkZWYgOiBQcm9jPCJwZW50aXVtIiwgICAgICAgICBbXT47DQorZGVmIDogUHJvYzwicGVudGl1bS1tbXgiLCAgICAgW0ZlYXR1cmVNTVhdPjsNCitkZWYgOiBQcm9jPCJpNjg2IiwgICAgICAgICAgICBbXT47DQorZGVmIDogUHJvYzwicGVudGl1bXBybyIsICAgICAgW0ZlYXR1cmVDTU9WXT47DQorZGVmIDogUHJvYzwicGVudGl1bTIiLCAgICAgICAgW0ZlYXR1cmVNTVgsIEZlYXR1cmVDTU9WXT47DQorZGVmIDogUHJvYzwicGVudGl1bTMiLCAgICAgICAgW0ZlYXR1cmVTU0UxXT47DQorZGVmIDogUHJvYzwicGVudGl1bS1tIiwgICAgICAgW0ZlYXR1cmVTU0UyLCBGZWF0dXJlU2xvd0JUTWVtXT47DQorZGVmIDogUHJvYzwicGVudGl1bTQiLCAgICAgICAgW0ZlYXR1cmVTU0UyXT47DQorZGVmIDogUHJvYzwieDg2LTY0IiwgICAgICAgICAgW0ZlYXR1cmVTU0UyLCAgIEZlYXR1cmU2NEJpdCwgRmVhdHVyZVNsb3dCVE1lbV0+Ow0KK2RlZiA6IFByb2M8InlvbmFoIiwgICAgICAgICAgIFtGZWF0dXJlU1NFMywgRmVhdHVyZVNsb3dCVE1lbV0+Ow0KK2RlZiA6IFByb2M8InByZXNjb3R0IiwgICAgICAgIFtGZWF0dXJlU1NFMywgRmVhdHVyZVNsb3dCVE1lbV0+Ow0KK2RlZiA6IFByb2M8Im5vY29uYSIsICAgICAgICAgIFtGZWF0dXJlU1NFMywgICBGZWF0dXJlNjRCaXQsIEZlYXR1cmVTbG93QlRNZW1dPjsNCitkZWYgOiBQcm9jPCJjb3JlMiIsICAgICAgICAgICBbRmVhdHVyZVNTU0UzLCAgRmVhdHVyZTY0Qml0LCBGZWF0dXJlU2xvd0JUTWVtXT47DQorZGVmIDogUHJvYzwicGVucnluIiwgICAgICAgICAgW0ZlYXR1cmVTU0U0MSwgIEZlYXR1cmU2NEJpdCwgRmVhdHVyZVNsb3dCVE1lbV0+Ow0KK2RlZiA6IFByb2M8ImF0b20iLCAgICAgICAgICAgIFtGZWF0dXJlU1NFMywgICBGZWF0dXJlNjRCaXQsIEZlYXR1cmVTbG93QlRNZW1dPjsNCisvLyAiQXJyYW5kYWxlIiBhbG9uZyB3aXRoIGNvcmVpMyBhbmQgY29yZWk1DQorZGVmIDogUHJvYzwiY29yZWk3IiwgICAgICAgICAgW0ZlYXR1cmVTU0U0MiwgIEZlYXR1cmU2NEJpdCwgRmVhdHVyZVNsb3dCVE1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZhc3RVQU1lbSwgRmVhdHVyZUFFU10+Ow0KK2RlZiA6IFByb2M8Im5laGFsZW0iLCAgICAgICAgIFtGZWF0dXJlU1NFNDIsICBGZWF0dXJlNjRCaXQsIEZlYXR1cmVTbG93QlRNZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGYXN0VUFNZW1dPjsNCisvLyBXZXN0bWVyZSBpcyBhIHNpbWlsYXIgbWFjaGluZSB0byBuZWhhbGVtIHdpdGggc29tZSBhZGRpdGlvbmFsIGZlYXR1cmVzLg0KKy8vIFdlc3RtZXJlIGlzIHRoZSBjb3JlaTMvaTUvaTcgcGF0aCBmcm9tIG5laGFsZW0gdG8gc2FuZHlicmlkZ2UNCitkZWYgOiBQcm9jPCJ3ZXN0bWVyZSIsICAgICAgICAgW0ZlYXR1cmVTU0U0MiwgIEZlYXR1cmU2NEJpdCwgRmVhdHVyZVNsb3dCVE1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGYXN0VUFNZW0sIEZlYXR1cmVBRVNdPjsNCisvLyBTYW5keSBCcmlkZ2UgZG9lcyBub3QgaGF2ZSBGTUENCisvLyBGSVhNRTogV2lraXBlZGlhIHNheXMgaXQgZG9lcy4uLiBpdCBzaG91bGQgaGF2ZSBBRVMgYXMgd2VsbC4NCitkZWYgOiBQcm9jPCJzYW5keWJyaWRnZSIsICAgICBbRmVhdHVyZVNTRTQyLCAgRmVhdHVyZUFWWCwgICBGZWF0dXJlNjRCaXRdPjsNCisNCitkZWYgOiBQcm9jPCJrNiIsICAgICAgICAgICAgICBbRmVhdHVyZU1NWF0+Ow0KK2RlZiA6IFByb2M8Ims2LTIiLCAgICAgICAgICAgIFtGZWF0dXJlTU1YLCAgICBGZWF0dXJlM0ROb3ddPjsNCitkZWYgOiBQcm9jPCJrNi0zIiwgICAgICAgICAgICBbRmVhdHVyZU1NWCwgICAgRmVhdHVyZTNETm93XT47DQorZGVmIDogUHJvYzwiYXRobG9uIiwgICAgICAgICAgW0ZlYXR1cmVNTVgsICAgIEZlYXR1cmUzRE5vd0EsIEZlYXR1cmVTbG93QlRNZW1dPjsNCitkZWYgOiBQcm9jPCJhdGhsb24tdGJpcmQiLCAgICBbRmVhdHVyZU1NWCwgICAgRmVhdHVyZTNETm93QSwgRmVhdHVyZVNsb3dCVE1lbV0+Ow0KK2RlZiA6IFByb2M8ImF0aGxvbi00IiwgICAgICAgIFtGZWF0dXJlU1NFMSwgICBGZWF0dXJlM0ROb3dBLCBGZWF0dXJlU2xvd0JUTWVtXT47DQorZGVmIDogUHJvYzwiYXRobG9uLXhwIiwgICAgICAgW0ZlYXR1cmVTU0UxLCAgIEZlYXR1cmUzRE5vd0EsIEZlYXR1cmVTbG93QlRNZW1dPjsNCitkZWYgOiBQcm9jPCJhdGhsb24tbXAiLCAgICAgICBbRmVhdHVyZVNTRTEsICAgRmVhdHVyZTNETm93QSwgRmVhdHVyZVNsb3dCVE1lbV0+Ow0KK2RlZiA6IFByb2M8Ims4IiwgICAgICAgICAgICAgIFtGZWF0dXJlU1NFMiwgICBGZWF0dXJlM0ROb3dBLCBGZWF0dXJlNjRCaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVTbG93QlRNZW1dPjsNCitkZWYgOiBQcm9jPCJvcHRlcm9uIiwgICAgICAgICBbRmVhdHVyZVNTRTIsICAgRmVhdHVyZTNETm93QSwgRmVhdHVyZTY0Qml0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlU2xvd0JUTWVtXT47DQorZGVmIDogUHJvYzwiYXRobG9uNjQiLCAgICAgICAgW0ZlYXR1cmVTU0UyLCAgIEZlYXR1cmUzRE5vd0EsIEZlYXR1cmU2NEJpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZVNsb3dCVE1lbV0+Ow0KK2RlZiA6IFByb2M8ImF0aGxvbi1meCIsICAgICAgIFtGZWF0dXJlU1NFMiwgICBGZWF0dXJlM0ROb3dBLCBGZWF0dXJlNjRCaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVTbG93QlRNZW1dPjsNCitkZWYgOiBQcm9jPCJrOC1zc2UzIiwgICAgICAgICBbRmVhdHVyZVNTRTMsICAgRmVhdHVyZTNETm93QSwgRmVhdHVyZTY0Qml0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlU2xvd0JUTWVtXT47DQorZGVmIDogUHJvYzwib3B0ZXJvbi1zc2UzIiwgICAgW0ZlYXR1cmVTU0UzLCAgIEZlYXR1cmUzRE5vd0EsIEZlYXR1cmU2NEJpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZVNsb3dCVE1lbV0+Ow0KK2RlZiA6IFByb2M8ImF0aGxvbjY0LXNzZTMiLCAgIFtGZWF0dXJlU1NFMywgICBGZWF0dXJlM0ROb3dBLCBGZWF0dXJlNjRCaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVTbG93QlRNZW1dPjsNCitkZWYgOiBQcm9jPCJhbWRmYW0xMCIsICAgICAgICBbRmVhdHVyZVNTRTMsICAgRmVhdHVyZVNTRTRBLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlM0ROb3dBLCBGZWF0dXJlNjRCaXQsIEZlYXR1cmVTbG93QlRNZW1dPjsNCitkZWYgOiBQcm9jPCJiYXJjZWxvbmEiLCAgICAgICBbRmVhdHVyZVNTRTMsICAgRmVhdHVyZVNTRTRBLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlM0ROb3dBLCBGZWF0dXJlNjRCaXQsIEZlYXR1cmVTbG93QlRNZW1dPjsNCitkZWYgOiBQcm9jPCJpc3RhbmJ1bCIsICAgICAgICBbRmVhdHVyZTNETm93QSwgRmVhdHVyZTY0Qml0LCBGZWF0dXJlU1NFNEEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmUzRE5vd0FdPjsNCitkZWYgOiBQcm9jPCJzaGFuZ2hhaSIsICAgICAgICBbRmVhdHVyZTNETm93QSwgRmVhdHVyZTY0Qml0LCBGZWF0dXJlU1NFNEEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmUzRE5vd0FdPjsNCisNCitkZWYgOiBQcm9jPCJ3aW5jaGlwLWM2IiwgICAgICBbRmVhdHVyZU1NWF0+Ow0KK2RlZiA6IFByb2M8IndpbmNoaXAyIiwgICAgICAgIFtGZWF0dXJlTU1YLCBGZWF0dXJlM0ROb3ddPjsNCitkZWYgOiBQcm9jPCJjMyIsICAgICAgICAgICAgICBbRmVhdHVyZU1NWCwgRmVhdHVyZTNETm93XT47DQorZGVmIDogUHJvYzwiYzMtMiIsICAgICAgICAgICAgW0ZlYXR1cmVTU0UxXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBSZWdpc3RlciBGaWxlIERlc2NyaXB0aW9uDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitpbmNsdWRlICJYODZSZWdpc3RlckluZm8udGQiDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBJbnN0cnVjdGlvbiBEZXNjcmlwdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIlg4Nkluc3RySW5mby50ZCINCisNCitkZWYgWDg2SW5zdHJJbmZvIDogSW5zdHJJbmZvOw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQ2FsbGluZyBDb252ZW50aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQoraW5jbHVkZSAiWDg2Q2FsbGluZ0NvbnYudGQiDQorDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBBc3NlbWJseSBQcmludGVycw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gQ3VycmVudGx5IHRoZSBYODYgYXNzZW1ibHkgcGFyc2VyIG9ubHkgc3VwcG9ydHMgQVRUIHN5bnRheC4NCitkZWYgQVRUQXNtUGFyc2VyIDogQXNtUGFyc2VyIHsNCisgIHN0cmluZyBBc21QYXJzZXJDbGFzc05hbWUgPSAiQVRUQXNtUGFyc2VyIjsNCisgIHN0cmluZyBNYXRjaEluc3RydWN0aW9uTmFtZSA9ICJNYXRjaEluc3RydWN0aW9uSW1wbCI7DQorICBpbnQgVmFyaWFudCA9IDA7DQorDQorICAvLyBEaXNjYXJkIGNvbW1lbnRzIGluIGFzc2VtYmx5IHN0cmluZ3MuDQorICBzdHJpbmcgQ29tbWVudERlbGltaXRlciA9ICIjIjsNCisNCisgIC8vIFJlY29nbml6ZSBoYXJkIGNvZGVkIHJlZ2lzdGVycy4NCisgIHN0cmluZyBSZWdpc3RlclByZWZpeCA9ICIlIjsNCit9DQorDQorLy8gVGhlIFg4NiB0YXJnZXQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCBzeW50YXhlcyBmb3IgZW1pdHRpbmcgbWFjaGluZSBjb2RlLg0KKy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgLXg4Ni1hc20tc3ludGF4PXthdHR8aW50ZWx9DQorZGVmIEFUVEFzbVdyaXRlciA6IEFzbVdyaXRlciB7DQorICBzdHJpbmcgQXNtV3JpdGVyQ2xhc3NOYW1lICA9ICJBVFRJbnN0UHJpbnRlciI7DQorICBpbnQgVmFyaWFudCA9IDA7DQorfQ0KK2RlZiBJbnRlbEFzbVdyaXRlciA6IEFzbVdyaXRlciB7DQorICBzdHJpbmcgQXNtV3JpdGVyQ2xhc3NOYW1lICA9ICJJbnRlbEluc3RQcmludGVyIjsNCisgIGludCBWYXJpYW50ID0gMTsNCit9DQorDQorZGVmIFg4NiA6IFRhcmdldCB7DQorICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdHJ1Y3Rpb25zLi4uDQorICBsZXQgSW5zdHJ1Y3Rpb25TZXQgPSBYODZJbnN0ckluZm87DQorDQorICBsZXQgQXNzZW1ibHlQYXJzZXJzID0gW0FUVEFzbVBhcnNlcl07DQorDQorICBsZXQgQXNzZW1ibHlXcml0ZXJzID0gW0FUVEFzbVdyaXRlciwgSW50ZWxBc21Xcml0ZXJdOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZBc21CYWNrZW5kLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkFzbUJhY2tlbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGVlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZBc21CYWNrZW5kLmNwcApAQCAtMCwwICsxLDMyOCBAQAorLy89PT0tLSBYODZBc21CYWNrZW5kLmNwcCAtIFg4NiBBc3NlbWJsZXIgQmFja2VuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEFzbUJhY2tlbmQuaCIKKyNpbmNsdWRlICJYODYuaCIKKyNpbmNsdWRlICJYODZGaXh1cEtpbmRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNzZW1ibGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DT2JqZWN0V3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25DT0ZGLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25FTEYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbk1hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NYWNoT2JqZWN0V3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEFzbUJhY2tlbmQuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisKK3N0YXRpYyB1bnNpZ25lZCBnZXRGaXh1cEtpbmRMb2cyU2l6ZSh1bnNpZ25lZCBLaW5kKSB7CisgIHN3aXRjaCAoS2luZCkgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiaW52YWxpZCBmaXh1cCBraW5kISIpOworICBjYXNlIFg4Njo6cmVsb2NfcGNyZWxfMWJ5dGU6CisgIGNhc2UgRktfRGF0YV8xOiByZXR1cm4gMDsKKyAgY2FzZSBYODY6OnJlbG9jX3BjcmVsXzJieXRlOgorICBjYXNlIEZLX0RhdGFfMjogcmV0dXJuIDE7CisgIGNhc2UgWDg2OjpyZWxvY19wY3JlbF80Ynl0ZToKKyAgY2FzZSBYODY6OnJlbG9jX3JpcHJlbF80Ynl0ZToKKyAgY2FzZSBYODY6OnJlbG9jX3JpcHJlbF80Ynl0ZV9tb3ZxX2xvYWQ6CisgIGNhc2UgRktfRGF0YV80OiByZXR1cm4gMjsKKyAgY2FzZSBGS19EYXRhXzg6IHJldHVybiAzOworICB9Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBYODZBc21CYWNrZW5kIDogcHVibGljIFRhcmdldEFzbUJhY2tlbmQgeworcHVibGljOgorICBYODZBc21CYWNrZW5kKGNvbnN0IFRhcmdldCAmVCkKKyAgICA6IFRhcmdldEFzbUJhY2tlbmQoVCkge30KKworICB2b2lkIEFwcGx5Rml4dXAoY29uc3QgTUNGaXh1cCAmRml4dXAsIE1DRGF0YUZyYWdtZW50ICZERiwKKyAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFZhbHVlKSBjb25zdCB7CisgICAgdW5zaWduZWQgU2l6ZSA9IDEgPDwgZ2V0Rml4dXBLaW5kTG9nMlNpemUoRml4dXAuZ2V0S2luZCgpKTsKKworICAgIGFzc2VydChGaXh1cC5nZXRPZmZzZXQoKSArIFNpemUgPD0gREYuZ2V0Q29udGVudHMoKS5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgZml4dXAgb2Zmc2V0ISIpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gU2l6ZTsgKytpKQorICAgICAgREYuZ2V0Q29udGVudHMoKVtGaXh1cC5nZXRPZmZzZXQoKSArIGldID0gdWludDhfdChWYWx1ZSA+PiAoaSAqIDgpKTsKKyAgfQorCisgIGJvb2wgTWF5TmVlZFJlbGF4YXRpb24oY29uc3QgTUNJbnN0ICZJbnN0KSBjb25zdDsKKworICB2b2lkIFJlbGF4SW5zdHJ1Y3Rpb24oY29uc3QgTUNJbnN0ICZJbnN0LCBNQ0luc3QgJlJlcykgY29uc3Q7CisKKyAgYm9vbCBXcml0ZU5vcERhdGEodWludDY0X3QgQ291bnQsIE1DT2JqZWN0V3JpdGVyICpPVykgY29uc3Q7Cit9OworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZSAKKworc3RhdGljIHVuc2lnbmVkIGdldFJlbGF4ZWRPcGNvZGUodW5zaWduZWQgT3ApIHsKKyAgc3dpdGNoIChPcCkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBPcDsKKworICBjYXNlIFg4Njo6SkFFXzE6IHJldHVybiBYODY6OkpBRV80OworICBjYXNlIFg4Njo6SkFfMTogIHJldHVybiBYODY6OkpBXzQ7CisgIGNhc2UgWDg2OjpKQkVfMTogcmV0dXJuIFg4Njo6SkJFXzQ7CisgIGNhc2UgWDg2OjpKQl8xOiAgcmV0dXJuIFg4Njo6SkJfNDsKKyAgY2FzZSBYODY6OkpFXzE6ICByZXR1cm4gWDg2OjpKRV80OworICBjYXNlIFg4Njo6SkdFXzE6IHJldHVybiBYODY6OkpHRV80OworICBjYXNlIFg4Njo6SkdfMTogIHJldHVybiBYODY6OkpHXzQ7CisgIGNhc2UgWDg2OjpKTEVfMTogcmV0dXJuIFg4Njo6SkxFXzQ7CisgIGNhc2UgWDg2OjpKTF8xOiAgcmV0dXJuIFg4Njo6SkxfNDsKKyAgY2FzZSBYODY6OkpNUF8xOiByZXR1cm4gWDg2OjpKTVBfNDsKKyAgY2FzZSBYODY6OkpORV8xOiByZXR1cm4gWDg2OjpKTkVfNDsKKyAgY2FzZSBYODY6OkpOT18xOiByZXR1cm4gWDg2OjpKTk9fNDsKKyAgY2FzZSBYODY6OkpOUF8xOiByZXR1cm4gWDg2OjpKTlBfNDsKKyAgY2FzZSBYODY6OkpOU18xOiByZXR1cm4gWDg2OjpKTlNfNDsKKyAgY2FzZSBYODY6OkpPXzE6ICByZXR1cm4gWDg2OjpKT180OworICBjYXNlIFg4Njo6SlBfMTogIHJldHVybiBYODY6OkpQXzQ7CisgIGNhc2UgWDg2OjpKU18xOiAgcmV0dXJuIFg4Njo6SlNfNDsKKyAgfQorfQorCitib29sIFg4NkFzbUJhY2tlbmQ6Ok1heU5lZWRSZWxheGF0aW9uKGNvbnN0IE1DSW5zdCAmSW5zdCkgY29uc3QgeworICAvLyBDaGVjayBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGV2ZXIgcmVsYXhhYmxlLgorICBpZiAoZ2V0UmVsYXhlZE9wY29kZShJbnN0LmdldE9wY29kZSgpKSA9PSBJbnN0LmdldE9wY29kZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiBzbywganVzdCBhc3N1bWUgaXQgY2FuIGJlIHJlbGF4ZWQuIE9uY2Ugd2Ugc3VwcG9ydCByZWxheGluZyBtb3JlIGNvbXBsZXgKKyAgLy8gaW5zdHJ1Y3Rpb25zIHdlIHNob3VsZCBjaGVjayB0aGF0IHRoZSBpbnN0cnVjdGlvbiBhY3R1YWxseSBoYXMgc3ltYm9saWMKKyAgLy8gb3BlcmFuZHMgYmVmb3JlIGRvaW5nIHRoaXMsIGJ1dCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgdGhpbmdzIGxpa2UKKyAgLy8gUENyZWwuCisgIHJldHVybiB0cnVlOworfQorCisvLyBGSVhNRTogQ2FuIHRibGdlbiBoZWxwIGF0IGFsbCBoZXJlIHRvIHZlcmlmeSB0aGVyZSBhcmVuJ3Qgb3RoZXIgaW5zdHJ1Y3Rpb25zCisvLyB3ZSBjYW4gcmVsYXg/Cit2b2lkIFg4NkFzbUJhY2tlbmQ6OlJlbGF4SW5zdHJ1Y3Rpb24oY29uc3QgTUNJbnN0ICZJbnN0LCBNQ0luc3QgJlJlcykgY29uc3QgeworICAvLyBUaGUgb25seSByZWxheGF0aW9ucyBYODYgZG9lcyBpcyBmcm9tIGEgMWJ5dGUgcGNyZWwgdG8gYSA0Ynl0ZSBwY3JlbC4KKyAgdW5zaWduZWQgUmVsYXhlZE9wID0gZ2V0UmVsYXhlZE9wY29kZShJbnN0LmdldE9wY29kZSgpKTsKKworICBpZiAoUmVsYXhlZE9wID09IEluc3QuZ2V0T3Bjb2RlKCkpIHsKKyAgICBTbWFsbFN0cmluZzwyNTY+IFRtcDsKKyAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtIE9TKFRtcCk7CisgICAgSW5zdC5kdW1wX3ByZXR0eShPUyk7CisgICAgT1MgPDwgIlxuIjsKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoInVuZXhwZWN0ZWQgaW5zdHJ1Y3Rpb24gdG8gcmVsYXg6ICIgKyBPUy5zdHIoKSk7CisgIH0KKworICBSZXMgPSBJbnN0OworICBSZXMuc2V0T3Bjb2RlKFJlbGF4ZWRPcCk7Cit9CisKKy8vLyBXcml0ZU5vcERhdGEgLSBXcml0ZSBvcHRpbWFsIG5vcHMgdG8gdGhlIG91dHB1dCBmaWxlIGZvciB0aGUgXGFyZyBDb3VudAorLy8vIGJ5dGVzLiAgVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gIEl0IG1heSByZXR1cm4gMCBpZgorLy8vIHRoZSBcYXJnIENvdW50IGlzIG1vcmUgdGhhbiB0aGUgbWF4aW11bSBvcHRpbWFsIG5vcHMuCisvLy8KKy8vLyBGSVhNRSB0aGlzIGlzIFg4NiAzMi1iaXQgc3BlY2lmaWMgYW5kIHNob3VsZCBtb3ZlIHRvIGEgYmV0dGVyIHBsYWNlLgorYm9vbCBYODZBc21CYWNrZW5kOjpXcml0ZU5vcERhdGEodWludDY0X3QgQ291bnQsIE1DT2JqZWN0V3JpdGVyICpPVykgY29uc3QgeworICBzdGF0aWMgY29uc3QgdWludDhfdCBOb3BzWzE2XVsxNl0gPSB7CisgICAgLy8gbm9wCisgICAgezB4OTB9LAorICAgIC8vIHhjaGcgJWF4LCVheAorICAgIHsweDY2LCAweDkwfSwKKyAgICAvLyBub3BsICglW3JlXWF4KQorICAgIHsweDBmLCAweDFmLCAweDAwfSwKKyAgICAvLyBub3BsIDAoJVtyZV1heCkKKyAgICB7MHgwZiwgMHgxZiwgMHg0MCwgMHgwMH0sCisgICAgLy8gbm9wbCAwKCVbcmVdYXgsJVtyZV1heCwxKQorICAgIHsweDBmLCAweDFmLCAweDQ0LCAweDAwLCAweDAwfSwKKyAgICAvLyBub3B3IDAoJVtyZV1heCwlW3JlXWF4LDEpCisgICAgezB4NjYsIDB4MGYsIDB4MWYsIDB4NDQsIDB4MDAsIDB4MDB9LAorICAgIC8vIG5vcGwgMEwoJVtyZV1heCkKKyAgICB7MHgwZiwgMHgxZiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisgICAgLy8gbm9wbCAwTCglW3JlXWF4LCVbcmVdYXgsMSkKKyAgICB7MHgwZiwgMHgxZiwgMHg4NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisgICAgLy8gbm9wdyAwTCglW3JlXWF4LCVbcmVdYXgsMSkKKyAgICB7MHg2NiwgMHgwZiwgMHgxZiwgMHg4NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisgICAgLy8gbm9wdyAlY3M6MEwoJVtyZV1heCwlW3JlXWF4LDEpCisgICAgezB4NjYsIDB4MmUsIDB4MGYsIDB4MWYsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorICAgIC8vIG5vcGwgMCglW3JlXWF4LCVbcmVdYXgsMSkKKyAgICAvLyBub3B3IDAoJVtyZV1heCwlW3JlXWF4LDEpCisgICAgezB4MGYsIDB4MWYsIDB4NDQsIDB4MDAsIDB4MDAsCisgICAgIDB4NjYsIDB4MGYsIDB4MWYsIDB4NDQsIDB4MDAsIDB4MDB9LAorICAgIC8vIG5vcHcgMCglW3JlXWF4LCVbcmVdYXgsMSkKKyAgICAvLyBub3B3IDAoJVtyZV1heCwlW3JlXWF4LDEpCisgICAgezB4NjYsIDB4MGYsIDB4MWYsIDB4NDQsIDB4MDAsIDB4MDAsCisgICAgIDB4NjYsIDB4MGYsIDB4MWYsIDB4NDQsIDB4MDAsIDB4MDB9LAorICAgIC8vIG5vcHcgMCglW3JlXWF4LCVbcmVdYXgsMSkKKyAgICAvLyBub3BsIDBMKCVbcmVdYXgpICovCisgICAgezB4NjYsIDB4MGYsIDB4MWYsIDB4NDQsIDB4MDAsIDB4MDAsCisgICAgIDB4MGYsIDB4MWYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorICAgIC8vIG5vcGwgMEwoJVtyZV1heCkKKyAgICAvLyBub3BsIDBMKCVbcmVdYXgpCisgICAgezB4MGYsIDB4MWYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgIDB4MGYsIDB4MWYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorICAgIC8vIG5vcGwgMEwoJVtyZV1heCkKKyAgICAvLyBub3BsIDBMKCVbcmVdYXgsJVtyZV1heCwxKQorICAgIHsweDBmLCAweDFmLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAweDBmLCAweDFmLCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfQorICB9OworCisgIC8vIFdyaXRlIGFuIG9wdGltYWwgc2VxdWVuY2UgZm9yIHRoZSBmaXJzdCAxNSBieXRlcy4KKyAgdWludDY0X3QgT3B0aW1hbENvdW50ID0gKENvdW50IDwgMTYpID8gQ291bnQgOiAxNTsKKyAgZm9yICh1aW50NjRfdCBpID0gMCwgZSA9IE9wdGltYWxDb3VudDsgaSAhPSBlOyBpKyspCisgICAgT1ctPldyaXRlOChOb3BzW09wdGltYWxDb3VudCAtIDFdW2ldKTsKKworICAvLyBGaW5pc2ggd2l0aCBzaW5nbGUgYnl0ZSBub3BzLgorICBmb3IgKHVpbnQ2NF90IGkgPSBPcHRpbWFsQ291bnQsIGUgPSBDb3VudDsgaSAhPSBlOyArK2kpCisgICBPVy0+V3JpdGU4KDB4OTApOworCisgIHJldHVybiB0cnVlOworfQorCisvKiAqKiogKi8KKworbmFtZXNwYWNlIHsKK2NsYXNzIEVMRlg4NkFzbUJhY2tlbmQgOiBwdWJsaWMgWDg2QXNtQmFja2VuZCB7CitwdWJsaWM6CisgIEVMRlg4NkFzbUJhY2tlbmQoY29uc3QgVGFyZ2V0ICZUKQorICAgIDogWDg2QXNtQmFja2VuZChUKSB7CisgICAgSGFzQWJzb2x1dGl6ZWRTZXQgPSB0cnVlOworICAgIEhhc1NjYXR0ZXJlZFN5bWJvbHMgPSB0cnVlOworICB9CisKKyAgTUNPYmplY3RXcml0ZXIgKmNyZWF0ZU9iamVjdFdyaXRlcihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGJvb2wgaXNWaXJ0dWFsU2VjdGlvbihjb25zdCBNQ1NlY3Rpb24gJlNlY3Rpb24pIGNvbnN0IHsKKyAgICBjb25zdCBNQ1NlY3Rpb25FTEYgJlNFID0gc3RhdGljX2Nhc3Q8Y29uc3QgTUNTZWN0aW9uRUxGJj4oU2VjdGlvbik7CisgICAgcmV0dXJuIFNFLmdldFR5cGUoKSA9PSBNQ1NlY3Rpb25FTEY6OlNIVF9OT0JJVFM7OworICB9Cit9OworCitjbGFzcyBFTEZYODZfMzJBc21CYWNrZW5kIDogcHVibGljIEVMRlg4NkFzbUJhY2tlbmQgeworcHVibGljOgorICBFTEZYODZfMzJBc21CYWNrZW5kKGNvbnN0IFRhcmdldCAmVCkKKyAgICA6IEVMRlg4NkFzbUJhY2tlbmQoVCkge30KK307CisKK2NsYXNzIEVMRlg4Nl82NEFzbUJhY2tlbmQgOiBwdWJsaWMgRUxGWDg2QXNtQmFja2VuZCB7CitwdWJsaWM6CisgIEVMRlg4Nl82NEFzbUJhY2tlbmQoY29uc3QgVGFyZ2V0ICZUKQorICAgIDogRUxGWDg2QXNtQmFja2VuZChUKSB7fQorfTsKKworY2xhc3MgV2luZG93c1g4NkFzbUJhY2tlbmQgOiBwdWJsaWMgWDg2QXNtQmFja2VuZCB7CitwdWJsaWM6CisgIFdpbmRvd3NYODZBc21CYWNrZW5kKGNvbnN0IFRhcmdldCAmVCkKKyAgICA6IFg4NkFzbUJhY2tlbmQoVCkgeworICAgIEhhc1NjYXR0ZXJlZFN5bWJvbHMgPSB0cnVlOworICB9CisKKyAgTUNPYmplY3RXcml0ZXIgKmNyZWF0ZU9iamVjdFdyaXRlcihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICByZXR1cm4gY3JlYXRlV2luQ09GRk9iamVjdFdyaXRlciAoT1MpOworICB9CisKKyAgYm9vbCBpc1ZpcnR1YWxTZWN0aW9uKGNvbnN0IE1DU2VjdGlvbiAmU2VjdGlvbikgY29uc3QgeworICAgIGNvbnN0IE1DU2VjdGlvbkNPRkYgJlNFID0gc3RhdGljX2Nhc3Q8Y29uc3QgTUNTZWN0aW9uQ09GRiY+KFNlY3Rpb24pOworICAgIHJldHVybiBTRS5nZXRDaGFyYWN0ZXJpc3RpY3MoKSAmIENPRkY6OklNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBOworICB9Cit9OworCitjbGFzcyBEYXJ3aW5YODZBc21CYWNrZW5kIDogcHVibGljIFg4NkFzbUJhY2tlbmQgeworcHVibGljOgorICBEYXJ3aW5YODZBc21CYWNrZW5kKGNvbnN0IFRhcmdldCAmVCkKKyAgICA6IFg4NkFzbUJhY2tlbmQoVCkgeworICAgIEhhc0Fic29sdXRpemVkU2V0ID0gdHJ1ZTsKKyAgICBIYXNTY2F0dGVyZWRTeW1ib2xzID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNWaXJ0dWFsU2VjdGlvbihjb25zdCBNQ1NlY3Rpb24gJlNlY3Rpb24pIGNvbnN0IHsKKyAgICBjb25zdCBNQ1NlY3Rpb25NYWNoTyAmU01PID0gc3RhdGljX2Nhc3Q8Y29uc3QgTUNTZWN0aW9uTWFjaE8mPihTZWN0aW9uKTsKKyAgICByZXR1cm4gKFNNTy5nZXRUeXBlKCkgPT0gTUNTZWN0aW9uTWFjaE86OlNfWkVST0ZJTEwgfHwKKyAgICAgICAgICAgIFNNTy5nZXRUeXBlKCkgPT0gTUNTZWN0aW9uTWFjaE86OlNfR0JfWkVST0ZJTEwgfHwKKyAgICAgICAgICAgIFNNTy5nZXRUeXBlKCkgPT0gTUNTZWN0aW9uTWFjaE86OlNfVEhSRUFEX0xPQ0FMX1pFUk9GSUxMKTsKKyAgfQorfTsKKworY2xhc3MgRGFyd2luWDg2XzMyQXNtQmFja2VuZCA6IHB1YmxpYyBEYXJ3aW5YODZBc21CYWNrZW5kIHsKK3B1YmxpYzoKKyAgRGFyd2luWDg2XzMyQXNtQmFja2VuZChjb25zdCBUYXJnZXQgJlQpCisgICAgOiBEYXJ3aW5YODZBc21CYWNrZW5kKFQpIHt9CisKKyAgTUNPYmplY3RXcml0ZXIgKmNyZWF0ZU9iamVjdFdyaXRlcihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IE1hY2hPYmplY3RXcml0ZXIoT1MsIC8qSXM2NEJpdD0qL2ZhbHNlKTsKKyAgfQorfTsKKworY2xhc3MgRGFyd2luWDg2XzY0QXNtQmFja2VuZCA6IHB1YmxpYyBEYXJ3aW5YODZBc21CYWNrZW5kIHsKK3B1YmxpYzoKKyAgRGFyd2luWDg2XzY0QXNtQmFja2VuZChjb25zdCBUYXJnZXQgJlQpCisgICAgOiBEYXJ3aW5YODZBc21CYWNrZW5kKFQpIHsKKyAgICBIYXNSZWxpYWJsZVN5bWJvbERpZmZlcmVuY2UgPSB0cnVlOworICB9CisKKyAgTUNPYmplY3RXcml0ZXIgKmNyZWF0ZU9iamVjdFdyaXRlcihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IE1hY2hPYmplY3RXcml0ZXIoT1MsIC8qSXM2NEJpdD0qL3RydWUpOworICB9CisKKyAgdmlydHVhbCBib29sIGRvZXNTZWN0aW9uUmVxdWlyZVN5bWJvbHMoY29uc3QgTUNTZWN0aW9uICZTZWN0aW9uKSBjb25zdCB7CisgICAgLy8gVGVtcG9yYXJ5IGxhYmVscyBpbiB0aGUgc3RyaW5nIGxpdGVyYWxzIHNlY3Rpb25zIHJlcXVpcmUgc3ltYm9scy4gVGhlCisgICAgLy8gaXNzdWUgaXMgdGhhdCB0aGUgeDg2XzY0IHJlbG9jYXRpb24gZm9ybWF0IGRvZXMgbm90IGFsbG93IHN5bWJvbCArCisgICAgLy8gb2Zmc2V0LCBhbmQgc28gdGhlIGxpbmtlciBkb2VzIG5vdCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byByZXNvbHZlIHRoZQorICAgIC8vIGFjY2VzcyB0byB0aGUgYXBwcm9wcmlhdGUgYXRvbSB1bmxlc3MgYW4gZXh0ZXJuYWwgcmVsb2NhdGlvbiBpcyB1c2VkLiBGb3IKKyAgICAvLyBub24tY3N0cmluZyBzZWN0aW9ucywgd2UgZXhwZWN0IHRoZSBjb21waWxlciB0byB1c2UgYSBub24tdGVtcG9yYXJ5IGxhYmVsCisgICAgLy8gZm9yIGFueXRoaW5nIHRoYXQgY291bGQgaGF2ZSBhbiBhZGRlbmQgcG9pbnRpbmcgb3V0c2lkZSB0aGUgc3ltYm9sLgorICAgIC8vCisgICAgLy8gU2VlIDxyZGFyOi8vcHJvYmxlbS80NzY1NzMzPi4KKyAgICBjb25zdCBNQ1NlY3Rpb25NYWNoTyAmU01PID0gc3RhdGljX2Nhc3Q8Y29uc3QgTUNTZWN0aW9uTWFjaE8mPihTZWN0aW9uKTsKKyAgICByZXR1cm4gU01PLmdldFR5cGUoKSA9PSBNQ1NlY3Rpb25NYWNoTzo6U19DU1RSSU5HX0xJVEVSQUxTOworICB9CisKKyAgdmlydHVhbCBib29sIGlzU2VjdGlvbkF0b21pemFibGUoY29uc3QgTUNTZWN0aW9uICZTZWN0aW9uKSBjb25zdCB7CisgICAgY29uc3QgTUNTZWN0aW9uTWFjaE8gJlNNTyA9IHN0YXRpY19jYXN0PGNvbnN0IE1DU2VjdGlvbk1hY2hPJj4oU2VjdGlvbik7CisgICAgLy8gRml4ZWQgc2l6ZWQgZGF0YSBzZWN0aW9ucyBhcmUgdW5pcXVlZCwgdGhleSBjYW5ub3QgYmUgZGljZWQgaW50byBhdG9tcy4KKyAgICBzd2l0Y2ggKFNNTy5nZXRUeXBlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIE1DU2VjdGlvbk1hY2hPOjpTXzRCWVRFX0xJVEVSQUxTOgorICAgIGNhc2UgTUNTZWN0aW9uTWFjaE86OlNfOEJZVEVfTElURVJBTFM6CisgICAgY2FzZSBNQ1NlY3Rpb25NYWNoTzo6U18xNkJZVEVfTElURVJBTFM6CisgICAgY2FzZSBNQ1NlY3Rpb25NYWNoTzo6U19MSVRFUkFMX1BPSU5URVJTOgorICAgIGNhc2UgTUNTZWN0aW9uTWFjaE86OlNfTk9OX0xBWllfU1lNQk9MX1BPSU5URVJTOgorICAgIGNhc2UgTUNTZWN0aW9uTWFjaE86OlNfTEFaWV9TWU1CT0xfUE9JTlRFUlM6CisgICAgY2FzZSBNQ1NlY3Rpb25NYWNoTzo6U19NT0RfSU5JVF9GVU5DX1BPSU5URVJTOgorICAgIGNhc2UgTUNTZWN0aW9uTWFjaE86OlNfTU9EX1RFUk1fRlVOQ19QT0lOVEVSUzoKKyAgICBjYXNlIE1DU2VjdGlvbk1hY2hPOjpTX0lOVEVSUE9TSU5HOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZSAKKworVGFyZ2V0QXNtQmFja2VuZCAqbGx2bTo6Y3JlYXRlWDg2XzMyQXNtQmFja2VuZChjb25zdCBUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCkgeworICBzd2l0Y2ggKFRyaXBsZShUVCkuZ2V0T1MoKSkgeworICBjYXNlIFRyaXBsZTo6RGFyd2luOgorICAgIHJldHVybiBuZXcgRGFyd2luWDg2XzMyQXNtQmFja2VuZChUKTsKKyAgY2FzZSBUcmlwbGU6Ok1pbkdXMzI6CisgIGNhc2UgVHJpcGxlOjpDeWd3aW46CisgIGNhc2UgVHJpcGxlOjpXaW4zMjoKKyAgICByZXR1cm4gbmV3IFdpbmRvd3NYODZBc21CYWNrZW5kKFQpOworICBkZWZhdWx0OgorICAgIHJldHVybiBuZXcgRUxGWDg2XzMyQXNtQmFja2VuZChUKTsKKyAgfQorfQorCitUYXJnZXRBc21CYWNrZW5kICpsbHZtOjpjcmVhdGVYODZfNjRBc21CYWNrZW5kKGNvbnN0IFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlRUKSB7CisgIHN3aXRjaCAoVHJpcGxlKFRUKS5nZXRPUygpKSB7CisgIGNhc2UgVHJpcGxlOjpEYXJ3aW46CisgICAgcmV0dXJuIG5ldyBEYXJ3aW5YODZfNjRBc21CYWNrZW5kKFQpOworICBkZWZhdWx0OgorICAgIHJldHVybiBuZXcgRUxGWDg2XzY0QXNtQmFja2VuZChUKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2QXNtUHJpbnRlci5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2QXNtUHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MWJlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZBc21QcmludGVyLmgKQEAgLTAsMCArMSw4OSBAQAorLy89PT0tLSBYODZBc21QcmludGVyLmggLSBDb252ZXJ0IFg4NiBMTFZNIGNvZGUgdG8gYXNzZW1ibHkgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBVCZUIGFzc2VtYmx5IGNvZGUgcHJpbnRlciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFg4NkFTTVBSSU5URVJfSAorI2RlZmluZSBYODZBU01QUklOVEVSX0gKKworI2luY2x1ZGUgIlg4Ni5oIgorI2luY2x1ZGUgIlg4Nk1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJYODZUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVKdW1wVGFibGVJbmZvOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNJbnN0OworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIE1DU3ltYm9sOworCitjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBYODZBc21QcmludGVyIDogcHVibGljIEFzbVByaW50ZXIgeworICBjb25zdCBYODZTdWJ0YXJnZXQgKlN1YnRhcmdldDsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFg4NkFzbVByaW50ZXIoVGFyZ2V0TWFjaGluZSAmVE0sIE1DU3RyZWFtZXIgJlN0cmVhbWVyKQorICAgIDogQXNtUHJpbnRlcihUTSwgU3RyZWFtZXIpIHsKKyAgICBTdWJ0YXJnZXQgPSAmVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKTsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJYODYgQVQmVC1TdHlsZSBBc3NlbWJseSBQcmludGVyIjsKKyAgfQorICAKKyAgY29uc3QgWDg2U3VidGFyZ2V0ICZnZXRTdWJ0YXJnZXQoKSBjb25zdCB7IHJldHVybiAqU3VidGFyZ2V0OyB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRTdGFydE9mQXNtRmlsZShNb2R1bGUgJk0pOworCisgIHZpcnR1YWwgdm9pZCBFbWl0RW5kT2ZBc21GaWxlKE1vZHVsZSAmTSk7CisgIAorICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworICAKKyAgdm9pZCBwcmludFN5bWJvbE9wZXJhbmQoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLCByYXdfb3N0cmVhbSAmTyk7CisKKyAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgdXNlZCBieSB0aGUgdGFibGVnZW4nZXJhdGVkIGluc3RydWN0aW9uIHByaW50ZXIuCisgIHZvaWQgcHJpbnRPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNb2RpZmllciA9IDApOworICB2b2lkIHByaW50X3BjcmVsX2ltbShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLCByYXdfb3N0cmVhbSAmTyk7CisKKyAgYm9vbCBwcmludEFzbU1SZWdpc3Rlcihjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8sIGNoYXIgTW9kZSwgcmF3X29zdHJlYW0gJk8pOworICBib29sIFByaW50QXNtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7CisgIGJvb2wgUHJpbnRBc21NZW1vcnlPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKKworICB2b2lkIHByaW50TWFjaGluZUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworICB2b2lkIHByaW50U1NFQ0MoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3AsIHJhd19vc3RyZWFtICZPKTsKKyAgdm9pZCBwcmludE1lbVJlZmVyZW5jZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcCwgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTW9kaWZpZXI9TlVMTCk7CisgIHZvaWQgcHJpbnRMZWFNZW1SZWZlcmVuY2UoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3AsIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1vZGlmaWVyPU5VTEwpOworCisgIHZvaWQgcHJpbnRQSUNMYWJlbChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcCwgcmF3X29zdHJlYW0gJk8pOworCisgIHZvaWQgUHJpbnRQSUNCYXNlU3ltYm9sKHJhd19vc3RyZWFtICZPKSBjb25zdDsKKyAgCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKTsKKyAgCisgIHZvaWQgUHJpbnREZWJ1Z1ZhbHVlQ29tbWVudChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmT1MpOworCisgIE1hY2hpbmVMb2NhdGlvbiBnZXREZWJ1Z1ZhbHVlTG9jYXRpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkNPRkZNYWNoaW5lTW9kdWxlSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZDT0ZGTWFjaGluZU1vZHVsZUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjY4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZDT0ZGTWFjaGluZU1vZHVsZUluZm8uY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1g4NkNPRkZNYWNoaW5lTW9kdWxlSW5mby5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpcyBhbiBNTUkgaW1wbGVtZW50YXRpb24gZm9yIFg4NiBDT0ZGICh3aW5kb3dzKSB0YXJnZXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJYODZDT0ZGTWFjaGluZU1vZHVsZUluZm8uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisKK1g4NkNPRkZNYWNoaW5lTW9kdWxlSW5mbzo6flg4NkNPRkZNYWNoaW5lTW9kdWxlSW5mbygpIHsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZDT0ZGTWFjaGluZU1vZHVsZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGFiMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvLmgKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvLmggLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIGFuIE1NSSBpbXBsZW1lbnRhdGlvbiBmb3IgWDg2IENPRkYgKHdpbmRvd3MpIHRhcmdldHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBYODZDT0ZGX01BQ0hJTkVNT0RVTEVJTkZPX0gKKyNkZWZpbmUgWDg2Q09GRl9NQUNISU5FTU9EVUxFSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgIlg4Nk1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBYODZNYWNoaW5lRnVuY3Rpb25JbmZvOworICBjbGFzcyBUYXJnZXREYXRhOworCisvLy8gWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvIC0gVGhpcyBpcyBhIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCBpbXBsZW1lbnRhdGlvbgorLy8vIGZvciBYODYgQ09GRiB0YXJnZXRzLgorY2xhc3MgWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvIDogcHVibGljIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCB7CisgIERlbnNlU2V0PE1DU3ltYm9sIGNvbnN0ICo+IEV4dGVybmFsczsKK3B1YmxpYzoKKyAgWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvKGNvbnN0IE1hY2hpbmVNb2R1bGVJbmZvICYpIHt9CisgIHZpcnR1YWwgflg4NkNPRkZNYWNoaW5lTW9kdWxlSW5mbygpOworCisgIHZvaWQgYWRkRXh0ZXJuYWxGdW5jdGlvbihNQ1N5bWJvbCogU3ltYm9sKSB7CisgICAgRXh0ZXJuYWxzLmluc2VydChTeW1ib2wpOworICB9CisgICAgCisgIHR5cGVkZWYgRGVuc2VTZXQ8TUNTeW1ib2wgY29uc3QgKj46OmNvbnN0X2l0ZXJhdG9yIGV4dGVybmFsc19pdGVyYXRvcjsKKyAgZXh0ZXJuYWxzX2l0ZXJhdG9yIGV4dGVybmFsc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEV4dGVybmFscy5iZWdpbigpOyB9CisgIGV4dGVybmFsc19pdGVyYXRvciBleHRlcm5hbHNfZW5kKCkgY29uc3QgeyByZXR1cm4gRXh0ZXJuYWxzLmVuZCgpOyB9Cit9OworCisKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZDYWxsaW5nQ29udi50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkNhbGxpbmdDb252LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTk4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZDYWxsaW5nQ29udi50ZApAQCAtMCwwICsxLDM4MiBAQAorLy89PT0tIFg4NkNhbGxpbmdDb252LnRkIC0gQ2FsbGluZyBDb252ZW50aW9ucyBYODYgMzIvNjQgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZGVzY3JpYmVzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciB0aGUgWDg2LTMyIGFuZCBYODYtNjQNCisvLyBhcmNoaXRlY3R1cmVzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLy8gQ0NJZlN1YnRhcmdldCAtIE1hdGNoIGlmIHRoZSBjdXJyZW50IHN1YnRhcmdldCBoYXMgYSBmZWF0dXJlIEYuDQorY2xhc3MgQ0NJZlN1YnRhcmdldDxzdHJpbmcgRiwgQ0NBY3Rpb24gQT4NCisgOiBDQ0lmPCFzdHJjb25jYXQoIlN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuIiwgRiksIEE+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gUmV0dXJuIFZhbHVlIENhbGxpbmcgQ29udmVudGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIFJldHVybi12YWx1ZSBjb252ZW50aW9ucyBjb21tb24gdG8gYWxsIFg4NiBDQydzLg0KK2RlZiBSZXRDQ19YODZDb21tb24gOiBDYWxsaW5nQ29udjxbDQorICAvLyBTY2FsYXIgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBBWCBmaXJzdCwgdGhlbiBEWC4gIEZvciBpOCwgdGhlIEFCSQ0KKyAgLy8gcmVxdWlyZXMgdGhlIHZhbHVlcyB0byBiZSBpbiBBTCBhbmQgQUgsIGhvd2V2ZXIgdGhpcyBjb2RlIHVzZXMgQUwgYW5kIERMDQorICAvLyBpbnN0ZWFkLiBUaGlzIGlzIGJlY2F1c2UgdXNpbmcgQUggZm9yIHRoZSBzZWNvbmQgcmVnaXN0ZXIgY29uZmxpY3RzIHdpdGgNCisgIC8vIHRoZSB3YXkgTExWTSBkb2VzIG11bHRpcGxlIHJldHVybiB2YWx1ZXMgLS0gYSByZXR1cm4gb2Yge2kxNixpOH0gd291bGQgZW5kDQorICAvLyB1cCBpbiBBWCBhbmQgQUgsIHdoaWNoIG92ZXJsYXAuIEZyb250LWVuZHMgd2lzaGluZyB0byBjb25mb3JtIHRvIHRoZSBBQkkNCisgIC8vIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gdHdvIGk4IHZhbHVlcyBhcmUgY3VycmVudGx5IGV4cGVjdGVkIHRvIHBhY2sgdGhlDQorICAvLyB2YWx1ZXMgaW50byBhbiBpMTYgKHdoaWNoIHVzZXMgQVgsIGFuZCB0aHVzIEFMOkFIKS4NCisgIENDSWZUeXBlPFtpOF0gLCBDQ0Fzc2lnblRvUmVnPFtBTCwgRExdPj4sDQorICBDQ0lmVHlwZTxbaTE2XSwgQ0NBc3NpZ25Ub1JlZzxbQVgsIERYXT4+LA0KKyAgQ0NJZlR5cGU8W2kzMl0sIENDQXNzaWduVG9SZWc8W0VBWCwgRURYXT4+LA0KKyAgQ0NJZlR5cGU8W2k2NF0sIENDQXNzaWduVG9SZWc8W1JBWCwgUkRYXT4+LA0KKw0KKyAgLy8gVmVjdG9yIHR5cGVzIGFyZSByZXR1cm5lZCBpbiBYTU0wIGFuZCBYTU0xLCB3aGVuIHRoZXkgZml0LiAgWE1NMiBhbmQgWE1NMw0KKyAgLy8gY2FuIG9ubHkgYmUgdXNlZCBieSBBQkkgbm9uLWNvbXBsaWFudCBjb2RlLiBJZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBYTU0NCisgIC8vIHJlZ2lzdGVycywgaXQgd29uJ3QgaGF2ZSB2ZWN0b3IgdHlwZXMuDQorICBDQ0lmVHlwZTxbdjE2aTgsIHY4aTE2LCB2NGkzMiwgdjJpNjQsIHY0ZjMyLCB2MmY2NF0sDQorICAgICAgICAgICAgQ0NBc3NpZ25Ub1JlZzxbWE1NMCxYTU0xLFhNTTIsWE1NM10+PiwNCisNCisgIC8vIDI1Ni1iaXQgdmVjdG9ycyBhcmUgcmV0dXJuZWQgaW4gWU1NMCBhbmQgWE1NMSwgd2hlbiB0aGV5IGZpdC4gWU1NMiBhbmQgWU1NMw0KKyAgLy8gY2FuIG9ubHkgYmUgdXNlZCBieSBBQkkgbm9uLWNvbXBsaWFudCBjb2RlLiBUaGlzIHZlY3RvciB0eXBlIGlzIG9ubHkNCisgIC8vIHN1cHBvcnRlZCB3aGlsZSB1c2luZyB0aGUgQVZYIHRhcmdldCBmZWF0dXJlLg0KKyAgQ0NJZlR5cGU8W3YzMmk4LCB2MTZpMTYsIHY4aTMyLCB2NGk2NCwgdjhmMzIsIHY0ZjY0XSwNCisgICAgICAgICAgICBDQ0lmU3VidGFyZ2V0PCJoYXNBVlgoKSIsIENDQXNzaWduVG9SZWc8W1lNTTAsWU1NMSxZTU0yLFlNTTNdPj4+LA0KKw0KKyAgLy8gTU1YIHZlY3RvciB0eXBlcyBhcmUgYWx3YXlzIHJldHVybmVkIGluIE1NMC4gSWYgdGhlIHRhcmdldCBkb2Vzbid0IGhhdmUNCisgIC8vIE1NMCwgaXQgZG9lc24ndCBzdXBwb3J0IHRoZXNlIHZlY3RvciB0eXBlcy4NCisgIENDSWZUeXBlPFt2OGk4LCB2NGkxNiwgdjJpMzIsIHYxaTY0XSwgQ0NBc3NpZ25Ub1JlZzxbTU0wXT4+LA0KKw0KKyAgLy8gTG9uZyBkb3VibGUgdHlwZXMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbiBTVDAgKGV2ZW4gd2l0aCBTU0UpLg0KKyAgQ0NJZlR5cGU8W2Y4MF0sIENDQXNzaWduVG9SZWc8W1NUMCwgU1QxXT4+DQorXT47DQorDQorLy8gWDg2LTMyIEMgcmV0dXJuLXZhbHVlIGNvbnZlbnRpb24uDQorZGVmIFJldENDX1g4Nl8zMl9DIDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gVGhlIFg4Ni0zMiBjYWxsaW5nIGNvbnZlbnRpb24gcmV0dXJucyBGUCB2YWx1ZXMgaW4gU1QwLCB1bmxlc3MgbWFya2VkDQorICAvLyB3aXRoICJpbnJlZyIgKHVzZWQgaGVyZSB0byBkaXN0aW5ndWlzaCBvbmUga2luZCBvZiByZWcgZnJvbSBhbm90aGVyLA0KKyAgLy8gd2VpcmRseTsgdGhpcyBpcyByZWFsbHkgdGhlIHNzZS1yZWdwYXJtIGNhbGxpbmcgY29udmVudGlvbikgaW4gd2hpY2gNCisgIC8vIGNhc2UgdGhleSB1c2UgWE1NMCwgb3RoZXJ3aXNlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBjb21tb24gWDg2IGNhbGxpbmcNCisgIC8vIGNvbnYuDQorICBDQ0lmSW5SZWc8Q0NJZlN1YnRhcmdldDwiaGFzU1NFMigpIiwNCisgICAgQ0NJZlR5cGU8W2YzMiwgZjY0XSwgQ0NBc3NpZ25Ub1JlZzxbWE1NMCxYTU0xLFhNTTJdPj4+PiwNCisgIENDSWZUeXBlPFtmMzIsZjY0XSwgQ0NBc3NpZ25Ub1JlZzxbU1QwLCBTVDFdPj4sDQorICBDQ0RlbGVnYXRlVG88UmV0Q0NfWDg2Q29tbW9uPg0KK10+Ow0KKw0KKy8vIFg4Ni0zMiBGYXN0Q0MgcmV0dXJuLXZhbHVlIGNvbnZlbnRpb24uDQorZGVmIFJldENDX1g4Nl8zMl9GYXN0IDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gVGhlIFg4Ni0zMiBmYXN0Y2MgcmV0dXJucyAxLCAyLCBvciAzIEZQIHZhbHVlcyBpbiBYTU0wLTIgaWYgdGhlIHRhcmdldCBoYXMNCisgIC8vIFNTRTIuDQorICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGZsb2F0LCAyIHggZmxvYXQsIG9yIDMgeCBmbG9hdCB2ZWN0b3IgaXMgc3BsaXQgYnkNCisgIC8vIHRhcmdldCBsb3dlcmluZywgYW5kIGlzIHJldHVybmVkIGluIDEtMyBzc2UgcmVncy4NCisgIENDSWZUeXBlPFtmMzJdLCBDQ0lmU3VidGFyZ2V0PCJoYXNTU0UyKCkiLCBDQ0Fzc2lnblRvUmVnPFtYTU0wLFhNTTEsWE1NMl0+Pj4sDQorICBDQ0lmVHlwZTxbZjY0XSwgQ0NJZlN1YnRhcmdldDwiaGFzU1NFMigpIiwgQ0NBc3NpZ25Ub1JlZzxbWE1NMCxYTU0xLFhNTTJdPj4+LA0KKw0KKyAgLy8gRm9yIGludGVnZXJzLCBFQ1ggY2FuIGJlIHVzZWQgYXMgYW4gZXh0cmEgcmV0dXJuIHJlZ2lzdGVyDQorICBDQ0lmVHlwZTxbaThdLCAgQ0NBc3NpZ25Ub1JlZzxbQUwsIERMLCBDTF0+PiwNCisgIENDSWZUeXBlPFtpMTZdLCBDQ0Fzc2lnblRvUmVnPFtBWCwgRFgsIENYXT4+LA0KKyAgQ0NJZlR5cGU8W2kzMl0sIENDQXNzaWduVG9SZWc8W0VBWCwgRURYLCBFQ1hdPj4sDQorDQorICAvLyBPdGhlcndpc2UsIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBjb21tb24gWDg2IGNhbGxpbmcgY29udmVudGlvbi4NCisgIENDRGVsZWdhdGVUbzxSZXRDQ19YODZDb21tb24+DQorXT47DQorDQorLy8gWDg2LTY0IEMgcmV0dXJuLXZhbHVlIGNvbnZlbnRpb24uDQorZGVmIFJldENDX1g4Nl82NF9DIDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gVGhlIFg4Ni02NCBjYWxsaW5nIGNvbnZlbnRpb24gYWx3YXlzIHJldHVybnMgRlAgdmFsdWVzIGluIFhNTTAuDQorICBDQ0lmVHlwZTxbZjMyXSwgQ0NBc3NpZ25Ub1JlZzxbWE1NMCwgWE1NMV0+PiwNCisgIENDSWZUeXBlPFtmNjRdLCBDQ0Fzc2lnblRvUmVnPFtYTU0wLCBYTU0xXT4+LA0KKw0KKyAgLy8gTU1YIHZlY3RvciB0eXBlcyBhcmUgYWx3YXlzIHJldHVybmVkIGluIFhNTTAgZXhjZXB0IGZvciB2MWk2NCB3aGljaCBpcw0KKyAgLy8gcmV0dXJuZWQgaW4gUkFYLiBUaGlzIGRpc2FncmVlcyB3aXRoIEFCSSBkb2N1bWVudGF0aW9uIGJ1dCBpcyBidWcNCisgIC8vIGNvbXBhdGlibGUgd2l0aCBnY2MuDQorICBDQ0lmVHlwZTxbdjFpNjRdLCBDQ0Fzc2lnblRvUmVnPFtSQVhdPj4sDQorICBDQ0lmVHlwZTxbdjhpOCwgdjRpMTYsIHYyaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbWE1NMCwgWE1NMV0+PiwNCisgIENDRGVsZWdhdGVUbzxSZXRDQ19YODZDb21tb24+DQorXT47DQorDQorLy8gWDg2LVdpbjY0IEMgcmV0dXJuLXZhbHVlIGNvbnZlbnRpb24uDQorZGVmIFJldENDX1g4Nl9XaW42NF9DIDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gVGhlIFg4Ni1XaW42NCBjYWxsaW5nIGNvbnZlbnRpb24gYWx3YXlzIHJldHVybnMgX19tNjQgdmFsdWVzIGluIFJBWC4NCisgIENDSWZUeXBlPFt2OGk4LCB2NGkxNiwgdjJpMzIsIHYxaTY0XSwgQ0NCaXRDb252ZXJ0VG9UeXBlPGk2ND4+LA0KKw0KKyAgLy8gQW5kIEZQIGluIFhNTTAgb25seS4NCisgIENDSWZUeXBlPFtmMzJdLCBDQ0Fzc2lnblRvUmVnPFtYTU0wXT4+LA0KKyAgQ0NJZlR5cGU8W2Y2NF0sIENDQXNzaWduVG9SZWc8W1hNTTBdPj4sDQorDQorICAvLyBPdGhlcndpc2UsIGV2ZXJ5dGhpbmcgaXMgdGhlIHNhbWUgYXMgJ25vcm1hbCcgWDg2LTY0IEMgQ0MuDQorICBDQ0RlbGVnYXRlVG88UmV0Q0NfWDg2XzY0X0M+DQorXT47DQorDQorDQorLy8gVGhpcyBpcyB0aGUgcm9vdCByZXR1cm4tdmFsdWUgY29udmVudGlvbiBmb3IgdGhlIFg4Ni0zMiBiYWNrZW5kLg0KK2RlZiBSZXRDQ19YODZfMzIgOiBDYWxsaW5nQ29udjxbDQorICAvLyBJZiBGYXN0Q0MsIHVzZSBSZXRDQ19YODZfMzJfRmFzdC4NCisgIENDSWZDQzwiQ2FsbGluZ0NvbnY6OkZhc3QiLCBDQ0RlbGVnYXRlVG88UmV0Q0NfWDg2XzMyX0Zhc3Q+PiwNCisgIC8vIE90aGVyd2lzZSwgdXNlIFJldENDX1g4Nl8zMl9DLg0KKyAgQ0NEZWxlZ2F0ZVRvPFJldENDX1g4Nl8zMl9DPg0KK10+Ow0KKw0KKy8vIFRoaXMgaXMgdGhlIHJvb3QgcmV0dXJuLXZhbHVlIGNvbnZlbnRpb24gZm9yIHRoZSBYODYtNjQgYmFja2VuZC4NCitkZWYgUmV0Q0NfWDg2XzY0IDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gTWluZ3c2NCBhbmQgbmF0aXZlIFdpbjY0IHVzZSBXaW42NCBDQw0KKyAgQ0NJZlN1YnRhcmdldDwiaXNUYXJnZXRXaW42NCgpIiwgQ0NEZWxlZ2F0ZVRvPFJldENDX1g4Nl9XaW42NF9DPj4sDQorDQorICAvLyBPdGhlcndpc2UsIGRyb3AgdG8gbm9ybWFsIFg4Ni02NCBDQw0KKyAgQ0NEZWxlZ2F0ZVRvPFJldENDX1g4Nl82NF9DPg0KK10+Ow0KKw0KKy8vIFRoaXMgaXMgdGhlIHJldHVybi12YWx1ZSBjb252ZW50aW9uIHVzZWQgZm9yIHRoZSBlbnRpcmUgWDg2IGJhY2tlbmQuDQorZGVmIFJldENDX1g4NiA6IENhbGxpbmdDb252PFsNCisgIENDSWZTdWJ0YXJnZXQ8ImlzNjRCaXQoKSIsIENDRGVsZWdhdGVUbzxSZXRDQ19YODZfNjQ+PiwNCisgIENDRGVsZWdhdGVUbzxSZXRDQ19YODZfMzI+DQorXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBYODYtNjQgQXJndW1lbnQgQ2FsbGluZyBDb252ZW50aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorZGVmIENDX1g4Nl82NF9DIDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gSGFuZGxlcyBieXZhbCBwYXJhbWV0ZXJzLg0KKyAgQ0NJZkJ5VmFsPENDUGFzc0J5VmFsPDgsIDg+PiwNCisNCisgIC8vIFByb21vdGUgaTgvaTE2IGFyZ3VtZW50cyB0byBpMzIuDQorICBDQ0lmVHlwZTxbaTgsIGkxNl0sIENDUHJvbW90ZVRvVHlwZTxpMzI+PiwNCisNCisgIC8vIFRoZSAnbmVzdCcgcGFyYW1ldGVyLCBpZiBhbnksIGlzIHBhc3NlZCBpbiBSMTAuDQorICBDQ0lmTmVzdDxDQ0Fzc2lnblRvUmVnPFtSMTBdPj4sDQorDQorICAvLyBUaGUgZmlyc3QgNiB2MWk2NCB2ZWN0b3IgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gR1BScyBvbiBEYXJ3aW4uDQorICBDQ0lmVHlwZTxbdjFpNjRdLA0KKyAgICAgICAgICAgIENDSWZTdWJ0YXJnZXQ8ImlzVGFyZ2V0RGFyd2luKCkiLA0KKyAgICAgICAgICAgIENDQml0Q29udmVydFRvVHlwZTxpNjQ+Pj4sDQorDQorICAvLyBUaGUgZmlyc3QgNiBpbnRlZ2VyIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzLg0KKyAgQ0NJZlR5cGU8W2kzMl0sIENDQXNzaWduVG9SZWc8W0VESSwgRVNJLCBFRFgsIEVDWCwgUjhELCBSOURdPj4sDQorICBDQ0lmVHlwZTxbaTY0XSwgQ0NBc3NpZ25Ub1JlZzxbUkRJLCBSU0ksIFJEWCwgUkNYLCBSOCAsIFI5IF0+PiwNCisNCisgIC8vIFRoZSBmaXJzdCA4IE1NWCAoZXhjZXB0IGZvciB2MWk2NCkgdmVjdG9yIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIFhNTQ0KKyAgLy8gcmVnaXN0ZXJzIG9uIERhcndpbi4NCisgIENDSWZUeXBlPFt2OGk4LCB2NGkxNiwgdjJpMzJdLA0KKyAgICAgICAgICAgIENDSWZTdWJ0YXJnZXQ8ImlzVGFyZ2V0RGFyd2luKCkiLA0KKyAgICAgICAgICAgIENDSWZTdWJ0YXJnZXQ8Imhhc1NTRTIoKSIsDQorICAgICAgICAgICAgQ0NQcm9tb3RlVG9UeXBlPHYyaTY0Pj4+PiwNCisNCisgIC8vIFRoZSBmaXJzdCA4IEZQL1ZlY3RvciBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBYTU0gcmVnaXN0ZXJzLg0KKyAgQ0NJZlR5cGU8W2YzMiwgZjY0LCB2MTZpOCwgdjhpMTYsIHY0aTMyLCB2Mmk2NCwgdjRmMzIsIHYyZjY0XSwNCisgICAgICAgICAgICBDQ0lmU3VidGFyZ2V0PCJoYXNTU0UxKCkiLA0KKyAgICAgICAgICAgIENDQXNzaWduVG9SZWc8W1hNTTAsIFhNTTEsIFhNTTIsIFhNTTMsIFhNTTQsIFhNTTUsIFhNTTYsIFhNTTddPj4+LA0KKw0KKyAgLy8gVGhlIGZpcnN0IDggMjU2LWJpdCB2ZWN0b3IgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gWU1NIHJlZ2lzdGVycy4NCisgIENDSWZUeXBlPFt2MzJpOCwgdjE2aTE2LCB2OGkzMiwgdjRpNjQsIHY4ZjMyLCB2NGY2NF0sDQorICAgICAgICAgICAgQ0NJZlN1YnRhcmdldDwiaGFzQVZYKCkiLA0KKyAgICAgICAgICAgIENDQXNzaWduVG9SZWc8W1lNTTAsIFlNTTEsIFlNTTIsIFlNTTMsIFlNTTQsIFlNTTUsIFlNTTYsIFlNTTddPj4+LA0KKw0KKyAgLy8gSW50ZWdlci9GUCB2YWx1ZXMgZ2V0IHN0b3JlZCBpbiBzdGFjayBzbG90cyB0aGF0IGFyZSA4IGJ5dGVzIGluIHNpemUgYW5kDQorICAvLyA4LWJ5dGUgYWxpZ25lZCBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZWdpc3RlcnMgdG8gaG9sZCB0aGVtLg0KKyAgQ0NJZlR5cGU8W2kzMiwgaTY0LCBmMzIsIGY2NF0sIENDQXNzaWduVG9TdGFjazw4LCA4Pj4sDQorDQorICAvLyBMb25nIGRvdWJsZXMgZ2V0IHN0YWNrIHNsb3RzIHdob3NlIHNpemUgYW5kIGFsaWdubWVudCBkZXBlbmRzIG9uIHRoZQ0KKyAgLy8gc3VidGFyZ2V0Lg0KKyAgQ0NJZlR5cGU8W2Y4MF0sIENDQXNzaWduVG9TdGFjazwwLCAwPj4sDQorDQorICAvLyBWZWN0b3JzIGdldCAxNi1ieXRlIHN0YWNrIHNsb3RzIHRoYXQgYXJlIDE2LWJ5dGUgYWxpZ25lZC4NCisgIENDSWZUeXBlPFt2MTZpOCwgdjhpMTYsIHY0aTMyLCB2Mmk2NCwgdjRmMzIsIHYyZjY0XSwgQ0NBc3NpZ25Ub1N0YWNrPDE2LCAxNj4+LA0KKw0KKyAgLy8gMjU2LWJpdCB2ZWN0b3JzIGdldCAzMi1ieXRlIHN0YWNrIHNsb3RzIHRoYXQgYXJlIDMyLWJ5dGUgYWxpZ25lZC4NCisgIENDSWZUeXBlPFt2MzJpOCwgdjE2aTE2LCB2OGkzMiwgdjRpNjQsIHY4ZjMyLCB2NGY2NF0sDQorICAgICAgICAgICBDQ0Fzc2lnblRvU3RhY2s8MzIsIDMyPj4sDQorDQorICAvLyBfX202NCB2ZWN0b3JzIGdldCA4LWJ5dGUgc3RhY2sgc2xvdHMgdGhhdCBhcmUgOC1ieXRlIGFsaWduZWQuDQorICBDQ0lmVHlwZTxbdjhpOCwgdjRpMTYsIHYyaTMyLCB2MWk2NF0sIENDQXNzaWduVG9TdGFjazw4LCA4Pj4NCitdPjsNCisNCisvLyBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBvbiBXaW42NA0KK2RlZiBDQ19YODZfV2luNjRfQyA6IENhbGxpbmdDb252PFsNCisgIC8vIEZJWE1FOiBIYW5kbGUgYnl2YWwgc3R1ZmYuDQorICAvLyBGSVhNRTogSGFuZGxlIHZhcmFyZ3MuDQorDQorICAvLyBQcm9tb3RlIGk4L2kxNiBhcmd1bWVudHMgdG8gaTMyLg0KKyAgQ0NJZlR5cGU8W2k4LCBpMTZdLCBDQ1Byb21vdGVUb1R5cGU8aTMyPj4sDQorDQorICAvLyBUaGUgJ25lc3QnIHBhcmFtZXRlciwgaWYgYW55LCBpcyBwYXNzZWQgaW4gUjEwLg0KKyAgQ0NJZk5lc3Q8Q0NBc3NpZ25Ub1JlZzxbUjEwXT4+LA0KKw0KKyAgLy8gMTI4IGJpdCB2ZWN0b3JzIGFyZSBwYXNzZWQgYnkgcG9pbnRlcg0KKyAgQ0NJZlR5cGU8W3YxNmk4LCB2OGkxNiwgdjRpMzIsIHYyaTY0LCB2NGYzMiwgdjJmNjRdLCBDQ1Bhc3NJbmRpcmVjdDxpNjQ+PiwNCisNCisgIC8vIFRoZSBmaXJzdCA0IE1NWCB2ZWN0b3IgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gR1BScy4NCisgIENDSWZUeXBlPFt2OGk4LCB2NGkxNiwgdjJpMzIsIHYxaTY0XSwNCisgICAgICAgICAgIENDQml0Q29udmVydFRvVHlwZTxpNjQ+PiwNCisNCisgIC8vIFRoZSBmaXJzdCA0IGludGVnZXIgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnMuDQorICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZ1dpdGhTaGFkb3c8W0VDWCAsIEVEWCAsIFI4RCAsIFI5RCBdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtYTU0wLCBYTU0xLCBYTU0yLCBYTU0zXT4+LA0KKyAgQ0NJZlR5cGU8W2k2NF0sIENDQXNzaWduVG9SZWdXaXRoU2hhZG93PFtSQ1ggLCBSRFggLCBSOCAgLCBSOSAgXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWE1NMCwgWE1NMSwgWE1NMiwgWE1NM10+PiwNCisNCisgIC8vIFRoZSBmaXJzdCA0IEZQL1ZlY3RvciBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBYTU0gcmVnaXN0ZXJzLg0KKyAgQ0NJZlR5cGU8W2YzMiwgZjY0LCB2MTZpOCwgdjhpMTYsIHY0aTMyLCB2Mmk2NCwgdjRmMzIsIHYyZjY0XSwNCisgICAgICAgICAgIENDQXNzaWduVG9SZWdXaXRoU2hhZG93PFtYTU0wLCBYTU0xLCBYTU0yLCBYTU0zXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSQ1ggLCBSRFggLCBSOCAgLCBSOSAgXT4+LA0KKw0KKyAgLy8gSW50ZWdlci9GUCB2YWx1ZXMgZ2V0IHN0b3JlZCBpbiBzdGFjayBzbG90cyB0aGF0IGFyZSA4IGJ5dGVzIGluIHNpemUgYW5kDQorICAvLyA4LWJ5dGUgYWxpZ25lZCBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZWdpc3RlcnMgdG8gaG9sZCB0aGVtLg0KKyAgQ0NJZlR5cGU8W2kzMiwgaTY0LCBmMzIsIGY2NF0sIENDQXNzaWduVG9TdGFjazw4LCA4Pj4sDQorDQorICAvLyBMb25nIGRvdWJsZXMgZ2V0IHN0YWNrIHNsb3RzIHdob3NlIHNpemUgYW5kIGFsaWdubWVudCBkZXBlbmRzIG9uIHRoZQ0KKyAgLy8gc3VidGFyZ2V0Lg0KKyAgQ0NJZlR5cGU8W2Y4MF0sIENDQXNzaWduVG9TdGFjazwwLCAwPj4sDQorDQorICAvLyBfX202NCB2ZWN0b3JzIGdldCA4LWJ5dGUgc3RhY2sgc2xvdHMgdGhhdCBhcmUgOC1ieXRlIGFsaWduZWQuDQorICBDQ0lmVHlwZTxbdjhpOCwgdjRpMTYsIHYyaTMyLCB2MWk2NF0sIENDQXNzaWduVG9TdGFjazw4LCA4Pj4NCitdPjsNCisNCitkZWYgQ0NfWDg2XzY0X0dIQyA6IENhbGxpbmdDb252PFsNCisgIC8vIFByb21vdGUgaTgvaTE2L2kzMiBhcmd1bWVudHMgdG8gaTY0Lg0KKyAgQ0NJZlR5cGU8W2k4LCBpMTYsIGkzMl0sIENDUHJvbW90ZVRvVHlwZTxpNjQ+PiwNCisNCisgIC8vIFBhc3MgaW4gU1RHIHJlZ2lzdGVyczogQmFzZSwgU3AsIEhwLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2LCBTcExpbQ0KKyAgQ0NJZlR5cGU8W2k2NF0sDQorICAgICAgICAgICAgQ0NBc3NpZ25Ub1JlZzxbUjEzLCBSQlAsIFIxMiwgUkJYLCBSMTQsIFJTSSwgUkRJLCBSOCwgUjksIFIxNV0+PiwNCisNCisgIC8vIFBhc3MgaW4gU1RHIHJlZ2lzdGVyczogRjEsIEYyLCBGMywgRjQsIEQxLCBEMg0KKyAgQ0NJZlR5cGU8W2YzMiwgZjY0LCB2MTZpOCwgdjhpMTYsIHY0aTMyLCB2Mmk2NCwgdjRmMzIsIHYyZjY0XSwNCisgICAgICAgICAgICBDQ0lmU3VidGFyZ2V0PCJoYXNTU0UxKCkiLA0KKyAgICAgICAgICAgIENDQXNzaWduVG9SZWc8W1hNTTEsIFhNTTIsIFhNTTMsIFhNTTQsIFhNTTUsIFhNTTZdPj4+DQorXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBYODYgQyBDYWxsaW5nIENvbnZlbnRpb24NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vLyBDQ19YODZfMzJfQ29tbW9uIC0gSW4gYWxsIFg4Ni0zMiBjYWxsaW5nIGNvbnZlbnRpb25zLCBleHRyYSBpbnRlZ2VycyBhbmQgRlANCisvLy8gdmFsdWVzIGFyZSBzcGlsbGVkIG9uIHRoZSBzdGFjaywgYW5kIHRoZSBmaXJzdCA0IHZlY3RvciB2YWx1ZXMgZ28gaW4gWE1NDQorLy8vIHJlZ3MuDQorZGVmIENDX1g4Nl8zMl9Db21tb24gOiBDYWxsaW5nQ29udjxbDQorICAvLyBIYW5kbGVzIGJ5dmFsIHBhcmFtZXRlcnMuDQorICBDQ0lmQnlWYWw8Q0NQYXNzQnlWYWw8NCwgND4+LA0KKw0KKyAgLy8gVGhlIGZpcnN0IDMgZmxvYXQgb3IgZG91YmxlIGFyZ3VtZW50cywgaWYgbWFya2VkICdpbnJlZycgYW5kIGlmIHRoZSBjYWxsDQorICAvLyBpcyBub3QgYSB2YXJhcmcgY2FsbCBhbmQgaWYgU1NFMiBpcyBhdmFpbGFibGUsIGFyZSBwYXNzZWQgaW4gU1NFIHJlZ2lzdGVycy4NCisgIENDSWZOb3RWYXJBcmc8Q0NJZkluUmVnPENDSWZUeXBlPFtmMzIsZjY0XSwNCisgICAgICAgICAgICAgICAgQ0NJZlN1YnRhcmdldDwiaGFzU1NFMigpIiwNCisgICAgICAgICAgICAgICAgQ0NBc3NpZ25Ub1JlZzxbWE1NMCxYTU0xLFhNTTJdPj4+Pj4sDQorDQorICAvLyBUaGUgZmlyc3QgMyBfX202NCAoZXhjZXB0IGZvciB2MWk2NCkgdmVjdG9yIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIG1teA0KKyAgLy8gcmVnaXN0ZXJzIGlmIHRoZSBjYWxsIGlzIG5vdCBhIHZhcmFyZyBjYWxsLg0KKyAgQ0NJZk5vdFZhckFyZzxDQ0lmVHlwZTxbdjhpOCwgdjRpMTYsIHYyaTMyXSwNCisgICAgICAgICAgICAgICAgQ0NBc3NpZ25Ub1JlZzxbTU0wLCBNTTEsIE1NMl0+Pj4sDQorDQorICAvLyBJbnRlZ2VyL0Zsb2F0IHZhbHVlcyBnZXQgc3RvcmVkIGluIHN0YWNrIHNsb3RzIHRoYXQgYXJlIDQgYnl0ZXMgaW4NCisgIC8vIHNpemUgYW5kIDQtYnl0ZSBhbGlnbmVkLg0KKyAgQ0NJZlR5cGU8W2kzMiwgZjMyXSwgQ0NBc3NpZ25Ub1N0YWNrPDQsIDQ+PiwNCisgIA0KKyAgLy8gRG91YmxlcyBnZXQgOC1ieXRlIHNsb3RzIHRoYXQgYXJlIDQtYnl0ZSBhbGlnbmVkLg0KKyAgQ0NJZlR5cGU8W2Y2NF0sIENDQXNzaWduVG9TdGFjazw4LCA0Pj4sDQorDQorICAvLyBMb25nIGRvdWJsZXMgZ2V0IHNsb3RzIHdob3NlIHNpemUgZGVwZW5kcyBvbiB0aGUgc3VidGFyZ2V0Lg0KKyAgQ0NJZlR5cGU8W2Y4MF0sIENDQXNzaWduVG9TdGFjazwwLCA0Pj4sDQorDQorICAvLyBUaGUgZmlyc3QgNCBTU0UgdmVjdG9yIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIFhNTSByZWdpc3RlcnMuDQorICBDQ0lmTm90VmFyQXJnPENDSWZUeXBlPFt2MTZpOCwgdjhpMTYsIHY0aTMyLCB2Mmk2NCwgdjRmMzIsIHYyZjY0XSwNCisgICAgICAgICAgICAgICAgQ0NBc3NpZ25Ub1JlZzxbWE1NMCwgWE1NMSwgWE1NMiwgWE1NM10+Pj4sDQorDQorICAvLyBUaGUgZmlyc3QgNCBBVlggMjU2LWJpdCB2ZWN0b3IgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gWU1NIHJlZ2lzdGVycy4NCisgIENDSWZOb3RWYXJBcmc8Q0NJZlR5cGU8W3YzMmk4LCB2MTZpMTYsIHY4aTMyLCB2NGk2NCwgdjhmMzIsIHY0ZjY0XSwNCisgICAgICAgICAgICAgICAgQ0NJZlN1YnRhcmdldDwiaGFzQVZYKCkiLA0KKyAgICAgICAgICAgICAgICBDQ0Fzc2lnblRvUmVnPFtZTU0wLCBZTU0xLCBZTU0yLCBZTU0zXT4+Pj4sDQorDQorICAvLyBPdGhlciBTU0UgdmVjdG9ycyBnZXQgMTYtYnl0ZSBzdGFjayBzbG90cyB0aGF0IGFyZSAxNi1ieXRlIGFsaWduZWQuDQorICBDQ0lmVHlwZTxbdjE2aTgsIHY4aTE2LCB2NGkzMiwgdjJpNjQsIHY0ZjMyLCB2MmY2NF0sIENDQXNzaWduVG9TdGFjazwxNiwgMTY+PiwNCisNCisgIC8vIDI1Ni1iaXQgQVZYIHZlY3RvcnMgZ2V0IDMyLWJ5dGUgc3RhY2sgc2xvdHMgdGhhdCBhcmUgMzItYnl0ZSBhbGlnbmVkLg0KKyAgQ0NJZlR5cGU8W3YzMmk4LCB2MTZpMTYsIHY4aTMyLCB2NGk2NCwgdjhmMzIsIHY0ZjY0XSwNCisgICAgICAgICAgIENDQXNzaWduVG9TdGFjazwzMiwgMzI+PiwNCisNCisgIC8vIF9fbTY0IHZlY3RvcnMgZ2V0IDgtYnl0ZSBzdGFjayBzbG90cyB0aGF0IGFyZSA0LWJ5dGUgYWxpZ25lZC4gVGhleSBhcmUNCisgIC8vIHBhc3NlZCBpbiB0aGUgcGFyYW1ldGVyIGFyZWEuDQorICBDQ0lmVHlwZTxbdjhpOCwgdjRpMTYsIHYyaTMyLCB2MWk2NF0sIENDQXNzaWduVG9TdGFjazw4LCA0Pj5dPjsNCisNCitkZWYgQ0NfWDg2XzMyX0MgOiBDYWxsaW5nQ29udjxbDQorICAvLyBQcm9tb3RlIGk4L2kxNiBhcmd1bWVudHMgdG8gaTMyLg0KKyAgQ0NJZlR5cGU8W2k4LCBpMTZdLCBDQ1Byb21vdGVUb1R5cGU8aTMyPj4sDQorDQorICAvLyBUaGUgJ25lc3QnIHBhcmFtZXRlciwgaWYgYW55LCBpcyBwYXNzZWQgaW4gRUNYLg0KKyAgQ0NJZk5lc3Q8Q0NBc3NpZ25Ub1JlZzxbRUNYXT4+LA0KKw0KKyAgLy8gVGhlIGZpcnN0IDMgaW50ZWdlciBhcmd1bWVudHMsIGlmIG1hcmtlZCAnaW5yZWcnIGFuZCBpZiB0aGUgY2FsbCBpcyBub3QNCisgIC8vIGEgdmFyYXJnIGNhbGwsIGFyZSBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnMuDQorICBDQ0lmTm90VmFyQXJnPENDSWZJblJlZzxDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbRUFYLCBFRFgsIEVDWF0+Pj4+LA0KKw0KKyAgLy8gT3RoZXJ3aXNlLCBzYW1lIGFzIGV2ZXJ5dGhpbmcgZWxzZS4NCisgIENDRGVsZWdhdGVUbzxDQ19YODZfMzJfQ29tbW9uPg0KK10+Ow0KKw0KK2RlZiBDQ19YODZfMzJfRmFzdENhbGwgOiBDYWxsaW5nQ29udjxbDQorICAvLyBQcm9tb3RlIGk4L2kxNiBhcmd1bWVudHMgdG8gaTMyLg0KKyAgQ0NJZlR5cGU8W2k4LCBpMTZdLCBDQ1Byb21vdGVUb1R5cGU8aTMyPj4sDQorDQorICAvLyBUaGUgJ25lc3QnIHBhcmFtZXRlciwgaWYgYW55LCBpcyBwYXNzZWQgaW4gRUFYLg0KKyAgQ0NJZk5lc3Q8Q0NBc3NpZ25Ub1JlZzxbRUFYXT4+LA0KKw0KKyAgLy8gVGhlIGZpcnN0IDIgaW50ZWdlciBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBFQ1gvRURYDQorICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbRUNYLCBFRFhdPj4sDQorDQorICAvLyBPdGhlcndpc2UsIHNhbWUgYXMgZXZlcnl0aGluZyBlbHNlLg0KKyAgQ0NEZWxlZ2F0ZVRvPENDX1g4Nl8zMl9Db21tb24+DQorXT47DQorDQorZGVmIENDX1g4Nl8zMl9UaGlzQ2FsbCA6IENhbGxpbmdDb252PFsNCisgIC8vIFByb21vdGUgaTgvaTE2IGFyZ3VtZW50cyB0byBpMzIuDQorICBDQ0lmVHlwZTxbaTgsIGkxNl0sIENDUHJvbW90ZVRvVHlwZTxpMzI+PiwNCisNCisgIC8vIFRoZSAnbmVzdCcgcGFyYW1ldGVyLCBpZiBhbnksIGlzIHBhc3NlZCBpbiBFQVguDQorICBDQ0lmTmVzdDxDQ0Fzc2lnblRvUmVnPFtFQVhdPj4sDQorDQorICAvLyBUaGUgZmlyc3QgaW50ZWdlciBhcmd1bWVudCBpcyBwYXNzZWQgaW4gRUNYDQorICBDQ0lmVHlwZTxbaTMyXSwgQ0NBc3NpZ25Ub1JlZzxbRUNYXT4+LA0KKw0KKyAgLy8gT3RoZXJ3aXNlLCBzYW1lIGFzIGV2ZXJ5dGhpbmcgZWxzZS4NCisgIENDRGVsZWdhdGVUbzxDQ19YODZfMzJfQ29tbW9uPg0KK10+Ow0KKw0KK2RlZiBDQ19YODZfMzJfRmFzdENDIDogQ2FsbGluZ0NvbnY8Ww0KKyAgLy8gSGFuZGxlcyBieXZhbCBwYXJhbWV0ZXJzLiAgTm90ZSB0aGF0IHdlIGNhbid0IHJlbHkgb24gdGhlIGRlbGVnYXRpb24NCisgIC8vIHRvIENDX1g4Nl8zMl9Db21tb24gZm9yIHRoaXMgYmVjYXVzZSB0aGF0IGhhcHBlbnMgYWZ0ZXIgY29kZSB0aGF0DQorICAvLyBwdXRzIGFyZ3VtZW50cyBpbiByZWdpc3RlcnMuDQorICBDQ0lmQnlWYWw8Q0NQYXNzQnlWYWw8NCwgND4+LA0KKw0KKyAgLy8gUHJvbW90ZSBpOC9pMTYgYXJndW1lbnRzIHRvIGkzMi4NCisgIENDSWZUeXBlPFtpOCwgaTE2XSwgQ0NQcm9tb3RlVG9UeXBlPGkzMj4+LA0KKw0KKyAgLy8gVGhlICduZXN0JyBwYXJhbWV0ZXIsIGlmIGFueSwgaXMgcGFzc2VkIGluIEVBWC4NCisgIENDSWZOZXN0PENDQXNzaWduVG9SZWc8W0VBWF0+PiwNCisNCisgIC8vIFRoZSBmaXJzdCAyIGludGVnZXIgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gRUNYL0VEWA0KKyAgQ0NJZlR5cGU8W2kzMl0sIENDQXNzaWduVG9SZWc8W0VDWCwgRURYXT4+LA0KKw0KKyAgLy8gVGhlIGZpcnN0IDMgZmxvYXQgb3IgZG91YmxlIGFyZ3VtZW50cywgaWYgdGhlIGNhbGwgaXMgbm90IGEgdmFyYXJnDQorICAvLyBjYWxsIGFuZCBpZiBTU0UyIGlzIGF2YWlsYWJsZSwgYXJlIHBhc3NlZCBpbiBTU0UgcmVnaXN0ZXJzLg0KKyAgQ0NJZk5vdFZhckFyZzxDQ0lmVHlwZTxbZjMyLGY2NF0sDQorICAgICAgICAgICAgICAgIENDSWZTdWJ0YXJnZXQ8Imhhc1NTRTIoKSIsDQorICAgICAgICAgICAgICAgIENDQXNzaWduVG9SZWc8W1hNTTAsWE1NMSxYTU0yXT4+Pj4sDQorDQorICAvLyBEb3VibGVzIGdldCA4LWJ5dGUgc2xvdHMgdGhhdCBhcmUgOC1ieXRlIGFsaWduZWQuDQorICBDQ0lmVHlwZTxbZjY0XSwgQ0NBc3NpZ25Ub1N0YWNrPDgsIDg+PiwNCisNCisgIC8vIE90aGVyd2lzZSwgc2FtZSBhcyBldmVyeXRoaW5nIGVsc2UuDQorICBDQ0RlbGVnYXRlVG88Q0NfWDg2XzMyX0NvbW1vbj4NCitdPjsNCisNCitkZWYgQ0NfWDg2XzMyX0dIQyA6IENhbGxpbmdDb252PFsNCisgIC8vIFByb21vdGUgaTgvaTE2IGFyZ3VtZW50cyB0byBpMzIuDQorICBDQ0lmVHlwZTxbaTgsIGkxNl0sIENDUHJvbW90ZVRvVHlwZTxpMzI+PiwNCisNCisgIC8vIFBhc3MgaW4gU1RHIHJlZ2lzdGVyczogQmFzZSwgU3AsIEhwLCBSMQ0KKyAgQ0NJZlR5cGU8W2kzMl0sIENDQXNzaWduVG9SZWc8W0VCWCwgRUJQLCBFREksIEVTSV0+Pg0KK10+Ow0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkNvZGVFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkNvZGVFbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjIyNTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2Q29kZUVtaXR0ZXIuY3BwCkBAIC0wLDAgKzEsOTgzIEBACisvLz09PS0tIFg4Ni9YODZDb2RlRW1pdHRlci5jcHAgLSBDb252ZXJ0IFg4NiBjb2RlIHRvIG1hY2hpbmUgY29kZSAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGFzcyB0aGF0IHRyYW5zZm9ybXMgdGhlIFg4NiBtYWNoaW5lIGluc3RydWN0aW9ucyBpbnRvCisvLyByZWxvY2F0YWJsZSBtYWNoaW5lIGNvZGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJ4ODYtZW1pdHRlciIKKyNpbmNsdWRlICJYODZJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJYODZKSVRJbmZvLmgiCisjaW5jbHVkZSAiWDg2U3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiWDg2VGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlg4NlJlbG9jYXRpb25zLmgiCisjaW5jbHVkZSAiWDg2LmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vSklUQ29kZUVtaXR0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb2RlRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtRW1pdHRlZCwgIk51bWJlciBvZiBtYWNoaW5lIGluc3RydWN0aW9ucyBlbWl0dGVkIik7CisKK25hbWVzcGFjZSB7CisgIHRlbXBsYXRlPGNsYXNzIENvZGVFbWl0dGVyPgorICBjbGFzcyBFbWl0dGVyIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIGNvbnN0IFg4Nkluc3RySW5mbyAgKklJOworICAgIGNvbnN0IFRhcmdldERhdGEgICAgKlREOworICAgIFg4NlRhcmdldE1hY2hpbmUgICAgJlRNOworICAgIENvZGVFbWl0dGVyICAgICAgICAgJk1DRTsKKyAgICBNYWNoaW5lTW9kdWxlSW5mbyAgICpNTUk7CisgICAgaW50cHRyX3QgUElDQmFzZU9mZnNldDsKKyAgICBib29sIElzNjRCaXRNb2RlOworICAgIGJvb2wgSXNQSUM7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBleHBsaWNpdCBFbWl0dGVyKFg4NlRhcmdldE1hY2hpbmUgJnRtLCBDb2RlRW1pdHRlciAmbWNlKQorICAgICAgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwgSUkoMCksIFREKDApLCBUTSh0bSksIAorICAgICAgTUNFKG1jZSksIFBJQ0Jhc2VPZmZzZXQoMCksIElzNjRCaXRNb2RlKGZhbHNlKSwKKyAgICAgIElzUElDKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKSB7fQorICAgIEVtaXR0ZXIoWDg2VGFyZ2V0TWFjaGluZSAmdG0sIENvZGVFbWl0dGVyICZtY2UsCisgICAgICAgICAgICBjb25zdCBYODZJbnN0ckluZm8gJmlpLCBjb25zdCBUYXJnZXREYXRhICZ0ZCwgYm9vbCBpczY0KQorICAgICAgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwgSUkoJmlpKSwgVEQoJnRkKSwgVE0odG0pLCAKKyAgICAgIE1DRShtY2UpLCBQSUNCYXNlT2Zmc2V0KDApLCBJczY0Qml0TW9kZShpczY0KSwKKyAgICAgIElzUElDKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfKSB7fQorCisgICAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIlg4NiBNYWNoaW5lIENvZGUgRW1pdHRlciI7CisgICAgfQorCisgICAgdm9pZCBlbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgKkRlc2MpOworICAgIAorICAgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxNYWNoaW5lTW9kdWxlSW5mbz4oKTsKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgZW1pdFBDUmVsYXRpdmVCbG9ja0FkZHJlc3MoTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisgICAgdm9pZCBlbWl0R2xvYmFsQWRkcmVzcyhjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIHVuc2lnbmVkIFJlbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgRGlzcCA9IDAsIGludHB0cl90IFBDQWRqID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5kaXJlY3QgPSBmYWxzZSk7CisgICAgdm9pZCBlbWl0RXh0ZXJuYWxTeW1ib2xBZGRyZXNzKGNvbnN0IGNoYXIgKkVTLCB1bnNpZ25lZCBSZWxvYyk7CisgICAgdm9pZCBlbWl0Q29uc3RQb29sQWRkcmVzcyh1bnNpZ25lZCBDUEksIHVuc2lnbmVkIFJlbG9jLCBpbnRwdHJfdCBEaXNwID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IFBDQWRqID0gMCk7CisgICAgdm9pZCBlbWl0SnVtcFRhYmxlQWRkcmVzcyh1bnNpZ25lZCBKVEksIHVuc2lnbmVkIFJlbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgUENBZGogPSAwKTsKKworICAgIHZvaWQgZW1pdERpc3BsYWNlbWVudEZpZWxkKGNvbnN0IE1hY2hpbmVPcGVyYW5kICpSZWxvY09wLCBpbnQgRGlzcFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBBZGogPSAwLCBib29sIElzUENSZWwgPSB0cnVlKTsKKworICAgIHZvaWQgZW1pdFJlZ01vZFJNQnl0ZSh1bnNpZ25lZCBNb2RSTVJlZywgdW5zaWduZWQgUmVnT3Bjb2RlRmllbGQpOworICAgIHZvaWQgZW1pdFJlZ01vZFJNQnl0ZSh1bnNpZ25lZCBSZWdPcGNvZGVGaWVsZCk7CisgICAgdm9pZCBlbWl0U0lCQnl0ZSh1bnNpZ25lZCBTUywgdW5zaWduZWQgSW5kZXgsIHVuc2lnbmVkIEJhc2UpOworICAgIHZvaWQgZW1pdENvbnN0YW50KHVpbnQ2NF90IFZhbCwgdW5zaWduZWQgU2l6ZSk7CisKKyAgICB2b2lkIGVtaXRNZW1Nb2RSTUJ5dGUoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AsIHVuc2lnbmVkIFJlZ09wY29kZUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBQQ0FkaiA9IDApOworCisgICAgdW5zaWduZWQgZ2V0WDg2UmVnTnVtKHVuc2lnbmVkIFJlZ05vKSBjb25zdDsKKyAgfTsKKwordGVtcGxhdGU8Y2xhc3MgQ29kZUVtaXR0ZXI+CisgIGNoYXIgRW1pdHRlcjxDb2RlRW1pdHRlcj46OklEID0gMDsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKKy8vLyBjcmVhdGVYODZDb2RlRW1pdHRlclBhc3MgLSBSZXR1cm4gYSBwYXNzIHRoYXQgZW1pdHMgdGhlIGNvbGxlY3RlZCBYODYgY29kZQorLy8vIHRvIHRoZSBzcGVjaWZpZWQgdGVtcGxhdGVkIE1hY2hpbmVDb2RlRW1pdHRlciBvYmplY3QuCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZVg4NkpJVENvZGVFbWl0dGVyUGFzcyhYODZUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpIHsKKyAgcmV0dXJuIG5ldyBFbWl0dGVyPEpJVENvZGVFbWl0dGVyPihUTSwgSkNFKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgQ29kZUVtaXR0ZXI+Citib29sIEVtaXR0ZXI8Q29kZUVtaXR0ZXI+OjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIE1NSSA9ICZnZXRBbmFseXNpczxNYWNoaW5lTW9kdWxlSW5mbz4oKTsKKyAgTUNFLnNldE1vZHVsZUluZm8oTU1JKTsKKyAgCisgIElJID0gVE0uZ2V0SW5zdHJJbmZvKCk7CisgIFREID0gVE0uZ2V0VGFyZ2V0RGF0YSgpOworICBJczY0Qml0TW9kZSA9IFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXM2NEJpdCgpOworICBJc1BJQyA9IFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfOworICAKKyAgZG8geworICAgIERFQlVHKGRiZ3MoKSA8PCAiSklUVGluZyBmdW5jdGlvbiAnIiAKKyAgICAgICAgICA8PCBNRi5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCkgPDwgIidcbiIpOworICAgIE1DRS5zdGFydEZ1bmN0aW9uKE1GKTsKKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUJCID0gTUYuYmVnaW4oKSwgRSA9IE1GLmVuZCgpOyAKKyAgICAgICAgIE1CQiAhPSBFOyArK01CQikgeworICAgICAgTUNFLlN0YXJ0TWFjaGluZUJhc2ljQmxvY2soTUJCKTsKKyAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBNQkItPmJlZ2luKCksIEUgPSBNQkItPmVuZCgpOworICAgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJkRlc2MgPSBJLT5nZXREZXNjKCk7CisgICAgICAgIGVtaXRJbnN0cnVjdGlvbigqSSwgJkRlc2MpOworICAgICAgICAvLyBNT1ZQQzMyciBpcyBiYXNpY2FsbHkgYSBjYWxsIHBsdXMgYSBwb3AgaW5zdHJ1Y3Rpb24uCisgICAgICAgIGlmIChEZXNjLmdldE9wY29kZSgpID09IFg4Njo6TU9WUEMzMnIpCisgICAgICAgICAgZW1pdEluc3RydWN0aW9uKCpJLCAmSUktPmdldChYODY6OlBPUDMycikpOworICAgICAgICArK051bUVtaXR0ZWQ7ICAvLyBLZWVwIHRyYWNrIG9mIHRoZSAjIG9mIG1pJ3MgZW1pdHRlZAorICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoTUNFLmZpbmlzaEZ1bmN0aW9uKE1GKSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gZGV0ZXJtaW5lUkVYIC0gRGV0ZXJtaW5lIGlmIHRoZSBNYWNoaW5lSW5zdHIgaGFzIHRvIGJlIGVuY29kZWQgd2l0aCBhIFg4Ni02NAorLy8vIFJFWCBwcmVmaXggd2hpY2ggc3BlY2lmaWVzIDEpIDY0LWJpdCBpbnN0cnVjdGlvbnMsIDIpIG5vbi1kZWZhdWx0IG9wZXJhbmQKKy8vLyBzaXplLCBhbmQgMykgdXNlIG9mIFg4Ni02NCBleHRlbmRlZCByZWdpc3RlcnMuCitzdGF0aWMgdW5zaWduZWQgZGV0ZXJtaW5lUkVYKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgdW5zaWduZWQgUkVYID0gMDsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZEZXNjID0gTUkuZ2V0RGVzYygpOworICAKKyAgLy8gUHNldWRvIGluc3RydWN0aW9ucyBkbyBub3QgbmVlZCBSRVggcHJlZml4IGJ5dGUuCisgIGlmICgoRGVzYy5UU0ZsYWdzICYgWDg2SUk6OkZvcm1NYXNrKSA9PSBYODZJSTo6UHNldWRvKQorICAgIHJldHVybiAwOworICBpZiAoRGVzYy5UU0ZsYWdzICYgWDg2SUk6OlJFWF9XKQorICAgIFJFWCB8PSAxIDw8IDM7CisgIAorICB1bnNpZ25lZCBOdW1PcHMgPSBEZXNjLmdldE51bU9wZXJhbmRzKCk7CisgIGlmIChOdW1PcHMpIHsKKyAgICBib29sIGlzVHdvQWRkciA9IE51bU9wcyA+IDEgJiYKKyAgICBEZXNjLmdldE9wZXJhbmRDb25zdHJhaW50KDEsIFRPSTo6VElFRF9UTykgIT0gLTE7CisgICAgCisgICAgLy8gSWYgaXQgYWNjZXNzZXMgU1BMLCBCUEwsIFNJTCwgb3IgRElMLCB0aGVuIGl0IHJlcXVpcmVzIGEgMHg0MCBSRVggcHJlZml4LgorICAgIHVuc2lnbmVkIGkgPSBpc1R3b0FkZHIgPyAxIDogMDsKKyAgICBmb3IgKHVuc2lnbmVkIGUgPSBOdW1PcHM7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCYgTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKE1PLmlzUmVnKCkpIHsKKyAgICAgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgICAgIGlmIChYODZJbnN0ckluZm86OmlzWDg2XzY0Tm9uRXh0TG93Qnl0ZVJlZyhSZWcpKQorICAgICAgICAgIFJFWCB8PSAweDQwOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBzd2l0Y2ggKERlc2MuVFNGbGFncyAmIFg4NklJOjpGb3JtTWFzaykgeworICAgICAgY2FzZSBYODZJSTo6TVJNSW5pdFJlZzoKKyAgICAgICAgaWYgKFg4Nkluc3RySW5mbzo6aXNYODZfNjRFeHRlbmRlZFJlZyhNSS5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgICBSRVggfD0gKDEgPDwgMCkgfCAoMSA8PCAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFg4NklJOjpNUk1TcmNSZWc6IHsKKyAgICAgICAgaWYgKFg4Nkluc3RySW5mbzo6aXNYODZfNjRFeHRlbmRlZFJlZyhNSS5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgICBSRVggfD0gMSA8PCAyOworICAgICAgICBpID0gaXNUd29BZGRyID8gMiA6IDE7CisgICAgICAgIGZvciAodW5zaWduZWQgZSA9IE51bU9wczsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCYgTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgICAgICAgIGlmIChYODZJbnN0ckluZm86OmlzWDg2XzY0RXh0ZW5kZWRSZWcoTU8pKQorICAgICAgICAgICAgUkVYIHw9IDEgPDwgMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgWDg2SUk6Ok1STVNyY01lbTogeworICAgICAgICBpZiAoWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1JLmdldE9wZXJhbmQoMCkpKQorICAgICAgICAgIFJFWCB8PSAxIDw8IDI7CisgICAgICAgIHVuc2lnbmVkIEJpdCA9IDA7CisgICAgICAgIGkgPSBpc1R3b0FkZHIgPyAyIDogMTsKKyAgICAgICAgZm9yICg7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCYgTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgICAgICAgIGlmIChNTy5pc1JlZygpKSB7CisgICAgICAgICAgICBpZiAoWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1PKSkKKyAgICAgICAgICAgICAgUkVYIHw9IDEgPDwgQml0OworICAgICAgICAgICAgQml0Kys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBYODZJSTo6TVJNMG06IGNhc2UgWDg2SUk6Ok1STTFtOgorICAgICAgY2FzZSBYODZJSTo6TVJNMm06IGNhc2UgWDg2SUk6Ok1STTNtOgorICAgICAgY2FzZSBYODZJSTo6TVJNNG06IGNhc2UgWDg2SUk6Ok1STTVtOgorICAgICAgY2FzZSBYODZJSTo6TVJNNm06IGNhc2UgWDg2SUk6Ok1STTdtOgorICAgICAgY2FzZSBYODZJSTo6TVJNRGVzdE1lbTogeworICAgICAgICB1bnNpZ25lZCBlID0gKGlzVHdvQWRkciA/IFg4Njo6QWRkck51bU9wZXJhbmRzKzEgOiBYODY6OkFkZHJOdW1PcGVyYW5kcyk7CisgICAgICAgIGkgPSBpc1R3b0FkZHIgPyAxIDogMDsKKyAgICAgICAgaWYgKE51bU9wcyA+IGUgJiYgWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1JLmdldE9wZXJhbmQoZSkpKQorICAgICAgICAgIFJFWCB8PSAxIDw8IDI7CisgICAgICAgIHVuc2lnbmVkIEJpdCA9IDA7CisgICAgICAgIGZvciAoOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kJiBNTyA9IE1JLmdldE9wZXJhbmQoaSk7CisgICAgICAgICAgaWYgKE1PLmlzUmVnKCkpIHsKKyAgICAgICAgICAgIGlmIChYODZJbnN0ckluZm86OmlzWDg2XzY0RXh0ZW5kZWRSZWcoTU8pKQorICAgICAgICAgICAgICBSRVggfD0gMSA8PCBCaXQ7CisgICAgICAgICAgICBCaXQrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGlmIChYODZJbnN0ckluZm86OmlzWDg2XzY0RXh0ZW5kZWRSZWcoTUkuZ2V0T3BlcmFuZCgwKSkpCisgICAgICAgICAgUkVYIHw9IDEgPDwgMDsKKyAgICAgICAgaSA9IGlzVHdvQWRkciA/IDIgOiAxOworICAgICAgICBmb3IgKHVuc2lnbmVkIGUgPSBOdW1PcHM7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQmIE1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICAgICAgICBpZiAoWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1PKSkKKyAgICAgICAgICAgIFJFWCB8PSAxIDw8IDI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBSRVg7Cit9CisKKworLy8vIGVtaXRQQ1JlbGF0aXZlQmxvY2tBZGRyZXNzIC0gVGhpcyBtZXRob2Qga2VlcHMgdHJhY2sgb2YgdGhlIGluZm9ybWF0aW9uCisvLy8gbmVjZXNzYXJ5IHRvIHJlc29sdmUgdGhlIGFkZHJlc3Mgb2YgdGhpcyBibG9jayBsYXRlciBhbmQgZW1pdHMgYSBkdW1teQorLy8vIHZhbHVlLgorLy8vCit0ZW1wbGF0ZTxjbGFzcyBDb2RlRW1pdHRlcj4KK3ZvaWQgRW1pdHRlcjxDb2RlRW1pdHRlcj46OmVtaXRQQ1JlbGF0aXZlQmxvY2tBZGRyZXNzKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgLy8gUmVtZW1iZXIgd2hlcmUgdGhpcyByZWZlcmVuY2Ugd2FzIGFuZCB3aGVyZSBpdCBpcyB0byBzbyB3ZSBjYW4KKyAgLy8gZGVhbCB3aXRoIGl0IGxhdGVyLgorICBNQ0UuYWRkUmVsb2NhdGlvbihNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0QkIoTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpyZWxvY19wY3JlbF93b3JkLCBNQkIpKTsKKyAgTUNFLmVtaXRXb3JkTEUoMCk7Cit9CisKKy8vLyBlbWl0R2xvYmFsQWRkcmVzcyAtIEVtaXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHRvIHRoZSBjb2RlIHN0cmVhbSBhc3N1bWluZworLy8vIHRoaXMgaXMgcGFydCBvZiBhICJ0YWtlIHRoZSBhZGRyZXNzIG9mIGEgZ2xvYmFsIiBpbnN0cnVjdGlvbi4KKy8vLwordGVtcGxhdGU8Y2xhc3MgQ29kZUVtaXR0ZXI+Cit2b2lkIEVtaXR0ZXI8Q29kZUVtaXR0ZXI+OjplbWl0R2xvYmFsQWRkcmVzcyhjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBEaXNwIC8qID0gMCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgUENBZGogLyogPSAwICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluZGlyZWN0IC8qID0gZmFsc2UgKi8pIHsKKyAgaW50cHRyX3QgUmVsb2NDU1QgPSBEaXNwOworICBpZiAoUmVsb2MgPT0gWDg2OjpyZWxvY19waWNyZWxfd29yZCkKKyAgICBSZWxvY0NTVCA9IFBJQ0Jhc2VPZmZzZXQ7CisgIGVsc2UgaWYgKFJlbG9jID09IFg4Njo6cmVsb2NfcGNyZWxfd29yZCkKKyAgICBSZWxvY0NTVCA9IFBDQWRqOworICBNYWNoaW5lUmVsb2NhdGlvbiBNUiA9IEluZGlyZWN0CisgICAgPyBNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0SW5kaXJlY3RTeW1ib2woTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLCBSZWxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEdsb2JhbFZhbHVlICo+KEdWKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxvY0NTVCwgZmFsc2UpCisgICAgOiBNYWNoaW5lUmVsb2NhdGlvbjo6Z2V0R1YoTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLCBSZWxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEdsb2JhbFZhbHVlICo+KEdWKSwgUmVsb2NDU1QsIGZhbHNlKTsKKyAgTUNFLmFkZFJlbG9jYXRpb24oTVIpOworICAvLyBUaGUgcmVsb2NhdGVkIHZhbHVlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGRpc3BsYWNlbWVudAorICBpZiAoUmVsb2MgPT0gWDg2OjpyZWxvY19hYnNvbHV0ZV9kd29yZCkKKyAgICBNQ0UuZW1pdERXb3JkTEUoRGlzcCk7CisgIGVsc2UKKyAgICBNQ0UuZW1pdFdvcmRMRSgoaW50MzJfdClEaXNwKTsKK30KKworLy8vIGVtaXRFeHRlcm5hbFN5bWJvbEFkZHJlc3MgLSBBcnJhbmdlIGZvciB0aGUgYWRkcmVzcyBvZiBhbiBleHRlcm5hbCBzeW1ib2wgdG8KKy8vLyBiZSBlbWl0dGVkIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBmdW5jdGlvbiwgYW5kIGFsbG93IGl0IHRvIGJlIFBDCisvLy8gcmVsYXRpdmUuCit0ZW1wbGF0ZTxjbGFzcyBDb2RlRW1pdHRlcj4KK3ZvaWQgRW1pdHRlcjxDb2RlRW1pdHRlcj46OmVtaXRFeHRlcm5hbFN5bWJvbEFkZHJlc3MoY29uc3QgY2hhciAqRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlbG9jKSB7CisgIGludHB0cl90IFJlbG9jQ1NUID0gKFJlbG9jID09IFg4Njo6cmVsb2NfcGljcmVsX3dvcmQpID8gUElDQmFzZU9mZnNldCA6IDA7CisKKyAgLy8gWDg2IG5ldmVyIG5lZWRzIHN0dWJzIGJlY2F1c2UgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHdpbGwgYWx3YXlzIHBpY2sKKyAgLy8gYW4gaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgYWRkcmVzcworICAvLyB0byBhIHN5bWJvbC4KKyAgLy8gKHNlZSBYODZJU2VsTG93ZXJpbmcuY3BwLCBuZWFyIDIwMzk6IFg4NlRhcmdldExvd2VyaW5nOjpMb3dlckNhbGwpCisgIGJvb2wgTmVlZFN0dWIgPSBmYWxzZTsKKyAgTUNFLmFkZFJlbG9jYXRpb24oTWFjaGluZVJlbG9jYXRpb246OmdldEV4dFN5bShNQ0UuZ2V0Q3VycmVudFBDT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2MsIEVTLCBSZWxvY0NTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOZWVkU3R1YikpOworICBpZiAoUmVsb2MgPT0gWDg2OjpyZWxvY19hYnNvbHV0ZV9kd29yZCkKKyAgICBNQ0UuZW1pdERXb3JkTEUoMCk7CisgIGVsc2UKKyAgICBNQ0UuZW1pdFdvcmRMRSgwKTsKK30KKworLy8vIGVtaXRDb25zdFBvb2xBZGRyZXNzIC0gQXJyYW5nZSBmb3IgdGhlIGFkZHJlc3Mgb2YgYW4gY29uc3RhbnQgcG9vbAorLy8vIHRvIGJlIGVtaXR0ZWQgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGZ1bmN0aW9uLCBhbmQgYWxsb3cgaXQgdG8gYmUgUEMKKy8vLyByZWxhdGl2ZS4KK3RlbXBsYXRlPGNsYXNzIENvZGVFbWl0dGVyPgordm9pZCBFbWl0dGVyPENvZGVFbWl0dGVyPjo6ZW1pdENvbnN0UG9vbEFkZHJlc3ModW5zaWduZWQgQ1BJLCB1bnNpZ25lZCBSZWxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgRGlzcCAvKiA9IDAgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IFBDQWRqIC8qID0gMCAqLykgeworICBpbnRwdHJfdCBSZWxvY0NTVCA9IDA7CisgIGlmIChSZWxvYyA9PSBYODY6OnJlbG9jX3BpY3JlbF93b3JkKQorICAgIFJlbG9jQ1NUID0gUElDQmFzZU9mZnNldDsKKyAgZWxzZSBpZiAoUmVsb2MgPT0gWDg2OjpyZWxvY19wY3JlbF93b3JkKQorICAgIFJlbG9jQ1NUID0gUENBZGo7CisgIE1DRS5hZGRSZWxvY2F0aW9uKE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRDb25zdFBvb2woTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbG9jLCBDUEksIFJlbG9jQ1NUKSk7CisgIC8vIFRoZSByZWxvY2F0ZWQgdmFsdWUgd2lsbCBiZSBhZGRlZCB0byB0aGUgZGlzcGxhY2VtZW50CisgIGlmIChSZWxvYyA9PSBYODY6OnJlbG9jX2Fic29sdXRlX2R3b3JkKQorICAgIE1DRS5lbWl0RFdvcmRMRShEaXNwKTsKKyAgZWxzZQorICAgIE1DRS5lbWl0V29yZExFKChpbnQzMl90KURpc3ApOworfQorCisvLy8gZW1pdEp1bXBUYWJsZUFkZHJlc3MgLSBBcnJhbmdlIGZvciB0aGUgYWRkcmVzcyBvZiBhIGp1bXAgdGFibGUgdG8KKy8vLyBiZSBlbWl0dGVkIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBmdW5jdGlvbiwgYW5kIGFsbG93IGl0IHRvIGJlIFBDCisvLy8gcmVsYXRpdmUuCit0ZW1wbGF0ZTxjbGFzcyBDb2RlRW1pdHRlcj4KK3ZvaWQgRW1pdHRlcjxDb2RlRW1pdHRlcj46OmVtaXRKdW1wVGFibGVBZGRyZXNzKHVuc2lnbmVkIEpUSSwgdW5zaWduZWQgUmVsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IFBDQWRqIC8qID0gMCAqLykgeworICBpbnRwdHJfdCBSZWxvY0NTVCA9IDA7CisgIGlmIChSZWxvYyA9PSBYODY6OnJlbG9jX3BpY3JlbF93b3JkKQorICAgIFJlbG9jQ1NUID0gUElDQmFzZU9mZnNldDsKKyAgZWxzZSBpZiAoUmVsb2MgPT0gWDg2OjpyZWxvY19wY3JlbF93b3JkKQorICAgIFJlbG9jQ1NUID0gUENBZGo7CisgIE1DRS5hZGRSZWxvY2F0aW9uKE1hY2hpbmVSZWxvY2F0aW9uOjpnZXRKdW1wVGFibGUoTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbG9jLCBKVEksIFJlbG9jQ1NUKSk7CisgIC8vIFRoZSByZWxvY2F0ZWQgdmFsdWUgd2lsbCBiZSBhZGRlZCB0byB0aGUgZGlzcGxhY2VtZW50CisgIGlmIChSZWxvYyA9PSBYODY6OnJlbG9jX2Fic29sdXRlX2R3b3JkKQorICAgIE1DRS5lbWl0RFdvcmRMRSgwKTsKKyAgZWxzZQorICAgIE1DRS5lbWl0V29yZExFKDApOworfQorCit0ZW1wbGF0ZTxjbGFzcyBDb2RlRW1pdHRlcj4KK3Vuc2lnbmVkIEVtaXR0ZXI8Q29kZUVtaXR0ZXI+OjpnZXRYODZSZWdOdW0odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgcmV0dXJuIFg4NlJlZ2lzdGVySW5mbzo6Z2V0WDg2UmVnTnVtKFJlZ05vKTsKK30KKworaW5saW5lIHN0YXRpYyB1bnNpZ25lZCBjaGFyIE1vZFJNQnl0ZSh1bnNpZ25lZCBNb2QsIHVuc2lnbmVkIFJlZ09wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUk0pIHsKKyAgYXNzZXJ0KE1vZCA8IDQgJiYgUmVnT3Bjb2RlIDwgOCAmJiBSTSA8IDggJiYgIk1vZFJNIEZpZWxkcyBvdXQgb2YgcmFuZ2UhIik7CisgIHJldHVybiBSTSB8IChSZWdPcGNvZGUgPDwgMykgfCAoTW9kIDw8IDYpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBDb2RlRW1pdHRlcj4KK3ZvaWQgRW1pdHRlcjxDb2RlRW1pdHRlcj46OmVtaXRSZWdNb2RSTUJ5dGUodW5zaWduZWQgTW9kUk1SZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZ09wY29kZUZsZCl7CisgIE1DRS5lbWl0Qnl0ZShNb2RSTUJ5dGUoMywgUmVnT3Bjb2RlRmxkLCBnZXRYODZSZWdOdW0oTW9kUk1SZWcpKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIENvZGVFbWl0dGVyPgordm9pZCBFbWl0dGVyPENvZGVFbWl0dGVyPjo6ZW1pdFJlZ01vZFJNQnl0ZSh1bnNpZ25lZCBSZWdPcGNvZGVGbGQpIHsKKyAgTUNFLmVtaXRCeXRlKE1vZFJNQnl0ZSgzLCBSZWdPcGNvZGVGbGQsIDApKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgQ29kZUVtaXR0ZXI+Cit2b2lkIEVtaXR0ZXI8Q29kZUVtaXR0ZXI+OjplbWl0U0lCQnl0ZSh1bnNpZ25lZCBTUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJhc2UpIHsKKyAgLy8gU0lCIGJ5dGUgaXMgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBNb2RSTUJ5dGUuLi4KKyAgTUNFLmVtaXRCeXRlKE1vZFJNQnl0ZShTUywgSW5kZXgsIEJhc2UpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgQ29kZUVtaXR0ZXI+Cit2b2lkIEVtaXR0ZXI8Q29kZUVtaXR0ZXI+OjplbWl0Q29uc3RhbnQodWludDY0X3QgVmFsLCB1bnNpZ25lZCBTaXplKSB7CisgIC8vIE91dHB1dCB0aGUgY29uc3RhbnQgaW4gbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLi4uCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gU2l6ZTsgKytpKSB7CisgICAgTUNFLmVtaXRCeXRlKFZhbCAmIDI1NSk7CisgICAgVmFsID4+PSA4OworICB9Cit9CisKKy8vLyBpc0Rpc3A4IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzaWduZWQgZGlzcGxhY2VtZW50IGZpdHMgaW4gYSA4LWJpdCAKKy8vLyBzaWduLWV4dGVuZGVkIGZpZWxkLiAKK3N0YXRpYyBib29sIGlzRGlzcDgoaW50IFZhbHVlKSB7CisgIHJldHVybiBWYWx1ZSA9PSAoc2lnbmVkIGNoYXIpVmFsdWU7Cit9CisKK3N0YXRpYyBib29sIGd2TmVlZHNOb25MYXp5UHRyKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZHVk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIHsKKyAgLy8gRm9yIERhcndpbi02NCwgc2ltdWxhdGUgdGhlIGxpbmt0aW1lIEdPVCBieSB1c2luZyB0aGUgc2FtZSBub24tbGF6eS1wb2ludGVyCisgIC8vIG1lY2hhbmlzbSBhcyAzMi1iaXQgbW9kZS4KKyAgaWYgKFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXM2NEJpdCgpICYmIAorICAgICAgIVRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXNUYXJnZXREYXJ3aW4oKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3R1YiBjb250YWluaW5nIHRoZSBhZGRyZXNzIG9mIHRoZQorICAvLyBnbG9iYWwsIG5vdCB0aGUgZ2xvYmFsIGl0c2VsZi4KKyAgcmV0dXJuIGlzR2xvYmFsU3R1YlJlZmVyZW5jZShHVk9wLmdldFRhcmdldEZsYWdzKCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBDb2RlRW1pdHRlcj4KK3ZvaWQgRW1pdHRlcjxDb2RlRW1pdHRlcj46OmVtaXREaXNwbGFjZW1lbnRGaWVsZChjb25zdCBNYWNoaW5lT3BlcmFuZCAqUmVsb2NPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRGlzcFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBBZGogLyogPSAwICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNQQ1JlbCAvKiA9IHRydWUgKi8pIHsKKyAgLy8gSWYgdGhpcyBpcyBhIHNpbXBsZSBpbnRlZ2VyIGRpc3BsYWNlbWVudCB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhIHJlbG9jYXRpb24sCisgIC8vIGVtaXQgaXQgbm93LgorICBpZiAoIVJlbG9jT3ApIHsKKyAgICBlbWl0Q29uc3RhbnQoRGlzcFZhbCwgNCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIGEgcmVsb2NhdGlvbi4gIEVtaXQgaXQgYXMgc3VjaAorICAvLyBub3cuCisgIHVuc2lnbmVkIFJlbG9jVHlwZSA9IElzNjRCaXRNb2RlID8KKyAgICAoSXNQQ1JlbCA/IFg4Njo6cmVsb2NfcGNyZWxfd29yZCA6IFg4Njo6cmVsb2NfYWJzb2x1dGVfd29yZF9zZXh0KQorICAgIDogKElzUElDID8gWDg2OjpyZWxvY19waWNyZWxfd29yZCA6IFg4Njo6cmVsb2NfYWJzb2x1dGVfd29yZCk7CisgIGlmIChSZWxvY09wLT5pc0dsb2JhbCgpKSB7CisgICAgLy8gSW4gNjQtYml0IHN0YXRpYyBzbWFsbCBjb2RlIG1vZGVsLCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBlbWl0IGFic29sdXRlLgorICAgIC8vIEJ1dCBpdCdzIHByb2JhYmx5IG5vdCBiZW5lZmljaWFsLiBJZiB0aGUgTUNFIHN1cHBvcnRzIHVzaW5nIFJJUCBkaXJlY3RseQorICAgIC8vIGRvIGl0LCBvdGhlcndpc2UgZmFsbGJhY2sgdG8gYWJzb2x1dGUgKHRoaXMgaXMgZGV0ZXJtaW5lZCBieSBJc1BDUmVsKS4gCisgICAgLy8gIDg5IDA1IDAwIDAwIDAwIDAwICAgICBtb3YgICAgJWVheCwwKCVyaXApICAjIFBDLXJlbGF0aXZlCisgICAgLy8gIDg5IDA0IDI1IDAwIDAwIDAwIDAwICBtb3YgICAgJWVheCwweDAgICAgICAjIEFic29sdXRlCisgICAgYm9vbCBJbmRpcmVjdCA9IGd2TmVlZHNOb25MYXp5UHRyKCpSZWxvY09wLCBUTSk7CisgICAgZW1pdEdsb2JhbEFkZHJlc3MoUmVsb2NPcC0+Z2V0R2xvYmFsKCksIFJlbG9jVHlwZSwgUmVsb2NPcC0+Z2V0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgQWRqLCBJbmRpcmVjdCk7CisgIH0gZWxzZSBpZiAoUmVsb2NPcC0+aXNTeW1ib2woKSkgeworICAgIGVtaXRFeHRlcm5hbFN5bWJvbEFkZHJlc3MoUmVsb2NPcC0+Z2V0U3ltYm9sTmFtZSgpLCBSZWxvY1R5cGUpOworICB9IGVsc2UgaWYgKFJlbG9jT3AtPmlzQ1BJKCkpIHsKKyAgICBlbWl0Q29uc3RQb29sQWRkcmVzcyhSZWxvY09wLT5nZXRJbmRleCgpLCBSZWxvY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2NPcC0+Z2V0T2Zmc2V0KCksIEFkaik7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KFJlbG9jT3AtPmlzSlRJKCkgJiYgIlVuZXhwZWN0ZWQgbWFjaGluZSBvcGVyYW5kISIpOworICAgIGVtaXRKdW1wVGFibGVBZGRyZXNzKFJlbG9jT3AtPmdldEluZGV4KCksIFJlbG9jVHlwZSwgQWRqKTsKKyAgfQorfQorCit0ZW1wbGF0ZTxjbGFzcyBDb2RlRW1pdHRlcj4KK3ZvaWQgRW1pdHRlcjxDb2RlRW1pdHRlcj46OmVtaXRNZW1Nb2RSTUJ5dGUoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AsdW5zaWduZWQgUmVnT3Bjb2RlRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IFBDQWRqKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZPcDMgPSBNSS5nZXRPcGVyYW5kKE9wKzMpOworICBpbnQgRGlzcFZhbCA9IDA7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICpEaXNwRm9yUmVsb2MgPSAwOworICAKKyAgLy8gRmlndXJlIG91dCB3aGF0IHNvcnQgb2YgZGlzcGxhY2VtZW50IHdlIGhhdmUgdG8gaGFuZGxlIGhlcmUuCisgIGlmIChPcDMuaXNHbG9iYWwoKSkgeworICAgIERpc3BGb3JSZWxvYyA9ICZPcDM7CisgIH0gZWxzZSBpZiAoT3AzLmlzU3ltYm9sKCkpIHsKKyAgICBEaXNwRm9yUmVsb2MgPSAmT3AzOworICB9IGVsc2UgaWYgKE9wMy5pc0NQSSgpKSB7CisgICAgaWYgKCFNQ0UuZWFybHlSZXNvbHZlQWRkcmVzc2VzKCkgfHwgSXM2NEJpdE1vZGUgfHwgSXNQSUMpIHsKKyAgICAgIERpc3BGb3JSZWxvYyA9ICZPcDM7CisgICAgfSBlbHNlIHsKKyAgICAgIERpc3BWYWwgKz0gTUNFLmdldENvbnN0YW50UG9vbEVudHJ5QWRkcmVzcyhPcDMuZ2V0SW5kZXgoKSk7CisgICAgICBEaXNwVmFsICs9IE9wMy5nZXRPZmZzZXQoKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoT3AzLmlzSlRJKCkpIHsKKyAgICBpZiAoIU1DRS5lYXJseVJlc29sdmVBZGRyZXNzZXMoKSB8fCBJczY0Qml0TW9kZSB8fCBJc1BJQykgeworICAgICAgRGlzcEZvclJlbG9jID0gJk9wMzsKKyAgICB9IGVsc2UgeworICAgICAgRGlzcFZhbCArPSBNQ0UuZ2V0SnVtcFRhYmxlRW50cnlBZGRyZXNzKE9wMy5nZXRJbmRleCgpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRGlzcFZhbCA9IE9wMy5nZXRJbW0oKTsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZCYXNlICAgICA9IE1JLmdldE9wZXJhbmQoT3ApOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmU2NhbGUgICAgPSBNSS5nZXRPcGVyYW5kKE9wKzEpOworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmSW5kZXhSZWcgPSBNSS5nZXRPcGVyYW5kKE9wKzIpOworCisgIHVuc2lnbmVkIEJhc2VSZWcgPSBCYXNlLmdldFJlZygpOworICAKKyAgLy8gSGFuZGxlICVyaXAgcmVsYXRpdmUgYWRkcmVzc2luZy4KKyAgaWYgKEJhc2VSZWcgPT0gWDg2OjpSSVAgfHwKKyAgICAgIChJczY0Qml0TW9kZSAmJiBEaXNwRm9yUmVsb2MpKSB7IC8vIFtkaXNwMzIrUklQXSBpbiBYODYtNjQgbW9kZQorICAgIGFzc2VydChJbmRleFJlZy5nZXRSZWcoKSA9PSAwICYmIElzNjRCaXRNb2RlICYmCisgICAgICAgICAgICJJbnZhbGlkIHJpcC1yZWxhdGl2ZSBhZGRyZXNzIik7CisgICAgTUNFLmVtaXRCeXRlKE1vZFJNQnl0ZSgwLCBSZWdPcGNvZGVGaWVsZCwgNSkpOworICAgIGVtaXREaXNwbGFjZW1lbnRGaWVsZChEaXNwRm9yUmVsb2MsIERpc3BWYWwsIFBDQWRqLCB0cnVlKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJbmRpY2F0ZSB0aGF0IHRoZSBkaXNwbGFjZW1lbnQgd2lsbCB1c2UgYW4gcGNyZWwgb3IgYWJzb2x1dGUgcmVmZXJlbmNlCisgIC8vIGJ5IGRlZmF1bHQuIE1DRXMgYWJsZSB0byByZXNvbHZlIGFkZHJlc3NlcyBvbi10aGUtZmx5IHVzZSBwY3JlbCBieSBkZWZhdWx0CisgIC8vIHdoaWxlIG90aGVycywgdW5sZXNzIGV4cGxpY2l0IGFza2VkIHRvIHVzZSBSSVAsIHVzZSBhYnNvbHV0ZSByZWZlcmVuY2VzLgorICBib29sIElzUENSZWwgPSBNQ0UuZWFybHlSZXNvbHZlQWRkcmVzc2VzKCkgPyB0cnVlIDogZmFsc2U7CisKKyAgLy8gSXMgYSBTSUIgYnl0ZSBuZWVkZWQ/CisgIC8vIElmIG5vIEJhc2VSZWcsIGlzc3VlIGEgUklQIHJlbGF0aXZlIGluc3RydWN0aW9uIG9ubHkgaWYgdGhlIE1DRSBjYW4gCisgIC8vIHJlc29sdmUgYWRkcmVzc2VzIG9uLXRoZS1mbHksIG90aGVyd2lzZSB1c2UgU0lCIChJbnRlbCBNYW51YWwgMkEsIHRhYmxlCisgIC8vIDItNykgYW5kIGFic29sdXRlIHJlZmVyZW5jZXMuCisgIHVuc2lnbmVkIEJhc2VSZWdObyA9IC0xVTsKKyAgaWYgKEJhc2VSZWcgIT0gMCAmJiBCYXNlUmVnICE9IFg4Njo6UklQKQorICAgIEJhc2VSZWdObyA9IGdldFg4NlJlZ051bShCYXNlUmVnKTsKKworICBpZiAoLy8gVGhlIFNJQiBieXRlIG11c3QgYmUgdXNlZCBpZiB0aGVyZSBpcyBhbiBpbmRleCByZWdpc3Rlci4KKyAgICAgIEluZGV4UmVnLmdldFJlZygpID09IDAgJiYgCisgICAgICAvLyBUaGUgU0lCIGJ5dGUgbXVzdCBiZSB1c2VkIGlmIHRoZSBiYXNlIGlzIEVTUC9SU1AvUjEyLCBhbGwgb2Ygd2hpY2gKKyAgICAgIC8vIGVuY29kZSB0byBhbiBSL00gdmFsdWUgb2YgNCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgYSBTSUIgYnl0ZSBpcworICAgICAgLy8gcHJlc2VudC4KKyAgICAgIEJhc2VSZWdObyAhPSBOODY6OkVTUCAmJgorICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3RlciBhbmQgd2UncmUgaW4gNjQtYml0IG1vZGUsIHdlIG5lZWQgYSBTSUIKKyAgICAgIC8vIGJ5dGUgdG8gZW1pdCBhbiBhZGRyIHRoYXQgaXMganVzdCAnZGlzcDMyJyAodGhlIG5vbi1SSVAgcmVsYXRpdmUgZm9ybSkuCisgICAgICAoIUlzNjRCaXRNb2RlIHx8IEJhc2VSZWcgIT0gMCkpIHsKKyAgICBpZiAoQmFzZVJlZyA9PSAwIHx8ICAgICAgICAgIC8vIFtkaXNwMzJdICAgICBpbiBYODYtMzIgbW9kZQorICAgICAgICBCYXNlUmVnID09IFg4Njo6UklQKSB7ICAgLy8gW2Rpc3AzMitSSVBdIGluIFg4Ni02NCBtb2RlCisgICAgICBNQ0UuZW1pdEJ5dGUoTW9kUk1CeXRlKDAsIFJlZ09wY29kZUZpZWxkLCA1KSk7CisgICAgICBlbWl0RGlzcGxhY2VtZW50RmllbGQoRGlzcEZvclJlbG9jLCBEaXNwVmFsLCBQQ0FkaiwgdHJ1ZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIElmIHRoZSBiYXNlIGlzIG5vdCBFQlAvRVNQIGFuZCB0aGVyZSBpcyBubyBkaXNwbGFjZW1lbnQsIHVzZSBzaW1wbGUKKyAgICAvLyBpbmRpcmVjdCByZWdpc3RlciBlbmNvZGluZywgdGhpcyBoYW5kbGVzIGFkZHJlc3NlcyBsaWtlIFtFQVhdLiAgVGhlCisgICAgLy8gZW5jb2RpbmcgZm9yIFtFQlBdIHdpdGggbm8gZGlzcGxhY2VtZW50IG1lYW5zIFtkaXNwMzJdIHNvIHdlIGhhbmRsZSBpdAorICAgIC8vIGJ5IGVtaXR0aW5nIGEgZGlzcGxhY2VtZW50IG9mIDAgYmVsb3cuCisgICAgaWYgKCFEaXNwRm9yUmVsb2MgJiYgRGlzcFZhbCA9PSAwICYmIEJhc2VSZWdObyAhPSBOODY6OkVCUCkgeworICAgICAgTUNFLmVtaXRCeXRlKE1vZFJNQnl0ZSgwLCBSZWdPcGNvZGVGaWVsZCwgQmFzZVJlZ05vKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIGRpc3BsYWNlbWVudCBmaXRzIGluIGEgYnl0ZSwgZW5jb2RlIGFzIFtSRUcrZGlzcDhdLgorICAgIGlmICghRGlzcEZvclJlbG9jICYmIGlzRGlzcDgoRGlzcFZhbCkpIHsKKyAgICAgIE1DRS5lbWl0Qnl0ZShNb2RSTUJ5dGUoMSwgUmVnT3Bjb2RlRmllbGQsIEJhc2VSZWdObykpOworICAgICAgZW1pdENvbnN0YW50KERpc3BWYWwsIDEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIGVtaXQgdGhlIG1vc3QgZ2VuZXJhbCBub24tU0lCIGVuY29kaW5nOiBbUkVHK2Rpc3AzMl0KKyAgICBNQ0UuZW1pdEJ5dGUoTW9kUk1CeXRlKDIsIFJlZ09wY29kZUZpZWxkLCBCYXNlUmVnTm8pKTsKKyAgICBlbWl0RGlzcGxhY2VtZW50RmllbGQoRGlzcEZvclJlbG9jLCBEaXNwVmFsLCBQQ0FkaiwgSXNQQ1JlbCk7CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBPdGhlcndpc2Ugd2UgbmVlZCBhIFNJQiBieXRlLCBzbyBzdGFydCBieSBvdXRwdXR0aW5nIHRoZSBNb2RSL00gYnl0ZSBmaXJzdC4KKyAgYXNzZXJ0KEluZGV4UmVnLmdldFJlZygpICE9IFg4Njo6RVNQICYmCisgICAgICAgICBJbmRleFJlZy5nZXRSZWcoKSAhPSBYODY6OlJTUCAmJiAiQ2Fubm90IHVzZSBFU1AgYXMgaW5kZXggcmVnISIpOworCisgIGJvb2wgRm9yY2VEaXNwMzIgPSBmYWxzZTsKKyAgYm9vbCBGb3JjZURpc3A4ICA9IGZhbHNlOworICBpZiAoQmFzZVJlZyA9PSAwKSB7CisgICAgLy8gSWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2UgZW1pdCB0aGUgc3BlY2lhbCBjYXNlIFNJQiBieXRlIHdpdGgKKyAgICAvLyBNT0Q9MCwgQkFTRT00LCB0byBKVVNUIGdldCB0aGUgaW5kZXgsIHNjYWxlLCBhbmQgZGlzcGxhY2VtZW50LgorICAgIE1DRS5lbWl0Qnl0ZShNb2RSTUJ5dGUoMCwgUmVnT3Bjb2RlRmllbGQsIDQpKTsKKyAgICBGb3JjZURpc3AzMiA9IHRydWU7CisgIH0gZWxzZSBpZiAoRGlzcEZvclJlbG9jKSB7CisgICAgLy8gRW1pdCB0aGUgbm9ybWFsIGRpc3AzMiBlbmNvZGluZy4KKyAgICBNQ0UuZW1pdEJ5dGUoTW9kUk1CeXRlKDIsIFJlZ09wY29kZUZpZWxkLCA0KSk7CisgICAgRm9yY2VEaXNwMzIgPSB0cnVlOworICB9IGVsc2UgaWYgKERpc3BWYWwgPT0gMCAmJiBCYXNlUmVnTm8gIT0gTjg2OjpFQlApIHsKKyAgICAvLyBFbWl0IG5vIGRpc3BsYWNlbWVudCBNb2RSL00gYnl0ZQorICAgIE1DRS5lbWl0Qnl0ZShNb2RSTUJ5dGUoMCwgUmVnT3Bjb2RlRmllbGQsIDQpKTsKKyAgfSBlbHNlIGlmIChpc0Rpc3A4KERpc3BWYWwpKSB7CisgICAgLy8gRW1pdCB0aGUgZGlzcDggZW5jb2RpbmcuLi4KKyAgICBNQ0UuZW1pdEJ5dGUoTW9kUk1CeXRlKDEsIFJlZ09wY29kZUZpZWxkLCA0KSk7CisgICAgRm9yY2VEaXNwOCA9IHRydWU7ICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gZm9yY2UgOCBiaXQgZGlzcCBpZiBCYXNlPUVCUAorICB9IGVsc2UgeworICAgIC8vIEVtaXQgdGhlIG5vcm1hbCBkaXNwMzIgZW5jb2RpbmcuLi4KKyAgICBNQ0UuZW1pdEJ5dGUoTW9kUk1CeXRlKDIsIFJlZ09wY29kZUZpZWxkLCA0KSk7CisgIH0KKworICAvLyBDYWxjdWxhdGUgd2hhdCB0aGUgU1MgZmllbGQgdmFsdWUgc2hvdWxkIGJlLi4uCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTU1RhYmxlW10gPSB7IH4wLCAwLCAxLCB+MCwgMiwgfjAsIH4wLCB+MCwgMyB9OworICB1bnNpZ25lZCBTUyA9IFNTVGFibGVbU2NhbGUuZ2V0SW1tKCldOworCisgIGlmIChCYXNlUmVnID09IDApIHsKKyAgICAvLyBIYW5kbGUgdGhlIFNJQiBieXRlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBiYXNlLCBzZWUgSW50ZWwgCisgICAgLy8gTWFudWFsIDJBLCB0YWJsZSAyLTcuIFRoZSBkaXNwbGFjZW1lbnQgaGFzIGFscmVhZHkgYmVlbiBvdXRwdXQuCisgICAgdW5zaWduZWQgSW5kZXhSZWdObzsKKyAgICBpZiAoSW5kZXhSZWcuZ2V0UmVnKCkpCisgICAgICBJbmRleFJlZ05vID0gZ2V0WDg2UmVnTnVtKEluZGV4UmVnLmdldFJlZygpKTsKKyAgICBlbHNlIC8vIEV4YW1wbGVzOiBbRVNQKzEqPG5vcmVnPis0XSBvciBbc2NhbGVkIGlkeF0rZGlzcDMyIChNT0Q9MCxCQVNFPTUpCisgICAgICBJbmRleFJlZ05vID0gNDsKKyAgICBlbWl0U0lCQnl0ZShTUywgSW5kZXhSZWdObywgNSk7CisgIH0gZWxzZSB7CisgICAgdW5zaWduZWQgQmFzZVJlZ05vID0gZ2V0WDg2UmVnTnVtKEJhc2VSZWcpOworICAgIHVuc2lnbmVkIEluZGV4UmVnTm87CisgICAgaWYgKEluZGV4UmVnLmdldFJlZygpKQorICAgICAgSW5kZXhSZWdObyA9IGdldFg4NlJlZ051bShJbmRleFJlZy5nZXRSZWcoKSk7CisgICAgZWxzZQorICAgICAgSW5kZXhSZWdObyA9IDQ7ICAgLy8gRm9yIGV4YW1wbGUgW0VTUCsxKjxub3JlZz4rNF0KKyAgICBlbWl0U0lCQnl0ZShTUywgSW5kZXhSZWdObywgQmFzZVJlZ05vKTsKKyAgfQorCisgIC8vIERvIHdlIG5lZWQgdG8gb3V0cHV0IGEgZGlzcGxhY2VtZW50PworICBpZiAoRm9yY2VEaXNwOCkgeworICAgIGVtaXRDb25zdGFudChEaXNwVmFsLCAxKTsKKyAgfSBlbHNlIGlmIChEaXNwVmFsICE9IDAgfHwgRm9yY2VEaXNwMzIpIHsKKyAgICBlbWl0RGlzcGxhY2VtZW50RmllbGQoRGlzcEZvclJlbG9jLCBEaXNwVmFsLCBQQ0FkaiwgSXNQQ1JlbCk7CisgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgQ29kZUVtaXR0ZXI+Cit2b2lkIEVtaXR0ZXI8Q29kZUVtaXR0ZXI+OjplbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgKkRlc2MpIHsKKyAgREVCVUcoZGJncygpIDw8IE1JKTsKKworICBNQ0UucHJvY2Vzc0RlYnVnTG9jKE1JLmdldERlYnVnTG9jKCksIHRydWUpOworCisgIHVuc2lnbmVkIE9wY29kZSA9IERlc2MtPk9wY29kZTsKKworICAvLyBFbWl0IHRoZSBsb2NrIG9wY29kZSBwcmVmaXggYXMgbmVlZGVkLgorICBpZiAoRGVzYy0+VFNGbGFncyAmIFg4NklJOjpMT0NLKQorICAgIE1DRS5lbWl0Qnl0ZSgweEYwKTsKKworICAvLyBFbWl0IHNlZ21lbnQgb3ZlcnJpZGUgb3Bjb2RlIHByZWZpeCBhcyBuZWVkZWQuCisgIHN3aXRjaCAoRGVzYy0+VFNGbGFncyAmIFg4NklJOjpTZWdPdnJNYXNrKSB7CisgIGNhc2UgWDg2SUk6OkZTOgorICAgIE1DRS5lbWl0Qnl0ZSgweDY0KTsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6R1M6CisgICAgTUNFLmVtaXRCeXRlKDB4NjUpOworICAgIGJyZWFrOworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHNlZ21lbnQhIik7CisgIGNhc2UgMDogYnJlYWs7ICAvLyBObyBzZWdtZW50IG92ZXJyaWRlIQorICB9CisKKyAgLy8gRW1pdCB0aGUgcmVwZWF0IG9wY29kZSBwcmVmaXggYXMgbmVlZGVkLgorICBpZiAoKERlc2MtPlRTRmxhZ3MgJiBYODZJSTo6T3AwTWFzaykgPT0gWDg2SUk6OlJFUCkKKyAgICBNQ0UuZW1pdEJ5dGUoMHhGMyk7CisKKyAgLy8gRW1pdCB0aGUgb3BlcmFuZCBzaXplIG9wY29kZSBwcmVmaXggYXMgbmVlZGVkLgorICBpZiAoRGVzYy0+VFNGbGFncyAmIFg4NklJOjpPcFNpemUpCisgICAgTUNFLmVtaXRCeXRlKDB4NjYpOworCisgIC8vIEVtaXQgdGhlIGFkZHJlc3Mgc2l6ZSBvcGNvZGUgcHJlZml4IGFzIG5lZWRlZC4KKyAgaWYgKERlc2MtPlRTRmxhZ3MgJiBYODZJSTo6QWRTaXplKQorICAgIE1DRS5lbWl0Qnl0ZSgweDY3KTsKKworICBib29sIE5lZWQwRlByZWZpeCA9IGZhbHNlOworICBzd2l0Y2ggKERlc2MtPlRTRmxhZ3MgJiBYODZJSTo6T3AwTWFzaykgeworICBjYXNlIFg4NklJOjpUQjogIC8vIFR3by1ieXRlIG9wY29kZSBwcmVmaXgKKyAgY2FzZSBYODZJSTo6VDg6ICAvLyAwRiAzOAorICBjYXNlIFg4NklJOjpUQTogIC8vIDBGIDNBCisgICAgTmVlZDBGUHJlZml4ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6VEY6IC8vIEYyIDBGIDM4CisgICAgTUNFLmVtaXRCeXRlKDB4RjIpOworICAgIE5lZWQwRlByZWZpeCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6OlJFUDogYnJlYWs7IC8vIGFscmVhZHkgaGFuZGxlZC4KKyAgY2FzZSBYODZJSTo6WFM6ICAgLy8gRjMgMEYKKyAgICBNQ0UuZW1pdEJ5dGUoMHhGMyk7CisgICAgTmVlZDBGUHJlZml4ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6WEQ6ICAgLy8gRjIgMEYKKyAgICBNQ0UuZW1pdEJ5dGUoMHhGMik7CisgICAgTmVlZDBGUHJlZml4ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6RDg6IGNhc2UgWDg2SUk6OkQ5OiBjYXNlIFg4NklJOjpEQTogY2FzZSBYODZJSTo6REI6CisgIGNhc2UgWDg2SUk6OkRDOiBjYXNlIFg4NklJOjpERDogY2FzZSBYODZJSTo6REU6IGNhc2UgWDg2SUk6OkRGOgorICAgIE1DRS5lbWl0Qnl0ZSgweEQ4KworICAgICAgICAgICAgICAgICAoKChEZXNjLT5UU0ZsYWdzICYgWDg2SUk6Ok9wME1hc2spLVg4NklJOjpEOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gWDg2SUk6Ok9wMFNoaWZ0KSk7CisgICAgYnJlYWs7IC8vIFR3by1ieXRlIG9wY29kZSBwcmVmaXgKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBwcmVmaXghIik7CisgIGNhc2UgMDogYnJlYWs7ICAvLyBObyBwcmVmaXghCisgIH0KKworICAvLyBIYW5kbGUgUkVYIHByZWZpeC4KKyAgaWYgKElzNjRCaXRNb2RlKSB7CisgICAgaWYgKHVuc2lnbmVkIFJFWCA9IGRldGVybWluZVJFWChNSSkpCisgICAgICBNQ0UuZW1pdEJ5dGUoMHg0MCB8IFJFWCk7CisgIH0KKworICAvLyAweDBGIGVzY2FwZSBjb2RlIG11c3QgYmUgZW1pdHRlZCBqdXN0IGJlZm9yZSB0aGUgb3Bjb2RlLgorICBpZiAoTmVlZDBGUHJlZml4KQorICAgIE1DRS5lbWl0Qnl0ZSgweDBGKTsKKworICBzd2l0Y2ggKERlc2MtPlRTRmxhZ3MgJiBYODZJSTo6T3AwTWFzaykgeworICBjYXNlIFg4NklJOjpURjogICAgLy8gRjIgMEYgMzgKKyAgY2FzZSBYODZJSTo6VDg6ICAgIC8vIDBGIDM4CisgICAgTUNFLmVtaXRCeXRlKDB4MzgpOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpUQTogICAgLy8gMEYgM0EKKyAgICBNQ0UuZW1pdEJ5dGUoMHgzQSk7CisgICAgYnJlYWs7CisgIH0KKworICAvLyBJZiB0aGlzIGlzIGEgdHdvLWFkZHJlc3MgaW5zdHJ1Y3Rpb24sIHNraXAgb25lIG9mIHRoZSByZWdpc3RlciBvcGVyYW5kcy4KKyAgdW5zaWduZWQgTnVtT3BzID0gRGVzYy0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgdW5zaWduZWQgQ3VyT3AgPSAwOworICBpZiAoTnVtT3BzID4gMSAmJiBEZXNjLT5nZXRPcGVyYW5kQ29uc3RyYWludCgxLCBUT0k6OlRJRURfVE8pICE9IC0xKQorICAgICsrQ3VyT3A7CisgIGVsc2UgaWYgKE51bU9wcyA+IDIgJiYgRGVzYy0+Z2V0T3BlcmFuZENvbnN0cmFpbnQoTnVtT3BzLTEsIFRPSTo6VElFRF9UTyk9PSAwKQorICAgIC8vIFNraXAgdGhlIGxhc3Qgc291cmNlIG9wZXJhbmQgdGhhdCBpcyB0aWVkX3RvIHRoZSBkZXN0IHJlZy4gZS5nLiBMWEFERDMyCisgICAgLS1OdW1PcHM7CisKKyAgdW5zaWduZWQgY2hhciBCYXNlT3Bjb2RlID0gWDg2SUk6OmdldEJhc2VPcGNvZGVGb3IoRGVzYy0+VFNGbGFncyk7CisgIHN3aXRjaCAoRGVzYy0+VFNGbGFncyAmIFg4NklJOjpGb3JtTWFzaykgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gRm9ybU1hc2sgdmFsdWUgaW4gWDg2IE1hY2hpbmVDb2RlRW1pdHRlciEiKTsKKyAgY2FzZSBYODZJSTo6UHNldWRvOgorICAgIC8vIFJlbWVtYmVyIHRoZSBjdXJyZW50IFBDIG9mZnNldCwgdGhpcyBpcyB0aGUgUElDIHJlbG9jYXRpb24KKyAgICAvLyBiYXNlIGFkZHJlc3MuCisgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBkZWZhdWx0OiAKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoInBzdWVkbyBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIHJlbW92ZWQgYmVmb3JlIGNvZGUiCisgICAgICAgICAgICAgICAgICAgICAgICIgZW1pc3Npb24iKTsKKyAgICAgIGJyZWFrOworICAgIC8vIERvIG5vdGhpbmcgZm9yIEludF9NZW1CYXJyaWVyIC0gaXQncyBqdXN0IGEgY29tbWVudC4gIEFkZCBhIGRlYnVnCisgICAgLy8gdG8gbWFrZSBpdCBzbGlnaHRseSBlYXNpZXIgdG8gc2VlLgorICAgIGNhc2UgWDg2OjpJbnRfTWVtQmFycmllcjoKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiI01FTUJBUlJJRVJcbiIpOworICAgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OklOTElORUFTTToKKyAgICAgIC8vIFdlIGFsbG93IGlubGluZSBhc3NlbWJsZXIgbm9kZXMgd2l0aCBlbXB0eSBib2RpZXMgLSB0aGV5IGNhbgorICAgICAgLy8gaW1wbGljaXRseSBkZWZpbmUgcmVnaXN0ZXJzLCB3aGljaCBpcyBvayBmb3IgSklULgorICAgICAgaWYgKE1JLmdldE9wZXJhbmQoMCkuZ2V0U3ltYm9sTmFtZSgpWzBdKQorICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkpJVCBkb2VzIG5vdCBzdXBwb3J0IGlubGluZSBhc20hIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6UFJPTE9HX0xBQkVMOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpHQ19MQUJFTDoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6RUhfTEFCRUw6CisgICAgICBNQ0UuZW1pdExhYmVsKE1JLmdldE9wZXJhbmQoMCkuZ2V0TUNTeW1ib2woKSk7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpLSUxMOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBYODY6Ok1PVlBDMzJyOiB7CisgICAgICAvLyBUaGlzIGVtaXRzIHRoZSAiY2FsbCIgcG9ydGlvbiBvZiB0aGlzIHBzZXVkbyBpbnN0cnVjdGlvbi4KKyAgICAgIE1DRS5lbWl0Qnl0ZShCYXNlT3Bjb2RlKTsKKyAgICAgIGVtaXRDb25zdGFudCgwLCBYODZJSTo6Z2V0U2l6ZU9mSW1tKERlc2MtPlRTRmxhZ3MpKTsKKyAgICAgIC8vIFJlbWVtYmVyIFBJQyBiYXNlLgorICAgICAgUElDQmFzZU9mZnNldCA9IChpbnRwdHJfdCkgTUNFLmdldEN1cnJlbnRQQ09mZnNldCgpOworICAgICAgWDg2SklUSW5mbyAqSlRJID0gVE0uZ2V0SklUSW5mbygpOworICAgICAgSlRJLT5zZXRQSUNCYXNlKE1DRS5nZXRDdXJyZW50UENWYWx1ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgQ3VyT3AgPSBOdW1PcHM7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6OlJhd0ZybTogeworICAgIE1DRS5lbWl0Qnl0ZShCYXNlT3Bjb2RlKTsKKworICAgIGlmIChDdXJPcCA9PSBOdW1PcHMpCisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoQ3VyT3ArKyk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlJhd0ZybSBDdXJPcCAiIDw8IEN1ck9wIDw8ICJcbiIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiaXNNQkIgIiA8PCBNTy5pc01CQigpIDw8ICJcbiIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiaXNHbG9iYWwgIiA8PCBNTy5pc0dsb2JhbCgpIDw8ICJcbiIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiaXNTeW1ib2wgIiA8PCBNTy5pc1N5bWJvbCgpIDw8ICJcbiIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiaXNJbW0gIiA8PCBNTy5pc0ltbSgpIDw8ICJcbiIpOworCisgICAgaWYgKE1PLmlzTUJCKCkpIHsKKyAgICAgIGVtaXRQQ1JlbGF0aXZlQmxvY2tBZGRyZXNzKE1PLmdldE1CQigpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBpZiAoTU8uaXNHbG9iYWwoKSkgeworICAgICAgZW1pdEdsb2JhbEFkZHJlc3MoTU8uZ2V0R2xvYmFsKCksIFg4Njo6cmVsb2NfcGNyZWxfd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1PLmdldE9mZnNldCgpLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBpZiAoTU8uaXNTeW1ib2woKSkgeworICAgICAgZW1pdEV4dGVybmFsU3ltYm9sQWRkcmVzcyhNTy5nZXRTeW1ib2xOYW1lKCksIFg4Njo6cmVsb2NfcGNyZWxfd29yZCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogT25seSB1c2VkIGJ5IGhhY2tpc2ggTUNDb2RlRW1pdHRlciwgcmVtb3ZlIHdoZW4gZGVhZC4KKyAgICBpZiAoTU8uaXNKVEkoKSkgeworICAgICAgZW1pdEp1bXBUYWJsZUFkZHJlc3MoTU8uZ2V0SW5kZXgoKSwgWDg2OjpyZWxvY19wY3JlbF93b3JkKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBhc3NlcnQoTU8uaXNJbW0oKSAmJiAiVW5rbm93biBSYXdGcm0gb3BlcmFuZCEiKTsKKyAgICBpZiAoT3Bjb2RlID09IFg4Njo6Q0FMTHBjcmVsMzIgfHwgT3Bjb2RlID09IFg4Njo6Q0FMTDY0cGNyZWwzMikgeworICAgICAgLy8gRml4IHVwIGltbWVkaWF0ZSBvcGVyYW5kIGZvciBwYyByZWxhdGl2ZSBjYWxscy4KKyAgICAgIGludHB0cl90IEltbSA9IChpbnRwdHJfdClNTy5nZXRJbW0oKTsKKyAgICAgIEltbSA9IEltbSAtIE1DRS5nZXRDdXJyZW50UENWYWx1ZSgpIC0gNDsKKyAgICAgIGVtaXRDb25zdGFudChJbW0sIFg4NklJOjpnZXRTaXplT2ZJbW0oRGVzYy0+VFNGbGFncykpOworICAgIH0gZWxzZQorICAgICAgZW1pdENvbnN0YW50KE1PLmdldEltbSgpLCBYODZJSTo6Z2V0U2l6ZU9mSW1tKERlc2MtPlRTRmxhZ3MpKTsKKyAgICBicmVhazsKKyAgfQorICAgICAgCisgIGNhc2UgWDg2SUk6OkFkZFJlZ0ZybTogeworICAgIE1DRS5lbWl0Qnl0ZShCYXNlT3Bjb2RlICsgZ2V0WDg2UmVnTnVtKE1JLmdldE9wZXJhbmQoQ3VyT3ArKykuZ2V0UmVnKCkpKTsKKyAgICAKKyAgICBpZiAoQ3VyT3AgPT0gTnVtT3BzKQorICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUkuZ2V0T3BlcmFuZChDdXJPcCsrKTsKKyAgICB1bnNpZ25lZCBTaXplID0gWDg2SUk6OmdldFNpemVPZkltbShEZXNjLT5UU0ZsYWdzKTsKKyAgICBpZiAoTU8xLmlzSW1tKCkpIHsKKyAgICAgIGVtaXRDb25zdGFudChNTzEuZ2V0SW1tKCksIFNpemUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIHJ0ID0gSXM2NEJpdE1vZGUgPyBYODY6OnJlbG9jX3BjcmVsX3dvcmQKKyAgICAgIDogKElzUElDID8gWDg2OjpyZWxvY19waWNyZWxfd29yZCA6IFg4Njo6cmVsb2NfYWJzb2x1dGVfd29yZCk7CisgICAgaWYgKE9wY29kZSA9PSBYODY6Ok1PVjY0cmk2NGkzMikKKyAgICAgIHJ0ID0gWDg2OjpyZWxvY19hYnNvbHV0ZV93b3JkOyAgLy8gRklYTUU6IGFkZCBYODZJSSBmbGFnPworICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBvY2N1ciBvbiBEYXJ3aW4gZm9yIHJlbG9jYXRhYmxlIG9iamVjdHMuCisgICAgaWYgKE9wY29kZSA9PSBYODY6Ok1PVjY0cmkpCisgICAgICBydCA9IFg4Njo6cmVsb2NfYWJzb2x1dGVfZHdvcmQ7ICAvLyBGSVhNRTogYWRkIFg4NklJIGZsYWc/CisgICAgaWYgKE1PMS5pc0dsb2JhbCgpKSB7CisgICAgICBib29sIEluZGlyZWN0ID0gZ3ZOZWVkc05vbkxhenlQdHIoTU8xLCBUTSk7CisgICAgICBlbWl0R2xvYmFsQWRkcmVzcyhNTzEuZ2V0R2xvYmFsKCksIHJ0LCBNTzEuZ2V0T2Zmc2V0KCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBJbmRpcmVjdCk7CisgICAgfSBlbHNlIGlmIChNTzEuaXNTeW1ib2woKSkKKyAgICAgIGVtaXRFeHRlcm5hbFN5bWJvbEFkZHJlc3MoTU8xLmdldFN5bWJvbE5hbWUoKSwgcnQpOworICAgIGVsc2UgaWYgKE1PMS5pc0NQSSgpKQorICAgICAgZW1pdENvbnN0UG9vbEFkZHJlc3MoTU8xLmdldEluZGV4KCksIHJ0KTsKKyAgICBlbHNlIGlmIChNTzEuaXNKVEkoKSkKKyAgICAgIGVtaXRKdW1wVGFibGVBZGRyZXNzKE1PMS5nZXRJbmRleCgpLCBydCk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIFg4NklJOjpNUk1EZXN0UmVnOiB7CisgICAgTUNFLmVtaXRCeXRlKEJhc2VPcGNvZGUpOworICAgIGVtaXRSZWdNb2RSTUJ5dGUoTUkuZ2V0T3BlcmFuZChDdXJPcCkuZ2V0UmVnKCksCisgICAgICAgICAgICAgICAgICAgICBnZXRYODZSZWdOdW0oTUkuZ2V0T3BlcmFuZChDdXJPcCsxKS5nZXRSZWcoKSkpOworICAgIEN1ck9wICs9IDI7CisgICAgaWYgKEN1ck9wICE9IE51bU9wcykKKyAgICAgIGVtaXRDb25zdGFudChNSS5nZXRPcGVyYW5kKEN1ck9wKyspLmdldEltbSgpLAorICAgICAgICAgICAgICAgICAgIFg4NklJOjpnZXRTaXplT2ZJbW0oRGVzYy0+VFNGbGFncykpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgWDg2SUk6Ok1STURlc3RNZW06IHsKKyAgICBNQ0UuZW1pdEJ5dGUoQmFzZU9wY29kZSk7CisgICAgZW1pdE1lbU1vZFJNQnl0ZShNSSwgQ3VyT3AsCisgICAgICAgICAgICAgICAgICAgICBnZXRYODZSZWdOdW0oTUkuZ2V0T3BlcmFuZChDdXJPcCArIFg4Njo6QWRkck51bU9wZXJhbmRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZWcoKSkpOworICAgIEN1ck9wICs9ICBYODY6OkFkZHJOdW1PcGVyYW5kcyArIDE7CisgICAgaWYgKEN1ck9wICE9IE51bU9wcykKKyAgICAgIGVtaXRDb25zdGFudChNSS5nZXRPcGVyYW5kKEN1ck9wKyspLmdldEltbSgpLAorICAgICAgICAgICAgICAgICAgIFg4NklJOjpnZXRTaXplT2ZJbW0oRGVzYy0+VFNGbGFncykpOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBYODZJSTo6TVJNU3JjUmVnOgorICAgIE1DRS5lbWl0Qnl0ZShCYXNlT3Bjb2RlKTsKKyAgICBlbWl0UmVnTW9kUk1CeXRlKE1JLmdldE9wZXJhbmQoQ3VyT3ArMSkuZ2V0UmVnKCksCisgICAgICAgICAgICAgICAgICAgICBnZXRYODZSZWdOdW0oTUkuZ2V0T3BlcmFuZChDdXJPcCkuZ2V0UmVnKCkpKTsKKyAgICBDdXJPcCArPSAyOworICAgIGlmIChDdXJPcCAhPSBOdW1PcHMpCisgICAgICBlbWl0Q29uc3RhbnQoTUkuZ2V0T3BlcmFuZChDdXJPcCsrKS5nZXRJbW0oKSwKKyAgICAgICAgICAgICAgICAgICBYODZJSTo6Z2V0U2l6ZU9mSW1tKERlc2MtPlRTRmxhZ3MpKTsKKyAgICBicmVhazsKKworICBjYXNlIFg4NklJOjpNUk1TcmNNZW06IHsKKyAgICBpbnQgQWRkck9wZXJhbmRzID0gWDg2OjpBZGRyTnVtT3BlcmFuZHM7CisKKyAgICBpbnRwdHJfdCBQQ0FkaiA9IChDdXJPcCArIEFkZHJPcGVyYW5kcyArIDEgIT0gTnVtT3BzKSA/CisgICAgICBYODZJSTo6Z2V0U2l6ZU9mSW1tKERlc2MtPlRTRmxhZ3MpIDogMDsKKworICAgIE1DRS5lbWl0Qnl0ZShCYXNlT3Bjb2RlKTsKKyAgICBlbWl0TWVtTW9kUk1CeXRlKE1JLCBDdXJPcCsxLCBnZXRYODZSZWdOdW0oTUkuZ2V0T3BlcmFuZChDdXJPcCkuZ2V0UmVnKCkpLAorICAgICAgICAgICAgICAgICAgICAgUENBZGopOworICAgIEN1ck9wICs9IEFkZHJPcGVyYW5kcyArIDE7CisgICAgaWYgKEN1ck9wICE9IE51bU9wcykKKyAgICAgIGVtaXRDb25zdGFudChNSS5nZXRPcGVyYW5kKEN1ck9wKyspLmdldEltbSgpLAorICAgICAgICAgICAgICAgICAgIFg4NklJOjpnZXRTaXplT2ZJbW0oRGVzYy0+VFNGbGFncykpOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBYODZJSTo6TVJNMHI6IGNhc2UgWDg2SUk6Ok1STTFyOgorICBjYXNlIFg4NklJOjpNUk0ycjogY2FzZSBYODZJSTo6TVJNM3I6CisgIGNhc2UgWDg2SUk6Ok1STTRyOiBjYXNlIFg4NklJOjpNUk01cjoKKyAgY2FzZSBYODZJSTo6TVJNNnI6IGNhc2UgWDg2SUk6Ok1STTdyOiB7CisgICAgTUNFLmVtaXRCeXRlKEJhc2VPcGNvZGUpOworICAgIGVtaXRSZWdNb2RSTUJ5dGUoTUkuZ2V0T3BlcmFuZChDdXJPcCsrKS5nZXRSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgIChEZXNjLT5UU0ZsYWdzICYgWDg2SUk6OkZvcm1NYXNrKS1YODZJSTo6TVJNMHIpOworCisgICAgaWYgKEN1ck9wID09IE51bU9wcykKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzEgPSBNSS5nZXRPcGVyYW5kKEN1ck9wKyspOworICAgIHVuc2lnbmVkIFNpemUgPSBYODZJSTo6Z2V0U2l6ZU9mSW1tKERlc2MtPlRTRmxhZ3MpOworICAgIGlmIChNTzEuaXNJbW0oKSkgeworICAgICAgZW1pdENvbnN0YW50KE1PMS5nZXRJbW0oKSwgU2l6ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgcnQgPSBJczY0Qml0TW9kZSA/IFg4Njo6cmVsb2NfcGNyZWxfd29yZAorICAgICAgOiAoSXNQSUMgPyBYODY6OnJlbG9jX3BpY3JlbF93b3JkIDogWDg2OjpyZWxvY19hYnNvbHV0ZV93b3JkKTsKKyAgICBpZiAoT3Bjb2RlID09IFg4Njo6TU9WNjRyaTMyKQorICAgICAgcnQgPSBYODY6OnJlbG9jX2Fic29sdXRlX3dvcmRfc2V4dDsgIC8vIEZJWE1FOiBhZGQgWDg2SUkgZmxhZz8KKyAgICBpZiAoTU8xLmlzR2xvYmFsKCkpIHsKKyAgICAgIGJvb2wgSW5kaXJlY3QgPSBndk5lZWRzTm9uTGF6eVB0cihNTzEsIFRNKTsKKyAgICAgIGVtaXRHbG9iYWxBZGRyZXNzKE1PMS5nZXRHbG9iYWwoKSwgcnQsIE1PMS5nZXRPZmZzZXQoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZGlyZWN0KTsKKyAgICB9IGVsc2UgaWYgKE1PMS5pc1N5bWJvbCgpKQorICAgICAgZW1pdEV4dGVybmFsU3ltYm9sQWRkcmVzcyhNTzEuZ2V0U3ltYm9sTmFtZSgpLCBydCk7CisgICAgZWxzZSBpZiAoTU8xLmlzQ1BJKCkpCisgICAgICBlbWl0Q29uc3RQb29sQWRkcmVzcyhNTzEuZ2V0SW5kZXgoKSwgcnQpOworICAgIGVsc2UgaWYgKE1PMS5pc0pUSSgpKQorICAgICAgZW1pdEp1bXBUYWJsZUFkZHJlc3MoTU8xLmdldEluZGV4KCksIHJ0KTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgWDg2SUk6Ok1STTBtOiBjYXNlIFg4NklJOjpNUk0xbToKKyAgY2FzZSBYODZJSTo6TVJNMm06IGNhc2UgWDg2SUk6Ok1STTNtOgorICBjYXNlIFg4NklJOjpNUk00bTogY2FzZSBYODZJSTo6TVJNNW06CisgIGNhc2UgWDg2SUk6Ok1STTZtOiBjYXNlIFg4NklJOjpNUk03bTogeworICAgIGludHB0cl90IFBDQWRqID0gKEN1ck9wICsgWDg2OjpBZGRyTnVtT3BlcmFuZHMgIT0gTnVtT3BzKSA/CisgICAgICAoTUkuZ2V0T3BlcmFuZChDdXJPcCtYODY6OkFkZHJOdW1PcGVyYW5kcykuaXNJbW0oKSA/IAorICAgICAgICAgIFg4NklJOjpnZXRTaXplT2ZJbW0oRGVzYy0+VFNGbGFncykgOiA0KSA6IDA7CisKKyAgICBNQ0UuZW1pdEJ5dGUoQmFzZU9wY29kZSk7CisgICAgZW1pdE1lbU1vZFJNQnl0ZShNSSwgQ3VyT3AsIChEZXNjLT5UU0ZsYWdzICYgWDg2SUk6OkZvcm1NYXNrKS1YODZJSTo6TVJNMG0sCisgICAgICAgICAgICAgICAgICAgICBQQ0Fkaik7CisgICAgQ3VyT3AgKz0gWDg2OjpBZGRyTnVtT3BlcmFuZHM7CisKKyAgICBpZiAoQ3VyT3AgPT0gTnVtT3BzKQorICAgICAgYnJlYWs7CisgICAgCisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChDdXJPcCsrKTsKKyAgICB1bnNpZ25lZCBTaXplID0gWDg2SUk6OmdldFNpemVPZkltbShEZXNjLT5UU0ZsYWdzKTsKKyAgICBpZiAoTU8uaXNJbW0oKSkgeworICAgICAgZW1pdENvbnN0YW50KE1PLmdldEltbSgpLCBTaXplKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBydCA9IElzNjRCaXRNb2RlID8gWDg2OjpyZWxvY19wY3JlbF93b3JkCisgICAgICA6IChJc1BJQyA/IFg4Njo6cmVsb2NfcGljcmVsX3dvcmQgOiBYODY6OnJlbG9jX2Fic29sdXRlX3dvcmQpOworICAgIGlmIChPcGNvZGUgPT0gWDg2OjpNT1Y2NG1pMzIpCisgICAgICBydCA9IFg4Njo6cmVsb2NfYWJzb2x1dGVfd29yZF9zZXh0OyAgLy8gRklYTUU6IGFkZCBYODZJSSBmbGFnPworICAgIGlmIChNTy5pc0dsb2JhbCgpKSB7CisgICAgICBib29sIEluZGlyZWN0ID0gZ3ZOZWVkc05vbkxhenlQdHIoTU8sIFRNKTsKKyAgICAgIGVtaXRHbG9iYWxBZGRyZXNzKE1PLmdldEdsb2JhbCgpLCBydCwgTU8uZ2V0T2Zmc2V0KCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBJbmRpcmVjdCk7CisgICAgfSBlbHNlIGlmIChNTy5pc1N5bWJvbCgpKQorICAgICAgZW1pdEV4dGVybmFsU3ltYm9sQWRkcmVzcyhNTy5nZXRTeW1ib2xOYW1lKCksIHJ0KTsKKyAgICBlbHNlIGlmIChNTy5pc0NQSSgpKQorICAgICAgZW1pdENvbnN0UG9vbEFkZHJlc3MoTU8uZ2V0SW5kZXgoKSwgcnQpOworICAgIGVsc2UgaWYgKE1PLmlzSlRJKCkpCisgICAgICBlbWl0SnVtcFRhYmxlQWRkcmVzcyhNTy5nZXRJbmRleCgpLCBydCk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIFg4NklJOjpNUk1Jbml0UmVnOgorICAgIE1DRS5lbWl0Qnl0ZShCYXNlT3Bjb2RlKTsKKyAgICAvLyBEdXBsaWNhdGUgcmVnaXN0ZXIsIHVzZWQgYnkgdGhpbmdzIGxpa2UgTU9WOHIwIChha2EgeG9yIHJlZyxyZWcpLgorICAgIGVtaXRSZWdNb2RSTUJ5dGUoTUkuZ2V0T3BlcmFuZChDdXJPcCkuZ2V0UmVnKCksCisgICAgICAgICAgICAgICAgICAgICBnZXRYODZSZWdOdW0oTUkuZ2V0T3BlcmFuZChDdXJPcCkuZ2V0UmVnKCkpKTsKKyAgICArK0N1ck9wOworICAgIGJyZWFrOworICAgICAgCisgIGNhc2UgWDg2SUk6Ok1STV9DMToKKyAgICBNQ0UuZW1pdEJ5dGUoQmFzZU9wY29kZSk7CisgICAgTUNFLmVtaXRCeXRlKDB4QzEpOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpNUk1fQzg6CisgICAgTUNFLmVtaXRCeXRlKEJhc2VPcGNvZGUpOworICAgIE1DRS5lbWl0Qnl0ZSgweEM4KTsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6TVJNX0M5OgorICAgIE1DRS5lbWl0Qnl0ZShCYXNlT3Bjb2RlKTsKKyAgICBNQ0UuZW1pdEJ5dGUoMHhDOSk7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6Ok1STV9FODoKKyAgICBNQ0UuZW1pdEJ5dGUoQmFzZU9wY29kZSk7CisgICAgTUNFLmVtaXRCeXRlKDB4RTgpOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpNUk1fRjA6CisgICAgTUNFLmVtaXRCeXRlKEJhc2VPcGNvZGUpOworICAgIE1DRS5lbWl0Qnl0ZSgweEYwKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmICghRGVzYy0+aXNWYXJpYWRpYygpICYmIEN1ck9wICE9IE51bU9wcykgeworI2lmbmRlZiBOREVCVUcKKyAgICBkYmdzKCkgPDwgIkNhbm5vdCBlbmNvZGUgYWxsIG9wZXJhbmRzIG9mOiAiIDw8IE1JIDw8ICJcbiI7CisjZW5kaWYKKyAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICB9CisKKyAgTUNFLnByb2Nlc3NEZWJ1Z0xvYyhNSS5nZXREZWJ1Z0xvYygpLCBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZDb21waWxhdGlvbkNhbGxiYWNrX1dpbjY0LmFzbSBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfV2luNjQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjE3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZDb21waWxhdGlvbkNhbGxiYWNrX1dpbjY0LmFzbQpAQCAtMCwwICsxLDY4IEBACis7Oz09PS0tIFg4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfV2luNjQuYXNtIC0gSW1wbGVtZW50IFdpbjY0IEpJVCBjYWxsYmFjayAtLS09PT0KKzs7Cis7OyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCis7OworOzsgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCis7OyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCis7OworOzs9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Cis7OworOzsgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEpJVCBpbnRlcmZhY2VzIGZvciB0aGUgWDg2IHRhcmdldC4KKzs7Cis7Oz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKworZXh0cm4gWDg2Q29tcGlsYXRpb25DYWxsYmFjazI6IFBST0MKKworLmNvZGUKK1g4NkNvbXBpbGF0aW9uQ2FsbGJhY2sgcHJvYworICAgIHB1c2ggICAgcmJwCisKKyAgICA7IFNhdmUgUlNQLgorICAgIG1vdiAgICAgcmJwLCByc3AKKworICAgIDsgU2F2ZSBhbGwgaW50IGFyZyByZWdpc3RlcnMKKyAgICA7IFdBUk5JTkc6IFdlIGNhbm5vdCB1c2UgcmVnaXN0ZXIgc3BpbGwgYXJlYSAtIHdlJ3JlIGdlbmVyYXRpbmcgc3R1YnMgYnkgaGFuZHMhCisgICAgcHVzaCAgICByY3gKKyAgICBwdXNoICAgIHJkeAorICAgIHB1c2ggICAgcjgKKyAgICBwdXNoICAgIHI5CisKKyAgICA7IEFsaWduIHN0YWNrIG9uIDE2LWJ5dGUgYm91bmRhcnkuCisgICAgYW5kICAgICByc3AsIC0xNgorCisgICAgOyBTYXZlIGFsbCBYTU0gYXJnIHJlZ2lzdGVycy4gQWxzbyBhbGxvY2F0ZSByZWcgc3BpbGwgYXJlYS4KKyAgICBzdWIgICAgIHJzcCwgOTYKKyAgICBtb3ZhcHMgIFtyc3AgICArMzJdLCAgeG1tMAorICAgIG1vdmFwcyAgW3JzcCsxNiszMl0sICB4bW0xCisgICAgbW92YXBzICBbcnNwKzMyKzMyXSwgIHhtbTIKKyAgICBtb3ZhcHMgIFtyc3ArNDgrMzJdLCAgeG1tMworCisgICAgOyBKSVQgY2FsbGVlCisKKyAgICA7IFBhc3MgcHJldiBmcmFtZSBhbmQgcmV0dXJuIGFkZHJlc3MuCisgICAgbW92ICAgICByY3gsIHJicAorICAgIG1vdiAgICAgcmR4LCBxd29yZCBwdHIgW3JicCs4XQorICAgIGNhbGwgICAgWDg2Q29tcGlsYXRpb25DYWxsYmFjazIKKworICAgIDsgUmVzdG9yZSBhbGwgWE1NIGFyZyByZWdpc3RlcnMuCisgICAgbW92YXBzICB4bW0zLCBbcnNwKzQ4KzMyXQorICAgIG1vdmFwcyAgeG1tMiwgW3JzcCszMiszMl0KKyAgICBtb3ZhcHMgIHhtbTEsIFtyc3ArMTYrMzJdCisgICAgbW92YXBzICB4bW0wLCBbcnNwICAgKzMyXQorCisgICAgOyBSZXN0b3JlIFJTUC4KKyAgICBtb3YgICAgIHJzcCwgcmJwCisKKyAgICA7IFJlc3RvcmUgYWxsIGludCBhcmcgcmVnaXN0ZXJzCisgICAgc3ViICAgICByc3AsIDMyCisgICAgcG9wICAgICByOQorICAgIHBvcCAgICAgcjgKKyAgICBwb3AgICAgIHJkeAorICAgIHBvcCAgICAgcmN4CisKKyAgICA7IFJlc3RvcmUgUkJQLgorICAgIHBvcCAgICAgcmJwCisgICAgcmV0CitYODZDb21waWxhdGlvbkNhbGxiYWNrIGVuZHAKKworRW5kCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZGaXh1cEtpbmRzLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZGaXh1cEtpbmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlMGFhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkZpeHVwS2luZHMuaApAQCAtMCwwICsxLDI3IEBACisvLz09PS0tIFg4Ni9YODZGaXh1cEtpbmRzLmggLSBYODYgU3BlY2lmaWMgRml4dXAgRW50cmllcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fWDg2X1g4NkZJWFVQS0lORFNfSAorI2RlZmluZSBMTFZNX1g4Nl9YODZGSVhVUEtJTkRTX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNGaXh1cC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgWDg2IHsKK2VudW0gRml4dXBzIHsKKyAgcmVsb2NfcGNyZWxfNGJ5dGUgPSBGaXJzdFRhcmdldEZpeHVwS2luZCwgIC8vIDMyLWJpdCBwY3JlbCwgZS5nLiBhIGJyYW5jaC4KKyAgcmVsb2NfcGNyZWxfMWJ5dGUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDgtYml0IHBjcmVsLCBlLmcuIGJyYW5jaF8xCisgIHJlbG9jX3BjcmVsXzJieXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxNi1iaXQgcGNyZWwsIGUuZy4gY2FsbHcKKyAgcmVsb2NfcmlwcmVsXzRieXRlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMyLWJpdCByaXAtcmVsYXRpdmUKKyAgcmVsb2NfcmlwcmVsXzRieXRlX21vdnFfbG9hZCAgICAgICAgICAgICAgIC8vIDMyLWJpdCByaXAtcmVsYXRpdmUgaW4gbW92cQorfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZGbG9hdGluZ1BvaW50LmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkZsb2F0aW5nUG9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTY3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZGbG9hdGluZ1BvaW50LmNwcApAQCAtMCwwICsxLDE1ODcgQEAKKy8vPT09LS0gWDg2RmxvYXRpbmdQb2ludC5jcHAgLSBGbG9hdGluZyBwb2ludCBSZWcgLT4gU3RhY2sgY29udmVydGVyIC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHBhc3Mgd2hpY2ggY29udmVydHMgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGZyb20KKy8vIHBzZXVkbyByZWdpc3RlcnMgaW50byByZWdpc3RlciBzdGFjayBpbnN0cnVjdGlvbnMuICBUaGlzIHBhc3MgdXNlcyBsaXZlCisvLyB2YXJpYWJsZSBpbmZvcm1hdGlvbiB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgRlBuIHJlZ2lzdGVycyBhcmUgdXNlZCBhbmQgdGhlaXIKKy8vIGxpZmV0aW1lcy4KKy8vCisvLyBUaGUgeDg3IGhhcmR3YXJlIHRyYWNrcyBsaXZlbmVzcyBvZiB0aGUgc3RhY2sgcmVnaXN0ZXJzLCBzbyBpdCBpcyBuZWNlc3NhcnkKKy8vIHRvIGltcGxlbWVudCBleGFjdCBsaXZlbmVzcyB0cmFja2luZyBiZXR3ZWVuIGJhc2ljIGJsb2Nrcy4gVGhlIENGRyBlZGdlcyBhcmUKKy8vIHBhcnRpdGlvbmVkIGludG8gYnVuZGxlcyB3aGVyZSB0aGUgc2FtZSBGUCByZWdpc3RlcnMgbXVzdCBiZSBsaXZlIGluCisvLyBpZGVudGljYWwgc3RhY2sgcG9zaXRpb25zLiBJbnN0cnVjdGlvbnMgYXJlIGluc2VydGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBiYXNpYworLy8gYmxvY2sgdG8gcmVhcnJhbmdlIHRoZSBsaXZlIHJlZ2lzdGVycyB0byBtYXRjaCB0aGUgb3V0Z29pbmcgYnVuZGxlLgorLy8KKy8vIFRoaXMgYXBwcm9hY2ggYXZvaWRzIHNwbGl0dGluZyBjcml0aWNhbCBlZGdlcyBhdCB0aGUgcG90ZW50aWFsIGNvc3Qgb2YgbW9yZQorLy8gbGl2ZSByZWdpc3RlciBzaHVmZmxpbmcgaW5zdHJ1Y3Rpb25zIHdoZW4gY3JpdGljYWwgZWRnZXMgYXJlIHByZXNlbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJ4ODYtY29kZWdlbiIKKyNpbmNsdWRlICJYODYuaCIKKyNpbmNsdWRlICJYODZJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1GWENILCAiTnVtYmVyIG9mIGZ4Y2ggaW5zdHJ1Y3Rpb25zIGluc2VydGVkIik7CitTVEFUSVNUSUMoTnVtRlAgICwgIk51bWJlciBvZiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMiKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEZQUyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBGUFMoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHsKKyAgICAgIC8vIFRoaXMgaXMgcmVhbGx5IG9ubHkgdG8ga2VlcCB2YWxncmluZCBxdWlldC4KKyAgICAgIC8vIFRoZSBsb2dpYyBpbiBpc0xpdmUoKSBpcyB0b28gbXVjaCBmb3IgaXQuCisgICAgICBtZW1zZXQoU3RhY2ssIDAsIHNpemVvZihTdGFjaykpOworICAgICAgbWVtc2V0KFJlZ01hcCwgMCwgc2l6ZW9mKFJlZ01hcCkpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZElEKE1hY2hpbmVMb29wSW5mb0lEKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZElEKE1hY2hpbmVEb21pbmF0b3JzSUQpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJYODYgRlAgU3RhY2tpZmllciI7IH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOyAvLyBNYWNoaW5lIGluc3RydWN0aW9uIGluZm8uCisKKyAgICAvLyBUd28gQ0ZHIGVkZ2VzIGFyZSByZWxhdGVkIGlmIHRoZXkgbGVhdmUgdGhlIHNhbWUgYmxvY2ssIG9yIGVudGVyIHRoZSBzYW1lCisgICAgLy8gYmxvY2suIFRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYW4gZWRnZSB1bmRlciB0aGlzIHJlbGF0aW9uIGlzIGEKKyAgICAvLyBMaXZlQnVuZGxlLiBJdCByZXByZXNlbnRzIGEgc2V0IG9mIENGRyBlZGdlcyB3aGVyZSB0aGUgbGl2ZSBGUCBzdGFjaworICAgIC8vIHJlZ2lzdGVycyBtdXN0IGJlIGFsbG9jYXRlZCBpZGVudGljYWxseSBpbiB0aGUgeDg3IHN0YWNrLgorICAgIC8vCisgICAgLy8gQSBMaXZlQnVuZGxlIGlzIHVzdWFsbHkgYWxsIHRoZSBlZGdlcyBsZWF2aW5nIGEgYmxvY2ssIG9yIGFsbCB0aGUgZWRnZXMKKyAgICAvLyBlbnRlcmluZyBhIGJsb2NrLCBidXQgaXQgY2FuIGNvbnRhaW4gbW9yZSBlZGdlcyBpZiBjcml0aWNhbCBlZGdlcyBhcmUKKyAgICAvLyBwcmVzZW50LgorICAgIC8vCisgICAgLy8gVGhlIHNldCBvZiBsaXZlIEZQIHJlZ2lzdGVycyBpbiBhIExpdmVCdW5kbGUgaXMgY2FsY3VsYXRlZCBieSBidW5kbGVDRkcsCisgICAgLy8gYnV0IHRoZSBleGFjdCBtYXBwaW5nIG9mIEZQIHJlZ2lzdGVycyB0byBzdGFjayBzbG90cyBpcyBmaXhlZCBsYXRlci4KKyAgICBzdHJ1Y3QgTGl2ZUJ1bmRsZSB7CisgICAgICAvLyBCaXQgbWFzayBvZiBsaXZlIEZQIHJlZ2lzdGVycy4gQml0IDAgPSBGUDAsIGJpdCAxID0gRlAxLCAmYy4KKyAgICAgIHVuc2lnbmVkIE1hc2s7CisKKyAgICAgIC8vIE51bWJlciBvZiBwcmUtYXNzaWduZWQgbGl2ZSByZWdpc3RlcnMgaW4gRml4U3RhY2suIFRoaXMgaXMgMCB3aGVuIHRoZQorICAgICAgLy8gc3RhY2sgb3JkZXIgaGFzIG5vdCB5ZXQgYmVlbiBmaXhlZC4KKyAgICAgIHVuc2lnbmVkIEZpeENvdW50OworCisgICAgICAvLyBBc3NpZ25lZCBzdGFjayBvcmRlciBmb3IgbGl2ZS1pbiByZWdpc3RlcnMuCisgICAgICAvLyBGaXhTdGFja1tpXSA9PSBnZXRTdGFja0VudHJ5KGkpIGZvciBhbGwgaSA8IEZpeENvdW50LgorICAgICAgdW5zaWduZWQgY2hhciBGaXhTdGFja1s4XTsKKworICAgICAgTGl2ZUJ1bmRsZSh1bnNpZ25lZCBtID0gMCkgOiBNYXNrKG0pLCBGaXhDb3VudCgwKSB7fQorCisgICAgICAvLyBIYXZlIHRoZSBsaXZlIHJlZ2lzdGVycyBiZWVuIGFzc2lnbmVkIGEgc3RhY2sgb3JkZXIgeWV0PworICAgICAgYm9vbCBpc0ZpeGVkKCkgY29uc3QgeyByZXR1cm4gIU1hc2sgfHwgRml4Q291bnQ7IH0KKyAgICB9OworCisgICAgLy8gTnVtYmVyZWQgTGl2ZUJ1bmRsZSBzdHJ1Y3RzLiBMaXZlQnVuZGxlc1swXSBpcyB1c2VkIGZvciBhbGwgQ0ZHIGVkZ2VzCisgICAgLy8gd2l0aCBubyBsaXZlIEZQIHJlZ2lzdGVycy4KKyAgICBTbWFsbFZlY3RvcjxMaXZlQnVuZGxlLCA4PiBMaXZlQnVuZGxlczsKKworICAgIC8vIE1hcCBlYWNoIE1CQiBpbiB0aGUgY3VycmVudCBmdW5jdGlvbiB0byBhbiAoaW5nb2luZywgb3V0Z29pbmcpIGluZGV4IGludG8KKyAgICAvLyBMaXZlQnVuZGxlcy4gQmxvY2tzIHdpdGggbm8gRlAgcmVnaXN0ZXJzIGxpdmUgaW4gb3Igb3V0IG1hcCB0byAoMCwgMCkKKyAgICAvLyBhbmQgYXJlIG5vdCBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIG1hcC4KKyAgICBEZW5zZU1hcDxNYWNoaW5lQmFzaWNCbG9jayosIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+ID4gQmxvY2tCdW5kbGU7CisKKyAgICAvLyBSZXR1cm4gYSBiaXRtYXNrIG9mIEZQIHJlZ2lzdGVycyBpbiBibG9jaydzIGxpdmUtaW4gbGlzdC4KKyAgICB1bnNpZ25lZCBjYWxjTGl2ZUluTWFzayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgICAgICB1bnNpZ25lZCBNYXNrID0gMDsKKyAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6OmxpdmVpbl9pdGVyYXRvciBJID0gTUJCLT5saXZlaW5fYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE1CQi0+bGl2ZWluX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICB1bnNpZ25lZCBSZWcgPSAqSSAtIFg4Njo6RlAwOworICAgICAgICBpZiAoUmVnIDwgOCkKKyAgICAgICAgICBNYXNrIHw9IDEgPDwgUmVnOworICAgICAgfQorICAgICAgcmV0dXJuIE1hc2s7CisgICAgfQorCisgICAgLy8gUGFydGl0aW9uIGFsbCB0aGUgQ0ZHIGVkZ2VzIGludG8gTGl2ZUJ1bmRsZXMuCisgICAgdm9pZCBidW5kbGVDRkcoTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCOyAgICAgLy8gQ3VycmVudCBiYXNpYyBibG9jaworICAgIHVuc2lnbmVkIFN0YWNrWzhdOyAgICAgICAgICAvLyBGUDxuPiBSZWdpc3RlcnMgaW4gZWFjaCBzdGFjayBzbG90Li4uCisgICAgdW5zaWduZWQgUmVnTWFwWzhdOyAgICAgICAgIC8vIFRyYWNrIHdoaWNoIHN0YWNrIHNsb3QgY29udGFpbnMgZWFjaCByZWdpc3RlcgorICAgIHVuc2lnbmVkIFN0YWNrVG9wOyAgICAgICAgICAvLyBUaGUgY3VycmVudCB0b3Agb2YgdGhlIEZQIHN0YWNrLgorCisgICAgLy8gU2V0IHVwIG91ciBzdGFjayBtb2RlbCB0byBtYXRjaCB0aGUgaW5jb21pbmcgcmVnaXN0ZXJzIHRvIE1CQi4KKyAgICB2b2lkIHNldHVwQmxvY2tTdGFjaygpOworCisgICAgLy8gU2h1ZmZsZSBsaXZlIHJlZ2lzdGVycyB0byBtYXRjaCB0aGUgZXhwZWN0YXRpb25zIG9mIHN1Y2Nlc3NvciBibG9ja3MuCisgICAgdm9pZCBmaW5pc2hCbG9ja1N0YWNrKCk7CisKKyAgICB2b2lkIGR1bXBTdGFjaygpIGNvbnN0IHsKKyAgICAgIGRiZ3MoKSA8PCAiU3RhY2sgY29udGVudHM6IjsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gU3RhY2tUb3A7ICsraSkgeworICAgICAgICBkYmdzKCkgPDwgIiBGUCIgPDwgU3RhY2tbaV07CisgICAgICAgIGFzc2VydChSZWdNYXBbU3RhY2tbaV1dID09IGkgJiYgIlN0YWNrW10gZG9lc24ndCBtYXRjaCBSZWdNYXBbXSEiKTsKKyAgICAgIH0KKyAgICAgIGRiZ3MoKSA8PCAiXG4iOworICAgIH0KKworICAgIC8vLyBpc1N0YWNrRW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgRlAgc3RhY2sgaXMgZW1wdHkuCisgICAgYm9vbCBpc1N0YWNrRW1wdHkoKSBjb25zdCB7CisgICAgICByZXR1cm4gU3RhY2tUb3AgPT0gMDsKKyAgICB9CisKKyAgICAvLy8gZ2V0U2xvdCAtIFJldHVybiB0aGUgc3RhY2sgc2xvdCBudW1iZXIgYSBwYXJ0aWN1bGFyIHJlZ2lzdGVyIG51bWJlciBpcworICAgIC8vLyBpbi4KKyAgICB1bnNpZ25lZCBnZXRTbG90KHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgICBhc3NlcnQoUmVnTm8gPCA4ICYmICJSZWdubyBvdXQgb2YgcmFuZ2UhIik7CisgICAgICByZXR1cm4gUmVnTWFwW1JlZ05vXTsKKyAgICB9CisKKyAgICAvLy8gaXNMaXZlIC0gSXMgUmVnTm8gY3VycmVudGx5IGxpdmUgaW4gdGhlIHN0YWNrPworICAgIGJvb2wgaXNMaXZlKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBTbG90ID0gZ2V0U2xvdChSZWdObyk7CisgICAgICByZXR1cm4gU2xvdCA8IFN0YWNrVG9wICYmIFN0YWNrW1Nsb3RdID09IFJlZ05vOworICAgIH0KKworICAgIC8vLyBnZXRTY3JhdGNoUmVnIC0gUmV0dXJuIGFuIEZQIHJlZ2lzdGVyIHRoYXQgaXMgbm90IGN1cnJlbnRseSBpbiB1c2UuCisgICAgdW5zaWduZWQgZ2V0U2NyYXRjaFJlZygpIHsKKyAgICAgIGZvciAoaW50IGkgPSA3OyBpID49IDA7IC0taSkKKyAgICAgICAgaWYgKCFpc0xpdmUoaSkpCisgICAgICAgICAgcmV0dXJuIGk7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJSYW4gb3V0IG9mIHNjcmF0Y2ggRlAgcmVnaXN0ZXJzIik7CisgICAgfQorCisgICAgLy8vIGdldFN0YWNrRW50cnkgLSBSZXR1cm4gdGhlIFg4Njo6RlA8bj4gcmVnaXN0ZXIgaW4gcmVnaXN0ZXIgU1QoaSkuCisgICAgdW5zaWduZWQgZ2V0U3RhY2tFbnRyeSh1bnNpZ25lZCBTVGkpIGNvbnN0IHsKKyAgICAgIGFzc2VydChTVGkgPCBTdGFja1RvcCAmJiAiQWNjZXNzIHBhc3Qgc3RhY2sgdG9wISIpOworICAgICAgcmV0dXJuIFN0YWNrW1N0YWNrVG9wLTEtU1RpXTsKKyAgICB9CisKKyAgICAvLy8gZ2V0U1RSZWcgLSBSZXR1cm4gdGhlIFg4Njo6U1QoaSkgcmVnaXN0ZXIgd2hpY2ggY29udGFpbnMgdGhlIHNwZWNpZmllZAorICAgIC8vLyBGUDxSZWdObz4gcmVnaXN0ZXIuCisgICAgdW5zaWduZWQgZ2V0U1RSZWcodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdGFja1RvcCAtIDEgLSBnZXRTbG90KFJlZ05vKSArIGxsdm06Olg4Njo6U1QwOworICAgIH0KKworICAgIC8vIHB1c2hSZWcgLSBQdXNoIHRoZSBzcGVjaWZpZWQgRlA8bj4gcmVnaXN0ZXIgb250byB0aGUgc3RhY2suCisgICAgdm9pZCBwdXNoUmVnKHVuc2lnbmVkIFJlZykgeworICAgICAgYXNzZXJ0KFJlZyA8IDggJiYgIlJlZ2lzdGVyIG51bWJlciBvdXQgb2YgcmFuZ2UhIik7CisgICAgICBhc3NlcnQoU3RhY2tUb3AgPCA4ICYmICJTdGFjayBvdmVyZmxvdyEiKTsKKyAgICAgIFN0YWNrW1N0YWNrVG9wXSA9IFJlZzsKKyAgICAgIFJlZ01hcFtSZWddID0gU3RhY2tUb3ArKzsKKyAgICB9CisKKyAgICBib29sIGlzQXRUb3AodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsgcmV0dXJuIGdldFNsb3QoUmVnTm8pID09IFN0YWNrVG9wLTE7IH0KKyAgICB2b2lkIG1vdmVUb1RvcCh1bnNpZ25lZCBSZWdObywgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsKKyAgICAgIERlYnVnTG9jIGRsID0gSSA9PSBNQkItPmVuZCgpID8gRGVidWdMb2MoKSA6IEktPmdldERlYnVnTG9jKCk7CisgICAgICBpZiAoaXNBdFRvcChSZWdObykpIHJldHVybjsKKworICAgICAgdW5zaWduZWQgU1RSZWcgPSBnZXRTVFJlZyhSZWdObyk7CisgICAgICB1bnNpZ25lZCBSZWdPblRvcCA9IGdldFN0YWNrRW50cnkoMCk7CisKKyAgICAgIC8vIFN3YXAgdGhlIHNsb3RzIHRoZSByZWdzIGFyZSBpbi4KKyAgICAgIHN0ZDo6c3dhcChSZWdNYXBbUmVnTm9dLCBSZWdNYXBbUmVnT25Ub3BdKTsKKworICAgICAgLy8gU3dhcCBzdGFjayBzbG90IGNvbnRlbnRzLgorICAgICAgYXNzZXJ0KFJlZ01hcFtSZWdPblRvcF0gPCBTdGFja1RvcCk7CisgICAgICBzdGQ6OnN3YXAoU3RhY2tbUmVnTWFwW1JlZ09uVG9wXV0sIFN0YWNrW1N0YWNrVG9wLTFdKTsKKworICAgICAgLy8gRW1pdCBhbiBmeGNoIHRvIHVwZGF0ZSB0aGUgcnVudGltZSBwcm9jZXNzb3JzIHZlcnNpb24gb2YgdGhlIHN0YXRlLgorICAgICAgQnVpbGRNSSgqTUJCLCBJLCBkbCwgVElJLT5nZXQoWDg2OjpYQ0hfRikpLmFkZFJlZyhTVFJlZyk7CisgICAgICArK051bUZYQ0g7CisgICAgfQorCisgICAgdm9pZCBkdXBsaWNhdGVUb1RvcCh1bnNpZ25lZCBSZWdObywgdW5zaWduZWQgQXNSZWcsIE1hY2hpbmVJbnN0ciAqSSkgeworICAgICAgRGVidWdMb2MgZGwgPSBJID09IE1CQi0+ZW5kKCkgPyBEZWJ1Z0xvYygpIDogSS0+Z2V0RGVidWdMb2MoKTsKKyAgICAgIHVuc2lnbmVkIFNUUmVnID0gZ2V0U1RSZWcoUmVnTm8pOworICAgICAgcHVzaFJlZyhBc1JlZyk7ICAgLy8gTmV3IHJlZ2lzdGVyIG9uIHRvcCBvZiBzdGFjaworCisgICAgICBCdWlsZE1JKCpNQkIsIEksIGRsLCBUSUktPmdldChYODY6OkxEX0ZycikpLmFkZFJlZyhTVFJlZyk7CisgICAgfQorCisgICAgLy8vIHBvcFN0YWNrQWZ0ZXIgLSBQb3AgdGhlIGN1cnJlbnQgdmFsdWUgb2ZmIG9mIHRoZSB0b3Agb2YgdGhlIEZQIHN0YWNrCisgICAgLy8vIGFmdGVyIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgICAgdm9pZCBwb3BTdGFja0FmdGVyKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSk7CisKKyAgICAvLy8gZnJlZVN0YWNrU2xvdEFmdGVyIC0gRnJlZSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGZyb20gdGhlIHJlZ2lzdGVyCisgICAgLy8vIHN0YWNrLCBzbyB0aGF0IGl0IGlzIG5vIGxvbmdlciBpbiBhIHJlZ2lzdGVyLiAgSWYgdGhlIHJlZ2lzdGVyIGlzCisgICAgLy8vIGN1cnJlbnRseSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywgd2UganVzdCBwb3AgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24sCisgICAgLy8vIG90aGVyd2lzZSB3ZSBzdG9yZSB0aGUgY3VycmVudCB0b3Atb2Ytc3RhY2sgaW50byB0aGUgc3BlY2lmaWVkIHNsb3QsCisgICAgLy8vIHRoZW4gcG9wIHRoZSB0b3Agb2Ygc3RhY2suCisgICAgdm9pZCBmcmVlU3RhY2tTbG90QWZ0ZXIoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJLCB1bnNpZ25lZCBSZWcpOworCisgICAgLy8vIGZyZWVTdGFja1Nsb3RCZWZvcmUgLSBKdXN0IHRoZSBwb3AsIG5vIGZvbGRpbmcuIFJldHVybiB0aGUgaW5zZXJ0ZWQKKyAgICAvLy8gaW5zdHJ1Y3Rpb24uCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yCisgICAgZnJlZVN0YWNrU2xvdEJlZm9yZShNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgdW5zaWduZWQgRlBSZWdObyk7CisKKyAgICAvLy8gQWRqdXN0IHRoZSBsaXZlIHJlZ2lzdGVycyB0byBiZSB0aGUgc2V0IGluIE1hc2suCisgICAgdm9pZCBhZGp1c3RMaXZlUmVncyh1bnNpZ25lZCBNYXNrLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSk7CisKKyAgICAvLy8gU2h1ZmZsZSB0aGUgdG9wIEZpeENvdW50IHN0YWNrIGVudHJpZXMgc3VzY2ggdGhhdCBGUCByZWcgRml4U3RhY2tbMF0gaXMKKyAgICAvLy8gc3QoMCksIEZQIHJlZyBGaXhTdGFja1sxXSBpcyBzdCgxKSBldGMuCisgICAgdm9pZCBzaHVmZmxlU3RhY2tUb3AoY29uc3QgdW5zaWduZWQgY2hhciAqRml4U3RhY2ssIHVuc2lnbmVkIEZpeENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKTsKKworICAgIGJvb2wgcHJvY2Vzc0Jhc2ljQmxvY2soTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgICB2b2lkIGhhbmRsZVplcm9BcmdGUChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJkkpOworICAgIHZvaWQgaGFuZGxlT25lQXJnRlAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJKTsKKyAgICB2b2lkIGhhbmRsZU9uZUFyZ0ZQUlcoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJKTsKKyAgICB2b2lkIGhhbmRsZVR3b0FyZ0ZQKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSk7CisgICAgdm9pZCBoYW5kbGVDb21wYXJlRlAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJKTsKKyAgICB2b2lkIGhhbmRsZUNvbmRNb3ZGUChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJkkpOworICAgIHZvaWQgaGFuZGxlU3BlY2lhbEZQKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSk7CisKKyAgICBib29sIHRyYW5zbGF0ZUNvcHkoTWFjaGluZUluc3RyKik7CisgIH07CisgIGNoYXIgRlBTOjpJRCA9IDA7Cit9CisKK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlWDg2RmxvYXRpbmdQb2ludFN0YWNraWZpZXJQYXNzKCkgeyByZXR1cm4gbmV3IEZQUygpOyB9CisKKy8vLyBnZXRGUFJlZyAtIFJldHVybiB0aGUgWDg2OjpGUHggcmVnaXN0ZXIgbnVtYmVyIGZvciB0aGUgc3BlY2lmaWVkIG9wZXJhbmQuCisvLy8gRm9yIGV4YW1wbGUsIHRoaXMgcmV0dXJucyAzIGZvciBYODY6OkZQMy4KK3N0YXRpYyB1bnNpZ25lZCBnZXRGUFJlZyhjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIHsKKyAgYXNzZXJ0KE1PLmlzUmVnKCkgJiYgIkV4cGVjdGVkIGFuIEZQIHJlZ2lzdGVyISIpOworICB1bnNpZ25lZCBSZWcgPSBNTy5nZXRSZWcoKTsKKyAgYXNzZXJ0KFJlZyA+PSBYODY6OkZQMCAmJiBSZWcgPD0gWDg2OjpGUDYgJiYgIkV4cGVjdGVkIEZQIHJlZ2lzdGVyISIpOworICByZXR1cm4gUmVnIC0gWDg2OjpGUDA7Cit9CisKKy8vLyBydW5Pbk1hY2hpbmVGdW5jdGlvbiAtIExvb3Agb3ZlciBhbGwgb2YgdGhlIGJhc2ljIGJsb2NrcywgdHJhbnNmb3JtaW5nIEZQCisvLy8gcmVnaXN0ZXIgcmVmZXJlbmNlcyBpbnRvIEZQIHN0YWNrIHJlZmVyZW5jZXMuCisvLy8KK2Jvb2wgRlBTOjpydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIC8vIFdlIG9ubHkgbmVlZCB0byBydW4gdGhpcyBwYXNzIGlmIHRoZXJlIGFyZSBhbnkgRlAgcmVnaXN0ZXJzIHVzZWQgaW4gdGhpcworICAvLyBmdW5jdGlvbi4gIElmIGl0IGlzIGFsbCBpbnRlZ2VyLCB0aGVyZSBpcyBub3RoaW5nIGZvciB1cyB0byBkbyEKKyAgYm9vbCBGUElzVXNlZCA9IGZhbHNlOworCisgIGFzc2VydChYODY6OkZQNiA9PSBYODY6OkZQMCs2ICYmICJSZWdpc3RlciBlbnVtcyBhcmVuJ3Qgc29ydGVkIHJpZ2h0ISIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDw9IDY7ICsraSkKKyAgICBpZiAoTUYuZ2V0UmVnSW5mbygpLmlzUGh5c1JlZ1VzZWQoWDg2OjpGUDAraSkpIHsKKyAgICAgIEZQSXNVc2VkID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvLyBFYXJseSBleGl0LgorICBpZiAoIUZQSXNVc2VkKSByZXR1cm4gZmFsc2U7CisKKyAgVElJID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0SW5zdHJJbmZvKCk7CisKKyAgLy8gUHJlcGFyZSBjcm9zcy1NQkIgbGl2ZW5lc3MuCisgIGJ1bmRsZUNGRyhNRik7CisKKyAgU3RhY2tUb3AgPSAwOworCisgIC8vIFByb2Nlc3MgdGhlIGZ1bmN0aW9uIGluIGRlcHRoIGZpcnN0IG9yZGVyIHNvIHRoYXQgd2UgcHJvY2VzcyBhdCBsZWFzdCBvbmUKKyAgLy8gb2YgdGhlIHByZWRlY2Vzc29ycyBmb3IgZXZlcnkgcmVhY2hhYmxlIGJsb2NrIGluIHRoZSBmdW5jdGlvbi4KKyAgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLCA4PiBQcm9jZXNzZWQ7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpFbnRyeSA9IE1GLmJlZ2luKCk7CisKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGZvciAoZGZfZXh0X2l0ZXJhdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKiwgU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLCA4PiA+CisgICAgICAgICBJID0gZGZfZXh0X2JlZ2luKEVudHJ5LCBQcm9jZXNzZWQpLCBFID0gZGZfZXh0X2VuZChFbnRyeSwgUHJvY2Vzc2VkKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBDaGFuZ2VkIHw9IHByb2Nlc3NCYXNpY0Jsb2NrKE1GLCAqKkkpOworCisgIC8vIFByb2Nlc3MgYW55IHVucmVhY2hhYmxlIGJsb2NrcyBpbiBhcmJpdHJhcnkgb3JkZXIgbm93LgorICBpZiAoTUYuc2l6ZSgpICE9IFByb2Nlc3NlZC5zaXplKCkpCisgICAgZm9yIChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEJCID0gTUYuYmVnaW4oKSwgRSA9IE1GLmVuZCgpOyBCQiAhPSBFOyArK0JCKQorICAgICAgaWYgKFByb2Nlc3NlZC5pbnNlcnQoQkIpKQorICAgICAgICBDaGFuZ2VkIHw9IHByb2Nlc3NCYXNpY0Jsb2NrKE1GLCAqQkIpOworCisgIEJsb2NrQnVuZGxlLmNsZWFyKCk7CisgIExpdmVCdW5kbGVzLmNsZWFyKCk7CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBidW5kbGVDRkcgLSBTY2FuIGFsbCB0aGUgYmFzaWMgYmxvY2tzIHRvIGRldGVybWluZSBjb25zaXN0ZW50IGxpdmUtaW4gYW5kCisvLy8gbGl2ZS1vdXQgc2V0cyBmb3IgdGhlIEZQIHJlZ2lzdGVycy4gQ29uc2lzdGVudCBtZWFucyB0aGF0IHRoZSBzZXQgb2YKKy8vLyByZWdpc3RlcnMgbGl2ZS1vdXQgZnJvbSBhIGJsb2NrIGlzIGlkZW50aWNhbCB0byB0aGUgbGl2ZS1pbiBzZXQgb2YgYWxsCisvLy8gc3VjY2Vzc29ycy4gVGhpcyBpcyBub3QgZW5mb3JjZWQgYnkgdGhlIG5vcm1hbCBsaXZlLWluIGxpc3RzIHNpbmNlCisvLy8gcmVnaXN0ZXJzIG1heSBiZSBpbXBsaWNpdGx5IGRlZmluZWQsIG9yIG5vdCB1c2VkIGJ5IGFsbCBzdWNjZXNzb3JzLgordm9pZCBGUFM6OmJ1bmRsZUNGRyhNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIGFzc2VydChMaXZlQnVuZGxlcy5lbXB0eSgpICYmICJTdGFsZSBkYXRhIGluIExpdmVCdW5kbGVzIik7CisgIGFzc2VydChCbG9ja0J1bmRsZS5lbXB0eSgpICYmICJTdGFsZSBkYXRhIGluIEJsb2NrQnVuZGxlIik7CisgIFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwgOD4gUHJvcERvd24sIFByb3BVcDsKKworICAvLyBMaXZlQnVuZGxlWzBdIGlzIHRoZSBlbXB0eSBsaXZlLWluIHNldC4KKyAgTGl2ZUJ1bmRsZXMucmVzaXplKDEpOworCisgIC8vIEZpcnN0IGdhdGhlciB0aGUgYWN0dWFsIGxpdmUtaW4gbWFza3MgZm9yIGFsbCBNQkJzLgorICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IE1GLmJlZ2luKCksIEUgPSBNRi5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gSTsKKyAgICBjb25zdCB1bnNpZ25lZCBNYXNrID0gY2FsY0xpdmVJbk1hc2soTUJCKTsKKyAgICBpZiAoIU1hc2spCisgICAgICBjb250aW51ZTsKKyAgICAvLyBJbmdvaW5nIGJ1bmRsZSBpbmRleC4KKyAgICB1bnNpZ25lZCAmSWR4ID0gQmxvY2tCdW5kbGVbTUJCXS5maXJzdDsKKyAgICAvLyBBbHJlYWR5IGFzc2lnbmVkIGFuIGluZ29pbmcgYnVuZGxlPworICAgIGlmIChJZHgpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBBbGxvY2F0ZSBhIG5ldyBMaXZlQnVuZGxlIHN0cnVjdCBmb3IgdGhpcyBibG9jaydzIGxpdmUtaW5zLgorICAgIGNvbnN0IHVuc2lnbmVkIEJ1bmRsZUlkeCA9IElkeCA9IExpdmVCdW5kbGVzLnNpemUoKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkNyZWF0aW5nIExCIyIgPDwgQnVuZGxlSWR4IDw8ICI6IGluOkJCIyIKKyAgICAgICAgICAgICAgICAgPDwgTUJCLT5nZXROdW1iZXIoKSk7CisgICAgTGl2ZUJ1bmRsZXMucHVzaF9iYWNrKE1hc2spOworICAgIExpdmVCdW5kbGUgJkJ1bmRsZSA9IExpdmVCdW5kbGVzLmJhY2soKTsKKworICAgIC8vIE1ha2Ugc3VyZSBhbGwgcHJlZGVjZXNzb3JzIGhhdmUgdGhlIHNhbWUgbGl2ZS1vdXQgc2V0LgorICAgIFByb3BVcC5pbnNlcnQoTUJCKTsKKworICAgIC8vIEtlZXAgcHVzaGluZyBsaXZlbmVzcyB1cCBhbmQgZG93biB0aGUgQ0ZHIHVudGlsIGNvbnZlcmdlbmNlLgorICAgIC8vIE9ubHkgY3JpdGljYWwgZWRnZXMgY2F1c2UgaXRlcmF0aW9uIGhlcmUsIGJ1dCB3aGVuIHRoZXkgZG8sIG11bHRpcGxlCisgICAgLy8gYmxvY2tzIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgc2FtZSBMaXZlQnVuZGxlIGluZGV4LgorICAgIGRvIHsKKyAgICAgIC8vIEFzc2lnbiBCdW5kbGVJZHggYXMgbGl2ZW91dCBmcm9tIHByZWRlY2Vzc29ycyBpbiBQcm9wVXAuCisgICAgICBmb3IgKFNtYWxsUHRyU2V0PE1hY2hpbmVCYXNpY0Jsb2NrKiwgMTY+OjppdGVyYXRvciBJID0gUHJvcFVwLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBQcm9wVXAuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSAqSTsKKyAgICAgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfcHJlZF9pdGVyYXRvciBMaW5rSSA9IE1CQi0+cHJlZF9iZWdpbigpLAorICAgICAgICAgICAgIExpbmtFID0gTUJCLT5wcmVkX2VuZCgpOyBMaW5rSSAhPSBMaW5rRTsgKytMaW5rSSkgeworICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkTUJCID0gKkxpbmtJOworICAgICAgICAgIC8vIFByZWRNQkIncyBsaXZlb3V0IGJ1bmRsZSBzaG91bGQgYmUgc2V0IHRvIExJSWR4LgorICAgICAgICAgIHVuc2lnbmVkICZJZHggPSBCbG9ja0J1bmRsZVtQcmVkTUJCXS5zZWNvbmQ7CisgICAgICAgICAgaWYgKElkeCkgeworICAgICAgICAgICAgYXNzZXJ0KElkeCA9PSBCdW5kbGVJZHggJiYgIkluY29uc2lzdGVudCBDRkciKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBJZHggPSBCdW5kbGVJZHg7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgb3V0OkJCIyIgPDwgUHJlZE1CQi0+Z2V0TnVtYmVyKCkpOworICAgICAgICAgIC8vIFByb3BhZ2F0ZSB0byBzaWJsaW5ncy4KKyAgICAgICAgICBpZiAoUHJlZE1CQi0+c3VjY19zaXplKCkgPiAxKQorICAgICAgICAgICAgUHJvcERvd24uaW5zZXJ0KFByZWRNQkIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBQcm9wVXAuY2xlYXIoKTsKKworICAgICAgLy8gQXNzaWduIEJ1bmRsZUlkeCBhcyBsaXZlaW4gdG8gc3VjY2Vzc29ycyBpbiBQcm9wRG93bi4KKyAgICAgIGZvciAoU21hbGxQdHJTZXQ8TWFjaGluZUJhc2ljQmxvY2sqLCAxNj46Oml0ZXJhdG9yIEkgPSBQcm9wRG93bi5iZWdpbigpLAorICAgICAgICAgICBFID0gUHJvcERvd24uZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSAqSTsKKyAgICAgICAgZm9yIChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3Rfc3VjY19pdGVyYXRvciBMaW5rSSA9IE1CQi0+c3VjY19iZWdpbigpLAorICAgICAgICAgICAgIExpbmtFID0gTUJCLT5zdWNjX2VuZCgpOyBMaW5rSSAhPSBMaW5rRTsgKytMaW5rSSkgeworICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjTUJCID0gKkxpbmtJOworICAgICAgICAgIC8vIExpbmtNQkIncyBsaXZlaW4gYnVuZGxlIHNob3VsZCBiZSBzZXQgdG8gQnVuZGxlSWR4LgorICAgICAgICAgIHVuc2lnbmVkICZJZHggPSBCbG9ja0J1bmRsZVtTdWNjTUJCXS5maXJzdDsKKyAgICAgICAgICBpZiAoSWR4KSB7CisgICAgICAgICAgICBhc3NlcnQoSWR4ID09IEJ1bmRsZUlkeCAmJiAiSW5jb25zaXN0ZW50IENGRyIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIElkeCA9IEJ1bmRsZUlkeDsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiBpbjpCQiMiIDw8IFN1Y2NNQkItPmdldE51bWJlcigpKTsKKyAgICAgICAgICAvLyBQcm9wYWdhdGUgdG8gc2libGluZ3MuCisgICAgICAgICAgaWYgKFN1Y2NNQkItPnByZWRfc2l6ZSgpID4gMSkKKyAgICAgICAgICAgIFByb3BVcC5pbnNlcnQoU3VjY01CQik7CisgICAgICAgICAgLy8gQWxzbyBhY2N1bXVsYXRlIHRoZSBidW5kbGUgbGl2ZW5lc3MgbWFzayBmcm9tIHRoZSBsaXZlaW5zIGhlcmUuCisgICAgICAgICAgQnVuZGxlLk1hc2sgfD0gY2FsY0xpdmVJbk1hc2soU3VjY01CQik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFByb3BEb3duLmNsZWFyKCk7CisgICAgfSB3aGlsZSAoIVByb3BVcC5lbXB0eSgpKTsKKyAgICBERUJVRyh7CisgICAgICBkYmdzKCkgPDwgIiBsaXZlOiI7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgODsgKytpKQorICAgICAgICBpZiAoQnVuZGxlLk1hc2sgJiAoMTw8aSkpCisgICAgICAgICAgZGJncygpIDw8ICIgJUZQIiA8PCBpOworICAgICAgZGJncygpIDw8ICdcbic7CisgICAgfSk7CisgIH0KK30KKworLy8vIHByb2Nlc3NCYXNpY0Jsb2NrIC0gTG9vcCBvdmVyIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBiYXNpYyBibG9jaywKKy8vLyB0cmFuc2Zvcm1pbmcgRlAgaW5zdHJ1Y3Rpb25zIGludG8gdGhlaXIgc3RhY2sgZm9ybS4KKy8vLworYm9vbCBGUFM6OnByb2Nlc3NCYXNpY0Jsb2NrKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZCQikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgTUJCID0gJkJCOworCisgIHNldHVwQmxvY2tTdGFjaygpOworCisgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi5iZWdpbigpOyBJICE9IEJCLmVuZCgpOyArK0kpIHsKKyAgICBNYWNoaW5lSW5zdHIgKk1JID0gSTsKKyAgICB1aW50NjRfdCBGbGFncyA9IE1JLT5nZXREZXNjKCkuVFNGbGFnczsKKworICAgIHVuc2lnbmVkIEZQSW5zdENsYXNzID0gRmxhZ3MgJiBYODZJSTo6RlBUeXBlTWFzazsKKyAgICAKKyAgICBpZiAoTUktPmlzQ29weSgpICYmIHRyYW5zbGF0ZUNvcHkoTUkpKQorICAgICAgRlBJbnN0Q2xhc3MgPSBYODZJSTo6U3BlY2lhbEZQOworCisgICAgaWYgKEZQSW5zdENsYXNzID09IFg4NklJOjpOb3RGUCkKKyAgICAgIGNvbnRpbnVlOyAgLy8gRWZmaWNpZW50bHkgaWdub3JlIG5vbi1mcCBpbnN0cyEKKworICAgIE1hY2hpbmVJbnN0ciAqUHJldk1JID0gMDsKKyAgICBpZiAoSSAhPSBCQi5iZWdpbigpKQorICAgICAgUHJldk1JID0gcHJpb3IoSSk7CisKKyAgICArK051bUZQOyAgLy8gS2VlcCB0cmFjayBvZiAjIG9mIHBzZXVkbyBpbnN0cnMKKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuRlBJbnN0Olx0IiA8PCAqTUkpOworCisgICAgLy8gR2V0IGRlYWQgdmFyaWFibGVzIGxpc3Qgbm93IGJlY2F1c2UgdGhlIE1JIHBvaW50ZXIgbWF5IGJlIGRlbGV0ZWQgYXMgcGFydAorICAgIC8vIG9mIHByb2Nlc3NpbmchCisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IERlYWRSZWdzOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNEZWFkKCkpCisgICAgICAgIERlYWRSZWdzLnB1c2hfYmFjayhNTy5nZXRSZWcoKSk7CisgICAgfQorCisgICAgc3dpdGNoIChGUEluc3RDbGFzcykgeworICAgIGNhc2UgWDg2SUk6Olplcm9BcmdGUDogIGhhbmRsZVplcm9BcmdGUChJKTsgYnJlYWs7CisgICAgY2FzZSBYODZJSTo6T25lQXJnRlA6ICAgaGFuZGxlT25lQXJnRlAoSSk7ICBicmVhazsgIC8vIGZzdHAgU1QoMCkKKyAgICBjYXNlIFg4NklJOjpPbmVBcmdGUFJXOiBoYW5kbGVPbmVBcmdGUFJXKEkpOyBicmVhazsgLy8gU1QoMCkgPSBmc3FydChTVCgwKSkKKyAgICBjYXNlIFg4NklJOjpUd29BcmdGUDogICBoYW5kbGVUd29BcmdGUChJKTsgIGJyZWFrOworICAgIGNhc2UgWDg2SUk6OkNvbXBhcmVGUDogIGhhbmRsZUNvbXBhcmVGUChJKTsgYnJlYWs7CisgICAgY2FzZSBYODZJSTo6Q29uZE1vdkZQOiAgaGFuZGxlQ29uZE1vdkZQKEkpOyBicmVhazsKKyAgICBjYXNlIFg4NklJOjpTcGVjaWFsRlA6ICBoYW5kbGVTcGVjaWFsRlAoSSk7IGJyZWFrOworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gRlAgVHlwZSEiKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBieSB0aGlzIGluc3RydWN0aW9uIGFyZSBkZWFkCisgICAgLy8gYWZ0ZXIgZGVmaW5pdGlvbi4gIElmIHNvLCBwb3AgdGhlbS4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVhZFJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgdW5zaWduZWQgUmVnID0gRGVhZFJlZ3NbaV07CisgICAgICBpZiAoUmVnID49IFg4Njo6RlAwICYmIFJlZyA8PSBYODY6OkZQNikgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlZ2lzdGVyIEZQIyIgPDwgUmVnLVg4Njo6RlAwIDw8ICIgaXMgZGVhZCFcbiIpOworICAgICAgICBmcmVlU3RhY2tTbG90QWZ0ZXIoSSwgUmVnLVg4Njo6RlAwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcmludCBvdXQgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgZXhwYW5kZWQgdG8gaWYgLWRlYnVnCisgICAgREVCVUcoCisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUHJldkkoUHJldk1JKTsKKyAgICAgIGlmIChJID09IFByZXZJKSB7CisgICAgICAgIGRiZ3MoKSA8PCAiSnVzdCBkZWxldGVkIHBzZXVkbyBpbnN0cnVjdGlvblxuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBTdGFydCA9IEk7CisgICAgICAgIC8vIFJld2luZCB0byBmaXJzdCBpbnN0cnVjdGlvbiBuZXdseSBpbnNlcnRlZC4KKyAgICAgICAgd2hpbGUgKFN0YXJ0ICE9IEJCLmJlZ2luKCkgJiYgcHJpb3IoU3RhcnQpICE9IFByZXZJKSAtLVN0YXJ0OworICAgICAgICBkYmdzKCkgPDwgIkluc2VydGVkIGluc3RydWN0aW9uczpcblx0IjsKKyAgICAgICAgU3RhcnQtPnByaW50KGRiZ3MoKSwgJk1GLmdldFRhcmdldCgpKTsKKyAgICAgICAgd2hpbGUgKCsrU3RhcnQgIT0gbGx2bTo6bmV4dChJKSkge30KKyAgICAgIH0KKyAgICAgIGR1bXBTdGFjaygpOworICAgICk7CisKKyAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgfQorCisgIGZpbmlzaEJsb2NrU3RhY2soKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIHNldHVwQmxvY2tTdGFjayAtIFVzZSB0aGUgQmxvY2tCdW5kbGUgbWFwIHRvIHNldCB1cCBvdXIgbW9kZWwgb2YgdGhlIHN0YWNrCisvLy8gdG8gbWF0Y2ggcHJlZGVjZXNzb3JzJyBsaXZlIG91dCBzdGFjay4KK3ZvaWQgRlBTOjpzZXR1cEJsb2NrU3RhY2soKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiXG5TZXR0aW5nIHVwIGxpdmUtaW5zIGZvciBCQiMiIDw8IE1CQi0+Z2V0TnVtYmVyKCkKKyAgICAgICAgICAgICAgIDw8ICIgZGVyaXZlZCBmcm9tICIgPDwgTUJCLT5nZXROYW1lKCkgPDwgIi5cbiIpOworICBTdGFja1RvcCA9IDA7CisgIGNvbnN0IExpdmVCdW5kbGUgJkJ1bmRsZSA9IExpdmVCdW5kbGVzW0Jsb2NrQnVuZGxlLmxvb2t1cChNQkIpLmZpcnN0XTsKKworICBpZiAoIUJ1bmRsZS5NYXNrKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJCbG9jayBoYXMgbm8gRlAgbGl2ZS1pbnMuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBEZXB0aC1maXJzdCBpdGVyYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGFuIGFzc2lnbmVkIHN0YWNrLgorICBhc3NlcnQoQnVuZGxlLmlzRml4ZWQoKSAmJiAiUmVhY2hlZCBibG9jayBiZWZvcmUgYW55IHByZWRlY2Vzc29ycyIpOworCisgIC8vIFB1c2ggdGhlIGZpeGVkIGxpdmUtaW4gcmVnaXN0ZXJzLgorICBmb3IgKHVuc2lnbmVkIGkgPSBCdW5kbGUuRml4Q291bnQ7IGkgPiAwOyAtLWkpIHsKKyAgICBNQkItPmFkZExpdmVJbihYODY6OlNUMCtpLTEpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiTGl2ZS1pbiBzdCgiIDw8IChpLTEpIDw8ICIpOiAlRlAiCisgICAgICAgICAgICAgICAgIDw8IHVuc2lnbmVkKEJ1bmRsZS5GaXhTdGFja1tpLTFdKSA8PCAnXG4nKTsKKyAgICBwdXNoUmVnKEJ1bmRsZS5GaXhTdGFja1tpLTFdKTsKKyAgfQorCisgIC8vIEtpbGwgb2ZmIHVud2FudGVkIGxpdmUtaW5zLiBUaGlzIGNhbiBoYXBwZW4gd2l0aCBhIGNyaXRpY2FsIGVkZ2UuCisgIC8vIEZJWE1FOiBXZSBjb3VsZCBrZWVwIHRoZXNlIGxpdmUgcmVnaXN0ZXJzIGFyb3VuZCBhcyB6b21iaWVzLiBUaGV5IG1heSBuZWVkCisgIC8vIHRvIGJlIHJldml2ZWQgYXQgdGhlIGVuZCBvZiBhIHNob3J0IGJsb2NrLiBJdCBtaWdodCBzYXZlIGEgZmV3IGluc3Rycy4KKyAgYWRqdXN0TGl2ZVJlZ3MoY2FsY0xpdmVJbk1hc2soTUJCKSwgTUJCLT5iZWdpbigpKTsKKyAgREVCVUcoTUJCLT5kdW1wKCkpOworfQorCisvLy8gZmluaXNoQmxvY2tTdGFjayAtIFJldml2ZSBsaXZlLW91dHMgdGhhdCBhcmUgaW1wbGljaXRseSBkZWZpbmVkIG91dCBvZgorLy8vIE1CQi4gU2h1ZmZsZSBsaXZlIHJlZ2lzdGVycyB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgZml4ZWQgc3RhY2sgb2YgYW55CisvLy8gcHJlZGVjZXNzb3JzLCBhbmQgZW5zdXJlIHRoYXQgYWxsIHByZWRlY2Vzc29ycyBhcmUgZXhwZWN0aW5nIHRoZSBzYW1lCisvLy8gc3RhY2suCit2b2lkIEZQUzo6ZmluaXNoQmxvY2tTdGFjaygpIHsKKyAgLy8gVGhlIFJFVCBoYW5kbGluZyBiZWxvdyB0YWtlcyBjYXJlIG9mIHJldHVybiBibG9ja3MgZm9yIHVzLgorICBpZiAoTUJCLT5zdWNjX2VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIERFQlVHKGRiZ3MoKSA8PCAiU2V0dGluZyB1cCBsaXZlLW91dHMgZm9yIEJCIyIgPDwgTUJCLT5nZXROdW1iZXIoKQorICAgICAgICAgICAgICAgPDwgIiBkZXJpdmVkIGZyb20gIiA8PCBNQkItPmdldE5hbWUoKSA8PCAiLlxuIik7CisKKyAgdW5zaWduZWQgQnVuZGxlSWR4ID0gQmxvY2tCdW5kbGUubG9va3VwKE1CQikuc2Vjb25kOworICBMaXZlQnVuZGxlICZCdW5kbGUgPSBMaXZlQnVuZGxlc1tCdW5kbGVJZHhdOworCisgIC8vIFdlIG1heSBuZWVkIHRvIGtpbGwgYW5kIGRlZmluZSBzb21lIHJlZ2lzdGVycyB0byBtYXRjaCBzdWNjZXNzb3JzLgorICAvLyBGSVhNRTogVGhpcyBjYW4gcHJvYmFibHkgYmUgY29tYmluZWQgd2l0aCB0aGUgc2h1ZmZsZSBiZWxvdy4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFRlcm0gPSBNQkItPmdldEZpcnN0VGVybWluYXRvcigpOworICBhZGp1c3RMaXZlUmVncyhCdW5kbGUuTWFzaywgVGVybSk7CisKKyAgaWYgKCFCdW5kbGUuTWFzaykgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiTm8gbGl2ZS1vdXRzLlxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSGFzIHRoZSBzdGFjayBvcmRlciBiZWVuIGZpeGVkIHlldD8KKyAgREVCVUcoZGJncygpIDw8ICJMQiMiIDw8IEJ1bmRsZUlkeCA8PCAiOiAiKTsKKyAgaWYgKEJ1bmRsZS5pc0ZpeGVkKCkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlNodWZmbGluZyBzdGFjayB0byBtYXRjaC5cbiIpOworICAgIHNodWZmbGVTdGFja1RvcChCdW5kbGUuRml4U3RhY2ssIEJ1bmRsZS5GaXhDb3VudCwgVGVybSk7CisgIH0gZWxzZSB7CisgICAgLy8gTm90IGZpeGVkIHlldCwgd2UgZ2V0IHRvIGNob29zZS4KKyAgICBERUJVRyhkYmdzKCkgPDwgIkZpeGluZyBzdGFjayBvcmRlciBub3cuXG4iKTsKKyAgICBCdW5kbGUuRml4Q291bnQgPSBTdGFja1RvcDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgU3RhY2tUb3A7ICsraSkKKyAgICAgIEJ1bmRsZS5GaXhTdGFja1tpXSA9IGdldFN0YWNrRW50cnkoaSk7CisgIH0KK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRWZmaWNpZW50IExvb2t1cCBUYWJsZSBTdXBwb3J0CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgVGFibGVFbnRyeSB7CisgICAgdW5zaWduZWQgZnJvbTsKKyAgICB1bnNpZ25lZCB0bzsKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBUYWJsZUVudHJ5ICZURSkgY29uc3QgeyByZXR1cm4gZnJvbSA8IFRFLmZyb207IH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgVGFibGVFbnRyeSAmVEUsIHVuc2lnbmVkIFYpIHsKKyAgICAgIHJldHVybiBURS5mcm9tIDwgVjsKKyAgICB9CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KHVuc2lnbmVkIFYsIGNvbnN0IFRhYmxlRW50cnkgJlRFKSB7CisgICAgICByZXR1cm4gViA8IFRFLmZyb207CisgICAgfQorICB9OworfQorCisjaWZuZGVmIE5ERUJVRworc3RhdGljIGJvb2wgVGFibGVJc1NvcnRlZChjb25zdCBUYWJsZUVudHJ5ICpUYWJsZSwgdW5zaWduZWQgTnVtRW50cmllcykgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUVudHJpZXMtMTsgKytpKQorICAgIGlmICghKFRhYmxlW2ldIDwgVGFibGVbaSsxXSkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBMb29rdXAoY29uc3QgVGFibGVFbnRyeSAqVGFibGUsIHVuc2lnbmVkIE4sIHVuc2lnbmVkIE9wY29kZSkgeworICBjb25zdCBUYWJsZUVudHJ5ICpJID0gc3RkOjpsb3dlcl9ib3VuZChUYWJsZSwgVGFibGUrTiwgT3Bjb2RlKTsKKyAgaWYgKEkgIT0gVGFibGUrTiAmJiBJLT5mcm9tID09IE9wY29kZSkKKyAgICByZXR1cm4gSS0+dG87CisgIHJldHVybiAtMTsKK30KKworI2lmZGVmIE5ERUJVRworI2RlZmluZSBBU1NFUlRfU09SVEVEKFRBQkxFKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUX1NPUlRFRChUQUJMRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7IHN0YXRpYyBib29sIFRBQkxFIyNDaGVja2VkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFUQUJMRSMjQ2hlY2tlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhc3NlcnQoVGFibGVJc1NvcnRlZChUQUJMRSwgYXJyYXlfbGVuZ3Rob2YoVEFCTEUpKSAmJiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAiQWxsIGxvb2t1cCB0YWJsZXMgbXVzdCBiZSBzb3J0ZWQgZm9yIGVmZmljaWVudCBhY2Nlc3MhIik7ICBcCisgICAgICAgVEFCTEUjI0NoZWNrZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZW5kaWYKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJlZ2lzdGVyIEZpbGUgLT4gUmVnaXN0ZXIgU3RhY2sgTWFwcGluZyBNZXRob2RzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBPcGNvZGVUYWJsZSAtIFNvcnRlZCBtYXAgb2YgcmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zIHRvIHRoZWlyIHN0YWNrIHZlcnNpb24uCisvLyBUaGUgZmlyc3QgZWxlbWVudCBpcyBhbiByZWdpc3RlciBmaWxlIHBzZXVkbyBpbnN0cnVjdGlvbiwgdGhlIHNlY29uZCBpcyB0aGUKKy8vIGNvbmNyZXRlIFg4NiBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIHRoZSByZWdpc3RlciBzdGFjay4KKy8vCitzdGF0aWMgY29uc3QgVGFibGVFbnRyeSBPcGNvZGVUYWJsZVtdID0geworICB7IFg4Njo6QUJTX0ZwMzIgICAgICwgWDg2OjpBQlNfRiAgICAgfSwKKyAgeyBYODY6OkFCU19GcDY0ICAgICAsIFg4Njo6QUJTX0YgICAgIH0sCisgIHsgWDg2OjpBQlNfRnA4MCAgICAgLCBYODY6OkFCU19GICAgICB9LAorICB7IFg4Njo6QUREX0ZwMzJtICAgICwgWDg2OjpBRERfRjMybSAgfSwKKyAgeyBYODY6OkFERF9GcDY0bSAgICAsIFg4Njo6QUREX0Y2NG0gIH0sCisgIHsgWDg2OjpBRERfRnA2NG0zMiAgLCBYODY6OkFERF9GMzJtICB9LAorICB7IFg4Njo6QUREX0ZwODBtMzIgICwgWDg2OjpBRERfRjMybSAgfSwKKyAgeyBYODY6OkFERF9GcDgwbTY0ICAsIFg4Njo6QUREX0Y2NG0gIH0sCisgIHsgWDg2OjpBRERfRnBJMTZtMzIgLCBYODY6OkFERF9GSTE2bSB9LAorICB7IFg4Njo6QUREX0ZwSTE2bTY0ICwgWDg2OjpBRERfRkkxNm0gfSwKKyAgeyBYODY6OkFERF9GcEkxNm04MCAsIFg4Njo6QUREX0ZJMTZtIH0sCisgIHsgWDg2OjpBRERfRnBJMzJtMzIgLCBYODY6OkFERF9GSTMybSB9LAorICB7IFg4Njo6QUREX0ZwSTMybTY0ICwgWDg2OjpBRERfRkkzMm0gfSwKKyAgeyBYODY6OkFERF9GcEkzMm04MCAsIFg4Njo6QUREX0ZJMzJtIH0sCisgIHsgWDg2OjpDSFNfRnAzMiAgICAgLCBYODY6OkNIU19GICAgICB9LAorICB7IFg4Njo6Q0hTX0ZwNjQgICAgICwgWDg2OjpDSFNfRiAgICAgfSwKKyAgeyBYODY6OkNIU19GcDgwICAgICAsIFg4Njo6Q0hTX0YgICAgIH0sCisgIHsgWDg2OjpDTU9WQkVfRnAzMiAgLCBYODY6OkNNT1ZCRV9GICB9LAorICB7IFg4Njo6Q01PVkJFX0ZwNjQgICwgWDg2OjpDTU9WQkVfRiAgfSwKKyAgeyBYODY6OkNNT1ZCRV9GcDgwICAsIFg4Njo6Q01PVkJFX0YgIH0sCisgIHsgWDg2OjpDTU9WQl9GcDMyICAgLCBYODY6OkNNT1ZCX0YgICB9LAorICB7IFg4Njo6Q01PVkJfRnA2NCAgICwgWDg2OjpDTU9WQl9GICB9LAorICB7IFg4Njo6Q01PVkJfRnA4MCAgICwgWDg2OjpDTU9WQl9GICB9LAorICB7IFg4Njo6Q01PVkVfRnAzMiAgICwgWDg2OjpDTU9WRV9GICB9LAorICB7IFg4Njo6Q01PVkVfRnA2NCAgICwgWDg2OjpDTU9WRV9GICAgfSwKKyAgeyBYODY6OkNNT1ZFX0ZwODAgICAsIFg4Njo6Q01PVkVfRiAgIH0sCisgIHsgWDg2OjpDTU9WTkJFX0ZwMzIgLCBYODY6OkNNT1ZOQkVfRiB9LAorICB7IFg4Njo6Q01PVk5CRV9GcDY0ICwgWDg2OjpDTU9WTkJFX0YgfSwKKyAgeyBYODY6OkNNT1ZOQkVfRnA4MCAsIFg4Njo6Q01PVk5CRV9GIH0sCisgIHsgWDg2OjpDTU9WTkJfRnAzMiAgLCBYODY6OkNNT1ZOQl9GICB9LAorICB7IFg4Njo6Q01PVk5CX0ZwNjQgICwgWDg2OjpDTU9WTkJfRiAgfSwKKyAgeyBYODY6OkNNT1ZOQl9GcDgwICAsIFg4Njo6Q01PVk5CX0YgIH0sCisgIHsgWDg2OjpDTU9WTkVfRnAzMiAgLCBYODY6OkNNT1ZORV9GICB9LAorICB7IFg4Njo6Q01PVk5FX0ZwNjQgICwgWDg2OjpDTU9WTkVfRiAgfSwKKyAgeyBYODY6OkNNT1ZORV9GcDgwICAsIFg4Njo6Q01PVk5FX0YgIH0sCisgIHsgWDg2OjpDTU9WTlBfRnAzMiAgLCBYODY6OkNNT1ZOUF9GICB9LAorICB7IFg4Njo6Q01PVk5QX0ZwNjQgICwgWDg2OjpDTU9WTlBfRiAgfSwKKyAgeyBYODY6OkNNT1ZOUF9GcDgwICAsIFg4Njo6Q01PVk5QX0YgIH0sCisgIHsgWDg2OjpDTU9WUF9GcDMyICAgLCBYODY6OkNNT1ZQX0YgICB9LAorICB7IFg4Njo6Q01PVlBfRnA2NCAgICwgWDg2OjpDTU9WUF9GICAgfSwKKyAgeyBYODY6OkNNT1ZQX0ZwODAgICAsIFg4Njo6Q01PVlBfRiAgIH0sCisgIHsgWDg2OjpDT1NfRnAzMiAgICAgLCBYODY6OkNPU19GICAgICB9LAorICB7IFg4Njo6Q09TX0ZwNjQgICAgICwgWDg2OjpDT1NfRiAgICAgfSwKKyAgeyBYODY6OkNPU19GcDgwICAgICAsIFg4Njo6Q09TX0YgICAgIH0sCisgIHsgWDg2OjpESVZSX0ZwMzJtICAgLCBYODY6OkRJVlJfRjMybSB9LAorICB7IFg4Njo6RElWUl9GcDY0bSAgICwgWDg2OjpESVZSX0Y2NG0gfSwKKyAgeyBYODY6OkRJVlJfRnA2NG0zMiAsIFg4Njo6RElWUl9GMzJtIH0sCisgIHsgWDg2OjpESVZSX0ZwODBtMzIgLCBYODY6OkRJVlJfRjMybSB9LAorICB7IFg4Njo6RElWUl9GcDgwbTY0ICwgWDg2OjpESVZSX0Y2NG0gfSwKKyAgeyBYODY6OkRJVlJfRnBJMTZtMzIsIFg4Njo6RElWUl9GSTE2bX0sCisgIHsgWDg2OjpESVZSX0ZwSTE2bTY0LCBYODY6OkRJVlJfRkkxNm19LAorICB7IFg4Njo6RElWUl9GcEkxNm04MCwgWDg2OjpESVZSX0ZJMTZtfSwKKyAgeyBYODY6OkRJVlJfRnBJMzJtMzIsIFg4Njo6RElWUl9GSTMybX0sCisgIHsgWDg2OjpESVZSX0ZwSTMybTY0LCBYODY6OkRJVlJfRkkzMm19LAorICB7IFg4Njo6RElWUl9GcEkzMm04MCwgWDg2OjpESVZSX0ZJMzJtfSwKKyAgeyBYODY6OkRJVl9GcDMybSAgICAsIFg4Njo6RElWX0YzMm0gIH0sCisgIHsgWDg2OjpESVZfRnA2NG0gICAgLCBYODY6OkRJVl9GNjRtICB9LAorICB7IFg4Njo6RElWX0ZwNjRtMzIgICwgWDg2OjpESVZfRjMybSAgfSwKKyAgeyBYODY6OkRJVl9GcDgwbTMyICAsIFg4Njo6RElWX0YzMm0gIH0sCisgIHsgWDg2OjpESVZfRnA4MG02NCAgLCBYODY6OkRJVl9GNjRtICB9LAorICB7IFg4Njo6RElWX0ZwSTE2bTMyICwgWDg2OjpESVZfRkkxNm0gfSwKKyAgeyBYODY6OkRJVl9GcEkxNm02NCAsIFg4Njo6RElWX0ZJMTZtIH0sCisgIHsgWDg2OjpESVZfRnBJMTZtODAgLCBYODY6OkRJVl9GSTE2bSB9LAorICB7IFg4Njo6RElWX0ZwSTMybTMyICwgWDg2OjpESVZfRkkzMm0gfSwKKyAgeyBYODY6OkRJVl9GcEkzMm02NCAsIFg4Njo6RElWX0ZJMzJtIH0sCisgIHsgWDg2OjpESVZfRnBJMzJtODAgLCBYODY6OkRJVl9GSTMybSB9LAorICB7IFg4Njo6SUxEX0ZwMTZtMzIgICwgWDg2OjpJTERfRjE2bSAgfSwKKyAgeyBYODY6OklMRF9GcDE2bTY0ICAsIFg4Njo6SUxEX0YxNm0gIH0sCisgIHsgWDg2OjpJTERfRnAxNm04MCAgLCBYODY6OklMRF9GMTZtICB9LAorICB7IFg4Njo6SUxEX0ZwMzJtMzIgICwgWDg2OjpJTERfRjMybSAgfSwKKyAgeyBYODY6OklMRF9GcDMybTY0ICAsIFg4Njo6SUxEX0YzMm0gIH0sCisgIHsgWDg2OjpJTERfRnAzMm04MCAgLCBYODY6OklMRF9GMzJtICB9LAorICB7IFg4Njo6SUxEX0ZwNjRtMzIgICwgWDg2OjpJTERfRjY0bSAgfSwKKyAgeyBYODY6OklMRF9GcDY0bTY0ICAsIFg4Njo6SUxEX0Y2NG0gIH0sCisgIHsgWDg2OjpJTERfRnA2NG04MCAgLCBYODY6OklMRF9GNjRtICB9LAorICB7IFg4Njo6SVNUVF9GcDE2bTMyICwgWDg2OjpJU1RUX0ZQMTZtfSwKKyAgeyBYODY6OklTVFRfRnAxNm02NCAsIFg4Njo6SVNUVF9GUDE2bX0sCisgIHsgWDg2OjpJU1RUX0ZwMTZtODAgLCBYODY6OklTVFRfRlAxNm19LAorICB7IFg4Njo6SVNUVF9GcDMybTMyICwgWDg2OjpJU1RUX0ZQMzJtfSwKKyAgeyBYODY6OklTVFRfRnAzMm02NCAsIFg4Njo6SVNUVF9GUDMybX0sCisgIHsgWDg2OjpJU1RUX0ZwMzJtODAgLCBYODY6OklTVFRfRlAzMm19LAorICB7IFg4Njo6SVNUVF9GcDY0bTMyICwgWDg2OjpJU1RUX0ZQNjRtfSwKKyAgeyBYODY6OklTVFRfRnA2NG02NCAsIFg4Njo6SVNUVF9GUDY0bX0sCisgIHsgWDg2OjpJU1RUX0ZwNjRtODAgLCBYODY6OklTVFRfRlA2NG19LAorICB7IFg4Njo6SVNUX0ZwMTZtMzIgICwgWDg2OjpJU1RfRjE2bSAgfSwKKyAgeyBYODY6OklTVF9GcDE2bTY0ICAsIFg4Njo6SVNUX0YxNm0gIH0sCisgIHsgWDg2OjpJU1RfRnAxNm04MCAgLCBYODY6OklTVF9GMTZtICB9LAorICB7IFg4Njo6SVNUX0ZwMzJtMzIgICwgWDg2OjpJU1RfRjMybSAgfSwKKyAgeyBYODY6OklTVF9GcDMybTY0ICAsIFg4Njo6SVNUX0YzMm0gIH0sCisgIHsgWDg2OjpJU1RfRnAzMm04MCAgLCBYODY6OklTVF9GMzJtICB9LAorICB7IFg4Njo6SVNUX0ZwNjRtMzIgICwgWDg2OjpJU1RfRlA2NG0gfSwKKyAgeyBYODY6OklTVF9GcDY0bTY0ICAsIFg4Njo6SVNUX0ZQNjRtIH0sCisgIHsgWDg2OjpJU1RfRnA2NG04MCAgLCBYODY6OklTVF9GUDY0bSB9LAorICB7IFg4Njo6TERfRnAwMzIgICAgICwgWDg2OjpMRF9GMCAgICAgfSwKKyAgeyBYODY6OkxEX0ZwMDY0ICAgICAsIFg4Njo6TERfRjAgICAgIH0sCisgIHsgWDg2OjpMRF9GcDA4MCAgICAgLCBYODY6OkxEX0YwICAgICB9LAorICB7IFg4Njo6TERfRnAxMzIgICAgICwgWDg2OjpMRF9GMSAgICAgfSwKKyAgeyBYODY6OkxEX0ZwMTY0ICAgICAsIFg4Njo6TERfRjEgICAgIH0sCisgIHsgWDg2OjpMRF9GcDE4MCAgICAgLCBYODY6OkxEX0YxICAgICB9LAorICB7IFg4Njo6TERfRnAzMm0gICAgICwgWDg2OjpMRF9GMzJtICAgfSwKKyAgeyBYODY6OkxEX0ZwMzJtNjQgICAsIFg4Njo6TERfRjMybSAgIH0sCisgIHsgWDg2OjpMRF9GcDMybTgwICAgLCBYODY6OkxEX0YzMm0gICB9LAorICB7IFg4Njo6TERfRnA2NG0gICAgICwgWDg2OjpMRF9GNjRtICAgfSwKKyAgeyBYODY6OkxEX0ZwNjRtODAgICAsIFg4Njo6TERfRjY0bSAgIH0sCisgIHsgWDg2OjpMRF9GcDgwbSAgICAgLCBYODY6OkxEX0Y4MG0gICB9LAorICB7IFg4Njo6TVVMX0ZwMzJtICAgICwgWDg2OjpNVUxfRjMybSAgfSwKKyAgeyBYODY6Ok1VTF9GcDY0bSAgICAsIFg4Njo6TVVMX0Y2NG0gIH0sCisgIHsgWDg2OjpNVUxfRnA2NG0zMiAgLCBYODY6Ok1VTF9GMzJtICB9LAorICB7IFg4Njo6TVVMX0ZwODBtMzIgICwgWDg2OjpNVUxfRjMybSAgfSwKKyAgeyBYODY6Ok1VTF9GcDgwbTY0ICAsIFg4Njo6TVVMX0Y2NG0gIH0sCisgIHsgWDg2OjpNVUxfRnBJMTZtMzIgLCBYODY6Ok1VTF9GSTE2bSB9LAorICB7IFg4Njo6TVVMX0ZwSTE2bTY0ICwgWDg2OjpNVUxfRkkxNm0gfSwKKyAgeyBYODY6Ok1VTF9GcEkxNm04MCAsIFg4Njo6TVVMX0ZJMTZtIH0sCisgIHsgWDg2OjpNVUxfRnBJMzJtMzIgLCBYODY6Ok1VTF9GSTMybSB9LAorICB7IFg4Njo6TVVMX0ZwSTMybTY0ICwgWDg2OjpNVUxfRkkzMm0gfSwKKyAgeyBYODY6Ok1VTF9GcEkzMm04MCAsIFg4Njo6TVVMX0ZJMzJtIH0sCisgIHsgWDg2OjpTSU5fRnAzMiAgICAgLCBYODY6OlNJTl9GICAgICB9LAorICB7IFg4Njo6U0lOX0ZwNjQgICAgICwgWDg2OjpTSU5fRiAgICAgfSwKKyAgeyBYODY6OlNJTl9GcDgwICAgICAsIFg4Njo6U0lOX0YgICAgIH0sCisgIHsgWDg2OjpTUVJUX0ZwMzIgICAgLCBYODY6OlNRUlRfRiAgICB9LAorICB7IFg4Njo6U1FSVF9GcDY0ICAgICwgWDg2OjpTUVJUX0YgICAgfSwKKyAgeyBYODY6OlNRUlRfRnA4MCAgICAsIFg4Njo6U1FSVF9GICAgIH0sCisgIHsgWDg2OjpTVF9GcDMybSAgICAgLCBYODY6OlNUX0YzMm0gICB9LAorICB7IFg4Njo6U1RfRnA2NG0gICAgICwgWDg2OjpTVF9GNjRtICAgfSwKKyAgeyBYODY6OlNUX0ZwNjRtMzIgICAsIFg4Njo6U1RfRjMybSAgIH0sCisgIHsgWDg2OjpTVF9GcDgwbTMyICAgLCBYODY6OlNUX0YzMm0gICB9LAorICB7IFg4Njo6U1RfRnA4MG02NCAgICwgWDg2OjpTVF9GNjRtICAgfSwKKyAgeyBYODY6OlNUX0ZwUDgwbSAgICAsIFg4Njo6U1RfRlA4MG0gIH0sCisgIHsgWDg2OjpTVUJSX0ZwMzJtICAgLCBYODY6OlNVQlJfRjMybSB9LAorICB7IFg4Njo6U1VCUl9GcDY0bSAgICwgWDg2OjpTVUJSX0Y2NG0gfSwKKyAgeyBYODY6OlNVQlJfRnA2NG0zMiAsIFg4Njo6U1VCUl9GMzJtIH0sCisgIHsgWDg2OjpTVUJSX0ZwODBtMzIgLCBYODY6OlNVQlJfRjMybSB9LAorICB7IFg4Njo6U1VCUl9GcDgwbTY0ICwgWDg2OjpTVUJSX0Y2NG0gfSwKKyAgeyBYODY6OlNVQlJfRnBJMTZtMzIsIFg4Njo6U1VCUl9GSTE2bX0sCisgIHsgWDg2OjpTVUJSX0ZwSTE2bTY0LCBYODY6OlNVQlJfRkkxNm19LAorICB7IFg4Njo6U1VCUl9GcEkxNm04MCwgWDg2OjpTVUJSX0ZJMTZtfSwKKyAgeyBYODY6OlNVQlJfRnBJMzJtMzIsIFg4Njo6U1VCUl9GSTMybX0sCisgIHsgWDg2OjpTVUJSX0ZwSTMybTY0LCBYODY6OlNVQlJfRkkzMm19LAorICB7IFg4Njo6U1VCUl9GcEkzMm04MCwgWDg2OjpTVUJSX0ZJMzJtfSwKKyAgeyBYODY6OlNVQl9GcDMybSAgICAsIFg4Njo6U1VCX0YzMm0gIH0sCisgIHsgWDg2OjpTVUJfRnA2NG0gICAgLCBYODY6OlNVQl9GNjRtICB9LAorICB7IFg4Njo6U1VCX0ZwNjRtMzIgICwgWDg2OjpTVUJfRjMybSAgfSwKKyAgeyBYODY6OlNVQl9GcDgwbTMyICAsIFg4Njo6U1VCX0YzMm0gIH0sCisgIHsgWDg2OjpTVUJfRnA4MG02NCAgLCBYODY6OlNVQl9GNjRtICB9LAorICB7IFg4Njo6U1VCX0ZwSTE2bTMyICwgWDg2OjpTVUJfRkkxNm0gfSwKKyAgeyBYODY6OlNVQl9GcEkxNm02NCAsIFg4Njo6U1VCX0ZJMTZtIH0sCisgIHsgWDg2OjpTVUJfRnBJMTZtODAgLCBYODY6OlNVQl9GSTE2bSB9LAorICB7IFg4Njo6U1VCX0ZwSTMybTMyICwgWDg2OjpTVUJfRkkzMm0gfSwKKyAgeyBYODY6OlNVQl9GcEkzMm02NCAsIFg4Njo6U1VCX0ZJMzJtIH0sCisgIHsgWDg2OjpTVUJfRnBJMzJtODAgLCBYODY6OlNVQl9GSTMybSB9LAorICB7IFg4Njo6VFNUX0ZwMzIgICAgICwgWDg2OjpUU1RfRiAgICAgfSwKKyAgeyBYODY6OlRTVF9GcDY0ICAgICAsIFg4Njo6VFNUX0YgICAgIH0sCisgIHsgWDg2OjpUU1RfRnA4MCAgICAgLCBYODY6OlRTVF9GICAgICB9LAorICB7IFg4Njo6VUNPTV9GcElyMzIgICwgWDg2OjpVQ09NX0ZJciAgfSwKKyAgeyBYODY6OlVDT01fRnBJcjY0ICAsIFg4Njo6VUNPTV9GSXIgIH0sCisgIHsgWDg2OjpVQ09NX0ZwSXI4MCAgLCBYODY6OlVDT01fRklyICB9LAorICB7IFg4Njo6VUNPTV9GcHIzMiAgICwgWDg2OjpVQ09NX0ZyICAgfSwKKyAgeyBYODY6OlVDT01fRnByNjQgICAsIFg4Njo6VUNPTV9GciAgIH0sCisgIHsgWDg2OjpVQ09NX0ZwcjgwICAgLCBYODY6OlVDT01fRnIgICB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGdldENvbmNyZXRlT3Bjb2RlKHVuc2lnbmVkIE9wY29kZSkgeworICBBU1NFUlRfU09SVEVEKE9wY29kZVRhYmxlKTsKKyAgaW50IE9wYyA9IExvb2t1cChPcGNvZGVUYWJsZSwgYXJyYXlfbGVuZ3Rob2YoT3Bjb2RlVGFibGUpLCBPcGNvZGUpOworICBhc3NlcnQoT3BjICE9IC0xICYmICJGUCBTdGFjayBpbnN0cnVjdGlvbiBub3QgaW4gT3Bjb2RlVGFibGUhIik7CisgIHJldHVybiBPcGM7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBIZWxwZXIgTWV0aG9kcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUG9wVGFibGUgLSBTb3J0ZWQgbWFwIG9mIGluc3RydWN0aW9ucyB0byB0aGVpciBwb3BwaW5nIHZlcnNpb24uICBUaGUgZmlyc3QKKy8vIGVsZW1lbnQgaXMgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBzZWNvbmQgaXMgdGhlIHZlcnNpb24gd2hpY2ggcG9wcy4KKy8vCitzdGF0aWMgY29uc3QgVGFibGVFbnRyeSBQb3BUYWJsZVtdID0geworICB7IFg4Njo6QUREX0ZyU1QwICwgWDg2OjpBRERfRlByU1QwICB9LAorCisgIHsgWDg2OjpESVZSX0ZyU1QwLCBYODY6OkRJVlJfRlByU1QwIH0sCisgIHsgWDg2OjpESVZfRnJTVDAgLCBYODY6OkRJVl9GUHJTVDAgIH0sCisKKyAgeyBYODY6OklTVF9GMTZtICAsIFg4Njo6SVNUX0ZQMTZtICAgfSwKKyAgeyBYODY6OklTVF9GMzJtICAsIFg4Njo6SVNUX0ZQMzJtICAgfSwKKworICB7IFg4Njo6TVVMX0ZyU1QwICwgWDg2OjpNVUxfRlByU1QwICB9LAorCisgIHsgWDg2OjpTVF9GMzJtICAgLCBYODY6OlNUX0ZQMzJtICAgIH0sCisgIHsgWDg2OjpTVF9GNjRtICAgLCBYODY6OlNUX0ZQNjRtICAgIH0sCisgIHsgWDg2OjpTVF9GcnIgICAgLCBYODY6OlNUX0ZQcnIgICAgIH0sCisKKyAgeyBYODY6OlNVQlJfRnJTVDAsIFg4Njo6U1VCUl9GUHJTVDAgfSwKKyAgeyBYODY6OlNVQl9GclNUMCAsIFg4Njo6U1VCX0ZQclNUMCAgfSwKKworICB7IFg4Njo6VUNPTV9GSXIgICwgWDg2OjpVQ09NX0ZJUHIgICB9LAorCisgIHsgWDg2OjpVQ09NX0ZQciAgLCBYODY6OlVDT01fRlBQciAgIH0sCisgIHsgWDg2OjpVQ09NX0ZyICAgLCBYODY6OlVDT01fRlByICAgIH0sCit9OworCisvLy8gcG9wU3RhY2tBZnRlciAtIFBvcCB0aGUgY3VycmVudCB2YWx1ZSBvZmYgb2YgdGhlIHRvcCBvZiB0aGUgRlAgc3RhY2sgYWZ0ZXIKKy8vLyB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLiAgVGhpcyBhdHRlbXB0cyB0byBiZSBzbmVha3kgYW5kIGNvbWJpbmUgdGhlIHBvcAorLy8vIGludG8gdGhlIGluc3RydWN0aW9uIGl0c2VsZiBpZiBwb3NzaWJsZS4gIFRoZSBpdGVyYXRvciBpcyBsZWZ0IHBvaW50aW5nIHRvCisvLy8gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sIGJlIGl0IGEgbmV3IHBvcCBpbnN0cnVjdGlvbiBpbnNlcnRlZCwgb3IgdGhlIG9sZAorLy8vIGluc3RydWN0aW9uIGlmIGl0IHdhcyBtb2RpZmllZCBpbiBwbGFjZS4KKy8vLwordm9pZCBGUFM6OnBvcFN0YWNrQWZ0ZXIoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJKSB7CisgIE1hY2hpbmVJbnN0ciogTUkgPSBJOworICBEZWJ1Z0xvYyBkbCA9IE1JLT5nZXREZWJ1Z0xvYygpOworICBBU1NFUlRfU09SVEVEKFBvcFRhYmxlKTsKKyAgYXNzZXJ0KFN0YWNrVG9wID4gMCAmJiAiQ2Fubm90IHBvcCBlbXB0eSBzdGFjayEiKTsKKyAgUmVnTWFwW1N0YWNrWy0tU3RhY2tUb3BdXSA9IH4wOyAgICAgLy8gVXBkYXRlIHN0YXRlCisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgcG9wcGluZyB2ZXJzaW9uIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uLi4KKyAgaW50IE9wY29kZSA9IExvb2t1cChQb3BUYWJsZSwgYXJyYXlfbGVuZ3Rob2YoUG9wVGFibGUpLCBJLT5nZXRPcGNvZGUoKSk7CisgIGlmIChPcGNvZGUgIT0gLTEpIHsKKyAgICBJLT5zZXREZXNjKFRJSS0+Z2V0KE9wY29kZSkpOworICAgIGlmIChPcGNvZGUgPT0gWDg2OjpVQ09NX0ZQUHIpCisgICAgICBJLT5SZW1vdmVPcGVyYW5kKDApOworICB9IGVsc2UgeyAgICAvLyBJbnNlcnQgYW4gZXhwbGljaXQgcG9wCisgICAgSSA9IEJ1aWxkTUkoKk1CQiwgKytJLCBkbCwgVElJLT5nZXQoWDg2OjpTVF9GUHJyKSkuYWRkUmVnKFg4Njo6U1QwKTsKKyAgfQorfQorCisvLy8gZnJlZVN0YWNrU2xvdEFmdGVyIC0gRnJlZSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGZyb20gdGhlIHJlZ2lzdGVyIHN0YWNrLCBzbworLy8vIHRoYXQgaXQgaXMgbm8gbG9uZ2VyIGluIGEgcmVnaXN0ZXIuICBJZiB0aGUgcmVnaXN0ZXIgaXMgY3VycmVudGx5IGF0IHRoZSB0b3AKKy8vLyBvZiB0aGUgc3RhY2ssIHdlIGp1c3QgcG9wIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLCBvdGhlcndpc2Ugd2Ugc3RvcmUgdGhlCisvLy8gY3VycmVudCB0b3Atb2Ytc3RhY2sgaW50byB0aGUgc3BlY2lmaWVkIHNsb3QsIHRoZW4gcG9wIHRoZSB0b3Agb2Ygc3RhY2suCit2b2lkIEZQUzo6ZnJlZVN0YWNrU2xvdEFmdGVyKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSwgdW5zaWduZWQgRlBSZWdObykgeworICBpZiAoZ2V0U3RhY2tFbnRyeSgwKSA9PSBGUFJlZ05vKSB7ICAvLyBhbHJlYWR5IGF0IHRoZSB0b3Agb2Ygc3RhY2s/IGVhc3kuCisgICAgcG9wU3RhY2tBZnRlcihJKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBPdGhlcndpc2UsIHN0b3JlIHRoZSB0b3Agb2Ygc3RhY2sgaW50byB0aGUgZGVhZCBzbG90LCBraWxsaW5nIHRoZSBvcGVyYW5kCisgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIGFkZCBpbiBhbiBleHBsaWNpdCB4Y2hnIHRoZW4gcG9wLgorICAvLworICBJID0gZnJlZVN0YWNrU2xvdEJlZm9yZSgrK0ksIEZQUmVnTm8pOworfQorCisvLy8gZnJlZVN0YWNrU2xvdEJlZm9yZSAtIEZyZWUgdGhlIHNwZWNpZmllZCByZWdpc3RlciB3aXRob3V0IHRyeWluZyBhbnkKKy8vLyBmb2xkaW5nLgorTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yCitGUFM6OmZyZWVTdGFja1Nsb3RCZWZvcmUoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIHVuc2lnbmVkIEZQUmVnTm8pIHsKKyAgdW5zaWduZWQgU1RSZWcgICAgPSBnZXRTVFJlZyhGUFJlZ05vKTsKKyAgdW5zaWduZWQgT2xkU2xvdCAgPSBnZXRTbG90KEZQUmVnTm8pOworICB1bnNpZ25lZCBUb3BSZWcgICA9IFN0YWNrW1N0YWNrVG9wLTFdOworICBTdGFja1tPbGRTbG90XSAgICA9IFRvcFJlZzsKKyAgUmVnTWFwW1RvcFJlZ10gICAgPSBPbGRTbG90OworICBSZWdNYXBbRlBSZWdOb10gICA9IH4wOworICBTdGFja1stLVN0YWNrVG9wXSA9IH4wOworICByZXR1cm4gQnVpbGRNSSgqTUJCLCBJLCBEZWJ1Z0xvYygpLCBUSUktPmdldChYODY6OlNUX0ZQcnIpKS5hZGRSZWcoU1RSZWcpOworfQorCisvLy8gYWRqdXN0TGl2ZVJlZ3MgLSBLaWxsIGFuZCByZXZpdmUgcmVnaXN0ZXJzIHN1Y2ggdGhhdCBleGFjdGx5IHRoZSBGUAorLy8vIHJlZ2lzdGVycyB3aXRoIGEgYml0IGluIE1hc2sgYXJlIGxpdmUuCit2b2lkIEZQUzo6YWRqdXN0TGl2ZVJlZ3ModW5zaWduZWQgTWFzaywgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsKKyAgdW5zaWduZWQgRGVmcyA9IE1hc2s7CisgIHVuc2lnbmVkIEtpbGxzID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFN0YWNrVG9wOyArK2kpIHsKKyAgICB1bnNpZ25lZCBSZWdObyA9IFN0YWNrW2ldOworICAgIGlmICghKERlZnMgJiAoMSA8PCBSZWdObykpKQorICAgICAgLy8gVGhpcyByZWdpc3RlciBpcyBsaXZlLCBidXQgd2UgZG9uJ3Qgd2FudCBpdC4KKyAgICAgIEtpbGxzIHw9ICgxIDw8IFJlZ05vKTsKKyAgICBlbHNlCisgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGltcC1kZWYgdGhpcyBsaXZlIHJlZ2lzdGVyLgorICAgICAgRGVmcyAmPSB+KDEgPDwgUmVnTm8pOworICB9CisgIGFzc2VydCgoS2lsbHMgJiBEZWZzKSA9PSAwICYmICJSZWdpc3RlciBuZWVkcyBraWxsaW5nIGFuZCBkZWYnaW5nPyIpOworCisgIC8vIFByb2R1Y2UgaW1wbGljaXQtZGVmcyBmb3IgZnJlZSBieSB1c2luZyBraWxsZWQgcmVnaXN0ZXJzLgorICB3aGlsZSAoS2lsbHMgJiYgRGVmcykgeworICAgIHVuc2lnbmVkIEtSZWcgPSBDb3VudFRyYWlsaW5nWmVyb3NfMzIoS2lsbHMpOworICAgIHVuc2lnbmVkIERSZWcgPSBDb3VudFRyYWlsaW5nWmVyb3NfMzIoRGVmcyk7CisgICAgREVCVUcoZGJncygpIDw8ICJSZW5hbWluZyAlRlAiIDw8IEtSZWcgPDwgIiBhcyBpbXAgJUZQIiA8PCBEUmVnIDw8ICJcbiIpOworICAgIHN0ZDo6c3dhcChTdGFja1tnZXRTbG90KEtSZWcpXSwgU3RhY2tbZ2V0U2xvdChEUmVnKV0pOworICAgIHN0ZDo6c3dhcChSZWdNYXBbS1JlZ10sIFJlZ01hcFtEUmVnXSk7CisgICAgS2lsbHMgJj0gfigxIDw8IEtSZWcpOworICAgIERlZnMgJj0gfigxIDw8IERSZWcpOworICB9CisKKyAgLy8gS2lsbCByZWdpc3RlcnMgYnkgcG9wcGluZy4KKyAgaWYgKEtpbGxzICYmIEkgIT0gTUJCLT5iZWdpbigpKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkyID0gbGx2bTo6cHJpb3IoSSk7CisgICAgZm9yICg7OykgeworICAgICAgdW5zaWduZWQgS1JlZyA9IGdldFN0YWNrRW50cnkoMCk7CisgICAgICBpZiAoIShLaWxscyAmICgxIDw8IEtSZWcpKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlBvcHBpbmcgJUZQIiA8PCBLUmVnIDw8ICJcbiIpOworICAgICAgcG9wU3RhY2tBZnRlcihJMik7CisgICAgICBLaWxscyAmPSB+KDEgPDwgS1JlZyk7CisgICAgfQorICB9CisKKyAgLy8gTWFudWFsbHkga2lsbCB0aGUgcmVzdC4KKyAgd2hpbGUgKEtpbGxzKSB7CisgICAgdW5zaWduZWQgS1JlZyA9IENvdW50VHJhaWxpbmdaZXJvc18zMihLaWxscyk7CisgICAgREVCVUcoZGJncygpIDw8ICJLaWxsaW5nICVGUCIgPDwgS1JlZyA8PCAiXG4iKTsKKyAgICBmcmVlU3RhY2tTbG90QmVmb3JlKEksIEtSZWcpOworICAgIEtpbGxzICY9IH4oMSA8PCBLUmVnKTsKKyAgfQorCisgIC8vIExvYWQgemVyb3MgZm9yIGFsbCB0aGUgaW1wLWRlZnMuCisgIHdoaWxlKERlZnMpIHsKKyAgICB1bnNpZ25lZCBEUmVnID0gQ291bnRUcmFpbGluZ1plcm9zXzMyKERlZnMpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiRGVmaW5pbmcgJUZQIiA8PCBEUmVnIDw8ICIgYXMgMFxuIik7CisgICAgQnVpbGRNSSgqTUJCLCBJLCBEZWJ1Z0xvYygpLCBUSUktPmdldChYODY6OkxEX0YwKSk7CisgICAgcHVzaFJlZyhEUmVnKTsKKyAgICBEZWZzICY9IH4oMSA8PCBEUmVnKTsKKyAgfQorCisgIC8vIE5vdyB3ZSBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCByZWdpc3RlcnMgbGl2ZS4KKyAgREVCVUcoZHVtcFN0YWNrKCkpOworICBhc3NlcnQoU3RhY2tUb3AgPT0gQ291bnRQb3B1bGF0aW9uXzMyKE1hc2spICYmICJMaXZlIGNvdW50IG1pc21hdGNoIik7Cit9CisKKy8vLyBzaHVmZmxlU3RhY2tUb3AgLSBlbWl0IGZ4Y2ggaW5zdHJ1Y3Rpb25zIGJlZm9yZSBJIHRvIHNodWZmbGUgdGhlIHRvcAorLy8vIEZpeENvdW50IGVudHJpZXMgaW50byB0aGUgb3JkZXIgZ2l2ZW4gYnkgRml4U3RhY2suCisvLy8gRklYTUU6IElzIHRoZXJlIGEgYmV0dGVyIGFsZ29yaXRobSB0aGFuIGluc2VydGlvbiBzb3J0Pwordm9pZCBGUFM6OnNodWZmbGVTdGFja1RvcChjb25zdCB1bnNpZ25lZCBjaGFyICpGaXhTdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRml4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSB7CisgIC8vIE1vdmUgaXRlbXMgaW50byBwbGFjZSwgc3RhcnRpbmcgZnJvbSB0aGUgZGVzaXJlZCBzdGFjayBib3R0b20uCisgIHdoaWxlIChGaXhDb3VudC0tKSB7CisgICAgLy8gT2xkIHJlZ2lzdGVyIGF0IHBvc2l0aW9uIEZpeENvdW50LgorICAgIHVuc2lnbmVkIE9sZFJlZyA9IGdldFN0YWNrRW50cnkoRml4Q291bnQpOworICAgIC8vIERlc2lyZWQgcmVnaXN0ZXIgYXQgcG9zaXRpb24gRml4Q291bnQuCisgICAgdW5zaWduZWQgUmVnID0gRml4U3RhY2tbRml4Q291bnRdOworICAgIGlmIChSZWcgPT0gT2xkUmVnKQorICAgICAgY29udGludWU7CisgICAgLy8gKFJlZyBzdDApIChPbGRSZWcgc3QwKSA9IChSZWcgT2xkUmVnIHN0MCkKKyAgICBtb3ZlVG9Ub3AoUmVnLCBJKTsKKyAgICBtb3ZlVG9Ub3AoT2xkUmVnLCBJKTsKKyAgfQorICBERUJVRyhkdW1wU3RhY2soKSk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIHRyYW5zZm9ybWF0aW9uIGltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gaGFuZGxlWmVyb0FyZ0ZQIC0gU1QoMCkgPSBmbGQwICAgIFNUKDApID0gZmxkcyA8bWVtPgorLy8vCit2b2lkIEZQUzo6aGFuZGxlWmVyb0FyZ0ZQKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gSTsKKyAgdW5zaWduZWQgRGVzdFJlZyA9IGdldEZQUmVnKE1JLT5nZXRPcGVyYW5kKDApKTsKKworICAvLyBDaGFuZ2UgZnJvbSB0aGUgcHNldWRvIGluc3RydWN0aW9uIHRvIHRoZSBjb25jcmV0ZSBpbnN0cnVjdGlvbi4KKyAgTUktPlJlbW92ZU9wZXJhbmQoMCk7ICAgLy8gUmVtb3ZlIHRoZSBleHBsaWNpdCBTVCgwKSBvcGVyYW5kCisgIE1JLT5zZXREZXNjKFRJSS0+Z2V0KGdldENvbmNyZXRlT3Bjb2RlKE1JLT5nZXRPcGNvZGUoKSkpKTsKKyAgCisgIC8vIFJlc3VsdCBnZXRzIHB1c2hlZCBvbiB0aGUgc3RhY2suCisgIHB1c2hSZWcoRGVzdFJlZyk7Cit9CisKKy8vLyBoYW5kbGVPbmVBcmdGUCAtIGZzdCA8bWVtPiwgU1QoMCkKKy8vLwordm9pZCBGUFM6OmhhbmRsZU9uZUFyZ0ZQKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gSTsKKyAgdW5zaWduZWQgTnVtT3BzID0gTUktPmdldERlc2MoKS5nZXROdW1PcGVyYW5kcygpOworICBhc3NlcnQoKE51bU9wcyA9PSBYODY6OkFkZHJOdW1PcGVyYW5kcyArIDEgfHwgTnVtT3BzID09IDEpICYmCisgICAgICAgICAiQ2FuIG9ubHkgaGFuZGxlIGZzdCogJiBmdHN0IGluc3RydWN0aW9ucyEiKTsKKworICAvLyBJcyB0aGlzIHRoZSBsYXN0IHVzZSBvZiB0aGUgc291cmNlIHJlZ2lzdGVyPworICB1bnNpZ25lZCBSZWcgPSBnZXRGUFJlZyhNSS0+Z2V0T3BlcmFuZChOdW1PcHMtMSkpOworICBib29sIEtpbGxzU3JjID0gTUktPmtpbGxzUmVnaXN0ZXIoWDg2OjpGUDArUmVnKTsKKworICAvLyBGSVNUUDY0bSBpcyBzdHJhbmdlIGJlY2F1c2UgdGhlcmUgaXNuJ3QgYSBub24tcG9wcGluZyB2ZXJzaW9ucy4KKyAgLy8gSWYgd2UgaGF2ZSBvbmUgX2FuZF8gd2UgZG9uJ3Qgd2FudCB0byBwb3AgdGhlIG9wZXJhbmQsIGR1cGxpY2F0ZSB0aGUgdmFsdWUKKyAgLy8gb24gdGhlIHN0YWNrIGluc3RlYWQgb2YgbW92aW5nIGl0LiAgVGhpcyBlbnN1cmUgdGhhdCBwb3BwaW5nIHRoZSB2YWx1ZSBpcworICAvLyBhbHdheXMgb2suCisgIC8vIERpdHRvIEZJU1RUUDE2bSwgRklTVFRQMzJtLCBGSVNUVFA2NG0sIFNUX0ZwUDgwbS4KKyAgLy8KKyAgaWYgKCFLaWxsc1NyYyAmJgorICAgICAgKE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OklTVF9GcDY0bTMyIHx8CisgICAgICAgTUktPmdldE9wY29kZSgpID09IFg4Njo6SVNUVF9GcDE2bTMyIHx8CisgICAgICAgTUktPmdldE9wY29kZSgpID09IFg4Njo6SVNUVF9GcDMybTMyIHx8CisgICAgICAgTUktPmdldE9wY29kZSgpID09IFg4Njo6SVNUVF9GcDY0bTMyIHx8CisgICAgICAgTUktPmdldE9wY29kZSgpID09IFg4Njo6SVNUX0ZwNjRtNjQgfHwKKyAgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gWDg2OjpJU1RUX0ZwMTZtNjQgfHwKKyAgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gWDg2OjpJU1RUX0ZwMzJtNjQgfHwKKyAgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gWDg2OjpJU1RUX0ZwNjRtNjQgfHwKKyAgICAgICBNSS0+Z2V0T3Bjb2RlKCkgPT0gWDg2OjpJU1RfRnA2NG04MCB8fAorICAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OklTVFRfRnAxNm04MCB8fAorICAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OklTVFRfRnAzMm04MCB8fAorICAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OklTVFRfRnA2NG04MCB8fAorICAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OlNUX0ZwUDgwbSkpIHsKKyAgICBkdXBsaWNhdGVUb1RvcChSZWcsIGdldFNjcmF0Y2hSZWcoKSwgSSk7CisgIH0gZWxzZSB7CisgICAgbW92ZVRvVG9wKFJlZywgSSk7ICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4uLgorICB9CisgIAorICAvLyBDb252ZXJ0IGZyb20gdGhlIHBzZXVkbyBpbnN0cnVjdGlvbiB0byB0aGUgY29uY3JldGUgaW5zdHJ1Y3Rpb24uCisgIE1JLT5SZW1vdmVPcGVyYW5kKE51bU9wcy0xKTsgICAgLy8gUmVtb3ZlIGV4cGxpY2l0IFNUKDApIG9wZXJhbmQKKyAgTUktPnNldERlc2MoVElJLT5nZXQoZ2V0Q29uY3JldGVPcGNvZGUoTUktPmdldE9wY29kZSgpKSkpOworCisgIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gWDg2OjpJU1RfRlA2NG0gfHwKKyAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OklTVFRfRlAxNm0gfHwKKyAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OklTVFRfRlAzMm0gfHwKKyAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OklTVFRfRlA2NG0gfHwKKyAgICAgIE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OlNUX0ZQODBtKSB7CisgICAgYXNzZXJ0KFN0YWNrVG9wID4gMCAmJiAiU3RhY2sgZW1wdHk/PyIpOworICAgIC0tU3RhY2tUb3A7CisgIH0gZWxzZSBpZiAoS2lsbHNTcmMpIHsgLy8gTGFzdCB1c2Ugb2Ygb3BlcmFuZD8KKyAgICBwb3BTdGFja0FmdGVyKEkpOworICB9Cit9CisKKworLy8vIGhhbmRsZU9uZUFyZ0ZQUlc6IEhhbmRsZSBpbnN0cnVjdGlvbnMgdGhhdCByZWFkIGZyb20gdGhlIHRvcCBvZiBzdGFjayBhbmQKKy8vLyByZXBsYWNlIHRoZSB2YWx1ZSB3aXRoIGEgbmV3bHkgY29tcHV0ZWQgdmFsdWUuICBUaGVzZSBpbnN0cnVjdGlvbnMgbWF5IGhhdmUKKy8vLyBub24tZnAgb3BlcmFuZHMgYWZ0ZXIgdGhlaXIgRlAgb3BlcmFuZHMuCisvLy8KKy8vLyAgRXhhbXBsZXM6CisvLy8gICAgIFIxID0gZmNocyBSMgorLy8vICAgICBSMSA9IGZhZGQgUjIsIFttZW1dCisvLy8KK3ZvaWQgRlBTOjpoYW5kbGVPbmVBcmdGUFJXKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gSTsKKyNpZm5kZWYgTkRFQlVHCisgIHVuc2lnbmVkIE51bU9wcyA9IE1JLT5nZXREZXNjKCkuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgYXNzZXJ0KE51bU9wcyA+PSAyICYmICJGUFJXIGluc3RydWN0aW9ucyBtdXN0IGhhdmUgMiBvcHMhISIpOworI2VuZGlmCisKKyAgLy8gSXMgdGhpcyB0aGUgbGFzdCB1c2Ugb2YgdGhlIHNvdXJjZSByZWdpc3Rlcj8KKyAgdW5zaWduZWQgUmVnID0gZ2V0RlBSZWcoTUktPmdldE9wZXJhbmQoMSkpOworICBib29sIEtpbGxzU3JjID0gTUktPmtpbGxzUmVnaXN0ZXIoWDg2OjpGUDArUmVnKTsKKworICBpZiAoS2lsbHNTcmMpIHsKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IHVzZSBvZiB0aGUgc291cmNlIHJlZ2lzdGVyLCBqdXN0IG1ha2Ugc3VyZSBpdCdzIG9uCisgICAgLy8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCisgICAgbW92ZVRvVG9wKFJlZywgSSk7CisgICAgYXNzZXJ0KFN0YWNrVG9wID4gMCAmJiAiU3RhY2sgY2Fubm90IGJlIGVtcHR5ISIpOworICAgIC0tU3RhY2tUb3A7CisgICAgcHVzaFJlZyhnZXRGUFJlZyhNSS0+Z2V0T3BlcmFuZCgwKSkpOworICB9IGVsc2UgeworICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IHVzZSBvZiB0aGUgc291cmNlIHJlZ2lzdGVyLCBfY29weV8gaXQgdG8gdGhlIHRvcAorICAgIC8vIG9mIHRoZSBzdGFjay4KKyAgICBkdXBsaWNhdGVUb1RvcChSZWcsIGdldEZQUmVnKE1JLT5nZXRPcGVyYW5kKDApKSwgSSk7CisgIH0KKworICAvLyBDaGFuZ2UgZnJvbSB0aGUgcHNldWRvIGluc3RydWN0aW9uIHRvIHRoZSBjb25jcmV0ZSBpbnN0cnVjdGlvbi4KKyAgTUktPlJlbW92ZU9wZXJhbmQoMSk7ICAgLy8gRHJvcCB0aGUgc291cmNlIG9wZXJhbmQuCisgIE1JLT5SZW1vdmVPcGVyYW5kKDApOyAgIC8vIERyb3AgdGhlIGRlc3RpbmF0aW9uIG9wZXJhbmQuCisgIE1JLT5zZXREZXNjKFRJSS0+Z2V0KGdldENvbmNyZXRlT3Bjb2RlKE1JLT5nZXRPcGNvZGUoKSkpKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRGVmaW5lIHRhYmxlcyBvZiB2YXJpb3VzIHdheXMgdG8gbWFwIHBzZXVkbyBpbnN0cnVjdGlvbnMKKy8vCisKKy8vIEZvcndhcmRTVDBUYWJsZSAtIE1hcDogQSA9IEIgb3AgQyAgaW50bzogU1QoMCkgPSBTVCgwKSBvcCBTVChpKQorc3RhdGljIGNvbnN0IFRhYmxlRW50cnkgRm9yd2FyZFNUMFRhYmxlW10gPSB7CisgIHsgWDg2OjpBRERfRnAzMiAgLCBYODY6OkFERF9GU1QwciB9LAorICB7IFg4Njo6QUREX0ZwNjQgICwgWDg2OjpBRERfRlNUMHIgfSwKKyAgeyBYODY6OkFERF9GcDgwICAsIFg4Njo6QUREX0ZTVDByIH0sCisgIHsgWDg2OjpESVZfRnAzMiAgLCBYODY6OkRJVl9GU1QwciB9LAorICB7IFg4Njo6RElWX0ZwNjQgICwgWDg2OjpESVZfRlNUMHIgfSwKKyAgeyBYODY6OkRJVl9GcDgwICAsIFg4Njo6RElWX0ZTVDByIH0sCisgIHsgWDg2OjpNVUxfRnAzMiAgLCBYODY6Ok1VTF9GU1QwciB9LAorICB7IFg4Njo6TVVMX0ZwNjQgICwgWDg2OjpNVUxfRlNUMHIgfSwKKyAgeyBYODY6Ok1VTF9GcDgwICAsIFg4Njo6TVVMX0ZTVDByIH0sCisgIHsgWDg2OjpTVUJfRnAzMiAgLCBYODY6OlNVQl9GU1QwciB9LAorICB7IFg4Njo6U1VCX0ZwNjQgICwgWDg2OjpTVUJfRlNUMHIgfSwKKyAgeyBYODY6OlNVQl9GcDgwICAsIFg4Njo6U1VCX0ZTVDByIH0sCit9OworCisvLyBSZXZlcnNlU1QwVGFibGUgLSBNYXA6IEEgPSBCIG9wIEMgIGludG86IFNUKDApID0gU1QoaSkgb3AgU1QoMCkKK3N0YXRpYyBjb25zdCBUYWJsZUVudHJ5IFJldmVyc2VTVDBUYWJsZVtdID0geworICB7IFg4Njo6QUREX0ZwMzIgICwgWDg2OjpBRERfRlNUMHIgIH0sICAgLy8gY29tbXV0YXRpdmUKKyAgeyBYODY6OkFERF9GcDY0ICAsIFg4Njo6QUREX0ZTVDByICB9LCAgIC8vIGNvbW11dGF0aXZlCisgIHsgWDg2OjpBRERfRnA4MCAgLCBYODY6OkFERF9GU1QwciAgfSwgICAvLyBjb21tdXRhdGl2ZQorICB7IFg4Njo6RElWX0ZwMzIgICwgWDg2OjpESVZSX0ZTVDByIH0sCisgIHsgWDg2OjpESVZfRnA2NCAgLCBYODY6OkRJVlJfRlNUMHIgfSwKKyAgeyBYODY6OkRJVl9GcDgwICAsIFg4Njo6RElWUl9GU1QwciB9LAorICB7IFg4Njo6TVVMX0ZwMzIgICwgWDg2OjpNVUxfRlNUMHIgIH0sICAgLy8gY29tbXV0YXRpdmUKKyAgeyBYODY6Ok1VTF9GcDY0ICAsIFg4Njo6TVVMX0ZTVDByICB9LCAgIC8vIGNvbW11dGF0aXZlCisgIHsgWDg2OjpNVUxfRnA4MCAgLCBYODY6Ok1VTF9GU1QwciAgfSwgICAvLyBjb21tdXRhdGl2ZQorICB7IFg4Njo6U1VCX0ZwMzIgICwgWDg2OjpTVUJSX0ZTVDByIH0sCisgIHsgWDg2OjpTVUJfRnA2NCAgLCBYODY6OlNVQlJfRlNUMHIgfSwKKyAgeyBYODY6OlNVQl9GcDgwICAsIFg4Njo6U1VCUl9GU1QwciB9LAorfTsKKworLy8gRm9yd2FyZFNUaVRhYmxlIC0gTWFwOiBBID0gQiBvcCBDICBpbnRvOiBTVChpKSA9IFNUKDApIG9wIFNUKGkpCitzdGF0aWMgY29uc3QgVGFibGVFbnRyeSBGb3J3YXJkU1RpVGFibGVbXSA9IHsKKyAgeyBYODY6OkFERF9GcDMyICAsIFg4Njo6QUREX0ZyU1QwICB9LCAgIC8vIGNvbW11dGF0aXZlCisgIHsgWDg2OjpBRERfRnA2NCAgLCBYODY6OkFERF9GclNUMCAgfSwgICAvLyBjb21tdXRhdGl2ZQorICB7IFg4Njo6QUREX0ZwODAgICwgWDg2OjpBRERfRnJTVDAgIH0sICAgLy8gY29tbXV0YXRpdmUKKyAgeyBYODY6OkRJVl9GcDMyICAsIFg4Njo6RElWUl9GclNUMCB9LAorICB7IFg4Njo6RElWX0ZwNjQgICwgWDg2OjpESVZSX0ZyU1QwIH0sCisgIHsgWDg2OjpESVZfRnA4MCAgLCBYODY6OkRJVlJfRnJTVDAgfSwKKyAgeyBYODY6Ok1VTF9GcDMyICAsIFg4Njo6TVVMX0ZyU1QwICB9LCAgIC8vIGNvbW11dGF0aXZlCisgIHsgWDg2OjpNVUxfRnA2NCAgLCBYODY6Ok1VTF9GclNUMCAgfSwgICAvLyBjb21tdXRhdGl2ZQorICB7IFg4Njo6TVVMX0ZwODAgICwgWDg2OjpNVUxfRnJTVDAgIH0sICAgLy8gY29tbXV0YXRpdmUKKyAgeyBYODY6OlNVQl9GcDMyICAsIFg4Njo6U1VCUl9GclNUMCB9LAorICB7IFg4Njo6U1VCX0ZwNjQgICwgWDg2OjpTVUJSX0ZyU1QwIH0sCisgIHsgWDg2OjpTVUJfRnA4MCAgLCBYODY6OlNVQlJfRnJTVDAgfSwKK307CisKKy8vIFJldmVyc2VTVGlUYWJsZSAtIE1hcDogQSA9IEIgb3AgQyAgaW50bzogU1QoaSkgPSBTVChpKSBvcCBTVCgwKQorc3RhdGljIGNvbnN0IFRhYmxlRW50cnkgUmV2ZXJzZVNUaVRhYmxlW10gPSB7CisgIHsgWDg2OjpBRERfRnAzMiAgLCBYODY6OkFERF9GclNUMCB9LAorICB7IFg4Njo6QUREX0ZwNjQgICwgWDg2OjpBRERfRnJTVDAgfSwKKyAgeyBYODY6OkFERF9GcDgwICAsIFg4Njo6QUREX0ZyU1QwIH0sCisgIHsgWDg2OjpESVZfRnAzMiAgLCBYODY6OkRJVl9GclNUMCB9LAorICB7IFg4Njo6RElWX0ZwNjQgICwgWDg2OjpESVZfRnJTVDAgfSwKKyAgeyBYODY6OkRJVl9GcDgwICAsIFg4Njo6RElWX0ZyU1QwIH0sCisgIHsgWDg2OjpNVUxfRnAzMiAgLCBYODY6Ok1VTF9GclNUMCB9LAorICB7IFg4Njo6TVVMX0ZwNjQgICwgWDg2OjpNVUxfRnJTVDAgfSwKKyAgeyBYODY6Ok1VTF9GcDgwICAsIFg4Njo6TVVMX0ZyU1QwIH0sCisgIHsgWDg2OjpTVUJfRnAzMiAgLCBYODY6OlNVQl9GclNUMCB9LAorICB7IFg4Njo6U1VCX0ZwNjQgICwgWDg2OjpTVUJfRnJTVDAgfSwKKyAgeyBYODY6OlNVQl9GcDgwICAsIFg4Njo6U1VCX0ZyU1QwIH0sCit9OworCisKKy8vLyBoYW5kbGVUd29BcmdGUCAtIEhhbmRsZSBpbnN0cnVjdGlvbnMgbGlrZSBGQUREIGFuZCBmcmllbmRzIHdoaWNoIGFyZSB2aXJ0dWFsCisvLy8gaW5zdHJ1Y3Rpb25zIHdoaWNoIG5lZWQgdG8gYmUgc2ltcGxpZmllZCBhbmQgcG9zc2libHkgdHJhbnNmb3JtZWQuCisvLy8KKy8vLyBSZXN1bHQ6IFNUKDApID0gZnN1YiAgU1QoMCksIFNUKGkpCisvLy8gICAgICAgICBTVChpKSA9IGZzdWIgIFNUKDApLCBTVChpKQorLy8vICAgICAgICAgU1QoMCkgPSBmc3ViciBTVCgwKSwgU1QoaSkKKy8vLyAgICAgICAgIFNUKGkpID0gZnN1YnIgU1QoMCksIFNUKGkpCisvLy8KK3ZvaWQgRlBTOjpoYW5kbGVUd29BcmdGUChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJkkpIHsKKyAgQVNTRVJUX1NPUlRFRChGb3J3YXJkU1QwVGFibGUpOyBBU1NFUlRfU09SVEVEKFJldmVyc2VTVDBUYWJsZSk7CisgIEFTU0VSVF9TT1JURUQoRm9yd2FyZFNUaVRhYmxlKTsgQVNTRVJUX1NPUlRFRChSZXZlcnNlU1RpVGFibGUpOworICBNYWNoaW5lSW5zdHIgKk1JID0gSTsKKworICB1bnNpZ25lZCBOdW1PcGVyYW5kcyA9IE1JLT5nZXREZXNjKCkuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgYXNzZXJ0KE51bU9wZXJhbmRzID09IDMgJiYgIklsbGVnYWwgVHdvQXJnRlAgaW5zdHJ1Y3Rpb24hIik7CisgIHVuc2lnbmVkIERlc3QgPSBnZXRGUFJlZyhNSS0+Z2V0T3BlcmFuZCgwKSk7CisgIHVuc2lnbmVkIE9wMCA9IGdldEZQUmVnKE1JLT5nZXRPcGVyYW5kKE51bU9wZXJhbmRzLTIpKTsKKyAgdW5zaWduZWQgT3AxID0gZ2V0RlBSZWcoTUktPmdldE9wZXJhbmQoTnVtT3BlcmFuZHMtMSkpOworICBib29sIEtpbGxzT3AwID0gTUktPmtpbGxzUmVnaXN0ZXIoWDg2OjpGUDArT3AwKTsKKyAgYm9vbCBLaWxsc09wMSA9IE1JLT5raWxsc1JlZ2lzdGVyKFg4Njo6RlAwK09wMSk7CisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgdW5zaWduZWQgVE9TID0gZ2V0U3RhY2tFbnRyeSgwKTsKKworICAvLyBPbmUgb2Ygb3VyIG9wZXJhbmRzIG11c3QgYmUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICBJZiBuZWl0aGVyIGlzIHlldCwgd2UKKyAgLy8gbmVlZCB0byBtb3ZlIG9uZS4KKyAgaWYgKE9wMCAhPSBUT1MgJiYgT3AxICE9IFRPUykgeyAgIC8vIE5vIG9wZXJhbmQgYXQgVE9TPworICAgIC8vIFdlIGNhbiBjaG9vc2UgdG8gbW92ZSBlaXRoZXIgb3BlcmFuZCB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4gIElmIG9uZSBvZgorICAgIC8vIHRoZSBvcGVyYW5kcyBpcyBraWxsZWQgYnkgdGhpcyBpbnN0cnVjdGlvbiwgd2Ugd2FudCB0aGF0IG9uZSBzbyB0aGF0IHdlCisgICAgLy8gY2FuIHVwZGF0ZSByaWdodCBvbiB0b3Agb2YgdGhlIG9sZCB2ZXJzaW9uLgorICAgIGlmIChLaWxsc09wMCkgeworICAgICAgbW92ZVRvVG9wKE9wMCwgSSk7ICAgICAgICAgLy8gTW92ZSBkZWFkIG9wZXJhbmQgdG8gVE9TLgorICAgICAgVE9TID0gT3AwOworICAgIH0gZWxzZSBpZiAoS2lsbHNPcDEpIHsKKyAgICAgIG1vdmVUb1RvcChPcDEsIEkpOworICAgICAgVE9TID0gT3AxOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBbGwgb2YgdGhlIG9wZXJhbmRzIGFyZSBsaXZlIGFmdGVyIHRoaXMgaW5zdHJ1Y3Rpb24gZXhlY3V0ZXMsIHNvIHdlCisgICAgICAvLyBjYW5ub3QgdXBkYXRlIG9uIHRvcCBvZiBhbnkgb3BlcmFuZC4gIEJlY2F1c2Ugb2YgdGhpcywgd2UgbXVzdAorICAgICAgLy8gZHVwbGljYXRlIG9uZSBvZiB0aGUgc3RhY2sgZWxlbWVudHMgdG8gdGhlIHRvcC4gIEl0IGRvZXNuJ3QgbWF0dGVyCisgICAgICAvLyB3aGljaCBvbmUgd2UgcGljay4KKyAgICAgIC8vCisgICAgICBkdXBsaWNhdGVUb1RvcChPcDAsIERlc3QsIEkpOworICAgICAgT3AwID0gVE9TID0gRGVzdDsKKyAgICAgIEtpbGxzT3AwID0gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoIUtpbGxzT3AwICYmICFLaWxsc09wMSkgeworICAgIC8vIElmIHdlIERPIGhhdmUgb25lIG9mIG91ciBvcGVyYW5kcyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYnV0IHdlIGRvbid0CisgICAgLy8gaGF2ZSBhIGRlYWQgb3BlcmFuZCwgd2UgbXVzdCBkdXBsaWNhdGUgb25lIG9mIHRoZSBvcGVyYW5kcyB0byBhIG5ldyBzbG90CisgICAgLy8gb24gdGhlIHN0YWNrLgorICAgIGR1cGxpY2F0ZVRvVG9wKE9wMCwgRGVzdCwgSSk7CisgICAgT3AwID0gVE9TID0gRGVzdDsKKyAgICBLaWxsc09wMCA9IHRydWU7CisgIH0KKworICAvLyBOb3cgd2Uga25vdyB0aGF0IG9uZSBvZiBvdXIgb3BlcmFuZHMgaXMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGFuZCBhdAorICAvLyBsZWFzdCBvbmUgb2Ygb3VyIG9wZXJhbmRzIGlzIGtpbGxlZCBieSB0aGlzIGluc3RydWN0aW9uLgorICBhc3NlcnQoKFRPUyA9PSBPcDAgfHwgVE9TID09IE9wMSkgJiYgKEtpbGxzT3AwIHx8IEtpbGxzT3AxKSAmJgorICAgICAgICAgIlN0YWNrIGNvbmRpdGlvbnMgbm90IHNldCB1cCByaWdodCEiKTsKKworICAvLyBXZSBkZWNpZGUgd2hpY2ggZm9ybSB0byB1c2UgYmFzZWQgb24gd2hhdCBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYW5kCisgIC8vIHdoaWNoIG9wZXJhbmQgaXMga2lsbGVkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24uCisgIGNvbnN0IFRhYmxlRW50cnkgKkluc3RUYWJsZTsKKyAgYm9vbCBpc0ZvcndhcmQgPSBUT1MgPT0gT3AwOworICBib29sIHVwZGF0ZVNUMCA9IChUT1MgPT0gT3AwICYmICFLaWxsc09wMSkgfHwgKFRPUyA9PSBPcDEgJiYgIUtpbGxzT3AwKTsKKyAgaWYgKHVwZGF0ZVNUMCkgeworICAgIGlmIChpc0ZvcndhcmQpCisgICAgICBJbnN0VGFibGUgPSBGb3J3YXJkU1QwVGFibGU7CisgICAgZWxzZQorICAgICAgSW5zdFRhYmxlID0gUmV2ZXJzZVNUMFRhYmxlOworICB9IGVsc2UgeworICAgIGlmIChpc0ZvcndhcmQpCisgICAgICBJbnN0VGFibGUgPSBGb3J3YXJkU1RpVGFibGU7CisgICAgZWxzZQorICAgICAgSW5zdFRhYmxlID0gUmV2ZXJzZVNUaVRhYmxlOworICB9CisKKyAgaW50IE9wY29kZSA9IExvb2t1cChJbnN0VGFibGUsIGFycmF5X2xlbmd0aG9mKEZvcndhcmRTVDBUYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgTUktPmdldE9wY29kZSgpKTsKKyAgYXNzZXJ0KE9wY29kZSAhPSAtMSAmJiAiVW5rbm93biBUd29BcmdGUCBwc2V1ZG8gaW5zdHJ1Y3Rpb24hIik7CisKKyAgLy8gTm90VE9TIC0gVGhlIHJlZ2lzdGVyIHdoaWNoIGlzIG5vdCBvbiB0aGUgdG9wIG9mIHN0YWNrLi4uCisgIHVuc2lnbmVkIE5vdFRPUyA9IChUT1MgPT0gT3AwKSA/IE9wMSA6IE9wMDsKKworICAvLyBSZXBsYWNlIHRoZSBvbGQgaW5zdHJ1Y3Rpb24gd2l0aCBhIG5ldyBpbnN0cnVjdGlvbgorICBNQkItPnJlbW92ZShJKyspOworICBJID0gQnVpbGRNSSgqTUJCLCBJLCBkbCwgVElJLT5nZXQoT3Bjb2RlKSkuYWRkUmVnKGdldFNUUmVnKE5vdFRPUykpOworCisgIC8vIElmIGJvdGggb3BlcmFuZHMgYXJlIGtpbGxlZCwgcG9wIG9uZSBvZmYgb2YgdGhlIHN0YWNrIGluIGFkZGl0aW9uIHRvCisgIC8vIG92ZXJ3cml0aW5nIHRoZSBvdGhlciBvbmUuCisgIGlmIChLaWxsc09wMCAmJiBLaWxsc09wMSAmJiBPcDAgIT0gT3AxKSB7CisgICAgYXNzZXJ0KCF1cGRhdGVTVDAgJiYgIlNob3VsZCBoYXZlIHVwZGF0ZWQgb3RoZXIgb3BlcmFuZCEiKTsKKyAgICBwb3BTdGFja0FmdGVyKEkpOyAgIC8vIFBvcCB0aGUgdG9wIG9mIHN0YWNrCisgIH0KKworICAvLyBVcGRhdGUgc3RhY2sgaW5mb3JtYXRpb24gc28gdGhhdCB3ZSBrbm93IHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpcyBub3cgb24KKyAgLy8gdGhlIHN0YWNrLgorICB1bnNpZ25lZCBVcGRhdGVkU2xvdCA9IGdldFNsb3QodXBkYXRlU1QwID8gVE9TIDogTm90VE9TKTsKKyAgYXNzZXJ0KFVwZGF0ZWRTbG90IDwgU3RhY2tUb3AgJiYgRGVzdCA8IDcpOworICBTdGFja1tVcGRhdGVkU2xvdF0gICA9IERlc3Q7CisgIFJlZ01hcFtEZXN0XSAgICAgICAgID0gVXBkYXRlZFNsb3Q7CisgIE1CQi0+Z2V0UGFyZW50KCktPkRlbGV0ZU1hY2hpbmVJbnN0cihNSSk7IC8vIFJlbW92ZSB0aGUgb2xkIGluc3RydWN0aW9uCit9CisKKy8vLyBoYW5kbGVDb21wYXJlRlAgLSBIYW5kbGUgRlVDT00gYW5kIEZVQ09NSSBpbnN0cnVjdGlvbnMsIHdoaWNoIGhhdmUgdHdvIEZQCisvLy8gcmVnaXN0ZXIgYXJndW1lbnRzIGFuZCBubyBleHBsaWNpdCBkZXN0aW5hdGlvbnMuCisvLy8KK3ZvaWQgRlBTOjpoYW5kbGVDb21wYXJlRlAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJKSB7CisgIEFTU0VSVF9TT1JURUQoRm9yd2FyZFNUMFRhYmxlKTsgQVNTRVJUX1NPUlRFRChSZXZlcnNlU1QwVGFibGUpOworICBBU1NFUlRfU09SVEVEKEZvcndhcmRTVGlUYWJsZSk7IEFTU0VSVF9TT1JURUQoUmV2ZXJzZVNUaVRhYmxlKTsKKyAgTWFjaGluZUluc3RyICpNSSA9IEk7CisKKyAgdW5zaWduZWQgTnVtT3BlcmFuZHMgPSBNSS0+Z2V0RGVzYygpLmdldE51bU9wZXJhbmRzKCk7CisgIGFzc2VydChOdW1PcGVyYW5kcyA9PSAyICYmICJJbGxlZ2FsIEZVQ09NKiBpbnN0cnVjdGlvbiEiKTsKKyAgdW5zaWduZWQgT3AwID0gZ2V0RlBSZWcoTUktPmdldE9wZXJhbmQoTnVtT3BlcmFuZHMtMikpOworICB1bnNpZ25lZCBPcDEgPSBnZXRGUFJlZyhNSS0+Z2V0T3BlcmFuZChOdW1PcGVyYW5kcy0xKSk7CisgIGJvb2wgS2lsbHNPcDAgPSBNSS0+a2lsbHNSZWdpc3RlcihYODY6OkZQMCtPcDApOworICBib29sIEtpbGxzT3AxID0gTUktPmtpbGxzUmVnaXN0ZXIoWDg2OjpGUDArT3AxKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIGZpcnN0IG9wZXJhbmQgaXMgb24gdGhlIHRvcCBvZiBzdGFjaywgdGhlIG90aGVyIG9uZSBjYW4gYmUKKyAgLy8gYW55d2hlcmUuCisgIG1vdmVUb1RvcChPcDAsIEkpOworCisgIC8vIENoYW5nZSBmcm9tIHRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gdG8gdGhlIGNvbmNyZXRlIGluc3RydWN0aW9uLgorICBNSS0+Z2V0T3BlcmFuZCgwKS5zZXRSZWcoZ2V0U1RSZWcoT3AxKSk7CisgIE1JLT5SZW1vdmVPcGVyYW5kKDEpOworICBNSS0+c2V0RGVzYyhUSUktPmdldChnZXRDb25jcmV0ZU9wY29kZShNSS0+Z2V0T3Bjb2RlKCkpKSk7CisKKyAgLy8gSWYgYW55IG9mIHRoZSBvcGVyYW5kcyBhcmUga2lsbGVkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24sIGZyZWUgdGhlbS4KKyAgaWYgKEtpbGxzT3AwKSBmcmVlU3RhY2tTbG90QWZ0ZXIoSSwgT3AwKTsKKyAgaWYgKEtpbGxzT3AxICYmIE9wMCAhPSBPcDEpIGZyZWVTdGFja1Nsb3RBZnRlcihJLCBPcDEpOworfQorCisvLy8gaGFuZGxlQ29uZE1vdkZQIC0gSGFuZGxlIHR3byBhZGRyZXNzIGNvbmRpdGlvbmFsIG1vdmUgaW5zdHJ1Y3Rpb25zLiAgVGhlc2UKKy8vLyBpbnN0cnVjdGlvbnMgbW92ZSBhIHN0KGkpIHJlZ2lzdGVyIHRvIHN0KDApIGlmZiBhIGNvbmRpdGlvbiBpcyB0cnVlLiAgVGhlc2UKKy8vLyBpbnN0cnVjdGlvbnMgcmVxdWlyZSB0aGF0IHRoZSBmaXJzdCBvcGVyYW5kIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBidXQKKy8vLyBvdGhlcndpc2UgZG9uJ3QgbW9kaWZ5IHRoZSBzdGFjayBhdCBhbGwuCit2b2lkIEZQUzo6aGFuZGxlQ29uZE1vdkZQKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmSSkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gSTsKKworICB1bnNpZ25lZCBPcDAgPSBnZXRGUFJlZyhNSS0+Z2V0T3BlcmFuZCgwKSk7CisgIHVuc2lnbmVkIE9wMSA9IGdldEZQUmVnKE1JLT5nZXRPcGVyYW5kKDIpKTsKKyAgYm9vbCBLaWxsc09wMSA9IE1JLT5raWxsc1JlZ2lzdGVyKFg4Njo6RlAwK09wMSk7CisKKyAgLy8gVGhlIGZpcnN0IG9wZXJhbmQgKm11c3QqIGJlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorICBtb3ZlVG9Ub3AoT3AwLCBJKTsKKworICAvLyBDaGFuZ2UgdGhlIHNlY29uZCBvcGVyYW5kIHRvIHRoZSBzdGFjayByZWdpc3RlciB0aGF0IHRoZSBvcGVyYW5kIGlzIGluLgorICAvLyBDaGFuZ2UgZnJvbSB0aGUgcHNldWRvIGluc3RydWN0aW9uIHRvIHRoZSBjb25jcmV0ZSBpbnN0cnVjdGlvbi4KKyAgTUktPlJlbW92ZU9wZXJhbmQoMCk7CisgIE1JLT5SZW1vdmVPcGVyYW5kKDEpOworICBNSS0+Z2V0T3BlcmFuZCgwKS5zZXRSZWcoZ2V0U1RSZWcoT3AxKSk7CisgIE1JLT5zZXREZXNjKFRJSS0+Z2V0KGdldENvbmNyZXRlT3Bjb2RlKE1JLT5nZXRPcGNvZGUoKSkpKTsKKyAgCisgIC8vIElmIHdlIGtpbGwgdGhlIHNlY29uZCBvcGVyYW5kLCBtYWtlIHN1cmUgdG8gcG9wIGl0IGZyb20gdGhlIHN0YWNrLgorICBpZiAoT3AwICE9IE9wMSAmJiBLaWxsc09wMSkgeworICAgIC8vIEdldCB0aGlzIHZhbHVlIG9mZiBvZiB0aGUgcmVnaXN0ZXIgc3RhY2suCisgICAgZnJlZVN0YWNrU2xvdEFmdGVyKEksIE9wMSk7CisgIH0KK30KKworCisvLy8gaGFuZGxlU3BlY2lhbEZQIC0gSGFuZGxlIHNwZWNpYWwgaW5zdHJ1Y3Rpb25zIHdoaWNoIGJlaGF2ZSB1bmxpa2Ugb3RoZXIKKy8vLyBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCBmb3IgdXNlIGJ5IHBzZXVkbworLy8vIGluc3RydWN0aW9ucy4KKy8vLwordm9pZCBGUFM6OmhhbmRsZVNwZWNpYWxGUChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJkkpIHsKKyAgTWFjaGluZUluc3RyICpNSSA9IEk7CisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gU3BlY2lhbEZQIGluc3RydWN0aW9uISIpOworICBjYXNlIFg4Njo6RnBHRVRfU1QwXzMyOi8vIEFwcGVhcnMgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIHJldHVybmluZyBGUCB0eXBlIQorICBjYXNlIFg4Njo6RnBHRVRfU1QwXzY0Oi8vIEFwcGVhcnMgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIHJldHVybmluZyBGUCB0eXBlIQorICBjYXNlIFg4Njo6RnBHRVRfU1QwXzgwOi8vIEFwcGVhcnMgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIHJldHVybmluZyBGUCB0eXBlIQorICAgIGFzc2VydChTdGFja1RvcCA9PSAwICYmICJTdGFjayBzaG91bGQgYmUgZW1wdHkgYWZ0ZXIgYSBjYWxsISIpOworICAgIHB1c2hSZWcoZ2V0RlBSZWcoTUktPmdldE9wZXJhbmQoMCkpKTsKKyAgICBicmVhazsKKyAgY2FzZSBYODY6OkZwR0VUX1NUMV8zMjovLyBBcHBlYXJzIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCByZXR1cm5pbmcgRlAgdHlwZSEKKyAgY2FzZSBYODY6OkZwR0VUX1NUMV82NDovLyBBcHBlYXJzIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCByZXR1cm5pbmcgRlAgdHlwZSEKKyAgY2FzZSBYODY6OkZwR0VUX1NUMV84MDp7Ly8gQXBwZWFycyBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgcmV0dXJuaW5nIEZQIHR5cGUhCisgICAgLy8gRnBHRVRfU1QxIHNob3VsZCBvY2N1ciByaWdodCBhZnRlciBhIEZwR0VUX1NUMCBmb3IgYSBjYWxsIG9yIGlubGluZSBhc20uCisgICAgLy8gVGhlIHBhdHRlcm4gd2UgZXhwZWN0IGlzOgorICAgIC8vICBDQUxMCisgICAgLy8gIEZQMSA9IEZwR0VUX1NUMAorICAgIC8vICBGUDQgPSBGcEdFVF9TVDEKKyAgICAvLworICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlJ3ZlIHB1c2hlZCBGUDEgb24gdGhlIHRvcCBvZiBzdGFjaywgc28gaXQgc2hvdWxkIGJlCisgICAgLy8gcHJlc2VudCBpZiBpdCBpc24ndCBkZWFkLiAgSWYgaXQgd2FzIGRlYWQsIHdlIGFscmVhZHkgZW1pdHRlZCBhIHBvcCB0bworICAgIC8vIHJlbW92ZSBpdCBmcm9tIHRoZSBzdGFjayBhbmQgU3RhY2tUb3AgPSAwLgorICAgIAorICAgIC8vIFB1c2ggRlA0IGFzIHRvcCBvZiBzdGFjayBuZXh0LgorICAgIHB1c2hSZWcoZ2V0RlBSZWcoTUktPmdldE9wZXJhbmQoMCkpKTsKKworICAgIC8vIElmIFN0YWNrVG9wIHdhcyAwIGJlZm9yZSB3ZSBwdXNoZWQgb3VyIG9wZXJhbmQsIHRoZW4gU1QoMCkgbXVzdCBoYXZlIGJlZW4KKyAgICAvLyBkZWFkLiAgSW4gdGhpcyBjYXNlLCB0aGUgU1QoMSkgdmFsdWUgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBpcyBsaXZlLCBzbworICAgIC8vIGl0IHNob3VsZCBiZSBvbiB0aGUgVE9TIChhZnRlciB0aGUgcG9wIHRoYXQgd2FzIGVtaXR0ZWQpIGFuZCBpcy4gIEp1c3QKKyAgICAvLyBjb250aW51ZSBpbiB0aGlzIGNhc2UuCisgICAgaWYgKFN0YWNrVG9wID09IDEpCisgICAgICBicmVhazsKKyAgICAKKyAgICAvLyBCZWNhdXNlIHB1c2hSZWcganVzdCBwdXNoZWQgU1QoMSkgYXMgVE9TLCB3ZSBub3cgaGF2ZSB0byBzd2FwIHRoZSB0d28gdG9wCisgICAgLy8gZWxlbWVudHMgc28gdGhhdCBvdXIgYWNjb3VudGluZyBpcyBjb3JyZWN0LgorICAgIHVuc2lnbmVkIFJlZ09uVG9wID0gZ2V0U3RhY2tFbnRyeSgwKTsKKyAgICB1bnNpZ25lZCBSZWdObyA9IGdldFN0YWNrRW50cnkoMSk7CisgICAgCisgICAgLy8gU3dhcCB0aGUgc2xvdHMgdGhlIHJlZ3MgYXJlIGluLgorICAgIHN0ZDo6c3dhcChSZWdNYXBbUmVnTm9dLCBSZWdNYXBbUmVnT25Ub3BdKTsKKyAgICAKKyAgICAvLyBTd2FwIHN0YWNrIHNsb3QgY29udGVudHMuCisgICAgYXNzZXJ0KFJlZ01hcFtSZWdPblRvcF0gPCBTdGFja1RvcCk7CisgICAgc3RkOjpzd2FwKFN0YWNrW1JlZ01hcFtSZWdPblRvcF1dLCBTdGFja1tTdGFja1RvcC0xXSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBYODY6OkZwU0VUX1NUMF8zMjoKKyAgY2FzZSBYODY6OkZwU0VUX1NUMF82NDoKKyAgY2FzZSBYODY6OkZwU0VUX1NUMF84MDogeworICAgIC8vIEZwU0VUX1NUMF84MCBpcyBnZW5lcmF0ZWQgYnkgY29weVJlZ1RvUmVnIGZvciBzZXR0aW5nIHVwIGlubGluZSBhc20KKyAgICAvLyBhcmd1bWVudHMgdGhhdCB1c2UgYW4gc3QgY29uc3RyYWludC4gV2UgZXhwZWN0IGEgc2VxdWVuY2Ugb2YKKyAgICAvLyBpbnN0cnVjdGlvbnM6IEZwX1NFVF9TVDAgRnBfU0VUX1NUMT8gSU5MSU5FQVNNCisgICAgdW5zaWduZWQgT3AwID0gZ2V0RlBSZWcoTUktPmdldE9wZXJhbmQoMCkpOworCisgICAgaWYgKCFNSS0+a2lsbHNSZWdpc3RlcihYODY6OkZQMCArIE9wMCkpIHsKKyAgICAgIC8vIER1cGxpY2F0ZSBPcDAgaW50byBhIHRlbXBvcmFyeSBvbiB0aGUgc3RhY2sgdG9wLgorICAgICAgZHVwbGljYXRlVG9Ub3AoT3AwLCBnZXRTY3JhdGNoUmVnKCksIEkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPcDAgaXMga2lsbGVkLCBzbyBqdXN0IHN3YXAgaXQgaW50byBwb3NpdGlvbi4KKyAgICAgIG1vdmVUb1RvcChPcDAsIEkpOworICAgIH0KKyAgICAtLVN0YWNrVG9wOyAgIC8vICJGb3JnZXQiIHdlIGhhdmUgc29tZXRoaW5nIG9uIHRoZSB0b3Agb2Ygc3RhY2shCisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBYODY6OkZwU0VUX1NUMV8zMjoKKyAgY2FzZSBYODY6OkZwU0VUX1NUMV82NDoKKyAgY2FzZSBYODY6OkZwU0VUX1NUMV84MDogeworICAgIC8vIFNldCB1cCBzdCgxKSBmb3IgaW5saW5lIGFzbS4gV2UgYXJlIGFzc3VtaW5nIHRoYXQgc3QoMCkgaGFzIGFscmVhZHkgYmVlbgorICAgIC8vIHNldCB1cCBieSBGcFNFVF9TVDAsIGFuZCBvdXIgU3RhY2tUb3AgaXMgb2ZmIGJ5IG9uZSBiZWNhdXNlIG9mIGl0LgorICAgIHVuc2lnbmVkIE9wMCA9IGdldEZQUmVnKE1JLT5nZXRPcGVyYW5kKDApKTsKKyAgICAvLyBSZXN0b3JlIHRoZSBhY3R1YWwgU3RhY2tUb3AgZnJvbSBiZWZvcmUgRnBfU0VUX1NUMC4KKyAgICAvLyBOb3RlIHdlIGNhbid0IGhhbmRsZSBGcF9TRVRfU1QxIHdpdGhvdXQgYSBwcmVjZWVkaW5nIEZwX1NFVF9TVDAsIGFuZCB3ZQorICAgIC8vIGFyZSBub3QgZW5mb3JjaW5nIHRoZSBjb25zdHJhaW50LgorICAgICsrU3RhY2tUb3A7CisgICAgdW5zaWduZWQgUmVnT25Ub3AgPSBnZXRTdGFja0VudHJ5KDApOyAvLyBUaGlzIHJlZyBtdXN0IHJlbWFpbiBpbiBzdCgwKS4KKyAgICBpZiAoIU1JLT5raWxsc1JlZ2lzdGVyKFg4Njo6RlAwICsgT3AwKSkgeworICAgICAgZHVwbGljYXRlVG9Ub3AoT3AwLCBnZXRTY3JhdGNoUmVnKCksIEkpOworICAgICAgbW92ZVRvVG9wKFJlZ09uVG9wLCBJKTsKKyAgICB9IGVsc2UgaWYgKGdldFNUUmVnKE9wMCkgIT0gWDg2OjpTVDEpIHsKKyAgICAgIC8vIFdlIGhhdmUgdGhlIHdyb25nIHZhbHVlIGF0IHN0KDEpLiBTaHVmZmxlISBVbnRlc3RlZCEKKyAgICAgIG1vdmVUb1RvcChnZXRTdGFja0VudHJ5KDEpLCBJKTsKKyAgICAgIG1vdmVUb1RvcChPcDAsIEkpOworICAgICAgbW92ZVRvVG9wKFJlZ09uVG9wLCBJKTsKKyAgICB9CisgICAgYXNzZXJ0KFN0YWNrVG9wID49IDIgJiYgIlRvbyBmZXcgbGl2ZSByZWdpc3RlcnMiKTsKKyAgICBTdGFja1RvcCAtPSAyOyAvLyAiRm9yZ2V0IiBib3RoIHN0KDApIGFuZCBzdCgxKS4KKyAgICBicmVhazsKKyAgfQorICBjYXNlIFg4Njo6TU9WX0ZwMzIzMjoKKyAgY2FzZSBYODY6Ok1PVl9GcDMyNjQ6CisgIGNhc2UgWDg2OjpNT1ZfRnA2NDMyOgorICBjYXNlIFg4Njo6TU9WX0ZwNjQ2NDogCisgIGNhc2UgWDg2OjpNT1ZfRnAzMjgwOgorICBjYXNlIFg4Njo6TU9WX0ZwNjQ4MDoKKyAgY2FzZSBYODY6Ok1PVl9GcDgwMzI6CisgIGNhc2UgWDg2OjpNT1ZfRnA4MDY0OiAKKyAgY2FzZSBYODY6Ok1PVl9GcDgwODA6IHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8xID0gTUktPmdldE9wZXJhbmQoMSk7CisgICAgdW5zaWduZWQgU3JjUmVnID0gZ2V0RlBSZWcoTU8xKTsKKworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTzAgPSBNSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICB1bnNpZ25lZCBEZXN0UmVnID0gZ2V0RlBSZWcoTU8wKTsKKyAgICBpZiAoTUktPmtpbGxzUmVnaXN0ZXIoWDg2OjpGUDArU3JjUmVnKSkgeworICAgICAgLy8gSWYgdGhlIGlucHV0IG9wZXJhbmQgaXMga2lsbGVkLCB3ZSBjYW4ganVzdCBjaGFuZ2UgdGhlIG93bmVyIG9mIHRoZQorICAgICAgLy8gaW5jb21pbmcgc3RhY2sgc2xvdCBpbnRvIHRoZSByZXN1bHQuCisgICAgICB1bnNpZ25lZCBTbG90ID0gZ2V0U2xvdChTcmNSZWcpOworICAgICAgYXNzZXJ0KFNsb3QgPCA3ICYmIERlc3RSZWcgPCA3ICYmICJGcE1PViBvcGVyYW5kcyBpbnZhbGlkISIpOworICAgICAgU3RhY2tbU2xvdF0gPSBEZXN0UmVnOworICAgICAgUmVnTWFwW0Rlc3RSZWddID0gU2xvdDsKKworICAgIH0gZWxzZSB7CisgICAgICAvLyBGb3IgRk1PViB3ZSBqdXN0IGR1cGxpY2F0ZSB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIGEgbmV3IHN0YWNrIHNsb3QuCisgICAgICAvLyBUaGlzIGNvdWxkIGJlIG1hZGUgYmV0dGVyLCBidXQgd291bGQgcmVxdWlyZSBzdWJzdGFudGlhbCBjaGFuZ2VzLgorICAgICAgZHVwbGljYXRlVG9Ub3AoU3JjUmVnLCBEZXN0UmVnLCBJKTsKKyAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRhcmdldE9wY29kZTo6SU5MSU5FQVNNOiB7CisgICAgLy8gVGhlIGlubGluZSBhc20gTWFjaGluZUluc3RyIGN1cnJlbnRseSBvbmx5ICp1c2VzKiBGUCByZWdpc3RlcnMgZm9yIHRoZQorICAgIC8vICdmJyBjb25zdHJhaW50LiAgVGhlc2Ugc2hvdWxkIGJlIHR1cm5lZCBpbnRvIHRoZSBjdXJyZW50IFNUKHgpIHJlZ2lzdGVyCisgICAgLy8gaW4gdGhlIG1hY2hpbmUgaW5zdHIuICBBbHNvLCBhbnkga2lsbHMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgcG9wcGVkIGFmdGVyCisgICAgLy8gdGhlIGlubGluZSBhc20uCisgICAgdW5zaWduZWQgS2lsbHMgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZPcCA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKCFPcC5pc1JlZygpIHx8IE9wLmdldFJlZygpIDwgWDg2OjpGUDAgfHwgT3AuZ2V0UmVnKCkgPiBYODY6OkZQNikKKyAgICAgICAgY29udGludWU7CisgICAgICBhc3NlcnQoT3AuaXNVc2UoKSAmJiAiT25seSBoYW5kbGUgaW5saW5lIGFzbSB1c2VzIHJpZ2h0IG5vdyIpOworICAgICAgCisgICAgICB1bnNpZ25lZCBGUFJlZyA9IGdldEZQUmVnKE9wKTsKKyAgICAgIE9wLnNldFJlZyhnZXRTVFJlZyhGUFJlZykpOworICAgICAgCisgICAgICAvLyBJZiB3ZSBraWxsIHRoaXMgb3BlcmFuZCwgbWFrZSBzdXJlIHRvIHBvcCBpdCBmcm9tIHRoZSBzdGFjayBhZnRlciB0aGUKKyAgICAgIC8vIGFzbS4gIFdlIGp1c3QgcmVtZW1iZXIgaXQgZm9yIG5vdywgYW5kIHBvcCB0aGVtIGFsbCBvZmYgYXQgdGhlIGVuZCBpbgorICAgICAgLy8gYSBiYXRjaC4KKyAgICAgIGlmIChPcC5pc0tpbGwoKSkKKyAgICAgICAgS2lsbHMgfD0gMVUgPDwgRlBSZWc7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBhc20ga2lsbHMgYW55IEZQIHJlZ2lzdGVycyAoaXMgdGhlIGxhc3QgdXNlIG9mIHRoZW0pIHdlIG11c3QKKyAgICAvLyBleHBsaWNpdGx5IGVtaXQgcG9wIGluc3RydWN0aW9ucyBmb3IgdGhlbS4gIERvIHRoaXMgbm93IGFmdGVyIHRoZSBhc20gaGFzCisgICAgLy8gZXhlY3V0ZWQgc28gdGhhdCB0aGUgU1QoeCkgbnVtYmVycyBhcmUgbm90IG9mZiAod2hpY2ggd291bGQgaGFwcGVuIGlmIHdlCisgICAgLy8gZGlkIHRoaXMgaW5saW5lIHdpdGggb3BlcmFuZCByZXdyaXRpbmcpLgorICAgIC8vCisgICAgLy8gTm90ZTogdGhpcyBtaWdodCBiZSBhIG5vbi1vcHRpbWFsIHBvcCBzZXF1ZW5jZS4gIFdlIG1pZ2h0IGJlIGFibGUgdG8gZG8KKyAgICAvLyBiZXR0ZXIgYnkgdHJ5aW5nIHRvIHBvcCBpbiBzdGFjayBvcmRlciBvciBzb21ldGhpbmcuCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFB0ID0gTUk7CisgICAgd2hpbGUgKEtpbGxzKSB7CisgICAgICB1bnNpZ25lZCBGUFJlZyA9IENvdW50VHJhaWxpbmdaZXJvc18zMihLaWxscyk7CisgICAgICBmcmVlU3RhY2tTbG90QWZ0ZXIoSW5zZXJ0UHQsIEZQUmVnKTsKKyAgICAgIEtpbGxzICY9IH4oMVUgPDwgRlBSZWcpOworICAgIH0KKyAgICAvLyBEb24ndCBkZWxldGUgdGhlIGlubGluZSBhc20hCisgICAgcmV0dXJuOworICB9CisgICAgICAKKyAgY2FzZSBYODY6OlJFVDoKKyAgY2FzZSBYODY6OlJFVEk6CisgICAgLy8gSWYgUkVUIGhhcyBhbiBGUCByZWdpc3RlciB1c2Ugb3BlcmFuZCwgcGFzcyB0aGUgZmlyc3Qgb25lIGluIFNUKDApIGFuZAorICAgIC8vIHRoZSBzZWNvbmQgb25lIGluIFNUKDEpLgorCisgICAgLy8gRmluZCB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMuCisgICAgdW5zaWduZWQgRmlyc3RGUFJlZ09wID0gfjBVLCBTZWNvbmRGUFJlZ09wID0gfjBVOworICAgIHVuc2lnbmVkIExpdmVNYXNrID0gMDsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZPcCA9IE1JLT5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKCFPcC5pc1JlZygpIHx8IE9wLmdldFJlZygpIDwgWDg2OjpGUDAgfHwgT3AuZ2V0UmVnKCkgPiBYODY6OkZQNikKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBGUCBSZWdpc3RlciB1c2VzIG11c3QgYmUga2lsbHMgdW5sZXNzIHRoZXJlIGFyZSB0d28gdXNlcyBvZiB0aGUgc2FtZQorICAgICAgLy8gcmVnaXN0ZXIsIGluIHdoaWNoIGNhc2Ugb25seSBvbmUgd2lsbCBiZSBhIGtpbGwuCisgICAgICBhc3NlcnQoT3AuaXNVc2UoKSAmJgorICAgICAgICAgICAgIChPcC5pc0tpbGwoKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmtlZCBraWxsLgorICAgICAgICAgICAgICBnZXRGUFJlZyhPcCkgPT0gRmlyc3RGUFJlZ09wIHx8ICAgICAgIC8vIFNlY29uZCBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgTUktPmtpbGxzUmVnaXN0ZXIoT3AuZ2V0UmVnKCkpKSAmJiAgICAvLyBMYXRlciB1c2UgaXMgbWFya2VkIGtpbGwuCisgICAgICAgICAgICAgIlJldCBvbmx5IGRlZnMgb3BlcmFuZHMsIGFuZCB2YWx1ZXMgYXJlbid0IGxpdmUgYmV5b25kIGl0Iik7CisKKyAgICAgIGlmIChGaXJzdEZQUmVnT3AgPT0gfjBVKQorICAgICAgICBGaXJzdEZQUmVnT3AgPSBnZXRGUFJlZyhPcCk7CisgICAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KFNlY29uZEZQUmVnT3AgPT0gfjBVICYmICJNb3JlIHRoYW4gdHdvIGZwIG9wZXJhbmRzISIpOworICAgICAgICBTZWNvbmRGUFJlZ09wID0gZ2V0RlBSZWcoT3ApOworICAgICAgfQorICAgICAgTGl2ZU1hc2sgfD0gKDEgPDwgZ2V0RlBSZWcoT3ApKTsKKworICAgICAgLy8gUmVtb3ZlIHRoZSBvcGVyYW5kIHNvIHRoYXQgbGF0ZXIgcGFzc2VzIGRvbid0IHNlZSBpdC4KKyAgICAgIE1JLT5SZW1vdmVPcGVyYW5kKGkpOworICAgICAgLS1pLCAtLWU7CisgICAgfQorCisgICAgLy8gV2UgbWF5IGhhdmUgYmVlbiBjYXJyeWluZyBzcHVyaW91cyBsaXZlLWlucywgc28gbWFrZSBzdXJlIG9ubHkgdGhlIHJldHVybmVkCisgICAgLy8gcmVnaXN0ZXJzIGFyZSBsZWZ0IGxpdmUuCisgICAgYWRqdXN0TGl2ZVJlZ3MoTGl2ZU1hc2ssIE1JKTsKKyAgICBpZiAoIUxpdmVNYXNrKSByZXR1cm47ICAvLyBRdWljayBjaGVjayB0byBzZWUgaWYgYW55IGFyZSBwb3NzaWJsZS4KKworICAgIC8vIFRoZXJlIGFyZSBvbmx5IGZvdXIgcG9zc2liaWxpdGllcyBoZXJlOgorICAgIC8vIDEpIHdlIGFyZSByZXR1cm5pbmcgYSBzaW5nbGUgRlAgdmFsdWUuICBJbiB0aGlzIGNhc2UsIGl0IGhhcyB0byBiZSBpbgorICAgIC8vICAgIFNUKDApIGFscmVhZHksIHNvIGp1c3QgZGVjbGFyZSBzdWNjZXNzIGJ5IHJlbW92aW5nIHRoZSB2YWx1ZSBmcm9tIHRoZQorICAgIC8vICAgIEZQIFN0YWNrLgorICAgIGlmIChTZWNvbmRGUFJlZ09wID09IH4wVSkgeworICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHRvcCBvZiBzdGFjayBjb250YWlucyB0aGUgcmlnaHQgRlAgcmVnaXN0ZXIuCisgICAgICBhc3NlcnQoU3RhY2tUb3AgPT0gMSAmJiBGaXJzdEZQUmVnT3AgPT0gZ2V0U3RhY2tFbnRyeSgwKSAmJgorICAgICAgICAgICAgICJUb3Agb2Ygc3RhY2sgbm90IHRoZSByaWdodCByZWdpc3RlciBmb3IgUkVUISIpOworICAgICAgCisgICAgICAvLyBPaywgZXZlcnl0aGluZyBpcyBnb29kLCBtYXJrIHRoZSB2YWx1ZSBhcyBub3QgYmVpbmcgb24gdGhlIHN0YWNrCisgICAgICAvLyBhbnltb3JlIHNvIHRoYXQgb3VyIGFzc2VydGlvbiBhYm91dCB0aGUgc3RhY2sgYmVpbmcgZW1wdHkgYXQgZW5kIG9mCisgICAgICAvLyBibG9jayBkb2Vzbid0IGZpcmUuCisgICAgICBTdGFja1RvcCA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHJldHVybmluZyB0d28gdmFsdWVzOgorICAgIC8vIDIpIElmIHJldHVybmluZyB0aGUgc2FtZSB2YWx1ZSBmb3IgYm90aCwgd2Ugb25seSBoYXZlIG9uZSB0aGluZyBpbiB0aGUgRlAKKyAgICAvLyAgICBzdGFjay4gIENvbnNpZGVyOiAgUkVUIEZQMSwgRlAxCisgICAgaWYgKFN0YWNrVG9wID09IDEpIHsKKyAgICAgIGFzc2VydChGaXJzdEZQUmVnT3AgPT0gU2Vjb25kRlBSZWdPcCAmJiBGaXJzdEZQUmVnT3AgPT0gZ2V0U3RhY2tFbnRyeSgwKSYmCisgICAgICAgICAgICAgIlN0YWNrIG1pc2NvbmZpZ3VyYXRpb24gZm9yIFJFVCEiKTsKKyAgICAgIAorICAgICAgLy8gRHVwbGljYXRlIHRoZSBUT1Mgc28gdGhhdCB3ZSByZXR1cm4gaXQgdHdpY2UuICBKdXN0IHBpY2sgc29tZSBvdGhlciBGUHgKKyAgICAgIC8vIHJlZ2lzdGVyIHRvIGhvbGQgaXQuCisgICAgICB1bnNpZ25lZCBOZXdSZWcgPSBnZXRTY3JhdGNoUmVnKCk7CisgICAgICBkdXBsaWNhdGVUb1RvcChGaXJzdEZQUmVnT3AsIE5ld1JlZywgTUkpOworICAgICAgRmlyc3RGUFJlZ09wID0gTmV3UmVnOworICAgIH0KKyAgICAKKyAgICAvLy8gT2theSB3ZSBrbm93IHdlIGhhdmUgdHdvIGRpZmZlcmVudCBGUHggb3BlcmFuZHMgbm93OgorICAgIGFzc2VydChTdGFja1RvcCA9PSAyICYmICJNdXN0IGhhdmUgdHdvIHZhbHVlcyBsaXZlISIpOworICAgIAorICAgIC8vLyAzKSBJZiBTZWNvbmRGUFJlZ09wIGlzIGN1cnJlbnRseSBpbiBTVCgwKSBhbmQgRmlyc3RGUFJlZ09wIGlzIGN1cnJlbnRseQorICAgIC8vLyAgICBpbiBTVCgxKS4gIEluIHRoaXMgY2FzZSwgZW1pdCBhbiBmeGNoLgorICAgIGlmIChnZXRTdGFja0VudHJ5KDApID09IFNlY29uZEZQUmVnT3ApIHsKKyAgICAgIGFzc2VydChnZXRTdGFja0VudHJ5KDEpID09IEZpcnN0RlBSZWdPcCAmJiAiVW5rbm93biByZWdzIGxpdmUiKTsKKyAgICAgIG1vdmVUb1RvcChGaXJzdEZQUmVnT3AsIE1JKTsKKyAgICB9CisgICAgCisgICAgLy8vIDQpIEZpbmFsbHksIEZpcnN0RlBSZWdPcCBtdXN0IGJlIGluIFNUKDApIGFuZCBTZWNvbmRGUFJlZ09wIG11c3QgYmUgaW4KKyAgICAvLy8gU1QoMSkuICBKdXN0IHJlbW92ZSBib3RoIGZyb20gb3VyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHN0YWNrIGFuZCByZXR1cm4uCisgICAgYXNzZXJ0KGdldFN0YWNrRW50cnkoMCkgPT0gRmlyc3RGUFJlZ09wICYmICJVbmtub3duIHJlZ3MgbGl2ZSIpOworICAgIGFzc2VydChnZXRTdGFja0VudHJ5KDEpID09IFNlY29uZEZQUmVnT3AgJiYgIlVua25vd24gcmVncyBsaXZlIik7CisgICAgU3RhY2tUb3AgPSAwOworICAgIHJldHVybjsKKyAgfQorCisgIEkgPSBNQkItPmVyYXNlKEkpOyAgLy8gUmVtb3ZlIHRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24KKworICAvLyBXZSB3YW50IHRvIGxlYXZlIEkgcG9pbnRpbmcgdG8gdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCBidXQgd2hhdCBpZiB3ZQorICAvLyBqdXN0IGVyYXNlZCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24/CisgIGlmIChJID09IE1CQi0+YmVnaW4oKSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiSW5zZXJ0aW5nIGR1bW15IEtJTExcbiIpOworICAgIEkgPSBCdWlsZE1JKCpNQkIsIEksIERlYnVnTG9jKCksIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6S0lMTCkpOworICB9IGVsc2UKKyAgICAtLUk7Cit9CisKKy8vIFRyYW5zbGF0ZSBhIENPUFkgaW5zdHJ1Y3Rpb24gdG8gYSBwc2V1ZG8tb3AgdGhhdCBoYW5kbGVTcGVjaWFsRlAgdW5kZXJzdGFuZHMuCitib29sIEZQUzo6dHJhbnNsYXRlQ29weShNYWNoaW5lSW5zdHIgKk1JKSB7CisgIHVuc2lnbmVkIERzdFJlZyA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICB1bnNpZ25lZCBTcmNSZWcgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKworICBpZiAoRHN0UmVnID09IFg4Njo6U1QwKSB7CisgICAgTUktPnNldERlc2MoVElJLT5nZXQoWDg2OjpGcFNFVF9TVDBfODApKTsKKyAgICBNSS0+UmVtb3ZlT3BlcmFuZCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoRHN0UmVnID09IFg4Njo6U1QxKSB7CisgICAgTUktPnNldERlc2MoVElJLT5nZXQoWDg2OjpGcFNFVF9TVDFfODApKTsKKyAgICBNSS0+UmVtb3ZlT3BlcmFuZCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoU3JjUmVnID09IFg4Njo6U1QwKSB7CisgICAgTUktPnNldERlc2MoVElJLT5nZXQoWDg2OjpGcEdFVF9TVDBfODApKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoU3JjUmVnID09IFg4Njo6U1QxKSB7CisgICAgTUktPnNldERlc2MoVElJLT5nZXQoWDg2OjpGcEdFVF9TVDFfODApKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoWDg2OjpSRlA4MFJlZ0NsYXNzLmNvbnRhaW5zKERzdFJlZywgU3JjUmVnKSkgeworICAgIE1JLT5zZXREZXNjKFRJSS0+Z2V0KFg4Njo6TU9WX0ZwODA4MCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NklTZWxEQUdUb0RBRy5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJU2VsREFHVG9EQUcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDFkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJU2VsREFHVG9EQUcuY3BwCkBAIC0wLDAgKzEsMTk4OSBAQAorLy89PT0tIFg4NklTZWxEQUdUb0RBRy5jcHAgLSBBIERBRyBwYXR0ZXJuIG1hdGNoaW5nIGluc3Qgc2VsZWN0b3IgZm9yIFg4NiAtPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIERBRyBwYXR0ZXJuIG1hdGNoaW5nIGluc3RydWN0aW9uIHNlbGVjdG9yIGZvciBYODYsCisvLyBjb252ZXJ0aW5nIGZyb20gYSBsZWdhbGl6ZWQgZGFnIHRvIGEgWDg2IGRhZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgIng4Ni1pc2VsIgorI2luY2x1ZGUgIlg4Ni5oIgorI2luY2x1ZGUgIlg4Nkluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgIlg4Nk1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJYODZSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJYODZTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJYODZUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1Mb2FkTW92ZWQsICJOdW1iZXIgb2YgbG9hZHMgbW92ZWQgYmVsb3cgVG9rZW5GYWN0b3IiKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm4gTWF0Y2hlciBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbmFtZXNwYWNlIHsKKyAgLy8vIFg4NklTZWxBZGRyZXNzTW9kZSAtIFRoaXMgY29ycmVzcG9uZHMgdG8gWDg2QWRkcmVzc01vZGUsIGJ1dCB1c2VzCisgIC8vLyBTRFZhbHVlJ3MgaW5zdGVhZCBvZiByZWdpc3RlciBudW1iZXJzIGZvciB0aGUgbGVhdmVzIG9mIHRoZSBtYXRjaGVkCisgIC8vLyB0cmVlLgorICBzdHJ1Y3QgWDg2SVNlbEFkZHJlc3NNb2RlIHsKKyAgICBlbnVtIHsKKyAgICAgIFJlZ0Jhc2UsCisgICAgICBGcmFtZUluZGV4QmFzZQorICAgIH0gQmFzZVR5cGU7CisKKyAgICAvLyBUaGlzIGlzIHJlYWxseSBhIHVuaW9uLCBkaXNjcmltaW5hdGVkIGJ5IEJhc2VUeXBlIQorICAgIFNEVmFsdWUgQmFzZV9SZWc7CisgICAgaW50IEJhc2VfRnJhbWVJbmRleDsKKworICAgIHVuc2lnbmVkIFNjYWxlOworICAgIFNEVmFsdWUgSW5kZXhSZWc7IAorICAgIGludDMyX3QgRGlzcDsKKyAgICBTRFZhbHVlIFNlZ21lbnQ7CisgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWOworICAgIGNvbnN0IENvbnN0YW50ICpDUDsKKyAgICBjb25zdCBCbG9ja0FkZHJlc3MgKkJsb2NrQWRkcjsKKyAgICBjb25zdCBjaGFyICpFUzsKKyAgICBpbnQgSlQ7CisgICAgdW5zaWduZWQgQWxpZ247ICAgIC8vIENQIGFsaWdubWVudC4KKyAgICB1bnNpZ25lZCBjaGFyIFN5bWJvbEZsYWdzOyAgLy8gWDg2SUk6Ok1PXyoKKworICAgIFg4NklTZWxBZGRyZXNzTW9kZSgpCisgICAgICA6IEJhc2VUeXBlKFJlZ0Jhc2UpLCBCYXNlX0ZyYW1lSW5kZXgoMCksIFNjYWxlKDEpLCBJbmRleFJlZygpLCBEaXNwKDApLAorICAgICAgICBTZWdtZW50KCksIEdWKDApLCBDUCgwKSwgQmxvY2tBZGRyKDApLCBFUygwKSwgSlQoLTEpLCBBbGlnbigwKSwKKyAgICAgICAgU3ltYm9sRmxhZ3MoWDg2SUk6Ok1PX05PX0ZMQUcpIHsKKyAgICB9CisKKyAgICBib29sIGhhc1N5bWJvbGljRGlzcGxhY2VtZW50KCkgY29uc3QgeworICAgICAgcmV0dXJuIEdWICE9IDAgfHwgQ1AgIT0gMCB8fCBFUyAhPSAwIHx8IEpUICE9IC0xIHx8IEJsb2NrQWRkciAhPSAwOworICAgIH0KKyAgICAKKyAgICBib29sIGhhc0Jhc2VPckluZGV4UmVnKCkgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4UmVnLmdldE5vZGUoKSAhPSAwIHx8IEJhc2VfUmVnLmdldE5vZGUoKSAhPSAwOworICAgIH0KKyAgICAKKyAgICAvLy8gaXNSSVBSZWxhdGl2ZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgYWRkcmVzc2luZyBtb2RlIGlzIGFscmVhZHkgUklQCisgICAgLy8vIHJlbGF0aXZlLgorICAgIGJvb2wgaXNSSVBSZWxhdGl2ZSgpIGNvbnN0IHsKKyAgICAgIGlmIChCYXNlVHlwZSAhPSBSZWdCYXNlKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoUmVnaXN0ZXJTRE5vZGUgKlJlZ05vZGUgPQorICAgICAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxSZWdpc3RlclNETm9kZT4oQmFzZV9SZWcuZ2V0Tm9kZSgpKSkKKyAgICAgICAgcmV0dXJuIFJlZ05vZGUtPmdldFJlZygpID09IFg4Njo6UklQOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldEJhc2VSZWcoU0RWYWx1ZSBSZWcpIHsKKyAgICAgIEJhc2VUeXBlID0gUmVnQmFzZTsKKyAgICAgIEJhc2VfUmVnID0gUmVnOworICAgIH0KKworICAgIHZvaWQgZHVtcCgpIHsKKyAgICAgIGRiZ3MoKSA8PCAiWDg2SVNlbEFkZHJlc3NNb2RlICIgPDwgdGhpcyA8PCAnXG4nOworICAgICAgZGJncygpIDw8ICJCYXNlX1JlZyAiOworICAgICAgaWYgKEJhc2VfUmVnLmdldE5vZGUoKSAhPSAwKQorICAgICAgICBCYXNlX1JlZy5nZXROb2RlKCktPmR1bXAoKTsgCisgICAgICBlbHNlCisgICAgICAgIGRiZ3MoKSA8PCAibnVsIjsKKyAgICAgIGRiZ3MoKSA8PCAiIEJhc2UuRnJhbWVJbmRleCAiIDw8IEJhc2VfRnJhbWVJbmRleCA8PCAnXG4nCisgICAgICAgICAgICAgPDwgIiBTY2FsZSIgPDwgU2NhbGUgPDwgJ1xuJworICAgICAgICAgICAgIDw8ICJJbmRleFJlZyAiOworICAgICAgaWYgKEluZGV4UmVnLmdldE5vZGUoKSAhPSAwKQorICAgICAgICBJbmRleFJlZy5nZXROb2RlKCktPmR1bXAoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJncygpIDw8ICJudWwiOyAKKyAgICAgIGRiZ3MoKSA8PCAiIERpc3AgIiA8PCBEaXNwIDw8ICdcbicKKyAgICAgICAgICAgICA8PCAiR1YgIjsKKyAgICAgIGlmIChHVikKKyAgICAgICAgR1YtPmR1bXAoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJncygpIDw8ICJudWwiOworICAgICAgZGJncygpIDw8ICIgQ1AgIjsKKyAgICAgIGlmIChDUCkKKyAgICAgICAgQ1AtPmR1bXAoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJncygpIDw8ICJudWwiOworICAgICAgZGJncygpIDw8ICdcbicKKyAgICAgICAgICAgICA8PCAiRVMgIjsKKyAgICAgIGlmIChFUykKKyAgICAgICAgZGJncygpIDw8IEVTOworICAgICAgZWxzZQorICAgICAgICBkYmdzKCkgPDwgIm51bCI7CisgICAgICBkYmdzKCkgPDwgIiBKVCIgPDwgSlQgPDwgIiBBbGlnbiIgPDwgQWxpZ24gPDwgJ1xuJzsKKyAgICB9CisgIH07Cit9CisKK25hbWVzcGFjZSB7CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gSVNlbCAtIFg4NiBzcGVjaWZpYyBjb2RlIHRvIHNlbGVjdCBYODYgbWFjaGluZSBpbnN0cnVjdGlvbnMgZm9yCisgIC8vLyBTZWxlY3Rpb25EQUcgb3BlcmF0aW9ucy4KKyAgLy8vCisgIGNsYXNzIFg4NkRBR1RvREFHSVNlbCA6IHB1YmxpYyBTZWxlY3Rpb25EQUdJU2VsIHsKKyAgICAvLy8gWDg2TG93ZXJpbmcgLSBUaGlzIG9iamVjdCBmdWxseSBkZXNjcmliZXMgaG93IHRvIGxvd2VyIExMVk0gY29kZSB0byBhbgorICAgIC8vLyBYODYtc3BlY2lmaWMgU2VsZWN0aW9uREFHLgorICAgIGNvbnN0IFg4NlRhcmdldExvd2VyaW5nICZYODZMb3dlcmluZzsKKworICAgIC8vLyBTdWJ0YXJnZXQgLSBLZWVwIGEgcG9pbnRlciB0byB0aGUgWDg2U3VidGFyZ2V0IGFyb3VuZCBzbyB0aGF0IHdlIGNhbgorICAgIC8vLyBtYWtlIHRoZSByaWdodCBkZWNpc2lvbiB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgZGlmZmVyZW50IHRhcmdldHMuCisgICAgY29uc3QgWDg2U3VidGFyZ2V0ICpTdWJ0YXJnZXQ7CisKKyAgICAvLy8gT3B0Rm9yU2l6ZSAtIElmIHRydWUsIHNlbGVjdG9yIHNob3VsZCB0cnkgdG8gb3B0aW1pemUgZm9yIGNvZGUgc2l6ZQorICAgIC8vLyBpbnN0ZWFkIG9mIHBlcmZvcm1hbmNlLgorICAgIGJvb2wgT3B0Rm9yU2l6ZTsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgWDg2REFHVG9EQUdJU2VsKFg4NlRhcmdldE1hY2hpbmUgJnRtLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkKKyAgICAgIDogU2VsZWN0aW9uREFHSVNlbCh0bSwgT3B0TGV2ZWwpLAorICAgICAgICBYODZMb3dlcmluZygqdG0uZ2V0VGFyZ2V0TG93ZXJpbmcoKSksCisgICAgICAgIFN1YnRhcmdldCgmdG0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKSksCisgICAgICAgIE9wdEZvclNpemUoZmFsc2UpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJYODYgREFHLT5EQUcgSW5zdHJ1Y3Rpb24gU2VsZWN0aW9uIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uRW50cnlDb2RlKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgSXNQcm9maXRhYmxlVG9Gb2xkKFNEVmFsdWUgTiwgU0ROb2RlICpVLCBTRE5vZGUgKlJvb3QpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIFByZXByb2Nlc3NJU2VsREFHKCk7CisKKy8vIEluY2x1ZGUgdGhlIHBpZWNlcyBhdXRvZ2VuZXJhdGVkIGZyb20gdGhlIHRhcmdldCBkZXNjcmlwdGlvbi4KKyNpbmNsdWRlICJYODZHZW5EQUdJU2VsLmluYyIKKworICBwcml2YXRlOgorICAgIFNETm9kZSAqU2VsZWN0KFNETm9kZSAqTik7CisgICAgU0ROb2RlICpTZWxlY3RBdG9taWM2NChTRE5vZGUgKk5vZGUsIHVuc2lnbmVkIE9wYyk7CisgICAgU0ROb2RlICpTZWxlY3RBdG9taWNMb2FkQWRkKFNETm9kZSAqTm9kZSwgRVZUIE5WVCk7CisKKyAgICBib29sIE1hdGNoU2VnbWVudEJhc2VBZGRyZXNzKFNEVmFsdWUgTiwgWDg2SVNlbEFkZHJlc3NNb2RlICZBTSk7CisgICAgYm9vbCBNYXRjaExvYWQoU0RWYWx1ZSBOLCBYODZJU2VsQWRkcmVzc01vZGUgJkFNKTsKKyAgICBib29sIE1hdGNoV3JhcHBlcihTRFZhbHVlIE4sIFg4NklTZWxBZGRyZXNzTW9kZSAmQU0pOworICAgIGJvb2wgTWF0Y2hBZGRyZXNzKFNEVmFsdWUgTiwgWDg2SVNlbEFkZHJlc3NNb2RlICZBTSk7CisgICAgYm9vbCBNYXRjaEFkZHJlc3NSZWN1cnNpdmVseShTRFZhbHVlIE4sIFg4NklTZWxBZGRyZXNzTW9kZSAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCk7CisgICAgYm9vbCBNYXRjaEFkZHJlc3NCYXNlKFNEVmFsdWUgTiwgWDg2SVNlbEFkZHJlc3NNb2RlICZBTSk7CisgICAgYm9vbCBTZWxlY3RBZGRyKFNETm9kZSAqT3AsIFNEVmFsdWUgTiwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmU2NhbGUsIFNEVmFsdWUgJkluZGV4LCBTRFZhbHVlICZEaXNwLAorICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZTZWdtZW50KTsKKyAgICBib29sIFNlbGVjdExFQUFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZTY2FsZSwgU0RWYWx1ZSAmSW5kZXgsIFNEVmFsdWUgJkRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJlNlZ21lbnQpOworICAgIGJvb2wgU2VsZWN0VExTQUREUkFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmU2NhbGUsIFNEVmFsdWUgJkluZGV4LCBTRFZhbHVlICZEaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmU2VnbWVudCk7CisgICAgYm9vbCBTZWxlY3RTY2FsYXJTU0VMb2FkKFNETm9kZSAqUm9vdCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmSW5kZXgsIFNEVmFsdWUgJkRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk5vZGVXaXRoQ2hhaW4pOworICAgIAorICAgIGJvb2wgVHJ5Rm9sZExvYWQoU0ROb2RlICpQLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkluZGV4LCBTRFZhbHVlICZEaXNwLAorICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmU2VnbWVudCk7CisgICAgCisgICAgLy8vIFNlbGVjdElubGluZUFzbU1lbW9yeU9wZXJhbmQgLSBJbXBsZW1lbnQgYWRkcmVzc2luZyBtb2RlIHNlbGVjdGlvbiBmb3IKKyAgICAvLy8gaW5saW5lIGFzbSBleHByZXNzaW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wgU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChjb25zdCBTRFZhbHVlICZPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbnN0cmFpbnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPdXRPcHMpOworICAgIAorICAgIHZvaWQgRW1pdFNwZWNpYWxDb2RlRm9yTWFpbihNYWNoaW5lQmFzaWNCbG9jayAqQkIsIE1hY2hpbmVGcmFtZUluZm8gKk1GSSk7CisKKyAgICBpbmxpbmUgdm9pZCBnZXRBZGRyZXNzT3BlcmFuZHMoWDg2SVNlbEFkZHJlc3NNb2RlICZBTSwgU0RWYWx1ZSAmQmFzZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJlNjYWxlLCBTRFZhbHVlICZJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmRGlzcCwgU0RWYWx1ZSAmU2VnbWVudCkgeworICAgICAgQmFzZSAgPSAoQU0uQmFzZVR5cGUgPT0gWDg2SVNlbEFkZHJlc3NNb2RlOjpGcmFtZUluZGV4QmFzZSkgPworICAgICAgICBDdXJEQUctPmdldFRhcmdldEZyYW1lSW5kZXgoQU0uQmFzZV9GcmFtZUluZGV4LCBUTEkuZ2V0UG9pbnRlclR5KCkpIDoKKyAgICAgICAgQU0uQmFzZV9SZWc7CisgICAgICBTY2FsZSA9IGdldEk4SW1tKEFNLlNjYWxlKTsKKyAgICAgIEluZGV4ID0gQU0uSW5kZXhSZWc7CisgICAgICAvLyBUaGVzZSBhcmUgMzItYml0IGV2ZW4gaW4gNjQtYml0IG1vZGUgc2luY2UgUklQIHJlbGF0aXZlIG9mZnNldAorICAgICAgLy8gaXMgMzItYml0LgorICAgICAgaWYgKEFNLkdWKQorICAgICAgICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEFNLkdWLCBEZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTMyLCBBTS5EaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNLlN5bWJvbEZsYWdzKTsKKyAgICAgIGVsc2UgaWYgKEFNLkNQKQorICAgICAgICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudFBvb2woQU0uQ1AsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU0uQWxpZ24sIEFNLkRpc3AsIEFNLlN5bWJvbEZsYWdzKTsKKyAgICAgIGVsc2UgaWYgKEFNLkVTKQorICAgICAgICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRFeHRlcm5hbFN5bWJvbChBTS5FUywgTVZUOjppMzIsIEFNLlN5bWJvbEZsYWdzKTsKKyAgICAgIGVsc2UgaWYgKEFNLkpUICE9IC0xKQorICAgICAgICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRKdW1wVGFibGUoQU0uSlQsIE1WVDo6aTMyLCBBTS5TeW1ib2xGbGFncyk7CisgICAgICBlbHNlIGlmIChBTS5CbG9ja0FkZHIpCisgICAgICAgIERpc3AgPSBDdXJEQUctPmdldEJsb2NrQWRkcmVzcyhBTS5CbG9ja0FkZHIsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgQU0uU3ltYm9sRmxhZ3MpOworICAgICAgZWxzZQorICAgICAgICBEaXNwID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChBTS5EaXNwLCBNVlQ6OmkzMik7CisKKyAgICAgIGlmIChBTS5TZWdtZW50LmdldE5vZGUoKSkKKyAgICAgICAgU2VnbWVudCA9IEFNLlNlZ21lbnQ7CisgICAgICBlbHNlCisgICAgICAgIFNlZ21lbnQgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0SThJbW0gLSBSZXR1cm4gYSB0YXJnZXQgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLCBvZiB0eXBlCisgICAgLy8vIGk4LgorICAgIGlubGluZSBTRFZhbHVlIGdldEk4SW1tKHVuc2lnbmVkIEltbSkgeworICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoSW1tLCBNVlQ6Omk4KTsKKyAgICB9CisKKyAgICAvLy8gZ2V0STE2SW1tIC0gUmV0dXJuIGEgdGFyZ2V0IGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSwgb2YgdHlwZQorICAgIC8vLyBpMTYuCisgICAgaW5saW5lIFNEVmFsdWUgZ2V0STE2SW1tKHVuc2lnbmVkIEltbSkgeworICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoSW1tLCBNVlQ6OmkxNik7CisgICAgfQorCisgICAgLy8vIGdldEkzMkltbSAtIFJldHVybiBhIHRhcmdldCBjb25zdGFudCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUsIG9mIHR5cGUKKyAgICAvLy8gaTMyLgorICAgIGlubGluZSBTRFZhbHVlIGdldEkzMkltbSh1bnNpZ25lZCBJbW0pIHsKKyAgICAgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEltbSwgTVZUOjppMzIpOworICAgIH0KKworICAgIC8vLyBnZXRHbG9iYWxCYXNlUmVnIC0gUmV0dXJuIGFuIFNETm9kZSB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mCisgICAgLy8vIHRoZSBnbG9iYWwgYmFzZSByZWdpc3Rlci4gT3V0cHV0IGluc3RydWN0aW9ucyByZXF1aXJlZCB0bworICAgIC8vLyBpbml0aWFsaXplIHRoZSBnbG9iYWwgYmFzZSByZWdpc3RlciwgaWYgbmVjZXNzYXJ5LgorICAgIC8vLworICAgIFNETm9kZSAqZ2V0R2xvYmFsQmFzZVJlZygpOworCisgICAgLy8vIGdldFRhcmdldE1hY2hpbmUgLSBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIFRhcmdldE1hY2hpbmUsIGNhc3RlZAorICAgIC8vLyB0byB0aGUgdGFyZ2V0LXNwZWNpZmljIHR5cGUuCisgICAgY29uc3QgWDg2VGFyZ2V0TWFjaGluZSAmZ2V0VGFyZ2V0TWFjaGluZSgpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBYODZUYXJnZXRNYWNoaW5lICY+KFRNKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0SW5zdHJJbmZvIC0gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBUYXJnZXRJbnN0ckluZm8sIGNhc3RlZAorICAgIC8vLyB0byB0aGUgdGFyZ2V0LXNwZWNpZmljIHR5cGUuCisgICAgY29uc3QgWDg2SW5zdHJJbmZvICpnZXRJbnN0ckluZm8oKSB7CisgICAgICByZXR1cm4gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICAgIH0KKyAgfTsKK30KKworCitib29sCitYODZEQUdUb0RBR0lTZWw6OklzUHJvZml0YWJsZVRvRm9sZChTRFZhbHVlIE4sIFNETm9kZSAqVSwgU0ROb2RlICpSb290KSBjb25zdCB7CisgIGlmIChPcHRMZXZlbCA9PSBDb2RlR2VuT3B0OjpOb25lKSByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFOLmhhc09uZVVzZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoTi5nZXRPcGNvZGUoKSAhPSBJU0Q6OkxPQUQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gSWYgTiBpcyBhIGxvYWQsIGRvIGFkZGl0aW9uYWwgcHJvZml0YWJpbGl0eSBjaGVja3MuCisgIGlmIChVID09IFJvb3QpIHsKKyAgICBzd2l0Y2ggKFUtPmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSBYODZJU0Q6OkFERDoKKyAgICBjYXNlIFg4NklTRDo6U1VCOgorICAgIGNhc2UgWDg2SVNEOjpBTkQ6CisgICAgY2FzZSBYODZJU0Q6OlhPUjoKKyAgICBjYXNlIFg4NklTRDo6T1I6CisgICAgY2FzZSBJU0Q6OkFERDoKKyAgICBjYXNlIElTRDo6QUREQzoKKyAgICBjYXNlIElTRDo6QURERToKKyAgICBjYXNlIElTRDo6QU5EOgorICAgIGNhc2UgSVNEOjpPUjoKKyAgICBjYXNlIElTRDo6WE9SOiB7CisgICAgICBTRFZhbHVlIE9wMSA9IFUtPmdldE9wZXJhbmQoMSk7CisKKyAgICAgIC8vIElmIHRoZSBvdGhlciBvcGVyYW5kIGlzIGEgOC1iaXQgaW1tZWRpYXRlIHdlIHNob3VsZCBmb2xkIHRoZSBpbW1lZGlhdGUKKyAgICAgIC8vIGluc3RlYWQuIFRoaXMgcmVkdWNlcyBjb2RlIHNpemUuCisgICAgICAvLyBlLmcuCisgICAgICAvLyBtb3ZsIDQoJWVzcCksICVlYXgKKyAgICAgIC8vIGFkZGwgJDQsICVlYXgKKyAgICAgIC8vIHZzLgorICAgICAgLy8gbW92bCAkNCwgJWVheAorICAgICAgLy8gYWRkbCA0KCVlc3ApLCAlZWF4CisgICAgICAvLyBUaGUgZm9ybWVyIGlzIDIgYnl0ZXMgc2hvcnRlci4gSW4gY2FzZSB3aGVyZSB0aGUgaW5jcmVtZW50IGlzIDEsIHRoZW4KKyAgICAgIC8vIHRoZSBzYXZpbmcgY2FuIGJlIDQgYnl0ZXMgKGJ5IHVzaW5nIGluY2wgJWVheCkuCisgICAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkltbSA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcDEpKQorICAgICAgICBpZiAoSW1tLT5nZXRBUEludFZhbHVlKCkuaXNTaWduZWRJbnROKDgpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gSWYgdGhlIG90aGVyIG9wZXJhbmQgaXMgYSBUTFMgYWRkcmVzcywgd2Ugc2hvdWxkIGZvbGQgaXQgaW5zdGVhZC4KKyAgICAgIC8vIFRoaXMgcHJvZHVjZXMKKyAgICAgIC8vIG1vdmwgICAgJWdzOjAsICVlYXgKKyAgICAgIC8vIGxlYWwgICAgaUBOVFBPRkYoJWVheCksICVlYXgKKyAgICAgIC8vIGluc3RlYWQgb2YKKyAgICAgIC8vIG1vdmwgICAgJGlATlRQT0ZGLCAlZWF4CisgICAgICAvLyBhZGRsICAgICVnczowLCAlZWF4CisgICAgICAvLyBpZiB0aGUgYmxvY2sgYWxzbyBoYXMgYW4gYWNjZXNzIHRvIGEgc2Vjb25kIFRMUyBhZGRyZXNzIHRoaXMgd2lsbCBzYXZlCisgICAgICAvLyBhIGxvYWQuCisgICAgICAvLyBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBhbHNvIHRydWUgZm9yIG5vbiBUTFMgYWRkcmVzc2VzLgorICAgICAgaWYgKE9wMS5nZXRPcGNvZGUoKSA9PSBYODZJU0Q6OldyYXBwZXIpIHsKKyAgICAgICAgU0RWYWx1ZSBWYWwgPSBPcDEuZ2V0T3BlcmFuZCgwKTsKKyAgICAgICAgaWYgKFZhbC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbFRMU0FkZHJlc3MpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIE1vdmVCZWxvd0NhbGxPcmlnQ2hhaW4gLSBSZXBsYWNlIHRoZSBvcmlnaW5hbCBjaGFpbiBvcGVyYW5kIG9mIHRoZSBjYWxsIHdpdGgKKy8vLyBsb2FkJ3MgY2hhaW4gb3BlcmFuZCBhbmQgbW92ZSBsb2FkIGJlbG93IHRoZSBjYWxsJ3MgY2hhaW4gb3BlcmFuZC4KK3N0YXRpYyB2b2lkIE1vdmVCZWxvd09yaWdDaGFpbihTZWxlY3Rpb25EQUcgKkN1ckRBRywgU0RWYWx1ZSBMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2FsbCwgU0RWYWx1ZSBPcmlnQ2hhaW4pIHsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICBTRFZhbHVlIENoYWluID0gT3JpZ0NoYWluLmdldE9wZXJhbmQoMCk7CisgIGlmIChDaGFpbi5nZXROb2RlKCkgPT0gTG9hZC5nZXROb2RlKCkpCisgICAgT3BzLnB1c2hfYmFjayhMb2FkLmdldE9wZXJhbmQoMCkpOworICBlbHNlIHsKKyAgICBhc3NlcnQoQ2hhaW4uZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUb2tlbkZhY3RvciAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBjaGFpbiBvcGVyYW5kIik7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENoYWluLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKENoYWluLmdldE9wZXJhbmQoaSkuZ2V0Tm9kZSgpID09IExvYWQuZ2V0Tm9kZSgpKQorICAgICAgICBPcHMucHVzaF9iYWNrKExvYWQuZ2V0T3BlcmFuZCgwKSk7CisgICAgICBlbHNlCisgICAgICAgIE9wcy5wdXNoX2JhY2soQ2hhaW4uZ2V0T3BlcmFuZChpKSk7CisgICAgU0RWYWx1ZSBOZXdDaGFpbiA9CisgICAgICBDdXJEQUctPmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgTG9hZC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsICZPcHNbMF0sIE9wcy5zaXplKCkpOworICAgIE9wcy5jbGVhcigpOworICAgIE9wcy5wdXNoX2JhY2soTmV3Q2hhaW4pOworICB9CisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBPcmlnQ2hhaW4uZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgT3BzLnB1c2hfYmFjayhPcmlnQ2hhaW4uZ2V0T3BlcmFuZChpKSk7CisgIEN1ckRBRy0+VXBkYXRlTm9kZU9wZXJhbmRzKE9yaWdDaGFpbi5nZXROb2RlKCksICZPcHNbMF0sIE9wcy5zaXplKCkpOworICBDdXJEQUctPlVwZGF0ZU5vZGVPcGVyYW5kcyhMb2FkLmdldE5vZGUoKSwgQ2FsbC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkLmdldE9wZXJhbmQoMSksIExvYWQuZ2V0T3BlcmFuZCgyKSk7CisgIE9wcy5jbGVhcigpOworICBPcHMucHVzaF9iYWNrKFNEVmFsdWUoTG9hZC5nZXROb2RlKCksIDEpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IENhbGwuZ2V0Tm9kZSgpLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBPcHMucHVzaF9iYWNrKENhbGwuZ2V0T3BlcmFuZChpKSk7CisgIEN1ckRBRy0+VXBkYXRlTm9kZU9wZXJhbmRzKENhbGwuZ2V0Tm9kZSgpLCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKK30KKworLy8vIGlzQ2FsbGVlTG9hZCAtIFJldHVybiB0cnVlIGlmIGNhbGwgYWRkcmVzcyBpcyBhIGxvYWQgYW5kIGl0IGNhbiBiZQorLy8vIG1vdmVkIGJlbG93IENBTExTRVFfU1RBUlQgYW5kIHRoZSBjaGFpbnMgbGVhZGluZyB1cCB0byB0aGUgY2FsbC4KKy8vLyBSZXR1cm4gdGhlIENBTExTRVFfU1RBUlQgYnkgcmVmZXJlbmNlIGFzIGEgc2Vjb25kIG91dHB1dC4KKy8vLyBJbiB0aGUgY2FzZSBvZiBhIHRhaWwgY2FsbCwgdGhlcmUgaXNuJ3QgYSBjYWxsc2VxIG5vZGUgYmV0d2VlbiB0aGUgY2FsbAorLy8vIGNoYWluIGFuZCB0aGUgbG9hZC4KK3N0YXRpYyBib29sIGlzQ2FsbGVlTG9hZChTRFZhbHVlIENhbGxlZSwgU0RWYWx1ZSAmQ2hhaW4sIGJvb2wgSGFzQ2FsbFNlcSkgeworICBpZiAoQ2FsbGVlLmdldE5vZGUoKSA9PSBDaGFpbi5nZXROb2RlKCkgfHwgIUNhbGxlZS5oYXNPbmVVc2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIExvYWRTRE5vZGUgKkxEID0gZHluX2Nhc3Q8TG9hZFNETm9kZT4oQ2FsbGVlLmdldE5vZGUoKSk7CisgIGlmICghTEQgfHwKKyAgICAgIExELT5pc1ZvbGF0aWxlKCkgfHwKKyAgICAgIExELT5nZXRBZGRyZXNzaW5nTW9kZSgpICE9IElTRDo6VU5JTkRFWEVEIHx8CisgICAgICBMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpICE9IElTRDo6Tk9OX0VYVExPQUQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE5vdyBsZXQncyBmaW5kIHRoZSBjYWxsc2VxX3N0YXJ0LgorICB3aGlsZSAoSGFzQ2FsbFNlcSAmJiBDaGFpbi5nZXRPcGNvZGUoKSAhPSBJU0Q6OkNBTExTRVFfU1RBUlQpIHsKKyAgICBpZiAoIUNoYWluLmhhc09uZVVzZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIENoYWluID0gQ2hhaW4uZ2V0T3BlcmFuZCgwKTsKKyAgfQorCisgIGlmICghQ2hhaW4uZ2V0TnVtT3BlcmFuZHMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChDaGFpbi5nZXRPcGVyYW5kKDApLmdldE5vZGUoKSA9PSBDYWxsZWUuZ2V0Tm9kZSgpKQorICAgIHJldHVybiB0cnVlOworICBpZiAoQ2hhaW4uZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRva2VuRmFjdG9yICYmCisgICAgICBDYWxsZWUuZ2V0VmFsdWUoMSkuaXNPcGVyYW5kT2YoQ2hhaW4uZ2V0T3BlcmFuZCgwKS5nZXROb2RlKCkpICYmCisgICAgICBDYWxsZWUuZ2V0VmFsdWUoMSkuaGFzT25lVXNlKCkpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBYODZEQUdUb0RBR0lTZWw6OlByZXByb2Nlc3NJU2VsREFHKCkgeworICAvLyBPcHRGb3JTaXplIGlzIHVzZWQgaW4gcGF0dGVybiBwcmVkaWNhdGVzIHRoYXQgaXNlbCBpcyBtYXRjaGluZy4KKyAgT3B0Rm9yU2l6ZSA9IE1GLT5nZXRGdW5jdGlvbigpLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpPcHRpbWl6ZUZvclNpemUpOworICAKKyAgZm9yIChTZWxlY3Rpb25EQUc6OmFsbG5vZGVzX2l0ZXJhdG9yIEkgPSBDdXJEQUctPmFsbG5vZGVzX2JlZ2luKCksCisgICAgICAgRSA9IEN1ckRBRy0+YWxsbm9kZXNfZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgU0ROb2RlICpOID0gSSsrOyAgLy8gUHJlaW5jcmVtZW50IGl0ZXJhdG9yIHRvIGF2b2lkIGludmFsaWRhdGlvbiBpc3N1ZXMuCisKKyAgICBpZiAoT3B0TGV2ZWwgIT0gQ29kZUdlbk9wdDo6Tm9uZSAmJgorICAgICAgICAoTi0+Z2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpDQUxMIHx8CisgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBYODZJU0Q6OlRDX1JFVFVSTikpIHsKKyAgICAgIC8vLyBBbHNvIHRyeSBtb3ZpbmcgY2FsbCBhZGRyZXNzIGxvYWQgZnJvbSBvdXRzaWRlIGNhbGxzZXFfc3RhcnQgdG8ganVzdAorICAgICAgLy8vIGJlZm9yZSB0aGUgY2FsbCB0byBhbGxvdyBpdCB0byBiZSBmb2xkZWQuCisgICAgICAvLy8KKyAgICAgIC8vLyAgICAgW0xvYWQgY2hhaW5dCisgICAgICAvLy8gICAgICAgICBeCisgICAgICAvLy8gICAgICAgICB8CisgICAgICAvLy8gICAgICAgW0xvYWRdCisgICAgICAvLy8gICAgICAgXiAgICBeCisgICAgICAvLy8gICAgICAgfCAgICB8CisgICAgICAvLy8gICAgICAvICAgICAgXC0tCisgICAgICAvLy8gICAgIC8gICAgICAgICAgfAorICAgICAgLy8vW0NBTExTRVFfU1RBUlRdIHwKKyAgICAgIC8vLyAgICAgXiAgICAgICAgICB8CisgICAgICAvLy8gICAgIHwgICAgICAgICAgfAorICAgICAgLy8vIFtMT0FEL0MyUmVnXSAgIHwKKyAgICAgIC8vLyAgICAgfCAgICAgICAgICB8CisgICAgICAvLy8gICAgICBcICAgICAgICAvCisgICAgICAvLy8gICAgICAgXCAgICAgIC8KKyAgICAgIC8vLyAgICAgICBbQ0FMTF0KKyAgICAgIGJvb2wgSGFzQ2FsbFNlcSA9IE4tPmdldE9wY29kZSgpID09IFg4NklTRDo6Q0FMTDsKKyAgICAgIFNEVmFsdWUgQ2hhaW4gPSBOLT5nZXRPcGVyYW5kKDApOworICAgICAgU0RWYWx1ZSBMb2FkICA9IE4tPmdldE9wZXJhbmQoMSk7CisgICAgICBpZiAoIWlzQ2FsbGVlTG9hZChMb2FkLCBDaGFpbiwgSGFzQ2FsbFNlcSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgTW92ZUJlbG93T3JpZ0NoYWluKEN1ckRBRywgTG9hZCwgU0RWYWx1ZShOLCAwKSwgQ2hhaW4pOworICAgICAgKytOdW1Mb2FkTW92ZWQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gTG93ZXIgZnByb3VuZCBhbmQgZnBleHRlbmQgbm9kZXMgdGhhdCB0YXJnZXQgdGhlIEZQIHN0YWNrIHRvIGJlIHN0b3JlIGFuZAorICAgIC8vIGxvYWQgdG8gdGhlIHN0YWNrLiAgVGhpcyBpcyBhIGdyb3NzIGhhY2suICBXZSB3b3VsZCBsaWtlIHRvIHNpbXBseSBtYXJrCisgICAgLy8gdGhlc2UgYXMgYmVpbmcgaWxsZWdhbCwgYnV0IHdoZW4gd2UgZG8gdGhhdCwgbGVnYWxpemUgcHJvZHVjZXMgdGhlc2Ugd2hlbgorICAgIC8vIGl0IGV4cGFuZHMgY2FsbHMsIHRoZW4gZXhwYW5kcyB0aGVzZSBpbiB0aGUgc2FtZSBsZWdhbGl6ZSBwYXNzLiAgV2Ugd291bGQKKyAgICAvLyBsaWtlIGRhZyBjb21iaW5lIHRvIGJlIGFibGUgdG8gaGFjayBvbiB0aGVzZSBiZXR3ZWVuIHRoZSBjYWxsIGV4cGFuc2lvbgorICAgIC8vIGFuZCB0aGUgbm9kZSBsZWdhbGl6YXRpb24uICBBcyBzdWNoIHRoaXMgcGFzcyBiYXNpY2FsbHkgZG9lcyAicmVhbGx5CisgICAgLy8gbGF0ZSIgbGVnYWxpemF0aW9uIG9mIHRoZXNlIGlubGluZSB3aXRoIHRoZSBYODYgaXNlbCBwYXNzLgorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuIG5vdCBjb21waWxlZCB3aXRoIC1PMC4KKyAgICBpZiAoTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpGUF9ST1VORCAmJiBOLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OkZQX0VYVEVORCkKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBTU0UgcmVnaXN0ZXJzLCB0aGVuIHRoaXMgaXMgYSBsZWdhbAorICAgIC8vIGNvbnZlcnNpb24gdGhhdCBzaG91bGQgbm90IGJlIGxvd2VyZWQuCisgICAgRVZUIFNyY1ZUID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKTsKKyAgICBFVlQgRHN0VlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgYm9vbCBTcmNJc1NTRSA9IFg4Nkxvd2VyaW5nLmlzU2NhbGFyRlBUeXBlSW5TU0VSZWcoU3JjVlQpOworICAgIGJvb2wgRHN0SXNTU0UgPSBYODZMb3dlcmluZy5pc1NjYWxhckZQVHlwZUluU1NFUmVnKERzdFZUKTsKKyAgICBpZiAoU3JjSXNTU0UgJiYgRHN0SXNTU0UpCisgICAgICBjb250aW51ZTsKKworICAgIGlmICghU3JjSXNTU0UgJiYgIURzdElzU1NFKSB7CisgICAgICAvLyBJZiB0aGlzIGlzIGFuIEZQU3RhY2sgZXh0ZW5zaW9uLCBpdCBpcyBhIG5vb3AuCisgICAgICBpZiAoTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpGUF9FWFRFTkQpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gSWYgdGhpcyBpcyBhIHZhbHVlLXByZXNlcnZpbmcgRlBTdGFjayB0cnVuY2F0aW9uLCBpdCBpcyBhIG5vb3AuCisgICAgICBpZiAoTi0+Z2V0Q29uc3RhbnRPcGVyYW5kVmFsKDEpKQorICAgICAgICBjb250aW51ZTsKKyAgICB9CisgICAKKyAgICAvLyBIZXJlIHdlIGNvdWxkIGhhdmUgYW4gRlAgc3RhY2sgdHJ1bmNhdGlvbiBvciBhbiBGUFN0YWNrIDwtPiBTU0UgY29udmVydC4KKyAgICAvLyBGUFN0YWNrIGhhcyBleHRsb2FkIGFuZCB0cnVuY3N0b3JlLiAgU1NFIGNhbiBmb2xkIGRpcmVjdCBsb2FkcyBpbnRvIG90aGVyCisgICAgLy8gb3BlcmF0aW9ucy4gIEJhc2VkIG9uIHRoaXMsIGRlY2lkZSB3aGF0IHdlIHdhbnQgdG8gZG8uCisgICAgRVZUIE1lbVZUOworICAgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZQX1JPVU5EKQorICAgICAgTWVtVlQgPSBEc3RWVDsgIC8vIEZQX1JPVU5EIG11c3QgdXNlIERzdFZULCB3ZSBjYW4ndCBkbyBhICd0cnVuYyBsb2FkJy4KKyAgICBlbHNlCisgICAgICBNZW1WVCA9IFNyY0lzU1NFID8gU3JjVlQgOiBEc3RWVDsKKyAgICAKKyAgICBTRFZhbHVlIE1lbVRtcCA9IEN1ckRBRy0+Q3JlYXRlU3RhY2tUZW1wb3JhcnkoTWVtVlQpOworICAgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgICAKKyAgICAvLyBGSVhNRTogb3B0aW1pemUgdGhlIGNhc2Ugd2hlcmUgdGhlIHNyYy9kZXN0IGlzIGEgbG9hZCBvciBzdG9yZT8KKyAgICBTRFZhbHVlIFN0b3JlID0gQ3VyREFHLT5nZXRUcnVuY1N0b3JlKEN1ckRBRy0+Z2V0RW50cnlOb2RlKCksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRtcCwgTlVMTCwgMCwgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgIFNEVmFsdWUgUmVzdWx0ID0gQ3VyREFHLT5nZXRFeHRMb2FkKElTRDo6RVhUTE9BRCwgRHN0VlQsIGRsLCBTdG9yZSwgTWVtVG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE1lbVZULCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgLy8gV2UncmUgYWJvdXQgdG8gcmVwbGFjZSBhbGwgdXNlcyBvZiB0aGUgRlBfUk9VTkQvRlBfRVhURU5EIHdpdGggdGhlCisgICAgLy8gZXh0bG9hZCB3ZSBjcmVhdGVkLiAgVGhpcyB3aWxsIGNhdXNlIGdlbmVyYWwgaGF2b2sgb24gdGhlIGRhZyBiZWNhdXNlCisgICAgLy8gYW55dGhpbmcgYmVsb3cgdGhlIGNvbnZlcnNpb24gY291bGQgYmUgZm9sZGVkIGludG8gb3RoZXIgZXhpc3Rpbmcgbm9kZXMuCisgICAgLy8gVG8gYXZvaWQgaW52YWxpZGF0aW5nICdJJywgYmFjayBpdCB1cCB0byB0aGUgY29udmVydCBub2RlLgorICAgIC0tSTsKKyAgICBDdXJEQUctPlJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgoU0RWYWx1ZShOLCAwKSwgUmVzdWx0KTsKKyAgICAKKyAgICAvLyBOb3cgdGhhdCB3ZSBkaWQgdGhhdCwgdGhlIG5vZGUgaXMgZGVhZC4gIEluY3JlbWVudCB0aGUgaXRlcmF0b3IgdG8gdGhlCisgICAgLy8gbmV4dCBub2RlIHRvIHByb2Nlc3MsIHRoZW4gZGVsZXRlIE4uCisgICAgKytJOworICAgIEN1ckRBRy0+RGVsZXRlTm9kZShOKTsKKyAgfSAgCit9CisKKworLy8vIEVtaXRTcGVjaWFsQ29kZUZvck1haW4gLSBFbWl0IGFueSBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgb25seSBpbgorLy8vIHRoZSBtYWluIGZ1bmN0aW9uLgordm9pZCBYODZEQUdUb0RBR0lTZWw6OkVtaXRTcGVjaWFsQ29kZUZvck1haW4oTWFjaGluZUJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZyYW1lSW5mbyAqTUZJKSB7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gVE0uZ2V0SW5zdHJJbmZvKCk7CisgIGlmIChTdWJ0YXJnZXQtPmlzVGFyZ2V0Q3lnTWluZygpKQorICAgIEJ1aWxkTUkoQkIsIERlYnVnTG9jKCksCisgICAgICAgICAgICBUSUktPmdldChYODY6OkNBTExwY3JlbDMyKSkuYWRkRXh0ZXJuYWxTeW1ib2woIl9fbWFpbiIpOworfQorCit2b2lkIFg4NkRBR1RvREFHSVNlbDo6RW1pdEZ1bmN0aW9uRW50cnlDb2RlKCkgeworICAvLyBJZiB0aGlzIGlzIG1haW4sIGVtaXQgc3BlY2lhbCBjb2RlIGZvciBtYWluLgorICBpZiAoY29uc3QgRnVuY3Rpb24gKkZuID0gTUYtPmdldEZ1bmN0aW9uKCkpCisgICAgaWYgKEZuLT5oYXNFeHRlcm5hbExpbmthZ2UoKSAmJiBGbi0+Z2V0TmFtZSgpID09ICJtYWluIikKKyAgICAgIEVtaXRTcGVjaWFsQ29kZUZvck1haW4oTUYtPmJlZ2luKCksIE1GLT5nZXRGcmFtZUluZm8oKSk7Cit9CisKKworYm9vbCBYODZEQUdUb0RBR0lTZWw6Ok1hdGNoU2VnbWVudEJhc2VBZGRyZXNzKFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZJU2VsQWRkcmVzc01vZGUgJkFNKSB7CisgIGFzc2VydChOLmdldE9wY29kZSgpID09IFg4NklTRDo6U2VnbWVudEJhc2VBZGRyZXNzKTsKKyAgU0RWYWx1ZSBTZWdtZW50ID0gTi5nZXRPcGVyYW5kKDApOworCisgIGlmIChBTS5TZWdtZW50LmdldE5vZGUoKSA9PSAwKSB7CisgICAgQU0uU2VnbWVudCA9IFNlZ21lbnQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWDg2REFHVG9EQUdJU2VsOjpNYXRjaExvYWQoU0RWYWx1ZSBOLCBYODZJU2VsQWRkcmVzc01vZGUgJkFNKSB7CisgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGlzIHZhbGlkIGJlY2F1c2UgdGhlIEdOVSBUTFMgbW9kZWwgZGVmaW5lcyB0aGF0CisgIC8vIGdzOjAgKG9yIGZzOjAgb24gWDg2LTY0KSBjb250YWlucyBpdHMgb3duIGFkZHJlc3MuCisgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBodHRwOi8vcGVvcGxlLnJlZGhhdC5jb20vZHJlcHBlci90bHMucGRmCisKKyAgU0RWYWx1ZSBBZGRyZXNzID0gTi5nZXRPcGVyYW5kKDEpOworICBpZiAoQWRkcmVzcy5nZXRPcGNvZGUoKSA9PSBYODZJU0Q6OlNlZ21lbnRCYXNlQWRkcmVzcyAmJgorICAgICAgIU1hdGNoU2VnbWVudEJhc2VBZGRyZXNzIChBZGRyZXNzLCBBTSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gTWF0Y2hXcmFwcGVyIC0gVHJ5IHRvIG1hdGNoIFg4NklTRDo6V3JhcHBlciBhbmQgWDg2SVNEOjpXcmFwcGVyUklQIG5vZGVzCisvLy8gaW50byBhbiBhZGRyZXNzaW5nIG1vZGUuICBUaGVzZSB3cmFwIHRoaW5ncyB0aGF0IHdpbGwgcmVzb2x2ZSBkb3duIGludG8gYQorLy8vIHN5bWJvbCByZWZlcmVuY2UuICBJZiBubyBtYXRjaCBpcyBwb3NzaWJsZSwgdGhpcyByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBpdAorLy8vIHJldHVybnMgZmFsc2UuCitib29sIFg4NkRBR1RvREFHSVNlbDo6TWF0Y2hXcmFwcGVyKFNEVmFsdWUgTiwgWDg2SVNlbEFkZHJlc3NNb2RlICZBTSkgeworICAvLyBJZiB0aGUgYWRkcmVzc2luZyBtb2RlIGFscmVhZHkgaGFzIGEgc3ltYm9sIGFzIHRoZSBkaXNwbGFjZW1lbnQsIHdlIGNhbgorICAvLyBuZXZlciBtYXRjaCBhbm90aGVyIHN5bWJvbC4KKyAgaWYgKEFNLmhhc1N5bWJvbGljRGlzcGxhY2VtZW50KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgU0RWYWx1ZSBOMCA9IE4uZ2V0T3BlcmFuZCgwKTsKKyAgQ29kZU1vZGVsOjpNb2RlbCBNID0gVE0uZ2V0Q29kZU1vZGVsKCk7CisKKyAgLy8gSGFuZGxlIFg4Ni02NCByaXAtcmVsYXRpdmUgYWRkcmVzc2VzLiAgV2UgY2hlY2sgdGhpcyBiZWZvcmUgY2hlY2tpbmcgZGlyZWN0CisgIC8vIGZvbGRpbmcgYmVjYXVzZSBSSVAgaXMgcHJlZmVyYWJsZSB0byBub24tUklQIGFjY2Vzc2VzLgorICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkgJiYKKyAgICAgIC8vIFVuZGVyIFg4Ni02NCBub24tc21hbGwgY29kZSBtb2RlbCwgR1YgKGFuZCBmcmllbmRzKSBhcmUgNjQtYml0cywgc28KKyAgICAgIC8vIHRoZXkgY2Fubm90IGJlIGZvbGRlZCBpbnRvIGltbWVkaWF0ZSBmaWVsZHMuCisgICAgICAvLyBGSVhNRTogVGhpcyBjYW4gYmUgaW1wcm92ZWQgZm9yIGtlcm5lbCBhbmQgb3RoZXIgbW9kZWxzPworICAgICAgKE0gPT0gQ29kZU1vZGVsOjpTbWFsbCB8fCBNID09IENvZGVNb2RlbDo6S2VybmVsKSAmJgorICAgICAgLy8gQmFzZSBhbmQgaW5kZXggcmVnIG11c3QgYmUgMCBpbiBvcmRlciB0byB1c2UgJXJpcCBhcyBiYXNlIGFuZCBsb3dlcmluZworICAgICAgLy8gbXVzdCBhbGxvdyBSSVAuCisgICAgICAhQU0uaGFzQmFzZU9ySW5kZXhSZWcoKSAmJiBOLmdldE9wY29kZSgpID09IFg4NklTRDo6V3JhcHBlclJJUCkgeworICAgIGlmIChHbG9iYWxBZGRyZXNzU0ROb2RlICpHID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oTjApKSB7CisgICAgICBpbnQ2NF90IE9mZnNldCA9IEFNLkRpc3AgKyBHLT5nZXRPZmZzZXQoKTsKKyAgICAgIGlmICghWDg2Ojppc09mZnNldFN1aXRhYmxlRm9yQ29kZU1vZGVsKE9mZnNldCwgTSkpIHJldHVybiB0cnVlOworICAgICAgQU0uR1YgPSBHLT5nZXRHbG9iYWwoKTsKKyAgICAgIEFNLkRpc3AgPSBPZmZzZXQ7CisgICAgICBBTS5TeW1ib2xGbGFncyA9IEctPmdldFRhcmdldEZsYWdzKCk7CisgICAgfSBlbHNlIGlmIChDb25zdGFudFBvb2xTRE5vZGUgKkNQID0gZHluX2Nhc3Q8Q29uc3RhbnRQb29sU0ROb2RlPihOMCkpIHsKKyAgICAgIGludDY0X3QgT2Zmc2V0ID0gQU0uRGlzcCArIENQLT5nZXRPZmZzZXQoKTsKKyAgICAgIGlmICghWDg2Ojppc09mZnNldFN1aXRhYmxlRm9yQ29kZU1vZGVsKE9mZnNldCwgTSkpIHJldHVybiB0cnVlOworICAgICAgQU0uQ1AgPSBDUC0+Z2V0Q29uc3RWYWwoKTsKKyAgICAgIEFNLkFsaWduID0gQ1AtPmdldEFsaWdubWVudCgpOworICAgICAgQU0uRGlzcCA9IE9mZnNldDsKKyAgICAgIEFNLlN5bWJvbEZsYWdzID0gQ1AtPmdldFRhcmdldEZsYWdzKCk7CisgICAgfSBlbHNlIGlmIChFeHRlcm5hbFN5bWJvbFNETm9kZSAqUyA9IGR5bl9jYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPihOMCkpIHsKKyAgICAgIEFNLkVTID0gUy0+Z2V0U3ltYm9sKCk7CisgICAgICBBTS5TeW1ib2xGbGFncyA9IFMtPmdldFRhcmdldEZsYWdzKCk7CisgICAgfSBlbHNlIGlmIChKdW1wVGFibGVTRE5vZGUgKkogPSBkeW5fY2FzdDxKdW1wVGFibGVTRE5vZGU+KE4wKSkgeworICAgICAgQU0uSlQgPSBKLT5nZXRJbmRleCgpOworICAgICAgQU0uU3ltYm9sRmxhZ3MgPSBKLT5nZXRUYXJnZXRGbGFncygpOworICAgIH0gZWxzZSB7CisgICAgICBBTS5CbG9ja0FkZHIgPSBjYXN0PEJsb2NrQWRkcmVzc1NETm9kZT4oTjApLT5nZXRCbG9ja0FkZHJlc3MoKTsKKyAgICAgIEFNLlN5bWJvbEZsYWdzID0gY2FzdDxCbG9ja0FkZHJlc3NTRE5vZGU+KE4wKS0+Z2V0VGFyZ2V0RmxhZ3MoKTsKKyAgICB9CisKKyAgICBpZiAoTi5nZXRPcGNvZGUoKSA9PSBYODZJU0Q6OldyYXBwZXJSSVApCisgICAgICBBTS5zZXRCYXNlUmVnKEN1ckRBRy0+Z2V0UmVnaXN0ZXIoWDg2OjpSSVAsIE1WVDo6aTY0KSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZW4gZ2xvYmFscyBmaXQgaW4gb3VyIGltbWVkaWF0ZSBmaWVsZDogVGhpcyBpcyB0cnVlIGZvcgorICAvLyBYODYtMzIgYWx3YXlzIGFuZCBYODYtNjQgd2hlbiBpbiAtc3RhdGljIC1tY21vZGVsPXNtYWxsIG1vZGUuICBJbiA2NC1iaXQKKyAgLy8gbW9kZSwgdGhpcyByZXN1bHRzIGluIGEgbm9uLVJJUC1yZWxhdGl2ZSBjb21wdXRhdGlvbi4KKyAgaWYgKCFTdWJ0YXJnZXQtPmlzNjRCaXQoKSB8fAorICAgICAgKChNID09IENvZGVNb2RlbDo6U21hbGwgfHwgTSA9PSBDb2RlTW9kZWw6Oktlcm5lbCkgJiYKKyAgICAgICBUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6U3RhdGljKSkgeworICAgIGlmIChHbG9iYWxBZGRyZXNzU0ROb2RlICpHID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oTjApKSB7CisgICAgICBBTS5HViA9IEctPmdldEdsb2JhbCgpOworICAgICAgQU0uRGlzcCArPSBHLT5nZXRPZmZzZXQoKTsKKyAgICAgIEFNLlN5bWJvbEZsYWdzID0gRy0+Z2V0VGFyZ2V0RmxhZ3MoKTsKKyAgICB9IGVsc2UgaWYgKENvbnN0YW50UG9vbFNETm9kZSAqQ1AgPSBkeW5fY2FzdDxDb25zdGFudFBvb2xTRE5vZGU+KE4wKSkgeworICAgICAgQU0uQ1AgPSBDUC0+Z2V0Q29uc3RWYWwoKTsKKyAgICAgIEFNLkFsaWduID0gQ1AtPmdldEFsaWdubWVudCgpOworICAgICAgQU0uRGlzcCArPSBDUC0+Z2V0T2Zmc2V0KCk7CisgICAgICBBTS5TeW1ib2xGbGFncyA9IENQLT5nZXRUYXJnZXRGbGFncygpOworICAgIH0gZWxzZSBpZiAoRXh0ZXJuYWxTeW1ib2xTRE5vZGUgKlMgPSBkeW5fY2FzdDxFeHRlcm5hbFN5bWJvbFNETm9kZT4oTjApKSB7CisgICAgICBBTS5FUyA9IFMtPmdldFN5bWJvbCgpOworICAgICAgQU0uU3ltYm9sRmxhZ3MgPSBTLT5nZXRUYXJnZXRGbGFncygpOworICAgIH0gZWxzZSBpZiAoSnVtcFRhYmxlU0ROb2RlICpKID0gZHluX2Nhc3Q8SnVtcFRhYmxlU0ROb2RlPihOMCkpIHsKKyAgICAgIEFNLkpUID0gSi0+Z2V0SW5kZXgoKTsKKyAgICAgIEFNLlN5bWJvbEZsYWdzID0gSi0+Z2V0VGFyZ2V0RmxhZ3MoKTsKKyAgICB9IGVsc2UgeworICAgICAgQU0uQmxvY2tBZGRyID0gY2FzdDxCbG9ja0FkZHJlc3NTRE5vZGU+KE4wKS0+Z2V0QmxvY2tBZGRyZXNzKCk7CisgICAgICBBTS5TeW1ib2xGbGFncyA9IGNhc3Q8QmxvY2tBZGRyZXNzU0ROb2RlPihOMCktPmdldFRhcmdldEZsYWdzKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLy8gTWF0Y2hBZGRyZXNzIC0gQWRkIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3NpbmcgbW9kZSwKKy8vLyByZXR1cm5pbmcgdHJ1ZSBpZiBpdCBjYW5ub3QgYmUgZG9uZS4gIFRoaXMganVzdCBwYXR0ZXJuIG1hdGNoZXMgZm9yIHRoZQorLy8vIGFkZHJlc3NpbmcgbW9kZS4KK2Jvb2wgWDg2REFHVG9EQUdJU2VsOjpNYXRjaEFkZHJlc3MoU0RWYWx1ZSBOLCBYODZJU2VsQWRkcmVzc01vZGUgJkFNKSB7CisgIGlmIChNYXRjaEFkZHJlc3NSZWN1cnNpdmVseShOLCBBTSwgMCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gUG9zdC1wcm9jZXNzaW5nOiBDb252ZXJ0IGxlYSgsJXJlZywyKSB0byBsZWEoJXJlZywlcmVnKSwgd2hpY2ggaGFzCisgIC8vIGEgc21hbGxlciBlbmNvZGluZyBhbmQgYXZvaWRzIGEgc2NhbGVkLWluZGV4LgorICBpZiAoQU0uU2NhbGUgPT0gMiAmJgorICAgICAgQU0uQmFzZVR5cGUgPT0gWDg2SVNlbEFkZHJlc3NNb2RlOjpSZWdCYXNlICYmCisgICAgICBBTS5CYXNlX1JlZy5nZXROb2RlKCkgPT0gMCkgeworICAgIEFNLkJhc2VfUmVnID0gQU0uSW5kZXhSZWc7CisgICAgQU0uU2NhbGUgPSAxOworICB9CisKKyAgLy8gUG9zdC1wcm9jZXNzaW5nOiBDb252ZXJ0IGZvbyB0byBmb28oJXJpcCksIGV2ZW4gaW4gbm9uLVBJQyBtb2RlLAorICAvLyBiZWNhdXNlIGl0IGhhcyBhIHNtYWxsZXIgZW5jb2RpbmcuCisgIC8vIFRPRE86IFdoaWNoIG90aGVyIGNvZGUgbW9kZWxzIGNhbiB1c2UgdGhpcz8KKyAgaWYgKFRNLmdldENvZGVNb2RlbCgpID09IENvZGVNb2RlbDo6U21hbGwgJiYKKyAgICAgIFN1YnRhcmdldC0+aXM2NEJpdCgpICYmCisgICAgICBBTS5TY2FsZSA9PSAxICYmCisgICAgICBBTS5CYXNlVHlwZSA9PSBYODZJU2VsQWRkcmVzc01vZGU6OlJlZ0Jhc2UgJiYKKyAgICAgIEFNLkJhc2VfUmVnLmdldE5vZGUoKSA9PSAwICYmCisgICAgICBBTS5JbmRleFJlZy5nZXROb2RlKCkgPT0gMCAmJgorICAgICAgQU0uU3ltYm9sRmxhZ3MgPT0gWDg2SUk6Ok1PX05PX0ZMQUcgJiYKKyAgICAgIEFNLmhhc1N5bWJvbGljRGlzcGxhY2VtZW50KCkpCisgICAgQU0uQmFzZV9SZWcgPSBDdXJEQUctPmdldFJlZ2lzdGVyKFg4Njo6UklQLCBNVlQ6Omk2NCk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNMb2dpY2FsbHlBZGRXaXRoQ29uc3RhbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG5vZGUgaXMgc2VtYW50aWNhbGx5IGFuCisvLy8gYWRkIG9mIGEgdmFsdWUgd2l0aCBhIGNvbnN0YW50aW50Lgorc3RhdGljIGJvb2wgaXNMb2dpY2FsbHlBZGRXaXRoQ29uc3RhbnQoU0RWYWx1ZSBWLCBTZWxlY3Rpb25EQUcgKkN1ckRBRykgeworICAvLyBDaGVjayBmb3IgKGFkZCB4LCBDc3QpCisgIGlmIChWLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkKKyAgICByZXR1cm4gaXNhPENvbnN0YW50U0ROb2RlPihWLT5nZXRPcGVyYW5kKDEpKTsKKworICAvLyBDaGVjayBmb3IgKG9yIHgsIENzdCksIHdoZXJlIENzdCAmIHggPT0gMC4KKyAgaWYgKFYtPmdldE9wY29kZSgpICE9IElTRDo6T1IgfHwKKyAgICAgICFpc2E8Q29uc3RhbnRTRE5vZGU+KFYtPmdldE9wZXJhbmQoMSkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIEhhbmRsZSAiWCB8IEMiIGFzICJYICsgQyIgaWZmIFggaXMga25vd24gdG8gaGF2ZSBDIGJpdHMgY2xlYXIuCisgIENvbnN0YW50U0ROb2RlICpDTiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KFYtPmdldE9wZXJhbmQoMSkpOworICAgIAorICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIExIUyAmIEMgaXMgemVyby4KKyAgcmV0dXJuIEN1ckRBRy0+TWFza2VkVmFsdWVJc1plcm8oVi0+Z2V0T3BlcmFuZCgwKSwgQ04tPmdldEFQSW50VmFsdWUoKSk7Cit9CisKK2Jvb2wgWDg2REFHVG9EQUdJU2VsOjpNYXRjaEFkZHJlc3NSZWN1cnNpdmVseShTRFZhbHVlIE4sIFg4NklTZWxBZGRyZXNzTW9kZSAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGgpIHsKKyAgYm9vbCBpczY0Qml0ID0gU3VidGFyZ2V0LT5pczY0Qml0KCk7CisgIERlYnVnTG9jIGRsID0gTi5nZXREZWJ1Z0xvYygpOworICBERUJVRyh7CisgICAgICBkYmdzKCkgPDwgIk1hdGNoQWRkcmVzczogIjsKKyAgICAgIEFNLmR1bXAoKTsKKyAgICB9KTsKKyAgLy8gTGltaXQgcmVjdXJzaW9uLgorICBpZiAoRGVwdGggPiA1KQorICAgIHJldHVybiBNYXRjaEFkZHJlc3NCYXNlKE4sIEFNKTsKKworICBDb2RlTW9kZWw6Ok1vZGVsIE0gPSBUTS5nZXRDb2RlTW9kZWwoKTsKKworICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSAlcmlwIHJlbGF0aXZlIGFkZHJlc3MsIHdlIGNhbiBvbmx5IG1lcmdlIGltbWVkaWF0ZXMKKyAgLy8gaW50byBpdC4gIEluc3RlYWQgb2YgaGFuZGxpbmcgdGhpcyBpbiBldmVyeSBjYXNlLCB3ZSBoYW5kbGUgaXQgaGVyZS4KKyAgLy8gUklQIHJlbGF0aXZlIGFkZHJlc3Npbmc6ICVyaXAgKyAzMi1iaXQgZGlzcGxhY2VtZW50IQorICBpZiAoQU0uaXNSSVBSZWxhdGl2ZSgpKSB7CisgICAgLy8gRklYTUU6IEp1bXBUYWJsZSBhbmQgRXh0ZXJuYWxTeW1ib2wgYWRkcmVzcyBjdXJyZW50bHkgZG9uJ3QgbGlrZQorICAgIC8vIGRpc3BsYWNlbWVudHMuICBJdCBpc24ndCB2ZXJ5IGltcG9ydGFudCwgYnV0IHRoaXMgc2hvdWxkIGJlIGZpeGVkIGZvcgorICAgIC8vIGNvbnNpc3RlbmN5LgorICAgIGlmICghQU0uRVMgJiYgQU0uSlQgIT0gLTEpIHJldHVybiB0cnVlOworCisgICAgaWYgKENvbnN0YW50U0ROb2RlICpDc3QgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTikpIHsKKyAgICAgIGludDY0X3QgVmFsID0gQU0uRGlzcCArIENzdC0+Z2V0U0V4dFZhbHVlKCk7CisgICAgICBpZiAoWDg2Ojppc09mZnNldFN1aXRhYmxlRm9yQ29kZU1vZGVsKFZhbCwgTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU0uaGFzU3ltYm9saWNEaXNwbGFjZW1lbnQoKSkpIHsKKyAgICAgICAgQU0uRGlzcCA9IFZhbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN3aXRjaCAoTi5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6OkNvbnN0YW50OiB7CisgICAgdWludDY0X3QgVmFsID0gY2FzdDxDb25zdGFudFNETm9kZT4oTiktPmdldFNFeHRWYWx1ZSgpOworICAgIGlmICghaXM2NEJpdCB8fAorICAgICAgICBYODY6OmlzT2Zmc2V0U3VpdGFibGVGb3JDb2RlTW9kZWwoQU0uRGlzcCArIFZhbCwgTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNLmhhc1N5bWJvbGljRGlzcGxhY2VtZW50KCkpKSB7CisgICAgICBBTS5EaXNwICs9IFZhbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIFg4NklTRDo6U2VnbWVudEJhc2VBZGRyZXNzOgorICAgIGlmICghTWF0Y2hTZWdtZW50QmFzZUFkZHJlc3MoTiwgQU0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGJyZWFrOworCisgIGNhc2UgWDg2SVNEOjpXcmFwcGVyOgorICBjYXNlIFg4NklTRDo6V3JhcHBlclJJUDoKKyAgICBpZiAoIU1hdGNoV3JhcHBlcihOLCBBTSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYnJlYWs7CisKKyAgY2FzZSBJU0Q6OkxPQUQ6CisgICAgaWYgKCFNYXRjaExvYWQoTiwgQU0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGJyZWFrOworCisgIGNhc2UgSVNEOjpGcmFtZUluZGV4OgorICAgIGlmIChBTS5CYXNlVHlwZSA9PSBYODZJU2VsQWRkcmVzc01vZGU6OlJlZ0Jhc2UKKyAgICAgICAgJiYgQU0uQmFzZV9SZWcuZ2V0Tm9kZSgpID09IDApIHsKKyAgICAgIEFNLkJhc2VUeXBlID0gWDg2SVNlbEFkZHJlc3NNb2RlOjpGcmFtZUluZGV4QmFzZTsKKyAgICAgIEFNLkJhc2VfRnJhbWVJbmRleCA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oTiktPmdldEluZGV4KCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgSVNEOjpTSEw6CisgICAgaWYgKEFNLkluZGV4UmVnLmdldE5vZGUoKSAhPSAwIHx8IEFNLlNjYWxlICE9IDEpCisgICAgICBicmVhazsKKyAgICAgIAorICAgIGlmIChDb25zdGFudFNETm9kZQorICAgICAgICAgICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHVuc2lnbmVkIFZhbCA9IENOLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIC8vIE5vdGUgdGhhdCB3ZSBoYW5kbGUgeDw8MSBhcyAoLHgsMikgcmF0aGVyIHRoYW4gKHgseCkgaGVyZSBzbworICAgICAgLy8gdGhhdCB0aGUgYmFzZSBvcGVyYW5kIHJlbWFpbnMgZnJlZSBmb3IgZnVydGhlciBtYXRjaGluZy4gSWYKKyAgICAgIC8vIHRoZSBiYXNlIGRvZXNuJ3QgZW5kIHVwIGdldHRpbmcgdXNlZCwgYSBwb3N0LXByb2Nlc3Npbmcgc3RlcAorICAgICAgLy8gaW4gTWF0Y2hBZGRyZXNzIHR1cm5zICgseCwyKSBpbnRvICh4LHgpLCB3aGljaCBpcyBjaGVhcGVyLgorICAgICAgaWYgKFZhbCA9PSAxIHx8IFZhbCA9PSAyIHx8IFZhbCA9PSAzKSB7CisgICAgICAgIEFNLlNjYWxlID0gMSA8PCBWYWw7CisgICAgICAgIFNEVmFsdWUgU2hWYWwgPSBOLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKTsKKworICAgICAgICAvLyBPa2F5LCB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBhIHNjYWxlIGJ5IG5vdy4gIEhvd2V2ZXIsIGlmIHRoZSBzY2FsZWQKKyAgICAgICAgLy8gdmFsdWUgaXMgYW4gYWRkIG9mIHNvbWV0aGluZyBhbmQgYSBjb25zdGFudCwgd2UgY2FuIGZvbGQgdGhlCisgICAgICAgIC8vIGNvbnN0YW50IGludG8gdGhlIGRpc3AgZmllbGQgaGVyZS4KKyAgICAgICAgaWYgKGlzTG9naWNhbGx5QWRkV2l0aENvbnN0YW50KFNoVmFsLCBDdXJEQUcpKSB7CisgICAgICAgICAgQU0uSW5kZXhSZWcgPSBTaFZhbC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgQ29uc3RhbnRTRE5vZGUgKkFkZFZhbCA9CisgICAgICAgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihTaFZhbC5nZXROb2RlKCktPmdldE9wZXJhbmQoMSkpOworICAgICAgICAgIHVpbnQ2NF90IERpc3AgPSBBTS5EaXNwICsgKEFkZFZhbC0+Z2V0U0V4dFZhbHVlKCkgPDwgVmFsKTsKKyAgICAgICAgICBpZiAoIWlzNjRCaXQgfHwKKyAgICAgICAgICAgICAgWDg2Ojppc09mZnNldFN1aXRhYmxlRm9yQ29kZU1vZGVsKERpc3AsIE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTS5oYXNTeW1ib2xpY0Rpc3BsYWNlbWVudCgpKSkKKyAgICAgICAgICAgIEFNLkRpc3AgPSBEaXNwOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFNLkluZGV4UmVnID0gU2hWYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQU0uSW5kZXhSZWcgPSBTaFZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgYnJlYWs7CisgICAgfQorCisgIGNhc2UgSVNEOjpTTVVMX0xPSEk6CisgIGNhc2UgSVNEOjpVTVVMX0xPSEk6CisgICAgLy8gQSBtdWxfbG9oaSB3aGVyZSB3ZSBuZWVkIHRoZSBsb3cgcGFydCBjYW4gYmUgZm9sZGVkIGFzIGEgcGxhaW4gbXVsdGlwbHkuCisgICAgaWYgKE4uZ2V0UmVzTm8oKSAhPSAwKSBicmVhazsKKyAgICAvLyBGQUxMIFRIUk9VR0gKKyAgY2FzZSBJU0Q6Ok1VTDoKKyAgY2FzZSBYODZJU0Q6Ok1VTF9JTU06CisgICAgLy8gWCpbMyw1LDldIC0+IFgrWCpbMiw0LDhdCisgICAgaWYgKEFNLkJhc2VUeXBlID09IFg4NklTZWxBZGRyZXNzTW9kZTo6UmVnQmFzZSAmJgorICAgICAgICBBTS5CYXNlX1JlZy5nZXROb2RlKCkgPT0gMCAmJgorICAgICAgICBBTS5JbmRleFJlZy5nZXROb2RlKCkgPT0gMCkgeworICAgICAgaWYgKENvbnN0YW50U0ROb2RlCisgICAgICAgICAgICAqQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXROb2RlKCktPmdldE9wZXJhbmQoMSkpKQorICAgICAgICBpZiAoQ04tPmdldFpFeHRWYWx1ZSgpID09IDMgfHwgQ04tPmdldFpFeHRWYWx1ZSgpID09IDUgfHwKKyAgICAgICAgICAgIENOLT5nZXRaRXh0VmFsdWUoKSA9PSA5KSB7CisgICAgICAgICAgQU0uU2NhbGUgPSB1bnNpZ25lZChDTi0+Z2V0WkV4dFZhbHVlKCkpLTE7CisKKyAgICAgICAgICBTRFZhbHVlIE11bFZhbCA9IE4uZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApOworICAgICAgICAgIFNEVmFsdWUgUmVnOworCisgICAgICAgICAgLy8gT2theSwgd2Uga25vdyB0aGF0IHdlIGhhdmUgYSBzY2FsZSBieSBub3cuICBIb3dldmVyLCBpZiB0aGUgc2NhbGVkCisgICAgICAgICAgLy8gdmFsdWUgaXMgYW4gYWRkIG9mIHNvbWV0aGluZyBhbmQgYSBjb25zdGFudCwgd2UgY2FuIGZvbGQgdGhlCisgICAgICAgICAgLy8gY29uc3RhbnQgaW50byB0aGUgZGlzcCBmaWVsZCBoZXJlLgorICAgICAgICAgIGlmIChNdWxWYWwuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCAmJiBNdWxWYWwuaGFzT25lVXNlKCkgJiYKKyAgICAgICAgICAgICAgaXNhPENvbnN0YW50U0ROb2RlPihNdWxWYWwuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICAgICAgUmVnID0gTXVsVmFsLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgICAgIENvbnN0YW50U0ROb2RlICpBZGRWYWwgPQorICAgICAgICAgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihNdWxWYWwuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IERpc3AgPSBBTS5EaXNwICsgQWRkVmFsLT5nZXRTRXh0VmFsdWUoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENOLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghaXM2NEJpdCB8fAorICAgICAgICAgICAgICAgIFg4Njo6aXNPZmZzZXRTdWl0YWJsZUZvckNvZGVNb2RlbChEaXNwLCBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTS5oYXNTeW1ib2xpY0Rpc3BsYWNlbWVudCgpKSkKKyAgICAgICAgICAgICAgQU0uRGlzcCA9IERpc3A7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIFJlZyA9IE4uZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBSZWcgPSBOLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBBTS5JbmRleFJlZyA9IEFNLkJhc2VfUmVnID0gUmVnOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIElTRDo6U1VCOiB7CisgICAgLy8gR2l2ZW4gQS1CLCBpZiBBIGNhbiBiZSBjb21wbGV0ZWx5IGZvbGRlZCBpbnRvIHRoZSBhZGRyZXNzIGFuZAorICAgIC8vIHRoZSBpbmRleCBmaWVsZCB3aXRoIHRoZSBpbmRleCBmaWVsZCB1bnVzZWQsIHVzZSAtQiBhcyB0aGUgaW5kZXguCisgICAgLy8gVGhpcyBpcyBhIHdpbiBpZiBhIGhhcyBtdWx0aXBsZSBwYXJ0cyB0aGF0IGNhbiBiZSBmb2xkZWQgaW50bworICAgIC8vIHRoZSBhZGRyZXNzLiBBbHNvLCB0aGlzIHNhdmVzIGEgbW92IGlmIHRoZSBiYXNlIHJlZ2lzdGVyIGhhcworICAgIC8vIG90aGVyIHVzZXMsIHNpbmNlIGl0IGF2b2lkcyBhIHR3by1hZGRyZXNzIHN1YiBpbnN0cnVjdGlvbiwgaG93ZXZlcgorICAgIC8vIGl0IGNvc3RzIGFuIGFkZGl0aW9uYWwgbW92IGlmIHRoZSBpbmRleCByZWdpc3RlciBoYXMgb3RoZXIgdXNlcy4KKworICAgIC8vIEFkZCBhbiBhcnRpZmljaWFsIHVzZSB0byB0aGlzIG5vZGUgc28gdGhhdCB3ZSBjYW4ga2VlcCB0cmFjayBvZgorICAgIC8vIGl0IGlmIGl0IGdldHMgQ1NFJ2Qgd2l0aCBhIGRpZmZlcmVudCBub2RlLgorICAgIEhhbmRsZVNETm9kZSBIYW5kbGUoTik7CisKKyAgICAvLyBUZXN0IGlmIHRoZSBMSFMgb2YgdGhlIHN1YiBjYW4gYmUgZm9sZGVkLgorICAgIFg4NklTZWxBZGRyZXNzTW9kZSBCYWNrdXAgPSBBTTsKKyAgICBpZiAoTWF0Y2hBZGRyZXNzUmVjdXJzaXZlbHkoTi5nZXROb2RlKCktPmdldE9wZXJhbmQoMCksIEFNLCBEZXB0aCsxKSkgeworICAgICAgQU0gPSBCYWNrdXA7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gVGVzdCBpZiB0aGUgaW5kZXggZmllbGQgaXMgZnJlZSBmb3IgdXNlLgorICAgIGlmIChBTS5JbmRleFJlZy5nZXROb2RlKCkgfHwgQU0uaXNSSVBSZWxhdGl2ZSgpKSB7CisgICAgICBBTSA9IEJhY2t1cDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGludCBDb3N0ID0gMDsKKyAgICBTRFZhbHVlIFJIUyA9IEhhbmRsZS5nZXRWYWx1ZSgpLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAvLyBJZiB0aGUgUkhTIGludm9sdmVzIGEgcmVnaXN0ZXIgd2l0aCBtdWx0aXBsZSB1c2VzLCB0aGlzCisgICAgLy8gdHJhbnNmb3JtYXRpb24gaW5jdXJzIGFuIGV4dHJhIG1vdiwgZHVlIHRvIHRoZSBuZWcgaW5zdHJ1Y3Rpb24KKyAgICAvLyBjbG9iYmVyaW5nIGl0cyBvcGVyYW5kLgorICAgIGlmICghUkhTLmdldE5vZGUoKS0+aGFzT25lVXNlKCkgfHwKKyAgICAgICAgUkhTLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb3B5RnJvbVJlZyB8fAorICAgICAgICBSSFMuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFIHx8CisgICAgICAgIFJIUy5nZXROb2RlKCktPmdldE9wY29kZSgpID09IElTRDo6QU5ZX0VYVEVORCB8fAorICAgICAgICAoUkhTLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpaRVJPX0VYVEVORCAmJgorICAgICAgICAgUkhTLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmkzMikpCisgICAgICArK0Nvc3Q7CisgICAgLy8gSWYgdGhlIGJhc2UgaXMgYSByZWdpc3RlciB3aXRoIG11bHRpcGxlIHVzZXMsIHRoaXMKKyAgICAvLyB0cmFuc2Zvcm1hdGlvbiBtYXkgc2F2ZSBhIG1vdi4KKyAgICBpZiAoKEFNLkJhc2VUeXBlID09IFg4NklTZWxBZGRyZXNzTW9kZTo6UmVnQmFzZSAmJgorICAgICAgICAgQU0uQmFzZV9SZWcuZ2V0Tm9kZSgpICYmCisgICAgICAgICAhQU0uQmFzZV9SZWcuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSkgfHwKKyAgICAgICAgQU0uQmFzZVR5cGUgPT0gWDg2SVNlbEFkZHJlc3NNb2RlOjpGcmFtZUluZGV4QmFzZSkKKyAgICAgIC0tQ29zdDsKKyAgICAvLyBJZiB0aGUgZm9sZGVkIExIUyB3YXMgaW50ZXJlc3RpbmcsIHRoaXMgdHJhbnNmb3JtYXRpb24gc2F2ZXMKKyAgICAvLyBhZGRyZXNzIGFyaXRobWV0aWMuCisgICAgaWYgKChBTS5oYXNTeW1ib2xpY0Rpc3BsYWNlbWVudCgpICYmICFCYWNrdXAuaGFzU3ltYm9saWNEaXNwbGFjZW1lbnQoKSkgKworICAgICAgICAoKEFNLkRpc3AgIT0gMCkgJiYgKEJhY2t1cC5EaXNwID09IDApKSArCisgICAgICAgIChBTS5TZWdtZW50LmdldE5vZGUoKSAmJiAhQmFja3VwLlNlZ21lbnQuZ2V0Tm9kZSgpKSA+PSAyKQorICAgICAgLS1Db3N0OworICAgIC8vIElmIGl0IGRvZXNuJ3QgbG9vayBsaWtlIGl0IG1heSBiZSBhbiBvdmVyYWxsIHdpbiwgZG9uJ3QgZG8gaXQuCisgICAgaWYgKENvc3QgPj0gMCkgeworICAgICAgQU0gPSBCYWNrdXA7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBPaywgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIGxlZ2FsIGFuZCBhcHBlYXJzIHByb2ZpdGFibGUuIEdvIGZvciBpdC4KKyAgICBTRFZhbHVlIFplcm8gPSBDdXJEQUctPmdldENvbnN0YW50KDAsIE4uZ2V0VmFsdWVUeXBlKCkpOworICAgIFNEVmFsdWUgTmVnID0gQ3VyREFHLT5nZXROb2RlKElTRDo6U1VCLCBkbCwgTi5nZXRWYWx1ZVR5cGUoKSwgWmVybywgUkhTKTsKKyAgICBBTS5JbmRleFJlZyA9IE5lZzsKKyAgICBBTS5TY2FsZSA9IDE7CisKKyAgICAvLyBJbnNlcnQgdGhlIG5ldyBub2RlcyBpbnRvIHRoZSB0b3BvbG9naWNhbCBvcmRlcmluZy4KKyAgICBpZiAoWmVyby5nZXROb2RlKCktPmdldE5vZGVJZCgpID09IC0xIHx8CisgICAgICAgIFplcm8uZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSA+IE4uZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSkgeworICAgICAgQ3VyREFHLT5SZXBvc2l0aW9uTm9kZShOLmdldE5vZGUoKSwgWmVyby5nZXROb2RlKCkpOworICAgICAgWmVyby5nZXROb2RlKCktPnNldE5vZGVJZChOLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpOworICAgIH0KKyAgICBpZiAoTmVnLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPT0gLTEgfHwKKyAgICAgICAgTmVnLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPiBOLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpIHsKKyAgICAgIEN1ckRBRy0+UmVwb3NpdGlvbk5vZGUoTi5nZXROb2RlKCksIE5lZy5nZXROb2RlKCkpOworICAgICAgTmVnLmdldE5vZGUoKS0+c2V0Tm9kZUlkKE4uZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNhc2UgSVNEOjpBREQ6IHsKKyAgICAvLyBBZGQgYW4gYXJ0aWZpY2lhbCB1c2UgdG8gdGhpcyBub2RlIHNvIHRoYXQgd2UgY2FuIGtlZXAgdHJhY2sgb2YKKyAgICAvLyBpdCBpZiBpdCBnZXRzIENTRSdkIHdpdGggYSBkaWZmZXJlbnQgbm9kZS4KKyAgICBIYW5kbGVTRE5vZGUgSGFuZGxlKE4pOworICAgIFNEVmFsdWUgTEhTID0gSGFuZGxlLmdldFZhbHVlKCkuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgUkhTID0gSGFuZGxlLmdldFZhbHVlKCkuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDEpOworCisgICAgWDg2SVNlbEFkZHJlc3NNb2RlIEJhY2t1cCA9IEFNOworICAgIGlmICghTWF0Y2hBZGRyZXNzUmVjdXJzaXZlbHkoTEhTLCBBTSwgRGVwdGgrMSkgJiYKKyAgICAgICAgIU1hdGNoQWRkcmVzc1JlY3Vyc2l2ZWx5KFJIUywgQU0sIERlcHRoKzEpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFNID0gQmFja3VwOworICAgIExIUyA9IEhhbmRsZS5nZXRWYWx1ZSgpLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBSSFMgPSBIYW5kbGUuZ2V0VmFsdWUoKS5nZXROb2RlKCktPmdldE9wZXJhbmQoMSk7CisKKyAgICAvLyBUcnkgYWdhaW4gYWZ0ZXIgY29tbXV0aW5nIHRoZSBvcGVyYW5kcy4KKyAgICBpZiAoIU1hdGNoQWRkcmVzc1JlY3Vyc2l2ZWx5KFJIUywgQU0sIERlcHRoKzEpICYmCisgICAgICAgICFNYXRjaEFkZHJlc3NSZWN1cnNpdmVseShMSFMsIEFNLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBBTSA9IEJhY2t1cDsKKyAgICBMSFMgPSBIYW5kbGUuZ2V0VmFsdWUoKS5nZXROb2RlKCktPmdldE9wZXJhbmQoMCk7CisgICAgUkhTID0gSGFuZGxlLmdldFZhbHVlKCkuZ2V0Tm9kZSgpLT5nZXRPcGVyYW5kKDEpOworCisgICAgLy8gSWYgd2UgY291bGRuJ3QgZm9sZCBib3RoIG9wZXJhbmRzIGludG8gdGhlIGFkZHJlc3MgYXQgdGhlIHNhbWUgdGltZSwKKyAgICAvLyBzZWUgaWYgd2UgY2FuIGp1c3QgcHV0IGVhY2ggb3BlcmFuZCBpbnRvIGEgcmVnaXN0ZXIgYW5kIGZvbGQgYXQgbGVhc3QKKyAgICAvLyB0aGUgYWRkLgorICAgIGlmIChBTS5CYXNlVHlwZSA9PSBYODZJU2VsQWRkcmVzc01vZGU6OlJlZ0Jhc2UgJiYKKyAgICAgICAgIUFNLkJhc2VfUmVnLmdldE5vZGUoKSAmJgorICAgICAgICAhQU0uSW5kZXhSZWcuZ2V0Tm9kZSgpKSB7CisgICAgICBBTS5CYXNlX1JlZyA9IExIUzsKKyAgICAgIEFNLkluZGV4UmVnID0gUkhTOworICAgICAgQU0uU2NhbGUgPSAxOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgSVNEOjpPUjoKKyAgICAvLyBIYW5kbGUgIlggfCBDIiBhcyAiWCArIEMiIGlmZiBYIGlzIGtub3duIHRvIGhhdmUgQyBiaXRzIGNsZWFyLgorICAgIGlmIChpc0xvZ2ljYWxseUFkZFdpdGhDb25zdGFudChOLCBDdXJEQUcpKSB7CisgICAgICBYODZJU2VsQWRkcmVzc01vZGUgQmFja3VwID0gQU07CisgICAgICBDb25zdGFudFNETm9kZSAqQ04gPSBjYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpOworICAgICAgdWludDY0X3QgT2Zmc2V0ID0gQ04tPmdldFNFeHRWYWx1ZSgpOworCisgICAgICAvLyBTdGFydCB3aXRoIHRoZSBMSFMgYXMgYW4gYWRkciBtb2RlLgorICAgICAgaWYgKCFNYXRjaEFkZHJlc3NSZWN1cnNpdmVseShOLmdldE9wZXJhbmQoMCksIEFNLCBEZXB0aCsxKSAmJgorICAgICAgICAgIC8vIEFkZHJlc3MgY291bGQgbm90IGhhdmUgcGlja2VkIGEgR1YgYWRkcmVzcyBmb3IgdGhlIGRpc3BsYWNlbWVudC4KKyAgICAgICAgICBBTS5HViA9PSBOVUxMICYmCisgICAgICAgICAgLy8gT24geDg2LTY0LCB0aGUgcmVzdWx0YW50IGRpc3AgbXVzdCBmaXQgaW4gMzItYml0cy4KKyAgICAgICAgICAoIWlzNjRCaXQgfHwKKyAgICAgICAgICAgWDg2Ojppc09mZnNldFN1aXRhYmxlRm9yQ29kZU1vZGVsKEFNLkRpc3AgKyBPZmZzZXQsIE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTS5oYXNTeW1ib2xpY0Rpc3BsYWNlbWVudCgpKSkpIHsKKyAgICAgICAgQU0uRGlzcCArPSBPZmZzZXQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIEFNID0gQmFja3VwOworICAgIH0KKyAgICBicmVhazsKKyAgICAgIAorICBjYXNlIElTRDo6QU5EOiB7CisgICAgLy8gUGVyZm9ybSBzb21lIGhlcm9pYyB0cmFuc2Zvcm1zIG9uIGFuIGFuZCBvZiBhIGNvbnN0YW50LWNvdW50IHNoaWZ0CisgICAgLy8gd2l0aCBhIGNvbnN0YW50IHRvIGVuYWJsZSB1c2Ugb2YgdGhlIHNjYWxlZCBvZmZzZXQgZmllbGQuCisKKyAgICBTRFZhbHVlIFNoaWZ0ID0gTi5nZXRPcGVyYW5kKDApOworICAgIGlmIChTaGlmdC5nZXROdW1PcGVyYW5kcygpICE9IDIpIGJyZWFrOworCisgICAgLy8gU2NhbGUgbXVzdCBub3QgYmUgdXNlZCBhbHJlYWR5LgorICAgIGlmIChBTS5JbmRleFJlZy5nZXROb2RlKCkgIT0gMCB8fCBBTS5TY2FsZSAhPSAxKSBicmVhazsKKworICAgIFNEVmFsdWUgWCA9IFNoaWZ0LmdldE9wZXJhbmQoMCk7CisgICAgQ29uc3RhbnRTRE5vZGUgKkMyID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSk7CisgICAgQ29uc3RhbnRTRE5vZGUgKkMxID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFNoaWZ0LmdldE9wZXJhbmQoMSkpOworICAgIGlmICghQzEgfHwgIUMyKSBicmVhazsKKworICAgIC8vIEhhbmRsZSAiKFggPj4gKDgtQzEpKSAmIEMyIiBhcyAiKFggPj4gOCkgJiAweGZmKSIgaWYgc2FmZS4gVGhpcworICAgIC8vIGFsbG93cyB1cyB0byBjb252ZXJ0IHRoZSBzaGlmdCBhbmQgYW5kIGludG8gYW4gaC1yZWdpc3RlciBleHRyYWN0IGFuZAorICAgIC8vIGEgc2NhbGVkIGluZGV4LgorICAgIGlmIChTaGlmdC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSTCAmJiBTaGlmdC5oYXNPbmVVc2UoKSkgeworICAgICAgdW5zaWduZWQgU2NhbGVMb2cgPSA4IC0gQzEtPmdldFpFeHRWYWx1ZSgpOworICAgICAgaWYgKFNjYWxlTG9nID4gMCAmJiBTY2FsZUxvZyA8IDQgJiYKKyAgICAgICAgICBDMi0+Z2V0WkV4dFZhbHVlKCkgPT0gKFVJTlQ2NF9DKDB4ZmYpIDw8IFNjYWxlTG9nKSkgeworICAgICAgICBTRFZhbHVlIEVpZ2h0ID0gQ3VyREFHLT5nZXRDb25zdGFudCg4LCBNVlQ6Omk4KTsKKyAgICAgICAgU0RWYWx1ZSBNYXNrID0gQ3VyREFHLT5nZXRDb25zdGFudCgweGZmLCBOLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgICAgU0RWYWx1ZSBTcmwgPSBDdXJEQUctPmdldE5vZGUoSVNEOjpTUkwsIGRsLCBOLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYLCBFaWdodCk7CisgICAgICAgIFNEVmFsdWUgQW5kID0gQ3VyREFHLT5nZXROb2RlKElTRDo6QU5ELCBkbCwgTi5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JsLCBNYXNrKTsKKyAgICAgICAgU0RWYWx1ZSBTaGxDb3VudCA9IEN1ckRBRy0+Z2V0Q29uc3RhbnQoU2NhbGVMb2csIE1WVDo6aTgpOworICAgICAgICBTRFZhbHVlIFNobCA9IEN1ckRBRy0+Z2V0Tm9kZShJU0Q6OlNITCwgZGwsIE4uZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZCwgU2hsQ291bnQpOworCisgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IG5vZGVzIGludG8gdGhlIHRvcG9sb2dpY2FsIG9yZGVyaW5nLgorICAgICAgICBpZiAoRWlnaHQuZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSA9PSAtMSB8fAorICAgICAgICAgICAgRWlnaHQuZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSA+IFguZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSkgeworICAgICAgICAgIEN1ckRBRy0+UmVwb3NpdGlvbk5vZGUoWC5nZXROb2RlKCksIEVpZ2h0LmdldE5vZGUoKSk7CisgICAgICAgICAgRWlnaHQuZ2V0Tm9kZSgpLT5zZXROb2RlSWQoWC5nZXROb2RlKCktPmdldE5vZGVJZCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoTWFzay5nZXROb2RlKCktPmdldE5vZGVJZCgpID09IC0xIHx8CisgICAgICAgICAgICBNYXNrLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPiBYLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpIHsKKyAgICAgICAgICBDdXJEQUctPlJlcG9zaXRpb25Ob2RlKFguZ2V0Tm9kZSgpLCBNYXNrLmdldE5vZGUoKSk7CisgICAgICAgICAgTWFzay5nZXROb2RlKCktPnNldE5vZGVJZChYLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChTcmwuZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSA9PSAtMSB8fAorICAgICAgICAgICAgU3JsLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPiBTaGlmdC5nZXROb2RlKCktPmdldE5vZGVJZCgpKSB7CisgICAgICAgICAgQ3VyREFHLT5SZXBvc2l0aW9uTm9kZShTaGlmdC5nZXROb2RlKCksIFNybC5nZXROb2RlKCkpOworICAgICAgICAgIFNybC5nZXROb2RlKCktPnNldE5vZGVJZChTaGlmdC5nZXROb2RlKCktPmdldE5vZGVJZCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQW5kLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPT0gLTEgfHwKKyAgICAgICAgICAgIEFuZC5nZXROb2RlKCktPmdldE5vZGVJZCgpID4gTi5nZXROb2RlKCktPmdldE5vZGVJZCgpKSB7CisgICAgICAgICAgQ3VyREFHLT5SZXBvc2l0aW9uTm9kZShOLmdldE5vZGUoKSwgQW5kLmdldE5vZGUoKSk7CisgICAgICAgICAgQW5kLmdldE5vZGUoKS0+c2V0Tm9kZUlkKE4uZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFNobENvdW50LmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPT0gLTEgfHwKKyAgICAgICAgICAgIFNobENvdW50LmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPiBYLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpIHsKKyAgICAgICAgICBDdXJEQUctPlJlcG9zaXRpb25Ob2RlKFguZ2V0Tm9kZSgpLCBTaGxDb3VudC5nZXROb2RlKCkpOworICAgICAgICAgIFNobENvdW50LmdldE5vZGUoKS0+c2V0Tm9kZUlkKE4uZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFNobC5nZXROb2RlKCktPmdldE5vZGVJZCgpID09IC0xIHx8CisgICAgICAgICAgICBTaGwuZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSA+IE4uZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSkgeworICAgICAgICAgIEN1ckRBRy0+UmVwb3NpdGlvbk5vZGUoTi5nZXROb2RlKCksIFNobC5nZXROb2RlKCkpOworICAgICAgICAgIFNobC5nZXROb2RlKCktPnNldE5vZGVJZChOLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpOworICAgICAgICB9CisgICAgICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNXaXRoKE4sIFNobCk7CisgICAgICAgIEFNLkluZGV4UmVnID0gQW5kOworICAgICAgICBBTS5TY2FsZSA9ICgxIDw8IFNjYWxlTG9nKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIC8vIEhhbmRsZSAiKFggPDwgQzEpICYgQzIiIGFzICIoWCAmIChDMj4+QzEpKSA8PCBDMSIgaWYgc2FmZSBhbmQgaWYgdGhpcworICAgIC8vIGFsbG93cyB1cyB0byBmb2xkIHRoZSBzaGlmdCBpbnRvIHRoaXMgYWRkcmVzc2luZyBtb2RlLgorICAgIGlmIChTaGlmdC5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNITCkgYnJlYWs7CisKKyAgICAvLyBOb3QgbGlrZWx5IHRvIGJlIHByb2ZpdGFibGUgaWYgZWl0aGVyIHRoZSBBTkQgb3IgU0hJRlQgbm9kZSBoYXMgbW9yZQorICAgIC8vIHRoYW4gb25lIHVzZSAodW5sZXNzIGFsbCB1c2VzIGFyZSBmb3IgYWRkcmVzcyBjb21wdXRhdGlvbikuIEJlc2lkZXMsCisgICAgLy8gaXNlbCBtZWNoYW5pc20gcmVxdWlyZXMgdGhlaXIgbm9kZSBpZHMgdG8gYmUgcmV1c2VkLgorICAgIGlmICghTi5oYXNPbmVVc2UoKSB8fCAhU2hpZnQuaGFzT25lVXNlKCkpCisgICAgICBicmVhazsKKyAgICAKKyAgICAvLyBWZXJpZnkgdGhhdCB0aGUgc2hpZnQgYW1vdW50IGlzIHNvbWV0aGluZyB3ZSBjYW4gZm9sZC4KKyAgICB1bnNpZ25lZCBTaGlmdENzdCA9IEMxLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBpZiAoU2hpZnRDc3QgIT0gMSAmJiBTaGlmdENzdCAhPSAyICYmIFNoaWZ0Q3N0ICE9IDMpCisgICAgICBicmVhazsKKyAgICAKKyAgICAvLyBHZXQgdGhlIG5ldyBBTkQgbWFzaywgdGhpcyBmb2xkcyB0byBhIGNvbnN0YW50LgorICAgIFNEVmFsdWUgTmV3QU5ETWFzayA9IEN1ckRBRy0+Z2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE4uZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoQzIsIDApLCBTRFZhbHVlKEMxLCAwKSk7CisgICAgU0RWYWx1ZSBOZXdBTkQgPSBDdXJEQUctPmdldE5vZGUoSVNEOjpBTkQsIGRsLCBOLmdldFZhbHVlVHlwZSgpLCBYLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdBTkRNYXNrKTsKKyAgICBTRFZhbHVlIE5ld1NISUZUID0gQ3VyREFHLT5nZXROb2RlKElTRDo6U0hMLCBkbCwgTi5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0FORCwgU0RWYWx1ZShDMSwgMCkpOworCisgICAgLy8gSW5zZXJ0IHRoZSBuZXcgbm9kZXMgaW50byB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcuCisgICAgaWYgKEMxLT5nZXROb2RlSWQoKSA+IFguZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSkgeworICAgICAgQ3VyREFHLT5SZXBvc2l0aW9uTm9kZShYLmdldE5vZGUoKSwgQzEpOworICAgICAgQzEtPnNldE5vZGVJZChYLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpOworICAgIH0KKyAgICBpZiAoTmV3QU5ETWFzay5nZXROb2RlKCktPmdldE5vZGVJZCgpID09IC0xIHx8CisgICAgICAgIE5ld0FORE1hc2suZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSA+IFguZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSkgeworICAgICAgQ3VyREFHLT5SZXBvc2l0aW9uTm9kZShYLmdldE5vZGUoKSwgTmV3QU5ETWFzay5nZXROb2RlKCkpOworICAgICAgTmV3QU5ETWFzay5nZXROb2RlKCktPnNldE5vZGVJZChYLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpOworICAgIH0KKyAgICBpZiAoTmV3QU5ELmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPT0gLTEgfHwKKyAgICAgICAgTmV3QU5ELmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPiBTaGlmdC5nZXROb2RlKCktPmdldE5vZGVJZCgpKSB7CisgICAgICBDdXJEQUctPlJlcG9zaXRpb25Ob2RlKFNoaWZ0LmdldE5vZGUoKSwgTmV3QU5ELmdldE5vZGUoKSk7CisgICAgICBOZXdBTkQuZ2V0Tm9kZSgpLT5zZXROb2RlSWQoU2hpZnQuZ2V0Tm9kZSgpLT5nZXROb2RlSWQoKSk7CisgICAgfQorICAgIGlmIChOZXdTSElGVC5nZXROb2RlKCktPmdldE5vZGVJZCgpID09IC0xIHx8CisgICAgICAgIE5ld1NISUZULmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkgPiBOLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpIHsKKyAgICAgIEN1ckRBRy0+UmVwb3NpdGlvbk5vZGUoTi5nZXROb2RlKCksIE5ld1NISUZULmdldE5vZGUoKSk7CisgICAgICBOZXdTSElGVC5nZXROb2RlKCktPnNldE5vZGVJZChOLmdldE5vZGUoKS0+Z2V0Tm9kZUlkKCkpOworICAgIH0KKworICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNXaXRoKE4sIE5ld1NISUZUKTsKKyAgICAKKyAgICBBTS5TY2FsZSA9IDEgPDwgU2hpZnRDc3Q7CisgICAgQU0uSW5kZXhSZWcgPSBOZXdBTkQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIH0KKworICByZXR1cm4gTWF0Y2hBZGRyZXNzQmFzZShOLCBBTSk7Cit9CisKKy8vLyBNYXRjaEFkZHJlc3NCYXNlIC0gSGVscGVyIGZvciBNYXRjaEFkZHJlc3MuIEFkZCB0aGUgc3BlY2lmaWVkIG5vZGUgdG8gdGhlCisvLy8gc3BlY2lmaWVkIGFkZHJlc3NpbmcgbW9kZSB3aXRob3V0IGFueSBmdXJ0aGVyIHJlY3Vyc2lvbi4KK2Jvb2wgWDg2REFHVG9EQUdJU2VsOjpNYXRjaEFkZHJlc3NCYXNlKFNEVmFsdWUgTiwgWDg2SVNlbEFkZHJlc3NNb2RlICZBTSkgeworICAvLyBJcyB0aGUgYmFzZSByZWdpc3RlciBhbHJlYWR5IG9jY3VwaWVkPworICBpZiAoQU0uQmFzZVR5cGUgIT0gWDg2SVNlbEFkZHJlc3NNb2RlOjpSZWdCYXNlIHx8IEFNLkJhc2VfUmVnLmdldE5vZGUoKSkgeworICAgIC8vIElmIHNvLCBjaGVjayB0byBzZWUgaWYgdGhlIHNjYWxlIGluZGV4IHJlZ2lzdGVyIGlzIHNldC4KKyAgICBpZiAoQU0uSW5kZXhSZWcuZ2V0Tm9kZSgpID09IDApIHsKKyAgICAgIEFNLkluZGV4UmVnID0gTjsKKyAgICAgIEFNLlNjYWxlID0gMTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlIGNhbm5vdCBzZWxlY3QgaXQuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBEZWZhdWx0LCBnZW5lcmF0ZSBpdCBhcyBhIHJlZ2lzdGVyLgorICBBTS5CYXNlVHlwZSA9IFg4NklTZWxBZGRyZXNzTW9kZTo6UmVnQmFzZTsKKyAgQU0uQmFzZV9SZWcgPSBOOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBTZWxlY3RBZGRyIC0gcmV0dXJucyB0cnVlIGlmIGl0IGlzIGFibGUgcGF0dGVybiBtYXRjaCBhbiBhZGRyZXNzaW5nIG1vZGUuCisvLy8gSXQgcmV0dXJucyB0aGUgb3BlcmFuZHMgd2hpY2ggbWFrZSB1cCB0aGUgbWF4aW1hbCBhZGRyZXNzaW5nIG1vZGUgaXQgY2FuCisvLy8gbWF0Y2ggYnkgcmVmZXJlbmNlLgorYm9vbCBYODZEQUdUb0RBR0lTZWw6OlNlbGVjdEFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmU2NhbGUsIFNEVmFsdWUgJkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmRGlzcCwgU0RWYWx1ZSAmU2VnbWVudCkgeworICBYODZJU2VsQWRkcmVzc01vZGUgQU07CisgIGlmIChNYXRjaEFkZHJlc3MoTiwgQU0pKQorICAgIHJldHVybiBmYWxzZTsKKworICBFVlQgVlQgPSBOLmdldFZhbHVlVHlwZSgpOworICBpZiAoQU0uQmFzZVR5cGUgPT0gWDg2SVNlbEFkZHJlc3NNb2RlOjpSZWdCYXNlKSB7CisgICAgaWYgKCFBTS5CYXNlX1JlZy5nZXROb2RlKCkpCisgICAgICBBTS5CYXNlX1JlZyA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgVlQpOworICB9CisKKyAgaWYgKCFBTS5JbmRleFJlZy5nZXROb2RlKCkpCisgICAgQU0uSW5kZXhSZWcgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIFZUKTsKKworICBnZXRBZGRyZXNzT3BlcmFuZHMoQU0sIEJhc2UsIFNjYWxlLCBJbmRleCwgRGlzcCwgU2VnbWVudCk7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gU2VsZWN0U2NhbGFyU1NFTG9hZCAtIE1hdGNoIGEgc2NhbGFyIFNTRSBsb2FkLiAgSW4gcGFydGljdWxhciwgd2Ugd2FudCB0bworLy8vIG1hdGNoIGEgbG9hZCB3aG9zZSB0b3AgZWxlbWVudHMgYXJlIGVpdGhlciB1bmRlZiBvciB6ZXJvcy4gIFRoZSBsb2FkIGZsYXZvcgorLy8vIGlzIGRlcml2ZWQgZnJvbSB0aGUgdHlwZSBvZiBOLCB3aGljaCBpcyBlaXRoZXIgdjRmMzIgb3IgdjJmNjQuCisvLy8KKy8vLyBXZSBhbHNvIHJldHVybjoKKy8vLyAgIFBhdHRlcm5DaGFpbk5vZGU6IHRoaXMgaXMgdGhlIG1hdGNoZWQgbm9kZSB0aGF0IGhhcyBhIGNoYWluIGlucHV0IGFuZAorLy8vICAgb3V0cHV0LgorYm9vbCBYODZEQUdUb0RBR0lTZWw6OlNlbGVjdFNjYWxhclNTRUxvYWQoU0ROb2RlICpSb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmU2NhbGUsIFNEVmFsdWUgJkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmRGlzcCwgU0RWYWx1ZSAmU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJlBhdHRlcm5Ob2RlV2l0aENoYWluKSB7CisgIGlmIChOLmdldE9wY29kZSgpID09IElTRDo6U0NBTEFSX1RPX1ZFQ1RPUikgeworICAgIFBhdHRlcm5Ob2RlV2l0aENoYWluID0gTi5nZXRPcGVyYW5kKDApOworICAgIGlmIChJU0Q6OmlzTk9OX0VYVExvYWQoUGF0dGVybk5vZGVXaXRoQ2hhaW4uZ2V0Tm9kZSgpKSAmJgorICAgICAgICBQYXR0ZXJuTm9kZVdpdGhDaGFpbi5oYXNPbmVVc2UoKSAmJgorICAgICAgICBJc1Byb2ZpdGFibGVUb0ZvbGQoTi5nZXRPcGVyYW5kKDApLCBOLmdldE5vZGUoKSwgUm9vdCkgJiYKKyAgICAgICAgSXNMZWdhbFRvRm9sZChOLmdldE9wZXJhbmQoMCksIE4uZ2V0Tm9kZSgpLCBSb290LCBPcHRMZXZlbCkpIHsKKyAgICAgIExvYWRTRE5vZGUgKkxEID0gY2FzdDxMb2FkU0ROb2RlPihQYXR0ZXJuTm9kZVdpdGhDaGFpbik7CisgICAgICBpZiAoIVNlbGVjdEFkZHIoUm9vdCwgTEQtPmdldEJhc2VQdHIoKSwgQmFzZSwgU2NhbGUsIEluZGV4LCBEaXNwLFNlZ21lbnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBBbHNvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBleHBsaWNpdGx5IHJlcXVpcmUgemVyb3MgaW4gdGhlIHRvcAorICAvLyBlbGVtZW50cy4gIFRoaXMgaXMgYSB2ZWN0b3Igc2h1ZmZsZSBmcm9tIHRoZSB6ZXJvIHZlY3Rvci4KKyAgaWYgKE4uZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpWWkVYVF9NT1ZMICYmIE4uZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSAmJgorICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB0b3AgZWxlbWVudHMgYXJlIGFsbCB6ZXJvcyAob3IgYml0Y2FzdCBvZiB6ZXJvcykuCisgICAgICBOLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTQ0FMQVJfVE9fVkVDVE9SICYmIAorICAgICAgTi5nZXRPcGVyYW5kKDApLmdldE5vZGUoKS0+aGFzT25lVXNlKCkgJiYKKyAgICAgIElTRDo6aXNOT05fRVhUTG9hZChOLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKS5nZXROb2RlKCkpICYmCisgICAgICBOLmdldE9wZXJhbmQoMCkuZ2V0T3BlcmFuZCgwKS5oYXNPbmVVc2UoKSAmJgorICAgICAgSXNQcm9maXRhYmxlVG9Gb2xkKE4uZ2V0T3BlcmFuZCgwKSwgTi5nZXROb2RlKCksIFJvb3QpICYmCisgICAgICBJc0xlZ2FsVG9Gb2xkKE4uZ2V0T3BlcmFuZCgwKSwgTi5nZXROb2RlKCksIFJvb3QsIE9wdExldmVsKSkgeworICAgIC8vIE9rYXksIHRoaXMgaXMgYSB6ZXJvIGV4dGVuZGluZyBsb2FkLiAgRm9sZCBpdC4KKyAgICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oTi5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCkpOworICAgIGlmICghU2VsZWN0QWRkcihSb290LCBMRC0+Z2V0QmFzZVB0cigpLCBCYXNlLCBTY2FsZSwgSW5kZXgsIERpc3AsIFNlZ21lbnQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFBhdHRlcm5Ob2RlV2l0aENoYWluID0gU0RWYWx1ZShMRCwgMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8vLyBTZWxlY3RMRUFBZGRyIC0gaXQgY2FsbHMgU2VsZWN0QWRkciBhbmQgZGV0ZXJtaW5lcyBpZiB0aGUgbWF4aW1hbCBhZGRyZXNzaW5nCisvLy8gbW9kZSBpdCBtYXRjaGVzIGNhbiBiZSBjb3N0IGVmZmVjdGl2ZWx5IGVtaXR0ZWQgYXMgYW4gTEVBIGluc3RydWN0aW9uLgorYm9vbCBYODZEQUdUb0RBR0lTZWw6OlNlbGVjdExFQUFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZJbmRleCwgU0RWYWx1ZSAmRGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJlNlZ21lbnQpIHsKKyAgWDg2SVNlbEFkZHJlc3NNb2RlIEFNOworCisgIC8vIFNldCBBTS5TZWdtZW50IHRvIHByZXZlbnQgTWF0Y2hBZGRyZXNzIGZyb20gdXNpbmcgb25lLiBMRUEgZG9lc24ndCBzdXBwb3J0CisgIC8vIHNlZ21lbnRzLgorICBTRFZhbHVlIENvcHkgPSBBTS5TZWdtZW50OworICBTRFZhbHVlIFQgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIE1WVDo6aTMyKTsKKyAgQU0uU2VnbWVudCA9IFQ7CisgIGlmIChNYXRjaEFkZHJlc3MoTiwgQU0pKQorICAgIHJldHVybiBmYWxzZTsKKyAgYXNzZXJ0IChUID09IEFNLlNlZ21lbnQpOworICBBTS5TZWdtZW50ID0gQ29weTsKKworICBFVlQgVlQgPSBOLmdldFZhbHVlVHlwZSgpOworICB1bnNpZ25lZCBDb21wbGV4aXR5ID0gMDsKKyAgaWYgKEFNLkJhc2VUeXBlID09IFg4NklTZWxBZGRyZXNzTW9kZTo6UmVnQmFzZSkKKyAgICBpZiAoQU0uQmFzZV9SZWcuZ2V0Tm9kZSgpKQorICAgICAgQ29tcGxleGl0eSA9IDE7CisgICAgZWxzZQorICAgICAgQU0uQmFzZV9SZWcgPSBDdXJEQUctPmdldFJlZ2lzdGVyKDAsIFZUKTsKKyAgZWxzZSBpZiAoQU0uQmFzZVR5cGUgPT0gWDg2SVNlbEFkZHJlc3NNb2RlOjpGcmFtZUluZGV4QmFzZSkKKyAgICBDb21wbGV4aXR5ID0gNDsKKworICBpZiAoQU0uSW5kZXhSZWcuZ2V0Tm9kZSgpKQorICAgIENvbXBsZXhpdHkrKzsKKyAgZWxzZQorICAgIEFNLkluZGV4UmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBWVCk7CisKKyAgLy8gRG9uJ3QgbWF0Y2gganVzdCBsZWFsKCwlcmVnLDIpLiBJdCdzIGNoZWFwZXIgdG8gZG8gYWRkbCAlcmVnLCAlcmVnLCBvciB3aXRoCisgIC8vIGEgc2ltcGxlIHNoaWZ0LgorICBpZiAoQU0uU2NhbGUgPiAxKQorICAgIENvbXBsZXhpdHkrKzsKKworICAvLyBGSVhNRTogV2UgYXJlIGFydGlmaWNpYWxseSBsb3dlcmluZyB0aGUgY3JpdGVyaWEgdG8gdHVybiBBREQgJXJlZywgJEdBCisgIC8vIHRvIGEgTEVBLiBUaGlzIGlzIGRldGVybWluZWQgd2l0aCBzb21lIGV4cGVybWVudGF0aW9uIGJ1dCBpcyBieSBubyBtZWFucworICAvLyBvcHRpbWFsIChlc3BlY2lhbGx5IGZvciBjb2RlIHNpemUgY29uc2lkZXJhdGlvbikuIExFQSBpcyBuaWNlIGJlY2F1c2Ugb2YKKyAgLy8gaXRzIHRocmVlLWFkZHJlc3MgbmF0dXJlLiBUd2VhayB0aGUgY29zdCBmdW5jdGlvbiBhZ2FpbiB3aGVuIHdlIGNhbiBydW4KKyAgLy8gY29udmVydFRvVGhyZWVBZGRyZXNzKCkgYXQgcmVnaXN0ZXIgYWxsb2NhdGlvbiB0aW1lLgorICBpZiAoQU0uaGFzU3ltYm9saWNEaXNwbGFjZW1lbnQoKSkgeworICAgIC8vIEZvciBYODYtNjQsIHdlIHNob3VsZCBhbHdheXMgdXNlIGxlYSB0byBtYXRlcmlhbGl6ZSBSSVAgcmVsYXRpdmUKKyAgICAvLyBhZGRyZXNzZXMuCisgICAgaWYgKFN1YnRhcmdldC0+aXM2NEJpdCgpKQorICAgICAgQ29tcGxleGl0eSA9IDQ7CisgICAgZWxzZQorICAgICAgQ29tcGxleGl0eSArPSAyOworICB9CisKKyAgaWYgKEFNLkRpc3AgJiYgKEFNLkJhc2VfUmVnLmdldE5vZGUoKSB8fCBBTS5JbmRleFJlZy5nZXROb2RlKCkpKQorICAgIENvbXBsZXhpdHkrKzsKKworICAvLyBJZiBpdCBpc24ndCB3b3J0aCB1c2luZyBhbiBMRUEsIHJlamVjdCBpdC4KKyAgaWYgKENvbXBsZXhpdHkgPD0gMikKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBnZXRBZGRyZXNzT3BlcmFuZHMoQU0sIEJhc2UsIFNjYWxlLCBJbmRleCwgRGlzcCwgU2VnbWVudCk7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gU2VsZWN0VExTQUREUkFkZHIgLSBUaGlzIGlzIG9ubHkgcnVuIG9uIFRhcmdldEdsb2JhbFRMU0FkZHJlc3Mgbm9kZXMuCitib29sIFg4NkRBR1RvREFHSVNlbDo6U2VsZWN0VExTQUREUkFkZHIoU0ROb2RlICpPcCwgU0RWYWx1ZSBOLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJlNjYWxlLCBTRFZhbHVlICZJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZEaXNwLCBTRFZhbHVlICZTZWdtZW50KSB7CisgIGFzc2VydChOLmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsVExTQWRkcmVzcyk7CisgIGNvbnN0IEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBID0gY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihOKTsKKyAgICAKKyAgWDg2SVNlbEFkZHJlc3NNb2RlIEFNOworICBBTS5HViA9IEdBLT5nZXRHbG9iYWwoKTsKKyAgQU0uRGlzcCArPSBHQS0+Z2V0T2Zmc2V0KCk7CisgIEFNLkJhc2VfUmVnID0gQ3VyREFHLT5nZXRSZWdpc3RlcigwLCBOLmdldFZhbHVlVHlwZSgpKTsKKyAgQU0uU3ltYm9sRmxhZ3MgPSBHQS0+Z2V0VGFyZ2V0RmxhZ3MoKTsKKworICBpZiAoTi5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmkzMikgeworICAgIEFNLlNjYWxlID0gMTsKKyAgICBBTS5JbmRleFJlZyA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoWDg2OjpFQlgsIE1WVDo6aTMyKTsKKyAgfSBlbHNlIHsKKyAgICBBTS5JbmRleFJlZyA9IEN1ckRBRy0+Z2V0UmVnaXN0ZXIoMCwgTVZUOjppNjQpOworICB9CisgIAorICBnZXRBZGRyZXNzT3BlcmFuZHMoQU0sIEJhc2UsIFNjYWxlLCBJbmRleCwgRGlzcCwgU2VnbWVudCk7CisgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgWDg2REFHVG9EQUdJU2VsOjpUcnlGb2xkTG9hZChTRE5vZGUgKlAsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZCYXNlLCBTRFZhbHVlICZTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZJbmRleCwgU0RWYWx1ZSAmRGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZTZWdtZW50KSB7CisgIGlmICghSVNEOjppc05PTl9FWFRMb2FkKE4uZ2V0Tm9kZSgpKSB8fAorICAgICAgIUlzUHJvZml0YWJsZVRvRm9sZChOLCBQLCBQKSB8fAorICAgICAgIUlzTGVnYWxUb0ZvbGQoTiwgUCwgUCwgT3B0TGV2ZWwpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIHJldHVybiBTZWxlY3RBZGRyKFAsIE4uZ2V0T3BlcmFuZCgxKSwgQmFzZSwgU2NhbGUsIEluZGV4LCBEaXNwLCBTZWdtZW50KTsKK30KKworLy8vIGdldEdsb2JhbEJhc2VSZWcgLSBSZXR1cm4gYW4gU0ROb2RlIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgb2YKKy8vLyB0aGUgZ2xvYmFsIGJhc2UgcmVnaXN0ZXIuIE91dHB1dCBpbnN0cnVjdGlvbnMgcmVxdWlyZWQgdG8KKy8vLyBpbml0aWFsaXplIHRoZSBnbG9iYWwgYmFzZSByZWdpc3RlciwgaWYgbmVjZXNzYXJ5LgorLy8vCitTRE5vZGUgKlg4NkRBR1RvREFHSVNlbDo6Z2V0R2xvYmFsQmFzZVJlZygpIHsKKyAgdW5zaWduZWQgR2xvYmFsQmFzZVJlZyA9IGdldEluc3RySW5mbygpLT5nZXRHbG9iYWxCYXNlUmVnKE1GKTsKKyAgcmV0dXJuIEN1ckRBRy0+Z2V0UmVnaXN0ZXIoR2xvYmFsQmFzZVJlZywgVExJLmdldFBvaW50ZXJUeSgpKS5nZXROb2RlKCk7Cit9CisKK3N0YXRpYyBTRE5vZGUgKkZpbmRDYWxsU3RhcnRGcm9tQ2FsbChTRE5vZGUgKk5vZGUpIHsKKyAgaWYgKE5vZGUtPmdldE9wY29kZSgpID09IElTRDo6Q0FMTFNFUV9TVEFSVCkgcmV0dXJuIE5vZGU7CisgICAgYXNzZXJ0KE5vZGUtPmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpPdGhlciAmJgorICAgICAgICAgIk5vZGUgZG9lc24ndCBoYXZlIGEgdG9rZW4gY2hhaW4gYXJndW1lbnQhIik7CisgIHJldHVybiBGaW5kQ2FsbFN0YXJ0RnJvbUNhbGwoTm9kZS0+Z2V0T3BlcmFuZCgwKS5nZXROb2RlKCkpOworfQorCitTRE5vZGUgKlg4NkRBR1RvREFHSVNlbDo6U2VsZWN0QXRvbWljNjQoU0ROb2RlICpOb2RlLCB1bnNpZ25lZCBPcGMpIHsKKyAgU0RWYWx1ZSBDaGFpbiA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgSW4xID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBJbjJMID0gTm9kZS0+Z2V0T3BlcmFuZCgyKTsKKyAgU0RWYWx1ZSBJbjJIID0gTm9kZS0+Z2V0T3BlcmFuZCgzKTsKKyAgU0RWYWx1ZSBUbXAwLCBUbXAxLCBUbXAyLCBUbXAzLCBUbXA0OworICBpZiAoIVNlbGVjdEFkZHIoSW4xLmdldE5vZGUoKSwgSW4xLCBUbXAwLCBUbXAxLCBUbXAyLCBUbXAzLCBUbXA0KSkKKyAgICByZXR1cm4gTlVMTDsKKyAgTWFjaGluZVNETm9kZTo6bW1vX2l0ZXJhdG9yIE1lbU9wID0gTUYtPmFsbG9jYXRlTWVtUmVmc0FycmF5KDEpOworICBNZW1PcFswXSA9IGNhc3Q8TWVtU0ROb2RlPihOb2RlKS0+Z2V0TWVtT3BlcmFuZCgpOworICBjb25zdCBTRFZhbHVlIE9wc1tdID0geyBUbXAwLCBUbXAxLCBUbXAyLCBUbXAzLCBUbXA0LCBJbjJMLCBJbjJILCBDaGFpbn07CisgIFNETm9kZSAqUmVzTm9kZSA9IEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3BjLCBOb2RlLT5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTMyLCBNVlQ6OmkzMiwgTVZUOjpPdGhlciwgT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2xlbmd0aG9mKE9wcykpOworICBjYXN0PE1hY2hpbmVTRE5vZGU+KFJlc05vZGUpLT5zZXRNZW1SZWZzKE1lbU9wLCBNZW1PcCArIDEpOworICByZXR1cm4gUmVzTm9kZTsKK30KKworU0ROb2RlICpYODZEQUdUb0RBR0lTZWw6OlNlbGVjdEF0b21pY0xvYWRBZGQoU0ROb2RlICpOb2RlLCBFVlQgTlZUKSB7CisgIGlmIChOb2RlLT5oYXNBbnlVc2VPZlZhbHVlKDApKQorICAgIHJldHVybiAwOworCisgIC8vIE9wdGltaXplIGNvbW1vbiBwYXR0ZXJucyBmb3IgX19zeW5jX2FkZF9hbmRfZmV0Y2ggYW5kCisgIC8vIF9fc3luY19zdWJfYW5kX2ZldGNoIHdoZXJlIHRoZSByZXN1bHQgaXMgbm90IHVzZWQuIFRoaXMgYWxsb3dzIHVzCisgIC8vIHRvIHVzZSAibG9jayIgdmVyc2lvbiBvZiBhZGQsIHN1YiwgaW5jLCBkZWMgaW5zdHJ1Y3Rpb25zLgorICAvLyBGSVhNRTogRG8gbm90IHVzZSBzcGVjaWFsIGluc3RydWN0aW9ucyBidXQgaW5zdGVhZCBhZGQgdGhlICJsb2NrIgorICAvLyBwcmVmaXggdG8gdGhlIHRhcmdldCBub2RlIHNvbWVob3cuIFRoZSBleHRyYSBpbmZvcm1hdGlvbiB3aWxsIHRoZW4gYmUKKyAgLy8gdHJhbnNmZXJyZWQgdG8gbWFjaGluZSBpbnN0cnVjdGlvbiBhbmQgaXQgZGVub3RlcyB0aGUgcHJlZml4LgorICBTRFZhbHVlIENoYWluID0gTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBQdHIgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIFZhbCA9IE5vZGUtPmdldE9wZXJhbmQoMik7CisgIFNEVmFsdWUgVG1wMCwgVG1wMSwgVG1wMiwgVG1wMywgVG1wNDsKKyAgaWYgKCFTZWxlY3RBZGRyKFB0ci5nZXROb2RlKCksIFB0ciwgVG1wMCwgVG1wMSwgVG1wMiwgVG1wMywgVG1wNCkpCisgICAgcmV0dXJuIDA7CisKKyAgYm9vbCBpc0luYyA9IGZhbHNlLCBpc0RlYyA9IGZhbHNlLCBpc1N1YiA9IGZhbHNlLCBpc0NOID0gZmFsc2U7CisgIENvbnN0YW50U0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihWYWwpOworICBpZiAoQ04pIHsKKyAgICBpc0NOID0gdHJ1ZTsKKyAgICBpbnQ2NF90IENOVmFsID0gQ04tPmdldFNFeHRWYWx1ZSgpOworICAgIGlmIChDTlZhbCA9PSAxKQorICAgICAgaXNJbmMgPSB0cnVlOworICAgIGVsc2UgaWYgKENOVmFsID09IC0xKQorICAgICAgaXNEZWMgPSB0cnVlOworICAgIGVsc2UgaWYgKENOVmFsID49IDApCisgICAgICBWYWwgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KENOVmFsLCBOVlQpOworICAgIGVsc2UgeworICAgICAgaXNTdWIgPSB0cnVlOworICAgICAgVmFsID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgtQ05WYWwsIE5WVCk7CisgICAgfQorICB9IGVsc2UgaWYgKFZhbC5oYXNPbmVVc2UoKSAmJgorICAgICAgICAgICAgIFZhbC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQiAmJgorICAgICAgICAgICAgIFg4Njo6aXNaZXJvTm9kZShWYWwuZ2V0T3BlcmFuZCgwKSkpIHsKKyAgICBpc1N1YiA9IHRydWU7CisgICAgVmFsID0gVmFsLmdldE9wZXJhbmQoMSk7CisgIH0KKworICB1bnNpZ25lZCBPcGMgPSAwOworICBzd2l0Y2ggKE5WVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6IHJldHVybiAwOworICBjYXNlIE1WVDo6aTg6CisgICAgaWYgKGlzSW5jKQorICAgICAgT3BjID0gWDg2OjpMT0NLX0lOQzhtOworICAgIGVsc2UgaWYgKGlzRGVjKQorICAgICAgT3BjID0gWDg2OjpMT0NLX0RFQzhtOworICAgIGVsc2UgaWYgKGlzU3ViKSB7CisgICAgICBpZiAoaXNDTikKKyAgICAgICAgT3BjID0gWDg2OjpMT0NLX1NVQjhtaTsKKyAgICAgIGVsc2UKKyAgICAgICAgT3BjID0gWDg2OjpMT0NLX1NVQjhtcjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzQ04pCisgICAgICAgIE9wYyA9IFg4Njo6TE9DS19BREQ4bWk7CisgICAgICBlbHNlCisgICAgICAgIE9wYyA9IFg4Njo6TE9DS19BREQ4bXI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIE1WVDo6aTE2OgorICAgIGlmIChpc0luYykKKyAgICAgIE9wYyA9IFg4Njo6TE9DS19JTkMxNm07CisgICAgZWxzZSBpZiAoaXNEZWMpCisgICAgICBPcGMgPSBYODY6OkxPQ0tfREVDMTZtOworICAgIGVsc2UgaWYgKGlzU3ViKSB7CisgICAgICBpZiAoaXNDTikgeworICAgICAgICBpZiAoUHJlZGljYXRlX2ltbVNleHQ4KFZhbC5nZXROb2RlKCkpKQorICAgICAgICAgIE9wYyA9IFg4Njo6TE9DS19TVUIxNm1pODsKKyAgICAgICAgZWxzZQorICAgICAgICAgIE9wYyA9IFg4Njo6TE9DS19TVUIxNm1pOworICAgICAgfSBlbHNlCisgICAgICAgIE9wYyA9IFg4Njo6TE9DS19TVUIxNm1yOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaXNDTikgeworICAgICAgICBpZiAoUHJlZGljYXRlX2ltbVNleHQ4KFZhbC5nZXROb2RlKCkpKQorICAgICAgICAgIE9wYyA9IFg4Njo6TE9DS19BREQxNm1pODsKKyAgICAgICAgZWxzZQorICAgICAgICAgIE9wYyA9IFg4Njo6TE9DS19BREQxNm1pOworICAgICAgfSBlbHNlCisgICAgICAgIE9wYyA9IFg4Njo6TE9DS19BREQxNm1yOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBNVlQ6OmkzMjoKKyAgICBpZiAoaXNJbmMpCisgICAgICBPcGMgPSBYODY6OkxPQ0tfSU5DMzJtOworICAgIGVsc2UgaWYgKGlzRGVjKQorICAgICAgT3BjID0gWDg2OjpMT0NLX0RFQzMybTsKKyAgICBlbHNlIGlmIChpc1N1YikgeworICAgICAgaWYgKGlzQ04pIHsKKyAgICAgICAgaWYgKFByZWRpY2F0ZV9pbW1TZXh0OChWYWwuZ2V0Tm9kZSgpKSkKKyAgICAgICAgICBPcGMgPSBYODY6OkxPQ0tfU1VCMzJtaTg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBPcGMgPSBYODY6OkxPQ0tfU1VCMzJtaTsKKyAgICAgIH0gZWxzZQorICAgICAgICBPcGMgPSBYODY6OkxPQ0tfU1VCMzJtcjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzQ04pIHsKKyAgICAgICAgaWYgKFByZWRpY2F0ZV9pbW1TZXh0OChWYWwuZ2V0Tm9kZSgpKSkKKyAgICAgICAgICBPcGMgPSBYODY6OkxPQ0tfQUREMzJtaTg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBPcGMgPSBYODY6OkxPQ0tfQUREMzJtaTsKKyAgICAgIH0gZWxzZQorICAgICAgICBPcGMgPSBYODY6OkxPQ0tfQUREMzJtcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjppNjQ6CisgICAgaWYgKGlzSW5jKQorICAgICAgT3BjID0gWDg2OjpMT0NLX0lOQzY0bTsKKyAgICBlbHNlIGlmIChpc0RlYykKKyAgICAgIE9wYyA9IFg4Njo6TE9DS19ERUM2NG07CisgICAgZWxzZSBpZiAoaXNTdWIpIHsKKyAgICAgIE9wYyA9IFg4Njo6TE9DS19TVUI2NG1yOworICAgICAgaWYgKGlzQ04pIHsKKyAgICAgICAgaWYgKFByZWRpY2F0ZV9pbW1TZXh0OChWYWwuZ2V0Tm9kZSgpKSkKKyAgICAgICAgICBPcGMgPSBYODY6OkxPQ0tfU1VCNjRtaTg7CisgICAgICAgIGVsc2UgaWYgKFByZWRpY2F0ZV9pNjRpbW1TRXh0MzIoVmFsLmdldE5vZGUoKSkpCisgICAgICAgICAgT3BjID0gWDg2OjpMT0NLX1NVQjY0bWkzMjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgT3BjID0gWDg2OjpMT0NLX0FERDY0bXI7CisgICAgICBpZiAoaXNDTikgeworICAgICAgICBpZiAoUHJlZGljYXRlX2ltbVNleHQ4KFZhbC5nZXROb2RlKCkpKQorICAgICAgICAgIE9wYyA9IFg4Njo6TE9DS19BREQ2NG1pODsKKyAgICAgICAgZWxzZSBpZiAoUHJlZGljYXRlX2k2NGltbVNFeHQzMihWYWwuZ2V0Tm9kZSgpKSkKKyAgICAgICAgICBPcGMgPSBYODY6OkxPQ0tfQURENjRtaTMyOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIERlYnVnTG9jIGRsID0gTm9kZS0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBVbmRlZiA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbCwgTlZUKSwgMCk7CisgIE1hY2hpbmVTRE5vZGU6Om1tb19pdGVyYXRvciBNZW1PcCA9IE1GLT5hbGxvY2F0ZU1lbVJlZnNBcnJheSgxKTsKKyAgTWVtT3BbMF0gPSBjYXN0PE1lbVNETm9kZT4oTm9kZSktPmdldE1lbU9wZXJhbmQoKTsKKyAgaWYgKGlzSW5jIHx8IGlzRGVjKSB7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgVG1wMCwgVG1wMSwgVG1wMiwgVG1wMywgVG1wNCwgQ2hhaW4gfTsKKyAgICBTRFZhbHVlIFJldCA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBNVlQ6Ok90aGVyLCBPcHMsIDYpLCAwKTsKKyAgICBjYXN0PE1hY2hpbmVTRE5vZGU+KFJldCktPnNldE1lbVJlZnMoTWVtT3AsIE1lbU9wICsgMSk7CisgICAgU0RWYWx1ZSBSZXRWYWxzW10gPSB7IFVuZGVmLCBSZXQgfTsKKyAgICByZXR1cm4gQ3VyREFHLT5nZXRNZXJnZVZhbHVlcyhSZXRWYWxzLCAyLCBkbCkuZ2V0Tm9kZSgpOworICB9IGVsc2UgeworICAgIFNEVmFsdWUgT3BzW10gPSB7IFRtcDAsIFRtcDEsIFRtcDIsIFRtcDMsIFRtcDQsIFZhbCwgQ2hhaW4gfTsKKyAgICBTRFZhbHVlIFJldCA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBNVlQ6Ok90aGVyLCBPcHMsIDcpLCAwKTsKKyAgICBjYXN0PE1hY2hpbmVTRE5vZGU+KFJldCktPnNldE1lbVJlZnMoTWVtT3AsIE1lbU9wICsgMSk7CisgICAgU0RWYWx1ZSBSZXRWYWxzW10gPSB7IFVuZGVmLCBSZXQgfTsKKyAgICByZXR1cm4gQ3VyREFHLT5nZXRNZXJnZVZhbHVlcyhSZXRWYWxzLCAyLCBkbCkuZ2V0Tm9kZSgpOworICB9Cit9CisKKy8vLyBIYXNOb1NpZ25lZENvbXBhcmlzb25Vc2VzIC0gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBYODZJU0Q6OkNNUCBub2RlIGhhcworLy8vIGFueSB1c2VzIHdoaWNoIHJlcXVpcmUgdGhlIFNGIG9yIE9GIGJpdHMgdG8gYmUgYWNjdXJhdGUuCitzdGF0aWMgYm9vbCBIYXNOb1NpZ25lZENvbXBhcmlzb25Vc2VzKFNETm9kZSAqTikgeworICAvLyBFeGFtaW5lIGVhY2ggdXNlciBvZiB0aGUgbm9kZS4KKyAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IE4tPnVzZV9iZWdpbigpLAorICAgICAgICAgVUUgPSBOLT51c2VfZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgLy8gT25seSBleGFtaW5lIENvcHlUb1JlZyB1c2VzLgorICAgIGlmIChVSS0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpDb3B5VG9SZWcpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gT25seSBleGFtaW5lIENvcHlUb1JlZyB1c2VzIHRoYXQgY29weSB0byBFRkxBR1MuCisgICAgaWYgKGNhc3Q8UmVnaXN0ZXJTRE5vZGU+KFVJLT5nZXRPcGVyYW5kKDEpKS0+Z2V0UmVnKCkgIT0KKyAgICAgICAgICBYODY6OkVGTEFHUykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBFeGFtaW5lIGVhY2ggdXNlciBvZiB0aGUgQ29weVRvUmVnIHVzZS4KKyAgICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIEZsYWdVSSA9IFVJLT51c2VfYmVnaW4oKSwKKyAgICAgICAgICAgRmxhZ1VFID0gVUktPnVzZV9lbmQoKTsgRmxhZ1VJICE9IEZsYWdVRTsgKytGbGFnVUkpIHsKKyAgICAgIC8vIE9ubHkgZXhhbWluZSB0aGUgRmxhZyByZXN1bHQuCisgICAgICBpZiAoRmxhZ1VJLmdldFVzZSgpLmdldFJlc05vKCkgIT0gMSkgY29udGludWU7CisgICAgICAvLyBBbnl0aGluZyB1bnVzdWFsOiBhc3N1bWUgY29uc2VydmF0aXZlbHkuCisgICAgICBpZiAoIUZsYWdVSS0+aXNNYWNoaW5lT3Bjb2RlKCkpIHJldHVybiBmYWxzZTsKKyAgICAgIC8vIEV4YW1pbmUgdGhlIG9wY29kZSBvZiB0aGUgdXNlci4KKyAgICAgIHN3aXRjaCAoRmxhZ1VJLT5nZXRNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICAgIC8vIFRoZXNlIGNvbXBhcmlzb25zIGRvbid0IHRyZWF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBzcGVjaWFsbHkuCisgICAgICBjYXNlIFg4Njo6U0VUQXI6IGNhc2UgWDg2OjpTRVRBRXI6IGNhc2UgWDg2OjpTRVRCcjogY2FzZSBYODY6OlNFVEJFcjoKKyAgICAgIGNhc2UgWDg2OjpTRVRFcjogY2FzZSBYODY6OlNFVE5FcjogY2FzZSBYODY6OlNFVFByOiBjYXNlIFg4Njo6U0VUTlByOgorICAgICAgY2FzZSBYODY6OlNFVEFtOiBjYXNlIFg4Njo6U0VUQUVtOiBjYXNlIFg4Njo6U0VUQm06IGNhc2UgWDg2OjpTRVRCRW06CisgICAgICBjYXNlIFg4Njo6U0VURW06IGNhc2UgWDg2OjpTRVRORW06IGNhc2UgWDg2OjpTRVRQbTogY2FzZSBYODY6OlNFVE5QbToKKyAgICAgIGNhc2UgWDg2OjpKQV80OiBjYXNlIFg4Njo6SkFFXzQ6IGNhc2UgWDg2OjpKQl80OiBjYXNlIFg4Njo6SkJFXzQ6CisgICAgICBjYXNlIFg4Njo6SkVfNDogY2FzZSBYODY6OkpORV80OiBjYXNlIFg4Njo6SlBfNDogY2FzZSBYODY6OkpOUF80OgorICAgICAgY2FzZSBYODY6OkNNT1ZBMTZycjogY2FzZSBYODY6OkNNT1ZBMTZybToKKyAgICAgIGNhc2UgWDg2OjpDTU9WQTMycnI6IGNhc2UgWDg2OjpDTU9WQTMycm06CisgICAgICBjYXNlIFg4Njo6Q01PVkE2NHJyOiBjYXNlIFg4Njo6Q01PVkE2NHJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZBRTE2cnI6IGNhc2UgWDg2OjpDTU9WQUUxNnJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZBRTMycnI6IGNhc2UgWDg2OjpDTU9WQUUzMnJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZBRTY0cnI6IGNhc2UgWDg2OjpDTU9WQUU2NHJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZCMTZycjogY2FzZSBYODY6OkNNT1ZCMTZybToKKyAgICAgIGNhc2UgWDg2OjpDTU9WQjMycnI6IGNhc2UgWDg2OjpDTU9WQjMycm06CisgICAgICBjYXNlIFg4Njo6Q01PVkI2NHJyOiBjYXNlIFg4Njo6Q01PVkI2NHJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZCRTE2cnI6IGNhc2UgWDg2OjpDTU9WQkUxNnJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZCRTMycnI6IGNhc2UgWDg2OjpDTU9WQkUzMnJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZCRTY0cnI6IGNhc2UgWDg2OjpDTU9WQkU2NHJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZFMTZycjogY2FzZSBYODY6OkNNT1ZFMTZybToKKyAgICAgIGNhc2UgWDg2OjpDTU9WRTMycnI6IGNhc2UgWDg2OjpDTU9WRTMycm06CisgICAgICBjYXNlIFg4Njo6Q01PVkU2NHJyOiBjYXNlIFg4Njo6Q01PVkU2NHJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZORTE2cnI6IGNhc2UgWDg2OjpDTU9WTkUxNnJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZORTMycnI6IGNhc2UgWDg2OjpDTU9WTkUzMnJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZORTY0cnI6IGNhc2UgWDg2OjpDTU9WTkU2NHJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZOUDE2cnI6IGNhc2UgWDg2OjpDTU9WTlAxNnJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZOUDMycnI6IGNhc2UgWDg2OjpDTU9WTlAzMnJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZOUDY0cnI6IGNhc2UgWDg2OjpDTU9WTlA2NHJtOgorICAgICAgY2FzZSBYODY6OkNNT1ZQMTZycjogY2FzZSBYODY6OkNNT1ZQMTZybToKKyAgICAgIGNhc2UgWDg2OjpDTU9WUDMycnI6IGNhc2UgWDg2OjpDTU9WUDMycm06CisgICAgICBjYXNlIFg4Njo6Q01PVlA2NHJyOiBjYXNlIFg4Njo6Q01PVlA2NHJtOgorICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIEFueXRoaW5nIGVsc2U6IGFzc3VtZSBjb25zZXJ2YXRpdmVseS4KKyAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1NETm9kZSAqWDg2REFHVG9EQUdJU2VsOjpTZWxlY3QoU0ROb2RlICpOb2RlKSB7CisgIEVWVCBOVlQgPSBOb2RlLT5nZXRWYWx1ZVR5cGUoMCk7CisgIHVuc2lnbmVkIE9wYywgTU9wYzsKKyAgdW5zaWduZWQgT3Bjb2RlID0gTm9kZS0+Z2V0T3Bjb2RlKCk7CisgIERlYnVnTG9jIGRsID0gTm9kZS0+Z2V0RGVidWdMb2MoKTsKKyAgCisgIERFQlVHKGRiZ3MoKSA8PCAiU2VsZWN0aW5nOiAiOyBOb2RlLT5kdW1wKEN1ckRBRyk7IGRiZ3MoKSA8PCAnXG4nKTsKKworICBpZiAoTm9kZS0+aXNNYWNoaW5lT3Bjb2RlKCkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIj09ICI7ICBOb2RlLT5kdW1wKEN1ckRBRyk7IGRiZ3MoKSA8PCAnXG4nKTsKKyAgICByZXR1cm4gTlVMTDsgICAvLyBBbHJlYWR5IHNlbGVjdGVkLgorICB9CisKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgWDg2SVNEOjpHbG9iYWxCYXNlUmVnOgorICAgIHJldHVybiBnZXRHbG9iYWxCYXNlUmVnKCk7CisKKyAgY2FzZSBYODZJU0Q6OkFUT01PUjY0X0RBRzoKKyAgICByZXR1cm4gU2VsZWN0QXRvbWljNjQoTm9kZSwgWDg2OjpBVE9NT1I2NDMyKTsKKyAgY2FzZSBYODZJU0Q6OkFUT01YT1I2NF9EQUc6CisgICAgcmV0dXJuIFNlbGVjdEF0b21pYzY0KE5vZGUsIFg4Njo6QVRPTVhPUjY0MzIpOworICBjYXNlIFg4NklTRDo6QVRPTUFERDY0X0RBRzoKKyAgICByZXR1cm4gU2VsZWN0QXRvbWljNjQoTm9kZSwgWDg2OjpBVE9NQURENjQzMik7CisgIGNhc2UgWDg2SVNEOjpBVE9NU1VCNjRfREFHOgorICAgIHJldHVybiBTZWxlY3RBdG9taWM2NChOb2RlLCBYODY6OkFUT01TVUI2NDMyKTsKKyAgY2FzZSBYODZJU0Q6OkFUT01OQU5ENjRfREFHOgorICAgIHJldHVybiBTZWxlY3RBdG9taWM2NChOb2RlLCBYODY6OkFUT01OQU5ENjQzMik7CisgIGNhc2UgWDg2SVNEOjpBVE9NQU5ENjRfREFHOgorICAgIHJldHVybiBTZWxlY3RBdG9taWM2NChOb2RlLCBYODY6OkFUT01BTkQ2NDMyKTsKKyAgY2FzZSBYODZJU0Q6OkFUT01TV0FQNjRfREFHOgorICAgIHJldHVybiBTZWxlY3RBdG9taWM2NChOb2RlLCBYODY6OkFUT01TV0FQNjQzMik7CisKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX0FERDogeworICAgIFNETm9kZSAqUmV0VmFsID0gU2VsZWN0QXRvbWljTG9hZEFkZChOb2RlLCBOVlQpOworICAgIGlmIChSZXRWYWwpCisgICAgICByZXR1cm4gUmV0VmFsOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBJU0Q6OlNNVUxfTE9ISToKKyAgY2FzZSBJU0Q6OlVNVUxfTE9ISTogeworICAgIFNEVmFsdWUgTjAgPSBOb2RlLT5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgTjEgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworCisgICAgYm9vbCBpc1NpZ25lZCA9IE9wY29kZSA9PSBJU0Q6OlNNVUxfTE9ISTsKKyAgICBpZiAoIWlzU2lnbmVkKSB7CisgICAgICBzd2l0Y2ggKE5WVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBWVCEiKTsKKyAgICAgIGNhc2UgTVZUOjppODogIE9wYyA9IFg4Njo6TVVMOHI7ICBNT3BjID0gWDg2OjpNVUw4bTsgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmkxNjogT3BjID0gWDg2OjpNVUwxNnI7IE1PcGMgPSBYODY6Ok1VTDE2bTsgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6aTMyOiBPcGMgPSBYODY6Ok1VTDMycjsgTU9wYyA9IFg4Njo6TVVMMzJtOyBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppNjQ6IE9wYyA9IFg4Njo6TVVMNjRyOyBNT3BjID0gWDg2OjpNVUw2NG07IGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKE5WVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBWVCEiKTsKKyAgICAgIGNhc2UgTVZUOjppODogIE9wYyA9IFg4Njo6SU1VTDhyOyAgTU9wYyA9IFg4Njo6SU1VTDhtOyAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6aTE2OiBPcGMgPSBYODY6OklNVUwxNnI7IE1PcGMgPSBYODY6OklNVUwxNm07IGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmkzMjogT3BjID0gWDg2OjpJTVVMMzJyOyBNT3BjID0gWDg2OjpJTVVMMzJtOyBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppNjQ6IE9wYyA9IFg4Njo6SU1VTDY0cjsgTU9wYyA9IFg4Njo6SU1VTDY0bTsgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgdW5zaWduZWQgTG9SZWcsIEhpUmVnOworICAgIHN3aXRjaCAoTlZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBWVCEiKTsKKyAgICBjYXNlIE1WVDo6aTg6ICBMb1JlZyA9IFg4Njo6QUw7ICBIaVJlZyA9IFg4Njo6QUg7ICBicmVhazsKKyAgICBjYXNlIE1WVDo6aTE2OiBMb1JlZyA9IFg4Njo6QVg7ICBIaVJlZyA9IFg4Njo6RFg7ICBicmVhazsKKyAgICBjYXNlIE1WVDo6aTMyOiBMb1JlZyA9IFg4Njo6RUFYOyBIaVJlZyA9IFg4Njo6RURYOyBicmVhazsKKyAgICBjYXNlIE1WVDo6aTY0OiBMb1JlZyA9IFg4Njo6UkFYOyBIaVJlZyA9IFg4Njo6UkRYOyBicmVhazsKKyAgICB9CisKKyAgICBTRFZhbHVlIFRtcDAsIFRtcDEsIFRtcDIsIFRtcDMsIFRtcDQ7CisgICAgYm9vbCBmb2xkZWRMb2FkID0gVHJ5Rm9sZExvYWQoTm9kZSwgTjEsIFRtcDAsIFRtcDEsIFRtcDIsIFRtcDMsIFRtcDQpOworICAgIC8vIE11bHRpcGx5IGlzIGNvbW1tdXRhdGl2ZS4KKyAgICBpZiAoIWZvbGRlZExvYWQpIHsKKyAgICAgIGZvbGRlZExvYWQgPSBUcnlGb2xkTG9hZChOb2RlLCBOMCwgVG1wMCwgVG1wMSwgVG1wMiwgVG1wMywgVG1wNCk7CisgICAgICBpZiAoZm9sZGVkTG9hZCkKKyAgICAgICAgc3RkOjpzd2FwKE4wLCBOMSk7CisgICAgfQorCisgICAgU0RWYWx1ZSBJbkZsYWcgPSBDdXJEQUctPmdldENvcHlUb1JlZyhDdXJEQUctPmdldEVudHJ5Tm9kZSgpLCBkbCwgTG9SZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wLCBTRFZhbHVlKCkpLmdldFZhbHVlKDEpOworCisgICAgaWYgKGZvbGRlZExvYWQpIHsKKyAgICAgIFNEVmFsdWUgT3BzW10gPSB7IFRtcDAsIFRtcDEsIFRtcDIsIFRtcDMsIFRtcDQsIE4xLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBJbkZsYWcgfTsKKyAgICAgIFNETm9kZSAqQ05vZGUgPQorICAgICAgICBDdXJEQUctPmdldE1hY2hpbmVOb2RlKE1PcGMsIGRsLCBNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcsIE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9sZW5ndGhvZihPcHMpKTsKKyAgICAgIEluRmxhZyA9IFNEVmFsdWUoQ05vZGUsIDEpOworICAgICAgLy8gVXBkYXRlIHRoZSBjaGFpbi4KKyAgICAgIFJlcGxhY2VVc2VzKE4xLmdldFZhbHVlKDEpLCBTRFZhbHVlKENOb2RlLCAwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEluRmxhZyA9CisgICAgICAgIFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBNVlQ6OkZsYWcsIE4xLCBJbkZsYWcpLCAwKTsKKyAgICB9CisKKyAgICAvLyBQcmV2ZW50IHVzZSBvZiBBSCBpbiBhIFJFWCBpbnN0cnVjdGlvbiBieSByZWZlcmVuY2luZyBBWCBpbnN0ZWFkLgorICAgIGlmIChIaVJlZyA9PSBYODY6OkFIICYmIFN1YnRhcmdldC0+aXM2NEJpdCgpICYmCisgICAgICAgICFTRFZhbHVlKE5vZGUsIDEpLnVzZV9lbXB0eSgpKSB7CisgICAgICBTRFZhbHVlIFJlc3VsdCA9IEN1ckRBRy0+Z2V0Q29weUZyb21SZWcoQ3VyREFHLT5nZXRFbnRyeU5vZGUoKSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBWCwgTVZUOjppMTYsIEluRmxhZyk7CisgICAgICBJbkZsYWcgPSBSZXN1bHQuZ2V0VmFsdWUoMik7CisgICAgICAvLyBHZXQgdGhlIGxvdyBwYXJ0IGlmIG5lZWRlZC4gRG9uJ3QgdXNlIGdldENvcHlGcm9tUmVnIGZvciBhbGlhc2luZworICAgICAgLy8gcmVnaXN0ZXJzLgorICAgICAgaWYgKCFTRFZhbHVlKE5vZGUsIDApLnVzZV9lbXB0eSgpKQorICAgICAgICBSZXBsYWNlVXNlcyhTRFZhbHVlKE5vZGUsIDEpLAorICAgICAgICAgIEN1ckRBRy0+Z2V0VGFyZ2V0RXh0cmFjdFN1YnJlZyhYODY6OnN1Yl84Yml0LCBkbCwgTVZUOjppOCwgUmVzdWx0KSk7CisKKyAgICAgIC8vIFNoaWZ0IEFYIGRvd24gOCBiaXRzLgorICAgICAgUmVzdWx0ID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFg4Njo6U0hSMTZyaSwgZGwsIE1WVDo6aTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDgsIE1WVDo6aTgpKSwgMCk7CisgICAgICAvLyBUaGVuIHRydW5jYXRlIGl0IGRvd24gdG8gaTguCisgICAgICBSZXBsYWNlVXNlcyhTRFZhbHVlKE5vZGUsIDEpLAorICAgICAgICBDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoWDg2OjpzdWJfOGJpdCwgZGwsIE1WVDo6aTgsIFJlc3VsdCkpOworICAgIH0KKyAgICAvLyBDb3B5IHRoZSBsb3cgaGFsZiBvZiB0aGUgcmVzdWx0LCBpZiBpdCBpcyBuZWVkZWQuCisgICAgaWYgKCFTRFZhbHVlKE5vZGUsIDApLnVzZV9lbXB0eSgpKSB7CisgICAgICBTRFZhbHVlIFJlc3VsdCA9IEN1ckRBRy0+Z2V0Q29weUZyb21SZWcoQ3VyREFHLT5nZXRFbnRyeU5vZGUoKSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb1JlZywgTlZULCBJbkZsYWcpOworICAgICAgSW5GbGFnID0gUmVzdWx0LmdldFZhbHVlKDIpOworICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOb2RlLCAwKSwgUmVzdWx0KTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiPT4gIjsgUmVzdWx0LmdldE5vZGUoKS0+ZHVtcChDdXJEQUcpOyBkYmdzKCkgPDwgJ1xuJyk7CisgICAgfQorICAgIC8vIENvcHkgdGhlIGhpZ2ggaGFsZiBvZiB0aGUgcmVzdWx0LCBpZiBpdCBpcyBuZWVkZWQuCisgICAgaWYgKCFTRFZhbHVlKE5vZGUsIDEpLnVzZV9lbXB0eSgpKSB7CisgICAgICBTRFZhbHVlIFJlc3VsdCA9IEN1ckRBRy0+Z2V0Q29weUZyb21SZWcoQ3VyREFHLT5nZXRFbnRyeU5vZGUoKSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlSZWcsIE5WVCwgSW5GbGFnKTsKKyAgICAgIEluRmxhZyA9IFJlc3VsdC5nZXRWYWx1ZSgyKTsKKyAgICAgIFJlcGxhY2VVc2VzKFNEVmFsdWUoTm9kZSwgMSksIFJlc3VsdCk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIj0+ICI7IFJlc3VsdC5nZXROb2RlKCktPmR1bXAoQ3VyREFHKTsgZGJncygpIDw8ICdcbicpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgY2FzZSBJU0Q6OlNESVZSRU06CisgIGNhc2UgSVNEOjpVRElWUkVNOiB7CisgICAgU0RWYWx1ZSBOMCA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSBOMSA9IE5vZGUtPmdldE9wZXJhbmQoMSk7CisKKyAgICBib29sIGlzU2lnbmVkID0gT3Bjb2RlID09IElTRDo6U0RJVlJFTTsKKyAgICBpZiAoIWlzU2lnbmVkKSB7CisgICAgICBzd2l0Y2ggKE5WVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBWVCEiKTsKKyAgICAgIGNhc2UgTVZUOjppODogIE9wYyA9IFg4Njo6RElWOHI7ICBNT3BjID0gWDg2OjpESVY4bTsgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmkxNjogT3BjID0gWDg2OjpESVYxNnI7IE1PcGMgPSBYODY6OkRJVjE2bTsgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6aTMyOiBPcGMgPSBYODY6OkRJVjMycjsgTU9wYyA9IFg4Njo6RElWMzJtOyBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppNjQ6IE9wYyA9IFg4Njo6RElWNjRyOyBNT3BjID0gWDg2OjpESVY2NG07IGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKE5WVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBWVCEiKTsKKyAgICAgIGNhc2UgTVZUOjppODogIE9wYyA9IFg4Njo6SURJVjhyOyAgTU9wYyA9IFg4Njo6SURJVjhtOyAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6aTE2OiBPcGMgPSBYODY6OklESVYxNnI7IE1PcGMgPSBYODY6OklESVYxNm07IGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmkzMjogT3BjID0gWDg2OjpJRElWMzJyOyBNT3BjID0gWDg2OjpJRElWMzJtOyBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppNjQ6IE9wYyA9IFg4Njo6SURJVjY0cjsgTU9wYyA9IFg4Njo6SURJVjY0bTsgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgdW5zaWduZWQgTG9SZWcsIEhpUmVnLCBDbHJSZWc7CisgICAgdW5zaWduZWQgQ2xyT3Bjb2RlLCBTRXh0T3Bjb2RlOworICAgIHN3aXRjaCAoTlZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBWVCEiKTsKKyAgICBjYXNlIE1WVDo6aTg6CisgICAgICBMb1JlZyA9IFg4Njo6QUw7ICBDbHJSZWcgPSBIaVJlZyA9IFg4Njo6QUg7CisgICAgICBDbHJPcGNvZGUgID0gMDsKKyAgICAgIFNFeHRPcGNvZGUgPSBYODY6OkNCVzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVZUOjppMTY6CisgICAgICBMb1JlZyA9IFg4Njo6QVg7ICBIaVJlZyA9IFg4Njo6RFg7CisgICAgICBDbHJPcGNvZGUgID0gWDg2OjpNT1YxNnIwOyBDbHJSZWcgPSBYODY6OkRYOworICAgICAgU0V4dE9wY29kZSA9IFg4Njo6Q1dEOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNVlQ6OmkzMjoKKyAgICAgIExvUmVnID0gWDg2OjpFQVg7IENsclJlZyA9IEhpUmVnID0gWDg2OjpFRFg7CisgICAgICBDbHJPcGNvZGUgID0gWDg2OjpNT1YzMnIwOworICAgICAgU0V4dE9wY29kZSA9IFg4Njo6Q0RROworICAgICAgYnJlYWs7CisgICAgY2FzZSBNVlQ6Omk2NDoKKyAgICAgIExvUmVnID0gWDg2OjpSQVg7IENsclJlZyA9IEhpUmVnID0gWDg2OjpSRFg7CisgICAgICBDbHJPcGNvZGUgID0gWDg2OjpNT1Y2NHIwOworICAgICAgU0V4dE9wY29kZSA9IFg4Njo6Q1FPOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgU0RWYWx1ZSBUbXAwLCBUbXAxLCBUbXAyLCBUbXAzLCBUbXA0OworICAgIGJvb2wgZm9sZGVkTG9hZCA9IFRyeUZvbGRMb2FkKE5vZGUsIE4xLCBUbXAwLCBUbXAxLCBUbXAyLCBUbXAzLCBUbXA0KTsKKyAgICBib29sIHNpZ25CaXRJc1plcm8gPSBDdXJEQUctPlNpZ25CaXRJc1plcm8oTjApOworCisgICAgU0RWYWx1ZSBJbkZsYWc7CisgICAgaWYgKE5WVCA9PSBNVlQ6Omk4ICYmICghaXNTaWduZWQgfHwgc2lnbkJpdElzWmVybykpIHsKKyAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgZGl2OCwganVzdCB1c2UgYSBtb3ZlIHdpdGggemVybyBleHRlbnNpb24gdG8gQVggdG8KKyAgICAgIC8vIGNsZWFyIHRoZSB1cHBlciA4IGJpdHMgKEFIKS4KKyAgICAgIFNEVmFsdWUgVG1wMCwgVG1wMSwgVG1wMiwgVG1wMywgVG1wNCwgTW92ZSwgQ2hhaW47CisgICAgICBpZiAoVHJ5Rm9sZExvYWQoTm9kZSwgTjAsIFRtcDAsIFRtcDEsIFRtcDIsIFRtcDMsIFRtcDQpKSB7CisgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7IFRtcDAsIFRtcDEsIFRtcDIsIFRtcDMsIFRtcDQsIE4wLmdldE9wZXJhbmQoMCkgfTsKKyAgICAgICAgTW92ZSA9CisgICAgICAgICAgU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFg4Njo6TU9WWlgxNnJtOCwgZGwsIE1WVDo6aTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLCBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2xlbmd0aG9mKE9wcykpLCAwKTsKKyAgICAgICAgQ2hhaW4gPSBNb3ZlLmdldFZhbHVlKDEpOworICAgICAgICBSZXBsYWNlVXNlcyhOMC5nZXRWYWx1ZSgxKSwgQ2hhaW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTW92ZSA9CisgICAgICAgICAgU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFg4Njo6TU9WWlgxNnJyOCwgZGwsIE1WVDo6aTE2LCBOMCksMCk7CisgICAgICAgIENoYWluID0gQ3VyREFHLT5nZXRFbnRyeU5vZGUoKTsKKyAgICAgIH0KKyAgICAgIENoYWluICA9IEN1ckRBRy0+Z2V0Q29weVRvUmVnKENoYWluLCBkbCwgWDg2OjpBWCwgTW92ZSwgU0RWYWx1ZSgpKTsKKyAgICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICAgIH0gZWxzZSB7CisgICAgICBJbkZsYWcgPQorICAgICAgICBDdXJEQUctPmdldENvcHlUb1JlZyhDdXJEQUctPmdldEVudHJ5Tm9kZSgpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9SZWcsIE4wLCBTRFZhbHVlKCkpLmdldFZhbHVlKDEpOworICAgICAgaWYgKGlzU2lnbmVkICYmICFzaWduQml0SXNaZXJvKSB7CisgICAgICAgIC8vIFNpZ24gZXh0ZW5kIHRoZSBsb3cgcGFydCBpbnRvIHRoZSBoaWdoIHBhcnQuCisgICAgICAgIEluRmxhZyA9CisgICAgICAgICAgU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFNFeHRPcGNvZGUsIGRsLCBNVlQ6OkZsYWcsIEluRmxhZyksMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBaZXJvIG91dCB0aGUgaGlnaCBwYXJ0LCBlZmZlY3RpdmVseSB6ZXJvIGV4dGVuZGluZyB0aGUgaW5wdXQuCisgICAgICAgIFNEVmFsdWUgQ2xyTm9kZSA9CisgICAgICAgICAgU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKENsck9wY29kZSwgZGwsIE5WVCksIDApOworICAgICAgICBJbkZsYWcgPSBDdXJEQUctPmdldENvcHlUb1JlZyhDdXJEQUctPmdldEVudHJ5Tm9kZSgpLCBkbCwgQ2xyUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHJOb2RlLCBJbkZsYWcpLmdldFZhbHVlKDEpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmb2xkZWRMb2FkKSB7CisgICAgICBTRFZhbHVlIE9wc1tdID0geyBUbXAwLCBUbXAxLCBUbXAyLCBUbXAzLCBUbXA0LCBOMS5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5GbGFnIH07CisgICAgICBTRE5vZGUgKkNOb2RlID0KKyAgICAgICAgQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShNT3BjLCBkbCwgTVZUOjpPdGhlciwgTVZUOjpGbGFnLCBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7CisgICAgICBJbkZsYWcgPSBTRFZhbHVlKENOb2RlLCAxKTsKKyAgICAgIC8vIFVwZGF0ZSB0aGUgY2hhaW4uCisgICAgICBSZXBsYWNlVXNlcyhOMS5nZXRWYWx1ZSgxKSwgU0RWYWx1ZShDTm9kZSwgMCkpOworICAgIH0gZWxzZSB7CisgICAgICBJbkZsYWcgPQorICAgICAgICBTRFZhbHVlKEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoT3BjLCBkbCwgTVZUOjpGbGFnLCBOMSwgSW5GbGFnKSwgMCk7CisgICAgfQorCisgICAgLy8gUHJldmVudCB1c2Ugb2YgQUggaW4gYSBSRVggaW5zdHJ1Y3Rpb24gYnkgcmVmZXJlbmNpbmcgQVggaW5zdGVhZC4KKyAgICAvLyBTaGlmdCBpdCBkb3duIDggYml0cy4KKyAgICBpZiAoSGlSZWcgPT0gWDg2OjpBSCAmJiBTdWJ0YXJnZXQtPmlzNjRCaXQoKSAmJgorICAgICAgICAhU0RWYWx1ZShOb2RlLCAxKS51c2VfZW1wdHkoKSkgeworICAgICAgU0RWYWx1ZSBSZXN1bHQgPSBDdXJEQUctPmdldENvcHlGcm9tUmVnKEN1ckRBRy0+Z2V0RW50cnlOb2RlKCksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6QVgsIE1WVDo6aTE2LCBJbkZsYWcpOworICAgICAgSW5GbGFnID0gUmVzdWx0LmdldFZhbHVlKDIpOworCisgICAgICAvLyBJZiB3ZSBhbHNvIG5lZWQgQUwgKHRoZSBxdW90aWVudCksIGdldCBpdCBieSBleHRyYWN0aW5nIGEgc3VicmVnIGZyb20KKyAgICAgIC8vIFJlc3VsdC4gVGhlIGZhc3QgcmVnaXN0ZXIgYWxsb2NhdG9yIGRvZXMgbm90IGxpa2UgbXVsdGlwbGUgQ29weUZyb21SZWcKKyAgICAgIC8vIG5vZGVzIHVzaW5nIGFsaWFzaW5nIHJlZ2lzdGVycy4KKyAgICAgIGlmICghU0RWYWx1ZShOb2RlLCAwKS51c2VfZW1wdHkoKSkKKyAgICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOb2RlLCAwKSwKKyAgICAgICAgICBDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoWDg2OjpzdWJfOGJpdCwgZGwsIE1WVDo6aTgsIFJlc3VsdCkpOworCisgICAgICAvLyBTaGlmdCBBWCByaWdodCBieSA4IGJpdHMgaW5zdGVhZCBvZiB1c2luZyBBSC4KKyAgICAgIFJlc3VsdCA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShYODY6OlNIUjE2cmksIGRsLCBNVlQ6OmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDgsIE1WVDo6aTgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICBSZXBsYWNlVXNlcyhTRFZhbHVlKE5vZGUsIDEpLAorICAgICAgICBDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoWDg2OjpzdWJfOGJpdCwgZGwsIE1WVDo6aTgsIFJlc3VsdCkpOworICAgIH0KKyAgICAvLyBDb3B5IHRoZSBkaXZpc2lvbiAobG93KSByZXN1bHQsIGlmIGl0IGlzIG5lZWRlZC4KKyAgICBpZiAoIVNEVmFsdWUoTm9kZSwgMCkudXNlX2VtcHR5KCkpIHsKKyAgICAgIFNEVmFsdWUgUmVzdWx0ID0gQ3VyREFHLT5nZXRDb3B5RnJvbVJlZyhDdXJEQUctPmdldEVudHJ5Tm9kZSgpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvUmVnLCBOVlQsIEluRmxhZyk7CisgICAgICBJbkZsYWcgPSBSZXN1bHQuZ2V0VmFsdWUoMik7CisgICAgICBSZXBsYWNlVXNlcyhTRFZhbHVlKE5vZGUsIDApLCBSZXN1bHQpOworICAgICAgREVCVUcoZGJncygpIDw8ICI9PiAiOyBSZXN1bHQuZ2V0Tm9kZSgpLT5kdW1wKEN1ckRBRyk7IGRiZ3MoKSA8PCAnXG4nKTsKKyAgICB9CisgICAgLy8gQ29weSB0aGUgcmVtYWluZGVyIChoaWdoKSByZXN1bHQsIGlmIGl0IGlzIG5lZWRlZC4KKyAgICBpZiAoIVNEVmFsdWUoTm9kZSwgMSkudXNlX2VtcHR5KCkpIHsKKyAgICAgIFNEVmFsdWUgUmVzdWx0ID0gQ3VyREFHLT5nZXRDb3B5RnJvbVJlZyhDdXJEQUctPmdldEVudHJ5Tm9kZSgpLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaVJlZywgTlZULCBJbkZsYWcpOworICAgICAgSW5GbGFnID0gUmVzdWx0LmdldFZhbHVlKDIpOworICAgICAgUmVwbGFjZVVzZXMoU0RWYWx1ZShOb2RlLCAxKSwgUmVzdWx0KTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiPT4gIjsgUmVzdWx0LmdldE5vZGUoKS0+ZHVtcChDdXJEQUcpOyBkYmdzKCkgPDwgJ1xuJyk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgY2FzZSBYODZJU0Q6OkNNUDogeworICAgIFNEVmFsdWUgTjAgPSBOb2RlLT5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgTjEgPSBOb2RlLT5nZXRPcGVyYW5kKDEpOworCisgICAgLy8gTG9vayBmb3IgKFg4NmNtcCAoYW5kICRvcCwgJGltbSksIDApIGFuZCBzZWUgaWYgd2UgY2FuIGNvbnZlcnQgaXQgdG8KKyAgICAvLyB1c2UgYSBzbWFsbGVyIGVuY29kaW5nLgorICAgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFICYmIE4wLmhhc09uZVVzZSgpICYmCisgICAgICAgIEhhc05vU2lnbmVkQ29tcGFyaXNvblVzZXMoTm9kZSkpCisgICAgICAvLyBMb29rIHBhc3QgdGhlIHRydW5jYXRlIGlmIENNUCBpcyB0aGUgb25seSB1c2Ugb2YgaXQuCisgICAgICBOMCA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgaWYgKE4wLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBTkQgJiYgTjAuZ2V0Tm9kZSgpLT5oYXNPbmVVc2UoKSAmJgorICAgICAgICBOMC5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6Omk4ICYmCisgICAgICAgIFg4Njo6aXNaZXJvTm9kZShOMSkpIHsKKyAgICAgIENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICBpZiAoIUMpIGJyZWFrOworCisgICAgICAvLyBGb3IgZXhhbXBsZSwgY29udmVydCAidGVzdGwgJWVheCwgJDgiIHRvICJ0ZXN0YiAlYWwsICQ4IgorICAgICAgaWYgKChDLT5nZXRaRXh0VmFsdWUoKSAmIH5VSU5UNjRfQygweGZmKSkgPT0gMCAmJgorICAgICAgICAgICghKEMtPmdldFpFeHRWYWx1ZSgpICYgMHg4MCkgfHwKKyAgICAgICAgICAgSGFzTm9TaWduZWRDb21wYXJpc29uVXNlcyhOb2RlKSkpIHsKKyAgICAgICAgU0RWYWx1ZSBJbW0gPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEMtPmdldFpFeHRWYWx1ZSgpLCBNVlQ6Omk4KTsKKyAgICAgICAgU0RWYWx1ZSBSZWcgPSBOMC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCk7CisKKyAgICAgICAgLy8gT24geDg2LTMyLCBvbmx5IHRoZSBBQkNEIHJlZ2lzdGVycyBoYXZlIDgtYml0IHN1YnJlZ2lzdGVycy4KKyAgICAgICAgaWYgKCFTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgICAgICAgIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlRSQyA9IDA7CisgICAgICAgICAgc3dpdGNoIChOMC5nZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgICAgICAgICAgY2FzZSBNVlQ6OmkzMjogVFJDID0gJlg4Njo6R1IzMl9BQkNEUmVnQ2xhc3M7IGJyZWFrOworICAgICAgICAgIGNhc2UgTVZUOjppMTY6IFRSQyA9ICZYODY6OkdSMTZfQUJDRFJlZ0NsYXNzOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBURVNUIG9wZXJhbmQgdHlwZSEiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU0RWYWx1ZSBSQyA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoVFJDLT5nZXRJRCgpLCBNVlQ6OmkzMik7CisgICAgICAgICAgUmVnID0gU0RWYWx1ZShDdXJEQUctPmdldE1hY2hpbmVOb2RlKFg4Njo6Q09QWV9UT19SRUdDTEFTUywgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZy5nZXRWYWx1ZVR5cGUoKSwgUmVnLCBSQyksIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgbC1yZWdpc3Rlci4KKyAgICAgICAgU0RWYWx1ZSBTdWJyZWcgPSBDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoWDg2OjpzdWJfOGJpdCwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTgsIFJlZyk7CisKKyAgICAgICAgLy8gRW1pdCBhIHRlc3RiLgorICAgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShYODY6OlRFU1Q4cmksIGRsLCBNVlQ6OmkzMiwgU3VicmVnLCBJbW0pOworICAgICAgfQorCisgICAgICAvLyBGb3IgZXhhbXBsZSwgInRlc3RsICVlYXgsICQyMDQ4IiB0byAidGVzdGIgJWFoLCAkOCIuCisgICAgICBpZiAoKEMtPmdldFpFeHRWYWx1ZSgpICYgflVJTlQ2NF9DKDB4ZmYwMCkpID09IDAgJiYKKyAgICAgICAgICAoIShDLT5nZXRaRXh0VmFsdWUoKSAmIDB4ODAwMCkgfHwKKyAgICAgICAgICAgSGFzTm9TaWduZWRDb21wYXJpc29uVXNlcyhOb2RlKSkpIHsKKyAgICAgICAgLy8gU2hpZnQgdGhlIGltbWVkaWF0ZSByaWdodCBieSA4IGJpdHMuCisgICAgICAgIFNEVmFsdWUgU2hpZnRlZEltbSA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQy0+Z2V0WkV4dFZhbHVlKCkgPj4gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Omk4KTsKKyAgICAgICAgU0RWYWx1ZSBSZWcgPSBOMC5nZXROb2RlKCktPmdldE9wZXJhbmQoMCk7CisKKyAgICAgICAgLy8gUHV0IHRoZSB2YWx1ZSBpbiBhbiBBQkNEIHJlZ2lzdGVyLgorICAgICAgICBUYXJnZXRSZWdpc3RlckNsYXNzICpUUkMgPSAwOworICAgICAgICBzd2l0Y2ggKE4wLmdldFZhbHVlVHlwZSgpLmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICAgICAgY2FzZSBNVlQ6Omk2NDogVFJDID0gJlg4Njo6R1I2NF9BQkNEUmVnQ2xhc3M7IGJyZWFrOworICAgICAgICBjYXNlIE1WVDo6aTMyOiBUUkMgPSAmWDg2OjpHUjMyX0FCQ0RSZWdDbGFzczsgYnJlYWs7CisgICAgICAgIGNhc2UgTVZUOjppMTY6IFRSQyA9ICZYODY6OkdSMTZfQUJDRFJlZ0NsYXNzOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgVEVTVCBvcGVyYW5kIHR5cGUhIik7CisgICAgICAgIH0KKyAgICAgICAgU0RWYWx1ZSBSQyA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoVFJDLT5nZXRJRCgpLCBNVlQ6OmkzMik7CisgICAgICAgIFJlZyA9IFNEVmFsdWUoQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShYODY6OkNPUFlfVE9fUkVHQ0xBU1MsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnLmdldFZhbHVlVHlwZSgpLCBSZWcsIFJDKSwgMCk7CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgaC1yZWdpc3Rlci4KKyAgICAgICAgU0RWYWx1ZSBTdWJyZWcgPSBDdXJEQUctPmdldFRhcmdldEV4dHJhY3RTdWJyZWcoWDg2OjpzdWJfOGJpdF9oaSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTgsIFJlZyk7CisKKyAgICAgICAgLy8gRW1pdCBhIHRlc3RiLiBObyBzcGVjaWFsIE5PUkVYIHRyaWNrcyBhcmUgbmVlZGVkIHNpbmNlIHRoZXJlJ3MKKyAgICAgICAgLy8gb25seSBvbmUgR1BSIG9wZXJhbmQhCisgICAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFg4Njo6VEVTVDhyaSwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJyZWcsIFNoaWZ0ZWRJbW0pOworICAgICAgfQorCisgICAgICAvLyBGb3IgZXhhbXBsZSwgInRlc3RsICVlYXgsICQzMjc3NiIgdG8gInRlc3R3ICVheCwgJDMyNzc2Ii4KKyAgICAgIGlmICgoQy0+Z2V0WkV4dFZhbHVlKCkgJiB+VUlOVDY0X0MoMHhmZmZmKSkgPT0gMCAmJgorICAgICAgICAgIE4wLmdldFZhbHVlVHlwZSgpICE9IE1WVDo6aTE2ICYmCisgICAgICAgICAgKCEoQy0+Z2V0WkV4dFZhbHVlKCkgJiAweDgwMDApIHx8CisgICAgICAgICAgIEhhc05vU2lnbmVkQ29tcGFyaXNvblVzZXMoTm9kZSkpKSB7CisgICAgICAgIFNEVmFsdWUgSW1tID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChDLT5nZXRaRXh0VmFsdWUoKSwgTVZUOjppMTYpOworICAgICAgICBTRFZhbHVlIFJlZyA9IE4wLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKTsKKworICAgICAgICAvLyBFeHRyYWN0IHRoZSAxNi1iaXQgc3VicmVnaXN0ZXIuCisgICAgICAgIFNEVmFsdWUgU3VicmVnID0gQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKFg4Njo6c3ViXzE2Yml0LCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMTYsIFJlZyk7CisKKyAgICAgICAgLy8gRW1pdCBhIHRlc3R3LgorICAgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShYODY6OlRFU1QxNnJpLCBkbCwgTVZUOjppMzIsIFN1YnJlZywgSW1tKTsKKyAgICAgIH0KKworICAgICAgLy8gRm9yIGV4YW1wbGUsICJ0ZXN0cSAlcmF4LCAkMjY4NDY4MjMyIiB0byAidGVzdGwgJWVheCwgJDI2ODQ2ODIzMiIuCisgICAgICBpZiAoKEMtPmdldFpFeHRWYWx1ZSgpICYgflVJTlQ2NF9DKDB4ZmZmZmZmZmYpKSA9PSAwICYmCisgICAgICAgICAgTjAuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppNjQgJiYKKyAgICAgICAgICAoIShDLT5nZXRaRXh0VmFsdWUoKSAmIDB4ODAwMDAwMDApIHx8CisgICAgICAgICAgIEhhc05vU2lnbmVkQ29tcGFyaXNvblVzZXMoTm9kZSkpKSB7CisgICAgICAgIFNEVmFsdWUgSW1tID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChDLT5nZXRaRXh0VmFsdWUoKSwgTVZUOjppMzIpOworICAgICAgICBTRFZhbHVlIFJlZyA9IE4wLmdldE5vZGUoKS0+Z2V0T3BlcmFuZCgwKTsKKworICAgICAgICAvLyBFeHRyYWN0IHRoZSAzMi1iaXQgc3VicmVnaXN0ZXIuCisgICAgICAgIFNEVmFsdWUgU3VicmVnID0gQ3VyREFHLT5nZXRUYXJnZXRFeHRyYWN0U3VicmVnKFg4Njo6c3ViXzMyYml0LCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIsIFJlZyk7CisKKyAgICAgICAgLy8gRW1pdCBhIHRlc3RsLgorICAgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShYODY6OlRFU1QzMnJpLCBkbCwgTVZUOjppMzIsIFN1YnJlZywgSW1tKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgfQorCisgIFNETm9kZSAqUmVzTm9kZSA9IFNlbGVjdENvZGUoTm9kZSk7CisKKyAgREVCVUcoZGJncygpIDw8ICI9PiAiOworICAgICAgICBpZiAoUmVzTm9kZSA9PSBOVUxMIHx8IFJlc05vZGUgPT0gTm9kZSkKKyAgICAgICAgICBOb2RlLT5kdW1wKEN1ckRBRyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBSZXNOb2RlLT5kdW1wKEN1ckRBRyk7CisgICAgICAgIGRiZ3MoKSA8PCAnXG4nKTsKKworICByZXR1cm4gUmVzTm9kZTsKK30KKworYm9vbCBYODZEQUdUb0RBR0lTZWw6OgorU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChjb25zdCBTRFZhbHVlICZPcCwgY2hhciBDb25zdHJhaW50Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gJk91dE9wcykgeworICBTRFZhbHVlIE9wMCwgT3AxLCBPcDIsIE9wMywgT3A0OworICBzd2l0Y2ggKENvbnN0cmFpbnRDb2RlKSB7CisgIGNhc2UgJ28nOiAgIC8vIG9mZnNldGFibGUgICAgICAgID8/CisgIGNhc2UgJ3YnOiAgIC8vIG5vdCBvZmZzZXRhYmxlICAgID8/CisgIGRlZmF1bHQ6IHJldHVybiB0cnVlOworICBjYXNlICdtJzogICAvLyBtZW1vcnkKKyAgICBpZiAoIVNlbGVjdEFkZHIoT3AuZ2V0Tm9kZSgpLCBPcCwgT3AwLCBPcDEsIE9wMiwgT3AzLCBPcDQpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIH0KKyAgCisgIE91dE9wcy5wdXNoX2JhY2soT3AwKTsKKyAgT3V0T3BzLnB1c2hfYmFjayhPcDEpOworICBPdXRPcHMucHVzaF9iYWNrKE9wMik7CisgIE91dE9wcy5wdXNoX2JhY2soT3AzKTsKKyAgT3V0T3BzLnB1c2hfYmFjayhPcDQpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBjcmVhdGVYODZJU2VsRGFnIC0gVGhpcyBwYXNzIGNvbnZlcnRzIGEgbGVnYWxpemVkIERBRyBpbnRvIGEgCisvLy8gWDg2LXNwZWNpZmljIERBRywgcmVhZHkgZm9yIGluc3RydWN0aW9uIHNjaGVkdWxpbmcuCisvLy8KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlWDg2SVNlbERhZyhYODZUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICByZXR1cm4gbmV3IFg4NkRBR1RvREFHSVNlbChUTSwgT3B0TGV2ZWwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SVNlbExvd2VyaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NklTZWxMb3dlcmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhOGZmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NklTZWxMb3dlcmluZy5jcHAKQEAgLTAsMCArMSwxMDcwOCBAQAorLy89PT0tLSBYODZJU2VsTG93ZXJpbmcuY3BwIC0gWDg2IERBRyBMb3dlcmluZyBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IFg4NiB1c2VzIHRvIGxvd2VyIExMVk0gY29kZSBpbnRvIGEKKy8vIHNlbGVjdGlvbiBEQUcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJ4ODYtaXNlbCIKKyNpbmNsdWRlICJYODYuaCIKKyNpbmNsdWRlICJYODZJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJYODZJU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJYODZUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbEFsaWFzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVmVjdG9yRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBuYW1lc3BhY2UgZHdhcmY7CisKK1NUQVRJU1RJQyhOdW1UYWlsQ2FsbHMsICJOdW1iZXIgb2YgdGFpbCBjYWxscyIpOworCitzdGF0aWMgY2w6Om9wdDxib29sPgorRGlzYWJsZU1NWCgiZGlzYWJsZS1tbXgiLCBjbDo6SGlkZGVuLCBjbDo6ZGVzYygiRGlzYWJsZSB1c2Ugb2YgTU1YIikpOworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KK3N0YXRpYyBTRFZhbHVlIGdldE1PVkwoU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsLCBFVlQgVlQsIFNEVmFsdWUgVjEsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgVjIpOworCitYODZUYXJnZXRMb3dlcmluZzo6WDg2VGFyZ2V0TG93ZXJpbmcoWDg2VGFyZ2V0TWFjaGluZSAmVE0pCisgIDogVGFyZ2V0TG93ZXJpbmcoVE0pIHsKKyAgU3VidGFyZ2V0ID0gJlRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCk7CisgIFg4NlNjYWxhclNTRWY2NCA9IFN1YnRhcmdldC0+aGFzU1NFMigpOworICBYODZTY2FsYXJTU0VmMzIgPSBTdWJ0YXJnZXQtPmhhc1NTRTEoKTsKKyAgWDg2U3RhY2tQdHIgPSBTdWJ0YXJnZXQtPmlzNjRCaXQoKSA/IFg4Njo6UlNQIDogWDg2OjpFU1A7CisKKyAgUmVnSW5mbyA9IFRNLmdldFJlZ2lzdGVySW5mbygpOworICBURCA9IGdldFRhcmdldERhdGEoKTsKKworICAvLyBTZXQgdXAgdGhlIFRhcmdldExvd2VyaW5nIG9iamVjdC4KKworICAvLyBYODYgaXMgd2VpcmQsIGl0IGFsd2F5cyB1c2VzIGk4IGZvciBzaGlmdCBhbW91bnRzIGFuZCBzZXRjYyByZXN1bHRzLgorICBzZXRTaGlmdEFtb3VudFR5cGUoTVZUOjppOCk7CisgIHNldEJvb2xlYW5Db250ZW50cyhaZXJvT3JPbmVCb29sZWFuQ29udGVudCk7CisgIHNldFNjaGVkdWxpbmdQcmVmZXJlbmNlKFNjaGVkOjpSZWdQcmVzc3VyZSk7CisgIHNldFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZShYODZTdGFja1B0cik7CisKKyAgaWYgKFN1YnRhcmdldC0+aXNUYXJnZXREYXJ3aW4oKSkgeworICAgIC8vIERhcndpbiBzaG91bGQgdXNlIF9zZXRqbXAvX2xvbmdqbXAgaW5zdGVhZCBvZiBzZXRqbXAvbG9uZ2ptcC4KKyAgICBzZXRVc2VVbmRlcnNjb3JlU2V0Sm1wKGZhbHNlKTsKKyAgICBzZXRVc2VVbmRlcnNjb3JlTG9uZ0ptcChmYWxzZSk7CisgIH0gZWxzZSBpZiAoU3VidGFyZ2V0LT5pc1RhcmdldE1pbmd3KCkpIHsKKyAgICAvLyBNUyBydW50aW1lIGlzIHdlaXJkOiBpdCBleHBvcnRzIF9zZXRqbXAsIGJ1dCBsb25nam1wIQorICAgIHNldFVzZVVuZGVyc2NvcmVTZXRKbXAodHJ1ZSk7CisgICAgc2V0VXNlVW5kZXJzY29yZUxvbmdKbXAoZmFsc2UpOworICB9IGVsc2UgeworICAgIHNldFVzZVVuZGVyc2NvcmVTZXRKbXAodHJ1ZSk7CisgICAgc2V0VXNlVW5kZXJzY29yZUxvbmdKbXAodHJ1ZSk7CisgIH0KKworICAvLyBTZXQgdXAgdGhlIHJlZ2lzdGVyIGNsYXNzZXMuCisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppOCwgWDg2OjpHUjhSZWdpc3RlckNsYXNzKTsKKyAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmkxNiwgWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcyk7CisgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjppMzIsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MpOworICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkpCisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6Omk2NCwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcyk7CisKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlNFWFRMT0FELCBNVlQ6OmkxLCBQcm9tb3RlKTsKKworICAvLyBXZSBkb24ndCBhY2NlcHQgYW55IHRydW5jc3RvcmUgb2YgaW50ZWdlciByZWdpc3RlcnMuCisgIHNldFRydW5jU3RvcmVBY3Rpb24oTVZUOjppNjQsIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVDo6aTY0LCBNVlQ6OmkxNiwgRXhwYW5kKTsKKyAgc2V0VHJ1bmNTdG9yZUFjdGlvbihNVlQ6Omk2NCwgTVZUOjppOCAsIEV4cGFuZCk7CisgIHNldFRydW5jU3RvcmVBY3Rpb24oTVZUOjppMzIsIE1WVDo6aTE2LCBFeHBhbmQpOworICBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVDo6aTMyLCBNVlQ6Omk4ICwgRXhwYW5kKTsKKyAgc2V0VHJ1bmNTdG9yZUFjdGlvbihNVlQ6OmkxNiwgTVZUOjppOCwgIEV4cGFuZCk7CisKKyAgLy8gU0VUT0VRIGFuZCBTRVRVTkUgcmVxdWlyZSBjaGVja2luZyB0d28gY29uZGl0aW9ucy4KKyAgc2V0Q29uZENvZGVBY3Rpb24oSVNEOjpTRVRPRVEsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRDb25kQ29kZUFjdGlvbihJU0Q6OlNFVE9FUSwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldENvbmRDb2RlQWN0aW9uKElTRDo6U0VUT0VRLCBNVlQ6OmY4MCwgRXhwYW5kKTsKKyAgc2V0Q29uZENvZGVBY3Rpb24oSVNEOjpTRVRVTkUsIE1WVDo6ZjMyLCBFeHBhbmQpOworICBzZXRDb25kQ29kZUFjdGlvbihJU0Q6OlNFVFVORSwgTVZUOjpmNjQsIEV4cGFuZCk7CisgIHNldENvbmRDb2RlQWN0aW9uKElTRDo6U0VUVU5FLCBNVlQ6OmY4MCwgRXhwYW5kKTsKKworICAvLyBQcm9tb3RlIGFsbCBVSU5UX1RPX0ZQIHRvIGxhcmdlciBTSU5UX1RPX0ZQJ3MsIGFzIFg4NiBkb2Vzbid0IGhhdmUgdGhpcworICAvLyBvcGVyYXRpb24uCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVJTlRfVE9fRlAgICAgICAgLCBNVlQ6OmkxICAgLCBQcm9tb3RlKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUlOVF9UT19GUCAgICAgICAsIE1WVDo6aTggICAsIFByb21vdGUpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQICAgICAgICwgTVZUOjppMTYgICwgUHJvbW90ZSk7CisKKyAgaWYgKFN1YnRhcmdldC0+aXM2NEJpdCgpKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUlOVF9UT19GUCAgICAgLCBNVlQ6OmkzMiAgLCBQcm9tb3RlKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQICAgICAsIE1WVDo6aTY0ICAsIEV4cGFuZCk7CisgIH0gZWxzZSBpZiAoIVVzZVNvZnRGbG9hdCkgeworICAgIC8vIFdlIGhhdmUgYW4gYWxnb3JpdGhtIGZvciBTU0UyLT5kb3VibGUsIGFuZCB3ZSB0dXJuIHRoaXMgaW50byBhCisgICAgLy8gNjQtYml0IEZJTEQgZm9sbG93ZWQgYnkgY29uZGl0aW9uYWwgRkFERCBmb3Igb3RoZXIgdGFyZ2V0cy4KKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQICAgICAsIE1WVDo6aTY0ICAsIEN1c3RvbSk7CisgICAgLy8gV2UgaGF2ZSBhbiBhbGdvcml0aG0gZm9yIFNTRTIsIGFuZCB3ZSB0dXJuIHRoaXMgaW50byBhIDY0LWJpdAorICAgIC8vIEZJTEQgZm9yIG90aGVyIHRhcmdldHMuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUlOVF9UT19GUCAgICAgLCBNVlQ6OmkzMiAgLCBDdXN0b20pOworICB9CisKKyAgLy8gUHJvbW90ZSBpMS9pOCBTSU5UX1RPX0ZQIHRvIGxhcmdlciBTSU5UX1RPX0ZQJ3MsIGFzIFg4NiBkb2Vzbid0IGhhdmUKKyAgLy8gdGhpcyBvcGVyYXRpb24uCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJTlRfVE9fRlAgICAgICAgLCBNVlQ6OmkxICAgLCBQcm9tb3RlKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCAgICAgICAsIE1WVDo6aTggICAsIFByb21vdGUpOworCisgIGlmICghVXNlU29mdEZsb2F0KSB7CisgICAgLy8gU1NFIGhhcyBubyBpMTYgdG8gZnAgY29udmVyc2lvbiwgb25seSBpMzIKKyAgICBpZiAoWDg2U2NhbGFyU1NFZjMyKSB7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQICAgICAsIE1WVDo6aTE2ICAsIFByb21vdGUpOworICAgICAgLy8gZjMyIGFuZCBmNjQgY2FzZXMgYXJlIExlZ2FsLCBmODAgY2FzZSBpcyBub3QKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJTlRfVE9fRlAgICAgICwgTVZUOjppMzIgICwgQ3VzdG9tKTsKKyAgICB9IGVsc2UgeworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCAgICAgLCBNVlQ6OmkxNiAgLCBDdXN0b20pOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCAgICAgLCBNVlQ6OmkzMiAgLCBDdXN0b20pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQICAgICAsIE1WVDo6aTE2ICAsIFByb21vdGUpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJTlRfVE9fRlAgICAgICwgTVZUOjppMzIgICwgUHJvbW90ZSk7CisgIH0KKworICAvLyBJbiAzMi1iaXQgbW9kZSB0aGVzZSBhcmUgY3VzdG9tIGxvd2VyZWQuICBJbiA2NC1iaXQgbW9kZSBGMzIgYW5kIEY2NAorICAvLyBhcmUgTGVnYWwsIGY4MCBpcyBjdXN0b20gbG93ZXJlZC4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fU0lOVCAgICAgLCBNVlQ6Omk2NCAgLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQICAgICAsIE1WVDo6aTY0ICAsIEN1c3RvbSk7CisKKyAgLy8gUHJvbW90ZSBpMS9pOCBGUF9UT19TSU5UIHRvIGxhcmdlciBGUF9UT19TSU5UUydzLCBhcyBYODYgZG9lc24ndCBoYXZlCisgIC8vIHRoaXMgb3BlcmF0aW9uLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19TSU5UICAgICAgICwgTVZUOjppMSAgICwgUHJvbW90ZSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQgICAgICAgLCBNVlQ6Omk4ICAgLCBQcm9tb3RlKTsKKworICBpZiAoWDg2U2NhbGFyU1NFZjMyKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fU0lOVCAgICAgLCBNVlQ6OmkxNiAgLCBQcm9tb3RlKTsKKyAgICAvLyBmMzIgYW5kIGY2NCBjYXNlcyBhcmUgTGVnYWwsIGY4MCBjYXNlIGlzIG5vdAorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQgICAgICwgTVZUOjppMzIgICwgQ3VzdG9tKTsKKyAgfSBlbHNlIHsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19TSU5UICAgICAsIE1WVDo6aTE2ICAsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fU0lOVCAgICAgLCBNVlQ6OmkzMiAgLCBDdXN0b20pOworICB9CisKKyAgLy8gSGFuZGxlIEZQX1RPX1VJTlQgYnkgcHJvbW90aW5nIHRoZSBkZXN0aW5hdGlvbiB0byBhIGxhcmdlciBzaWduZWQKKyAgLy8gY29udmVyc2lvbi4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCAgICAgICAsIE1WVDo6aTEgICAsIFByb21vdGUpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5UICAgICAgICwgTVZUOjppOCAgICwgUHJvbW90ZSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1VJTlQgICAgICAgLCBNVlQ6OmkxNiAgLCBQcm9tb3RlKTsKKworICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkpIHsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5UICAgICAsIE1WVDo6aTY0ICAsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCAgICAgLCBNVlQ6OmkzMiAgLCBQcm9tb3RlKTsKKyAgfSBlbHNlIGlmICghVXNlU29mdEZsb2F0KSB7CisgICAgaWYgKFg4NlNjYWxhclNTRWYzMiAmJiAhU3VidGFyZ2V0LT5oYXNTU0UzKCkpCisgICAgICAvLyBFeHBhbmQgRlBfVE9fVUlOVCBpbnRvIGEgc2VsZWN0LgorICAgICAgLy8gRklYTUU6IFdlIHdvdWxkIGxpa2UgdG8gdXNlIGEgQ3VzdG9tIGV4cGFuZGVyIGhlcmUgZXZlbnR1YWxseSB0byBkbworICAgICAgLy8gdGhlIG9wdGltYWwgdGhpbmcgZm9yIFNTRSB2cy4gdGhlIGRlZmF1bHQgZXhwYW5zaW9uIGluIHRoZSBsZWdhbGl6ZXIuCisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19VSU5UICAgLCBNVlQ6OmkzMiAgLCBFeHBhbmQpOworICAgIGVsc2UKKyAgICAgIC8vIFdpdGggU1NFMyB3ZSBjYW4gdXNlIGZpc3R0cGxsIHRvIGNvbnZlcnQgdG8gYSBzaWduZWQgaTY0OyB3aXRob3V0CisgICAgICAvLyBTU0UsIHdlJ3JlIHN0dWNrIHdpdGggYSBmaXN0cGxsLgorICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCAgICwgTVZUOjppMzIgICwgQ3VzdG9tKTsKKyAgfQorCisgIC8vIFRPRE86IHdoZW4gd2UgaGF2ZSBTU0UsIHRoZXNlIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBieSB1c2luZyBtb3ZkL21vdnEuCisgIGlmICghWDg2U2NhbGFyU1NFZjY0KSB7IAorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJUICAgICAgLCBNVlQ6OmYzMiAgLCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJUICAgICAgLCBNVlQ6OmkzMiAgLCBFeHBhbmQpOworICAgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQgICAgLCBNVlQ6OmY2NCAgLCBFeHBhbmQpOworICAgICAgLy8gV2l0aG91dCBTU0UsIGk2NC0+ZjY0IGdvZXMgdGhyb3VnaCBtZW1vcnk7IGk2NC0+TU1YIGlzIExlZ2FsLgorICAgICAgaWYgKFN1YnRhcmdldC0+aGFzTU1YKCkgJiYgIURpc2FibGVNTVgpCisgICAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJUICAgICwgTVZUOjppNjQgICwgQ3VzdG9tKTsKKyAgICAgIGVsc2UgCisgICAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJJVF9DT05WRVJUICAgICwgTVZUOjppNjQgICwgRXhwYW5kKTsKKyAgICB9CisgIH0KKworICAvLyBTY2FsYXIgaW50ZWdlciBkaXZpZGUgYW5kIHJlbWFpbmRlciBhcmUgbG93ZXJlZCB0byB1c2Ugb3BlcmF0aW9ucyB0aGF0CisgIC8vIHByb2R1Y2UgdHdvIHJlc3VsdHMsIHRvIG1hdGNoIHRoZSBhdmFpbGFibGUgaW5zdHJ1Y3Rpb25zLiBUaGlzIGV4cG9zZXMKKyAgLy8gdGhlIHR3by1yZXN1bHQgZm9ybSB0byB0cml2aWFsIENTRSwgd2hpY2ggaXMgYWJsZSB0byBjb21iaW5lIHgveSBhbmQgeCV5CisgIC8vIGludG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgIC8vCisgIC8vIFNjYWxhciBpbnRlZ2VyIG11bHRpcGx5LWhpZ2ggaXMgYWxzbyBsb3dlcmVkIHRvIHVzZSB0d28tcmVzdWx0CisgIC8vIG9wZXJhdGlvbnMsIHRvIG1hdGNoIHRoZSBhdmFpbGFibGUgaW5zdHJ1Y3Rpb25zLiBIb3dldmVyLCBwbGFpbiBtdWx0aXBseQorICAvLyAobG93KSBvcGVyYXRpb25zIGFyZSBsZWZ0IGFzIExlZ2FsLCBhcyB0aGVyZSBhcmUgc2luZ2xlLXJlc3VsdAorICAvLyBpbnN0cnVjdGlvbnMgZm9yIHRoaXMgaW4geDg2LiBVc2luZyB0aGUgdHdvLXJlc3VsdCBtdWx0aXBseSBpbnN0cnVjdGlvbnMKKyAgLy8gd2hlbiBib3RoIGhpZ2ggYW5kIGxvdyByZXN1bHRzIGFyZSBuZWVkZWQgbXVzdCBiZSBhcnJhbmdlZCBieSBkYWdjb21iaW5lLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUxIUyAgICAgICAgICAgLCBNVlQ6Omk4ICAgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUgICAgICAgICAgICwgTVZUOjppOCAgICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYgICAgICAgICAgICAsIE1WVDo6aTggICAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWICAgICAgICAgICAgLCBNVlQ6Omk4ICAgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSAgICAgICAgICAgICwgTVZUOjppOCAgICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVSRU0gICAgICAgICAgICAsIE1WVDo6aTggICAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUxIUyAgICAgICAgICAgLCBNVlQ6OmkxNiAgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUgICAgICAgICAgICwgTVZUOjppMTYgICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYgICAgICAgICAgICAsIE1WVDo6aTE2ICAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWICAgICAgICAgICAgLCBNVlQ6OmkxNiAgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSAgICAgICAgICAgICwgTVZUOjppMTYgICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVSRU0gICAgICAgICAgICAsIE1WVDo6aTE2ICAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUxIUyAgICAgICAgICAgLCBNVlQ6OmkzMiAgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUgICAgICAgICAgICwgTVZUOjppMzIgICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYgICAgICAgICAgICAsIE1WVDo6aTMyICAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWICAgICAgICAgICAgLCBNVlQ6OmkzMiAgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSAgICAgICAgICAgICwgTVZUOjppMzIgICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVSRU0gICAgICAgICAgICAsIE1WVDo6aTMyICAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUxIUyAgICAgICAgICAgLCBNVlQ6Omk2NCAgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMSFUgICAgICAgICAgICwgTVZUOjppNjQgICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYgICAgICAgICAgICAsIE1WVDo6aTY0ICAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWICAgICAgICAgICAgLCBNVlQ6Omk2NCAgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JFTSAgICAgICAgICAgICwgTVZUOjppNjQgICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVSRU0gICAgICAgICAgICAsIE1WVDo6aTY0ICAgLCBFeHBhbmQpOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0pUICAgICAgICAgICAgLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUkNPTkQgICAgICAgICAgICwgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlJfQ0MgICAgICAgICAgICAsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVF9DQyAgICAgICAgLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkpCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTMyLCBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBNVlQ6OmkxNiAgLCBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBNVlQ6Omk4ICAgLCBMZWdhbCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCBNVlQ6OmkxICAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9ST1VORF9JTlJFRyAgICwgTVZUOjpmMzIgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlJFTSAgICAgICAgICAgICAsIE1WVDo6ZjMyICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSRU0gICAgICAgICAgICAgLCBNVlQ6OmY2NCAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUkVNICAgICAgICAgICAgICwgTVZUOjpmODAgICwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxUX1JPVU5EU18gICAgICAsIE1WVDo6aTMyICAsIEN1c3RvbSk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AgICAgICAgICAgICAsIE1WVDo6aTggICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUVFogICAgICAgICAgICAgLCBNVlQ6Omk4ICAgLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaICAgICAgICAgICAgICwgTVZUOjppOCAgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AgICAgICAgICAgICAsIE1WVDo6aTE2ICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUVFogICAgICAgICAgICAgLCBNVlQ6OmkxNiAgLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaICAgICAgICAgICAgICwgTVZUOjppMTYgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AgICAgICAgICAgICAsIE1WVDo6aTMyICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUVFogICAgICAgICAgICAgLCBNVlQ6OmkzMiAgLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaICAgICAgICAgICAgICwgTVZUOjppMzIgICwgQ3VzdG9tKTsKKyAgaWYgKFN1YnRhcmdldC0+aXM2NEJpdCgpKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AgICAgICAgICAgLCBNVlQ6Omk2NCAgLCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUVFogICAgICAgICAgICwgTVZUOjppNjQgICwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDVExaICAgICAgICAgICAsIE1WVDo6aTY0ICAsIEN1c3RvbSk7CisgIH0KKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpSRUFEQ1lDTEVDT1VOVEVSICwgTVZUOjppNjQgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlNXQVAgICAgICAgICAgICAsIE1WVDo6aTE2ICAsIEV4cGFuZCk7CisKKyAgLy8gVGhlc2Ugc2hvdWxkIGJlIHByb21vdGVkIHRvIGEgbGFyZ2VyIHNlbGVjdCB3aGljaCBpcyBzdXBwb3J0ZWQuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCAgICAgICAgICAsIE1WVDo6aTEgICAsIFByb21vdGUpOworICAvLyBYODYgd2FudHMgdG8gZXhwYW5kIGNtb3YgaXRzZWxmLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QgICAgICAgICAgLCBNVlQ6Omk4ICAgLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QgICAgICAgICwgTVZUOjppMTYgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUICAgICAgICAgICwgTVZUOjppMzIgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUICAgICAgICAgICwgTVZUOjpmMzIgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUICAgICAgICAgICwgTVZUOjpmNjQgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUICAgICAgICAgICwgTVZUOjpmODAgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MgICAgICAgICAgICwgTVZUOjppOCAgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MgICAgICAgICAgICwgTVZUOjppMTYgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MgICAgICAgICAgICwgTVZUOjppMzIgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MgICAgICAgICAgICwgTVZUOjpmMzIgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MgICAgICAgICAgICwgTVZUOjpmNjQgICwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MgICAgICAgICAgICwgTVZUOjpmODAgICwgQ3VzdG9tKTsKKyAgaWYgKFN1YnRhcmdldC0+aXM2NEJpdCgpKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUICAgICAgICAsIE1WVDo6aTY0ICAsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VUQ0MgICAgICAgICAsIE1WVDo6aTY0ICAsIEN1c3RvbSk7CisgIH0KKworICAvLyBEYXJ3aW4gQUJJIGlzc3VlLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDb25zdGFudFBvb2wgICAgLCBNVlQ6OmkzMiAgLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpKdW1wVGFibGUgICAgICAgLCBNVlQ6OmkzMiAgLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxBZGRyZXNzICAgLCBNVlQ6OmkzMiAgLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxUTFNBZGRyZXNzLCBNVlQ6OmkzMiAgLCBDdXN0b20pOworICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkpCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6R2xvYmFsVExTQWRkcmVzcywgTVZUOjppNjQsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkV4dGVybmFsU3ltYm9sICAsIE1WVDo6aTMyICAsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJsb2NrQWRkcmVzcyAgICAsIE1WVDo6aTMyICAsIEN1c3RvbSk7CisgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50UG9vbCAgLCBNVlQ6Omk2NCAgLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okp1bXBUYWJsZSAgICAgLCBNVlQ6Omk2NCAgLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Okdsb2JhbEFkZHJlc3MgLCBNVlQ6Omk2NCAgLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkV4dGVybmFsU3ltYm9sLCBNVlQ6Omk2NCAgLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJsb2NrQWRkcmVzcyAgLCBNVlQ6Omk2NCAgLCBDdXN0b20pOworICB9CisgIC8vIDY0LWJpdCBhZGRtIHN1Yiwgc2hsLCBzcmEsIHNybCAoaWZmIDMyLWJpdCB4ODYpCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITF9QQVJUUyAgICAgICAsIE1WVDo6aTMyICAsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQV9QQVJUUyAgICAgICAsIE1WVDo6aTMyICAsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTF9QQVJUUyAgICAgICAsIE1WVDo6aTMyICAsIEN1c3RvbSk7CisgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITF9QQVJUUyAgICAgLCBNVlQ6Omk2NCAgLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSQV9QQVJUUyAgICAgLCBNVlQ6Omk2NCAgLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSTF9QQVJUUyAgICAgLCBNVlQ6Omk2NCAgLCBDdXN0b20pOworICB9CisKKyAgaWYgKFN1YnRhcmdldC0+aGFzU1NFMSgpKQorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlBSRUZFVENIICAgICAgLCBNVlQ6Ok90aGVyLCBMZWdhbCk7CisKKyAgLy8gV2UgbWF5IG5vdCBoYXZlIGEgbGliY2FsbCBmb3IgTUVNQkFSUklFUiBzbyB3ZSBzaG91bGQgbG93ZXIgdGhpcy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TUVNQkFSUklFUiAgICAsIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisgIAorICAvLyBPbiBYODYgYW5kIFg4Ni02NCwgYXRvbWljIG9wZXJhdGlvbnMgYXJlIGxvd2VyZWQgdG8gbG9ja2VkIGluc3RydWN0aW9ucy4KKyAgLy8gTG9ja2VkIGluc3RydWN0aW9ucywgaW4gdHVybiwgaGF2ZSBpbXBsaWNpdCBmZW5jZSBzZW1hbnRpY3MgKGFsbCBtZW1vcnkKKyAgLy8gb3BlcmF0aW9ucyBhcmUgZmx1c2hlZCBiZWZvcmUgaXNzdWluZyB0aGUgbG9ja2VkIGluc3RydWN0aW9uLCBhbmQgdGhleQorICAvLyBhcmUgbm90IGJ1ZmZlcmVkKSwgc28gd2UgY2FuIGZvbGQgYXdheSB0aGUgY29tbW9uIHBhdHRlcm4gb2YKKyAgLy8gZmVuY2UtYXRvbWljLWZlbmNlLgorICBzZXRTaG91bGRGb2xkQXRvbWljRmVuY2VzKHRydWUpOworCisgIC8vIEV4cGFuZCBjZXJ0YWluIGF0b21pY3MKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0NNUF9TV0FQLCBNVlQ6Omk4LCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBVE9NSUNfQ01QX1NXQVAsIE1WVDo6aTE2LCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBVE9NSUNfQ01QX1NXQVAsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBVE9NSUNfQ01QX1NXQVAsIE1WVDo6aTY0LCBDdXN0b20pOworCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFUT01JQ19MT0FEX1NVQiwgTVZUOjppOCwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfU1VCLCBNVlQ6OmkxNiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfU1VCLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfU1VCLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKworICBpZiAoIVN1YnRhcmdldC0+aXM2NEJpdCgpKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfQURELCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBVE9NSUNfTE9BRF9TVUIsIE1WVDo6aTY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFUT01JQ19MT0FEX0FORCwgTVZUOjppNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfT1IsIE1WVDo6aTY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFUT01JQ19MT0FEX1hPUiwgTVZUOjppNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX0xPQURfTkFORCwgTVZUOjppNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QVRPTUlDX1NXQVAsIE1WVDo6aTY0LCBDdXN0b20pOworICB9CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlJBTUVfVE9fQVJHU19PRkZTRVQsIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUkFNRV9UT19BUkdTX09GRlNFVCwgTVZUOjppNjQsIEN1c3RvbSk7CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VFJBTVBPTElORSwgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpUUkFQLCBNVlQ6Ok90aGVyLCBMZWdhbCk7CisKKyAgLy8gVkFTVEFSVCBuZWVkcyB0byBiZSBjdXN0b20gbG93ZXJlZCB0byB1c2UgdGhlIFZhckFyZ3NGcmFtZUluZGV4CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBU1RBUlQgICAgICAgICAgICwgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFFTkQgICAgICAgICAgICAgLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkpIHsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQUFSRyAgICAgICAgICAgLCBNVlQ6Ok90aGVyLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBQ09QWSAgICAgICAgICAsIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisgIH0gZWxzZSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFBUkcgICAgICAgICAgICwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWQUNPUFkgICAgICAgICAgLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICB9CisKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RBQ0tTQVZFLCAgICAgICAgICBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVEFDS1JFU1RPUkUsICAgICAgIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0MsIE1WVDo6aTY0LCBFeHBhbmQpOworICBpZiAoU3VidGFyZ2V0LT5pc1RhcmdldEN5Z01pbmcoKSkKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0MsIE1WVDo6aTMyLCBDdXN0b20pOworICBlbHNlCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RFlOQU1JQ19TVEFDS0FMTE9DLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKworICBpZiAoIVVzZVNvZnRGbG9hdCAmJiBYODZTY2FsYXJTU0VmNjQpIHsKKyAgICAvLyBmMzIgYW5kIGY2NCB1c2UgU1NFLgorICAgIC8vIFNldCB1cCB0aGUgRlAgcmVnaXN0ZXIgY2xhc3Nlcy4KKyAgICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjMyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzKTsKKyAgICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjY0LCBYODY6OkZSNjRSZWdpc3RlckNsYXNzKTsKKworICAgIC8vIFVzZSBBTkRQRCB0byBzaW11bGF0ZSBGQUJTLgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZBQlMgLCBNVlQ6OmY2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQUJTICwgTVZUOjpmMzIsIEN1c3RvbSk7CisKKyAgICAvLyBVc2UgWE9SUCB0byBzaW11bGF0ZSBGTkVHLgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZORUcgLCBNVlQ6OmY2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTkVHICwgTVZUOjpmMzIsIEN1c3RvbSk7CisKKyAgICAvLyBVc2UgQU5EUEQgYW5kIE9SUEQgdG8gc2ltdWxhdGUgRkNPUFlTSUdOLgorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1BZU0lHTiwgTVZUOjpmNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCBNVlQ6OmYzMiwgQ3VzdG9tKTsKKworICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2luL2Nvcy9mbW9kCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNJTiAsIE1WVDo6ZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1MgLCBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU0lOICwgTVZUOjpmMzIsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUyAsIE1WVDo6ZjMyLCBFeHBhbmQpOworCisgICAgLy8gRXhwYW5kIEZQIGltbWVkaWF0ZXMgaW50byBsb2FkcyBmcm9tIHRoZSBzdGFjaywgZXhjZXB0IGZvciB0aGUgc3BlY2lhbAorICAgIC8vIGNhc2VzIHdlIGhhbmRsZS4KKyAgICBhZGRMZWdhbEZQSW1tZWRpYXRlKEFQRmxvYXQoKzAuMCkpOyAvLyB4b3JwZAorICAgIGFkZExlZ2FsRlBJbW1lZGlhdGUoQVBGbG9hdCgrMC4wZikpOyAvLyB4b3JwcworICB9IGVsc2UgaWYgKCFVc2VTb2Z0RmxvYXQgJiYgWDg2U2NhbGFyU1NFZjMyKSB7CisgICAgLy8gVXNlIFNTRSBmb3IgZjMyLCB4ODcgZm9yIGY2NC4KKyAgICAvLyBTZXQgdXAgdGhlIEZQIHJlZ2lzdGVyIGNsYXNzZXMuCisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmYzMiwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmY2NCwgWDg2OjpSRlA2NFJlZ2lzdGVyQ2xhc3MpOworCisgICAgLy8gVXNlIEFORFBTIHRvIHNpbXVsYXRlIEZBQlMuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkFCUyAsIE1WVDo6ZjMyLCBDdXN0b20pOworCisgICAgLy8gVXNlIFhPUlAgdG8gc2ltdWxhdGUgRk5FRy4KKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTkVHICwgTVZUOjpmMzIsIEN1c3RvbSk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVTkRFRiwgICAgIE1WVDo6ZjY0LCBFeHBhbmQpOworCisgICAgLy8gVXNlIEFORFBTIGFuZCBPUlBTIHRvIHNpbXVsYXRlIEZDT1BZU0lHTi4KKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09QWVNJR04sIE1WVDo6ZjY0LCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1BZU0lHTiwgTVZUOjpmMzIsIEN1c3RvbSk7CisKKyAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHNpbi9jb3MvZm1vZAorICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTSU4gLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TICwgTVZUOjpmMzIsIEV4cGFuZCk7CisKKyAgICAvLyBTcGVjaWFsIGNhc2VzIHdlIGhhbmRsZSBmb3IgRlAgY29uc3RhbnRzLgorICAgIGFkZExlZ2FsRlBJbW1lZGlhdGUoQVBGbG9hdCgrMC4wZikpOyAvLyB4b3JwcworICAgIGFkZExlZ2FsRlBJbW1lZGlhdGUoQVBGbG9hdCgrMC4wKSk7IC8vIEZMRDAKKyAgICBhZGRMZWdhbEZQSW1tZWRpYXRlKEFQRmxvYXQoKzEuMCkpOyAvLyBGTEQxCisgICAgYWRkTGVnYWxGUEltbWVkaWF0ZShBUEZsb2F0KC0wLjApKTsgLy8gRkxEMC9GQ0hTCisgICAgYWRkTGVnYWxGUEltbWVkaWF0ZShBUEZsb2F0KC0xLjApKTsgLy8gRkxEMS9GQ0hTCisKKyAgICBpZiAoIVVuc2FmZUZQTWF0aCkgeworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNJTiAgICAgICAgICAgLCBNVlQ6OmY2NCAgLCBFeHBhbmQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUyAgICAgICAgICAgLCBNVlQ6OmY2NCAgLCBFeHBhbmQpOworICAgIH0KKyAgfSBlbHNlIGlmICghVXNlU29mdEZsb2F0KSB7CisgICAgLy8gZjMyIGFuZCBmNjQgaW4geDg3LgorICAgIC8vIFNldCB1cCB0aGUgRlAgcmVnaXN0ZXIgY2xhc3Nlcy4KKyAgICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6ZjY0LCBYODY6OlJGUDY0UmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmYzMiwgWDg2OjpSRlAzMlJlZ2lzdGVyQ2xhc3MpOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VU5ERUYsICAgICBNVlQ6OmY2NCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVTkRFRiwgICAgIE1WVDo6ZjMyLCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1BZU0lHTiwgTVZUOjpmNjQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCBNVlQ6OmYzMiwgRXhwYW5kKTsKKworICAgIGlmICghVW5zYWZlRlBNYXRoKSB7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU0lOICAgICAgICAgICAsIE1WVDo6ZjY0ICAsIEV4cGFuZCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQ09TICAgICAgICAgICAsIE1WVDo6ZjY0ICAsIEV4cGFuZCk7CisgICAgfQorICAgIGFkZExlZ2FsRlBJbW1lZGlhdGUoQVBGbG9hdCgrMC4wKSk7IC8vIEZMRDAKKyAgICBhZGRMZWdhbEZQSW1tZWRpYXRlKEFQRmxvYXQoKzEuMCkpOyAvLyBGTEQxCisgICAgYWRkTGVnYWxGUEltbWVkaWF0ZShBUEZsb2F0KC0wLjApKTsgLy8gRkxEMC9GQ0hTCisgICAgYWRkTGVnYWxGUEltbWVkaWF0ZShBUEZsb2F0KC0xLjApKTsgLy8gRkxEMS9GQ0hTCisgICAgYWRkTGVnYWxGUEltbWVkaWF0ZShBUEZsb2F0KCswLjBmKSk7IC8vIEZMRDAKKyAgICBhZGRMZWdhbEZQSW1tZWRpYXRlKEFQRmxvYXQoKzEuMGYpKTsgLy8gRkxEMQorICAgIGFkZExlZ2FsRlBJbW1lZGlhdGUoQVBGbG9hdCgtMC4wZikpOyAvLyBGTEQwL0ZDSFMKKyAgICBhZGRMZWdhbEZQSW1tZWRpYXRlKEFQRmxvYXQoLTEuMGYpKTsgLy8gRkxEMS9GQ0hTCisgIH0KKworICAvLyBMb25nIGRvdWJsZSBhbHdheXMgdXNlcyBYODcuCisgIGlmICghVXNlU29mdEZsb2F0KSB7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OmY4MCwgWDg2OjpSRlA4MFJlZ2lzdGVyQ2xhc3MpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVOREVGLCAgICAgTVZUOjpmODAsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUFlTSUdOLCBNVlQ6OmY4MCwgRXhwYW5kKTsKKyAgICB7CisgICAgICBib29sIGlnbm9yZWQ7CisgICAgICBBUEZsb2F0IFRtcEZsdCgrMC4wKTsKKyAgICAgIFRtcEZsdC5jb252ZXJ0KEFQRmxvYXQ6Ong4N0RvdWJsZUV4dGVuZGVkLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuLAorICAgICAgICAgICAgICAgICAgICAgJmlnbm9yZWQpOworICAgICAgYWRkTGVnYWxGUEltbWVkaWF0ZShUbXBGbHQpOyAgLy8gRkxEMAorICAgICAgVG1wRmx0LmNoYW5nZVNpZ24oKTsKKyAgICAgIGFkZExlZ2FsRlBJbW1lZGlhdGUoVG1wRmx0KTsgIC8vIEZMRDAvRkNIUworICAgICAgQVBGbG9hdCBUbXBGbHQyKCsxLjApOworICAgICAgVG1wRmx0Mi5jb252ZXJ0KEFQRmxvYXQ6Ong4N0RvdWJsZUV4dGVuZGVkLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuLAorICAgICAgICAgICAgICAgICAgICAgICZpZ25vcmVkKTsKKyAgICAgIGFkZExlZ2FsRlBJbW1lZGlhdGUoVG1wRmx0Mik7ICAvLyBGTEQxCisgICAgICBUbXBGbHQyLmNoYW5nZVNpZ24oKTsKKyAgICAgIGFkZExlZ2FsRlBJbW1lZGlhdGUoVG1wRmx0Mik7ICAvLyBGTEQxL0ZDSFMKKyAgICB9CisKKyAgICBpZiAoIVVuc2FmZUZQTWF0aCkgeworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNJTiAgICAgICAgICAgLCBNVlQ6OmY4MCAgLCBFeHBhbmQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkNPUyAgICAgICAgICAgLCBNVlQ6OmY4MCAgLCBFeHBhbmQpOworICAgIH0KKyAgfQorCisgIC8vIEFsd2F5cyB1c2UgYSBsaWJyYXJ5IGNhbGwgZm9yIHBvdy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBPVyAgICAgICAgICAgICAsIE1WVDo6ZjMyICAsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQT1cgICAgICAgICAgICAgLCBNVlQ6OmY2NCAgLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUE9XICAgICAgICAgICAgICwgTVZUOjpmODAgICwgRXhwYW5kKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTE9HLCBNVlQ6OmY4MCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxPRzIsIE1WVDo6ZjgwLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTE9HMTAsIE1WVDo6ZjgwLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGRVhQLCBNVlQ6OmY4MCwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkVYUDIsIE1WVDo6ZjgwLCBFeHBhbmQpOworCisgIC8vIEZpcnN0IHNldCBvcGVyYXRpb24gYWN0aW9uIGZvciBhbGwgdmVjdG9yIHR5cGVzIHRvIGVpdGhlciBwcm9tb3RlCisgIC8vIChmb3Igd2lkZW5pbmcpIG9yIGV4cGFuZCAoZm9yIHNjYWxhcml6YXRpb24pLiBUaGVuIHdlIHdpbGwgc2VsZWN0aXZlbHkKKyAgLy8gdHVybiBvbiBvbmVzIHRoYXQgY2FuIGJlIGVmZmVjdGl2ZWx5IGNvZGVnZW4nZC4KKyAgZm9yICh1bnNpZ25lZCBWVCA9ICh1bnNpZ25lZClNVlQ6OkZJUlNUX1ZFQ1RPUl9WQUxVRVRZUEU7CisgICAgICAgVlQgPD0gKHVuc2lnbmVkKU1WVDo6TEFTVF9WRUNUT1JfVkFMVUVUWVBFOyArK1ZUKSB7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QUREICwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNVQiAsIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQURELCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Rk5FRywgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTVUIsIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUwgLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Rk1VTCwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVYsIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkRJViwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNSRU0sIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVUkVNLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCxFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SLChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCxFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OklOU0VSVF9WRUNUT1JfRUxULChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQUJTLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNJTiwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1MsIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUkVNLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBPV0ksIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU1FSVCwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDT1BZU0lHTiwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNNVUxfTE9ISSwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVNVUxfTE9ISSwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNESVZSRU0sIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVRElWUkVNLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBPVywgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUUE9QLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RUWiwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNUTFosIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSEwsIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkEsIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTUkwsIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RMLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Uk9UUiwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJTV0FQLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VlNFVENDLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxPRywgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZMT0cyLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkxPRzEwLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkVYUCwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZFWFAyLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlBfVE9fVUlOVCwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQsIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVSU5UX1RPX0ZQLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJR05fRVhURU5EX0lOUkVHLCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpUUlVOQ0FURSwgIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSUdOX0VYVEVORCwgIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpaRVJPX0VYVEVORCwgIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlWVCwgRXhwYW5kKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBTllfRVhURU5ELCAgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIGZvciAodW5zaWduZWQgSW5uZXJWVCA9ICh1bnNpZ25lZClNVlQ6OkZJUlNUX1ZFQ1RPUl9WQUxVRVRZUEU7CisgICAgICAgICBJbm5lclZUIDw9ICh1bnNpZ25lZClNVlQ6OkxBU1RfVkVDVE9SX1ZBTFVFVFlQRTsgKytJbm5lclZUKQorICAgICAgc2V0VHJ1bmNTdG9yZUFjdGlvbigoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlJbm5lclZULCBFeHBhbmQpOworICAgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpTRVhUTE9BRCwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpaRVhUTE9BRCwgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVZULCBFeHBhbmQpOworICAgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpVlQsIEV4cGFuZCk7CisgIH0KKworICAvLyBGSVhNRTogSW4gb3JkZXIgdG8gcHJldmVudCBTU0UgaW5zdHJ1Y3Rpb25zIGJlaW5nIGV4cGFuZGVkIHRvIE1NWCBvbmVzCisgIC8vIHdpdGggLW1zb2Z0LWZsb2F0LCBkaXNhYmxlIHVzZSBvZiBNTVggYXMgd2VsbC4KKyAgaWYgKCFVc2VTb2Z0RmxvYXQgJiYgIURpc2FibGVNTVggJiYgU3VidGFyZ2V0LT5oYXNNTVgoKSkgeworICAgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjp2OGk4LCAgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgZmFsc2UpOworICAgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjp2NGkxNiwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgZmFsc2UpOworICAgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjp2MmkzMiwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgZmFsc2UpOworICAgIAorICAgIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUOjp2MWk2NCwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgZmFsc2UpOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURELCAgICAgICAgICAgICAgICBNVlQ6OnY4aTgsICBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURELCAgICAgICAgICAgICAgICBNVlQ6OnY0aTE2LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURELCAgICAgICAgICAgICAgICBNVlQ6OnYyaTMyLCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURELCAgICAgICAgICAgICAgICBNVlQ6OnYxaTY0LCBMZWdhbCk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIsICAgICAgICAgICAgICAgIE1WVDo6djhpOCwgIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIsICAgICAgICAgICAgICAgIE1WVDo6djRpMTYsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIsICAgICAgICAgICAgICAgIE1WVDo6djJpMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIsICAgICAgICAgICAgICAgIE1WVDo6djFpNjQsIExlZ2FsKTsKKworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTEhTLCAgICAgICAgICAgICAgTVZUOjp2NGkxNiwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTCwgICAgICAgICAgICAgICAgTVZUOjp2NGkxNiwgTGVnYWwpOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QU5ELCAgICAgICAgICAgICAgICBNVlQ6OnY4aTgsICBQcm9tb3RlKTsKKyAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpBTkQsICAgICAgICAgICAgICAgIE1WVDo6djhpOCwgIE1WVDo6djFpNjQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFORCwgICAgICAgICAgICAgICAgTVZUOjp2NGkxNiwgUHJvbW90ZSk7CisgICAgQWRkUHJvbW90ZWRUb1R5cGUgKElTRDo6QU5ELCAgICAgICAgICAgICAgICBNVlQ6OnY0aTE2LCBNVlQ6OnYxaTY0KTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBTkQsICAgICAgICAgICAgICAgIE1WVDo6djJpMzIsIFByb21vdGUpOworICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OkFORCwgICAgICAgICAgICAgICAgTVZUOjp2MmkzMiwgTVZUOjp2MWk2NCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QU5ELCAgICAgICAgICAgICAgICBNVlQ6OnYxaTY0LCBMZWdhbCk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpPUiwgICAgICAgICAgICAgICAgIE1WVDo6djhpOCwgIFByb21vdGUpOworICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6Ok9SLCAgICAgICAgICAgICAgICAgTVZUOjp2OGk4LCAgTVZUOjp2MWk2NCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6T1IsICAgICAgICAgICAgICAgICBNVlQ6OnY0aTE2LCBQcm9tb3RlKTsKKyAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpPUiwgICAgICAgICAgICAgICAgIE1WVDo6djRpMTYsIE1WVDo6djFpNjQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok9SLCAgICAgICAgICAgICAgICAgTVZUOjp2MmkzMiwgUHJvbW90ZSk7CisgICAgQWRkUHJvbW90ZWRUb1R5cGUgKElTRDo6T1IsICAgICAgICAgICAgICAgICBNVlQ6OnYyaTMyLCBNVlQ6OnYxaTY0KTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpPUiwgICAgICAgICAgICAgICAgIE1WVDo6djFpNjQsIExlZ2FsKTsKKworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlhPUiwgICAgICAgICAgICAgICAgTVZUOjp2OGk4LCAgUHJvbW90ZSk7CisgICAgQWRkUHJvbW90ZWRUb1R5cGUgKElTRDo6WE9SLCAgICAgICAgICAgICAgICBNVlQ6OnY4aTgsICBNVlQ6OnYxaTY0KTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpYT1IsICAgICAgICAgICAgICAgIE1WVDo6djRpMTYsIFByb21vdGUpOworICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OlhPUiwgICAgICAgICAgICAgICAgTVZUOjp2NGkxNiwgTVZUOjp2MWk2NCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6WE9SLCAgICAgICAgICAgICAgICBNVlQ6OnYyaTMyLCBQcm9tb3RlKTsKKyAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpYT1IsICAgICAgICAgICAgICAgIE1WVDo6djJpMzIsIE1WVDo6djFpNjQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlhPUiwgICAgICAgICAgICAgICAgTVZUOjp2MWk2NCwgTGVnYWwpOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgICAgICAgICAgICAgICBNVlQ6OnY4aTgsICBQcm9tb3RlKTsKKyAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpMT0FELCAgICAgICAgICAgICAgIE1WVDo6djhpOCwgIE1WVDo6djFpNjQpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkxPQUQsICAgICAgICAgICAgICAgTVZUOjp2NGkxNiwgUHJvbW90ZSk7CisgICAgQWRkUHJvbW90ZWRUb1R5cGUgKElTRDo6TE9BRCwgICAgICAgICAgICAgICBNVlQ6OnY0aTE2LCBNVlQ6OnYxaTY0KTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpMT0FELCAgICAgICAgICAgICAgIE1WVDo6djJpMzIsIFByb21vdGUpOworICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OkxPQUQsICAgICAgICAgICAgICAgTVZUOjp2MmkzMiwgTVZUOjp2MWk2NCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgICAgICAgICAgICAgICBNVlQ6OnYxaTY0LCBMZWdhbCk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCVUlMRF9WRUNUT1IsICAgICAgIE1WVDo6djhpOCwgIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlVJTERfVkVDVE9SLCAgICAgICBNVlQ6OnY0aTE2LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJVSUxEX1ZFQ1RPUiwgICAgICAgTVZUOjp2MmkzMiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCVUlMRF9WRUNUT1IsICAgICAgIE1WVDo6djFpNjQsIEN1c3RvbSk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWRUNUT1JfU0hVRkZMRSwgICAgIE1WVDo6djhpOCwgIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkVDVE9SX1NIVUZGTEUsICAgICBNVlQ6OnY0aTE2LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLCAgICAgTVZUOjp2MmkzMiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWRUNUT1JfU0hVRkZMRSwgICAgIE1WVDo6djFpNjQsIEN1c3RvbSk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCAgIE1WVDo6djhpOCwgIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgICBNVlQ6OnY0aTE2LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNDQUxBUl9UT19WRUNUT1IsICAgTVZUOjp2MWk2NCwgQ3VzdG9tKTsKKworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCAgTVZUOjp2NGkxNiwgQ3VzdG9tKTsKKworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgICAgICAgICAgICAgTVZUOjp2OGk4LCBQcm9tb3RlKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsICAgICAgICAgICAgIE1WVDo6djRpMTYsIFByb21vdGUpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgICAgICAgICAgICAgTVZUOjp2MmkzMiwgUHJvbW90ZSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCAgICAgICAgICAgICBNVlQ6OnYxaTY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZTRVRDQywgICAgICAgICAgICAgTVZUOjp2OGk4LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZTRVRDQywgICAgICAgICAgICAgTVZUOjp2NGkxNiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWU0VUQ0MsICAgICAgICAgICAgIE1WVDo6djJpMzIsIEN1c3RvbSk7CisKKyAgICBpZiAoIVg4NlNjYWxhclNTRWY2NCAmJiBTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsICAgICAgICBNVlQ6OnY4aTgsICBDdXN0b20pOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsICAgICAgICBNVlQ6OnY0aTE2LCBDdXN0b20pOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsICAgICAgICBNVlQ6OnYyaTMyLCBDdXN0b20pOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QklUX0NPTlZFUlQsICAgICAgICBNVlQ6OnYxaTY0LCBDdXN0b20pOworICAgIH0KKyAgfQorCisgIGlmICghVXNlU29mdEZsb2F0ICYmIFN1YnRhcmdldC0+aGFzU1NFMSgpKSB7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnY0ZjMyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcyk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQURELCAgICAgICAgICAgICAgIE1WVDo6djRmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU1VCLCAgICAgICAgICAgICAgIE1WVDo6djRmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTVVMLCAgICAgICAgICAgICAgIE1WVDo6djRmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGRElWLCAgICAgICAgICAgICAgIE1WVDo6djRmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU1FSVCwgICAgICAgICAgICAgIE1WVDo6djRmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTkVHLCAgICAgICAgICAgICAgIE1WVDo6djRmMzIsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgICAgICAgICAgICAgICBNVlQ6OnY0ZjMyLCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlVJTERfVkVDVE9SLCAgICAgICBNVlQ6OnY0ZjMyLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLCAgICAgTVZUOjp2NGYzMiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIE1WVDo6djRmMzIsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCAgICAgICAgICAgICBNVlQ6OnY0ZjMyLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZTRVRDQywgICAgICAgICAgICAgTVZUOjp2NGYzMiwgQ3VzdG9tKTsKKyAgfQorCisgIGlmICghVXNlU29mdEZsb2F0ICYmIFN1YnRhcmdldC0+aGFzU1NFMigpKSB7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnYyZjY0LCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcyk7CisKKyAgICAvLyBGSVhNRTogVW5mb3J0dW5hdGVseSAtc29mdC1mbG9hdCBhbmQgLW5vLWltcGxpY2l0LWZsb2F0IG1lYW5zIFhNTQorICAgIC8vIHJlZ2lzdGVycyBjYW5ub3QgYmUgdXNlZCBldmVuIGZvciBpbnRlZ2VyIG9wZXJhdGlvbnMuCisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnYxNmk4LCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnY4aTE2LCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnY0aTMyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnYyaTY0LCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcyk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBREQsICAgICAgICAgICAgICAgIE1WVDo6djE2aTgsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBREQsICAgICAgICAgICAgICAgIE1WVDo6djhpMTYsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBREQsICAgICAgICAgICAgICAgIE1WVDo6djRpMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBREQsICAgICAgICAgICAgICAgIE1WVDo6djJpNjQsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUwsICAgICAgICAgICAgICAgIE1WVDo6djJpNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1VCLCAgICAgICAgICAgICAgICBNVlQ6OnYxNmk4LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1VCLCAgICAgICAgICAgICAgICBNVlQ6OnY4aTE2LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1VCLCAgICAgICAgICAgICAgICBNVlQ6OnY0aTMyLCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1VCLCAgICAgICAgICAgICAgICBNVlQ6OnYyaTY0LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMLCAgICAgICAgICAgICAgICBNVlQ6OnY4aTE2LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkFERCwgICAgICAgICAgICAgICBNVlQ6OnYyZjY0LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNVQiwgICAgICAgICAgICAgICBNVlQ6OnYyZjY0LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Rk1VTCwgICAgICAgICAgICAgICBNVlQ6OnYyZjY0LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RkRJViwgICAgICAgICAgICAgICBNVlQ6OnYyZjY0LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RlNRUlQsICAgICAgICAgICAgICBNVlQ6OnYyZjY0LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Rk5FRywgICAgICAgICAgICAgICBNVlQ6OnYyZjY0LCBDdXN0b20pOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VlNFVENDLCAgICAgICAgICAgICBNVlQ6OnYyZjY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZTRVRDQywgICAgICAgICAgICAgTVZUOjp2MTZpOCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWU0VUQ0MsICAgICAgICAgICAgIE1WVDo6djhpMTYsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VlNFVENDLCAgICAgICAgICAgICBNVlQ6OnY0aTMyLCBDdXN0b20pOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgICBNVlQ6OnYxNmk4LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNDQUxBUl9UT19WRUNUT1IsICAgTVZUOjp2OGkxNiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgIE1WVDo6djhpMTYsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsICBNVlQ6OnY0aTMyLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCAgTVZUOjp2NGYzMiwgQ3VzdG9tKTsKKworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNPTkNBVF9WRUNUT1JTLCAgICAgTVZUOjp2MmY2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDT05DQVRfVkVDVE9SUywgICAgIE1WVDo6djJpNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q09OQ0FUX1ZFQ1RPUlMsICAgICBNVlQ6OnYxNmk4LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNPTkNBVF9WRUNUT1JTLCAgICAgTVZUOjp2OGkxNiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpDT05DQVRfVkVDVE9SUywgICAgIE1WVDo6djRpMzIsIEN1c3RvbSk7CisKKyAgICAvLyBDdXN0b20gbG93ZXIgYnVpbGRfdmVjdG9yLCB2ZWN0b3Jfc2h1ZmZsZSwgYW5kIGV4dHJhY3RfdmVjdG9yX2VsdC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAodW5zaWduZWQpTVZUOjp2MTZpODsgaSAhPSAodW5zaWduZWQpTVZUOjp2Mmk2NDsgKytpKSB7CisgICAgICBFVlQgVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpaTsKKyAgICAgIC8vIERvIG5vdCBhdHRlbXB0IHRvIGN1c3RvbSBsb3dlciBub24tcG93ZXItb2YtMiB2ZWN0b3JzCisgICAgICBpZiAoIWlzUG93ZXJPZjJfMzIoVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gY3VzdG9tIGxvd2VyIG5vbi0xMjgtYml0IHZlY3RvcnMKKyAgICAgIGlmICghVlQuaXMxMjhCaXRWZWN0b3IoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCVUlMRF9WRUNUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSwgQ3VzdG9tKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHksIEN1c3RvbSk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSwgQ3VzdG9tKTsKKyAgICB9CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCVUlMRF9WRUNUT1IsICAgICAgIE1WVDo6djJmNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlVJTERfVkVDVE9SLCAgICAgICBNVlQ6OnYyaTY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLCAgICAgTVZUOjp2MmY2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWRUNUT1JfU0hVRkZMRSwgICAgIE1WVDo6djJpNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsICBNVlQ6OnYyZjY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgTVZUOjp2MmY2NCwgQ3VzdG9tKTsKKworICAgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsICBNVlQ6OnYyaTY0LCBDdXN0b20pOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBNVlQ6OnYyaTY0LCBDdXN0b20pOworICAgIH0KKworICAgIC8vIFByb21vdGUgdjE2aTgsIHY4aTE2LCB2NGkzMiBsb2FkLCBzZWxlY3QsIGFuZCwgb3IsIHhvciB0byB2Mmk2NC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAodW5zaWduZWQpTVZUOjp2MTZpODsgaSAhPSAodW5zaWduZWQpTVZUOjp2Mmk2NDsgaSsrKSB7CisgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBTVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpaTsKKyAgICAgIEVWVCBWVCA9IFNWVDsKKworICAgICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gcHJvbW90ZSBub24tMTI4LWJpdCB2ZWN0b3JzCisgICAgICBpZiAoIVZULmlzMTI4Qml0VmVjdG9yKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBTkQsICAgIFNWVCwgUHJvbW90ZSk7CisgICAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpBTkQsICAgIFNWVCwgTVZUOjp2Mmk2NCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpPUiwgICAgIFNWVCwgUHJvbW90ZSk7CisgICAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpPUiwgICAgIFNWVCwgTVZUOjp2Mmk2NCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpYT1IsICAgIFNWVCwgUHJvbW90ZSk7CisgICAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpYT1IsICAgIFNWVCwgTVZUOjp2Mmk2NCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpMT0FELCAgIFNWVCwgUHJvbW90ZSk7CisgICAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpMT0FELCAgIFNWVCwgTVZUOjp2Mmk2NCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsIFNWVCwgUHJvbW90ZSk7CisgICAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpTRUxFQ1QsIFNWVCwgTVZUOjp2Mmk2NCk7CisgICAgfQorCisgICAgc2V0VHJ1bmNTdG9yZUFjdGlvbihNVlQ6OmY2NCwgTVZUOjpmMzIsIEV4cGFuZCk7CisKKyAgICAvLyBDdXN0b20gbG93ZXIgdjJpNjQgYW5kIHYyZjY0IHNlbGVjdHMuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgICAgICAgICAgICAgICBNVlQ6OnYyZjY0LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgICAgICAgICAgICAgICBNVlQ6OnYyaTY0LCBMZWdhbCk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCAgICAgICAgICAgICBNVlQ6OnYyZjY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNFTEVDVCwgICAgICAgICAgICAgTVZUOjp2Mmk2NCwgQ3VzdG9tKTsKKworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZQX1RPX1NJTlQsICAgICAgICAgTVZUOjp2NGkzMiwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNJTlRfVE9fRlAsICAgICAgICAgTVZUOjp2NGkzMiwgTGVnYWwpOworICAgIGlmICghRGlzYWJsZU1NWCAmJiBTdWJ0YXJnZXQtPmhhc01NWCgpKSB7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19TSU5ULCAgICAgICAgIE1WVDo6djJpMzIsIEN1c3RvbSk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTSU5UX1RPX0ZQLCAgICAgICAgIE1WVDo6djJpMzIsIEN1c3RvbSk7CisgICAgfQorICB9CisKKyAgaWYgKFN1YnRhcmdldC0+aGFzU1NFNDEoKSkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZGTE9PUiwgICAgICAgICAgICAgTVZUOjpmMzIsICAgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDRUlMLCAgICAgICAgICAgICAgTVZUOjpmMzIsICAgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZUUlVOQywgICAgICAgICAgICAgTVZUOjpmMzIsICAgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSSU5ULCAgICAgICAgICAgICAgTVZUOjpmMzIsICAgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZORUFSQllJTlQsICAgICAgICAgTVZUOjpmMzIsICAgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZGTE9PUiwgICAgICAgICAgICAgTVZUOjpmNjQsICAgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZDRUlMLCAgICAgICAgICAgICAgTVZUOjpmNjQsICAgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZUUlVOQywgICAgICAgICAgICAgTVZUOjpmNjQsICAgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZSSU5ULCAgICAgICAgICAgICAgTVZUOjpmNjQsICAgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZORUFSQllJTlQsICAgICAgICAgTVZUOjpmNjQsICAgTGVnYWwpOworCisgICAgLy8gRklYTUU6IERvIHdlIG5lZWQgdG8gaGFuZGxlIHNjYWxhci10by12ZWN0b3IgaGVyZT8KKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUwsICAgICAgICAgICAgICAgIE1WVDo6djRpMzIsIExlZ2FsKTsKKworICAgIC8vIENhbiB0dXJuIFNITCBpbnRvIGFuIGludGVnZXIgbXVsdGlwbHkuCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0hMLCAgICAgICAgICAgICAgICBNVlQ6OnY0aTMyLCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNITCwgICAgICAgICAgICAgICAgTVZUOjp2MTZpOCwgQ3VzdG9tKTsKKworICAgIC8vIGk4IGFuZCBpMTYgdmVjdG9ycyBhcmUgY3VzdG9tICwgYmVjYXVzZSB0aGUgc291cmNlIHJlZ2lzdGVyIGFuZCBzb3VyY2UKKyAgICAvLyBzb3VyY2UgbWVtb3J5IG9wZXJhbmQgdHlwZXMgYXJlIG5vdCB0aGUgc2FtZSB3aWR0aC4gIGYzMiB2ZWN0b3JzIGFyZQorICAgIC8vIGN1c3RvbSBzaW5jZSB0aGUgaW1tZWRpYXRlIGNvbnRyb2xsaW5nIHRoZSBpbnNlcnQgZW5jb2RlcyBhZGRpdGlvbmFsCisgICAgLy8gaW5mb3JtYXRpb24uCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsICBNVlQ6OnYxNmk4LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCAgTVZUOjp2OGkxNiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgIE1WVDo6djRpMzIsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsICBNVlQ6OnY0ZjMyLCBDdXN0b20pOworCisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBNVlQ6OnYxNmk4LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgTVZUOjp2OGkxNiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIE1WVDo6djRpMzIsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBNVlQ6OnY0ZjMyLCBDdXN0b20pOworCisgICAgaWYgKFN1YnRhcmdldC0+aXM2NEJpdCgpKSB7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgIE1WVDo6djJpNjQsIExlZ2FsKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgTVZUOjp2Mmk2NCwgTGVnYWwpOworICAgIH0KKyAgfQorCisgIGlmIChTdWJ0YXJnZXQtPmhhc1NTRTQyKCkpIHsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWU0VUQ0MsICAgICAgICAgICAgIE1WVDo6djJpNjQsIEN1c3RvbSk7CisgIH0KKworICBpZiAoIVVzZVNvZnRGbG9hdCAmJiBTdWJ0YXJnZXQtPmhhc0FWWCgpKSB7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnY4ZjMyLCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnY0ZjY0LCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnY4aTMyLCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnY0aTY0LCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcyk7CisgICAgYWRkUmVnaXN0ZXJDbGFzcyhNVlQ6OnYzMmk4LCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcyk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpMT0FELCAgICAgICAgICAgICAgIE1WVDo6djhmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpMT0FELCAgICAgICAgICAgICAgIE1WVDo6djhpMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpMT0FELCAgICAgICAgICAgICAgIE1WVDo6djRmNjQsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpMT0FELCAgICAgICAgICAgICAgIE1WVDo6djRpNjQsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGQURELCAgICAgICAgICAgICAgIE1WVDo6djhmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU1VCLCAgICAgICAgICAgICAgIE1WVDo6djhmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTVVMLCAgICAgICAgICAgICAgIE1WVDo6djhmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGRElWLCAgICAgICAgICAgICAgIE1WVDo6djhmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGU1FSVCwgICAgICAgICAgICAgIE1WVDo6djhmMzIsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGTkVHLCAgICAgICAgICAgICAgIE1WVDo6djhmMzIsIEN1c3RvbSk7CisgICAgLy9zZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCVUlMRF9WRUNUT1IsICAgICAgIE1WVDo6djhmMzIsIEN1c3RvbSk7CisgICAgLy9zZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWRUNUT1JfU0hVRkZMRSwgICAgIE1WVDo6djhmMzIsIEN1c3RvbSk7CisgICAgLy9zZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIE1WVDo6djhmMzIsIEN1c3RvbSk7CisgICAgLy9zZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1QsICAgICAgICAgICAgIE1WVDo6djhmMzIsIEN1c3RvbSk7CisgICAgLy9zZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWU0VUQ0MsICAgICAgICAgICAgIE1WVDo6djhmMzIsIEN1c3RvbSk7CisKKyAgICAvLyBPcGVyYXRpb25zIHRvIGNvbnNpZGVyIGNvbW1lbnRlZCBvdXQgLXYxNmkxNiB2MzJpOAorICAgIC8vc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURELCAgICAgICAgICAgICAgICBNVlQ6OnYxNmkxNiwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkFERCwgICAgICAgICAgICAgICAgTVZUOjp2OGkzMiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBREQsICAgICAgICAgICAgICAgIE1WVDo6djRpNjQsIEN1c3RvbSk7CisgICAgLy9zZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIsICAgICAgICAgICAgICAgIE1WVDo6djMyaTgsIExlZ2FsKTsKKyAgICAvL3NldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNVQiwgICAgICAgICAgICAgICAgTVZUOjp2MTZpMTYsIExlZ2FsKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIsICAgICAgICAgICAgICAgIE1WVDo6djhpMzIsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1VCLCAgICAgICAgICAgICAgICBNVlQ6OnY0aTY0LCBDdXN0b20pOworICAgIC8vc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TVVMLCAgICAgICAgICAgICAgICBNVlQ6OnYxNmkxNiwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZBREQsICAgICAgICAgICAgICAgTVZUOjp2NGY2NCwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTVUIsICAgICAgICAgICAgICAgTVZUOjp2NGY2NCwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZNVUwsICAgICAgICAgICAgICAgTVZUOjp2NGY2NCwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZESVYsICAgICAgICAgICAgICAgTVZUOjp2NGY2NCwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZTUVJULCAgICAgICAgICAgICAgTVZUOjp2NGY2NCwgTGVnYWwpOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkZORUcsICAgICAgICAgICAgICAgTVZUOjp2NGY2NCwgQ3VzdG9tKTsKKworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZTRVRDQywgICAgICAgICAgICAgTVZUOjp2NGY2NCwgQ3VzdG9tKTsKKyAgICAvLyBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWU0VUQ0MsICAgICAgICAgICAgIE1WVDo6djMyaTgsIEN1c3RvbSk7CisgICAgLy8gc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VlNFVENDLCAgICAgICAgICAgICBNVlQ6OnYxNmkxNiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWU0VUQ0MsICAgICAgICAgICAgIE1WVDo6djhpMzIsIEN1c3RvbSk7CisKKyAgICAvLyBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCAgIE1WVDo6djMyaTgsIEN1c3RvbSk7CisgICAgLy8gc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgICBNVlQ6OnYxNmkxNiwgQ3VzdG9tKTsKKyAgICAvLyBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgIE1WVDo6djE2aTE2LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCAgTVZUOjp2OGkzMiwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgIE1WVDo6djhmMzIsIEN1c3RvbSk7CisKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCVUlMRF9WRUNUT1IsICAgICAgIE1WVDo6djRmNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlVJTERfVkVDVE9SLCAgICAgICBNVlQ6OnY0aTY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLCAgICAgTVZUOjp2NGY2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpWRUNUT1JfU0hVRkZMRSwgICAgIE1WVDo6djRpNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsICBNVlQ6OnY0ZjY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgTVZUOjp2NGY2NCwgQ3VzdG9tKTsKKworI2lmIDAKKyAgICAvLyBOb3Qgc3VyZSB3ZSB3YW50IHRvIGRvIHRoaXMgc2luY2UgdGhlcmUgYXJlIG5vIDI1Ni1iaXQgaW50ZWdlcgorICAgIC8vIG9wZXJhdGlvbnMgaW4gQVZYCisKKyAgICAvLyBDdXN0b20gbG93ZXIgYnVpbGRfdmVjdG9yLCB2ZWN0b3Jfc2h1ZmZsZSwgYW5kIGV4dHJhY3RfdmVjdG9yX2VsdC4KKyAgICAvLyBUaGlzIGluY2x1ZGVzIDI1Ni1iaXQgdmVjdG9ycworICAgIGZvciAodW5zaWduZWQgaSA9ICh1bnNpZ25lZClNVlQ6OnYxNmk4OyBpICE9ICh1bnNpZ25lZClNVlQ6OnY0aTY0OyArK2kpIHsKKyAgICAgIEVWVCBWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlpOworCisgICAgICAvLyBEbyBub3QgYXR0ZW1wdCB0byBjdXN0b20gbG93ZXIgbm9uLXBvd2VyLW9mLTIgdmVjdG9ycworICAgICAgaWYgKCFpc1Bvd2VyT2YyXzMyKFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QlVJTERfVkVDVE9SLCAgICAgICBWVCwgQ3VzdG9tKTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZFQ1RPUl9TSFVGRkxFLCAgICAgVlQsIEN1c3RvbSk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIFZULCBDdXN0b20pOworICAgIH0KKworICAgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsICBNVlQ6OnY0aTY0LCBDdXN0b20pOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBNVlQ6OnY0aTY0LCBDdXN0b20pOworICAgIH0KKyNlbmRpZgorCisjaWYgMAorICAgIC8vIE5vdCBzdXJlIHdlIHdhbnQgdG8gZG8gdGhpcyBzaW5jZSB0aGVyZSBhcmUgbm8gMjU2LWJpdCBpbnRlZ2VyCisgICAgLy8gb3BlcmF0aW9ucyBpbiBBVlgKKworICAgIC8vIFByb21vdGUgdjMyaTgsIHYxNmkxNiwgdjhpMzIgbG9hZCwgc2VsZWN0LCBhbmQsIG9yLCB4b3IgdG8gdjRpNjQuCisgICAgLy8gSW5jbHVkaW5nIDI1Ni1iaXQgdmVjdG9ycworICAgIGZvciAodW5zaWduZWQgaSA9ICh1bnNpZ25lZClNVlQ6OnYxNmk4OyBpICE9ICh1bnNpZ25lZClNVlQ6OnY0aTY0OyBpKyspIHsKKyAgICAgIEVWVCBWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlpOworCisgICAgICBpZiAoIVZULmlzMjU2Qml0VmVjdG9yKCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBTkQsICAgIFZULCBQcm9tb3RlKTsKKyAgICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OkFORCwgICAgVlQsIE1WVDo6djRpNjQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6T1IsICAgICBWVCwgUHJvbW90ZSk7CisgICAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpPUiwgICAgIFZULCBNVlQ6OnY0aTY0KTsKKyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlhPUiwgICAgVlQsIFByb21vdGUpOworICAgICAgQWRkUHJvbW90ZWRUb1R5cGUgKElTRDo6WE9SLCAgICBWVCwgTVZUOjp2NGk2NCk7CisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpMT0FELCAgIFZULCBQcm9tb3RlKTsKKyAgICAgIEFkZFByb21vdGVkVG9UeXBlIChJU0Q6OkxPQUQsICAgVlQsIE1WVDo6djRpNjQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNULCBWVCwgUHJvbW90ZSk7CisgICAgICBBZGRQcm9tb3RlZFRvVHlwZSAoSVNEOjpTRUxFQ1QsIFZULCBNVlQ6OnY0aTY0KTsKKyAgICB9CisKKyAgICBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVDo6ZjY0LCBNVlQ6OmYzMiwgRXhwYW5kKTsKKyNlbmRpZgorICB9CisKKyAgLy8gV2Ugd2FudCB0byBjdXN0b20gbG93ZXIgc29tZSBvZiBvdXIgaW50cmluc2ljcy4KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBNVlQ6Ok90aGVyLCBDdXN0b20pOworCisgIC8vIEFkZC9TdWIvTXVsIHdpdGggb3ZlcmZsb3cgb3BlcmF0aW9ucyBhcmUgY3VzdG9tIGxvd2VyZWQuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNBRERPLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUFERE8sIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTU1VCTywgTVZUOjppMzIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVTVUJPLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTE8sIE1WVDo6aTMyLCBDdXN0b20pOworCisgIC8vIE9ubHkgY3VzdG9tLWxvd2VyIDY0LWJpdCBTQURETyBhbmQgZnJpZW5kcyBvbiA2NC1iaXQgYmVjYXVzZSB3ZSBkb24ndAorICAvLyBoYW5kbGUgdHlwZSBsZWdhbGl6YXRpb24gZm9yIHRoZXNlIG9wZXJhdGlvbnMgaGVyZS4KKyAgLy8KKyAgLy8gRklYTUU6IFdlIHJlYWxseSBzaG91bGQgZG8gY3VzdG9tIGxlZ2FsaXphdGlvbiBmb3IgYWRkaXRpb24gYW5kCisgIC8vIHN1YnRyYWN0aW9uIG9uIHg4Ni0zMiBvbmNlIFBSMzIwMyBpcyBmaXhlZC4gIFdlIHJlYWxseSBjYW4ndCBkbyBtdWNoIGJldHRlcgorICAvLyB0aGFuIGdlbmVyaWMgbGVnYWxpemF0aW9uIGZvciA2NC1iaXQgbXVsdGlwbGljYXRpb24td2l0aC1vdmVyZmxvdywgdGhvdWdoLgorICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkpIHsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTQURETywgTVZUOjppNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUFERE8sIE1WVDo6aTY0LCBDdXN0b20pOworICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNTVUJPLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVU1VCTywgTVZUOjppNjQsIEN1c3RvbSk7CisgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U01VTE8sIE1WVDo6aTY0LCBDdXN0b20pOworICB9CisKKyAgaWYgKCFTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgIC8vIFRoZXNlIGxpYmNhbGxzIGFyZSBub3QgYXZhaWxhYmxlIGluIDMyLWJpdC4KKyAgICBzZXRMaWJjYWxsTmFtZShSVExJQjo6U0hMX0kxMjgsIDApOworICAgIHNldExpYmNhbGxOYW1lKFJUTElCOjpTUkxfSTEyOCwgMCk7CisgICAgc2V0TGliY2FsbE5hbWUoUlRMSUI6OlNSQV9JMTI4LCAwKTsKKyAgfQorCisgIC8vIFdlIGhhdmUgdGFyZ2V0LXNwZWNpZmljIGRhZyBjb21iaW5lIHBhdHRlcm5zIGZvciB0aGUgZm9sbG93aW5nIG5vZGVzOgorICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6VkVDVE9SX1NIVUZGTEUpOworICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxUKTsKKyAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OkJVSUxEX1ZFQ1RPUik7CisgIHNldFRhcmdldERBR0NvbWJpbmUoSVNEOjpTRUxFQ1QpOworICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6U0hMKTsKKyAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6OlNSQSk7CisgIHNldFRhcmdldERBR0NvbWJpbmUoSVNEOjpTUkwpOworICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6T1IpOworICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6U1RPUkUpOworICBzZXRUYXJnZXREQUdDb21iaW5lKElTRDo6WkVST19FWFRFTkQpOworICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkpCisgICAgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6Ok1VTCk7CisKKyAgY29tcHV0ZVJlZ2lzdGVyUHJvcGVydGllcygpOworCisgIC8vIEZJWE1FOiBUaGVzZSBzaG91bGQgYmUgYmFzZWQgb24gc3VidGFyZ2V0IGluZm8uIFBsdXMsIHRoZSB2YWx1ZXMgc2hvdWxkCisgIC8vIGJlIHNtYWxsZXIgd2hlbiB3ZSBhcmUgaW4gb3B0aW1pemluZyBmb3Igc2l6ZSBtb2RlLgorICBtYXhTdG9yZXNQZXJNZW1zZXQgPSAxNjsgLy8gRm9yIEBsbHZtLm1lbXNldCAtPiBzZXF1ZW5jZSBvZiBzdG9yZXMKKyAgbWF4U3RvcmVzUGVyTWVtY3B5ID0gODsgLy8gRm9yIEBsbHZtLm1lbWNweSAtPiBzZXF1ZW5jZSBvZiBzdG9yZXMKKyAgbWF4U3RvcmVzUGVyTWVtbW92ZSA9IDM7IC8vIEZvciBAbGx2bS5tZW1tb3ZlIC0+IHNlcXVlbmNlIG9mIHN0b3JlcworICBzZXRQcmVmTG9vcEFsaWdubWVudCgxNik7CisgIGJlbmVmaXRGcm9tQ29kZVBsYWNlbWVudE9wdCA9IHRydWU7Cit9CisKKworTVZUOjpTaW1wbGVWYWx1ZVR5cGUgWDg2VGFyZ2V0TG93ZXJpbmc6OmdldFNldENDUmVzdWx0VHlwZShFVlQgVlQpIGNvbnN0IHsKKyAgcmV0dXJuIE1WVDo6aTg7Cit9CisKKworLy8vIGdldE1heEJ5VmFsQWxpZ24gLSBIZWxwZXIgZm9yIGdldEJ5VmFsVHlwZUFsaWdubWVudCB0byBkZXRlcm1pbmUKKy8vLyB0aGUgZGVzaXJlZCBCeVZhbCBhcmd1bWVudCBhbGlnbm1lbnQuCitzdGF0aWMgdm9pZCBnZXRNYXhCeVZhbEFsaWduKGNvbnN0IFR5cGUgKlR5LCB1bnNpZ25lZCAmTWF4QWxpZ24pIHsKKyAgaWYgKE1heEFsaWduID09IDE2KQorICAgIHJldHVybjsKKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KFR5KSkgeworICAgIGlmIChWVHktPmdldEJpdFdpZHRoKCkgPT0gMTI4KQorICAgICAgTWF4QWxpZ24gPSAxNjsKKyAgfSBlbHNlIGlmIChjb25zdCBBcnJheVR5cGUgKkFUeSA9IGR5bl9jYXN0PEFycmF5VHlwZT4oVHkpKSB7CisgICAgdW5zaWduZWQgRWx0QWxpZ24gPSAwOworICAgIGdldE1heEJ5VmFsQWxpZ24oQVR5LT5nZXRFbGVtZW50VHlwZSgpLCBFbHRBbGlnbik7CisgICAgaWYgKEVsdEFsaWduID4gTWF4QWxpZ24pCisgICAgICBNYXhBbGlnbiA9IEVsdEFsaWduOworICB9IGVsc2UgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBFbHRBbGlnbiA9IDA7CisgICAgICBnZXRNYXhCeVZhbEFsaWduKFNUeS0+Z2V0RWxlbWVudFR5cGUoaSksIEVsdEFsaWduKTsKKyAgICAgIGlmIChFbHRBbGlnbiA+IE1heEFsaWduKQorICAgICAgICBNYXhBbGlnbiA9IEVsdEFsaWduOworICAgICAgaWYgKE1heEFsaWduID09IDE2KQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuOworfQorCisvLy8gZ2V0QnlWYWxUeXBlQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBkZXNpcmVkIGFsaWdubWVudCBmb3IgQnlWYWwgYWdncmVnYXRlCisvLy8gZnVuY3Rpb24gYXJndW1lbnRzIGluIHRoZSBjYWxsZXIgcGFyYW1ldGVyIGFyZWEuIEZvciBYODYsIGFnZ3JlZ2F0ZXMKKy8vLyB0aGF0IGNvbnRhaW4gU1NFIHZlY3RvcnMgYXJlIHBsYWNlZCBhdCAxNi1ieXRlIGJvdW5kYXJpZXMgd2hpbGUgdGhlIHJlc3QKKy8vLyBhcmUgYXQgNC1ieXRlIGJvdW5kYXJpZXMuCit1bnNpZ25lZCBYODZUYXJnZXRMb3dlcmluZzo6Z2V0QnlWYWxUeXBlQWxpZ25tZW50KGNvbnN0IFR5cGUgKlR5KSBjb25zdCB7CisgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgIC8vIE1heCBvZiA4IGFuZCBhbGlnbm1lbnQgb2YgdHlwZS4KKyAgICB1bnNpZ25lZCBUeUFsaWduID0gVEQtPmdldEFCSVR5cGVBbGlnbm1lbnQoVHkpOworICAgIGlmIChUeUFsaWduID4gOCkKKyAgICAgIHJldHVybiBUeUFsaWduOworICAgIHJldHVybiA4OworICB9CisKKyAgdW5zaWduZWQgQWxpZ24gPSA0OworICBpZiAoU3VidGFyZ2V0LT5oYXNTU0UxKCkpCisgICAgZ2V0TWF4QnlWYWxBbGlnbihUeSwgQWxpZ24pOworICByZXR1cm4gQWxpZ247Cit9CisKKy8vLyBnZXRPcHRpbWFsTWVtT3BUeXBlIC0gUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWNpZmljIG9wdGltYWwgdHlwZSBmb3IgbG9hZAorLy8vIGFuZCBzdG9yZSBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIG1lbXNldCwgbWVtY3B5LCBhbmQgbWVtbW92ZQorLy8vIGxvd2VyaW5nLiBJZiBEc3RBbGlnbiBpcyB6ZXJvIHRoYXQgbWVhbnMgaXQncyBzYWZlIHRvIGRlc3RpbmF0aW9uCisvLy8gYWxpZ25tZW50IGNhbiBzYXRpc2Z5IGFueSBjb25zdHJhaW50LiBTaW1pbGFybHkgaWYgU3JjQWxpZ24gaXMgemVybyBpdAorLy8vIG1lYW5zIHRoZXJlIGlzbid0IGEgbmVlZCB0byBjaGVjayBpdCBhZ2FpbnN0IGFsaWdubWVudCByZXF1aXJlbWVudCwKKy8vLyBwcm9iYWJseSBiZWNhdXNlIHRoZSBzb3VyY2UgZG9lcyBub3QgbmVlZCB0byBiZSBsb2FkZWQuIElmCisvLy8gJ05vblNjYWxhckludFNhZmUnIGlzIHRydWUsIHRoYXQgbWVhbnMgaXQncyBzYWZlIHRvIHJldHVybiBhCisvLy8gbm9uLXNjYWxhci1pbnRlZ2VyIHR5cGUsIGUuZy4gZW1wdHkgc3RyaW5nIHNvdXJjZSwgY29uc3RhbnQsIG9yIGxvYWRlZAorLy8vIGZyb20gbWVtb3J5LiAnTWVtY3B5U3RyU3JjJyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVtY3B5IHNvdXJjZSBpcworLy8vIGNvbnN0YW50IHNvIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgbG9hZGVkLgorLy8vIEl0IHJldHVybnMgRVZUOjpPdGhlciBpZiB0aGUgdHlwZSBzaG91bGQgYmUgZGV0ZXJtaW5lZCB1c2luZyBnZW5lcmljCisvLy8gdGFyZ2V0LWluZGVwZW5kZW50IGxvZ2ljLgorRVZUCitYODZUYXJnZXRMb3dlcmluZzo6Z2V0T3B0aW1hbE1lbU9wVHlwZSh1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRHN0QWxpZ24sIHVuc2lnbmVkIFNyY0FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb25TY2FsYXJJbnRTYWZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNZW1jcHlTdHJTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIC8vIEZJWE1FOiBUaGlzIHR1cm5zIG9mZiB1c2Ugb2YgeG1tIHN0b3JlcyBmb3IgbWVtc2V0L21lbWNweSBvbiB0YXJnZXRzIGxpa2UKKyAgLy8gbGludXguICBUaGlzIGlzIGJlY2F1c2UgdGhlIHN0YWNrIHJlYWxpZ25tZW50IGNvZGUgY2FuJ3QgaGFuZGxlIGNlcnRhaW4KKyAgLy8gY2FzZXMgbGlrZSBQUjI5NjIuICBUaGlzIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gUFIyOTYyIGlzIGZpeGVkLgorICBjb25zdCBGdW5jdGlvbiAqRiA9IE1GLmdldEZ1bmN0aW9uKCk7CisgIGlmIChOb25TY2FsYXJJbnRTYWZlICYmCisgICAgICAhRi0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6Tm9JbXBsaWNpdEZsb2F0KSkgeworICAgIGlmIChTaXplID49IDE2ICYmCisgICAgICAgIChTdWJ0YXJnZXQtPmlzVW5hbGlnbmVkTWVtQWNjZXNzRmFzdCgpIHx8CisgICAgICAgICAoKERzdEFsaWduID09IDAgfHwgRHN0QWxpZ24gPj0gMTYpICYmCisgICAgICAgICAgKFNyY0FsaWduID09IDAgfHwgU3JjQWxpZ24gPj0gMTYpKSkgJiYKKyAgICAgICAgU3VidGFyZ2V0LT5nZXRTdGFja0FsaWdubWVudCgpID49IDE2KSB7CisgICAgICBpZiAoU3VidGFyZ2V0LT5oYXNTU0UyKCkpCisgICAgICAgIHJldHVybiBNVlQ6OnY0aTMyOworICAgICAgaWYgKFN1YnRhcmdldC0+aGFzU1NFMSgpKQorICAgICAgICByZXR1cm4gTVZUOjp2NGYzMjsKKyAgICB9IGVsc2UgaWYgKCFNZW1jcHlTdHJTcmMgJiYgU2l6ZSA+PSA4ICYmCisgICAgICAgICAgICAgICAhU3VidGFyZ2V0LT5pczY0Qml0KCkgJiYKKyAgICAgICAgICAgICAgIFN1YnRhcmdldC0+Z2V0U3RhY2tBbGlnbm1lbnQoKSA+PSA4ICYmCisgICAgICAgICAgICAgICBTdWJ0YXJnZXQtPmhhc1NTRTIoKSkgeworICAgICAgLy8gRG8gbm90IHVzZSBmNjQgdG8gbG93ZXIgbWVtY3B5IGlmIHNvdXJjZSBpcyBzdHJpbmcgY29uc3RhbnQuIEl0J3MKKyAgICAgIC8vIGJldHRlciB0byB1c2UgaTMyIHRvIGF2b2lkIHRoZSBsb2Fkcy4KKyAgICAgIHJldHVybiBNVlQ6OmY2NDsKKyAgICB9CisgIH0KKyAgaWYgKFN1YnRhcmdldC0+aXM2NEJpdCgpICYmIFNpemUgPj0gOCkKKyAgICByZXR1cm4gTVZUOjppNjQ7CisgIHJldHVybiBNVlQ6OmkzMjsKK30KKworLy8vIGdldEp1bXBUYWJsZUVuY29kaW5nIC0gUmV0dXJuIHRoZSBlbnRyeSBlbmNvZGluZyBmb3IgYSBqdW1wIHRhYmxlIGluIHRoZQorLy8vIGN1cnJlbnQgZnVuY3Rpb24uICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBtZW1iZXIgb2YgdGhlCisvLy8gTWFjaGluZUp1bXBUYWJsZUluZm86OkpURW50cnlLaW5kIGVudW0uCit1bnNpZ25lZCBYODZUYXJnZXRMb3dlcmluZzo6Z2V0SnVtcFRhYmxlRW5jb2RpbmcoKSBjb25zdCB7CisgIC8vIEluIEdPVCBwaWMgbW9kZSwgZWFjaCBlbnRyeSBpbiB0aGUganVtcCB0YWJsZSBpcyBlbWl0dGVkIGFzIGEgQEdPVE9GRgorICAvLyBzeW1ib2wuCisgIGlmIChnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18gJiYKKyAgICAgIFN1YnRhcmdldC0+aXNQSUNTdHlsZUdPVCgpKQorICAgIHJldHVybiBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfQ3VzdG9tMzI7CisgIAorICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgbm9ybWFsIGp1bXAgdGFibGUgZW5jb2RpbmcgaGV1cmlzdGljcy4KKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjpnZXRKdW1wVGFibGVFbmNvZGluZygpOworfQorCisvLy8gZ2V0UElDQmFzZVN5bWJvbCAtIFJldHVybiB0aGUgWDg2LTMyIFBJQyBiYXNlLgorTUNTeW1ib2wgKgorWDg2VGFyZ2V0TG93ZXJpbmc6OmdldFBJQ0Jhc2VTeW1ib2woY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSBjb25zdCB7CisgIGNvbnN0IE1DQXNtSW5mbyAmTUFJID0gKmdldFRhcmdldE1hY2hpbmUoKS5nZXRNQ0FzbUluZm8oKTsKKyAgcmV0dXJuIEN0eC5HZXRPckNyZWF0ZVN5bWJvbChUd2luZShNQUkuZ2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShNRi0+Z2V0RnVuY3Rpb25OdW1iZXIoKSkrIiRwYiIpOworfQorCisKK2NvbnN0IE1DRXhwciAqCitYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJDdXN0b21KdW1wVGFibGVFbnRyeShjb25zdCBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqTUpUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1aWQsTUNDb250ZXh0ICZDdHgpIGNvbnN0eworICBhc3NlcnQoZ2V0VGFyZ2V0TWFjaGluZSgpLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpQSUNfICYmCisgICAgICAgICBTdWJ0YXJnZXQtPmlzUElDU3R5bGVHT1QoKSk7CisgIC8vIEluIDMyLWJpdCBFTEYgc3lzdGVtcywgb3VyIGp1bXAgdGFibGUgZW50cmllcyBhcmUgZm9ybWVkIHdpdGggQEdPVE9GRgorICAvLyBlbnRyaWVzLgorICByZXR1cm4gTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoTUJCLT5nZXRTeW1ib2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3ltYm9sUmVmRXhwcjo6VktfR09UT0ZGLCBDdHgpOworfQorCisvLy8gZ2V0UElDSnVtcFRhYmxlUmVsb2NhQmFzZSAtIFJldHVybnMgcmVsb2NhdGlvbiBiYXNlIGZvciB0aGUgZ2l2ZW4gUElDCisvLy8ganVtcHRhYmxlLgorU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6Z2V0UElDSnVtcFRhYmxlUmVsb2NCYXNlKFNEVmFsdWUgVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgaWYgKCFTdWJ0YXJnZXQtPmlzNjRCaXQoKSkKKyAgICAvLyBUaGlzIGRvZXNuJ3QgaGF2ZSBEZWJ1Z0xvYyBhc3NvY2lhdGVkIHdpdGggaXQsIGJ1dCBpcyBub3QgcmVhbGx5IHRoZQorICAgIC8vIHNhbWUgYXMgYSBSZWdpc3Rlci4KKyAgICByZXR1cm4gREFHLmdldE5vZGUoWDg2SVNEOjpHbG9iYWxCYXNlUmVnLCBEZWJ1Z0xvYygpLCBnZXRQb2ludGVyVHkoKSk7CisgIHJldHVybiBUYWJsZTsKK30KKworLy8vIGdldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZUV4cHIgLSBUaGlzIHJldHVybnMgdGhlIHJlbG9jYXRpb24gYmFzZSBmb3IgdGhlCisvLy8gZ2l2ZW4gUElDIGp1bXB0YWJsZSwgdGhlIHNhbWUgYXMgZ2V0UElDSnVtcFRhYmxlUmVsb2NCYXNlLCBidXQgYXMgYW4KKy8vLyBNQ0V4cHIuCitjb25zdCBNQ0V4cHIgKlg4NlRhcmdldExvd2VyaW5nOjoKK2dldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZUV4cHIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiwgdW5zaWduZWQgSlRJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgY29uc3QgeworICAvLyBYODYtNjQgdXNlcyBSSVAgcmVsYXRpdmUgYWRkcmVzc2luZyBiYXNlZCBvbiB0aGUganVtcCB0YWJsZSBsYWJlbC4KKyAgaWYgKFN1YnRhcmdldC0+aXNQSUNTdHlsZVJJUFJlbCgpKQorICAgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6Z2V0UElDSnVtcFRhYmxlUmVsb2NCYXNlRXhwcihNRiwgSlRJLCBDdHgpOworCisgIC8vIE90aGVyd2lzZSwgdGhlIHJlZmVyZW5jZSBpcyByZWxhdGl2ZSB0byB0aGUgUElDIGJhc2UuCisgIHJldHVybiBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShnZXRQSUNCYXNlU3ltYm9sKE1GLCBDdHgpLCBDdHgpOworfQorCisvLy8gZ2V0RnVuY3Rpb25BbGlnbm1lbnQgLSBSZXR1cm4gdGhlIExvZzIgYWxpZ25tZW50IG9mIHRoaXMgZnVuY3Rpb24uCit1bnNpZ25lZCBYODZUYXJnZXRMb3dlcmluZzo6Z2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0IHsKKyAgcmV0dXJuIEYtPmhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok9wdGltaXplRm9yU2l6ZSkgPyAwIDogNDsKK30KKworc3RkOjpwYWlyPGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqLCB1aW50OF90PgorWDg2VGFyZ2V0TG93ZXJpbmc6OmZpbmRSZXByZXNlbnRhdGl2ZUNsYXNzKEVWVCBWVCkgY29uc3R7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJSQyA9IDA7CisgIHVpbnQ4X3QgQ29zdCA9IDE7CisgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6ZmluZFJlcHJlc2VudGF0aXZlQ2xhc3MoVlQpOworICBjYXNlIE1WVDo6aTg6IGNhc2UgTVZUOjppMTY6IGNhc2UgTVZUOjppMzI6IGNhc2UgTVZUOjppNjQ6CisgICAgUlJDID0gKFN1YnRhcmdldC0+aXM2NEJpdCgpCisgICAgICAgICAgID8gWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcyA6IFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MpOworICAgIGJyZWFrOworICBjYXNlIE1WVDo6djhpODogY2FzZSBNVlQ6OnY0aTE2OgorICBjYXNlIE1WVDo6djJpMzI6IGNhc2UgTVZUOjp2MWk2NDogCisgICAgUlJDID0gWDg2OjpWUjY0UmVnaXN0ZXJDbGFzczsKKyAgICBicmVhazsKKyAgY2FzZSBNVlQ6OmYzMjogY2FzZSBNVlQ6OmY2NDoKKyAgY2FzZSBNVlQ6OnYxNmk4OiBjYXNlIE1WVDo6djhpMTY6IGNhc2UgTVZUOjp2NGkzMjogY2FzZSBNVlQ6OnYyaTY0OgorICBjYXNlIE1WVDo6djRmMzI6IGNhc2UgTVZUOjp2MmY2NDoKKyAgY2FzZSBNVlQ6OnYzMmk4OiBjYXNlIE1WVDo6djhpMzI6IGNhc2UgTVZUOjp2NGk2NDogY2FzZSBNVlQ6OnY4ZjMyOgorICBjYXNlIE1WVDo6djRmNjQ6CisgICAgUlJDID0gWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3M7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFJSQywgQ29zdCk7Cit9CisKK3Vuc2lnbmVkCitYODZUYXJnZXRMb3dlcmluZzo6Z2V0UmVnUHJlc3N1cmVMaW1pdChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgdW5zaWduZWQgRlBEaWZmID0gUmVnSW5mby0+aGFzRlAoTUYpID8gMSA6IDA7CisgIHN3aXRjaCAoUkMtPmdldElEKCkpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBYODY6OkdSMzJSZWdDbGFzc0lEOgorICAgIHJldHVybiA0IC0gRlBEaWZmOworICBjYXNlIFg4Njo6R1I2NFJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIDggLSBGUERpZmY7CisgIGNhc2UgWDg2OjpWUjEyOFJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIFN1YnRhcmdldC0+aXM2NEJpdCgpID8gMTAgOiA0OworICBjYXNlIFg4Njo6VlI2NFJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIDQ7CisgIH0KK30KKworYm9vbCBYODZUYXJnZXRMb3dlcmluZzo6Z2V0U3RhY2tDb29raWVMb2NhdGlvbih1bnNpZ25lZCAmQWRkcmVzc1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmT2Zmc2V0KSBjb25zdCB7CisgIGlmICghU3VidGFyZ2V0LT5pc1RhcmdldExpbnV4KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgIC8vICVmczoweDI4LCB1bmxlc3Mgd2UncmUgdXNpbmcgYSBLZXJuZWwgY29kZSBtb2RlbCwgaW4gd2hpY2ggY2FzZSBpdCdzICVnczoKKyAgICBPZmZzZXQgPSAweDI4OworICAgIGlmIChnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0Q29kZU1vZGVsKCkgPT0gQ29kZU1vZGVsOjpLZXJuZWwpCisgICAgICBBZGRyZXNzU3BhY2UgPSAyNTY7CisgICAgZWxzZQorICAgICAgQWRkcmVzc1NwYWNlID0gMjU3OworICB9IGVsc2UgeworICAgIC8vICVnczoweDE0IG9uIGkzODYKKyAgICBPZmZzZXQgPSAweDE0OworICAgIEFkZHJlc3NTcGFjZSA9IDI1NjsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICBSZXR1cm4gVmFsdWUgQ2FsbGluZyBDb252ZW50aW9uIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiWDg2R2VuQ2FsbGluZ0NvbnYuaW5jIgorCitib29sIAorWDg2VGFyZ2V0TG93ZXJpbmc6OkNhbkxvd2VyUmV0dXJuKENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIFJWTG9jcywgQ29udGV4dCk7CisgIHJldHVybiBDQ0luZm8uQ2hlY2tSZXR1cm4oT3V0cywgUmV0Q0NfWDg2KTsKK30KKworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyUmV0dXJuKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBYODZNYWNoaW5lRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKworICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIFJWTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworICBDQ0luZm8uQW5hbHl6ZVJldHVybihPdXRzLCBSZXRDQ19YODYpOworCisgIC8vIEFkZCB0aGUgcmVncyB0byB0aGUgbGl2ZW91dCBzZXQgZm9yIHRoZSBmdW5jdGlvbi4KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldFJlZ0luZm8oKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpCisgICAgaWYgKFJWTG9jc1tpXS5pc1JlZ0xvYygpICYmICFNUkkuaXNMaXZlT3V0KFJWTG9jc1tpXS5nZXRMb2NSZWcoKSkpCisgICAgICBNUkkuYWRkTGl2ZU91dChSVkxvY3NbaV0uZ2V0TG9jUmVnKCkpOworCisgIFNEVmFsdWUgRmxhZzsKKworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA2PiBSZXRPcHM7CisgIFJldE9wcy5wdXNoX2JhY2soQ2hhaW4pOyAvLyBPcGVyYW5kICMwID0gQ2hhaW4gKHVwZGF0ZWQgYmVsb3cpCisgIC8vIE9wZXJhbmQgIzEgPSBCeXRlcyBUbyBQb3AKKyAgUmV0T3BzLnB1c2hfYmFjayhEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoRnVuY0luZm8tPmdldEJ5dGVzVG9Qb3BPblJldHVybigpLAorICAgICAgICAgICAgICAgICAgIE1WVDo6aTE2KSk7CisKKyAgLy8gQ29weSB0aGUgcmVzdWx0IHZhbHVlcyBpbnRvIHRoZSBvdXRwdXQgcmVnaXN0ZXJzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkgeworICAgIENDVmFsQXNzaWduICZWQSA9IFJWTG9jc1tpXTsKKyAgICBhc3NlcnQoVkEuaXNSZWdMb2MoKSAmJiAiQ2FuIG9ubHkgcmV0dXJuIGluIHJlZ2lzdGVycyEiKTsKKyAgICBTRFZhbHVlIFZhbFRvQ29weSA9IE91dFZhbHNbaV07CisgICAgRVZUIFZhbFZUID0gVmFsVG9Db3B5LmdldFZhbHVlVHlwZSgpOworCisgICAgLy8gSWYgdGhpcyBpcyB4ODYtNjQsIGFuZCB3ZSBkaXNhYmxlZCBTU0UsIHdlIGNhbid0IHJldHVybiBGUCB2YWx1ZXMKKyAgICBpZiAoKFZhbFZUID09IE1WVDo6ZjMyIHx8IFZhbFZUID09IE1WVDo6ZjY0KSAmJgorICAgICAgICAoU3VidGFyZ2V0LT5pczY0Qml0KCkgJiYgIVN1YnRhcmdldC0+aGFzU1NFMSgpKSkgeworICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJTU0UgcmVnaXN0ZXIgcmV0dXJuIHdpdGggU1NFIGRpc2FibGVkIik7CisgICAgfQorICAgIC8vIExpa2V3aXNlIHdlIGNhbid0IHJldHVybiBGNjQgdmFsdWVzIHdpdGggU1NFMSBvbmx5LiAgZ2NjIGRvZXMgc28sIGJ1dAorICAgIC8vIGxsdm0tZ2NjIGhhcyBuZXZlciBkb25lIGl0IHJpZ2h0IGFuZCBubyBvbmUgaGFzIG5vdGljZWQsIHNvIHRoaXMKKyAgICAvLyBzaG91bGQgYmUgT0sgZm9yIG5vdy4KKyAgICBpZiAoVmFsVlQgPT0gTVZUOjpmNjQgJiYKKyAgICAgICAgKFN1YnRhcmdldC0+aXM2NEJpdCgpICYmICFTdWJ0YXJnZXQtPmhhc1NTRTIoKSkpIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiU1NFMiByZWdpc3RlciByZXR1cm4gd2l0aCBTU0UyIGRpc2FibGVkIik7CisgICAgfQorCisgICAgLy8gUmV0dXJucyBpbiBTVDAvU1QxIGFyZSBoYW5kbGVkIHNwZWNpYWxseTogdGhlc2UgYXJlIHB1c2hlZCBhcyBvcGVyYW5kcyB0bworICAgIC8vIHRoZSBSRVQgaW5zdHJ1Y3Rpb24gYW5kIGhhbmRsZWQgYnkgdGhlIEZQIFN0YWNraWZpZXIuCisgICAgaWYgKFZBLmdldExvY1JlZygpID09IFg4Njo6U1QwIHx8CisgICAgICAgIFZBLmdldExvY1JlZygpID09IFg4Njo6U1QxKSB7CisgICAgICAvLyBJZiB0aGlzIGlzIGEgY29weSBmcm9tIGFuIHhtbSByZWdpc3RlciB0byBTVCgwKSwgdXNlIGFuIEZQRXh0ZW5kIHRvCisgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlIHRvIHRoZSBGUCBzdGFjayByZWdpc3RlciBjbGFzcy4KKyAgICAgIGlmIChpc1NjYWxhckZQVHlwZUluU1NFUmVnKFZBLmdldFZhbFZUKCkpKQorICAgICAgICBWYWxUb0NvcHkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZQX0VYVEVORCwgZGwsIE1WVDo6ZjgwLCBWYWxUb0NvcHkpOworICAgICAgUmV0T3BzLnB1c2hfYmFjayhWYWxUb0NvcHkpOworICAgICAgLy8gRG9uJ3QgZW1pdCBhIGNvcHl0b3JlZy4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIDY0LWJpdCB2ZWN0b3IgKE1NWCkgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBYTU0wIC8gWE1NMSBleGNlcHQgZm9yIHYxaTY0CisgICAgLy8gd2hpY2ggaXMgcmV0dXJuZWQgaW4gUkFYIC8gUkRYLgorICAgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgICAgaWYgKFZhbFZULmlzVmVjdG9yKCkgJiYgVmFsVlQuZ2V0U2l6ZUluQml0cygpID09IDY0KSB7CisgICAgICAgIFZhbFRvQ29weSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6Omk2NCwgVmFsVG9Db3B5KTsKKyAgICAgICAgaWYgKFZBLmdldExvY1JlZygpID09IFg4Njo6WE1NMCB8fCBWQS5nZXRMb2NSZWcoKSA9PSBYODY6OlhNTTEpCisgICAgICAgICAgVmFsVG9Db3B5ID0gREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwgTVZUOjp2Mmk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxUb0NvcHkpOworICAgICAgfQorICAgIH0KKworICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFZBLmdldExvY1JlZygpLCBWYWxUb0NvcHksIEZsYWcpOworICAgIEZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIC8vIFRoZSB4ODYtNjQgQUJJIGZvciByZXR1cm5pbmcgc3RydWN0cyBieSB2YWx1ZSByZXF1aXJlcyB0aGF0IHdlIGNvcHkKKyAgLy8gdGhlIHNyZXQgYXJndW1lbnQgaW50byAlcmF4IGZvciB0aGUgcmV0dXJuLiBXZSBzYXZlZCB0aGUgYXJndW1lbnQgaW50bworICAvLyBhIHZpcnR1YWwgcmVnaXN0ZXIgaW4gdGhlIGVudHJ5IGJsb2NrLCBzbyBub3cgd2UgY29weSB0aGUgdmFsdWUgb3V0CisgIC8vIGFuZCBpbnRvICVyYXguCisgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSAmJgorICAgICAgREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZ1bmN0aW9uKCktPmhhc1N0cnVjdFJldEF0dHIoKSkgeworICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgICAgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyAqRnVuY0luZm8gPSBNRi5nZXRJbmZvPFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisgICAgdW5zaWduZWQgUmVnID0gRnVuY0luZm8tPmdldFNSZXRSZXR1cm5SZWcoKTsKKyAgICBhc3NlcnQoUmVnICYmIAorICAgICAgICAgICAiU1JldFJldHVyblJlZyBzaG91bGQgaGF2ZSBiZWVuIHNldCBpbiBMb3dlckZvcm1hbEFyZ3VtZW50cygpLiIpOworICAgIFNEVmFsdWUgVmFsID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgUmVnLCBnZXRQb2ludGVyVHkoKSk7CisKKyAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBYODY6OlJBWCwgVmFsLCBGbGFnKTsKKyAgICBGbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisKKyAgICAvLyBSQVggbm93IGFjdHMgbGlrZSBhIHJldHVybiB2YWx1ZS4KKyAgICBNUkkuYWRkTGl2ZU91dChYODY6OlJBWCk7CisgIH0KKworICBSZXRPcHNbMF0gPSBDaGFpbjsgIC8vIFVwZGF0ZSBjaGFpbi4KKworICAvLyBBZGQgdGhlIGZsYWcgaWYgd2UgaGF2ZSBpdC4KKyAgaWYgKEZsYWcuZ2V0Tm9kZSgpKQorICAgIFJldE9wcy5wdXNoX2JhY2soRmxhZyk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6UkVUX0ZMQUcsIGRsLAorICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwgJlJldE9wc1swXSwgUmV0T3BzLnNpemUoKSk7Cit9CisKKy8vLyBMb3dlckNhbGxSZXN1bHQgLSBMb3dlciB0aGUgcmVzdWx0IHZhbHVlcyBvZiBhIGNhbGwgaW50byB0aGUKKy8vLyBhcHByb3ByaWF0ZSBjb3BpZXMgb3V0IG9mIGFwcHJvcHJpYXRlIHBoeXNpY2FsIHJlZ2lzdGVycy4KKy8vLworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbFJlc3VsdChTRFZhbHVlIENoYWluLCBTRFZhbHVlIEluRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3QgeworCisgIC8vIEFzc2lnbiBsb2NhdGlvbnMgdG8gZWFjaCB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGNhbGwuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gUlZMb2NzOworICBib29sIElzNjRCaXQgPSBTdWJ0YXJnZXQtPmlzNjRCaXQoKTsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIFJWTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworICBDQ0luZm8uQW5hbHl6ZUNhbGxSZXN1bHQoSW5zLCBSZXRDQ19YODYpOworCisgIC8vIENvcHkgYWxsIG9mIHRoZSByZXN1bHQgcmVnaXN0ZXJzIG91dCBvZiB0aGVpciBzcGVjaWZpZWQgcGh5c3JlZy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSVkxvY3Muc2l6ZSgpOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBSVkxvY3NbaV07CisgICAgRVZUIENvcHlWVCA9IFZBLmdldFZhbFZUKCk7CisKKyAgICAvLyBJZiB0aGlzIGlzIHg4Ni02NCwgYW5kIHdlIGRpc2FibGVkIFNTRSwgd2UgY2FuJ3QgcmV0dXJuIEZQIHZhbHVlcworICAgIGlmICgoQ29weVZUID09IE1WVDo6ZjMyIHx8IENvcHlWVCA9PSBNVlQ6OmY2NCkgJiYKKyAgICAgICAgKChJczY0Qml0IHx8IEluc1tpXS5GbGFncy5pc0luUmVnKCkpICYmICFTdWJ0YXJnZXQtPmhhc1NTRTEoKSkpIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiU1NFIHJlZ2lzdGVyIHJldHVybiB3aXRoIFNTRSBkaXNhYmxlZCIpOworICAgIH0KKworICAgIFNEVmFsdWUgVmFsOworCisgICAgLy8gSWYgdGhpcyBpcyBhIGNhbGwgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZnAgdmFsdWUgb24gdGhlIGZsb2F0aW5nCisgICAgLy8gcG9pbnQgc3RhY2ssIHdlIG11c3QgZ3VhcmFudGVlIHRoZSB0aGUgdmFsdWUgaXMgcG9wcGVkIGZyb20gdGhlIHN0YWNrLCBzbworICAgIC8vIGEgQ29weUZyb21SZWcgaXMgbm90IGdvb2QgZW5vdWdoIC0gdGhlIGNvcHkgaW5zdHJ1Y3Rpb24gbWF5IGJlIGVsaW1pbmF0ZWQKKyAgICAvLyBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCB1c2VkLiBXZSB1c2UgdGhlIEZwR0VUX1NUMCBpbnN0cnVjdGlvbnMKKyAgICAvLyBpbnN0ZWFkLgorICAgIGlmIChWQS5nZXRMb2NSZWcoKSA9PSBYODY6OlNUMCB8fCBWQS5nZXRMb2NSZWcoKSA9PSBYODY6OlNUMSkgeworICAgICAgLy8gSWYgd2UgcHJlZmVyIHRvIHVzZSB0aGUgdmFsdWUgaW4geG1tIHJlZ2lzdGVycywgY29weSBpdCBvdXQgYXMgZjgwIGFuZAorICAgICAgLy8gdXNlIGEgdHJ1bmNhdGUgdG8gbW92ZSBpdCBmcm9tIGZwIHN0YWNrIHJlZyB0byB4bW0gcmVnLgorICAgICAgaWYgKGlzU2NhbGFyRlBUeXBlSW5TU0VSZWcoVkEuZ2V0VmFsVlQoKSkpIENvcHlWVCA9IE1WVDo6ZjgwOworICAgICAgYm9vbCBpc1NUMCA9IFZBLmdldExvY1JlZygpID09IFg4Njo6U1QwOworICAgICAgdW5zaWduZWQgT3BjID0gMDsKKyAgICAgIGlmIChDb3B5VlQgPT0gTVZUOjpmMzIpIE9wYyA9IGlzU1QwID8gWDg2OjpGcEdFVF9TVDBfMzI6WDg2OjpGcEdFVF9TVDFfMzI7CisgICAgICBpZiAoQ29weVZUID09IE1WVDo6ZjY0KSBPcGMgPSBpc1NUMCA/IFg4Njo6RnBHRVRfU1QwXzY0Olg4Njo6RnBHRVRfU1QxXzY0OworICAgICAgaWYgKENvcHlWVCA9PSBNVlQ6OmY4MCkgT3BjID0gaXNTVDAgPyBYODY6OkZwR0VUX1NUMF84MDpYODY6OkZwR0VUX1NUMV84MDsKKyAgICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBJbkZsYWcgfTsKKyAgICAgIENoYWluID0gU0RWYWx1ZShEQUcuZ2V0TWFjaGluZU5vZGUoT3BjLCBkbCwgQ29weVZULCBNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgMiksIDEpOworICAgICAgVmFsID0gQ2hhaW4uZ2V0VmFsdWUoMCk7CisKKyAgICAgIC8vIFJvdW5kIHRoZSBmODAgdG8gdGhlIHJpZ2h0IHNpemUsIHdoaWNoIGFsc28gbW92ZXMgaXQgdG8gdGhlIGFwcHJvcHJpYXRlCisgICAgICAvLyB4bW0gcmVnaXN0ZXIuCisgICAgICBpZiAoQ29weVZUICE9IFZBLmdldFZhbFZUKCkpCisgICAgICAgIFZhbCA9IERBRy5nZXROb2RlKElTRDo6RlBfUk9VTkQsIGRsLCBWQS5nZXRWYWxWVCgpLCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdHJ1bmNhdGlvbiB3b24ndCBjaGFuZ2UgdGhlIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMSkpOworICAgIH0gZWxzZSBpZiAoSXM2NEJpdCAmJiBDb3B5VlQuaXNWZWN0b3IoKSAmJiBDb3B5VlQuZ2V0U2l6ZUluQml0cygpID09IDY0KSB7CisgICAgICAvLyBGb3IgeDg2LTY0LCBNTVggdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBYTU0wIC8gWE1NMSBleGNlcHQgZm9yIHYxaTY0LgorICAgICAgaWYgKFZBLmdldExvY1JlZygpID09IFg4Njo6WE1NMCB8fCBWQS5nZXRMb2NSZWcoKSA9PSBYODY6OlhNTTEpIHsKKyAgICAgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBWQS5nZXRMb2NSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjp2Mmk2NCwgSW5GbGFnKS5nZXRWYWx1ZSgxKTsKKyAgICAgICAgVmFsID0gQ2hhaW4uZ2V0VmFsdWUoMCk7CisgICAgICAgIFZhbCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgTVZUOjppNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbCwgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTY0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDaGFpbiA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZBLmdldExvY1JlZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Omk2NCwgSW5GbGFnKS5nZXRWYWx1ZSgxKTsKKyAgICAgICAgVmFsID0gQ2hhaW4uZ2V0VmFsdWUoMCk7CisgICAgICB9CisgICAgICBWYWwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgQ29weVZULCBWYWwpOworICAgIH0gZWxzZSB7CisgICAgICBDaGFpbiA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZBLmdldExvY1JlZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weVZULCBJbkZsYWcpLmdldFZhbHVlKDEpOworICAgICAgVmFsID0gQ2hhaW4uZ2V0VmFsdWUoMCk7CisgICAgfQorICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDIpOworICAgIEluVmFscy5wdXNoX2JhY2soVmFsKTsKKyAgfQorCisgIHJldHVybiBDaGFpbjsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgQyAmIFN0ZENhbGwgJiBGYXN0IENhbGxpbmcgQ29udmVudGlvbiBpbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBTdGRDYWxsIGNhbGxpbmcgY29udmVudGlvbiBzZWVtcyB0byBiZSBzdGFuZGFyZCBmb3IgbWFueSBXaW5kb3dzJyBBUEkKKy8vICByb3V0aW5lcyBhbmQgYXJvdW5kLiBJdCBkaWZmZXJzIGZyb20gQyBjYWxsaW5nIGNvbnZlbnRpb24ganVzdCBhIGxpdHRsZToKKy8vICBjYWxsZWUgc2hvdWxkIGNsZWFuIHVwIHRoZSBzdGFjaywgbm90IGNhbGxlci4gU3ltYm9scyBzaG91bGQgYmUgYWxzbworLy8gIGRlY29yYXRlZCBpbiBzb21lIGZhbmN5IHdheSA6KSBJdCBkb2Vzbid0IHN1cHBvcnQgYW55IHZlY3RvciBhcmd1bWVudHMuCisvLyAgRm9yIGluZm8gb24gZmFzdCBjYWxsaW5nIGNvbnZlbnRpb24gc2VlIEZhc3QgQ2FsbGluZyBDb252ZW50aW9uICh0YWlsIGNhbGwpCisvLyAgaW1wbGVtZW50YXRpb24gTG93ZXJYODZfMzJGYXN0Q0NDYWxsVG8uCisKKy8vLyBDYWxsSXNTdHJ1Y3RSZXR1cm4gLSBEZXRlcm1pbmVzIHdoZXRoZXIgYSBjYWxsIHVzZXMgc3RydWN0IHJldHVybgorLy8vIHNlbWFudGljcy4KK3N0YXRpYyBib29sIENhbGxJc1N0cnVjdFJldHVybihjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzKSB7CisgIGlmIChPdXRzLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiBPdXRzWzBdLkZsYWdzLmlzU1JldCgpOworfQorCisvLy8gQXJnc0FyZVN0cnVjdFJldHVybiAtIERldGVybWluZXMgd2hldGhlciBhIGZ1bmN0aW9uIHVzZXMgc3RydWN0CisvLy8gcmV0dXJuIHNlbWFudGljcy4KK3N0YXRpYyBib29sCitBcmdzQXJlU3RydWN0UmV0dXJuKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zKSB7CisgIGlmIChJbnMuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIEluc1swXS5GbGFncy5pc1NSZXQoKTsKK30KKworLy8vIENDQXNzaWduRm5Gb3JOb2RlIC0gU2VsZWN0cyB0aGUgY29ycmVjdCBDQ0Fzc2lnbkZuIGZvciBhIHRoZQorLy8vIGdpdmVuIENhbGxpbmdDb252ZW50aW9uIHZhbHVlLgorQ0NBc3NpZ25GbiAqWDg2VGFyZ2V0TG93ZXJpbmc6OkNDQXNzaWduRm5Gb3JOb2RlKENhbGxpbmdDb252OjpJRCBDQykgY29uc3QgeworICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkpIHsKKyAgICBpZiAoQ0MgPT0gQ2FsbGluZ0NvbnY6OkdIQykKKyAgICAgIHJldHVybiBDQ19YODZfNjRfR0hDOworICAgIGVsc2UgaWYgKFN1YnRhcmdldC0+aXNUYXJnZXRXaW42NCgpKQorICAgICAgcmV0dXJuIENDX1g4Nl9XaW42NF9DOworICAgIGVsc2UKKyAgICAgIHJldHVybiBDQ19YODZfNjRfQzsKKyAgfQorCisgIGlmIChDQyA9PSBDYWxsaW5nQ29udjo6WDg2X0Zhc3RDYWxsKQorICAgIHJldHVybiBDQ19YODZfMzJfRmFzdENhbGw7CisgIGVsc2UgaWYgKENDID09IENhbGxpbmdDb252OjpYODZfVGhpc0NhbGwpCisgICAgcmV0dXJuIENDX1g4Nl8zMl9UaGlzQ2FsbDsKKyAgZWxzZSBpZiAoQ0MgPT0gQ2FsbGluZ0NvbnY6OkZhc3QpCisgICAgcmV0dXJuIENDX1g4Nl8zMl9GYXN0Q0M7CisgIGVsc2UgaWYgKENDID09IENhbGxpbmdDb252OjpHSEMpCisgICAgcmV0dXJuIENDX1g4Nl8zMl9HSEM7CisgIGVsc2UKKyAgICByZXR1cm4gQ0NfWDg2XzMyX0M7Cit9CisKKy8vLyBDcmVhdGVDb3B5T2ZCeVZhbEFyZ3VtZW50IC0gTWFrZSBhIGNvcHkgb2YgYW4gYWdncmVnYXRlIGF0IGFkZHJlc3Mgc3BlY2lmaWVkCisvLy8gYnkgIlNyYyIgdG8gYWRkcmVzcyAiRHN0IiB3aXRoIHNpemUgYW5kIGFsaWdubWVudCBpbmZvcm1hdGlvbiBzcGVjaWZpZWQgYnkKKy8vLyB0aGUgc3BlY2lmaWMgcGFyYW1ldGVyIGF0dHJpYnV0ZS4gVGhlIGNvcHkgd2lsbCBiZSBwYXNzZWQgYXMgYSBieXZhbAorLy8vIGZ1bmN0aW9uIHBhcmFtZXRlci4KK3N0YXRpYyBTRFZhbHVlCitDcmVhdGVDb3B5T2ZCeVZhbEFyZ3VtZW50KFNEVmFsdWUgU3JjLCBTRFZhbHVlIERzdCwgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgU0RWYWx1ZSBTaXplTm9kZSAgICAgPSBEQUcuZ2V0Q29uc3RhbnQoRmxhZ3MuZ2V0QnlWYWxTaXplKCksIE1WVDo6aTMyKTsKKyAgcmV0dXJuIERBRy5nZXRNZW1jcHkoQ2hhaW4sIGRsLCBEc3QsIFNyYywgU2l6ZU5vZGUsIEZsYWdzLmdldEJ5VmFsQWxpZ24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgLyppc1ZvbGF0aWxlKi9mYWxzZSwgLypBbHdheXNJbmxpbmU9Ki90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCAwKTsKK30KKworLy8vIElzVGFpbENhbGxDb252ZW50aW9uIC0gUmV0dXJuIHRydWUgaWYgdGhlIGNhbGxpbmcgY29udmVudGlvbiBpcyBvbmUgdGhhdAorLy8vIHN1cHBvcnRzIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24uCitzdGF0aWMgYm9vbCBJc1RhaWxDYWxsQ29udmVudGlvbihDYWxsaW5nQ29udjo6SUQgQ0MpIHsKKyAgcmV0dXJuIChDQyA9PSBDYWxsaW5nQ29udjo6RmFzdCB8fCBDQyA9PSBDYWxsaW5nQ29udjo6R0hDKTsKK30KKworLy8vIEZ1bmNJc01hZGVUYWlsQ2FsbFNhZmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgbWFkZSBpbnRvCisvLy8gYSB0YWlsY2FsbCB0YXJnZXQgYnkgY2hhbmdpbmcgaXRzIEFCSS4KK3N0YXRpYyBib29sIEZ1bmNJc01hZGVUYWlsQ2FsbFNhZmUoQ2FsbGluZ0NvbnY6OklEIENDKSB7CisgIHJldHVybiBHdWFyYW50ZWVkVGFpbENhbGxPcHQgJiYgSXNUYWlsQ2FsbENvbnZlbnRpb24oQ0MpOworfQorCitTRFZhbHVlCitYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJNZW1Bcmd1bWVudChTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDQ1ZhbEFzc2lnbiAmVkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnJhbWVJbmZvICpNRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpKSBjb25zdCB7CisgIC8vIENyZWF0ZSB0aGUgbm9kZXMgY29ycmVzcG9uZGluZyB0byBhIGxvYWQgZnJvbSB0aGlzIHBhcmFtZXRlciBzbG90LgorICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MgPSBJbnNbaV0uRmxhZ3M7CisgIGJvb2wgQWx3YXlzVXNlTXV0YWJsZSA9IEZ1bmNJc01hZGVUYWlsQ2FsbFNhZmUoQ2FsbENvbnYpOworICBib29sIGlzSW1tdXRhYmxlID0gIUFsd2F5c1VzZU11dGFibGUgJiYgIUZsYWdzLmlzQnlWYWwoKTsKKyAgRVZUIFZhbFZUOworCisgIC8vIElmIHZhbHVlIGlzIHBhc3NlZCBieSBwb2ludGVyIHdlIGhhdmUgYWRkcmVzcyBwYXNzZWQgaW5zdGVhZCBvZiB0aGUgdmFsdWUKKyAgLy8gaXRzZWxmLgorICBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpJbmRpcmVjdCkKKyAgICBWYWxWVCA9IFZBLmdldExvY1ZUKCk7CisgIGVsc2UKKyAgICBWYWxWVCA9IFZBLmdldFZhbFZUKCk7CisKKyAgLy8gRklYTUU6IEZvciBub3csIGFsbCBieXZhbCBwYXJhbWV0ZXIgb2JqZWN0cyBhcmUgbWFya2VkIG11dGFibGUuIFRoaXMgY2FuIGJlCisgIC8vIGNoYW5nZWQgd2l0aCBtb3JlIGFuYWx5c2lzLgorICAvLyBJbiBjYXNlIG9mIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24gbWFyayBhbGwgYXJndW1lbnRzIG11dGFibGUuIFNpbmNlIHRoZXkKKyAgLy8gY291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgbG93ZXJpbmcgb2YgYXJndW1lbnRzIGluIGNhc2Ugb2YgYSB0YWlsIGNhbGwuCisgIGlmIChGbGFncy5pc0J5VmFsKCkpIHsKKyAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KEZsYWdzLmdldEJ5VmFsU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkEuZ2V0TG9jTWVtT2Zmc2V0KCksIGlzSW1tdXRhYmxlKTsKKyAgICByZXR1cm4gREFHLmdldEZyYW1lSW5kZXgoRkksIGdldFBvaW50ZXJUeSgpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KFZhbFZULmdldFNpemVJbkJpdHMoKS84LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkEuZ2V0TG9jTWVtT2Zmc2V0KCksIGlzSW1tdXRhYmxlKTsKKyAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZJLCBnZXRQb2ludGVyVHkoKSk7CisgICAgcmV0dXJuIERBRy5nZXRMb2FkKFZhbFZULCBkbCwgQ2hhaW4sIEZJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICB9Cit9CisKK1NEVmFsdWUKK1g4NlRhcmdldExvd2VyaW5nOjpMb3dlckZvcm1hbEFyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyAqRnVuY0luZm8gPSBNRi5nZXRJbmZvPFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisKKyAgY29uc3QgRnVuY3Rpb24qIEZuID0gTUYuZ2V0RnVuY3Rpb24oKTsKKyAgaWYgKEZuLT5oYXNFeHRlcm5hbExpbmthZ2UoKSAmJgorICAgICAgU3VidGFyZ2V0LT5pc1RhcmdldEN5Z01pbmcoKSAmJgorICAgICAgRm4tPmdldE5hbWUoKSA9PSAibWFpbiIpCisgICAgRnVuY0luZm8tPnNldEZvcmNlRnJhbWVQb2ludGVyKHRydWUpOworCisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBib29sIElzNjRCaXQgPSBTdWJ0YXJnZXQtPmlzNjRCaXQoKTsKKyAgYm9vbCBJc1dpbjY0ID0gU3VidGFyZ2V0LT5pc1RhcmdldFdpbjY0KCk7CisKKyAgYXNzZXJ0KCEoaXNWYXJBcmcgJiYgSXNUYWlsQ2FsbENvbnZlbnRpb24oQ2FsbENvbnYpKSAmJgorICAgICAgICAgIlZhciBhcmdzIG5vdCBzdXBwb3J0ZWQgd2l0aCBjYWxsaW5nIGNvbnZlbnRpb24gZmFzdGNjIG9yIGdoYyIpOworCisgIC8vIEFzc2lnbiBsb2NhdGlvbnMgdG8gYWxsIG9mIHRoZSBpbmNvbWluZyBhcmd1bWVudHMuCisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCAxNj4gQXJnTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIEFyZ0xvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgQ0NJbmZvLkFuYWx5emVGb3JtYWxBcmd1bWVudHMoSW5zLCBDQ0Fzc2lnbkZuRm9yTm9kZShDYWxsQ29udikpOworCisgIHVuc2lnbmVkIExhc3RWYWwgPSB+MFU7CisgIFNEVmFsdWUgQXJnVmFsdWU7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBBcmdMb2NzW2ldOworICAgIC8vIFRPRE86IElmIGFuIGFyZyBpcyBwYXNzZWQgaW4gdHdvIHBsYWNlcyAoZS5nLiByZWcgYW5kIHN0YWNrKSwgc2tpcCBsYXRlcgorICAgIC8vIHBsYWNlcy4KKyAgICBhc3NlcnQoVkEuZ2V0VmFsTm8oKSAhPSBMYXN0VmFsICYmCisgICAgICAgICAgICJEb24ndCBzdXBwb3J0IHZhbHVlIGFzc2lnbmVkIHRvIG11bHRpcGxlIGxvY3MgeWV0Iik7CisgICAgTGFzdFZhbCA9IFZBLmdldFZhbE5vKCk7CisKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgRVZUIFJlZ1ZUID0gVkEuZ2V0TG9jVlQoKTsKKyAgICAgIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gTlVMTDsKKyAgICAgIGlmIChSZWdWVCA9PSBNVlQ6OmkzMikKKyAgICAgICAgUkMgPSBYODY6OkdSMzJSZWdpc3RlckNsYXNzOworICAgICAgZWxzZSBpZiAoSXM2NEJpdCAmJiBSZWdWVCA9PSBNVlQ6Omk2NCkKKyAgICAgICAgUkMgPSBYODY6OkdSNjRSZWdpc3RlckNsYXNzOworICAgICAgZWxzZSBpZiAoUmVnVlQgPT0gTVZUOjpmMzIpCisgICAgICAgIFJDID0gWDg2OjpGUjMyUmVnaXN0ZXJDbGFzczsKKyAgICAgIGVsc2UgaWYgKFJlZ1ZUID09IE1WVDo6ZjY0KQorICAgICAgICBSQyA9IFg4Njo6RlI2NFJlZ2lzdGVyQ2xhc3M7CisgICAgICBlbHNlIGlmIChSZWdWVC5pc1ZlY3RvcigpICYmIFJlZ1ZULmdldFNpemVJbkJpdHMoKSA9PSAyNTYpCisgICAgICAgIFJDID0gWDg2OjpWUjI1NlJlZ2lzdGVyQ2xhc3M7CisgICAgICBlbHNlIGlmIChSZWdWVC5pc1ZlY3RvcigpICYmIFJlZ1ZULmdldFNpemVJbkJpdHMoKSA9PSAxMjgpCisgICAgICAgIFJDID0gWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3M7CisgICAgICBlbHNlIGlmIChSZWdWVC5pc1ZlY3RvcigpICYmIFJlZ1ZULmdldFNpemVJbkJpdHMoKSA9PSA2NCkKKyAgICAgICAgUkMgPSBYODY6OlZSNjRSZWdpc3RlckNsYXNzOworICAgICAgZWxzZQorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGFyZ3VtZW50IHR5cGUhIik7CisKKyAgICAgIHVuc2lnbmVkIFJlZyA9IE1GLmFkZExpdmVJbihWQS5nZXRMb2NSZWcoKSwgUkMpOworICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBSZWcsIFJlZ1ZUKTsKKworICAgICAgLy8gSWYgdGhpcyBpcyBhbiA4IG9yIDE2LWJpdCB2YWx1ZSwgaXQgaXMgcmVhbGx5IHBhc3NlZCBwcm9tb3RlZCB0byAzMgorICAgICAgLy8gYml0cy4gIEluc2VydCBhbiBhc3NlcnRbc3pdZXh0IHRvIGNhcHR1cmUgdGhpcywgdGhlbiB0cnVuY2F0ZSB0byB0aGUKKyAgICAgIC8vIHJpZ2h0IHNpemUuCisgICAgICBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpTRXh0KQorICAgICAgICBBcmdWYWx1ZSA9IERBRy5nZXROb2RlKElTRDo6QXNzZXJ0U2V4dCwgZGwsIFJlZ1ZULCBBcmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKFZBLmdldFZhbFZUKCkpKTsKKyAgICAgIGVsc2UgaWYgKFZBLmdldExvY0luZm8oKSA9PSBDQ1ZhbEFzc2lnbjo6WkV4dCkKKyAgICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFpleHQsIGRsLCBSZWdWVCwgQXJnVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZhbHVlVHlwZShWQS5nZXRWYWxWVCgpKSk7CisgICAgICBlbHNlIGlmIChWQS5nZXRMb2NJbmZvKCkgPT0gQ0NWYWxBc3NpZ246OkJDdnQpCisgICAgICAgIEFyZ1ZhbHVlID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZBLmdldFZhbFZUKCksIEFyZ1ZhbHVlKTsKKworICAgICAgaWYgKFZBLmlzRXh0SW5Mb2MoKSkgeworICAgICAgICAvLyBIYW5kbGUgTU1YIHZhbHVlcyBwYXNzZWQgaW4gWE1NIHJlZ3MuCisgICAgICAgIGlmIChSZWdWVC5pc1ZlY3RvcigpKSB7CisgICAgICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE1WVDo6aTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnVmFsdWUsIERBRy5nZXRDb25zdGFudCgwLCBNVlQ6Omk2NCkpOworICAgICAgICAgIEFyZ1ZhbHVlID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZBLmdldFZhbFZUKCksIEFyZ1ZhbHVlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgQXJnVmFsdWUgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgVkEuZ2V0VmFsVlQoKSwgQXJnVmFsdWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoVkEuaXNNZW1Mb2MoKSk7CisgICAgICBBcmdWYWx1ZSA9IExvd2VyTWVtQXJndW1lbnQoQ2hhaW4sIENhbGxDb252LCBJbnMsIGRsLCBEQUcsIFZBLCBNRkksIGkpOworICAgIH0KKworICAgIC8vIElmIHZhbHVlIGlzIHBhc3NlZCB2aWEgcG9pbnRlciAtIGRvIGEgbG9hZC4KKyAgICBpZiAoVkEuZ2V0TG9jSW5mbygpID09IENDVmFsQXNzaWduOjpJbmRpcmVjdCkKKyAgICAgIEFyZ1ZhbHVlID0gREFHLmdldExvYWQoVkEuZ2V0VmFsVlQoKSwgZGwsIENoYWluLCBBcmdWYWx1ZSwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgIEluVmFscy5wdXNoX2JhY2soQXJnVmFsdWUpOworICB9CisKKyAgLy8gVGhlIHg4Ni02NCBBQkkgZm9yIHJldHVybmluZyBzdHJ1Y3RzIGJ5IHZhbHVlIHJlcXVpcmVzIHRoYXQgd2UgY29weQorICAvLyB0aGUgc3JldCBhcmd1bWVudCBpbnRvICVyYXggZm9yIHRoZSByZXR1cm4uIFNhdmUgdGhlIGFyZ3VtZW50IGludG8KKyAgLy8gYSB2aXJ0dWFsIHJlZ2lzdGVyIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBmcm9tIHRoZSByZXR1cm4gcG9pbnRzLgorICBpZiAoSXM2NEJpdCAmJiBNRi5nZXRGdW5jdGlvbigpLT5oYXNTdHJ1Y3RSZXRBdHRyKCkpIHsKKyAgICBYODZNYWNoaW5lRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKyAgICB1bnNpZ25lZCBSZWcgPSBGdW5jSW5mby0+Z2V0U1JldFJldHVyblJlZygpOworICAgIGlmICghUmVnKSB7CisgICAgICBSZWcgPSBNRi5nZXRSZWdJbmZvKCkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKGdldFJlZ0NsYXNzRm9yKE1WVDo6aTY0KSk7CisgICAgICBGdW5jSW5mby0+c2V0U1JldFJldHVyblJlZyhSZWcpOworICAgIH0KKyAgICBTRFZhbHVlIENvcHkgPSBEQUcuZ2V0Q29weVRvUmVnKERBRy5nZXRFbnRyeU5vZGUoKSwgZGwsIFJlZywgSW5WYWxzWzBdKTsKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLCBDb3B5LCBDaGFpbik7CisgIH0KKworICB1bnNpZ25lZCBTdGFja1NpemUgPSBDQ0luZm8uZ2V0TmV4dFN0YWNrT2Zmc2V0KCk7CisgIC8vIEFsaWduIHN0YWNrIHNwZWNpYWxseSBmb3IgdGFpbCBjYWxscy4KKyAgaWYgKEZ1bmNJc01hZGVUYWlsQ2FsbFNhZmUoQ2FsbENvbnYpKQorICAgIFN0YWNrU2l6ZSA9IEdldEFsaWduZWRBcmd1bWVudFN0YWNrU2l6ZShTdGFja1NpemUsIERBRyk7CisKKyAgLy8gSWYgdGhlIGZ1bmN0aW9uIHRha2VzIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIG1ha2UgYSBmcmFtZSBpbmRleCBmb3IKKyAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCB2YXJhcmcgdmFsdWUuLi4gZm9yIGV4cGFuc2lvbiBvZiBsbHZtLnZhX3N0YXJ0LgorICBpZiAoaXNWYXJBcmcpIHsKKyAgICBpZiAoSXM2NEJpdCB8fCAoQ2FsbENvbnYgIT0gQ2FsbGluZ0NvbnY6Olg4Nl9GYXN0Q2FsbCAmJgorICAgICAgICAgICAgICAgICAgICBDYWxsQ29udiAhPSBDYWxsaW5nQ29udjo6WDg2X1RoaXNDYWxsKSkgeworICAgICAgRnVuY0luZm8tPnNldFZhckFyZ3NGcmFtZUluZGV4KE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoMSwgU3RhY2tTaXplLHRydWUpKTsKKyAgICB9CisgICAgaWYgKElzNjRCaXQpIHsKKyAgICAgIHVuc2lnbmVkIFRvdGFsTnVtSW50UmVncyA9IDAsIFRvdGFsTnVtWE1NUmVncyA9IDA7CisKKyAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IGF1dG9nZW5lcmF0ZSB0aGVzZSBhcnJheXMKKyAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBHUFI2NEFyZ1JlZ3NXaW42NFtdID0geworICAgICAgICBYODY6OlJDWCwgWDg2OjpSRFgsIFg4Njo6UjgsICBYODY6OlI5CisgICAgICB9OworICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFhNTUFyZ1JlZ3NXaW42NFtdID0geworICAgICAgICBYODY6OlhNTTAsIFg4Njo6WE1NMSwgWDg2OjpYTU0yLCBYODY6OlhNTTMKKyAgICAgIH07CisgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR1BSNjRBcmdSZWdzNjRCaXRbXSA9IHsKKyAgICAgICAgWDg2OjpSREksIFg4Njo6UlNJLCBYODY6OlJEWCwgWDg2OjpSQ1gsIFg4Njo6UjgsIFg4Njo6UjkKKyAgICAgIH07CisgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgWE1NQXJnUmVnczY0Qml0W10gPSB7CisgICAgICAgIFg4Njo6WE1NMCwgWDg2OjpYTU0xLCBYODY6OlhNTTIsIFg4Njo6WE1NMywKKyAgICAgICAgWDg2OjpYTU00LCBYODY6OlhNTTUsIFg4Njo6WE1NNiwgWDg2OjpYTU03CisgICAgICB9OworICAgICAgY29uc3QgdW5zaWduZWQgKkdQUjY0QXJnUmVncywgKlhNTUFyZ1JlZ3M7CisKKyAgICAgIGlmIChJc1dpbjY0KSB7CisgICAgICAgIFRvdGFsTnVtSW50UmVncyA9IDQ7IFRvdGFsTnVtWE1NUmVncyA9IDQ7CisgICAgICAgIEdQUjY0QXJnUmVncyA9IEdQUjY0QXJnUmVnc1dpbjY0OworICAgICAgICBYTU1BcmdSZWdzID0gWE1NQXJnUmVnc1dpbjY0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVG90YWxOdW1JbnRSZWdzID0gNjsgVG90YWxOdW1YTU1SZWdzID0gODsKKyAgICAgICAgR1BSNjRBcmdSZWdzID0gR1BSNjRBcmdSZWdzNjRCaXQ7CisgICAgICAgIFhNTUFyZ1JlZ3MgPSBYTU1BcmdSZWdzNjRCaXQ7CisgICAgICB9CisgICAgICB1bnNpZ25lZCBOdW1JbnRSZWdzID0gQ0NJbmZvLmdldEZpcnN0VW5hbGxvY2F0ZWQoR1BSNjRBcmdSZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsTnVtSW50UmVncyk7CisgICAgICB1bnNpZ25lZCBOdW1YTU1SZWdzID0gQ0NJbmZvLmdldEZpcnN0VW5hbGxvY2F0ZWQoWE1NQXJnUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbE51bVhNTVJlZ3MpOworCisgICAgICBib29sIE5vSW1wbGljaXRGbG9hdE9wcyA9IEZuLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpOb0ltcGxpY2l0RmxvYXQpOworICAgICAgYXNzZXJ0KCEoTnVtWE1NUmVncyAmJiAhU3VidGFyZ2V0LT5oYXNTU0UxKCkpICYmCisgICAgICAgICAgICAgIlNTRSByZWdpc3RlciBjYW5ub3QgYmUgdXNlZCB3aGVuIFNTRSBpcyBkaXNhYmxlZCEiKTsKKyAgICAgIGFzc2VydCghKE51bVhNTVJlZ3MgJiYgVXNlU29mdEZsb2F0ICYmIE5vSW1wbGljaXRGbG9hdE9wcykgJiYKKyAgICAgICAgICAgICAiU1NFIHJlZ2lzdGVyIGNhbm5vdCBiZSB1c2VkIHdoZW4gU1NFIGlzIGRpc2FibGVkISIpOworICAgICAgaWYgKFVzZVNvZnRGbG9hdCB8fCBOb0ltcGxpY2l0RmxvYXRPcHMgfHwgIVN1YnRhcmdldC0+aGFzU1NFMSgpKQorICAgICAgICAvLyBLZXJuZWwgbW9kZSBhc2tzIGZvciBTU0UgdG8gYmUgZGlzYWJsZWQsIHNvIGRvbid0IHB1c2ggdGhlbQorICAgICAgICAvLyBvbiB0aGUgc3RhY2suCisgICAgICAgIFRvdGFsTnVtWE1NUmVncyA9IDA7CisKKyAgICAgIC8vIEZvciBYODYtNjQsIGlmIHRoZXJlIGFyZSB2YXJhcmcgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgdmlhCisgICAgICAvLyByZWdpc3RlcnMsIHRoZW4gd2UgbXVzdCBzdG9yZSB0aGVtIHRvIHRoZWlyIHNwb3RzIG9uIHRoZSBzdGFjayBzbyB0aGV5CisgICAgICAvLyBtYXkgYmUgbG9hZGVkIGJ5IGRlZmVyZW5jaW5nIHRoZSByZXN1bHQgb2YgdmFfbmV4dC4KKyAgICAgIEZ1bmNJbmZvLT5zZXRWYXJBcmdzR1BPZmZzZXQoTnVtSW50UmVncyAqIDgpOworICAgICAgRnVuY0luZm8tPnNldFZhckFyZ3NGUE9mZnNldChUb3RhbE51bUludFJlZ3MgKiA4ICsgTnVtWE1NUmVncyAqIDE2KTsKKyAgICAgIEZ1bmNJbmZvLT5zZXRSZWdTYXZlRnJhbWVJbmRleCgKKyAgICAgICAgTUZJLT5DcmVhdGVTdGFja09iamVjdChUb3RhbE51bUludFJlZ3MgKiA4ICsgVG90YWxOdW1YTU1SZWdzICogMTYsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisKKyAgICAgIC8vIFN0b3JlIHRoZSBpbnRlZ2VyIHBhcmFtZXRlciByZWdpc3RlcnMuCisgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBNZW1PcHM7CisgICAgICBTRFZhbHVlIFJTRklOID0gREFHLmdldEZyYW1lSW5kZXgoRnVuY0luZm8tPmdldFJlZ1NhdmVGcmFtZUluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCkpOworICAgICAgdW5zaWduZWQgT2Zmc2V0ID0gRnVuY0luZm8tPmdldFZhckFyZ3NHUE9mZnNldCgpOworICAgICAgZm9yICg7IE51bUludFJlZ3MgIT0gVG90YWxOdW1JbnRSZWdzOyArK051bUludFJlZ3MpIHsKKyAgICAgICAgU0RWYWx1ZSBGSU4gPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIGdldFBvaW50ZXJUeSgpLCBSU0ZJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoT2Zmc2V0KSk7CisgICAgICAgIHVuc2lnbmVkIFZSZWcgPSBNRi5hZGRMaXZlSW4oR1BSNjRBcmdSZWdzW051bUludFJlZ3NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MpOworICAgICAgICBTRFZhbHVlIFZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIE1WVDo6aTY0KTsKKyAgICAgICAgU0RWYWx1ZSBTdG9yZSA9CisgICAgICAgICAgREFHLmdldFN0b3JlKFZhbC5nZXRWYWx1ZSgxKSwgZGwsIFZhbCwgRklOLAorICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jSW5mby0+Z2V0UmVnU2F2ZUZyYW1lSW5kZXgoKSksCisgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgICAgTWVtT3BzLnB1c2hfYmFjayhTdG9yZSk7CisgICAgICAgIE9mZnNldCArPSA4OworICAgICAgfQorCisgICAgICBpZiAoVG90YWxOdW1YTU1SZWdzICE9IDAgJiYgTnVtWE1NUmVncyAhPSBUb3RhbE51bVhNTVJlZ3MpIHsKKyAgICAgICAgLy8gTm93IHN0b3JlIHRoZSBYTU0gKGZwICsgdmVjdG9yKSBwYXJhbWV0ZXIgcmVnaXN0ZXJzLgorICAgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxMT4gU2F2ZVhNTU9wczsKKyAgICAgICAgU2F2ZVhNTU9wcy5wdXNoX2JhY2soQ2hhaW4pOworCisgICAgICAgIHVuc2lnbmVkIEFMID0gTUYuYWRkTGl2ZUluKFg4Njo6QUwsIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcyk7CisgICAgICAgIFNEVmFsdWUgQUxWYWwgPSBEQUcuZ2V0Q29weUZyb21SZWcoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwgQUwsIE1WVDo6aTgpOworICAgICAgICBTYXZlWE1NT3BzLnB1c2hfYmFjayhBTFZhbCk7CisKKyAgICAgICAgU2F2ZVhNTU9wcy5wdXNoX2JhY2soREFHLmdldEludFB0ckNvbnN0YW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmNJbmZvLT5nZXRSZWdTYXZlRnJhbWVJbmRleCgpKSk7CisgICAgICAgIFNhdmVYTU1PcHMucHVzaF9iYWNrKERBRy5nZXRJbnRQdHJDb25zdGFudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jSW5mby0+Z2V0VmFyQXJnc0ZQT2Zmc2V0KCkpKTsKKworICAgICAgICBmb3IgKDsgTnVtWE1NUmVncyAhPSBUb3RhbE51bVhNTVJlZ3M7ICsrTnVtWE1NUmVncykgeworICAgICAgICAgIHVuc2lnbmVkIFZSZWcgPSBNRi5hZGRMaXZlSW4oWE1NQXJnUmVnc1tOdW1YTU1SZWdzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzKTsKKyAgICAgICAgICBTRFZhbHVlIFZhbCA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIE1WVDo6djRmMzIpOworICAgICAgICAgIFNhdmVYTU1PcHMucHVzaF9iYWNrKFZhbCk7CisgICAgICAgIH0KKyAgICAgICAgTWVtT3BzLnB1c2hfYmFjayhEQUcuZ2V0Tm9kZShYODZJU0Q6OlZBU1RBUlRfU0FWRV9YTU1fUkVHUywgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2F2ZVhNTU9wc1swXSwgU2F2ZVhNTU9wcy5zaXplKCkpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFNZW1PcHMuZW1wdHkoKSkKKyAgICAgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtT3BzWzBdLCBNZW1PcHMuc2l6ZSgpKTsKKyAgICB9CisgIH0KKworICAvLyBTb21lIENDcyBuZWVkIGNhbGxlZSBwb3AuCisgIGlmIChTdWJ0YXJnZXQtPklzQ2FsbGVlUG9wKGlzVmFyQXJnLCBDYWxsQ29udikpIHsKKyAgICBGdW5jSW5mby0+c2V0Qnl0ZXNUb1BvcE9uUmV0dXJuKFN0YWNrU2l6ZSk7IC8vIENhbGxlZSBwb3BzIGV2ZXJ5dGhpbmcuCisgIH0gZWxzZSB7CisgICAgRnVuY0luZm8tPnNldEJ5dGVzVG9Qb3BPblJldHVybigwKTsgLy8gQ2FsbGVlIHBvcHMgbm90aGluZy4KKyAgICAvLyBJZiB0aGlzIGlzIGFuIHNyZXQgZnVuY3Rpb24sIHRoZSByZXR1cm4gc2hvdWxkIHBvcCB0aGUgaGlkZGVuIHBvaW50ZXIuCisgICAgaWYgKCFJczY0Qml0ICYmICFJc1RhaWxDYWxsQ29udmVudGlvbihDYWxsQ29udikgJiYgQXJnc0FyZVN0cnVjdFJldHVybihJbnMpKQorICAgICAgRnVuY0luZm8tPnNldEJ5dGVzVG9Qb3BPblJldHVybig0KTsKKyAgfQorCisgIGlmICghSXM2NEJpdCkgeworICAgIC8vIFJlZ1NhdmVGcmFtZUluZGV4IGlzIFg4Ni02NCBvbmx5LgorICAgIEZ1bmNJbmZvLT5zZXRSZWdTYXZlRnJhbWVJbmRleCgweEFBQUFBQUEpOworICAgIGlmIChDYWxsQ29udiA9PSBDYWxsaW5nQ29udjo6WDg2X0Zhc3RDYWxsIHx8CisgICAgICAgIENhbGxDb252ID09IENhbGxpbmdDb252OjpYODZfVGhpc0NhbGwpCisgICAgICAvLyBmYXN0Y2MgZnVuY3Rpb25zIGNhbid0IGhhdmUgdmFyYXJncy4KKyAgICAgIEZ1bmNJbmZvLT5zZXRWYXJBcmdzRnJhbWVJbmRleCgweEFBQUFBQUEpOworICB9CisKKyAgcmV0dXJuIENoYWluOworfQorCitTRFZhbHVlCitYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJNZW1PcENhbGxUbyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTdGFja1B0ciwgU0RWYWx1ZSBBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDQ1ZhbEFzc2lnbiAmVkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MpIGNvbnN0IHsKKyAgY29uc3QgdW5zaWduZWQgRmlyc3RTdGFja0FyZ09mZnNldCA9IChTdWJ0YXJnZXQtPmlzVGFyZ2V0V2luNjQoKSA/IDMyIDogMCk7CisgIHVuc2lnbmVkIExvY01lbU9mZnNldCA9IEZpcnN0U3RhY2tBcmdPZmZzZXQgKyBWQS5nZXRMb2NNZW1PZmZzZXQoKTsKKyAgU0RWYWx1ZSBQdHJPZmYgPSBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoTG9jTWVtT2Zmc2V0KTsKKyAgUHRyT2ZmID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwgU3RhY2tQdHIsIFB0ck9mZik7CisgIGlmIChGbGFncy5pc0J5VmFsKCkpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ29weU9mQnlWYWxBcmd1bWVudChBcmcsIFB0ck9mZiwgQ2hhaW4sIEZsYWdzLCBEQUcsIGRsKTsKKyAgfQorICByZXR1cm4gREFHLmdldFN0b3JlKENoYWluLCBkbCwgQXJnLCBQdHJPZmYsCisgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldFN0YWNrKCksIExvY01lbU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworfQorCisvLy8gRW1pdFRhaWxDYWxsTG9hZFJldEFkZHIgLSBFbWl0IGEgbG9hZCBvZiByZXR1cm4gYWRkcmVzcyBpZiB0YWlsIGNhbGwKKy8vLyBvcHRpbWl6YXRpb24gaXMgcGVyZm9ybWVkIGFuZCBpdCBpcyByZXF1aXJlZC4KK1NEVmFsdWUKK1g4NlRhcmdldExvd2VyaW5nOjpFbWl0VGFpbENhbGxMb2FkUmV0QWRkcihTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPdXRSZXRBZGRyLCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNUYWlsQ2FsbCwgYm9vbCBJczY0Qml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGUERpZmYsIERlYnVnTG9jIGRsKSBjb25zdCB7CisgIC8vIEFkanVzdCB0aGUgUmV0dXJuIGFkZHJlc3Mgc3RhY2sgc2xvdC4KKyAgRVZUIFZUID0gZ2V0UG9pbnRlclR5KCk7CisgIE91dFJldEFkZHIgPSBnZXRSZXR1cm5BZGRyZXNzRnJhbWVJbmRleChEQUcpOworCisgIC8vIExvYWQgdGhlICJvbGQiIFJldHVybiBhZGRyZXNzLgorICBPdXRSZXRBZGRyID0gREFHLmdldExvYWQoVlQsIGRsLCBDaGFpbiwgT3V0UmV0QWRkciwgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgcmV0dXJuIFNEVmFsdWUoT3V0UmV0QWRkci5nZXROb2RlKCksIDEpOworfQorCisvLy8gRW1pdFRhaWxDYWxsU3RvcmVSZXRBZGRyIC0gRW1pdCBhIHN0b3JlIG9mIHRoZSByZXR1cm4gYWRyZXNzIGlmIHRhaWwgY2FsbAorLy8vIG9wdGltaXphdGlvbiBpcyBwZXJmb3JtZWQgYW5kIGl0IGlzIHJlcXVpcmVkIChGUERpZmYhPTApLgorc3RhdGljIFNEVmFsdWUKK0VtaXRUYWlsQ2FsbFN0b3JlUmV0QWRkcihTZWxlY3Rpb25EQUcgJiBEQUcsIE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBSZXRBZGRyRnJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJczY0Qml0LCBpbnQgRlBEaWZmLCBEZWJ1Z0xvYyBkbCkgeworICAvLyBTdG9yZSB0aGUgcmV0dXJuIGFkZHJlc3MgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YWNrIHNsb3QuCisgIGlmICghRlBEaWZmKSByZXR1cm4gQ2hhaW47CisgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHN0YWNrIHNsb3QgZm9yIHRoZSByZXR1cm4gYWRkcmVzcy4KKyAgaW50IFNsb3RTaXplID0gSXM2NEJpdCA/IDggOiA0OworICBpbnQgTmV3UmV0dXJuQWRkckZJID0KKyAgICBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlRml4ZWRPYmplY3QoU2xvdFNpemUsIEZQRGlmZi1TbG90U2l6ZSwgZmFsc2UpOworICBFVlQgVlQgPSBJczY0Qml0ID8gTVZUOjppNjQgOiBNVlQ6OmkzMjsKKyAgU0RWYWx1ZSBOZXdSZXRBZGRyRnJJZHggPSBEQUcuZ2V0RnJhbWVJbmRleChOZXdSZXR1cm5BZGRyRkksIFZUKTsKKyAgQ2hhaW4gPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBSZXRBZGRyRnJJZHgsIE5ld1JldEFkZHJGcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soTmV3UmV0dXJuQWRkckZJKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgcmV0dXJuIENoYWluOworfQorCitTRFZhbHVlCitYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJDYWxsKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgYm9vbCBJczY0Qml0ICAgICAgICA9IFN1YnRhcmdldC0+aXM2NEJpdCgpOworICBib29sIElzU3RydWN0UmV0ICAgID0gQ2FsbElzU3RydWN0UmV0dXJuKE91dHMpOworICBib29sIElzU2liY2FsbCAgICAgID0gZmFsc2U7CisKKyAgaWYgKGlzVGFpbENhbGwpIHsKKyAgICAvLyBDaGVjayBpZiBpdCdzIHJlYWxseSBwb3NzaWJsZSB0byBkbyBhIHRhaWwgY2FsbC4KKyAgICBpc1RhaWxDYWxsID0gSXNFbGlnaWJsZUZvclRhaWxDYWxsT3B0aW1pemF0aW9uKENhbGxlZSwgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgIGlzVmFyQXJnLCBJc1N0cnVjdFJldCwgTUYuZ2V0RnVuY3Rpb24oKS0+aGFzU3RydWN0UmV0QXR0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cywgT3V0VmFscywgSW5zLCBEQUcpOworCisgICAgLy8gU2liY2FsbHMgYXJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGFpbGNhbGxzIHdoaWNoIGRvIG5vdCByZXF1aXJlCisgICAgLy8gQUJJIGNoYW5nZXMuCisgICAgaWYgKCFHdWFyYW50ZWVkVGFpbENhbGxPcHQgJiYgaXNUYWlsQ2FsbCkKKyAgICAgIElzU2liY2FsbCA9IHRydWU7CisKKyAgICBpZiAoaXNUYWlsQ2FsbCkKKyAgICAgICsrTnVtVGFpbENhbGxzOworICB9CisKKyAgYXNzZXJ0KCEoaXNWYXJBcmcgJiYgSXNUYWlsQ2FsbENvbnZlbnRpb24oQ2FsbENvbnYpKSAmJgorICAgICAgICAgIlZhciBhcmdzIG5vdCBzdXBwb3J0ZWQgd2l0aCBjYWxsaW5nIGNvbnZlbnRpb24gZmFzdGNjIG9yIGdoYyIpOworCisgIC8vIEFuYWx5emUgb3BlcmFuZHMgb2YgdGhlIGNhbGwsIGFzc2lnbmluZyBsb2NhdGlvbnMgdG8gZWFjaCBvcGVyYW5kLgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IEFyZ0xvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICBBcmdMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisgIENDSW5mby5BbmFseXplQ2FsbE9wZXJhbmRzKE91dHMsIENDQXNzaWduRm5Gb3JOb2RlKENhbGxDb252KSk7CisKKyAgLy8gR2V0IGEgY291bnQgb2YgaG93IG1hbnkgYnl0ZXMgYXJlIHRvIGJlIHB1c2hlZCBvbiB0aGUgc3RhY2suCisgIHVuc2lnbmVkIE51bUJ5dGVzID0gQ0NJbmZvLmdldE5leHRTdGFja09mZnNldCgpOworICBpZiAoSXNTaWJjYWxsKQorICAgIC8vIFRoaXMgaXMgYSBzaWJjYWxsLiBUaGUgbWVtb3J5IG9wZXJhbmRzIGFyZSBhdmFpbGFibGUgaW4gY2FsbGVyJ3MKKyAgICAvLyBvd24gY2FsbGVyJ3Mgc3RhY2suCisgICAgTnVtQnl0ZXMgPSAwOworICBlbHNlIGlmIChHdWFyYW50ZWVkVGFpbENhbGxPcHQgJiYgSXNUYWlsQ2FsbENvbnZlbnRpb24oQ2FsbENvbnYpKQorICAgIE51bUJ5dGVzID0gR2V0QWxpZ25lZEFyZ3VtZW50U3RhY2tTaXplKE51bUJ5dGVzLCBEQUcpOworCisgIGludCBGUERpZmYgPSAwOworICBpZiAoaXNUYWlsQ2FsbCAmJiAhSXNTaWJjYWxsKSB7CisgICAgLy8gTG93ZXIgYXJndW1lbnRzIGF0IGZwIC0gc3RhY2tvZmZzZXQgKyBmcGRpZmYuCisgICAgdW5zaWduZWQgTnVtQnl0ZXNDYWxsZXJQdXNoZWQgPQorICAgICAgTUYuZ2V0SW5mbzxYODZNYWNoaW5lRnVuY3Rpb25JbmZvPigpLT5nZXRCeXRlc1RvUG9wT25SZXR1cm4oKTsKKyAgICBGUERpZmYgPSBOdW1CeXRlc0NhbGxlclB1c2hlZCAtIE51bUJ5dGVzOworCisgICAgLy8gU2V0IHRoZSBkZWx0YSBvZiBtb3ZlbWVudCBvZiB0aGUgcmV0dXJuYWRkciBzdGFja3Nsb3QuCisgICAgLy8gQnV0IG9ubHkgc2V0IGlmIGRlbHRhIGlzIGdyZWF0ZXIgdGhhbiBwcmV2aW91cyBkZWx0YS4KKyAgICBpZiAoRlBEaWZmIDwgKE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKS0+Z2V0VENSZXR1cm5BZGRyRGVsdGEoKSkpCisgICAgICBNRi5nZXRJbmZvPFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8+KCktPnNldFRDUmV0dXJuQWRkckRlbHRhKEZQRGlmZik7CisgIH0KKworICBpZiAoIUlzU2liY2FsbCkKKyAgICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX1NUQVJUKENoYWluLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoTnVtQnl0ZXMsIHRydWUpKTsKKworICBTRFZhbHVlIFJldEFkZHJGcklkeDsKKyAgLy8gTG9hZCByZXR1cm4gYWRyZXNzIGZvciB0YWlsIGNhbGxzLgorICBpZiAoaXNUYWlsQ2FsbCAmJiBGUERpZmYpCisgICAgQ2hhaW4gPSBFbWl0VGFpbENhbGxMb2FkUmV0QWRkcihEQUcsIFJldEFkZHJGcklkeCwgQ2hhaW4sIGlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJczY0Qml0LCBGUERpZmYsIGRsKTsKKworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIFNEVmFsdWU+LCA4PiBSZWdzVG9QYXNzOworICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBNZW1PcENoYWluczsKKyAgU0RWYWx1ZSBTdGFja1B0cjsKKworICAvLyBXYWxrIHRoZSByZWdpc3Rlci9tZW1sb2MgYXNzaWdubWVudHMsIGluc2VydGluZyBjb3BpZXMvbG9hZHMuICBJbiB0aGUgY2FzZQorICAvLyBvZiB0YWlsIGNhbGwgb3B0aW1pemF0aW9uIGFyZ3VtZW50cyBhcmUgaGFuZGxlIGxhdGVyLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tpXTsKKyAgICBFVlQgUmVnVlQgPSBWQS5nZXRMb2NWVCgpOworICAgIFNEVmFsdWUgQXJnID0gT3V0VmFsc1tpXTsKKyAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MgPSBPdXRzW2ldLkZsYWdzOworICAgIGJvb2wgaXNCeVZhbCA9IEZsYWdzLmlzQnlWYWwoKTsKKworICAgIC8vIFByb21vdGUgdGhlIHZhbHVlIGlmIG5lZWRlZC4KKyAgICBzd2l0Y2ggKFZBLmdldExvY0luZm8oKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbG9jIGluZm8hIik7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6RnVsbDogYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6U0V4dDoKKyAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkQsIGRsLCBSZWdWVCwgQXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OlpFeHQ6CisgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwgUmVnVlQsIEFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENDVmFsQXNzaWduOjpBRXh0OgorICAgICAgaWYgKFJlZ1ZULmlzVmVjdG9yKCkgJiYgUmVnVlQuZ2V0U2l6ZUluQml0cygpID09IDEyOCkgeworICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IHBhc3NpbmcgTU1YIHZhbHVlcyBpbiBYTU0gcmVnaXN0ZXJzLgorICAgICAgICBBcmcgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjppNjQsIEFyZyk7CisgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIE1WVDo6djJpNjQsIEFyZyk7CisgICAgICAgIEFyZyA9IGdldE1PVkwoREFHLCBkbCwgTVZUOjp2Mmk2NCwgREFHLmdldFVOREVGKE1WVDo6djJpNjQpLCBBcmcpOworICAgICAgfSBlbHNlCisgICAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIFJlZ1ZULCBBcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6QkN2dDoKKyAgICAgIEFyZyA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBSZWdWVCwgQXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NWYWxBc3NpZ246OkluZGlyZWN0OiB7CisgICAgICAvLyBTdG9yZSB0aGUgYXJndW1lbnQuCisgICAgICBTRFZhbHVlIFNwaWxsU2xvdCA9IERBRy5DcmVhdGVTdGFja1RlbXBvcmFyeShWQS5nZXRWYWxWVCgpKTsKKyAgICAgIGludCBGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oU3BpbGxTbG90KS0+Z2V0SW5kZXgoKTsKKyAgICAgIENoYWluID0gREFHLmdldFN0b3JlKENoYWluLCBkbCwgQXJnLCBTcGlsbFNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhGSSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgQXJnID0gU3BpbGxTbG90OworICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgIGlmIChWQS5pc1JlZ0xvYygpKSB7CisgICAgICBSZWdzVG9QYXNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWQS5nZXRMb2NSZWcoKSwgQXJnKSk7CisgICAgfSBlbHNlIGlmICghSXNTaWJjYWxsICYmICghaXNUYWlsQ2FsbCB8fCBpc0J5VmFsKSkgeworICAgICAgYXNzZXJ0KFZBLmlzTWVtTG9jKCkpOworICAgICAgaWYgKFN0YWNrUHRyLmdldE5vZGUoKSA9PSAwKQorICAgICAgICBTdGFja1B0ciA9IERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFg4NlN0YWNrUHRyLCBnZXRQb2ludGVyVHkoKSk7CisgICAgICBNZW1PcENoYWlucy5wdXNoX2JhY2soTG93ZXJNZW1PcENhbGxUbyhDaGFpbiwgU3RhY2tQdHIsIEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsLCBEQUcsIFZBLCBGbGFncykpOworICAgIH0KKyAgfQorCisgIGlmICghTWVtT3BDaGFpbnMuZW1wdHkoKSkKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJk1lbU9wQ2hhaW5zWzBdLCBNZW1PcENoYWlucy5zaXplKCkpOworCisgIC8vIEJ1aWxkIGEgc2VxdWVuY2Ugb2YgY29weS10by1yZWcgbm9kZXMgY2hhaW5lZCB0b2dldGhlciB3aXRoIHRva2VuIGNoYWluCisgIC8vIGFuZCBmbGFnIG9wZXJhbmRzIHdoaWNoIGNvcHkgdGhlIG91dGdvaW5nIGFyZ3MgaW50byByZWdpc3RlcnMuCisgIFNEVmFsdWUgSW5GbGFnOworICAvLyBUYWlsIGNhbGwgYnl2YWwgbG93ZXJpbmcgbWlnaHQgb3ZlcndyaXRlIGFyZ3VtZW50IHJlZ2lzdGVycyBzbyBpbiBjYXNlIG9mCisgIC8vIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24gdGhlIGNvcGllcyB0byByZWdpc3RlcnMgYXJlIGxvd2VyZWQgbGF0ZXIuCisgIGlmICghaXNUYWlsQ2FsbCkKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBDaGFpbiA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBSZWdzVG9QYXNzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3NUb1Bhc3NbaV0uc2Vjb25kLCBJbkZsYWcpOworICAgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgICAgfQorCisgIGlmIChTdWJ0YXJnZXQtPmlzUElDU3R5bGVHT1QoKSkgeworICAgIC8vIEVMRiAvIFBJQyByZXF1aXJlcyBHT1QgaW4gdGhlIEVCWCByZWdpc3RlciBiZWZvcmUgZnVuY3Rpb24gY2FsbHMgdmlhIFBMVAorICAgIC8vIEdPVCBwb2ludGVyLgorICAgIGlmICghaXNUYWlsQ2FsbCkgeworICAgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgWDg2OjpFQlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoWDg2SVNEOjpHbG9iYWxCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jKCksIGdldFBvaW50ZXJUeSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkZsYWcpOworICAgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIElmIHdlIGFyZSB0YWlsIGNhbGxpbmcgYW5kIGdlbmVyYXRpbmcgUElDL0dPVCBzdHlsZSBjb2RlIGxvYWQgdGhlCisgICAgICAvLyBhZGRyZXNzIG9mIHRoZSBjYWxsZWUgaW50byBFQ1guIFRoZSB2YWx1ZSBpbiBlY3ggaXMgdXNlZCBhcyB0YXJnZXQgb2YKKyAgICAgIC8vIHRoZSB0YWlsIGp1bXAuIFRoaXMgaXMgZG9uZSB0byBjaXJjdW12ZW50IHRoZSBlYngvY2FsbGVlLXNhdmVkIHByb2JsZW0KKyAgICAgIC8vIGZvciB0YWlsIGNhbGxzIG9uIFBJQy9HT1QgYXJjaGl0ZWN0dXJlcy4gTm9ybWFsbHkgd2Ugd291bGQganVzdCBwdXQgdGhlCisgICAgICAvLyBhZGRyZXNzIG9mIEdPVCBpbnRvIGVieCBhbmQgdGhlbiBjYWxsIHRhcmdldEBQTFQuIEJ1dCBmb3IgdGFpbCBjYWxscworICAgICAgLy8gZWJ4IHdvdWxkIGJlIHJlc3RvcmVkIChzaW5jZSBlYnggaXMgY2FsbGVlIHNhdmVkKSBiZWZvcmUganVtcGluZyB0byB0aGUKKyAgICAgIC8vIHRhcmdldEBQTFQuCisKKyAgICAgIC8vIE5vdGU6IFRoZSBhY3R1YWwgbW92aW5nIHRvIEVDWCBpcyBkb25lIGZ1cnRoZXIgZG93bi4KKyAgICAgIEdsb2JhbEFkZHJlc3NTRE5vZGUgKkcgPSBkeW5fY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihDYWxsZWUpOworICAgICAgaWYgKEcgJiYgIUctPmdldEdsb2JhbCgpLT5oYXNIaWRkZW5WaXNpYmlsaXR5KCkgJiYKKyAgICAgICAgICAhRy0+Z2V0R2xvYmFsKCktPmhhc1Byb3RlY3RlZFZpc2liaWxpdHkoKSkKKyAgICAgICAgQ2FsbGVlID0gTG93ZXJHbG9iYWxBZGRyZXNzKENhbGxlZSwgREFHKTsKKyAgICAgIGVsc2UgaWYgKGlzYTxFeHRlcm5hbFN5bWJvbFNETm9kZT4oQ2FsbGVlKSkKKyAgICAgICAgQ2FsbGVlID0gTG93ZXJFeHRlcm5hbFN5bWJvbChDYWxsZWUsIERBRyk7CisgICAgfQorICB9CisKKyAgaWYgKElzNjRCaXQgJiYgaXNWYXJBcmcgJiYgIVN1YnRhcmdldC0+aXNUYXJnZXRXaW42NCgpKSB7CisgICAgLy8gRnJvbSBBTUQ2NCBBQkkgZG9jdW1lbnQ6CisgICAgLy8gRm9yIGNhbGxzIHRoYXQgbWF5IGNhbGwgZnVuY3Rpb25zIHRoYXQgdXNlIHZhcmFyZ3Mgb3Igc3RkYXJncworICAgIC8vIChwcm90b3R5cGUtbGVzcyBjYWxscyBvciBjYWxscyB0byBmdW5jdGlvbnMgY29udGFpbmluZyBlbGxpcHNpcyAoLi4uKSBpbgorICAgIC8vIHRoZSBkZWNsYXJhdGlvbikgJWFsIGlzIHVzZWQgYXMgaGlkZGVuIGFyZ3VtZW50IHRvIHNwZWNpZnkgdGhlIG51bWJlcgorICAgIC8vIG9mIFNTRSByZWdpc3RlcnMgdXNlZC4gVGhlIGNvbnRlbnRzIG9mICVhbCBkbyBub3QgbmVlZCB0byBtYXRjaCBleGFjdGx5CisgICAgLy8gdGhlIG51bWJlciBvZiByZWdpc3RlcnMsIGJ1dCBtdXN0IGJlIGFuIHVib3VuZCBvbiB0aGUgbnVtYmVyIG9mIFNTRQorICAgIC8vIHJlZ2lzdGVycyB1c2VkIGFuZCBpcyBpbiB0aGUgcmFuZ2UgMCAtIDggaW5jbHVzaXZlLgorCisgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBYTU0gcmVnaXN0ZXJzIGFsbG9jYXRlZC4KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgWE1NQXJnUmVnc1tdID0geworICAgICAgWDg2OjpYTU0wLCBYODY6OlhNTTEsIFg4Njo6WE1NMiwgWDg2OjpYTU0zLAorICAgICAgWDg2OjpYTU00LCBYODY6OlhNTTUsIFg4Njo6WE1NNiwgWDg2OjpYTU03CisgICAgfTsKKyAgICB1bnNpZ25lZCBOdW1YTU1SZWdzID0gQ0NJbmZvLmdldEZpcnN0VW5hbGxvY2F0ZWQoWE1NQXJnUmVncywgOCk7CisgICAgYXNzZXJ0KChTdWJ0YXJnZXQtPmhhc1NTRTEoKSB8fCAhTnVtWE1NUmVncykKKyAgICAgICAgICAgJiYgIlNTRSByZWdpc3RlcnMgY2Fubm90IGJlIHVzZWQgd2hlbiBTU0UgaXMgZGlzYWJsZWQiKTsKKworICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFg4Njo6QUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOdW1YTU1SZWdzLCBNVlQ6Omk4KSwgSW5GbGFnKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisKKyAgLy8gRm9yIHRhaWwgY2FsbHMgbG93ZXIgdGhlIGFyZ3VtZW50cyB0byB0aGUgJ3JlYWwnIHN0YWNrIHNsb3QuCisgIGlmIChpc1RhaWxDYWxsKSB7CisgICAgLy8gRm9yY2UgYWxsIHRoZSBpbmNvbWluZyBzdGFjayBhcmd1bWVudHMgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHN0YWNrCisgICAgLy8gYmVmb3JlIGFueSBuZXcgb3V0Z29pbmcgYXJndW1lbnRzIGFyZSBzdG9yZWQgdG8gdGhlIHN0YWNrLCBiZWNhdXNlIHRoZQorICAgIC8vIG91dGdvaW5nIHN0YWNrIHNsb3RzIG1heSBhbGlhcyB0aGUgaW5jb21pbmcgYXJndW1lbnQgc3RhY2sgc2xvdHMsIGFuZAorICAgIC8vIHRoZSBhbGlhcyBpc24ndCBvdGhlcndpc2UgZXhwbGljaXQuIFRoaXMgaXMgc2xpZ2h0bHkgbW9yZSBjb25zZXJ2YXRpdmUKKyAgICAvLyB0aGFuIG5lY2Vzc2FyeSwgYmVjYXVzZSBpdCBtZWFucyB0aGF0IGVhY2ggc3RvcmUgZWZmZWN0aXZlbHkgZGVwZW5kcworICAgIC8vIG9uIGV2ZXJ5IGFyZ3VtZW50IGluc3RlYWQgb2YganVzdCB0aG9zZSBhcmd1bWVudHMgaXQgd291bGQgY2xvYmJlci4KKyAgICBTRFZhbHVlIEFyZ0NoYWluID0gREFHLmdldFN0YWNrQXJndW1lbnRUb2tlbkZhY3RvcihDaGFpbik7CisKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBNZW1PcENoYWluczI7CisgICAgU0RWYWx1ZSBGSU47CisgICAgaW50IEZJID0gMDsKKyAgICAvLyBEbyBub3QgZmxhZyBwcmVjZWVkaW5nIGNvcHl0b3JlZyBzdHVmZiB0b2dldGhlciB3aXRoIHRoZSBmb2xsb3dpbmcgc3R1ZmYuCisgICAgSW5GbGFnID0gU0RWYWx1ZSgpOworICAgIGlmIChHdWFyYW50ZWVkVGFpbENhbGxPcHQpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tpXTsKKyAgICAgICAgaWYgKFZBLmlzUmVnTG9jKCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFzc2VydChWQS5pc01lbUxvYygpKTsKKyAgICAgICAgU0RWYWx1ZSBBcmcgPSBPdXRWYWxzW2ldOworICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MgPSBPdXRzW2ldLkZsYWdzOworICAgICAgICAvLyBDcmVhdGUgZnJhbWUgaW5kZXguCisgICAgICAgIGludDMyX3QgT2Zmc2V0ID0gVkEuZ2V0TG9jTWVtT2Zmc2V0KCkrRlBEaWZmOworICAgICAgICB1aW50MzJfdCBPcFNpemUgPSAoVkEuZ2V0TG9jVlQoKS5nZXRTaXplSW5CaXRzKCkrNykvODsKKyAgICAgICAgRkkgPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlRml4ZWRPYmplY3QoT3BTaXplLCBPZmZzZXQsIHRydWUpOworICAgICAgICBGSU4gPSBEQUcuZ2V0RnJhbWVJbmRleChGSSwgZ2V0UG9pbnRlclR5KCkpOworCisgICAgICAgIGlmIChGbGFncy5pc0J5VmFsKCkpIHsKKyAgICAgICAgICAvLyBDb3B5IHJlbGF0aXZlIHRvIGZyYW1lcG9pbnRlci4KKyAgICAgICAgICBTRFZhbHVlIFNvdXJjZSA9IERBRy5nZXRJbnRQdHJDb25zdGFudChWQS5nZXRMb2NNZW1PZmZzZXQoKSk7CisgICAgICAgICAgaWYgKFN0YWNrUHRyLmdldE5vZGUoKSA9PSAwKQorICAgICAgICAgICAgU3RhY2tQdHIgPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBYODZTdGFja1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBvaW50ZXJUeSgpKTsKKyAgICAgICAgICBTb3VyY2UgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIGdldFBvaW50ZXJUeSgpLCBTdGFja1B0ciwgU291cmNlKTsKKworICAgICAgICAgIE1lbU9wQ2hhaW5zMi5wdXNoX2JhY2soQ3JlYXRlQ29weU9mQnlWYWxBcmd1bWVudChTb3VyY2UsIEZJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLCBEQUcsIGRsKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gU3RvcmUgcmVsYXRpdmUgdG8gZnJhbWVwb2ludGVyLgorICAgICAgICAgIE1lbU9wQ2hhaW5zMi5wdXNoX2JhY2soCisgICAgICAgICAgICBEQUcuZ2V0U3RvcmUoQXJnQ2hhaW4sIGRsLCBBcmcsIEZJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhGSSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIU1lbU9wQ2hhaW5zMi5lbXB0eSgpKQorICAgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbU9wQ2hhaW5zMlswXSwgTWVtT3BDaGFpbnMyLnNpemUoKSk7CisKKyAgICAvLyBDb3B5IGFyZ3VtZW50cyB0byB0aGVpciByZWdpc3RlcnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3NUb1Bhc3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgUmVnc1RvUGFzc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdzVG9QYXNzW2ldLnNlY29uZCwgSW5GbGFnKTsKKyAgICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICAgIH0KKyAgICBJbkZsYWcgPVNEVmFsdWUoKTsKKworICAgIC8vIFN0b3JlIHRoZSByZXR1cm4gYWRkcmVzcyB0byB0aGUgYXBwcm9wcmlhdGUgc3RhY2sgc2xvdC4KKyAgICBDaGFpbiA9IEVtaXRUYWlsQ2FsbFN0b3JlUmV0QWRkcihEQUcsIE1GLCBDaGFpbiwgUmV0QWRkckZySWR4LCBJczY0Qml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQRGlmZiwgZGwpOworICB9CisKKyAgaWYgKGdldFRhcmdldE1hY2hpbmUoKS5nZXRDb2RlTW9kZWwoKSA9PSBDb2RlTW9kZWw6OkxhcmdlKSB7CisgICAgYXNzZXJ0KElzNjRCaXQgJiYgIkxhcmdlIGNvZGUgbW9kZWwgaXMgb25seSBsZWdhbCBpbiA2NC1iaXQgbW9kZS4iKTsKKyAgICAvLyBJbiB0aGUgNjQtYml0IGxhcmdlIGNvZGUgbW9kZWwsIHdlIGhhdmUgdG8gbWFrZSBhbGwgY2FsbHMKKyAgICAvLyB0aHJvdWdoIGEgcmVnaXN0ZXIsIHNpbmNlIHRoZSBjYWxsIGluc3RydWN0aW9uJ3MgMzItYml0CisgICAgLy8gcGMtcmVsYXRpdmUgb2Zmc2V0IG1heSBub3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHdob2xlCisgICAgLy8gYWRkcmVzcy4KKyAgfSBlbHNlIGlmIChHbG9iYWxBZGRyZXNzU0ROb2RlICpHID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oQ2FsbGVlKSkgeworICAgIC8vIElmIHRoZSBjYWxsZWUgaXMgYSBHbG9iYWxBZGRyZXNzIG5vZGUgKHF1aXRlIGNvbW1vbiwgZXZlcnkgZGlyZWN0IGNhbGwKKyAgICAvLyBpcykgdHVybiBpdCBpbnRvIGEgVGFyZ2V0R2xvYmFsQWRkcmVzcyBub2RlIHNvIHRoYXQgbGVnYWxpemUgZG9lc24ndCBoYWNrCisgICAgLy8gaXQuCisKKyAgICAvLyBXZSBzaG91bGQgdXNlIGV4dHJhIGxvYWQgZm9yIGRpcmVjdCBjYWxscyB0byBkbGxpbXBvcnRlZCBmdW5jdGlvbnMgaW4KKyAgICAvLyBub24tSklUIG1vZGUuCisgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gRy0+Z2V0R2xvYmFsKCk7CisgICAgaWYgKCFHVi0+aGFzRExMSW1wb3J0TGlua2FnZSgpKSB7CisgICAgICB1bnNpZ25lZCBjaGFyIE9wRmxhZ3MgPSAwOworCisgICAgICBpZiAoU3VidGFyZ2V0LT5pc1BJQ1N0eWxlU3R1YkFueSgpICYmCisgICAgICAgICAgICAgICAoR1YtPmlzRGVjbGFyYXRpb24oKSB8fCBHVi0+aXNXZWFrRm9yTGlua2VyKCkpICYmCisgICAgICAgICAgICAgICBTdWJ0YXJnZXQtPmdldERhcndpblZlcnMoKSA8IDkpIHsKKyAgICAgICAgLy8gUEMtcmVsYXRpdmUgcmVmZXJlbmNlcyB0byBleHRlcm5hbCBzeW1ib2xzIHNob3VsZCBnbyB0aHJvdWdoICRzdHViLAorICAgICAgICAvLyB1bmxlc3Mgd2UncmUgYnVpbGRpbmcgd2l0aCB0aGUgbGVvcGFyZCBsaW5rZXIgb3IgbGF0ZXIsIHdoaWNoCisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgc3ludGhlc2l6ZXMgdGhlc2Ugc3R1YnMuCisgICAgICAgIE9wRmxhZ3MgPSBYODZJSTo6TU9fREFSV0lOX1NUVUI7CisgICAgICB9CisKKyAgICAgIENhbGxlZSA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEdWLCBkbCwgZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHLT5nZXRPZmZzZXQoKSwgT3BGbGFncyk7CisgICAgfQorICB9IGVsc2UgaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpTID0gZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpIHsKKyAgICB1bnNpZ25lZCBjaGFyIE9wRmxhZ3MgPSAwOworCisgICAgaWYgKFN1YnRhcmdldC0+aXNQSUNTdHlsZVN0dWJBbnkoKSAmJgorICAgICAgICAgICAgIFN1YnRhcmdldC0+Z2V0RGFyd2luVmVycygpIDwgOSkgeworICAgICAgLy8gUEMtcmVsYXRpdmUgcmVmZXJlbmNlcyB0byBleHRlcm5hbCBzeW1ib2xzIHNob3VsZCBnbyB0aHJvdWdoICRzdHViLAorICAgICAgLy8gdW5sZXNzIHdlJ3JlIGJ1aWxkaW5nIHdpdGggdGhlIGxlb3BhcmQgbGlua2VyIG9yIGxhdGVyLCB3aGljaAorICAgICAgLy8gYXV0b21hdGljYWxseSBzeW50aGVzaXplcyB0aGVzZSBzdHVicy4KKyAgICAgIE9wRmxhZ3MgPSBYODZJSTo6TU9fREFSV0lOX1NUVUI7CisgICAgfQorCisgICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKFMtPmdldFN5bWJvbCgpLCBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BGbGFncyk7CisgIH0KKworICAvLyBSZXR1cm5zIGEgY2hhaW4gJiBhIGZsYWcgZm9yIHJldHZhbCBjb3B5IHRvIHVzZS4KKyAgU0RWVExpc3QgTm9kZVR5cyA9IERBRy5nZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworCisgIGlmICghSXNTaWJjYWxsICYmIGlzVGFpbENhbGwpIHsKKyAgICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX0VORChDaGFpbiwgREFHLmdldEludFB0ckNvbnN0YW50KE51bUJ5dGVzLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgwLCB0cnVlKSwgSW5GbGFnKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIE9wcy5wdXNoX2JhY2soQ2hhaW4pOworICBPcHMucHVzaF9iYWNrKENhbGxlZSk7CisKKyAgaWYgKGlzVGFpbENhbGwpCisgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoRlBEaWZmLCBNVlQ6OmkzMikpOworCisgIC8vIEFkZCBhcmd1bWVudCByZWdpc3RlcnMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBzbyB0aGF0IHRoZXkgYXJlIGtub3duIGxpdmUKKyAgLy8gaW50byB0aGUgY2FsbC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3NUb1Bhc3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBPcHMucHVzaF9iYWNrKERBRy5nZXRSZWdpc3RlcihSZWdzVG9QYXNzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3NUb1Bhc3NbaV0uc2Vjb25kLmdldFZhbHVlVHlwZSgpKSk7CisKKyAgLy8gQWRkIGFuIGltcGxpY2l0IHVzZSBHT1QgcG9pbnRlciBpbiBFQlguCisgIGlmICghaXNUYWlsQ2FsbCAmJiBTdWJ0YXJnZXQtPmlzUElDU3R5bGVHT1QoKSkKKyAgICBPcHMucHVzaF9iYWNrKERBRy5nZXRSZWdpc3RlcihYODY6OkVCWCwgZ2V0UG9pbnRlclR5KCkpKTsKKworICAvLyBBZGQgYW4gaW1wbGljaXQgdXNlIG9mIEFMIGZvciB4ODYgdmFyYXJnIGZ1bmN0aW9ucy4KKyAgaWYgKElzNjRCaXQgJiYgaXNWYXJBcmcpCisgICAgT3BzLnB1c2hfYmFjayhEQUcuZ2V0UmVnaXN0ZXIoWDg2OjpBTCwgTVZUOjppOCkpOworCisgIGlmIChJbkZsYWcuZ2V0Tm9kZSgpKQorICAgIE9wcy5wdXNoX2JhY2soSW5GbGFnKTsKKworICBpZiAoaXNUYWlsQ2FsbCkgeworICAgIC8vIFdlIHVzZWQgdG8gZG86CisgICAgLy8vLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXR1cm4gbG93ZXJlZCBmb3IgdGhpcyBmdW5jdGlvbiwgYWRkIHRoZSByZWdzCisgICAgLy8vLyB0byB0aGUgbGl2ZW91dCBzZXQgZm9yIHRoZSBmdW5jdGlvbi4KKyAgICAvLyBUaGlzIGlzbid0IHJpZ2h0LCBhbHRob3VnaCBpdCdzIHByb2JhYmx5IGhhcm1sZXNzIG9uIHg4NjsgbGl2ZW91dHMKKyAgICAvLyBzaG91bGQgYmUgY29tcHV0ZWQgZnJvbSByZXR1cm5zIG5vdCB0YWlsIGNhbGxzLiAgQ29uc2lkZXIgYSB2b2lkCisgICAgLy8gZnVuY3Rpb24gbWFraW5nIGEgdGFpbCBjYWxsIHRvIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGludC4KKyAgICByZXR1cm4gREFHLmdldE5vZGUoWDg2SVNEOjpUQ19SRVRVUk4sIGRsLAorICAgICAgICAgICAgICAgICAgICAgICBOb2RlVHlzLCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKyAgfQorCisgIENoYWluID0gREFHLmdldE5vZGUoWDg2SVNEOjpDQUxMLCBkbCwgTm9kZVR5cywgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIENyZWF0ZSB0aGUgQ0FMTFNFUV9FTkQgbm9kZS4KKyAgdW5zaWduZWQgTnVtQnl0ZXNGb3JDYWxsZWVUb1B1c2g7CisgIGlmIChTdWJ0YXJnZXQtPklzQ2FsbGVlUG9wKGlzVmFyQXJnLCBDYWxsQ29udikpCisgICAgTnVtQnl0ZXNGb3JDYWxsZWVUb1B1c2ggPSBOdW1CeXRlczsgICAgLy8gQ2FsbGVlIHBvcHMgZXZlcnl0aGluZworICBlbHNlIGlmICghSXM2NEJpdCAmJiAhSXNUYWlsQ2FsbENvbnZlbnRpb24oQ2FsbENvbnYpICYmIElzU3RydWN0UmV0KQorICAgIC8vIElmIHRoaXMgaXMgYSBjYWxsIHRvIGEgc3RydWN0LXJldHVybiBmdW5jdGlvbiwgdGhlIGNhbGxlZQorICAgIC8vIHBvcHMgdGhlIGhpZGRlbiBzdHJ1Y3QgcG9pbnRlciwgc28gd2UgaGF2ZSB0byBwdXNoIGl0IGJhY2suCisgICAgLy8gVGhpcyBpcyBjb21tb24gZm9yIERhcndpbi9YODYsIExpbnV4ICYgTWluZ3czMiB0YXJnZXRzLgorICAgIE51bUJ5dGVzRm9yQ2FsbGVlVG9QdXNoID0gNDsKKyAgZWxzZQorICAgIE51bUJ5dGVzRm9yQ2FsbGVlVG9QdXNoID0gMDsgIC8vIENhbGxlZSBwb3BzIG5vdGhpbmcuCisKKyAgLy8gUmV0dXJucyBhIGZsYWcgZm9yIHJldHZhbCBjb3B5IHRvIHVzZS4KKyAgaWYgKCFJc1NpYmNhbGwpIHsKKyAgICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX0VORChDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoTnVtQnl0ZXMsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChOdW1CeXRlc0ZvckNhbGxlZVRvUHVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5GbGFnKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIC8vIEhhbmRsZSByZXN1bHQgdmFsdWVzLCBjb3B5aW5nIHRoZW0gb3V0IG9mIHBoeXNyZWdzIGludG8gdnJlZ3MgdGhhdCB3ZQorICAvLyByZXR1cm4uCisgIHJldHVybiBMb3dlckNhbGxSZXN1bHQoQ2hhaW4sIEluRmxhZywgQ2FsbENvbnYsIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgIElucywgZGwsIERBRywgSW5WYWxzKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgRmFzdCBDYWxsaW5nIENvbnZlbnRpb24gKHRhaWwgY2FsbCkgaW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vICBMaWtlIHN0ZCBjYWxsLCBjYWxsZWUgY2xlYW5zIGFyZ3VtZW50cywgY29udmVudGlvbiBleGNlcHQgdGhhdCBFQ1ggaXMKKy8vICByZXNlcnZlZCBmb3Igc3RvcmluZyB0aGUgdGFpbCBjYWxsZWQgZnVuY3Rpb24gYWRkcmVzcy4gT25seSAyIHJlZ2lzdGVycyBhcmUKKy8vICBmcmVlIGZvciBhcmd1bWVudCBwYXNzaW5nIChpbnJlZykuIFRhaWwgY2FsbCBvcHRpbWl6YXRpb24gaXMgcGVyZm9ybWVkCisvLyAgcHJvdmlkZWQ6CisvLyAgICAgICAgICAgICAgICAqIHRhaWxjYWxsb3B0IGlzIGVuYWJsZWQKKy8vICAgICAgICAgICAgICAgICogY2FsbGVyL2NhbGxlZSBhcmUgZmFzdGNjCisvLyAgT24gWDg2XzY0IGFyY2hpdGVjdHVyZSB3aXRoIEdPVC1zdHlsZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIG9ubHkgbG9jYWwKKy8vICAod2l0aGluIG1vZHVsZSkgY2FsbHMgYXJlIHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LgorLy8gIFRvIGtlZXAgdGhlIHN0YWNrIGFsaWduZWQgYWNjb3JkaW5nIHRvIHBsYXRmb3JtIGFiaSB0aGUgZnVuY3Rpb24KKy8vICBHZXRBbGlnbmVkQXJndW1lbnRTdGFja1NpemUgZW5zdXJlcyB0aGF0IGFyZ3VtZW50IGRlbHRhIGlzIGFsd2F5cyBtdWx0aXBsZXMKKy8vICBvZiBzdGFjayBhbGlnbm1lbnQuIChEeW5hbWljIGxpbmtlcnMgbmVlZCB0aGlzIC0gZGFyd2luJ3MgZHlsZCBmb3IgZXhhbXBsZSkKKy8vICBJZiBhIHRhaWwgY2FsbGVkIGZ1bmN0aW9uIGNhbGxlZSBoYXMgbW9yZSBhcmd1bWVudHMgdGhhbiB0aGUgY2FsbGVyIHRoZQorLy8gIGNhbGxlciBuZWVkcyB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyByb29tIHRvIG1vdmUgdGhlIFJFVEFERFIgdG8uIFRoaXMgaXMKKy8vICBhY2hpZXZlZCBieSByZXNlcnZpbmcgYW4gYXJlYSB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnQgZGVsdGEgcmlnaHQgYWZ0ZXIgdGhlCisvLyAgb3JpZ2luYWwgUkV0QUREUiwgYnV0IGJlZm9yZSB0aGUgc2F2ZWQgZnJhbWVwb2ludGVyIG9yIHRoZSBzcGlsbGVkIHJlZ2lzdGVycworLy8gIGUuZy4gY2FsbGVyKGFyZzEsIGFyZzIpIGNhbGxzIGNhbGxlZShhcmcxLCBhcmcyLGFyZzMsYXJnNCkKKy8vICBzdGFjayBsYXlvdXQ6CisvLyAgICBhcmcxCisvLyAgICBhcmcyCisvLyAgICBSRVRBRERSCisvLyAgICBbIG5ldyBSRVRBRERSCisvLyAgICAgIG1vdmUgYXJlYSBdCisvLyAgICAocG9zc2libGUgRUJQKQorLy8gICAgRVNJCisvLyAgICBFREkKKy8vICAgIGxvY2FsMSAuLgorCisvLy8gR2V0QWxpZ25lZEFyZ3VtZW50U3RhY2tTaXplIC0gTWFrZSB0aGUgc3RhY2sgc2l6ZSBhbGlnbiBlLmcgMTZuICsgMTIgYWxpZ25lZAorLy8vIGZvciBhIDE2IGJ5dGUgYWxpZ24gcmVxdWlyZW1lbnQuCit1bnNpZ25lZAorWDg2VGFyZ2V0TG93ZXJpbmc6OkdldEFsaWduZWRBcmd1bWVudFN0YWNrU2l6ZSh1bnNpZ25lZCBTdGFja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyYgREFHKSBjb25zdCB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7CisgIGNvbnN0IFRhcmdldEZyYW1lSW5mbyAmVEZJID0gKlRNLmdldEZyYW1lSW5mbygpOworICB1bnNpZ25lZCBTdGFja0FsaWdubWVudCA9IFRGSS5nZXRTdGFja0FsaWdubWVudCgpOworICB1aW50NjRfdCBBbGlnbk1hc2sgPSBTdGFja0FsaWdubWVudCAtIDE7CisgIGludDY0X3QgT2Zmc2V0ID0gU3RhY2tTaXplOworICB1aW50NjRfdCBTbG90U2l6ZSA9IFRELT5nZXRQb2ludGVyU2l6ZSgpOworICBpZiAoIChPZmZzZXQgJiBBbGlnbk1hc2spIDw9IChTdGFja0FsaWdubWVudCAtIFNsb3RTaXplKSApIHsKKyAgICAvLyBOdW1iZXIgc21hbGxlciB0aGFuIDEyIHNvIGp1c3QgYWRkIHRoZSBkaWZmZXJlbmNlLgorICAgIE9mZnNldCArPSAoKFN0YWNrQWxpZ25tZW50IC0gU2xvdFNpemUpIC0gKE9mZnNldCAmIEFsaWduTWFzaykpOworICB9IGVsc2UgeworICAgIC8vIE1hc2sgb3V0IGxvd2VyIGJpdHMsIGFkZCBzdGFja2FsaWdubWVudCBvbmNlIHBsdXMgdGhlIDEyIGJ5dGVzLgorICAgIE9mZnNldCA9ICgofkFsaWduTWFzaykgJiBPZmZzZXQpICsgU3RhY2tBbGlnbm1lbnQgKworICAgICAgKFN0YWNrQWxpZ25tZW50LVNsb3RTaXplKTsKKyAgfQorICByZXR1cm4gT2Zmc2V0OworfQorCisvLy8gTWF0Y2hpbmdTdGFja09mZnNldCAtIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdGFjayBjYWxsIGFyZ3VtZW50IGlzCisvLy8gYWxyZWFkeSBhdmFpbGFibGUgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHJlbGF0aXZlbHkpIG9mIHRoZSBjYWxsZXIncworLy8vIGluY29taW5nIGFyZ3VtZW50IHN0YWNrLgorc3RhdGljCitib29sIE1hdGNoaW5nU3RhY2tPZmZzZXQoU0RWYWx1ZSBBcmcsIHVuc2lnbmVkIE9mZnNldCwgSVNEOjpBcmdGbGFnc1R5IEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSwgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFg4Nkluc3RySW5mbyAqVElJKSB7CisgIHVuc2lnbmVkIEJ5dGVzID0gQXJnLmdldFZhbHVlVHlwZSgpLmdldFNpemVJbkJpdHMoKSAvIDg7CisgIGludCBGSSA9IElOVF9NQVg7CisgIGlmIChBcmcuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb3B5RnJvbVJlZykgeworICAgIHVuc2lnbmVkIFZSID0gY2FzdDxSZWdpc3RlclNETm9kZT4oQXJnLmdldE9wZXJhbmQoMSkpLT5nZXRSZWcoKTsKKyAgICBpZiAoIVZSIHx8IFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFZSKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBNYWNoaW5lSW5zdHIgKkRlZiA9IE1SSS0+Z2V0VlJlZ0RlZihWUik7CisgICAgaWYgKCFEZWYpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFGbGFncy5pc0J5VmFsKCkpIHsKKyAgICAgIGlmICghVElJLT5pc0xvYWRGcm9tU3RhY2tTbG90KERlZiwgRkkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHVuc2lnbmVkIE9wY29kZSA9IERlZi0+Z2V0T3Bjb2RlKCk7CisgICAgICBpZiAoKE9wY29kZSA9PSBYODY6OkxFQTMyciB8fCBPcGNvZGUgPT0gWDg2OjpMRUE2NHIpICYmCisgICAgICAgICAgRGVmLT5nZXRPcGVyYW5kKDEpLmlzRkkoKSkgeworICAgICAgICBGSSA9IERlZi0+Z2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOworICAgICAgICBCeXRlcyA9IEZsYWdzLmdldEJ5VmFsU2l6ZSgpOworICAgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoTG9hZFNETm9kZSAqTGQgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihBcmcpKSB7CisgICAgaWYgKEZsYWdzLmlzQnlWYWwoKSkKKyAgICAgIC8vIEJ5VmFsIGFyZ3VtZW50IGlzIHBhc3NlZCBpbiBhcyBhIHBvaW50ZXIgYnV0IGl0J3Mgbm93IGJlaW5nCisgICAgICAvLyBkZXJlZmVyZW5jZWQuIGUuZy4KKyAgICAgIC8vIGRlZmluZSBAZm9vKCVzdHJ1Y3QuWCogJUEpIHsKKyAgICAgIC8vICAgdGFpbCBjYWxsIEBiYXIoJXN0cnVjdC5YKiBieXZhbCAlQSkKKyAgICAgIC8vIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBTRFZhbHVlIFB0ciA9IExkLT5nZXRCYXNlUHRyKCk7CisgICAgRnJhbWVJbmRleFNETm9kZSAqRklOb2RlID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4oUHRyKTsKKyAgICBpZiAoIUZJTm9kZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBGSSA9IEZJTm9kZS0+Z2V0SW5kZXgoKTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworCisgIGFzc2VydChGSSAhPSBJTlRfTUFYKTsKKyAgaWYgKCFNRkktPmlzRml4ZWRPYmplY3RJbmRleChGSSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gT2Zmc2V0ID09IE1GSS0+Z2V0T2JqZWN0T2Zmc2V0KEZJKSAmJiBCeXRlcyA9PSBNRkktPmdldE9iamVjdFNpemUoRkkpOworfQorCisvLy8gSXNFbGlnaWJsZUZvclRhaWxDYWxsT3B0aW1pemF0aW9uIC0gQ2hlY2sgd2hldGhlciB0aGUgY2FsbCBpcyBlbGlnaWJsZQorLy8vIGZvciB0YWlsIGNhbGwgb3B0aW1pemF0aW9uLiBUYXJnZXRzIHdoaWNoIHdhbnQgdG8gZG8gdGFpbCBjYWxsCisvLy8gb3B0aW1pemF0aW9uIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KK2Jvb2wKK1g4NlRhcmdldExvd2VyaW5nOjpJc0VsaWdpYmxlRm9yVGFpbENhbGxPcHRpbWl6YXRpb24oU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsZWVDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NhbGxlZVN0cnVjdFJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NhbGxlclN0cnVjdFJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHJiBEQUcpIGNvbnN0IHsKKyAgaWYgKCFJc1RhaWxDYWxsQ29udmVudGlvbihDYWxsZWVDQykgJiYKKyAgICAgIENhbGxlZUNDICE9IENhbGxpbmdDb252OjpDKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiAtdGFpbGNhbGxvcHQgaXMgc3BlY2lmaWVkLCBtYWtlIGZhc3RjYyBmdW5jdGlvbnMgdGFpbC1jYWxsYWJsZS4KKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgY29uc3QgRnVuY3Rpb24gKkNhbGxlckYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnVuY3Rpb24oKTsKKyAgQ2FsbGluZ0NvbnY6OklEIENhbGxlckNDID0gQ2FsbGVyRi0+Z2V0Q2FsbGluZ0NvbnYoKTsKKyAgYm9vbCBDQ01hdGNoID0gQ2FsbGVyQ0MgPT0gQ2FsbGVlQ0M7CisKKyAgaWYgKEd1YXJhbnRlZWRUYWlsQ2FsbE9wdCkgeworICAgIGlmIChJc1RhaWxDYWxsQ29udmVudGlvbihDYWxsZWVDQykgJiYgQ0NNYXRjaCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIExvb2sgZm9yIG9idmlvdXMgc2FmZSBjYXNlcyB0byBwZXJmb3JtIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24gdGhhdCBkbyBub3QKKyAgLy8gcmVxdWlyZSBBQkkgY2hhbmdlcy4gVGhpcyBpcyB3aGF0IGdjYyBjYWxscyBzaWJjYWxsLgorCisgIC8vIENhbid0IGRvIHNpYmNhbGwgaWYgc3RhY2sgbmVlZHMgdG8gYmUgZHluYW1pY2FsbHkgcmUtYWxpZ25lZC4gUEVJIG5lZWRzIHRvCisgIC8vIGVtaXQgYSBzcGVjaWFsIGVwaWxvZ3VlLgorICBpZiAoUmVnSW5mby0+bmVlZHNTdGFja1JlYWxpZ25tZW50KE1GKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRG8gbm90IHNpYmNhbGwgb3B0aW1pemUgdmFyYXJnIGNhbGxzIHVubGVzcyB0aGUgY2FsbCBzaXRlIGlzIG5vdCBwYXNzaW5nCisgIC8vIGFueSBhcmd1bWVudHMuCisgIGlmIChpc1ZhckFyZyAmJiAhT3V0cy5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBBbHNvIGF2b2lkIHNpYmNhbGwgb3B0aW1pemF0aW9uIGlmIGVpdGhlciBjYWxsZXIgb3IgY2FsbGVlIHVzZXMgc3RydWN0CisgIC8vIHJldHVybiBzZW1hbnRpY3MuCisgIGlmIChpc0NhbGxlZVN0cnVjdFJldCB8fCBpc0NhbGxlclN0cnVjdFJldCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhlIGNhbGwgcmVzdWx0IGlzIGluIFNUMCAvIFNUMSwgaXQgbmVlZHMgdG8gYmUgcG9wcGVkIG9mZiB0aGUgeDg3IHN0YWNrLgorICAvLyBUaGVyZWZvcmUgaWYgaXQncyBub3QgdXNlZCBieSB0aGUgY2FsbCBpdCBpcyBub3Qgc2FmZSB0byBvcHRpbWl6ZSB0aGlzIGludG8KKyAgLy8gYSBzaWJjYWxsLgorICBib29sIFVudXNlZCA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoIUluc1tpXS5Vc2VkKSB7CisgICAgICBVbnVzZWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChVbnVzZWQpIHsKKyAgICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKyAgICBDQ1N0YXRlIENDSW5mbyhDYWxsZWVDQywgZmFsc2UsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgICBSVkxvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgICBDQ0luZm8uQW5hbHl6ZUNhbGxSZXN1bHQoSW5zLCBSZXRDQ19YODYpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSVkxvY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgQ0NWYWxBc3NpZ24gJlZBID0gUlZMb2NzW2ldOworICAgICAgaWYgKFZBLmdldExvY1JlZygpID09IFg4Njo6U1QwIHx8IFZBLmdldExvY1JlZygpID09IFg4Njo6U1QxKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZG8gbm90IG1hdGNoLCB0aGVuIHdlJ2QgYmV0dGVyIG1ha2Ugc3VyZSB0aGUKKyAgLy8gcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdoYXQgdGhlIGNhbGxlciBleHBlY3RzLgorICBpZiAoIUNDTWF0Y2gpIHsKKyAgICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczE7CisgICAgQ0NTdGF0ZSBDQ0luZm8xKENhbGxlZUNDLCBmYWxzZSwgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICAgICBSVkxvY3MxLCAqREFHLmdldENvbnRleHQoKSk7CisgICAgQ0NJbmZvMS5BbmFseXplQ2FsbFJlc3VsdChJbnMsIFJldENDX1g4Nik7CisKKyAgICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczI7CisgICAgQ0NTdGF0ZSBDQ0luZm8yKENhbGxlckNDLCBmYWxzZSwgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICAgICBSVkxvY3MyLCAqREFHLmdldENvbnRleHQoKSk7CisgICAgQ0NJbmZvMi5BbmFseXplQ2FsbFJlc3VsdChJbnMsIFJldENDX1g4Nik7CisKKyAgICBpZiAoUlZMb2NzMS5zaXplKCkgIT0gUlZMb2NzMi5zaXplKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJWTG9jczEuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKFJWTG9jczFbaV0uaXNSZWdMb2MoKSAhPSBSVkxvY3MyW2ldLmlzUmVnTG9jKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChSVkxvY3MxW2ldLmdldExvY0luZm8oKSAhPSBSVkxvY3MyW2ldLmdldExvY0luZm8oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKFJWTG9jczFbaV0uaXNSZWdMb2MoKSkgeworICAgICAgICBpZiAoUlZMb2NzMVtpXS5nZXRMb2NSZWcoKSAhPSBSVkxvY3MyW2ldLmdldExvY1JlZygpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChSVkxvY3MxW2ldLmdldExvY01lbU9mZnNldCgpICE9IFJWTG9jczJbaV0uZ2V0TG9jTWVtT2Zmc2V0KCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSBjYWxsZWUgdGFrZXMgbm8gYXJndW1lbnRzIHRoZW4gZ28gb24gdG8gY2hlY2sgdGhlIHJlc3VsdHMgb2YgdGhlCisgIC8vIGNhbGwuCisgIGlmICghT3V0cy5lbXB0eSgpKSB7CisgICAgLy8gQ2hlY2sgaWYgc3RhY2sgYWRqdXN0bWVudCBpcyBuZWVkZWQuIEZvciBub3csIGRvIG5vdCBkbyB0aGlzIGlmIGFueQorICAgIC8vIGFyZ3VtZW50IGlzIHBhc3NlZCBvbiB0aGUgc3RhY2suCisgICAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICAgIENDU3RhdGUgQ0NJbmZvKENhbGxlZUNDLCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICAgIEFyZ0xvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKyAgICBDQ0luZm8uQW5hbHl6ZUNhbGxPcGVyYW5kcyhPdXRzLCBDQ0Fzc2lnbkZuRm9yTm9kZShDYWxsZWVDQykpOworICAgIGlmIChDQ0luZm8uZ2V0TmV4dFN0YWNrT2Zmc2V0KCkpIHsKKyAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgICAgICBpZiAoTUYuZ2V0SW5mbzxYODZNYWNoaW5lRnVuY3Rpb25JbmZvPigpLT5nZXRCeXRlc1RvUG9wT25SZXR1cm4oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKFN1YnRhcmdldC0+aXNUYXJnZXRXaW42NCgpKQorICAgICAgICAvLyBXaW42NCBBQkkgaGFzIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9ucy4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBDaGVjayBpZiB0aGUgYXJndW1lbnRzIGFyZSBhbHJlYWR5IGxhaWQgb3V0IGluIHRoZSByaWdodCB3YXkgYXMKKyAgICAgIC8vIHRoZSBjYWxsZXIncyBmaXhlZCBzdGFjayBvYmplY3RzLgorICAgICAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkkgPSAmTUYuZ2V0UmVnSW5mbygpOworICAgICAgY29uc3QgWDg2SW5zdHJJbmZvICpUSUkgPQorICAgICAgICAoKFg4NlRhcmdldE1hY2hpbmUmKWdldFRhcmdldE1hY2hpbmUoKSkuZ2V0SW5zdHJJbmZvKCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIENDVmFsQXNzaWduICZWQSA9IEFyZ0xvY3NbaV07CisgICAgICAgIFNEVmFsdWUgQXJnID0gT3V0VmFsc1tpXTsKKyAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEZsYWdzID0gT3V0c1tpXS5GbGFnczsKKyAgICAgICAgaWYgKFZBLmdldExvY0luZm8oKSA9PSBDQ1ZhbEFzc2lnbjo6SW5kaXJlY3QpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIVZBLmlzUmVnTG9jKCkpIHsKKyAgICAgICAgICBpZiAoIU1hdGNoaW5nU3RhY2tPZmZzZXQoQXJnLCBWQS5nZXRMb2NNZW1PZmZzZXQoKSwgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSSwgTVJJLCBUSUkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIHRhaWxjYWxsIGFkZHJlc3MgbWF5IGJlIGluIGEgcmVnaXN0ZXIsIHRoZW4gbWFrZSBzdXJlIGl0J3MKKyAgICAvLyBwb3NzaWJsZSB0byByZWdpc3RlciBhbGxvY2F0ZSBmb3IgaXQuIEluIDMyLWJpdCwgdGhlIGNhbGwgYWRkcmVzcyBjYW4KKyAgICAvLyBvbmx5IHRhcmdldCBFQVgsIEVEWCwgb3IgRUNYIHNpbmNlIHRoZSB0YWlsIGNhbGwgbXVzdCBiZSBzY2hlZHVsZWQgYWZ0ZXIKKyAgICAvLyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIGFyZSByZXN0b3JlZC4gVGhlc2UgaGFwcGVuIHRvIGJlIHRoZSBzYW1lCisgICAgLy8gcmVnaXN0ZXJzIHVzZWQgdG8gcGFzcyAnaW5yZWcnIGFyZ3VtZW50cyBzbyB3YXRjaCBvdXQgZm9yIHRob3NlLgorICAgIGlmICghU3VidGFyZ2V0LT5pczY0Qml0KCkgJiYKKyAgICAgICAgIWlzYTxHbG9iYWxBZGRyZXNzU0ROb2RlPihDYWxsZWUpICYmCisgICAgICAgICFpc2E8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpIHsKKyAgICAgIHVuc2lnbmVkIE51bUluUmVncyA9IDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJnTG9jcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIENDVmFsQXNzaWduICZWQSA9IEFyZ0xvY3NbaV07CisgICAgICAgIGlmICghVkEuaXNSZWdMb2MoKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdW5zaWduZWQgUmVnID0gVkEuZ2V0TG9jUmVnKCk7CisgICAgICAgIHN3aXRjaCAoUmVnKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlIFg4Njo6RUFYOiBjYXNlIFg4Njo6RURYOiBjYXNlIFg4Njo6RUNYOgorICAgICAgICAgIGlmICgrK051bUluUmVncyA9PSAzKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIgTG93ZXJpbmcgSG9va3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6Z2V0UmV0dXJuQWRkcmVzc0ZyYW1lSW5kZXgoU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyAqRnVuY0luZm8gPSBNRi5nZXRJbmZvPFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisgIGludCBSZXR1cm5BZGRySW5kZXggPSBGdW5jSW5mby0+Z2V0UkFJbmRleCgpOworCisgIGlmIChSZXR1cm5BZGRySW5kZXggPT0gMCkgeworICAgIC8vIFNldCB1cCBhIGZyYW1lIG9iamVjdCBmb3IgdGhlIHJldHVybiBhZGRyZXNzLgorICAgIHVpbnQ2NF90IFNsb3RTaXplID0gVEQtPmdldFBvaW50ZXJTaXplKCk7CisgICAgUmV0dXJuQWRkckluZGV4ID0gTUYuZ2V0RnJhbWVJbmZvKCktPkNyZWF0ZUZpeGVkT2JqZWN0KFNsb3RTaXplLCAtU2xvdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBGdW5jSW5mby0+c2V0UkFJbmRleChSZXR1cm5BZGRySW5kZXgpOworICB9CisKKyAgcmV0dXJuIERBRy5nZXRGcmFtZUluZGV4KFJldHVybkFkZHJJbmRleCwgZ2V0UG9pbnRlclR5KCkpOworfQorCisKK2Jvb2wgWDg2Ojppc09mZnNldFN1aXRhYmxlRm9yQ29kZU1vZGVsKGludDY0X3QgT2Zmc2V0LCBDb2RlTW9kZWw6Ok1vZGVsIE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc1N5bWJvbGljRGlzcGxhY2VtZW50KSB7CisgIC8vIE9mZnNldCBzaG91bGQgZml0IGludG8gMzIgYml0IGltbWVkaWF0ZSBmaWVsZC4KKyAgaWYgKCFpc0ludDwzMj4oT2Zmc2V0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHN5bWJvbGljIGRpc3BsYWNlbWVudCAtIHdlIGRvbid0IGhhdmUgYW55IGV4dHJhCisgIC8vIHJlc3RyaWN0aW9ucy4KKyAgaWYgKCFoYXNTeW1ib2xpY0Rpc3BsYWNlbWVudCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBGSVhNRTogU29tZSB0d2Vha3MgbWlnaHQgYmUgbmVlZGVkIGZvciBtZWRpdW0gY29kZSBtb2RlbC4KKyAgaWYgKE0gIT0gQ29kZU1vZGVsOjpTbWFsbCAmJiBNICE9IENvZGVNb2RlbDo6S2VybmVsKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBGb3Igc21hbGwgY29kZSBtb2RlbCB3ZSBhc3N1bWUgdGhhdCBsYXRlc3Qgb2JqZWN0IGlzIDE2TUIgYmVmb3JlIGVuZCBvZiAzMQorICAvLyBiaXRzIGJvdW5kYXJ5LiBXZSBtYXkgYWxzbyBhY2NlcHQgcHJldHR5IGxhcmdlIG5lZ2F0aXZlIGNvbnN0YW50cyBrbm93aW5nCisgIC8vIHRoYXQgYWxsIG9iamVjdHMgYXJlIGluIHRoZSBwb3NpdGl2ZSBoYWxmIG9mIGFkZHJlc3Mgc3BhY2UuCisgIGlmIChNID09IENvZGVNb2RlbDo6U21hbGwgJiYgT2Zmc2V0IDwgMTYqMTAyNCoxMDI0KQorICAgIHJldHVybiB0cnVlOworCisgIC8vIEZvciBrZXJuZWwgY29kZSBtb2RlbCB3ZSBrbm93IHRoYXQgYWxsIG9iamVjdCByZXNpc3QgaW4gdGhlIG5lZ2F0aXZlIGhhbGYKKyAgLy8gb2YgMzJiaXRzIGFkZHJlc3Mgc3BhY2UuIFdlIG1heSBub3QgYWNjZXB0IG5lZ2F0aXZlIG9mZnNldHMsIHNpbmNlIHRoZXkgbWF5CisgIC8vIGJlIGp1c3Qgb2ZmIGFuZCB3ZSBtYXkgYWNjZXB0IHByZXR0eSBsYXJnZSBwb3NpdGl2ZSBvbmVzLgorICBpZiAoTSA9PSBDb2RlTW9kZWw6Oktlcm5lbCAmJiBPZmZzZXQgPiAwKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFRyYW5zbGF0ZVg4NkNDIC0gZG8gYSBvbmUgdG8gb25lIHRyYW5zbGF0aW9uIG9mIGEgSVNEOjpDb25kQ29kZSB0byB0aGUgWDg2CisvLy8gc3BlY2lmaWMgY29uZGl0aW9uIGNvZGUsIHJldHVybmluZyB0aGUgY29uZGl0aW9uIGNvZGUgYW5kIHRoZSBMSFMvUkhTIG9mIHRoZQorLy8vIGNvbXBhcmlzb24gdG8gbWFrZS4KK3N0YXRpYyB1bnNpZ25lZCBUcmFuc2xhdGVYODZDQyhJU0Q6OkNvbmRDb2RlIFNldENDT3Bjb2RlLCBib29sIGlzRlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTEhTLCBTRFZhbHVlICZSSFMsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIGlmICghaXNGUCkgeworICAgIGlmIChDb25zdGFudFNETm9kZSAqUkhTQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihSSFMpKSB7CisgICAgICBpZiAoU2V0Q0NPcGNvZGUgPT0gSVNEOjpTRVRHVCAmJiBSSFNDLT5pc0FsbE9uZXNWYWx1ZSgpKSB7CisgICAgICAgIC8vIFggPiAtMSAgIC0+IFggPT0gMCwganVtcCAhc2lnbi4KKyAgICAgICAgUkhTID0gREFHLmdldENvbnN0YW50KDAsIFJIUy5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICAgIHJldHVybiBYODY6OkNPTkRfTlM7CisgICAgICB9IGVsc2UgaWYgKFNldENDT3Bjb2RlID09IElTRDo6U0VUTFQgJiYgUkhTQy0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICAvLyBYIDwgMCAgIC0+IFggPT0gMCwganVtcCBvbiBzaWduLgorICAgICAgICByZXR1cm4gWDg2OjpDT05EX1M7CisgICAgICB9IGVsc2UgaWYgKFNldENDT3Bjb2RlID09IElTRDo6U0VUTFQgJiYgUkhTQy0+Z2V0WkV4dFZhbHVlKCkgPT0gMSkgeworICAgICAgICAvLyBYIDwgMSAgIC0+IFggPD0gMAorICAgICAgICBSSFMgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgUkhTLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIFg4Njo6Q09ORF9MRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKFNldENDT3Bjb2RlKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBpbnRlZ2VyIGNvbmRpdGlvbiEiKTsKKyAgICBjYXNlIElTRDo6U0VURVE6ICByZXR1cm4gWDg2OjpDT05EX0U7CisgICAgY2FzZSBJU0Q6OlNFVEdUOiAgcmV0dXJuIFg4Njo6Q09ORF9HOworICAgIGNhc2UgSVNEOjpTRVRHRTogIHJldHVybiBYODY6OkNPTkRfR0U7CisgICAgY2FzZSBJU0Q6OlNFVExUOiAgcmV0dXJuIFg4Njo6Q09ORF9MOworICAgIGNhc2UgSVNEOjpTRVRMRTogIHJldHVybiBYODY6OkNPTkRfTEU7CisgICAgY2FzZSBJU0Q6OlNFVE5FOiAgcmV0dXJuIFg4Njo6Q09ORF9ORTsKKyAgICBjYXNlIElTRDo6U0VUVUxUOiByZXR1cm4gWDg2OjpDT05EX0I7CisgICAgY2FzZSBJU0Q6OlNFVFVHVDogcmV0dXJuIFg4Njo6Q09ORF9BOworICAgIGNhc2UgSVNEOjpTRVRVTEU6IHJldHVybiBYODY6OkNPTkRfQkU7CisgICAgY2FzZSBJU0Q6OlNFVFVHRTogcmV0dXJuIFg4Njo6Q09ORF9BRTsKKyAgICB9CisgIH0KKworICAvLyBGaXJzdCBkZXRlcm1pbmUgaWYgaXQgaXMgcmVxdWlyZWQgb3IgaXMgcHJvZml0YWJsZSB0byBmbGlwIHRoZSBvcGVyYW5kcy4KKworICAvLyBJZiBMSFMgaXMgYSBmb2xkYWJsZSBsb2FkLCBidXQgUkhTIGlzIG5vdCwgZmxpcCB0aGUgY29uZGl0aW9uLgorICBpZiAoKElTRDo6aXNOT05fRVhUTG9hZChMSFMuZ2V0Tm9kZSgpKSAmJiBMSFMuaGFzT25lVXNlKCkpICYmCisgICAgICAhKElTRDo6aXNOT05fRVhUTG9hZChSSFMuZ2V0Tm9kZSgpKSAmJiBSSFMuaGFzT25lVXNlKCkpKSB7CisgICAgU2V0Q0NPcGNvZGUgPSBnZXRTZXRDQ1N3YXBwZWRPcGVyYW5kcyhTZXRDQ09wY29kZSk7CisgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgfQorCisgIHN3aXRjaCAoU2V0Q0NPcGNvZGUpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpTRVRPTFQ6CisgIGNhc2UgSVNEOjpTRVRPTEU6CisgIGNhc2UgSVNEOjpTRVRVR1Q6CisgIGNhc2UgSVNEOjpTRVRVR0U6CisgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8vIE9uIGEgZmxvYXRpbmcgcG9pbnQgY29uZGl0aW9uLCB0aGUgZmxhZ3MgYXJlIHNldCBhcyBmb2xsb3dzOgorICAvLyBaRiAgUEYgIENGICAgb3AKKyAgLy8gIDAgfCAwIHwgMCB8IFggPiBZCisgIC8vICAwIHwgMCB8IDEgfCBYIDwgWQorICAvLyAgMSB8IDAgfCAwIHwgWCA9PSBZCisgIC8vICAxIHwgMSB8IDEgfCB1bm9yZGVyZWQKKyAgc3dpdGNoIChTZXRDQ09wY29kZSkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJDb25kY29kZSBzaG91bGQgYmUgcHJlLWxlZ2FsaXplZCBhd2F5Iik7CisgIGNhc2UgSVNEOjpTRVRVRVE6CisgIGNhc2UgSVNEOjpTRVRFUTogICByZXR1cm4gWDg2OjpDT05EX0U7CisgIGNhc2UgSVNEOjpTRVRPTFQ6ICAgICAgICAgICAgICAvLyBmbGlwcGVkCisgIGNhc2UgSVNEOjpTRVRPR1Q6CisgIGNhc2UgSVNEOjpTRVRHVDogICByZXR1cm4gWDg2OjpDT05EX0E7CisgIGNhc2UgSVNEOjpTRVRPTEU6ICAgICAgICAgICAgICAvLyBmbGlwcGVkCisgIGNhc2UgSVNEOjpTRVRPR0U6CisgIGNhc2UgSVNEOjpTRVRHRTogICByZXR1cm4gWDg2OjpDT05EX0FFOworICBjYXNlIElTRDo6U0VUVUdUOiAgICAgICAgICAgICAgLy8gZmxpcHBlZAorICBjYXNlIElTRDo6U0VUVUxUOgorICBjYXNlIElTRDo6U0VUTFQ6ICAgcmV0dXJuIFg4Njo6Q09ORF9COworICBjYXNlIElTRDo6U0VUVUdFOiAgICAgICAgICAgICAgLy8gZmxpcHBlZAorICBjYXNlIElTRDo6U0VUVUxFOgorICBjYXNlIElTRDo6U0VUTEU6ICAgcmV0dXJuIFg4Njo6Q09ORF9CRTsKKyAgY2FzZSBJU0Q6OlNFVE9ORToKKyAgY2FzZSBJU0Q6OlNFVE5FOiAgIHJldHVybiBYODY6OkNPTkRfTkU7CisgIGNhc2UgSVNEOjpTRVRVTzogICByZXR1cm4gWDg2OjpDT05EX1A7CisgIGNhc2UgSVNEOjpTRVRPOiAgICByZXR1cm4gWDg2OjpDT05EX05QOworICBjYXNlIElTRDo6U0VUT0VROgorICBjYXNlIElTRDo6U0VUVU5FOiAgcmV0dXJuIFg4Njo6Q09ORF9JTlZBTElEOworICB9Cit9CisKKy8vLyBoYXNGUENNb3YgLSBpcyB0aGVyZSBhIGZsb2F0aW5nIHBvaW50IGNtb3YgZm9yIHRoZSBzcGVjaWZpYyBYODYgY29uZGl0aW9uCisvLy8gY29kZS4gQ3VycmVudCB4ODYgaXNhIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgRlAgY21vdiBpbnN0cnVjdGlvbnM6CisvLy8gZmNtb3ZiLCBmY29tdmJlLCBmY29tdmUsIGZjbW92dSwgZmNtb3ZhZSwgZmNtb3ZhLCBmY21vdm5lLCBmY21vdm51Lgorc3RhdGljIGJvb2wgaGFzRlBDTW92KHVuc2lnbmVkIFg4NkNDKSB7CisgIHN3aXRjaCAoWDg2Q0MpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgWDg2OjpDT05EX0I6CisgIGNhc2UgWDg2OjpDT05EX0JFOgorICBjYXNlIFg4Njo6Q09ORF9FOgorICBjYXNlIFg4Njo6Q09ORF9QOgorICBjYXNlIFg4Njo6Q09ORF9BOgorICBjYXNlIFg4Njo6Q09ORF9BRToKKyAgY2FzZSBYODY6OkNPTkRfTkU6CisgIGNhc2UgWDg2OjpDT05EX05QOgorICAgIHJldHVybiB0cnVlOworICB9Cit9CisKKy8vLyBpc0ZQSW1tTGVnYWwgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBjYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0IHRoZQorLy8vIHNwZWNpZmllZCBGUCBpbW1lZGlhdGUgbmF0aXZlbHkuIElmIGZhbHNlLCB0aGUgbGVnYWxpemVyIHdpbGwKKy8vLyBtYXRlcmlhbGl6ZSB0aGUgRlAgaW1tZWRpYXRlIGFzIGEgbG9hZCBmcm9tIGEgY29uc3RhbnQgcG9vbC4KK2Jvb2wgWDg2VGFyZ2V0TG93ZXJpbmc6OmlzRlBJbW1MZWdhbChjb25zdCBBUEZsb2F0ICZJbW0sIEVWVCBWVCkgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTGVnYWxGUEltbWVkaWF0ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChJbW0uYml0d2lzZUlzRXF1YWwoTGVnYWxGUEltbWVkaWF0ZXNbaV0pKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNVbmRlZk9ySW5SYW5nZSAtIFJldHVybiB0cnVlIGlmIFZhbCBpcyB1bmRlZiBvciBpZiBpdHMgdmFsdWUgZmFsbHMgd2l0aGluCisvLy8gdGhlIHNwZWNpZmllZCByYW5nZSAoTCwgSF0uCitzdGF0aWMgYm9vbCBpc1VuZGVmT3JJblJhbmdlKGludCBWYWwsIGludCBMb3csIGludCBIaSkgeworICByZXR1cm4gKFZhbCA8IDApIHx8IChWYWwgPj0gTG93ICYmIFZhbCA8IEhpKTsKK30KKworLy8vIGlzVW5kZWZPckVxdWFsIC0gVmFsIGlzIGVpdGhlciBsZXNzIHRoYW4gemVybyAodW5kZWYpIG9yIGVxdWFsIHRvIHRoZQorLy8vIHNwZWNpZmllZCB2YWx1ZS4KK3N0YXRpYyBib29sIGlzVW5kZWZPckVxdWFsKGludCBWYWwsIGludCBDbXBWYWwpIHsKKyAgaWYgKFZhbCA8IDAgfHwgVmFsID09IENtcFZhbCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNQU0hVRkRNYXNrIC0gUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0CisvLy8gaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvIFBTSFVGRCBvciBQU0hVRlcuICBUaGF0IGlzLCBpdCBkb2Vzbid0IHJlZmVyZW5jZQorLy8vIHRoZSBzZWNvbmQgb3BlcmFuZC4KK3N0YXRpYyBib29sIGlzUFNIVUZETWFzayhjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaywgRVZUIFZUKSB7CisgIGlmIChWVCA9PSBNVlQ6OnY0ZjMyIHx8IFZUID09IE1WVDo6djRpMzIgfHwgVlQgPT0gTVZUOjp2NGkxNikKKyAgICByZXR1cm4gKE1hc2tbMF0gPCA0ICYmIE1hc2tbMV0gPCA0ICYmIE1hc2tbMl0gPCA0ICYmIE1hc2tbM10gPCA0KTsKKyAgaWYgKFZUID09IE1WVDo6djJmNjQgfHwgVlQgPT0gTVZUOjp2Mmk2NCkKKyAgICByZXR1cm4gKE1hc2tbMF0gPCAyICYmIE1hc2tbMV0gPCAyKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFg4Njo6aXNQU0hVRkRNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pIHsKKyAgU21hbGxWZWN0b3I8aW50LCA4PiBNOworICBOLT5nZXRNYXNrKE0pOworICByZXR1cm4gOjppc1BTSFVGRE1hc2soTSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKK30KKworLy8vIGlzUFNIVUZIV01hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBzcGVjaWZpZXMgYSBzaHVmZmxlIG9mIGVsZW1lbnRzIHRoYXQKKy8vLyBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gUFNIVUZIVy4KK3N0YXRpYyBib29sIGlzUFNIVUZIV01hc2soY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJk1hc2ssIEVWVCBWVCkgeworICBpZiAoVlQgIT0gTVZUOjp2OGkxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gTG93ZXIgcXVhZHdvcmQgY29waWVkIGluIG9yZGVyIG9yIHVuZGVmLgorICBmb3IgKGludCBpID0gMDsgaSAhPSA0OyArK2kpCisgICAgaWYgKE1hc2tbaV0gPj0gMCAmJiBNYXNrW2ldICE9IGkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVXBwZXIgcXVhZHdvcmQgc2h1ZmZsZWQuCisgIGZvciAoaW50IGkgPSA0OyBpICE9IDg7ICsraSkKKyAgICBpZiAoTWFza1tpXSA+PSAwICYmIChNYXNrW2ldIDwgNCB8fCBNYXNrW2ldID4gNykpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWDg2Ojppc1BTSFVGSFdNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pIHsKKyAgU21hbGxWZWN0b3I8aW50LCA4PiBNOworICBOLT5nZXRNYXNrKE0pOworICByZXR1cm4gOjppc1BTSFVGSFdNYXNrKE0sIE4tPmdldFZhbHVlVHlwZSgwKSk7Cit9CisKKy8vLyBpc1BTSFVGTFdNYXNrIC0gUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0CisvLy8gaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvIFBTSFVGTFcuCitzdGF0aWMgYm9vbCBpc1BTSFVGTFdNYXNrKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZNYXNrLCBFVlQgVlQpIHsKKyAgaWYgKFZUICE9IE1WVDo6djhpMTYpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFVwcGVyIHF1YWR3b3JkIGNvcGllZCBpbiBvcmRlci4KKyAgZm9yIChpbnQgaSA9IDQ7IGkgIT0gODsgKytpKQorICAgIGlmIChNYXNrW2ldID49IDAgJiYgTWFza1tpXSAhPSBpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIExvd2VyIHF1YWR3b3JkIHNodWZmbGVkLgorICBmb3IgKGludCBpID0gMDsgaSAhPSA0OyArK2kpCisgICAgaWYgKE1hc2tbaV0gPj0gNCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBYODY6OmlzUFNIVUZMV01hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTikgeworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE07CisgIE4tPmdldE1hc2soTSk7CisgIHJldHVybiA6OmlzUFNIVUZMV01hc2soTSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKK30KKworLy8vIGlzUEFMSUdOUk1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBzcGVjaWZpZXMgYSBzaHVmZmxlIG9mIGVsZW1lbnRzIHRoYXQKKy8vLyBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gUEFMSUdOUi4KK3N0YXRpYyBib29sIGlzUEFMSUdOUk1hc2soY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJk1hc2ssIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNTU1NFMykgeworICBpbnQgaSwgZSA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIAorICAvLyBEbyBub3QgaGFuZGxlIHYyaTY0IC8gdjJmNjQgc2h1ZmZsZXMgd2l0aCBwYWxpZ25yLgorICBpZiAoZSA8IDQgfHwgIWhhc1NTU0UzKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGZvciAoaSA9IDA7IGkgIT0gZTsgKytpKQorICAgIGlmIChNYXNrW2ldID49IDApCisgICAgICBicmVhazsKKyAgCisgIC8vIEFsbCB1bmRlZiwgbm90IGEgcGFsaWduci4KKyAgaWYgKGkgPT0gZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRGV0ZXJtaW5lIGlmIGl0J3Mgb2sgdG8gcGVyZm9ybSBhIHBhbGlnbnIgd2l0aCBvbmx5IHRoZSBMSFMsIHNpbmNlIHdlCisgIC8vIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBhY3R1YWwgc2h1ZmZsZSBlbGVtZW50cyB0byBzZWUgaWYgUkhTIGlzIHVuZGVmLgorICBib29sIFVuYXJ5ID0gTWFza1tpXSA8IChpbnQpZTsKKyAgYm9vbCBOZWVkc1VuYXJ5ID0gZmFsc2U7CisKKyAgaW50IHMgPSBNYXNrW2ldIC0gaTsKKyAgCisgIC8vIENoZWNrIHRoZSByZXN0IG9mIHRoZSBlbGVtZW50cyB0byBzZWUgaWYgdGhleSBhcmUgY29uc2VjdXRpdmUuCisgIGZvciAoKytpOyBpICE9IGU7ICsraSkgeworICAgIGludCBtID0gTWFza1tpXTsKKyAgICBpZiAobSA8IDApIAorICAgICAgY29udGludWU7CisgICAgCisgICAgVW5hcnkgPSBVbmFyeSAmJiAobSA8IChpbnQpZSk7CisgICAgTmVlZHNVbmFyeSA9IE5lZWRzVW5hcnkgfHwgKG0gPCBzKTsKKworICAgIGlmIChOZWVkc1VuYXJ5ICYmICFVbmFyeSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoVW5hcnkgJiYgbSAhPSAoKHMraSkgJiAoZS0xKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFVbmFyeSAmJiBtICE9IChzK2kpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFg4Njo6aXNQQUxJR05STWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOKSB7CisgIFNtYWxsVmVjdG9yPGludCwgOD4gTTsKKyAgTi0+Z2V0TWFzayhNKTsKKyAgcmV0dXJuIDo6aXNQQUxJR05STWFzayhNLCBOLT5nZXRWYWx1ZVR5cGUoMCksIHRydWUpOworfQorCisvLy8gaXNTSFVGUE1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKy8vLyBzcGVjaWZpZXMgYSBzaHVmZmxlIG9mIGVsZW1lbnRzIHRoYXQgaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvIFNIVUZQKi4KK3N0YXRpYyBib29sIGlzU0hVRlBNYXNrKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZNYXNrLCBFVlQgVlQpIHsKKyAgaW50IE51bUVsZW1zID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgaWYgKE51bUVsZW1zICE9IDIgJiYgTnVtRWxlbXMgIT0gNCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IEhhbGYgPSBOdW1FbGVtcyAvIDI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgSGFsZjsgKytpKQorICAgIGlmICghaXNVbmRlZk9ySW5SYW5nZShNYXNrW2ldLCAwLCBOdW1FbGVtcykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIGZvciAoaW50IGkgPSBIYWxmOyBpIDwgTnVtRWxlbXM7ICsraSkKKyAgICBpZiAoIWlzVW5kZWZPckluUmFuZ2UoTWFza1tpXSwgTnVtRWxlbXMsIE51bUVsZW1zKjIpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIFg4Njo6aXNTSFVGUE1hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTikgeworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE07CisgIE4tPmdldE1hc2soTSk7CisgIHJldHVybiA6OmlzU0hVRlBNYXNrKE0sIE4tPmdldFZhbHVlVHlwZSgwKSk7Cit9CisKKy8vLyBpc0NvbW11dGVkU0hVRlAgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNodWZmbGUgbWFzayBpcyBleGFjdGx5CisvLy8gdGhlIHJldmVyc2Ugb2Ygd2hhdCB4ODYgc2h1ZmZsZXMgd2FudC4geDg2IHNodWZmbGVzIHJlcXVpcmVzIHRoZSBsb3dlcgorLy8vIGhhbGYgZWxlbWVudHMgdG8gY29tZSBmcm9tIHZlY3RvciAxICh3aGljaCB3b3VsZCBlcXVhbCB0aGUgZGVzdC4pIGFuZAorLy8vIHRoZSB1cHBlciBoYWxmIHRvIGNvbWUgZnJvbSB2ZWN0b3IgMi4KK3N0YXRpYyBib29sIGlzQ29tbXV0ZWRTSFVGUE1hc2soY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJk1hc2ssIEVWVCBWVCkgeworICBpbnQgTnVtRWxlbXMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworCisgIGlmIChOdW1FbGVtcyAhPSAyICYmIE51bUVsZW1zICE9IDQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludCBIYWxmID0gTnVtRWxlbXMgLyAyOworICBmb3IgKGludCBpID0gMDsgaSA8IEhhbGY7ICsraSkKKyAgICBpZiAoIWlzVW5kZWZPckluUmFuZ2UoTWFza1tpXSwgTnVtRWxlbXMsIE51bUVsZW1zKjIpKQorICAgICAgcmV0dXJuIGZhbHNlOworICBmb3IgKGludCBpID0gSGFsZjsgaSA8IE51bUVsZW1zOyArK2kpCisgICAgaWYgKCFpc1VuZGVmT3JJblJhbmdlKE1hc2tbaV0sIDAsIE51bUVsZW1zKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGlzQ29tbXV0ZWRTSFVGUChTaHVmZmxlVmVjdG9yU0ROb2RlICpOKSB7CisgIFNtYWxsVmVjdG9yPGludCwgOD4gTTsKKyAgTi0+Z2V0TWFzayhNKTsKKyAgcmV0dXJuIGlzQ29tbXV0ZWRTSFVGUE1hc2soTSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKK30KKworLy8vIGlzTU9WSExQU01hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKy8vLyBzcGVjaWZpZXMgYSBzaHVmZmxlIG9mIGVsZW1lbnRzIHRoYXQgaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvIE1PVkhMUFMuCitib29sIFg4Njo6aXNNT1ZITFBTTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOKSB7CisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSAhPSA0KQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBFeHBlY3QgYml0MCA9PSA2LCBiaXQxID09IDcsIGJpdDIgPT0gMiwgYml0MyA9PSAzCisgIHJldHVybiBpc1VuZGVmT3JFcXVhbChOLT5nZXRNYXNrRWx0KDApLCA2KSAmJgorICAgICAgICAgaXNVbmRlZk9yRXF1YWwoTi0+Z2V0TWFza0VsdCgxKSwgNykgJiYKKyAgICAgICAgIGlzVW5kZWZPckVxdWFsKE4tPmdldE1hc2tFbHQoMiksIDIpICYmCisgICAgICAgICBpc1VuZGVmT3JFcXVhbChOLT5nZXRNYXNrRWx0KDMpLCAzKTsKK30KKworLy8vIGlzTU9WSExQU192X3VuZGVmX01hc2sgLSBTcGVjaWFsIGNhc2Ugb2YgaXNNT1ZITFBTTWFzayBmb3IgY2Fub25pY2FsIGZvcm0KKy8vLyBvZiB2ZWN0b3Jfc2h1ZmZsZSB2LCB2LCA8MiwgMywgMiwgMz4sIGkuZS4gdmVjdG9yX3NodWZmbGUgdiwgdW5kZWYsCisvLy8gPDIsIDMsIDIsIDM+Citib29sIFg4Njo6aXNNT1ZITFBTX3ZfdW5kZWZfTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOKSB7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIAorICBpZiAoTnVtRWxlbXMgIT0gNCkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICByZXR1cm4gaXNVbmRlZk9yRXF1YWwoTi0+Z2V0TWFza0VsdCgwKSwgMikgJiYKKyAgaXNVbmRlZk9yRXF1YWwoTi0+Z2V0TWFza0VsdCgxKSwgMykgJiYKKyAgaXNVbmRlZk9yRXF1YWwoTi0+Z2V0TWFza0VsdCgyKSwgMikgJiYKKyAgaXNVbmRlZk9yRXF1YWwoTi0+Z2V0TWFza0VsdCgzKSwgMyk7Cit9CisKKy8vLyBpc01PVkxQTWFzayAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgb3BlcmFuZAorLy8vIHNwZWNpZmllcyBhIHNodWZmbGUgb2YgZWxlbWVudHMgdGhhdCBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gTU9WTFB7U3xEfS4KK2Jvb2wgWDg2Ojppc01PVkxQTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOKSB7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgaWYgKE51bUVsZW1zICE9IDIgJiYgTnVtRWxlbXMgIT0gNCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUVsZW1zLzI7ICsraSkKKyAgICBpZiAoIWlzVW5kZWZPckVxdWFsKE4tPmdldE1hc2tFbHQoaSksIGkgKyBOdW1FbGVtcykpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gTnVtRWxlbXMvMjsgaSA8IE51bUVsZW1zOyArK2kpCisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChOLT5nZXRNYXNrRWx0KGkpLCBpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzTU9WTEhQU01hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKy8vLyBzcGVjaWZpZXMgYSBzaHVmZmxlIG9mIGVsZW1lbnRzIHRoYXQgaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvIE1PVkxIUFMuCitib29sIFg4Njo6aXNNT1ZMSFBTTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOKSB7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgaWYgKE51bUVsZW1zICE9IDIgJiYgTnVtRWxlbXMgIT0gNCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUVsZW1zLzI7ICsraSkKKyAgICBpZiAoIWlzVW5kZWZPckVxdWFsKE4tPmdldE1hc2tFbHQoaSksIGkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1FbGVtcy8yOyArK2kpCisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChOLT5nZXRNYXNrRWx0KGkgKyBOdW1FbGVtcy8yKSwgaSArIE51bUVsZW1zKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzVU5QQ0tMTWFzayAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgb3BlcmFuZAorLy8vIHNwZWNpZmllcyBhIHNodWZmbGUgb2YgZWxlbWVudHMgdGhhdCBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gVU5QQ0tMLgorc3RhdGljIGJvb2wgaXNVTlBDS0xNYXNrKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZNYXNrLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWMklzU3BsYXQgPSBmYWxzZSkgeworICBpbnQgTnVtRWx0cyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIGlmIChOdW1FbHRzICE9IDIgJiYgTnVtRWx0cyAhPSA0ICYmIE51bUVsdHMgIT0gOCAmJiBOdW1FbHRzICE9IDE2KQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKGludCBpID0gMCwgaiA9IDA7IGkgIT0gTnVtRWx0czsgaSArPSAyLCArK2opIHsKKyAgICBpbnQgQml0SSAgPSBNYXNrW2ldOworICAgIGludCBCaXRJMSA9IE1hc2tbaSsxXTsKKyAgICBpZiAoIWlzVW5kZWZPckVxdWFsKEJpdEksIGopKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChWMklzU3BsYXQpIHsKKyAgICAgIGlmICghaXNVbmRlZk9yRXF1YWwoQml0STEsIE51bUVsdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghaXNVbmRlZk9yRXF1YWwoQml0STEsIGogKyBOdW1FbHRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBYODY6OmlzVU5QQ0tMTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOLCBib29sIFYySXNTcGxhdCkgeworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE07CisgIE4tPmdldE1hc2soTSk7CisgIHJldHVybiA6OmlzVU5QQ0tMTWFzayhNLCBOLT5nZXRWYWx1ZVR5cGUoMCksIFYySXNTcGxhdCk7Cit9CisKKy8vLyBpc1VOUENLSE1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKy8vLyBzcGVjaWZpZXMgYSBzaHVmZmxlIG9mIGVsZW1lbnRzIHRoYXQgaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvIFVOUENLSC4KK3N0YXRpYyBib29sIGlzVU5QQ0tITWFzayhjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVjJJc1NwbGF0ID0gZmFsc2UpIHsKKyAgaW50IE51bUVsdHMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBpZiAoTnVtRWx0cyAhPSAyICYmIE51bUVsdHMgIT0gNCAmJiBOdW1FbHRzICE9IDggJiYgTnVtRWx0cyAhPSAxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpICE9IE51bUVsdHM7IGkgKz0gMiwgKytqKSB7CisgICAgaW50IEJpdEkgID0gTWFza1tpXTsKKyAgICBpbnQgQml0STEgPSBNYXNrW2krMV07CisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChCaXRJLCBqICsgTnVtRWx0cy8yKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoVjJJc1NwbGF0KSB7CisgICAgICBpZiAoaXNVbmRlZk9yRXF1YWwoQml0STEsIE51bUVsdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghaXNVbmRlZk9yRXF1YWwoQml0STEsIGogKyBOdW1FbHRzLzIgKyBOdW1FbHRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBYODY6OmlzVU5QQ0tITWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOLCBib29sIFYySXNTcGxhdCkgeworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE07CisgIE4tPmdldE1hc2soTSk7CisgIHJldHVybiA6OmlzVU5QQ0tITWFzayhNLCBOLT5nZXRWYWx1ZVR5cGUoMCksIFYySXNTcGxhdCk7Cit9CisKKy8vLyBpc1VOUENLTF92X3VuZGVmX01hc2sgLSBTcGVjaWFsIGNhc2Ugb2YgaXNVTlBDS0xNYXNrIGZvciBjYW5vbmljYWwgZm9ybQorLy8vIG9mIHZlY3Rvcl9zaHVmZmxlIHYsIHYsIDwwLCA0LCAxLCA1PiwgaS5lLiB2ZWN0b3Jfc2h1ZmZsZSB2LCB1bmRlZiwKKy8vLyA8MCwgMCwgMSwgMT4KK3N0YXRpYyBib29sIGlzVU5QQ0tMX3ZfdW5kZWZfTWFzayhjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaywgRVZUIFZUKSB7CisgIGludCBOdW1FbGVtcyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIGlmIChOdW1FbGVtcyAhPSAyICYmIE51bUVsZW1zICE9IDQgJiYgTnVtRWxlbXMgIT0gOCAmJiBOdW1FbGVtcyAhPSAxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpICE9IE51bUVsZW1zOyBpICs9IDIsICsraikgeworICAgIGludCBCaXRJICA9IE1hc2tbaV07CisgICAgaW50IEJpdEkxID0gTWFza1tpKzFdOworICAgIGlmICghaXNVbmRlZk9yRXF1YWwoQml0SSwgaikpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChCaXRJMSwgaikpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWDg2Ojppc1VOUENLTF92X3VuZGVmX01hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTikgeworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE07CisgIE4tPmdldE1hc2soTSk7CisgIHJldHVybiA6OmlzVU5QQ0tMX3ZfdW5kZWZfTWFzayhNLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworfQorCisvLy8gaXNVTlBDS0hfdl91bmRlZl9NYXNrIC0gU3BlY2lhbCBjYXNlIG9mIGlzVU5QQ0tITWFzayBmb3IgY2Fub25pY2FsIGZvcm0KKy8vLyBvZiB2ZWN0b3Jfc2h1ZmZsZSB2LCB2LCA8MiwgNiwgMywgNz4sIGkuZS4gdmVjdG9yX3NodWZmbGUgdiwgdW5kZWYsCisvLy8gPDIsIDIsIDMsIDM+CitzdGF0aWMgYm9vbCBpc1VOUENLSF92X3VuZGVmX01hc2soY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJk1hc2ssIEVWVCBWVCkgeworICBpbnQgTnVtRWxlbXMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBpZiAoTnVtRWxlbXMgIT0gMiAmJiBOdW1FbGVtcyAhPSA0ICYmIE51bUVsZW1zICE9IDggJiYgTnVtRWxlbXMgIT0gMTYpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoaW50IGkgPSAwLCBqID0gTnVtRWxlbXMgLyAyOyBpICE9IE51bUVsZW1zOyBpICs9IDIsICsraikgeworICAgIGludCBCaXRJICA9IE1hc2tbaV07CisgICAgaW50IEJpdEkxID0gTWFza1tpKzFdOworICAgIGlmICghaXNVbmRlZk9yRXF1YWwoQml0SSwgaikpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChCaXRJMSwgaikpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWDg2Ojppc1VOUENLSF92X3VuZGVmX01hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTikgeworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE07CisgIE4tPmdldE1hc2soTSk7CisgIHJldHVybiA6OmlzVU5QQ0tIX3ZfdW5kZWZfTWFzayhNLCBOLT5nZXRWYWx1ZVR5cGUoMCkpOworfQorCisvLy8gaXNNT1ZMTWFzayAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgb3BlcmFuZAorLy8vIHNwZWNpZmllcyBhIHNodWZmbGUgb2YgZWxlbWVudHMgdGhhdCBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gTU9WU1MsCisvLy8gTU9WU0QsIGFuZCBNT1ZELCBpLmUuIHNldHRpbmcgdGhlIGxvd2VzdCBlbGVtZW50Lgorc3RhdGljIGJvb2wgaXNNT1ZMTWFzayhjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaywgRVZUIFZUKSB7CisgIGlmIChWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKSA8IDMyKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbnQgTnVtRWx0cyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgaWYgKCFpc1VuZGVmT3JFcXVhbChNYXNrWzBdLCBOdW1FbHRzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1FbHRzOyArK2kpCisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChNYXNrW2ldLCBpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBYODY6OmlzTU9WTE1hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTikgeworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE07CisgIE4tPmdldE1hc2soTSk7CisgIHJldHVybiA6OmlzTU9WTE1hc2soTSwgTi0+Z2V0VmFsdWVUeXBlKDApKTsKK30KKworLy8vIGlzQ29tbXV0ZWRNT1ZMIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzaHVmZmxlIG1hc2sgaXMgZXhjZXB0IHRoZSByZXZlcnNlCisvLy8gb2Ygd2hhdCB4ODYgbW92c3Mgd2FudC4gWDg2IG1vdnMgcmVxdWlyZXMgdGhlIGxvd2VzdCAgZWxlbWVudCB0byBiZSBsb3dlc3QKKy8vLyBlbGVtZW50IG9mIHZlY3RvciAyIGFuZCB0aGUgb3RoZXIgZWxlbWVudHMgdG8gY29tZSBmcm9tIHZlY3RvciAxIGluIG9yZGVyLgorc3RhdGljIGJvb2wgaXNDb21tdXRlZE1PVkxNYXNrKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZNYXNrLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWMklzU3BsYXQgPSBmYWxzZSwgYm9vbCBWMklzVW5kZWYgPSBmYWxzZSkgeworICBpbnQgTnVtT3BzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgaWYgKE51bU9wcyAhPSAyICYmIE51bU9wcyAhPSA0ICYmIE51bU9wcyAhPSA4ICYmIE51bU9wcyAhPSAxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFpc1VuZGVmT3JFcXVhbChNYXNrWzBdLCAwKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1PcHM7ICsraSkKKyAgICBpZiAoIShpc1VuZGVmT3JFcXVhbChNYXNrW2ldLCBpK051bU9wcykgfHwKKyAgICAgICAgICAoVjJJc1VuZGVmICYmIGlzVW5kZWZPckluUmFuZ2UoTWFza1tpXSwgTnVtT3BzLCBOdW1PcHMqMikpIHx8CisgICAgICAgICAgKFYySXNTcGxhdCAmJiBpc1VuZGVmT3JFcXVhbChNYXNrW2ldLCBOdW1PcHMpKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGlzQ29tbXV0ZWRNT1ZMKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4sIGJvb2wgVjJJc1NwbGF0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFYySXNVbmRlZiA9IGZhbHNlKSB7CisgIFNtYWxsVmVjdG9yPGludCwgOD4gTTsKKyAgTi0+Z2V0TWFzayhNKTsKKyAgcmV0dXJuIGlzQ29tbXV0ZWRNT1ZMTWFzayhNLCBOLT5nZXRWYWx1ZVR5cGUoMCksIFYySXNTcGxhdCwgVjJJc1VuZGVmKTsKK30KKworLy8vIGlzTU9WU0hEVVBNYXNrIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBWRUNUT1JfU0hVRkZMRSBvcGVyYW5kCisvLy8gc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0IGlzIHN1aXRhYmxlIGZvciBpbnB1dCB0byBNT1ZTSERVUC4KK2Jvb2wgWDg2Ojppc01PVlNIRFVQTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOKSB7CisgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSAhPSA0KQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBFeHBlY3QgMSwgMSwgMywgMworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgaW50IEVsdCA9IE4tPmdldE1hc2tFbHQoaSk7CisgICAgaWYgKEVsdCA+PSAwICYmIEVsdCAhPSAxKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBIYXNIaSA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAyOyBpIDwgNDsgKytpKSB7CisgICAgaW50IEVsdCA9IE4tPmdldE1hc2tFbHQoaSk7CisgICAgaWYgKEVsdCA+PSAwICYmIEVsdCAhPSAzKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChFbHQgPT0gMykKKyAgICAgIEhhc0hpID0gdHJ1ZTsKKyAgfQorICAvLyBEb24ndCB1c2UgbW92c2hkdXAgaWYgaXQgY2FuIGJlIGRvbmUgd2l0aCBhIHNodWZwcy4KKyAgLy8gRklYTUU6IHZlcmlmeSB0aGF0IG1hdGNoaW5nIHUsIHUsIDMsIDMgaXMgd2hhdCB3ZSB3YW50LgorICByZXR1cm4gSGFzSGk7Cit9CisKKy8vLyBpc01PVlNMRFVQTWFzayAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgb3BlcmFuZAorLy8vIHNwZWNpZmllcyBhIHNodWZmbGUgb2YgZWxlbWVudHMgdGhhdCBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gTU9WU0xEVVAuCitib29sIFg4Njo6aXNNT1ZTTERVUE1hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTikgeworICBpZiAoTi0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3Rvck51bUVsZW1lbnRzKCkgIT0gNCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRXhwZWN0IDAsIDAsIDIsIDIKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDI7ICsraSkKKyAgICBpZiAoTi0+Z2V0TWFza0VsdChpKSA+IDApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBIYXNIaSA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAyOyBpIDwgNDsgKytpKSB7CisgICAgaW50IEVsdCA9IE4tPmdldE1hc2tFbHQoaSk7CisgICAgaWYgKEVsdCA+PSAwICYmIEVsdCAhPSAyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChFbHQgPT0gMikKKyAgICAgIEhhc0hpID0gdHJ1ZTsKKyAgfQorICAvLyBEb24ndCB1c2UgbW92c2xkdXAgaWYgaXQgY2FuIGJlIGRvbmUgd2l0aCBhIHNodWZwcy4KKyAgcmV0dXJuIEhhc0hpOworfQorCisvLy8gaXNNT1ZERFVQTWFzayAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgb3BlcmFuZAorLy8vIHNwZWNpZmllcyBhIHNodWZmbGUgb2YgZWxlbWVudHMgdGhhdCBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gTU9WRERVUC4KK2Jvb2wgWDg2Ojppc01PVkREVVBNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pIHsKKyAgaW50IGUgPSBOLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSAvIDI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlOyArK2kpCisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChOLT5nZXRNYXNrRWx0KGkpLCBpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlOyArK2kpCisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChOLT5nZXRNYXNrRWx0KGUraSksIGkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGdldFNodWZmbGVTSFVGSW1tZWRpYXRlIC0gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBpbW1lZGlhdGUgdG8gc2h1ZmZsZQorLy8vIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgbWFzayB3aXRoIFBTSFVGKiBhbmQgU0hVRlAqIGluc3RydWN0aW9ucy4KK3Vuc2lnbmVkIFg4Njo6Z2V0U2h1ZmZsZVNIVUZJbW1lZGlhdGUoU0ROb2RlICpOKSB7CisgIFNodWZmbGVWZWN0b3JTRE5vZGUgKlNWT3AgPSBjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pOworICBpbnQgTnVtT3BlcmFuZHMgPSBTVk9wLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKworICB1bnNpZ25lZCBTaGlmdCA9IChOdW1PcGVyYW5kcyA9PSA0KSA/IDIgOiAxOworICB1bnNpZ25lZCBNYXNrID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1PcGVyYW5kczsgKytpKSB7CisgICAgaW50IFZhbCA9IFNWT3AtPmdldE1hc2tFbHQoTnVtT3BlcmFuZHMtaS0xKTsKKyAgICBpZiAoVmFsIDwgMCkgVmFsID0gMDsKKyAgICBpZiAoVmFsID49IE51bU9wZXJhbmRzKSBWYWwgLT0gTnVtT3BlcmFuZHM7CisgICAgTWFzayB8PSBWYWw7CisgICAgaWYgKGkgIT0gTnVtT3BlcmFuZHMgLSAxKQorICAgICAgTWFzayA8PD0gU2hpZnQ7CisgIH0KKyAgcmV0dXJuIE1hc2s7Cit9CisKKy8vLyBnZXRTaHVmZmxlUFNIVUZIV0ltbWVkaWF0ZSAtIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW1tZWRpYXRlIHRvIHNodWZmbGUKKy8vLyB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG1hc2sgd2l0aCB0aGUgUFNIVUZIVyBpbnN0cnVjdGlvbi4KK3Vuc2lnbmVkIFg4Njo6Z2V0U2h1ZmZsZVBTSFVGSFdJbW1lZGlhdGUoU0ROb2RlICpOKSB7CisgIFNodWZmbGVWZWN0b3JTRE5vZGUgKlNWT3AgPSBjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pOworICB1bnNpZ25lZCBNYXNrID0gMDsKKyAgLy8gOCBub2RlcywgYnV0IHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgbGFzdCA0LgorICBmb3IgKHVuc2lnbmVkIGkgPSA3OyBpID49IDQ7IC0taSkgeworICAgIGludCBWYWwgPSBTVk9wLT5nZXRNYXNrRWx0KGkpOworICAgIGlmIChWYWwgPj0gMCkKKyAgICAgIE1hc2sgfD0gKFZhbCAtIDQpOworICAgIGlmIChpICE9IDQpCisgICAgICBNYXNrIDw8PSAyOworICB9CisgIHJldHVybiBNYXNrOworfQorCisvLy8gZ2V0U2h1ZmZsZVBTSFVGTFdJbW1lZGlhdGUgLSBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGltbWVkaWF0ZSB0byBzaHVmZmxlCisvLy8gdGhlIHNwZWNpZmllZCBWRUNUT1JfU0hVRkZMRSBtYXNrIHdpdGggdGhlIFBTSFVGTFcgaW5zdHJ1Y3Rpb24uCit1bnNpZ25lZCBYODY6OmdldFNodWZmbGVQU0hVRkxXSW1tZWRpYXRlKFNETm9kZSAqTikgeworICBTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk9wID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKTsKKyAgdW5zaWduZWQgTWFzayA9IDA7CisgIC8vIDggbm9kZXMsIGJ1dCB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IDQuCisgIGZvciAoaW50IGkgPSAzOyBpID49IDA7IC0taSkgeworICAgIGludCBWYWwgPSBTVk9wLT5nZXRNYXNrRWx0KGkpOworICAgIGlmIChWYWwgPj0gMCkKKyAgICAgIE1hc2sgfD0gVmFsOworICAgIGlmIChpICE9IDApCisgICAgICBNYXNrIDw8PSAyOworICB9CisgIHJldHVybiBNYXNrOworfQorCisvLy8gZ2V0U2h1ZmZsZVBBTElHTlJJbW1lZGlhdGUgLSBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGltbWVkaWF0ZSB0byBzaHVmZmxlCisvLy8gdGhlIHNwZWNpZmllZCBWRUNUT1JfU0hVRkZMRSBtYXNrIHdpdGggdGhlIFBBTElHTlIgaW5zdHJ1Y3Rpb24uCit1bnNpZ25lZCBYODY6OmdldFNodWZmbGVQQUxJR05SSW1tZWRpYXRlKFNETm9kZSAqTikgeworICBTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk9wID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKTsKKyAgRVZUIFZWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgdW5zaWduZWQgRWx0U2l6ZSA9IFZWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKSA+PiAzOworICBpbnQgVmFsID0gMDsKKworICB1bnNpZ25lZCBpLCBlOworICBmb3IgKGkgPSAwLCBlID0gVlZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgVmFsID0gU1ZPcC0+Z2V0TWFza0VsdChpKTsKKyAgICBpZiAoVmFsID49IDApCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gKFZhbCAtIGkpICogRWx0U2l6ZTsKK30KKworLy8vIGlzWmVyb05vZGUgLSBSZXR1cm5zIHRydWUgaWYgRWx0IGlzIGEgY29uc3RhbnQgemVybyBvciBhIGZsb2F0aW5nIHBvaW50CisvLy8gY29uc3RhbnQgKzAuMC4KK2Jvb2wgWDg2Ojppc1plcm9Ob2RlKFNEVmFsdWUgRWx0KSB7CisgIHJldHVybiAoKGlzYTxDb25zdGFudFNETm9kZT4oRWx0KSAmJgorICAgICAgICAgICBjYXN0PENvbnN0YW50U0ROb2RlPihFbHQpLT5pc051bGxWYWx1ZSgpKSB8fAorICAgICAgICAgIChpc2E8Q29uc3RhbnRGUFNETm9kZT4oRWx0KSAmJgorICAgICAgICAgICBjYXN0PENvbnN0YW50RlBTRE5vZGU+KEVsdCktPmdldFZhbHVlQVBGKCkuaXNQb3NaZXJvKCkpKTsKK30KKworLy8vIENvbW11dGVWZWN0b3JTaHVmZmxlIC0gU3dhcCB2ZWN0b3Jfc2h1ZmZsZSBvcGVyYW5kcyBhcyB3ZWxsIGFzIHZhbHVlcyBpbgorLy8vIHRoZWlyIHBlcm11dGUgbWFzay4KK3N0YXRpYyBTRFZhbHVlIENvbW11dGVWZWN0b3JTaHVmZmxlKFNodWZmbGVWZWN0b3JTRE5vZGUgKlNWT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgeworICBFVlQgVlQgPSBTVk9wLT5nZXRWYWx1ZVR5cGUoMCk7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgU21hbGxWZWN0b3I8aW50LCA4PiBNYXNrVmVjOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWxlbXM7ICsraSkgeworICAgIGludCBpZHggPSBTVk9wLT5nZXRNYXNrRWx0KGkpOworICAgIGlmIChpZHggPCAwKQorICAgICAgTWFza1ZlYy5wdXNoX2JhY2soaWR4KTsKKyAgICBlbHNlIGlmIChpZHggPCAoaW50KU51bUVsZW1zKQorICAgICAgTWFza1ZlYy5wdXNoX2JhY2soaWR4ICsgTnVtRWxlbXMpOworICAgIGVsc2UKKyAgICAgIE1hc2tWZWMucHVzaF9iYWNrKGlkeCAtIE51bUVsZW1zKTsKKyAgfQorICByZXR1cm4gREFHLmdldFZlY3RvclNodWZmbGUoVlQsIFNWT3AtPmdldERlYnVnTG9jKCksIFNWT3AtPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVk9wLT5nZXRPcGVyYW5kKDApLCAmTWFza1ZlY1swXSk7Cit9CisKKy8vLyBDb21tdXRlVmVjdG9yU2h1ZmZsZU1hc2sgLSBDaGFuZ2UgdmFsdWVzIGluIGEgc2h1ZmZsZSBwZXJtdXRlIG1hc2sgYXNzdW1pbmcKKy8vLyB0aGUgdHdvIHZlY3RvciBvcGVyYW5kcyBoYXZlIHN3YXBwZWQgcG9zaXRpb24uCitzdGF0aWMgdm9pZCBDb21tdXRlVmVjdG9yU2h1ZmZsZU1hc2soU21hbGxWZWN0b3JJbXBsPGludD4gJk1hc2ssIEVWVCBWVCkgeworICB1bnNpZ25lZCBOdW1FbGVtcyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWxlbXM7ICsraSkgeworICAgIGludCBpZHggPSBNYXNrW2ldOworICAgIGlmIChpZHggPCAwKQorICAgICAgY29udGludWU7CisgICAgZWxzZSBpZiAoaWR4IDwgKGludClOdW1FbGVtcykKKyAgICAgIE1hc2tbaV0gPSBpZHggKyBOdW1FbGVtczsKKyAgICBlbHNlCisgICAgICBNYXNrW2ldID0gaWR4IC0gTnVtRWxlbXM7CisgIH0KK30KKworLy8vIFNob3VsZFhmb3JtVG9NT1ZITFBTIC0gUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIHRvCisvLy8gbWF0Y2ggbW92aGxwcy4gVGhlIGxvd2VyIGhhbGYgZWxlbWVudHMgc2hvdWxkIGNvbWUgZnJvbSB1cHBlciBoYWxmIG9mCisvLy8gVjEgKGFuZCBpbiBvcmRlciksIGFuZCB0aGUgdXBwZXIgaGFsZiBlbGVtZW50cyBzaG91bGQgY29tZSBmcm9tIHRoZSB1cHBlcgorLy8vIGhhbGYgb2YgVjIgKGFuZCBpbiBvcmRlcikuCitzdGF0aWMgYm9vbCBTaG91bGRYZm9ybVRvTU9WSExQUyhTaHVmZmxlVmVjdG9yU0ROb2RlICpPcCkgeworICBpZiAoT3AtPmdldFZhbHVlVHlwZSgwKS5nZXRWZWN0b3JOdW1FbGVtZW50cygpICE9IDQpCisgICAgcmV0dXJuIGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gMjsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChPcC0+Z2V0TWFza0VsdChpKSwgaSsyKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMjsgaSAhPSA0OyArK2kpCisgICAgaWYgKCFpc1VuZGVmT3JFcXVhbChPcC0+Z2V0TWFza0VsdChpKSwgaSs0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1NjYWxhckxvYWRUb1ZlY3RvciAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIHNjYWxhciBsb2FkIHRoYXQKKy8vLyBpcyBwcm9tb3RlZCB0byBhIHZlY3Rvci4gSXQgYWxzbyByZXR1cm5zIHRoZSBMb2FkU0ROb2RlIGJ5IHJlZmVyZW5jZSBpZgorLy8vIHJlcXVpcmVkLgorc3RhdGljIGJvb2wgaXNTY2FsYXJMb2FkVG9WZWN0b3IoU0ROb2RlICpOLCBMb2FkU0ROb2RlICoqTEQgPSBOVUxMKSB7CisgIGlmIChOLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNDQUxBUl9UT19WRUNUT1IpCisgICAgcmV0dXJuIGZhbHNlOworICBOID0gTi0+Z2V0T3BlcmFuZCgwKS5nZXROb2RlKCk7CisgIGlmICghSVNEOjppc05PTl9FWFRMb2FkKE4pKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKExEKQorICAgICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oTik7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gU2hvdWxkWGZvcm1Ub01PVkxQe1N8RH0gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgdHJhbnNmb3JtZWQgdG8KKy8vLyBtYXRjaCBtb3ZscHtzfGR9LiBUaGUgbG93ZXIgaGFsZiBlbGVtZW50cyBzaG91bGQgY29tZSBmcm9tIGxvd2VyIGhhbGYgb2YKKy8vLyBWMSAoYW5kIGluIG9yZGVyKSwgYW5kIHRoZSB1cHBlciBoYWxmIGVsZW1lbnRzIHNob3VsZCBjb21lIGZyb20gdGhlIHVwcGVyCisvLy8gaGFsZiBvZiBWMiAoYW5kIGluIG9yZGVyKS4gQW5kIHNpbmNlIFYxIHdpbGwgYmVjb21lIHRoZSBzb3VyY2Ugb2YgdGhlCisvLy8gTU9WTFAsIGl0IG11c3QgYmUgZWl0aGVyIGEgdmVjdG9yIGxvYWQgb3IgYSBzY2FsYXIgbG9hZCB0byB2ZWN0b3IuCitzdGF0aWMgYm9vbCBTaG91bGRYZm9ybVRvTU9WTFAoU0ROb2RlICpWMSwgU0ROb2RlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaHVmZmxlVmVjdG9yU0ROb2RlICpPcCkgeworICBpZiAoIUlTRDo6aXNOT05fRVhUTG9hZChWMSkgJiYgIWlzU2NhbGFyTG9hZFRvVmVjdG9yKFYxKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIC8vIElzIFYyIGlzIGEgdmVjdG9yIGxvYWQsIGRvbid0IGRvIHRoaXMgdHJhbnNmb3JtYXRpb24uIFdlIHdpbGwgdHJ5IHRvIHVzZQorICAvLyBsb2FkIGZvbGRpbmcgc2h1ZnBzIG9wLgorICBpZiAoSVNEOjppc05PTl9FWFRMb2FkKFYyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgTnVtRWxlbXMgPSBPcC0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgaWYgKE51bUVsZW1zICE9IDIgJiYgTnVtRWxlbXMgIT0gNCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1FbGVtcy8yOyBpICE9IGU7ICsraSkKKyAgICBpZiAoIWlzVW5kZWZPckVxdWFsKE9wLT5nZXRNYXNrRWx0KGkpLCBpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gTnVtRWxlbXMvMjsgaSAhPSBOdW1FbGVtczsgKytpKQorICAgIGlmICghaXNVbmRlZk9yRXF1YWwoT3AtPmdldE1hc2tFbHQoaSksIGkrTnVtRWxlbXMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzU3BsYXRWZWN0b3IgLSBSZXR1cm5zIHRydWUgaWYgTiBpcyBhIEJVSUxEX1ZFQ1RPUiBub2RlIHdob3NlIGVsZW1lbnRzIGFyZQorLy8vIGFsbCB0aGUgc2FtZS4KK3N0YXRpYyBib29sIGlzU3BsYXRWZWN0b3IoU0ROb2RlICpOKSB7CisgIGlmIChOLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OkJVSUxEX1ZFQ1RPUikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU0RWYWx1ZSBTcGxhdFZhbHVlID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChOLT5nZXRPcGVyYW5kKGkpICE9IFNwbGF0VmFsdWUpCisgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gaXNaZXJvU2h1ZmZsZSAtIFJldHVybnMgdHJ1ZSBpZiBOIGlzIGEgVkVDVE9SX1NIVUZGTEUgdGhhdCBjYW4gYmUgcmVzb2x2ZWQKKy8vLyB0byBhbiB6ZXJvIHZlY3Rvci4KKy8vLyBGSVhNRTogbW92ZSB0byBkYWcgY29tYmluZXIgLyBtZXRob2Qgb24gU2h1ZmZsZVZlY3RvclNETm9kZQorc3RhdGljIGJvb2wgaXNaZXJvU2h1ZmZsZShTaHVmZmxlVmVjdG9yU0ROb2RlICpOKSB7CisgIFNEVmFsdWUgVjEgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFYyID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgdW5zaWduZWQgTnVtRWxlbXMgPSBOLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbGVtczsgKytpKSB7CisgICAgaW50IElkeCA9IE4tPmdldE1hc2tFbHQoaSk7CisgICAgaWYgKElkeCA+PSAoaW50KU51bUVsZW1zKSB7CisgICAgICB1bnNpZ25lZCBPcGMgPSBWMi5nZXRPcGNvZGUoKTsKKyAgICAgIGlmIChPcGMgPT0gSVNEOjpVTkRFRiB8fCBJU0Q6OmlzQnVpbGRWZWN0b3JBbGxaZXJvcyhWMi5nZXROb2RlKCkpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChPcGMgIT0gSVNEOjpCVUlMRF9WRUNUT1IgfHwKKyAgICAgICAgICAhWDg2Ojppc1plcm9Ob2RlKFYyLmdldE9wZXJhbmQoSWR4LU51bUVsZW1zKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKElkeCA+PSAwKSB7CisgICAgICB1bnNpZ25lZCBPcGMgPSBWMS5nZXRPcGNvZGUoKTsKKyAgICAgIGlmIChPcGMgPT0gSVNEOjpVTkRFRiB8fCBJU0Q6OmlzQnVpbGRWZWN0b3JBbGxaZXJvcyhWMS5nZXROb2RlKCkpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChPcGMgIT0gSVNEOjpCVUlMRF9WRUNUT1IgfHwKKyAgICAgICAgICAhWDg2Ojppc1plcm9Ob2RlKFYxLmdldE9wZXJhbmQoSWR4KSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBnZXRaZXJvVmVjdG9yIC0gUmV0dXJucyBhIHZlY3RvciBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIGFsbCB6ZXJvIGVsZW1lbnRzLgorLy8vCitzdGF0aWMgU0RWYWx1ZSBnZXRaZXJvVmVjdG9yKEVWVCBWVCwgYm9vbCBIYXNTU0UyLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwpIHsKKyAgYXNzZXJ0KFZULmlzVmVjdG9yKCkgJiYgIkV4cGVjdGVkIGEgdmVjdG9yIHR5cGUiKTsKKworICAvLyBBbHdheXMgYnVpbGQgemVybyB2ZWN0b3JzIGFzIDw0IHggaTMyPiBvciA8MiB4IGkzMj4gYml0Y2FzdGVkIHRvIHRoZWlyIGRlc3QKKyAgLy8gdHlwZS4gIFRoaXMgZW5zdXJlcyB0aGV5IGdldCBDU0UnZC4KKyAgU0RWYWx1ZSBWZWM7CisgIGlmIChWVC5nZXRTaXplSW5CaXRzKCkgPT0gNjQpIHsgLy8gTU1YCisgICAgU0RWYWx1ZSBDc3QgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIFZlYyA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgTVZUOjp2MmkzMiwgQ3N0LCBDc3QpOworICB9IGVsc2UgaWYgKEhhc1NTRTIpIHsgIC8vIFNTRTIKKyAgICBTRFZhbHVlIENzdCA9IERBRy5nZXRUYXJnZXRDb25zdGFudCgwLCBNVlQ6OmkzMik7CisgICAgVmVjID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLCBDc3QsIENzdCwgQ3N0LCBDc3QpOworICB9IGVsc2UgeyAvLyBTU0UxCisgICAgU0RWYWx1ZSBDc3QgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRGUCgrMC4wLCBNVlQ6OmYzMik7CisgICAgVmVjID0gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBNVlQ6OnY0ZjMyLCBDc3QsIENzdCwgQ3N0LCBDc3QpOworICB9CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsIFZlYyk7Cit9CisKKy8vLyBnZXRPbmVzVmVjdG9yIC0gUmV0dXJucyBhIHZlY3RvciBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIGFsbCBiaXRzIHNldC4KKy8vLworc3RhdGljIFNEVmFsdWUgZ2V0T25lc1ZlY3RvcihFVlQgVlQsIFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCkgeworICBhc3NlcnQoVlQuaXNWZWN0b3IoKSAmJiAiRXhwZWN0ZWQgYSB2ZWN0b3IgdHlwZSIpOworCisgIC8vIEFsd2F5cyBidWlsZCBvbmVzIHZlY3RvcnMgYXMgPDQgeCBpMzI+IG9yIDwyIHggaTMyPiBiaXRjYXN0ZWQgdG8gdGhlaXIgZGVzdAorICAvLyB0eXBlLiAgVGhpcyBlbnN1cmVzIHRoZXkgZ2V0IENTRSdkLgorICBTRFZhbHVlIENzdCA9IERBRy5nZXRUYXJnZXRDb25zdGFudCh+MFUsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBWZWM7CisgIGlmIChWVC5nZXRTaXplSW5CaXRzKCkgPT0gNjQpICAvLyBNTVgKKyAgICBWZWMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djJpMzIsIENzdCwgQ3N0KTsKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTU0UKKyAgICBWZWMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIE1WVDo6djRpMzIsIENzdCwgQ3N0LCBDc3QsIENzdCk7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsIFZlYyk7Cit9CisKKworLy8vIE5vcm1hbGl6ZU1hc2sgLSBWMiBpcyBhIHNwbGF0LCBtb2RpZnkgdGhlIG1hc2sgKGlmIG5lZWRlZCkgc28gYWxsIGVsZW1lbnRzCisvLy8gdGhhdCBwb2ludCB0byBWMiBwb2ludHMgdG8gaXRzIGZpcnN0IGVsZW1lbnQuCitzdGF0aWMgU0RWYWx1ZSBOb3JtYWxpemVNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKlNWT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIEVWVCBWVCA9IFNWT3AtPmdldFZhbHVlVHlwZSgwKTsKKyAgdW5zaWduZWQgTnVtRWxlbXMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworCisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE1hc2tWZWM7CisgIFNWT3AtPmdldE1hc2soTWFza1ZlYyk7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbGVtczsgKytpKSB7CisgICAgaWYgKE1hc2tWZWNbaV0gPiAoaW50KU51bUVsZW1zKSB7CisgICAgICBNYXNrVmVjW2ldID0gTnVtRWxlbXM7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgaWYgKENoYW5nZWQpCisgICAgcmV0dXJuIERBRy5nZXRWZWN0b3JTaHVmZmxlKFZULCBTVk9wLT5nZXREZWJ1Z0xvYygpLCBTVk9wLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVk9wLT5nZXRPcGVyYW5kKDEpLCAmTWFza1ZlY1swXSk7CisgIHJldHVybiBTRFZhbHVlKFNWT3AsIDApOworfQorCisvLy8gZ2V0TU9WTE1hc2sgLSBSZXR1cm5zIGEgdmVjdG9yX3NodWZmbGUgbWFzayBmb3IgYW4gbW92c3tzfGR9LCBtb3ZkCisvLy8gb3BlcmF0aW9uIG9mIHNwZWNpZmllZCB3aWR0aC4KK3N0YXRpYyBTRFZhbHVlIGdldE1PVkwoU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsLCBFVlQgVlQsIFNEVmFsdWUgVjEsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgVjIpIHsKKyAgdW5zaWduZWQgTnVtRWxlbXMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE1hc2s7CisgIE1hc2sucHVzaF9iYWNrKE51bUVsZW1zKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBOdW1FbGVtczsgKytpKQorICAgIE1hc2sucHVzaF9iYWNrKGkpOworICByZXR1cm4gREFHLmdldFZlY3RvclNodWZmbGUoVlQsIGRsLCBWMSwgVjIsICZNYXNrWzBdKTsKK30KKworLy8vIGdldFVucGFja2wgLSBSZXR1cm5zIGEgdmVjdG9yX3NodWZmbGUgbm9kZSBmb3IgYW4gdW5wYWNrbCBvcGVyYXRpb24uCitzdGF0aWMgU0RWYWx1ZSBnZXRVbnBhY2tsKFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCwgRVZUIFZULCBTRFZhbHVlIFYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFYyKSB7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgU21hbGxWZWN0b3I8aW50LCA4PiBNYXNrOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtRWxlbXMvMjsgaSAhPSBlOyArK2kpIHsKKyAgICBNYXNrLnB1c2hfYmFjayhpKTsKKyAgICBNYXNrLnB1c2hfYmFjayhpICsgTnVtRWxlbXMpOworICB9CisgIHJldHVybiBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShWVCwgZGwsIFYxLCBWMiwgJk1hc2tbMF0pOworfQorCisvLy8gZ2V0VW5wYWNraE1hc2sgLSBSZXR1cm5zIGEgdmVjdG9yX3NodWZmbGUgbm9kZSBmb3IgYW4gdW5wYWNraCBvcGVyYXRpb24uCitzdGF0aWMgU0RWYWx1ZSBnZXRVbnBhY2toKFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCwgRVZUIFZULCBTRFZhbHVlIFYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFYyKSB7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgdW5zaWduZWQgSGFsZiA9IE51bUVsZW1zLzI7CisgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFzazsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBIYWxmOyArK2kpIHsKKyAgICBNYXNrLnB1c2hfYmFjayhpICsgSGFsZik7CisgICAgTWFzay5wdXNoX2JhY2soaSArIE51bUVsZW1zICsgSGFsZik7CisgIH0KKyAgcmV0dXJuIERBRy5nZXRWZWN0b3JTaHVmZmxlKFZULCBkbCwgVjEsIFYyLCAmTWFza1swXSk7Cit9CisKKy8vLyBQcm9tb3RlU3BsYXQgLSBQcm9tb3RlIGEgc3BsYXQgb2YgdjRmMzIsIHY4aTE2IG9yIHYxNmk4IHRvIHY0aTMyLgorc3RhdGljIFNEVmFsdWUgUHJvbW90ZVNwbGF0KFNodWZmbGVWZWN0b3JTRE5vZGUgKlNWLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1NTRTIpIHsKKyAgaWYgKFNWLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA8PSA0KQorICAgIHJldHVybiBTRFZhbHVlKFNWLCAwKTsKKworICBFVlQgUFZUID0gTVZUOjp2NGYzMjsKKyAgRVZUIFZUID0gU1YtPmdldFZhbHVlVHlwZSgwKTsKKyAgRGVidWdMb2MgZGwgPSBTVi0+Z2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBWMSA9IFNWLT5nZXRPcGVyYW5kKDApOworICBpbnQgTnVtRWxlbXMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBpbnQgRWx0Tm8gPSBTVi0+Z2V0U3BsYXRJbmRleCgpOworCisgIC8vIHVucGFjayBlbGVtZW50cyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbgorICB3aGlsZSAoTnVtRWxlbXMgPiA0KSB7CisgICAgaWYgKEVsdE5vIDwgTnVtRWxlbXMvMikgeworICAgICAgVjEgPSBnZXRVbnBhY2tsKERBRywgZGwsIFZULCBWMSwgVjEpOworICAgIH0gZWxzZSB7CisgICAgICBWMSA9IGdldFVucGFja2goREFHLCBkbCwgVlQsIFYxLCBWMSk7CisgICAgICBFbHRObyAtPSBOdW1FbGVtcy8yOworICAgIH0KKyAgICBOdW1FbGVtcyA+Pj0gMTsKKyAgfQorCisgIC8vIFBlcmZvcm0gdGhlIHNwbGF0LgorICBpbnQgU3BsYXRNYXNrWzRdID0geyBFbHRObywgRWx0Tm8sIEVsdE5vLCBFbHRObyB9OworICBWMSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBQVlQsIFYxKTsKKyAgVjEgPSBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShQVlQsIGRsLCBWMSwgREFHLmdldFVOREVGKFBWVCksICZTcGxhdE1hc2tbMF0pOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULCBWMSk7Cit9CisKKy8vLyBnZXRTaHVmZmxlVmVjdG9yWmVyb09yVW5kZWYgLSBSZXR1cm4gYSB2ZWN0b3Jfc2h1ZmZsZSBvZiB0aGUgc3BlY2lmaWVkCisvLy8gdmVjdG9yIG9mIHplcm8gb3IgdW5kZWYgdmVjdG9yLiAgVGhpcyBwcm9kdWNlcyBhIHNodWZmbGUgd2hlcmUgdGhlIGxvdworLy8vIGVsZW1lbnQgb2YgVjIgaXMgc3dpenpsZWQgaW50byB0aGUgemVyby91bmRlZiB2ZWN0b3IsIGxhbmRpbmcgYXQgZWxlbWVudAorLy8vIElkeC4gIFRoaXMgcHJvZHVjZXMgYSBzaHVmZmxlIG1hc2sgbGlrZSA0LDEsMiwzIChpZHg9MCkgb3IgIDAsMSwyLDQgKGlkeD0zKS4KK3N0YXRpYyBTRFZhbHVlIGdldFNodWZmbGVWZWN0b3JaZXJvT3JVbmRlZihTRFZhbHVlIFYyLCB1bnNpZ25lZCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzWmVybywgYm9vbCBIYXNTU0UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgRVZUIFZUID0gVjIuZ2V0VmFsdWVUeXBlKCk7CisgIFNEVmFsdWUgVjEgPSBpc1plcm8KKyAgICA/IGdldFplcm9WZWN0b3IoVlQsIEhhc1NTRTIsIERBRywgVjIuZ2V0RGVidWdMb2MoKSkgOiBEQUcuZ2V0VU5ERUYoVlQpOworICB1bnNpZ25lZCBOdW1FbGVtcyA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgIFNtYWxsVmVjdG9yPGludCwgMTY+IE1hc2tWZWM7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWxlbXM7ICsraSkKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBpbnNlcnRpb24gaWR4LCBwdXQgdGhlIGxvdyBlbHQgb2YgVjIgaGVyZS4KKyAgICBNYXNrVmVjLnB1c2hfYmFjayhpID09IElkeCA/IE51bUVsZW1zIDogaSk7CisgIHJldHVybiBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShWVCwgVjIuZ2V0RGVidWdMb2MoKSwgVjEsIFYyLCAmTWFza1ZlY1swXSk7Cit9CisKKy8vLyBnZXROdW1PZkNvbnNlY3V0aXZlWmVyb3MgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlc3VsdCBvZgorLy8vIGEgc2h1ZmZsZSB0aGF0IGlzIHplcm8uCitzdGF0aWMKK3Vuc2lnbmVkIGdldE51bU9mQ29uc2VjdXRpdmVaZXJvcyhTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk9wLCBpbnQgTnVtRWxlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb3csIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIHVuc2lnbmVkIE51bVplcm9zID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1FbGVtczsgKytpKSB7CisgICAgdW5zaWduZWQgSW5kZXggPSBMb3cgPyBpIDogTnVtRWxlbXMtaS0xOworICAgIGludCBJZHggPSBTVk9wLT5nZXRNYXNrRWx0KEluZGV4KTsKKyAgICBpZiAoSWR4IDwgMCkgeworICAgICAgKytOdW1aZXJvczsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBTRFZhbHVlIEVsdCA9IERBRy5nZXRTaHVmZmxlU2NhbGFyRWx0KFNWT3AsIEluZGV4KTsKKyAgICBpZiAoRWx0LmdldE5vZGUoKSAmJiBYODY6OmlzWmVyb05vZGUoRWx0KSkKKyAgICAgICsrTnVtWmVyb3M7CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIE51bVplcm9zOworfQorCisvLy8gaXNWZWN0b3JTaGlmdCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2h1ZmZsZSBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYQorLy8vIGxvZ2ljYWwgbGVmdCBvciByaWdodCBzaGlmdCBvZiBhIHZlY3Rvci4KKy8vLyBGSVhNRTogc3BsaXQgaW50byBwc2xsZHFpLCBwc3JsZHFpLCBwYWxpZ25yIHZhcmlhbnRzLgorc3RhdGljIGJvb2wgaXNWZWN0b3JTaGlmdChTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk9wLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNMZWZ0LCBTRFZhbHVlICZTaFZhbCwgdW5zaWduZWQgJlNoQW10KSB7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gU1ZPcC0+Z2V0VmFsdWVUeXBlKDApLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisKKyAgaXNMZWZ0ID0gdHJ1ZTsKKyAgdW5zaWduZWQgTnVtWmVyb3MgPSBnZXROdW1PZkNvbnNlY3V0aXZlWmVyb3MoU1ZPcCwgTnVtRWxlbXMsIHRydWUsIERBRyk7CisgIGlmICghTnVtWmVyb3MpIHsKKyAgICBpc0xlZnQgPSBmYWxzZTsKKyAgICBOdW1aZXJvcyA9IGdldE51bU9mQ29uc2VjdXRpdmVaZXJvcyhTVk9wLCBOdW1FbGVtcywgZmFsc2UsIERBRyk7CisgICAgaWYgKCFOdW1aZXJvcykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIFNlZW5WMSA9IGZhbHNlOworICBib29sIFNlZW5WMiA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSBOdW1aZXJvczsgaSA8IE51bUVsZW1zOyArK2kpIHsKKyAgICB1bnNpZ25lZCBWYWwgPSBpc0xlZnQgPyAoaSAtIE51bVplcm9zKSA6IGk7CisgICAgaW50IElkeF8gPSBTVk9wLT5nZXRNYXNrRWx0KGlzTGVmdCA/IGkgOiAoaSAtIE51bVplcm9zKSk7CisgICAgaWYgKElkeF8gPCAwKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgSWR4ID0gKHVuc2lnbmVkKSBJZHhfOworICAgIGlmIChJZHggPCBOdW1FbGVtcykKKyAgICAgIFNlZW5WMSA9IHRydWU7CisgICAgZWxzZSB7CisgICAgICBJZHggLT0gTnVtRWxlbXM7CisgICAgICBTZWVuVjIgPSB0cnVlOworICAgIH0KKyAgICBpZiAoSWR4ICE9IFZhbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoU2VlblYxICYmIFNlZW5WMikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2hWYWwgPSBTZWVuVjEgPyBTVk9wLT5nZXRPcGVyYW5kKDApIDogU1ZPcC0+Z2V0T3BlcmFuZCgxKTsKKyAgU2hBbXQgPSBOdW1aZXJvczsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vIExvd2VyQnVpbGRWZWN0b3J2MTZpOCAtIEN1c3RvbSBsb3dlciBidWlsZF92ZWN0b3Igb2YgdjE2aTguCisvLy8KK3N0YXRpYyBTRFZhbHVlIExvd2VyQnVpbGRWZWN0b3J2MTZpOChTRFZhbHVlIE9wLCB1bnNpZ25lZCBOb25aZXJvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bU5vblplcm8sIHVuc2lnbmVkIE51bVplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpIHsKKyAgaWYgKE51bU5vblplcm8gPiA4KQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIFYoMCwgMCk7CisgIGJvb2wgRmlyc3QgPSB0cnVlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGJvb2wgVGhpc0lzTm9uWmVybyA9IChOb25aZXJvcyAmICgxIDw8IGkpKSAhPSAwOworICAgIGlmIChUaGlzSXNOb25aZXJvICYmIEZpcnN0KSB7CisgICAgICBpZiAoTnVtWmVybykKKyAgICAgICAgViA9IGdldFplcm9WZWN0b3IoTVZUOjp2OGkxNiwgdHJ1ZSwgREFHLCBkbCk7CisgICAgICBlbHNlCisgICAgICAgIFYgPSBEQUcuZ2V0VU5ERUYoTVZUOjp2OGkxNik7CisgICAgICBGaXJzdCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICgoaSAmIDEpICE9IDApIHsKKyAgICAgIFNEVmFsdWUgVGhpc0VsdCgwLCAwKSwgTGFzdEVsdCgwLCAwKTsKKyAgICAgIGJvb2wgTGFzdElzTm9uWmVybyA9IChOb25aZXJvcyAmICgxIDw8IChpLTEpKSkgIT0gMDsKKyAgICAgIGlmIChMYXN0SXNOb25aZXJvKSB7CisgICAgICAgIExhc3RFbHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6aTE2LCBPcC5nZXRPcGVyYW5kKGktMSkpOworICAgICAgfQorICAgICAgaWYgKFRoaXNJc05vblplcm8pIHsKKyAgICAgICAgVGhpc0VsdCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBNVlQ6OmkxNiwgT3AuZ2V0T3BlcmFuZChpKSk7CisgICAgICAgIFRoaXNFbHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIE1WVDo6aTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpc0VsdCwgREFHLmdldENvbnN0YW50KDgsIE1WVDo6aTgpKTsKKyAgICAgICAgaWYgKExhc3RJc05vblplcm8pCisgICAgICAgICAgVGhpc0VsdCA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBNVlQ6OmkxNiwgVGhpc0VsdCwgTGFzdEVsdCk7CisgICAgICB9IGVsc2UKKyAgICAgICAgVGhpc0VsdCA9IExhc3RFbHQ7CisKKyAgICAgIGlmIChUaGlzRWx0LmdldE5vZGUoKSkKKyAgICAgICAgViA9IERBRy5nZXROb2RlKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIGRsLCBNVlQ6OnY4aTE2LCBWLCBUaGlzRWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KGkvMikpOworICAgIH0KKyAgfQorCisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2MTZpOCwgVik7Cit9CisKKy8vLyBMb3dlckJ1aWxkVmVjdG9ydjhpMTYgLSBDdXN0b20gbG93ZXIgYnVpbGRfdmVjdG9yIG9mIHY4aTE2LgorLy8vCitzdGF0aWMgU0RWYWx1ZSBMb3dlckJ1aWxkVmVjdG9ydjhpMTYoU0RWYWx1ZSBPcCwgdW5zaWduZWQgTm9uWmVyb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtTm9uWmVybywgdW5zaWduZWQgTnVtWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJKSB7CisgIGlmIChOdW1Ob25aZXJvID4gNCkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBWKDAsIDApOworICBib29sIEZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGJvb2wgaXNOb25aZXJvID0gKE5vblplcm9zICYgKDEgPDwgaSkpICE9IDA7CisgICAgaWYgKGlzTm9uWmVybykgeworICAgICAgaWYgKEZpcnN0KSB7CisgICAgICAgIGlmIChOdW1aZXJvKQorICAgICAgICAgIFYgPSBnZXRaZXJvVmVjdG9yKE1WVDo6djhpMTYsIHRydWUsIERBRywgZGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgViA9IERBRy5nZXRVTkRFRihNVlQ6OnY4aTE2KTsKKyAgICAgICAgRmlyc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIFYgPSBEQUcuZ2V0Tm9kZShJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICBNVlQ6OnY4aTE2LCBWLCBPcC5nZXRPcGVyYW5kKGkpLAorICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChpKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFY7Cit9CisKKy8vLyBnZXRWU2hpZnQgLSBSZXR1cm4gYSB2ZWN0b3IgbG9naWNhbCBzaGlmdCBub2RlLgorLy8vCitzdGF0aWMgU0RWYWx1ZSBnZXRWU2hpZnQoYm9vbCBpc0xlZnQsIEVWVCBWVCwgU0RWYWx1ZSBTcmNPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1CaXRzLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJLCBEZWJ1Z0xvYyBkbCkgeworICBib29sIGlzTU1YID0gVlQuZ2V0U2l6ZUluQml0cygpID09IDY0OworICBFVlQgU2hWVCA9IGlzTU1YID8gTVZUOjp2MWk2NCA6IE1WVDo6djJpNjQ7CisgIHVuc2lnbmVkIE9wYyA9IGlzTGVmdCA/IFg4NklTRDo6VlNITCA6IFg4NklTRDo6VlNSTDsKKyAgU3JjT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgU2hWVCwgU3JjT3ApOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoT3BjLCBkbCwgU2hWVCwgU3JjT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOdW1CaXRzLCBUTEkuZ2V0U2hpZnRBbW91bnRUeSgpKSkpOworfQorCitTRFZhbHVlCitYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJBc1NwbGF0VmVjdG9yTG9hZChTRFZhbHVlIFNyY09wLCBFVlQgVlQsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgCisgIC8vIENoZWNrIGlmIHRoZSBzY2FsYXIgbG9hZCBjYW4gYmUgd2lkZW5lZCBpbnRvIGEgdmVjdG9yIGxvYWQuIEFuZCBpZgorICAvLyB0aGUgYWRkcmVzcyBpcyAiYmFzZSArIGNzdCIgc2VlIGlmIHRoZSBjc3QgY2FuIGJlICJhYnNvcmJlZCIgaW50bworICAvLyB0aGUgc2h1ZmZsZSBtYXNrLgorICBpZiAoTG9hZFNETm9kZSAqTEQgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihTcmNPcCkpIHsKKyAgICBTRFZhbHVlIFB0ciA9IExELT5nZXRCYXNlUHRyKCk7CisgICAgaWYgKCFJU0Q6OmlzTm9ybWFsTG9hZChMRCkgfHwgTEQtPmlzVm9sYXRpbGUoKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgRVZUIFBWVCA9IExELT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgaWYgKFBWVCAhPSBNVlQ6OmkzMiAmJiBQVlQgIT0gTVZUOjpmMzIpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgICAgaW50IEZJID0gLTE7CisgICAgaW50NjRfdCBPZmZzZXQgPSAwOworICAgIGlmIChGcmFtZUluZGV4U0ROb2RlICpGSU5vZGUgPSBkeW5fY2FzdDxGcmFtZUluZGV4U0ROb2RlPihQdHIpKSB7CisgICAgICBGSSA9IEZJTm9kZS0+Z2V0SW5kZXgoKTsKKyAgICAgIE9mZnNldCA9IDA7CisgICAgfSBlbHNlIGlmIChQdHIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQgJiYKKyAgICAgICAgICAgICAgIGlzYTxDb25zdGFudFNETm9kZT4oUHRyLmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgICAgICBpc2E8RnJhbWVJbmRleFNETm9kZT4oUHRyLmdldE9wZXJhbmQoMCkpKSB7CisgICAgICBGSSA9IGNhc3Q8RnJhbWVJbmRleFNETm9kZT4oUHRyLmdldE9wZXJhbmQoMCkpLT5nZXRJbmRleCgpOworICAgICAgT2Zmc2V0ID0gUHRyLmdldENvbnN0YW50T3BlcmFuZFZhbCgxKTsKKyAgICAgIFB0ciA9IFB0ci5nZXRPcGVyYW5kKDApOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgIH0KKworICAgIFNEVmFsdWUgQ2hhaW4gPSBMRC0+Z2V0Q2hhaW4oKTsKKyAgICAvLyBNYWtlIHN1cmUgdGhlIHN0YWNrIG9iamVjdCBhbGlnbm1lbnQgaXMgYXQgbGVhc3QgMTYuCisgICAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZyYW1lSW5mbygpOworICAgIGlmIChEQUcuSW5mZXJQdHJBbGlnbm1lbnQoUHRyKSA8IDE2KSB7CisgICAgICBpZiAoTUZJLT5pc0ZpeGVkT2JqZWN0SW5kZXgoRkkpKSB7CisgICAgICAgIC8vIENhbid0IGNoYW5nZSB0aGUgYWxpZ25tZW50LiBGSVhNRTogSXQncyBwb3NzaWJsZSB0byBjb21wdXRlCisgICAgICAgIC8vIHRoZSBleGFjdCBzdGFjayBvZmZzZXQgYW5kIHJlZmVyZW5jZSBGSSArIGFkanVzdCBvZmZzZXQgaW5zdGVhZC4KKyAgICAgICAgLy8gSWYgc29tZW9uZSAqcmVhbGx5KiBjYXJlcyBhYm91dCB0aGlzLiBUaGF0J3MgdGhlIHdheSB0byBpbXBsZW1lbnQgaXQuCisgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBNRkktPnNldE9iamVjdEFsaWdubWVudChGSSwgMTYpOworICAgICAgfQorICAgIH0KKworICAgIC8vIChPZmZzZXQgJSAxNikgbXVzdCBiZSBtdWx0aXBsZSBvZiA0LiBUaGVuIGFkZHJlc3MgaXMgdGhlbgorICAgIC8vIFB0ciArIChPZmZzZXQgJiB+MTUpLgorICAgIGlmIChPZmZzZXQgPCAwKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICBpZiAoKE9mZnNldCAlIDE2KSAmIDMpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgIGludDY0X3QgU3RhcnRPZmZzZXQgPSBPZmZzZXQgJiB+MTU7CisgICAgaWYgKFN0YXJ0T2Zmc2V0KQorICAgICAgUHRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIFB0ci5nZXREZWJ1Z0xvYygpLCBQdHIuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBQdHIsREFHLmdldENvbnN0YW50KFN0YXJ0T2Zmc2V0LCBQdHIuZ2V0VmFsdWVUeXBlKCkpKTsKKworICAgIGludCBFbHRObyA9IChPZmZzZXQgLSBTdGFydE9mZnNldCkgPj4gMjsKKyAgICBpbnQgTWFza1s0XSA9IHsgRWx0Tm8sIEVsdE5vLCBFbHRObywgRWx0Tm8gfTsKKyAgICBFVlQgVlQgPSAoUFZUID09IE1WVDo6aTMyKSA/IE1WVDo6djRpMzIgOiBNVlQ6OnY0ZjMyOworICAgIFNEVmFsdWUgVjEgPSBEQUcuZ2V0TG9hZChWVCwgZGwsIENoYWluLCBQdHIsTEQtPmdldFNyY1ZhbHVlKCksMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAvLyBDYW5vbmljYWxpemUgaXQgdG8gYSB2NGkzMiBzaHVmZmxlLgorICAgIFYxID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6djRpMzIsIFYxKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShNVlQ6OnY0aTMyLCBkbCwgVjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRVTkRFRihNVlQ6OnY0aTMyKSwgJk1hc2tbMF0pKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBFbHRzRnJvbUNvbnNlY3V0aXZlTG9hZHMgLSBHaXZlbiB0aGUgaW5pdGlhbGl6aW5nIGVsZW1lbnRzICdFbHRzJyBvZiBhIAorLy8vIHZlY3RvciBvZiB0eXBlICdWVCcsIHNlZSBpZiB0aGUgZWxlbWVudHMgY2FuIGJlIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIGxhcmdlIAorLy8vIGxvYWQgd2hpY2ggaGFzIHRoZSBzYW1lIHZhbHVlIGFzIGEgYnVpbGRfdmVjdG9yIHdob3NlIG9wZXJhbmRzIGFyZSAnZWx0cycuCisvLy8KKy8vLyBFeGFtcGxlOiA8bG9hZCBpMzIgKmEsIGxvYWQgaTMyICphKzQsIHVuZGVmLCB1bmRlZj4gLT4gemV4dGxvYWQgYQorLy8vIAorLy8vIEZJWE1FOiB3ZSdkIGFsc28gbGlrZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGxhc3QgZWxlbWVudHMgYXJlIHplcm8KKy8vLyByYXRoZXIgdGhhbiB1bmRlZiB2aWEgVlpFWFRfTE9BRCwgYnV0IHdlIGRvIG5vdCBkZXRlY3QgdGhhdCBjYXNlIHRvZGF5LgorLy8vIFRoZXJlJ3MgZXZlbiBhIGhhbmR5IGlzWmVyb05vZGUgZm9yIHRoYXQgcHVycG9zZS4KK3N0YXRpYyBTRFZhbHVlIEVsdHNGcm9tQ29uc2VjdXRpdmVMb2FkcyhFVlQgVlQsIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyAmZGwsIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIEVWVCBFbHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gRWx0cy5zaXplKCk7CisgIAorICBMb2FkU0ROb2RlICpMREJhc2UgPSBOVUxMOworICB1bnNpZ25lZCBMYXN0TG9hZGVkRWx0ID0gLTFVOworICAKKyAgLy8gRm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgaW5pdGlhbGl6ZXIsIHNlZSBpZiB3ZSd2ZSBmb3VuZCBhIGxvYWQgb3IgYW4gdW5kZWYuCisgIC8vIElmIHdlIGRvbid0IGZpbmQgYW4gaW5pdGlhbCBsb2FkIGVsZW1lbnQsIG9yIGxhdGVyIGxvYWQgZWxlbWVudHMgYXJlIAorICAvLyBub24tY29uc2VjdXRpdmUsIGJhaWwgb3V0LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtRWxlbXM7ICsraSkgeworICAgIFNEVmFsdWUgRWx0ID0gRWx0c1tpXTsKKyAgICAKKyAgICBpZiAoIUVsdC5nZXROb2RlKCkgfHwKKyAgICAgICAgKEVsdC5nZXRPcGNvZGUoKSAhPSBJU0Q6OlVOREVGICYmICFJU0Q6OmlzTk9OX0VYVExvYWQoRWx0LmdldE5vZGUoKSkpKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICBpZiAoIUxEQmFzZSkgeworICAgICAgaWYgKEVsdC5nZXROb2RlKCktPmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgICBMREJhc2UgPSBjYXN0PExvYWRTRE5vZGU+KEVsdC5nZXROb2RlKCkpOworICAgICAgTGFzdExvYWRlZEVsdCA9IGk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKEVsdC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKQorICAgICAgY29udGludWU7CisKKyAgICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oRWx0KTsKKyAgICBpZiAoIURBRy5pc0NvbnNlY3V0aXZlTG9hZChMRCwgTERCYXNlLCBFbHRWVC5nZXRTaXplSW5CaXRzKCkvOCwgaSkpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgIExhc3RMb2FkZWRFbHQgPSBpOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSBmb3VuZCBhbiBlbnRpcmUgdmVjdG9yIG9mIGxvYWRzIGFuZCB1bmRlZnMsIHRoZW4gcmV0dXJuIGEgbGFyZ2UKKyAgLy8gbG9hZCBvZiB0aGUgZW50aXJlIHZlY3RvciB3aWR0aCBzdGFydGluZyBhdCB0aGUgYmFzZSBwb2ludGVyLiAgSWYgd2UgZm91bmQKKyAgLy8gY29uc2VjdXRpdmUgbG9hZHMgZm9yIHRoZSBsb3cgaGFsZiwgZ2VuZXJhdGUgYSB2emV4dF9sb2FkIG5vZGUuCisgIGlmIChMYXN0TG9hZGVkRWx0ID09IE51bUVsZW1zIC0gMSkgeworICAgIGlmIChEQUcuSW5mZXJQdHJBbGlnbm1lbnQoTERCYXNlLT5nZXRCYXNlUHRyKCkpID49IDE2KQorICAgICAgcmV0dXJuIERBRy5nZXRMb2FkKFZULCBkbCwgTERCYXNlLT5nZXRDaGFpbigpLCBMREJhc2UtPmdldEJhc2VQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMREJhc2UtPmdldFNyY1ZhbHVlKCksIExEQmFzZS0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMREJhc2UtPmlzVm9sYXRpbGUoKSwgTERCYXNlLT5pc05vblRlbXBvcmFsKCksIDApOworICAgIHJldHVybiBEQUcuZ2V0TG9hZChWVCwgZGwsIExEQmFzZS0+Z2V0Q2hhaW4oKSwgTERCYXNlLT5nZXRCYXNlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgIExEQmFzZS0+Z2V0U3JjVmFsdWUoKSwgTERCYXNlLT5nZXRTcmNWYWx1ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICBMREJhc2UtPmlzVm9sYXRpbGUoKSwgTERCYXNlLT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgIExEQmFzZS0+Z2V0QWxpZ25tZW50KCkpOworICB9IGVsc2UgaWYgKE51bUVsZW1zID09IDQgJiYgTGFzdExvYWRlZEVsdCA9PSAxKSB7CisgICAgU0RWVExpc3QgVHlzID0gREFHLmdldFZUTGlzdChNVlQ6OnYyaTY0LCBNVlQ6Ok90aGVyKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBMREJhc2UtPmdldENoYWluKCksIExEQmFzZS0+Z2V0QmFzZVB0cigpIH07CisgICAgU0RWYWx1ZSBSZXNOb2RlID0gREFHLmdldE5vZGUoWDg2SVNEOjpWWkVYVF9MT0FELCBkbCwgVHlzLCBPcHMsIDIpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsIFJlc05vZGUpOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUKK1g4NlRhcmdldExvd2VyaW5nOjpMb3dlckJVSUxEX1ZFQ1RPUihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIC8vIEFsbCB6ZXJvJ3MgYXJlIGhhbmRsZWQgd2l0aCBweG9yLCBhbGwgb25lJ3MgYXJlIGhhbmRsZWQgd2l0aCBwY21wZXFkLgorICBpZiAoSVNEOjppc0J1aWxkVmVjdG9yQWxsWmVyb3MoT3AuZ2V0Tm9kZSgpKQorICAgICAgfHwgSVNEOjppc0J1aWxkVmVjdG9yQWxsT25lcyhPcC5nZXROb2RlKCkpKSB7CisgICAgLy8gQ2Fub25pY2FsaXplIHRoaXMgdG8gZWl0aGVyIDw0IHggaTMyPiBvciA8MiB4IGkzMj4gKFNTRSB2cyBNTVgpIHRvCisgICAgLy8gMSkgZW5zdXJlIHRoZSB6ZXJvIHZlY3RvcnMgYXJlIENTRSdkLCBhbmQgMikgZW5zdXJlIHRoYXQgaTY0IHNjYWxhcnMgYXJlCisgICAgLy8gZWxpbWluYXRlZCBvbiB4ODYtMzIgaG9zdHMuCisgICAgaWYgKE9wLmdldFZhbHVlVHlwZSgpID09IE1WVDo6djRpMzIgfHwgT3AuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjp2MmkzMikKKyAgICAgIHJldHVybiBPcDsKKworICAgIGlmIChJU0Q6OmlzQnVpbGRWZWN0b3JBbGxPbmVzKE9wLmdldE5vZGUoKSkpCisgICAgICByZXR1cm4gZ2V0T25lc1ZlY3RvcihPcC5nZXRWYWx1ZVR5cGUoKSwgREFHLCBkbCk7CisgICAgcmV0dXJuIGdldFplcm9WZWN0b3IoT3AuZ2V0VmFsdWVUeXBlKCksIFN1YnRhcmdldC0+aGFzU1NFMigpLCBEQUcsIGRsKTsKKyAgfQorCisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBFVlQgRXh0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICB1bnNpZ25lZCBFVlRCaXRzID0gRXh0VlQuZ2V0U2l6ZUluQml0cygpOworCisgIHVuc2lnbmVkIE51bUVsZW1zID0gT3AuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgdW5zaWduZWQgTnVtWmVybyAgPSAwOworICB1bnNpZ25lZCBOdW1Ob25aZXJvID0gMDsKKyAgdW5zaWduZWQgTm9uWmVyb3MgPSAwOworICBib29sIElzQWxsQ29uc3RhbnRzID0gdHJ1ZTsKKyAgU21hbGxTZXQ8U0RWYWx1ZSwgOD4gVmFsdWVzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtRWxlbXM7ICsraSkgeworICAgIFNEVmFsdWUgRWx0ID0gT3AuZ2V0T3BlcmFuZChpKTsKKyAgICBpZiAoRWx0LmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpCisgICAgICBjb250aW51ZTsKKyAgICBWYWx1ZXMuaW5zZXJ0KEVsdCk7CisgICAgaWYgKEVsdC5nZXRPcGNvZGUoKSAhPSBJU0Q6OkNvbnN0YW50ICYmCisgICAgICAgIEVsdC5nZXRPcGNvZGUoKSAhPSBJU0Q6OkNvbnN0YW50RlApCisgICAgICBJc0FsbENvbnN0YW50cyA9IGZhbHNlOworICAgIGlmIChYODY6OmlzWmVyb05vZGUoRWx0KSkKKyAgICAgIE51bVplcm8rKzsKKyAgICBlbHNlIHsKKyAgICAgIE5vblplcm9zIHw9ICgxIDw8IGkpOworICAgICAgTnVtTm9uWmVybysrOworICAgIH0KKyAgfQorCisgIGlmIChOdW1Ob25aZXJvID09IDApIHsKKyAgICAvLyBBbGwgdW5kZWYgdmVjdG9yLiBSZXR1cm4gYW4gVU5ERUYuICBBbGwgemVybyB2ZWN0b3JzIHdlcmUgaGFuZGxlZCBhYm92ZS4KKyAgICByZXR1cm4gREFHLmdldFVOREVGKFZUKTsKKyAgfQorCisgIC8vIFNwZWNpYWwgY2FzZSBmb3Igc2luZ2xlIG5vbi16ZXJvLCBub24tdW5kZWYsIGVsZW1lbnQuCisgIGlmIChOdW1Ob25aZXJvID09IDEpIHsKKyAgICB1bnNpZ25lZCBJZHggPSBDb3VudFRyYWlsaW5nWmVyb3NfMzIoTm9uWmVyb3MpOworICAgIFNEVmFsdWUgSXRlbSA9IE9wLmdldE9wZXJhbmQoSWR4KTsKKworICAgIC8vIElmIHRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9mIGFuIGk2NCB2YWx1ZSBvbiB4ODYtMzIsIGFuZCBpZiB0aGUgdG9wIGJpdHMgb2YKKyAgICAvLyB0aGUgdmFsdWUgYXJlIG9idmlvdXNseSB6ZXJvLCB0cnVuY2F0ZSB0aGUgdmFsdWUgdG8gaTMyIGFuZCBkbyB0aGUKKyAgICAvLyBpbnNlcnRpb24gdGhhdCB3YXkuICBPbmx5IGRvIHRoaXMgaWYgdGhlIHZhbHVlIGlzIG5vbi1jb25zdGFudCBvciBpZiB0aGUKKyAgICAvLyB2YWx1ZSBpcyBhIGNvbnN0YW50IGJlaW5nIGluc2VydGVkIGludG8gZWxlbWVudCAwLiAgSXQgaXMgY2hlYXBlciB0byBkbworICAgIC8vIGEgY29uc3RhbnQgcG9vbCBsb2FkIHRoYW4gaXQgaXMgdG8gZG8gYSBtb3ZkICsgc2h1ZmZsZS4KKyAgICBpZiAoRXh0VlQgPT0gTVZUOjppNjQgJiYgIVN1YnRhcmdldC0+aXM2NEJpdCgpICYmCisgICAgICAgICghSXNBbGxDb25zdGFudHMgfHwgSWR4ID09IDApKSB7CisgICAgICBpZiAoREFHLk1hc2tlZFZhbHVlSXNaZXJvKEl0ZW0sIEFQSW50OjpnZXRCaXRzU2V0KDY0LCAzMiwgNjQpKSkgeworICAgICAgICAvLyBIYW5kbGUgTU1YIGFuZCBTU0UgYm90aC4KKyAgICAgICAgRVZUIFZlY1ZUID0gVlQgPT0gTVZUOjp2Mmk2NCA/IE1WVDo6djRpMzIgOiBNVlQ6OnYyaTMyOworICAgICAgICB1bnNpZ25lZCBWZWNFbHRzID0gVlQgPT0gTVZUOjp2Mmk2NCA/IDQgOiAyOworCisgICAgICAgIC8vIFRydW5jYXRlIHRoZSB2YWx1ZSAod2hpY2ggbWF5IGl0c2VsZiBiZSBhIGNvbnN0YW50KSB0byBpMzIsIGFuZAorICAgICAgICAvLyBjb252ZXJ0IGl0IHRvIGEgdmVjdG9yIHdpdGggbW92ZCAoUzJWK3NodWZmbGUgdG8gemVybyBleHRlbmQpLgorICAgICAgICBJdGVtID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIE1WVDo6aTMyLCBJdGVtKTsKKyAgICAgICAgSXRlbSA9IERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIFZlY1ZULCBJdGVtKTsKKyAgICAgICAgSXRlbSA9IGdldFNodWZmbGVWZWN0b3JaZXJvT3JVbmRlZihJdGVtLCAwLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnRhcmdldC0+aGFzU1NFMigpLCBEQUcpOworCisgICAgICAgIC8vIE5vdyB3ZSBoYXZlIG91ciAzMi1iaXQgdmFsdWUgemVybyBleHRlbmRlZCBpbiB0aGUgbG93IGVsZW1lbnQgb2YKKyAgICAgICAgLy8gYSB2ZWN0b3IuICBJZiBJZHggIT0gMCwgc3dpenpsZSBpdCBpbnRvIHBsYWNlLgorICAgICAgICBpZiAoSWR4ICE9IDApIHsKKyAgICAgICAgICBTbWFsbFZlY3RvcjxpbnQsIDQ+IE1hc2s7CisgICAgICAgICAgTWFzay5wdXNoX2JhY2soSWR4KTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IFZlY0VsdHM7ICsraSkKKyAgICAgICAgICAgIE1hc2sucHVzaF9iYWNrKGkpOworICAgICAgICAgIEl0ZW0gPSBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShWZWNWVCwgZGwsIEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRVTkRFRihJdGVtLmdldFZhbHVlVHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1hc2tbMF0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgT3AuZ2V0VmFsdWVUeXBlKCksIEl0ZW0pOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgYSBjb25zdGFudCBvciBub24tY29uc3RhbnQgaW5zZXJ0aW9uIGludG8gdGhlIGxvdyBlbGVtZW50IG9mCisgICAgLy8gYSB2ZWN0b3IsIHdlIGNhbiBkbyB0aGlzIHdpdGggU0NBTEFSX1RPX1ZFQ1RPUiArIHNodWZmbGUgb2YgemVybyBpbnRvCisgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIGVsZW1lbnRzLiAgVGhpcyB3aWxsIGJlIG1hdGNoZWQgYXMgbW92ZC9tb3ZxL21vdnNzL21vdnNkCisgICAgLy8gZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHNvdXJjZSBkYXRhdHlwZSBpcy4KKyAgICBpZiAoSWR4ID09IDApIHsKKyAgICAgIGlmIChOdW1aZXJvID09IDApIHsKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIFZULCBJdGVtKTsKKyAgICAgIH0gZWxzZSBpZiAoRXh0VlQgPT0gTVZUOjppMzIgfHwgRXh0VlQgPT0gTVZUOjpmMzIgfHwgRXh0VlQgPT0gTVZUOjpmNjQgfHwKKyAgICAgICAgICAoRXh0VlQgPT0gTVZUOjppNjQgJiYgU3VidGFyZ2V0LT5pczY0Qml0KCkpKSB7CisgICAgICAgIEl0ZW0gPSBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIGRsLCBWVCwgSXRlbSk7CisgICAgICAgIC8vIFR1cm4gaXQgaW50byBhIE1PVkwgKGkuZS4gbW92c3MsIG1vdnNkLCBvciBtb3ZkKSB0byBhIHplcm8gdmVjdG9yLgorICAgICAgICByZXR1cm4gZ2V0U2h1ZmZsZVZlY3Rvclplcm9PclVuZGVmKEl0ZW0sIDAsIHRydWUsIFN1YnRhcmdldC0+aGFzU1NFMigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRyk7CisgICAgICB9IGVsc2UgaWYgKEV4dFZUID09IE1WVDo6aTE2IHx8IEV4dFZUID09IE1WVDo6aTgpIHsKKyAgICAgICAgSXRlbSA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBNVlQ6OmkzMiwgSXRlbSk7CisgICAgICAgIEVWVCBNaWRkbGVWVCA9IFZULmdldFNpemVJbkJpdHMoKSA9PSA2NCA/IE1WVDo6djJpMzIgOiBNVlQ6OnY0aTMyOworICAgICAgICBJdGVtID0gREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwgTWlkZGxlVlQsIEl0ZW0pOworICAgICAgICBJdGVtID0gZ2V0U2h1ZmZsZVZlY3Rvclplcm9PclVuZGVmKEl0ZW0sIDAsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidGFyZ2V0LT5oYXNTU0UyKCksIERBRyk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsIEl0ZW0pOworICAgICAgfQorICAgIH0KKworICAgIC8vIElzIGl0IGEgdmVjdG9yIGxvZ2ljYWwgbGVmdCBzaGlmdD8KKyAgICBpZiAoTnVtRWxlbXMgPT0gMiAmJiBJZHggPT0gMSAmJgorICAgICAgICBYODY6OmlzWmVyb05vZGUoT3AuZ2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgIVg4Njo6aXNaZXJvTm9kZShPcC5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgdW5zaWduZWQgTnVtQml0cyA9IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICAgIHJldHVybiBnZXRWU2hpZnQodHJ1ZSwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULCBPcC5nZXRPcGVyYW5kKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTnVtQml0cy8yLCBEQUcsICp0aGlzLCBkbCk7CisgICAgfQorCisgICAgaWYgKElzQWxsQ29uc3RhbnRzKSAvLyBPdGhlcndpc2UsIGl0J3MgYmV0dGVyIHRvIGRvIGEgY29uc3Rwb29sIGxvYWQuCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGlzIGlzIGEgdmVjdG9yIHdpdGggaTMyIG9yIGYzMiBlbGVtZW50cywgYW5kIHRoZSBlbGVtZW50CisgICAgLy8gaXMgYSBub24tY29uc3RhbnQgYmVpbmcgaW5zZXJ0ZWQgaW50byBhbiBlbGVtZW50IG90aGVyIHRoYW4gdGhlIGxvdyBvbmUsCisgICAgLy8gd2UgY2FuJ3QgdXNlIGEgY29uc3RhbnQgcG9vbCBsb2FkLiAgSW5zdGVhZCwgdXNlIFNDQUxBUl9UT19WRUNUT1IgKGFrYQorICAgIC8vIG1vdmQvbW92c3MpIHRvIG1vdmUgdGhpcyBpbnRvIHRoZSBsb3cgZWxlbWVudCwgdGhlbiBzaHVmZmxlIGl0IGludG8KKyAgICAvLyBwbGFjZS4KKyAgICBpZiAoRVZUQml0cyA9PSAzMikgeworICAgICAgSXRlbSA9IERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIFZULCBJdGVtKTsKKworICAgICAgLy8gVHVybiBpdCBpbnRvIGEgc2h1ZmZsZSBvZiB6ZXJvIGFuZCB6ZXJvLWV4dGVuZGVkIHNjYWxhciB0byB2ZWN0b3IuCisgICAgICBJdGVtID0gZ2V0U2h1ZmZsZVZlY3Rvclplcm9PclVuZGVmKEl0ZW0sIDAsIE51bVplcm8gPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0YXJnZXQtPmhhc1NTRTIoKSwgREFHKTsKKyAgICAgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFza1ZlYzsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1FbGVtczsgaSsrKQorICAgICAgICBNYXNrVmVjLnB1c2hfYmFjayhpID09IElkeCA/IDAgOiAxKTsKKyAgICAgIHJldHVybiBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShWVCwgZGwsIEl0ZW0sIERBRy5nZXRVTkRFRihWVCksICZNYXNrVmVjWzBdKTsKKyAgICB9CisgIH0KKworICAvLyBTcGxhdCBpcyBvYnZpb3VzbHkgb2suIExldCBsZWdhbGl6ZXIgZXhwYW5kIGl0IHRvIGEgc2h1ZmZsZS4KKyAgaWYgKFZhbHVlcy5zaXplKCkgPT0gMSkgeworICAgIGlmIChFVlRCaXRzID09IDMyKSB7CisgICAgICAvLyBJbnN0ZWFkIG9mIGEgc2h1ZmZsZSBsaWtlIHRoaXM6CisgICAgICAvLyBzaHVmZmxlIChzY2FsYXJfdG9fdmVjdG9yIChsb2FkIChwdHIgKyA0KSkpLCB1bmRlZiwgPDAsIDAsIDAsIDA+CisgICAgICAvLyBDaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvIGlzc3VlIHRoaXMgaW5zdGVhZC4KKyAgICAgIC8vIHNodWZmbGUgKHZsb2FkIHB0cikpLCB1bmRlZiwgPDEsIDEsIDEsIDE+CisgICAgICB1bnNpZ25lZCBJZHggPSBDb3VudFRyYWlsaW5nWmVyb3NfMzIoTm9uWmVyb3MpOworICAgICAgU0RWYWx1ZSBJdGVtID0gT3AuZ2V0T3BlcmFuZChJZHgpOworICAgICAgaWYgKE9wLmdldE5vZGUoKS0+aXNPbmx5VXNlck9mKEl0ZW0uZ2V0Tm9kZSgpKSkKKyAgICAgICAgcmV0dXJuIExvd2VyQXNTcGxhdFZlY3RvckxvYWQoSXRlbSwgVlQsIGRsLCBEQUcpOworICAgIH0KKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisKKyAgLy8gQSB2ZWN0b3IgZnVsbCBvZiBpbW1lZGlhdGVzOyB2YXJpb3VzIHNwZWNpYWwgY2FzZXMgYXJlIGFscmVhZHkKKyAgLy8gaGFuZGxlZCwgc28gdGhpcyBpcyBiZXN0IGRvbmUgd2l0aCBhIHNpbmdsZSBjb25zdGFudC1wb29sIGxvYWQuCisgIGlmIChJc0FsbENvbnN0YW50cykKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIC8vIExldCBsZWdhbGl6ZXIgZXhwYW5kIDItd2lkZSBidWlsZF92ZWN0b3JzLgorICBpZiAoRVZUQml0cyA9PSA2NCkgeworICAgIGlmIChOdW1Ob25aZXJvID09IDEpIHsKKyAgICAgIC8vIE9uZSBoYWxmIGlzIHplcm8gb3IgdW5kZWYuCisgICAgICB1bnNpZ25lZCBJZHggPSBDb3VudFRyYWlsaW5nWmVyb3NfMzIoTm9uWmVyb3MpOworICAgICAgU0RWYWx1ZSBWMiA9IERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZChJZHgpKTsKKyAgICAgIHJldHVybiBnZXRTaHVmZmxlVmVjdG9yWmVyb09yVW5kZWYoVjIsIElkeCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidGFyZ2V0LT5oYXNTU0UyKCksIERBRyk7CisgICAgfQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICAvLyBJZiBlbGVtZW50IFZUIGlzIDwgMzIgYml0cywgY29udmVydCBpdCB0byBpbnNlcnRzIGludG8gYSB6ZXJvIHZlY3Rvci4KKyAgaWYgKEVWVEJpdHMgPT0gOCAmJiBOdW1FbGVtcyA9PSAxNikgeworICAgIFNEVmFsdWUgViA9IExvd2VyQnVpbGRWZWN0b3J2MTZpOChPcCwgTm9uWmVyb3MsTnVtTm9uWmVybyxOdW1aZXJvLCBEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRoaXMpOworICAgIGlmIChWLmdldE5vZGUoKSkgcmV0dXJuIFY7CisgIH0KKworICBpZiAoRVZUQml0cyA9PSAxNiAmJiBOdW1FbGVtcyA9PSA4KSB7CisgICAgU0RWYWx1ZSBWID0gTG93ZXJCdWlsZFZlY3RvcnY4aTE2KE9wLCBOb25aZXJvcyxOdW1Ob25aZXJvLE51bVplcm8sIERBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhpcyk7CisgICAgaWYgKFYuZ2V0Tm9kZSgpKSByZXR1cm4gVjsKKyAgfQorCisgIC8vIElmIGVsZW1lbnQgVlQgaXMgPT0gMzIgYml0cywgdHVybiBpdCBpbnRvIGEgbnVtYmVyIG9mIHNodWZmbGVzLgorICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBWOworICBWLnJlc2l6ZShOdW1FbGVtcyk7CisgIGlmIChOdW1FbGVtcyA9PSA0ICYmIE51bVplcm8gPiAwKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgYm9vbCBpc1plcm8gPSAhKE5vblplcm9zICYgKDEgPDwgaSkpOworICAgICAgaWYgKGlzWmVybykKKyAgICAgICAgVltpXSA9IGdldFplcm9WZWN0b3IoVlQsIFN1YnRhcmdldC0+aGFzU1NFMigpLCBEQUcsIGRsKTsKKyAgICAgIGVsc2UKKyAgICAgICAgVltpXSA9IERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIFZULCBPcC5nZXRPcGVyYW5kKGkpKTsKKyAgICB9CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBzd2l0Y2ggKChOb25aZXJvcyAmICgweDMgPDwgaSoyKSkgPj4gKGkqMikpIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBWW2ldID0gVltpKjJdOyAgLy8gTXVzdCBiZSBhIHplcm8gdmVjdG9yLgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgVltpXSA9IGdldE1PVkwoREFHLCBkbCwgVlQsIFZbaSoyKzFdLCBWW2kqMl0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgVltpXSA9IGdldE1PVkwoREFHLCBkbCwgVlQsIFZbaSoyXSwgVltpKjIrMV0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgVltpXSA9IGdldFVucGFja2woREFHLCBkbCwgVlQsIFZbaSoyXSwgVltpKjIrMV0pOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFza1ZlYzsKKyAgICBib29sIFJldmVyc2UgPSAoTm9uWmVyb3MgJiAweDMpID09IDI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDI7ICsraSkKKyAgICAgIE1hc2tWZWMucHVzaF9iYWNrKFJldmVyc2UgPyAxLWkgOiBpKTsKKyAgICBSZXZlcnNlID0gKChOb25aZXJvcyAmICgweDMgPDwgMikpID4+IDIpID09IDI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDI7ICsraSkKKyAgICAgIE1hc2tWZWMucHVzaF9iYWNrKFJldmVyc2UgPyAxLWkrTnVtRWxlbXMgOiBpK051bUVsZW1zKTsKKyAgICByZXR1cm4gREFHLmdldFZlY3RvclNodWZmbGUoVlQsIGRsLCBWWzBdLCBWWzFdLCAmTWFza1ZlY1swXSk7CisgIH0KKworICBpZiAoVmFsdWVzLnNpemUoKSA+IDEgJiYgVlQuZ2V0U2l6ZUluQml0cygpID09IDEyOCkgeworICAgIC8vIENoZWNrIGZvciBhIGJ1aWxkIHZlY3RvciBvZiBjb25zZWN1dGl2ZSBsb2Fkcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtRWxlbXM7ICsraSkKKyAgICAgIFZbaV0gPSBPcC5nZXRPcGVyYW5kKGkpOworICAgIAorICAgIC8vIENoZWNrIGZvciBlbGVtZW50cyB3aGljaCBhcmUgY29uc2VjdXRpdmUgbG9hZHMuCisgICAgU0RWYWx1ZSBMRCA9IEVsdHNGcm9tQ29uc2VjdXRpdmVMb2FkcyhWVCwgViwgZGwsIERBRyk7CisgICAgaWYgKExELmdldE5vZGUoKSkKKyAgICAgIHJldHVybiBMRDsKKyAgICAKKyAgICAvLyBGb3IgU1NFIDQuMSwgdXNlIGluc2VydHMgaW50byB1bmRlZi4gIAorICAgIGlmIChnZXRTdWJ0YXJnZXQoKS0+aGFzU1NFNDEoKSkgeworICAgICAgVlswXSA9IERBRy5nZXRVTkRFRihWVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtRWxlbXM7ICsraSkKKyAgICAgICAgaWYgKE9wLmdldE9wZXJhbmQoaSkuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpVTkRFRikKKyAgICAgICAgICBWWzBdID0gREFHLmdldE5vZGUoSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgZGwsIFZULCBWWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKGkpLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoaSkpOworICAgICAgcmV0dXJuIFZbMF07CisgICAgfQorICAgIAorICAgIC8vIE90aGVyd2lzZSwgZXhwYW5kIGludG8gYSBudW1iZXIgb2YgdW5wY2tsKgorICAgIC8vIGUuZy4gZm9yIHY0ZjMyCisgICAgLy8gICBTdGVwIDE6IHVucGNrbHBzIDAsIDIgPT0+IFg6IDw/LCA/LCAyLCAwPgorICAgIC8vICAgICAgICAgOiB1bnBja2xwcyAxLCAzID09PiBZOiA8PywgPywgMywgMT4KKyAgICAvLyAgIFN0ZXAgMjogdW5wY2tscHMgWCwgWSA9PT4gICAgPDMsIDIsIDEsIDA+CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUVsZW1zOyArK2kpCisgICAgICBWW2ldID0gREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwgVlQsIE9wLmdldE9wZXJhbmQoaSkpOworICAgIE51bUVsZW1zID4+PSAxOworICAgIHdoaWxlIChOdW1FbGVtcyAhPSAwKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtRWxlbXM7ICsraSkKKyAgICAgICAgVltpXSA9IGdldFVucGFja2woREFHLCBkbCwgVlQsIFZbaV0sIFZbaSArIE51bUVsZW1zXSk7CisgICAgICBOdW1FbGVtcyA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIFZbMF07CisgIH0KKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ09OQ0FUX1ZFQ1RPUlMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgLy8gV2Ugc3VwcG9ydCBjb25jYXRlbmF0ZSB0d28gTU1YIHJlZ2lzdGVycyBhbmQgcGxhY2UgdGhlbSBpbiBhIE1NWAorICAvLyByZWdpc3Rlci4gIFRoaXMgaXMgYmV0dGVyIHRoYW4gZG9pbmcgYSBzdGFjayBjb252ZXJ0LgorICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIEVWVCBSZXNWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBhc3NlcnQoT3AuZ2V0TnVtT3BlcmFuZHMoKSA9PSAyKTsKKyAgYXNzZXJ0KFJlc1ZUID09IE1WVDo6djJpNjQgfHwgUmVzVlQgPT0gTVZUOjp2NGkzMiB8fAorICAgICAgICAgUmVzVlQgPT0gTVZUOjp2OGkxNiB8fCBSZXNWVCA9PSBNVlQ6OnYxNmk4KTsKKyAgaW50IE1hc2tbMl07CisgIFNEVmFsdWUgSW5WZWMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULGRsLCBNVlQ6OnYxaTY0LCBPcC5nZXRPcGVyYW5kKDApKTsKKyAgU0RWYWx1ZSBWZWNPcCA9IERBRy5nZXROb2RlKFg4NklTRDo6TU9WUTJEUSwgZGwsIE1WVDo6djJpNjQsIEluVmVjKTsKKyAgSW5WZWMgPSBPcC5nZXRPcGVyYW5kKDEpOworICBpZiAoSW5WZWMuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTQ0FMQVJfVE9fVkVDVE9SKSB7CisgICAgdW5zaWduZWQgTnVtRWx0cyA9IFJlc1ZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgVmVjT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgUmVzVlQsIFZlY09wKTsKKyAgICBWZWNPcCA9IERBRy5nZXROb2RlKElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIGRsLCBSZXNWVCwgVmVjT3AsCisgICAgICAgICAgICAgICAgICAgICAgIEluVmVjLmdldE9wZXJhbmQoMCksIERBRy5nZXRJbnRQdHJDb25zdGFudChOdW1FbHRzLzIrMSkpOworICB9IGVsc2UgeworICAgIEluVmVjID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6djFpNjQsIEluVmVjKTsKKyAgICBTRFZhbHVlIFZlY09wMiA9IERBRy5nZXROb2RlKFg4NklTRDo6TU9WUTJEUSwgZGwsIE1WVDo6djJpNjQsIEluVmVjKTsKKyAgICBNYXNrWzBdID0gMDsgTWFza1sxXSA9IDI7CisgICAgVmVjT3AgPSBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShNVlQ6OnYyaTY0LCBkbCwgVmVjT3AsIFZlY09wMiwgTWFzayk7CisgIH0KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBSZXNWVCwgVmVjT3ApOworfQorCisvLyB2OGkxNiBzaHVmZmxlcyAtIFByZWZlciBzaHVmZmxlcyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorLy8gMS4gW2FsbF0gICBwc2h1Zmx3LCBwc2h1Zmh3LCBvcHRpb25hbCBtb3ZlCisvLyAyLiBbc3NzZTNdIDEgeCBwc2h1ZmIKKy8vIDMuIFtzc3NlM10gMiB4IHBzaHVmYiArIDEgeCBwb3IKKy8vIDQuIFthbGxdICAgbW92ICsgcHNodWZsdyArIHBzaHVmaHcgKyBOIHggKHBleHRydyArIHBpbnNydykKK3N0YXRpYworU0RWYWx1ZSBMb3dlclZFQ1RPUl9TSFVGRkxFdjhpMTYoU2h1ZmZsZVZlY3RvclNETm9kZSAqU1ZPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWDg2VGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICBTRFZhbHVlIFYxID0gU1ZPcC0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBWMiA9IFNWT3AtPmdldE9wZXJhbmQoMSk7CisgIERlYnVnTG9jIGRsID0gU1ZPcC0+Z2V0RGVidWdMb2MoKTsKKyAgU21hbGxWZWN0b3I8aW50LCA4PiBNYXNrVmFsczsKKworICAvLyBEZXRlcm1pbmUgaWYgbW9yZSB0aGFuIDEgb2YgdGhlIHdvcmRzIGluIGVhY2ggb2YgdGhlIGxvdyBhbmQgaGlnaCBxdWFkd29yZHMKKyAgLy8gb2YgdGhlIHJlc3VsdCBjb21lIGZyb20gdGhlIHNhbWUgcXVhZHdvcmQgb2Ygb25lIG9mIHRoZSB0d28gaW5wdXRzLiAgVW5kZWYKKyAgLy8gbWFzayB2YWx1ZXMgY291bnQgYXMgY29taW5nIGZyb20gYW55IHF1YWR3b3JkLCBmb3IgYmV0dGVyIGNvZGVnZW4uCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBMb1F1YWQoNCk7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBIaVF1YWQoNCk7CisgIEJpdFZlY3RvciBJbnB1dFF1YWRzKDQpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmUXVhZCA9IGkgPCA0ID8gTG9RdWFkIDogSGlRdWFkOworICAgIGludCBFbHRJZHggPSBTVk9wLT5nZXRNYXNrRWx0KGkpOworICAgIE1hc2tWYWxzLnB1c2hfYmFjayhFbHRJZHgpOworICAgIGlmIChFbHRJZHggPCAwKSB7CisgICAgICArK1F1YWRbMF07CisgICAgICArK1F1YWRbMV07CisgICAgICArK1F1YWRbMl07CisgICAgICArK1F1YWRbM107CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgKytRdWFkW0VsdElkeCAvIDRdOworICAgIElucHV0UXVhZHMuc2V0KEVsdElkeCAvIDQpOworICB9CisKKyAgaW50IEJlc3RMb1F1YWQgPSAtMTsKKyAgdW5zaWduZWQgTWF4UXVhZCA9IDE7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBpZiAoTG9RdWFkW2ldID4gTWF4UXVhZCkgeworICAgICAgQmVzdExvUXVhZCA9IGk7CisgICAgICBNYXhRdWFkID0gTG9RdWFkW2ldOworICAgIH0KKyAgfQorCisgIGludCBCZXN0SGlRdWFkID0gLTE7CisgIE1heFF1YWQgPSAxOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgaWYgKEhpUXVhZFtpXSA+IE1heFF1YWQpIHsKKyAgICAgIEJlc3RIaVF1YWQgPSBpOworICAgICAgTWF4UXVhZCA9IEhpUXVhZFtpXTsKKyAgICB9CisgIH0KKworICAvLyBGb3IgU1NTRTMsIElmIGFsbCA4IHdvcmRzIG9mIHRoZSByZXN1bHQgY29tZSBmcm9tIG9ubHkgMSBxdWFkd29yZCBvZiBlYWNoCisgIC8vIG9mIHRoZSB0d28gaW5wdXQgdmVjdG9ycywgc2h1ZmZsZSB0aGVtIGludG8gb25lIGlucHV0IHZlY3RvciBzbyBvbmx5IGEKKyAgLy8gc2luZ2xlIHBzaHVmYiBpbnN0cnVjdGlvbiBpcyBuZWNlc3NhcnkuIElmIFRoZXJlIGFyZSBtb3JlIHRoYW4gMiBpbnB1dAorICAvLyBxdWFkcywgZGlzYWJsZSB0aGUgbmV4dCB0cmFuc2Zvcm1hdGlvbiBzaW5jZSBpdCBkb2VzIG5vdCBoZWxwIFNTU0UzLgorICBib29sIFYxVXNlZCA9IElucHV0UXVhZHNbMF0gfHwgSW5wdXRRdWFkc1sxXTsKKyAgYm9vbCBWMlVzZWQgPSBJbnB1dFF1YWRzWzJdIHx8IElucHV0UXVhZHNbM107CisgIGlmIChUTEkuZ2V0U3VidGFyZ2V0KCktPmhhc1NTU0UzKCkpIHsKKyAgICBpZiAoSW5wdXRRdWFkcy5jb3VudCgpID09IDIgJiYgVjFVc2VkICYmIFYyVXNlZCkgeworICAgICAgQmVzdExvUXVhZCA9IElucHV0UXVhZHMuZmluZF9maXJzdCgpOworICAgICAgQmVzdEhpUXVhZCA9IElucHV0UXVhZHMuZmluZF9uZXh0KEJlc3RMb1F1YWQpOworICAgIH0KKyAgICBpZiAoSW5wdXRRdWFkcy5jb3VudCgpID4gMikgeworICAgICAgQmVzdExvUXVhZCA9IC0xOworICAgICAgQmVzdEhpUXVhZCA9IC0xOworICAgIH0KKyAgfQorCisgIC8vIElmIEJlc3RMb1F1YWQgb3IgQmVzdEhpUXVhZCBhcmUgc2V0LCBzaHVmZmxlIHRoZSBxdWFkcyB0b2dldGhlciBhbmQgdXBkYXRlCisgIC8vIHRoZSBzaHVmZmxlIG1hc2suICBJZiBhIHF1YWQgaXMgc2NvcmVkIGFzIC0xLCB0aGF0IG1lYW5zIHRoYXQgaXQgY29udGFpbnMKKyAgLy8gd29yZHMgZnJvbSBhbGwgNCBpbnB1dCBxdWFkd29yZHMuCisgIFNEVmFsdWUgTmV3VjsKKyAgaWYgKEJlc3RMb1F1YWQgPj0gMCB8fCBCZXN0SGlRdWFkID49IDApIHsKKyAgICBTbWFsbFZlY3RvcjxpbnQsIDg+IE1hc2tWOworICAgIE1hc2tWLnB1c2hfYmFjayhCZXN0TG9RdWFkIDwgMCA/IDAgOiBCZXN0TG9RdWFkKTsKKyAgICBNYXNrVi5wdXNoX2JhY2soQmVzdEhpUXVhZCA8IDAgPyAxIDogQmVzdEhpUXVhZCk7CisgICAgTmV3ViA9IERBRy5nZXRWZWN0b3JTaHVmZmxlKE1WVDo6djJpNjQsIGRsLAorICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6djJpNjQsIFYxKSwKKyAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYyaTY0LCBWMiksICZNYXNrVlswXSk7CisgICAgTmV3ViA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnY4aTE2LCBOZXdWKTsKKworICAgIC8vIFJld3JpdGUgdGhlIE1hc2tWYWxzIGFuZCBhc3NpZ24gTmV3ViB0byBWMSBpZiBOZXdWIG5vdyBjb250YWlucyBhbGwgdGhlCisgICAgLy8gc291cmNlIHdvcmRzIGZvciB0aGUgc2h1ZmZsZSwgdG8gYWlkIGxhdGVyIHRyYW5zZm9ybWF0aW9ucy4KKyAgICBib29sIEFsbFdvcmRzSW5OZXdWID0gdHJ1ZTsKKyAgICBib29sIEluT3JkZXJbMl0gPSB7IHRydWUsIHRydWUgfTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDg7ICsraSkgeworICAgICAgaW50IGlkeCA9IE1hc2tWYWxzW2ldOworICAgICAgaWYgKGlkeCAhPSAoaW50KWkpCisgICAgICAgIEluT3JkZXJbaS80XSA9IGZhbHNlOworICAgICAgaWYgKGlkeCA8IDAgfHwgKGlkeC80KSA9PSBCZXN0TG9RdWFkIHx8IChpZHgvNCkgPT0gQmVzdEhpUXVhZCkKKyAgICAgICAgY29udGludWU7CisgICAgICBBbGxXb3Jkc0luTmV3ViA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYm9vbCBwc2h1Zmx3ID0gQWxsV29yZHNJbk5ld1YsIHBzaHVmaHcgPSBBbGxXb3Jkc0luTmV3VjsKKyAgICBpZiAoQWxsV29yZHNJbk5ld1YpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IDg7ICsraSkgeworICAgICAgICBpbnQgaWR4ID0gTWFza1ZhbHNbaV07CisgICAgICAgIGlmIChpZHggPCAwKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZHggPSBNYXNrVmFsc1tpXSA9IChpZHggLyA0KSA9PSBCZXN0TG9RdWFkID8gKGlkeCAmIDMpIDogKGlkeCAmIDMpICsgNDsKKyAgICAgICAgaWYgKChpZHggIT0gaSkgJiYgaWR4IDwgNCkKKyAgICAgICAgICBwc2h1Zmh3ID0gZmFsc2U7CisgICAgICAgIGlmICgoaWR4ICE9IGkpICYmIGlkeCA+IDMpCisgICAgICAgICAgcHNodWZsdyA9IGZhbHNlOworICAgICAgfQorICAgICAgVjEgPSBOZXdWOworICAgICAgVjJVc2VkID0gZmFsc2U7CisgICAgICBCZXN0TG9RdWFkID0gMDsKKyAgICAgIEJlc3RIaVF1YWQgPSAxOworICAgIH0KKworICAgIC8vIElmIHdlJ3ZlIGVsaW1pbmF0ZWQgdGhlIHVzZSBvZiBWMiwgYW5kIHRoZSBuZXcgbWFzayBpcyBhIHBzaHVmbHcgb3IKKyAgICAvLyBwc2h1Zmh3LCB0aGF0J3MgYXMgY2hlYXAgYXMgaXQgZ2V0cy4gIFJldHVybiB0aGUgbmV3IHNodWZmbGUuCisgICAgaWYgKChwc2h1Zmh3ICYmIEluT3JkZXJbMF0pIHx8IChwc2h1Zmx3ICYmIEluT3JkZXJbMV0pKSB7CisgICAgICByZXR1cm4gREFHLmdldFZlY3RvclNodWZmbGUoTVZUOjp2OGkxNiwgZGwsIE5ld1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFVOREVGKE1WVDo6djhpMTYpLCAmTWFza1ZhbHNbMF0pOworICAgIH0KKyAgfQorCisgIC8vIElmIHdlIGhhdmUgU1NTRTMsIGFuZCBhbGwgd29yZHMgb2YgdGhlIHJlc3VsdCBhcmUgZnJvbSAxIGlucHV0IHZlY3RvciwKKyAgLy8gY2FzZSAyIGlzIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGNhc2UgMyBpcyBnZW5lcmF0ZWQuICBJZiBubyBTU1NFMworICAvLyBpcyBwcmVzZW50LCBmYWxsIGJhY2sgdG8gY2FzZSA0LgorICBpZiAoVExJLmdldFN1YnRhcmdldCgpLT5oYXNTU1NFMygpKSB7CisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwxNj4gcHNodWZiTWFzazsKKworICAgIC8vIElmIHdlIGhhdmUgZWxlbWVudHMgZnJvbSBib3RoIGlucHV0IHZlY3RvcnMsIHNldCB0aGUgaGlnaCBiaXQgb2YgdGhlCisgICAgLy8gc2h1ZmZsZSBtYXNrIGVsZW1lbnQgdG8gemVybyBvdXQgZWxlbWVudHMgdGhhdCBjb21lIGZyb20gVjIgaW4gdGhlIFYxCisgICAgLy8gbWFzaywgYW5kIGVsZW1lbnRzIHRoYXQgY29tZSBmcm9tIFYxIGluIHRoZSBWMiBtYXNrLCBzbyB0aGF0IHRoZSB0d28KKyAgICAvLyByZXN1bHRzIGNhbiBiZSBPUidkIHRvZ2V0aGVyLgorICAgIGJvb2wgVHdvSW5wdXRzID0gVjFVc2VkICYmIFYyVXNlZDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDg7ICsraSkgeworICAgICAgaW50IEVsdElkeCA9IE1hc2tWYWxzW2ldICogMjsKKyAgICAgIGlmIChUd29JbnB1dHMgJiYgKEVsdElkeCA+PSAxNikpIHsKKyAgICAgICAgcHNodWZiTWFzay5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KDB4ODAsIE1WVDo6aTgpKTsKKyAgICAgICAgcHNodWZiTWFzay5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KDB4ODAsIE1WVDo6aTgpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBwc2h1ZmJNYXNrLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoRWx0SWR4LCAgIE1WVDo6aTgpKTsKKyAgICAgIHBzaHVmYk1hc2sucHVzaF9iYWNrKERBRy5nZXRDb25zdGFudChFbHRJZHgrMSwgTVZUOjppOCkpOworICAgIH0KKyAgICBWMSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYxNmk4LCBWMSk7CisgICAgVjEgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlBTSFVGQiwgZGwsIE1WVDo6djE2aTgsIFYxLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjp2MTZpOCwgJnBzaHVmYk1hc2tbMF0sIDE2KSk7CisgICAgaWYgKCFUd29JbnB1dHMpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6djhpMTYsIFYxKTsKKworICAgIC8vIENhbGN1bGF0ZSB0aGUgc2h1ZmZsZSBtYXNrIGZvciB0aGUgc2Vjb25kIGlucHV0LCBzaHVmZmxlIGl0LCBhbmQKKyAgICAvLyBPUiBpdCB3aXRoIHRoZSBmaXJzdCBzaHVmZmxlZCBpbnB1dC4KKyAgICBwc2h1ZmJNYXNrLmNsZWFyKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSA4OyArK2kpIHsKKyAgICAgIGludCBFbHRJZHggPSBNYXNrVmFsc1tpXSAqIDI7CisgICAgICBpZiAoRWx0SWR4IDwgMTYpIHsKKyAgICAgICAgcHNodWZiTWFzay5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KDB4ODAsIE1WVDo6aTgpKTsKKyAgICAgICAgcHNodWZiTWFzay5wdXNoX2JhY2soREFHLmdldENvbnN0YW50KDB4ODAsIE1WVDo6aTgpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBwc2h1ZmJNYXNrLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoRWx0SWR4IC0gMTYsIE1WVDo6aTgpKTsKKyAgICAgIHBzaHVmYk1hc2sucHVzaF9iYWNrKERBRy5nZXRDb25zdGFudChFbHRJZHggLSAxNSwgTVZUOjppOCkpOworICAgIH0KKyAgICBWMiA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYxNmk4LCBWMik7CisgICAgVjIgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlBTSFVGQiwgZGwsIE1WVDo6djE2aTgsIFYyLAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjp2MTZpOCwgJnBzaHVmYk1hc2tbMF0sIDE2KSk7CisgICAgVjEgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTVZUOjp2MTZpOCwgVjEsIFYyKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6djhpMTYsIFYxKTsKKyAgfQorCisgIC8vIElmIEJlc3RMb1F1YWQgPj0gMCwgZ2VuZXJhdGUgYSBwc2h1Zmx3IHRvIHB1dCB0aGUgbG93IGVsZW1lbnRzIGluIG9yZGVyLAorICAvLyBhbmQgdXBkYXRlIE1hc2tWYWxzIHdpdGggbmV3IGVsZW1lbnQgb3JkZXIuCisgIEJpdFZlY3RvciBJbk9yZGVyKDgpOworICBpZiAoQmVzdExvUXVhZCA+PSAwKSB7CisgICAgU21hbGxWZWN0b3I8aW50LCA4PiBNYXNrVjsKKyAgICBmb3IgKGludCBpID0gMDsgaSAhPSA0OyArK2kpIHsKKyAgICAgIGludCBpZHggPSBNYXNrVmFsc1tpXTsKKyAgICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIE1hc2tWLnB1c2hfYmFjaygtMSk7CisgICAgICAgIEluT3JkZXIuc2V0KGkpOworICAgICAgfSBlbHNlIGlmICgoaWR4IC8gNCkgPT0gQmVzdExvUXVhZCkgeworICAgICAgICBNYXNrVi5wdXNoX2JhY2soaWR4ICYgMyk7CisgICAgICAgIEluT3JkZXIuc2V0KGkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTWFza1YucHVzaF9iYWNrKC0xKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gNDsgaSAhPSA4OyArK2kpCisgICAgICBNYXNrVi5wdXNoX2JhY2soaSk7CisgICAgTmV3ViA9IERBRy5nZXRWZWN0b3JTaHVmZmxlKE1WVDo6djhpMTYsIGRsLCBOZXdWLCBEQUcuZ2V0VU5ERUYoTVZUOjp2OGkxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNYXNrVlswXSk7CisgIH0KKworICAvLyBJZiBCZXN0SGkgPj0gMCwgZ2VuZXJhdGUgYSBwc2h1Zmh3IHRvIHB1dCB0aGUgaGlnaCBlbGVtZW50cyBpbiBvcmRlciwKKyAgLy8gYW5kIHVwZGF0ZSBNYXNrVmFscyB3aXRoIHRoZSBuZXcgZWxlbWVudCBvcmRlci4KKyAgaWYgKEJlc3RIaVF1YWQgPj0gMCkgeworICAgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFza1Y7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSA0OyArK2kpCisgICAgICBNYXNrVi5wdXNoX2JhY2soaSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gNDsgaSAhPSA4OyArK2kpIHsKKyAgICAgIGludCBpZHggPSBNYXNrVmFsc1tpXTsKKyAgICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIE1hc2tWLnB1c2hfYmFjaygtMSk7CisgICAgICAgIEluT3JkZXIuc2V0KGkpOworICAgICAgfSBlbHNlIGlmICgoaWR4IC8gNCkgPT0gQmVzdEhpUXVhZCkgeworICAgICAgICBNYXNrVi5wdXNoX2JhY2soKGlkeCAmIDMpICsgNCk7CisgICAgICAgIEluT3JkZXIuc2V0KGkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTWFza1YucHVzaF9iYWNrKC0xKTsKKyAgICAgIH0KKyAgICB9CisgICAgTmV3ViA9IERBRy5nZXRWZWN0b3JTaHVmZmxlKE1WVDo6djhpMTYsIGRsLCBOZXdWLCBEQUcuZ2V0VU5ERUYoTVZUOjp2OGkxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNYXNrVlswXSk7CisgIH0KKworICAvLyBJbiBjYXNlIEJlc3RIaSAmIEJlc3RMbyB3ZXJlIGJvdGggLTEsIHdoaWNoIG1lYW5zIGVhY2ggcXVhZHdvcmQgaGFzIGEgd29yZAorICAvLyBmcm9tIGVhY2ggb2YgdGhlIGZvdXIgaW5wdXQgcXVhZHdvcmRzLCBjYWxjdWxhdGUgdGhlIEluT3JkZXIgYml0dmVjdG9yIG5vdworICAvLyBiZWZvcmUgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBpbnNlcnQvZXh0cmFjdCBjbGVhbnVwLgorICBpZiAoQmVzdExvUXVhZCA9PSAtMSAmJiBCZXN0SGlRdWFkID09IC0xKSB7CisgICAgTmV3ViA9IFYxOworICAgIGZvciAoaW50IGkgPSAwOyBpICE9IDg7ICsraSkKKyAgICAgIGlmIChNYXNrVmFsc1tpXSA8IDAgfHwgTWFza1ZhbHNbaV0gPT0gaSkKKyAgICAgICAgSW5PcmRlci5zZXQoaSk7CisgIH0KKworICAvLyBUaGUgb3RoZXIgZWxlbWVudHMgYXJlIHB1dCBpbiB0aGUgcmlnaHQgcGxhY2UgdXNpbmcgcGV4dHJ3IGFuZCBwaW5zcncuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gODsgKytpKSB7CisgICAgaWYgKEluT3JkZXJbaV0pCisgICAgICBjb250aW51ZTsKKyAgICBpbnQgRWx0SWR4ID0gTWFza1ZhbHNbaV07CisgICAgaWYgKEVsdElkeCA8IDApCisgICAgICBjb250aW51ZTsKKyAgICBTRFZhbHVlIEV4dE9wID0gKEVsdElkeCA8IDgpCisgICAgPyBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE1WVDo6aTE2LCBWMSwKKyAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChFbHRJZHgpKQorICAgIDogREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBNVlQ6OmkxNiwgVjIsCisgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoRWx0SWR4IC0gOCkpOworICAgIE5ld1YgPSBEQUcuZ2V0Tm9kZShJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCBkbCwgTVZUOjp2OGkxNiwgTmV3ViwgRXh0T3AsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChpKSk7CisgIH0KKyAgcmV0dXJuIE5ld1Y7Cit9CisKKy8vIHYxNmk4IHNodWZmbGVzIC0gUHJlZmVyIHNodWZmbGVzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisvLyAxLiBbc3NzZTNdIDEgeCBwc2h1ZmIKKy8vIDIuIFtzc3NlM10gMiB4IHBzaHVmYiArIDEgeCBwb3IKKy8vIDMuIFthbGxdICAgdjhpMTYgc2h1ZmZsZSArIE4geCBwZXh0cncgKyByb3RhdGUgKyBwaW5zcncKK3N0YXRpYworU0RWYWx1ZSBMb3dlclZFQ1RPUl9TSFVGRkxFdjE2aTgoU2h1ZmZsZVZlY3RvclNETm9kZSAqU1ZPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWDg2VGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICBTRFZhbHVlIFYxID0gU1ZPcC0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBWMiA9IFNWT3AtPmdldE9wZXJhbmQoMSk7CisgIERlYnVnTG9jIGRsID0gU1ZPcC0+Z2V0RGVidWdMb2MoKTsKKyAgU21hbGxWZWN0b3I8aW50LCAxNj4gTWFza1ZhbHM7CisgIFNWT3AtPmdldE1hc2soTWFza1ZhbHMpOworCisgIC8vIElmIHdlIGhhdmUgU1NTRTMsIGNhc2UgMSBpcyBnZW5lcmF0ZWQgd2hlbiBhbGwgcmVzdWx0IGJ5dGVzIGNvbWUgZnJvbQorICAvLyBvbmUgb2YgIHRoZSBpbnB1dHMuICBPdGhlcndpc2UsIGNhc2UgMiBpcyBnZW5lcmF0ZWQuICBJZiBubyBTU1NFMyBpcworICAvLyBwcmVzZW50LCBmYWxsIGJhY2sgdG8gY2FzZSAzLgorICAvLyBGSVhNRToga2lsbCBWMk9ubHkgb25jZSBzaHVmZmxlcyBhcmUgY2Fub25pemFsaXplZCBieSBnZXROb2RlLgorICBib29sIFYxT25seSA9IHRydWU7CisgIGJvb2wgVjJPbmx5ID0gdHJ1ZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBpbnQgRWx0SWR4ID0gTWFza1ZhbHNbaV07CisgICAgaWYgKEVsdElkeCA8IDApCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoRWx0SWR4IDwgMTYpCisgICAgICBWMk9ubHkgPSBmYWxzZTsKKyAgICBlbHNlCisgICAgICBWMU9ubHkgPSBmYWxzZTsKKyAgfQorCisgIC8vIElmIFNTU0UzLCB1c2UgMSBwc2h1ZmIgaW5zdHJ1Y3Rpb24gcGVyIHZlY3RvciB3aXRoIGVsZW1lbnRzIGluIHRoZSByZXN1bHQuCisgIGlmIChUTEkuZ2V0U3VidGFyZ2V0KCktPmhhc1NTU0UzKCkpIHsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLDE2PiBwc2h1ZmJNYXNrOworCisgICAgLy8gSWYgYWxsIHJlc3VsdCBlbGVtZW50cyBhcmUgZnJvbSBvbmUgaW5wdXQgdmVjdG9yLCB0aGVuIG9ubHkgdHJhbnNsYXRlCisgICAgLy8gdW5kZWYgbWFzayB2YWx1ZXMgdG8gMHg4MCAoemVybyBvdXQgcmVzdWx0KSBpbiB0aGUgcHNodWZiIG1hc2suCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgZWxlbWVudHMgZnJvbSBib3RoIGlucHV0IHZlY3RvcnMsIGFuZCBtdXN0IHplcm8gb3V0CisgICAgLy8gZWxlbWVudHMgdGhhdCBjb21lIGZyb20gVjIgaW4gdGhlIGZpcnN0IG1hc2ssIGFuZCBWMSBpbiB0aGUgc2Vjb25kIG1hc2sKKyAgICAvLyBzbyB0aGF0IHdlIGNhbiBPUiB0aGVtIHRvZ2V0aGVyLgorICAgIGJvb2wgVHdvSW5wdXRzID0gIShWMU9ubHkgfHwgVjJPbmx5KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDE2OyArK2kpIHsKKyAgICAgIGludCBFbHRJZHggPSBNYXNrVmFsc1tpXTsKKyAgICAgIGlmIChFbHRJZHggPCAwIHx8IChUd29JbnB1dHMgJiYgRWx0SWR4ID49IDE2KSkgeworICAgICAgICBwc2h1ZmJNYXNrLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoMHg4MCwgTVZUOjppOCkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHBzaHVmYk1hc2sucHVzaF9iYWNrKERBRy5nZXRDb25zdGFudChFbHRJZHgsIE1WVDo6aTgpKTsKKyAgICB9CisgICAgLy8gSWYgYWxsIHRoZSBlbGVtZW50cyBhcmUgZnJvbSBWMiwgYXNzaWduIGl0IHRvIFYxIGFuZCByZXR1cm4gYWZ0ZXIKKyAgICAvLyBidWlsZGluZyB0aGUgZmlyc3QgcHNodWZiLgorICAgIGlmIChWMk9ubHkpCisgICAgICBWMSA9IFYyOworICAgIFYxID0gREFHLmdldE5vZGUoWDg2SVNEOjpQU0hVRkIsIGRsLCBNVlQ6OnYxNmk4LCBWMSwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6djE2aTgsICZwc2h1ZmJNYXNrWzBdLCAxNikpOworICAgIGlmICghVHdvSW5wdXRzKQorICAgICAgcmV0dXJuIFYxOworCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBzaHVmZmxlIG1hc2sgZm9yIHRoZSBzZWNvbmQgaW5wdXQsIHNodWZmbGUgaXQsIGFuZAorICAgIC8vIE9SIGl0IHdpdGggdGhlIGZpcnN0IHNodWZmbGVkIGlucHV0LgorICAgIHBzaHVmYk1hc2suY2xlYXIoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDE2OyArK2kpIHsKKyAgICAgIGludCBFbHRJZHggPSBNYXNrVmFsc1tpXTsKKyAgICAgIGlmIChFbHRJZHggPCAxNikgeworICAgICAgICBwc2h1ZmJNYXNrLnB1c2hfYmFjayhEQUcuZ2V0Q29uc3RhbnQoMHg4MCwgTVZUOjppOCkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHBzaHVmYk1hc2sucHVzaF9iYWNrKERBRy5nZXRDb25zdGFudChFbHRJZHggLSAxNiwgTVZUOjppOCkpOworICAgIH0KKyAgICBWMiA9IERBRy5nZXROb2RlKFg4NklTRDo6UFNIVUZCLCBkbCwgTVZUOjp2MTZpOCwgVjIsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OnYxNmk4LCAmcHNodWZiTWFza1swXSwgMTYpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIE1WVDo6djE2aTgsIFYxLCBWMik7CisgIH0KKworICAvLyBObyBTU1NFMyAtIENhbGN1bGF0ZSBpbiBwbGFjZSB3b3JkcyBhbmQgdGhlbiBmaXggYWxsIG91dCBvZiBwbGFjZSB3b3JkcworICAvLyBXaXRoIDAtMTYgZXh0cmFjdHMgJiBpbnNlcnRzLiAgV29yc3QgY2FzZSBpcyAxNiBieXRlcyBvdXQgb2Ygb3JkZXIgZnJvbQorICAvLyB0aGUgMTYgZGlmZmVyZW50IHdvcmRzIHRoYXQgY29tcHJpc2UgdGhlIHR3byBkb3VibGVxdWFkd29yZCBpbnB1dCB2ZWN0b3JzLgorICBWMSA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnY4aTE2LCBWMSk7CisgIFYyID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6djhpMTYsIFYyKTsKKyAgU0RWYWx1ZSBOZXdWID0gVjJPbmx5ID8gVjIgOiBWMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgIT0gODsgKytpKSB7CisgICAgaW50IEVsdDAgPSBNYXNrVmFsc1tpKjJdOworICAgIGludCBFbHQxID0gTWFza1ZhbHNbaSoyKzFdOworCisgICAgLy8gVGhpcyB3b3JkIG9mIHRoZSByZXN1bHQgaXMgYWxsIHVuZGVmLCBza2lwIGl0LgorICAgIGlmIChFbHQwIDwgMCAmJiBFbHQxIDwgMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gVGhpcyB3b3JkIG9mIHRoZSByZXN1bHQgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBwbGFjZSwgc2tpcCBpdC4KKyAgICBpZiAoVjFPbmx5ICYmIChFbHQwID09IGkqMikgJiYgKEVsdDEgPT0gaSoyKzEpKQorICAgICAgY29udGludWU7CisgICAgaWYgKFYyT25seSAmJiAoRWx0MCA9PSBpKjIrMTYpICYmIChFbHQxID09IGkqMisxNykpCisgICAgICBjb250aW51ZTsKKworICAgIFNEVmFsdWUgRWx0MFNyYyA9IEVsdDAgPCAxNiA/IFYxIDogVjI7CisgICAgU0RWYWx1ZSBFbHQxU3JjID0gRWx0MSA8IDE2ID8gVjEgOiBWMjsKKyAgICBTRFZhbHVlIEluc0VsdDsKKworICAgIC8vIElmIEVsdDAgYW5kIEVsdDEgYXJlIGRlZmluZWQsIGFyZSBjb25zZWN1dGl2ZSwgYW5kIGNhbiBiZSBsb2FkCisgICAgLy8gdXNpbmcgYSBzaW5nbGUgZXh0cmFjdCB0b2dldGhlciwgbG9hZCBpdCBhbmQgc3RvcmUgaXQuCisgICAgaWYgKChFbHQwID49IDApICYmICgoRWx0MCArIDEpID09IEVsdDEpICYmICgoRWx0MCAmIDEpID09IDApKSB7CisgICAgICBJbnNFbHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE1WVDo6aTE2LCBFbHQxU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEVsdDEgLyAyKSk7CisgICAgICBOZXdWID0gREFHLmdldE5vZGUoSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCwgZGwsIE1WVDo6djhpMTYsIE5ld1YsIEluc0VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudChpKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiBFbHQxIGlzIGRlZmluZWQsIGV4dHJhY3QgaXQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgc291cmNlLiAgSWYgdGhlCisgICAgLy8gc291cmNlIGJ5dGUgaXMgbm90IGFsc28gb2RkLCBzaGlmdCB0aGUgZXh0cmFjdGVkIHdvcmQgbGVmdCA4IGJpdHMKKyAgICAvLyBvdGhlcndpc2UgY2xlYXIgdGhlIGJvdHRvbSA4IGJpdHMgaWYgd2UgbmVlZCB0byBkbyBhbiBvci4KKyAgICBpZiAoRWx0MSA+PSAwKSB7CisgICAgICBJbnNFbHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE1WVDo6aTE2LCBFbHQxU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KEVsdDEgLyAyKSk7CisgICAgICBpZiAoKEVsdDEgJiAxKSA9PSAwKQorICAgICAgICBJbnNFbHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIE1WVDo6aTE2LCBJbnNFbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCg4LCBUTEkuZ2V0U2hpZnRBbW91bnRUeSgpKSk7CisgICAgICBlbHNlIGlmIChFbHQwID49IDApCisgICAgICAgIEluc0VsdCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTVZUOjppMTYsIEluc0VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDB4RkYwMCwgTVZUOjppMTYpKTsKKyAgICB9CisgICAgLy8gSWYgRWx0MCBpcyBkZWZpbmVkLCBleHRyYWN0IGl0IGZyb20gdGhlIGFwcHJvcHJpYXRlIHNvdXJjZS4gIElmIHRoZQorICAgIC8vIHNvdXJjZSBieXRlIGlzIG5vdCBhbHNvIGV2ZW4sIHNoaWZ0IHRoZSBleHRyYWN0ZWQgd29yZCByaWdodCA4IGJpdHMuIElmCisgICAgLy8gRWx0MSB3YXMgYWxzbyBkZWZpbmVkLCBPUiB0aGUgZXh0cmFjdGVkIHZhbHVlcyB0b2dldGhlciBiZWZvcmUKKyAgICAvLyBpbnNlcnRpbmcgdGhlbSBpbiB0aGUgcmVzdWx0LgorICAgIGlmIChFbHQwID49IDApIHsKKyAgICAgIFNEVmFsdWUgSW5zRWx0MCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgTVZUOjppMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbHQwU3JjLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoRWx0MCAvIDIpKTsKKyAgICAgIGlmICgoRWx0MCAmIDEpICE9IDApCisgICAgICAgIEluc0VsdDAgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE1WVDo6aTE2LCBJbnNFbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDgsIFRMSS5nZXRTaGlmdEFtb3VudFR5KCkpKTsKKyAgICAgIGVsc2UgaWYgKEVsdDEgPj0gMCkKKyAgICAgICAgSW5zRWx0MCA9IERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTVZUOjppMTYsIEluc0VsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgweDAwRkYsIE1WVDo6aTE2KSk7CisgICAgICBJbnNFbHQgPSBFbHQxID49IDAgPyBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTVZUOjppMTYsIEluc0VsdCwgSW5zRWx0MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IEluc0VsdDA7CisgICAgfQorICAgIE5ld1YgPSBEQUcuZ2V0Tm9kZShJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCBkbCwgTVZUOjp2OGkxNiwgTmV3ViwgSW5zRWx0LAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoaSkpOworICB9CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2MTZpOCwgTmV3Vik7Cit9CisKKy8vLyBSZXdyaXRlQXNOYXJyb3dlclNodWZmbGUgLSBUcnkgcmV3cml0aW5nIHY4aTE2IGFuZCB2MTZpOCBzaHVmZmxlcyBhcyA0IHdpZGUKKy8vLyBvbmVzLCBvciByZXdyaXRpbmcgdjRpMzIgLyB2MmkzMiBhcyAyIHdpZGUgb25lcyBpZiBwb3NzaWJsZS4gVGhpcyBjYW4gYmUKKy8vLyBkb25lIHdoZW4gZXZlcnkgcGFpciAvIHF1YWQgb2Ygc2h1ZmZsZSBtYXNrIGVsZW1lbnRzIHBvaW50IHRvIGVsZW1lbnRzIGluCisvLy8gdGhlIHJpZ2h0IHNlcXVlbmNlLiBlLmcuCisvLy8gdmVjdG9yX3NodWZmbGUgPD4sIDw+LCA8IDMsIDQsIHwgMTAsIDExLCB8IDAsIDEsIHwgMTQsIDE1Pgorc3RhdGljCitTRFZhbHVlIFJld3JpdGVBc05hcnJvd2VyU2h1ZmZsZShTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJLCBEZWJ1Z0xvYyBkbCkgeworICBFVlQgVlQgPSBTVk9wLT5nZXRWYWx1ZVR5cGUoMCk7CisgIFNEVmFsdWUgVjEgPSBTVk9wLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFYyID0gU1ZPcC0+Z2V0T3BlcmFuZCgxKTsKKyAgdW5zaWduZWQgTnVtRWxlbXMgPSBWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICB1bnNpZ25lZCBOZXdXaWR0aCA9IChOdW1FbGVtcyA9PSA0KSA/IDIgOiA0OworICBFVlQgTWFza1ZUID0gTVZUOjpnZXRJbnRWZWN0b3JXaXRoTnVtRWxlbWVudHMoTmV3V2lkdGgpOworICBFVlQgTmV3VlQgPSBNYXNrVlQ7CisgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UgJiYgIlVuZXhwZWN0ZWQhIik7CisgIGNhc2UgTVZUOjp2NGYzMjogTmV3VlQgPSBNVlQ6OnYyZjY0OyBicmVhazsKKyAgY2FzZSBNVlQ6OnY0aTMyOiBOZXdWVCA9IE1WVDo6djJpNjQ7IGJyZWFrOworICBjYXNlIE1WVDo6djhpMTY6IE5ld1ZUID0gTVZUOjp2NGkzMjsgYnJlYWs7CisgIGNhc2UgTVZUOjp2MTZpODogTmV3VlQgPSBNVlQ6OnY0aTMyOyBicmVhazsKKyAgfQorCisgIGlmIChOZXdXaWR0aCA9PSAyKSB7CisgICAgaWYgKFZULmlzSW50ZWdlcigpKQorICAgICAgTmV3VlQgPSBNVlQ6OnYyaTY0OworICAgIGVsc2UKKyAgICAgIE5ld1ZUID0gTVZUOjp2MmY2NDsKKyAgfQorICBpbnQgU2NhbGUgPSBOdW1FbGVtcyAvIE5ld1dpZHRoOworICBTbWFsbFZlY3RvcjxpbnQsIDg+IE1hc2tWZWM7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1FbGVtczsgaSArPSBTY2FsZSkgeworICAgIGludCBTdGFydElkeCA9IC0xOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgU2NhbGU7ICsraikgeworICAgICAgaW50IEVsdElkeCA9IFNWT3AtPmdldE1hc2tFbHQoaStqKTsKKyAgICAgIGlmIChFbHRJZHggPCAwKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChTdGFydElkeCA9PSAtMSkKKyAgICAgICAgU3RhcnRJZHggPSBFbHRJZHggLSAoRWx0SWR4ICUgU2NhbGUpOworICAgICAgaWYgKEVsdElkeCAhPSBTdGFydElkeCArIGopCisgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgfQorICAgIGlmIChTdGFydElkeCA9PSAtMSkKKyAgICAgIE1hc2tWZWMucHVzaF9iYWNrKC0xKTsKKyAgICBlbHNlCisgICAgICBNYXNrVmVjLnB1c2hfYmFjayhTdGFydElkeCAvIFNjYWxlKTsKKyAgfQorCisgIFYxID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE5ld1ZULCBWMSk7CisgIFYyID0gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE5ld1ZULCBWMik7CisgIHJldHVybiBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShOZXdWVCwgZGwsIFYxLCBWMiwgJk1hc2tWZWNbMF0pOworfQorCisvLy8gZ2V0VlpleHRNb3ZMIC0gUmV0dXJuIGEgemVyby1leHRlbmRpbmcgdmVjdG9yIG1vdmUgbG93IG5vZGUuCisvLy8KK3N0YXRpYyBTRFZhbHVlIGdldFZaZXh0TW92TChFVlQgVlQsIEVWVCBPcFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU3JjT3AsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFg4NlN1YnRhcmdldCAqU3VidGFyZ2V0LCBEZWJ1Z0xvYyBkbCkgeworICBpZiAoVlQgPT0gTVZUOjp2MmY2NCB8fCBWVCA9PSBNVlQ6OnY0ZjMyKSB7CisgICAgTG9hZFNETm9kZSAqTEQgPSBOVUxMOworICAgIGlmICghaXNTY2FsYXJMb2FkVG9WZWN0b3IoU3JjT3AuZ2V0Tm9kZSgpLCAmTEQpKQorICAgICAgTEQgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihTcmNPcCk7CisgICAgaWYgKCFMRCkgeworICAgICAgLy8gbW92c3NyciBhbmQgbW92c2RyciBkbyBub3QgY2xlYXIgdG9wIGJpdHMuIFRyeSB0byB1c2UgbW92ZCwgbW92cQorICAgICAgLy8gaW5zdGVhZC4KKyAgICAgIE1WVCBFeHRWVCA9IChPcFZUID09IE1WVDo6djJmNjQpID8gTVZUOjppNjQgOiBNVlQ6OmkzMjsKKyAgICAgIGlmICgoRXh0VlQuU2ltcGxlVHkgIT0gTVZUOjppNjQgfHwgU3VidGFyZ2V0LT5pczY0Qml0KCkpICYmCisgICAgICAgICAgU3JjT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTQ0FMQVJfVE9fVkVDVE9SICYmCisgICAgICAgICAgU3JjT3AuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJJVF9DT05WRVJUICYmCisgICAgICAgICAgU3JjT3AuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpID09IEV4dFZUKSB7CisgICAgICAgIC8vIFBSMjEwOAorICAgICAgICBPcFZUID0gKE9wVlQgPT0gTVZUOjp2MmY2NCkgPyBNVlQ6OnYyaTY0IDogTVZUOjp2NGkzMjsKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKFg4NklTRDo6VlpFWFRfTU9WTCwgZGwsIE9wVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY09wLmdldE9wZXJhbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0T3BlcmFuZCgwKSkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoWDg2SVNEOjpWWkVYVF9NT1ZMLCBkbCwgT3BWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BWVCwgU3JjT3ApKSk7Cit9CisKKy8vLyBMb3dlclZFQ1RPUl9TSFVGRkxFXzR3aWRlIC0gSGFuZGxlIGFsbCA0IHdpZGUgY2FzZXMgd2l0aCBhIG51bWJlciBvZgorLy8vIHNodWZmbGVzLgorc3RhdGljIFNEVmFsdWUKK0xvd2VyVkVDVE9SX1NIVUZGTEVfNHdpZGUoU2h1ZmZsZVZlY3RvclNETm9kZSAqU1ZPcCwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgU0RWYWx1ZSBWMSA9IFNWT3AtPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgVjIgPSBTVk9wLT5nZXRPcGVyYW5kKDEpOworICBEZWJ1Z0xvYyBkbCA9IFNWT3AtPmdldERlYnVnTG9jKCk7CisgIEVWVCBWVCA9IFNWT3AtPmdldFZhbHVlVHlwZSgwKTsKKworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8aW50LCBpbnQ+LCA4PiBMb2NzOworICBMb2NzLnJlc2l6ZSg0KTsKKyAgU21hbGxWZWN0b3I8aW50LCA4PiBNYXNrMSg0VSwgLTEpOworICBTbWFsbFZlY3RvcjxpbnQsIDg+IFBlcm1NYXNrOworICBTVk9wLT5nZXRNYXNrKFBlcm1NYXNrKTsKKworICB1bnNpZ25lZCBOdW1IaSA9IDA7CisgIHVuc2lnbmVkIE51bUxvID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSA0OyArK2kpIHsKKyAgICBpbnQgSWR4ID0gUGVybU1hc2tbaV07CisgICAgaWYgKElkeCA8IDApIHsKKyAgICAgIExvY3NbaV0gPSBzdGQ6Om1ha2VfcGFpcigtMSwgLTEpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoSWR4IDwgOCAmJiAiSW52YWxpZCBWRUNUT1JfU0hVRkZMRSBpbmRleCEiKTsKKyAgICAgIGlmIChJZHggPCA0KSB7CisgICAgICAgIExvY3NbaV0gPSBzdGQ6Om1ha2VfcGFpcigwLCBOdW1Mbyk7CisgICAgICAgIE1hc2sxW051bUxvXSA9IElkeDsKKyAgICAgICAgTnVtTG8rKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExvY3NbaV0gPSBzdGQ6Om1ha2VfcGFpcigxLCBOdW1IaSk7CisgICAgICAgIGlmICgyK051bUhpIDwgNCkKKyAgICAgICAgICBNYXNrMVsyK051bUhpXSA9IElkeDsKKyAgICAgICAgTnVtSGkrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoTnVtTG8gPD0gMiAmJiBOdW1IaSA8PSAyKSB7CisgICAgLy8gSWYgbm8gbW9yZSB0aGFuIHR3byBlbGVtZW50cyBjb21lIGZyb20gZWl0aGVyIHZlY3Rvci4gVGhpcyBjYW4gYmUKKyAgICAvLyBpbXBsZW1lbnRlZCB3aXRoIHR3byBzaHVmZmxlcy4gRmlyc3Qgc2h1ZmZsZSBnYXRoZXIgdGhlIGVsZW1lbnRzLgorICAgIC8vIFRoZSBzZWNvbmQgc2h1ZmZsZSwgd2hpY2ggdGFrZXMgdGhlIGZpcnN0IHNodWZmbGUgYXMgYm90aCBvZiBpdHMKKyAgICAvLyB2ZWN0b3Igb3BlcmFuZHMsIHB1dCB0aGUgZWxlbWVudHMgaW50byB0aGUgcmlnaHQgb3JkZXIuCisgICAgVjEgPSBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShWVCwgZGwsIFYxLCBWMiwgJk1hc2sxWzBdKTsKKworICAgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFzazIoNFUsIC0xKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gNDsgKytpKSB7CisgICAgICBpZiAoTG9jc1tpXS5maXJzdCA9PSAtMSkKKyAgICAgICAgY29udGludWU7CisgICAgICBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgSWR4ID0gKGkgPCAyKSA/IDAgOiA0OworICAgICAgICBJZHggKz0gTG9jc1tpXS5maXJzdCAqIDIgKyBMb2NzW2ldLnNlY29uZDsKKyAgICAgICAgTWFzazJbaV0gPSBJZHg7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIERBRy5nZXRWZWN0b3JTaHVmZmxlKFZULCBkbCwgVjEsIFYxLCAmTWFzazJbMF0pOworICB9IGVsc2UgaWYgKE51bUxvID09IDMgfHwgTnVtSGkgPT0gMykgeworICAgIC8vIE90aGVyd2lzZSwgd2UgbXVzdCBoYXZlIHRocmVlIGVsZW1lbnRzIGZyb20gb25lIHZlY3RvciwgY2FsbCBpdCBYLCBhbmQKKyAgICAvLyBvbmUgZWxlbWVudCBmcm9tIHRoZSBvdGhlciwgY2FsbCBpdCBZLiAgRmlyc3QsIHVzZSBhIHNodWZwcyB0byBidWlsZCBhbgorICAgIC8vIGludGVybWVkaWF0ZSB2ZWN0b3Igd2l0aCB0aGUgb25lIGVsZW1lbnQgZnJvbSBZIGFuZCB0aGUgZWxlbWVudCBmcm9tIFgKKyAgICAvLyB0aGF0IHdpbGwgYmUgaW4gdGhlIHNhbWUgaGFsZiBpbiB0aGUgZmluYWwgZGVzdGluYXRpb24gKHRoZSBpbmRleGVzIGRvbid0CisgICAgLy8gbWF0dGVyKS4gVGhlbiwgdXNlIGEgc2h1ZnBzIHRvIGJ1aWxkIHRoZSBmaW5hbCB2ZWN0b3IsIHRha2luZyB0aGUgaGFsZgorICAgIC8vIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgZnJvbSBZIGZyb20gdGhlIGludGVybWVkaWF0ZSwgYW5kIHRoZSBvdGhlciBoYWxmCisgICAgLy8gZnJvbSBYLgorICAgIGlmIChOdW1IaSA9PSAzKSB7CisgICAgICAvLyBOb3JtYWxpemUgaXQgc28gdGhlIDMgZWxlbWVudHMgY29tZSBmcm9tIFYxLgorICAgICAgQ29tbXV0ZVZlY3RvclNodWZmbGVNYXNrKFBlcm1NYXNrLCBWVCk7CisgICAgICBzdGQ6OnN3YXAoVjEsIFYyKTsKKyAgICB9CisKKyAgICAvLyBGaW5kIHRoZSBlbGVtZW50IGZyb20gVjIuCisgICAgdW5zaWduZWQgSGlJbmRleDsKKyAgICBmb3IgKEhpSW5kZXggPSAwOyBIaUluZGV4IDwgMzsgKytIaUluZGV4KSB7CisgICAgICBpbnQgVmFsID0gUGVybU1hc2tbSGlJbmRleF07CisgICAgICBpZiAoVmFsIDwgMCkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoVmFsID49IDQpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIE1hc2sxWzBdID0gUGVybU1hc2tbSGlJbmRleF07CisgICAgTWFzazFbMV0gPSAtMTsKKyAgICBNYXNrMVsyXSA9IFBlcm1NYXNrW0hpSW5kZXheMV07CisgICAgTWFzazFbM10gPSAtMTsKKyAgICBWMiA9IERBRy5nZXRWZWN0b3JTaHVmZmxlKFZULCBkbCwgVjEsIFYyLCAmTWFzazFbMF0pOworCisgICAgaWYgKEhpSW5kZXggPj0gMikgeworICAgICAgTWFzazFbMF0gPSBQZXJtTWFza1swXTsKKyAgICAgIE1hc2sxWzFdID0gUGVybU1hc2tbMV07CisgICAgICBNYXNrMVsyXSA9IEhpSW5kZXggJiAxID8gNiA6IDQ7CisgICAgICBNYXNrMVszXSA9IEhpSW5kZXggJiAxID8gNCA6IDY7CisgICAgICByZXR1cm4gREFHLmdldFZlY3RvclNodWZmbGUoVlQsIGRsLCBWMSwgVjIsICZNYXNrMVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE1hc2sxWzBdID0gSGlJbmRleCAmIDEgPyAyIDogMDsKKyAgICAgIE1hc2sxWzFdID0gSGlJbmRleCAmIDEgPyAwIDogMjsKKyAgICAgIE1hc2sxWzJdID0gUGVybU1hc2tbMl07CisgICAgICBNYXNrMVszXSA9IFBlcm1NYXNrWzNdOworICAgICAgaWYgKE1hc2sxWzJdID49IDApCisgICAgICAgIE1hc2sxWzJdICs9IDQ7CisgICAgICBpZiAoTWFzazFbM10gPj0gMCkKKyAgICAgICAgTWFzazFbM10gKz0gNDsKKyAgICAgIHJldHVybiBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShWVCwgZGwsIFYyLCBWMSwgJk1hc2sxWzBdKTsKKyAgICB9CisgIH0KKworICAvLyBCcmVhayBpdCBpbnRvIChzaHVmZmxlIHNodWZmbGVfaGksIHNodWZmbGVfbG8pLgorICBMb2NzLmNsZWFyKCk7CisgIFNtYWxsVmVjdG9yPGludCw4PiBMb01hc2soNFUsIC0xKTsKKyAgU21hbGxWZWN0b3I8aW50LDg+IEhpTWFzayg0VSwgLTEpOworCisgIFNtYWxsVmVjdG9yPGludCw4PiAqTWFza1B0ciA9ICZMb01hc2s7CisgIHVuc2lnbmVkIE1hc2tJZHggPSAwOworICB1bnNpZ25lZCBMb0lkeCA9IDA7CisgIHVuc2lnbmVkIEhpSWR4ID0gMjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSA0OyArK2kpIHsKKyAgICBpZiAoaSA9PSAyKSB7CisgICAgICBNYXNrUHRyID0gJkhpTWFzazsKKyAgICAgIE1hc2tJZHggPSAxOworICAgICAgTG9JZHggPSAwOworICAgICAgSGlJZHggPSAyOworICAgIH0KKyAgICBpbnQgSWR4ID0gUGVybU1hc2tbaV07CisgICAgaWYgKElkeCA8IDApIHsKKyAgICAgIExvY3NbaV0gPSBzdGQ6Om1ha2VfcGFpcigtMSwgLTEpOworICAgIH0gZWxzZSBpZiAoSWR4IDwgNCkgeworICAgICAgTG9jc1tpXSA9IHN0ZDo6bWFrZV9wYWlyKE1hc2tJZHgsIExvSWR4KTsKKyAgICAgICgqTWFza1B0cilbTG9JZHhdID0gSWR4OworICAgICAgTG9JZHgrKzsKKyAgICB9IGVsc2UgeworICAgICAgTG9jc1tpXSA9IHN0ZDo6bWFrZV9wYWlyKE1hc2tJZHgsIEhpSWR4KTsKKyAgICAgICgqTWFza1B0cilbSGlJZHhdID0gSWR4OworICAgICAgSGlJZHgrKzsKKyAgICB9CisgIH0KKworICBTRFZhbHVlIExvU2h1ZmZsZSA9IERBRy5nZXRWZWN0b3JTaHVmZmxlKFZULCBkbCwgVjEsIFYyLCAmTG9NYXNrWzBdKTsKKyAgU0RWYWx1ZSBIaVNodWZmbGUgPSBEQUcuZ2V0VmVjdG9yU2h1ZmZsZShWVCwgZGwsIFYxLCBWMiwgJkhpTWFza1swXSk7CisgIFNtYWxsVmVjdG9yPGludCwgOD4gTWFza09wczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSA0OyArK2kpIHsKKyAgICBpZiAoTG9jc1tpXS5maXJzdCA9PSAtMSkgeworICAgICAgTWFza09wcy5wdXNoX2JhY2soLTEpOworICAgIH0gZWxzZSB7CisgICAgICB1bnNpZ25lZCBJZHggPSBMb2NzW2ldLmZpcnN0ICogNCArIExvY3NbaV0uc2Vjb25kOworICAgICAgTWFza09wcy5wdXNoX2JhY2soSWR4KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIERBRy5nZXRWZWN0b3JTaHVmZmxlKFZULCBkbCwgTG9TaHVmZmxlLCBIaVNodWZmbGUsICZNYXNrT3BzWzBdKTsKK30KKworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyVkVDVE9SX1NIVUZGTEUoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU2h1ZmZsZVZlY3RvclNETm9kZSAqU1ZPcCA9IGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oT3ApOworICBTRFZhbHVlIFYxID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBWMiA9IE9wLmdldE9wZXJhbmQoMSk7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIHVuc2lnbmVkIE51bUVsZW1zID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgYm9vbCBpc01NWCA9IFZULmdldFNpemVJbkJpdHMoKSA9PSA2NDsKKyAgYm9vbCBWMUlzVW5kZWYgPSBWMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGOworICBib29sIFYySXNVbmRlZiA9IFYyLmdldE9wY29kZSgpID09IElTRDo6VU5ERUY7CisgIGJvb2wgVjFJc1NwbGF0ID0gZmFsc2U7CisgIGJvb2wgVjJJc1NwbGF0ID0gZmFsc2U7CisKKyAgaWYgKGlzWmVyb1NodWZmbGUoU1ZPcCkpCisgICAgcmV0dXJuIGdldFplcm9WZWN0b3IoVlQsIFN1YnRhcmdldC0+aGFzU1NFMigpLCBEQUcsIGRsKTsKKworICAvLyBQcm9tb3RlIHNwbGF0cyB0byB2NGYzMi4KKyAgaWYgKFNWT3AtPmlzU3BsYXQoKSkgeworICAgIGlmIChpc01NWCB8fCBOdW1FbGVtcyA8IDQpCisgICAgICByZXR1cm4gT3A7CisgICAgcmV0dXJuIFByb21vdGVTcGxhdChTVk9wLCBEQUcsIFN1YnRhcmdldC0+aGFzU1NFMigpKTsKKyAgfQorCisgIC8vIElmIHRoZSBzaHVmZmxlIGNhbiBiZSBwcm9maXRhYmx5IHJld3JpdHRlbiBhcyBhIG5hcnJvd2VyIHNodWZmbGUsIHRoZW4KKyAgLy8gZG8gaXQhCisgIGlmIChWVCA9PSBNVlQ6OnY4aTE2IHx8IFZUID09IE1WVDo6djE2aTgpIHsKKyAgICBTRFZhbHVlIE5ld09wID0gUmV3cml0ZUFzTmFycm93ZXJTaHVmZmxlKFNWT3AsIERBRywgKnRoaXMsIGRsKTsKKyAgICBpZiAoTmV3T3AuZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMb3dlclZFQ1RPUl9TSFVGRkxFKE5ld09wLCBEQUcpKTsKKyAgfSBlbHNlIGlmICgoVlQgPT0gTVZUOjp2NGkzMiB8fCAoVlQgPT0gTVZUOjp2NGYzMiAmJiBTdWJ0YXJnZXQtPmhhc1NTRTIoKSkpKSB7CisgICAgLy8gRklYTUU6IEZpZ3VyZSBvdXQgYSBjbGVhbmVyIHdheSB0byBkbyB0aGlzLgorICAgIC8vIFRyeSB0byBtYWtlIHVzZSBvZiBtb3ZxIHRvIHplcm8gb3V0IHRoZSB0b3AgcGFydC4KKyAgICBpZiAoSVNEOjppc0J1aWxkVmVjdG9yQWxsWmVyb3MoVjIuZ2V0Tm9kZSgpKSkgeworICAgICAgU0RWYWx1ZSBOZXdPcCA9IFJld3JpdGVBc05hcnJvd2VyU2h1ZmZsZShTVk9wLCBEQUcsICp0aGlzLCBkbCk7CisgICAgICBpZiAoTmV3T3AuZ2V0Tm9kZSgpKSB7CisgICAgICAgIGlmIChpc0NvbW11dGVkTU9WTChjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE5ld09wKSwgdHJ1ZSwgZmFsc2UpKQorICAgICAgICAgIHJldHVybiBnZXRWWmV4dE1vdkwoVlQsIE5ld09wLmdldFZhbHVlVHlwZSgpLCBOZXdPcC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLCBTdWJ0YXJnZXQsIGRsKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKElTRDo6aXNCdWlsZFZlY3RvckFsbFplcm9zKFYxLmdldE5vZGUoKSkpIHsKKyAgICAgIFNEVmFsdWUgTmV3T3AgPSBSZXdyaXRlQXNOYXJyb3dlclNodWZmbGUoU1ZPcCwgREFHLCAqdGhpcywgZGwpOworICAgICAgaWYgKE5ld09wLmdldE5vZGUoKSAmJiBYODY6OmlzTU9WTE1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOZXdPcCkpKQorICAgICAgICByZXR1cm4gZ2V0VlpleHRNb3ZMKFZULCBOZXdPcC5nZXRWYWx1ZVR5cGUoKSwgTmV3T3AuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcsIFN1YnRhcmdldCwgZGwpOworICAgIH0KKyAgfQorCisgIGlmIChYODY6OmlzUFNIVUZETWFzayhTVk9wKSkKKyAgICByZXR1cm4gT3A7CisKKyAgLy8gQ2hlY2sgaWYgdGhpcyBjYW4gYmUgY29udmVydGVkIGludG8gYSBsb2dpY2FsIHNoaWZ0LgorICBib29sIGlzTGVmdCA9IGZhbHNlOworICB1bnNpZ25lZCBTaEFtdCA9IDA7CisgIFNEVmFsdWUgU2hWYWw7CisgIGJvb2wgaXNTaGlmdCA9IGdldFN1YnRhcmdldCgpLT5oYXNTU0UyKCkgJiYKKyAgICBpc1ZlY3RvclNoaWZ0KFNWT3AsIERBRywgaXNMZWZ0LCBTaFZhbCwgU2hBbXQpOworICBpZiAoaXNTaGlmdCAmJiBTaFZhbC5oYXNPbmVVc2UoKSkgeworICAgIC8vIElmIHRoZSBzaGlmdGVkIHZhbHVlIGhhcyBtdWx0aXBsZSB1c2VzLCBpdCBtYXkgYmUgY2hlYXBlciB0byB1c2UKKyAgICAvLyB2X3NldDAgKyBtb3ZsaHBzIG9yIG1vdmhscHMsIGV0Yy4KKyAgICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgIFNoQW10ICo9IEVsdFZULmdldFNpemVJbkJpdHMoKTsKKyAgICByZXR1cm4gZ2V0VlNoaWZ0KGlzTGVmdCwgVlQsIFNoVmFsLCBTaEFtdCwgREFHLCAqdGhpcywgZGwpOworICB9CisKKyAgaWYgKFg4Njo6aXNNT1ZMTWFzayhTVk9wKSkgeworICAgIGlmIChWMUlzVW5kZWYpCisgICAgICByZXR1cm4gVjI7CisgICAgaWYgKElTRDo6aXNCdWlsZFZlY3RvckFsbFplcm9zKFYxLmdldE5vZGUoKSkpCisgICAgICByZXR1cm4gZ2V0VlpleHRNb3ZMKFZULCBWVCwgVjIsIERBRywgU3VidGFyZ2V0LCBkbCk7CisgICAgaWYgKCFpc01NWCkKKyAgICAgIHJldHVybiBPcDsKKyAgfQorCisgIC8vIEZJWE1FOiBmb2xkIHRoZXNlIGludG8gbGVnYWwgbWFzay4KKyAgaWYgKCFpc01NWCAmJiAoWDg2Ojppc01PVlNIRFVQTWFzayhTVk9wKSB8fAorICAgICAgICAgICAgICAgICBYODY6OmlzTU9WU0xEVVBNYXNrKFNWT3ApIHx8CisgICAgICAgICAgICAgICAgIFg4Njo6aXNNT1ZITFBTTWFzayhTVk9wKSB8fAorICAgICAgICAgICAgICAgICBYODY6OmlzTU9WTEhQU01hc2soU1ZPcCkgfHwKKyAgICAgICAgICAgICAgICAgWDg2Ojppc01PVkxQTWFzayhTVk9wKSkpCisgICAgcmV0dXJuIE9wOworCisgIGlmIChTaG91bGRYZm9ybVRvTU9WSExQUyhTVk9wKSB8fAorICAgICAgU2hvdWxkWGZvcm1Ub01PVkxQKFYxLmdldE5vZGUoKSwgVjIuZ2V0Tm9kZSgpLCBTVk9wKSkKKyAgICByZXR1cm4gQ29tbXV0ZVZlY3RvclNodWZmbGUoU1ZPcCwgREFHKTsKKworICBpZiAoaXNTaGlmdCkgeworICAgIC8vIE5vIGJldHRlciBvcHRpb25zLiBVc2UgYSB2c2hsIC8gdnNybC4KKyAgICBFVlQgRWx0VlQgPSBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgIFNoQW10ICo9IEVsdFZULmdldFNpemVJbkJpdHMoKTsKKyAgICByZXR1cm4gZ2V0VlNoaWZ0KGlzTGVmdCwgVlQsIFNoVmFsLCBTaEFtdCwgREFHLCAqdGhpcywgZGwpOworICB9CisKKyAgYm9vbCBDb21tdXRlZCA9IGZhbHNlOworICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYWxzbyBhY2NlcHQgYSBiaXRjYXN0IG9mIGEgc3BsYXQ/ICBCZSBjYXJlZnVsLCBub3QKKyAgLy8gMSwxLDEsMSAtPiB2OGkxNiB0aG91Z2guCisgIFYxSXNTcGxhdCA9IGlzU3BsYXRWZWN0b3IoVjEuZ2V0Tm9kZSgpKTsKKyAgVjJJc1NwbGF0ID0gaXNTcGxhdFZlY3RvcihWMi5nZXROb2RlKCkpOworCisgIC8vIENhbm9uaWNhbGl6ZSB0aGUgc3BsYXQgb3IgdW5kZWYsIGlmIHByZXNlbnQsIHRvIGJlIG9uIHRoZSBSSFMuCisgIGlmICgoVjFJc1NwbGF0IHx8IFYxSXNVbmRlZikgJiYgIShWMklzU3BsYXQgfHwgVjJJc1VuZGVmKSkgeworICAgIE9wID0gQ29tbXV0ZVZlY3RvclNodWZmbGUoU1ZPcCwgREFHKTsKKyAgICBTVk9wID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihPcCk7CisgICAgVjEgPSBTVk9wLT5nZXRPcGVyYW5kKDApOworICAgIFYyID0gU1ZPcC0+Z2V0T3BlcmFuZCgxKTsKKyAgICBzdGQ6OnN3YXAoVjFJc1NwbGF0LCBWMklzU3BsYXQpOworICAgIHN0ZDo6c3dhcChWMUlzVW5kZWYsIFYySXNVbmRlZik7CisgICAgQ29tbXV0ZWQgPSB0cnVlOworICB9CisKKyAgaWYgKGlzQ29tbXV0ZWRNT1ZMKFNWT3AsIFYySXNTcGxhdCwgVjJJc1VuZGVmKSkgeworICAgIC8vIFNodWZmbGluZyBsb3cgZWxlbWVudCBvZiB2MSBpbnRvIHVuZGVmLCBqdXN0IHJldHVybiB2MS4KKyAgICBpZiAoVjJJc1VuZGVmKQorICAgICAgcmV0dXJuIFYxOworICAgIC8vIElmIFYyIGlzIGEgc3BsYXQsIHRoZSBtYXNrIG1heSBiZSBtYWxmb3JtZWQgc3VjaCBhcyA8NCwzLDMsMz4sIHdoaWNoCisgICAgLy8gdGhlIGluc3RydWN0aW9uIHNlbGVjdG9yIHdpbGwgbm90IG1hdGNoLCBzbyBnZXQgYSBjYW5vbmljYWwgTU9WTCB3aXRoCisgICAgLy8gc3dhcHBlZCBvcGVyYW5kcyB0byB1bmRvIHRoZSBjb21tdXRlLgorICAgIHJldHVybiBnZXRNT1ZMKERBRywgZGwsIFZULCBWMiwgVjEpOworICB9CisKKyAgaWYgKFg4Njo6aXNVTlBDS0xfdl91bmRlZl9NYXNrKFNWT3ApIHx8CisgICAgICBYODY6OmlzVU5QQ0tIX3ZfdW5kZWZfTWFzayhTVk9wKSB8fAorICAgICAgWDg2Ojppc1VOUENLTE1hc2soU1ZPcCkgfHwKKyAgICAgIFg4Njo6aXNVTlBDS0hNYXNrKFNWT3ApKQorICAgIHJldHVybiBPcDsKKworICBpZiAoVjJJc1NwbGF0KSB7CisgICAgLy8gTm9ybWFsaXplIG1hc2sgc28gYWxsIGVudHJpZXMgdGhhdCBwb2ludCB0byBWMiBwb2ludHMgdG8gaXRzIGZpcnN0CisgICAgLy8gZWxlbWVudCB0aGVuIHRyeSB0byBtYXRjaCB1bnBja3tofGx9IGFnYWluLiBJZiBtYXRjaCwgcmV0dXJuIGEKKyAgICAvLyBuZXcgdmVjdG9yX3NodWZmbGUgd2l0aCB0aGUgY29ycmVjdGVkIG1hc2suCisgICAgU0RWYWx1ZSBOZXdNYXNrID0gTm9ybWFsaXplTWFzayhTVk9wLCBEQUcpOworICAgIFNodWZmbGVWZWN0b3JTRE5vZGUgKk5TVk9wID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOZXdNYXNrKTsKKyAgICBpZiAoTlNWT3AgIT0gU1ZPcCkgeworICAgICAgaWYgKFg4Njo6aXNVTlBDS0xNYXNrKE5TVk9wLCB0cnVlKSkgeworICAgICAgICByZXR1cm4gTmV3TWFzazsKKyAgICAgIH0gZWxzZSBpZiAoWDg2Ojppc1VOUENLSE1hc2soTlNWT3AsIHRydWUpKSB7CisgICAgICAgIHJldHVybiBOZXdNYXNrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChDb21tdXRlZCkgeworICAgIC8vIENvbW11dGUgaXMgYmFjayBhbmQgdHJ5IHVucGNrKiBhZ2Fpbi4KKyAgICAvLyBGSVhNRTogdGhpcyBzZWVtcyB3cm9uZy4KKyAgICBTRFZhbHVlIE5ld09wID0gQ29tbXV0ZVZlY3RvclNodWZmbGUoU1ZPcCwgREFHKTsKKyAgICBTaHVmZmxlVmVjdG9yU0ROb2RlICpOZXdTVk9wID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOZXdPcCk7CisgICAgaWYgKFg4Njo6aXNVTlBDS0xfdl91bmRlZl9NYXNrKE5ld1NWT3ApIHx8CisgICAgICAgIFg4Njo6aXNVTlBDS0hfdl91bmRlZl9NYXNrKE5ld1NWT3ApIHx8CisgICAgICAgIFg4Njo6aXNVTlBDS0xNYXNrKE5ld1NWT3ApIHx8CisgICAgICAgIFg4Njo6aXNVTlBDS0hNYXNrKE5ld1NWT3ApKQorICAgICAgcmV0dXJuIE5ld09wOworICB9CisKKyAgLy8gRklYTUU6IGZvciBtbXgsIGJpdGNhc3QgdjJpMzIgdG8gdjRpMTYgZm9yIHNodWZmbGUuCisKKyAgLy8gTm9ybWFsaXplIHRoZSBub2RlIHRvIG1hdGNoIHg4NiBzaHVmZmxlIG9wcyBpZiBuZWVkZWQKKyAgaWYgKCFpc01NWCAmJiBWMi5nZXRPcGNvZGUoKSAhPSBJU0Q6OlVOREVGICYmIGlzQ29tbXV0ZWRTSFVGUChTVk9wKSkKKyAgICByZXR1cm4gQ29tbXV0ZVZlY3RvclNodWZmbGUoU1ZPcCwgREFHKTsKKworICAvLyBDaGVjayBmb3IgbGVnYWwgc2h1ZmZsZSBhbmQgcmV0dXJuPworICBTbWFsbFZlY3RvcjxpbnQsIDE2PiBQZXJtTWFzazsKKyAgU1ZPcC0+Z2V0TWFzayhQZXJtTWFzayk7CisgIGlmIChpc1NodWZmbGVNYXNrTGVnYWwoUGVybU1hc2ssIFZUKSkKKyAgICByZXR1cm4gT3A7CisKKyAgLy8gSGFuZGxlIHY4aTE2IHNwZWNpZmljYWxseSBzaW5jZSBTU0UgY2FuIGRvIGJ5dGUgZXh0cmFjdGlvbiBhbmQgaW5zZXJ0aW9uLgorICBpZiAoVlQgPT0gTVZUOjp2OGkxNikgeworICAgIFNEVmFsdWUgTmV3T3AgPSBMb3dlclZFQ1RPUl9TSFVGRkxFdjhpMTYoU1ZPcCwgREFHLCAqdGhpcyk7CisgICAgaWYgKE5ld09wLmdldE5vZGUoKSkKKyAgICAgIHJldHVybiBOZXdPcDsKKyAgfQorCisgIGlmIChWVCA9PSBNVlQ6OnYxNmk4KSB7CisgICAgU0RWYWx1ZSBOZXdPcCA9IExvd2VyVkVDVE9SX1NIVUZGTEV2MTZpOChTVk9wLCBEQUcsICp0aGlzKTsKKyAgICBpZiAoTmV3T3AuZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIE5ld09wOworICB9CisKKyAgLy8gSGFuZGxlIGFsbCA0IHdpZGUgY2FzZXMgd2l0aCBhIG51bWJlciBvZiBzaHVmZmxlcyBleGNlcHQgZm9yIE1NWC4KKyAgaWYgKE51bUVsZW1zID09IDQgJiYgIWlzTU1YKQorICAgIHJldHVybiBMb3dlclZFQ1RPUl9TSFVGRkxFXzR3aWRlKFNWT3AsIERBRyk7CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyRVhUUkFDVF9WRUNUT1JfRUxUX1NTRTQoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIGlmIChWVC5nZXRTaXplSW5CaXRzKCkgPT0gOCkgeworICAgIFNEVmFsdWUgRXh0cmFjdCA9IERBRy5nZXROb2RlKFg4NklTRDo6UEVYVFJCLCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApLCBPcC5nZXRPcGVyYW5kKDEpKTsKKyAgICBTRFZhbHVlIEFzc2VydCAgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFzc2VydFpleHQsIGRsLCBNVlQ6OmkzMiwgRXh0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWYWx1ZVR5cGUoVlQpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIFZULCBBc3NlcnQpOworICB9IGVsc2UgaWYgKFZULmdldFNpemVJbkJpdHMoKSA9PSAxNikgeworICAgIHVuc2lnbmVkIElkeCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAvLyBJZiBJZHggaXMgMCwgaXQncyBjaGVhcGVyIHRvIGRvIGEgbW92ZSBpbnN0ZWFkIG9mIGEgcGV4dHJ3LgorICAgIGlmIChJZHggPT0gMCkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTVZUOjppMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMSkpKTsKKyAgICBTRFZhbHVlIEV4dHJhY3QgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlBFWFRSVywgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgwKSwgT3AuZ2V0T3BlcmFuZCgxKSk7CisgICAgU0RWYWx1ZSBBc3NlcnQgID0gREFHLmdldE5vZGUoSVNEOjpBc3NlcnRaZXh0LCBkbCwgTVZUOjppMzIsIEV4dHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKFZUKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBWVCwgQXNzZXJ0KTsKKyAgfSBlbHNlIGlmIChWVCA9PSBNVlQ6OmYzMikgeworICAgIC8vIEVYVFJBQ1RQUyBvdXRwdXRzIHRvIGEgR1BSMzIgcmVnaXN0ZXIgd2hpY2ggd2lsbCByZXF1aXJlIGEgbW92ZCB0byBjb3B5CisgICAgLy8gdGhlIHJlc3VsdCBiYWNrIHRvIEZSMzIgcmVnaXN0ZXIuIEl0J3Mgb25seSB3b3J0aCBtYXRjaGluZyBpZiB0aGUKKyAgICAvLyByZXN1bHQgaGFzIGEgc2luZ2xlIHVzZSB3aGljaCBpcyBhIHN0b3JlIG9yIGEgYml0Y2FzdCB0byBpMzIuICBBbmQgaW4KKyAgICAvLyB0aGUgY2FzZSBvZiBhIHN0b3JlLCBpdCdzIG5vdCB3b3J0aCBpdCBpZiB0aGUgaW5kZXggaXMgYSBjb25zdGFudCAwLAorICAgIC8vIGJlY2F1c2UgYSBNT1ZTU21yIGNhbiBiZSB1c2VkIGluc3RlYWQsIHdoaWNoIGlzIHNtYWxsZXIgYW5kIGZhc3Rlci4KKyAgICBpZiAoIU9wLmhhc09uZVVzZSgpKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICBTRE5vZGUgKlVzZXIgPSAqT3AuZ2V0Tm9kZSgpLT51c2VfYmVnaW4oKTsKKyAgICBpZiAoKFVzZXItPmdldE9wY29kZSgpICE9IElTRDo6U1RPUkUgfHwKKyAgICAgICAgIChpc2E8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmlzTnVsbFZhbHVlKCkpKSAmJgorICAgICAgICAoVXNlci0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpCSVRfQ09OVkVSVCB8fAorICAgICAgICAgVXNlci0+Z2V0VmFsdWVUeXBlKDApICE9IE1WVDo6aTMyKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgU0RWYWx1ZSBFeHRyYWN0ID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2NGkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6ZjMyLCBFeHRyYWN0KTsKKyAgfSBlbHNlIGlmIChWVCA9PSBNVlQ6OmkzMikgeworICAgIC8vIEV4dHJhY3RQUyB3b3JrcyB3aXRoIGNvbnN0YW50IGluZGV4LgorICAgIGlmIChpc2E8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKQorICAgICAgcmV0dXJuIE9wOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyRVhUUkFDVF9WRUNUT1JfRUxUKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgaWYgKCFpc2E8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgaWYgKFN1YnRhcmdldC0+aGFzU1NFNDEoKSkgeworICAgIFNEVmFsdWUgUmVzID0gTG93ZXJFWFRSQUNUX1ZFQ1RPUl9FTFRfU1NFNChPcCwgREFHKTsKKyAgICBpZiAoUmVzLmdldE5vZGUoKSkKKyAgICAgIHJldHVybiBSZXM7CisgIH0KKworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICAvLyBUT0RPOiBoYW5kbGUgdjE2aTguCisgIGlmIChWVC5nZXRTaXplSW5CaXRzKCkgPT0gMTYpIHsKKyAgICBTRFZhbHVlIFZlYyA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgdW5zaWduZWQgSWR4ID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpOworICAgIGlmIChJZHggPT0gMCkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTVZUOjppMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OnY0aTMyLCBWZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMSkpKTsKKyAgICAvLyBUcmFuc2Zvcm0gaXQgc28gaXQgbWF0Y2ggcGV4dHJ3IHdoaWNoIHByb2R1Y2VzIGEgMzItYml0IHJlc3VsdC4KKyAgICBFVlQgRWx0VlQgPSBNVlQ6OmkzMjsKKyAgICBTRFZhbHVlIEV4dHJhY3QgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlBFWFRSVywgZGwsIEVsdFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgwKSwgT3AuZ2V0T3BlcmFuZCgxKSk7CisgICAgU0RWYWx1ZSBBc3NlcnQgID0gREFHLmdldE5vZGUoSVNEOjpBc3NlcnRaZXh0LCBkbCwgRWx0VlQsIEV4dHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VmFsdWVUeXBlKFZUKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGRsLCBWVCwgQXNzZXJ0KTsKKyAgfSBlbHNlIGlmIChWVC5nZXRTaXplSW5CaXRzKCkgPT0gMzIpIHsKKyAgICB1bnNpZ25lZCBJZHggPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKElkeCA9PSAwKQorICAgICAgcmV0dXJuIE9wOworCisgICAgLy8gU0hVRlBTIHRoZSBlbGVtZW50IHRvIHRoZSBsb3dlc3QgZG91YmxlIHdvcmQsIHRoZW4gbW92c3MuCisgICAgaW50IE1hc2tbNF0gPSB7IElkeCwgLTEsIC0xLCAtMSB9OworICAgIEVWVCBWVlQgPSBPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgIFNEVmFsdWUgVmVjID0gREFHLmdldFZlY3RvclNodWZmbGUoVlZULCBkbCwgT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRVTkRFRihWVlQpLCBNYXNrKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBWVCwgVmVjLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICB9IGVsc2UgaWYgKFZULmdldFNpemVJbkJpdHMoKSA9PSA2NCkgeworICAgIC8vIEZJWE1FOiAudGQgb25seSBtYXRjaGVzIHRoaXMgZm9yIDwyIHggZjY0Piwgbm90IDwyIHggaTY0PiBvbiAzMmIKKyAgICAvLyBGSVhNRTogc2VlbXMgbGlrZSB0aGlzIHNob3VsZCBiZSB1bm5lY2Vzc2FyeSBpZiBtb3Z7aCxsfXBkIHdlcmUgdGF1Z2h0CisgICAgLy8gICAgICAgIHRvIG1hdGNoIGV4dHJhY3RfZWx0IGZvciBmNjQuCisgICAgdW5zaWduZWQgSWR4ID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpOworICAgIGlmIChJZHggPT0gMCkKKyAgICAgIHJldHVybiBPcDsKKworICAgIC8vIFVOUENLSFBEIHRoZSBlbGVtZW50IHRvIHRoZSBsb3dlc3QgZG91YmxlIHdvcmQsIHRoZW4gbW92c2QuCisgICAgLy8gTm90ZSBpZiB0aGUgbG93ZXIgNjQgYml0cyBvZiB0aGUgcmVzdWx0IG9mIHRoZSBVTlBDS0hQRCBpcyB0aGVuIHN0b3JlZAorICAgIC8vIHRvIGEgZjY0bWVtLCB0aGUgd2hvbGUgb3BlcmF0aW9uIGlzIGZvbGRlZCBpbnRvIGEgc2luZ2xlIE1PVkhQRG1yLgorICAgIGludCBNYXNrWzJdID0geyAxLCAtMSB9OworICAgIEVWVCBWVlQgPSBPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpOworICAgIFNEVmFsdWUgVmVjID0gREFHLmdldFZlY3RvclNodWZmbGUoVlZULCBkbCwgT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRVTkRFRihWVlQpLCBNYXNrKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBWVCwgVmVjLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VySU5TRVJUX1ZFQ1RPUl9FTFRfU1NFNChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIEVsdFZUID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIFNEVmFsdWUgTjAgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIE4xID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBOMiA9IE9wLmdldE9wZXJhbmQoMik7CisKKyAgaWYgKChFbHRWVC5nZXRTaXplSW5CaXRzKCkgPT0gOCB8fCBFbHRWVC5nZXRTaXplSW5CaXRzKCkgPT0gMTYpICYmCisgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KE4yKSkgeworICAgIHVuc2lnbmVkIE9wYzsKKyAgICBpZiAoVlQgPT0gTVZUOjp2OGkxNikKKyAgICAgIE9wYyA9IFg4NklTRDo6UElOU1JXOworICAgIGVsc2UgaWYgKFZUID09IE1WVDo6djRpMTYpCisgICAgICBPcGMgPSBYODZJU0Q6Ok1NWF9QSU5TUlc7CisgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjp2MTZpOCkKKyAgICAgIE9wYyA9IFg4NklTRDo6UElOU1JCOworICAgIGVsc2UKKyAgICAgIE9wYyA9IFg4NklTRDo6UElOU1JCOworCisgICAgLy8gVHJhbnNmb3JtIGl0IHNvIGl0IG1hdGNoIHBpbnNye2Isd30gd2hpY2ggZXhwZWN0cyBhIEdSMzIgYXMgaXRzIHNlY29uZAorICAgIC8vIGFyZ3VtZW50LgorICAgIGlmIChOMS5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6OmkzMikKKyAgICAgIE4xID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwgTVZUOjppMzIsIE4xKTsKKyAgICBpZiAoTjIuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjppMzIpCisgICAgICBOMiA9IERBRy5nZXRJbnRQdHJDb25zdGFudChjYXN0PENvbnN0YW50U0ROb2RlPihOMiktPmdldFpFeHRWYWx1ZSgpKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoT3BjLCBkbCwgVlQsIE4wLCBOMSwgTjIpOworICB9IGVsc2UgaWYgKEVsdFZUID09IE1WVDo6ZjMyICYmIGlzYTxDb25zdGFudFNETm9kZT4oTjIpKSB7CisgICAgLy8gQml0cyBbNzo2XSBvZiB0aGUgY29uc3RhbnQgYXJlIHRoZSBzb3VyY2Ugc2VsZWN0LiAgVGhpcyB3aWxsIGFsd2F5cyBiZQorICAgIC8vICB6ZXJvIGhlcmUuICBUaGUgREFHIENvbWJpbmVyIG1heSBjb21iaW5lIGFuIGV4dHJhY3RfZWx0IGluZGV4IGludG8gdGhlc2UKKyAgICAvLyAgYml0cy4gIEZvciBleGFtcGxlIChpbnNlcnQgKGV4dHJhY3QsIDMpLCAyKSBjb3VsZCBiZSBtYXRjaGVkIGJ5IHB1dHRpbmcKKyAgICAvLyAgdGhlICczJyBpbnRvIGJpdHMgWzc6Nl0gb2YgWDg2SVNEOjpJTlNFUlRQUy4KKyAgICAvLyBCaXRzIFs1OjRdIG9mIHRoZSBjb25zdGFudCBhcmUgdGhlIGRlc3RpbmF0aW9uIHNlbGVjdC4gIFRoaXMgaXMgdGhlCisgICAgLy8gIHZhbHVlIG9mIHRoZSBpbmNvbWluZyBpbW1lZGlhdGUuCisgICAgLy8gQml0cyBbMzowXSBvZiB0aGUgY29uc3RhbnQgYXJlIHRoZSB6ZXJvIG1hc2suICBUaGUgREFHIENvbWJpbmVyIG1heQorICAgIC8vICAgY29tYmluZSBlaXRoZXIgYml0d2lzZSBBTkQgb3IgaW5zZXJ0IG9mIGZsb2F0IDAuMCB0byBzZXQgdGhlc2UgYml0cy4KKyAgICBOMiA9IERBRy5nZXRJbnRQdHJDb25zdGFudChjYXN0PENvbnN0YW50U0ROb2RlPihOMiktPmdldFpFeHRWYWx1ZSgpIDw8IDQpOworICAgIC8vIENyZWF0ZSB0aGlzIGFzIGEgc2NhbGFyIHRvIHZlY3Rvci4uCisgICAgTjEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIGRsLCBNVlQ6OnY0ZjMyLCBOMSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6SU5TRVJUUFMsIGRsLCBWVCwgTjAsIE4xLCBOMik7CisgIH0gZWxzZSBpZiAoRWx0VlQgPT0gTVZUOjppMzIgJiYgaXNhPENvbnN0YW50U0ROb2RlPihOMikpIHsKKyAgICAvLyBQSU5TUiogd29ya3Mgd2l0aCBjb25zdGFudCBpbmRleC4KKyAgICByZXR1cm4gT3A7CisgIH0KKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VySU5TRVJUX1ZFQ1RPUl9FTFQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBFbHRWVCA9IFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisKKyAgaWYgKFN1YnRhcmdldC0+aGFzU1NFNDEoKSkKKyAgICByZXR1cm4gTG93ZXJJTlNFUlRfVkVDVE9SX0VMVF9TU0U0KE9wLCBEQUcpOworCisgIGlmIChFbHRWVCA9PSBNVlQ6Omk4KQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIE4wID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBOMSA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgTjIgPSBPcC5nZXRPcGVyYW5kKDIpOworCisgIGlmIChFbHRWVC5nZXRTaXplSW5CaXRzKCkgPT0gMTYgJiYgaXNhPENvbnN0YW50U0ROb2RlPihOMikpIHsKKyAgICAvLyBUcmFuc2Zvcm0gaXQgc28gaXQgbWF0Y2ggcGluc3J3IHdoaWNoIGV4cGVjdHMgYSAxNi1iaXQgdmFsdWUgaW4gYSBHUjMyCisgICAgLy8gYXMgaXRzIHNlY29uZCBhcmd1bWVudC4KKyAgICBpZiAoTjEuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjppMzIpCisgICAgICBOMSA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIE1WVDo6aTMyLCBOMSk7CisgICAgaWYgKE4yLmdldFZhbHVlVHlwZSgpICE9IE1WVDo6aTMyKQorICAgICAgTjIgPSBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoY2FzdDxDb25zdGFudFNETm9kZT4oTjIpLT5nZXRaRXh0VmFsdWUoKSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKFZUID09IE1WVDo6djhpMTYgPyBYODZJU0Q6OlBJTlNSVyA6IFg4NklTRDo6TU1YX1BJTlNSVywKKyAgICAgICAgICAgICAgICAgICAgICAgZGwsIFZULCBOMCwgTjEsIE4yKTsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlCitYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJTQ0FMQVJfVE9fVkVDVE9SKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgCisgIGlmIChPcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OnYxaTY0ICYmCisgICAgICBPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpID09IE1WVDo6aTY0KQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIGRsLCBNVlQ6OnYxaTY0LCBPcC5nZXRPcGVyYW5kKDApKTsKKworICBTRFZhbHVlIEFueUV4dCA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIE1WVDo6aTMyLCBPcC5nZXRPcGVyYW5kKDApKTsKKyAgRVZUIFZUID0gTVZUOjp2MmkzMjsKKyAgc3dpdGNoIChPcC5nZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIE1WVDo6djE2aTg6CisgIGNhc2UgTVZUOjp2OGkxNjoKKyAgICBWVCA9IE1WVDo6djRpMzI7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6U0NBTEFSX1RPX1ZFQ1RPUiwgZGwsIFZULCBBbnlFeHQpKTsKK30KKworLy8gQ29uc3RhbnRQb29sLCBKdW1wVGFibGUsIEdsb2JhbEFkZHJlc3MsIGFuZCBFeHRlcm5hbFN5bWJvbCBhcmUgbG93ZXJlZCBhcworLy8gdGhlaXIgdGFyZ2V0IGNvdW50cGFydCB3cmFwcGVkIGluIHRoZSBYODZJU0Q6OldyYXBwZXIgbm9kZS4gU3VwcG9zZSBOIGlzCisvLyBvbmUgb2YgdGhlIGFib3ZlIG1lbnRpb25lZCBub2Rlcy4gSXQgaGFzIHRvIGJlIHdyYXBwZWQgYmVjYXVzZSBvdGhlcndpc2UKKy8vIFNlbGVjdChOKSByZXR1cm5zIE4uIFNvIHRoZSByYXcgVGFyZ2V0R2xvYmFsQWRkcmVzcyBub2RlcywgZXRjLiBjYW4gb25seQorLy8gYmUgdXNlZCB0byBmb3JtIGFkZHJlc3NpbmcgbW9kZS4gVGhlc2Ugd3JhcHBlZCBub2RlcyB3aWxsIGJlIHNlbGVjdGVkCisvLyBpbnRvIE1PVjMycmkuCitTRFZhbHVlCitYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJDb25zdGFudFBvb2woU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgQ29uc3RhbnRQb29sU0ROb2RlICpDUCA9IGNhc3Q8Q29uc3RhbnRQb29sU0ROb2RlPihPcCk7CisKKyAgLy8gSW4gUElDIG1vZGUgKHVubGVzcyB3ZSdyZSBpbiBSSVBSZWwgUElDIG1vZGUpIHdlIGFkZCBhbiBvZmZzZXQgdG8gdGhlCisgIC8vIGdsb2JhbCBiYXNlIHJlZy4KKyAgdW5zaWduZWQgY2hhciBPcEZsYWcgPSAwOworICB1bnNpZ25lZCBXcmFwcGVyS2luZCA9IFg4NklTRDo6V3JhcHBlcjsKKyAgQ29kZU1vZGVsOjpNb2RlbCBNID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldENvZGVNb2RlbCgpOworCisgIGlmIChTdWJ0YXJnZXQtPmlzUElDU3R5bGVSSVBSZWwoKSAmJgorICAgICAgKE0gPT0gQ29kZU1vZGVsOjpTbWFsbCB8fCBNID09IENvZGVNb2RlbDo6S2VybmVsKSkKKyAgICBXcmFwcGVyS2luZCA9IFg4NklTRDo6V3JhcHBlclJJUDsKKyAgZWxzZSBpZiAoU3VidGFyZ2V0LT5pc1BJQ1N0eWxlR09UKCkpCisgICAgT3BGbGFnID0gWDg2SUk6Ok1PX0dPVE9GRjsKKyAgZWxzZSBpZiAoU3VidGFyZ2V0LT5pc1BJQ1N0eWxlU3R1YlBJQygpKQorICAgIE9wRmxhZyA9IFg4NklJOjpNT19QSUNfQkFTRV9PRkZTRVQ7CisKKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKENQLT5nZXRDb25zdFZhbCgpLCBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQLT5nZXRBbGlnbm1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQLT5nZXRPZmZzZXQoKSwgT3BGbGFnKTsKKyAgRGVidWdMb2MgREwgPSBDUC0+Z2V0RGVidWdMb2MoKTsKKyAgUmVzdWx0ID0gREFHLmdldE5vZGUoV3JhcHBlcktpbmQsIERMLCBnZXRQb2ludGVyVHkoKSwgUmVzdWx0KTsKKyAgLy8gV2l0aCBQSUMsIHRoZSBhZGRyZXNzIGlzIGFjdHVhbGx5ICRnICsgT2Zmc2V0LgorICBpZiAoT3BGbGFnKSB7CisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIERMLCBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShYODZJU0Q6Okdsb2JhbEJhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MoKSwgZ2V0UG9pbnRlclR5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdCk7CisgIH0KKworICByZXR1cm4gUmVzdWx0OworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlckp1bXBUYWJsZShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBKdW1wVGFibGVTRE5vZGUgKkpUID0gY2FzdDxKdW1wVGFibGVTRE5vZGU+KE9wKTsKKworICAvLyBJbiBQSUMgbW9kZSAodW5sZXNzIHdlJ3JlIGluIFJJUFJlbCBQSUMgbW9kZSkgd2UgYWRkIGFuIG9mZnNldCB0byB0aGUKKyAgLy8gZ2xvYmFsIGJhc2UgcmVnLgorICB1bnNpZ25lZCBjaGFyIE9wRmxhZyA9IDA7CisgIHVuc2lnbmVkIFdyYXBwZXJLaW5kID0gWDg2SVNEOjpXcmFwcGVyOworICBDb2RlTW9kZWw6Ok1vZGVsIE0gPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0Q29kZU1vZGVsKCk7CisKKyAgaWYgKFN1YnRhcmdldC0+aXNQSUNTdHlsZVJJUFJlbCgpICYmCisgICAgICAoTSA9PSBDb2RlTW9kZWw6OlNtYWxsIHx8IE0gPT0gQ29kZU1vZGVsOjpLZXJuZWwpKQorICAgIFdyYXBwZXJLaW5kID0gWDg2SVNEOjpXcmFwcGVyUklQOworICBlbHNlIGlmIChTdWJ0YXJnZXQtPmlzUElDU3R5bGVHT1QoKSkKKyAgICBPcEZsYWcgPSBYODZJSTo6TU9fR09UT0ZGOworICBlbHNlIGlmIChTdWJ0YXJnZXQtPmlzUElDU3R5bGVTdHViUElDKCkpCisgICAgT3BGbGFnID0gWDg2SUk6Ok1PX1BJQ19CQVNFX09GRlNFVDsKKworICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRKdW1wVGFibGUoSlQtPmdldEluZGV4KCksIGdldFBvaW50ZXJUeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BGbGFnKTsKKyAgRGVidWdMb2MgREwgPSBKVC0+Z2V0RGVidWdMb2MoKTsKKyAgUmVzdWx0ID0gREFHLmdldE5vZGUoV3JhcHBlcktpbmQsIERMLCBnZXRQb2ludGVyVHkoKSwgUmVzdWx0KTsKKworICAvLyBXaXRoIFBJQywgdGhlIGFkZHJlc3MgaXMgYWN0dWFsbHkgJGcgKyBPZmZzZXQuCisgIGlmIChPcEZsYWcpIHsKKyAgICBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgREwsIGdldFBvaW50ZXJUeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKFg4NklTRDo6R2xvYmFsQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYygpLCBnZXRQb2ludGVyVHkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0KTsKKyAgfQorCisgIHJldHVybiBSZXN1bHQ7Cit9CisKK1NEVmFsdWUKK1g4NlRhcmdldExvd2VyaW5nOjpMb3dlckV4dGVybmFsU3ltYm9sKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIGNvbnN0IGNoYXIgKlN5bSA9IGNhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KE9wKS0+Z2V0U3ltYm9sKCk7CisKKyAgLy8gSW4gUElDIG1vZGUgKHVubGVzcyB3ZSdyZSBpbiBSSVBSZWwgUElDIG1vZGUpIHdlIGFkZCBhbiBvZmZzZXQgdG8gdGhlCisgIC8vIGdsb2JhbCBiYXNlIHJlZy4KKyAgdW5zaWduZWQgY2hhciBPcEZsYWcgPSAwOworICB1bnNpZ25lZCBXcmFwcGVyS2luZCA9IFg4NklTRDo6V3JhcHBlcjsKKyAgQ29kZU1vZGVsOjpNb2RlbCBNID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldENvZGVNb2RlbCgpOworCisgIGlmIChTdWJ0YXJnZXQtPmlzUElDU3R5bGVSSVBSZWwoKSAmJgorICAgICAgKE0gPT0gQ29kZU1vZGVsOjpTbWFsbCB8fCBNID09IENvZGVNb2RlbDo6S2VybmVsKSkKKyAgICBXcmFwcGVyS2luZCA9IFg4NklTRDo6V3JhcHBlclJJUDsKKyAgZWxzZSBpZiAoU3VidGFyZ2V0LT5pc1BJQ1N0eWxlR09UKCkpCisgICAgT3BGbGFnID0gWDg2SUk6Ok1PX0dPVE9GRjsKKyAgZWxzZSBpZiAoU3VidGFyZ2V0LT5pc1BJQ1N0eWxlU3R1YlBJQygpKQorICAgIE9wRmxhZyA9IFg4NklJOjpNT19QSUNfQkFTRV9PRkZTRVQ7CisKKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0RXh0ZXJuYWxTeW1ib2woU3ltLCBnZXRQb2ludGVyVHkoKSwgT3BGbGFnKTsKKworICBEZWJ1Z0xvYyBETCA9IE9wLmdldERlYnVnTG9jKCk7CisgIFJlc3VsdCA9IERBRy5nZXROb2RlKFdyYXBwZXJLaW5kLCBETCwgZ2V0UG9pbnRlclR5KCksIFJlc3VsdCk7CisKKworICAvLyBXaXRoIFBJQywgdGhlIGFkZHJlc3MgaXMgYWN0dWFsbHkgJGcgKyBPZmZzZXQuCisgIGlmIChnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18gJiYKKyAgICAgICFTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6QURELCBETCwgZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoWDg2SVNEOjpHbG9iYWxCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jKCksIGdldFBvaW50ZXJUeSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQpOworICB9CisKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyQmxvY2tBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIENyZWF0ZSB0aGUgVGFyZ2V0QmxvY2tBZGRyZXNzQWRkcmVzcyBub2RlLgorICB1bnNpZ25lZCBjaGFyIE9wRmxhZ3MgPQorICAgIFN1YnRhcmdldC0+Q2xhc3NpZnlCbG9ja0FkZHJlc3NSZWZlcmVuY2UoKTsKKyAgQ29kZU1vZGVsOjpNb2RlbCBNID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldENvZGVNb2RlbCgpOworICBjb25zdCBCbG9ja0FkZHJlc3MgKkJBID0gY2FzdDxCbG9ja0FkZHJlc3NTRE5vZGU+KE9wKS0+Z2V0QmxvY2tBZGRyZXNzKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0QmxvY2tBZGRyZXNzKEJBLCBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNUYXJnZXQ9Ki90cnVlLCBPcEZsYWdzKTsKKworICBpZiAoU3VidGFyZ2V0LT5pc1BJQ1N0eWxlUklQUmVsKCkgJiYKKyAgICAgIChNID09IENvZGVNb2RlbDo6U21hbGwgfHwgTSA9PSBDb2RlTW9kZWw6Oktlcm5lbCkpCisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoWDg2SVNEOjpXcmFwcGVyUklQLCBkbCwgZ2V0UG9pbnRlclR5KCksIFJlc3VsdCk7CisgIGVsc2UKKyAgICBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OldyYXBwZXIsIGRsLCBnZXRQb2ludGVyVHkoKSwgUmVzdWx0KTsKKworICAvLyBXaXRoIFBJQywgdGhlIGFkZHJlc3MgaXMgYWN0dWFsbHkgJGcgKyBPZmZzZXQuCisgIGlmIChpc0dsb2JhbFJlbGF0aXZlVG9QSUNCYXNlKE9wRmxhZ3MpKSB7CisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShYODZJU0Q6Okdsb2JhbEJhc2VSZWcsIGRsLCBnZXRQb2ludGVyVHkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0KTsKKyAgfQorCisgIHJldHVybiBSZXN1bHQ7Cit9CisKK1NEVmFsdWUKK1g4NlRhcmdldExvd2VyaW5nOjpMb3dlckdsb2JhbEFkZHJlc3MoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIENyZWF0ZSB0aGUgVGFyZ2V0R2xvYmFsQWRkcmVzcyBub2RlLCBmb2xkaW5nIGluIHRoZSBjb25zdGFudAorICAvLyBvZmZzZXQgaWYgaXQgaXMgbGVnYWwuCisgIHVuc2lnbmVkIGNoYXIgT3BGbGFncyA9CisgICAgU3VidGFyZ2V0LT5DbGFzc2lmeUdsb2JhbFJlZmVyZW5jZShHViwgZ2V0VGFyZ2V0TWFjaGluZSgpKTsKKyAgQ29kZU1vZGVsOjpNb2RlbCBNID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldENvZGVNb2RlbCgpOworICBTRFZhbHVlIFJlc3VsdDsKKyAgaWYgKE9wRmxhZ3MgPT0gWDg2SUk6Ok1PX05PX0ZMQUcgJiYKKyAgICAgIFg4Njo6aXNPZmZzZXRTdWl0YWJsZUZvckNvZGVNb2RlbChPZmZzZXQsIE0pKSB7CisgICAgLy8gQSBkaXJlY3Qgc3RhdGljIHJlZmVyZW5jZSB0byBhIGdsb2JhbC4KKyAgICBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgZGwsIGdldFBvaW50ZXJUeSgpLCBPZmZzZXQpOworICAgIE9mZnNldCA9IDA7CisgIH0gZWxzZSB7CisgICAgUmVzdWx0ID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoR1YsIGRsLCBnZXRQb2ludGVyVHkoKSwgMCwgT3BGbGFncyk7CisgIH0KKworICBpZiAoU3VidGFyZ2V0LT5pc1BJQ1N0eWxlUklQUmVsKCkgJiYKKyAgICAgIChNID09IENvZGVNb2RlbDo6U21hbGwgfHwgTSA9PSBDb2RlTW9kZWw6Oktlcm5lbCkpCisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoWDg2SVNEOjpXcmFwcGVyUklQLCBkbCwgZ2V0UG9pbnRlclR5KCksIFJlc3VsdCk7CisgIGVsc2UKKyAgICBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OldyYXBwZXIsIGRsLCBnZXRQb2ludGVyVHkoKSwgUmVzdWx0KTsKKworICAvLyBXaXRoIFBJQywgdGhlIGFkZHJlc3MgaXMgYWN0dWFsbHkgJGcgKyBPZmZzZXQuCisgIGlmIChpc0dsb2JhbFJlbGF0aXZlVG9QSUNCYXNlKE9wRmxhZ3MpKSB7CisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShYODZJU0Q6Okdsb2JhbEJhc2VSZWcsIGRsLCBnZXRQb2ludGVyVHkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0KTsKKyAgfQorCisgIC8vIEZvciBnbG9iYWxzIHRoYXQgcmVxdWlyZSBhIGxvYWQgZnJvbSBhIHN0dWIgdG8gZ2V0IHRoZSBhZGRyZXNzLCBlbWl0IHRoZQorICAvLyBsb2FkLgorICBpZiAoaXNHbG9iYWxTdHViUmVmZXJlbmNlKE9wRmxhZ3MpKQorICAgIFJlc3VsdCA9IERBRy5nZXRMb2FkKGdldFBvaW50ZXJUeSgpLCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEdPVCgpLCAwLCBmYWxzZSwgZmFsc2UsIDApOworCisgIC8vIElmIHRoZXJlIHdhcyBhIG5vbi16ZXJvIG9mZnNldCB0aGF0IHdlIGRpZG4ndCBmb2xkLCBjcmVhdGUgYW4gZXhwbGljaXQKKyAgLy8gYWRkaXRpb24gZm9yIGl0LgorICBpZiAoT2Zmc2V0ICE9IDApCisgICAgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwgUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChPZmZzZXQsIGdldFBvaW50ZXJUeSgpKSk7CisKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyR2xvYmFsQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKS0+Z2V0R2xvYmFsKCk7CisgIGludDY0X3QgT2Zmc2V0ID0gY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihPcCktPmdldE9mZnNldCgpOworICByZXR1cm4gTG93ZXJHbG9iYWxBZGRyZXNzKEdWLCBPcC5nZXREZWJ1Z0xvYygpLCBPZmZzZXQsIERBRyk7Cit9CisKK3N0YXRpYyBTRFZhbHVlCitHZXRUTFNBRERSKFNlbGVjdGlvbkRBRyAmREFHLCBTRFZhbHVlIENoYWluLCBHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSwKKyAgICAgICAgICAgU0RWYWx1ZSAqSW5GbGFnLCBjb25zdCBFVlQgUHRyVlQsIHVuc2lnbmVkIFJldHVyblJlZywKKyAgICAgICAgICAgdW5zaWduZWQgY2hhciBPcGVyYW5kRmxhZ3MpIHsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpLmdldEZyYW1lSW5mbygpOworICBTRFZUTGlzdCBOb2RlVHlzID0gREFHLmdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICBEZWJ1Z0xvYyBkbCA9IEdBLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIFRHQSA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEdBLT5nZXRHbG9iYWwoKSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0EtPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQS0+Z2V0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZEZsYWdzKTsKKyAgaWYgKEluRmxhZykgeworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCAgVEdBLCAqSW5GbGFnIH07CisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlRMU0FERFIsIGRsLCBOb2RlVHlzLCBPcHMsIDMpOworICB9IGVsc2UgeworICAgIFNEVmFsdWUgT3BzW10gID0geyBDaGFpbiwgVEdBIH07CisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlRMU0FERFIsIGRsLCBOb2RlVHlzLCBPcHMsIDIpOworICB9CisKKyAgLy8gVExTQUREUiB3aWxsIGJlIGNvZGVnZW4nZWQgYXMgY2FsbC4gSW5mb3JtIE1GSSB0aGF0IGZ1bmN0aW9uIGhhcyBjYWxscy4KKyAgTUZJLT5zZXRBZGp1c3RzU3RhY2sodHJ1ZSk7CisKKyAgU0RWYWx1ZSBGbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIHJldHVybiBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBSZXR1cm5SZWcsIFB0clZULCBGbGFnKTsKK30KKworLy8gTG93ZXIgSVNEOjpHbG9iYWxUTFNBZGRyZXNzIHVzaW5nIHRoZSAiZ2VuZXJhbCBkeW5hbWljIiBtb2RlbCwgMzIgYml0CitzdGF0aWMgU0RWYWx1ZQorTG93ZXJUb1RMU0dlbmVyYWxEeW5hbWljTW9kZWwzMihHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWVCBQdHJWVCkgeworICBTRFZhbHVlIEluRmxhZzsKKyAgRGVidWdMb2MgZGwgPSBHQS0+Z2V0RGVidWdMb2MoKTsgIC8vID8gZnVuY3Rpb24gZW50cnkgcG9pbnQgbWlnaHQgYmUgYmV0dGVyCisgIFNEVmFsdWUgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKERBRy5nZXRFbnRyeU5vZGUoKSwgZGwsIFg4Njo6RUJYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKFg4NklTRDo6R2xvYmFsQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYygpLCBQdHJWVCksIEluRmxhZyk7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIHJldHVybiBHZXRUTFNBRERSKERBRywgQ2hhaW4sIEdBLCAmSW5GbGFnLCBQdHJWVCwgWDg2OjpFQVgsIFg4NklJOjpNT19UTFNHRCk7Cit9CisKKy8vIExvd2VyIElTRDo6R2xvYmFsVExTQWRkcmVzcyB1c2luZyB0aGUgImdlbmVyYWwgZHluYW1pYyIgbW9kZWwsIDY0IGJpdAorc3RhdGljIFNEVmFsdWUKK0xvd2VyVG9UTFNHZW5lcmFsRHluYW1pY01vZGVsNjQoR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFVlQgUHRyVlQpIHsKKyAgcmV0dXJuIEdldFRMU0FERFIoREFHLCBEQUcuZ2V0RW50cnlOb2RlKCksIEdBLCBOVUxMLCBQdHJWVCwKKyAgICAgICAgICAgICAgICAgICAgWDg2OjpSQVgsIFg4NklJOjpNT19UTFNHRCk7Cit9CisKKy8vIExvd2VyIElTRDo6R2xvYmFsVExTQWRkcmVzcyB1c2luZyB0aGUgImluaXRpYWwgZXhlYyIgKGZvciBuby1waWMpIG9yCisvLyAibG9jYWwgZXhlYyIgbW9kZWwuCitzdGF0aWMgU0RWYWx1ZSBMb3dlclRvVExTRXhlY01vZGVsKEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZUIFB0clZULCBUTFNNb2RlbDo6TW9kZWwgbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXM2NEJpdCkgeworICBEZWJ1Z0xvYyBkbCA9IEdBLT5nZXREZWJ1Z0xvYygpOworICAvLyBHZXQgdGhlIFRocmVhZCBQb2ludGVyCisgIFNEVmFsdWUgQmFzZSA9IERBRy5nZXROb2RlKFg4NklTRDo6U2VnbWVudEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYygpLCBQdHJWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFJlZ2lzdGVyKGlzNjRCaXQ/IFg4Njo6RlMgOiBYODY6OkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpKTsKKworICBTRFZhbHVlIFRocmVhZFBvaW50ZXIgPSBEQUcuZ2V0TG9hZChQdHJWVCwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKKworICB1bnNpZ25lZCBjaGFyIE9wZXJhbmRGbGFncyA9IDA7CisgIC8vIE1vc3QgVExTIGFjY2Vzc2VzIGFyZSBub3QgUklQIHJlbGF0aXZlLCBldmVuIG9uIHg4Ni02NC4gIE9uZSBleGNlcHRpb24gaXMKKyAgLy8gaW5pdGlhbGV4ZWMuCisgIHVuc2lnbmVkIFdyYXBwZXJLaW5kID0gWDg2SVNEOjpXcmFwcGVyOworICBpZiAobW9kZWwgPT0gVExTTW9kZWw6OkxvY2FsRXhlYykgeworICAgIE9wZXJhbmRGbGFncyA9IGlzNjRCaXQgPyBYODZJSTo6TU9fVFBPRkYgOiBYODZJSTo6TU9fTlRQT0ZGOworICB9IGVsc2UgaWYgKGlzNjRCaXQpIHsKKyAgICBhc3NlcnQobW9kZWwgPT0gVExTTW9kZWw6OkluaXRpYWxFeGVjKTsKKyAgICBPcGVyYW5kRmxhZ3MgPSBYODZJSTo6TU9fR09UVFBPRkY7CisgICAgV3JhcHBlcktpbmQgPSBYODZJU0Q6OldyYXBwZXJSSVA7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KG1vZGVsID09IFRMU01vZGVsOjpJbml0aWFsRXhlYyk7CisgICAgT3BlcmFuZEZsYWdzID0gWDg2SUk6Ok1PX0lORE5UUE9GRjsKKyAgfQorCisgIC8vIGVtaXQgImFkZGwgeEBudHBvZmYsJWVheCIgKGxvY2FsIGV4ZWMpIG9yICJhZGRsIHhAaW5kbnRwb2ZmLCVlYXgiIChpbml0aWFsCisgIC8vIGV4ZWMpCisgIFNEVmFsdWUgVEdBID0gREFHLmdldFRhcmdldEdsb2JhbEFkZHJlc3MoR0EtPmdldEdsb2JhbCgpLCBkbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0EtPmdldFZhbHVlVHlwZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQS0+Z2V0T2Zmc2V0KCksIE9wZXJhbmRGbGFncyk7CisgIFNEVmFsdWUgT2Zmc2V0ID0gREFHLmdldE5vZGUoV3JhcHBlcktpbmQsIGRsLCBQdHJWVCwgVEdBKTsKKworICBpZiAobW9kZWwgPT0gVExTTW9kZWw6OkluaXRpYWxFeGVjKQorICAgIE9mZnNldCA9IERBRy5nZXRMb2FkKFB0clZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEdPVCgpLCAwLCBmYWxzZSwgZmFsc2UsIDApOworCisgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSB0aHJlYWQgbG9jYWwgdmFyaWFibGUgaXMgdGhlIGFkZCBvZiB0aGUgdGhyZWFkCisgIC8vIHBvaW50ZXIgd2l0aCB0aGUgb2Zmc2V0IG9mIHRoZSB2YXJpYWJsZS4KKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgUHRyVlQsIFRocmVhZFBvaW50ZXIsIE9mZnNldCk7Cit9CisKK1NEVmFsdWUKK1g4NlRhcmdldExvd2VyaW5nOjpMb3dlckdsb2JhbFRMU0FkZHJlc3MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgCisgIEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBID0gY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihPcCk7CisgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IEdBLT5nZXRHbG9iYWwoKTsKKworICBpZiAoU3VidGFyZ2V0LT5pc1RhcmdldERhcndpbigpKSB7CisgICAgLy8gRGFyd2luIG9ubHkgaGFzIG9uZSBtb2RlbCBvZiBUTFMuICBMb3dlciB0byB0aGF0LgorICAgIHVuc2lnbmVkIGNoYXIgT3BGbGFnID0gMDsKKyAgICB1bnNpZ25lZCBXcmFwcGVyS2luZCA9IFN1YnRhcmdldC0+aXNQSUNTdHlsZVJJUFJlbCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4NklTRDo6V3JhcHBlclJJUCA6IFg4NklTRDo6V3JhcHBlcjsKKyAgICAKKyAgICAvLyBJbiBQSUMgbW9kZSAodW5sZXNzIHdlJ3JlIGluIFJJUFJlbCBQSUMgbW9kZSkgd2UgYWRkIGFuIG9mZnNldCB0byB0aGUKKyAgICAvLyBnbG9iYWwgYmFzZSByZWcuCisgICAgYm9vbCBQSUMzMiA9IChnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pICYmCisgICAgICAgICAgICAgICAgICAhU3VidGFyZ2V0LT5pczY0Qml0KCk7CisgICAgaWYgKFBJQzMyKQorICAgICAgT3BGbGFnID0gWDg2SUk6Ok1PX1RMVlBfUElDX0JBU0U7CisgICAgZWxzZQorICAgICAgT3BGbGFnID0gWDg2SUk6Ok1PX1RMVlA7CisgICAgRGVidWdMb2MgREwgPSBPcC5nZXREZWJ1Z0xvYygpOyAgICAKKyAgICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEdBLT5nZXRHbG9iYWwoKSwgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBLT5nZXRPZmZzZXQoKSwgT3BGbGFnKTsKKyAgICBTRFZhbHVlIE9mZnNldCA9IERBRy5nZXROb2RlKFdyYXBwZXJLaW5kLCBETCwgZ2V0UG9pbnRlclR5KCksIFJlc3VsdCk7CisgIAorICAgIC8vIFdpdGggUElDMzIsIHRoZSBhZGRyZXNzIGlzIGFjdHVhbGx5ICRnICsgT2Zmc2V0LgorICAgIGlmIChQSUMzMikKKyAgICAgIE9mZnNldCA9IERBRy5nZXROb2RlKElTRDo6QURELCBETCwgZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShYODZJU0Q6Okdsb2JhbEJhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYygpLCBnZXRQb2ludGVyVHkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQpOworICAgIAorICAgIC8vIExvd2VyaW5nIHRoZSBtYWNoaW5lIGlzZCB3aWxsIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIGluIHRoZSByaWdodAorICAgIC8vIGxvY2F0aW9uLgorICAgIFNEVmFsdWUgQXJnc1tdID0geyBPZmZzZXQgfTsKKyAgICBTRFZhbHVlIENoYWluID0gREFHLmdldE5vZGUoWDg2SVNEOjpUTFNDQUxMLCBETCwgTVZUOjpPdGhlciwgQXJncywgMSk7CisgICAgCisgICAgLy8gVExTQ0FMTCB3aWxsIGJlIGNvZGVnZW4nZWQgYXMgY2FsbC4gSW5mb3JtIE1GSSB0aGF0IGZ1bmN0aW9uIGhhcyBjYWxscy4KKyAgICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnJhbWVJbmZvKCk7CisgICAgTUZJLT5zZXRBZGp1c3RzU3RhY2sodHJ1ZSk7CisKKyAgICAvLyBBbmQgb3VyIHJldHVybiB2YWx1ZSAodGxzIGFkZHJlc3MpIGlzIGluIHRoZSBzdGFuZGFyZCBjYWxsIHJldHVybiB2YWx1ZQorICAgIC8vIGxvY2F0aW9uLgorICAgIHVuc2lnbmVkIFJlZyA9IFN1YnRhcmdldC0+aXM2NEJpdCgpID8gWDg2OjpSQVggOiBYODY6OkVBWDsKKyAgICByZXR1cm4gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBETCwgUmVnLCBnZXRQb2ludGVyVHkoKSk7CisgIH0KKyAgCisgIGFzc2VydChmYWxzZSAmJgorICAgICAgICAgIlRMUyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0LiIpOworCisgIGxsdm1fdW5yZWFjaGFibGUoIlVucmVhY2hhYmxlIik7CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKworLy8vIExvd2VyU2hpZnQgLSBMb3dlciBTUkFfUEFSVFMgYW5kIGZyaWVuZHMsIHdoaWNoIHJldHVybiB0d28gaTMyIHZhbHVlcyBhbmQKKy8vLyB0YWtlIGEgMiB4IGkzMiB2YWx1ZSB0byBzaGlmdCBwbHVzIGEgc2hpZnQgYW1vdW50LgorU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJTaGlmdChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBhc3NlcnQoT3AuZ2V0TnVtT3BlcmFuZHMoKSA9PSAzICYmICJOb3QgYSBkb3VibGUtc2hpZnQhIik7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICB1bnNpZ25lZCBWVEJpdHMgPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgYm9vbCBpc1NSQSA9IE9wLmdldE9wY29kZSgpID09IElTRDo6U1JBX1BBUlRTOworICBTRFZhbHVlIFNoT3BMbyA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgU2hPcEhpID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBTaEFtdCAgPSBPcC5nZXRPcGVyYW5kKDIpOworICBTRFZhbHVlIFRtcDEgPSBpc1NSQSA/IERBRy5nZXROb2RlKElTRDo6U1JBLCBkbCwgVlQsIFNoT3BIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoVlRCaXRzIC0gMSwgTVZUOjppOCkpCisgICAgICAgICAgICAgICAgICAgICAgIDogREFHLmdldENvbnN0YW50KDAsIFZUKTsKKworICBTRFZhbHVlIFRtcDIsIFRtcDM7CisgIGlmIChPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITF9QQVJUUykgeworICAgIFRtcDIgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlNITEQsIGRsLCBWVCwgU2hPcEhpLCBTaE9wTG8sIFNoQW10KTsKKyAgICBUbXAzID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBWVCwgU2hPcExvLCBTaEFtdCk7CisgIH0gZWxzZSB7CisgICAgVG1wMiA9IERBRy5nZXROb2RlKFg4NklTRDo6U0hSRCwgZGwsIFZULCBTaE9wTG8sIFNoT3BIaSwgU2hBbXQpOworICAgIFRtcDMgPSBEQUcuZ2V0Tm9kZShpc1NSQSA/IElTRDo6U1JBIDogSVNEOjpTUkwsIGRsLCBWVCwgU2hPcEhpLCBTaEFtdCk7CisgIH0KKworICBTRFZhbHVlIEFuZE5vZGUgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIE1WVDo6aTgsIFNoQW10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoVlRCaXRzLCBNVlQ6Omk4KSk7CisgIFNEVmFsdWUgQ29uZCA9IERBRy5nZXROb2RlKFg4NklTRDo6Q01QLCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZE5vZGUsIERBRy5nZXRDb25zdGFudCgwLCBNVlQ6Omk4KSk7CisKKyAgU0RWYWx1ZSBIaSwgTG87CisgIFNEVmFsdWUgQ0MgPSBEQUcuZ2V0Q29uc3RhbnQoWDg2OjpDT05EX05FLCBNVlQ6Omk4KTsKKyAgU0RWYWx1ZSBPcHMwWzRdID0geyBUbXAyLCBUbXAzLCBDQywgQ29uZCB9OworICBTRFZhbHVlIE9wczFbNF0gPSB7IFRtcDMsIFRtcDEsIENDLCBDb25kIH07CisKKyAgaWYgKE9wLmdldE9wY29kZSgpID09IElTRDo6U0hMX1BBUlRTKSB7CisgICAgSGkgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkNNT1YsIGRsLCBWVCwgT3BzMCwgNCk7CisgICAgTG8gPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkNNT1YsIGRsLCBWVCwgT3BzMSwgNCk7CisgIH0gZWxzZSB7CisgICAgTG8gPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkNNT1YsIGRsLCBWVCwgT3BzMCwgNCk7CisgICAgSGkgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkNNT1YsIGRsLCBWVCwgT3BzMSwgNCk7CisgIH0KKworICBTRFZhbHVlIE9wc1syXSA9IHsgTG8sIEhpIH07CisgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMoT3BzLCAyLCBkbCk7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyU0lOVF9UT19GUChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIEVWVCBTcmNWVCA9IE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisKKyAgaWYgKFNyY1ZULmlzVmVjdG9yKCkpIHsKKyAgICBpZiAoU3JjVlQgPT0gTVZUOjp2MmkzMiAmJiBPcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OnYyZjY0KSB7CisgICAgICByZXR1cm4gT3A7CisgICAgfQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICBhc3NlcnQoU3JjVlQuZ2V0U2ltcGxlVlQoKSA8PSBNVlQ6Omk2NCAmJiBTcmNWVC5nZXRTaW1wbGVWVCgpID49IE1WVDo6aTE2ICYmCisgICAgICAgICAiVW5rbm93biBTSU5UX1RPX0ZQIHRvIGxvd2VyISIpOworCisgIC8vIFRoZXNlIGFyZSByZWFsbHkgTGVnYWw7IHJldHVybiB0aGUgb3BlcmFuZCBzbyB0aGUgY2FsbGVyIGFjY2VwdHMgaXQgYXMKKyAgLy8gTGVnYWwuCisgIGlmIChTcmNWVCA9PSBNVlQ6OmkzMiAmJiBpc1NjYWxhckZQVHlwZUluU1NFUmVnKE9wLmdldFZhbHVlVHlwZSgpKSkKKyAgICByZXR1cm4gT3A7CisgIGlmIChTcmNWVCA9PSBNVlQ6Omk2NCAmJiBpc1NjYWxhckZQVHlwZUluU1NFUmVnKE9wLmdldFZhbHVlVHlwZSgpKSAmJgorICAgICAgU3VidGFyZ2V0LT5pczY0Qml0KCkpIHsKKyAgICByZXR1cm4gT3A7CisgIH0KKworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIHVuc2lnbmVkIFNpemUgPSBTcmNWVC5nZXRTaXplSW5CaXRzKCkvODsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgaW50IFNTRkkgPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlU3RhY2tPYmplY3QoU2l6ZSwgU2l6ZSwgZmFsc2UpOworICBTRFZhbHVlIFN0YWNrU2xvdCA9IERBRy5nZXRGcmFtZUluZGV4KFNTRkksIGdldFBvaW50ZXJUeSgpKTsKKyAgU0RWYWx1ZSBDaGFpbiA9IERBRy5nZXRTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBPcC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhTU0ZJKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICByZXR1cm4gQnVpbGRGSUxEKE9wLCBTcmNWVCwgQ2hhaW4sIFN0YWNrU2xvdCwgREFHKTsKK30KKworU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6QnVpbGRGSUxEKFNEVmFsdWUgT3AsIEVWVCBTcmNWVCwgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFN0YWNrU2xvdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgLy8gQnVpbGQgdGhlIEZJTEQKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBTRFZUTGlzdCBUeXM7CisgIGJvb2wgdXNlU1NFID0gaXNTY2FsYXJGUFR5cGVJblNTRVJlZyhPcC5nZXRWYWx1ZVR5cGUoKSk7CisgIGlmICh1c2VTU0UpCisgICAgVHlzID0gREFHLmdldFZUTGlzdChNVlQ6OmY2NCwgTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKyAgZWxzZQorICAgIFR5cyA9IERBRy5nZXRWVExpc3QoT3AuZ2V0VmFsdWVUeXBlKCksIE1WVDo6T3RoZXIpOworICBTRFZhbHVlIE9wc1tdID0geyBDaGFpbiwgU3RhY2tTbG90LCBEQUcuZ2V0VmFsdWVUeXBlKFNyY1ZUKSB9OworICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXROb2RlKHVzZVNTRSA/IFg4NklTRDo6RklMRF9GTEFHIDogWDg2SVNEOjpGSUxELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXMsIE9wcywgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7CisKKyAgaWYgKHVzZVNTRSkgeworICAgIENoYWluID0gUmVzdWx0LmdldFZhbHVlKDEpOworICAgIFNEVmFsdWUgSW5GbGFnID0gUmVzdWx0LmdldFZhbHVlKDIpOworCisgICAgLy8gRklYTUU6IEN1cnJlbnRseSB0aGUgRlNUIGlzIGZsYWdnZWQgdG8gdGhlIEZJTERfRkxBRy4gVGhpcworICAgIC8vIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgZXhjZXB0IHRoYXQgUkZQIGNhbm5vdCBiZSBsaXZlIGFjcm9zcworICAgIC8vIG11bHRpcGxlIGJsb2Nrcy4gV2hlbiBzdGFja2lmaWVyIGlzIGZpeGVkLCB0aGV5IGNhbiBiZSB1bmNvdXBsZWQuCisgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgICBpbnQgU1NGSSA9IE1GLmdldEZyYW1lSW5mbygpLT5DcmVhdGVTdGFja09iamVjdCg4LCA4LCBmYWxzZSk7CisgICAgU0RWYWx1ZSBTdGFja1Nsb3QgPSBEQUcuZ2V0RnJhbWVJbmRleChTU0ZJLCBnZXRQb2ludGVyVHkoKSk7CisgICAgVHlzID0gREFHLmdldFZUTGlzdChNVlQ6Ok90aGVyKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geworICAgICAgQ2hhaW4sIFJlc3VsdCwgU3RhY2tTbG90LCBEQUcuZ2V0VmFsdWVUeXBlKE9wLmdldFZhbHVlVHlwZSgpKSwgSW5GbGFnCisgICAgfTsKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKFg4NklTRDo6RlNULCBkbCwgVHlzLCBPcHMsIGFycmF5X2xlbmd0aG9mKE9wcykpOworICAgIFJlc3VsdCA9IERBRy5nZXRMb2FkKE9wLmdldFZhbHVlVHlwZSgpLCBkbCwgQ2hhaW4sIFN0YWNrU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhTU0ZJKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICB9CisKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8gTG93ZXJVSU5UX1RPX0ZQX2k2NCAtIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGRvdWJsZSBleHBhbnNpb24uCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlclVJTlRfVE9fRlBfaTY0KFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIC8vIFRoaXMgYWxnb3JpdGhtIGlzIG5vdCBvYnZpb3VzLiBIZXJlIGl0IGlzIGluIEMgY29kZSwgbW9yZSBvciBsZXNzOgorICAvKgorICAgIGRvdWJsZSB1aW50NjRfdG9fZG91YmxlKCB1aW50MzJfdCBoaSwgdWludDMyX3QgbG8gKSB7CisgICAgICBzdGF0aWMgY29uc3QgX19tMTI4aSBleHAgPSB7IDB4NDMzMDAwMDA0NTMwMDAwMFVMTCwgMCB9OworICAgICAgc3RhdGljIGNvbnN0IF9fbTEyOGQgYmlhcyA9IHsgMHgxLjBwODQsIDB4MS4wcDUyIH07CisKKyAgICAgIC8vIENvcHkgaW50cyB0byB4bW0gcmVnaXN0ZXJzLgorICAgICAgX19tMTI4aSB4aCA9IF9tbV9jdnRzaTMyX3NpMTI4KCBoaSApOworICAgICAgX19tMTI4aSB4bCA9IF9tbV9jdnRzaTMyX3NpMTI4KCBsbyApOworCisgICAgICAvLyBDb21iaW5lIGludG8gbG93IGhhbGYgb2YgYSBzaW5nbGUgeG1tIHJlZ2lzdGVyLgorICAgICAgX19tMTI4aSB4ID0gX21tX3VucGFja2xvX2VwaTMyKCB4aCwgeGwgKTsKKyAgICAgIF9fbTEyOGQgZDsKKyAgICAgIGRvdWJsZSBzZDsKKworICAgICAgLy8gTWVyZ2UgaW4gYXBwcm9wcmlhdGUgZXhwb25lbnRzIHRvIGdpdmUgdGhlIGludGVnZXIgYml0cyB0aGUgcmlnaHQKKyAgICAgIC8vIG1hZ25pdHVkZS4KKyAgICAgIHggPSBfbW1fdW5wYWNrbG9fZXBpMzIoIHgsIGV4cCApOworCisgICAgICAvLyBTdWJ0cmFjdCBhd2F5IHRoZSBiaWFzZXMgdG8gZGVhbCB3aXRoIHRoZSBJRUVFLTc1NCBkb3VibGUgcHJlY2lzaW9uCisgICAgICAvLyBpbXBsaWNpdCAxLgorICAgICAgZCA9IF9tbV9zdWJfcGQoIChfX20xMjhkKSB4LCBiaWFzICk7CisKKyAgICAgIC8vIEFsbCBjb252ZXJzaW9ucyB1cCB0byBoZXJlIGFyZSBleGFjdC4gVGhlIGNvcnJlY3RseSByb3VuZGVkIHJlc3VsdCBpcworICAgICAgLy8gY2FsY3VsYXRlZCB1c2luZyB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAgIC8vIGhvcml6b250YWwgYWRkLgorICAgICAgZCA9IF9tbV9hZGRfc2QoIGQsIF9tbV91bnBhY2toaV9wZCggZCwgZCApICk7CisgICAgICBfbW1fc3RvcmVfc2QoICZzZCwgZCApOyAgIC8vIEJlY2F1c2Ugd2UgYXJlIHJldHVybmluZyBkb3VibGVzIGluIFhNTSwgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBkb2Vzbid0IHJlYWxseSBuZWVkIHRvIGJlIGhlcmUgKGV4Y2VwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXliZSB0byB6ZXJvIHRoZSBvdGhlciBkb3VibGUpCisgICAgICByZXR1cm4gc2Q7CisgICAgfQorICAqLworCisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgTExWTUNvbnRleHQgKkNvbnRleHQgPSBEQUcuZ2V0Q29udGV4dCgpOworCisgIC8vIEJ1aWxkIHNvbWUgbWFnaWMgY29uc3RhbnRzLgorICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IENWMDsKKyAgQ1YwLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KCpDb250ZXh0LCBBUEludCgzMiwgMHg0NTMwMDAwMCkpKTsKKyAgQ1YwLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KCpDb250ZXh0LCBBUEludCgzMiwgMHg0MzMwMDAwMCkpKTsKKyAgQ1YwLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KCpDb250ZXh0LCBBUEludCgzMiwgMCkpKTsKKyAgQ1YwLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KCpDb250ZXh0LCBBUEludCgzMiwgMCkpKTsKKyAgQ29uc3RhbnQgKkMwID0gQ29uc3RhbnRWZWN0b3I6OmdldChDVjApOworICBTRFZhbHVlIENQSWR4MCA9IERBRy5nZXRDb25zdGFudFBvb2woQzAsIGdldFBvaW50ZXJUeSgpLCAxNik7CisKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDVjE7CisgIENWMS5wdXNoX2JhY2soCisgICAgQ29uc3RhbnRGUDo6Z2V0KCpDb250ZXh0LCBBUEZsb2F0KEFQSW50KDY0LCAweDQ1MzAwMDAwMDAwMDAwMDBVTEwpKSkpOworICBDVjEucHVzaF9iYWNrKAorICAgIENvbnN0YW50RlA6OmdldCgqQ29udGV4dCwgQVBGbG9hdChBUEludCg2NCwgMHg0MzMwMDAwMDAwMDAwMDAwVUxMKSkpKTsKKyAgQ29uc3RhbnQgKkMxID0gQ29uc3RhbnRWZWN0b3I6OmdldChDVjEpOworICBTRFZhbHVlIENQSWR4MSA9IERBRy5nZXRDb25zdGFudFBvb2woQzEsIGdldFBvaW50ZXJUeSgpLCAxNik7CisKKyAgU0RWYWx1ZSBYUjEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMSkpKTsKKyAgU0RWYWx1ZSBYUjIgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIGRsLCBNVlQ6OnY0aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpKTsKKyAgU0RWYWx1ZSBVbnBjazEgPSBnZXRVbnBhY2tsKERBRywgZGwsIE1WVDo6djRpMzIsIFhSMSwgWFIyKTsKKyAgU0RWYWx1ZSBDTG9kMCA9IERBRy5nZXRMb2FkKE1WVDo6djRpMzIsIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksIENQSWR4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMTYpOworICBTRFZhbHVlIFVucGNrMiA9IGdldFVucGFja2woREFHLCBkbCwgTVZUOjp2NGkzMiwgVW5wY2sxLCBDTG9kMCk7CisgIFNEVmFsdWUgWFIyRiA9IERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYyZjY0LCBVbnBjazIpOworICBTRFZhbHVlIENMb2QxID0gREFHLmdldExvYWQoTVZUOjp2MmY2NCwgZGwsIENMb2QwLmdldFZhbHVlKDEpLCBDUElkeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Q29uc3RhbnRQb29sKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDE2KTsKKyAgU0RWYWx1ZSBTdWIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkZTVUIsIGRsLCBNVlQ6OnYyZjY0LCBYUjJGLCBDTG9kMSk7CisKKyAgLy8gQWRkIHRoZSBoYWx2ZXM7IGVhc2llc3Qgd2F5IGlzIHRvIHN3YXAgdGhlbSBpbnRvIGFub3RoZXIgcmVnIGZpcnN0LgorICBpbnQgU2h1Zk1hc2tbMl0gPSB7IDEsIC0xIH07CisgIFNEVmFsdWUgU2h1ZiA9IERBRy5nZXRWZWN0b3JTaHVmZmxlKE1WVDo6djJmNjQsIGRsLCBTdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRVTkRFRihNVlQ6OnYyZjY0KSwgU2h1Zk1hc2spOworICBTRFZhbHVlIEFkZCA9IERBRy5nZXROb2RlKElTRDo6RkFERCwgZGwsIE1WVDo6djJmNjQsIFNodWYsIFN1Yik7CisgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwgZGwsIE1WVDo6ZjY0LCBBZGQsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworfQorCisvLyBMb3dlclVJTlRfVE9fRlBfaTMyIC0gMzItYml0IHVuc2lnbmVkIGludGVnZXIgdG8gZmxvYXQgZXhwYW5zaW9uLgorU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJVSU5UX1RPX0ZQX2kzMihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIC8vIEZQIGNvbnN0YW50IHRvIGJpYXMgY29ycmVjdCB0aGUgZmluYWwgcmVzdWx0LgorICBTRFZhbHVlIEJpYXMgPSBEQUcuZ2V0Q29uc3RhbnRGUChCaXRzVG9Eb3VibGUoMHg0MzMwMDAwMDAwMDAwMDAwVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjpmNjQpOworCisgIC8vIExvYWQgdGhlIDMyLWJpdCB2YWx1ZSBpbnRvIGFuIFhNTSByZWdpc3Rlci4KKyAgU0RWYWx1ZSBMb2FkID0gREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwgTVZUOjp2NGkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDApKSk7CisKKyAgTG9hZCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgTVZUOjpmNjQsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2MmY2NCwgTG9hZCksCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworCisgIC8vIE9yIHRoZSBsb2FkIHdpdGggdGhlIGJpYXMuCisgIFNEVmFsdWUgT3IgPSBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTVZUOjp2Mmk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYyaTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6djJmNjQsIExvYWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYyaTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpTQ0FMQVJfVE9fVkVDVE9SLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6djJmNjQsIEJpYXMpKSk7CisgIE9yID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIGRsLCBNVlQ6OmY2NCwKKyAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2MmY2NCwgT3IpLAorICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSk7CisKKyAgLy8gU3VidHJhY3QgdGhlIGJpYXMuCisgIFNEVmFsdWUgU3ViID0gREFHLmdldE5vZGUoSVNEOjpGU1VCLCBkbCwgTVZUOjpmNjQsIE9yLCBCaWFzKTsKKworICAvLyBIYW5kbGUgZmluYWwgcm91bmRpbmcuCisgIEVWVCBEZXN0VlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKworICBpZiAoRGVzdFZULmJpdHNMVChNVlQ6OmY2NCkpIHsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpGUF9ST1VORCwgZGwsIERlc3RWVCwgU3ViLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworICB9IGVsc2UgaWYgKERlc3RWVC5iaXRzR1QoTVZUOjpmNjQpKSB7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RlBfRVhURU5ELCBkbCwgRGVzdFZULCBTdWIpOworICB9CisKKyAgLy8gSGFuZGxlIGZpbmFsIHJvdW5kaW5nLgorICByZXR1cm4gU3ViOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlclVJTlRfVE9fRlAoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBTRFZhbHVlIE4wID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIC8vIFNpbmNlIFVJTlRfVE9fRlAgaXMgbGVnYWwgKGl0J3MgbWFya2VkIGN1c3RvbSksIGRhZyBjb21iaW5lciB3b24ndAorICAvLyBvcHRpbWl6ZSBpdCB0byBhIFNJTlRfVE9fRlAgd2hlbiB0aGUgc2lnbiBiaXQgaXMga25vd24gemVyby4gUGVyZm9ybQorICAvLyB0aGUgb3B0aW1pemF0aW9uIGhlcmUuCisgIGlmIChEQUcuU2lnbkJpdElzWmVybyhOMCkpCisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0lOVF9UT19GUCwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLCBOMCk7CisKKyAgRVZUIFNyY1ZUID0gTjAuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBEc3RWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBpZiAoU3JjVlQgPT0gTVZUOjppNjQgJiYgRHN0VlQgPT0gTVZUOjpmNjQgJiYgWDg2U2NhbGFyU1NFZjY0KQorICAgIHJldHVybiBMb3dlclVJTlRfVE9fRlBfaTY0KE9wLCBEQUcpOworICBlbHNlIGlmIChTcmNWVCA9PSBNVlQ6OmkzMiAmJiBYODZTY2FsYXJTU0VmNjQpCisgICAgcmV0dXJuIExvd2VyVUlOVF9UT19GUF9pMzIoT3AsIERBRyk7CisKKyAgLy8gTWFrZSBhIDY0LWJpdCBidWZmZXIsIGFuZCB1c2UgaXQgdG8gYnVpbGQgYW4gRklMRC4KKyAgU0RWYWx1ZSBTdGFja1Nsb3QgPSBEQUcuQ3JlYXRlU3RhY2tUZW1wb3JhcnkoTVZUOjppNjQpOworICBpZiAoU3JjVlQgPT0gTVZUOjppMzIpIHsKKyAgICBTRFZhbHVlIFdvcmRPZmYgPSBEQUcuZ2V0Q29uc3RhbnQoNCwgZ2V0UG9pbnRlclR5KCkpOworICAgIFNEVmFsdWUgT2Zmc2V0U2xvdCA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSwgU3RhY2tTbG90LCBXb3JkT2ZmKTsKKyAgICBTRFZhbHVlIFN0b3JlMSA9IERBRy5nZXRTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBPcC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrU2xvdCwgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICBTRFZhbHVlIFN0b3JlMiA9IERBRy5nZXRTdG9yZShTdG9yZTEsIGRsLCBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldFNsb3QsIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgU0RWYWx1ZSBGaWxkID0gQnVpbGRGSUxEKE9wLCBNVlQ6Omk2NCwgU3RvcmUyLCBTdGFja1Nsb3QsIERBRyk7CisgICAgcmV0dXJuIEZpbGQ7CisgIH0KKworICBhc3NlcnQoU3JjVlQgPT0gTVZUOjppNjQgJiYgIlVuZXhwZWN0ZWQgdHlwZSBpbiBVSU5UX1RPX0ZQIik7CisgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwgT3AuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2tTbG90LCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworICAvLyBGb3IgaTY0IHNvdXJjZSwgd2UgbmVlZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIHBvd2VyIG9mIDIgaWYgdGhlIGlucHV0CisgIC8vIHdhcyBuZWdhdGl2ZS4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIG9wdGltaXphdGlvbiBpbgorICAvLyBEQUdUeXBlTGVnYWxpemVyOjpFeHBhbmRJbnRPcF9VTklUX1RPX0ZQLCBhbmQgZm9yIGl0IHRvIGJlIHNhZmUgaGVyZSwKKyAgLy8gd2UgbXVzdCBiZSBjYXJlZnVsIHRvIGRvIHRoZSBjb21wdXRhdGlvbiBpbiB4ODcgZXh0ZW5kZWQgcHJlY2lzaW9uLCBub3QKKyAgLy8gaW4gU1NFLiAoVGhlIGdlbmVyaWMgY29kZSBjYW4ndCBrbm93IGl0J3MgT0sgdG8gZG8gdGhpcywgb3IgaG93IHRvLikKKyAgU0RWVExpc3QgVHlzID0gREFHLmdldFZUTGlzdChNVlQ6OmY4MCwgTVZUOjpPdGhlcik7CisgIFNEVmFsdWUgT3BzW10gPSB7IFN0b3JlLCBTdGFja1Nsb3QsIERBRy5nZXRWYWx1ZVR5cGUoTVZUOjppNjQpIH07CisgIFNEVmFsdWUgRmlsZCA9IERBRy5nZXROb2RlKFg4NklTRDo6RklMRCwgZGwsIFR5cywgT3BzLCAzKTsKKworICBBUEludCBGRigzMiwgMHg1RjgwMDAwMFVMTCk7CisKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2lnbiBiaXQgaXMgc2V0LgorICBTRFZhbHVlIFNpZ25TZXQgPSBEQUcuZ2V0U2V0Q0MoZGwsIGdldFNldENDUmVzdWx0VHlwZShNVlQ6Omk2NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApLCBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppNjQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpTRVRMVCk7CisKKyAgLy8gQnVpbGQgYSA2NCBiaXQgcGFpciAoMCwgRkYpIGluIHRoZSBjb25zdGFudCBwb29sLCB3aXRoIEZGIGluIHRoZSBsbyBiaXRzLgorICBTRFZhbHVlIEZ1ZGdlUHRyID0gREFHLmdldENvbnN0YW50UG9vbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldCgqREFHLmdldENvbnRleHQoKSwgRkYuemV4dCg2NCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSk7CisKKyAgLy8gR2V0IGEgcG9pbnRlciB0byBGRiBpZiB0aGUgc2lnbiBiaXQgd2FzIHNldCwgb3IgdG8gMCBvdGhlcndpc2UuCisgIFNEVmFsdWUgWmVybyA9IERBRy5nZXRJbnRQdHJDb25zdGFudCgwKTsKKyAgU0RWYWx1ZSBGb3VyID0gREFHLmdldEludFB0ckNvbnN0YW50KDQpOworICBTRFZhbHVlIE9mZnNldCA9IERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgWmVyby5nZXRWYWx1ZVR5cGUoKSwgU2lnblNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaZXJvLCBGb3VyKTsKKyAgRnVkZ2VQdHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIGdldFBvaW50ZXJUeSgpLCBGdWRnZVB0ciwgT2Zmc2V0KTsKKworICAvLyBMb2FkIHRoZSB2YWx1ZSBvdXQsIGV4dGVuZGluZyBpdCBmcm9tIGYzMiB0byBmODAuCisgIC8vIEZJWE1FOiBBdm9pZCB0aGUgZXh0ZW5kIGJ5IGNvbnN0cnVjdGluZyB0aGUgcmlnaHQgY29uc3RhbnQgcG9vbD8KKyAgU0RWYWx1ZSBGdWRnZSA9IERBRy5nZXRFeHRMb2FkKElTRDo6RVhUTE9BRCwgTVZUOjpmODAsIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdWRnZVB0ciwgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTVZUOjpmMzIsIGZhbHNlLCBmYWxzZSwgNCk7CisgIC8vIEV4dGVuZCBldmVyeXRoaW5nIHRvIDgwIGJpdHMgdG8gZm9yY2UgaXQgdG8gYmUgZG9uZSBvbiB4ODcuCisgIFNEVmFsdWUgQWRkID0gREFHLmdldE5vZGUoSVNEOjpGQURELCBkbCwgTVZUOjpmODAsIEZpbGQsIEZ1ZGdlKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6RlBfUk9VTkQsIGRsLCBEc3RWVCwgQWRkLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoMCkpOworfQorCitzdGQ6OnBhaXI8U0RWYWx1ZSxTRFZhbHVlPiBYODZUYXJnZXRMb3dlcmluZzo6CitGUF9UT19JTlRIZWxwZXIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsIGJvb2wgSXNTaWduZWQpIGNvbnN0IHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIEVWVCBEc3RUeSA9IE9wLmdldFZhbHVlVHlwZSgpOworCisgIGlmICghSXNTaWduZWQpIHsKKyAgICBhc3NlcnQoRHN0VHkgPT0gTVZUOjppMzIgJiYgIlVuZXhwZWN0ZWQgRlBfVE9fVUlOVCIpOworICAgIERzdFR5ID0gTVZUOjppNjQ7CisgIH0KKworICBhc3NlcnQoRHN0VHkuZ2V0U2ltcGxlVlQoKSA8PSBNVlQ6Omk2NCAmJgorICAgICAgICAgRHN0VHkuZ2V0U2ltcGxlVlQoKSA+PSBNVlQ6OmkxNiAmJgorICAgICAgICAgIlVua25vd24gRlBfVE9fU0lOVCB0byBsb3dlciEiKTsKKworICAvLyBUaGVzZSBhcmUgcmVhbGx5IExlZ2FsLgorICBpZiAoRHN0VHkgPT0gTVZUOjppMzIgJiYKKyAgICAgIGlzU2NhbGFyRlBUeXBlSW5TU0VSZWcoT3AuZ2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSkpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFNEVmFsdWUoKSwgU0RWYWx1ZSgpKTsKKyAgaWYgKFN1YnRhcmdldC0+aXM2NEJpdCgpICYmCisgICAgICBEc3RUeSA9PSBNVlQ6Omk2NCAmJgorICAgICAgaXNTY2FsYXJGUFR5cGVJblNTRVJlZyhPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpKSkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU0RWYWx1ZSgpLCBTRFZhbHVlKCkpOworCisgIC8vIFdlIGxvd2VyIEZQLT5zaW50NjQgaW50byBGSVNUUDY0LCBmb2xsb3dlZCBieSBhIGxvYWQsIGFsbCB0byBhIHRlbXBvcmFyeQorICAvLyBzdGFjayBzbG90LgorICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICB1bnNpZ25lZCBNZW1TaXplID0gRHN0VHkuZ2V0U2l6ZUluQml0cygpLzg7CisgIGludCBTU0ZJID0gTUYuZ2V0RnJhbWVJbmZvKCktPkNyZWF0ZVN0YWNrT2JqZWN0KE1lbVNpemUsIE1lbVNpemUsIGZhbHNlKTsKKyAgU0RWYWx1ZSBTdGFja1Nsb3QgPSBEQUcuZ2V0RnJhbWVJbmRleChTU0ZJLCBnZXRQb2ludGVyVHkoKSk7CisKKyAgdW5zaWduZWQgT3BjOworICBzd2l0Y2ggKERzdFR5LmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBGUF9UT19TSU5UIHRvIGxvd2VyISIpOworICBjYXNlIE1WVDo6aTE2OiBPcGMgPSBYODZJU0Q6OkZQX1RPX0lOVDE2X0lOX01FTTsgYnJlYWs7CisgIGNhc2UgTVZUOjppMzI6IE9wYyA9IFg4NklTRDo6RlBfVE9fSU5UMzJfSU5fTUVNOyBicmVhazsKKyAgY2FzZSBNVlQ6Omk2NDogT3BjID0gWDg2SVNEOjpGUF9UT19JTlQ2NF9JTl9NRU07IGJyZWFrOworICB9CisKKyAgU0RWYWx1ZSBDaGFpbiA9IERBRy5nZXRFbnRyeU5vZGUoKTsKKyAgU0RWYWx1ZSBWYWx1ZSA9IE9wLmdldE9wZXJhbmQoMCk7CisgIGlmIChpc1NjYWxhckZQVHlwZUluU1NFUmVnKE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkpKSB7CisgICAgYXNzZXJ0KERzdFR5ID09IE1WVDo6aTY0ICYmICJJbnZhbGlkIEZQX1RPX1NJTlQgdG8gbG93ZXIhIik7CisgICAgQ2hhaW4gPSBEQUcuZ2V0U3RvcmUoQ2hhaW4sIGRsLCBWYWx1ZSwgU3RhY2tTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRGaXhlZFN0YWNrKFNTRkkpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgU0RWVExpc3QgVHlzID0gREFHLmdldFZUTGlzdChPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpLCBNVlQ6Ok90aGVyKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geworICAgICAgQ2hhaW4sIFN0YWNrU2xvdCwgREFHLmdldFZhbHVlVHlwZShPcC5nZXRPcGVyYW5kKDApLmdldFZhbHVlVHlwZSgpKQorICAgIH07CisgICAgVmFsdWUgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkZMRCwgZGwsIFR5cywgT3BzLCAzKTsKKyAgICBDaGFpbiA9IFZhbHVlLmdldFZhbHVlKDEpOworICAgIFNTRkkgPSBNRi5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlU3RhY2tPYmplY3QoTWVtU2l6ZSwgTWVtU2l6ZSwgZmFsc2UpOworICAgIFN0YWNrU2xvdCA9IERBRy5nZXRGcmFtZUluZGV4KFNTRkksIGdldFBvaW50ZXJUeSgpKTsKKyAgfQorCisgIC8vIEJ1aWxkIHRoZSBGUF9UT19JTlQqX0lOX01FTQorICBTRFZhbHVlIE9wc1tdID0geyBDaGFpbiwgVmFsdWUsIFN0YWNrU2xvdCB9OworICBTRFZhbHVlIEZJU1QgPSBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBNVlQ6Ok90aGVyLCBPcHMsIDMpOworCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihGSVNULCBTdGFja1Nsb3QpOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlckZQX1RPX1NJTlQoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBpZiAoT3AuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSkgeworICAgIGlmIChPcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OnYyaTMyICYmCisgICAgICAgIE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjp2MmY2NCkgeworICAgICAgcmV0dXJuIE9wOworICAgIH0KKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisKKyAgc3RkOjpwYWlyPFNEVmFsdWUsU0RWYWx1ZT4gVmFscyA9IEZQX1RPX0lOVEhlbHBlcihPcCwgREFHLCB0cnVlKTsKKyAgU0RWYWx1ZSBGSVNUID0gVmFscy5maXJzdCwgU3RhY2tTbG90ID0gVmFscy5zZWNvbmQ7CisgIC8vIElmIEZQX1RPX0lOVEhlbHBlciBmYWlsZWQsIHRoZSBub2RlIGlzIGFjdHVhbGx5IHN1cHBvc2VkIHRvIGJlIExlZ2FsLgorICBpZiAoRklTVC5nZXROb2RlKCkgPT0gMCkgcmV0dXJuIE9wOworCisgIC8vIExvYWQgdGhlIHJlc3VsdC4KKyAgcmV0dXJuIERBRy5nZXRMb2FkKE9wLmdldFZhbHVlVHlwZSgpLCBPcC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgRklTVCwgU3RhY2tTbG90LCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlckZQX1RPX1VJTlQoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBzdGQ6OnBhaXI8U0RWYWx1ZSxTRFZhbHVlPiBWYWxzID0gRlBfVE9fSU5USGVscGVyKE9wLCBEQUcsIGZhbHNlKTsKKyAgU0RWYWx1ZSBGSVNUID0gVmFscy5maXJzdCwgU3RhY2tTbG90ID0gVmFscy5zZWNvbmQ7CisgIGFzc2VydChGSVNULmdldE5vZGUoKSAmJiAiVW5leHBlY3RlZCBmYWlsdXJlIik7CisKKyAgLy8gTG9hZCB0aGUgcmVzdWx0LgorICByZXR1cm4gREFHLmdldExvYWQoT3AuZ2V0VmFsdWVUeXBlKCksIE9wLmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICBGSVNULCBTdGFja1Nsb3QsIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSwgMCk7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyRkFCUyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIExMVk1Db250ZXh0ICpDb250ZXh0ID0gREFHLmdldENvbnRleHQoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIEVsdFZUID0gVlQ7CisgIGlmIChWVC5pc1ZlY3RvcigpKQorICAgIEVsdFZUID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDVjsKKyAgaWYgKEVsdFZUID09IE1WVDo6ZjY0KSB7CisgICAgQ29uc3RhbnQgKkMgPSBDb25zdGFudEZQOjpnZXQoKkNvbnRleHQsIEFQRmxvYXQoQVBJbnQoNjQsIH4oMVVMTCA8PCA2MykpKSk7CisgICAgQ1YucHVzaF9iYWNrKEMpOworICAgIENWLnB1c2hfYmFjayhDKTsKKyAgfSBlbHNlIHsKKyAgICBDb25zdGFudCAqQyA9IENvbnN0YW50RlA6OmdldCgqQ29udGV4dCwgQVBGbG9hdChBUEludCgzMiwgfigxVSA8PCAzMSkpKSk7CisgICAgQ1YucHVzaF9iYWNrKEMpOworICAgIENWLnB1c2hfYmFjayhDKTsKKyAgICBDVi5wdXNoX2JhY2soQyk7CisgICAgQ1YucHVzaF9iYWNrKEMpOworICB9CisgIENvbnN0YW50ICpDID0gQ29uc3RhbnRWZWN0b3I6OmdldChDVik7CisgIFNEVmFsdWUgQ1BJZHggPSBEQUcuZ2V0Q29uc3RhbnRQb29sKEMsIGdldFBvaW50ZXJUeSgpLCAxNik7CisgIFNEVmFsdWUgTWFzayA9IERBRy5nZXRMb2FkKFZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBDUElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDE2KTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6RkFORCwgZGwsIFZULCBPcC5nZXRPcGVyYW5kKDApLCBNYXNrKTsKK30KKworU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJGTkVHKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIExMVk1Db250ZXh0ICpDb250ZXh0ID0gREFHLmdldENvbnRleHQoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIEVsdFZUID0gVlQ7CisgIGlmIChWVC5pc1ZlY3RvcigpKQorICAgIEVsdFZUID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDVjsKKyAgaWYgKEVsdFZUID09IE1WVDo6ZjY0KSB7CisgICAgQ29uc3RhbnQgKkMgPSBDb25zdGFudEZQOjpnZXQoKkNvbnRleHQsIEFQRmxvYXQoQVBJbnQoNjQsIDFVTEwgPDwgNjMpKSk7CisgICAgQ1YucHVzaF9iYWNrKEMpOworICAgIENWLnB1c2hfYmFjayhDKTsKKyAgfSBlbHNlIHsKKyAgICBDb25zdGFudCAqQyA9IENvbnN0YW50RlA6OmdldCgqQ29udGV4dCwgQVBGbG9hdChBUEludCgzMiwgMVUgPDwgMzEpKSk7CisgICAgQ1YucHVzaF9iYWNrKEMpOworICAgIENWLnB1c2hfYmFjayhDKTsKKyAgICBDVi5wdXNoX2JhY2soQyk7CisgICAgQ1YucHVzaF9iYWNrKEMpOworICB9CisgIENvbnN0YW50ICpDID0gQ29uc3RhbnRWZWN0b3I6OmdldChDVik7CisgIFNEVmFsdWUgQ1BJZHggPSBEQUcuZ2V0Q29uc3RhbnRQb29sKEMsIGdldFBvaW50ZXJUeSgpLCAxNik7CisgIFNEVmFsdWUgTWFzayA9IERBRy5nZXRMb2FkKFZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBDUElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDE2KTsKKyAgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIE1WVDo6djJpNjQsCisgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QklUX0NPTlZFUlQsIGRsLCBNVlQ6OnYyaTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDApKSwKKyAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpCSVRfQ09OVkVSVCwgZGwsIE1WVDo6djJpNjQsIE1hc2spKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6RlhPUiwgZGwsIFZULCBPcC5nZXRPcGVyYW5kKDApLCBNYXNrKTsKKyAgfQorfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlckZDT1BZU0lHTihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBMTFZNQ29udGV4dCAqQ29udGV4dCA9IERBRy5nZXRDb250ZXh0KCk7CisgIFNEVmFsdWUgT3AwID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBPcDEgPSBPcC5nZXRPcGVyYW5kKDEpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBFVlQgU3JjVlQgPSBPcDEuZ2V0VmFsdWVUeXBlKCk7CisKKyAgLy8gSWYgc2Vjb25kIG9wZXJhbmQgaXMgc21hbGxlciwgZXh0ZW5kIGl0IGZpcnN0LgorICBpZiAoU3JjVlQuYml0c0xUKFZUKSkgeworICAgIE9wMSA9IERBRy5nZXROb2RlKElTRDo6RlBfRVhURU5ELCBkbCwgVlQsIE9wMSk7CisgICAgU3JjVlQgPSBWVDsKKyAgfQorICAvLyBBbmQgaWYgaXQgaXMgYmlnZ2VyLCBzaHJpbmsgaXQgZmlyc3QuCisgIGlmIChTcmNWVC5iaXRzR1QoVlQpKSB7CisgICAgT3AxID0gREFHLmdldE5vZGUoSVNEOjpGUF9ST1VORCwgZGwsIFZULCBPcDEsIERBRy5nZXRJbnRQdHJDb25zdGFudCgxKSk7CisgICAgU3JjVlQgPSBWVDsKKyAgfQorCisgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIG9wZXJhbmRzIGFuZCB0aGUgcmVzdWx0IHNob3VsZCBoYXZlIHRoZSBzYW1lCisgIC8vIHR5cGUsIGFuZCB0aGF0IHdvbid0IGJlIGY4MCBzaW5jZSB0aGF0IGlzIG5vdCBjdXN0b20gbG93ZXJlZC4KKworICAvLyBGaXJzdCBnZXQgdGhlIHNpZ24gYml0IG9mIHNlY29uZCBvcGVyYW5kLgorICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IENWOworICBpZiAoU3JjVlQgPT0gTVZUOjpmNjQpIHsKKyAgICBDVi5wdXNoX2JhY2soQ29uc3RhbnRGUDo6Z2V0KCpDb250ZXh0LCBBUEZsb2F0KEFQSW50KDY0LCAxVUxMIDw8IDYzKSkpKTsKKyAgICBDVi5wdXNoX2JhY2soQ29uc3RhbnRGUDo6Z2V0KCpDb250ZXh0LCBBUEZsb2F0KEFQSW50KDY0LCAwKSkpKTsKKyAgfSBlbHNlIHsKKyAgICBDVi5wdXNoX2JhY2soQ29uc3RhbnRGUDo6Z2V0KCpDb250ZXh0LCBBUEZsb2F0KEFQSW50KDMyLCAxVSA8PCAzMSkpKSk7CisgICAgQ1YucHVzaF9iYWNrKENvbnN0YW50RlA6OmdldCgqQ29udGV4dCwgQVBGbG9hdChBUEludCgzMiwgMCkpKSk7CisgICAgQ1YucHVzaF9iYWNrKENvbnN0YW50RlA6OmdldCgqQ29udGV4dCwgQVBGbG9hdChBUEludCgzMiwgMCkpKSk7CisgICAgQ1YucHVzaF9iYWNrKENvbnN0YW50RlA6OmdldCgqQ29udGV4dCwgQVBGbG9hdChBUEludCgzMiwgMCkpKSk7CisgIH0KKyAgQ29uc3RhbnQgKkMgPSBDb25zdGFudFZlY3Rvcjo6Z2V0KENWKTsKKyAgU0RWYWx1ZSBDUElkeCA9IERBRy5nZXRDb25zdGFudFBvb2woQywgZ2V0UG9pbnRlclR5KCksIDE2KTsKKyAgU0RWYWx1ZSBNYXNrMSA9IERBRy5nZXRMb2FkKFNyY1ZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBDUElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMTYpOworICBTRFZhbHVlIFNpZ25CaXQgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkZBTkQsIGRsLCBTcmNWVCwgT3AxLCBNYXNrMSk7CisKKyAgLy8gU2hpZnQgc2lnbiBiaXQgcmlnaHQgb3IgbGVmdCBpZiB0aGUgdHdvIG9wZXJhbmRzIGhhdmUgZGlmZmVyZW50IHR5cGVzLgorICBpZiAoU3JjVlQuYml0c0dUKFZUKSkgeworICAgIC8vIE9wMCBpcyBNVlQ6OmYzMiwgT3AxIGlzIE1WVDo6ZjY0LgorICAgIFNpZ25CaXQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNDQUxBUl9UT19WRUNUT1IsIGRsLCBNVlQ6OnYyZjY0LCBTaWduQml0KTsKKyAgICBTaWduQml0ID0gREFHLmdldE5vZGUoWDg2SVNEOjpGU1JMLCBkbCwgTVZUOjp2MmY2NCwgU2lnbkJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDMyLCBNVlQ6OmkzMikpOworICAgIFNpZ25CaXQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2NGYzMiwgU2lnbkJpdCk7CisgICAgU2lnbkJpdCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULCBkbCwgTVZUOjpmMzIsIFNpZ25CaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSk7CisgIH0KKworICAvLyBDbGVhciBmaXJzdCBvcGVyYW5kIHNpZ24gYml0LgorICBDVi5jbGVhcigpOworICBpZiAoVlQgPT0gTVZUOjpmNjQpIHsKKyAgICBDVi5wdXNoX2JhY2soQ29uc3RhbnRGUDo6Z2V0KCpDb250ZXh0LCBBUEZsb2F0KEFQSW50KDY0LCB+KDFVTEwgPDwgNjMpKSkpKTsKKyAgICBDVi5wdXNoX2JhY2soQ29uc3RhbnRGUDo6Z2V0KCpDb250ZXh0LCBBUEZsb2F0KEFQSW50KDY0LCAwKSkpKTsKKyAgfSBlbHNlIHsKKyAgICBDVi5wdXNoX2JhY2soQ29uc3RhbnRGUDo6Z2V0KCpDb250ZXh0LCBBUEZsb2F0KEFQSW50KDMyLCB+KDFVIDw8IDMxKSkpKSk7CisgICAgQ1YucHVzaF9iYWNrKENvbnN0YW50RlA6OmdldCgqQ29udGV4dCwgQVBGbG9hdChBUEludCgzMiwgMCkpKSk7CisgICAgQ1YucHVzaF9iYWNrKENvbnN0YW50RlA6OmdldCgqQ29udGV4dCwgQVBGbG9hdChBUEludCgzMiwgMCkpKSk7CisgICAgQ1YucHVzaF9iYWNrKENvbnN0YW50RlA6OmdldCgqQ29udGV4dCwgQVBGbG9hdChBUEludCgzMiwgMCkpKSk7CisgIH0KKyAgQyA9IENvbnN0YW50VmVjdG9yOjpnZXQoQ1YpOworICBDUElkeCA9IERBRy5nZXRDb25zdGFudFBvb2woQywgZ2V0UG9pbnRlclR5KCksIDE2KTsKKyAgU0RWYWx1ZSBNYXNrMiA9IERBRy5nZXRMb2FkKFZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBDUElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMTYpOworICBTRFZhbHVlIFZhbCA9IERBRy5nZXROb2RlKFg4NklTRDo6RkFORCwgZGwsIFZULCBPcDAsIE1hc2syKTsKKworICAvLyBPciB0aGUgdmFsdWUgd2l0aCB0aGUgc2lnbiBiaXQuCisgIHJldHVybiBEQUcuZ2V0Tm9kZShYODZJU0Q6OkZPUiwgZGwsIFZULCBWYWwsIFNpZ25CaXQpOworfQorCisvLy8gRW1pdCBub2RlcyB0aGF0IHdpbGwgYmUgc2VsZWN0ZWQgYXMgInRlc3QgT3AwLE9wMCIsIG9yIHNvbWV0aGluZworLy8vIGVxdWl2YWxlbnQuCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpFbWl0VGVzdChTRFZhbHVlIE9wLCB1bnNpZ25lZCBYODZDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICAvLyBDRiBhbmQgT0YgYXJlbid0IGFsd2F5cyBzZXQgdGhlIHdheSB3ZSB3YW50LiBEZXRlcm1pbmUgd2hpY2gKKyAgLy8gb2YgdGhlc2Ugd2UgbmVlZC4KKyAgYm9vbCBOZWVkQ0YgPSBmYWxzZTsKKyAgYm9vbCBOZWVkT0YgPSBmYWxzZTsKKyAgc3dpdGNoIChYODZDQykgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBYODY6OkNPTkRfQTogY2FzZSBYODY6OkNPTkRfQUU6CisgIGNhc2UgWDg2OjpDT05EX0I6IGNhc2UgWDg2OjpDT05EX0JFOgorICAgIE5lZWRDRiA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2OjpDT05EX0c6IGNhc2UgWDg2OjpDT05EX0dFOgorICBjYXNlIFg4Njo6Q09ORF9MOiBjYXNlIFg4Njo6Q09ORF9MRToKKyAgY2FzZSBYODY6OkNPTkRfTzogY2FzZSBYODY6OkNPTkRfTk86CisgICAgTmVlZE9GID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorCisgIC8vIFNlZSBpZiB3ZSBjYW4gdXNlIHRoZSBFRkxBR1MgdmFsdWUgZnJvbSB0aGUgb3BlcmFuZCBpbnN0ZWFkIG9mCisgIC8vIGRvaW5nIGEgc2VwYXJhdGUgVEVTVC4gVEVTVCBhbHdheXMgc2V0cyBPRiBhbmQgQ0YgdG8gMCwgc28gdW5sZXNzCisgIC8vIHdlIHByb3ZlIHRoYXQgdGhlIGFyaXRobWV0aWMgd29uJ3Qgb3ZlcmZsb3csIHdlIGNhbid0IHVzZSBPRiBvciBDRi4KKyAgaWYgKE9wLmdldFJlc05vKCkgIT0gMCB8fCBOZWVkT0YgfHwgTmVlZENGKQorICAgIC8vIEVtaXQgYSBDTVAgd2l0aCAwLCB3aGljaCBpcyB0aGUgVEVTVCBwYXR0ZXJuLgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShYODZJU0Q6OkNNUCwgZGwsIE1WVDo6aTMyLCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIE9wLmdldFZhbHVlVHlwZSgpKSk7CisKKyAgdW5zaWduZWQgT3Bjb2RlID0gMDsKKyAgdW5zaWduZWQgTnVtT3BlcmFuZHMgPSAwOworICBzd2l0Y2ggKE9wLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBJU0Q6OkFERDoKKyAgICAvLyBEdWUgdG8gYW4gaXNlbCBzaG9ydGNvbWluZywgYmUgY29uc2VydmF0aXZlIGlmIHRoaXMgYWRkIGlzIGxpa2VseSB0byBiZQorICAgIC8vIHNlbGVjdGVkIGFzIHBhcnQgb2YgYSBsb2FkLW1vZGlmeS1zdG9yZSBpbnN0cnVjdGlvbi4gV2hlbiB0aGUgcm9vdCBub2RlCisgICAgLy8gaW4gYSBtYXRjaCBpcyBhIHN0b3JlLCBpc2VsIGRvZXNuJ3Qga25vdyBob3cgdG8gcmVtYXAgbm9uLWNoYWluIG5vbi1mbGFnCisgICAgLy8gdXNlcyBvZiBvdGhlciBub2RlcyBpbiB0aGUgbWF0Y2gsIHN1Y2ggYXMgdGhlIEFERCBpbiB0aGlzIGNhc2UuIFRoaXMKKyAgICAvLyBsZWFkcyB0byB0aGUgQUREIGJlaW5nIGxlZnQgYXJvdW5kIGFuZCByZXNlbGVjdGVkLCB3aXRoIHRoZSByZXN1bHQgYmVpbmcKKyAgICAvLyB0d28gYWRkcyBpbiB0aGUgb3V0cHV0LiAgQWxhcywgZXZlbiBpZiBub25lIG91ciB1c2VycyBhcmUgc3RvcmVzLCB0aGF0CisgICAgLy8gZG9lc24ndCBwcm92ZSB3ZSdyZSBPLksuICBFcmdvLCBpZiB3ZSBoYXZlIGFueSBwYXJlbnRzIHRoYXQgYXJlbid0CisgICAgLy8gQ29weVRvUmVnIG9yIFNFVENDLCBlc2NoZXcgSU5DL0RFQy4gIEEgYmV0dGVyIGZpeCBzZWVtcyB0byByZXF1aXJlCisgICAgLy8gY2xpbWJpbmcgdGhlIERBRyBiYWNrIHRvIHRoZSByb290LCBhbmQgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHdvcnRoIHRoZQorICAgIC8vIGVmZm9ydC4KKyAgICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIFVJID0gT3AuZ2V0Tm9kZSgpLT51c2VfYmVnaW4oKSwKKyAgICAgICAgICAgVUUgPSBPcC5nZXROb2RlKCktPnVzZV9lbmQoKTsgVUkgIT0gVUU7ICsrVUkpCisgICAgICBpZiAoVUktPmdldE9wY29kZSgpICE9IElTRDo6Q29weVRvUmVnICYmIFVJLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNFVENDKQorICAgICAgICBnb3RvIGRlZmF1bHRfY2FzZTsKKworICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9CisgICAgICAgIGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXROb2RlKCktPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAvLyBBbiBhZGQgb2Ygb25lIHdpbGwgYmUgc2VsZWN0ZWQgYXMgYW4gSU5DLgorICAgICAgaWYgKEMtPmdldEFQSW50VmFsdWUoKSA9PSAxKSB7CisgICAgICAgIE9wY29kZSA9IFg4NklTRDo6SU5DOworICAgICAgICBOdW1PcGVyYW5kcyA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBBbiBhZGQgb2YgbmVnYXRpdmUgb25lIChzdWJ0cmFjdCBvZiBvbmUpIHdpbGwgYmUgc2VsZWN0ZWQgYXMgYSBERUMuCisgICAgICBpZiAoQy0+Z2V0QVBJbnRWYWx1ZSgpLmlzQWxsT25lc1ZhbHVlKCkpIHsKKyAgICAgICAgT3Bjb2RlID0gWDg2SVNEOjpERUM7CisgICAgICAgIE51bU9wZXJhbmRzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlIHVzZSBhIHJlZ3VsYXIgRUZMQUdTLXNldHRpbmcgYWRkLgorICAgIE9wY29kZSA9IFg4NklTRDo6QUREOworICAgIE51bU9wZXJhbmRzID0gMjsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OkFORDogeworICAgIC8vIElmIHRoZSBwcmltYXJ5IGFuZCByZXN1bHQgaXNuJ3QgdXNlZCwgZG9uJ3QgYm90aGVyIHVzaW5nIFg4NklTRDo6QU5ELAorICAgIC8vIGJlY2F1c2UgYSBURVNUIGluc3RydWN0aW9uIHdpbGwgYmUgYmV0dGVyLgorICAgIGJvb2wgTm9uRmxhZ1VzZSA9IGZhbHNlOworICAgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBPcC5nZXROb2RlKCktPnVzZV9iZWdpbigpLAorICAgICAgICAgICBVRSA9IE9wLmdldE5vZGUoKS0+dXNlX2VuZCgpOyBVSSAhPSBVRTsgKytVSSkgeworICAgICAgU0ROb2RlICpVc2VyID0gKlVJOworICAgICAgdW5zaWduZWQgVU9wTm8gPSBVSS5nZXRPcGVyYW5kTm8oKTsKKyAgICAgIGlmIChVc2VyLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFICYmIFVzZXItPmhhc09uZVVzZSgpKSB7CisgICAgICAgIC8vIExvb2sgcGFzcyB0cnVuY2F0ZS4KKyAgICAgICAgVU9wTm8gPSBVc2VyLT51c2VfYmVnaW4oKS5nZXRPcGVyYW5kTm8oKTsKKyAgICAgICAgVXNlciA9ICpVc2VyLT51c2VfYmVnaW4oKTsKKyAgICAgIH0KKworICAgICAgaWYgKFVzZXItPmdldE9wY29kZSgpICE9IElTRDo6QlJDT05EICYmCisgICAgICAgICAgVXNlci0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpTRVRDQyAmJgorICAgICAgICAgIChVc2VyLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNFTEVDVCB8fCBVT3BObyAhPSAwKSkgeworICAgICAgICBOb25GbGFnVXNlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFOb25GbGFnVXNlKQorICAgICAgYnJlYWs7CisgIH0KKyAgICAvLyBGQUxMIFRIUk9VR0gKKyAgY2FzZSBJU0Q6OlNVQjoKKyAgY2FzZSBJU0Q6Ok9SOgorICBjYXNlIElTRDo6WE9SOgorICAgIC8vIER1ZSB0byB0aGUgSVNFTCBzaG9ydGNvbWluZyBub3RlZCBhYm92ZSwgYmUgY29uc2VydmF0aXZlIGlmIHRoaXMgb3AgaXMKKyAgICAvLyBsaWtlbHkgdG8gYmUgc2VsZWN0ZWQgYXMgcGFydCBvZiBhIGxvYWQtbW9kaWZ5LXN0b3JlIGluc3RydWN0aW9uLgorICAgIGZvciAoU0ROb2RlOjp1c2VfaXRlcmF0b3IgVUkgPSBPcC5nZXROb2RlKCktPnVzZV9iZWdpbigpLAorICAgICAgICAgICBVRSA9IE9wLmdldE5vZGUoKS0+dXNlX2VuZCgpOyBVSSAhPSBVRTsgKytVSSkKKyAgICAgIGlmIChVSS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTVE9SRSkKKyAgICAgICAgZ290byBkZWZhdWx0X2Nhc2U7CisKKyAgICAvLyBPdGhlcndpc2UgdXNlIGEgcmVndWxhciBFRkxBR1Mtc2V0dGluZyBpbnN0cnVjdGlvbi4KKyAgICBzd2l0Y2ggKE9wLmdldE5vZGUoKS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJ1bmV4cGVjdGVkIG9wZXJhdG9yISIpOworICAgIGNhc2UgSVNEOjpTVUI6IE9wY29kZSA9IFg4NklTRDo6U1VCOyBicmVhazsKKyAgICBjYXNlIElTRDo6T1I6ICBPcGNvZGUgPSBYODZJU0Q6Ok9SOyAgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlhPUjogT3Bjb2RlID0gWDg2SVNEOjpYT1I7IGJyZWFrOworICAgIGNhc2UgSVNEOjpBTkQ6IE9wY29kZSA9IFg4NklTRDo6QU5EOyBicmVhazsKKyAgICB9CisKKyAgICBOdW1PcGVyYW5kcyA9IDI7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SVNEOjpBREQ6CisgIGNhc2UgWDg2SVNEOjpTVUI6CisgIGNhc2UgWDg2SVNEOjpJTkM6CisgIGNhc2UgWDg2SVNEOjpERUM6CisgIGNhc2UgWDg2SVNEOjpPUjoKKyAgY2FzZSBYODZJU0Q6OlhPUjoKKyAgY2FzZSBYODZJU0Q6OkFORDoKKyAgICByZXR1cm4gU0RWYWx1ZShPcC5nZXROb2RlKCksIDEpOworICBkZWZhdWx0OgorICBkZWZhdWx0X2Nhc2U6CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoT3Bjb2RlID09IDApCisgICAgLy8gRW1pdCBhIENNUCB3aXRoIDAsIHdoaWNoIGlzIHRoZSBURVNUIHBhdHRlcm4uCisgICAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6Q01QLCBkbCwgTVZUOjppMzIsIE9wLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgT3AuZ2V0VmFsdWVUeXBlKCkpKTsKKworICBTRFZUTGlzdCBWVHMgPSBEQUcuZ2V0VlRMaXN0KE9wLmdldFZhbHVlVHlwZSgpLCBNVlQ6OmkzMik7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDQ+IE9wczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcGVyYW5kczsgKytpKQorICAgIE9wcy5wdXNoX2JhY2soT3AuZ2V0T3BlcmFuZChpKSk7CisKKyAgU0RWYWx1ZSBOZXcgPSBEQUcuZ2V0Tm9kZShPcGNvZGUsIGRsLCBWVHMsICZPcHNbMF0sIE51bU9wZXJhbmRzKTsKKyAgREFHLlJlcGxhY2VBbGxVc2VzV2l0aChPcCwgTmV3KTsKKyAgcmV0dXJuIFNEVmFsdWUoTmV3LmdldE5vZGUoKSwgMSk7Cit9CisKKy8vLyBFbWl0IG5vZGVzIHRoYXQgd2lsbCBiZSBzZWxlY3RlZCBhcyAiY21wIE9wMCxPcDEiLCBvciBzb21ldGhpbmcKKy8vLyBlcXVpdmFsZW50LgorU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6RW1pdENtcChTRFZhbHVlIE9wMCwgU0RWYWx1ZSBPcDEsIHVuc2lnbmVkIFg4NkNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3AxKSkKKyAgICBpZiAoQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDApCisgICAgICByZXR1cm4gRW1pdFRlc3QoT3AwLCBYODZDQywgREFHKTsKKworICBEZWJ1Z0xvYyBkbCA9IE9wMC5nZXREZWJ1Z0xvYygpOworICByZXR1cm4gREFHLmdldE5vZGUoWDg2SVNEOjpDTVAsIGRsLCBNVlQ6OmkzMiwgT3AwLCBPcDEpOworfQorCisvLy8gTG93ZXJUb0JUIC0gUmVzdWx0IG9mICdhbmQnIGlzIGNvbXBhcmVkIGFnYWluc3QgemVyby4gVHVybiBpdCBpbnRvIGEgQlQgbm9kZQorLy8vIGlmIGl0J3MgcG9zc2libGUuCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlclRvQlQoU0RWYWx1ZSBBbmQsIElTRDo6Q29uZENvZGUgQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgT3AwID0gQW5kLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgT3AxID0gQW5kLmdldE9wZXJhbmQoMSk7CisgIGlmIChPcDAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUUlVOQ0FURSkKKyAgICBPcDAgPSBPcDAuZ2V0T3BlcmFuZCgwKTsKKyAgaWYgKE9wMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFKQorICAgIE9wMSA9IE9wMS5nZXRPcGVyYW5kKDApOworCisgIFNEVmFsdWUgTEhTLCBSSFM7CisgIGlmIChPcDEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSEwpCisgICAgc3RkOjpzd2FwKE9wMCwgT3AxKTsKKyAgaWYgKE9wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCkgeworICAgIGlmIChDb25zdGFudFNETm9kZSAqQW5kMDBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wMC5nZXRPcGVyYW5kKDApKSkKKyAgICAgIGlmIChBbmQwMEMtPmdldFpFeHRWYWx1ZSgpID09IDEpIHsKKyAgICAgICAgLy8gSWYgd2UgbG9va2VkIHBhc3QgYSB0cnVuY2F0ZSwgY2hlY2sgdGhhdCBpdCdzIG9ubHkgdHJ1bmNhdGluZyBhd2F5CisgICAgICAgIC8vIGtub3duIHplcm9zLgorICAgICAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IE9wMC5nZXRWYWx1ZVNpemVJbkJpdHMoKTsKKyAgICAgICAgdW5zaWduZWQgQW5kQml0V2lkdGggPSBBbmQuZ2V0VmFsdWVTaXplSW5CaXRzKCk7CisgICAgICAgIGlmIChCaXRXaWR0aCA+IEFuZEJpdFdpZHRoKSB7CisgICAgICAgICAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpLCBaZXJvcywgT25lczsKKyAgICAgICAgICBEQUcuQ29tcHV0ZU1hc2tlZEJpdHMoT3AwLCBNYXNrLCBaZXJvcywgT25lcyk7CisgICAgICAgICAgaWYgKFplcm9zLmNvdW50TGVhZGluZ09uZXMoKSA8IEJpdFdpZHRoIC0gQW5kQml0V2lkdGgpCisgICAgICAgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIExIUyA9IE9wMTsKKyAgICAgICAgUkhTID0gT3AwLmdldE9wZXJhbmQoMSk7CisgICAgICB9CisgIH0gZWxzZSBpZiAoT3AxLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQpIHsKKyAgICBDb25zdGFudFNETm9kZSAqQW5kUkhTID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3AxKTsKKyAgICBTRFZhbHVlIEFuZExIUyA9IE9wMDsKKyAgICBpZiAoQW5kUkhTLT5nZXRaRXh0VmFsdWUoKSA9PSAxICYmIEFuZExIUy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSTCkgeworICAgICAgTEhTID0gQW5kTEhTLmdldE9wZXJhbmQoMCk7CisgICAgICBSSFMgPSBBbmRMSFMuZ2V0T3BlcmFuZCgxKTsKKyAgICB9CisgIH0KKworICBpZiAoTEhTLmdldE5vZGUoKSkgeworICAgIC8vIElmIExIUyBpcyBpOCwgcHJvbW90ZSBpdCB0byBpMzIgd2l0aCBhbnlfZXh0ZW5kLiAgVGhlcmUgaXMgbm8gaTggQlQKKyAgICAvLyBpbnN0cnVjdGlvbi4gIFNpbmNlIHRoZSBzaGlmdCBhbW91bnQgaXMgaW4tcmFuZ2Utb3ItdW5kZWZpbmVkLCB3ZSBrbm93CisgICAgLy8gdGhhdCBkb2luZyBhIGJpdHRlc3Qgb24gdGhlIGkzMiB2YWx1ZSBpcyBvay4gIFdlIGV4dGVuZCB0byBpMzIgYmVjYXVzZQorICAgIC8vIHRoZSBlbmNvZGluZyBmb3IgdGhlIGkxNiB2ZXJzaW9uIGlzIGxhcmdlciB0aGFuIHRoZSBpMzIgdmVyc2lvbi4KKyAgICAvLyBBbHNvIHByb21vdGUgaTE2IHRvIGkzMiBmb3IgcGVyZm9ybWFuY2UgLyBjb2RlIHNpemUgcmVhc29uLgorICAgIGlmIChMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppOCB8fAorICAgICAgICBMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMTYpCisgICAgICBMSFMgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFOWV9FWFRFTkQsIGRsLCBNVlQ6OmkzMiwgTEhTKTsKKworICAgIC8vIElmIHRoZSBvcGVyYW5kIHR5cGVzIGRpc2FncmVlLCBleHRlbmQgdGhlIHNoaWZ0IGFtb3VudCB0byBtYXRjaC4gIFNpbmNlCisgICAgLy8gQlQgaWdub3JlcyBoaWdoIGJpdHMgKGxpa2Ugc2hpZnRzKSB3ZSBjYW4gdXNlIGFueWV4dGVuZC4KKyAgICBpZiAoTEhTLmdldFZhbHVlVHlwZSgpICE9IFJIUy5nZXRWYWx1ZVR5cGUoKSkKKyAgICAgIFJIUyA9IERBRy5nZXROb2RlKElTRDo6QU5ZX0VYVEVORCwgZGwsIExIUy5nZXRWYWx1ZVR5cGUoKSwgUkhTKTsKKworICAgIFNEVmFsdWUgQlQgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkJULCBkbCwgTVZUOjppMzIsIExIUywgUkhTKTsKKyAgICB1bnNpZ25lZCBDb25kID0gQ0MgPT0gSVNEOjpTRVRFUSA/IFg4Njo6Q09ORF9BRSA6IFg4Njo6Q09ORF9COworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShYODZJU0Q6OlNFVENDLCBkbCwgTVZUOjppOCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KENvbmQsIE1WVDo6aTgpLCBCVCk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlclNFVENDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIGFzc2VydChPcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6Omk4ICYmICJTZXRDQyB0eXBlIG11c3QgYmUgOC1iaXQgaW50ZWdlciIpOworICBTRFZhbHVlIE9wMCA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgT3AxID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCgyKSktPmdldCgpOworCisgIC8vIE9wdGltaXplIHRvIEJUIGlmIHBvc3NpYmxlLgorICAvLyBMb3dlciAoWCAmICgxIDw8IE4pKSA9PSAwIHRvIEJUKFgsIE4pLgorICAvLyBMb3dlciAoKFggPj51IE4pICYgMSkgIT0gMCB0byBCVChYLCBOKS4KKyAgLy8gTG93ZXIgKChYID4+cyBOKSAmIDEpICE9IDAgdG8gQlQoWCwgTikuCisgIGlmIChPcDAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBTkQgJiYKKyAgICAgIE9wMC5oYXNPbmVVc2UoKSAmJgorICAgICAgT3AxLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQgJiYKKyAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wMSktPmlzTnVsbFZhbHVlKCkgJiYKKyAgICAgIChDQyA9PSBJU0Q6OlNFVEVRIHx8IENDID09IElTRDo6U0VUTkUpKSB7CisgICAgU0RWYWx1ZSBOZXdTZXRDQyA9IExvd2VyVG9CVChPcDAsIENDLCBkbCwgREFHKTsKKyAgICBpZiAoTmV3U2V0Q0MuZ2V0Tm9kZSgpKQorICAgICAgcmV0dXJuIE5ld1NldENDOworICB9CisKKyAgLy8gTG9vayBmb3IgIihzZXRjYykgPT0gLyAhPSAxIiB0byBhdm9pZCB1bm5jZXNzYXJ5IHNldGNjLgorICBpZiAoT3AwLmdldE9wY29kZSgpID09IFg4NklTRDo6U0VUQ0MgJiYKKyAgICAgIE9wMS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50ICYmCisgICAgICAoY2FzdDxDb25zdGFudFNETm9kZT4oT3AxKS0+Z2V0WkV4dFZhbHVlKCkgPT0gMSB8fAorICAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wMSktPmlzTnVsbFZhbHVlKCkpICYmCisgICAgICAoQ0MgPT0gSVNEOjpTRVRFUSB8fCBDQyA9PSBJU0Q6OlNFVE5FKSkgeworICAgIFg4Njo6Q29uZENvZGUgQ0NvZGUgPSAoWDg2OjpDb25kQ29kZSlPcDAuZ2V0Q29uc3RhbnRPcGVyYW5kVmFsKDApOworICAgIGJvb2wgSW52ZXJ0ID0gKENDID09IElTRDo6U0VUTkUpIF4KKyAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wMSktPmlzTnVsbFZhbHVlKCk7CisgICAgaWYgKEludmVydCkKKyAgICAgIENDb2RlID0gWDg2OjpHZXRPcHBvc2l0ZUJyYW5jaENvbmRpdGlvbihDQ29kZSk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6U0VUQ0MsIGRsLCBNVlQ6Omk4LAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQ0NvZGUsIE1WVDo6aTgpLCBPcDAuZ2V0T3BlcmFuZCgxKSk7CisgIH0KKworICBib29sIGlzRlAgPSBPcDEuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCk7CisgIHVuc2lnbmVkIFg4NkNDID0gVHJhbnNsYXRlWDg2Q0MoQ0MsIGlzRlAsIE9wMCwgT3AxLCBEQUcpOworICBpZiAoWDg2Q0MgPT0gWDg2OjpDT05EX0lOVkFMSUQpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBTRFZhbHVlIENvbmQgPSBFbWl0Q21wKE9wMCwgT3AxLCBYODZDQywgREFHKTsKKworICAvLyBVc2Ugc2JiIHgsIHggdG8gbWF0ZXJpYWxpemUgY2FycnkgYml0IGludG8gYSBHUFIuCisgIGlmIChYODZDQyA9PSBYODY6OkNPTkRfQikKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBNVlQ6Omk4LAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShYODZJU0Q6OlNFVENDX0NBUlJZLCBkbCwgTVZUOjppOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFg4NkNDLCBNVlQ6Omk4KSwgQ29uZCksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6Omk4KSk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6U0VUQ0MsIGRsLCBNVlQ6Omk4LAorICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFg4NkNDLCBNVlQ6Omk4KSwgQ29uZCk7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyVlNFVENDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIFNEVmFsdWUgQ29uZDsKKyAgU0RWYWx1ZSBPcDAgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIE9wMSA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgQ0MgPSBPcC5nZXRPcGVyYW5kKDIpOworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgSVNEOjpDb25kQ29kZSBTZXRDQ09wY29kZSA9IGNhc3Q8Q29uZENvZGVTRE5vZGU+KENDKS0+Z2V0KCk7CisgIGJvb2wgaXNGUCA9IE9wLmdldE9wZXJhbmQoMSkuZ2V0VmFsdWVUeXBlKCkuaXNGbG9hdGluZ1BvaW50KCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBpZiAoaXNGUCkgeworICAgIHVuc2lnbmVkIFNTRUNDID0gODsKKyAgICBFVlQgVlQwID0gT3AwLmdldFZhbHVlVHlwZSgpOworICAgIGFzc2VydChWVDAgPT0gTVZUOjp2NGYzMiB8fCBWVDAgPT0gTVZUOjp2MmY2NCk7CisgICAgdW5zaWduZWQgT3BjID0gVlQwID09IE1WVDo6djRmMzIgPyBYODZJU0Q6OkNNUFBTIDogWDg2SVNEOjpDTVBQRDsKKyAgICBib29sIFN3YXAgPSBmYWxzZTsKKworICAgIHN3aXRjaCAoU2V0Q0NPcGNvZGUpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUT0VROgorICAgIGNhc2UgSVNEOjpTRVRFUTogIFNTRUNDID0gMDsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVE9HVDoKKyAgICBjYXNlIElTRDo6U0VUR1Q6IFN3YXAgPSB0cnVlOyAvLyBGYWxsdGhyb3VnaAorICAgIGNhc2UgSVNEOjpTRVRMVDoKKyAgICBjYXNlIElTRDo6U0VUT0xUOiBTU0VDQyA9IDE7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRPR0U6CisgICAgY2FzZSBJU0Q6OlNFVEdFOiBTd2FwID0gdHJ1ZTsgLy8gRmFsbHRocm91Z2gKKyAgICBjYXNlIElTRDo6U0VUTEU6CisgICAgY2FzZSBJU0Q6OlNFVE9MRTogU1NFQ0MgPSAyOyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUVU86ICBTU0VDQyA9IDM7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRVTkU6CisgICAgY2FzZSBJU0Q6OlNFVE5FOiAgU1NFQ0MgPSA0OyBicmVhazsKKyAgICBjYXNlIElTRDo6U0VUVUxFOiBTd2FwID0gdHJ1ZTsKKyAgICBjYXNlIElTRDo6U0VUVUdFOiBTU0VDQyA9IDU7IGJyZWFrOworICAgIGNhc2UgSVNEOjpTRVRVTFQ6IFN3YXAgPSB0cnVlOworICAgIGNhc2UgSVNEOjpTRVRVR1Q6IFNTRUNDID0gNjsgYnJlYWs7CisgICAgY2FzZSBJU0Q6OlNFVE86ICAgU1NFQ0MgPSA3OyBicmVhazsKKyAgICB9CisgICAgaWYgKFN3YXApCisgICAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOworCisgICAgLy8gSW4gdGhlIHR3byBzcGVjaWFsIGNhc2VzIHdlIGNhbid0IGhhbmRsZSwgZW1pdCB0d28gY29tcGFyaXNvbnMuCisgICAgaWYgKFNTRUNDID09IDgpIHsKKyAgICAgIGlmIChTZXRDQ09wY29kZSA9PSBJU0Q6OlNFVFVFUSkgeworICAgICAgICBTRFZhbHVlIFVOT1JELCBFUTsKKyAgICAgICAgVU5PUkQgPSBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBWVCwgT3AwLCBPcDEsIERBRy5nZXRDb25zdGFudCgzLCBNVlQ6Omk4KSk7CisgICAgICAgIEVRID0gREFHLmdldE5vZGUoT3BjLCBkbCwgVlQsIE9wMCwgT3AxLCBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppOCkpOworICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIFZULCBVTk9SRCwgRVEpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoU2V0Q0NPcGNvZGUgPT0gSVNEOjpTRVRPTkUpIHsKKyAgICAgICAgU0RWYWx1ZSBPUkQsIE5FUTsKKyAgICAgICAgT1JEID0gREFHLmdldE5vZGUoT3BjLCBkbCwgVlQsIE9wMCwgT3AxLCBEQUcuZ2V0Q29uc3RhbnQoNywgTVZUOjppOCkpOworICAgICAgICBORVEgPSBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBWVCwgT3AwLCBPcDEsIERBRy5nZXRDb25zdGFudCg0LCBNVlQ6Omk4KSk7CisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIFZULCBPUkQsIE5FUSk7CisgICAgICB9CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIEZQIGNvbXBhcmlzb24iKTsKKyAgICB9CisgICAgLy8gSGFuZGxlIGFsbCBvdGhlciBGUCBjb21wYXJpc29ucyBoZXJlLgorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBWVCwgT3AwLCBPcDEsIERBRy5nZXRDb25zdGFudChTU0VDQywgTVZUOjppOCkpOworICB9CisKKyAgLy8gV2UgYXJlIGhhbmRsaW5nIG9uZSBvZiB0aGUgaW50ZWdlciBjb21wYXJpc29ucyBoZXJlLiAgU2luY2UgU1NFIG9ubHkgaGFzCisgIC8vIEdUIGFuZCBFUSBjb21wYXJpc29ucyBmb3IgaW50ZWdlciwgc3dhcHBpbmcgb3BlcmFuZHMgYW5kIG11bHRpcGxlCisgIC8vIG9wZXJhdGlvbnMgbWF5IGJlIHJlcXVpcmVkIGZvciBzb21lIGNvbXBhcmlzb25zLgorICB1bnNpZ25lZCBPcGMgPSAwLCBFUU9wYyA9IDAsIEdUT3BjID0gMDsKKyAgYm9vbCBTd2FwID0gZmFsc2UsIEludmVydCA9IGZhbHNlLCBGbGlwU2lnbnMgPSBmYWxzZTsKKworICBzd2l0Y2ggKFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgTVZUOjp2OGk4OgorICBjYXNlIE1WVDo6djE2aTg6IEVRT3BjID0gWDg2SVNEOjpQQ01QRVFCOyBHVE9wYyA9IFg4NklTRDo6UENNUEdUQjsgYnJlYWs7CisgIGNhc2UgTVZUOjp2NGkxNjoKKyAgY2FzZSBNVlQ6OnY4aTE2OiBFUU9wYyA9IFg4NklTRDo6UENNUEVRVzsgR1RPcGMgPSBYODZJU0Q6OlBDTVBHVFc7IGJyZWFrOworICBjYXNlIE1WVDo6djJpMzI6CisgIGNhc2UgTVZUOjp2NGkzMjogRVFPcGMgPSBYODZJU0Q6OlBDTVBFUUQ7IEdUT3BjID0gWDg2SVNEOjpQQ01QR1REOyBicmVhazsKKyAgY2FzZSBNVlQ6OnYyaTY0OiBFUU9wYyA9IFg4NklTRDo6UENNUEVRUTsgR1RPcGMgPSBYODZJU0Q6OlBDTVBHVFE7IGJyZWFrOworICB9CisKKyAgc3dpdGNoIChTZXRDQ09wY29kZSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBJU0Q6OlNFVE5FOiAgSW52ZXJ0ID0gdHJ1ZTsKKyAgY2FzZSBJU0Q6OlNFVEVROiAgT3BjID0gRVFPcGM7IGJyZWFrOworICBjYXNlIElTRDo6U0VUTFQ6ICBTd2FwID0gdHJ1ZTsKKyAgY2FzZSBJU0Q6OlNFVEdUOiAgT3BjID0gR1RPcGM7IGJyZWFrOworICBjYXNlIElTRDo6U0VUR0U6ICBTd2FwID0gdHJ1ZTsKKyAgY2FzZSBJU0Q6OlNFVExFOiAgT3BjID0gR1RPcGM7IEludmVydCA9IHRydWU7IGJyZWFrOworICBjYXNlIElTRDo6U0VUVUxUOiBTd2FwID0gdHJ1ZTsKKyAgY2FzZSBJU0Q6OlNFVFVHVDogT3BjID0gR1RPcGM7IEZsaXBTaWducyA9IHRydWU7IGJyZWFrOworICBjYXNlIElTRDo6U0VUVUdFOiBTd2FwID0gdHJ1ZTsKKyAgY2FzZSBJU0Q6OlNFVFVMRTogT3BjID0gR1RPcGM7IEZsaXBTaWducyA9IHRydWU7IEludmVydCA9IHRydWU7IGJyZWFrOworICB9CisgIGlmIChTd2FwKQorICAgIHN0ZDo6c3dhcChPcDAsIE9wMSk7CisKKyAgLy8gU2luY2UgU1NFIGhhcyBubyB1bnNpZ25lZCBpbnRlZ2VyIGNvbXBhcmlzb25zLCB3ZSBuZWVkIHRvIGZsaXAgIHRoZSBzaWduCisgIC8vIGJpdHMgb2YgdGhlIGlucHV0cyBiZWZvcmUgcGVyZm9ybWluZyB0aG9zZSBvcGVyYXRpb25zLgorICBpZiAoRmxpcFNpZ25zKSB7CisgICAgRVZUIEVsdFZUID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICBTRFZhbHVlIFNpZ25CaXQgPSBEQUcuZ2V0Q29uc3RhbnQoQVBJbnQ6OmdldFNpZ25CaXQoRWx0VlQuZ2V0U2l6ZUluQml0cygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWx0VlQpOworICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+IFNpZ25CaXRzKFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCksIFNpZ25CaXQpOworICAgIFNEVmFsdWUgU2lnblZlYyA9IERBRy5nZXROb2RlKElTRDo6QlVJTERfVkVDVE9SLCBkbCwgVlQsICZTaWduQml0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25CaXRzLnNpemUoKSk7CisgICAgT3AwID0gREFHLmdldE5vZGUoSVNEOjpYT1IsIGRsLCBWVCwgT3AwLCBTaWduVmVjKTsKKyAgICBPcDEgPSBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgZGwsIFZULCBPcDEsIFNpZ25WZWMpOworICB9CisKKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBWVCwgT3AwLCBPcDEpOworCisgIC8vIElmIHRoZSBsb2dpY2FsLW5vdCBvZiB0aGUgcmVzdWx0IGlzIHJlcXVpcmVkLCBwZXJmb3JtIHRoYXQgbm93LgorICBpZiAoSW52ZXJ0KQorICAgIFJlc3VsdCA9IERBRy5nZXROT1QoZGwsIFJlc3VsdCwgVlQpOworCisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vIGlzWDg2TG9naWNhbENtcCAtIFJldHVybiB0cnVlIGlmIG9wY29kZSBpcyBhIFg4NiBsb2dpY2FsIGNvbXBhcmlzb24uCitzdGF0aWMgYm9vbCBpc1g4NkxvZ2ljYWxDbXAoU0RWYWx1ZSBPcCkgeworICB1bnNpZ25lZCBPcGMgPSBPcC5nZXROb2RlKCktPmdldE9wY29kZSgpOworICBpZiAoT3BjID09IFg4NklTRDo6Q01QIHx8IE9wYyA9PSBYODZJU0Q6OkNPTUkgfHwgT3BjID09IFg4NklTRDo6VUNPTUkpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChPcC5nZXRSZXNObygpID09IDEgJiYKKyAgICAgIChPcGMgPT0gWDg2SVNEOjpBREQgfHwKKyAgICAgICBPcGMgPT0gWDg2SVNEOjpTVUIgfHwKKyAgICAgICBPcGMgPT0gWDg2SVNEOjpTTVVMIHx8CisgICAgICAgT3BjID09IFg4NklTRDo6VU1VTCB8fAorICAgICAgIE9wYyA9PSBYODZJU0Q6OklOQyB8fAorICAgICAgIE9wYyA9PSBYODZJU0Q6OkRFQyB8fAorICAgICAgIE9wYyA9PSBYODZJU0Q6Ok9SIHx8CisgICAgICAgT3BjID09IFg4NklTRDo6WE9SIHx8CisgICAgICAgT3BjID09IFg4NklTRDo6QU5EKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyU0VMRUNUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIGJvb2wgYWRkVGVzdCA9IHRydWU7CisgIFNEVmFsdWUgQ29uZCAgPSBPcC5nZXRPcGVyYW5kKDApOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgQ0M7CisKKyAgaWYgKENvbmQuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQykgeworICAgIFNEVmFsdWUgTmV3Q29uZCA9IExvd2VyU0VUQ0MoQ29uZCwgREFHKTsKKyAgICBpZiAoTmV3Q29uZC5nZXROb2RlKCkpCisgICAgICBDb25kID0gTmV3Q29uZDsKKyAgfQorCisgIC8vIChzZWxlY3QgKHggPT0gMCksIC0xLCAwKSAtPiAoc2lnbl9iaXQgKHggLSAxKSkKKyAgU0RWYWx1ZSBPcDEgPSBPcC5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIE9wMiA9IE9wLmdldE9wZXJhbmQoMik7CisgIGlmIChDb25kLmdldE9wY29kZSgpID09IFg4NklTRDo6U0VUQ0MgJiYKKyAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KENvbmQuZ2V0T3BlcmFuZCgwKSktPmdldFpFeHRWYWx1ZSgpID09IFg4Njo6Q09ORF9FKSB7CisgICAgU0RWYWx1ZSBDbXAgPSBDb25kLmdldE9wZXJhbmQoMSk7CisgICAgaWYgKENtcC5nZXRPcGNvZGUoKSA9PSBYODZJU0Q6OkNNUCkgeworICAgICAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcDEpOworICAgICAgQ29uc3RhbnRTRE5vZGUgKk4yQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcDIpOworICAgICAgQ29uc3RhbnRTRE5vZGUgKlJIU0MgPQorICAgICAgICBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oQ21wLmdldE9wZXJhbmQoMSkuZ2V0Tm9kZSgpKTsKKyAgICAgIGlmIChOMUMgJiYgTjFDLT5pc0FsbE9uZXNWYWx1ZSgpICYmCisgICAgICAgICAgTjJDICYmIE4yQy0+aXNOdWxsVmFsdWUoKSAmJgorICAgICAgICAgIFJIU0MgJiYgUkhTQy0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICBTRFZhbHVlIENtcE9wMCA9IENtcC5nZXRPcGVyYW5kKDApOworICAgICAgICBDbXAgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkNNUCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPcDAsIERBRy5nZXRDb25zdGFudCgxLCBDbXBPcDAuZ2V0VmFsdWVUeXBlKCkpKTsKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6U0VUQ0NfQ0FSUlksIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChYODY6OkNPTkRfQiwgTVZUOjppOCksIENtcCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gTG9vayBwYXNzIChhbmQgKHNldGNjX2NhcnJ5IChjbXAgLi4uKSksIDEpLgorICBpZiAoQ29uZC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCAmJgorICAgICAgQ29uZC5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IFg4NklTRDo6U0VUQ0NfQ0FSUlkpIHsKKyAgICBDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihDb25kLmdldE9wZXJhbmQoMSkpOworICAgIGlmIChDICYmIEMtPmdldEFQSW50VmFsdWUoKSA9PSAxKSAKKyAgICAgIENvbmQgPSBDb25kLmdldE9wZXJhbmQoMCk7CisgIH0KKworICAvLyBJZiBjb25kaXRpb24gZmxhZyBpcyBzZXQgYnkgYSBYODZJU0Q6OkNNUCwgdGhlbiB1c2UgaXQgYXMgdGhlIGNvbmRpdGlvbgorICAvLyBzZXR0aW5nIG9wZXJhbmQgaW4gcGxhY2Ugb2YgdGhlIFg4NklTRDo6U0VUQ0MuCisgIGlmIChDb25kLmdldE9wY29kZSgpID09IFg4NklTRDo6U0VUQ0MgfHwKKyAgICAgIENvbmQuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpTRVRDQ19DQVJSWSkgeworICAgIENDID0gQ29uZC5nZXRPcGVyYW5kKDApOworCisgICAgU0RWYWx1ZSBDbXAgPSBDb25kLmdldE9wZXJhbmQoMSk7CisgICAgdW5zaWduZWQgT3BjID0gQ21wLmdldE9wY29kZSgpOworICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworCisgICAgYm9vbCBJbGxlZ2FsRlBDTW92ID0gZmFsc2U7CisgICAgaWYgKFZULmlzRmxvYXRpbmdQb2ludCgpICYmICFWVC5pc1ZlY3RvcigpICYmCisgICAgICAgICFpc1NjYWxhckZQVHlwZUluU1NFUmVnKFZUKSkgIC8vIEZQU3RhY2s/CisgICAgICBJbGxlZ2FsRlBDTW92ID0gIWhhc0ZQQ01vdihjYXN0PENvbnN0YW50U0ROb2RlPihDQyktPmdldFNFeHRWYWx1ZSgpKTsKKworICAgIGlmICgoaXNYODZMb2dpY2FsQ21wKENtcCkgJiYgIUlsbGVnYWxGUENNb3YpIHx8CisgICAgICAgIE9wYyA9PSBYODZJU0Q6OkJUKSB7IC8vIEZJWE1FCisgICAgICBDb25kID0gQ21wOworICAgICAgYWRkVGVzdCA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIGlmIChhZGRUZXN0KSB7CisgICAgLy8gTG9vayBwYXNzIHRoZSB0cnVuY2F0ZS4KKyAgICBpZiAoQ29uZC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFKQorICAgICAgQ29uZCA9IENvbmQuZ2V0T3BlcmFuZCgwKTsKKworICAgIC8vIFdlIGtub3cgdGhlIHJlc3VsdCBvZiBBTkQgaXMgY29tcGFyZWQgYWdhaW5zdCB6ZXJvLiBUcnkgdG8gbWF0Y2gKKyAgICAvLyBpdCB0byBCVC4KKyAgICBpZiAoQ29uZC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCAmJiBDb25kLmhhc09uZVVzZSgpKSB7IAorICAgICAgU0RWYWx1ZSBOZXdTZXRDQyA9IExvd2VyVG9CVChDb25kLCBJU0Q6OlNFVE5FLCBkbCwgREFHKTsKKyAgICAgIGlmIChOZXdTZXRDQy5nZXROb2RlKCkpIHsKKyAgICAgICAgQ0MgPSBOZXdTZXRDQy5nZXRPcGVyYW5kKDApOworICAgICAgICBDb25kID0gTmV3U2V0Q0MuZ2V0T3BlcmFuZCgxKTsKKyAgICAgICAgYWRkVGVzdCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChhZGRUZXN0KSB7CisgICAgQ0MgPSBEQUcuZ2V0Q29uc3RhbnQoWDg2OjpDT05EX05FLCBNVlQ6Omk4KTsKKyAgICBDb25kID0gRW1pdFRlc3QoQ29uZCwgWDg2OjpDT05EX05FLCBEQUcpOworICB9CisKKyAgLy8gWDg2SVNEOjpDTU9WIG1lYW5zIHNldCB0aGUgcmVzdWx0ICh3aGljaCBpcyBvcGVyYW5kIDEpIHRvIHRoZSBSSFMgaWYKKyAgLy8gY29uZGl0aW9uIGlzIHRydWUuCisgIFNEVlRMaXN0IFZUcyA9IERBRy5nZXRWVExpc3QoT3AuZ2V0VmFsdWVUeXBlKCksIE1WVDo6RmxhZyk7CisgIFNEVmFsdWUgT3BzW10gPSB7IE9wMiwgT3AxLCBDQywgQ29uZCB9OworICByZXR1cm4gREFHLmdldE5vZGUoWDg2SVNEOjpDTU9WLCBkbCwgVlRzLCBPcHMsIGFycmF5X2xlbmd0aG9mKE9wcykpOworfQorCisvLyBpc0FuZE9yT2ZTaW5nbGVVc2VTZXRDQ3MgLSBSZXR1cm4gdHJ1ZSBpZiBub2RlIGlzIGFuIElTRDo6QU5EIG9yCisvLyBJU0Q6Ok9SIG9mIHR3byBYODZJU0Q6OlNFVENDIG5vZGVzIGVhY2ggb2Ygd2hpY2ggaGFzIG5vIG90aGVyIHVzZSBhcGFydAorLy8gZnJvbSB0aGUgQU5EIC8gT1IuCitzdGF0aWMgYm9vbCBpc0FuZE9yT2ZTZXRDQ3MoU0RWYWx1ZSBPcCwgdW5zaWduZWQgJk9wYykgeworICBPcGMgPSBPcC5nZXRPcGNvZGUoKTsKKyAgaWYgKE9wYyAhPSBJU0Q6Ok9SICYmIE9wYyAhPSBJU0Q6OkFORCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiAoT3AuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBYODZJU0Q6OlNFVENDICYmCisgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgwKS5oYXNPbmVVc2UoKSAmJgorICAgICAgICAgIE9wLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpTRVRDQyAmJgorICAgICAgICAgIE9wLmdldE9wZXJhbmQoMSkuaGFzT25lVXNlKCkpOworfQorCisvLyBpc1hvcjFPZlNldENDIC0gUmV0dXJuIHRydWUgaWYgbm9kZSBpcyBhbiBJU0Q6OlhPUiBvZiBhIFg4NklTRDo6U0VUQ0MgYW5kCisvLyAxIGFuZCB0aGF0IHRoZSBTRVRDQyBub2RlIGhhcyBhIHNpbmdsZSB1c2UuCitzdGF0aWMgYm9vbCBpc1hvcjFPZlNldENDKFNEVmFsdWUgT3ApIHsKKyAgaWYgKE9wLmdldE9wY29kZSgpICE9IElTRDo6WE9SKQorICAgIHJldHVybiBmYWxzZTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKTsKKyAgaWYgKE4xQyAmJiBOMUMtPmdldEFQSW50VmFsdWUoKSA9PSAxKSB7CisgICAgcmV0dXJuIE9wLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpTRVRDQyAmJgorICAgICAgT3AuZ2V0T3BlcmFuZCgwKS5oYXNPbmVVc2UoKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyQlJDT05EKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIGJvb2wgYWRkVGVzdCA9IHRydWU7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIENvbmQgID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBEZXN0ICA9IE9wLmdldE9wZXJhbmQoMik7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBDQzsKKworICBpZiAoQ29uZC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNFVENDKSB7CisgICAgU0RWYWx1ZSBOZXdDb25kID0gTG93ZXJTRVRDQyhDb25kLCBEQUcpOworICAgIGlmIChOZXdDb25kLmdldE5vZGUoKSkKKyAgICAgIENvbmQgPSBOZXdDb25kOworICB9CisjaWYgMAorICAvLyBGSVhNRTogTG93ZXJYQUxVTyBkb2Vzbid0IGhhbmRsZSB0aGVzZSEhCisgIGVsc2UgaWYgKENvbmQuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpBREQgIHx8CisgICAgICAgICAgIENvbmQuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpTVUIgIHx8CisgICAgICAgICAgIENvbmQuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpTTVVMIHx8CisgICAgICAgICAgIENvbmQuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpVTVVMKQorICAgIENvbmQgPSBMb3dlclhBTFVPKENvbmQsIERBRyk7CisjZW5kaWYKKworICAvLyBMb29rIHBhc3MgKGFuZCAoc2V0Y2NfY2FycnkgKGNtcCAuLi4pKSwgMSkuCisgIGlmIChDb25kLmdldE9wY29kZSgpID09IElTRDo6QU5EICYmCisgICAgICBDb25kLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpTRVRDQ19DQVJSWSkgeworICAgIENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KENvbmQuZ2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKEMgJiYgQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDEpIAorICAgICAgQ29uZCA9IENvbmQuZ2V0T3BlcmFuZCgwKTsKKyAgfQorCisgIC8vIElmIGNvbmRpdGlvbiBmbGFnIGlzIHNldCBieSBhIFg4NklTRDo6Q01QLCB0aGVuIHVzZSBpdCBhcyB0aGUgY29uZGl0aW9uCisgIC8vIHNldHRpbmcgb3BlcmFuZCBpbiBwbGFjZSBvZiB0aGUgWDg2SVNEOjpTRVRDQy4KKyAgaWYgKENvbmQuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpTRVRDQyB8fAorICAgICAgQ29uZC5nZXRPcGNvZGUoKSA9PSBYODZJU0Q6OlNFVENDX0NBUlJZKSB7CisgICAgQ0MgPSBDb25kLmdldE9wZXJhbmQoMCk7CisKKyAgICBTRFZhbHVlIENtcCA9IENvbmQuZ2V0T3BlcmFuZCgxKTsKKyAgICB1bnNpZ25lZCBPcGMgPSBDbXAuZ2V0T3Bjb2RlKCk7CisgICAgLy8gRklYTUU6IFdIWSBUSEUgU1BFQ0lBTCBDQVNJTkcgT0YgTG9naWNhbENtcD8/CisgICAgaWYgKGlzWDg2TG9naWNhbENtcChDbXApIHx8IE9wYyA9PSBYODZJU0Q6OkJUKSB7CisgICAgICBDb25kID0gQ21wOworICAgICAgYWRkVGVzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKGNhc3Q8Q29uc3RhbnRTRE5vZGU+KENDKS0+Z2V0WkV4dFZhbHVlKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBYODY6OkNPTkRfTzoKKyAgICAgIGNhc2UgWDg2OjpDT05EX0I6CisgICAgICAgIC8vIFRoZXNlIGNhbiBvbmx5IGNvbWUgZnJvbSBhbiBhcml0aG1ldGljIGluc3RydWN0aW9uIHdpdGggb3ZlcmZsb3csCisgICAgICAgIC8vIGUuZy4gU0FERE8sIFVBRERPLgorICAgICAgICBDb25kID0gQ29uZC5nZXROb2RlKCktPmdldE9wZXJhbmQoMSk7CisgICAgICAgIGFkZFRlc3QgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHVuc2lnbmVkIENvbmRPcGM7CisgICAgaWYgKENvbmQuaGFzT25lVXNlKCkgJiYgaXNBbmRPck9mU2V0Q0NzKENvbmQsIENvbmRPcGMpKSB7CisgICAgICBTRFZhbHVlIENtcCA9IENvbmQuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDEpOworICAgICAgaWYgKENvbmRPcGMgPT0gSVNEOjpPUikgeworICAgICAgICAvLyBBbHNvLCByZWNvZ25pemUgdGhlIHBhdHRlcm4gZ2VuZXJhdGVkIGJ5IGFuIEZDTVBfVU5FLiBXZSBjYW4gZW1pdAorICAgICAgICAvLyB0d28gYnJhbmNoZXMgaW5zdGVhZCBvZiBhbiBleHBsaWNpdCBPUiBpbnN0cnVjdGlvbiB3aXRoIGEKKyAgICAgICAgLy8gc2VwYXJhdGUgdGVzdC4KKyAgICAgICAgaWYgKENtcCA9PSBDb25kLmdldE9wZXJhbmQoMSkuZ2V0T3BlcmFuZCgxKSAmJgorICAgICAgICAgICAgaXNYODZMb2dpY2FsQ21wKENtcCkpIHsKKyAgICAgICAgICBDQyA9IENvbmQuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDApOworICAgICAgICAgIENoYWluID0gREFHLmdldE5vZGUoWDg2SVNEOjpCUkNPTkQsIGRsLCBPcC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWluLCBEZXN0LCBDQywgQ21wKTsKKyAgICAgICAgICBDQyA9IENvbmQuZ2V0T3BlcmFuZCgxKS5nZXRPcGVyYW5kKDApOworICAgICAgICAgIENvbmQgPSBDbXA7CisgICAgICAgICAgYWRkVGVzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvLyBJU0Q6OkFORAorICAgICAgICAvLyBBbHNvLCByZWNvZ25pemUgdGhlIHBhdHRlcm4gZ2VuZXJhdGVkIGJ5IGFuIEZDTVBfT0VRLiBXZSBjYW4gZW1pdAorICAgICAgICAvLyB0d28gYnJhbmNoZXMgaW5zdGVhZCBvZiBhbiBleHBsaWNpdCBBTkQgaW5zdHJ1Y3Rpb24gd2l0aCBhCisgICAgICAgIC8vIHNlcGFyYXRlIHRlc3QuIEhvd2V2ZXIsIHdlIG9ubHkgZG8gdGhpcyBpZiB0aGlzIGJsb2NrIGRvZXNuJ3QKKyAgICAgICAgLy8gaGF2ZSBhIGZhbGwtdGhyb3VnaCBlZGdlLCBiZWNhdXNlIHRoaXMgcmVxdWlyZXMgYW4gZXhwbGljaXQKKyAgICAgICAgLy8gam1wIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4KKyAgICAgICAgaWYgKENtcCA9PSBDb25kLmdldE9wZXJhbmQoMSkuZ2V0T3BlcmFuZCgxKSAmJgorICAgICAgICAgICAgaXNYODZMb2dpY2FsQ21wKENtcCkgJiYKKyAgICAgICAgICAgIE9wLmdldE5vZGUoKS0+aGFzT25lVXNlKCkpIHsKKyAgICAgICAgICBYODY6OkNvbmRDb2RlIENDb2RlID0KKyAgICAgICAgICAgIChYODY6OkNvbmRDb2RlKUNvbmQuZ2V0T3BlcmFuZCgwKS5nZXRDb25zdGFudE9wZXJhbmRWYWwoMCk7CisgICAgICAgICAgQ0NvZGUgPSBYODY6OkdldE9wcG9zaXRlQnJhbmNoQ29uZGl0aW9uKENDb2RlKTsKKyAgICAgICAgICBDQyA9IERBRy5nZXRDb25zdGFudChDQ29kZSwgTVZUOjppOCk7CisgICAgICAgICAgU0ROb2RlICpVc2VyID0gKk9wLmdldE5vZGUoKS0+dXNlX2JlZ2luKCk7CisgICAgICAgICAgLy8gTG9vayBmb3IgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggZm9sbG93aW5nIHRoaXMgY29uZGl0aW9uYWwgYnJhbmNoLgorICAgICAgICAgIC8vIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHdlIG5lZWQgdG8gcmV2ZXJzZSB0aGUgc3VjY2Vzc29ycyBpbiBvcmRlcgorICAgICAgICAgIC8vIHRvIGltcGxlbWVudCBGQ01QX09FUS4KKyAgICAgICAgICBpZiAoVXNlci0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpCUikgeworICAgICAgICAgICAgU0RWYWx1ZSBGYWxzZUJCID0gVXNlci0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgICAgICAgIFNETm9kZSAqTmV3QlIgPQorICAgICAgICAgICAgICBEQUcuVXBkYXRlTm9kZU9wZXJhbmRzKFVzZXIsIFVzZXItPmdldE9wZXJhbmQoMCksIERlc3QpOworICAgICAgICAgICAgYXNzZXJ0KE5ld0JSID09IFVzZXIpOworICAgICAgICAgICAgKHZvaWQpTmV3QlI7CisgICAgICAgICAgICBEZXN0ID0gRmFsc2VCQjsKKworICAgICAgICAgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkJSQ09ORCwgZGwsIE9wLmdldFZhbHVlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbiwgRGVzdCwgQ0MsIENtcCk7CisgICAgICAgICAgICBYODY6OkNvbmRDb2RlIENDb2RlID0KKyAgICAgICAgICAgICAgKFg4Njo6Q29uZENvZGUpQ29uZC5nZXRPcGVyYW5kKDEpLmdldENvbnN0YW50T3BlcmFuZFZhbCgwKTsKKyAgICAgICAgICAgIENDb2RlID0gWDg2OjpHZXRPcHBvc2l0ZUJyYW5jaENvbmRpdGlvbihDQ29kZSk7CisgICAgICAgICAgICBDQyA9IERBRy5nZXRDb25zdGFudChDQ29kZSwgTVZUOjppOCk7CisgICAgICAgICAgICBDb25kID0gQ21wOworICAgICAgICAgICAgYWRkVGVzdCA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoQ29uZC5oYXNPbmVVc2UoKSAmJiBpc1hvcjFPZlNldENDKENvbmQpKSB7CisgICAgICAvLyBSZWNvZ25pemUgZm9yIHhvcmIgKHNldGNjKSwgMSBwYXR0ZXJucy4gVGhlIHhvciBpbnZlcnRzIHRoZSBjb25kaXRpb24uCisgICAgICAvLyBJdCBzaG91bGQgYmUgdHJhbnNmb3JtZWQgZHVyaW5nIGRhZyBjb21iaW5lciBleGNlcHQgd2hlbiB0aGUgY29uZGl0aW9uCisgICAgICAvLyBpcyBzZXQgYnkgYSBhcml0aG1ldGljcyB3aXRoIG92ZXJmbG93IG5vZGUuCisgICAgICBYODY6OkNvbmRDb2RlIENDb2RlID0KKyAgICAgICAgKFg4Njo6Q29uZENvZGUpQ29uZC5nZXRPcGVyYW5kKDApLmdldENvbnN0YW50T3BlcmFuZFZhbCgwKTsKKyAgICAgIENDb2RlID0gWDg2OjpHZXRPcHBvc2l0ZUJyYW5jaENvbmRpdGlvbihDQ29kZSk7CisgICAgICBDQyA9IERBRy5nZXRDb25zdGFudChDQ29kZSwgTVZUOjppOCk7CisgICAgICBDb25kID0gQ29uZC5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMSk7CisgICAgICBhZGRUZXN0ID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKGFkZFRlc3QpIHsKKyAgICAvLyBMb29rIHBhc3MgdGhlIHRydW5jYXRlLgorICAgIGlmIChDb25kLmdldE9wY29kZSgpID09IElTRDo6VFJVTkNBVEUpCisgICAgICBDb25kID0gQ29uZC5nZXRPcGVyYW5kKDApOworCisgICAgLy8gV2Uga25vdyB0aGUgcmVzdWx0IG9mIEFORCBpcyBjb21wYXJlZCBhZ2FpbnN0IHplcm8uIFRyeSB0byBtYXRjaAorICAgIC8vIGl0IHRvIEJULgorICAgIGlmIChDb25kLmdldE9wY29kZSgpID09IElTRDo6QU5EICYmIENvbmQuaGFzT25lVXNlKCkpIHsgCisgICAgICBTRFZhbHVlIE5ld1NldENDID0gTG93ZXJUb0JUKENvbmQsIElTRDo6U0VUTkUsIGRsLCBEQUcpOworICAgICAgaWYgKE5ld1NldENDLmdldE5vZGUoKSkgeworICAgICAgICBDQyA9IE5ld1NldENDLmdldE9wZXJhbmQoMCk7CisgICAgICAgIENvbmQgPSBOZXdTZXRDQy5nZXRPcGVyYW5kKDEpOworICAgICAgICBhZGRUZXN0ID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGFkZFRlc3QpIHsKKyAgICBDQyA9IERBRy5nZXRDb25zdGFudChYODY6OkNPTkRfTkUsIE1WVDo6aTgpOworICAgIENvbmQgPSBFbWl0VGVzdChDb25kLCBYODY6OkNPTkRfTkUsIERBRyk7CisgIH0KKyAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6QlJDT05ELCBkbCwgT3AuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICBDaGFpbiwgRGVzdCwgQ0MsIENvbmQpOworfQorCisKKy8vIExvd2VyIGR5bmFtaWMgc3RhY2sgYWxsb2NhdGlvbiB0byBfYWxsb2NhIGNhbGwgZm9yIEN5Z3dpbi9NaW5ndyB0YXJnZXRzLgorLy8gQ2FsbHMgdG8gX2FsbG9jYSBpcyBuZWVkZWQgdG8gcHJvYmUgdGhlIHN0YWNrIHdoZW4gYWxsb2NhdGluZyBtb3JlIHRoYW4gNGsKKy8vIGJ5dGVzIGluIG9uZSBnby4gVG91Y2hpbmcgdGhlIHN0YWNrIGF0IDRLIGluY3JlbWVudHMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZQorLy8gdGhhdCB0aGUgZ3VhcmQgcGFnZXMgdXNlZCBieSB0aGUgT1MgdmlydHVhbCBtZW1vcnkgbWFuYWdlciBhcmUgYWxsb2NhdGVkIGluCisvLyBjb3JyZWN0IHNlcXVlbmNlLgorU0RWYWx1ZQorWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyRFlOQU1JQ19TVEFDS0FMTE9DKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgYXNzZXJ0KFN1YnRhcmdldC0+aXNUYXJnZXRDeWdNaW5nKCkgJiYKKyAgICAgICAgICJUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgb24gQ3lnd2luL01pbmd3IHRhcmdldHMiKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIC8vIEdldCB0aGUgaW5wdXRzLgorICBTRFZhbHVlIENoYWluID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBTaXplICA9IE9wLmdldE9wZXJhbmQoMSk7CisgIC8vIEZJWE1FOiBFbnN1cmUgYWxpZ25tZW50IGhlcmUKKworICBTRFZhbHVlIEZsYWc7CisKKyAgRVZUIFNQVHkgPSBTdWJ0YXJnZXQtPmlzNjRCaXQoKSA/IE1WVDo6aTY0IDogTVZUOjppMzI7CisKKyAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgWDg2OjpFQVgsIFNpemUsIEZsYWcpOworICBGbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisKKyAgU0RWVExpc3QgTm9kZVR5cyA9IERBRy5nZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKworICBDaGFpbiA9IERBRy5nZXROb2RlKFg4NklTRDo6TUlOR1dfQUxMT0NBLCBkbCwgTm9kZVR5cywgQ2hhaW4sIEZsYWcpOworICBGbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisKKyAgQ2hhaW4gPSBEQUcuZ2V0Q29weUZyb21SZWcoQ2hhaW4sIGRsLCBYODZTdGFja1B0ciwgU1BUeSkuZ2V0VmFsdWUoMSk7CisKKyAgU0RWYWx1ZSBPcHMxWzJdID0geyBDaGFpbi5nZXRWYWx1ZSgwKSwgQ2hhaW4gfTsKKyAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPcHMxLCAyLCBkbCk7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyVkFTVEFSVChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBYODZNYWNoaW5lRnVuY3Rpb25JbmZvICpGdW5jSW5mbyA9IE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKworICBjb25zdCBWYWx1ZSAqU1YgPSBjYXN0PFNyY1ZhbHVlU0ROb2RlPihPcC5nZXRPcGVyYW5kKDIpKS0+Z2V0VmFsdWUoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGlmICghU3VidGFyZ2V0LT5pczY0Qml0KCkpIHsKKyAgICAvLyB2YXN0YXJ0IGp1c3Qgc3RvcmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBWYXJBcmdzRnJhbWVJbmRleCBzbG90IGludG8gdGhlCisgICAgLy8gbWVtb3J5IGxvY2F0aW9uIGFyZ3VtZW50LgorICAgIFNEVmFsdWUgRlIgPSBEQUcuZ2V0RnJhbWVJbmRleChGdW5jSW5mby0+Z2V0VmFyQXJnc0ZyYW1lSW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCkpOworICAgIHJldHVybiBEQUcuZ2V0U3RvcmUoT3AuZ2V0T3BlcmFuZCgwKSwgZGwsIEZSLCBPcC5nZXRPcGVyYW5kKDEpLCBTViwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgIH0KKworICAvLyBfX3ZhX2xpc3RfdGFnOgorICAvLyAgIGdwX29mZnNldCAgICAgICAgICgwIC0gNiAqIDgpCisgIC8vICAgZnBfb2Zmc2V0ICAgICAgICAgKDQ4IC0gNDggKyA4ICogMTYpCisgIC8vICAgb3ZlcmZsb3dfYXJnX2FyZWEgKHBvaW50IHRvIHBhcmFtZXRlcnMgY29taW5nIGluIG1lbW9yeSkuCisgIC8vICAgcmVnX3NhdmVfYXJlYQorICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA4PiBNZW1PcHM7CisgIFNEVmFsdWUgRklOID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgLy8gU3RvcmUgZ3Bfb2Zmc2V0CisgIFNEVmFsdWUgU3RvcmUgPSBEQUcuZ2V0U3RvcmUoT3AuZ2V0T3BlcmFuZCgwKSwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEZ1bmNJbmZvLT5nZXRWYXJBcmdzR1BPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTiwgU1YsIDAsIGZhbHNlLCBmYWxzZSwgMCk7CisgIE1lbU9wcy5wdXNoX2JhY2soU3RvcmUpOworCisgIC8vIFN0b3JlIGZwX29mZnNldAorICBGSU4gPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIGdldFBvaW50ZXJUeSgpLAorICAgICAgICAgICAgICAgICAgICBGSU4sIERBRy5nZXRJbnRQdHJDb25zdGFudCg0KSk7CisgIFN0b3JlID0gREFHLmdldFN0b3JlKE9wLmdldE9wZXJhbmQoMCksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoRnVuY0luZm8tPmdldFZhckFyZ3NGUE9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICBGSU4sIFNWLCA0LCBmYWxzZSwgZmFsc2UsIDApOworICBNZW1PcHMucHVzaF9iYWNrKFN0b3JlKTsKKworICAvLyBTdG9yZSBwdHIgdG8gb3ZlcmZsb3dfYXJnX2FyZWEKKyAgRklOID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgRklOLCBEQUcuZ2V0SW50UHRyQ29uc3RhbnQoNCkpOworICBTRFZhbHVlIE9WRklOID0gREFHLmdldEZyYW1lSW5kZXgoRnVuY0luZm8tPmdldFZhckFyZ3NGcmFtZUluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSk7CisgIFN0b3JlID0gREFHLmdldFN0b3JlKE9wLmdldE9wZXJhbmQoMCksIGRsLCBPVkZJTiwgRklOLCBTViwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgTWVtT3BzLnB1c2hfYmFjayhTdG9yZSk7CisKKyAgLy8gU3RvcmUgcHRyIHRvIHJlZ19zYXZlX2FyZWEuCisgIEZJTiA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgZ2V0UG9pbnRlclR5KCksCisgICAgICAgICAgICAgICAgICAgIEZJTiwgREFHLmdldEludFB0ckNvbnN0YW50KDgpKTsKKyAgU0RWYWx1ZSBSU0ZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZ1bmNJbmZvLT5nZXRSZWdTYXZlRnJhbWVJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCkpOworICBTdG9yZSA9IERBRy5nZXRTdG9yZShPcC5nZXRPcGVyYW5kKDApLCBkbCwgUlNGSU4sIEZJTiwgU1YsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICBNZW1PcHMucHVzaF9iYWNrKFN0b3JlKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgJk1lbU9wc1swXSwgTWVtT3BzLnNpemUoKSk7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyVkFBUkcoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgLy8gWDg2LTY0IHZhX2xpc3QgaXMgYSBzdHJ1Y3QgeyBpMzIsIGkzMiwgaTgqLCBpOCogfS4KKyAgYXNzZXJ0KFN1YnRhcmdldC0+aXM2NEJpdCgpICYmICJUaGlzIGNvZGUgb25seSBoYW5kbGVzIDY0LWJpdCB2YV9hcmchIik7CisKKyAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJWQUFyZ0luc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBmb3IgeDg2LTY0ISIpOworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlclZBQ09QWShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvLyBYODYtNjQgdmFfbGlzdCBpcyBhIHN0cnVjdCB7IGkzMiwgaTMyLCBpOCosIGk4KiB9LgorICBhc3NlcnQoU3VidGFyZ2V0LT5pczY0Qml0KCkgJiYgIlRoaXMgY29kZSBvbmx5IGhhbmRsZXMgNjQtYml0IHZhX2NvcHkhIik7CisgIFNEVmFsdWUgQ2hhaW4gPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIERzdFB0ciA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgU3JjUHRyID0gT3AuZ2V0T3BlcmFuZCgyKTsKKyAgY29uc3QgVmFsdWUgKkRzdFNWID0gY2FzdDxTcmNWYWx1ZVNETm9kZT4oT3AuZ2V0T3BlcmFuZCgzKSktPmdldFZhbHVlKCk7CisgIGNvbnN0IFZhbHVlICpTcmNTViA9IGNhc3Q8U3JjVmFsdWVTRE5vZGU+KE9wLmdldE9wZXJhbmQoNCkpLT5nZXRWYWx1ZSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgcmV0dXJuIERBRy5nZXRNZW1jcHkoQ2hhaW4sIGRsLCBEc3RQdHIsIFNyY1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEludFB0ckNvbnN0YW50KDI0KSwgOCwgLyppc1ZvbGF0aWxlKi9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIERzdFNWLCAwLCBTcmNTViwgMCk7Cit9CisKK1NEVmFsdWUKK1g4NlRhcmdldExvd2VyaW5nOjpMb3dlcklOVFJJTlNJQ19XT19DSEFJTihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIHVuc2lnbmVkIEludE5vID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgwKSktPmdldFpFeHRWYWx1ZSgpOworICBzd2l0Y2ggKEludE5vKSB7CisgIGRlZmF1bHQ6IHJldHVybiBTRFZhbHVlKCk7ICAgIC8vIERvbid0IGN1c3RvbSBsb3dlciBtb3N0IGludHJpbnNpY3MuCisgIC8vIENvbXBhcmlzb24gaW50cmluc2ljcy4KKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfY29taWVxX3NzOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9jb21pbHRfc3M6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX2NvbWlsZV9zczoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfY29taWd0X3NzOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9jb21pZ2Vfc3M6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX2NvbWluZXFfc3M6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3Vjb21pZXFfc3M6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3Vjb21pbHRfc3M6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3Vjb21pbGVfc3M6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3Vjb21pZ3Rfc3M6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3Vjb21pZ2Vfc3M6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3Vjb21pbmVxX3NzOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfY29taWVxX3NkOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfY29taWx0X3NkOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfY29taWxlX3NkOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfY29taWd0X3NkOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfY29taWdlX3NkOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfY29taW5lcV9zZDoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3Vjb21pZXFfc2Q6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl91Y29taWx0X3NkOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfdWNvbWlsZV9zZDoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3Vjb21pZ3Rfc2Q6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl91Y29taWdlX3NkOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfdWNvbWluZXFfc2Q6IHsKKyAgICB1bnNpZ25lZCBPcGMgPSAwOworICAgIElTRDo6Q29uZENvZGUgQ0MgPSBJU0Q6OlNFVENDX0lOVkFMSUQ7CisgICAgc3dpdGNoIChJbnRObykgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX2NvbWllcV9zczoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfY29taWVxX3NkOgorICAgICAgT3BjID0gWDg2SVNEOjpDT01JOworICAgICAgQ0MgPSBJU0Q6OlNFVEVROworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfY29taWx0X3NzOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9jb21pbHRfc2Q6CisgICAgICBPcGMgPSBYODZJU0Q6OkNPTUk7CisgICAgICBDQyA9IElTRDo6U0VUTFQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9jb21pbGVfc3M6CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX2NvbWlsZV9zZDoKKyAgICAgIE9wYyA9IFg4NklTRDo6Q09NSTsKKyAgICAgIENDID0gSVNEOjpTRVRMRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX2NvbWlndF9zczoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfY29taWd0X3NkOgorICAgICAgT3BjID0gWDg2SVNEOjpDT01JOworICAgICAgQ0MgPSBJU0Q6OlNFVEdUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfY29taWdlX3NzOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9jb21pZ2Vfc2Q6CisgICAgICBPcGMgPSBYODZJU0Q6OkNPTUk7CisgICAgICBDQyA9IElTRDo6U0VUR0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9jb21pbmVxX3NzOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9jb21pbmVxX3NkOgorICAgICAgT3BjID0gWDg2SVNEOjpDT01JOworICAgICAgQ0MgPSBJU0Q6OlNFVE5FOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfdWNvbWllcV9zczoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfdWNvbWllcV9zZDoKKyAgICAgIE9wYyA9IFg4NklTRDo6VUNPTUk7CisgICAgICBDQyA9IElTRDo6U0VURVE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV91Y29taWx0X3NzOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl91Y29taWx0X3NkOgorICAgICAgT3BjID0gWDg2SVNEOjpVQ09NSTsKKyAgICAgIENDID0gSVNEOjpTRVRMVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3Vjb21pbGVfc3M6CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3Vjb21pbGVfc2Q6CisgICAgICBPcGMgPSBYODZJU0Q6OlVDT01JOworICAgICAgQ0MgPSBJU0Q6OlNFVExFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfdWNvbWlndF9zczoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfdWNvbWlndF9zZDoKKyAgICAgIE9wYyA9IFg4NklTRDo6VUNPTUk7CisgICAgICBDQyA9IElTRDo6U0VUR1Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV91Y29taWdlX3NzOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl91Y29taWdlX3NkOgorICAgICAgT3BjID0gWDg2SVNEOjpVQ09NSTsKKyAgICAgIENDID0gSVNEOjpTRVRHRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3Vjb21pbmVxX3NzOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl91Y29taW5lcV9zZDoKKyAgICAgIE9wYyA9IFg4NklTRDo6VUNPTUk7CisgICAgICBDQyA9IElTRDo6U0VUTkU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBTRFZhbHVlIExIUyA9IE9wLmdldE9wZXJhbmQoMSk7CisgICAgU0RWYWx1ZSBSSFMgPSBPcC5nZXRPcGVyYW5kKDIpOworICAgIHVuc2lnbmVkIFg4NkNDID0gVHJhbnNsYXRlWDg2Q0MoQ0MsIHRydWUsIExIUywgUkhTLCBEQUcpOworICAgIGFzc2VydChYODZDQyAhPSBYODY6OkNPTkRfSU5WQUxJRCAmJiAiVW5leHBlY3RlZCBpbGxlZ2FsIGNvbmRpdGlvbiEiKTsKKyAgICBTRFZhbHVlIENvbmQgPSBEQUcuZ2V0Tm9kZShPcGMsIGRsLCBNVlQ6OmkzMiwgTEhTLCBSSFMpOworICAgIFNEVmFsdWUgU2V0Q0MgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlNFVENDLCBkbCwgTVZUOjppOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFg4NkNDLCBNVlQ6Omk4KSwgQ29uZCk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIGRsLCBNVlQ6OmkzMiwgU2V0Q0MpOworICB9CisgIC8vIHB0ZXN0IGFuZCB0ZXN0cCBpbnRyaW5zaWNzLiBUaGUgaW50cmluc2ljIHRoZXNlIGNvbWUgZnJvbSBhcmUgZGVzaWduZWQgdG8KKyAgLy8gcmV0dXJuIGFuIGludGVnZXIgdmFsdWUsIG5vdCBqdXN0IGFuIGluc3RydWN0aW9uIHNvIGxvd2VyIGl0IHRvIHRoZSBwdGVzdAorICAvLyBvciB0ZXN0cCBwYXR0ZXJuIGFuZCBhIHNldGNjIGZvciB0aGUgcmVzdWx0LgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTQxX3B0ZXN0ejoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wdGVzdGM6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlNDFfcHRlc3RuemM6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3B0ZXN0el8yNTY6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3B0ZXN0Y18yNTY6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3B0ZXN0bnpjXzI1NjoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3R6X3BzOgorICBjYXNlIEludHJpbnNpYzo6eDg2X2F2eF92dGVzdGNfcHM6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0bnpjX3BzOgorICBjYXNlIEludHJpbnNpYzo6eDg2X2F2eF92dGVzdHpfcGQ6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0Y19wZDoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3RuemNfcGQ6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0el9wc18yNTY6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0Y19wc18yNTY6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0bnpjX3BzXzI1NjoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3R6X3BkXzI1NjoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3RjX3BkXzI1NjoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3RuemNfcGRfMjU2OiB7CisgICAgYm9vbCBJc1Rlc3RQYWNrZWQgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBYODZDQyA9IDA7CisgICAgc3dpdGNoIChJbnRObykgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIkJhZCBmYWxsdGhyb3VnaCBpbiBJbnRyaW5zaWMgbG93ZXJpbmcuIik7CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3R6X3BzOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0el9wZDoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X2F2eF92dGVzdHpfcHNfMjU2OgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0el9wZF8yNTY6CisgICAgICBJc1Rlc3RQYWNrZWQgPSB0cnVlOyAvLyBGYWxsdGhyb3VnaAorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlNDFfcHRlc3R6OgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3B0ZXN0el8yNTY6CisgICAgICAvLyBaRiA9IDEKKyAgICAgIFg4NkNDID0gWDg2OjpDT05EX0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X2F2eF92dGVzdGNfcHM6CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3RjX3BkOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0Y19wc18yNTY6CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3RjX3BkXzI1NjoKKyAgICAgIElzVGVzdFBhY2tlZCA9IHRydWU7IC8vIEZhbGx0aHJvdWdoCisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wdGVzdGM6CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfcHRlc3RjXzI1NjoKKyAgICAgIC8vIENGID0gMQorICAgICAgWDg2Q0MgPSBYODY6OkNPTkRfQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0bnpjX3BzOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0bnpjX3BkOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0bnpjX3BzXzI1NjoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X2F2eF92dGVzdG56Y19wZF8yNTY6CisgICAgICBJc1Rlc3RQYWNrZWQgPSB0cnVlOyAvLyBGYWxsdGhyb3VnaAorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlNDFfcHRlc3RuemM6CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9hdnhfcHRlc3RuemNfMjU2OgorICAgICAgLy8gWkYgYW5kIENGID0gMAorICAgICAgWDg2Q0MgPSBYODY6OkNPTkRfQTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIFNEVmFsdWUgTEhTID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgICBTRFZhbHVlIFJIUyA9IE9wLmdldE9wZXJhbmQoMik7CisgICAgdW5zaWduZWQgVGVzdE9wYyA9IElzVGVzdFBhY2tlZCA/IFg4NklTRDo6VEVTVFAgOiBYODZJU0Q6OlBURVNUOworICAgIFNEVmFsdWUgVGVzdCA9IERBRy5nZXROb2RlKFRlc3RPcGMsIGRsLCBNVlQ6OmkzMiwgTEhTLCBSSFMpOworICAgIFNEVmFsdWUgQ0MgPSBEQUcuZ2V0Q29uc3RhbnQoWDg2Q0MsIE1WVDo6aTgpOworICAgIFNEVmFsdWUgU2V0Q0MgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlNFVENDLCBkbCwgTVZUOjppOCwgQ0MsIFRlc3QpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwgTVZUOjppMzIsIFNldENDKTsKKyAgfQorCisgIC8vIEZpeCB2ZWN0b3Igc2hpZnQgaW5zdHJ1Y3Rpb25zIHdoZXJlIHRoZSBsYXN0IG9wZXJhbmQgaXMgYSBub24taW1tZWRpYXRlCisgIC8vIGkzMiB2YWx1ZS4KKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxpX3c6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV9kOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfcHNsbGlfcToKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxpX3c6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc3JsaV9kOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfcHNybGlfcToKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmFpX3c6CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc3JhaV9kOgorICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc2xsaV93OgorICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc2xsaV9kOgorICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc2xsaV9xOgorICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc3JsaV93OgorICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc3JsaV9kOgorICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc3JsaV9xOgorICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc3JhaV93OgorICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc3JhaV9kOiB7CisgICAgU0RWYWx1ZSBTaEFtdCA9IE9wLmdldE9wZXJhbmQoMik7CisgICAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oU2hBbXQpKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAgIHVuc2lnbmVkIE5ld0ludE5vID0gMDsKKyAgICBFVlQgU2hBbXRWVCA9IE1WVDo6djRpMzI7CisgICAgc3dpdGNoIChJbnRObykgeworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV93OgorICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxfdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV9kOgorICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxfZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV9xOgorICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxfcTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc3JsaV93OgorICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxfdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc3JsaV9kOgorICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxfZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc3JsaV9xOgorICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxfcTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc3JhaV93OgorICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmFfdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9wc3JhaV9kOgorICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmFfZDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIFNoQW10VlQgPSBNVlQ6OnYyaTMyOworICAgICAgc3dpdGNoIChJbnRObykgeworICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9tbXhfcHNsbGlfdzoKKyAgICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9tbXhfcHNsbF93OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW50cmluc2ljOjp4ODZfbW14X3BzbGxpX2Q6CisgICAgICAgIE5ld0ludE5vID0gSW50cmluc2ljOjp4ODZfbW14X3BzbGxfZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc2xsaV9xOgorICAgICAgICBOZXdJbnRObyA9IEludHJpbnNpYzo6eDg2X21teF9wc2xsX3E7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9tbXhfcHNybGlfdzoKKyAgICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9tbXhfcHNybF93OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW50cmluc2ljOjp4ODZfbW14X3BzcmxpX2Q6CisgICAgICAgIE5ld0ludE5vID0gSW50cmluc2ljOjp4ODZfbW14X3BzcmxfZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEludHJpbnNpYzo6eDg2X21teF9wc3JsaV9xOgorICAgICAgICBOZXdJbnRObyA9IEludHJpbnNpYzo6eDg2X21teF9wc3JsX3E7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9tbXhfcHNyYWlfdzoKKyAgICAgICAgTmV3SW50Tm8gPSBJbnRyaW5zaWM6Ong4Nl9tbXhfcHNyYV93OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW50cmluc2ljOjp4ODZfbW14X3BzcmFpX2Q6CisgICAgICAgIE5ld0ludE5vID0gSW50cmluc2ljOjp4ODZfbW14X3BzcmFfZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbXBvc3NpYmxlIGludHJpbnNpYyIpOyAgLy8gQ2FuJ3QgcmVhY2ggaGVyZS4KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGUgdmVjdG9yIHNoaWZ0IGludHJpbnNpY3Mgd2l0aCBzY2FsYXJzIHVzZXMgMzJiIHNoaWZ0IGFtb3VudHMgYnV0CisgICAgLy8gdGhlIHNzZTIvbW14IHNoaWZ0IGluc3RydWN0aW9ucyByZWFkcyA2NCBiaXRzLiBTZXQgdGhlIHVwcGVyIDMyIGJpdHMKKyAgICAvLyB0byBiZSB6ZXJvLgorICAgIFNEVmFsdWUgU2hPcHNbNF07CisgICAgU2hPcHNbMF0gPSBTaEFtdDsKKyAgICBTaE9wc1sxXSA9IERBRy5nZXRDb25zdGFudCgwLCBNVlQ6OmkzMik7CisgICAgaWYgKFNoQW10VlQgPT0gTVZUOjp2NGkzMikgeworICAgICAgU2hPcHNbMl0gPSBEQUcuZ2V0VU5ERUYoTVZUOjppMzIpOworICAgICAgU2hPcHNbM10gPSBEQUcuZ2V0VU5ERUYoTVZUOjppMzIpOworICAgICAgU2hBbXQgPSAgREFHLmdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIGRsLCBTaEFtdFZULCAmU2hPcHNbMF0sIDQpOworICAgIH0gZWxzZSB7CisgICAgICBTaEFtdCA9ICBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgZGwsIFNoQW10VlQsICZTaE9wc1swXSwgMik7CisgICAgfQorCisgICAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgICAgU2hBbXQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgVlQsIFNoQW10KTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4sIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE5ld0ludE5vLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgIE9wLmdldE9wZXJhbmQoMSksIFNoQW10KTsKKyAgfQorICB9Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyUkVUVVJOQUREUihTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRGcmFtZUluZm8oKTsKKyAgTUZJLT5zZXRSZXR1cm5BZGRyZXNzSXNUYWtlbih0cnVlKTsKKworICB1bnNpZ25lZCBEZXB0aCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMCkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGlmIChEZXB0aCA+IDApIHsKKyAgICBTRFZhbHVlIEZyYW1lQWRkciA9IExvd2VyRlJBTUVBRERSKE9wLCBEQUcpOworICAgIFNEVmFsdWUgT2Zmc2V0ID0KKyAgICAgIERBRy5nZXRDb25zdGFudChURC0+Z2V0UG9pbnRlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBTdWJ0YXJnZXQtPmlzNjRCaXQoKSA/IE1WVDo6aTY0IDogTVZUOjppMzIpOworICAgIHJldHVybiBEQUcuZ2V0TG9hZChnZXRQb2ludGVyVHkoKSwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVBZGRyLCBPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworICB9CisKKyAgLy8gSnVzdCBsb2FkIHRoZSByZXR1cm4gYWRkcmVzcy4KKyAgU0RWYWx1ZSBSZXRBZGRyRkkgPSBnZXRSZXR1cm5BZGRyZXNzRnJhbWVJbmRleChEQUcpOworICByZXR1cm4gREFHLmdldExvYWQoZ2V0UG9pbnRlclR5KCksIGRsLCBEQUcuZ2V0RW50cnlOb2RlKCksCisgICAgICAgICAgICAgICAgICAgICBSZXRBZGRyRkksIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSwgMCk7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyRlJBTUVBRERSKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKS5nZXRGcmFtZUluZm8oKTsKKyAgTUZJLT5zZXRGcmFtZUFkZHJlc3NJc1Rha2VuKHRydWUpOworCisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7ICAvLyBGSVhNRSBwcm9iYWJseSBub3QgbWVhbmluZ2Z1bAorICB1bnNpZ25lZCBEZXB0aCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMCkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgdW5zaWduZWQgRnJhbWVSZWcgPSBTdWJ0YXJnZXQtPmlzNjRCaXQoKSA/IFg4Njo6UkJQIDogWDg2OjpFQlA7CisgIFNEVmFsdWUgRnJhbWVBZGRyID0gREFHLmdldENvcHlGcm9tUmVnKERBRy5nZXRFbnRyeU5vZGUoKSwgZGwsIEZyYW1lUmVnLCBWVCk7CisgIHdoaWxlIChEZXB0aC0tKQorICAgIEZyYW1lQWRkciA9IERBRy5nZXRMb2FkKFZULCBkbCwgREFHLmdldEVudHJ5Tm9kZSgpLCBGcmFtZUFkZHIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgcmV0dXJuIEZyYW1lQWRkcjsKK30KKworU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJGUkFNRV9UT19BUkdTX09GRlNFVChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICByZXR1cm4gREFHLmdldEludFB0ckNvbnN0YW50KDIqVEQtPmdldFBvaW50ZXJTaXplKCkpOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlckVIX1JFVFVSTihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBTRFZhbHVlIENoYWluICAgICA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgT2Zmc2V0ICAgID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBIYW5kbGVyICAgPSBPcC5nZXRPcGVyYW5kKDIpOworICBEZWJ1Z0xvYyBkbCAgICAgICA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgU0RWYWx1ZSBGcmFtZSA9IERBRy5nZXRSZWdpc3RlcihTdWJ0YXJnZXQtPmlzNjRCaXQoKSA/IFg4Njo6UkJQIDogWDg2OjpFQlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclR5KCkpOworICB1bnNpZ25lZCBTdG9yZUFkZHJSZWcgPSAoU3VidGFyZ2V0LT5pczY0Qml0KCkgPyBYODY6OlJDWCA6IFg4Njo6RUNYKTsKKworICBTRFZhbHVlIFN0b3JlQWRkciA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwgZ2V0UG9pbnRlclR5KCksIEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgtVEQtPmdldFBvaW50ZXJTaXplKCkpKTsKKyAgU3RvcmVBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBnZXRQb2ludGVyVHkoKSwgU3RvcmVBZGRyLCBPZmZzZXQpOworICBDaGFpbiA9IERBRy5nZXRTdG9yZShDaGFpbiwgZGwsIEhhbmRsZXIsIFN0b3JlQWRkciwgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgU3RvcmVBZGRyUmVnLCBTdG9yZUFkZHIpOworICBNRi5nZXRSZWdJbmZvKCkuYWRkTGl2ZU91dChTdG9yZUFkZHJSZWcpOworCisgIHJldHVybiBEQUcuZ2V0Tm9kZShYODZJU0Q6OkVIX1JFVFVSTiwgZGwsCisgICAgICAgICAgICAgICAgICAgICBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgQ2hhaW4sIERBRy5nZXRSZWdpc3RlcihTdG9yZUFkZHJSZWcsIGdldFBvaW50ZXJUeSgpKSk7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyVFJBTVBPTElORShTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBSb290ID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBUcm1wID0gT3AuZ2V0T3BlcmFuZCgxKTsgLy8gdHJhbXBvbGluZQorICBTRFZhbHVlIEZQdHIgPSBPcC5nZXRPcGVyYW5kKDIpOyAvLyBuZXN0ZWQgZnVuY3Rpb24KKyAgU0RWYWx1ZSBOZXN0ID0gT3AuZ2V0T3BlcmFuZCgzKTsgLy8gJ25lc3QnIHBhcmFtZXRlciB2YWx1ZQorICBEZWJ1Z0xvYyBkbCAgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIGNvbnN0IFZhbHVlICpUcm1wQWRkciA9IGNhc3Q8U3JjVmFsdWVTRE5vZGU+KE9wLmdldE9wZXJhbmQoNCkpLT5nZXRWYWx1ZSgpOworCisgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgIFNEVmFsdWUgT3V0Q2hhaW5zWzZdOworCisgICAgLy8gTGFyZ2UgY29kZS1tb2RlbC4KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEpNUDY0ciAgPSAweEZGOyAvLyA2NC1iaXQgam1wIHRocm91Z2ggcmVnaXN0ZXIgb3Bjb2RlLgorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgTU9WNjRyaSA9IDB4Qjg7IC8vIFg4Njo6TU9WNjRyaSBvcGNvZGUuCisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIE44NlIxMCA9IFJlZ0luZm8tPmdldFg4NlJlZ051bShYODY6OlIxMCk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBOODZSMTEgPSBSZWdJbmZvLT5nZXRYODZSZWdOdW0oWDg2OjpSMTEpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciBSRVhfV0IgPSAweDQwIHwgMHgwOCB8IDB4MDE7IC8vIFJFWCBwcmVmaXgKKworICAgIC8vIExvYWQgdGhlIHBvaW50ZXIgdG8gdGhlIG5lc3RlZCBmdW5jdGlvbiBpbnRvIFIxMS4KKyAgICB1bnNpZ25lZCBPcENvZGUgPSAoKE1PVjY0cmkgfCBOODZSMTEpIDw8IDgpIHwgUkVYX1dCOyAvLyBtb3ZhYnNxIHIxMQorICAgIFNEVmFsdWUgQWRkciA9IFRybXA7CisgICAgT3V0Q2hhaW5zWzBdID0gREFHLmdldFN0b3JlKFJvb3QsIGRsLCBEQUcuZ2V0Q29uc3RhbnQoT3BDb2RlLCBNVlQ6OmkxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIsIFRybXBBZGRyLCAwLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgQWRkciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppNjQsIFRybXAsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgyLCBNVlQ6Omk2NCkpOworICAgIE91dENoYWluc1sxXSA9IERBRy5nZXRTdG9yZShSb290LCBkbCwgRlB0ciwgQWRkciwgVHJtcEFkZHIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMik7CisKKyAgICAvLyBMb2FkIHRoZSAnbmVzdCcgcGFyYW1ldGVyIHZhbHVlIGludG8gUjEwLgorICAgIC8vIFIxMCBpcyBzcGVjaWZpZWQgaW4gWDg2Q2FsbGluZ0NvbnYudGQKKyAgICBPcENvZGUgPSAoKE1PVjY0cmkgfCBOODZSMTApIDw8IDgpIHwgUkVYX1dCOyAvLyBtb3ZhYnNxIHIxMAorICAgIEFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTY0LCBUcm1wLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMTAsIE1WVDo6aTY0KSk7CisgICAgT3V0Q2hhaW5zWzJdID0gREFHLmdldFN0b3JlKFJvb3QsIGRsLCBEQUcuZ2V0Q29uc3RhbnQoT3BDb2RlLCBNVlQ6OmkxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIsIFRybXBBZGRyLCAxMCwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgIEFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTY0LCBUcm1wLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMTIsIE1WVDo6aTY0KSk7CisgICAgT3V0Q2hhaW5zWzNdID0gREFHLmdldFN0b3JlKFJvb3QsIGRsLCBOZXN0LCBBZGRyLCBUcm1wQWRkciwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMik7CisKKyAgICAvLyBKdW1wIHRvIHRoZSBuZXN0ZWQgZnVuY3Rpb24uCisgICAgT3BDb2RlID0gKEpNUDY0ciA8PCA4KSB8IFJFWF9XQjsgLy8gam1wcSAqLi4uCisgICAgQWRkciA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgTVZUOjppNjQsIFRybXAsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgyMCwgTVZUOjppNjQpKTsKKyAgICBPdXRDaGFpbnNbNF0gPSBEQUcuZ2V0U3RvcmUoUm9vdCwgZGwsIERBRy5nZXRDb25zdGFudChPcENvZGUsIE1WVDo6aTE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkciwgVHJtcEFkZHIsIDIwLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgdW5zaWduZWQgY2hhciBNb2RSTSA9IE44NlIxMSB8ICg0IDw8IDMpIHwgKDMgPDwgNik7IC8vIC4uLnIxMQorICAgIEFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTY0LCBUcm1wLAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMjIsIE1WVDo6aTY0KSk7CisgICAgT3V0Q2hhaW5zWzVdID0gREFHLmdldFN0b3JlKFJvb3QsIGRsLCBEQUcuZ2V0Q29uc3RhbnQoTW9kUk0sIE1WVDo6aTgpLCBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcm1wQWRkciwgMjIsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICBTRFZhbHVlIE9wc1tdID0KKyAgICAgIHsgVHJtcCwgREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIE91dENoYWlucywgNikgfTsKKyAgICByZXR1cm4gREFHLmdldE1lcmdlVmFsdWVzKE9wcywgMiwgZGwpOworICB9IGVsc2UgeworICAgIGNvbnN0IEZ1bmN0aW9uICpGdW5jID0KKyAgICAgIGNhc3Q8RnVuY3Rpb24+KGNhc3Q8U3JjVmFsdWVTRE5vZGU+KE9wLmdldE9wZXJhbmQoNSkpLT5nZXRWYWx1ZSgpKTsKKyAgICBDYWxsaW5nQ29udjo6SUQgQ0MgPSBGdW5jLT5nZXRDYWxsaW5nQ29udigpOworICAgIHVuc2lnbmVkIE5lc3RSZWc7CisKKyAgICBzd2l0Y2ggKENDKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIGNhbGxpbmcgY29udmVudGlvbiIpOworICAgIGNhc2UgQ2FsbGluZ0NvbnY6OkM6CisgICAgY2FzZSBDYWxsaW5nQ29udjo6WDg2X1N0ZENhbGw6IHsKKyAgICAgIC8vIFBhc3MgJ25lc3QnIHBhcmFtZXRlciBpbiBFQ1guCisgICAgICAvLyBNdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIFg4NkNhbGxpbmdDb252LnRkCisgICAgICBOZXN0UmVnID0gWDg2OjpFQ1g7CisKKyAgICAgIC8vIENoZWNrIHRoYXQgRUNYIHdhc24ndCBuZWVkZWQgYnkgYW4gJ2lucmVnJyBwYXJhbWV0ZXIuCisgICAgICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IEZ1bmMtPmdldEZ1bmN0aW9uVHlwZSgpOworICAgICAgY29uc3QgQXR0ckxpc3RQdHIgJkF0dHJzID0gRnVuYy0+Z2V0QXR0cmlidXRlcygpOworCisgICAgICBpZiAoIUF0dHJzLmlzRW1wdHkoKSAmJiAhRnVuYy0+aXNWYXJBcmcoKSkgeworICAgICAgICB1bnNpZ25lZCBJblJlZ0NvdW50ID0gMDsKKyAgICAgICAgdW5zaWduZWQgSWR4ID0gMTsKKworICAgICAgICBmb3IgKEZ1bmN0aW9uVHlwZTo6cGFyYW1faXRlcmF0b3IgSSA9IEZUeS0+cGFyYW1fYmVnaW4oKSwKKyAgICAgICAgICAgICBFID0gRlR5LT5wYXJhbV9lbmQoKTsgSSAhPSBFOyArK0ksICsrSWR4KQorICAgICAgICAgIGlmIChBdHRycy5wYXJhbUhhc0F0dHIoSWR4LCBBdHRyaWJ1dGU6OkluUmVnKSkKKyAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgb25seSBjb3VudCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGxvd2VyZWQgdG8gaW50ZWdlcnMuCisgICAgICAgICAgICBJblJlZ0NvdW50ICs9IChURC0+Z2V0VHlwZVNpemVJbkJpdHMoKkkpICsgMzEpIC8gMzI7CisKKyAgICAgICAgaWYgKEluUmVnQ291bnQgPiAyKSB7CisgICAgICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJOZXN0IHJlZ2lzdGVyIGluIHVzZSAtIHJlZHVjZSBudW1iZXIgb2YgaW5yZWciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcGFyYW1ldGVycyEiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQ2FsbGluZ0NvbnY6Olg4Nl9GYXN0Q2FsbDoKKyAgICBjYXNlIENhbGxpbmdDb252OjpYODZfVGhpc0NhbGw6CisgICAgY2FzZSBDYWxsaW5nQ29udjo6RmFzdDoKKyAgICAgIC8vIFBhc3MgJ25lc3QnIHBhcmFtZXRlciBpbiBFQVguCisgICAgICAvLyBNdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIFg4NkNhbGxpbmdDb252LnRkCisgICAgICBOZXN0UmVnID0gWDg2OjpFQVg7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBTRFZhbHVlIE91dENoYWluc1s0XTsKKyAgICBTRFZhbHVlIEFkZHIsIERpc3A7CisKKyAgICBBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgVHJtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEwLCBNVlQ6OmkzMikpOworICAgIERpc3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNVQiwgZGwsIE1WVDo6aTMyLCBGUHRyLCBBZGRyKTsKKworICAgIC8vIFRoaXMgaXMgc3RvcmluZyB0aGUgb3Bjb2RlIGZvciBNT1YzMnJpLgorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgTU9WMzJyaSA9IDB4Qjg7IC8vIFg4Njo6TU9WMzJyaSdzIG9wY29kZSBieXRlLgorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgTjg2UmVnID0gUmVnSW5mby0+Z2V0WDg2UmVnTnVtKE5lc3RSZWcpOworICAgIE91dENoYWluc1swXSA9IERBRy5nZXRTdG9yZShSb290LCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE1PVjMycml8Tjg2UmVnLCBNVlQ6Omk4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJtcCwgVHJtcEFkZHIsIDAsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICBBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgVHJtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTMyKSk7CisgICAgT3V0Q2hhaW5zWzFdID0gREFHLmdldFN0b3JlKFJvb3QsIGRsLCBOZXN0LCBBZGRyLCBUcm1wQWRkciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAxKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgSk1QID0gMHhFOTsgLy8gam1wIDwzMmJpdCBkc3Q+IG9wY29kZS4KKyAgICBBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgVHJtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDUsIE1WVDo6aTMyKSk7CisgICAgT3V0Q2hhaW5zWzJdID0gREFHLmdldFN0b3JlKFJvb3QsIGRsLCBEQUcuZ2V0Q29uc3RhbnQoSk1QLCBNVlQ6Omk4KSwgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJtcEFkZHIsIDUsIGZhbHNlLCBmYWxzZSwgMSk7CisKKyAgICBBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgVHJtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDYsIE1WVDo6aTMyKSk7CisgICAgT3V0Q2hhaW5zWzNdID0gREFHLmdldFN0b3JlKFJvb3QsIGRsLCBEaXNwLCBBZGRyLCBUcm1wQWRkciwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAxKTsKKworICAgIFNEVmFsdWUgT3BzW10gPQorICAgICAgeyBUcm1wLCBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgT3V0Q2hhaW5zLCA0KSB9OworICAgIHJldHVybiBEQUcuZ2V0TWVyZ2VWYWx1ZXMoT3BzLCAyLCBkbCk7CisgIH0KK30KKworU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJGTFRfUk9VTkRTXyhTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICAvKgorICAgVGhlIHJvdW5kaW5nIG1vZGUgaXMgaW4gYml0cyAxMToxMCBvZiBGUFNSLCBhbmQgaGFzIHRoZSBmb2xsb3dpbmcKKyAgIHNldHRpbmdzOgorICAgICAwMCBSb3VuZCB0byBuZWFyZXN0CisgICAgIDAxIFJvdW5kIHRvIC1pbmYKKyAgICAgMTAgUm91bmQgdG8gK2luZgorICAgICAxMSBSb3VuZCB0byAwCisKKyAgRkxUX1JPVU5EUywgb24gdGhlIG90aGVyIGhhbmQsIGV4cGVjdHMgdGhlIGZvbGxvd2luZzoKKyAgICAtMSBVbmRlZmluZWQKKyAgICAgMCBSb3VuZCB0byAwCisgICAgIDEgUm91bmQgdG8gbmVhcmVzdAorICAgICAyIFJvdW5kIHRvICtpbmYKKyAgICAgMyBSb3VuZCB0byAtaW5mCisKKyAgVG8gcGVyZm9ybSB0aGUgY29udmVyc2lvbiwgd2UgZG86CisgICAgKCgoKChGUFNSICYgMHg4MDApID4+IDExKSB8ICgoRlBTUiAmIDB4NDAwKSA+PiA5KSkgKyAxKSAmIDMpCisgICovCisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsKKyAgY29uc3QgVGFyZ2V0RnJhbWVJbmZvICZURkkgPSAqVE0uZ2V0RnJhbWVJbmZvKCk7CisgIHVuc2lnbmVkIFN0YWNrQWxpZ25tZW50ID0gVEZJLmdldFN0YWNrQWxpZ25tZW50KCk7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgLy8gU2F2ZSBGUCBDb250cm9sIFdvcmQgdG8gc3RhY2sgc2xvdAorICBpbnQgU1NGSSA9IE1GLmdldEZyYW1lSW5mbygpLT5DcmVhdGVTdGFja09iamVjdCgyLCBTdGFja0FsaWdubWVudCwgZmFsc2UpOworICBTRFZhbHVlIFN0YWNrU2xvdCA9IERBRy5nZXRGcmFtZUluZGV4KFNTRkksIGdldFBvaW50ZXJUeSgpKTsKKworICBTRFZhbHVlIENoYWluID0gREFHLmdldE5vZGUoWDg2SVNEOjpGTlNUQ1cxNm0sIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEVudHJ5Tm9kZSgpLCBTdGFja1Nsb3QpOworCisgIC8vIExvYWQgRlAgQ29udHJvbCBXb3JkIGZyb20gc3RhY2sgc2xvdAorICBTRFZhbHVlIENXRCA9IERBRy5nZXRMb2FkKE1WVDo6aTE2LCBkbCwgQ2hhaW4sIFN0YWNrU2xvdCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworCisgIC8vIFRyYW5zZm9ybSBhcyBuZWNlc3NhcnkKKyAgU0RWYWx1ZSBDV0QxID0KKyAgICBEQUcuZ2V0Tm9kZShJU0Q6OlNSTCwgZGwsIE1WVDo6aTE2LAorICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTVZUOjppMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dELCBEQUcuZ2V0Q29uc3RhbnQoMHg4MDAsIE1WVDo6aTE2KSksCisgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDExLCBNVlQ6Omk4KSk7CisgIFNEVmFsdWUgQ1dEMiA9CisgICAgREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBNVlQ6OmkxNiwKKyAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIE1WVDo6aTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENXRCwgREFHLmdldENvbnN0YW50KDB4NDAwLCBNVlQ6OmkxNikpLAorICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCg5LCBNVlQ6Omk4KSk7CisKKyAgU0RWYWx1ZSBSZXRWYWwgPQorICAgIERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgTVZUOjppMTYsCisgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShJU0Q6Ok9SLCBkbCwgTVZUOjppMTYsIENXRDEsIENXRDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6OmkxNikpLAorICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgzLCBNVlQ6OmkxNikpOworCisKKyAgcmV0dXJuIERBRy5nZXROb2RlKChWVC5nZXRTaXplSW5CaXRzKCkgPCAxNiA/CisgICAgICAgICAgICAgICAgICAgICAgSVNEOjpUUlVOQ0FURSA6IElTRDo6WkVST19FWFRFTkQpLCBkbCwgVlQsIFJldFZhbCk7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ1RMWihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRVZUIE9wVlQgPSBWVDsKKyAgdW5zaWduZWQgTnVtQml0cyA9IFZULmdldFNpemVJbkJpdHMoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIE9wID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgaWYgKFZUID09IE1WVDo6aTgpIHsKKyAgICAvLyBaZXJvIGV4dGVuZCB0byBpMzIgc2luY2UgdGhlcmUgaXMgbm90IGFuIGk4IGJzci4KKyAgICBPcFZUID0gTVZUOjppMzI7CisgICAgT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBkbCwgT3BWVCwgT3ApOworICB9CisKKyAgLy8gSXNzdWUgYSBic3IgKHNjYW4gYml0cyBpbiByZXZlcnNlKSB3aGljaCBhbHNvIHNldHMgRUZMQUdTLgorICBTRFZUTGlzdCBWVHMgPSBEQUcuZ2V0VlRMaXN0KE9wVlQsIE1WVDo6aTMyKTsKKyAgT3AgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkJTUiwgZGwsIFZUcywgT3ApOworCisgIC8vIElmIHNyYyBpcyB6ZXJvIChpLmUuIGJzciBzZXRzIFpGKSwgcmV0dXJucyBOdW1CaXRzLgorICBTRFZhbHVlIE9wc1tdID0geworICAgIE9wLAorICAgIERBRy5nZXRDb25zdGFudChOdW1CaXRzK051bUJpdHMtMSwgT3BWVCksCisgICAgREFHLmdldENvbnN0YW50KFg4Njo6Q09ORF9FLCBNVlQ6Omk4KSwKKyAgICBPcC5nZXRWYWx1ZSgxKQorICB9OworICBPcCA9IERBRy5nZXROb2RlKFg4NklTRDo6Q01PViwgZGwsIE9wVlQsIE9wcywgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7CisKKyAgLy8gRmluYWxseSB4b3Igd2l0aCBOdW1CaXRzLTEuCisgIE9wID0gREFHLmdldE5vZGUoSVNEOjpYT1IsIGRsLCBPcFZULCBPcCwgREFHLmdldENvbnN0YW50KE51bUJpdHMtMSwgT3BWVCkpOworCisgIGlmIChWVCA9PSBNVlQ6Omk4KQorICAgIE9wID0gREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgZGwsIE1WVDo6aTgsIE9wKTsKKyAgcmV0dXJuIE9wOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlckNUVFooU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBPcFZUID0gVlQ7CisgIHVuc2lnbmVkIE51bUJpdHMgPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKworICBPcCA9IE9wLmdldE9wZXJhbmQoMCk7CisgIGlmIChWVCA9PSBNVlQ6Omk4KSB7CisgICAgT3BWVCA9IE1WVDo6aTMyOworICAgIE9wID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZGwsIE9wVlQsIE9wKTsKKyAgfQorCisgIC8vIElzc3VlIGEgYnNmIChzY2FuIGJpdHMgZm9yd2FyZCkgd2hpY2ggYWxzbyBzZXRzIEVGTEFHUy4KKyAgU0RWVExpc3QgVlRzID0gREFHLmdldFZUTGlzdChPcFZULCBNVlQ6OmkzMik7CisgIE9wID0gREFHLmdldE5vZGUoWDg2SVNEOjpCU0YsIGRsLCBWVHMsIE9wKTsKKworICAvLyBJZiBzcmMgaXMgemVybyAoaS5lLiBic2Ygc2V0cyBaRiksIHJldHVybnMgTnVtQml0cy4KKyAgU0RWYWx1ZSBPcHNbXSA9IHsKKyAgICBPcCwKKyAgICBEQUcuZ2V0Q29uc3RhbnQoTnVtQml0cywgT3BWVCksCisgICAgREFHLmdldENvbnN0YW50KFg4Njo6Q09ORF9FLCBNVlQ6Omk4KSwKKyAgICBPcC5nZXRWYWx1ZSgxKQorICB9OworICBPcCA9IERBRy5nZXROb2RlKFg4NklTRDo6Q01PViwgZGwsIE9wVlQsIE9wcywgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7CisKKyAgaWYgKFZUID09IE1WVDo6aTgpCisgICAgT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OlRSVU5DQVRFLCBkbCwgTVZUOjppOCwgT3ApOworICByZXR1cm4gT3A7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyTVVMX1YySTY0KFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBhc3NlcnQoVlQgPT0gTVZUOjp2Mmk2NCAmJiAiT25seSBrbm93IGhvdyB0byBsb3dlciBWMkk2NCBtdWx0aXBseSIpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgLy8gIHVsb25nMiBBaGkgPSBfX2J1aWx0aW5faWEzMl9wc3JscWkxMjgoIGEsIDMyKTsKKyAgLy8gIHVsb25nMiBCaGkgPSBfX2J1aWx0aW5faWEzMl9wc3JscWkxMjgoIGIsIDMyKTsKKyAgLy8gIHVsb25nMiBBbG9CbG8gPSBfX2J1aWx0aW5faWEzMl9wbXVsdWRxMTI4KCBhLCBiICk7CisgIC8vICB1bG9uZzIgQWxvQmhpID0gX19idWlsdGluX2lhMzJfcG11bHVkcTEyOCggYSwgQmhpICk7CisgIC8vICB1bG9uZzIgQWhpQmxvID0gX19idWlsdGluX2lhMzJfcG11bHVkcTEyOCggQWhpLCBiICk7CisgIC8vCisgIC8vICBBbG9CaGkgPSBfX2J1aWx0aW5faWEzMl9wc2xscWkxMjgoIEFsb0JoaSwgMzIgKTsKKyAgLy8gIEFoaUJsbyA9IF9fYnVpbHRpbl9pYTMyX3BzbGxxaTEyOCggQWhpQmxvLCAzMiApOworICAvLyAgcmV0dXJuIEFsb0JsbyArIEFsb0JoaSArIEFoaUJsbzsKKworICBTRFZhbHVlIEEgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIEIgPSBPcC5nZXRPcGVyYW5kKDEpOworCisgIFNEVmFsdWUgQWhpID0gREFHLmdldE5vZGUoSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4sIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEludHJpbnNpYzo6eDg2X3NzZTJfcHNybGlfcSwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICBBLCBEQUcuZ2V0Q29uc3RhbnQoMzIsIE1WVDo6aTMyKSk7CisgIFNEVmFsdWUgQmhpID0gREFHLmdldE5vZGUoSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4sIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEludHJpbnNpYzo6eDg2X3NzZTJfcHNybGlfcSwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICBCLCBEQUcuZ2V0Q29uc3RhbnQoMzIsIE1WVDo6aTMyKSk7CisgIFNEVmFsdWUgQWxvQmxvID0gREFHLmdldE5vZGUoSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4sIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEludHJpbnNpYzo6eDg2X3NzZTJfcG11bHVfZHEsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgQSwgQik7CisgIFNEVmFsdWUgQWxvQmhpID0gREFHLmdldE5vZGUoSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4sIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KEludHJpbnNpYzo6eDg2X3NzZTJfcG11bHVfZHEsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgQSwgQmhpKTsKKyAgU0RWYWx1ZSBBaGlCbG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSW50cmluc2ljOjp4ODZfc3NlMl9wbXVsdV9kcSwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICBBaGksIEIpOworICBBbG9CaGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV9xLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgIEFsb0JoaSwgREFHLmdldENvbnN0YW50KDMyLCBNVlQ6OmkzMikpOworICBBaGlCbG8gPSBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgZGwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV9xLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgIEFoaUJsbywgREFHLmdldENvbnN0YW50KDMyLCBNVlQ6OmkzMikpOworICBTRFZhbHVlIFJlcyA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgVlQsIEFsb0JsbywgQWxvQmhpKTsKKyAgUmVzID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBWVCwgUmVzLCBBaGlCbG8pOworICByZXR1cm4gUmVzOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlclNITChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBFVlQgVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIFIgPSBPcC5nZXRPcGVyYW5kKDApOworCisgIExMVk1Db250ZXh0ICpDb250ZXh0ID0gREFHLmdldENvbnRleHQoKTsKKworICBhc3NlcnQoU3VidGFyZ2V0LT5oYXNTU0U0MSgpICYmICJDYW5ub3QgbG93ZXIgU0hMIHdpdGhvdXQgU1NFNC4xIG9yIGxhdGVyIik7CisKKyAgaWYgKFZUID09IE1WVDo6djRpMzIpIHsKKyAgICBPcCA9IERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV9kLCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpLCBEQUcuZ2V0Q29uc3RhbnQoMjMsIE1WVDo6aTMyKSk7CisKKyAgICBDb25zdGFudEludCAqQ0kgPSBDb25zdGFudEludDo6Z2V0KCpDb250ZXh0LCBBUEludCgzMiwgMHgzZjgwMDAwMFUpKTsKKyAgICAKKyAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IENWKDQsIENJKTsKKyAgICBDb25zdGFudCAqQyA9IENvbnN0YW50VmVjdG9yOjpnZXQoQ1YpOworICAgIFNEVmFsdWUgQ1BJZHggPSBEQUcuZ2V0Q29uc3RhbnRQb29sKEMsIGdldFBvaW50ZXJUeSgpLCAxNik7CisgICAgU0RWYWx1ZSBBZGRlbmQgPSBEQUcuZ2V0TG9hZChWVCwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwgQ1BJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Q29uc3RhbnRQb29sKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDE2KTsKKworICAgIE9wID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBWVCwgT3AsIEFkZGVuZCk7CisgICAgT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBkbCwgTVZUOjp2NGYzMiwgT3ApOworICAgIE9wID0gREFHLmdldE5vZGUoSVNEOjpGUF9UT19TSU5ULCBkbCwgVlQsIE9wKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpNVUwsIGRsLCBWVCwgT3AsIFIpOworICB9CisgIGlmIChWVCA9PSBNVlQ6OnYxNmk4KSB7CisgICAgLy8gYSA9IGEgPDwgNTsKKyAgICBPcCA9IERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV93LCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpLCBEQUcuZ2V0Q29uc3RhbnQoNSwgTVZUOjppMzIpKTsKKworICAgIENvbnN0YW50SW50ICpDTTEgPSBDb25zdGFudEludDo6Z2V0KCpDb250ZXh0LCBBUEludCg4LCAxNSkpOworICAgIENvbnN0YW50SW50ICpDTTIgPSBDb25zdGFudEludDo6Z2V0KCpDb250ZXh0LCBBUEludCg4LCA2MykpOworCisgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDVk0xKDE2LCBDTTEpOworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gQ1ZNMigxNiwgQ00yKTsKKyAgICBDb25zdGFudCAqQyA9IENvbnN0YW50VmVjdG9yOjpnZXQoQ1ZNMSk7CisgICAgU0RWYWx1ZSBDUElkeCA9IERBRy5nZXRDb25zdGFudFBvb2woQywgZ2V0UG9pbnRlclR5KCksIDE2KTsKKyAgICBTRFZhbHVlIE0gPSBEQUcuZ2V0TG9hZChWVCwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwgQ1BJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldENvbnN0YW50UG9vbCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMTYpOworCisgICAgLy8gciA9IHBibGVuZHYociwgcHNsbHcociAmIChjaGFyMTYpMTUsIDQpLCBhKTsKKyAgICBNID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBWVCwgUiwgTSk7CisgICAgTSA9IERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxpX3csIE1WVDo6aTMyKSwgTSwKKyAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDQsIE1WVDo6aTMyKSk7CisgICAgUiA9IERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wYmxlbmR2YiwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICBSLCBNLCBPcCk7CisgICAgLy8gYSArPSBhCisgICAgT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFZULCBPcCwgT3ApOworICAgIAorICAgIEMgPSBDb25zdGFudFZlY3Rvcjo6Z2V0KENWTTIpOworICAgIENQSWR4ID0gREFHLmdldENvbnN0YW50UG9vbChDLCBnZXRQb2ludGVyVHkoKSwgMTYpOworICAgIE0gPSBEQUcuZ2V0TG9hZChWVCwgZGwsIERBRy5nZXRFbnRyeU5vZGUoKSwgQ1BJZHgsCisgICAgICAgICAgICAgICAgICAgIFBzZXVkb1NvdXJjZVZhbHVlOjpnZXRDb25zdGFudFBvb2woKSwgMCwgZmFsc2UsIGZhbHNlLCAxNik7CisgICAgCisgICAgLy8gciA9IHBibGVuZHYociwgcHNsbHcociAmIChjaGFyMTYpNjMsIDIpLCBhKTsKKyAgICBNID0gREFHLmdldE5vZGUoSVNEOjpBTkQsIGRsLCBWVCwgUiwgTSk7CisgICAgTSA9IERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxpX3csIE1WVDo6aTMyKSwgTSwKKyAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDIsIE1WVDo6aTMyKSk7CisgICAgUiA9IERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wYmxlbmR2YiwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICBSLCBNLCBPcCk7CisgICAgLy8gYSArPSBhCisgICAgT3AgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFZULCBPcCwgT3ApOworICAgIAorICAgIC8vIHJldHVybiBwYmxlbmR2KHIsIHIrciwgYSk7CisgICAgUiA9IERBRy5nZXROb2RlKElTRDo6SU5UUklOU0lDX1dPX0NIQUlOLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wYmxlbmR2YiwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICBSLCBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFZULCBSLCBSKSwgT3ApOworICAgIHJldHVybiBSOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyWEFMVU8oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgLy8gTG93ZXIgdGhlICJhZGQvc3ViL211bCB3aXRoIG92ZXJmbG93IiBpbnN0cnVjdGlvbiBpbnRvIGEgcmVndWxhciBpbnMgcGx1cworICAvLyBhICJzZXRjYyIgaW5zdHJ1Y3Rpb24gdGhhdCBjaGVja3MgdGhlIG92ZXJmbG93IGZsYWcuIFRoZSAiYnJjb25kIiBsb3dlcmluZworICAvLyBsb29rcyBmb3IgdGhpcyBjb21ibyBhbmQgbWF5IHJlbW92ZSB0aGUgInNldGNjIiBpbnN0cnVjdGlvbiBpZiB0aGUgInNldGNjIgorICAvLyBoYXMgb25seSBvbmUgdXNlLgorICBTRE5vZGUgKk4gPSBPcC5nZXROb2RlKCk7CisgIFNEVmFsdWUgTEhTID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBSSFMgPSBOLT5nZXRPcGVyYW5kKDEpOworICB1bnNpZ25lZCBCYXNlT3AgPSAwOworICB1bnNpZ25lZCBDb25kID0gMDsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworCisgIHN3aXRjaCAoT3AuZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBvdmYgaW5zdHJ1Y3Rpb24hIik7CisgIGNhc2UgSVNEOjpTQURETzoKKyAgICAvLyBBIHN1YnRyYWN0IG9mIG9uZSB3aWxsIGJlIHNlbGVjdGVkIGFzIGEgSU5DLiBOb3RlIHRoYXQgSU5DIGRvZXNuJ3QKKyAgICAvLyBzZXQgQ0YsIHNvIHdlIGNhbid0IGRvIHRoaXMgZm9yIFVBRERPLgorICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcCkpCisgICAgICBpZiAoQy0+Z2V0QVBJbnRWYWx1ZSgpID09IDEpIHsKKyAgICAgICAgQmFzZU9wID0gWDg2SVNEOjpJTkM7CisgICAgICAgIENvbmQgPSBYODY6OkNPTkRfTzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgQmFzZU9wID0gWDg2SVNEOjpBREQ7CisgICAgQ29uZCA9IFg4Njo6Q09ORF9POworICAgIGJyZWFrOworICBjYXNlIElTRDo6VUFERE86CisgICAgQmFzZU9wID0gWDg2SVNEOjpBREQ7CisgICAgQ29uZCA9IFg4Njo6Q09ORF9COworICAgIGJyZWFrOworICBjYXNlIElTRDo6U1NVQk86CisgICAgLy8gQSBzdWJ0cmFjdCBvZiBvbmUgd2lsbCBiZSBzZWxlY3RlZCBhcyBhIERFQy4gTm90ZSB0aGF0IERFQyBkb2Vzbid0CisgICAgLy8gc2V0IENGLCBzbyB3ZSBjYW4ndCBkbyB0aGlzIGZvciBVU1VCTy4KKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3ApKQorICAgICAgaWYgKEMtPmdldEFQSW50VmFsdWUoKSA9PSAxKSB7CisgICAgICAgIEJhc2VPcCA9IFg4NklTRDo6REVDOworICAgICAgICBDb25kID0gWDg2OjpDT05EX087CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIEJhc2VPcCA9IFg4NklTRDo6U1VCOworICAgIENvbmQgPSBYODY6OkNPTkRfTzsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlVTVUJPOgorICAgIEJhc2VPcCA9IFg4NklTRDo6U1VCOworICAgIENvbmQgPSBYODY6OkNPTkRfQjsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNNVUxPOgorICAgIEJhc2VPcCA9IFg4NklTRDo6U01VTDsKKyAgICBDb25kID0gWDg2OjpDT05EX087CisgICAgYnJlYWs7CisgIGNhc2UgSVNEOjpVTVVMTzoKKyAgICBCYXNlT3AgPSBYODZJU0Q6OlVNVUw7CisgICAgQ29uZCA9IFg4Njo6Q09ORF9COworICAgIGJyZWFrOworICB9CisKKyAgLy8gQWxzbyBzZXRzIEVGTEFHUy4KKyAgU0RWVExpc3QgVlRzID0gREFHLmdldFZUTGlzdChOLT5nZXRWYWx1ZVR5cGUoMCksIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBTdW0gPSBEQUcuZ2V0Tm9kZShCYXNlT3AsIGRsLCBWVHMsIExIUywgUkhTKTsKKworICBTRFZhbHVlIFNldENDID0KKyAgICBEQUcuZ2V0Tm9kZShYODZJU0Q6OlNFVENDLCBkbCwgTi0+Z2V0VmFsdWVUeXBlKDEpLAorICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChDb25kLCBNVlQ6OmkzMiksIFNEVmFsdWUoU3VtLmdldE5vZGUoKSwgMSkpOworCisgIERBRy5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUoTiwgMSksIFNldENDKTsKKyAgcmV0dXJuIFN1bTsKK30KKworU0RWYWx1ZSBYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJNRU1CQVJSSUVSKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdHsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICAKKyAgaWYgKCFTdWJ0YXJnZXQtPmhhc1NTRTIoKSkgeworICAgIFNEVmFsdWUgWmVybyA9IERBRy5nZXRDb25zdGFudCgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0YXJnZXQtPmlzNjRCaXQoKSA/IE1WVDo6aTY0IDogTVZUOjppMzIpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShYODZJU0Q6Ok1FTUJBUlJJRVIsIGRsLCBNVlQ6Ok90aGVyLCBPcC5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICBaZXJvKTsKKyAgfQorICAKKyAgdW5zaWduZWQgaXNEZXYgPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDUpKS0+Z2V0WkV4dFZhbHVlKCk7CisgIGlmKCFpc0RldikKKyAgICByZXR1cm4gREFHLmdldE5vZGUoWDg2SVNEOjpNRU1CQVJSSUVSLCBkbCwgTVZUOjpPdGhlciwgT3AuZ2V0T3BlcmFuZCgwKSk7CisgIGVsc2UgeworICAgIHVuc2lnbmVkIE9wMSA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICB1bnNpZ25lZCBPcDIgPSBjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDIpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgdW5zaWduZWQgT3AzID0gY2FzdDxDb25zdGFudFNETm9kZT4oT3AuZ2V0T3BlcmFuZCgzKSktPmdldFpFeHRWYWx1ZSgpOworICAgIHVuc2lnbmVkIE9wNCA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoNCkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAKKyAgICAvLyBkZWYgOiBQYXQ8KG1lbWJhcnJpZXIgKGk4IDApLCAoaTggMCksIChpOCAwKSwgKGk4IDEpLCAoaTggMSkpLCAoU0ZFTkNFKT47CisgICAgaWYgKCFPcDEgJiYgIU9wMiAmJiAhT3AzICYmIE9wNCkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShYODZJU0Q6OlNGRU5DRSwgZGwsIE1WVDo6T3RoZXIsIE9wLmdldE9wZXJhbmQoMCkpOworICAgIAorICAgIC8vIGRlZiA6IFBhdDwobWVtYmFycmllciAoaTggMSksIChpOCAwKSwgKGk4IDApLCAoaTggMCksIChpOCAxKSksIChMRkVOQ0UpPjsKKyAgICBpZiAoT3AxICYmICFPcDIgJiYgIU9wMyAmJiAhT3A0KQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKFg4NklTRDo6TEZFTkNFLCBkbCwgTVZUOjpPdGhlciwgT3AuZ2V0T3BlcmFuZCgwKSk7CisgICAgCisgICAgLy8gZGVmIDogUGF0PChtZW1iYXJyaWVyIChpOCBpbW0pLCAoaTggaW1tKSwgKGk4IGltbSksIChpOCBpbW0pLCAoaTggMSkpLCAKKyAgICAvLyAgICAgICAgICAgKE1GRU5DRSk+OworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShYODZJU0Q6Ok1GRU5DRSwgZGwsIE1WVDo6T3RoZXIsIE9wLmdldE9wZXJhbmQoMCkpOworICB9Cit9CisKK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ01QX1NXQVAoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgRVZUIFQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICB1bnNpZ25lZCBSZWcgPSAwOworICB1bnNpZ25lZCBzaXplID0gMDsKKyAgc3dpdGNoKFQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICBkZWZhdWx0OgorICAgIGFzc2VydChmYWxzZSAmJiAiSW52YWxpZCB2YWx1ZSB0eXBlISIpOworICBjYXNlIE1WVDo6aTg6ICBSZWcgPSBYODY6OkFMOyAgc2l6ZSA9IDE7IGJyZWFrOworICBjYXNlIE1WVDo6aTE2OiBSZWcgPSBYODY6OkFYOyAgc2l6ZSA9IDI7IGJyZWFrOworICBjYXNlIE1WVDo6aTMyOiBSZWcgPSBYODY6OkVBWDsgc2l6ZSA9IDQ7IGJyZWFrOworICBjYXNlIE1WVDo6aTY0OgorICAgIGFzc2VydChTdWJ0YXJnZXQtPmlzNjRCaXQoKSAmJiAiTm9kZSBub3QgdHlwZSBsZWdhbCEiKTsKKyAgICBSZWcgPSBYODY6OlJBWDsgc2l6ZSA9IDg7CisgICAgYnJlYWs7CisgIH0KKyAgU0RWYWx1ZSBjcEluID0gREFHLmdldENvcHlUb1JlZyhPcC5nZXRPcGVyYW5kKDApLCBkbCwgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgyKSwgU0RWYWx1ZSgpKTsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgY3BJbi5nZXRWYWx1ZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgT3AuZ2V0T3BlcmFuZCgzKSwKKyAgICAgICAgICAgICAgICAgICAgREFHLmdldFRhcmdldENvbnN0YW50KHNpemUsIE1WVDo6aTgpLAorICAgICAgICAgICAgICAgICAgICBjcEluLmdldFZhbHVlKDEpIH07CisgIFNEVlRMaXN0IFR5cyA9IERBRy5nZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKyAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkxDTVBYQ0hHX0RBRywgZGwsIFR5cywgT3BzLCA1KTsKKyAgU0RWYWx1ZSBjcE91dCA9CisgICAgREFHLmdldENvcHlGcm9tUmVnKFJlc3VsdC5nZXRWYWx1ZSgwKSwgZGwsIFJlZywgVCwgUmVzdWx0LmdldFZhbHVlKDEpKTsKKyAgcmV0dXJuIGNwT3V0OworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlclJFQURDWUNMRUNPVU5URVIoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBhc3NlcnQoU3VidGFyZ2V0LT5pczY0Qml0KCkgJiYgIlJlc3VsdCBub3QgdHlwZSBsZWdhbGl6ZWQ/Iik7CisgIFNEVlRMaXN0IFR5cyA9IERBRy5nZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKyAgU0RWYWx1ZSBUaGVDaGFpbiA9IE9wLmdldE9wZXJhbmQoMCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSByZCA9IERBRy5nZXROb2RlKFg4NklTRDo6UkRUU0NfREFHLCBkbCwgVHlzLCAmVGhlQ2hhaW4sIDEpOworICBTRFZhbHVlIHJheCA9IERBRy5nZXRDb3B5RnJvbVJlZyhyZCwgZGwsIFg4Njo6UkFYLCBNVlQ6Omk2NCwgcmQuZ2V0VmFsdWUoMSkpOworICBTRFZhbHVlIHJkeCA9IERBRy5nZXRDb3B5RnJvbVJlZyhyYXguZ2V0VmFsdWUoMSksIGRsLCBYODY6OlJEWCwgTVZUOjppNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheC5nZXRWYWx1ZSgyKSk7CisgIFNEVmFsdWUgVG1wID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBNVlQ6Omk2NCwgcmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgzMiwgTVZUOjppOCkpOworICBTRFZhbHVlIE9wc1tdID0geworICAgIERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBNVlQ6Omk2NCwgcmF4LCBUbXApLAorICAgIHJkeC5nZXRWYWx1ZSgxKQorICB9OworICByZXR1cm4gREFHLmdldE1lcmdlVmFsdWVzKE9wcywgMiwgZGwpOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlckJJVF9DT05WRVJUKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIEVWVCBTcmNWVCA9IE9wLmdldE9wZXJhbmQoMCkuZ2V0VmFsdWVUeXBlKCk7CisgIEVWVCBEc3RWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBhc3NlcnQoKFN1YnRhcmdldC0+aXM2NEJpdCgpICYmICFTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAKKyAgICAgICAgICBTdWJ0YXJnZXQtPmhhc01NWCgpICYmICFEaXNhYmxlTU1YKSAmJgorICAgICAgICAgIlVuZXhwZWN0ZWQgY3VzdG9tIEJJVF9DT05WRVJUIik7CisgIGFzc2VydCgoRHN0VlQgPT0gTVZUOjppNjQgfHwgCisgICAgICAgICAgKERzdFZULmlzVmVjdG9yKCkgJiYgRHN0VlQuZ2V0U2l6ZUluQml0cygpPT02NCkpICYmCisgICAgICAgICAiVW5leHBlY3RlZCBjdXN0b20gQklUX0NPTlZFUlQiKTsKKyAgLy8gaTY0IDw9PiBNTVggY29udmVyc2lvbnMgYXJlIExlZ2FsLgorICBpZiAoU3JjVlQ9PU1WVDo6aTY0ICYmIERzdFZULmlzVmVjdG9yKCkpCisgICAgcmV0dXJuIE9wOworICBpZiAoRHN0VlQ9PU1WVDo6aTY0ICYmIFNyY1ZULmlzVmVjdG9yKCkpCisgICAgcmV0dXJuIE9wOworICAvLyBNTVggPD0+IE1NWCBjb252ZXJzaW9ucyBhcmUgTGVnYWwuCisgIGlmIChTcmNWVC5pc1ZlY3RvcigpICYmIERzdFZULmlzVmVjdG9yKCkpCisgICAgcmV0dXJuIE9wOworICAvLyBBbGwgb3RoZXIgY29udmVyc2lvbnMgbmVlZCB0byBiZSBleHBhbmRlZC4KKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KK1NEVmFsdWUgWDg2VGFyZ2V0TG93ZXJpbmc6Okxvd2VyTE9BRF9TVUIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0ROb2RlICpOb2RlID0gT3AuZ2V0Tm9kZSgpOworICBEZWJ1Z0xvYyBkbCA9IE5vZGUtPmdldERlYnVnTG9jKCk7CisgIEVWVCBUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICBTRFZhbHVlIG5lZ09wID0gREFHLmdldE5vZGUoSVNEOjpTVUIsIGRsLCBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIFQpLCBOb2RlLT5nZXRPcGVyYW5kKDIpKTsKKyAgcmV0dXJuIERBRy5nZXRBdG9taWMoSVNEOjpBVE9NSUNfTE9BRF9BREQsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0PEF0b21pY1NETm9kZT4oTm9kZSktPmdldE1lbW9yeVZUKCksCisgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldE9wZXJhbmQoMSksIG5lZ09wLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0PEF0b21pY1NETm9kZT4oTm9kZSktPmdldFNyY1ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8QXRvbWljU0ROb2RlPihOb2RlKS0+Z2V0QWxpZ25tZW50KCkpOworfQorCisvLy8gTG93ZXJPcGVyYXRpb24gLSBQcm92aWRlIGN1c3RvbSBsb3dlcmluZyBob29rcyBmb3Igc29tZSBvcGVyYXRpb25zLgorLy8vCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBzd2l0Y2ggKE9wLmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlNob3VsZCBub3QgY3VzdG9tIGxvd2VyIHRoaXMhIik7CisgIGNhc2UgSVNEOjpNRU1CQVJSSUVSOiAgICAgICAgIHJldHVybiBMb3dlck1FTUJBUlJJRVIoT3AsREFHKTsKKyAgY2FzZSBJU0Q6OkFUT01JQ19DTVBfU1dBUDogICAgcmV0dXJuIExvd2VyQ01QX1NXQVAoT3AsREFHKTsKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1NVQjogICAgcmV0dXJuIExvd2VyTE9BRF9TVUIoT3AsREFHKTsKKyAgY2FzZSBJU0Q6OkJVSUxEX1ZFQ1RPUjogICAgICAgcmV0dXJuIExvd2VyQlVJTERfVkVDVE9SKE9wLCBEQUcpOworICBjYXNlIElTRDo6Q09OQ0FUX1ZFQ1RPUlM6ICAgICByZXR1cm4gTG93ZXJDT05DQVRfVkVDVE9SUyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlZFQ1RPUl9TSFVGRkxFOiAgICAgcmV0dXJuIExvd2VyVkVDVE9SX1NIVUZGTEUoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQ6IHJldHVybiBMb3dlckVYVFJBQ1RfVkVDVE9SX0VMVChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OklOU0VSVF9WRUNUT1JfRUxUOiAgcmV0dXJuIExvd2VySU5TRVJUX1ZFQ1RPUl9FTFQoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpTQ0FMQVJfVE9fVkVDVE9SOiAgIHJldHVybiBMb3dlclNDQUxBUl9UT19WRUNUT1IoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpDb25zdGFudFBvb2w6ICAgICAgIHJldHVybiBMb3dlckNvbnN0YW50UG9vbChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6Okdsb2JhbEFkZHJlc3M6ICAgICAgcmV0dXJuIExvd2VyR2xvYmFsQWRkcmVzcyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6Okdsb2JhbFRMU0FkZHJlc3M6ICAgcmV0dXJuIExvd2VyR2xvYmFsVExTQWRkcmVzcyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkV4dGVybmFsU3ltYm9sOiAgICAgcmV0dXJuIExvd2VyRXh0ZXJuYWxTeW1ib2woT3AsIERBRyk7CisgIGNhc2UgSVNEOjpCbG9ja0FkZHJlc3M6ICAgICAgIHJldHVybiBMb3dlckJsb2NrQWRkcmVzcyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlNITF9QQVJUUzoKKyAgY2FzZSBJU0Q6OlNSQV9QQVJUUzoKKyAgY2FzZSBJU0Q6OlNSTF9QQVJUUzogICAgICAgICAgcmV0dXJuIExvd2VyU2hpZnQoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpTSU5UX1RPX0ZQOiAgICAgICAgIHJldHVybiBMb3dlclNJTlRfVE9fRlAoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpVSU5UX1RPX0ZQOiAgICAgICAgIHJldHVybiBMb3dlclVJTlRfVE9fRlAoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpGUF9UT19TSU5UOiAgICAgICAgIHJldHVybiBMb3dlckZQX1RPX1NJTlQoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpGUF9UT19VSU5UOiAgICAgICAgIHJldHVybiBMb3dlckZQX1RPX1VJTlQoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpGQUJTOiAgICAgICAgICAgICAgIHJldHVybiBMb3dlckZBQlMoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpGTkVHOiAgICAgICAgICAgICAgIHJldHVybiBMb3dlckZORUcoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpGQ09QWVNJR046ICAgICAgICAgIHJldHVybiBMb3dlckZDT1BZU0lHTihPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlNFVENDOiAgICAgICAgICAgICAgcmV0dXJuIExvd2VyU0VUQ0MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpWU0VUQ0M6ICAgICAgICAgICAgIHJldHVybiBMb3dlclZTRVRDQyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlNFTEVDVDogICAgICAgICAgICAgcmV0dXJuIExvd2VyU0VMRUNUKE9wLCBEQUcpOworICBjYXNlIElTRDo6QlJDT05EOiAgICAgICAgICAgICByZXR1cm4gTG93ZXJCUkNPTkQoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpKdW1wVGFibGU6ICAgICAgICAgIHJldHVybiBMb3dlckp1bXBUYWJsZShPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlZBU1RBUlQ6ICAgICAgICAgICAgcmV0dXJuIExvd2VyVkFTVEFSVChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlZBQVJHOiAgICAgICAgICAgICAgcmV0dXJuIExvd2VyVkFBUkcoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpWQUNPUFk6ICAgICAgICAgICAgIHJldHVybiBMb3dlclZBQ09QWShPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OklOVFJJTlNJQ19XT19DSEFJTjogcmV0dXJuIExvd2VySU5UUklOU0lDX1dPX0NIQUlOKE9wLCBEQUcpOworICBjYXNlIElTRDo6UkVUVVJOQUREUjogICAgICAgICByZXR1cm4gTG93ZXJSRVRVUk5BRERSKE9wLCBEQUcpOworICBjYXNlIElTRDo6RlJBTUVBRERSOiAgICAgICAgICByZXR1cm4gTG93ZXJGUkFNRUFERFIoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpGUkFNRV9UT19BUkdTX09GRlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExvd2VyRlJBTUVfVE9fQVJHU19PRkZTRVQoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0M6IHJldHVybiBMb3dlckRZTkFNSUNfU1RBQ0tBTExPQyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlRSQU1QT0xJTkU6ICAgICAgICAgcmV0dXJuIExvd2VyVFJBTVBPTElORShPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OkZMVF9ST1VORFNfOiAgICAgICAgcmV0dXJuIExvd2VyRkxUX1JPVU5EU18oT3AsIERBRyk7CisgIGNhc2UgSVNEOjpDVExaOiAgICAgICAgICAgICAgIHJldHVybiBMb3dlckNUTFooT3AsIERBRyk7CisgIGNhc2UgSVNEOjpDVFRaOiAgICAgICAgICAgICAgIHJldHVybiBMb3dlckNUVFooT3AsIERBRyk7CisgIGNhc2UgSVNEOjpNVUw6ICAgICAgICAgICAgICAgIHJldHVybiBMb3dlck1VTF9WMkk2NChPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlNITDogICAgICAgICAgICAgICAgcmV0dXJuIExvd2VyU0hMKE9wLCBEQUcpOworICBjYXNlIElTRDo6U0FERE86CisgIGNhc2UgSVNEOjpVQURETzoKKyAgY2FzZSBJU0Q6OlNTVUJPOgorICBjYXNlIElTRDo6VVNVQk86CisgIGNhc2UgSVNEOjpTTVVMTzoKKyAgY2FzZSBJU0Q6OlVNVUxPOiAgICAgICAgICAgICAgcmV0dXJuIExvd2VyWEFMVU8oT3AsIERBRyk7CisgIGNhc2UgSVNEOjpSRUFEQ1lDTEVDT1VOVEVSOiAgIHJldHVybiBMb3dlclJFQURDWUNMRUNPVU5URVIoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDogICAgICAgIHJldHVybiBMb3dlckJJVF9DT05WRVJUKE9wLCBEQUcpOworICB9Cit9CisKK3ZvaWQgWDg2VGFyZ2V0TG93ZXJpbmc6OgorUmVwbGFjZUFUT01JQ19CSU5BUllfNjQoU0ROb2RlICpOb2RlLCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4mUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLCB1bnNpZ25lZCBOZXdPcCkgY29uc3QgeworICBFVlQgVCA9IE5vZGUtPmdldFZhbHVlVHlwZSgwKTsKKyAgRGVidWdMb2MgZGwgPSBOb2RlLT5nZXREZWJ1Z0xvYygpOworICBhc3NlcnQgKFQgPT0gTVZUOjppNjQgJiYgIk9ubHkga25vdyBob3cgdG8gZXhwYW5kIGk2NCBhdG9taWNzIik7CisKKyAgU0RWYWx1ZSBDaGFpbiA9IE5vZGUtPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgSW4xID0gTm9kZS0+Z2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBJbjJMID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0T3BlcmFuZCgyKSwgREFHLmdldEludFB0ckNvbnN0YW50KDApKTsKKyAgU0RWYWx1ZSBJbjJIID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0T3BlcmFuZCgyKSwgREFHLmdldEludFB0ckNvbnN0YW50KDEpKTsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgQ2hhaW4sIEluMSwgSW4yTCwgSW4ySCB9OworICBTRFZUTGlzdCBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6aTMyLCBNVlQ6OmkzMiwgTVZUOjpPdGhlcik7CisgIFNEVmFsdWUgUmVzdWx0ID0KKyAgICBEQUcuZ2V0TWVtSW50cmluc2ljTm9kZShOZXdPcCwgZGwsIFR5cywgT3BzLCA0LCBNVlQ6Omk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PE1lbVNETm9kZT4oTm9kZSktPmdldE1lbU9wZXJhbmQoKSk7CisgIFNEVmFsdWUgT3BzRltdID0geyBSZXN1bHQuZ2V0VmFsdWUoMCksIFJlc3VsdC5nZXRWYWx1ZSgxKX07CisgIFJlc3VsdHMucHVzaF9iYWNrKERBRy5nZXROb2RlKElTRDo6QlVJTERfUEFJUiwgZGwsIE1WVDo6aTY0LCBPcHNGLCAyKSk7CisgIFJlc3VsdHMucHVzaF9iYWNrKFJlc3VsdC5nZXRWYWx1ZSgyKSk7Cit9CisKKy8vLyBSZXBsYWNlTm9kZVJlc3VsdHMgLSBSZXBsYWNlIGEgbm9kZSB3aXRoIGFuIGlsbGVnYWwgcmVzdWx0IHR5cGUKKy8vLyB3aXRoIGEgbmV3IG5vZGUgYnVpbHQgb3V0IG9mIGN1c3RvbSBjb2RlLgordm9pZCBYODZUYXJnZXRMb3dlcmluZzo6UmVwbGFjZU5vZGVSZXN1bHRzKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4mUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoZmFsc2UgJiYgIkRvIG5vdCBrbm93IGhvdyB0byBjdXN0b20gdHlwZSBsZWdhbGl6ZSB0aGlzIG9wZXJhdGlvbiEiKTsKKyAgICByZXR1cm47CisgIGNhc2UgSVNEOjpGUF9UT19TSU5UOiB7CisgICAgc3RkOjpwYWlyPFNEVmFsdWUsU0RWYWx1ZT4gVmFscyA9CisgICAgICAgIEZQX1RPX0lOVEhlbHBlcihTRFZhbHVlKE4sIDApLCBEQUcsIHRydWUpOworICAgIFNEVmFsdWUgRklTVCA9IFZhbHMuZmlyc3QsIFN0YWNrU2xvdCA9IFZhbHMuc2Vjb25kOworICAgIGlmIChGSVNULmdldE5vZGUoKSAhPSAwKSB7CisgICAgICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgICAgICAvLyBSZXR1cm4gYSBsb2FkIGZyb20gdGhlIHN0YWNrIHNsb3QuCisgICAgICBSZXN1bHRzLnB1c2hfYmFjayhEQUcuZ2V0TG9hZChWVCwgZGwsIEZJU1QsIFN0YWNrU2xvdCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCkpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSBJU0Q6OlJFQURDWUNMRUNPVU5URVI6IHsKKyAgICBTRFZUTGlzdCBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgICAgU0RWYWx1ZSBUaGVDaGFpbiA9IE4tPmdldE9wZXJhbmQoMCk7CisgICAgU0RWYWx1ZSByZCA9IERBRy5nZXROb2RlKFg4NklTRDo6UkRUU0NfREFHLCBkbCwgVHlzLCAmVGhlQ2hhaW4sIDEpOworICAgIFNEVmFsdWUgZWF4ID0gREFHLmdldENvcHlGcm9tUmVnKHJkLCBkbCwgWDg2OjpFQVgsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJkLmdldFZhbHVlKDEpKTsKKyAgICBTRFZhbHVlIGVkeCA9IERBRy5nZXRDb3B5RnJvbVJlZyhlYXguZ2V0VmFsdWUoMSksIGRsLCBYODY6OkVEWCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF4LmdldFZhbHVlKDIpKTsKKyAgICAvLyBVc2UgYSBidWlsZHBhaXIgdG8gbWVyZ2UgdGhlIHR3byAzMi1iaXQgdmFsdWVzIGludG8gYSA2NC1iaXQgb25lLgorICAgIFNEVmFsdWUgT3BzW10gPSB7IGVheCwgZWR4IH07CisgICAgUmVzdWx0cy5wdXNoX2JhY2soREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgTVZUOjppNjQsIE9wcywgMikpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKGVkeC5nZXRWYWx1ZSgxKSk7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSVNEOjpBVE9NSUNfQ01QX1NXQVA6IHsKKyAgICBFVlQgVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgICBhc3NlcnQgKFQgPT0gTVZUOjppNjQgJiYgIk9ubHkga25vdyBob3cgdG8gZXhwYW5kIGk2NCBDbXAgYW5kIFN3YXAiKTsKKyAgICBTRFZhbHVlIGNwSW5MLCBjcEluSDsKKyAgICBjcEluTCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsIE4tPmdldE9wZXJhbmQoMiksCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpKTsKKyAgICBjcEluSCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsIE4tPmdldE9wZXJhbmQoMiksCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgTVZUOjppMzIpKTsKKyAgICBjcEluTCA9IERBRy5nZXRDb3B5VG9SZWcoTi0+Z2V0T3BlcmFuZCgwKSwgZGwsIFg4Njo6RUFYLCBjcEluTCwgU0RWYWx1ZSgpKTsKKyAgICBjcEluSCA9IERBRy5nZXRDb3B5VG9SZWcoY3BJbkwuZ2V0VmFsdWUoMCksIGRsLCBYODY6OkVEWCwgY3BJbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwSW5MLmdldFZhbHVlKDEpKTsKKyAgICBTRFZhbHVlIHN3YXBJbkwsIHN3YXBJbkg7CisgICAgc3dhcEluTCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsIE4tPmdldE9wZXJhbmQoMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgwLCBNVlQ6OmkzMikpOworICAgIHN3YXBJbkggPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE1WVDo6aTMyLCBOLT5nZXRPcGVyYW5kKDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgTVZUOjppMzIpKTsKKyAgICBzd2FwSW5MID0gREFHLmdldENvcHlUb1JlZyhjcEluSC5nZXRWYWx1ZSgwKSwgZGwsIFg4Njo6RUJYLCBzd2FwSW5MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwSW5ILmdldFZhbHVlKDEpKTsKKyAgICBzd2FwSW5IID0gREFHLmdldENvcHlUb1JlZyhzd2FwSW5MLmdldFZhbHVlKDApLCBkbCwgWDg2OjpFQ1gsIHN3YXBJbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcEluTC5nZXRWYWx1ZSgxKSk7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgc3dhcEluSC5nZXRWYWx1ZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgIHN3YXBJbkguZ2V0VmFsdWUoMSkgfTsKKyAgICBTRFZUTGlzdCBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgICAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OkxDTVBYQ0hHOF9EQUcsIGRsLCBUeXMsIE9wcywgMyk7CisgICAgU0RWYWx1ZSBjcE91dEwgPSBEQUcuZ2V0Q29weUZyb21SZWcoUmVzdWx0LmdldFZhbHVlKDApLCBkbCwgWDg2OjpFQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIsIFJlc3VsdC5nZXRWYWx1ZSgxKSk7CisgICAgU0RWYWx1ZSBjcE91dEggPSBEQUcuZ2V0Q29weUZyb21SZWcoY3BPdXRMLmdldFZhbHVlKDEpLCBkbCwgWDg2OjpFRFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMzIsIGNwT3V0TC5nZXRWYWx1ZSgyKSk7CisgICAgU0RWYWx1ZSBPcHNGW10gPSB7IGNwT3V0TC5nZXRWYWx1ZSgwKSwgY3BPdXRILmdldFZhbHVlKDApfTsKKyAgICBSZXN1bHRzLnB1c2hfYmFjayhEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1BBSVIsIGRsLCBNVlQ6Omk2NCwgT3BzRiwgMikpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKGNwT3V0SC5nZXRWYWx1ZSgxKSk7CisgICAgcmV0dXJuOworICB9CisgIGNhc2UgSVNEOjpBVE9NSUNfTE9BRF9BREQ6CisgICAgUmVwbGFjZUFUT01JQ19CSU5BUllfNjQoTiwgUmVzdWx0cywgREFHLCBYODZJU0Q6OkFUT01BREQ2NF9EQUcpOworICAgIHJldHVybjsKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX0FORDoKKyAgICBSZXBsYWNlQVRPTUlDX0JJTkFSWV82NChOLCBSZXN1bHRzLCBEQUcsIFg4NklTRDo6QVRPTUFORDY0X0RBRyk7CisgICAgcmV0dXJuOworICBjYXNlIElTRDo6QVRPTUlDX0xPQURfTkFORDoKKyAgICBSZXBsYWNlQVRPTUlDX0JJTkFSWV82NChOLCBSZXN1bHRzLCBEQUcsIFg4NklTRDo6QVRPTU5BTkQ2NF9EQUcpOworICAgIHJldHVybjsKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX09SOgorICAgIFJlcGxhY2VBVE9NSUNfQklOQVJZXzY0KE4sIFJlc3VsdHMsIERBRywgWDg2SVNEOjpBVE9NT1I2NF9EQUcpOworICAgIHJldHVybjsKKyAgY2FzZSBJU0Q6OkFUT01JQ19MT0FEX1NVQjoKKyAgICBSZXBsYWNlQVRPTUlDX0JJTkFSWV82NChOLCBSZXN1bHRzLCBEQUcsIFg4NklTRDo6QVRPTVNVQjY0X0RBRyk7CisgICAgcmV0dXJuOworICBjYXNlIElTRDo6QVRPTUlDX0xPQURfWE9SOgorICAgIFJlcGxhY2VBVE9NSUNfQklOQVJZXzY0KE4sIFJlc3VsdHMsIERBRywgWDg2SVNEOjpBVE9NWE9SNjRfREFHKTsKKyAgICByZXR1cm47CisgIGNhc2UgSVNEOjpBVE9NSUNfU1dBUDoKKyAgICBSZXBsYWNlQVRPTUlDX0JJTkFSWV82NChOLCBSZXN1bHRzLCBEQUcsIFg4NklTRDo6QVRPTVNXQVA2NF9EQUcpOworICAgIHJldHVybjsKKyAgfQorfQorCitjb25zdCBjaGFyICpYODZUYXJnZXRMb3dlcmluZzo6Z2V0VGFyZ2V0Tm9kZU5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdCB7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGRlZmF1bHQ6IHJldHVybiBOVUxMOworICBjYXNlIFg4NklTRDo6QlNGOiAgICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6QlNGIjsKKyAgY2FzZSBYODZJU0Q6OkJTUjogICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OkJTUiI7CisgIGNhc2UgWDg2SVNEOjpTSExEOiAgICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpTSExEIjsKKyAgY2FzZSBYODZJU0Q6OlNIUkQ6ICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OlNIUkQiOworICBjYXNlIFg4NklTRDo6RkFORDogICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6RkFORCI7CisgIGNhc2UgWDg2SVNEOjpGT1I6ICAgICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpGT1IiOworICBjYXNlIFg4NklTRDo6RlhPUjogICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6RlhPUiI7CisgIGNhc2UgWDg2SVNEOjpGU1JMOiAgICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpGU1JMIjsKKyAgY2FzZSBYODZJU0Q6OkZJTEQ6ICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OkZJTEQiOworICBjYXNlIFg4NklTRDo6RklMRF9GTEFHOiAgICAgICAgICByZXR1cm4gIlg4NklTRDo6RklMRF9GTEFHIjsKKyAgY2FzZSBYODZJU0Q6OkZQX1RPX0lOVDE2X0lOX01FTTogcmV0dXJuICJYODZJU0Q6OkZQX1RPX0lOVDE2X0lOX01FTSI7CisgIGNhc2UgWDg2SVNEOjpGUF9UT19JTlQzMl9JTl9NRU06IHJldHVybiAiWDg2SVNEOjpGUF9UT19JTlQzMl9JTl9NRU0iOworICBjYXNlIFg4NklTRDo6RlBfVE9fSU5UNjRfSU5fTUVNOiByZXR1cm4gIlg4NklTRDo6RlBfVE9fSU5UNjRfSU5fTUVNIjsKKyAgY2FzZSBYODZJU0Q6OkZMRDogICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OkZMRCI7CisgIGNhc2UgWDg2SVNEOjpGU1Q6ICAgICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpGU1QiOworICBjYXNlIFg4NklTRDo6Q0FMTDogICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6Q0FMTCI7CisgIGNhc2UgWDg2SVNEOjpSRFRTQ19EQUc6ICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpSRFRTQ19EQUciOworICBjYXNlIFg4NklTRDo6QlQ6ICAgICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6QlQiOworICBjYXNlIFg4NklTRDo6Q01QOiAgICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6Q01QIjsKKyAgY2FzZSBYODZJU0Q6OkNPTUk6ICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OkNPTUkiOworICBjYXNlIFg4NklTRDo6VUNPTUk6ICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6VUNPTUkiOworICBjYXNlIFg4NklTRDo6U0VUQ0M6ICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6U0VUQ0MiOworICBjYXNlIFg4NklTRDo6U0VUQ0NfQ0FSUlk6ICAgICAgICByZXR1cm4gIlg4NklTRDo6U0VUQ0NfQ0FSUlkiOworICBjYXNlIFg4NklTRDo6Q01PVjogICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6Q01PViI7CisgIGNhc2UgWDg2SVNEOjpCUkNPTkQ6ICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpCUkNPTkQiOworICBjYXNlIFg4NklTRDo6UkVUX0ZMQUc6ICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6UkVUX0ZMQUciOworICBjYXNlIFg4NklTRDo6UkVQX1NUT1M6ICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6UkVQX1NUT1MiOworICBjYXNlIFg4NklTRDo6UkVQX01PVlM6ICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6UkVQX01PVlMiOworICBjYXNlIFg4NklTRDo6R2xvYmFsQmFzZVJlZzogICAgICByZXR1cm4gIlg4NklTRDo6R2xvYmFsQmFzZVJlZyI7CisgIGNhc2UgWDg2SVNEOjpXcmFwcGVyOiAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpXcmFwcGVyIjsKKyAgY2FzZSBYODZJU0Q6OldyYXBwZXJSSVA6ICAgICAgICAgcmV0dXJuICJYODZJU0Q6OldyYXBwZXJSSVAiOworICBjYXNlIFg4NklTRDo6UEVYVFJCOiAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6UEVYVFJCIjsKKyAgY2FzZSBYODZJU0Q6OlBFWFRSVzogICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OlBFWFRSVyI7CisgIGNhc2UgWDg2SVNEOjpJTlNFUlRQUzogICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpJTlNFUlRQUyI7CisgIGNhc2UgWDg2SVNEOjpQSU5TUkI6ICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpQSU5TUkIiOworICBjYXNlIFg4NklTRDo6UElOU1JXOiAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6UElOU1JXIjsKKyAgY2FzZSBYODZJU0Q6Ok1NWF9QSU5TUlc6ICAgICAgICAgcmV0dXJuICJYODZJU0Q6Ok1NWF9QSU5TUlciOworICBjYXNlIFg4NklTRDo6UFNIVUZCOiAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6UFNIVUZCIjsKKyAgY2FzZSBYODZJU0Q6OkZNQVg6ICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OkZNQVgiOworICBjYXNlIFg4NklTRDo6Rk1JTjogICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6Rk1JTiI7CisgIGNhc2UgWDg2SVNEOjpGUlNRUlQ6ICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpGUlNRUlQiOworICBjYXNlIFg4NklTRDo6RlJDUDogICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6RlJDUCI7CisgIGNhc2UgWDg2SVNEOjpUTFNBRERSOiAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpUTFNBRERSIjsKKyAgY2FzZSBYODZJU0Q6OlRMU0NBTEw6ICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OlRMU0NBTEwiOworICBjYXNlIFg4NklTRDo6U2VnbWVudEJhc2VBZGRyZXNzOiByZXR1cm4gIlg4NklTRDo6U2VnbWVudEJhc2VBZGRyZXNzIjsKKyAgY2FzZSBYODZJU0Q6OkVIX1JFVFVSTjogICAgICAgICAgcmV0dXJuICJYODZJU0Q6OkVIX1JFVFVSTiI7CisgIGNhc2UgWDg2SVNEOjpUQ19SRVRVUk46ICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpUQ19SRVRVUk4iOworICBjYXNlIFg4NklTRDo6Rk5TVENXMTZtOiAgICAgICAgICByZXR1cm4gIlg4NklTRDo6Rk5TVENXMTZtIjsKKyAgY2FzZSBYODZJU0Q6OkxDTVBYQ0hHX0RBRzogICAgICAgcmV0dXJuICJYODZJU0Q6OkxDTVBYQ0hHX0RBRyI7CisgIGNhc2UgWDg2SVNEOjpMQ01QWENIRzhfREFHOiAgICAgIHJldHVybiAiWDg2SVNEOjpMQ01QWENIRzhfREFHIjsKKyAgY2FzZSBYODZJU0Q6OkFUT01BREQ2NF9EQUc6ICAgICAgcmV0dXJuICJYODZJU0Q6OkFUT01BREQ2NF9EQUciOworICBjYXNlIFg4NklTRDo6QVRPTVNVQjY0X0RBRzogICAgICByZXR1cm4gIlg4NklTRDo6QVRPTVNVQjY0X0RBRyI7CisgIGNhc2UgWDg2SVNEOjpBVE9NT1I2NF9EQUc6ICAgICAgIHJldHVybiAiWDg2SVNEOjpBVE9NT1I2NF9EQUciOworICBjYXNlIFg4NklTRDo6QVRPTVhPUjY0X0RBRzogICAgICByZXR1cm4gIlg4NklTRDo6QVRPTVhPUjY0X0RBRyI7CisgIGNhc2UgWDg2SVNEOjpBVE9NQU5ENjRfREFHOiAgICAgIHJldHVybiAiWDg2SVNEOjpBVE9NQU5ENjRfREFHIjsKKyAgY2FzZSBYODZJU0Q6OkFUT01OQU5ENjRfREFHOiAgICAgcmV0dXJuICJYODZJU0Q6OkFUT01OQU5ENjRfREFHIjsKKyAgY2FzZSBYODZJU0Q6OlZaRVhUX01PVkw6ICAgICAgICAgcmV0dXJuICJYODZJU0Q6OlZaRVhUX01PVkwiOworICBjYXNlIFg4NklTRDo6VlpFWFRfTE9BRDogICAgICAgICByZXR1cm4gIlg4NklTRDo6VlpFWFRfTE9BRCI7CisgIGNhc2UgWDg2SVNEOjpWU0hMOiAgICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpWU0hMIjsKKyAgY2FzZSBYODZJU0Q6OlZTUkw6ICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OlZTUkwiOworICBjYXNlIFg4NklTRDo6Q01QUEQ6ICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6Q01QUEQiOworICBjYXNlIFg4NklTRDo6Q01QUFM6ICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6Q01QUFMiOworICBjYXNlIFg4NklTRDo6UENNUEVRQjogICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6UENNUEVRQiI7CisgIGNhc2UgWDg2SVNEOjpQQ01QRVFXOiAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpQQ01QRVFXIjsKKyAgY2FzZSBYODZJU0Q6OlBDTVBFUUQ6ICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OlBDTVBFUUQiOworICBjYXNlIFg4NklTRDo6UENNUEVRUTogICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6UENNUEVRUSI7CisgIGNhc2UgWDg2SVNEOjpQQ01QR1RCOiAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpQQ01QR1RCIjsKKyAgY2FzZSBYODZJU0Q6OlBDTVBHVFc6ICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OlBDTVBHVFciOworICBjYXNlIFg4NklTRDo6UENNUEdURDogICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6UENNUEdURCI7CisgIGNhc2UgWDg2SVNEOjpQQ01QR1RROiAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpQQ01QR1RRIjsKKyAgY2FzZSBYODZJU0Q6OkFERDogICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OkFERCI7CisgIGNhc2UgWDg2SVNEOjpTVUI6ICAgICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpTVUIiOworICBjYXNlIFg4NklTRDo6U01VTDogICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6U01VTCI7CisgIGNhc2UgWDg2SVNEOjpVTVVMOiAgICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpVTVVMIjsKKyAgY2FzZSBYODZJU0Q6OklOQzogICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OklOQyI7CisgIGNhc2UgWDg2SVNEOjpERUM6ICAgICAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpERUMiOworICBjYXNlIFg4NklTRDo6T1I6ICAgICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6T1IiOworICBjYXNlIFg4NklTRDo6WE9SOiAgICAgICAgICAgICAgICByZXR1cm4gIlg4NklTRDo6WE9SIjsKKyAgY2FzZSBYODZJU0Q6OkFORDogICAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OkFORCI7CisgIGNhc2UgWDg2SVNEOjpNVUxfSU1NOiAgICAgICAgICAgIHJldHVybiAiWDg2SVNEOjpNVUxfSU1NIjsKKyAgY2FzZSBYODZJU0Q6OlBURVNUOiAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OlBURVNUIjsKKyAgY2FzZSBYODZJU0Q6OlRFU1RQOiAgICAgICAgICAgICAgcmV0dXJuICJYODZJU0Q6OlRFU1RQIjsKKyAgY2FzZSBYODZJU0Q6OlZBU1RBUlRfU0FWRV9YTU1fUkVHUzogcmV0dXJuICJYODZJU0Q6OlZBU1RBUlRfU0FWRV9YTU1fUkVHUyI7CisgIGNhc2UgWDg2SVNEOjpNSU5HV19BTExPQ0E6ICAgICAgIHJldHVybiAiWDg2SVNEOjpNSU5HV19BTExPQ0EiOworICB9Cit9CisKKy8vIGlzTGVnYWxBZGRyZXNzaW5nTW9kZSAtIFJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzaW5nIG1vZGUgcmVwcmVzZW50ZWQKKy8vIGJ5IEFNIGlzIGxlZ2FsIGZvciB0aGlzIHRhcmdldCwgZm9yIGEgbG9hZC9zdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCitib29sIFg4NlRhcmdldExvd2VyaW5nOjppc0xlZ2FsQWRkcmVzc2luZ01vZGUoY29uc3QgQWRkck1vZGUgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSBjb25zdCB7CisgIC8vIFg4NiBzdXBwb3J0cyBleHRyZW1lbHkgZ2VuZXJhbCBhZGRyZXNzaW5nIG1vZGVzLgorICBDb2RlTW9kZWw6Ok1vZGVsIE0gPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0Q29kZU1vZGVsKCk7CisKKyAgLy8gWDg2IGFsbG93cyBhIHNpZ24tZXh0ZW5kZWQgMzItYml0IGltbWVkaWF0ZSBmaWVsZCBhcyBhIGRpc3BsYWNlbWVudC4KKyAgaWYgKCFYODY6OmlzT2Zmc2V0U3VpdGFibGVGb3JDb2RlTW9kZWwoQU0uQmFzZU9mZnMsIE0sIEFNLkJhc2VHViAhPSBOVUxMKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKEFNLkJhc2VHVikgeworICAgIHVuc2lnbmVkIEdWRmxhZ3MgPQorICAgICAgU3VidGFyZ2V0LT5DbGFzc2lmeUdsb2JhbFJlZmVyZW5jZShBTS5CYXNlR1YsIGdldFRhcmdldE1hY2hpbmUoKSk7CisKKyAgICAvLyBJZiBhIHJlZmVyZW5jZSB0byB0aGlzIGdsb2JhbCByZXF1aXJlcyBhbiBleHRyYSBsb2FkLCB3ZSBjYW4ndCBmb2xkIGl0LgorICAgIGlmIChpc0dsb2JhbFN0dWJSZWZlcmVuY2UoR1ZGbGFncykpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiBCYXNlR1YgcmVxdWlyZXMgYSByZWdpc3RlciBmb3IgdGhlIFBJQyBiYXNlLCB3ZSBjYW5ub3QgYWxzbyBoYXZlIGEKKyAgICAvLyBCYXNlUmVnIHNwZWNpZmllZC4KKyAgICBpZiAoQU0uSGFzQmFzZVJlZyAmJiBpc0dsb2JhbFJlbGF0aXZlVG9QSUNCYXNlKEdWRmxhZ3MpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgbG93ZXIgNEcgaXMgbm90IGF2YWlsYWJsZSwgdGhlbiB3ZSBtdXN0IHVzZSByaXAtcmVsYXRpdmUgYWRkcmVzc2luZy4KKyAgICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkgJiYgKEFNLkJhc2VPZmZzIHx8IEFNLlNjYWxlID4gMSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzd2l0Y2ggKEFNLlNjYWxlKSB7CisgIGNhc2UgMDoKKyAgY2FzZSAxOgorICBjYXNlIDI6CisgIGNhc2UgNDoKKyAgY2FzZSA4OgorICAgIC8vIFRoZXNlIHNjYWxlcyBhbHdheXMgd29yay4KKyAgICBicmVhazsKKyAgY2FzZSAzOgorICBjYXNlIDU6CisgIGNhc2UgOToKKyAgICAvLyBUaGVzZSBzY2FsZXMgYXJlIGZvcm1lZCB3aXRoIGJhc2VyZWcrc2NhbGVyZWcuICBPbmx5IGFjY2VwdCBpZiB0aGVyZSBpcworICAgIC8vIG5vIGJhc2VyZWcgeWV0LgorICAgIGlmIChBTS5IYXNCYXNlUmVnKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGJyZWFrOworICBkZWZhdWx0OiAgLy8gT3RoZXIgc3R1ZmYgbmV2ZXIgd29ya3MuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBYODZUYXJnZXRMb3dlcmluZzo6aXNUcnVuY2F0ZUZyZWUoY29uc3QgVHlwZSAqVHkxLCBjb25zdCBUeXBlICpUeTIpIGNvbnN0IHsKKyAgaWYgKCFUeTEtPmlzSW50ZWdlclR5KCkgfHwgIVR5Mi0+aXNJbnRlZ2VyVHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHVuc2lnbmVkIE51bUJpdHMxID0gVHkxLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIE51bUJpdHMyID0gVHkyLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgIGlmIChOdW1CaXRzMSA8PSBOdW1CaXRzMikKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFg4NlRhcmdldExvd2VyaW5nOjppc1RydW5jYXRlRnJlZShFVlQgVlQxLCBFVlQgVlQyKSBjb25zdCB7CisgIGlmICghVlQxLmlzSW50ZWdlcigpIHx8ICFWVDIuaXNJbnRlZ2VyKCkpCisgICAgcmV0dXJuIGZhbHNlOworICB1bnNpZ25lZCBOdW1CaXRzMSA9IFZUMS5nZXRTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIE51bUJpdHMyID0gVlQyLmdldFNpemVJbkJpdHMoKTsKKyAgaWYgKE51bUJpdHMxIDw9IE51bUJpdHMyKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWDg2VGFyZ2V0TG93ZXJpbmc6OmlzWkV4dEZyZWUoY29uc3QgVHlwZSAqVHkxLCBjb25zdCBUeXBlICpUeTIpIGNvbnN0IHsKKyAgLy8geDg2LTY0IGltcGxpY2l0bHkgemVyby1leHRlbmRzIDMyLWJpdCByZXN1bHRzIGluIDY0LWJpdCByZWdpc3RlcnMuCisgIHJldHVybiBUeTEtPmlzSW50ZWdlclR5KDMyKSAmJiBUeTItPmlzSW50ZWdlclR5KDY0KSAmJiBTdWJ0YXJnZXQtPmlzNjRCaXQoKTsKK30KKworYm9vbCBYODZUYXJnZXRMb3dlcmluZzo6aXNaRXh0RnJlZShFVlQgVlQxLCBFVlQgVlQyKSBjb25zdCB7CisgIC8vIHg4Ni02NCBpbXBsaWNpdGx5IHplcm8tZXh0ZW5kcyAzMi1iaXQgcmVzdWx0cyBpbiA2NC1iaXQgcmVnaXN0ZXJzLgorICByZXR1cm4gVlQxID09IE1WVDo6aTMyICYmIFZUMiA9PSBNVlQ6Omk2NCAmJiBTdWJ0YXJnZXQtPmlzNjRCaXQoKTsKK30KKworYm9vbCBYODZUYXJnZXRMb3dlcmluZzo6aXNOYXJyb3dpbmdQcm9maXRhYmxlKEVWVCBWVDEsIEVWVCBWVDIpIGNvbnN0IHsKKyAgLy8gaTE2IGluc3RydWN0aW9ucyBhcmUgbG9uZ2VyICgweDY2IHByZWZpeCkgYW5kIHBvdGVudGlhbGx5IHNsb3dlci4KKyAgcmV0dXJuICEoVlQxID09IE1WVDo6aTMyICYmIFZUMiA9PSBNVlQ6OmkxNik7Cit9CisKKy8vLyBpc1NodWZmbGVNYXNrTGVnYWwgLSBUYXJnZXRzIGNhbiB1c2UgdGhpcyB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgb25seQorLy8vIHN1cHBvcnQgKnNvbWUqIFZFQ1RPUl9TSFVGRkxFIG9wZXJhdGlvbnMsIHRob3NlIHdpdGggc3BlY2lmaWMgbWFza3MuCisvLy8gQnkgZGVmYXVsdCwgaWYgYSB0YXJnZXQgc3VwcG9ydHMgdGhlIFZFQ1RPUl9TSFVGRkxFIG5vZGUsIGFsbCBtYXNrIHZhbHVlcworLy8vIGFyZSBhc3N1bWVkIHRvIGJlIGxlZ2FsLgorYm9vbAorWDg2VGFyZ2V0TG93ZXJpbmc6OmlzU2h1ZmZsZU1hc2tMZWdhbChjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCB7CisgIC8vIFZlcnkgbGl0dGxlIHNodWZmbGluZyBjYW4gYmUgZG9uZSBmb3IgNjQtYml0IHZlY3RvcnMgcmlnaHQgbm93LgorICBpZiAoVlQuZ2V0U2l6ZUluQml0cygpID09IDY0KQorICAgIHJldHVybiBpc1BBTElHTlJNYXNrKE0sIFZULCBTdWJ0YXJnZXQtPmhhc1NTU0UzKCkpOworCisgIC8vIEZJWE1FOiBwc2h1ZmIsIGJsZW5kcywgc2hpZnRzLgorICByZXR1cm4gKFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0gMiB8fAorICAgICAgICAgIFNodWZmbGVWZWN0b3JTRE5vZGU6OmlzU3BsYXRNYXNrKCZNWzBdLCBWVCkgfHwKKyAgICAgICAgICBpc01PVkxNYXNrKE0sIFZUKSB8fAorICAgICAgICAgIGlzU0hVRlBNYXNrKE0sIFZUKSB8fAorICAgICAgICAgIGlzUFNIVUZETWFzayhNLCBWVCkgfHwKKyAgICAgICAgICBpc1BTSFVGSFdNYXNrKE0sIFZUKSB8fAorICAgICAgICAgIGlzUFNIVUZMV01hc2soTSwgVlQpIHx8CisgICAgICAgICAgaXNQQUxJR05STWFzayhNLCBWVCwgU3VidGFyZ2V0LT5oYXNTU1NFMygpKSB8fAorICAgICAgICAgIGlzVU5QQ0tMTWFzayhNLCBWVCkgfHwKKyAgICAgICAgICBpc1VOUENLSE1hc2soTSwgVlQpIHx8CisgICAgICAgICAgaXNVTlBDS0xfdl91bmRlZl9NYXNrKE0sIFZUKSB8fAorICAgICAgICAgIGlzVU5QQ0tIX3ZfdW5kZWZfTWFzayhNLCBWVCkpOworfQorCitib29sCitYODZUYXJnZXRMb3dlcmluZzo6aXNWZWN0b3JDbGVhck1hc2tMZWdhbChjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3QgeworICB1bnNpZ25lZCBOdW1FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgLy8gRklYTUU6IFRoaXMgY29sbGVjdGlvbiBvZiBtYXNrcyBzZWVtcyBzdXNwZWN0LgorICBpZiAoTnVtRWx0cyA9PSAyKQorICAgIHJldHVybiB0cnVlOworICBpZiAoTnVtRWx0cyA9PSA0ICYmIFZULmdldFNpemVJbkJpdHMoKSA9PSAxMjgpIHsKKyAgICByZXR1cm4gKGlzTU9WTE1hc2soTWFzaywgVlQpICB8fAorICAgICAgICAgICAgaXNDb21tdXRlZE1PVkxNYXNrKE1hc2ssIFZULCB0cnVlKSB8fAorICAgICAgICAgICAgaXNTSFVGUE1hc2soTWFzaywgVlQpIHx8CisgICAgICAgICAgICBpc0NvbW11dGVkU0hVRlBNYXNrKE1hc2ssIFZUKSk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBYODYgU2NoZWR1bGVyIEhvb2tzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBwcml2YXRlIHV0aWxpdHkgZnVuY3Rpb24KK01hY2hpbmVCYXNpY0Jsb2NrICoKK1g4NlRhcmdldExvd2VyaW5nOjpFbWl0QXRvbWljQml0d2lzZVdpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKmJJbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlZ09wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbW1PcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTG9hZE9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDWGNoZ09wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBub3RPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRUFYcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW52U3JjKSBjb25zdCB7CisgIC8vIEZvciB0aGUgYXRvbWljIGJpdHdpc2Ugb3BlcmF0b3IsIHdlIGdlbmVyYXRlCisgIC8vICAgdGhpc01CQjoKKyAgLy8gICBuZXdNQkI6CisgIC8vICAgICBsZCAgdDEgPSBbYml0aW5zdHIuYWRkcl0KKyAgLy8gICAgIG9wICB0MiA9IHQxLCBbYml0aW5zdHIudmFsXQorICAvLyAgICAgbW92IEVBWCA9IHQxCisgIC8vICAgICBsY3MgZGVzdCA9IFtiaXRpbnN0ci5hZGRyXSwgdDIgIFtFQVggaXMgaW1wbGljaXRdCisgIC8vICAgICBieiAgbmV3TUJCCisgIC8vICAgICBmYWxsdGhyb3VnaCAtLT5uZXh0TUJCCisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICBjb25zdCBCYXNpY0Jsb2NrICpMTFZNX0JCID0gTUJCLT5nZXRCYXNpY0Jsb2NrKCk7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUJCSXRlciA9IE1CQjsKKyAgKytNQkJJdGVyOworCisgIC8vLyBGaXJzdCBidWlsZCB0aGUgQ0ZHCisgIE1hY2hpbmVGdW5jdGlvbiAqRiA9IE1CQi0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICp0aGlzTUJCID0gTUJCOworICBNYWNoaW5lQmFzaWNCbG9jayAqbmV3TUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpuZXh0TUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIEYtPmluc2VydChNQkJJdGVyLCBuZXdNQkIpOworICBGLT5pbnNlcnQoTUJCSXRlciwgbmV4dE1CQik7CisKKyAgLy8gVHJhbnNmZXIgdGhlIHJlbWFpbmRlciBvZiB0aGlzTUJCIGFuZCBpdHMgc3VjY2Vzc29yIGVkZ2VzIHRvIG5leHRNQkIuCisgIG5leHRNQkItPnNwbGljZShuZXh0TUJCLT5iZWdpbigpLCB0aGlzTUJCLAorICAgICAgICAgICAgICAgICAgbGx2bTo6bmV4dChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoYkluc3RyKSksCisgICAgICAgICAgICAgICAgICB0aGlzTUJCLT5lbmQoKSk7CisgIG5leHRNQkItPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXModGhpc01CQik7CisKKyAgLy8gVXBkYXRlIHRoaXNNQkIgdG8gZmFsbCB0aHJvdWdoIHRvIG5ld01CQgorICB0aGlzTUJCLT5hZGRTdWNjZXNzb3IobmV3TUJCKTsKKworICAvLyBuZXdNQkIganVtcHMgdG8gaXRzZWxmIGFuZCBmYWxsIHRocm91Z2ggdG8gbmV4dE1CQgorICBuZXdNQkItPmFkZFN1Y2Nlc3NvcihuZXh0TUJCKTsKKyAgbmV3TUJCLT5hZGRTdWNjZXNzb3IobmV3TUJCKTsKKworICAvLyBJbnNlcnQgaW5zdHJ1Y3Rpb25zIGludG8gbmV3TUJCIGJhc2VkIG9uIGluY29taW5nIGluc3RydWN0aW9uCisgIGFzc2VydChiSW5zdHItPmdldE51bU9wZXJhbmRzKCkgPCBYODY6OkFkZHJOdW1PcGVyYW5kcyArIDQgJiYKKyAgICAgICAgICJ1bmV4cGVjdGVkIG51bWJlciBvZiBvcGVyYW5kcyIpOworICBEZWJ1Z0xvYyBkbCA9IGJJbnN0ci0+Z2V0RGVidWdMb2MoKTsKKyAgTWFjaGluZU9wZXJhbmQmIGRlc3RPcGVyID0gYkluc3RyLT5nZXRPcGVyYW5kKDApOworICBNYWNoaW5lT3BlcmFuZCogYXJnT3BlcnNbMiArIFg4Njo6QWRkck51bU9wZXJhbmRzXTsKKyAgaW50IG51bUFyZ3MgPSBiSW5zdHItPmdldE51bU9wZXJhbmRzKCkgLSAxOworICBmb3IgKGludCBpPTA7IGkgPCBudW1BcmdzOyArK2kpCisgICAgYXJnT3BlcnNbaV0gPSAmYkluc3RyLT5nZXRPcGVyYW5kKGkrMSk7CisKKyAgLy8geDg2IGFkZHJlc3MgaGFzIDQgb3BlcmFuZHM6IGJhc2UsIGluZGV4LCBzY2FsZSwgYW5kIGRpc3BsYWNlbWVudAorICBpbnQgbGFzdEFkZHJJbmR4ID0gWDg2OjpBZGRyTnVtT3BlcmFuZHMgLSAxOyAvLyBbMCwzXQorICBpbnQgdmFsQXJnSW5keCA9IGxhc3RBZGRySW5keCArIDE7CisKKyAgdW5zaWduZWQgdDEgPSBGLT5nZXRSZWdJbmZvKCkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KExvYWRPcGMpLCB0MSk7CisgIGZvciAoaW50IGk9MDsgaSA8PSBsYXN0QWRkckluZHg7ICsraSkKKyAgICAoKk1JQikuYWRkT3BlcmFuZCgqYXJnT3BlcnNbaV0pOworCisgIHVuc2lnbmVkIHR0ID0gRi0+Z2V0UmVnSW5mbygpLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIGlmIChpbnZTcmMpIHsKKyAgICBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KG5vdE9wYyksIHR0KS5hZGRSZWcodDEpOworICB9CisgIGVsc2UKKyAgICB0dCA9IHQxOworCisgIHVuc2lnbmVkIHQyID0gRi0+Z2V0UmVnSW5mbygpLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIGFzc2VydCgoYXJnT3BlcnNbdmFsQXJnSW5keF0tPmlzUmVnKCkgfHwKKyAgICAgICAgICBhcmdPcGVyc1t2YWxBcmdJbmR4XS0+aXNJbW0oKSkgJiYKKyAgICAgICAgICJpbnZhbGlkIG9wZXJhbmQiKTsKKyAgaWYgKGFyZ09wZXJzW3ZhbEFyZ0luZHhdLT5pc1JlZygpKQorICAgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQocmVnT3BjKSwgdDIpOworICBlbHNlCisgICAgTUlCID0gQnVpbGRNSShuZXdNQkIsIGRsLCBUSUktPmdldChpbW1PcGMpLCB0Mik7CisgIE1JQi5hZGRSZWcodHQpOworICAoKk1JQikuYWRkT3BlcmFuZCgqYXJnT3BlcnNbdmFsQXJnSW5keF0pOworCisgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgRUFYcmVnKTsKKyAgTUlCLmFkZFJlZyh0MSk7CisKKyAgTUlCID0gQnVpbGRNSShuZXdNQkIsIGRsLCBUSUktPmdldChDWGNoZ09wYykpOworICBmb3IgKGludCBpPTA7IGkgPD0gbGFzdEFkZHJJbmR4OyArK2kpCisgICAgKCpNSUIpLmFkZE9wZXJhbmQoKmFyZ09wZXJzW2ldKTsKKyAgTUlCLmFkZFJlZyh0Mik7CisgIGFzc2VydChiSW5zdHItPmhhc09uZU1lbU9wZXJhbmQoKSAmJiAiVW5leHBlY3RlZCBudW1iZXIgb2YgbWVtb3BlcmFuZCIpOworICAoKk1JQikuc2V0TWVtUmVmcyhiSW5zdHItPm1lbW9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIGJJbnN0ci0+bWVtb3BlcmFuZHNfZW5kKCkpOworCisgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgZGVzdE9wZXIuZ2V0UmVnKCkpOworICBNSUIuYWRkUmVnKEVBWHJlZyk7CisKKyAgLy8gaW5zZXJ0IGJyYW5jaAorICBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFg4Njo6Sk5FXzQpKS5hZGRNQkIobmV3TUJCKTsKKworICBiSW5zdHItPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisgIHJldHVybiBuZXh0TUJCOworfQorCisvLyBwcml2YXRlIHV0aWxpdHkgZnVuY3Rpb246ICA2NCBiaXQgYXRvbWljcyBvbiAzMiBiaXQgaG9zdC4KK01hY2hpbmVCYXNpY0Jsb2NrICoKK1g4NlRhcmdldExvd2VyaW5nOjpFbWl0QXRvbWljQml0NjQzMldpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKmJJbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlZ09wY0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVnT3BjSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbW1PcGNMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGltbU9wY0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnZTcmMpIGNvbnN0IHsKKyAgLy8gRm9yIHRoZSBhdG9taWMgYml0d2lzZSBvcGVyYXRvciwgd2UgZ2VuZXJhdGUKKyAgLy8gICB0aGlzTUJCIChpbnN0cnVjdGlvbnMgYXJlIGluIHBhaXJzLCBleGNlcHQgY21weGNoZzhiKQorICAvLyAgICAgbGQgdDEsdDIgPSBbYml0aW5zdHIuYWRkcl0KKyAgLy8gICBuZXdNQkI6CisgIC8vICAgICBvdXQxLCBvdXQyID0gcGhpICh0aGlzTUJCLCB0MS90MikgKG5ld01CQiwgdDMvdDQpCisgIC8vICAgICBvcCAgdDUsIHQ2IDwtIG91dDEsIG91dDIsIFtiaXRpbnN0ci52YWxdCisgIC8vICAgICAgKGZvciBTV0FQLCBzdWJzdGl0dXRlOiAgbW92IHQ1LCB0NiA8LSBbYml0aW5zdHIudmFsXSkKKyAgLy8gICAgIG1vdiBFQ1gsIEVCWCA8LSB0NSwgdDYKKyAgLy8gICAgIG1vdiBFQVgsIEVEWCA8LSB0MSwgdDIKKyAgLy8gICAgIGNtcHhjaGc4YiBbYml0aW5zdHIuYWRkcl0gIFtFQVgsIEVEWCwgRUJYLCBFQ1ggaW1wbGljaXRdCisgIC8vICAgICBtb3YgdDMsIHQ0IDwtIEVBWCwgRURYCisgIC8vICAgICBieiAgbmV3TUJCCisgIC8vICAgICByZXN1bHQgaW4gb3V0MSwgb3V0MgorICAvLyAgICAgZmFsbHRocm91Z2ggLS0+bmV4dE1CQgorCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gWDg2OjpHUjMyUmVnaXN0ZXJDbGFzczsKKyAgY29uc3QgdW5zaWduZWQgTG9hZE9wYyA9IFg4Njo6TU9WMzJybTsKKyAgY29uc3QgdW5zaWduZWQgTm90T3BjID0gWDg2OjpOT1QzMnI7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICBjb25zdCBCYXNpY0Jsb2NrICpMTFZNX0JCID0gTUJCLT5nZXRCYXNpY0Jsb2NrKCk7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgTUJCSXRlciA9IE1CQjsKKyAgKytNQkJJdGVyOworCisgIC8vLyBGaXJzdCBidWlsZCB0aGUgQ0ZHCisgIE1hY2hpbmVGdW5jdGlvbiAqRiA9IE1CQi0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICp0aGlzTUJCID0gTUJCOworICBNYWNoaW5lQmFzaWNCbG9jayAqbmV3TUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpuZXh0TUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIEYtPmluc2VydChNQkJJdGVyLCBuZXdNQkIpOworICBGLT5pbnNlcnQoTUJCSXRlciwgbmV4dE1CQik7CisKKyAgLy8gVHJhbnNmZXIgdGhlIHJlbWFpbmRlciBvZiB0aGlzTUJCIGFuZCBpdHMgc3VjY2Vzc29yIGVkZ2VzIHRvIG5leHRNQkIuCisgIG5leHRNQkItPnNwbGljZShuZXh0TUJCLT5iZWdpbigpLCB0aGlzTUJCLAorICAgICAgICAgICAgICAgICAgbGx2bTo6bmV4dChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoYkluc3RyKSksCisgICAgICAgICAgICAgICAgICB0aGlzTUJCLT5lbmQoKSk7CisgIG5leHRNQkItPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXModGhpc01CQik7CisKKyAgLy8gVXBkYXRlIHRoaXNNQkIgdG8gZmFsbCB0aHJvdWdoIHRvIG5ld01CQgorICB0aGlzTUJCLT5hZGRTdWNjZXNzb3IobmV3TUJCKTsKKworICAvLyBuZXdNQkIganVtcHMgdG8gaXRzZWxmIGFuZCBmYWxsIHRocm91Z2ggdG8gbmV4dE1CQgorICBuZXdNQkItPmFkZFN1Y2Nlc3NvcihuZXh0TUJCKTsKKyAgbmV3TUJCLT5hZGRTdWNjZXNzb3IobmV3TUJCKTsKKworICBEZWJ1Z0xvYyBkbCA9IGJJbnN0ci0+Z2V0RGVidWdMb2MoKTsKKyAgLy8gSW5zZXJ0IGluc3RydWN0aW9ucyBpbnRvIG5ld01CQiBiYXNlZCBvbiBpbmNvbWluZyBpbnN0cnVjdGlvbgorICAvLyBUaGVyZSBhcmUgOCAicmVhbCIgb3BlcmFuZHMgcGx1cyA5IGltcGxpY2l0IGRlZi91c2VzLCBpZ25vcmVkIGhlcmUuCisgIGFzc2VydChiSW5zdHItPmdldE51bU9wZXJhbmRzKCkgPCBYODY6OkFkZHJOdW1PcGVyYW5kcyArIDE0ICYmCisgICAgICAgICAidW5leHBlY3RlZCBudW1iZXIgb2Ygb3BlcmFuZHMiKTsKKyAgTWFjaGluZU9wZXJhbmQmIGRlc3QxT3BlciA9IGJJbnN0ci0+Z2V0T3BlcmFuZCgwKTsKKyAgTWFjaGluZU9wZXJhbmQmIGRlc3QyT3BlciA9IGJJbnN0ci0+Z2V0T3BlcmFuZCgxKTsKKyAgTWFjaGluZU9wZXJhbmQqIGFyZ09wZXJzWzIgKyBYODY6OkFkZHJOdW1PcGVyYW5kc107CisgIGZvciAoaW50IGk9MDsgaSA8IDIgKyBYODY6OkFkZHJOdW1PcGVyYW5kczsgKytpKSB7CisgICAgYXJnT3BlcnNbaV0gPSAmYkluc3RyLT5nZXRPcGVyYW5kKGkrMik7CisKKyAgICAvLyBXZSB1c2Ugc29tZSBvZiB0aGUgb3BlcmFuZHMgbXVsdGlwbGUgdGltZXMsIHNvIGNvbnNlcnZhdGl2ZWx5IGp1c3QKKyAgICAvLyBjbGVhciBhbnkga2lsbCBmbGFncyB0aGF0IG1pZ2h0IGJlIHByZXNlbnQuCisgICAgaWYgKGFyZ09wZXJzW2ldLT5pc1JlZygpICYmIGFyZ09wZXJzW2ldLT5pc1VzZSgpKQorICAgICAgYXJnT3BlcnNbaV0tPnNldElzS2lsbChmYWxzZSk7CisgIH0KKworICAvLyB4ODYgYWRkcmVzcyBoYXMgNSBvcGVyYW5kczogYmFzZSwgaW5kZXgsIHNjYWxlLCBkaXNwbGFjZW1lbnQsIGFuZCBzZWdtZW50LgorICBpbnQgbGFzdEFkZHJJbmR4ID0gWDg2OjpBZGRyTnVtT3BlcmFuZHMgLSAxOyAvLyBbMCwzXQorCisgIHVuc2lnbmVkIHQxID0gRi0+Z2V0UmVnSW5mbygpLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSSh0aGlzTUJCLCBkbCwgVElJLT5nZXQoTG9hZE9wYyksIHQxKTsKKyAgZm9yIChpbnQgaT0wOyBpIDw9IGxhc3RBZGRySW5keDsgKytpKQorICAgICgqTUlCKS5hZGRPcGVyYW5kKCphcmdPcGVyc1tpXSk7CisgIHVuc2lnbmVkIHQyID0gRi0+Z2V0UmVnSW5mbygpLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIE1JQiA9IEJ1aWxkTUkodGhpc01CQiwgZGwsIFRJSS0+Z2V0KExvYWRPcGMpLCB0Mik7CisgIC8vIGFkZCA0IHRvIGRpc3BsYWNlbWVudC4KKyAgZm9yIChpbnQgaT0wOyBpIDw9IGxhc3RBZGRySW5keC0yOyArK2kpCisgICAgKCpNSUIpLmFkZE9wZXJhbmQoKmFyZ09wZXJzW2ldKTsKKyAgTWFjaGluZU9wZXJhbmQgbmV3T3AzID0gKihhcmdPcGVyc1szXSk7CisgIGlmIChuZXdPcDMuaXNJbW0oKSkKKyAgICBuZXdPcDMuc2V0SW1tKG5ld09wMy5nZXRJbW0oKSs0KTsKKyAgZWxzZQorICAgIG5ld09wMy5zZXRPZmZzZXQobmV3T3AzLmdldE9mZnNldCgpKzQpOworICAoKk1JQikuYWRkT3BlcmFuZChuZXdPcDMpOworICAoKk1JQikuYWRkT3BlcmFuZCgqYXJnT3BlcnNbbGFzdEFkZHJJbmR4XSk7CisKKyAgLy8gdDMvNCBhcmUgZGVmaW5lZCBsYXRlciwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbG9vcAorICB1bnNpZ25lZCB0MyA9IEYtPmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICB1bnNpZ25lZCB0NCA9IEYtPmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFg4Njo6UEhJKSwgZGVzdDFPcGVyLmdldFJlZygpKQorICAgIC5hZGRSZWcodDEpLmFkZE1CQih0aGlzTUJCKS5hZGRSZWcodDMpLmFkZE1CQihuZXdNQkIpOworICBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFg4Njo6UEhJKSwgZGVzdDJPcGVyLmdldFJlZygpKQorICAgIC5hZGRSZWcodDIpLmFkZE1CQih0aGlzTUJCKS5hZGRSZWcodDQpLmFkZE1CQihuZXdNQkIpOworCisgIC8vIFRoZSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgc2hvdWxkIGJlIHVzaW5nIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlcnMgb2YKKyAgLy90aGUgUEhJIGluc3RydWN0aW9ucy4KKyAgaWYgKGludlNyYykgeworICAgIHQxID0gRi0+Z2V0UmVnSW5mbygpLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgICAgdDIgPSBGLT5nZXRSZWdJbmZvKCkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFJDKTsKKyAgICBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KE5vdE9wYyksIHQxKS5hZGRSZWcoZGVzdDFPcGVyLmdldFJlZygpKTsKKyAgICBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KE5vdE9wYyksIHQyKS5hZGRSZWcoZGVzdDJPcGVyLmdldFJlZygpKTsKKyAgfSBlbHNlIHsKKyAgICB0MSA9IGRlc3QxT3Blci5nZXRSZWcoKTsKKyAgICB0MiA9IGRlc3QyT3Blci5nZXRSZWcoKTsKKyAgfQorCisgIGludCB2YWxBcmdJbmR4ID0gbGFzdEFkZHJJbmR4ICsgMTsKKyAgYXNzZXJ0KChhcmdPcGVyc1t2YWxBcmdJbmR4XS0+aXNSZWcoKSB8fAorICAgICAgICAgIGFyZ09wZXJzW3ZhbEFyZ0luZHhdLT5pc0ltbSgpKSAmJgorICAgICAgICAgImludmFsaWQgb3BlcmFuZCIpOworICB1bnNpZ25lZCB0NSA9IEYtPmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICB1bnNpZ25lZCB0NiA9IEYtPmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICBpZiAoYXJnT3BlcnNbdmFsQXJnSW5keF0tPmlzUmVnKCkpCisgICAgTUlCID0gQnVpbGRNSShuZXdNQkIsIGRsLCBUSUktPmdldChyZWdPcGNMKSwgdDUpOworICBlbHNlCisgICAgTUlCID0gQnVpbGRNSShuZXdNQkIsIGRsLCBUSUktPmdldChpbW1PcGNMKSwgdDUpOworICBpZiAocmVnT3BjTCAhPSBYODY6Ok1PVjMycnIpCisgICAgTUlCLmFkZFJlZyh0MSk7CisgICgqTUlCKS5hZGRPcGVyYW5kKCphcmdPcGVyc1t2YWxBcmdJbmR4XSk7CisgIGFzc2VydChhcmdPcGVyc1t2YWxBcmdJbmR4ICsgMV0tPmlzUmVnKCkgPT0KKyAgICAgICAgIGFyZ09wZXJzW3ZhbEFyZ0luZHhdLT5pc1JlZygpKTsKKyAgYXNzZXJ0KGFyZ09wZXJzW3ZhbEFyZ0luZHggKyAxXS0+aXNJbW0oKSA9PQorICAgICAgICAgYXJnT3BlcnNbdmFsQXJnSW5keF0tPmlzSW1tKCkpOworICBpZiAoYXJnT3BlcnNbdmFsQXJnSW5keCArIDFdLT5pc1JlZygpKQorICAgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQocmVnT3BjSCksIHQ2KTsKKyAgZWxzZQorICAgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoaW1tT3BjSCksIHQ2KTsKKyAgaWYgKHJlZ09wY0ggIT0gWDg2OjpNT1YzMnJyKQorICAgIE1JQi5hZGRSZWcodDIpOworICAoKk1JQikuYWRkT3BlcmFuZCgqYXJnT3BlcnNbdmFsQXJnSW5keCArIDFdKTsKKworICBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksIFg4Njo6RUFYKTsKKyAgTUlCLmFkZFJlZyh0MSk7CisgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgWDg2OjpFRFgpOworICBNSUIuYWRkUmVnKHQyKTsKKworICBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksIFg4Njo6RUJYKTsKKyAgTUlCLmFkZFJlZyh0NSk7CisgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgWDg2OjpFQ1gpOworICBNSUIuYWRkUmVnKHQ2KTsKKworICBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFg4Njo6TENNUFhDSEc4QikpOworICBmb3IgKGludCBpPTA7IGkgPD0gbGFzdEFkZHJJbmR4OyArK2kpCisgICAgKCpNSUIpLmFkZE9wZXJhbmQoKmFyZ09wZXJzW2ldKTsKKworICBhc3NlcnQoYkluc3RyLT5oYXNPbmVNZW1PcGVyYW5kKCkgJiYgIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIG1lbW9wZXJhbmQiKTsKKyAgKCpNSUIpLnNldE1lbVJlZnMoYkluc3RyLT5tZW1vcGVyYW5kc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBiSW5zdHItPm1lbW9wZXJhbmRzX2VuZCgpKTsKKworICBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksIHQzKTsKKyAgTUlCLmFkZFJlZyhYODY6OkVBWCk7CisgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgdDQpOworICBNSUIuYWRkUmVnKFg4Njo6RURYKTsKKworICAvLyBpbnNlcnQgYnJhbmNoCisgIEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoWDg2OjpKTkVfNCkpLmFkZE1CQihuZXdNQkIpOworCisgIGJJbnN0ci0+ZXJhc2VGcm9tUGFyZW50KCk7ICAgLy8gVGhlIHBzZXVkbyBpbnN0cnVjdGlvbiBpcyBnb25lIG5vdy4KKyAgcmV0dXJuIG5leHRNQkI7Cit9CisKKy8vIHByaXZhdGUgdXRpbGl0eSBmdW5jdGlvbgorTWFjaGluZUJhc2ljQmxvY2sgKgorWDg2VGFyZ2V0TG93ZXJpbmc6OkVtaXRBdG9taWNNaW5NYXhXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICptSW5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY21vdk9wYykgY29uc3QgeworICAvLyBGb3IgdGhlIGF0b21pYyBtaW4vbWF4IG9wZXJhdG9yLCB3ZSBnZW5lcmF0ZQorICAvLyAgIHRoaXNNQkI6CisgIC8vICAgbmV3TUJCOgorICAvLyAgICAgbGQgdDEgPSBbbWluL21heC5hZGRyXQorICAvLyAgICAgbW92IHQyID0gW21pbi9tYXgudmFsXQorICAvLyAgICAgY21wICB0MSwgdDIKKyAgLy8gICAgIGNtb3ZbY29uZF0gdDIgPSB0MQorICAvLyAgICAgbW92IEVBWCA9IHQxCisgIC8vICAgICBsY3MgZGVzdCA9IFtiaXRpbnN0ci5hZGRyXSwgdDIgIFtFQVggaXMgaW1wbGljaXRdCisgIC8vICAgICBieiAgIG5ld01CQgorICAvLyAgICAgZmFsbHRocm91Z2ggLS0+bmV4dE1CQgorICAvLworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IGdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKyAgY29uc3QgQmFzaWNCbG9jayAqTExWTV9CQiA9IE1CQi0+Z2V0QmFzaWNCbG9jaygpOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIE1CQkl0ZXIgPSBNQkI7CisgICsrTUJCSXRlcjsKKworICAvLy8gRmlyc3QgYnVpbGQgdGhlIENGRworICBNYWNoaW5lRnVuY3Rpb24gKkYgPSBNQkItPmdldFBhcmVudCgpOworICBNYWNoaW5lQmFzaWNCbG9jayAqdGhpc01CQiA9IE1CQjsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKm5ld01CQiA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICBNYWNoaW5lQmFzaWNCbG9jayAqbmV4dE1CQiA9IEYtPkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKExMVk1fQkIpOworICBGLT5pbnNlcnQoTUJCSXRlciwgbmV3TUJCKTsKKyAgRi0+aW5zZXJ0KE1CQkl0ZXIsIG5leHRNQkIpOworCisgIC8vIFRyYW5zZmVyIHRoZSByZW1haW5kZXIgb2YgdGhpc01CQiBhbmQgaXRzIHN1Y2Nlc3NvciBlZGdlcyB0byBuZXh0TUJCLgorICBuZXh0TUJCLT5zcGxpY2UobmV4dE1CQi0+YmVnaW4oKSwgdGhpc01CQiwKKyAgICAgICAgICAgICAgICAgIGxsdm06Om5leHQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKG1JbnN0cikpLAorICAgICAgICAgICAgICAgICAgdGhpc01CQi0+ZW5kKCkpOworICBuZXh0TUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKHRoaXNNQkIpOworCisgIC8vIFVwZGF0ZSB0aGlzTUJCIHRvIGZhbGwgdGhyb3VnaCB0byBuZXdNQkIKKyAgdGhpc01CQi0+YWRkU3VjY2Vzc29yKG5ld01CQik7CisKKyAgLy8gbmV3TUJCIGp1bXBzIHRvIG5ld01CQiBhbmQgZmFsbCB0aHJvdWdoIHRvIG5leHRNQkIKKyAgbmV3TUJCLT5hZGRTdWNjZXNzb3IobmV4dE1CQik7CisgIG5ld01CQi0+YWRkU3VjY2Vzc29yKG5ld01CQik7CisKKyAgRGVidWdMb2MgZGwgPSBtSW5zdHItPmdldERlYnVnTG9jKCk7CisgIC8vIEluc2VydCBpbnN0cnVjdGlvbnMgaW50byBuZXdNQkIgYmFzZWQgb24gaW5jb21pbmcgaW5zdHJ1Y3Rpb24KKyAgYXNzZXJ0KG1JbnN0ci0+Z2V0TnVtT3BlcmFuZHMoKSA8IFg4Njo6QWRkck51bU9wZXJhbmRzICsgNCAmJgorICAgICAgICAgInVuZXhwZWN0ZWQgbnVtYmVyIG9mIG9wZXJhbmRzIik7CisgIE1hY2hpbmVPcGVyYW5kJiBkZXN0T3BlciA9IG1JbnN0ci0+Z2V0T3BlcmFuZCgwKTsKKyAgTWFjaGluZU9wZXJhbmQqIGFyZ09wZXJzWzIgKyBYODY6OkFkZHJOdW1PcGVyYW5kc107CisgIGludCBudW1BcmdzID0gbUluc3RyLT5nZXROdW1PcGVyYW5kcygpIC0gMTsKKyAgZm9yIChpbnQgaT0wOyBpIDwgbnVtQXJnczsgKytpKQorICAgIGFyZ09wZXJzW2ldID0gJm1JbnN0ci0+Z2V0T3BlcmFuZChpKzEpOworCisgIC8vIHg4NiBhZGRyZXNzIGhhcyA0IG9wZXJhbmRzOiBiYXNlLCBpbmRleCwgc2NhbGUsIGFuZCBkaXNwbGFjZW1lbnQKKyAgaW50IGxhc3RBZGRySW5keCA9IFg4Njo6QWRkck51bU9wZXJhbmRzIC0gMTsgLy8gWzAsM10KKyAgaW50IHZhbEFyZ0luZHggPSBsYXN0QWRkckluZHggKyAxOworCisgIHVuc2lnbmVkIHQxID0gRi0+Z2V0UmVnSW5mbygpLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihYODY6OkdSMzJSZWdpc3RlckNsYXNzKTsKKyAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFg4Njo6TU9WMzJybSksIHQxKTsKKyAgZm9yIChpbnQgaT0wOyBpIDw9IGxhc3RBZGRySW5keDsgKytpKQorICAgICgqTUlCKS5hZGRPcGVyYW5kKCphcmdPcGVyc1tpXSk7CisKKyAgLy8gV2Ugb25seSBzdXBwb3J0IHJlZ2lzdGVyIGFuZCBpbW1lZGlhdGUgdmFsdWVzCisgIGFzc2VydCgoYXJnT3BlcnNbdmFsQXJnSW5keF0tPmlzUmVnKCkgfHwKKyAgICAgICAgICBhcmdPcGVyc1t2YWxBcmdJbmR4XS0+aXNJbW0oKSkgJiYKKyAgICAgICAgICJpbnZhbGlkIG9wZXJhbmQiKTsKKworICB1bnNpZ25lZCB0MiA9IEYtPmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcyk7CisgIGlmIChhcmdPcGVyc1t2YWxBcmdJbmR4XS0+aXNSZWcoKSkKKyAgICBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFRhcmdldE9wY29kZTo6Q09QWSksIHQyKTsKKyAgZWxzZQorICAgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoWDg2OjpNT1YzMnJyKSwgdDIpOworICAoKk1JQikuYWRkT3BlcmFuZCgqYXJnT3BlcnNbdmFsQXJnSW5keF0pOworCisgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgWDg2OjpFQVgpOworICBNSUIuYWRkUmVnKHQxKTsKKworICBNSUIgPSBCdWlsZE1JKG5ld01CQiwgZGwsIFRJSS0+Z2V0KFg4Njo6Q01QMzJycikpOworICBNSUIuYWRkUmVnKHQxKTsKKyAgTUlCLmFkZFJlZyh0Mik7CisKKyAgLy8gR2VuZXJhdGUgbW92YworICB1bnNpZ25lZCB0MyA9IEYtPmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcyk7CisgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoY21vdk9wYyksdDMpOworICBNSUIuYWRkUmVnKHQyKTsKKyAgTUlCLmFkZFJlZyh0MSk7CisKKyAgLy8gQ21wIGFuZCBleGNoYW5nZSBpZiBub25lIGhhcyBtb2RpZmllZCB0aGUgbWVtb3J5IGxvY2F0aW9uCisgIE1JQiA9IEJ1aWxkTUkobmV3TUJCLCBkbCwgVElJLT5nZXQoWDg2OjpMQ01QWENIRzMyKSk7CisgIGZvciAoaW50IGk9MDsgaSA8PSBsYXN0QWRkckluZHg7ICsraSkKKyAgICAoKk1JQikuYWRkT3BlcmFuZCgqYXJnT3BlcnNbaV0pOworICBNSUIuYWRkUmVnKHQzKTsKKyAgYXNzZXJ0KG1JbnN0ci0+aGFzT25lTWVtT3BlcmFuZCgpICYmICJVbmV4cGVjdGVkIG51bWJlciBvZiBtZW1vcGVyYW5kIik7CisgICgqTUlCKS5zZXRNZW1SZWZzKG1JbnN0ci0+bWVtb3BlcmFuZHNfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgbUluc3RyLT5tZW1vcGVyYW5kc19lbmQoKSk7CisKKyAgTUlCID0gQnVpbGRNSShuZXdNQkIsIGRsLCBUSUktPmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLCBkZXN0T3Blci5nZXRSZWcoKSk7CisgIE1JQi5hZGRSZWcoWDg2OjpFQVgpOworCisgIC8vIGluc2VydCBicmFuY2gKKyAgQnVpbGRNSShuZXdNQkIsIGRsLCBUSUktPmdldChYODY6OkpORV80KSkuYWRkTUJCKG5ld01CQik7CisKKyAgbUluc3RyLT5lcmFzZUZyb21QYXJlbnQoKTsgICAvLyBUaGUgcHNldWRvIGluc3RydWN0aW9uIGlzIGdvbmUgbm93LgorICByZXR1cm4gbmV4dE1CQjsKK30KKworLy8gRklYTUU6IFdoZW4gd2UgZ2V0IHNpemUgc3BlY2lmaWMgWE1NMCByZWdpc3RlcnMsIGkuZS4gWE1NMF9WMTZJOAorLy8gb3IgWE1NMF9WMzJJOCBpbiBBVlggYWxsIG9mIHRoaXMgY29kZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCB0aGF0CisvLyBpbiB0aGUgLnRkIGZpbGUuCitNYWNoaW5lQmFzaWNCbG9jayAqCitYODZUYXJnZXRMb3dlcmluZzo6RW1pdFBDTVAoTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bUFyZ3MsIGJvb2wgbWVtQXJnKSBjb25zdCB7CisKKyAgYXNzZXJ0KChTdWJ0YXJnZXQtPmhhc1NTRTQyKCkgfHwgU3VidGFyZ2V0LT5oYXNBVlgoKSkgJiYKKyAgICAgICAgICJUYXJnZXQgbXVzdCBoYXZlIFNTRTQuMiBvciBBVlggZmVhdHVyZXMgZW5hYmxlZCIpOworCisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworCisgIHVuc2lnbmVkIE9wYzsKKworICBpZiAoIVN1YnRhcmdldC0+aGFzQVZYKCkpIHsKKyAgICBpZiAobWVtQXJnKQorICAgICAgT3BjID0gbnVtQXJncyA9PSAzID8gWDg2OjpQQ01QSVNUUk0xMjhybSA6IFg4Njo6UENNUEVTVFJNMTI4cm07CisgICAgZWxzZQorICAgICAgT3BjID0gbnVtQXJncyA9PSAzID8gWDg2OjpQQ01QSVNUUk0xMjhyciA6IFg4Njo6UENNUEVTVFJNMTI4cnI7CisgIH0gZWxzZSB7CisgICAgaWYgKG1lbUFyZykKKyAgICAgIE9wYyA9IG51bUFyZ3MgPT0gMyA/IFg4Njo6VlBDTVBJU1RSTTEyOHJtIDogWDg2OjpWUENNUEVTVFJNMTI4cm07CisgICAgZWxzZQorICAgICAgT3BjID0gbnVtQXJncyA9PSAzID8gWDg2OjpWUENNUElTVFJNMTI4cnIgOiBYODY6OlZQQ01QRVNUUk0xMjhycjsKKyAgfQorCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KE9wYykpOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1BcmdzOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmT3AgPSBNSS0+Z2V0T3BlcmFuZChpKzEpOworCisgICAgaWYgKCEoT3AuaXNSZWcoKSAmJiBPcC5pc0ltcGxpY2l0KCkpKQorICAgICAgTUlCLmFkZE9wZXJhbmQoT3ApOworICB9CisKKyAgQnVpbGRNSShCQiwgZGwsIFRJSS0+Z2V0KFg4Njo6TU9WQVBTcnIpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAuYWRkUmVnKFg4Njo6WE1NMCk7CisKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOworCisgIHJldHVybiBCQjsKK30KKworTWFjaGluZUJhc2ljQmxvY2sgKgorWDg2VGFyZ2V0TG93ZXJpbmc6OkVtaXRWQVN0YXJ0U2F2ZVhNTVJlZ3NXaXRoQ3VzdG9tSW5zZXJ0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdCB7CisgIC8vIEVtaXQgY29kZSB0byBzYXZlIFhNTSByZWdpc3RlcnMgdG8gdGhlIHN0YWNrLiBUaGUgQUJJIHNheXMgdGhhdCB0aGUKKyAgLy8gbnVtYmVyIG9mIHJlZ2lzdGVycyB0byBzYXZlIGlzIGdpdmVuIGluICVhbCwgc28gaXQncyB0aGVvcmV0aWNhbGx5CisgIC8vIHBvc3NpYmxlIHRvIGRvIGFuIGluZGlyZWN0IGp1bXAgdHJpY2sgdG8gYXZvaWQgc2F2aW5nIGFsbCBvZiB0aGVtLAorICAvLyBob3dldmVyIHRoaXMgY29kZSB0YWtlcyBhIHNpbXBsZXIgYXBwcm9hY2ggYW5kIGp1c3QgZXhlY3V0ZXMgYWxsCisgIC8vIG9mIHRoZSBzdG9yZXMgaWYgJWFsIGlzIG5vbi16ZXJvLiBJdCdzIGxlc3MgY29kZSwgYW5kIGl0J3MgcHJvYmFibHkKKyAgLy8gZWFzaWVyIG9uIHRoZSBoYXJkd2FyZSBicmFuY2ggcHJlZGljdG9yLCBhbmQgc3RvcmVzIGFyZW4ndCBhbGwgdGhhdAorICAvLyBleHBlbnNpdmUgYW55d2F5LgorCisgIC8vIENyZWF0ZSB0aGUgbmV3IGJhc2ljIGJsb2Nrcy4gT25lIGJsb2NrIGNvbnRhaW5zIGFsbCB0aGUgWE1NIHN0b3JlcywKKyAgLy8gYW5kIG9uZSBibG9jayBpcyB0aGUgZmluYWwgZGVzdGluYXRpb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueQorICAvLyBzdG9yZXMgd2VyZSBwZXJmb3JtZWQuCisgIGNvbnN0IEJhc2ljQmxvY2sgKkxMVk1fQkIgPSBNQkItPmdldEJhc2ljQmxvY2soKTsKKyAgTWFjaGluZUZ1bmN0aW9uICpGID0gTUJCLT5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBNQkJJdGVyID0gTUJCOworICArK01CQkl0ZXI7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpYTU1TYXZlTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpFbmRNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgRi0+aW5zZXJ0KE1CQkl0ZXIsIFhNTVNhdmVNQkIpOworICBGLT5pbnNlcnQoTUJCSXRlciwgRW5kTUJCKTsKKworICAvLyBUcmFuc2ZlciB0aGUgcmVtYWluZGVyIG9mIE1CQiBhbmQgaXRzIHN1Y2Nlc3NvciBlZGdlcyB0byBFbmRNQkIuCisgIEVuZE1CQi0+c3BsaWNlKEVuZE1CQi0+YmVnaW4oKSwgTUJCLAorICAgICAgICAgICAgICAgICBsbHZtOjpuZXh0KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihNSSkpLAorICAgICAgICAgICAgICAgICBNQkItPmVuZCgpKTsKKyAgRW5kTUJCLT50cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKE1CQik7CisKKyAgLy8gVGhlIG9yaWdpbmFsIGJsb2NrIHdpbGwgbm93IGZhbGwgdGhyb3VnaCB0byB0aGUgWE1NIHNhdmUgYmxvY2suCisgIE1CQi0+YWRkU3VjY2Vzc29yKFhNTVNhdmVNQkIpOworICAvLyBUaGUgWE1NU2F2ZU1CQiB3aWxsIGZhbGwgdGhyb3VnaCB0byB0aGUgZW5kIGJsb2NrLgorICBYTU1TYXZlTUJCLT5hZGRTdWNjZXNzb3IoRW5kTUJCKTsKKworICAvLyBOb3cgYWRkIHRoZSBpbnN0cnVjdGlvbnMuCisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICBEZWJ1Z0xvYyBETCA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgIHVuc2lnbmVkIENvdW50UmVnID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIGludDY0X3QgUmVnU2F2ZUZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKTsKKyAgaW50NjRfdCBWYXJBcmdzRlBPZmZzZXQgPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKTsKKworICBpZiAoIVN1YnRhcmdldC0+aXNUYXJnZXRXaW42NCgpKSB7CisgICAgLy8gSWYgJWFsIGlzIDAsIGJyYW5jaCBhcm91bmQgdGhlIFhNTSBzYXZlIGJsb2NrLgorICAgIEJ1aWxkTUkoTUJCLCBETCwgVElJLT5nZXQoWDg2OjpURVNUOHJyKSkuYWRkUmVnKENvdW50UmVnKS5hZGRSZWcoQ291bnRSZWcpOworICAgIEJ1aWxkTUkoTUJCLCBETCwgVElJLT5nZXQoWDg2OjpKRV80KSkuYWRkTUJCKEVuZE1CQik7CisgICAgTUJCLT5hZGRTdWNjZXNzb3IoRW5kTUJCKTsKKyAgfQorCisgIC8vIEluIHRoZSBYTU0gc2F2ZSBibG9jaywgc2F2ZSBhbGwgdGhlIFhNTSBhcmd1bWVudCByZWdpc3RlcnMuCisgIGZvciAoaW50IGkgPSAzLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaW50NjRfdCBPZmZzZXQgPSAoaSAtIDMpICogMTYgKyBWYXJBcmdzRlBPZmZzZXQ7CisgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgICBGLT5nZXRNYWNoaW5lTWVtT3BlcmFuZCgKKyAgICAgICAgUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soUmVnU2F2ZUZyYW1lSW5kZXgpLAorICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZDo6TU9TdG9yZSwgT2Zmc2V0LAorICAgICAgICAvKlNpemU9Ki8xNiwgLypBbGlnbj0qLzE2KTsKKyAgICBCdWlsZE1JKFhNTVNhdmVNQkIsIERMLCBUSUktPmdldChYODY6Ok1PVkFQU21yKSkKKyAgICAgIC5hZGRGcmFtZUluZGV4KFJlZ1NhdmVGcmFtZUluZGV4KQorICAgICAgLmFkZEltbSgvKlNjYWxlPSovMSkKKyAgICAgIC5hZGRSZWcoLypJbmRleFJlZz0qLzApCisgICAgICAuYWRkSW1tKC8qRGlzcD0qL09mZnNldCkKKyAgICAgIC5hZGRSZWcoLypTZWdtZW50PSovMCkKKyAgICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoaSkuZ2V0UmVnKCkpCisgICAgICAuYWRkTWVtT3BlcmFuZChNTU8pOworICB9CisKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisKKyAgcmV0dXJuIEVuZE1CQjsKK30KKworTWFjaGluZUJhc2ljQmxvY2sgKgorWDg2VGFyZ2V0TG93ZXJpbmc6OkVtaXRMb3dlcmVkU2VsZWN0KE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICBEZWJ1Z0xvYyBETCA9IE1JLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIFRvICJpbnNlcnQiIGEgU0VMRUNUX0NDIGluc3RydWN0aW9uLCB3ZSBhY3R1YWxseSBoYXZlIHRvIGluc2VydCB0aGUKKyAgLy8gZGlhbW9uZCBjb250cm9sLWZsb3cgcGF0dGVybi4gIFRoZSBpbmNvbWluZyBpbnN0cnVjdGlvbiBrbm93cyB0aGUKKyAgLy8gZGVzdGluYXRpb24gdnJlZyB0byBzZXQsIHRoZSBjb25kaXRpb24gY29kZSByZWdpc3RlciB0byBicmFuY2ggb24sIHRoZQorICAvLyB0cnVlL2ZhbHNlIHZhbHVlcyB0byBzZWxlY3QgYmV0d2VlbiwgYW5kIGEgYnJhbmNoIG9wY29kZSB0byB1c2UuCisgIGNvbnN0IEJhc2ljQmxvY2sgKkxMVk1fQkIgPSBCQi0+Z2V0QmFzaWNCbG9jaygpOworICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIEl0ID0gQkI7CisgICsrSXQ7CisKKyAgLy8gIHRoaXNNQkI6CisgIC8vICAuLi4KKyAgLy8gICBUcnVlVmFsID0gLi4uCisgIC8vICAgY21wVFkgY2NYLCByMSwgcjIKKyAgLy8gICBiQ0MgY29weTFNQkIKKyAgLy8gICBmYWxsdGhyb3VnaCAtLT4gY29weTBNQkIKKyAgTWFjaGluZUJhc2ljQmxvY2sgKnRoaXNNQkIgPSBCQjsKKyAgTWFjaGluZUZ1bmN0aW9uICpGID0gQkItPmdldFBhcmVudCgpOworICBNYWNoaW5lQmFzaWNCbG9jayAqY29weTBNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKnNpbmtNQkIgPSBGLT5DcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhMTFZNX0JCKTsKKyAgRi0+aW5zZXJ0KEl0LCBjb3B5ME1CQik7CisgIEYtPmluc2VydChJdCwgc2lua01CQik7CisKKyAgLy8gSWYgdGhlIEVGTEFHUyByZWdpc3RlciBpc24ndCBkZWFkIGluIHRoZSB0ZXJtaW5hdG9yLCB0aGVuIGNsYWltIHRoYXQgaXQncworICAvLyBsaXZlIGludG8gdGhlIHNpbmsgYW5kIGNvcHkgYmxvY2tzLgorICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gQkItPmdldFBhcmVudCgpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IE1GLT5nZXRUYXJnZXQoKS5nZXRSZWdpc3RlckluZm8oKTsKKyAgQml0VmVjdG9yIFJlc2VydmVkUmVncyA9IFRSSS0+Z2V0UmVzZXJ2ZWRSZWdzKCpNRik7CisKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IE1JLT5nZXROdW1PcGVyYW5kcygpOyBJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKEkpOworICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNVc2UoKSB8fCBNTy5pc0tpbGwoKSkgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKFJlZyAhPSBYODY6OkVGTEFHUykgY29udGludWU7CisgICAgY29weTBNQkItPmFkZExpdmVJbihSZWcpOworICAgIHNpbmtNQkItPmFkZExpdmVJbihSZWcpOworICB9CisKKyAgLy8gVHJhbnNmZXIgdGhlIHJlbWFpbmRlciBvZiBCQiBhbmQgaXRzIHN1Y2Nlc3NvciBlZGdlcyB0byBzaW5rTUJCLgorICBzaW5rTUJCLT5zcGxpY2Uoc2lua01CQi0+YmVnaW4oKSwgQkIsCisgICAgICAgICAgICAgICAgICBsbHZtOjpuZXh0KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihNSSkpLAorICAgICAgICAgICAgICAgICAgQkItPmVuZCgpKTsKKyAgc2lua01CQi0+dHJhbnNmZXJTdWNjZXNzb3JzQW5kVXBkYXRlUEhJcyhCQik7CisKKyAgLy8gQWRkIHRoZSB0cnVlIGFuZCBmYWxsdGhyb3VnaCBibG9ja3MgYXMgaXRzIHN1Y2Nlc3NvcnMuCisgIEJCLT5hZGRTdWNjZXNzb3IoY29weTBNQkIpOworICBCQi0+YWRkU3VjY2Vzc29yKHNpbmtNQkIpOworCisgIC8vIENyZWF0ZSB0aGUgY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBPcGMgPQorICAgIFg4Njo6R2V0Q29uZEJyYW5jaEZyb21Db25kKChYODY6OkNvbmRDb2RlKU1JLT5nZXRPcGVyYW5kKDMpLmdldEltbSgpKTsKKyAgQnVpbGRNSShCQiwgREwsIFRJSS0+Z2V0KE9wYykpLmFkZE1CQihzaW5rTUJCKTsKKworICAvLyAgY29weTBNQkI6CisgIC8vICAgJUZhbHNlVmFsdWUgPSAuLi4KKyAgLy8gICAjIGZhbGx0aHJvdWdoIHRvIHNpbmtNQkIKKyAgY29weTBNQkItPmFkZFN1Y2Nlc3NvcihzaW5rTUJCKTsKKworICAvLyAgc2lua01CQjoKKyAgLy8gICAlUmVzdWx0ID0gcGhpIFsgJUZhbHNlVmFsdWUsIGNvcHkwTUJCIF0sIFsgJVRydWVWYWx1ZSwgdGhpc01CQiBdCisgIC8vICAuLi4KKyAgQnVpbGRNSSgqc2lua01CQiwgc2lua01CQi0+YmVnaW4oKSwgREwsCisgICAgICAgICAgVElJLT5nZXQoWDg2OjpQSEkpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAuYWRkUmVnKE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpKS5hZGRNQkIoY29weTBNQkIpCisgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSkuYWRkTUJCKHRoaXNNQkIpOworCisgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsgICAvLyBUaGUgcHNldWRvIGluc3RydWN0aW9uIGlzIGdvbmUgbm93LgorICByZXR1cm4gc2lua01CQjsKK30KKworTWFjaGluZUJhc2ljQmxvY2sgKgorWDg2VGFyZ2V0TG93ZXJpbmc6OkVtaXRMb3dlcmVkTWluZ3dBbGxvY2EoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IGdldFRhcmdldE1hY2hpbmUoKS5nZXRJbnN0ckluZm8oKTsKKyAgRGVidWdMb2MgREwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBUaGUgbG93ZXJpbmcgaXMgcHJldHR5IGVhc3k6IHdlJ3JlIGp1c3QgZW1pdHRpbmcgdGhlIGNhbGwgdG8gX2FsbG9jYS4gIFRoZQorICAvLyBub24tdHJpdmlhbCBwYXJ0IGlzIGltcGRlZiBvZiBFU1AuCisgIC8vIEZJWE1FOiBUaGUgY29kZSBzaG91bGQgYmUgdHdlYWtlZCBhcyBzb29uIGFzIHdlJ2xsIHRyeSB0byBkbyBjb2RlZ2VuIGZvcgorICAvLyBtaW5ndy13NjQuCisKKyAgQnVpbGRNSSgqQkIsIE1JLCBETCwgVElJLT5nZXQoWDg2OjpDQUxMcGNyZWwzMikpCisgICAgLmFkZEV4dGVybmFsU3ltYm9sKCJfYWxsb2NhIikKKyAgICAuYWRkUmVnKFg4Njo6RUFYLCBSZWdTdGF0ZTo6SW1wbGljaXQpCisgICAgLmFkZFJlZyhYODY6OkVTUCwgUmVnU3RhdGU6OkltcGxpY2l0KQorICAgIC5hZGRSZWcoWDg2OjpFQVgsIFJlZ1N0YXRlOjpEZWZpbmUgfCBSZWdTdGF0ZTo6SW1wbGljaXQpCisgICAgLmFkZFJlZyhYODY6OkVTUCwgUmVnU3RhdGU6OkRlZmluZSB8IFJlZ1N0YXRlOjpJbXBsaWNpdCk7CisKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisgIHJldHVybiBCQjsKK30KKworTWFjaGluZUJhc2ljQmxvY2sgKgorWDg2VGFyZ2V0TG93ZXJpbmc6OkVtaXRMb3dlcmVkVExTQ2FsbChNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgLy8gVGhpcyBpcyBwcmV0dHkgZWFzeS4gIFdlJ3JlIHRha2luZyB0aGUgdmFsdWUgdGhhdCB3ZSByZWNlaXZlZCBmcm9tCisgIC8vIG91ciBsb2FkIGZyb20gdGhlIHJlbG9jYXRpb24sIHN0aWNraW5nIGl0IGluIGVpdGhlciBSREkgKHg4Ni02NCkKKyAgLy8gb3IgRUFYIGFuZCBkb2luZyBhbiBpbmRpcmVjdCBjYWxsLiAgVGhlIHJldHVybiB2YWx1ZSB3aWxsIHRoZW4KKyAgLy8gYmUgaW4gdGhlIG5vcm1hbCByZXR1cm4gcmVnaXN0ZXIuCisgIGNvbnN0IFg4Nkluc3RySW5mbyAqVElJIAorICAgID0gc3RhdGljX2Nhc3Q8Y29uc3QgWDg2SW5zdHJJbmZvKj4oZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpKTsKKyAgRGVidWdMb2MgREwgPSBNSS0+Z2V0RGVidWdMb2MoKTsKKyAgTWFjaGluZUZ1bmN0aW9uICpGID0gQkItPmdldFBhcmVudCgpOworICAKKyAgYXNzZXJ0KE1JLT5nZXRPcGVyYW5kKDMpLmlzR2xvYmFsKCkgJiYgIlRoaXMgc2hvdWxkIGJlIGEgZ2xvYmFsIik7CisgIAorICBpZiAoU3VidGFyZ2V0LT5pczY0Qml0KCkpIHsKKyAgICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQiA9IEJ1aWxkTUkoKkJCLCBNSSwgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJSS0+Z2V0KFg4Njo6TU9WNjRybSksIFg4Njo6UkRJKQorICAgIC5hZGRSZWcoWDg2OjpSSVApCisgICAgLmFkZEltbSgwKS5hZGRSZWcoMCkKKyAgICAuYWRkR2xvYmFsQWRkcmVzcyhNSS0+Z2V0T3BlcmFuZCgzKS5nZXRHbG9iYWwoKSwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgTUktPmdldE9wZXJhbmQoMykuZ2V0VGFyZ2V0RmxhZ3MoKSkKKyAgICAuYWRkUmVnKDApOworICAgIE1JQiA9IEJ1aWxkTUkoKkJCLCBNSSwgREwsIFRJSS0+Z2V0KFg4Njo6Q0FMTDY0bSkpOworICAgIGFkZERpcmVjdE1lbShNSUIsIFg4Njo6UkRJKTsKKyAgfSBlbHNlIGlmIChnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVsb2NhdGlvbk1vZGVsKCkgIT0gUmVsb2M6OlBJQ18pIHsKKyAgICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQiA9IEJ1aWxkTUkoKkJCLCBNSSwgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJSS0+Z2V0KFg4Njo6TU9WMzJybSksIFg4Njo6RUFYKQorICAgIC5hZGRSZWcoMCkKKyAgICAuYWRkSW1tKDApLmFkZFJlZygwKQorICAgIC5hZGRHbG9iYWxBZGRyZXNzKE1JLT5nZXRPcGVyYW5kKDMpLmdldEdsb2JhbCgpLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICBNSS0+Z2V0T3BlcmFuZCgzKS5nZXRUYXJnZXRGbGFncygpKQorICAgIC5hZGRSZWcoMCk7CisgICAgTUlCID0gQnVpbGRNSSgqQkIsIE1JLCBETCwgVElJLT5nZXQoWDg2OjpDQUxMMzJtKSk7CisgICAgYWRkRGlyZWN0TWVtKE1JQiwgWDg2OjpFQVgpOworICB9IGVsc2UgeworICAgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSSgqQkIsIE1JLCBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoWDg2OjpNT1YzMnJtKSwgWDg2OjpFQVgpCisgICAgLmFkZFJlZyhUSUktPmdldEdsb2JhbEJhc2VSZWcoRikpCisgICAgLmFkZEltbSgwKS5hZGRSZWcoMCkKKyAgICAuYWRkR2xvYmFsQWRkcmVzcyhNSS0+Z2V0T3BlcmFuZCgzKS5nZXRHbG9iYWwoKSwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgTUktPmdldE9wZXJhbmQoMykuZ2V0VGFyZ2V0RmxhZ3MoKSkKKyAgICAuYWRkUmVnKDApOworICAgIE1JQiA9IEJ1aWxkTUkoKkJCLCBNSSwgREwsIFRJSS0+Z2V0KFg4Njo6Q0FMTDMybSkpOworICAgIGFkZERpcmVjdE1lbShNSUIsIFg4Njo6RUFYKTsKKyAgfQorICAKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAvLyBUaGUgcHNldWRvIGluc3RydWN0aW9uIGlzIGdvbmUgbm93LgorICByZXR1cm4gQkI7Cit9CisKK01hY2hpbmVCYXNpY0Jsb2NrICoKK1g4NlRhcmdldExvd2VyaW5nOjpFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSAmJiAiVW5leHBlY3RlZCBpbnN0ciB0eXBlIHRvIGluc2VydCIpOworICBjYXNlIFg4Njo6TUlOR1dfQUxMT0NBOgorICAgIHJldHVybiBFbWl0TG93ZXJlZE1pbmd3QWxsb2NhKE1JLCBCQik7CisgIGNhc2UgWDg2OjpUTFNDYWxsXzMyOgorICBjYXNlIFg4Njo6VExTQ2FsbF82NDoKKyAgICByZXR1cm4gRW1pdExvd2VyZWRUTFNDYWxsKE1JLCBCQik7CisgIGNhc2UgWDg2OjpDTU9WX0dSODoKKyAgY2FzZSBYODY6OkNNT1ZfVjFJNjQ6CisgIGNhc2UgWDg2OjpDTU9WX0ZSMzI6CisgIGNhc2UgWDg2OjpDTU9WX0ZSNjQ6CisgIGNhc2UgWDg2OjpDTU9WX1Y0RjMyOgorICBjYXNlIFg4Njo6Q01PVl9WMkY2NDoKKyAgY2FzZSBYODY6OkNNT1ZfVjJJNjQ6CisgIGNhc2UgWDg2OjpDTU9WX0dSMTY6CisgIGNhc2UgWDg2OjpDTU9WX0dSMzI6CisgIGNhc2UgWDg2OjpDTU9WX1JGUDMyOgorICBjYXNlIFg4Njo6Q01PVl9SRlA2NDoKKyAgY2FzZSBYODY6OkNNT1ZfUkZQODA6CisgICAgcmV0dXJuIEVtaXRMb3dlcmVkU2VsZWN0KE1JLCBCQik7CisKKyAgY2FzZSBYODY6OkZQMzJfVE9fSU5UMTZfSU5fTUVNOgorICBjYXNlIFg4Njo6RlAzMl9UT19JTlQzMl9JTl9NRU06CisgIGNhc2UgWDg2OjpGUDMyX1RPX0lOVDY0X0lOX01FTToKKyAgY2FzZSBYODY6OkZQNjRfVE9fSU5UMTZfSU5fTUVNOgorICBjYXNlIFg4Njo6RlA2NF9UT19JTlQzMl9JTl9NRU06CisgIGNhc2UgWDg2OjpGUDY0X1RPX0lOVDY0X0lOX01FTToKKyAgY2FzZSBYODY6OkZQODBfVE9fSU5UMTZfSU5fTUVNOgorICBjYXNlIFg4Njo6RlA4MF9UT19JTlQzMl9JTl9NRU06CisgIGNhc2UgWDg2OjpGUDgwX1RPX0lOVDY0X0lOX01FTTogeworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gZ2V0VGFyZ2V0TWFjaGluZSgpLmdldEluc3RySW5mbygpOworICAgIERlYnVnTG9jIERMID0gTUktPmdldERlYnVnTG9jKCk7CisKKyAgICAvLyBDaGFuZ2UgdGhlIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXIgdG8gdXNlICJyb3VuZCB0b3dhcmRzIHplcm8iCisgICAgLy8gbW9kZSB3aGVuIHRydW5jYXRpbmcgdG8gYW4gaW50ZWdlciB2YWx1ZS4KKyAgICBNYWNoaW5lRnVuY3Rpb24gKkYgPSBCQi0+Z2V0UGFyZW50KCk7CisgICAgaW50IENXRnJhbWVJZHggPSBGLT5nZXRGcmFtZUluZm8oKS0+Q3JlYXRlU3RhY2tPYmplY3QoMiwgMiwgZmFsc2UpOworICAgIGFkZEZyYW1lUmVmZXJlbmNlKEJ1aWxkTUkoKkJCLCBNSSwgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUktPmdldChYODY6OkZOU1RDVzE2bSkpLCBDV0ZyYW1lSWR4KTsKKworICAgIC8vIExvYWQgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgaGlnaCBieXRlIG9mIHRoZSBjb250cm9sIHdvcmQuLi4KKyAgICB1bnNpZ25lZCBPbGRDVyA9CisgICAgICBGLT5nZXRSZWdJbmZvKCkuY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MpOworICAgIGFkZEZyYW1lUmVmZXJlbmNlKEJ1aWxkTUkoKkJCLCBNSSwgREwsIFRJSS0+Z2V0KFg4Njo6TU9WMTZybSksIE9sZENXKSwKKyAgICAgICAgICAgICAgICAgICAgICBDV0ZyYW1lSWR4KTsKKworICAgIC8vIFNldCB0aGUgaGlnaCBwYXJ0IHRvIGJlIHJvdW5kIHRvIHplcm8uLi4KKyAgICBhZGRGcmFtZVJlZmVyZW5jZShCdWlsZE1JKCpCQiwgTUksIERMLCBUSUktPmdldChYODY6Ok1PVjE2bWkpKSwgQ1dGcmFtZUlkeCkKKyAgICAgIC5hZGRJbW0oMHhDN0YpOworCisgICAgLy8gUmVsb2FkIHRoZSBtb2RpZmllZCBjb250cm9sIHdvcmQgbm93Li4uCisgICAgYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSSgqQkIsIE1JLCBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJSS0+Z2V0KFg4Njo6RkxEQ1cxNm0pKSwgQ1dGcmFtZUlkeCk7CisKKyAgICAvLyBSZXN0b3JlIHRoZSBtZW1vcnkgaW1hZ2Ugb2YgY29udHJvbCB3b3JkIHRvIG9yaWdpbmFsIHZhbHVlCisgICAgYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSSgqQkIsIE1JLCBETCwgVElJLT5nZXQoWDg2OjpNT1YxNm1yKSksIENXRnJhbWVJZHgpCisgICAgICAuYWRkUmVnKE9sZENXKTsKKworICAgIC8vIEdldCB0aGUgWDg2IG9wY29kZSB0byB1c2UuCisgICAgdW5zaWduZWQgT3BjOworICAgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiaWxsZWdhbCBvcGNvZGUhIik7CisgICAgY2FzZSBYODY6OkZQMzJfVE9fSU5UMTZfSU5fTUVNOiBPcGMgPSBYODY6OklTVF9GcDE2bTMyOyBicmVhazsKKyAgICBjYXNlIFg4Njo6RlAzMl9UT19JTlQzMl9JTl9NRU06IE9wYyA9IFg4Njo6SVNUX0ZwMzJtMzI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpGUDMyX1RPX0lOVDY0X0lOX01FTTogT3BjID0gWDg2OjpJU1RfRnA2NG0zMjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkZQNjRfVE9fSU5UMTZfSU5fTUVNOiBPcGMgPSBYODY6OklTVF9GcDE2bTY0OyBicmVhazsKKyAgICBjYXNlIFg4Njo6RlA2NF9UT19JTlQzMl9JTl9NRU06IE9wYyA9IFg4Njo6SVNUX0ZwMzJtNjQ7IGJyZWFrOworICAgIGNhc2UgWDg2OjpGUDY0X1RPX0lOVDY0X0lOX01FTTogT3BjID0gWDg2OjpJU1RfRnA2NG02NDsgYnJlYWs7CisgICAgY2FzZSBYODY6OkZQODBfVE9fSU5UMTZfSU5fTUVNOiBPcGMgPSBYODY6OklTVF9GcDE2bTgwOyBicmVhazsKKyAgICBjYXNlIFg4Njo6RlA4MF9UT19JTlQzMl9JTl9NRU06IE9wYyA9IFg4Njo6SVNUX0ZwMzJtODA7IGJyZWFrOworICAgIGNhc2UgWDg2OjpGUDgwX1RPX0lOVDY0X0lOX01FTTogT3BjID0gWDg2OjpJU1RfRnA2NG04MDsgYnJlYWs7CisgICAgfQorCisgICAgWDg2QWRkcmVzc01vZGUgQU07CisgICAgTWFjaGluZU9wZXJhbmQgJk9wID0gTUktPmdldE9wZXJhbmQoMCk7CisgICAgaWYgKE9wLmlzUmVnKCkpIHsKKyAgICAgIEFNLkJhc2VUeXBlID0gWDg2QWRkcmVzc01vZGU6OlJlZ0Jhc2U7CisgICAgICBBTS5CYXNlLlJlZyA9IE9wLmdldFJlZygpOworICAgIH0gZWxzZSB7CisgICAgICBBTS5CYXNlVHlwZSA9IFg4NkFkZHJlc3NNb2RlOjpGcmFtZUluZGV4QmFzZTsKKyAgICAgIEFNLkJhc2UuRnJhbWVJbmRleCA9IE9wLmdldEluZGV4KCk7CisgICAgfQorICAgIE9wID0gTUktPmdldE9wZXJhbmQoMSk7CisgICAgaWYgKE9wLmlzSW1tKCkpCisgICAgICBBTS5TY2FsZSA9IE9wLmdldEltbSgpOworICAgIE9wID0gTUktPmdldE9wZXJhbmQoMik7CisgICAgaWYgKE9wLmlzSW1tKCkpCisgICAgICBBTS5JbmRleFJlZyA9IE9wLmdldEltbSgpOworICAgIE9wID0gTUktPmdldE9wZXJhbmQoMyk7CisgICAgaWYgKE9wLmlzR2xvYmFsKCkpIHsKKyAgICAgIEFNLkdWID0gT3AuZ2V0R2xvYmFsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFNLkRpc3AgPSBPcC5nZXRJbW0oKTsKKyAgICB9CisgICAgYWRkRnVsbEFkZHJlc3MoQnVpbGRNSSgqQkIsIE1JLCBETCwgVElJLT5nZXQoT3BjKSksIEFNKQorICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoWDg2OjpBZGRyTnVtT3BlcmFuZHMpLmdldFJlZygpKTsKKworICAgIC8vIFJlbG9hZCB0aGUgb3JpZ2luYWwgY29udHJvbCB3b3JkIG5vdy4KKyAgICBhZGRGcmFtZVJlZmVyZW5jZShCdWlsZE1JKCpCQiwgTUksIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElJLT5nZXQoWDg2OjpGTERDVzE2bSkpLCBDV0ZyYW1lSWR4KTsKKworICAgIE1JLT5lcmFzZUZyb21QYXJlbnQoKTsgICAvLyBUaGUgcHNldWRvIGluc3RydWN0aW9uIGlzIGdvbmUgbm93LgorICAgIHJldHVybiBCQjsKKyAgfQorICAgIC8vIFN0cmluZy90ZXh0IHByb2Nlc3NpbmcgbG93ZXJpbmcuCisgIGNhc2UgWDg2OjpQQ01QSVNUUk0xMjhSRUc6CisgIGNhc2UgWDg2OjpWUENNUElTVFJNMTI4UkVHOgorICAgIHJldHVybiBFbWl0UENNUChNSSwgQkIsIDMsIGZhbHNlIC8qIGluLW1lbSAqLyk7CisgIGNhc2UgWDg2OjpQQ01QSVNUUk0xMjhNRU06CisgIGNhc2UgWDg2OjpWUENNUElTVFJNMTI4TUVNOgorICAgIHJldHVybiBFbWl0UENNUChNSSwgQkIsIDMsIHRydWUgLyogaW4tbWVtICovKTsKKyAgY2FzZSBYODY6OlBDTVBFU1RSTTEyOFJFRzoKKyAgY2FzZSBYODY6OlZQQ01QRVNUUk0xMjhSRUc6CisgICAgcmV0dXJuIEVtaXRQQ01QKE1JLCBCQiwgNSwgZmFsc2UgLyogaW4gbWVtICovKTsKKyAgY2FzZSBYODY6OlBDTVBFU1RSTTEyOE1FTToKKyAgY2FzZSBYODY6OlZQQ01QRVNUUk0xMjhNRU06CisgICAgcmV0dXJuIEVtaXRQQ01QKE1JLCBCQiwgNSwgdHJ1ZSAvKiBpbiBtZW0gKi8pOworCisgICAgLy8gQXRvbWljIExvd2VyaW5nLgorICBjYXNlIFg4Njo6QVRPTUFORDMyOgorICAgIHJldHVybiBFbWl0QXRvbWljQml0d2lzZVdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6QU5EMzJyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBTkQzMnJpLCBYODY6Ok1PVjMycm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6TENNUFhDSEczMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpOT1QzMnIsIFg4Njo6RUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkdSMzJSZWdpc3RlckNsYXNzKTsKKyAgY2FzZSBYODY6OkFUT01PUjMyOgorICAgIHJldHVybiBFbWl0QXRvbWljQml0d2lzZVdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6T1IzMnJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6Ok9SMzJyaSwgWDg2OjpNT1YzMnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkxDTVBYQ0hHMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6Tk9UMzJyLCBYODY6OkVBWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcyk7CisgIGNhc2UgWDg2OjpBVE9NWE9SMzI6CisgICAgcmV0dXJuIEVtaXRBdG9taWNCaXR3aXNlV2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwgWDg2OjpYT1IzMnJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OlhPUjMycmksIFg4Njo6TU9WMzJybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpMQ01QWENIRzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6Ok5PVDMyciwgWDg2OjpFQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MpOworICBjYXNlIFg4Njo6QVRPTU5BTkQzMjoKKyAgICByZXR1cm4gRW1pdEF0b21pY0JpdHdpc2VXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLCBYODY6OkFORDMycnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6QU5EMzJyaSwgWDg2OjpNT1YzMnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkxDTVBYQ0hHMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6Tk9UMzJyLCBYODY6OkVBWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgdHJ1ZSk7CisgIGNhc2UgWDg2OjpBVE9NTUlOMzI6CisgICAgcmV0dXJuIEVtaXRBdG9taWNNaW5NYXhXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLCBYODY6OkNNT1ZMMzJycik7CisgIGNhc2UgWDg2OjpBVE9NTUFYMzI6CisgICAgcmV0dXJuIEVtaXRBdG9taWNNaW5NYXhXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLCBYODY6OkNNT1ZHMzJycik7CisgIGNhc2UgWDg2OjpBVE9NVU1JTjMyOgorICAgIHJldHVybiBFbWl0QXRvbWljTWluTWF4V2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwgWDg2OjpDTU9WQjMycnIpOworICBjYXNlIFg4Njo6QVRPTVVNQVgzMjoKKyAgICByZXR1cm4gRW1pdEF0b21pY01pbk1heFdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6Q01PVkEzMnJyKTsKKworICBjYXNlIFg4Njo6QVRPTUFORDE2OgorICAgIHJldHVybiBFbWl0QXRvbWljQml0d2lzZVdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6QU5EMTZyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBTkQxNnJpLCBYODY6Ok1PVjE2cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6TENNUFhDSEcxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpOT1QxNnIsIFg4Njo6QVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MpOworICBjYXNlIFg4Njo6QVRPTU9SMTY6CisgICAgcmV0dXJuIEVtaXRBdG9taWNCaXR3aXNlV2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwgWDg2OjpPUjE2cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6T1IxNnJpLCBYODY6Ok1PVjE2cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6TENNUFhDSEcxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpOT1QxNnIsIFg4Njo6QVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MpOworICBjYXNlIFg4Njo6QVRPTVhPUjE2OgorICAgIHJldHVybiBFbWl0QXRvbWljQml0d2lzZVdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6WE9SMTZyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpYT1IxNnJpLCBYODY6Ok1PVjE2cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6TENNUFhDSEcxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpOT1QxNnIsIFg4Njo6QVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MpOworICBjYXNlIFg4Njo6QVRPTU5BTkQxNjoKKyAgICByZXR1cm4gRW1pdEF0b21pY0JpdHdpc2VXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLCBYODY6OkFORDE2cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6QU5EMTZyaSwgWDg2OjpNT1YxNnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkxDTVBYQ0hHMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6Tk9UMTZyLCBYODY6OkFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkdSMTZSZWdpc3RlckNsYXNzLCB0cnVlKTsKKyAgY2FzZSBYODY6OkFUT01NSU4xNjoKKyAgICByZXR1cm4gRW1pdEF0b21pY01pbk1heFdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6Q01PVkwxNnJyKTsKKyAgY2FzZSBYODY6OkFUT01NQVgxNjoKKyAgICByZXR1cm4gRW1pdEF0b21pY01pbk1heFdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6Q01PVkcxNnJyKTsKKyAgY2FzZSBYODY6OkFUT01VTUlOMTY6CisgICAgcmV0dXJuIEVtaXRBdG9taWNNaW5NYXhXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLCBYODY6OkNNT1ZCMTZycik7CisgIGNhc2UgWDg2OjpBVE9NVU1BWDE2OgorICAgIHJldHVybiBFbWl0QXRvbWljTWluTWF4V2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwgWDg2OjpDTU9WQTE2cnIpOworCisgIGNhc2UgWDg2OjpBVE9NQU5EODoKKyAgICByZXR1cm4gRW1pdEF0b21pY0JpdHdpc2VXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLCBYODY6OkFORDhyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBTkQ4cmksIFg4Njo6TU9WOHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkxDTVBYQ0hHOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpOT1Q4ciwgWDg2OjpBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpHUjhSZWdpc3RlckNsYXNzKTsKKyAgY2FzZSBYODY6OkFUT01PUjg6CisgICAgcmV0dXJuIEVtaXRBdG9taWNCaXR3aXNlV2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwgWDg2OjpPUjhyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpPUjhyaSwgWDg2OjpNT1Y4cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6TENNUFhDSEc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6Ok5PVDhyLCBYODY6OkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MpOworICBjYXNlIFg4Njo6QVRPTVhPUjg6CisgICAgcmV0dXJuIEVtaXRBdG9taWNCaXR3aXNlV2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwgWDg2OjpYT1I4cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6WE9SOHJpLCBYODY6Ok1PVjhybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpMQ01QWENIRzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6Tk9UOHIsIFg4Njo6QUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcyk7CisgIGNhc2UgWDg2OjpBVE9NTkFORDg6CisgICAgcmV0dXJuIEVtaXRBdG9taWNCaXR3aXNlV2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwgWDg2OjpBTkQ4cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6QU5EOHJpLCBYODY6Ok1PVjhybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpMQ01QWENIRzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6Tk9UOHIsIFg4Njo6QUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgdHJ1ZSk7CisgIC8vIEZJWE1FOiBUaGVyZSBhcmUgbm8gQ01PVjggaW5zdHJ1Y3Rpb25zOyBNSU4vTUFYIG5lZWQgc29tZSBvdGhlciB3YXkuCisgIC8vIFRoaXMgZ3JvdXAgaXMgZm9yIDY0LWJpdCBob3N0LgorICBjYXNlIFg4Njo6QVRPTUFORDY0OgorICAgIHJldHVybiBFbWl0QXRvbWljQml0d2lzZVdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6QU5ENjRyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBTkQ2NHJpMzIsIFg4Njo6TU9WNjRybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpMQ01QWENIRzY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6Ok5PVDY0ciwgWDg2OjpSQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MpOworICBjYXNlIFg4Njo6QVRPTU9SNjQ6CisgICAgcmV0dXJuIEVtaXRBdG9taWNCaXR3aXNlV2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwgWDg2OjpPUjY0cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6T1I2NHJpMzIsIFg4Njo6TU9WNjRybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpMQ01QWENIRzY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6Ok5PVDY0ciwgWDg2OjpSQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MpOworICBjYXNlIFg4Njo6QVRPTVhPUjY0OgorICAgIHJldHVybiBFbWl0QXRvbWljQml0d2lzZVdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6WE9SNjRyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpYT1I2NHJpMzIsIFg4Njo6TU9WNjRybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpMQ01QWENIRzY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6Ok5PVDY0ciwgWDg2OjpSQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MpOworICBjYXNlIFg4Njo6QVRPTU5BTkQ2NDoKKyAgICByZXR1cm4gRW1pdEF0b21pY0JpdHdpc2VXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLCBYODY6OkFORDY0cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6QU5ENjRyaTMyLCBYODY6Ok1PVjY0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6TENNUFhDSEc2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpOT1Q2NHIsIFg4Njo6UkFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCB0cnVlKTsKKyAgY2FzZSBYODY6OkFUT01NSU42NDoKKyAgICByZXR1cm4gRW1pdEF0b21pY01pbk1heFdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6Q01PVkw2NHJyKTsKKyAgY2FzZSBYODY6OkFUT01NQVg2NDoKKyAgICByZXR1cm4gRW1pdEF0b21pY01pbk1heFdpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsIFg4Njo6Q01PVkc2NHJyKTsKKyAgY2FzZSBYODY6OkFUT01VTUlONjQ6CisgICAgcmV0dXJuIEVtaXRBdG9taWNNaW5NYXhXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLCBYODY6OkNNT1ZCNjRycik7CisgIGNhc2UgWDg2OjpBVE9NVU1BWDY0OgorICAgIHJldHVybiBFbWl0QXRvbWljTWluTWF4V2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwgWDg2OjpDTU9WQTY0cnIpOworCisgIC8vIFRoaXMgZ3JvdXAgZG9lcyA2NC1iaXQgb3BlcmF0aW9ucyBvbiBhIDMyLWJpdCBob3N0LgorICBjYXNlIFg4Njo6QVRPTUFORDY0MzI6CisgICAgcmV0dXJuIEVtaXRBdG9taWNCaXQ2NDMyV2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBTkQzMnJyLCBYODY6OkFORDMycnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6QU5EMzJyaSwgWDg2OjpBTkQzMnJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIGNhc2UgWDg2OjpBVE9NT1I2NDMyOgorICAgIHJldHVybiBFbWl0QXRvbWljQml0NjQzMldpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6T1IzMnJyLCBYODY6Ok9SMzJyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpPUjMycmksIFg4Njo6T1IzMnJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIGNhc2UgWDg2OjpBVE9NWE9SNjQzMjoKKyAgICByZXR1cm4gRW1pdEF0b21pY0JpdDY0MzJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OlhPUjMycnIsIFg4Njo6WE9SMzJyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpYT1IzMnJpLCBYODY6OlhPUjMycmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgY2FzZSBYODY6OkFUT01OQU5ENjQzMjoKKyAgICByZXR1cm4gRW1pdEF0b21pY0JpdDY0MzJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkFORDMycnIsIFg4Njo6QU5EMzJyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBTkQzMnJpLCBYODY6OkFORDMycmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICBjYXNlIFg4Njo6QVRPTUFERDY0MzI6CisgICAgcmV0dXJuIEVtaXRBdG9taWNCaXQ2NDMyV2l0aEN1c3RvbUluc2VydGVyKE1JLCBCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBREQzMnJyLCBYODY6OkFEQzMycnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6QUREMzJyaSwgWDg2OjpBREMzMnJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIGNhc2UgWDg2OjpBVE9NU1VCNjQzMjoKKyAgICByZXR1cm4gRW1pdEF0b21pY0JpdDY0MzJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OlNVQjMycnIsIFg4Njo6U0JCMzJyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpTVUIzMnJpLCBYODY6OlNCQjMycmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgY2FzZSBYODY6OkFUT01TV0FQNjQzMjoKKyAgICByZXR1cm4gRW1pdEF0b21pY0JpdDY0MzJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTUksIEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6Ok1PVjMycnIsIFg4Njo6TU9WMzJyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpNT1YzMnJpLCBYODY6Ok1PVjMycmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgY2FzZSBYODY6OlZBU1RBUlRfU0FWRV9YTU1fUkVHUzoKKyAgICByZXR1cm4gRW1pdFZBU3RhcnRTYXZlWE1NUmVnc1dpdGhDdXN0b21JbnNlcnRlcihNSSwgQkIpOworICB9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4NiBPcHRpbWl6YXRpb24gSG9va3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgWDg2VGFyZ2V0TG93ZXJpbmc6OmNvbXB1dGVNYXNrZWRCaXRzRm9yVGFyZ2V0Tm9kZShjb25zdCBTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSBjb25zdCB7CisgIHVuc2lnbmVkIE9wYyA9IE9wLmdldE9wY29kZSgpOworICBhc3NlcnQoKE9wYyA+PSBJU0Q6OkJVSUxUSU5fT1BfRU5EIHx8CisgICAgICAgICAgT3BjID09IElTRDo6SU5UUklOU0lDX1dPX0NIQUlOIHx8CisgICAgICAgICAgT3BjID09IElTRDo6SU5UUklOU0lDX1dfQ0hBSU4gfHwKKyAgICAgICAgICBPcGMgPT0gSVNEOjpJTlRSSU5TSUNfVk9JRCkgJiYKKyAgICAgICAgICJTaG91bGQgdXNlIE1hc2tlZFZhbHVlSXNaZXJvIGlmIHlvdSBkb24ndCBrbm93IHdoZXRoZXIgT3AiCisgICAgICAgICAiIGlzIGEgdGFyZ2V0IG5vZGUhIik7CisKKyAgS25vd25aZXJvID0gS25vd25PbmUgPSBBUEludChNYXNrLmdldEJpdFdpZHRoKCksIDApOyAgIC8vIERvbid0IGtub3cgYW55dGhpbmcuCisgIHN3aXRjaCAoT3BjKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIFg4NklTRDo6QUREOgorICBjYXNlIFg4NklTRDo6U1VCOgorICBjYXNlIFg4NklTRDo6U01VTDoKKyAgY2FzZSBYODZJU0Q6OlVNVUw6CisgIGNhc2UgWDg2SVNEOjpJTkM6CisgIGNhc2UgWDg2SVNEOjpERUM6CisgIGNhc2UgWDg2SVNEOjpPUjoKKyAgY2FzZSBYODZJU0Q6OlhPUjoKKyAgY2FzZSBYODZJU0Q6OkFORDoKKyAgICAvLyBUaGVzZSBub2Rlcycgc2Vjb25kIHJlc3VsdCBpcyBhIGJvb2xlYW4uCisgICAgaWYgKE9wLmdldFJlc05vKCkgPT0gMCkKKyAgICAgIGJyZWFrOworICAgIC8vIEZhbGx0aHJvdWdoCisgIGNhc2UgWDg2SVNEOjpTRVRDQzoKKyAgICBLbm93blplcm8gfD0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KE1hc2suZ2V0Qml0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2suZ2V0Qml0V2lkdGgoKSAtIDEpOworICAgIGJyZWFrOworICB9Cit9CisKKy8vLyBpc0dBUGx1c09mZnNldCAtIFJldHVybnMgdHJ1ZSAoYW5kIHRoZSBHbG9iYWxWYWx1ZSBhbmQgdGhlIG9mZnNldCkgaWYgdGhlCisvLy8gbm9kZSBpcyBhIEdsb2JhbEFkZHJlc3MgKyBvZmZzZXQuCitib29sIFg4NlRhcmdldExvd2VyaW5nOjppc0dBUGx1c09mZnNldChTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSogJkdBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmT2Zmc2V0KSBjb25zdCB7CisgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBYODZJU0Q6OldyYXBwZXIpIHsKKyAgICBpZiAoaXNhPEdsb2JhbEFkZHJlc3NTRE5vZGU+KE4tPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICBHQSA9IGNhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oTi0+Z2V0T3BlcmFuZCgwKSktPmdldEdsb2JhbCgpOworICAgICAgT2Zmc2V0ID0gY2FzdDxHbG9iYWxBZGRyZXNzU0ROb2RlPihOLT5nZXRPcGVyYW5kKDApKS0+Z2V0T2Zmc2V0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRhcmdldExvd2VyaW5nOjppc0dBUGx1c09mZnNldChOLCBHQSwgT2Zmc2V0KTsKK30KKworLy8vIFBlcmZvcm1TaHVmZmxlQ29tYmluZSAtIENvbWJpbmUgYSB2ZWN0b3Jfc2h1ZmZsZSB0aGF0IGlzIGVxdWFsIHRvCisvLy8gYnVpbGRfdmVjdG9yIGxvYWQxLCBsb2FkMiwgbG9hZDMsIGxvYWQ0LCA8MCwgMSwgMiwgMz4gaW50byBhIDEyOC1iaXQgbG9hZAorLy8vIGlmIHRoZSBsb2FkIGFkZHJlc3NlcyBhcmUgY29uc2VjdXRpdmUsIG5vbi1vdmVybGFwcGluZywgYW5kIGluIHRoZSByaWdodAorLy8vIG9yZGVyLgorc3RhdGljIFNEVmFsdWUgUGVyZm9ybVNodWZmbGVDb21iaW5lKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKTsKKyAgU2h1ZmZsZVZlY3RvclNETm9kZSAqU1ZOID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKTsKKworICBpZiAoVlQuZ2V0U2l6ZUluQml0cygpICE9IDEyOCkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDE2PiBFbHRzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpCisgICAgRWx0cy5wdXNoX2JhY2soREFHLmdldFNodWZmbGVTY2FsYXJFbHQoU1ZOLCBpKSk7CisgIAorICByZXR1cm4gRWx0c0Zyb21Db25zZWN1dGl2ZUxvYWRzKFZULCBFbHRzLCBkbCwgREFHKTsKK30KKworLy8vIFBlcmZvcm1TaHVmZmxlQ29tYmluZSAtIERldGVjdCB2ZWN0b3IgZ2F0aGVyL3NjYXR0ZXIgaW5kZXggZ2VuZXJhdGlvbgorLy8vIGFuZCBjb252ZXJ0IGl0IGZyb20gYmVpbmcgYSBidW5jaCBvZiBzaHVmZmxlcyBhbmQgZXh0cmFjdHMgdG8gYSBzaW1wbGUKKy8vLyBzdG9yZSBhbmQgc2NhbGFyIGxvYWRzIHRvIGV4dHJhY3QgdGhlIGVsZW1lbnRzLgorc3RhdGljIFNEVmFsdWUgUGVyZm9ybUVYVFJBQ1RfVkVDVE9SX0VMVENvbWJpbmUoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpIHsKKyAgU0RWYWx1ZSBJbnB1dFZlY3RvciA9IE4tPmdldE9wZXJhbmQoMCk7CisKKyAgLy8gT25seSBvcGVyYXRlIG9uIHZlY3RvcnMgb2YgNCBlbGVtZW50cywgd2hlcmUgdGhlIGFsdGVybmF0aXZlIHNodWZmbGluZworICAvLyBnZXRzIHRvIGJlIG1vcmUgZXhwZW5zaXZlLgorICBpZiAoSW5wdXRWZWN0b3IuZ2V0VmFsdWVUeXBlKCkgIT0gTVZUOjp2NGkzMikKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIC8vIENoZWNrIHdoZXRoZXIgZXZlcnkgdXNlIG9mIElucHV0VmVjdG9yIGlzIGFuIEVYVFJBQ1RfVkVDVE9SX0VMVCB3aXRoIGEKKyAgLy8gc2luZ2xlIHVzZSB3aGljaCBpcyBhIHNpZ24tZXh0ZW5kIG9yIHplcm8tZXh0ZW5kLCBhbmQgYWxsIGVsZW1lbnRzIGFyZQorICAvLyB1c2VkLgorICBTbWFsbFZlY3RvcjxTRE5vZGUgKiwgND4gVXNlczsKKyAgdW5zaWduZWQgRXh0cmFjdGVkRWxlbWVudHMgPSAwOworICBmb3IgKFNETm9kZTo6dXNlX2l0ZXJhdG9yIFVJID0gSW5wdXRWZWN0b3IuZ2V0Tm9kZSgpLT51c2VfYmVnaW4oKSwKKyAgICAgICBVRSA9IElucHV0VmVjdG9yLmdldE5vZGUoKS0+dXNlX2VuZCgpOyBVSSAhPSBVRTsgKytVSSkgeworICAgIGlmIChVSS5nZXRVc2UoKS5nZXRSZXNObygpICE9IElucHV0VmVjdG9yLmdldFJlc05vKCkpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgICAgU0ROb2RlICpFeHRyYWN0ID0gKlVJOworICAgIGlmIChFeHRyYWN0LT5nZXRPcGNvZGUoKSAhPSBJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICBpZiAoRXh0cmFjdC0+Z2V0VmFsdWVUeXBlKDApICE9IE1WVDo6aTMyKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICBpZiAoIUV4dHJhY3QtPmhhc09uZVVzZSgpKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICBpZiAoRXh0cmFjdC0+dXNlX2JlZ2luKCktPmdldE9wY29kZSgpICE9IElTRDo6U0lHTl9FWFRFTkQgJiYKKyAgICAgICAgRXh0cmFjdC0+dXNlX2JlZ2luKCktPmdldE9wY29kZSgpICE9IElTRDo6WkVST19FWFRFTkQpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworICAgIGlmICghaXNhPENvbnN0YW50U0ROb2RlPihFeHRyYWN0LT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICAvLyBSZWNvcmQgd2hpY2ggZWxlbWVudCB3YXMgZXh0cmFjdGVkLgorICAgIEV4dHJhY3RlZEVsZW1lbnRzIHw9CisgICAgICAxIDw8IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KEV4dHJhY3QtPmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKTsKKworICAgIFVzZXMucHVzaF9iYWNrKEV4dHJhY3QpOworICB9CisKKyAgLy8gSWYgbm90IGFsbCB0aGUgZWxlbWVudHMgd2VyZSB1c2VkLCB0aGlzIG1heSBub3QgYmUgd29ydGh3aGlsZS4KKyAgaWYgKEV4dHJhY3RlZEVsZW1lbnRzICE9IDE1KQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgLy8gT2ssIHdlJ3ZlIG5vdyBkZWNpZGVkIHRvIGRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgRGVidWdMb2MgZGwgPSBJbnB1dFZlY3Rvci5nZXREZWJ1Z0xvYygpOworCisgIC8vIFN0b3JlIHRoZSB2YWx1ZSB0byBhIHRlbXBvcmFyeSBzdGFjayBzbG90LgorICBTRFZhbHVlIFN0YWNrUHRyID0gREFHLkNyZWF0ZVN0YWNrVGVtcG9yYXJ5KElucHV0VmVjdG9yLmdldFZhbHVlVHlwZSgpKTsKKyAgU0RWYWx1ZSBDaCA9IERBRy5nZXRTdG9yZShEQUcuZ2V0RW50cnlOb2RlKCksIGRsLCBJbnB1dFZlY3RvciwgU3RhY2tQdHIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAvLyBSZXBsYWNlIGVhY2ggdXNlIChleHRyYWN0KSB3aXRoIGEgbG9hZCBvZiB0aGUgYXBwcm9wcmlhdGUgZWxlbWVudC4KKyAgZm9yIChTbWFsbFZlY3RvckltcGw8U0ROb2RlICo+OjppdGVyYXRvciBVSSA9IFVzZXMuYmVnaW4oKSwKKyAgICAgICBVRSA9IFVzZXMuZW5kKCk7IFVJICE9IFVFOyArK1VJKSB7CisgICAgU0ROb2RlICpFeHRyYWN0ID0gKlVJOworCisgICAgLy8gQ29tcHV0ZSB0aGUgZWxlbWVudCdzIGFkZHJlc3MuCisgICAgU0RWYWx1ZSBJZHggPSBFeHRyYWN0LT5nZXRPcGVyYW5kKDEpOworICAgIHVuc2lnbmVkIEVsdFNpemUgPQorICAgICAgICBJbnB1dFZlY3Rvci5nZXRWYWx1ZVR5cGUoKS5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKS84OworICAgIHVpbnQ2NF90IE9mZnNldCA9IEVsdFNpemUgKiBjYXN0PENvbnN0YW50U0ROb2RlPihJZHgpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBTRFZhbHVlIE9mZnNldFZhbCA9IERBRy5nZXRDb25zdGFudChPZmZzZXQsIFRMSS5nZXRQb2ludGVyVHkoKSk7CisKKyAgICBTRFZhbHVlIFNjYWxhckFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIElkeC5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXRWYWwsIFN0YWNrUHRyKTsKKworICAgIC8vIExvYWQgdGhlIHNjYWxhci4KKyAgICBTRFZhbHVlIExvYWRTY2FsYXIgPSBEQUcuZ2V0TG9hZChFeHRyYWN0LT5nZXRWYWx1ZVR5cGUoMCksIGRsLCBDaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJBZGRyLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgLy8gUmVwbGFjZSB0aGUgZXhhY3Qgd2l0aCB0aGUgbG9hZC4KKyAgICBEQUcuUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlKEV4dHJhY3QsIDApLCBMb2FkU2NhbGFyKTsKKyAgfQorCisgIC8vIFRoZSByZXBsYWNlbWVudCB3YXMgbWFkZSBpbiBwbGFjZTsgZG9uJ3QgcmV0dXJuIGFueXRoaW5nLgorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gUGVyZm9ybVNFTEVDVENvbWJpbmUgLSBEbyB0YXJnZXQtc3BlY2lmaWMgZGFnIGNvbWJpbmVzIG9uIFNFTEVDVCBub2Rlcy4KK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1TRUxFQ1RDb21iaW5lKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYODZTdWJ0YXJnZXQgKlN1YnRhcmdldCkgeworICBEZWJ1Z0xvYyBETCA9IE4tPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgQ29uZCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIC8vIEdldCB0aGUgTEhTL1JIUyBvZiB0aGUgc2VsZWN0LgorICBTRFZhbHVlIExIUyA9IE4tPmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgUkhTID0gTi0+Z2V0T3BlcmFuZCgyKTsKKworICAvLyBJZiB3ZSBoYXZlIFNTRVsxMl0gc3VwcG9ydCwgdHJ5IHRvIGZvcm0gbWluL21heCBub2Rlcy4gU1NFIG1pbi9tYXgKKyAgLy8gaW5zdHJ1Y3Rpb25zIG1hdGNoIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNvbW1vbiBDIGlkaW9tIHg8eT94OnkgYnV0IG5vdAorICAvLyB4PD15P3g6eSwgYmVjYXVzZSBvZiBob3cgdGhleSBoYW5kbGUgbmVnYXRpdmUgemVybyAod2hpY2ggY2FuIGJlCisgIC8vIGlnbm9yZWQgaW4gdW5zYWZlLW1hdGggbW9kZSkuCisgIGlmIChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJgorICAgICAgKExIUy5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmYzMiB8fCBMSFMuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmNjQpICYmCisgICAgICBDb25kLmdldE9wY29kZSgpID09IElTRDo6U0VUQ0MpIHsKKyAgICBJU0Q6OkNvbmRDb2RlIENDID0gY2FzdDxDb25kQ29kZVNETm9kZT4oQ29uZC5nZXRPcGVyYW5kKDIpKS0+Z2V0KCk7CisKKyAgICB1bnNpZ25lZCBPcGNvZGUgPSAwOworICAgIC8vIENoZWNrIGZvciB4IENDIHkgPyB4IDogeS4KKyAgICBpZiAoREFHLmlzRXF1YWxUbyhMSFMsIENvbmQuZ2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgREFHLmlzRXF1YWxUbyhSSFMsIENvbmQuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHN3aXRjaCAoQ0MpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVFVMVDoKKyAgICAgICAgLy8gQ29udmVydGluZyB0aGlzIHRvIGEgbWluIHdvdWxkIGhhbmRsZSBOYU5zIGluY29ycmVjdGx5LCBhbmQgc3dhcHBpbmcKKyAgICAgICAgLy8gdGhlIG9wZXJhbmRzIHdvdWxkIGNhdXNlIGl0IHRvIGhhbmRsZSBjb21wYXJpc29ucyBiZXR3ZWVuIHBvc2l0aXZlCisgICAgICAgIC8vIGFuZCBuZWdhdGl2ZSB6ZXJvIGluY29ycmVjdGx5LgorICAgICAgICBpZiAoIURBRy5pc0tub3duTmV2ZXJOYU4oTEhTKSB8fCAhREFHLmlzS25vd25OZXZlck5hTihSSFMpKSB7CisgICAgICAgICAgaWYgKCFVbnNhZmVGUE1hdGggJiYKKyAgICAgICAgICAgICAgIShEQUcuaXNLbm93bk5ldmVyWmVybyhMSFMpIHx8IERBRy5pc0tub3duTmV2ZXJaZXJvKFJIUykpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgICAgICAgfQorICAgICAgICBPcGNvZGUgPSBYODZJU0Q6OkZNSU47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVE9MRToKKyAgICAgICAgLy8gQ29udmVydGluZyB0aGlzIHRvIGEgbWluIHdvdWxkIGhhbmRsZSBjb21wYXJpc29ucyBiZXR3ZWVuIHBvc2l0aXZlCisgICAgICAgIC8vIGFuZCBuZWdhdGl2ZSB6ZXJvIGluY29ycmVjdGx5LgorICAgICAgICBpZiAoIVVuc2FmZUZQTWF0aCAmJgorICAgICAgICAgICAgIURBRy5pc0tub3duTmV2ZXJaZXJvKExIUykgJiYgIURBRy5pc0tub3duTmV2ZXJaZXJvKFJIUykpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIE9wY29kZSA9IFg4NklTRDo6Rk1JTjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElTRDo6U0VUVUxFOgorICAgICAgICAvLyBDb252ZXJ0aW5nIHRoaXMgdG8gYSBtaW4gd291bGQgaGFuZGxlIGJvdGggbmVnYXRpdmUgemVyb3MgYW5kIE5hTnMKKyAgICAgICAgLy8gaW5jb3JyZWN0bHksIGJ1dCB3ZSBjYW4gc3dhcCB0aGUgb3BlcmFuZHMgdG8gZml4IGJvdGguCisgICAgICAgIHN0ZDo6c3dhcChMSFMsIFJIUyk7CisgICAgICBjYXNlIElTRDo6U0VUT0xUOgorICAgICAgY2FzZSBJU0Q6OlNFVExUOgorICAgICAgY2FzZSBJU0Q6OlNFVExFOgorICAgICAgICBPcGNvZGUgPSBYODZJU0Q6OkZNSU47CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElTRDo6U0VUT0dFOgorICAgICAgICAvLyBDb252ZXJ0aW5nIHRoaXMgdG8gYSBtYXggd291bGQgaGFuZGxlIGNvbXBhcmlzb25zIGJldHdlZW4gcG9zaXRpdmUKKyAgICAgICAgLy8gYW5kIG5lZ2F0aXZlIHplcm8gaW5jb3JyZWN0bHkuCisgICAgICAgIGlmICghVW5zYWZlRlBNYXRoICYmCisgICAgICAgICAgICAhREFHLmlzS25vd25OZXZlclplcm8oTEhTKSAmJiAhREFHLmlzS25vd25OZXZlclplcm8oTEhTKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgT3Bjb2RlID0gWDg2SVNEOjpGTUFYOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTRVRVR1Q6CisgICAgICAgIC8vIENvbnZlcnRpbmcgdGhpcyB0byBhIG1heCB3b3VsZCBoYW5kbGUgTmFOcyBpbmNvcnJlY3RseSwgYW5kIHN3YXBwaW5nCisgICAgICAgIC8vIHRoZSBvcGVyYW5kcyB3b3VsZCBjYXVzZSBpdCB0byBoYW5kbGUgY29tcGFyaXNvbnMgYmV0d2VlbiBwb3NpdGl2ZQorICAgICAgICAvLyBhbmQgbmVnYXRpdmUgemVybyBpbmNvcnJlY3RseS4KKyAgICAgICAgaWYgKCFEQUcuaXNLbm93bk5ldmVyTmFOKExIUykgfHwgIURBRy5pc0tub3duTmV2ZXJOYU4oUkhTKSkgeworICAgICAgICAgIGlmICghVW5zYWZlRlBNYXRoICYmCisgICAgICAgICAgICAgICEoREFHLmlzS25vd25OZXZlclplcm8oTEhTKSB8fCBEQUcuaXNLbm93bk5ldmVyWmVybyhSSFMpKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHN0ZDo6c3dhcChMSFMsIFJIUyk7CisgICAgICAgIH0KKyAgICAgICAgT3Bjb2RlID0gWDg2SVNEOjpGTUFYOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTRVRVR0U6CisgICAgICAgIC8vIENvbnZlcnRpbmcgdGhpcyB0byBhIG1heCB3b3VsZCBoYW5kbGUgYm90aCBuZWdhdGl2ZSB6ZXJvcyBhbmQgTmFOcworICAgICAgICAvLyBpbmNvcnJlY3RseSwgYnV0IHdlIGNhbiBzd2FwIHRoZSBvcGVyYW5kcyB0byBmaXggYm90aC4KKyAgICAgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgICAgIGNhc2UgSVNEOjpTRVRPR1Q6CisgICAgICBjYXNlIElTRDo6U0VUR1Q6CisgICAgICBjYXNlIElTRDo6U0VUR0U6CisgICAgICAgIE9wY29kZSA9IFg4NklTRDo6Rk1BWDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgLy8gQ2hlY2sgZm9yIHggQ0MgeSA/IHkgOiB4IC0tIGEgbWluL21heCB3aXRoIHJldmVyc2VkIGFybXMuCisgICAgfSBlbHNlIGlmIChEQUcuaXNFcXVhbFRvKExIUywgQ29uZC5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgICAgICAgICAgREFHLmlzRXF1YWxUbyhSSFMsIENvbmQuZ2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgIHN3aXRjaCAoQ0MpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVE9HRToKKyAgICAgICAgLy8gQ29udmVydGluZyB0aGlzIHRvIGEgbWluIHdvdWxkIGhhbmRsZSBjb21wYXJpc29ucyBiZXR3ZWVuIHBvc2l0aXZlCisgICAgICAgIC8vIGFuZCBuZWdhdGl2ZSB6ZXJvIGluY29ycmVjdGx5LCBhbmQgc3dhcHBpbmcgdGhlIG9wZXJhbmRzIHdvdWxkCisgICAgICAgIC8vIGNhdXNlIGl0IHRvIGhhbmRsZSBOYU5zIGluY29ycmVjdGx5LgorICAgICAgICBpZiAoIVVuc2FmZUZQTWF0aCAmJgorICAgICAgICAgICAgIShEQUcuaXNLbm93bk5ldmVyWmVybyhMSFMpIHx8IERBRy5pc0tub3duTmV2ZXJaZXJvKFJIUykpKSB7CisgICAgICAgICAgaWYgKCFEQUcuaXNLbm93bk5ldmVyTmFOKExIUykgfHwgIURBRy5pc0tub3duTmV2ZXJOYU4oUkhTKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHN0ZDo6c3dhcChMSFMsIFJIUyk7CisgICAgICAgIH0KKyAgICAgICAgT3Bjb2RlID0gWDg2SVNEOjpGTUlOOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpTRVRVR1Q6CisgICAgICAgIC8vIENvbnZlcnRpbmcgdGhpcyB0byBhIG1pbiB3b3VsZCBoYW5kbGUgTmFOcyBpbmNvcnJlY3RseS4KKyAgICAgICAgaWYgKCFVbnNhZmVGUE1hdGggJiYKKyAgICAgICAgICAgICghREFHLmlzS25vd25OZXZlck5hTihMSFMpIHx8ICFEQUcuaXNLbm93bk5ldmVyTmFOKFJIUykpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBPcGNvZGUgPSBYODZJU0Q6OkZNSU47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVFVHRToKKyAgICAgICAgLy8gQ29udmVydGluZyB0aGlzIHRvIGEgbWluIHdvdWxkIGhhbmRsZSBib3RoIG5lZ2F0aXZlIHplcm9zIGFuZCBOYU5zCisgICAgICAgIC8vIGluY29ycmVjdGx5LCBidXQgd2UgY2FuIHN3YXAgdGhlIG9wZXJhbmRzIHRvIGZpeCBib3RoLgorICAgICAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgICAgY2FzZSBJU0Q6OlNFVE9HVDoKKyAgICAgIGNhc2UgSVNEOjpTRVRHVDoKKyAgICAgIGNhc2UgSVNEOjpTRVRHRToKKyAgICAgICAgT3Bjb2RlID0gWDg2SVNEOjpGTUlOOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJU0Q6OlNFVFVMVDoKKyAgICAgICAgLy8gQ29udmVydGluZyB0aGlzIHRvIGEgbWF4IHdvdWxkIGhhbmRsZSBOYU5zIGluY29ycmVjdGx5LgorICAgICAgICBpZiAoIURBRy5pc0tub3duTmV2ZXJOYU4oTEhTKSB8fCAhREFHLmlzS25vd25OZXZlck5hTihSSFMpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBPcGNvZGUgPSBYODZJU0Q6OkZNQVg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVE9MRToKKyAgICAgICAgLy8gQ29udmVydGluZyB0aGlzIHRvIGEgbWF4IHdvdWxkIGhhbmRsZSBjb21wYXJpc29ucyBiZXR3ZWVuIHBvc2l0aXZlCisgICAgICAgIC8vIGFuZCBuZWdhdGl2ZSB6ZXJvIGluY29ycmVjdGx5LCBhbmQgc3dhcHBpbmcgdGhlIG9wZXJhbmRzIHdvdWxkCisgICAgICAgIC8vIGNhdXNlIGl0IHRvIGhhbmRsZSBOYU5zIGluY29ycmVjdGx5LgorICAgICAgICBpZiAoIVVuc2FmZUZQTWF0aCAmJgorICAgICAgICAgICAgIURBRy5pc0tub3duTmV2ZXJaZXJvKExIUykgJiYgIURBRy5pc0tub3duTmV2ZXJaZXJvKFJIUykpIHsKKyAgICAgICAgICBpZiAoIURBRy5pc0tub3duTmV2ZXJOYU4oTEhTKSB8fCAhREFHLmlzS25vd25OZXZlck5hTihSSFMpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgICAgICAgfQorICAgICAgICBPcGNvZGUgPSBYODZJU0Q6OkZNQVg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNFVFVMRToKKyAgICAgICAgLy8gQ29udmVydGluZyB0aGlzIHRvIGEgbWF4IHdvdWxkIGhhbmRsZSBib3RoIG5lZ2F0aXZlIHplcm9zIGFuZCBOYU5zCisgICAgICAgIC8vIGluY29ycmVjdGx5LCBidXQgd2UgY2FuIHN3YXAgdGhlIG9wZXJhbmRzIHRvIGZpeCBib3RoLgorICAgICAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgICAgY2FzZSBJU0Q6OlNFVE9MVDoKKyAgICAgIGNhc2UgSVNEOjpTRVRMVDoKKyAgICAgIGNhc2UgSVNEOjpTRVRMRToKKyAgICAgICAgT3Bjb2RlID0gWDg2SVNEOjpGTUFYOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoT3Bjb2RlKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKE9wY29kZSwgREwsIE4tPmdldFZhbHVlVHlwZSgwKSwgTEhTLCBSSFMpOworICB9CisKKyAgLy8gSWYgdGhpcyBpcyBhIHNlbGVjdCBiZXR3ZWVuIHR3byBpbnRlZ2VyIGNvbnN0YW50cywgdHJ5IHRvIGRvIHNvbWUKKyAgLy8gb3B0aW1pemF0aW9ucy4KKyAgaWYgKENvbnN0YW50U0ROb2RlICpUcnVlQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihMSFMpKSB7CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpGYWxzZUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oUkhTKSkKKyAgICAgIC8vIERvbid0IGRvIHRoaXMgZm9yIGNyYXp5IGludGVnZXIgdHlwZXMuCisgICAgICBpZiAoREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLmlzVHlwZUxlZ2FsKExIUy5nZXRWYWx1ZVR5cGUoKSkpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBlZmZpY2llbnRseSBpbnZlcnRpYmxlLCBjYW5vbmljYWxpemUgdGhlIExIU0MvUkhTQyB2YWx1ZXMKKyAgICAgICAgLy8gc28gdGhhdCBUcnVlQyAodGhlIHRydWUgdmFsdWUpIGlzIGxhcmdlciB0aGFuIEZhbHNlQy4KKyAgICAgICAgYm9vbCBOZWVkc0NvbmRJbnZlcnQgPSBmYWxzZTsKKworICAgICAgICBpZiAoVHJ1ZUMtPmdldEFQSW50VmFsdWUoKS51bHQoRmFsc2VDLT5nZXRBUEludFZhbHVlKCkpICYmCisgICAgICAgICAgICAvLyBFZmZpY2llbnRseSBpbnZlcnRpYmxlLgorICAgICAgICAgICAgKENvbmQuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTRVRDQyB8fCAgLy8gc2V0Y2MgLT4gaW52ZXJ0aWJsZS4KKyAgICAgICAgICAgICAoQ29uZC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlhPUiAmJiAgIC8vIHhvcihYLCBDKSAtPiBpbnZlcnRpYmxlLgorICAgICAgICAgICAgICBpc2E8Q29uc3RhbnRTRE5vZGU+KENvbmQuZ2V0T3BlcmFuZCgxKSkpKSkgeworICAgICAgICAgIE5lZWRzQ29uZEludmVydCA9IHRydWU7CisgICAgICAgICAgc3RkOjpzd2FwKFRydWVDLCBGYWxzZUMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3B0aW1pemUgQyA/IDggOiAwIC0+IHpleHQoQykgPDwgMy4gIExpa2V3aXNlIGZvciBhbnkgcG93Mi8wLgorICAgICAgICBpZiAoRmFsc2VDLT5nZXRBUEludFZhbHVlKCkgPT0gMCAmJgorICAgICAgICAgICAgVHJ1ZUMtPmdldEFQSW50VmFsdWUoKS5pc1Bvd2VyT2YyKCkpIHsKKyAgICAgICAgICBpZiAoTmVlZHNDb25kSW52ZXJ0KSAvLyBJbnZlcnQgdGhlIGNvbmRpdGlvbiBpZiBuZWVkZWQuCisgICAgICAgICAgICBDb25kID0gREFHLmdldE5vZGUoSVNEOjpYT1IsIERMLCBDb25kLmdldFZhbHVlVHlwZSgpLCBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxLCBDb25kLmdldFZhbHVlVHlwZSgpKSk7CisKKyAgICAgICAgICAvLyBaZXJvIGV4dGVuZCB0aGUgY29uZGl0aW9uIGlmIG5lZWRlZC4KKyAgICAgICAgICBDb25kID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgREwsIExIUy5nZXRWYWx1ZVR5cGUoKSwgQ29uZCk7CisKKyAgICAgICAgICB1bnNpZ25lZCBTaEFtdCA9IFRydWVDLT5nZXRBUEludFZhbHVlKCkubG9nQmFzZTIoKTsKKyAgICAgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpTSEwsIERMLCBMSFMuZ2V0VmFsdWVUeXBlKCksIENvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChTaEFtdCwgTVZUOjppOCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3B0aW1pemUgQ29uZCA/IGNzdCsxIDogY3N0IC0+IHpleHQoc2V0Y2MoQykrY3N0LgorICAgICAgICBpZiAoRmFsc2VDLT5nZXRBUEludFZhbHVlKCkrMSA9PSBUcnVlQy0+Z2V0QVBJbnRWYWx1ZSgpKSB7CisgICAgICAgICAgaWYgKE5lZWRzQ29uZEludmVydCkgLy8gSW52ZXJ0IHRoZSBjb25kaXRpb24gaWYgbmVlZGVkLgorICAgICAgICAgICAgQ29uZCA9IERBRy5nZXROb2RlKElTRDo6WE9SLCBETCwgQ29uZC5nZXRWYWx1ZVR5cGUoKSwgQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgQ29uZC5nZXRWYWx1ZVR5cGUoKSkpOworCisgICAgICAgICAgLy8gWmVybyBleHRlbmQgdGhlIGNvbmRpdGlvbiBpZiBuZWVkZWQuCisgICAgICAgICAgQ29uZCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkQsIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZUMtPmdldFZhbHVlVHlwZSgwKSwgQ29uZCk7CisgICAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QURELCBETCwgQ29uZC5nZXRWYWx1ZVR5cGUoKSwgQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShGYWxzZUMsIDApKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE9wdGltaXplIGNhc2VzIHRoYXQgd2lsbCB0dXJuIGludG8gYW4gTEVBIGluc3RydWN0aW9uLiAgVGhpcyByZXF1aXJlcworICAgICAgICAvLyBhbiBpMzIgb3IgaTY0IGFuZCBhbiBlZmZpY2llbnQgbXVsdGlwbGllciAoMSwgMiwgMywgNCwgNSwgOCwgOSkuCisgICAgICAgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIgfHwgTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTY0KSB7CisgICAgICAgICAgdWludDY0X3QgRGlmZiA9IFRydWVDLT5nZXRaRXh0VmFsdWUoKS1GYWxzZUMtPmdldFpFeHRWYWx1ZSgpOworICAgICAgICAgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIpIERpZmYgPSAodW5zaWduZWQpRGlmZjsKKworICAgICAgICAgIGJvb2wgaXNGYXN0TXVsdGlwbGllciA9IGZhbHNlOworICAgICAgICAgIGlmIChEaWZmIDwgMTApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpRGlmZikgeworICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxOiAgLy8gcmVzdWx0ID0gYWRkIGJhc2UsIGNvbmQKKyAgICAgICAgICAgICAgY2FzZSAyOiAgLy8gcmVzdWx0ID0gbGVhIGJhc2UoICAgICwgY29uZCoyKQorICAgICAgICAgICAgICBjYXNlIDM6ICAvLyByZXN1bHQgPSBsZWEgYmFzZShjb25kLCBjb25kKjIpCisgICAgICAgICAgICAgIGNhc2UgNDogIC8vIHJlc3VsdCA9IGxlYSBiYXNlKCAgICAsIGNvbmQqNCkKKyAgICAgICAgICAgICAgY2FzZSA1OiAgLy8gcmVzdWx0ID0gbGVhIGJhc2UoY29uZCwgY29uZCo0KQorICAgICAgICAgICAgICBjYXNlIDg6ICAvLyByZXN1bHQgPSBsZWEgYmFzZSggICAgLCBjb25kKjgpCisgICAgICAgICAgICAgIGNhc2UgOTogIC8vIHJlc3VsdCA9IGxlYSBiYXNlKGNvbmQsIGNvbmQqOCkKKyAgICAgICAgICAgICAgICBpc0Zhc3RNdWx0aXBsaWVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaXNGYXN0TXVsdGlwbGllcikgeworICAgICAgICAgICAgQVBJbnQgRGlmZiA9IFRydWVDLT5nZXRBUEludFZhbHVlKCktRmFsc2VDLT5nZXRBUEludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoTmVlZHNDb25kSW52ZXJ0KSAvLyBJbnZlcnQgdGhlIGNvbmRpdGlvbiBpZiBuZWVkZWQuCisgICAgICAgICAgICAgIENvbmQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlhPUiwgREwsIENvbmQuZ2V0VmFsdWVUeXBlKCksIENvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgQ29uZC5nZXRWYWx1ZVR5cGUoKSkpOworCisgICAgICAgICAgICAvLyBaZXJvIGV4dGVuZCB0aGUgY29uZGl0aW9uIGlmIG5lZWRlZC4KKyAgICAgICAgICAgIENvbmQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBETCwgRmFsc2VDLT5nZXRWYWx1ZVR5cGUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZCk7CisgICAgICAgICAgICAvLyBTY2FsZSB0aGUgY29uZGl0aW9uIGJ5IHRoZSBkaWZmZXJlbmNlLgorICAgICAgICAgICAgaWYgKERpZmYgIT0gMSkKKyAgICAgICAgICAgICAgQ29uZCA9IERBRy5nZXROb2RlKElTRDo6TVVMLCBETCwgQ29uZC5nZXRWYWx1ZVR5cGUoKSwgQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChEaWZmLCBDb25kLmdldFZhbHVlVHlwZSgpKSk7CisKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgYmFzZSBpZiBub24temVyby4KKyAgICAgICAgICAgIGlmIChGYWxzZUMtPmdldEFQSW50VmFsdWUoKSAhPSAwKQorICAgICAgICAgICAgICBDb25kID0gREFHLmdldE5vZGUoSVNEOjpBREQsIERMLCBDb25kLmdldFZhbHVlVHlwZSgpLCBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZShGYWxzZUMsIDApKTsKKyAgICAgICAgICAgIHJldHVybiBDb25kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIE9wdGltaXplIFg4NklTRDo6Q01PViBbTEhTLCBSSFMsIENPTkRDT0RFIChlLmcuIFg4Njo6Q09ORF9ORSksIENPTkRWQUxdCitzdGF0aWMgU0RWYWx1ZSBQZXJmb3JtQ01PVkNvbWJpbmUoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZzo6REFHQ29tYmluZXJJbmZvICZEQ0kpIHsKKyAgRGVidWdMb2MgREwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgIC8vIElmIHRoZSBmbGFnIG9wZXJhbmQgaXNuJ3QgZGVhZCwgZG9uJ3QgdG91Y2ggdGhpcyBDTU9WLgorICBpZiAoTi0+Z2V0TnVtVmFsdWVzKCkgPT0gMiAmJiAhU0RWYWx1ZShOLCAxKS51c2VfZW1wdHkoKSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIC8vIElmIHRoaXMgaXMgYSBzZWxlY3QgYmV0d2VlbiB0d28gaW50ZWdlciBjb25zdGFudHMsIHRyeSB0byBkbyBzb21lCisgIC8vIG9wdGltaXphdGlvbnMuICBOb3RlIHRoYXQgdGhlIG9wZXJhbmRzIGFyZSBvcmRlcmVkIHRoZSBvcHBvc2l0ZSBvZiBTRUxFQ1QKKyAgLy8gb3BlcmFuZHMuCisgIGlmIChDb25zdGFudFNETm9kZSAqVHJ1ZUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkZhbHNlQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgLy8gQ2Fub25pY2FsaXplIHRoZSBUcnVlQy9GYWxzZUMgdmFsdWVzIHNvIHRoYXQgVHJ1ZUMgKHRoZSB0cnVlIHZhbHVlKSBpcworICAgICAgLy8gbGFyZ2VyIHRoYW4gRmFsc2VDICh0aGUgZmFsc2UgdmFsdWUpLgorICAgICAgWDg2OjpDb25kQ29kZSBDQyA9IChYODY6OkNvbmRDb2RlKU4tPmdldENvbnN0YW50T3BlcmFuZFZhbCgyKTsKKworICAgICAgaWYgKFRydWVDLT5nZXRBUEludFZhbHVlKCkudWx0KEZhbHNlQy0+Z2V0QVBJbnRWYWx1ZSgpKSkgeworICAgICAgICBDQyA9IFg4Njo6R2V0T3Bwb3NpdGVCcmFuY2hDb25kaXRpb24oQ0MpOworICAgICAgICBzdGQ6OnN3YXAoVHJ1ZUMsIEZhbHNlQyk7CisgICAgICB9CisKKyAgICAgIC8vIE9wdGltaXplIEMgPyA4IDogMCAtPiB6ZXh0KHNldGNjKEMpKSA8PCAzLiAgTGlrZXdpc2UgZm9yIGFueSBwb3cyLzAuCisgICAgICAvLyBUaGlzIGlzIGVmZmljaWVudCBmb3IgYW55IGludGVnZXIgZGF0YSB0eXBlIChpbmNsdWRpbmcgaTgvaTE2KSBhbmQKKyAgICAgIC8vIHNoaWZ0IGFtb3VudC4KKyAgICAgIGlmIChGYWxzZUMtPmdldEFQSW50VmFsdWUoKSA9PSAwICYmIFRydWVDLT5nZXRBUEludFZhbHVlKCkuaXNQb3dlck9mMigpKSB7CisgICAgICAgIFNEVmFsdWUgQ29uZCA9IE4tPmdldE9wZXJhbmQoMyk7CisgICAgICAgIENvbmQgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6OlNFVENDLCBETCwgTVZUOjppOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChDQywgTVZUOjppOCksIENvbmQpOworCisgICAgICAgIC8vIFplcm8gZXh0ZW5kIHRoZSBjb25kaXRpb24gaWYgbmVlZGVkLgorICAgICAgICBDb25kID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgREwsIFRydWVDLT5nZXRWYWx1ZVR5cGUoMCksIENvbmQpOworCisgICAgICAgIHVuc2lnbmVkIFNoQW10ID0gVHJ1ZUMtPmdldEFQSW50VmFsdWUoKS5sb2dCYXNlMigpOworICAgICAgICBDb25kID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIERMLCBDb25kLmdldFZhbHVlVHlwZSgpLCBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KFNoQW10LCBNVlQ6Omk4KSk7CisgICAgICAgIGlmIChOLT5nZXROdW1WYWx1ZXMoKSA9PSAyKSAgLy8gRGVhZCBmbGFnIHZhbHVlPworICAgICAgICAgIHJldHVybiBEQ0kuQ29tYmluZVRvKE4sIENvbmQsIFNEVmFsdWUoKSk7CisgICAgICAgIHJldHVybiBDb25kOworICAgICAgfQorCisgICAgICAvLyBPcHRpbWl6ZSBDb25kID8gY3N0KzEgOiBjc3QgLT4gemV4dChzZXRjYyhDKStjc3QuICBUaGlzIGlzIGVmZmljaWVudAorICAgICAgLy8gZm9yIGFueSBpbnRlZ2VyIGRhdGEgdHlwZSwgaW5jbHVkaW5nIGk4L2kxNi4KKyAgICAgIGlmIChGYWxzZUMtPmdldEFQSW50VmFsdWUoKSsxID09IFRydWVDLT5nZXRBUEludFZhbHVlKCkpIHsKKyAgICAgICAgU0RWYWx1ZSBDb25kID0gTi0+Z2V0T3BlcmFuZCgzKTsKKyAgICAgICAgQ29uZCA9IERBRy5nZXROb2RlKFg4NklTRDo6U0VUQ0MsIERMLCBNVlQ6Omk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KENDLCBNVlQ6Omk4KSwgQ29uZCk7CisKKyAgICAgICAgLy8gWmVybyBleHRlbmQgdGhlIGNvbmRpdGlvbiBpZiBuZWVkZWQuCisgICAgICAgIENvbmQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlQy0+Z2V0VmFsdWVUeXBlKDApLCBDb25kKTsKKyAgICAgICAgQ29uZCA9IERBRy5nZXROb2RlKElTRDo6QURELCBETCwgQ29uZC5nZXRWYWx1ZVR5cGUoKSwgQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoRmFsc2VDLCAwKSk7CisKKyAgICAgICAgaWYgKE4tPmdldE51bVZhbHVlcygpID09IDIpICAvLyBEZWFkIGZsYWcgdmFsdWU/CisgICAgICAgICAgcmV0dXJuIERDSS5Db21iaW5lVG8oTiwgQ29uZCwgU0RWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIENvbmQ7CisgICAgICB9CisKKyAgICAgIC8vIE9wdGltaXplIGNhc2VzIHRoYXQgd2lsbCB0dXJuIGludG8gYW4gTEVBIGluc3RydWN0aW9uLiAgVGhpcyByZXF1aXJlcworICAgICAgLy8gYW4gaTMyIG9yIGk2NCBhbmQgYW4gZWZmaWNpZW50IG11bHRpcGxpZXIgKDEsIDIsIDMsIDQsIDUsIDgsIDkpLgorICAgICAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6OmkzMiB8fCBOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppNjQpIHsKKyAgICAgICAgdWludDY0X3QgRGlmZiA9IFRydWVDLT5nZXRaRXh0VmFsdWUoKS1GYWxzZUMtPmdldFpFeHRWYWx1ZSgpOworICAgICAgICBpZiAoTi0+Z2V0VmFsdWVUeXBlKDApID09IE1WVDo6aTMyKSBEaWZmID0gKHVuc2lnbmVkKURpZmY7CisKKyAgICAgICAgYm9vbCBpc0Zhc3RNdWx0aXBsaWVyID0gZmFsc2U7CisgICAgICAgIGlmIChEaWZmIDwgMTApIHsKKyAgICAgICAgICBzd2l0Y2ggKCh1bnNpZ25lZCBjaGFyKURpZmYpIHsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICBjYXNlIDE6ICAvLyByZXN1bHQgPSBhZGQgYmFzZSwgY29uZAorICAgICAgICAgIGNhc2UgMjogIC8vIHJlc3VsdCA9IGxlYSBiYXNlKCAgICAsIGNvbmQqMikKKyAgICAgICAgICBjYXNlIDM6ICAvLyByZXN1bHQgPSBsZWEgYmFzZShjb25kLCBjb25kKjIpCisgICAgICAgICAgY2FzZSA0OiAgLy8gcmVzdWx0ID0gbGVhIGJhc2UoICAgICwgY29uZCo0KQorICAgICAgICAgIGNhc2UgNTogIC8vIHJlc3VsdCA9IGxlYSBiYXNlKGNvbmQsIGNvbmQqNCkKKyAgICAgICAgICBjYXNlIDg6ICAvLyByZXN1bHQgPSBsZWEgYmFzZSggICAgLCBjb25kKjgpCisgICAgICAgICAgY2FzZSA5OiAgLy8gcmVzdWx0ID0gbGVhIGJhc2UoY29uZCwgY29uZCo4KQorICAgICAgICAgICAgaXNGYXN0TXVsdGlwbGllciA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNGYXN0TXVsdGlwbGllcikgeworICAgICAgICAgIEFQSW50IERpZmYgPSBUcnVlQy0+Z2V0QVBJbnRWYWx1ZSgpLUZhbHNlQy0+Z2V0QVBJbnRWYWx1ZSgpOworICAgICAgICAgIFNEVmFsdWUgQ29uZCA9IE4tPmdldE9wZXJhbmQoMyk7CisgICAgICAgICAgQ29uZCA9IERBRy5nZXROb2RlKFg4NklTRDo6U0VUQ0MsIERMLCBNVlQ6Omk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQ0MsIE1WVDo6aTgpLCBDb25kKTsKKyAgICAgICAgICAvLyBaZXJvIGV4dGVuZCB0aGUgY29uZGl0aW9uIGlmIG5lZWRlZC4KKyAgICAgICAgICBDb25kID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgREwsIEZhbHNlQy0+Z2V0VmFsdWVUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kKTsKKyAgICAgICAgICAvLyBTY2FsZSB0aGUgY29uZGl0aW9uIGJ5IHRoZSBkaWZmZXJlbmNlLgorICAgICAgICAgIGlmIChEaWZmICE9IDEpCisgICAgICAgICAgICBDb25kID0gREFHLmdldE5vZGUoSVNEOjpNVUwsIERMLCBDb25kLmdldFZhbHVlVHlwZSgpLCBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChEaWZmLCBDb25kLmdldFZhbHVlVHlwZSgpKSk7CisKKyAgICAgICAgICAvLyBBZGQgdGhlIGJhc2UgaWYgbm9uLXplcm8uCisgICAgICAgICAgaWYgKEZhbHNlQy0+Z2V0QVBJbnRWYWx1ZSgpICE9IDApCisgICAgICAgICAgICBDb25kID0gREFHLmdldE5vZGUoSVNEOjpBREQsIERMLCBDb25kLmdldFZhbHVlVHlwZSgpLCBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUoRmFsc2VDLCAwKSk7CisgICAgICAgICAgaWYgKE4tPmdldE51bVZhbHVlcygpID09IDIpICAvLyBEZWFkIGZsYWcgdmFsdWU/CisgICAgICAgICAgICByZXR1cm4gRENJLkNvbWJpbmVUbyhOLCBDb25kLCBTRFZhbHVlKCkpOworICAgICAgICAgIHJldHVybiBDb25kOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKworLy8vIFBlcmZvcm1NdWxDb21iaW5lIC0gT3B0aW1pemUgYSBzaW5nbGUgbXVsdGlwbHkgd2l0aCBjb25zdGFudCBpbnRvIHR3bworLy8vIGluIG9yZGVyIHRvIGltcGxlbWVudCBpdCB3aXRoIHR3byBjaGVhcGVyIGluc3RydWN0aW9ucywgZS5nLgorLy8vIExFQSArIFNITCwgTEVBICsgTEVBLgorc3RhdGljIFNEVmFsdWUgUGVyZm9ybU11bENvbWJpbmUoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldExvd2VyaW5nOjpEQUdDb21iaW5lckluZm8gJkRDSSkgeworICBpZiAoRENJLmlzQmVmb3JlTGVnYWxpemUoKSB8fCBEQ0kuaXNDYWxsZWRCeUxlZ2FsaXplcigpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBpZiAoVlQgIT0gTVZUOjppNjQpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICBDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKTsKKyAgaWYgKCFDKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIHVpbnQ2NF90IE11bEFtdCA9IEMtPmdldFpFeHRWYWx1ZSgpOworICBpZiAoaXNQb3dlck9mMl82NChNdWxBbXQpIHx8IE11bEFtdCA9PSAzIHx8IE11bEFtdCA9PSA1IHx8IE11bEFtdCA9PSA5KQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgdWludDY0X3QgTXVsQW10MSA9IDA7CisgIHVpbnQ2NF90IE11bEFtdDIgPSAwOworICBpZiAoKE11bEFtdCAlIDkpID09IDApIHsKKyAgICBNdWxBbXQxID0gOTsKKyAgICBNdWxBbXQyID0gTXVsQW10IC8gOTsKKyAgfSBlbHNlIGlmICgoTXVsQW10ICUgNSkgPT0gMCkgeworICAgIE11bEFtdDEgPSA1OworICAgIE11bEFtdDIgPSBNdWxBbXQgLyA1OworICB9IGVsc2UgaWYgKChNdWxBbXQgJSAzKSA9PSAwKSB7CisgICAgTXVsQW10MSA9IDM7CisgICAgTXVsQW10MiA9IE11bEFtdCAvIDM7CisgIH0KKyAgaWYgKE11bEFtdDIgJiYKKyAgICAgIChpc1Bvd2VyT2YyXzY0KE11bEFtdDIpIHx8IE11bEFtdDIgPT0gMyB8fCBNdWxBbXQyID09IDUgfHwgTXVsQW10MiA9PSA5KSl7CisgICAgRGVidWdMb2MgREwgPSBOLT5nZXREZWJ1Z0xvYygpOworCisgICAgaWYgKGlzUG93ZXJPZjJfNjQoTXVsQW10MikgJiYKKyAgICAgICAgIShOLT5oYXNPbmVVc2UoKSAmJiBOLT51c2VfYmVnaW4oKS0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQpKQorICAgICAgLy8gSWYgc2Vjb25kIG11bHRpcGxpZmVyIGlzIHBvdzIsIGlzc3VlIGl0IGZpcnN0LiBXZSB3YW50IHRoZSBtdWx0aXBseSBieQorICAgICAgLy8gMywgNSwgb3IgOSB0byBiZSBmb2xkZWQgaW50byB0aGUgYWRkcmVzc2luZyBtb2RlIHVubGVzcyB0aGUgbG9uZSB1c2UKKyAgICAgIC8vIGlzIGFuIGFkZC4KKyAgICAgIHN0ZDo6c3dhcChNdWxBbXQxLCBNdWxBbXQyKTsKKworICAgIFNEVmFsdWUgTmV3TXVsOworICAgIGlmIChpc1Bvd2VyT2YyXzY0KE11bEFtdDEpKQorICAgICAgTmV3TXVsID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIERMLCBWVCwgTi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChMb2cyXzY0KE11bEFtdDEpLCBNVlQ6Omk4KSk7CisgICAgZWxzZQorICAgICAgTmV3TXVsID0gREFHLmdldE5vZGUoWDg2SVNEOjpNVUxfSU1NLCBETCwgVlQsIE4tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoTXVsQW10MSwgVlQpKTsKKworICAgIGlmIChpc1Bvd2VyT2YyXzY0KE11bEFtdDIpKQorICAgICAgTmV3TXVsID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIERMLCBWVCwgTmV3TXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KExvZzJfNjQoTXVsQW10MiksIE1WVDo6aTgpKTsKKyAgICBlbHNlCisgICAgICBOZXdNdWwgPSBEQUcuZ2V0Tm9kZShYODZJU0Q6Ok1VTF9JTU0sIERMLCBWVCwgTmV3TXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE11bEFtdDIsIFZUKSk7CisKKyAgICAvLyBEbyBub3QgYWRkIG5ldyBub2RlcyB0byBEQUcgY29tYmluZXIgd29ya2xpc3QuCisgICAgRENJLkNvbWJpbmVUbyhOLCBOZXdNdWwsIGZhbHNlKTsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitzdGF0aWMgU0RWYWx1ZSBQZXJmb3JtU0hMQ29tYmluZShTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIE4xID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgQ29uc3RhbnRTRE5vZGUgKk4xQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMSk7CisgIEVWVCBWVCA9IE4wLmdldFZhbHVlVHlwZSgpOworCisgIC8vIGZvbGQgKHNobCAoYW5kIChzZXRjY19jKSwgYzEpLCBjMikgLT4gKGFuZCBzZXRjY19jLCAoYzEgPDwgYzIpKQorICAvLyBzaW5jZSB0aGUgcmVzdWx0IG9mIHNldGNjX2MgaXMgYWxsIHplcm8ncyBvciBhbGwgb25lcy4KKyAgaWYgKE4xQyAmJiBOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCAmJgorICAgICAgTjAuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50KSB7CisgICAgU0RWYWx1ZSBOMDAgPSBOMC5nZXRPcGVyYW5kKDApOworICAgIGlmIChOMDAuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpTRVRDQ19DQVJSWSB8fAorICAgICAgICAoKE4wMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFOWV9FWFRFTkQgfHwKKyAgICAgICAgICBOMDAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpaRVJPX0VYVEVORCkgJiYKKyAgICAgICAgIE4wMC5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IFg4NklTRDo6U0VUQ0NfQ0FSUlkpKSB7CisgICAgICBBUEludCBNYXNrID0gY2FzdDxDb25zdGFudFNETm9kZT4oTjAuZ2V0T3BlcmFuZCgxKSktPmdldEFQSW50VmFsdWUoKTsKKyAgICAgIEFQSW50IFNoQW10ID0gTjFDLT5nZXRBUEludFZhbHVlKCk7CisgICAgICBNYXNrID0gTWFzay5zaGwoU2hBbXQpOworICAgICAgaWYgKE1hc2sgIT0gMCkKKyAgICAgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ELCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE4wMCwgREFHLmdldENvbnN0YW50KE1hc2ssIFZUKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIFBlcmZvcm1TaGlmdENvbWJpbmUgLSBUcmFuc2Zvcm1zIHZlY3RvciBzaGlmdCBub2RlcyB0byB1c2UgdmVjdG9yIHNoaWZ0cworLy8vICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHBvc3NpYmxlLgorc3RhdGljIFNEVmFsdWUgUGVyZm9ybVNoaWZ0Q29tYmluZShTRE5vZGUqIE4sIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYODZTdWJ0YXJnZXQgKlN1YnRhcmdldCkgeworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIGlmICghVlQuaXNWZWN0b3IoKSAmJiBWVC5pc0ludGVnZXIoKSAmJgorICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTSEwpCisgICAgcmV0dXJuIFBlcmZvcm1TSExDb21iaW5lKE4sIERBRyk7CisKKyAgLy8gT24gWDg2IHdpdGggU1NFMiBzdXBwb3J0LCB3ZSBjYW4gdHJhbnNmb3JtIHRoaXMgdG8gYSB2ZWN0b3Igc2hpZnQgaWYKKyAgLy8gYWxsIGVsZW1lbnRzIGFyZSBzaGlmdGVkIGJ5IHRoZSBzYW1lIGFtb3VudC4gIFdlIGNhbid0IGRvIHRoaXMgaW4gbGVnYWxpemUKKyAgLy8gYmVjYXVzZSB0aGUgYSBjb25zdGFudCB2ZWN0b3IgaXMgdHlwaWNhbGx5IHRyYW5zZm9ybWVkIHRvIGEgY29uc3RhbnQgcG9vbAorICAvLyBzbyB3ZSBoYXZlIG5vIGtub3dsZWRnZSBvZiB0aGUgc2hpZnQgYW1vdW50LgorICBpZiAoIVN1YnRhcmdldC0+aGFzU1NFMigpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgaWYgKFZUICE9IE1WVDo6djJpNjQgJiYgVlQgIT0gTVZUOjp2NGkzMiAmJiBWVCAhPSBNVlQ6OnY4aTE2KQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgU0RWYWx1ZSBTaEFtdE9wID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgRVZUIEVsdFZUID0gVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgRGVidWdMb2MgREwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIEJhc2VTaEFtdCA9IFNEVmFsdWUoKTsKKyAgaWYgKFNoQW10T3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1IpIHsKKyAgICB1bnNpZ25lZCBOdW1FbHRzID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICB1bnNpZ25lZCBpID0gMDsKKyAgICBmb3IgKDsgaSAhPSBOdW1FbHRzOyArK2kpIHsKKyAgICAgIFNEVmFsdWUgQXJnID0gU2hBbXRPcC5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKEFyZy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKSBjb250aW51ZTsKKyAgICAgIEJhc2VTaEFtdCA9IEFyZzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBmb3IgKDsgaSAhPSBOdW1FbHRzOyArK2kpIHsKKyAgICAgIFNEVmFsdWUgQXJnID0gU2hBbXRPcC5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKEFyZy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKSBjb250aW51ZTsKKyAgICAgIGlmIChBcmcgIT0gQmFzZVNoQW10KSB7CisgICAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKFNoQW10T3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpWRUNUT1JfU0hVRkZMRSAmJgorICAgICAgICAgICAgIGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oU2hBbXRPcCktPmlzU3BsYXQoKSkgeworICAgIFNEVmFsdWUgSW5WZWMgPSBTaEFtdE9wLmdldE9wZXJhbmQoMCk7CisgICAgaWYgKEluVmVjLmdldE9wY29kZSgpID09IElTRDo6QlVJTERfVkVDVE9SKSB7CisgICAgICB1bnNpZ25lZCBOdW1FbHRzID0gSW5WZWMuZ2V0VmFsdWVUeXBlKCkuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgIHVuc2lnbmVkIGkgPSAwOworICAgICAgZm9yICg7IGkgIT0gTnVtRWx0czsgKytpKSB7CisgICAgICAgIFNEVmFsdWUgQXJnID0gSW5WZWMuZ2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKEFyZy5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVOREVGKSBjb250aW51ZTsKKyAgICAgICAgQmFzZVNoQW10ID0gQXJnOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEluVmVjLmdldE9wY29kZSgpID09IElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQpIHsKKyAgICAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oSW5WZWMuZ2V0T3BlcmFuZCgyKSkpIHsKKyAgICAgICAgIHVuc2lnbmVkIFNwbGF0SWR4PSBjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KFNoQW10T3ApLT5nZXRTcGxhdEluZGV4KCk7CisgICAgICAgICBpZiAoQy0+Z2V0WkV4dFZhbHVlKCkgPT0gU3BsYXRJZHgpCisgICAgICAgICAgIEJhc2VTaEFtdCA9IEluVmVjLmdldE9wZXJhbmQoMSk7CisgICAgICAgfQorICAgIH0KKyAgICBpZiAoQmFzZVNoQW10LmdldE5vZGUoKSA9PSAwKQorICAgICAgQmFzZVNoQW10ID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQsIERMLCBFbHRWVCwgU2hBbXRPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRJbnRQdHJDb25zdGFudCgwKSk7CisgIH0gZWxzZQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgLy8gVGhlIHNoaWZ0IGFtb3VudCBpcyBhbiBpMzIuCisgIGlmIChFbHRWVC5iaXRzR1QoTVZUOjppMzIpKQorICAgIEJhc2VTaEFtdCA9IERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIERMLCBNVlQ6OmkzMiwgQmFzZVNoQW10KTsKKyAgZWxzZSBpZiAoRWx0VlQuYml0c0xUKE1WVDo6aTMyKSkKKyAgICBCYXNlU2hBbXQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlpFUk9fRVhURU5ELCBETCwgTVZUOjppMzIsIEJhc2VTaEFtdCk7CisKKyAgLy8gVGhlIHNoaWZ0IGFtb3VudCBpcyBpZGVudGljYWwgc28gd2UgY2FuIGRvIGEgdmVjdG9yIHNoaWZ0LgorICBTRFZhbHVlICBWYWxPcCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNoaWZ0IG9wY29kZSEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNITDoKKyAgICBpZiAoVlQgPT0gTVZUOjp2Mmk2NCkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxpX3EsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWxPcCwgQmFzZVNoQW10KTsKKyAgICBpZiAoVlQgPT0gTVZUOjp2NGkzMikKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxpX2QsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWxPcCwgQmFzZVNoQW10KTsKKyAgICBpZiAoVlQgPT0gTVZUOjp2OGkxNikKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxpX3csIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWxPcCwgQmFzZVNoQW10KTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNSQToKKyAgICBpZiAoVlQgPT0gTVZUOjp2NGkzMikKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmFpX2QsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWxPcCwgQmFzZVNoQW10KTsKKyAgICBpZiAoVlQgPT0gTVZUOjp2OGkxNikKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmFpX3csIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWxPcCwgQmFzZVNoQW10KTsKKyAgICBicmVhazsKKyAgY2FzZSBJU0Q6OlNSTDoKKyAgICBpZiAoVlQgPT0gTVZUOjp2Mmk2NCkKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxpX3EsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWxPcCwgQmFzZVNoQW10KTsKKyAgICBpZiAoVlQgPT0gTVZUOjp2NGkzMikKKyAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OklOVFJJTlNJQ19XT19DSEFJTiwgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxpX2QsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWxPcCwgQmFzZVNoQW10KTsKKyAgICBpZiAoVlQgPT0gIE1WVDo6djhpMTYpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4sIERMLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoSW50cmluc2ljOjp4ODZfc3NlMl9wc3JsaV93LCBNVlQ6OmkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgVmFsT3AsIEJhc2VTaEFtdCk7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworc3RhdGljIFNEVmFsdWUgUGVyZm9ybU9yQ29tYmluZShTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZzo6REFHQ29tYmluZXJJbmZvICZEQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFg4NlN1YnRhcmdldCAqU3VidGFyZ2V0KSB7CisgIGlmIChEQ0kuaXNCZWZvcmVMZWdhbGl6ZU9wcygpKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgRVZUIFZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBpZiAoVlQgIT0gTVZUOjppMTYgJiYgVlQgIT0gTVZUOjppMzIgJiYgVlQgIT0gTVZUOjppNjQpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAvLyBmb2xkIChvciAoeCA8PCBjKSB8ICh5ID4+ICg2NCAtIGMpKSkgPT0+IChzaGxkNjQgeCwgeSwgYykKKyAgU0RWYWx1ZSBOMCA9IE4tPmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICBpZiAoTjAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkwgJiYgTjEuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTSEwpCisgICAgc3RkOjpzd2FwKE4wLCBOMSk7CisgIGlmIChOMC5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNITCB8fCBOMS5nZXRPcGNvZGUoKSAhPSBJU0Q6OlNSTCkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICBpZiAoIU4wLmhhc09uZVVzZSgpIHx8ICFOMS5oYXNPbmVVc2UoKSkKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgIFNEVmFsdWUgU2hBbXQwID0gTjAuZ2V0T3BlcmFuZCgxKTsKKyAgaWYgKFNoQW10MC5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6Omk4KQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIFNEVmFsdWUgU2hBbXQxID0gTjEuZ2V0T3BlcmFuZCgxKTsKKyAgaWYgKFNoQW10MS5nZXRWYWx1ZVR5cGUoKSAhPSBNVlQ6Omk4KQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIGlmIChTaEFtdDAuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpUUlVOQ0FURSkKKyAgICBTaEFtdDAgPSBTaEFtdDAuZ2V0T3BlcmFuZCgwKTsKKyAgaWYgKFNoQW10MS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFKQorICAgIFNoQW10MSA9IFNoQW10MS5nZXRPcGVyYW5kKDApOworCisgIERlYnVnTG9jIERMID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgT3BjID0gWDg2SVNEOjpTSExEOworICBTRFZhbHVlIE9wMCA9IE4wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgT3AxID0gTjEuZ2V0T3BlcmFuZCgwKTsKKyAgaWYgKFNoQW10MC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNVQikgeworICAgIE9wYyA9IFg4NklTRDo6U0hSRDsKKyAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOworICAgIHN0ZDo6c3dhcChTaEFtdDAsIFNoQW10MSk7CisgIH0KKworICB1bnNpZ25lZCBCaXRzID0gVlQuZ2V0U2l6ZUluQml0cygpOworICBpZiAoU2hBbXQxLmdldE9wY29kZSgpID09IElTRDo6U1VCKSB7CisgICAgU0RWYWx1ZSBTdW0gPSBTaEFtdDEuZ2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKlN1bUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oU3VtKSkgeworICAgICAgU0RWYWx1ZSBTaEFtdDFPcDEgPSBTaEFtdDEuZ2V0T3BlcmFuZCgxKTsKKyAgICAgIGlmIChTaEFtdDFPcDEuZ2V0Tm9kZSgpLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRSVU5DQVRFKQorICAgICAgICBTaEFtdDFPcDEgPSBTaEFtdDFPcDEuZ2V0T3BlcmFuZCgwKTsKKyAgICAgIGlmIChTdW1DLT5nZXRTRXh0VmFsdWUoKSA9PSBCaXRzICYmIFNoQW10MU9wMSA9PSBTaEFtdDApCisgICAgICAgIHJldHVybiBEQUcuZ2V0Tm9kZShPcGMsIERMLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wMCwgT3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Omk4LCBTaEFtdDApKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoQ29uc3RhbnRTRE5vZGUgKlNoQW10MUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oU2hBbXQxKSkgeworICAgIENvbnN0YW50U0ROb2RlICpTaEFtdDBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFNoQW10MCk7CisgICAgaWYgKFNoQW10MEMgJiYKKyAgICAgICAgU2hBbXQwQy0+Z2V0U0V4dFZhbHVlKCkgKyBTaEFtdDFDLT5nZXRTRXh0VmFsdWUoKSA9PSBCaXRzKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKE9wYywgREwsIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIE4wLmdldE9wZXJhbmQoMCksIE4xLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpUUlVOQ0FURSwgREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6Omk4LCBTaEFtdDApKTsKKyAgfQorCisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKKy8vLyBQZXJmb3JtU1RPUkVDb21iaW5lIC0gRG8gdGFyZ2V0LXNwZWNpZmljIGRhZyBjb21iaW5lcyBvbiBTVE9SRSBub2Rlcy4KK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1TVE9SRUNvbWJpbmUoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWDg2U3VidGFyZ2V0ICpTdWJ0YXJnZXQpIHsKKyAgLy8gVHVybiBsb2FkLT5zdG9yZSBvZiBNTVggdHlwZXMgaW50byBHUFIgbG9hZC9zdG9yZXMuICBUaGlzIGF2b2lkcyBjbG9iYmVyaW5nCisgIC8vIHRoZSBGUCBzdGF0ZSBpbiBjYXNlcyB3aGVyZSBhbiBlbW1zIG1heSBiZSBtaXNzaW5nLgorICAvLyBBIHByZWZlcmFibGUgc29sdXRpb24gdG8gdGhlIGdlbmVyYWwgcHJvYmxlbSBpcyB0byBmaWd1cmUgb3V0IHRoZSByaWdodAorICAvLyBwbGFjZXMgdG8gaW5zZXJ0IEVNTVMuICBUaGlzIHF1YWxpZmllcyBhcyBhIHF1aWNrIGhhY2suCisKKyAgLy8gU2ltaWxhcmx5LCB0dXJuIGxvYWQtPnN0b3JlIG9mIGk2NCBpbnRvIGRvdWJsZSBsb2FkL3N0b3JlcyBpbiAzMi1iaXQgbW9kZS4KKyAgU3RvcmVTRE5vZGUgKlN0ID0gY2FzdDxTdG9yZVNETm9kZT4oTik7CisgIEVWVCBWVCA9IFN0LT5nZXRWYWx1ZSgpLmdldFZhbHVlVHlwZSgpOworICBpZiAoVlQuZ2V0U2l6ZUluQml0cygpICE9IDY0KQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgY29uc3QgRnVuY3Rpb24gKkYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0RnVuY3Rpb24oKTsKKyAgYm9vbCBOb0ltcGxpY2l0RmxvYXRPcHMgPSBGLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpOb0ltcGxpY2l0RmxvYXQpOworICBib29sIEY2NElzTGVnYWwgPSAhVXNlU29mdEZsb2F0ICYmICFOb0ltcGxpY2l0RmxvYXRPcHMKKyAgICAmJiBTdWJ0YXJnZXQtPmhhc1NTRTIoKTsKKyAgaWYgKChWVC5pc1ZlY3RvcigpIHx8CisgICAgICAgKFZUID09IE1WVDo6aTY0ICYmIEY2NElzTGVnYWwgJiYgIVN1YnRhcmdldC0+aXM2NEJpdCgpKSkgJiYKKyAgICAgIGlzYTxMb2FkU0ROb2RlPihTdC0+Z2V0VmFsdWUoKSkgJiYKKyAgICAgICFjYXN0PExvYWRTRE5vZGU+KFN0LT5nZXRWYWx1ZSgpKS0+aXNWb2xhdGlsZSgpICYmCisgICAgICBTdC0+Z2V0Q2hhaW4oKS5oYXNPbmVVc2UoKSAmJiAhU3QtPmlzVm9sYXRpbGUoKSkgeworICAgIFNETm9kZSogTGRWYWwgPSBTdC0+Z2V0VmFsdWUoKS5nZXROb2RlKCk7CisgICAgTG9hZFNETm9kZSAqTGQgPSAwOworICAgIGludCBUb2tlbkZhY3RvckluZGV4ID0gLTE7CisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgOD4gT3BzOworICAgIFNETm9kZSogQ2hhaW5WYWwgPSBTdC0+Z2V0Q2hhaW4oKS5nZXROb2RlKCk7CisgICAgLy8gTXVzdCBiZSBhIHN0b3JlIG9mIGEgbG9hZC4gIFdlIGN1cnJlbnRseSBoYW5kbGUgdHdvIGNhc2VzOiAgdGhlIGxvYWQKKyAgICAvLyBpcyBhIGRpcmVjdCBjaGlsZCwgYW5kIGl0J3MgdW5kZXIgYW4gaW50ZXJ2ZW5pbmcgVG9rZW5GYWN0b3IuICBJdCBpcworICAgIC8vIHBvc3NpYmxlIHRvIGRpZyBkZWVwZXIgdW5kZXIgbmVzdGVkIFRva2VuRmFjdG9ycy4KKyAgICBpZiAoQ2hhaW5WYWwgPT0gTGRWYWwpCisgICAgICBMZCA9IGNhc3Q8TG9hZFNETm9kZT4oU3QtPmdldENoYWluKCkpOworICAgIGVsc2UgaWYgKFN0LT5nZXRWYWx1ZSgpLmhhc09uZVVzZSgpICYmCisgICAgICAgICAgICAgQ2hhaW5WYWwtPmdldE9wY29kZSgpID09IElTRDo6VG9rZW5GYWN0b3IpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaT0wLCBlID0gQ2hhaW5WYWwtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIGlmIChDaGFpblZhbC0+Z2V0T3BlcmFuZChpKS5nZXROb2RlKCkgPT0gTGRWYWwpIHsKKyAgICAgICAgICBUb2tlbkZhY3RvckluZGV4ID0gaTsKKyAgICAgICAgICBMZCA9IGNhc3Q8TG9hZFNETm9kZT4oU3QtPmdldFZhbHVlKCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBPcHMucHVzaF9iYWNrKENoYWluVmFsLT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIUxkIHx8ICFJU0Q6OmlzTm9ybWFsTG9hZChMZCkpCisgICAgICByZXR1cm4gU0RWYWx1ZSgpOworCisgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIE1NWCBjYXNlLCBpLmUuIHdlIGFyZSBqdXN0IHR1cm5pbmcgaTY0IGxvYWQvc3RvcmUKKyAgICAvLyBpbnRvIGY2NCBsb2FkL3N0b3JlLCBhdm9pZCB0aGUgdHJhbnNmb3JtYXRpb24gaWYgdGhlcmUgYXJlIG11bHRpcGxlCisgICAgLy8gdXNlcyBvZiB0aGUgbG9hZGVkIHZhbHVlLgorICAgIGlmICghVlQuaXNWZWN0b3IoKSAmJiAhTGQtPmhhc05Vc2VzT2ZWYWx1ZSgxLCAwKSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgICBEZWJ1Z0xvYyBMZERMID0gTGQtPmdldERlYnVnTG9jKCk7CisgICAgRGVidWdMb2MgU3RETCA9IE4tPmdldERlYnVnTG9jKCk7CisgICAgLy8gSWYgd2UgYXJlIGEgNjQtYml0IGNhcGFibGUgeDg2LCBsb3dlciB0byBhIHNpbmdsZSBtb3ZxIGxvYWQvc3RvcmUgcGFpci4KKyAgICAvLyBPdGhlcndpc2UsIGlmIGl0J3MgbGVnYWwgdG8gdXNlIGY2NCBTU0UgaW5zdHJ1Y3Rpb25zLCB1c2UgZjY0IGxvYWQvc3RvcmUKKyAgICAvLyBwYWlyIGluc3RlYWQuCisgICAgaWYgKFN1YnRhcmdldC0+aXM2NEJpdCgpIHx8IEY2NElzTGVnYWwpIHsKKyAgICAgIEVWVCBMZFZUID0gU3VidGFyZ2V0LT5pczY0Qml0KCkgPyBNVlQ6Omk2NCA6IE1WVDo6ZjY0OworICAgICAgU0RWYWx1ZSBOZXdMZCA9IERBRy5nZXRMb2FkKExkVlQsIExkREwsIExkLT5nZXRDaGFpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExkLT5nZXRCYXNlUHRyKCksIExkLT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExkLT5nZXRTcmNWYWx1ZU9mZnNldCgpLCBMZC0+aXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExkLT5pc05vblRlbXBvcmFsKCksIExkLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgICBTRFZhbHVlIE5ld0NoYWluID0gTmV3TGQuZ2V0VmFsdWUoMSk7CisgICAgICBpZiAoVG9rZW5GYWN0b3JJbmRleCAhPSAtMSkgeworICAgICAgICBPcHMucHVzaF9iYWNrKE5ld0NoYWluKTsKKyAgICAgICAgTmV3Q2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBMZERMLCBNVlQ6Ok90aGVyLCAmT3BzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wcy5zaXplKCkpOworICAgICAgfQorICAgICAgcmV0dXJuIERBRy5nZXRTdG9yZShOZXdDaGFpbiwgU3RETCwgTmV3TGQsIFN0LT5nZXRCYXNlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0LT5nZXRTcmNWYWx1ZSgpLCBTdC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3QtPmlzVm9sYXRpbGUoKSwgU3QtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3QtPmdldEFsaWdubWVudCgpKTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGxvd2VyIHRvIHR3byBwYWlycyBvZiAzMi1iaXQgbG9hZHMgLyBzdG9yZXMuCisgICAgU0RWYWx1ZSBMb0FkZHIgPSBMZC0+Z2V0QmFzZVB0cigpOworICAgIFNEVmFsdWUgSGlBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIExkREwsIE1WVDo6aTMyLCBMb0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoNCwgTVZUOjppMzIpKTsKKworICAgIFNEVmFsdWUgTG9MZCA9IERBRy5nZXRMb2FkKE1WVDo6aTMyLCBMZERMLCBMZC0+Z2V0Q2hhaW4oKSwgTG9BZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExkLT5nZXRTcmNWYWx1ZSgpLCBMZC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZC0+aXNWb2xhdGlsZSgpLCBMZC0+aXNOb25UZW1wb3JhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExkLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgU0RWYWx1ZSBIaUxkID0gREFHLmdldExvYWQoTVZUOjppMzIsIExkREwsIExkLT5nZXRDaGFpbigpLCBIaUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGQtPmdldFNyY1ZhbHVlKCksIExkLT5nZXRTcmNWYWx1ZU9mZnNldCgpKzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGQtPmlzVm9sYXRpbGUoKSwgTGQtPmlzTm9uVGVtcG9yYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5BbGlnbihMZC0+Z2V0QWxpZ25tZW50KCksIDQpKTsKKworICAgIFNEVmFsdWUgTmV3Q2hhaW4gPSBMb0xkLmdldFZhbHVlKDEpOworICAgIGlmIChUb2tlbkZhY3RvckluZGV4ICE9IC0xKSB7CisgICAgICBPcHMucHVzaF9iYWNrKExvTGQpOworICAgICAgT3BzLnB1c2hfYmFjayhIaUxkKTsKKyAgICAgIE5ld0NoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgTGRETCwgTVZUOjpPdGhlciwgJk9wc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLnNpemUoKSk7CisgICAgfQorCisgICAgTG9BZGRyID0gU3QtPmdldEJhc2VQdHIoKTsKKyAgICBIaUFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgU3RETCwgTVZUOjppMzIsIExvQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoNCwgTVZUOjppMzIpKTsKKworICAgIFNEVmFsdWUgTG9TdCA9IERBRy5nZXRTdG9yZShOZXdDaGFpbiwgU3RETCwgTG9MZCwgTG9BZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdC0+Z2V0U3JjVmFsdWUoKSwgU3QtPmdldFNyY1ZhbHVlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0LT5pc1ZvbGF0aWxlKCksIFN0LT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0LT5nZXRBbGlnbm1lbnQoKSk7CisgICAgU0RWYWx1ZSBIaVN0ID0gREFHLmdldFN0b3JlKE5ld0NoYWluLCBTdERMLCBIaUxkLCBIaUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0LT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdC0+Z2V0U3JjVmFsdWVPZmZzZXQoKSArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0LT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0LT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbkFsaWduKFN0LT5nZXRBbGlnbm1lbnQoKSwgNCkpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBTdERMLCBNVlQ6Ok90aGVyLCBMb1N0LCBIaVN0KTsKKyAgfQorICByZXR1cm4gU0RWYWx1ZSgpOworfQorCisvLy8gUGVyZm9ybUZPUkNvbWJpbmUgLSBEbyB0YXJnZXQtc3BlY2lmaWMgZGFnIGNvbWJpbmVzIG9uIFg4NklTRDo6Rk9SIGFuZAorLy8vIFg4NklTRDo6RlhPUiBub2Rlcy4KK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1GT1JDb21iaW5lKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgYXNzZXJ0KE4tPmdldE9wY29kZSgpID09IFg4NklTRDo6Rk9SIHx8IE4tPmdldE9wY29kZSgpID09IFg4NklTRDo6RlhPUik7CisgIC8vIEZbWF1PUigwLjAsIHgpIC0+IHgKKyAgLy8gRltYXU9SKHgsIDAuMCkgLT4geAorICBpZiAoQ29uc3RhbnRGUFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50RlBTRE5vZGU+KE4tPmdldE9wZXJhbmQoMCkpKQorICAgIGlmIChDLT5nZXRWYWx1ZUFQRigpLmlzUG9zWmVybygpKQorICAgICAgcmV0dXJuIE4tPmdldE9wZXJhbmQoMSk7CisgIGlmIChDb25zdGFudEZQU0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSkpCisgICAgaWYgKEMtPmdldFZhbHVlQVBGKCkuaXNQb3NaZXJvKCkpCisgICAgICByZXR1cm4gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIFBlcmZvcm1GQU5EQ29tYmluZSAtIERvIHRhcmdldC1zcGVjaWZpYyBkYWcgY29tYmluZXMgb24gWDg2SVNEOjpGQU5EIG5vZGVzLgorc3RhdGljIFNEVmFsdWUgUGVyZm9ybUZBTkRDb21iaW5lKFNETm9kZSAqTiwgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgLy8gRkFORCgwLjAsIHgpIC0+IDAuMAorICAvLyBGQU5EKHgsIDAuMCkgLT4gMC4wCisgIGlmIChDb25zdGFudEZQU0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRGUFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgwKSkpCisgICAgaWYgKEMtPmdldFZhbHVlQVBGKCkuaXNQb3NaZXJvKCkpCisgICAgICByZXR1cm4gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgaWYgKENvbnN0YW50RlBTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudEZQU0ROb2RlPihOLT5nZXRPcGVyYW5kKDEpKSkKKyAgICBpZiAoQy0+Z2V0VmFsdWVBUEYoKS5pc1Bvc1plcm8oKSkKKyAgICAgIHJldHVybiBOLT5nZXRPcGVyYW5kKDEpOworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitzdGF0aWMgU0RWYWx1ZSBQZXJmb3JtQlRDb21iaW5lKFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldExvd2VyaW5nOjpEQUdDb21iaW5lckluZm8gJkRDSSkgeworICAvLyBCVCBpZ25vcmVzIGhpZ2ggYml0cyBpbiB0aGUgYml0IGluZGV4IG9wZXJhbmQuCisgIFNEVmFsdWUgT3AxID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgaWYgKE9wMS5oYXNPbmVVc2UoKSkgeworICAgIHVuc2lnbmVkIEJpdFdpZHRoID0gT3AxLmdldFZhbHVlU2l6ZUluQml0cygpOworICAgIEFQSW50IERlbWFuZGVkTWFzayA9IEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLCBMb2cyXzMyKEJpdFdpZHRoKSk7CisgICAgQVBJbnQgS25vd25aZXJvLCBLbm93bk9uZTsKKyAgICBUYXJnZXRMb3dlcmluZzo6VGFyZ2V0TG93ZXJpbmdPcHQgVExPKERBRywgIURDSS5pc0JlZm9yZUxlZ2FsaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhRENJLmlzQmVmb3JlTGVnYWxpemVPcHMoKSk7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSA9IERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKTsKKyAgICBpZiAoVExPLlNocmlua0RlbWFuZGVkQ29uc3RhbnQoT3AxLCBEZW1hbmRlZE1hc2spIHx8CisgICAgICAgIFRMSS5TaW1wbGlmeURlbWFuZGVkQml0cyhPcDEsIERlbWFuZGVkTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSwgVExPKSkKKyAgICAgIERDSS5Db21taXRUYXJnZXRMb3dlcmluZ09wdChUTE8pOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1WWkVYVF9NT1ZMQ29tYmluZShTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIFNEVmFsdWUgT3AgPSBOLT5nZXRPcGVyYW5kKDApOworICBpZiAoT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpCSVRfQ09OVkVSVCkKKyAgICBPcCA9IE9wLmdldE9wZXJhbmQoMCk7CisgIEVWVCBWVCA9IE4tPmdldFZhbHVlVHlwZSgwKSwgT3BWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBpZiAoT3AuZ2V0T3Bjb2RlKCkgPT0gWDg2SVNEOjpWWkVYVF9MT0FEICYmCisgICAgICBWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKSA9PQorICAgICAgT3BWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldFNpemVJbkJpdHMoKSkgeworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJJVF9DT05WRVJULCBOLT5nZXREZWJ1Z0xvYygpLCBWVCwgT3ApOworICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK3N0YXRpYyBTRFZhbHVlIFBlcmZvcm1aRXh0Q29tYmluZShTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKSB7CisgIC8vIChpMzIgemV4dCAoYW5kIChpOCAgeDg2aXNkOjpzZXRjY19jYXJyeSksIDEpKSAtPgorICAvLyAgICAgICAgICAgKGFuZCAoaTMyIHg4NmlzZDo6c2V0Y2NfY2FycnkpLCAxKQorICAvLyBUaGlzIGVsaW1pbmF0ZXMgdGhlIHpleHQuIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2UKKyAgLy8gSVNEOjpTRVRDQyBpcyBhbHdheXMgbGVnYWxpemVkIHRvIGk4LgorICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoMCk7CisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFORCAmJgorICAgICAgTjAuaGFzT25lVXNlKCkgJiYKKyAgICAgIE4wLmdldE9wZXJhbmQoMCkuaGFzT25lVXNlKCkpIHsKKyAgICBTRFZhbHVlIE4wMCA9IE4wLmdldE9wZXJhbmQoMCk7CisgICAgaWYgKE4wMC5nZXRPcGNvZGUoKSAhPSBYODZJU0Q6OlNFVENDX0NBUlJZKQorICAgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgICBDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihOMC5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoIUMgfHwgQy0+Z2V0WkV4dFZhbHVlKCkgIT0gMSkKKyAgICAgIHJldHVybiBTRFZhbHVlKCk7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QU5ELCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKFg4NklTRDo6U0VUQ0NfQ0FSUlksIGRsLCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjAwLmdldE9wZXJhbmQoMCksIE4wMC5nZXRPcGVyYW5kKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIFZUKSk7CisgIH0KKworICByZXR1cm4gU0RWYWx1ZSgpOworfQorCitTRFZhbHVlIFg4NlRhcmdldExvd2VyaW5nOjpQZXJmb3JtREFHQ29tYmluZShTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUdDb21iaW5lckluZm8gJkRDSSkgY29uc3QgeworICBTZWxlY3Rpb25EQUcgJkRBRyA9IERDSS5EQUc7CisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSVNEOjpWRUNUT1JfU0hVRkZMRTogcmV0dXJuIFBlcmZvcm1TaHVmZmxlQ29tYmluZShOLCBEQUcsICp0aGlzKTsKKyAgY2FzZSBJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtRVhUUkFDVF9WRUNUT1JfRUxUQ29tYmluZShOLCBEQUcsICp0aGlzKTsKKyAgY2FzZSBJU0Q6OlNFTEVDVDogICAgICAgICByZXR1cm4gUGVyZm9ybVNFTEVDVENvbWJpbmUoTiwgREFHLCBTdWJ0YXJnZXQpOworICBjYXNlIFg4NklTRDo6Q01PVjogICAgICAgIHJldHVybiBQZXJmb3JtQ01PVkNvbWJpbmUoTiwgREFHLCBEQ0kpOworICBjYXNlIElTRDo6TVVMOiAgICAgICAgICAgIHJldHVybiBQZXJmb3JtTXVsQ29tYmluZShOLCBEQUcsIERDSSk7CisgIGNhc2UgSVNEOjpTSEw6CisgIGNhc2UgSVNEOjpTUkE6CisgIGNhc2UgSVNEOjpTUkw6ICAgICAgICAgICAgcmV0dXJuIFBlcmZvcm1TaGlmdENvbWJpbmUoTiwgREFHLCBTdWJ0YXJnZXQpOworICBjYXNlIElTRDo6T1I6ICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtT3JDb21iaW5lKE4sIERBRywgRENJLCBTdWJ0YXJnZXQpOworICBjYXNlIElTRDo6U1RPUkU6ICAgICAgICAgIHJldHVybiBQZXJmb3JtU1RPUkVDb21iaW5lKE4sIERBRywgU3VidGFyZ2V0KTsKKyAgY2FzZSBYODZJU0Q6OkZYT1I6CisgIGNhc2UgWDg2SVNEOjpGT1I6ICAgICAgICAgcmV0dXJuIFBlcmZvcm1GT1JDb21iaW5lKE4sIERBRyk7CisgIGNhc2UgWDg2SVNEOjpGQU5EOiAgICAgICAgcmV0dXJuIFBlcmZvcm1GQU5EQ29tYmluZShOLCBEQUcpOworICBjYXNlIFg4NklTRDo6QlQ6ICAgICAgICAgIHJldHVybiBQZXJmb3JtQlRDb21iaW5lKE4sIERBRywgRENJKTsKKyAgY2FzZSBYODZJU0Q6OlZaRVhUX01PVkw6ICByZXR1cm4gUGVyZm9ybVZaRVhUX01PVkxDb21iaW5lKE4sIERBRyk7CisgIGNhc2UgSVNEOjpaRVJPX0VYVEVORDogICAgcmV0dXJuIFBlcmZvcm1aRXh0Q29tYmluZShOLCBEQUcpOworICB9CisKKyAgcmV0dXJuIFNEVmFsdWUoKTsKK30KKworLy8vIGlzVHlwZURlc2lyYWJsZUZvck9wIC0gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBoYXMgbmF0aXZlIHN1cHBvcnQgZm9yCisvLy8gdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlIGFuZCBpdCBpcyAnZGVzaXJhYmxlJyB0byB1c2UgdGhlIHR5cGUgZm9yIHRoZQorLy8vIGdpdmVuIG5vZGUgdHlwZS4gZS5nLiBPbiB4ODYgaTE2IGlzIGxlZ2FsLCBidXQgdW5kZXNpcmFibGUgc2luY2UgaTE2CisvLy8gaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzIGFyZSBsb25nZXIgYW5kIHNvbWUgaTE2IGluc3RydWN0aW9ucyBhcmUgc2xvdy4KK2Jvb2wgWDg2VGFyZ2V0TG93ZXJpbmc6OmlzVHlwZURlc2lyYWJsZUZvck9wKHVuc2lnbmVkIE9wYywgRVZUIFZUKSBjb25zdCB7CisgIGlmICghaXNUeXBlTGVnYWwoVlQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKFZUICE9IE1WVDo6aTE2KQorICAgIHJldHVybiB0cnVlOworCisgIHN3aXRjaCAoT3BjKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgSVNEOjpMT0FEOgorICBjYXNlIElTRDo6U0lHTl9FWFRFTkQ6CisgIGNhc2UgSVNEOjpaRVJPX0VYVEVORDoKKyAgY2FzZSBJU0Q6OkFOWV9FWFRFTkQ6CisgIGNhc2UgSVNEOjpTSEw6CisgIGNhc2UgSVNEOjpTUkw6CisgIGNhc2UgSVNEOjpTVUI6CisgIGNhc2UgSVNEOjpBREQ6CisgIGNhc2UgSVNEOjpNVUw6CisgIGNhc2UgSVNEOjpBTkQ6CisgIGNhc2UgSVNEOjpPUjoKKyAgY2FzZSBJU0Q6OlhPUjoKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworc3RhdGljIGJvb2wgTWF5Rm9sZExvYWQoU0RWYWx1ZSBPcCkgeworICByZXR1cm4gT3AuaGFzT25lVXNlKCkgJiYgSVNEOjppc05vcm1hbExvYWQoT3AuZ2V0Tm9kZSgpKTsKK30KKworc3RhdGljIGJvb2wgTWF5Rm9sZEludG9TdG9yZShTRFZhbHVlIE9wKSB7CisgIHJldHVybiBPcC5oYXNPbmVVc2UoKSAmJiBJU0Q6OmlzTm9ybWFsU3RvcmUoKk9wLmdldE5vZGUoKS0+dXNlX2JlZ2luKCkpOworfQorCisvLy8gSXNEZXNpcmFibGVUb1Byb21vdGVPcCAtIFRoaXMgbWV0aG9kIHF1ZXJ5IHRoZSB0YXJnZXQgd2hldGhlciBpdCBpcworLy8vIGJlbmVmaWNpYWwgZm9yIGRhZyBjb21iaW5lciB0byBwcm9tb3RlIHRoZSBzcGVjaWZpZWQgbm9kZS4gSWYgdHJ1ZSwgaXQKKy8vLyBzaG91bGQgcmV0dXJuIHRoZSBkZXNpcmVkIHByb21vdGlvbiB0eXBlIGJ5IHJlZmVyZW5jZS4KK2Jvb2wgWDg2VGFyZ2V0TG93ZXJpbmc6OklzRGVzaXJhYmxlVG9Qcm9tb3RlT3AoU0RWYWx1ZSBPcCwgRVZUICZQVlQpIGNvbnN0IHsKKyAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgIGlmIChWVCAhPSBNVlQ6OmkxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBQcm9tb3RlID0gZmFsc2U7CisgIGJvb2wgQ29tbXV0ZSA9IGZhbHNlOworICBzd2l0Y2ggKE9wLmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIElTRDo6TE9BRDogeworICAgIExvYWRTRE5vZGUgKkxEID0gY2FzdDxMb2FkU0ROb2RlPihPcCk7CisgICAgLy8gSWYgdGhlIG5vbi1leHRlbmRpbmcgbG9hZCBoYXMgYSBzaW5nbGUgdXNlIGFuZCBpdCdzIG5vdCBsaXZlIG91dCwgdGhlbiBpdAorICAgIC8vIG1pZ2h0IGJlIGZvbGRlZC4KKyAgICBpZiAoTEQtPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6Ok5PTl9FWFRMT0FEIC8qJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AuaGFzT25lVXNlKCkqLykgeworICAgICAgZm9yIChTRE5vZGU6OnVzZV9pdGVyYXRvciBVSSA9IE9wLmdldE5vZGUoKS0+dXNlX2JlZ2luKCksCisgICAgICAgICAgICAgVUUgPSBPcC5nZXROb2RlKCktPnVzZV9lbmQoKTsgVUkgIT0gVUU7ICsrVUkpIHsKKyAgICAgICAgLy8gVGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSdkIHdhbnQgdG8gcHJvbW90ZSBMT0FEIChyYXRoZXIgdGhlbiBpdCBiZWluZworICAgICAgICAvLyBwcm9tb3RlZCBhcyBhbiBvcGVyYW5kIGlzIHdoZW4gaXQncyBvbmx5IHVzZSBpcyBsaXZlb3V0LgorICAgICAgICBpZiAoVUktPmdldE9wY29kZSgpICE9IElTRDo6Q29weVRvUmVnKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgUHJvbW90ZSA9IHRydWU7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOgorICBjYXNlIElTRDo6WkVST19FWFRFTkQ6CisgIGNhc2UgSVNEOjpBTllfRVhURU5EOgorICAgIFByb21vdGUgPSB0cnVlOworICAgIGJyZWFrOworICBjYXNlIElTRDo6U0hMOgorICBjYXNlIElTRDo6U1JMOiB7CisgICAgU0RWYWx1ZSBOMCA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgLy8gTG9vayBvdXQgZm9yIChzdG9yZSAoc2hsIChsb2FkKSwgeCkpLgorICAgIGlmIChNYXlGb2xkTG9hZChOMCkgJiYgTWF5Rm9sZEludG9TdG9yZShPcCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgUHJvbW90ZSA9IHRydWU7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJU0Q6OkFERDoKKyAgY2FzZSBJU0Q6Ok1VTDoKKyAgY2FzZSBJU0Q6OkFORDoKKyAgY2FzZSBJU0Q6Ok9SOgorICBjYXNlIElTRDo6WE9SOgorICAgIENvbW11dGUgPSB0cnVlOworICAgIC8vIGZhbGx0aHJvdWdoCisgIGNhc2UgSVNEOjpTVUI6IHsKKyAgICBTRFZhbHVlIE4wID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIE4xID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgICBpZiAoIUNvbW11dGUgJiYgTWF5Rm9sZExvYWQoTjEpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEF2b2lkIGRpc2FibGluZyBwb3RlbnRpYWwgbG9hZCBmb2xkaW5nIG9wcG9ydHVuaXRpZXMuCisgICAgaWYgKE1heUZvbGRMb2FkKE4wKSAmJiAoIWlzYTxDb25zdGFudFNETm9kZT4oTjEpIHx8IE1heUZvbGRJbnRvU3RvcmUoT3ApKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoTWF5Rm9sZExvYWQoTjEpICYmICghaXNhPENvbnN0YW50U0ROb2RlPihOMCkgfHwgTWF5Rm9sZEludG9TdG9yZShPcCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFByb21vdGUgPSB0cnVlOworICB9CisgIH0KKworICBQVlQgPSBNVlQ6OmkzMjsKKyAgcmV0dXJuIFByb21vdGU7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4NiBJbmxpbmUgQXNzZW1ibHkgU3VwcG9ydAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RhdGljIGJvb2wgTG93ZXJUb0JTd2FwKENhbGxJbnN0ICpDSSkgeworICAvLyBGSVhNRTogdGhpcyBzaG91bGQgdmVyaWZ5IHRoYXQgd2UgYXJlIHRhcmdldHRpbmcgYSA0ODYgb3IgYmV0dGVyLiAgSWYgbm90LAorICAvLyB3ZSB3aWxsIHR1cm4gdGhpcyBic3dhcCBpbnRvIHNvbWV0aGluZyB0aGF0IHdpbGwgYmUgbG93ZXJlZCB0byBsb2dpY2FsIG9wcworICAvLyBpbnN0ZWFkIG9mIGVtaXR0aW5nIHRoZSBic3dhcCBhc20uICBGb3Igbm93LCB3ZSBkb24ndCBzdXBwb3J0IDQ4NiBvciBsb3dlcgorICAvLyBzbyBkb24ndCB3b3JyeSBhYm91dCB0aGlzLgorCisgIC8vIFZlcmlmeSB0aGlzIGlzIGEgc2ltcGxlIGJzd2FwLgorICBpZiAoQ0ktPmdldE51bUFyZ09wZXJhbmRzKCkgIT0gMSB8fAorICAgICAgQ0ktPmdldFR5cGUoKSAhPSBDSS0+Z2V0QXJnT3BlcmFuZCgwKS0+Z2V0VHlwZSgpIHx8CisgICAgICAhQ0ktPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgSW50ZWdlclR5cGUgKlR5ID0gZHluX2Nhc3Q8SW50ZWdlclR5cGU+KENJLT5nZXRUeXBlKCkpOworICBpZiAoIVR5IHx8IFR5LT5nZXRCaXRXaWR0aCgpICUgMTYgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gT2theSwgd2UgY2FuIGRvIHRoaXMgeGZvcm0sIGRvIHNvIG5vdy4KKyAgY29uc3QgVHlwZSAqVHlzW10gPSB7IFR5IH07CisgIE1vZHVsZSAqTSA9IENJLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICBDb25zdGFudCAqSW50ID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihNLCBJbnRyaW5zaWM6OmJzd2FwLCBUeXMsIDEpOworCisgIFZhbHVlICpPcCA9IENJLT5nZXRBcmdPcGVyYW5kKDApOworICBPcCA9IENhbGxJbnN0OjpDcmVhdGUoSW50LCBPcCwgQ0ktPmdldE5hbWUoKSwgQ0kpOworCisgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoT3ApOworICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFg4NlRhcmdldExvd2VyaW5nOjpFeHBhbmRJbmxpbmVBc20oQ2FsbEluc3QgKkNJKSBjb25zdCB7CisgIElubGluZUFzbSAqSUEgPSBjYXN0PElubGluZUFzbT4oQ0ktPmdldENhbGxlZFZhbHVlKCkpOworICBzdGQ6OnZlY3RvcjxJbmxpbmVBc206OkNvbnN0cmFpbnRJbmZvPiBDb25zdHJhaW50cyA9IElBLT5QYXJzZUNvbnN0cmFpbnRzKCk7CisKKyAgc3RkOjpzdHJpbmcgQXNtU3RyID0gSUEtPmdldEFzbVN0cmluZygpOworCisgIC8vIFRPRE86IHNob3VsZCByZW1vdmUgYWx0ZXJuYXRpdmVzIGZyb20gdGhlIGFzbXN0cmluZzogImZvbyB7YXxifSIgLT4gImZvbyBhIgorICBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDQ+IEFzbVBpZWNlczsKKyAgU3BsaXRTdHJpbmcoQXNtU3RyLCBBc21QaWVjZXMsICJcbiIpOyAgLy8gOyBhcyBzZXBhcmF0b3I/CisKKyAgc3dpdGNoIChBc21QaWVjZXMuc2l6ZSgpKSB7CisgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgY2FzZSAxOgorICAgIEFzbVN0ciA9IEFzbVBpZWNlc1swXTsKKyAgICBBc21QaWVjZXMuY2xlYXIoKTsKKyAgICBTcGxpdFN0cmluZyhBc21TdHIsIEFzbVBpZWNlcywgIiBcdCIpOyAgLy8gU3BsaXQgd2l0aCB3aGl0ZXNwYWNlLgorCisgICAgLy8gYnN3YXAgJDAKKyAgICBpZiAoQXNtUGllY2VzLnNpemUoKSA9PSAyICYmCisgICAgICAgIChBc21QaWVjZXNbMF0gPT0gImJzd2FwIiB8fAorICAgICAgICAgQXNtUGllY2VzWzBdID09ICJic3dhcHEiIHx8CisgICAgICAgICBBc21QaWVjZXNbMF0gPT0gImJzd2FwbCIpICYmCisgICAgICAgIChBc21QaWVjZXNbMV0gPT0gIiQwIiB8fAorICAgICAgICAgQXNtUGllY2VzWzFdID09ICIkezA6cX0iKSkgeworICAgICAgLy8gTm8gbmVlZCB0byBjaGVjayBjb25zdHJhaW50cywgbm90aGluZyBvdGhlciB0aGFuIHRoZSBlcXVpdmFsZW50IG9mCisgICAgICAvLyAiPXIsMCIgd291bGQgYmUgdmFsaWQgaGVyZS4KKyAgICAgIHJldHVybiBMb3dlclRvQlN3YXAoQ0kpOworICAgIH0KKyAgICAvLyByb3J3ICQkOCwgJHswOnd9ICAtLT4gIGxsdm0uYnN3YXAuaTE2CisgICAgaWYgKENJLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDE2KSAmJgorICAgICAgICBBc21QaWVjZXMuc2l6ZSgpID09IDMgJiYKKyAgICAgICAgKEFzbVBpZWNlc1swXSA9PSAicm9ydyIgfHwgQXNtUGllY2VzWzBdID09ICJyb2x3IikgJiYKKyAgICAgICAgQXNtUGllY2VzWzFdID09ICIkJDgsIiAmJgorICAgICAgICBBc21QaWVjZXNbMl0gPT0gIiR7MDp3fSIgJiYKKyAgICAgICAgSUEtPmdldENvbnN0cmFpbnRTdHJpbmcoKS5jb21wYXJlKDAsIDUsICI9ciwwLCIpID09IDApIHsKKyAgICAgIEFzbVBpZWNlcy5jbGVhcigpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnRzID0gSUEtPmdldENvbnN0cmFpbnRTdHJpbmcoKTsKKyAgICAgIFNwbGl0U3RyaW5nKFN0cmluZ1JlZihDb25zdHJhaW50cykuc3Vic3RyKDUpLCBBc21QaWVjZXMsICIsIik7CisgICAgICBzdGQ6OnNvcnQoQXNtUGllY2VzLmJlZ2luKCksIEFzbVBpZWNlcy5lbmQoKSk7CisgICAgICBpZiAoQXNtUGllY2VzLnNpemUoKSA9PSA0ICYmCisgICAgICAgICAgQXNtUGllY2VzWzBdID09ICJ+e2NjfSIgJiYKKyAgICAgICAgICBBc21QaWVjZXNbMV0gPT0gIn57ZGlyZmxhZ30iICYmCisgICAgICAgICAgQXNtUGllY2VzWzJdID09ICJ+e2ZsYWdzfSIgJiYKKyAgICAgICAgICBBc21QaWVjZXNbM10gPT0gIn57ZnBzcn0iKSB7CisgICAgICAgIHJldHVybiBMb3dlclRvQlN3YXAoQ0kpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgIGlmIChDSS0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSg2NCkgJiYKKyAgICAgICAgQ29uc3RyYWludHMuc2l6ZSgpID49IDIgJiYKKyAgICAgICAgQ29uc3RyYWludHNbMF0uQ29kZXMuc2l6ZSgpID09IDEgJiYgQ29uc3RyYWludHNbMF0uQ29kZXNbMF0gPT0gIkEiICYmCisgICAgICAgIENvbnN0cmFpbnRzWzFdLkNvZGVzLnNpemUoKSA9PSAxICYmIENvbnN0cmFpbnRzWzFdLkNvZGVzWzBdID09ICIwIikgeworICAgICAgLy8gYnN3YXAgJWVheCAvIGJzd2FwICVlZHggLyB4Y2hnbCAlZWF4LCAlZWR4ICAtPiBsbHZtLmJzd2FwLmk2NAorICAgICAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCA0PiBXb3JkczsKKyAgICAgIFNwbGl0U3RyaW5nKEFzbVBpZWNlc1swXSwgV29yZHMsICIgXHQiKTsKKyAgICAgIGlmIChXb3Jkcy5zaXplKCkgPT0gMiAmJiBXb3Jkc1swXSA9PSAiYnN3YXAiICYmIFdvcmRzWzFdID09ICIlZWF4IikgeworICAgICAgICBXb3Jkcy5jbGVhcigpOworICAgICAgICBTcGxpdFN0cmluZyhBc21QaWVjZXNbMV0sIFdvcmRzLCAiIFx0Iik7CisgICAgICAgIGlmIChXb3Jkcy5zaXplKCkgPT0gMiAmJiBXb3Jkc1swXSA9PSAiYnN3YXAiICYmIFdvcmRzWzFdID09ICIlZWR4IikgeworICAgICAgICAgIFdvcmRzLmNsZWFyKCk7CisgICAgICAgICAgU3BsaXRTdHJpbmcoQXNtUGllY2VzWzJdLCBXb3JkcywgIiBcdCwiKTsKKyAgICAgICAgICBpZiAoV29yZHMuc2l6ZSgpID09IDMgJiYgV29yZHNbMF0gPT0gInhjaGdsIiAmJiBXb3Jkc1sxXSA9PSAiJWVheCIgJiYKKyAgICAgICAgICAgICAgV29yZHNbMl0gPT0gIiVlZHgiKSB7CisgICAgICAgICAgICByZXR1cm4gTG93ZXJUb0JTd2FwKENJKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKKworLy8vIGdldENvbnN0cmFpbnRUeXBlIC0gR2l2ZW4gYSBjb25zdHJhaW50IGxldHRlciwgcmV0dXJuIHRoZSB0eXBlIG9mCisvLy8gY29uc3RyYWludCBpdCBpcyBmb3IgdGhpcyB0YXJnZXQuCitYODZUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUKK1g4NlRhcmdldExvd2VyaW5nOjpnZXRDb25zdHJhaW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCkgY29uc3QgeworICBpZiAoQ29uc3RyYWludC5zaXplKCkgPT0gMSkgeworICAgIHN3aXRjaCAoQ29uc3RyYWludFswXSkgeworICAgIGNhc2UgJ0EnOgorICAgICAgcmV0dXJuIENfUmVnaXN0ZXI7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAncic6CisgICAgY2FzZSAnUic6CisgICAgY2FzZSAnbCc6CisgICAgY2FzZSAncSc6CisgICAgY2FzZSAnUSc6CisgICAgY2FzZSAneCc6CisgICAgY2FzZSAneSc6CisgICAgY2FzZSAnWSc6CisgICAgICByZXR1cm4gQ19SZWdpc3RlckNsYXNzOworICAgIGNhc2UgJ2UnOgorICAgIGNhc2UgJ1onOgorICAgICAgcmV0dXJuIENfT3RoZXI7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gVGFyZ2V0TG93ZXJpbmc6OmdldENvbnN0cmFpbnRUeXBlKENvbnN0cmFpbnQpOworfQorCisvLy8gTG93ZXJYQ29uc3RyYWludCAtIHRyeSB0byByZXBsYWNlIGFuIFggY29uc3RyYWludCwgd2hpY2ggbWF0Y2hlcyBhbnl0aGluZywKKy8vLyB3aXRoIGFub3RoZXIgdGhhdCBoYXMgbW9yZSBzcGVjaWZpYyByZXF1aXJlbWVudHMgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlCisvLy8gY29ycmVzcG9uZGluZyBvcGVyYW5kLgorY29uc3QgY2hhciAqWDg2VGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJYQ29uc3RyYWludChFVlQgQ29uc3RyYWludFZUKSBjb25zdCB7CisgIC8vIEZQIFggY29uc3RyYWludHMgZ2V0IGxvd2VyZWQgdG8gU1NFMS8yIHJlZ2lzdGVycyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZQorICAvLyAnZicgbGlrZSBub3JtYWwgdGFyZ2V0cy4KKyAgaWYgKENvbnN0cmFpbnRWVC5pc0Zsb2F0aW5nUG9pbnQoKSkgeworICAgIGlmIChTdWJ0YXJnZXQtPmhhc1NTRTIoKSkKKyAgICAgIHJldHVybiAiWSI7CisgICAgaWYgKFN1YnRhcmdldC0+aGFzU1NFMSgpKQorICAgICAgcmV0dXJuICJ4IjsKKyAgfQorCisgIHJldHVybiBUYXJnZXRMb3dlcmluZzo6TG93ZXJYQ29uc3RyYWludChDb25zdHJhaW50VlQpOworfQorCisvLy8gTG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludCAtIExvd2VyIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpbnRvIHRoZSBPcHMKKy8vLyB2ZWN0b3IuICBJZiBpdCBpcyBpbnZhbGlkLCBkb24ndCBhZGQgYW55dGhpbmcgdG8gT3BzLgordm9pZCBYODZUYXJnZXRMb3dlcmluZzo6TG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+Jk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgU0RWYWx1ZSBSZXN1bHQoMCwgMCk7CisKKyAgc3dpdGNoIChDb25zdHJhaW50KSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlICdJJzoKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3ApKSB7CisgICAgICBpZiAoQy0+Z2V0WkV4dFZhbHVlKCkgPD0gMzEpIHsKKyAgICAgICAgUmVzdWx0ID0gREFHLmdldFRhcmdldENvbnN0YW50KEMtPmdldFpFeHRWYWx1ZSgpLCBPcC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIGNhc2UgJ0onOgorICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcCkpIHsKKyAgICAgIGlmIChDLT5nZXRaRXh0VmFsdWUoKSA8PSA2MykgeworICAgICAgICBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoQy0+Z2V0WkV4dFZhbHVlKCksIE9wLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgY2FzZSAnSyc6CisgICAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wKSkgeworICAgICAgaWYgKChpbnQ4X3QpQy0+Z2V0U0V4dFZhbHVlKCkgPT0gQy0+Z2V0U0V4dFZhbHVlKCkpIHsKKyAgICAgICAgUmVzdWx0ID0gREFHLmdldFRhcmdldENvbnN0YW50KEMtPmdldFpFeHRWYWx1ZSgpLCBPcC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIGNhc2UgJ04nOgorICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcCkpIHsKKyAgICAgIGlmIChDLT5nZXRaRXh0VmFsdWUoKSA8PSAyNTUpIHsKKyAgICAgICAgUmVzdWx0ID0gREFHLmdldFRhcmdldENvbnN0YW50KEMtPmdldFpFeHRWYWx1ZSgpLCBPcC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIGNhc2UgJ2UnOiB7CisgICAgLy8gMzItYml0IHNpZ25lZCB2YWx1ZQorICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcCkpIHsKKyAgICAgIGlmIChDb25zdGFudEludDo6aXNWYWx1ZVZhbGlkRm9yVHlwZShUeXBlOjpnZXRJbnQzMlR5KCpEQUcuZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLT5nZXRTRXh0VmFsdWUoKSkpIHsKKyAgICAgICAgLy8gV2lkZW4gdG8gNjQgYml0cyBoZXJlIHRvIGdldCBpdCBzaWduIGV4dGVuZGVkLgorICAgICAgICBSZXN1bHQgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnQoQy0+Z2V0U0V4dFZhbHVlKCksIE1WVDo6aTY0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgLy8gRklYTUUgZ2NjIGFjY2VwdHMgc29tZSByZWxvY2F0YWJsZSB2YWx1ZXMgaGVyZSB0b28sIGJ1dCBvbmx5IGluIGNlcnRhaW4KKyAgICAvLyBtZW1vcnkgbW9kZWxzOyBpdCdzIGNvbXBsaWNhdGVkLgorICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgY2FzZSAnWic6IHsKKyAgICAvLyAzMi1iaXQgdW5zaWduZWQgdmFsdWUKKyAgICBpZiAoQ29uc3RhbnRTRE5vZGUgKkMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oT3ApKSB7CisgICAgICBpZiAoQ29uc3RhbnRJbnQ6OmlzVmFsdWVWYWxpZEZvclR5cGUoVHlwZTo6Z2V0SW50MzJUeSgqREFHLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQy0+Z2V0WkV4dFZhbHVlKCkpKSB7CisgICAgICAgIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRDb25zdGFudChDLT5nZXRaRXh0VmFsdWUoKSwgT3AuZ2V0VmFsdWVUeXBlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gRklYTUUgZ2NjIGFjY2VwdHMgc29tZSByZWxvY2F0YWJsZSB2YWx1ZXMgaGVyZSB0b28sIGJ1dCBvbmx5IGluIGNlcnRhaW4KKyAgICAvLyBtZW1vcnkgbW9kZWxzOyBpdCdzIGNvbXBsaWNhdGVkLgorICAgIHJldHVybjsKKyAgfQorICBjYXNlICdpJzogeworICAgIC8vIExpdGVyYWwgaW1tZWRpYXRlcyBhcmUgYWx3YXlzIG9rLgorICAgIGlmIChDb25zdGFudFNETm9kZSAqQ1NUID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wKSkgeworICAgICAgLy8gV2lkZW4gdG8gNjQgYml0cyBoZXJlIHRvIGdldCBpdCBzaWduIGV4dGVuZGVkLgorICAgICAgUmVzdWx0ID0gREFHLmdldFRhcmdldENvbnN0YW50KENTVC0+Z2V0U0V4dFZhbHVlKCksIE1WVDo6aTY0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEluIGFueSBzb3J0IG9mIFBJQyBtb2RlIGFkZHJlc3NlcyBuZWVkIHRvIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUgYnkKKyAgICAvLyBhZGRpbmcgaW4gYSByZWdpc3RlciBvciBzb21lIHNvcnQgb2YgdGFibGUgbG9va3VwLiAgVGhlc2UgY2FuJ3QKKyAgICAvLyBiZSB1c2VkIGFzIGltbWVkaWF0ZXMuCisgICAgaWYgKFN1YnRhcmdldC0+aXNQSUNTdHlsZUdPVCgpIHx8IFN1YnRhcmdldC0+aXNQSUNTdHlsZVN0dWJQSUMoKSkKKyAgICAgIHJldHVybjsKKworICAgIC8vIElmIHdlIGFyZSBpbiBub24tcGljIGNvZGVnZW4gbW9kZSwgd2UgYWxsb3cgdGhlIGFkZHJlc3Mgb2YgYSBnbG9iYWwgKHdpdGgKKyAgICAvLyBhbiBvcHRpb25hbCBkaXNwbGFjZW1lbnQpIHRvIGJlIHVzZWQgd2l0aCAnaScuCisgICAgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EgPSAwOworICAgIGludDY0X3QgT2Zmc2V0ID0gMDsKKworICAgIC8vIE1hdGNoIGVpdGhlciAoR0EpLCAoR0ErQyksIChHQStDMStDMiksIGV0Yy4KKyAgICB3aGlsZSAoMSkgeworICAgICAgaWYgKChHQSA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKSkpIHsKKyAgICAgICAgT2Zmc2V0ICs9IEdBLT5nZXRPZmZzZXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgaWYgKE9wLmdldE9wY29kZSgpID09IElTRDo6QUREKSB7CisgICAgICAgIGlmIChDb25zdGFudFNETm9kZSAqQyA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICAgIE9mZnNldCArPSBDLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICBPcCA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVUIpIHsKKyAgICAgICAgaWYgKENvbnN0YW50U0ROb2RlICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE9wLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgICAgT2Zmc2V0ICs9IC1DLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICBPcCA9IE9wLmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlLCByZWplY3QgaXQuCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gR0EtPmdldEdsb2JhbCgpOworICAgIC8vIElmIHdlIHJlcXVpcmUgYW4gZXh0cmEgbG9hZCB0byBnZXQgdGhpcyBhZGRyZXNzLCBhcyBpbiBQSUMgbW9kZSwgd2UKKyAgICAvLyBjYW4ndCBhY2NlcHQgaXQuCisgICAgaWYgKGlzR2xvYmFsU3R1YlJlZmVyZW5jZShTdWJ0YXJnZXQtPkNsYXNzaWZ5R2xvYmFsUmVmZXJlbmNlKEdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUYXJnZXRNYWNoaW5lKCkpKSkKKyAgICAgIHJldHVybjsKKworICAgIFJlc3VsdCA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEdWLCBPcC5nZXREZWJ1Z0xvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBLT5nZXRWYWx1ZVR5cGUoMCksIE9mZnNldCk7CisgICAgYnJlYWs7CisgIH0KKyAgfQorCisgIGlmIChSZXN1bHQuZ2V0Tm9kZSgpKSB7CisgICAgT3BzLnB1c2hfYmFjayhSZXN1bHQpOworICAgIHJldHVybjsKKyAgfQorICByZXR1cm4gVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQXNtT3BlcmFuZEZvckNvbnN0cmFpbnQoT3AsIENvbnN0cmFpbnQsIE9wcywgREFHKTsKK30KKworc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFg4NlRhcmdldExvd2VyaW5nOjoKK2dldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0IHsKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpID09IDEpIHsKKyAgICAvLyBGSVhNRTogbm90IGhhbmRsaW5nIGZwLXN0YWNrIHlldCEKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsgICAgICAvLyBHQ0MgWDg2IENvbnN0cmFpbnQgTGV0dGVycworICAgIGRlZmF1bHQ6IGJyZWFrOyAgLy8gVW5rbm93biBjb25zdHJhaW50IGxldHRlcgorICAgIGNhc2UgJ3EnOiAgIC8vIEdFTkVSQUxfUkVHUyBpbiA2NC1iaXQgbW9kZSwgUV9SRUdTIGluIDMyLWJpdCBtb2RlLgorICAgICAgaWYgKFN1YnRhcmdldC0+aXM2NEJpdCgpKSB7CisgICAgICAgIGlmIChWVCA9PSBNVlQ6OmkzMikKKyAgICAgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KFg4Njo6RUFYLCBYODY6OkVEWCwgWDg2OjpFQ1gsIFg4Njo6RUJYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpFU0ksIFg4Njo6RURJLCBYODY6OlI4RCwgWDg2OjpSOUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OlIxMEQsWDg2OjpSMTFELFg4Njo6UjEyRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6UjEzRCxYODY6OlIxNEQsWDg2OjpSMTVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpFQlAsIFg4Njo6RVNQLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjppMTYpCisgICAgICAgICAgcmV0dXJuIG1ha2VfdmVjdG9yPHVuc2lnbmVkPihYODY6OkFYLCAgWDg2OjpEWCwgIFg4Njo6Q1gsIFg4Njo6QlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OlNJLCAgWDg2OjpESSwgIFg4Njo6UjhXLFg4Njo6UjlXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpSMTBXLFg4Njo6UjExVyxYODY6OlIxMlcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OlIxM1csWDg2OjpSMTRXLFg4Njo6UjE1VywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6QlAsICBYODY6OlNQLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjppOCkKKyAgICAgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KFg4Njo6QUwsICBYODY6OkRMLCAgWDg2OjpDTCwgWDg2OjpCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6U0lMLCBYODY6OkRJTCwgWDg2OjpSOEIsWDg2OjpSOUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OlIxMEIsWDg2OjpSMTFCLFg4Njo6UjEyQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6UjEzQixYODY6OlIxNEIsWDg2OjpSMTVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpCUEwsIFg4Njo6U1BMLCAwKTsKKworICAgICAgICBlbHNlIGlmIChWVCA9PSBNVlQ6Omk2NCkKKyAgICAgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KFg4Njo6UkFYLCBYODY6OlJEWCwgWDg2OjpSQ1gsIFg4Njo6UkJYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpSU0ksIFg4Njo6UkRJLCBYODY6OlI4LCAgWDg2OjpSOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6UjEwLCBYODY6OlIxMSwgWDg2OjpSMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OlIxMywgWDg2OjpSMTQsIFg4Njo6UjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpSQlAsIFg4Njo6UlNQLCAwKTsKKworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIDMyLWJpdCBmYWxsdGhyb3VnaAorICAgIGNhc2UgJ1EnOiAgIC8vIFFfUkVHUworICAgICAgaWYgKFZUID09IE1WVDo6aTMyKQorICAgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KFg4Njo6RUFYLCBYODY6OkVEWCwgWDg2OjpFQ1gsIFg4Njo6RUJYLCAwKTsKKyAgICAgIGVsc2UgaWYgKFZUID09IE1WVDo6aTE2KQorICAgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KFg4Njo6QVgsIFg4Njo6RFgsIFg4Njo6Q1gsIFg4Njo6QlgsIDApOworICAgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjppOCkKKyAgICAgICAgcmV0dXJuIG1ha2VfdmVjdG9yPHVuc2lnbmVkPihYODY6OkFMLCBYODY6OkRMLCBYODY6OkNMLCBYODY6OkJMLCAwKTsKKyAgICAgIGVsc2UgaWYgKFZUID09IE1WVDo6aTY0KQorICAgICAgICByZXR1cm4gbWFrZV92ZWN0b3I8dW5zaWduZWQ+KFg4Njo6UkFYLCBYODY6OlJEWCwgWDg2OjpSQ1gsIFg4Njo6UkJYLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKK30KKworc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKj4KK1g4NlRhcmdldExvd2VyaW5nOjpnZXRSZWdGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCB7CisgIC8vIEZpcnN0LCBzZWUgaWYgdGhpcyBpcyBhIGNvbnN0cmFpbnQgdGhhdCBkaXJlY3RseSBjb3JyZXNwb25kcyB0byBhbiBMTFZNCisgIC8vIHJlZ2lzdGVyIGNsYXNzLgorICBpZiAoQ29uc3RyYWludC5zaXplKCkgPT0gMSkgeworICAgIC8vIEdDQyBDb25zdHJhaW50IExldHRlcnMKKyAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdyJzogICAvLyBHRU5FUkFMX1JFR1MKKyAgICBjYXNlICdsJzogICAvLyBJTkRFWF9SRUdTCisgICAgICBpZiAoVlQgPT0gTVZUOjppOCkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MpOworICAgICAgaWYgKFZUID09IE1WVDo6aTE2KQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MpOworICAgICAgaWYgKFZUID09IE1WVDo6aTMyIHx8ICFTdWJ0YXJnZXQtPmlzNjRCaXQoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcyk7CisgICAgY2FzZSAnUic6ICAgLy8gTEVHQUNZX1JFR1MKKyAgICAgIGlmIChWVCA9PSBNVlQ6Omk4KQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFg4Njo6R1I4X05PUkVYUmVnaXN0ZXJDbGFzcyk7CisgICAgICBpZiAoVlQgPT0gTVZUOjppMTYpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgWDg2OjpHUjE2X05PUkVYUmVnaXN0ZXJDbGFzcyk7CisgICAgICBpZiAoVlQgPT0gTVZUOjppMzIgfHwgIVN1YnRhcmdldC0+aXM2NEJpdCgpKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFg4Njo6R1IzMl9OT1JFWFJlZ2lzdGVyQ2xhc3MpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBYODY6OkdSNjRfTk9SRVhSZWdpc3RlckNsYXNzKTsKKyAgICBjYXNlICdmJzogIC8vIEZQIFN0YWNrIHJlZ2lzdGVycy4KKyAgICAgIC8vIElmIFNTRSBpcyBlbmFibGVkIGZvciB0aGlzIFZULCB1c2UgZjgwIHRvIGVuc3VyZSB0aGUgaXNlbCBtb3ZlcyB0aGUKKyAgICAgIC8vIHZhbHVlIHRvIHRoZSBjb3JyZWN0IGZwc3RhY2sgcmVnaXN0ZXIgY2xhc3MuCisgICAgICBpZiAoVlQgPT0gTVZUOjpmMzIgJiYgIWlzU2NhbGFyRlBUeXBlSW5TU0VSZWcoVlQpKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMFUsIFg4Njo6UkZQMzJSZWdpc3RlckNsYXNzKTsKKyAgICAgIGlmIChWVCA9PSBNVlQ6OmY2NCAmJiAhaXNTY2FsYXJGUFR5cGVJblNTRVJlZyhWVCkpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgWDg2OjpSRlA2NFJlZ2lzdGVyQ2xhc3MpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBYODY6OlJGUDgwUmVnaXN0ZXJDbGFzcyk7CisgICAgY2FzZSAneSc6ICAgLy8gTU1YX1JFR1MgaWYgTU1YIGFsbG93ZWQuCisgICAgICBpZiAoIVN1YnRhcmdldC0+aGFzTU1YKCkpIGJyZWFrOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzKTsKKyAgICBjYXNlICdZJzogICAvLyBTU0VfUkVHUyBpZiBTU0UyIGFsbG93ZWQKKyAgICAgIGlmICghU3VidGFyZ2V0LT5oYXNTU0UyKCkpIGJyZWFrOworICAgICAgLy8gRkFMTCBUSFJPVUdILgorICAgIGNhc2UgJ3gnOiAgIC8vIFNTRV9SRUdTIGlmIFNTRTEgYWxsb3dlZAorICAgICAgaWYgKCFTdWJ0YXJnZXQtPmhhc1NTRTEoKSkgYnJlYWs7CisKKyAgICAgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAvLyBTY2FsYXIgU1NFIHR5cGVzLgorICAgICAgY2FzZSBNVlQ6OmYzMjoKKyAgICAgIGNhc2UgTVZUOjppMzI6CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwVSwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcyk7CisgICAgICBjYXNlIE1WVDo6ZjY0OgorICAgICAgY2FzZSBNVlQ6Omk2NDoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzKTsKKyAgICAgIC8vIFZlY3RvciB0eXBlcy4KKyAgICAgIGNhc2UgTVZUOjp2MTZpODoKKyAgICAgIGNhc2UgTVZUOjp2OGkxNjoKKyAgICAgIGNhc2UgTVZUOjp2NGkzMjoKKyAgICAgIGNhc2UgTVZUOjp2Mmk2NDoKKyAgICAgIGNhc2UgTVZUOjp2NGYzMjoKKyAgICAgIGNhc2UgTVZUOjp2MmY2NDoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDBVLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBVc2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW4gVGFyZ2V0TG93ZXJpbmcgdG8gY29udmVydCB0aGUgcmVnaXN0ZXIKKyAgLy8gY29uc3RyYWludCBpbnRvIGEgbWVtYmVyIG9mIGEgcmVnaXN0ZXIgY2xhc3MuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyo+IFJlczsKKyAgUmVzID0gVGFyZ2V0TG93ZXJpbmc6OmdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoQ29uc3RyYWludCwgVlQpOworCisgIC8vIE5vdCBmb3VuZCBhcyBhIHN0YW5kYXJkIHJlZ2lzdGVyPworICBpZiAoUmVzLnNlY29uZCA9PSAwKSB7CisgICAgLy8gTWFwIHN0KDApIC0+IHN0KDcpIC0+IFNUMAorICAgIGlmIChDb25zdHJhaW50LnNpemUoKSA9PSA3ICYmIENvbnN0cmFpbnRbMF0gPT0gJ3snICYmCisgICAgICAgIHRvbG93ZXIoQ29uc3RyYWludFsxXSkgPT0gJ3MnICYmCisgICAgICAgIHRvbG93ZXIoQ29uc3RyYWludFsyXSkgPT0gJ3QnICYmCisgICAgICAgIENvbnN0cmFpbnRbM10gPT0gJygnICYmCisgICAgICAgIChDb25zdHJhaW50WzRdID49ICcwJyAmJiBDb25zdHJhaW50WzRdIDw9ICc3JykgJiYKKyAgICAgICAgQ29uc3RyYWludFs1XSA9PSAnKScgJiYKKyAgICAgICAgQ29uc3RyYWludFs2XSA9PSAnfScpIHsKKworICAgICAgUmVzLmZpcnN0ID0gWDg2OjpTVDArQ29uc3RyYWludFs0XS0nMCc7CisgICAgICBSZXMuc2Vjb25kID0gWDg2OjpSRlA4MFJlZ2lzdGVyQ2xhc3M7CisgICAgICByZXR1cm4gUmVzOworICAgIH0KKworICAgIC8vIEdDQyBhbGxvd3MgInN0KDApIiB0byBiZSBjYWxsZWQganVzdCBwbGFpbiAic3QiLgorICAgIGlmIChTdHJpbmdSZWYoIntzdH0iKS5lcXVhbHNfbG93ZXIoQ29uc3RyYWludCkpIHsKKyAgICAgIFJlcy5maXJzdCA9IFg4Njo6U1QwOworICAgICAgUmVzLnNlY29uZCA9IFg4Njo6UkZQODBSZWdpc3RlckNsYXNzOworICAgICAgcmV0dXJuIFJlczsKKyAgICB9CisKKyAgICAvLyBmbGFncyAtPiBFRkxBR1MKKyAgICBpZiAoU3RyaW5nUmVmKCJ7ZmxhZ3N9IikuZXF1YWxzX2xvd2VyKENvbnN0cmFpbnQpKSB7CisgICAgICBSZXMuZmlyc3QgPSBYODY6OkVGTEFHUzsKKyAgICAgIFJlcy5zZWNvbmQgPSBYODY6OkNDUlJlZ2lzdGVyQ2xhc3M7CisgICAgICByZXR1cm4gUmVzOworICAgIH0KKworICAgIC8vICdBJyBtZWFucyBFQVggKyBFRFguCisgICAgaWYgKENvbnN0cmFpbnQgPT0gIkEiKSB7CisgICAgICBSZXMuZmlyc3QgPSBYODY6OkVBWDsKKyAgICAgIFJlcy5zZWNvbmQgPSBYODY6OkdSMzJfQURSZWdpc3RlckNsYXNzOworICAgICAgcmV0dXJuIFJlczsKKyAgICB9CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSByZWdpc3RlciBjbGFzcyBvZiB0aGUgd3JvbmcgdmFsdWUKKyAgLy8gdHlwZS4gIEZvciBleGFtcGxlLCB3ZSB3YW50IHRvIG1hcCAie2F4fSxpMzIiIC0+IHtlYXh9LCB3ZSBkb24ndCB3YW50IGl0IHRvCisgIC8vIHR1cm4gaW50byB7YXh9LHtkeH0uCisgIGlmIChSZXMuc2Vjb25kLT5oYXNUeXBlKFZUKSkKKyAgICByZXR1cm4gUmVzOyAgIC8vIENvcnJlY3QgdHlwZSBhbHJlYWR5LCBub3RoaW5nIHRvIGRvLgorCisgIC8vIEFsbCBvZiB0aGUgc2luZ2xlLXJlZ2lzdGVyIEdDQyByZWdpc3RlciBjbGFzc2VzIG1hcCB0aGVpciB2YWx1ZXMgb250bworICAvLyAxNi1iaXQgcmVnaXN0ZXIgcGllY2VzICJheCIsImR4IiwiY3giLCJieCIsInNpIiwiZGkiLCJicCIsInNwIi4gIElmIHdlCisgIC8vIHJlYWxseSB3YW50IGFuIDgtYml0IG9yIDMyLWJpdCByZWdpc3RlciwgbWFwIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgorICAvLyBjbGFzcyBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSByZWdpc3Rlci4KKyAgaWYgKFJlcy5zZWNvbmQgPT0gWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcykgeworICAgIGlmIChWVCA9PSBNVlQ6Omk4KSB7CisgICAgICB1bnNpZ25lZCBEZXN0UmVnID0gMDsKKyAgICAgIHN3aXRjaCAoUmVzLmZpcnN0KSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpBWDogRGVzdFJlZyA9IFg4Njo6QUw7IGJyZWFrOworICAgICAgY2FzZSBYODY6OkRYOiBEZXN0UmVnID0gWDg2OjpETDsgYnJlYWs7CisgICAgICBjYXNlIFg4Njo6Q1g6IERlc3RSZWcgPSBYODY6OkNMOyBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpCWDogRGVzdFJlZyA9IFg4Njo6Qkw7IGJyZWFrOworICAgICAgfQorICAgICAgaWYgKERlc3RSZWcpIHsKKyAgICAgICAgUmVzLmZpcnN0ID0gRGVzdFJlZzsKKyAgICAgICAgUmVzLnNlY29uZCA9IFg4Njo6R1I4UmVnaXN0ZXJDbGFzczsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFZUID09IE1WVDo6aTMyKSB7CisgICAgICB1bnNpZ25lZCBEZXN0UmVnID0gMDsKKyAgICAgIHN3aXRjaCAoUmVzLmZpcnN0KSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpBWDogRGVzdFJlZyA9IFg4Njo6RUFYOyBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpEWDogRGVzdFJlZyA9IFg4Njo6RURYOyBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpDWDogRGVzdFJlZyA9IFg4Njo6RUNYOyBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpCWDogRGVzdFJlZyA9IFg4Njo6RUJYOyBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpTSTogRGVzdFJlZyA9IFg4Njo6RVNJOyBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpESTogRGVzdFJlZyA9IFg4Njo6RURJOyBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpCUDogRGVzdFJlZyA9IFg4Njo6RUJQOyBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpTUDogRGVzdFJlZyA9IFg4Njo6RVNQOyBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChEZXN0UmVnKSB7CisgICAgICAgIFJlcy5maXJzdCA9IERlc3RSZWc7CisgICAgICAgIFJlcy5zZWNvbmQgPSBYODY6OkdSMzJSZWdpc3RlckNsYXNzOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoVlQgPT0gTVZUOjppNjQpIHsKKyAgICAgIHVuc2lnbmVkIERlc3RSZWcgPSAwOworICAgICAgc3dpdGNoIChSZXMuZmlyc3QpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBYODY6OkFYOiBEZXN0UmVnID0gWDg2OjpSQVg7IGJyZWFrOworICAgICAgY2FzZSBYODY6OkRYOiBEZXN0UmVnID0gWDg2OjpSRFg7IGJyZWFrOworICAgICAgY2FzZSBYODY6OkNYOiBEZXN0UmVnID0gWDg2OjpSQ1g7IGJyZWFrOworICAgICAgY2FzZSBYODY6OkJYOiBEZXN0UmVnID0gWDg2OjpSQlg7IGJyZWFrOworICAgICAgY2FzZSBYODY6OlNJOiBEZXN0UmVnID0gWDg2OjpSU0k7IGJyZWFrOworICAgICAgY2FzZSBYODY6OkRJOiBEZXN0UmVnID0gWDg2OjpSREk7IGJyZWFrOworICAgICAgY2FzZSBYODY6OkJQOiBEZXN0UmVnID0gWDg2OjpSQlA7IGJyZWFrOworICAgICAgY2FzZSBYODY6OlNQOiBEZXN0UmVnID0gWDg2OjpSU1A7IGJyZWFrOworICAgICAgfQorICAgICAgaWYgKERlc3RSZWcpIHsKKyAgICAgICAgUmVzLmZpcnN0ID0gRGVzdFJlZzsKKyAgICAgICAgUmVzLnNlY29uZCA9IFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3M7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKFJlcy5zZWNvbmQgPT0gWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcyB8fAorICAgICAgICAgICAgIFJlcy5zZWNvbmQgPT0gWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcyB8fAorICAgICAgICAgICAgIFJlcy5zZWNvbmQgPT0gWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MpIHsKKyAgICAvLyBIYW5kbGUgcmVmZXJlbmNlcyB0byBYTU0gcGh5c2ljYWwgcmVnaXN0ZXJzIHRoYXQgZ290IG1hcHBlZCBpbnRvIHRoZQorICAgIC8vIHdyb25nIGNsYXNzLiAgVGhpcyBjYW4gaGFwcGVuIHdpdGggY29uc3RyYWludHMgbGlrZSB7eG1tMH0gd2hlcmUgdGhlCisgICAgLy8gdGFyZ2V0IGluZGVwZW5kZW50IHJlZ2lzdGVyIG1hcHBlciB3aWxsIGp1c3QgcGljayB0aGUgZmlyc3QgbWF0Y2ggaXQgY2FuCisgICAgLy8gZmluZCwgaWdub3JpbmcgdGhlIHJlcXVpcmVkIHR5cGUuCisgICAgaWYgKFZUID09IE1WVDo6ZjMyKQorICAgICAgUmVzLnNlY29uZCA9IFg4Njo6RlIzMlJlZ2lzdGVyQ2xhc3M7CisgICAgZWxzZSBpZiAoVlQgPT0gTVZUOjpmNjQpCisgICAgICBSZXMuc2Vjb25kID0gWDg2OjpGUjY0UmVnaXN0ZXJDbGFzczsKKyAgICBlbHNlIGlmIChYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcy0+aGFzVHlwZShWVCkpCisgICAgICBSZXMuc2Vjb25kID0gWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3M7CisgIH0KKworICByZXR1cm4gUmVzOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SVNlbExvd2VyaW5nLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJU2VsTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJjNzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SVNlbExvd2VyaW5nLmgKQEAgLTAsMCArMSw4MjcgQEAKKy8vPT09LS0gWDg2SVNlbExvd2VyaW5nLmggLSBYODYgREFHIExvd2VyaW5nIEludGVyZmFjZSAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZXMgdGhhdCBYODYgdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50byBhCisvLyBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWDg2SVNFTExPV0VSSU5HX0gKKyNkZWZpbmUgWDg2SVNFTExPV0VSSU5HX0gKKworI2luY2x1ZGUgIlg4NlN1YnRhcmdldC5oIgorI2luY2x1ZGUgIlg4NlJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgIlg4Nk1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRmFzdElTZWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBuYW1lc3BhY2UgWDg2SVNEIHsKKyAgICAvLyBYODYgU3BlY2lmaWMgREFHIE5vZGVzCisgICAgZW51bSBOb2RlVHlwZSB7CisgICAgICAvLyBTdGFydCB0aGUgbnVtYmVyaW5nIHdoZXJlIHRoZSBidWlsdGluIG9wcyBsZWF2ZSBvZmYuCisgICAgICBGSVJTVF9OVU1CRVIgPSBJU0Q6OkJVSUxUSU5fT1BfRU5ELAorCisgICAgICAvLy8gQlNGIC0gQml0IHNjYW4gZm9yd2FyZC4KKyAgICAgIC8vLyBCU1IgLSBCaXQgc2NhbiByZXZlcnNlLgorICAgICAgQlNGLAorICAgICAgQlNSLAorCisgICAgICAvLy8gU0hMRCwgU0hSRCAtIERvdWJsZSBzaGlmdCBpbnN0cnVjdGlvbnMuIFRoZXNlIGNvcnJlc3BvbmQgdG8KKyAgICAgIC8vLyBYODY6OlNITER4eCBhbmQgWDg2OjpTSFJEeHggaW5zdHJ1Y3Rpb25zLgorICAgICAgU0hMRCwKKyAgICAgIFNIUkQsCisKKyAgICAgIC8vLyBGQU5EIC0gQml0d2lzZSBsb2dpY2FsIEFORCBvZiBmbG9hdGluZyBwb2ludCB2YWx1ZXMuIFRoaXMgY29ycmVzcG9uZHMKKyAgICAgIC8vLyB0byBYODY6OkFORFBTIG9yIFg4Njo6QU5EUEQuCisgICAgICBGQU5ELAorCisgICAgICAvLy8gRk9SIC0gQml0d2lzZSBsb2dpY2FsIE9SIG9mIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4gVGhpcyBjb3JyZXNwb25kcworICAgICAgLy8vIHRvIFg4Njo6T1JQUyBvciBYODY6Ok9SUEQuCisgICAgICBGT1IsCisKKyAgICAgIC8vLyBGWE9SIC0gQml0d2lzZSBsb2dpY2FsIFhPUiBvZiBmbG9hdGluZyBwb2ludCB2YWx1ZXMuIFRoaXMgY29ycmVzcG9uZHMKKyAgICAgIC8vLyB0byBYODY6OlhPUlBTIG9yIFg4Njo6WE9SUEQuCisgICAgICBGWE9SLAorCisgICAgICAvLy8gRlNSTCAtIEJpdHdpc2UgbG9naWNhbCByaWdodCBzaGlmdCBvZiBmbG9hdGluZyBwb2ludCB2YWx1ZXMuIFRoZXNlCisgICAgICAvLy8gY29ycmVzcG9uZHMgdG8gWDg2OjpQU1JMRFEuCisgICAgICBGU1JMLAorCisgICAgICAvLy8gRklMRCwgRklMRF9GTEFHIC0gVGhpcyBpbnN0cnVjdGlvbiBpbXBsZW1lbnRzIFNJTlRfVE9fRlAgd2l0aCB0aGUKKyAgICAgIC8vLyBpbnRlZ2VyIHNvdXJjZSBpbiBtZW1vcnkgYW5kIEZQIHJlZyByZXN1bHQuICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAgLy8vIFg4Njo6RklMRCptIGluc3RydWN0aW9ucy4gSXQgaGFzIHRocmVlIGlucHV0cyAodG9rZW4gY2hhaW4sIGFkZHJlc3MsCisgICAgICAvLy8gYW5kIHNvdXJjZSB0eXBlKSBhbmQgdHdvIG91dHB1dHMgKEZQIHZhbHVlIGFuZCB0b2tlbiBjaGFpbikuIEZJTERfRkxBRworICAgICAgLy8vIGFsc28gcHJvZHVjZXMgYSBmbGFnKS4KKyAgICAgIEZJTEQsCisgICAgICBGSUxEX0ZMQUcsCisKKyAgICAgIC8vLyBGUF9UT19JTlQqX0lOX01FTSAtIFRoaXMgaW5zdHJ1Y3Rpb24gaW1wbGVtZW50cyBGUF9UT19TSU5UIHdpdGggdGhlCisgICAgICAvLy8gaW50ZWdlciBkZXN0aW5hdGlvbiBpbiBtZW1vcnkgYW5kIGEgRlAgcmVnIHNvdXJjZS4gIFRoaXMgY29ycmVzcG9uZHMKKyAgICAgIC8vLyB0byB0aGUgWDg2OjpGSVNUKm0gaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgcm91bmRpbmcgbW9kZSBjaGFuZ2Ugc3R1ZmYuIEl0CisgICAgICAvLy8gaGFzIHR3byBpbnB1dHMgKHRva2VuIGNoYWluIGFuZCBhZGRyZXNzKSBhbmQgdHdvIG91dHB1dHMgKGludCB2YWx1ZQorICAgICAgLy8vIGFuZCB0b2tlbiBjaGFpbikuCisgICAgICBGUF9UT19JTlQxNl9JTl9NRU0sCisgICAgICBGUF9UT19JTlQzMl9JTl9NRU0sCisgICAgICBGUF9UT19JTlQ2NF9JTl9NRU0sCisKKyAgICAgIC8vLyBGTEQgLSBUaGlzIGluc3RydWN0aW9uIGltcGxlbWVudHMgYW4gZXh0ZW5kaW5nIGxvYWQgdG8gRlAgc3RhY2sgc2xvdHMuCisgICAgICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgWDg2OjpGTEQzMm0gLyBYODY6OkZMRDY0bS4gSXQgdGFrZXMgYSBjaGFpbgorICAgICAgLy8vIG9wZXJhbmQsIHB0ciB0byBsb2FkIGZyb20sIGFuZCBhIFZhbHVlVHlwZSBub2RlIGluZGljYXRpbmcgdGhlIHR5cGUKKyAgICAgIC8vLyB0byBsb2FkIHRvLgorICAgICAgRkxELAorCisgICAgICAvLy8gRlNUIC0gVGhpcyBpbnN0cnVjdGlvbiBpbXBsZW1lbnRzIGEgdHJ1bmNhdGluZyBzdG9yZSB0byBGUCBzdGFjaworICAgICAgLy8vIHNsb3RzLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBYODY6OkZTVDMybSAvIFg4Njo6RlNUNjRtLiBJdCB0YWtlcyBhCisgICAgICAvLy8gY2hhaW4gb3BlcmFuZCwgdmFsdWUgdG8gc3RvcmUsIGFkZHJlc3MsIGFuZCBhIFZhbHVlVHlwZSB0byBzdG9yZSBpdAorICAgICAgLy8vIGFzLgorICAgICAgRlNULAorCisgICAgICAvLy8gQ0FMTCAtIFRoZXNlIG9wZXJhdGlvbnMgcmVwcmVzZW50IGFuIGFic3RyYWN0IFg4NiBjYWxsCisgICAgICAvLy8gaW5zdHJ1Y3Rpb24sIHdoaWNoIGluY2x1ZGVzIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24uICBJbiBwYXJ0aWN1bGFyIHRoZQorICAgICAgLy8vIG9wZXJhbmRzIG9mIHRoZXNlIG5vZGUgYXJlOgorICAgICAgLy8vCisgICAgICAvLy8gICAgICMwIC0gVGhlIGluY29taW5nIHRva2VuIGNoYWluCisgICAgICAvLy8gICAgICMxIC0gVGhlIGNhbGxlZQorICAgICAgLy8vICAgICAjMiAtIFRoZSBudW1iZXIgb2YgYXJnIGJ5dGVzIHRoZSBjYWxsZXIgcHVzaGVzIG9uIHRoZSBzdGFjay4KKyAgICAgIC8vLyAgICAgIzMgLSBUaGUgbnVtYmVyIG9mIGFyZyBieXRlcyB0aGUgY2FsbGVlIHBvcHMgb2ZmIHRoZSBzdGFjay4KKyAgICAgIC8vLyAgICAgIzQgLSBUaGUgdmFsdWUgdG8gcGFzcyBpbiBBTC9BWC9FQVggKG9wdGlvbmFsKQorICAgICAgLy8vICAgICAjNSAtIFRoZSB2YWx1ZSB0byBwYXNzIGluIERML0RYL0VEWCAob3B0aW9uYWwpCisgICAgICAvLy8KKyAgICAgIC8vLyBUaGUgcmVzdWx0IHZhbHVlcyBvZiB0aGVzZSBub2RlcyBhcmU6CisgICAgICAvLy8KKyAgICAgIC8vLyAgICAgIzAgLSBUaGUgb3V0Z29pbmcgdG9rZW4gY2hhaW4KKyAgICAgIC8vLyAgICAgIzEgLSBUaGUgZmlyc3QgcmVnaXN0ZXIgcmVzdWx0IHZhbHVlIChvcHRpb25hbCkKKyAgICAgIC8vLyAgICAgIzIgLSBUaGUgc2Vjb25kIHJlZ2lzdGVyIHJlc3VsdCB2YWx1ZSAob3B0aW9uYWwpCisgICAgICAvLy8KKyAgICAgIENBTEwsCisKKyAgICAgIC8vLyBSRFRTQ19EQUcgLSBUaGlzIG9wZXJhdGlvbiBpbXBsZW1lbnRzIHRoZSBsb3dlcmluZyBmb3IgCisgICAgICAvLy8gcmVhZGN5Y2xlY291bnRlcgorICAgICAgUkRUU0NfREFHLAorCisgICAgICAvLy8gWDg2IGNvbXBhcmUgYW5kIGxvZ2ljYWwgY29tcGFyZSBpbnN0cnVjdGlvbnMuCisgICAgICBDTVAsIENPTUksIFVDT01JLAorCisgICAgICAvLy8gWDg2IGJpdC10ZXN0IGluc3RydWN0aW9ucy4KKyAgICAgIEJULAorCisgICAgICAvLy8gWDg2IFNldENDLiBPcGVyYW5kIDAgaXMgY29uZGl0aW9uIGNvZGUsIGFuZCBvcGVyYW5kIDEgaXMgdGhlIGZsYWcKKyAgICAgIC8vLyBvcGVyYW5kIHByb2R1Y2VkIGJ5IGEgQ01QIGluc3RydWN0aW9uLgorICAgICAgU0VUQ0MsCisKKyAgICAgIC8vIFNhbWUgYXMgU0VUQ0MgZXhjZXB0IGl0J3MgbWF0ZXJpYWxpemVkIHdpdGggYSBzYmIgYW5kIHRoZSB2YWx1ZSBpcyBhbGwKKyAgICAgIC8vIG9uZSdzIG9yIGFsbCB6ZXJvJ3MuCisgICAgICBTRVRDQ19DQVJSWSwKKworICAgICAgLy8vIFg4NiBjb25kaXRpb25hbCBtb3Zlcy4gT3BlcmFuZCAwIGFuZCBvcGVyYW5kIDEgYXJlIHRoZSB0d28gdmFsdWVzCisgICAgICAvLy8gdG8gc2VsZWN0IGZyb20uIE9wZXJhbmQgMiBpcyB0aGUgY29uZGl0aW9uIGNvZGUsIGFuZCBvcGVyYW5kIDMgaXMgdGhlCisgICAgICAvLy8gZmxhZyBvcGVyYW5kIHByb2R1Y2VkIGJ5IGEgQ01QIG9yIFRFU1QgaW5zdHJ1Y3Rpb24uIEl0IGFsc28gd3JpdGVzIGEKKyAgICAgIC8vLyBmbGFnIHJlc3VsdC4KKyAgICAgIENNT1YsCisKKyAgICAgIC8vLyBYODYgY29uZGl0aW9uYWwgYnJhbmNoZXMuIE9wZXJhbmQgMCBpcyB0aGUgY2hhaW4gb3BlcmFuZCwgb3BlcmFuZCAxCisgICAgICAvLy8gaXMgdGhlIGJsb2NrIHRvIGJyYW5jaCBpZiBjb25kaXRpb24gaXMgdHJ1ZSwgb3BlcmFuZCAyIGlzIHRoZQorICAgICAgLy8vIGNvbmRpdGlvbiBjb2RlLCBhbmQgb3BlcmFuZCAzIGlzIHRoZSBmbGFnIG9wZXJhbmQgcHJvZHVjZWQgYnkgYSBDTVAKKyAgICAgIC8vLyBvciBURVNUIGluc3RydWN0aW9uLgorICAgICAgQlJDT05ELAorCisgICAgICAvLy8gUmV0dXJuIHdpdGggYSBmbGFnIG9wZXJhbmQuIE9wZXJhbmQgMCBpcyB0aGUgY2hhaW4gb3BlcmFuZCwgb3BlcmFuZAorICAgICAgLy8vIDEgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBzdGFjayB0byBwb3AuCisgICAgICBSRVRfRkxBRywKKworICAgICAgLy8vIFJFUF9TVE9TIC0gUmVwZWF0IGZpbGwsIGNvcnJlc3BvbmRzIHRvIFg4Njo6UkVQX1NUT1N4LgorICAgICAgUkVQX1NUT1MsCisKKyAgICAgIC8vLyBSRVBfTU9WUyAtIFJlcGVhdCBtb3ZlLCBjb3JyZXNwb25kcyB0byBYODY6OlJFUF9NT1ZTeC4KKyAgICAgIFJFUF9NT1ZTLAorCisgICAgICAvLy8gR2xvYmFsQmFzZVJlZyAtIE9uIERhcndpbiwgdGhpcyBub2RlIHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUgcG9wbAorICAgICAgLy8vIGF0IGZ1bmN0aW9uIGVudHJ5LCB1c2VkIGZvciBQSUMgY29kZS4KKyAgICAgIEdsb2JhbEJhc2VSZWcsCisKKyAgICAgIC8vLyBXcmFwcGVyIC0gQSB3cmFwcGVyIG5vZGUgZm9yIFRhcmdldENvbnN0YW50UG9vbCwKKyAgICAgIC8vLyBUYXJnZXRFeHRlcm5hbFN5bWJvbCwgYW5kIFRhcmdldEdsb2JhbEFkZHJlc3MuCisgICAgICBXcmFwcGVyLAorCisgICAgICAvLy8gV3JhcHBlclJJUCAtIFNwZWNpYWwgd3JhcHBlciB1c2VkIHVuZGVyIFg4Ni02NCBQSUMgbW9kZSBmb3IgUklQCisgICAgICAvLy8gcmVsYXRpdmUgZGlzcGxhY2VtZW50cy4KKyAgICAgIFdyYXBwZXJSSVAsCisKKyAgICAgIC8vLyBNT1ZRMkRRIC0gQ29waWVzIGEgNjQtYml0IHZhbHVlIGZyb20gYSB2ZWN0b3IgdG8gYW5vdGhlciB2ZWN0b3IuCisgICAgICAvLy8gQ2FuIGJlIHVzZWQgdG8gbW92ZSBhIHZlY3RvciB2YWx1ZSBmcm9tIGEgTU1YIHJlZ2lzdGVyIHRvIGEgWE1NCisgICAgICAvLy8gcmVnaXN0ZXIuCisgICAgICBNT1ZRMkRRLAorCisgICAgICAvLy8gUEVYVFJCIC0gRXh0cmFjdCBhbiA4LWJpdCB2YWx1ZSBmcm9tIGEgdmVjdG9yIGFuZCB6ZXJvIGV4dGVuZCBpdCB0bworICAgICAgLy8vIGkzMiwgY29ycmVzcG9uZHMgdG8gWDg2OjpQRVhUUkIuCisgICAgICBQRVhUUkIsCisKKyAgICAgIC8vLyBQRVhUUlcgLSBFeHRyYWN0IGEgMTYtYml0IHZhbHVlIGZyb20gYSB2ZWN0b3IgYW5kIHplcm8gZXh0ZW5kIGl0IHRvCisgICAgICAvLy8gaTMyLCBjb3JyZXNwb25kcyB0byBYODY6OlBFWFRSVy4KKyAgICAgIFBFWFRSVywKKworICAgICAgLy8vIElOU0VSVFBTIC0gSW5zZXJ0IGFueSBlbGVtZW50IG9mIGEgNCB4IGZsb2F0IHZlY3RvciBpbnRvIGFueSBlbGVtZW50CisgICAgICAvLy8gb2YgYSBkZXN0aW5hdGlvbiA0IHggZmxvYXR2ZWN0b3IuCisgICAgICBJTlNFUlRQUywKKworICAgICAgLy8vIFBJTlNSQiAtIEluc2VydCB0aGUgbG93ZXIgOC1iaXRzIG9mIGEgMzItYml0IHZhbHVlIHRvIGEgdmVjdG9yLAorICAgICAgLy8vIGNvcnJlc3BvbmRzIHRvIFg4Njo6UElOU1JCLgorICAgICAgUElOU1JCLAorCisgICAgICAvLy8gUElOU1JXIC0gSW5zZXJ0IHRoZSBsb3dlciAxNi1iaXRzIG9mIGEgMzItYml0IHZhbHVlIHRvIGEgdmVjdG9yLAorICAgICAgLy8vIGNvcnJlc3BvbmRzIHRvIFg4Njo6UElOU1JXLgorICAgICAgUElOU1JXLCBNTVhfUElOU1JXLAorCisgICAgICAvLy8gUFNIVUZCIC0gU2h1ZmZsZSAxNiA4LWJpdCB2YWx1ZXMgd2l0aGluIGEgdmVjdG9yLgorICAgICAgUFNIVUZCLAorCisgICAgICAvLy8gRk1BWCwgRk1JTiAtIEZsb2F0aW5nIHBvaW50IG1heCBhbmQgbWluLgorICAgICAgLy8vCisgICAgICBGTUFYLCBGTUlOLAorCisgICAgICAvLy8gRlJTUVJULCBGUkNQIC0gRmxvYXRpbmcgcG9pbnQgcmVjaXByb2NhbC1zcXJ0IGFuZCByZWNpcHJvY2FsCisgICAgICAvLy8gYXBwcm94aW1hdGlvbi4gIE5vdGUgdGhhdCB0aGVzZSB0eXBpY2FsbHkgcmVxdWlyZSByZWZpbmVtZW50CisgICAgICAvLy8gaW4gb3JkZXIgdG8gb2J0YWluIHN1aXRhYmxlIHByZWNpc2lvbi4KKyAgICAgIEZSU1FSVCwgRlJDUCwKKworICAgICAgLy8gVExTQUREUiAtIFRocmVhZCBMb2NhbCBTdG9yYWdlLgorICAgICAgVExTQUREUiwKKyAgICAgIAorICAgICAgLy8gVExTQ0FMTCAtIFRocmVhZCBMb2NhbCBTdG9yYWdlLiAgV2hlbiBjYWxsaW5nIHRvIGFuIE9TIHByb3ZpZGVkCisgICAgICAvLyB0aHVuayBhdCB0aGUgYWRkcmVzcyBmcm9tIGFuIGVhcmxpZXIgcmVsb2NhdGlvbi4KKyAgICAgIFRMU0NBTEwsCisKKyAgICAgIC8vIFNlZ21lbnRCYXNlQWRkcmVzcyAtIFRoZSBhZGRyZXNzIHNlZ21lbnQ6MAorICAgICAgU2VnbWVudEJhc2VBZGRyZXNzLAorCisgICAgICAvLyBFSF9SRVRVUk4gLSBFeGNlcHRpb24gSGFuZGxpbmcgaGVscGVycy4KKyAgICAgIEVIX1JFVFVSTiwKKyAgICAgIAorICAgICAgLy8vIFRDX1JFVFVSTiAtIFRhaWwgY2FsbCByZXR1cm4uCisgICAgICAvLy8gICBvcGVyYW5kICMwIGNoYWluCisgICAgICAvLy8gICBvcGVyYW5kICMxIGNhbGxlZSAocmVnaXN0ZXIgb3IgYWJzb2x1dGUpCisgICAgICAvLy8gICBvcGVyYW5kICMyIHN0YWNrIGFkanVzdG1lbnQKKyAgICAgIC8vLyAgIG9wZXJhbmQgIzMgb3B0aW9uYWwgaW4gZmxhZworICAgICAgVENfUkVUVVJOLAorCisgICAgICAvLyBMQ01QWENIR19EQUcsIExDTVBYQ0hHOF9EQUcgLSBDb21wYXJlIGFuZCBzd2FwLgorICAgICAgTENNUFhDSEdfREFHLAorICAgICAgTENNUFhDSEc4X0RBRywKKworICAgICAgLy8gRk5TVENXMTZtIC0gU3RvcmUgRlAgY29udHJvbCB3b3JsZCBpbnRvIGkxNiBtZW1vcnkuCisgICAgICBGTlNUQ1cxNm0sCisKKyAgICAgIC8vIFZaRVhUX01PVkwgLSBWZWN0b3IgbW92ZSBsb3cgYW5kIHplcm8gZXh0ZW5kLgorICAgICAgVlpFWFRfTU9WTCwKKworICAgICAgLy8gVlpFWFRfTE9BRCAtIExvYWQsIHNjYWxhcl90b192ZWN0b3IsIGFuZCB6ZXJvIGV4dGVuZC4KKyAgICAgIFZaRVhUX0xPQUQsCisKKyAgICAgIC8vIFZTSEwsIFZTUkwgLSBWZWN0b3IgbG9naWNhbCBsZWZ0IC8gcmlnaHQgc2hpZnQuCisgICAgICBWU0hMLCBWU1JMLAorCisgICAgICAvLyBDTVBQRCwgQ01QUFMgLSBWZWN0b3IgZG91YmxlL2Zsb2F0IGNvbXBhcmlzb24uCisgICAgICAvLyBDTVBQRCwgQ01QUFMgLSBWZWN0b3IgZG91YmxlL2Zsb2F0IGNvbXBhcmlzb24uCisgICAgICBDTVBQRCwgQ01QUFMsCisgICAgICAKKyAgICAgIC8vIFBDTVAqIC0gVmVjdG9yIGludGVnZXIgY29tcGFyaXNvbnMuCisgICAgICBQQ01QRVFCLCBQQ01QRVFXLCBQQ01QRVFELCBQQ01QRVFRLAorICAgICAgUENNUEdUQiwgUENNUEdUVywgUENNUEdURCwgUENNUEdUUSwKKworICAgICAgLy8gQURELCBTVUIsIFNNVUwsIFVNVUwsIGV0Yy4gLSBBcml0aG1ldGljIG9wZXJhdGlvbnMgd2l0aCBGTEFHUyByZXN1bHRzLgorICAgICAgQURELCBTVUIsIFNNVUwsIFVNVUwsCisgICAgICBJTkMsIERFQywgT1IsIFhPUiwgQU5ELAorCisgICAgICAvLyBNVUxfSU1NIC0gWDg2IHNwZWNpZmljIG11bHRpcGx5IGJ5IGltbWVkaWF0ZS4KKyAgICAgIE1VTF9JTU0sCisgICAgICAKKyAgICAgIC8vIFBURVNUIC0gVmVjdG9yIGJpdHdpc2UgY29tcGFyaXNvbnMKKyAgICAgIFBURVNULAorCisgICAgICAvLyBURVNUUCAtIFZlY3RvciBwYWNrZWQgZnAgc2lnbiBiaXR3aXNlIGNvbXBhcmlzb25zCisgICAgICBURVNUUCwKKworICAgICAgLy8gVkFTVEFSVF9TQVZFX1hNTV9SRUdTIC0gU2F2ZSB4bW0gYXJndW1lbnQgcmVnaXN0ZXJzIHRvIHRoZSBzdGFjaywKKyAgICAgIC8vIGFjY29yZGluZyB0byAlYWwuIEFuIG9wZXJhdG9yIGlzIG5lZWRlZCBzbyB0aGF0IHRoaXMgY2FuIGJlIGV4cGFuZGVkCisgICAgICAvLyB3aXRoIGNvbnRyb2wgZmxvdy4KKyAgICAgIFZBU1RBUlRfU0FWRV9YTU1fUkVHUywKKworICAgICAgLy8gTUlOR1dfQUxMT0NBIC0gTWluZ1cncyBfX2FsbG9jYSBjYWxsIHRvIGRvIHN0YWNrIHByb2JpbmcuCisgICAgICBNSU5HV19BTExPQ0EsCisKKyAgICAgIC8vIEFUT01BREQ2NF9EQUcsIEFUT01TVUI2NF9EQUcsIEFUT01PUjY0X0RBRywgQVRPTUFORDY0X0RBRywgCisgICAgICAvLyBBVE9NWE9SNjRfREFHLCBBVE9NTkFORDY0X0RBRywgQVRPTVNXQVA2NF9EQUcgLSAKKyAgICAgIC8vIEF0b21pYyA2NC1iaXQgYmluYXJ5IG9wZXJhdGlvbnMuCisgICAgICBBVE9NQURENjRfREFHID0gSVNEOjpGSVJTVF9UQVJHRVRfTUVNT1JZX09QQ09ERSwKKyAgICAgIEFUT01TVUI2NF9EQUcsCisgICAgICBBVE9NT1I2NF9EQUcsCisgICAgICBBVE9NWE9SNjRfREFHLAorICAgICAgQVRPTUFORDY0X0RBRywKKyAgICAgIEFUT01OQU5ENjRfREFHLAorICAgICAgQVRPTVNXQVA2NF9EQUcsCisgICAgICAKKyAgICAgIC8vIE1lbW9yeSBiYXJyaWVyCisgICAgICBNRU1CQVJSSUVSLAorICAgICAgTUZFTkNFLAorICAgICAgU0ZFTkNFLAorICAgICAgTEZFTkNFCisKKyAgICAgIC8vIFdBUk5JTkc6IERvIG5vdCBhZGQgYW55dGhpbmcgaW4gdGhlIGVuZCB1bmxlc3MgeW91IHdhbnQgdGhlIG5vZGUgdG8KKyAgICAgIC8vIGhhdmUgbWVtb3AhIEluIGZhY3QsIHN0YXJ0aW5nIGZyb20gQVRPTUFERDY0X0RBRyBhbGwgb3Bjb2RlcyB3aWxsIGJlCisgICAgICAvLyB0aG91Z2h0IGFzIHRhcmdldCBtZW1vcnkgb3BzIQorICAgIH07CisgIH0KKworICAvLy8gRGVmaW5lIHNvbWUgcHJlZGljYXRlcyB0aGF0IGFyZSB1c2VkIGZvciBub2RlIG1hdGNoaW5nLgorICBuYW1lc3BhY2UgWDg2IHsKKyAgICAvLy8gaXNQU0hVRkRNYXNrIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBWRUNUT1JfU0hVRkZMRSBvcGVyYW5kCisgICAgLy8vIHNwZWNpZmllcyBhIHNodWZmbGUgb2YgZWxlbWVudHMgdGhhdCBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gUFNIVUZELgorICAgIGJvb2wgaXNQU0hVRkRNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pOworCisgICAgLy8vIGlzUFNIVUZIV01hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKyAgICAvLy8gc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0IGlzIHN1aXRhYmxlIGZvciBpbnB1dCB0byBQU0hVRkQuCisgICAgYm9vbCBpc1BTSFVGSFdNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pOworCisgICAgLy8vIGlzUFNIVUZMV01hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKyAgICAvLy8gc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0IGlzIHN1aXRhYmxlIGZvciBpbnB1dCB0byBQU0hVRkQuCisgICAgYm9vbCBpc1BTSFVGTFdNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pOworCisgICAgLy8vIGlzU0hVRlBNYXNrIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBWRUNUT1JfU0hVRkZMRSBvcGVyYW5kCisgICAgLy8vIHNwZWNpZmllcyBhIHNodWZmbGUgb2YgZWxlbWVudHMgdGhhdCBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gU0hVRlAqLgorICAgIGJvb2wgaXNTSFVGUE1hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTik7CisKKyAgICAvLy8gaXNNT1ZITFBTTWFzayAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgb3BlcmFuZAorICAgIC8vLyBzcGVjaWZpZXMgYSBzaHVmZmxlIG9mIGVsZW1lbnRzIHRoYXQgaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvIE1PVkhMUFMuCisgICAgYm9vbCBpc01PVkhMUFNNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pOworCisgICAgLy8vIGlzTU9WSExQU192X3VuZGVmX01hc2sgLSBTcGVjaWFsIGNhc2Ugb2YgaXNNT1ZITFBTTWFzayBmb3IgY2Fub25pY2FsIGZvcm0KKyAgICAvLy8gb2YgdmVjdG9yX3NodWZmbGUgdiwgdiwgPDIsIDMsIDIsIDM+LCBpLmUuIHZlY3Rvcl9zaHVmZmxlIHYsIHVuZGVmLAorICAgIC8vLyA8MiwgMywgMiwgMz4KKyAgICBib29sIGlzTU9WSExQU192X3VuZGVmX01hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTik7CisKKyAgICAvLy8gaXNNT1ZMUE1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKyAgICAvLy8gc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0IGlzIHN1aXRhYmxlIGZvciBNT1ZMUHtTfER9LgorICAgIGJvb2wgaXNNT1ZMUE1hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTik7CisKKyAgICAvLy8gaXNNT1ZIUE1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKyAgICAvLy8gc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0IGlzIHN1aXRhYmxlIGZvciBNT1ZIUHtTfER9LgorICAgIC8vLyBhcyB3ZWxsIGFzIE1PVkxIUFMuCisgICAgYm9vbCBpc01PVkxIUFNNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pOworCisgICAgLy8vIGlzVU5QQ0tMTWFzayAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgb3BlcmFuZAorICAgIC8vLyBzcGVjaWZpZXMgYSBzaHVmZmxlIG9mIGVsZW1lbnRzIHRoYXQgaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvIFVOUENLTC4KKyAgICBib29sIGlzVU5QQ0tMTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOLCBib29sIFYySXNTcGxhdCA9IGZhbHNlKTsKKworICAgIC8vLyBpc1VOUENLSE1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKyAgICAvLy8gc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0IGlzIHN1aXRhYmxlIGZvciBpbnB1dCB0byBVTlBDS0guCisgICAgYm9vbCBpc1VOUENLSE1hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTiwgYm9vbCBWMklzU3BsYXQgPSBmYWxzZSk7CisKKyAgICAvLy8gaXNVTlBDS0xfdl91bmRlZl9NYXNrIC0gU3BlY2lhbCBjYXNlIG9mIGlzVU5QQ0tMTWFzayBmb3IgY2Fub25pY2FsIGZvcm0KKyAgICAvLy8gb2YgdmVjdG9yX3NodWZmbGUgdiwgdiwgPDAsIDQsIDEsIDU+LCBpLmUuIHZlY3Rvcl9zaHVmZmxlIHYsIHVuZGVmLAorICAgIC8vLyA8MCwgMCwgMSwgMT4KKyAgICBib29sIGlzVU5QQ0tMX3ZfdW5kZWZfTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOKTsKKworICAgIC8vLyBpc1VOUENLSF92X3VuZGVmX01hc2sgLSBTcGVjaWFsIGNhc2Ugb2YgaXNVTlBDS0hNYXNrIGZvciBjYW5vbmljYWwgZm9ybQorICAgIC8vLyBvZiB2ZWN0b3Jfc2h1ZmZsZSB2LCB2LCA8MiwgNiwgMywgNz4sIGkuZS4gdmVjdG9yX3NodWZmbGUgdiwgdW5kZWYsCisgICAgLy8vIDwyLCAyLCAzLCAzPgorICAgIGJvb2wgaXNVTlBDS0hfdl91bmRlZl9NYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pOworCisgICAgLy8vIGlzTU9WTE1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKyAgICAvLy8gc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0IGlzIHN1aXRhYmxlIGZvciBpbnB1dCB0byBNT1ZTUywKKyAgICAvLy8gTU9WU0QsIGFuZCBNT1ZELCBpLmUuIHNldHRpbmcgdGhlIGxvd2VzdCBlbGVtZW50LgorICAgIGJvb2wgaXNNT1ZMTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOKTsKKworICAgIC8vLyBpc01PVlNIRFVQTWFzayAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgb3BlcmFuZAorICAgIC8vLyBzcGVjaWZpZXMgYSBzaHVmZmxlIG9mIGVsZW1lbnRzIHRoYXQgaXMgc3VpdGFibGUgZm9yIGlucHV0IHRvIE1PVlNIRFVQLgorICAgIGJvb2wgaXNNT1ZTSERVUE1hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTik7CisKKyAgICAvLy8gaXNNT1ZTTERVUE1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKyAgICAvLy8gc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0IGlzIHN1aXRhYmxlIGZvciBpbnB1dCB0byBNT1ZTTERVUC4KKyAgICBib29sIGlzTU9WU0xEVVBNYXNrKFNodWZmbGVWZWN0b3JTRE5vZGUgKk4pOworCisgICAgLy8vIGlzTU9WRERVUE1hc2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG9wZXJhbmQKKyAgICAvLy8gc3BlY2lmaWVzIGEgc2h1ZmZsZSBvZiBlbGVtZW50cyB0aGF0IGlzIHN1aXRhYmxlIGZvciBpbnB1dCB0byBNT1ZERFVQLgorICAgIGJvb2wgaXNNT1ZERFVQTWFzayhTaHVmZmxlVmVjdG9yU0ROb2RlICpOKTsKKworICAgIC8vLyBpc1BBTElHTlJNYXNrIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBWRUNUT1JfU0hVRkZMRSBvcGVyYW5kCisgICAgLy8vIHNwZWNpZmllcyBhIHNodWZmbGUgb2YgZWxlbWVudHMgdGhhdCBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gUEFMSUdOUi4KKyAgICBib29sIGlzUEFMSUdOUk1hc2soU2h1ZmZsZVZlY3RvclNETm9kZSAqTik7CisKKyAgICAvLy8gZ2V0U2h1ZmZsZVNIVUZJbW1lZGlhdGUgLSBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGltbWVkaWF0ZSB0byBzaHVmZmxlCisgICAgLy8vIHRoZSBzcGVjaWZpZWQgaXNTaHVmZmxlTWFzayBWRUNUT1JfU0hVRkZMRSBtYXNrIHdpdGggUFNIVUYqIGFuZCBTSFVGUCoKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zLgorICAgIHVuc2lnbmVkIGdldFNodWZmbGVTSFVGSW1tZWRpYXRlKFNETm9kZSAqTik7CisKKyAgICAvLy8gZ2V0U2h1ZmZsZVBTSFVGSFdJbW1lZGlhdGUgLSBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGltbWVkaWF0ZSB0byBzaHVmZmxlCisgICAgLy8vIHRoZSBzcGVjaWZpZWQgVkVDVE9SX1NIVUZGTEUgbWFzayB3aXRoIFBTSFVGSFcgaW5zdHJ1Y3Rpb24uCisgICAgdW5zaWduZWQgZ2V0U2h1ZmZsZVBTSFVGSFdJbW1lZGlhdGUoU0ROb2RlICpOKTsKKworICAgIC8vLyBnZXRTaHVmZmxlUFNIVUZMV0ltbWVkaWF0ZSAtIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW1tZWRpYXRlIHRvIHNodWZmbGUKKyAgICAvLy8gdGhlIHNwZWNpZmllZCBWRUNUT1JfU0hVRkZMRSBtYXNrIHdpdGggUFNIVUZMVyBpbnN0cnVjdGlvbi4KKyAgICB1bnNpZ25lZCBnZXRTaHVmZmxlUFNIVUZMV0ltbWVkaWF0ZShTRE5vZGUgKk4pOworCisgICAgLy8vIGdldFNodWZmbGVQQUxJR05SSW1tZWRpYXRlIC0gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBpbW1lZGlhdGUgdG8gc2h1ZmZsZQorICAgIC8vLyB0aGUgc3BlY2lmaWVkIFZFQ1RPUl9TSFVGRkxFIG1hc2sgd2l0aCB0aGUgUEFMSUdOUiBpbnN0cnVjdGlvbi4KKyAgICB1bnNpZ25lZCBnZXRTaHVmZmxlUEFMSUdOUkltbWVkaWF0ZShTRE5vZGUgKk4pOworCisgICAgLy8vIGlzWmVyb05vZGUgLSBSZXR1cm5zIHRydWUgaWYgRWx0IGlzIGEgY29uc3RhbnQgemVybyBvciBhIGZsb2F0aW5nIHBvaW50CisgICAgLy8vIGNvbnN0YW50ICswLjAuCisgICAgYm9vbCBpc1plcm9Ob2RlKFNEVmFsdWUgRWx0KTsKKworICAgIC8vLyBpc09mZnNldFN1aXRhYmxlRm9yQ29kZU1vZGVsIC0gUmV0dXJucyB0cnVlIG9mIHRoZSBnaXZlbiBvZmZzZXQgY2FuIGJlCisgICAgLy8vIGZpdCBpbnRvIGRpc3BsYWNlbWVudCBmaWVsZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgYm9vbCBpc09mZnNldFN1aXRhYmxlRm9yQ29kZU1vZGVsKGludDY0X3QgT2Zmc2V0LCBDb2RlTW9kZWw6Ok1vZGVsIE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzU3ltYm9saWNEaXNwbGFjZW1lbnQgPSB0cnVlKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyAgWDg2VGFyZ2V0TG93ZXJpbmcgLSBYODYgSW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldExvd2VyaW5nIGludGVyZmFjZQorICBjbGFzcyBYODZUYXJnZXRMb3dlcmluZyA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBYODZUYXJnZXRMb3dlcmluZyhYODZUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgICAvLy8gZ2V0UElDQmFzZVN5bWJvbCAtIFJldHVybiB0aGUgWDg2LTMyIFBJQyBiYXNlLgorICAgIE1DU3ltYm9sICpnZXRQSUNCYXNlU3ltYm9sKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYsIE1DQ29udGV4dCAmQ3R4KSBjb25zdDsKKyAgICAKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldEp1bXBUYWJsZUVuY29kaW5nKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGNvbnN0IE1DRXhwciAqCisgICAgTG93ZXJDdXN0b21KdW1wVGFibGVFbnRyeShjb25zdCBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqTUpUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIHVuc2lnbmVkIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSBjb25zdDsKKyAgICAKKyAgICAvLy8gZ2V0UElDSnVtcFRhYmxlUmVsb2NhQmFzZSAtIFJldHVybnMgcmVsb2NhdGlvbiBiYXNlIGZvciB0aGUgZ2l2ZW4gUElDCisgICAgLy8vIGp1bXB0YWJsZS4KKyAgICB2aXJ0dWFsIFNEVmFsdWUgZ2V0UElDSnVtcFRhYmxlUmVsb2NCYXNlKFNEVmFsdWUgVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKgorICAgIGdldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZUV4cHIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEpUSSwgTUNDb250ZXh0ICZDdHgpIGNvbnN0OworICAgIAorICAgIC8vLyBnZXRTdGFja1B0clJlZyAtIFJldHVybiB0aGUgc3RhY2sgcG9pbnRlciByZWdpc3RlciB3ZSBhcmUgdXNpbmc6IGVpdGhlcgorICAgIC8vLyBFU1Agb3IgUlNQLgorICAgIHVuc2lnbmVkIGdldFN0YWNrUHRyUmVnKCkgY29uc3QgeyByZXR1cm4gWDg2U3RhY2tQdHI7IH0KKworICAgIC8vLyBnZXRCeVZhbFR5cGVBbGlnbm1lbnQgLSBSZXR1cm4gdGhlIGRlc2lyZWQgYWxpZ25tZW50IGZvciBCeVZhbCBhZ2dyZWdhdGUKKyAgICAvLy8gZnVuY3Rpb24gYXJndW1lbnRzIGluIHRoZSBjYWxsZXIgcGFyYW1ldGVyIGFyZWEuIEZvciBYODYsIGFnZ3JlZ2F0ZXMKKyAgICAvLy8gdGhhdCBjb250YWlucyBhcmUgcGxhY2VkIGF0IDE2LWJ5dGUgYm91bmRhcmllcyB3aGlsZSB0aGUgcmVzdCBhcmUgYXQKKyAgICAvLy8gNC1ieXRlIGJvdW5kYXJpZXMuCisgICAgdmlydHVhbCB1bnNpZ25lZCBnZXRCeVZhbFR5cGVBbGlnbm1lbnQoY29uc3QgVHlwZSAqVHkpIGNvbnN0OworCisgICAgLy8vIGdldE9wdGltYWxNZW1PcFR5cGUgLSBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlY2lmaWMgb3B0aW1hbCB0eXBlIGZvciBsb2FkCisgICAgLy8vIGFuZCBzdG9yZSBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIG1lbXNldCwgbWVtY3B5LCBhbmQgbWVtbW92ZQorICAgIC8vLyBsb3dlcmluZy4gSWYgRHN0QWxpZ24gaXMgemVybyB0aGF0IG1lYW5zIGl0J3Mgc2FmZSB0byBkZXN0aW5hdGlvbgorICAgIC8vLyBhbGlnbm1lbnQgY2FuIHNhdGlzZnkgYW55IGNvbnN0cmFpbnQuIFNpbWlsYXJseSBpZiBTcmNBbGlnbiBpcyB6ZXJvIGl0CisgICAgLy8vIG1lYW5zIHRoZXJlIGlzbid0IGEgbmVlZCB0byBjaGVjayBpdCBhZ2FpbnN0IGFsaWdubWVudCByZXF1aXJlbWVudCwKKyAgICAvLy8gcHJvYmFibHkgYmVjYXVzZSB0aGUgc291cmNlIGRvZXMgbm90IG5lZWQgdG8gYmUgbG9hZGVkLiBJZgorICAgIC8vLyAnTm9uU2NhbGFySW50U2FmZScgaXMgdHJ1ZSwgdGhhdCBtZWFucyBpdCdzIHNhZmUgdG8gcmV0dXJuIGEKKyAgICAvLy8gbm9uLXNjYWxhci1pbnRlZ2VyIHR5cGUsIGUuZy4gZW1wdHkgc3RyaW5nIHNvdXJjZSwgY29uc3RhbnQsIG9yIGxvYWRlZAorICAgIC8vLyBmcm9tIG1lbW9yeS4gJ01lbWNweVN0clNyYycgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1lbWNweSBzb3VyY2UgaXMKKyAgICAvLy8gY29uc3RhbnQgc28gaXQgZG9lcyBub3QgbmVlZCB0byBiZSBsb2FkZWQuCisgICAgLy8vIEl0IHJldHVybnMgRVZUOjpPdGhlciBpZiB0aGUgdHlwZSBzaG91bGQgYmUgZGV0ZXJtaW5lZCB1c2luZyBnZW5lcmljCisgICAgLy8vIHRhcmdldC1pbmRlcGVuZGVudCBsb2dpYy4KKyAgICB2aXJ0dWFsIEVWVAorICAgIGdldE9wdGltYWxNZW1PcFR5cGUodWludDY0X3QgU2l6ZSwgdW5zaWduZWQgRHN0QWxpZ24sIHVuc2lnbmVkIFNyY0FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb25TY2FsYXJJbnRTYWZlLCBib29sIE1lbWNweVN0clNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgICAgLy8vIGFsbG93c1VuYWxpZ25lZE1lbW9yeUFjY2Vzc2VzIC0gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgYWxsb3dzCisgICAgLy8vIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMuIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICB2aXJ0dWFsIGJvb2wgYWxsb3dzVW5hbGlnbmVkTWVtb3J5QWNjZXNzZXMoRVZUIFZUKSBjb25zdCB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLy8gTG93ZXJPcGVyYXRpb24gLSBQcm92aWRlIGN1c3RvbSBsb3dlcmluZyBob29rcyBmb3Igc29tZSBvcGVyYXRpb25zLgorICAgIC8vLworICAgIHZpcnR1YWwgU0RWYWx1ZSBMb3dlck9wZXJhdGlvbihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLy8gUmVwbGFjZU5vZGVSZXN1bHRzIC0gUmVwbGFjZSB0aGUgcmVzdWx0cyBvZiBub2RlIHdpdGggYW4gaWxsZWdhbCByZXN1bHQKKyAgICAvLy8gdHlwZSB3aXRoIG5ldyB2YWx1ZXMgYnVpbHQgb3V0IG9mIGN1c3RvbSBjb2RlLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBSZXBsYWNlTm9kZVJlc3VsdHMoU0ROb2RlICpOLCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4mUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIAorICAgIHZpcnR1YWwgU0RWYWx1ZSBQZXJmb3JtREFHQ29tYmluZShTRE5vZGUgKk4sIERBR0NvbWJpbmVySW5mbyAmRENJKSBjb25zdDsKKworICAgIC8vLyBpc1R5cGVEZXNpcmFibGVGb3JPcCAtIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaGFzIG5hdGl2ZSBzdXBwb3J0IGZvcgorICAgIC8vLyB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUgYW5kIGl0IGlzICdkZXNpcmFibGUnIHRvIHVzZSB0aGUgdHlwZSBmb3IgdGhlCisgICAgLy8vIGdpdmVuIG5vZGUgdHlwZS4gZS5nLiBPbiB4ODYgaTE2IGlzIGxlZ2FsLCBidXQgdW5kZXNpcmFibGUgc2luY2UgaTE2CisgICAgLy8vIGluc3RydWN0aW9uIGVuY29kaW5ncyBhcmUgbG9uZ2VyIGFuZCBzb21lIGkxNiBpbnN0cnVjdGlvbnMgYXJlIHNsb3cuCisgICAgdmlydHVhbCBib29sIGlzVHlwZURlc2lyYWJsZUZvck9wKHVuc2lnbmVkIE9wYywgRVZUIFZUKSBjb25zdDsKKworICAgIC8vLyBpc1R5cGVEZXNpcmFibGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGhhcyBuYXRpdmUgc3VwcG9ydCBmb3IgdGhlCisgICAgLy8vIHNwZWNpZmllZCB2YWx1ZSB0eXBlIGFuZCBpdCBpcyAnZGVzaXJhYmxlJyB0byB1c2UgdGhlIHR5cGUuIGUuZy4gT24geDg2CisgICAgLy8vIGkxNiBpcyBsZWdhbCwgYnV0IHVuZGVzaXJhYmxlIHNpbmNlIGkxNiBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgYXJlIGxvbmdlcgorICAgIC8vLyBhbmQgc29tZSBpMTYgaW5zdHJ1Y3Rpb25zIGFyZSBzbG93LgorICAgIHZpcnR1YWwgYm9vbCBJc0Rlc2lyYWJsZVRvUHJvbW90ZU9wKFNEVmFsdWUgT3AsIEVWVCAmUFZUKSBjb25zdDsKKworICAgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2sgKgorICAgICAgRW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAKKyAgICAvLy8gZ2V0VGFyZ2V0Tm9kZU5hbWUgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIGEgdGFyZ2V0IHNwZWNpZmljCisgICAgLy8vIERBRyBub2RlLgorICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0VGFyZ2V0Tm9kZU5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdDsKKworICAgIC8vLyBnZXRTZXRDQ1Jlc3VsdFR5cGUgLSBSZXR1cm4gdGhlIElTRDo6U0VUQ0MgVmFsdWVUeXBlCisgICAgdmlydHVhbCBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBnZXRTZXRDQ1Jlc3VsdFR5cGUoRVZUIFZUKSBjb25zdDsKKworICAgIC8vLyBjb21wdXRlTWFza2VkQml0c0ZvclRhcmdldE5vZGUgLSBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGJpdHMgc3BlY2lmaWVkIAorICAgIC8vLyBpbiBNYXNrIGFyZSBrbm93biB0byBiZSBlaXRoZXIgemVybyBvciBvbmUgYW5kIHJldHVybiB0aGVtIGluIHRoZSAKKyAgICAvLy8gS25vd25aZXJvL0tub3duT25lIGJpdHNldHMuCisgICAgdmlydHVhbCB2b2lkIGNvbXB1dGVNYXNrZWRCaXRzRm9yVGFyZ2V0Tm9kZShjb25zdCBTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25aZXJvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbAorICAgIGlzR0FQbHVzT2Zmc2V0KFNETm9kZSAqTiwgY29uc3QgR2xvYmFsVmFsdWUqICZHQSwgaW50NjRfdCAmT2Zmc2V0KSBjb25zdDsKKyAgICAKKyAgICBTRFZhbHVlIGdldFJldHVybkFkZHJlc3NGcmFtZUluZGV4KFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBFeHBhbmRJbmxpbmVBc20oQ2FsbEluc3QgKkNJKSBjb25zdDsKKyAgICAKKyAgICBDb25zdHJhaW50VHlwZSBnZXRDb25zdHJhaW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCkgY29uc3Q7CisgICAgIAorICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAKKyAgICAgIGdldFJlZ0NsYXNzRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBzdGQ6OnN0cmluZyAmQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0OworCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpMb3dlclhDb25zdHJhaW50KEVWVCBDb25zdHJhaW50VlQpIGNvbnN0OworCisgICAgLy8vIExvd2VyQXNtT3BlcmFuZEZvckNvbnN0cmFpbnQgLSBMb3dlciB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgaW50byB0aGUgT3BzCisgICAgLy8vIHZlY3Rvci4gIElmIGl0IGlzIGludmFsaWQsIGRvbid0IGFkZCBhbnl0aGluZyB0byBPcHMuIElmIGhhc01lbW9yeSBpcworICAgIC8vLyB0cnVlIGl0IG1lYW5zIG9uZSBvZiB0aGUgYXNtIGNvbnN0cmFpbnQgb2YgdGhlIGlubGluZSBhc20gaW5zdHJ1Y3Rpb24KKyAgICAvLy8gYmVpbmcgcHJvY2Vzc2VkIGlzICdtJy4KKyAgICB2aXJ0dWFsIHZvaWQgTG93ZXJBc21PcGVyYW5kRm9yQ29uc3RyYWludChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgQ29uc3RyYWludExldHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICAKKyAgICAvLy8gZ2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludCAtIEdpdmVuIGEgcGh5c2ljYWwgcmVnaXN0ZXIgY29uc3RyYWludAorICAgIC8vLyAoZS5nLiB7ZWR4fSksIHJldHVybiB0aGUgcmVnaXN0ZXIgbnVtYmVyIGFuZCB0aGUgcmVnaXN0ZXIgY2xhc3MgZm9yIHRoZQorICAgIC8vLyByZWdpc3Rlci4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgQ19SZWdpc3RlciBjb25zdHJhaW50cy4gIE9uCisgICAgLy8vIGVycm9yLCB0aGlzIHJldHVybnMgYSByZWdpc3RlciBudW1iZXIgb2YgMC4KKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqPiAKKyAgICAgIGdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3Q7CisgICAgCisgICAgLy8vIGlzTGVnYWxBZGRyZXNzaW5nTW9kZSAtIFJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzaW5nIG1vZGUgcmVwcmVzZW50ZWQKKyAgICAvLy8gYnkgQU0gaXMgbGVnYWwgZm9yIHRoaXMgdGFyZ2V0LCBmb3IgYSBsb2FkL3N0b3JlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMZWdhbEFkZHJlc3NpbmdNb2RlKGNvbnN0IEFkZHJNb2RlICZBTSwgY29uc3QgVHlwZSAqVHkpY29uc3Q7CisKKyAgICAvLy8gaXNUcnVuY2F0ZUZyZWUgLSBSZXR1cm4gdHJ1ZSBpZiBpdCdzIGZyZWUgdG8gdHJ1bmNhdGUgYSB2YWx1ZSBvZgorICAgIC8vLyB0eXBlIFR5MSB0byB0eXBlIFR5Mi4gZS5nLiBPbiB4ODYgaXQncyBmcmVlIHRvIHRydW5jYXRlIGEgaTMyIHZhbHVlIGluCisgICAgLy8vIHJlZ2lzdGVyIEVBWCB0byBpMTYgYnkgcmVmZXJlbmNpbmcgaXRzIHN1Yi1yZWdpc3RlciBBWC4KKyAgICB2aXJ0dWFsIGJvb2wgaXNUcnVuY2F0ZUZyZWUoY29uc3QgVHlwZSAqVHkxLCBjb25zdCBUeXBlICpUeTIpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc1RydW5jYXRlRnJlZShFVlQgVlQxLCBFVlQgVlQyKSBjb25zdDsKKworICAgIC8vLyBpc1pFeHRGcmVlIC0gUmV0dXJuIHRydWUgaWYgYW55IGFjdHVhbCBpbnN0cnVjdGlvbiB0aGF0IGRlZmluZXMgYQorICAgIC8vLyB2YWx1ZSBvZiB0eXBlIFR5MSBpbXBsaWNpdCB6ZXJvLWV4dGVuZHMgdGhlIHZhbHVlIHRvIFR5MiBpbiB0aGUgcmVzdWx0CisgICAgLy8vIHJlZ2lzdGVyLiBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGluY2x1ZGUgcmVnaXN0ZXJzIGRlZmluZWQgaW4KKyAgICAvLy8gdW5rbm93biB3YXlzLCBzdWNoIGFzIGluY29taW5nIGFyZ3VtZW50cywgb3IgY29waWVzIGZyb20gdW5rbm93bgorICAgIC8vLyB2aXJ0dWFsIHJlZ2lzdGVycy4gQWxzbywgaWYgaXNUcnVuY2F0ZUZyZWUoVHkyLCBUeTEpIGlzIHRydWUsIHRoaXMKKyAgICAvLy8gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gdHJ1bmNhdGUgaW5zdHJ1Y3Rpb25zLiBlLmcuIG9uIHg4Ni02NCwKKyAgICAvLy8gYWxsIGluc3RydWN0aW9ucyB0aGF0IGRlZmluZSAzMi1iaXQgdmFsdWVzIGltcGxpY2l0IHplcm8tZXh0ZW5kIHRoZQorICAgIC8vLyByZXN1bHQgb3V0IHRvIDY0IGJpdHMuCisgICAgdmlydHVhbCBib29sIGlzWkV4dEZyZWUoY29uc3QgVHlwZSAqVHkxLCBjb25zdCBUeXBlICpUeTIpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc1pFeHRGcmVlKEVWVCBWVDEsIEVWVCBWVDIpIGNvbnN0OworCisgICAgLy8vIGlzTmFycm93aW5nUHJvZml0YWJsZSAtIFJldHVybiB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byBuYXJyb3cKKyAgICAvLy8gb3BlcmF0aW9ucyBvZiB0eXBlIFZUMSB0byBWVDIuIGUuZy4gb24geDg2LCBpdCdzIHByb2ZpdGFibGUgdG8gbmFycm93CisgICAgLy8vIGZyb20gaTMyIHRvIGk4IGJ1dCBub3QgZnJvbSBpMzIgdG8gaTE2LgorICAgIHZpcnR1YWwgYm9vbCBpc05hcnJvd2luZ1Byb2ZpdGFibGUoRVZUIFZUMSwgRVZUIFZUMikgY29uc3Q7CisKKyAgICAvLy8gaXNGUEltbUxlZ2FsIC0gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgY2FuIGluc3RydWN0aW9uIHNlbGVjdCB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIEZQIGltbWVkaWF0ZSBuYXRpdmVseS4gSWYgZmFsc2UsIHRoZSBsZWdhbGl6ZXIgd2lsbAorICAgIC8vLyBtYXRlcmlhbGl6ZSB0aGUgRlAgaW1tZWRpYXRlIGFzIGEgbG9hZCBmcm9tIGEgY29uc3RhbnQgcG9vbC4KKyAgICB2aXJ0dWFsIGJvb2wgaXNGUEltbUxlZ2FsKGNvbnN0IEFQRmxvYXQgJkltbSwgRVZUIFZUKSBjb25zdDsKKworICAgIC8vLyBpc1NodWZmbGVNYXNrTGVnYWwgLSBUYXJnZXRzIGNhbiB1c2UgdGhpcyB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgb25seQorICAgIC8vLyBzdXBwb3J0ICpzb21lKiBWRUNUT1JfU0hVRkZMRSBvcGVyYXRpb25zLCB0aG9zZSB3aXRoIHNwZWNpZmljIG1hc2tzLgorICAgIC8vLyBCeSBkZWZhdWx0LCBpZiBhIHRhcmdldCBzdXBwb3J0cyB0aGUgVkVDVE9SX1NIVUZGTEUgbm9kZSwgYWxsIG1hc2sKKyAgICAvLy8gdmFsdWVzIGFyZSBhc3N1bWVkIHRvIGJlIGxlZ2FsLgorICAgIHZpcnR1YWwgYm9vbCBpc1NodWZmbGVNYXNrTGVnYWwoY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0OworCisgICAgLy8vIGlzVmVjdG9yQ2xlYXJNYXNrTGVnYWwgLSBTaW1pbGFyIHRvIGlzU2h1ZmZsZU1hc2tMZWdhbC4gVGhpcyBpcworICAgIC8vLyB1c2VkIGJ5IFRhcmdldHMgY2FuIHVzZSB0aGlzIHRvIGluZGljYXRlIGlmIHRoZXJlIGlzIGEgc3VpdGFibGUKKyAgICAvLy8gVkVDVE9SX1NIVUZGTEUgdGhhdCBjYW4gYmUgdXNlZCB0byByZXBsYWNlIGEgVkFORCB3aXRoIGEgY29uc3RhbnQKKyAgICAvLy8gcG9vbCBlbnRyeS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNWZWN0b3JDbGVhck1hc2tMZWdhbChjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0OworCisgICAgLy8vIFNob3VsZFNocmlua0ZQQ29uc3RhbnQgLSBJZiB0cnVlLCB0aGVuIGluc3RydWN0aW9uIHNlbGVjdGlvbiBzaG91bGQKKyAgICAvLy8gc2VlayB0byBzaHJpbmsgdGhlIEZQIGNvbnN0YW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0byBhIHNtYWxsZXIgdHlwZQorICAgIC8vLyBpbiBvcmRlciB0byBzYXZlIHNwYWNlIGFuZCAvIG9yIHJlZHVjZSBydW50aW1lLgorICAgIHZpcnR1YWwgYm9vbCBTaG91bGRTaHJpbmtGUENvbnN0YW50KEVWVCBWVCkgY29uc3QgeworICAgICAgLy8gRG9uJ3Qgc2hyaW5rIEZQIGNvbnN0cG9vbCBpZiBTU0UyIGlzIGF2YWlsYWJsZSBzaW5jZSBjdnRzczJzZCBpcyBtb3JlCisgICAgICAvLyBleHBlbnNpdmUgdGhhbiBhIHN0cmFpZ2h0IG1vdnNkLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQncyBpbXBvcnRhbnQgdG8KKyAgICAgIC8vIHNocmluayBsb25nIGRvdWJsZSBmcCBjb25zdGFudCBzaW5jZSBmbGR0IGlzIHZlcnkgc2xvdy4KKyAgICAgIHJldHVybiAhWDg2U2NhbGFyU1NFZjY0IHx8IFZUID09IE1WVDo6ZjgwOworICAgIH0KKyAgICAKKyAgICBjb25zdCBYODZTdWJ0YXJnZXQqIGdldFN1YnRhcmdldCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdWJ0YXJnZXQ7CisgICAgfQorCisgICAgLy8vIGlzU2NhbGFyRlBUeXBlSW5TU0VSZWcgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHNjYWxhciBGUCB0eXBlIGlzCisgICAgLy8vIGNvbXB1dGVkIGluIGFuIFNTRSByZWdpc3Rlciwgbm90IG9uIHRoZSBYODcgZmxvYXRpbmcgcG9pbnQgc3RhY2suCisgICAgYm9vbCBpc1NjYWxhckZQVHlwZUluU1NFUmVnKEVWVCBWVCkgY29uc3QgeworICAgICAgcmV0dXJuIChWVCA9PSBNVlQ6OmY2NCAmJiBYODZTY2FsYXJTU0VmNjQpIHx8IC8vIGY2NCBpcyB3aGVuIFNTRTIKKyAgICAgIChWVCA9PSBNVlQ6OmYzMiAmJiBYODZTY2FsYXJTU0VmMzIpOyAgIC8vIGYzMiBpcyB3aGVuIFNTRTEKKyAgICB9CisJCisgICAgLy8vIGdldEZ1bmN0aW9uQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBMb2cyIGFsaWdubWVudCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RnVuY3Rpb25BbGlnbm1lbnQoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0OworCisgICAgdW5zaWduZWQgZ2V0UmVnUHJlc3N1cmVMaW1pdChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgICAgLy8vIGdldFN0YWNrQ29va2llTG9jYXRpb24gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHN0b3JlcyBzdGFjaworICAgIC8vLyBwcm90ZWN0b3IgY29va2llcyBhdCBhIGZpeGVkIG9mZnNldCBpbiBzb21lIG5vbi1zdGFuZGFyZCBhZGRyZXNzCisgICAgLy8vIHNwYWNlLCBhbmQgcG9wdWxhdGVzIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCBvZmZzZXQgYXMKKyAgICAvLy8gYXBwcm9wcmlhdGUuCisgICAgdmlydHVhbCBib29sIGdldFN0YWNrQ29va2llTG9jYXRpb24odW5zaWduZWQgJkFkZHJlc3NTcGFjZSwgdW5zaWduZWQgJk9mZnNldCkgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorICAgIHN0ZDo6cGFpcjxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiwgdWludDhfdD4KKyAgICBmaW5kUmVwcmVzZW50YXRpdmVDbGFzcyhFVlQgVlQpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgLy8vIFN1YnRhcmdldCAtIEtlZXAgYSBwb2ludGVyIHRvIHRoZSBYODZTdWJ0YXJnZXQgYXJvdW5kIHNvIHRoYXQgd2UgY2FuCisgICAgLy8vIG1ha2UgdGhlIHJpZ2h0IGRlY2lzaW9uIHdoZW4gZ2VuZXJhdGluZyBjb2RlIGZvciBkaWZmZXJlbnQgdGFyZ2V0cy4KKyAgICBjb25zdCBYODZTdWJ0YXJnZXQgKlN1YnRhcmdldDsKKyAgICBjb25zdCBYODZSZWdpc3RlckluZm8gKlJlZ0luZm87CisgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQ7CisKKyAgICAvLy8gWDg2U3RhY2tQdHIgLSBYODYgcGh5c2ljYWwgcmVnaXN0ZXIgdXNlZCBhcyBzdGFjayBwdHIuCisgICAgdW5zaWduZWQgWDg2U3RhY2tQdHI7CisgICAKKyAgICAvLy8gWDg2U2NhbGFyU1NFZjMyLCBYODZTY2FsYXJTU0VmNjQgLSBTZWxlY3QgYmV0d2VlbiBTU0Ugb3IgeDg3IAorICAgIC8vLyBmbG9hdGluZyBwb2ludCBvcHMuCisgICAgLy8vIFdoZW4gU1NFIGlzIGF2YWlsYWJsZSwgdXNlIGl0IGZvciBmMzIgb3BlcmF0aW9ucy4KKyAgICAvLy8gV2hlbiBTU0UyIGlzIGF2YWlsYWJsZSwgdXNlIGl0IGZvciBmNjQgb3BlcmF0aW9ucy4KKyAgICBib29sIFg4NlNjYWxhclNTRWYzMjsKKyAgICBib29sIFg4NlNjYWxhclNTRWY2NDsKKworICAgIC8vLyBMZWdhbEZQSW1tZWRpYXRlcyAtIEEgbGlzdCBvZiBsZWdhbCBmcCBpbW1lZGlhdGVzLgorICAgIHN0ZDo6dmVjdG9yPEFQRmxvYXQ+IExlZ2FsRlBJbW1lZGlhdGVzOworCisgICAgLy8vIGFkZExlZ2FsRlBJbW1lZGlhdGUgLSBJbmRpY2F0ZSB0aGF0IHRoaXMgeDg2IHRhcmdldCBjYW4gaW5zdHJ1Y3Rpb24KKyAgICAvLy8gc2VsZWN0IHRoZSBzcGVjaWZpZWQgRlAgaW1tZWRpYXRlIG5hdGl2ZWx5LgorICAgIHZvaWQgYWRkTGVnYWxGUEltbWVkaWF0ZShjb25zdCBBUEZsb2F0JiBJbW0pIHsKKyAgICAgIExlZ2FsRlBJbW1lZGlhdGVzLnB1c2hfYmFjayhJbW0pOworICAgIH0KKworICAgIFNEVmFsdWUgTG93ZXJDYWxsUmVzdWx0KFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgSW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJNZW1Bcmd1bWVudChTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmQXJnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDQ1ZhbEFzc2lnbiAmVkEsICBNYWNoaW5lRnJhbWVJbmZvICpNRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyTWVtT3BDYWxsVG8oU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBTdGFja1B0ciwgU0RWYWx1ZSBBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0NWYWxBc3NpZ24gJlZBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MpIGNvbnN0OworCisgICAgLy8gQ2FsbCBsb3dlcmluZyBoZWxwZXJzLgorCisgICAgLy8vIElzRWxpZ2libGVGb3JUYWlsQ2FsbE9wdGltaXphdGlvbiAtIENoZWNrIHdoZXRoZXIgdGhlIGNhbGwgaXMgZWxpZ2libGUKKyAgICAvLy8gZm9yIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24uIFRhcmdldHMgd2hpY2ggd2FudCB0byBkbyB0YWlsIGNhbGwKKyAgICAvLy8gb3B0aW1pemF0aW9uIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICBib29sIElzRWxpZ2libGVGb3JUYWlsQ2FsbE9wdGltaXphdGlvbihTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbGVlQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ2FsbGVlU3RydWN0UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNDYWxsZXJTdHJ1Y3RSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHJiBEQUcpIGNvbnN0OworICAgIGJvb2wgSXNDYWxsZWVQb3AoYm9vbCBpc1ZhckFyZywgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252KSBjb25zdDsKKyAgICBTRFZhbHVlIEVtaXRUYWlsQ2FsbExvYWRSZXRBZGRyKFNlbGVjdGlvbkRBRyAmREFHLCBTRFZhbHVlICZPdXRSZXRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBib29sIElzVGFpbENhbGwsIGJvb2wgSXM2NEJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZQRGlmZiwgRGVidWdMb2MgZGwpIGNvbnN0OworCisgICAgQ0NBc3NpZ25GbiAqQ0NBc3NpZ25GbkZvck5vZGUoQ2FsbGluZ0NvbnY6OklEIENhbGxDb252KSBjb25zdDsKKyAgICB1bnNpZ25lZCBHZXRBbGlnbmVkQXJndW1lbnRTdGFja1NpemUodW5zaWduZWQgU3RhY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICBzdGQ6OnBhaXI8U0RWYWx1ZSxTRFZhbHVlPiBGUF9UT19JTlRIZWxwZXIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTaWduZWQpIGNvbnN0OworCisgICAgU0RWYWx1ZSBMb3dlckFzU3BsYXRWZWN0b3JMb2FkKFNEVmFsdWUgU3JjT3AsIEVWVCBWVCwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyQlVJTERfVkVDVE9SKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyQ09OQ0FUX1ZFQ1RPUlMoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJWRUNUT1JfU0hVRkZMRShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckVYVFJBQ1RfVkVDVE9SX0VMVChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckVYVFJBQ1RfVkVDVE9SX0VMVF9TU0U0KFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VySU5TRVJUX1ZFQ1RPUl9FTFQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJJTlNFUlRfVkVDVE9SX0VMVF9TU0U0KFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU0NBTEFSX1RPX1ZFQ1RPUihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckNvbnN0YW50UG9vbChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckJsb2NrQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckdsb2JhbEFkZHJlc3MoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJHbG9iYWxBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyR2xvYmFsVExTQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckV4dGVybmFsU3ltYm9sKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU2hpZnQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgQnVpbGRGSUxEKFNEVmFsdWUgT3AsIEVWVCBTcmNWVCwgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBTdGFja1Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJCSVRfQ09OVkVSVChTRFZhbHVlIG9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclNJTlRfVE9fRlAoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJVSU5UX1RPX0ZQKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyVUlOVF9UT19GUF9pNjQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJVSU5UX1RPX0ZQX2kzMihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckZQX1RPX1NJTlQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJGUF9UT19VSU5UKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRkFCUyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckZORUcoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJGQ09QWVNJR04oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJUb0JUKFNEVmFsdWUgQW5kLCBJU0Q6OkNvbmRDb2RlIENDLAorICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclNFVENDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyVlNFVENDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU0VMRUNUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyQlJDT05EKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyTUVNU0VUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VySnVtcFRhYmxlKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRFlOQU1JQ19TVEFDS0FMTE9DKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyVkFTVEFSVChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclZBQVJHKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyVkFDT1BZKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VySU5UUklOU0lDX1dPX0NIQUlOKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyUkVUVVJOQUREUihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckZSQU1FQUREUihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckZSQU1FX1RPX0FSR1NfT0ZGU0VUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRUhfUkVUVVJOKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyVFJBTVBPTElORShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckZMVF9ST1VORFNfKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyQ1RMWihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckNUVFooU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJNVUxfVjJJNjQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJTSEwoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJYQUxVTyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICBTRFZhbHVlIExvd2VyQ01QX1NXQVAoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJMT0FEX1NVQihTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlclJFQURDWUNMRUNPVU5URVIoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJNRU1CQVJSSUVSKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJGb3JtYWxBcmd1bWVudHMoU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworICAgIHZpcnR1YWwgU0RWYWx1ZQorICAgICAgTG93ZXJDYWxsKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wKKyAgICAgIENhbkxvd2VyUmV0dXJuKENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7CisKKyAgICB2b2lkIFJlcGxhY2VBVE9NSUNfQklOQVJZXzY0KFNETm9kZSAqTiwgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIHVuc2lnbmVkIE5ld09wKSBjb25zdDsKKworICAgIC8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVtaXQgc3RyaW5nIHByb2Nlc3Npbmcgc3NlNC4yIGluc3RydWN0aW9ucworICAgIC8vLyB0aGF0IHJldHVybiBpbiB4bW0wLgorICAgIC8vLyBUaGlzIHRha2VzIHRoZSBpbnN0cnVjdGlvbiB0byBleHBhbmQsIHRoZSBhc3NvY2lhdGVkIG1hY2hpbmUgYmFzaWMKKyAgICAvLy8gYmxvY2ssIHRoZSBudW1iZXIgb2YgYXJncywgYW5kIHdoZXRoZXIgb3Igbm90IHRoZSBzZWNvbmQgYXJnIGlzCisgICAgLy8vIGluIG1lbW9yeSBvciBub3QuCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkVtaXRQQ01QKE1hY2hpbmVJbnN0ciAqQkluc3RyLCBNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFyZ051bSwgYm9vbCBpbk1lbSkgY29uc3Q7CisKKyAgICAvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBlbWl0IGF0b21pYyBiaXR3aXNlIG9wZXJhdGlvbnMgKGFuZCwgb3IsIHhvcikuCisgICAgLy8vIEl0IHRha2VzIHRoZSBiaXR3aXNlIGluc3RydWN0aW9uIHRvIGV4cGFuZCwgdGhlIGFzc29jaWF0ZWQgbWFjaGluZSBiYXNpYworICAgIC8vLyBibG9jaywgYW5kIHRoZSBhc3NvY2lhdGVkIFg4NiBvcGNvZGVzIGZvciByZWcvcmVnIGFuZCByZWcvaW1tLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpFbWl0QXRvbWljQml0d2lzZVdpdGhDdXN0b21JbnNlcnRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKkJJbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVnT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGltbU9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb2FkT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGN4Y2hnT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5vdE9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFQVhyZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnZTcmMgPSBmYWxzZSkgY29uc3Q7CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRW1pdEF0b21pY0JpdDY0MzJXaXRoQ3VzdG9tSW5zZXJ0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpCSW5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlZ09wY0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVnT3BjSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbW1PcGNMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGltbU9wY0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnZTcmMgPSBmYWxzZSkgY29uc3Q7CisgICAgCisgICAgLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW1pdCBhdG9taWMgbWluIGFuZCBtYXguICBJdCB0YWtlcyB0aGUgbWluL21heAorICAgIC8vLyBpbnN0cnVjdGlvbiB0byBleHBhbmQsIHRoZSBhc3NvY2lhdGVkIGJhc2ljIGJsb2NrLCBhbmQgdGhlIGFzc29jaWF0ZWQKKyAgICAvLy8gY21vdiBvcGNvZGUgZm9yIG1vdmluZyB0aGUgbWluIG9yIG1heCB2YWx1ZS4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRW1pdEF0b21pY01pbk1heFdpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKkJJbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNtb3ZPcGMpIGNvbnN0OworCisgICAgLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW1pdCB0aGUgeG1tIHJlZyBzYXZlIHBvcnRpb24gb2YgdmFfc3RhcnQuCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkVtaXRWQVN0YXJ0U2F2ZVhNTVJlZ3NXaXRoQ3VzdG9tSW5zZXJ0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKkJJbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRW1pdExvd2VyZWRTZWxlY3QoTWFjaGluZUluc3RyICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkVtaXRMb3dlcmVkTWluZ3dBbGxvY2EoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0OworICAgIAorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpFbWl0TG93ZXJlZFRMU0NhbGwoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgICAvLy8gRW1pdCBub2RlcyB0aGF0IHdpbGwgYmUgc2VsZWN0ZWQgYXMgInRlc3QgT3AwLE9wMCIsIG9yIHNvbWV0aGluZworICAgIC8vLyBlcXVpdmFsZW50LCBmb3IgdXNlIHdpdGggdGhlIGdpdmVuIHg4NiBjb25kaXRpb24gY29kZS4KKyAgICBTRFZhbHVlIEVtaXRUZXN0KFNEVmFsdWUgT3AwLCB1bnNpZ25lZCBYODZDQywgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgLy8vIEVtaXQgbm9kZXMgdGhhdCB3aWxsIGJlIHNlbGVjdGVkIGFzICJjbXAgT3AwLE9wMSIsIG9yIHNvbWV0aGluZworICAgIC8vLyBlcXVpdmFsZW50LCBmb3IgdXNlIHdpdGggdGhlIGdpdmVuIHg4NiBjb25kaXRpb24gY29kZS4KKyAgICBTRFZhbHVlIEVtaXRDbXAoU0RWYWx1ZSBPcDAsIFNEVmFsdWUgT3AxLCB1bnNpZ25lZCBYODZDQywKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICB9OworfQorCisjZW5kaWYgICAgLy8gWDg2SVNFTExPV0VSSU5HX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nkluc3RyNjRiaXQudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0cjY0Yml0LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjhhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0cjY0Yml0LnRkCkBAIC0wLDAgKzEsMjI0OSBAQAorLy89PT09LSBYODZJbnN0cjY0Yml0LnRkIC0gRGVzY3JpYmUgWDg2LTY0IEluc3RydWN0aW9ucyAtLS0tKi0gdGFibGVnZW4gLSotPT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIFg4Ni02NCBpbnN0cnVjdGlvbiBzZXQsIGRlZmluaW5nIHRoZSBpbnN0cnVjdGlvbnMsDQorLy8gYW5kIHByb3BlcnRpZXMgb2YgdGhlIGluc3RydWN0aW9ucyB3aGljaCBhcmUgbmVlZGVkIGZvciBjb2RlIGdlbmVyYXRpb24sDQorLy8gbWFjaGluZSBjb2RlIGVtaXNzaW9uLCBhbmQgYW5hbHlzaXMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gT3BlcmFuZCBEZWZpbml0aW9ucy4NCisvLw0KKw0KKy8vIDY0LWJpdHMgYnV0IG9ubHkgMzIgYml0cyBhcmUgc2lnbmlmaWNhbnQuDQorZGVmIGk2NGkzMmltbSAgOiBPcGVyYW5kPGk2ND4gew0KKyAgbGV0IFBhcnNlck1hdGNoQ2xhc3MgPSBJbW1TRXh0aTY0aTMyQXNtT3BlcmFuZDsNCit9DQorDQorLy8gNjQtYml0cyBidXQgb25seSAzMiBiaXRzIGFyZSBzaWduaWZpY2FudCwgYW5kIHRob3NlIGJpdHMgYXJlIHRyZWF0ZWQgYXMgYmVpbmcNCisvLyBwYyByZWxhdGl2ZS4NCitkZWYgaTY0aTMyaW1tX3BjcmVsIDogT3BlcmFuZDxpNjQ+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludF9wY3JlbF9pbW0iOw0KKyAgbGV0IFBhcnNlck1hdGNoQ2xhc3MgPSBYODZBYnNNZW1Bc21PcGVyYW5kOw0KK30NCisNCisNCisvLyA2NC1iaXRzIGJ1dCBvbmx5IDggYml0cyBhcmUgc2lnbmlmaWNhbnQuDQorZGVmIGk2NGk4aW1tICAgOiBPcGVyYW5kPGk2ND4gew0KKyAgbGV0IFBhcnNlck1hdGNoQ2xhc3MgPSBJbW1TRXh0aTY0aThBc21PcGVyYW5kOw0KK30NCisNCitkZWYgbGVhNjRfMzJtZW0gOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50aTMybWVtIjsNCisgIGxldCBBc21PcGVyYW5kTG93ZXJNZXRob2QgPSAibG93ZXJfbGVhNjRfMzJtZW0iOw0KKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdSMzIsIGk4aW1tLCBHUjMyX05PU1AsIGkzMmltbSwgaThpbW0pOw0KKyAgbGV0IFBhcnNlck1hdGNoQ2xhc3MgPSBYODZNZW1Bc21PcGVyYW5kOw0KK30NCisNCisNCisvLyBTcGVjaWFsIGk2NG1lbSBmb3IgYWRkcmVzc2VzIG9mIGxvYWQgZm9sZGluZyB0YWlsIGNhbGxzLiBUaGVzZSBhcmUgbm90DQorLy8gYWxsb3dlZCB0byB1c2UgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyBzaW5jZSB0aGV5IG11c3QgYmUgc2NoZWR1bGVkDQorLy8gYWZ0ZXIgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIGFyZSBwb3BwZWQuDQorZGVmIGk2NG1lbV9UQyA6IE9wZXJhbmQ8aTY0PiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRpNjRtZW0iOw0KKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIEdSNjRfVEMsIGk4aW1tLCBHUjY0X1RDLCBpMzJpbW0sIGk4aW1tKTsNCisgIGxldCBQYXJzZXJNYXRjaENsYXNzID0gWDg2TWVtQXNtT3BlcmFuZDsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBDb21wbGV4IFBhdHRlcm4gRGVmaW5pdGlvbnMuDQorLy8NCitkZWYgbGVhNjRhZGRyIDogQ29tcGxleFBhdHRlcm48aTY0LCA1LCAiU2VsZWN0TEVBQWRkciIsDQorICAgICAgICAgICAgICAgICAgICAgICAgW2FkZCwgc3ViLCBtdWwsIFg4Nm11bF9pbW0sIHNobCwgb3IsIGZyYW1laW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFg4NldyYXBwZXJSSVBdLCBbXT47DQorDQorZGVmIHRsczY0YWRkciA6IENvbXBsZXhQYXR0ZXJuPGk2NCwgNSwgIlNlbGVjdFRMU0FERFJBZGRyIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RnbG9iYWx0bHNhZGRyXSwgW10+Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFBhdHRlcm4gZnJhZ21lbnRzLg0KKy8vDQorDQorZGVmIGk2NGltbVNFeHQ4ICA6IFBhdExlYWY8KGk2NCBpbW1TZXh0OCk+Ow0KKw0KK2RlZiBHZXRMbzMyWEZvcm0gOiBTRE5vZGVYRm9ybTxpbW0sIFt7DQorICAvLyBUcmFuc2Zvcm1hdGlvbiBmdW5jdGlvbjogZ2V0IHRoZSBsb3cgMzIgYml0cy4NCisgIHJldHVybiBnZXRJMzJJbW0oKHVuc2lnbmVkKU4tPmdldFpFeHRWYWx1ZSgpKTsNCit9XT47DQorDQorZGVmIGk2NGltbVNFeHQzMiAgOiBQYXRMZWFmPChpNjQgaW1tKSwgW3sNCisgIC8vIGk2NGltbVNFeHQzMiBwcmVkaWNhdGUgLSBUcnVlIGlmIHRoZSA2NC1iaXQgaW1tZWRpYXRlIGZpdHMgaW4gYSAzMi1iaXQNCisgIC8vIHNpZ24gZXh0ZW5kZWQgZmllbGQuDQorICByZXR1cm4gKGludDY0X3QpTi0+Z2V0WkV4dFZhbHVlKCkgPT0gKGludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCk7DQorfV0+Ow0KKw0KKw0KK2RlZiBpNjRpbW1aRXh0MzIgIDogUGF0TGVhZjwoaTY0IGltbSksIFt7DQorICAvLyBpNjRpbW1aRXh0MzIgcHJlZGljYXRlIC0gVHJ1ZSBpZiB0aGUgNjQtYml0IGltbWVkaWF0ZSBmaXRzIGluIGEgMzItYml0DQorICAvLyB1bnNpZ25lZHNpZ24gZXh0ZW5kZWQgZmllbGQuDQorICByZXR1cm4gKHVpbnQ2NF90KU4tPmdldFpFeHRWYWx1ZSgpID09ICh1aW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKTsNCit9XT47DQorDQorZGVmIHNleHRsb2FkaTY0aTggIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpNjQgKHNleHRsb2FkaTggbm9kZTokcHRyKSk+Ow0KK2RlZiBzZXh0bG9hZGk2NGkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTY0IChzZXh0bG9hZGkxNiBub2RlOiRwdHIpKT47DQorZGVmIHNleHRsb2FkaTY0aTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpNjQgKHNleHRsb2FkaTMyIG5vZGU6JHB0cikpPjsNCisNCitkZWYgemV4dGxvYWRpNjRpMSAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGk2NCAoemV4dGxvYWRpMSBub2RlOiRwdHIpKT47DQorZGVmIHpleHRsb2FkaTY0aTggIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpNjQgKHpleHRsb2FkaTggbm9kZTokcHRyKSk+Ow0KK2RlZiB6ZXh0bG9hZGk2NGkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTY0ICh6ZXh0bG9hZGkxNiBub2RlOiRwdHIpKT47DQorZGVmIHpleHRsb2FkaTY0aTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpNjQgKHpleHRsb2FkaTMyIG5vZGU6JHB0cikpPjsNCisNCitkZWYgZXh0bG9hZGk2NGkxICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGk2NCAoZXh0bG9hZGkxIG5vZGU6JHB0cikpPjsNCitkZWYgZXh0bG9hZGk2NGk4ICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGk2NCAoZXh0bG9hZGk4IG5vZGU6JHB0cikpPjsNCitkZWYgZXh0bG9hZGk2NGkxNiAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGk2NCAoZXh0bG9hZGkxNiBub2RlOiRwdHIpKT47DQorZGVmIGV4dGxvYWRpNjRpMzIgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpNjQgKGV4dGxvYWRpMzIgbm9kZTokcHRyKSk+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gSW5zdHJ1Y3Rpb24gbGlzdC4uLg0KKy8vDQorDQorLy8gQURKQ0FMTFNUQUNLRE9XTi9VUCBpbXBsaWNpdGx5IHVzZS9kZWYgUlNQIGJlY2F1c2UgdGhleSBtYXkgYmUgZXhwYW5kZWQgaW50bw0KKy8vIGEgc3RhY2sgYWRqdXN0bWVudCBhbmQgdGhlIGNvZGVnZW4gbXVzdCBrbm93IHRoYXQgdGhleSBtYXkgbW9kaWZ5IHRoZSBzdGFjaw0KKy8vIHBvaW50ZXIgYmVmb3JlIHByb2xvZy1lcGlsb2cgcmV3cml0aW5nIG9jY3Vycy4NCisvLyBQZXNzaW1pc3RpY2FsbHkgYXNzdW1lIEFESkNBTExTVEFDS0RPV04gLyBBREpDQUxMU1RBQ0tVUCB3aWxsIGJlY29tZQ0KKy8vIHN1YiAvIGFkZCB3aGljaCBjYW4gY2xvYmJlciBFRkxBR1MuDQorbGV0IERlZnMgPSBbUlNQLCBFRkxBR1NdLCBVc2VzID0gW1JTUF0gaW4gew0KK2RlZiBBREpDQUxMU1RBQ0tET1dONjQgOiBJPDAsIFBzZXVkbywgKG91dHMpLCAoaW5zIGkzMmltbTokYW10KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0FESkNBTExTVEFDS0RPV04iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoWDg2Y2FsbHNlcV9zdGFydCB0aW1tOiRhbXQpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCitkZWYgQURKQ0FMTFNUQUNLVVA2NCAgIDogSTwwLCBQc2V1ZG8sIChvdXRzKSwgKGlucyBpMzJpbW06JGFtdDEsIGkzMmltbTokYW10MiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNBREpDQUxMU1RBQ0tVUCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhYODZjYWxsc2VxX2VuZCB0aW1tOiRhbXQxLCB0aW1tOiRhbXQyKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorfQ0KKw0KKy8vIEludGVycnVwdCBJbnN0cnVjdGlvbnMNCitkZWYgSVJFVDY0IDogUkk8MHhjZiwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiaXJldHtxfSIsIFtdPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBDYWxsIEluc3RydWN0aW9ucy4uLg0KKy8vDQorbGV0IGlzQ2FsbCA9IDEgaW4NCisgIC8vIEFsbCBjYWxscyBjbG9iYmVyIHRoZSBub24tY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4gUlNQIGlzIG1hcmtlZCBhcw0KKyAgLy8gYSB1c2UgdG8gcHJldmVudCBzdGFjay1wb2ludGVyIGFzc2lnbm1lbnRzIHRoYXQgYXBwZWFyIGltbWVkaWF0ZWx5DQorICAvLyBiZWZvcmUgY2FsbHMgZnJvbSBwb3RlbnRpYWxseSBhcHBlYXJpbmcgZGVhZC4gVXNlcyBmb3IgYXJndW1lbnQNCisgIC8vIHJlZ2lzdGVycyBhcmUgYWRkZWQgbWFudWFsbHkuDQorICBsZXQgRGVmcyA9IFtSQVgsIFJDWCwgUkRYLCBSU0ksIFJESSwgUjgsIFI5LCBSMTAsIFIxMSwNCisgICAgICAgICAgICAgIEZQMCwgRlAxLCBGUDIsIEZQMywgRlA0LCBGUDUsIEZQNiwgU1QwLCBTVDEsDQorICAgICAgICAgICAgICBNTTAsIE1NMSwgTU0yLCBNTTMsIE1NNCwgTU01LCBNTTYsIE1NNywNCisgICAgICAgICAgICAgIFhNTTAsIFhNTTEsIFhNTTIsIFhNTTMsIFhNTTQsIFhNTTUsIFhNTTYsIFhNTTcsDQorICAgICAgICAgICAgICBYTU04LCBYTU05LCBYTU0xMCwgWE1NMTEsIFhNTTEyLCBYTU0xMywgWE1NMTQsIFhNTTE1LCBFRkxBR1NdLA0KKyAgICAgIFVzZXMgPSBbUlNQXSBpbiB7DQorICAgICAgDQorICAgIC8vIE5PVEU6IHRoaXMgcGF0dGVybiBkb2Vzbid0IG1hdGNoICJYODZjYWxsIGltbSIsIGJlY2F1c2Ugd2UgZG8gbm90IGtub3cNCisgICAgLy8gdGhhdCB0aGUgb2Zmc2V0IGJldHdlZW4gYW4gYXJiaXRyYXJ5IGltbWVkaWF0ZSBhbmQgdGhlIGNhbGwgd2lsbCBmaXQgaW4NCisgICAgLy8gdGhlIDMyLWJpdCBwY3JlbCBmaWVsZCB0aGF0IHdlIGhhdmUuDQorICAgIGRlZiBDQUxMNjRwY3JlbDMyIDogSWkzMlBDUmVsPDB4RTgsIFJhd0ZybSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpNjRpMzJpbW1fcGNyZWw6JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxse3F9XHQkZHN0IiwgW10+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZSwgTm90V2luNjRdPjsNCisgICAgZGVmIENBTEw2NHIgICAgICAgOiBJPDB4RkYsIE1STTJyLCAob3V0cyksIChpbnMgR1I2NDokZHN0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGx7cX1cdHsqfSRkc3QiLCBbKFg4NmNhbGwgR1I2NDokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtOb3RXaW42NF0+Ow0KKyAgICBkZWYgQ0FMTDY0bSAgICAgICA6IEk8MHhGRiwgTVJNMm0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxse3F9XHR7Kn0kZHN0IiwgWyhYODZjYWxsIChsb2FkaTY0IGFkZHI6JGRzdCkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W05vdFdpbjY0XT47DQorICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgIGRlZiBGQVJDQUxMNjQgICA6IFJJPDB4RkYsIE1STTNtLCAob3V0cyksIChpbnMgb3BhcXVlODBtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJsY2FsbHtxfVx0eyp9JGRzdCIsIFtdPjsNCisgIH0NCisNCisgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIHRlYWNoIGNvZGVnZW4gYWJvdXQgc2luZ2xlIGxpc3Qgb2YgY2FsbC1jbG9iYmVyZWQgDQorICAvLyByZWdpc3RlcnMuDQorbGV0IGlzQ2FsbCA9IDEsIGlzQ29kZUdlbk9ubHkgPSAxIGluDQorICAvLyBBbGwgY2FsbHMgY2xvYmJlciB0aGUgbm9uLWNhbGxlZSBzYXZlZCByZWdpc3RlcnMuIFJTUCBpcyBtYXJrZWQgYXMNCisgIC8vIGEgdXNlIHRvIHByZXZlbnQgc3RhY2stcG9pbnRlciBhc3NpZ25tZW50cyB0aGF0IGFwcGVhciBpbW1lZGlhdGVseQ0KKyAgLy8gYmVmb3JlIGNhbGxzIGZyb20gcG90ZW50aWFsbHkgYXBwZWFyaW5nIGRlYWQuIFVzZXMgZm9yIGFyZ3VtZW50DQorICAvLyByZWdpc3RlcnMgYXJlIGFkZGVkIG1hbnVhbGx5Lg0KKyAgbGV0IERlZnMgPSBbUkFYLCBSQ1gsIFJEWCwgUjgsIFI5LCBSMTAsIFIxMSwNCisgICAgICAgICAgICAgIEZQMCwgRlAxLCBGUDIsIEZQMywgRlA0LCBGUDUsIEZQNiwgU1QwLCBTVDEsDQorICAgICAgICAgICAgICBNTTAsIE1NMSwgTU0yLCBNTTMsIE1NNCwgTU01LCBNTTYsIE1NNywNCisgICAgICAgICAgICAgIFhNTTAsIFhNTTEsIFhNTTIsIFhNTTMsIFhNTTQsIFhNTTUsIEVGTEFHU10sDQorICAgICAgVXNlcyA9IFtSU1BdIGluIHsNCisgICAgZGVmIFdJTkNBTEw2NHBjcmVsMzIgOiBJaTMyUENSZWw8MHhFOCwgUmF3RnJtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk2NGkzMmltbV9wY3JlbDokZHN0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxcdCRkc3QiLCBbXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0lzV2luNjRdPjsNCisgICAgZGVmIFdJTkNBTEw2NHIgICAgICAgOiBJPDB4RkYsIE1STTJyLCAob3V0cyksIChpbnMgR1I2NDokZHN0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxcdHsqfSRkc3QiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhYODZjYWxsIEdSNjQ6JGRzdCldPiwgUmVxdWlyZXM8W0lzV2luNjRdPjsNCisgICAgZGVmIFdJTkNBTEw2NG0gICAgICAgOiBJPDB4RkYsIE1STTJtLCAob3V0cyksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBpNjRtZW06JGRzdCwgdmFyaWFibGVfb3BzKSwgImNhbGxcdHsqfSRkc3QiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhYODZjYWxsIChsb2FkaTY0IGFkZHI6JGRzdCkpXT4sIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJc1dpbjY0XT47DQorICB9DQorDQorDQorbGV0IGlzQ2FsbCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGlzUmV0dXJuID0gMSwgaXNCYXJyaWVyID0gMSwNCisgICAgaXNDb2RlR2VuT25seSA9IDEgaW4NCisgIGxldCBEZWZzID0gW1JBWCwgUkNYLCBSRFgsIFJTSSwgUkRJLCBSOCwgUjksIFIxMCwgUjExLA0KKyAgICAgICAgICAgICAgRlAwLCBGUDEsIEZQMiwgRlAzLCBGUDQsIEZQNSwgRlA2LCBTVDAsIFNUMSwNCisgICAgICAgICAgICAgIE1NMCwgTU0xLCBNTTIsIE1NMywgTU00LCBNTTUsIE1NNiwgTU03LA0KKyAgICAgICAgICAgICAgWE1NMCwgWE1NMSwgWE1NMiwgWE1NMywgWE1NNCwgWE1NNSwgWE1NNiwgWE1NNywNCisgICAgICAgICAgICAgIFhNTTgsIFhNTTksIFhNTTEwLCBYTU0xMSwgWE1NMTIsIFhNTTEzLCBYTU0xNCwgWE1NMTUsIEVGTEFHU10sDQorICAgICAgVXNlcyA9IFtSU1BdIGluIHsNCisgIGRlZiBUQ1JFVFVSTmRpNjQgOiBJPDAsIFBzZXVkbywgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGk2NGkzMmltbV9wY3JlbDokZHN0LCBpMzJpbW06JG9mZnNldCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICIjVENfUkVUVVJOICRkc3QgJG9mZnNldCIsIFtdPjsNCisgIGRlZiBUQ1JFVFVSTnJpNjQgOiBJPDAsIFBzZXVkbywgKG91dHMpLCAoaW5zIEdSNjRfVEM6JGRzdCwgaTMyaW1tOiRvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAgICAiI1RDX1JFVFVSTiAkZHN0ICRvZmZzZXQiLCBbXT47DQorICBsZXQgbWF5TG9hZCA9IDEgaW4NCisgIGRlZiBUQ1JFVFVSTm1pNjQgOiBJPDAsIFBzZXVkbywgKG91dHMpLCANCisgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTY0bWVtX1RDOiRkc3QsIGkzMmltbTokb2Zmc2V0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIiNUQ19SRVRVUk4gJGRzdCAkb2Zmc2V0IiwgW10+Ow0KKw0KKyAgZGVmIFRBSUxKTVBkNjQgOiBJaTMyUENSZWw8MHhFOSwgUmF3RnJtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGk2NGkzMmltbV9wY3JlbDokZHN0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAiam1wXHQkZHN0ICAjIFRBSUxDQUxMIiwgW10+Ow0KKyAgZGVmIFRBSUxKTVByNjQgOiBJPDB4RkYsIE1STTRyLCAob3V0cyksIChpbnMgR1I2NF9UQzokZHN0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJqbXB7cX1cdHsqfSRkc3QgICMgVEFJTENBTEwiLCBbXT47DQorDQorICBsZXQgbWF5TG9hZCA9IDEgaW4NCisgIGRlZiBUQUlMSk1QbTY0IDogSTwweEZGLCBNUk00bSwgKG91dHMpLCAoaW5zIGk2NG1lbV9UQzokZHN0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJqbXB7cX1cdHsqfSRkc3QgICMgVEFJTENBTEwiLCBbXT47DQorfQ0KKw0KKy8vIEJyYW5jaGVzDQorbGV0IGlzQnJhbmNoID0gMSwgaXNUZXJtaW5hdG9yID0gMSwgaXNCYXJyaWVyID0gMSwgaXNJbmRpcmVjdEJyYW5jaCA9IDEgaW4gew0KKyAgZGVmIEpNUDY0cGNyZWwzMiA6IEk8MHhFOSwgUmF3RnJtLCAob3V0cyksIChpbnMgYnJ0YXJnZXQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgImptcHtxfVx0JGRzdCIsIFtdPjsNCisgIGRlZiBKTVA2NHIgICAgIDogSTwweEZGLCBNUk00ciwgKG91dHMpLCAoaW5zIEdSNjQ6JGRzdCksICJqbXB7cX1cdHsqfSRkc3QiLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoYnJpbmQgR1I2NDokZHN0KV0+LCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCisgIGRlZiBKTVA2NG0gICAgIDogSTwweEZGLCBNUk00bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwgImptcHtxfVx0eyp9JGRzdCIsDQorICAgICAgICAgICAgICAgICAgICAgWyhicmluZCAobG9hZGk2NCBhZGRyOiRkc3QpKV0+LCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCisgIGRlZiBGQVJKTVA2NCAgIDogUkk8MHhGRiwgTVJNNW0sIChvdXRzKSwgKGlucyBvcGFxdWU4MG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgImxqbXB7cX1cdHsqfSRkc3QiLCBbXT47DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRUggUHNldWRvIEluc3RydWN0aW9ucw0KKy8vDQorbGV0IGlzVGVybWluYXRvciA9IDEsIGlzUmV0dXJuID0gMSwgaXNCYXJyaWVyID0gMSwNCisgICAgaGFzQ3RybERlcCA9IDEsIGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCitkZWYgRUhfUkVUVVJONjQgICA6IEk8MHhDMywgUmF3RnJtLCAob3V0cyksIChpbnMgR1I2NDokYWRkciksDQorICAgICAgICAgICAgICAgICAgICAgInJldFx0I2VoX3JldHVybiwgYWRkcjogJGFkZHIiLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoWDg2ZWhyZXQgR1I2NDokYWRkcildPjsNCisNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgTWlzY2VsbGFuZW91cyBJbnN0cnVjdGlvbnMuLi4NCisvLw0KKw0KK2RlZiBQT1BDTlQ2NHJyIDogUkk8MHhCOCwgTVJNU3JjUmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAicG9wY250e3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgWFM7DQorbGV0IG1heUxvYWQgPSAxIGluDQorZGVmIFBPUENOVDY0cm0gOiBSSTwweEI4LCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgInBvcGNudHtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFhTOw0KKw0KK2xldCBEZWZzID0gW1JCUCxSU1BdLCBVc2VzID0gW1JCUCxSU1BdLCBtYXlMb2FkID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4NCitkZWYgTEVBVkU2NCAgOiBJPDB4QzksIFJhd0ZybSwNCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyksICJsZWF2ZSIsIFtdPiwgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorbGV0IERlZnMgPSBbUlNQXSwgVXNlcyA9IFtSU1BdLCBuZXZlckhhc1NpZGVFZmZlY3RzPTEgaW4gew0KK2xldCBtYXlMb2FkID0gMSBpbiB7DQorZGVmIFBPUDY0ciAgIDogSTwweDU4LCBBZGRSZWdGcm0sDQorICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRyZWcpLCAoaW5zKSwgInBvcHtxfVx0JHJlZyIsIFtdPjsNCitkZWYgUE9QNjRybXI6IEk8MHg4RiwgTVJNMHIsIChvdXRzIEdSNjQ6JHJlZyksIChpbnMpLCAicG9we3F9XHQkcmVnIiwgW10+Ow0KK2RlZiBQT1A2NHJtbTogSTwweDhGLCBNUk0wbSwgKG91dHMgaTY0bWVtOiRkc3QpLCAoaW5zKSwgInBvcHtxfVx0JGRzdCIsIFtdPjsNCit9DQorbGV0IG1heVN0b3JlID0gMSBpbiB7DQorZGVmIFBVU0g2NHIgIDogSTwweDUwLCBBZGRSZWdGcm0sDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1I2NDokcmVnKSwgInB1c2h7cX1cdCRyZWciLCBbXT47DQorZGVmIFBVU0g2NHJtcjogSTwweEZGLCBNUk02ciwgKG91dHMpLCAoaW5zIEdSNjQ6JHJlZyksICJwdXNoe3F9XHQkcmVnIiwgW10+Ow0KK2RlZiBQVVNINjRybW06IEk8MHhGRiwgTVJNNm0sIChvdXRzKSwgKGlucyBpNjRtZW06JHNyYyksICJwdXNoe3F9XHQkc3JjIiwgW10+Ow0KK30NCit9DQorDQorbGV0IERlZnMgPSBbUlNQXSwgVXNlcyA9IFtSU1BdLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSwgbWF5U3RvcmUgPSAxIGluIHsNCitkZWYgUFVTSDY0aTggICA6IElpODwweDZhLCBSYXdGcm0sIChvdXRzKSwgKGlucyBpOGltbTokaW1tKSwgDQorICAgICAgICAgICAgICAgICAgICAgInB1c2h7cX1cdCRpbW0iLCBbXT47DQorZGVmIFBVU0g2NGkxNiAgOiBJaTE2PDB4NjgsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGkxNmltbTokaW1tKSwgDQorICAgICAgICAgICAgICAgICAgICAgICJwdXNoe3F9XHQkaW1tIiwgW10+Ow0KK2RlZiBQVVNINjRpMzIgIDogSWkzMjwweDY4LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpNjRpMzJpbW06JGltbSksDQorICAgICAgICAgICAgICAgICAgICAgICJwdXNoe3F9XHQkaW1tIiwgW10+Ow0KK30NCisNCitsZXQgRGVmcyA9IFtSU1AsIEVGTEFHU10sIFVzZXMgPSBbUlNQXSwgbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHM9MSBpbg0KK2RlZiBQT1BGNjQgICA6IEk8MHg5RCwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAicG9wZnEiLCBbXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorbGV0IERlZnMgPSBbUlNQXSwgVXNlcyA9IFtSU1AsIEVGTEFHU10sIG1heVN0b3JlID0gMSwgbmV2ZXJIYXNTaWRlRWZmZWN0cz0xIGluDQorZGVmIFBVU0hGNjQgICAgOiBJPDB4OUMsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInB1c2hmcSIsIFtdPiwNCisgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KKw0KK2RlZiBMRUE2NF8zMnIgOiBJPDB4OEQsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIGxlYTY0XzMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJsZWF7bH1cdHskc3JjfCRkc3R9LCB7JGRzdHwkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCBsZWEzMmFkZHI6JHNyYyldPiwgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorDQorbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCitkZWYgTEVBNjRyICAgOiBSSTwweDhELCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJsZWF7cX1cdHskc3JjfCRkc3R9LCB7JGRzdHwkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBsZWE2NGFkZHI6JHNyYyldPjsNCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiIGluDQorZGVmIEJTV0FQNjRyIDogUkk8MHhDOCwgQWRkUmVnRnJtLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgImJzd2Fwe3F9XHQkZHN0IiwgDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoYnN3YXAgR1I2NDokc3JjKSldPiwgVEI7DQorDQorLy8gQml0IHNjYW4gaW5zdHJ1Y3Rpb25zLg0KK2xldCBEZWZzID0gW0VGTEFHU10gaW4gew0KK2RlZiBCU0Y2NHJyICA6IFJJPDB4QkMsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJic2Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywgKFg4NmJzZiBHUjY0OiRzcmMpKV0+LCBUQjsNCitkZWYgQlNGNjRybSAgOiBSSTwweEJDLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJic2Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywgKFg4NmJzZiAobG9hZGk2NCBhZGRyOiRzcmMpKSldPiwgVEI7DQorDQorZGVmIEJTUjY0cnIgIDogUkk8MHhCRCwgTVJNU3JjUmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgImJzcntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLCAoWDg2YnNyIEdSNjQ6JHNyYykpXT4sIFRCOw0KK2RlZiBCU1I2NHJtICA6IFJJPDB4QkQsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgImJzcntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLCAoWDg2YnNyIChsb2FkaTY0IGFkZHI6JHNyYykpKV0+LCBUQjsNCit9IC8vIERlZnMgPSBbRUZMQUdTXQ0KKw0KKy8vIFJlcGVhdCBzdHJpbmcgb3BzDQorbGV0IERlZnMgPSBbUkNYLFJESSxSU0ldLCBVc2VzID0gW1JDWCxSREksUlNJXSwgaXNDb2RlR2VuT25seSA9IDEgaW4NCitkZWYgUkVQX01PVlNRIDogUkk8MHhBNSwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAie3JlcDttb3ZzcXxyZXAgbW92c3F9IiwNCisgICAgICAgICAgICAgICAgICAgWyhYODZyZXBfbW92cyBpNjQpXT4sIFJFUDsNCitsZXQgRGVmcyA9IFtSQ1gsUkRJXSwgVXNlcyA9IFtSQVgsUkNYLFJESV0sIGlzQ29kZUdlbk9ubHkgPSAxIGluDQorZGVmIFJFUF9TVE9TUSA6IFJJPDB4QUIsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgIntyZXA7c3Rvc3F8cmVwIHN0b3NxfSIsDQorICAgICAgICAgICAgICAgICAgIFsoWDg2cmVwX3N0b3MgaTY0KV0+LCBSRVA7DQorDQorbGV0IERlZnMgPSBbRURJLEVTSV0sIFVzZXMgPSBbRURJLEVTSSxFRkxBR1NdIGluDQorZGVmIE1PVlNRIDogUkk8MHhBNSwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAibW92c3EiLCBbXT47DQorDQorbGV0IERlZnMgPSBbUkNYLFJESV0sIFVzZXMgPSBbUkFYLFJDWCxSREksRUZMQUdTXSBpbg0KK2RlZiBTVE9TUSA6IFJJPDB4QUIsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInN0b3NxIiwgW10+Ow0KKw0KK2RlZiBTQ0FTNjQgOiBSSTwweEFGLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJzY2FzcSIsIFtdPjsNCisNCitkZWYgQ01QUzY0IDogUkk8MHhBNywgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiY21wc3EiLCBbXT47DQorDQorLy8gRmFzdCBzeXN0ZW0tY2FsbCBpbnN0cnVjdGlvbnMNCitkZWYgU1lTRVhJVDY0IDogUkk8MHgzNSwgUmF3RnJtLA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMpLCAic3lzZXhpdCIsIFtdPiwgVEIsIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIE1vdmUgSW5zdHJ1Y3Rpb25zLi4uDQorLy8NCisNCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4NCitkZWYgTU9WNjRyciA6IFJJPDB4ODksIE1STURlc3RSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICJtb3Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KKw0KK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxLCBpc0FzQ2hlYXBBc0FNb3ZlID0gMSAgaW4gew0KK2RlZiBNT1Y2NHJpIDogUklpNjQ8MHhCOCwgQWRkUmVnRnJtLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIGk2NGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJtb3ZhYnN7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgaW1tOiRzcmMpXT47DQorZGVmIE1PVjY0cmkzMiA6IFJJaTMyPDB4QzcsIE1STTByLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIGk2NGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIGk2NGltbVNFeHQzMjokc3JjKV0+Ow0KK30NCisNCisvLyBUaGUgYXNzZW1ibGVyIGFjY2VwdHMgbW92cSBvZiBhIDY0LWJpdCBpbW1lZGlhdGUgYXMgYW4gYWx0ZXJuYXRlIHNwZWxsaW5nIG9mDQorLy8gbW92YWJzcS4NCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorZGVmIE1PVjY0cmlfYWx0IDogUklpNjQ8MHhCOCwgQWRkUmVnRnJtLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIGk2NGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJtb3Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK30NCisNCitsZXQgaXNDb2RlR2VuT25seSA9IDEgaW4gew0KK2RlZiBNT1Y2NHJyX1JFViA6IFJJPDB4OEIsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJtb3Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK30NCisNCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCitkZWYgTU9WNjRybSA6IFJJPDB4OEIsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAibW92e3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChsb2FkIGFkZHI6JHNyYykpXT47DQorDQorZGVmIE1PVjY0bXIgOiBSSTwweDg5LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAibW92e3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIEdSNjQ6JHNyYywgYWRkcjokZHN0KV0+Ow0KK2RlZiBNT1Y2NG1pMzIgOiBSSWkzMjwweEM3LCBNUk0wbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBpNjRpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJtb3Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBpNjRpbW1TRXh0MzI6JHNyYywgYWRkcjokZHN0KV0+Ow0KKw0KKy8vLyBWZXJzaW9ucyBvZiBNT1Y2NHJyLCBNT1Y2NHJtLCBhbmQgTU9WNjRtciBmb3IgaTY0bWVtX1RDIGFuZCBHUjY0X1RDLg0KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluDQorZGVmIE1PVjY0cnJfVEMgOiBSSTwweDg5LCBNUk1EZXN0UmVnLCAob3V0cyBHUjY0X1RDOiRkc3QpLCAoaW5zIEdSNjRfVEM6JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KKw0KK2xldCBtYXlMb2FkID0gMSwNCisgICAgY2FuRm9sZEFzTG9hZCA9IDEsIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCitkZWYgTU9WNjRybV9UQyA6IFJJPDB4OEIsIE1STVNyY01lbSwgKG91dHMgR1I2NF9UQzokZHN0KSwgKGlucyBpNjRtZW1fVEM6JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgW10+Ow0KKw0KK2xldCBtYXlTdG9yZSA9IDEgaW4NCitkZWYgTU9WNjRtcl9UQyA6IFJJPDB4ODksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW1fVEM6JGRzdCwgR1I2NF9UQzokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICBbXT47DQorfQ0KKw0KK2RlZiBNT1Y2NG84YSA6IFJJaTg8MHhBMCwgUmF3RnJtLCAob3V0cyksIChpbnMgb2Zmc2V0ODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdntxfVx0eyRzcmMsICVyYXh8JXJheCwgJHNyY30iLCBbXT47DQorZGVmIE1PVjY0bzY0YSA6IFJJaTMyPDB4QTEsIFJhd0ZybSwgKG91dHMpLCAoaW5zIG9mZnNldDY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdntxfVx0eyRzcmMsICVyYXh8JXJheCwgJHNyY30iLCBbXT47DQorZGVmIE1PVjY0YW84IDogUklpODwweEEyLCBSYXdGcm0sIChvdXRzIG9mZnNldDg6JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdntxfVx0eyVyYXgsICRkc3R8JGRzdCwgJXJheH0iLCBbXT47DQorZGVmIE1PVjY0YW82NCA6IFJJaTMyPDB4QTMsIFJhd0ZybSwgKG91dHMgb2Zmc2V0NjQ6JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdntxfVx0eyVyYXgsICRkc3R8JGRzdCwgJXJheH0iLCBbXT47DQorDQorLy8gTW92ZXMgdG8gYW5kIGZyb20gc2VnbWVudCByZWdpc3RlcnMNCitkZWYgTU9WNjRycyA6IFJJPDB4OEMsIE1STURlc3RSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgU0VHTUVOVF9SRUc6JHNyYyksDQorICAgICAgICAgICAgICAgICAibW92e3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCitkZWYgTU9WNjRtcyA6IFJJPDB4OEMsIE1STURlc3RNZW0sIChvdXRzIGk2NG1lbTokZHN0KSwgKGlucyBTRUdNRU5UX1JFRzokc3JjKSwNCisgICAgICAgICAgICAgICAgICJtb3Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2RlZiBNT1Y2NHNyIDogUkk8MHg4RSwgTVJNU3JjUmVnLCAob3V0cyBTRUdNRU5UX1JFRzokZHN0KSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgIm1vdntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorZGVmIE1PVjY0c20gOiBSSTwweDhFLCBNUk1TcmNNZW0sIChvdXRzIFNFR01FTlRfUkVHOiRkc3QpLCAoaW5zIGk2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICJtb3Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KKw0KKy8vIE1vdmVzIHRvIGFuZCBmcm9tIGRlYnVnIHJlZ2lzdGVycw0KK2RlZiBNT1Y2NHJkIDogSTwweDIxLCBNUk1EZXN0UmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIERFQlVHX1JFRzokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KK2RlZiBNT1Y2NGRyIDogSTwweDIzLCBNUk1TcmNSZWcsIChvdXRzIERFQlVHX1JFRzokZHN0KSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibW92e3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorDQorLy8gTW92ZXMgdG8gYW5kIGZyb20gY29udHJvbCByZWdpc3RlcnMNCitkZWYgTU9WNjRyYyA6IEk8MHgyMCwgTVJNRGVzdFJlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBDT05UUk9MX1JFRzokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KK2RlZiBNT1Y2NGNyIDogSTwweDIyLCBNUk1TcmNSZWcsIChvdXRzIENPTlRST0xfUkVHOiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCisNCisvLyBTaWduL1plcm8gZXh0ZW5kZXJzDQorDQorLy8gTU9WU1g2NHJyOCBhbHdheXMgaGFzIGEgUkVYIHByZWZpeCBhbmQgaXQgaGFzIGFuIDgtYml0IHJlZ2lzdGVyDQorLy8gb3BlcmFuZCwgd2hpY2ggbWFrZXMgaXQgYSByYXJlIGluc3RydWN0aW9uIHdpdGggYW4gOC1iaXQgcmVnaXN0ZXINCisvLyBvcGVyYW5kIHRoYXQgY2FuIG5ldmVyIGFjY2VzcyBhbiBoIHJlZ2lzdGVyLiBJZiBzdXBwb3J0IGZvciBoIHJlZ2lzdGVycw0KKy8vIHdlcmUgZ2VuZXJhbGl6ZWQsIHRoaXMgd291bGQgcmVxdWlyZSBhIHNwZWNpYWwgcmVnaXN0ZXIgY2xhc3MuDQorZGVmIE1PVlNYNjRycjggOiBSSTwweEJFLCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I4IDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJtb3Zze2JxfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzZXh0IEdSODokc3JjKSldPiwgVEI7DQorZGVmIE1PVlNYNjRybTggOiBSSTwweEJFLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaThtZW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIm1vdnN7YnF8eH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNleHRsb2FkaTY0aTggYWRkcjokc3JjKSldPiwgVEI7DQorZGVmIE1PVlNYNjRycjE2OiBSSTwweEJGLCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1IxNjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJtb3Zze3dxfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzZXh0IEdSMTY6JHNyYykpXT4sIFRCOw0KK2RlZiBNT1ZTWDY0cm0xNjogUkk8MHhCRiwgTVJNU3JjTWVtLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIGkxNm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJtb3Zze3dxfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzZXh0bG9hZGk2NGkxNiBhZGRyOiRzcmMpKV0+LCBUQjsNCitkZWYgTU9WU1g2NHJyMzI6IFJJPDB4NjMsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIm1vdnN7bHF8eGR9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzZXh0IEdSMzI6JHNyYykpXT47DQorZGVmIE1PVlNYNjRybTMyOiBSSTwweDYzLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIm1vdnN7bHF8eGR9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzZXh0bG9hZGk2NGkzMiBhZGRyOiRzcmMpKV0+Ow0KKw0KKy8vIG1vdnpicSBhbmQgbW92endxIGVuY29kaW5ncyBmb3IgdGhlIGRpc2Fzc2VtYmxlcg0KK2RlZiBNT1ZaWDY0cnI4X1EgOiBSSTwweEI2LCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdnp7YnF8eH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitkZWYgTU9WWlg2NHJtOF9RIDogUkk8MHhCNiwgTVJNU3JjTWVtLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIGk4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdnp7YnF8eH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitkZWYgTU9WWlg2NHJyMTZfUSA6IFJJPDB4QjcsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjE2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdnp7d3F8eH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitkZWYgTU9WWlg2NHJtMTZfUSA6IFJJPDB4QjcsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAibW92ent3cXx4fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KKw0KKy8vIFVzZSBtb3Z6YmwgaW5zdGVhZCBvZiBtb3Z6YnEgd2hlbiB0aGUgZGVzdGluYXRpb24gaXMgYSByZWdpc3RlcjsgaXQncw0KKy8vIGVxdWl2YWxlbnQgZHVlIHRvIGltcGxpY2l0IHplcm8tZXh0ZW5kaW5nLCBhbmQgaXQgaGFzIGEgc21hbGxlciBlbmNvZGluZy4NCitkZWYgTU9WWlg2NHJyOCA6IEk8MHhCNiwgTVJNU3JjUmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSOCA6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICIiLCBbKHNldCBHUjY0OiRkc3QsICh6ZXh0IEdSODokc3JjKSldPiwgVEI7DQorZGVmIE1PVlpYNjRybTggOiBJPDB4QjYsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpOG1lbSA6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICIiLCBbKHNldCBHUjY0OiRkc3QsICh6ZXh0bG9hZGk2NGk4IGFkZHI6JHNyYykpXT4sIFRCOw0KKy8vIFVzZSBtb3Z6d2wgaW5zdGVhZCBvZiBtb3Z6d3Egd2hlbiB0aGUgZGVzdGluYXRpb24gaXMgYSByZWdpc3RlcjsgaXQncw0KKy8vIGVxdWl2YWxlbnQgZHVlIHRvIGltcGxpY2l0IHplcm8tZXh0ZW5kaW5nLCBhbmQgaXQgaGFzIGEgc21hbGxlciBlbmNvZGluZy4NCitkZWYgTU9WWlg2NHJyMTY6IEk8MHhCNywgTVJNU3JjUmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICIiLCBbKHNldCBHUjY0OiRkc3QsICh6ZXh0IEdSMTY6JHNyYykpXT4sIFRCOw0KK2RlZiBNT1ZaWDY0cm0xNjogSTwweEI3LCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTE2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiIiwgWyhzZXQgR1I2NDokZHN0LCAoemV4dGxvYWRpNjRpMTYgYWRkcjokc3JjKSldPiwgVEI7DQorDQorLy8gVGhlcmUncyBubyBtb3Z6bHEgaW5zdHJ1Y3Rpb24sIGJ1dCBtb3ZsIGNhbiBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UsIHVzaW5nDQorLy8gaW1wbGljaXQgemVyby1leHRlbnNpb24uIFRoZSBwcmVmZXJyZWQgd2F5IHRvIGRvIDMyLWJpdC10by02NC1iaXQgemVybw0KKy8vIGV4dGVuc2lvbiBvbiB4ODYtNjQgaXMgdG8gdXNlIGEgU1VCUkVHX1RPX1JFRyB0byB1dGlsaXplIGltcGxpY2l0DQorLy8gemVyby1leHRlbnNpb24sIGhvd2V2ZXIgdGhpcyBpc24ndCBwb3NzaWJsZSB3aGVuIHRoZSAzMi1iaXQgdmFsdWUgaXMNCisvLyBkZWZpbmVkIGJ5IGEgdHJ1bmNhdGUgb3IgaXMgY29waWVkIGZyb20gc29tZXRoaW5nIHdoZXJlIHRoZSBoaWdoIGJpdHMgYXJlbid0DQorLy8gbmVjZXNzYXJpbHkgYWxsIHplcm8uIEluIHN1Y2ggY2FzZXMsIHdlIGZhbGwgYmFjayB0byB0aGVzZSBleHBsaWNpdCB6ZXh0DQorLy8gaW5zdHJ1Y3Rpb25zLg0KK2RlZiBNT1ZaWDY0cnIzMiA6IEk8MHg4OSwgTVJNRGVzdFJlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIiIsIFsoc2V0IEdSNjQ6JGRzdCwgKHpleHQgR1IzMjokc3JjKSldPjsNCitkZWYgTU9WWlg2NHJtMzIgOiBJPDB4OEIsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAiIiwgWyhzZXQgR1I2NDokZHN0LCAoemV4dGxvYWRpNjRpMzIgYWRkcjokc3JjKSldPjsNCisNCisvLyBBbnkgaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIGEgMzItYml0IHJlc3VsdCBsZWF2ZXMgdGhlIGhpZ2ggaGFsZiBvZiB0aGUNCisvLyByZWdpc3Rlci4gVHJ1bmNhdGUgY2FuIGJlIGxvd2VyZWQgdG8gRVhUUkFDVF9TVUJSRUcuIENvcHlGcm9tUmVnIG1heQ0KKy8vIGJlIGNvcHlpbmcgZnJvbSBhIHRydW5jYXRlLiBBbmQgeDg2J3MgY21vdiBkb2Vzbid0IGRvIGFueXRoaW5nIGlmIHRoZQ0KKy8vIGNvbmRpdGlvbiBpcyBmYWxzZS4gQnV0IGFueSBvdGhlciAzMi1iaXQgb3BlcmF0aW9uIHdpbGwgemVyby1leHRlbmQNCisvLyB1cCB0byA2NCBiaXRzLg0KK2RlZiBkZWYzMiA6IFBhdExlYWY8KGkzMiBHUjMyOiRzcmMpLCBbew0KKyAgcmV0dXJuIE4tPmdldE9wY29kZSgpICE9IElTRDo6VFJVTkNBVEUgJiYNCisgICAgICAgICBOLT5nZXRPcGNvZGUoKSAhPSBUYXJnZXRPcGNvZGU6OkVYVFJBQ1RfU1VCUkVHICYmDQorICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpDb3B5RnJvbVJlZyAmJg0KKyAgICAgICAgIE4tPmdldE9wY29kZSgpICE9IFg4NklTRDo6Q01PVjsNCit9XT47DQorDQorLy8gSW4gdGhlIGNhc2Ugb2YgYSAzMi1iaXQgZGVmIHRoYXQgaXMga25vd24gdG8gaW1wbGljaXRseSB6ZXJvLWV4dGVuZCwNCisvLyB3ZSBjYW4gdXNlIGEgU1VCUkVHX1RPX1JFRy4NCitkZWYgOiBQYXQ8KGk2NCAoemV4dCBkZWYzMjokc3JjKSksDQorICAgICAgICAgIChTVUJSRUdfVE9fUkVHIChpNjQgMCksIEdSMzI6JHNyYywgc3ViXzMyYml0KT47DQorDQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCisgIGxldCBEZWZzID0gW1JBWF0sIFVzZXMgPSBbRUFYXSBpbg0KKyAgZGVmIENEUUUgOiBSSTwweDk4LCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgIntjbHRxfGNkcWV9IiwgW10+OyAgICAgLy8gUkFYID0gc2lnbmV4dChFQVgpDQorDQorICBsZXQgRGVmcyA9IFtSQVgsUkRYXSwgVXNlcyA9IFtSQVhdIGluDQorICBkZWYgQ1FPICA6IFJJPDB4OTksIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgIntjcXRvfGNxb30iLCBbXT47IC8vIFJEWDpSQVggPSBzaWduZXh0KFJBWCkNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMuLi4NCisvLw0KKw0KK2xldCBEZWZzID0gW0VGTEFHU10gaW4gew0KKw0KK2RlZiBBREQ2NGkzMiA6IFJJaTMyPDB4MDUsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGk2NGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAiYWRke3F9XHR7JHNyYywgJXJheHwlcmF4LCAkc3JjfSIsIFtdPjsNCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorbGV0IGlzQ29udmVydGlibGVUb1RocmVlQWRkcmVzcyA9IDEgaW4gew0KK2xldCBpc0NvbW11dGFibGUgPSAxIGluDQorLy8gUmVnaXN0ZXItUmVnaXN0ZXIgQWRkaXRpb24NCitkZWYgQURENjRyciAgICA6IFJJPDB4MDEsIE1STURlc3RSZWcsIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJhZGR7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2YWRkX2ZsYWcgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpXT47DQorDQorLy8gVGhlc2UgYXJlIGFsdGVybmF0ZSBzcGVsbGluZ3MgZm9yIHVzZSBieSB0aGUgZGlzYXNzZW1ibGVyLCB3ZSBtYXJrIHRoZW0gYXMNCisvLyBjb2RlIGdlbiBvbmx5IHRvIGVuc3VyZSB0aGV5IGFyZW4ndCBtYXRjaGVkIGJ5IHRoZSBhc3NlbWJsZXIuDQorbGV0IGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCisgIGRlZiBBREQ2NHJyX2FsdCAgOiBSSTwweDAzLCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJhZGR7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT47DQorfQ0KKw0KKy8vIFJlZ2lzdGVyLUludGVnZXIgQWRkaXRpb24NCitkZWYgQURENjRyaTggIDogUklpODwweDgzLCBNUk0wciwgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgImFkZHtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NmFkZF9mbGFnIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKSldPjsNCitkZWYgQURENjRyaTMyIDogUklpMzI8MHg4MSwgTVJNMHIsIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIGk2NGkzMmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJhZGR7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NmFkZF9mbGFnIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQzMjokc3JjMikpXT47DQorfSAvLyBpc0NvbnZlcnRpYmxlVG9UaHJlZUFkZHJlc3MNCisNCisvLyBSZWdpc3Rlci1NZW1vcnkgQWRkaXRpb24NCitkZWYgQURENjRybSAgICAgOiBSSTwweDAzLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAiYWRke3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2YWRkX2ZsYWcgR1I2NDokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KKw0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0Ig0KKw0KKy8vIE1lbW9yeS1SZWdpc3RlciBBZGRpdGlvbg0KK2RlZiBBREQ2NG1yICA6IFJJPDB4MDEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImFkZHtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkIGFkZHI6JGRzdCksIEdSNjQ6JHNyYzIpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KK2RlZiBBREQ2NG1pOCA6IFJJaTg8MHg4MywgTVJNMG0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgaTY0aThpbW0gOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJhZGR7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGQgKGxvYWQgYWRkcjokZHN0KSwgaTY0aW1tU0V4dDg6JHNyYzIpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCitkZWYgQURENjRtaTMyIDogUklpMzI8MHg4MSwgTVJNMG0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgaTY0aTMyaW1tIDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJhZGR7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZCBhZGRyOiRkc3QpLCBpNjRpbW1TRXh0MzI6JHNyYzIpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKw0KK2xldCBVc2VzID0gW0VGTEFHU10gaW4gew0KKw0KK2RlZiBBREM2NGkzMiA6IFJJaTMyPDB4MTUsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGk2NGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAiYWRje3F9XHR7JHNyYywgJXJheHwlcmF4LCAkc3JjfSIsIFtdPjsNCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4NCitkZWYgQURDNjRyciAgOiBSSTwweDExLCBNUk1EZXN0UmVnLCAob3V0cyBHUjY0OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJhZGN7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFkZGUgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpXT47DQorDQorbGV0IGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCitkZWYgQURDNjRycl9SRVYgOiBSSTwweDEzLCBNUk1TcmNSZWcgLCAob3V0cyBHUjMyOiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImFkY3txfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPjsNCit9DQorDQorZGVmIEFEQzY0cm0gIDogUkk8MHgxMywgTVJNU3JjTWVtICwgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJhZGN7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFkZGUgR1I2NDokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KKw0KK2RlZiBBREM2NHJpOCA6IFJJaTg8MHg4MywgTVJNMnIsIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYWRje3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFkZGUgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpKV0+Ow0KK2RlZiBBREM2NHJpMzIgOiBSSWkzMjwweDgxLCBNUk0yciwgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0aTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgImFkY3txfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGFkZGUgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKSldPjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCINCisNCitkZWYgQURDNjRtciAgOiBSSTwweDExLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJhZGN7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZGUgKGxvYWQgYWRkcjokZHN0KSwgR1I2NDokc3JjMiksIGFkZHI6JGRzdCldPjsNCitkZWYgQURDNjRtaTggOiBSSWk4PDB4ODMsIE1STTJtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIGk2NGk4aW1tIDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYWRje3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZGUgKGxvYWQgYWRkcjokZHN0KSwgaTY0aW1tU0V4dDg6JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICBhZGRyOiRkc3QpXT47DQorZGVmIEFEQzY0bWkzMiA6IFJJaTMyPDB4ODEsIE1STTJtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIGk2NGkzMmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJhZGN7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkZSAobG9hZCBhZGRyOiRkc3QpLCBpNjRpbW1TRXh0MzI6JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICBhZGRyOiRkc3QpXT47DQorfSAvLyBVc2VzID0gW0VGTEFHU10NCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorLy8gUmVnaXN0ZXItUmVnaXN0ZXIgU3VidHJhY3Rpb24NCitkZWYgU1VCNjRyciAgOiBSSTwweDI5LCBNUk1EZXN0UmVnLCAob3V0cyBHUjY0OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJzdWJ7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChYODZzdWJfZmxhZyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSldPjsNCisNCitsZXQgaXNDb2RlR2VuT25seSA9IDEgaW4gew0KK2RlZiBTVUI2NHJyX1JFViA6IFJJPDB4MkIsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAic3Vie3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+Ow0KK30NCisNCisvLyBSZWdpc3Rlci1NZW1vcnkgU3VidHJhY3Rpb24NCitkZWYgU1VCNjRybSAgOiBSSTwweDJCLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAic3Vie3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywgDQorICAgICAgICAgICAgICAgICAgICAgICAgKFg4NnN1Yl9mbGFnIEdSNjQ6JHNyYzEsIChsb2FkIGFkZHI6JHNyYzIpKSldPjsNCisNCisvLyBSZWdpc3Rlci1JbnRlZ2VyIFN1YnRyYWN0aW9uDQorZGVmIFNVQjY0cmk4IDogUklpODwweDgzLCBNUk01ciwgKG91dHMgR1I2NDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIGk2NGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJzdWJ7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2c3ViX2ZsYWcgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpKV0+Ow0KK2RlZiBTVUI2NHJpMzIgOiBSSWkzMjwweDgxLCBNUk01ciwgKG91dHMgR1I2NDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0aTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgInN1YntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2c3ViX2ZsYWcgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKSldPjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCINCisNCitkZWYgU1VCNjRpMzIgOiBSSWkzMjwweDJELCBSYXdGcm0sIChvdXRzKSwgKGlucyBpNjRpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInN1YntxfVx0eyRzcmMsICVyYXh8JXJheCwgJHNyY30iLCBbXT47DQorDQorLy8gTWVtb3J5LVJlZ2lzdGVyIFN1YnRyYWN0aW9uDQorZGVmIFNVQjY0bXIgIDogUkk8MHgyOSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBHUjY0OiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgInN1YntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViIChsb2FkIGFkZHI6JGRzdCksIEdSNjQ6JHNyYzIpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKw0KKy8vIE1lbW9yeS1JbnRlZ2VyIFN1YnRyYWN0aW9uDQorZGVmIFNVQjY0bWk4IDogUklpODwweDgzLCBNUk01bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBpNjRpOGltbSA6JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICJzdWJ7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViIChsb2FkIGFkZHI6JGRzdCksIGk2NGltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KK2RlZiBTVUI2NG1pMzIgOiBSSWkzMjwweDgxLCBNUk01bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBpNjRpMzJpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAic3Vie3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViIChsb2FkIGFkZHI6JGRzdCksIGk2NGltbVNFeHQzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorDQorbGV0IFVzZXMgPSBbRUZMQUdTXSBpbiB7DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KK2RlZiBTQkI2NHJyICAgIDogUkk8MHgxOSwgTVJNRGVzdFJlZywgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInNiYntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChzdWJlIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpKV0+Ow0KKw0KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorZGVmIFNCQjY0cnJfUkVWIDogUkk8MHgxQiwgTVJNU3JjUmVnLCAob3V0cyBHUjY0OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJzYmJ7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT47DQorfQ0KKyAgICAgICAgICAgICAgICAgICAgIA0KK2RlZiBTQkI2NHJtICA6IFJJPDB4MUIsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJzYmJ7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHN1YmUgR1I2NDokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KKw0KK2RlZiBTQkI2NHJpOCA6IFJJaTg8MHg4MywgTVJNM3IsIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic2Jie3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHN1YmUgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpKV0+Ow0KK2RlZiBTQkI2NHJpMzIgOiBSSWkzMjwweDgxLCBNUk0zciwgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0aTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgInNiYntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHN1YmUgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKSldPjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCINCisNCitkZWYgU0JCNjRpMzIgOiBSSWkzMjwweDFELCBSYXdGcm0sIChvdXRzKSwgKGlucyBpNjRpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInNiYntxfVx0eyRzcmMsICVyYXh8JXJheCwgJHNyY30iLCBbXT47DQorDQorZGVmIFNCQjY0bXIgIDogUkk8MHgxOSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBHUjY0OiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgInNiYntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViZSAobG9hZCBhZGRyOiRkc3QpLCBHUjY0OiRzcmMyKSwgYWRkcjokZHN0KV0+Ow0KK2RlZiBTQkI2NG1pOCA6IFJJaTg8MHg4MywgTVJNM20sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgaTY0aThpbW0gOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgICAic2Jie3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICBbKHN0b3JlIChzdWJlIChsb2FkIGFkZHI6JGRzdCksIGk2NGltbVNFeHQ4OiRzcmMyKSwgYWRkcjokZHN0KV0+Ow0KK2RlZiBTQkI2NG1pMzIgOiBSSWkzMjwweDgxLCBNUk0zbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBpNjRpMzJpbW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICAgInNiYntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICBbKHN0b3JlIChzdWJlIChsb2FkIGFkZHI6JGRzdCksIGk2NGltbVNFeHQzMjokc3JjMiksIGFkZHI6JGRzdCldPjsNCit9IC8vIFVzZXMgPSBbRUZMQUdTXQ0KK30gLy8gRGVmcyA9IFtFRkxBR1NdDQorDQorLy8gVW5zaWduZWQgbXVsdGlwbGljYXRpb24NCitsZXQgRGVmcyA9IFtSQVgsUkRYLEVGTEFHU10sIFVzZXMgPSBbUkFYXSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4gew0KK2RlZiBNVUw2NHIgOiBSSTwweEY3LCBNUk00ciwgKG91dHMpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICJtdWx7cX1cdCRzcmMiLCBbXT47ICAgICAgICAgLy8gUkFYLFJEWCA9IFJBWCpHUjY0DQorbGV0IG1heUxvYWQgPSAxIGluDQorZGVmIE1VTDY0bSA6IFJJPDB4RjcsIE1STTRtLCAob3V0cyksIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibXVse3F9XHQkc3JjIiwgW10+OyAgICAgICAgIC8vIFJBWCxSRFggPSBSQVgqW21lbTY0XQ0KKw0KKy8vIFNpZ25lZCBtdWx0aXBsaWNhdGlvbg0KK2RlZiBJTVVMNjRyIDogUkk8MHhGNywgTVJNNXIsIChvdXRzKSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImltdWx7cX1cdCRzcmMiLCBbXT47ICAgICAgICAgLy8gUkFYLFJEWCA9IFJBWCpHUjY0DQorbGV0IG1heUxvYWQgPSAxIGluDQorZGVmIElNVUw2NG0gOiBSSTwweEY3LCBNUk01bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICJpbXVse3F9XHQkc3JjIiwgW10+OyAgICAgICAgIC8vIFJBWCxSRFggPSBSQVgqW21lbTY0XQ0KK30NCisNCitsZXQgRGVmcyA9IFtFRkxBR1NdIGluIHsNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4NCisvLyBSZWdpc3Rlci1SZWdpc3RlciBTaWduZWQgSW50ZWdlciBNdWx0aXBsaWNhdGlvbg0KK2RlZiBJTVVMNjRyciA6IFJJPDB4QUYsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImltdWx7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChYODZzbXVsX2ZsYWcgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpXT4sIFRCOw0KKw0KKy8vIFJlZ2lzdGVyLU1lbW9yeSBTaWduZWQgSW50ZWdlciBNdWx0aXBsaWNhdGlvbg0KK2RlZiBJTVVMNjRybSA6IFJJPDB4QUYsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiaW11bHtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgKFg4NnNtdWxfZmxhZyBHUjY0OiRzcmMxLCAobG9hZCBhZGRyOiRzcmMyKSkpXT4sIFRCOw0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0Ig0KKw0KKy8vIFN1cHJpc2luZ2x5IGVub3VnaCwgdGhlc2UgYXJlIG5vdCB0d28gYWRkcmVzcyBpbnN0cnVjdGlvbnMhDQorDQorLy8gUmVnaXN0ZXItSW50ZWdlciBTaWduZWQgSW50ZWdlciBNdWx0aXBsaWNhdGlvbg0KK2RlZiBJTVVMNjRycmk4IDogUklpODwweDZCLCBNUk1TcmNSZWcsICAgICAgICAgICAgICAgICAgICAgIC8vIEdSNjQgPSBHUjY0Kkk4DQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiaW11bHtxfVx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZzbXVsX2ZsYWcgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpKV0+Ow0KK2RlZiBJTVVMNjRycmkzMiA6IFJJaTMyPDB4NjksIE1STVNyY1JlZywgICAgICAgICAgICAgICAgICAgIC8vIEdSNjQgPSBHUjY0KkkzMg0KKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0aTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiaW11bHtxfVx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NnNtdWxfZmxhZyBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0MzI6JHNyYzIpKV0+Ow0KKw0KKy8vIE1lbW9yeS1JbnRlZ2VyIFNpZ25lZCBJbnRlZ2VyIE11bHRpcGxpY2F0aW9uDQorZGVmIElNVUw2NHJtaTggOiBSSWk4PDB4NkIsIE1STVNyY01lbSwgICAgICAgICAgICAgICAgICAgICAgLy8gR1I2NCA9IFttZW02NF0qSTgNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpNjRtZW06JHNyYzEsIGk2NGk4aW1tOiAkc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJpbXVse3F9XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NnNtdWxfZmxhZyAobG9hZCBhZGRyOiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRpbW1TRXh0ODokc3JjMikpXT47DQorZGVmIElNVUw2NHJtaTMyIDogUklpMzI8MHg2OSwgTVJNU3JjTWVtLCAgICAgICAgICAgICAgICAgICAvLyBHUjY0ID0gW21lbTY0XSpJMzINCisgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIGk2NG1lbTokc3JjMSwgaTY0aTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiaW11bHtxfVx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2c211bF9mbGFnIChsb2FkIGFkZHI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0aW1tU0V4dDMyOiRzcmMyKSldPjsNCit9IC8vIERlZnMgPSBbRUZMQUdTXQ0KKw0KKy8vIFVuc2lnbmVkIGRpdmlzaW9uIC8gcmVtYWluZGVyDQorbGV0IERlZnMgPSBbUkFYLFJEWCxFRkxBR1NdLCBVc2VzID0gW1JBWCxSRFhdIGluIHsNCisvLyBSRFg6UkFYL3I2NCA9IFJBWCxSRFgNCitkZWYgRElWNjRyIDogUkk8MHhGNywgTVJNNnIsIChvdXRzKSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAiZGl2e3F9XHQkc3JjIiwgW10+Ow0KKy8vIFNpZ25lZCBkaXZpc2lvbiAvIHJlbWFpbmRlcg0KKy8vIFJEWDpSQVgvcjY0ID0gUkFYLFJEWA0KK2RlZiBJRElWNjRyOiBSSTwweEY3LCBNUk03ciwgKG91dHMpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICJpZGl2e3F9XHQkc3JjIiwgW10+Ow0KK2xldCBtYXlMb2FkID0gMSBpbiB7DQorLy8gUkRYOlJBWC9bbWVtNjRdID0gUkFYLFJEWA0KK2RlZiBESVY2NG0gOiBSSTwweEY3LCBNUk02bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgImRpdntxfVx0JHNyYyIsIFtdPjsNCisvLyBSRFg6UkFYL1ttZW02NF0gPSBSQVgsUkRYDQorZGVmIElESVY2NG06IFJJPDB4RjcsIE1STTdtLCAob3V0cyksIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAiaWRpdntxfVx0JHNyYyIsIFtdPjsNCit9DQorfQ0KKw0KKy8vIFVuYXJ5IGluc3RydWN0aW9ucw0KK2xldCBEZWZzID0gW0VGTEFHU10sIENvZGVTaXplID0gMiBpbiB7DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiBpbg0KK2RlZiBORUc2NHIgOiBSSTwweEY3LCBNUk0zciwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLCAibmVne3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoaW5lZyBHUjY0OiRzcmMpKSwNCisgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorZGVmIE5FRzY0bSA6IFJJPDB4RjcsIE1STTNtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QpLCAibmVne3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgWyhzdG9yZSAoaW5lZyAobG9hZGk2NCBhZGRyOiRkc3QpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiwgaXNDb252ZXJ0aWJsZVRvVGhyZWVBZGRyZXNzID0gMSBpbg0KK2RlZiBJTkM2NHIgOiBSSTwweEZGLCBNUk0wciwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLCAiaW5je3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBFRkxBR1MsIChYODZpbmNfZmxhZyBHUjY0OiRzcmMpKV0+Ow0KK2RlZiBJTkM2NG0gOiBSSTwweEZGLCBNUk0wbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwgImluY3txfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZGk2NCBhZGRyOiRkc3QpLCAxKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiwgaXNDb252ZXJ0aWJsZVRvVGhyZWVBZGRyZXNzID0gMSBpbg0KK2RlZiBERUM2NHIgOiBSSTwweEZGLCBNUk0xciwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLCAiZGVje3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBFRkxBR1MsIChYODZkZWNfZmxhZyBHUjY0OiRzcmMpKV0+Ow0KK2RlZiBERUM2NG0gOiBSSTwweEZGLCBNUk0xbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwgImRlY3txfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZGk2NCBhZGRyOiRkc3QpLCAtMSksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKw0KKy8vIEluIDY0LWJpdCBtb2RlLCBzaW5nbGUgYnl0ZSBJTkMgYW5kIERFQyBjYW5ub3QgYmUgZW5jb2RlZC4NCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiLCBpc0NvbnZlcnRpYmxlVG9UaHJlZUFkZHJlc3MgPSAxIGluIHsNCisvLyBDYW4gdHJhbnNmb3JtIGludG8gTEVBLg0KK2RlZiBJTkM2NF8xNnIgOiBJPDB4RkYsIE1STTByLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksIA0KKyAgICAgICAgICAgICAgICAgICJpbmN7d31cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2aW5jX2ZsYWcgR1IxNjokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgT3BTaXplLCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCitkZWYgSU5DNjRfMzJyIDogSTwweEZGLCBNUk0wciwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMpLCANCisgICAgICAgICAgICAgICAgICAiaW5je2x9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmluY19mbGFnIEdSMzI6JHNyYykpXT4sDQorICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KK2RlZiBERUM2NF8xNnIgOiBJPDB4RkYsIE1STTFyLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksIA0KKyAgICAgICAgICAgICAgICAgICJkZWN7d31cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2ZGVjX2ZsYWcgR1IxNjokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgT3BTaXplLCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCitkZWYgREVDNjRfMzJyIDogSTwweEZGLCBNUk0xciwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMpLCANCisgICAgICAgICAgICAgICAgICAiZGVje2x9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmRlY19mbGFnIEdSMzI6JHNyYykpXT4sDQorICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiLCBpc0NvbnZlcnRpYmxlVG9UaHJlZUFkZHJlc3MNCisNCisvLyBUaGVzZSBhcmUgZHVwbGljYXRlcyBvZiB0aGVpciAzMi1iaXQgY291bnRlcnBhcnRzLiBPbmx5IG5lZWRlZCBzbyBYODYga25vd3MNCisvLyBob3cgdG8gdW5mb2xkIHRoZW0uDQorZGVmIElOQzY0XzE2bSA6IEk8MHhGRiwgTVJNMG0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCksICJpbmN7d31cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZGkxNiBhZGRyOiRkc3QpLCAxKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT4sDQorICAgICAgICAgICAgICAgIE9wU2l6ZSwgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorZGVmIElOQzY0XzMybSA6IEk8MHhGRiwgTVJNMG0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCksICJpbmN7bH1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZGkzMiBhZGRyOiRkc3QpLCAxKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT4sDQorICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KK2RlZiBERUM2NF8xNm0gOiBJPDB4RkYsIE1STTFtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLCAiZGVje3d9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGQgKGxvYWRpMTYgYWRkcjokZHN0KSwgLTEpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwNCisgICAgICAgICAgICAgICAgT3BTaXplLCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCitkZWYgREVDNjRfMzJtIDogSTwweEZGLCBNUk0xbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwgImRlY3tsfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkaTMyIGFkZHI6JGRzdCksIC0xKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT4sDQorICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KK30gLy8gRGVmcyA9IFtFRkxBR1NdLCBDb2RlU2l6ZQ0KKw0KKw0KK2xldCBEZWZzID0gW0VGTEFHU10gaW4gew0KKy8vIFNoaWZ0IGluc3RydWN0aW9ucw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCitsZXQgVXNlcyA9IFtDTF0gaW4NCitkZWYgU0hMNjRyQ0wgOiBSSTwweEQzLCBNUk00ciwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAic2hse3F9XHR7JWNsLCAkZHN0fCRkc3QsICVDTH0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNobCBHUjY0OiRzcmMxLCBDTCkpXT47DQorbGV0IGlzQ29udmVydGlibGVUb1RocmVlQWRkcmVzcyA9IDEgaW4gICAvLyBDYW4gdHJhbnNmb3JtIGludG8gTEVBLg0KK2RlZiBTSEw2NHJpICA6IFJJaTg8MHhDMSwgTVJNNHIsIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic2hse3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNobCBHUjY0OiRzcmMxLCAoaTggaW1tOiRzcmMyKSkpXT47DQorLy8gTk9URTogV2UgZG9uJ3QgaW5jbHVkZSBwYXR0ZXJucyBmb3Igc2hpZnRzIG9mIGEgcmVnaXN0ZXIgYnkgb25lLCBiZWNhdXNlDQorLy8gJ2FkZCByZWcscmVnJyBpcyBjaGVhcGVyLg0KK2RlZiBTSEw2NHIxICA6IFJJPDB4RDEsIE1STTRyLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInNobHtxfVx0JGRzdCIsIFtdPjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCINCisNCitsZXQgVXNlcyA9IFtDTF0gaW4NCitkZWYgU0hMNjRtQ0wgOiBSSTwweEQzLCBNUk00bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAic2hse3F9XHR7JWNsLCAkZHN0fCRkc3QsICVDTH0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNobCAobG9hZGk2NCBhZGRyOiRkc3QpLCBDTCksIGFkZHI6JGRzdCldPjsNCitkZWYgU0hMNjRtaSA6IFJJaTg8MHhDMSwgTVJNNG0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgaThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgInNobHtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc2hsIChsb2FkaTY0IGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpXT47DQorZGVmIFNITDY0bTEgOiBSSTwweEQxLCBNUk00bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAic2hse3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNobCAobG9hZGk2NCBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KK2xldCBVc2VzID0gW0NMXSBpbg0KK2RlZiBTSFI2NHJDTCA6IFJJPDB4RDMsIE1STTVyLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICJzaHJ7cX1cdHslY2wsICRkc3R8JGRzdCwgJUNMfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoc3JsIEdSNjQ6JHNyYzEsIENMKSldPjsNCitkZWYgU0hSNjRyaSA6IFJJaTg8MHhDMSwgTVJNNXIsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJzaHJ7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNybCBHUjY0OiRzcmMxLCAoaTggaW1tOiRzcmMyKSkpXT47DQorZGVmIFNIUjY0cjEgIDogUkk8MHhEMSwgTVJNNXIsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSksDQorICAgICAgICAgICAgICAgICAic2hye3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNybCBHUjY0OiRzcmMxLCAoaTggMSkpKV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0Ig0KKw0KK2xldCBVc2VzID0gW0NMXSBpbg0KK2RlZiBTSFI2NG1DTCA6IFJJPDB4RDMsIE1STTVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICJzaHJ7cX1cdHslY2wsICRkc3R8JGRzdCwgJUNMfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3JsIChsb2FkaTY0IGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+Ow0KK2RlZiBTSFI2NG1pIDogUklpODwweEMxLCBNUk01bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAic2hye3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChzcmwgKGxvYWRpNjQgYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCldPjsNCitkZWYgU0hSNjRtMSA6IFJJPDB4RDEsIE1STTVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICJzaHJ7cX1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3JsIChsb2FkaTY0IGFkZHI6JGRzdCksIChpOCAxKSksIGFkZHI6JGRzdCldPjsNCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorbGV0IFVzZXMgPSBbQ0xdIGluDQorZGVmIFNBUjY0ckNMIDogUkk8MHhEMywgTVJNN3IsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSksDQorICAgICAgICAgICAgICAgICAic2Fye3F9XHR7JWNsLCAkZHN0fCRkc3QsICVDTH0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoc3JhIEdSNjQ6JHNyYzEsIENMKSldPjsNCitkZWYgU0FSNjRyaSAgOiBSSWk4PDB4QzEsIE1STTdyLCAob3V0cyBHUjY0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic2Fye3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNyYSBHUjY0OiRzcmMxLCAoaTggaW1tOiRzcmMyKSkpXT47DQorZGVmIFNBUjY0cjEgIDogUkk8MHhEMSwgTVJNN3IsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSksDQorICAgICAgICAgICAgICAgICAic2Fye3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHNyYSBHUjY0OiRzcmMxLCAoaTggMSkpKV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiDQorDQorbGV0IFVzZXMgPSBbQ0xdIGluDQorZGVmIFNBUjY0bUNMIDogUkk8MHhEMywgTVJNN20sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgInNhcntxfVx0eyVjbCwgJGRzdHwkZHN0LCAlQ0x9IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNyYSAobG9hZGk2NCBhZGRyOiRkc3QpLCBDTCksIGFkZHI6JGRzdCldPjsNCitkZWYgU0FSNjRtaSAgOiBSSWk4PDB4QzEsIE1STTdtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgInNhcntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3JhIChsb2FkaTY0IGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpXT47DQorZGVmIFNBUjY0bTEgOiBSSTwweEQxLCBNUk03bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAic2Fye3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNyYSAobG9hZGk2NCBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT47DQorDQorLy8gUm90YXRlIGluc3RydWN0aW9ucw0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjID0gJGRzdCIgaW4gew0KK2RlZiBSQ0w2NHIxIDogUkk8MHhEMSwgTVJNMnIsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICJyY2x7cX1cdHsxLCAkZHN0fCRkc3QsIDF9IiwgW10+Ow0KK2RlZiBSQ0w2NHJpIDogUklpODwweEMxLCBNUk0yciwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMsIGk4aW1tOiRjbnQpLA0KKyAgICAgICAgICAgICAgICAgICAicmNse3F9XHR7JGNudCwgJGRzdHwkZHN0LCAkY250fSIsIFtdPjsNCisNCitkZWYgUkNSNjRyMSA6IFJJPDB4RDEsIE1STTNyLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAicmNye3F9XHR7MSwgJGRzdHwkZHN0LCAxfSIsIFtdPjsNCitkZWYgUkNSNjRyaSA6IFJJaTg8MHhDMSwgTVJNM3IsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjLCBpOGltbTokY250KSwNCisgICAgICAgICAgICAgICAgICAgInJjcntxfVx0eyRjbnQsICRkc3R8JGRzdCwgJGNudH0iLCBbXT47DQorDQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgUkNMNjRyQ0wgOiBSSTwweEQzLCBNUk0yciwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJyY2x7cX1cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwgW10+Ow0KK2RlZiBSQ1I2NHJDTCA6IFJJPDB4RDMsIE1STTNyLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgInJjcntxfVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLCBbXT47DQorfQ0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYyA9ICRkc3QiDQorDQorZGVmIFJDTDY0bTEgOiBSSTwweEQxLCBNUk0ybSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJyY2x7cX1cdHsxLCAkZHN0fCRkc3QsIDF9IiwgW10+Ow0KK2RlZiBSQ0w2NG1pIDogUklpODwweEMxLCBNUk0ybSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBpOGltbTokY250KSwNCisgICAgICAgICAgICAgICAgICAgInJjbHtxfVx0eyRjbnQsICRkc3R8JGRzdCwgJGNudH0iLCBbXT47DQorZGVmIFJDUjY0bTEgOiBSSTwweEQxLCBNUk0zbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJyY3J7cX1cdHsxLCAkZHN0fCRkc3QsIDF9IiwgW10+Ow0KK2RlZiBSQ1I2NG1pIDogUklpODwweEMxLCBNUk0zbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBpOGltbTokY250KSwNCisgICAgICAgICAgICAgICAgICAgInJjcntxfVx0eyRjbnQsICRkc3R8JGRzdCwgJGNudH0iLCBbXT47DQorDQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgUkNMNjRtQ0wgOiBSSTwweEQzLCBNUk0ybSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAicmNse3F9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsIFtdPjsNCitkZWYgUkNSNjRtQ0wgOiBSSTwweEQzLCBNUk0zbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAicmNye3F9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsIFtdPjsNCit9DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KK2xldCBVc2VzID0gW0NMXSBpbg0KK2RlZiBST0w2NHJDTCA6IFJJPDB4RDMsIE1STTByLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICJyb2x7cX1cdHslY2wsICRkc3R8JGRzdCwgJUNMfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAocm90bCBHUjY0OiRzcmMxLCBDTCkpXT47DQorZGVmIFJPTDY0cmkgIDogUklpODwweEMxLCBNUk0wciwgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJyb2x7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAocm90bCBHUjY0OiRzcmMxLCAoaTggaW1tOiRzcmMyKSkpXT47DQorZGVmIFJPTDY0cjEgIDogUkk8MHhEMSwgTVJNMHIsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSksDQorICAgICAgICAgICAgICAgICAgInJvbHtxfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAocm90bCBHUjY0OiRzcmMxLCAoaTggMSkpKV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0Ig0KKw0KK2xldCBVc2VzID0gW0NMXSBpbg0KK2RlZiBST0w2NG1DTCA6ICBSSTwweEQzLCBNUk0wbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInJvbHtxfVx0eyVjbCwgJGRzdHwkZHN0LCAlQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90bCAobG9hZGk2NCBhZGRyOiRkc3QpLCBDTCksIGFkZHI6JGRzdCldPjsNCitkZWYgUk9MNjRtaSAgOiBSSWk4PDB4QzEsIE1STTBtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgInJvbHtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIChyb3RsIChsb2FkaTY0IGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpXT47DQorZGVmIFJPTDY0bTEgIDogUkk8MHhEMSwgTVJNMG0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAicm9se3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICBbKHN0b3JlIChyb3RsIChsb2FkaTY0IGFkZHI6JGRzdCksIChpOCAxKSksIGFkZHI6JGRzdCldPjsNCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorbGV0IFVzZXMgPSBbQ0xdIGluDQorZGVmIFJPUjY0ckNMIDogUkk8MHhEMywgTVJNMXIsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSksDQorICAgICAgICAgICAgICAgICAgInJvcntxfVx0eyVjbCwgJGRzdHwkZHN0LCAlQ0x9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChyb3RyIEdSNjQ6JHNyYzEsIENMKSldPjsNCitkZWYgUk9SNjRyaSAgOiBSSWk4PDB4QzEsIE1STTFyLCAob3V0cyBHUjY0OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInJvcntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChyb3RyIEdSNjQ6JHNyYzEsIChpOCBpbW06JHNyYzIpKSldPjsNCitkZWYgUk9SNjRyMSAgOiBSSTwweEQxLCBNUk0xciwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAicm9ye3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChyb3RyIEdSNjQ6JHNyYzEsIChpOCAxKSkpXT47DQorfSAvLyBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiDQorDQorbGV0IFVzZXMgPSBbQ0xdIGluDQorZGVmIFJPUjY0bUNMIDogUkk8MHhEMywgTVJNMW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICJyb3J7cX1cdHslY2wsICRkc3R8JGRzdCwgJUNMfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90ciAobG9hZGk2NCBhZGRyOiRkc3QpLCBDTCksIGFkZHI6JGRzdCldPjsNCitkZWYgUk9SNjRtaSAgOiBSSWk4PDB4QzEsIE1STTFtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgInJvcntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIChyb3RyIChsb2FkaTY0IGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpXT47DQorZGVmIFJPUjY0bTEgIDogUkk8MHhEMSwgTVJNMW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAicm9ye3F9XHQkZHN0IiwNCisgICAgICAgICAgICAgICBbKHN0b3JlIChyb3RyIChsb2FkaTY0IGFkZHI6JGRzdCksIChpOCAxKSksIGFkZHI6JGRzdCldPjsNCisNCisvLyBEb3VibGUgc2hpZnQgaW5zdHJ1Y3Rpb25zIChnZW5lcmFsaXphdGlvbnMgb2Ygcm90YXRlKQ0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCitsZXQgVXNlcyA9IFtDTF0gaW4gew0KK2RlZiBTSExENjRyckNMIDogUkk8MHhBNSwgTVJNRGVzdFJlZywgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInNobGR7cX1cdHslY2wsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAlQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NnNobGQgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwgQ0wpKV0+LCANCisgICAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBTSFJENjRyckNMIDogUkk8MHhBRCwgTVJNRGVzdFJlZywgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInNocmR7cX1cdHslY2wsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAlQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NnNocmQgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwgQ0wpKV0+LCANCisgICAgICAgICAgICAgICAgICAgIFRCOw0KK30NCisNCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7ICAvLyBGSVhNRTogVXBkYXRlIFg4Nkluc3RySW5mbzo6Y29tbXV0ZUluc3RydWN0aW9uDQorZGVmIFNITEQ2NHJyaTggOiBSSWk4PDB4QTQsIE1STURlc3RSZWcsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIsIGk4aW1tOiRzcmMzKSwNCisgICAgICAgICAgICAgICAgICAgICAgInNobGR7cX1cdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NnNobGQgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTggaW1tOiRzcmMzKSkpXT4sDQorICAgICAgICAgICAgICAgICBUQjsNCitkZWYgU0hSRDY0cnJpOCA6IFJJaTg8MHhBQywgTVJNRGVzdFJlZywNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAic2hyZHtxfVx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2c2hyZCBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpOCBpbW06JHNyYzMpKSldPiwNCisgICAgICAgICAgICAgICAgIFRCOw0KK30gLy8gaXNDb21tdXRhYmxlDQorfSAvLyBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiDQorDQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgU0hMRDY0bXJDTCA6IFJJPDB4QTUsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic2hsZHtxfVx0eyVjbCwgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICVDTH0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2hsZCAobG9hZGk2NCBhZGRyOiRkc3QpLCBHUjY0OiRzcmMyLCBDTCksDQorICAgICAgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCldPiwgVEI7DQorZGVmIFNIUkQ2NG1yQ0wgOiBSSTwweEFELCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInNocmR7cX1cdHslY2wsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAlQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKFg4NnNocmQgKGxvYWRpNjQgYWRkcjokZHN0KSwgR1I2NDokc3JjMiwgQ0wpLA0KKyAgICAgICAgICAgICAgICAgICAgICBhZGRyOiRkc3QpXT4sIFRCOw0KK30NCitkZWYgU0hMRDY0bXJpOCA6IFJJaTg8MHhBNCwgTVJNRGVzdE1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBHUjY0OiRzcmMyLCBpOGltbTokc3JjMyksDQorICAgICAgICAgICAgICAgICAgICAgICJzaGxke3F9XHR7JHNyYzMsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAkc3JjM30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChYODZzaGxkIChsb2FkaTY0IGFkZHI6JGRzdCksIEdSNjQ6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IGltbTokc3JjMykpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICBUQjsNCitkZWYgU0hSRDY0bXJpOCA6IFJJaTg8MHhBQywgTVJNRGVzdE1lbSwgDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgR1I2NDokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAic2hyZHtxfVx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2hyZCAobG9hZGk2NCBhZGRyOiRkc3QpLCBHUjY0OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpOCBpbW06JHNyYzMpKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgVEI7DQorfSAvLyBEZWZzID0gW0VGTEFHU10NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBMb2dpY2FsIEluc3RydWN0aW9ucy4uLg0KKy8vDQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiAsIEFkZGVkQ29tcGxleGl0eSA9IDE1IGluDQorZGVmIE5PVDY0ciA6IFJJPDB4RjcsIE1STTJyLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksICJub3R7cX1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChub3QgR1I2NDokc3JjKSldPjsNCitkZWYgTk9UNjRtIDogUkk8MHhGNywgTVJNMm0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCksICJub3R7cX1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIChub3QgKGxvYWRpNjQgYWRkcjokZHN0KSksIGFkZHI6JGRzdCldPjsNCisNCitsZXQgRGVmcyA9IFtFRkxBR1NdIGluIHsNCitkZWYgQU5ENjRpMzIgOiBSSWkzMjwweDI1LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpNjRpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgImFuZHtxfVx0eyRzcmMsICVyYXh8JXJheCwgJHNyY30iLCBbXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KK2xldCBpc0NvbW11dGFibGUgPSAxIGluDQorZGVmIEFORDY0cnIgIDogUkk8MHgyMSwgTVJNRGVzdFJlZywgDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiYW5ke3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAoWDg2YW5kX2ZsYWcgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpXT47DQorbGV0IGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCitkZWYgQU5ENjRycl9SRVYgOiBSSTwweDIzLCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgImFuZHtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPjsNCit9DQorZGVmIEFORDY0cm0gIDogUkk8MHgyMywgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiYW5ke3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAoWDg2YW5kX2ZsYWcgR1I2NDokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBBTkQ2NHJpOCA6IFJJaTg8MHg4MywgTVJNNHIsIA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYW5ke3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NmFuZF9mbGFnIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKSldPjsNCitkZWYgQU5ENjRyaTMyICA6IFJJaTMyPDB4ODEsIE1STTRyLCANCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0aTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJhbmR7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2YW5kX2ZsYWcgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKSldPjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCINCisNCitkZWYgQU5ENjRtciAgOiBSSTwweDIxLCBNUk1EZXN0TWVtLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgR1I2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAiYW5ke3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYW5kIChsb2FkIGFkZHI6JGRzdCksIEdSNjQ6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorZGVmIEFORDY0bWk4IDogUklpODwweDgzLCBNUk00bSwNCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgaTY0aThpbW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgImFuZHtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYW5kIChsb2FkIGFkZHI6JGRzdCksIGk2NGltbVNFeHQ4OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorZGVmIEFORDY0bWkzMiAgOiBSSWkzMjwweDgxLCBNUk00bSwNCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgaTY0aTMyaW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgImFuZHtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICBbKHN0b3JlIChhbmQgKGxvYWRpNjQgYWRkcjokZHN0KSwgaTY0aW1tU0V4dDMyOiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4NCitkZWYgT1I2NHJyICAgOiBSSTwweDA5LCBNUk1EZXN0UmVnLCAob3V0cyBHUjY0OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJvcntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgKFg4Nm9yX2ZsYWcgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpXT47DQorbGV0IGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCitkZWYgT1I2NHJyX1JFViA6IFJJPDB4MEIsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgIm9ye3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+Ow0KK30NCitkZWYgT1I2NHJtICAgOiBSSTwweDBCLCBNUk1TcmNNZW0gLCAob3V0cyBHUjY0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAib3J7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChYODZvcl9mbGFnIEdSNjQ6JHNyYzEsIChsb2FkIGFkZHI6JHNyYzIpKSldPjsNCitkZWYgT1I2NHJpOCAgOiBSSWk4PDB4ODMsIE1STTFyLCAob3V0cyBHUjY0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAib3J7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgKFg4Nm9yX2ZsYWcgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpKV0+Ow0KK2RlZiBPUjY0cmkzMiA6IFJJaTMyPDB4ODEsIE1STTFyLCAob3V0cyBHUjY0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0aTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAib3J7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChYODZvcl9mbGFnIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQzMjokc3JjMikpXT47DQorfSAvLyBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiDQorDQorZGVmIE9SNjRtciA6IFJJPDB4MDksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgR1I2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgIm9ye3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgIFsoc3RvcmUgKG9yIChsb2FkIGFkZHI6JGRzdCksIEdSNjQ6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KK2RlZiBPUjY0bWk4ICA6IFJJaTg8MHg4MywgTVJNMW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgaTY0aThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAib3J7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIChvciAobG9hZCBhZGRyOiRkc3QpLCBpNjRpbW1TRXh0ODokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCitkZWYgT1I2NG1pMzIgOiBSSWkzMjwweDgxLCBNUk0xbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBpNjRpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgIm9ye3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICBbKHN0b3JlIChvciAobG9hZGk2NCBhZGRyOiRkc3QpLCBpNjRpbW1TRXh0MzI6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisNCitkZWYgT1I2NGkzMiA6IFJJaTMyPDB4MEQsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGk2NGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJvcntxfVx0eyRzcmMsICVyYXh8JXJheCwgJHNyY30iLCBbXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KK2xldCBpc0NvbW11dGFibGUgPSAxIGluDQorZGVmIFhPUjY0cnIgIDogUkk8MHgzMSwgTVJNRGVzdFJlZywgIChvdXRzIEdSNjQ6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICJ4b3J7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChYODZ4b3JfZmxhZyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSldPjsNCitsZXQgaXNDb2RlR2VuT25seSA9IDEgaW4gew0KK2RlZiBYT1I2NHJyX1JFViA6IFJJPDB4MzMsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJ4b3J7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT47DQorfQ0KK2RlZiBYT1I2NHJtICA6IFJJPDB4MzMsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAieG9ye3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAoWDg2eG9yX2ZsYWcgR1I2NDokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBYT1I2NHJpOCA6IFJJaTg8MHg4MywgTVJNNnIsICAob3V0cyBHUjY0OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInhvcntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZ4b3JfZmxhZyBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0ODokc3JjMikpXT47DQorZGVmIFhPUjY0cmkzMiA6IFJJaTMyPDB4ODEsIE1STTZyLCANCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRpMzJpbW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICAgInhvcntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2eG9yX2ZsYWcgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKSldPjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCINCisNCitkZWYgWE9SNjRtciAgOiBSSTwweDMxLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgInhvcntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHhvciAobG9hZCBhZGRyOiRkc3QpLCBHUjY0OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KK2RlZiBYT1I2NG1pOCA6IFJJaTg8MHg4MywgTVJNNm0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgaTY0aThpbW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgInhvcntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoeG9yIChsb2FkIGFkZHI6JGRzdCksIGk2NGltbVNFeHQ4OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorZGVmIFhPUjY0bWkzMiA6IFJJaTMyPDB4ODEsIE1STTZtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIGk2NGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgInhvcntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICBbKHN0b3JlICh4b3IgKGxvYWRpNjQgYWRkcjokZHN0KSwgaTY0aW1tU0V4dDMyOiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisgICAgICAgICAgICAgIA0KK2RlZiBYT1I2NGkzMiA6IFJJaTMyPDB4MzUsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGk2NGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAieG9ye3F9XHR7JHNyYywgJXJheHwlcmF4LCAkc3JjfSIsIFtdPjsNCisNCit9IC8vIERlZnMgPSBbRUZMQUdTXQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIENvbXBhcmlzb24gSW5zdHJ1Y3Rpb25zLi4uDQorLy8NCisNCisvLyBJbnRlZ2VyIGNvbXBhcmlzb24NCitsZXQgRGVmcyA9IFtFRkxBR1NdIGluIHsNCitkZWYgVEVTVDY0aTMyIDogUklpMzI8MHhhOSwgUmF3RnJtLCAob3V0cyksIChpbnMgaTY0aTMyaW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAidGVzdHtxfVx0eyRzcmMsICVyYXh8JXJheCwgJHNyY30iLCBbXT47DQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4NCitkZWYgVEVTVDY0cnIgOiBSSTwweDg1LCBNUk1TcmNSZWcsIChvdXRzKSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAidGVzdHtxfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgKGFuZCBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwgMCkpXT47DQorZGVmIFRFU1Q2NHJtIDogUkk8MHg4NSwgTVJNU3JjTWVtLCAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAidGVzdHtxfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgKGFuZCBHUjY0OiRzcmMxLCAobG9hZGk2NCBhZGRyOiRzcmMyKSksDQorICAgICAgICAgICAgICAgICAgICAwKSldPjsNCitkZWYgVEVTVDY0cmkzMiA6IFJJaTMyPDB4RjcsIE1STTByLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaTY0aTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0e3F9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCAoYW5kIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgIDApKV0+Ow0KK2RlZiBURVNUNjRtaTMyIDogUklpMzI8MHhGNywgTVJNMG0sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBpNjRtZW06JHNyYzEsIGk2NGkzMmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAidGVzdHtxfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChhbmQgKGxvYWRpNjQgYWRkcjokc3JjMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NGltbVNFeHQzMjokc3JjMiksIDApKV0+Ow0KKw0KKw0KK2RlZiBDTVA2NGkzMiA6IFJJaTMyPDB4M0QsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGk2NGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAiY21we3F9XHR7JHNyYywgJXJheHwlcmF4LCAkc3JjfSIsIFtdPjsNCitkZWYgQ01QNjRyciA6IFJJPDB4MzksIE1STURlc3RSZWcsIChvdXRzKSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJjbXB7cX1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgR1I2NDokc3JjMSwgR1I2NDokc3JjMikpXT47DQorDQorLy8gVGhlc2UgYXJlIGFsdGVybmF0ZSBzcGVsbGluZ3MgZm9yIHVzZSBieSB0aGUgZGlzYXNzZW1ibGVyLCB3ZSBtYXJrIHRoZW0gYXMNCisvLyBjb2RlIGdlbiBvbmx5IHRvIGVuc3VyZSB0aGV5IGFyZW4ndCBtYXRjaGVkIGJ5IHRoZSBhc3NlbWJsZXIuDQorbGV0IGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCisgIGRlZiBDTVA2NG1ybXJyIDogUkk8MHgzQiwgTVJNU3JjUmVnLCAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJjbXB7cX1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIFtdPjsNCit9DQorDQorZGVmIENNUDY0bXIgOiBSSTwweDM5LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJjbXB7cX1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIpKV0+Ow0KK2RlZiBDTVA2NHJtIDogUkk8MHgzQiwgTVJNU3JjTWVtLCAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJjbXB7cX1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBDTVA2NHJpOCA6IFJJaTg8MHg4MywgTVJNN3IsIChvdXRzKSwgKGlucyBHUjY0OiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiY21we3F9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKSldPjsNCitkZWYgQ01QNjRyaTMyIDogUklpMzI8MHg4MSwgTVJNN3IsIChvdXRzKSwgKGlucyBHUjY0OiRzcmMxLCBpNjRpMzJpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY21we3F9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKSldPjsNCitkZWYgQ01QNjRtaTggOiBSSWk4PDB4ODMsIE1STTdtLCAob3V0cyksIChpbnMgaTY0bWVtOiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiY21we3F9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChsb2FkaTY0IGFkZHI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NGltbVNFeHQ4OiRzcmMyKSldPjsNCitkZWYgQ01QNjRtaTMyIDogUklpMzI8MHg4MSwgTVJNN20sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGk2NG1lbTokc3JjMSwgaTY0aTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgImNtcHtxfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChsb2FkaTY0IGFkZHI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0aW1tU0V4dDMyOiRzcmMyKSldPjsNCit9IC8vIERlZnMgPSBbRUZMQUdTXQ0KKw0KKy8vIEJpdCB0ZXN0cy4NCisvLyBUT0RPOiBCVEMsIEJUUiwgYW5kIEJUUw0KK2xldCBEZWZzID0gW0VGTEFHU10gaW4gew0KK2RlZiBCVDY0cnIgOiBSSTwweEEzLCBNUk1EZXN0UmVnLCAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgImJ0e3F9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmJ0IEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpKV0+LCBUQjsNCisNCisvLyBVbmxpa2Ugd2l0aCB0aGUgcmVnaXN0ZXIrcmVnaXN0ZXIgZm9ybSwgdGhlIG1lbW9yeStyZWdpc3RlciBmb3JtIG9mIHRoZQ0KKy8vIGJ0IGluc3RydWN0aW9uIGRvZXMgbm90IGlnbm9yZSB0aGUgaGlnaCBiaXRzIG9mIHRoZSBpbmRleC4gRnJvbSBJU2VsJ3MNCisvLyBwZXJzcGVjdGl2ZSwgdGhpcyBpcyBwcmV0dHkgYml6YXJyZS4gRGlzYWJsZSB0aGVzZSBpbnN0cnVjdGlvbnMgZm9yIG5vdy4NCitkZWYgQlQ2NG1yIDogUkk8MHhBMywgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgImJ0e3F9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKy8vICAgICAgICAgICAgICAgWyhYODZidCAobG9hZGk2NCBhZGRyOiRzcmMxKSwgR1I2NDokc3JjMiksDQorLy8gICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldDQorICAgICAgICAgICAgICAgIFtdDQorICAgICAgICAgICAgICAgID4sIFRCOw0KKw0KK2RlZiBCVDY0cmk4IDogSWk4PDB4QkEsIE1STTRyLCAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgaTY0aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiYnR7cX1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmJ0IEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKSldPiwgVEIsDQorCQlSRVhfVzsNCisvLyBOb3RlIHRoYXQgdGhlc2UgaW5zdHJ1Y3Rpb25zIGRvbid0IG5lZWQgRmFzdEJUTWVtIGJlY2F1c2UgdGhhdA0KKy8vIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBvdGhlciBvcGVyYW5kIGlzIGluIGEgcmVnaXN0ZXIuIFdoZW4gaXQncw0KKy8vIGFuIGltbWVkaWF0ZSwgYnQgaXMgc3RpbGwgZmFzdC4NCitkZWYgQlQ2NG1pOCA6IElpODwweEJBLCBNUk00bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokc3JjMSwgaTY0aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiYnR7cX1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmJ0IChsb2FkaTY0IGFkZHI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRpbW1TRXh0ODokc3JjMikpXT4sIFRCOw0KKw0KK2RlZiBCVEM2NHJyIDogUkk8MHhCQiwgTVJNRGVzdFJlZywgKG91dHMpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImJ0Y3txfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRDNjRtciA6IFJJPDB4QkIsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImJ0Y3txfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRDNjRyaTggOiBSSWk4PDB4QkEsIE1STTdyLCAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgaTY0aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImJ0Y3txfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRDNjRtaTggOiBSSWk4PDB4QkEsIE1STTdtLCAob3V0cyksIChpbnMgaTY0bWVtOiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYnRje3F9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIFRCOw0KKw0KK2RlZiBCVFI2NHJyIDogUkk8MHhCMywgTVJNRGVzdFJlZywgKG91dHMpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImJ0cntxfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRSNjRtciA6IFJJPDB4QjMsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImJ0cntxfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRSNjRyaTggOiBSSWk4PDB4QkEsIE1STTZyLCAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgaTY0aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImJ0cntxfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRSNjRtaTggOiBSSWk4PDB4QkEsIE1STTZtLCAob3V0cyksIChpbnMgaTY0bWVtOiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYnRye3F9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIFRCOw0KKw0KK2RlZiBCVFM2NHJyIDogUkk8MHhBQiwgTVJNRGVzdFJlZywgKG91dHMpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImJ0c3txfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRTNjRtciA6IFJJPDB4QUIsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImJ0c3txfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRTNjRyaTggOiBSSWk4PDB4QkEsIE1STTVyLCAob3V0cyksIChpbnMgR1I2NDokc3JjMSwgaTY0aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImJ0c3txfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRTNjRtaTggOiBSSWk4PDB4QkEsIE1STTVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRzcmMxLCBpNjRpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYnRze3F9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIFRCOw0KK30gLy8gRGVmcyA9IFtFRkxBR1NdDQorDQorLy8gQ29uZGl0aW9uYWwgbW92ZXMNCitsZXQgVXNlcyA9IFtFRkxBR1NdLCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7DQorZGVmIENNT1ZCNjRyciA6IFJJPDB4NDIsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPHUsIEdSNjQgPSBHUjY0DQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92YntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfQiwgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZBRTY0cnI6IFJJPDB4NDMsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPj11LCBHUjY0ID0gR1I2NA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21vdmFle3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9BRSwgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZFNjRyciA6IFJJPDB4NDQsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPT0sIEdSNjQgPSBHUjY0DQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92ZXtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfRSwgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZORTY0cnI6IFJJPDB4NDUsIE1STVNyY1JlZywgICAgICAgLy8gaWYgIT0sIEdSNjQgPSBHUjY0DQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92bmV7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTkUsIEVGTEFHUykpXT4sIFRCOw0KK2RlZiBDTU9WQkU2NHJyOiBSSTwweDQ2LCBNUk1TcmNSZWcsICAgICAgIC8vIGlmIDw9dSwgR1I2NCA9IEdSNjQNCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3ZiZXtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9CRSwgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZBNjRyciA6IFJJPDB4NDcsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPnUsIEdSNjQgPSBHUjY0DQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92YXtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9BLCBFRkxBR1MpKV0+LCBUQjsNCitkZWYgQ01PVkw2NHJyIDogUkk8MHg0QywgTVJNU3JjUmVnLCAgICAgICAvLyBpZiA8cywgR1I2NCA9IEdSNjQNCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3Zse3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0wsIEVGTEFHUykpXT4sIFRCOw0KK2RlZiBDTU9WR0U2NHJyOiBSSTwweDRELCBNUk1TcmNSZWcsICAgICAgIC8vIGlmID49cywgR1I2NCA9IEdSNjQNCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3ZnZXtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9HRSwgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZMRTY0cnI6IFJJPDB4NEUsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPD1zLCBHUjY0ID0gR1I2NA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21vdmxle3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0xFLCBFRkxBR1MpKV0+LCBUQjsNCitkZWYgQ01PVkc2NHJyIDogUkk8MHg0RiwgTVJNU3JjUmVnLCAgICAgICAvLyBpZiA+cywgR1I2NCA9IEdSNjQNCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3Zne3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0csIEVGTEFHUykpXT4sIFRCOw0KK2RlZiBDTU9WUzY0cnIgOiBSSTwweDQ4LCBNUk1TcmNSZWcsICAgICAgIC8vIGlmIHNpZ25lZCwgR1I2NCA9IEdSNjQNCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3Zze3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX1MsIEVGTEFHUykpXT4sIFRCOw0KK2RlZiBDTU9WTlM2NHJyOiBSSTwweDQ5LCBNUk1TcmNSZWcsICAgICAgIC8vIGlmICFzaWduZWQsIEdSNjQgPSBHUjY0DQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92bnN7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTlMsIEVGTEFHUykpXT4sIFRCOw0KK2RlZiBDTU9WUDY0cnIgOiBSSTwweDRBLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmIHBhcml0eSwgR1I2NCA9IEdSNjQNCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3Zwe3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX1AsIEVGTEFHUykpXT4sIFRCOw0KK2RlZiBDTU9WTlA2NHJyIDogUkk8MHg0QiwgTVJNU3JjUmVnLCAgICAgICAvLyBpZiAhcGFyaXR5LCBHUjY0ID0gR1I2NA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21vdm5we3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgR1I2NDokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTlAsIEVGTEFHUykpXT4sIFRCOw0KK2RlZiBDTU9WTzY0cnIgOiBSSTwweDQwLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmIG92ZXJmbG93LCBHUjY0ID0gR1I2NA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21vdm97cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTywgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZOTzY0cnIgOiBSSTwweDQxLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmICFvdmVyZmxvdywgR1I2NCA9IEdSNjQNCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3Zub3txfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX05PLCBFRkxBR1MpKV0+LCBUQjsNCit9IC8vIGlzQ29tbXV0YWJsZSA9IDENCisNCitkZWYgQ01PVkI2NHJtIDogUkk8MHg0MiwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA8dSwgR1I2NCA9IFttZW02NF0NCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21vdmJ7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIChsb2FkaTY0IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9CLCBFRkxBR1MpKV0+LCBUQjsNCitkZWYgQ01PVkFFNjRybTogUkk8MHg0MywgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA+PXUsIEdSNjQgPSBbbWVtNjRdDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3ZhZXtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0FFLCBFRkxBR1MpKV0+LCBUQjsNCitkZWYgQ01PVkU2NHJtIDogUkk8MHg0NCwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA9PSwgR1I2NCA9IFttZW02NF0NCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21vdmV7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIChsb2FkaTY0IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9FLCBFRkxBR1MpKV0+LCBUQjsNCitkZWYgQ01PVk5FNjRybTogUkk8MHg0NSwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiAhPSwgR1I2NCA9IFttZW02NF0NCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21vdm5le3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCAobG9hZGk2NCBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9ORSwgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZCRTY0cm06IFJJPDB4NDYsIE1STVNyY01lbSwgICAgICAgLy8gaWYgPD11LCBHUjY0ID0gW21lbTY0XQ0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92YmV7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIChsb2FkaTY0IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0JFLCBFRkxBR1MpKV0+LCBUQjsNCitkZWYgQ01PVkE2NHJtIDogUkk8MHg0NywgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA+dSwgR1I2NCA9IFttZW02NF0NCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21vdmF7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIChsb2FkaTY0IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0EsIEVGTEFHUykpXT4sIFRCOw0KK2RlZiBDTU9WTDY0cm0gOiBSSTwweDRDLCBNUk1TcmNNZW0sICAgICAgIC8vIGlmIDxzLCBHUjY0ID0gW21lbTY0XQ0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92bHtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTCwgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZHRTY0cm06IFJJPDB4NEQsIE1STVNyY01lbSwgICAgICAgLy8gaWYgPj1zLCBHUjY0ID0gW21lbTY0XQ0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92Z2V7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIChsb2FkaTY0IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0dFLCBFRkxBR1MpKV0+LCBUQjsNCitkZWYgQ01PVkxFNjRybTogUkk8MHg0RSwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA8PXMsIEdSNjQgPSBbbWVtNjRdDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3ZsZXtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTEUsIEVGTEFHUykpXT4sIFRCOw0KK2RlZiBDTU9WRzY0cm0gOiBSSTwweDRGLCBNUk1TcmNNZW0sICAgICAgIC8vIGlmID5zLCBHUjY0ID0gW21lbTY0XQ0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92Z3txfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfRywgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZTNjRybSA6IFJJPDB4NDgsIE1STVNyY01lbSwgICAgICAgLy8gaWYgc2lnbmVkLCBHUjY0ID0gW21lbTY0XQ0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92c3txfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfUywgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZOUzY0cm06IFJJPDB4NDksIE1STVNyY01lbSwgICAgICAgLy8gaWYgIXNpZ25lZCwgR1I2NCA9IFttZW02NF0NCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21vdm5ze3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCAobG9hZGk2NCBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9OUywgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZQNjRybSA6IFJJPDB4NEEsIE1STVNyY01lbSwgICAgICAgLy8gaWYgcGFyaXR5LCBHUjY0ID0gW21lbTY0XQ0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92cHtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKFg4NmNtb3YgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfUCwgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZOUDY0cm0gOiBSSTwweDRCLCBNUk1TcmNNZW0sICAgICAgIC8vIGlmICFwYXJpdHksIEdSNjQgPSBbbWVtNjRdDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3ZucHtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZjbW92IEdSNjQ6JHNyYzEsIChsb2FkaTY0IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9OUCwgRUZMQUdTKSldPiwgVEI7DQorZGVmIENNT1ZPNjRybSA6IFJJPDB4NDAsIE1STVNyY01lbSwgICAgICAgLy8gaWYgb3ZlcmZsb3csIEdSNjQgPSBbbWVtNjRdDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtb3Zve3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCAobG9hZGk2NCBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9PLCBFRkxBR1MpKV0+LCBUQjsNCitkZWYgQ01PVk5PNjRybSA6IFJJPDB4NDEsIE1STVNyY01lbSwgICAgICAgLy8gaWYgIW92ZXJmbG93LCBHUjY0ID0gW21lbTY0XQ0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbW92bm97cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoWDg2Y21vdiBHUjY0OiRzcmMxLCAobG9hZGk2NCBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTk8sIEVGTEFHUykpXT4sIFRCOw0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0Ig0KKw0KKy8vIFVzZSBzYmIgdG8gbWF0ZXJpYWxpemUgY2FycnkgZmxhZyBpbnRvIGEgR1BSLg0KKy8vIEZJWE1FOiBUaGlzIGFyZSBwc2V1ZG8gb3BzIHRoYXQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggUGF0PD4gcGF0dGVybnMuDQorLy8gSG93ZXZlciwgUGF0PD4gY2FuJ3QgcmVwbGljYXRlIHRoZSBkZXN0aW5hdGlvbiByZWcgaW50byB0aGUgaW5wdXRzIG9mIHRoZQ0KKy8vIHJlc3VsdC4NCisvLyBGSVhNRTogQ2hhbmdlIHRoaXMgdG8gaGF2ZSBlbmNvZGluZyBQc2V1ZG8gd2hlbiBYODZNQ0NvZGVFbWl0dGVyIHJlcGxhY2VzDQorLy8gWDg2Q29kZUVtaXR0ZXIuDQorbGV0IERlZnMgPSBbRUZMQUdTXSwgVXNlcyA9IFtFRkxBR1NdLCBpc0NvZGVHZW5Pbmx5ID0gMSBpbg0KK2RlZiBTRVRCX0M2NHIgOiBSSTwweDE5LCBNUk1Jbml0UmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zKSwgIiIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChYODZzZXRjY19jIFg4Nl9DT05EX0IsIEVGTEFHUykpXT47DQorDQorZGVmIDogUGF0PChpNjQgKGFueWV4dCAoaTggKFg4NnNldGNjX2MgWDg2X0NPTkRfQiwgRUZMQUdTKSkpKSwNCisgICAgICAgICAgKFNFVEJfQzY0cik+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRGVzY3JpcHRvci10YWJsZSBzdXBwb3J0IGluc3RydWN0aW9ucw0KKw0KKy8vIExMRFQgaXMgbm90IGludGVycHJldGVkIHNwZWNpYWxseSBpbiA2NC1iaXQgbW9kZSBiZWNhdXNlIHRoZXJlIGlzIG5vIHNpZ24NCisvLyAgIGV4dGVuc2lvbi4NCitkZWYgU0xEVDY0ciA6IFJJPDB4MDAsIE1STTByLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICJzbGR0e3F9XHQkZHN0IiwgW10+LCBUQjsNCitkZWYgU0xEVDY0bSA6IFJJPDB4MDAsIE1STTBtLCAob3V0cyBpMTZtZW06JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgInNsZHR7cX1cdCRkc3QiLCBbXT4sIFRCOw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQWxpYXMgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBXZSB3YW50IHRvIHJld3JpdGUgTU9WNjRyMCBpbiB0ZXJtcyBvZiBNT1YzMnIwLCBiZWNhdXNlIGl0J3Mgc29tZXRpbWVzIGENCisvLyBzbWFsbGVyIGVuY29kaW5nLCBidXQgZG9pbmcgc28gYXQgaXNlbCB0aW1lIGludGVyZmVyZXMgd2l0aCByZW1hdGVyaWFsaXphdGlvbg0KKy8vIGluIHRoZSBjdXJyZW50IHJlZ2lzdGVyIGFsbG9jYXRvci4gRm9yIG5vdywgdGhpcyBpcyByZXdyaXR0ZW4gd2hlbiB0aGUNCisvLyBpbnN0cnVjdGlvbiBpcyBsb3dlcmVkIHRvIGFuIE1DSW5zdC4NCisvLyBGSVhNRTogQWRkZWRDb21wbGV4aXR5IGdpdmVzIHRoaXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBNT1Y2NHJpMzIuIFJlbW92ZQ0KKy8vIHdoZW4gd2UgaGF2ZSBhIGJldHRlciB3YXkgdG8gc3BlY2lmeSBpc2VsIHByaW9yaXR5Lg0KK2xldCBEZWZzID0gW0VGTEFHU10sDQorICAgIEFkZGVkQ29tcGxleGl0eSA9IDEsIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEsIGlzQXNDaGVhcEFzQU1vdmUgPSAxIGluDQorZGVmIE1PVjY0cjAgICA6IEk8MHgzMSwgTVJNSW5pdFJlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyksICIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAwKV0+Ow0KKw0KKy8vIE1hdGVyaWFsaXplIGk2NCBjb25zdGFudCB3aGVyZSB0b3AgMzItYml0cyBhcmUgemVyby4gVGhpcyBjb3VsZCB0aGVvcmV0aWNhbGx5DQorLy8gdXNlIE1PVjMycmkgd2l0aCBhIFNVQlJFR19UT19SRUcgdG8gcmVwcmVzZW50IHRoZSB6ZXJvLWV4dGVuc2lvbiwgaG93ZXZlcg0KKy8vIHRoYXQgd291bGQgbWFrZSBpdCBtb3JlIGRpZmZpY3VsdCB0byByZW1hdGVyaWFsaXplLg0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAxLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxLCBpc0FzQ2hlYXBBc0FNb3ZlID0gMSBpbg0KK2RlZiBNT1Y2NHJpNjRpMzIgOiBJaTMyPDB4QjgsIEFkZFJlZ0ZybSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpNjRpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIiIsIFsoc2V0IEdSNjQ6JGRzdCwgaTY0aW1tWkV4dDMyOiRzcmMpXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBUaHJlYWQgTG9jYWwgU3RvcmFnZSBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIEVMRiBUTFMgU3VwcG9ydA0KKy8vIEFsbCBjYWxscyBjbG9iYmVyIHRoZSBub24tY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4gUlNQIGlzIG1hcmtlZCBhcw0KKy8vIGEgdXNlIHRvIHByZXZlbnQgc3RhY2stcG9pbnRlciBhc3NpZ25tZW50cyB0aGF0IGFwcGVhciBpbW1lZGlhdGVseQ0KKy8vIGJlZm9yZSBjYWxscyBmcm9tIHBvdGVudGlhbGx5IGFwcGVhcmluZyBkZWFkLg0KK2xldCBEZWZzID0gW1JBWCwgUkNYLCBSRFgsIFJTSSwgUkRJLCBSOCwgUjksIFIxMCwgUjExLA0KKyAgICAgICAgICAgIEZQMCwgRlAxLCBGUDIsIEZQMywgRlA0LCBGUDUsIEZQNiwgU1QwLCBTVDEsDQorICAgICAgICAgICAgTU0wLCBNTTEsIE1NMiwgTU0zLCBNTTQsIE1NNSwgTU02LCBNTTcsDQorICAgICAgICAgICAgWE1NMCwgWE1NMSwgWE1NMiwgWE1NMywgWE1NNCwgWE1NNSwgWE1NNiwgWE1NNywNCisgICAgICAgICAgICBYTU04LCBYTU05LCBYTU0xMCwgWE1NMTEsIFhNTTEyLCBYTU0xMywgWE1NMTQsIFhNTTE1LCBFRkxBR1NdLA0KKyAgICBVc2VzID0gW1JTUF0gaW4NCitkZWYgVExTX2FkZHI2NCA6IEk8MCwgUHNldWRvLCAob3V0cyksIChpbnMgaTY0bWVtOiRzeW0pLA0KKyAgICAgICAgICAgICAgICAgICAiLmJ5dGVcdDB4NjY7ICINCisgICAgICAgICAgICAgICAgICAgImxlYXFcdCRzeW0oJXJpcCksICVyZGk7ICINCisgICAgICAgICAgICAgICAgICAgIi53b3JkXHQweDY2NjY7ICINCisgICAgICAgICAgICAgICAgICAgInJleDY0OyAiDQorICAgICAgICAgICAgICAgICAgICJjYWxsXHRfX3Rsc19nZXRfYWRkckBQTFQiLA0KKyAgICAgICAgICAgICAgICAgIFsoWDg2dGxzYWRkciB0bHM2NGFkZHI6JHN5bSldPiwNCisgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCisNCisvLyBEYXJ3aW4gVExTIFN1cHBvcnQNCisvLyBGb3IgeDg2XzY0LCB0aGUgYWRkcmVzcyBvZiB0aGUgdGh1bmsgaXMgcGFzc2VkIGluICVyZGksIG9uIHJldHVybiANCisvLyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUgaXMgaW4gJXJheC4gIEFsbCBvdGhlciByZWdpc3RlcnMgYXJlIHByZXNlcnZlZC4NCitsZXQgRGVmcyA9IFtSQVhdLA0KKyAgICBVc2VzID0gW1JESV0sDQorICAgIHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4NCitkZWYgVExTQ2FsbF82NCA6IEk8MCwgUHNldWRvLCAob3V0cyksIChpbnMgaTY0bWVtOiRzeW0pLA0KKyAgICAgICAgICAgICAgICAgICIjIFRMU0NhbGxfNjQiLA0KKyAgICAgICAgICAgICAgICAgIFsoWDg2VExTQ2FsbCBhZGRyOiRzeW0pXT4sDQorICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDUsIGlzQ29kZUdlbk9ubHkgPSAxIGluDQorZGVmIE1PVjY0R1NybSA6IFJJPDB4OEIsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAibW92cVx0JWdzOiRzcmMsICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoZ3Nsb2FkIGFkZHI6JHNyYykpXT4sIFNlZ0dTOw0KKw0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSA1LCBpc0NvZGVHZW5Pbmx5ID0gMSBpbg0KK2RlZiBNT1Y2NEZTcm0gOiBSSTwweDhCLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgIm1vdnFcdCVmczokc3JjLCAkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGZzbG9hZCBhZGRyOiRzcmMpKV0+LCBTZWdGUzsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEF0b21pYyBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIFRPRE86IEdldCB0aGlzIHRvIGZvbGQgdGhlIGNvbnN0YW50IGludG8gdGhlIGluc3RydWN0aW9uLiAgICAgICAgICAgDQorbGV0IGhhc1NpZGVFZmZlY3RzID0gMSwgRGVmcyA9IFtFU1BdIGluDQorZGVmIEludF9NZW1CYXJyaWVyTm9TU0U2NCAgOiBSSTwweDA5LCBNUk0xciwgKG91dHMpLCAoaW5zIEdSNjQ6JHplcm8pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3J7cX1cdHskemVybywgKCVyc3ApfCglcnNwKSwgJHplcm99IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFg4Nk1lbUJhcnJpZXJOb1NTRSBHUjY0OiR6ZXJvKV0+LA0KKwkJCQkJCQkJCQkJCQkgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT4sIExPQ0s7DQorDQorbGV0IERlZnMgPSBbUkFYLCBFRkxBR1NdLCBVc2VzID0gW1JBWF0gaW4gew0KK2RlZiBMQ01QWENIRzY0IDogUkk8MHhCMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokcHRyLCBHUjY0OiRzd2FwKSwNCisgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgImNtcHhjaGdxXHQkc3dhcCwkcHRyIiwNCisgICAgICAgICAgICAgICBbKFg4NmNhcyBhZGRyOiRwdHIsIEdSNjQ6JHN3YXAsIDgpXT4sIFRCLCBMT0NLOw0KK30NCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHZhbCA9ICRkc3QiIGluIHsNCitsZXQgRGVmcyA9IFtFRkxBR1NdIGluDQorZGVmIExYQURENjQgOiBSSTwweEMxLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokdmFsLGk2NG1lbTokcHRyKSwNCisgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgInhhZGRcdCR2YWwsICRwdHIiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGF0b21pY19sb2FkX2FkZF82NCBhZGRyOiRwdHIsIEdSNjQ6JHZhbCkpXT4sDQorICAgICAgICAgICAgICAgIFRCLCBMT0NLOw0KKw0KK2RlZiBYQ0hHNjRybSA6IFJJPDB4ODcsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiR2YWwsaTY0bWVtOiRwdHIpLA0KKyAgICAgICAgICAgICAgICAgICJ4Y2hne3F9XHR7JHZhbCwgJHB0cnwkcHRyLCAkdmFsfSIsIA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGF0b21pY19zd2FwXzY0IGFkZHI6JHB0ciwgR1I2NDokdmFsKSldPjsNCisNCitkZWYgWENIRzY0cnIgOiBSSTwweDg3LCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokdmFsLEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgInhjaGd7cX1cdHskdmFsLCAkc3JjfCRzcmMsICR2YWx9IiwgW10+Ow0KK30NCisNCitkZWYgWEFERDY0cnIgIDogUkk8MHhDMSwgTVJNRGVzdFJlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAieGFkZHtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KK2xldCBtYXlMb2FkID0gMSwgbWF5U3RvcmUgPSAxIGluDQorZGVmIFhBREQ2NHJtICA6IFJJPDB4QzEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgR1I2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgInhhZGR7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCisgICAgICAgICAgICAgICAgICAgDQorZGVmIENNUFhDSEc2NHJyICA6IFJJPDB4QjEsIE1STURlc3RSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImNtcHhjaGd7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitsZXQgbWF5TG9hZCA9IDEsIG1heVN0b3JlID0gMSBpbg0KK2RlZiBDTVBYQ0hHNjRybSAgOiBSSTwweEIxLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJjbXB4Y2hne3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorICAgICAgICAgICAgICAgICAgICAgIA0KK2xldCBEZWZzID0gW1JBWCwgUkRYLCBFRkxBR1NdLCBVc2VzID0gW1JBWCwgUkJYLCBSQ1gsIFJEWF0gaW4NCitkZWYgQ01QWENIRzE2QiA6IFJJPDB4QzcsIE1STTFtLCAob3V0cyksIChpbnMgaTEyOG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICJjbXB4Y2hnMTZiXHQkZHN0IiwgW10+LCBUQjsNCisNCitkZWYgWENIRzY0YXIgOiBSSTwweDkwLCBBZGRSZWdGcm0sIChvdXRzKSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJ4Y2hne3F9XHR7JHNyYywgJXJheHwlcmF4LCAkc3JjfSIsIFtdPjsNCisNCisvLyBPcHRpbWl6ZWQgY29kZWdlbiB3aGVuIHRoZSBub24tbWVtb3J5IG91dHB1dCBpcyBub3QgdXNlZC4NCitsZXQgRGVmcyA9IFtFRkxBR1NdLCBtYXlMb2FkID0gMSwgbWF5U3RvcmUgPSAxIGluIHsNCisvLyBGSVhNRTogVXNlIG5vcm1hbCBhZGQgLyBzdWIgaW5zdHJ1Y3Rpb25zIGFuZCBhZGQgbG9jayBwcmVmaXggZHluYW1pY2FsbHkuDQorZGVmIExPQ0tfQURENjRtciA6IFJJPDB4MDMsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgImFkZHtxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPiwgTE9DSzsNCitkZWYgTE9DS19BREQ2NG1pOCA6IFJJaTg8MHg4MywgTVJNMG0sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTY0bWVtOiRkc3QsIGk2NGk4aW1tIDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAiYWRke3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBMT0NLOw0KK2RlZiBMT0NLX0FERDY0bWkzMiA6IFJJaTMyPDB4ODEsIE1STTBtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTY0bWVtOiRkc3QsIGk2NGkzMmltbSA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAgICJhZGR7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIExPQ0s7DQorZGVmIExPQ0tfU1VCNjRtciA6IFJJPDB4MjksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgR1I2NDokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAgICJzdWJ7cX1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIExPQ0s7DQorZGVmIExPQ0tfU1VCNjRtaTggOiBSSWk4PDB4ODMsIE1STTVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGk2NG1lbTokZHN0LCBpNjRpOGltbSA6JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICAgImxvY2tcblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgICAic3Vie3F9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBMT0NLOw0KK2RlZiBMT0NLX1NVQjY0bWkzMiA6IFJJaTMyPDB4ODEsIE1STTVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTY0bWVtOiRkc3QsIGk2NGkzMmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgInN1YntxfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPiwgTE9DSzsNCitkZWYgTE9DS19JTkM2NG0gOiBSSTwweEZGLCBNUk0wbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAgImluY3txfVx0JGRzdCIsIFtdPiwgTE9DSzsNCitkZWYgTE9DS19ERUM2NG0gOiBSSTwweEZGLCBNUk0xbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgImxvY2tcblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgICAiZGVje3F9XHQkZHN0IiwgW10+LCBMT0NLOw0KK30NCisvLyBBdG9taWMgZXhjaGFuZ2UsIGFuZCwgb3IsIHhvcg0KK2xldCBDb25zdHJhaW50cyA9ICIkdmFsID0gJGRzdCIsIERlZnMgPSBbRUZMQUdTXSwNCisgICAgICAgICAgICAgICAgICB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxIGluIHsNCitkZWYgQVRPTUFORDY0IDogSTwwLCBQc2V1ZG8sIChvdXRzIEdSNjQ6JGRzdCksKGlucyBpNjRtZW06JHB0ciwgR1I2NDokdmFsKSwNCisgICAgICAgICAgICAgICAiI0FUT01BTkQ2NCBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoYXRvbWljX2xvYWRfYW5kXzY0IGFkZHI6JHB0ciwgR1I2NDokdmFsKSldPjsNCitkZWYgQVRPTU9SNjQgOiBJPDAsIFBzZXVkbywgKG91dHMgR1I2NDokZHN0KSwoaW5zIGk2NG1lbTokcHRyLCBHUjY0OiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTU9SNjQgUFNFVURPISIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGF0b21pY19sb2FkX29yXzY0IGFkZHI6JHB0ciwgR1I2NDokdmFsKSldPjsNCitkZWYgQVRPTVhPUjY0IDogSTwwLCBQc2V1ZG8sKG91dHMgR1I2NDokZHN0KSwoaW5zIGk2NG1lbTokcHRyLCBHUjY0OiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTVhPUjY0IFBTRVVETyEiLCANCisgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsIChhdG9taWNfbG9hZF94b3JfNjQgYWRkcjokcHRyLCBHUjY0OiR2YWwpKV0+Ow0KK2RlZiBBVE9NTkFORDY0IDogSTwwLCBQc2V1ZG8sKG91dHMgR1I2NDokZHN0KSwoaW5zIGk2NG1lbTokcHRyLCBHUjY0OiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTU5BTkQ2NCBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoYXRvbWljX2xvYWRfbmFuZF82NCBhZGRyOiRwdHIsIEdSNjQ6JHZhbCkpXT47DQorZGVmIEFUT01NSU42NDogSTwwLCBQc2V1ZG8sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTY0bWVtOiRwdHIsIEdSNjQ6JHZhbCksDQorICAgICAgICAgICAgICAgIiNBVE9NTUlONjQgUFNFVURPISIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGF0b21pY19sb2FkX21pbl82NCBhZGRyOiRwdHIsIEdSNjQ6JHZhbCkpXT47DQorZGVmIEFUT01NQVg2NDogSTwwLCBQc2V1ZG8sIChvdXRzIEdSNjQ6JGRzdCksKGlucyBpNjRtZW06JHB0ciwgR1I2NDokdmFsKSwNCisgICAgICAgICAgICAgICAiI0FUT01NQVg2NCBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoYXRvbWljX2xvYWRfbWF4XzY0IGFkZHI6JHB0ciwgR1I2NDokdmFsKSldPjsNCitkZWYgQVRPTVVNSU42NDogSTwwLCBQc2V1ZG8sIChvdXRzIEdSNjQ6JGRzdCksKGlucyBpNjRtZW06JHB0ciwgR1I2NDokdmFsKSwNCisgICAgICAgICAgICAgICAiI0FUT01VTUlONjQgUFNFVURPISIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKGF0b21pY19sb2FkX3VtaW5fNjQgYWRkcjokcHRyLCBHUjY0OiR2YWwpKV0+Ow0KK2RlZiBBVE9NVU1BWDY0OiBJPDAsIFBzZXVkbywgKG91dHMgR1I2NDokZHN0KSwoaW5zIGk2NG1lbTokcHRyLCBHUjY0OiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTVVNQVg2NCBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoYXRvbWljX2xvYWRfdW1heF82NCBhZGRyOiRwdHIsIEdSNjQ6JHZhbCkpXT47DQorfQ0KKw0KKy8vIFNlZ21lbnRhdGlvbiBzdXBwb3J0IGluc3RydWN0aW9ucw0KKw0KKy8vIGkxNm1lbSBvcGVyYW5kIGluIExBUjY0cm0gYW5kIEdSMzIgb3BlcmFuZCBpbiBMQVIzMnJyIGlzIG5vdCBhIHR5cG8uDQorZGVmIExBUjY0cm0gOiBSSTwweDAyLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTE2bWVtOiRzcmMpLCANCisgICAgICAgICAgICAgICAgICJsYXJ7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitkZWYgTEFSNjRyciA6IFJJPDB4MDIsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImxhcntxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KKyAgICAgICAgICAgICAgICAgDQorZGVmIExTTDY0cm0gOiBSSTwweDAzLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImxzbHtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOyANCitkZWYgTFNMNjRyciA6IFJJPDB4MDMsIE1STVNyY1JlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImxzbHtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KKw0KK2RlZiBTV0FQR1MgOiBJPDB4MDEsIE1STV9GOCwgKG91dHMpLCAoaW5zKSwgInN3YXBncyIsIFtdPiwgVEI7DQorDQorZGVmIFBVU0hGUzY0IDogSTwweGEwLCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAicHVzaHtxfVx0JWZzIiwgW10+LCBUQjsNCitkZWYgUFVTSEdTNjQgOiBJPDB4YTgsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICJwdXNoe3F9XHQlZ3MiLCBbXT4sIFRCOw0KKw0KK2RlZiBQT1BGUzY0IDogSTwweGExLCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICJwb3B7cX1cdCVmcyIsIFtdPiwgVEI7DQorZGVmIFBPUEdTNjQgOiBJPDB4YTksIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgInBvcHtxfVx0JWdzIiwgW10+LCBUQjsNCisgICAgICAgICAgICAgICAgIA0KK2RlZiBMU1M2NHJtIDogUkk8MHhiMiwgTVJNU3JjTWVtLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIG9wYXF1ZTgwbWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImxzc3txfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KK2RlZiBMRlM2NHJtIDogUkk8MHhiNCwgTVJNU3JjTWVtLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIG9wYXF1ZTgwbWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImxmc3txfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KK2RlZiBMR1M2NHJtIDogUkk8MHhiNSwgTVJNU3JjTWVtLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIG9wYXF1ZTgwbWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImxnc3txfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KKw0KKy8vIFNwZWNpYWxpemVkIHJlZ2lzdGVyIHN1cHBvcnQNCisNCisvLyBubyBtIGZvcm0gZW5jb2RhYmxlOyB1c2UgU01TVzE2bQ0KK2RlZiBTTVNXNjRyIDogUkk8MHgwMSwgTVJNNHIsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMpLCANCisgICAgICAgICAgICAgICAgICJzbXN3e3F9XHQkZHN0IiwgW10+LCBUQjsNCisNCisvLyBTdHJpbmcgbWFuaXB1bGF0aW9uIGluc3RydWN0aW9ucw0KKw0KK2RlZiBMT0RTUSA6IFJJPDB4QUQsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImxvZHNxIiwgW10+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTm9uLUluc3RydWN0aW9uIFBhdHRlcm5zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBDb25zdGFudFBvb2wgR2xvYmFsQWRkcmVzcywgRXh0ZXJuYWxTeW1ib2wsIGFuZCBKdW1wVGFibGUgd2hlbiBub3QgaW4gc21hbGwNCisvLyBjb2RlIG1vZGVsIG1vZGUsIHNob3VsZCB1c2UgJ21vdmFicycuICBGSVhNRTogVGhpcyBpcyByZWFsbHkgYSBoYWNrLCB0aGUNCisvLyAgJ21vdmFicycgcHJlZGljYXRlIHNob3VsZCBoYW5kbGUgdGhpcyBzb3J0IG9mIHRoaW5nLg0KK2RlZiA6IFBhdDwoaTY0IChYODZXcmFwcGVyIHRjb25zdHBvb2wgIDokZHN0KSksDQorICAgICAgICAgIChNT1Y2NHJpIHRjb25zdHBvb2wgIDokZHN0KT4sIFJlcXVpcmVzPFtGYXJEYXRhXT47DQorZGVmIDogUGF0PChpNjQgKFg4NldyYXBwZXIgdGp1bXB0YWJsZSAgOiRkc3QpKSwNCisgICAgICAgICAgKE1PVjY0cmkgdGp1bXB0YWJsZSAgOiRkc3QpPiwgUmVxdWlyZXM8W0ZhckRhdGFdPjsNCitkZWYgOiBQYXQ8KGk2NCAoWDg2V3JhcHBlciB0Z2xvYmFsYWRkciA6JGRzdCkpLA0KKyAgICAgICAgICAoTU9WNjRyaSB0Z2xvYmFsYWRkciA6JGRzdCk+LCBSZXF1aXJlczxbRmFyRGF0YV0+Ow0KK2RlZiA6IFBhdDwoaTY0IChYODZXcmFwcGVyIHRleHRlcm5hbHN5bTokZHN0KSksDQorICAgICAgICAgIChNT1Y2NHJpIHRleHRlcm5hbHN5bTokZHN0KT4sIFJlcXVpcmVzPFtGYXJEYXRhXT47DQorZGVmIDogUGF0PChpNjQgKFg4NldyYXBwZXIgdGJsb2NrYWRkcmVzczokZHN0KSksDQorICAgICAgICAgIChNT1Y2NHJpIHRibG9ja2FkZHJlc3M6JGRzdCk+LCBSZXF1aXJlczxbRmFyRGF0YV0+Ow0KKw0KKy8vIEluIHN0YXRpYyBjb2RlZ2VuIHdpdGggc21hbGwgY29kZSBtb2RlbCwgd2UgY2FuIGdldCB0aGUgYWRkcmVzcyBvZiBhIGxhYmVsDQorLy8gaW50byBhIHJlZ2lzdGVyIHdpdGggJ21vdmwnLiAgRklYTUU6IFRoaXMgaXMgYSBoYWNrLCB0aGUgJ2ltbScgcHJlZGljYXRlIG9mDQorLy8gdGhlIE1PVjY0cmk2NGkzMiBzaG91bGQgYWNjZXB0IHRoZXNlLg0KK2RlZiA6IFBhdDwoaTY0IChYODZXcmFwcGVyIHRjb25zdHBvb2wgIDokZHN0KSksDQorICAgICAgICAgIChNT1Y2NHJpNjRpMzIgdGNvbnN0cG9vbCAgOiRkc3QpPiwgUmVxdWlyZXM8W1NtYWxsQ29kZV0+Ow0KK2RlZiA6IFBhdDwoaTY0IChYODZXcmFwcGVyIHRqdW1wdGFibGUgIDokZHN0KSksDQorICAgICAgICAgIChNT1Y2NHJpNjRpMzIgdGp1bXB0YWJsZSAgOiRkc3QpPiwgUmVxdWlyZXM8W1NtYWxsQ29kZV0+Ow0KK2RlZiA6IFBhdDwoaTY0IChYODZXcmFwcGVyIHRnbG9iYWxhZGRyIDokZHN0KSksDQorICAgICAgICAgIChNT1Y2NHJpNjRpMzIgdGdsb2JhbGFkZHIgOiRkc3QpPiwgUmVxdWlyZXM8W1NtYWxsQ29kZV0+Ow0KK2RlZiA6IFBhdDwoaTY0IChYODZXcmFwcGVyIHRleHRlcm5hbHN5bTokZHN0KSksDQorICAgICAgICAgIChNT1Y2NHJpNjRpMzIgdGV4dGVybmFsc3ltOiRkc3QpPiwgUmVxdWlyZXM8W1NtYWxsQ29kZV0+Ow0KK2RlZiA6IFBhdDwoaTY0IChYODZXcmFwcGVyIHRibG9ja2FkZHJlc3M6JGRzdCkpLA0KKyAgICAgICAgICAoTU9WNjRyaTY0aTMyIHRibG9ja2FkZHJlc3M6JGRzdCk+LCBSZXF1aXJlczxbU21hbGxDb2RlXT47DQorDQorLy8gSW4ga2VybmVsIGNvZGUgbW9kZWwsIHdlIGNhbiBnZXQgdGhlIGFkZHJlc3Mgb2YgYSBsYWJlbA0KKy8vIGludG8gYSByZWdpc3RlciB3aXRoICdtb3ZxJy4gIEZJWE1FOiBUaGlzIGlzIGEgaGFjaywgdGhlICdpbW0nIHByZWRpY2F0ZSBvZg0KKy8vIHRoZSBNT1Y2NHJpMzIgc2hvdWxkIGFjY2VwdCB0aGVzZS4NCitkZWYgOiBQYXQ8KGk2NCAoWDg2V3JhcHBlciB0Y29uc3Rwb29sICA6JGRzdCkpLA0KKyAgICAgICAgICAoTU9WNjRyaTMyIHRjb25zdHBvb2wgIDokZHN0KT4sIFJlcXVpcmVzPFtLZXJuZWxDb2RlXT47DQorZGVmIDogUGF0PChpNjQgKFg4NldyYXBwZXIgdGp1bXB0YWJsZSAgOiRkc3QpKSwNCisgICAgICAgICAgKE1PVjY0cmkzMiB0anVtcHRhYmxlICA6JGRzdCk+LCBSZXF1aXJlczxbS2VybmVsQ29kZV0+Ow0KK2RlZiA6IFBhdDwoaTY0IChYODZXcmFwcGVyIHRnbG9iYWxhZGRyIDokZHN0KSksDQorICAgICAgICAgIChNT1Y2NHJpMzIgdGdsb2JhbGFkZHIgOiRkc3QpPiwgUmVxdWlyZXM8W0tlcm5lbENvZGVdPjsNCitkZWYgOiBQYXQ8KGk2NCAoWDg2V3JhcHBlciB0ZXh0ZXJuYWxzeW06JGRzdCkpLA0KKyAgICAgICAgICAoTU9WNjRyaTMyIHRleHRlcm5hbHN5bTokZHN0KT4sIFJlcXVpcmVzPFtLZXJuZWxDb2RlXT47DQorZGVmIDogUGF0PChpNjQgKFg4NldyYXBwZXIgdGJsb2NrYWRkcmVzczokZHN0KSksDQorICAgICAgICAgIChNT1Y2NHJpMzIgdGJsb2NrYWRkcmVzczokZHN0KT4sIFJlcXVpcmVzPFtLZXJuZWxDb2RlXT47DQorDQorLy8gSWYgd2UgaGF2ZSBzbWFsbCBtb2RlbCBhbmQgLXN0YXRpYyBtb2RlLCBpdCBpcyBzYWZlIHRvIHN0b3JlIGdsb2JhbCBhZGRyZXNzZXMNCisvLyBkaXJlY3RseSBhcyBpbW1lZGlhdGVzLiAgRklYTUU6IFRoaXMgaXMgcmVhbGx5IGEgaGFjaywgdGhlICdpbW0nIHByZWRpY2F0ZQ0KKy8vIGZvciBNT1Y2NG1pMzIgc2hvdWxkIGhhbmRsZSB0aGlzIHNvcnQgb2YgdGhpbmcuDQorZGVmIDogUGF0PChzdG9yZSAoaTY0IChYODZXcmFwcGVyIHRjb25zdHBvb2w6JHNyYykpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAoTU9WNjRtaTMyIGFkZHI6JGRzdCwgdGNvbnN0cG9vbDokc3JjKT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtOZWFyRGF0YSwgSXNTdGF0aWNdPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChpNjQgKFg4NldyYXBwZXIgdGp1bXB0YWJsZTokc3JjKSksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNT1Y2NG1pMzIgYWRkcjokZHN0LCB0anVtcHRhYmxlOiRzcmMpPiwNCisgICAgICAgICAgUmVxdWlyZXM8W05lYXJEYXRhLCBJc1N0YXRpY10+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKGk2NCAoWDg2V3JhcHBlciB0Z2xvYmFsYWRkcjokc3JjKSksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNT1Y2NG1pMzIgYWRkcjokZHN0LCB0Z2xvYmFsYWRkcjokc3JjKT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtOZWFyRGF0YSwgSXNTdGF0aWNdPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChpNjQgKFg4NldyYXBwZXIgdGV4dGVybmFsc3ltOiRzcmMpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1PVjY0bWkzMiBhZGRyOiRkc3QsIHRleHRlcm5hbHN5bTokc3JjKT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtOZWFyRGF0YSwgSXNTdGF0aWNdPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChpNjQgKFg4NldyYXBwZXIgdGJsb2NrYWRkcmVzczokc3JjKSksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNT1Y2NG1pMzIgYWRkcjokZHN0LCB0YmxvY2thZGRyZXNzOiRzcmMpPiwNCisgICAgICAgICAgUmVxdWlyZXM8W05lYXJEYXRhLCBJc1N0YXRpY10+Ow0KKw0KKy8vIENhbGxzDQorLy8gRGlyZWN0IFBDIHJlbGF0aXZlIGZ1bmN0aW9uIGNhbGwgZm9yIHNtYWxsIGNvZGUgbW9kZWwuIDMyLWJpdCBkaXNwbGFjZW1lbnQNCisvLyBzaWduIGV4dGVuZGVkIHRvIDY0LWJpdC4NCitkZWYgOiBQYXQ8KFg4NmNhbGwgKGk2NCB0Z2xvYmFsYWRkcjokZHN0KSksDQorICAgICAgICAgIChDQUxMNjRwY3JlbDMyIHRnbG9iYWxhZGRyOiRkc3QpPiwgUmVxdWlyZXM8W05vdFdpbjY0XT47DQorZGVmIDogUGF0PChYODZjYWxsIChpNjQgdGV4dGVybmFsc3ltOiRkc3QpKSwNCisgICAgICAgICAgKENBTEw2NHBjcmVsMzIgdGV4dGVybmFsc3ltOiRkc3QpPiwgUmVxdWlyZXM8W05vdFdpbjY0XT47DQorDQorZGVmIDogUGF0PChYODZjYWxsIChpNjQgdGdsb2JhbGFkZHI6JGRzdCkpLA0KKyAgICAgICAgICAoV0lOQ0FMTDY0cGNyZWwzMiB0Z2xvYmFsYWRkcjokZHN0KT4sIFJlcXVpcmVzPFtJc1dpbjY0XT47DQorZGVmIDogUGF0PChYODZjYWxsIChpNjQgdGV4dGVybmFsc3ltOiRkc3QpKSwNCisgICAgICAgICAgKFdJTkNBTEw2NHBjcmVsMzIgdGV4dGVybmFsc3ltOiRkc3QpPiwgUmVxdWlyZXM8W0lzV2luNjRdPjsNCisNCisvLyB0YWlsY2FsbCBzdHVmZg0KK2RlZiA6IFBhdDwoWDg2dGNyZXQgR1I2NF9UQzokZHN0LCBpbW06JG9mZiksDQorICAgICAgICAgIChUQ1JFVFVSTnJpNjQgR1I2NF9UQzokZHN0LCBpbW06JG9mZik+LA0KKwkgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KKw0KK2RlZiA6IFBhdDwoWDg2dGNyZXQgKGxvYWQgYWRkcjokZHN0KSwgaW1tOiRvZmYpLA0KKyAgICAgICAgICAoVENSRVRVUk5taTY0IGFkZHI6JGRzdCwgaW1tOiRvZmYpPiwNCisJICBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCisNCitkZWYgOiBQYXQ8KFg4NnRjcmV0IChpNjQgdGdsb2JhbGFkZHI6JGRzdCksIGltbTokb2ZmKSwNCisgICAgICAgICAgKFRDUkVUVVJOZGk2NCB0Z2xvYmFsYWRkcjokZHN0LCBpbW06JG9mZik+LA0KKwkgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KKw0KK2RlZiA6IFBhdDwoWDg2dGNyZXQgKGk2NCB0ZXh0ZXJuYWxzeW06JGRzdCksIGltbTokb2ZmKSwNCisgICAgICAgICAgKFRDUkVUVVJOZGk2NCB0ZXh0ZXJuYWxzeW06JGRzdCwgaW1tOiRvZmYpPiwNCisJICBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCisNCisvLyB0bHMgaGFzIHNvbWUgZnVubnkgc3R1ZmYgaGVyZS4uLg0KKy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gbW92YWJzICRmb29AdHBvZmYsICVyYXgNCitkZWYgOiBQYXQ8KGk2NCAoWDg2V3JhcHBlciB0Z2xvYmFsdGxzYWRkciA6JGRzdCkpLA0KKyAgICAgICAgICAoTU9WNjRyaSB0Z2xvYmFsdGxzYWRkciA6JGRzdCk+Ow0KKy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYWRkICRmb29AdHBvZmYsICVyYXgNCitkZWYgOiBQYXQ8KGFkZCBHUjY0OiRzcmMxLCAoWDg2V3JhcHBlciB0Z2xvYmFsdGxzYWRkciA6JGRzdCkpLA0KKyAgICAgICAgICAoQURENjRyaTMyIEdSNjQ6JHNyYzEsIHRnbG9iYWx0bHNhZGRyIDokZHN0KT47DQorLy8gVGhpcyBjb3JyZXNwb25kcyB0byBtb3YgZm9vQHRwb2ZmKCVyYngpLCAlZWF4DQorZGVmIDogUGF0PChsb2FkIChpNjQgKFg4NldyYXBwZXIgdGdsb2JhbHRsc2FkZHIgOiRkc3QpKSksDQorICAgICAgICAgIChNT1Y2NHJtIHRnbG9iYWx0bHNhZGRyIDokZHN0KT47DQorDQorLy8gQ29tcGFyaXNvbnMuDQorDQorLy8gVEVTVCBSLFIgaXMgc21hbGxlciB0aGFuIENNUCBSLDANCitkZWYgOiBQYXQ8KFg4NmNtcCBHUjY0OiRzcmMxLCAwKSwNCisgICAgICAgICAgKFRFU1Q2NHJyIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzEpPjsNCisNCisvLyBDb25kaXRpb25hbCBtb3ZlcyB3aXRoIGZvbGRlZCBsb2FkcyB3aXRoIG9wZXJhbmRzIHN3YXBwZWQgYW5kIGNvbmRpdGlvbnMNCisvLyBpbnZlcnRlZC4NCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX0IsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WQUU2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX0FFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkI2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX0UsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTkU2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX05FLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkU2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX0JFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkE2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX0EsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WQkU2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX0wsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WR0U2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX0dFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkw2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX0xFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkc2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX0csIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTEU2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX1AsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTlA2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX05QLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVlA2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX1MsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTlM2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX05TLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVlM2NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX08sIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTk82NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpNjQgYWRkcjokc3JjMSksIEdSNjQ6JHNyYzIsIFg4Nl9DT05EX05PLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVk82NHJtIEdSNjQ6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCisNCisvLyB6ZXh0bG9hZCBib29sIC0+IHpleHRsb2FkIGJ5dGUNCitkZWYgOiBQYXQ8KHpleHRsb2FkaTY0aTEgYWRkcjokc3JjKSwgKE1PVlpYNjRybTggYWRkcjokc3JjKT47DQorDQorLy8gZXh0bG9hZA0KKy8vIFdoZW4gZXh0bG9hZGluZyBmcm9tIDE2LWJpdCBhbmQgc21hbGxlciBtZW1vcnkgbG9jYXRpb25zIGludG8gNjQtYml0IA0KKy8vIHJlZ2lzdGVycywgdXNlIHplcm8tZXh0ZW5kaW5nIGxvYWRzIHNvIHRoYXQgdGhlIGVudGlyZSA2NC1iaXQgcmVnaXN0ZXIgaXMgDQorLy8gZGVmaW5lZCwgYXZvaWRpbmcgcGFydGlhbC1yZWdpc3RlciB1cGRhdGVzLg0KK2RlZiA6IFBhdDwoZXh0bG9hZGk2NGkxIGFkZHI6JHNyYyksICAoTU9WWlg2NHJtOCAgYWRkcjokc3JjKT47DQorZGVmIDogUGF0PChleHRsb2FkaTY0aTggYWRkcjokc3JjKSwgIChNT1ZaWDY0cm04ICBhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGV4dGxvYWRpNjRpMTYgYWRkcjokc3JjKSwgKE1PVlpYNjRybTE2IGFkZHI6JHNyYyk+Ow0KKy8vIEZvciBvdGhlciBleHRsb2FkcywgdXNlIHN1YnJlZ3MsIHNpbmNlIHRoZSBoaWdoIGNvbnRlbnRzIG9mIHRoZSByZWdpc3RlciBhcmUNCisvLyBkZWZpbmVkIGFmdGVyIGFuIGV4dGxvYWQuDQorZGVmIDogUGF0PChleHRsb2FkaTY0aTMyIGFkZHI6JHNyYyksDQorICAgICAgICAgIChTVUJSRUdfVE9fUkVHIChpNjQgMCksIChNT1YzMnJtIGFkZHI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl8zMmJpdCk+Ow0KKw0KKy8vIGFueWV4dC4gRGVmaW5lIHRoZXNlIHRvIGRvIGFuIGV4cGxpY2l0IHplcm8tZXh0ZW5kIHRvDQorLy8gYXZvaWQgcGFydGlhbC1yZWdpc3RlciB1cGRhdGVzLg0KK2RlZiA6IFBhdDwoaTY0IChhbnlleHQgR1I4IDokc3JjKSksIChNT1ZaWDY0cnI4ICBHUjggIDokc3JjKT47DQorZGVmIDogUGF0PChpNjQgKGFueWV4dCBHUjE2OiRzcmMpKSwgKE1PVlpYNjRycjE2IEdSMTYgOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGk2NCAoYW55ZXh0IEdSMzI6JHNyYykpLA0KKyAgICAgICAgICAoU1VCUkVHX1RPX1JFRyAoaTY0IDApLCBHUjMyOiRzcmMsIHN1Yl8zMmJpdCk+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU29tZSBwZWVwaG9sZXMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIE9kZCBlbmNvZGluZyB0cmljazogLTEyOCBmaXRzIGludG8gYW4gOC1iaXQgaW1tZWRpYXRlIGZpZWxkIHdoaWxlDQorLy8gKzEyOCBkb2Vzbid0LCBzbyBpbiB0aGlzIHNwZWNpYWwgY2FzZSB1c2UgYSBzdWIgaW5zdGVhZCBvZiBhbiBhZGQuDQorZGVmIDogUGF0PChhZGQgR1I2NDokc3JjMSwgMTI4KSwNCisgICAgICAgICAgKFNVQjY0cmk4IEdSNjQ6JHNyYzEsIC0xMjgpPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChhZGQgKGxvYWRpNjQgYWRkcjokZHN0KSwgMTI4KSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKFNVQjY0bWk4IGFkZHI6JGRzdCwgLTEyOCk+Ow0KKw0KKy8vIFRoZSBzYW1lIHRyaWNrIGFwcGxpZXMgZm9yIDMyLWJpdCBpbW1lZGlhdGUgZmllbGRzIGluIDY0LWJpdA0KKy8vIGluc3RydWN0aW9ucy4NCitkZWYgOiBQYXQ8KGFkZCBHUjY0OiRzcmMxLCAweDAwMDAwMDAwODAwMDAwMDApLA0KKyAgICAgICAgICAoU1VCNjRyaTMyIEdSNjQ6JHNyYzEsIDB4ZmZmZmZmZmY4MDAwMDAwMCk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKGFkZCAobG9hZGk2NCBhZGRyOiRkc3QpLCAweDAwMDAwMDAwODAwMDAwMDAwKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKFNVQjY0bWkzMiBhZGRyOiRkc3QsIDB4ZmZmZmZmZmY4MDAwMDAwMCk+Ow0KKw0KKy8vIFVzZSBhIDMyLWJpdCBhbmQgd2l0aCBpbXBsaWNpdCB6ZXJvLWV4dGVuc2lvbiBpbnN0ZWFkIG9mIGEgNjQtYml0IGFuZCBpZiBpdA0KKy8vIGhhcyBhbiBpbW1lZGlhdGUgd2l0aCBhdCBsZWFzdCAzMiBiaXRzIG9mIGxlYWRpbmcgemVyb3MsIHRvIGF2b2lkIG5lZWRpbmcgdG8NCisvLyBtYXRlcmlhbGl6ZSB0aGF0IGltbWVkaWF0ZSBpbiBhIHJlZ2lzdGVyIGZpcnN0Lg0KK2RlZiA6IFBhdDwoYW5kIEdSNjQ6JHNyYywgaTY0aW1tWkV4dDMyOiRpbW0pLA0KKyAgICAgICAgICAoU1VCUkVHX1RPX1JFRw0KKyAgICAgICAgICAgIChpNjQgMCksDQorICAgICAgICAgICAgKEFORDMycmkNCisgICAgICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyBHUjY0OiRzcmMsIHN1Yl8zMmJpdCksDQorICAgICAgICAgICAgICAoaTMyIChHZXRMbzMyWEZvcm0gaW1tOiRpbW0pKSksDQorICAgICAgICAgICAgc3ViXzMyYml0KT47DQorDQorLy8gciAmICgyXjMyLTEpID09PiBtb3Z6DQorZGVmIDogUGF0PChhbmQgR1I2NDokc3JjLCAweDAwMDAwMDAwRkZGRkZGRkYpLA0KKyAgICAgICAgICAoTU9WWlg2NHJyMzIgKEVYVFJBQ1RfU1VCUkVHIEdSNjQ6JHNyYywgc3ViXzMyYml0KSk+Ow0KKy8vIHIgJiAoMl4xNi0xKSA9PT4gbW92eg0KK2RlZiA6IFBhdDwoYW5kIEdSNjQ6JHNyYywgMHhmZmZmKSwNCisgICAgICAgICAgKE1PVlpYNjRycjE2IChpMTYgKEVYVFJBQ1RfU1VCUkVHIEdSNjQ6JHNyYywgc3ViXzE2Yml0KSkpPjsNCisvLyByICYgKDJeOC0xKSA9PT4gbW92eg0KK2RlZiA6IFBhdDwoYW5kIEdSNjQ6JHNyYywgMHhmZiksDQorICAgICAgICAgIChNT1ZaWDY0cnI4IChpOCAoRVhUUkFDVF9TVUJSRUcgR1I2NDokc3JjLCBzdWJfOGJpdCkpKT47DQorLy8gciAmICgyXjgtMSkgPT0+IG1vdnoNCitkZWYgOiBQYXQ8KGFuZCBHUjMyOiRzcmMxLCAweGZmKSwNCisgICAgICAgICAgIChNT1ZaWDMycnI4IChFWFRSQUNUX1NVQlJFRyBHUjMyOiRzcmMxLCBzdWJfOGJpdCkpPiwNCisgICAgICBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCisvLyByICYgKDJeOC0xKSA9PT4gbW92eg0KK2RlZiA6IFBhdDwoYW5kIEdSMTY6JHNyYzEsIDB4ZmYpLA0KKyAgICAgICAgICAgKE1PVlpYMTZycjggKGk4IChFWFRSQUNUX1NVQlJFRyBHUjE2OiRzcmMxLCBzdWJfOGJpdCkpKT4sDQorICAgICAgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorDQorLy8gc2V4dF9pbnJlZyBwYXR0ZXJucw0KK2RlZiA6IFBhdDwoc2V4dF9pbnJlZyBHUjY0OiRzcmMsIGkzMiksDQorICAgICAgICAgIChNT1ZTWDY0cnIzMiAoRVhUUkFDVF9TVUJSRUcgR1I2NDokc3JjLCBzdWJfMzJiaXQpKT47DQorZGVmIDogUGF0PChzZXh0X2lucmVnIEdSNjQ6JHNyYywgaTE2KSwNCisgICAgICAgICAgKE1PVlNYNjRycjE2IChFWFRSQUNUX1NVQlJFRyBHUjY0OiRzcmMsIHN1Yl8xNmJpdCkpPjsNCitkZWYgOiBQYXQ8KHNleHRfaW5yZWcgR1I2NDokc3JjLCBpOCksDQorICAgICAgICAgIChNT1ZTWDY0cnI4IChFWFRSQUNUX1NVQlJFRyBHUjY0OiRzcmMsIHN1Yl84Yml0KSk+Ow0KK2RlZiA6IFBhdDwoc2V4dF9pbnJlZyBHUjMyOiRzcmMsIGk4KSwNCisgICAgICAgICAgKE1PVlNYMzJycjggKEVYVFJBQ1RfU1VCUkVHIEdSMzI6JHNyYywgc3ViXzhiaXQpKT4sDQorICAgICAgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorZGVmIDogUGF0PChzZXh0X2lucmVnIEdSMTY6JHNyYywgaTgpLA0KKyAgICAgICAgICAoTU9WU1gxNnJyOCAoaTggKEVYVFJBQ1RfU1VCUkVHIEdSMTY6JHNyYywgc3ViXzhiaXQpKSk+LA0KKyAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KKw0KKy8vIHRydW5jIHBhdHRlcm5zDQorZGVmIDogUGF0PChpMzIgKHRydW5jIEdSNjQ6JHNyYykpLA0KKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgR1I2NDokc3JjLCBzdWJfMzJiaXQpPjsNCitkZWYgOiBQYXQ8KGkxNiAodHJ1bmMgR1I2NDokc3JjKSksDQorICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyBHUjY0OiRzcmMsIHN1Yl8xNmJpdCk+Ow0KK2RlZiA6IFBhdDwoaTggKHRydW5jIEdSNjQ6JHNyYykpLA0KKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgR1I2NDokc3JjLCBzdWJfOGJpdCk+Ow0KK2RlZiA6IFBhdDwoaTggKHRydW5jIEdSMzI6JHNyYykpLA0KKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgR1IzMjokc3JjLCBzdWJfOGJpdCk+LA0KKyAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KK2RlZiA6IFBhdDwoaTggKHRydW5jIEdSMTY6JHNyYykpLA0KKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgR1IxNjokc3JjLCBzdWJfOGJpdCk+LA0KKyAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KKw0KKy8vIGgtcmVnaXN0ZXIgdHJpY2tzLg0KKy8vIEZvciBub3csIGJlIGNvbnNlcnZhdGl2ZSBvbiB4ODYtNjQgYW5kIHVzZSBhbiBoLXJlZ2lzdGVyIGV4dHJhY3Qgb25seSBpZiB0aGUNCisvLyB2YWx1ZSBpcyBpbW1lZGlhdGVseSB6ZXJvLWV4dGVuZGVkIG9yIHN0b3JlZCwgd2hpY2ggYXJlIHNvbWV3aGF0IGNvbW1vbg0KKy8vIGNhc2VzLiBUaGlzIHVzZXMgYSBidW5jaCBvZiBjb2RlIHRvIHByZXZlbnQgYSByZWdpc3RlciByZXF1aXJpbmcgYSBSRVggcHJlZml4DQorLy8gZnJvbSBiZWluZyBhbGxvY2F0ZWQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gYXMgdGhlIGggcmVnaXN0ZXIsIGFzIHRoZXJlJ3MNCisvLyBjdXJyZW50bHkgbm8gd2F5IHRvIGRlc2NyaWJlIHRoaXMgcmVxdWlyZW1lbnQgdG8gdGhlIHJlZ2lzdGVyIGFsbG9jYXRvci4NCisNCisvLyBoLXJlZ2lzdGVyIGV4dHJhY3QgYW5kIHplcm8tZXh0ZW5kLg0KK2RlZiA6IFBhdDwoYW5kIChzcmxfc3UgR1I2NDokc3JjLCAoaTggOCkpLCAoaTY0IDI1NSkpLA0KKyAgICAgICAgICAoU1VCUkVHX1RPX1JFRw0KKyAgICAgICAgICAgIChpNjQgMCksDQorICAgICAgICAgICAgKE1PVlpYMzJfTk9SRVhycjgNCisgICAgICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyAoaTY0IChDT1BZX1RPX1JFR0NMQVNTIEdSNjQ6JHNyYywgR1I2NF9BQkNEKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXRfaGkpKSwNCisgICAgICAgICAgICBzdWJfMzJiaXQpPjsNCitkZWYgOiBQYXQ8KGFuZCAoc3JsX3N1IEdSMzI6JHNyYywgKGk4IDgpKSwgKGkzMiAyNTUpKSwNCisgICAgICAgICAgKE1PVlpYMzJfTk9SRVhycjgNCisgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKGkzMiAoQ09QWV9UT19SRUdDTEFTUyBHUjMyOiRzcmMsIEdSMzJfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfOGJpdF9oaSkpPiwNCisgICAgICBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KHNybCAoYW5kX3N1IEdSMzI6JHNyYywgMHhmZjAwKSwgKGk4IDgpKSwNCisgICAgICAgICAgKE1PVlpYMzJfTk9SRVhycjggKEVYVFJBQ1RfU1VCUkVHIChpMzIgKENPUFlfVE9fUkVHQ0xBU1MgR1IzMjokc3JjLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1IzMl9BQkNEKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXRfaGkpKT4sDQorICAgICAgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorZGVmIDogUGF0PChzcmwgR1IxNjokc3JjLCAoaTggOCkpLA0KKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcNCisgICAgICAgICAgICAoTU9WWlgzMl9OT1JFWHJyOA0KKyAgICAgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChpMTYgKENPUFlfVE9fUkVHQ0xBU1MgR1IxNjokc3JjLCBHUjE2X0FCQ0QpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfOGJpdF9oaSkpLA0KKyAgICAgICAgICAgIHN1Yl8xNmJpdCk+LA0KKyAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KK2RlZiA6IFBhdDwoaTMyICh6ZXh0IChzcmxfc3UgR1IxNjokc3JjLCAoaTggOCkpKSksDQorICAgICAgICAgIChNT1ZaWDMyX05PUkVYcnI4DQorICAgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChpMTYgKENPUFlfVE9fUkVHQ0xBU1MgR1IxNjokc3JjLCBHUjE2X0FCQ0QpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXRfaGkpKT4sDQorICAgICAgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorZGVmIDogUGF0PChpMzIgKGFueWV4dCAoc3JsX3N1IEdSMTY6JHNyYywgKGk4IDgpKSkpLA0KKyAgICAgICAgICAoTU9WWlgzMl9OT1JFWHJyOA0KKyAgICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyAoaTE2IChDT1BZX1RPX1JFR0NMQVNTIEdSMTY6JHNyYywgR1IxNl9BQkNEKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl84Yml0X2hpKSk+LA0KKyAgICAgIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KK2RlZiA6IFBhdDwoaTY0ICh6ZXh0IChzcmxfc3UgR1IxNjokc3JjLCAoaTggOCkpKSksDQorICAgICAgICAgIChTVUJSRUdfVE9fUkVHDQorICAgICAgICAgICAgKGk2NCAwKSwNCisgICAgICAgICAgICAoTU9WWlgzMl9OT1JFWHJyOA0KKyAgICAgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChpMTYgKENPUFlfVE9fUkVHQ0xBU1MgR1IxNjokc3JjLCBHUjE2X0FCQ0QpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfOGJpdF9oaSkpLA0KKyAgICAgICAgICAgIHN1Yl8zMmJpdCk+Ow0KK2RlZiA6IFBhdDwoaTY0IChhbnlleHQgKHNybF9zdSBHUjE2OiRzcmMsIChpOCA4KSkpKSwNCisgICAgICAgICAgKFNVQlJFR19UT19SRUcNCisgICAgICAgICAgICAoaTY0IDApLA0KKyAgICAgICAgICAgIChNT1ZaWDMyX05PUkVYcnI4DQorICAgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKGkxNiAoQ09QWV9UT19SRUdDTEFTUyBHUjE2OiRzcmMsIEdSMTZfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl84Yml0X2hpKSksDQorICAgICAgICAgICAgc3ViXzMyYml0KT47DQorDQorLy8gaC1yZWdpc3RlciBleHRyYWN0IGFuZCBzdG9yZS4NCitkZWYgOiBQYXQ8KHN0b3JlIChpOCAodHJ1bmNfc3UgKHNybF9zdSBHUjY0OiRzcmMsIChpOCA4KSkpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1PVjhtcl9OT1JFWA0KKyAgICAgICAgICAgIGFkZHI6JGRzdCwNCisgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKGk2NCAoQ09QWV9UT19SRUdDTEFTUyBHUjY0OiRzcmMsIEdSNjRfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfOGJpdF9oaSkpPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChpOCAodHJ1bmNfc3UgKHNybF9zdSBHUjMyOiRzcmMsIChpOCA4KSkpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1PVjhtcl9OT1JFWA0KKyAgICAgICAgICAgIGFkZHI6JGRzdCwNCisgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKGkzMiAoQ09QWV9UT19SRUdDTEFTUyBHUjMyOiRzcmMsIEdSMzJfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfOGJpdF9oaSkpPiwNCisgICAgICBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChpOCAodHJ1bmNfc3UgKHNybF9zdSBHUjE2OiRzcmMsIChpOCA4KSkpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1PVjhtcl9OT1JFWA0KKyAgICAgICAgICAgIGFkZHI6JGRzdCwNCisgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKGkxNiAoQ09QWV9UT19SRUdDTEFTUyBHUjE2OiRzcmMsIEdSMTZfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfOGJpdF9oaSkpPiwNCisgICAgICBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCisNCisvLyAoc2hsIHgsIDEpID09PiAoYWRkIHgsIHgpDQorZGVmIDogUGF0PChzaGwgR1I2NDokc3JjMSwgKGk4IDEpKSwgKEFERDY0cnIgR1I2NDokc3JjMSwgR1I2NDokc3JjMSk+Ow0KKw0KKy8vIChzaGwgeCAoYW5kIHksIDYzKSkgPT0+IChzaGwgeCwgeSkNCitkZWYgOiBQYXQ8KHNobCBHUjY0OiRzcmMxLCAoYW5kIENMLCA2MykpLA0KKyAgICAgICAgICAoU0hMNjRyQ0wgR1I2NDokc3JjMSk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKHNobCAobG9hZGk2NCBhZGRyOiRkc3QpLCAoYW5kIENMLCA2MykpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAoU0hMNjRtQ0wgYWRkcjokZHN0KT47DQorDQorZGVmIDogUGF0PChzcmwgR1I2NDokc3JjMSwgKGFuZCBDTCwgNjMpKSwNCisgICAgICAgICAgKFNIUjY0ckNMIEdSNjQ6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChzcmwgKGxvYWRpNjQgYWRkcjokZHN0KSwgKGFuZCBDTCwgNjMpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKFNIUjY0bUNMIGFkZHI6JGRzdCk+Ow0KKw0KK2RlZiA6IFBhdDwoc3JhIEdSNjQ6JHNyYzEsIChhbmQgQ0wsIDYzKSksDQorICAgICAgICAgIChTQVI2NHJDTCBHUjY0OiRzcmMxKT47DQorZGVmIDogUGF0PChzdG9yZSAoc3JhIChsb2FkaTY0IGFkZHI6JGRzdCksIChhbmQgQ0wsIDYzKSksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChTQVI2NG1DTCBhZGRyOiRkc3QpPjsNCisNCisvLyAob3IgeDEsIHgyKSAtPiAoYWRkIHgxLCB4MikgaWYgdHdvIG9wZXJhbmRzIGFyZSBrbm93biBub3QgdG8gc2hhcmUgYml0cy4NCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gNSBpbiB7ICAvLyBUcnkgdGhpcyBiZWZvcmUgdGhlIHNlbGVjdGluZyB0byBPUg0KK2RlZiA6IFBhdDwob3JfaXNfYWRkIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKEFERDY0cmk4IEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKT47DQorZGVmIDogUGF0PChvcl9pc19hZGQgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKSwNCisgICAgICAgICAgKEFERDY0cmkzMiBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0MzI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG9yX2lzX2FkZCBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgKEFERDY0cnIgR1I2NDokc3JjMSwgR1I2NDokc3JjMik+Ow0KK30gLy8gQWRkZWRDb21wbGV4aXR5DQorDQorLy8gWDg2IHNwZWNpZmljIGFkZCB3aGljaCBwcm9kdWNlcyBhIGZsYWcuDQorZGVmIDogUGF0PChhZGRjIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAoQURENjRyciBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKT47DQorZGVmIDogUGF0PChhZGRjIEdSNjQ6JHNyYzEsIChsb2FkIGFkZHI6JHNyYzIpKSwNCisgICAgICAgICAgKEFERDY0cm0gR1I2NDokc3JjMSwgYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYWRkYyBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0ODokc3JjMiksDQorICAgICAgICAgIChBREQ2NHJpOCBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0ODokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYWRkYyBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0MzI6JHNyYzIpLA0KKyAgICAgICAgICAoQURENjRyaTMyIEdSNjQ6JHNyYzEsIGltbTokc3JjMik+Ow0KKw0KK2RlZiA6IFBhdDwoc3ViYyBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgKFNVQjY0cnIgR1I2NDokc3JjMSwgR1I2NDokc3JjMik+Ow0KK2RlZiA6IFBhdDwoc3ViYyBHUjY0OiRzcmMxLCAobG9hZCBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChTVUI2NHJtIEdSNjQ6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YmMgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpLA0KKyAgICAgICAgICAoU1VCNjRyaTggR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YmMgR1I2NDokc3JjMSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgKFNVQjY0cmkzMiBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0MzI6JHNyYzIpPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEVGTEFHUy1kZWZpbmluZyBQYXR0ZXJucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gYWRkaXRpb24NCitkZWYgOiBQYXQ8KGFkZCBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKSwNCisgICAgICAgICAgKEFERDY0cnIgR1I2NDokc3JjMSwgR1I2NDokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYWRkIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKEFERDY0cmk4IEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKT47DQorZGVmIDogUGF0PChhZGQgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKSwNCisgICAgICAgICAgKEFERDY0cmkzMiBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0MzI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjY0OiRzcmMxLCAobG9hZGk2NCBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChBREQ2NHJtIEdSNjQ6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCisNCisvLyBzdWJ0cmFjdGlvbg0KK2RlZiA6IFBhdDwoc3ViIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAoU1VCNjRyciBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKT47DQorZGVmIDogUGF0PChzdWIgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMikpLA0KKyAgICAgICAgICAoU1VCNjRybSBHUjY0OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorZGVmIDogUGF0PChzdWIgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpLA0KKyAgICAgICAgICAoU1VCNjRyaTggR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YiBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0MzI6JHNyYzIpLA0KKyAgICAgICAgICAoU1VCNjRyaTMyIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQzMjokc3JjMik+Ow0KKw0KKy8vIE11bHRpcGx5DQorZGVmIDogUGF0PChtdWwgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgIChJTVVMNjRyciBHUjY0OiRzcmMxLCBHUjY0OiRzcmMyKT47DQorZGVmIDogUGF0PChtdWwgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMikpLA0KKyAgICAgICAgICAoSU1VTDY0cm0gR1I2NDokc3JjMSwgYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwobXVsIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKElNVUw2NHJyaTggR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG11bCBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0MzI6JHNyYzIpLA0KKyAgICAgICAgICAoSU1VTDY0cnJpMzIgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKT47DQorZGVmIDogUGF0PChtdWwgKGxvYWRpNjQgYWRkcjokc3JjMSksIGk2NGltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKElNVUw2NHJtaTggYWRkcjokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG11bCAobG9hZGk2NCBhZGRyOiRzcmMxKSwgaTY0aW1tU0V4dDMyOiRzcmMyKSwNCisgICAgICAgICAgKElNVUw2NHJtaTMyIGFkZHI6JHNyYzEsIGk2NGltbVNFeHQzMjokc3JjMik+Ow0KKw0KKy8vIGluYy9kZWMNCitkZWYgOiBQYXQ8KGFkZCBHUjE2OiRzcmMsIDEpLCAgKElOQzY0XzE2ciBHUjE2OiRzcmMpPiwgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorZGVmIDogUGF0PChhZGQgR1IxNjokc3JjLCAtMSksIChERUM2NF8xNnIgR1IxNjokc3JjKT4sIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+Ow0KK2RlZiA6IFBhdDwoYWRkIEdSMzI6JHNyYywgMSksICAoSU5DNjRfMzJyIEdSMzI6JHNyYyk+LCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjMyOiRzcmMsIC0xKSwgKERFQzY0XzMyciBHUjMyOiRzcmMpPiwgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47DQorZGVmIDogUGF0PChhZGQgR1I2NDokc3JjLCAxKSwgIChJTkM2NHIgR1I2NDokc3JjKT47DQorZGVmIDogUGF0PChhZGQgR1I2NDokc3JjLCAtMSksIChERUM2NHIgR1I2NDokc3JjKT47DQorDQorLy8gb3INCitkZWYgOiBQYXQ8KG9yIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAoT1I2NHJyIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG9yIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKE9SNjRyaTggR1I2NDokc3JjMSwgaTY0aW1tU0V4dDg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG9yIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQzMjokc3JjMiksDQorICAgICAgICAgIChPUjY0cmkzMiBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0MzI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG9yIEdSNjQ6JHNyYzEsIChsb2FkaTY0IGFkZHI6JHNyYzIpKSwNCisgICAgICAgICAgKE9SNjRybSBHUjY0OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorDQorLy8geG9yDQorZGVmIDogUGF0PCh4b3IgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgIChYT1I2NHJyIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHhvciBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0ODokc3JjMiksDQorICAgICAgICAgIChYT1I2NHJpOCBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0ODokc3JjMik+Ow0KK2RlZiA6IFBhdDwoeG9yIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQzMjokc3JjMiksDQorICAgICAgICAgIChYT1I2NHJpMzIgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKT47DQorZGVmIDogUGF0PCh4b3IgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMikpLA0KKyAgICAgICAgICAoWE9SNjRybSBHUjY0OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorDQorLy8gYW5kDQorZGVmIDogUGF0PChhbmQgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgIChBTkQ2NHJyIEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFuZCBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0ODokc3JjMiksDQorICAgICAgICAgIChBTkQ2NHJpOCBHUjY0OiRzcmMxLCBpNjRpbW1TRXh0ODokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYW5kIEdSNjQ6JHNyYzEsIGk2NGltbVNFeHQzMjokc3JjMiksDQorICAgICAgICAgIChBTkQ2NHJpMzIgR1I2NDokc3JjMSwgaTY0aW1tU0V4dDMyOiRzcmMyKT47DQorZGVmIDogUGF0PChhbmQgR1I2NDokc3JjMSwgKGxvYWRpNjQgYWRkcjokc3JjMikpLA0KKyAgICAgICAgICAoQU5ENjRybSBHUjY0OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBYODYtNjQgU1NFIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gTW92ZSBpbnN0cnVjdGlvbnMuLi4NCisNCitkZWYgTU9WNjR0b1BRSXJyIDogUlBESTwweDZFLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIm1vdntkfHF9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCAoc2NhbGFyX3RvX3ZlY3RvciBHUjY0OiRzcmMpKSldPjsNCitkZWYgTU9WUFFJdG82NHJyICA6IFJQREk8MHg3RSwgTVJNRGVzdFJlZywgKG91dHMgR1I2NDokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdntkfHF9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwgKHZlY3Rvcl9leHRyYWN0ICh2Mmk2NCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlQVFIgMCkpKV0+Ow0KKw0KK2RlZiBNT1Y2NHRvU0RyciA6IFJQREk8MHg2RSwgTVJNU3JjUmVnLCAob3V0cyBGUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAibW92e2R8cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZSNjQ6JGRzdCwgKGJpdGNvbnZlcnQgR1I2NDokc3JjKSldPjsNCitkZWYgTU9WNjR0b1NEcm0gOiBTM1NJPDB4N0UsIE1STVNyY01lbSwgKG91dHMgRlI2NDokZHN0KSwgKGlucyBpNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAibW92cVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlI2NDokZHN0LCAoYml0Y29udmVydCAobG9hZGk2NCBhZGRyOiRzcmMpKSldPjsNCisNCitkZWYgTU9WU0R0bzY0cnIgIDogUlBESTwweDdFLCBNUk1EZXN0UmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIm1vdntkfHF9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LCAoYml0Y29udmVydCBGUjY0OiRzcmMpKV0+Ow0KK2RlZiBNT1ZTRHRvNjRtciAgOiBSUERJPDB4N0UsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgRlI2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAibW92cVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGk2NCAoYml0Y29udmVydCBGUjY0OiRzcmMpKSwgYWRkcjokZHN0KV0+Ow0KKw0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nkluc3RyQnVpbGRlci5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2YTcxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nkluc3RyQnVpbGRlci5oCkBAIC0wLDAgKzEsMTU5IEBACisvLz09PS0tIFg4Nkluc3RyQnVpbGRlci5oIC0gRnVuY3Rpb25zIHRvIGFpZCBidWlsZGluZyB4ODYgaW5zdHMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBleHBvc2VzIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSB1c2VkIHdpdGggQnVpbGRNSSBmcm9tIHRoZQorLy8gTWFjaGluZUluc3RyQnVpbGRlci5oIGZpbGUgdG8gaGFuZGxlIFg4Nidpc21zIGluIGEgY2xlYW4gd2F5LgorLy8KKy8vIFRoZSBCdWlsZE1lbSBmdW5jdGlvbiBtYXkgYmUgdXNlZCB3aXRoIHRoZSBCdWlsZE1JIGZ1bmN0aW9uIHRvIGFkZCBlbnRpcmUKKy8vIG1lbW9yeSByZWZlcmVuY2VzIGluIGEgc2luZ2xlLCB0eXBlZCwgZnVuY3Rpb24gY2FsbC4gIFg4NiBtZW1vcnkgcmVmZXJlbmNlcworLy8gY2FuIGJlIHZlcnkgY29tcGxleCBleHByZXNzaW9ucyAoZGVzY3JpYmVkIGluIHRoZSBSRUFETUUpLCBzbyB3cmFwcGluZyB0aGVtCisvLyB1cCBiZWhpbmQgYW4gZWFzaWVyIHRvIHVzZSBpbnRlcmZhY2UgbWFrZXMgc2Vuc2UuICBEZXNjcmlwdGlvbnMgb2YgdGhlCisvLyBmdW5jdGlvbnMgYXJlIGluY2x1ZGVkIGJlbG93LgorLy8KKy8vIEZvciByZWZlcmVuY2UsIHRoZSBvcmRlciBvZiBvcGVyYW5kcyBmb3IgbWVtb3J5IHJlZmVyZW5jZXMgaXM6CisvLyAoT3BlcmFuZCksIEJhc2UsIFNjYWxlLCBJbmRleCwgRGlzcGxhY2VtZW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWDg2SU5TVFJCVUlMREVSX0gKKyNkZWZpbmUgWDg2SU5TVFJCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1lbU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gWDg2QWRkcmVzc01vZGUgLSBUaGlzIHN0cnVjdCBob2xkcyBhIGdlbmVyYWxpemVkIGZ1bGwgeDg2IGFkZHJlc3MgbW9kZS4KKy8vLyBUaGUgYmFzZSByZWdpc3RlciBjYW4gYmUgYSBmcmFtZSBpbmRleCwgd2hpY2ggd2lsbCBldmVudHVhbGx5IGJlIHJlcGxhY2VkCisvLy8gd2l0aCBCUCBvciBTUCBhbmQgRGlzcCBiZWluZyBvZmZzZXR0ZWQgYWNjb3JkaW5nbHkuICBUaGUgZGlzcGxhY2VtZW50IG1heQorLy8vIGFsc28gaW5jbHVkZSB0aGUgb2Zmc2V0IG9mIGEgZ2xvYmFsIHZhbHVlLgorc3RydWN0IFg4NkFkZHJlc3NNb2RlIHsKKyAgZW51bSB7CisgICAgUmVnQmFzZSwKKyAgICBGcmFtZUluZGV4QmFzZQorICB9IEJhc2VUeXBlOworCisgIHVuaW9uIHsKKyAgICB1bnNpZ25lZCBSZWc7CisgICAgaW50IEZyYW1lSW5kZXg7CisgIH0gQmFzZTsKKworICB1bnNpZ25lZCBTY2FsZTsKKyAgdW5zaWduZWQgSW5kZXhSZWc7CisgIGludCBEaXNwOworICBjb25zdCBHbG9iYWxWYWx1ZSAqR1Y7CisgIHVuc2lnbmVkIEdWT3BGbGFnczsKKworICBYODZBZGRyZXNzTW9kZSgpCisgICAgOiBCYXNlVHlwZShSZWdCYXNlKSwgU2NhbGUoMSksIEluZGV4UmVnKDApLCBEaXNwKDApLCBHVigwKSwgR1ZPcEZsYWdzKDApIHsKKyAgICBCYXNlLlJlZyA9IDA7CisgIH0KK307CisKKy8vLyBhZGREaXJlY3RNZW0gLSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGEgZGlyZWN0IG1lbW9yeSByZWZlcmVuY2UgdG8gdGhlCisvLy8gY3VycmVudCBpbnN0cnVjdGlvbiAtLSB0aGF0IGlzLCBhIGRlcmVmZXJlbmNlIG9mIGFuIGFkZHJlc3MgaW4gYSByZWdpc3RlciwKKy8vLyB3aXRoIG5vIHNjYWxlLCBpbmRleCBvciBkaXNwbGFjZW1lbnQuIEFuIGV4YW1wbGUgaXM6IERXT1JEIFBUUiBbRUFYXS4KKy8vLworc3RhdGljIGlubGluZSBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICYKK2FkZERpcmVjdE1lbShjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZNSUIsIHVuc2lnbmVkIFJlZykgeworICAvLyBCZWNhdXNlIG1lbW9yeSByZWZlcmVuY2VzIGFyZSBhbHdheXMgcmVwcmVzZW50ZWQgd2l0aCBmaXZlCisgIC8vIHZhbHVlcywgdGhpcyBhZGRzOiBSZWcsIDEsIE5vUmVnLCAwLCBOb1JlZyB0byB0aGUgaW5zdHJ1Y3Rpb24uCisgIHJldHVybiBNSUIuYWRkUmVnKFJlZykuYWRkSW1tKDEpLmFkZFJlZygwKS5hZGRJbW0oMCkuYWRkUmVnKDApOworfQorCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmCithZGRPZmZzZXQoY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmTUlCLCBpbnQgT2Zmc2V0KSB7CisgIHJldHVybiBNSUIuYWRkSW1tKDEpLmFkZFJlZygwKS5hZGRJbW0oT2Zmc2V0KS5hZGRSZWcoMCk7Cit9CisKKy8vLyBhZGRSZWdPZmZzZXQgLSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGEgbWVtb3J5IHJlZmVyZW5jZSBvZiB0aGUgZm9ybQorLy8vIFtSZWcgKyBPZmZzZXRdLCBpLmUuLCBvbmUgd2l0aCBubyBzY2FsZSBvciBpbmRleCwgYnV0IHdpdGggYQorLy8vIGRpc3BsYWNlbWVudC4gQW4gZXhhbXBsZSBpczogRFdPUkQgUFRSIFtFQVggKyA0XS4KKy8vLworc3RhdGljIGlubGluZSBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICYKK2FkZFJlZ09mZnNldChjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZNSUIsCisgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBib29sIGlzS2lsbCwgaW50IE9mZnNldCkgeworICByZXR1cm4gYWRkT2Zmc2V0KE1JQi5hZGRSZWcoUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSksIE9mZnNldCk7Cit9CisKKy8vLyBhZGRSZWdSZWcgLSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGEgbWVtb3J5IHJlZmVyZW5jZSBvZiB0aGUgZm9ybToKKy8vLyBbUmVnICsgUmVnXS4KK3N0YXRpYyBpbmxpbmUgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkUmVnUmVnKGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnMSwgYm9vbCBpc0tpbGwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcyLCBib29sIGlzS2lsbDIpIHsKKyAgcmV0dXJuIE1JQi5hZGRSZWcoUmVnMSwgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbDEpKS5hZGRJbW0oMSkKKyAgICAuYWRkUmVnKFJlZzIsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwyKSkuYWRkSW1tKDApLmFkZFJlZygwKTsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICYKK2FkZEZ1bGxBZGRyZXNzKGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQiwKKyAgICAgICAgICAgICAgIGNvbnN0IFg4NkFkZHJlc3NNb2RlICZBTSkgeworICBhc3NlcnQoQU0uU2NhbGUgPT0gMSB8fCBBTS5TY2FsZSA9PSAyIHx8IEFNLlNjYWxlID09IDQgfHwgQU0uU2NhbGUgPT0gOCk7CisgIAorICBpZiAoQU0uQmFzZVR5cGUgPT0gWDg2QWRkcmVzc01vZGU6OlJlZ0Jhc2UpCisgICAgTUlCLmFkZFJlZyhBTS5CYXNlLlJlZyk7CisgIGVsc2UgaWYgKEFNLkJhc2VUeXBlID09IFg4NkFkZHJlc3NNb2RlOjpGcmFtZUluZGV4QmFzZSkKKyAgICBNSUIuYWRkRnJhbWVJbmRleChBTS5CYXNlLkZyYW1lSW5kZXgpOworICBlbHNlCisgICAgYXNzZXJ0ICgwKTsKKyAgTUlCLmFkZEltbShBTS5TY2FsZSkuYWRkUmVnKEFNLkluZGV4UmVnKTsKKyAgaWYgKEFNLkdWKQorICAgIE1JQi5hZGRHbG9iYWxBZGRyZXNzKEFNLkdWLCBBTS5EaXNwLCBBTS5HVk9wRmxhZ3MpOworICBlbHNlCisgICAgTUlCLmFkZEltbShBTS5EaXNwKTsKKyAgICAKKyAgcmV0dXJuIE1JQi5hZGRSZWcoMCk7Cit9CisKKy8vLyBhZGRGcmFtZVJlZmVyZW5jZSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYSByZWZlcmVuY2UgdG8gdGhlIGJhc2Ugb2YKKy8vLyBhbiBhYnN0cmFjdCBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhpcworLy8vIHJlZmVyZW5jZSBoYXMgYmFzZSByZWdpc3RlciBhcyB0aGUgRnJhbWVJbmRleCBvZmZzZXQgdW50aWwgaXQgaXMgcmVzb2x2ZWQuCisvLy8gVGhpcyBhbGxvd3MgYSBjb25zdGFudCBvZmZzZXQgdG8gYmUgc3BlY2lmaWVkIGFzIHdlbGwuLi4KKy8vLworc3RhdGljIGlubGluZSBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICYKK2FkZEZyYW1lUmVmZXJlbmNlKGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQiwgaW50IEZJLCBpbnQgT2Zmc2V0ID0gMCkgeworICBNYWNoaW5lSW5zdHIgKk1JID0gTUlCOworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1JLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVGcmFtZUluZm8gJk1GSSA9ICpNRi5nZXRGcmFtZUluZm8oKTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBNSS0+Z2V0RGVzYygpOworICB1bnNpZ25lZCBGbGFncyA9IDA7CisgIGlmIChUSUQubWF5TG9hZCgpKQorICAgIEZsYWdzIHw9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT0xvYWQ7CisgIGlmIChUSUQubWF5U3RvcmUoKSkKKyAgICBGbGFncyB8PSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9TdG9yZTsKKyAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyA9CisgICAgTUYuZ2V0TWFjaGluZU1lbU9wZXJhbmQoUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZJLmdldE9iamVjdFNpemUoRkkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS5nZXRPYmplY3RBbGlnbm1lbnQoRkkpKTsKKyAgcmV0dXJuIGFkZE9mZnNldChNSUIuYWRkRnJhbWVJbmRleChGSSksIE9mZnNldCkKKyAgICAgICAgICAgIC5hZGRNZW1PcGVyYW5kKE1NTyk7Cit9CisKKy8vLyBhZGRDb25zdGFudFBvb2xSZWZlcmVuY2UgLSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGEgcmVmZXJlbmNlIHRvIHRoZQorLy8vIGJhc2Ugb2YgYSBjb25zdGFudCB2YWx1ZSBzcGlsbGVkIHRvIHRoZSBwZXItZnVuY3Rpb24gY29uc3RhbnQgcG9vbC4gIFRoZQorLy8vIHJlZmVyZW5jZSB1c2VzIHRoZSBhYnN0cmFjdCBDb25zdGFudFBvb2xJbmRleCB3aGljaCBpcyByZXRhaW5lZCB1bnRpbAorLy8vIGVpdGhlciBtYWNoaW5lIGNvZGUgZW1pc3Npb24gb3IgYXNzZW1ibHkgb3V0cHV0LiBJbiBQSUMgbW9kZSBvbiB4ODYtMzIsCisvLy8gdGhlIEdsb2JhbEJhc2VSZWcgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIG1ha2UgdGhpcyBhCisvLy8gR2xvYmFsQmFzZVJlZy1yZWxhdGl2ZSByZWZlcmVuY2UuCisvLy8KK3N0YXRpYyBpbmxpbmUgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmCithZGRDb25zdGFudFBvb2xSZWZlcmVuY2UoY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmTUlCLCB1bnNpZ25lZCBDUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgR2xvYmFsQmFzZVJlZywgdW5zaWduZWQgY2hhciBPcEZsYWdzKSB7CisgIC8vRklYTUU6IGZhY3RvciB0aGlzCisgIHJldHVybiBNSUIuYWRkUmVnKEdsb2JhbEJhc2VSZWcpLmFkZEltbSgxKS5hZGRSZWcoMCkKKyAgICAuYWRkQ29uc3RhbnRQb29sSW5kZXgoQ1BJLCAwLCBPcEZsYWdzKS5hZGRSZWcoMCk7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJGTUEudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0ckZNQS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODY4NzczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJGTUEudGQKQEAgLTAsMCArMSw2MCBAQAorLy89PT09LSBYODZJbnN0ckZNQS50ZCAtIERlc2NyaWJlIHRoZSBYODYgSW5zdHJ1Y3Rpb24gU2V0IC0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIEZNQSAoRnVzZWQgTXVsdGlwbHktQWRkKSBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZNQTMgLSBJbnRlbCAzIG9wZXJhbmQgRnVzZWQgTXVsdGlwbHktQWRkIGluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbXVsdGljbGFzcyBmbWFfcm08Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHI+IHsKKyAgZGVmIHIgOiBGTUEzPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwKKyAgICAgICAgICAgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpLAorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksCisgICAgICAgICAgIFtdPjsKKyAgZGVmIG0gOiBGTUEzPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwKKyAgICAgICAgICAgKGlucyBWUjEyODokc3JjMSwgZjEyOG1lbTokc3JjMiksCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwKKyAgICAgICAgICAgW10+OworICBkZWYgclkgOiBGTUEzPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjI1NjokZHN0KSwKKyAgICAgICAgICAgKGlucyBWUjI1Njokc3JjMSwgVlIyNTY6JHNyYzIpLAorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksCisgICAgICAgICAgIFtdPjsKKyAgZGVmIG1ZIDogRk1BMzxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIyNTY6JGRzdCksCisgICAgICAgICAgIChpbnMgVlIyNTY6JHNyYzEsIGYyNTZtZW06JHNyYzIpLAorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksCisgICAgICAgICAgIFtdPjsKK30KKworbXVsdGljbGFzcyBmbWFfZm9ybXM8Yml0czw4PiBvcGMxMzIsIGJpdHM8OD4gb3BjMjEzLCBiaXRzPDg+IG9wYzIzMSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIHN0cmluZyBQYWNrVHk+IHsKKyAgZGVmbSByMTMyIDogZm1hX3JtPG9wYzEzMiwgIXN0cmNvbmNhdChPcGNvZGVTdHIsICFzdHJjb25jYXQoIjEzMiIsIFBhY2tUeSkpPjsKKyAgZGVmbSByMjEzIDogZm1hX3JtPG9wYzIxMywgIXN0cmNvbmNhdChPcGNvZGVTdHIsICFzdHJjb25jYXQoIjIxMyIsIFBhY2tUeSkpPjsKKyAgZGVmbSByMjMxIDogZm1hX3JtPG9wYzIzMSwgIXN0cmNvbmNhdChPcGNvZGVTdHIsICFzdHJjb25jYXQoIjIzMSIsIFBhY2tUeSkpPjsKK30KKworbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4geworICAvLyBGdXNlZCBNdWx0aXBseS1BZGQKKyAgZGVmbSBWRk1BRERQUyAgICA6IGZtYV9mb3JtczwweDk4LCAweEE4LCAweEI4LCAidmZtYWRkIiwgInBzIj47CisgIGRlZm0gVkZNQUREUEQgICAgOiBmbWFfZm9ybXM8MHg5OCwgMHhBOCwgMHhCOCwgInZmbWFkZCIsICJwZCI+LCBWRVhfVzsKKyAgZGVmbSBWRk1BRERTVUJQUyA6IGZtYV9mb3JtczwweDk2LCAweEE2LCAweEI2LCAidmZtYWRkc3ViIiwgInBzIj47CisgIGRlZm0gVkZNQUREU1VCUEQgOiBmbWFfZm9ybXM8MHg5NiwgMHhBNiwgMHhCNiwgInZmbWFkZHN1YiIsICJwZCI+LCBWRVhfVzsKKyAgZGVmbSBWRk1TVUJBRERQUyA6IGZtYV9mb3JtczwweDk3LCAweEE3LCAweEI3LCAidmZtc3ViYWRkIiwgInBzIj47CisgIGRlZm0gVkZNU1VCQUREUEQgOiBmbWFfZm9ybXM8MHg5NywgMHhBNywgMHhCNywgInZmbXN1YmFkZCIsICJwZCI+LCBWRVhfVzsKKyAgZGVmbSBWRk1TVUJQUyAgICA6IGZtYV9mb3JtczwweDlBLCAweEFBLCAweEJBLCAidmZtc3ViIiwgInBzIj47CisgIGRlZm0gVkZNU1VCUEQgICAgOiBmbWFfZm9ybXM8MHg5QSwgMHhBQSwgMHhCQSwgInZmbXN1YiIsICJwZCI+LCBWRVhfVzsKKworICAvLyBGdXNlZCBOZWdhdGl2ZSBNdWx0aXBseS1BZGQKKyAgZGVmbSBWRk5NQUREUFMgOiBmbWFfZm9ybXM8MHg5QywgMHhBQywgMHhCQywgInZmbm1hZGQiLCAicHMiPjsKKyAgZGVmbSBWRk5NQUREUEQgOiBmbWFfZm9ybXM8MHg5QywgMHhBQywgMHhCQywgInZmbm1hZGQiLCAicGQiPiwgVkVYX1c7CisgIGRlZm0gVkZOTVNVQlBTIDogZm1hX2Zvcm1zPDB4OUUsIDB4QUUsIDB4QkUsICJ2Zm5tc3ViIiwgInBzIj47CisgIGRlZm0gVkZOTVNVQlBEIDogZm1hX2Zvcm1zPDB4OUUsIDB4QUUsIDB4QkUsICJ2Zm5tc3ViIiwgInBkIj4sIFZFWF9XOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJGUFN0YWNrLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJGUFN0YWNrLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjBjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0ckZQU3RhY2sudGQKQEAgLTAsMCArMSw2OTQgQEAKKy8vPT0tIFg4Nkluc3RyRlBTdGFjay50ZCAtIERlc2NyaWJlIHRoZSBYODYgSW5zdHJ1Y3Rpb24gU2V0IC0tKi0gdGFibGVnZW4gLSotPS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBYODYgeDg3IEZQVSBpbnN0cnVjdGlvbiBzZXQsIGRlZmluaW5nIHRoZQ0KKy8vIGluc3RydWN0aW9ucywgYW5kIHByb3BlcnRpZXMgb2YgdGhlIGluc3RydWN0aW9ucyB3aGljaCBhcmUgbmVlZGVkIGZvciBjb2RlDQorLy8gZ2VuZXJhdGlvbiwgbWFjaGluZSBjb2RlIGVtaXNzaW9uLCBhbmQgYW5hbHlzaXMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRlBTdGFjayBzcGVjaWZpYyBEQUcgTm9kZXMuDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitkZWYgU0RUWDg2RnBHZXQyICAgIDogU0RUeXBlUHJvZmlsZTwyLCAwLCBbU0RUQ2lzVlQ8MCwgZjgwPiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDEsIGY4MD5dPjsNCitkZWYgU0RUWDg2RmxkICAgICAgIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzRlA8MD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1B0clR5PDE+LCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVlQ8MiwgT3RoZXJWVD5dPjsNCitkZWYgU0RUWDg2RnN0ICAgICAgIDogU0RUeXBlUHJvZmlsZTwwLCAzLCBbU0RUQ2lzRlA8MD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1B0clR5PDE+LCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVlQ8MiwgT3RoZXJWVD5dPjsNCitkZWYgU0RUWDg2RmlsZCAgICAgIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzRlA8MD4sIFNEVENpc1B0clR5PDE+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwyLCBPdGhlclZUPl0+Ow0KK2RlZiBTRFRYODZGcFRvSU1lbSAgOiBTRFR5cGVQcm9maWxlPDAsIDIsIFtTRFRDaXNGUDwwPiwgU0RUQ2lzUHRyVHk8MT5dPjsNCisNCitkZWYgU0RUWDg2Q3dkU3RvcmUgIDogU0RUeXBlUHJvZmlsZTwwLCAxLCBbU0RUQ2lzUHRyVHk8MD5dPjsNCisNCitkZWYgWDg2ZmxkICAgICAgICAgIDogU0ROb2RlPCJYODZJU0Q6OkZMRCIsIFNEVFg4NkZsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlMb2FkXT47DQorZGVmIFg4NmZzdCAgICAgICAgICA6IFNETm9kZTwiWDg2SVNEOjpGU1QiLCBTRFRYODZGc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QSW5GbGFnLCBTRE5QTWF5U3RvcmVdPjsNCitkZWYgWDg2ZmlsZCAgICAgICAgIDogU0ROb2RlPCJYODZJU0Q6OkZJTEQiLCBTRFRYODZGaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heUxvYWRdPjsNCitkZWYgWDg2ZmlsZGZsYWcgICAgIDogU0ROb2RlPCJYODZJU0Q6OkZJTERfRkxBRyIsIFNEVFg4NkZpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3V0RmxhZywgU0ROUE1heUxvYWRdPjsNCitkZWYgWDg2ZnBfdG9faTE2bWVtIDogU0ROb2RlPCJYODZJU0Q6OkZQX1RPX0lOVDE2X0lOX01FTSIsIFNEVFg4NkZwVG9JTWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlXT47DQorZGVmIFg4NmZwX3RvX2kzMm1lbSA6IFNETm9kZTwiWDg2SVNEOjpGUF9UT19JTlQzMl9JTl9NRU0iLCBTRFRYODZGcFRvSU1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZV0+Ow0KK2RlZiBYODZmcF90b19pNjRtZW0gOiBTRE5vZGU8Ilg4NklTRDo6RlBfVE9fSU5UNjRfSU5fTUVNIiwgU0RUWDg2RnBUb0lNZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmVdPjsNCitkZWYgWDg2ZnBfY3dkX2dldDE2IDogU0ROb2RlPCJYODZJU0Q6OkZOU1RDVzE2bSIsICAgICAgICAgIFNEVFg4NkN3ZFN0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QU2lkZUVmZmVjdF0+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRlBTdGFjayBwYXR0ZXJuIGZyYWdtZW50cw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorZGVmIGZwaW1tMCA6IFBhdExlYWY8KGZwaW1tKSwgW3sNCisgIHJldHVybiBOLT5pc0V4YWN0bHlWYWx1ZSgrMC4wKTsNCit9XT47DQorDQorZGVmIGZwaW1tbmVnMCA6IFBhdExlYWY8KGZwaW1tKSwgW3sNCisgIHJldHVybiBOLT5pc0V4YWN0bHlWYWx1ZSgtMC4wKTsNCit9XT47DQorDQorZGVmIGZwaW1tMSA6IFBhdExlYWY8KGZwaW1tKSwgW3sNCisgIHJldHVybiBOLT5pc0V4YWN0bHlWYWx1ZSgrMS4wKTsNCit9XT47DQorDQorZGVmIGZwaW1tbmVnMSA6IFBhdExlYWY8KGZwaW1tKSwgW3sNCisgIHJldHVybiBOLT5pc0V4YWN0bHlWYWx1ZSgtMS4wKTsNCit9XT47DQorDQorLy8gU29tZSAnc3BlY2lhbCcgaW5zdHJ1Y3Rpb25zDQorbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4geyAgLy8gRXhwYW5kZWQgYWZ0ZXIgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLg0KKyAgZGVmIEZQMzJfVE9fSU5UMTZfSU5fTUVNIDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBSRlAzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyNGUDMyX1RPX0lOVDE2X0lOX01FTSBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFg4NmZwX3RvX2kxNm1lbSBSRlAzMjokc3JjLCBhZGRyOiRkc3QpXT47DQorICBkZWYgRlAzMl9UT19JTlQzMl9JTl9NRU0gOiBJPDAsIFBzZXVkbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIFJGUDMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjI0ZQMzJfVE9fSU5UMzJfSU5fTUVNIFBTRVVETyEiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoWDg2ZnBfdG9faTMybWVtIFJGUDMyOiRzcmMsIGFkZHI6JGRzdCldPjsNCisgIGRlZiBGUDMyX1RPX0lOVDY0X0lOX01FTSA6IEk8MCwgUHNldWRvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgUkZQMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMjRlAzMl9UT19JTlQ2NF9JTl9NRU0gUFNFVURPISIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhYODZmcF90b19pNjRtZW0gUkZQMzI6JHNyYywgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIEZQNjRfVE9fSU5UMTZfSU5fTUVNIDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBSRlA2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyNGUDY0X1RPX0lOVDE2X0lOX01FTSBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFg4NmZwX3RvX2kxNm1lbSBSRlA2NDokc3JjLCBhZGRyOiRkc3QpXT47DQorICBkZWYgRlA2NF9UT19JTlQzMl9JTl9NRU0gOiBJPDAsIFBzZXVkbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIFJGUDY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjI0ZQNjRfVE9fSU5UMzJfSU5fTUVNIFBTRVVETyEiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoWDg2ZnBfdG9faTMybWVtIFJGUDY0OiRzcmMsIGFkZHI6JGRzdCldPjsNCisgIGRlZiBGUDY0X1RPX0lOVDY0X0lOX01FTSA6IEk8MCwgUHNldWRvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgUkZQNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMjRlA2NF9UT19JTlQ2NF9JTl9NRU0gUFNFVURPISIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhYODZmcF90b19pNjRtZW0gUkZQNjQ6JHNyYywgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIEZQODBfVE9fSU5UMTZfSU5fTUVNIDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBSRlA4MDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyNGUDgwX1RPX0lOVDE2X0lOX01FTSBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFg4NmZwX3RvX2kxNm1lbSBSRlA4MDokc3JjLCBhZGRyOiRkc3QpXT47DQorICBkZWYgRlA4MF9UT19JTlQzMl9JTl9NRU0gOiBJPDAsIFBzZXVkbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIFJGUDgwOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjI0ZQODBfVE9fSU5UMzJfSU5fTUVNIFBTRVVETyEiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoWDg2ZnBfdG9faTMybWVtIFJGUDgwOiRzcmMsIGFkZHI6JGRzdCldPjsNCisgIGRlZiBGUDgwX1RPX0lOVDY0X0lOX01FTSA6IEk8MCwgUHNldWRvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgUkZQODA6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMjRlA4MF9UT19JTlQ2NF9JTl9NRU0gUFNFVURPISIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhYODZmcF90b19pNjRtZW0gUkZQODA6JHNyYywgYWRkcjokZHN0KV0+Ow0KK30NCisNCisvLyBBbGwgRlAgU3RhY2sgb3BlcmF0aW9ucyBhcmUgcmVwcmVzZW50ZWQgd2l0aCBmb3VyIGluc3RydWN0aW9ucyBoZXJlLiAgVGhlDQorLy8gZmlyc3QgdGhyZWUgaW5zdHJ1Y3Rpb25zLCBnZW5lcmF0ZWQgYnkgdGhlIGluc3RydWN0aW9uIHNlbGVjdG9yLCB1c2UgIlJGUDMyIg0KKy8vICJSRlA2NCIgb3IgIlJGUDgwIiByZWdpc3RlcnM6IHRyYWRpdGlvbmFsIHJlZ2lzdGVyIGZpbGVzIHRvIHJlZmVyZW5jZSAzMi1iaXQsDQorLy8gNjQtYml0IG9yIDgwLWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZXMuICBUaGVzZSBzaXplcyBhcHBseSB0byB0aGUgdmFsdWVzLCANCisvLyBub3QgdGhlIHJlZ2lzdGVycywgd2hpY2ggYXJlIGFsd2F5cyA4MCBiaXRzOyBSRlAzMiwgUkZQNjQgYW5kIFJGUDgwIGNhbiBiZQ0KKy8vIGNvcGllZCB0byBlYWNoIG90aGVyIHdpdGhvdXQgbG9zaW5nIGluZm9ybWF0aW9uLiAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBhbGwNCisvLyBwc2V1ZG8gaW5zdHJ1Y3Rpb25zIGFuZCB1c2UgdGhlICJfRnAiIHN1ZmZpeC4NCisvLyBJbiBzb21lIGNhc2VzIHRoZXJlIGFyZSBhZGRpdGlvbmFsIHZhcmlhbnRzIHdpdGggYSBtaXh0dXJlIG9mIGRpZmZlcmVudA0KKy8vIHJlZ2lzdGVyIHNpemVzLg0KKy8vIFRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gaXMgZGVmaW5lZCB3aXRoIEZQSSwgd2hpY2ggaXMgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbg0KKy8vIGVtaXR0ZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRoZXNlIHVzZSAiUlNUIiByZWdpc3RlcnMsIGFsdGhvdWdoIGZyZXF1ZW50bHkNCisvLyB0aGUgYWN0dWFsIHJlZ2lzdGVyKHMpIHVzZWQgYXJlIGltcGxpY2l0LiAgVGhlc2UgYXJlIGFsd2F5cyA4MCBiaXRzLg0KKy8vIFRoZSBGUCBzdGFja2lmaWVyIHBhc3MgY29udmVydHMgb25lIHRvIHRoZSBvdGhlciBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uIA0KKy8vIG9jY3Vycy4NCisvLw0KKy8vIE5vdGUgdGhhdCB0aGUgRnBJIGluc3RydWN0aW9uIHNob3VsZCBoYXZlIGluc3RydWN0aW9uIHNlbGVjdGlvbiBpbmZvIChlLmcuDQorLy8gYSBwYXR0ZXJuKSBhbmQgdGhlIEZQSSBpbnN0cnVjdGlvbiBzaG91bGQgaGF2ZSBlbWlzc2lvbiBpbmZvIChlLmcuIG9wY29kZQ0KKy8vIGVuY29kaW5nIGFuZCBhc20gcHJpbnRpbmcgaW5mbykuDQorDQorLy8gUHNldWRvIEluc3RydWN0aW9ucyBmb3IgRlAgc3RhY2sgcmV0dXJuIHZhbHVlcy4NCitkZWYgRnBHRVRfU1QwXzMyIDogRnBJXzwob3V0cyBSRlAzMjokZHN0KSwgKGlucyksIFNwZWNpYWxGUCwgW10+OyAvLyBGUFIgPSBTVCgwKQ0KK2RlZiBGcEdFVF9TVDBfNjQgOiBGcElfPChvdXRzIFJGUDY0OiRkc3QpLCAoaW5zKSwgU3BlY2lhbEZQLCBbXT47IC8vIEZQUiA9IFNUKDApDQorZGVmIEZwR0VUX1NUMF84MCA6IEZwSV88KG91dHMgUkZQODA6JGRzdCksIChpbnMpLCBTcGVjaWFsRlAsIFtdPjsgLy8gRlBSID0gU1QoMCkNCisNCisvLyBGcEdFVF9TVDEqIHNob3VsZCBvbmx5IGJlIGlzc3VlZCAqYWZ0ZXIqIGFuIEZwR0VUX1NUMCogaGFzIGJlZW4gaXNzdWVkIHdoZW4NCisvLyB0aGVyZSBhcmUgdHdvIHZhbHVlcyBsaXZlIG91dCBvbiB0aGUgc3RhY2sgZnJvbSBhIGNhbGwgb3IgaW5saW5lYXNtLiAgVGhpcw0KKy8vIG1hZ2ljIGlzIGhhbmRsZWQgYnkgdGhlIHN0YWNraWZpZXIuICBJdCBpcyBub3QgdmFsaWQgdG8gZW1pdCBGcEdFVF9TVDEqIGFuZA0KKy8vIHRoZW4gRnBHRVRfU1QwKi4gIEluIGFkZGl0aW9uLCBpdCBpcyBpbnZhbGlkIGZvciBhbnkgRlAtdXNpbmcgb3BlcmF0aW9ucyB0bw0KKy8vIG9jY3VyIGJldHdlZW4gdGhlbS4NCitkZWYgRnBHRVRfU1QxXzMyIDogRnBJXzwob3V0cyBSRlAzMjokZHN0KSwgKGlucyksIFNwZWNpYWxGUCwgW10+OyAvLyBGUFIgPSBTVCgxKQ0KK2RlZiBGcEdFVF9TVDFfNjQgOiBGcElfPChvdXRzIFJGUDY0OiRkc3QpLCAoaW5zKSwgU3BlY2lhbEZQLCBbXT47IC8vIEZQUiA9IFNUKDEpDQorZGVmIEZwR0VUX1NUMV84MCA6IEZwSV88KG91dHMgUkZQODA6JGRzdCksIChpbnMpLCBTcGVjaWFsRlAsIFtdPjsgLy8gRlBSID0gU1QoMSkNCisNCitsZXQgRGVmcyA9IFtTVDBdIGluIHsNCitkZWYgRnBTRVRfU1QwXzMyIDogRnBJXzwob3V0cyksIChpbnMgUkZQMzI6JHNyYyksIFNwZWNpYWxGUCwgW10+OyAvLyBTVCgwKSA9IEZQUg0KK2RlZiBGcFNFVF9TVDBfNjQgOiBGcElfPChvdXRzKSwgKGlucyBSRlA2NDokc3JjKSwgU3BlY2lhbEZQLCBbXT47IC8vIFNUKDApID0gRlBSDQorZGVmIEZwU0VUX1NUMF84MCA6IEZwSV88KG91dHMpLCAoaW5zIFJGUDgwOiRzcmMpLCBTcGVjaWFsRlAsIFtdPjsgLy8gU1QoMCkgPSBGUFINCit9DQorDQorbGV0IERlZnMgPSBbU1QxXSBpbiB7DQorZGVmIEZwU0VUX1NUMV8zMiA6IEZwSV88KG91dHMpLCAoaW5zIFJGUDMyOiRzcmMpLCBTcGVjaWFsRlAsIFtdPjsgLy8gU1QoMSkgPSBGUFINCitkZWYgRnBTRVRfU1QxXzY0IDogRnBJXzwob3V0cyksIChpbnMgUkZQNjQ6JHNyYyksIFNwZWNpYWxGUCwgW10+OyAvLyBTVCgxKSA9IEZQUg0KK2RlZiBGcFNFVF9TVDFfODAgOiBGcElfPChvdXRzKSwgKGlucyBSRlA4MDokc3JjKSwgU3BlY2lhbEZQLCBbXT47IC8vIFNUKDEpID0gRlBSDQorfQ0KKw0KKy8vIEZwSWYzMiwgRnBJZjY0IC0gRmxvYXRpbmcgUG9pbnQgUHN1ZWRvIEluc3RydWN0aW9uIHRlbXBsYXRlLg0KKy8vIGYzMiBpbnN0cnVjdGlvbnMgY2FuIHVzZSBTU0UxIGFuZCBhcmUgcHJlZGljYXRlZCBvbiBGUFN0YWNrZjMyID09ICFTU0UxLg0KKy8vIGY2NCBpbnN0cnVjdGlvbnMgY2FuIHVzZSBTU0UyIGFuZCBhcmUgcHJlZGljYXRlZCBvbiBGUFN0YWNrZjY0ID09ICFTU0UyLg0KKy8vIGY4MCBpbnN0cnVjdGlvbnMgY2Fubm90IHVzZSBTU0UgYW5kIHVzZSBuZWl0aGVyIG9mIHRoZXNlLg0KK2NsYXNzIEZwSWYzMjxkYWcgb3V0cywgZGFnIGlucywgRlBGb3JtYXQgZnAsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6DQorICBGcElfPG91dHMsIGlucywgZnAsIHBhdHRlcm4+LCBSZXF1aXJlczxbRlBTdGFja2YzMl0+Ow0KK2NsYXNzIEZwSWY2NDxkYWcgb3V0cywgZGFnIGlucywgRlBGb3JtYXQgZnAsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6DQorICBGcElfPG91dHMsIGlucywgZnAsIHBhdHRlcm4+LCBSZXF1aXJlczxbRlBTdGFja2Y2NF0+Ow0KKw0KKy8vIFJlZ2lzdGVyIGNvcGllcy4gIEp1c3QgY29waWVzLCB0aGUgc2hvcnRlbmluZyBvbmVzIGRvIG5vdCB0cnVuY2F0ZS4NCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4gew0KKyAgZGVmIE1PVl9GcDMyMzIgOiBGcElmMzI8KG91dHMgUkZQMzI6JGRzdCksIChpbnMgUkZQMzI6JHNyYyksIFNwZWNpYWxGUCwgW10+OyANCisgIGRlZiBNT1ZfRnAzMjY0IDogRnBJZjMyPChvdXRzIFJGUDY0OiRkc3QpLCAoaW5zIFJGUDMyOiRzcmMpLCBTcGVjaWFsRlAsIFtdPjsgDQorICBkZWYgTU9WX0ZwNjQzMiA6IEZwSWYzMjwob3V0cyBSRlAzMjokZHN0KSwgKGlucyBSRlA2NDokc3JjKSwgU3BlY2lhbEZQLCBbXT47IA0KKyAgZGVmIE1PVl9GcDY0NjQgOiBGcElmNjQ8KG91dHMgUkZQNjQ6JGRzdCksIChpbnMgUkZQNjQ6JHNyYyksIFNwZWNpYWxGUCwgW10+OyANCisgIGRlZiBNT1ZfRnA4MDMyIDogRnBJZjMyPChvdXRzIFJGUDMyOiRkc3QpLCAoaW5zIFJGUDgwOiRzcmMpLCBTcGVjaWFsRlAsIFtdPjsgDQorICBkZWYgTU9WX0ZwMzI4MCA6IEZwSWYzMjwob3V0cyBSRlA4MDokZHN0KSwgKGlucyBSRlAzMjokc3JjKSwgU3BlY2lhbEZQLCBbXT47IA0KKyAgZGVmIE1PVl9GcDgwNjQgOiBGcElmNjQ8KG91dHMgUkZQNjQ6JGRzdCksIChpbnMgUkZQODA6JHNyYyksIFNwZWNpYWxGUCwgW10+OyANCisgIGRlZiBNT1ZfRnA2NDgwIDogRnBJZjY0PChvdXRzIFJGUDgwOiRkc3QpLCAoaW5zIFJGUDY0OiRzcmMpLCBTcGVjaWFsRlAsIFtdPjsgDQorICBkZWYgTU9WX0ZwODA4MCA6IEZwSV8gIDwob3V0cyBSRlA4MDokZHN0KSwgKGlucyBSRlA4MDokc3JjKSwgU3BlY2lhbEZQLCBbXT47IA0KK30NCisNCisvLyBGYWN0b3JpbmcgZm9yIGFyaXRobWV0aWMuDQorbXVsdGljbGFzcyBGUEJpbmFyeV9ycjxTRE5vZGUgT3BOb2RlPiB7DQorLy8gUmVnaXN0ZXIgb3AgcmVnaXN0ZXIgLT4gcmVnaXN0ZXINCisvLyBUaGVzZSBhcmUgc2VwYXJhdGVkIG91dCBiZWNhdXNlIHRoZXkgaGF2ZSBubyByZXZlcnNlZCBmb3JtLg0KK2RlZiBfRnAzMiA6IEZwSWYzMjwob3V0cyBSRlAzMjokZHN0KSwgKGlucyBSRlAzMjokc3JjMSwgUkZQMzI6JHNyYzIpLCBUd29BcmdGUCwNCisgICAgICAgICAgICAgICAgWyhzZXQgUkZQMzI6JGRzdCwgKE9wTm9kZSBSRlAzMjokc3JjMSwgUkZQMzI6JHNyYzIpKV0+Ow0KK2RlZiBfRnA2NCA6IEZwSWY2NDwob3V0cyBSRlA2NDokZHN0KSwgKGlucyBSRlA2NDokc3JjMSwgUkZQNjQ6JHNyYzIpLCBUd29BcmdGUCwNCisgICAgICAgICAgICAgICAgWyhzZXQgUkZQNjQ6JGRzdCwgKE9wTm9kZSBSRlA2NDokc3JjMSwgUkZQNjQ6JHNyYzIpKV0+Ow0KK2RlZiBfRnA4MCA6IEZwSV88KG91dHMgUkZQODA6JGRzdCksIChpbnMgUkZQODA6JHNyYzEsIFJGUDgwOiRzcmMyKSwgVHdvQXJnRlAsDQorICAgICAgICAgICAgICAgIFsoc2V0IFJGUDgwOiRkc3QsIChPcE5vZGUgUkZQODA6JHNyYzEsIFJGUDgwOiRzcmMyKSldPjsNCit9DQorLy8gVGhlIEZvcFNUMCBzZXJpZXMgYXJlIG5vdCBpbmNsdWRlZCBoZXJlIGJlY2F1c2Ugb2YgdGhlIGlycmVndWxhcml0aWVzDQorLy8gaW4gd2hlcmUgdGhlICdyJyBnb2VzIGluIGFzc2VtYmx5IG91dHB1dC4NCisvLyBUaGVzZSBpbnN0cnVjdGlvbnMgY2Fubm90IGFkZHJlc3MgODAtYml0IG1lbW9yeS4NCittdWx0aWNsYXNzIEZQQmluYXJ5PFNETm9kZSBPcE5vZGUsIEZvcm1hdCBmcCwgc3RyaW5nIGFzbXN0cmluZz4gew0KKy8vIFNUKDApID0gU1QoMCkgKyBbbWVtXQ0KK2RlZiBfRnAzMm0gIDogRnBJZjMyPChvdXRzIFJGUDMyOiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgICAoaW5zIFJGUDMyOiRzcmMxLCBmMzJtZW06JHNyYzIpLCBPbmVBcmdGUFJXLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDMyOiRkc3QsIA0KKyAgICAgICAgICAgICAgICAgICAgKE9wTm9kZSBSRlAzMjokc3JjMSwgKGxvYWRmMzIgYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBfRnA2NG0gIDogRnBJZjY0PChvdXRzIFJGUDY0OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgICAoaW5zIFJGUDY0OiRzcmMxLCBmNjRtZW06JHNyYzIpLCBPbmVBcmdGUFJXLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDY0OiRkc3QsIA0KKyAgICAgICAgICAgICAgICAgICAgKE9wTm9kZSBSRlA2NDokc3JjMSwgKGxvYWRmNjQgYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBfRnA2NG0zMjogRnBJZjY0PChvdXRzIFJGUDY0OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgICAoaW5zIFJGUDY0OiRzcmMxLCBmMzJtZW06JHNyYzIpLCBPbmVBcmdGUFJXLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDY0OiRkc3QsIA0KKyAgICAgICAgICAgICAgICAgICAgKE9wTm9kZSBSRlA2NDokc3JjMSwgKGY2NCAoZXh0bG9hZGYzMiBhZGRyOiRzcmMyKSkpKV0+Ow0KK2RlZiBfRnA4MG0zMjogRnBJXzwob3V0cyBSRlA4MDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgIChpbnMgUkZQODA6JHNyYzEsIGYzMm1lbTokc3JjMiksIE9uZUFyZ0ZQUlcsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQODA6JGRzdCwgDQorICAgICAgICAgICAgICAgICAgICAoT3BOb2RlIFJGUDgwOiRzcmMxLCAoZjgwIChleHRsb2FkZjMyIGFkZHI6JHNyYzIpKSkpXT47DQorZGVmIF9GcDgwbTY0OiBGcElfPChvdXRzIFJGUDgwOiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgKGlucyBSRlA4MDokc3JjMSwgZjY0bWVtOiRzcmMyKSwgT25lQXJnRlBSVywNCisgICAgICAgICAgICAgICAgICBbKHNldCBSRlA4MDokZHN0LCANCisgICAgICAgICAgICAgICAgICAgIChPcE5vZGUgUkZQODA6JHNyYzEsIChmODAgKGV4dGxvYWRmNjQgYWRkcjokc3JjMikpKSldPjsNCitkZWYgX0YzMm0gIDogRlBJPDB4RDgsIGZwLCAob3V0cyksIChpbnMgZjMybWVtOiRzcmMpLCANCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoImYiLCAhc3RyY29uY2F0KGFzbXN0cmluZywgIntzfVx0JHNyYyIpKT4geyANCisgIGxldCBtYXlMb2FkID0gMTsgDQorfQ0KK2RlZiBfRjY0bSAgOiBGUEk8MHhEQywgZnAsIChvdXRzKSwgKGlucyBmNjRtZW06JHNyYyksIA0KKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdCgiZiIsICFzdHJjb25jYXQoYXNtc3RyaW5nLCAie2x9XHQkc3JjIikpPiB7IA0KKyAgbGV0IG1heUxvYWQgPSAxOyANCit9DQorLy8gU1QoMCkgPSBTVCgwKSArIFttZW1pbnRdDQorZGVmIF9GcEkxNm0zMiA6IEZwSWYzMjwob3V0cyBSRlAzMjokZHN0KSwgKGlucyBSRlAzMjokc3JjMSwgaTE2bWVtOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgICAgICBPbmVBcmdGUFJXLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQMzI6JGRzdCwgKE9wTm9kZSBSRlAzMjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2ZmlsZCBhZGRyOiRzcmMyLCBpMTYpKSldPjsNCitkZWYgX0ZwSTMybTMyIDogRnBJZjMyPChvdXRzIFJGUDMyOiRkc3QpLCAoaW5zIFJGUDMyOiRzcmMxLCBpMzJtZW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICAgIE9uZUFyZ0ZQUlcsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBSRlAzMjokZHN0LCAoT3BOb2RlIFJGUDMyOiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZmaWxkIGFkZHI6JHNyYzIsIGkzMikpKV0+Ow0KK2RlZiBfRnBJMTZtNjQgOiBGcElmNjQ8KG91dHMgUkZQNjQ6JGRzdCksIChpbnMgUkZQNjQ6JHNyYzEsIGkxNm1lbTokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICAgICAgT25lQXJnRlBSVywNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDY0OiRkc3QsIChPcE5vZGUgUkZQNjQ6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NmZpbGQgYWRkcjokc3JjMiwgaTE2KSkpXT47DQorZGVmIF9GcEkzMm02NCA6IEZwSWY2NDwob3V0cyBSRlA2NDokZHN0KSwgKGlucyBSRlA2NDokc3JjMSwgaTMybWVtOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgICAgICBPbmVBcmdGUFJXLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQNjQ6JGRzdCwgKE9wTm9kZSBSRlA2NDokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2ZmlsZCBhZGRyOiRzcmMyLCBpMzIpKSldPjsNCitkZWYgX0ZwSTE2bTgwIDogRnBJXzwob3V0cyBSRlA4MDokZHN0KSwgKGlucyBSRlA4MDokc3JjMSwgaTE2bWVtOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgICAgICBPbmVBcmdGUFJXLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQODA6JGRzdCwgKE9wTm9kZSBSRlA4MDokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2ZmlsZCBhZGRyOiRzcmMyLCBpMTYpKSldPjsNCitkZWYgX0ZwSTMybTgwIDogRnBJXzwob3V0cyBSRlA4MDokZHN0KSwgKGlucyBSRlA4MDokc3JjMSwgaTMybWVtOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgICAgICBPbmVBcmdGUFJXLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQODA6JGRzdCwgKE9wTm9kZSBSRlA4MDokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2ZmlsZCBhZGRyOiRzcmMyLCBpMzIpKSldPjsNCitkZWYgX0ZJMTZtICA6IEZQSTwweERFLCBmcCwgKG91dHMpLCAoaW5zIGkxNm1lbTokc3JjKSwgDQorICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdCgiZmkiLCAhc3RyY29uY2F0KGFzbXN0cmluZywgIntzfVx0JHNyYyIpKT4geyANCisgIGxldCBtYXlMb2FkID0gMTsgDQorfQ0KK2RlZiBfRkkzMm0gIDogRlBJPDB4REEsIGZwLCAob3V0cyksIChpbnMgaTMybWVtOiRzcmMpLCANCisgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KCJmaSIsICFzdHJjb25jYXQoYXNtc3RyaW5nLCAie2x9XHQkc3JjIikpPiB7IA0KKyAgbGV0IG1heUxvYWQgPSAxOyANCit9DQorfQ0KKw0KK2RlZm0gQUREIDogRlBCaW5hcnlfcnI8ZmFkZD47DQorZGVmbSBTVUIgOiBGUEJpbmFyeV9ycjxmc3ViPjsNCitkZWZtIE1VTCA6IEZQQmluYXJ5X3JyPGZtdWw+Ow0KK2RlZm0gRElWIDogRlBCaW5hcnlfcnI8ZmRpdj47DQorZGVmbSBBREQgOiBGUEJpbmFyeTxmYWRkLCBNUk0wbSwgImFkZCI+Ow0KK2RlZm0gU1VCIDogRlBCaW5hcnk8ZnN1YiwgTVJNNG0sICJzdWIiPjsNCitkZWZtIFNVQlI6IEZQQmluYXJ5PGZzdWIgLE1STTVtLCAic3ViciI+Ow0KK2RlZm0gTVVMIDogRlBCaW5hcnk8Zm11bCwgTVJNMW0sICJtdWwiPjsNCitkZWZtIERJViA6IEZQQmluYXJ5PGZkaXYsIE1STTZtLCAiZGl2Ij47DQorZGVmbSBESVZSOiBGUEJpbmFyeTxmZGl2LCBNUk03bSwgImRpdnIiPjsNCisNCitjbGFzcyBGUFNUMHJJbnN0PGJpdHM8OD4gbywgc3RyaW5nIGFzbT4NCisgIDogRlBJPG8sIEFkZFJlZ0ZybSwgKG91dHMpLCAoaW5zIFJTVDokb3ApLCBhc20+LCBEODsNCitjbGFzcyBGUHJTVDBJbnN0PGJpdHM8OD4gbywgc3RyaW5nIGFzbT4NCisgIDogRlBJPG8sIEFkZFJlZ0ZybSwgKG91dHMpLCAoaW5zIFJTVDokb3ApLCBhc20+LCBEQzsNCitjbGFzcyBGUHJTVDBQSW5zdDxiaXRzPDg+IG8sIHN0cmluZyBhc20+DQorICA6IEZQSTxvLCBBZGRSZWdGcm0sIChvdXRzKSwgKGlucyBSU1Q6JG9wKSwgYXNtPiwgREU7DQorDQorLy8gTk9URTogR0FTIGFuZCBhcHBhcmVudGx5IGFsbCBvdGhlciBBVCZUIHN0eWxlIGFzc2VtYmxlcnMgaGF2ZSBhIGJyb2tlbiBub3Rpb24NCisvLyBvZiBzb21lIG9mIHRoZSAncmV2ZXJzZScgZm9ybXMgb2YgdGhlIGZzdWIgYW5kIGZkaXYgaW5zdHJ1Y3Rpb25zLiAgQXMgc3VjaCwNCisvLyB3ZSBoYXZlIHRvIHB1dCBzb21lICdyJ3MgaW4gYW5kIHRha2UgdGhlbSBvdXQgb2Ygd2VpcmQgcGxhY2VzLg0KK2RlZiBBRERfRlNUMHIgICA6IEZQU1Qwckluc3QgPDB4QzAsICJmYWRkXHQkb3AiPjsNCitkZWYgQUREX0ZyU1QwICAgOiBGUHJTVDBJbnN0IDwweEMwLCAiZmFkZFx0eyVzdCgwKSwgJG9wfCRvcCwgJVNUKDApfSI+Ow0KK2RlZiBBRERfRlByU1QwICA6IEZQclNUMFBJbnN0PDB4QzAsICJmYWRkcFx0JG9wIj47DQorZGVmIFNVQlJfRlNUMHIgIDogRlBTVDBySW5zdCA8MHhFOCwgImZzdWJyXHQkb3AiPjsNCitkZWYgU1VCX0ZyU1QwICAgOiBGUHJTVDBJbnN0IDwweEU4LCAiZnN1YntyfVx0eyVzdCgwKSwgJG9wfCRvcCwgJVNUKDApfSI+Ow0KK2RlZiBTVUJfRlByU1QwICA6IEZQclNUMFBJbnN0PDB4RTgsICJmc3Vie3J9cFx0JG9wIj47DQorZGVmIFNVQl9GU1QwciAgIDogRlBTVDBySW5zdCA8MHhFMCwgImZzdWJcdCRvcCI+Ow0KK2RlZiBTVUJSX0ZyU1QwICA6IEZQclNUMEluc3QgPDB4RTAsICJmc3Vie3xyfVx0eyVzdCgwKSwgJG9wfCRvcCwgJVNUKDApfSI+Ow0KK2RlZiBTVUJSX0ZQclNUMCA6IEZQclNUMFBJbnN0PDB4RTAsICJmc3Vie3xyfXBcdCRvcCI+Ow0KK2RlZiBNVUxfRlNUMHIgICA6IEZQU1Qwckluc3QgPDB4QzgsICJmbXVsXHQkb3AiPjsNCitkZWYgTVVMX0ZyU1QwICAgOiBGUHJTVDBJbnN0IDwweEM4LCAiZm11bFx0eyVzdCgwKSwgJG9wfCRvcCwgJVNUKDApfSI+Ow0KK2RlZiBNVUxfRlByU1QwICA6IEZQclNUMFBJbnN0PDB4QzgsICJmbXVscFx0JG9wIj47DQorZGVmIERJVlJfRlNUMHIgIDogRlBTVDBySW5zdCA8MHhGOCwgImZkaXZyXHQkb3AiPjsNCitkZWYgRElWX0ZyU1QwICAgOiBGUHJTVDBJbnN0IDwweEY4LCAiZmRpdntyfVx0eyVzdCgwKSwgJG9wfCRvcCwgJVNUKDApfSI+Ow0KK2RlZiBESVZfRlByU1QwICA6IEZQclNUMFBJbnN0PDB4RjgsICJmZGl2e3J9cFx0JG9wIj47DQorZGVmIERJVl9GU1QwciAgIDogRlBTVDBySW5zdCA8MHhGMCwgImZkaXZcdCRvcCI+Ow0KK2RlZiBESVZSX0ZyU1QwICA6IEZQclNUMEluc3QgPDB4RjAsICJmZGl2e3xyfVx0eyVzdCgwKSwgJG9wfCRvcCwgJVNUKDApfSI+Ow0KK2RlZiBESVZSX0ZQclNUMCA6IEZQclNUMFBJbnN0PDB4RjAsICJmZGl2e3xyfXBcdCRvcCI+Ow0KKw0KK2RlZiBDT01fRlNUMHIgICA6IEZQU1Qwckluc3QgPDB4RDAsICJmY29tXHQkb3AiPjsNCitkZWYgQ09NUF9GU1QwciAgOiBGUFNUMHJJbnN0IDwweEQ4LCAiZmNvbXBcdCRvcCI+Ow0KKw0KKy8vIFVuYXJ5IG9wZXJhdGlvbnMuDQorbXVsdGljbGFzcyBGUFVuYXJ5PFNETm9kZSBPcE5vZGUsIGJpdHM8OD4gb3Bjb2RlLCBzdHJpbmcgYXNtc3RyaW5nPiB7DQorZGVmIF9GcDMyICA6IEZwSWYzMjwob3V0cyBSRlAzMjokZHN0KSwgKGlucyBSRlAzMjokc3JjKSwgT25lQXJnRlBSVywNCisgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDMyOiRkc3QsIChPcE5vZGUgUkZQMzI6JHNyYykpXT47DQorZGVmIF9GcDY0ICA6IEZwSWY2NDwob3V0cyBSRlA2NDokZHN0KSwgKGlucyBSRlA2NDokc3JjKSwgT25lQXJnRlBSVywNCisgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDY0OiRkc3QsIChPcE5vZGUgUkZQNjQ6JHNyYykpXT47DQorZGVmIF9GcDgwICA6IEZwSV88KG91dHMgUkZQODA6JGRzdCksIChpbnMgUkZQODA6JHNyYyksIE9uZUFyZ0ZQUlcsDQorICAgICAgICAgICAgICAgICBbKHNldCBSRlA4MDokZHN0LCAoT3BOb2RlIFJGUDgwOiRzcmMpKV0+Ow0KK2RlZiBfRiAgICAgOiBGUEk8b3Bjb2RlLCBSYXdGcm0sIChvdXRzKSwgKGlucyksIGFzbXN0cmluZz4sIEQ5Ow0KK30NCisNCitkZWZtIENIUyA6IEZQVW5hcnk8Zm5lZywgMHhFMCwgImZjaHMiPjsNCitkZWZtIEFCUyA6IEZQVW5hcnk8ZmFicywgMHhFMSwgImZhYnMiPjsNCitkZWZtIFNRUlQ6IEZQVW5hcnk8ZnNxcnQsMHhGQSwgImZzcXJ0Ij47DQorZGVmbSBTSU4gOiBGUFVuYXJ5PGZzaW4sIDB4RkUsICJmc2luIj47DQorZGVmbSBDT1MgOiBGUFVuYXJ5PGZjb3MsIDB4RkYsICJmY29zIj47DQorDQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCitkZWYgVFNUX0ZwMzIgIDogRnBJZjMyPChvdXRzKSwgKGlucyBSRlAzMjokc3JjKSwgT25lQXJnRlAsIFtdPjsNCitkZWYgVFNUX0ZwNjQgIDogRnBJZjY0PChvdXRzKSwgKGlucyBSRlA2NDokc3JjKSwgT25lQXJnRlAsIFtdPjsNCitkZWYgVFNUX0ZwODAgIDogRnBJXzwob3V0cyksIChpbnMgUkZQODA6JHNyYyksIE9uZUFyZ0ZQLCBbXT47DQorfQ0KK2RlZiBUU1RfRiAgOiBGUEk8MHhFNCwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiZnRzdCI+LCBEOTsNCisNCisvLyBWZXJzaW9ucyBvZiBGUCBpbnN0cnVjdGlvbnMgdGhhdCB0YWtlIGEgc2luZ2xlIG1lbW9yeSBvcGVyYW5kLiAgQWRkZWQgZm9yIHRoZQ0KKy8vICAgZGlzYXNzZW1ibGVyOyByZW1vdmUgYXMgdGhleSBhcmUgaW5jbHVkZWQgd2l0aCBwYXR0ZXJucyBlbHNld2hlcmUuDQorZGVmIEZDT00zMm0gIDogRlBJPDB4RDgsIE1STTJtLCAob3V0cyksIChpbnMgZjMybWVtOiRzcmMpLCAiZmNvbXtzfVx0JHNyYyI+Ow0KK2RlZiBGQ09NUDMybSA6IEZQSTwweEQ4LCBNUk0zbSwgKG91dHMpLCAoaW5zIGYzMm1lbTokc3JjKSwgImZjb21we3N9XHQkc3JjIj47DQorDQorZGVmIEZMREVOVm0gIDogRlBJPDB4RDksIE1STTRtLCAob3V0cyksIChpbnMgZjMybWVtOiRzcmMpLCAiZmxkZW52XHQkc3JjIj47DQorZGVmIEZTVEVOVm0gIDogRlBJPDB4RDksIE1STTZtLCAob3V0cyBmMzJtZW06JGRzdCksIChpbnMpLCAiZm5zdGVudlx0JGRzdCI+Ow0KKw0KK2RlZiBGSUNPTTMybSA6IEZQSTwweERBLCBNUk0ybSwgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjKSwgImZpY29te2x9XHQkc3JjIj47DQorZGVmIEZJQ09NUDMybTogRlBJPDB4REEsIE1STTNtLCAob3V0cyksIChpbnMgaTMybWVtOiRzcmMpLCAiZmljb21we2x9XHQkc3JjIj47DQorDQorZGVmIEZDT002NG0gIDogRlBJPDB4REMsIE1STTJtLCAob3V0cyksIChpbnMgZjY0bWVtOiRzcmMpLCAiZmNvbXtsfVx0JHNyYyI+Ow0KK2RlZiBGQ09NUDY0bSA6IEZQSTwweERDLCBNUk0zbSwgKG91dHMpLCAoaW5zIGY2NG1lbTokc3JjKSwgImZjb21we2x9XHQkc3JjIj47DQorDQorZGVmIEZSU1RPUm0gIDogRlBJPDB4REQsIE1STTRtLCAob3V0cyBmMzJtZW06JGRzdCksIChpbnMpLCAiZnJzdG9yXHQkZHN0Ij47DQorZGVmIEZTQVZFbSAgIDogRlBJPDB4REQsIE1STTZtLCAob3V0cyBmMzJtZW06JGRzdCksIChpbnMpLCAiZm5zYXZlXHQkZHN0Ij47DQorZGVmIEZOU1RTV20gIDogRlBJPDB4REQsIE1STTdtLCAob3V0cyBmMzJtZW06JGRzdCksIChpbnMpLCAiZm5zdHN3XHQkZHN0Ij47DQorDQorZGVmIEZJQ09NMTZtIDogRlBJPDB4REUsIE1STTJtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMpLCAiZmljb217c31cdCRzcmMiPjsNCitkZWYgRklDT01QMTZtOiBGUEk8MHhERSwgTVJNM20sIChvdXRzKSwgKGlucyBpMTZtZW06JHNyYyksICJmaWNvbXB7c31cdCRzcmMiPjsNCisNCitkZWYgRkJMRG0gICAgOiBGUEk8MHhERiwgTVJNNG0sIChvdXRzKSwgKGlucyBmMzJtZW06JHNyYyksICJmYmxkXHQkc3JjIj47DQorZGVmIEZCU1RQbSAgIDogRlBJPDB4REYsIE1STTZtLCAob3V0cyBmMzJtZW06JGRzdCksIChpbnMpLCAiZmJzdHBcdCRkc3QiPjsNCisNCisvLyBGbG9hdGluZyBwb2ludCBjbW92cy4NCitjbGFzcyBGcElmMzJDTW92PGRhZyBvdXRzLCBkYWcgaW5zLCBGUEZvcm1hdCBmcCwgbGlzdDxkYWc+IHBhdHRlcm4+IDoNCisgIEZwSV88b3V0cywgaW5zLCBmcCwgcGF0dGVybj4sIFJlcXVpcmVzPFtGUFN0YWNrZjMyLCBIYXNDTW92XT47DQorY2xhc3MgRnBJZjY0Q01vdjxkYWcgb3V0cywgZGFnIGlucywgRlBGb3JtYXQgZnAsIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6DQorICBGcElfPG91dHMsIGlucywgZnAsIHBhdHRlcm4+LCBSZXF1aXJlczxbRlBTdGFja2Y2NCwgSGFzQ01vdl0+Ow0KKw0KK211bHRpY2xhc3MgRlBDTW92PFBhdExlYWYgY2M+IHsNCisgIGRlZiBfRnAzMiAgOiBGcElmMzJDTW92PChvdXRzIFJGUDMyOiRkc3QpLCAoaW5zIFJGUDMyOiRzcmMxLCBSRlAzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICBDb25kTW92RlAsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQMzI6JGRzdCwgKFg4NmNtb3YgUkZQMzI6JHNyYzEsIFJGUDMyOiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYywgRUZMQUdTKSldPjsNCisgIGRlZiBfRnA2NCAgOiBGcElmNjRDTW92PChvdXRzIFJGUDY0OiRkc3QpLCAoaW5zIFJGUDY0OiRzcmMxLCBSRlA2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICBDb25kTW92RlAsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQNjQ6JGRzdCwgKFg4NmNtb3YgUkZQNjQ6JHNyYzEsIFJGUDY0OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYywgRUZMQUdTKSldPjsNCisgIGRlZiBfRnA4MCAgOiBGcElfPChvdXRzIFJGUDgwOiRkc3QpLCAoaW5zIFJGUDgwOiRzcmMxLCBSRlA4MDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgQ29uZE1vdkZQLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDgwOiRkc3QsIChYODZjbW92IFJGUDgwOiRzcmMxLCBSRlA4MDokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNDTW92XT47DQorfQ0KKw0KK2xldCBVc2VzID0gW0VGTEFHU10sIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KK2RlZm0gQ01PVkIgIDogRlBDTW92PFg4Nl9DT05EX0I+Ow0KK2RlZm0gQ01PVkJFIDogRlBDTW92PFg4Nl9DT05EX0JFPjsNCitkZWZtIENNT1ZFICA6IEZQQ01vdjxYODZfQ09ORF9FPjsNCitkZWZtIENNT1ZQICA6IEZQQ01vdjxYODZfQ09ORF9QPjsNCitkZWZtIENNT1ZOQiA6IEZQQ01vdjxYODZfQ09ORF9BRT47DQorZGVmbSBDTU9WTkJFOiBGUENNb3Y8WDg2X0NPTkRfQT47DQorZGVmbSBDTU9WTkUgOiBGUENNb3Y8WDg2X0NPTkRfTkU+Ow0KK2RlZm0gQ01PVk5QIDogRlBDTW92PFg4Nl9DT05EX05QPjsNCit9IC8vIFVzZXMgPSBbRUZMQUdTXSwgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0Ig0KKw0KK2xldCBQcmVkaWNhdGVzID0gW0hhc0NNb3ZdIGluIHsNCisvLyBUaGVzZSBhcmUgbm90IGZhY3RvcmVkIGJlY2F1c2UgdGhlcmUncyBubyBjbGVhbiB3YXkgdG8gcGFzcyBEQS9EQi4NCitkZWYgQ01PVkJfRiAgOiBGUEk8MHhDMCwgQWRkUmVnRnJtLCAob3V0cyBSU1Q6JG9wKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgImZjbW92Ylx0eyRvcCwgJXN0KDApfCVTVCgwKSwgJG9wfSI+LCBEQTsNCitkZWYgQ01PVkJFX0YgOiBGUEk8MHhEMCwgQWRkUmVnRnJtLCAob3V0cyBSU1Q6JG9wKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgImZjbW92YmVcdHskb3AsICVzdCgwKXwlU1QoMCksICRvcH0iPiwgREE7DQorZGVmIENNT1ZFX0YgIDogRlBJPDB4QzgsIEFkZFJlZ0ZybSwgKG91dHMgUlNUOiRvcCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICJmY21vdmVcdHskb3AsICVzdCgwKXwlU1QoMCksICRvcH0iPiwgREE7DQorZGVmIENNT1ZQX0YgIDogRlBJPDB4RDgsIEFkZFJlZ0ZybSwgKG91dHMgUlNUOiRvcCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICJmY21vdnVcdCB7JG9wLCAlc3QoMCl8JVNUKDApLCAkb3B9Ij4sIERBOw0KK2RlZiBDTU9WTkJfRiA6IEZQSTwweEMwLCBBZGRSZWdGcm0sIChvdXRzIFJTVDokb3ApLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICAiZmNtb3ZuYlx0eyRvcCwgJXN0KDApfCVTVCgwKSwgJG9wfSI+LCBEQjsNCitkZWYgQ01PVk5CRV9GOiBGUEk8MHhEMCwgQWRkUmVnRnJtLCAob3V0cyBSU1Q6JG9wKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgImZjbW92bmJlXHR7JG9wLCAlc3QoMCl8JVNUKDApLCAkb3B9Ij4sIERCOw0KK2RlZiBDTU9WTkVfRiA6IEZQSTwweEM4LCBBZGRSZWdGcm0sIChvdXRzIFJTVDokb3ApLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICAiZmNtb3ZuZVx0eyRvcCwgJXN0KDApfCVTVCgwKSwgJG9wfSI+LCBEQjsNCitkZWYgQ01PVk5QX0YgOiBGUEk8MHhEOCwgQWRkUmVnRnJtLCAob3V0cyBSU1Q6JG9wKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgImZjbW92bnVcdHskb3AsICVzdCgwKXwlU1QoMCksICRvcH0iPiwgREI7DQorfSAvLyBQcmVkaWNhdGVzID0gW0hhc0NNb3ZdDQorDQorLy8gRmxvYXRpbmcgcG9pbnQgbG9hZHMgJiBzdG9yZXMuDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxIGluIHsNCitkZWYgTERfRnAzMm0gICA6IEZwSWYzMjwob3V0cyBSRlAzMjokZHN0KSwgKGlucyBmMzJtZW06JHNyYyksIFplcm9BcmdGUCwNCisgICAgICAgICAgICAgICAgICBbKHNldCBSRlAzMjokZHN0LCAobG9hZGYzMiBhZGRyOiRzcmMpKV0+Ow0KK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluDQorICBkZWYgTERfRnA2NG0gOiBGcElmNjQ8KG91dHMgUkZQNjQ6JGRzdCksIChpbnMgZjY0bWVtOiRzcmMpLCBaZXJvQXJnRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQNjQ6JGRzdCwgKGxvYWRmNjQgYWRkcjokc3JjKSldPjsNCitkZWYgTERfRnA4MG0gICA6IEZwSV88KG91dHMgUkZQODA6JGRzdCksIChpbnMgZjgwbWVtOiRzcmMpLCBaZXJvQXJnRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQODA6JGRzdCwgKGxvYWRmODAgYWRkcjokc3JjKSldPjsNCit9DQorZGVmIExEX0ZwMzJtNjQgOiBGcElmNjQ8KG91dHMgUkZQNjQ6JGRzdCksIChpbnMgZjMybWVtOiRzcmMpLCBaZXJvQXJnRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQNjQ6JGRzdCwgKGY2NCAoZXh0bG9hZGYzMiBhZGRyOiRzcmMpKSldPjsNCitkZWYgTERfRnA2NG04MCA6IEZwSV88KG91dHMgUkZQODA6JGRzdCksIChpbnMgZjY0bWVtOiRzcmMpLCBaZXJvQXJnRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQODA6JGRzdCwgKGY4MCAoZXh0bG9hZGY2NCBhZGRyOiRzcmMpKSldPjsNCitkZWYgTERfRnAzMm04MCA6IEZwSV88KG91dHMgUkZQODA6JGRzdCksIChpbnMgZjMybWVtOiRzcmMpLCBaZXJvQXJnRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQODA6JGRzdCwgKGY4MCAoZXh0bG9hZGYzMiBhZGRyOiRzcmMpKSldPjsNCitkZWYgSUxEX0ZwMTZtMzI6IEZwSWYzMjwob3V0cyBSRlAzMjokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksIFplcm9BcmdGUCwNCisgICAgICAgICAgICAgICAgICBbKHNldCBSRlAzMjokZHN0LCAoWDg2ZmlsZCBhZGRyOiRzcmMsIGkxNikpXT47DQorZGVmIElMRF9GcDMybTMyOiBGcElmMzI8KG91dHMgUkZQMzI6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLCBaZXJvQXJnRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQMzI6JGRzdCwgKFg4NmZpbGQgYWRkcjokc3JjLCBpMzIpKV0+Ow0KK2RlZiBJTERfRnA2NG0zMjogRnBJZjMyPChvdXRzIFJGUDMyOiRkc3QpLCAoaW5zIGk2NG1lbTokc3JjKSwgWmVyb0FyZ0ZQLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDMyOiRkc3QsIChYODZmaWxkIGFkZHI6JHNyYywgaTY0KSldPjsNCitkZWYgSUxEX0ZwMTZtNjQ6IEZwSWY2NDwob3V0cyBSRlA2NDokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksIFplcm9BcmdGUCwNCisgICAgICAgICAgICAgICAgICBbKHNldCBSRlA2NDokZHN0LCAoWDg2ZmlsZCBhZGRyOiRzcmMsIGkxNikpXT47DQorZGVmIElMRF9GcDMybTY0OiBGcElmNjQ8KG91dHMgUkZQNjQ6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLCBaZXJvQXJnRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQNjQ6JGRzdCwgKFg4NmZpbGQgYWRkcjokc3JjLCBpMzIpKV0+Ow0KK2RlZiBJTERfRnA2NG02NDogRnBJZjY0PChvdXRzIFJGUDY0OiRkc3QpLCAoaW5zIGk2NG1lbTokc3JjKSwgWmVyb0FyZ0ZQLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDY0OiRkc3QsIChYODZmaWxkIGFkZHI6JHNyYywgaTY0KSldPjsNCitkZWYgSUxEX0ZwMTZtODA6IEZwSV88KG91dHMgUkZQODA6JGRzdCksIChpbnMgaTE2bWVtOiRzcmMpLCBaZXJvQXJnRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQODA6JGRzdCwgKFg4NmZpbGQgYWRkcjokc3JjLCBpMTYpKV0+Ow0KK2RlZiBJTERfRnAzMm04MDogRnBJXzwob3V0cyBSRlA4MDokZHN0KSwgKGlucyBpMzJtZW06JHNyYyksIFplcm9BcmdGUCwNCisgICAgICAgICAgICAgICAgICBbKHNldCBSRlA4MDokZHN0LCAoWDg2ZmlsZCBhZGRyOiRzcmMsIGkzMikpXT47DQorZGVmIElMRF9GcDY0bTgwOiBGcElfPChvdXRzIFJGUDgwOiRkc3QpLCAoaW5zIGk2NG1lbTokc3JjKSwgWmVyb0FyZ0ZQLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDgwOiRkc3QsIChYODZmaWxkIGFkZHI6JHNyYywgaTY0KSldPjsNCisNCitkZWYgU1RfRnAzMm0gICA6IEZwSWYzMjwob3V0cyksIChpbnMgZjMybWVtOiRvcCwgUkZQMzI6JHNyYyksIE9uZUFyZ0ZQLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgUkZQMzI6JHNyYywgYWRkcjokb3ApXT47DQorZGVmIFNUX0ZwNjRtMzIgOiBGcElmNjQ8KG91dHMpLCAoaW5zIGYzMm1lbTokb3AsIFJGUDY0OiRzcmMpLCBPbmVBcmdGUCwNCisgICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVmMzIgUkZQNjQ6JHNyYywgYWRkcjokb3ApXT47DQorZGVmIFNUX0ZwNjRtICAgOiBGcElmNjQ8KG91dHMpLCAoaW5zIGY2NG1lbTokb3AsIFJGUDY0OiRzcmMpLCBPbmVBcmdGUCwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIFJGUDY0OiRzcmMsIGFkZHI6JG9wKV0+Ow0KK2RlZiBTVF9GcDgwbTMyIDogRnBJXzwob3V0cyksIChpbnMgZjMybWVtOiRvcCwgUkZQODA6JHNyYyksIE9uZUFyZ0ZQLA0KKyAgICAgICAgICAgICAgICAgIFsodHJ1bmNzdG9yZWYzMiBSRlA4MDokc3JjLCBhZGRyOiRvcCldPjsNCitkZWYgU1RfRnA4MG02NCA6IEZwSV88KG91dHMpLCAoaW5zIGY2NG1lbTokb3AsIFJGUDgwOiRzcmMpLCBPbmVBcmdGUCwNCisgICAgICAgICAgICAgICAgICBbKHRydW5jc3RvcmVmNjQgUkZQODA6JHNyYywgYWRkcjokb3ApXT47DQorLy8gRlNUIGRvZXMgbm90IHN1cHBvcnQgODAtYml0IG1lbW9yeSB0YXJnZXQ7IEZTVFAgbXVzdCBiZSB1c2VkLg0KKw0KK2xldCBtYXlTdG9yZSA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCitkZWYgU1RfRnBQMzJtICAgIDogRnBJZjMyPChvdXRzKSwgKGlucyBmMzJtZW06JG9wLCBSRlAzMjokc3JjKSwgT25lQXJnRlAsIFtdPjsNCitkZWYgU1RfRnBQNjRtMzIgIDogRnBJZjY0PChvdXRzKSwgKGlucyBmMzJtZW06JG9wLCBSRlA2NDokc3JjKSwgT25lQXJnRlAsIFtdPjsNCitkZWYgU1RfRnBQNjRtICAgIDogRnBJZjY0PChvdXRzKSwgKGlucyBmNjRtZW06JG9wLCBSRlA2NDokc3JjKSwgT25lQXJnRlAsIFtdPjsNCitkZWYgU1RfRnBQODBtMzIgIDogRnBJXzwob3V0cyksIChpbnMgZjMybWVtOiRvcCwgUkZQODA6JHNyYyksIE9uZUFyZ0ZQLCBbXT47DQorZGVmIFNUX0ZwUDgwbTY0ICA6IEZwSV88KG91dHMpLCAoaW5zIGY2NG1lbTokb3AsIFJGUDgwOiRzcmMpLCBPbmVBcmdGUCwgW10+Ow0KK30NCitkZWYgU1RfRnBQODBtICAgIDogRnBJXzwob3V0cyksIChpbnMgZjgwbWVtOiRvcCwgUkZQODA6JHNyYyksIE9uZUFyZ0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBSRlA4MDokc3JjLCBhZGRyOiRvcCldPjsNCitsZXQgbWF5U3RvcmUgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorZGVmIElTVF9GcDE2bTMyICA6IEZwSWYzMjwob3V0cyksIChpbnMgaTE2bWVtOiRvcCwgUkZQMzI6JHNyYyksIE9uZUFyZ0ZQLCBbXT47DQorZGVmIElTVF9GcDMybTMyICA6IEZwSWYzMjwob3V0cyksIChpbnMgaTMybWVtOiRvcCwgUkZQMzI6JHNyYyksIE9uZUFyZ0ZQLCBbXT47DQorZGVmIElTVF9GcDY0bTMyICA6IEZwSWYzMjwob3V0cyksIChpbnMgaTY0bWVtOiRvcCwgUkZQMzI6JHNyYyksIE9uZUFyZ0ZQLCBbXT47DQorZGVmIElTVF9GcDE2bTY0ICA6IEZwSWY2NDwob3V0cyksIChpbnMgaTE2bWVtOiRvcCwgUkZQNjQ6JHNyYyksIE9uZUFyZ0ZQLCBbXT47DQorZGVmIElTVF9GcDMybTY0ICA6IEZwSWY2NDwob3V0cyksIChpbnMgaTMybWVtOiRvcCwgUkZQNjQ6JHNyYyksIE9uZUFyZ0ZQLCBbXT47DQorZGVmIElTVF9GcDY0bTY0ICA6IEZwSWY2NDwob3V0cyksIChpbnMgaTY0bWVtOiRvcCwgUkZQNjQ6JHNyYyksIE9uZUFyZ0ZQLCBbXT47DQorZGVmIElTVF9GcDE2bTgwICA6IEZwSV88KG91dHMpLCAoaW5zIGkxNm1lbTokb3AsIFJGUDgwOiRzcmMpLCBPbmVBcmdGUCwgW10+Ow0KK2RlZiBJU1RfRnAzMm04MCAgOiBGcElfPChvdXRzKSwgKGlucyBpMzJtZW06JG9wLCBSRlA4MDokc3JjKSwgT25lQXJnRlAsIFtdPjsNCitkZWYgSVNUX0ZwNjRtODAgIDogRnBJXzwob3V0cyksIChpbnMgaTY0bWVtOiRvcCwgUkZQODA6JHNyYyksIE9uZUFyZ0ZQLCBbXT47DQorfQ0KKw0KK2xldCBtYXlMb2FkID0gMSBpbiB7DQorZGVmIExEX0YzMm0gICA6IEZQSTwweEQ5LCBNUk0wbSwgKG91dHMpLCAoaW5zIGYzMm1lbTokc3JjKSwgImZsZHtzfVx0JHNyYyI+Ow0KK2RlZiBMRF9GNjRtICAgOiBGUEk8MHhERCwgTVJNMG0sIChvdXRzKSwgKGlucyBmNjRtZW06JHNyYyksICJmbGR7bH1cdCRzcmMiPjsNCitkZWYgTERfRjgwbSAgIDogRlBJPDB4REIsIE1STTVtLCAob3V0cyksIChpbnMgZjgwbWVtOiRzcmMpLCAiZmxke3R9XHQkc3JjIj47DQorZGVmIElMRF9GMTZtICA6IEZQSTwweERGLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokc3JjKSwgImZpbGR7c31cdCRzcmMiPjsNCitkZWYgSUxEX0YzMm0gIDogRlBJPDB4REIsIE1STTBtLCAob3V0cyksIChpbnMgaTMybWVtOiRzcmMpLCAiZmlsZHtsfVx0JHNyYyI+Ow0KK2RlZiBJTERfRjY0bSAgOiBGUEk8MHhERiwgTVJNNW0sIChvdXRzKSwgKGlucyBpNjRtZW06JHNyYyksICJmaWxke2xsfVx0JHNyYyI+Ow0KK30NCitsZXQgbWF5U3RvcmUgPSAxIGluIHsNCitkZWYgU1RfRjMybSAgIDogRlBJPDB4RDksIE1STTJtLCAob3V0cyksIChpbnMgZjMybWVtOiRkc3QpLCAiZnN0e3N9XHQkZHN0Ij47DQorZGVmIFNUX0Y2NG0gICA6IEZQSTwweERELCBNUk0ybSwgKG91dHMpLCAoaW5zIGY2NG1lbTokZHN0KSwgImZzdHtsfVx0JGRzdCI+Ow0KK2RlZiBTVF9GUDMybSAgOiBGUEk8MHhEOSwgTVJNM20sIChvdXRzKSwgKGlucyBmMzJtZW06JGRzdCksICJmc3Rwe3N9XHQkZHN0Ij47DQorZGVmIFNUX0ZQNjRtICA6IEZQSTwweERELCBNUk0zbSwgKG91dHMpLCAoaW5zIGY2NG1lbTokZHN0KSwgImZzdHB7bH1cdCRkc3QiPjsNCitkZWYgU1RfRlA4MG0gIDogRlBJPDB4REIsIE1STTdtLCAob3V0cyksIChpbnMgZjgwbWVtOiRkc3QpLCAiZnN0cHt0fVx0JGRzdCI+Ow0KK2RlZiBJU1RfRjE2bSAgOiBGUEk8MHhERiwgTVJNMm0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCksICJmaXN0e3N9XHQkZHN0Ij47DQorZGVmIElTVF9GMzJtICA6IEZQSTwweERCLCBNUk0ybSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwgImZpc3R7bH1cdCRkc3QiPjsNCitkZWYgSVNUX0ZQMTZtIDogRlBJPDB4REYsIE1STTNtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLCAiZmlzdHB7c31cdCRkc3QiPjsNCitkZWYgSVNUX0ZQMzJtIDogRlBJPDB4REIsIE1STTNtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLCAiZmlzdHB7bH1cdCRkc3QiPjsNCitkZWYgSVNUX0ZQNjRtIDogRlBJPDB4REYsIE1STTdtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QpLCAiZmlzdHB7bGx9XHQkZHN0Ij47DQorfQ0KKw0KKy8vIEZJU1RUUCByZXF1aXJlcyBTU0UzIGV2ZW4gdGhvdWdoIGl0J3MgYSBGUFN0YWNrIG9wLg0KK2RlZiBJU1RUX0ZwMTZtMzIgOiBGcElfPChvdXRzKSwgKGlucyBpMTZtZW06JG9wLCBSRlAzMjokc3JjKSwgT25lQXJnRlAsDQorICAgICAgICAgICAgICAgICAgICBbKFg4NmZwX3RvX2kxNm1lbSBSRlAzMjokc3JjLCBhZGRyOiRvcCldPiwNCisgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UzXT47DQorZGVmIElTVFRfRnAzMm0zMiA6IEZwSV88KG91dHMpLCAoaW5zIGkzMm1lbTokb3AsIFJGUDMyOiRzcmMpLCBPbmVBcmdGUCwNCisgICAgICAgICAgICAgICAgICAgIFsoWDg2ZnBfdG9faTMybWVtIFJGUDMyOiRzcmMsIGFkZHI6JG9wKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTNdPjsNCitkZWYgSVNUVF9GcDY0bTMyIDogRnBJXzwob3V0cyksIChpbnMgaTY0bWVtOiRvcCwgUkZQMzI6JHNyYyksIE9uZUFyZ0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgWyhYODZmcF90b19pNjRtZW0gUkZQMzI6JHNyYywgYWRkcjokb3ApXT4sDQorICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSGFzU1NFM10+Ow0KK2RlZiBJU1RUX0ZwMTZtNjQgOiBGcElfPChvdXRzKSwgKGlucyBpMTZtZW06JG9wLCBSRlA2NDokc3JjKSwgT25lQXJnRlAsDQorICAgICAgICAgICAgICAgICAgICBbKFg4NmZwX3RvX2kxNm1lbSBSRlA2NDokc3JjLCBhZGRyOiRvcCldPiwNCisgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UzXT47DQorZGVmIElTVFRfRnAzMm02NCA6IEZwSV88KG91dHMpLCAoaW5zIGkzMm1lbTokb3AsIFJGUDY0OiRzcmMpLCBPbmVBcmdGUCwNCisgICAgICAgICAgICAgICAgICAgIFsoWDg2ZnBfdG9faTMybWVtIFJGUDY0OiRzcmMsIGFkZHI6JG9wKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTNdPjsNCitkZWYgSVNUVF9GcDY0bTY0IDogRnBJXzwob3V0cyksIChpbnMgaTY0bWVtOiRvcCwgUkZQNjQ6JHNyYyksIE9uZUFyZ0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgWyhYODZmcF90b19pNjRtZW0gUkZQNjQ6JHNyYywgYWRkcjokb3ApXT4sDQorICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSGFzU1NFM10+Ow0KK2RlZiBJU1RUX0ZwMTZtODAgOiBGcElfPChvdXRzKSwgKGlucyBpMTZtZW06JG9wLCBSRlA4MDokc3JjKSwgT25lQXJnRlAsDQorICAgICAgICAgICAgICAgICAgICBbKFg4NmZwX3RvX2kxNm1lbSBSRlA4MDokc3JjLCBhZGRyOiRvcCldPiwNCisgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UzXT47DQorZGVmIElTVFRfRnAzMm04MCA6IEZwSV88KG91dHMpLCAoaW5zIGkzMm1lbTokb3AsIFJGUDgwOiRzcmMpLCBPbmVBcmdGUCwNCisgICAgICAgICAgICAgICAgICAgIFsoWDg2ZnBfdG9faTMybWVtIFJGUDgwOiRzcmMsIGFkZHI6JG9wKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTNdPjsNCitkZWYgSVNUVF9GcDY0bTgwIDogRnBJXzwob3V0cyksIChpbnMgaTY0bWVtOiRvcCwgUkZQODA6JHNyYyksIE9uZUFyZ0ZQLA0KKyAgICAgICAgICAgICAgICAgICAgWyhYODZmcF90b19pNjRtZW0gUkZQODA6JHNyYywgYWRkcjokb3ApXT4sDQorICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSGFzU1NFM10+Ow0KKw0KK2xldCBtYXlTdG9yZSA9IDEgaW4gew0KK2RlZiBJU1RUX0ZQMTZtIDogRlBJPDB4REYsIE1STTFtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLCAiZmlzdHRwe3N9XHQkZHN0Ij47DQorZGVmIElTVFRfRlAzMm0gOiBGUEk8MHhEQiwgTVJNMW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCksICJmaXN0dHB7bH1cdCRkc3QiPjsNCitkZWYgSVNUVF9GUDY0bSA6IEZQSTwweERELCBNUk0xbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0KSwgDQorICAiZmlzdHRwe2xsfVx0JGRzdCI+Ow0KK30NCisNCisvLyBGUCBTdGFjayBtYW5pcHVsYXRpb24gaW5zdHJ1Y3Rpb25zLg0KK2RlZiBMRF9GcnIgICA6IEZQSTwweEMwLCBBZGRSZWdGcm0sIChvdXRzKSwgKGlucyBSU1Q6JG9wKSwgImZsZFx0JG9wIj4sIEQ5Ow0KK2RlZiBTVF9GcnIgICA6IEZQSTwweEQwLCBBZGRSZWdGcm0sIChvdXRzKSwgKGlucyBSU1Q6JG9wKSwgImZzdFx0JG9wIj4sIEREOw0KK2RlZiBTVF9GUHJyICA6IEZQSTwweEQ4LCBBZGRSZWdGcm0sIChvdXRzKSwgKGlucyBSU1Q6JG9wKSwgImZzdHBcdCRvcCI+LCBERDsNCitkZWYgWENIX0YgICAgOiBGUEk8MHhDOCwgQWRkUmVnRnJtLCAob3V0cyksIChpbnMgUlNUOiRvcCksICJmeGNoXHQkb3AiPiwgRDk7DQorDQorLy8gRmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgbG9hZHMuDQorbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4gew0KK2RlZiBMRF9GcDAzMiA6IEZwSWYzMjwob3V0cyBSRlAzMjokZHN0KSwgKGlucyksIFplcm9BcmdGUCwNCisgICAgICAgICAgICAgICAgWyhzZXQgUkZQMzI6JGRzdCwgZnBpbW0wKV0+Ow0KK2RlZiBMRF9GcDEzMiA6IEZwSWYzMjwob3V0cyBSRlAzMjokZHN0KSwgKGlucyksIFplcm9BcmdGUCwNCisgICAgICAgICAgICAgICAgWyhzZXQgUkZQMzI6JGRzdCwgZnBpbW0xKV0+Ow0KK2RlZiBMRF9GcDA2NCA6IEZwSWY2NDwob3V0cyBSRlA2NDokZHN0KSwgKGlucyksIFplcm9BcmdGUCwNCisgICAgICAgICAgICAgICAgWyhzZXQgUkZQNjQ6JGRzdCwgZnBpbW0wKV0+Ow0KK2RlZiBMRF9GcDE2NCA6IEZwSWY2NDwob3V0cyBSRlA2NDokZHN0KSwgKGlucyksIFplcm9BcmdGUCwNCisgICAgICAgICAgICAgICAgWyhzZXQgUkZQNjQ6JGRzdCwgZnBpbW0xKV0+Ow0KK2RlZiBMRF9GcDA4MCA6IEZwSV88KG91dHMgUkZQODA6JGRzdCksIChpbnMpLCBaZXJvQXJnRlAsDQorICAgICAgICAgICAgICAgIFsoc2V0IFJGUDgwOiRkc3QsIGZwaW1tMCldPjsNCitkZWYgTERfRnAxODAgOiBGcElfPChvdXRzIFJGUDgwOiRkc3QpLCAoaW5zKSwgWmVyb0FyZ0ZQLA0KKyAgICAgICAgICAgICAgICBbKHNldCBSRlA4MDokZHN0LCBmcGltbTEpXT47DQorfQ0KKw0KK2RlZiBMRF9GMCA6IEZQSTwweEVFLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmbGR6Ij4sIEQ5Ow0KK2RlZiBMRF9GMSA6IEZQSTwweEU4LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmbGQxIj4sIEQ5Ow0KKw0KKw0KKy8vIEZsb2F0aW5nIHBvaW50IGNvbXBhcmVzLg0KK2xldCBEZWZzID0gW0VGTEFHU10gaW4gew0KK2RlZiBVQ09NX0ZwcjMyIDogRnBJZjMyPChvdXRzKSwgKGlucyBSRlAzMjokbGhzLCBSRlAzMjokcmhzKSwgQ29tcGFyZUZQLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsgIC8vIEZQU1cgPSBjbXAgU1QoMCkgd2l0aCBTVChpKQ0KK2RlZiBVQ09NX0ZwcjY0IDogRnBJZjY0PChvdXRzKSwgKGlucyBSRlA2NDokbGhzLCBSRlA2NDokcmhzKSwgQ29tcGFyZUZQLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsgIC8vIEZQU1cgPSBjbXAgU1QoMCkgd2l0aCBTVChpKQ0KK2RlZiBVQ09NX0ZwcjgwIDogRnBJXyAgPChvdXRzKSwgKGlucyBSRlA4MDokbGhzLCBSRlA4MDokcmhzKSwgQ29tcGFyZUZQLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsgIC8vIEZQU1cgPSBjbXAgU1QoMCkgd2l0aCBTVChpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIA0KKy8vIENDID0gU1QoMCkgY21wIFNUKGkpDQorZGVmIFVDT01fRnBJcjMyOiBGcElmMzI8KG91dHMpLCAoaW5zIFJGUDMyOiRsaHMsIFJGUDMyOiRyaHMpLCBDb21wYXJlRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIFJGUDMyOiRsaHMsIFJGUDMyOiRyaHMpKV0+Ow0KK2RlZiBVQ09NX0ZwSXI2NDogRnBJZjY0PChvdXRzKSwgKGlucyBSRlA2NDokbGhzLCBSRlA2NDokcmhzKSwgQ29tcGFyZUZQLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCBSRlA2NDokbGhzLCBSRlA2NDokcmhzKSldPjsNCitkZWYgVUNPTV9GcElyODA6IEZwSV88KG91dHMpLCAoaW5zIFJGUDgwOiRsaHMsIFJGUDgwOiRyaHMpLCBDb21wYXJlRlAsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIFJGUDgwOiRsaHMsIFJGUDgwOiRyaHMpKV0+Ow0KK30NCisNCitsZXQgRGVmcyA9IFtFRkxBR1NdLCBVc2VzID0gW1NUMF0gaW4gew0KK2RlZiBVQ09NX0ZyICAgIDogRlBJPDB4RTAsIEFkZFJlZ0ZybSwgICAgLy8gRlBTVyA9IGNtcCBTVCgwKSB3aXRoIFNUKGkpDQorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgUlNUOiRyZWcpLA0KKyAgICAgICAgICAgICAgICAgICAgImZ1Y29tXHQkcmVnIj4sIEREOw0KK2RlZiBVQ09NX0ZQciAgIDogRlBJPDB4RTgsIEFkZFJlZ0ZybSwgICAgLy8gRlBTVyA9IGNtcCBTVCgwKSB3aXRoIFNUKGkpLCBwb3ANCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBSU1Q6JHJlZyksDQorICAgICAgICAgICAgICAgICAgICAiZnVjb21wXHQkcmVnIj4sIEREOw0KK2RlZiBVQ09NX0ZQUHIgIDogRlBJPDB4RTksIFJhd0ZybSwgICAgICAgLy8gY21wIFNUKDApIHdpdGggU1QoMSksIHBvcCwgcG9wDQorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgICAgImZ1Y29tcHAiPiwgREE7DQorDQorZGVmIFVDT01fRklyICAgOiBGUEk8MHhFOCwgQWRkUmVnRnJtLCAgICAgLy8gQ0MgPSBjbXAgU1QoMCkgd2l0aCBTVChpKQ0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIFJTVDokcmVnKSwNCisgICAgICAgICAgICAgICAgICAgICJmdWNvbWlcdHskcmVnLCAlc3QoMCl8JVNUKDApLCAkcmVnfSI+LCBEQjsNCitkZWYgVUNPTV9GSVByICA6IEZQSTwweEU4LCBBZGRSZWdGcm0sICAgICAvLyBDQyA9IGNtcCBTVCgwKSB3aXRoIFNUKGkpLCBwb3ANCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBSU1Q6JHJlZyksDQorICAgICAgICAgICAgICAgICAgICAiZnVjb21pcFx0eyRyZWcsICVzdCgwKXwlU1QoMCksICRyZWd9Ij4sIERGOw0KK30NCisNCitkZWYgQ09NX0ZJciA6IEZQSTwweEYwLCBBZGRSZWdGcm0sIChvdXRzKSwgKGlucyBSU1Q6JHJlZyksDQorICAgICAgICAgICAgICAgICAgImZjb21pXHR7JHJlZywgJXN0KDApfCVTVCgwKSwgJHJlZ30iPiwgREI7DQorZGVmIENPTV9GSVByIDogRlBJPDB4RjAsIEFkZFJlZ0ZybSwgKG91dHMpLCAoaW5zIFJTVDokcmVnKSwNCisgICAgICAgICAgICAgICAgICAgImZjb21pcFx0eyRyZWcsICVzdCgwKXwlU1QoMCksICRyZWd9Ij4sIERGOw0KKw0KKy8vIEZsb2F0aW5nIHBvaW50IGZsYWcgb3BzLg0KK2xldCBEZWZzID0gW0FYXSBpbg0KK2RlZiBGTlNUU1c4ciAgOiBJPDB4RTAsIFJhd0ZybSwgICAgICAgICAgICAgICAgICAvLyBBWCA9IGZwIGZsYWdzDQorICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zKSwgImZuc3RzdyAlYXgiLCBbXT4sIERGOw0KKw0KK2RlZiBGTlNUQ1cxNm0gOiBJPDB4RDksIE1STTdtLCAgICAgICAgICAgICAgICAgICAvLyBbbWVtMTZdID0gWDg3IGNvbnRyb2wgd29ybGQNCisgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLCAiZm5zdGN3XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKFg4NmZwX2N3ZF9nZXQxNiBhZGRyOiRkc3QpXT47DQorICAgICAgICAgICAgICAgICAgDQorbGV0IG1heUxvYWQgPSAxIGluDQorZGVmIEZMRENXMTZtICA6IEk8MHhEOSwgTVJNNW0sICAgICAgICAgICAgICAgICAgIC8vIFg4NyBjb250cm9sIHdvcmxkID0gW21lbTE2XQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCksICJmbGRjd1x0JGRzdCIsIFtdPjsNCisNCisvLyBSZWdpc3RlciBmcmVlDQorDQorZGVmIEZGUkVFIDogRlBJPDB4QzAsIEFkZFJlZ0ZybSwgKG91dHMpLCAoaW5zIFJTVDokcmVnKSwNCisgICAgICAgICAgICAgICAgImZmcmVlXHQkcmVnIj4sIEREOw0KKw0KKy8vIENsZWFyIGV4Y2VwdGlvbnMNCisNCitkZWYgRk5DTEVYIDogSTwweEUyLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmbmNsZXgiLCBbXT4sIERCOw0KKw0KKy8vIE9wZXJhbmRsZXNzIGZsb2F0aW5nLXBvaW50IGluc3RydWN0aW9ucyBmb3IgdGhlIGRpc2Fzc2VtYmxlcg0KKw0KK2RlZiBGTk9QIDogSTwweEQwLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmbm9wIiwgW10+LCBEOTsNCitkZWYgRlhBTSA6IEk8MHhFNSwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiZnhhbSIsIFtdPiwgRDk7DQorZGVmIEZMREwyVCA6IEk8MHhFOSwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiZmxkbDJ0IiwgW10+LCBEOTsNCitkZWYgRkxETDJFIDogSTwweEVBLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmbGRsMmUiLCBbXT4sIEQ5Ow0KK2RlZiBGTERQSSA6IEk8MHhFQiwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiZmxkcGkiLCBbXT4sIEQ5Ow0KK2RlZiBGTERMRzIgOiBJPDB4RUMsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImZsZGxnMiIsIFtdPiwgRDk7DQorZGVmIEZMRExOMiA6IEk8MHhFRCwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiZmxkbG4yIiwgW10+LCBEOTsNCitkZWYgRjJYTTEgOiBJPDB4RjAsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImYyeG0xIiwgW10+LCBEOTsNCitkZWYgRllMMlggOiBJPDB4RjEsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImZ5bDJ4IiwgW10+LCBEOTsNCitkZWYgRlBUQU4gOiBJPDB4RjIsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImZwdGFuIiwgW10+LCBEOTsNCitkZWYgRlBBVEFOIDogSTwweEYzLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmcGF0YW4iLCBbXT4sIEQ5Ow0KK2RlZiBGWFRSQUNUIDogSTwweEY0LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmeHRyYWN0IiwgW10+LCBEOTsNCitkZWYgRlBSRU0xIDogSTwweEY1LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmcHJlbTEiLCBbXT4sIEQ5Ow0KK2RlZiBGREVDU1RQIDogSTwweEY2LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmZGVjc3RwIiwgW10+LCBEOTsNCitkZWYgRklOQ1NUUCA6IEk8MHhGNywgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiZmluY3N0cCIsIFtdPiwgRDk7DQorZGVmIEZQUkVNIDogSTwweEY4LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmcHJlbSIsIFtdPiwgRDk7DQorZGVmIEZZTDJYUDEgOiBJPDB4RjksIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImZ5bDJ4cDEiLCBbXT4sIEQ5Ow0KK2RlZiBGU0lOQ09TIDogSTwweEZCLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmc2luY29zIiwgW10+LCBEOTsNCitkZWYgRlJORElOVCA6IEk8MHhGQywgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiZnJuZGludCIsIFtdPiwgRDk7DQorZGVmIEZTQ0FMRSA6IEk8MHhGRCwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiZnNjYWxlIiwgW10+LCBEOTsNCitkZWYgRkNPTVBQIDogSTwweEQ5LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmY29tcHAiLCBbXT4sIERFOw0KKw0KK2RlZiBGWFNBVkUgOiBJPDB4QUUsIE1STTBtLCAob3V0cyBvcGFxdWU1MTJtZW06JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICJmeHNhdmVcdCRkc3QiLCBbXT4sIFRCOw0KK2RlZiBGWFJTVE9SIDogSTwweEFFLCBNUk0xbSwgKG91dHMpLCAoaW5zIG9wYXF1ZTUxMm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgImZ4cnN0b3JcdCRzcmMiLCBbXT4sIFRCOw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTm9uLUluc3RydWN0aW9uIFBhdHRlcm5zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBSZXF1aXJlZCBmb3IgUkVUIG9mIGYzMiAvIGY2NCAvIGY4MCB2YWx1ZXMuDQorZGVmIDogUGF0PChYODZmbGQgYWRkcjokc3JjLCBmMzIpLCAoTERfRnAzMm0gYWRkcjokc3JjKT47DQorZGVmIDogUGF0PChYODZmbGQgYWRkcjokc3JjLCBmNjQpLCAoTERfRnA2NG0gYWRkcjokc3JjKT47DQorZGVmIDogUGF0PChYODZmbGQgYWRkcjokc3JjLCBmODApLCAoTERfRnA4MG0gYWRkcjokc3JjKT47DQorDQorLy8gUmVxdWlyZWQgZm9yIENBTEwgd2hpY2ggcmV0dXJuIGYzMiAvIGY2NCAvIGY4MCB2YWx1ZXMuDQorZGVmIDogUGF0PChYODZmc3QgUkZQMzI6JHNyYywgYWRkcjokb3AsIGYzMiksIChTVF9GcDMybSBhZGRyOiRvcCwgUkZQMzI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoWDg2ZnN0IFJGUDY0OiRzcmMsIGFkZHI6JG9wLCBmMzIpLCAoU1RfRnA2NG0zMiBhZGRyOiRvcCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGUDY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KFg4NmZzdCBSRlA2NDokc3JjLCBhZGRyOiRvcCwgZjY0KSwgKFNUX0ZwNjRtIGFkZHI6JG9wLCBSRlA2NDokc3JjKT47DQorZGVmIDogUGF0PChYODZmc3QgUkZQODA6JHNyYywgYWRkcjokb3AsIGYzMiksIChTVF9GcDgwbTMyIGFkZHI6JG9wLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkZQODA6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoWDg2ZnN0IFJGUDgwOiRzcmMsIGFkZHI6JG9wLCBmNjQpLCAoU1RfRnA4MG02NCBhZGRyOiRvcCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGUDgwOiRzcmMpPjsNCitkZWYgOiBQYXQ8KFg4NmZzdCBSRlA4MDokc3JjLCBhZGRyOiRvcCwgZjgwKSwgKFNUX0ZwUDgwbSBhZGRyOiRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRlA4MDokc3JjKT47DQorDQorLy8gRmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgLTAuMCBhbmQgLTEuMA0KK2RlZiA6IFBhdDwoZjMyIGZwaW1tbmVnMCksIChDSFNfRnAzMiAoTERfRnAwMzIpKT4sIFJlcXVpcmVzPFtGUFN0YWNrZjMyXT47DQorZGVmIDogUGF0PChmMzIgZnBpbW1uZWcxKSwgKENIU19GcDMyIChMRF9GcDEzMikpPiwgUmVxdWlyZXM8W0ZQU3RhY2tmMzJdPjsNCitkZWYgOiBQYXQ8KGY2NCBmcGltbW5lZzApLCAoQ0hTX0ZwNjQgKExEX0ZwMDY0KSk+LCBSZXF1aXJlczxbRlBTdGFja2Y2NF0+Ow0KK2RlZiA6IFBhdDwoZjY0IGZwaW1tbmVnMSksIChDSFNfRnA2NCAoTERfRnAxNjQpKT4sIFJlcXVpcmVzPFtGUFN0YWNrZjY0XT47DQorZGVmIDogUGF0PChmODAgZnBpbW1uZWcwKSwgKENIU19GcDgwIChMRF9GcDA4MCkpPjsNCitkZWYgOiBQYXQ8KGY4MCBmcGltbW5lZzEpLCAoQ0hTX0ZwODAgKExEX0ZwMTgwKSk+Ow0KKw0KKy8vIFVzZWQgdG8gY29udi4gaTY0IHRvIGY2NCBzaW5jZSB0aGVyZSBpc24ndCBhIFNTRSB2ZXJzaW9uLg0KK2RlZiA6IFBhdDwoWDg2ZmlsZGZsYWcgYWRkcjokc3JjLCBpNjQpLCAoSUxEX0ZwNjRtNjQgYWRkcjokc3JjKT47DQorDQorLy8gRlAgZXh0ZW5zaW9ucyBtYXAgb250byBzaW1wbGUgcHNldWRvLXZhbHVlIGNvbnZlcnNpb25zIGlmIHRoZXkgYXJlIHRvL2Zyb20NCisvLyB0aGUgRlAgc3RhY2suDQorZGVmIDogUGF0PChmNjQgKGZleHRlbmQgUkZQMzI6JHNyYykpLCAoQ09QWV9UT19SRUdDTEFTUyBSRlAzMjokc3JjLCBSRlA2NCk+LA0KKyAgICAgICAgICBSZXF1aXJlczxbRlBTdGFja2YzMl0+Ow0KK2RlZiA6IFBhdDwoZjgwIChmZXh0ZW5kIFJGUDMyOiRzcmMpKSwgKENPUFlfVE9fUkVHQ0xBU1MgUkZQMzI6JHNyYywgUkZQODApPiwNCisgICAgICAgICAgIFJlcXVpcmVzPFtGUFN0YWNrZjMyXT47DQorZGVmIDogUGF0PChmODAgKGZleHRlbmQgUkZQNjQ6JHNyYykpLCAoQ09QWV9UT19SRUdDTEFTUyBSRlA2NDokc3JjLCBSRlA4MCk+LA0KKyAgICAgICAgICAgUmVxdWlyZXM8W0ZQU3RhY2tmNjRdPjsNCisNCisvLyBGUCB0cnVuY2F0aW9ucyBtYXAgb250byBzaW1wbGUgcHNldWRvLXZhbHVlIGNvbnZlcnNpb25zIGlmIHRoZXkgYXJlIHRvL2Zyb20NCisvLyB0aGUgRlAgc3RhY2suICBXZSBoYXZlIHZhbGlkYXRlZCB0aGF0IG9ubHkgdmFsdWUtcHJlc2VydmluZyB0cnVuY2F0aW9ucyBtYWtlDQorLy8gaXQgdGhyb3VnaCBpc2VsLg0KK2RlZiA6IFBhdDwoZjMyIChmcm91bmQgUkZQNjQ6JHNyYykpLCAoQ09QWV9UT19SRUdDTEFTUyBSRlA2NDokc3JjLCBSRlAzMik+LA0KKyAgICAgICAgICBSZXF1aXJlczxbRlBTdGFja2YzMl0+Ow0KK2RlZiA6IFBhdDwoZjMyIChmcm91bmQgUkZQODA6JHNyYykpLCAoQ09QWV9UT19SRUdDTEFTUyBSRlA4MDokc3JjLCBSRlAzMik+LA0KKyAgICAgICAgICAgUmVxdWlyZXM8W0ZQU3RhY2tmMzJdPjsNCitkZWYgOiBQYXQ8KGY2NCAoZnJvdW5kIFJGUDgwOiRzcmMpKSwgKENPUFlfVE9fUkVHQ0xBU1MgUkZQODA6JHNyYywgUkZQNjQpPiwNCisgICAgICAgICAgIFJlcXVpcmVzPFtGUFN0YWNrZjY0XT47DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJGb3JtYXRzLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJGb3JtYXRzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNGRkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0ckZvcm1hdHMudGQKQEAgLTAsMCArMSw1MTMgQEAKKy8vPT09LSBYODZJbnN0ckZvcm1hdHMudGQgLSBYODYgSW5zdHJ1Y3Rpb24gRm9ybWF0cyAtLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFg4NiBJbnN0cnVjdGlvbiBGb3JtYXQgRGVmaW5pdGlvbnMuCisvLworCisvLyBGb3JtYXQgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGJ5IHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcGFydCBvZiB0aGUKKy8vIGFkLWhvYyBzb2x1dGlvbiB1c2VkIHRvIGVtaXQgbWFjaGluZSBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgYnkgb3VyIG1hY2hpbmUKKy8vIGNvZGUgZW1pdHRlci4KK2NsYXNzIEZvcm1hdDxiaXRzPDY+IHZhbD4geworICBiaXRzPDY+IFZhbHVlID0gdmFsOworfQorCitkZWYgUHNldWRvICAgICA6IEZvcm1hdDwwPjsgZGVmIFJhd0ZybSAgICAgOiBGb3JtYXQ8MT47CitkZWYgQWRkUmVnRnJtICA6IEZvcm1hdDwyPjsgZGVmIE1STURlc3RSZWcgOiBGb3JtYXQ8Mz47CitkZWYgTVJNRGVzdE1lbSA6IEZvcm1hdDw0PjsgZGVmIE1STVNyY1JlZyAgOiBGb3JtYXQ8NT47CitkZWYgTVJNU3JjTWVtICA6IEZvcm1hdDw2PjsKK2RlZiBNUk0wciAgOiBGb3JtYXQ8MTY+OyBkZWYgTVJNMXIgIDogRm9ybWF0PDE3PjsgZGVmIE1STTJyICA6IEZvcm1hdDwxOD47CitkZWYgTVJNM3IgIDogRm9ybWF0PDE5PjsgZGVmIE1STTRyICA6IEZvcm1hdDwyMD47IGRlZiBNUk01ciAgOiBGb3JtYXQ8MjE+OworZGVmIE1STTZyICA6IEZvcm1hdDwyMj47IGRlZiBNUk03ciAgOiBGb3JtYXQ8MjM+OworZGVmIE1STTBtICA6IEZvcm1hdDwyND47IGRlZiBNUk0xbSAgOiBGb3JtYXQ8MjU+OyBkZWYgTVJNMm0gIDogRm9ybWF0PDI2PjsKK2RlZiBNUk0zbSAgOiBGb3JtYXQ8Mjc+OyBkZWYgTVJNNG0gIDogRm9ybWF0PDI4PjsgZGVmIE1STTVtICA6IEZvcm1hdDwyOT47CitkZWYgTVJNNm0gIDogRm9ybWF0PDMwPjsgZGVmIE1STTdtICA6IEZvcm1hdDwzMT47CitkZWYgTVJNSW5pdFJlZyA6IEZvcm1hdDwzMj47CitkZWYgTVJNX0MxIDogRm9ybWF0PDMzPjsKK2RlZiBNUk1fQzIgOiBGb3JtYXQ8MzQ+OworZGVmIE1STV9DMyA6IEZvcm1hdDwzNT47CitkZWYgTVJNX0M0IDogRm9ybWF0PDM2PjsKK2RlZiBNUk1fQzggOiBGb3JtYXQ8Mzc+OworZGVmIE1STV9DOSA6IEZvcm1hdDwzOD47CitkZWYgTVJNX0U4IDogRm9ybWF0PDM5PjsKK2RlZiBNUk1fRjAgOiBGb3JtYXQ8NDA+OworZGVmIE1STV9GOCA6IEZvcm1hdDw0MT47CitkZWYgTVJNX0Y5IDogRm9ybWF0PDQyPjsKKworLy8gSW1tVHlwZSAtIFRoaXMgc3BlY2lmaWVzIHRoZSBpbW1lZGlhdGUgdHlwZSB1c2VkIGJ5IGFuIGluc3RydWN0aW9uLiBUaGlzIGlzCisvLyBwYXJ0IG9mIHRoZSBhZC1ob2Mgc29sdXRpb24gdXNlZCB0byBlbWl0IG1hY2hpbmUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzIGJ5IG91cgorLy8gbWFjaGluZSBjb2RlIGVtaXR0ZXIuCitjbGFzcyBJbW1UeXBlPGJpdHM8Mz4gdmFsPiB7CisgIGJpdHM8Mz4gVmFsdWUgPSB2YWw7Cit9CitkZWYgTm9JbW0gICAgICA6IEltbVR5cGU8MD47CitkZWYgSW1tOCAgICAgICA6IEltbVR5cGU8MT47CitkZWYgSW1tOFBDUmVsICA6IEltbVR5cGU8Mj47CitkZWYgSW1tMTYgICAgICA6IEltbVR5cGU8Mz47CitkZWYgSW1tMTZQQ1JlbCA6IEltbVR5cGU8ND47CitkZWYgSW1tMzIgICAgICA6IEltbVR5cGU8NT47CitkZWYgSW1tMzJQQ1JlbCA6IEltbVR5cGU8Nj47CitkZWYgSW1tNjQgICAgICA6IEltbVR5cGU8Nz47CisKKy8vIEZQRm9ybWF0IC0gVGhpcyBzcGVjaWZpZXMgd2hhdCBmb3JtIHRoaXMgRlAgaW5zdHJ1Y3Rpb24gaGFzLiAgVGhpcyBpcyB1c2VkIGJ5CisvLyB0aGUgRmxvYXRpbmctUG9pbnQgc3RhY2tpZmllciBwYXNzLgorY2xhc3MgRlBGb3JtYXQ8Yml0czwzPiB2YWw+IHsKKyAgYml0czwzPiBWYWx1ZSA9IHZhbDsKK30KK2RlZiBOb3RGUCAgICAgIDogRlBGb3JtYXQ8MD47CitkZWYgWmVyb0FyZ0ZQICA6IEZQRm9ybWF0PDE+OworZGVmIE9uZUFyZ0ZQICAgOiBGUEZvcm1hdDwyPjsKK2RlZiBPbmVBcmdGUFJXIDogRlBGb3JtYXQ8Mz47CitkZWYgVHdvQXJnRlAgICA6IEZQRm9ybWF0PDQ+OworZGVmIENvbXBhcmVGUCAgOiBGUEZvcm1hdDw1PjsKK2RlZiBDb25kTW92RlAgIDogRlBGb3JtYXQ8Nj47CitkZWYgU3BlY2lhbEZQICA6IEZQRm9ybWF0PDc+OworCisvLyBDbGFzcyBzcGVjaWZ5aW5nIHRoZSBTU0UgZXhlY3V0aW9uIGRvbWFpbiwgdXNlZCBieSB0aGUgU1NFRG9tYWluRml4IHBhc3MuCisvLyBLZWVwIGluIHN5bmMgd2l0aCB0YWJsZXMgaW4gWDg2SW5zdHJJbmZvLmNwcC4KK2NsYXNzIERvbWFpbjxiaXRzPDI+IHZhbD4geworICBiaXRzPDI+IFZhbHVlID0gdmFsOworfQorZGVmIEdlbmVyaWNEb21haW4gICA6IERvbWFpbjwwPjsKK2RlZiBTU0VQYWNrZWRTaW5nbGUgOiBEb21haW48MT47CitkZWYgU1NFUGFja2VkRG91YmxlIDogRG9tYWluPDI+OworZGVmIFNTRVBhY2tlZEludCAgICA6IERvbWFpbjwzPjsKKworLy8gUHJlZml4IGJ5dGUgY2xhc3NlcyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0byB0aGUgYWQtaG9jIG1hY2hpbmUgY29kZQorLy8gZW1pdHRlciB0aGF0IHZhcmlvdXMgcHJlZml4IGJ5dGVzIGFyZSByZXF1aXJlZC4KK2NsYXNzIE9wU2l6ZSB7IGJpdCBoYXNPcFNpemVQcmVmaXggPSAxOyB9CitjbGFzcyBBZFNpemUgeyBiaXQgaGFzQWRTaXplUHJlZml4ID0gMTsgfQorY2xhc3MgUkVYX1cgIHsgYml0IGhhc1JFWF9XUHJlZml4ID0gMTsgfQorY2xhc3MgTE9DSyAgIHsgYml0IGhhc0xvY2tQcmVmaXggPSAxOyB9CitjbGFzcyBTZWdGUyAgeyBiaXRzPDI+IFNlZ092ckJpdHMgPSAxOyB9CitjbGFzcyBTZWdHUyAgeyBiaXRzPDI+IFNlZ092ckJpdHMgPSAyOyB9CitjbGFzcyBUQiAgICAgeyBiaXRzPDQ+IFByZWZpeCA9IDE7IH0KK2NsYXNzIFJFUCAgICB7IGJpdHM8ND4gUHJlZml4ID0gMjsgfQorY2xhc3MgRDggICAgIHsgYml0czw0PiBQcmVmaXggPSAzOyB9CitjbGFzcyBEOSAgICAgeyBiaXRzPDQ+IFByZWZpeCA9IDQ7IH0KK2NsYXNzIERBICAgICB7IGJpdHM8ND4gUHJlZml4ID0gNTsgfQorY2xhc3MgREIgICAgIHsgYml0czw0PiBQcmVmaXggPSA2OyB9CitjbGFzcyBEQyAgICAgeyBiaXRzPDQ+IFByZWZpeCA9IDc7IH0KK2NsYXNzIEREICAgICB7IGJpdHM8ND4gUHJlZml4ID0gODsgfQorY2xhc3MgREUgICAgIHsgYml0czw0PiBQcmVmaXggPSA5OyB9CitjbGFzcyBERiAgICAgeyBiaXRzPDQ+IFByZWZpeCA9IDEwOyB9CitjbGFzcyBYRCAgICAgeyBiaXRzPDQ+IFByZWZpeCA9IDExOyB9CitjbGFzcyBYUyAgICAgeyBiaXRzPDQ+IFByZWZpeCA9IDEyOyB9CitjbGFzcyBUOCAgICAgeyBiaXRzPDQ+IFByZWZpeCA9IDEzOyB9CitjbGFzcyBUQSAgICAgeyBiaXRzPDQ+IFByZWZpeCA9IDE0OyB9CitjbGFzcyBURiAgICAgeyBiaXRzPDQ+IFByZWZpeCA9IDE1OyB9CitjbGFzcyBWRVggICAgeyBiaXQgaGFzVkVYUHJlZml4ID0gMTsgfQorY2xhc3MgVkVYX1cgIHsgYml0IGhhc1ZFWF9XUHJlZml4ID0gMTsgfQorY2xhc3MgVkVYXzRWIDogVkVYIHsgYml0IGhhc1ZFWF80VlByZWZpeCA9IDE7IH0KK2NsYXNzIFZFWF9JOElNTSB7IGJpdCBoYXNWRVhfaThJbW1SZWcgPSAxOyB9CitjbGFzcyBWRVhfTCAgeyBiaXQgaGFzVkVYX0wgPSAxOyB9CisKK2NsYXNzIFg4Nkluc3Q8Yml0czw4PiBvcGNvZCwgRm9ybWF0IGYsIEltbVR5cGUgaSwgZGFnIG91dHMsIGRhZyBpbnMsCisgICAgICAgICAgICAgIHN0cmluZyBBc21TdHIsIERvbWFpbiBkID0gR2VuZXJpY0RvbWFpbj4KKyAgOiBJbnN0cnVjdGlvbiB7CisgIGxldCBOYW1lc3BhY2UgPSAiWDg2IjsKKworICBiaXRzPDg+IE9wY29kZSA9IG9wY29kOworICBGb3JtYXQgRm9ybSA9IGY7CisgIGJpdHM8Nj4gRm9ybUJpdHMgPSBGb3JtLlZhbHVlOworICBJbW1UeXBlIEltbVQgPSBpOworCisgIGRhZyBPdXRPcGVyYW5kTGlzdCA9IG91dHM7CisgIGRhZyBJbk9wZXJhbmRMaXN0ID0gaW5zOworICBzdHJpbmcgQXNtU3RyaW5nID0gQXNtU3RyOworCisgIC8vCisgIC8vIEF0dHJpYnV0ZXMgc3BlY2lmaWMgdG8gWDg2IGluc3RydWN0aW9ucy4uLgorICAvLworICBiaXQgaGFzT3BTaXplUHJlZml4ID0gMDsgIC8vIERvZXMgdGhpcyBpbnN0IGhhdmUgYSAweDY2IHByZWZpeD8KKyAgYml0IGhhc0FkU2l6ZVByZWZpeCA9IDA7ICAvLyBEb2VzIHRoaXMgaW5zdCBoYXZlIGEgMHg2NyBwcmVmaXg/CisKKyAgYml0czw0PiBQcmVmaXggPSAwOyAgICAgICAvLyBXaGljaCBwcmVmaXggYnl0ZSBkb2VzIHRoaXMgaW5zdCBoYXZlPworICBiaXQgaGFzUkVYX1dQcmVmaXggID0gMDsgIC8vIERvZXMgdGhpcyBpbnN0IHJlcXVpcmVzIHRoZSBSRVguVyBwcmVmaXg/CisgIEZQRm9ybWF0IEZQRm9ybSA9IE5vdEZQOyAgLy8gV2hhdCBmbGF2b3Igb2YgRlAgaW5zdHJ1Y3Rpb24gaXMgdGhpcz8KKyAgYml0IGhhc0xvY2tQcmVmaXggPSAwOyAgICAvLyBEb2VzIHRoaXMgaW5zdCBoYXZlIGEgMHhGMCBwcmVmaXg/CisgIGJpdHM8Mj4gU2VnT3ZyQml0cyA9IDA7ICAgLy8gU2VnbWVudCBvdmVycmlkZSBwcmVmaXguCisgIERvbWFpbiBFeGVEb21haW4gPSBkOworICBiaXQgaGFzVkVYUHJlZml4ID0gMDsgICAgIC8vIERvZXMgdGhpcyBpbnN0IHJlcXVpcmVzIGEgVkVYIHByZWZpeD8KKyAgYml0IGhhc1ZFWF9XUHJlZml4ID0gMDsgICAvLyBEb2VzIHRoaXMgaW5zdCBzZXQgdGhlIFZFWF9XIGZpZWxkPworICBiaXQgaGFzVkVYXzRWUHJlZml4ID0gMDsgIC8vIERvZXMgdGhpcyBpbnN0IHJlcXVpcmVzIHRoZSBWRVguVlZWViBmaWVsZD8KKyAgYml0IGhhc1ZFWF9pOEltbVJlZyA9IDA7ICAvLyBEb2VzIHRoaXMgaW5zdCByZXF1aXJlcyB0aGUgbGFzdCBzb3VyY2UgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBlbmNvZGVkIGluIGEgaW1tZWRpYXRlIGZpZWxkPworICBiaXQgaGFzVkVYX0wgPSAwOyAgICAgICAgIC8vIERvZXMgdGhpcyBpbnN0IHVzZXMgbGFyZ2UgKDI1Ni1iaXQpIHJlZ2lzdGVycz8KKworICAvLyBUU0ZsYWdzIGxheW91dCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggWDg2SW5zdHJJbmZvLmguCisgIGxldCBUU0ZsYWdzezUtMH0gICA9IEZvcm1CaXRzOworICBsZXQgVFNGbGFnc3s2fSAgICAgPSBoYXNPcFNpemVQcmVmaXg7CisgIGxldCBUU0ZsYWdzezd9ICAgICA9IGhhc0FkU2l6ZVByZWZpeDsKKyAgbGV0IFRTRmxhZ3N7MTEtOH0gID0gUHJlZml4OworICBsZXQgVFNGbGFnc3sxMn0gICAgPSBoYXNSRVhfV1ByZWZpeDsKKyAgbGV0IFRTRmxhZ3N7MTUtMTN9ID0gSW1tVC5WYWx1ZTsKKyAgbGV0IFRTRmxhZ3N7MTgtMTZ9ID0gRlBGb3JtLlZhbHVlOworICBsZXQgVFNGbGFnc3sxOX0gICAgPSBoYXNMb2NrUHJlZml4OworICBsZXQgVFNGbGFnc3syMS0yMH0gPSBTZWdPdnJCaXRzOworICBsZXQgVFNGbGFnc3syMy0yMn0gPSBFeGVEb21haW4uVmFsdWU7CisgIGxldCBUU0ZsYWdzezMxLTI0fSA9IE9wY29kZTsKKyAgbGV0IFRTRmxhZ3N7MzJ9ICAgID0gaGFzVkVYUHJlZml4OworICBsZXQgVFNGbGFnc3szM30gICAgPSBoYXNWRVhfV1ByZWZpeDsKKyAgbGV0IFRTRmxhZ3N7MzR9ICAgID0gaGFzVkVYXzRWUHJlZml4OworICBsZXQgVFNGbGFnc3szNX0gICAgPSBoYXNWRVhfaThJbW1SZWc7CisgIGxldCBUU0ZsYWdzezM2fSAgICA9IGhhc1ZFWF9MOworfQorCitjbGFzcyBJPGJpdHM8OD4gbywgRm9ybWF0IGYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICBsaXN0PGRhZz4gcGF0dGVybiwgRG9tYWluIGQgPSBHZW5lcmljRG9tYWluPgorICA6IFg4Nkluc3Q8bywgZiwgTm9JbW0sIG91dHMsIGlucywgYXNtLCBkPiB7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGV0IENvZGVTaXplID0gMzsKK30KK2NsYXNzIElpOCA8Yml0czw4PiBvLCBGb3JtYXQgZiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybiwgRG9tYWluIGQgPSBHZW5lcmljRG9tYWluPgorICA6IFg4Nkluc3Q8bywgZiwgSW1tOCwgb3V0cywgaW5zLCBhc20sIGQ+IHsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsZXQgQ29kZVNpemUgPSAzOworfQorY2xhc3MgSWk4UENSZWw8Yml0czw4PiBvLCBGb3JtYXQgZiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIAorICAgICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWDg2SW5zdDxvLCBmLCBJbW04UENSZWwsIG91dHMsIGlucywgYXNtPiB7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGV0IENvZGVTaXplID0gMzsKK30KK2NsYXNzIElpMTY8Yml0czw4PiBvLCBGb3JtYXQgZiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYODZJbnN0PG8sIGYsIEltbTE2LCBvdXRzLCBpbnMsIGFzbT4geworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxldCBDb2RlU2l6ZSA9IDM7Cit9CitjbGFzcyBJaTMyPGJpdHM8OD4gbywgRm9ybWF0IGYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLCAKKyAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWDg2SW5zdDxvLCBmLCBJbW0zMiwgb3V0cywgaW5zLCBhc20+IHsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsZXQgQ29kZVNpemUgPSAzOworfQorCitjbGFzcyBJaTE2UENSZWw8Yml0czw4PiBvLCBGb3JtYXQgZiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYODZJbnN0PG8sIGYsIEltbTE2UENSZWwsIG91dHMsIGlucywgYXNtPiB7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGV0IENvZGVTaXplID0gMzsKK30KKworY2xhc3MgSWkzMlBDUmVsPGJpdHM8OD4gbywgRm9ybWF0IGYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLCAKKyAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgIDogWDg2SW5zdDxvLCBmLCBJbW0zMlBDUmVsLCBvdXRzLCBpbnMsIGFzbT4geworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47CisgIGxldCBDb2RlU2l6ZSA9IDM7Cit9CisKKy8vIEZQU3RhY2sgSW5zdHJ1Y3Rpb24gVGVtcGxhdGVzOgorLy8gRlBJIC0gRmxvYXRpbmcgUG9pbnQgSW5zdHJ1Y3Rpb24gdGVtcGxhdGUuCitjbGFzcyBGUEk8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20+CisgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgW10+IHt9CisKKy8vIEZwSV8gLSBGbG9hdGluZyBQb2ludCBQc3VlZG8gSW5zdHJ1Y3Rpb24gdGVtcGxhdGUuIE5vdCBQcmVkaWNhdGVkLgorY2xhc3MgRnBJXzxkYWcgb3V0cywgZGFnIGlucywgRlBGb3JtYXQgZnAsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICA6IFg4Nkluc3Q8MCwgUHNldWRvLCBOb0ltbSwgb3V0cywgaW5zLCAiIj4geworICBsZXQgRlBGb3JtID0gZnA7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKK30KKworLy8gVGVtcGxhdGVzIGZvciBpbnN0cnVjdGlvbnMgdGhhdCB1c2UgYSAxNi0gb3IgMzItYml0IHNlZ21lbnRlZCBhZGRyZXNzIGFzCisvLyAgdGhlaXIgb25seSBvcGVyYW5kOiBsY2FsbCAoRkFSIENBTEwpIGFuZCBsam1wIChGQVIgSk1QKQorLy8KKy8vICAgSXNlZzE2IC0gMTYtYml0IHNlZ21lbnQgc2VsZWN0b3IsIDE2LWJpdCBvZmZzZXQKKy8vICAgSXNlZzMyIC0gMTYtYml0IHNlZ21lbnQgc2VsZWN0b3IsIDMyLWJpdCBvZmZzZXQKKworY2xhc3MgSXNlZzE2IDxiaXRzPDg+IG8sIEZvcm1hdCBmLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwgCisgICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6IFg4Nkluc3Q8bywgZiwgTm9JbW0sIG91dHMsIGlucywgYXNtPiB7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGV0IENvZGVTaXplID0gMzsKK30KKworY2xhc3MgSXNlZzMyIDxiaXRzPDg+IG8sIEZvcm1hdCBmLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwgCisgICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPiA6IFg4Nkluc3Q8bywgZiwgTm9JbW0sIG91dHMsIGlucywgYXNtPiB7CisgIGxldCBQYXR0ZXJuID0gcGF0dGVybjsKKyAgbGV0IENvZGVTaXplID0gMzsKK30KKworLy8gU0kgLSBTU0UgMSAmIDIgc2NhbGFyIGluc3RydWN0aW9ucworY2xhc3MgU0k8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuPiB7CisgIGxldCBQcmVkaWNhdGVzID0gIWlmKGhhc1ZFWFByZWZpeCAvKiBWRVggKi8sIFtIYXNBVlhdLAorICAgICAgICAgICAgIWlmKCFlcShQcmVmaXgsIDEyIC8qIFhTICovKSwgW0hhc1NTRTFdLCBbSGFzU1NFMl0pKTsKKworICAvLyBBVlggaW5zdHJ1Y3Rpb25zIGhhdmUgYSAndicgcHJlZml4IGluIHRoZSBtbmVtb25pYworICBsZXQgQXNtU3RyaW5nID0gIWlmKGhhc1ZFWFByZWZpeCwgIXN0cmNvbmNhdCgidiIsIGFzbSksIGFzbSk7Cit9CisKKy8vIFNJaTggLSBTU0UgMSAmIDIgc2NhbGFyIGluc3RydWN0aW9ucworY2xhc3MgU0lpODxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICA6IElpODxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybj4geworICBsZXQgUHJlZGljYXRlcyA9ICFpZihoYXNWRVhQcmVmaXggLyogVkVYICovLCBbSGFzQVZYXSwKKyAgICAgICAgICAgICFpZighZXEoUHJlZml4LCAxMiAvKiBYUyAqLyksIFtIYXNTU0UxXSwgW0hhc1NTRTJdKSk7CisKKyAgLy8gQVZYIGluc3RydWN0aW9ucyBoYXZlIGEgJ3YnIHByZWZpeCBpbiB0aGUgbW5lbW9uaWMKKyAgbGV0IEFzbVN0cmluZyA9ICFpZihoYXNWRVhQcmVmaXgsICFzdHJjb25jYXQoInYiLCBhc20pLCBhc20pOworfQorCisvLyBQSSAtIFNTRSAxICYgMiBwYWNrZWQgaW5zdHJ1Y3Rpb25zCitjbGFzcyBQSTxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4sCisgICAgICAgICBEb21haW4gZD4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybiwgZD4geworICBsZXQgUHJlZGljYXRlcyA9ICFpZihoYXNWRVhQcmVmaXggLyogVkVYICovLCBbSGFzQVZYXSwKKyAgICAgICAgIWlmKGhhc09wU2l6ZVByZWZpeCAvKiBPcFNpemUgKi8sIFtIYXNTU0UyXSwgW0hhc1NTRTFdKSk7CisKKyAgLy8gQVZYIGluc3RydWN0aW9ucyBoYXZlIGEgJ3YnIHByZWZpeCBpbiB0aGUgbW5lbW9uaWMKKyAgbGV0IEFzbVN0cmluZyA9ICFpZihoYXNWRVhQcmVmaXgsICFzdHJjb25jYXQoInYiLCBhc20pLCBhc20pOworfQorCisvLyBQSWk4IC0gU1NFIDEgJiAyIHBhY2tlZCBpbnN0cnVjdGlvbnMgd2l0aCBpbW1lZGlhdGUKK2NsYXNzIFBJaTg8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuLCBEb21haW4gZD4KKyAgICAgIDogSWk4PG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuLCBkPiB7CisgIGxldCBQcmVkaWNhdGVzID0gIWlmKGhhc1ZFWF80VlByZWZpeCAvKiBWRVggKi8sIFtIYXNBVlhdLAorICAgICAgICAhaWYoaGFzT3BTaXplUHJlZml4IC8qIE9wU2l6ZSAqLywgW0hhc1NTRTJdLCBbSGFzU1NFMV0pKTsKKworICAvLyBBVlggaW5zdHJ1Y3Rpb25zIGhhdmUgYSAndicgcHJlZml4IGluIHRoZSBtbmVtb25pYworICBsZXQgQXNtU3RyaW5nID0gIWlmKGhhc1ZFWF80VlByZWZpeCwgIXN0cmNvbmNhdCgidiIsIGFzbSksIGFzbSk7Cit9CisKKy8vIFNTRTEgSW5zdHJ1Y3Rpb24gVGVtcGxhdGVzOgorLy8gCisvLyAgIFNTSSAgIC0gU1NFMSBpbnN0cnVjdGlvbnMgd2l0aCBYUyBwcmVmaXguCisvLyAgIFBTSSAgIC0gU1NFMSBpbnN0cnVjdGlvbnMgd2l0aCBUQiBwcmVmaXguCisvLyAgIFBTSWk4IC0gU1NFMSBpbnN0cnVjdGlvbnMgd2l0aCBJbW1UID09IEltbTggYW5kIFRCIHByZWZpeC4KKy8vICAgVlNTSSAgLSBTU0UxIGluc3RydWN0aW9ucyB3aXRoIFhTIHByZWZpeCBpbiBBVlggZm9ybS4KKy8vICAgVlBTSSAgLSBTU0UxIGluc3RydWN0aW9ucyB3aXRoIFRCIHByZWZpeCBpbiBBVlggZm9ybS4KKworY2xhc3MgU1NJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybj4sIFhTLCBSZXF1aXJlczxbSGFzU1NFMV0+OworY2xhc3MgU1NJaTg8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSWk4PG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuPiwgWFMsIFJlcXVpcmVzPFtIYXNTU0UxXT47CitjbGFzcyBQU0k8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuLCBTU0VQYWNrZWRTaW5nbGU+LCBUQiwKKyAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTFdPjsKK2NsYXNzIFBTSWk4PGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICA6IElpODxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybiwgU1NFUGFja2VkU2luZ2xlPiwgVEIsCisgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UxXT47CitjbGFzcyBWU1NJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsICFzdHJjb25jYXQoInYiLCBhc20pLCBwYXR0ZXJuPiwgWFMsCisgICAgICAgIFJlcXVpcmVzPFtIYXNBVlhdPjsKK2NsYXNzIFZQU0k8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJPG8sIEYsIG91dHMsIGlucywgIXN0cmNvbmNhdCgidiIsIGFzbSksIHBhdHRlcm4sIFNTRVBhY2tlZFNpbmdsZT4sCisgICAgICAgIFJlcXVpcmVzPFtIYXNBVlhdPjsKKworLy8gU1NFMiBJbnN0cnVjdGlvbiBUZW1wbGF0ZXM6CisvLyAKKy8vICAgU0RJICAgIC0gU1NFMiBpbnN0cnVjdGlvbnMgd2l0aCBYRCBwcmVmaXguCisvLyAgIFNESWk4ICAtIFNTRTIgaW5zdHJ1Y3Rpb25zIHdpdGggSW1tVCA9PSBJbW04IGFuZCBYRCBwcmVmaXguCisvLyAgIFNTRElpOCAtIFNTRTIgaW5zdHJ1Y3Rpb25zIHdpdGggSW1tVCA9PSBJbW04IGFuZCBYUyBwcmVmaXguCisvLyAgIFBESSAgICAtIFNTRTIgaW5zdHJ1Y3Rpb25zIHdpdGggVEIgYW5kIE9wU2l6ZSBwcmVmaXhlcy4KKy8vICAgUERJaTggIC0gU1NFMiBpbnN0cnVjdGlvbnMgd2l0aCBJbW1UID09IEltbTggYW5kIFRCIGFuZCBPcFNpemUgcHJlZml4ZXMuCisvLyAgIFZTREkgICAtIFNTRTIgaW5zdHJ1Y3Rpb25zIHdpdGggWEQgcHJlZml4IGluIEFWWCBmb3JtLgorLy8gICBWUERJICAgLSBTU0UyIGluc3RydWN0aW9ucyB3aXRoIFRCIGFuZCBPcFNpemUgcHJlZml4ZXMgaW4gQVZYIGZvcm0uCisKK2NsYXNzIFNESTxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICA6IEk8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4+LCBYRCwgUmVxdWlyZXM8W0hhc1NTRTJdPjsKK2NsYXNzIFNESWk4PGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICA6IElpODxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybj4sIFhELCBSZXF1aXJlczxbSGFzU1NFMl0+OworY2xhc3MgU1NESWk4PGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJaTg8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4+LCBYUywgUmVxdWlyZXM8W0hhc1NTRTJdPjsKK2NsYXNzIFBESTxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICA6IEk8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4sIFNTRVBhY2tlZERvdWJsZT4sIFRCLCBPcFNpemUsCisgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UyXT47CitjbGFzcyBQRElpODxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJaTg8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4sIFNTRVBhY2tlZERvdWJsZT4sIFRCLCBPcFNpemUsCisgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UyXT47CitjbGFzcyBWU0RJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsICFzdHJjb25jYXQoInYiLCBhc20pLCBwYXR0ZXJuPiwgWEQsCisgICAgICAgIFJlcXVpcmVzPFtIYXNBVlhdPjsKK2NsYXNzIFZQREk8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJPG8sIEYsIG91dHMsIGlucywgIXN0cmNvbmNhdCgidiIsIGFzbSksIHBhdHRlcm4sIFNTRVBhY2tlZERvdWJsZT4sCisgICAgICAgIE9wU2l6ZSwgUmVxdWlyZXM8W0hhc0FWWF0+OworCisvLyBTU0UzIEluc3RydWN0aW9uIFRlbXBsYXRlczoKKy8vIAorLy8gICBTM0kgICAtIFNTRTMgaW5zdHJ1Y3Rpb25zIHdpdGggVEIgYW5kIE9wU2l6ZSBwcmVmaXhlcy4KKy8vICAgUzNTSSAgLSBTU0UzIGluc3RydWN0aW9ucyB3aXRoIFhTIHByZWZpeC4KKy8vICAgUzNESSAgLSBTU0UzIGluc3RydWN0aW9ucyB3aXRoIFhEIHByZWZpeC4KKworY2xhc3MgUzNTSTxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwgCisgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuLCBTU0VQYWNrZWRTaW5nbGU+LCBYUywKKyAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTNdPjsKK2NsYXNzIFMzREk8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybiwgU1NFUGFja2VkRG91YmxlPiwgWEQsCisgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UzXT47CitjbGFzcyBTM0k8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuLCBTU0VQYWNrZWREb3VibGU+LCBUQiwgT3BTaXplLAorICAgICAgICBSZXF1aXJlczxbSGFzU1NFM10+OworCisKKy8vIFNTU0UzIEluc3RydWN0aW9uIFRlbXBsYXRlczoKKy8vIAorLy8gICBTUzM4SSAtIFNTU0UzIGluc3RydWN0aW9ucyB3aXRoIFQ4IHByZWZpeC4KKy8vICAgU1MzQUkgLSBTU1NFMyBpbnN0cnVjdGlvbnMgd2l0aCBUQSBwcmVmaXguCisvLworLy8gTm90ZTogU1NTRTMgaW5zdHJ1Y3Rpb25zIGhhdmUgNjQtYml0IGFuZCAxMjgtYml0IHZlcnNpb25zLiBUaGUgNjQtYml0IHZlcnNpb24KKy8vIHVzZXMgdGhlIE1NWCByZWdpc3RlcnMuIFdlIHB1dCB0aG9zZSBpbnN0cnVjdGlvbnMgaGVyZSBiZWNhdXNlIHRoZXkgYmV0dGVyCisvLyBmaXQgaW50byB0aGUgU1NTRTMgaW5zdHJ1Y3Rpb24gY2F0ZWdvcnkgcmF0aGVyIHRoYW4gdGhlIE1NWCBjYXRlZ29yeS4KKworY2xhc3MgU1MzOEk8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSWk4PG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuLCBTU0VQYWNrZWRJbnQ+LCBUOCwKKyAgICAgICAgUmVxdWlyZXM8W0hhc1NTU0UzXT47CitjbGFzcyBTUzNBSTxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJaTg8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4sIFNTRVBhY2tlZEludD4sIFRBLAorICAgICAgICBSZXF1aXJlczxbSGFzU1NTRTNdPjsKKworLy8gU1NFNC4xIEluc3RydWN0aW9uIFRlbXBsYXRlczoKKy8vIAorLy8gICBTUzQ4SSAtIFNTRSA0LjEgaW5zdHJ1Y3Rpb25zIHdpdGggVDggcHJlZml4LgorLy8gICBTUzQxQUlpOCAtIFNTRSA0LjEgaW5zdHJ1Y3Rpb25zIHdpdGggVEEgcHJlZml4IGFuZCBJbW1UID09IEltbTguCisvLworY2xhc3MgU1M0OEk8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybiwgU1NFUGFja2VkSW50PiwgVDgsCisgICAgICAgIFJlcXVpcmVzPFtIYXNTU0U0MV0+OworY2xhc3MgU1M0QUlpODxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJaTg8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4sIFNTRVBhY2tlZEludD4sIFRBLAorICAgICAgICBSZXF1aXJlczxbSGFzU1NFNDFdPjsKKworLy8gU1NFNC4yIEluc3RydWN0aW9uIFRlbXBsYXRlczoKKy8vIAorLy8gICBTUzQyOEkgLSBTU0UgNC4yIGluc3RydWN0aW9ucyB3aXRoIFQ4IHByZWZpeC4KK2NsYXNzIFNTNDI4STxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwKKyAgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybiwgU1NFUGFja2VkSW50PiwgVDgsCisgICAgICAgIFJlcXVpcmVzPFtIYXNTU0U0Ml0+OworCisvLyAgIFNTNDJGSSAtIFNTRSA0LjIgaW5zdHJ1Y3Rpb25zIHdpdGggVEYgcHJlZml4LgorY2xhc3MgU1M0MkZJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybj4sIFRGLCBSZXF1aXJlczxbSGFzU1NFNDJdPjsKKyAgICAgIAorLy8gICBTUzQyQUkgPSBTU0UgNC4yIGluc3RydWN0aW9ucyB3aXRoIFRBIHByZWZpeAorY2xhc3MgU1M0MkFJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJaTg8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4sIFNTRVBhY2tlZEludD4sIFRBLAorICAgICAgICBSZXF1aXJlczxbSGFzU1NFNDJdPjsKKworLy8gQVZYIEluc3RydWN0aW9uIFRlbXBsYXRlczoKKy8vICAgSW5zdHJ1Y3Rpb25zIGludHJvZHVjZWQgaW4gQVZYIChubyBTU0UgZXF1aXZhbGVudCBmb3JtcykKKy8vCisvLyAgIEFWWDhJIC0gQVZYIGluc3RydWN0aW9ucyB3aXRoIFQ4IGFuZCBPcFNpemUgcHJlZml4LgorLy8gICBBVlhBSWk4IC0gQVZYIGluc3RydWN0aW9ucyB3aXRoIFRBLCBPcFNpemUgcHJlZml4IGFuZCBJbW1UID0gSW1tOC4KK2NsYXNzIEFWWDhJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICA6IEk8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4sIFNTRVBhY2tlZEludD4sIFQ4LCBPcFNpemUsCisgICAgICAgIFJlcXVpcmVzPFtIYXNBVlhdPjsKK2NsYXNzIEFWWEFJaTg8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJaTg8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4sIFNTRVBhY2tlZEludD4sIFRBLCBPcFNpemUsCisgICAgICAgIFJlcXVpcmVzPFtIYXNBVlhdPjsKKworLy8gQUVTIEluc3RydWN0aW9uIFRlbXBsYXRlczoKKy8vCisvLyBBRVM4SQorLy8gVGhlc2UgdXNlIHRoZSBzYW1lIGVuY29kaW5nIGFzIHRoZSBTU0U0LjIgVDggYW5kIFRBIGVuY29kaW5ncy4KK2NsYXNzIEFFUzhJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICAgbGlzdDxkYWc+cGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybiwgU1NFUGFja2VkSW50PiwgVDgsCisgICAgICAgIFJlcXVpcmVzPFtIYXNBRVNdPjsKKworY2xhc3MgQUVTQUk8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSWk4PG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuLCBTU0VQYWNrZWRJbnQ+LCBUQSwKKyAgICAgICAgUmVxdWlyZXM8W0hhc0FFU10+OworCisvLyBDTE1VTCBJbnN0cnVjdGlvbiBUZW1wbGF0ZXMKK2NsYXNzIENMTVVMSWk4PGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICAgICAgbGlzdDxkYWc+cGF0dGVybj4KKyAgICAgIDogSWk4PG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuLCBTU0VQYWNrZWRJbnQ+LCBUQSwKKyAgICAgICAgT3BTaXplLCBWRVhfNFYsIFJlcXVpcmVzPFtIYXNBVlgsIEhhc0NMTVVMXT47CisKKy8vIEZNQTMgSW5zdHJ1Y3Rpb24gVGVtcGxhdGVzCitjbGFzcyBGTUEzPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICBsaXN0PGRhZz5wYXR0ZXJuPgorICAgICAgOiBJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuLCBTU0VQYWNrZWRJbnQ+LCBUOCwKKyAgICAgICAgT3BTaXplLCBWRVhfNFYsIFJlcXVpcmVzPFtIYXNGTUEzXT47CisKKy8vIFg4Ni02NCBJbnN0cnVjdGlvbiB0ZW1wbGF0ZXMuLi4KKy8vCisKK2NsYXNzIFJJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybj4sIFJFWF9XOworY2xhc3MgUklpOCA8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSWk4PG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuPiwgUkVYX1c7CitjbGFzcyBSSWkzMiA8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICA6IElpMzI8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4+LCBSRVhfVzsKKworY2xhc3MgUklpNjQ8Yml0czw4PiBvLCBGb3JtYXQgZiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgOiBYODZJbnN0PG8sIGYsIEltbTY0LCBvdXRzLCBpbnMsIGFzbT4sIFJFWF9XIHsKKyAgbGV0IFBhdHRlcm4gPSBwYXR0ZXJuOworICBsZXQgQ29kZVNpemUgPSAzOworfQorCitjbGFzcyBSU1NJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogU1NJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuPiwgUkVYX1c7CitjbGFzcyBSU0RJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogU0RJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuPiwgUkVYX1c7CitjbGFzcyBSUERJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogUERJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuPiwgUkVYX1c7CisKKy8vIE1NWCBJbnN0cnVjdGlvbiB0ZW1wbGF0ZXMKKy8vCisKKy8vIE1NWEkgICAtIE1NWCBpbnN0cnVjdGlvbnMgd2l0aCBUQiBwcmVmaXguCisvLyBNTVhJNjQgLSBNTVggaW5zdHJ1Y3Rpb25zIHdpdGggVEIgcHJlZml4IHZhbGlkIG9ubHkgaW4gNjQgYml0IG1vZGUuCisvLyBNTVgySSAgLSBNTVggLyBTU0UyIGluc3RydWN0aW9ucyB3aXRoIFRCIGFuZCBPcFNpemUgcHJlZml4ZXMuCisvLyBNTVhJaTggLSBNTVggaW5zdHJ1Y3Rpb25zIHdpdGggSW1tVCA9PSBJbW04IGFuZCBUQiBwcmVmaXguCisvLyBNTVhJaTggLSBNTVggaW5zdHJ1Y3Rpb25zIHdpdGggSW1tVCA9PSBJbW04IGFuZCBUQiBwcmVmaXguCisvLyBNTVhJRCAgLSBNTVggaW5zdHJ1Y3Rpb25zIHdpdGggWEQgcHJlZml4LgorLy8gTU1YSVMgIC0gTU1YIGluc3RydWN0aW9ucyB3aXRoIFhTIHByZWZpeC4KK2NsYXNzIE1NWEk8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIAorICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybj4sIFRCLCBSZXF1aXJlczxbSGFzTU1YXT47CitjbGFzcyBNTVhJNjQ8Yml0czw4PiBvLCBGb3JtYXQgRiwgZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc20sIAorICAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuPiwgVEIsIFJlcXVpcmVzPFtIYXNNTVgsSW42NEJpdE1vZGVdPjsKK2NsYXNzIE1NWFJJPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLCAKKyAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJPG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuPiwgVEIsIFJFWF9XLCBSZXF1aXJlczxbSGFzTU1YXT47CitjbGFzcyBNTVgySTxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwgCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSTxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybj4sIFRCLCBPcFNpemUsIFJlcXVpcmVzPFtIYXNNTVhdPjsKK2NsYXNzIE1NWElpODxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwgCisgICAgICAgICAgICAgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgICA6IElpODxvLCBGLCBvdXRzLCBpbnMsIGFzbSwgcGF0dGVybj4sIFRCLCBSZXF1aXJlczxbSGFzTU1YXT47CitjbGFzcyBNTVhJRDxiaXRzPDg+IG8sIEZvcm1hdCBGLCBkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbSwgCisgICAgICAgICAgICBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICAgIDogSWk4PG8sIEYsIG91dHMsIGlucywgYXNtLCBwYXR0ZXJuPiwgWEQsIFJlcXVpcmVzPFtIYXNNTVhdPjsKK2NsYXNzIE1NWElTPGJpdHM8OD4gbywgRm9ybWF0IEYsIGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtLCAKKyAgICAgICAgICAgIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgICAgOiBJaTg8bywgRiwgb3V0cywgaW5zLCBhc20sIHBhdHRlcm4+LCBYUywgUmVxdWlyZXM8W0hhc01NWF0+OwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJGcmFnbWVudHNTSU1ELnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJGcmFnbWVudHNTSU1ELnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDI4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0ckZyYWdtZW50c1NJTUQudGQKQEAgLTAsMCArMSw0MDUgQEAKKy8vPT09PT09LSBYODZJbnN0ckZyYWdtZW50c1NJTUQudGQgLSB4ODYgSVNBIC0tLS0tLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBwYXR0ZXJuIGZyYWdtZW50cyB1c2VmdWwgZm9yIFNJTUQgaW5zdHJ1Y3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNTVggUGF0dGVybiBGcmFnbWVudHMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiBsb2FkX21teCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodjFpNjQgKGxvYWQgbm9kZTokcHRyKSk+OworCitkZWYgYmNfdjhpOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLCAodjhpOCAgKGJpdGNvbnZlcnQgbm9kZTokaW4pKT47CitkZWYgYmNfdjRpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLCAodjRpMTYgKGJpdGNvbnZlcnQgbm9kZTokaW4pKT47CitkZWYgYmNfdjJpMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLCAodjJpMzIgKGJpdGNvbnZlcnQgbm9kZTokaW4pKT47CitkZWYgYmNfdjFpNjQgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLCAodjFpNjQgKGJpdGNvbnZlcnQgbm9kZTokaW4pKT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNTVggTWFza3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE1NWF9TSFVGRkxFX2dldF9zaHVmX2ltbSB4Zm9ybSBmdW5jdGlvbjogY29udmVydCB2ZWN0b3Jfc2h1ZmZsZSBtYXNrIHRvCisvLyBQU0hVRlcgaW1tLgorZGVmIE1NWF9TSFVGRkxFX2dldF9zaHVmX2ltbSA6IFNETm9kZVhGb3JtPHZlY3Rvcl9zaHVmZmxlLCBbeworICByZXR1cm4gZ2V0SThJbW0oWDg2OjpnZXRTaHVmZmxlU0hVRkltbWVkaWF0ZShOKSk7Cit9XT47CisKKy8vIFBhdHRlcm5zIGZvcjogdmVjdG9yX3NodWZmbGUgdjEsIHYyLCA8MiwgNiwgMywgNywgLi4uPgorZGVmIG1teF91bnBja2ggOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzVU5QQ0tITWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pKTsKK31dPjsKKworLy8gUGF0dGVybnMgZm9yOiB2ZWN0b3Jfc2h1ZmZsZSB2MSwgdjIsIDwwLCA0LCAyLCA1LCAuLi4+CitkZWYgbW14X3VucGNrbCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlIG5vZGU6JGxocywgbm9kZTokcmhzKSwgW3sKKyAgcmV0dXJuIFg4Njo6aXNVTlBDS0xNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTikpOworfV0+OworCisvLyBQYXR0ZXJucyBmb3I6IHZlY3Rvcl9zaHVmZmxlIHYxLCA8dW5kZWY+LCA8MCwgMCwgMSwgMSwgLi4uPgorZGVmIG1teF91bnBja2hfdW5kZWYgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzVU5QQ0tIX3ZfdW5kZWZfTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pKTsKK31dPjsKKworLy8gUGF0dGVybnMgZm9yOiB2ZWN0b3Jfc2h1ZmZsZSB2MSwgPHVuZGVmPiwgPDIsIDIsIDMsIDMsIC4uLj4KK2RlZiBtbXhfdW5wY2tsX3VuZGVmIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbeworICByZXR1cm4gWDg2Ojppc1VOUENLTF92X3VuZGVmX01hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSk7Cit9XT47CisKK2RlZiBtbXhfcHNodWZ3IDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbeworICByZXR1cm4gWDg2Ojppc1BTSFVGRE1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSk7Cit9XSwgTU1YX1NIVUZGTEVfZ2V0X3NodWZfaW1tPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNTRSBzcGVjaWZpYyBEQUcgTm9kZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgU0RUWDg2RlBTaGlmdE9wIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbIFNEVENpc1NhbWVBczwwLCAxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzRlA8MD4sIFNEVENpc0ludDwyPiBdPjsKK2RlZiBTRFRYODZWRkNNUCA6IFNEVHlwZVByb2ZpbGU8MSwgMywgW1NEVENpc0ludDwwPiwgU0RUQ2lzU2FtZUFzPDEsIDI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzRlA8MT4sIFNEVENpc1ZUPDMsIGk4Pl0+OworCitkZWYgWDg2Zm1pbiAgICA6IFNETm9kZTwiWDg2SVNEOjpGTUlOIiwgICAgICBTRFRGUEJpbk9wPjsKK2RlZiBYODZmbWF4ICAgIDogU0ROb2RlPCJYODZJU0Q6OkZNQVgiLCAgICAgIFNEVEZQQmluT3A+OworZGVmIFg4NmZhbmQgICAgOiBTRE5vZGU8Ilg4NklTRDo6RkFORCIsICAgICAgU0RURlBCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmUsIFNETlBBc3NvY2lhdGl2ZV0+OworZGVmIFg4NmZvciAgICAgOiBTRE5vZGU8Ilg4NklTRDo6Rk9SIiwgICAgICAgU0RURlBCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmUsIFNETlBBc3NvY2lhdGl2ZV0+OworZGVmIFg4NmZ4b3IgICAgOiBTRE5vZGU8Ilg4NklTRDo6RlhPUiIsICAgICAgU0RURlBCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmUsIFNETlBBc3NvY2lhdGl2ZV0+OworZGVmIFg4NmZyc3FydCAgOiBTRE5vZGU8Ilg4NklTRDo6RlJTUVJUIiwgICAgU0RURlBVbmFyeU9wPjsKK2RlZiBYODZmcmNwICAgIDogU0ROb2RlPCJYODZJU0Q6OkZSQ1AiLCAgICAgIFNEVEZQVW5hcnlPcD47CitkZWYgWDg2ZnNybCAgICA6IFNETm9kZTwiWDg2SVNEOjpGU1JMIiwgICAgICBTRFRYODZGUFNoaWZ0T3A+OworZGVmIFg4NmNvbWkgICAgOiBTRE5vZGU8Ilg4NklTRDo6Q09NSSIsICAgICAgU0RUWDg2Q21wVGVzdD47CitkZWYgWDg2dWNvbWkgICA6IFNETm9kZTwiWDg2SVNEOjpVQ09NSSIsICAgICBTRFRYODZDbXBUZXN0PjsKK2RlZiBYODZwc2h1ZmIgIDogU0ROb2RlPCJYODZJU0Q6OlBTSFVGQiIsCisgICAgICAgICAgICAgICAgIFNEVHlwZVByb2ZpbGU8MSwgMiwgW1NEVENpc1ZUPDAsIHYxNmk4PiwgU0RUQ2lzU2FtZUFzPDAsMT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1NhbWVBczwwLDI+XT4+OworZGVmIFg4NnBleHRyYiAgOiBTRE5vZGU8Ilg4NklTRDo6UEVYVFJCIiwKKyAgICAgICAgICAgICAgICAgU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzVlQ8MCwgaTMyPiwgU0RUQ2lzUHRyVHk8Mj5dPj47CitkZWYgWDg2cGV4dHJ3ICA6IFNETm9kZTwiWDg2SVNEOjpQRVhUUlciLAorICAgICAgICAgICAgICAgICBTRFR5cGVQcm9maWxlPDEsIDIsIFtTRFRDaXNWVDwwLCBpMzI+LCBTRFRDaXNQdHJUeTwyPl0+PjsKK2RlZiBYODZwaW5zcmIgIDogU0ROb2RlPCJYODZJU0Q6OlBJTlNSQiIsCisgICAgICAgICAgICAgICAgIFNEVHlwZVByb2ZpbGU8MSwgMywgW1NEVENpc1ZUPDAsIHYxNmk4PiwgU0RUQ2lzU2FtZUFzPDAsMT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDIsIGkzMj4sIFNEVENpc1B0clR5PDM+XT4+OworZGVmIFg4NnBpbnNydyAgOiBTRE5vZGU8Ilg4NklTRDo6UElOU1JXIiwKKyAgICAgICAgICAgICAgICAgU0RUeXBlUHJvZmlsZTwxLCAzLCBbU0RUQ2lzVlQ8MCwgdjhpMTY+LCBTRFRDaXNTYW1lQXM8MCwxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVlQ8MiwgaTMyPiwgU0RUQ2lzUHRyVHk8Mz5dPj47CitkZWYgWDg2aW5zcnRwcyA6IFNETm9kZTwiWDg2SVNEOjpJTlNFUlRQUyIsCisgICAgICAgICAgICAgICAgIFNEVHlwZVByb2ZpbGU8MSwgMywgW1NEVENpc1ZUPDAsIHY0ZjMyPiwgU0RUQ2lzU2FtZUFzPDAsMT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDIsIHY0ZjMyPiwgU0RUQ2lzUHRyVHk8Mz5dPj47CitkZWYgWDg2dnptb3ZsICA6IFNETm9kZTwiWDg2SVNEOjpWWkVYVF9NT1ZMIiwKKyAgICAgICAgICAgICAgICAgU0RUeXBlUHJvZmlsZTwxLCAxLCBbU0RUQ2lzU2FtZUFzPDAsMT5dPj47CitkZWYgWDg2dnpsb2FkICA6IFNETm9kZTwiWDg2SVNEOjpWWkVYVF9MT0FEIiwgU0RUTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlMb2FkXT47CitkZWYgWDg2dnNobCAgICA6IFNETm9kZTwiWDg2SVNEOjpWU0hMIiwgICAgICBTRFRJbnRTaGlmdE9wPjsKK2RlZiBYODZ2c2hyICAgIDogU0ROb2RlPCJYODZJU0Q6OlZTUkwiLCAgICAgIFNEVEludFNoaWZ0T3A+OworZGVmIFg4NmNtcHBzICAgOiBTRE5vZGU8Ilg4NklTRDo6Q01QUFMiLCAgICAgU0RUWDg2VkZDTVA+OworZGVmIFg4NmNtcHBkICAgOiBTRE5vZGU8Ilg4NklTRDo6Q01QUEQiLCAgICAgU0RUWDg2VkZDTVA+OworZGVmIFg4NnBjbXBlcWIgOiBTRE5vZGU8Ilg4NklTRDo6UENNUEVRQiIsIFNEVEludEJpbk9wLCBbU0ROUENvbW11dGF0aXZlXT47CitkZWYgWDg2cGNtcGVxdyA6IFNETm9kZTwiWDg2SVNEOjpQQ01QRVFXIiwgU0RUSW50QmluT3AsIFtTRE5QQ29tbXV0YXRpdmVdPjsKK2RlZiBYODZwY21wZXFkIDogU0ROb2RlPCJYODZJU0Q6OlBDTVBFUUQiLCBTRFRJbnRCaW5PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIFg4NnBjbXBlcXEgOiBTRE5vZGU8Ilg4NklTRDo6UENNUEVRUSIsIFNEVEludEJpbk9wLCBbU0ROUENvbW11dGF0aXZlXT47CitkZWYgWDg2cGNtcGd0YiA6IFNETm9kZTwiWDg2SVNEOjpQQ01QR1RCIiwgU0RUSW50QmluT3A+OworZGVmIFg4NnBjbXBndHcgOiBTRE5vZGU8Ilg4NklTRDo6UENNUEdUVyIsIFNEVEludEJpbk9wPjsKK2RlZiBYODZwY21wZ3RkIDogU0ROb2RlPCJYODZJU0Q6OlBDTVBHVEQiLCBTRFRJbnRCaW5PcD47CitkZWYgWDg2cGNtcGd0cSA6IFNETm9kZTwiWDg2SVNEOjpQQ01QR1RRIiwgU0RUSW50QmluT3A+OworCitkZWYgU0RUWDg2Q21wUFRlc3QgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFtTRFRDaXNWVDwwLCBpMzI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVmVjPDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzU2FtZUFzPDIsIDE+XT47CitkZWYgWDg2cHRlc3QgICA6IFNETm9kZTwiWDg2SVNEOjpQVEVTVCIsIFNEVFg4NkNtcFBUZXN0PjsKK2RlZiBYODZ0ZXN0cCAgIDogU0ROb2RlPCJYODZJU0Q6OlRFU1RQIiwgU0RUWDg2Q21wUFRlc3Q+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU1NFIENvbXBsZXggUGF0dGVybnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoZXNlIGFyZSAnZXh0bG9hZHMnIGZyb20gYSBzY2FsYXIgdG8gdGhlIGxvdyBlbGVtZW50IG9mIGEgdmVjdG9yLCB6ZXJvaW5nCisvLyB0aGUgdG9wIGVsZW1lbnRzLiAgVGhlc2UgYXJlIHVzZWQgZm9yIHRoZSBTU0UgJ3NzJyBhbmQgJ3NkJyBpbnN0cnVjdGlvbgorLy8gZm9ybXMuCitkZWYgc3NlX2xvYWRfZjMyIDogQ29tcGxleFBhdHRlcm48djRmMzIsIDUsICJTZWxlY3RTY2FsYXJTU0VMb2FkIiwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heUxvYWRdPjsKK2RlZiBzc2VfbG9hZF9mNjQgOiBDb21wbGV4UGF0dGVybjx2MmY2NCwgNSwgIlNlbGVjdFNjYWxhclNTRUxvYWQiLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5TG9hZF0+OworCitkZWYgc3NtZW0gOiBPcGVyYW5kPHY0ZjMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludGYzMm1lbSI7CisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBwdHJfcmMsIGk4aW1tLCBwdHJfcmNfbm9zcCwgaTMyaW1tLCBpOGltbSk7CisgIGxldCBQYXJzZXJNYXRjaENsYXNzID0gWDg2TWVtQXNtT3BlcmFuZDsKK30KK2RlZiBzZG1lbSA6IE9wZXJhbmQ8djJmNjQ+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50ZjY0bWVtIjsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSAob3BzIHB0cl9yYywgaThpbW0sIHB0cl9yY19ub3NwLCBpMzJpbW0sIGk4aW1tKTsKKyAgbGV0IFBhcnNlck1hdGNoQ2xhc3MgPSBYODZNZW1Bc21PcGVyYW5kOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU1NFIHBhdHRlcm4gZnJhZ21lbnRzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgbG9hZHY0ZjMyICAgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2NGYzMiAobG9hZCBub2RlOiRwdHIpKT47CitkZWYgbG9hZHYyZjY0ICAgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2MmY2NCAobG9hZCBub2RlOiRwdHIpKT47CitkZWYgbG9hZHY0aTMyICAgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2NGkzMiAobG9hZCBub2RlOiRwdHIpKT47CitkZWYgbG9hZHYyaTY0ICAgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2Mmk2NCAobG9hZCBub2RlOiRwdHIpKT47CisKKy8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBtb3JlIGFwcHJvcHJpYXRlIHBsYWNlIGFmdGVyIGFsbCBBVlggaXMgZG9uZS4KK2RlZiBsb2FkdjhmMzIgICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHY4ZjMyIChsb2FkIG5vZGU6JHB0cikpPjsKK2RlZiBsb2FkdjRmNjQgICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHY0ZjY0IChsb2FkIG5vZGU6JHB0cikpPjsKK2RlZiBsb2FkdjhpMzIgICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHY4aTMyIChsb2FkIG5vZGU6JHB0cikpPjsKK2RlZiBsb2FkdjRpNjQgICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHY0aTY0IChsb2FkIG5vZGU6JHB0cikpPjsKKworLy8gTGlrZSAnc3RvcmUnLCBidXQgYWx3YXlzIHJlcXVpcmVzIHZlY3RvciBhbGlnbm1lbnQuCitkZWYgYWxpZ25lZHN0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0QWxpZ25tZW50KCkgPj0gMTY7Cit9XT47CisKKy8vIExpa2UgJ2xvYWQnLCBidXQgYWx3YXlzIHJlcXVpcmVzIHZlY3RvciBhbGlnbm1lbnQuCitkZWYgYWxpZ25lZGxvYWQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGxvYWQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEFsaWdubWVudCgpID49IDE2OworfV0+OworCitkZWYgYWxpZ25lZGxvYWRmc2YzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmMzIgKGFsaWduZWRsb2FkIG5vZGU6JHB0cikpPjsKK2RlZiBhbGlnbmVkbG9hZGZzZjY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGY2NCAoYWxpZ25lZGxvYWQgbm9kZTokcHRyKSk+OworZGVmIGFsaWduZWRsb2FkdjRmMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRmMzIgKGFsaWduZWRsb2FkIG5vZGU6JHB0cikpPjsKK2RlZiBhbGlnbmVkbG9hZHYyZjY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyZjY0IChhbGlnbmVkbG9hZCBub2RlOiRwdHIpKT47CitkZWYgYWxpZ25lZGxvYWR2NGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoYWxpZ25lZGxvYWQgbm9kZTokcHRyKSk+OworZGVmIGFsaWduZWRsb2FkdjJpNjQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJpNjQgKGFsaWduZWRsb2FkIG5vZGU6JHB0cikpPjsKKworLy8gRklYTUU6IG1vdmUgdGhpcyB0byBhIG1vcmUgYXBwcm9wcmlhdGUgcGxhY2UgYWZ0ZXIgYWxsIEFWWCBpcyBkb25lLgorZGVmIGFsaWduZWRsb2FkdjhmMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhmMzIgKGFsaWduZWRsb2FkIG5vZGU6JHB0cikpPjsKK2RlZiBhbGlnbmVkbG9hZHY0ZjY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjY0IChhbGlnbmVkbG9hZCBub2RlOiRwdHIpKT47CitkZWYgYWxpZ25lZGxvYWR2OGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkzMiAoYWxpZ25lZGxvYWQgbm9kZTokcHRyKSk+OworZGVmIGFsaWduZWRsb2FkdjRpNjQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjRpNjQgKGFsaWduZWRsb2FkIG5vZGU6JHB0cikpPjsKKworLy8gTGlrZSAnbG9hZCcsIGJ1dCB1c2VzIHNwZWNpYWwgYWxpZ25tZW50IGNoZWNrcyBzdWl0YWJsZSBmb3IgdXNlIGluCisvLyBtZW1vcnkgb3BlcmFuZHMgaW4gbW9zdCBTU0UgaW5zdHJ1Y3Rpb25zLCB3aGljaCBhcmUgcmVxdWlyZWQgdG8KKy8vIGJlIG5hdHVyYWxseSBhbGlnbmVkIG9uIHNvbWUgdGFyZ2V0cyBidXQgbm90IG9uIG90aGVycy4gIElmIHRoZSBzdWJ0YXJnZXQKKy8vIGFsbG93cyB1bmFsaWduZWQgYWNjZXNzZXMsIG1hdGNoIGFueSBsb2FkLCB0aG91Z2ggdGhpcyBtYXkgcmVxdWlyZQorLy8gc2V0dGluZyBhIGZlYXR1cmUgYml0IGluIHRoZSBwcm9jZXNzb3IgKG9uIHN0YXJ0dXAsIGZvciBleGFtcGxlKS4KKy8vIE9wdGVyb24gMTBoIGFuZCBsYXRlciBpbXBsZW1lbnQgc3VjaCBhIGZlYXR1cmUuCitkZWYgbWVtb3AgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGxvYWQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuICAgIFN1YnRhcmdldC0+aGFzVmVjdG9yVUFNZW0oKQorICAgICAgICAgfHwgY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0QWxpZ25tZW50KCkgPj0gMTY7Cit9XT47CisKK2RlZiBtZW1vcGZzZjMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChmMzIgICAobWVtb3Agbm9kZTokcHRyKSk+OworZGVmIG1lbW9wZnNmNjQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGY2NCAgIChtZW1vcCBub2RlOiRwdHIpKT47CitkZWYgbWVtb3B2NGYzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodjRmMzIgKG1lbW9wIG5vZGU6JHB0cikpPjsKK2RlZiBtZW1vcHYyZjY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2MmY2NCAobWVtb3Agbm9kZTokcHRyKSk+OworZGVmIG1lbW9wdjRpMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHY0aTMyIChtZW1vcCBub2RlOiRwdHIpKT47CitkZWYgbWVtb3B2Mmk2NCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodjJpNjQgKG1lbW9wIG5vZGU6JHB0cikpPjsKK2RlZiBtZW1vcHYxNmk4IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2MTZpOCAobWVtb3Agbm9kZTokcHRyKSk+OworCisvLyBGSVhNRTogbW92ZSB0aGlzIHRvIGEgbW9yZSBhcHByb3ByaWF0ZSBwbGFjZSBhZnRlciBhbGwgQVZYIGlzIGRvbmUuCitkZWYgbWVtb3B2MzJpOCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodjMyaTggKG1lbW9wIG5vZGU6JHB0cikpPjsKK2RlZiBtZW1vcHY4ZjMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2OGYzMiAobWVtb3Agbm9kZTokcHRyKSk+OworZGVmIG1lbW9wdjRmNjQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHY0ZjY0IChtZW1vcCBub2RlOiRwdHIpKT47CitkZWYgbWVtb3B2NGk2NCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodjRpNjQgKG1lbW9wIG5vZGU6JHB0cikpPjsKK2RlZiBtZW1vcHY4aTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2OGkzMiAobWVtb3Agbm9kZTokcHRyKSk+OworCisvLyBTU1NFMyB1c2VzIE1NWCByZWdpc3RlcnMgZm9yIHNvbWUgaW5zdHJ1Y3Rpb25zLiBUaGV5IGFyZW4ndCBhbGlnbmVkIG9uIGEKKy8vIDE2LWJ5dGUgYm91bmRhcnkuCisvLyBGSVhNRTogOCBieXRlIGFsaWdubWVudCBmb3IgbW14IHJlYWRzIGlzIG5vdCByZXF1aXJlZAorZGVmIG1lbW9wNjQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGxvYWQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEFsaWdubWVudCgpID49IDg7Cit9XT47CisKK2RlZiBtZW1vcHY4aTggIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2OGk4ICAobWVtb3A2NCBub2RlOiRwdHIpKT47CitkZWYgbWVtb3B2NGkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodjRpMTYgKG1lbW9wNjQgbm9kZTokcHRyKSk+OworZGVmIG1lbW9wdjhpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHY4aTE2IChtZW1vcDY0IG5vZGU6JHB0cikpPjsKK2RlZiBtZW1vcHYyaTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh2MmkzMiAobWVtb3A2NCBub2RlOiRwdHIpKT47CisKKy8vIE1PVk5UIFN1cHBvcnQKKy8vIExpa2UgJ3N0b3JlJywgYnV0IHJlcXVpcmVzIHRoZSBub24tdGVtcG9yYWwgYml0IHRvIGJlIHNldAorZGVmIG5vbnRlbXBvcmFsc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0IG5vZGU6JHZhbCwgbm9kZTokcHRyKSwgW3sKKyAgaWYgKFN0b3JlU0ROb2RlICpTVCA9IGR5bl9jYXN0PFN0b3JlU0ROb2RlPihOKSkKKyAgICByZXR1cm4gU1QtPmlzTm9uVGVtcG9yYWwoKTsKKyAgcmV0dXJuIGZhbHNlOworfV0+OworCitkZWYgYWxpZ25lZG5vbnRlbXBvcmFsc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorCQkJICAgICAgICAgICAoc3Qgbm9kZTokdmFsLCBub2RlOiRwdHIpLCBbeworICBpZiAoU3RvcmVTRE5vZGUgKlNUID0gZHluX2Nhc3Q8U3RvcmVTRE5vZGU+KE4pKQorICAgIHJldHVybiBTVC0+aXNOb25UZW1wb3JhbCgpICYmICFTVC0+aXNUcnVuY2F0aW5nU3RvcmUoKSAmJgorICAgICAgICAgICBTVC0+Z2V0QWRkcmVzc2luZ01vZGUoKSA9PSBJU0Q6OlVOSU5ERVhFRCAmJgorICAgICAgICAgICBTVC0+Z2V0QWxpZ25tZW50KCkgPj0gMTY7CisgIHJldHVybiBmYWxzZTsKK31dPjsKKworZGVmIHVuYWxpZ25lZG5vbnRlbXBvcmFsc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorCQkJICAgICAgICAgICAoc3Qgbm9kZTokdmFsLCBub2RlOiRwdHIpLCBbeworICBpZiAoU3RvcmVTRE5vZGUgKlNUID0gZHluX2Nhc3Q8U3RvcmVTRE5vZGU+KE4pKQorICAgIHJldHVybiBTVC0+aXNOb25UZW1wb3JhbCgpICYmCisgICAgICAgICAgIFNULT5nZXRBbGlnbm1lbnQoKSA8IDE2OworICByZXR1cm4gZmFsc2U7Cit9XT47CisKK2RlZiBiY192NGYzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksICh2NGYzMiAoYml0Y29udmVydCBub2RlOiRpbikpPjsKK2RlZiBiY192MmY2NCA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksICh2MmY2NCAoYml0Y29udmVydCBub2RlOiRpbikpPjsKK2RlZiBiY192MTZpOCA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksICh2MTZpOCAoYml0Y29udmVydCBub2RlOiRpbikpPjsKK2RlZiBiY192OGkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksICh2OGkxNiAoYml0Y29udmVydCBub2RlOiRpbikpPjsKK2RlZiBiY192NGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksICh2NGkzMiAoYml0Y29udmVydCBub2RlOiRpbikpPjsKK2RlZiBiY192Mmk2NCA6IFBhdEZyYWc8KG9wcyBub2RlOiRpbiksICh2Mmk2NCAoYml0Y29udmVydCBub2RlOiRpbikpPjsKKworLy8gRklYTUU6IG1vdmUgdGhpcyB0byBhIG1vcmUgYXBwcm9wcmlhdGUgcGxhY2UgYWZ0ZXIgYWxsIEFWWCBpcyBkb25lLgorZGVmIGJjX3Y4aTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JGluKSwgKHY4aTMyIChiaXRjb252ZXJ0IG5vZGU6JGluKSk+OworCitkZWYgdnptb3ZsX3YyaTY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0Y29udmVydCAodjJpNjQgKFg4NnZ6bW92bAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJpNjQgKHNjYWxhcl90b192ZWN0b3IgKGxvYWRpNjQgbm9kZTokc3JjKSkpKSkpPjsKK2RlZiB2em1vdmxfdjRpMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXRjb252ZXJ0ICh2NGkzMiAoWDg2dnptb3ZsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGkzMiBub2RlOiRzcmMpKSkpKSk+OworCitkZWYgdnpsb2FkX3YyaTY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0Y29udmVydCAodjJpNjQgKFg4NnZ6bG9hZCBub2RlOiRzcmMpKSk+OworCisKK2RlZiBmcDMyaW1tMCA6IFBhdExlYWY8KGYzMiBmcGltbSksIFt7CisgIHJldHVybiBOLT5pc0V4YWN0bHlWYWx1ZSgrMC4wKTsKK31dPjsKKworLy8gQllURV9pbW0gLSBUcmFuc2Zvcm0gYml0IGltbWVkaWF0ZXMgaW50byBieXRlIGltbWVkaWF0ZXMuCitkZWYgQllURV9pbW0gIDogU0ROb2RlWEZvcm08aW1tLCBbeworICAvLyBUcmFuc2Zvcm1hdGlvbiBmdW5jdGlvbjogaW1tID4+IDMKKyAgcmV0dXJuIGdldEkzMkltbShOLT5nZXRaRXh0VmFsdWUoKSA+PiAzKTsKK31dPjsKKworLy8gU0hVRkZMRV9nZXRfc2h1Zl9pbW0geGZvcm0gZnVuY3Rpb246IGNvbnZlcnQgdmVjdG9yX3NodWZmbGUgbWFzayB0byBQU0hVRiosCisvLyBTSFVGUCogZXRjLiBpbW0uCitkZWYgU0hVRkZMRV9nZXRfc2h1Zl9pbW0gOiBTRE5vZGVYRm9ybTx2ZWN0b3Jfc2h1ZmZsZSwgW3sKKyAgcmV0dXJuIGdldEk4SW1tKFg4Njo6Z2V0U2h1ZmZsZVNIVUZJbW1lZGlhdGUoTikpOworfV0+OworCisvLyBTSFVGRkxFX2dldF9wc2h1Zmh3X2ltbSB4Zm9ybSBmdW5jdGlvbjogY29udmVydCB2ZWN0b3Jfc2h1ZmZsZSBtYXNrIHRvCisvLyBQU0hVRkhXIGltbS4KK2RlZiBTSFVGRkxFX2dldF9wc2h1Zmh3X2ltbSA6IFNETm9kZVhGb3JtPHZlY3Rvcl9zaHVmZmxlLCBbeworICByZXR1cm4gZ2V0SThJbW0oWDg2OjpnZXRTaHVmZmxlUFNIVUZIV0ltbWVkaWF0ZShOKSk7Cit9XT47CisKKy8vIFNIVUZGTEVfZ2V0X3BzaHVmbHdfaW1tIHhmb3JtIGZ1bmN0aW9uOiBjb252ZXJ0IHZlY3Rvcl9zaHVmZmxlIG1hc2sgdG8KKy8vIFBTSFVGTFcgaW1tLgorZGVmIFNIVUZGTEVfZ2V0X3BzaHVmbHdfaW1tIDogU0ROb2RlWEZvcm08dmVjdG9yX3NodWZmbGUsIFt7CisgIHJldHVybiBnZXRJOEltbShYODY6OmdldFNodWZmbGVQU0hVRkxXSW1tZWRpYXRlKE4pKTsKK31dPjsKKworLy8gU0hVRkZMRV9nZXRfcGFsaWduX2ltbSB4Zm9ybSBmdW5jdGlvbjogY29udmVydCB2ZWN0b3Jfc2h1ZmZsZSBtYXNrIHRvCisvLyBhIFBBTElHTlIgaW1tLgorZGVmIFNIVUZGTEVfZ2V0X3BhbGlnbl9pbW0gOiBTRE5vZGVYRm9ybTx2ZWN0b3Jfc2h1ZmZsZSwgW3sKKyAgcmV0dXJuIGdldEk4SW1tKFg4Njo6Z2V0U2h1ZmZsZVBBTElHTlJJbW1lZGlhdGUoTikpOworfV0+OworCitkZWYgc3BsYXRfbG8gOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbeworICBTaHVmZmxlVmVjdG9yU0ROb2RlICpTVk9wID0gY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKTsKKyAgcmV0dXJuIFNWT3AtPmlzU3BsYXQoKSAmJiBTVk9wLT5nZXRTcGxhdEluZGV4KCkgPT0gMDsKK31dPjsKKworZGVmIG1vdmRkdXAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzTU9WRERVUE1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSk7Cit9XT47CisKK2RlZiBtb3ZobHBzIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbeworICByZXR1cm4gWDg2Ojppc01PVkhMUFNNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTikpOworfV0+OworCitkZWYgbW92aGxwc191bmRlZiA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlIG5vZGU6JGxocywgbm9kZTokcmhzKSwgW3sKKyAgcmV0dXJuIFg4Njo6aXNNT1ZITFBTX3ZfdW5kZWZfTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pKTsKK31dPjsKKworZGVmIG1vdmxocHMgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzTU9WTEhQU01hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSk7Cit9XT47CisKK2RlZiBtb3ZscCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzTU9WTFBNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTikpOworfV0+OworCitkZWYgbW92bCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlIG5vZGU6JGxocywgbm9kZTokcmhzKSwgW3sKKyAgcmV0dXJuIFg4Njo6aXNNT1ZMTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pKTsKK31dPjsKKworZGVmIG1vdnNoZHVwIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlIG5vZGU6JGxocywgbm9kZTokcmhzKSwgW3sKKyAgcmV0dXJuIFg4Njo6aXNNT1ZTSERVUE1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSk7Cit9XT47CisKK2RlZiBtb3ZzbGR1cCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzTU9WU0xEVVBNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTikpOworfV0+OworCitkZWYgdW5wY2tsIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzVU5QQ0tMTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pKTsKK31dPjsKKworZGVmIHVucGNraCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbeworICByZXR1cm4gWDg2Ojppc1VOUENLSE1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSk7Cit9XT47CisKK2RlZiB1bnBja2xfdW5kZWYgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3Rvcl9zaHVmZmxlIG5vZGU6JGxocywgbm9kZTokcmhzKSwgW3sKKyAgcmV0dXJuIFg4Njo6aXNVTlBDS0xfdl91bmRlZl9NYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTikpOworfV0+OworCitkZWYgdW5wY2toX3VuZGVmIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzVU5QQ0tIX3ZfdW5kZWZfTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pKTsKK31dPjsKKworZGVmIHBzaHVmZCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbeworICByZXR1cm4gWDg2Ojppc1BTSFVGRE1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSk7Cit9XSwgU0hVRkZMRV9nZXRfc2h1Zl9pbW0+OworCitkZWYgc2h1ZnAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbeworICByZXR1cm4gWDg2Ojppc1NIVUZQTWFzayhjYXN0PFNodWZmbGVWZWN0b3JTRE5vZGU+KE4pKTsKK31dLCBTSFVGRkxFX2dldF9zaHVmX2ltbT47CisKK2RlZiBwc2h1Zmh3IDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yX3NodWZmbGUgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbeworICByZXR1cm4gWDg2Ojppc1BTSFVGSFdNYXNrKGNhc3Q8U2h1ZmZsZVZlY3RvclNETm9kZT4oTikpOworfV0sIFNIVUZGTEVfZ2V0X3BzaHVmaHdfaW1tPjsKKworZGVmIHBzaHVmbHcgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzUFNIVUZMV01hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSk7Cit9XSwgU0hVRkZMRV9nZXRfcHNodWZsd19pbW0+OworCitkZWYgcGFsaWduIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Jfc2h1ZmZsZSBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7CisgIHJldHVybiBYODY6OmlzUEFMSUdOUk1hc2soY2FzdDxTaHVmZmxlVmVjdG9yU0ROb2RlPihOKSk7Cit9XSwgU0hVRkZMRV9nZXRfcGFsaWduX2ltbT47CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0ckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWUwYzBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJJbmZvLmNwcApAQCAtMCwwICsxLDMwODggQEAKKy8vPT09LSBYODZJbnN0ckluZm8uY3BwIC0gWDg2IEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBYODYgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiWDg2SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiWDg2LmgiCisjaW5jbHVkZSAiWDg2R2VuSW5zdHJJbmZvLmluYyIKKyNpbmNsdWRlICJYODZJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJYODZNYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAiWDg2U3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiWDg2VGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVWYXJpYWJsZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgY2w6Om9wdDxib29sPgorTm9GdXNpbmcoImRpc2FibGUtc3BpbGwtZnVzaW5nIiwKKyAgICAgICAgIGNsOjpkZXNjKCJEaXNhYmxlIGZ1c2luZyBvZiBzcGlsbCBjb2RlIGludG8gaW5zdHJ1Y3Rpb25zIikpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK1ByaW50RmFpbGVkRnVzaW5nKCJwcmludC1mYWlsZWQtZnVzZS1jYW5kaWRhdGVzIiwKKyAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJQcmludCBpbnN0cnVjdGlvbnMgdGhhdCB0aGUgYWxsb2NhdG9yIHdhbnRzIHRvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmdXNlLCBidXQgdGhlIFg4NiBiYWNrZW5kIGN1cnJlbnRseSBjYW4ndCIpLAorICAgICAgICAgICAgICAgICAgY2w6OkhpZGRlbik7CitzdGF0aWMgY2w6Om9wdDxib29sPgorUmVNYXRQSUNTdHViTG9hZCgicmVtYXQtcGljLXN0dWItbG9hZCIsCisgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJSZS1tYXRlcmlhbGl6ZSBsb2FkIGZyb20gc3R1YiBpbiBQSUMgbW9kZSIpLAorICAgICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSksIGNsOjpIaWRkZW4pOworCitYODZJbnN0ckluZm86Olg4Nkluc3RySW5mbyhYODZUYXJnZXRNYWNoaW5lICZ0bSkKKyAgOiBUYXJnZXRJbnN0ckluZm9JbXBsKFg4Nkluc3RzLCBhcnJheV9sZW5ndGhvZihYODZJbnN0cykpLAorICAgIFRNKHRtKSwgUkkodG0sICp0aGlzKSB7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLDE2PiBBbWJFbnRyaWVzOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgT3BUYmwyQWRkcltdWzJdID0geworICAgIHsgWDg2OjpBREMzMnJpLCAgICAgWDg2OjpBREMzMm1pIH0sCisgICAgeyBYODY6OkFEQzMycmk4LCAgICBYODY6OkFEQzMybWk4IH0sCisgICAgeyBYODY6OkFEQzMycnIsICAgICBYODY6OkFEQzMybXIgfSwKKyAgICB7IFg4Njo6QURDNjRyaTMyLCAgIFg4Njo6QURDNjRtaTMyIH0sCisgICAgeyBYODY6OkFEQzY0cmk4LCAgICBYODY6OkFEQzY0bWk4IH0sCisgICAgeyBYODY6OkFEQzY0cnIsICAgICBYODY6OkFEQzY0bXIgfSwKKyAgICB7IFg4Njo6QUREMTZyaSwgICAgIFg4Njo6QUREMTZtaSB9LAorICAgIHsgWDg2OjpBREQxNnJpOCwgICAgWDg2OjpBREQxNm1pOCB9LAorICAgIHsgWDg2OjpBREQxNnJyLCAgICAgWDg2OjpBREQxNm1yIH0sCisgICAgeyBYODY6OkFERDMycmksICAgICBYODY6OkFERDMybWkgfSwKKyAgICB7IFg4Njo6QUREMzJyaTgsICAgIFg4Njo6QUREMzJtaTggfSwKKyAgICB7IFg4Njo6QUREMzJyciwgICAgIFg4Njo6QUREMzJtciB9LAorICAgIHsgWDg2OjpBREQ2NHJpMzIsICAgWDg2OjpBREQ2NG1pMzIgfSwKKyAgICB7IFg4Njo6QURENjRyaTgsICAgIFg4Njo6QURENjRtaTggfSwKKyAgICB7IFg4Njo6QURENjRyciwgICAgIFg4Njo6QURENjRtciB9LAorICAgIHsgWDg2OjpBREQ4cmksICAgICAgWDg2OjpBREQ4bWkgfSwKKyAgICB7IFg4Njo6QUREOHJyLCAgICAgIFg4Njo6QUREOG1yIH0sCisgICAgeyBYODY6OkFORDE2cmksICAgICBYODY6OkFORDE2bWkgfSwKKyAgICB7IFg4Njo6QU5EMTZyaTgsICAgIFg4Njo6QU5EMTZtaTggfSwKKyAgICB7IFg4Njo6QU5EMTZyciwgICAgIFg4Njo6QU5EMTZtciB9LAorICAgIHsgWDg2OjpBTkQzMnJpLCAgICAgWDg2OjpBTkQzMm1pIH0sCisgICAgeyBYODY6OkFORDMycmk4LCAgICBYODY6OkFORDMybWk4IH0sCisgICAgeyBYODY6OkFORDMycnIsICAgICBYODY6OkFORDMybXIgfSwKKyAgICB7IFg4Njo6QU5ENjRyaTMyLCAgIFg4Njo6QU5ENjRtaTMyIH0sCisgICAgeyBYODY6OkFORDY0cmk4LCAgICBYODY6OkFORDY0bWk4IH0sCisgICAgeyBYODY6OkFORDY0cnIsICAgICBYODY6OkFORDY0bXIgfSwKKyAgICB7IFg4Njo6QU5EOHJpLCAgICAgIFg4Njo6QU5EOG1pIH0sCisgICAgeyBYODY6OkFORDhyciwgICAgICBYODY6OkFORDhtciB9LAorICAgIHsgWDg2OjpERUMxNnIsICAgICAgWDg2OjpERUMxNm0gfSwKKyAgICB7IFg4Njo6REVDMzJyLCAgICAgIFg4Njo6REVDMzJtIH0sCisgICAgeyBYODY6OkRFQzY0XzE2ciwgICBYODY6OkRFQzY0XzE2bSB9LAorICAgIHsgWDg2OjpERUM2NF8zMnIsICAgWDg2OjpERUM2NF8zMm0gfSwKKyAgICB7IFg4Njo6REVDNjRyLCAgICAgIFg4Njo6REVDNjRtIH0sCisgICAgeyBYODY6OkRFQzhyLCAgICAgICBYODY6OkRFQzhtIH0sCisgICAgeyBYODY6OklOQzE2ciwgICAgICBYODY6OklOQzE2bSB9LAorICAgIHsgWDg2OjpJTkMzMnIsICAgICAgWDg2OjpJTkMzMm0gfSwKKyAgICB7IFg4Njo6SU5DNjRfMTZyLCAgIFg4Njo6SU5DNjRfMTZtIH0sCisgICAgeyBYODY6OklOQzY0XzMyciwgICBYODY6OklOQzY0XzMybSB9LAorICAgIHsgWDg2OjpJTkM2NHIsICAgICAgWDg2OjpJTkM2NG0gfSwKKyAgICB7IFg4Njo6SU5DOHIsICAgICAgIFg4Njo6SU5DOG0gfSwKKyAgICB7IFg4Njo6TkVHMTZyLCAgICAgIFg4Njo6TkVHMTZtIH0sCisgICAgeyBYODY6Ok5FRzMyciwgICAgICBYODY6Ok5FRzMybSB9LAorICAgIHsgWDg2OjpORUc2NHIsICAgICAgWDg2OjpORUc2NG0gfSwKKyAgICB7IFg4Njo6TkVHOHIsICAgICAgIFg4Njo6TkVHOG0gfSwKKyAgICB7IFg4Njo6Tk9UMTZyLCAgICAgIFg4Njo6Tk9UMTZtIH0sCisgICAgeyBYODY6Ok5PVDMyciwgICAgICBYODY6Ok5PVDMybSB9LAorICAgIHsgWDg2OjpOT1Q2NHIsICAgICAgWDg2OjpOT1Q2NG0gfSwKKyAgICB7IFg4Njo6Tk9UOHIsICAgICAgIFg4Njo6Tk9UOG0gfSwKKyAgICB7IFg4Njo6T1IxNnJpLCAgICAgIFg4Njo6T1IxNm1pIH0sCisgICAgeyBYODY6Ok9SMTZyaTgsICAgICBYODY6Ok9SMTZtaTggfSwKKyAgICB7IFg4Njo6T1IxNnJyLCAgICAgIFg4Njo6T1IxNm1yIH0sCisgICAgeyBYODY6Ok9SMzJyaSwgICAgICBYODY6Ok9SMzJtaSB9LAorICAgIHsgWDg2OjpPUjMycmk4LCAgICAgWDg2OjpPUjMybWk4IH0sCisgICAgeyBYODY6Ok9SMzJyciwgICAgICBYODY6Ok9SMzJtciB9LAorICAgIHsgWDg2OjpPUjY0cmkzMiwgICAgWDg2OjpPUjY0bWkzMiB9LAorICAgIHsgWDg2OjpPUjY0cmk4LCAgICAgWDg2OjpPUjY0bWk4IH0sCisgICAgeyBYODY6Ok9SNjRyciwgICAgICBYODY6Ok9SNjRtciB9LAorICAgIHsgWDg2OjpPUjhyaSwgICAgICAgWDg2OjpPUjhtaSB9LAorICAgIHsgWDg2OjpPUjhyciwgICAgICAgWDg2OjpPUjhtciB9LAorICAgIHsgWDg2OjpST0wxNnIxLCAgICAgWDg2OjpST0wxNm0xIH0sCisgICAgeyBYODY6OlJPTDE2ckNMLCAgICBYODY6OlJPTDE2bUNMIH0sCisgICAgeyBYODY6OlJPTDE2cmksICAgICBYODY6OlJPTDE2bWkgfSwKKyAgICB7IFg4Njo6Uk9MMzJyMSwgICAgIFg4Njo6Uk9MMzJtMSB9LAorICAgIHsgWDg2OjpST0wzMnJDTCwgICAgWDg2OjpST0wzMm1DTCB9LAorICAgIHsgWDg2OjpST0wzMnJpLCAgICAgWDg2OjpST0wzMm1pIH0sCisgICAgeyBYODY6OlJPTDY0cjEsICAgICBYODY6OlJPTDY0bTEgfSwKKyAgICB7IFg4Njo6Uk9MNjRyQ0wsICAgIFg4Njo6Uk9MNjRtQ0wgfSwKKyAgICB7IFg4Njo6Uk9MNjRyaSwgICAgIFg4Njo6Uk9MNjRtaSB9LAorICAgIHsgWDg2OjpST0w4cjEsICAgICAgWDg2OjpST0w4bTEgfSwKKyAgICB7IFg4Njo6Uk9MOHJDTCwgICAgIFg4Njo6Uk9MOG1DTCB9LAorICAgIHsgWDg2OjpST0w4cmksICAgICAgWDg2OjpST0w4bWkgfSwKKyAgICB7IFg4Njo6Uk9SMTZyMSwgICAgIFg4Njo6Uk9SMTZtMSB9LAorICAgIHsgWDg2OjpST1IxNnJDTCwgICAgWDg2OjpST1IxNm1DTCB9LAorICAgIHsgWDg2OjpST1IxNnJpLCAgICAgWDg2OjpST1IxNm1pIH0sCisgICAgeyBYODY6OlJPUjMycjEsICAgICBYODY6OlJPUjMybTEgfSwKKyAgICB7IFg4Njo6Uk9SMzJyQ0wsICAgIFg4Njo6Uk9SMzJtQ0wgfSwKKyAgICB7IFg4Njo6Uk9SMzJyaSwgICAgIFg4Njo6Uk9SMzJtaSB9LAorICAgIHsgWDg2OjpST1I2NHIxLCAgICAgWDg2OjpST1I2NG0xIH0sCisgICAgeyBYODY6OlJPUjY0ckNMLCAgICBYODY6OlJPUjY0bUNMIH0sCisgICAgeyBYODY6OlJPUjY0cmksICAgICBYODY6OlJPUjY0bWkgfSwKKyAgICB7IFg4Njo6Uk9SOHIxLCAgICAgIFg4Njo6Uk9SOG0xIH0sCisgICAgeyBYODY6OlJPUjhyQ0wsICAgICBYODY6OlJPUjhtQ0wgfSwKKyAgICB7IFg4Njo6Uk9SOHJpLCAgICAgIFg4Njo6Uk9SOG1pIH0sCisgICAgeyBYODY6OlNBUjE2cjEsICAgICBYODY6OlNBUjE2bTEgfSwKKyAgICB7IFg4Njo6U0FSMTZyQ0wsICAgIFg4Njo6U0FSMTZtQ0wgfSwKKyAgICB7IFg4Njo6U0FSMTZyaSwgICAgIFg4Njo6U0FSMTZtaSB9LAorICAgIHsgWDg2OjpTQVIzMnIxLCAgICAgWDg2OjpTQVIzMm0xIH0sCisgICAgeyBYODY6OlNBUjMyckNMLCAgICBYODY6OlNBUjMybUNMIH0sCisgICAgeyBYODY6OlNBUjMycmksICAgICBYODY6OlNBUjMybWkgfSwKKyAgICB7IFg4Njo6U0FSNjRyMSwgICAgIFg4Njo6U0FSNjRtMSB9LAorICAgIHsgWDg2OjpTQVI2NHJDTCwgICAgWDg2OjpTQVI2NG1DTCB9LAorICAgIHsgWDg2OjpTQVI2NHJpLCAgICAgWDg2OjpTQVI2NG1pIH0sCisgICAgeyBYODY6OlNBUjhyMSwgICAgICBYODY6OlNBUjhtMSB9LAorICAgIHsgWDg2OjpTQVI4ckNMLCAgICAgWDg2OjpTQVI4bUNMIH0sCisgICAgeyBYODY6OlNBUjhyaSwgICAgICBYODY6OlNBUjhtaSB9LAorICAgIHsgWDg2OjpTQkIzMnJpLCAgICAgWDg2OjpTQkIzMm1pIH0sCisgICAgeyBYODY6OlNCQjMycmk4LCAgICBYODY6OlNCQjMybWk4IH0sCisgICAgeyBYODY6OlNCQjMycnIsICAgICBYODY6OlNCQjMybXIgfSwKKyAgICB7IFg4Njo6U0JCNjRyaTMyLCAgIFg4Njo6U0JCNjRtaTMyIH0sCisgICAgeyBYODY6OlNCQjY0cmk4LCAgICBYODY6OlNCQjY0bWk4IH0sCisgICAgeyBYODY6OlNCQjY0cnIsICAgICBYODY6OlNCQjY0bXIgfSwKKyAgICB7IFg4Njo6U0hMMTZyQ0wsICAgIFg4Njo6U0hMMTZtQ0wgfSwKKyAgICB7IFg4Njo6U0hMMTZyaSwgICAgIFg4Njo6U0hMMTZtaSB9LAorICAgIHsgWDg2OjpTSEwzMnJDTCwgICAgWDg2OjpTSEwzMm1DTCB9LAorICAgIHsgWDg2OjpTSEwzMnJpLCAgICAgWDg2OjpTSEwzMm1pIH0sCisgICAgeyBYODY6OlNITDY0ckNMLCAgICBYODY6OlNITDY0bUNMIH0sCisgICAgeyBYODY6OlNITDY0cmksICAgICBYODY6OlNITDY0bWkgfSwKKyAgICB7IFg4Njo6U0hMOHJDTCwgICAgIFg4Njo6U0hMOG1DTCB9LAorICAgIHsgWDg2OjpTSEw4cmksICAgICAgWDg2OjpTSEw4bWkgfSwKKyAgICB7IFg4Njo6U0hMRDE2cnJDTCwgIFg4Njo6U0hMRDE2bXJDTCB9LAorICAgIHsgWDg2OjpTSExEMTZycmk4LCAgWDg2OjpTSExEMTZtcmk4IH0sCisgICAgeyBYODY6OlNITEQzMnJyQ0wsICBYODY6OlNITEQzMm1yQ0wgfSwKKyAgICB7IFg4Njo6U0hMRDMycnJpOCwgIFg4Njo6U0hMRDMybXJpOCB9LAorICAgIHsgWDg2OjpTSExENjRyckNMLCAgWDg2OjpTSExENjRtckNMIH0sCisgICAgeyBYODY6OlNITEQ2NHJyaTgsICBYODY6OlNITEQ2NG1yaTggfSwKKyAgICB7IFg4Njo6U0hSMTZyMSwgICAgIFg4Njo6U0hSMTZtMSB9LAorICAgIHsgWDg2OjpTSFIxNnJDTCwgICAgWDg2OjpTSFIxNm1DTCB9LAorICAgIHsgWDg2OjpTSFIxNnJpLCAgICAgWDg2OjpTSFIxNm1pIH0sCisgICAgeyBYODY6OlNIUjMycjEsICAgICBYODY6OlNIUjMybTEgfSwKKyAgICB7IFg4Njo6U0hSMzJyQ0wsICAgIFg4Njo6U0hSMzJtQ0wgfSwKKyAgICB7IFg4Njo6U0hSMzJyaSwgICAgIFg4Njo6U0hSMzJtaSB9LAorICAgIHsgWDg2OjpTSFI2NHIxLCAgICAgWDg2OjpTSFI2NG0xIH0sCisgICAgeyBYODY6OlNIUjY0ckNMLCAgICBYODY6OlNIUjY0bUNMIH0sCisgICAgeyBYODY6OlNIUjY0cmksICAgICBYODY6OlNIUjY0bWkgfSwKKyAgICB7IFg4Njo6U0hSOHIxLCAgICAgIFg4Njo6U0hSOG0xIH0sCisgICAgeyBYODY6OlNIUjhyQ0wsICAgICBYODY6OlNIUjhtQ0wgfSwKKyAgICB7IFg4Njo6U0hSOHJpLCAgICAgIFg4Njo6U0hSOG1pIH0sCisgICAgeyBYODY6OlNIUkQxNnJyQ0wsICBYODY6OlNIUkQxNm1yQ0wgfSwKKyAgICB7IFg4Njo6U0hSRDE2cnJpOCwgIFg4Njo6U0hSRDE2bXJpOCB9LAorICAgIHsgWDg2OjpTSFJEMzJyckNMLCAgWDg2OjpTSFJEMzJtckNMIH0sCisgICAgeyBYODY6OlNIUkQzMnJyaTgsICBYODY6OlNIUkQzMm1yaTggfSwKKyAgICB7IFg4Njo6U0hSRDY0cnJDTCwgIFg4Njo6U0hSRDY0bXJDTCB9LAorICAgIHsgWDg2OjpTSFJENjRycmk4LCAgWDg2OjpTSFJENjRtcmk4IH0sCisgICAgeyBYODY6OlNVQjE2cmksICAgICBYODY6OlNVQjE2bWkgfSwKKyAgICB7IFg4Njo6U1VCMTZyaTgsICAgIFg4Njo6U1VCMTZtaTggfSwKKyAgICB7IFg4Njo6U1VCMTZyciwgICAgIFg4Njo6U1VCMTZtciB9LAorICAgIHsgWDg2OjpTVUIzMnJpLCAgICAgWDg2OjpTVUIzMm1pIH0sCisgICAgeyBYODY6OlNVQjMycmk4LCAgICBYODY6OlNVQjMybWk4IH0sCisgICAgeyBYODY6OlNVQjMycnIsICAgICBYODY6OlNVQjMybXIgfSwKKyAgICB7IFg4Njo6U1VCNjRyaTMyLCAgIFg4Njo6U1VCNjRtaTMyIH0sCisgICAgeyBYODY6OlNVQjY0cmk4LCAgICBYODY6OlNVQjY0bWk4IH0sCisgICAgeyBYODY6OlNVQjY0cnIsICAgICBYODY6OlNVQjY0bXIgfSwKKyAgICB7IFg4Njo6U1VCOHJpLCAgICAgIFg4Njo6U1VCOG1pIH0sCisgICAgeyBYODY6OlNVQjhyciwgICAgICBYODY6OlNVQjhtciB9LAorICAgIHsgWDg2OjpYT1IxNnJpLCAgICAgWDg2OjpYT1IxNm1pIH0sCisgICAgeyBYODY6OlhPUjE2cmk4LCAgICBYODY6OlhPUjE2bWk4IH0sCisgICAgeyBYODY6OlhPUjE2cnIsICAgICBYODY6OlhPUjE2bXIgfSwKKyAgICB7IFg4Njo6WE9SMzJyaSwgICAgIFg4Njo6WE9SMzJtaSB9LAorICAgIHsgWDg2OjpYT1IzMnJpOCwgICAgWDg2OjpYT1IzMm1pOCB9LAorICAgIHsgWDg2OjpYT1IzMnJyLCAgICAgWDg2OjpYT1IzMm1yIH0sCisgICAgeyBYODY6OlhPUjY0cmkzMiwgICBYODY6OlhPUjY0bWkzMiB9LAorICAgIHsgWDg2OjpYT1I2NHJpOCwgICAgWDg2OjpYT1I2NG1pOCB9LAorICAgIHsgWDg2OjpYT1I2NHJyLCAgICAgWDg2OjpYT1I2NG1yIH0sCisgICAgeyBYODY6OlhPUjhyaSwgICAgICBYODY6OlhPUjhtaSB9LAorICAgIHsgWDg2OjpYT1I4cnIsICAgICAgWDg2OjpYT1I4bXIgfQorICB9OworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBhcnJheV9sZW5ndGhvZihPcFRibDJBZGRyKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBSZWdPcCA9IE9wVGJsMkFkZHJbaV1bMF07CisgICAgdW5zaWduZWQgTWVtT3AgPSBPcFRibDJBZGRyW2ldWzFdOworICAgIGlmICghUmVnT3AyTWVtT3BUYWJsZTJBZGRyLmluc2VydChzdGQ6Om1ha2VfcGFpcigodW5zaWduZWQqKVJlZ09wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihNZW1PcCwwKSkpLnNlY29uZCkKKyAgICAgIGFzc2VydChmYWxzZSAmJiAiRHVwbGljYXRlZCBlbnRyaWVzPyIpOworICAgIC8vIEluZGV4IDAsIGZvbGRlZCBsb2FkIGFuZCBzdG9yZSwgbm8gYWxpZ25tZW50IHJlcXVpcmVtZW50LgorICAgIHVuc2lnbmVkIEF1eEluZm8gPSAwIHwgKDEgPDwgNCkgfCAoMSA8PCA1KTsKKyAgICBpZiAoIU1lbU9wMlJlZ09wVGFibGUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCh1bnNpZ25lZCopTWVtT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihSZWdPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV4SW5mbykpKS5zZWNvbmQpCisgICAgICBBbWJFbnRyaWVzLnB1c2hfYmFjayhNZW1PcCk7CisgIH0KKworICAvLyBJZiB0aGUgdGhpcmQgdmFsdWUgaXMgMSwgdGhlbiBpdCdzIGZvbGRpbmcgZWl0aGVyIGEgbG9hZCBvciBhIHN0b3JlLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgT3BUYmwwW11bNF0gPSB7CisgICAgeyBYODY6OkJUMTZyaTgsICAgICBYODY6OkJUMTZtaTgsIDEsIDAgfSwKKyAgICB7IFg4Njo6QlQzMnJpOCwgICAgIFg4Njo6QlQzMm1pOCwgMSwgMCB9LAorICAgIHsgWDg2OjpCVDY0cmk4LCAgICAgWDg2OjpCVDY0bWk4LCAxLCAwIH0sCisgICAgeyBYODY6OkNBTEwzMnIsICAgICBYODY6OkNBTEwzMm0sIDEsIDAgfSwKKyAgICB7IFg4Njo6Q0FMTDY0ciwgICAgIFg4Njo6Q0FMTDY0bSwgMSwgMCB9LAorICAgIHsgWDg2OjpDTVAxNnJpLCAgICAgWDg2OjpDTVAxNm1pLCAxLCAwIH0sCisgICAgeyBYODY6OkNNUDE2cmk4LCAgICBYODY6OkNNUDE2bWk4LCAxLCAwIH0sCisgICAgeyBYODY6OkNNUDE2cnIsICAgICBYODY6OkNNUDE2bXIsIDEsIDAgfSwKKyAgICB7IFg4Njo6Q01QMzJyaSwgICAgIFg4Njo6Q01QMzJtaSwgMSwgMCB9LAorICAgIHsgWDg2OjpDTVAzMnJpOCwgICAgWDg2OjpDTVAzMm1pOCwgMSwgMCB9LAorICAgIHsgWDg2OjpDTVAzMnJyLCAgICAgWDg2OjpDTVAzMm1yLCAxLCAwIH0sCisgICAgeyBYODY6OkNNUDY0cmkzMiwgICBYODY6OkNNUDY0bWkzMiwgMSwgMCB9LAorICAgIHsgWDg2OjpDTVA2NHJpOCwgICAgWDg2OjpDTVA2NG1pOCwgMSwgMCB9LAorICAgIHsgWDg2OjpDTVA2NHJyLCAgICAgWDg2OjpDTVA2NG1yLCAxLCAwIH0sCisgICAgeyBYODY6OkNNUDhyaSwgICAgICBYODY6OkNNUDhtaSwgMSwgMCB9LAorICAgIHsgWDg2OjpDTVA4cnIsICAgICAgWDg2OjpDTVA4bXIsIDEsIDAgfSwKKyAgICB7IFg4Njo6RElWMTZyLCAgICAgIFg4Njo6RElWMTZtLCAxLCAwIH0sCisgICAgeyBYODY6OkRJVjMyciwgICAgICBYODY6OkRJVjMybSwgMSwgMCB9LAorICAgIHsgWDg2OjpESVY2NHIsICAgICAgWDg2OjpESVY2NG0sIDEsIDAgfSwKKyAgICB7IFg4Njo6RElWOHIsICAgICAgIFg4Njo6RElWOG0sIDEsIDAgfSwKKyAgICB7IFg4Njo6RVhUUkFDVFBTcnIsIFg4Njo6RVhUUkFDVFBTbXIsIDAsIDE2IH0sCisgICAgeyBYODY6OkZzTU9WQVBEcnIsICBYODY6Ok1PVlNEbXIsIDAsIDAgfSwKKyAgICB7IFg4Njo6RnNNT1ZBUFNyciwgIFg4Njo6TU9WU1NtciwgMCwgMCB9LAorICAgIHsgWDg2OjpJRElWMTZyLCAgICAgWDg2OjpJRElWMTZtLCAxLCAwIH0sCisgICAgeyBYODY6OklESVYzMnIsICAgICBYODY6OklESVYzMm0sIDEsIDAgfSwKKyAgICB7IFg4Njo6SURJVjY0ciwgICAgIFg4Njo6SURJVjY0bSwgMSwgMCB9LAorICAgIHsgWDg2OjpJRElWOHIsICAgICAgWDg2OjpJRElWOG0sIDEsIDAgfSwKKyAgICB7IFg4Njo6SU1VTDE2ciwgICAgIFg4Njo6SU1VTDE2bSwgMSwgMCB9LAorICAgIHsgWDg2OjpJTVVMMzJyLCAgICAgWDg2OjpJTVVMMzJtLCAxLCAwIH0sCisgICAgeyBYODY6OklNVUw2NHIsICAgICBYODY6OklNVUw2NG0sIDEsIDAgfSwKKyAgICB7IFg4Njo6SU1VTDhyLCAgICAgIFg4Njo6SU1VTDhtLCAxLCAwIH0sCisgICAgeyBYODY6OkpNUDMyciwgICAgICBYODY6OkpNUDMybSwgMSwgMCB9LAorICAgIHsgWDg2OjpKTVA2NHIsICAgICAgWDg2OjpKTVA2NG0sIDEsIDAgfSwKKyAgICB7IFg4Njo6TU9WMTZyaSwgICAgIFg4Njo6TU9WMTZtaSwgMCwgMCB9LAorICAgIHsgWDg2OjpNT1YxNnJyLCAgICAgWDg2OjpNT1YxNm1yLCAwLCAwIH0sCisgICAgeyBYODY6Ok1PVjMycmksICAgICBYODY6Ok1PVjMybWksIDAsIDAgfSwKKyAgICB7IFg4Njo6TU9WMzJyciwgICAgIFg4Njo6TU9WMzJtciwgMCwgMCB9LAorICAgIHsgWDg2OjpNT1YzMnJyX1RDLCAgWDg2OjpNT1YzMm1yX1RDLCAwLCAwIH0sCisgICAgeyBYODY6Ok1PVjY0cmkzMiwgICBYODY6Ok1PVjY0bWkzMiwgMCwgMCB9LAorICAgIHsgWDg2OjpNT1Y2NHJyLCAgICAgWDg2OjpNT1Y2NG1yLCAwLCAwIH0sCisgICAgeyBYODY6Ok1PVjhyaSwgICAgICBYODY6Ok1PVjhtaSwgMCwgMCB9LAorICAgIHsgWDg2OjpNT1Y4cnIsICAgICAgWDg2OjpNT1Y4bXIsIDAsIDAgfSwKKyAgICB7IFg4Njo6TU9WOHJyX05PUkVYLCBYODY6Ok1PVjhtcl9OT1JFWCwgMCwgMCB9LAorICAgIHsgWDg2OjpNT1ZBUERyciwgICAgWDg2OjpNT1ZBUERtciwgMCwgMTYgfSwKKyAgICB7IFg4Njo6TU9WQVBTcnIsICAgIFg4Njo6TU9WQVBTbXIsIDAsIDE2IH0sCisgICAgeyBYODY6Ok1PVkRRQXJyLCAgICBYODY6Ok1PVkRRQW1yLCAwLCAxNiB9LAorICAgIHsgWDg2OjpNT1ZQREkyRElyciwgWDg2OjpNT1ZQREkyREltciwgMCwgMCB9LAorICAgIHsgWDg2OjpNT1ZQUUl0bzY0cnIsWDg2OjpNT1ZQUUkyUUltciwgMCwgMCB9LAorICAgIHsgWDg2OjpNT1ZTRHRvNjRyciwgWDg2OjpNT1ZTRHRvNjRtciwgMCwgMCB9LAorICAgIHsgWDg2OjpNT1ZTUzJESXJyLCAgWDg2OjpNT1ZTUzJESW1yLCAwLCAwIH0sCisgICAgeyBYODY6Ok1PVlVQRHJyLCAgICBYODY6Ok1PVlVQRG1yLCAwLCAwIH0sCisgICAgeyBYODY6Ok1PVlVQU3JyLCAgICBYODY6Ok1PVlVQU21yLCAwLCAwIH0sCisgICAgeyBYODY6Ok1VTDE2ciwgICAgICBYODY6Ok1VTDE2bSwgMSwgMCB9LAorICAgIHsgWDg2OjpNVUwzMnIsICAgICAgWDg2OjpNVUwzMm0sIDEsIDAgfSwKKyAgICB7IFg4Njo6TVVMNjRyLCAgICAgIFg4Njo6TVVMNjRtLCAxLCAwIH0sCisgICAgeyBYODY6Ok1VTDhyLCAgICAgICBYODY6Ok1VTDhtLCAxLCAwIH0sCisgICAgeyBYODY6OlNFVEFFciwgICAgICBYODY6OlNFVEFFbSwgMCwgMCB9LAorICAgIHsgWDg2OjpTRVRBciwgICAgICAgWDg2OjpTRVRBbSwgMCwgMCB9LAorICAgIHsgWDg2OjpTRVRCRXIsICAgICAgWDg2OjpTRVRCRW0sIDAsIDAgfSwKKyAgICB7IFg4Njo6U0VUQnIsICAgICAgIFg4Njo6U0VUQm0sIDAsIDAgfSwKKyAgICB7IFg4Njo6U0VURXIsICAgICAgIFg4Njo6U0VURW0sIDAsIDAgfSwKKyAgICB7IFg4Njo6U0VUR0VyLCAgICAgIFg4Njo6U0VUR0VtLCAwLCAwIH0sCisgICAgeyBYODY6OlNFVEdyLCAgICAgICBYODY6OlNFVEdtLCAwLCAwIH0sCisgICAgeyBYODY6OlNFVExFciwgICAgICBYODY6OlNFVExFbSwgMCwgMCB9LAorICAgIHsgWDg2OjpTRVRMciwgICAgICAgWDg2OjpTRVRMbSwgMCwgMCB9LAorICAgIHsgWDg2OjpTRVRORXIsICAgICAgWDg2OjpTRVRORW0sIDAsIDAgfSwKKyAgICB7IFg4Njo6U0VUTk9yLCAgICAgIFg4Njo6U0VUTk9tLCAwLCAwIH0sCisgICAgeyBYODY6OlNFVE5QciwgICAgICBYODY6OlNFVE5QbSwgMCwgMCB9LAorICAgIHsgWDg2OjpTRVROU3IsICAgICAgWDg2OjpTRVROU20sIDAsIDAgfSwKKyAgICB7IFg4Njo6U0VUT3IsICAgICAgIFg4Njo6U0VUT20sIDAsIDAgfSwKKyAgICB7IFg4Njo6U0VUUHIsICAgICAgIFg4Njo6U0VUUG0sIDAsIDAgfSwKKyAgICB7IFg4Njo6U0VUU3IsICAgICAgIFg4Njo6U0VUU20sIDAsIDAgfSwKKyAgICB7IFg4Njo6VEFJTEpNUHIsICAgIFg4Njo6VEFJTEpNUG0sIDEsIDAgfSwKKyAgICB7IFg4Njo6VEFJTEpNUHI2NCwgIFg4Njo6VEFJTEpNUG02NCwgMSwgMCB9LAorICAgIHsgWDg2OjpURVNUMTZyaSwgICAgWDg2OjpURVNUMTZtaSwgMSwgMCB9LAorICAgIHsgWDg2OjpURVNUMzJyaSwgICAgWDg2OjpURVNUMzJtaSwgMSwgMCB9LAorICAgIHsgWDg2OjpURVNUNjRyaTMyLCAgWDg2OjpURVNUNjRtaTMyLCAxLCAwIH0sCisgICAgeyBYODY6OlRFU1Q4cmksICAgICBYODY6OlRFU1Q4bWksIDEsIDAgfQorICB9OworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBhcnJheV9sZW5ndGhvZihPcFRibDApOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIFJlZ09wID0gT3BUYmwwW2ldWzBdOworICAgIHVuc2lnbmVkIE1lbU9wID0gT3BUYmwwW2ldWzFdOworICAgIHVuc2lnbmVkIEFsaWduID0gT3BUYmwwW2ldWzNdOworICAgIGlmICghUmVnT3AyTWVtT3BUYWJsZTAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCh1bnNpZ25lZCopUmVnT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoTWVtT3AsQWxpZ24pKSkuc2Vjb25kKQorICAgICAgYXNzZXJ0KGZhbHNlICYmICJEdXBsaWNhdGVkIGVudHJpZXM/Iik7CisgICAgdW5zaWduZWQgRm9sZGVkTG9hZCA9IE9wVGJsMFtpXVsyXTsKKyAgICAvLyBJbmRleCAwLCBmb2xkZWQgbG9hZCBvciBzdG9yZS4KKyAgICB1bnNpZ25lZCBBdXhJbmZvID0gMCB8IChGb2xkZWRMb2FkIDw8IDQpIHwgKChGb2xkZWRMb2FkXjEpIDw8IDUpOworICAgIGlmIChSZWdPcCAhPSBYODY6OkZzTU9WQVBEcnIgJiYgUmVnT3AgIT0gWDg2OjpGc01PVkFQU3JyKQorICAgICAgaWYgKCFNZW1PcDJSZWdPcFRhYmxlLmluc2VydChzdGQ6Om1ha2VfcGFpcigodW5zaWduZWQqKU1lbU9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFJlZ09wLCBBdXhJbmZvKSkpLnNlY29uZCkKKyAgICAgICAgQW1iRW50cmllcy5wdXNoX2JhY2soTWVtT3ApOworICB9CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE9wVGJsMVtdWzNdID0geworICAgIHsgWDg2OjpDTVAxNnJyLCAgICAgICAgIFg4Njo6Q01QMTZybSwgMCB9LAorICAgIHsgWDg2OjpDTVAzMnJyLCAgICAgICAgIFg4Njo6Q01QMzJybSwgMCB9LAorICAgIHsgWDg2OjpDTVA2NHJyLCAgICAgICAgIFg4Njo6Q01QNjRybSwgMCB9LAorICAgIHsgWDg2OjpDTVA4cnIsICAgICAgICAgIFg4Njo6Q01QOHJtLCAwIH0sCisgICAgeyBYODY6OkNWVFNEMlNTcnIsICAgICAgWDg2OjpDVlRTRDJTU3JtLCAwIH0sCisgICAgeyBYODY6OkNWVFNJMlNENjRyciwgICAgWDg2OjpDVlRTSTJTRDY0cm0sIDAgfSwKKyAgICB7IFg4Njo6Q1ZUU0kyU0RyciwgICAgICBYODY6OkNWVFNJMlNEcm0sIDAgfSwKKyAgICB7IFg4Njo6Q1ZUU0kyU1M2NHJyLCAgICBYODY6OkNWVFNJMlNTNjRybSwgMCB9LAorICAgIHsgWDg2OjpDVlRTSTJTU3JyLCAgICAgIFg4Njo6Q1ZUU0kyU1NybSwgMCB9LAorICAgIHsgWDg2OjpDVlRTUzJTRHJyLCAgICAgIFg4Njo6Q1ZUU1MyU0RybSwgMCB9LAorICAgIHsgWDg2OjpDVlRUU0QyU0k2NHJyLCAgIFg4Njo6Q1ZUVFNEMlNJNjRybSwgMCB9LAorICAgIHsgWDg2OjpDVlRUU0QyU0lyciwgICAgIFg4Njo6Q1ZUVFNEMlNJcm0sIDAgfSwKKyAgICB7IFg4Njo6Q1ZUVFNTMlNJNjRyciwgICBYODY6OkNWVFRTUzJTSTY0cm0sIDAgfSwKKyAgICB7IFg4Njo6Q1ZUVFNTMlNJcnIsICAgICBYODY6OkNWVFRTUzJTSXJtLCAwIH0sCisgICAgeyBYODY6OkZzTU9WQVBEcnIsICAgICAgWDg2OjpNT1ZTRHJtLCAwIH0sCisgICAgeyBYODY6OkZzTU9WQVBTcnIsICAgICAgWDg2OjpNT1ZTU3JtLCAwIH0sCisgICAgeyBYODY6OklNVUwxNnJyaSwgICAgICAgWDg2OjpJTVVMMTZybWksIDAgfSwKKyAgICB7IFg4Njo6SU1VTDE2cnJpOCwgICAgICBYODY6OklNVUwxNnJtaTgsIDAgfSwKKyAgICB7IFg4Njo6SU1VTDMycnJpLCAgICAgICBYODY6OklNVUwzMnJtaSwgMCB9LAorICAgIHsgWDg2OjpJTVVMMzJycmk4LCAgICAgIFg4Njo6SU1VTDMycm1pOCwgMCB9LAorICAgIHsgWDg2OjpJTVVMNjRycmkzMiwgICAgIFg4Njo6SU1VTDY0cm1pMzIsIDAgfSwKKyAgICB7IFg4Njo6SU1VTDY0cnJpOCwgICAgICBYODY6OklNVUw2NHJtaTgsIDAgfSwKKyAgICB7IFg4Njo6SW50X0NNUFNEcnIsICAgICBYODY6OkludF9DTVBTRHJtLCAwIH0sCisgICAgeyBYODY6OkludF9DTVBTU3JyLCAgICAgWDg2OjpJbnRfQ01QU1NybSwgMCB9LAorICAgIHsgWDg2OjpJbnRfQ09NSVNEcnIsICAgIFg4Njo6SW50X0NPTUlTRHJtLCAwIH0sCisgICAgeyBYODY6OkludF9DT01JU1NyciwgICAgWDg2OjpJbnRfQ09NSVNTcm0sIDAgfSwKKyAgICB7IFg4Njo6SW50X0NWVERRMlBEcnIsICBYODY6OkludF9DVlREUTJQRHJtLCAxNiB9LAorICAgIHsgWDg2OjpJbnRfQ1ZURFEyUFNyciwgIFg4Njo6SW50X0NWVERRMlBTcm0sIDE2IH0sCisgICAgeyBYODY6OkludF9DVlRQRDJEUXJyLCAgWDg2OjpJbnRfQ1ZUUEQyRFFybSwgMTYgfSwKKyAgICB7IFg4Njo6SW50X0NWVFBEMlBTcnIsICBYODY6OkludF9DVlRQRDJQU3JtLCAxNiB9LAorICAgIHsgWDg2OjpJbnRfQ1ZUUFMyRFFyciwgIFg4Njo6SW50X0NWVFBTMkRRcm0sIDE2IH0sCisgICAgeyBYODY6OkludF9DVlRQUzJQRHJyLCAgWDg2OjpJbnRfQ1ZUUFMyUERybSwgMCB9LAorICAgIHsgWDg2OjpJbnRfQ1ZUU0QyU0k2NHJyLFg4Njo6SW50X0NWVFNEMlNJNjRybSwgMCB9LAorICAgIHsgWDg2OjpJbnRfQ1ZUU0QyU0lyciwgIFg4Njo6SW50X0NWVFNEMlNJcm0sIDAgfSwKKyAgICB7IFg4Njo6SW50X0NWVFNEMlNTcnIsICBYODY6OkludF9DVlRTRDJTU3JtLCAwIH0sCisgICAgeyBYODY6OkludF9DVlRTSTJTRDY0cnIsWDg2OjpJbnRfQ1ZUU0kyU0Q2NHJtLCAwIH0sCisgICAgeyBYODY6OkludF9DVlRTSTJTRHJyLCAgWDg2OjpJbnRfQ1ZUU0kyU0RybSwgMCB9LAorICAgIHsgWDg2OjpJbnRfQ1ZUU0kyU1M2NHJyLFg4Njo6SW50X0NWVFNJMlNTNjRybSwgMCB9LAorICAgIHsgWDg2OjpJbnRfQ1ZUU0kyU1NyciwgIFg4Njo6SW50X0NWVFNJMlNTcm0sIDAgfSwKKyAgICB7IFg4Njo6SW50X0NWVFNTMlNEcnIsICBYODY6OkludF9DVlRTUzJTRHJtLCAwIH0sCisgICAgeyBYODY6OkludF9DVlRTUzJTSTY0cnIsWDg2OjpJbnRfQ1ZUU1MyU0k2NHJtLCAwIH0sCisgICAgeyBYODY6OkludF9DVlRTUzJTSXJyLCAgWDg2OjpJbnRfQ1ZUU1MyU0lybSwgMCB9LAorICAgIHsgWDg2OjpJbnRfQ1ZUVFBEMkRRcnIsIFg4Njo6SW50X0NWVFRQRDJEUXJtLCAxNiB9LAorICAgIHsgWDg2OjpJbnRfQ1ZUVFBTMkRRcnIsIFg4Njo6SW50X0NWVFRQUzJEUXJtLCAxNiB9LAorICAgIHsgWDg2OjpJbnRfQ1ZUVFNEMlNJNjRycixYODY6OkludF9DVlRUU0QyU0k2NHJtLCAwIH0sCisgICAgeyBYODY6OkludF9DVlRUU0QyU0lyciwgWDg2OjpJbnRfQ1ZUVFNEMlNJcm0sIDAgfSwKKyAgICB7IFg4Njo6SW50X0NWVFRTUzJTSTY0cnIsWDg2OjpJbnRfQ1ZUVFNTMlNJNjRybSwgMCB9LAorICAgIHsgWDg2OjpJbnRfQ1ZUVFNTMlNJcnIsIFg4Njo6SW50X0NWVFRTUzJTSXJtLCAwIH0sCisgICAgeyBYODY6OkludF9VQ09NSVNEcnIsICAgWDg2OjpJbnRfVUNPTUlTRHJtLCAwIH0sCisgICAgeyBYODY6OkludF9VQ09NSVNTcnIsICAgWDg2OjpJbnRfVUNPTUlTU3JtLCAwIH0sCisgICAgeyBYODY6Ok1PVjE2cnIsICAgICAgICAgWDg2OjpNT1YxNnJtLCAwIH0sCisgICAgeyBYODY6Ok1PVjMycnIsICAgICAgICAgWDg2OjpNT1YzMnJtLCAwIH0sCisgICAgeyBYODY6Ok1PVjMycnJfVEMsICAgICAgWDg2OjpNT1YzMnJtX1RDLCAwIH0sCisgICAgeyBYODY6Ok1PVjY0cnIsICAgICAgICAgWDg2OjpNT1Y2NHJtLCAwIH0sCisgICAgeyBYODY6Ok1PVjY0dG9QUUlyciwgICAgWDg2OjpNT1ZRSTJQUUlybSwgMCB9LAorICAgIHsgWDg2OjpNT1Y2NHRvU0RyciwgICAgIFg4Njo6TU9WNjR0b1NEcm0sIDAgfSwKKyAgICB7IFg4Njo6TU9WOHJyLCAgICAgICAgICBYODY6Ok1PVjhybSwgMCB9LAorICAgIHsgWDg2OjpNT1ZBUERyciwgICAgICAgIFg4Njo6TU9WQVBEcm0sIDE2IH0sCisgICAgeyBYODY6Ok1PVkFQU3JyLCAgICAgICAgWDg2OjpNT1ZBUFNybSwgMTYgfSwKKyAgICB7IFg4Njo6TU9WRERVUHJyLCAgICAgICBYODY6Ok1PVkREVVBybSwgMCB9LAorICAgIHsgWDg2OjpNT1ZESTJQRElyciwgICAgIFg4Njo6TU9WREkyUERJcm0sIDAgfSwKKyAgICB7IFg4Njo6TU9WREkyU1NyciwgICAgICBYODY6Ok1PVkRJMlNTcm0sIDAgfSwKKyAgICB7IFg4Njo6TU9WRFFBcnIsICAgICAgICBYODY6Ok1PVkRRQXJtLCAxNiB9LAorICAgIHsgWDg2OjpNT1ZTSERVUHJyLCAgICAgIFg4Njo6TU9WU0hEVVBybSwgMTYgfSwKKyAgICB7IFg4Njo6TU9WU0xEVVByciwgICAgICBYODY6Ok1PVlNMRFVQcm0sIDE2IH0sCisgICAgeyBYODY6Ok1PVlNYMTZycjgsICAgICAgWDg2OjpNT1ZTWDE2cm04LCAwIH0sCisgICAgeyBYODY6Ok1PVlNYMzJycjE2LCAgICAgWDg2OjpNT1ZTWDMycm0xNiwgMCB9LAorICAgIHsgWDg2OjpNT1ZTWDMycnI4LCAgICAgIFg4Njo6TU9WU1gzMnJtOCwgMCB9LAorICAgIHsgWDg2OjpNT1ZTWDY0cnIxNiwgICAgIFg4Njo6TU9WU1g2NHJtMTYsIDAgfSwKKyAgICB7IFg4Njo6TU9WU1g2NHJyMzIsICAgICBYODY6Ok1PVlNYNjRybTMyLCAwIH0sCisgICAgeyBYODY6Ok1PVlNYNjRycjgsICAgICAgWDg2OjpNT1ZTWDY0cm04LCAwIH0sCisgICAgeyBYODY6Ok1PVlVQRHJyLCAgICAgICAgWDg2OjpNT1ZVUERybSwgMTYgfSwKKyAgICB7IFg4Njo6TU9WVVBTcnIsICAgICAgICBYODY6Ok1PVlVQU3JtLCAwIH0sCisgICAgeyBYODY6Ok1PVlpESTJQRElyciwgICAgWDg2OjpNT1ZaREkyUERJcm0sIDAgfSwKKyAgICB7IFg4Njo6TU9WWlFJMlBRSXJyLCAgICBYODY6Ok1PVlpRSTJQUUlybSwgMCB9LAorICAgIHsgWDg2OjpNT1ZaUFFJTG8yUFFJcnIsIFg4Njo6TU9WWlBRSUxvMlBRSXJtLCAxNiB9LAorICAgIHsgWDg2OjpNT1ZaWDE2cnI4LCAgICAgIFg4Njo6TU9WWlgxNnJtOCwgMCB9LAorICAgIHsgWDg2OjpNT1ZaWDMycnIxNiwgICAgIFg4Njo6TU9WWlgzMnJtMTYsIDAgfSwKKyAgICB7IFg4Njo6TU9WWlgzMl9OT1JFWHJyOCwgWDg2OjpNT1ZaWDMyX05PUkVYcm04LCAwIH0sCisgICAgeyBYODY6Ok1PVlpYMzJycjgsICAgICAgWDg2OjpNT1ZaWDMycm04LCAwIH0sCisgICAgeyBYODY6Ok1PVlpYNjRycjE2LCAgICAgWDg2OjpNT1ZaWDY0cm0xNiwgMCB9LAorICAgIHsgWDg2OjpNT1ZaWDY0cnIzMiwgICAgIFg4Njo6TU9WWlg2NHJtMzIsIDAgfSwKKyAgICB7IFg4Njo6TU9WWlg2NHJyOCwgICAgICBYODY6Ok1PVlpYNjRybTgsIDAgfSwKKyAgICB7IFg4Njo6UFNIVUZEcmksICAgICAgICBYODY6OlBTSFVGRG1pLCAxNiB9LAorICAgIHsgWDg2OjpQU0hVRkhXcmksICAgICAgIFg4Njo6UFNIVUZIV21pLCAxNiB9LAorICAgIHsgWDg2OjpQU0hVRkxXcmksICAgICAgIFg4Njo6UFNIVUZMV21pLCAxNiB9LAorICAgIHsgWDg2OjpSQ1BQU3IsICAgICAgICAgIFg4Njo6UkNQUFNtLCAxNiB9LAorICAgIHsgWDg2OjpSQ1BQU3JfSW50LCAgICAgIFg4Njo6UkNQUFNtX0ludCwgMTYgfSwKKyAgICB7IFg4Njo6UlNRUlRQU3IsICAgICAgICBYODY6OlJTUVJUUFNtLCAxNiB9LAorICAgIHsgWDg2OjpSU1FSVFBTcl9JbnQsICAgIFg4Njo6UlNRUlRQU21fSW50LCAxNiB9LAorICAgIHsgWDg2OjpSU1FSVFNTciwgICAgICAgIFg4Njo6UlNRUlRTU20sIDAgfSwKKyAgICB7IFg4Njo6UlNRUlRTU3JfSW50LCAgICBYODY6OlJTUVJUU1NtX0ludCwgMCB9LAorICAgIHsgWDg2OjpTUVJUUERyLCAgICAgICAgIFg4Njo6U1FSVFBEbSwgMTYgfSwKKyAgICB7IFg4Njo6U1FSVFBEcl9JbnQsICAgICBYODY6OlNRUlRQRG1fSW50LCAxNiB9LAorICAgIHsgWDg2OjpTUVJUUFNyLCAgICAgICAgIFg4Njo6U1FSVFBTbSwgMTYgfSwKKyAgICB7IFg4Njo6U1FSVFBTcl9JbnQsICAgICBYODY6OlNRUlRQU21fSW50LCAxNiB9LAorICAgIHsgWDg2OjpTUVJUU0RyLCAgICAgICAgIFg4Njo6U1FSVFNEbSwgMCB9LAorICAgIHsgWDg2OjpTUVJUU0RyX0ludCwgICAgIFg4Njo6U1FSVFNEbV9JbnQsIDAgfSwKKyAgICB7IFg4Njo6U1FSVFNTciwgICAgICAgICBYODY6OlNRUlRTU20sIDAgfSwKKyAgICB7IFg4Njo6U1FSVFNTcl9JbnQsICAgICBYODY6OlNRUlRTU21fSW50LCAwIH0sCisgICAgeyBYODY6OlRFU1QxNnJyLCAgICAgICAgWDg2OjpURVNUMTZybSwgMCB9LAorICAgIHsgWDg2OjpURVNUMzJyciwgICAgICAgIFg4Njo6VEVTVDMycm0sIDAgfSwKKyAgICB7IFg4Njo6VEVTVDY0cnIsICAgICAgICBYODY6OlRFU1Q2NHJtLCAwIH0sCisgICAgeyBYODY6OlRFU1Q4cnIsICAgICAgICAgWDg2OjpURVNUOHJtLCAwIH0sCisgICAgLy8gRklYTUU6IFRFU1QqcnIgRUFYLEVBWCAtLS0+IENNUCBbbWVtXSwgMAorICAgIHsgWDg2OjpVQ09NSVNEcnIsICAgICAgIFg4Njo6VUNPTUlTRHJtLCAwIH0sCisgICAgeyBYODY6OlVDT01JU1NyciwgICAgICAgWDg2OjpVQ09NSVNTcm0sIDAgfQorICB9OworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBhcnJheV9sZW5ndGhvZihPcFRibDEpOyBpICE9IGU7ICsraSkgeworICAgIHVuc2lnbmVkIFJlZ09wID0gT3BUYmwxW2ldWzBdOworICAgIHVuc2lnbmVkIE1lbU9wID0gT3BUYmwxW2ldWzFdOworICAgIHVuc2lnbmVkIEFsaWduID0gT3BUYmwxW2ldWzJdOworICAgIGlmICghUmVnT3AyTWVtT3BUYWJsZTEuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCh1bnNpZ25lZCopUmVnT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoTWVtT3AsQWxpZ24pKSkuc2Vjb25kKQorICAgICAgYXNzZXJ0KGZhbHNlICYmICJEdXBsaWNhdGVkIGVudHJpZXM/Iik7CisgICAgLy8gSW5kZXggMSwgZm9sZGVkIGxvYWQKKyAgICB1bnNpZ25lZCBBdXhJbmZvID0gMSB8ICgxIDw8IDQpOworICAgIGlmIChSZWdPcCAhPSBYODY6OkZzTU9WQVBEcnIgJiYgUmVnT3AgIT0gWDg2OjpGc01PVkFQU3JyKQorICAgICAgaWYgKCFNZW1PcDJSZWdPcFRhYmxlLmluc2VydChzdGQ6Om1ha2VfcGFpcigodW5zaWduZWQqKU1lbU9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFJlZ09wLCBBdXhJbmZvKSkpLnNlY29uZCkKKyAgICAgICAgQW1iRW50cmllcy5wdXNoX2JhY2soTWVtT3ApOworICB9CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE9wVGJsMltdWzNdID0geworICAgIHsgWDg2OjpBREMzMnJyLCAgICAgICAgIFg4Njo6QURDMzJybSwgMCB9LAorICAgIHsgWDg2OjpBREM2NHJyLCAgICAgICAgIFg4Njo6QURDNjRybSwgMCB9LAorICAgIHsgWDg2OjpBREQxNnJyLCAgICAgICAgIFg4Njo6QUREMTZybSwgMCB9LAorICAgIHsgWDg2OjpBREQzMnJyLCAgICAgICAgIFg4Njo6QUREMzJybSwgMCB9LAorICAgIHsgWDg2OjpBREQ2NHJyLCAgICAgICAgIFg4Njo6QURENjRybSwgMCB9LAorICAgIHsgWDg2OjpBREQ4cnIsICAgICAgICAgIFg4Njo6QUREOHJtLCAwIH0sCisgICAgeyBYODY6OkFERFBEcnIsICAgICAgICAgWDg2OjpBRERQRHJtLCAxNiB9LAorICAgIHsgWDg2OjpBRERQU3JyLCAgICAgICAgIFg4Njo6QUREUFNybSwgMTYgfSwKKyAgICB7IFg4Njo6QUREU0RyciwgICAgICAgICBYODY6OkFERFNEcm0sIDAgfSwKKyAgICB7IFg4Njo6QUREU1NyciwgICAgICAgICBYODY6OkFERFNTcm0sIDAgfSwKKyAgICB7IFg4Njo6QUREU1VCUERyciwgICAgICBYODY6OkFERFNVQlBEcm0sIDE2IH0sCisgICAgeyBYODY6OkFERFNVQlBTcnIsICAgICAgWDg2OjpBRERTVUJQU3JtLCAxNiB9LAorICAgIHsgWDg2OjpBTkQxNnJyLCAgICAgICAgIFg4Njo6QU5EMTZybSwgMCB9LAorICAgIHsgWDg2OjpBTkQzMnJyLCAgICAgICAgIFg4Njo6QU5EMzJybSwgMCB9LAorICAgIHsgWDg2OjpBTkQ2NHJyLCAgICAgICAgIFg4Njo6QU5ENjRybSwgMCB9LAorICAgIHsgWDg2OjpBTkQ4cnIsICAgICAgICAgIFg4Njo6QU5EOHJtLCAwIH0sCisgICAgeyBYODY6OkFORE5QRHJyLCAgICAgICAgWDg2OjpBTkROUERybSwgMTYgfSwKKyAgICB7IFg4Njo6QU5ETlBTcnIsICAgICAgICBYODY6OkFORE5QU3JtLCAxNiB9LAorICAgIHsgWDg2OjpBTkRQRHJyLCAgICAgICAgIFg4Njo6QU5EUERybSwgMTYgfSwKKyAgICB7IFg4Njo6QU5EUFNyciwgICAgICAgICBYODY6OkFORFBTcm0sIDE2IH0sCisgICAgeyBYODY6OkNNT1ZBMTZyciwgICAgICAgWDg2OjpDTU9WQTE2cm0sIDAgfSwKKyAgICB7IFg4Njo6Q01PVkEzMnJyLCAgICAgICBYODY6OkNNT1ZBMzJybSwgMCB9LAorICAgIHsgWDg2OjpDTU9WQTY0cnIsICAgICAgIFg4Njo6Q01PVkE2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZBRTE2cnIsICAgICAgWDg2OjpDTU9WQUUxNnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZBRTMycnIsICAgICAgWDg2OjpDTU9WQUUzMnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZBRTY0cnIsICAgICAgWDg2OjpDTU9WQUU2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZCMTZyciwgICAgICAgWDg2OjpDTU9WQjE2cm0sIDAgfSwKKyAgICB7IFg4Njo6Q01PVkIzMnJyLCAgICAgICBYODY6OkNNT1ZCMzJybSwgMCB9LAorICAgIHsgWDg2OjpDTU9WQjY0cnIsICAgICAgIFg4Njo6Q01PVkI2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZCRTE2cnIsICAgICAgWDg2OjpDTU9WQkUxNnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZCRTMycnIsICAgICAgWDg2OjpDTU9WQkUzMnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZCRTY0cnIsICAgICAgWDg2OjpDTU9WQkU2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZFMTZyciwgICAgICAgWDg2OjpDTU9WRTE2cm0sIDAgfSwKKyAgICB7IFg4Njo6Q01PVkUzMnJyLCAgICAgICBYODY6OkNNT1ZFMzJybSwgMCB9LAorICAgIHsgWDg2OjpDTU9WRTY0cnIsICAgICAgIFg4Njo6Q01PVkU2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZHMTZyciwgICAgICAgWDg2OjpDTU9WRzE2cm0sIDAgfSwKKyAgICB7IFg4Njo6Q01PVkczMnJyLCAgICAgICBYODY6OkNNT1ZHMzJybSwgMCB9LAorICAgIHsgWDg2OjpDTU9WRzY0cnIsICAgICAgIFg4Njo6Q01PVkc2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZHRTE2cnIsICAgICAgWDg2OjpDTU9WR0UxNnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZHRTMycnIsICAgICAgWDg2OjpDTU9WR0UzMnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZHRTY0cnIsICAgICAgWDg2OjpDTU9WR0U2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZMMTZyciwgICAgICAgWDg2OjpDTU9WTDE2cm0sIDAgfSwKKyAgICB7IFg4Njo6Q01PVkwzMnJyLCAgICAgICBYODY6OkNNT1ZMMzJybSwgMCB9LAorICAgIHsgWDg2OjpDTU9WTDY0cnIsICAgICAgIFg4Njo6Q01PVkw2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZMRTE2cnIsICAgICAgWDg2OjpDTU9WTEUxNnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZMRTMycnIsICAgICAgWDg2OjpDTU9WTEUzMnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZMRTY0cnIsICAgICAgWDg2OjpDTU9WTEU2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZORTE2cnIsICAgICAgWDg2OjpDTU9WTkUxNnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZORTMycnIsICAgICAgWDg2OjpDTU9WTkUzMnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZORTY0cnIsICAgICAgWDg2OjpDTU9WTkU2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZOTzE2cnIsICAgICAgWDg2OjpDTU9WTk8xNnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZOTzMycnIsICAgICAgWDg2OjpDTU9WTk8zMnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZOTzY0cnIsICAgICAgWDg2OjpDTU9WTk82NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZOUDE2cnIsICAgICAgWDg2OjpDTU9WTlAxNnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZOUDMycnIsICAgICAgWDg2OjpDTU9WTlAzMnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZOUDY0cnIsICAgICAgWDg2OjpDTU9WTlA2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZOUzE2cnIsICAgICAgWDg2OjpDTU9WTlMxNnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZOUzMycnIsICAgICAgWDg2OjpDTU9WTlMzMnJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZOUzY0cnIsICAgICAgWDg2OjpDTU9WTlM2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZPMTZyciwgICAgICAgWDg2OjpDTU9WTzE2cm0sIDAgfSwKKyAgICB7IFg4Njo6Q01PVk8zMnJyLCAgICAgICBYODY6OkNNT1ZPMzJybSwgMCB9LAorICAgIHsgWDg2OjpDTU9WTzY0cnIsICAgICAgIFg4Njo6Q01PVk82NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZQMTZyciwgICAgICAgWDg2OjpDTU9WUDE2cm0sIDAgfSwKKyAgICB7IFg4Njo6Q01PVlAzMnJyLCAgICAgICBYODY6OkNNT1ZQMzJybSwgMCB9LAorICAgIHsgWDg2OjpDTU9WUDY0cnIsICAgICAgIFg4Njo6Q01PVlA2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNT1ZTMTZyciwgICAgICAgWDg2OjpDTU9WUzE2cm0sIDAgfSwKKyAgICB7IFg4Njo6Q01PVlMzMnJyLCAgICAgICBYODY6OkNNT1ZTMzJybSwgMCB9LAorICAgIHsgWDg2OjpDTU9WUzY0cnIsICAgICAgIFg4Njo6Q01PVlM2NHJtLCAwIH0sCisgICAgeyBYODY6OkNNUFBEcnJpLCAgICAgICAgWDg2OjpDTVBQRHJtaSwgMTYgfSwKKyAgICB7IFg4Njo6Q01QUFNycmksICAgICAgICBYODY6OkNNUFBTcm1pLCAxNiB9LAorICAgIHsgWDg2OjpDTVBTRHJyLCAgICAgICAgIFg4Njo6Q01QU0RybSwgMCB9LAorICAgIHsgWDg2OjpDTVBTU3JyLCAgICAgICAgIFg4Njo6Q01QU1NybSwgMCB9LAorICAgIHsgWDg2OjpESVZQRHJyLCAgICAgICAgIFg4Njo6RElWUERybSwgMTYgfSwKKyAgICB7IFg4Njo6RElWUFNyciwgICAgICAgICBYODY6OkRJVlBTcm0sIDE2IH0sCisgICAgeyBYODY6OkRJVlNEcnIsICAgICAgICAgWDg2OjpESVZTRHJtLCAwIH0sCisgICAgeyBYODY6OkRJVlNTcnIsICAgICAgICAgWDg2OjpESVZTU3JtLCAwIH0sCisgICAgeyBYODY6OkZzQU5ETlBEcnIsICAgICAgWDg2OjpGc0FORE5QRHJtLCAxNiB9LAorICAgIHsgWDg2OjpGc0FORE5QU3JyLCAgICAgIFg4Njo6RnNBTkROUFNybSwgMTYgfSwKKyAgICB7IFg4Njo6RnNBTkRQRHJyLCAgICAgICBYODY6OkZzQU5EUERybSwgMTYgfSwKKyAgICB7IFg4Njo6RnNBTkRQU3JyLCAgICAgICBYODY6OkZzQU5EUFNybSwgMTYgfSwKKyAgICB7IFg4Njo6RnNPUlBEcnIsICAgICAgICBYODY6OkZzT1JQRHJtLCAxNiB9LAorICAgIHsgWDg2OjpGc09SUFNyciwgICAgICAgIFg4Njo6RnNPUlBTcm0sIDE2IH0sCisgICAgeyBYODY6OkZzWE9SUERyciwgICAgICAgWDg2OjpGc1hPUlBEcm0sIDE2IH0sCisgICAgeyBYODY6OkZzWE9SUFNyciwgICAgICAgWDg2OjpGc1hPUlBTcm0sIDE2IH0sCisgICAgeyBYODY6OkhBRERQRHJyLCAgICAgICAgWDg2OjpIQUREUERybSwgMTYgfSwKKyAgICB7IFg4Njo6SEFERFBTcnIsICAgICAgICBYODY6OkhBRERQU3JtLCAxNiB9LAorICAgIHsgWDg2OjpIU1VCUERyciwgICAgICAgIFg4Njo6SFNVQlBEcm0sIDE2IH0sCisgICAgeyBYODY6OkhTVUJQU3JyLCAgICAgICAgWDg2OjpIU1VCUFNybSwgMTYgfSwKKyAgICB7IFg4Njo6SU1VTDE2cnIsICAgICAgICBYODY6OklNVUwxNnJtLCAwIH0sCisgICAgeyBYODY6OklNVUwzMnJyLCAgICAgICAgWDg2OjpJTVVMMzJybSwgMCB9LAorICAgIHsgWDg2OjpJTVVMNjRyciwgICAgICAgIFg4Njo6SU1VTDY0cm0sIDAgfSwKKyAgICB7IFg4Njo6TUFYUERyciwgICAgICAgICBYODY6Ok1BWFBEcm0sIDE2IH0sCisgICAgeyBYODY6Ok1BWFBEcnJfSW50LCAgICAgWDg2OjpNQVhQRHJtX0ludCwgMTYgfSwKKyAgICB7IFg4Njo6TUFYUFNyciwgICAgICAgICBYODY6Ok1BWFBTcm0sIDE2IH0sCisgICAgeyBYODY6Ok1BWFBTcnJfSW50LCAgICAgWDg2OjpNQVhQU3JtX0ludCwgMTYgfSwKKyAgICB7IFg4Njo6TUFYU0RyciwgICAgICAgICBYODY6Ok1BWFNEcm0sIDAgfSwKKyAgICB7IFg4Njo6TUFYU0Rycl9JbnQsICAgICBYODY6Ok1BWFNEcm1fSW50LCAwIH0sCisgICAgeyBYODY6Ok1BWFNTcnIsICAgICAgICAgWDg2OjpNQVhTU3JtLCAwIH0sCisgICAgeyBYODY6Ok1BWFNTcnJfSW50LCAgICAgWDg2OjpNQVhTU3JtX0ludCwgMCB9LAorICAgIHsgWDg2OjpNSU5QRHJyLCAgICAgICAgIFg4Njo6TUlOUERybSwgMTYgfSwKKyAgICB7IFg4Njo6TUlOUERycl9JbnQsICAgICBYODY6Ok1JTlBEcm1fSW50LCAxNiB9LAorICAgIHsgWDg2OjpNSU5QU3JyLCAgICAgICAgIFg4Njo6TUlOUFNybSwgMTYgfSwKKyAgICB7IFg4Njo6TUlOUFNycl9JbnQsICAgICBYODY6Ok1JTlBTcm1fSW50LCAxNiB9LAorICAgIHsgWDg2OjpNSU5TRHJyLCAgICAgICAgIFg4Njo6TUlOU0RybSwgMCB9LAorICAgIHsgWDg2OjpNSU5TRHJyX0ludCwgICAgIFg4Njo6TUlOU0RybV9JbnQsIDAgfSwKKyAgICB7IFg4Njo6TUlOU1NyciwgICAgICAgICBYODY6Ok1JTlNTcm0sIDAgfSwKKyAgICB7IFg4Njo6TUlOU1Nycl9JbnQsICAgICBYODY6Ok1JTlNTcm1fSW50LCAwIH0sCisgICAgeyBYODY6Ok1VTFBEcnIsICAgICAgICAgWDg2OjpNVUxQRHJtLCAxNiB9LAorICAgIHsgWDg2OjpNVUxQU3JyLCAgICAgICAgIFg4Njo6TVVMUFNybSwgMTYgfSwKKyAgICB7IFg4Njo6TVVMU0RyciwgICAgICAgICBYODY6Ok1VTFNEcm0sIDAgfSwKKyAgICB7IFg4Njo6TVVMU1NyciwgICAgICAgICBYODY6Ok1VTFNTcm0sIDAgfSwKKyAgICB7IFg4Njo6T1IxNnJyLCAgICAgICAgICBYODY6Ok9SMTZybSwgMCB9LAorICAgIHsgWDg2OjpPUjMycnIsICAgICAgICAgIFg4Njo6T1IzMnJtLCAwIH0sCisgICAgeyBYODY6Ok9SNjRyciwgICAgICAgICAgWDg2OjpPUjY0cm0sIDAgfSwKKyAgICB7IFg4Njo6T1I4cnIsICAgICAgICAgICBYODY6Ok9SOHJtLCAwIH0sCisgICAgeyBYODY6Ok9SUERyciwgICAgICAgICAgWDg2OjpPUlBEcm0sIDE2IH0sCisgICAgeyBYODY6Ok9SUFNyciwgICAgICAgICAgWDg2OjpPUlBTcm0sIDE2IH0sCisgICAgeyBYODY6OlBBQ0tTU0RXcnIsICAgICAgWDg2OjpQQUNLU1NEV3JtLCAxNiB9LAorICAgIHsgWDg2OjpQQUNLU1NXQnJyLCAgICAgIFg4Njo6UEFDS1NTV0JybSwgMTYgfSwKKyAgICB7IFg4Njo6UEFDS1VTV0JyciwgICAgICBYODY6OlBBQ0tVU1dCcm0sIDE2IH0sCisgICAgeyBYODY6OlBBRERCcnIsICAgICAgICAgWDg2OjpQQUREQnJtLCAxNiB9LAorICAgIHsgWDg2OjpQQURERHJyLCAgICAgICAgIFg4Njo6UEFERERybSwgMTYgfSwKKyAgICB7IFg4Njo6UEFERFFyciwgICAgICAgICBYODY6OlBBRERRcm0sIDE2IH0sCisgICAgeyBYODY6OlBBRERTQnJyLCAgICAgICAgWDg2OjpQQUREU0JybSwgMTYgfSwKKyAgICB7IFg4Njo6UEFERFNXcnIsICAgICAgICBYODY6OlBBRERTV3JtLCAxNiB9LAorICAgIHsgWDg2OjpQQUREV3JyLCAgICAgICAgIFg4Njo6UEFERFdybSwgMTYgfSwKKyAgICB7IFg4Njo6UEFORE5yciwgICAgICAgICBYODY6OlBBTkROcm0sIDE2IH0sCisgICAgeyBYODY6OlBBTkRyciwgICAgICAgICAgWDg2OjpQQU5Ecm0sIDE2IH0sCisgICAgeyBYODY6OlBBVkdCcnIsICAgICAgICAgWDg2OjpQQVZHQnJtLCAxNiB9LAorICAgIHsgWDg2OjpQQVZHV3JyLCAgICAgICAgIFg4Njo6UEFWR1dybSwgMTYgfSwKKyAgICB7IFg4Njo6UENNUEVRQnJyLCAgICAgICBYODY6OlBDTVBFUUJybSwgMTYgfSwKKyAgICB7IFg4Njo6UENNUEVRRHJyLCAgICAgICBYODY6OlBDTVBFUURybSwgMTYgfSwKKyAgICB7IFg4Njo6UENNUEVRV3JyLCAgICAgICBYODY6OlBDTVBFUVdybSwgMTYgfSwKKyAgICB7IFg4Njo6UENNUEdUQnJyLCAgICAgICBYODY6OlBDTVBHVEJybSwgMTYgfSwKKyAgICB7IFg4Njo6UENNUEdURHJyLCAgICAgICBYODY6OlBDTVBHVERybSwgMTYgfSwKKyAgICB7IFg4Njo6UENNUEdUV3JyLCAgICAgICBYODY6OlBDTVBHVFdybSwgMTYgfSwKKyAgICB7IFg4Njo6UElOU1JXcnJpLCAgICAgICBYODY6OlBJTlNSV3JtaSwgMTYgfSwKKyAgICB7IFg4Njo6UE1BRERXRHJyLCAgICAgICBYODY6OlBNQUREV0RybSwgMTYgfSwKKyAgICB7IFg4Njo6UE1BWFNXcnIsICAgICAgICBYODY6OlBNQVhTV3JtLCAxNiB9LAorICAgIHsgWDg2OjpQTUFYVUJyciwgICAgICAgIFg4Njo6UE1BWFVCcm0sIDE2IH0sCisgICAgeyBYODY6OlBNSU5TV3JyLCAgICAgICAgWDg2OjpQTUlOU1dybSwgMTYgfSwKKyAgICB7IFg4Njo6UE1JTlVCcnIsICAgICAgICBYODY6OlBNSU5VQnJtLCAxNiB9LAorICAgIHsgWDg2OjpQTVVMRFFyciwgICAgICAgIFg4Njo6UE1VTERRcm0sIDE2IH0sCisgICAgeyBYODY6OlBNVUxIVVdyciwgICAgICAgWDg2OjpQTVVMSFVXcm0sIDE2IH0sCisgICAgeyBYODY6OlBNVUxIV3JyLCAgICAgICAgWDg2OjpQTVVMSFdybSwgMTYgfSwKKyAgICB7IFg4Njo6UE1VTExEcnIsICAgICAgICBYODY6OlBNVUxMRHJtLCAxNiB9LAorICAgIHsgWDg2OjpQTVVMTFdyciwgICAgICAgIFg4Njo6UE1VTExXcm0sIDE2IH0sCisgICAgeyBYODY6OlBNVUxVRFFyciwgICAgICAgWDg2OjpQTVVMVURRcm0sIDE2IH0sCisgICAgeyBYODY6OlBPUnJyLCAgICAgICAgICAgWDg2OjpQT1JybSwgMTYgfSwKKyAgICB7IFg4Njo6UFNBREJXcnIsICAgICAgICBYODY6OlBTQURCV3JtLCAxNiB9LAorICAgIHsgWDg2OjpQU0xMRHJyLCAgICAgICAgIFg4Njo6UFNMTERybSwgMTYgfSwKKyAgICB7IFg4Njo6UFNMTFFyciwgICAgICAgICBYODY6OlBTTExRcm0sIDE2IH0sCisgICAgeyBYODY6OlBTTExXcnIsICAgICAgICAgWDg2OjpQU0xMV3JtLCAxNiB9LAorICAgIHsgWDg2OjpQU1JBRHJyLCAgICAgICAgIFg4Njo6UFNSQURybSwgMTYgfSwKKyAgICB7IFg4Njo6UFNSQVdyciwgICAgICAgICBYODY6OlBTUkFXcm0sIDE2IH0sCisgICAgeyBYODY6OlBTUkxEcnIsICAgICAgICAgWDg2OjpQU1JMRHJtLCAxNiB9LAorICAgIHsgWDg2OjpQU1JMUXJyLCAgICAgICAgIFg4Njo6UFNSTFFybSwgMTYgfSwKKyAgICB7IFg4Njo6UFNSTFdyciwgICAgICAgICBYODY6OlBTUkxXcm0sIDE2IH0sCisgICAgeyBYODY6OlBTVUJCcnIsICAgICAgICAgWDg2OjpQU1VCQnJtLCAxNiB9LAorICAgIHsgWDg2OjpQU1VCRHJyLCAgICAgICAgIFg4Njo6UFNVQkRybSwgMTYgfSwKKyAgICB7IFg4Njo6UFNVQlNCcnIsICAgICAgICBYODY6OlBTVUJTQnJtLCAxNiB9LAorICAgIHsgWDg2OjpQU1VCU1dyciwgICAgICAgIFg4Njo6UFNVQlNXcm0sIDE2IH0sCisgICAgeyBYODY6OlBTVUJXcnIsICAgICAgICAgWDg2OjpQU1VCV3JtLCAxNiB9LAorICAgIHsgWDg2OjpQVU5QQ0tIQldyciwgICAgIFg4Njo6UFVOUENLSEJXcm0sIDE2IH0sCisgICAgeyBYODY6OlBVTlBDS0hEUXJyLCAgICAgWDg2OjpQVU5QQ0tIRFFybSwgMTYgfSwKKyAgICB7IFg4Njo6UFVOUENLSFFEUXJyLCAgICBYODY6OlBVTlBDS0hRRFFybSwgMTYgfSwKKyAgICB7IFg4Njo6UFVOUENLSFdEcnIsICAgICBYODY6OlBVTlBDS0hXRHJtLCAxNiB9LAorICAgIHsgWDg2OjpQVU5QQ0tMQldyciwgICAgIFg4Njo6UFVOUENLTEJXcm0sIDE2IH0sCisgICAgeyBYODY6OlBVTlBDS0xEUXJyLCAgICAgWDg2OjpQVU5QQ0tMRFFybSwgMTYgfSwKKyAgICB7IFg4Njo6UFVOUENLTFFEUXJyLCAgICBYODY6OlBVTlBDS0xRRFFybSwgMTYgfSwKKyAgICB7IFg4Njo6UFVOUENLTFdEcnIsICAgICBYODY6OlBVTlBDS0xXRHJtLCAxNiB9LAorICAgIHsgWDg2OjpQWE9ScnIsICAgICAgICAgIFg4Njo6UFhPUnJtLCAxNiB9LAorICAgIHsgWDg2OjpTQkIzMnJyLCAgICAgICAgIFg4Njo6U0JCMzJybSwgMCB9LAorICAgIHsgWDg2OjpTQkI2NHJyLCAgICAgICAgIFg4Njo6U0JCNjRybSwgMCB9LAorICAgIHsgWDg2OjpTSFVGUERycmksICAgICAgIFg4Njo6U0hVRlBEcm1pLCAxNiB9LAorICAgIHsgWDg2OjpTSFVGUFNycmksICAgICAgIFg4Njo6U0hVRlBTcm1pLCAxNiB9LAorICAgIHsgWDg2OjpTVUIxNnJyLCAgICAgICAgIFg4Njo6U1VCMTZybSwgMCB9LAorICAgIHsgWDg2OjpTVUIzMnJyLCAgICAgICAgIFg4Njo6U1VCMzJybSwgMCB9LAorICAgIHsgWDg2OjpTVUI2NHJyLCAgICAgICAgIFg4Njo6U1VCNjRybSwgMCB9LAorICAgIHsgWDg2OjpTVUI4cnIsICAgICAgICAgIFg4Njo6U1VCOHJtLCAwIH0sCisgICAgeyBYODY6OlNVQlBEcnIsICAgICAgICAgWDg2OjpTVUJQRHJtLCAxNiB9LAorICAgIHsgWDg2OjpTVUJQU3JyLCAgICAgICAgIFg4Njo6U1VCUFNybSwgMTYgfSwKKyAgICB7IFg4Njo6U1VCU0RyciwgICAgICAgICBYODY6OlNVQlNEcm0sIDAgfSwKKyAgICB7IFg4Njo6U1VCU1NyciwgICAgICAgICBYODY6OlNVQlNTcm0sIDAgfSwKKyAgICAvLyBGSVhNRTogVEVTVCpyciAtPiBzd2FwcGVkIG9wZXJhbmQgb2YgVEVTVCptci4KKyAgICB7IFg4Njo6VU5QQ0tIUERyciwgICAgICBYODY6OlVOUENLSFBEcm0sIDE2IH0sCisgICAgeyBYODY6OlVOUENLSFBTcnIsICAgICAgWDg2OjpVTlBDS0hQU3JtLCAxNiB9LAorICAgIHsgWDg2OjpVTlBDS0xQRHJyLCAgICAgIFg4Njo6VU5QQ0tMUERybSwgMTYgfSwKKyAgICB7IFg4Njo6VU5QQ0tMUFNyciwgICAgICBYODY6OlVOUENLTFBTcm0sIDE2IH0sCisgICAgeyBYODY6OlhPUjE2cnIsICAgICAgICAgWDg2OjpYT1IxNnJtLCAwIH0sCisgICAgeyBYODY6OlhPUjMycnIsICAgICAgICAgWDg2OjpYT1IzMnJtLCAwIH0sCisgICAgeyBYODY6OlhPUjY0cnIsICAgICAgICAgWDg2OjpYT1I2NHJtLCAwIH0sCisgICAgeyBYODY6OlhPUjhyciwgICAgICAgICAgWDg2OjpYT1I4cm0sIDAgfSwKKyAgICB7IFg4Njo6WE9SUERyciwgICAgICAgICBYODY6OlhPUlBEcm0sIDE2IH0sCisgICAgeyBYODY6OlhPUlBTcnIsICAgICAgICAgWDg2OjpYT1JQU3JtLCAxNiB9CisgIH07CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGFycmF5X2xlbmd0aG9mKE9wVGJsMik7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnT3AgPSBPcFRibDJbaV1bMF07CisgICAgdW5zaWduZWQgTWVtT3AgPSBPcFRibDJbaV1bMV07CisgICAgdW5zaWduZWQgQWxpZ24gPSBPcFRibDJbaV1bMl07CisgICAgaWYgKCFSZWdPcDJNZW1PcFRhYmxlMi5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKHVuc2lnbmVkKilSZWdPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihNZW1PcCxBbGlnbikpKS5zZWNvbmQpCisgICAgICBhc3NlcnQoZmFsc2UgJiYgIkR1cGxpY2F0ZWQgZW50cmllcz8iKTsKKyAgICAvLyBJbmRleCAyLCBmb2xkZWQgbG9hZAorICAgIHVuc2lnbmVkIEF1eEluZm8gPSAyIHwgKDEgPDwgNCk7CisgICAgaWYgKCFNZW1PcDJSZWdPcFRhYmxlLmluc2VydChzdGQ6Om1ha2VfcGFpcigodW5zaWduZWQqKU1lbU9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihSZWdPcCwgQXV4SW5mbykpKS5zZWNvbmQpCisgICAgICBBbWJFbnRyaWVzLnB1c2hfYmFjayhNZW1PcCk7CisgIH0KKworICAvLyBSZW1vdmUgYW1iaWd1b3VzIGVudHJpZXMuCisgIGFzc2VydChBbWJFbnRyaWVzLmVtcHR5KCkgJiYgIkR1cGxpY2F0ZWQgZW50cmllcyBpbiB1bmZvbGRpbmcgbWFwcz8iKTsKK30KKworYm9vbAorWDg2SW5zdHJJbmZvOjppc0NvYWxlc2NhYmxlRXh0SW5zdHIoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcmNSZWcsIHVuc2lnbmVkICZEc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmU3ViSWR4KSBjb25zdCB7CisgIHN3aXRjaCAoTUkuZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgWDg2OjpNT1ZTWDE2cnI4OgorICBjYXNlIFg4Njo6TU9WWlgxNnJyODoKKyAgY2FzZSBYODY6Ok1PVlNYMzJycjg6CisgIGNhc2UgWDg2OjpNT1ZaWDMycnI4OgorICBjYXNlIFg4Njo6TU9WU1g2NHJyODoKKyAgY2FzZSBYODY6Ok1PVlpYNjRycjg6CisgICAgaWYgKCFUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzNjRCaXQoKSkKKyAgICAgIC8vIEl0J3Mgbm90IGFsd2F5cyBsZWdhbCB0byByZWZlcmVuY2UgdGhlIGxvdyA4LWJpdCBvZiB0aGUgbGFyZ2VyCisgICAgICAvLyByZWdpc3RlciBpbiAzMi1iaXQgbW9kZS4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBYODY6Ok1PVlNYMzJycjE2OgorICBjYXNlIFg4Njo6TU9WWlgzMnJyMTY6CisgIGNhc2UgWDg2OjpNT1ZTWDY0cnIxNjoKKyAgY2FzZSBYODY6Ok1PVlpYNjRycjE2OgorICBjYXNlIFg4Njo6TU9WU1g2NHJyMzI6CisgIGNhc2UgWDg2OjpNT1ZaWDY0cnIzMjogeworICAgIGlmIChNSS5nZXRPcGVyYW5kKDApLmdldFN1YlJlZygpIHx8IE1JLmdldE9wZXJhbmQoMSkuZ2V0U3ViUmVnKCkpCisgICAgICAvLyBCZSBjb25zZXJ2YXRpdmUuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgU3JjUmVnID0gTUkuZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICBEc3RSZWcgPSBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIHN3aXRjaCAoTUkuZ2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWDg2OjpNT1ZTWDE2cnI4OgorICAgIGNhc2UgWDg2OjpNT1ZaWDE2cnI4OgorICAgIGNhc2UgWDg2OjpNT1ZTWDMycnI4OgorICAgIGNhc2UgWDg2OjpNT1ZaWDMycnI4OgorICAgIGNhc2UgWDg2OjpNT1ZTWDY0cnI4OgorICAgIGNhc2UgWDg2OjpNT1ZaWDY0cnI4OgorICAgICAgU3ViSWR4ID0gWDg2OjpzdWJfOGJpdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWDg2OjpNT1ZTWDMycnIxNjoKKyAgICBjYXNlIFg4Njo6TU9WWlgzMnJyMTY6CisgICAgY2FzZSBYODY6Ok1PVlNYNjRycjE2OgorICAgIGNhc2UgWDg2OjpNT1ZaWDY0cnIxNjoKKyAgICAgIFN1YklkeCA9IFg4Njo6c3ViXzE2Yml0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBYODY6Ok1PVlNYNjRycjMyOgorICAgIGNhc2UgWDg2OjpNT1ZaWDY0cnIzMjoKKyAgICAgIFN1YklkeCA9IFg4Njo6c3ViXzMyYml0OworICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNGcmFtZU9wZXJhbmQgLSBSZXR1cm4gdHJ1ZSBhbmQgdGhlIEZyYW1lSW5kZXggaWYgdGhlIHNwZWNpZmllZAorLy8vIG9wZXJhbmQgYW5kIGZvbGxvdyBvcGVyYW5kcyBmb3JtIGEgcmVmZXJlbmNlIHRvIHRoZSBzdGFjayBmcmFtZS4KK2Jvb2wgWDg2SW5zdHJJbmZvOjppc0ZyYW1lT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBpbnQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgIGlmIChNSS0+Z2V0T3BlcmFuZChPcCkuaXNGSSgpICYmIE1JLT5nZXRPcGVyYW5kKE9wKzEpLmlzSW1tKCkgJiYKKyAgICAgIE1JLT5nZXRPcGVyYW5kKE9wKzIpLmlzUmVnKCkgJiYgTUktPmdldE9wZXJhbmQoT3ArMykuaXNJbW0oKSAmJgorICAgICAgTUktPmdldE9wZXJhbmQoT3ArMSkuZ2V0SW1tKCkgPT0gMSAmJgorICAgICAgTUktPmdldE9wZXJhbmQoT3ArMikuZ2V0UmVnKCkgPT0gMCAmJgorICAgICAgTUktPmdldE9wZXJhbmQoT3ArMykuZ2V0SW1tKCkgPT0gMCkgeworICAgIEZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZChPcCkuZ2V0SW5kZXgoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzRnJhbWVMb2FkT3Bjb2RlKGludCBPcGNvZGUpIHsKKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgWDg2OjpNT1Y4cm06CisgIGNhc2UgWDg2OjpNT1YxNnJtOgorICBjYXNlIFg4Njo6TU9WMzJybToKKyAgY2FzZSBYODY6Ok1PVjMycm1fVEM6CisgIGNhc2UgWDg2OjpNT1Y2NHJtOgorICBjYXNlIFg4Njo6TU9WNjRybV9UQzoKKyAgY2FzZSBYODY6OkxEX0ZwNjRtOgorICBjYXNlIFg4Njo6TU9WU1NybToKKyAgY2FzZSBYODY6Ok1PVlNEcm06CisgIGNhc2UgWDg2OjpNT1ZBUFNybToKKyAgY2FzZSBYODY6Ok1PVkFQRHJtOgorICBjYXNlIFg4Njo6TU9WRFFBcm06CisgIGNhc2UgWDg2OjpNTVhfTU9WRDY0cm06CisgIGNhc2UgWDg2OjpNTVhfTU9WUTY0cm06CisgICAgcmV0dXJuIHRydWU7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc0ZyYW1lU3RvcmVPcGNvZGUoaW50IE9wY29kZSkgeworICBzd2l0Y2ggKE9wY29kZSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBYODY6Ok1PVjhtcjoKKyAgY2FzZSBYODY6Ok1PVjE2bXI6CisgIGNhc2UgWDg2OjpNT1YzMm1yOgorICBjYXNlIFg4Njo6TU9WMzJtcl9UQzoKKyAgY2FzZSBYODY6Ok1PVjY0bXI6CisgIGNhc2UgWDg2OjpNT1Y2NG1yX1RDOgorICBjYXNlIFg4Njo6U1RfRnBQNjRtOgorICBjYXNlIFg4Njo6TU9WU1NtcjoKKyAgY2FzZSBYODY6Ok1PVlNEbXI6CisgIGNhc2UgWDg2OjpNT1ZBUFNtcjoKKyAgY2FzZSBYODY6Ok1PVkFQRG1yOgorICBjYXNlIFg4Njo6TU9WRFFBbXI6CisgIGNhc2UgWDg2OjpNTVhfTU9WRDY0bXI6CisgIGNhc2UgWDg2OjpNTVhfTU9WUTY0bXI6CisgIGNhc2UgWDg2OjpNTVhfTU9WTlRRbXI6CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit1bnNpZ25lZCBYODZJbnN0ckluZm86OmlzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgIGlmIChpc0ZyYW1lTG9hZE9wY29kZShNSS0+Z2V0T3Bjb2RlKCkpKQorICAgIGlmIChNSS0+Z2V0T3BlcmFuZCgwKS5nZXRTdWJSZWcoKSA9PSAwICYmIGlzRnJhbWVPcGVyYW5kKE1JLCAxLCBGcmFtZUluZGV4KSkKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIFg4Nkluc3RySW5mbzo6aXNMb2FkRnJvbVN0YWNrU2xvdFBvc3RGRShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgaWYgKGlzRnJhbWVMb2FkT3Bjb2RlKE1JLT5nZXRPcGNvZGUoKSkpIHsKKyAgICB1bnNpZ25lZCBSZWc7CisgICAgaWYgKChSZWcgPSBpc0xvYWRGcm9tU3RhY2tTbG90KE1JLCBGcmFtZUluZGV4KSkpCisgICAgICByZXR1cm4gUmVnOworICAgIC8vIENoZWNrIGZvciBwb3N0LWZyYW1lIGluZGV4IGVsaW1pbmF0aW9uIG9wZXJhdGlvbnMKKyAgICBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqRHVtbXk7CisgICAgcmV0dXJuIGhhc0xvYWRGcm9tU3RhY2tTbG90KE1JLCBEdW1teSwgRnJhbWVJbmRleCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgWDg2SW5zdHJJbmZvOjpoYXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kIComTU1PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICBmb3IgKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIG8gPSBNSS0+bWVtb3BlcmFuZHNfYmVnaW4oKSwKKyAgICAgICAgIG9lID0gTUktPm1lbW9wZXJhbmRzX2VuZCgpOworICAgICAgIG8gIT0gb2U7CisgICAgICAgKytvKSB7CisgICAgaWYgKCgqbyktPmlzTG9hZCgpICYmICgqbyktPmdldFZhbHVlKCkpCisgICAgICBpZiAoY29uc3QgRml4ZWRTdGFja1BzZXVkb1NvdXJjZVZhbHVlICpWYWx1ZSA9CisgICAgICAgICAgZHluX2Nhc3Q8Y29uc3QgRml4ZWRTdGFja1BzZXVkb1NvdXJjZVZhbHVlPigoKm8pLT5nZXRWYWx1ZSgpKSkgeworICAgICAgICBGcmFtZUluZGV4ID0gVmFsdWUtPmdldEZyYW1lSW5kZXgoKTsKKyAgICAgICAgTU1PID0gKm87CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordW5zaWduZWQgWDg2SW5zdHJJbmZvOjppc1N0b3JlVG9TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICBpZiAoaXNGcmFtZVN0b3JlT3Bjb2RlKE1JLT5nZXRPcGNvZGUoKSkpCisgICAgaWYgKE1JLT5nZXRPcGVyYW5kKFg4Njo6QWRkck51bU9wZXJhbmRzKS5nZXRTdWJSZWcoKSA9PSAwICYmCisgICAgICAgIGlzRnJhbWVPcGVyYW5kKE1JLCAwLCBGcmFtZUluZGV4KSkKKyAgICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZChYODY6OkFkZHJOdW1PcGVyYW5kcykuZ2V0UmVnKCk7CisgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBYODZJbnN0ckluZm86OmlzU3RvcmVUb1N0YWNrU2xvdFBvc3RGRShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgIGlmIChpc0ZyYW1lU3RvcmVPcGNvZGUoTUktPmdldE9wY29kZSgpKSkgeworICAgIHVuc2lnbmVkIFJlZzsKKyAgICBpZiAoKFJlZyA9IGlzU3RvcmVUb1N0YWNrU2xvdChNSSwgRnJhbWVJbmRleCkpKQorICAgICAgcmV0dXJuIFJlZzsKKyAgICAvLyBDaGVjayBmb3IgcG9zdC1mcmFtZSBpbmRleCBlbGltaW5hdGlvbiBvcGVyYXRpb25zCisgICAgY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgKkR1bW15OworICAgIHJldHVybiBoYXNTdG9yZVRvU3RhY2tTbG90KE1JLCBEdW1teSwgRnJhbWVJbmRleCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgWDg2SW5zdHJJbmZvOjpoYXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqJk1NTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICBmb3IgKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIG8gPSBNSS0+bWVtb3BlcmFuZHNfYmVnaW4oKSwKKyAgICAgICAgIG9lID0gTUktPm1lbW9wZXJhbmRzX2VuZCgpOworICAgICAgIG8gIT0gb2U7CisgICAgICAgKytvKSB7CisgICAgaWYgKCgqbyktPmlzU3RvcmUoKSAmJiAoKm8pLT5nZXRWYWx1ZSgpKQorICAgICAgaWYgKGNvbnN0IEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZSAqVmFsdWUgPQorICAgICAgICAgIGR5bl9jYXN0PGNvbnN0IEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZT4oKCpvKS0+Z2V0VmFsdWUoKSkpIHsKKyAgICAgICAgRnJhbWVJbmRleCA9IFZhbHVlLT5nZXRGcmFtZUluZGV4KCk7CisgICAgICAgIE1NTyA9ICpvOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyByZWdJc1BJQ0Jhc2UgLSBSZXR1cm4gdHJ1ZSBpZiByZWdpc3RlciBpcyBQSUMgYmFzZSAoaS5lLmcgZGVmaW5lZCBieQorLy8vIFg4Njo6TU9WUEMzMnIuCitzdGF0aWMgYm9vbCByZWdJc1BJQ0Jhc2UodW5zaWduZWQgQmFzZVJlZywgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKSB7CisgIGJvb2wgaXNQSUNCYXNlID0gZmFsc2U7CisgIGZvciAoTWFjaGluZVJlZ2lzdGVySW5mbzo6ZGVmX2l0ZXJhdG9yIEkgPSBNUkkuZGVmX2JlZ2luKEJhc2VSZWcpLAorICAgICAgICAgRSA9IE1SSS5kZWZfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgTWFjaGluZUluc3RyICpEZWZNSSA9IEkuZ2V0T3BlcmFuZCgpLmdldFBhcmVudCgpOworICAgIGlmIChEZWZNSS0+Z2V0T3Bjb2RlKCkgIT0gWDg2OjpNT1ZQQzMycikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhc3NlcnQoIWlzUElDQmFzZSAmJiAiTW9yZSB0aGFuIG9uZSBQSUMgYmFzZT8iKTsKKyAgICBpc1BJQ0Jhc2UgPSB0cnVlOworICB9CisgIHJldHVybiBpc1BJQ0Jhc2U7Cit9CisKK2Jvb2wKK1g4Nkluc3RySW5mbzo6aXNSZWFsbHlUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICpBQSkgY29uc3QgeworICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIFg4Njo6TU9WOHJtOgorICAgIGNhc2UgWDg2OjpNT1YxNnJtOgorICAgIGNhc2UgWDg2OjpNT1YzMnJtOgorICAgIGNhc2UgWDg2OjpNT1Y2NHJtOgorICAgIGNhc2UgWDg2OjpMRF9GcDY0bToKKyAgICBjYXNlIFg4Njo6TU9WU1NybToKKyAgICBjYXNlIFg4Njo6TU9WU0RybToKKyAgICBjYXNlIFg4Njo6TU9WQVBTcm06CisgICAgY2FzZSBYODY6Ok1PVlVQU3JtOgorICAgIGNhc2UgWDg2OjpNT1ZVUFNybV9JbnQ6CisgICAgY2FzZSBYODY6Ok1PVkFQRHJtOgorICAgIGNhc2UgWDg2OjpNT1ZEUUFybToKKyAgICBjYXNlIFg4Njo6TU1YX01PVkQ2NHJtOgorICAgIGNhc2UgWDg2OjpNTVhfTU9WUTY0cm06CisgICAgY2FzZSBYODY6OkZzTU9WQVBTcm06CisgICAgY2FzZSBYODY6OkZzTU9WQVBEcm06IHsKKyAgICAgIC8vIExvYWRzIGZyb20gY29uc3RhbnQgcG9vbHMgYXJlIHRyaXZpYWxseSByZW1hdGVyaWFsaXphYmxlLgorICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDEpLmlzUmVnKCkgJiYKKyAgICAgICAgICBNSS0+Z2V0T3BlcmFuZCgyKS5pc0ltbSgpICYmCisgICAgICAgICAgTUktPmdldE9wZXJhbmQoMykuaXNSZWcoKSAmJiBNSS0+Z2V0T3BlcmFuZCgzKS5nZXRSZWcoKSA9PSAwICYmCisgICAgICAgICAgTUktPmlzSW52YXJpYW50TG9hZChBQSkpIHsKKyAgICAgICAgdW5zaWduZWQgQmFzZVJlZyA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgICAgICBpZiAoQmFzZVJlZyA9PSAwIHx8IEJhc2VSZWcgPT0gWDg2OjpSSVApCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIEFsbG93IHJlLW1hdGVyaWFsaXphdGlvbiBvZiBQSUMgbG9hZC4KKyAgICAgICAgaWYgKCFSZU1hdFBJQ1N0dWJMb2FkICYmIE1JLT5nZXRPcGVyYW5kKDQpLmlzR2xvYmFsKCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1JLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSA9IE1GLmdldFJlZ0luZm8oKTsKKyAgICAgICAgYm9vbCBpc1BJQ0Jhc2UgPSBmYWxzZTsKKyAgICAgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpkZWZfaXRlcmF0b3IgSSA9IE1SSS5kZWZfYmVnaW4oQmFzZVJlZyksCisgICAgICAgICAgICAgICBFID0gTVJJLmRlZl9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgICBNYWNoaW5lSW5zdHIgKkRlZk1JID0gSS5nZXRPcGVyYW5kKCkuZ2V0UGFyZW50KCk7CisgICAgICAgICAgaWYgKERlZk1JLT5nZXRPcGNvZGUoKSAhPSBYODY6Ok1PVlBDMzJyKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGFzc2VydCghaXNQSUNCYXNlICYmICJNb3JlIHRoYW4gb25lIFBJQyBiYXNlPyIpOworICAgICAgICAgIGlzUElDQmFzZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlzUElDQmFzZTsKKyAgICAgIH0gCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorIAorICAgICBjYXNlIFg4Njo6TEVBMzJyOgorICAgICBjYXNlIFg4Njo6TEVBNjRyOiB7CisgICAgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDIpLmlzSW1tKCkgJiYKKyAgICAgICAgICAgTUktPmdldE9wZXJhbmQoMykuaXNSZWcoKSAmJiBNSS0+Z2V0T3BlcmFuZCgzKS5nZXRSZWcoKSA9PSAwICYmCisgICAgICAgICAgICFNSS0+Z2V0T3BlcmFuZCg0KS5pc1JlZygpKSB7CisgICAgICAgICAvLyBsZWEgZmkjLCBsZWEgR1YsIGV0Yy4gYXJlIGFsbCByZW1hdGVyaWFsaXphYmxlLgorICAgICAgICAgaWYgKCFNSS0+Z2V0T3BlcmFuZCgxKS5pc1JlZygpKQorICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgIHVuc2lnbmVkIEJhc2VSZWcgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICAgICAgIGlmIChCYXNlUmVnID09IDApCisgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgLy8gQWxsb3cgcmUtbWF0ZXJpYWxpemF0aW9uIG9mIGxlYSBQSUNCYXNlICsgeC4KKyAgICAgICAgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSA9IE1GLmdldFJlZ0luZm8oKTsKKyAgICAgICAgIHJldHVybiByZWdJc1BJQ0Jhc2UoQmFzZVJlZywgTVJJKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgICB9CisgIH0KKworICAvLyBBbGwgb3RoZXIgaW5zdHJ1Y3Rpb25zIG1hcmtlZCBNX1JFTUFURVJJQUxJWkFCTEUgYXJlIGFsd2F5cyB0cml2aWFsbHkKKyAgLy8gcmVtYXRlcmlhbGl6YWJsZS4KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1NhZmVUb0Nsb2JiZXJFRkxBR1MgLSBSZXR1cm4gdHJ1ZSBpZiBpdCdzIHNhZmUgaW5zZXJ0IGFuIGluc3RydWN0aW9uIHRoYXQKKy8vLyB3b3VsZCBjbG9iYmVyIHRoZSBFRkxBR1MgY29uZGl0aW9uIHJlZ2lzdGVyLiBOb3RlIHRoZSByZXN1bHQgbWF5IGJlCisvLy8gY29uc2VydmF0aXZlLiBJZiBpdCBjYW5ub3QgZGVmaW5pdGVseSBkZXRlcm1pbmUgdGhlIHNhZmV0eSBhZnRlciB2aXNpdGluZworLy8vIGEgZmV3IGluc3RydWN0aW9ucyBpbiBlYWNoIGRpcmVjdGlvbiBpdCBhc3N1bWVzIGl0J3Mgbm90IHNhZmUuCitzdGF0aWMgYm9vbCBpc1NhZmVUb0Nsb2JiZXJFRkxBR1MoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgeworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRSA9IE1CQi5lbmQoKTsKKworICAvLyBJdCdzIGFsd2F5cyBzYWZlIHRvIGNsb2JiZXIgRUZMQUdTIGF0IHRoZSBlbmQgb2YgYSBibG9jay4KKyAgaWYgKEkgPT0gRSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBGb3IgY29tcGlsZSB0aW1lIGNvbnNpZGVyYXRpb24sIGlmIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlCisgIC8vIHNhZmV0eSBhZnRlciB2aXNpdGluZyA0IGluc3RydWN0aW9ucyBpbiBlYWNoIGRpcmVjdGlvbiwgd2Ugd2lsbCBhc3N1bWUKKyAgLy8gaXQncyBub3Qgc2FmZS4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEl0ZXIgPSBJOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgYm9vbCBTZWVuRGVmID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZSA9IEl0ZXItPmdldE51bU9wZXJhbmRzKCk7IGogIT0gZTsgKytqKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJdGVyLT5nZXRPcGVyYW5kKGopOworICAgICAgaWYgKCFNTy5pc1JlZygpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChNTy5nZXRSZWcoKSA9PSBYODY6OkVGTEFHUykgeworICAgICAgICBpZiAoTU8uaXNVc2UoKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIFNlZW5EZWYgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChTZWVuRGVmKQorICAgICAgLy8gVGhpcyBpbnN0cnVjdGlvbiBkZWZpbmVzIEVGTEFHUywgbm8gbmVlZCB0byBsb29rIGFueSBmdXJ0aGVyLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgKytJdGVyOworICAgIC8vIFNraXAgb3ZlciBEQkdfVkFMVUUuCisgICAgd2hpbGUgKEl0ZXIgIT0gRSAmJiBJdGVyLT5pc0RlYnVnVmFsdWUoKSkKKyAgICAgICsrSXRlcjsKKworICAgIC8vIElmIHdlIG1ha2UgaXQgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGl0J3Mgc2FmZSB0byBjbG9iYmVyIEVGTEFHUy4KKyAgICBpZiAoSXRlciA9PSBFKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQiA9IE1CQi5iZWdpbigpOworICBJdGVyID0gSTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIC8vIElmIHdlIG1ha2UgaXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2ssIGl0J3Mgc2FmZSB0byBjbG9iYmVyCisgICAgLy8gRUZMQUdTIGlmZiBFRkxBR1MgaXMgbm90IGxpdmUtaW4uCisgICAgaWYgKEl0ZXIgPT0gQikKKyAgICAgIHJldHVybiAhTUJCLmlzTGl2ZUluKFg4Njo6RUZMQUdTKTsKKworICAgIC0tSXRlcjsKKyAgICAvLyBTa2lwIG92ZXIgREJHX1ZBTFVFLgorICAgIHdoaWxlIChJdGVyICE9IEIgJiYgSXRlci0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgICAtLUl0ZXI7CisKKyAgICBib29sIFNhd0tpbGwgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gSXRlci0+Z2V0TnVtT3BlcmFuZHMoKTsgaiAhPSBlOyArK2opIHsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IEl0ZXItPmdldE9wZXJhbmQoaik7CisgICAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5nZXRSZWcoKSA9PSBYODY6OkVGTEFHUykgeworICAgICAgICBpZiAoTU8uaXNEZWYoKSkgcmV0dXJuIE1PLmlzRGVhZCgpOworICAgICAgICBpZiAoTU8uaXNLaWxsKCkpIFNhd0tpbGwgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChTYXdLaWxsKQorICAgICAgLy8gVGhpcyBpbnN0cnVjdGlvbiBraWxscyBFRkxBR1MgYW5kIGRvZXNuJ3QgcmVkZWZpbmUgaXQsIHNvCisgICAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gbG9vayBmdXJ0aGVyLgorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDb25zZXJ2YXRpdmUgYW5zd2VyLgorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgWDg2SW5zdHJJbmZvOjpyZU1hdGVyaWFsaXplKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAqT3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdCB7CisgIERlYnVnTG9jIERMID0gT3JpZy0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBNT1YzMnIwIGV0Yy4gYXJlIGltcGxlbWVudGVkIHdpdGggeG9yIHdoaWNoIGNsb2JiZXJzIGNvbmRpdGlvbiBjb2RlLgorICAvLyBSZS1tYXRlcmlhbGl6ZSB0aGVtIGFzIG1vdnJpIGluc3RydWN0aW9ucyB0byBhdm9pZCBzaWRlIGVmZmVjdHMuCisgIGJvb2wgQ2xvbmUgPSB0cnVlOworICB1bnNpZ25lZCBPcGMgPSBPcmlnLT5nZXRPcGNvZGUoKTsKKyAgc3dpdGNoIChPcGMpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgWDg2OjpNT1Y4cjA6CisgIGNhc2UgWDg2OjpNT1YxNnIwOgorICBjYXNlIFg4Njo6TU9WMzJyMDoKKyAgY2FzZSBYODY6Ok1PVjY0cjA6IHsKKyAgICBpZiAoIWlzU2FmZVRvQ2xvYmJlckVGTEFHUyhNQkIsIEkpKSB7CisgICAgICBzd2l0Y2ggKE9wYykgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlIFg4Njo6TU9WOHIwOiAgT3BjID0gWDg2OjpNT1Y4cmk7ICBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpNT1YxNnIwOiBPcGMgPSBYODY6Ok1PVjE2cmk7IGJyZWFrOworICAgICAgY2FzZSBYODY6Ok1PVjMycjA6IE9wYyA9IFg4Njo6TU9WMzJyaTsgYnJlYWs7CisgICAgICBjYXNlIFg4Njo6TU9WNjRyMDogT3BjID0gWDg2OjpNT1Y2NHJpNjRpMzI7IGJyZWFrOworICAgICAgfQorICAgICAgQ2xvbmUgPSBmYWxzZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgfQorCisgIGlmIChDbG9uZSkgeworICAgIE1hY2hpbmVJbnN0ciAqTUkgPSBNQkIuZ2V0UGFyZW50KCktPkNsb25lTWFjaGluZUluc3RyKE9yaWcpOworICAgIE1CQi5pbnNlcnQoSSwgTUkpOworICB9IGVsc2UgeworICAgIEJ1aWxkTUkoTUJCLCBJLCBETCwgZ2V0KE9wYykpLmFkZE9wZXJhbmQoT3JpZy0+Z2V0T3BlcmFuZCgwKSkuYWRkSW1tKDApOworICB9CisKKyAgTWFjaGluZUluc3RyICpOZXdNSSA9IHByaW9yKEkpOworICBOZXdNSS0+c3Vic3RpdHV0ZVJlZ2lzdGVyKE9yaWctPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCksIERlc3RSZWcsIFN1YklkeCwgVFJJKTsKK30KKworLy8vIGhhc0xpdmVDb25kQ29kZURlZiAtIFRydWUgaWYgTUkgaGFzIGEgY29uZGl0aW9uIGNvZGUgZGVmLCBlLmcuIEVGTEFHUywgdGhhdAorLy8vIGlzIG5vdCBtYXJrZWQgZGVhZC4KK3N0YXRpYyBib29sIGhhc0xpdmVDb25kQ29kZURlZihNYWNoaW5lSW5zdHIgKk1JKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoTU8uaXNSZWcoKSAmJiBNTy5pc0RlZigpICYmCisgICAgICAgIE1PLmdldFJlZygpID09IFg4Njo6RUZMQUdTICYmICFNTy5pc0RlYWQoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGNvbnZlcnRUb1RocmVlQWRkcmVzc1dpdGhMRUEgLSBIZWxwZXIgZm9yIGNvbnZlcnRUb1RocmVlQWRkcmVzcyB3aGVuCisvLy8gMTYtYml0IExFQSBpcyBkaXNhYmxlZCwgdXNlIDMyLWJpdCBMRUEgdG8gZm9ybSAzLWFkZHJlc3MgY29kZSBieSBwcm9tb3RpbmcKKy8vLyB0byBhIDMyLWJpdCBzdXBlcnJlZ2lzdGVyIGFuZCB0aGVuIHRydW5jYXRpbmcgYmFjayBkb3duIHRvIGEgMTYtYml0CisvLy8gc3VicmVnaXN0ZXIuCitNYWNoaW5lSW5zdHIgKgorWDg2SW5zdHJJbmZvOjpjb252ZXJ0VG9UaHJlZUFkZHJlc3NXaXRoTEVBKHVuc2lnbmVkIE1JT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgJk1GSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVZhcmlhYmxlcyAqTFYpIGNvbnN0IHsKKyAgTWFjaGluZUluc3RyICpNSSA9IE1CQkk7CisgIHVuc2lnbmVkIERlc3QgPSBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgdW5zaWduZWQgU3JjID0gTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgIGJvb2wgaXNEZWFkID0gTUktPmdldE9wZXJhbmQoMCkuaXNEZWFkKCk7CisgIGJvb2wgaXNLaWxsID0gTUktPmdldE9wZXJhbmQoMSkuaXNLaWxsKCk7CisKKyAgdW5zaWduZWQgT3BjID0gVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5pczY0Qml0KCkKKyAgICA/IFg4Njo6TEVBNjRfMzJyIDogWDg2OjpMRUEzMnI7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8gPSBNRkktPmdldFBhcmVudCgpLT5nZXRSZWdJbmZvKCk7CisgIHVuc2lnbmVkIGxlYUluUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoJlg4Njo6R1IzMlJlZ0NsYXNzKTsKKyAgdW5zaWduZWQgbGVhT3V0UmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoJlg4Njo6R1IzMlJlZ0NsYXNzKTsKKyAgICAgICAgICAgIAorICAvLyBCdWlsZCBhbmQgaW5zZXJ0IGludG8gYW4gaW1wbGljaXQgVU5ERUYgdmFsdWUuIFRoaXMgaXMgT0sgYmVjYXVzZQorICAvLyB3ZWxsIGJlIHNoaWZ0aW5nIGFuZCB0aGVuIGV4dHJhY3RpbmcgdGhlIGxvd2VyIDE2LWJpdHMuIAorICAvLyBUaGlzIGhhcyB0aGUgcG90ZW50aWFsIHRvIGNhdXNlIHBhcnRpYWwgcmVnaXN0ZXIgc3RhbGwuIGUuZy4KKyAgLy8gICBtb3Z3ICAgICglcmJwLCVyY3gsMiksICVkeAorICAvLyAgIGxlYWwgICAgLTY1KCVyZHgpLCAlZXNpCisgIC8vIEJ1dCB0ZXN0aW5nIGhhcyBzaG93biB0aGlzICpkb2VzKiBoZWxwIHBlcmZvcm1hbmNlIGluIDY0LWJpdCBtb2RlIChhdAorICAvLyBsZWFzdCBvbiBtb2Rlcm4geDg2IG1hY2hpbmVzKS4KKyAgQnVpbGRNSSgqTUZJLCBNQkJJLCBNSS0+Z2V0RGVidWdMb2MoKSwgZ2V0KFg4Njo6SU1QTElDSVRfREVGKSwgbGVhSW5SZWcpOworICBNYWNoaW5lSW5zdHIgKkluc01JID0KKyAgICBCdWlsZE1JKCpNRkksIE1CQkksIE1JLT5nZXREZWJ1Z0xvYygpLCBnZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSkKKyAgICAuYWRkUmVnKGxlYUluUmVnLCBSZWdTdGF0ZTo6RGVmaW5lLCBYODY6OnN1Yl8xNmJpdCkKKyAgICAuYWRkUmVnKFNyYywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpOworCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSSgqTUZJLCBNQkJJLCBNSS0+Z2V0RGVidWdMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldChPcGMpLCBsZWFPdXRSZWcpOworICBzd2l0Y2ggKE1JT3BjKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgICBicmVhazsKKyAgY2FzZSBYODY6OlNITDE2cmk6IHsKKyAgICB1bnNpZ25lZCBTaEFtdCA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgIE1JQi5hZGRSZWcoMCkuYWRkSW1tKDEgPDwgU2hBbXQpCisgICAgICAgLmFkZFJlZyhsZWFJblJlZywgUmVnU3RhdGU6OktpbGwpLmFkZEltbSgwKS5hZGRSZWcoMCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBYODY6OklOQzE2cjoKKyAgY2FzZSBYODY6OklOQzY0XzE2cjoKKyAgICBhZGRSZWdPZmZzZXQoTUlCLCBsZWFJblJlZywgdHJ1ZSwgMSk7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2OjpERUMxNnI6CisgIGNhc2UgWDg2OjpERUM2NF8xNnI6CisgICAgYWRkUmVnT2Zmc2V0KE1JQiwgbGVhSW5SZWcsIHRydWUsIC0xKTsKKyAgICBicmVhazsKKyAgY2FzZSBYODY6OkFERDE2cmk6CisgIGNhc2UgWDg2OjpBREQxNnJpODoKKyAgICBhZGRSZWdPZmZzZXQoTUlCLCBsZWFJblJlZywgdHJ1ZSwgTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCkpOyAgICAKKyAgICBicmVhazsKKyAgY2FzZSBYODY6OkFERDE2cnI6IHsKKyAgICB1bnNpZ25lZCBTcmMyID0gTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCk7CisgICAgYm9vbCBpc0tpbGwyID0gTUktPmdldE9wZXJhbmQoMikuaXNLaWxsKCk7CisgICAgdW5zaWduZWQgbGVhSW5SZWcyID0gMDsKKyAgICBNYWNoaW5lSW5zdHIgKkluc01JMiA9IDA7CisgICAgaWYgKFNyYyA9PSBTcmMyKSB7CisgICAgICAvLyBBREQxNnJyICVyZWcxMDI4PGtpbGw+LCAlcmVnMTAyOAorICAgICAgLy8ganVzdCBhIHNpbmdsZSBpbnNlcnRfc3VicmVnLgorICAgICAgYWRkUmVnUmVnKE1JQiwgbGVhSW5SZWcsIHRydWUsIGxlYUluUmVnLCBmYWxzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxlYUluUmVnMiA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKCZYODY6OkdSMzJSZWdDbGFzcyk7CisgICAgICAvLyBCdWlsZCBhbmQgaW5zZXJ0IGludG8gYW4gaW1wbGljaXQgVU5ERUYgdmFsdWUuIFRoaXMgaXMgT0sgYmVjYXVzZQorICAgICAgLy8gd2VsbCBiZSBzaGlmdGluZyBhbmQgdGhlbiBleHRyYWN0aW5nIHRoZSBsb3dlciAxNi1iaXRzLiAKKyAgICAgIEJ1aWxkTUkoKk1GSSwgTUlCLCBNSS0+Z2V0RGVidWdMb2MoKSwgZ2V0KFg4Njo6SU1QTElDSVRfREVGKSwgbGVhSW5SZWcyKTsKKyAgICAgIEluc01JMiA9CisgICAgICAgIEJ1aWxkTUkoKk1GSSwgTUlCLCBNSS0+Z2V0RGVidWdMb2MoKSwgZ2V0KFRhcmdldE9wY29kZTo6Q09QWSkpCisgICAgICAgIC5hZGRSZWcobGVhSW5SZWcyLCBSZWdTdGF0ZTo6RGVmaW5lLCBYODY6OnN1Yl8xNmJpdCkKKyAgICAgICAgLmFkZFJlZyhTcmMyLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsMikpOworICAgICAgYWRkUmVnUmVnKE1JQiwgbGVhSW5SZWcsIHRydWUsIGxlYUluUmVnMiwgdHJ1ZSk7CisgICAgfQorICAgIGlmIChMViAmJiBpc0tpbGwyICYmIEluc01JMikKKyAgICAgIExWLT5yZXBsYWNlS2lsbEluc3RydWN0aW9uKFNyYzIsIE1JLCBJbnNNSTIpOworICAgIGJyZWFrOworICB9CisgIH0KKworICBNYWNoaW5lSW5zdHIgKk5ld01JID0gTUlCOworICBNYWNoaW5lSW5zdHIgKkV4dE1JID0KKyAgICBCdWlsZE1JKCpNRkksIE1CQkksIE1JLT5nZXREZWJ1Z0xvYygpLCBnZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSkKKyAgICAuYWRkUmVnKERlc3QsIFJlZ1N0YXRlOjpEZWZpbmUgfCBnZXREZWFkUmVnU3RhdGUoaXNEZWFkKSkKKyAgICAuYWRkUmVnKGxlYU91dFJlZywgUmVnU3RhdGU6OktpbGwsIFg4Njo6c3ViXzE2Yml0KTsKKworICBpZiAoTFYpIHsKKyAgICAvLyBVcGRhdGUgbGl2ZSB2YXJpYWJsZXMKKyAgICBMVi0+Z2V0VmFySW5mbyhsZWFJblJlZykuS2lsbHMucHVzaF9iYWNrKE5ld01JKTsKKyAgICBMVi0+Z2V0VmFySW5mbyhsZWFPdXRSZWcpLktpbGxzLnB1c2hfYmFjayhFeHRNSSk7CisgICAgaWYgKGlzS2lsbCkKKyAgICAgIExWLT5yZXBsYWNlS2lsbEluc3RydWN0aW9uKFNyYywgTUksIEluc01JKTsKKyAgICBpZiAoaXNEZWFkKQorICAgICAgTFYtPnJlcGxhY2VLaWxsSW5zdHJ1Y3Rpb24oRGVzdCwgTUksIEV4dE1JKTsKKyAgfQorCisgIHJldHVybiBFeHRNSTsKK30KKworLy8vIGNvbnZlcnRUb1RocmVlQWRkcmVzcyAtIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0CisvLy8gc2V0IHRoZSBNX0NPTlZFUlRJQkxFX1RPXzNfQUREUiBmbGFnLiAgV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgdGFyZ2V0CisvLy8gbWF5IGJlIGFibGUgdG8gY29udmVydCBhIHR3by1hZGRyZXNzIGluc3RydWN0aW9uIGludG8gYSB0cnVlCisvLy8gdGhyZWUtYWRkcmVzcyBpbnN0cnVjdGlvbiBvbiBkZW1hbmQuICBUaGlzIGFsbG93cyB0aGUgWDg2IHRhcmdldCAoZm9yCisvLy8gZXhhbXBsZSkgdG8gY29udmVydCBBREQgYW5kIFNITCBpbnN0cnVjdGlvbnMgaW50byBMRUEgaW5zdHJ1Y3Rpb25zIGlmIHRoZXkKKy8vLyB3b3VsZCByZXF1aXJlIHJlZ2lzdGVyIGNvcGllcyBkdWUgdG8gdHdvLWFkZHJlc3NuZXNzLgorLy8vCisvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIG51bGwgcG9pbnRlciBpZiB0aGUgdHJhbnNmb3JtYXRpb24gY2Fubm90IGJlCisvLy8gcGVyZm9ybWVkLCBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgbmV3IGluc3RydWN0aW9uLgorLy8vCitNYWNoaW5lSW5zdHIgKgorWDg2SW5zdHJJbmZvOjpjb252ZXJ0VG9UaHJlZUFkZHJlc3MoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciAmTUZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVZhcmlhYmxlcyAqTFYpIGNvbnN0IHsKKyAgTWFjaGluZUluc3RyICpNSSA9IE1CQkk7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgLy8gQWxsIGluc3RydWN0aW9ucyBpbnB1dCBhcmUgdHdvLWFkZHIgaW5zdHJ1Y3Rpb25zLiAgR2V0IHRoZSBrbm93biBvcGVyYW5kcy4KKyAgdW5zaWduZWQgRGVzdCA9IE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICB1bnNpZ25lZCBTcmMgPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgYm9vbCBpc0RlYWQgPSBNSS0+Z2V0T3BlcmFuZCgwKS5pc0RlYWQoKTsKKyAgYm9vbCBpc0tpbGwgPSBNSS0+Z2V0T3BlcmFuZCgxKS5pc0tpbGwoKTsKKworICBNYWNoaW5lSW5zdHIgKk5ld01JID0gTlVMTDsKKyAgLy8gRklYTUU6IDE2LWJpdCBMRUEncyBhcmUgcmVhbGx5IHNsb3cgb24gQXRobG9ucywgYnV0IG5vdCBiYWQgb24gUDQncy4gIFdoZW4KKyAgLy8gd2UgaGF2ZSBiZXR0ZXIgc3VidGFyZ2V0IHN1cHBvcnQsIGVuYWJsZSB0aGUgMTYtYml0IExFQSBnZW5lcmF0aW9uIGhlcmUuCisgIC8vIDE2LWJpdCBMRUEgaXMgYWxzbyBzbG93IG9uIENvcmUyLgorICBib29sIERpc2FibGVMRUExNiA9IHRydWU7CisgIGJvb2wgaXM2NEJpdCA9IFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXM2NEJpdCgpOworCisgIHVuc2lnbmVkIE1JT3BjID0gTUktPmdldE9wY29kZSgpOworICBzd2l0Y2ggKE1JT3BjKSB7CisgIGNhc2UgWDg2OjpTSFVGUFNycmk6IHsKKyAgICBhc3NlcnQoTUktPmdldE51bU9wZXJhbmRzKCkgPT0gNCAmJiAiVW5rbm93biBzaHVmcHMgaW5zdHJ1Y3Rpb24hIik7CisgICAgaWYgKCFUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmhhc1NTRTIoKSkgcmV0dXJuIDA7CisgICAgCisgICAgdW5zaWduZWQgQiA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgIHVuc2lnbmVkIEMgPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKTsKKyAgICBpZiAoQiAhPSBDKSByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBBID0gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgdW5zaWduZWQgTSA9IE1JLT5nZXRPcGVyYW5kKDMpLmdldEltbSgpOworICAgIE5ld01JID0gQnVpbGRNSShNRiwgTUktPmdldERlYnVnTG9jKCksIGdldChYODY6OlBTSFVGRHJpKSkKKyAgICAgIC5hZGRSZWcoQSwgUmVnU3RhdGU6OkRlZmluZSB8IGdldERlYWRSZWdTdGF0ZShpc0RlYWQpKQorICAgICAgLmFkZFJlZyhCLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkuYWRkSW1tKE0pOworICAgIGJyZWFrOworICB9CisgIGNhc2UgWDg2OjpTSEw2NHJpOiB7CisgICAgYXNzZXJ0KE1JLT5nZXROdW1PcGVyYW5kcygpID49IDMgJiYgIlVua25vd24gc2hpZnQgaW5zdHJ1Y3Rpb24hIik7CisgICAgLy8gTk9URTogTEVBIGRvZXNuJ3QgcHJvZHVjZSBmbGFncyBsaWtlIHNoaWZ0IGRvZXMsIGJ1dCBMTFZNIG5ldmVyIHVzZXMKKyAgICAvLyB0aGUgZmxhZ3MgcHJvZHVjZWQgYnkgYSBzaGlmdCB5ZXQsIHNvIHRoaXMgaXMgc2FmZS4KKyAgICB1bnNpZ25lZCBTaEFtdCA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgIGlmIChTaEFtdCA9PSAwIHx8IFNoQW10ID49IDQpIHJldHVybiAwOworCisgICAgTmV3TUkgPSBCdWlsZE1JKE1GLCBNSS0+Z2V0RGVidWdMb2MoKSwgZ2V0KFg4Njo6TEVBNjRyKSkKKyAgICAgIC5hZGRSZWcoRGVzdCwgUmVnU3RhdGU6OkRlZmluZSB8IGdldERlYWRSZWdTdGF0ZShpc0RlYWQpKQorICAgICAgLmFkZFJlZygwKS5hZGRJbW0oMSA8PCBTaEFtdCkKKyAgICAgIC5hZGRSZWcoU3JjLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAgIC5hZGRJbW0oMCkuYWRkUmVnKDApOworICAgIGJyZWFrOworICB9CisgIGNhc2UgWDg2OjpTSEwzMnJpOiB7CisgICAgYXNzZXJ0KE1JLT5nZXROdW1PcGVyYW5kcygpID49IDMgJiYgIlVua25vd24gc2hpZnQgaW5zdHJ1Y3Rpb24hIik7CisgICAgLy8gTk9URTogTEVBIGRvZXNuJ3QgcHJvZHVjZSBmbGFncyBsaWtlIHNoaWZ0IGRvZXMsIGJ1dCBMTFZNIG5ldmVyIHVzZXMKKyAgICAvLyB0aGUgZmxhZ3MgcHJvZHVjZWQgYnkgYSBzaGlmdCB5ZXQsIHNvIHRoaXMgaXMgc2FmZS4KKyAgICB1bnNpZ25lZCBTaEFtdCA9IE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgIGlmIChTaEFtdCA9PSAwIHx8IFNoQW10ID49IDQpIHJldHVybiAwOworCisgICAgdW5zaWduZWQgT3BjID0gaXM2NEJpdCA/IFg4Njo6TEVBNjRfMzJyIDogWDg2OjpMRUEzMnI7CisgICAgTmV3TUkgPSBCdWlsZE1JKE1GLCBNSS0+Z2V0RGVidWdMb2MoKSwgZ2V0KE9wYykpCisgICAgICAuYWRkUmVnKERlc3QsIFJlZ1N0YXRlOjpEZWZpbmUgfCBnZXREZWFkUmVnU3RhdGUoaXNEZWFkKSkKKyAgICAgIC5hZGRSZWcoMCkuYWRkSW1tKDEgPDwgU2hBbXQpCisgICAgICAuYWRkUmVnKFNyYywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpLmFkZEltbSgwKS5hZGRSZWcoMCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBYODY6OlNITDE2cmk6IHsKKyAgICBhc3NlcnQoTUktPmdldE51bU9wZXJhbmRzKCkgPj0gMyAmJiAiVW5rbm93biBzaGlmdCBpbnN0cnVjdGlvbiEiKTsKKyAgICAvLyBOT1RFOiBMRUEgZG9lc24ndCBwcm9kdWNlIGZsYWdzIGxpa2Ugc2hpZnQgZG9lcywgYnV0IExMVk0gbmV2ZXIgdXNlcworICAgIC8vIHRoZSBmbGFncyBwcm9kdWNlZCBieSBhIHNoaWZ0IHlldCwgc28gdGhpcyBpcyBzYWZlLgorICAgIHVuc2lnbmVkIFNoQW10ID0gTUktPmdldE9wZXJhbmQoMikuZ2V0SW1tKCk7CisgICAgaWYgKFNoQW10ID09IDAgfHwgU2hBbXQgPj0gNCkgcmV0dXJuIDA7CisKKyAgICBpZiAoRGlzYWJsZUxFQTE2KQorICAgICAgcmV0dXJuIGlzNjRCaXQgPyBjb252ZXJ0VG9UaHJlZUFkZHJlc3NXaXRoTEVBKE1JT3BjLCBNRkksIE1CQkksIExWKSA6IDA7CisgICAgTmV3TUkgPSBCdWlsZE1JKE1GLCBNSS0+Z2V0RGVidWdMb2MoKSwgZ2V0KFg4Njo6TEVBMTZyKSkKKyAgICAgIC5hZGRSZWcoRGVzdCwgUmVnU3RhdGU6OkRlZmluZSB8IGdldERlYWRSZWdTdGF0ZShpc0RlYWQpKQorICAgICAgLmFkZFJlZygwKS5hZGRJbW0oMSA8PCBTaEFtdCkKKyAgICAgIC5hZGRSZWcoU3JjLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSkKKyAgICAgIC5hZGRJbW0oMCkuYWRkUmVnKDApOworICAgIGJyZWFrOworICB9CisgIGRlZmF1bHQ6IHsKKyAgICAvLyBUaGUgZm9sbG93aW5nIG9wY29kZXMgYWxzbyBzZXRzIHRoZSBjb25kaXRpb24gY29kZSByZWdpc3RlcihzKS4gT25seQorICAgIC8vIGNvbnZlcnQgdGhlbSB0byBlcXVpdmFsZW50IGxlYSBpZiB0aGUgY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXIgZGVmJ3MKKyAgICAvLyBhcmUgZGVhZCEKKyAgICBpZiAoaGFzTGl2ZUNvbmRDb2RlRGVmKE1JKSkKKyAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoIChNSU9wYykgeworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgIGNhc2UgWDg2OjpJTkM2NHI6CisgICAgY2FzZSBYODY6OklOQzMycjoKKyAgICBjYXNlIFg4Njo6SU5DNjRfMzJyOiB7CisgICAgICBhc3NlcnQoTUktPmdldE51bU9wZXJhbmRzKCkgPj0gMiAmJiAiVW5rbm93biBpbmMgaW5zdHJ1Y3Rpb24hIik7CisgICAgICB1bnNpZ25lZCBPcGMgPSBNSU9wYyA9PSBYODY6OklOQzY0ciA/IFg4Njo6TEVBNjRyCisgICAgICAgIDogKGlzNjRCaXQgPyBYODY6OkxFQTY0XzMyciA6IFg4Njo6TEVBMzJyKTsKKyAgICAgIE5ld01JID0gYWRkUmVnT2Zmc2V0KEJ1aWxkTUkoTUYsIE1JLT5nZXREZWJ1Z0xvYygpLCBnZXQoT3BjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoRGVzdCwgUmVnU3RhdGU6OkRlZmluZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlYWRSZWdTdGF0ZShpc0RlYWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYywgaXNLaWxsLCAxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFg4Njo6SU5DMTZyOgorICAgIGNhc2UgWDg2OjpJTkM2NF8xNnI6CisgICAgICBpZiAoRGlzYWJsZUxFQTE2KQorICAgICAgICByZXR1cm4gaXM2NEJpdCA/IGNvbnZlcnRUb1RocmVlQWRkcmVzc1dpdGhMRUEoTUlPcGMsIE1GSSwgTUJCSSwgTFYpIDogMDsKKyAgICAgIGFzc2VydChNSS0+Z2V0TnVtT3BlcmFuZHMoKSA+PSAyICYmICJVbmtub3duIGluYyBpbnN0cnVjdGlvbiEiKTsKKyAgICAgIE5ld01JID0gYWRkUmVnT2Zmc2V0KEJ1aWxkTUkoTUYsIE1JLT5nZXREZWJ1Z0xvYygpLCBnZXQoWDg2OjpMRUExNnIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhEZXN0LCBSZWdTdGF0ZTo6RGVmaW5lIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVhZFJlZ1N0YXRlKGlzRGVhZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjLCBpc0tpbGwsIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYODY6OkRFQzY0cjoKKyAgICBjYXNlIFg4Njo6REVDMzJyOgorICAgIGNhc2UgWDg2OjpERUM2NF8zMnI6IHsKKyAgICAgIGFzc2VydChNSS0+Z2V0TnVtT3BlcmFuZHMoKSA+PSAyICYmICJVbmtub3duIGRlYyBpbnN0cnVjdGlvbiEiKTsKKyAgICAgIHVuc2lnbmVkIE9wYyA9IE1JT3BjID09IFg4Njo6REVDNjRyID8gWDg2OjpMRUE2NHIKKyAgICAgICAgOiAoaXM2NEJpdCA/IFg4Njo6TEVBNjRfMzJyIDogWDg2OjpMRUEzMnIpOworICAgICAgTmV3TUkgPSBhZGRSZWdPZmZzZXQoQnVpbGRNSShNRiwgTUktPmdldERlYnVnTG9jKCksIGdldChPcGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhEZXN0LCBSZWdTdGF0ZTo6RGVmaW5lIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVhZFJlZ1N0YXRlKGlzRGVhZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjLCBpc0tpbGwsIC0xKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFg4Njo6REVDMTZyOgorICAgIGNhc2UgWDg2OjpERUM2NF8xNnI6CisgICAgICBpZiAoRGlzYWJsZUxFQTE2KQorICAgICAgICByZXR1cm4gaXM2NEJpdCA/IGNvbnZlcnRUb1RocmVlQWRkcmVzc1dpdGhMRUEoTUlPcGMsIE1GSSwgTUJCSSwgTFYpIDogMDsKKyAgICAgIGFzc2VydChNSS0+Z2V0TnVtT3BlcmFuZHMoKSA+PSAyICYmICJVbmtub3duIGRlYyBpbnN0cnVjdGlvbiEiKTsKKyAgICAgIE5ld01JID0gYWRkUmVnT2Zmc2V0KEJ1aWxkTUkoTUYsIE1JLT5nZXREZWJ1Z0xvYygpLCBnZXQoWDg2OjpMRUExNnIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhEZXN0LCBSZWdTdGF0ZTo6RGVmaW5lIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVhZFJlZ1N0YXRlKGlzRGVhZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjLCBpc0tpbGwsIC0xKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWDg2OjpBREQ2NHJyOgorICAgIGNhc2UgWDg2OjpBREQzMnJyOiB7CisgICAgICBhc3NlcnQoTUktPmdldE51bU9wZXJhbmRzKCkgPj0gMyAmJiAiVW5rbm93biBhZGQgaW5zdHJ1Y3Rpb24hIik7CisgICAgICB1bnNpZ25lZCBPcGMgPSBNSU9wYyA9PSBYODY6OkFERDY0cnIgPyBYODY6OkxFQTY0cgorICAgICAgICA6IChpczY0Qml0ID8gWDg2OjpMRUE2NF8zMnIgOiBYODY6OkxFQTMycik7CisgICAgICB1bnNpZ25lZCBTcmMyID0gTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCk7CisgICAgICBib29sIGlzS2lsbDIgPSBNSS0+Z2V0T3BlcmFuZCgyKS5pc0tpbGwoKTsKKyAgICAgIE5ld01JID0gYWRkUmVnUmVnKEJ1aWxkTUkoTUYsIE1JLT5nZXREZWJ1Z0xvYygpLCBnZXQoT3BjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoRGVzdCwgUmVnU3RhdGU6OkRlZmluZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlYWRSZWdTdGF0ZShpc0RlYWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNyYywgaXNLaWxsLCBTcmMyLCBpc0tpbGwyKTsKKyAgICAgIGlmIChMViAmJiBpc0tpbGwyKQorICAgICAgICBMVi0+cmVwbGFjZUtpbGxJbnN0cnVjdGlvbihTcmMyLCBNSSwgTmV3TUkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWDg2OjpBREQxNnJyOiB7CisgICAgICBpZiAoRGlzYWJsZUxFQTE2KQorICAgICAgICByZXR1cm4gaXM2NEJpdCA/IGNvbnZlcnRUb1RocmVlQWRkcmVzc1dpdGhMRUEoTUlPcGMsIE1GSSwgTUJCSSwgTFYpIDogMDsKKyAgICAgIGFzc2VydChNSS0+Z2V0TnVtT3BlcmFuZHMoKSA+PSAzICYmICJVbmtub3duIGFkZCBpbnN0cnVjdGlvbiEiKTsKKyAgICAgIHVuc2lnbmVkIFNyYzIgPSBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKTsKKyAgICAgIGJvb2wgaXNLaWxsMiA9IE1JLT5nZXRPcGVyYW5kKDIpLmlzS2lsbCgpOworICAgICAgTmV3TUkgPSBhZGRSZWdSZWcoQnVpbGRNSShNRiwgTUktPmdldERlYnVnTG9jKCksIGdldChYODY6OkxFQTE2cikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKERlc3QsIFJlZ1N0YXRlOjpEZWZpbmUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWFkUmVnU3RhdGUoaXNEZWFkKSksCisgICAgICAgICAgICAgICAgICAgICAgICBTcmMsIGlzS2lsbCwgU3JjMiwgaXNLaWxsMik7CisgICAgICBpZiAoTFYgJiYgaXNLaWxsMikKKyAgICAgICAgTFYtPnJlcGxhY2VLaWxsSW5zdHJ1Y3Rpb24oU3JjMiwgTUksIE5ld01JKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFg4Njo6QURENjRyaTMyOgorICAgIGNhc2UgWDg2OjpBREQ2NHJpODoKKyAgICAgIGFzc2VydChNSS0+Z2V0TnVtT3BlcmFuZHMoKSA+PSAzICYmICJVbmtub3duIGFkZCBpbnN0cnVjdGlvbiEiKTsKKyAgICAgIE5ld01JID0gYWRkUmVnT2Zmc2V0KEJ1aWxkTUkoTUYsIE1JLT5nZXREZWJ1Z0xvYygpLCBnZXQoWDg2OjpMRUE2NHIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZyhEZXN0LCBSZWdTdGF0ZTo6RGVmaW5lIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVhZFJlZ1N0YXRlKGlzRGVhZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjLCBpc0tpbGwsIE1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWDg2OjpBREQzMnJpOgorICAgIGNhc2UgWDg2OjpBREQzMnJpODogeworICAgICAgYXNzZXJ0KE1JLT5nZXROdW1PcGVyYW5kcygpID49IDMgJiYgIlVua25vd24gYWRkIGluc3RydWN0aW9uISIpOworICAgICAgdW5zaWduZWQgT3BjID0gaXM2NEJpdCA/IFg4Njo6TEVBNjRfMzJyIDogWDg2OjpMRUEzMnI7CisgICAgICBOZXdNSSA9IGFkZFJlZ09mZnNldChCdWlsZE1JKE1GLCBNSS0+Z2V0RGVidWdMb2MoKSwgZ2V0KE9wYykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVnKERlc3QsIFJlZ1N0YXRlOjpEZWZpbmUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWFkUmVnU3RhdGUoaXNEZWFkKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYywgaXNLaWxsLCBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYODY6OkFERDE2cmk6CisgICAgY2FzZSBYODY6OkFERDE2cmk4OgorICAgICAgaWYgKERpc2FibGVMRUExNikKKyAgICAgICAgcmV0dXJuIGlzNjRCaXQgPyBjb252ZXJ0VG9UaHJlZUFkZHJlc3NXaXRoTEVBKE1JT3BjLCBNRkksIE1CQkksIExWKSA6IDA7CisgICAgICBhc3NlcnQoTUktPmdldE51bU9wZXJhbmRzKCkgPj0gMyAmJiAiVW5rbm93biBhZGQgaW5zdHJ1Y3Rpb24hIik7CisgICAgICBOZXdNSSA9IGFkZFJlZ09mZnNldChCdWlsZE1JKE1GLCBNSS0+Z2V0RGVidWdMb2MoKSwgZ2V0KFg4Njo6TEVBMTZyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWcoRGVzdCwgUmVnU3RhdGU6OkRlZmluZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlYWRSZWdTdGF0ZShpc0RlYWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYywgaXNLaWxsLCBNSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgfQorCisgIGlmICghTmV3TUkpIHJldHVybiAwOworCisgIGlmIChMVikgeyAgLy8gVXBkYXRlIGxpdmUgdmFyaWFibGVzCisgICAgaWYgKGlzS2lsbCkKKyAgICAgIExWLT5yZXBsYWNlS2lsbEluc3RydWN0aW9uKFNyYywgTUksIE5ld01JKTsKKyAgICBpZiAoaXNEZWFkKQorICAgICAgTFYtPnJlcGxhY2VLaWxsSW5zdHJ1Y3Rpb24oRGVzdCwgTUksIE5ld01JKTsKKyAgfQorCisgIE1GSS0+aW5zZXJ0KE1CQkksIE5ld01JKTsgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgaW5zdCAgICAKKyAgcmV0dXJuIE5ld01JOworfQorCisvLy8gY29tbXV0ZUluc3RydWN0aW9uIC0gV2UgaGF2ZSBhIGZldyBpbnN0cnVjdGlvbnMgdGhhdCBtdXN0IGJlIGhhY2tlZCBvbiB0bworLy8vIGNvbW11dGUgdGhlbS4KKy8vLworTWFjaGluZUluc3RyICoKK1g4Nkluc3RySW5mbzo6Y29tbXV0ZUluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAqTUksIGJvb2wgTmV3TUkpIGNvbnN0IHsKKyAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBYODY6OlNIUkQxNnJyaTg6IC8vIEEgPSBTSFJEMTZycmk4IEIsIEMsIEkgLT4gQSA9IFNITEQxNnJyaTggQywgQiwgKDE2LUkpCisgIGNhc2UgWDg2OjpTSExEMTZycmk4OiAvLyBBID0gU0hMRDE2cnJpOCBCLCBDLCBJIC0+IEEgPSBTSFJEMTZycmk4IEMsIEIsICgxNi1JKQorICBjYXNlIFg4Njo6U0hSRDMycnJpODogLy8gQSA9IFNIUkQzMnJyaTggQiwgQywgSSAtPiBBID0gU0hMRDMycnJpOCBDLCBCLCAoMzItSSkKKyAgY2FzZSBYODY6OlNITEQzMnJyaTg6IC8vIEEgPSBTSExEMzJycmk4IEIsIEMsIEkgLT4gQSA9IFNIUkQzMnJyaTggQywgQiwgKDMyLUkpCisgIGNhc2UgWDg2OjpTSFJENjRycmk4OiAvLyBBID0gU0hSRDY0cnJpOCBCLCBDLCBJIC0+IEEgPSBTSExENjRycmk4IEMsIEIsICg2NC1JKQorICBjYXNlIFg4Njo6U0hMRDY0cnJpODp7Ly8gQSA9IFNITEQ2NHJyaTggQiwgQywgSSAtPiBBID0gU0hSRDY0cnJpOCBDLCBCLCAoNjQtSSkKKyAgICB1bnNpZ25lZCBPcGM7CisgICAgdW5zaWduZWQgU2l6ZTsKKyAgICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVucmVhY2hhYmxlISIpOworICAgIGNhc2UgWDg2OjpTSFJEMTZycmk4OiBTaXplID0gMTY7IE9wYyA9IFg4Njo6U0hMRDE2cnJpODsgYnJlYWs7CisgICAgY2FzZSBYODY6OlNITEQxNnJyaTg6IFNpemUgPSAxNjsgT3BjID0gWDg2OjpTSFJEMTZycmk4OyBicmVhazsKKyAgICBjYXNlIFg4Njo6U0hSRDMycnJpODogU2l6ZSA9IDMyOyBPcGMgPSBYODY6OlNITEQzMnJyaTg7IGJyZWFrOworICAgIGNhc2UgWDg2OjpTSExEMzJycmk4OiBTaXplID0gMzI7IE9wYyA9IFg4Njo6U0hSRDMycnJpODsgYnJlYWs7CisgICAgY2FzZSBYODY6OlNIUkQ2NHJyaTg6IFNpemUgPSA2NDsgT3BjID0gWDg2OjpTSExENjRycmk4OyBicmVhazsKKyAgICBjYXNlIFg4Njo6U0hMRDY0cnJpODogU2l6ZSA9IDY0OyBPcGMgPSBYODY6OlNIUkQ2NHJyaTg7IGJyZWFrOworICAgIH0KKyAgICB1bnNpZ25lZCBBbXQgPSBNSS0+Z2V0T3BlcmFuZCgzKS5nZXRJbW0oKTsKKyAgICBpZiAoTmV3TUkpIHsKKyAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICAgIE1JID0gTUYuQ2xvbmVNYWNoaW5lSW5zdHIoTUkpOworICAgICAgTmV3TUkgPSBmYWxzZTsKKyAgICB9CisgICAgTUktPnNldERlc2MoZ2V0KE9wYykpOworICAgIE1JLT5nZXRPcGVyYW5kKDMpLnNldEltbShTaXplLUFtdCk7CisgICAgcmV0dXJuIFRhcmdldEluc3RySW5mb0ltcGw6OmNvbW11dGVJbnN0cnVjdGlvbihNSSwgTmV3TUkpOworICB9CisgIGNhc2UgWDg2OjpDTU9WQjE2cnI6CisgIGNhc2UgWDg2OjpDTU9WQjMycnI6CisgIGNhc2UgWDg2OjpDTU9WQjY0cnI6CisgIGNhc2UgWDg2OjpDTU9WQUUxNnJyOgorICBjYXNlIFg4Njo6Q01PVkFFMzJycjoKKyAgY2FzZSBYODY6OkNNT1ZBRTY0cnI6CisgIGNhc2UgWDg2OjpDTU9WRTE2cnI6CisgIGNhc2UgWDg2OjpDTU9WRTMycnI6CisgIGNhc2UgWDg2OjpDTU9WRTY0cnI6CisgIGNhc2UgWDg2OjpDTU9WTkUxNnJyOgorICBjYXNlIFg4Njo6Q01PVk5FMzJycjoKKyAgY2FzZSBYODY6OkNNT1ZORTY0cnI6CisgIGNhc2UgWDg2OjpDTU9WQkUxNnJyOgorICBjYXNlIFg4Njo6Q01PVkJFMzJycjoKKyAgY2FzZSBYODY6OkNNT1ZCRTY0cnI6CisgIGNhc2UgWDg2OjpDTU9WQTE2cnI6CisgIGNhc2UgWDg2OjpDTU9WQTMycnI6CisgIGNhc2UgWDg2OjpDTU9WQTY0cnI6CisgIGNhc2UgWDg2OjpDTU9WTDE2cnI6CisgIGNhc2UgWDg2OjpDTU9WTDMycnI6CisgIGNhc2UgWDg2OjpDTU9WTDY0cnI6CisgIGNhc2UgWDg2OjpDTU9WR0UxNnJyOgorICBjYXNlIFg4Njo6Q01PVkdFMzJycjoKKyAgY2FzZSBYODY6OkNNT1ZHRTY0cnI6CisgIGNhc2UgWDg2OjpDTU9WTEUxNnJyOgorICBjYXNlIFg4Njo6Q01PVkxFMzJycjoKKyAgY2FzZSBYODY6OkNNT1ZMRTY0cnI6CisgIGNhc2UgWDg2OjpDTU9WRzE2cnI6CisgIGNhc2UgWDg2OjpDTU9WRzMycnI6CisgIGNhc2UgWDg2OjpDTU9WRzY0cnI6CisgIGNhc2UgWDg2OjpDTU9WUzE2cnI6CisgIGNhc2UgWDg2OjpDTU9WUzMycnI6CisgIGNhc2UgWDg2OjpDTU9WUzY0cnI6CisgIGNhc2UgWDg2OjpDTU9WTlMxNnJyOgorICBjYXNlIFg4Njo6Q01PVk5TMzJycjoKKyAgY2FzZSBYODY6OkNNT1ZOUzY0cnI6CisgIGNhc2UgWDg2OjpDTU9WUDE2cnI6CisgIGNhc2UgWDg2OjpDTU9WUDMycnI6CisgIGNhc2UgWDg2OjpDTU9WUDY0cnI6CisgIGNhc2UgWDg2OjpDTU9WTlAxNnJyOgorICBjYXNlIFg4Njo6Q01PVk5QMzJycjoKKyAgY2FzZSBYODY6OkNNT1ZOUDY0cnI6CisgIGNhc2UgWDg2OjpDTU9WTzE2cnI6CisgIGNhc2UgWDg2OjpDTU9WTzMycnI6CisgIGNhc2UgWDg2OjpDTU9WTzY0cnI6CisgIGNhc2UgWDg2OjpDTU9WTk8xNnJyOgorICBjYXNlIFg4Njo6Q01PVk5PMzJycjoKKyAgY2FzZSBYODY6OkNNT1ZOTzY0cnI6IHsKKyAgICB1bnNpZ25lZCBPcGMgPSAwOworICAgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZCMTZycjogIE9wYyA9IFg4Njo6Q01PVkFFMTZycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZCMzJycjogIE9wYyA9IFg4Njo6Q01PVkFFMzJycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZCNjRycjogIE9wYyA9IFg4Njo6Q01PVkFFNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZBRTE2cnI6IE9wYyA9IFg4Njo6Q01PVkIxNnJyOyBicmVhazsKKyAgICBjYXNlIFg4Njo6Q01PVkFFMzJycjogT3BjID0gWDg2OjpDTU9WQjMycnI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpDTU9WQUU2NHJyOiBPcGMgPSBYODY6OkNNT1ZCNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZFMTZycjogIE9wYyA9IFg4Njo6Q01PVk5FMTZycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZFMzJycjogIE9wYyA9IFg4Njo6Q01PVk5FMzJycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZFNjRycjogIE9wYyA9IFg4Njo6Q01PVk5FNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZORTE2cnI6IE9wYyA9IFg4Njo6Q01PVkUxNnJyOyBicmVhazsKKyAgICBjYXNlIFg4Njo6Q01PVk5FMzJycjogT3BjID0gWDg2OjpDTU9WRTMycnI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpDTU9WTkU2NHJyOiBPcGMgPSBYODY6OkNNT1ZFNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZCRTE2cnI6IE9wYyA9IFg4Njo6Q01PVkExNnJyOyBicmVhazsKKyAgICBjYXNlIFg4Njo6Q01PVkJFMzJycjogT3BjID0gWDg2OjpDTU9WQTMycnI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpDTU9WQkU2NHJyOiBPcGMgPSBYODY6OkNNT1ZBNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZBMTZycjogIE9wYyA9IFg4Njo6Q01PVkJFMTZycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZBMzJycjogIE9wYyA9IFg4Njo6Q01PVkJFMzJycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZBNjRycjogIE9wYyA9IFg4Njo6Q01PVkJFNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZMMTZycjogIE9wYyA9IFg4Njo6Q01PVkdFMTZycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZMMzJycjogIE9wYyA9IFg4Njo6Q01PVkdFMzJycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZMNjRycjogIE9wYyA9IFg4Njo6Q01PVkdFNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZHRTE2cnI6IE9wYyA9IFg4Njo6Q01PVkwxNnJyOyBicmVhazsKKyAgICBjYXNlIFg4Njo6Q01PVkdFMzJycjogT3BjID0gWDg2OjpDTU9WTDMycnI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpDTU9WR0U2NHJyOiBPcGMgPSBYODY6OkNNT1ZMNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZMRTE2cnI6IE9wYyA9IFg4Njo6Q01PVkcxNnJyOyBicmVhazsKKyAgICBjYXNlIFg4Njo6Q01PVkxFMzJycjogT3BjID0gWDg2OjpDTU9WRzMycnI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpDTU9WTEU2NHJyOiBPcGMgPSBYODY6OkNNT1ZHNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZHMTZycjogIE9wYyA9IFg4Njo6Q01PVkxFMTZycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZHMzJycjogIE9wYyA9IFg4Njo6Q01PVkxFMzJycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZHNjRycjogIE9wYyA9IFg4Njo6Q01PVkxFNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZTMTZycjogIE9wYyA9IFg4Njo6Q01PVk5TMTZycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZTMzJycjogIE9wYyA9IFg4Njo6Q01PVk5TMzJycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZTNjRycjogIE9wYyA9IFg4Njo6Q01PVk5TNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZOUzE2cnI6IE9wYyA9IFg4Njo6Q01PVlMxNnJyOyBicmVhazsKKyAgICBjYXNlIFg4Njo6Q01PVk5TMzJycjogT3BjID0gWDg2OjpDTU9WUzMycnI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpDTU9WTlM2NHJyOiBPcGMgPSBYODY6OkNNT1ZTNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZQMTZycjogIE9wYyA9IFg4Njo6Q01PVk5QMTZycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZQMzJycjogIE9wYyA9IFg4Njo6Q01PVk5QMzJycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZQNjRycjogIE9wYyA9IFg4Njo6Q01PVk5QNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZOUDE2cnI6IE9wYyA9IFg4Njo6Q01PVlAxNnJyOyBicmVhazsKKyAgICBjYXNlIFg4Njo6Q01PVk5QMzJycjogT3BjID0gWDg2OjpDTU9WUDMycnI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpDTU9WTlA2NHJyOiBPcGMgPSBYODY6OkNNT1ZQNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZPMTZycjogIE9wYyA9IFg4Njo6Q01PVk5PMTZycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZPMzJycjogIE9wYyA9IFg4Njo6Q01PVk5PMzJycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZPNjRycjogIE9wYyA9IFg4Njo6Q01PVk5PNjRycjsgYnJlYWs7CisgICAgY2FzZSBYODY6OkNNT1ZOTzE2cnI6IE9wYyA9IFg4Njo6Q01PVk8xNnJyOyBicmVhazsKKyAgICBjYXNlIFg4Njo6Q01PVk5PMzJycjogT3BjID0gWDg2OjpDTU9WTzMycnI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpDTU9WTk82NHJyOiBPcGMgPSBYODY6OkNNT1ZPNjRycjsgYnJlYWs7CisgICAgfQorICAgIGlmIChOZXdNSSkgeworICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICAgICAgTUkgPSBNRi5DbG9uZU1hY2hpbmVJbnN0cihNSSk7CisgICAgICBOZXdNSSA9IGZhbHNlOworICAgIH0KKyAgICBNSS0+c2V0RGVzYyhnZXQoT3BjKSk7CisgICAgLy8gRmFsbHRocm91Z2ggaW50ZW5kZWQuCisgIH0KKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gVGFyZ2V0SW5zdHJJbmZvSW1wbDo6Y29tbXV0ZUluc3RydWN0aW9uKE1JLCBOZXdNSSk7CisgIH0KK30KKworc3RhdGljIFg4Njo6Q29uZENvZGUgR2V0Q29uZEZyb21CcmFuY2hPcGModW5zaWduZWQgQnJPcGMpIHsKKyAgc3dpdGNoIChCck9wYykgeworICBkZWZhdWx0OiByZXR1cm4gWDg2OjpDT05EX0lOVkFMSUQ7CisgIGNhc2UgWDg2OjpKRV80OiAgcmV0dXJuIFg4Njo6Q09ORF9FOworICBjYXNlIFg4Njo6Sk5FXzQ6IHJldHVybiBYODY6OkNPTkRfTkU7CisgIGNhc2UgWDg2OjpKTF80OiAgcmV0dXJuIFg4Njo6Q09ORF9MOworICBjYXNlIFg4Njo6SkxFXzQ6IHJldHVybiBYODY6OkNPTkRfTEU7CisgIGNhc2UgWDg2OjpKR180OiAgcmV0dXJuIFg4Njo6Q09ORF9HOworICBjYXNlIFg4Njo6SkdFXzQ6IHJldHVybiBYODY6OkNPTkRfR0U7CisgIGNhc2UgWDg2OjpKQl80OiAgcmV0dXJuIFg4Njo6Q09ORF9COworICBjYXNlIFg4Njo6SkJFXzQ6IHJldHVybiBYODY6OkNPTkRfQkU7CisgIGNhc2UgWDg2OjpKQV80OiAgcmV0dXJuIFg4Njo6Q09ORF9BOworICBjYXNlIFg4Njo6SkFFXzQ6IHJldHVybiBYODY6OkNPTkRfQUU7CisgIGNhc2UgWDg2OjpKU180OiAgcmV0dXJuIFg4Njo6Q09ORF9TOworICBjYXNlIFg4Njo6Sk5TXzQ6IHJldHVybiBYODY6OkNPTkRfTlM7CisgIGNhc2UgWDg2OjpKUF80OiAgcmV0dXJuIFg4Njo6Q09ORF9QOworICBjYXNlIFg4Njo6Sk5QXzQ6IHJldHVybiBYODY6OkNPTkRfTlA7CisgIGNhc2UgWDg2OjpKT180OiAgcmV0dXJuIFg4Njo6Q09ORF9POworICBjYXNlIFg4Njo6Sk5PXzQ6IHJldHVybiBYODY6OkNPTkRfTk87CisgIH0KK30KKwordW5zaWduZWQgWDg2OjpHZXRDb25kQnJhbmNoRnJvbUNvbmQoWDg2OjpDb25kQ29kZSBDQykgeworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgY29uZGl0aW9uIGNvZGUhIik7CisgIGNhc2UgWDg2OjpDT05EX0U6ICByZXR1cm4gWDg2OjpKRV80OworICBjYXNlIFg4Njo6Q09ORF9ORTogcmV0dXJuIFg4Njo6Sk5FXzQ7CisgIGNhc2UgWDg2OjpDT05EX0w6ICByZXR1cm4gWDg2OjpKTF80OworICBjYXNlIFg4Njo6Q09ORF9MRTogcmV0dXJuIFg4Njo6SkxFXzQ7CisgIGNhc2UgWDg2OjpDT05EX0c6ICByZXR1cm4gWDg2OjpKR180OworICBjYXNlIFg4Njo6Q09ORF9HRTogcmV0dXJuIFg4Njo6SkdFXzQ7CisgIGNhc2UgWDg2OjpDT05EX0I6ICByZXR1cm4gWDg2OjpKQl80OworICBjYXNlIFg4Njo6Q09ORF9CRTogcmV0dXJuIFg4Njo6SkJFXzQ7CisgIGNhc2UgWDg2OjpDT05EX0E6ICByZXR1cm4gWDg2OjpKQV80OworICBjYXNlIFg4Njo6Q09ORF9BRTogcmV0dXJuIFg4Njo6SkFFXzQ7CisgIGNhc2UgWDg2OjpDT05EX1M6ICByZXR1cm4gWDg2OjpKU180OworICBjYXNlIFg4Njo6Q09ORF9OUzogcmV0dXJuIFg4Njo6Sk5TXzQ7CisgIGNhc2UgWDg2OjpDT05EX1A6ICByZXR1cm4gWDg2OjpKUF80OworICBjYXNlIFg4Njo6Q09ORF9OUDogcmV0dXJuIFg4Njo6Sk5QXzQ7CisgIGNhc2UgWDg2OjpDT05EX086ICByZXR1cm4gWDg2OjpKT180OworICBjYXNlIFg4Njo6Q09ORF9OTzogcmV0dXJuIFg4Njo6Sk5PXzQ7CisgIH0KK30KKworLy8vIEdldE9wcG9zaXRlQnJhbmNoQ29uZGl0aW9uIC0gUmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9uLAorLy8vIGUuZy4gdHVybmluZyBDT05EX0UgdG8gQ09ORF9ORS4KK1g4Njo6Q29uZENvZGUgWDg2OjpHZXRPcHBvc2l0ZUJyYW5jaENvbmRpdGlvbihYODY6OkNvbmRDb2RlIENDKSB7CisgIHN3aXRjaCAoQ0MpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSWxsZWdhbCBjb25kaXRpb24gY29kZSEiKTsKKyAgY2FzZSBYODY6OkNPTkRfRTogIHJldHVybiBYODY6OkNPTkRfTkU7CisgIGNhc2UgWDg2OjpDT05EX05FOiByZXR1cm4gWDg2OjpDT05EX0U7CisgIGNhc2UgWDg2OjpDT05EX0w6ICByZXR1cm4gWDg2OjpDT05EX0dFOworICBjYXNlIFg4Njo6Q09ORF9MRTogcmV0dXJuIFg4Njo6Q09ORF9HOworICBjYXNlIFg4Njo6Q09ORF9HOiAgcmV0dXJuIFg4Njo6Q09ORF9MRTsKKyAgY2FzZSBYODY6OkNPTkRfR0U6IHJldHVybiBYODY6OkNPTkRfTDsKKyAgY2FzZSBYODY6OkNPTkRfQjogIHJldHVybiBYODY6OkNPTkRfQUU7CisgIGNhc2UgWDg2OjpDT05EX0JFOiByZXR1cm4gWDg2OjpDT05EX0E7CisgIGNhc2UgWDg2OjpDT05EX0E6ICByZXR1cm4gWDg2OjpDT05EX0JFOworICBjYXNlIFg4Njo6Q09ORF9BRTogcmV0dXJuIFg4Njo6Q09ORF9COworICBjYXNlIFg4Njo6Q09ORF9TOiAgcmV0dXJuIFg4Njo6Q09ORF9OUzsKKyAgY2FzZSBYODY6OkNPTkRfTlM6IHJldHVybiBYODY6OkNPTkRfUzsKKyAgY2FzZSBYODY6OkNPTkRfUDogIHJldHVybiBYODY6OkNPTkRfTlA7CisgIGNhc2UgWDg2OjpDT05EX05QOiByZXR1cm4gWDg2OjpDT05EX1A7CisgIGNhc2UgWDg2OjpDT05EX086ICByZXR1cm4gWDg2OjpDT05EX05POworICBjYXNlIFg4Njo6Q09ORF9OTzogcmV0dXJuIFg4Njo6Q09ORF9POworICB9Cit9CisKK2Jvb2wgWDg2SW5zdHJJbmZvOjppc1VucHJlZGljYXRlZFRlcm1pbmF0b3IoY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IE1JLT5nZXREZXNjKCk7CisgIGlmICghVElELmlzVGVybWluYXRvcigpKSByZXR1cm4gZmFsc2U7CisgIAorICAvLyBDb25kaXRpb25hbCBicmFuY2ggaXMgYSBzcGVjaWFsIGNhc2UuCisgIGlmIChUSUQuaXNCcmFuY2goKSAmJiAhVElELmlzQmFycmllcigpKQorICAgIHJldHVybiB0cnVlOworICBpZiAoIVRJRC5pc1ByZWRpY2FibGUoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuICFpc1ByZWRpY2F0ZWQoTUkpOworfQorCitib29sIFg4Nkluc3RySW5mbzo6QW5hbHl6ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSkgY29uc3QgeworICAvLyBTdGFydCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIGJsb2NrIGFuZCB3b3JrIHVwLCBleGFtaW5pbmcgdGhlCisgIC8vIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb25zLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5lbmQoKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFVuQ29uZEJySXRlciA9IE1CQi5lbmQoKTsKKyAgd2hpbGUgKEkgIT0gTUJCLmJlZ2luKCkpIHsKKyAgICAtLUk7CisgICAgaWYgKEktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBXb3JraW5nIGZyb20gdGhlIGJvdHRvbSwgd2hlbiB3ZSBzZWUgYSBub24tdGVybWluYXRvciBpbnN0cnVjdGlvbiwgd2UncmUKKyAgICAvLyBkb25lLgorICAgIGlmICghaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKEkpKQorICAgICAgYnJlYWs7CisKKyAgICAvLyBBIHRlcm1pbmF0b3IgdGhhdCBpc24ndCBhIGJyYW5jaCBjYW4ndCBlYXNpbHkgYmUgaGFuZGxlZCBieSB0aGlzCisgICAgLy8gYW5hbHlzaXMuCisgICAgaWYgKCFJLT5nZXREZXNjKCkuaXNCcmFuY2goKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gSGFuZGxlIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMuCisgICAgaWYgKEktPmdldE9wY29kZSgpID09IFg4Njo6Sk1QXzQpIHsKKyAgICAgIFVuQ29uZEJySXRlciA9IEk7CisKKyAgICAgIGlmICghQWxsb3dNb2RpZnkpIHsKKyAgICAgICAgVEJCID0gSS0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoZSBibG9jayBoYXMgYW55IGluc3RydWN0aW9ucyBhZnRlciBhIEpNUCwgZGVsZXRlIHRoZW0uCisgICAgICB3aGlsZSAobGx2bTo6bmV4dChJKSAhPSBNQkIuZW5kKCkpCisgICAgICAgIGxsdm06Om5leHQoSSktPmVyYXNlRnJvbVBhcmVudCgpOworCisgICAgICBDb25kLmNsZWFyKCk7CisgICAgICBGQkIgPSAwOworCisgICAgICAvLyBEZWxldGUgdGhlIEpNUCBpZiBpdCdzIGVxdWl2YWxlbnQgdG8gYSBmYWxsLXRocm91Z2guCisgICAgICBpZiAoTUJCLmlzTGF5b3V0U3VjY2Vzc29yKEktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCkpKSB7CisgICAgICAgIFRCQiA9IDA7CisgICAgICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICBJID0gTUJCLmVuZCgpOworICAgICAgICBVbkNvbmRCckl0ZXIgPSBNQkIuZW5kKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBUQkIgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdW5jb25kaXRpb25hbCBkZXN0aW5hdGlvbi4KKyAgICAgIFRCQiA9IEktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgY29uZGl0aW9uYWwgYnJhbmNoZXMuCisgICAgWDg2OjpDb25kQ29kZSBCcmFuY2hDb2RlID0gR2V0Q29uZEZyb21CcmFuY2hPcGMoSS0+Z2V0T3Bjb2RlKCkpOworICAgIGlmIChCcmFuY2hDb2RlID09IFg4Njo6Q09ORF9JTlZBTElEKQorICAgICAgcmV0dXJuIHRydWU7ICAvLyBDYW4ndCBoYW5kbGUgaW5kaXJlY3QgYnJhbmNoLgorCisgICAgLy8gV29ya2luZyBmcm9tIHRoZSBib3R0b20sIGhhbmRsZSB0aGUgZmlyc3QgY29uZGl0aW9uYWwgYnJhbmNoLgorICAgIGlmIChDb25kLmVtcHR5KCkpIHsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUYXJnZXRCQiA9IEktPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgICBpZiAoQWxsb3dNb2RpZnkgJiYgVW5Db25kQnJJdGVyICE9IE1CQi5lbmQoKSAmJgorICAgICAgICAgIE1CQi5pc0xheW91dFN1Y2Nlc3NvcihUYXJnZXRCQikpIHsKKyAgICAgICAgLy8gSWYgd2UgY2FuIG1vZGlmeSB0aGUgY29kZSBhbmQgaXQgZW5kcyBpbiBzb21ldGhpbmcgbGlrZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIGpDQyBMMQorICAgICAgICAvLyAgICAgam1wIEwyCisgICAgICAgIC8vICAgTDE6CisgICAgICAgIC8vICAgICAuLi4KKyAgICAgICAgLy8gICBMMjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlbiB3ZSBjYW4gY2hhbmdlIHRoaXMgdG86CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBqbkNDIEwyCisgICAgICAgIC8vICAgTDE6CisgICAgICAgIC8vICAgICAuLi4KKyAgICAgICAgLy8gICBMMjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hpY2ggaXMgYSBiaXQgbW9yZSBlZmZpY2llbnQuCisgICAgICAgIC8vIFdlIGNvbmRpdGlvbmFsbHkganVtcCB0byB0aGUgZmFsbC10aHJvdWdoIGJsb2NrLgorICAgICAgICBCcmFuY2hDb2RlID0gR2V0T3Bwb3NpdGVCcmFuY2hDb25kaXRpb24oQnJhbmNoQ29kZSk7CisgICAgICAgIHVuc2lnbmVkIEpOQ0MgPSBHZXRDb25kQnJhbmNoRnJvbUNvbmQoQnJhbmNoQ29kZSk7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBPbGRJbnN0ID0gSTsKKworICAgICAgICBCdWlsZE1JKE1CQiwgVW5Db25kQnJJdGVyLCBNQkIuZmluZERlYnVnTG9jKEkpLCBnZXQoSk5DQykpCisgICAgICAgICAgLmFkZE1CQihVbkNvbmRCckl0ZXItPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCkpOworICAgICAgICBCdWlsZE1JKE1CQiwgVW5Db25kQnJJdGVyLCBNQkIuZmluZERlYnVnTG9jKEkpLCBnZXQoWDg2OjpKTVBfNCkpCisgICAgICAgICAgLmFkZE1CQihUYXJnZXRCQik7CisgICAgICAgIE1CQi5hZGRTdWNjZXNzb3IoVGFyZ2V0QkIpOworCisgICAgICAgIE9sZEluc3QtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICBVbkNvbmRCckl0ZXItPmVyYXNlRnJvbVBhcmVudCgpOworCisgICAgICAgIC8vIFJlc3RhcnQgdGhlIGFuYWx5c2lzLgorICAgICAgICBVbkNvbmRCckl0ZXIgPSBNQkIuZW5kKCk7CisgICAgICAgIEkgPSBNQkIuZW5kKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBGQkIgPSBUQkI7CisgICAgICBUQkIgPSBJLT5nZXRPcGVyYW5kKDApLmdldE1CQigpOworICAgICAgQ29uZC5wdXNoX2JhY2soTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbShCcmFuY2hDb2RlKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgc3Vic2VxdWVudCBjb25kaXRpb25hbCBicmFuY2hlcy4gT25seSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYWxsCisgICAgLy8gY29uZGl0aW9uYWwgYnJhbmNoZXMgYnJhbmNoIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIGFuZCB0aGVpciBjb25kaXRpb24KKyAgICAvLyBvcGNvZGVzIGZpdCBvbmUgb2YgdGhlIHNwZWNpYWwgbXVsdGktYnJhbmNoIGlkaW9tcy4KKyAgICBhc3NlcnQoQ29uZC5zaXplKCkgPT0gMSk7CisgICAgYXNzZXJ0KFRCQik7CisKKyAgICAvLyBPbmx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbGwgY29uZGl0aW9uYWwgYnJhbmNoZXMgYnJhbmNoIHRvIHRoZSBzYW1lCisgICAgLy8gZGVzdGluYXRpb24uCisgICAgaWYgKFRCQiAhPSBJLT5nZXRPcGVyYW5kKDApLmdldE1CQigpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBJZiB0aGUgY29uZGl0aW9ucyBhcmUgdGhlIHNhbWUsIHdlIGNhbiBsZWF2ZSB0aGVtIGFsb25lLgorICAgIFg4Njo6Q29uZENvZGUgT2xkQnJhbmNoQ29kZSA9IChYODY6OkNvbmRDb2RlKUNvbmRbMF0uZ2V0SW1tKCk7CisgICAgaWYgKE9sZEJyYW5jaENvZGUgPT0gQnJhbmNoQ29kZSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gSWYgdGhleSBkaWZmZXIsIHNlZSBpZiB0aGV5IGZpdCBvbmUgb2YgdGhlIGtub3duIHBhdHRlcm5zLiBUaGVvcmV0aWNhbGx5LAorICAgIC8vIHdlIGNvdWxkIGhhbmRsZSBtb3JlIHBhdHRlcm5zIGhlcmUsIGJ1dCB3ZSBzaG91bGRuJ3QgZXhwZWN0IHRvIHNlZSB0aGVtCisgICAgLy8gaWYgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGhhcyBkb25lIGEgcmVhc29uYWJsZSBqb2IuCisgICAgaWYgKChPbGRCcmFuY2hDb2RlID09IFg4Njo6Q09ORF9OUCAmJgorICAgICAgICAgQnJhbmNoQ29kZSA9PSBYODY6OkNPTkRfRSkgfHwKKyAgICAgICAgKE9sZEJyYW5jaENvZGUgPT0gWDg2OjpDT05EX0UgJiYKKyAgICAgICAgIEJyYW5jaENvZGUgPT0gWDg2OjpDT05EX05QKSkKKyAgICAgIEJyYW5jaENvZGUgPSBYODY6OkNPTkRfTlBfT1JfRTsKKyAgICBlbHNlIGlmICgoT2xkQnJhbmNoQ29kZSA9PSBYODY6OkNPTkRfUCAmJgorICAgICAgICAgICAgICBCcmFuY2hDb2RlID09IFg4Njo6Q09ORF9ORSkgfHwKKyAgICAgICAgICAgICAoT2xkQnJhbmNoQ29kZSA9PSBYODY6OkNPTkRfTkUgJiYKKyAgICAgICAgICAgICAgQnJhbmNoQ29kZSA9PSBYODY6OkNPTkRfUCkpCisgICAgICBCcmFuY2hDb2RlID0gWDg2OjpDT05EX05FX09SX1A7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBVcGRhdGUgdGhlIE1hY2hpbmVPcGVyYW5kLgorICAgIENvbmRbMF0uc2V0SW1tKEJyYW5jaENvZGUpOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit1bnNpZ25lZCBYODZJbnN0ckluZm86OlJlbW92ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLmVuZCgpOworICB1bnNpZ25lZCBDb3VudCA9IDA7CisKKyAgd2hpbGUgKEkgIT0gTUJCLmJlZ2luKCkpIHsKKyAgICAtLUk7CisgICAgaWYgKEktPmlzRGVidWdWYWx1ZSgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKEktPmdldE9wY29kZSgpICE9IFg4Njo6Sk1QXzQgJiYKKyAgICAgICAgR2V0Q29uZEZyb21CcmFuY2hPcGMoSS0+Z2V0T3Bjb2RlKCkpID09IFg4Njo6Q09ORF9JTlZBTElEKQorICAgICAgYnJlYWs7CisgICAgLy8gUmVtb3ZlIHRoZSBicmFuY2guCisgICAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgSSA9IE1CQi5lbmQoKTsKKyAgICArK0NvdW50OworICB9CisgIAorICByZXR1cm4gQ291bnQ7Cit9CisKK3Vuc2lnbmVkCitYODZJbnN0ckluZm86Okluc2VydEJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jayAqVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBETCkgY29uc3QgeworICAvLyBTaG91bGRuJ3QgYmUgYSBmYWxsIHRocm91Z2guCisgIGFzc2VydChUQkIgJiYgIkluc2VydEJyYW5jaCBtdXN0IG5vdCBiZSB0b2xkIHRvIGluc2VydCBhIGZhbGx0aHJvdWdoIik7CisgIGFzc2VydCgoQ29uZC5zaXplKCkgPT0gMSB8fCBDb25kLnNpemUoKSA9PSAwKSAmJgorICAgICAgICAgIlg4NiBicmFuY2ggY29uZGl0aW9ucyBoYXZlIG9uZSBjb21wb25lbnQhIik7CisKKyAgaWYgKENvbmQuZW1wdHkoKSkgeworICAgIC8vIFVuY29uZGl0aW9uYWwgYnJhbmNoPworICAgIGFzc2VydCghRkJCICYmICJVbmNvbmRpdGlvbmFsIGJyYW5jaCB3aXRoIG11bHRpcGxlIHN1Y2Nlc3NvcnMhIik7CisgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KFg4Njo6Sk1QXzQpKS5hZGRNQkIoVEJCKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIENvbmRpdGlvbmFsIGJyYW5jaC4KKyAgdW5zaWduZWQgQ291bnQgPSAwOworICBYODY6OkNvbmRDb2RlIENDID0gKFg4Njo6Q29uZENvZGUpQ29uZFswXS5nZXRJbW0oKTsKKyAgc3dpdGNoIChDQykgeworICBjYXNlIFg4Njo6Q09ORF9OUF9PUl9FOgorICAgIC8vIFN5bnRoZXNpemUgTlBfT1JfRSB3aXRoIHR3byBicmFuY2hlcy4KKyAgICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoWDg2OjpKTlBfNCkpLmFkZE1CQihUQkIpOworICAgICsrQ291bnQ7CisgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KFg4Njo6SkVfNCkpLmFkZE1CQihUQkIpOworICAgICsrQ291bnQ7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2OjpDT05EX05FX09SX1A6CisgICAgLy8gU3ludGhlc2l6ZSBORV9PUl9QIHdpdGggdHdvIGJyYW5jaGVzLgorICAgIEJ1aWxkTUkoJk1CQiwgREwsIGdldChYODY6OkpORV80KSkuYWRkTUJCKFRCQik7CisgICAgKytDb3VudDsKKyAgICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoWDg2OjpKUF80KSkuYWRkTUJCKFRCQik7CisgICAgKytDb3VudDsKKyAgICBicmVhazsKKyAgZGVmYXVsdDogeworICAgIHVuc2lnbmVkIE9wYyA9IEdldENvbmRCcmFuY2hGcm9tQ29uZChDQyk7CisgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KE9wYykpLmFkZE1CQihUQkIpOworICAgICsrQ291bnQ7CisgIH0KKyAgfQorICBpZiAoRkJCKSB7CisgICAgLy8gVHdvLXdheSBDb25kaXRpb25hbCBicmFuY2guIEluc2VydCB0aGUgc2Vjb25kIGJyYW5jaC4KKyAgICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoWDg2OjpKTVBfNCkpLmFkZE1CQihGQkIpOworICAgICsrQ291bnQ7CisgIH0KKyAgcmV0dXJuIENvdW50OworfQorCisvLy8gaXNIUmVnIC0gVGVzdCBpZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaXMgYSBwaHlzaWNhbCBoIHJlZ2lzdGVyLgorc3RhdGljIGJvb2wgaXNIUmVnKHVuc2lnbmVkIFJlZykgeworICByZXR1cm4gWDg2OjpHUjhfQUJDRF9IUmVnQ2xhc3MuY29udGFpbnMoUmVnKTsKK30KKwordm9pZCBYODZJbnN0ckluZm86OmNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLCBEZWJ1Z0xvYyBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdCB7CisgIC8vIEZpcnN0IGRlYWwgd2l0aCB0aGUgbm9ybWFsIHN5bW1ldHJpYyBjb3BpZXMuCisgIHVuc2lnbmVkIE9wYyA9IDA7CisgIGlmIChYODY6OkdSNjRSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIE9wYyA9IFg4Njo6TU9WNjRycjsKKyAgZWxzZSBpZiAoWDg2OjpHUjMyUmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBPcGMgPSBYODY6Ok1PVjMycnI7CisgIGVsc2UgaWYgKFg4Njo6R1IxNlJlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpCisgICAgT3BjID0gWDg2OjpNT1YxNnJyOworICBlbHNlIGlmIChYODY6OkdSOFJlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcsIFNyY1JlZykpIHsKKyAgICAvLyBDb3B5aW5nIHRvIG9yIGZyb20gYSBwaHlzaWNhbCBIIHJlZ2lzdGVyIG9uIHg4Ni02NCByZXF1aXJlcyBhIE5PUkVYCisgICAgLy8gbW92ZS4gIE90aGVyd2lzZSB1c2UgYSBub3JtYWwgbW92ZS4KKyAgICBpZiAoKGlzSFJlZyhEZXN0UmVnKSB8fCBpc0hSZWcoU3JjUmVnKSkgJiYKKyAgICAgICAgVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5pczY0Qml0KCkpCisgICAgICBPcGMgPSBYODY6Ok1PVjhycl9OT1JFWDsKKyAgICBlbHNlCisgICAgICBPcGMgPSBYODY6Ok1PVjhycjsKKyAgfSBlbHNlIGlmIChYODY6OlZSMTI4UmVnQ2xhc3MuY29udGFpbnMoRGVzdFJlZywgU3JjUmVnKSkKKyAgICBPcGMgPSBYODY6Ok1PVkFQU3JyOworICBlbHNlIGlmIChYODY6OlZSNjRSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnLCBTcmNSZWcpKQorICAgIE9wYyA9IFg4Njo6TU1YX01PVlE2NHJyOworCisgIGlmIChPcGMpIHsKKyAgICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoT3BjKSwgRGVzdFJlZykKKyAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE1vdmluZyBFRkxBR1MgdG8gLyBmcm9tIGFub3RoZXIgcmVnaXN0ZXIgcmVxdWlyZXMgYSBwdXNoIGFuZCBhIHBvcC4KKyAgaWYgKFNyY1JlZyA9PSBYODY6OkVGTEFHUykgeworICAgIGlmIChYODY6OkdSNjRSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnKSkgeworICAgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KFg4Njo6UFVTSEY2NCkpOworICAgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KFg4Njo6UE9QNjRyKSwgRGVzdFJlZyk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChYODY6OkdSMzJSZWdDbGFzcy5jb250YWlucyhEZXN0UmVnKSkgeworICAgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KFg4Njo6UFVTSEYzMikpOworICAgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KFg4Njo6UE9QMzJyKSwgRGVzdFJlZyk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmIChEZXN0UmVnID09IFg4Njo6RUZMQUdTKSB7CisgICAgaWYgKFg4Njo6R1I2NFJlZ0NsYXNzLmNvbnRhaW5zKFNyY1JlZykpIHsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChYODY6OlBVU0g2NHIpKQorICAgICAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKEtpbGxTcmMpKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNSSwgREwsIGdldChYODY6OlBPUEY2NCkpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoWDg2OjpHUjMyUmVnQ2xhc3MuY29udGFpbnMoU3JjUmVnKSkgeworICAgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KFg4Njo6UFVTSDMycikpCisgICAgICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoS2lsbFNyYykpOworICAgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KFg4Njo6UE9QRjMyKSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgREVCVUcoZGJncygpIDw8ICJDYW5ub3QgY29weSAiIDw8IFJJLmdldE5hbWUoU3JjUmVnKQorICAgICAgICAgICAgICAgPDwgIiB0byAiIDw8IFJJLmdldE5hbWUoRGVzdFJlZykgPDwgJ1xuJyk7CisgIGxsdm1fdW5yZWFjaGFibGUoIkNhbm5vdCBlbWl0IHBoeXNyZWcgY29weSBpbnN0cnVjdGlvbiIpOworfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0TG9hZFN0b3JlUmVnT3Bjb2RlKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdGFja0FsaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvYWQpIHsKKyAgc3dpdGNoIChSQy0+Z2V0SUQoKSkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gcmVnY2xhc3MiKTsKKyAgY2FzZSBYODY6OkdSNjRSZWdDbGFzc0lEOgorICBjYXNlIFg4Njo6R1I2NF9OT1NQUmVnQ2xhc3NJRDoKKyAgICByZXR1cm4gbG9hZCA/IFg4Njo6TU9WNjRybSA6IFg4Njo6TU9WNjRtcjsKKyAgY2FzZSBYODY6OkdSMzJSZWdDbGFzc0lEOgorICBjYXNlIFg4Njo6R1IzMl9OT1NQUmVnQ2xhc3NJRDoKKyAgY2FzZSBYODY6OkdSMzJfQURSZWdDbGFzc0lEOgorICAgIHJldHVybiBsb2FkID8gWDg2OjpNT1YzMnJtIDogWDg2OjpNT1YzMm1yOworICBjYXNlIFg4Njo6R1IxNlJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIGxvYWQgPyBYODY6Ok1PVjE2cm0gOiBYODY6Ok1PVjE2bXI7CisgIGNhc2UgWDg2OjpHUjhSZWdDbGFzc0lEOgorICAgIC8vIENvcHlpbmcgdG8gb3IgZnJvbSBhIHBoeXNpY2FsIEggcmVnaXN0ZXIgb24geDg2LTY0IHJlcXVpcmVzIGEgTk9SRVgKKyAgICAvLyBtb3ZlLiAgT3RoZXJ3aXNlIHVzZSBhIG5vcm1hbCBtb3ZlLgorICAgIGlmIChpc0hSZWcoUmVnKSAmJgorICAgICAgICBUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzNjRCaXQoKSkKKyAgICAgIHJldHVybiBsb2FkID8gWDg2OjpNT1Y4cm1fTk9SRVggOiBYODY6Ok1PVjhtcl9OT1JFWDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbG9hZCA/IFg4Njo6TU9WOHJtIDogWDg2OjpNT1Y4bXI7CisgIGNhc2UgWDg2OjpHUjY0X0FCQ0RSZWdDbGFzc0lEOgorICAgIHJldHVybiBsb2FkID8gWDg2OjpNT1Y2NHJtIDogWDg2OjpNT1Y2NG1yOworICBjYXNlIFg4Njo6R1IzMl9BQkNEUmVnQ2xhc3NJRDoKKyAgICByZXR1cm4gbG9hZCA/IFg4Njo6TU9WMzJybSA6IFg4Njo6TU9WMzJtcjsKKyAgY2FzZSBYODY6OkdSMTZfQUJDRFJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIGxvYWQgPyBYODY6Ok1PVjE2cm0gOiBYODY6Ok1PVjE2bXI7CisgIGNhc2UgWDg2OjpHUjhfQUJDRF9MUmVnQ2xhc3NJRDoKKyAgICByZXR1cm4gbG9hZCA/IFg4Njo6TU9WOHJtIDpYODY6Ok1PVjhtcjsKKyAgY2FzZSBYODY6OkdSOF9BQkNEX0hSZWdDbGFzc0lEOgorICAgIGlmIChUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzNjRCaXQoKSkKKyAgICAgIHJldHVybiBsb2FkID8gWDg2OjpNT1Y4cm1fTk9SRVggOiBYODY6Ok1PVjhtcl9OT1JFWDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbG9hZCA/IFg4Njo6TU9WOHJtIDogWDg2OjpNT1Y4bXI7CisgIGNhc2UgWDg2OjpHUjY0X05PUkVYUmVnQ2xhc3NJRDoKKyAgY2FzZSBYODY6OkdSNjRfTk9SRVhfTk9TUFJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIGxvYWQgPyBYODY6Ok1PVjY0cm0gOiBYODY6Ok1PVjY0bXI7CisgIGNhc2UgWDg2OjpHUjMyX05PUkVYUmVnQ2xhc3NJRDoKKyAgICByZXR1cm4gbG9hZCA/IFg4Njo6TU9WMzJybSA6IFg4Njo6TU9WMzJtcjsKKyAgY2FzZSBYODY6OkdSMTZfTk9SRVhSZWdDbGFzc0lEOgorICAgIHJldHVybiBsb2FkID8gWDg2OjpNT1YxNnJtIDogWDg2OjpNT1YxNm1yOworICBjYXNlIFg4Njo6R1I4X05PUkVYUmVnQ2xhc3NJRDoKKyAgICByZXR1cm4gbG9hZCA/IFg4Njo6TU9WOHJtIDogWDg2OjpNT1Y4bXI7CisgIGNhc2UgWDg2OjpHUjY0X1RDUmVnQ2xhc3NJRDoKKyAgICByZXR1cm4gbG9hZCA/IFg4Njo6TU9WNjRybV9UQyA6IFg4Njo6TU9WNjRtcl9UQzsKKyAgY2FzZSBYODY6OkdSMzJfVENSZWdDbGFzc0lEOgorICAgIHJldHVybiBsb2FkID8gWDg2OjpNT1YzMnJtX1RDIDogWDg2OjpNT1YzMm1yX1RDOworICBjYXNlIFg4Njo6UkZQODBSZWdDbGFzc0lEOgorICAgIHJldHVybiBsb2FkID8gWDg2OjpMRF9GcDgwbSA6IFg4Njo6U1RfRnBQODBtOworICBjYXNlIFg4Njo6UkZQNjRSZWdDbGFzc0lEOgorICAgIHJldHVybiBsb2FkID8gWDg2OjpMRF9GcDY0bSA6IFg4Njo6U1RfRnA2NG07CisgIGNhc2UgWDg2OjpSRlAzMlJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIGxvYWQgPyBYODY6OkxEX0ZwMzJtIDogWDg2OjpTVF9GcDMybTsKKyAgY2FzZSBYODY6OkZSMzJSZWdDbGFzc0lEOgorICAgIHJldHVybiBsb2FkID8gWDg2OjpNT1ZTU3JtIDogWDg2OjpNT1ZTU21yOworICBjYXNlIFg4Njo6RlI2NFJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIGxvYWQgPyBYODY6Ok1PVlNEcm0gOiBYODY6Ok1PVlNEbXI7CisgIGNhc2UgWDg2OjpWUjEyOFJlZ0NsYXNzSUQ6CisgICAgLy8gSWYgc3RhY2sgaXMgcmVhbGlnbmVkIHdlIGNhbiB1c2UgYWxpZ25lZCBzdG9yZXMuCisgICAgaWYgKGlzU3RhY2tBbGlnbmVkKQorICAgICAgcmV0dXJuIGxvYWQgPyBYODY6Ok1PVkFQU3JtIDogWDg2OjpNT1ZBUFNtcjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbG9hZCA/IFg4Njo6TU9WVVBTcm0gOiBYODY6Ok1PVlVQU21yOworICBjYXNlIFg4Njo6VlI2NFJlZ0NsYXNzSUQ6CisgICAgcmV0dXJuIGxvYWQgPyBYODY6Ok1NWF9NT1ZRNjRybSA6IFg4Njo6TU1YX01PVlE2NG1yOworICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBnZXRTdG9yZVJlZ09wY29kZSh1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YWNrQWxpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRNYWNoaW5lICZUTSkgeworICByZXR1cm4gZ2V0TG9hZFN0b3JlUmVnT3Bjb2RlKFNyY1JlZywgUkMsIGlzU3RhY2tBbGlnbmVkLCBUTSwgZmFsc2UpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBnZXRMb2FkUmVnT3Bjb2RlKHVuc2lnbmVkIERlc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdGFja0FsaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgeworICByZXR1cm4gZ2V0TG9hZFN0b3JlUmVnT3Bjb2RlKERlc3RSZWcsIFJDLCBpc1N0YWNrQWxpZ25lZCwgVE0sIHRydWUpOworfQorCit2b2lkIFg4Nkluc3RySW5mbzo6c3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgYXNzZXJ0KE1GLmdldEZyYW1lSW5mbygpLT5nZXRPYmplY3RTaXplKEZyYW1lSWR4KSA+PSBSQy0+Z2V0U2l6ZSgpICYmCisgICAgICAgICAiU3RhY2sgc2xvdCB0b28gc21hbGwgZm9yIHN0b3JlIik7CisgIGJvb2wgaXNBbGlnbmVkID0gKFJJLmdldFN0YWNrQWxpZ25tZW50KCkgPj0gMTYpIHx8IFJJLmNhblJlYWxpZ25TdGFjayhNRik7CisgIHVuc2lnbmVkIE9wYyA9IGdldFN0b3JlUmVnT3Bjb2RlKFNyY1JlZywgUkMsIGlzQWxpZ25lZCwgVE0pOworICBEZWJ1Z0xvYyBETCA9IE1CQi5maW5kRGVidWdMb2MoTUkpOworICBhZGRGcmFtZVJlZmVyZW5jZShCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoT3BjKSksIEZyYW1lSWR4KQorICAgIC5hZGRSZWcoU3JjUmVnLCBnZXRLaWxsUmVnU3RhdGUoaXNLaWxsKSk7Cit9CisKK3ZvaWQgWDg2SW5zdHJJbmZvOjpzdG9yZVJlZ1RvQWRkcihNYWNoaW5lRnVuY3Rpb24gJk1GLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBNTU9CZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBNTU9FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICZOZXdNSXMpIGNvbnN0IHsKKyAgYm9vbCBpc0FsaWduZWQgPSBNTU9CZWdpbiAhPSBNTU9FbmQgJiYgKCpNTU9CZWdpbiktPmdldEFsaWdubWVudCgpID49IDE2OworICB1bnNpZ25lZCBPcGMgPSBnZXRTdG9yZVJlZ09wY29kZShTcmNSZWcsIFJDLCBpc0FsaWduZWQsIFRNKTsKKyAgRGVidWdMb2MgREw7CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSShNRiwgREwsIGdldChPcGMpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFkZHIuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBNSUIuYWRkT3BlcmFuZChBZGRyW2ldKTsKKyAgTUlCLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKTsKKyAgKCpNSUIpLnNldE1lbVJlZnMoTU1PQmVnaW4sIE1NT0VuZCk7CisgIE5ld01Jcy5wdXNoX2JhY2soTUlCKTsKK30KKworCit2b2lkIFg4Nkluc3RySW5mbzo6bG9hZFJlZ0Zyb21TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqTUJCLmdldFBhcmVudCgpOworICBib29sIGlzQWxpZ25lZCA9IChSSS5nZXRTdGFja0FsaWdubWVudCgpID49IDE2KSB8fCBSSS5jYW5SZWFsaWduU3RhY2soTUYpOworICB1bnNpZ25lZCBPcGMgPSBnZXRMb2FkUmVnT3Bjb2RlKERlc3RSZWcsIFJDLCBpc0FsaWduZWQsIFRNKTsKKyAgRGVidWdMb2MgREwgPSBNQkIuZmluZERlYnVnTG9jKE1JKTsKKyAgYWRkRnJhbWVSZWZlcmVuY2UoQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KE9wYyksIERlc3RSZWcpLCBGcmFtZUlkeCk7Cit9CisKK3ZvaWQgWDg2SW5zdHJJbmZvOjpsb2FkUmVnRnJvbUFkZHIoTWFjaGluZUZ1bmN0aW9uICZNRiwgdW5zaWduZWQgRGVzdFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIE1NT0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgTU1PRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICZOZXdNSXMpIGNvbnN0IHsKKyAgYm9vbCBpc0FsaWduZWQgPSBNTU9CZWdpbiAhPSBNTU9FbmQgJiYgKCpNTU9CZWdpbiktPmdldEFsaWdubWVudCgpID49IDE2OworICB1bnNpZ25lZCBPcGMgPSBnZXRMb2FkUmVnT3Bjb2RlKERlc3RSZWcsIFJDLCBpc0FsaWduZWQsIFRNKTsKKyAgRGVidWdMb2MgREw7CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSShNRiwgREwsIGdldChPcGMpLCBEZXN0UmVnKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFkZHIuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBNSUIuYWRkT3BlcmFuZChBZGRyW2ldKTsKKyAgKCpNSUIpLnNldE1lbVJlZnMoTU1PQmVnaW4sIE1NT0VuZCk7CisgIE5ld01Jcy5wdXNoX2JhY2soTUlCKTsKK30KKworYm9vbCBYODZJbnN0ckluZm86OnNwaWxsQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZDU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICBpZiAoQ1NJLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIERlYnVnTG9jIERMID0gTUJCLmZpbmREZWJ1Z0xvYyhNSSk7CisKKyAgYm9vbCBpczY0Qml0ID0gVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5pczY0Qml0KCk7CisgIGJvb2wgaXNXaW42NCA9IFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXNUYXJnZXRXaW42NCgpOworICB1bnNpZ25lZCBTbG90U2l6ZSA9IGlzNjRCaXQgPyA4IDogNDsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgdW5zaWduZWQgRlBSZWcgPSBSSS5nZXRGcmFtZVJlZ2lzdGVyKE1GKTsKKyAgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyAqWDg2RkkgPSBNRi5nZXRJbmZvPFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisgIHVuc2lnbmVkIENhbGxlZUZyYW1lU2l6ZSA9IDA7CisgIAorICB1bnNpZ25lZCBPcGMgPSBpczY0Qml0ID8gWDg2OjpQVVNINjRyIDogWDg2OjpQVVNIMzJyOworICBmb3IgKHVuc2lnbmVkIGkgPSBDU0kuc2l6ZSgpOyBpICE9IDA7IC0taSkgeworICAgIHVuc2lnbmVkIFJlZyA9IENTSVtpLTFdLmdldFJlZygpOworICAgIC8vIEFkZCB0aGUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIGFzIGxpdmUtaW4uIEl0J3Mga2lsbGVkIGF0IHRoZSBzcGlsbC4KKyAgICBNQkIuYWRkTGl2ZUluKFJlZyk7CisgICAgaWYgKFJlZyA9PSBGUFJlZykKKyAgICAgIC8vIFg4NlJlZ2lzdGVySW5mbzo6ZW1pdFByb2xvZ3VlIHdpbGwgaGFuZGxlIHNwaWxsaW5nIG9mIGZyYW1lIHJlZ2lzdGVyLgorICAgICAgY29udGludWU7CisgICAgaWYgKCFYODY6OlZSMTI4UmVnQ2xhc3MuY29udGFpbnMoUmVnKSAmJiAhaXNXaW42NCkgeworICAgICAgQ2FsbGVlRnJhbWVTaXplICs9IFNsb3RTaXplOworICAgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KE9wYykpLmFkZFJlZyhSZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBUUkktPmdldE1pbmltYWxQaHlzUmVnQ2xhc3MoUmVnKTsKKyAgICAgIHN0b3JlUmVnVG9TdGFja1Nsb3QoTUJCLCBNSSwgUmVnLCB0cnVlLCBDU0lbaS0xXS5nZXRGcmFtZUlkeCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSQywgJlJJKTsKKyAgICB9CisgIH0KKworICBYODZGSS0+c2V0Q2FsbGVlU2F2ZWRGcmFtZVNpemUoQ2FsbGVlRnJhbWVTaXplKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWDg2SW5zdHJJbmZvOjpyZXN0b3JlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGlmIChDU0kuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRGVidWdMb2MgREwgPSBNQkIuZmluZERlYnVnTG9jKE1JKTsKKworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1CQi5nZXRQYXJlbnQoKTsKKyAgdW5zaWduZWQgRlBSZWcgPSBSSS5nZXRGcmFtZVJlZ2lzdGVyKE1GKTsKKyAgYm9vbCBpczY0Qml0ID0gVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5pczY0Qml0KCk7CisgIGJvb2wgaXNXaW42NCA9IFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXNUYXJnZXRXaW42NCgpOworICB1bnNpZ25lZCBPcGMgPSBpczY0Qml0ID8gWDg2OjpQT1A2NHIgOiBYODY6OlBPUDMycjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgUmVnID0gQ1NJW2ldLmdldFJlZygpOworICAgIGlmIChSZWcgPT0gRlBSZWcpCisgICAgICAvLyBYODZSZWdpc3RlckluZm86OmVtaXRFcGlsb2d1ZSB3aWxsIGhhbmRsZSByZXN0b3Jpbmcgb2YgZnJhbWUgcmVnaXN0ZXIuCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIVg4Njo6VlIxMjhSZWdDbGFzcy5jb250YWlucyhSZWcpICYmICFpc1dpbjY0KSB7CisgICAgICBCdWlsZE1JKE1CQiwgTUksIERMLCBnZXQoT3BjKSwgUmVnKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBUUkktPmdldE1pbmltYWxQaHlzUmVnQ2xhc3MoUmVnKTsKKyAgICAgIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1CQiwgTUksIFJlZywgQ1NJW2ldLmdldEZyYW1lSWR4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSQywgJlJJKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK01hY2hpbmVJbnN0cioKK1g4Nkluc3RySW5mbzo6ZW1pdEZyYW1lSW5kZXhEZWJ1Z1ZhbHVlKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRnJhbWVJeCwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpNRFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdCB7CisgIFg4NkFkZHJlc3NNb2RlIEFNOworICBBTS5CYXNlVHlwZSA9IFg4NkFkZHJlc3NNb2RlOjpGcmFtZUluZGV4QmFzZTsKKyAgQU0uQmFzZS5GcmFtZUluZGV4ID0gRnJhbWVJeDsKKyAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPSBCdWlsZE1JKE1GLCBETCwgZ2V0KFg4Njo6REJHX1ZBTFVFKSk7CisgIGFkZEZ1bGxBZGRyZXNzKE1JQiwgQU0pLmFkZEltbShPZmZzZXQpLmFkZE1ldGFkYXRhKE1EUHRyKTsKKyAgcmV0dXJuICYqTUlCOworfQorCitzdGF0aWMgTWFjaGluZUluc3RyICpGdXNlVHdvQWRkckluc3QoTWFjaGluZUZ1bmN0aW9uICZNRiwgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJk1PcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJKSB7CisgIC8vIENyZWF0ZSB0aGUgYmFzZSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBtZW1vcnkgb3BlcmFuZCBhcyB0aGUgZmlyc3QgcGFydC4KKyAgTWFjaGluZUluc3RyICpOZXdNSSA9IE1GLkNyZWF0ZU1hY2hpbmVJbnN0cihUSUkuZ2V0KE9wY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUktPmdldERlYnVnTG9jKCksIHRydWUpOworICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQihOZXdNSSk7CisgIHVuc2lnbmVkIE51bUFkZHJPcHMgPSBNT3Muc2l6ZSgpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUFkZHJPcHM7ICsraSkKKyAgICBNSUIuYWRkT3BlcmFuZChNT3NbaV0pOworICBpZiAoTnVtQWRkck9wcyA8IDQpICAvLyBGcmFtZUluZGV4IG9ubHkKKyAgICBhZGRPZmZzZXQoTUlCLCAwKTsKKyAgCisgIC8vIExvb3Agb3ZlciB0aGUgcmVzdCBvZiB0aGUgcmkgb3BlcmFuZHMsIGNvbnZlcnRpbmcgdGhlbSBvdmVyLgorICB1bnNpZ25lZCBOdW1PcHMgPSBNSS0+Z2V0RGVzYygpLmdldE51bU9wZXJhbmRzKCktMjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHM7ICsraSkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKGkrMik7CisgICAgTUlCLmFkZE9wZXJhbmQoTU8pOworICB9CisgIGZvciAodW5zaWduZWQgaSA9IE51bU9wcysyLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgTUlCLmFkZE9wZXJhbmQoTU8pOworICB9CisgIHJldHVybiBNSUI7Cit9CisKK3N0YXRpYyBNYWNoaW5lSW5zdHIgKkZ1c2VJbnN0KE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGNvZGUsIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZNT3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk1JLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSkgeworICBNYWNoaW5lSW5zdHIgKk5ld01JID0gTUYuQ3JlYXRlTWFjaGluZUluc3RyKFRJSS5nZXQoT3Bjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSS0+Z2V0RGVidWdMb2MoKSwgdHJ1ZSk7CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCKE5ld01JKTsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoaSA9PSBPcE5vKSB7CisgICAgICBhc3NlcnQoTU8uaXNSZWcoKSAmJiAiRXhwZWN0ZWQgdG8gZm9sZCBpbnRvIHJlZyBvcGVyYW5kISIpOworICAgICAgdW5zaWduZWQgTnVtQWRkck9wcyA9IE1Pcy5zaXplKCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUFkZHJPcHM7ICsraSkKKyAgICAgICAgTUlCLmFkZE9wZXJhbmQoTU9zW2ldKTsKKyAgICAgIGlmIChOdW1BZGRyT3BzIDwgNCkgIC8vIEZyYW1lSW5kZXggb25seQorICAgICAgICBhZGRPZmZzZXQoTUlCLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgTUlCLmFkZE9wZXJhbmQoTU8pOworICAgIH0KKyAgfQorICByZXR1cm4gTUlCOworfQorCitzdGF0aWMgTWFjaGluZUluc3RyICpNYWtlTTBJbnN0KGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJLCB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJk1PcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSkgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKk1JLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCID0gQnVpbGRNSShNRiwgTUktPmdldERlYnVnTG9jKCksIFRJSS5nZXQoT3Bjb2RlKSk7CisKKyAgdW5zaWduZWQgTnVtQWRkck9wcyA9IE1Pcy5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtQWRkck9wczsgKytpKQorICAgIE1JQi5hZGRPcGVyYW5kKE1Pc1tpXSk7CisgIGlmIChOdW1BZGRyT3BzIDwgNCkgIC8vIEZyYW1lSW5kZXggb25seQorICAgIGFkZE9mZnNldChNSUIsIDApOworICByZXR1cm4gTUlCLmFkZEltbSgwKTsKK30KKworTWFjaGluZUluc3RyKgorWDg2SW5zdHJJbmZvOjpmb2xkTWVtb3J5T3BlcmFuZEltcGwoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZNT3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplLCB1bnNpZ25lZCBBbGlnbikgY29uc3QgeworICBjb25zdCBEZW5zZU1hcDx1bnNpZ25lZCosIHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4gPiAqT3Bjb2RlVGFibGVQdHI9TlVMTDsKKyAgYm9vbCBpc1R3b0FkZHJGb2xkID0gZmFsc2U7CisgIHVuc2lnbmVkIE51bU9wcyA9IE1JLT5nZXREZXNjKCkuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgYm9vbCBpc1R3b0FkZHIgPSBOdW1PcHMgPiAxICYmCisgICAgTUktPmdldERlc2MoKS5nZXRPcGVyYW5kQ29uc3RyYWludCgxLCBUT0k6OlRJRURfVE8pICE9IC0xOworCisgIE1hY2hpbmVJbnN0ciAqTmV3TUkgPSBOVUxMOworICAvLyBGb2xkaW5nIGEgbWVtb3J5IGxvY2F0aW9uIGludG8gdGhlIHR3by1hZGRyZXNzIHBhcnQgb2YgYSB0d28tYWRkcmVzcworICAvLyBpbnN0cnVjdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiBmb2xkaW5nIGl0IG90aGVyIHBsYWNlcy4gIEl0IHJlcXVpcmVzCisgIC8vIHJlcGxhY2luZyB0aGUgKnR3byogcmVnaXN0ZXJzIHdpdGggdGhlIG1lbW9yeSBsb2NhdGlvbi4KKyAgaWYgKGlzVHdvQWRkciAmJiBOdW1PcHMgPj0gMiAmJiBpIDwgMiAmJgorICAgICAgTUktPmdldE9wZXJhbmQoMCkuaXNSZWcoKSAmJgorICAgICAgTUktPmdldE9wZXJhbmQoMSkuaXNSZWcoKSAmJgorICAgICAgTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgPT0gTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpIHsgCisgICAgT3Bjb2RlVGFibGVQdHIgPSAmUmVnT3AyTWVtT3BUYWJsZTJBZGRyOworICAgIGlzVHdvQWRkckZvbGQgPSB0cnVlOworICB9IGVsc2UgaWYgKGkgPT0gMCkgeyAvLyBJZiBvcGVyYW5kIDAKKyAgICBpZiAoTUktPmdldE9wY29kZSgpID09IFg4Njo6TU9WNjRyMCkKKyAgICAgIE5ld01JID0gTWFrZU0wSW5zdCgqdGhpcywgWDg2OjpNT1Y2NG1pMzIsIE1PcywgTUkpOworICAgIGVsc2UgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6Ok1PVjMycjApCisgICAgICBOZXdNSSA9IE1ha2VNMEluc3QoKnRoaXMsIFg4Njo6TU9WMzJtaSwgTU9zLCBNSSk7CisgICAgZWxzZSBpZiAoTUktPmdldE9wY29kZSgpID09IFg4Njo6TU9WMTZyMCkKKyAgICAgIE5ld01JID0gTWFrZU0wSW5zdCgqdGhpcywgWDg2OjpNT1YxNm1pLCBNT3MsIE1JKTsKKyAgICBlbHNlIGlmIChNSS0+Z2V0T3Bjb2RlKCkgPT0gWDg2OjpNT1Y4cjApCisgICAgICBOZXdNSSA9IE1ha2VNMEluc3QoKnRoaXMsIFg4Njo6TU9WOG1pLCBNT3MsIE1JKTsKKyAgICBpZiAoTmV3TUkpCisgICAgICByZXR1cm4gTmV3TUk7CisgICAgCisgICAgT3Bjb2RlVGFibGVQdHIgPSAmUmVnT3AyTWVtT3BUYWJsZTA7CisgIH0gZWxzZSBpZiAoaSA9PSAxKSB7CisgICAgT3Bjb2RlVGFibGVQdHIgPSAmUmVnT3AyTWVtT3BUYWJsZTE7CisgIH0gZWxzZSBpZiAoaSA9PSAyKSB7CisgICAgT3Bjb2RlVGFibGVQdHIgPSAmUmVnT3AyTWVtT3BUYWJsZTI7CisgIH0KKyAgCisgIC8vIElmIHRhYmxlIHNlbGVjdGVkLi4uCisgIGlmIChPcGNvZGVUYWJsZVB0cikgeworICAgIC8vIEZpbmQgdGhlIE9wY29kZSB0byBmdXNlCisgICAgRGVuc2VNYXA8dW5zaWduZWQqLCBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+ID46OmNvbnN0X2l0ZXJhdG9yIEkgPQorICAgICAgT3Bjb2RlVGFibGVQdHItPmZpbmQoKHVuc2lnbmVkKilNSS0+Z2V0T3Bjb2RlKCkpOworICAgIGlmIChJICE9IE9wY29kZVRhYmxlUHRyLT5lbmQoKSkgeworICAgICAgdW5zaWduZWQgT3Bjb2RlID0gSS0+c2Vjb25kLmZpcnN0OworICAgICAgdW5zaWduZWQgTWluQWxpZ24gPSBJLT5zZWNvbmQuc2Vjb25kOworICAgICAgaWYgKEFsaWduIDwgTWluQWxpZ24pCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgYm9vbCBOYXJyb3dUb01PVjMycm0gPSBmYWxzZTsKKyAgICAgIGlmIChTaXplKSB7CisgICAgICAgIHVuc2lnbmVkIFJDU2l6ZSA9ICBNSS0+Z2V0RGVzYygpLk9wSW5mb1tpXS5nZXRSZWdDbGFzcygmUkkpLT5nZXRTaXplKCk7CisgICAgICAgIGlmIChTaXplIDwgUkNTaXplKSB7CisgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBzYWZlIHRvIGZvbGQgdGhlIGxvYWQuIElmIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgaXMKKyAgICAgICAgICAvLyBuYXJyb3dlciB0aGFuIHRoZSBsb2FkIHdpZHRoLCB0aGVuIGl0J3Mgbm90LgorICAgICAgICAgIGlmIChPcGNvZGUgIT0gWDg2OjpNT1Y2NHJtIHx8IFJDU2l6ZSAhPSA4IHx8IFNpemUgIT0gNCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSA2NC1iaXQgbG9hZCwgYnV0IHRoZSBzcGlsbCBzbG90IGlzIDMyLCB0aGVuIHdlIGNhbiBkbworICAgICAgICAgIC8vIGEgMzItYml0IGxvYWQgd2hpY2ggaXMgaW1wbGljaXRseSB6ZXJvLWV4dGVuZGVkLiBUaGlzIGxpa2VseSBpcyBkdWUKKyAgICAgICAgICAvLyB0byBsaXZlaW50ZXJ2YWxhbmFseXNpcyByZW1hdCdpbmcgYSBsb2FkIGZyb20gc3RhY2sgc2xvdC4KKyAgICAgICAgICBpZiAoTUktPmdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCkgfHwgTUktPmdldE9wZXJhbmQoMSkuZ2V0U3ViUmVnKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICBPcGNvZGUgPSBYODY6Ok1PVjMycm07CisgICAgICAgICAgTmFycm93VG9NT1YzMnJtID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaXNUd29BZGRyRm9sZCkKKyAgICAgICAgTmV3TUkgPSBGdXNlVHdvQWRkckluc3QoTUYsIE9wY29kZSwgTU9zLCBNSSwgKnRoaXMpOworICAgICAgZWxzZQorICAgICAgICBOZXdNSSA9IEZ1c2VJbnN0KE1GLCBPcGNvZGUsIGksIE1PcywgTUksICp0aGlzKTsKKworICAgICAgaWYgKE5hcnJvd1RvTU9WMzJybSkgeworICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgd2UgdXNlIGEgTU9WMzJybSB0byBsb2FkIGEgMzItYml0CisgICAgICAgIC8vIHZhbHVlIGFuZCB6ZXJvLWV4dGVuZCB0aGUgdG9wIGJpdHMuIENoYW5nZSB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIKKyAgICAgICAgLy8gdG8gYSAzMi1iaXQgb25lLgorICAgICAgICB1bnNpZ25lZCBEc3RSZWcgPSBOZXdNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKERzdFJlZykpCisgICAgICAgICAgTmV3TUktPmdldE9wZXJhbmQoMCkuc2V0UmVnKFJJLmdldFN1YlJlZyhEc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OnN1Yl8zMmJpdCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgTmV3TUktPmdldE9wZXJhbmQoMCkuc2V0U3ViUmVnKFg4Njo6c3ViXzMyYml0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOZXdNSTsKKyAgICB9CisgIH0KKyAgCisgIC8vIE5vIGZ1c2lvbiAKKyAgaWYgKFByaW50RmFpbGVkRnVzaW5nICYmICFNSS0+aXNDb3B5KCkpCisgICAgZGJncygpIDw8ICJXZSBmYWlsZWQgdG8gZnVzZSBvcGVyYW5kICIgPDwgaSA8PCAiIGluICIgPDwgKk1JOworICByZXR1cm4gTlVMTDsKK30KKworCitNYWNoaW5lSW5zdHIqIFg4Nkluc3RySW5mbzo6Zm9sZE1lbW9yeU9wZXJhbmRJbXBsKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRnJhbWVJbmRleCkgY29uc3QgeworICAvLyBDaGVjayBzd2l0Y2ggZmxhZyAKKyAgaWYgKE5vRnVzaW5nKSByZXR1cm4gTlVMTDsKKworICBpZiAoIU1GLmdldEZ1bmN0aW9uKCktPmhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok9wdGltaXplRm9yU2l6ZSkpCisgICAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIFg4Njo6Q1ZUU0QyU1NycjoKKyAgICBjYXNlIFg4Njo6SW50X0NWVFNEMlNTcnI6CisgICAgY2FzZSBYODY6OkNWVFNTMlNEcnI6CisgICAgY2FzZSBYODY6OkludF9DVlRTUzJTRHJyOgorICAgIGNhc2UgWDg2OjpSQ1BTU3I6CisgICAgY2FzZSBYODY6OlJDUFNTcl9JbnQ6CisgICAgY2FzZSBYODY6OlJPVU5EU0RyX0ludDoKKyAgICBjYXNlIFg4Njo6Uk9VTkRTU3JfSW50OgorICAgIGNhc2UgWDg2OjpSU1FSVFNTcjoKKyAgICBjYXNlIFg4Njo6UlNRUlRTU3JfSW50OgorICAgIGNhc2UgWDg2OjpTUVJUU1NyOgorICAgIGNhc2UgWDg2OjpTUVJUU1NyX0ludDoKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgdW5zaWduZWQgU2l6ZSA9IE1GSS0+Z2V0T2JqZWN0U2l6ZShGcmFtZUluZGV4KTsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gTUZJLT5nZXRPYmplY3RBbGlnbm1lbnQoRnJhbWVJbmRleCk7CisgIGlmIChPcHMuc2l6ZSgpID09IDIgJiYgT3BzWzBdID09IDAgJiYgT3BzWzFdID09IDEpIHsKKyAgICB1bnNpZ25lZCBOZXdPcGMgPSAwOworICAgIHVuc2lnbmVkIFJDU2l6ZSA9IDA7CisgICAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsKKyAgICBjYXNlIFg4Njo6VEVTVDhycjogIE5ld09wYyA9IFg4Njo6Q01QOHJpOyBSQ1NpemUgPSAxOyBicmVhazsKKyAgICBjYXNlIFg4Njo6VEVTVDE2cnI6IE5ld09wYyA9IFg4Njo6Q01QMTZyaTg7IFJDU2l6ZSA9IDI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpURVNUMzJycjogTmV3T3BjID0gWDg2OjpDTVAzMnJpODsgUkNTaXplID0gNDsgYnJlYWs7CisgICAgY2FzZSBYODY6OlRFU1Q2NHJyOiBOZXdPcGMgPSBYODY6OkNNUDY0cmk4OyBSQ1NpemUgPSA4OyBicmVhazsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgaXQncyBzYWZlIHRvIGZvbGQgdGhlIGxvYWQuIElmIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgaXMKKyAgICAvLyBuYXJyb3dlciB0aGFuIHRoZSBsb2FkIHdpZHRoLCB0aGVuIGl0J3Mgbm90LgorICAgIGlmIChTaXplIDwgUkNTaXplKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgLy8gQ2hhbmdlIHRvIENNUFhYcmkgciwgMCBmaXJzdC4KKyAgICBNSS0+c2V0RGVzYyhnZXQoTmV3T3BjKSk7CisgICAgTUktPmdldE9wZXJhbmQoMSkuQ2hhbmdlVG9JbW1lZGlhdGUoMCk7CisgIH0gZWxzZSBpZiAoT3BzLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBOVUxMOworCisgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kLDQ+IE1PczsKKyAgTU9zLnB1c2hfYmFjayhNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlRkkoRnJhbWVJbmRleCkpOworICByZXR1cm4gZm9sZE1lbW9yeU9wZXJhbmRJbXBsKE1GLCBNSSwgT3BzWzBdLCBNT3MsIFNpemUsIEFsaWdubWVudCk7Cit9CisKK01hY2hpbmVJbnN0ciogWDg2SW5zdHJJbmZvOjpmb2xkTWVtb3J5T3BlcmFuZEltcGwoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqTG9hZE1JKSBjb25zdCB7CisgIC8vIENoZWNrIHN3aXRjaCBmbGFnIAorICBpZiAoTm9GdXNpbmcpIHJldHVybiBOVUxMOworCisgIGlmICghTUYuZ2V0RnVuY3Rpb24oKS0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6T3B0aW1pemVGb3JTaXplKSkKKyAgICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgWDg2OjpDVlRTRDJTU3JyOgorICAgIGNhc2UgWDg2OjpJbnRfQ1ZUU0QyU1NycjoKKyAgICBjYXNlIFg4Njo6Q1ZUU1MyU0RycjoKKyAgICBjYXNlIFg4Njo6SW50X0NWVFNTMlNEcnI6CisgICAgY2FzZSBYODY6OlJDUFNTcjoKKyAgICBjYXNlIFg4Njo6UkNQU1NyX0ludDoKKyAgICBjYXNlIFg4Njo6Uk9VTkRTRHJfSW50OgorICAgIGNhc2UgWDg2OjpST1VORFNTcl9JbnQ6CisgICAgY2FzZSBYODY6OlJTUVJUU1NyOgorICAgIGNhc2UgWDg2OjpSU1FSVFNTcl9JbnQ6CisgICAgY2FzZSBYODY6OlNRUlRTU3I6CisgICAgY2FzZSBYODY6OlNRUlRTU3JfSW50OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8vIERldGVybWluZSB0aGUgYWxpZ25tZW50IG9mIHRoZSBsb2FkLgorICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAwOworICBpZiAoTG9hZE1JLT5oYXNPbmVNZW1PcGVyYW5kKCkpCisgICAgQWxpZ25tZW50ID0gKCpMb2FkTUktPm1lbW9wZXJhbmRzX2JlZ2luKCkpLT5nZXRBbGlnbm1lbnQoKTsKKyAgZWxzZQorICAgIHN3aXRjaCAoTG9hZE1JLT5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgWDg2OjpWX1NFVDBQUzoKKyAgICBjYXNlIFg4Njo6Vl9TRVQwUEQ6CisgICAgY2FzZSBYODY6OlZfU0VUMFBJOgorICAgIGNhc2UgWDg2OjpWX1NFVEFMTE9ORVM6CisgICAgICBBbGlnbm1lbnQgPSAxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWDg2OjpGc0ZMRDBTRDoKKyAgICAgIEFsaWdubWVudCA9IDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIFg4Njo6RnNGTEQwU1M6CisgICAgICBBbGlnbm1lbnQgPSA0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkRvbid0IGtub3cgaG93IHRvIGZvbGQgdGhpcyBpbnN0cnVjdGlvbiEiKTsKKyAgICB9CisgIGlmIChPcHMuc2l6ZSgpID09IDIgJiYgT3BzWzBdID09IDAgJiYgT3BzWzFdID09IDEpIHsKKyAgICB1bnNpZ25lZCBOZXdPcGMgPSAwOworICAgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CisgICAgY2FzZSBYODY6OlRFU1Q4cnI6ICBOZXdPcGMgPSBYODY6OkNNUDhyaTsgYnJlYWs7CisgICAgY2FzZSBYODY6OlRFU1QxNnJyOiBOZXdPcGMgPSBYODY6OkNNUDE2cmk4OyBicmVhazsKKyAgICBjYXNlIFg4Njo6VEVTVDMycnI6IE5ld09wYyA9IFg4Njo6Q01QMzJyaTg7IGJyZWFrOworICAgIGNhc2UgWDg2OjpURVNUNjRycjogTmV3T3BjID0gWDg2OjpDTVA2NHJpODsgYnJlYWs7CisgICAgfQorICAgIC8vIENoYW5nZSB0byBDTVBYWHJpIHIsIDAgZmlyc3QuCisgICAgTUktPnNldERlc2MoZ2V0KE5ld09wYykpOworICAgIE1JLT5nZXRPcGVyYW5kKDEpLkNoYW5nZVRvSW1tZWRpYXRlKDApOworICB9IGVsc2UgaWYgKE9wcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gTlVMTDsKKworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCxYODY6OkFkZHJOdW1PcGVyYW5kcz4gTU9zOworICBzd2l0Y2ggKExvYWRNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBYODY6OlZfU0VUMFBTOgorICBjYXNlIFg4Njo6Vl9TRVQwUEQ6CisgIGNhc2UgWDg2OjpWX1NFVDBQSToKKyAgY2FzZSBYODY6OlZfU0VUQUxMT05FUzoKKyAgY2FzZSBYODY6OkZzRkxEMFNEOgorICBjYXNlIFg4Njo6RnNGTEQwU1M6IHsKKyAgICAvLyBGb2xkaW5nIGEgVl9TRVQwUD8gb3IgVl9TRVRBTExPTkVTIGFzIGEgbG9hZCwgdG8gZWFzZSByZWdpc3RlciBwcmVzc3VyZS4KKyAgICAvLyBDcmVhdGUgYSBjb25zdGFudC1wb29sIGVudHJ5IGFuZCBvcGVyYW5kcyB0byBsb2FkIGZyb20gaXQuCisKKyAgICAvLyBNZWRpdW0gYW5kIGxhcmdlIG1vZGUgY2FuJ3QgZm9sZCBsb2FkcyB0aGlzIHdheS4KKyAgICBpZiAoVE0uZ2V0Q29kZU1vZGVsKCkgIT0gQ29kZU1vZGVsOjpTbWFsbCAmJgorICAgICAgICBUTS5nZXRDb2RlTW9kZWwoKSAhPSBDb2RlTW9kZWw6Oktlcm5lbCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8geDg2LTMyIFBJQyByZXF1aXJlcyBhIFBJQyBiYXNlIHJlZ2lzdGVyIGZvciBjb25zdGFudCBwb29scy4KKyAgICB1bnNpZ25lZCBQSUNCYXNlID0gMDsKKyAgICBpZiAoVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlBJQ18pIHsKKyAgICAgIGlmIChUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzNjRCaXQoKSkKKyAgICAgICAgUElDQmFzZSA9IFg4Njo6UklQOworICAgICAgZWxzZQorICAgICAgICAvLyBGSVhNRTogUElDQmFzZSA9IGdldEdsb2JhbEJhc2VSZWcoJk1GKTsKKyAgICAgICAgLy8gVGhpcyBkb2Vzbid0IHdvcmsgZm9yIHNldmVyYWwgcmVhc29ucy4KKyAgICAgICAgLy8gMS4gR2xvYmFsQmFzZVJlZyBtYXkgaGF2ZSBiZWVuIHNwaWxsZWQuCisgICAgICAgIC8vIDIuIEl0IG1heSBub3QgYmUgbGl2ZSBhdCBNSS4KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgY29uc3RhbnQtcG9vbCBlbnRyeS4KKyAgICBNYWNoaW5lQ29uc3RhbnRQb29sICZNQ1AgPSAqTUYuZ2V0Q29uc3RhbnRQb29sKCk7CisgICAgY29uc3QgVHlwZSAqVHk7CisgICAgaWYgKExvYWRNSS0+Z2V0T3Bjb2RlKCkgPT0gWDg2OjpGc0ZMRDBTUykKKyAgICAgIFR5ID0gVHlwZTo6Z2V0RmxvYXRUeShNRi5nZXRGdW5jdGlvbigpLT5nZXRDb250ZXh0KCkpOworICAgIGVsc2UgaWYgKExvYWRNSS0+Z2V0T3Bjb2RlKCkgPT0gWDg2OjpGc0ZMRDBTRCkKKyAgICAgIFR5ID0gVHlwZTo6Z2V0RG91YmxlVHkoTUYuZ2V0RnVuY3Rpb24oKS0+Z2V0Q29udGV4dCgpKTsKKyAgICBlbHNlCisgICAgICBUeSA9IFZlY3RvclR5cGU6OmdldChUeXBlOjpnZXRJbnQzMlR5KE1GLmdldEZ1bmN0aW9uKCktPmdldENvbnRleHQoKSksIDQpOworICAgIGNvbnN0IENvbnN0YW50ICpDID0gTG9hZE1JLT5nZXRPcGNvZGUoKSA9PSBYODY6OlZfU0VUQUxMT05FUyA/CisgICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoVHkpIDoKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeSk7CisgICAgdW5zaWduZWQgQ1BJID0gTUNQLmdldENvbnN0YW50UG9vbEluZGV4KEMsIEFsaWdubWVudCk7CisKKyAgICAvLyBDcmVhdGUgb3BlcmFuZHMgdG8gbG9hZCBmcm9tIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgorICAgIE1Pcy5wdXNoX2JhY2soTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZyhQSUNCYXNlLCBmYWxzZSkpOworICAgIE1Pcy5wdXNoX2JhY2soTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbSgxKSk7CisgICAgTU9zLnB1c2hfYmFjayhNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKDAsIGZhbHNlKSk7CisgICAgTU9zLnB1c2hfYmFjayhNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlQ1BJKENQSSwgMCkpOworICAgIE1Pcy5wdXNoX2JhY2soTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZygwLCBmYWxzZSkpOworICAgIGJyZWFrOworICB9CisgIGRlZmF1bHQ6IHsKKyAgICAvLyBGb2xkaW5nIGEgbm9ybWFsIGxvYWQuIEp1c3QgY29weSB0aGUgbG9hZCdzIGFkZHJlc3Mgb3BlcmFuZHMuCisgICAgdW5zaWduZWQgTnVtT3BzID0gTG9hZE1JLT5nZXREZXNjKCkuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBOdW1PcHMgLSBYODY6OkFkZHJOdW1PcGVyYW5kczsgaSAhPSBOdW1PcHM7ICsraSkKKyAgICAgIE1Pcy5wdXNoX2JhY2soTG9hZE1JLT5nZXRPcGVyYW5kKGkpKTsKKyAgICBicmVhazsKKyAgfQorICB9CisgIHJldHVybiBmb2xkTWVtb3J5T3BlcmFuZEltcGwoTUYsIE1JLCBPcHNbMF0sIE1PcywgMCwgQWxpZ25tZW50KTsKK30KKworCitib29sIFg4Nkluc3RySW5mbzo6Y2FuRm9sZE1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZPcHMpIGNvbnN0IHsKKyAgLy8gQ2hlY2sgc3dpdGNoIGZsYWcgCisgIGlmIChOb0Z1c2luZykgcmV0dXJuIDA7CisKKyAgaWYgKE9wcy5zaXplKCkgPT0gMiAmJiBPcHNbMF0gPT0gMCAmJiBPcHNbMV0gPT0gMSkgeworICAgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgWDg2OjpURVNUOHJyOiAKKyAgICBjYXNlIFg4Njo6VEVTVDE2cnI6CisgICAgY2FzZSBYODY6OlRFU1QzMnJyOgorICAgIGNhc2UgWDg2OjpURVNUNjRycjoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChPcHMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIE9wTnVtID0gT3BzWzBdOworICB1bnNpZ25lZCBPcGMgPSBNSS0+Z2V0T3Bjb2RlKCk7CisgIHVuc2lnbmVkIE51bU9wcyA9IE1JLT5nZXREZXNjKCkuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgYm9vbCBpc1R3b0FkZHIgPSBOdW1PcHMgPiAxICYmCisgICAgTUktPmdldERlc2MoKS5nZXRPcGVyYW5kQ29uc3RyYWludCgxLCBUT0k6OlRJRURfVE8pICE9IC0xOworCisgIC8vIEZvbGRpbmcgYSBtZW1vcnkgbG9jYXRpb24gaW50byB0aGUgdHdvLWFkZHJlc3MgcGFydCBvZiBhIHR3by1hZGRyZXNzCisgIC8vIGluc3RydWN0aW9uIGlzIGRpZmZlcmVudCB0aGFuIGZvbGRpbmcgaXQgb3RoZXIgcGxhY2VzLiAgSXQgcmVxdWlyZXMKKyAgLy8gcmVwbGFjaW5nIHRoZSAqdHdvKiByZWdpc3RlcnMgd2l0aCB0aGUgbWVtb3J5IGxvY2F0aW9uLgorICBjb25zdCBEZW5zZU1hcDx1bnNpZ25lZCosIHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4gPiAqT3Bjb2RlVGFibGVQdHI9TlVMTDsKKyAgaWYgKGlzVHdvQWRkciAmJiBOdW1PcHMgPj0gMiAmJiBPcE51bSA8IDIpIHsgCisgICAgT3Bjb2RlVGFibGVQdHIgPSAmUmVnT3AyTWVtT3BUYWJsZTJBZGRyOworICB9IGVsc2UgaWYgKE9wTnVtID09IDApIHsgLy8gSWYgb3BlcmFuZCAwCisgICAgc3dpdGNoIChPcGMpIHsKKyAgICBjYXNlIFg4Njo6TU9WOHIwOgorICAgIGNhc2UgWDg2OjpNT1YxNnIwOgorICAgIGNhc2UgWDg2OjpNT1YzMnIwOgorICAgIGNhc2UgWDg2OjpNT1Y2NHIwOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIE9wY29kZVRhYmxlUHRyID0gJlJlZ09wMk1lbU9wVGFibGUwOworICB9IGVsc2UgaWYgKE9wTnVtID09IDEpIHsKKyAgICBPcGNvZGVUYWJsZVB0ciA9ICZSZWdPcDJNZW1PcFRhYmxlMTsKKyAgfSBlbHNlIGlmIChPcE51bSA9PSAyKSB7CisgICAgT3Bjb2RlVGFibGVQdHIgPSAmUmVnT3AyTWVtT3BUYWJsZTI7CisgIH0KKyAgCisgIGlmIChPcGNvZGVUYWJsZVB0cikgeworICAgIC8vIEZpbmQgdGhlIE9wY29kZSB0byBmdXNlCisgICAgRGVuc2VNYXA8dW5zaWduZWQqLCBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+ID46OmNvbnN0X2l0ZXJhdG9yIEkgPQorICAgICAgT3Bjb2RlVGFibGVQdHItPmZpbmQoKHVuc2lnbmVkKilPcGMpOworICAgIGlmIChJICE9IE9wY29kZVRhYmxlUHRyLT5lbmQoKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBUYXJnZXRJbnN0ckluZm9JbXBsOjpjYW5Gb2xkTWVtb3J5T3BlcmFuZChNSSwgT3BzKTsKK30KKworYm9vbCBYODZJbnN0ckluZm86OnVuZm9sZE1lbW9yeU9wZXJhbmQoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBib29sIFVuZm9sZExvYWQsIGJvb2wgVW5mb2xkU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAmTmV3TUlzKSBjb25zdCB7CisgIERlbnNlTWFwPHVuc2lnbmVkKiwgc3RkOjpwYWlyPHVuc2lnbmVkLHVuc2lnbmVkPiA+Ojpjb25zdF9pdGVyYXRvciBJID0KKyAgICBNZW1PcDJSZWdPcFRhYmxlLmZpbmQoKHVuc2lnbmVkKilNSS0+Z2V0T3Bjb2RlKCkpOworICBpZiAoSSA9PSBNZW1PcDJSZWdPcFRhYmxlLmVuZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgdW5zaWduZWQgT3BjID0gSS0+c2Vjb25kLmZpcnN0OworICB1bnNpZ25lZCBJbmRleCA9IEktPnNlY29uZC5zZWNvbmQgJiAweGY7CisgIGJvb2wgRm9sZGVkTG9hZCA9IEktPnNlY29uZC5zZWNvbmQgJiAoMSA8PCA0KTsKKyAgYm9vbCBGb2xkZWRTdG9yZSA9IEktPnNlY29uZC5zZWNvbmQgJiAoMSA8PCA1KTsKKyAgaWYgKFVuZm9sZExvYWQgJiYgIUZvbGRlZExvYWQpCisgICAgcmV0dXJuIGZhbHNlOworICBVbmZvbGRMb2FkICY9IEZvbGRlZExvYWQ7CisgIGlmIChVbmZvbGRTdG9yZSAmJiAhRm9sZGVkU3RvcmUpCisgICAgcmV0dXJuIGZhbHNlOworICBVbmZvbGRTdG9yZSAmPSBGb2xkZWRTdG9yZTsKKworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJlRJRCA9IGdldChPcGMpOworICBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyAmVE9JID0gVElELk9wSW5mb1tJbmRleF07CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gVE9JLmdldFJlZ0NsYXNzKCZSSSk7CisgIGlmICghTUktPmhhc09uZU1lbU9wZXJhbmQoKSAmJgorICAgICAgUkMgPT0gJlg4Njo6VlIxMjhSZWdDbGFzcyAmJgorICAgICAgIVRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXNVbmFsaWduZWRNZW1BY2Nlc3NGYXN0KCkpCisgICAgLy8gV2l0aG91dCBtZW1vcGVyYW5kcywgbG9hZFJlZ0Zyb21BZGRyIGFuZCBzdG9yZVJlZ1RvU3RhY2tTbG90IHdpbGwKKyAgICAvLyBjb25zZXJ2YXRpdmVseSBhc3N1bWUgdGhlIGFkZHJlc3MgaXMgdW5hbGlnbmVkLiBUaGF0J3MgYmFkIGZvcgorICAgIC8vIHBlcmZvcm1hbmNlLgorICAgIHJldHVybiBmYWxzZTsKKyAgU21hbGxWZWN0b3I8TWFjaGluZU9wZXJhbmQsIFg4Njo6QWRkck51bU9wZXJhbmRzPiBBZGRyT3BzOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCwyPiBCZWZvcmVPcHM7CisgIFNtYWxsVmVjdG9yPE1hY2hpbmVPcGVyYW5kLDI+IEFmdGVyT3BzOworICBTbWFsbFZlY3RvcjxNYWNoaW5lT3BlcmFuZCw0PiBJbXBPcHM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmT3AgPSBNSS0+Z2V0T3BlcmFuZChpKTsKKyAgICBpZiAoaSA+PSBJbmRleCAmJiBpIDwgSW5kZXggKyBYODY6OkFkZHJOdW1PcGVyYW5kcykKKyAgICAgIEFkZHJPcHMucHVzaF9iYWNrKE9wKTsKKyAgICBlbHNlIGlmIChPcC5pc1JlZygpICYmIE9wLmlzSW1wbGljaXQoKSkKKyAgICAgIEltcE9wcy5wdXNoX2JhY2soT3ApOworICAgIGVsc2UgaWYgKGkgPCBJbmRleCkKKyAgICAgIEJlZm9yZU9wcy5wdXNoX2JhY2soT3ApOworICAgIGVsc2UgaWYgKGkgPiBJbmRleCkKKyAgICAgIEFmdGVyT3BzLnB1c2hfYmFjayhPcCk7CisgIH0KKworICAvLyBFbWl0IHRoZSBsb2FkIGluc3RydWN0aW9uLgorICBpZiAoVW5mb2xkTG9hZCkgeworICAgIHN0ZDo6cGFpcjxNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciwKKyAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3I+IE1NT3MgPQorICAgICAgTUYuZXh0cmFjdExvYWRNZW1SZWZzKE1JLT5tZW1vcGVyYW5kc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JLT5tZW1vcGVyYW5kc19lbmQoKSk7CisgICAgbG9hZFJlZ0Zyb21BZGRyKE1GLCBSZWcsIEFkZHJPcHMsIFJDLCBNTU9zLmZpcnN0LCBNTU9zLnNlY29uZCwgTmV3TUlzKTsKKyAgICBpZiAoVW5mb2xkU3RvcmUpIHsKKyAgICAgIC8vIEFkZHJlc3Mgb3BlcmFuZHMgY2Fubm90IGJlIG1hcmtlZCBpc0tpbGwuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IDEgKyBYODY6OkFkZHJOdW1PcGVyYW5kczsgKytpKSB7CisgICAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IE5ld01Jc1swXS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgaWYgKE1PLmlzUmVnKCkpCisgICAgICAgICAgTU8uc2V0SXNLaWxsKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBFbWl0IHRoZSBkYXRhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ciAqRGF0YU1JID0gTUYuQ3JlYXRlTWFjaGluZUluc3RyKFRJRCwgTUktPmdldERlYnVnTG9jKCksIHRydWUpOworICBNYWNoaW5lSW5zdHJCdWlsZGVyIE1JQihEYXRhTUkpOworICAKKyAgaWYgKEZvbGRlZFN0b3JlKQorICAgIE1JQi5hZGRSZWcoUmVnLCBSZWdTdGF0ZTo6RGVmaW5lKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEJlZm9yZU9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE1JQi5hZGRPcGVyYW5kKEJlZm9yZU9wc1tpXSk7CisgIGlmIChGb2xkZWRMb2FkKQorICAgIE1JQi5hZGRSZWcoUmVnKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFmdGVyT3BzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgTUlCLmFkZE9wZXJhbmQoQWZ0ZXJPcHNbaV0pOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW1wT3BzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBJbXBPcHNbaV07CisgICAgTUlCLmFkZFJlZyhNTy5nZXRSZWcoKSwKKyAgICAgICAgICAgICAgIGdldERlZlJlZ1N0YXRlKE1PLmlzRGVmKCkpIHwKKyAgICAgICAgICAgICAgIFJlZ1N0YXRlOjpJbXBsaWNpdCB8CisgICAgICAgICAgICAgICBnZXRLaWxsUmVnU3RhdGUoTU8uaXNLaWxsKCkpIHwKKyAgICAgICAgICAgICAgIGdldERlYWRSZWdTdGF0ZShNTy5pc0RlYWQoKSkgfAorICAgICAgICAgICAgICAgZ2V0VW5kZWZSZWdTdGF0ZShNTy5pc1VuZGVmKCkpKTsKKyAgfQorICAvLyBDaGFuZ2UgQ01QMzJyaSByLCAwIGJhY2sgdG8gVEVTVDMycnIgciwgciwgZXRjLgorICB1bnNpZ25lZCBOZXdPcGMgPSAwOworICBzd2l0Y2ggKERhdGFNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgWDg2OjpDTVA2NHJpMzI6CisgIGNhc2UgWDg2OjpDTVA2NHJpODoKKyAgY2FzZSBYODY6OkNNUDMycmk6CisgIGNhc2UgWDg2OjpDTVAzMnJpODoKKyAgY2FzZSBYODY6OkNNUDE2cmk6CisgIGNhc2UgWDg2OjpDTVAxNnJpODoKKyAgY2FzZSBYODY6OkNNUDhyaTogeworICAgIE1hY2hpbmVPcGVyYW5kICZNTzAgPSBEYXRhTUktPmdldE9wZXJhbmQoMCk7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PMSA9IERhdGFNSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBpZiAoTU8xLmdldEltbSgpID09IDApIHsKKyAgICAgIHN3aXRjaCAoRGF0YU1JLT5nZXRPcGNvZGUoKSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlIFg4Njo6Q01QNjRyaTg6CisgICAgICBjYXNlIFg4Njo6Q01QNjRyaTMyOiBOZXdPcGMgPSBYODY6OlRFU1Q2NHJyOyBicmVhazsKKyAgICAgIGNhc2UgWDg2OjpDTVAzMnJpODoKKyAgICAgIGNhc2UgWDg2OjpDTVAzMnJpOiAgIE5ld09wYyA9IFg4Njo6VEVTVDMycnI7IGJyZWFrOworICAgICAgY2FzZSBYODY6OkNNUDE2cmk4OgorICAgICAgY2FzZSBYODY6OkNNUDE2cmk6ICAgTmV3T3BjID0gWDg2OjpURVNUMTZycjsgYnJlYWs7CisgICAgICBjYXNlIFg4Njo6Q01QOHJpOiAgICBOZXdPcGMgPSBYODY6OlRFU1Q4cnI7IGJyZWFrOworICAgICAgfQorICAgICAgRGF0YU1JLT5zZXREZXNjKGdldChOZXdPcGMpKTsKKyAgICAgIE1PMS5DaGFuZ2VUb1JlZ2lzdGVyKE1PMC5nZXRSZWcoKSwgZmFsc2UpOworICAgIH0KKyAgfQorICB9CisgIE5ld01Jcy5wdXNoX2JhY2soRGF0YU1JKTsKKworICAvLyBFbWl0IHRoZSBzdG9yZSBpbnN0cnVjdGlvbi4KKyAgaWYgKFVuZm9sZFN0b3JlKSB7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqRHN0UkMgPSBUSUQuT3BJbmZvWzBdLmdldFJlZ0NsYXNzKCZSSSk7CisgICAgc3RkOjpwYWlyPE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yLAorICAgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvcj4gTU1PcyA9CisgICAgICBNRi5leHRyYWN0U3RvcmVNZW1SZWZzKE1JLT5tZW1vcGVyYW5kc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSS0+bWVtb3BlcmFuZHNfZW5kKCkpOworICAgIHN0b3JlUmVnVG9BZGRyKE1GLCBSZWcsIHRydWUsIEFkZHJPcHMsIERzdFJDLCBNTU9zLmZpcnN0LCBNTU9zLnNlY29uZCwgTmV3TUlzKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sCitYODZJbnN0ckluZm86OnVuZm9sZE1lbW9yeU9wZXJhbmQoU2VsZWN0aW9uREFHICZEQUcsIFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0ROb2RlKj4gJk5ld05vZGVzKSBjb25zdCB7CisgIGlmICghTi0+aXNNYWNoaW5lT3Bjb2RlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIERlbnNlTWFwPHVuc2lnbmVkKiwgc3RkOjpwYWlyPHVuc2lnbmVkLHVuc2lnbmVkPiA+Ojpjb25zdF9pdGVyYXRvciBJID0KKyAgICBNZW1PcDJSZWdPcFRhYmxlLmZpbmQoKHVuc2lnbmVkKilOLT5nZXRNYWNoaW5lT3Bjb2RlKCkpOworICBpZiAoSSA9PSBNZW1PcDJSZWdPcFRhYmxlLmVuZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgdW5zaWduZWQgT3BjID0gSS0+c2Vjb25kLmZpcnN0OworICB1bnNpZ25lZCBJbmRleCA9IEktPnNlY29uZC5zZWNvbmQgJiAweGY7CisgIGJvb2wgRm9sZGVkTG9hZCA9IEktPnNlY29uZC5zZWNvbmQgJiAoMSA8PCA0KTsKKyAgYm9vbCBGb2xkZWRTdG9yZSA9IEktPnNlY29uZC5zZWNvbmQgJiAoMSA8PCA1KTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZUSUQgPSBnZXQoT3BjKTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBUSUQuT3BJbmZvW0luZGV4XS5nZXRSZWdDbGFzcygmUkkpOworICB1bnNpZ25lZCBOdW1EZWZzID0gVElELk51bURlZnM7CisgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+IEFkZHJPcHM7CisgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+IEJlZm9yZU9wczsKKyAgc3RkOjp2ZWN0b3I8U0RWYWx1ZT4gQWZ0ZXJPcHM7CisgIERlYnVnTG9jIGRsID0gTi0+Z2V0RGVidWdMb2MoKTsKKyAgdW5zaWduZWQgTnVtT3BzID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHMtMTsgKytpKSB7CisgICAgU0RWYWx1ZSBPcCA9IE4tPmdldE9wZXJhbmQoaSk7CisgICAgaWYgKGkgPj0gSW5kZXgtTnVtRGVmcyAmJiBpIDwgSW5kZXgtTnVtRGVmcyArIFg4Njo6QWRkck51bU9wZXJhbmRzKQorICAgICAgQWRkck9wcy5wdXNoX2JhY2soT3ApOworICAgIGVsc2UgaWYgKGkgPCBJbmRleC1OdW1EZWZzKQorICAgICAgQmVmb3JlT3BzLnB1c2hfYmFjayhPcCk7CisgICAgZWxzZSBpZiAoaSA+IEluZGV4LU51bURlZnMpCisgICAgICBBZnRlck9wcy5wdXNoX2JhY2soT3ApOworICB9CisgIFNEVmFsdWUgQ2hhaW4gPSBOLT5nZXRPcGVyYW5kKE51bU9wcy0xKTsKKyAgQWRkck9wcy5wdXNoX2JhY2soQ2hhaW4pOworCisgIC8vIEVtaXQgdGhlIGxvYWQgaW5zdHJ1Y3Rpb24uCisgIFNETm9kZSAqTG9hZCA9IDA7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCk7CisgIGlmIChGb2xkZWRMb2FkKSB7CisgICAgRVZUIFZUID0gKlJDLT52dF9iZWdpbigpOworICAgIHN0ZDo6cGFpcjxNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciwKKyAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3I+IE1NT3MgPQorICAgICAgTUYuZXh0cmFjdExvYWRNZW1SZWZzKGNhc3Q8TWFjaGluZVNETm9kZT4oTiktPm1lbW9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxNYWNoaW5lU0ROb2RlPihOKS0+bWVtb3BlcmFuZHNfZW5kKCkpOworICAgIGlmICghKCpNTU9zLmZpcnN0KSAmJgorICAgICAgICBSQyA9PSAmWDg2OjpWUjEyOFJlZ0NsYXNzICYmCisgICAgICAgICFUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzVW5hbGlnbmVkTWVtQWNjZXNzRmFzdCgpKQorICAgICAgLy8gRG8gbm90IGludHJvZHVjZSBhIHNsb3cgdW5hbGlnbmVkIGxvYWQuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYm9vbCBpc0FsaWduZWQgPSAoKk1NT3MuZmlyc3QpICYmICgqTU1Pcy5maXJzdCktPmdldEFsaWdubWVudCgpID49IDE2OworICAgIExvYWQgPSBEQUcuZ2V0TWFjaGluZU5vZGUoZ2V0TG9hZFJlZ09wY29kZSgwLCBSQywgaXNBbGlnbmVkLCBUTSksIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlQsIE1WVDo6T3RoZXIsICZBZGRyT3BzWzBdLCBBZGRyT3BzLnNpemUoKSk7CisgICAgTmV3Tm9kZXMucHVzaF9iYWNrKExvYWQpOworCisgICAgLy8gUHJlc2VydmUgbWVtb3J5IHJlZmVyZW5jZSBpbmZvcm1hdGlvbi4KKyAgICBjYXN0PE1hY2hpbmVTRE5vZGU+KExvYWQpLT5zZXRNZW1SZWZzKE1NT3MuZmlyc3QsIE1NT3Muc2Vjb25kKTsKKyAgfQorCisgIC8vIEVtaXQgdGhlIGRhdGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KKyAgc3RkOjp2ZWN0b3I8RVZUPiBWVHM7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkRzdFJDID0gMDsKKyAgaWYgKFRJRC5nZXROdW1EZWZzKCkgPiAwKSB7CisgICAgRHN0UkMgPSBUSUQuT3BJbmZvWzBdLmdldFJlZ0NsYXNzKCZSSSk7CisgICAgVlRzLnB1c2hfYmFjaygqRHN0UkMtPnZ0X2JlZ2luKCkpOworICB9CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1WYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBFVlQgVlQgPSBOLT5nZXRWYWx1ZVR5cGUoaSk7CisgICAgaWYgKFZUICE9IE1WVDo6T3RoZXIgJiYgaSA+PSAodW5zaWduZWQpVElELmdldE51bURlZnMoKSkKKyAgICAgIFZUcy5wdXNoX2JhY2soVlQpOworICB9CisgIGlmIChMb2FkKQorICAgIEJlZm9yZU9wcy5wdXNoX2JhY2soU0RWYWx1ZShMb2FkLCAwKSk7CisgIHN0ZDo6Y29weShBZnRlck9wcy5iZWdpbigpLCBBZnRlck9wcy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKEJlZm9yZU9wcykpOworICBTRE5vZGUgKk5ld05vZGU9IERBRy5nZXRNYWNoaW5lTm9kZShPcGMsIGRsLCBWVHMsICZCZWZvcmVPcHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlZm9yZU9wcy5zaXplKCkpOworICBOZXdOb2Rlcy5wdXNoX2JhY2soTmV3Tm9kZSk7CisKKyAgLy8gRW1pdCB0aGUgc3RvcmUgaW5zdHJ1Y3Rpb24uCisgIGlmIChGb2xkZWRTdG9yZSkgeworICAgIEFkZHJPcHMucG9wX2JhY2soKTsKKyAgICBBZGRyT3BzLnB1c2hfYmFjayhTRFZhbHVlKE5ld05vZGUsIDApKTsKKyAgICBBZGRyT3BzLnB1c2hfYmFjayhDaGFpbik7CisgICAgc3RkOjpwYWlyPE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yLAorICAgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvcj4gTU1PcyA9CisgICAgICBNRi5leHRyYWN0U3RvcmVNZW1SZWZzKGNhc3Q8TWFjaGluZVNETm9kZT4oTiktPm1lbW9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8TWFjaGluZVNETm9kZT4oTiktPm1lbW9wZXJhbmRzX2VuZCgpKTsKKyAgICBpZiAoISgqTU1Pcy5maXJzdCkgJiYKKyAgICAgICAgUkMgPT0gJlg4Njo6VlIxMjhSZWdDbGFzcyAmJgorICAgICAgICAhVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5pc1VuYWxpZ25lZE1lbUFjY2Vzc0Zhc3QoKSkKKyAgICAgIC8vIERvIG5vdCBpbnRyb2R1Y2UgYSBzbG93IHVuYWxpZ25lZCBzdG9yZS4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBib29sIGlzQWxpZ25lZCA9ICgqTU1Pcy5maXJzdCkgJiYgKCpNTU9zLmZpcnN0KS0+Z2V0QWxpZ25tZW50KCkgPj0gMTY7CisgICAgU0ROb2RlICpTdG9yZSA9IERBRy5nZXRNYWNoaW5lTm9kZShnZXRTdG9yZVJlZ09wY29kZSgwLCBEc3RSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxpZ25lZCwgVE0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkck9wc1swXSwgQWRkck9wcy5zaXplKCkpOworICAgIE5ld05vZGVzLnB1c2hfYmFjayhTdG9yZSk7CisKKyAgICAvLyBQcmVzZXJ2ZSBtZW1vcnkgcmVmZXJlbmNlIGluZm9ybWF0aW9uLgorICAgIGNhc3Q8TWFjaGluZVNETm9kZT4oTG9hZCktPnNldE1lbVJlZnMoTU1Pcy5maXJzdCwgTU1Pcy5zZWNvbmQpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3Vuc2lnbmVkIFg4Nkluc3RySW5mbzo6Z2V0T3Bjb2RlQWZ0ZXJNZW1vcnlVbmZvbGQodW5zaWduZWQgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVuZm9sZExvYWQsIGJvb2wgVW5mb2xkU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpMb2FkUmVnSW5kZXgpIGNvbnN0IHsKKyAgRGVuc2VNYXA8dW5zaWduZWQqLCBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+ID46OmNvbnN0X2l0ZXJhdG9yIEkgPQorICAgIE1lbU9wMlJlZ09wVGFibGUuZmluZCgodW5zaWduZWQqKU9wYyk7CisgIGlmIChJID09IE1lbU9wMlJlZ09wVGFibGUuZW5kKCkpCisgICAgcmV0dXJuIDA7CisgIGJvb2wgRm9sZGVkTG9hZCA9IEktPnNlY29uZC5zZWNvbmQgJiAoMSA8PCA0KTsKKyAgYm9vbCBGb2xkZWRTdG9yZSA9IEktPnNlY29uZC5zZWNvbmQgJiAoMSA8PCA1KTsKKyAgaWYgKFVuZm9sZExvYWQgJiYgIUZvbGRlZExvYWQpCisgICAgcmV0dXJuIDA7CisgIGlmIChVbmZvbGRTdG9yZSAmJiAhRm9sZGVkU3RvcmUpCisgICAgcmV0dXJuIDA7CisgIGlmIChMb2FkUmVnSW5kZXgpCisgICAgKkxvYWRSZWdJbmRleCA9IEktPnNlY29uZC5zZWNvbmQgJiAweGY7CisgIHJldHVybiBJLT5zZWNvbmQuZmlyc3Q7Cit9CisKK2Jvb2wKK1g4Nkluc3RySW5mbzo6YXJlTG9hZHNGcm9tU2FtZUJhc2VQdHIoU0ROb2RlICpMb2FkMSwgU0ROb2RlICpMb2FkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZPZmZzZXQxLCBpbnQ2NF90ICZPZmZzZXQyKSBjb25zdCB7CisgIGlmICghTG9hZDEtPmlzTWFjaGluZU9wY29kZSgpIHx8ICFMb2FkMi0+aXNNYWNoaW5lT3Bjb2RlKCkpCisgICAgcmV0dXJuIGZhbHNlOworICB1bnNpZ25lZCBPcGMxID0gTG9hZDEtPmdldE1hY2hpbmVPcGNvZGUoKTsKKyAgdW5zaWduZWQgT3BjMiA9IExvYWQyLT5nZXRNYWNoaW5lT3Bjb2RlKCk7CisgIHN3aXRjaCAoT3BjMSkgeworICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgIGNhc2UgWDg2OjpNT1Y4cm06CisgIGNhc2UgWDg2OjpNT1YxNnJtOgorICBjYXNlIFg4Njo6TU9WMzJybToKKyAgY2FzZSBYODY6Ok1PVjY0cm06CisgIGNhc2UgWDg2OjpMRF9GcDMybToKKyAgY2FzZSBYODY6OkxEX0ZwNjRtOgorICBjYXNlIFg4Njo6TERfRnA4MG06CisgIGNhc2UgWDg2OjpNT1ZTU3JtOgorICBjYXNlIFg4Njo6TU9WU0RybToKKyAgY2FzZSBYODY6Ok1NWF9NT1ZENjRybToKKyAgY2FzZSBYODY6Ok1NWF9NT1ZRNjRybToKKyAgY2FzZSBYODY6OkZzTU9WQVBTcm06CisgIGNhc2UgWDg2OjpGc01PVkFQRHJtOgorICBjYXNlIFg4Njo6TU9WQVBTcm06CisgIGNhc2UgWDg2OjpNT1ZVUFNybToKKyAgY2FzZSBYODY6Ok1PVlVQU3JtX0ludDoKKyAgY2FzZSBYODY6Ok1PVkFQRHJtOgorICBjYXNlIFg4Njo6TU9WRFFBcm06CisgIGNhc2UgWDg2OjpNT1ZEUVVybToKKyAgY2FzZSBYODY6Ok1PVkRRVXJtX0ludDoKKyAgICBicmVhazsKKyAgfQorICBzd2l0Y2ggKE9wYzIpIHsKKyAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICBjYXNlIFg4Njo6TU9WOHJtOgorICBjYXNlIFg4Njo6TU9WMTZybToKKyAgY2FzZSBYODY6Ok1PVjMycm06CisgIGNhc2UgWDg2OjpNT1Y2NHJtOgorICBjYXNlIFg4Njo6TERfRnAzMm06CisgIGNhc2UgWDg2OjpMRF9GcDY0bToKKyAgY2FzZSBYODY6OkxEX0ZwODBtOgorICBjYXNlIFg4Njo6TU9WU1NybToKKyAgY2FzZSBYODY6Ok1PVlNEcm06CisgIGNhc2UgWDg2OjpNTVhfTU9WRDY0cm06CisgIGNhc2UgWDg2OjpNTVhfTU9WUTY0cm06CisgIGNhc2UgWDg2OjpGc01PVkFQU3JtOgorICBjYXNlIFg4Njo6RnNNT1ZBUERybToKKyAgY2FzZSBYODY6Ok1PVkFQU3JtOgorICBjYXNlIFg4Njo6TU9WVVBTcm06CisgIGNhc2UgWDg2OjpNT1ZVUFNybV9JbnQ6CisgIGNhc2UgWDg2OjpNT1ZBUERybToKKyAgY2FzZSBYODY6Ok1PVkRRQXJtOgorICBjYXNlIFg4Njo6TU9WRFFVcm06CisgIGNhc2UgWDg2OjpNT1ZEUVVybV9JbnQ6CisgICAgYnJlYWs7CisgIH0KKworICAvLyBDaGVjayBpZiBjaGFpbiBvcGVyYW5kcyBhbmQgYmFzZSBhZGRyZXNzZXMgbWF0Y2guCisgIGlmIChMb2FkMS0+Z2V0T3BlcmFuZCgwKSAhPSBMb2FkMi0+Z2V0T3BlcmFuZCgwKSB8fAorICAgICAgTG9hZDEtPmdldE9wZXJhbmQoNSkgIT0gTG9hZDItPmdldE9wZXJhbmQoNSkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBTZWdtZW50IG9wZXJhbmRzIHNob3VsZCBtYXRjaCBhcyB3ZWxsLgorICBpZiAoTG9hZDEtPmdldE9wZXJhbmQoNCkgIT0gTG9hZDItPmdldE9wZXJhbmQoNCkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBTY2FsZSBzaG91bGQgYmUgMSwgSW5kZXggc2hvdWxkIGJlIFJlZzAuCisgIGlmIChMb2FkMS0+Z2V0T3BlcmFuZCgxKSA9PSBMb2FkMi0+Z2V0T3BlcmFuZCgxKSAmJgorICAgICAgTG9hZDEtPmdldE9wZXJhbmQoMikgPT0gTG9hZDItPmdldE9wZXJhbmQoMikpIHsKKyAgICBpZiAoY2FzdDxDb25zdGFudFNETm9kZT4oTG9hZDEtPmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKSAhPSAxKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTm93IGxldCdzIGV4YW1pbmUgdGhlIGRpc3BsYWNlbWVudHMuCisgICAgaWYgKGlzYTxDb25zdGFudFNETm9kZT4oTG9hZDEtPmdldE9wZXJhbmQoMykpICYmCisgICAgICAgIGlzYTxDb25zdGFudFNETm9kZT4oTG9hZDItPmdldE9wZXJhbmQoMykpKSB7CisgICAgICBPZmZzZXQxID0gY2FzdDxDb25zdGFudFNETm9kZT4oTG9hZDEtPmdldE9wZXJhbmQoMykpLT5nZXRTRXh0VmFsdWUoKTsKKyAgICAgIE9mZnNldDIgPSBjYXN0PENvbnN0YW50U0ROb2RlPihMb2FkMi0+Z2V0T3BlcmFuZCgzKSktPmdldFNFeHRWYWx1ZSgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBYODZJbnN0ckluZm86OnNob3VsZFNjaGVkdWxlTG9hZHNOZWFyKFNETm9kZSAqTG9hZDEsIFNETm9kZSAqTG9hZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQxLCBpbnQ2NF90IE9mZnNldDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtTG9hZHMpIGNvbnN0IHsKKyAgYXNzZXJ0KE9mZnNldDIgPiBPZmZzZXQxKTsKKyAgaWYgKChPZmZzZXQyIC0gT2Zmc2V0MSkgLyA4ID4gNjQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIE9wYzEgPSBMb2FkMS0+Z2V0TWFjaGluZU9wY29kZSgpOworICB1bnNpZ25lZCBPcGMyID0gTG9hZDItPmdldE1hY2hpbmVPcGNvZGUoKTsKKyAgaWYgKE9wYzEgIT0gT3BjMikKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBGSVhNRTogb3Zlcmx5IGNvbnNlcnZhdGl2ZT8KKworICBzd2l0Y2ggKE9wYzEpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgWDg2OjpMRF9GcDMybToKKyAgY2FzZSBYODY6OkxEX0ZwNjRtOgorICBjYXNlIFg4Njo6TERfRnA4MG06CisgIGNhc2UgWDg2OjpNTVhfTU9WRDY0cm06CisgIGNhc2UgWDg2OjpNTVhfTU9WUTY0cm06CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRVZUIFZUID0gTG9hZDEtPmdldFZhbHVlVHlwZSgwKTsKKyAgc3dpdGNoIChWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6CisgICAgLy8gWE1NIHJlZ2lzdGVycy4gSW4gNjQtYml0IG1vZGUgd2UgY2FuIGJlIGEgYml0IG1vcmUgYWdncmVzc2l2ZSBzaW5jZSB3ZQorICAgIC8vIGhhdmUgMTYgb2YgdGhlbSB0byBwbGF5IHdpdGguCisgICAgaWYgKFRNLmdldFN1YnRhcmdldEltcGwoKS0+aXM2NEJpdCgpKSB7CisgICAgICBpZiAoTnVtTG9hZHMgPj0gMykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoTnVtTG9hZHMpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgTVZUOjppODoKKyAgY2FzZSBNVlQ6OmkxNjoKKyAgY2FzZSBNVlQ6OmkzMjoKKyAgY2FzZSBNVlQ6Omk2NDoKKyAgY2FzZSBNVlQ6OmYzMjoKKyAgY2FzZSBNVlQ6OmY2NDoKKyAgICBpZiAoTnVtTG9hZHMpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIFg4Nkluc3RySW5mbzo6CitSZXZlcnNlQnJhbmNoQ29uZGl0aW9uKFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQpIGNvbnN0IHsKKyAgYXNzZXJ0KENvbmQuc2l6ZSgpID09IDEgJiYgIkludmFsaWQgWDg2IGJyYW5jaCBjb25kaXRpb24hIik7CisgIFg4Njo6Q29uZENvZGUgQ0MgPSBzdGF0aWNfY2FzdDxYODY6OkNvbmRDb2RlPihDb25kWzBdLmdldEltbSgpKTsKKyAgaWYgKENDID09IFg4Njo6Q09ORF9ORV9PUl9QIHx8IENDID09IFg4Njo6Q09ORF9OUF9PUl9FKQorICAgIHJldHVybiB0cnVlOworICBDb25kWzBdLnNldEltbShHZXRPcHBvc2l0ZUJyYW5jaENvbmRpdGlvbihDQykpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgWDg2SW5zdHJJbmZvOjoKK2lzU2FmZVRvTW92ZVJlZ0NsYXNzRGVmcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAvLyBGSVhNRTogUmV0dXJuIGZhbHNlIGZvciB4ODcgc3RhY2sgcmVnaXN0ZXIgY2xhc3NlcyBmb3Igbm93LiBXZSBjYW4ndAorICAvLyBhbGxvdyBhbnkgbG9hZHMgb2YgdGhlc2UgcmVnaXN0ZXJzIGJlZm9yZSBGcEdldF9TVDBfODAuCisgIHJldHVybiAhKFJDID09ICZYODY6OkNDUlJlZ0NsYXNzIHx8IFJDID09ICZYODY6OlJGUDMyUmVnQ2xhc3MgfHwKKyAgICAgICAgICAgUkMgPT0gJlg4Njo6UkZQNjRSZWdDbGFzcyB8fCBSQyA9PSAmWDg2OjpSRlA4MFJlZ0NsYXNzKTsKK30KKworCisvLy8gaXNYODZfNjRFeHRlbmRlZFJlZyAtIElzIHRoZSBNYWNoaW5lT3BlcmFuZCBhIHg4Ni02NCBleHRlbmRlZCAocjggb3IgaGlnaGVyKQorLy8vIHJlZ2lzdGVyPyAgZS5nLiByOCwgeG1tOCwgeG1tMTMsIGV0Yy4KK2Jvb2wgWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKHVuc2lnbmVkIFJlZ05vKSB7CisgIHN3aXRjaCAoUmVnTm8pIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgWDg2OjpSODogICAgY2FzZSBYODY6OlI5OiAgICBjYXNlIFg4Njo6UjEwOiAgIGNhc2UgWDg2OjpSMTE6CisgIGNhc2UgWDg2OjpSMTI6ICAgY2FzZSBYODY6OlIxMzogICBjYXNlIFg4Njo6UjE0OiAgIGNhc2UgWDg2OjpSMTU6CisgIGNhc2UgWDg2OjpSOEQ6ICAgY2FzZSBYODY6OlI5RDogICBjYXNlIFg4Njo6UjEwRDogIGNhc2UgWDg2OjpSMTFEOgorICBjYXNlIFg4Njo6UjEyRDogIGNhc2UgWDg2OjpSMTNEOiAgY2FzZSBYODY6OlIxNEQ6ICBjYXNlIFg4Njo6UjE1RDoKKyAgY2FzZSBYODY6OlI4VzogICBjYXNlIFg4Njo6UjlXOiAgIGNhc2UgWDg2OjpSMTBXOiAgY2FzZSBYODY6OlIxMVc6CisgIGNhc2UgWDg2OjpSMTJXOiAgY2FzZSBYODY6OlIxM1c6ICBjYXNlIFg4Njo6UjE0VzogIGNhc2UgWDg2OjpSMTVXOgorICBjYXNlIFg4Njo6UjhCOiAgIGNhc2UgWDg2OjpSOUI6ICAgY2FzZSBYODY6OlIxMEI6ICBjYXNlIFg4Njo6UjExQjoKKyAgY2FzZSBYODY6OlIxMkI6ICBjYXNlIFg4Njo6UjEzQjogIGNhc2UgWDg2OjpSMTRCOiAgY2FzZSBYODY6OlIxNUI6CisgIGNhc2UgWDg2OjpYTU04OiAgY2FzZSBYODY6OlhNTTk6ICBjYXNlIFg4Njo6WE1NMTA6IGNhc2UgWDg2OjpYTU0xMToKKyAgY2FzZSBYODY6OlhNTTEyOiBjYXNlIFg4Njo6WE1NMTM6IGNhc2UgWDg2OjpYTU0xNDogY2FzZSBYODY6OlhNTTE1OgorICBjYXNlIFg4Njo6WU1NODogIGNhc2UgWDg2OjpZTU05OiAgY2FzZSBYODY6OllNTTEwOiBjYXNlIFg4Njo6WU1NMTE6CisgIGNhc2UgWDg2OjpZTU0xMjogY2FzZSBYODY6OllNTTEzOiBjYXNlIFg4Njo6WU1NMTQ6IGNhc2UgWDg2OjpZTU0xNToKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBnZXRHbG9iYWxCYXNlUmVnIC0gUmV0dXJuIGEgdmlydHVhbCByZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZQorLy8vIHRoZSBnbG9iYWwgYmFzZSByZWdpc3RlciB2YWx1ZS4gT3V0cHV0IGluc3RydWN0aW9ucyByZXF1aXJlZCB0bworLy8vIGluaXRpYWxpemUgdGhlIHJlZ2lzdGVyIGluIHRoZSBmdW5jdGlvbiBlbnRyeSBibG9jaywgaWYgbmVjZXNzYXJ5LgorLy8vCisvLy8gVE9ETzogRWxpbWluYXRlIHRoaXMgYW5kIG1vdmUgdGhlIGNvZGUgdG8gWDg2TWFjaGluZUZ1bmN0aW9uSW5mby4KKy8vLwordW5zaWduZWQgWDg2SW5zdHJJbmZvOjpnZXRHbG9iYWxCYXNlUmVnKE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0IHsKKyAgYXNzZXJ0KCFUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzNjRCaXQoKSAmJgorICAgICAgICAgIlg4Ni02NCBQSUMgdXNlcyBSSVAgcmVsYXRpdmUgYWRkcmVzc2luZyIpOworCisgIFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8gKlg4NkZJID0gTUYtPmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKyAgdW5zaWduZWQgR2xvYmFsQmFzZVJlZyA9IFg4NkZJLT5nZXRHbG9iYWxCYXNlUmVnKCk7CisgIGlmIChHbG9iYWxCYXNlUmVnICE9IDApCisgICAgcmV0dXJuIEdsb2JhbEJhc2VSZWc7CisKKyAgLy8gQ3JlYXRlIHRoZSByZWdpc3Rlci4gVGhlIGNvZGUgdG8gaW5pdGlhbGl6ZSBpdCBpcyBpbnNlcnRlZAorICAvLyBsYXRlciwgYnkgdGhlIENHQlIgcGFzcyAoYmVsb3cpLgorICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZSZWdJbmZvID0gTUYtPmdldFJlZ0luZm8oKTsKKyAgR2xvYmFsQmFzZVJlZyA9IFJlZ0luZm8uY3JlYXRlVmlydHVhbFJlZ2lzdGVyKFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MpOworICBYODZGSS0+c2V0R2xvYmFsQmFzZVJlZyhHbG9iYWxCYXNlUmVnKTsKKyAgcmV0dXJuIEdsb2JhbEJhc2VSZWc7Cit9CisKKy8vIFRoZXNlIGFyZSB0aGUgcmVwbGFjZWFibGUgU1NFIGluc3RydWN0aW9ucy4gU29tZSBvZiB0aGVzZSBoYXZlIEludCB2YXJpYW50cworLy8gdGhhdCB3ZSBkb24ndCBpbmNsdWRlIGhlcmUuIFdlIGRvbid0IHdhbnQgdG8gcmVwbGFjZSBpbnN0cnVjdGlvbnMgc2VsZWN0ZWQKKy8vIGJ5IGludHJpbnNpY3MuCitzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVwbGFjZWFibGVJbnN0cnNbXVszXSA9IHsKKyAgLy9QYWNrZWRJbnQgICAgICAgUGFja2VkU2luZ2xlICAgICBQYWNrZWREb3VibGUKKyAgeyBYODY6Ok1PVkFQU21yLCAgIFg4Njo6TU9WQVBEbXIsICBYODY6Ok1PVkRRQW1yICB9LAorICB7IFg4Njo6TU9WQVBTcm0sICAgWDg2OjpNT1ZBUERybSwgIFg4Njo6TU9WRFFBcm0gIH0sCisgIHsgWDg2OjpNT1ZBUFNyciwgICBYODY6Ok1PVkFQRHJyLCAgWDg2OjpNT1ZEUUFyciAgfSwKKyAgeyBYODY6Ok1PVlVQU21yLCAgIFg4Njo6TU9WVVBEbXIsICBYODY6Ok1PVkRRVW1yICB9LAorICB7IFg4Njo6TU9WVVBTcm0sICAgWDg2OjpNT1ZVUERybSwgIFg4Njo6TU9WRFFVcm0gIH0sCisgIHsgWDg2OjpNT1ZOVFBTbXIsICBYODY6Ok1PVk5UUERtciwgWDg2OjpNT1ZOVERRbXIgfSwKKyAgeyBYODY6OkFORE5QU3JtLCAgIFg4Njo6QU5ETlBEcm0sICBYODY6OlBBTkROcm0gICB9LAorICB7IFg4Njo6QU5ETlBTcnIsICAgWDg2OjpBTkROUERyciwgIFg4Njo6UEFORE5yciAgIH0sCisgIHsgWDg2OjpBTkRQU3JtLCAgICBYODY6OkFORFBEcm0sICAgWDg2OjpQQU5Ecm0gICAgfSwKKyAgeyBYODY6OkFORFBTcnIsICAgIFg4Njo6QU5EUERyciwgICBYODY6OlBBTkRyciAgICB9LAorICB7IFg4Njo6T1JQU3JtLCAgICAgWDg2OjpPUlBEcm0sICAgIFg4Njo6UE9Scm0gICAgIH0sCisgIHsgWDg2OjpPUlBTcnIsICAgICBYODY6Ok9SUERyciwgICAgWDg2OjpQT1JyciAgICAgfSwKKyAgeyBYODY6OlZfU0VUMFBTLCAgIFg4Njo6Vl9TRVQwUEQsICBYODY6OlZfU0VUMFBJICB9LAorICB7IFg4Njo6WE9SUFNybSwgICAgWDg2OjpYT1JQRHJtLCAgIFg4Njo6UFhPUnJtICAgIH0sCisgIHsgWDg2OjpYT1JQU3JyLCAgICBYODY6OlhPUlBEcnIsICAgWDg2OjpQWE9ScnIgICAgfSwKK307CisKKy8vIEZJWE1FOiBTb21lIHNodWZmbGUgYW5kIHVucGFjayBpbnN0cnVjdGlvbnMgaGF2ZSBlcXVpdmFsZW50cyBpbiBkaWZmZXJlbnQKKy8vIGRvbWFpbnMsIGJ1dCB0aGV5IHJlcXVpcmUgYSBiaXQgbW9yZSB3b3JrIHRoYW4ganVzdCBzd2l0Y2hpbmcgb3Bjb2Rlcy4KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkICpsb29rdXAodW5zaWduZWQgb3Bjb2RlLCB1bnNpZ25lZCBkb21haW4pIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGFycmF5X2xlbmd0aG9mKFJlcGxhY2VhYmxlSW5zdHJzKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFJlcGxhY2VhYmxlSW5zdHJzW2ldW2RvbWFpbi0xXSA9PSBvcGNvZGUpCisgICAgICByZXR1cm4gUmVwbGFjZWFibGVJbnN0cnNbaV07CisgIHJldHVybiAwOworfQorCitzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQxNl90PgorWDg2SW5zdHJJbmZvOjpHZXRTU0VEb21haW4oY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICB1aW50MTZfdCBkb21haW4gPSAoTUktPmdldERlc2MoKS5UU0ZsYWdzID4+IFg4NklJOjpTU0VEb21haW5TaGlmdCkgJiAzOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluICYmIGxvb2t1cChNSS0+Z2V0T3Bjb2RlKCksIGRvbWFpbikgPyAweGUgOiAwKTsKK30KKwordm9pZCBYODZJbnN0ckluZm86OlNldFNTRURvbWFpbihNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBEb21haW4pIGNvbnN0IHsKKyAgYXNzZXJ0KERvbWFpbj4wICYmIERvbWFpbjw0ICYmICJJbnZhbGlkIGV4ZWN1dGlvbiBkb21haW4iKTsKKyAgdWludDE2X3QgZG9tID0gKE1JLT5nZXREZXNjKCkuVFNGbGFncyA+PiBYODZJSTo6U1NFRG9tYWluU2hpZnQpICYgMzsKKyAgYXNzZXJ0KGRvbSAmJiAiTm90IGFuIFNTRSBpbnN0cnVjdGlvbiIpOworICBjb25zdCB1bnNpZ25lZCAqdGFibGUgPSBsb29rdXAoTUktPmdldE9wY29kZSgpLCBkb20pOworICBhc3NlcnQodGFibGUgJiYgIkNhbm5vdCBjaGFuZ2UgZG9tYWluIik7CisgIE1JLT5zZXREZXNjKGdldCh0YWJsZVtEb21haW4tMV0pKTsKK30KKworLy8vIGdldE5vb3BGb3JNYWNob1RhcmdldCAtIFJldHVybiB0aGUgbm9vcCBpbnN0cnVjdGlvbiB0byB1c2UgZm9yIGEgbm9vcC4KK3ZvaWQgWDg2SW5zdHJJbmZvOjpnZXROb29wRm9yTWFjaG9UYXJnZXQoTUNJbnN0ICZOb3BJbnN0KSBjb25zdCB7CisgIE5vcEluc3Quc2V0T3Bjb2RlKFg4Njo6Tk9PUCk7Cit9CisKK25hbWVzcGFjZSB7CisgIC8vLyBDR0JSIC0gQ3JlYXRlIEdsb2JhbCBCYXNlIFJlZyBwYXNzLiBUaGlzIGluaXRpYWxpemVzIHRoZSBQSUMKKyAgLy8vIGdsb2JhbCBiYXNlIHJlZ2lzdGVyIGZvciB4ODYtMzIuCisgIHN0cnVjdCBDR0JSIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOworICAgIENHQlIoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgeworICAgICAgY29uc3QgWDg2VGFyZ2V0TWFjaGluZSAqVE0gPQorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBYODZUYXJnZXRNYWNoaW5lICo+KCZNRi5nZXRUYXJnZXQoKSk7CisKKyAgICAgIGFzc2VydCghVE0tPmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXM2NEJpdCgpICYmCisgICAgICAgICAgICAgIlg4Ni02NCBQSUMgdXNlcyBSSVAgcmVsYXRpdmUgYWRkcmVzc2luZyIpOworCisgICAgICAvLyBPbmx5IGVtaXQgYSBnbG9iYWwgYmFzZSByZWcgaW4gUElDIG1vZGUuCisgICAgICBpZiAoVE0tPmdldFJlbG9jYXRpb25Nb2RlbCgpICE9IFJlbG9jOjpQSUNfKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8vIEluc2VydCB0aGUgc2V0IG9mIEdsb2JhbEJhc2VSZWcgaW50byB0aGUgZmlyc3QgTUJCIG9mIHRoZSBmdW5jdGlvbgorICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJkZpcnN0TUJCID0gTUYuZnJvbnQoKTsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJID0gRmlyc3RNQkIuYmVnaW4oKTsKKyAgICAgIERlYnVnTG9jIERMID0gRmlyc3RNQkIuZmluZERlYnVnTG9jKE1CQkkpOworICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmUmVnSW5mbyA9IE1GLmdldFJlZ0luZm8oKTsKKyAgICAgIGNvbnN0IFg4Nkluc3RySW5mbyAqVElJID0gVE0tPmdldEluc3RySW5mbygpOworCisgICAgICB1bnNpZ25lZCBQQzsKKyAgICAgIGlmIChUTS0+Z2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5pc1BJQ1N0eWxlR09UKCkpCisgICAgICAgIFBDID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcyk7CisgICAgICBlbHNlCisgICAgICAgIFBDID0gVElJLT5nZXRHbG9iYWxCYXNlUmVnKCZNRik7CisgIAorICAgICAgLy8gT3BlcmFuZCBvZiBNb3ZlUEN0b1N0YWNrIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSBhc20gcHJpbnRlci4gSXQncworICAgICAgLy8gb25seSB1c2VkIGluIEpJVCBjb2RlIGVtaXNzaW9uIGFzIGRpc3BsYWNlbWVudCB0byBwYy4KKyAgICAgIEJ1aWxkTUkoRmlyc3RNQkIsIE1CQkksIERMLCBUSUktPmdldChYODY6Ok1PVlBDMzJyKSwgUEMpLmFkZEltbSgwKTsKKyAgCisgICAgICAvLyBJZiB3ZSdyZSB1c2luZyB2YW5pbGxhICdHT1QnIFBJQyBzdHlsZSwgd2Ugc2hvdWxkIHVzZSByZWxhdGl2ZSBhZGRyZXNzaW5nCisgICAgICAvLyBub3QgdG8gcGMsIGJ1dCB0byBfR0xPQkFMX09GRlNFVF9UQUJMRV8gZXh0ZXJuYWwuCisgICAgICBpZiAoVE0tPmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXNQSUNTdHlsZUdPVCgpKSB7CisgICAgICAgIHVuc2lnbmVkIEdsb2JhbEJhc2VSZWcgPSBUSUktPmdldEdsb2JhbEJhc2VSZWcoJk1GKTsKKyAgICAgICAgLy8gR2VuZXJhdGUgYWRkbCAkX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyArIFsuLXBpY2xhYmVsXSwgJXNvbWVfcmVnaXN0ZXIKKyAgICAgICAgQnVpbGRNSShGaXJzdE1CQiwgTUJCSSwgREwsIFRJSS0+Z2V0KFg4Njo6QUREMzJyaSksIEdsb2JhbEJhc2VSZWcpCisgICAgICAgICAgLmFkZFJlZyhQQykuYWRkRXh0ZXJuYWxTeW1ib2woIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2SUk6Ok1PX0dPVF9BQlNPTFVURV9BRERSRVNTKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiWDg2IFBJQyBHbG9iYWwgQmFzZSBSZWcgSW5pdGlhbGl6YXRpb24iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICAgIH0KKyAgfTsKK30KKworY2hhciBDR0JSOjpJRCA9IDA7CitGdW5jdGlvblBhc3MqCitsbHZtOjpjcmVhdGVHbG9iYWxCYXNlUmVnUGFzcygpIHsgcmV0dXJuIG5ldyBDR0JSKCk7IH0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nkluc3RySW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2OGJjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nkluc3RySW5mby5oCkBAIC0wLDAgKzEsODYxIEBACisvLz09PS0gWDg2SW5zdHJJbmZvLmggLSBYODYgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tKi0gQysrIC0qLSA9PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgWDg2IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRJbnN0ckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBYODZJTlNUUlVDVElPTklORk9fSAorI2RlZmluZSBYODZJTlNUUlVDVElPTklORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiWDg2LmgiCisjaW5jbHVkZSAiWDg2UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBYODZSZWdpc3RlckluZm87CisgIGNsYXNzIFg4NlRhcmdldE1hY2hpbmU7CisKK25hbWVzcGFjZSBYODYgeworICAvLyBFbnVtcyBmb3IgbWVtb3J5IG9wZXJhbmQgZGVjb2RpbmcuICBFYWNoIG1lbW9yeSBvcGVyYW5kIGlzIHJlcHJlc2VudGVkIHdpdGgKKyAgLy8gYSA1IG9wZXJhbmQgc2VxdWVuY2UgaW4gdGhlIGZvcm06CisgIC8vICAgW0Jhc2VSZWcsIFNjYWxlQW10LCBJbmRleFJlZywgRGlzcCwgU2VnbWVudF0KKyAgLy8gVGhlc2UgZW51bXMgaGVscCBkZWNvZGUgdGhpcy4KKyAgZW51bSB7CisgICAgQWRkckJhc2VSZWcgPSAwLAorICAgIEFkZHJTY2FsZUFtdCA9IDEsCisgICAgQWRkckluZGV4UmVnID0gMiwKKyAgICBBZGRyRGlzcCA9IDMsCisgICAgCisgICAgLy8vIEFkZHJTZWdtZW50UmVnIC0gVGhlIG9wZXJhbmQgIyBvZiB0aGUgc2VnbWVudCBpbiB0aGUgbWVtb3J5IG9wZXJhbmQuCisgICAgQWRkclNlZ21lbnRSZWcgPSA0LAorCisgICAgLy8vIEFkZHJOdW1PcGVyYW5kcyAtIFRvdGFsIG51bWJlciBvZiBvcGVyYW5kcyBpbiBhIG1lbW9yeSByZWZlcmVuY2UuCisgICAgQWRkck51bU9wZXJhbmRzID0gNQorICB9OworICAKKyAgCisgIC8vIFg4NiBzcGVjaWZpYyBjb25kaXRpb24gY29kZS4gVGhlc2UgY29ycmVzcG9uZCB0byBYODZfKl9DT05EIGluCisgIC8vIFg4Nkluc3RySW5mby50ZC4gVGhleSBtdXN0IGJlIGtlcHQgaW4gc3luY2guCisgIGVudW0gQ29uZENvZGUgeworICAgIENPTkRfQSAgPSAwLAorICAgIENPTkRfQUUgPSAxLAorICAgIENPTkRfQiAgPSAyLAorICAgIENPTkRfQkUgPSAzLAorICAgIENPTkRfRSAgPSA0LAorICAgIENPTkRfRyAgPSA1LAorICAgIENPTkRfR0UgPSA2LAorICAgIENPTkRfTCAgPSA3LAorICAgIENPTkRfTEUgPSA4LAorICAgIENPTkRfTkUgPSA5LAorICAgIENPTkRfTk8gPSAxMCwKKyAgICBDT05EX05QID0gMTEsCisgICAgQ09ORF9OUyA9IDEyLAorICAgIENPTkRfTyAgPSAxMywKKyAgICBDT05EX1AgID0gMTQsCisgICAgQ09ORF9TICA9IDE1LAorCisgICAgLy8gQXJ0aWZpY2lhbCBjb25kaXRpb24gY29kZXMuIFRoZXNlIGFyZSB1c2VkIGJ5IEFuYWx5emVCcmFuY2gKKyAgICAvLyB0byBpbmRpY2F0ZSBhIGJsb2NrIHRlcm1pbmF0ZWQgd2l0aCB0d28gY29uZGl0aW9uYWwgYnJhbmNoZXMgdG8KKyAgICAvLyB0aGUgc2FtZSBsb2NhdGlvbi4gVGhpcyBvY2N1cnMgaW4gY29kZSB1c2luZyBGQ01QX09FUSBvciBGQ01QX1VORSwKKyAgICAvLyB3aGljaCBjYW4ndCBiZSByZXByZXNlbnRlZCBvbiB4ODYgd2l0aCBhIHNpbmdsZSBjb25kaXRpb24uIFRoZXNlCisgICAgLy8gYXJlIG5ldmVyIHVzZWQgaW4gTWFjaGluZUluc3Rycy4KKyAgICBDT05EX05FX09SX1AsCisgICAgQ09ORF9OUF9PUl9FLAorCisgICAgQ09ORF9JTlZBTElECisgIH07CisgICAgCisgIC8vIFR1cm4gY29uZGl0aW9uIGNvZGUgaW50byBjb25kaXRpb25hbCBicmFuY2ggb3Bjb2RlLgorICB1bnNpZ25lZCBHZXRDb25kQnJhbmNoRnJvbUNvbmQoQ29uZENvZGUgQ0MpOworICAKKyAgLy8vIEdldE9wcG9zaXRlQnJhbmNoQ29uZGl0aW9uIC0gUmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoZSBzcGVjaWZpZWQgY29uZCwKKyAgLy8vIGUuZy4gdHVybmluZyBDT05EX0UgdG8gQ09ORF9ORS4KKyAgQ29uZENvZGUgR2V0T3Bwb3NpdGVCcmFuY2hDb25kaXRpb24oWDg2OjpDb25kQ29kZSBDQyk7CisKK30KKyAgCisvLy8gWDg2SUkgLSBUaGlzIG5hbWVzcGFjZSBob2xkcyBhbGwgb2YgdGhlIHRhcmdldCBzcGVjaWZpYyBmbGFncyB0aGF0CisvLy8gaW5zdHJ1Y3Rpb24gaW5mbyB0cmFja3MuCisvLy8KK25hbWVzcGFjZSBYODZJSSB7CisgIC8vLyBUYXJnZXQgT3BlcmFuZCBGbGFnIGVudW0uCisgIGVudW0gVE9GIHsKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gWDg2IFNwZWNpZmljIE1hY2hpbmVPcGVyYW5kIGZsYWdzLgorICAgIAorICAgIE1PX05PX0ZMQUcsCisgICAgCisgICAgLy8vIE1PX0dPVF9BQlNPTFVURV9BRERSRVNTIC0gT24gYSBzeW1ib2wgb3BlcmFuZCwgdGhpcyByZXByZXNlbnRzIGEKKyAgICAvLy8gcmVsb2NhdGlvbiBvZjoKKyAgICAvLy8gICAgU1lNQk9MX0xBQkVMICsgWy4gLSBQSUNCQVNFTEFCRUxdCisgICAgTU9fR09UX0FCU09MVVRFX0FERFJFU1MsCisgICAgCisgICAgLy8vIE1PX1BJQ19CQVNFX09GRlNFVCAtIE9uIGEgc3ltYm9sIG9wZXJhbmQgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgICAvLy8gaW1tZWRpYXRlIHNob3VsZCBnZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgbWludXMgdGhlIFBJQyBiYXNlIGxhYmVsOgorICAgIC8vLyAgICBTWU1CT0xfTEFCRUwgLSBQSUNCQVNFTEFCRUwKKyAgICBNT19QSUNfQkFTRV9PRkZTRVQsCisKKyAgICAvLy8gTU9fR09UIC0gT24gYSBzeW1ib2wgb3BlcmFuZCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBpbW1lZGlhdGUgaXMgdGhlCisgICAgLy8vIG9mZnNldCB0byB0aGUgR09UIGVudHJ5IGZvciB0aGUgc3ltYm9sIG5hbWUgZnJvbSB0aGUgYmFzZSBvZiB0aGUgR09ULgorICAgIC8vLworICAgIC8vLyBTZWUgdGhlIFg4Ni02NCBFTEYgQUJJIHN1cHBsZW1lbnQgZm9yIG1vcmUgZGV0YWlscy4gCisgICAgLy8vICAgIFNZTUJPTF9MQUJFTCBAR09UCisgICAgTU9fR09ULAorICAgIAorICAgIC8vLyBNT19HT1RPRkYgLSBPbiBhIHN5bWJvbCBvcGVyYW5kIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGltbWVkaWF0ZSBpcworICAgIC8vLyB0aGUgb2Zmc2V0IHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sIG5hbWUgZnJvbSB0aGUgYmFzZSBvZiB0aGUgR09ULiAKKyAgICAvLy8KKyAgICAvLy8gU2VlIHRoZSBYODYtNjQgRUxGIEFCSSBzdXBwbGVtZW50IGZvciBtb3JlIGRldGFpbHMuIAorICAgIC8vLyAgICBTWU1CT0xfTEFCRUwgQEdPVE9GRgorICAgIE1PX0dPVE9GRiwKKyAgICAKKyAgICAvLy8gTU9fR09UUENSRUwgLSBPbiBhIHN5bWJvbCBvcGVyYW5kIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGltbWVkaWF0ZSBpcworICAgIC8vLyBvZmZzZXQgdG8gdGhlIEdPVCBlbnRyeSBmb3IgdGhlIHN5bWJvbCBuYW1lIGZyb20gdGhlIGN1cnJlbnQgY29kZQorICAgIC8vLyBsb2NhdGlvbi4gCisgICAgLy8vCisgICAgLy8vIFNlZSB0aGUgWDg2LTY0IEVMRiBBQkkgc3VwcGxlbWVudCBmb3IgbW9yZSBkZXRhaWxzLiAKKyAgICAvLy8gICAgU1lNQk9MX0xBQkVMIEBHT1RQQ1JFTAorICAgIE1PX0dPVFBDUkVMLAorICAgIAorICAgIC8vLyBNT19QTFQgLSBPbiBhIHN5bWJvbCBvcGVyYW5kIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGltbWVkaWF0ZSBpcworICAgIC8vLyBvZmZzZXQgdG8gdGhlIFBMVCBlbnRyeSBvZiBzeW1ib2wgbmFtZSBmcm9tIHRoZSBjdXJyZW50IGNvZGUgbG9jYXRpb24uIAorICAgIC8vLworICAgIC8vLyBTZWUgdGhlIFg4Ni02NCBFTEYgQUJJIHN1cHBsZW1lbnQgZm9yIG1vcmUgZGV0YWlscy4gCisgICAgLy8vICAgIFNZTUJPTF9MQUJFTCBAUExUCisgICAgTU9fUExULAorICAgIAorICAgIC8vLyBNT19UTFNHRCAtIE9uIGEgc3ltYm9sIG9wZXJhbmQgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1tZWRpYXRlIGlzCisgICAgLy8vIHNvbWUgVExTIG9mZnNldC4KKyAgICAvLy8KKyAgICAvLy8gU2VlICdFTEYgSGFuZGxpbmcgZm9yIFRocmVhZC1Mb2NhbCBTdG9yYWdlJyBmb3IgbW9yZSBkZXRhaWxzLiAKKyAgICAvLy8gICAgU1lNQk9MX0xBQkVMIEBUTFNHRAorICAgIE1PX1RMU0dELAorICAgIAorICAgIC8vLyBNT19HT1RUUE9GRiAtIE9uIGEgc3ltYm9sIG9wZXJhbmQgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1tZWRpYXRlIGlzCisgICAgLy8vIHNvbWUgVExTIG9mZnNldC4KKyAgICAvLy8KKyAgICAvLy8gU2VlICdFTEYgSGFuZGxpbmcgZm9yIFRocmVhZC1Mb2NhbCBTdG9yYWdlJyBmb3IgbW9yZSBkZXRhaWxzLiAKKyAgICAvLy8gICAgU1lNQk9MX0xBQkVMIEBHT1RUUE9GRgorICAgIE1PX0dPVFRQT0ZGLAorICAgCisgICAgLy8vIE1PX0lORE5UUE9GRiAtIE9uIGEgc3ltYm9sIG9wZXJhbmQgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1tZWRpYXRlIGlzCisgICAgLy8vIHNvbWUgVExTIG9mZnNldC4KKyAgICAvLy8KKyAgICAvLy8gU2VlICdFTEYgSGFuZGxpbmcgZm9yIFRocmVhZC1Mb2NhbCBTdG9yYWdlJyBmb3IgbW9yZSBkZXRhaWxzLiAKKyAgICAvLy8gICAgU1lNQk9MX0xBQkVMIEBJTkROVFBPRkYKKyAgICBNT19JTkROVFBPRkYsCisgICAgCisgICAgLy8vIE1PX1RQT0ZGIC0gT24gYSBzeW1ib2wgb3BlcmFuZCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBpbW1lZGlhdGUgaXMKKyAgICAvLy8gc29tZSBUTFMgb2Zmc2V0LgorICAgIC8vLworICAgIC8vLyBTZWUgJ0VMRiBIYW5kbGluZyBmb3IgVGhyZWFkLUxvY2FsIFN0b3JhZ2UnIGZvciBtb3JlIGRldGFpbHMuIAorICAgIC8vLyAgICBTWU1CT0xfTEFCRUwgQFRQT0ZGCisgICAgTU9fVFBPRkYsCisgICAgCisgICAgLy8vIE1PX05UUE9GRiAtIE9uIGEgc3ltYm9sIG9wZXJhbmQgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1tZWRpYXRlIGlzCisgICAgLy8vIHNvbWUgVExTIG9mZnNldC4KKyAgICAvLy8KKyAgICAvLy8gU2VlICdFTEYgSGFuZGxpbmcgZm9yIFRocmVhZC1Mb2NhbCBTdG9yYWdlJyBmb3IgbW9yZSBkZXRhaWxzLiAKKyAgICAvLy8gICAgU1lNQk9MX0xBQkVMIEBOVFBPRkYKKyAgICBNT19OVFBPRkYsCisgICAgCisgICAgLy8vIE1PX0RMTElNUE9SVCAtIE9uIGEgc3ltYm9sIG9wZXJhbmQgIkZPTyIsIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgLy8vIHJlZmVyZW5jZSBpcyBhY3R1YWxseSB0byB0aGUgIl9faW1wX0ZPTyIgc3ltYm9sLiAgVGhpcyBpcyB1c2VkIGZvcgorICAgIC8vLyBkbGxpbXBvcnQgbGlua2FnZSBvbiB3aW5kb3dzLgorICAgIE1PX0RMTElNUE9SVCwKKyAgICAKKyAgICAvLy8gTU9fREFSV0lOX1NUVUIgLSBPbiBhIHN5bWJvbCBvcGVyYW5kICJGT08iLCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZQorICAgIC8vLyByZWZlcmVuY2UgaXMgYWN0dWFsbHkgdG8gdGhlICJGT08kc3R1YiIgc3ltYm9sLiAgVGhpcyBpcyB1c2VkIGZvciBjYWxscworICAgIC8vLyBhbmQganVtcHMgdG8gZXh0ZXJuYWwgZnVuY3Rpb25zIG9uIFRpZ2VyIGFuZCBiZWZvcmUuCisgICAgTU9fREFSV0lOX1NUVUIsCisgICAgCisgICAgLy8vIE1PX0RBUldJTl9OT05MQVpZIC0gT24gYSBzeW1ib2wgb3BlcmFuZCAiRk9PIiwgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgICAvLy8gcmVmZXJlbmNlIGlzIGFjdHVhbGx5IHRvIHRoZSAiRk9PJG5vbl9sYXp5X3B0ciIgc3ltYm9sLCB3aGljaCBpcyBhCisgICAgLy8vIG5vbi1QSUMtYmFzZS1yZWxhdGl2ZSByZWZlcmVuY2UgdG8gYSBub24taGlkZGVuIGR5bGQgbGF6eSBwb2ludGVyIHN0dWIuCisgICAgTU9fREFSV0lOX05PTkxBWlksCisKKyAgICAvLy8gTU9fREFSV0lOX05PTkxBWllfUElDX0JBU0UgLSBPbiBhIHN5bWJvbCBvcGVyYW5kICJGT08iLCB0aGlzIGluZGljYXRlcworICAgIC8vLyB0aGF0IHRoZSByZWZlcmVuY2UgaXMgYWN0dWFsbHkgdG8gIkZPTyRub25fbGF6eV9wdHIgLSBQSUNCQVNFIiwgd2hpY2ggaXMKKyAgICAvLy8gYSBQSUMtYmFzZS1yZWxhdGl2ZSByZWZlcmVuY2UgdG8gYSBub24taGlkZGVuIGR5bGQgbGF6eSBwb2ludGVyIHN0dWIuCisgICAgTU9fREFSV0lOX05PTkxBWllfUElDX0JBU0UsCisgICAgCisgICAgLy8vIE1PX0RBUldJTl9ISURERU5fTk9OTEFaWV9QSUNfQkFTRSAtIE9uIGEgc3ltYm9sIG9wZXJhbmQgIkZPTyIsIHRoaXMKKyAgICAvLy8gaW5kaWNhdGVzIHRoYXQgdGhlIHJlZmVyZW5jZSBpcyBhY3R1YWxseSB0byAiRk9PJG5vbl9sYXp5X3B0ciAtUElDQkFTRSIsCisgICAgLy8vIHdoaWNoIGlzIGEgUElDLWJhc2UtcmVsYXRpdmUgcmVmZXJlbmNlIHRvIGEgaGlkZGVuIGR5bGQgbGF6eSBwb2ludGVyCisgICAgLy8vIHN0dWIuCisgICAgTU9fREFSV0lOX0hJRERFTl9OT05MQVpZX1BJQ19CQVNFLAorICAgIAorICAgIC8vLyBNT19UTFZQIC0gT24gYSBzeW1ib2wgb3BlcmFuZCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBpbW1lZGlhdGUgaXMKKyAgICAvLy8gc29tZSBUTFMgb2Zmc2V0LgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHRoZSBUTFMgb2Zmc2V0IGZvciB0aGUgRGFyd2luIFRMUyBtZWNoYW5pc20uCisgICAgTU9fVExWUCwKKyAgICAKKyAgICAvLy8gTU9fVExWUF9QSUNfQkFTRSAtIE9uIGEgc3ltYm9sIG9wZXJhbmQgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1tZWRpYXRlCisgICAgLy8vIGlzIHNvbWUgVExTIG9mZnNldCBmcm9tIHRoZSBwaWNiYXNlLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHRoZSAzMi1iaXQgVExTIG9mZnNldCBmb3IgRGFyd2luIFRMUyBpbiBQSUMgbW9kZS4KKyAgICBNT19UTFZQX1BJQ19CQVNFCisgIH07Cit9CisKKy8vLyBpc0dsb2JhbFN0dWJSZWZlcmVuY2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFRhcmdldEZsYWcgb3BlcmFuZCBpcworLy8vIGEgcmVmZXJlbmNlIHRvIGEgc3R1YiBmb3IgYSBnbG9iYWwsIG5vdCB0aGUgZ2xvYmFsIGl0c2VsZi4KK2lubGluZSBzdGF0aWMgYm9vbCBpc0dsb2JhbFN0dWJSZWZlcmVuY2UodW5zaWduZWQgY2hhciBUYXJnZXRGbGFnKSB7CisgIHN3aXRjaCAoVGFyZ2V0RmxhZykgeworICBjYXNlIFg4NklJOjpNT19ETExJTVBPUlQ6IC8vIGRsbGltcG9ydCBzdHViLgorICBjYXNlIFg4NklJOjpNT19HT1RQQ1JFTDogIC8vIHJpcC1yZWxhdGl2ZSBHT1QgcmVmZXJlbmNlLgorICBjYXNlIFg4NklJOjpNT19HT1Q6ICAgICAgIC8vIG5vcm1hbCBHT1QgcmVmZXJlbmNlLgorICBjYXNlIFg4NklJOjpNT19EQVJXSU5fTk9OTEFaWV9QSUNfQkFTRTogICAgICAgIC8vIE5vcm1hbCAkbm9uX2xhenlfcHRyIHJlZi4KKyAgY2FzZSBYODZJSTo6TU9fREFSV0lOX05PTkxBWlk6ICAgICAgICAgICAgICAgICAvLyBOb3JtYWwgJG5vbl9sYXp5X3B0ciByZWYuCisgIGNhc2UgWDg2SUk6Ok1PX0RBUldJTl9ISURERU5fTk9OTEFaWV9QSUNfQkFTRTogLy8gSGlkZGVuICRub25fbGF6eV9wdHIgcmVmLgorICAgIHJldHVybiB0cnVlOworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLy8gaXNHbG9iYWxSZWxhdGl2ZVRvUElDQmFzZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhbHVlCisvLy8gcmVmZXJlbmNlIGlzIHJlbGF0aXZlIHRvIGEgMzItYml0IFBJQyBiYXNlIChYODZJU0Q6Okdsb2JhbEJhc2VSZWcpLiAgSWYgdGhpcworLy8vIGlzIHRydWUsIHRoZSBhZGRyZXNzaW5nIG1vZGUgaGFzIHRoZSBQSUMgYmFzZSByZWdpc3RlciBhZGRlZCBpbiAoZS5nLiBFQlgpLgoraW5saW5lIHN0YXRpYyBib29sIGlzR2xvYmFsUmVsYXRpdmVUb1BJQ0Jhc2UodW5zaWduZWQgY2hhciBUYXJnZXRGbGFnKSB7CisgIHN3aXRjaCAoVGFyZ2V0RmxhZykgeworICBjYXNlIFg4NklJOjpNT19HT1RPRkY6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzUElDU3R5bGVHT1Q6IGxvY2FsIGdsb2JhbC4KKyAgY2FzZSBYODZJSTo6TU9fR09UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpc1BJQ1N0eWxlR09UOiBvdGhlciBnbG9iYWwuCisgIGNhc2UgWDg2SUk6Ok1PX1BJQ19CQVNFX09GRlNFVDogICAgICAgICAgICAgICAgLy8gRGFyd2luIGxvY2FsIGdsb2JhbC4KKyAgY2FzZSBYODZJSTo6TU9fREFSV0lOX05PTkxBWllfUElDX0JBU0U6ICAgICAgICAvLyBEYXJ3aW4vMzIgZXh0ZXJuYWwgZ2xvYmFsLgorICBjYXNlIFg4NklJOjpNT19EQVJXSU5fSElEREVOX05PTkxBWllfUElDX0JBU0U6IC8vIERhcndpbi8zMiBoaWRkZW4gZ2xvYmFsLgorICBjYXNlIFg4NklJOjpNT19UTFZQOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID8/PyBQcmV0dHkgc3VyZS4uCisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisgCisvLy8gWDg2SUkgLSBUaGlzIG5hbWVzcGFjZSBob2xkcyBhbGwgb2YgdGhlIHRhcmdldCBzcGVjaWZpYyBmbGFncyB0aGF0CisvLy8gaW5zdHJ1Y3Rpb24gaW5mbyB0cmFja3MuCisvLy8KK25hbWVzcGFjZSBYODZJSSB7CisgIGVudW0geworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgICAvLyBJbnN0cnVjdGlvbiBlbmNvZGluZ3MuICBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkL21vc3QgY29tbW9uIGZvcm1zIGZvciBYODYKKyAgICAvLyBpbnN0cnVjdGlvbnMuCisgICAgLy8KKworICAgIC8vIFBzZXVkb0ZybSAtIFRoaXMgcmVwcmVzZW50cyBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGEgcHNldWRvIGluc3RydWN0aW9uCisgICAgLy8gb3Igb25lIHRoYXQgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIHlldC4gIEl0IGlzIGlsbGVnYWwgdG8gY29kZSBnZW5lcmF0ZQorICAgIC8vIGl0LCBidXQgdG9sZXJhdGVkIGZvciBpbnRlcm1lZGlhdGUgaW1wbGVtZW50YXRpb24gc3RhZ2VzLgorICAgIFBzZXVkbyAgICAgICAgID0gMCwKKworICAgIC8vLyBSYXcgLSBUaGlzIGZvcm0gaXMgZm9yIGluc3RydWN0aW9ucyB0aGF0IGRvbid0IGhhdmUgYW55IG9wZXJhbmRzLCBzbworICAgIC8vLyB0aGV5IGFyZSBqdXN0IGEgZml4ZWQgb3Bjb2RlIHZhbHVlLCBsaWtlICdsZWF2ZScuCisgICAgUmF3RnJtICAgICAgICAgPSAxLAorCisgICAgLy8vIEFkZFJlZ0ZybSAtIFRoaXMgZm9ybSBpcyB1c2VkIGZvciBpbnN0cnVjdGlvbnMgbGlrZSAncHVzaCByMzInIHRoYXQgaGF2ZQorICAgIC8vLyB0aGVpciBvbmUgcmVnaXN0ZXIgb3BlcmFuZCBhZGRlZCB0byB0aGVpciBvcGNvZGUuCisgICAgQWRkUmVnRnJtICAgICAgPSAyLAorCisgICAgLy8vIE1STURlc3RSZWcgLSBUaGlzIGZvcm0gaXMgdXNlZCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHRoZSBNb2QvUk0gYnl0ZQorICAgIC8vLyB0byBzcGVjaWZ5IGEgZGVzdGluYXRpb24sIHdoaWNoIGluIHRoaXMgY2FzZSBpcyBhIHJlZ2lzdGVyLgorICAgIC8vLworICAgIE1STURlc3RSZWcgICAgID0gMywKKworICAgIC8vLyBNUk1EZXN0TWVtIC0gVGhpcyBmb3JtIGlzIHVzZWQgZm9yIGluc3RydWN0aW9ucyB0aGF0IHVzZSB0aGUgTW9kL1JNIGJ5dGUKKyAgICAvLy8gdG8gc3BlY2lmeSBhIGRlc3RpbmF0aW9uLCB3aGljaCBpbiB0aGlzIGNhc2UgaXMgbWVtb3J5LgorICAgIC8vLworICAgIE1STURlc3RNZW0gICAgID0gNCwKKworICAgIC8vLyBNUk1TcmNSZWcgLSBUaGlzIGZvcm0gaXMgdXNlZCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHRoZSBNb2QvUk0gYnl0ZQorICAgIC8vLyB0byBzcGVjaWZ5IGEgc291cmNlLCB3aGljaCBpbiB0aGlzIGNhc2UgaXMgYSByZWdpc3Rlci4KKyAgICAvLy8KKyAgICBNUk1TcmNSZWcgICAgICA9IDUsCisKKyAgICAvLy8gTVJNU3JjTWVtIC0gVGhpcyBmb3JtIGlzIHVzZWQgZm9yIGluc3RydWN0aW9ucyB0aGF0IHVzZSB0aGUgTW9kL1JNIGJ5dGUKKyAgICAvLy8gdG8gc3BlY2lmeSBhIHNvdXJjZSwgd2hpY2ggaW4gdGhpcyBjYXNlIGlzIG1lbW9yeS4KKyAgICAvLy8KKyAgICBNUk1TcmNNZW0gICAgICA9IDYsCisKKyAgICAvLy8gTVJNWzAtN11bcm1dIC0gVGhlc2UgZm9ybXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGluc3RydWN0aW9ucyB0aGF0IHVzZQorICAgIC8vLyBhIE1vZC9STSBieXRlLCBhbmQgdXNlIHRoZSBtaWRkbGUgZmllbGQgdG8gaG9sZCBleHRlbmRlZCBvcGNvZGUKKyAgICAvLy8gaW5mb3JtYXRpb24uICBJbiB0aGUgaW50ZWwgbWFudWFsIHRoZXNlIGFyZSByZXByZXNlbnRlZCBhcyAvMCwgLzEsIC4uLgorICAgIC8vLworCisgICAgLy8gRmlyc3QsIGluc3RydWN0aW9ucyB0aGF0IG9wZXJhdGUgb24gYSByZWdpc3RlciByL20gb3BlcmFuZC4uLgorICAgIE1STTByID0gMTYsICBNUk0xciA9IDE3LCAgTVJNMnIgPSAxOCwgIE1STTNyID0gMTksIC8vIEZvcm1hdCAvMCAvMSAvMiAvMworICAgIE1STTRyID0gMjAsICBNUk01ciA9IDIxLCAgTVJNNnIgPSAyMiwgIE1STTdyID0gMjMsIC8vIEZvcm1hdCAvNCAvNSAvNiAvNworCisgICAgLy8gTmV4dCwgaW5zdHJ1Y3Rpb25zIHRoYXQgb3BlcmF0ZSBvbiBhIG1lbW9yeSByL20gb3BlcmFuZC4uLgorICAgIE1STTBtID0gMjQsICBNUk0xbSA9IDI1LCAgTVJNMm0gPSAyNiwgIE1STTNtID0gMjcsIC8vIEZvcm1hdCAvMCAvMSAvMiAvMworICAgIE1STTRtID0gMjgsICBNUk01bSA9IDI5LCAgTVJNNm0gPSAzMCwgIE1STTdtID0gMzEsIC8vIEZvcm1hdCAvNCAvNSAvNiAvNworCisgICAgLy8gTVJNSW5pdFJlZyAtIFRoaXMgZm9ybSBpcyB1c2VkIGZvciBpbnN0cnVjdGlvbnMgd2hvc2Ugc291cmNlIGFuZAorICAgIC8vIGRlc3RpbmF0aW9ucyBhcmUgdGhlIHNhbWUgcmVnaXN0ZXIuCisgICAgTVJNSW5pdFJlZyA9IDMyLAorICAgIAorICAgIC8vLy8gTVJNX0MxIC0gQSBtb2Qvcm0gYnl0ZSBvZiBleGFjdGx5IDB4QzEuCisgICAgTVJNX0MxID0gMzMsCisgICAgTVJNX0MyID0gMzQsCisgICAgTVJNX0MzID0gMzUsCisgICAgTVJNX0M0ID0gMzYsCisgICAgTVJNX0M4ID0gMzcsCisgICAgTVJNX0M5ID0gMzgsCisgICAgTVJNX0U4ID0gMzksCisgICAgTVJNX0YwID0gNDAsCisgICAgTVJNX0Y4ID0gNDEsCisgICAgTVJNX0Y5ID0gNDIsCisKKyAgICBGb3JtTWFzayAgICAgICA9IDYzLAorCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vIEFjdHVhbCBmbGFncy4uLgorCisgICAgLy8gT3BTaXplIC0gU2V0IGlmIHRoaXMgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgYW4gb3BlcmFuZCBzaXplIHByZWZpeCAoMHg2NiksCisgICAgLy8gd2hpY2ggbW9zdCBvZnRlbiBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gb3BlcmF0ZXMgb24gMTYgYml0IGRhdGEKKyAgICAvLyBpbnN0ZWFkIG9mIDMyIGJpdCBkYXRhLgorICAgIE9wU2l6ZSAgICAgID0gMSA8PCA2LAorCisgICAgLy8gQXNTaXplIC0gU2V0IGlmIHRoaXMgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgYW4gb3BlcmFuZCBzaXplIHByZWZpeCAoMHg2NyksCisgICAgLy8gd2hpY2ggbW9zdCBvZnRlbiBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcyAxNiBiaXQgYWRkcmVzcworICAgIC8vIGluc3RlYWQgb2YgMzIgYml0IGFkZHJlc3MgKG9yIDMyIGJpdCBhZGRyZXNzIGluIDY0IGJpdCBtb2RlKS4KKyAgICBBZFNpemUgICAgICA9IDEgPDwgNywKKworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgICAvLyBPcDBNYXNrIC0gVGhlcmUgYXJlIHNldmVyYWwgcHJlZml4IGJ5dGVzIHRoYXQgYXJlIHVzZWQgdG8gZm9ybSB0d28gYnl0ZQorICAgIC8vIG9wY29kZXMuICBUaGVzZSBhcmUgY3VycmVudGx5IDB4MEYsIDB4RjMsIGFuZCAweEQ4LTB4REYuICBUaGlzIG1hc2sgaXMKKyAgICAvLyB1c2VkIHRvIG9idGFpbiB0aGUgc2V0dGluZyBvZiB0aGlzIGZpZWxkLiAgSWYgbm8gYml0cyBpbiB0aGlzIGZpZWxkIGlzCisgICAgLy8gc2V0LCB0aGVyZSBpcyBubyBwcmVmaXggYnl0ZSBmb3Igb2J0YWluaW5nIGEgbXVsdGlieXRlIG9wY29kZS4KKyAgICAvLworICAgIE9wMFNoaWZ0ICAgID0gOCwKKyAgICBPcDBNYXNrICAgICA9IDB4RiA8PCBPcDBTaGlmdCwKKworICAgIC8vIFRCIC0gVHdvQnl0ZSAtIFNldCBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBhIHR3byBieXRlIG9wY29kZSwgd2hpY2gKKyAgICAvLyBzdGFydHMgd2l0aCBhIDB4MEYgYnl0ZSBiZWZvcmUgdGhlIHJlYWwgb3Bjb2RlLgorICAgIFRCICAgICAgICAgID0gMSA8PCBPcDBTaGlmdCwKKworICAgIC8vIFJFUCAtIFRoZSAweEYzIHByZWZpeCBieXRlIGluZGljYXRpbmcgcmVwZXRpdGlvbiBvZiB0aGUgZm9sbG93aW5nCisgICAgLy8gaW5zdHJ1Y3Rpb24uCisgICAgUkVQICAgICAgICAgPSAyIDw8IE9wMFNoaWZ0LAorCisgICAgLy8gRDgtREYgLSBUaGVzZSBlc2NhcGUgb3Bjb2RlcyBhcmUgdXNlZCBieSB0aGUgZmxvYXRpbmcgcG9pbnQgdW5pdC4gIFRoZXNlCisgICAgLy8gdmFsdWVzIG11c3QgcmVtYWluIHNlcXVlbnRpYWwuCisgICAgRDggPSAzIDw8IE9wMFNoaWZ0LCAgIEQ5ID0gNCA8PCBPcDBTaGlmdCwKKyAgICBEQSA9IDUgPDwgT3AwU2hpZnQsICAgREIgPSA2IDw8IE9wMFNoaWZ0LAorICAgIERDID0gNyA8PCBPcDBTaGlmdCwgICBERCA9IDggPDwgT3AwU2hpZnQsCisgICAgREUgPSA5IDw8IE9wMFNoaWZ0LCAgIERGID0gMTAgPDwgT3AwU2hpZnQsCisKKyAgICAvLyBYUywgWEQgLSBUaGVzZSBwcmVmaXggY29kZXMgYXJlIGZvciBzaW5nbGUgYW5kIGRvdWJsZSBwcmVjaXNpb24gc2NhbGFyCisgICAgLy8gZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyBwZXJmb3JtZWQgaW4gdGhlIFNTRSByZWdpc3RlcnMuCisgICAgWEQgPSAxMSA8PCBPcDBTaGlmdCwgIFhTID0gMTIgPDwgT3AwU2hpZnQsCisKKyAgICAvLyBUOCwgVEEgLSBQcmVmaXggYWZ0ZXIgdGhlIDB4MEYgcHJlZml4LgorICAgIFQ4ID0gMTMgPDwgT3AwU2hpZnQsICBUQSA9IDE0IDw8IE9wMFNoaWZ0LAorICAgIAorICAgIC8vIFRGIC0gUHJlZml4IGJlZm9yZSBhbmQgYWZ0ZXIgMHgwRgorICAgIFRGID0gMTUgPDwgT3AwU2hpZnQsCisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gUkVYX1cgLSBSRVggcHJlZml4ZXMgYXJlIGluc3RydWN0aW9uIHByZWZpeGVzIHVzZWQgaW4gNjQtYml0IG1vZGUuCisgICAgLy8gVGhleSBhcmUgdXNlZCB0byBzcGVjaWZ5IEdQUnMgYW5kIFNTRSByZWdpc3RlcnMsIDY0LWJpdCBvcGVyYW5kIHNpemUsCisgICAgLy8gZXRjLiBXZSBvbmx5IGNhcmVzIGFib3V0IFJFWC5XIGFuZCBSRVguUiBiaXRzIGFuZCBvbmx5IHRoZSBmb3JtZXIgaXMKKyAgICAvLyBzdGF0aWNhbGx5IGRldGVybWluZWQuCisgICAgLy8KKyAgICBSRVhTaGlmdCAgICA9IDEyLAorICAgIFJFWF9XICAgICAgID0gMSA8PCBSRVhTaGlmdCwKKworICAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgICAvLyBUaGlzIHRocmVlLWJpdCBmaWVsZCBkZXNjcmliZXMgdGhlIHNpemUgb2YgYW4gaW1tZWRpYXRlIG9wZXJhbmQuICBaZXJvIGlzCisgICAgLy8gdW51c2VkIHNvIHRoYXQgd2UgY2FuIHRlbGwgaWYgd2UgZm9yZ290IHRvIHNldCBhIHZhbHVlLgorICAgIEltbVNoaWZ0ID0gMTMsCisgICAgSW1tTWFzayAgICA9IDcgPDwgSW1tU2hpZnQsCisgICAgSW1tOCAgICAgICA9IDEgPDwgSW1tU2hpZnQsCisgICAgSW1tOFBDUmVsICA9IDIgPDwgSW1tU2hpZnQsCisgICAgSW1tMTYgICAgICA9IDMgPDwgSW1tU2hpZnQsCisgICAgSW1tMTZQQ1JlbCA9IDQgPDwgSW1tU2hpZnQsCisgICAgSW1tMzIgICAgICA9IDUgPDwgSW1tU2hpZnQsCisgICAgSW1tMzJQQ1JlbCA9IDYgPDwgSW1tU2hpZnQsCisgICAgSW1tNjQgICAgICA9IDcgPDwgSW1tU2hpZnQsCisKKyAgICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgICAgLy8gRlAgSW5zdHJ1Y3Rpb24gQ2xhc3NpZmljYXRpb24uLi4gIFplcm8gaXMgbm9uLWZwIGluc3RydWN0aW9uLgorCisgICAgLy8gRlBUeXBlTWFzayAtIE1hc2sgZm9yIGFsbCBvZiB0aGUgRlAgdHlwZXMuLi4KKyAgICBGUFR5cGVTaGlmdCA9IDE2LAorICAgIEZQVHlwZU1hc2sgID0gNyA8PCBGUFR5cGVTaGlmdCwKKworICAgIC8vIE5vdEZQIC0gVGhlIGRlZmF1bHQsIHNldCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgZG8gbm90IHVzZSBGUCByZWdpc3RlcnMuCisgICAgTm90RlAgICAgICA9IDAgPDwgRlBUeXBlU2hpZnQsCisKKyAgICAvLyBaZXJvQXJnRlAgLSAwIGFyZyBGUCBpbnN0cnVjdGlvbiB3aGljaCBpbXBsaWNpdGx5IHB1c2hlcyBTVCgwKSwgZi5lLiBmbGQwCisgICAgWmVyb0FyZ0ZQICA9IDEgPDwgRlBUeXBlU2hpZnQsCisKKyAgICAvLyBPbmVBcmdGUCAtIDEgYXJnIEZQIGluc3RydWN0aW9ucyB3aGljaCBpbXBsaWNpdGx5IHJlYWQgU1QoMCksIHN1Y2ggYXMgZnN0CisgICAgT25lQXJnRlAgICA9IDIgPDwgRlBUeXBlU2hpZnQsCisKKyAgICAvLyBPbmVBcmdGUFJXIC0gMSBhcmcgRlAgaW5zdHJ1Y3Rpb24gd2hpY2ggaW1wbGljaXRseSByZWFkIFNUKDApIGFuZCB3cml0ZSBhCisgICAgLy8gcmVzdWx0IGJhY2sgdG8gU1QoMCkuICBGb3IgZXhhbXBsZSwgZmNvcywgZnNxcnQsIGV0Yy4KKyAgICAvLworICAgIE9uZUFyZ0ZQUlcgPSAzIDw8IEZQVHlwZVNoaWZ0LAorCisgICAgLy8gVHdvQXJnRlAgLSAyIGFyZyBGUCBpbnN0cnVjdGlvbnMgd2hpY2ggaW1wbGljaXRseSByZWFkIFNUKDApLCBhbmQgYW4KKyAgICAvLyBleHBsaWNpdCBhcmd1bWVudCwgc3RvcmluZyB0aGUgcmVzdWx0IHRvIGVpdGhlciBTVCgwKSBvciB0aGUgaW1wbGljaXQKKyAgICAvLyBhcmd1bWVudC4gIEZvciBleGFtcGxlOiBmYWRkLCBmc3ViLCBmbXVsLCBldGMuLi4KKyAgICBUd29BcmdGUCAgID0gNCA8PCBGUFR5cGVTaGlmdCwKKworICAgIC8vIENvbXBhcmVGUCAtIDIgYXJnIEZQIGluc3RydWN0aW9ucyB3aGljaCBpbXBsaWNpdGx5IHJlYWQgU1QoMCkgYW5kIGFuCisgICAgLy8gZXhwbGljaXQgYXJndW1lbnQsIGJ1dCBoYXZlIG5vIGRlc3RpbmF0aW9uLiAgRXhhbXBsZTogZnVjb20sIGZ1Y29taSwgLi4uCisgICAgQ29tcGFyZUZQICA9IDUgPDwgRlBUeXBlU2hpZnQsCisKKyAgICAvLyBDb25kTW92RlAgLSAiMiBvcGVyYW5kIiBmbG9hdGluZyBwb2ludCBjb25kaXRpb25hbCBtb3ZlIGluc3RydWN0aW9ucy4KKyAgICBDb25kTW92RlAgID0gNiA8PCBGUFR5cGVTaGlmdCwKKworICAgIC8vIFNwZWNpYWxGUCAtIFNwZWNpYWwgaW5zdHJ1Y3Rpb24gZm9ybXMuICBEaXNwYXRjaCBieSBvcGNvZGUgZXhwbGljaXRseS4KKyAgICBTcGVjaWFsRlAgID0gNyA8PCBGUFR5cGVTaGlmdCwKKworICAgIC8vIExvY2sgcHJlZml4CisgICAgTE9DS1NoaWZ0ID0gMTksCisgICAgTE9DSyA9IDEgPDwgTE9DS1NoaWZ0LAorCisgICAgLy8gU2VnbWVudCBvdmVycmlkZSBwcmVmaXhlcy4gQ3VycmVudGx5IHdlIGp1c3QgbmVlZCBhYmlsaXR5IHRvIGFkZHJlc3MKKyAgICAvLyBzdHVmZiBpbiBncyBhbmQgZnMgc2VnbWVudHMuCisgICAgU2VnT3ZyU2hpZnQgPSAyMCwKKyAgICBTZWdPdnJNYXNrICA9IDMgPDwgU2VnT3ZyU2hpZnQsCisgICAgRlMgICAgICAgICAgPSAxIDw8IFNlZ092clNoaWZ0LAorICAgIEdTICAgICAgICAgID0gMiA8PCBTZWdPdnJTaGlmdCwKKworICAgIC8vIEV4ZWN1dGlvbiBkb21haW4gZm9yIFNTRSBpbnN0cnVjdGlvbnMgaW4gYml0cyAyMiwgMjMuCisgICAgLy8gMCBpbiBiaXRzIDIyLTIzIG1lYW5zIG5vcm1hbCwgbm9uLVNTRSBpbnN0cnVjdGlvbi4KKyAgICBTU0VEb21haW5TaGlmdCA9IDIyLAorCisgICAgT3Bjb2RlU2hpZnQgICA9IDI0LAorICAgIE9wY29kZU1hc2sgICAgPSAweEZGIDw8IE9wY29kZVNoaWZ0LAorCisgICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAgIC8vIFZFWCAtIFRoZSBvcGNvZGUgcHJlZml4IHVzZWQgYnkgQVZYIGluc3RydWN0aW9ucworICAgIFZFWCAgICAgICAgID0gMVVMTCA8PCAzMiwKKworICAgIC8vIFZFWF9XIC0gSGFzIGEgb3Bjb2RlIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHksIGJ1dCBpcyB1c2VkIGluIHRoZSBzYW1lCisgICAgLy8gd2F5IGFzIFJFWF9XIGlzIGZvciByZWd1bGFyIFNTRSBpbnN0cnVjdGlvbnMuCisgICAgVkVYX1cgICAgICAgPSAxVUxMIDw8IDMzLAorCisgICAgLy8gVkVYXzRWIC0gVXNlZCB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgQVZYL1NTRSByZWdpc3Rlci4gU2V2ZXJhbCAyCisgICAgLy8gYWRkcmVzcyBpbnN0cnVjdGlvbnMgaW4gU1NFIGFyZSByZXByZXNlbnRlZCBhcyAzIGFkZHJlc3Mgb25lcyBpbiBBVlgKKyAgICAvLyBhbmQgdGhlIGFkZGl0aW9uYWwgcmVnaXN0ZXIgaXMgZW5jb2RlZCBpbiBWRVhfVlZWViBwcmVmaXguCisgICAgVkVYXzRWICAgICAgPSAxVUxMIDw8IDM0LAorCisgICAgLy8gVkVYX0k4SU1NIC0gU3BlY2lmaWVzIHRoYXQgdGhlIGxhc3QgcmVnaXN0ZXIgdXNlZCBpbiBhIEFWWCBpbnN0cnVjdGlvbiwKKyAgICAvLyBtdXN0IGJlIGVuY29kZWQgaW4gdGhlIGk4IGltbWVkaWF0ZSBmaWVsZC4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgaW4KKyAgICAvLyBpbnN0cnVjdGlvbnMgd2l0aCA0IG9wZXJhbmRzLgorICAgIFZFWF9JOElNTSAgID0gMVVMTCA8PCAzNSwKKworICAgIC8vIFZFWF9MIC0gU3RhbmRzIGZvciBhIGJpdCBpbiB0aGUgVkVYIG9wY29kZSBwcmVmaXggbWVhbmluZyB0aGUgY3VycmVudAorICAgIC8vIGluc3RydWN0aW9uIHVzZXMgMjU2LWJpdCB3aWRlIHJlZ2lzdGVycy4gVGhpcyBpcyB1c3VhbGx5IGF1dG8gZGV0ZWN0ZWQgaWYKKyAgICAvLyBhIFZSMjU2IHJlZ2lzdGVyIGlzIHVzZWQsIGJ1dCBzb21lIEFWWCBpbnN0cnVjdGlvbnMgYWxzbyBoYXZlIHRoaXMgZmllbGQKKyAgICAvLyBtYXJrZWQgd2hlbiB1c2luZyBhIGYyNTYgbWVtb3J5IHJlZmVyZW5jZXMuCisgICAgVkVYX0wgICAgICAgPSAxVUxMIDw8IDM2CisgIH07CisgIAorICAvLyBnZXRCYXNlT3Bjb2RlRm9yIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSAiYmFzZSIgWDg2IG9wY29kZSBmb3IgdGhlCisgIC8vIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uLgorICAvLworICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0QmFzZU9wY29kZUZvcih1aW50NjRfdCBUU0ZsYWdzKSB7CisgICAgcmV0dXJuIFRTRmxhZ3MgPj4gWDg2SUk6Ok9wY29kZVNoaWZ0OworICB9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgaGFzSW1tKHVpbnQ2NF90IFRTRmxhZ3MpIHsKKyAgICByZXR1cm4gKFRTRmxhZ3MgJiBYODZJSTo6SW1tTWFzaykgIT0gMDsKKyAgfQorICAKKyAgLy8vIGdldFNpemVPZkltbSAtIERlY29kZSB0aGUgInNpemUgb2YgaW1tZWRpYXRlIiBmaWVsZCBmcm9tIHRoZSBUU0ZsYWdzIGZpZWxkCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFNpemVPZkltbSh1aW50NjRfdCBUU0ZsYWdzKSB7CisgICAgc3dpdGNoIChUU0ZsYWdzICYgWDg2SUk6OkltbU1hc2spIHsKKyAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biBpbW1lZGlhdGUgc2l6ZSIpOworICAgIGNhc2UgWDg2SUk6OkltbTg6CisgICAgY2FzZSBYODZJSTo6SW1tOFBDUmVsOiAgcmV0dXJuIDE7CisgICAgY2FzZSBYODZJSTo6SW1tMTY6CisgICAgY2FzZSBYODZJSTo6SW1tMTZQQ1JlbDogcmV0dXJuIDI7CisgICAgY2FzZSBYODZJSTo6SW1tMzI6CisgICAgY2FzZSBYODZJSTo6SW1tMzJQQ1JlbDogcmV0dXJuIDQ7CisgICAgY2FzZSBYODZJSTo6SW1tNjQ6ICAgICAgcmV0dXJuIDg7CisgICAgfQorICB9CisgIAorICAvLy8gaXNJbW1QQ1JlbCAtIFJldHVybiB0cnVlIGlmIHRoZSBpbW1lZGlhdGUgb2YgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbidzCisgIC8vLyBUU0ZsYWdzIGluZGljYXRlcyB0aGF0IGl0IGlzIHBjIHJlbGF0aXZlLgorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGlzSW1tUENSZWwodWludDY0X3QgVFNGbGFncykgeworICAgIHN3aXRjaCAoVFNGbGFncyAmIFg4NklJOjpJbW1NYXNrKSB7CisgICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gaW1tZWRpYXRlIHNpemUiKTsKKyAgICBjYXNlIFg4NklJOjpJbW04UENSZWw6CisgICAgY2FzZSBYODZJSTo6SW1tMTZQQ1JlbDoKKyAgICBjYXNlIFg4NklJOjpJbW0zMlBDUmVsOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBYODZJSTo6SW1tODoKKyAgICBjYXNlIFg4NklJOjpJbW0xNjoKKyAgICBjYXNlIFg4NklJOjpJbW0zMjoKKyAgICBjYXNlIFg4NklJOjpJbW02NDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgCisgIC8vLyBnZXRNZW1vcnlPcGVyYW5kTm8gLSBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgTUNJbnN0IG9wZXJhbmQgIyBmb3IgdGhlCisgIC8vLyBmaXJzdCBmaWVsZCBvZiB0aGUgbWVtb3J5IG9wZXJhbmQuICBJZiB0aGUgaW5zdHJ1Y3Rpb24gZG9lc24ndCBoYXZlIGEKKyAgLy8vIG1lbW9yeSBvcGVyYW5kLCB0aGlzIHJldHVybnMgLTEuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaWdub3JlcyB0aWVkIG9wZXJhbmRzLiAgSWYgdGhlcmUgaXMgYSB0aWVkIHJlZ2lzdGVyIHdoaWNoCisgIC8vLyBpcyBkdXBsaWNhdGVkIGluIHRoZSBNQ0luc3QgKGUuZy4gIkVBWCA9IGFkZGwgRUFYLCBbbWVtXSIpIGl0IGlzIG9ubHkKKyAgLy8vIGNvdW50ZWQgYXMgb25lIG9wZXJhbmQuCisgIC8vLworICBzdGF0aWMgaW5saW5lIGludCBnZXRNZW1vcnlPcGVyYW5kTm8odWludDY0X3QgVFNGbGFncykgeworICAgIHN3aXRjaCAoVFNGbGFncyAmIFg4NklJOjpGb3JtTWFzaykgeworICAgIGNhc2UgWDg2SUk6Ok1STUluaXRSZWc6ICBhc3NlcnQoMCAmJiAiRklYTUU6IFJlbW92ZSB0aGlzIGZvcm0iKTsKKyAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biBGb3JtTWFzayB2YWx1ZSBpbiBnZXRNZW1vcnlPcGVyYW5kTm8hIik7CisgICAgY2FzZSBYODZJSTo6UHNldWRvOgorICAgIGNhc2UgWDg2SUk6OlJhd0ZybToKKyAgICBjYXNlIFg4NklJOjpBZGRSZWdGcm06CisgICAgY2FzZSBYODZJSTo6TVJNRGVzdFJlZzoKKyAgICBjYXNlIFg4NklJOjpNUk1TcmNSZWc6CisgICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgWDg2SUk6Ok1STURlc3RNZW06CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIFg4NklJOjpNUk1TcmNNZW06IHsKKyAgICAgIGJvb2wgSGFzVkVYXzRWID0gVFNGbGFncyAmIFg4NklJOjpWRVhfNFY7CisgICAgICB1bnNpZ25lZCBGaXJzdE1lbU9wID0gMTsKKyAgICAgIGlmIChIYXNWRVhfNFYpCisgICAgICAgICsrRmlyc3RNZW1PcDsvLyBTa2lwIHRoZSByZWdpc3RlciBzb3VyY2UgKHdoaWNoIGlzIGVuY29kZWQgaW4gVkVYX1ZWVlYpLgorICAgICAgCisgICAgICAvLyBGSVhNRTogTWF5YmUgbGVhIHNob3VsZCBoYXZlIGl0cyBvd24gZm9ybT8gIFRoaXMgaXMgYSBob3JyaWJsZSBoYWNrLgorICAgICAgLy9pZiAoT3Bjb2RlID09IFg4Njo6TEVBNjRyIHx8IE9wY29kZSA9PSBYODY6OkxFQTY0XzMyciB8fAorICAgICAgLy8gICAgT3Bjb2RlID09IFg4Njo6TEVBMTZyIHx8IE9wY29kZSA9PSBYODY6OkxFQTMycikKKyAgICAgIHJldHVybiBGaXJzdE1lbU9wOworICAgIH0KKyAgICBjYXNlIFg4NklJOjpNUk0wcjogY2FzZSBYODZJSTo6TVJNMXI6CisgICAgY2FzZSBYODZJSTo6TVJNMnI6IGNhc2UgWDg2SUk6Ok1STTNyOgorICAgIGNhc2UgWDg2SUk6Ok1STTRyOiBjYXNlIFg4NklJOjpNUk01cjoKKyAgICBjYXNlIFg4NklJOjpNUk02cjogY2FzZSBYODZJSTo6TVJNN3I6CisgICAgICByZXR1cm4gLTE7CisgICAgY2FzZSBYODZJSTo6TVJNMG06IGNhc2UgWDg2SUk6Ok1STTFtOgorICAgIGNhc2UgWDg2SUk6Ok1STTJtOiBjYXNlIFg4NklJOjpNUk0zbToKKyAgICBjYXNlIFg4NklJOjpNUk00bTogY2FzZSBYODZJSTo6TVJNNW06CisgICAgY2FzZSBYODZJSTo6TVJNNm06IGNhc2UgWDg2SUk6Ok1STTdtOgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBYODZJSTo6TVJNX0MxOgorICAgIGNhc2UgWDg2SUk6Ok1STV9DMjoKKyAgICBjYXNlIFg4NklJOjpNUk1fQzM6CisgICAgY2FzZSBYODZJSTo6TVJNX0M0OgorICAgIGNhc2UgWDg2SUk6Ok1STV9DODoKKyAgICBjYXNlIFg4NklJOjpNUk1fQzk6CisgICAgY2FzZSBYODZJSTo6TVJNX0U4OgorICAgIGNhc2UgWDg2SUk6Ok1STV9GMDoKKyAgICBjYXNlIFg4NklJOjpNUk1fRjg6CisgICAgY2FzZSBYODZJSTo6TVJNX0Y5OgorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorfQorCitpbmxpbmUgc3RhdGljIGJvb2wgaXNTY2FsZShjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIHsKKyAgcmV0dXJuIE1PLmlzSW1tKCkgJiYKKyAgICAoTU8uZ2V0SW1tKCkgPT0gMSB8fCBNTy5nZXRJbW0oKSA9PSAyIHx8CisgICAgIE1PLmdldEltbSgpID09IDQgfHwgTU8uZ2V0SW1tKCkgPT0gOCk7Cit9CisKK2lubGluZSBzdGF0aWMgYm9vbCBpc0xlYU1lbShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcCkgeworICBpZiAoTUktPmdldE9wZXJhbmQoT3ApLmlzRkkoKSkgcmV0dXJuIHRydWU7CisgIHJldHVybiBPcCs0IDw9IE1JLT5nZXROdW1PcGVyYW5kcygpICYmCisgICAgTUktPmdldE9wZXJhbmQoT3AgICkuaXNSZWcoKSAmJiBpc1NjYWxlKE1JLT5nZXRPcGVyYW5kKE9wKzEpKSAmJgorICAgIE1JLT5nZXRPcGVyYW5kKE9wKzIpLmlzUmVnKCkgJiYKKyAgICAoTUktPmdldE9wZXJhbmQoT3ArMykuaXNJbW0oKSB8fAorICAgICBNSS0+Z2V0T3BlcmFuZChPcCszKS5pc0dsb2JhbCgpIHx8CisgICAgIE1JLT5nZXRPcGVyYW5kKE9wKzMpLmlzQ1BJKCkgfHwKKyAgICAgTUktPmdldE9wZXJhbmQoT3ArMykuaXNKVEkoKSk7Cit9CisKK2lubGluZSBzdGF0aWMgYm9vbCBpc01lbShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcCkgeworICBpZiAoTUktPmdldE9wZXJhbmQoT3ApLmlzRkkoKSkgcmV0dXJuIHRydWU7CisgIHJldHVybiBPcCs1IDw9IE1JLT5nZXROdW1PcGVyYW5kcygpICYmCisgICAgTUktPmdldE9wZXJhbmQoT3ArNCkuaXNSZWcoKSAmJgorICAgIGlzTGVhTWVtKE1JLCBPcCk7Cit9CisKK2NsYXNzIFg4Nkluc3RySW5mbyA6IHB1YmxpYyBUYXJnZXRJbnN0ckluZm9JbXBsIHsKKyAgWDg2VGFyZ2V0TWFjaGluZSAmVE07CisgIGNvbnN0IFg4NlJlZ2lzdGVySW5mbyBSSTsKKyAgCisgIC8vLyBSZWdPcDJNZW1PcFRhYmxlMkFkZHIsIFJlZ09wMk1lbU9wVGFibGUwLCBSZWdPcDJNZW1PcFRhYmxlMSwKKyAgLy8vIFJlZ09wMk1lbU9wVGFibGUyIC0gTG9hZCAvIHN0b3JlIGZvbGRpbmcgb3Bjb2RlIG1hcHMuCisgIC8vLworICBEZW5zZU1hcDx1bnNpZ25lZCosIHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4gPiBSZWdPcDJNZW1PcFRhYmxlMkFkZHI7CisgIERlbnNlTWFwPHVuc2lnbmVkKiwgc3RkOjpwYWlyPHVuc2lnbmVkLHVuc2lnbmVkPiA+IFJlZ09wMk1lbU9wVGFibGUwOworICBEZW5zZU1hcDx1bnNpZ25lZCosIHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4gPiBSZWdPcDJNZW1PcFRhYmxlMTsKKyAgRGVuc2VNYXA8dW5zaWduZWQqLCBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+ID4gUmVnT3AyTWVtT3BUYWJsZTI7CisgIAorICAvLy8gTWVtT3AyUmVnT3BUYWJsZSAtIExvYWQgLyBzdG9yZSB1bmZvbGRpbmcgb3Bjb2RlIG1hcC4KKyAgLy8vCisgIERlbnNlTWFwPHVuc2lnbmVkKiwgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gPiBNZW1PcDJSZWdPcFRhYmxlOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFg4Nkluc3RySW5mbyhYODZUYXJnZXRNYWNoaW5lICZ0bSk7CisKKyAgLy8vIGdldFJlZ2lzdGVySW5mbyAtIFRhcmdldEluc3RySW5mbyBpcyBhIHN1cGVyc2V0IG9mIE1SZWdpc3RlciBpbmZvLiAgQXMKKyAgLy8vIHN1Y2gsIHdoZW5ldmVyIGEgY2xpZW50IGhhcyBhbiBpbnN0YW5jZSBvZiBpbnN0cnVjdGlvbiBpbmZvLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBiZSBhYmxlIHRvIGdldCByZWdpc3RlciBpbmZvIGFzIHdlbGwgKHRocm91Z2ggdGhpcyBtZXRob2QpLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBYODZSZWdpc3RlckluZm8gJmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIFJJOyB9CisKKyAgLy8vIGlzQ29hbGVzY2FibGVFeHRJbnN0ciAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhICJjb2FsZXNjYWJsZSIKKyAgLy8vIGV4dGVuc2lvbiBpbnN0cnVjdGlvbi4gVGhhdCBpcywgaXQncyBsaWtlIGEgY29weSB3aGVyZSBpdCdzIGxlZ2FsIGZvciB0aGUKKyAgLy8vIHNvdXJjZSB0byBvdmVybGFwIHRoZSBkZXN0aW5hdGlvbi4gZS5nLiBYODY6Ok1PVlNYNjRycjMyLiBJZiB0aGlzIHJldHVybnMKKyAgLy8vIHRydWUsIHRoZW4gaXQncyBleHBlY3RlZCB0aGUgcHJlLWV4dGVuc2lvbiB2YWx1ZSBpcyBhdmFpbGFibGUgYXMgYSBzdWJyZWcKKyAgLy8vIG9mIHRoZSByZXN1bHQgcmVnaXN0ZXIuIFRoaXMgYWxzbyByZXR1cm5zIHRoZSBzdWItcmVnaXN0ZXIgaW5kZXggaW4KKyAgLy8vIFN1YklkeC4KKyAgdmlydHVhbCBib29sIGlzQ29hbGVzY2FibGVFeHRJbnN0cihjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcmNSZWcsIHVuc2lnbmVkICZEc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlN1YklkeCkgY29uc3Q7CisKKyAgdW5zaWduZWQgaXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworICAvLy8gaXNMb2FkRnJvbVN0YWNrU2xvdFBvc3RGRSAtIENoZWNrIGZvciBwb3N0LWZyYW1lIHB0ciBlbGltaW5hdGlvbgorICAvLy8gc3RhY2sgbG9jYXRpb25zIGFzIHdlbGwuICBUaGlzIHVzZXMgYSBoZXVyaXN0aWMgc28gaXQgaXNuJ3QKKyAgLy8vIHJlbGlhYmxlIGZvciBjb3JyZWN0bmVzcy4KKyAgdW5zaWduZWQgaXNMb2FkRnJvbVN0YWNrU2xvdFBvc3RGRShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisKKyAgLy8vIGhhc0xvYWRGcm9tU3RhY2tTbG90IC0gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGhhcworICAvLy8gYSBsb2FkIGZyb20gYSBzdGFjayBzbG90LCByZXR1cm4gdHJ1ZSBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4CisgIC8vLyBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QgYW5kIHRoZSBtYWNoaW5lIG1lbSBvcGVyYW5kIGNvbnRhaW5pbmcKKyAgLy8vIHRoZSByZWZlcmVuY2UuICBJZiBub3QsIHJldHVybiBmYWxzZS4gIFVubGlrZQorICAvLy8gaXNMb2FkRnJvbVN0YWNrU2xvdCwgdGhpcyByZXR1cm5zIHRydWUgZm9yIGFueSBpbnN0cnVjdGlvbnMgdGhhdAorICAvLy8gbG9hZHMgZnJvbSB0aGUgc3RhY2suICBUaGlzIGlzIGEgaGludCBvbmx5IGFuZCBtYXkgbm90IGNhdGNoIGFsbAorICAvLy8gY2FzZXMuCisgIGJvb2wgaGFzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqJk1NTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworCisgIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworICAvLy8gaXNTdG9yZVRvU3RhY2tTbG90UG9zdEZFIC0gQ2hlY2sgZm9yIHBvc3QtZnJhbWUgcHRyIGVsaW1pbmF0aW9uCisgIC8vLyBzdGFjayBsb2NhdGlvbnMgYXMgd2VsbC4gIFRoaXMgdXNlcyBhIGhldXJpc3RpYyBzbyBpdCBpc24ndAorICAvLy8gcmVsaWFibGUgZm9yIGNvcnJlY3RuZXNzLgorICB1bnNpZ25lZCBpc1N0b3JlVG9TdGFja1Nsb3RQb3N0RkUoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisKKyAgLy8vIGhhc1N0b3JlVG9TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaGFzIGEKKyAgLy8vIHN0b3JlIHRvIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRydWUgYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZgorICAvLy8gdGhlIGxvYWRlZCBzdGFjayBzbG90IGFuZCB0aGUgbWFjaGluZSBtZW0gb3BlcmFuZCBjb250YWluaW5nIHRoZQorICAvLy8gcmVmZXJlbmNlLiAgSWYgbm90LCByZXR1cm4gZmFsc2UuICBVbmxpa2UgaXNTdG9yZVRvU3RhY2tTbG90LAorICAvLy8gdGhpcyByZXR1cm5zIHRydWUgZm9yIGFueSBpbnN0cnVjdGlvbnMgdGhhdCBsb2FkcyBmcm9tIHRoZQorICAvLy8gc3RhY2suICBUaGlzIGlzIGEgaGludCBvbmx5IGFuZCBtYXkgbm90IGNhdGNoIGFsbCBjYXNlcy4KKyAgYm9vbCBoYXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqJk1NTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisKKyAgYm9vbCBpc1JlYWxseVRyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAqQUEpIGNvbnN0OworICB2b2lkIHJlTWF0ZXJpYWxpemUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3ViSWR4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpPcmlnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIGNvbnN0OworCisgIC8vLyBjb252ZXJ0VG9UaHJlZUFkZHJlc3MgLSBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdAorICAvLy8gc2V0IHRoZSBNX0NPTlZFUlRJQkxFX1RPXzNfQUREUiBmbGFnLiAgV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgdGFyZ2V0CisgIC8vLyBtYXkgYmUgYWJsZSB0byBjb252ZXJ0IGEgdHdvLWFkZHJlc3MgaW5zdHJ1Y3Rpb24gaW50byBhIHRydWUKKyAgLy8vIHRocmVlLWFkZHJlc3MgaW5zdHJ1Y3Rpb24gb24gZGVtYW5kLiAgVGhpcyBhbGxvd3MgdGhlIFg4NiB0YXJnZXQgKGZvcgorICAvLy8gZXhhbXBsZSkgdG8gY29udmVydCBBREQgYW5kIFNITCBpbnN0cnVjdGlvbnMgaW50byBMRUEgaW5zdHJ1Y3Rpb25zIGlmIHRoZXkKKyAgLy8vIHdvdWxkIHJlcXVpcmUgcmVnaXN0ZXIgY29waWVzIGR1ZSB0byB0d28tYWRkcmVzc25lc3MuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIG51bGwgcG9pbnRlciBpZiB0aGUgdHJhbnNmb3JtYXRpb24gY2Fubm90IGJlCisgIC8vLyBwZXJmb3JtZWQsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBuZXcgaW5zdHJ1Y3Rpb24uCisgIC8vLworICB2aXJ0dWFsIE1hY2hpbmVJbnN0ciAqY29udmVydFRvVGhyZWVBZGRyZXNzKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgJk1GSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVZhcmlhYmxlcyAqTFYpIGNvbnN0OworCisgIC8vLyBjb21tdXRlSW5zdHJ1Y3Rpb24gLSBXZSBoYXZlIGEgZmV3IGluc3RydWN0aW9ucyB0aGF0IG11c3QgYmUgaGFja2VkIG9uIHRvCisgIC8vLyBjb21tdXRlIHRoZW0uCisgIC8vLworICB2aXJ0dWFsIE1hY2hpbmVJbnN0ciAqY29tbXV0ZUluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAqTUksIGJvb2wgTmV3TUkpIGNvbnN0OworCisgIC8vIEJyYW5jaCBhbmFseXNpcy4KKyAgdmlydHVhbCBib29sIGlzVW5wcmVkaWNhdGVkVGVybWluYXRvcihjb25zdCBNYWNoaW5lSW5zdHIqIE1JKSBjb25zdDsKKyAgdmlydHVhbCBib29sIEFuYWx5emVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKiZUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TW9kaWZ5KSBjb25zdDsKKyAgdmlydHVhbCB1bnNpZ25lZCBSZW1vdmVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIGNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNSZWcsIGJvb2wgaXNLaWxsLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgc3RvcmVSZWdUb0FkZHIoTWFjaGluZUZ1bmN0aW9uICZNRiwgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIE1NT0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgTU1PRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICZOZXdNSXMpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgbG9hZFJlZ0Zyb21BZGRyKE1hY2hpbmVGdW5jdGlvbiAmTUYsIHVuc2lnbmVkIERlc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBNTU9CZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBNTU9FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICZOZXdNSXMpIGNvbnN0OworICAKKyAgdmlydHVhbCBib29sIHNwaWxsQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgIHZpcnR1YWwgYm9vbCByZXN0b3JlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKyAgCisgIHZpcnR1YWwKKyAgTWFjaGluZUluc3RyICplbWl0RnJhbWVJbmRleERlYnVnVmFsdWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZyYW1lSXgsIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpNRFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgREwpIGNvbnN0OworCisgIC8vLyBmb2xkTWVtb3J5T3BlcmFuZCAtIElmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIGl0LCBmb2xkIGEgbG9hZCBvciBzdG9yZSBvZgorICAvLy8gdGhlIHNwZWNpZmllZCBzdGFjayBzbG90IGludG8gdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCBvcGVyYW5kKHMpLiAgSWYgdGhpcyBpcyBwb3NzaWJsZSwgdGhlIHRhcmdldCBzaG91bGQgcGVyZm9ybSB0aGUKKyAgLy8vIGZvbGRpbmcgYW5kIHJldHVybiB0cnVlLCBvdGhlcndpc2UgaXQgc2hvdWxkIHJldHVybiBmYWxzZS4gIElmIGl0IGZvbGRzCisgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24sIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBNYWNoaW5lSW5zdHJ1Y3Rpb24gdGhlIGl0ZXJhdG9yCisgIC8vLyByZWZlcmVuY2VzIGhhcyBiZWVuIGNoYW5nZWQuCisgIHZpcnR1YWwgTWFjaGluZUluc3RyKiBmb2xkTWVtb3J5T3BlcmFuZEltcGwoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIqIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRnJhbWVJbmRleCkgY29uc3Q7CisKKyAgLy8vIGZvbGRNZW1vcnlPcGVyYW5kIC0gU2FtZSBhcyB0aGUgcHJldmlvdXMgdmVyc2lvbiBleGNlcHQgaXQgYWxsb3dzIGZvbGRpbmcKKyAgLy8vIG9mIGFueSBsb2FkIGFuZCBzdG9yZSBmcm9tIC8gdG8gYW55IGFkZHJlc3MsIG5vdCBqdXN0IGZyb20gYSBzcGVjaWZpYworICAvLy8gc3RhY2sgc2xvdC4KKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIqIGZvbGRNZW1vcnlPcGVyYW5kSW1wbChNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciogTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciogTG9hZE1JKSBjb25zdDsKKworICAvLy8gY2FuRm9sZE1lbW9yeU9wZXJhbmQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBsb2FkIC8gc3RvcmUgaXMKKyAgLy8vIGZvbGRpbmcgaXMgcG9zc2libGUuCisgIHZpcnR1YWwgYm9vbCBjYW5Gb2xkTWVtb3J5T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmKSBjb25zdDsKKworICAvLy8gdW5mb2xkTWVtb3J5T3BlcmFuZCAtIFNlcGFyYXRlIGEgc2luZ2xlIGluc3RydWN0aW9uIHdoaWNoIGZvbGRlZCBhIGxvYWQgb3IKKyAgLy8vIGEgc3RvcmUgb3IgYSBsb2FkIGFuZCBhIHN0b3JlIGludG8gdHdvIG9yIG1vcmUgaW5zdHJ1Y3Rpb24uIElmIHRoaXMgaXMKKyAgLy8vIHBvc3NpYmxlLCByZXR1cm5zIHRydWUgYXMgd2VsbCBhcyB0aGUgbmV3IGluc3RydWN0aW9ucyBieSByZWZlcmVuY2UuCisgIHZpcnR1YWwgYm9vbCB1bmZvbGRNZW1vcnlPcGVyYW5kKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsIGJvb2wgVW5mb2xkTG9hZCwgYm9vbCBVbmZvbGRTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAmTmV3TUlzKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgdW5mb2xkTWVtb3J5T3BlcmFuZChTZWxlY3Rpb25EQUcgJkRBRywgU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNETm9kZSo+ICZOZXdOb2RlcykgY29uc3Q7CisKKyAgLy8vIGdldE9wY29kZUFmdGVyTWVtb3J5VW5mb2xkIC0gUmV0dXJucyB0aGUgb3Bjb2RlIG9mIHRoZSB3b3VsZCBiZSBuZXcKKyAgLy8vIGluc3RydWN0aW9uIGFmdGVyIGxvYWQgLyBzdG9yZSBhcmUgdW5mb2xkZWQgZnJvbSBhbiBpbnN0cnVjdGlvbiBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCBvcGNvZGUuIEl0IHJldHVybnMgemVybyBpZiB0aGUgc3BlY2lmaWVkIHVuZm9sZGluZyBpcyBub3QKKyAgLy8vIHBvc3NpYmxlLiBJZiBMb2FkUmVnSW5kZXggaXMgbm9uLW51bGwsIGl0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBvcGVyYW5kCisgIC8vLyBpbmRleCBvZiB0aGUgb3BlcmFuZCB3aGljaCB3aWxsIGhvbGQgdGhlIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGxvYWRlZAorICAvLy8gdmFsdWUuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0T3Bjb2RlQWZ0ZXJNZW1vcnlVbmZvbGQodW5zaWduZWQgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVuZm9sZExvYWQsIGJvb2wgVW5mb2xkU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpMb2FkUmVnSW5kZXggPSAwKSBjb25zdDsKKyAgCisgIC8vLyBhcmVMb2Fkc0Zyb21TYW1lQmFzZVB0ciAtIFRoaXMgaXMgdXNlZCBieSB0aGUgcHJlLXJlZ2FsbG9jIHNjaGVkdWxlcgorICAvLy8gdG8gZGV0ZXJtaW5lIGlmIHR3byBsb2FkcyBhcmUgbG9hZGluZyBmcm9tIHRoZSBzYW1lIGJhc2UgYWRkcmVzcy4gSXQKKyAgLy8vIHNob3VsZCBvbmx5IHJldHVybiB0cnVlIGlmIHRoZSBiYXNlIHBvaW50ZXJzIGFyZSB0aGUgc2FtZSBhbmQgdGhlCisgIC8vLyBvbmx5IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBhZGRyZXNzZXMgYXJlIHRoZSBvZmZzZXQuIEl0IGFsc28gcmV0dXJucworICAvLy8gdGhlIG9mZnNldHMgYnkgcmVmZXJlbmNlLgorICB2aXJ0dWFsIGJvb2wgYXJlTG9hZHNGcm9tU2FtZUJhc2VQdHIoU0ROb2RlICpMb2FkMSwgU0ROb2RlICpMb2FkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJk9mZnNldDEsIGludDY0X3QgJk9mZnNldDIpIGNvbnN0OworCisgIC8vLyBzaG91bGRTY2hlZHVsZUxvYWRzTmVhciAtIFRoaXMgaXMgYSB1c2VkIGJ5IHRoZSBwcmUtcmVnYWxsb2Mgc2NoZWR1bGVyIHRvCisgIC8vLyBkZXRlcm1pbmUgKGluIGNvbmp1Y3Rpb24gd2l0aCBhcmVMb2Fkc0Zyb21TYW1lQmFzZVB0cikgaWYgdHdvIGxvYWRzIHNob3VsZAorICAvLy8gYmUgc2NoZWR1bGVkIHRvZ3RoZXIuIE9uIHNvbWUgdGFyZ2V0cyBpZiB0d28gbG9hZHMgYXJlIGxvYWRpbmcgZnJvbQorICAvLy8gYWRkcmVzc2VzIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUsIGl0J3MgYmV0dGVyIGlmIHRoZXkgYXJlIHNjaGVkdWxlZAorICAvLy8gdG9nZXRoZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgdHdvIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBsb2FkIG9mZnNldHMKKyAgLy8vIGZyb20gdGhlIGNvbW1vbiBiYXNlIGFkZHJlc3MuIEl0IHJldHVybnMgdHJ1ZSBpZiBpdCBkZWNpZGVzIGl0J3MgZGVzaXJhYmxlCisgIC8vLyB0byBzY2hlZHVsZSB0aGUgdHdvIGxvYWRzIHRvZ2V0aGVyLiAiTnVtTG9hZHMiIGlzIHRoZSBudW1iZXIgb2YgbG9hZHMgdGhhdAorICAvLy8gaGF2ZSBhbHJlYWR5IGJlZW4gc2NoZWR1bGVkIGFmdGVyIExvYWQxLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkU2NoZWR1bGVMb2Fkc05lYXIoU0ROb2RlICpMb2FkMSwgU0ROb2RlICpMb2FkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgT2Zmc2V0MSwgaW50NjRfdCBPZmZzZXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtTG9hZHMpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBnZXROb29wRm9yTWFjaG9UYXJnZXQoTUNJbnN0ICZOb3BJbnN0KSBjb25zdDsKKworICB2aXJ0dWFsCisgIGJvb2wgUmV2ZXJzZUJyYW5jaENvbmRpdGlvbihTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kKSBjb25zdDsKKworICAvLy8gaXNTYWZlVG9Nb3ZlUmVnQ2xhc3NEZWZzIC0gUmV0dXJuIHRydWUgaWYgaXQncyBzYWZlIHRvIG1vdmUgYSBtYWNoaW5lCisgIC8vLyBpbnN0cnVjdGlvbiB0aGF0IGRlZmluZXMgdGhlIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcy4KKyAgYm9vbCBpc1NhZmVUb01vdmVSZWdDbGFzc0RlZnMoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGlzWDg2XzY0Tm9uRXh0TG93Qnl0ZVJlZyh1bnNpZ25lZCByZWcpIHsKKyAgICByZXR1cm4gKHJlZyA9PSBYODY6OlNQTCB8fCByZWcgPT0gWDg2OjpCUEwgfHwKKyAgICAgICAgICByZWcgPT0gWDg2OjpTSUwgfHwgcmVnID09IFg4Njo6RElMKTsKKyAgfQorICAKKyAgc3RhdGljIGJvb2wgaXNYODZfNjRFeHRlbmRlZFJlZyhjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIHsKKyAgICBpZiAoIU1PLmlzUmVnKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXNYODZfNjRFeHRlbmRlZFJlZyhNTy5nZXRSZWcoKSk7CisgIH0KKworICAvLy8gaXNYODZfNjRFeHRlbmRlZFJlZyAtIElzIHRoZSBNYWNoaW5lT3BlcmFuZCBhIHg4Ni02NCBleHRlbmRlZCAocjggb3IKKyAgLy8vIGhpZ2hlcikgcmVnaXN0ZXI/ICBlLmcuIHI4LCB4bW04LCB4bW0xMywgZXRjLgorICBzdGF0aWMgYm9vbCBpc1g4Nl82NEV4dGVuZGVkUmVnKHVuc2lnbmVkIFJlZ05vKTsKKworICAvLy8gZ2V0R2xvYmFsQmFzZVJlZyAtIFJldHVybiBhIHZpcnR1YWwgcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUKKyAgLy8vIHRoZSBnbG9iYWwgYmFzZSByZWdpc3RlciB2YWx1ZS4gT3V0cHV0IGluc3RydWN0aW9ucyByZXF1aXJlZCB0bworICAvLy8gaW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZ1bmN0aW9uIGVudHJ5IGJsb2NrLCBpZiBuZWNlc3NhcnkuCisgIC8vLworICB1bnNpZ25lZCBnZXRHbG9iYWxCYXNlUmVnKE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0OworCisgIC8vLyBHZXRTU0VEb21haW4gLSBSZXR1cm4gdGhlIFNTRSBleGVjdXRpb24gZG9tYWluIG9mIE1JIGFzIHRoZSBmaXJzdCBlbGVtZW50LAorICAvLy8gYW5kIGEgYml0bWFzayBvZiBwb3NzaWJsZSBhcmd1bWVudHMgdG8gU2V0U1NFRG9tYWluIGFzZSB0aGUgc2Vjb25kLgorICBzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQxNl90PiBHZXRTU0VEb21haW4oY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3Q7CisKKyAgLy8vIFNldFNTRURvbWFpbiAtIFNldCB0aGUgU1NFRG9tYWluIG9mIE1JLgorICB2b2lkIFNldFNTRURvbWFpbihNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBEb21haW4pIGNvbnN0OworCitwcml2YXRlOgorICBNYWNoaW5lSW5zdHIgKiBjb252ZXJ0VG9UaHJlZUFkZHJlc3NXaXRoTEVBKHVuc2lnbmVkIE1JT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgJk1GSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVZhcmlhYmxlcyAqTFYpIGNvbnN0OworCisgIE1hY2hpbmVJbnN0ciogZm9sZE1lbW9yeU9wZXJhbmRJbXBsKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyKiBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZNT3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50KSBjb25zdDsKKworICAvLy8gaXNGcmFtZU9wZXJhbmQgLSBSZXR1cm4gdHJ1ZSBhbmQgdGhlIEZyYW1lSW5kZXggaWYgdGhlIHNwZWNpZmllZAorICAvLy8gb3BlcmFuZCBhbmQgZm9sbG93IG9wZXJhbmRzIGZvcm0gYSByZWZlcmVuY2UgdG8gdGhlIHN0YWNrIGZyYW1lLgorICBib29sIGlzRnJhbWVPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIGludCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0ckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0ckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlNjc5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nkluc3RySW5mby50ZApAQCAtMCwwICsxLDQ5OTMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vIA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8NCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBYODYgaW5zdHJ1Y3Rpb24gc2V0LCBkZWZpbmluZyB0aGUgaW5zdHJ1Y3Rpb25zLCBhbmQNCisvLyBwcm9wZXJ0aWVzIG9mIHRoZSBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIG5lZWRlZCBmb3IgY29kZSBnZW5lcmF0aW9uLCBtYWNoaW5lDQorLy8gY29kZSBlbWlzc2lvbiwgYW5kIGFuYWx5c2lzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFg4NiBzcGVjaWZpYyBEQUcgTm9kZXMuDQorLy8NCisNCitkZWYgU0RUSW50U2hpZnRET3A6IFNEVHlwZVByb2ZpbGU8MSwgMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzSW50PDA+LCBTRFRDaXNJbnQ8Mz5dPjsNCisNCitkZWYgU0RUWDg2Q21wVGVzdCA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgW1NEVENpc1ZUPDAsIGkzMj4sIFNEVENpc1NhbWVBczwxLCAyPl0+Ow0KKw0KK2RlZiBTRFRYODZDbW92ICAgIDogU0RUeXBlUHJvZmlsZTwxLCA0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNTYW1lQXM8MSwgMj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwzLCBpOD4sIFNEVENpc1ZUPDQsIGkzMj5dPjsNCisNCisvLyBVbmFyeSBhbmQgYmluYXJ5IG9wZXJhdG9yIGluc3RydWN0aW9ucyB0aGF0IHNldCBFRkxBR1MgYXMgYSBzaWRlLWVmZmVjdC4NCitkZWYgU0RUVW5hcnlBcml0aFdpdGhGbGFncyA6IFNEVHlwZVByb2ZpbGU8MiwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NEVENpc0ludDwwPiwgU0RUQ2lzVlQ8MSwgaTMyPl0+Ow0KKw0KK2RlZiBTRFRCaW5hcnlBcml0aFdpdGhGbGFncyA6IFNEVHlwZVByb2ZpbGU8MiwgMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRFRDaXNTYW1lQXM8MCwgMj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzU2FtZUFzPDAsIDM+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc0ludDwwPiwgU0RUQ2lzVlQ8MSwgaTMyPl0+Ow0KK2RlZiBTRFRYODZCckNvbmQgIDogU0RUeXBlUHJvZmlsZTwwLCAzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0RUQ2lzVlQ8MCwgT3RoZXJWVD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwxLCBpOD4sIFNEVENpc1ZUPDIsIGkzMj5dPjsNCisNCitkZWYgU0RUWDg2U2V0Q0MgICA6IFNEVHlwZVByb2ZpbGU8MSwgMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NEVENpc1ZUPDAsIGk4PiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDEsIGk4PiwgU0RUQ2lzVlQ8MiwgaTMyPl0+Ow0KK2RlZiBTRFRYODZTZXRDQ19DIDogU0RUeXBlUHJvZmlsZTwxLCAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0RUQ2lzSW50PDA+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVlQ8MSwgaTg+LCBTRFRDaXNWVDwyLCBpMzI+XT47DQorDQorZGVmIFNEVFg4NmNhcyA6IFNEVHlwZVByb2ZpbGU8MCwgMywgW1NEVENpc1B0clR5PDA+LCBTRFRDaXNJbnQ8MT4sIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwyLCBpOD5dPjsNCitkZWYgU0RUWDg2Y2FzOCA6IFNEVHlwZVByb2ZpbGU8MCwgMSwgW1NEVENpc1B0clR5PDA+XT47DQorDQorZGVmIFNEVFg4NmF0b21pY0JpbmFyeSA6IFNEVHlwZVByb2ZpbGU8MiwgMywgW1NEVENpc0ludDwwPiwgU0RUQ2lzSW50PDE+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzUHRyVHk8Mj4sIFNEVENpc0ludDwzPixTRFRDaXNJbnQ8ND5dPjsNCitkZWYgU0RUWDg2UmV0ICAgICA6IFNEVHlwZVByb2ZpbGU8MCwgLTEsIFtTRFRDaXNWVDwwLCBpMTY+XT47DQorDQorZGVmIFNEVF9YODZDYWxsU2VxU3RhcnQgOiBTRENhbGxTZXFTdGFydDxbU0RUQ2lzVlQ8MCwgaTMyPl0+Ow0KK2RlZiBTRFRfWDg2Q2FsbFNlcUVuZCAgIDogU0RDYWxsU2VxRW5kPFtTRFRDaXNWVDwwLCBpMzI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwxLCBpMzI+XT47DQorDQorZGVmIFNEVF9YODZDYWxsICAgOiBTRFR5cGVQcm9maWxlPDAsIC0xLCBbU0RUQ2lzVlQ8MCwgaVBUUj5dPjsNCisNCitkZWYgU0RUX1g4NlZBU1RBUlRfU0FWRV9YTU1fUkVHUyA6IFNEVHlwZVByb2ZpbGU8MCwgLTEsIFtTRFRDaXNWVDwwLCBpOD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVlQ8MSwgaVBUUj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUQ2lzVlQ8MiwgaVBUUj5dPjsNCisNCitkZWYgU0RUWDg2UmVwU3RyICA6IFNEVHlwZVByb2ZpbGU8MCwgMSwgW1NEVENpc1ZUPDAsIE90aGVyVlQ+XT47DQorDQorZGVmIFNEVFg4NlZvaWQgICAgOiBTRFR5cGVQcm9maWxlPDAsIDAsIFtdPjsNCisNCitkZWYgU0RUWDg2V3JhcHBlciA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgW1NEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzUHRyVHk8MD5dPjsNCisNCitkZWYgU0RUX1g4NlRMU0FERFIgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFtTRFRDaXNJbnQ8MD5dPjsNCisNCitkZWYgU0RUX1g4NlRMU0NBTEwgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFtTRFRDaXNQdHJUeTwwPl0+Ow0KKw0KK2RlZiBTRFRfWDg2U2VnbWVudEJhc2VBZGRyZXNzIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbU0RUQ2lzUHRyVHk8MD5dPjsNCisNCitkZWYgU0RUX1g4NkVIUkVUIDogU0RUeXBlUHJvZmlsZTwwLCAxLCBbU0RUQ2lzSW50PDA+XT47DQorDQorZGVmIFNEVF9YODZUQ1JFVCA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgW1NEVENpc1B0clR5PDA+LCBTRFRDaXNWVDwxLCBpMzI+XT47DQorDQorZGVmIFNEVF9YODZNRU1CQVJSSUVSIDogU0RUeXBlUHJvZmlsZTwwLCAwLCBbXT47DQorZGVmIFNEVF9YODZNRU1CQVJSSUVSTm9TU0UgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFtTRFRDaXNJbnQ8MD5dPjsNCisNCitkZWYgWDg2TWVtQmFycmllciA6IFNETm9kZTwiWDg2SVNEOjpNRU1CQVJSSUVSIiwgU0RUX1g4Nk1FTUJBUlJJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW5dPjsNCitkZWYgWDg2TWVtQmFycmllck5vU1NFIDogU0ROb2RlPCJYODZJU0Q6Ok1FTUJBUlJJRVIiLCBTRFRfWDg2TUVNQkFSUklFUk5vU1NFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+Ow0KK2RlZiBYODZNRmVuY2UgOiBTRE5vZGU8Ilg4NklTRDo6TUZFTkNFIiwgU0RUX1g4Nk1FTUJBUlJJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+Ow0KK2RlZiBYODZTRmVuY2UgOiBTRE5vZGU8Ilg4NklTRDo6U0ZFTkNFIiwgU0RUX1g4Nk1FTUJBUlJJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+Ow0KK2RlZiBYODZMRmVuY2UgOiBTRE5vZGU8Ilg4NklTRDo6TEZFTkNFIiwgU0RUX1g4Nk1FTUJBUlJJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+Ow0KKw0KKw0KK2RlZiBYODZic2YgICAgIDogU0ROb2RlPCJYODZJU0Q6OkJTRiIsICAgICAgU0RUVW5hcnlBcml0aFdpdGhGbGFncz47DQorZGVmIFg4NmJzciAgICAgOiBTRE5vZGU8Ilg4NklTRDo6QlNSIiwgICAgICBTRFRVbmFyeUFyaXRoV2l0aEZsYWdzPjsNCitkZWYgWDg2c2hsZCAgICA6IFNETm9kZTwiWDg2SVNEOjpTSExEIiwgICAgIFNEVEludFNoaWZ0RE9wPjsNCitkZWYgWDg2c2hyZCAgICA6IFNETm9kZTwiWDg2SVNEOjpTSFJEIiwgICAgIFNEVEludFNoaWZ0RE9wPjsNCisNCitkZWYgWDg2Y21wICAgICA6IFNETm9kZTwiWDg2SVNEOjpDTVAiICwgICAgIFNEVFg4NkNtcFRlc3Q+Ow0KK2RlZiBYODZidCAgICAgIDogU0ROb2RlPCJYODZJU0Q6OkJUIiwgICAgICAgU0RUWDg2Q21wVGVzdD47DQorDQorZGVmIFg4NmNtb3YgICAgOiBTRE5vZGU8Ilg4NklTRDo6Q01PViIsICAgICBTRFRYODZDbW92PjsNCitkZWYgWDg2YnJjb25kICA6IFNETm9kZTwiWDg2SVNEOjpCUkNPTkQiLCAgIFNEVFg4NkJyQ29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluXT47DQorZGVmIFg4NnNldGNjICAgOiBTRE5vZGU8Ilg4NklTRDo6U0VUQ0MiLCAgICBTRFRYODZTZXRDQz47DQorZGVmIFg4NnNldGNjX2MgOiBTRE5vZGU8Ilg4NklTRDo6U0VUQ0NfQ0FSUlkiLCBTRFRYODZTZXRDQ19DPjsNCisNCitkZWYgWDg2Y2FzIDogU0ROb2RlPCJYODZJU0Q6OkxDTVBYQ0hHX0RBRyIsIFNEVFg4NmNhcywNCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QSW5GbGFnLCBTRE5QT3V0RmxhZywgU0ROUE1heVN0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBTRE5QTWF5TG9hZF0+Ow0KK2RlZiBYODZjYXM4IDogU0ROb2RlPCJYODZJU0Q6OkxDTVBYQ0hHOF9EQUciLCBTRFRYODZjYXM4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBJbkZsYWcsIFNETlBPdXRGbGFnLCBTRE5QTWF5U3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFNETlBNYXlMb2FkXT47DQorZGVmIFg4NkF0b21BZGQ2NCA6IFNETm9kZTwiWDg2SVNEOjpBVE9NQURENjRfREFHIiwgU0RUWDg2YXRvbWljQmluYXJ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+Ow0KK2RlZiBYODZBdG9tU3ViNjQgOiBTRE5vZGU8Ilg4NklTRDo6QVRPTVNVQjY0X0RBRyIsIFNEVFg4NmF0b21pY0JpbmFyeSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsNCitkZWYgWDg2QXRvbU9yNjQgOiBTRE5vZGU8Ilg4NklTRDo6QVRPTU9SNjRfREFHIiwgU0RUWDg2YXRvbWljQmluYXJ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+Ow0KK2RlZiBYODZBdG9tWG9yNjQgOiBTRE5vZGU8Ilg4NklTRDo6QVRPTVhPUjY0X0RBRyIsIFNEVFg4NmF0b21pY0JpbmFyeSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsNCitkZWYgWDg2QXRvbUFuZDY0IDogU0ROb2RlPCJYODZJU0Q6OkFUT01BTkQ2NF9EQUciLCBTRFRYODZhdG9taWNCaW5hcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47DQorZGVmIFg4NkF0b21OYW5kNjQgOiBTRE5vZGU8Ilg4NklTRDo6QVRPTU5BTkQ2NF9EQUciLCBTRFRYODZhdG9taWNCaW5hcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47DQorZGVmIFg4NkF0b21Td2FwNjQgOiBTRE5vZGU8Ilg4NklTRDo6QVRPTVNXQVA2NF9EQUciLCBTRFRYODZhdG9taWNCaW5hcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47DQorZGVmIFg4NnJldGZsYWcgOiBTRE5vZGU8Ilg4NklTRDo6UkVUX0ZMQUciLCBTRFRYODZSZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE9wdEluRmxhZywgU0ROUFZhcmlhZGljXT47DQorDQorZGVmIFg4NnZhc3RhcnRfc2F2ZV94bW1fcmVncyA6DQorICAgICAgICAgICAgICAgICBTRE5vZGU8Ilg4NklTRDo6VkFTVEFSVF9TQVZFX1hNTV9SRUdTIiwNCisgICAgICAgICAgICAgICAgICAgICAgICBTRFRfWDg2VkFTVEFSVF9TQVZFX1hNTV9SRUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBWYXJpYWRpY10+Ow0KKw0KK2RlZiBYODZjYWxsc2VxX3N0YXJ0IDoNCisgICAgICAgICAgICAgICAgIFNETm9kZTwiSVNEOjpDQUxMU0VRX1NUQVJUIiwgU0RUX1g4NkNhbGxTZXFTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3V0RmxhZ10+Ow0KK2RlZiBYODZjYWxsc2VxX2VuZCA6DQorICAgICAgICAgICAgICAgICBTRE5vZGU8IklTRDo6Q0FMTFNFUV9FTkQiLCAgIFNEVF9YODZDYWxsU2VxRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWcsIFNETlBPdXRGbGFnXT47ICAgICAgIA0KKw0KK2RlZiBYODZjYWxsICAgIDogU0ROb2RlPCJYODZJU0Q6OkNBTEwiLCAgICAgU0RUX1g4NkNhbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE91dEZsYWcsIFNETlBPcHRJbkZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFNETlBWYXJpYWRpY10+Ow0KKw0KK2RlZiBYODZyZXBfc3RvczogU0ROb2RlPCJYODZJU0Q6OlJFUF9TVE9TIiwgU0RUWDg2UmVwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBJbkZsYWcsIFNETlBPdXRGbGFnLCBTRE5QTWF5U3RvcmVdPjsNCitkZWYgWDg2cmVwX21vdnM6IFNETm9kZTwiWDg2SVNEOjpSRVBfTU9WUyIsIFNEVFg4NlJlcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QSW5GbGFnLCBTRE5QT3V0RmxhZywgU0ROUE1heVN0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBTRE5QTWF5TG9hZF0+Ow0KKw0KK2RlZiBYODZyZHRzYyAgIDogU0ROb2RlPCJYODZJU0Q6OlJEVFNDX0RBRyIsIFNEVFg4NlZvaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE91dEZsYWcsIFNETlBTaWRlRWZmZWN0XT47DQorDQorZGVmIFg4NldyYXBwZXIgICAgOiBTRE5vZGU8Ilg4NklTRDo6V3JhcHBlciIsICAgICBTRFRYODZXcmFwcGVyPjsNCitkZWYgWDg2V3JhcHBlclJJUCA6IFNETm9kZTwiWDg2SVNEOjpXcmFwcGVyUklQIiwgIFNEVFg4NldyYXBwZXI+Ow0KKw0KK2RlZiBYODZ0bHNhZGRyIDogU0ROb2RlPCJYODZJU0Q6OlRMU0FERFIiLCBTRFRfWDg2VExTQUREUiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZ10+Ow0KK2RlZiBYODZTZWdtZW50QmFzZUFkZHJlc3MgOiBTRE5vZGU8Ilg4NklTRDo6U2VnbWVudEJhc2VBZGRyZXNzIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRfWDg2U2VnbWVudEJhc2VBZGRyZXNzLCBbXT47DQorDQorZGVmIFg4NmVocmV0IDogU0ROb2RlPCJYODZJU0Q6OkVIX1JFVFVSTiIsIFNEVF9YODZFSFJFVCwNCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluXT47DQorDQorZGVmIFg4NnRjcmV0IDogU0ROb2RlPCJYODZJU0Q6OlRDX1JFVFVSTiIsIFNEVF9YODZUQ1JFVCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgIFNETlBPcHRJbkZsYWcsIFNETlBWYXJpYWRpY10+Ow0KKw0KK2RlZiBYODZhZGRfZmxhZyAgOiBTRE5vZGU8Ilg4NklTRDo6QUREIiwgIFNEVEJpbmFyeUFyaXRoV2l0aEZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZV0+Ow0KK2RlZiBYODZzdWJfZmxhZyAgOiBTRE5vZGU8Ilg4NklTRDo6U1VCIiwgIFNEVEJpbmFyeUFyaXRoV2l0aEZsYWdzPjsNCitkZWYgWDg2c211bF9mbGFnIDogU0ROb2RlPCJYODZJU0Q6OlNNVUwiLCBTRFRCaW5hcnlBcml0aFdpdGhGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmVdPjsNCitkZWYgWDg2dW11bF9mbGFnIDogU0ROb2RlPCJYODZJU0Q6OlVNVUwiLCBTRFRVbmFyeUFyaXRoV2l0aEZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZV0+Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorZGVmIFg4NmluY19mbGFnICA6IFNETm9kZTwiWDg2SVNEOjpJTkMiLCAgU0RUVW5hcnlBcml0aFdpdGhGbGFncz47DQorZGVmIFg4NmRlY19mbGFnICA6IFNETm9kZTwiWDg2SVNEOjpERUMiLCAgU0RUVW5hcnlBcml0aFdpdGhGbGFncz47DQorZGVmIFg4Nm9yX2ZsYWcgICA6IFNETm9kZTwiWDg2SVNEOjpPUiIsICAgU0RUQmluYXJ5QXJpdGhXaXRoRmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlXT47DQorZGVmIFg4Nnhvcl9mbGFnICA6IFNETm9kZTwiWDg2SVNEOjpYT1IiLCAgU0RUQmluYXJ5QXJpdGhXaXRoRmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlXT47DQorZGVmIFg4NmFuZF9mbGFnICA6IFNETm9kZTwiWDg2SVNEOjpBTkQiLCAgU0RUQmluYXJ5QXJpdGhXaXRoRmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlXT47DQorDQorZGVmIFg4Nm11bF9pbW0gOiBTRE5vZGU8Ilg4NklTRDo6TVVMX0lNTSIsIFNEVEludEJpbk9wPjsNCisNCitkZWYgWDg2TWluZ3dBbGxvY2EgOiBTRE5vZGU8Ilg4NklTRDo6TUlOR1dfQUxMT0NBIiwgU0RUWDg2Vm9pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUEluRmxhZywgU0ROUE91dEZsYWddPjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorZGVmIFg4NlRMU0NhbGwgOiBTRE5vZGU8Ilg4NklTRDo6VExTQ0FMTCIsIFNEVF9YODZUTFNDQUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFg4NiBPcGVyYW5kIERlZmluaXRpb25zLg0KKy8vDQorDQorLy8gQSB2ZXJzaW9uIG9mIHB0cl9yYyB3aGljaCBleGNsdWRlcyBTUCwgRVNQLCBhbmQgUlNQLiBUaGlzIGlzIHVzZWQgZm9yDQorLy8gdGhlIGluZGV4IG9wZXJhbmQgb2YgYW4gYWRkcmVzcywgdG8gY29uZm9ybSB0byB4ODYgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLg0KK2RlZiBwdHJfcmNfbm9zcCA6IFBvaW50ZXJMaWtlUmVnQ2xhc3M8MT47DQorDQorLy8gKm1lbSAtIE9wZXJhbmQgZGVmaW5pdGlvbnMgZm9yIHRoZSBmdW5reSBYODYgYWRkcmVzc2luZyBtb2RlIG9wZXJhbmRzLg0KKy8vDQorZGVmIFg4Nk1lbUFzbU9wZXJhbmQgOiBBc21PcGVyYW5kQ2xhc3Mgew0KKyAgbGV0IE5hbWUgPSAiTWVtIjsNCisgIGxldCBTdXBlckNsYXNzZXMgPSBbXTsNCit9DQorZGVmIFg4NkFic01lbUFzbU9wZXJhbmQgOiBBc21PcGVyYW5kQ2xhc3Mgew0KKyAgbGV0IE5hbWUgPSAiQWJzTWVtIjsNCisgIGxldCBTdXBlckNsYXNzZXMgPSBbWDg2TWVtQXNtT3BlcmFuZF07DQorfQ0KK2NsYXNzIFg4Nk1lbU9wZXJhbmQ8c3RyaW5nIHByaW50TWV0aG9kPiA6IE9wZXJhbmQ8aVBUUj4gew0KKyAgbGV0IFByaW50TWV0aG9kID0gcHJpbnRNZXRob2Q7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgcHRyX3JjLCBpOGltbSwgcHRyX3JjX25vc3AsIGkzMmltbSwgaThpbW0pOw0KKyAgbGV0IFBhcnNlck1hdGNoQ2xhc3MgPSBYODZNZW1Bc21PcGVyYW5kOw0KK30NCisNCitkZWYgb3BhcXVlMzJtZW0gOiBYODZNZW1PcGVyYW5kPCJwcmludG9wYXF1ZW1lbSI+Ow0KK2RlZiBvcGFxdWU0OG1lbSA6IFg4Nk1lbU9wZXJhbmQ8InByaW50b3BhcXVlbWVtIj47DQorZGVmIG9wYXF1ZTgwbWVtIDogWDg2TWVtT3BlcmFuZDwicHJpbnRvcGFxdWVtZW0iPjsNCitkZWYgb3BhcXVlNTEybWVtIDogWDg2TWVtT3BlcmFuZDwicHJpbnRvcGFxdWVtZW0iPjsNCisNCitkZWYgaThtZW0gICA6IFg4Nk1lbU9wZXJhbmQ8InByaW50aThtZW0iPjsNCitkZWYgaTE2bWVtICA6IFg4Nk1lbU9wZXJhbmQ8InByaW50aTE2bWVtIj47DQorZGVmIGkzMm1lbSAgOiBYODZNZW1PcGVyYW5kPCJwcmludGkzMm1lbSI+Ow0KK2RlZiBpNjRtZW0gIDogWDg2TWVtT3BlcmFuZDwicHJpbnRpNjRtZW0iPjsNCitkZWYgaTEyOG1lbSA6IFg4Nk1lbU9wZXJhbmQ8InByaW50aTEyOG1lbSI+Ow0KK2RlZiBpMjU2bWVtIDogWDg2TWVtT3BlcmFuZDwicHJpbnRpMjU2bWVtIj47DQorZGVmIGYzMm1lbSAgOiBYODZNZW1PcGVyYW5kPCJwcmludGYzMm1lbSI+Ow0KK2RlZiBmNjRtZW0gIDogWDg2TWVtT3BlcmFuZDwicHJpbnRmNjRtZW0iPjsNCitkZWYgZjgwbWVtICA6IFg4Nk1lbU9wZXJhbmQ8InByaW50ZjgwbWVtIj47DQorZGVmIGYxMjhtZW0gOiBYODZNZW1PcGVyYW5kPCJwcmludGYxMjhtZW0iPjsNCitkZWYgZjI1Nm1lbSA6IFg4Nk1lbU9wZXJhbmQ8InByaW50ZjI1Nm1lbSI+Ow0KKw0KKy8vIEEgdmVyc2lvbiBvZiBpOG1lbSBmb3IgdXNlIG9uIHg4Ni02NCB0aGF0IHVzZXMgR1I2NF9OT1JFWCBpbnN0ZWFkIG9mDQorLy8gcGxhaW4gR1I2NCwgc28gdGhhdCBpdCBkb2Vzbid0IHBvdGVudGlhbGx5IHJlcXVpcmUgYSBSRVggcHJlZml4Lg0KK2RlZiBpOG1lbV9OT1JFWCA6IE9wZXJhbmQ8aTY0PiB7DQorICBsZXQgUHJpbnRNZXRob2QgPSAicHJpbnRpOG1lbSI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgR1I2NF9OT1JFWCwgaThpbW0sIEdSNjRfTk9SRVhfTk9TUCwgaTMyaW1tLCBpOGltbSk7DQorICBsZXQgUGFyc2VyTWF0Y2hDbGFzcyA9IFg4Nk1lbUFzbU9wZXJhbmQ7DQorfQ0KKw0KKy8vIFNwZWNpYWwgaTMybWVtIGZvciBhZGRyZXNzZXMgb2YgbG9hZCBmb2xkaW5nIHRhaWwgY2FsbHMuIFRoZXNlIGFyZSBub3QNCisvLyBhbGxvd2VkIHRvIHVzZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIHNpbmNlIHRoZXkgbXVzdCBiZSBzY2hlZHVsZWQNCisvLyBhZnRlciBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIgYXJlIHBvcHBlZC4NCitkZWYgaTMybWVtX1RDIDogT3BlcmFuZDxpMzI+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludGkzMm1lbSI7DQorICBsZXQgTUlPcGVyYW5kSW5mbyA9IChvcHMgR1IzMl9UQywgaThpbW0sIEdSMzJfVEMsIGkzMmltbSwgaThpbW0pOw0KKyAgbGV0IFBhcnNlck1hdGNoQ2xhc3MgPSBYODZNZW1Bc21PcGVyYW5kOw0KK30NCisNCisNCitsZXQgUGFyc2VyTWF0Y2hDbGFzcyA9IFg4NkFic01lbUFzbU9wZXJhbmQsDQorICAgIFByaW50TWV0aG9kID0gInByaW50X3BjcmVsX2ltbSIgaW4gew0KK2RlZiBpMzJpbW1fcGNyZWwgOiBPcGVyYW5kPGkzMj47DQorZGVmIGkxNmltbV9wY3JlbCA6IE9wZXJhbmQ8aTE2PjsNCisNCitkZWYgb2Zmc2V0OCA6IE9wZXJhbmQ8aTY0PjsNCitkZWYgb2Zmc2V0MTYgOiBPcGVyYW5kPGk2ND47DQorZGVmIG9mZnNldDMyIDogT3BlcmFuZDxpNjQ+Ow0KK2RlZiBvZmZzZXQ2NCA6IE9wZXJhbmQ8aTY0PjsNCisNCisvLyBCcmFuY2ggdGFyZ2V0cyBoYXZlIE90aGVyVlQgdHlwZSBhbmQgcHJpbnQgYXMgcGMtcmVsYXRpdmUgdmFsdWVzLg0KK2RlZiBicnRhcmdldCA6IE9wZXJhbmQ8T3RoZXJWVD47DQorZGVmIGJydGFyZ2V0OCA6IE9wZXJhbmQ8T3RoZXJWVD47DQorDQorfQ0KKw0KK2RlZiBTU0VDQyA6IE9wZXJhbmQ8aTg+IHsNCisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludFNTRUNDIjsNCit9DQorDQorY2xhc3MgSW1tU0V4dEFzbU9wZXJhbmRDbGFzcyA6IEFzbU9wZXJhbmRDbGFzcyB7DQorICBsZXQgU3VwZXJDbGFzc2VzID0gW0ltbUFzbU9wZXJhbmRdOw0KKyAgbGV0IFJlbmRlck1ldGhvZCA9ICJhZGRJbW1PcGVyYW5kcyI7DQorfQ0KKw0KKy8vIFNpZ24tZXh0ZW5kZWQgaW1tZWRpYXRlIGNsYXNzZXMuIFdlIGRvbid0IG5lZWQgdG8gZGVmaW5lIHRoZSBmdWxsIGxhdHRpY2UNCisvLyBoZXJlIGJlY2F1c2UgdGhlcmUgaXMgbm8gaW5zdHJ1Y3Rpb24gd2l0aCBhbiBhbWJpZ3VpdHkgYmV0d2VlbiBJbW1TRXh0aTY0aTMyDQorLy8gYW5kIEltbVNFeHRpMzJpOC4NCisvLw0KKy8vIFRoZSBzdHJhbmdlIHJhbmdlcyBjb21lIGZyb20gdGhlIGZhY3QgdGhhdCB0aGUgYXNzZW1ibGVyIGFsd2F5cyB3b3JrcyB3aXRoDQorLy8gNjQtYml0IGltbWVkaWF0ZXMsIGJ1dCBmb3IgYSAxNi1iaXQgdGFyZ2V0IHZhbHVlIHdlIHdhbnQgdG8gYWNjZXB0IGJvdGggIi0xIg0KKy8vICh3aGljaCB3aWxsIGJlIGEgLTFVTEwpLCBhbmQgIjB4RkYiICgtMSBpbiAxNi1iaXRzKS4NCisNCisvLyBbMCwgMHg3RkZGRkZGRl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisvLyAgIFsweEZGRkZGRkZGODAwMDAwMDAsIDB4RkZGRkZGRkZGRkZGRkZGRl0NCitkZWYgSW1tU0V4dGk2NGkzMkFzbU9wZXJhbmQgOiBJbW1TRXh0QXNtT3BlcmFuZENsYXNzIHsNCisgIGxldCBOYW1lID0gIkltbVNFeHRpNjRpMzIiOw0KK30NCisNCisvLyBbMCwgMHgwMDAwMDA3Rl0gfCBbMHgwMDAwMDAwMDAwMDBGRjgwLCAweDAwMDAwMDAwMDAwMEZGRkZdIHwNCisvLyAgIFsweEZGRkZGRkZGRkZGRkZGODAsIDB4RkZGRkZGRkZGRkZGRkZGRl0NCitkZWYgSW1tU0V4dGkxNmk4QXNtT3BlcmFuZCA6IEltbVNFeHRBc21PcGVyYW5kQ2xhc3Mgew0KKyAgbGV0IE5hbWUgPSAiSW1tU0V4dGkxNmk4IjsNCisgIGxldCBTdXBlckNsYXNzZXMgPSBbSW1tU0V4dGk2NGkzMkFzbU9wZXJhbmRdOw0KK30NCisNCisvLyBbMCwgMHgwMDAwMDA3Rl0gfCBbMHgwMDAwMDAwMEZGRkZGRjgwLCAweDAwMDAwMDAwRkZGRkZGRkZdIHwNCisvLyAgIFsweEZGRkZGRkZGRkZGRkZGODAsIDB4RkZGRkZGRkZGRkZGRkZGRl0NCitkZWYgSW1tU0V4dGkzMmk4QXNtT3BlcmFuZCA6IEltbVNFeHRBc21PcGVyYW5kQ2xhc3Mgew0KKyAgbGV0IE5hbWUgPSAiSW1tU0V4dGkzMmk4IjsNCit9DQorDQorLy8gWzAsIDB4MDAwMDAwN0ZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorLy8gICBbMHhGRkZGRkZGRkZGRkZGRjgwLCAweEZGRkZGRkZGRkZGRkZGRkZdDQorZGVmIEltbVNFeHRpNjRpOEFzbU9wZXJhbmQgOiBJbW1TRXh0QXNtT3BlcmFuZENsYXNzIHsNCisgIGxldCBOYW1lID0gIkltbVNFeHRpNjRpOCI7DQorICBsZXQgU3VwZXJDbGFzc2VzID0gW0ltbVNFeHRpMTZpOEFzbU9wZXJhbmQsIEltbVNFeHRpMzJpOEFzbU9wZXJhbmQsDQorICAgICAgICAgICAgICAgICAgICAgIEltbVNFeHRpNjRpMzJBc21PcGVyYW5kXTsNCit9DQorDQorLy8gQSBjb3VwbGUgb2YgbW9yZSBkZXNjcmlwdGl2ZSBvcGVyYW5kIGRlZmluaXRpb25zLg0KKy8vIDE2LWJpdHMgYnV0IG9ubHkgOCBiaXRzIGFyZSBzaWduaWZpY2FudC4NCitkZWYgaTE2aThpbW0gIDogT3BlcmFuZDxpMTY+IHsNCisgIGxldCBQYXJzZXJNYXRjaENsYXNzID0gSW1tU0V4dGkxNmk4QXNtT3BlcmFuZDsNCit9DQorLy8gMzItYml0cyBidXQgb25seSA4IGJpdHMgYXJlIHNpZ25pZmljYW50Lg0KK2RlZiBpMzJpOGltbSAgOiBPcGVyYW5kPGkzMj4gew0KKyAgbGV0IFBhcnNlck1hdGNoQ2xhc3MgPSBJbW1TRXh0aTMyaThBc21PcGVyYW5kOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFg4NiBDb21wbGV4IFBhdHRlcm4gRGVmaW5pdGlvbnMuDQorLy8NCisNCisvLyBEZWZpbmUgWDg2IHNwZWNpZmljIGFkZHJlc3NpbmcgbW9kZS4NCitkZWYgYWRkciAgICAgIDogQ29tcGxleFBhdHRlcm48aVBUUiwgNSwgIlNlbGVjdEFkZHIiLCBbXSwgW10+Ow0KK2RlZiBsZWEzMmFkZHIgOiBDb21wbGV4UGF0dGVybjxpMzIsIDUsICJTZWxlY3RMRUFBZGRyIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FkZCwgc3ViLCBtdWwsIFg4Nm11bF9pbW0sIHNobCwgb3IsIGZyYW1laW5kZXhdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47DQorZGVmIHRsczMyYWRkciA6IENvbXBsZXhQYXR0ZXJuPGkzMiwgNSwgIlNlbGVjdFRMU0FERFJBZGRyIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RnbG9iYWx0bHNhZGRyXSwgW10+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gWDg2IEluc3RydWN0aW9uIFByZWRpY2F0ZSBEZWZpbml0aW9ucy4NCitkZWYgSGFzQ01vdiAgICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmhhc0NNb3YoKSI+Ow0KK2RlZiBOb0NNb3YgICAgICAgOiBQcmVkaWNhdGU8IiFTdWJ0YXJnZXQtPmhhc0NNb3YoKSI+Ow0KKw0KKy8vIEZJWE1FOiB0ZW1wb3JhcnkgaGFjayB0byBsZXQgY29kZWdlbiBhc3NlcnQgb3IgZ2VuZXJhdGUgcG9vciBjb2RlIGluIGNhc2UNCisvLyBubyBBVlggdmVyc2lvbiBvZiB0aGUgZGVzaXJlZCBpbnRydWN0aW9ucyBpcyBwcmVzZW50LCB0aGlzIGlzIGJldHRlciBmb3INCisvLyBpbmNyZW1lbnRhbCBkZXYgKHdpdGhvdXQgZmFsbGJhY2tzIGl0J3MgZWFzaWVyIHRvIHNwb3Qgd2hhdCdzIG1pc3NpbmcpDQorZGVmIEhhc01NWCAgICAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT5oYXNNTVgoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSI+Ow0KK2RlZiBIYXNTU0UxICAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpIj47DQorZGVmIEhhc1NTRTIgICAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkiPjsNCitkZWYgSGFzU1NFMyAgICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmhhc1NTRTMoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSI+Ow0KK2RlZiBIYXNTU1NFMyAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzU1NTRTMoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSI+Ow0KK2RlZiBIYXNTU0U0MSAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzU1NFNDEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSI+Ow0KK2RlZiBIYXNTU0U0MiAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzU1NFNDIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSI+Ow0KK2RlZiBIYXNTU0U0QSAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzU1NFNEEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSI+Ow0KKw0KK2RlZiBIYXNBVlggICAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzQVZYKCkiPjsNCitkZWYgSGFzQ0xNVUwgICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmhhc0NMTVVMKCkiPjsNCitkZWYgSGFzRk1BMyAgICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmhhc0ZNQTMoKSI+Ow0KK2RlZiBIYXNGTUE0ICAgICAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+aGFzRk1BNCgpIj47DQorZGVmIEZQU3RhY2tmMzIgICA6IFByZWRpY2F0ZTwiIVN1YnRhcmdldC0+aGFzU1NFMSgpIj47DQorZGVmIEZQU3RhY2tmNjQgICA6IFByZWRpY2F0ZTwiIVN1YnRhcmdldC0+aGFzU1NFMigpIj47DQorZGVmIEluMzJCaXRNb2RlICA6IFByZWRpY2F0ZTwiIVN1YnRhcmdldC0+aXM2NEJpdCgpIj47DQorZGVmIEluNjRCaXRNb2RlICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT5pczY0Qml0KCkiPjsNCitkZWYgSXNXaW42NCAgICAgIDogUHJlZGljYXRlPCJTdWJ0YXJnZXQtPmlzVGFyZ2V0V2luNjQoKSI+Ow0KK2RlZiBOb3RXaW42NCAgICAgOiBQcmVkaWNhdGU8IiFTdWJ0YXJnZXQtPmlzVGFyZ2V0V2luNjQoKSI+Ow0KK2RlZiBTbWFsbENvZGUgICAgOiBQcmVkaWNhdGU8IlRNLmdldENvZGVNb2RlbCgpID09IENvZGVNb2RlbDo6U21hbGwiPjsNCitkZWYgS2VybmVsQ29kZSAgIDogUHJlZGljYXRlPCJUTS5nZXRDb2RlTW9kZWwoKSA9PSBDb2RlTW9kZWw6Oktlcm5lbCI+Ow0KK2RlZiBGYXJEYXRhICAgICAgOiBQcmVkaWNhdGU8IlRNLmdldENvZGVNb2RlbCgpICE9IENvZGVNb2RlbDo6U21hbGwgJiYiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE0uZ2V0Q29kZU1vZGVsKCkgIT0gQ29kZU1vZGVsOjpLZXJuZWwiPjsNCitkZWYgTmVhckRhdGEgICAgIDogUHJlZGljYXRlPCJUTS5nZXRDb2RlTW9kZWwoKSA9PSBDb2RlTW9kZWw6OlNtYWxsIHx8Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRNLmdldENvZGVNb2RlbCgpID09IENvZGVNb2RlbDo6S2VybmVsIj47DQorZGVmIElzU3RhdGljICAgICA6IFByZWRpY2F0ZTwiVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlN0YXRpYyI+Ow0KK2RlZiBJc05vdFBJQyAgICAgOiBQcmVkaWNhdGU8IlRNLmdldFJlbG9jYXRpb25Nb2RlbCgpICE9IFJlbG9jOjpQSUNfIj47DQorZGVmIE9wdEZvclNpemUgICA6IFByZWRpY2F0ZTwiT3B0Rm9yU2l6ZSI+Ow0KK2RlZiBPcHRGb3JTcGVlZCAgOiBQcmVkaWNhdGU8IiFPcHRGb3JTaXplIj47DQorZGVmIEZhc3RCVE1lbSAgICA6IFByZWRpY2F0ZTwiIVN1YnRhcmdldC0+aXNCVE1lbVNsb3coKSI+Ow0KK2RlZiBDYWxsSW1tQWRkciAgOiBQcmVkaWNhdGU8IlN1YnRhcmdldC0+SXNMZWdhbFRvQ2FsbEltbWVkaWF0ZUFkZHIoVE0pIj47DQorZGVmIEhhc0FFUyAgICAgICA6IFByZWRpY2F0ZTwiU3VidGFyZ2V0LT5oYXNBRVMoKSI+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gWDg2IEluc3RydWN0aW9uIEZvcm1hdCBEZWZpbml0aW9ucy4NCisvLw0KKw0KK2luY2x1ZGUgIlg4Nkluc3RyRm9ybWF0cy50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFBhdHRlcm4gZnJhZ21lbnRzLi4uDQorLy8NCisNCisvLyBYODYgc3BlY2lmaWMgY29uZGl0aW9uIGNvZGUuIFRoZXNlIGNvcnJlc3BvbmQgdG8gQ29uZENvZGUgaW4NCisvLyBYODZJbnN0ckluZm8uaC4gVGhleSBtdXN0IGJlIGtlcHQgaW4gc3luY2guDQorZGVmIFg4Nl9DT05EX0EgICA6IFBhdExlYWY8KGk4IDApPjsgIC8vIGFsdC4gQ09ORF9OQkUNCitkZWYgWDg2X0NPTkRfQUUgIDogUGF0TGVhZjwoaTggMSk+OyAgLy8gYWx0LiBDT05EX05DDQorZGVmIFg4Nl9DT05EX0IgICA6IFBhdExlYWY8KGk4IDIpPjsgIC8vIGFsdC4gQ09ORF9DDQorZGVmIFg4Nl9DT05EX0JFICA6IFBhdExlYWY8KGk4IDMpPjsgIC8vIGFsdC4gQ09ORF9OQQ0KK2RlZiBYODZfQ09ORF9FICAgOiBQYXRMZWFmPChpOCA0KT47ICAvLyBhbHQuIENPTkRfWg0KK2RlZiBYODZfQ09ORF9HICAgOiBQYXRMZWFmPChpOCA1KT47ICAvLyBhbHQuIENPTkRfTkxFDQorZGVmIFg4Nl9DT05EX0dFICA6IFBhdExlYWY8KGk4IDYpPjsgIC8vIGFsdC4gQ09ORF9OTA0KK2RlZiBYODZfQ09ORF9MICAgOiBQYXRMZWFmPChpOCA3KT47ICAvLyBhbHQuIENPTkRfTkdFDQorZGVmIFg4Nl9DT05EX0xFICA6IFBhdExlYWY8KGk4IDgpPjsgIC8vIGFsdC4gQ09ORF9ORw0KK2RlZiBYODZfQ09ORF9ORSAgOiBQYXRMZWFmPChpOCA5KT47ICAvLyBhbHQuIENPTkRfTloNCitkZWYgWDg2X0NPTkRfTk8gIDogUGF0TGVhZjwoaTggMTApPjsNCitkZWYgWDg2X0NPTkRfTlAgIDogUGF0TGVhZjwoaTggMTEpPjsgLy8gYWx0LiBDT05EX1BPDQorZGVmIFg4Nl9DT05EX05TICA6IFBhdExlYWY8KGk4IDEyKT47DQorZGVmIFg4Nl9DT05EX08gICA6IFBhdExlYWY8KGk4IDEzKT47DQorZGVmIFg4Nl9DT05EX1AgICA6IFBhdExlYWY8KGk4IDE0KT47IC8vIGFsdC4gQ09ORF9QRQ0KK2RlZiBYODZfQ09ORF9TICAgOiBQYXRMZWFmPChpOCAxNSk+Ow0KKw0KK2RlZiBpbW1TZXh0OCA6IFBhdExlYWY8KGltbSksIFt7DQorICByZXR1cm4gTi0+Z2V0U0V4dFZhbHVlKCkgPT0gKGludDhfdClOLT5nZXRTRXh0VmFsdWUoKTsNCit9XT47DQorDQorZGVmIGkxNmltbVNFeHQ4ICA6IFBhdExlYWY8KGkxNiBpbW1TZXh0OCk+Ow0KK2RlZiBpMzJpbW1TRXh0OCAgOiBQYXRMZWFmPChpMzIgaW1tU2V4dDgpPjsNCisNCisvLy8gTG9hZCBwYXR0ZXJuczogdGhlc2UgY29uc3RyYWludCB0aGUgbWF0Y2ggdG8gdGhlIHJpZ2h0IGFkZHJlc3Mgc3BhY2UuDQorZGVmIGRzbG9hZCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAobG9hZCBub2RlOiRwdHIpLCBbew0KKyAgaWYgKGNvbnN0IFZhbHVlICpTcmMgPSBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRTcmNWYWx1ZSgpKQ0KKyAgICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlBUID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFNyYy0+Z2V0VHlwZSgpKSkNCisgICAgICBpZiAoUFQtPmdldEFkZHJlc3NTcGFjZSgpID4gMjU1KQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIHRydWU7DQorfV0+Ow0KKw0KK2RlZiBnc2xvYWQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGxvYWQgbm9kZTokcHRyKSwgW3sNCisgIGlmIChjb25zdCBWYWx1ZSAqU3JjID0gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0U3JjVmFsdWUoKSkNCisgICAgaWYgKGNvbnN0IFBvaW50ZXJUeXBlICpQVCA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihTcmMtPmdldFR5cGUoKSkpDQorICAgICAgcmV0dXJuIFBULT5nZXRBZGRyZXNzU3BhY2UoKSA9PSAyNTY7DQorICByZXR1cm4gZmFsc2U7DQorfV0+Ow0KKw0KK2RlZiBmc2xvYWQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGxvYWQgbm9kZTokcHRyKSwgW3sNCisgIGlmIChjb25zdCBWYWx1ZSAqU3JjID0gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0U3JjVmFsdWUoKSkNCisgICAgaWYgKGNvbnN0IFBvaW50ZXJUeXBlICpQVCA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihTcmMtPmdldFR5cGUoKSkpDQorICAgICAgcmV0dXJuIFBULT5nZXRBZGRyZXNzU3BhY2UoKSA9PSAyNTc7DQorICByZXR1cm4gZmFsc2U7DQorfV0+Ow0KKw0KKw0KKy8vIEhlbHBlciBmcmFnbWVudHMgZm9yIGxvYWRzLg0KKy8vIEl0J3MgYWx3YXlzIHNhZmUgdG8gdHJlYXQgYSBhbnlleHQgaTE2IGxvYWQgYXMgYSBpMzIgbG9hZCBpZiB0aGUgaTE2IGlzDQorLy8ga25vd24gdG8gYmUgMzItYml0IGFsaWduZWQgb3IgYmV0dGVyLiBEaXR0byBmb3IgaTggdG8gaTE2Lg0KK2RlZiBsb2FkaTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpMTYgKHVuaW5kZXhlZGxvYWQgbm9kZTokcHRyKSksIFt7DQorICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oTik7DQorICBpZiAoY29uc3QgVmFsdWUgKlNyYyA9IExELT5nZXRTcmNWYWx1ZSgpKQ0KKyAgICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlBUID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFNyYy0+Z2V0VHlwZSgpKSkNCisgICAgICBpZiAoUFQtPmdldEFkZHJlc3NTcGFjZSgpID4gMjU1KQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgSVNEOjpMb2FkRXh0VHlwZSBFeHRUeXBlID0gTEQtPmdldEV4dGVuc2lvblR5cGUoKTsNCisgIGlmIChFeHRUeXBlID09IElTRDo6Tk9OX0VYVExPQUQpDQorICAgIHJldHVybiB0cnVlOw0KKyAgaWYgKEV4dFR5cGUgPT0gSVNEOjpFWFRMT0FEKQ0KKyAgICByZXR1cm4gTEQtPmdldEFsaWdubWVudCgpID49IDIgJiYgIUxELT5pc1ZvbGF0aWxlKCk7DQorICByZXR1cm4gZmFsc2U7DQorfV0+Ow0KKw0KK2RlZiBsb2FkaTE2X2FueWV4dCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTMyICh1bmluZGV4ZWRsb2FkIG5vZGU6JHB0cikpLFt7DQorICBMb2FkU0ROb2RlICpMRCA9IGNhc3Q8TG9hZFNETm9kZT4oTik7DQorICBpZiAoY29uc3QgVmFsdWUgKlNyYyA9IExELT5nZXRTcmNWYWx1ZSgpKQ0KKyAgICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlBUID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFNyYy0+Z2V0VHlwZSgpKSkNCisgICAgICBpZiAoUFQtPmdldEFkZHJlc3NTcGFjZSgpID4gMjU1KQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgSVNEOjpMb2FkRXh0VHlwZSBFeHRUeXBlID0gTEQtPmdldEV4dGVuc2lvblR5cGUoKTsNCisgIGlmIChFeHRUeXBlID09IElTRDo6RVhUTE9BRCkNCisgICAgcmV0dXJuIExELT5nZXRBbGlnbm1lbnQoKSA+PSAyICYmICFMRC0+aXNWb2xhdGlsZSgpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK31dPjsNCisNCitkZWYgbG9hZGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTMyICh1bmluZGV4ZWRsb2FkIG5vZGU6JHB0cikpLCBbew0KKyAgTG9hZFNETm9kZSAqTEQgPSBjYXN0PExvYWRTRE5vZGU+KE4pOw0KKyAgaWYgKGNvbnN0IFZhbHVlICpTcmMgPSBMRC0+Z2V0U3JjVmFsdWUoKSkNCisgICAgaWYgKGNvbnN0IFBvaW50ZXJUeXBlICpQVCA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihTcmMtPmdldFR5cGUoKSkpDQorICAgICAgaWYgKFBULT5nZXRBZGRyZXNzU3BhY2UoKSA+IDI1NSkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgIElTRDo6TG9hZEV4dFR5cGUgRXh0VHlwZSA9IExELT5nZXRFeHRlbnNpb25UeXBlKCk7DQorICBpZiAoRXh0VHlwZSA9PSBJU0Q6Ok5PTl9FWFRMT0FEKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIGlmIChFeHRUeXBlID09IElTRDo6RVhUTE9BRCkNCisgICAgcmV0dXJuIExELT5nZXRBbGlnbm1lbnQoKSA+PSA0ICYmICFMRC0+aXNWb2xhdGlsZSgpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK31dPjsNCisNCitkZWYgbG9hZGk4ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTggIChkc2xvYWQgbm9kZTokcHRyKSk+Ow0KK2RlZiBsb2FkaTY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpNjQgKGRzbG9hZCBub2RlOiRwdHIpKT47DQorZGVmIGxvYWRmMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGYzMiAoZHNsb2FkIG5vZGU6JHB0cikpPjsNCitkZWYgbG9hZGY2NCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZjY0IChkc2xvYWQgbm9kZTokcHRyKSk+Ow0KK2RlZiBsb2FkZjgwIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChmODAgKGRzbG9hZCBub2RlOiRwdHIpKT47DQorDQorZGVmIHNleHRsb2FkaTE2aTggIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpMTYgKHNleHRsb2FkaTggbm9kZTokcHRyKSk+Ow0KK2RlZiBzZXh0bG9hZGkzMmk4ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTMyIChzZXh0bG9hZGk4IG5vZGU6JHB0cikpPjsNCitkZWYgc2V4dGxvYWRpMzJpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGkzMiAoc2V4dGxvYWRpMTYgbm9kZTokcHRyKSk+Ow0KKw0KK2RlZiB6ZXh0bG9hZGk4aTEgICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTggICh6ZXh0bG9hZGkxIG5vZGU6JHB0cikpPjsNCitkZWYgemV4dGxvYWRpMTZpMSAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGkxNiAoemV4dGxvYWRpMSBub2RlOiRwdHIpKT47DQorZGVmIHpleHRsb2FkaTMyaTEgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpMzIgKHpleHRsb2FkaTEgbm9kZTokcHRyKSk+Ow0KK2RlZiB6ZXh0bG9hZGkxNmk4ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoaTE2ICh6ZXh0bG9hZGk4IG5vZGU6JHB0cikpPjsNCitkZWYgemV4dGxvYWRpMzJpOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGkzMiAoemV4dGxvYWRpOCBub2RlOiRwdHIpKT47DQorZGVmIHpleHRsb2FkaTMyaTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChpMzIgKHpleHRsb2FkaTE2IG5vZGU6JHB0cikpPjsNCisNCitkZWYgZXh0bG9hZGk4aTEgICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGk4ICAoZXh0bG9hZGkxIG5vZGU6JHB0cikpPjsNCitkZWYgZXh0bG9hZGkxNmkxICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGkxNiAoZXh0bG9hZGkxIG5vZGU6JHB0cikpPjsNCitkZWYgZXh0bG9hZGkzMmkxICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGkzMiAoZXh0bG9hZGkxIG5vZGU6JHB0cikpPjsNCitkZWYgZXh0bG9hZGkxNmk4ICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGkxNiAoZXh0bG9hZGk4IG5vZGU6JHB0cikpPjsNCitkZWYgZXh0bG9hZGkzMmk4ICAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGkzMiAoZXh0bG9hZGk4IG5vZGU6JHB0cikpPjsNCitkZWYgZXh0bG9hZGkzMmkxNiAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGkzMiAoZXh0bG9hZGkxNiBub2RlOiRwdHIpKT47DQorDQorDQorLy8gQW4gJ2FuZCcgbm9kZSB3aXRoIGEgc2luZ2xlIHVzZS4NCitkZWYgYW5kX3N1IDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwgKGFuZCBub2RlOiRsaHMsIG5vZGU6JHJocyksIFt7DQorICByZXR1cm4gTi0+aGFzT25lVXNlKCk7DQorfV0+Ow0KKy8vIEFuICdzcmwnIG5vZGUgd2l0aCBhIHNpbmdsZSB1c2UuDQorZGVmIHNybF9zdSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksIChzcmwgbm9kZTokbGhzLCBub2RlOiRyaHMpLCBbew0KKyAgcmV0dXJuIE4tPmhhc09uZVVzZSgpOw0KK31dPjsNCisvLyBBbiAndHJ1bmMnIG5vZGUgd2l0aCBhIHNpbmdsZSB1c2UuDQorZGVmIHRydW5jX3N1IDogUGF0RnJhZzwob3BzIG5vZGU6JHNyYyksICh0cnVuYyBub2RlOiRzcmMpLCBbew0KKyAgcmV0dXJuIE4tPmhhc09uZVVzZSgpOw0KK31dPjsNCisNCisvLyBUcmVhdCBhbiAnb3InIG5vZGUgaXMgYXMgYW4gJ2FkZCcgaWYgdGhlIG9yJ2VkIGJpdHMgYXJlIGtub3duIHRvIGJlIHplcm8uDQorZGVmIG9yX2lzX2FkZCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksIChvciBub2RlOiRsaHMsIG5vZGU6JHJocyksW3sNCisgIGlmIChDb25zdGFudFNETm9kZSAqQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTi0+Z2V0T3BlcmFuZCgxKSkpDQorICAgIHJldHVybiBDdXJEQUctPk1hc2tlZFZhbHVlSXNaZXJvKE4tPmdldE9wZXJhbmQoMCksIENOLT5nZXRBUEludFZhbHVlKCkpOw0KKw0KKyAgdW5zaWduZWQgQml0V2lkdGggPSBOLT5nZXRWYWx1ZVR5cGUoMCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsNCisgIEFQSW50IE1hc2sgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKTsNCisgIEFQSW50IEtub3duWmVybzAsIEtub3duT25lMDsNCisgIEN1ckRBRy0+Q29tcHV0ZU1hc2tlZEJpdHMoTi0+Z2V0T3BlcmFuZCgwKSwgTWFzaywgS25vd25aZXJvMCwgS25vd25PbmUwLCAwKTsNCisgIEFQSW50IEtub3duWmVybzEsIEtub3duT25lMTsNCisgIEN1ckRBRy0+Q29tcHV0ZU1hc2tlZEJpdHMoTi0+Z2V0T3BlcmFuZCgxKSwgTWFzaywgS25vd25aZXJvMSwgS25vd25PbmUxLCAwKTsNCisgIHJldHVybiAofktub3duWmVybzAgJiB+S25vd25aZXJvMSkgPT0gMDsNCit9XT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBJbnN0cnVjdGlvbiBsaXN0Li4uDQorLy8NCisNCisvLyBBREpDQUxMU1RBQ0tET1dOL1VQIGltcGxpY2l0bHkgdXNlL2RlZiBFU1AgYmVjYXVzZSB0aGV5IG1heSBiZSBleHBhbmRlZCBpbnRvDQorLy8gYSBzdGFjayBhZGp1c3RtZW50IGFuZCB0aGUgY29kZWdlbiBtdXN0IGtub3cgdGhhdCB0aGV5IG1heSBtb2RpZnkgdGhlIHN0YWNrDQorLy8gcG9pbnRlciBiZWZvcmUgcHJvbG9nLWVwaWxvZyByZXdyaXRpbmcgb2NjdXJzLg0KKy8vIFBlc3NpbWlzdGljYWxseSBhc3N1bWUgQURKQ0FMTFNUQUNLRE9XTiAvIEFESkNBTExTVEFDS1VQIHdpbGwgYmVjb21lDQorLy8gc3ViIC8gYWRkIHdoaWNoIGNhbiBjbG9iYmVyIEVGTEFHUy4NCitsZXQgRGVmcyA9IFtFU1AsIEVGTEFHU10sIFVzZXMgPSBbRVNQXSBpbiB7DQorZGVmIEFESkNBTExTVEFDS0RPV04zMiA6IEk8MCwgUHNldWRvLCAob3V0cyksIChpbnMgaTMyaW1tOiRhbXQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIjQURKQ0FMTFNUQUNLRE9XTiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhYODZjYWxsc2VxX3N0YXJ0IHRpbW06JGFtdCldPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KK2RlZiBBREpDQUxMU1RBQ0tVUDMyICAgOiBJPDAsIFBzZXVkbywgKG91dHMpLCAoaW5zIGkzMmltbTokYW10MSwgaTMyaW1tOiRhbXQyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0FESkNBTExTVEFDS1VQIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFg4NmNhbGxzZXFfZW5kIHRpbW06JGFtdDEsIHRpbW06JGFtdDIpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCit9DQorDQorLy8geDg2LTY0IHZhX3N0YXJ0IGxvd2VyaW5nIG1hZ2ljLg0KK2xldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxIGluIHsNCitkZWYgVkFTVEFSVF9TQVZFX1hNTV9SRUdTIDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4OiRhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NGltbTokcmVnc2F2ZWZpLCBpNjRpbW06JG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNWQVNUQVJUX1NBVkVfWE1NX1JFR1MgJGFsLCAkcmVnc2F2ZWZpLCAkb2Zmc2V0IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFg4NnZhc3RhcnRfc2F2ZV94bW1fcmVncyBHUjg6JGFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokcmVnc2F2ZWZpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokb2Zmc2V0KV0+Ow0KKw0KKy8vIER5bmFtaWMgc3RhY2sgYWxsb2NhdGlvbiB5aWVsZHMgX2FsbG9jYSBjYWxsIGZvciBDeWd3aW4vTWluZ3cgdGFyZ2V0cy4gIENhbGxzDQorLy8gdG8gX2FsbG9jYSBpcyBuZWVkZWQgdG8gcHJvYmUgdGhlIHN0YWNrIHdoZW4gYWxsb2NhdGluZyBtb3JlIHRoYW4gNGsgYnl0ZXMgaW4NCisvLyBvbmUgZ28uIFRvdWNoaW5nIHRoZSBzdGFjayBhdCA0SyBpbmNyZW1lbnRzIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUNCisvLyBndWFyZCBwYWdlcyB1c2VkIGJ5IHRoZSBPUyB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VyIGFyZSBhbGxvY2F0ZWQgaW4gY29ycmVjdA0KKy8vIHNlcXVlbmNlLg0KKy8vIFRoZSBtYWluIHBvaW50IG9mIGhhdmluZyBzZXBhcmF0ZSBpbnN0cnVjdGlvbiBhcmUgZXh0cmEgdW5tb2RlbGxlZCBlZmZlY3RzDQorLy8gKGNvbXBhcmVkIHRvIG9yZGluYXJ5IGNhbGxzKSBsaWtlIHN0YWNrIHBvaW50ZXIgY2hhbmdlLg0KKw0KK2RlZiBNSU5HV19BTExPQ0EgOiBJPDAsIFBzZXVkbywgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICAgICAiIyBkeW5hbWljIHN0YWNrIGFsbG9jYXRpb24iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoWDg2TWluZ3dBbGxvY2EpXT47DQorfQ0KKw0KKy8vIE5vcA0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorICBkZWYgTk9PUCA6IEk8MHg5MCwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAibm9wIiwgW10+Ow0KKyAgZGVmIE5PT1BXIDogSTwweDFmLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokemVybyksDQorICAgICAgICAgICAgICAgICJub3B7d31cdCR6ZXJvIiwgW10+LCBUQiwgT3BTaXplOw0KKyAgZGVmIE5PT1BMIDogSTwweDFmLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokemVybyksDQorICAgICAgICAgICAgICAgICJub3B7bH1cdCR6ZXJvIiwgW10+LCBUQjsNCit9DQorDQorLy8gVHJhcA0KK2RlZiBJTlRPIDogSTwweGNlLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJpbnRvIiwgW10+Ow0KK2RlZiBJTlQzIDogSTwweGNjLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJpbnQzIiwgW10+Ow0KKy8vIEZJWE1FOiBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0ICJpbnQgJDMiIG1hdGNoZXMgaW50Mw0KK2RlZiBJTlQgOiBJaTg8MHhjZCwgUmF3RnJtLCAob3V0cyksIChpbnMgaThpbW06JHRyYXApLCAiaW50XHQkdHJhcCIsIFtdPjsNCitkZWYgSVJFVDE2IDogSTwweGNmLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJpcmV0e3d9IiwgW10+LCBPcFNpemU7DQorZGVmIElSRVQzMiA6IEk8MHhjZiwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiaXJldHtsfSIsIFtdPjsNCisNCisvLyBQSUMgYmFzZSBjb25zdHJ1Y3Rpb24uICBUaGlzIGV4cGFuZHMgdG8gY29kZSB0aGF0IGxvb2tzIGxpa2UgdGhpczoNCisvLyAgICAgY2FsbCAgJG5leHRfaW5zdA0KKy8vICAgICBwb3BsICVkZXN0cmVnIg0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSwgaXNOb3REdXBsaWNhYmxlID0gMSwgVXNlcyA9IFtFU1BdIGluDQorICBkZWYgTU9WUEMzMnIgOiBJaTMyPDB4RTgsIFBzZXVkbywgKG91dHMgR1IzMjokcmVnKSwgKGlucyBpMzJpbW06JGxhYmVsKSwNCisgICAgICAgICAgICAgICAgICAgICAgIiIsIFtdPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBDb250cm9sIEZsb3cgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorDQorLy8gUmV0dXJuIGluc3RydWN0aW9ucy4NCitsZXQgaXNUZXJtaW5hdG9yID0gMSwgaXNSZXR1cm4gPSAxLCBpc0JhcnJpZXIgPSAxLA0KKyAgICBoYXNDdHJsRGVwID0gMSwgRlBGb3JtID0gU3BlY2lhbEZQIGluIHsNCisgIGRlZiBSRVQgICAgOiBJICAgPDB4QzMsIFJhd0ZybSwgKG91dHMpLCAoaW5zIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAicmV0IiwNCisgICAgICAgICAgICAgICAgICAgIFsoWDg2cmV0ZmxhZyAwKV0+Ow0KKyAgZGVmIFJFVEkgICA6IElpMTY8MHhDMiwgUmF3RnJtLCAob3V0cyksIChpbnMgaTE2aW1tOiRhbXQsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAicmV0XHQkYW10IiwNCisgICAgICAgICAgICAgICAgICAgIFsoWDg2cmV0ZmxhZyB0aW1tOiRhbXQpXT47DQorICBkZWYgTFJFVCAgIDogSSAgIDwweENCLCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgICAibHJldCIsIFtdPjsNCisgIGRlZiBMUkVUSSAgOiBJaTE2PDB4Q0EsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGkxNmltbTokYW10KSwNCisgICAgICAgICAgICAgICAgICAgICJscmV0XHQkYW10IiwgW10+Ow0KK30NCisNCisvLyBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzLg0KK2xldCBpc0JhcnJpZXIgPSAxLCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEgaW4gew0KKyAgZGVmIEpNUF80IDogSWkzMlBDUmVsPDB4RTksIFJhd0ZybSwgKG91dHMpLCAoaW5zIGJydGFyZ2V0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJqbXBcdCRkc3QiLCBbKGJyIGJiOiRkc3QpXT47DQorICBkZWYgSk1QXzEgOiBJaThQQ1JlbDwweEVCLCBSYXdGcm0sIChvdXRzKSwgKGlucyBicnRhcmdldDg6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAiam1wXHQkZHN0IiwgW10+Ow0KK30NCisNCisvLyBDb25kaXRpb25hbCBCcmFuY2hlcy4NCitsZXQgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBVc2VzID0gW0VGTEFHU10gaW4gew0KKyAgbXVsdGljbGFzcyBJQ0JyPGJpdHM8OD4gb3BjMSwgYml0czw4PiBvcGM0LCBzdHJpbmcgYXNtLCBQYXRGcmFnIENvbmQ+IHsNCisgICAgZGVmIF8xIDogSWk4UENSZWwgPG9wYzEsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGJydGFyZ2V0ODokZHN0KSwgYXNtLCBbXT47DQorICAgIGRlZiBfNCA6IElpMzJQQ1JlbDxvcGM0LCBSYXdGcm0sIChvdXRzKSwgKGlucyBicnRhcmdldDokZHN0KSwgYXNtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhYODZicmNvbmQgYmI6JGRzdCwgQ29uZCwgRUZMQUdTKV0+LCBUQjsNCisgIH0NCit9DQorDQorZGVmbSBKTyAgOiBJQ0JyPDB4NzAsIDB4ODAsICJqb1x0JGRzdCIgLCBYODZfQ09ORF9PPjsNCitkZWZtIEpOTyA6IElDQnI8MHg3MSwgMHg4MSwgImpub1x0JGRzdCIgLCBYODZfQ09ORF9OTz47DQorZGVmbSBKQiAgOiBJQ0JyPDB4NzIsIDB4ODIsICJqYlx0JGRzdCIgLCBYODZfQ09ORF9CPjsNCitkZWZtIEpBRSA6IElDQnI8MHg3MywgMHg4MywgImphZVx0JGRzdCIsIFg4Nl9DT05EX0FFPjsNCitkZWZtIEpFICA6IElDQnI8MHg3NCwgMHg4NCwgImplXHQkZHN0IiAsIFg4Nl9DT05EX0U+Ow0KK2RlZm0gSk5FIDogSUNCcjwweDc1LCAweDg1LCAiam5lXHQkZHN0IiwgWDg2X0NPTkRfTkU+Ow0KK2RlZm0gSkJFIDogSUNCcjwweDc2LCAweDg2LCAiamJlXHQkZHN0IiwgWDg2X0NPTkRfQkU+Ow0KK2RlZm0gSkEgIDogSUNCcjwweDc3LCAweDg3LCAiamFcdCRkc3QiICwgWDg2X0NPTkRfQT47DQorZGVmbSBKUyAgOiBJQ0JyPDB4NzgsIDB4ODgsICJqc1x0JGRzdCIgLCBYODZfQ09ORF9TPjsNCitkZWZtIEpOUyA6IElDQnI8MHg3OSwgMHg4OSwgImpuc1x0JGRzdCIsIFg4Nl9DT05EX05TPjsNCitkZWZtIEpQICA6IElDQnI8MHg3QSwgMHg4QSwgImpwXHQkZHN0IiAsIFg4Nl9DT05EX1A+Ow0KK2RlZm0gSk5QIDogSUNCcjwweDdCLCAweDhCLCAiam5wXHQkZHN0IiwgWDg2X0NPTkRfTlA+Ow0KK2RlZm0gSkwgIDogSUNCcjwweDdDLCAweDhDLCAiamxcdCRkc3QiICwgWDg2X0NPTkRfTD47DQorZGVmbSBKR0UgOiBJQ0JyPDB4N0QsIDB4OEQsICJqZ2VcdCRkc3QiLCBYODZfQ09ORF9HRT47DQorZGVmbSBKTEUgOiBJQ0JyPDB4N0UsIDB4OEUsICJqbGVcdCRkc3QiLCBYODZfQ09ORF9MRT47DQorZGVmbSBKRyAgOiBJQ0JyPDB4N0YsIDB4OEYsICJqZ1x0JGRzdCIgLCBYODZfQ09ORF9HPjsNCisNCisvLyBGSVhNRTogV2hhdCBhYm91dCB0aGUgQ1gvUkNYIHZlcnNpb25zIG9mIHRoaXMgaW5zdHJ1Y3Rpb24/DQorbGV0IFVzZXMgPSBbRUNYXSwgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxIGluDQorICBkZWYgSkNYWjggOiBJaThQQ1JlbDwweEUzLCBSYXdGcm0sIChvdXRzKSwgKGlucyBicnRhcmdldDg6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAiamN4elx0JGRzdCIsIFtdPjsNCisNCisNCisvLyBJbmRpcmVjdCBicmFuY2hlcw0KK2xldCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGlzQmFycmllciA9IDEsIGlzSW5kaXJlY3RCcmFuY2ggPSAxIGluIHsNCisgIGRlZiBKTVAzMnIgICAgIDogSTwweEZGLCBNUk00ciwgKG91dHMpLCAoaW5zIEdSMzI6JGRzdCksICJqbXB7bH1cdHsqfSRkc3QiLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoYnJpbmQgR1IzMjokZHN0KV0+LCBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCisgIGRlZiBKTVAzMm0gICAgIDogSTwweEZGLCBNUk00bSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwgImptcHtsfVx0eyp9JGRzdCIsDQorICAgICAgICAgICAgICAgICAgICAgWyhicmluZCAobG9hZGkzMiBhZGRyOiRkc3QpKV0+LCBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCisgICAgICAgICAgICAgICAgICAgICANCisgIGRlZiBGQVJKTVAxNmkgIDogSXNlZzE2PDB4RUEsIFJhd0ZybSwgKG91dHMpLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTE2aW1tOiRzZWcsIGkxNmltbTokb2ZmKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsam1we3d9XHQkc2VnLCAkb2ZmIiwgW10+LCBPcFNpemU7DQorICBkZWYgRkFSSk1QMzJpICA6IElzZWczMjwweEVBLCBSYXdGcm0sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTE2aW1tOiRzZWcsIGkzMmltbTokb2ZmKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsam1we2x9XHQkc2VnLCAkb2ZmIiwgW10+OyAgICAgICAgICAgICAgICAgICAgIA0KKw0KKyAgZGVmIEZBUkpNUDE2bSAgOiBJPDB4RkYsIE1STTVtLCAob3V0cyksIChpbnMgb3BhcXVlMzJtZW06JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgICJsam1we3d9XHR7Kn0kZHN0IiwgW10+LCBPcFNpemU7DQorICBkZWYgRkFSSk1QMzJtICA6IEk8MHhGRiwgTVJNNW0sIChvdXRzKSwgKGlucyBvcGFxdWU0OG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAibGptcHtsfVx0eyp9JGRzdCIsIFtdPjsNCit9DQorDQorDQorLy8gTG9vcCBpbnN0cnVjdGlvbnMNCisNCitkZWYgTE9PUCAgIDogSTwweEUyLCBSYXdGcm0sIChvdXRzKSwgKGlucyBicnRhcmdldDg6JGRzdCksICJsb29wXHQkZHN0IiwgW10+Ow0KK2RlZiBMT09QRSAgOiBJPDB4RTEsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGJydGFyZ2V0ODokZHN0KSwgImxvb3BlXHQkZHN0IiwgW10+Ow0KK2RlZiBMT09QTkUgOiBJPDB4RTAsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGJydGFyZ2V0ODokZHN0KSwgImxvb3BuZVx0JGRzdCIsIFtdPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBDYWxsIEluc3RydWN0aW9ucy4uLg0KKy8vDQorbGV0IGlzQ2FsbCA9IDEgaW4NCisgIC8vIEFsbCBjYWxscyBjbG9iYmVyIHRoZSBub24tY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4gRVNQIGlzIG1hcmtlZCBhcw0KKyAgLy8gYSB1c2UgdG8gcHJldmVudCBzdGFjay1wb2ludGVyIGFzc2lnbm1lbnRzIHRoYXQgYXBwZWFyIGltbWVkaWF0ZWx5DQorICAvLyBiZWZvcmUgY2FsbHMgZnJvbSBwb3RlbnRpYWxseSBhcHBlYXJpbmcgZGVhZC4gVXNlcyBmb3IgYXJndW1lbnQNCisgIC8vIHJlZ2lzdGVycyBhcmUgYWRkZWQgbWFudWFsbHkuDQorICBsZXQgRGVmcyA9IFtFQVgsIEVDWCwgRURYLCBGUDAsIEZQMSwgRlAyLCBGUDMsIEZQNCwgRlA1LCBGUDYsIFNUMCwNCisgICAgICAgICAgICAgIE1NMCwgTU0xLCBNTTIsIE1NMywgTU00LCBNTTUsIE1NNiwgTU03LA0KKyAgICAgICAgICAgICAgWE1NMCwgWE1NMSwgWE1NMiwgWE1NMywgWE1NNCwgWE1NNSwgWE1NNiwgWE1NNywNCisgICAgICAgICAgICAgIFhNTTgsIFhNTTksIFhNTTEwLCBYTU0xMSwgWE1NMTIsIFhNTTEzLCBYTU0xNCwgWE1NMTUsIEVGTEFHU10sDQorICAgICAgVXNlcyA9IFtFU1BdIGluIHsNCisgICAgZGVmIENBTExwY3JlbDMyIDogSWkzMlBDUmVsPDB4RTgsIFJhd0ZybSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMyaW1tX3BjcmVsOiRkc3QsdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbFx0JGRzdCIsIFtdPjsNCisgICAgZGVmIENBTEwzMnIgICAgIDogSTwweEZGLCBNUk0yciwgKG91dHMpLCAoaW5zIEdSMzI6JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbFx0eyp9JGRzdCIsIFsoWDg2Y2FsbCBHUjMyOiRkc3QpXT47DQorICAgIGRlZiBDQUxMMzJtICAgICA6IEk8MHhGRiwgTVJNMm0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbFx0eyp9JGRzdCIsIFsoWDg2Y2FsbCAobG9hZGkzMiBhZGRyOiRkc3QpKV0+Ow0KKyAgDQorICAgIGRlZiBGQVJDQUxMMTZpICA6IElzZWcxNjwweDlBLCBSYXdGcm0sIChvdXRzKSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGkxNmltbTokc2VnLCBpMTZpbW06JG9mZiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGNhbGx7d31cdCRzZWcsICRvZmYiLCBbXT4sIE9wU2l6ZTsNCisgICAgZGVmIEZBUkNBTEwzMmkgIDogSXNlZzMyPDB4OUEsIFJhd0ZybSwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBpMTZpbW06JHNlZywgaTMyaW1tOiRvZmYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxjYWxse2x9XHQkc2VnLCAkb2ZmIiwgW10+Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgIGRlZiBGQVJDQUxMMTZtICA6IEk8MHhGRiwgTVJNM20sIChvdXRzKSwgKGlucyBvcGFxdWUzMm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAibGNhbGx7d31cdHsqfSRkc3QiLCBbXT4sIE9wU2l6ZTsNCisgICAgZGVmIEZBUkNBTEwzMm0gIDogSTwweEZGLCBNUk0zbSwgKG91dHMpLCAoaW5zIG9wYXF1ZTQ4bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJsY2FsbHtsfVx0eyp9JGRzdCIsIFtdPjsNCisNCisgICAgLy8gY2FsbHcgZm9yIDE2IGJpdCBjb2RlIGZvciB0aGUgYXNzZW1ibGVyLg0KKyAgICBsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbg0KKyAgICAgIGRlZiBDQUxMcGNyZWwxNiA6IElpMTZQQ1JlbDwweEU4LCBSYXdGcm0sDQorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTE2aW1tX3BjcmVsOiRkc3QsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAgICAiY2FsbHdcdCRkc3QiLCBbXT4sIE9wU2l6ZTsNCisgIH0NCisNCisvLyBDb25zdHJ1Y3RpbmcgYSBzdGFjayBmcmFtZS4NCisNCitkZWYgRU5URVIgOiBJPDB4QzgsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGkxNmltbTokbGVuLCBpOGltbTokbHZsKSwNCisgICAgICAgICAgICAgICJlbnRlclx0JGxlbiwgJGx2bCIsIFtdPjsNCisNCisvLyBUYWlsIGNhbGwgc3R1ZmYuDQorDQorbGV0IGlzQ2FsbCA9IDEsIGlzVGVybWluYXRvciA9IDEsIGlzUmV0dXJuID0gMSwgaXNCYXJyaWVyID0gMSwNCisgICAgaXNDb2RlR2VuT25seSA9IDEgaW4NCisgIGxldCBEZWZzID0gW0VBWCwgRUNYLCBFRFgsIEZQMCwgRlAxLCBGUDIsIEZQMywgRlA0LCBGUDUsIEZQNiwgU1QwLA0KKyAgICAgICAgICAgICAgTU0wLCBNTTEsIE1NMiwgTU0zLCBNTTQsIE1NNSwgTU02LCBNTTcsDQorICAgICAgICAgICAgICBYTU0wLCBYTU0xLCBYTU0yLCBYTU0zLCBYTU00LCBYTU01LCBYTU02LCBYTU03LA0KKyAgICAgICAgICAgICAgWE1NOCwgWE1NOSwgWE1NMTAsIFhNTTExLCBYTU0xMiwgWE1NMTMsIFhNTTE0LCBYTU0xNSwgRUZMQUdTXSwNCisgICAgICBVc2VzID0gW0VTUF0gaW4gew0KKyAgZGVmIFRDUkVUVVJOZGkgOiBJPDAsIFBzZXVkbywgKG91dHMpLCANCisgICAgICAgICAgICAgICAgICAgICAoaW5zIGkzMmltbV9wY3JlbDokZHN0LCBpMzJpbW06JG9mZnNldCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgIiNUQ19SRVRVUk4gJGRzdCAkb2Zmc2V0IiwgW10+Ow0KKyAgZGVmIFRDUkVUVVJOcmkgOiBJPDAsIFBzZXVkbywgKG91dHMpLCANCisgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzJfVEM6JGRzdCwgaTMyaW1tOiRvZmZzZXQsIHZhcmlhYmxlX29wcyksDQorICAgICAgICAgICAgICAgICAgICAgIiNUQ19SRVRVUk4gJGRzdCAkb2Zmc2V0IiwgW10+Ow0KKyAgbGV0IG1heUxvYWQgPSAxIGluDQorICBkZWYgVENSRVRVUk5taSA6IEk8MCwgUHNldWRvLCAob3V0cyksIA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgaTMybWVtX1RDOiRkc3QsIGkzMmltbTokb2Zmc2V0LCB2YXJpYWJsZV9vcHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICIjVENfUkVUVVJOICRkc3QgJG9mZnNldCIsIFtdPjsNCisNCisgIC8vIEZJWE1FOiBUaGUgc2hvdWxkIGJlIHBzZXVkbyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgbG93ZXJlZCB3aGVuIGdvaW5nIHRvDQorICAvLyBtY2luc3QuDQorICBkZWYgVEFJTEpNUGQgOiBJaTMyUENSZWw8MHhFOSwgUmF3RnJtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBpMzJpbW1fcGNyZWw6JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICJqbXBcdCRkc3QgICMgVEFJTENBTEwiLA0KKyAgICAgICAgICAgICAgICAgW10+Ow0KKyAgZGVmIFRBSUxKTVByIDogSTwweEZGLCBNUk00ciwgKG91dHMpLCAoaW5zIEdSMzJfVEM6JGRzdCwgdmFyaWFibGVfb3BzKSwgDQorICAgICAgICAgICAgICAgICAgICIiLCBbXT47ICAvLyBGSVhNRTogUmVtb3ZlIGVuY29kaW5nIHdoZW4gSklUIGlzIGRlYWQuDQorICBsZXQgbWF5TG9hZCA9IDEgaW4NCisgIGRlZiBUQUlMSk1QbSA6IEk8MHhGRiwgTVJNNG0sIChvdXRzKSwgKGlucyBpMzJtZW1fVEM6JGRzdCwgdmFyaWFibGVfb3BzKSwNCisgICAgICAgICAgICAgICAgICAgImptcHtsfVx0eyp9JGRzdCAgIyBUQUlMQ0FMTCIsIFtdPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgTWlzY2VsbGFuZW91cyBJbnN0cnVjdGlvbnMuLi4NCisvLw0KK2xldCBEZWZzID0gW0VCUCwgRVNQXSwgVXNlcyA9IFtFQlAsIEVTUF0sIG1heUxvYWQgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzPTEgaW4NCitkZWYgTEVBVkUgICAgOiBJPDB4QzksIFJhd0ZybSwNCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyksICJsZWF2ZSIsIFtdPiwgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorDQorZGVmIFBPUENOVDE2cnIgOiBJPDB4QjgsIE1STVNyY1JlZywgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAicG9wY250e3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgT3BTaXplLCBYUzsNCitsZXQgbWF5TG9hZCA9IDEgaW4NCitkZWYgUE9QQ05UMTZybSA6IEk8MHhCOCwgTVJNU3JjTWVtLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIGkxNm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgInBvcGNudHt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIE9wU2l6ZSwgWFM7DQorZGVmIFBPUENOVDMycnIgOiBJPDB4QjgsIE1STVNyY1JlZywgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAicG9wY250e2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgWFM7DQorbGV0IG1heUxvYWQgPSAxIGluDQorZGVmIFBPUENOVDMycm0gOiBJPDB4QjgsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBpMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJwb3BjbnR7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBYUzsNCisNCitsZXQgRGVmcyA9IFtFU1BdLCBVc2VzID0gW0VTUF0sIG5ldmVySGFzU2lkZUVmZmVjdHM9MSBpbiB7DQorbGV0IG1heUxvYWQgPSAxIGluIHsNCitkZWYgUE9QMTZyICA6IEk8MHg1OCwgQWRkUmVnRnJtLCAob3V0cyBHUjE2OiRyZWcpLCAoaW5zKSwgInBvcHt3fVx0JHJlZyIsIFtdPiwNCisgIE9wU2l6ZTsNCitkZWYgUE9QMzJyICA6IEk8MHg1OCwgQWRkUmVnRnJtLCAob3V0cyBHUjMyOiRyZWcpLCAoaW5zKSwgInBvcHtsfVx0JHJlZyIsIFtdPjsNCitkZWYgUE9QMTZybXI6IEk8MHg4RiwgTVJNMHIsIChvdXRzIEdSMTY6JHJlZyksIChpbnMpLCAicG9we3d9XHQkcmVnIiwgW10+LA0KKyAgT3BTaXplOw0KK2RlZiBQT1AxNnJtbTogSTwweDhGLCBNUk0wbSwgKG91dHMgaTE2bWVtOiRkc3QpLCAoaW5zKSwgInBvcHt3fVx0JGRzdCIsIFtdPiwNCisgIE9wU2l6ZTsNCitkZWYgUE9QMzJybXI6IEk8MHg4RiwgTVJNMHIsIChvdXRzIEdSMzI6JHJlZyksIChpbnMpLCAicG9we2x9XHQkcmVnIiwgW10+Ow0KK2RlZiBQT1AzMnJtbTogSTwweDhGLCBNUk0wbSwgKG91dHMgaTMybWVtOiRkc3QpLCAoaW5zKSwgInBvcHtsfVx0JGRzdCIsIFtdPjsNCit9DQorDQorbGV0IG1heVN0b3JlID0gMSBpbiB7DQorZGVmIFBVU0gxNnIgIDogSTwweDUwLCBBZGRSZWdGcm0sIChvdXRzKSwgKGlucyBHUjE2OiRyZWcpLCAicHVzaHt3fVx0JHJlZyIsW10+LA0KKyAgT3BTaXplOw0KK2RlZiBQVVNIMzJyICA6IEk8MHg1MCwgQWRkUmVnRnJtLCAob3V0cyksIChpbnMgR1IzMjokcmVnKSwgInB1c2h7bH1cdCRyZWciLFtdPjsNCitkZWYgUFVTSDE2cm1yOiBJPDB4RkYsIE1STTZyLCAob3V0cyksIChpbnMgR1IxNjokcmVnKSwgInB1c2h7d31cdCRyZWciLFtdPiwNCisgIE9wU2l6ZTsNCitkZWYgUFVTSDE2cm1tOiBJPDB4RkYsIE1STTZtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMpLCAicHVzaHt3fVx0JHNyYyIsW10+LA0KKyAgT3BTaXplOw0KK2RlZiBQVVNIMzJybXI6IEk8MHhGRiwgTVJNNnIsIChvdXRzKSwgKGlucyBHUjMyOiRyZWcpLCAicHVzaHtsfVx0JHJlZyIsW10+Ow0KK2RlZiBQVVNIMzJybW06IEk8MHhGRiwgTVJNNm0sIChvdXRzKSwgKGlucyBpMzJtZW06JHNyYyksICJwdXNoe2x9XHQkc3JjIixbXT47DQorfQ0KK30NCisNCitsZXQgRGVmcyA9IFtFU1BdLCBVc2VzID0gW0VTUF0sIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBtYXlTdG9yZSA9IDEgaW4gew0KK2RlZiBQVVNIaTggICA6IElpODwweDZhLCBSYXdGcm0sIChvdXRzKSwgKGlucyBpMzJpOGltbTokaW1tKSwgDQorICAgICAgICAgICAgICAgICAgICAgICJwdXNoe2x9XHQkaW1tIiwgW10+Ow0KK2RlZiBQVVNIaTE2ICA6IElpMTY8MHg2OCwgUmF3RnJtLCAob3V0cyksIChpbnMgaTE2aW1tOiRpbW0pLCANCisgICAgICAgICAgICAgICAgICAgICAgInB1c2h7d31cdCRpbW0iLCBbXT4sIE9wU2l6ZTsNCitkZWYgUFVTSGkzMiAgOiBJaTMyPDB4NjgsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGkzMmltbTokaW1tKSwgDQorICAgICAgICAgICAgICAgICAgICAgICJwdXNoe2x9XHQkaW1tIiwgW10+Ow0KK30NCisNCitsZXQgRGVmcyA9IFtFU1AsIEVGTEFHU10sIFVzZXMgPSBbRVNQXSwgbWF5TG9hZCA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHM9MSBpbiB7DQorZGVmIFBPUEYxNiAgIDogSTwweDlELCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJwb3Bme3d9IiwgW10+LCBPcFNpemU7DQorZGVmIFBPUEYzMiAgIDogSTwweDlELCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJwb3Bme2x8ZH0iLCBbXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorfQ0KK2xldCBEZWZzID0gW0VTUF0sIFVzZXMgPSBbRVNQLCBFRkxBR1NdLCBtYXlTdG9yZSA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHM9MSBpbiB7DQorZGVmIFBVU0hGMTYgIDogSTwweDlDLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJwdXNoZnt3fSIsIFtdPiwgT3BTaXplOw0KK2RlZiBQVVNIRjMyICA6IEk8MHg5QywgUmF3RnJtLCAob3V0cyksIChpbnMpLCAicHVzaGZ7bHxkfSIsIFtdPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCit9DQorDQorbGV0IERlZnMgPSBbRURJLCBFU0ksIEVCUCwgRUJYLCBFRFgsIEVDWCwgRUFYLCBFU1BdLCBVc2VzID0gW0VTUF0sDQorICAgIG1heUxvYWQ9MSwgbmV2ZXJIYXNTaWRlRWZmZWN0cz0xIGluIHsNCitkZWYgUE9QQTMyICAgOiBJPDB4NjEsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInBvcGF7bH0iLCBbXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorfQ0KK2xldCBEZWZzID0gW0VTUF0sIFVzZXMgPSBbRURJLCBFU0ksIEVCUCwgRUJYLCBFRFgsIEVDWCwgRUFYLCBFU1BdLA0KKyAgICBtYXlTdG9yZT0xLCBuZXZlckhhc1NpZGVFZmZlY3RzPTEgaW4gew0KK2RlZiBQVVNIQTMyICA6IEk8MHg2MCwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAicHVzaGF7bH0iLCBbXT4sDQorICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorfQ0KKw0KK2xldCBVc2VzID0gW0VGTEFHU10sIENvbnN0cmFpbnRzID0gIiRzcmMgPSAkZHN0IiBpbiAgICAgLy8gR1IzMiA9IGJzd2FwIEdSMzINCisgIGRlZiBCU1dBUDMyciA6IEk8MHhDOCwgQWRkUmVnRnJtLA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJic3dhcHtsfVx0JGRzdCIsIA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChic3dhcCBHUjMyOiRzcmMpKV0+LCBUQjsNCisNCisNCisvLyBCaXQgc2NhbiBpbnN0cnVjdGlvbnMuDQorbGV0IERlZnMgPSBbRUZMQUdTXSBpbiB7DQorZGVmIEJTRjE2cnIgIDogSTwweEJDLCBNUk1TcmNSZWcsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjKSwNCisgICAgICAgICAgICAgICAgICJic2Z7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2YnNmIEdSMTY6JHNyYykpXT4sIFRCLCBPcFNpemU7DQorZGVmIEJTRjE2cm0gIDogSTwweEJDLCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaTE2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImJzZnt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsIChYODZic2YgKGxvYWRpMTYgYWRkcjokc3JjKSkpXT4sIFRCLA0KKyAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBCU0YzMnJyICA6IEk8MHhCQywgTVJNU3JjUmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAiYnNme2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmJzZiBHUjMyOiRzcmMpKV0+LCBUQjsNCitkZWYgQlNGMzJybSAgOiBJPDB4QkMsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBpMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAiYnNme2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmJzZiAobG9hZGkzMiBhZGRyOiRzcmMpKSldPiwgVEI7DQorDQorZGVmIEJTUjE2cnIgIDogSTwweEJELCBNUk1TcmNSZWcsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjKSwNCisgICAgICAgICAgICAgICAgICJic3J7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2YnNyIEdSMTY6JHNyYykpXT4sIFRCLCBPcFNpemU7DQorZGVmIEJTUjE2cm0gIDogSTwweEJELCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaTE2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImJzcnt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsIChYODZic3IgKGxvYWRpMTYgYWRkcjokc3JjKSkpXT4sIFRCLA0KKyAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBCU1IzMnJyICA6IEk8MHhCRCwgTVJNU3JjUmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAiYnNye2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmJzciBHUjMyOiRzcmMpKV0+LCBUQjsNCitkZWYgQlNSMzJybSAgOiBJPDB4QkQsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBpMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAiYnNye2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmJzciAobG9hZGkzMiBhZGRyOiRzcmMpKSldPiwgVEI7DQorfSAvLyBEZWZzID0gW0VGTEFHU10NCisNCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4NCitkZWYgTEVBMTZyICAgOiBJPDB4OEQsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImxlYXt3fVx0eyRzcmN8JGRzdH0sIHskZHN0fCRzcmN9IiwgW10+LCBPcFNpemU7DQorbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCitkZWYgTEVBMzJyICAgOiBJPDB4OEQsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImxlYXtsfVx0eyRzcmN8JGRzdH0sIHskZHN0fCRzcmN9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgbGVhMzJhZGRyOiRzcmMpXT4sIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KKw0KK2xldCBEZWZzID0gW0VDWCxFREksRVNJXSwgVXNlcyA9IFtFQ1gsRURJLEVTSV0sIGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCitkZWYgUkVQX01PVlNCIDogSTwweEE0LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ7cmVwO21vdnNifHJlcCBtb3ZzYn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoWDg2cmVwX21vdnMgaTgpXT4sIFJFUDsNCitkZWYgUkVQX01PVlNXIDogSTwweEE1LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ7cmVwO21vdnN3fHJlcCBtb3Zzd30iLA0KKyAgICAgICAgICAgICAgICAgIFsoWDg2cmVwX21vdnMgaTE2KV0+LCBSRVAsIE9wU2l6ZTsNCitkZWYgUkVQX01PVlNEIDogSTwweEE1LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ7cmVwO21vdnNsfHJlcCBtb3ZzZH0iLA0KKyAgICAgICAgICAgICAgICAgIFsoWDg2cmVwX21vdnMgaTMyKV0+LCBSRVA7DQorfQ0KKw0KKy8vIFRoZXNlIHVzZXMgdGhlIERGIGZsYWcgaW4gdGhlIEVGTEFHUyByZWdpc3RlciB0byBpbmMgb3IgZGVjIEVESSBhbmQgRVNJDQorbGV0IERlZnMgPSBbRURJLEVTSV0sIFVzZXMgPSBbRURJLEVTSSxFRkxBR1NdIGluIHsNCitkZWYgTU9WU0IgOiBJPDB4QTQsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInttb3ZzYn0iLCBbXT47DQorZGVmIE1PVlNXIDogSTwweEE1LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ7bW92c3d9IiwgW10+LCBPcFNpemU7DQorZGVmIE1PVlNEIDogSTwweEE1LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ7bW92c2x8bW92c2R9IiwgW10+Ow0KK30NCisNCitsZXQgRGVmcyA9IFtFQ1gsRURJXSwgVXNlcyA9IFtBTCxFQ1gsRURJXSwgaXNDb2RlR2VuT25seSA9IDEgaW4NCitkZWYgUkVQX1NUT1NCIDogSTwweEFBLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ7cmVwO3N0b3NifHJlcCBzdG9zYn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoWDg2cmVwX3N0b3MgaTgpXT4sIFJFUDsNCitsZXQgRGVmcyA9IFtFQ1gsRURJXSwgVXNlcyA9IFtBWCxFQ1gsRURJXSwgaXNDb2RlR2VuT25seSA9IDEgaW4NCitkZWYgUkVQX1NUT1NXIDogSTwweEFCLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ7cmVwO3N0b3N3fHJlcCBzdG9zd30iLA0KKyAgICAgICAgICAgICAgICAgIFsoWDg2cmVwX3N0b3MgaTE2KV0+LCBSRVAsIE9wU2l6ZTsNCitsZXQgRGVmcyA9IFtFQ1gsRURJXSwgVXNlcyA9IFtFQVgsRUNYLEVESV0sIGlzQ29kZUdlbk9ubHkgPSAxIGluDQorZGVmIFJFUF9TVE9TRCA6IEk8MHhBQiwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAie3JlcDtzdG9zbHxyZXAgc3Rvc2R9IiwNCisgICAgICAgICAgICAgICAgICBbKFg4NnJlcF9zdG9zIGkzMildPiwgUkVQOw0KKw0KKy8vIFRoZXNlIHVzZXMgdGhlIERGIGZsYWcgaW4gdGhlIEVGTEFHUyByZWdpc3RlciB0byBpbmMgb3IgZGVjIEVESSBhbmQgRVNJDQorbGV0IERlZnMgPSBbRURJXSwgVXNlcyA9IFtBTCxFREksRUZMQUdTXSBpbg0KK2RlZiBTVE9TQiA6IEk8MHhBQSwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAie3N0b3NifSIsIFtdPjsNCitsZXQgRGVmcyA9IFtFREldLCBVc2VzID0gW0FYLEVESSxFRkxBR1NdIGluDQorZGVmIFNUT1NXIDogSTwweEFCLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ7c3Rvc3d9IiwgW10+LCBPcFNpemU7DQorbGV0IERlZnMgPSBbRURJXSwgVXNlcyA9IFtFQVgsRURJLEVGTEFHU10gaW4NCitkZWYgU1RPU0QgOiBJPDB4QUIsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgIntzdG9zbHxzdG9zZH0iLCBbXT47DQorDQorZGVmIFNDQVM4IDogSTwweEFFLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJzY2Fze2J9IiwgW10+Ow0KK2RlZiBTQ0FTMTYgOiBJPDB4QUYsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInNjYXN7d30iLCBbXT4sIE9wU2l6ZTsNCitkZWYgU0NBUzMyIDogSTwweEFGLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJzY2Fze2x9IiwgW10+Ow0KKw0KK2RlZiBDTVBTOCA6IEk8MHhBNiwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiY21wc3tifSIsIFtdPjsNCitkZWYgQ01QUzE2IDogSTwweEE3LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJjbXBze3d9IiwgW10+LCBPcFNpemU7DQorZGVmIENNUFMzMiA6IEk8MHhBNywgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiY21wc3tsfSIsIFtdPjsNCisNCitsZXQgRGVmcyA9IFtSQVgsIFJEWF0gaW4NCitkZWYgUkRUU0MgOiBJPDB4MzEsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInJkdHNjIiwgWyhYODZyZHRzYyldPiwNCisgICAgICAgICAgICBUQjsNCisNCitsZXQgRGVmcyA9IFtSQVgsIFJDWCwgUkRYXSBpbg0KK2RlZiBSRFRTQ1AgOiBJPDB4MDEsIE1STV9GOSwgKG91dHMpLCAoaW5zKSwgInJkdHNjcCIsIFtdPiwgVEI7DQorDQorbGV0IGlzVGVybWluYXRvciA9IDEsIGlzQmFycmllciA9IDEsIGhhc0N0cmxEZXAgPSAxIGluIHsNCitkZWYgVFJBUCAgICA6IEk8MHgwQiwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAidWQyIiwgWyh0cmFwKV0+LCBUQjsNCit9DQorDQorZGVmIFNZU0NBTEwgIDogSTwweDA1LCBSYXdGcm0sDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMpLCAic3lzY2FsbCIsIFtdPiwgVEI7DQorZGVmIFNZU1JFVCAgIDogSTwweDA3LCBSYXdGcm0sDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMpLCAic3lzcmV0IiwgW10+LCBUQjsNCitkZWYgU1lTRU5URVIgOiBJPDB4MzQsIFJhd0ZybSwNCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyksICJzeXNlbnRlciIsIFtdPiwgVEI7DQorZGVmIFNZU0VYSVQgIDogSTwweDM1LCBSYXdGcm0sDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMpLCAic3lzZXhpdCIsIFtdPiwgVEIsIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KKw0KK2RlZiBXQUlUIDogSTwweDlCLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ3YWl0IiwgW10+Ow0KKw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIElucHV0L091dHB1dCBJbnN0cnVjdGlvbnMuLi4NCisvLw0KK2xldCBEZWZzID0gW0FMXSwgVXNlcyA9IFtEWF0gaW4NCitkZWYgSU44cnIgIDogSTwweEVDLCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgImlue2J9XHR7JWR4LCAlYWx8JUFMLCAlRFh9IiwgW10+Ow0KK2xldCBEZWZzID0gW0FYXSwgVXNlcyA9IFtEWF0gaW4NCitkZWYgSU4xNnJyIDogSTwweEVELCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgImlue3d9XHR7JWR4LCAlYXh8JUFYLCAlRFh9IiwgW10+LCAgT3BTaXplOw0KK2xldCBEZWZzID0gW0VBWF0sIFVzZXMgPSBbRFhdIGluDQorZGVmIElOMzJyciA6IEk8MHhFRCwgUmF3RnJtLCAob3V0cyksIChpbnMpLA0KKyAgICAgICAgICAgICAgICJpbntsfVx0eyVkeCwgJWVheHwlRUFYLCAlRFh9IiwgW10+Ow0KKw0KK2xldCBEZWZzID0gW0FMXSBpbg0KK2RlZiBJTjhyaSAgOiBJaTg8MHhFNCwgUmF3RnJtLCAob3V0cyksIChpbnMgaTE2aThpbW06JHBvcnQpLA0KKyAgICAgICAgICAgICAgICAgICJpbntifVx0eyRwb3J0LCAlYWx8JUFMLCAkcG9ydH0iLCBbXT47DQorbGV0IERlZnMgPSBbQVhdIGluDQorZGVmIElOMTZyaSA6IElpODwweEU1LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpMTZpOGltbTokcG9ydCksDQorICAgICAgICAgICAgICAgICAgImlue3d9XHR7JHBvcnQsICVheHwlQVgsICRwb3J0fSIsIFtdPiwgT3BTaXplOw0KK2xldCBEZWZzID0gW0VBWF0gaW4NCitkZWYgSU4zMnJpIDogSWk4PDB4RTUsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGkxNmk4aW1tOiRwb3J0KSwNCisgICAgICAgICAgICAgICAgICAiaW57bH1cdHskcG9ydCwgJWVheHwlRUFYLCAkcG9ydH0iLCBbXT47DQorDQorbGV0IFVzZXMgPSBbRFgsIEFMXSBpbg0KK2RlZiBPVVQ4cnIgIDogSTwweEVFLCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICJvdXR7Yn1cdHslYWwsICVkeHwlRFgsICVBTH0iLCBbXT47DQorbGV0IFVzZXMgPSBbRFgsIEFYXSBpbg0KK2RlZiBPVVQxNnJyIDogSTwweEVGLCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICJvdXR7d31cdHslYXgsICVkeHwlRFgsICVBWH0iLCBbXT4sIE9wU2l6ZTsNCitsZXQgVXNlcyA9IFtEWCwgRUFYXSBpbg0KK2RlZiBPVVQzMnJyIDogSTwweEVGLCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICJvdXR7bH1cdHslZWF4LCAlZHh8JURYLCAlRUFYfSIsIFtdPjsNCisNCitsZXQgVXNlcyA9IFtBTF0gaW4NCitkZWYgT1VUOGlyICA6IElpODwweEU2LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpMTZpOGltbTokcG9ydCksDQorICAgICAgICAgICAgICAgICAgICJvdXR7Yn1cdHslYWwsICRwb3J0fCRwb3J0LCAlQUx9IiwgW10+Ow0KK2xldCBVc2VzID0gW0FYXSBpbg0KK2RlZiBPVVQxNmlyIDogSWk4PDB4RTcsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGkxNmk4aW1tOiRwb3J0KSwNCisgICAgICAgICAgICAgICAgICAgIm91dHt3fVx0eyVheCwgJHBvcnR8JHBvcnQsICVBWH0iLCBbXT4sIE9wU2l6ZTsNCitsZXQgVXNlcyA9IFtFQVhdIGluDQorZGVmIE9VVDMyaXIgOiBJaTg8MHhFNywgUmF3RnJtLCAob3V0cyksIChpbnMgaTE2aThpbW06JHBvcnQpLA0KKyAgICAgICAgICAgICAgICAgICAib3V0e2x9XHR7JWVheCwgJHBvcnR8JHBvcnQsICVFQVh9IiwgW10+Ow0KKw0KK2RlZiBJTjggIDogSTwweDZDLCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICJpbnN7Yn0iLCBbXT47DQorZGVmIElOMTYgOiBJPDB4NkQsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgImluc3t3fSIsIFtdPiwgIE9wU2l6ZTsNCitkZWYgSU4zMiA6IEk8MHg2RCwgUmF3RnJtLCAob3V0cyksIChpbnMpLA0KKyAgICAgICAgICAgICAiaW5ze2x9IiwgW10+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gIE1vdmUgSW5zdHJ1Y3Rpb25zLi4uDQorLy8NCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4gew0KK2RlZiBNT1Y4cnIgIDogSTwweDg4LCBNUk1EZXN0UmVnLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7Yn1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2RlZiBNT1YxNnJyIDogSTwweDg5LCBNUk1EZXN0UmVnLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBPcFNpemU7DQorZGVmIE1PVjMycnIgOiBJPDB4ODksIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorfQ0KK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxLCBpc0FzQ2hlYXBBc0FNb3ZlID0gMSBpbiB7DQorZGVmIE1PVjhyaSAgOiBJaTggPDB4QjAsIEFkZFJlZ0ZybSwgKG91dHMgR1I4IDokZHN0KSwgKGlucyBpOGltbSA6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z7Yn1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIGltbTokc3JjKV0+Ow0KK2RlZiBNT1YxNnJpIDogSWkxNjwweEI4LCBBZGRSZWdGcm0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaTE2aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92e3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgaW1tOiRzcmMpXT4sIE9wU2l6ZTsNCitkZWYgTU9WMzJyaSA6IElpMzI8MHhCOCwgQWRkUmVnRnJtLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIGltbTokc3JjKV0+Ow0KK30NCisNCitkZWYgTU9WOG1pICA6IElpOCA8MHhDNiwgTVJNMG0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCwgaThpbW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92e2J9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGk4IGltbTokc3JjKSwgYWRkcjokZHN0KV0+Ow0KK2RlZiBNT1YxNm1pIDogSWkxNjwweEM3LCBNUk0wbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpMTZpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoaTE2IGltbTokc3JjKSwgYWRkcjokZHN0KV0+LCBPcFNpemU7DQorZGVmIE1PVjMybWkgOiBJaTMyPDB4QzcsIE1STTBtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChpMzIgaW1tOiRzcmMpLCBhZGRyOiRkc3QpXT47DQorDQorLy8vIG1vZmZzOCwgbW9mZnMxNiBhbmQgbW9mZnMzMiB2ZXJzaW9ucyBvZiBtb3Zlcy4gIFRoZSBpbW1lZGlhdGUgaXMgYQ0KKy8vLyAzMi1iaXQgb2Zmc2V0IGZyb20gdGhlIFBDLiAgVGhlc2UgYXJlIG9ubHkgdmFsaWQgaW4geDg2LTMyIG1vZGUuDQorZGVmIE1PVjhvOGEgOiBJaTMyIDwweEEwLCBSYXdGcm0sIChvdXRzKSwgKGlucyBvZmZzZXQ4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92e2J9XHR7JHNyYywgJWFsfCVhbCwgJHNyY30iLCBbXT4sDQorICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KK2RlZiBNT1YxNm8xNmEgOiBJaTMyIDwweEExLCBSYXdGcm0sIChvdXRzKSwgKGlucyBvZmZzZXQxNjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdnt3fVx0eyRzcmMsICVheHwlYXgsICRzcmN9IiwgW10+LCBPcFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorZGVmIE1PVjMybzMyYSA6IElpMzIgPDB4QTEsIFJhd0ZybSwgKG91dHMpLCAoaW5zIG9mZnNldDMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92e2x9XHR7JHNyYywgJWVheHwlZWF4LCAkc3JjfSIsIFtdPiwNCisgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCitkZWYgTU9WOGFvOCA6IElpMzIgPDB4QTIsIFJhd0ZybSwgKG91dHMgb2Zmc2V0ODokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z7Yn1cdHslYWwsICRkc3R8JGRzdCwgJWFsfSIsIFtdPiwNCisgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCitkZWYgTU9WMTZhbzE2IDogSWkzMiA8MHhBMywgUmF3RnJtLCAob3V0cyBvZmZzZXQxNjokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgICAgICJtb3Z7d31cdHslYXgsICRkc3R8JGRzdCwgJWF4fSIsIFtdPiwgT3BTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KK2RlZiBNT1YzMmFvMzIgOiBJaTMyIDwweEEzLCBSYXdGcm0sIChvdXRzIG9mZnNldDMyOiRkc3QpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdntsfVx0eyVlYXgsICRkc3R8JGRzdCwgJWVheH0iLCBbXT4sDQorICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorICAgICAgICAgICAgICAgICAgICAgIA0KKy8vIE1vdmVzIHRvIGFuZCBmcm9tIHNlZ21lbnQgcmVnaXN0ZXJzDQorZGVmIE1PVjE2cnMgOiBJPDB4OEMsIE1STURlc3RSZWcsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgU0VHTUVOVF9SRUc6JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBPcFNpemU7DQorZGVmIE1PVjMycnMgOiBJPDB4OEMsIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgU0VHTUVOVF9SRUc6JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2RlZiBNT1YxNm1zIDogSTwweDhDLCBNUk1EZXN0TWVtLCAob3V0cyBpMTZtZW06JGRzdCksIChpbnMgU0VHTUVOVF9SRUc6JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBPcFNpemU7DQorZGVmIE1PVjMybXMgOiBJPDB4OEMsIE1STURlc3RNZW0sIChvdXRzIGkzMm1lbTokZHN0KSwgKGlucyBTRUdNRU5UX1JFRzokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorZGVmIE1PVjE2c3IgOiBJPDB4OEUsIE1STVNyY1JlZywgKG91dHMgU0VHTUVOVF9SRUc6JGRzdCksIChpbnMgR1IxNjokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdnt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIE9wU2l6ZTsNCitkZWYgTU9WMzJzciA6IEk8MHg4RSwgTVJNU3JjUmVnLCAob3V0cyBTRUdNRU5UX1JFRzokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibW92e2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCitkZWYgTU9WMTZzbSA6IEk8MHg4RSwgTVJNU3JjTWVtLCAob3V0cyBTRUdNRU5UX1JFRzokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBPcFNpemU7DQorZGVmIE1PVjMyc20gOiBJPDB4OEUsIE1STVNyY01lbSwgKG91dHMgU0VHTUVOVF9SRUc6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibW92e2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCisNCitsZXQgaXNDb2RlR2VuT25seSA9IDEgaW4gew0KK2RlZiBNT1Y4cnJfUkVWIDogSTwweDhBLCBNUk1TcmNSZWcsIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z7Yn1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2RlZiBNT1YxNnJyX1JFViA6IEk8MHg4QiwgTVJNU3JjUmVnLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAibW92e3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgT3BTaXplOw0KK2RlZiBNT1YzMnJyX1JFViA6IEk8MHg4QiwgTVJNU3JjUmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAibW92e2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCit9DQorDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluIHsNCitkZWYgTU9WOHJtICA6IEk8MHg4QSwgTVJNU3JjTWVtLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIGk4bWVtIDokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntifVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGxvYWRpOCBhZGRyOiRzcmMpKV0+Ow0KK2RlZiBNT1YxNnJtIDogSTwweDhCLCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaTE2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibW92e3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGxvYWRpMTYgYWRkcjokc3JjKSldPiwgT3BTaXplOw0KK2RlZiBNT1YzMnJtIDogSTwweDhCLCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibW92e2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKGxvYWRpMzIgYWRkcjokc3JjKSldPjsNCit9DQorDQorZGVmIE1PVjhtciAgOiBJPDB4ODgsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCwgR1I4IDokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntifVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIEdSODokc3JjLCBhZGRyOiRkc3QpXT47DQorZGVmIE1PVjE2bXIgOiBJPDB4ODksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgR1IxNjokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdnt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIEdSMTY6JHNyYywgYWRkcjokZHN0KV0+LCBPcFNpemU7DQorZGVmIE1PVjMybXIgOiBJPDB4ODksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIEdSMzI6JHNyYywgYWRkcjokZHN0KV0+Ow0KKw0KKy8vLyBWZXJzaW9ucyBvZiBNT1YzMnJyLCBNT1YzMnJtLCBhbmQgTU9WMzJtciBmb3IgaTMybWVtX1RDIGFuZCBHUjMyX1RDLg0KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluDQorZGVmIE1PVjMycnJfVEMgOiBJPDB4ODksIE1STURlc3RSZWcsIChvdXRzIEdSMzJfVEM6JGRzdCksIChpbnMgR1IzMl9UQzokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorDQorbGV0IG1heUxvYWQgPSAxLA0KKyAgICBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbg0KK2RlZiBNT1YzMnJtX1RDIDogSTwweDhCLCBNUk1TcmNNZW0sIChvdXRzIEdSMzJfVEM6JGRzdCksIChpbnMgaTMybWVtX1RDOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibW92e2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgIFtdPjsNCisNCitsZXQgbWF5U3RvcmUgPSAxIGluDQorZGVmIE1PVjMybXJfVEMgOiBJPDB4ODksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW1fVEM6JGRzdCwgR1IzMl9UQzokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICBbXT47DQorfQ0KKw0KKy8vIFZlcnNpb25zIG9mIE1PVjhyciwgTU9WOG1yLCBhbmQgTU9WOHJtIHRoYXQgdXNlIGk4bWVtX05PUkVYIGFuZCBHUjhfTk9SRVggc28NCisvLyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGNvcHlpbmcgYW5kIHN0b3JpbmcgaCByZWdpc3RlcnMsIHdoaWNoIGNhbid0IGJlDQorLy8gZW5jb2RlZCB3aGVuIGEgUkVYIHByZWZpeCBpcyBwcmVzZW50Lg0KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluDQorZGVmIE1PVjhycl9OT1JFWCA6IEk8MHg4OCwgTVJNRGVzdFJlZywNCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjhfTk9SRVg6JGRzdCksIChpbnMgR1I4X05PUkVYOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJtb3Z7Yn1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9ICAjIE5PUkVYIiwgW10+Ow0KK2xldCBtYXlTdG9yZSA9IDEgaW4NCitkZWYgTU9WOG1yX05PUkVYIDogSTwweDg4LCBNUk1EZXN0TWVtLA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpOG1lbV9OT1JFWDokZHN0LCBHUjhfTk9SRVg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgIm1vdntifVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30gICMgTk9SRVgiLCBbXT47DQorbGV0IG1heUxvYWQgPSAxLA0KKyAgICBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbg0KK2RlZiBNT1Y4cm1fTk9SRVggOiBJPDB4OEEsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjhfTk9SRVg6JGRzdCksIChpbnMgaThtZW1fTk9SRVg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgIm1vdntifVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30gICMgTk9SRVgiLCBbXT47DQorfQ0KKw0KKy8vIE1vdmVzIHRvIGFuZCBmcm9tIGRlYnVnIHJlZ2lzdGVycw0KK2RlZiBNT1YzMnJkIDogSTwweDIxLCBNUk1EZXN0UmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIERFQlVHX1JFRzokc3JjKSwNCisgICAgICAgICAgICAgICAgIm1vdntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KK2RlZiBNT1YzMmRyIDogSTwweDIzLCBNUk1TcmNSZWcsIChvdXRzIERFQlVHX1JFRzokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibW92e2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorICAgICAgICAgICAgICAgIA0KKy8vIE1vdmVzIHRvIGFuZCBmcm9tIGNvbnRyb2wgcmVnaXN0ZXJzDQorZGVmIE1PVjMycmMgOiBJPDB4MjAsIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgQ09OVFJPTF9SRUc6JHNyYyksDQorICAgICAgICAgICAgICAgICJtb3Z7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitkZWYgTU9WMzJjciA6IEk8MHgyMiwgTVJNU3JjUmVnLCAob3V0cyBDT05UUk9MX1JFRzokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibW92e2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgRml4ZWQtUmVnaXN0ZXIgTXVsdGlwbGljYXRpb24gYW5kIERpdmlzaW9uIEluc3RydWN0aW9ucy4uLg0KKy8vDQorDQorLy8gRXh0cmEgcHJlY2lzaW9uIG11bHRpcGxpY2F0aW9uDQorDQorLy8gQUwgaXMgcmVhbGx5IGltcGxpZWQgYnkgQVgsIGJ1dCB0aGUgcmVnaXN0ZXJzIGluIERlZnMgbXVzdCBtYXRjaCB0aGUNCisvLyBTRE5vZGUgcmVzdWx0cyAoaTgsIGkzMikuDQorbGV0IERlZnMgPSBbQUwsRUZMQUdTLEFYXSwgVXNlcyA9IFtBTF0gaW4NCitkZWYgTVVMOHIgIDogSTwweEY2LCBNUk00ciwgKG91dHMpLCAgKGlucyBHUjg6JHNyYyksICJtdWx7Yn1cdCRzcmMiLA0KKyAgICAgICAgICAgICAgIC8vIEZJWE1FOiBVc2VkIGZvciA4LWJpdCBtdWwsIGlnbm9yZSByZXN1bHQgdXBwZXIgOCBiaXRzLg0KKyAgICAgICAgICAgICAgIC8vIFRoaXMgcHJvYmFibHkgb3VnaHQgdG8gYmUgbW92ZWQgdG8gYSBkZWYgOiBQYXQ8PiBpZiB0aGUNCisgICAgICAgICAgICAgICAvLyBzeW50YXggY2FuIGJlIGFjY2VwdGVkLg0KKyAgICAgICAgICAgICAgIFsoc2V0IEFMLCAobXVsIEFMLCBHUjg6JHNyYykpLA0KKyAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+OyAgICAgLy8gQUwsQUggPSBBTCpHUjgNCisNCitsZXQgRGVmcyA9IFtBWCxEWCxFRkxBR1NdLCBVc2VzID0gW0FYXSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4NCitkZWYgTVVMMTZyIDogSTwweEY3LCBNUk00ciwgKG91dHMpLCAgKGlucyBHUjE2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICJtdWx7d31cdCRzcmMiLCANCisgICAgICAgICAgICAgICBbXT4sIE9wU2l6ZTsgICAgLy8gQVgsRFggPSBBWCpHUjE2DQorDQorbGV0IERlZnMgPSBbRUFYLEVEWCxFRkxBR1NdLCBVc2VzID0gW0VBWF0sIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluDQorZGVmIE1VTDMyciA6IEk8MHhGNywgTVJNNHIsIChvdXRzKSwgIChpbnMgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAibXVse2x9XHQkc3JjIiwNCisgICAgICAgICAgICAgICBbXT47IC8vIEVBWCxFRFggPSBFQVgqR1IzMg0KKw0KK2xldCBEZWZzID0gW0FMLEVGTEFHUyxBWF0sIFVzZXMgPSBbQUxdIGluDQorZGVmIE1VTDhtICA6IEk8MHhGNiwgTVJNNG0sIChvdXRzKSwgKGlucyBpOG1lbSA6JHNyYyksDQorICAgICAgICAgICAgICAgIm11bHtifVx0JHNyYyIsDQorICAgICAgICAgICAgICAgLy8gRklYTUU6IFVzZWQgZm9yIDgtYml0IG11bCwgaWdub3JlIHJlc3VsdCB1cHBlciA4IGJpdHMuDQorICAgICAgICAgICAgICAgLy8gVGhpcyBwcm9iYWJseSBvdWdodCB0byBiZSBtb3ZlZCB0byBhIGRlZiA6IFBhdDw+IGlmIHRoZQ0KKyAgICAgICAgICAgICAgIC8vIHN5bnRheCBjYW4gYmUgYWNjZXB0ZWQuDQorICAgICAgICAgICAgICAgWyhzZXQgQUwsIChtdWwgQUwsIChsb2FkaTggYWRkcjokc3JjKSkpLA0KKyAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+OyAgIC8vIEFMLEFIID0gQUwqW21lbThdDQorDQorbGV0IG1heUxvYWQgPSAxLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorbGV0IERlZnMgPSBbQVgsRFgsRUZMQUdTXSwgVXNlcyA9IFtBWF0gaW4NCitkZWYgTVVMMTZtIDogSTwweEY3LCBNUk00bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAibXVse3d9XHQkc3JjIiwNCisgICAgICAgICAgICAgICBbXT4sIE9wU2l6ZTsgLy8gQVgsRFggPSBBWCpbbWVtMTZdDQorDQorbGV0IERlZnMgPSBbRUFYLEVEWCxFRkxBR1NdLCBVc2VzID0gW0VBWF0gaW4NCitkZWYgTVVMMzJtIDogSTwweEY3LCBNUk00bSwgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICJtdWx7bH1cdCRzcmMiLA0KKyAgICAgICAgICAgICAgW10+OyAgICAgICAgICAvLyBFQVgsRURYID0gRUFYKlttZW0zMl0NCit9DQorDQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCitsZXQgRGVmcyA9IFtBTCxFRkxBR1MsQVhdLCBVc2VzID0gW0FMXSBpbg0KK2RlZiBJTVVMOHIgIDogSTwweEY2LCBNUk01ciwgKG91dHMpLCAgKGlucyBHUjg6JHNyYyksICJpbXVse2J9XHQkc3JjIiwgW10+Ow0KKyAgICAgICAgICAgICAgLy8gQUwsQUggPSBBTCpHUjgNCitsZXQgRGVmcyA9IFtBWCxEWCxFRkxBR1NdLCBVc2VzID0gW0FYXSBpbg0KK2RlZiBJTVVMMTZyIDogSTwweEY3LCBNUk01ciwgKG91dHMpLCAgKGlucyBHUjE2OiRzcmMpLCAiaW11bHt3fVx0JHNyYyIsIFtdPiwNCisgICAgICAgICAgICAgIE9wU2l6ZTsgICAgLy8gQVgsRFggPSBBWCpHUjE2DQorbGV0IERlZnMgPSBbRUFYLEVEWCxFRkxBR1NdLCBVc2VzID0gW0VBWF0gaW4NCitkZWYgSU1VTDMyciA6IEk8MHhGNywgTVJNNXIsIChvdXRzKSwgIChpbnMgR1IzMjokc3JjKSwgImltdWx7bH1cdCRzcmMiLCBbXT47DQorICAgICAgICAgICAgICAvLyBFQVgsRURYID0gRUFYKkdSMzINCitsZXQgbWF5TG9hZCA9IDEgaW4gew0KK2xldCBEZWZzID0gW0FMLEVGTEFHUyxBWF0sIFVzZXMgPSBbQUxdIGluDQorZGVmIElNVUw4bSAgOiBJPDB4RjYsIE1STTVtLCAob3V0cyksIChpbnMgaThtZW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAiaW11bHtifVx0JHNyYyIsIFtdPjsgICAgLy8gQUwsQUggPSBBTCpbbWVtOF0NCitsZXQgRGVmcyA9IFtBWCxEWCxFRkxBR1NdLCBVc2VzID0gW0FYXSBpbg0KK2RlZiBJTVVMMTZtIDogSTwweEY3LCBNUk01bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgImltdWx7d31cdCRzcmMiLCBbXT4sIE9wU2l6ZTsgLy8gQVgsRFggPSBBWCpbbWVtMTZdDQorbGV0IERlZnMgPSBbRUFYLEVEWCxFRkxBR1NdLCBVc2VzID0gW0VBWF0gaW4NCitkZWYgSU1VTDMybSA6IEk8MHhGNywgTVJNNW0sIChvdXRzKSwgKGlucyBpMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJpbXVse2x9XHQkc3JjIiwgW10+OyAgLy8gRUFYLEVEWCA9IEVBWCpbbWVtMzJdDQorfQ0KK30gLy8gbmV2ZXJIYXNTaWRlRWZmZWN0cw0KKw0KKy8vIHVuc2lnbmVkIGRpdmlzaW9uL3JlbWFpbmRlcg0KK2xldCBEZWZzID0gW0FMLEVGTEFHUyxBWF0sIFVzZXMgPSBbQVhdIGluDQorZGVmIERJVjhyICA6IEk8MHhGNiwgTVJNNnIsIChvdXRzKSwgIChpbnMgR1I4OiRzcmMpLCAgICAvLyBBWC9yOCA9IEFMLEFIDQorICAgICAgICAgICAgICAgImRpdntifVx0JHNyYyIsIFtdPjsNCitsZXQgRGVmcyA9IFtBWCxEWCxFRkxBR1NdLCBVc2VzID0gW0FYLERYXSBpbg0KK2RlZiBESVYxNnIgOiBJPDB4RjcsIE1STTZyLCAob3V0cyksICAoaW5zIEdSMTY6JHNyYyksICAgLy8gRFg6QVgvcjE2ID0gQVgsRFgNCisgICAgICAgICAgICAgICAiZGl2e3d9XHQkc3JjIiwgW10+LCBPcFNpemU7DQorbGV0IERlZnMgPSBbRUFYLEVEWCxFRkxBR1NdLCBVc2VzID0gW0VBWCxFRFhdIGluDQorZGVmIERJVjMyciA6IEk8MHhGNywgTVJNNnIsIChvdXRzKSwgIChpbnMgR1IzMjokc3JjKSwgICAvLyBFRFg6RUFYL3IzMiA9IEVBWCxFRFgNCisgICAgICAgICAgICAgICAiZGl2e2x9XHQkc3JjIiwgW10+Ow0KK2xldCBtYXlMb2FkID0gMSBpbiB7DQorbGV0IERlZnMgPSBbQUwsRUZMQUdTLEFYXSwgVXNlcyA9IFtBWF0gaW4NCitkZWYgRElWOG0gIDogSTwweEY2LCBNUk02bSwgKG91dHMpLCAoaW5zIGk4bWVtOiRzcmMpLCAgIC8vIEFYL1ttZW04XSA9IEFMLEFIDQorICAgICAgICAgICAgICAgImRpdntifVx0JHNyYyIsIFtdPjsNCitsZXQgRGVmcyA9IFtBWCxEWCxFRkxBR1NdLCBVc2VzID0gW0FYLERYXSBpbg0KK2RlZiBESVYxNm0gOiBJPDB4RjcsIE1STTZtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMpLCAgLy8gRFg6QVgvW21lbTE2XSA9IEFYLERYDQorICAgICAgICAgICAgICAgImRpdnt3fVx0JHNyYyIsIFtdPiwgT3BTaXplOw0KK2xldCBEZWZzID0gW0VBWCxFRFgsRUZMQUdTXSwgVXNlcyA9IFtFQVgsRURYXSBpbg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFRFg6RUFYL1ttZW0zMl0gPSBFQVgsRURYDQorZGVmIERJVjMybSA6IEk8MHhGNywgTVJNNm0sIChvdXRzKSwgKGlucyBpMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgImRpdntsfVx0JHNyYyIsIFtdPjsNCit9DQorDQorLy8gU2lnbmVkIGRpdmlzaW9uL3JlbWFpbmRlci4NCitsZXQgRGVmcyA9IFtBTCxFRkxBR1MsQVhdLCBVc2VzID0gW0FYXSBpbg0KK2RlZiBJRElWOHIgOiBJPDB4RjYsIE1STTdyLCAob3V0cyksICAoaW5zIEdSODokc3JjKSwgICAgLy8gQVgvcjggPSBBTCxBSA0KKyAgICAgICAgICAgICAgICJpZGl2e2J9XHQkc3JjIiwgW10+Ow0KK2xldCBEZWZzID0gW0FYLERYLEVGTEFHU10sIFVzZXMgPSBbQVgsRFhdIGluDQorZGVmIElESVYxNnI6IEk8MHhGNywgTVJNN3IsIChvdXRzKSwgIChpbnMgR1IxNjokc3JjKSwgICAvLyBEWDpBWC9yMTYgPSBBWCxEWA0KKyAgICAgICAgICAgICAgICJpZGl2e3d9XHQkc3JjIiwgW10+LCBPcFNpemU7DQorbGV0IERlZnMgPSBbRUFYLEVEWCxFRkxBR1NdLCBVc2VzID0gW0VBWCxFRFhdIGluDQorZGVmIElESVYzMnI6IEk8MHhGNywgTVJNN3IsIChvdXRzKSwgIChpbnMgR1IzMjokc3JjKSwgICAvLyBFRFg6RUFYL3IzMiA9IEVBWCxFRFgNCisgICAgICAgICAgICAgICAiaWRpdntsfVx0JHNyYyIsIFtdPjsNCitsZXQgbWF5TG9hZCA9IDEsIG1heUxvYWQgPSAxIGluIHsNCitsZXQgRGVmcyA9IFtBTCxFRkxBR1MsQVhdLCBVc2VzID0gW0FYXSBpbg0KK2RlZiBJRElWOG0gOiBJPDB4RjYsIE1STTdtLCAob3V0cyksIChpbnMgaThtZW06JHNyYyksICAgLy8gQVgvW21lbThdID0gQUwsQUgNCisgICAgICAgICAgICAgICAiaWRpdntifVx0JHNyYyIsIFtdPjsNCitsZXQgRGVmcyA9IFtBWCxEWCxFRkxBR1NdLCBVc2VzID0gW0FYLERYXSBpbg0KK2RlZiBJRElWMTZtOiBJPDB4RjcsIE1STTdtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMpLCAgLy8gRFg6QVgvW21lbTE2XSA9IEFYLERYDQorICAgICAgICAgICAgICAgImlkaXZ7d31cdCRzcmMiLCBbXT4sIE9wU2l6ZTsNCitsZXQgRGVmcyA9IFtFQVgsRURYLEVGTEFHU10sIFVzZXMgPSBbRUFYLEVEWF0gaW4NCitkZWYgSURJVjMybTogSTwweEY3LCBNUk03bSwgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjKSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVEWDpFQVgvW21lbTMyXSA9IEVBWCxFRFgNCisgICAgICAgICAgICAgICAiaWRpdntsfVx0JHNyYyIsIFtdPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyAgVHdvIGFkZHJlc3MgSW5zdHJ1Y3Rpb25zLg0KKy8vDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KKw0KKy8vIENvbmRpdGlvbmFsIG1vdmVzDQorbGV0IFVzZXMgPSBbRUZMQUdTXSBpbiB7DQorDQorbGV0IFByZWRpY2F0ZXMgPSBbSGFzQ01vdl0gaW4gew0KK2xldCBpc0NvbW11dGFibGUgPSAxIGluIHsNCitkZWYgQ01PVkIxNnJyIDogSTwweDQyLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmIDx1LCBHUjE2ID0gR1IxNg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zie3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9CLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZCMzJyciA6IEk8MHg0MiwgTVJNU3JjUmVnLCAgICAgICAvLyBpZiA8dSwgR1IzMiA9IEdSMzINCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92YntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoWDg2Y21vdiBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfQiwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZBRTE2cnI6IEk8MHg0MywgTVJNU3JjUmVnLCAgICAgICAvLyBpZiA+PXUsIEdSMTYgPSBHUjE2DQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmFle3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9BRSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVkFFMzJycjogSTwweDQzLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmID49dSwgR1IzMiA9IEdSMzINCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92YWV7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgR1IzMjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0FFLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQjsNCitkZWYgQ01PVkUxNnJyIDogSTwweDQ0LCBNUk1TcmNSZWcsICAgICAgIC8vIGlmID09LCBHUjE2ID0gR1IxNg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zle3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9FLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WRTMycnIgOiBJPDB4NDQsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPT0sIEdSMzIgPSBHUjMyDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmV7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgR1IzMjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0UsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WTkUxNnJyOiBJPDB4NDUsIE1STVNyY1JlZywgICAgICAgLy8gaWYgIT0sIEdSMTYgPSBHUjE2DQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdm5le3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9ORSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVk5FMzJycjogSTwweDQ1LCBNUk1TcmNSZWcsICAgICAgIC8vIGlmICE9LCBHUjMyID0gR1IzMg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3ZuZXtsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoWDg2Y21vdiBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTkUsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WQkUxNnJyOiBJPDB4NDYsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPD11LCBHUjE2ID0gR1IxNg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3ZiZXt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfQkUsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZCRTMycnI6IEk8MHg0NiwgTVJNU3JjUmVnLCAgICAgICAvLyBpZiA8PXUsIEdSMzIgPSBHUjMyDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmJle2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9CRSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZBMTZyciA6IEk8MHg0NywgTVJNU3JjUmVnLCAgICAgICAvLyBpZiA+dSwgR1IxNiA9IEdSMTYNCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92YXt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfQSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVkEzMnJyIDogSTwweDQ3LCBNUk1TcmNSZWcsICAgICAgIC8vIGlmID51LCBHUjMyID0gR1IzMg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zhe2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9BLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQjsNCitkZWYgQ01PVkwxNnJyIDogSTwweDRDLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmIDxzLCBHUjE2ID0gR1IxNg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zse3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9MLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WTDMycnIgOiBJPDB4NEMsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPHMsIEdSMzIgPSBHUjMyDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmx7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgR1IzMjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0wsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WR0UxNnJyOiBJPDB4NEQsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPj1zLCBHUjE2ID0gR1IxNg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3ZnZXt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfR0UsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZHRTMycnI6IEk8MHg0RCwgTVJNU3JjUmVnLCAgICAgICAvLyBpZiA+PXMsIEdSMzIgPSBHUjMyDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmdle2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9HRSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZMRTE2cnI6IEk8MHg0RSwgTVJNU3JjUmVnLCAgICAgICAvLyBpZiA8PXMsIEdSMTYgPSBHUjE2DQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmxle3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9MRSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVkxFMzJycjogSTwweDRFLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmIDw9cywgR1IzMiA9IEdSMzINCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92bGV7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgR1IzMjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0xFLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQjsNCitkZWYgQ01PVkcxNnJyIDogSTwweDRGLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmID5zLCBHUjE2ID0gR1IxNg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zne3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9HLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WRzMycnIgOiBJPDB4NEYsIE1STVNyY1JlZywgICAgICAgLy8gaWYgPnMsIEdSMzIgPSBHUjMyDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmd7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgR1IzMjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0csIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WUzE2cnIgOiBJPDB4NDgsIE1STVNyY1JlZywgICAgICAgLy8gaWYgc2lnbmVkLCBHUjE2ID0gR1IxNg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zze3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9TLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZTMzJyciA6IEk8MHg0OCwgTVJNU3JjUmVnLCAgICAgICAvLyBpZiBzaWduZWQsIEdSMzIgPSBHUjMyDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdnN7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgR1IzMjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX1MsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZOUzE2cnI6IEk8MHg0OSwgTVJNU3JjUmVnLCAgICAgICAvLyBpZiAhc2lnbmVkLCBHUjE2ID0gR1IxNg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zuc3t3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTlMsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVk5TMzJycjogSTwweDQ5LCBNUk1TcmNSZWcsICAgICAgIC8vIGlmICFzaWduZWQsIEdSMzIgPSBHUjMyDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdm5ze2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9OUywgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICBUQjsNCitkZWYgQ01PVlAxNnJyIDogSTwweDRBLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmIHBhcml0eSwgR1IxNiA9IEdSMTYNCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92cHt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfUCwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WUDMycnIgOiBJPDB4NEEsIE1STVNyY1JlZywgICAgICAgLy8gaWYgcGFyaXR5LCBHUjMyID0gR1IzMg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zwe2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9QLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WTlAxNnJyIDogSTwweDRCLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmICFwYXJpdHksIEdSMTYgPSBHUjE2DQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdm5we3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX05QLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZOUDMycnIgOiBJPDB4NEIsIE1STVNyY1JlZywgICAgICAgLy8gaWYgIXBhcml0eSwgR1IzMiA9IEdSMzINCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92bnB7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTlAsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZPMTZyciA6IEk8MHg0MCwgTVJNU3JjUmVnLCAgICAgICAvLyBpZiBvdmVyZmxvdywgR1IxNiA9IEdSMTYNCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92b3t3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTywgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WTzMycnIgOiBJPDB4NDAsIE1STVNyY1JlZywgICAgICAgLy8gaWYgb3ZlcmZsb3csIEdSMzIgPSBHUjMyDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdm97bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgR1IzMjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX08sIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZOTzE2cnIgOiBJPDB4NDEsIE1STVNyY1JlZywgICAgICAgLy8gaWYgIW92ZXJmbG93LCBHUjE2ID0gR1IxNg0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zub3t3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKFg4NmNtb3YgR1IxNjokc3JjMSwgR1IxNjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9OTywgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WTk8zMnJyIDogSTwweDQxLCBNUk1TcmNSZWcsICAgICAgIC8vIGlmICFvdmVyZmxvdywgR1IzMiA9IEdSMzINCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92bm97bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTk8sIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgVEI7DQorfSAvLyBpc0NvbW11dGFibGUgPSAxDQorDQorZGVmIENNT1ZCMTZybSA6IEk8MHg0MiwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA8dSwgR1IxNiA9IFttZW0xNl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zie3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIChsb2FkaTE2IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfQiwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WQjMycm0gOiBJPDB4NDIsIE1STVNyY01lbSwgICAgICAgLy8gaWYgPHUsIEdSMzIgPSBbbWVtMzJdDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBpMzJtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92YntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoWDg2Y21vdiBHUjMyOiRzcmMxLCAobG9hZGkzMiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0IsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WQUUxNnJtOiBJPDB4NDMsIE1STVNyY01lbSwgICAgICAgLy8gaWYgPj11LCBHUjE2ID0gW21lbTE2XQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaTE2bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmFle3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIChsb2FkaTE2IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfQUUsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZBRTMycm06IEk8MHg0MywgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA+PXUsIEdSMzIgPSBbbWVtMzJdDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBpMzJtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92YWV7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgKGxvYWRpMzIgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9BRSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZFMTZybSA6IEk8MHg0NCwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA9PSwgR1IxNiA9IFttZW0xNl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zle3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIChsb2FkaTE2IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfRSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVkUzMnJtIDogSTwweDQ0LCBNUk1TcmNNZW0sICAgICAgIC8vIGlmID09LCBHUjMyID0gW21lbTMyXQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmV7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgKGxvYWRpMzIgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9FLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQjsNCitkZWYgQ01PVk5FMTZybTogSTwweDQ1LCBNUk1TcmNNZW0sICAgICAgIC8vIGlmICE9LCBHUjE2ID0gW21lbTE2XQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaTE2bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdm5le3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIChsb2FkaTE2IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTkUsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZORTMycm06IEk8MHg0NSwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiAhPSwgR1IzMiA9IFttZW0zMl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3ZuZXtsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoWDg2Y21vdiBHUjMyOiRzcmMxLCAobG9hZGkzMiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX05FLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQjsNCitkZWYgQ01PVkJFMTZybTogSTwweDQ2LCBNUk1TcmNNZW0sICAgICAgIC8vIGlmIDw9dSwgR1IxNiA9IFttZW0xNl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3ZiZXt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0JFLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WQkUzMnJtOiBJPDB4NDYsIE1STVNyY01lbSwgICAgICAgLy8gaWYgPD11LCBHUjMyID0gW21lbTMyXQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmJle2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIChsb2FkaTMyIGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfQkUsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WQTE2cm0gOiBJPDB4NDcsIE1STVNyY01lbSwgICAgICAgLy8gaWYgPnUsIEdSMTYgPSBbbWVtMTZdDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBpMTZtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92YXt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0EsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZBMzJybSA6IEk8MHg0NywgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA+dSwgR1IzMiA9IFttZW0zMl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zhe2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIChsb2FkaTMyIGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfQSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZMMTZybSA6IEk8MHg0QywgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA8cywgR1IxNiA9IFttZW0xNl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zse3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIChsb2FkaTE2IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTCwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVkwzMnJtIDogSTwweDRDLCBNUk1TcmNNZW0sICAgICAgIC8vIGlmIDxzLCBHUjMyID0gW21lbTMyXQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmx7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgKGxvYWRpMzIgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9MLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQjsNCitkZWYgQ01PVkdFMTZybTogSTwweDRELCBNUk1TcmNNZW0sICAgICAgIC8vIGlmID49cywgR1IxNiA9IFttZW0xNl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3ZnZXt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX0dFLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WR0UzMnJtOiBJPDB4NEQsIE1STVNyY01lbSwgICAgICAgLy8gaWYgPj1zLCBHUjMyID0gW21lbTMyXQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmdle2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIChsb2FkaTMyIGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfR0UsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WTEUxNnJtOiBJPDB4NEUsIE1STVNyY01lbSwgICAgICAgLy8gaWYgPD1zLCBHUjE2ID0gW21lbTE2XQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaTE2bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmxle3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIChsb2FkaTE2IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTEUsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZMRTMycm06IEk8MHg0RSwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA8PXMsIEdSMzIgPSBbbWVtMzJdDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBpMzJtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92bGV7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgKGxvYWRpMzIgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9MRSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZHMTZybSA6IEk8MHg0RiwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiA+cywgR1IxNiA9IFttZW0xNl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zne3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIChsb2FkaTE2IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfRywgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVkczMnJtIDogSTwweDRGLCBNUk1TcmNNZW0sICAgICAgIC8vIGlmID5zLCBHUjMyID0gW21lbTMyXQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdmd7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgKGxvYWRpMzIgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9HLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQjsNCitkZWYgQ01PVlMxNnJtIDogSTwweDQ4LCBNUk1TcmNNZW0sICAgICAgIC8vIGlmIHNpZ25lZCwgR1IxNiA9IFttZW0xNl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zze3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChYODZjbW92IEdSMTY6JHNyYzEsIChsb2FkaTE2IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfUywgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WUzMycm0gOiBJPDB4NDgsIE1STVNyY01lbSwgICAgICAgLy8gaWYgc2lnbmVkLCBHUjMyID0gW21lbTMyXQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdnN7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgKGxvYWRpMzIgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9TLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WTlMxNnJtOiBJPDB4NDksIE1STVNyY01lbSwgICAgICAgLy8gaWYgIXNpZ25lZCwgR1IxNiA9IFttZW0xNl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zuc3t3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX05TLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIENNT1ZOUzMycm06IEk8MHg0OSwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiAhc2lnbmVkLCBHUjMyID0gW21lbTMyXQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdm5ze2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIChsb2FkaTMyIGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTlMsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgVEI7DQorZGVmIENNT1ZQMTZybSA6IEk8MHg0QSwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiBwYXJpdHksIEdSMTYgPSBbbWVtMTZdDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBpMTZtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92cHt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX1AsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVlAzMnJtIDogSTwweDRBLCBNUk1TcmNNZW0sICAgICAgIC8vIGlmIHBhcml0eSwgR1IzMiA9IFttZW0zMl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zwe2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIChsb2FkaTMyIGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfUCwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICBUQjsNCitkZWYgQ01PVk5QMTZybSA6IEk8MHg0QiwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiAhcGFyaXR5LCBHUjE2ID0gW21lbTE2XQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaTE2bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdm5we3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9OUCwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBDTU9WTlAzMnJtIDogSTwweDRCLCBNUk1TcmNNZW0sICAgICAgIC8vIGlmICFwYXJpdHksIEdSMzIgPSBbbWVtMzJdDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBpMzJtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92bnB7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIChsb2FkaTMyIGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX05QLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WTzE2cm0gOiBJPDB4NDAsIE1STVNyY01lbSwgICAgICAgLy8gaWYgb3ZlcmZsb3csIEdSMTYgPSBbbWVtMTZdDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBpMTZtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92b3t3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2Y21vdiBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX08sIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVk8zMnJtIDogSTwweDQwLCBNUk1TcmNNZW0sICAgICAgIC8vIGlmIG92ZXJmbG93LCBHUjMyID0gW21lbTMyXQ0KKyAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiY21vdm97bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NmNtb3YgR1IzMjokc3JjMSwgKGxvYWRpMzIgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZfQ09ORF9PLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCOw0KK2RlZiBDTU9WTk8xNnJtIDogSTwweDQxLCBNUk1TcmNNZW0sICAgICAgIC8vIGlmICFvdmVyZmxvdywgR1IxNiA9IFttZW0xNl0NCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtb3Zub3t3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKFg4NmNtb3YgR1IxNjokc3JjMSwgKGxvYWRpMTYgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2X0NPTkRfTk8sIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgQ01PVk5PMzJybSA6IEk8MHg0MSwgTVJNU3JjTWVtLCAgICAgICAvLyBpZiAhb3ZlcmZsb3csIEdSMzIgPSBbbWVtMzJdDQorICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBpMzJtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJjbW92bm97bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZjbW92IEdSMzI6JHNyYzEsIChsb2FkaTMyIGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nl9DT05EX05PLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCOw0KK30gLy8gUHJlZGljYXRlcyA9IFtIYXNDTW92XQ0KKw0KKy8vIFg4NiBkb2Vzbid0IGhhdmUgOC1iaXQgY29uZGl0aW9uYWwgbW92ZXMuIFVzZSBhIGN1c3RvbUluc2VydGVyIHRvDQorLy8gZW1pdCBjb250cm9sIGZsb3cuIEFuIGFsdGVybmF0aXZlIHRvIHRoaXMgaXMgdG8gbWFyayBpOCBTRUxFQ1QgYXMgUHJvbW90ZSwNCisvLyBob3dldmVyIHRoYXQgcmVxdWlyZXMgcHJvbW90aW5nIHRoZSBvcGVyYW5kcywgYW5kIGNhbiBpbmR1Y2UgYWRkaXRpb25hbA0KKy8vIGk4IHJlZ2lzdGVyIHByZXNzdXJlLiBOb3RlIHRoYXQgQ01PVl9HUjggaXMgY29uc2VydmF0aXZlbHkgY29uc2lkZXJlZCB0bw0KKy8vIGNsb2JiZXIgRUZMQUdTLCBiZWNhdXNlIGlmIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgemVybywgdGhlIGV4cGFuc2lvbg0KKy8vIGNvdWxkIGludm9sdmUgYW4geG9yLg0KK2xldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxLCBDb25zdHJhaW50cyA9ICIiLCBEZWZzID0gW0VGTEFHU10gaW4gew0KK2RlZiBDTU9WX0dSOCA6IEk8MCwgUHNldWRvLA0KKyAgICAgICAgICAgICAgICAgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSwgR1I4OiRzcmMyLCBpOGltbTokY29uZCksDQorICAgICAgICAgICAgICAgICAiI0NNT1ZfR1I4IFBTRVVETyEiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChYODZjbW92IEdSODokc3JjMSwgR1I4OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokY29uZCwgRUZMQUdTKSldPjsNCisNCitsZXQgUHJlZGljYXRlcyA9IFtOb0NNb3ZdIGluIHsNCitkZWYgQ01PVl9HUjMyIDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsIGk4aW1tOiRjb25kKSwNCisgICAgICAgICAgICAgICAgICAgICIjQ01PVl9HUjMyKiBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgKFg4NmNtb3YgR1IzMjokc3JjMSwgR1IzMjokc3JjMiwgaW1tOiRjb25kLCBFRkxBR1MpKV0+Ow0KK2RlZiBDTU9WX0dSMTYgOiBJPDAsIFBzZXVkbywNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiwgaThpbW06JGNvbmQpLA0KKyAgICAgICAgICAgICAgICAgICAgIiNDTU9WX0dSMTYqIFBTRVVETyEiLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAoWDg2Y21vdiBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLCBpbW06JGNvbmQsIEVGTEFHUykpXT47DQorZGVmIENNT1ZfUkZQMzIgOiBJPDAsIFBzZXVkbywNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIFJGUDMyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBSRlAzMjokc3JjMSwgUkZQMzI6JHNyYzIsIGk4aW1tOiRjb25kKSwNCisgICAgICAgICAgICAgICAgICAgICIjQ01PVl9SRlAzMiBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFJGUDMyOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgIChYODZjbW92IFJGUDMyOiRzcmMxLCBSRlAzMjokc3JjMiwgaW1tOiRjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZMQUdTKSldPjsNCitkZWYgQ01PVl9SRlA2NCA6IEk8MCwgUHNldWRvLA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgUkZQNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW5zIFJGUDY0OiRzcmMxLCBSRlA2NDokc3JjMiwgaThpbW06JGNvbmQpLA0KKyAgICAgICAgICAgICAgICAgICAgIiNDTU9WX1JGUDY0IFBTRVVETyEiLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgUkZQNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgKFg4NmNtb3YgUkZQNjQ6JHNyYzEsIFJGUDY0OiRzcmMyLCBpbW06JGNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkxBR1MpKV0+Ow0KK2RlZiBDTU9WX1JGUDgwIDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBSRlA4MDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgIChpbnMgUkZQODA6JHNyYzEsIFJGUDgwOiRzcmMyLCBpOGltbTokY29uZCksDQorICAgICAgICAgICAgICAgICAgICAiI0NNT1ZfUkZQODAgUFNFVURPISIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBSRlA4MDokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAoWDg2Y21vdiBSRlA4MDokc3JjMSwgUkZQODA6JHNyYzIsIGltbTokY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGTEFHUykpXT47DQorfSAvLyBQcmVkaWNhdGVzID0gW05vQ01vdl0NCit9IC8vIFVzZXNDdXN0b21JbnNlcnRlciA9IDEsIENvbnN0cmFpbnRzID0gIiIsIERlZnMgPSBbRUZMQUdTXSANCit9IC8vIFVzZXMgPSBbRUZMQUdTXQ0KKw0KKw0KKy8vIHVuYXJ5IGluc3RydWN0aW9ucw0KK2xldCBDb2RlU2l6ZSA9IDIgaW4gew0KK2xldCBEZWZzID0gW0VGTEFHU10gaW4gew0KK2RlZiBORUc4ciAgOiBJPDB4RjYsIE1STTNyLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICJuZWd7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoaW5lZyBHUjg6JHNyYzEpKSwNCisgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCitkZWYgTkVHMTZyIDogSTwweEY3LCBNUk0zciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxKSwNCisgICAgICAgICAgICAgICAibmVne3d9XHQkZHN0IiwNCisgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChpbmVnIEdSMTY6JHNyYzEpKSwNCisgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwgT3BTaXplOw0KK2RlZiBORUczMnIgOiBJPDB4RjcsIE1STTNyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICJuZWd7bH1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKGluZWcgR1IzMjokc3JjMSkpLA0KKyAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKyAgICAgICAgICAgICAgICANCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7DQorICBkZWYgTkVHOG0gIDogSTwweEY2LCBNUk0zbSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0KSwNCisgICAgICAgICAgICAgICAgICJuZWd7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoaW5lZyAobG9hZGk4IGFkZHI6JGRzdCkpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorICBkZWYgTkVHMTZtIDogSTwweEY3LCBNUk0zbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJuZWd7d31cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoaW5lZyAobG9hZGkxNiBhZGRyOiRkc3QpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LCBPcFNpemU7DQorICBkZWYgTkVHMzJtIDogSTwweEY3LCBNUk0zbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJuZWd7bH1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoaW5lZyAobG9hZGkzMiBhZGRyOiRkc3QpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiIg0KK30gLy8gRGVmcyA9IFtFRkxBR1NdDQorDQorLy8gTWF0Y2ggeG9yIC0xIHRvIG5vdC4gRmF2b3JzIHRoZXNlIG92ZXIgYSBtb3ZlIGltbSArIHhvciB0byBzYXZlIGNvZGUgc2l6ZS4NCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTUgaW4gew0KK2RlZiBOT1Q4ciAgOiBJPDB4RjYsIE1STTJyLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICJub3R7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAobm90IEdSODokc3JjMSkpXT47DQorZGVmIE5PVDE2ciA6IEk8MHhGNywgTVJNMnIsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSksDQorICAgICAgICAgICAgICAgIm5vdHt3fVx0JGRzdCIsDQorICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAobm90IEdSMTY6JHNyYzEpKV0+LCBPcFNpemU7DQorZGVmIE5PVDMyciA6IEk8MHhGNywgTVJNMnIsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSksDQorICAgICAgICAgICAgICAgIm5vdHtsfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAobm90IEdSMzI6JHNyYzEpKV0+Ow0KK30NCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7DQorICBkZWYgTk9UOG0gIDogSTwweEY2LCBNUk0ybSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0KSwNCisgICAgICAgICAgICAgICAgICJub3R7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAobm90IChsb2FkaTggYWRkcjokZHN0KSksIGFkZHI6JGRzdCldPjsNCisgIGRlZiBOT1QxNm0gOiBJPDB4RjcsIE1STTJtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgIm5vdHt3fVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChub3QgKGxvYWRpMTYgYWRkcjokZHN0KSksIGFkZHI6JGRzdCldPiwgT3BTaXplOw0KKyAgZGVmIE5PVDMybSA6IEk8MHhGNywgTVJNMm0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAibm90e2x9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKG5vdCAobG9hZGkzMiBhZGRyOiRkc3QpKSwgYWRkcjokZHN0KV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiIg0KK30gLy8gQ29kZVNpemUNCisNCisvLyBUT0RPOiBpbmMvZGVjIGlzIHNsb3cgZm9yIFA0LCBidXQgZmFzdCBmb3IgUGVudGl1bS1NLg0KK2xldCBEZWZzID0gW0VGTEFHU10gaW4gew0KK2xldCBDb2RlU2l6ZSA9IDIgaW4NCitkZWYgSU5DOHIgIDogSTwweEZFLCBNUk0wciwgKG91dHMgR1I4IDokZHN0KSwgKGlucyBHUjggOiRzcmMxKSwNCisgICAgICAgICAgICAgICAiaW5je2J9XHQkZHN0IiwNCisgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgRUZMQUdTLCAoWDg2aW5jX2ZsYWcgR1I4OiRzcmMxKSldPjsNCisNCitsZXQgaXNDb252ZXJ0aWJsZVRvVGhyZWVBZGRyZXNzID0gMSwgQ29kZVNpemUgPSAxIGluIHsgIC8vIENhbiB4Zm9ybSBpbnRvIExFQS4NCitkZWYgSU5DMTZyIDogSTwweDQwLCBBZGRSZWdGcm0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSksIA0KKyAgICAgICAgICAgICAgICJpbmN7d31cdCRkc3QiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2aW5jX2ZsYWcgR1IxNjokc3JjMSkpXT4sDQorICAgICAgICAgICAgIE9wU2l6ZSwgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorZGVmIElOQzMyciA6IEk8MHg0MCwgQWRkUmVnRnJtLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLCANCisgICAgICAgICAgICAgICAiaW5je2x9XHQkZHN0IiwNCisgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmluY19mbGFnIEdSMzI6JHNyYzEpKV0+LA0KKyAgICAgICAgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCit9DQorbGV0IENvbnN0cmFpbnRzID0gIiIsIENvZGVTaXplID0gMiBpbiB7DQorICBkZWYgSU5DOG0gIDogSTwweEZFLCBNUk0wbSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0KSwgImluY3tifVx0JGRzdCIsDQorICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkaTggYWRkcjokZHN0KSwgMSksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorICBkZWYgSU5DMTZtIDogSTwweEZGLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0KSwgImluY3t3fVx0JGRzdCIsDQorICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkaTE2IGFkZHI6JGRzdCksIDEpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LA0KKyAgICAgICAgICAgICAgIE9wU2l6ZSwgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorICBkZWYgSU5DMzJtIDogSTwweEZGLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwgImluY3tsfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkaTMyIGFkZHI6JGRzdCksIDEpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LA0KKyAgICAgICAgICAgICAgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiIiwgQ29kZVNpemUgPSAyDQorDQorbGV0IENvZGVTaXplID0gMiBpbg0KK2RlZiBERUM4ciAgOiBJPDB4RkUsIE1STTFyLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICJkZWN7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCBFRkxBR1MsIChYODZkZWNfZmxhZyBHUjg6JHNyYzEpKV0+Ow0KK2xldCBpc0NvbnZlcnRpYmxlVG9UaHJlZUFkZHJlc3MgPSAxLCBDb2RlU2l6ZSA9IDEgaW4geyAgIC8vIENhbiB4Zm9ybSBpbnRvIExFQS4NCitkZWYgREVDMTZyIDogSTwweDQ4LCBBZGRSZWdGcm0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSksIA0KKyAgICAgICAgICAgICAgICJkZWN7d31cdCRkc3QiLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2ZGVjX2ZsYWcgR1IxNjokc3JjMSkpXT4sDQorICAgICAgICAgICAgIE9wU2l6ZSwgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorZGVmIERFQzMyciA6IEk8MHg0OCwgQWRkUmVnRnJtLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLCANCisgICAgICAgICAgICAgICAiZGVje2x9XHQkZHN0IiwNCisgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmRlY19mbGFnIEdSMzI6JHNyYzEpKV0+LA0KKyAgICAgICAgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCit9IC8vIENvZGVTaXplID0gMg0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIiLCBDb2RlU2l6ZSA9IDIgaW4gew0KKyAgZGVmIERFQzhtICA6IEk8MHhGRSwgTVJNMW0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCksICJkZWN7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZGk4IGFkZHI6JGRzdCksIC0xKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisgIGRlZiBERUMxNm0gOiBJPDB4RkYsIE1STTFtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLCAiZGVje3d9XHQkZHN0IiwNCisgICAgICAgICAgICAgICBbKHN0b3JlIChhZGQgKGxvYWRpMTYgYWRkcjokZHN0KSwgLTEpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LA0KKyAgICAgICAgICAgICAgIE9wU2l6ZSwgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorICBkZWYgREVDMzJtIDogSTwweEZGLCBNUk0xbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwgImRlY3tsfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkaTMyIGFkZHI6JGRzdCksIC0xKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwNCisgICAgICAgICAgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiIsIENvZGVTaXplID0gMg0KK30gLy8gRGVmcyA9IFtFRkxBR1NdDQorDQorLy8gTG9naWNhbCBvcGVyYXRvcnMuLi4NCitsZXQgRGVmcyA9IFtFRkxBR1NdIGluIHsNCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7ICAgLy8gWCA9IEFORCBZLCBaICAgLS0+IFggPSBBTkQgWiwgWQ0KK2RlZiBBTkQ4cnIgIDogSTwweDIwLCBNUk1EZXN0UmVnLA0KKyAgICAgICAgICAgICAgIChvdXRzIEdSOCA6JGRzdCksIChpbnMgR1I4IDokc3JjMSwgR1I4IDokc3JjMiksDQorICAgICAgICAgICAgICAgImFuZHtifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIEVGTEFHUywgKFg4NmFuZF9mbGFnIEdSODokc3JjMSwgR1I4OiRzcmMyKSldPjsNCitkZWYgQU5EMTZyciA6IEk8MHgyMSwgTVJNRGVzdFJlZywNCisgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgImFuZHt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2YW5kX2ZsYWcgR1IxNjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUjE2OiRzcmMyKSldPiwgT3BTaXplOw0KK2RlZiBBTkQzMnJyIDogSTwweDIxLCBNUk1EZXN0UmVnLCANCisgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgImFuZHtsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgRUZMQUdTLCAoWDg2YW5kX2ZsYWcgR1IzMjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUjMyOiRzcmMyKSldPjsNCit9DQorDQorLy8gQU5EIGluc3RydWN0aW9ucyB3aXRoIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpbiBSRUcgYW5kIHRoZSBzb3VyY2UgcmVnaXN0ZXINCisvLyAgIGluIFIvTS4gIEluY2x1ZGVkIGZvciB0aGUgZGlzYXNzZW1ibGVyLg0KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorZGVmIEFORDhycl9SRVYgOiBJPDB4MjIsIE1STVNyY1JlZywgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSwgR1I4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAiYW5ke2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+Ow0KK2RlZiBBTkQxNnJyX1JFViA6IEk8MHgyMywgTVJNU3JjUmVnLCAob3V0cyBHUjE2OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJhbmR7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIE9wU2l6ZTsNCitkZWYgQU5EMzJycl9SRVYgOiBJPDB4MjMsIE1STVNyY1JlZywgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiYW5ke2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+Ow0KK30NCisNCitkZWYgQU5EOHJtICAgOiBJPDB4MjIsIE1STVNyY01lbSwgDQorICAgICAgICAgICAgICAgICAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEsIGk4bWVtIDokc3JjMiksDQorICAgICAgICAgICAgICAgICAiYW5ke2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIEVGTEFHUywgKFg4NmFuZF9mbGFnIEdSODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkaTggYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBBTkQxNnJtICA6IEk8MHgyMywgTVJNU3JjTWVtLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaTE2bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJhbmR7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIEVGTEFHUywgKFg4NmFuZF9mbGFnIEdSMTY6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWRpMTYgYWRkcjokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgIE9wU2l6ZTsNCitkZWYgQU5EMzJybSAgOiBJPDB4MjMsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJhbmR7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmFuZF9mbGFnIEdSMzI6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWRpMzIgYWRkcjokc3JjMikpKV0+Ow0KKw0KK2RlZiBBTkQ4cmkgICA6IElpODwweDgwLCBNUk00ciwgDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSOCA6JGRzdCksIChpbnMgR1I4IDokc3JjMSwgaThpbW0gOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImFuZHtifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCBFRkxBR1MsIChYODZhbmRfZmxhZyBHUjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JHNyYzIpKV0+Ow0KK2RlZiBBTkQxNnJpICA6IElpMTY8MHg4MSwgTVJNNHIsIA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBpMTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImFuZHt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIEVGTEFHUywgKFg4NmFuZF9mbGFnIEdSMTY6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokc3JjMikpXT4sIE9wU2l6ZTsNCitkZWYgQU5EMzJyaSAgOiBJaTMyPDB4ODEsIE1STTRyLCANCisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJhbmR7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCBFRkxBR1MsIChYODZhbmRfZmxhZyBHUjMyOiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JHNyYzIpKV0+Ow0KK2RlZiBBTkQxNnJpOCA6IElpODwweDgzLCBNUk00ciwgDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaTE2aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiYW5ke3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsIChYODZhbmRfZmxhZyBHUjE2OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxNmltbVNFeHQ4OiRzcmMyKSldPiwNCisgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBBTkQzMnJpOCA6IElpODwweDgzLCBNUk00ciwgDQorICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiYW5ke2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCBFRkxBR1MsIChYODZhbmRfZmxhZyBHUjMyOiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMmltbVNFeHQ4OiRzcmMyKSldPjsNCisNCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7DQorICBkZWYgQU5EOG1yICAgOiBJPDB4MjAsIE1STURlc3RNZW0sDQorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCwgR1I4IDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImFuZHtifVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhbmQgKGxvYWQgYWRkcjokZHN0KSwgR1I4OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisgIGRlZiBBTkQxNm1yICA6IEk8MHgyMSwgTVJNRGVzdE1lbSwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBHUjE2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiYW5ke3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFuZCAobG9hZCBhZGRyOiRkc3QpLCBHUjE2OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwNCisgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIEFORDMybXIgIDogSTwweDIxLCBNUk1EZXN0TWVtLA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJhbmR7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYW5kIChsb2FkIGFkZHI6JGRzdCksIEdSMzI6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKyAgZGVmIEFORDhtaSAgIDogSWk4PDB4ODAsIE1STTRtLA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCwgaThpbW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJhbmR7Yn1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYW5kIChsb2FkaTggYWRkcjokZHN0KSwgaW1tOiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisgIGRlZiBBTkQxNm1pICA6IElpMTY8MHg4MSwgTVJNNG0sDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgaTE2aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiYW5ke3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFuZCAobG9hZGkxNiBhZGRyOiRkc3QpLCBpbW06JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorICBkZWYgQU5EMzJtaSAgOiBJaTMyPDB4ODEsIE1STTRtLA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImFuZHtsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhbmQgKGxvYWRpMzIgYWRkcjokZHN0KSwgaW1tOiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisgIGRlZiBBTkQxNm1pOCA6IElpODwweDgzLCBNUk00bSwNCisgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIGkxNmk4aW1tIDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAiYW5ke3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFuZCAobG9hZCBhZGRyOiRkc3QpLCBpMTZpbW1TRXh0ODokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT4sDQorICAgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIEFORDMybWk4IDogSWk4PDB4ODMsIE1STTRtLA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaTMyaThpbW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJhbmR7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgWyhzdG9yZSAoYW5kIChsb2FkIGFkZHI6JGRzdCksIGkzMmltbVNFeHQ4OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisNCisgIGRlZiBBTkQ4aTggOiBJaTg8MHgyNCwgUmF3RnJtLCAob3V0cyksIChpbnMgaThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJhbmR7Yn1cdHskc3JjLCAlYWx8JWFsLCAkc3JjfSIsIFtdPjsNCisgIGRlZiBBTkQxNmkxNiA6IElpMTY8MHgyNSwgUmF3RnJtLCAob3V0cyksIChpbnMgaTE2aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiYW5ke3d9XHR7JHNyYywgJWF4fCVheCwgJHNyY30iLCBbXT4sIE9wU2l6ZTsNCisgIGRlZiBBTkQzMmkzMiA6IElpMzI8MHgyNSwgUmF3RnJtLCAob3V0cyksIChpbnMgaTMyaW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiYW5ke2x9XHR7JHNyYywgJWVheHwlZWF4LCAkc3JjfSIsIFtdPjsNCisNCit9IC8vIENvbnN0cmFpbnRzID0gIiINCisNCisNCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7ICAgLy8gWCA9IE9SIFksIFogICAtLT4gWCA9IE9SIFosIFkNCitkZWYgT1I4cnIgICAgOiBJPDB4MDgsIE1STURlc3RSZWcsIChvdXRzIEdSOCA6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgKGlucyBHUjggOiRzcmMxLCBHUjggOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJvcntifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgRUZMQUdTLCAoWDg2b3JfZmxhZyBHUjg6JHNyYzEsIEdSODokc3JjMikpXT47DQorZGVmIE9SMTZyciAgIDogSTwweDA5LCBNUk1EZXN0UmVnLCAob3V0cyBHUjE2OiRkc3QpLCANCisgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAib3J7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsIChYODZvcl9mbGFnIEdSMTY6JHNyYzEsR1IxNjokc3JjMikpXT4sDQorICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBPUjMycnIgICA6IEk8MHgwOSwgTVJNRGVzdFJlZywgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgIm9ye2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgRUZMQUdTLCAoWDg2b3JfZmxhZyBHUjMyOiRzcmMxLEdSMzI6JHNyYzIpKV0+Ow0KK30NCisNCisvLyBPUiBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaW4gUkVHIGFuZCB0aGUgc291cmNlIHJlZ2lzdGVyDQorLy8gICBpbiBSL00uICBJbmNsdWRlZCBmb3IgdGhlIGRpc2Fzc2VtYmxlci4NCitsZXQgaXNDb2RlR2VuT25seSA9IDEgaW4gew0KK2RlZiBPUjhycl9SRVYgOiBJPDB4MEEsIE1STVNyY1JlZywgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSwgR1I4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAib3J7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT47DQorZGVmIE9SMTZycl9SRVYgOiBJPDB4MEIsIE1STVNyY1JlZywgKG91dHMgR1IxNjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgIm9ye3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBPcFNpemU7DQorZGVmIE9SMzJycl9SRVYgOiBJPDB4MEIsIE1STVNyY1JlZywgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJvcntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPjsNCit9DQorICAgICAgICAgICAgICAgICAgDQorZGVmIE9SOHJtICAgIDogSTwweDBBLCBNUk1TcmNNZW0sIChvdXRzIEdSOCA6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgKGlucyBHUjggOiRzcmMxLCBpOG1lbSA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgIm9ye2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIEVGTEFHUywgKFg4Nm9yX2ZsYWcgR1I4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZCBhZGRyOiRzcmMyKSkpXT47DQorZGVmIE9SMTZybSAgIDogSTwweDBCLCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMxLCBpMTZtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgIm9ye3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsIChYODZvcl9mbGFnIEdSMTY6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZCBhZGRyOiRzcmMyKSkpXT4sDQorICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBPUjMycm0gICA6IEk8MHgwQiwgTVJNU3JjTWVtLCAob3V0cyBHUjMyOiRkc3QpLCANCisgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJvcntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgRUZMQUdTLCAoWDg2b3JfZmxhZyBHUjMyOiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KKw0KK2RlZiBPUjhyaSAgICA6IElpOCA8MHg4MCwgTVJNMXIsIChvdXRzIEdSOCA6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjggOiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAib3J7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsRUZMQUdTLCAoWDg2b3JfZmxhZyBHUjg6JHNyYzEsIGltbTokc3JjMikpXT47DQorZGVmIE9SMTZyaSAgIDogSWkxNjwweDgxLCBNUk0xciwgKG91dHMgR1IxNjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMTY6JHNyYzEsIGkxNmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAib3J7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCANCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2b3JfZmxhZyBHUjE2OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRzcmMyKSldPiwgT3BTaXplOw0KK2RlZiBPUjMycmkgICA6IElpMzI8MHg4MSwgTVJNMXIsIChvdXRzIEdSMzI6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjMyOiRzcmMxLCBpMzJpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgIm9ye2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgRUZMQUdTLCAoWDg2b3JfZmxhZyBHUjMyOiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokc3JjMikpXT47DQorDQorZGVmIE9SMTZyaTggIDogSWk4PDB4ODMsIE1STTFyLCAob3V0cyBHUjE2OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMxLCBpMTZpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJvcnt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2b3JfZmxhZyBHUjE2OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxNmltbVNFeHQ4OiRzcmMyKSldPiwgT3BTaXplOw0KK2RlZiBPUjMycmk4ICA6IElpODwweDgzLCBNUk0xciwgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAib3J7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4Nm9yX2ZsYWcgR1IzMjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMmltbVNFeHQ4OiRzcmMyKSldPjsNCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7DQorICBkZWYgT1I4bXIgIDogSTwweDA4LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaThtZW06JGRzdCwgR1I4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgIm9ye2J9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChvciAobG9hZCBhZGRyOiRkc3QpLCBHUjg6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisgIGRlZiBPUjE2bXIgOiBJPDB4MDksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgR1IxNjokc3JjKSwNCisgICAgICAgICAgICAgICAgICJvcnt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAob3IgKGxvYWQgYWRkcjokZHN0KSwgR1IxNjokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LCBPcFNpemU7DQorICBkZWYgT1IzMm1yIDogSTwweDA5LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAib3J7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKG9yIChsb2FkIGFkZHI6JGRzdCksIEdSMzI6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisgIGRlZiBPUjhtaSAgICA6IElpODwweDgwLCBNUk0xbSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0LCBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICJvcntifVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAob3IgKGxvYWRpOCBhZGRyOiRkc3QpLCBpbW06JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisgIGRlZiBPUjE2bWkgICA6IElpMTY8MHg4MSwgTVJNMW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgaTE2aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgIm9ye3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChvciAobG9hZGkxNiBhZGRyOiRkc3QpLCBpbW06JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwNCisgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCisgIGRlZiBPUjMybWkgICA6IElpMzI8MHg4MSwgTVJNMW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaTMyaW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgIm9ye2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChvciAobG9hZGkzMiBhZGRyOiRkc3QpLCBpbW06JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisgIGRlZiBPUjE2bWk4ICA6IElpODwweDgzLCBNUk0xbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpMTZpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICJvcnt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAob3IgKGxvYWQgYWRkcjokZHN0KSwgaTE2aW1tU0V4dDg6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwNCisgICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorICBkZWYgT1IzMm1pOCAgOiBJaTg8MHg4MywgTVJNMW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaTMyaThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAib3J7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKG9yIChsb2FkIGFkZHI6JGRzdCksIGkzMmltbVNFeHQ4OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorICAgICAgICAgICAgICAgICAgDQorICBkZWYgT1I4aTggOiBJaTggPDB4MEMsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAib3J7Yn1cdHskc3JjLCAlYWx8JWFsLCAkc3JjfSIsIFtdPjsNCisgIGRlZiBPUjE2aTE2IDogSWkxNiA8MHgwRCwgUmF3RnJtLCAob3V0cyksIChpbnMgaTE2aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAib3J7d31cdHskc3JjLCAlYXh8JWF4LCAkc3JjfSIsIFtdPiwgT3BTaXplOw0KKyAgZGVmIE9SMzJpMzIgOiBJaTMyIDwweDBELCBSYXdGcm0sIChvdXRzKSwgKGlucyBpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJvcntsfVx0eyRzcmMsICVlYXh8JWVheCwgJHNyY30iLCBbXT47DQorfSAvLyBDb25zdHJhaW50cyA9ICIiDQorDQorDQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4geyAvLyBYID0gWE9SIFksIFogLS0+IFggPSBYT1IgWiwgWQ0KKyAgZGVmIFhPUjhyciAgIDogSTwweDMwLCBNUk1EZXN0UmVnLA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEsIEdSOCA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAieG9ye2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIEVGTEFHUywgKFg4Nnhvcl9mbGFnIEdSODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSODokc3JjMikpXT47DQorICBkZWYgWE9SMTZyciAgOiBJPDB4MzEsIE1STURlc3RSZWcsIA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgInhvcnt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2eG9yX2ZsYWcgR1IxNjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUjE2OiRzcmMyKSldPiwgT3BTaXplOw0KKyAgZGVmIFhPUjMycnIgIDogSTwweDMxLCBNUk1EZXN0UmVnLCANCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgICJ4b3J7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4Nnhvcl9mbGFnIEdSMzI6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1IzMjokc3JjMikpXT47DQorfSAvLyBpc0NvbW11dGFibGUgPSAxDQorDQorLy8gWE9SIGluc3RydWN0aW9ucyB3aXRoIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpbiBSRUcgYW5kIHRoZSBzb3VyY2UgcmVnaXN0ZXINCisvLyAgIGluIFIvTS4gIEluY2x1ZGVkIGZvciB0aGUgZGlzYXNzZW1ibGVyLg0KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorZGVmIFhPUjhycl9SRVYgOiBJPDB4MzIsIE1STVNyY1JlZywgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSwgR1I4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAieG9ye2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+Ow0KK2RlZiBYT1IxNnJyX1JFViA6IEk8MHgzMywgTVJNU3JjUmVnLCAob3V0cyBHUjE2OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJ4b3J7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIE9wU2l6ZTsNCitkZWYgWE9SMzJycl9SRVYgOiBJPDB4MzMsIE1STVNyY1JlZywgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAieG9ye2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+Ow0KK30NCisNCitkZWYgWE9SOHJtICAgOiBJPDB4MzIsIE1STVNyY01lbSwgDQorICAgICAgICAgICAgICAgICAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSODokc3JjMSwgaThtZW0gOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAieG9ye2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCBFRkxBR1MsIChYODZ4b3JfZmxhZyBHUjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBYT1IxNnJtICA6IEk8MHgzMywgTVJNU3JjTWVtLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaTE2bWVtOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAieG9ye3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2eG9yX2ZsYWcgR1IxNjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgYWRkcjokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBYT1IzMnJtICA6IEk8MHgzMywgTVJNU3JjTWVtLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAieG9ye2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgRUZMQUdTLCAoWDg2eG9yX2ZsYWcgR1IzMjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KKw0KK2RlZiBYT1I4cmkgIDogSWk4PDB4ODAsIE1STTZyLCANCisgICAgICAgICAgICAgICAgICAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMxLCBpOGltbTokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICJ4b3J7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCBFRkxBR1MsIChYODZ4b3JfZmxhZyBHUjg6JHNyYzEsIGltbTokc3JjMikpXT47DQorZGVmIFhPUjE2cmkgOiBJaTE2PDB4ODEsIE1STTZyLCANCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBpMTZpbW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgInhvcnt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2eG9yX2ZsYWcgR1IxNjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JHNyYzIpKV0+LCBPcFNpemU7DQorZGVmIFhPUjMycmkgIDogSWkzMjwweDgxLCBNUk02ciwgDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMmltbTokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICAgInhvcntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4Nnhvcl9mbGFnIEdSMzI6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokc3JjMikpXT47DQorZGVmIFhPUjE2cmk4IDogSWk4PDB4ODMsIE1STTZyLCANCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBpMTZpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJ4b3J7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIEVGTEFHUywgKFg4Nnhvcl9mbGFnIEdSMTY6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE2aW1tU0V4dDg6JHNyYzIpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorZGVmIFhPUjMycmk4IDogSWk4PDB4ODMsIE1STTZyLCANCisgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJ4b3J7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4Nnhvcl9mbGFnIEdSMzI6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyaW1tU0V4dDg6JHNyYzIpKV0+Ow0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIiIGluIHsNCisgIGRlZiBYT1I4bXIgICA6IEk8MHgzMCwgTVJNRGVzdE1lbSwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0LCBHUjggOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAieG9ye2J9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHhvciAobG9hZCBhZGRyOiRkc3QpLCBHUjg6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKyAgZGVmIFhPUjE2bXIgIDogSTwweDMxLCBNUk1EZXN0TWVtLA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJ4b3J7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoeG9yIChsb2FkIGFkZHI6JGRzdCksIEdSMTY6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LA0KKyAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorICBkZWYgWE9SMzJtciAgOiBJPDB4MzEsIE1STURlc3RNZW0sDQorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgInhvcntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlICh4b3IgKGxvYWQgYWRkcjokZHN0KSwgR1IzMjokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorICBkZWYgWE9SOG1pICAgOiBJaTg8MHg4MCwgTVJNNm0sDQorICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0LCBpOGltbSA6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInhvcntifVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoeG9yIChsb2FkaTggYWRkcjokZHN0KSwgaW1tOiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorICBkZWYgWE9SMTZtaSAgOiBJaTE2PDB4ODEsIE1STTZtLA0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIGkxNmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgInhvcnt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlICh4b3IgKGxvYWRpMTYgYWRkcjokZHN0KSwgaW1tOiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwNCisgICAgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIFhPUjMybWkgIDogSWkzMjwweDgxLCBNUk02bSwNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJ4b3J7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoeG9yIChsb2FkaTMyIGFkZHI6JGRzdCksIGltbTokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorICBkZWYgWE9SMTZtaTggOiBJaTg8MHg4MywgTVJNNm0sDQorICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpMTZpOGltbSA6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInhvcnt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoeG9yIChsb2FkIGFkZHI6JGRzdCksIGkxNmltbVNFeHQ4OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT4sDQorICAgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIFhPUjMybWk4IDogSWk4PDB4ODMsIE1STTZtLA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaTMyaThpbW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJ4b3J7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHhvciAobG9hZCBhZGRyOiRkc3QpLCBpMzJpbW1TRXh0ODokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKyAgICAgICAgICAgICAgICAgIA0KKyAgZGVmIFhPUjhpOCAgIDogSWk4IDwweDM0LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgInhvcntifVx0eyRzcmMsICVhbHwlYWwsICRzcmN9IiwgW10+Ow0KKyAgZGVmIFhPUjE2aTE2IDogSWkxNjwweDM1LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpMTZpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJ4b3J7d31cdHskc3JjLCAlYXh8JWF4LCAkc3JjfSIsIFtdPiwgT3BTaXplOw0KKyAgZGVmIFhPUjMyaTMyIDogSWkzMjwweDM1LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJ4b3J7bH1cdHskc3JjLCAlZWF4fCVlYXgsICRzcmN9IiwgW10+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiIg0KK30gLy8gRGVmcyA9IFtFRkxBR1NdDQorDQorLy8gU2hpZnQgaW5zdHJ1Y3Rpb25zDQorbGV0IERlZnMgPSBbRUZMQUdTXSBpbiB7DQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgU0hMOHJDTCAgOiBJPDB4RDIsIE1STTRyLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInNobHtifVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChzaGwgR1I4OiRzcmMxLCBDTCkpXT47DQorZGVmIFNITDE2ckNMIDogSTwweEQzLCBNUk00ciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICJzaGx7d31cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKHNobCBHUjE2OiRzcmMxLCBDTCkpXT4sIE9wU2l6ZTsNCitkZWYgU0hMMzJyQ0wgOiBJPDB4RDMsIE1STTRyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInNobHtsfVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoc2hsIEdSMzI6JHNyYzEsIENMKSldPjsNCit9IC8vIFVzZXMgPSBbQ0xdDQorDQorZGVmIFNITDhyaSAgIDogSWk4PDB4QzAsIE1STTRyLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInNobHtifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoc2hsIEdSODokc3JjMSwgKGk4IGltbTokc3JjMikpKV0+Ow0KKyAgICAgICAgICAgICAgICAgICANCitsZXQgaXNDb252ZXJ0aWJsZVRvVGhyZWVBZGRyZXNzID0gMSBpbiB7ICAgLy8gQ2FuIHRyYW5zZm9ybSBpbnRvIExFQS4NCitkZWYgU0hMMTZyaSAgOiBJaTg8MHhDMSwgTVJNNHIsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAic2hse3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoc2hsIEdSMTY6JHNyYzEsIChpOCBpbW06JHNyYzIpKSldPiwgT3BTaXplOw0KK2RlZiBTSEwzMnJpICA6IElpODwweEMxLCBNUk00ciwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJzaGx7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChzaGwgR1IzMjokc3JjMSwgKGk4IGltbTokc3JjMikpKV0+Ow0KKw0KKy8vIE5PVEU6IFdlIGRvbid0IGluY2x1ZGUgcGF0dGVybnMgZm9yIHNoaWZ0cyBvZiBhIHJlZ2lzdGVyIGJ5IG9uZSwgYmVjYXVzZQ0KKy8vICdhZGQgcmVnLHJlZycgaXMgY2hlYXBlci4NCisNCitkZWYgU0hMOHIxICAgOiBJPDB4RDAsIE1STTRyLCAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICJzaGx7Yn1cdCRkc3QiLCBbXT47DQorZGVmIFNITDE2cjEgIDogSTwweEQxLCBNUk00ciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICJzaGx7d31cdCRkc3QiLCBbXT4sIE9wU2l6ZTsNCitkZWYgU0hMMzJyMSAgOiBJPDB4RDEsIE1STTRyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInNobHtsfVx0JGRzdCIsIFtdPjsNCisNCit9IC8vIGlzQ29udmVydGlibGVUb1RocmVlQWRkcmVzcyA9IDENCisNCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7DQorICBsZXQgVXNlcyA9IFtDTF0gaW4gew0KKyAgZGVmIFNITDhtQ0wgIDogSTwweEQyLCBNUk00bSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInNobHtifVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzaGwgKGxvYWRpOCBhZGRyOiRkc3QpLCBDTCksIGFkZHI6JGRzdCldPjsNCisgIGRlZiBTSEwxNm1DTCA6IEk8MHhEMywgTVJNNG0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzaGx7d31cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc2hsIChsb2FkaTE2IGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+LCBPcFNpemU7DQorICBkZWYgU0hMMzJtQ0wgOiBJPDB4RDMsIE1STTRtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic2hse2x9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNobCAobG9hZGkzMiBhZGRyOiRkc3QpLCBDTCksIGFkZHI6JGRzdCldPjsNCisgIH0NCisgIGRlZiBTSEw4bWkgICA6IElpODwweEMwLCBNUk00bSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0LCBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAic2hse2J9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc2hsIChsb2FkaTggYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCldPjsNCisgIGRlZiBTSEwxNm1pICA6IElpODwweEMxLCBNUk00bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAic2hse3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChzaGwgKGxvYWRpMTYgYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorICBkZWYgU0hMMzJtaSAgOiBJaTg8MHhDMSwgTVJNNG0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInNobHtsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc2hsIChsb2FkaTMyIGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpXT47DQorDQorICAvLyBTaGlmdCBieSAxDQorICBkZWYgU0hMOG0xICAgOiBJPDB4RDAsIE1STTRtLCAob3V0cyksIChpbnMgaThtZW0gOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic2hse2J9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzaGwgKGxvYWRpOCBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT47DQorICBkZWYgU0hMMTZtMSAgOiBJPDB4RDEsIE1STTRtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic2hse3d9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNobCAobG9hZGkxNiBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIFNITDMybTEgIDogSTwweEQxLCBNUk00bSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInNobHtsfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChzaGwgKGxvYWRpMzIgYWRkcjokZHN0KSwgKGk4IDEpKSwgYWRkcjokZHN0KV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiIg0KKw0KK2xldCBVc2VzID0gW0NMXSBpbiB7DQorZGVmIFNIUjhyQ0wgIDogSTwweEQyLCBNUk01ciwgKG91dHMgR1I4IDokZHN0KSwgKGlucyBHUjggOiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICJzaHJ7Yn1cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoc3JsIEdSODokc3JjMSwgQ0wpKV0+Ow0KK2RlZiBTSFIxNnJDTCA6IEk8MHhEMywgTVJNNXIsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSksDQorICAgICAgICAgICAgICAgICAic2hye3d9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzcmwgR1IxNjokc3JjMSwgQ0wpKV0+LCBPcFNpemU7DQorZGVmIFNIUjMyckNMIDogSTwweEQzLCBNUk01ciwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICJzaHJ7bH1cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHNybCBHUjMyOiRzcmMxLCBDTCkpXT47DQorfQ0KKw0KK2RlZiBTSFI4cmkgICA6IElpODwweEMwLCBNUk01ciwgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAic2hye2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChzcmwgR1I4OiRzcmMxLCAoaTggaW1tOiRzcmMyKSkpXT47DQorZGVmIFNIUjE2cmkgIDogSWk4PDB4QzEsIE1STTVyLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInNocnt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKHNybCBHUjE2OiRzcmMxLCAoaTggaW1tOiRzcmMyKSkpXT4sIE9wU2l6ZTsNCitkZWYgU0hSMzJyaSAgOiBJaTg8MHhDMSwgTVJNNXIsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAic2hye2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoc3JsIEdSMzI6JHNyYzEsIChpOCBpbW06JHNyYzIpKSldPjsNCisNCisvLyBTaGlmdCBieSAxDQorZGVmIFNIUjhyMSAgIDogSTwweEQwLCBNUk01ciwgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSksDQorICAgICAgICAgICAgICAgICAic2hye2J9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoc3JsIEdSODokc3JjMSwgKGk4IDEpKSldPjsNCitkZWYgU0hSMTZyMSAgOiBJPDB4RDEsIE1STTVyLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInNocnt3fVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzcmwgR1IxNjokc3JjMSwgKGk4IDEpKSldPiwgT3BTaXplOw0KK2RlZiBTSFIzMnIxICA6IEk8MHhEMSwgTVJNNXIsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSksDQorICAgICAgICAgICAgICAgICAic2hye2x9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHNybCBHUjMyOiRzcmMxLCAoaTggMSkpKV0+Ow0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIiIGluIHsNCisgIGxldCBVc2VzID0gW0NMXSBpbiB7DQorICBkZWYgU0hSOG1DTCAgOiBJPDB4RDIsIE1STTVtLCAob3V0cyksIChpbnMgaThtZW0gOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic2hye2J9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNybCAobG9hZGk4IGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIFNIUjE2bUNMIDogSTwweEQzLCBNUk01bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInNocnt3fVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzcmwgKGxvYWRpMTYgYWRkcjokZHN0KSwgQ0wpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCisgIGRlZiBTSFIzMm1DTCA6IEk8MHhEMywgTVJNNW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzaHJ7bH1cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3JsIChsb2FkaTMyIGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+Ow0KKyAgfQ0KKyAgZGVmIFNIUjhtaSAgIDogSWk4PDB4QzAsIE1STTVtLCAob3V0cyksIChpbnMgaThtZW0gOiRkc3QsIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJzaHJ7Yn1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzcmwgKGxvYWRpOCBhZGRyOiRkc3QpLCAoaTggaW1tOiRzcmMpKSwgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIFNIUjE2bWkgIDogSWk4PDB4QzEsIE1STTVtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJzaHJ7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNybCAobG9hZGkxNiBhZGRyOiRkc3QpLCAoaTggaW1tOiRzcmMpKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCisgIGRlZiBTSFIzMm1pICA6IElpODwweEMxLCBNUk01bSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAic2hye2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChzcmwgKGxvYWRpMzIgYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCldPjsNCisNCisgIC8vIFNoaWZ0IGJ5IDENCisgIGRlZiBTSFI4bTEgICA6IEk8MHhEMCwgTVJNNW0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzaHJ7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNybCAobG9hZGk4IGFkZHI6JGRzdCksIChpOCAxKSksIGFkZHI6JGRzdCldPjsNCisgIGRlZiBTSFIxNm0xICA6IEk8MHhEMSwgTVJNNW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJzaHJ7d31cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3JsIChsb2FkaTE2IGFkZHI6JGRzdCksIChpOCAxKSksIGFkZHI6JGRzdCldPixPcFNpemU7DQorICBkZWYgU0hSMzJtMSAgOiBJPDB4RDEsIE1STTVtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic2hye2x9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNybCAobG9hZGkzMiBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT47DQorfSAvLyBDb25zdHJhaW50cyA9ICIiDQorDQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgU0FSOHJDTCAgOiBJPDB4RDIsIE1STTdyLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInNhcntifVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChzcmEgR1I4OiRzcmMxLCBDTCkpXT47DQorZGVmIFNBUjE2ckNMIDogSTwweEQzLCBNUk03ciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICJzYXJ7d31cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKHNyYSBHUjE2OiRzcmMxLCBDTCkpXT4sIE9wU2l6ZTsNCitkZWYgU0FSMzJyQ0wgOiBJPDB4RDMsIE1STTdyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInNhcntsfVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoc3JhIEdSMzI6JHNyYzEsIENMKSldPjsNCit9DQorDQorZGVmIFNBUjhyaSAgIDogSWk4PDB4QzAsIE1STTdyLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInNhcntifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoc3JhIEdSODokc3JjMSwgKGk4IGltbTokc3JjMikpKV0+Ow0KK2RlZiBTQVIxNnJpICA6IElpODwweEMxLCBNUk03ciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJzYXJ7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzcmEgR1IxNjokc3JjMSwgKGk4IGltbTokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorZGVmIFNBUjMycmkgIDogSWk4PDB4QzEsIE1STTdyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInNhcntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHNyYSBHUjMyOiRzcmMxLCAoaTggaW1tOiRzcmMyKSkpXT47DQorDQorLy8gU2hpZnQgYnkgMQ0KK2RlZiBTQVI4cjEgICA6IEk8MHhEMCwgTVJNN3IsIChvdXRzIEdSOCA6JGRzdCksIChpbnMgR1I4IDokc3JjMSksDQorICAgICAgICAgICAgICAgICAic2Fye2J9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoc3JhIEdSODokc3JjMSwgKGk4IDEpKSldPjsNCitkZWYgU0FSMTZyMSAgOiBJPDB4RDEsIE1STTdyLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInNhcnt3fVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzcmEgR1IxNjokc3JjMSwgKGk4IDEpKSldPiwgT3BTaXplOw0KK2RlZiBTQVIzMnIxICA6IEk8MHhEMSwgTVJNN3IsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSksDQorICAgICAgICAgICAgICAgICAic2Fye2x9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHNyYSBHUjMyOiRzcmMxLCAoaTggMSkpKV0+Ow0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIiIGluIHsNCisgIGxldCBVc2VzID0gW0NMXSBpbiB7DQorICBkZWYgU0FSOG1DTCAgOiBJPDB4RDIsIE1STTdtLCAob3V0cyksIChpbnMgaThtZW0gOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic2Fye2J9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNyYSAobG9hZGk4IGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIFNBUjE2bUNMIDogSTwweEQzLCBNUk03bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInNhcnt3fVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzcmEgKGxvYWRpMTYgYWRkcjokZHN0KSwgQ0wpLCBhZGRyOiRkc3QpXT4sIE9wU2l6ZTsNCisgIGRlZiBTQVIzMm1DTCA6IEk8MHhEMywgTVJNN20sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAic2Fye2x9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNyYSAobG9hZGkzMiBhZGRyOiRkc3QpLCBDTCksIGFkZHI6JGRzdCldPjsNCisgIH0NCisgIGRlZiBTQVI4bWkgICA6IElpODwweEMwLCBNUk03bSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0LCBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAic2Fye2J9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3JhIChsb2FkaTggYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCldPjsNCisgIGRlZiBTQVIxNm1pICA6IElpODwweEMxLCBNUk03bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAic2Fye3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChzcmEgKGxvYWRpMTYgYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorICBkZWYgU0FSMzJtaSAgOiBJaTg8MHhDMSwgTVJNN20sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInNhcntsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3JhIChsb2FkaTMyIGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpXT47DQorDQorICAvLyBTaGlmdCBieSAxDQorICBkZWYgU0FSOG0xICAgOiBJPDB4RDAsIE1STTdtLCAob3V0cyksIChpbnMgaThtZW0gOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic2Fye2J9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzcmEgKGxvYWRpOCBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT47DQorICBkZWYgU0FSMTZtMSAgOiBJPDB4RDEsIE1STTdtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAic2Fye3d9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHNyYSAobG9hZGkxNiBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIFNBUjMybTEgIDogSTwweEQxLCBNUk03bSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInNhcntsfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChzcmEgKGxvYWRpMzIgYWRkcjokZHN0KSwgKGk4IDEpKSwgYWRkcjokZHN0KV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiIg0KKw0KKy8vIFJvdGF0ZSBpbnN0cnVjdGlvbnMNCisNCitkZWYgUkNMOHIxIDogSTwweEQwLCBNUk0yciwgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSksDQorICAgICAgICAgICAgICAgInJjbHtifVx0ezEsICRkc3R8JGRzdCwgMX0iLCBbXT47DQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgUkNMOHJDTCA6IEk8MHhEMiwgTVJNMnIsIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAicmNse2J9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsIFtdPjsNCit9DQorZGVmIFJDTDhyaSA6IElpODwweEMwLCBNUk0yciwgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSwgaThpbW06JGNudCksDQorICAgICAgICAgICAgICAgICAicmNse2J9XHR7JGNudCwgJGRzdHwkZHN0LCAkY250fSIsIFtdPjsNCisgIA0KK2RlZiBSQ0wxNnIxIDogSTwweEQxLCBNUk0yciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgInJjbHt3fVx0ezEsICRkc3R8JGRzdCwgMX0iLCBbXT4sIE9wU2l6ZTsNCitsZXQgVXNlcyA9IFtDTF0gaW4gew0KK2RlZiBSQ0wxNnJDTCA6IEk8MHhEMywgTVJNMnIsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSksDQorICAgICAgICAgICAgICAgICAicmNse3d9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsIFtdPiwgT3BTaXplOw0KK30NCitkZWYgUkNMMTZyaSA6IElpODwweEMxLCBNUk0yciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBpOGltbTokY250KSwNCisgICAgICAgICAgICAgICAgICAicmNse3d9XHR7JGNudCwgJGRzdHwkZHN0LCAkY250fSIsIFtdPiwgT3BTaXplOw0KKw0KK2RlZiBSQ0wzMnIxIDogSTwweEQxLCBNUk0yciwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxKSwNCisgICAgICAgICAgICAgICAgInJjbHtsfVx0ezEsICRkc3R8JGRzdCwgMX0iLCBbXT47DQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgUkNMMzJyQ0wgOiBJPDB4RDMsIE1STTJyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInJjbHtsfVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLCBbXT47DQorfQ0KK2RlZiBSQ0wzMnJpIDogSWk4PDB4QzEsIE1STTJyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGk4aW1tOiRjbnQpLA0KKyAgICAgICAgICAgICAgICAgICJyY2x7bH1cdHskY250LCAkZHN0fCRkc3QsICRjbnR9IiwgW10+Ow0KKyAgICAgICAgICAgICAgICAgIA0KK2RlZiBSQ1I4cjEgOiBJPDB4RDAsIE1STTNyLCAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMxKSwNCisgICAgICAgICAgICAgICAicmNye2J9XHR7MSwgJGRzdHwkZHN0LCAxfSIsIFtdPjsNCitsZXQgVXNlcyA9IFtDTF0gaW4gew0KK2RlZiBSQ1I4ckNMIDogSTwweEQyLCBNUk0zciwgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSksDQorICAgICAgICAgICAgICAgICJyY3J7Yn1cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwgW10+Ow0KK30NCitkZWYgUkNSOHJpIDogSWk4PDB4QzAsIE1STTNyLCAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMxLCBpOGltbTokY250KSwNCisgICAgICAgICAgICAgICAgICJyY3J7Yn1cdHskY250LCAkZHN0fCRkc3QsICRjbnR9IiwgW10+Ow0KKyAgDQorZGVmIFJDUjE2cjEgOiBJPDB4RDEsIE1STTNyLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAicmNye3d9XHR7MSwgJGRzdHwkZHN0LCAxfSIsIFtdPiwgT3BTaXplOw0KK2xldCBVc2VzID0gW0NMXSBpbiB7DQorZGVmIFJDUjE2ckNMIDogSTwweEQzLCBNUk0zciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICJyY3J7d31cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwgW10+LCBPcFNpemU7DQorfQ0KK2RlZiBSQ1IxNnJpIDogSWk4PDB4QzEsIE1STTNyLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGk4aW1tOiRjbnQpLA0KKyAgICAgICAgICAgICAgICAgICJyY3J7d31cdHskY250LCAkZHN0fCRkc3QsICRjbnR9IiwgW10+LCBPcFNpemU7DQorDQorZGVmIFJDUjMycjEgOiBJPDB4RDEsIE1STTNyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAicmNye2x9XHR7MSwgJGRzdHwkZHN0LCAxfSIsIFtdPjsNCitsZXQgVXNlcyA9IFtDTF0gaW4gew0KK2RlZiBSQ1IzMnJDTCA6IEk8MHhEMywgTVJNM3IsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSksDQorICAgICAgICAgICAgICAgICAicmNye2x9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsIFtdPjsNCit9DQorZGVmIFJDUjMycmkgOiBJaTg8MHhDMSwgTVJNM3IsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSwgaThpbW06JGNudCksDQorICAgICAgICAgICAgICAgICAgInJjcntsfVx0eyRjbnQsICRkc3R8JGRzdCwgJGNudH0iLCBbXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiIgaW4gew0KK2RlZiBSQ0w4bTEgOiBJPDB4RDAsIE1STTJtLCAob3V0cyksIChpbnMgaThtZW06JGRzdCksDQorICAgICAgICAgICAgICAgInJjbHtifVx0ezEsICRkc3R8JGRzdCwgMX0iLCBbXT47DQorZGVmIFJDTDhtaSA6IElpODwweEMwLCBNUk0ybSwgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QsIGk4aW1tOiRjbnQpLA0KKyAgICAgICAgICAgICAgICAgInJjbHtifVx0eyRjbnQsICRkc3R8JGRzdCwgJGNudH0iLCBbXT47DQorZGVmIFJDTDE2bTEgOiBJPDB4RDEsIE1STTJtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAicmNse3d9XHR7MSwgJGRzdHwkZHN0LCAxfSIsIFtdPiwgT3BTaXplOw0KK2RlZiBSQ0wxNm1pIDogSWk4PDB4QzEsIE1STTJtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIGk4aW1tOiRjbnQpLA0KKyAgICAgICAgICAgICAgICAgICJyY2x7d31cdHskY250LCAkZHN0fCRkc3QsICRjbnR9IiwgW10+LCBPcFNpemU7DQorZGVmIFJDTDMybTEgOiBJPDB4RDEsIE1STTJtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAicmNse2x9XHR7MSwgJGRzdHwkZHN0LCAxfSIsIFtdPjsNCitkZWYgUkNMMzJtaSA6IElpODwweEMxLCBNUk0ybSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBpOGltbTokY250KSwNCisgICAgICAgICAgICAgICAgICAicmNse2x9XHR7JGNudCwgJGRzdHwkZHN0LCAkY250fSIsIFtdPjsNCitkZWYgUkNSOG0xIDogSTwweEQwLCBNUk0zbSwgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICJyY3J7Yn1cdHsxLCAkZHN0fCRkc3QsIDF9IiwgW10+Ow0KK2RlZiBSQ1I4bWkgOiBJaTg8MHhDMCwgTVJNM20sIChvdXRzKSwgKGlucyBpOG1lbTokZHN0LCBpOGltbTokY250KSwNCisgICAgICAgICAgICAgICAgICJyY3J7Yn1cdHskY250LCAkZHN0fCRkc3QsICRjbnR9IiwgW10+Ow0KK2RlZiBSQ1IxNm0xIDogSTwweEQxLCBNUk0zbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgInJjcnt3fVx0ezEsICRkc3R8JGRzdCwgMX0iLCBbXT4sIE9wU2l6ZTsNCitkZWYgUkNSMTZtaSA6IElpODwweEMxLCBNUk0zbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpOGltbTokY250KSwNCisgICAgICAgICAgICAgICAgICAicmNye3d9XHR7JGNudCwgJGRzdHwkZHN0LCAkY250fSIsIFtdPiwgT3BTaXplOw0KK2RlZiBSQ1IzMm0xIDogSTwweEQxLCBNUk0zbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgInJjcntsfVx0ezEsICRkc3R8JGRzdCwgMX0iLCBbXT47DQorZGVmIFJDUjMybWkgOiBJaTg8MHhDMSwgTVJNM20sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaThpbW06JGNudCksDQorICAgICAgICAgICAgICAgICAgInJjcntsfVx0eyRjbnQsICRkc3R8JGRzdCwgJGNudH0iLCBbXT47DQorDQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgUkNMOG1DTCA6IEk8MHhEMiwgTVJNMm0sIChvdXRzKSwgKGlucyBpOG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgInJjbHtifVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLCBbXT47DQorZGVmIFJDTDE2bUNMIDogSTwweEQzLCBNUk0ybSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJyY2x7d31cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwgW10+LCBPcFNpemU7DQorZGVmIFJDTDMybUNMIDogSTwweEQzLCBNUk0ybSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJyY2x7bH1cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwgW10+Ow0KK2RlZiBSQ1I4bUNMIDogSTwweEQyLCBNUk0zbSwgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAicmNye2J9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsIFtdPjsNCitkZWYgUkNSMTZtQ0wgOiBJPDB4RDMsIE1STTNtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgInJjcnt3fVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLCBbXT4sIE9wU2l6ZTsNCitkZWYgUkNSMzJtQ0wgOiBJPDB4RDMsIE1STTNtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgInJjcntsfVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLCBbXT47DQorfQ0KK30gLy8gQ29uc3RyYWludHMgPSAiIg0KKw0KKy8vIEZJWE1FOiBwcm92aWRlIHNob3J0ZXIgaW5zdHJ1Y3Rpb25zIHdoZW4gaW1tOCA9PSAxDQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgUk9MOHJDTCAgOiBJPDB4RDIsIE1STTByLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInJvbHtifVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChyb3RsIEdSODokc3JjMSwgQ0wpKV0+Ow0KK2RlZiBST0wxNnJDTCA6IEk8MHhEMywgTVJNMHIsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSksDQorICAgICAgICAgICAgICAgICAicm9se3d9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChyb3RsIEdSMTY6JHNyYzEsIENMKSldPiwgT3BTaXplOw0KK2RlZiBST0wzMnJDTCA6IEk8MHhEMywgTVJNMHIsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSksDQorICAgICAgICAgICAgICAgICAicm9se2x9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChyb3RsIEdSMzI6JHNyYzEsIENMKSldPjsNCit9DQorDQorZGVmIFJPTDhyaSAgIDogSWk4PDB4QzAsIE1STTByLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInJvbHtifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAocm90bCBHUjg6JHNyYzEsIChpOCBpbW06JHNyYzIpKSldPjsNCitkZWYgUk9MMTZyaSAgOiBJaTg8MHhDMSwgTVJNMHIsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAicm9se3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAocm90bCBHUjE2OiRzcmMxLCAoaTggaW1tOiRzcmMyKSkpXT4sIA0KKyAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorZGVmIFJPTDMycmkgIDogSWk4PDB4QzEsIE1STTByLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInJvbHtsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHJvdGwgR1IzMjokc3JjMSwgKGk4IGltbTokc3JjMikpKV0+Ow0KKw0KKy8vIFJvdGF0ZSBieSAxDQorZGVmIFJPTDhyMSAgIDogSTwweEQwLCBNUk0wciwgKG91dHMgR1I4IDokZHN0KSwgKGlucyBHUjggOiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICJyb2x7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChyb3RsIEdSODokc3JjMSwgKGk4IDEpKSldPjsNCitkZWYgUk9MMTZyMSAgOiBJPDB4RDEsIE1STTByLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInJvbHt3fVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChyb3RsIEdSMTY6JHNyYzEsIChpOCAxKSkpXT4sIE9wU2l6ZTsNCitkZWYgUk9MMzJyMSAgOiBJPDB4RDEsIE1STTByLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInJvbHtsfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChyb3RsIEdSMzI6JHNyYzEsIChpOCAxKSkpXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiIgaW4gew0KKyAgbGV0IFVzZXMgPSBbQ0xdIGluIHsNCisgIGRlZiBST0w4bUNMICA6IEk8MHhEMiwgTVJNMG0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJyb2x7Yn1cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90bCAobG9hZGk4IGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIFJPTDE2bUNMIDogSTwweEQzLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInJvbHt3fVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChyb3RsIChsb2FkaTE2IGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+LCBPcFNpemU7DQorICBkZWYgUk9MMzJtQ0wgOiBJPDB4RDMsIE1STTBtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAicm9se2x9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHJvdGwgKGxvYWRpMzIgYWRkcjokZHN0KSwgQ0wpLCBhZGRyOiRkc3QpXT47DQorICB9DQorICBkZWYgUk9MOG1pICAgOiBJaTg8MHhDMCwgTVJNMG0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCwgaThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInJvbHtifVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90bCAobG9hZGk4IGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpXT47DQorICBkZWYgUk9MMTZtaSAgOiBJaTg8MHhDMSwgTVJNMG0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgaThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInJvbHt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIChyb3RsIChsb2FkaTE2IGFkZHI6JGRzdCksIChpOCBpbW06JHNyYykpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIFJPTDMybWkgIDogSWk4PDB4QzEsIE1STTBtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJyb2x7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90bCAobG9hZGkzMiBhZGRyOiRkc3QpLCAoaTggaW1tOiRzcmMpKSwgYWRkcjokZHN0KV0+Ow0KKw0KKyAgLy8gUm90YXRlIGJ5IDENCisgIGRlZiBST0w4bTEgICA6IEk8MHhEMCwgTVJNMG0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJyb2x7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90bCAobG9hZGk4IGFkZHI6JGRzdCksIChpOCAxKSksIGFkZHI6JGRzdCldPjsNCisgIGRlZiBST0wxNm0xICA6IEk8MHhEMSwgTVJNMG0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJyb2x7d31cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICBbKHN0b3JlIChyb3RsIChsb2FkaTE2IGFkZHI6JGRzdCksIChpOCAxKSksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorICBkZWYgUk9MMzJtMSAgOiBJPDB4RDEsIE1STTBtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAicm9se2x9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90bCAobG9hZGkzMiBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT47DQorfSAvLyBDb25zdHJhaW50cyA9ICIiDQorDQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgUk9SOHJDTCAgOiBJPDB4RDIsIE1STTFyLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInJvcntifVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChyb3RyIEdSODokc3JjMSwgQ0wpKV0+Ow0KK2RlZiBST1IxNnJDTCA6IEk8MHhEMywgTVJNMXIsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSksDQorICAgICAgICAgICAgICAgICAicm9ye3d9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChyb3RyIEdSMTY6JHNyYzEsIENMKSldPiwgT3BTaXplOw0KK2RlZiBST1IzMnJDTCA6IEk8MHhEMywgTVJNMXIsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjMSksDQorICAgICAgICAgICAgICAgICAicm9ye2x9XHR7JWNsLCAkZHN0fCRkc3QsIENMfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChyb3RyIEdSMzI6JHNyYzEsIENMKSldPjsNCit9DQorDQorZGVmIFJPUjhyaSAgIDogSWk4PDB4QzAsIE1STTFyLCAob3V0cyBHUjggOiRkc3QpLCAoaW5zIEdSOCA6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInJvcntifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAocm90ciBHUjg6JHNyYzEsIChpOCBpbW06JHNyYzIpKSldPjsNCitkZWYgUk9SMTZyaSAgOiBJaTg8MHhDMSwgTVJNMXIsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAicm9ye3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAocm90ciBHUjE2OiRzcmMxLCAoaTggaW1tOiRzcmMyKSkpXT4sIA0KKyAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorZGVmIFJPUjMycmkgIDogSWk4PDB4QzEsIE1STTFyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInJvcntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHJvdHIgR1IzMjokc3JjMSwgKGk4IGltbTokc3JjMikpKV0+Ow0KKw0KKy8vIFJvdGF0ZSBieSAxDQorZGVmIFJPUjhyMSAgIDogSTwweEQwLCBNUk0xciwgKG91dHMgR1I4IDokZHN0KSwgKGlucyBHUjggOiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICJyb3J7Yn1cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChyb3RyIEdSODokc3JjMSwgKGk4IDEpKSldPjsNCitkZWYgUk9SMTZyMSAgOiBJPDB4RDEsIE1STTFyLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInJvcnt3fVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChyb3RyIEdSMTY6JHNyYzEsIChpOCAxKSkpXT4sIE9wU2l6ZTsNCitkZWYgUk9SMzJyMSAgOiBJPDB4RDEsIE1STTFyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgInJvcntsfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChyb3RyIEdSMzI6JHNyYzEsIChpOCAxKSkpXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiIgaW4gew0KKyAgbGV0IFVzZXMgPSBbQ0xdIGluIHsNCisgIGRlZiBST1I4bUNMICA6IEk8MHhEMiwgTVJNMW0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICJyb3J7Yn1cdHslY2wsICRkc3R8JGRzdCwgQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90ciAobG9hZGk4IGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIFJPUjE2bUNMIDogSTwweEQzLCBNUk0xbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInJvcnt3fVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChyb3RyIChsb2FkaTE2IGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+LCBPcFNpemU7DQorICBkZWYgUk9SMzJtQ0wgOiBJPDB4RDMsIE1STTFtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgInJvcntsfVx0eyVjbCwgJGRzdHwkZHN0LCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChyb3RyIChsb2FkaTMyIGFkZHI6JGRzdCksIENMKSwgYWRkcjokZHN0KV0+Ow0KKyAgfQ0KKyAgZGVmIFJPUjhtaSAgIDogSWk4PDB4QzAsIE1STTFtLCAob3V0cyksIChpbnMgaThtZW0gOiRkc3QsIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJyb3J7Yn1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHJvdHIgKGxvYWRpOCBhZGRyOiRkc3QpLCAoaTggaW1tOiRzcmMpKSwgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIFJPUjE2bWkgIDogSWk4PDB4QzEsIE1STTFtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJyb3J7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90ciAobG9hZGkxNiBhZGRyOiRkc3QpLCAoaTggaW1tOiRzcmMpKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCisgIGRlZiBST1IzMm1pICA6IElpODwweEMxLCBNUk0xbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAicm9ye2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgIFsoc3RvcmUgKHJvdHIgKGxvYWRpMzIgYWRkcjokZHN0KSwgKGk4IGltbTokc3JjKSksIGFkZHI6JGRzdCldPjsNCisNCisgIC8vIFJvdGF0ZSBieSAxDQorICBkZWYgUk9SOG0xICAgOiBJPDB4RDAsIE1STTFtLCAob3V0cyksIChpbnMgaThtZW0gOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAicm9ye2J9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHJvdHIgKGxvYWRpOCBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT47DQorICBkZWYgUk9SMTZtMSAgOiBJPDB4RDEsIE1STTFtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAicm9ye3d9XHQkZHN0IiwNCisgICAgICAgICAgICAgICAgWyhzdG9yZSAocm90ciAobG9hZGkxNiBhZGRyOiRkc3QpLCAoaTggMSkpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIFJPUjMybTEgIDogSTwweEQxLCBNUk0xbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgInJvcntsfVx0JGRzdCIsDQorICAgICAgICAgICAgICAgIFsoc3RvcmUgKHJvdHIgKGxvYWRpMzIgYWRkcjokZHN0KSwgKGk4IDEpKSwgYWRkcjokZHN0KV0+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiIg0KKw0KKw0KKy8vIERvdWJsZSBzaGlmdCBpbnN0cnVjdGlvbnMgKGdlbmVyYWxpemF0aW9ucyBvZiByb3RhdGUpDQorbGV0IFVzZXMgPSBbQ0xdIGluIHsNCitkZWYgU0hMRDMycnJDTCA6IEk8MHhBNSwgTVJNRGVzdFJlZywgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJzaGxke2x9XHR7JWNsLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoWDg2c2hsZCBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyLCBDTCkpXT4sIFRCOw0KK2RlZiBTSFJEMzJyckNMIDogSTwweEFELCBNUk1EZXN0UmVnLCAob3V0cyBHUjMyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAic2hyZHtsfVx0eyVjbCwgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsIENMfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NnNocmQgR1IzMjokc3JjMSwgR1IzMjokc3JjMiwgQ0wpKV0+LCBUQjsNCitkZWYgU0hMRDE2cnJDTCA6IEk8MHhBNSwgTVJNRGVzdFJlZywgKG91dHMgR1IxNjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJzaGxke3d9XHR7JWNsLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2c2hsZCBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLCBDTCkpXT4sDQorICAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorZGVmIFNIUkQxNnJyQ0wgOiBJPDB4QUQsIE1STURlc3RSZWcsIChvdXRzIEdSMTY6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAoaW5zIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAic2hyZHt3fVx0eyVjbCwgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsIENMfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKFg4NnNocmQgR1IxNjokc3JjMSwgR1IxNjokc3JjMiwgQ0wpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK30NCisNCitsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7ICAvLyBUaGVzZSBpbnN0cnVjdGlvbnMgY29tbXV0ZSB0byBlYWNoIG90aGVyLg0KK2RlZiBTSExEMzJycmk4IDogSWk4PDB4QTQsIE1STURlc3RSZWcsDQorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyLCBpOGltbTokc3JjMyksDQorICAgICAgICAgICAgICAgICAgICAgInNobGR7bH1cdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoWDg2c2hsZCBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IGltbTokc3JjMykpKV0+LA0KKyAgICAgICAgICAgICAgICAgVEI7DQorZGVmIFNIUkQzMnJyaTggOiBJaTg8MHhBQywgTVJNRGVzdFJlZywNCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsIGk4aW1tOiRzcmMzKSwNCisgICAgICAgICAgICAgICAgICAgICAic2hyZHtsfVx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZzaHJkIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTggaW1tOiRzcmMzKSkpXT4sDQorICAgICAgICAgICAgICAgICBUQjsNCitkZWYgU0hMRDE2cnJpOCA6IElpODwweEE0LCBNUk1EZXN0UmVnLA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJzaGxke3d9XHR7JHNyYzMsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAkc3JjM30iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKFg4NnNobGQgR1IxNjokc3JjMSwgR1IxNjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpOCBpbW06JHNyYzMpKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBUQiwgT3BTaXplOw0KK2RlZiBTSFJEMTZycmk4IDogSWk4PDB4QUMsIE1STURlc3RSZWcsDQorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLCBpOGltbTokc3JjMyksDQorICAgICAgICAgICAgICAgICAgICAgInNocmR7d31cdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoWDg2c2hyZCBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IGltbTokc3JjMykpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorfQ0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIiIGluIHsNCisgIGxldCBVc2VzID0gW0NMXSBpbiB7DQorICBkZWYgU0hMRDMybXJDTCA6IEk8MHhBNSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAic2hsZHtsfVx0eyVjbCwgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsIENMfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2hsZCAobG9hZGkzMiBhZGRyOiRkc3QpLCBHUjMyOiRzcmMyLCBDTCksDQorICAgICAgICAgICAgICAgICAgICAgICBhZGRyOiRkc3QpXT4sIFRCOw0KKyAgZGVmIFNIUkQzMm1yQ0wgOiBJPDB4QUQsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic2hyZHtsfVx0eyVjbCwgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsIENMfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChYODZzaHJkIChsb2FkaTMyIGFkZHI6JGRzdCksIEdSMzI6JHNyYzIsIENMKSwNCisgICAgICAgICAgICAgICAgICAgICAgYWRkcjokZHN0KV0+LCBUQjsNCisgIH0NCisgIGRlZiBTSExEMzJtcmk4IDogSWk4PDB4QTQsIE1STURlc3RNZW0sDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAic2hsZHtsfVx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2hsZCAobG9hZGkzMiBhZGRyOiRkc3QpLCBHUjMyOiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTggaW1tOiRzcmMzKSksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgICAgVEI7DQorICBkZWYgU0hSRDMybXJpOCA6IElpODwweEFDLCBNUk1EZXN0TWVtLCANCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInNocmR7bH1cdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChYODZzaHJkIChsb2FkaTMyIGFkZHI6JGRzdCksIEdSMzI6JHNyYzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTggaW1tOiRzcmMzKSksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgICAgIFRCOw0KKw0KKyAgbGV0IFVzZXMgPSBbQ0xdIGluIHsNCisgIGRlZiBTSExEMTZtckNMIDogSTwweEE1LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJzaGxke3d9XHR7JWNsLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgQ0x9IiwNCisgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChYODZzaGxkIChsb2FkaTE2IGFkZHI6JGRzdCksIEdSMTY6JHNyYzIsIENMKSwNCisgICAgICAgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCldPiwgVEIsIE9wU2l6ZTsNCisgIGRlZiBTSFJEMTZtckNMIDogSTwweEFELCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInNocmR7d31cdHslY2wsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCBDTH0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2hyZCAobG9hZGkxNiBhZGRyOiRkc3QpLCBHUjE2OiRzcmMyLCBDTCksDQorICAgICAgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCldPiwgVEIsIE9wU2l6ZTsNCisgIH0NCisgIGRlZiBTSExEMTZtcmk4IDogSWk4PDB4QTQsIE1STURlc3RNZW0sDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgR1IxNjokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAic2hsZHt3fVx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2hsZCAobG9hZGkxNiBhZGRyOiRkc3QpLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTggaW1tOiRzcmMzKSksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCisgIGRlZiBTSFJEMTZtcmk4IDogSWk4PDB4QUMsIE1STURlc3RNZW0sIA0KKyAgICAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBHUjE2OiRzcmMyLCBpOGltbTokc3JjMyksDQorICAgICAgICAgICAgICAgICAgICAgICAic2hyZHt3fVx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2hyZCAobG9hZGkxNiBhZGRyOiRkc3QpLCBHUjE2OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTggaW1tOiRzcmMzKSksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgICAgIFRCLCBPcFNpemU7DQorfSAvLyBDb25zdHJhaW50cyA9ICIiDQorfSAvLyBEZWZzID0gW0VGTEFHU10NCisNCisNCisvLyBBcml0aG1ldGljLg0KK2xldCBEZWZzID0gW0VGTEFHU10gaW4gew0KK2xldCBpc0NvbW11dGFibGUgPSAxIGluIHsgICAvLyBYID0gQUREIFksIFogICAtLT4gWCA9IEFERCBaLCBZDQorLy8gUmVnaXN0ZXItUmVnaXN0ZXIgQWRkaXRpb24NCitkZWYgQUREOHJyICAgIDogSTwweDAwLCBNUk1EZXN0UmVnLCAob3V0cyBHUjggOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4IDokc3JjMSwgR1I4IDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImFkZHtifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIEVGTEFHUywgKFg4NmFkZF9mbGFnIEdSODokc3JjMSwgR1I4OiRzcmMyKSldPjsNCisNCitsZXQgaXNDb252ZXJ0aWJsZVRvVGhyZWVBZGRyZXNzID0gMSBpbiB7ICAgLy8gQ2FuIHRyYW5zZm9ybSBpbnRvIExFQS4NCisvLyBSZWdpc3Rlci1SZWdpc3RlciBBZGRpdGlvbg0KK2RlZiBBREQxNnJyICA6IEk8MHgwMSwgTVJNRGVzdFJlZywgKG91dHMgR1IxNjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAiYWRke3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLCAoWDg2YWRkX2ZsYWcgR1IxNjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1IxNjokc3JjMikpXT4sIE9wU2l6ZTsNCitkZWYgQUREMzJyciAgOiBJPDB4MDEsIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImFkZHtsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywgKFg4NmFkZF9mbGFnIEdSMzI6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSMzI6JHNyYzIpKV0+Ow0KK30gLy8gZW5kIGlzQ29udmVydGlibGVUb1RocmVlQWRkcmVzcw0KK30gLy8gZW5kIGlzQ29tbXV0YWJsZQ0KKw0KKy8vIFRoZXNlIGFyZSBhbHRlcm5hdGUgc3BlbGxpbmdzIGZvciB1c2UgYnkgdGhlIGRpc2Fzc2VtYmxlciwgd2UgbWFyayB0aGVtIGFzDQorLy8gY29kZSBnZW4gb25seSB0byBlbnN1cmUgdGhleSBhcmVuJ3QgbWF0Y2hlZCBieSB0aGUgYXNzZW1ibGVyLg0KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorICBkZWYgQUREOHJyX2FsdDogSTwweDAyLCBNUk1TcmNSZWcsIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYzEsIEdSODokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJhZGR7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT47DQorICBkZWYgQUREMTZycl9hbHQ6IEk8MHgwMywgTVJNU3JjUmVnLChvdXRzIEdSMTY6JGRzdCksKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJhZGR7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIE9wU2l6ZTsNCisgIGRlZiBBREQzMnJyX2FsdDogSTwweDAzLCBNUk1TcmNSZWcsKG91dHMgR1IzMjokZHN0KSwoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImFkZHtsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPjsNCit9DQorDQorLy8gUmVnaXN0ZXItTWVtb3J5IEFkZGl0aW9uDQorZGVmIEFERDhybSAgIDogSTwweDAyLCBNUk1TcmNNZW0sIChvdXRzIEdSOCA6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4IDokc3JjMSwgaThtZW0gOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJhZGR7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIEVGTEFHUywgKFg4NmFkZF9mbGFnIEdSODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZCBhZGRyOiRzcmMyKSkpXT47DQorZGVmIEFERDE2cm0gIDogSTwweDAzLCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgaTE2bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJhZGR7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsIChYODZhZGRfZmxhZyBHUjE2OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgYWRkcjokc3JjMikpKV0+LCBPcFNpemU7DQorZGVmIEFERDMycm0gIDogSTwweDAzLCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJhZGR7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCBFRkxBR1MsIChYODZhZGRfZmxhZyBHUjMyOiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZCBhZGRyOiRzcmMyKSkpXT47DQorICAgICAgICAgICAgICAgICAgDQorLy8gUmVnaXN0ZXItSW50ZWdlciBBZGRpdGlvbg0KK2RlZiBBREQ4cmkgICAgOiBJaTg8MHg4MCwgTVJNMHIsIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJhZGR7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZhZGRfZmxhZyBHUjg6JHNyYzEsIGltbTokc3JjMikpXT47DQorDQorbGV0IGlzQ29udmVydGlibGVUb1RocmVlQWRkcmVzcyA9IDEgaW4geyAgIC8vIENhbiB0cmFuc2Zvcm0gaW50byBMRUEuDQorLy8gUmVnaXN0ZXItSW50ZWdlciBBZGRpdGlvbg0KK2RlZiBBREQxNnJpICA6IElpMTY8MHg4MSwgTVJNMHIsIChvdXRzIEdSMTY6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMxLCBpMTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImFkZHt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZhZGRfZmxhZyBHUjE2OiRzcmMxLCBpbW06JHNyYzIpKV0+LCBPcFNpemU7DQorZGVmIEFERDMycmkgIDogSWkzMjwweDgxLCBNUk0wciwgKG91dHMgR1IzMjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIGkzMmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYWRke2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgRUZMQUdTLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZhZGRfZmxhZyBHUjMyOiRzcmMxLCBpbW06JHNyYzIpKV0+Ow0KK2RlZiBBREQxNnJpOCA6IElpODwweDgzLCBNUk0wciwgKG91dHMgR1IxNjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgaTE2aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiYWRke3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChYODZhZGRfZmxhZyBHUjE2OiRzcmMxLCBpMTZpbW1TRXh0ODokc3JjMikpXT4sIE9wU2l6ZTsNCitkZWYgQUREMzJyaTggOiBJaTg8MHg4MywgTVJNMHIsIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImFkZHtsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2YWRkX2ZsYWcgR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpKV0+Ow0KK30NCisNCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7DQorICAvLyBNZW1vcnktUmVnaXN0ZXIgQWRkaXRpb24NCisgIGRlZiBBREQ4bXIgICA6IEk8MHgwMCwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QsIEdSODokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJhZGR7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGQgKGxvYWQgYWRkcjokZHN0KSwgR1I4OiRzcmMyKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorICBkZWYgQUREMTZtciAgOiBJPDB4MDEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJhZGR7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGQgKGxvYWQgYWRkcjokZHN0KSwgR1IxNjokc3JjMiksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LCBPcFNpemU7DQorICBkZWYgQUREMzJtciAgOiBJPDB4MDEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJhZGR7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGQgKGxvYWQgYWRkcjokZHN0KSwgR1IzMjokc3JjMiksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKyAgZGVmIEFERDhtaSAgIDogSWk4PDB4ODAsIE1STTBtLCAob3V0cyksIChpbnMgaThtZW0gOiRkc3QsIGk4aW1tIDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgImFkZHtifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZCAobG9hZGk4IGFkZHI6JGRzdCksIGltbTokc3JjMiksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKyAgZGVmIEFERDE2bWkgIDogSWkxNjwweDgxLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpMTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiYWRke3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGQgKGxvYWRpMTYgYWRkcjokZHN0KSwgaW1tOiRzcmMyKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwgT3BTaXplOw0KKyAgZGVmIEFERDMybWkgIDogSWkzMjwweDgxLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBpMzJpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiYWRke2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkaTMyIGFkZHI6JGRzdCksIGltbTokc3JjMiksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKyAgZGVmIEFERDE2bWk4IDogSWk4PDB4ODMsIE1STTBtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIGkxNmk4aW1tIDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgImFkZHt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkIGFkZHI6JGRzdCksIGkxNmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwgT3BTaXplOw0KKyAgZGVmIEFERDMybWk4IDogSWk4PDB4ODMsIE1STTBtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIGkzMmk4aW1tIDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgImFkZHtsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkIChsb2FkIGFkZHI6JGRzdCksIGkzMmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisNCisgIC8vIGFkZGl0aW9uIHRvIHJBWA0KKyAgZGVmIEFERDhpOCA6IElpODwweDA0LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpOGltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImFkZHtifVx0eyRzcmMsICVhbHwlYWwsICRzcmN9IiwgW10+Ow0KKyAgZGVmIEFERDE2aTE2IDogSWkxNjwweDA1LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpMTZpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJhZGR7d31cdHskc3JjLCAlYXh8JWF4LCAkc3JjfSIsIFtdPiwgT3BTaXplOw0KKyAgZGVmIEFERDMyaTMyIDogSWkzMjwweDA1LCBSYXdGcm0sIChvdXRzKSwgKGlucyBpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJhZGR7bH1cdHskc3JjLCAlZWF4fCVlYXgsICRzcmN9IiwgW10+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiIg0KKw0KK2xldCBVc2VzID0gW0VGTEFHU10gaW4gew0KK2xldCBpc0NvbW11dGFibGUgPSAxIGluIHsgIC8vIFggPSBBREMgWSwgWiAtLT4gWCA9IEFEQyBaLCBZDQorZGVmIEFEQzhyciAgIDogSTwweDEwLCBNUk1EZXN0UmVnLCAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMxLCBHUjg6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImFkY3tifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGFkZGUgR1I4OiRzcmMxLCBHUjg6JHNyYzIpKV0+Ow0KK2RlZiBBREMxNnJyICA6IEk8MHgxMSwgTVJNRGVzdFJlZywgKG91dHMgR1IxNjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAiYWRje3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGFkZGUgR1IxNjokc3JjMSwgR1IxNjokc3JjMikpXT4sIE9wU2l6ZTsNCitkZWYgQURDMzJyciAgOiBJPDB4MTEsIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImFkY3tsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhZGRlIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpKV0+Ow0KK30NCisNCitsZXQgaXNDb2RlR2VuT25seSA9IDEgaW4gew0KK2RlZiBBREM4cnJfUkVWIDogSTwweDEyLCBNUk1TcmNSZWcsIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYzEsIEdSODokc3JjMiksDQorICAgICAgICAgICAgICAgICAiYWRje2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+Ow0KK2RlZiBBREMxNnJyX1JFViA6IEk8MHgxMywgTVJNU3JjUmVnLCAob3V0cyBHUjE2OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYWRje3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBPcFNpemU7DQorZGVmIEFEQzMycnJfUkVWIDogSTwweDEzLCBNUk1TcmNSZWcsIChvdXRzIEdSMzI6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJhZGN7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT47DQorfQ0KKw0KK2RlZiBBREM4cm0gICA6IEk8MHgxMiwgTVJNU3JjTWVtICwgKG91dHMgR1I4OiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4OiRzcmMxLCBpOG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAiYWRje2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoYWRkZSBHUjg6JHNyYzEsIChsb2FkIGFkZHI6JHNyYzIpKSldPjsNCitkZWYgQURDMTZybSAgOiBJPDB4MTMsIE1STVNyY01lbSAsIChvdXRzIEdSMTY6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAiYWRje3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGFkZGUgR1IxNjokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBBREMzMnJtICA6IEk8MHgxMywgTVJNU3JjTWVtICwgKG91dHMgR1IzMjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJhZGN7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYWRkZSBHUjMyOiRzcmMxLCAobG9hZCBhZGRyOiRzcmMyKSkpXT47DQorZGVmIEFEQzhyaSAgIDogSWk4PDB4ODAsIE1STTJyLCAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYWRje2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoYWRkZSBHUjg6JHNyYzEsIGltbTokc3JjMikpXT47DQorZGVmIEFEQzE2cmkgIDogSWkxNjwweDgxLCBNUk0yciwgKG91dHMgR1IxNjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMTY6JHNyYzEsIGkxNmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYWRje3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGFkZGUgR1IxNjokc3JjMSwgaW1tOiRzcmMyKSldPiwgT3BTaXplOw0KK2RlZiBBREMxNnJpOCA6IElpODwweDgzLCBNUk0yciwgKG91dHMgR1IxNjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgaTE2aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiYWRje3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGFkZGUgR1IxNjokc3JjMSwgaTE2aW1tU0V4dDg6JHNyYzIpKV0+LA0KKyAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBBREMzMnJpICA6IElpMzI8MHg4MSwgTVJNMnIsIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjMyOiRzcmMxLCBpMzJpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImFkY3tsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhZGRlIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT47DQorZGVmIEFEQzMycmk4IDogSWk4PDB4ODMsIE1STTJyLCAob3V0cyBHUjMyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjMyOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJhZGN7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYWRkZSBHUjMyOiRzcmMxLCBpMzJpbW1TRXh0ODokc3JjMikpXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiIgaW4gew0KKyAgZGVmIEFEQzhtciAgIDogSTwweDEwLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaThtZW06JGRzdCwgR1I4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImFkY3tifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZGUgKGxvYWQgYWRkcjokZHN0KSwgR1I4OiRzcmMyKSwgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIEFEQzE2bXIgIDogSTwweDExLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiYWRje3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoYWRkZSAobG9hZCBhZGRyOiRkc3QpLCBHUjE2OiRzcmMyKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorICBkZWYgQURDMzJtciAgOiBJPDB4MTEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJhZGN7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGRlIChsb2FkIGFkZHI6JGRzdCksIEdSMzI6JHNyYzIpLCBhZGRyOiRkc3QpXT47DQorICBkZWYgQURDOG1pICAgOiBJaTg8MHg4MCwgTVJNMm0sIChvdXRzKSwgKGlucyBpOG1lbTokZHN0LCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJhZGN7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZGUgKGxvYWRpOCBhZGRyOiRkc3QpLCBpbW06JHNyYzIpLCBhZGRyOiRkc3QpXT47DQorICBkZWYgQURDMTZtaSAgOiBJaTE2PDB4ODEsIE1STTJtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIGkxNmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJhZGN7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZGUgKGxvYWRpMTYgYWRkcjokZHN0KSwgaW1tOiRzcmMyKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCisgIGRlZiBBREMxNm1pOCA6IElpODwweDgzLCBNUk0ybSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpMTZpOGltbSA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGN7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZGUgKGxvYWQgYWRkcjokZHN0KSwgaTE2aW1tU0V4dDg6JHNyYzIpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIEFEQzMybWkgIDogSWkzMjwweDgxLCBNUk0ybSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBpMzJpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiYWRje2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIChhZGRlIChsb2FkaTMyIGFkZHI6JGRzdCksIGltbTokc3JjMiksIGFkZHI6JGRzdCldPjsNCisgIGRlZiBBREMzMm1pOCA6IElpODwweDgzLCBNUk0ybSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBpMzJpOGltbSA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJhZGN7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgIFsoc3RvcmUgKGFkZGUgKGxvYWQgYWRkcjokZHN0KSwgaTMyaW1tU0V4dDg6JHNyYzIpLCBhZGRyOiRkc3QpXT47DQorDQorICBkZWYgQURDOGk4IDogSWk4PDB4MTQsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiYWRje2J9XHR7JHNyYywgJWFsfCVhbCwgJHNyY30iLCBbXT47DQorICBkZWYgQURDMTZpMTYgOiBJaTE2PDB4MTUsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGkxNmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImFkY3t3fVx0eyRzcmMsICVheHwlYXgsICRzcmN9IiwgW10+LCBPcFNpemU7DQorICBkZWYgQURDMzJpMzIgOiBJaTMyPDB4MTUsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGkzMmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImFkY3tsfVx0eyRzcmMsICVlYXh8JWVheCwgJHNyY30iLCBbXT47DQorfSAvLyBDb25zdHJhaW50cyA9ICIiDQorfSAvLyBVc2VzID0gW0VGTEFHU10NCisNCisvLyBSZWdpc3Rlci1SZWdpc3RlciBTdWJ0cmFjdGlvbg0KK2RlZiBTVUI4cnIgIDogSTwweDI4LCBNUk1EZXN0UmVnLCAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMxLCBHUjg6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAic3Vie2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgKFg4NnN1Yl9mbGFnIEdSODokc3JjMSwgR1I4OiRzcmMyKSldPjsNCitkZWYgU1VCMTZyciA6IEk8MHgyOSwgTVJNRGVzdFJlZywgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAic3Vie3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgIChYODZzdWJfZmxhZyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSldPiwgT3BTaXplOw0KK2RlZiBTVUIzMnJyIDogSTwweDI5LCBNUk1EZXN0UmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICJzdWJ7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgKFg4NnN1Yl9mbGFnIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpKV0+Ow0KKw0KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorZGVmIFNVQjhycl9SRVYgOiBJPDB4MkEsIE1STVNyY1JlZywgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSwgR1I4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInN1YntifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPjsNCitkZWYgU1VCMTZycl9SRVYgOiBJPDB4MkIsIE1STVNyY1JlZywgKG91dHMgR1IxNjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInN1Ynt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPiwgT3BTaXplOw0KK2RlZiBTVUIzMnJyX1JFViA6IEk8MHgyQiwgTVJNU3JjUmVnLCAob3V0cyBHUjMyOiRkc3QpLCANCisgICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic3Vie2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+Ow0KK30NCisNCisvLyBSZWdpc3Rlci1NZW1vcnkgU3VidHJhY3Rpb24NCitkZWYgU1VCOHJtICA6IEk8MHgyQSwgTVJNU3JjTWVtLCAob3V0cyBHUjggOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4IDokc3JjMSwgaThtZW0gOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgInN1YntifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgIChYODZzdWJfZmxhZyBHUjg6JHNyYzEsIChsb2FkIGFkZHI6JHNyYzIpKSldPjsNCitkZWYgU1VCMTZybSA6IEk8MHgyQiwgTVJNU3JjTWVtLCAob3V0cyBHUjE2OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgaTE2bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgInN1Ynt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAoWDg2c3ViX2ZsYWcgR1IxNjokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+LCBPcFNpemU7DQorZGVmIFNVQjMycm0gOiBJPDB4MkIsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIGkzMm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICJzdWJ7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgKFg4NnN1Yl9mbGFnIEdSMzI6JHNyYzEsIChsb2FkIGFkZHI6JHNyYzIpKSldPjsNCisNCisvLyBSZWdpc3Rlci1JbnRlZ2VyIFN1YnRyYWN0aW9uDQorZGVmIFNVQjhyaSAgIDogSWk4IDwweDgwLCBNUk01ciwgKG91dHMgR1I4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I4OiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic3Vie2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2c3ViX2ZsYWcgR1I4OiRzcmMxLCBpbW06JHNyYzIpKV0+Ow0KK2RlZiBTVUIxNnJpICA6IElpMTY8MHg4MSwgTVJNNXIsIChvdXRzIEdSMTY6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMxLCBpMTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInN1Ynt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZzdWJfZmxhZyBHUjE2OiRzcmMxLCBpbW06JHNyYzIpKV0+LCBPcFNpemU7DQorZGVmIFNVQjMycmkgIDogSWkzMjwweDgxLCBNUk01ciwgKG91dHMgR1IzMjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIGkzMmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic3Vie2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NnN1Yl9mbGFnIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT47DQorZGVmIFNVQjE2cmk4IDogSWk4PDB4ODMsIE1STTVyLCAob3V0cyBHUjE2OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMxLCBpMTZpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJzdWJ7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NnN1Yl9mbGFnIEdSMTY6JHNyYzEsIGkxNmltbVNFeHQ4OiRzcmMyKSldPiwgT3BTaXplOw0KK2RlZiBTVUIzMnJpOCA6IElpODwweDgzLCBNUk01ciwgKG91dHMgR1IzMjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAic3Vie2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChYODZzdWJfZmxhZyBHUjMyOiRzcmMxLCBpMzJpbW1TRXh0ODokc3JjMikpXT47DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiIgaW4gew0KKyAgLy8gTWVtb3J5LVJlZ2lzdGVyIFN1YnRyYWN0aW9uDQorICBkZWYgU1VCOG1yICAgOiBJPDB4MjgsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCwgR1I4IDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJzdWJ7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzdWIgKGxvYWQgYWRkcjokZHN0KSwgR1I4OiRzcmMyKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorICBkZWYgU1VCMTZtciAgOiBJPDB4MjksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJzdWJ7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzdWIgKGxvYWQgYWRkcjokZHN0KSwgR1IxNjokc3JjMiksIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LCBPcFNpemU7DQorICBkZWYgU1VCMzJtciAgOiBJPDB4MjksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICAic3Vie2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViIChsb2FkIGFkZHI6JGRzdCksIEdSMzI6JHNyYzIpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPjsNCisNCisgIC8vIE1lbW9yeS1JbnRlZ2VyIFN1YnRyYWN0aW9uDQorICBkZWYgU1VCOG1pICAgOiBJaTg8MHg4MCwgTVJNNW0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCwgaThpbW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICAic3Vie2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzdWIgKGxvYWRpOCBhZGRyOiRkc3QpLCBpbW06JHNyYzIpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKyAgZGVmIFNVQjE2bWkgIDogSWkxNjwweDgxLCBNUk01bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpMTZpbW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICAgInN1Ynt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHN1YiAobG9hZGkxNiBhZGRyOiRkc3QpLCBpbW06JHNyYzIpLGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LCBPcFNpemU7DQorICBkZWYgU1VCMzJtaSAgOiBJaTMyPDB4ODEsIE1STTVtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIGkzMmltbTokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICAgICAic3Vie2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViIChsb2FkaTMyIGFkZHI6JGRzdCksIGltbTokc3JjMiksYWRkcjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT47DQorICBkZWYgU1VCMTZtaTggOiBJaTg8MHg4MywgTVJNNW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgaTE2aThpbW0gOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgICAgInN1Ynt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViIChsb2FkIGFkZHI6JGRzdCksIGkxNmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT4sIE9wU2l6ZTsNCisgIGRlZiBTVUIzMm1pOCA6IElpODwweDgzLCBNUk01bSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBpMzJpOGltbSA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJzdWJ7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHN1YiAobG9hZCBhZGRyOiRkc3QpLCBpMzJpbW1TRXh0ODokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+Ow0KKyAgICAgICAgICAgICAgICAgICAgICANCisgIGRlZiBTVUI4aTggOiBJaTg8MHgyQywgUmF3RnJtLCAob3V0cyksIChpbnMgaThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJzdWJ7Yn1cdHskc3JjLCAlYWx8JWFsLCAkc3JjfSIsIFtdPjsNCisgIGRlZiBTVUIxNmkxNiA6IElpMTY8MHgyRCwgUmF3RnJtLCAob3V0cyksIChpbnMgaTE2aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAic3Vie3d9XHR7JHNyYywgJWF4fCVheCwgJHNyY30iLCBbXT4sIE9wU2l6ZTsNCisgIGRlZiBTVUIzMmkzMiA6IElpMzI8MHgyRCwgUmF3RnJtLCAob3V0cyksIChpbnMgaTMyaW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAic3Vie2x9XHR7JHNyYywgJWVheHwlZWF4LCAkc3JjfSIsIFtdPjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiINCisNCitsZXQgVXNlcyA9IFtFRkxBR1NdIGluIHsNCitkZWYgU0JCOHJyICAgICA6IEk8MHgxOCwgTVJNRGVzdFJlZywgKG91dHMgR1I4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSODokc3JjMSwgR1I4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAic2Jie2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoc3ViZSBHUjg6JHNyYzEsIEdSODokc3JjMikpXT47DQorZGVmIFNCQjE2cnIgICAgOiBJPDB4MTksIE1STURlc3RSZWcsIChvdXRzIEdSMTY6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgInNiYnt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzdWJlIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpKV0+LCBPcFNpemU7DQorZGVmIFNCQjMycnIgICAgOiBJPDB4MTksIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICJzYmJ7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoc3ViZSBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSldPjsNCisNCitsZXQgQ29uc3RyYWludHMgPSAiIiBpbiB7DQorICBkZWYgU0JCOG1yICAgOiBJPDB4MTgsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpOG1lbTokZHN0LCBHUjg6JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgInNiYntifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHN1YmUgKGxvYWQgYWRkcjokZHN0KSwgR1I4OiRzcmMyKSwgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIFNCQjE2bXIgIDogSTwweDE5LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIEdSMTY6JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgInNiYnt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHN1YmUgKGxvYWQgYWRkcjokZHN0KSwgR1IxNjokc3JjMiksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIFNCQjMybXIgIDogSTwweDE5LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIEdSMzI6JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgInNiYntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHN1YmUgKGxvYWQgYWRkcjokZHN0KSwgR1IzMjokc3JjMiksIGFkZHI6JGRzdCldPjsNCisgIGRlZiBTQkI4bWkgIDogSWk4PDB4ODAsIE1STTNtLCAob3V0cyksIChpbnMgaThtZW06JGRzdCwgaThpbW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICJzYmJ7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChzdWJlIChsb2FkaTggYWRkcjokZHN0KSwgaW1tOiRzcmMyKSwgYWRkcjokZHN0KV0+Ow0KKyAgZGVmIFNCQjE2bWkgIDogSWkxNjwweDgxLCBNUk0zbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpMTZpbW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICAgInNiYnt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViZSAobG9hZGkxNiBhZGRyOiRkc3QpLCBpbW06JHNyYzIpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIFNCQjE2bWk4IDogSWk4PDB4ODMsIE1STTNtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIGkxNmk4aW1tIDokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICAgICJzYmJ7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgIFsoc3RvcmUgKHN1YmUgKGxvYWQgYWRkcjokZHN0KSwgaTE2aW1tU0V4dDg6JHNyYzIpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIFNCQjMybWkgIDogSWkzMjwweDgxLCBNUk0zbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBpMzJpbW06JHNyYzIpLCANCisgICAgICAgICAgICAgICAgICAgICAgInNiYntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViZSAobG9hZGkzMiBhZGRyOiRkc3QpLCBpbW06JHNyYzIpLCBhZGRyOiRkc3QpXT47DQorICBkZWYgU0JCMzJtaTggOiBJaTg8MHg4MywgTVJNM20sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaTMyaThpbW0gOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgICAgInNiYntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgWyhzdG9yZSAoc3ViZSAobG9hZCBhZGRyOiRkc3QpLCBpMzJpbW1TRXh0ODokc3JjMiksIGFkZHI6JGRzdCldPjsNCisgICAgICAgICAgICAgICANCisgIGRlZiBTQkI4aTggOiBJaTg8MHgxQywgUmF3RnJtLCAob3V0cyksIChpbnMgaThpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJzYmJ7Yn1cdHskc3JjLCAlYWx8JWFsLCAkc3JjfSIsIFtdPjsNCisgIGRlZiBTQkIxNmkxNiA6IElpMTY8MHgxRCwgUmF3RnJtLCAob3V0cyksIChpbnMgaTE2aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAic2Jie3d9XHR7JHNyYywgJWF4fCVheCwgJHNyY30iLCBbXT4sIE9wU2l6ZTsNCisgIGRlZiBTQkIzMmkzMiA6IElpMzI8MHgxRCwgUmF3RnJtLCAob3V0cyksIChpbnMgaTMyaW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAic2Jie2x9XHR7JHNyYywgJWVheHwlZWF4LCAkc3JjfSIsIFtdPjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiINCisNCitsZXQgaXNDb2RlR2VuT25seSA9IDEgaW4gew0KK2RlZiBTQkI4cnJfUkVWIDogSTwweDFBLCBNUk1TcmNSZWcsIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYzEsIEdSODokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJzYmJ7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT47DQorZGVmIFNCQjE2cnJfUkVWIDogSTwweDFCLCBNUk1TcmNSZWcsIChvdXRzIEdSMTY6JGRzdCksIA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJzYmJ7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIE9wU2l6ZTsNCitkZWYgU0JCMzJycl9SRVYgOiBJPDB4MUIsIE1STVNyY1JlZywgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInNiYntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPjsNCit9DQorDQorZGVmIFNCQjhybSAgIDogSTwweDFBLCBNUk1TcmNNZW0sIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYzEsIGk4bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJzYmJ7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChzdWJlIEdSODokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBTQkIxNnJtICA6IEk8MHgxQiwgTVJNU3JjTWVtLCAob3V0cyBHUjE2OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMTY6JHNyYzEsIGkxNm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic2Jie3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKHN1YmUgR1IxNjokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBTQkIzMnJtICA6IEk8MHgxQiwgTVJNU3JjTWVtLCAob3V0cyBHUjMyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIGkzMm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAic2Jie2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHN1YmUgR1IzMjokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBTQkI4cmkgICA6IElpODwweDgwLCBNUk0zciwgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInNiYntifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKHN1YmUgR1I4OiRzcmMxLCBpbW06JHNyYzIpKV0+Ow0KK2RlZiBTQkIxNnJpICA6IElpMTY8MHg4MSwgTVJNM3IsIChvdXRzIEdSMTY6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjE2OiRzcmMxLCBpMTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInNiYnt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChzdWJlIEdSMTY6JHNyYzEsIGltbTokc3JjMikpXT4sIE9wU2l6ZTsNCitkZWYgU0JCMTZyaTggOiBJaTg8MHg4MywgTVJNM3IsIChvdXRzIEdSMTY6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMTY6JHNyYzEsIGkxNmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgInNiYnt3fVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKHN1YmUgR1IxNjokc3JjMSwgaTE2aW1tU0V4dDg6JHNyYzIpKV0+LA0KKyAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorZGVmIFNCQjMycmkgIDogSWkzMjwweDgxLCBNUk0zciwgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjMyOiRzcmMxLCBpMzJpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInNiYntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChzdWJlIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT47DQorZGVmIFNCQjMycmk4IDogSWk4PDB4ODMsIE1STTNyLCAob3V0cyBHUjMyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjMyOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJzYmJ7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChzdWJlIEdSMzI6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKSldPjsNCit9IC8vIFVzZXMgPSBbRUZMQUdTXQ0KK30gLy8gRGVmcyA9IFtFRkxBR1NdDQorDQorbGV0IERlZnMgPSBbRUZMQUdTXSBpbiB7DQorbGV0IGlzQ29tbXV0YWJsZSA9IDEgaW4geyAgLy8gWCA9IElNVUwgWSwgWiAtLT4gWCA9IElNVUwgWiwgWQ0KKy8vIFJlZ2lzdGVyLVJlZ2lzdGVyIFNpZ25lZCBJbnRlZ2VyIE11bHRpcGx5DQorZGVmIElNVUwxNnJyIDogSTwweEFGLCBNUk1TcmNSZWcsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1IxNjokc3JjMSxHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJpbXVse3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKFg4NnNtdWxfZmxhZyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSldPiwgVEIsIE9wU2l6ZTsNCitkZWYgSU1VTDMycnIgOiBJPDB4QUYsIE1STVNyY1JlZywgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMxLEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgImltdWx7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAoWDg2c211bF9mbGFnIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpKV0+LCBUQjsNCit9DQorDQorLy8gUmVnaXN0ZXItTWVtb3J5IFNpZ25lZCBJbnRlZ2VyIE11bHRpcGx5DQorZGVmIElNVUwxNnJtIDogSTwweEFGLCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IxNjokc3JjMSwgaTE2bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICJpbXVse3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKFg4NnNtdWxfZmxhZyBHUjE2OiRzcmMxLCAobG9hZCBhZGRyOiRzcmMyKSkpXT4sDQorICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCitkZWYgSU1VTDMycm0gOiBJPDB4QUYsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIGkzMm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAiaW11bHtsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgIChYODZzbXVsX2ZsYWcgR1IzMjokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+LCBUQjsNCit9IC8vIERlZnMgPSBbRUZMQUdTXQ0KK30gLy8gZW5kIFR3byBBZGRyZXNzIGluc3RydWN0aW9ucw0KKw0KKy8vIFN1cHJpc2luZ2x5IGVub3VnaCwgdGhlc2UgYXJlIG5vdCB0d28gYWRkcmVzcyBpbnN0cnVjdGlvbnMhDQorbGV0IERlZnMgPSBbRUZMQUdTXSBpbiB7DQorLy8gUmVnaXN0ZXItSW50ZWdlciBTaWduZWQgSW50ZWdlciBNdWx0aXBseQ0KK2RlZiBJTVVMMTZycmkgIDogSWkxNjwweDY5LCBNUk1TcmNSZWcsICAgICAgICAgICAgICAgICAgICAgIC8vIEdSMTYgPSBHUjE2KkkxNg0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJpbXVse3d9XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIEVGTEFHUywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZzbXVsX2ZsYWcgR1IxNjokc3JjMSwgaW1tOiRzcmMyKSldPiwgT3BTaXplOw0KK2RlZiBJTVVMMzJycmkgIDogSWkzMjwweDY5LCBNUk1TcmNSZWcsICAgICAgICAgICAgICAgICAgICAgIC8vIEdSMzIgPSBHUjMyKkkzMg0KKyAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJpbXVse2x9XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NnNtdWxfZmxhZyBHUjMyOiRzcmMxLCBpbW06JHNyYzIpKV0+Ow0KK2RlZiBJTVVMMTZycmk4IDogSWk4PDB4NkIsIE1STVNyY1JlZywgICAgICAgICAgICAgICAgICAgICAgIC8vIEdSMTYgPSBHUjE2Kkk4DQorICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMxLCBpMTZpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgImltdWx7d31cdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NnNtdWxfZmxhZyBHUjE2OiRzcmMxLCBpMTZpbW1TRXh0ODokc3JjMikpXT4sDQorICAgICAgICAgICAgICAgICBPcFNpemU7DQorZGVmIElNVUwzMnJyaTggOiBJaTg8MHg2QiwgTVJNU3JjUmVnLCAgICAgICAgICAgICAgICAgICAgICAgLy8gR1IzMiA9IEdSMzIqSTgNCisgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAiaW11bHtsfVx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoWDg2c211bF9mbGFnIEdSMzI6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKSldPjsNCisNCisvLyBNZW1vcnktSW50ZWdlciBTaWduZWQgSW50ZWdlciBNdWx0aXBseQ0KK2RlZiBJTVVMMTZybWkgIDogSWkxNjwweDY5LCBNUk1TcmNNZW0sICAgICAgICAgICAgICAgICAgICAgLy8gR1IxNiA9IFttZW0xNl0qSTE2DQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaTE2bWVtOiRzcmMxLCBpMTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiaW11bHt3fVx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCBFRkxBR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZzbXVsX2ZsYWcgKGxvYWQgYWRkcjokc3JjMSksIGltbTokc3JjMikpXT4sDQorICAgICAgICAgICAgICAgICBPcFNpemU7DQorZGVmIElNVUwzMnJtaSAgOiBJaTMyPDB4NjksIE1STVNyY01lbSwgICAgICAgICAgICAgICAgICAgICAvLyBHUjMyID0gW21lbTMyXSpJMzINCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBpMzJtZW06JHNyYzEsIGkzMmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJpbXVse2x9XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIEVGTEFHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFg4NnNtdWxfZmxhZyAobG9hZCBhZGRyOiRzcmMxKSwgaW1tOiRzcmMyKSldPjsNCitkZWYgSU1VTDE2cm1pOCA6IElpODwweDZCLCBNUk1TcmNNZW0sICAgICAgICAgICAgICAgICAgICAgICAvLyBHUjE2ID0gW21lbTE2XSpJOA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaTE2bWVtOiRzcmMxLCBpMTZpOGltbSA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJpbXVse3d9XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZzbXVsX2ZsYWcgKGxvYWQgYWRkcjokc3JjMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMTZpbW1TRXh0ODokc3JjMikpXT4sIE9wU2l6ZTsNCitkZWYgSU1VTDMycm1pOCA6IElpODwweDZCLCBNUk1TcmNNZW0sICAgICAgICAgICAgICAgICAgICAgICAvLyBHUjMyID0gW21lbTMyXSpJOA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzI6JGRzdCksIChpbnMgaTMybWVtOiRzcmMxLCBpMzJpOGltbTogJHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJpbXVse2x9XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgRUZMQUdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChYODZzbXVsX2ZsYWcgKGxvYWQgYWRkcjokc3JjMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJpbW1TRXh0ODokc3JjMikpXT47DQorfSAvLyBEZWZzID0gW0VGTEFHU10NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFRlc3QgaW5zdHJ1Y3Rpb25zIGFyZSBqdXN0IGxpa2UgQU5ELCBleGNlcHQgdGhleSBkb24ndCBnZW5lcmF0ZSBhIHJlc3VsdC4NCisvLw0KK2xldCBEZWZzID0gW0VGTEFHU10gaW4gew0KK2xldCBpc0NvbW11dGFibGUgPSAxIGluIHsgICAvLyBURVNUIFgsIFkgICAtLT4gVEVTVCBZLCBYDQorZGVmIFRFU1Q4cnIgIDogSTwweDg0LCBNUk1TcmNSZWcsIChvdXRzKSwgIChpbnMgR1I4OiRzcmMxLCBHUjg6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0e2J9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCAoYW5kX3N1IEdSODokc3JjMSwgR1I4OiRzcmMyKSwgMCkpXT47DQorZGVmIFRFU1QxNnJyIDogSTwweDg1LCBNUk1TcmNSZWcsIChvdXRzKSwgIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgInRlc3R7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChhbmRfc3UgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgIDApKV0+LA0KKyAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBURVNUMzJyciA6IEk8MHg4NSwgTVJNU3JjUmVnLCAob3V0cyksICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0e2x9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCAoYW5kX3N1IEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAwKSldPjsNCit9DQorDQorZGVmIFRFU1Q4aTggIDogSWk4PDB4QTgsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAidGVzdHtifVx0eyRzcmMsICVhbHwlYWwsICRzcmN9IiwgW10+Ow0KK2RlZiBURVNUMTZpMTYgOiBJaTE2PDB4QTksIFJhd0ZybSwgKG91dHMpLCAoaW5zIGkxNmltbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAidGVzdHt3fVx0eyRzcmMsICVheHwlYXgsICRzcmN9IiwgW10+LCBPcFNpemU7DQorZGVmIFRFU1QzMmkzMiA6IElpMzI8MHhBOSwgUmF3RnJtLCAob3V0cyksIChpbnMgaTMyaW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0e2x9XHR7JHNyYywgJWVheHwlZWF4LCAkc3JjfSIsIFtdPjsNCisNCitkZWYgVEVTVDhybSAgOiBJPDB4ODQsIE1STVNyY01lbSwgKG91dHMpLCAgKGlucyBHUjggOiRzcmMxLCBpOG1lbSA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0e2J9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCAoYW5kIEdSODokc3JjMSwgKGxvYWRpOCBhZGRyOiRzcmMyKSksDQorICAgICAgICAgICAgICAgICAgICAgICAwKSldPjsNCitkZWYgVEVTVDE2cm0gOiBJPDB4ODUsIE1STVNyY01lbSwgKG91dHMpLCAgKGlucyBHUjE2OiRzcmMxLCBpMTZtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0e3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCAoYW5kIEdSMTY6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZGkxNiBhZGRyOiRzcmMyKSksIDApKV0+LCBPcFNpemU7DQorZGVmIFRFU1QzMnJtIDogSTwweDg1LCBNUk1TcmNNZW0sIChvdXRzKSwgIChpbnMgR1IzMjokc3JjMSwgaTMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAidGVzdHtsfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgKGFuZCBHUjMyOiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkaTMyIGFkZHI6JHNyYzIpKSwgMCkpXT47DQorDQorZGVmIFRFU1Q4cmkgIDogSWk4IDwweEY2LCBNUk0wciwgICAgICAgICAgICAgICAgICAgICAvLyBmbGFncyA9IEdSOCAgJiBpbW04DQorICAgICAgICAgICAgICAgICAgICAob3V0cyksICAoaW5zIEdSODokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInRlc3R7Yn1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgKGFuZF9zdSBHUjg6JHNyYzEsIGltbTokc3JjMiksIDApKV0+Ow0KK2RlZiBURVNUMTZyaSA6IElpMTY8MHhGNywgTVJNMHIsICAgICAgICAgICAgICAgICAgICAgLy8gZmxhZ3MgPSBHUjE2ICYgaW1tMTYNCisgICAgICAgICAgICAgICAgICAgIChvdXRzKSwgIChpbnMgR1IxNjokc3JjMSwgaTE2aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0e3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChhbmRfc3UgR1IxNjokc3JjMSwgaW1tOiRzcmMyKSwgMCkpXT4sDQorICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorZGVmIFRFU1QzMnJpIDogSWkzMjwweEY3LCBNUk0wciwgICAgICAgICAgICAgICAgICAgICAvLyBmbGFncyA9IEdSMzIgJiBpbW0zMg0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAgKGlucyBHUjMyOiRzcmMxLCBpMzJpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInRlc3R7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgKGFuZF9zdSBHUjMyOiRzcmMxLCBpbW06JHNyYzIpLCAwKSldPjsNCisNCitkZWYgVEVTVDhtaSAgOiBJaTggPDB4RjYsIE1STTBtLCAgICAgICAgICAgICAgICAgICAvLyBmbGFncyA9IFttZW04XSAgJiBpbW04DQorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaThtZW06JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0e2J9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChhbmQgKGxvYWRpOCBhZGRyOiRzcmMxKSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAwKSldPjsNCitkZWYgVEVTVDE2bWkgOiBJaTE2PDB4RjcsIE1STTBtLCAgICAgICAgICAgICAgICAgICAvLyBmbGFncyA9IFttZW0xNl0gJiBpbW0xNg0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkxNm1lbTokc3JjMSwgaTE2aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0e3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChhbmQgKGxvYWRpMTYgYWRkcjokc3JjMSksIGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgMCkpXT4sIE9wU2l6ZTsNCitkZWYgVEVTVDMybWkgOiBJaTMyPDB4RjcsIE1STTBtLCAgICAgICAgICAgICAgICAgICAvLyBmbGFncyA9IFttZW0zMl0gJiBpbW0zMg0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjMSwgaTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0e2x9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChhbmQgKGxvYWRpMzIgYWRkcjokc3JjMSksIGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgMCkpXT47DQorfSAvLyBEZWZzID0gW0VGTEFHU10NCisNCisNCisvLyBDb25kaXRpb24gY29kZSBvcHMsIGluY2wuIHNldCBpZiBlcXVhbC9ub3QgZXF1YWwvLi4uDQorbGV0IERlZnMgPSBbRUZMQUdTXSwgVXNlcyA9IFtBSF0sIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluDQorZGVmIFNBSEYgICAgIDogSTwweDlFLCBSYXdGcm0sIChvdXRzKSwgIChpbnMpLCAic2FoZiIsIFtdPjsgIC8vIGZsYWdzID0gQUgNCitsZXQgRGVmcyA9IFtBSF0sIFVzZXMgPSBbRUZMQUdTXSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4NCitkZWYgTEFIRiAgICAgOiBJPDB4OUYsIFJhd0ZybSwgKG91dHMpLCAgKGlucyksICJsYWhmIiwgW10+OyAgLy8gQUggPSBmbGFncw0KKw0KK2xldCBVc2VzID0gW0VGTEFHU10gaW4gew0KKy8vIFVzZSBzYmIgdG8gbWF0ZXJpYWxpemUgY2FycnkgYml0Lg0KK2xldCBEZWZzID0gW0VGTEFHU10sIGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCisvLyBGSVhNRTogVGhlc2UgYXJlIHBzZXVkbyBvcHMgdGhhdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBQYXQ8PiBwYXR0ZXJucy4NCisvLyBIb3dldmVyLCBQYXQ8PiBjYW4ndCByZXBsaWNhdGUgdGhlIGRlc3RpbmF0aW9uIHJlZyBpbnRvIHRoZSBpbnB1dHMgb2YgdGhlDQorLy8gcmVzdWx0Lg0KKy8vIEZJWE1FOiBDaGFuZ2UgdGhlc2UgdG8gaGF2ZSBlbmNvZGluZyBQc2V1ZG8gd2hlbiBYODZNQ0NvZGVFbWl0dGVyIHJlcGxhY2VzDQorLy8gWDg2Q29kZUVtaXR0ZXIuDQorZGVmIFNFVEJfQzhyIDogSTwweDE4LCBNUk1Jbml0UmVnLCAob3V0cyBHUjg6JGRzdCksIChpbnMpLCAiIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoWDg2c2V0Y2NfYyBYODZfQ09ORF9CLCBFRkxBR1MpKV0+Ow0KK2RlZiBTRVRCX0MxNnIgOiBJPDB4MTksIE1STUluaXRSZWcsIChvdXRzIEdSMTY6JGRzdCksIChpbnMpLCAiIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKFg4NnNldGNjX2MgWDg2X0NPTkRfQiwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBTRVRCX0MzMnIgOiBJPDB4MTksIE1STUluaXRSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMpLCAiIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NnNldGNjX2MgWDg2X0NPTkRfQiwgRUZMQUdTKSldPjsNCit9IC8vIGlzQ29kZUdlbk9ubHkNCisNCitkZWYgU0VURXIgICAgOiBJPDB4OTQsIE1STTByLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEdSOCAgIDokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICAic2V0ZVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKFg4NnNldGNjIFg4Nl9DT05EX0UsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1I4ID0gPT0NCitkZWYgU0VURW0gICAgOiBJPDB4OTQsIE1STTBtLCANCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpOG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJzZXRlXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKFg4NnNldGNjIFg4Nl9DT05EX0UsIEVGTEFHUyksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBbbWVtOF0gPSA9PQ0KKw0KK2RlZiBTRVRORXIgICA6IEk8MHg5NSwgTVJNMHIsIA0KKyAgICAgICAgICAgICAgICAgKG91dHMgR1I4ICAgOiRkc3QpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICJzZXRuZVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKFg4NnNldGNjIFg4Nl9DT05EX05FLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgIFRCOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdSOCA9ICE9DQorZGVmIFNFVE5FbSAgIDogSTwweDk1LCBNUk0wbSwgDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaThtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAic2V0bmVcdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2V0Y2MgWDg2X0NPTkRfTkUsIEVGTEFHUyksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBbbWVtOF0gPSAhPQ0KKw0KK2RlZiBTRVRMciAgICA6IEk8MHg5QywgTVJNMHIsIA0KKyAgICAgICAgICAgICAgICAgKG91dHMgR1I4ICAgOiRkc3QpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICJzZXRsXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoWDg2c2V0Y2MgWDg2X0NPTkRfTCwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHUjggPSA8ICBzaWduZWQNCitkZWYgU0VUTG0gICAgOiBJPDB4OUMsIE1STTBtLCANCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpOG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJzZXRsXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKFg4NnNldGNjIFg4Nl9DT05EX0wsIEVGTEFHUyksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBbbWVtOF0gPSA8ICBzaWduZWQNCisNCitkZWYgU0VUR0VyICAgOiBJPDB4OUQsIE1STTByLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEdSOCAgIDokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICAic2V0Z2VcdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChYODZzZXRjYyBYODZfQ09ORF9HRSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHUjggPSA+PSBzaWduZWQNCitkZWYgU0VUR0VtICAgOiBJPDB4OUQsIE1STTBtLCANCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpOG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJzZXRnZVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChYODZzZXRjYyBYODZfQ09ORF9HRSwgRUZMQUdTKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgIFRCOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFttZW04XSA9ID49IHNpZ25lZA0KKw0KK2RlZiBTRVRMRXIgICA6IEk8MHg5RSwgTVJNMHIsIA0KKyAgICAgICAgICAgICAgICAgKG91dHMgR1I4ICAgOiRkc3QpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICJzZXRsZVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKFg4NnNldGNjIFg4Nl9DT05EX0xFLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgIFRCOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdSOCA9IDw9IHNpZ25lZA0KK2RlZiBTRVRMRW0gICA6IEk8MHg5RSwgTVJNMG0sIA0KKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgInNldGxlXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKFg4NnNldGNjIFg4Nl9DT05EX0xFLCBFRkxBR1MpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gW21lbThdID0gPD0gc2lnbmVkDQorDQorZGVmIFNFVEdyICAgIDogSTwweDlGLCBNUk0wciwgDQorICAgICAgICAgICAgICAgICAob3V0cyBHUjggICA6JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgInNldGdcdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChYODZzZXRjYyBYODZfQ09ORF9HLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgIFRCOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdSOCA9ID4gIHNpZ25lZA0KK2RlZiBTRVRHbSAgICA6IEk8MHg5RiwgTVJNMG0sIA0KKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgInNldGdcdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2V0Y2MgWDg2X0NPTkRfRywgRUZMQUdTKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgIFRCOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFttZW04XSA9ID4gIHNpZ25lZA0KKw0KK2RlZiBTRVRCciAgICA6IEk8MHg5MiwgTVJNMHIsDQorICAgICAgICAgICAgICAgICAob3V0cyBHUjggICA6JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgInNldGJcdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChYODZzZXRjYyBYODZfQ09ORF9CLCBFRkxBR1MpKV0+LA0KKyAgICAgICAgICAgICAgIFRCOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdSOCA9IDwgIHVuc2lnbg0KK2RlZiBTRVRCbSAgICA6IEk8MHg5MiwgTVJNMG0sDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaThtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAic2V0Ylx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChYODZzZXRjYyBYODZfQ09ORF9CLCBFRkxBR1MpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gW21lbThdID0gPCAgdW5zaWduDQorDQorZGVmIFNFVEFFciAgIDogSTwweDkzLCBNUk0wciwgDQorICAgICAgICAgICAgICAgICAob3V0cyBHUjggICA6JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgInNldGFlXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoWDg2c2V0Y2MgWDg2X0NPTkRfQUUsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1I4ID0gPj0gdW5zaWduDQorZGVmIFNFVEFFbSAgIDogSTwweDkzLCBNUk0wbSwgDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaThtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAic2V0YWVcdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2V0Y2MgWDg2X0NPTkRfQUUsIEVGTEFHUyksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBbbWVtOF0gPSA+PSB1bnNpZ24NCisNCitkZWYgU0VUQkVyICAgOiBJPDB4OTYsIE1STTByLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEdSOCAgIDokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICAic2V0YmVcdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChYODZzZXRjYyBYODZfQ09ORF9CRSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHUjggPSA8PSB1bnNpZ24NCitkZWYgU0VUQkVtICAgOiBJPDB4OTYsIE1STTBtLCANCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpOG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJzZXRiZVx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChYODZzZXRjYyBYODZfQ09ORF9CRSwgRUZMQUdTKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgIFRCOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFttZW04XSA9IDw9IHVuc2lnbg0KKw0KK2RlZiBTRVRBciAgICA6IEk8MHg5NywgTVJNMHIsIA0KKyAgICAgICAgICAgICAgICAgKG91dHMgR1I4ICAgOiRkc3QpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICJzZXRhXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoWDg2c2V0Y2MgWDg2X0NPTkRfQSwgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHUjggPSA+ICBzaWduZWQNCitkZWYgU0VUQW0gICAgOiBJPDB4OTcsIE1STTBtLCANCisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpOG1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICJzZXRhXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKFg4NnNldGNjIFg4Nl9DT05EX0EsIEVGTEFHUyksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBbbWVtOF0gPSA+ICBzaWduZWQNCisNCitkZWYgU0VUU3IgICAgOiBJPDB4OTgsIE1STTByLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEdSOCAgIDokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICAic2V0c1x0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKFg4NnNldGNjIFg4Nl9DT05EX1MsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1I4ID0gPHNpZ24gYml0Pg0KK2RlZiBTRVRTbSAgICA6IEk8MHg5OCwgTVJNMG0sIA0KKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgInNldHNcdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2V0Y2MgWDg2X0NPTkRfUywgRUZMQUdTKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgIFRCOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFttZW04XSA9IDxzaWduIGJpdD4NCitkZWYgU0VUTlNyICAgOiBJPDB4OTksIE1STTByLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEdSOCAgIDokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICAic2V0bnNcdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChYODZzZXRjYyBYODZfQ09ORF9OUywgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHUjggPSAhPHNpZ24gYml0Pg0KK2RlZiBTRVROU20gICA6IEk8MHg5OSwgTVJNMG0sIA0KKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgInNldG5zXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKFg4NnNldGNjIFg4Nl9DT05EX05TLCBFRkxBR1MpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gW21lbThdID0gITxzaWduIGJpdD4NCisNCitkZWYgU0VUUHIgICAgOiBJPDB4OUEsIE1STTByLCANCisgICAgICAgICAgICAgICAgIChvdXRzIEdSOCAgIDokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICAic2V0cFx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKFg4NnNldGNjIFg4Nl9DT05EX1AsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1I4ID0gcGFyaXR5DQorZGVmIFNFVFBtICAgIDogSTwweDlBLCBNUk0wbSwgDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaThtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAic2V0cFx0JGRzdCIsDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChYODZzZXRjYyBYODZfQ09ORF9QLCBFRkxBR1MpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gW21lbThdID0gcGFyaXR5DQorZGVmIFNFVE5QciAgIDogSTwweDlCLCBNUk0wciwgDQorICAgICAgICAgICAgICAgICAob3V0cyBHUjggICA6JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgInNldG5wXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoWDg2c2V0Y2MgWDg2X0NPTkRfTlAsIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1I4ID0gbm90IHBhcml0eQ0KK2RlZiBTRVROUG0gICA6IEk8MHg5QiwgTVJNMG0sIA0KKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgInNldG5wXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKFg4NnNldGNjIFg4Nl9DT05EX05QLCBFRkxBR1MpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gW21lbThdID0gbm90IHBhcml0eQ0KKw0KK2RlZiBTRVRPciAgICA6IEk8MHg5MCwgTVJNMHIsIA0KKyAgICAgICAgICAgICAgICAgKG91dHMgR1I4ICAgOiRkc3QpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICJzZXRvXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoWDg2c2V0Y2MgWDg2X0NPTkRfTywgRUZMQUdTKSldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHUjggPSBvdmVyZmxvdw0KK2RlZiBTRVRPbSAgICA6IEk8MHg5MCwgTVJNMG0sIA0KKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgInNldG9cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2V0Y2MgWDg2X0NPTkRfTywgRUZMQUdTKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgIFRCOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFttZW04XSA9IG92ZXJmbG93DQorZGVmIFNFVE5PciAgIDogSTwweDkxLCBNUk0wciwgDQorICAgICAgICAgICAgICAgICAob3V0cyBHUjggICA6JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgInNldG5vXHQkZHN0IiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoWDg2c2V0Y2MgWDg2X0NPTkRfTk8sIEVGTEFHUykpXT4sDQorICAgICAgICAgICAgICAgVEI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1I4ID0gbm90IG92ZXJmbG93DQorZGVmIFNFVE5PbSAgIDogSTwweDkxLCBNUk0wbSwgDQorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaThtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAic2V0bm9cdCRkc3QiLA0KKyAgICAgICAgICAgICAgICAgWyhzdG9yZSAoWDg2c2V0Y2MgWDg2X0NPTkRfTk8sIEVGTEFHUyksIGFkZHI6JGRzdCldPiwNCisgICAgICAgICAgICAgICBUQjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBbbWVtOF0gPSBub3Qgb3ZlcmZsb3cNCit9IC8vIFVzZXMgPSBbRUZMQUdTXQ0KKw0KKw0KKy8vIEludGVnZXIgY29tcGFyaXNvbnMNCitsZXQgRGVmcyA9IFtFRkxBR1NdIGluIHsNCitkZWYgQ01QOGk4IDogSWk4PDB4M0MsIFJhd0ZybSwgKG91dHMpLCAoaW5zIGk4aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgImNtcHtifVx0eyRzcmMsICVhbHwlYWwsICRzcmN9IiwgW10+Ow0KK2RlZiBDTVAxNmkxNiA6IElpMTY8MHgzRCwgUmF3RnJtLCAob3V0cyksIChpbnMgaTE2aW1tOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgImNtcHt3fVx0eyRzcmMsICVheHwlYXgsICRzcmN9IiwgW10+LCBPcFNpemU7DQorZGVmIENNUDMyaTMyIDogSWkzMjwweDNELCBSYXdGcm0sIChvdXRzKSwgKGlucyBpMzJpbW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAiY21we2x9XHR7JHNyYywgJWVheHwlZWF4LCAkc3JjfSIsIFtdPjsNCisNCitkZWYgQ01QOHJyICA6IEk8MHgzOCwgTVJNRGVzdFJlZywNCisgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSOCA6JHNyYzEsIEdSOCA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiY21we2J9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgR1I4OiRzcmMxLCBHUjg6JHNyYzIpKV0+Ow0KK2RlZiBDTVAxNnJyIDogSTwweDM5LCBNUk1EZXN0UmVnLA0KKyAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICJjbXB7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSldPiwgT3BTaXplOw0KK2RlZiBDTVAzMnJyIDogSTwweDM5LCBNUk1EZXN0UmVnLA0KKyAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICJjbXB7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSldPjsNCitkZWYgQ01QOG1yICA6IEk8MHgzOCwgTVJNRGVzdE1lbSwNCisgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGk4bWVtIDokc3JjMSwgR1I4IDokc3JjMiksDQorICAgICAgICAgICAgICAgICJjbXB7Yn1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCAobG9hZGk4IGFkZHI6JHNyYzEpLCBHUjg6JHNyYzIpKV0+Ow0KK2RlZiBDTVAxNm1yIDogSTwweDM5LCBNUk1EZXN0TWVtLA0KKyAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgImNtcHt3fVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChsb2FkaTE2IGFkZHI6JHNyYzEpLCBHUjE2OiRzcmMyKSldPiwNCisgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCitkZWYgQ01QMzJtciA6IEk8MHgzOSwgTVJNRGVzdE1lbSwNCisgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICJjbXB7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCAobG9hZGkzMiBhZGRyOiRzcmMxKSwgR1IzMjokc3JjMikpXT47DQorZGVmIENNUDhybSAgOiBJPDB4M0EsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSOCA6JHNyYzEsIGk4bWVtIDokc3JjMiksDQorICAgICAgICAgICAgICAgICJjbXB7Yn1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCBHUjg6JHNyYzEsIChsb2FkaTggYWRkcjokc3JjMikpKV0+Ow0KK2RlZiBDTVAxNnJtIDogSTwweDNCLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjE2OiRzcmMxLCBpMTZtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiY21we3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgR1IxNjokc3JjMSwgKGxvYWRpMTYgYWRkcjokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBDTVAzMnJtIDogSTwweDNCLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjMyOiRzcmMxLCBpMzJtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiY21we2x9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgR1IzMjokc3JjMSwgKGxvYWRpMzIgYWRkcjokc3JjMikpKV0+Ow0KKw0KKy8vIFRoZXNlIGFyZSBhbHRlcm5hdGUgc3BlbGxpbmdzIGZvciB1c2UgYnkgdGhlIGRpc2Fzc2VtYmxlciwgd2UgbWFyayB0aGVtIGFzDQorLy8gY29kZSBnZW4gb25seSB0byBlbnN1cmUgdGhleSBhcmVuJ3QgbWF0Y2hlZCBieSB0aGUgYXNzZW1ibGVyLg0KK2xldCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorICBkZWYgQ01QOHJyX2FsdCA6IEk8MHgzQSwgTVJNU3JjUmVnLCAob3V0cyksIChpbnMgR1I4OiRzcmMxLCBHUjg6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImNtcHtifVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+Ow0KKyAgZGVmIENNUDE2cnJfYWx0IDogSTwweDNCLCBNUk1TcmNSZWcsIChvdXRzKSwgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAiY21we3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIE9wU2l6ZTsNCisgIGRlZiBDTVAzMnJyX2FsdCA6IEk8MHgzQiwgTVJNU3JjUmVnLCAob3V0cyksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgImNtcHtsfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+Ow0KK30NCisNCitkZWYgQ01QOHJpICA6IElpODwweDgwLCBNUk03ciwNCisgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1I4OiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgImNtcHtifVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgR1I4OiRzcmMxLCBpbW06JHNyYzIpKV0+Ow0KK2RlZiBDTVAxNnJpIDogSWkxNjwweDgxLCBNUk03ciwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbXB7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCBHUjE2OiRzcmMxLCBpbW06JHNyYzIpKV0+LCBPcFNpemU7DQorZGVmIENNUDMycmkgOiBJaTMyPDB4ODEsIE1STTdyLA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1IzMjokc3JjMSwgaTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtcHtsfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIEdSMzI6JHNyYzEsIGltbTokc3JjMikpXT47DQorZGVmIENNUDhtaSAgOiBJaTggPDB4ODAsIE1STTdtLA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaThtZW0gOiRzcmMxLCBpOGltbSA6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAiY21we2J9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZjbXAgKGxvYWRpOCBhZGRyOiRzcmMxKSwgaW1tOiRzcmMyKSldPjsNCitkZWYgQ01QMTZtaSA6IElpMTY8MHg4MSwgTVJNN20sDQorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMTZtZW06JHNyYzEsIGkxNmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbXB7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCAobG9hZGkxNiBhZGRyOiRzcmMxKSwgaW1tOiRzcmMyKSldPiwNCisgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBDTVAzMm1pIDogSWkzMjwweDgxLCBNUk03bSwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjMSwgaTMyaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtcHtsfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChsb2FkaTMyIGFkZHI6JHNyYzEpLCBpbW06JHNyYzIpKV0+Ow0KK2RlZiBDTVAxNnJpOCA6IElpODwweDgzLCBNUk03ciwNCisgICAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtcHt3fVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIEdSMTY6JHNyYzEsIGkxNmltbVNFeHQ4OiRzcmMyKSldPiwNCisgICAgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCitkZWYgQ01QMTZtaTggOiBJaTg8MHg4MywgTVJNN20sDQorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBpMTZtZW06JHNyYzEsIGkxNmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgImNtcHt3fVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2Y21wIChsb2FkaTE2IGFkZHI6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE2aW1tU0V4dDg6JHNyYzIpKV0+LCBPcFNpemU7DQorZGVmIENNUDMybWk4IDogSWk4PDB4ODMsIE1STTdtLA0KKyAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMybWVtOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbXB7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCAobG9hZGkzMiBhZGRyOiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMmltbVNFeHQ4OiRzcmMyKSldPjsNCitkZWYgQ01QMzJyaTggOiBJaTg8MHg4MywgTVJNN3IsDQorICAgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUjMyOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICJjbXB7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmNtcCBHUjMyOiRzcmMxLCBpMzJpbW1TRXh0ODokc3JjMikpXT47DQorfSAvLyBEZWZzID0gW0VGTEFHU10NCisNCisvLyBCaXQgdGVzdHMuDQorLy8gVE9ETzogQlRDLCBCVFIsIGFuZCBCVFMNCitsZXQgRGVmcyA9IFtFRkxBR1NdIGluIHsNCitkZWYgQlQxNnJyIDogSTwweEEzLCBNUk1EZXN0UmVnLCAob3V0cyksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgImJ0e3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmJ0IEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpKV0+LCBPcFNpemUsIFRCOw0KK2RlZiBCVDMycnIgOiBJPDB4QTMsIE1STURlc3RSZWcsIChvdXRzKSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAiYnR7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2YnQgR1IzMjokc3JjMSwgR1IzMjokc3JjMikpXT4sIFRCOw0KKw0KKy8vIFVubGlrZSB3aXRoIHRoZSByZWdpc3RlcityZWdpc3RlciBmb3JtLCB0aGUgbWVtb3J5K3JlZ2lzdGVyIGZvcm0gb2YgdGhlDQorLy8gYnQgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaWdub3JlIHRoZSBoaWdoIGJpdHMgb2YgdGhlIGluZGV4LiBGcm9tIElTZWwncw0KKy8vIHBlcnNwZWN0aXZlLCB0aGlzIGlzIHByZXR0eSBiaXphcnJlLiBNYWtlIHRoZXNlIGluc3RydWN0aW9ucyBkaXNhc3NlbWJseQ0KKy8vIG9ubHkgZm9yIG5vdy4NCisNCitkZWYgQlQxNm1yIDogSTwweEEzLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAiYnR7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIA0KKy8vICAgICAgICAgICAgICAgWyhYODZidCAobG9hZGkxNiBhZGRyOiRzcmMxKSwgR1IxNjokc3JjMiksDQorLy8gICAgICAgICAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldDQorICAgICAgICAgICAgICAgW10NCisgICAgICAgICAgICAgICA+LCBPcFNpemUsIFRCLCBSZXF1aXJlczxbRmFzdEJUTWVtXT47DQorZGVmIEJUMzJtciA6IEk8MHhBMywgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgImJ0e2x9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCANCisvLyAgICAgICAgICAgICAgIFsoWDg2YnQgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIpLA0KKy8vICAgICAgICAgICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXQ0KKyAgICAgICAgICAgICAgIFtdDQorICAgICAgICAgICAgICAgPiwgVEIsIFJlcXVpcmVzPFtGYXN0QlRNZW1dPjsNCisNCitkZWYgQlQxNnJpOCA6IElpODwweEJBLCBNUk00ciwgKG91dHMpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgImJ0e3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZidCBHUjE2OiRzcmMxLCBpMTZpbW1TRXh0ODokc3JjMikpXT4sDQorICAgICAgICAgICAgICAgIE9wU2l6ZSwgVEI7DQorZGVmIEJUMzJyaTggOiBJaTg8MHhCQSwgTVJNNHIsIChvdXRzKSwgKGlucyBHUjMyOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICJidHtsfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2YnQgR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpKV0+LCBUQjsNCisvLyBOb3RlIHRoYXQgdGhlc2UgaW5zdHJ1Y3Rpb25zIGRvbid0IG5lZWQgRmFzdEJUTWVtIGJlY2F1c2UgdGhhdA0KKy8vIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBvdGhlciBvcGVyYW5kIGlzIGluIGEgcmVnaXN0ZXIuIFdoZW4gaXQncw0KKy8vIGFuIGltbWVkaWF0ZSwgYnQgaXMgc3RpbGwgZmFzdC4NCitkZWYgQlQxNm1pOCA6IElpODwweEJBLCBNUk00bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokc3JjMSwgaTE2aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiYnR7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmJ0IChsb2FkaTE2IGFkZHI6JHNyYzEpLCBpMTZpbW1TRXh0ODokc3JjMikpDQorICAgICAgICAgICAgICAgICBdPiwgT3BTaXplLCBUQjsNCitkZWYgQlQzMm1pOCA6IElpODwweEJBLCBNUk00bSwgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiYnR7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NmJ0IChsb2FkaTMyIGFkZHI6JHNyYzEpLCBpMzJpbW1TRXh0ODokc3JjMikpDQorICAgICAgICAgICAgICAgICBdPiwgVEI7DQorDQorZGVmIEJUQzE2cnIgOiBJPDB4QkIsIE1STURlc3RSZWcsIChvdXRzKSwgKGlucyBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgImJ0Y3t3fVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBPcFNpemUsIFRCOw0KK2RlZiBCVEMzMnJyIDogSTwweEJCLCBNUk1EZXN0UmVnLCAob3V0cyksIChpbnMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICJidGN7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIFtdPiwgVEI7DQorZGVmIEJUQzE2bXIgOiBJPDB4QkIsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMTZtZW06JHNyYzEsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiYnRje3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIE9wU2l6ZSwgVEI7DQorZGVmIEJUQzMybXIgOiBJPDB4QkIsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiYnRje2x9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIFRCOw0KK2RlZiBCVEMxNnJpOCA6IElpODwweEJBLCBNUk03ciwgKG91dHMpLCAoaW5zIEdSMTY6JHNyYzEsIGkxNmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJidGN7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIFtdPiwgT3BTaXplLCBUQjsNCitkZWYgQlRDMzJyaTggOiBJaTg8MHhCQSwgTVJNN3IsIChvdXRzKSwgKGlucyBHUjMyOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYnRje2x9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIFRCOw0KK2RlZiBCVEMxNm1pOCA6IElpODwweEJBLCBNUk03bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokc3JjMSwgaTE2aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImJ0Y3t3fVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBPcFNpemUsIFRCOw0KK2RlZiBCVEMzMm1pOCA6IElpODwweEJBLCBNUk03bSwgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImJ0Y3tsfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCisNCitkZWYgQlRSMTZyciA6IEk8MHhCMywgTVJNRGVzdFJlZywgKG91dHMpLCAoaW5zIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiYnRye3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIE9wU2l6ZSwgVEI7DQorZGVmIEJUUjMycnIgOiBJPDB4QjMsIE1STURlc3RSZWcsIChvdXRzKSwgKGlucyBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgImJ0cntsfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRSMTZtciA6IEk8MHhCMywgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICJidHJ7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIFtdPiwgT3BTaXplLCBUQjsNCitkZWYgQlRSMzJtciA6IEk8MHhCMywgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICJidHJ7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIFtdPiwgVEI7DQorZGVmIEJUUjE2cmk4IDogSWk4PDB4QkEsIE1STTZyLCAob3V0cyksIChpbnMgR1IxNjokc3JjMSwgaTE2aThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImJ0cnt3fVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBPcFNpemUsIFRCOw0KK2RlZiBCVFIzMnJpOCA6IElpODwweEJBLCBNUk02ciwgKG91dHMpLCAoaW5zIEdSMzI6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJidHJ7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIFtdPiwgVEI7DQorZGVmIEJUUjE2bWk4IDogSWk4PDB4QkEsIE1STTZtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMxLCBpMTZpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYnRye3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIE9wU2l6ZSwgVEI7DQorZGVmIEJUUjMybWk4IDogSWk4PDB4QkEsIE1STTZtLCAob3V0cyksIChpbnMgaTMybWVtOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYnRye2x9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIFRCOw0KKw0KK2RlZiBCVFMxNnJyIDogSTwweEFCLCBNUk1EZXN0UmVnLCAob3V0cyksIChpbnMgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICJidHN7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIFtdPiwgT3BTaXplLCBUQjsNCitkZWYgQlRTMzJyciA6IEk8MHhBQiwgTVJNRGVzdFJlZywgKG91dHMpLCAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAiYnRze2x9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIFRCOw0KK2RlZiBCVFMxNm1yIDogSTwweEFCLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgImJ0c3t3fVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBPcFNpemUsIFRCOw0KK2RlZiBCVFMzMm1yIDogSTwweEFCLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTMybWVtOiRzcmMxLCBHUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgImJ0c3tsfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRTMTZyaTggOiBJaTg8MHhCQSwgTVJNNXIsIChvdXRzKSwgKGlucyBHUjE2OiRzcmMxLCBpMTZpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAiYnRze3d9XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLCBbXT4sIE9wU2l6ZSwgVEI7DQorZGVmIEJUUzMycmk4IDogSWk4PDB4QkEsIE1STTVyLCAob3V0cyksIChpbnMgR1IzMjokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImJ0c3tsfVx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwgW10+LCBUQjsNCitkZWYgQlRTMTZtaTggOiBJaTg8MHhCQSwgTVJNNW0sIChvdXRzKSwgKGlucyBpMTZtZW06JHNyYzEsIGkxNmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJidHN7d31cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIFtdPiwgT3BTaXplLCBUQjsNCitkZWYgQlRTMzJtaTggOiBJaTg8MHhCQSwgTVJNNW0sIChvdXRzKSwgKGlucyBpMzJtZW06JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJidHN7bH1cdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsIFtdPiwgVEI7DQorfSAvLyBEZWZzID0gW0VGTEFHU10NCisNCisvLyBTaWduL1plcm8gZXh0ZW5kZXJzDQorLy8gVXNlIG1vdnNibCBpbnRlYWQgb2YgbW92c2J3OyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBoaWdoIDE2IGJpdHMNCisvLyBvZiB0aGUgcmVnaXN0ZXIgaGVyZS4gVGhpcyBoYXMgYSBzbWFsbGVyIGVuY29kaW5nIGFuZCBhdm9pZHMgYQ0KKy8vIHBhcnRpYWwtcmVnaXN0ZXIgdXBkYXRlLiAgQWN0dWFsIG1vdnNidyBpbmNsdWRlZCBmb3IgdGhlIGRpc2Fzc2VtYmxlci4NCitkZWYgTU9WU1gxNnJyOFcgOiBJPDB4QkUsIE1STVNyY1JlZywgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAibW92c3tid3x4fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCLCBPcFNpemU7DQorZGVmIE1PVlNYMTZybThXIDogSTwweEJFLCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaThtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAibW92c3tid3x4fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCLCBPcFNpemU7DQorZGVmIE1PVlNYMTZycjggOiBJPDB4QkUsIE1STVNyY1JlZywgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjggOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiIiwgWyhzZXQgR1IxNjokZHN0LCAoc2V4dCBHUjg6JHNyYykpXT4sIFRCOw0KK2RlZiBNT1ZTWDE2cm04IDogSTwweEJFLCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaThtZW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiIiwgWyhzZXQgR1IxNjokZHN0LCAoc2V4dGxvYWRpMTZpOCBhZGRyOiRzcmMpKV0+LCBUQjsNCitkZWYgTU9WU1gzMnJyOCA6IEk8MHhCRSwgTVJNU3JjUmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSOCA6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Zze2JsfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHNleHQgR1I4OiRzcmMpKV0+LCBUQjsNCitkZWYgTU9WU1gzMnJtOCA6IEk8MHhCRSwgTVJNU3JjTWVtLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIGk4bWVtIDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdnN7Ymx8eH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoc2V4dGxvYWRpMzJpOCBhZGRyOiRzcmMpKV0+LCBUQjsNCitkZWYgTU9WU1gzMnJyMTY6IEk8MHhCRiwgTVJNU3JjUmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Zze3dsfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHNleHQgR1IxNjokc3JjKSldPiwgVEI7DQorZGVmIE1PVlNYMzJybTE2OiBJPDB4QkYsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Zze3dsfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHNleHRsb2FkaTMyaTE2IGFkZHI6JHNyYykpXT4sIFRCOw0KKw0KKy8vIFVzZSBtb3Z6YmwgaW50ZWFkIG9mIG1vdnpidzsgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgaGlnaCAxNiBiaXRzDQorLy8gb2YgdGhlIHJlZ2lzdGVyIGhlcmUuIFRoaXMgaGFzIGEgc21hbGxlciBlbmNvZGluZyBhbmQgYXZvaWRzIGENCisvLyBwYXJ0aWFsLXJlZ2lzdGVyIHVwZGF0ZS4gIEFjdHVhbCBtb3Z6YncgaW5jbHVkZWQgZm9yIHRoZSBkaXNhc3NlbWJsZXIuDQorZGVmIE1PVlpYMTZycjhXIDogSTwweEI2LCBNUk1TcmNSZWcsIChvdXRzIEdSMTY6JGRzdCksIChpbnMgR1I4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIm1vdnp7Ynd8eH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQiwgT3BTaXplOw0KK2RlZiBNT1ZaWDE2cm04VyA6IEk8MHhCNiwgTVJNU3JjTWVtLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIGk4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIm1vdnp7Ynd8eH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQiwgT3BTaXplOyAgDQorZGVmIE1PVlpYMTZycjggOiBJPDB4QjYsIE1STVNyY1JlZywgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjggOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiIiwgWyhzZXQgR1IxNjokZHN0LCAoemV4dCBHUjg6JHNyYykpXT4sIFRCOw0KK2RlZiBNT1ZaWDE2cm04IDogSTwweEI2LCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaThtZW0gOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiIiwgWyhzZXQgR1IxNjokZHN0LCAoemV4dGxvYWRpMTZpOCBhZGRyOiRzcmMpKV0+LCBUQjsNCitkZWYgTU9WWlgzMnJyOCA6IEk8MHhCNiwgTVJNU3JjUmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSOCA6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z6e2JsfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHpleHQgR1I4OiRzcmMpKV0+LCBUQjsNCitkZWYgTU9WWlgzMnJtOCA6IEk8MHhCNiwgTVJNU3JjTWVtLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIGk4bWVtIDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdnp7Ymx8eH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoemV4dGxvYWRpMzJpOCBhZGRyOiRzcmMpKV0+LCBUQjsNCitkZWYgTU9WWlgzMnJyMTY6IEk8MHhCNywgTVJNU3JjUmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z6e3dsfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHpleHQgR1IxNjokc3JjKSldPiwgVEI7DQorZGVmIE1PVlpYMzJybTE2OiBJPDB4QjcsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z6e3dsfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHpleHRsb2FkaTMyaTE2IGFkZHI6JHNyYykpXT4sIFRCOw0KKw0KKy8vIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyB0aGUgcmVndWxhciBNT1ZaWDMycnI4IGFuZCBNT1ZaWDMycm04DQorLy8gZXhjZXB0IHRoYXQgdGhleSB1c2UgR1IzMl9OT1JFWCBmb3IgdGhlIG91dHB1dCBvcGVyYW5kIHJlZ2lzdGVyIGNsYXNzDQorLy8gaW5zdGVhZCBvZiBHUjMyLiBUaGlzIGFsbG93cyB0aGVtIHRvIG9wZXJhdGUgb24gaCByZWdpc3RlcnMgb24geDg2LTY0Lg0KK2RlZiBNT1ZaWDMyX05PUkVYcnI4IDogSTwweEI2LCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzJfTk9SRVg6JGRzdCksIChpbnMgR1I4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAibW92entibHx4fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30gICMgTk9SRVgiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbXT4sIFRCOw0KK2xldCBtYXlMb2FkID0gMSBpbg0KK2RlZiBNT1ZaWDMyX05PUkVYcm04IDogSTwweEI2LCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSMzJfTk9SRVg6JGRzdCksIChpbnMgaThtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJtb3Z6e2JsfHh9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSAgIyBOT1JFWCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFtdPiwgVEI7DQorDQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCisgIGxldCBEZWZzID0gW0FYXSwgVXNlcyA9IFtBTF0gaW4NCisgIGRlZiBDQlcgOiBJPDB4OTgsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICJ7Y2J0d3xjYnd9IiwgW10+LCBPcFNpemU7ICAgLy8gQVggPSBzaWduZXh0KEFMKQ0KKyAgbGV0IERlZnMgPSBbRUFYXSwgVXNlcyA9IFtBWF0gaW4NCisgIGRlZiBDV0RFIDogSTwweDk4LCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAie2N3dGx8Y3dkZX0iLCBbXT47ICAgLy8gRUFYID0gc2lnbmV4dChBWCkNCisNCisgIGxldCBEZWZzID0gW0FYLERYXSwgVXNlcyA9IFtBWF0gaW4NCisgIGRlZiBDV0QgOiBJPDB4OTksIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICJ7Y3d0ZHxjd2R9IiwgW10+LCBPcFNpemU7IC8vIERYOkFYID0gc2lnbmV4dChBWCkNCisgIGxldCBEZWZzID0gW0VBWCxFRFhdLCBVc2VzID0gW0VBWF0gaW4NCisgIGRlZiBDRFEgOiBJPDB4OTksIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICJ7Y2x0ZHxjZHF9IiwgW10+OyAvLyBFRFg6RUFYID0gc2lnbmV4dChFQVgpDQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQWxpYXMgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBBbGlhcyBpbnN0cnVjdGlvbnMgdGhhdCBtYXAgbW92cjAgdG8geG9yLg0KKy8vIEZJWE1FOiByZW1vdmUgd2hlbiB3ZSBjYW4gdGVhY2ggcmVnYWxsb2MgdGhhdCB4b3IgcmVnLCByZWcgaXMgb2suDQorLy8gRklYTUU6IFNldCBlbmNvZGluZyB0byBwc2V1ZG8uDQorbGV0IERlZnMgPSBbRUZMQUdTXSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSwgaXNBc0NoZWFwQXNBTW92ZSA9IDEsDQorICAgIGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCitkZWYgTU9WOHIwICAgOiBJPDB4MzAsIE1STUluaXRSZWcsIChvdXRzIEdSOCA6JGRzdCksIChpbnMpLCAiIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAwKV0+Ow0KKw0KKy8vIFdlIHdhbnQgdG8gcmV3cml0ZSBNT1YxNnIwIGluIHRlcm1zIG9mIE1PVjMycjAsIGJlY2F1c2UgaXQncyBhIHNtYWxsZXINCisvLyBlbmNvZGluZyBhbmQgYXZvaWRzIGEgcGFydGlhbC1yZWdpc3RlciB1cGRhdGUgc29tZXRpbWVzLCBidXQgZG9pbmcgc28NCisvLyBhdCBpc2VsIHRpbWUgaW50ZXJmZXJlcyB3aXRoIHJlbWF0ZXJpYWxpemF0aW9uIGluIHRoZSBjdXJyZW50IHJlZ2lzdGVyDQorLy8gYWxsb2NhdG9yLiBGb3Igbm93LCB0aGlzIGlzIHJld3JpdHRlbiB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyBsb3dlcmVkDQorLy8gdG8gYW4gTUNJbnN0Lg0KK2RlZiBNT1YxNnIwICAgOiBJPDB4MzEsIE1STUluaXRSZWcsIChvdXRzIEdSMTY6JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAgIiIsDQorICAgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIDApXT4sIE9wU2l6ZTsNCisgICAgICAgICAgICAgICAgIA0KKy8vIEZJWE1FOiBTZXQgZW5jb2RpbmcgdG8gcHNldWRvLg0KK2RlZiBNT1YzMnIwICA6IEk8MHgzMSwgTVJNSW5pdFJlZywgKG91dHMgR1IzMjokZHN0KSwgKGlucyksICIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAwKV0+Ow0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFRocmVhZCBMb2NhbCBTdG9yYWdlIEluc3RydWN0aW9ucw0KKy8vDQorDQorLy8gRUxGIFRMUyBTdXBwb3J0DQorLy8gQWxsIGNhbGxzIGNsb2JiZXIgdGhlIG5vbi1jYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLiBFU1AgaXMgbWFya2VkIGFzDQorLy8gYSB1c2UgdG8gcHJldmVudCBzdGFjay1wb2ludGVyIGFzc2lnbm1lbnRzIHRoYXQgYXBwZWFyIGltbWVkaWF0ZWx5DQorLy8gYmVmb3JlIGNhbGxzIGZyb20gcG90ZW50aWFsbHkgYXBwZWFyaW5nIGRlYWQuDQorbGV0IERlZnMgPSBbRUFYLCBFQ1gsIEVEWCwgRlAwLCBGUDEsIEZQMiwgRlAzLCBGUDQsIEZQNSwgRlA2LCBTVDAsDQorICAgICAgICAgICAgTU0wLCBNTTEsIE1NMiwgTU0zLCBNTTQsIE1NNSwgTU02LCBNTTcsDQorICAgICAgICAgICAgWE1NMCwgWE1NMSwgWE1NMiwgWE1NMywgWE1NNCwgWE1NNSwgWE1NNiwgWE1NNywNCisgICAgICAgICAgICBYTU04LCBYTU05LCBYTU0xMCwgWE1NMTEsIFhNTTEyLCBYTU0xMywgWE1NMTQsIFhNTTE1LCBFRkxBR1NdLA0KKyAgICBVc2VzID0gW0VTUF0gaW4NCitkZWYgVExTX2FkZHIzMiA6IEk8MCwgUHNldWRvLCAob3V0cyksIChpbnMgaTMybWVtOiRzeW0pLA0KKyAgICAgICAgICAgICAgICAgICJsZWFsXHQkc3ltLCAlZWF4OyAiDQorICAgICAgICAgICAgICAgICAgImNhbGxcdF9fX3Rsc19nZXRfYWRkckBQTFQiLA0KKyAgICAgICAgICAgICAgICAgIFsoWDg2dGxzYWRkciB0bHMzMmFkZHI6JHN5bSldPiwNCisgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCisNCisvLyBEYXJ3aW4gVExTIFN1cHBvcnQNCisvLyBGb3IgaTM4NiwgdGhlIGFkZHJlc3Mgb2YgdGhlIHRodW5rIGlzIHBhc3NlZCBvbiB0aGUgc3RhY2ssIG9uIHJldHVybiB0aGUgDQorLy8gYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUgaXMgaW4gJWVheC4gICVlY3ggaXMgdHJhc2hlZCBkdXJpbmcgdGhlIGZ1bmN0aW9uIA0KKy8vIGNhbGwuICBBbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZSBwcmVzZXJ2ZWQuDQorbGV0IERlZnMgPSBbRUFYLCBFQ1hdLA0KKyAgICBVc2VzID0gW0VTUF0sDQorICAgIHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4NCitkZWYgVExTQ2FsbF8zMiA6IEk8MCwgUHNldWRvLCAob3V0cyksIChpbnMgaTMybWVtOiRzeW0pLA0KKyAgICAgICAgICAgICAgICAiIyBUTFNDYWxsXzMyIiwNCisgICAgICAgICAgICAgICAgWyhYODZUTFNDYWxsIGFkZHI6JHN5bSldPiwNCisgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorICAgICAgICAgICAgICAgIA0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSA1LCBpc0NvZGVHZW5Pbmx5ID0gMSBpbg0KK2RlZiBHU19NT1YzMnJtIDogSTwweDhCLCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92bFx0JWdzOiRzcmMsICRkc3QiLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChnc2xvYWQgYWRkcjokc3JjKSldPiwgU2VnR1M7DQorDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDUsIGlzQ29kZUdlbk9ubHkgPSAxIGluDQorZGVmIEZTX01PVjMycm0gOiBJPDB4OEIsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBpMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3ZsXHQlZnM6JHNyYywgJGRzdCIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKGZzbG9hZCBhZGRyOiRzcmMpKV0+LCBTZWdGUzsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEVIIFBzZXVkbyBJbnN0cnVjdGlvbnMNCisvLw0KK2xldCBpc1Rlcm1pbmF0b3IgPSAxLCBpc1JldHVybiA9IDEsIGlzQmFycmllciA9IDEsDQorICAgIGhhc0N0cmxEZXAgPSAxLCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorZGVmIEVIX1JFVFVSTiAgIDogSTwweEMzLCBSYXdGcm0sIChvdXRzKSwgKGlucyBHUjMyOiRhZGRyKSwNCisgICAgICAgICAgICAgICAgICAgICJyZXRcdCNlaF9yZXR1cm4sIGFkZHI6ICRhZGRyIiwNCisgICAgICAgICAgICAgICAgICAgIFsoWDg2ZWhyZXQgR1IzMjokYWRkcildPjsNCisNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBBdG9taWMgc3VwcG9ydA0KKy8vDQorDQorLy8gTWVtb3J5IGJhcnJpZXJzDQorbGV0IGhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorZGVmIEludF9NZW1CYXJyaWVyIDogSTwwLCBQc2V1ZG8sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAgICAgIiNNRU1CQVJSSUVSIiwNCisgICAgICAgICAgICAgICAgICAgICBbKFg4Nk1lbUJhcnJpZXIpXT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorLy8gVE9ETzogR2V0IHRoaXMgdG8gZm9sZCB0aGUgY29uc3RhbnQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICAgICAgICAgICANCitsZXQgRGVmcyA9IFtFU1BdIGluDQorZGVmIEludF9NZW1CYXJyaWVyTm9TU0UgIDogSTwweDA5LCBNUk0xciwgKG91dHMpLCAoaW5zIEdSMzI6JHplcm8pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3J7bH1cdHskemVybywgKCVlc3ApfCglZXNwKSwgJHplcm99IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFg4Nk1lbUJhcnJpZXJOb1NTRSBHUjMyOiR6ZXJvKV0+LA0KKyAJCQkJCQkJCQkJCQkJIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+LCBMT0NLOw0KK30NCisNCisvLyBBdG9taWMgc3dhcC4gVGhlc2UgYXJlIGp1c3Qgbm9ybWFsIHhjaGcgaW5zdHJ1Y3Rpb25zLiBCdXQgc2luY2UgYSBtZW1vcnkNCisvLyBvcGVyYW5kIGlzIHJlZmVyZW5jZWQsIHRoZSBhdG9taWNpdHkgaXMgZW5zdXJlZC4NCitsZXQgQ29uc3RyYWludHMgPSAiJHZhbCA9ICRkc3QiIGluIHsNCitkZWYgWENIRzMycm0gOiBJPDB4ODcsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHZhbCwgaTMybWVtOiRwdHIpLA0KKyAgICAgICAgICAgICAgICJ4Y2hne2x9XHR7JHZhbCwgJHB0cnwkcHRyLCAkdmFsfSIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKGF0b21pY19zd2FwXzMyIGFkZHI6JHB0ciwgR1IzMjokdmFsKSldPjsNCitkZWYgWENIRzE2cm0gOiBJPDB4ODcsIE1STVNyY01lbSwgKG91dHMgR1IxNjokZHN0KSwgDQorICAgICAgICAgICAgICAgICAoaW5zIEdSMTY6JHZhbCwgaTE2bWVtOiRwdHIpLA0KKyAgICAgICAgICAgICAgICJ4Y2hne3d9XHR7JHZhbCwgJHB0cnwkcHRyLCAkdmFsfSIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGF0b21pY19zd2FwXzE2IGFkZHI6JHB0ciwgR1IxNjokdmFsKSldPiwgDQorICAgICAgICAgICAgICAgIE9wU2l6ZTsNCitkZWYgWENIRzhybSAgOiBJPDB4ODYsIE1STVNyY01lbSwgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokdmFsLCBpOG1lbTokcHRyKSwNCisgICAgICAgICAgICAgICAieGNoZ3tifVx0eyR2YWwsICRwdHJ8JHB0ciwgJHZhbH0iLCANCisgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGF0b21pY19zd2FwXzggYWRkcjokcHRyLCBHUjg6JHZhbCkpXT47DQorDQorZGVmIFhDSEczMnJyIDogSTwweDg3LCBNUk1TcmNSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokdmFsLCBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgInhjaGd7bH1cdHskdmFsLCAkc3JjfCRzcmMsICR2YWx9IiwgW10+Ow0KK2RlZiBYQ0hHMTZyciA6IEk8MHg4NywgTVJNU3JjUmVnLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHZhbCwgR1IxNjokc3JjKSwNCisgICAgICAgICAgICAgICAgICJ4Y2hne3d9XHR7JHZhbCwgJHNyY3wkc3JjLCAkdmFsfSIsIFtdPiwgT3BTaXplOw0KK2RlZiBYQ0hHOHJyIDogSTwweDg2LCBNUk1TcmNSZWcsIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHZhbCwgR1I4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAieGNoZ3tifVx0eyR2YWwsICRzcmN8JHNyYywgJHZhbH0iLCBbXT47DQorfQ0KKw0KK2RlZiBYQ0hHMTZhciA6IEk8MHg5MCwgQWRkUmVnRnJtLCAob3V0cyksIChpbnMgR1IxNjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAieGNoZ3t3fVx0eyRzcmMsICVheHwlYXgsICRzcmN9IiwgW10+LCBPcFNpemU7DQorZGVmIFhDSEczMmFyIDogSTwweDkwLCBBZGRSZWdGcm0sIChvdXRzKSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJ4Y2hne2x9XHR7JHNyYywgJWVheHwlZWF4LCAkc3JjfSIsIFtdPjsNCisNCisvLyBBdG9taWMgY29tcGFyZSBhbmQgc3dhcC4NCitsZXQgRGVmcyA9IFtFQVgsIEVGTEFHU10sIFVzZXMgPSBbRUFYXSBpbiB7DQorZGVmIExDTVBYQ0hHMzIgOiBJPDB4QjEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JHB0ciwgR1IzMjokc3dhcCksDQorICAgICAgICAgICAgICAgImxvY2tcblx0Ig0KKyAgICAgICAgICAgICAgICJjbXB4Y2hne2x9XHR7JHN3YXAsICRwdHJ8JHB0ciwgJHN3YXB9IiwNCisgICAgICAgICAgICAgICBbKFg4NmNhcyBhZGRyOiRwdHIsIEdSMzI6JHN3YXAsIDQpXT4sIFRCLCBMT0NLOw0KK30NCitsZXQgRGVmcyA9IFtFQVgsIEVEWCwgRUZMQUdTXSwgVXNlcyA9IFtFQVgsIEVCWCwgRUNYLCBFRFhdIGluIHsNCitkZWYgTENNUFhDSEc4QiA6IEk8MHhDNywgTVJNMW0sIChvdXRzKSwgKGlucyBpNjRtZW06JHB0ciksDQorICAgICAgICAgICAgICAgImxvY2tcblx0Ig0KKyAgICAgICAgICAgICAgICJjbXB4Y2hnOGJcdCRwdHIiLA0KKyAgICAgICAgICAgICAgIFsoWDg2Y2FzOCBhZGRyOiRwdHIpXT4sIFRCLCBMT0NLOw0KK30NCisNCitsZXQgRGVmcyA9IFtBWCwgRUZMQUdTXSwgVXNlcyA9IFtBWF0gaW4gew0KK2RlZiBMQ01QWENIRzE2IDogSTwweEIxLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTE2bWVtOiRwdHIsIEdSMTY6JHN3YXApLA0KKyAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAiY21weGNoZ3t3fVx0eyRzd2FwLCAkcHRyfCRwdHIsICRzd2FwfSIsDQorICAgICAgICAgICAgICAgWyhYODZjYXMgYWRkcjokcHRyLCBHUjE2OiRzd2FwLCAyKV0+LCBUQiwgT3BTaXplLCBMT0NLOw0KK30NCitsZXQgRGVmcyA9IFtBTCwgRUZMQUdTXSwgVXNlcyA9IFtBTF0gaW4gew0KK2RlZiBMQ01QWENIRzggOiBJPDB4QjAsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpOG1lbTokcHRyLCBHUjg6JHN3YXApLA0KKyAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAiY21weGNoZ3tifVx0eyRzd2FwLCAkcHRyfCRwdHIsICRzd2FwfSIsDQorICAgICAgICAgICAgICAgWyhYODZjYXMgYWRkcjokcHRyLCBHUjg6JHN3YXAsIDEpXT4sIFRCLCBMT0NLOw0KK30NCisNCisvLyBBdG9taWMgZXhjaGFuZ2UgYW5kIGFkZA0KK2xldCBDb25zdHJhaW50cyA9ICIkdmFsID0gJGRzdCIsIERlZnMgPSBbRUZMQUdTXSBpbiB7DQorZGVmIExYQUREMzIgOiBJPDB4QzEsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiR2YWwsIGkzMm1lbTokcHRyKSwNCisgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgInhhZGR7bH1cdHskdmFsLCAkcHRyfCRwdHIsICR2YWx9IiwNCisgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhdG9taWNfbG9hZF9hZGRfMzIgYWRkcjokcHRyLCBHUjMyOiR2YWwpKV0+LA0KKyAgICAgICAgICAgICAgICBUQiwgTE9DSzsNCitkZWYgTFhBREQxNiA6IEk8MHhDMSwgTVJNU3JjTWVtLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHZhbCwgaTE2bWVtOiRwdHIpLA0KKyAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAieGFkZHt3fVx0eyR2YWwsICRwdHJ8JHB0ciwgJHZhbH0iLA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGF0b21pY19sb2FkX2FkZF8xNiBhZGRyOiRwdHIsIEdSMTY6JHZhbCkpXT4sDQorICAgICAgICAgICAgICAgIFRCLCBPcFNpemUsIExPQ0s7DQorZGVmIExYQUREOCAgOiBJPDB4QzAsIE1STVNyY01lbSwgKG91dHMgR1I4OiRkc3QpLCAoaW5zIEdSODokdmFsLCBpOG1lbTokcHRyKSwNCisgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgInhhZGR7Yn1cdHskdmFsLCAkcHRyfCRwdHIsICR2YWx9IiwNCisgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGF0b21pY19sb2FkX2FkZF84IGFkZHI6JHB0ciwgR1I4OiR2YWwpKV0+LA0KKyAgICAgICAgICAgICAgICBUQiwgTE9DSzsNCit9DQorDQorZGVmIFhBREQ4cnIgOiBJPDB4QzAsIE1STURlc3RSZWcsIChvdXRzIEdSODokZHN0KSwgKGlucyBHUjg6JHNyYyksDQorICAgICAgICAgICAgICAgICJ4YWRke2J9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorZGVmIFhBREQxNnJyIDogSTwweEMxLCBNUk1EZXN0UmVnLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAieGFkZHt3fVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCLCBPcFNpemU7DQorZGVmIFhBREQzMnJyICA6IEk8MHhDMSwgTVJNRGVzdFJlZywgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgInhhZGR7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCisNCitsZXQgbWF5TG9hZCA9IDEsIG1heVN0b3JlID0gMSBpbiB7DQorZGVmIFhBREQ4cm0gICA6IEk8MHhDMCwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGk4bWVtOiRkc3QsIEdSODokc3JjKSwNCisgICAgICAgICAgICAgICAgICJ4YWRke2J9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorZGVmIFhBREQxNnJtICA6IEk8MHhDMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBHUjE2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgInhhZGR7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQiwgT3BTaXplOw0KK2RlZiBYQUREMzJybSAgOiBJPDB4QzEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICJ4YWRke2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorfQ0KKw0KK2RlZiBDTVBYQ0hHOHJyIDogSTwweEIwLCBNUk1EZXN0UmVnLCAob3V0cyBHUjg6JGRzdCksIChpbnMgR1I4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiY21weGNoZ3tifVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KK2RlZiBDTVBYQ0hHMTZyciA6IEk8MHhCMSwgTVJNRGVzdFJlZywgKG91dHMgR1IxNjokZHN0KSwgKGlucyBHUjE2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgImNtcHhjaGd7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQiwgT3BTaXplOw0KK2RlZiBDTVBYQ0hHMzJyciAgOiBJPDB4QjEsIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAiY21weGNoZ3tsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KKw0KK2xldCBtYXlMb2FkID0gMSwgbWF5U3RvcmUgPSAxIGluIHsNCitkZWYgQ01QWENIRzhybSAgIDogSTwweEIwLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaThtZW06JGRzdCwgR1I4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJjbXB4Y2hne2J9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorZGVmIENNUFhDSEcxNnJtICA6IEk8MHhCMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBHUjE2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJjbXB4Y2hne3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEIsIE9wU2l6ZTsNCitkZWYgQ01QWENIRzMycm0gIDogSTwweEIxLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgImNtcHhjaGd7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCit9DQorDQorbGV0IERlZnMgPSBbRUFYLCBFRFgsIEVGTEFHU10sIFVzZXMgPSBbRUFYLCBFQlgsIEVDWCwgRURYXSBpbg0KK2RlZiBDTVBYQ0hHOEIgOiBJPDB4QzcsIE1STTFtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICJjbXB4Y2hnOGJcdCRkc3QiLCBbXT4sIFRCOw0KKw0KKy8vIE9wdGltaXplZCBjb2RlZ2VuIHdoZW4gdGhlIG5vbi1tZW1vcnkgb3V0cHV0IGlzIG5vdCB1c2VkLg0KKy8vIEZJWE1FOiBVc2Ugbm9ybWFsIGFkZCAvIHN1YiBpbnN0cnVjdGlvbnMgYW5kIGFkZCBsb2NrIHByZWZpeCBkeW5hbWljYWxseS4NCitsZXQgRGVmcyA9IFtFRkxBR1NdLCBtYXlMb2FkID0gMSwgbWF5U3RvcmUgPSAxIGluIHsNCitkZWYgTE9DS19BREQ4bXIgIDogSTwweDAwLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaThtZW06JGRzdCwgR1I4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICJhZGR7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIExPQ0s7DQorZGVmIExPQ0tfQUREMTZtciAgOiBJPDB4MDEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAiYWRke3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBPcFNpemUsIExPQ0s7DQorZGVmIExPQ0tfQUREMzJtciAgOiBJPDB4MDEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAiYWRke2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBMT0NLOw0KK2RlZiBMT0NLX0FERDhtaSAgIDogSWk4PDB4ODAsIE1STTBtLCAob3V0cyksIChpbnMgaThtZW0gOiRkc3QsIGk4aW1tIDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAiYWRke2J9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBMT0NLOw0KK2RlZiBMT0NLX0FERDE2bWkgIDogSWkxNjwweDgxLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0LCBpMTZpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImxvY2tcblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgICJhZGR7d31cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIExPQ0s7DQorZGVmIExPQ0tfQUREMzJtaSAgOiBJaTMyPDB4ODEsIE1STTBtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIGkzMmltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAiYWRke2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBMT0NLOw0KK2RlZiBMT0NLX0FERDE2bWk4IDogSWk4PDB4ODMsIE1STTBtLCAob3V0cyksIChpbnMgaTE2bWVtOiRkc3QsIGkxNmk4aW1tIDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAiYWRke3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBPcFNpemUsIExPQ0s7DQorZGVmIExPQ0tfQUREMzJtaTggOiBJaTg8MHg4MywgTVJNMG0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaTMyaThpbW0gOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICJhZGR7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIExPQ0s7DQorDQorZGVmIExPQ0tfSU5DOG0gIDogSTwweEZFLCBNUk0wbSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICJpbmN7Yn1cdCRkc3QiLCBbXT4sIExPQ0s7DQorZGVmIExPQ0tfSU5DMTZtIDogSTwweEZGLCBNUk0wbSwgKG91dHMpLCAoaW5zIGkxNm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICJpbmN7d31cdCRkc3QiLCBbXT4sIE9wU2l6ZSwgTE9DSzsNCitkZWYgTE9DS19JTkMzMm0gOiBJPDB4RkYsIE1STTBtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgImxvY2tcblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgImluY3tsfVx0JGRzdCIsIFtdPiwgTE9DSzsNCisNCitkZWYgTE9DS19TVUI4bXIgICA6IEk8MHgyOCwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0LCBHUjggOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICJzdWJ7Yn1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIExPQ0s7DQorZGVmIExPQ0tfU1VCMTZtciAgOiBJPDB4MjksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgR1IxNjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAic3Vie3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBPcFNpemUsIExPQ0s7DQorZGVmIExPQ0tfU1VCMzJtciAgOiBJPDB4MjksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgR1IzMjokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICAgImxvY2tcblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgInN1YntsfVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPiwgTE9DSzsNCitkZWYgTE9DS19TVUI4bWkgICA6IElpODwweDgwLCBNUk01bSwgKG91dHMpLCAoaW5zIGk4bWVtIDokZHN0LCBpOGltbTokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICAgImxvY2tcblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgInN1YntifVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsIFtdPiwgTE9DSzsNCitkZWYgTE9DS19TVUIxNm1pICA6IElpMTY8MHg4MSwgTVJNNW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgaTE2aW1tOiRzcmMyKSwgDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAic3Vie3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBPcFNpemUsIExPQ0s7DQorZGVmIExPQ0tfU1VCMzJtaSAgOiBJaTMyPDB4ODEsIE1STTVtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIGkzMmltbTokc3JjMiksIA0KKyAgICAgICAgICAgICAgICAgICAgImxvY2tcblx0Ig0KKyAgICAgICAgICAgICAgICAgICAgICJzdWJ7bH1cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT4sIExPQ0s7DQorZGVmIExPQ0tfU1VCMTZtaTggOiBJaTg8MHg4MywgTVJNNW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCwgaTE2aThpbW0gOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAic3Vie3d9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBPcFNpemUsIExPQ0s7DQorZGVmIExPQ0tfU1VCMzJtaTggOiBJaTg8MHg4MywgTVJNNW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgaTMyaThpbW0gOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICAic3Vie2x9XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+LCBMT0NLOw0KKw0KK2RlZiBMT0NLX0RFQzhtICA6IEk8MHhGRSwgTVJNMW0sIChvdXRzKSwgKGlucyBpOG1lbSA6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAiZGVje2J9XHQkZHN0IiwgW10+LCBMT0NLOw0KK2RlZiBMT0NLX0RFQzE2bSA6IEk8MHhGRiwgTVJNMW0sIChvdXRzKSwgKGlucyBpMTZtZW06JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAibG9ja1xuXHQiDQorICAgICAgICAgICAgICAgICAgICAiZGVje3d9XHQkZHN0IiwgW10+LCBPcFNpemUsIExPQ0s7DQorZGVmIExPQ0tfREVDMzJtIDogSTwweEZGLCBNUk0xbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICJsb2NrXG5cdCINCisgICAgICAgICAgICAgICAgICAgICJkZWN7bH1cdCRkc3QiLCBbXT4sIExPQ0s7DQorfQ0KKw0KKy8vIEF0b21pYyBleGNoYW5nZSwgYW5kLCBvciwgeG9yDQorbGV0IENvbnN0cmFpbnRzID0gIiR2YWwgPSAkZHN0IiwgRGVmcyA9IFtFRkxBR1NdLA0KKyAgICAgICAgICAgICAgICAgIHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4gew0KK2RlZiBBVE9NQU5EMzIgOiBJPDAsIFBzZXVkbywgKG91dHMgR1IzMjokZHN0KSwoaW5zIGkzMm1lbTokcHRyLCBHUjMyOiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTUFORDMyIFBTRVVETyEiLCANCisgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhdG9taWNfbG9hZF9hbmRfMzIgYWRkcjokcHRyLCBHUjMyOiR2YWwpKV0+Ow0KK2RlZiBBVE9NT1IzMiA6IEk8MCwgUHNldWRvLCAob3V0cyBHUjMyOiRkc3QpLChpbnMgaTMybWVtOiRwdHIsIEdSMzI6JHZhbCksDQorICAgICAgICAgICAgICAgIiNBVE9NT1IzMiBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYXRvbWljX2xvYWRfb3JfMzIgYWRkcjokcHRyLCBHUjMyOiR2YWwpKV0+Ow0KK2RlZiBBVE9NWE9SMzIgOiBJPDAsIFBzZXVkbywob3V0cyBHUjMyOiRkc3QpLChpbnMgaTMybWVtOiRwdHIsIEdSMzI6JHZhbCksDQorICAgICAgICAgICAgICAgIiNBVE9NWE9SMzIgUFNFVURPISIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKGF0b21pY19sb2FkX3hvcl8zMiBhZGRyOiRwdHIsIEdSMzI6JHZhbCkpXT47DQorZGVmIEFUT01OQU5EMzIgOiBJPDAsIFBzZXVkbywob3V0cyBHUjMyOiRkc3QpLChpbnMgaTMybWVtOiRwdHIsIEdSMzI6JHZhbCksDQorICAgICAgICAgICAgICAgIiNBVE9NTkFORDMyIFBTRVVETyEiLCANCisgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhdG9taWNfbG9hZF9uYW5kXzMyIGFkZHI6JHB0ciwgR1IzMjokdmFsKSldPjsNCitkZWYgQVRPTU1JTjMyOiBJPDAsIFBzZXVkbywgKG91dHMgR1IzMjokZHN0KSwgKGlucyBpMzJtZW06JHB0ciwgR1IzMjokdmFsKSwNCisgICAgICAgICAgICAgICAiI0FUT01NSU4zMiBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYXRvbWljX2xvYWRfbWluXzMyIGFkZHI6JHB0ciwgR1IzMjokdmFsKSldPjsNCitkZWYgQVRPTU1BWDMyOiBJPDAsIFBzZXVkbywgKG91dHMgR1IzMjokZHN0KSwoaW5zIGkzMm1lbTokcHRyLCBHUjMyOiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTU1BWDMyIFBTRVVETyEiLCANCisgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhdG9taWNfbG9hZF9tYXhfMzIgYWRkcjokcHRyLCBHUjMyOiR2YWwpKV0+Ow0KK2RlZiBBVE9NVU1JTjMyOiBJPDAsIFBzZXVkbywgKG91dHMgR1IzMjokZHN0KSwoaW5zIGkzMm1lbTokcHRyLCBHUjMyOiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTVVNSU4zMiBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYXRvbWljX2xvYWRfdW1pbl8zMiBhZGRyOiRwdHIsIEdSMzI6JHZhbCkpXT47DQorZGVmIEFUT01VTUFYMzI6IEk8MCwgUHNldWRvLCAob3V0cyBHUjMyOiRkc3QpLChpbnMgaTMybWVtOiRwdHIsIEdSMzI6JHZhbCksDQorICAgICAgICAgICAgICAgIiNBVE9NVU1BWDMyIFBTRVVETyEiLCANCisgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChhdG9taWNfbG9hZF91bWF4XzMyIGFkZHI6JHB0ciwgR1IzMjokdmFsKSldPjsNCisNCitkZWYgQVRPTUFORDE2IDogSTwwLCBQc2V1ZG8sIChvdXRzIEdSMTY6JGRzdCksKGlucyBpMTZtZW06JHB0ciwgR1IxNjokdmFsKSwNCisgICAgICAgICAgICAgICAiI0FUT01BTkQxNiBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoYXRvbWljX2xvYWRfYW5kXzE2IGFkZHI6JHB0ciwgR1IxNjokdmFsKSldPjsNCitkZWYgQVRPTU9SMTYgOiBJPDAsIFBzZXVkbywgKG91dHMgR1IxNjokZHN0KSwoaW5zIGkxNm1lbTokcHRyLCBHUjE2OiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTU9SMTYgUFNFVURPISIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGF0b21pY19sb2FkX29yXzE2IGFkZHI6JHB0ciwgR1IxNjokdmFsKSldPjsNCitkZWYgQVRPTVhPUjE2IDogSTwwLCBQc2V1ZG8sKG91dHMgR1IxNjokZHN0KSwoaW5zIGkxNm1lbTokcHRyLCBHUjE2OiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTVhPUjE2IFBTRVVETyEiLCANCisgICAgICAgICAgICAgICBbKHNldCBHUjE2OiRkc3QsIChhdG9taWNfbG9hZF94b3JfMTYgYWRkcjokcHRyLCBHUjE2OiR2YWwpKV0+Ow0KK2RlZiBBVE9NTkFORDE2IDogSTwwLCBQc2V1ZG8sKG91dHMgR1IxNjokZHN0KSwoaW5zIGkxNm1lbTokcHRyLCBHUjE2OiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTU5BTkQxNiBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoYXRvbWljX2xvYWRfbmFuZF8xNiBhZGRyOiRwdHIsIEdSMTY6JHZhbCkpXT47DQorZGVmIEFUT01NSU4xNjogSTwwLCBQc2V1ZG8sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgaTE2bWVtOiRwdHIsIEdSMTY6JHZhbCksDQorICAgICAgICAgICAgICAgIiNBVE9NTUlOMTYgUFNFVURPISIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGF0b21pY19sb2FkX21pbl8xNiBhZGRyOiRwdHIsIEdSMTY6JHZhbCkpXT47DQorZGVmIEFUT01NQVgxNjogSTwwLCBQc2V1ZG8sIChvdXRzIEdSMTY6JGRzdCksKGlucyBpMTZtZW06JHB0ciwgR1IxNjokdmFsKSwNCisgICAgICAgICAgICAgICAiI0FUT01NQVgxNiBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoYXRvbWljX2xvYWRfbWF4XzE2IGFkZHI6JHB0ciwgR1IxNjokdmFsKSldPjsNCitkZWYgQVRPTVVNSU4xNjogSTwwLCBQc2V1ZG8sIChvdXRzIEdSMTY6JGRzdCksKGlucyBpMTZtZW06JHB0ciwgR1IxNjokdmFsKSwNCisgICAgICAgICAgICAgICAiI0FUT01VTUlOMTYgUFNFVURPISIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSMTY6JGRzdCwgKGF0b21pY19sb2FkX3VtaW5fMTYgYWRkcjokcHRyLCBHUjE2OiR2YWwpKV0+Ow0KK2RlZiBBVE9NVU1BWDE2OiBJPDAsIFBzZXVkbywgKG91dHMgR1IxNjokZHN0KSwoaW5zIGkxNm1lbTokcHRyLCBHUjE2OiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTVVNQVgxNiBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1IxNjokZHN0LCAoYXRvbWljX2xvYWRfdW1heF8xNiBhZGRyOiRwdHIsIEdSMTY6JHZhbCkpXT47DQorDQorZGVmIEFUT01BTkQ4IDogSTwwLCBQc2V1ZG8sIChvdXRzIEdSODokZHN0KSwoaW5zIGk4bWVtOiRwdHIsIEdSODokdmFsKSwNCisgICAgICAgICAgICAgICAiI0FUT01BTkQ4IFBTRVVETyEiLCANCisgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGF0b21pY19sb2FkX2FuZF84IGFkZHI6JHB0ciwgR1I4OiR2YWwpKV0+Ow0KK2RlZiBBVE9NT1I4IDogSTwwLCBQc2V1ZG8sIChvdXRzIEdSODokZHN0KSwoaW5zIGk4bWVtOiRwdHIsIEdSODokdmFsKSwNCisgICAgICAgICAgICAgICAiI0FUT01PUjggUFNFVURPISIsIA0KKyAgICAgICAgICAgICAgIFsoc2V0IEdSODokZHN0LCAoYXRvbWljX2xvYWRfb3JfOCBhZGRyOiRwdHIsIEdSODokdmFsKSldPjsNCitkZWYgQVRPTVhPUjggOiBJPDAsIFBzZXVkbywob3V0cyBHUjg6JGRzdCksKGlucyBpOG1lbTokcHRyLCBHUjg6JHZhbCksDQorICAgICAgICAgICAgICAgIiNBVE9NWE9SOCBQU0VVRE8hIiwgDQorICAgICAgICAgICAgICAgWyhzZXQgR1I4OiRkc3QsIChhdG9taWNfbG9hZF94b3JfOCBhZGRyOiRwdHIsIEdSODokdmFsKSldPjsNCitkZWYgQVRPTU5BTkQ4IDogSTwwLCBQc2V1ZG8sKG91dHMgR1I4OiRkc3QpLChpbnMgaThtZW06JHB0ciwgR1I4OiR2YWwpLA0KKyAgICAgICAgICAgICAgICIjQVRPTU5BTkQ4IFBTRVVETyEiLCANCisgICAgICAgICAgICAgICBbKHNldCBHUjg6JGRzdCwgKGF0b21pY19sb2FkX25hbmRfOCBhZGRyOiRwdHIsIEdSODokdmFsKSldPjsNCit9DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiR2YWwxID0gJGRzdDEsICR2YWwyID0gJGRzdDIiLCANCisgICAgICAgICAgICAgICAgICBEZWZzID0gW0VGTEFHUywgRUFYLCBFQlgsIEVDWCwgRURYXSwNCisgICAgICAgICAgICAgICAgICBVc2VzID0gW0VBWCwgRUJYLCBFQ1gsIEVEWF0sDQorICAgICAgICAgICAgICAgICAgbWF5TG9hZCA9IDEsIG1heVN0b3JlID0gMSwNCisgICAgICAgICAgICAgICAgICB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxIGluIHsNCitkZWYgQVRPTUFORDY0MzIgOiBJPDAsIFBzZXVkbywgKG91dHMgR1IzMjokZHN0MSwgR1IzMjokZHN0MiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTY0bWVtOiRwdHIsIEdSMzI6JHZhbDEsIEdSMzI6JHZhbDIpLA0KKyAgICAgICAgICAgICAgICIjQVRPTUFORDY0MzIgUFNFVURPISIsIFtdPjsNCitkZWYgQVRPTU9SNjQzMiA6IEk8MCwgUHNldWRvLCAob3V0cyBHUjMyOiRkc3QxLCBHUjMyOiRkc3QyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBpNjRtZW06JHB0ciwgR1IzMjokdmFsMSwgR1IzMjokdmFsMiksDQorICAgICAgICAgICAgICAgIiNBVE9NT1I2NDMyIFBTRVVETyEiLCBbXT47DQorZGVmIEFUT01YT1I2NDMyIDogSTwwLCBQc2V1ZG8sIChvdXRzIEdSMzI6JGRzdDEsIEdSMzI6JGRzdDIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGk2NG1lbTokcHRyLCBHUjMyOiR2YWwxLCBHUjMyOiR2YWwyKSwNCisgICAgICAgICAgICAgICAiI0FUT01YT1I2NDMyIFBTRVVETyEiLCBbXT47DQorZGVmIEFUT01OQU5ENjQzMiA6IEk8MCwgUHNldWRvLCAob3V0cyBHUjMyOiRkc3QxLCBHUjMyOiRkc3QyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBpNjRtZW06JHB0ciwgR1IzMjokdmFsMSwgR1IzMjokdmFsMiksDQorICAgICAgICAgICAgICAgIiNBVE9NTkFORDY0MzIgUFNFVURPISIsIFtdPjsNCitkZWYgQVRPTUFERDY0MzIgOiBJPDAsIFBzZXVkbywgKG91dHMgR1IzMjokZHN0MSwgR1IzMjokZHN0MiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTY0bWVtOiRwdHIsIEdSMzI6JHZhbDEsIEdSMzI6JHZhbDIpLA0KKyAgICAgICAgICAgICAgICIjQVRPTUFERDY0MzIgUFNFVURPISIsIFtdPjsNCitkZWYgQVRPTVNVQjY0MzIgOiBJPDAsIFBzZXVkbywgKG91dHMgR1IzMjokZHN0MSwgR1IzMjokZHN0MiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTY0bWVtOiRwdHIsIEdSMzI6JHZhbDEsIEdSMzI6JHZhbDIpLA0KKyAgICAgICAgICAgICAgICIjQVRPTVNVQjY0MzIgUFNFVURPISIsIFtdPjsNCitkZWYgQVRPTVNXQVA2NDMyIDogSTwwLCBQc2V1ZG8sIChvdXRzIEdSMzI6JGRzdDEsIEdSMzI6JGRzdDIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGk2NG1lbTokcHRyLCBHUjMyOiR2YWwxLCBHUjMyOiR2YWwyKSwNCisgICAgICAgICAgICAgICAiI0FUT01TV0FQNjQzMiBQU0VVRE8hIiwgW10+Ow0KK30NCisNCisvLyBTZWdtZW50YXRpb24gc3VwcG9ydCBpbnN0cnVjdGlvbnMuDQorDQorZGVmIExBUjE2cm0gOiBJPDB4MDIsIE1STVNyY01lbSwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksIA0KKyAgICAgICAgICAgICAgICAibGFye3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEIsIE9wU2l6ZTsNCitkZWYgTEFSMTZyciA6IEk8MHgwMiwgTVJNU3JjUmVnLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICJsYXJ7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQiwgT3BTaXplOw0KKw0KKy8vIGkxNm1lbSBvcGVyYW5kIGluIExBUjMycm0gYW5kIEdSMzIgb3BlcmFuZCBpbiBMQVIzMnJyIGlzIG5vdCBhIHR5cG8uDQorZGVmIExBUjMycm0gOiBJPDB4MDIsIE1STVNyY01lbSwgKG91dHMgR1IzMjokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksIA0KKyAgICAgICAgICAgICAgICAibGFye2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorZGVmIExBUjMycnIgOiBJPDB4MDIsIE1STVNyY1JlZywgKG91dHMgR1IzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibGFye2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorDQorZGVmIExTTDE2cm0gOiBJPDB4MDMsIE1STVNyY01lbSwgKG91dHMgR1IxNjokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJsc2x7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQiwgT3BTaXplOyANCitkZWYgTFNMMTZyciA6IEk8MHgwMywgTVJNU3JjUmVnLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICJsc2x7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQiwgT3BTaXplOw0KK2RlZiBMU0wzMnJtIDogSTwweDAzLCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibHNse2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7IA0KK2RlZiBMU0wzMnJyIDogSTwweDAzLCBNUk1TcmNSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgImxzbHtsfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KKyAgICAgICAgICAgICAgICANCitkZWYgSU5WTFBHIDogSTwweDAxLCBNUk03bSwgKG91dHMpLCAoaW5zIGk4bWVtOiRhZGRyKSwgImludmxwZ1x0JGFkZHIiLCBbXT4sIFRCOw0KKw0KK2RlZiBTVFJyIDogSTwweDAwLCBNUk0xciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICJzdHJ7d31cdHskZHN0fSIsIFtdPiwgVEI7DQorZGVmIFNUUm0gOiBJPDB4MDAsIE1STTFtLCAob3V0cyBpMTZtZW06JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAic3Rye3d9XHR7JGRzdH0iLCBbXT4sIFRCOw0KK2RlZiBMVFJyIDogSTwweDAwLCBNUk0zciwgKG91dHMpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICJsdHJ7d31cdHskc3JjfSIsIFtdPiwgVEI7DQorZGVmIExUUm0gOiBJPDB4MDAsIE1STTNtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAibHRye3d9XHR7JHNyY30iLCBbXT4sIFRCOw0KKyAgICAgICAgICAgICANCitkZWYgUFVTSEZTMTYgOiBJPDB4YTAsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICJwdXNoe3d9XHQlZnMiLCBbXT4sIE9wU2l6ZSwgVEI7DQorZGVmIFBVU0hGUzMyIDogSTwweGEwLCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAicHVzaHtsfVx0JWZzIiwgW10+LCBUQjsNCitkZWYgUFVTSEdTMTYgOiBJPDB4YTgsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgICJwdXNoe3d9XHQlZ3MiLCBbXT4sIE9wU2l6ZSwgVEI7DQorZGVmIFBVU0hHUzMyIDogSTwweGE4LCBSYXdGcm0sIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgICAicHVzaHtsfVx0JWdzIiwgW10+LCBUQjsNCisNCitkZWYgUE9QRlMxNiA6IEk8MHhhMSwgUmF3RnJtLCAob3V0cyksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAicG9we3d9XHQlZnMiLCBbXT4sIE9wU2l6ZSwgVEI7DQorZGVmIFBPUEZTMzIgOiBJPDB4YTEsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgInBvcHtsfVx0JWZzIiwgW10+LCBUQjsNCitkZWYgUE9QR1MxNiA6IEk8MHhhOSwgUmF3RnJtLCAob3V0cyksIChpbnMpLA0KKyAgICAgICAgICAgICAgICAicG9we3d9XHQlZ3MiLCBbXT4sIE9wU2l6ZSwgVEI7DQorZGVmIFBPUEdTMzIgOiBJPDB4YTksIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAgInBvcHtsfVx0JWdzIiwgW10+LCBUQjsNCisNCitkZWYgTERTMTZybSA6IEk8MHhjNSwgTVJNU3JjTWVtLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIG9wYXF1ZTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibGRze3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgT3BTaXplOw0KK2RlZiBMRFMzMnJtIDogSTwweGM1LCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksIChpbnMgb3BhcXVlNDhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJsZHN7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2RlZiBMU1MxNnJtIDogSTwweGIyLCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgb3BhcXVlMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJsc3N7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQiwgT3BTaXplOw0KK2RlZiBMU1MzMnJtIDogSTwweGIyLCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksIChpbnMgb3BhcXVlNDhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJsc3N7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitkZWYgTEVTMTZybSA6IEk8MHhjNCwgTVJNU3JjTWVtLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIG9wYXF1ZTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibGVze3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgT3BTaXplOw0KK2RlZiBMRVMzMnJtIDogSTwweGM0LCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksIChpbnMgb3BhcXVlNDhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJsZXN7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2RlZiBMRlMxNnJtIDogSTwweGI0LCBNUk1TcmNNZW0sIChvdXRzIEdSMTY6JGRzdCksIChpbnMgb3BhcXVlMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJsZnN7d31cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQiwgT3BTaXplOw0KK2RlZiBMRlMzMnJtIDogSTwweGI0LCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksIChpbnMgb3BhcXVlNDhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJsZnN7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitkZWYgTEdTMTZybSA6IEk8MHhiNSwgTVJNU3JjTWVtLCAob3V0cyBHUjE2OiRkc3QpLCAoaW5zIG9wYXF1ZTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibGdze3d9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEIsIE9wU2l6ZTsNCitkZWYgTEdTMzJybSA6IEk8MHhiNSwgTVJNU3JjTWVtLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIG9wYXF1ZTQ4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibGdze2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorDQorZGVmIFZFUlJyIDogSTwweDAwLCBNUk00ciwgKG91dHMpLCAoaW5zIEdSMTY6JHNlZyksDQorICAgICAgICAgICAgICAidmVyclx0JHNlZyIsIFtdPiwgVEI7DQorZGVmIFZFUlJtIDogSTwweDAwLCBNUk00bSwgKG91dHMpLCAoaW5zIGkxNm1lbTokc2VnKSwNCisgICAgICAgICAgICAgICJ2ZXJyXHQkc2VnIiwgW10+LCBUQjsNCitkZWYgVkVSV3IgOiBJPDB4MDAsIE1STTVyLCAob3V0cyksIChpbnMgR1IxNjokc2VnKSwNCisgICAgICAgICAgICAgICJ2ZXJ3XHQkc2VnIiwgW10+LCBUQjsNCitkZWYgVkVSV20gOiBJPDB4MDAsIE1STTVtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzZWcpLA0KKyAgICAgICAgICAgICAgInZlcndcdCRzZWciLCBbXT4sIFRCOw0KKw0KKy8vIERlc2NyaXB0b3ItdGFibGUgc3VwcG9ydCBpbnN0cnVjdGlvbnMNCisNCitkZWYgU0dEVG0gOiBJPDB4MDEsIE1STTBtLCAob3V0cyBvcGFxdWU0OG1lbTokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAic2dkdFx0JGRzdCIsIFtdPiwgVEI7DQorZGVmIFNJRFRtIDogSTwweDAxLCBNUk0xbSwgKG91dHMgb3BhcXVlNDhtZW06JGRzdCksIChpbnMpLA0KKyAgICAgICAgICAgICAgInNpZHRcdCRkc3QiLCBbXT4sIFRCOw0KK2RlZiBTTERUMTZyIDogSTwweDAwLCBNUk0wciwgKG91dHMgR1IxNjokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICJzbGR0e3d9XHQkZHN0IiwgW10+LCBUQjsNCitkZWYgU0xEVDE2bSA6IEk8MHgwMCwgTVJNMG0sIChvdXRzIGkxNm1lbTokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICJzbGR0e3d9XHQkZHN0IiwgW10+LCBUQjsNCitkZWYgTEdEVG0gOiBJPDB4MDEsIE1STTJtLCAob3V0cyksIChpbnMgb3BhcXVlNDhtZW06JHNyYyksDQorICAgICAgICAgICAgICAibGdkdFx0JHNyYyIsIFtdPiwgVEI7DQorZGVmIExJRFRtIDogSTwweDAxLCBNUk0zbSwgKG91dHMpLCAoaW5zIG9wYXF1ZTQ4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgImxpZHRcdCRzcmMiLCBbXT4sIFRCOw0KK2RlZiBMTERUMTZyIDogSTwweDAwLCBNUk0yciwgKG91dHMpLCAoaW5zIEdSMTY6JHNyYyksDQorICAgICAgICAgICAgICAgICJsbGR0e3d9XHQkc3JjIiwgW10+LCBUQjsNCitkZWYgTExEVDE2bSA6IEk8MHgwMCwgTVJNMm0sIChvdXRzKSwgKGlucyBpMTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICJsbGR0e3d9XHQkc3JjIiwgW10+LCBUQjsNCisgICAgICAgICAgICAgICAgDQorLy8gTG9jayBpbnN0cnVjdGlvbiBwcmVmaXgNCitkZWYgTE9DS19QUkVGSVggOiBJPDB4RjAsIFJhd0ZybSwgKG91dHMpLCAgKGlucyksICJsb2NrIiwgW10+Ow0KKw0KKy8vIFJlcGVhdCBzdHJpbmcgb3BlcmF0aW9uIGluc3RydWN0aW9uIHByZWZpeGVzDQorLy8gVGhlc2UgdXNlcyB0aGUgREYgZmxhZyBpbiB0aGUgRUZMQUdTIHJlZ2lzdGVyIHRvIGluYyBvciBkZWMgRUNYDQorbGV0IERlZnMgPSBbRUNYXSwgVXNlcyA9IFtFQ1gsRUZMQUdTXSBpbiB7DQorLy8gUmVwZWF0ICh1c2VkIHdpdGggSU5TLCBPVVRTLCBNT1ZTLCBMT0RTIGFuZCBTVE9TKQ0KK2RlZiBSRVBfUFJFRklYIDogSTwweEYzLCBSYXdGcm0sIChvdXRzKSwgIChpbnMpLCAicmVwIiwgW10+Ow0KKy8vIFJlcGVhdCB3aGlsZSBub3QgZXF1YWwgKHVzZWQgd2l0aCBDTVBTIGFuZCBTQ0FTKQ0KK2RlZiBSRVBORV9QUkVGSVggOiBJPDB4RjIsIFJhd0ZybSwgKG91dHMpLCAgKGlucyksICJyZXBuZSIsIFtdPjsNCit9DQorDQorLy8gU2VnbWVudCBvdmVycmlkZSBpbnN0cnVjdGlvbiBwcmVmaXhlcw0KK2RlZiBDU19QUkVGSVggOiBJPDB4MkUsIFJhd0ZybSwgKG91dHMpLCAgKGlucyksICJjcyIsIFtdPjsNCitkZWYgU1NfUFJFRklYIDogSTwweDM2LCBSYXdGcm0sIChvdXRzKSwgIChpbnMpLCAic3MiLCBbXT47DQorZGVmIERTX1BSRUZJWCA6IEk8MHgzRSwgUmF3RnJtLCAob3V0cyksICAoaW5zKSwgImRzIiwgW10+Ow0KK2RlZiBFU19QUkVGSVggOiBJPDB4MjYsIFJhd0ZybSwgKG91dHMpLCAgKGlucyksICJlcyIsIFtdPjsNCitkZWYgRlNfUFJFRklYIDogSTwweDY0LCBSYXdGcm0sIChvdXRzKSwgIChpbnMpLCAiZnMiLCBbXT47DQorZGVmIEdTX1BSRUZJWCA6IEk8MHg2NSwgUmF3RnJtLCAob3V0cyksICAoaW5zKSwgImdzIiwgW10+Ow0KKw0KKy8vIFN0cmluZyBtYW5pcHVsYXRpb24gaW5zdHJ1Y3Rpb25zDQorDQorZGVmIExPRFNCIDogSTwweEFDLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJsb2RzYiIsIFtdPjsNCitkZWYgTE9EU1cgOiBJPDB4QUQsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImxvZHN3IiwgW10+LCBPcFNpemU7DQorZGVmIExPRFNEIDogSTwweEFELCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJsb2Rze2x8ZH0iLCBbXT47DQorDQorZGVmIE9VVFNCIDogSTwweDZFLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJvdXRzYiIsIFtdPjsNCitkZWYgT1VUU1cgOiBJPDB4NkYsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgIm91dHN3IiwgW10+LCBPcFNpemU7DQorZGVmIE9VVFNEIDogSTwweDZGLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJvdXRze2x8ZH0iLCBbXT47DQorDQorLy8gQ1BVIGZsb3cgY29udHJvbCBpbnN0cnVjdGlvbnMNCisNCitkZWYgSExUIDogSTwweEY0LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJobHQiLCBbXT47DQorZGVmIFJTTSA6IEk8MHhBQSwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAicnNtIiwgW10+LCBUQjsNCisNCisvLyBGUFUgY29udHJvbCBpbnN0cnVjdGlvbnMNCisNCitkZWYgRk5JTklUIDogSTwweEUzLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJmbmluaXQiLCBbXT4sIERCOw0KKw0KKy8vIEZsYWcgaW5zdHJ1Y3Rpb25zDQorDQorZGVmIENMQyA6IEk8MHhGOCwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiY2xjIiwgW10+Ow0KK2RlZiBTVEMgOiBJPDB4RjksIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInN0YyIsIFtdPjsNCitkZWYgQ0xJIDogSTwweEZBLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJjbGkiLCBbXT47DQorZGVmIFNUSSA6IEk8MHhGQiwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAic3RpIiwgW10+Ow0KK2RlZiBDTEQgOiBJPDB4RkMsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImNsZCIsIFtdPjsNCitkZWYgU1REIDogSTwweEZELCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJzdGQiLCBbXT47DQorZGVmIENNQyA6IEk8MHhGNSwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiY21jIiwgW10+Ow0KKw0KK2RlZiBDTFRTIDogSTwweDA2LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJjbHRzIiwgW10+LCBUQjsNCisNCisvLyBUYWJsZSBsb29rdXAgaW5zdHJ1Y3Rpb25zDQorDQorZGVmIFhMQVQgOiBJPDB4RDcsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInhsYXRiIiwgW10+Ow0KKw0KKy8vIFNwZWNpYWxpemVkIHJlZ2lzdGVyIHN1cHBvcnQNCisNCitkZWYgV1JNU1IgOiBJPDB4MzAsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgIndybXNyIiwgW10+LCBUQjsNCitkZWYgUkRNU1IgOiBJPDB4MzIsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInJkbXNyIiwgW10+LCBUQjsNCitkZWYgUkRQTUMgOiBJPDB4MzMsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgInJkcG1jIiwgW10+LCBUQjsNCisNCitkZWYgU01TVzE2ciA6IEk8MHgwMSwgTVJNNHIsIChvdXRzIEdSMTY6JGRzdCksIChpbnMpLCANCisgICAgICAgICAgICAgICAgInNtc3d7d31cdCRkc3QiLCBbXT4sIE9wU2l6ZSwgVEI7DQorZGVmIFNNU1czMnIgOiBJPDB4MDEsIE1STTRyLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zKSwgDQorICAgICAgICAgICAgICAgICJzbXN3e2x9XHQkZHN0IiwgW10+LCBUQjsNCisvLyBGb3IgbWVtb3J5IG9wZXJhbmRzLCB0aGVyZSBpcyBvbmx5IGEgMTYtYml0IGZvcm0NCitkZWYgU01TVzE2bSA6IEk8MHgwMSwgTVJNNG0sIChvdXRzIGkxNm1lbTokZHN0KSwgKGlucyksDQorICAgICAgICAgICAgICAgICJzbXN3e3d9XHQkZHN0IiwgW10+LCBUQjsNCisNCitkZWYgTE1TVzE2ciA6IEk8MHgwMSwgTVJNNnIsIChvdXRzKSwgKGlucyBHUjE2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibG1zd3t3fVx0JHNyYyIsIFtdPiwgVEI7DQorZGVmIExNU1cxNm0gOiBJPDB4MDEsIE1STTZtLCAob3V0cyksIChpbnMgaTE2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAibG1zd3t3fVx0JHNyYyIsIFtdPiwgVEI7DQorICAgICAgICAgICAgICAgIA0KK2RlZiBDUFVJRCA6IEk8MHhBMiwgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiY3B1aWQiLCBbXT4sIFRCOw0KKw0KKy8vIENhY2hlIGluc3RydWN0aW9ucw0KKw0KK2RlZiBJTlZEIDogSTwweDA4LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJpbnZkIiwgW10+LCBUQjsNCitkZWYgV0JJTlZEIDogSTwweDA5LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ3YmludmQiLCBbXT4sIFRCOw0KKw0KKy8vIFZNWCBpbnN0cnVjdGlvbnMNCisNCisvLyA2NiAwRiAzOCA4MA0KK2RlZiBJTlZFUFQgOiBJPDB4ODAsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImludmVwdCIsIFtdPiwgT3BTaXplLCBUODsNCisvLyA2NiAwRiAzOCA4MQ0KK2RlZiBJTlZWUElEIDogSTwweDgxLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJpbnZ2cGlkIiwgW10+LCBPcFNpemUsIFQ4Ow0KKy8vIDBGIDAxIEMxDQorZGVmIFZNQ0FMTCA6IEk8MHgwMSwgTVJNX0MxLCAob3V0cyksIChpbnMpLCAidm1jYWxsIiwgW10+LCBUQjsNCitkZWYgVk1DTEVBUm0gOiBJPDB4QzcsIE1STTZtLCAob3V0cyksIChpbnMgaTY0bWVtOiR2bWNzKSwNCisgICJ2bWNsZWFyXHQkdm1jcyIsIFtdPiwgT3BTaXplLCBUQjsNCisvLyAwRiAwMSBDMg0KK2RlZiBWTUxBVU5DSCA6IEk8MHgwMSwgTVJNX0MyLCAob3V0cyksIChpbnMpLCAidm1sYXVuY2giLCBbXT4sIFRCOw0KKy8vIDBGIDAxIEMzDQorZGVmIFZNUkVTVU1FIDogSTwweDAxLCBNUk1fQzMsIChvdXRzKSwgKGlucyksICJ2bXJlc3VtZSIsIFtdPiwgVEI7DQorZGVmIFZNUFRSTERtIDogSTwweEM3LCBNUk02bSwgKG91dHMpLCAoaW5zIGk2NG1lbTokdm1jcyksDQorICAidm1wdHJsZFx0JHZtY3MiLCBbXT4sIFRCOw0KK2RlZiBWTVBUUlNUbSA6IEk8MHhDNywgTVJNN20sIChvdXRzIGk2NG1lbTokdm1jcyksIChpbnMpLA0KKyAgInZtcHRyc3RcdCR2bWNzIiwgW10+LCBUQjsNCitkZWYgVk1SRUFENjRybSA6IEk8MHg3OCwgTVJNRGVzdE1lbSwgKG91dHMgaTY0bWVtOiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAidm1yZWFke3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorZGVmIFZNUkVBRDY0cnIgOiBJPDB4NzgsIE1STURlc3RSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgR1I2NDokc3JjKSwNCisgICJ2bXJlYWR7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitkZWYgVk1SRUFEMzJybSA6IEk8MHg3OCwgTVJNRGVzdE1lbSwgKG91dHMgaTMybWVtOiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksDQorICAidm1yZWFke2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorZGVmIFZNUkVBRDMycnIgOiBJPDB4NzgsIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjKSwNCisgICJ2bXJlYWR7bH1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBUQjsNCitkZWYgVk1XUklURTY0cm0gOiBJPDB4NzksIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwgKGlucyBpNjRtZW06JHNyYyksDQorICAidm13cml0ZXtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KK2RlZiBWTVdSSVRFNjRyciA6IEk8MHg3OSwgTVJNU3JjUmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAidm13cml0ZXtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFRCOw0KK2RlZiBWTVdSSVRFMzJybSA6IEk8MHg3OSwgTVJNU3JjTWVtLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIGkzMm1lbTokc3JjKSwNCisgICJ2bXdyaXRle2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorZGVmIFZNV1JJVEUzMnJyIDogSTwweDc5LCBNUk1TcmNSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjKSwNCisgICJ2bXdyaXRle2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorLy8gMEYgMDEgQzQNCitkZWYgVk1YT0ZGIDogSTwweDAxLCBNUk1fQzQsIChvdXRzKSwgKGlucyksICJ2bXhvZmYiLCBbXT4sIFRCOw0KK2RlZiBWTVhPTiA6IEk8MHhDNywgTVJNNm0sIChvdXRzKSwgKGlucyBpNjRtZW06JHZteG9uKSwNCisgICJ2bXhvblx0eyR2bXhvbn0iLCBbXT4sIFhTOw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTm9uLUluc3RydWN0aW9uIFBhdHRlcm5zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBDb25zdGFudFBvb2wgR2xvYmFsQWRkcmVzcywgRXh0ZXJuYWxTeW1ib2wsIGFuZCBKdW1wVGFibGUNCitkZWYgOiBQYXQ8KGkzMiAoWDg2V3JhcHBlciB0Y29uc3Rwb29sICA6JGRzdCkpLCAoTU9WMzJyaSB0Y29uc3Rwb29sICA6JGRzdCk+Ow0KK2RlZiA6IFBhdDwoaTMyIChYODZXcmFwcGVyIHRqdW1wdGFibGUgIDokZHN0KSksIChNT1YzMnJpIHRqdW1wdGFibGUgIDokZHN0KT47DQorZGVmIDogUGF0PChpMzIgKFg4NldyYXBwZXIgdGdsb2JhbHRsc2FkZHI6JGRzdCkpLChNT1YzMnJpIHRnbG9iYWx0bHNhZGRyOiRkc3QpPjsNCitkZWYgOiBQYXQ8KGkzMiAoWDg2V3JhcHBlciB0Z2xvYmFsYWRkciA6JGRzdCkpLCAoTU9WMzJyaSB0Z2xvYmFsYWRkciA6JGRzdCk+Ow0KK2RlZiA6IFBhdDwoaTMyIChYODZXcmFwcGVyIHRleHRlcm5hbHN5bTokZHN0KSksIChNT1YzMnJpIHRleHRlcm5hbHN5bTokZHN0KT47DQorZGVmIDogUGF0PChpMzIgKFg4NldyYXBwZXIgdGJsb2NrYWRkcmVzczokZHN0KSksIChNT1YzMnJpIHRibG9ja2FkZHJlc3M6JGRzdCk+Ow0KKw0KK2RlZiA6IFBhdDwoYWRkIEdSMzI6JHNyYzEsIChYODZXcmFwcGVyIHRjb25zdHBvb2w6JHNyYzIpKSwNCisgICAgICAgICAgKEFERDMycmkgR1IzMjokc3JjMSwgdGNvbnN0cG9vbDokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYWRkIEdSMzI6JHNyYzEsIChYODZXcmFwcGVyIHRqdW1wdGFibGU6JHNyYzIpKSwNCisgICAgICAgICAgKEFERDMycmkgR1IzMjokc3JjMSwgdGp1bXB0YWJsZTokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYWRkIEdSMzI6JHNyYzEsIChYODZXcmFwcGVyIHRnbG9iYWxhZGRyIDokc3JjMikpLA0KKyAgICAgICAgICAoQUREMzJyaSBHUjMyOiRzcmMxLCB0Z2xvYmFsYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYWRkIEdSMzI6JHNyYzEsIChYODZXcmFwcGVyIHRleHRlcm5hbHN5bTokc3JjMikpLA0KKyAgICAgICAgICAoQUREMzJyaSBHUjMyOiRzcmMxLCB0ZXh0ZXJuYWxzeW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjMyOiRzcmMxLCAoWDg2V3JhcHBlciB0YmxvY2thZGRyZXNzOiRzcmMyKSksDQorICAgICAgICAgIChBREQzMnJpIEdSMzI6JHNyYzEsIHRibG9ja2FkZHJlc3M6JHNyYzIpPjsNCisNCitkZWYgOiBQYXQ8KHN0b3JlIChpMzIgKFg4NldyYXBwZXIgdGdsb2JhbGFkZHI6JHNyYykpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAoTU9WMzJtaSBhZGRyOiRkc3QsIHRnbG9iYWxhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChpMzIgKFg4NldyYXBwZXIgdGV4dGVybmFsc3ltOiRzcmMpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1PVjMybWkgYWRkcjokZHN0LCB0ZXh0ZXJuYWxzeW06JHNyYyk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKGkzMiAoWDg2V3JhcHBlciB0YmxvY2thZGRyZXNzOiRzcmMpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1PVjMybWkgYWRkcjokZHN0LCB0YmxvY2thZGRyZXNzOiRzcmMpPjsNCisNCisvLyBDYWxscw0KKy8vIHRhaWxjYWxsIHN0dWZmDQorZGVmIDogUGF0PChYODZ0Y3JldCBHUjMyX1RDOiRkc3QsIGltbTokb2ZmKSwNCisgICAgICAgICAgKFRDUkVUVVJOcmkgR1IzMl9UQzokZHN0LCBpbW06JG9mZik+LA0KKwkgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KKw0KKy8vIEZJWE1FOiBUaGlzIGlzIGRpc2FibGVkIGZvciAzMi1iaXQgUElDIG1vZGUgYmVjYXVzZSB0aGUgZ2xvYmFsIGJhc2UNCisvLyByZWdpc3RlciB3aGljaCBpcyBwYXJ0IG9mIHRoZSBhZGRyZXNzIG1vZGUgbWF5IGJlIGFzc2lnbmVkIGEgDQorLy8gY2FsbGVlLXNhdmVkIHJlZ2lzdGVyLg0KK2RlZiA6IFBhdDwoWDg2dGNyZXQgKGxvYWQgYWRkcjokZHN0KSwgaW1tOiRvZmYpLA0KKyAgICAgICAgICAoVENSRVRVUk5taSBhZGRyOiRkc3QsIGltbTokb2ZmKT4sDQorCSAgUmVxdWlyZXM8W0luMzJCaXRNb2RlLCBJc05vdFBJQ10+Ow0KKw0KK2RlZiA6IFBhdDwoWDg2dGNyZXQgKGkzMiB0Z2xvYmFsYWRkcjokZHN0KSwgaW1tOiRvZmYpLA0KKyAgICAgICAgICAoVENSRVRVUk5kaSB0ZXh0ZXJuYWxzeW06JGRzdCwgaW1tOiRvZmYpPiwNCisJICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCisNCitkZWYgOiBQYXQ8KFg4NnRjcmV0IChpMzIgdGV4dGVybmFsc3ltOiRkc3QpLCBpbW06JG9mZiksDQorICAgICAgICAgIChUQ1JFVFVSTmRpIHRleHRlcm5hbHN5bTokZHN0LCBpbW06JG9mZik+LA0KKwkgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KKw0KKy8vIE5vcm1hbCBjYWxscywgd2l0aCB2YXJpb3VzIGZsYXZvcnMgb2YgYWRkcmVzc2VzLg0KK2RlZiA6IFBhdDwoWDg2Y2FsbCAoaTMyIHRnbG9iYWxhZGRyOiRkc3QpKSwNCisgICAgICAgICAgKENBTExwY3JlbDMyIHRnbG9iYWxhZGRyOiRkc3QpPjsNCitkZWYgOiBQYXQ8KFg4NmNhbGwgKGkzMiB0ZXh0ZXJuYWxzeW06JGRzdCkpLA0KKyAgICAgICAgICAoQ0FMTHBjcmVsMzIgdGV4dGVybmFsc3ltOiRkc3QpPjsNCitkZWYgOiBQYXQ8KFg4NmNhbGwgKGkzMiBpbW06JGRzdCkpLA0KKyAgICAgICAgICAoQ0FMTHBjcmVsMzIgaW1tOiRkc3QpPiwgUmVxdWlyZXM8W0NhbGxJbW1BZGRyXT47DQorDQorLy8gWDg2IHNwZWNpZmljIGFkZCB3aGljaCBwcm9kdWNlcyBhIGZsYWcuDQorZGVmIDogUGF0PChhZGRjIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAoQUREMzJyciBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKT47DQorZGVmIDogUGF0PChhZGRjIEdSMzI6JHNyYzEsIChsb2FkIGFkZHI6JHNyYzIpKSwNCisgICAgICAgICAgKEFERDMycm0gR1IzMjokc3JjMSwgYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYWRkYyBHUjMyOiRzcmMxLCBpbW06JHNyYzIpLA0KKyAgICAgICAgICAoQUREMzJyaSBHUjMyOiRzcmMxLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFkZGMgR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpLA0KKyAgICAgICAgICAoQUREMzJyaTggR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpPjsNCisNCitkZWYgOiBQYXQ8KHN1YmMgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgIChTVUIzMnJyIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YmMgR1IzMjokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpLA0KKyAgICAgICAgICAoU1VCMzJybSBHUjMyOiRzcmMxLCBhZGRyOiRzcmMyKT47DQorZGVmIDogUGF0PChzdWJjIEdSMzI6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChTVUIzMnJpIEdSMzI6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwoc3ViYyBHUjMyOiRzcmMxLCBpMzJpbW1TRXh0ODokc3JjMiksDQorICAgICAgICAgIChTVUIzMnJpOCBHUjMyOiRzcmMxLCBpMzJpbW1TRXh0ODokc3JjMik+Ow0KKw0KKy8vIENvbXBhcmlzb25zLg0KKw0KKy8vIFRFU1QgUixSIGlzIHNtYWxsZXIgdGhhbiBDTVAgUiwwDQorZGVmIDogUGF0PChYODZjbXAgR1I4OiRzcmMxLCAwKSwNCisgICAgICAgICAgKFRFU1Q4cnIgR1I4OiRzcmMxLCBHUjg6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtcCBHUjE2OiRzcmMxLCAwKSwNCisgICAgICAgICAgKFRFU1QxNnJyIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtcCBHUjMyOiRzcmMxLCAwKSwNCisgICAgICAgICAgKFRFU1QzMnJyIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzEpPjsNCisNCisvLyBDb25kaXRpb25hbCBtb3ZlcyB3aXRoIGZvbGRlZCBsb2FkcyB3aXRoIG9wZXJhbmRzIHN3YXBwZWQgYW5kIGNvbmRpdGlvbnMNCisvLyBpbnZlcnRlZC4NCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX0IsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WQUUxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX0IsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WQUUzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX0FFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkIxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX0FFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkIzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX0UsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTkUxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX0UsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTkUzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX05FLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkUxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX05FLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkUzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX0JFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkExNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX0JFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkEzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX0EsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WQkUxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX0EsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WQkUzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX0wsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WR0UxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX0wsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WR0UzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX0dFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkwxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX0dFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkwzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX0xFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkcxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX0xFLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVkczMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX0csIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTEUxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX0csIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTEUzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX1AsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTlAxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX1AsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTlAzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX05QLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVlAxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX05QLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVlAzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX1MsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTlMxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX1MsIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTlMzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX05TLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVlMxNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX05TLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVlMzMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX08sIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTk8xNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX08sIEVGTEFHUyksDQorICAgICAgICAgIChDTU9WTk8zMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMTYgYWRkcjokc3JjMSksIEdSMTY6JHNyYzIsIFg4Nl9DT05EX05PLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVk8xNnJtIEdSMTY6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KFg4NmNtb3YgKGxvYWRpMzIgYWRkcjokc3JjMSksIEdSMzI6JHNyYzIsIFg4Nl9DT05EX05PLCBFRkxBR1MpLA0KKyAgICAgICAgICAoQ01PVk8zMnJtIEdSMzI6JHNyYzIsIGFkZHI6JHNyYzEpPjsNCisNCisvLyB6ZXh0bG9hZCBib29sIC0+IHpleHRsb2FkIGJ5dGUNCitkZWYgOiBQYXQ8KHpleHRsb2FkaThpMSAgYWRkcjokc3JjKSwgKE1PVjhybSAgICAgYWRkcjokc3JjKT47DQorZGVmIDogUGF0PCh6ZXh0bG9hZGkxNmkxIGFkZHI6JHNyYyksIChNT1ZaWDE2cm04IGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoemV4dGxvYWRpMzJpMSBhZGRyOiRzcmMpLCAoTU9WWlgzMnJtOCBhZGRyOiRzcmMpPjsNCisNCisvLyBleHRsb2FkIGJvb2wgLT4gZXh0bG9hZCBieXRlDQorZGVmIDogUGF0PChleHRsb2FkaThpMSBhZGRyOiRzcmMpLCAgIChNT1Y4cm0gICAgICBhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGV4dGxvYWRpMTZpMSBhZGRyOiRzcmMpLCAgKE1PVlpYMTZybTggIGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoZXh0bG9hZGkzMmkxIGFkZHI6JHNyYyksICAoTU9WWlgzMnJtOCAgYWRkcjokc3JjKT47DQorZGVmIDogUGF0PChleHRsb2FkaTE2aTggYWRkcjokc3JjKSwgIChNT1ZaWDE2cm04ICBhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGV4dGxvYWRpMzJpOCBhZGRyOiRzcmMpLCAgKE1PVlpYMzJybTggIGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoZXh0bG9hZGkzMmkxNiBhZGRyOiRzcmMpLCAoTU9WWlgzMnJtMTYgYWRkcjokc3JjKT47DQorDQorLy8gYW55ZXh0LiBEZWZpbmUgdGhlc2UgdG8gZG8gYW4gZXhwbGljaXQgemVyby1leHRlbmQgdG8NCisvLyBhdm9pZCBwYXJ0aWFsLXJlZ2lzdGVyIHVwZGF0ZXMuDQorZGVmIDogUGF0PChpMTYgKGFueWV4dCBHUjggOiRzcmMpKSwgKE1PVlpYMTZycjggIEdSOCA6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoaTMyIChhbnlleHQgR1I4IDokc3JjKSksIChNT1ZaWDMycnI4ICBHUjggOiRzcmMpPjsNCisNCisvLyBFeGNlcHQgZm9yIGkxNiAtPiBpMzIgc2luY2UgaXNlbCBleHBlY3QgaTE2IG9wcyB0byBiZSBwcm9tb3RlZCB0byBpMzIuDQorZGVmIDogUGF0PChpMzIgKGFueWV4dCBHUjE2OiRzcmMpKSwNCisgICAgICAgICAgKElOU0VSVF9TVUJSRUcgKGkzMiAoSU1QTElDSVRfREVGKSksIEdSMTY6JHNyYywgc3ViXzE2Yml0KT47DQorDQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTb21lIHBlZXBob2xlcw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gT2RkIGVuY29kaW5nIHRyaWNrOiAtMTI4IGZpdHMgaW50byBhbiA4LWJpdCBpbW1lZGlhdGUgZmllbGQgd2hpbGUNCisvLyArMTI4IGRvZXNuJ3QsIHNvIGluIHRoaXMgc3BlY2lhbCBjYXNlIHVzZSBhIHN1YiBpbnN0ZWFkIG9mIGFuIGFkZC4NCitkZWYgOiBQYXQ8KGFkZCBHUjE2OiRzcmMxLCAxMjgpLA0KKyAgICAgICAgICAoU1VCMTZyaTggR1IxNjokc3JjMSwgLTEyOCk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKGFkZCAobG9hZGkxNiBhZGRyOiRkc3QpLCAxMjgpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAoU1VCMTZtaTggYWRkcjokZHN0LCAtMTI4KT47DQorZGVmIDogUGF0PChhZGQgR1IzMjokc3JjMSwgMTI4KSwNCisgICAgICAgICAgKFNVQjMycmk4IEdSMzI6JHNyYzEsIC0xMjgpPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChhZGQgKGxvYWRpMzIgYWRkcjokZHN0KSwgMTI4KSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKFNVQjMybWk4IGFkZHI6JGRzdCwgLTEyOCk+Ow0KKw0KKy8vIHIgJiAoMl4xNi0xKSA9PT4gbW92eg0KK2RlZiA6IFBhdDwoYW5kIEdSMzI6JHNyYzEsIDB4ZmZmZiksDQorICAgICAgICAgIChNT1ZaWDMycnIxNiAoRVhUUkFDVF9TVUJSRUcgR1IzMjokc3JjMSwgc3ViXzE2Yml0KSk+Ow0KKy8vIHIgJiAoMl44LTEpID09PiBtb3Z6DQorZGVmIDogUGF0PChhbmQgR1IzMjokc3JjMSwgMHhmZiksDQorICAgICAgICAgIChNT1ZaWDMycnI4IChFWFRSQUNUX1NVQlJFRyAoaTMyIChDT1BZX1RPX1JFR0NMQVNTIEdSMzI6JHNyYzEsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUjMyX0FCQ0QpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl84Yml0KSk+LA0KKyAgICAgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KKy8vIHIgJiAoMl44LTEpID09PiBtb3Z6DQorZGVmIDogUGF0PChhbmQgR1IxNjokc3JjMSwgMHhmZiksDQorICAgICAgICAgIChNT1ZaWDE2cnI4IChFWFRSQUNUX1NVQlJFRyAoaTE2IChDT1BZX1RPX1JFR0NMQVNTIEdSMTY6JHNyYzEsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUjE2X0FCQ0QpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl84Yml0KSk+LA0KKyAgICAgIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+Ow0KKw0KKy8vIHNleHRfaW5yZWcgcGF0dGVybnMNCitkZWYgOiBQYXQ8KHNleHRfaW5yZWcgR1IzMjokc3JjLCBpMTYpLA0KKyAgICAgICAgICAoTU9WU1gzMnJyMTYgKEVYVFJBQ1RfU1VCUkVHIEdSMzI6JHNyYywgc3ViXzE2Yml0KSk+Ow0KK2RlZiA6IFBhdDwoc2V4dF9pbnJlZyBHUjMyOiRzcmMsIGk4KSwNCisgICAgICAgICAgKE1PVlNYMzJycjggKEVYVFJBQ1RfU1VCUkVHIChpMzIgKENPUFlfVE9fUkVHQ0xBU1MgR1IzMjokc3JjLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1IzMl9BQkNEKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfOGJpdCkpPiwNCisgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KHNleHRfaW5yZWcgR1IxNjokc3JjLCBpOCksDQorICAgICAgICAgIChNT1ZTWDE2cnI4IChFWFRSQUNUX1NVQlJFRyAoaTE2IChDT1BZX1RPX1JFR0NMQVNTIEdSMTY6JHNyYywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSMTZfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXQpKT4sDQorICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorDQorLy8gdHJ1bmMgcGF0dGVybnMNCitkZWYgOiBQYXQ8KGkxNiAodHJ1bmMgR1IzMjokc3JjKSksDQorICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyBHUjMyOiRzcmMsIHN1Yl8xNmJpdCk+Ow0KK2RlZiA6IFBhdDwoaTggKHRydW5jIEdSMzI6JHNyYykpLA0KKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKGkzMiAoQ09QWV9UT19SRUdDTEFTUyBHUjMyOiRzcmMsIEdSMzJfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXQpPiwNCisgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KGk4ICh0cnVuYyBHUjE2OiRzcmMpKSwNCisgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHIChpMTYgKENPUFlfVE9fUkVHQ0xBU1MgR1IxNjokc3JjLCBHUjE2X0FCQ0QpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl84Yml0KT4sDQorICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorDQorLy8gaC1yZWdpc3RlciB0cmlja3MNCitkZWYgOiBQYXQ8KGk4ICh0cnVuYyAoc3JsX3N1IEdSMTY6JHNyYywgKGk4IDgpKSkpLA0KKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKGkxNiAoQ09QWV9UT19SRUdDTEFTUyBHUjE2OiRzcmMsIEdSMTZfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXRfaGkpPiwNCisgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KGk4ICh0cnVuYyAoc3JsX3N1IEdSMzI6JHNyYywgKGk4IDgpKSkpLA0KKyAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKGkzMiAoQ09QWV9UT19SRUdDTEFTUyBHUjMyOiRzcmMsIEdSMzJfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXRfaGkpPiwNCisgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KHNybCBHUjE2OiRzcmMsIChpOCA4KSksDQorICAgICAgICAgIChFWFRSQUNUX1NVQlJFRw0KKyAgICAgICAgICAgIChNT1ZaWDMycnI4DQorICAgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKGkxNiAoQ09QWV9UT19SRUdDTEFTUyBHUjE2OiRzcmMsIEdSMTZfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl84Yml0X2hpKSksDQorICAgICAgICAgICAgc3ViXzE2Yml0KT4sDQorICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorZGVmIDogUGF0PChpMzIgKHpleHQgKHNybF9zdSBHUjE2OiRzcmMsIChpOCA4KSkpKSwNCisgICAgICAgICAgKE1PVlpYMzJycjggKEVYVFJBQ1RfU1VCUkVHIChpMTYgKENPUFlfVE9fUkVHQ0xBU1MgR1IxNjokc3JjLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1IxNl9BQkNEKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfOGJpdF9oaSkpPiwNCisgICAgICBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KGkzMiAoYW55ZXh0IChzcmxfc3UgR1IxNjokc3JjLCAoaTggOCkpKSksDQorICAgICAgICAgIChNT1ZaWDMycnI4IChFWFRSQUNUX1NVQlJFRyAoaTE2IChDT1BZX1RPX1JFR0NMQVNTIEdSMTY6JHNyYywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSMTZfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXRfaGkpKT4sDQorICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorZGVmIDogUGF0PChhbmQgKHNybF9zdSBHUjMyOiRzcmMsIChpOCA4KSksIChpMzIgMjU1KSksDQorICAgICAgICAgIChNT1ZaWDMycnI4IChFWFRSQUNUX1NVQlJFRyAoaTMyIChDT1BZX1RPX1JFR0NMQVNTIEdSMzI6JHNyYywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSMzJfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXRfaGkpKT4sDQorICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorZGVmIDogUGF0PChzcmwgKGFuZF9zdSBHUjMyOiRzcmMsIDB4ZmYwMCksIChpOCA4KSksDQorICAgICAgICAgIChNT1ZaWDMycnI4IChFWFRSQUNUX1NVQlJFRyAoaTMyIChDT1BZX1RPX1JFR0NMQVNTIEdSMzI6JHNyYywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSMzJfQUJDRCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViXzhiaXRfaGkpKT4sDQorICAgICAgUmVxdWlyZXM8W0luMzJCaXRNb2RlXT47DQorDQorLy8gKHNobCB4LCAxKSA9PT4gKGFkZCB4LCB4KQ0KK2RlZiA6IFBhdDwoc2hsIEdSOCA6JHNyYzEsIChpOCAxKSksIChBREQ4cnIgIEdSOCA6JHNyYzEsIEdSOCA6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KHNobCBHUjE2OiRzcmMxLCAoaTggMSkpLCAoQUREMTZyciBHUjE2OiRzcmMxLCBHUjE2OiRzcmMxKT47DQorZGVmIDogUGF0PChzaGwgR1IzMjokc3JjMSwgKGk4IDEpKSwgKEFERDMycnIgR1IzMjokc3JjMSwgR1IzMjokc3JjMSk+Ow0KKw0KKy8vIChzaGwgeCAoYW5kIHksIDMxKSkgPT0+IChzaGwgeCwgeSkNCitkZWYgOiBQYXQ8KHNobCBHUjg6JHNyYzEsIChhbmQgQ0wsIDMxKSksDQorICAgICAgICAgIChTSEw4ckNMIEdSODokc3JjMSk+Ow0KK2RlZiA6IFBhdDwoc2hsIEdSMTY6JHNyYzEsIChhbmQgQ0wsIDMxKSksDQorICAgICAgICAgIChTSEwxNnJDTCBHUjE2OiRzcmMxKT47DQorZGVmIDogUGF0PChzaGwgR1IzMjokc3JjMSwgKGFuZCBDTCwgMzEpKSwNCisgICAgICAgICAgKFNITDMyckNMIEdSMzI6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChzaGwgKGxvYWRpOCBhZGRyOiRkc3QpLCAoYW5kIENMLCAzMSkpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAoU0hMOG1DTCBhZGRyOiRkc3QpPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChzaGwgKGxvYWRpMTYgYWRkcjokZHN0KSwgKGFuZCBDTCwgMzEpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKFNITDE2bUNMIGFkZHI6JGRzdCk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKHNobCAobG9hZGkzMiBhZGRyOiRkc3QpLCAoYW5kIENMLCAzMSkpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAoU0hMMzJtQ0wgYWRkcjokZHN0KT47DQorDQorZGVmIDogUGF0PChzcmwgR1I4OiRzcmMxLCAoYW5kIENMLCAzMSkpLA0KKyAgICAgICAgICAoU0hSOHJDTCBHUjg6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KHNybCBHUjE2OiRzcmMxLCAoYW5kIENMLCAzMSkpLA0KKyAgICAgICAgICAoU0hSMTZyQ0wgR1IxNjokc3JjMSk+Ow0KK2RlZiA6IFBhdDwoc3JsIEdSMzI6JHNyYzEsIChhbmQgQ0wsIDMxKSksDQorICAgICAgICAgIChTSFIzMnJDTCBHUjMyOiRzcmMxKT47DQorZGVmIDogUGF0PChzdG9yZSAoc3JsIChsb2FkaTggYWRkcjokZHN0KSwgKGFuZCBDTCwgMzEpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKFNIUjhtQ0wgYWRkcjokZHN0KT47DQorZGVmIDogUGF0PChzdG9yZSAoc3JsIChsb2FkaTE2IGFkZHI6JGRzdCksIChhbmQgQ0wsIDMxKSksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChTSFIxNm1DTCBhZGRyOiRkc3QpPjsNCitkZWYgOiBQYXQ8KHN0b3JlIChzcmwgKGxvYWRpMzIgYWRkcjokZHN0KSwgKGFuZCBDTCwgMzEpKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKFNIUjMybUNMIGFkZHI6JGRzdCk+Ow0KKw0KK2RlZiA6IFBhdDwoc3JhIEdSODokc3JjMSwgKGFuZCBDTCwgMzEpKSwNCisgICAgICAgICAgKFNBUjhyQ0wgR1I4OiRzcmMxKT47DQorZGVmIDogUGF0PChzcmEgR1IxNjokc3JjMSwgKGFuZCBDTCwgMzEpKSwNCisgICAgICAgICAgKFNBUjE2ckNMIEdSMTY6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KHNyYSBHUjMyOiRzcmMxLCAoYW5kIENMLCAzMSkpLA0KKyAgICAgICAgICAoU0FSMzJyQ0wgR1IzMjokc3JjMSk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKHNyYSAobG9hZGk4IGFkZHI6JGRzdCksIChhbmQgQ0wsIDMxKSksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChTQVI4bUNMIGFkZHI6JGRzdCk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKHNyYSAobG9hZGkxNiBhZGRyOiRkc3QpLCAoYW5kIENMLCAzMSkpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAoU0FSMTZtQ0wgYWRkcjokZHN0KT47DQorZGVmIDogUGF0PChzdG9yZSAoc3JhIChsb2FkaTMyIGFkZHI6JGRzdCksIChhbmQgQ0wsIDMxKSksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChTQVIzMm1DTCBhZGRyOiRkc3QpPjsNCisNCisvLyAoYW55ZXh0IChzZXRjY19jYXJyeSkpIC0+IChzZXRjY19jYXJyeSkNCitkZWYgOiBQYXQ8KGkxNiAoYW55ZXh0IChpOCAoWDg2c2V0Y2NfYyBYODZfQ09ORF9CLCBFRkxBR1MpKSkpLA0KKyAgICAgICAgICAoU0VUQl9DMTZyKT47DQorZGVmIDogUGF0PChpMzIgKGFueWV4dCAoaTggKFg4NnNldGNjX2MgWDg2X0NPTkRfQiwgRUZMQUdTKSkpKSwNCisgICAgICAgICAgKFNFVEJfQzMycik+Ow0KK2RlZiA6IFBhdDwoaTMyIChhbnlleHQgKGkxNiAoWDg2c2V0Y2NfYyBYODZfQ09ORF9CLCBFRkxBR1MpKSkpLA0KKyAgICAgICAgICAoU0VUQl9DMzJyKT47DQorDQorLy8gKG9yIHgxLCB4MikgLT4gKGFkZCB4MSwgeDIpIGlmIHR3byBvcGVyYW5kcyBhcmUga25vd24gbm90IHRvIHNoYXJlIGJpdHMuDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDUgaW4geyAvLyBUcnkgdGhpcyBiZWZvcmUgdGhlIHNlbGVjdGluZyB0byBPUg0KK2RlZiA6IFBhdDwob3JfaXNfYWRkIEdSMTY6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChBREQxNnJpIEdSMTY6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwob3JfaXNfYWRkIEdSMzI6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChBREQzMnJpIEdSMzI6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwob3JfaXNfYWRkIEdSMTY6JHNyYzEsIGkxNmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKEFERDE2cmk4IEdSMTY6JHNyYzEsIGkxNmltbVNFeHQ4OiRzcmMyKT47DQorZGVmIDogUGF0PChvcl9pc19hZGQgR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpLA0KKyAgICAgICAgICAoQUREMzJyaTggR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG9yX2lzX2FkZCBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgKEFERDE2cnIgR1IxNjokc3JjMSwgR1IxNjokc3JjMik+Ow0KK2RlZiA6IFBhdDwob3JfaXNfYWRkIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAoQUREMzJyciBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKT47DQorfSAvLyBBZGRlZENvbXBsZXhpdHkNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEVGTEFHUy1kZWZpbmluZyBQYXR0ZXJucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gYWRkIHJlZywgcmVnDQorZGVmIDogUGF0PChhZGQgR1I4IDokc3JjMSwgR1I4IDokc3JjMiksIChBREQ4cnIgIEdSOCA6JHNyYzEsIEdSOCA6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwgKEFERDE2cnIgR1IxNjokc3JjMSwgR1IxNjokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYWRkIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLCAoQUREMzJyciBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKT47DQorDQorLy8gYWRkIHJlZywgbWVtDQorZGVmIDogUGF0PChhZGQgR1I4OiRzcmMxLCAobG9hZGk4IGFkZHI6JHNyYzIpKSwNCisgICAgICAgICAgKEFERDhybSBHUjg6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChBREQxNnJtIEdSMTY6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjMyOiRzcmMxLCAobG9hZGkzMiBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChBREQzMnJtIEdSMzI6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCisNCisvLyBhZGQgcmVnLCBpbW0NCitkZWYgOiBQYXQ8KGFkZCBHUjggOiRzcmMxLCBpbW06JHNyYzIpLCAoQUREOHJpICBHUjg6JHNyYzEgLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjE2OiRzcmMxLCBpbW06JHNyYzIpLCAoQUREMTZyaSBHUjE2OiRzcmMxLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjMyOiRzcmMxLCBpbW06JHNyYzIpLCAoQUREMzJyaSBHUjMyOiRzcmMxLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjE2OiRzcmMxLCBpMTZpbW1TRXh0ODokc3JjMiksDQorICAgICAgICAgIChBREQxNnJpOCBHUjE2OiRzcmMxLCBpMTZpbW1TRXh0ODokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYWRkIEdSMzI6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKEFERDMycmk4IEdSMzI6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKT47DQorDQorLy8gc3ViIHJlZywgcmVnDQorZGVmIDogUGF0PChzdWIgR1I4IDokc3JjMSwgR1I4IDokc3JjMiksIChTVUI4cnIgIEdSOCA6JHNyYzEsIEdSOCA6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YiBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKSwgKFNVQjE2cnIgR1IxNjokc3JjMSwgR1IxNjokc3JjMik+Ow0KK2RlZiA6IFBhdDwoc3ViIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLCAoU1VCMzJyciBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKT47DQorDQorLy8gc3ViIHJlZywgbWVtDQorZGVmIDogUGF0PChzdWIgR1I4OiRzcmMxLCAobG9hZGk4IGFkZHI6JHNyYzIpKSwNCisgICAgICAgICAgKFNVQjhybSBHUjg6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YiBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChTVUIxNnJtIEdSMTY6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YiBHUjMyOiRzcmMxLCAobG9hZGkzMiBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChTVUIzMnJtIEdSMzI6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCisNCisvLyBzdWIgcmVnLCBpbW0NCitkZWYgOiBQYXQ8KHN1YiBHUjg6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChTVUI4cmkgR1I4OiRzcmMxLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YiBHUjE2OiRzcmMxLCBpbW06JHNyYzIpLA0KKyAgICAgICAgICAoU1VCMTZyaSBHUjE2OiRzcmMxLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YiBHUjMyOiRzcmMxLCBpbW06JHNyYzIpLA0KKyAgICAgICAgICAoU1VCMzJyaSBHUjMyOiRzcmMxLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN1YiBHUjE2OiRzcmMxLCBpMTZpbW1TRXh0ODokc3JjMiksDQorICAgICAgICAgIChTVUIxNnJpOCBHUjE2OiRzcmMxLCBpMTZpbW1TRXh0ODokc3JjMik+Ow0KK2RlZiA6IFBhdDwoc3ViIEdSMzI6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKFNVQjMycmk4IEdSMzI6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKT47DQorDQorLy8gbXVsIHJlZywgcmVnDQorZGVmIDogUGF0PChtdWwgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksDQorICAgICAgICAgIChJTVVMMTZyciBHUjE2OiRzcmMxLCBHUjE2OiRzcmMyKT47DQorZGVmIDogUGF0PChtdWwgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksDQorICAgICAgICAgIChJTVVMMzJyciBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKT47DQorDQorLy8gbXVsIHJlZywgbWVtDQorZGVmIDogUGF0PChtdWwgR1IxNjokc3JjMSwgKGxvYWRpMTYgYWRkcjokc3JjMikpLA0KKyAgICAgICAgICAoSU1VTDE2cm0gR1IxNjokc3JjMSwgYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwobXVsIEdSMzI6JHNyYzEsIChsb2FkaTMyIGFkZHI6JHNyYzIpKSwNCisgICAgICAgICAgKElNVUwzMnJtIEdSMzI6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCisNCisvLyBtdWwgcmVnLCBpbW0NCitkZWYgOiBQYXQ8KG11bCBHUjE2OiRzcmMxLCBpbW06JHNyYzIpLA0KKyAgICAgICAgICAoSU1VTDE2cnJpIEdSMTY6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwobXVsIEdSMzI6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChJTVVMMzJycmkgR1IzMjokc3JjMSwgaW1tOiRzcmMyKT47DQorZGVmIDogUGF0PChtdWwgR1IxNjokc3JjMSwgaTE2aW1tU0V4dDg6JHNyYzIpLA0KKyAgICAgICAgICAoSU1VTDE2cnJpOCBHUjE2OiRzcmMxLCBpMTZpbW1TRXh0ODokc3JjMik+Ow0KK2RlZiA6IFBhdDwobXVsIEdSMzI6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKElNVUwzMnJyaTggR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpPjsNCisNCisvLyByZWcgPSBtdWwgbWVtLCBpbW0NCitkZWYgOiBQYXQ8KG11bCAobG9hZGkxNiBhZGRyOiRzcmMxKSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgKElNVUwxNnJtaSBhZGRyOiRzcmMxLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG11bCAobG9hZGkzMiBhZGRyOiRzcmMxKSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgKElNVUwzMnJtaSBhZGRyOiRzcmMxLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG11bCAobG9hZGkxNiBhZGRyOiRzcmMxKSwgaTE2aW1tU0V4dDg6JHNyYzIpLA0KKyAgICAgICAgICAoSU1VTDE2cm1pOCBhZGRyOiRzcmMxLCBpMTZpbW1TRXh0ODokc3JjMik+Ow0KK2RlZiA6IFBhdDwobXVsIChsb2FkaTMyIGFkZHI6JHNyYzEpLCBpMzJpbW1TRXh0ODokc3JjMiksDQorICAgICAgICAgIChJTVVMMzJybWk4IGFkZHI6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKT47DQorDQorLy8gT3B0aW1pemUgbXVsdGlwbHkgYnkgMiB3aXRoIEVGTEFHUyByZXN1bHQuDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDIgaW4gew0KK2RlZiA6IFBhdDwoWDg2c211bF9mbGFnIEdSMTY6JHNyYzEsIDIpLCAoQUREMTZyciBHUjE2OiRzcmMxLCBHUjE2OiRzcmMxKT47DQorZGVmIDogUGF0PChYODZzbXVsX2ZsYWcgR1IzMjokc3JjMSwgMiksIChBREQzMnJyIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzEpPjsNCit9DQorDQorLy8gUGF0dGVybnMgZm9yIG5vZGVzIHRoYXQgZG8gbm90IHByb2R1Y2UgZmxhZ3MsIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBkby4NCisNCisvLyBJbmNyZW1lbnQgcmVnLg0KK2RlZiA6IFBhdDwoYWRkIEdSODokc3JjMSAsICAxKSwgKElOQzhyICBHUjg6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjE2OiRzcmMxLCAgMSksIChJTkMxNnIgR1IxNjokc3JjMSk+LCBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjMyOiRzcmMxLCAgMSksIChJTkMzMnIgR1IzMjokc3JjMSk+LCBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCisNCisvLyBEZWNyZW1lbnQgcmVnLg0KK2RlZiA6IFBhdDwoYWRkIEdSODokc3JjMSAsIC0xKSwgKERFQzhyICBHUjg6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjE2OiRzcmMxLCAtMSksIChERUMxNnIgR1IxNjokc3JjMSk+LCBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCitkZWYgOiBQYXQ8KGFkZCBHUjMyOiRzcmMxLCAtMSksIChERUMzMnIgR1IzMjokc3JjMSk+LCBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsNCisNCisvLyBvciByZWcvcmVnLg0KK2RlZiA6IFBhdDwob3IgR1I4IDokc3JjMSwgR1I4IDokc3JjMiksIChPUjhyciAgR1I4IDokc3JjMSwgR1I4IDokc3JjMik+Ow0KK2RlZiA6IFBhdDwob3IgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksIChPUjE2cnIgR1IxNjokc3JjMSwgR1IxNjokc3JjMik+Ow0KK2RlZiA6IFBhdDwob3IgR1IzMjokc3JjMSwgR1IzMjokc3JjMiksIChPUjMycnIgR1IzMjokc3JjMSwgR1IzMjokc3JjMik+Ow0KKw0KKy8vIG9yIHJlZy9tZW0NCitkZWYgOiBQYXQ8KG9yIEdSODokc3JjMSwgKGxvYWRpOCBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChPUjhybSBHUjg6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG9yIEdSMTY6JHNyYzEsIChsb2FkaTE2IGFkZHI6JHNyYzIpKSwNCisgICAgICAgICAgKE9SMTZybSBHUjE2OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorZGVmIDogUGF0PChvciBHUjMyOiRzcmMxLCAobG9hZGkzMiBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChPUjMycm0gR1IzMjokc3JjMSwgYWRkcjokc3JjMik+Ow0KKw0KKy8vIG9yIHJlZy9pbW0NCitkZWYgOiBQYXQ8KG9yIEdSODokc3JjMSAsIGltbTokc3JjMiksIChPUjhyaSAgR1I4IDokc3JjMSwgaW1tOiRzcmMyKT47DQorZGVmIDogUGF0PChvciBHUjE2OiRzcmMxLCBpbW06JHNyYzIpLCAoT1IxNnJpIEdSMTY6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwob3IgR1IzMjokc3JjMSwgaW1tOiRzcmMyKSwgKE9SMzJyaSBHUjMyOiRzcmMxLCBpbW06JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG9yIEdSMTY6JHNyYzEsIGkxNmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKE9SMTZyaTggR1IxNjokc3JjMSwgaTE2aW1tU0V4dDg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KG9yIEdSMzI6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKE9SMzJyaTggR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpPjsNCisNCisvLyB4b3IgcmVnL3JlZw0KK2RlZiA6IFBhdDwoeG9yIEdSOCA6JHNyYzEsIEdSOCA6JHNyYzIpLCAoWE9SOHJyICBHUjggOiRzcmMxLCBHUjggOiRzcmMyKT47DQorZGVmIDogUGF0PCh4b3IgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksIChYT1IxNnJyIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHhvciBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwgKFhPUjMycnIgR1IzMjokc3JjMSwgR1IzMjokc3JjMik+Ow0KKw0KKy8vIHhvciByZWcvbWVtDQorZGVmIDogUGF0PCh4b3IgR1I4OiRzcmMxLCAobG9hZGk4IGFkZHI6JHNyYzIpKSwNCisgICAgICAgICAgKFhPUjhybSBHUjg6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHhvciBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChYT1IxNnJtIEdSMTY6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHhvciBHUjMyOiRzcmMxLCAobG9hZGkzMiBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChYT1IzMnJtIEdSMzI6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCisNCisvLyB4b3IgcmVnL2ltbQ0KK2RlZiA6IFBhdDwoeG9yIEdSODokc3JjMSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgKFhPUjhyaSBHUjg6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwoeG9yIEdSMTY6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChYT1IxNnJpIEdSMTY6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwoeG9yIEdSMzI6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChYT1IzMnJpIEdSMzI6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwoeG9yIEdSMTY6JHNyYzEsIGkxNmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKFhPUjE2cmk4IEdSMTY6JHNyYzEsIGkxNmltbVNFeHQ4OiRzcmMyKT47DQorZGVmIDogUGF0PCh4b3IgR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpLA0KKyAgICAgICAgICAoWE9SMzJyaTggR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpPjsNCisNCisvLyBhbmQgcmVnL3JlZw0KK2RlZiA6IFBhdDwoYW5kIEdSOCA6JHNyYzEsIEdSOCA6JHNyYzIpLCAoQU5EOHJyICBHUjggOiRzcmMxLCBHUjggOiRzcmMyKT47DQorZGVmIDogUGF0PChhbmQgR1IxNjokc3JjMSwgR1IxNjokc3JjMiksIChBTkQxNnJyIEdSMTY6JHNyYzEsIEdSMTY6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFuZCBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSwgKEFORDMycnIgR1IzMjokc3JjMSwgR1IzMjokc3JjMik+Ow0KKw0KKy8vIGFuZCByZWcvbWVtDQorZGVmIDogUGF0PChhbmQgR1I4OiRzcmMxLCAobG9hZGk4IGFkZHI6JHNyYzIpKSwNCisgICAgICAgICAgKEFORDhybSBHUjg6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFuZCBHUjE2OiRzcmMxLCAobG9hZGkxNiBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChBTkQxNnJtIEdSMTY6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KGFuZCBHUjMyOiRzcmMxLCAobG9hZGkzMiBhZGRyOiRzcmMyKSksDQorICAgICAgICAgIChBTkQzMnJtIEdSMzI6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCisNCisvLyBhbmQgcmVnL2ltbQ0KK2RlZiA6IFBhdDwoYW5kIEdSODokc3JjMSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgKEFORDhyaSBHUjg6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYW5kIEdSMTY6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChBTkQxNnJpIEdSMTY6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYW5kIEdSMzI6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChBTkQzMnJpIEdSMzI6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwoYW5kIEdSMTY6JHNyYzEsIGkxNmltbVNFeHQ4OiRzcmMyKSwNCisgICAgICAgICAgKEFORDE2cmk4IEdSMTY6JHNyYzEsIGkxNmltbVNFeHQ4OiRzcmMyKT47DQorZGVmIDogUGF0PChhbmQgR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpLA0KKyAgICAgICAgICAoQU5EMzJyaTggR1IzMjokc3JjMSwgaTMyaW1tU0V4dDg6JHNyYzIpPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIEZsb2F0aW5nIFBvaW50IFN0YWNrIFN1cHBvcnQNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIlg4Nkluc3RyRlBTdGFjay50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFg4Ni02NCBTdXBwb3J0DQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitpbmNsdWRlICJYODZJbnN0cjY0Yml0LnRkIg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU0lNRCBzdXBwb3J0IChTU0UsIE1NWCBhbmQgQVZYKQ0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQoraW5jbHVkZSAiWDg2SW5zdHJGcmFnbWVudHNTSU1ELnRkIg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gRk1BIC0gRnVzZWQgTXVsdGlwbHktQWRkIHN1cHBvcnQgKHJlcXVpcmVzIEZNQSkNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIlg4Nkluc3RyRk1BLnRkIg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gWE1NIEZsb2F0aW5nIHBvaW50IHN1cHBvcnQgKHJlcXVpcmVzIFNTRSAvIFNTRTIpDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitpbmNsdWRlICJYODZJbnN0clNTRS50ZCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIE1NWCBhbmQgWE1NIFBhY2tlZCBJbnRlZ2VyIHN1cHBvcnQgKHJlcXVpcmVzIE1NWCwgU1NFLCBhbmQgU1NFMikNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2luY2x1ZGUgIlg4Nkluc3RyTU1YLnRkIg0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nkluc3RyTU1YLnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SW5zdHJNTVgudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmNWE4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nkluc3RyTU1YLnRkCkBAIC0wLDAgKzEsNjYzIEBACisvLz09PT0tIFg4Nkluc3RyTU1YLnRkIC0gRGVzY3JpYmUgdGhlIFg4NiBJbnN0cnVjdGlvbiBTZXQgLS0qLSB0YWJsZWdlbiAtKi09PT0vLw0KKy8vDQorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKy8vDQorLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlDQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIFg4NiBNTVggaW5zdHJ1Y3Rpb24gc2V0LCBkZWZpbmluZyB0aGUgaW5zdHJ1Y3Rpb25zLA0KKy8vIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIG5lZWRlZCBmb3IgY29kZSBnZW5lcmF0aW9uLA0KKy8vIG1hY2hpbmUgY29kZSBlbWlzc2lvbiwgYW5kIGFuYWx5c2lzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIE1NWCBNdWx0aWNsYXNzZXMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCisgIC8vIE1NWElfYmlub3Bfcm0gLSBTaW1wbGUgTU1YIGJpbmFyeSBvcGVyYXRvci4NCisgIG11bHRpY2xhc3MgTU1YSV9iaW5vcF9ybTxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgU0ROb2RlIE9wTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgT3BWVCwgYml0IENvbW11dGFibGUgPSAwPiB7DQorICAgIGRlZiByciA6IE1NWEk8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgKGlucyBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwgKE9wVlQgKE9wTm9kZSBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKSkpXT4gew0KKyAgICAgIGxldCBpc0NvbW11dGFibGUgPSBDb21tdXRhYmxlOw0KKyAgICB9DQorICAgIGRlZiBybSA6IE1NWEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgKGlucyBWUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LCAoT3BWVCAoT3BOb2RlIFZSNjQ6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0Y29udmVydA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkX21teCBhZGRyOiRzcmMyKSkpKSldPjsNCisgIH0NCisNCisgIG11bHRpY2xhc3MgTU1YSV9iaW5vcF9ybV9pbnQ8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsIEludHJpbnNpYyBJbnRJZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IENvbW11dGFibGUgPSAwPiB7DQorICAgIGRlZiByciA6IE1NWEk8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAoaW5zIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwgKEludElkIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpKV0+IHsNCisgICAgICBsZXQgaXNDb21tdXRhYmxlID0gQ29tbXV0YWJsZTsNCisgICAgfQ0KKyAgICBkZWYgcm0gOiBNTVhJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjY0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgKGlucyBWUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwgKEludElkIFZSNjQ6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0Y29udmVydCAobG9hZF9tbXggYWRkcjokc3JjMikpKSldPjsNCisgIH0NCisNCisgIC8vIE1NWElfYmlub3Bfcm1fdjFpNjQgLSBTaW1wbGUgTU1YIGJpbmFyeSBvcGVyYXRvciB3aG9zZSB0eXBlIGlzIHYxaTY0Lg0KKyAgLy8NCisgIC8vIEZJWE1FOiB3ZSBjb3VsZCBlbGltaW5hdGUgdGhpcyBhbmQgdXNlIE1NWElfYmlub3Bfcm0gaW5zdGVhZCBpZiB0YmxnZW4ga25ldw0KKyAgLy8gdG8gY29sbGFwc2UgKGJpdGNvbnZlcnQgVlQgdG8gVlQpIGludG8gaXRzIG9wZXJhbmQuDQorICAvLw0KKyAgbXVsdGljbGFzcyBNTVhJX2Jpbm9wX3JtX3YxaTY0PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLCBTRE5vZGUgT3BOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBDb21tdXRhYmxlID0gMD4gew0KKyAgICBkZWYgcnIgOiBNTVhJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LCAodjFpNjQgKE9wTm9kZSBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKSkpXT4gew0KKyAgICAgIGxldCBpc0NvbW11dGFibGUgPSBDb21tdXRhYmxlOw0KKyAgICB9DQorICAgIGRlZiBybSA6IE1NWEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgVlI2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgIChPcE5vZGUgVlI2NDokc3JjMSwobG9hZF9tbXggYWRkcjokc3JjMikpKV0+Ow0KKyAgfQ0KKw0KKyAgbXVsdGljbGFzcyBNTVhJX2Jpbm9wX3JtaV9pbnQ8Yml0czw4PiBvcGMsIGJpdHM8OD4gb3BjMiwgRm9ybWF0IEltbUZvcm0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyLCBJbnRyaW5zaWMgSW50SWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50SWQyPiB7DQorICAgIGRlZiByciA6IE1NWEk8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgVlI2NDokc3JjMSwgVlI2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsIChJbnRJZCBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKSldPjsNCisgICAgZGVmIHJtIDogTU1YSTxvcGMsIE1STVNyY01lbSwgKG91dHMgVlI2NDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBWUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LCAoSW50SWQgVlI2NDokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0Y29udmVydCAobG9hZF9tbXggYWRkcjokc3JjMikpKSldPjsNCisgICAgZGVmIHJpIDogTU1YSWk4PG9wYzIsIEltbUZvcm0sIChvdXRzIFZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIFZSNjQ6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsIChJbnRJZDIgVlI2NDokc3JjMSwgKGkzMiBpbW06JHNyYzIpKSldPjsNCisgIH0NCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBNTVggRU1NUyAmIEZFTU1TIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorZGVmIE1NWF9FTU1TICA6IE1NWEk8MHg3NywgUmF3RnJtLCAob3V0cyksIChpbnMpLCAiZW1tcyIsDQorICAgICAgICAgICAgICAgICAgICAgWyhpbnRfeDg2X21teF9lbW1zKV0+Ow0KK2RlZiBNTVhfRkVNTVMgOiBNTVhJPDB4MEUsIFJhd0ZybSwgKG91dHMpLCAoaW5zKSwgImZlbW1zIiwNCisgICAgICAgICAgICAgICAgICAgICBbKGludF94ODZfbW14X2ZlbW1zKV0+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gTU1YIFNjYWxhciBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIERhdGEgVHJhbnNmZXIgSW5zdHJ1Y3Rpb25zDQorZGVmIE1NWF9NT1ZENjRyciA6IE1NWEk8MHg2RSwgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAodjJpMzIgKHNjYWxhcl90b192ZWN0b3IgR1IzMjokc3JjKSkpXT47DQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluDQorZGVmIE1NWF9NT1ZENjRybSA6IE1NWEk8MHg2RSwgTVJNU3JjTWVtLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIGkzMm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LA0KKyAgICAgICAgICAgICAgICh2MmkzMiAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGkzMiBhZGRyOiRzcmMpKSkpXT47DQorbGV0IG1heVN0b3JlID0gMSBpbg0KK2RlZiBNTVhfTU9WRDY0bXIgOiBNTVhJPDB4N0UsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgVlI2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorZGVmIE1NWF9NT1ZENjRncnIgOiBNTVhJPDB4N0UsIE1STURlc3RSZWcsIChvdXRzKSwgKGlucyBHUjMyOiRkc3QsIFZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KKw0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbg0KK2RlZiBNTVhfTU9WRDY0dG82NHJyIDogTU1YUkk8MHg2RSwgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIEdSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+Ow0KKw0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbg0KKy8vIFRoZXNlIGFyZSA2NCBiaXQgbW92ZXMsIGJ1dCBzaW5jZSB0aGUgT1MgWCBhc3NlbWJsZXIgZG9lc24ndA0KKy8vIHJlY29nbml6ZSBhIHJlZ2lzdGVyLXJlZ2lzdGVyIG1vdnEsIHdlIHdyaXRlIHRoZW0gYXMNCisvLyBtb3ZkLg0KK2RlZiBNTVhfTU9WRDY0ZnJvbTY0cnIgOiBNTVhSSTwweDdFLCBNUk1EZXN0UmVnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCitkZWYgTU1YX01PVkQ2NHJydjE2NCA6IE1NWFJJPDB4NkUsIE1STVNyY1JlZywgKG91dHMgVlI2NDokZHN0KSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjFpNjQgKHNjYWxhcl90b192ZWN0b3IgR1I2NDokc3JjKSkpXT47DQorDQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluDQorZGVmIE1NWF9NT1ZRNjRyciA6IE1NWEk8MHg2RiwgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2xldCBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbg0KK2RlZiBNTVhfTU9WUTY0cm0gOiBNTVhJPDB4NkYsIE1STVNyY01lbSwgKG91dHMgVlI2NDokZHN0KSwgKGlucyBpNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsIChsb2FkX21teCBhZGRyOiRzcmMpKV0+Ow0KK2RlZiBNTVhfTU9WUTY0bXIgOiBNTVhJPDB4N0YsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgVlI2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAibW92cVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHYxaTY0IFZSNjQ6JHNyYyksIGFkZHI6JGRzdCldPjsNCisNCitkZWYgTU1YX01PVkRRMlFyciA6IFNESWk4PDB4RDYsIE1STVNyY1JlZywgKG91dHMgVlI2NDokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZkcTJxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MWk2NCAoYml0Y29udmVydA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTY0ICh2ZWN0b3JfZXh0cmFjdCAodjJpNjQgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpUFRSIDApKSkpKSldPjsNCisNCitkZWYgTU1YX01PVlEyRFFyciA6IFNTRElpODwweEQ2LCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnEyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAobW92bCBpbW1BbGxaZXJvc1YsDQorICAgICAgICAgICAgICAgICAgKHYyaTY0IChzY2FsYXJfdG9fdmVjdG9yDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk2NCAoYml0Y29udmVydCAodjFpNjQgVlI2NDokc3JjKSkpKSkpKV0+Ow0KKw0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbg0KK2RlZiBNTVhfTU9WUTJGUjY0cnI6IFNTRElpODwweEQ2LCBNUk1TcmNSZWcsIChvdXRzIEZSNjQ6JGRzdCksIChpbnMgVlI2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92cTJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorDQorZGVmIE1NWF9NT1ZGUjY0MlFycjogU0RJaTg8MHhENiwgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIEZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmRxMnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KKw0KK2RlZiBNTVhfTU9WTlRRbXIgIDogTU1YSTwweEU3LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIFZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZudHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhpbnRfeDg2X21teF9tb3ZudF9kcSBhZGRyOiRkc3QsIFZSNjQ6JHNyYyldPjsNCisNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTUgaW4NCisvLyBtb3ZkIHRvIE1NWCByZWdpc3RlciB6ZXJvLWV4dGVuZHMNCitkZWYgTU1YX01PVlpESTJQRElyciA6IE1NWEk8MHg2RSwgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgKHYyaTMyIChYODZ2em1vdmwgKHYyaTMyIChzY2FsYXJfdG9fdmVjdG9yIEdSMzI6JHNyYykpKSkpXT47DQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDIwIGluDQorZGVmIE1NWF9NT1ZaREkyUERJcm0gOiBNTVhJPDB4NkUsIE1STVNyY01lbSwgKG91dHMgVlI2NDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGkzMm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgKHYyaTMyIChYODZ2em1vdmwgKHYyaTMyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGkzMiBhZGRyOiRzcmMpKSkpKSldPjsNCisNCisvLyBBcml0aG1ldGljIEluc3RydWN0aW9ucw0KKw0KKy8vIC0tIEFkZGl0aW9uDQorZGVmbSBNTVhfUEFEREIgOiBNTVhJX2Jpbm9wX3JtPDB4RkMsICJwYWRkYiIsIGFkZCwgdjhpOCwgIDE+Ow0KK2RlZm0gTU1YX1BBRERXIDogTU1YSV9iaW5vcF9ybTwweEZELCAicGFkZHciLCBhZGQsIHY0aTE2LCAxPjsNCitkZWZtIE1NWF9QQURERCA6IE1NWElfYmlub3Bfcm08MHhGRSwgInBhZGRkIiwgYWRkLCB2MmkzMiwgMT47DQorZGVmbSBNTVhfUEFERFEgOiBNTVhJX2Jpbm9wX3JtPDB4RDQsICJwYWRkcSIsIGFkZCwgdjFpNjQsIDE+Ow0KKw0KK2RlZm0gTU1YX1BBRERTQiAgOiBNTVhJX2Jpbm9wX3JtX2ludDwweEVDLCAicGFkZHNiIiAsIGludF94ODZfbW14X3BhZGRzX2IsIDE+Ow0KK2RlZm0gTU1YX1BBRERTVyAgOiBNTVhJX2Jpbm9wX3JtX2ludDwweEVELCAicGFkZHN3IiAsIGludF94ODZfbW14X3BhZGRzX3csIDE+Ow0KKw0KK2RlZm0gTU1YX1BBRERVU0IgOiBNTVhJX2Jpbm9wX3JtX2ludDwweERDLCAicGFkZHVzYiIsIGludF94ODZfbW14X3BhZGR1c19iLCAxPjsNCitkZWZtIE1NWF9QQUREVVNXIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHhERCwgInBhZGR1c3ciLCBpbnRfeDg2X21teF9wYWRkdXNfdywgMT47DQorDQorLy8gLS0gU3VidHJhY3Rpb24NCitkZWZtIE1NWF9QU1VCQiA6IE1NWElfYmlub3Bfcm08MHhGOCwgInBzdWJiIiwgc3ViLCB2OGk4PjsNCitkZWZtIE1NWF9QU1VCVyA6IE1NWElfYmlub3Bfcm08MHhGOSwgInBzdWJ3Iiwgc3ViLCB2NGkxNj47DQorZGVmbSBNTVhfUFNVQkQgOiBNTVhJX2Jpbm9wX3JtPDB4RkEsICJwc3ViZCIsIHN1YiwgdjJpMzI+Ow0KK2RlZm0gTU1YX1BTVUJRIDogTU1YSV9iaW5vcF9ybTwweEZCLCAicHN1YnEiLCBzdWIsIHYxaTY0PjsNCisNCitkZWZtIE1NWF9QU1VCU0IgIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHhFOCwgInBzdWJzYiIgLCBpbnRfeDg2X21teF9wc3Vic19iPjsNCitkZWZtIE1NWF9QU1VCU1cgIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHhFOSwgInBzdWJzdyIgLCBpbnRfeDg2X21teF9wc3Vic193PjsNCisNCitkZWZtIE1NWF9QU1VCVVNCIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHhEOCwgInBzdWJ1c2IiLCBpbnRfeDg2X21teF9wc3VidXNfYj47DQorZGVmbSBNTVhfUFNVQlVTVyA6IE1NWElfYmlub3Bfcm1faW50PDB4RDksICJwc3VidXN3IiwgaW50X3g4Nl9tbXhfcHN1YnVzX3c+Ow0KKw0KKy8vIC0tIE11bHRpcGxpY2F0aW9uDQorZGVmbSBNTVhfUE1VTExXICA6IE1NWElfYmlub3Bfcm08MHhENSwgInBtdWxsdyIsIG11bCwgdjRpMTYsIDE+Ow0KKw0KK2RlZm0gTU1YX1BNVUxIVyAgOiBNTVhJX2Jpbm9wX3JtX2ludDwweEU1LCAicG11bGh3IiwgIGludF94ODZfbW14X3BtdWxoX3csICAxPjsNCitkZWZtIE1NWF9QTVVMSFVXIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHhFNCwgInBtdWxodXciLCBpbnRfeDg2X21teF9wbXVsaHVfdywgMT47DQorZGVmbSBNTVhfUE1VTFVEUSA6IE1NWElfYmlub3Bfcm1faW50PDB4RjQsICJwbXVsdWRxIiwgaW50X3g4Nl9tbXhfcG11bHVfZHEsIDE+Ow0KKw0KKy8vIC0tIE1pc2NlbGxhbmVhDQorZGVmbSBNTVhfUE1BRERXRCA6IE1NWElfYmlub3Bfcm1faW50PDB4RjUsICJwbWFkZHdkIiwgaW50X3g4Nl9tbXhfcG1hZGRfd2QsIDE+Ow0KKw0KK2RlZm0gTU1YX1BBVkdCICAgOiBNTVhJX2Jpbm9wX3JtX2ludDwweEUwLCAicGF2Z2IiLCBpbnRfeDg2X21teF9wYXZnX2IsIDE+Ow0KK2RlZm0gTU1YX1BBVkdXICAgOiBNTVhJX2Jpbm9wX3JtX2ludDwweEUzLCAicGF2Z3ciLCBpbnRfeDg2X21teF9wYXZnX3csIDE+Ow0KKw0KK2RlZm0gTU1YX1BNSU5VQiAgOiBNTVhJX2Jpbm9wX3JtX2ludDwweERBLCAicG1pbnViIiwgaW50X3g4Nl9tbXhfcG1pbnVfYiwgMT47DQorZGVmbSBNTVhfUE1JTlNXICA6IE1NWElfYmlub3Bfcm1faW50PDB4RUEsICJwbWluc3ciLCBpbnRfeDg2X21teF9wbWluc193LCAxPjsNCisNCitkZWZtIE1NWF9QTUFYVUIgIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHhERSwgInBtYXh1YiIsIGludF94ODZfbW14X3BtYXh1X2IsIDE+Ow0KK2RlZm0gTU1YX1BNQVhTVyAgOiBNTVhJX2Jpbm9wX3JtX2ludDwweEVFLCAicG1heHN3IiwgaW50X3g4Nl9tbXhfcG1heHNfdywgMT47DQorDQorZGVmbSBNTVhfUFNBREJXICA6IE1NWElfYmlub3Bfcm1faW50PDB4RjYsICJwc2FkYnciLCBpbnRfeDg2X21teF9wc2FkX2J3LCAxPjsNCisNCisvLyBMb2dpY2FsIEluc3RydWN0aW9ucw0KK2RlZm0gTU1YX1BBTkQgOiBNTVhJX2Jpbm9wX3JtX3YxaTY0PDB4REIsICJwYW5kIiwgYW5kLCAxPjsNCitkZWZtIE1NWF9QT1IgIDogTU1YSV9iaW5vcF9ybV92MWk2NDwweEVCLCAicG9yIiAsIG9yLCAgMT47DQorZGVmbSBNTVhfUFhPUiA6IE1NWElfYmlub3Bfcm1fdjFpNjQ8MHhFRiwgInB4b3IiLCB4b3IsIDE+Ow0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCisgIGRlZiBNTVhfUEFORE5yciA6IE1NWEk8MHhERiwgTVJNU3JjUmVnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAicGFuZG5cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsICh2MWk2NCAoYW5kICh2bm90IFZSNjQ6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlI2NDokc3JjMikpKV0+Ow0KKyAgZGVmIE1NWF9QQU5ETnJtIDogTU1YSTwweERGLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSNjQ6JGRzdCksIChpbnMgVlI2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhbmRuXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LCAodjFpNjQgKGFuZCAodm5vdCBWUjY0OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkIGFkZHI6JHNyYzIpKSkpXT47DQorfQ0KKw0KKy8vIFNoaWZ0IEluc3RydWN0aW9ucw0KK2RlZm0gTU1YX1BTUkxXIDogTU1YSV9iaW5vcF9ybWlfaW50PDB4RDEsIDB4NzEsIE1STTJyLCAicHNybHciLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfbW14X3BzcmxfdywgaW50X3g4Nl9tbXhfcHNybGlfdz47DQorZGVmbSBNTVhfUFNSTEQgOiBNTVhJX2Jpbm9wX3JtaV9pbnQ8MHhEMiwgMHg3MiwgTVJNMnIsICJwc3JsZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9tbXhfcHNybF9kLCBpbnRfeDg2X21teF9wc3JsaV9kPjsNCitkZWZtIE1NWF9QU1JMUSA6IE1NWElfYmlub3Bfcm1pX2ludDwweEQzLCAweDczLCBNUk0yciwgInBzcmxxIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X21teF9wc3JsX3EsIGludF94ODZfbW14X3BzcmxpX3E+Ow0KKw0KK2RlZm0gTU1YX1BTTExXIDogTU1YSV9iaW5vcF9ybWlfaW50PDB4RjEsIDB4NzEsIE1STTZyLCAicHNsbHciLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfbW14X3BzbGxfdywgaW50X3g4Nl9tbXhfcHNsbGlfdz47DQorZGVmbSBNTVhfUFNMTEQgOiBNTVhJX2Jpbm9wX3JtaV9pbnQ8MHhGMiwgMHg3MiwgTVJNNnIsICJwc2xsZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9tbXhfcHNsbF9kLCBpbnRfeDg2X21teF9wc2xsaV9kPjsNCitkZWZtIE1NWF9QU0xMUSA6IE1NWElfYmlub3Bfcm1pX2ludDwweEYzLCAweDczLCBNUk02ciwgInBzbGxxIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X21teF9wc2xsX3EsIGludF94ODZfbW14X3BzbGxpX3E+Ow0KKw0KK2RlZm0gTU1YX1BTUkFXIDogTU1YSV9iaW5vcF9ybWlfaW50PDB4RTEsIDB4NzEsIE1STTRyLCAicHNyYXciLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfbW14X3BzcmFfdywgaW50X3g4Nl9tbXhfcHNyYWlfdz47DQorZGVmbSBNTVhfUFNSQUQgOiBNTVhJX2Jpbm9wX3JtaV9pbnQ8MHhFMiwgMHg3MiwgTVJNNHIsICJwc3JhZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9tbXhfcHNyYV9kLCBpbnRfeDg2X21teF9wc3JhaV9kPjsNCisNCisvLyBTaGlmdCB1cCAvIGRvd24gYW5kIGluc2VydCB6ZXJvJ3MuDQorZGVmIDogUGF0PCh2MWk2NCAoWDg2dnNobCAgICAgVlI2NDokc3JjLCAoaTggaW1tOiRhbXQpKSksDQorICAgICAgICAgIChNTVhfUFNMTFFyaSBWUjY0OiRzcmMsIChHZXRMbzMyWEZvcm0gaW1tOiRhbXQpKT47DQorZGVmIDogUGF0PCh2MWk2NCAoWDg2dnNociAgICAgVlI2NDokc3JjLCAoaTggaW1tOiRhbXQpKSksDQorICAgICAgICAgIChNTVhfUFNSTFFyaSBWUjY0OiRzcmMsIChHZXRMbzMyWEZvcm0gaW1tOiRhbXQpKT47DQorDQorLy8gQ29tcGFyaXNvbiBJbnN0cnVjdGlvbnMNCitkZWZtIE1NWF9QQ01QRVFCIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHg3NCwgInBjbXBlcWIiLCBpbnRfeDg2X21teF9wY21wZXFfYj47DQorZGVmbSBNTVhfUENNUEVRVyA6IE1NWElfYmlub3Bfcm1faW50PDB4NzUsICJwY21wZXF3IiwgaW50X3g4Nl9tbXhfcGNtcGVxX3c+Ow0KK2RlZm0gTU1YX1BDTVBFUUQgOiBNTVhJX2Jpbm9wX3JtX2ludDwweDc2LCAicGNtcGVxZCIsIGludF94ODZfbW14X3BjbXBlcV9kPjsNCisNCitkZWZtIE1NWF9QQ01QR1RCIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHg2NCwgInBjbXBndGIiLCBpbnRfeDg2X21teF9wY21wZ3RfYj47DQorZGVmbSBNTVhfUENNUEdUVyA6IE1NWElfYmlub3Bfcm1faW50PDB4NjUsICJwY21wZ3R3IiwgaW50X3g4Nl9tbXhfcGNtcGd0X3c+Ow0KK2RlZm0gTU1YX1BDTVBHVEQgOiBNTVhJX2Jpbm9wX3JtX2ludDwweDY2LCAicGNtcGd0ZCIsIGludF94ODZfbW14X3BjbXBndF9kPjsNCisNCisvLyBDb252ZXJzaW9uIEluc3RydWN0aW9ucw0KKw0KKy8vIC0tIFVucGFjayBJbnN0cnVjdGlvbnMNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorICAvLyBVbnBhY2sgSGlnaCBQYWNrZWQgRGF0YSBJbnN0cnVjdGlvbnMNCisgIGRlZiBNTVhfUFVOUENLSEJXcnIgOiBNTVhJPDB4NjgsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSNjQ6JGRzdCksIChpbnMgVlI2NDokc3JjMSwgVlI2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVucGNraGJ3XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTggKG1teF91bnBja2ggVlI2NDokc3JjMSwgVlI2NDokc3JjMikpKV0+Ow0KKyAgZGVmIE1NWF9QVU5QQ0tIQldybSA6IE1NWEk8MHg2OCwgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgVlI2NDokZHN0KSwgKGlucyBWUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1bnBja2hid1x0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGk4IChtbXhfdW5wY2toIFZSNjQ6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmNfdjhpOCAobG9hZF9tbXggYWRkcjokc3JjMikpKSkpXT47DQorDQorICBkZWYgTU1YX1BVTlBDS0hXRHJyIDogTU1YSTwweDY5LCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1bnBja2h3ZFx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkxNiAobW14X3VucGNraCBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKSkpXT47DQorICBkZWYgTU1YX1BVTlBDS0hXRHJtIDogTU1YSTwweDY5LCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVucGNraHdkXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTE2IChtbXhfdW5wY2toIFZSNjQ6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJjX3Y0aTE2IChsb2FkX21teCBhZGRyOiRzcmMyKSkpKSldPjsNCisNCisgIGRlZiBNTVhfUFVOUENLSERRcnIgOiBNTVhJPDB4NkEsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSNjQ6JGRzdCksIChpbnMgVlI2NDokc3JjMSwgVlI2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVucGNraGRxXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyaTMyIChtbXhfdW5wY2toIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpKSldPjsNCisgIGRlZiBNTVhfUFVOUENLSERRcm0gOiBNTVhJPDB4NkEsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSNjQ6JGRzdCksIChpbnMgVlI2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdW5wY2toZHFcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJpMzIgKG1teF91bnBja2ggVlI2NDokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmNfdjJpMzIgKGxvYWRfbW14IGFkZHI6JHNyYzIpKSkpKV0+Ow0KKw0KKyAgLy8gVW5wYWNrIExvdyBQYWNrZWQgRGF0YSBJbnN0cnVjdGlvbnMNCisgIGRlZiBNTVhfUFVOUENLTEJXcnIgOiBNTVhJPDB4NjAsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSNjQ6JGRzdCksIChpbnMgVlI2NDokc3JjMSwgVlI2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVucGNrbGJ3XHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTggKG1teF91bnBja2wgVlI2NDokc3JjMSwgVlI2NDokc3JjMikpKV0+Ow0KKyAgZGVmIE1NWF9QVU5QQ0tMQldybSA6IE1NWEk8MHg2MCwgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgVlI2NDokZHN0KSwgKGlucyBWUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1bnBja2xid1x0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGk4IChtbXhfdW5wY2tsIFZSNjQ6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmNfdjhpOCAobG9hZF9tbXggYWRkcjokc3JjMikpKSkpXT47DQorDQorICBkZWYgTU1YX1BVTlBDS0xXRHJyIDogTU1YSTwweDYxLCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1bnBja2x3ZFx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkxNiAobW14X3VucGNrbCBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKSkpXT47DQorICBkZWYgTU1YX1BVTlBDS0xXRHJtIDogTU1YSTwweDYxLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVucGNrbHdkXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTE2IChtbXhfdW5wY2tsIFZSNjQ6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJjX3Y0aTE2IChsb2FkX21teCBhZGRyOiRzcmMyKSkpKSldPjsNCisNCisgIGRlZiBNTVhfUFVOUENLTERRcnIgOiBNTVhJPDB4NjIsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSNjQ6JGRzdCksIChpbnMgVlI2NDokc3JjMSwgVlI2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVucGNrbGRxXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyaTMyIChtbXhfdW5wY2tsIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpKSldPjsNCisgIGRlZiBNTVhfUFVOUENLTERRcm0gOiBNTVhJPDB4NjIsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSNjQ6JGRzdCksIChpbnMgVlI2NDokc3JjMSwgaTY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdW5wY2tsZHFcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJpMzIgKG1teF91bnBja2wgVlI2NDokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmNfdjJpMzIgKGxvYWRfbW14IGFkZHI6JHNyYzIpKSkpKV0+Ow0KK30NCisNCisvLyAtLSBQYWNrIEluc3RydWN0aW9ucw0KK2RlZm0gTU1YX1BBQ0tTU1dCIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHg2MywgInBhY2tzc3diIiwgaW50X3g4Nl9tbXhfcGFja3Nzd2I+Ow0KK2RlZm0gTU1YX1BBQ0tTU0RXIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHg2QiwgInBhY2tzc2R3IiwgaW50X3g4Nl9tbXhfcGFja3NzZHc+Ow0KK2RlZm0gTU1YX1BBQ0tVU1dCIDogTU1YSV9iaW5vcF9ybV9pbnQ8MHg2NywgInBhY2t1c3diIiwgaW50X3g4Nl9tbXhfcGFja3Vzd2I+Ow0KKw0KKy8vIC0tIFNodWZmbGUgSW5zdHJ1Y3Rpb25zDQorZGVmIE1NWF9QU0hVRldyaSA6IE1NWElpODwweDcwLCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwc2h1ZndcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkxNiAobW14X3BzaHVmdzokc3JjMiBWUjY0OiRzcmMxLCAodW5kZWYpKSkpXT47DQorZGVmIE1NWF9QU0hVRldtaSA6IE1NWElpODwweDcwLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIGk2NG1lbTokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgInBzaHVmd1x0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1teF9wc2h1Znc6JHNyYzIgKGJjX3Y0aTE2IChsb2FkX21teCBhZGRyOiRzcmMxKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmRlZikpKV0+Ow0KKw0KKy8vIC0tIENvbnZlcnNpb24gSW5zdHJ1Y3Rpb25zDQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCitkZWYgTU1YX0NWVFBEMlBJcnIgIDogTU1YMkk8MHgyRCwgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cGQycGlcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2xldCBtYXlMb2FkID0gMSBpbg0KK2RlZiBNTVhfQ1ZUUEQyUElybSAgOiBNTVgySTwweDJELCBNUk1TcmNNZW0sIChvdXRzIFZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHBkMnBpXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCisNCitkZWYgTU1YX0NWVFBJMlBEcnIgIDogTU1YMkk8MHgyQSwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cGkycGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2xldCBtYXlMb2FkID0gMSBpbg0KK2RlZiBNTVhfQ1ZUUEkyUERybSAgOiBNTVgySTwweDJBLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGk2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHBpMnBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCisNCitkZWYgTU1YX0NWVFBJMlBTcnIgIDogTU1YSTwweDJBLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHBpMnBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCitsZXQgbWF5TG9hZCA9IDEgaW4NCitkZWYgTU1YX0NWVFBJMlBTcm0gIDogTU1YSTwweDJBLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnRwaTJwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorDQorZGVmIE1NWF9DVlRQUzJQSXJyICA6IE1NWEk8MHgyRCwgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnRwczJwaVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorbGV0IG1heUxvYWQgPSAxIGluDQorZGVmIE1NWF9DVlRQUzJQSXJtICA6IE1NWEk8MHgyRCwgTVJNU3JjTWVtLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIGY2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cHMycGlcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KKw0KK2RlZiBNTVhfQ1ZUVFBEMlBJcnIgOiBNTVgySTwweDJDLCBNUk1TcmNSZWcsIChvdXRzIFZSNjQ6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0cGQycGlcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2xldCBtYXlMb2FkID0gMSBpbg0KK2RlZiBNTVhfQ1ZUVFBEMlBJcm0gOiBNTVgySTwweDJDLCBNUk1TcmNNZW0sIChvdXRzIFZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRwZDJwaVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorDQorZGVmIE1NWF9DVlRUUFMyUElyciA6IE1NWEk8MHgyQywgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0cHMycGlcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2xldCBtYXlMb2FkID0gMSBpbg0KK2RlZiBNTVhfQ1ZUVFBTMlBJcm0gOiBNTVhJPDB4MkMsIE1STVNyY01lbSwgKG91dHMgVlI2NDokZHN0KSwgKGlucyBmNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRwczJwaVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorfSAvLyBlbmQgbmV2ZXJIYXNTaWRlRWZmZWN0cw0KKw0KKw0KKy8vIEV4dHJhY3QgLyBJbnNlcnQNCitkZWYgTU1YX1g4NnBpbnNydyA6IFNETm9kZTwiWDg2SVNEOjpNTVhfUElOU1JXIiwNCisgICAgICAgICAgICAgICAgICAgIFNEVHlwZVByb2ZpbGU8MSwgMywgW1NEVENpc1ZUPDAsIHY0aTE2PiwgU0RUQ2lzU2FtZUFzPDAsMT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFRDaXNWVDwyLCBpMzI+LCBTRFRDaXNQdHJUeTwzPl0+PjsNCisNCisNCitkZWYgTU1YX1BFWFRSV3JpICA6IE1NWElpODwweEM1LCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBWUjY0OiRzcmMxLCBpMTZpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBleHRyd1x0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZwZXh0cncgKHY0aTE2IFZSNjQ6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpUFRSIGltbTokc3JjMikpKV0+Ow0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCisgIGRlZiBNTVhfUElOU1JXcnJpIDogTU1YSWk4PDB4QzQsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgVlI2NDokZHN0KSwgDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgVlI2NDokc3JjMSwgR1IzMjokc3JjMixpMTZpOGltbTokc3JjMyksDQorICAgICAgICAgICAgICAgICAgICAgICJwaW5zcndcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwgKHY0aTE2IChNTVhfWDg2cGluc3J3ICh2NGkxNiBWUjY0OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSMzI6JHNyYzIsKGlQVFIgaW1tOiRzcmMzKSkpKV0+Ow0KKyAgZGVmIE1NWF9QSU5TUldybWkgOiBNTVhJaTg8MHhDNCwgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgKGlucyBWUjY0OiRzcmMxLCBpMTZtZW06JHNyYzIsIGkxNmk4aW1tOiRzcmMzKSwNCisgICAgICAgICAgICAgICAgICAgICAicGluc3J3XHR7JHNyYzMsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAkc3JjM30iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICh2NGkxNiAoTU1YX1g4NnBpbnNydyAodjRpMTYgVlI2NDokc3JjMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIgKGFueWV4dCAobG9hZGkxNiBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaVBUUiBpbW06JHNyYzMpKSkpXT47DQorfQ0KKw0KKy8vIE1NWCB0byBYTU0gZm9yIHZlY3RvciB0eXBlcw0KK2RlZiBNTVhfWDg2bW92cTJkcSA6IFNETm9kZTwiWDg2SVNEOjpNT1ZRMkRRIiwgU0RUeXBlUHJvZmlsZTwxLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0RUQ2lzVlQ8MCwgdjJpNjQ+LCBTRFRDaXNWVDwxLCB2MWk2ND5dPj47DQorDQorZGVmIDogUGF0PCh2Mmk2NCAoTU1YX1g4Nm1vdnEyZHEgVlI2NDokc3JjKSksDQorICAgICAgICAgICh2Mmk2NCAoTU1YX01PVlEyRFFyciBWUjY0OiRzcmMpKT47DQorDQorZGVmIDogUGF0PCh2Mmk2NCAoTU1YX1g4Nm1vdnEyZHEgKGxvYWRfbW14IGFkZHI6JHNyYykpKSwNCisgICAgICAgICAgKHYyaTY0IChNT1ZRSTJQUUlybSBhZGRyOiRzcmMpKT47DQorDQorZGVmIDogUGF0PCh2Mmk2NCAoTU1YX1g4Nm1vdnEyZHEgKHYxaTY0IChiaXRjb252ZXJ0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MmkzMiAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGkzMiBhZGRyOiRzcmMpKSkpKSkpLA0KKyAgICAgICAgICAodjJpNjQgKE1PVkRJMlBESXJtIGFkZHI6JHNyYykpPjsNCisNCisvLyBNYXNrIGNyZWF0aW9uDQorZGVmIE1NWF9QTU9WTVNLQnJyIDogTU1YSTwweEQ3LCBNUk1TcmNSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgVlI2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwbW92bXNrYlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoaW50X3g4Nl9tbXhfcG1vdm1za2IgVlI2NDokc3JjKSldPjsNCisNCisvLyBNaXNjLg0KK2xldCBVc2VzID0gW0VESV0gaW4NCitkZWYgTU1YX01BU0tNT1ZRIDogTU1YSTwweEY3LCBNUk1TcmNSZWcsIChvdXRzKSwgKGlucyBWUjY0OiRzcmMsIFZSNjQ6JG1hc2spLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXNrbW92cVx0eyRtYXNrLCAkc3JjfCRzcmMsICRtYXNrfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhpbnRfeDg2X21teF9tYXNrbW92cSBWUjY0OiRzcmMsIFZSNjQ6JG1hc2ssIEVESSldPjsNCitsZXQgVXNlcyA9IFtSREldIGluDQorZGVmIE1NWF9NQVNLTU9WUTY0OiBNTVhJNjQ8MHhGNywgTVJNU3JjUmVnLCAob3V0cyksIChpbnMgVlI2NDokc3JjLCBWUjY0OiRtYXNrKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFza21vdnFcdHskbWFzaywgJHNyY3wkc3JjLCAkbWFza30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoaW50X3g4Nl9tbXhfbWFza21vdnEgVlI2NDokc3JjLCBWUjY0OiRtYXNrLCBSREkpXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBBbGlhcyBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIEFsaWFzIGluc3RydWN0aW9ucyB0aGF0IG1hcCB6ZXJvIHZlY3RvciB0byBweG9yLg0KK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxLCBpc0NvZGVHZW5Pbmx5ID0gMSBpbiB7DQorICAvLyBGSVhNRTogQ2hhbmdlIGVuY29kaW5nIHRvIHBzZXVkby4NCisgIGRlZiBNTVhfVl9TRVQwICAgICAgIDogTU1YSTwweEVGLCBNUk1Jbml0UmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zKSwgIiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LCAodjJpMzIgaW1tQWxsWmVyb3NWKSldPjsNCisgIGRlZiBNTVhfVl9TRVRBTExPTkVTIDogTU1YSTwweDc2LCBNUk1Jbml0UmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zKSwgIiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LCAodjJpMzIgaW1tQWxsT25lc1YpKV0+Ow0KK30NCisNCitsZXQgUHJlZGljYXRlcyA9IFtIYXNNTVhdIGluIHsNCisgIGRlZiA6IFBhdDwodjFpNjQgaW1tQWxsWmVyb3NWKSwgKE1NWF9WX1NFVDApPjsNCisgIGRlZiA6IFBhdDwodjRpMTYgaW1tQWxsWmVyb3NWKSwgKE1NWF9WX1NFVDApPjsNCisgIGRlZiA6IFBhdDwodjhpOCAgaW1tQWxsWmVyb3NWKSwgKE1NWF9WX1NFVDApPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBOb24tSW5zdHJ1Y3Rpb24gUGF0dGVybnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIFN0b3JlIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciB2YWx1ZXMuDQorZGVmIDogUGF0PChzdG9yZSAodjhpOCAgVlI2NDokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1NWF9NT1ZRNjRtciBhZGRyOiRkc3QsIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKHY0aTE2IFZSNjQ6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNTVhfTU9WUTY0bXIgYWRkcjokZHN0LCBWUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHN0b3JlICh2MmkzMiBWUjY0OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAoTU1YX01PVlE2NG1yIGFkZHI6JGRzdCwgVlI2NDokc3JjKT47DQorZGVmIDogUGF0PChzdG9yZSAodjFpNjQgVlI2NDokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1NWF9NT1ZRNjRtciBhZGRyOiRkc3QsIFZSNjQ6JHNyYyk+Ow0KKw0KKy8vIEJpdCBjb252ZXJ0Lg0KK2RlZiA6IFBhdDwodjhpOCAgKGJpdGNvbnZlcnQgKHYxaTY0IFZSNjQ6JHNyYykpKSwgKHY4aTggIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjhpOCAgKGJpdGNvbnZlcnQgKHYyaTMyIFZSNjQ6JHNyYykpKSwgKHY4aTggIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjhpOCAgKGJpdGNvbnZlcnQgKHY0aTE2IFZSNjQ6JHNyYykpKSwgKHY4aTggIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjRpMTYgKGJpdGNvbnZlcnQgKHYxaTY0IFZSNjQ6JHNyYykpKSwgKHY0aTE2IFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjRpMTYgKGJpdGNvbnZlcnQgKHYyaTMyIFZSNjQ6JHNyYykpKSwgKHY0aTE2IFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjRpMTYgKGJpdGNvbnZlcnQgKHY4aTggIFZSNjQ6JHNyYykpKSwgKHY0aTE2IFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjJpMzIgKGJpdGNvbnZlcnQgKHYxaTY0IFZSNjQ6JHNyYykpKSwgKHYyaTMyIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjJpMzIgKGJpdGNvbnZlcnQgKHY0aTE2IFZSNjQ6JHNyYykpKSwgKHYyaTMyIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjJpMzIgKGJpdGNvbnZlcnQgKHY4aTggIFZSNjQ6JHNyYykpKSwgKHYyaTMyIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjFpNjQgKGJpdGNvbnZlcnQgKHYyaTMyIFZSNjQ6JHNyYykpKSwgKHYxaTY0IFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjFpNjQgKGJpdGNvbnZlcnQgKHY0aTE2IFZSNjQ6JHNyYykpKSwgKHYxaTY0IFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjFpNjQgKGJpdGNvbnZlcnQgKHY4aTggIFZSNjQ6JHNyYykpKSwgKHYxaTY0IFZSNjQ6JHNyYyk+Ow0KKw0KKy8vIDY0LWJpdCBiaXQgY29udmVydC4NCitkZWYgOiBQYXQ8KHYxaTY0IChiaXRjb252ZXJ0IChpNjQgR1I2NDokc3JjKSkpLA0KKyAgICAgICAgICAoTU1YX01PVkQ2NHRvNjRyciBHUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHYyaTMyIChiaXRjb252ZXJ0IChpNjQgR1I2NDokc3JjKSkpLA0KKyAgICAgICAgICAoTU1YX01PVkQ2NHRvNjRyciBHUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHY0aTE2IChiaXRjb252ZXJ0IChpNjQgR1I2NDokc3JjKSkpLA0KKyAgICAgICAgICAoTU1YX01PVkQ2NHRvNjRyciBHUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHY4aTggIChiaXRjb252ZXJ0IChpNjQgR1I2NDokc3JjKSkpLA0KKyAgICAgICAgICAoTU1YX01PVkQ2NHRvNjRyciBHUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KGk2NCAoYml0Y29udmVydCAodjFpNjQgVlI2NDokc3JjKSkpLA0KKyAgICAgICAgICAoTU1YX01PVkQ2NGZyb202NHJyIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoaTY0IChiaXRjb252ZXJ0ICh2MmkzMiBWUjY0OiRzcmMpKSksDQorICAgICAgICAgIChNTVhfTU9WRDY0ZnJvbTY0cnIgVlI2NDokc3JjKT47DQorZGVmIDogUGF0PChpNjQgKGJpdGNvbnZlcnQgKHY0aTE2IFZSNjQ6JHNyYykpKSwNCisgICAgICAgICAgKE1NWF9NT1ZENjRmcm9tNjRyciBWUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KGk2NCAgKGJpdGNvbnZlcnQgKHY4aTggVlI2NDokc3JjKSkpLA0KKyAgICAgICAgICAoTU1YX01PVkQ2NGZyb202NHJyIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoZjY0IChiaXRjb252ZXJ0ICh2MWk2NCBWUjY0OiRzcmMpKSksDQorICAgICAgICAgIChNTVhfTU9WUTJGUjY0cnIgVlI2NDokc3JjKT47DQorZGVmIDogUGF0PChmNjQgKGJpdGNvbnZlcnQgKHYyaTMyIFZSNjQ6JHNyYykpKSwNCisgICAgICAgICAgKE1NWF9NT1ZRMkZSNjRyciBWUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KGY2NCAoYml0Y29udmVydCAodjRpMTYgVlI2NDokc3JjKSkpLA0KKyAgICAgICAgICAoTU1YX01PVlEyRlI2NHJyIFZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoZjY0IChiaXRjb252ZXJ0ICh2OGk4IFZSNjQ6JHNyYykpKSwNCisgICAgICAgICAgKE1NWF9NT1ZRMkZSNjRyciBWUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHYxaTY0IChiaXRjb252ZXJ0IChmNjQgRlI2NDokc3JjKSkpLA0KKyAgICAgICAgICAoTU1YX01PVkZSNjQyUXJyIEZSNjQ6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjJpMzIgKGJpdGNvbnZlcnQgKGY2NCBGUjY0OiRzcmMpKSksDQorICAgICAgICAgIChNTVhfTU9WRlI2NDJRcnIgRlI2NDokc3JjKT47DQorZGVmIDogUGF0PCh2NGkxNiAoYml0Y29udmVydCAoZjY0IEZSNjQ6JHNyYykpKSwNCisgICAgICAgICAgKE1NWF9NT1ZGUjY0MlFyciBGUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHY4aTggKGJpdGNvbnZlcnQgKGY2NCBGUjY0OiRzcmMpKSksDQorICAgICAgICAgIChNTVhfTU9WRlI2NDJRcnIgRlI2NDokc3JjKT47DQorDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDIwIGluIHsNCisgIGRlZiA6IFBhdDwodjJpMzIgKFg4NnZ6bW92bCAoYmNfdjJpMzIgKGxvYWRfbW14IGFkZHI6JHNyYykpKSksDQorICAgICAgICAgICAgKE1NWF9NT1ZaREkyUERJcm0gYWRkcjokc3JjKT47DQorfQ0KKw0KKy8vIENsZWFyIHRvcCBoYWxmLg0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAxNSBpbiB7DQorICBkZWYgOiBQYXQ8KHYyaTMyIChYODZ2em1vdmwgVlI2NDokc3JjKSksDQorICAgICAgICAgICAgKE1NWF9QVU5QQ0tMRFFyciBWUjY0OiRzcmMsICh2MmkzMiAoTU1YX1ZfU0VUMCkpKT47DQorfQ0KKw0KKy8vIFBhdHRlcm5zIHRvIHBlcmZvcm0gY2Fub25pY2FsIHZlcnNpb25zIG9mIHZlY3RvciBzaHVmZmxpbmcuDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDEwIGluIHsNCisgIGRlZiA6IFBhdDwodjhpOCAgKG1teF91bnBja2xfdW5kZWYgVlI2NDokc3JjLCAodW5kZWYpKSksDQorICAgICAgICAgICAgKE1NWF9QVU5QQ0tMQldyciBWUjY0OiRzcmMsIFZSNjQ6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2NGkxNiAobW14X3VucGNrbF91bmRlZiBWUjY0OiRzcmMsICh1bmRlZikpKSwNCisgICAgICAgICAgICAoTU1YX1BVTlBDS0xXRHJyIFZSNjQ6JHNyYywgVlI2NDokc3JjKT47DQorICBkZWYgOiBQYXQ8KHYyaTMyIChtbXhfdW5wY2tsX3VuZGVmIFZSNjQ6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAgIChNTVhfUFVOUENLTERRcnIgVlI2NDokc3JjLCBWUjY0OiRzcmMpPjsNCit9DQorDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDEwIGluIHsNCisgIGRlZiA6IFBhdDwodjhpOCAgKG1teF91bnBja2hfdW5kZWYgVlI2NDokc3JjLCAodW5kZWYpKSksDQorICAgICAgICAgICAgKE1NWF9QVU5QQ0tIQldyciBWUjY0OiRzcmMsIFZSNjQ6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2NGkxNiAobW14X3VucGNraF91bmRlZiBWUjY0OiRzcmMsICh1bmRlZikpKSwNCisgICAgICAgICAgICAoTU1YX1BVTlBDS0hXRHJyIFZSNjQ6JHNyYywgVlI2NDokc3JjKT47DQorICBkZWYgOiBQYXQ8KHYyaTMyIChtbXhfdW5wY2toX3VuZGVmIFZSNjQ6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAgIChNTVhfUFVOUENLSERRcnIgVlI2NDokc3JjLCBWUjY0OiRzcmMpPjsNCit9DQorDQorLy8gU29tZSBzcGVjaWFsIGNhc2UgUEFORE4gcGF0dGVybnMuDQorLy8gRklYTUU6IEdldCByaWQgb2YgdGhlc2UuDQorZGVmIDogUGF0PCh2MWk2NCAoYW5kICh4b3IgVlI2NDokc3JjMSwgKGJjX3YxaTY0ICh2MmkzMiBpbW1BbGxPbmVzVikpKSwNCisgICAgICAgICAgICAgICAgICBWUjY0OiRzcmMyKSksDQorICAgICAgICAgIChNTVhfUEFORE5yciBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKT47DQorZGVmIDogUGF0PCh2MWk2NCAoYW5kICh4b3IgVlI2NDokc3JjMSwgKGJjX3YxaTY0ICh2MmkzMiBpbW1BbGxPbmVzVikpKSwNCisgICAgICAgICAgICAgICAgICAobG9hZCBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAoTU1YX1BBTkROcm0gVlI2NDokc3JjMSwgYWRkcjokc3JjMik+Ow0KKw0KKy8vIE1vdmUgTU1YIHRvIGxvd2VyIDY0LWJpdCBvZiBYTU0NCitkZWYgOiBQYXQ8KHYyaTY0IChzY2FsYXJfdG9fdmVjdG9yIChpNjQgKGJpdGNvbnZlcnQgKHY4aTggVlI2NDokc3JjKSkpKSksDQorICAgICAgICAgICh2Mmk2NCAoTU1YX01PVlEyRFFyciBWUjY0OiRzcmMpKT47DQorZGVmIDogUGF0PCh2Mmk2NCAoc2NhbGFyX3RvX3ZlY3RvciAoaTY0IChiaXRjb252ZXJ0ICh2NGkxNiBWUjY0OiRzcmMpKSkpKSwNCisgICAgICAgICAgKHYyaTY0IChNTVhfTU9WUTJEUXJyIFZSNjQ6JHNyYykpPjsNCitkZWYgOiBQYXQ8KHYyaTY0IChzY2FsYXJfdG9fdmVjdG9yIChpNjQgKGJpdGNvbnZlcnQgKHYyaTMyIFZSNjQ6JHNyYykpKSkpLA0KKyAgICAgICAgICAodjJpNjQgKE1NWF9NT1ZRMkRRcnIgVlI2NDokc3JjKSk+Ow0KK2RlZiA6IFBhdDwodjJpNjQgKHNjYWxhcl90b192ZWN0b3IgKGk2NCAoYml0Y29udmVydCAodjFpNjQgVlI2NDokc3JjKSkpKSksDQorICAgICAgICAgICh2Mmk2NCAoTU1YX01PVlEyRFFyciBWUjY0OiRzcmMpKT47DQorDQorLy8gTW92ZSBsb3dlciA2NC1iaXQgb2YgWE1NIHRvIE1NWC4NCitkZWYgOiBQYXQ8KHYyaTMyIChiaXRjb252ZXJ0IChpNjQgKHZlY3Rvcl9leHRyYWN0ICh2Mmk2NCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpUFRSIDApKSkpKSwNCisgICAgICAgICAgKHYyaTMyIChNTVhfTU9WRFEyUXJyIFZSMTI4OiRzcmMpKT47DQorZGVmIDogUGF0PCh2NGkxNiAoYml0Y29udmVydCAoaTY0ICh2ZWN0b3JfZXh0cmFjdCAodjJpNjQgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaVBUUiAwKSkpKSksDQorICAgICAgICAgICh2NGkxNiAoTU1YX01PVkRRMlFyciBWUjEyODokc3JjKSk+Ow0KK2RlZiA6IFBhdDwodjhpOCAoYml0Y29udmVydCAoaTY0ICh2ZWN0b3JfZXh0cmFjdCAodjJpNjQgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaVBUUiAwKSkpKSksDQorICAgICAgICAgICh2OGk4IChNTVhfTU9WRFEyUXJyIFZSMTI4OiRzcmMpKT47DQorDQorLy8gUGF0dGVybnMgZm9yIHZlY3RvciBjb21wYXJpc29ucw0KK2RlZiA6IFBhdDwodjhpOCAoWDg2cGNtcGVxYiBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKSksDQorICAgICAgICAgIChNTVhfUENNUEVRQnJyIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHY4aTggKFg4NnBjbXBlcWIgVlI2NDokc3JjMSwgKGJpdGNvbnZlcnQgKGxvYWRfbW14IGFkZHI6JHNyYzIpKSkpLA0KKyAgICAgICAgICAoTU1YX1BDTVBFUUJybSBWUjY0OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorZGVmIDogUGF0PCh2NGkxNiAoWDg2cGNtcGVxdyBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKSksDQorICAgICAgICAgIChNTVhfUENNUEVRV3JyIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHY0aTE2IChYODZwY21wZXF3IFZSNjQ6JHNyYzEsIChiaXRjb252ZXJ0IChsb2FkX21teCBhZGRyOiRzcmMyKSkpKSwNCisgICAgICAgICAgKE1NWF9QQ01QRVFXcm0gVlI2NDokc3JjMSwgYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjJpMzIgKFg4NnBjbXBlcWQgVlI2NDokc3JjMSwgVlI2NDokc3JjMikpLA0KKyAgICAgICAgICAoTU1YX1BDTVBFUURyciBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKT47DQorZGVmIDogUGF0PCh2MmkzMiAoWDg2cGNtcGVxZCBWUjY0OiRzcmMxLCAoYml0Y29udmVydCAobG9hZF9tbXggYWRkcjokc3JjMikpKSksDQorICAgICAgICAgIChNTVhfUENNUEVRRHJtIFZSNjQ6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCisNCitkZWYgOiBQYXQ8KHY4aTggKFg4NnBjbXBndGIgVlI2NDokc3JjMSwgVlI2NDokc3JjMikpLA0KKyAgICAgICAgICAoTU1YX1BDTVBHVEJyciBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKT47DQorZGVmIDogUGF0PCh2OGk4IChYODZwY21wZ3RiIFZSNjQ6JHNyYzEsIChiaXRjb252ZXJ0IChsb2FkX21teCBhZGRyOiRzcmMyKSkpKSwNCisgICAgICAgICAgKE1NWF9QQ01QR1RCcm0gVlI2NDokc3JjMSwgYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjRpMTYgKFg4NnBjbXBndHcgVlI2NDokc3JjMSwgVlI2NDokc3JjMikpLA0KKyAgICAgICAgICAoTU1YX1BDTVBHVFdyciBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKT47DQorZGVmIDogUGF0PCh2NGkxNiAoWDg2cGNtcGd0dyBWUjY0OiRzcmMxLCAoYml0Y29udmVydCAobG9hZF9tbXggYWRkcjokc3JjMikpKSksDQorICAgICAgICAgIChNTVhfUENNUEdUV3JtIFZSNjQ6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHYyaTMyIChYODZwY21wZ3RkIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpKSwNCisgICAgICAgICAgKE1NWF9QQ01QR1REcnIgVlI2NDokc3JjMSwgVlI2NDokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjJpMzIgKFg4NnBjbXBndGQgVlI2NDokc3JjMSwgKGJpdGNvbnZlcnQgKGxvYWRfbW14IGFkZHI6JHNyYzIpKSkpLA0KKyAgICAgICAgICAoTU1YX1BDTVBHVERybSBWUjY0OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorDQorLy8gQ01PViogLSBVc2VkIHRvIGltcGxlbWVudCB0aGUgU0VMRUNUIERBRyBvcGVyYXRpb24uICBFeHBhbmRlZCBhZnRlcg0KKy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBpbnRvIGEgYnJhbmNoIHNlcXVlbmNlLg0KK2xldCBVc2VzID0gW0VGTEFHU10sIHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4gew0KKyAgZGVmIENNT1ZfVjFJNjQgOiBJPDAsIFBzZXVkbywNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSNjQ6JGRzdCksIChpbnMgVlI2NDokdCwgVlI2NDokZiwgaThpbW06JGNvbmQpLA0KKyAgICAgICAgICAgICAgICAgICAgIiNDTU9WX1YxSTY0IFBTRVVETyEiLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlI2NDokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAodjFpNjQgKFg4NmNtb3YgVlI2NDokdCwgVlI2NDokZiwgaW1tOiRjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGTEFHUykpKV0+Ow0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0clNTRS50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nkluc3RyU1NFLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YjliZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZJbnN0clNTRS50ZApAQCAtMCwwICsxLDU1MzkgQEAKKy8vPT09PS0gWDg2SW5zdHJTU0UudGQgLSBEZXNjcmliZSB0aGUgWDg2IEluc3RydWN0aW9uIFNldCAtLSotIHRhYmxlZ2VuIC0qLT09PS8vDQorLy8NCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vDQorLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgWDg2IFNTRSBpbnN0cnVjdGlvbiBzZXQsIGRlZmluaW5nIHRoZSBpbnN0cnVjdGlvbnMsDQorLy8gYW5kIHByb3BlcnRpZXMgb2YgdGhlIGluc3RydWN0aW9ucyB3aGljaCBhcmUgbmVlZGVkIGZvciBjb2RlIGdlbmVyYXRpb24sDQorLy8gbWFjaGluZSBjb2RlIGVtaXNzaW9uLCBhbmQgYW5hbHlzaXMuDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFIHNjYWxhciBGUCBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIENNT1YqIC0gVXNlZCB0byBpbXBsZW1lbnQgdGhlIFNTRSBTRUxFQ1QgREFHIG9wZXJhdGlvbi4gIEV4cGFuZGVkIGFmdGVyDQorLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGludG8gYSBicmFuY2ggc2VxdWVuY2UuDQorbGV0IFVzZXMgPSBbRUZMQUdTXSwgdXNlc0N1c3RvbUluc2VydGVyID0gMSBpbiB7DQorICBkZWYgQ01PVl9GUjMyIDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBGUjMyOiRkc3QpLCAoaW5zIEZSMzI6JHQsIEZSMzI6JGYsIGk4aW1tOiRjb25kKSwNCisgICAgICAgICAgICAgICAgICAgICIjQ01PVl9GUjMyIFBTRVVETyEiLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlIzMjokZHN0LCAoWDg2Y21vdiBGUjMyOiR0LCBGUjMyOiRmLCBpbW06JGNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkxBR1MpKV0+Ow0KKyAgZGVmIENNT1ZfRlI2NCA6IEk8MCwgUHNldWRvLA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgRlI2NDokZHN0KSwgKGlucyBGUjY0OiR0LCBGUjY0OiRmLCBpOGltbTokY29uZCksDQorICAgICAgICAgICAgICAgICAgICAiI0NNT1ZfRlI2NCBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZSNjQ6JGRzdCwgKFg4NmNtb3YgRlI2NDokdCwgRlI2NDokZiwgaW1tOiRjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZMQUdTKSldPjsNCisgIGRlZiBDTU9WX1Y0RjMyIDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokdCwgVlIxMjg6JGYsIGk4aW1tOiRjb25kKSwNCisgICAgICAgICAgICAgICAgICAgICIjQ01PVl9WNEYzMiBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiAoWDg2Y21vdiBWUjEyODokdCwgVlIxMjg6JGYsIGltbTokY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkxBR1MpKSldPjsNCisgIGRlZiBDTU9WX1YyRjY0IDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokdCwgVlIxMjg6JGYsIGk4aW1tOiRjb25kKSwNCisgICAgICAgICAgICAgICAgICAgICIjQ01PVl9WMkY2NCBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICh2MmY2NCAoWDg2Y21vdiBWUjEyODokdCwgVlIxMjg6JGYsIGltbTokY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkxBR1MpKSldPjsNCisgIGRlZiBDTU9WX1YySTY0IDogSTwwLCBQc2V1ZG8sDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokdCwgVlIxMjg6JGYsIGk4aW1tOiRjb25kKSwNCisgICAgICAgICAgICAgICAgICAgICIjQ01PVl9WMkk2NCBQU0VVRE8hIiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCAoWDg2Y21vdiBWUjEyODokdCwgVlIxMjg6JGYsIGltbTokY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkxBR1MpKSldPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0UgMSAmIDIgSW5zdHJ1Y3Rpb25zIENsYXNzZXMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vLyBzc2UxMl9mcF9zY2FsYXIgLSBTU0UgMSAmIDIgc2NhbGFyIGluc3RydWN0aW9ucyBjbGFzcw0KK211bHRpY2xhc3Mgc3NlMTJfZnBfc2NhbGFyPGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLCBTRE5vZGUgT3BOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MgUkMsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IElzMkFkZHIgPSAxPiB7DQorICBsZXQgaXNDb21tdXRhYmxlID0gMSBpbiB7DQorICAgIGRlZiByciA6IFNJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSwgUkM6JHNyYzIpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgICBbKHNldCBSQzokZHN0LCAoT3BOb2RlIFJDOiRzcmMxLCBSQzokc3JjMikpXT47DQorICB9DQorICBkZWYgcm0gOiBTSTxvcGMsIE1STVNyY01lbSwgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIHg4Nm1lbW9wOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgUkM6JGRzdCwgKE9wTm9kZSBSQzokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKV0+Ow0KK30NCisNCisvLy8gc3NlMTJfZnBfc2NhbGFyX2ludCAtIFNTRSAxICYgMiBzY2FsYXIgaW5zdHJ1Y3Rpb25zIGludHJpbnNpY3MgY2xhc3MNCittdWx0aWNsYXNzIHNzZTEyX2ZwX3NjYWxhcl9pbnQ8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsIFJlZ2lzdGVyQ2xhc3MgUkMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXNtLCBzdHJpbmcgU1NFVmVyLCBzdHJpbmcgRlBTaXplU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZCBtZW1vcHIsIENvbXBsZXhQYXR0ZXJuIG1lbV9jcGF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IElzMkFkZHIgPSAxPiB7DQorICBkZWYgcnJfSW50IDogU0k8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFJDOiRkc3QpLCAoaW5zIFJDOiRzcmMxLCBSQzokc3JjMiksDQorICAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgIFsoc2V0IFJDOiRkc3QsICghbmFtZWNvbmNhdDxJbnRyaW5zaWM+KCJpbnRfeDg2X3NzZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KFNTRVZlciwgIXN0cmNvbmNhdCgiXyIsDQorICAgICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgRlBTaXplU3RyKSkpKQ0KKyAgICAgICAgICAgICBSQzokc3JjMSwgUkM6JHNyYzIpKV0+Ow0KKyAgZGVmIHJtX0ludCA6IFNJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSwgbWVtb3ByOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgUkM6JGRzdCwgKCFuYW1lY29uY2F0PEludHJpbnNpYz4oImludF94ODZfc3NlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoU1NFVmVyLCAhc3RyY29uY2F0KCJfIiwNCisgICAgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCBGUFNpemVTdHIpKSkpDQorICAgICAgICAgICAgIFJDOiRzcmMxLCBtZW1fY3BhdDokc3JjMikpXT47DQorfQ0KKw0KKy8vLyBzc2UxMl9mcF9wYWNrZWQgLSBTU0UgMSAmIDIgcGFja2VkIGluc3RydWN0aW9ucyBjbGFzcw0KK211bHRpY2xhc3Mgc3NlMTJfZnBfcGFja2VkPGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLCBTRE5vZGUgT3BOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MgUkMsIFZhbHVlVHlwZSB2dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLCBQYXRGcmFnIG1lbV9mcmFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWFpbiBkLCBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGxldCBpc0NvbW11dGFibGUgPSAxIGluDQorICAgIGRlZiByciA6IFBJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSwgUkM6JHNyYzIpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgICBbKHNldCBSQzokZHN0LCAodnQgKE9wTm9kZSBSQzokc3JjMSwgUkM6JHNyYzIpKSldLCBkPjsNCisgIGxldCBtYXlMb2FkID0gMSBpbg0KKyAgICBkZWYgcm0gOiBQSTxvcGMsIE1STVNyY01lbSwgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIHg4Nm1lbW9wOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgUkM6JGRzdCwgKE9wTm9kZSBSQzokc3JjMSwgKG1lbV9mcmFnIGFkZHI6JHNyYzIpKSldLCBkPjsNCit9DQorDQorLy8vIHNzZTEyX2ZwX3BhY2tlZF9sb2dpY2FsX3JtIC0gU1NFIDEgJiAyIHBhY2tlZCBpbnN0cnVjdGlvbnMgY2xhc3MNCittdWx0aWNsYXNzIHNzZTEyX2ZwX3BhY2tlZF9sb2dpY2FsX3JtPGJpdHM8OD4gb3BjLCBSZWdpc3RlckNsYXNzIFJDLCBEb21haW4gZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PGRhZz4gcGF0X3JyLCBsaXN0PGRhZz4gcGF0X3JtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IElzMkFkZHIgPSAxPiB7DQorICBsZXQgaXNDb21tdXRhYmxlID0gMSBpbg0KKyAgICBkZWYgcnIgOiBQSTxvcGMsIE1STVNyY1JlZywgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIFJDOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgcGF0X3JyLCBkPjsNCisgIGRlZiBybSA6IFBJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSwgeDg2bWVtb3A6JHNyYzIpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgICBwYXRfcm0sIGQ+Ow0KK30NCisNCisvLy8gc3NlMTJfZnBfcGFja2VkX2ludCAtIFNTRSAxICYgMiBwYWNrZWQgaW5zdHJ1Y3Rpb25zIGludHJpbnNpY3MgY2xhc3MNCittdWx0aWNsYXNzIHNzZTEyX2ZwX3BhY2tlZF9pbnQ8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsIFJlZ2lzdGVyQ2xhc3MgUkMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgc3RyaW5nIFNTRVZlciwgc3RyaW5nIEZQU2l6ZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLCBQYXRGcmFnIG1lbV9mcmFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWFpbiBkLCBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGRlZiBycl9JbnQgOiBQSTxvcGMsIE1STVNyY1JlZywgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIFJDOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgICAgIFsoc2V0IFJDOiRkc3QsICghbmFtZWNvbmNhdDxJbnRyaW5zaWM+KCJpbnRfeDg2XyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChTU0VWZXIsICFzdHJjb25jYXQoIl8iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCBGUFNpemVTdHIpKSkpDQorICAgICAgICAgICAgICAgICBSQzokc3JjMSwgUkM6JHNyYzIpKV0sIGQ+Ow0KKyAgZGVmIHJtX0ludCA6IFBJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSx4ODZtZW1vcDokc3JjMiksDQorICAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgIFsoc2V0IFJDOiRkc3QsICghbmFtZWNvbmNhdDxJbnRyaW5zaWM+KCJpbnRfeDg2XyIsDQorICAgICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KFNTRVZlciwgIXN0cmNvbmNhdCgiXyIsDQorICAgICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgRlBTaXplU3RyKSkpKQ0KKyAgICAgICAgICAgICBSQzokc3JjMSwgKG1lbV9mcmFnIGFkZHI6JHNyYzIpKSldLCBkPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0UgMSAmIDIgLSBNb3ZlIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorY2xhc3Mgc3NlMTJfbW92ZV9ycjxSZWdpc3RlckNsYXNzIFJDLCBWYWx1ZVR5cGUgdnQsIHN0cmluZyBhc20+IDoNCisgICAgICBTSTwweDEwLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBSQzokc3JjMiksIGFzbSwNCisgICAgICBbKHNldCAodnQgVlIxMjg6JGRzdCksIChtb3ZsIFZSMTI4OiRzcmMxLCAoc2NhbGFyX3RvX3ZlY3RvciBSQzokc3JjMikpKV0+Ow0KKw0KKy8vIExvYWRpbmcgZnJvbSBtZW1vcnkgYXV0b21hdGljYWxseSB6ZXJvaW5nIHVwcGVyIGJpdHMuDQorY2xhc3Mgc3NlMTJfbW92ZV9ybTxSZWdpc3RlckNsYXNzIFJDLCBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLA0KKyAgICAgICAgICAgICAgICAgICAgUGF0RnJhZyBtZW1fcGF0LCBzdHJpbmcgT3Bjb2RlU3RyPiA6DQorICAgICAgU0k8MHgxMCwgTVJNU3JjTWVtLCAob3V0cyBSQzokZHN0KSwgKGlucyB4ODZtZW1vcDokc3JjKSwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBSQzokZHN0LCAobWVtX3BhdCBhZGRyOiRzcmMpKV0+Ow0KKw0KKy8vIE1vdmUgSW5zdHJ1Y3Rpb25zLiBSZWdpc3Rlci10by1yZWdpc3RlciBtb3Zzcy9tb3ZzZCBpcyBub3QgdXNlZCBmb3IgRlIzMi82NA0KKy8vIHJlZ2lzdGVyIGNvcGllcyBiZWNhdXNlIGl0J3MgYSBwYXJ0aWFsIHJlZ2lzdGVyIHVwZGF0ZTsgRnNNT1ZBUFNyci9Gc01PVkFQRHJyDQorLy8gaXMgdXNlZCBpbnN0ZWFkLiBSZWdpc3Rlci10by1yZWdpc3RlciBtb3Zzcy9tb3ZzZCBpcyBub3QgbW9kZWxlZCBhcyBhbg0KKy8vIElOU0VSVF9TVUJSRUcgYmVjYXVzZSBJTlNFUlRfU1VCUkVHIHJlcXVpcmVzIHRoYXQgdGhlIGluc2VydCBiZSBpbXBsZW1lbnRhYmxlDQorLy8gaW4gdGVybXMgb2YgYSBjb3B5LCBhbmQganVzdCBtZW50aW9uZWQsIHdlIGRvbid0IHVzZSBtb3Zzcy9tb3ZzZCBmb3IgY29waWVzLg0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCisgIGRlZiBWTU9WU1NyciA6IHNzZTEyX21vdmVfcnI8RlIzMiwgdjRmMzIsDQorICAgICAgICAgICAgICAgICAgIm1vdnNzXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iPiwgWFMsIFZFWF80VjsNCisgIGRlZiBWTU9WU0RyciA6IHNzZTEyX21vdmVfcnI8RlI2NCwgdjJmNjQsDQorICAgICAgICAgICAgICAgICAgIm1vdnNkXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iPiwgWEQsIFZFWF80VjsNCisNCisgIGxldCBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbiB7DQorICAgIGRlZiBWTU9WU1NybSA6IHNzZTEyX21vdmVfcm08RlIzMiwgZjMybWVtLCBsb2FkZjMyLCAibW92c3MiPiwgWFMsIFZFWDsNCisNCisgICAgbGV0IEFkZGVkQ29tcGxleGl0eSA9IDIwIGluDQorICAgICAgZGVmIFZNT1ZTRHJtIDogc3NlMTJfbW92ZV9ybTxGUjY0LCBmNjRtZW0sIGxvYWRmNjQsICJtb3ZzZCI+LCBYRCwgVkVYOw0KKyAgfQ0KK30NCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorICBkZWYgTU9WU1NyciA6IHNzZTEyX21vdmVfcnI8RlIzMiwgdjRmMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAibW92c3NcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iPiwgWFM7DQorICBkZWYgTU9WU0RyciA6IHNzZTEyX21vdmVfcnI8RlI2NCwgdjJmNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAibW92c2RcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iPiwgWEQ7DQorfQ0KKw0KK2xldCBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbiB7DQorICBkZWYgTU9WU1NybSA6IHNzZTEyX21vdmVfcm08RlIzMiwgZjMybWVtLCBsb2FkZjMyLCAibW92c3MiPiwgWFM7DQorDQorICBsZXQgQWRkZWRDb21wbGV4aXR5ID0gMjAgaW4NCisgICAgZGVmIE1PVlNEcm0gOiBzc2UxMl9tb3ZlX3JtPEZSNjQsIGY2NG1lbSwgbG9hZGY2NCwgIm1vdnNkIj4sIFhEOw0KK30NCisNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTUgaW4gew0KKy8vIEV4dHJhY3QgdGhlIGxvdyAzMi1iaXQgdmFsdWUgZnJvbSBvbmUgdmVjdG9yIGFuZCBpbnNlcnQgaXQgaW50byBhbm90aGVyLg0KK2RlZiA6IFBhdDwodjRmMzIgKG1vdmwgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSksDQorICAgICAgICAgIChNT1ZTU3JyICh2NGYzMiBWUjEyODokc3JjMSksDQorICAgICAgICAgICAgICAgICAgIChFWFRSQUNUX1NVQlJFRyAodjRmMzIgVlIxMjg6JHNyYzIpLCBzdWJfc3MpKT47DQorLy8gRXh0cmFjdCB0aGUgbG93IDY0LWJpdCB2YWx1ZSBmcm9tIG9uZSB2ZWN0b3IgYW5kIGluc2VydCBpdCBpbnRvIGFub3RoZXIuDQorZGVmIDogUGF0PCh2MmY2NCAobW92bCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKE1PVlNEcnIgKHYyZjY0IFZSMTI4OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHICh2MmY2NCBWUjEyODokc3JjMiksIHN1Yl9zZCkpPjsNCit9DQorDQorLy8gSW1wbGljaXRseSBwcm9tb3RlIGEgMzItYml0IHNjYWxhciB0byBhIHZlY3Rvci4NCitkZWYgOiBQYXQ8KHY0ZjMyIChzY2FsYXJfdG9fdmVjdG9yIEZSMzI6JHNyYykpLA0KKyAgICAgICAgICAoSU5TRVJUX1NVQlJFRyAodjRmMzIgKElNUExJQ0lUX0RFRikpLCBGUjMyOiRzcmMsIHN1Yl9zcyk+Ow0KKy8vIEltcGxpY2l0bHkgcHJvbW90ZSBhIDY0LWJpdCBzY2FsYXIgdG8gYSB2ZWN0b3IuDQorZGVmIDogUGF0PCh2MmY2NCAoc2NhbGFyX3RvX3ZlY3RvciBGUjY0OiRzcmMpKSwNCisgICAgICAgICAgKElOU0VSVF9TVUJSRUcgKHYyZjY0IChJTVBMSUNJVF9ERUYpKSwgRlI2NDokc3JjLCBzdWJfc2QpPjsNCisNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMjAgaW4gew0KKy8vIE1PVlNTcm0gemVyb3MgdGhlIGhpZ2ggcGFydHMgb2YgdGhlIHJlZ2lzdGVyOyByZXByZXNlbnQgdGhpcw0KKy8vIHdpdGggU1VCUkVHX1RPX1JFRy4NCitkZWYgOiBQYXQ8KHY0ZjMyIChYODZ2em1vdmwgKHY0ZjMyIChzY2FsYXJfdG9fdmVjdG9yIChsb2FkZjMyIGFkZHI6JHNyYykpKSkpLA0KKyAgICAgICAgICAoU1VCUkVHX1RPX1JFRyAoaTMyIDApLCAoTU9WU1NybSBhZGRyOiRzcmMpLCBzdWJfc3MpPjsNCitkZWYgOiBQYXQ8KHY0ZjMyIChzY2FsYXJfdG9fdmVjdG9yIChsb2FkZjMyIGFkZHI6JHNyYykpKSwNCisgICAgICAgICAgKFNVQlJFR19UT19SRUcgKGkzMiAwKSwgKE1PVlNTcm0gYWRkcjokc3JjKSwgc3ViX3NzKT47DQorZGVmIDogUGF0PCh2NGYzMiAoWDg2dnptb3ZsIChsb2FkdjRmMzIgYWRkcjokc3JjKSkpLA0KKyAgICAgICAgICAoU1VCUkVHX1RPX1JFRyAoaTMyIDApLCAoTU9WU1NybSBhZGRyOiRzcmMpLCBzdWJfc3MpPjsNCisvLyBNT1ZTRHJtIHplcm9zIHRoZSBoaWdoIHBhcnRzIG9mIHRoZSByZWdpc3RlcjsgcmVwcmVzZW50IHRoaXMNCisvLyB3aXRoIFNVQlJFR19UT19SRUcuDQorZGVmIDogUGF0PCh2MmY2NCAoWDg2dnptb3ZsICh2MmY2NCAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGY2NCBhZGRyOiRzcmMpKSkpKSwNCisgICAgICAgICAgKFNVQlJFR19UT19SRUcgKGk2NCAwKSwgKE1PVlNEcm0gYWRkcjokc3JjKSwgc3ViX3NkKT47DQorZGVmIDogUGF0PCh2MmY2NCAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGY2NCBhZGRyOiRzcmMpKSksDQorICAgICAgICAgIChTVUJSRUdfVE9fUkVHIChpNjQgMCksIChNT1ZTRHJtIGFkZHI6JHNyYyksIHN1Yl9zZCk+Ow0KK2RlZiA6IFBhdDwodjJmNjQgKFg4NnZ6bW92bCAobG9hZHYyZjY0IGFkZHI6JHNyYykpKSwNCisgICAgICAgICAgKFNVQlJFR19UT19SRUcgKGk2NCAwKSwgKE1PVlNEcm0gYWRkcjokc3JjKSwgc3ViX3NkKT47DQorZGVmIDogUGF0PCh2MmY2NCAoWDg2dnptb3ZsIChiY192MmY2NCAobG9hZHY0ZjMyIGFkZHI6JHNyYykpKSksDQorICAgICAgICAgIChTVUJSRUdfVE9fUkVHIChpNjQgMCksIChNT1ZTRHJtIGFkZHI6JHNyYyksIHN1Yl9zZCk+Ow0KK2RlZiA6IFBhdDwodjJmNjQgKFg4NnZ6bG9hZCBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFNVQlJFR19UT19SRUcgKGk2NCAwKSwgKE1PVlNEcm0gYWRkcjokc3JjKSwgc3ViX3NkKT47DQorfQ0KKw0KKy8vIFN0b3JlIHNjYWxhciB2YWx1ZSB0byBtZW1vcnkuDQorZGVmIE1PVlNTbXIgOiBTU0k8MHgxMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYzMm1lbTokZHN0LCBGUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJtb3Zzc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgRlIzMjokc3JjLCBhZGRyOiRkc3QpXT47DQorZGVmIE1PVlNEbXIgOiBTREk8MHgxMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGY2NG1lbTokZHN0LCBGUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJtb3ZzZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgRlI2NDokc3JjLCBhZGRyOiRkc3QpXT47DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2RlZiBWTU9WU1NtciA6IFNJPDB4MTEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBmMzJtZW06JGRzdCwgRlIzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAibW92c3NcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIEZSMzI6JHNyYywgYWRkcjokZHN0KV0+LCBYUywgVkVYOw0KK2RlZiBWTU9WU0RtciA6IFNJPDB4MTEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBmNjRtZW06JGRzdCwgRlI2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAibW92c2RcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICBbKHN0b3JlIEZSNjQ6JHNyYywgYWRkcjokZHN0KV0+LCBYRCwgVkVYOw0KK30NCisNCisvLyBFeHRyYWN0IGFuZCBzdG9yZS4NCitkZWYgOiBQYXQ8KHN0b3JlIChmMzIgKHZlY3Rvcl9leHRyYWN0ICh2NGYzMiBWUjEyODokc3JjKSwgKGlQVFIgMCkpKSwNCisgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNT1ZTU21yIGFkZHI6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHICh2NGYzMiBWUjEyODokc3JjKSwgc3ViX3NzKSk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKGY2NCAodmVjdG9yX2V4dHJhY3QgKHYyZjY0IFZSMTI4OiRzcmMpLCAoaVBUUiAwKSkpLA0KKyAgICAgICAgICAgICAgICAgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1PVlNEbXIgYWRkcjokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKHYyZjY0IFZSMTI4OiRzcmMpLCBzdWJfc2QpKT47DQorDQorLy8gTW92ZSBBbGlnbmVkL1VuYWxpZ25lZCBmbG9hdGluZyBwb2ludCB2YWx1ZXMNCittdWx0aWNsYXNzIHNzZTEyX21vdl9wYWNrZWQ8Yml0czw4PiBvcGMsIFJlZ2lzdGVyQ2xhc3MgUkMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsIFBhdEZyYWcgbGRfZnJhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgRG9tYWluIGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBJc1JlTWF0ZXJpYWxpemFibGUgPSAxPiB7DQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluDQorICBkZWYgcnIgOiBQSTxvcGMsIE1STVNyY1JlZywgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYyksDQorICAgICAgICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwgW10sIGQ+Ow0KK2xldCBjYW5Gb2xkQXNMb2FkID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gSXNSZU1hdGVyaWFsaXphYmxlIGluDQorICBkZWYgcm0gOiBQSTxvcGMsIE1STVNyY01lbSwgKG91dHMgUkM6JGRzdCksIChpbnMgeDg2bWVtb3A6JHNyYyksDQorICAgICAgICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgUkM6JGRzdCwgKGxkX2ZyYWcgYWRkcjokc3JjKSldLCBkPjsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2RlZm0gVk1PVkFQUyA6IHNzZTEyX21vdl9wYWNrZWQ8MHgyOCwgVlIxMjgsIGYxMjhtZW0sIGFsaWduZWRsb2FkdjRmMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmFwcyIsIFNTRVBhY2tlZFNpbmdsZT4sIFZFWDsNCitkZWZtIFZNT1ZBUEQgOiBzc2UxMl9tb3ZfcGFja2VkPDB4MjgsIFZSMTI4LCBmMTI4bWVtLCBhbGlnbmVkbG9hZHYyZjY0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZhcGQiLCBTU0VQYWNrZWREb3VibGU+LCBPcFNpemUsIFZFWDsNCitkZWZtIFZNT1ZVUFMgOiBzc2UxMl9tb3ZfcGFja2VkPDB4MTAsIFZSMTI4LCBmMTI4bWVtLCBsb2FkdjRmMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnVwcyIsIFNTRVBhY2tlZFNpbmdsZT4sIFZFWDsNCitkZWZtIFZNT1ZVUEQgOiBzc2UxMl9tb3ZfcGFja2VkPDB4MTAsIFZSMTI4LCBmMTI4bWVtLCBsb2FkdjJmNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnVwZCIsIFNTRVBhY2tlZERvdWJsZSwgMD4sIE9wU2l6ZSwgVkVYOw0KKw0KK2RlZm0gVk1PVkFQU1kgOiBzc2UxMl9tb3ZfcGFja2VkPDB4MjgsIFZSMjU2LCBmMjU2bWVtLCBhbGlnbmVkbG9hZHY4ZjMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZhcHMiLCBTU0VQYWNrZWRTaW5nbGU+LCBWRVg7DQorZGVmbSBWTU9WQVBEWSA6IHNzZTEyX21vdl9wYWNrZWQ8MHgyOCwgVlIyNTYsIGYyNTZtZW0sIGFsaWduZWRsb2FkdjRmNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmFwZCIsIFNTRVBhY2tlZERvdWJsZT4sIE9wU2l6ZSwgVkVYOw0KK2RlZm0gVk1PVlVQU1kgOiBzc2UxMl9tb3ZfcGFja2VkPDB4MTAsIFZSMjU2LCBmMjU2bWVtLCBsb2FkdjhmMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnVwcyIsIFNTRVBhY2tlZFNpbmdsZT4sIFZFWDsNCitkZWZtIFZNT1ZVUERZIDogc3NlMTJfbW92X3BhY2tlZDwweDEwLCBWUjI1NiwgZjI1Nm1lbSwgbG9hZHY0ZjY0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3Z1cGQiLCBTU0VQYWNrZWREb3VibGUsIDA+LCBPcFNpemUsIFZFWDsNCit9DQorZGVmbSBNT1ZBUFMgOiBzc2UxMl9tb3ZfcGFja2VkPDB4MjgsIFZSMTI4LCBmMTI4bWVtLCBhbGlnbmVkbG9hZHY0ZjMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZhcHMiLCBTU0VQYWNrZWRTaW5nbGU+LCBUQjsNCitkZWZtIE1PVkFQRCA6IHNzZTEyX21vdl9wYWNrZWQ8MHgyOCwgVlIxMjgsIGYxMjhtZW0sIGFsaWduZWRsb2FkdjJmNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmFwZCIsIFNTRVBhY2tlZERvdWJsZT4sIFRCLCBPcFNpemU7DQorZGVmbSBNT1ZVUFMgOiBzc2UxMl9tb3ZfcGFja2VkPDB4MTAsIFZSMTI4LCBmMTI4bWVtLCBsb2FkdjRmMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnVwcyIsIFNTRVBhY2tlZFNpbmdsZT4sIFRCOw0KK2RlZm0gTU9WVVBEIDogc3NlMTJfbW92X3BhY2tlZDwweDEwLCBWUjEyOCwgZjEyOG1lbSwgbG9hZHYyZjY0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3Z1cGQiLCBTU0VQYWNrZWREb3VibGUsIDA+LCBUQiwgT3BTaXplOw0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCitkZWYgVk1PVkFQU21yIDogVlBTSTwweDI5LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgZjEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdmFwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKGFsaWduZWRzdG9yZSAodjRmMzIgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCldPiwgVkVYOw0KK2RlZiBWTU9WQVBEbXIgOiBWUERJPDB4MjksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBmMTI4bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92YXBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoYWxpZ25lZHN0b3JlICh2MmY2NCBWUjEyODokc3JjKSwgYWRkcjokZHN0KV0+LCBWRVg7DQorZGVmIFZNT1ZVUFNtciA6IFZQU0k8MHgxMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z1cHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAodjRmMzIgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCldPiwgVkVYOw0KK2RlZiBWTU9WVVBEbXIgOiBWUERJPDB4MTEsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBmMTI4bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92dXBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKHYyZjY0IFZSMTI4OiRzcmMpLCBhZGRyOiRkc3QpXT4sIFZFWDsNCitkZWYgVk1PVkFQU1ltciA6IFZQU0k8MHgyOSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYyNTZtZW06JGRzdCwgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3ZhcHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkc3RvcmUgKHY4ZjMyIFZSMjU2OiRzcmMpLCBhZGRyOiRkc3QpXT4sIFZFWDsNCitkZWYgVk1PVkFQRFltciA6IFZQREk8MHgyOSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYyNTZtZW06JGRzdCwgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3ZhcGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkc3RvcmUgKHY0ZjY0IFZSMjU2OiRzcmMpLCBhZGRyOiRkc3QpXT4sIFZFWDsNCitkZWYgVk1PVlVQU1ltciA6IFZQU0k8MHgxMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYyNTZtZW06JGRzdCwgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z1cHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAodjhmMzIgVlIyNTY6JHNyYyksIGFkZHI6JGRzdCldPiwgVkVYOw0KK2RlZiBWTU9WVVBEWW1yIDogVlBESTwweDExLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgZjI1Nm1lbTokZHN0LCBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdnVwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlICh2NGY2NCBWUjI1Njokc3JjKSwgYWRkcjokZHN0KV0+LCBWRVg7DQorfQ0KKw0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfbG9hZHVfcHNfMjU2IGFkZHI6JHNyYyksIChWTU9WVVBTWXJtIGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfc3RvcmV1X3BzXzI1NiBhZGRyOiRkc3QsIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAoVk1PVlVQU1ltciBhZGRyOiRkc3QsIFZSMjU2OiRzcmMpPjsNCisNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X2xvYWR1X3BkXzI1NiBhZGRyOiRzcmMpLCAoVk1PVlVQRFlybSBhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X3N0b3JldV9wZF8yNTYgYWRkcjokZHN0LCBWUjI1Njokc3JjKSwNCisgICAgICAgICAgKFZNT1ZVUERZbXIgYWRkcjokZHN0LCBWUjI1Njokc3JjKT47DQorDQorZGVmIE1PVkFQU21yIDogUFNJPDB4MjksIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBmMTI4bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92YXBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoYWxpZ25lZHN0b3JlICh2NGYzMiBWUjEyODokc3JjKSwgYWRkcjokZHN0KV0+Ow0KK2RlZiBNT1ZBUERtciA6IFBESTwweDI5LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgZjEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdmFwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKGFsaWduZWRzdG9yZSAodjJmNjQgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCldPjsNCitkZWYgTU9WVVBTbXIgOiBQU0k8MHgxMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z1cHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAodjRmMzIgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCldPjsNCitkZWYgTU9WVVBEbXIgOiBQREk8MHgxMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3Z1cGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAodjJmNjQgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCldPjsNCisNCisvLyBJbnRyaW5zaWMgZm9ybXMgb2YgTU9WVVBTL0QgbG9hZCBhbmQgc3RvcmUNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorICBsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCisgIGRlZiBWTU9WVVBTcm1fSW50IDogVlBTSTwweDEwLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICJtb3Z1cHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlX2xvYWR1X3BzIGFkZHI6JHNyYykpXT4sIFZFWDsNCisgIGRlZiBWTU9WVVBEcm1fSW50IDogVlBESTwweDEwLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICJtb3Z1cGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9sb2FkdV9wZCBhZGRyOiRzcmMpKV0+LCBWRVg7DQorICBkZWYgVk1PVlVQU21yX0ludCA6IFZQU0k8MHgxMSwgTVJNRGVzdE1lbSwgKG91dHMpLA0KKyAgICAgICAgICAgICAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICJtb3Z1cHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgWyhpbnRfeDg2X3NzZV9zdG9yZXVfcHMgYWRkcjokZHN0LCBWUjEyODokc3JjKV0+LCBWRVg7DQorICBkZWYgVk1PVlVQRG1yX0ludCA6IFZQREk8MHgxMSwgTVJNRGVzdE1lbSwgKG91dHMpLA0KKyAgICAgICAgICAgICAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICJtb3Z1cGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgWyhpbnRfeDg2X3NzZTJfc3RvcmV1X3BkIGFkZHI6JGRzdCwgVlIxMjg6JHNyYyldPiwgVkVYOw0KK30NCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4NCitkZWYgTU9WVVBTcm1fSW50IDogUFNJPDB4MTAsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3Z1cHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZV9sb2FkdV9wcyBhZGRyOiRzcmMpKV0+Ow0KK2RlZiBNT1ZVUERybV9JbnQgOiBQREk8MHgxMCwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBmMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdnVwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9sb2FkdV9wZCBhZGRyOiRzcmMpKV0+Ow0KKw0KK2RlZiBNT1ZVUFNtcl9JbnQgOiBQU0k8MHgxMSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAibW92dXBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKGludF94ODZfc3NlX3N0b3JldV9wcyBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpXT47DQorZGVmIE1PVlVQRG1yX0ludCA6IFBESTwweDExLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgZjEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3Z1cGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoaW50X3g4Nl9zc2UyX3N0b3JldV9wZCBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpXT47DQorDQorLy8gTW92ZSBMb3cvSGlnaCBwYWNrZWQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzDQorbXVsdGljbGFzcyBzc2UxMl9tb3ZfaGlsb19wYWNrZWQ8Yml0czw4Pm9wYywgUmVnaXN0ZXJDbGFzcyBSQywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRGcmFnIG1vdl9mcmFnLCBzdHJpbmcgYmFzZV9vcGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFzbV9vcHI+IHsNCisgIGRlZiBQU3JtIDogUEk8b3BjLCBNUk1TcmNNZW0sDQorICAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIGY2NG1lbTokc3JjMiksDQorICAgICAgICAgIXN0cmNvbmNhdCghc3RyY29uY2F0KGJhc2Vfb3BjLCJzIiksIGFzbV9vcHIpLA0KKyAgICAgWyhzZXQgUkM6JGRzdCwNCisgICAgICAgKG1vdl9mcmFnIFJDOiRzcmMxLA0KKyAgICAgICAgICAgICAgKGJjX3Y0ZjMyICh2MmY2NCAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGY2NCBhZGRyOiRzcmMyKSkpKSkpXSwNCisgICAgICAgICAgICAgIFNTRVBhY2tlZFNpbmdsZT4sIFRCOw0KKw0KKyAgZGVmIFBEcm0gOiBQSTxvcGMsIE1STVNyY01lbSwNCisgICAgICAgICAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSwgZjY0bWVtOiRzcmMyKSwNCisgICAgICAgICAhc3RyY29uY2F0KCFzdHJjb25jYXQoYmFzZV9vcGMsImQiKSwgYXNtX29wciksDQorICAgICBbKHNldCBSQzokZHN0LCAodjJmNjQgKG1vdl9mcmFnIFJDOiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzY2FsYXJfdG9fdmVjdG9yIChsb2FkZjY0IGFkZHI6JHNyYzIpKSkpKV0sDQorICAgICAgICAgICAgICBTU0VQYWNrZWREb3VibGU+LCBUQiwgT3BTaXplOw0KK30NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgQWRkZWRDb21wbGV4aXR5ID0gMjAgaW4gew0KKyAgZGVmbSBWTU9WTCA6IHNzZTEyX21vdl9oaWxvX3BhY2tlZDwweDEyLCBWUjEyOCwgbW92bHAsICJtb3ZscCIsDQorICAgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9Ij4sIFZFWF80VjsNCisgIGRlZm0gVk1PVkggOiBzc2UxMl9tb3ZfaGlsb19wYWNrZWQ8MHgxNiwgVlIxMjgsIG1vdmxocHMsICJtb3ZocCIsDQorICAgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9Ij4sIFZFWF80VjsNCit9DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIsIEFkZGVkQ29tcGxleGl0eSA9IDIwIGluIHsNCisgIGRlZm0gTU9WTCA6IHNzZTEyX21vdl9oaWxvX3BhY2tlZDwweDEyLCBWUjEyOCwgbW92bHAsICJtb3ZscCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9Ij47DQorICBkZWZtIE1PVkggOiBzc2UxMl9tb3ZfaGlsb19wYWNrZWQ8MHgxNiwgVlIxMjgsIG1vdmxocHMsICJtb3ZocCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9Ij47DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCitkZWYgVk1PVkxQU21yIDogVlBTSTwweDEzLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgZjY0bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92bHBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGY2NCAodmVjdG9yX2V4dHJhY3QgKGJjX3YyZjY0ICh2NGYzMiBWUjEyODokc3JjKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlQVFIgMCkpKSwgYWRkcjokZHN0KV0+LCBWRVg7DQorZGVmIFZNT1ZMUERtciA6IFZQREk8MHgxMywgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGY2NG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdmxwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChmNjQgKHZlY3Rvcl9leHRyYWN0ICh2MmY2NCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaVBUUiAwKSkpLCBhZGRyOiRkc3QpXT4sIFZFWDsNCit9DQorZGVmIE1PVkxQU21yIDogUFNJPDB4MTMsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBmNjRtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3ZscHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoZjY0ICh2ZWN0b3JfZXh0cmFjdCAoYmNfdjJmNjQgKHY0ZjMyIFZSMTI4OiRzcmMpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaVBUUiAwKSkpLCBhZGRyOiRkc3QpXT47DQorZGVmIE1PVkxQRG1yIDogUERJPDB4MTMsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBmNjRtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3ZscGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoZjY0ICh2ZWN0b3JfZXh0cmFjdCAodjJmNjQgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlQVFIgMCkpKSwgYWRkcjokZHN0KV0+Ow0KKw0KKy8vIHYyZjY0IGV4dHJhY3QgZWxlbWVudCAxIGlzIGFsd2F5cyBjdXN0b20gbG93ZXJlZCB0byB1bnBhY2sgaGlnaCB0byBsb3cNCisvLyBhbmQgZXh0cmFjdCBlbGVtZW50IDAgc28gdGhlIG5vbi1zdG9yZSB2ZXJzaW9uIGlzbid0IHRvbyBob3JyaWJsZS4NCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorZGVmIFZNT1ZIUFNtciA6IFZQU0k8MHgxNywgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGY2NG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdmhwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChmNjQgKHZlY3Rvcl9leHRyYWN0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVucGNraCAoYmNfdjJmNjQgKHY0ZjMyIFZSMTI4OiRzcmMpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmRlZikpLCAoaVBUUiAwKSkpLCBhZGRyOiRkc3QpXT4sDQorICAgICAgICAgICAgICAgICAgIFZFWDsNCitkZWYgVk1PVkhQRG1yIDogVlBESTwweDE3LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgZjY0bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92aHBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGY2NCAodmVjdG9yX2V4dHJhY3QNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjJmNjQgKHVucGNraCBWUjEyODokc3JjLCAodW5kZWYpKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlQVFIgMCkpKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgICBWRVg7DQorfQ0KK2RlZiBNT1ZIUFNtciA6IFBTSTwweDE3LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgZjY0bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92aHBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGY2NCAodmVjdG9yX2V4dHJhY3QNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5wY2toIChiY192MmY2NCAodjRmMzIgVlIxMjg6JHNyYykpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuZGVmKSksIChpUFRSIDApKSksIGFkZHI6JGRzdCldPjsNCitkZWYgTU9WSFBEbXIgOiBQREk8MHgxNywgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGY2NG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdmhwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChmNjQgKHZlY3Rvcl9leHRyYWN0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyZjY0ICh1bnBja2ggVlIxMjg6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpUFRSIDApKSksIGFkZHI6JGRzdCldPjsNCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgQWRkZWRDb21wbGV4aXR5ID0gMjAgaW4gew0KKyAgZGVmIFZNT1ZMSFBTcnIgOiBWUFNJPDB4MTYsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92bGhwc1x0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAodjRmMzIgKG1vdmxocHMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCisgIGRlZiBWTU9WSExQU3JyIDogVlBTSTwweDEyLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmhscHNcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIChtb3ZobHBzIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorfQ0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiLCBBZGRlZENvbXBsZXhpdHkgPSAyMCBpbiB7DQorICBkZWYgTU9WTEhQU3JyIDogUFNJPDB4MTYsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92bGhwc1x0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgKHY0ZjMyIChtb3ZsaHBzIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpKV0+Ow0KKyAgZGVmIE1PVkhMUFNyciA6IFBTSTwweDEyLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmhscHNcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2NGYzMiAobW92aGxwcyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSldPjsNCit9DQorDQorZGVmIDogUGF0PChtb3ZsaHBzIFZSMTI4OiRzcmMxLCAoYmNfdjRpMzIgKHYyaTY0IChYODZ2emxvYWQgYWRkcjokc3JjMikpKSksDQorICAgICAgICAgIChNT1ZIUFNybSAodjRpMzIgVlIxMjg6JHNyYzEpLCBhZGRyOiRzcmMyKT47DQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDIwIGluIHsNCisgIGRlZiA6IFBhdDwodjRmMzIgKG1vdmRkdXAgVlIxMjg6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAgIChNT1ZMSFBTcnIgKHY0ZjMyIFZSMTI4OiRzcmMpLCAodjRmMzIgVlIxMjg6JHNyYykpPjsNCisgIGRlZiA6IFBhdDwodjJpNjQgKG1vdmRkdXAgVlIxMjg6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAgIChNT1ZMSFBTcnIgKHYyaTY0IFZSMTI4OiRzcmMpLCAodjJpNjQgVlIxMjg6JHNyYykpPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0UgMSAmIDIgLSBDb252ZXJzaW9uIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorbXVsdGljbGFzcyBzc2UxMl9jdnRfczxiaXRzPDg+IG9wYywgUmVnaXN0ZXJDbGFzcyBTcmNSQywgUmVnaXN0ZXJDbGFzcyBEc3RSQywNCisgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgT3BOb2RlLCBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLCBQYXRGcmFnIGxkX2ZyYWcsDQorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFzbT4gew0KKyAgZGVmIHJyIDogU0k8b3BjLCBNUk1TcmNSZWcsIChvdXRzIERzdFJDOiRkc3QpLCAoaW5zIFNyY1JDOiRzcmMpLCBhc20sDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRHN0UkM6JGRzdCwgKE9wTm9kZSBTcmNSQzokc3JjKSldPjsNCisgIGRlZiBybSA6IFNJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBEc3RSQzokZHN0KSwgKGlucyB4ODZtZW1vcDokc3JjKSwgYXNtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IERzdFJDOiRkc3QsIChPcE5vZGUgKGxkX2ZyYWcgYWRkcjokc3JjKSkpXT47DQorfQ0KKw0KK211bHRpY2xhc3Mgc3NlMTJfY3Z0X3NfbnA8Yml0czw4PiBvcGMsIFJlZ2lzdGVyQ2xhc3MgU3JjUkMsIFJlZ2lzdGVyQ2xhc3MgRHN0UkMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLCBzdHJpbmcgYXNtPiB7DQorICBkZWYgcnIgOiBTSTxvcGMsIE1STVNyY1JlZywgKG91dHMgRHN0UkM6JGRzdCksIChpbnMgU3JjUkM6JHNyYyksIGFzbSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbXT47DQorICBkZWYgcm0gOiBTSTxvcGMsIE1STVNyY01lbSwgKG91dHMgRHN0UkM6JGRzdCksIChpbnMgeDg2bWVtb3A6JHNyYyksIGFzbSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbXT47DQorfQ0KKw0KK211bHRpY2xhc3Mgc3NlMTJfY3Z0X3A8Yml0czw4PiBvcGMsIFJlZ2lzdGVyQ2xhc3MgU3JjUkMsIFJlZ2lzdGVyQ2xhc3MgRHN0UkMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFNETm9kZSBPcE5vZGUsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsIFBhdEZyYWcgbGRfZnJhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgRG9tYWluIGQ+IHsNCisgIGRlZiByciA6IFBJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBEc3RSQzokZHN0KSwgKGlucyBTcmNSQzokc3JjKSwgYXNtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IERzdFJDOiRkc3QsIChPcE5vZGUgU3JjUkM6JHNyYykpXSwgZD47DQorICBkZWYgcm0gOiBQSTxvcGMsIE1STVNyY01lbSwgKG91dHMgRHN0UkM6JGRzdCksIChpbnMgeDg2bWVtb3A6JHNyYyksIGFzbSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEc3RSQzokZHN0LCAoT3BOb2RlIChsZF9mcmFnIGFkZHI6JHNyYykpKV0sIGQ+Ow0KK30NCisNCittdWx0aWNsYXNzIHNzZTEyX3ZjdnRfYXZ4PGJpdHM8OD4gb3BjLCBSZWdpc3RlckNsYXNzIFNyY1JDLCBSZWdpc3RlckNsYXNzIERzdFJDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2TWVtT3BlcmFuZCB4ODZtZW1vcCwgc3RyaW5nIGFzbT4gew0KKyAgZGVmIHJyIDogU0k8b3BjLCBNUk1TcmNSZWcsIChvdXRzIERzdFJDOiRkc3QpLCAoaW5zIERzdFJDOiRzcmMxLCBTcmNSQzokc3JjKSwNCisgICAgICAgICAgICAgICFzdHJjb25jYXQoYXNtLCJcdHskc3JjLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyY30iKSwgW10+Ow0KKyAgZGVmIHJtIDogU0k8b3BjLCBNUk1TcmNNZW0sIChvdXRzIERzdFJDOiRkc3QpLA0KKyAgICAgICAgICAgICAgKGlucyBEc3RSQzokc3JjMSwgeDg2bWVtb3A6JHNyYyksDQorICAgICAgICAgICAgICAhc3RyY29uY2F0KGFzbSwiXHR7JHNyYywgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmN9IiksIFtdPjsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2RlZm0gVkNWVFRTUzJTSSAgIDogc3NlMTJfY3Z0X3M8MHgyQywgRlIzMiwgR1IzMiwgZnBfdG9fc2ludCwgZjMybWVtLCBsb2FkZjMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRzczJzaVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iPiwgWFMsIFZFWDsNCitkZWZtIFZDVlRUU1MyU0k2NCA6IHNzZTEyX2N2dF9zPDB4MkMsIEZSMzIsIEdSNjQsIGZwX3RvX3NpbnQsIGYzMm1lbSwgbG9hZGYzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0c3Myc2lcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9Ij4sIFhTLCBWRVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfVzsNCitkZWZtIFZDVlRUU0QyU0kgICA6IHNzZTEyX2N2dF9zPDB4MkMsIEZSNjQsIEdSMzIsIGZwX3RvX3NpbnQsIGY2NG1lbSwgbG9hZGY2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0c2Qyc2lcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9Ij4sIFhELCBWRVg7DQorZGVmbSBWQ1ZUVFNEMlNJNjQgOiBzc2UxMl9jdnRfczwweDJDLCBGUjY0LCBHUjY0LCBmcF90b19zaW50LCBmNjRtZW0sIGxvYWRmNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0dHNkMnNpXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSI+LCBYRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWCwgVkVYX1c7DQorDQorLy8gVGhlIGFzc2VtYmxlciBjYW4gcmVjb2duaXplIHJyIDY0LWJpdCBpbnN0cnVjdGlvbnMgYnkgc2VlaW5nIGEgcnh4DQorLy8gcmVnaXN0ZXIsIGJ1dCB0aGUgc2FtZSBpc24ndCB0cnVlIHdoZW4gb25seSB1c2luZyBtZW1vcnkgb3BlcmFuZHMsDQorLy8gcHJvdmlkZSBvdGhlciBhc3NlbWJseSAibCIgYW5kICJxIiBmb3JtcyB0byBhZGRyZXNzIHRoaXMgZXhwbGljaXRseQ0KKy8vIHdoZXJlIGFwcHJvcHJpYXRlIHRvIGRvIHNvLg0KK2RlZm0gVkNWVFNJMlNTICAgOiBzc2UxMl92Y3Z0X2F2eDwweDJBLCBHUjMyLCBGUjMyLCBpMzJtZW0sICJjdnRzaTJzcyI+LCBYUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KK2RlZm0gVkNWVFNJMlNTNjQgOiBzc2UxMl92Y3Z0X2F2eDwweDJBLCBHUjY0LCBGUjMyLCBpNjRtZW0sICJjdnRzaTJzc3txfSI+LCBYUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWLCBWRVhfVzsNCitkZWZtIFZDVlRTSTJTRCAgIDogc3NlMTJfdmN2dF9hdng8MHgyQSwgR1IzMiwgRlI2NCwgaTMybWVtLCAiY3Z0c2kyc2QiPiwgWEQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCitkZWZtIFZDVlRTSTJTREwgIDogc3NlMTJfdmN2dF9hdng8MHgyQSwgR1IzMiwgRlI2NCwgaTMybWVtLCAiY3Z0c2kyc2R7bH0iPiwgWEQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCitkZWZtIFZDVlRTSTJTRDY0IDogc3NlMTJfdmN2dF9hdng8MHgyQSwgR1I2NCwgRlI2NCwgaTY0bWVtLCAiY3Z0c2kyc2R7cX0iPiwgWEQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF80ViwgVkVYX1c7DQorfQ0KKw0KK2RlZm0gQ1ZUVFNTMlNJIDogc3NlMTJfY3Z0X3M8MHgyQywgRlIzMiwgR1IzMiwgZnBfdG9fc2ludCwgZjMybWVtLCBsb2FkZjMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3Z0dHNzMnNpXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSI+LCBYUzsNCitkZWZtIENWVFRTUzJTSTY0IDogc3NlMTJfY3Z0X3M8MHgyQywgRlIzMiwgR1I2NCwgZnBfdG9fc2ludCwgZjMybWVtLCBsb2FkZjMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3Z0dHNzMnNpe3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSI+LCBYUywgUkVYX1c7DQorZGVmbSBDVlRUU0QyU0kgOiBzc2UxMl9jdnRfczwweDJDLCBGUjY0LCBHUjMyLCBmcF90b19zaW50LCBmNjRtZW0sIGxvYWRmNjQsDQorICAgICAgICAgICAgICAgICAgICAgICJjdnR0c2Qyc2lcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9Ij4sIFhEOw0KK2RlZm0gQ1ZUVFNEMlNJNjQgOiBzc2UxMl9jdnRfczwweDJDLCBGUjY0LCBHUjY0LCBmcF90b19zaW50LCBmNjRtZW0sIGxvYWRmNjQsDQorICAgICAgICAgICAgICAgICAgICAgICJjdnR0c2Qyc2l7cX1cdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9Ij4sIFhELCBSRVhfVzsNCitkZWZtIENWVFNJMlNTICA6IHNzZTEyX2N2dF9zPDB4MkEsIEdSMzIsIEZSMzIsIHNpbnRfdG9fZnAsIGkzMm1lbSwgbG9hZGkzMiwNCisgICAgICAgICAgICAgICAgICAgICAgImN2dHNpMnNzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSI+LCBYUzsNCitkZWZtIENWVFNJMlNTNjQgOiBzc2UxMl9jdnRfczwweDJBLCBHUjY0LCBGUjMyLCBzaW50X3RvX2ZwLCBpNjRtZW0sIGxvYWRpNjQsDQorICAgICAgICAgICAgICAgICAgICAgICJjdnRzaTJzc3txfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iPiwgWFMsIFJFWF9XOw0KK2RlZm0gQ1ZUU0kyU0QgIDogc3NlMTJfY3Z0X3M8MHgyQSwgR1IzMiwgRlI2NCwgc2ludF90b19mcCwgaTMybWVtLCBsb2FkaTMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3Z0c2kyc2RcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9Ij4sIFhEOw0KK2RlZm0gQ1ZUU0kyU0Q2NCA6IHNzZTEyX2N2dF9zPDB4MkEsIEdSNjQsIEZSNjQsIHNpbnRfdG9fZnAsIGk2NG1lbSwgbG9hZGk2NCwNCisgICAgICAgICAgICAgICAgICAgICAgImN2dHNpMnNke3F9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSI+LCBYRCwgUkVYX1c7DQorDQorLy8gQ29udmVyc2lvbiBJbnN0cnVjdGlvbnMgSW50cmluc2ljcyAtIE1hdGNoIGludHJpbnNpY3Mgd2hpY2ggZXhwZWN0IE1NDQorLy8gYW5kL29yIFhNTSBvcGVyYW5kKHMpLg0KK211bHRpY2xhc3Mgc3NlMTJfY3Z0X3BpbnQ8Yml0czw4PiBvcGMsIFJlZ2lzdGVyQ2xhc3MgU3JjUkMsIFJlZ2lzdGVyQ2xhc3MgRHN0UkMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnQsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsIFBhdEZyYWcgbGRfZnJhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFzbSwgRG9tYWluIGQ+IHsNCisgIGRlZiByciA6IFBJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBEc3RSQzokZHN0KSwgKGlucyBTcmNSQzokc3JjKSwgYXNtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IERzdFJDOiRkc3QsIChJbnQgU3JjUkM6JHNyYykpXSwgZD47DQorICBkZWYgcm0gOiBQSTxvcGMsIE1STVNyY01lbSwgKG91dHMgRHN0UkM6JGRzdCksIChpbnMgeDg2bWVtb3A6JHNyYyksIGFzbSwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBEc3RSQzokZHN0LCAoSW50IChsZF9mcmFnIGFkZHI6JHNyYykpKV0sIGQ+Ow0KK30NCisNCittdWx0aWNsYXNzIHNzZTEyX2N2dF9zaW50PGJpdHM8OD4gb3BjLCBSZWdpc3RlckNsYXNzIFNyY1JDLCBSZWdpc3RlckNsYXNzIERzdFJDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50LCBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLCBQYXRGcmFnIGxkX2ZyYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhc20+IHsNCisgIGRlZiByciA6IFNJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBEc3RSQzokZHN0KSwgKGlucyBTcmNSQzokc3JjKSwNCisgICAgICAgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgWyhzZXQgRHN0UkM6JGRzdCwgKEludCBTcmNSQzokc3JjKSldPjsNCisgIGRlZiBybSA6IFNJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBEc3RSQzokZHN0KSwgKGlucyB4ODZtZW1vcDokc3JjKSwNCisgICAgICAgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgWyhzZXQgRHN0UkM6JGRzdCwgKEludCAobGRfZnJhZyBhZGRyOiRzcmMpKSldPjsNCit9DQorDQorbXVsdGljbGFzcyBzc2UxMl9jdnRfcGludF8zYWRkcjxiaXRzPDg+IG9wYywgUmVnaXN0ZXJDbGFzcyBTcmNSQywNCisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MgRHN0UkMsIEludHJpbnNpYyBJbnQsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsDQorICAgICAgICAgICAgICAgICAgICBQYXRGcmFnIGxkX2ZyYWcsIHN0cmluZyBhc20sIERvbWFpbiBkPiB7DQorICBkZWYgcnIgOiBQSTxvcGMsIE1STVNyY1JlZywgKG91dHMgRHN0UkM6JGRzdCksIChpbnMgRHN0UkM6JHNyYzEsIFNyY1JDOiRzcmMyKSwNCisgICAgICAgICAgICAgIGFzbSwgWyhzZXQgRHN0UkM6JGRzdCwgKEludCBEc3RSQzokc3JjMSwgU3JjUkM6JHNyYzIpKV0sIGQ+Ow0KKyAgZGVmIHJtIDogUEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIERzdFJDOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAoaW5zIERzdFJDOiRzcmMxLCB4ODZtZW1vcDokc3JjMiksIGFzbSwNCisgICAgICAgICAgICAgIFsoc2V0IERzdFJDOiRkc3QsIChJbnQgRHN0UkM6JHNyYzEsIChsZF9mcmFnIGFkZHI6JHNyYzIpKSldLCBkPjsNCit9DQorDQorbXVsdGljbGFzcyBzc2UxMl9jdnRfc2ludF8zYWRkcjxiaXRzPDg+IG9wYywgUmVnaXN0ZXJDbGFzcyBTcmNSQywNCisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MgRHN0UkMsIEludHJpbnNpYyBJbnQsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsDQorICAgICAgICAgICAgICAgICAgICBQYXRGcmFnIGxkX2ZyYWcsIHN0cmluZyBhc20sIGJpdCBJczJBZGRyID0gMT4gew0KKyAgZGVmIHJyIDogU0k8b3BjLCBNUk1TcmNSZWcsIChvdXRzIERzdFJDOiRkc3QpLCAoaW5zIERzdFJDOiRzcmMxLCBTcmNSQzokc3JjMiksDQorICAgICAgICAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgICAgICAgICBbKHNldCBEc3RSQzokZHN0LCAoSW50IERzdFJDOiRzcmMxLCBTcmNSQzokc3JjMikpXT47DQorICBkZWYgcm0gOiBTSTxvcGMsIE1STVNyY01lbSwgKG91dHMgRHN0UkM6JGRzdCksDQorICAgICAgICAgICAgICAoaW5zIERzdFJDOiRzcmMxLCB4ODZtZW1vcDokc3JjMiksDQorICAgICAgICAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgICAgICAgICBbKHNldCBEc3RSQzokZHN0LCAoSW50IERzdFJDOiRzcmMxLCAobGRfZnJhZyBhZGRyOiRzcmMyKSkpXT47DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCisgIGRlZm0gSW50X1ZDVlRTUzJTSSA6IHNzZTEyX2N2dF9zaW50PDB4MkQsIFZSMTI4LCBHUjMyLCBpbnRfeDg2X3NzZV9jdnRzczJzaSwNCisgICAgICAgICAgICAgICAgICAgICAgICBmMzJtZW0sIGxvYWQsICJjdnRzczJzaSI+LCBYUywgVkVYOw0KKyAgZGVmbSBJbnRfVkNWVFNTMlNJNjQgOiBzc2UxMl9jdnRfc2ludDwweDJELCBWUjEyOCwgR1I2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlX2N2dHNzMnNpNjQsIGYzMm1lbSwgbG9hZCwgImN2dHNzMnNpIj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBYUywgVkVYLCBWRVhfVzsNCisgIGRlZm0gSW50X1ZDVlRTRDJTSSA6IHNzZTEyX2N2dF9zaW50PDB4MkQsIFZSMTI4LCBHUjMyLCBpbnRfeDg2X3NzZTJfY3Z0c2Qyc2ksDQorICAgICAgICAgICAgICAgICAgICAgICAgZjEyOG1lbSwgbG9hZCwgImN2dHNkMnNpIj4sIFhELCBWRVg7DQorICBkZWZtIEludF9WQ1ZUU0QyU0k2NCA6IHNzZTEyX2N2dF9zaW50PDB4MkQsIFZSMTI4LCBHUjY0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9jdnRzZDJzaTY0LCBmMTI4bWVtLCBsb2FkLCAiY3Z0c2Qyc2kiPiwNCisgICAgICAgICAgICAgICAgICAgICAgICBYRCwgVkVYLCBWRVhfVzsNCisNCisgIC8vIEZJWE1FOiBUaGUgYXNtIG1hdGNoZXIgaGFzIGEgaGFjayB0byBpZ25vcmUgaW5zdHJ1Y3Rpb25zIHdpdGggX0ludCBhbmQgSW50Xw0KKyAgLy8gR2V0IHJpZCBvZiB0aGlzIGhhY2sgb3IgcmVuYW1lIHRoZSBpbnRyaW5zaWNzLCB0aGVyZSBhcmUgc2V2ZXJhbA0KKyAgLy8gaW50cnVjdGlvbnMgdGhhdCBvbmx5IG1hdGNoIHdpdGggdGhlIGludHJpbnNpYyBmb3JtLCB3aHkgY3JlYXRlIGR1cGxpY2F0ZXMNCisgIC8vIHRvIGxldCB0aGVtIGJlIHJlY29nbml6ZWQgYnkgdGhlIGFzc2VtYmxlcj8NCisgIGRlZm0gVkNWVFNEMlNJX2FsdCA6IHNzZTEyX2N2dF9zX25wPDB4MkQsIEZSNjQsIEdSMzIsIGY2NG1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0c2Qyc2lcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9Ij4sIFhELCBWRVg7DQorICBkZWZtIFZDVlRTRDJTSTY0ICAgOiBzc2UxMl9jdnRfc19ucDwweDJELCBGUjY0LCBHUjY0LCBmNjRtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgImN2dHNkMnNpXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSI+LCBYRCwgVkVYLCBWRVhfVzsNCit9DQorZGVmbSBJbnRfQ1ZUU1MyU0kgOiBzc2UxMl9jdnRfc2ludDwweDJELCBWUjEyOCwgR1IzMiwgaW50X3g4Nl9zc2VfY3Z0c3Myc2ksDQorICAgICAgICAgICAgICAgICAgICAgIGYzMm1lbSwgbG9hZCwgImN2dHNzMnNpIj4sIFhTOw0KK2RlZm0gSW50X0NWVFNTMlNJNjQgOiBzc2UxMl9jdnRfc2ludDwweDJELCBWUjEyOCwgR1I2NCwgaW50X3g4Nl9zc2VfY3Z0c3Myc2k2NCwNCisgICAgICAgICAgICAgICAgICAgICAgZjMybWVtLCBsb2FkLCAiY3Z0c3Myc2l7cX0iPiwgWFMsIFJFWF9XOw0KK2RlZm0gSW50X0NWVFNEMlNJIDogc3NlMTJfY3Z0X3NpbnQ8MHgyRCwgVlIxMjgsIEdSMzIsIGludF94ODZfc3NlMl9jdnRzZDJzaSwNCisgICAgICAgICAgICAgICAgICAgICAgZjEyOG1lbSwgbG9hZCwgImN2dHNkMnNpIj4sIFhEOw0KK2RlZm0gSW50X0NWVFNEMlNJNjQgOiBzc2UxMl9jdnRfc2ludDwweDJELCBWUjEyOCwgR1I2NCwgaW50X3g4Nl9zc2UyX2N2dHNkMnNpNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgZjEyOG1lbSwgbG9hZCwgImN2dHNkMnNpIj4sIFhELCBSRVhfVzsNCisNCitkZWZtIENWVFNEMlNJNjQgOiBzc2UxMl9jdnRfc19ucDwweDJELCBWUjEyOCwgR1I2NCwgZjY0bWVtLCAiY3Z0c2Qyc2l7cX0iPiwgWEQsDQorICAgICAgICAgICAgICAgICAgICAgICAgUkVYX1c7DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKyAgZGVmbSBJbnRfVkNWVFNJMlNTIDogc3NlMTJfY3Z0X3NpbnRfM2FkZHI8MHgyQSwgR1IzMiwgVlIxMjgsDQorICAgICAgICAgICAgaW50X3g4Nl9zc2VfY3Z0c2kyc3MsIGkzMm1lbSwgbG9hZGkzMiwgImN2dHNpMnNzIiwgMD4sIFhTLCBWRVhfNFY7DQorICBkZWZtIEludF9WQ1ZUU0kyU1M2NCA6IHNzZTEyX2N2dF9zaW50XzNhZGRyPDB4MkEsIEdSNjQsIFZSMTI4LA0KKyAgICAgICAgICAgIGludF94ODZfc3NlX2N2dHNpNjQyc3MsIGk2NG1lbSwgbG9hZGk2NCwgImN2dHNpMnNzIiwgMD4sIFhTLCBWRVhfNFYsDQorICAgICAgICAgICAgVkVYX1c7DQorICBkZWZtIEludF9WQ1ZUU0kyU0QgOiBzc2UxMl9jdnRfc2ludF8zYWRkcjwweDJBLCBHUjMyLCBWUjEyOCwNCisgICAgICAgICAgICBpbnRfeDg2X3NzZTJfY3Z0c2kyc2QsIGkzMm1lbSwgbG9hZGkzMiwgImN2dHNpMnNkIiwgMD4sIFhELCBWRVhfNFY7DQorICBkZWZtIEludF9WQ1ZUU0kyU0Q2NCA6IHNzZTEyX2N2dF9zaW50XzNhZGRyPDB4MkEsIEdSNjQsIFZSMTI4LA0KKyAgICAgICAgICAgIGludF94ODZfc3NlMl9jdnRzaTY0MnNkLCBpNjRtZW0sIGxvYWRpNjQsICJjdnRzaTJzZCIsIDA+LCBYRCwNCisgICAgICAgICAgICBWRVhfNFYsIFZFWF9XOw0KK30NCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorICBkZWZtIEludF9DVlRTSTJTUyA6IHNzZTEyX2N2dF9zaW50XzNhZGRyPDB4MkEsIEdSMzIsIFZSMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlX2N2dHNpMnNzLCBpMzJtZW0sIGxvYWRpMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgImN2dHNpMnNzIj4sIFhTOw0KKyAgZGVmbSBJbnRfQ1ZUU0kyU1M2NCA6IHNzZTEyX2N2dF9zaW50XzNhZGRyPDB4MkEsIEdSNjQsIFZSMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlX2N2dHNpNjQyc3MsIGk2NG1lbSwgbG9hZGk2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0c2kyc3N7cX0iPiwgWFMsIFJFWF9XOw0KKyAgZGVmbSBJbnRfQ1ZUU0kyU0QgOiBzc2UxMl9jdnRfc2ludF8zYWRkcjwweDJBLCBHUjMyLCBWUjEyOCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfY3Z0c2kyc2QsIGkzMm1lbSwgbG9hZGkzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0c2kyc2QiPiwgWEQ7DQorICBkZWZtIEludF9DVlRTSTJTRDY0IDogc3NlMTJfY3Z0X3NpbnRfM2FkZHI8MHgyQSwgR1I2NCwgVlIxMjgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc2UyX2N2dHNpNjQyc2QsIGk2NG1lbSwgbG9hZGk2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0c2kyc2QiPiwgWEQsIFJFWF9XOw0KK30NCisNCisvLyBJbnN0cnVjdGlvbnMgYmVsb3cgZG9uJ3QgaGF2ZSBhbiBBVlggZm9ybS4NCitkZWZtIEludF9DVlRQUzJQSSA6IHNzZTEyX2N2dF9waW50PDB4MkQsIFZSMTI4LCBWUjY0LCBpbnRfeDg2X3NzZV9jdnRwczJwaSwNCisgICAgICAgICAgICAgICAgICAgICAgZjY0bWVtLCBsb2FkLCAiY3Z0cHMycGlcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkU2luZ2xlPiwgVEI7DQorZGVmbSBJbnRfQ1ZUUEQyUEkgOiBzc2UxMl9jdnRfcGludDwweDJELCBWUjEyOCwgVlI2NCwgaW50X3g4Nl9zc2VfY3Z0cGQycGksDQorICAgICAgICAgICAgICAgICAgICAgIGYxMjhtZW0sIG1lbW9wLCAiY3Z0cGQycGlcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkRG91YmxlPiwgVEIsIE9wU2l6ZTsNCitkZWZtIEludF9DVlRUUFMyUEkgOiBzc2UxMl9jdnRfcGludDwweDJDLCBWUjEyOCwgVlI2NCwgaW50X3g4Nl9zc2VfY3Z0dHBzMnBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgZjY0bWVtLCBsb2FkLCAiY3Z0dHBzMnBpXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBTU0VQYWNrZWRTaW5nbGU+LCBUQjsNCitkZWZtIEludF9DVlRUUEQyUEkgOiBzc2UxMl9jdnRfcGludDwweDJDLCBWUjEyOCwgVlI2NCwgaW50X3g4Nl9zc2VfY3Z0dHBkMnBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgZjEyOG1lbSwgbWVtb3AsICJjdnR0cGQycGlcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFNTRVBhY2tlZERvdWJsZT4sIFRCLCBPcFNpemU7DQorZGVmbSBJbnRfQ1ZUUEkyUEQgOiBzc2UxMl9jdnRfcGludDwweDJBLCBWUjY0LCBWUjEyOCwgaW50X3g4Nl9zc2VfY3Z0cGkycGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGk2NG1lbSwgbG9hZCwgImN2dHBpMnBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFNTRVBhY2tlZERvdWJsZT4sIFRCLCBPcFNpemU7DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KKyAgZGVmbSBJbnRfQ1ZUUEkyUFMgOiBzc2UxMl9jdnRfcGludF8zYWRkcjwweDJBLCBWUjY0LCBWUjEyOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc2VfY3Z0cGkycHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGk2NG1lbSwgbG9hZCwgImN2dHBpMnBzXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkU2luZ2xlPiwgVEI7DQorfQ0KKw0KKy8vLyBTU0UgMSBPbmx5DQorDQorLy8gQWxpYXNlcyBmb3IgaW50cmluc2ljcw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCitkZWZtIEludF9WQ1ZUVFNTMlNJIDogc3NlMTJfY3Z0X3NpbnQ8MHgyQywgVlIxMjgsIEdSMzIsIGludF94ODZfc3NlX2N2dHRzczJzaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMzJtZW0sIGxvYWQsICJjdnR0c3Myc2kiPiwgWFMsIFZFWDsNCitkZWZtIEludF9WQ1ZUVFNTMlNJNjQgOiBzc2UxMl9jdnRfc2ludDwweDJDLCBWUjEyOCwgR1I2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZV9jdnR0c3Myc2k2NCwgZjMybWVtLCBsb2FkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0c3Myc2kiPiwgWFMsIFZFWCwgVkVYX1c7DQorZGVmbSBJbnRfVkNWVFRTRDJTSSA6IHNzZTEyX2N2dF9zaW50PDB4MkMsIFZSMTI4LCBHUjMyLCBpbnRfeDg2X3NzZTJfY3Z0dHNkMnNpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYxMjhtZW0sIGxvYWQsICJjdnR0c3Myc2kiPiwgWEQsIFZFWDsNCitkZWZtIEludF9WQ1ZUVFNEMlNJNjQgOiBzc2UxMl9jdnRfc2ludDwweDJDLCBWUjEyOCwgR1I2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfY3Z0dHNkMnNpNjQsIGYxMjhtZW0sIGxvYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRzczJzaSI+LCBYRCwgVkVYLCBWRVhfVzsNCit9DQorZGVmbSBJbnRfQ1ZUVFNTMlNJIDogc3NlMTJfY3Z0X3NpbnQ8MHgyQywgVlIxMjgsIEdSMzIsIGludF94ODZfc3NlX2N2dHRzczJzaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMzJtZW0sIGxvYWQsICJjdnR0c3Myc2kiPiwgWFM7DQorZGVmbSBJbnRfQ1ZUVFNTMlNJNjQgOiBzc2UxMl9jdnRfc2ludDwweDJDLCBWUjEyOCwgR1I2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZV9jdnR0c3Myc2k2NCwgZjMybWVtLCBsb2FkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0c3Myc2l7cX0iPiwgWFMsIFJFWF9XOw0KK2RlZm0gSW50X0NWVFRTRDJTSSA6IHNzZTEyX2N2dF9zaW50PDB4MkMsIFZSMTI4LCBHUjMyLCBpbnRfeDg2X3NzZTJfY3Z0dHNkMnNpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYxMjhtZW0sIGxvYWQsICJjdnR0c3Myc2kiPiwgWEQ7DQorZGVmbSBJbnRfQ1ZUVFNEMlNJNjQgOiBzc2UxMl9jdnRfc2ludDwweDJDLCBWUjEyOCwgR1I2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfY3Z0dHNkMnNpNjQsIGYxMjhtZW0sIGxvYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRzczJzaXtxfSI+LCBYRCwgUkVYX1c7DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFBhdHRlcm4gPSBbXTxkYWc+IGluIHsNCitkZWZtIFZDVlRTUzJTSSAgIDogc3NlMTJfY3Z0X3M8MHgyRCwgRlIzMiwgR1IzMiwgdW5kZWYsIGYzMm1lbSwgbG9hZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHNzMnNpe2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSI+LCBYUywgVkVYOw0KK2RlZm0gVkNWVFNTMlNJNjQgOiBzc2UxMl9jdnRfczwweDJELCBGUjMyLCBHUjY0LCB1bmRlZiwgZjMybWVtLCBsb2FkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0c3Myc2lcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9Ij4sIFhTLCBWRVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF9XOw0KK2RlZm0gVkNWVERRMlBTICAgOiBzc2UxMl9jdnRfcDwweDVCLCBWUjEyOCwgVlIxMjgsIHVuZGVmLCBpMTI4bWVtLCBsb2FkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0ZHEycHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkU2luZ2xlPiwgVEIsIFZFWDsNCitkZWZtIFZDVlREUTJQU1kgIDogc3NlMTJfY3Z0X3A8MHg1QiwgVlIyNTYsIFZSMjU2LCB1bmRlZiwgaTI1Nm1lbSwgbG9hZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dGRxMnBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTRVBhY2tlZFNpbmdsZT4sIFRCLCBWRVg7DQorfQ0KK2xldCBQYXR0ZXJuID0gW108ZGFnPiBpbiB7DQorZGVmbSBDVlRTUzJTSSA6IHNzZTEyX2N2dF9zPDB4MkQsIEZSMzIsIEdSMzIsIHVuZGVmLCBmMzJtZW0sIGxvYWQgLypkdW1teSovLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHNzMnNpe2x9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSI+LCBYUzsNCitkZWZtIENWVFNTMlNJNjQgOiBzc2UxMl9jdnRfczwweDJELCBGUjMyLCBHUjY0LCB1bmRlZiwgZjMybWVtLCBsb2FkIC8qZHVtbXkqLywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnRzczJzaXtxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iPiwgWFMsIFJFWF9XOw0KK2RlZm0gQ1ZURFEyUFMgOiBzc2UxMl9jdnRfcDwweDVCLCBWUjEyOCwgVlIxMjgsIHVuZGVmLCBpMTI4bWVtLCBsb2FkIC8qZHVtbXkqLywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dGRxMnBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTRVBhY2tlZFNpbmdsZT4sIFRCOyAvKiBQRCBTU0UzIGZvcm0gaXMgYXZhaWFibGUgKi8NCit9DQorDQorLy8vIFNTRSAyIE9ubHkNCisNCisvLyBDb252ZXJ0IHNjYWxhciBkb3VibGUgdG8gc2NhbGFyIHNpbmdsZQ0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCitkZWYgVkNWVFNEMlNTcnIgIDogVlNESTwweDVBLCBNUk1TcmNSZWcsIChvdXRzIEZSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAoaW5zIEZSNjQ6JHNyYzEsIEZSNjQ6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3Z0c2Qyc3NcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsIFtdPiwNCisgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KK2RlZiBWQ1ZUU0QyU1NybSAgOiBJPDB4NUEsIE1STVNyY01lbSwgKG91dHMgRlIzMjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgIChpbnMgRlI2NDokc3JjMSwgZjY0bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZjdnRzZDJzc1x0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgW10+LCBYRCwgUmVxdWlyZXM8W0hhc0FWWCwgT3B0Rm9yU2l6ZV0+LCBWRVhfNFY7DQorfQ0KK2RlZiBDVlRTRDJTU3JyICA6IFNESTwweDVBLCBNUk1TcmNSZWcsIChvdXRzIEZSMzI6JGRzdCksIChpbnMgRlI2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImN2dHNkMnNzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZSMzI6JGRzdCwgKGZyb3VuZCBGUjY0OiRzcmMpKV0+Ow0KK2RlZiBDVlRTRDJTU3JtICA6IEk8MHg1QSwgTVJNU3JjTWVtLCAob3V0cyBGUjMyOiRkc3QpLCAoaW5zIGY2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImN2dHNkMnNzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEZSMzI6JGRzdCwgKGZyb3VuZCAobG9hZGY2NCBhZGRyOiRzcmMpKSldPiwgWEQsDQorICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTIsIE9wdEZvclNpemVdPjsNCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbg0KK2RlZm0gSW50X1ZDVlRTRDJTUzogc3NlMTJfY3Z0X3NpbnRfM2FkZHI8MHg1QSwgVlIxMjgsIFZSMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfY3Z0c2Qyc3MsIGY2NG1lbSwgbG9hZCwgImN2dHNkMnNzIiwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgIFhTLCBWRVhfNFY7DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4NCitkZWZtIEludF9DVlRTRDJTUzogc3NlMTJfY3Z0X3NpbnRfM2FkZHI8MHg1QSwgVlIxMjgsIFZSMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfY3Z0c2Qyc3MsIGY2NG1lbSwgbG9hZCwgImN2dHNkMnNzIj4sIFhTOw0KKw0KKy8vIENvbnZlcnQgc2NhbGFyIHNpbmdsZSB0byBzY2FsYXIgZG91YmxlDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4geyAvLyBTU0UyIGluc3RydWN0aW9ucyB3aXRoIFhTIHByZWZpeA0KK2RlZiBWQ1ZUU1MyU0RyciA6IEk8MHg1QSwgTVJNU3JjUmVnLCAob3V0cyBGUjY0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBGUjMyOiRzcmMxLCBGUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJ2Y3Z0c3Myc2RcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbXT4sIFhTLCBSZXF1aXJlczxbSGFzQVZYXT4sIFZFWF80VjsNCitkZWYgVkNWVFNTMlNEcm0gOiBJPDB4NUEsIE1STVNyY01lbSwgKG91dHMgRlI2NDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgIChpbnMgRlIzMjokc3JjMSwgZjMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJ2Y3Z0c3Myc2RcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbXT4sIFhTLCBWRVhfNFYsIFJlcXVpcmVzPFtIYXNBVlgsIE9wdEZvclNpemVdPjsNCit9DQorZGVmIENWVFNTMlNEcnIgOiBJPDB4NUEsIE1STVNyY1JlZywgKG91dHMgRlI2NDokZHN0KSwgKGlucyBGUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAiY3Z0c3Myc2RcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgRlI2NDokZHN0LCAoZmV4dGVuZCBGUjMyOiRzcmMpKV0+LCBYUywNCisgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIENWVFNTMlNEcm0gOiBJPDB4NUEsIE1STVNyY01lbSwgKG91dHMgRlI2NDokZHN0KSwgKGlucyBmMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJjdnRzczJzZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBGUjY0OiRkc3QsIChleHRsb2FkZjMyIGFkZHI6JHNyYykpXT4sIFhTLA0KKyAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTIsIE9wdEZvclNpemVdPjsNCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorZGVmIEludF9WQ1ZUU1MyU0RycjogSTwweDVBLCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAidmN2dHNzMnNkXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRzczJzZCBWUjEyODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUjEyODokc3JjMikpXT4sIFhTLCBWRVhfNFYsDQorICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSGFzQVZYXT47DQorZGVmIEludF9WQ1ZUU1MyU0RybTogSTwweDVBLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBmMzJtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInZjdnRzczJzZFx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTJfY3Z0c3Myc2QgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgYWRkcjokc3JjMikpKV0+LCBYUywgVkVYXzRWLA0KKyAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc0FWWF0+Ow0KK30NCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7IC8vIFNTRTIgaW5zdHJ1Y3Rpb25zIHdpdGggWFMgcHJlZml4DQorZGVmIEludF9DVlRTUzJTRHJyOiBJPDB4NUEsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJjdnRzczJzZFx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dHNzMnNkIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSMTI4OiRzcmMyKSldPiwgWFMsDQorICAgICAgICAgICAgICAgICAgICBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KK2RlZiBJbnRfQ1ZUU1MyU0RybTogSTwweDVBLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBmMzJtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgImN2dHNzMnNkXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTJfY3Z0c3Myc2QgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgYWRkcjokc3JjMikpKV0+LCBYUywNCisgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorfQ0KKw0KK2RlZiA6IFBhdDwoZXh0bG9hZGYzMiBhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoQ1ZUU1MyU0RyciAoTU9WU1NybSBhZGRyOiRzcmMpKT4sDQorICAgICAgUmVxdWlyZXM8W0hhc1NTRTIsIE9wdEZvclNwZWVkXT47DQorDQorLy8gQ29udmVydCBkb3VibGV3b3JkIHRvIHBhY2tlZCBzaW5nbGUvZG91YmxlIGZwDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4geyAvLyBTU0UyIGluc3RydWN0aW9ucyB3aXRob3V0IE9wU2l6ZSBwcmVmaXgNCitkZWYgSW50X1ZDVlREUTJQU3JyIDogSTwweDVCLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInZjdnRkcTJwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRkcTJwcyBWUjEyODokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBUQiwgVkVYLCBSZXF1aXJlczxbSGFzQVZYXT47DQorZGVmIEludF9WQ1ZURFEyUFNybSA6IEk8MHg1QiwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAidmN2dGRxMnBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTJfY3Z0ZHEycHMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdGNvbnZlcnQgKG1lbW9wdjJpNjQgYWRkcjokc3JjKSkpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFRCLCBWRVgsIFJlcXVpcmVzPFtIYXNBVlhdPjsNCit9DQorZGVmIEludF9DVlREUTJQU3JyIDogSTwweDVCLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgImN2dGRxMnBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dGRxMnBzIFZSMTI4OiRzcmMpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFRCLCBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KK2RlZiBJbnRfQ1ZURFEyUFNybSA6IEk8MHg1QiwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3Z0ZHEycHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRkcTJwcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0Y29udmVydCAobWVtb3B2Mmk2NCBhZGRyOiRzcmMpKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgVEIsIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorLy8gRklYTUU6IHdoeSB0aGUgbm9uLWludHJpbnNpYyB2ZXJzaW9uIGlzIGRlc2NyaWJlZCBhcyBTU0UzPw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsgLy8gU1NFMiBpbnN0cnVjdGlvbnMgd2l0aCBYUyBwcmVmaXgNCitkZWYgSW50X1ZDVlREUTJQRHJyIDogSTwweEU2LCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInZjdnRkcTJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRkcTJwZCBWUjEyODokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBYUywgVkVYLCBSZXF1aXJlczxbSGFzQVZYXT47DQorZGVmIEludF9WQ1ZURFEyUERybSA6IEk8MHhFNiwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAidmN2dGRxMnBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dGRxMnBkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXRjb252ZXJ0IChtZW1vcHYyaTY0IGFkZHI6JHNyYykpKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBYUywgVkVYLCBSZXF1aXJlczxbSGFzQVZYXT47DQorfQ0KK2RlZiBJbnRfQ1ZURFEyUERyciA6IEk8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJjdnRkcTJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRkcTJwZCBWUjEyODokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBYUywgUmVxdWlyZXM8W0hhc1NTRTJdPjsNCitkZWYgSW50X0NWVERRMlBEcm0gOiBJPDB4RTYsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJjdnRkcTJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTJfY3Z0ZHEycGQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdGNvbnZlcnQgKG1lbW9wdjJpNjQgYWRkcjokc3JjKSkpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFhTLCBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KKw0KKw0KKy8vIENvbnZlcnQgcGFja2VkIHNpbmdsZS9kb3VibGUgZnAgdG8gZG91Ymxld29yZA0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCitkZWYgVkNWVFBTMkRRcnIgOiBWUERJPDB4NUIsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cHMyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorZGVmIFZDVlRQUzJEUXJtIDogVlBESTwweDVCLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cHMyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorZGVmIFZDVlRQUzJEUVlyciA6IFZQREk8MHg1QiwgTVJNU3JjUmVnLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cHMyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorZGVmIFZDVlRQUzJEUVlybSA6IFZQREk8MHg1QiwgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBmMjU2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJjdnRwczJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCit9DQorZGVmIENWVFBTMkRRcnIgOiBQREk8MHg1QiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAiY3Z0cHMyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2RlZiBDVlRQUzJEUXJtIDogUERJPDB4NUIsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAiY3Z0cHMyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCitkZWYgSW50X1ZDVlRQUzJEUXJyIDogVlBESTwweDVCLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJjdnRwczJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTJfY3Z0cHMyZHEgVlIxMjg6JHNyYykpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK2RlZiBJbnRfVkNWVFBTMkRRcm0gOiBWUERJPDB4NUIsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHBzMmRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTJfY3Z0cHMyZHENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1vcCBhZGRyOiRzcmMpKSldPiwgVkVYOw0KK30NCitkZWYgSW50X0NWVFBTMkRRcnIgOiBQREk8MHg1QiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cHMyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dHBzMmRxIFZSMTI4OiRzcmMpKV0+Ow0KK2RlZiBJbnRfQ1ZUUFMyRFFybSA6IFBESTwweDVCLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJjdnRwczJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dHBzMmRxDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtb3AgYWRkcjokc3JjKSkpXT47DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4geyAvLyBTU0UyIHBhY2tlZCBpbnN0cnVjdGlvbnMgd2l0aCBYRCBwcmVmaXgNCitkZWYgSW50X1ZDVlRQRDJEUXJyIDogSTwweEU2LCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInZjdnRwZDJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRwZDJkcSBWUjEyODokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBYRCwgVkVYLCBSZXF1aXJlczxbSGFzQVZYXT47DQorZGVmIEludF9WQ1ZUUEQyRFFybSA6IEk8MHhFNiwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBmMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInZjdnRwZDJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRwZDJkcQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1vcCBhZGRyOiRzcmMpKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBYRCwgVkVYLCBSZXF1aXJlczxbSGFzQVZYXT47DQorfQ0KK2RlZiBJbnRfQ1ZUUEQyRFFyciA6IEk8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJjdnRwZDJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRwZDJkcSBWUjEyODokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBYRCwgUmVxdWlyZXM8W0hhc1NTRTJdPjsNCitkZWYgSW50X0NWVFBEMkRRcm0gOiBJPDB4RTYsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJjdnRwZDJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRwZDJkcQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1vcCBhZGRyOiRzcmMpKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBYRCwgUmVxdWlyZXM8W0hhc1NTRTJdPjsNCisNCisNCisvLyBDb252ZXJ0IHdpdGggdHJ1bmNhdGlvbiBwYWNrZWQgc2luZ2xlL2RvdWJsZSBmcCB0byBkb3VibGV3b3JkDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4geyAvLyBTU0UyIHBhY2tlZCBpbnN0cnVjdGlvbnMgd2l0aCBYUyBwcmVmaXgNCitkZWYgVkNWVFRQUzJEUXJyIDogVlNTSTwweDVCLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3Z0dHBzMmRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYOw0KK2RlZiBWQ1ZUVFBTMkRRcm0gOiBWU1NJPDB4NUIsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImN2dHRwczJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCitkZWYgVkNWVFRQUzJEUVlyciA6IFZTU0k8MHg1QiwgTVJNU3JjUmVnLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImN2dHRwczJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCitkZWYgVkNWVFRQUzJEUVlybSA6IFZTU0k8MHg1QiwgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBmMjU2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3Z0dHBzMmRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYOw0KK30NCitkZWYgQ1ZUVFBTMkRRcnIgOiBTU0k8MHg1QiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImN2dHRwczJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorZGVmIENWVFRQUzJEUXJtIDogU1NJPDB4NUIsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgImN2dHRwczJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorDQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2RlZiBJbnRfVkNWVFRQUzJEUXJyIDogSTwweDVCLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJ2Y3Z0dHBzMmRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50X3g4Nl9zc2UyX2N2dHRwczJkcSBWUjEyODokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgWFMsIFZFWCwgUmVxdWlyZXM8W0hhc0FWWF0+Ow0KK2RlZiBJbnRfVkNWVFRQUzJEUXJtIDogSTwweDVCLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgInZjdnR0cHMyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dHRwczJkcQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtb3AgYWRkcjokc3JjKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFhTLCBWRVgsIFJlcXVpcmVzPFtIYXNBVlhdPjsNCit9DQorZGVmIEludF9DVlRUUFMyRFFyciA6IEk8MHg1QiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0dHBzMmRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50X3g4Nl9zc2UyX2N2dHRwczJkcSBWUjEyODokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgWFMsIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIEludF9DVlRUUFMyRFFybSA6IEk8MHg1QiwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBmMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0cHMyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dHRwczJkcQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtb3AgYWRkcjokc3JjKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFhTLCBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCitkZWYgSW50X1ZDVlRUUEQyRFFyciA6IFZQREk8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0cGQyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTJfY3Z0dHBkMmRxIFZSMTI4OiRzcmMpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK2RlZiBJbnRfVkNWVFRQRDJEUXJtIDogVlBESTwweEU2LCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBmMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRwZDJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnR0cGQyZHENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtb3AgYWRkcjokc3JjKSkpXT4sIFZFWDsNCit9DQorZGVmIEludF9DVlRUUEQyRFFyciA6IFBESTwweEU2LCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRwZDJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnR0cGQyZHEgVlIxMjg6JHNyYykpXT47DQorZGVmIEludF9DVlRUUEQyRFFybSA6IFBESTwweEU2LCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0cGQyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTJfY3Z0dHBkMmRxDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbW9wIGFkZHI6JHNyYykpKV0+Ow0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCisvLyBUaGUgYXNzZW1ibGVyIGNhbiByZWNvZ25pemUgcnIgMjU2LWJpdCBpbnN0cnVjdGlvbnMgYnkgc2VlaW5nIGEgeW1tDQorLy8gcmVnaXN0ZXIsIGJ1dCB0aGUgc2FtZSBpc24ndCB0cnVlIHdoZW4gdXNpbmcgbWVtb3J5IG9wZXJhbmRzIGluc3RlYWQuDQorLy8gUHJvdmlkZSBvdGhlciBhc3NlbWJseSByciBhbmQgcm0gZm9ybXMgdG8gYWRkcmVzcyB0aGlzIGV4cGxpY2l0bHkuDQorZGVmIFZDVlRUUEQyRFFyciA6IFZQREk8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0dHBkMmRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYOw0KK2RlZiBWQ1ZUVFBEMkRRWHJZciA6IFZQREk8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjdnR0cGQyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorDQorLy8gWE1NIG9ubHkNCitkZWYgVkNWVFRQRDJEUVhyciA6IFZQREk8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRwZDJkcXhcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorZGVmIFZDVlRUUEQyRFFYcm0gOiBWUERJPDB4RTYsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRwZDJkcXhcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorDQorLy8gWU1NIG9ubHkNCitkZWYgVkNWVFRQRDJEUVlyciA6IFZQREk8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRwZDJkcXlcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorZGVmIFZDVlRUUEQyRFFZcm0gOiBWUERJPDB4RTYsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjI1Nm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHRwZDJkcXlcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVgsIFZFWF9MOw0KK30NCisNCisvLyBDb252ZXJ0IHBhY2tlZCBzaW5nbGUgdG8gcGFja2VkIGRvdWJsZQ0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KKyAgICAgICAgICAgICAgICAgIC8vIFNTRTIgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgT3BTaXplIHByZWZpeA0KK2RlZiBWQ1ZUUFMyUERyciA6IEk8MHg1QSwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAidmN2dHBzMnBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYOw0KK2RlZiBWQ1ZUUFMyUERybSA6IEk8MHg1QSwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBmNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInZjdnRwczJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCitkZWYgVkNWVFBTMlBEWXJyIDogSTwweDVBLCBNUk1TcmNSZWcsIChvdXRzIFZSMjU2OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJ2Y3Z0cHMycGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorZGVmIFZDVlRQUzJQRFlybSA6IEk8MHg1QSwgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBmMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJ2Y3Z0cHMycGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorfQ0KK2RlZiBDVlRQUzJQRHJyIDogSTwweDVBLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgImN2dHBzMnBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorZGVmIENWVFBTMlBEcm0gOiBJPDB4NUEsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgImN2dHBzMnBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVEI7DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2RlZiBJbnRfVkNWVFBTMlBEcnIgOiBJPDB4NUEsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAidmN2dHBzMnBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dHBzMnBkIFZSMTI4OiRzcmMpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFZFWCwgUmVxdWlyZXM8W0hhc0FWWF0+Ow0KK2RlZiBJbnRfVkNWVFBTMlBEcm0gOiBJPDB4NUEsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInZjdnRwczJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRwczJwZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkIGFkZHI6JHNyYykpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFZFWCwgUmVxdWlyZXM8W0hhc0FWWF0+Ow0KK30NCitkZWYgSW50X0NWVFBTMlBEcnIgOiBJPDB4NUEsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cHMycGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTJfY3Z0cHMycGQgVlIxMjg6JHNyYykpXT4sDQorICAgICAgICAgICAgICAgICAgICAgVEIsIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIEludF9DVlRQUzJQRHJtIDogSTwweDVBLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGY2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJjdnRwczJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRwczJwZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkIGFkZHI6JHNyYykpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFRCLCBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KKw0KKy8vIENvbnZlcnQgcGFja2VkIGRvdWJsZSB0byBwYWNrZWQgc2luZ2xlDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKy8vIFRoZSBhc3NlbWJsZXIgY2FuIHJlY29nbml6ZSByciAyNTYtYml0IGluc3RydWN0aW9ucyBieSBzZWVpbmcgYSB5bW0NCisvLyByZWdpc3RlciwgYnV0IHRoZSBzYW1lIGlzbid0IHRydWUgd2hlbiB1c2luZyBtZW1vcnkgb3BlcmFuZHMgaW5zdGVhZC4NCisvLyBQcm92aWRlIG90aGVyIGFzc2VtYmx5IHJyIGFuZCBybSBmb3JtcyB0byBhZGRyZXNzIHRoaXMgZXhwbGljaXRseS4NCitkZWYgVkNWVFBEMlBTcnIgOiBWUERJPDB4NUEsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cGQycHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorZGVmIFZDVlRQRDJQU1hyWXIgOiBWUERJPDB4NUEsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJjdnRwZDJwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCisNCisvLyBYTU0gb25seQ0KK2RlZiBWQ1ZUUEQyUFNYcnIgOiBWUERJPDB4NUEsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgImN2dHBkMnBzeFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCitkZWYgVkNWVFBEMlBTWHJtIDogVlBESTwweDVBLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgImN2dHBkMnBzeFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCisNCisvLyBZTU0gb25seQ0KK2RlZiBWQ1ZUUEQyUFNZcnIgOiBWUERJPDB4NUEsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgImN2dHBkMnBzeVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCitkZWYgVkNWVFBEMlBTWXJtIDogVlBESTwweDVBLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYyNTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgImN2dHBkMnBzeVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWCwgVkVYX0w7DQorfQ0KK2RlZiBDVlRQRDJQU3JyIDogUERJPDB4NUEsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgImN2dHBkMnBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCitkZWYgQ1ZUUEQyUFNybSA6IFBESTwweDVBLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgImN2dHBkMnBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCisNCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorZGVmIEludF9WQ1ZUUEQyUFNyciA6IFZQREk8MHg1QSwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImN2dHBkMnBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9jdnRwZDJwcyBWUjEyODokc3JjKSldPjsNCitkZWYgSW50X1ZDVlRQRDJQU3JtIDogVlBESTwweDVBLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJjdnRwZDJwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dHBkMnBzDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtb3AgYWRkcjokc3JjKSkpXT47DQorfQ0KK2RlZiBJbnRfQ1ZUUEQyUFNyciA6IFBESTwweDVBLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cGQycHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dHBkMnBzIFZSMTI4OiRzcmMpKV0+Ow0KK2RlZiBJbnRfQ1ZUUEQyUFNybSA6IFBESTwweDVBLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJjdnRwZDJwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2UyX2N2dHBkMnBzDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtb3AgYWRkcjokc3JjKSkpXT47DQorDQorLy8gQVZYIDI1Ni1iaXQgcmVnaXN0ZXIgY29udmVyc2lvbiBpbnRyaW5zaWNzDQorLy8gRklYTUU6IE1pZ3JhdGUgU1NFIGNvbnZlcnNpb24gaW50cmluc2ljcyBtYXRjaGluZyB0byB1c2UgcGF0dGVybnMgYXMgYmVsb3cNCisvLyB3aGVuZXZlciBwb3NzaWJsZSB0byBhdm9pZCBkZWNsYXJpbmcgdHdvIHZlcnNpb25zIG9mIGVhY2ggb25lLg0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfY3Z0ZHEyX3BzXzI1NiBWUjI1Njokc3JjKSwNCisgICAgICAgICAgKFZDVlREUTJQU1lyciBWUjI1Njokc3JjKT47DQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF9jdnRkcTJfcHNfMjU2IChtZW1vcHY4aTMyIGFkZHI6JHNyYykpLA0KKyAgICAgICAgICAoVkNWVERRMlBTWXJtIGFkZHI6JHNyYyk+Ow0KKw0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfY3Z0X3BkMl9wc18yNTYgVlIyNTY6JHNyYyksDQorICAgICAgICAgIChWQ1ZUUEQyUFNZcnIgVlIyNTY6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfY3Z0X3BkMl9wc18yNTYgKG1lbW9wdjRmNjQgYWRkcjokc3JjKSksDQorICAgICAgICAgIChWQ1ZUUEQyUFNZcm0gYWRkcjokc3JjKT47DQorDQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF9jdnRfcHMyZHFfMjU2IFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAoVkNWVFBTMkRRWXJyIFZSMjU2OiRzcmMpPjsNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X2N2dF9wczJkcV8yNTYgKG1lbW9wdjhmMzIgYWRkcjokc3JjKSksDQorICAgICAgICAgIChWQ1ZUUFMyRFFZcm0gYWRkcjokc3JjKT47DQorDQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF9jdnRfcHMyX3BkXzI1NiBWUjEyODokc3JjKSwNCisgICAgICAgICAgKFZDVlRQUzJQRFlyciBWUjEyODokc3JjKT47DQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF9jdnRfcHMyX3BkXzI1NiAobWVtb3B2NGYzMiBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFZDVlRQUzJQRFlybSBhZGRyOiRzcmMpPjsNCisNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X2N2dHRfcGQyZHFfMjU2IFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAoVkNWVFRQRDJEUVlyciBWUjI1Njokc3JjKT47DQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF9jdnR0X3BkMmRxXzI1NiAobWVtb3B2NGY2NCBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFZDVlRUUEQyRFFZcm0gYWRkcjokc3JjKT47DQorDQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF9jdnR0X3BzMmRxXzI1NiBWUjI1Njokc3JjKSwNCisgICAgICAgICAgKFZDVlRUUFMyRFFZcnIgVlIyNTY6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfY3Z0dF9wczJkcV8yNTYgKG1lbW9wdjhmMzIgYWRkcjokc3JjKSksDQorICAgICAgICAgIChWQ1ZUVFBTMkRRWXJtIGFkZHI6JHNyYyk+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFIDEgJiAyIC0gQ29tcGFyZSBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIHNzZTEyX2NtcF9zY2FsYXIgLSBzc2UgMSAmIDIgY29tcGFyZSBzY2FsYXIgaW5zdHJ1Y3Rpb25zDQorbXVsdGljbGFzcyBzc2UxMl9jbXBfc2NhbGFyPFJlZ2lzdGVyQ2xhc3MgUkMsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhc20sIHN0cmluZyBhc21fYWx0PiB7DQorICBkZWYgcnIgOiBTSWk4PDB4QzIsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIFJDOiRkc3QpLCAoaW5zIFJDOiRzcmMxLCBSQzokc3JjLCBTU0VDQzokY2MpLA0KKyAgICAgICAgICAgICAgICAgICAgYXNtLCBbXT47DQorICBsZXQgbWF5TG9hZCA9IDEgaW4NCisgIGRlZiBybSA6IFNJaTg8MHhDMiwgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIHg4Nm1lbW9wOiRzcmMsIFNTRUNDOiRjYyksDQorICAgICAgICAgICAgICAgICAgICBhc20sIFtdPjsNCisgIC8vIEFjY2VwdCBleHBsaWNpdCBpbW1lZGlhdGUgYXJndW1lbnQgZm9ybSBpbnN0ZWFkIG9mIGNvbXBhcmlzb24gY29kZS4NCisgIGxldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCisgICAgZGVmIHJyX2FsdCA6IFNJaTg8MHhDMiwgTVJNU3JjUmVnLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIFJDOiRkc3QpLCAoaW5zIFJDOiRzcmMxLCBSQzokc3JjLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgYXNtX2FsdCwgW10+Ow0KKyAgICBsZXQgbWF5TG9hZCA9IDEgaW4NCisgICAgZGVmIHJtX2FsdCA6IFNJaTg8MHhDMiwgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgIChvdXRzIFJDOiRkc3QpLCAoaW5zIFJDOiRzcmMxLCB4ODZtZW1vcDokc3JjLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgYXNtX2FsdCwgW10+Ow0KKyAgfQ0KK30NCisNCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEsIGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKyAgZGVmbSBWQ01QU1MgIDogc3NlMTJfY21wX3NjYWxhcjxGUjMyLCBmMzJtZW0sDQorICAgICAgICAgICAgICAgICAgImNtcCR7Y2N9c3NcdHskc3JjLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICJjbXBzc1x0eyRzcmMyLCAkc3JjLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYywgJHNyYzJ9Ij4sDQorICAgICAgICAgICAgICAgICAgWFMsIFZFWF80VjsNCisgIGRlZm0gVkNNUFNEICA6IHNzZTEyX2NtcF9zY2FsYXI8RlI2NCwgZjY0bWVtLA0KKyAgICAgICAgICAgICAgICAgICJjbXAke2NjfXNkXHR7JHNyYywgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAiY21wc2RcdHskc3JjMiwgJHNyYywgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMsICRzcmMyfSI+LA0KKyAgICAgICAgICAgICAgICAgIFhELCBWRVhfNFY7DQorfQ0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiLCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorICBkZWZtIENNUFNTICA6IHNzZTEyX2NtcF9zY2FsYXI8RlIzMiwgZjMybWVtLA0KKyAgICAgICAgICAgICAgICAgICAgImNtcCR7Y2N9c3NcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICJjbXBzc1x0eyRzcmMyLCAkc3JjLCAkZHN0fCRkc3QsICRzcmMsICRzcmMyfSI+LCBYUzsNCisgIGRlZm0gQ01QU0QgIDogc3NlMTJfY21wX3NjYWxhcjxGUjY0LCBmNjRtZW0sDQorICAgICAgICAgICAgICAgICAgICAiY21wJHtjY31zZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgImNtcHNkXHR7JHNyYzIsICRzcmMsICRkc3R8JGRzdCwgJHNyYywgJHNyYzJ9Ij4sIFhEOw0KK30NCisNCittdWx0aWNsYXNzIHNzZTEyX2NtcF9zY2FsYXJfaW50PFJlZ2lzdGVyQ2xhc3MgUkMsIE9wZXJhbmQgbWVtb3ByLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV4UGF0dGVybiBtZW1fY3BhdCwgSW50cmluc2ljIEludCwgc3RyaW5nIGFzbT4gew0KKyAgZGVmIHJyIDogU0lpODwweEMyLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjLCBTU0VDQzokY2MpLCBhc20sDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEludCBWUjEyODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSMTI4OiRzcmMsIGltbTokY2MpKV0+Ow0KKyAgZGVmIHJtIDogU0lpODwweEMyLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBtZW1vcHI6JHNyYywgU1NFQ0M6JGNjKSwgYXNtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChJbnQgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbV9jcGF0OiRzcmMsIGltbTokY2MpKV0+Ow0KK30NCisNCisvLyBBbGlhc2VzIHRvIG1hdGNoIGludHJpbnNpY3Mgd2hpY2ggZXhwZWN0IFhNTSBvcGVyYW5kKHMpLg0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCisgIGRlZm0gSW50X1ZDTVBTUyAgOiBzc2UxMl9jbXBfc2NhbGFyX2ludDxWUjEyOCwgc3NtZW0sIHNzZV9sb2FkX2YzMiwgDQorICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZV9jbXBfc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAiY21wJHtjY31zc1x0eyRzcmMsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjfSI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgWFMsIFZFWF80VjsNCisgIGRlZm0gSW50X1ZDTVBTRCAgOiBzc2UxMl9jbXBfc2NhbGFyX2ludDxWUjEyOCwgc2RtZW0sIHNzZV9sb2FkX2Y2NCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9jbXBfc2QsDQorICAgICAgICAgICAgICAgICAgICAgICAiY21wJHtjY31zZFx0eyRzcmMsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjfSI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgWEQsIFZFWF80VjsNCit9DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KKyAgZGVmbSBJbnRfQ01QU1MgIDogc3NlMTJfY21wX3NjYWxhcl9pbnQ8VlIxMjgsIHNzbWVtLCBzc2VfbG9hZF9mMzIsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZV9jbXBfc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAiY21wJHtjY31zc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iPiwgWFM7DQorICBkZWZtIEludF9DTVBTRCAgOiBzc2UxMl9jbXBfc2NhbGFyX2ludDxWUjEyOCwgc2RtZW0sIHNzZV9sb2FkX2Y2NCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9jbXBfc2QsDQorICAgICAgICAgICAgICAgICAgICAgICAiY21wJHtjY31zZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iPiwgWEQ7DQorfQ0KKw0KKw0KKy8vIHNzZTEyX29yZF9jbXAgLSBVbm9yZGVyZWQvT3JkZXJlZCBzY2FsYXIgZnAgY29tcGFyZSBhbmQgc2V0IEVGTEFHUw0KK211bHRpY2xhc3Mgc3NlMTJfb3JkX2NtcDxiaXRzPDg+IG9wYywgUmVnaXN0ZXJDbGFzcyBSQywgU0ROb2RlIE9wTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUeXBlIHZ0LCBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRGcmFnIGxkX2ZyYWcsIHN0cmluZyBPcGNvZGVTdHIsIERvbWFpbiBkPiB7DQorICBkZWYgcnI6IFBJPG9wYywgTVJNU3JjUmVnLCAob3V0cyksIChpbnMgUkM6JHNyYzEsIFJDOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoT3BOb2RlICh2dCBSQzokc3JjMSksIFJDOiRzcmMyKSldLCBkPjsNCisgIGRlZiBybTogUEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzKSwgKGlucyBSQzokc3JjMSwgeDg2bWVtb3A6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChPcE5vZGUgKHZ0IFJDOiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxkX2ZyYWcgYWRkcjokc3JjMikpKV0sIGQ+Ow0KK30NCisNCitsZXQgRGVmcyA9IFtFRkxBR1NdIGluIHsNCisgIGxldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCisgICAgZGVmbSBWVUNPTUlTUyA6IHNzZTEyX29yZF9jbXA8MHgyRSwgRlIzMiwgWDg2Y21wLCBmMzIsIGYzMm1lbSwgbG9hZGYzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidWNvbWlzcyIsIFNTRVBhY2tlZFNpbmdsZT4sIFZFWDsNCisgICAgZGVmbSBWVUNPTUlTRCA6IHNzZTEyX29yZF9jbXA8MHgyRSwgRlI2NCwgWDg2Y21wLCBmNjQsIGY2NG1lbSwgbG9hZGY2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidWNvbWlzZCIsIFNTRVBhY2tlZERvdWJsZT4sIE9wU2l6ZSwgVkVYOw0KKyAgICBsZXQgUGF0dGVybiA9IFtdPGRhZz4gaW4gew0KKyAgICAgIGRlZm0gVkNPTUlTUyAgOiBzc2UxMl9vcmRfY21wPDB4MkYsIFZSMTI4LCB1bmRlZiwgdjRmMzIsIGYxMjhtZW0sIGxvYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29taXNzIiwgU1NFUGFja2VkU2luZ2xlPiwgVkVYOw0KKyAgICAgIGRlZm0gVkNPTUlTRCAgOiBzc2UxMl9vcmRfY21wPDB4MkYsIFZSMTI4LCB1bmRlZiwgdjJmNjQsIGYxMjhtZW0sIGxvYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29taXNkIiwgU1NFUGFja2VkRG91YmxlPiwgT3BTaXplLCBWRVg7DQorICAgIH0NCisNCisgICAgZGVmbSBJbnRfVlVDT01JU1MgIDogc3NlMTJfb3JkX2NtcDwweDJFLCBWUjEyOCwgWDg2dWNvbWksIHY0ZjMyLCBmMTI4bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQsICJ1Y29taXNzIiwgU1NFUGFja2VkU2luZ2xlPiwgVkVYOw0KKyAgICBkZWZtIEludF9WVUNPTUlTRCAgOiBzc2UxMl9vcmRfY21wPDB4MkUsIFZSMTI4LCBYODZ1Y29taSwgdjJmNjQsIGYxMjhtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCwgInVjb21pc2QiLCBTU0VQYWNrZWREb3VibGU+LCBPcFNpemUsIFZFWDsNCisNCisgICAgZGVmbSBJbnRfVkNPTUlTUyAgOiBzc2UxMl9vcmRfY21wPDB4MkYsIFZSMTI4LCBYODZjb21pLCB2NGYzMiwgZjEyOG1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLCAiY29taXNzIiwgU1NFUGFja2VkU2luZ2xlPiwgVkVYOw0KKyAgICBkZWZtIEludF9WQ09NSVNEICA6IHNzZTEyX29yZF9jbXA8MHgyRiwgVlIxMjgsIFg4NmNvbWksIHYyZjY0LCBmMTI4bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQsICJjb21pc2QiLCBTU0VQYWNrZWREb3VibGU+LCBPcFNpemUsIFZFWDsNCisgIH0NCisgIGRlZm0gVUNPTUlTUyAgOiBzc2UxMl9vcmRfY21wPDB4MkUsIEZSMzIsIFg4NmNtcCwgZjMyLCBmMzJtZW0sIGxvYWRmMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1Y29taXNzIiwgU1NFUGFja2VkU2luZ2xlPiwgVEI7DQorICBkZWZtIFVDT01JU0QgIDogc3NlMTJfb3JkX2NtcDwweDJFLCBGUjY0LCBYODZjbXAsIGY2NCwgZjY0bWVtLCBsb2FkZjY0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidWNvbWlzZCIsIFNTRVBhY2tlZERvdWJsZT4sIFRCLCBPcFNpemU7DQorDQorICBsZXQgUGF0dGVybiA9IFtdPGRhZz4gaW4gew0KKyAgICBkZWZtIENPTUlTUyAgOiBzc2UxMl9vcmRfY21wPDB4MkYsIFZSMTI4LCB1bmRlZiwgdjRmMzIsIGYxMjhtZW0sIGxvYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbWlzcyIsIFNTRVBhY2tlZFNpbmdsZT4sIFRCOw0KKyAgICBkZWZtIENPTUlTRCAgOiBzc2UxMl9vcmRfY21wPDB4MkYsIFZSMTI4LCB1bmRlZiwgdjJmNjQsIGYxMjhtZW0sIGxvYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbWlzZCIsIFNTRVBhY2tlZERvdWJsZT4sIFRCLCBPcFNpemU7DQorICB9DQorDQorICBkZWZtIEludF9VQ09NSVNTICA6IHNzZTEyX29yZF9jbXA8MHgyRSwgVlIxMjgsIFg4NnVjb21pLCB2NGYzMiwgZjEyOG1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLCAidWNvbWlzcyIsIFNTRVBhY2tlZFNpbmdsZT4sIFRCOw0KKyAgZGVmbSBJbnRfVUNPTUlTRCAgOiBzc2UxMl9vcmRfY21wPDB4MkUsIFZSMTI4LCBYODZ1Y29taSwgdjJmNjQsIGYxMjhtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCwgInVjb21pc2QiLCBTU0VQYWNrZWREb3VibGU+LCBUQiwgT3BTaXplOw0KKw0KKyAgZGVmbSBJbnRfQ09NSVNTICA6IHNzZTEyX29yZF9jbXA8MHgyRiwgVlIxMjgsIFg4NmNvbWksIHY0ZjMyLCBmMTI4bWVtLCBsb2FkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29taXNzIiwgU1NFUGFja2VkU2luZ2xlPiwgVEI7DQorICBkZWZtIEludF9DT01JU0QgIDogc3NlMTJfb3JkX2NtcDwweDJGLCBWUjEyOCwgWDg2Y29taSwgdjJmNjQsIGYxMjhtZW0sIGxvYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21pc2QiLCBTU0VQYWNrZWREb3VibGU+LCBUQiwgT3BTaXplOw0KK30gLy8gRGVmcyA9IFtFRkxBR1NdDQorDQorLy8gc3NlMTJfY21wX3BhY2tlZCAtIHNzZSAxICYgMiBjb21wYXJlZCBwYWNrZWQgaW5zdHJ1Y3Rpb25zDQorbXVsdGljbGFzcyBzc2UxMl9jbXBfcGFja2VkPFJlZ2lzdGVyQ2xhc3MgUkMsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnQsIHN0cmluZyBhc20sIHN0cmluZyBhc21fYWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21haW4gZD4gew0KKyAgZGVmIHJyaSA6IFBJaTg8MHhDMiwgTVJNU3JjUmVnLA0KKyAgICAgICAgICAgICAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSwgUkM6JHNyYywgU1NFQ0M6JGNjKSwgYXNtLA0KKyAgICAgICAgICAgICBbKHNldCBSQzokZHN0LCAoSW50IFJDOiRzcmMxLCBSQzokc3JjLCBpbW06JGNjKSldLCBkPjsNCisgIGRlZiBybWkgOiBQSWk4PDB4QzIsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIGYxMjhtZW06JHNyYywgU1NFQ0M6JGNjKSwgYXNtLA0KKyAgICAgICAgICAgICBbKHNldCBSQzokZHN0LCAoSW50IFJDOiRzcmMxLCAobWVtb3AgYWRkcjokc3JjKSwgaW1tOiRjYykpXSwgZD47DQorICAvLyBBY2NlcHQgZXhwbGljaXQgaW1tZWRpYXRlIGFyZ3VtZW50IGZvcm0gaW5zdGVhZCBvZiBjb21wYXJpc29uIGNvZGUuDQorICBsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorICAgIGRlZiBycmlfYWx0IDogUElpODwweEMyLCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIFJDOiRzcmMsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICBhc21fYWx0LCBbXSwgZD47DQorICAgIGRlZiBybWlfYWx0IDogUElpODwweEMyLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIGYxMjhtZW06JHNyYywgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgIGFzbV9hbHQsIFtdLCBkPjsNCisgIH0NCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKyAgZGVmbSBWQ01QUFMgOiBzc2UxMl9jbXBfcGFja2VkPFZSMTI4LCBmMTI4bWVtLCBpbnRfeDg2X3NzZV9jbXBfcHMsDQorICAgICAgICAgICAgICAgICAiY21wJHtjY31wc1x0eyRzcmMsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAiY21wcHNcdHskc3JjMiwgJHNyYywgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBTU0VQYWNrZWRTaW5nbGU+LCBWRVhfNFY7DQorICBkZWZtIFZDTVBQRCA6IHNzZTEyX2NtcF9wYWNrZWQ8VlIxMjgsIGYxMjhtZW0sIGludF94ODZfc3NlMl9jbXBfcGQsDQorICAgICAgICAgICAgICAgICAiY21wJHtjY31wZFx0eyRzcmMsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAiY21wcGRcdHskc3JjMiwgJHNyYywgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBTU0VQYWNrZWREb3VibGU+LCBPcFNpemUsIFZFWF80VjsNCisgIGRlZm0gVkNNUFBTWSA6IHNzZTEyX2NtcF9wYWNrZWQ8VlIyNTYsIGYyNTZtZW0sIGludF94ODZfYXZ4X2NtcF9wc18yNTYsDQorICAgICAgICAgICAgICAgICAiY21wJHtjY31wc1x0eyRzcmMsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAiY21wcHNcdHskc3JjMiwgJHNyYywgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICBTU0VQYWNrZWRTaW5nbGU+LCBWRVhfNFY7DQorICBkZWZtIFZDTVBQRFkgOiBzc2UxMl9jbXBfcGFja2VkPFZSMjU2LCBmMjU2bWVtLCBpbnRfeDg2X2F2eF9jbXBfcGRfMjU2LA0KKyAgICAgICAgICAgICAgICAgImNtcCR7Y2N9cGRcdHskc3JjLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgImNtcHBkXHR7JHNyYzIsICRzcmMsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgU1NFUGFja2VkRG91YmxlPiwgT3BTaXplLCBWRVhfNFY7DQorfQ0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCisgIGRlZm0gQ01QUFMgOiBzc2UxMl9jbXBfcGFja2VkPFZSMTI4LCBmMTI4bWVtLCBpbnRfeDg2X3NzZV9jbXBfcHMsDQorICAgICAgICAgICAgICAgICAiY21wJHtjY31wc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgImNtcHBzXHR7JHNyYzIsICRzcmMsICRkc3R8JGRzdCwgJHNyYywgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFNTRVBhY2tlZFNpbmdsZT4sIFRCOw0KKyAgZGVmbSBDTVBQRCA6IHNzZTEyX2NtcF9wYWNrZWQ8VlIxMjgsIGYxMjhtZW0sIGludF94ODZfc3NlMl9jbXBfcGQsDQorICAgICAgICAgICAgICAgICAiY21wJHtjY31wZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgImNtcHBkXHR7JHNyYzIsICRzcmMsICRkc3R8JGRzdCwgJHNyYywgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgIFNTRVBhY2tlZERvdWJsZT4sIFRCLCBPcFNpemU7DQorfQ0KKw0KK2RlZiA6IFBhdDwodjRpMzIgKFg4NmNtcHBzICh2NGYzMiBWUjEyODokc3JjMSksIFZSMTI4OiRzcmMyLCBpbW06JGNjKSksDQorICAgICAgICAgIChDTVBQU3JyaSAodjRmMzIgVlIxMjg6JHNyYzEpLCAodjRmMzIgVlIxMjg6JHNyYzIpLCBpbW06JGNjKT47DQorZGVmIDogUGF0PCh2NGkzMiAoWDg2Y21wcHMgKHY0ZjMyIFZSMTI4OiRzcmMxKSwgKG1lbW9wIGFkZHI6JHNyYzIpLCBpbW06JGNjKSksDQorICAgICAgICAgIChDTVBQU3JtaSAodjRmMzIgVlIxMjg6JHNyYzEpLCBhZGRyOiRzcmMyLCBpbW06JGNjKT47DQorZGVmIDogUGF0PCh2Mmk2NCAoWDg2Y21wcGQgKHYyZjY0IFZSMTI4OiRzcmMxKSwgVlIxMjg6JHNyYzIsIGltbTokY2MpKSwNCisgICAgICAgICAgKENNUFBEcnJpIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwgaW1tOiRjYyk+Ow0KK2RlZiA6IFBhdDwodjJpNjQgKFg4NmNtcHBkICh2MmY2NCBWUjEyODokc3JjMSksIChtZW1vcCBhZGRyOiRzcmMyKSwgaW1tOiRjYykpLA0KKyAgICAgICAgICAoQ01QUERybWkgVlIxMjg6JHNyYzEsIGFkZHI6JHNyYzIsIGltbTokY2MpPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRSAxICYgMiAtIFNodWZmbGUgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLy8gc3NlMTJfc2h1ZmZsZSAtIHNzZSAxICYgMiBzaHVmZmxlIGluc3RydWN0aW9ucw0KK211bHRpY2xhc3Mgc3NlMTJfc2h1ZmZsZTxSZWdpc3RlckNsYXNzIFJDLCBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgdnQsIHN0cmluZyBhc20sIFBhdEZyYWcgbWVtX2ZyYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIERvbWFpbiBkLCBiaXQgSXNDb252ZXJ0aWJsZVRvVGhyZWVBZGRyZXNzID0gMD4gew0KKyAgZGVmIHJtaSA6IFBJaTg8MHhDNiwgTVJNU3JjTWVtLCAob3V0cyBSQzokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgKGlucyBSQzokc3JjMSwgZjEyOG1lbTokc3JjMiwgaThpbW06JHNyYzMpLCBhc20sDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IFJDOiRkc3QsICh2dCAoc2h1ZnA6JHNyYzMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkM6JHNyYzEsIChtZW1fZnJhZyBhZGRyOiRzcmMyKSkpKV0sIGQ+Ow0KKyAgbGV0IGlzQ29udmVydGlibGVUb1RocmVlQWRkcmVzcyA9IElzQ29udmVydGlibGVUb1RocmVlQWRkcmVzcyBpbg0KKyAgICBkZWYgcnJpIDogUElpODwweEM2LCBNUk1TcmNSZWcsIChvdXRzIFJDOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAoaW5zIFJDOiRzcmMxLCBSQzokc3JjMiwgaThpbW06JHNyYzMpLCBhc20sDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IFJDOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dCAoc2h1ZnA6JHNyYzMgUkM6JHNyYzEsIFJDOiRzcmMyKSkpXSwgZD47DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCisgIGRlZm0gVlNIVUZQUyAgOiBzc2UxMl9zaHVmZmxlPFZSMTI4LCBmMTI4bWVtLCB2NGYzMiwNCisgICAgICAgICAgICAgInNodWZwc1x0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iLA0KKyAgICAgICAgICAgICBtZW1vcHY0ZjMyLCBTU0VQYWNrZWRTaW5nbGU+LCBWRVhfNFY7DQorICBkZWZtIFZTSFVGUFNZIDogc3NlMTJfc2h1ZmZsZTxWUjI1NiwgZjI1Nm1lbSwgdjhmMzIsDQorICAgICAgICAgICAgICJzaHVmcHNcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgICAgbWVtb3B2OGYzMiwgU1NFUGFja2VkU2luZ2xlPiwgVkVYXzRWOw0KKyAgZGVmbSBWU0hVRlBEICA6IHNzZTEyX3NodWZmbGU8VlIxMjgsIGYxMjhtZW0sIHYyZjY0LA0KKyAgICAgICAgICAgICAic2h1ZnBkXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICAgIG1lbW9wdjJmNjQsIFNTRVBhY2tlZERvdWJsZT4sIE9wU2l6ZSwgVkVYXzRWOw0KKyAgZGVmbSBWU0hVRlBEWSA6IHNzZTEyX3NodWZmbGU8VlIyNTYsIGYyNTZtZW0sIHY0ZjY0LA0KKyAgICAgICAgICAgICAic2h1ZnBkXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICAgIG1lbW9wdjRmNjQsIFNTRVBhY2tlZERvdWJsZT4sIE9wU2l6ZSwgVkVYXzRWOw0KK30NCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorICBkZWZtIFNIVUZQUyA6IHNzZTEyX3NodWZmbGU8VlIxMjgsIGYxMjhtZW0sIHY0ZjMyLA0KKyAgICAgICAgICAgICAgICAgICAgInNodWZwc1x0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgICAgICAgICAgIG1lbW9wdjRmMzIsIFNTRVBhY2tlZFNpbmdsZSwgMSAvKiBjdnQgdG8gcHNodWZkICovPiwNCisgICAgICAgICAgICAgICAgICAgIFRCOw0KKyAgZGVmbSBTSFVGUEQgOiBzc2UxMl9zaHVmZmxlPFZSMTI4LCBmMTI4bWVtLCB2MmY2NCwNCisgICAgICAgICAgICAgICAgICAgICJzaHVmcGRcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICAgICAgICAgICBtZW1vcHYyZjY0LCBTU0VQYWNrZWREb3VibGU+LCBUQiwgT3BTaXplOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRSAxICYgMiAtIFVucGFjayBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vLyBzc2UxMl91bnBhY2tfaW50ZXJsZWF2ZSAtIHNzZSAxICYgMiB1bnBhY2sgYW5kIGludGVybGVhdmUNCittdWx0aWNsYXNzIHNzZTEyX3VucGFja19pbnRlcmxlYXZlPGJpdHM8OD4gb3BjLCBQYXRGcmFnIE9wTm9kZSwgVmFsdWVUeXBlIHZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0RnJhZyBtZW1fZnJhZywgUmVnaXN0ZXJDbGFzcyBSQywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsIHN0cmluZyBhc20sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21haW4gZD4gew0KKyAgICBkZWYgcnIgOiBQSTxvcGMsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIFJDOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgYXNtLCBbKHNldCBSQzokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dCAoT3BOb2RlIFJDOiRzcmMxLCBSQzokc3JjMikpKV0sIGQ+Ow0KKyAgICBkZWYgcm0gOiBQSTxvcGMsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIHg4Nm1lbW9wOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgYXNtLCBbKHNldCBSQzokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dCAoT3BOb2RlIFJDOiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1fZnJhZyBhZGRyOiRzcmMyKSkpKV0sIGQ+Ow0KK30NCisNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTAgaW4gew0KKyAgbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKyAgICBkZWZtIFZVTlBDS0hQUzogc3NlMTJfdW5wYWNrX2ludGVybGVhdmU8MHgxNSwgdW5wY2toLCB2NGYzMiwgbWVtb3B2NGYzMiwNCisgICAgICAgICAgVlIxMjgsIGYxMjhtZW0sICJ1bnBja2hwc1x0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkU2luZ2xlPiwgVkVYXzRWOw0KKyAgICBkZWZtIFZVTlBDS0hQRDogc3NlMTJfdW5wYWNrX2ludGVybGVhdmU8MHgxNSwgdW5wY2toLCB2MmY2NCwgbWVtb3B2MmY2NCwNCisgICAgICAgICAgVlIxMjgsIGYxMjhtZW0sICJ1bnBja2hwZFx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkRG91YmxlPiwgT3BTaXplLCBWRVhfNFY7DQorICAgIGRlZm0gVlVOUENLTFBTOiBzc2UxMl91bnBhY2tfaW50ZXJsZWF2ZTwweDE0LCB1bnBja2wsIHY0ZjMyLCBtZW1vcHY0ZjMyLA0KKyAgICAgICAgICBWUjEyOCwgZjEyOG1lbSwgInVucGNrbHBzXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBTU0VQYWNrZWRTaW5nbGU+LCBWRVhfNFY7DQorICAgIGRlZm0gVlVOUENLTFBEOiBzc2UxMl91bnBhY2tfaW50ZXJsZWF2ZTwweDE0LCB1bnBja2wsIHYyZjY0LCBtZW1vcHYyZjY0LA0KKyAgICAgICAgICBWUjEyOCwgZjEyOG1lbSwgInVucGNrbHBkXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBTU0VQYWNrZWREb3VibGU+LCBPcFNpemUsIFZFWF80VjsNCisNCisgICAgZGVmbSBWVU5QQ0tIUFNZOiBzc2UxMl91bnBhY2tfaW50ZXJsZWF2ZTwweDE1LCB1bnBja2gsIHY4ZjMyLCBtZW1vcHY4ZjMyLA0KKyAgICAgICAgICBWUjI1NiwgZjI1Nm1lbSwgInVucGNraHBzXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBTU0VQYWNrZWRTaW5nbGU+LCBWRVhfNFY7DQorICAgIGRlZm0gVlVOUENLSFBEWTogc3NlMTJfdW5wYWNrX2ludGVybGVhdmU8MHgxNSwgdW5wY2toLCB2NGY2NCwgbWVtb3B2NGY2NCwNCisgICAgICAgICAgVlIyNTYsIGYyNTZtZW0sICJ1bnBja2hwZFx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkRG91YmxlPiwgT3BTaXplLCBWRVhfNFY7DQorICAgIGRlZm0gVlVOUENLTFBTWTogc3NlMTJfdW5wYWNrX2ludGVybGVhdmU8MHgxNCwgdW5wY2tsLCB2OGYzMiwgbWVtb3B2OGYzMiwNCisgICAgICAgICAgVlIyNTYsIGYyNTZtZW0sICJ1bnBja2xwc1x0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkU2luZ2xlPiwgVkVYXzRWOw0KKyAgICBkZWZtIFZVTlBDS0xQRFk6IHNzZTEyX3VucGFja19pbnRlcmxlYXZlPDB4MTQsIHVucGNrbCwgdjRmNjQsIG1lbW9wdjRmNjQsDQorICAgICAgICAgIFZSMjU2LCBmMjU2bWVtLCAidW5wY2tscGRcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFNTRVBhY2tlZERvdWJsZT4sIE9wU2l6ZSwgVkVYXzRWOw0KKyAgfQ0KKw0KKyAgbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KKyAgICBkZWZtIFVOUENLSFBTOiBzc2UxMl91bnBhY2tfaW50ZXJsZWF2ZTwweDE1LCB1bnBja2gsIHY0ZjMyLCBtZW1vcHY0ZjMyLA0KKyAgICAgICAgICBWUjEyOCwgZjEyOG1lbSwgInVucGNraHBzXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkU2luZ2xlPiwgVEI7DQorICAgIGRlZm0gVU5QQ0tIUEQ6IHNzZTEyX3VucGFja19pbnRlcmxlYXZlPDB4MTUsIHVucGNraCwgdjJmNjQsIG1lbW9wdjJmNjQsDQorICAgICAgICAgIFZSMTI4LCBmMTI4bWVtLCAidW5wY2tocGRcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBTU0VQYWNrZWREb3VibGU+LCBUQiwgT3BTaXplOw0KKyAgICBkZWZtIFVOUENLTFBTOiBzc2UxMl91bnBhY2tfaW50ZXJsZWF2ZTwweDE0LCB1bnBja2wsIHY0ZjMyLCBtZW1vcHY0ZjMyLA0KKyAgICAgICAgICBWUjEyOCwgZjEyOG1lbSwgInVucGNrbHBzXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgU1NFUGFja2VkU2luZ2xlPiwgVEI7DQorICAgIGRlZm0gVU5QQ0tMUEQ6IHNzZTEyX3VucGFja19pbnRlcmxlYXZlPDB4MTQsIHVucGNrbCwgdjJmNjQsIG1lbW9wdjJmNjQsDQorICAgICAgICAgIFZSMTI4LCBmMTI4bWVtLCAidW5wY2tscGRcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBTU0VQYWNrZWREb3VibGU+LCBUQiwgT3BTaXplOw0KKyAgfSAvLyBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiDQorfSAvLyBBZGRlZENvbXBsZXhpdHkNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRSAxICYgMiAtIEV4dHJhY3QgRmxvYXRpbmctUG9pbnQgU2lnbiBtYXNrDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLy8gc3NlMTJfZXh0cl9zaWduX21hc2sgLSBzc2UgMSAmIDIgdW5wYWNrIGFuZCBpbnRlcmxlYXZlDQorbXVsdGljbGFzcyBzc2UxMl9leHRyX3NpZ25fbWFzazxSZWdpc3RlckNsYXNzIFJDLCBJbnRyaW5zaWMgSW50LCBzdHJpbmcgYXNtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9tYWluIGQ+IHsNCisgIGRlZiByciA6IFBJPDB4NTAsIE1STVNyY1JlZywgKG91dHMgR1IzMjokZHN0KSwgKGlucyBSQzokc3JjKSwNCisgICAgICAgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKEludCBSQzokc3JjKSldLCBkPjsNCit9DQorDQorLy8gTWFzayBjcmVhdGlvbg0KK2RlZm0gTU9WTVNLUFMgOiBzc2UxMl9leHRyX3NpZ25fbWFzazxWUjEyOCwgaW50X3g4Nl9zc2VfbW92bXNrX3BzLCAibW92bXNrcHMiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0VQYWNrZWRTaW5nbGU+LCBUQjsNCitkZWZtIE1PVk1TS1BEIDogc3NlMTJfZXh0cl9zaWduX21hc2s8VlIxMjgsIGludF94ODZfc3NlMl9tb3Ztc2tfcGQsICJtb3Ztc2twZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTRVBhY2tlZERvdWJsZT4sIFRCLCBPcFNpemU7DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKyAgZGVmbSBWTU9WTVNLUFMgOiBzc2UxMl9leHRyX3NpZ25fbWFzazxWUjEyOCwgaW50X3g4Nl9zc2VfbW92bXNrX3BzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92bXNrcHMiLCBTU0VQYWNrZWRTaW5nbGU+LCBWRVg7DQorICBkZWZtIFZNT1ZNU0tQRCA6IHNzZTEyX2V4dHJfc2lnbl9tYXNrPFZSMTI4LCBpbnRfeDg2X3NzZTJfbW92bXNrX3BkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92bXNrcGQiLCBTU0VQYWNrZWREb3VibGU+LCBPcFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCisgIGRlZm0gVk1PVk1TS1BTWSA6IHNzZTEyX2V4dHJfc2lnbl9tYXNrPFZSMjU2LCBpbnRfeDg2X2F2eF9tb3Ztc2tfcHNfMjU2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92bXNrcHMiLCBTU0VQYWNrZWRTaW5nbGU+LCBWRVg7DQorICBkZWZtIFZNT1ZNU0tQRFkgOiBzc2UxMl9leHRyX3NpZ25fbWFzazxWUjI1NiwgaW50X3g4Nl9hdnhfbW92bXNrX3BkXzI1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdm1za3BkIiwgU1NFUGFja2VkRG91YmxlPiwgT3BTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorDQorICAvLyBBc3NlbWJsZXIgT25seQ0KKyAgZGVmIFZNT1ZNU0tQU3I2NHIgOiBQSTwweDUwLCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICJtb3Ztc2twc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXSwgU1NFUGFja2VkU2luZ2xlPiwgVkVYOw0KKyAgZGVmIFZNT1ZNU0tQRHI2NHIgOiBQSTwweDUwLCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICJtb3Ztc2twZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXSwgU1NFUGFja2VkRG91YmxlPiwgT3BTaXplLA0KKyAgICAgICAgICAgICBWRVg7DQorICBkZWYgVk1PVk1TS1BTWXI2NHIgOiBQSTwweDUwLCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICJtb3Ztc2twc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXSwgU1NFUGFja2VkU2luZ2xlPiwgVkVYOw0KKyAgZGVmIFZNT1ZNU0tQRFlyNjRyIDogUEk8MHg1MCwgTVJNU3JjUmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAgICAibW92bXNrcGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10sIFNTRVBhY2tlZERvdWJsZT4sIE9wU2l6ZSwNCisgICAgICAgICAgICAgVkVYOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRSAxICYgMiAtIE1pc2MgYWxpYXNpbmcgb2YgcGFja2VkIFNTRSAxICYgMiBpbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIEFsaWFzZXMgb2YgcGFja2VkIFNTRTEgJiBTU0UyIGluc3RydWN0aW9ucyBmb3Igc2NhbGFyIHVzZS4gVGhlc2UgYWxsIGhhdmUNCisvLyBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggJ0ZzJy4NCisNCisvLyBBbGlhcyBpbnN0cnVjdGlvbnMgdGhhdCBtYXAgZmxkMCB0byBweG9yIGZvciBzc2UuDQorbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEsIGlzQXNDaGVhcEFzQU1vdmUgPSAxLCBpc0NvZGVHZW5Pbmx5ID0gMSwNCisgICAgY2FuRm9sZEFzTG9hZCA9IDEgaW4gew0KKyAgLy8gRklYTUU6IFNldCBlbmNvZGluZyB0byBwc2V1ZG8hDQorZGVmIEZzRkxEMFNTIDogSTwweEVGLCBNUk1Jbml0UmVnLCAob3V0cyBGUjMyOiRkc3QpLCAoaW5zKSwgIiIsDQorICAgICAgICAgICAgICAgICBbKHNldCBGUjMyOiRkc3QsIGZwMzJpbW0wKV0+LA0KKyAgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTFdPiwgVEIsIE9wU2l6ZTsNCitkZWYgRnNGTEQwU0QgOiBJPDB4RUYsIE1STUluaXRSZWcsIChvdXRzIEZSNjQ6JGRzdCksIChpbnMpLCAiIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEZSNjQ6JGRzdCwgZnBpbW0wKV0+LA0KKyAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UyXT4sIFRCLCBPcFNpemU7DQorfQ0KKw0KKy8vIEFsaWFzIGluc3RydWN0aW9uIHRvIGRvIEZSMzIgb3IgRlI2NCByZWctdG8tcmVnIGNvcHkgdXNpbmcgbW92YXBzLiBVcHBlcg0KKy8vIGJpdHMgYXJlIGRpc3JlZ2FyZGVkLg0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorZGVmIEZzTU9WQVBTcnIgOiBQU0k8MHgyOCwgTVJNU3JjUmVnLCAob3V0cyBGUjMyOiRkc3QpLCAoaW5zIEZSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgIm1vdmFwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorZGVmIEZzTU9WQVBEcnIgOiBQREk8MHgyOCwgTVJNU3JjUmVnLCAob3V0cyBGUjY0OiRkc3QpLCAoaW5zIEZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgIm1vdmFwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorfQ0KKw0KKy8vIEFsaWFzIGluc3RydWN0aW9uIHRvIGxvYWQgRlIzMiBvciBGUjY0IGZyb20gZjEyOG1lbSB1c2luZyBtb3ZhcHMuIFVwcGVyDQorLy8gYml0cyBhcmUgZGlzcmVnYXJkZWQuDQorbGV0IGNhbkZvbGRBc0xvYWQgPSAxLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluIHsNCitkZWYgRnNNT1ZBUFNybSA6IFBTSTwweDI4LCBNUk1TcmNNZW0sIChvdXRzIEZSMzI6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAibW92YXBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlIzMjokZHN0LCAoYWxpZ25lZGxvYWRmc2YzMiBhZGRyOiRzcmMpKV0+Ow0KK2RlZiBGc01PVkFQRHJtIDogUERJPDB4MjgsIE1STVNyY01lbSwgKG91dHMgRlI2NDokZHN0KSwgKGlucyBmMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJtb3ZhcGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUjY0OiRkc3QsIChhbGlnbmVkbG9hZGZzZjY0IGFkZHI6JHNyYykpXT47DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFIDEgJiAyIC0gTG9naWNhbCBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vLyBzc2UxMl9mcF9hbGlhc19wYWNrX2xvZ2ljYWwgLSBTU0UgMSAmIDIgYWxpYXNlZCBwYWNrZWQgRlAgbG9naWNhbCBvcHMNCisvLy8NCittdWx0aWNsYXNzIHNzZTEyX2ZwX2FsaWFzX3BhY2tfbG9naWNhbDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgT3BOb2RlPiB7DQorICBsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorICAgIGRlZm0gViNOQU1FI1BTIDogc3NlMTJfZnBfcGFja2VkPG9wYywgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwcyIpLCBPcE5vZGUsDQorICAgICAgICAgICAgICAgIEZSMzIsIGYzMiwgZjEyOG1lbSwgbWVtb3Bmc2YzMiwgU1NFUGFja2VkU2luZ2xlLCAwPiwgVkVYXzRWOw0KKw0KKyAgICBkZWZtIFYjTkFNRSNQRCA6IHNzZTEyX2ZwX3BhY2tlZDxvcGMsICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicGQiKSwgT3BOb2RlLA0KKyAgICAgICAgICBGUjY0LCBmNjQsIGYxMjhtZW0sIG1lbW9wZnNmNjQsIFNTRVBhY2tlZERvdWJsZSwgMD4sIE9wU2l6ZSwgVkVYXzRWOw0KKyAgfQ0KKw0KKyAgbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KKyAgICBkZWZtIFBTIDogc3NlMTJfZnBfcGFja2VkPG9wYywgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwcyIpLCBPcE5vZGUsIEZSMzIsDQorICAgICAgICAgICAgICAgIGYzMiwgZjEyOG1lbSwgbWVtb3Bmc2YzMiwgU1NFUGFja2VkU2luZ2xlPiwgVEI7DQorDQorICAgIGRlZm0gUEQgOiBzc2UxMl9mcF9wYWNrZWQ8b3BjLCAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBkIiksIE9wTm9kZSwgRlI2NCwNCisgICAgICAgICAgICAgICAgZjY0LCBmMTI4bWVtLCBtZW1vcGZzZjY0LCBTU0VQYWNrZWREb3VibGU+LCBUQiwgT3BTaXplOw0KKyAgfQ0KK30NCisNCisvLyBBbGlhcyBiaXR3aXNlIGxvZ2ljYWwgb3BlcmF0aW9ucyB1c2luZyBTU0UgbG9naWNhbCBvcHMgb24gcGFja2VkIEZQIHZhbHVlcy4NCitsZXQgbWF5TG9hZCA9IDAgaW4gew0KKyAgZGVmbSBGc0FORCAgOiBzc2UxMl9mcF9hbGlhc19wYWNrX2xvZ2ljYWw8MHg1NCwgImFuZCIsIFg4NmZhbmQ+Ow0KKyAgZGVmbSBGc09SICAgOiBzc2UxMl9mcF9hbGlhc19wYWNrX2xvZ2ljYWw8MHg1NiwgIm9yIiwgWDg2Zm9yPjsNCisgIGRlZm0gRnNYT1IgIDogc3NlMTJfZnBfYWxpYXNfcGFja19sb2dpY2FsPDB4NTcsICJ4b3IiLCBYODZmeG9yPjsNCit9DQorDQorbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxLCBQYXR0ZXJuID0gW108ZGFnPiwgaXNDb21tdXRhYmxlID0gMCBpbg0KKyAgZGVmbSBGc0FORE4gOiBzc2UxMl9mcF9hbGlhc19wYWNrX2xvZ2ljYWw8MHg1NSwgImFuZG4iLCB1bmRlZj47DQorDQorLy8vIHNzZTEyX2ZwX3BhY2tlZF9sb2dpY2FsIC0gU1NFIDEgJiAyIHBhY2tlZCBGUCBsb2dpY2FsIG9wcw0KKy8vLw0KK211bHRpY2xhc3Mgc3NlMTJfZnBfcGFja2VkX2xvZ2ljYWw8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlIE9wTm9kZSwgaW50IEhhc1BhdCA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxsaXN0PGRhZz4+IFBhdHRlcm4gPSBbXT4gew0KKyAgbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFBhdHRlcm4gPSBbXTxkYWc+IGluIHsNCisgICAgZGVmbSBWI05BTUUjUFMgOiBzc2UxMl9mcF9wYWNrZWRfbG9naWNhbF9ybTxvcGMsIFZSMTI4LCBTU0VQYWNrZWRTaW5nbGUsDQorICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwcyIpLCBmMTI4bWVtLA0KKyAgICAgICAgICFpZihIYXNQYXQsIFBhdHRlcm5bMF0sIC8vIHJyDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHYyaTY0IChPcE5vZGUgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjg6JHNyYzIpKSldKSwNCisgICAgICAgICAhaWYoSGFzUGF0LCBQYXR0ZXJuWzJdLCAvLyBybQ0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChPcE5vZGUgKGJjX3YyaTY0ICh2NGYzMiBWUjEyODokc3JjMSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbW9wdjJpNjQgYWRkcjokc3JjMikpKV0pLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCisNCisgICAgZGVmbSBWI05BTUUjUEQgOiBzc2UxMl9mcF9wYWNrZWRfbG9naWNhbF9ybTxvcGMsIFZSMTI4LCBTU0VQYWNrZWREb3VibGUsDQorICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwZCIpLCBmMTI4bWVtLA0KKyAgICAgICAgICFpZihIYXNQYXQsIFBhdHRlcm5bMV0sIC8vIHJyDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKE9wTm9kZSAoYmNfdjJpNjQgKHYyZjY0IFZSMTI4OiRzcmMxKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmNfdjJpNjQgKHYyZjY0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUjEyODokc3JjMikpKSldKSwNCisgICAgICAgICAhaWYoSGFzUGF0LCBQYXR0ZXJuWzNdLCAvLyBybQ0KKyAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChPcE5vZGUgKGJjX3YyaTY0ICh2MmY2NCBWUjEyODokc3JjMSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbW9wdjJpNjQgYWRkcjokc3JjMikpKV0pLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcFNpemUsIFZFWF80VjsNCisgIH0NCisgIGxldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCisgICAgZGVmbSBQUyA6IHNzZTEyX2ZwX3BhY2tlZF9sb2dpY2FsX3JtPG9wYywgVlIxMjgsIFNTRVBhY2tlZFNpbmdsZSwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBzIiksIGYxMjhtZW0sDQorICAgICAgICAgIWlmKEhhc1BhdCwgUGF0dGVyblswXSwgLy8gcnINCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodjJpNjQgKE9wTm9kZSBWUjEyODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUjEyODokc3JjMikpKV0pLA0KKyAgICAgICAgICFpZihIYXNQYXQsIFBhdHRlcm5bMl0sIC8vIHJtDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKE9wTm9kZSAoYmNfdjJpNjQgKHY0ZjMyIFZSMTI4OiRzcmMxKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtb3B2Mmk2NCBhZGRyOiRzcmMyKSkpXSk+LCBUQjsNCisNCisgICAgZGVmbSBQRCA6IHNzZTEyX2ZwX3BhY2tlZF9sb2dpY2FsX3JtPG9wYywgVlIxMjgsIFNTRVBhY2tlZERvdWJsZSwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBkIiksIGYxMjhtZW0sDQorICAgICAgICAgIWlmKEhhc1BhdCwgUGF0dGVyblsxXSwgLy8gcnINCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoT3BOb2RlIChiY192Mmk2NCAodjJmNjQgVlIxMjg6JHNyYzEpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiY192Mmk2NCAodjJmNjQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSMTI4OiRzcmMyKSkpKV0pLA0KKyAgICAgICAgICFpZihIYXNQYXQsIFBhdHRlcm5bM10sIC8vIHJtDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKE9wTm9kZSAoYmNfdjJpNjQgKHYyZjY0IFZSMTI4OiRzcmMxKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtb3B2Mmk2NCBhZGRyOiRzcmMyKSkpXSk+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEIsIE9wU2l6ZTsNCisgIH0NCit9DQorDQorLy8vIHNzZTEyX2ZwX3BhY2tlZF9sb2dpY2FsX3kgLSBBVlggMjU2LWJpdCBTU0UgMSAmIDIgbG9naWNhbCBvcHMgZm9ybXMNCisvLy8NCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorbXVsdGljbGFzcyBzc2UxMl9mcF9wYWNrZWRfbG9naWNhbF95PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyPiB7DQorICAgIGRlZm0gUFNZIDogc3NlMTJfZnBfcGFja2VkX2xvZ2ljYWxfcm08b3BjLCBWUjI1NiwgU1NFUGFja2VkU2luZ2xlLA0KKyAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBzIiksIGYyNTZtZW0sIFtdLCBbXSwgMD4sIFZFWF80VjsNCisNCisgICAgZGVmbSBQRFkgOiBzc2UxMl9mcF9wYWNrZWRfbG9naWNhbF9ybTxvcGMsIFZSMjU2LCBTU0VQYWNrZWREb3VibGUsDQorICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicGQiKSwgZjI1Nm1lbSwgW10sIFtdLCAwPiwgT3BTaXplLCBWRVhfNFY7DQorfQ0KK30NCisNCisvLyBBVlggMjU2LWJpdCBwYWNrZWQgbG9naWNhbCBvcHMgZm9ybXMNCitkZWZtIFZBTkQgOiBzc2UxMl9mcF9wYWNrZWRfbG9naWNhbF95PDB4NTQsICJhbmQiPjsNCitkZWZtIFZPUiAgOiBzc2UxMl9mcF9wYWNrZWRfbG9naWNhbF95PDB4NTYsICJvciI+Ow0KK2RlZm0gVlhPUiA6IHNzZTEyX2ZwX3BhY2tlZF9sb2dpY2FsX3k8MHg1NywgInhvciI+Ow0KK2xldCBpc0NvbW11dGFibGUgPSAwIGluDQorICBkZWZtIFZBTkROIDogc3NlMTJfZnBfcGFja2VkX2xvZ2ljYWxfeTwweDU1LCAiYW5kbiI+Ow0KKw0KK2RlZm0gQU5EICA6IHNzZTEyX2ZwX3BhY2tlZF9sb2dpY2FsPDB4NTQsICJhbmQiLCBhbmQ+Ow0KK2RlZm0gT1IgICA6IHNzZTEyX2ZwX3BhY2tlZF9sb2dpY2FsPDB4NTYsICJvciIsIG9yPjsNCitkZWZtIFhPUiAgOiBzc2UxMl9mcF9wYWNrZWRfbG9naWNhbDwweDU3LCAieG9yIiwgeG9yPjsNCitsZXQgaXNDb21tdXRhYmxlID0gMCBpbg0KKyAgZGVmbSBBTkROIDogc3NlMTJfZnBfcGFja2VkX2xvZ2ljYWw8MHg1NSwgImFuZG4iLCB1bmRlZiAvKiBkdW1teSAqLywgMSwgWw0KKyAgICAvLyBzaW5nbGUgcityDQorICAgIFsoc2V0IFZSMTI4OiRkc3QsICh2Mmk2NCAoYW5kICh4b3IgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJjX3YyaTY0ICh2NGkzMiBpbW1BbGxPbmVzVikpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSMTI4OiRzcmMyKSkpXSwNCisgICAgLy8gZG91YmxlIHIrcg0KKyAgICBbKHNldCBWUjEyODokZHN0LCAoYW5kICh2bm90IChiY192Mmk2NCAodjJmNjQgVlIxMjg6JHNyYzEpKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJjX3YyaTY0ICh2MmY2NCBWUjEyODokc3JjMikpKSldLA0KKyAgICAvLyBzaW5nbGUgcittDQorICAgIFsoc2V0IFZSMTI4OiRkc3QsICh2Mmk2NCAoYW5kICh4b3IgKGJjX3YyaTY0ICh2NGYzMiBWUjEyODokc3JjMSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiY192Mmk2NCAodjRpMzIgaW1tQWxsT25lc1YpKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1vcHYyaTY0IGFkZHI6JHNyYzIpKSkpXSwNCisgICAgLy8gZG91YmxlIHIrbQ0KKyAgICBbKHNldCBWUjEyODokZHN0LCAoYW5kICh2bm90IChiY192Mmk2NCAodjJmNjQgVlIxMjg6JHNyYzEpKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbW9wdjJpNjQgYWRkcjokc3JjMikpKV1dPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRSAxICYgMiAtIEFyaXRobWV0aWMgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLy8gYmFzaWNfc3NlMTJfZnBfYmlub3BfeHh4IC0gU1NFIDEgJiAyIGJpbm9wcyBjb21lIGluIGJvdGggc2NhbGFyIGFuZA0KKy8vLyB2ZWN0b3IgZm9ybXMuDQorLy8vDQorLy8vIEluIGFkZGl0aW9uLCB3ZSBhbHNvIGhhdmUgYSBzcGVjaWFsIHZhcmlhbnQgb2YgdGhlIHNjYWxhciBmb3JtIGhlcmUgdG8NCisvLy8gcmVwcmVzZW50IHRoZSBhc3NvY2lhdGVkIGludHJpbnNpYyBvcGVyYXRpb24uICBUaGlzIGZvcm0gaXMgdW5saWtlIHRoZQ0KKy8vLyBwbGFpbiBzY2FsYXIgZm9ybSwgaW4gdGhhdCBpdCB0YWtlcyBhbiBlbnRpcmUgdmVjdG9yIChpbnN0ZWFkIG9mIGEgc2NhbGFyKQ0KKy8vLyBhbmQgbGVhdmVzIHRoZSB0b3AgZWxlbWVudHMgdW5tb2RpZmllZCAodGhlcmVmb3JlIHRoZXNlIGNhbm5vdCBiZSBjb21tdXRlZCkuDQorLy8vDQorLy8vIFRoZXNlIHRocmVlIGZvcm1zIGNhbiBlYWNoIGJlIHJlZytyZWcgb3IgcmVnK21lbS4NCisvLy8NCisNCisvLy8gRklYTUU6IG9uY2UgYWxsIDI1Ni1iaXQgaW50cmluc2ljcyBhcmUgbWF0Y2hlZCwgY2xlYW51cCBhbmQgcmVmYWN0b3IgdGhvc2UNCisvLy8gY2xhc3NlcyBiZWxvdw0KK211bHRpY2xhc3MgYmFzaWNfc3NlMTJfZnBfYmlub3BfczxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgU0ROb2RlIE9wTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IElzMkFkZHIgPSAxPiB7DQorICBkZWZtIFNTIDogc3NlMTJfZnBfc2NhbGFyPG9wYywgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJzcyIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcE5vZGUsIEZSMzIsIGYzMm1lbSwgSXMyQWRkcj4sIFhTOw0KKyAgZGVmbSBTRCA6IHNzZTEyX2ZwX3NjYWxhcjxvcGMsICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAic2QiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BOb2RlLCBGUjY0LCBmNjRtZW0sIElzMkFkZHI+LCBYRDsNCit9DQorDQorbXVsdGljbGFzcyBiYXNpY19zc2UxMl9mcF9iaW5vcF9wPGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLCBTRE5vZGUgT3BOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IElzMkFkZHIgPSAxPiB7DQorICBsZXQgbWF5TG9hZCA9IDAgaW4gew0KKyAgZGVmbSBQUyA6IHNzZTEyX2ZwX3BhY2tlZDxvcGMsICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicHMiKSwgT3BOb2RlLCBWUjEyOCwNCisgICAgICAgICAgICAgIHY0ZjMyLCBmMTI4bWVtLCBtZW1vcHY0ZjMyLCBTU0VQYWNrZWRTaW5nbGUsIElzMkFkZHI+LCBUQjsNCisgIGRlZm0gUEQgOiBzc2UxMl9mcF9wYWNrZWQ8b3BjLCAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBkIiksIE9wTm9kZSwgVlIxMjgsDQorICAgICAgICAgICAgICB2MmY2NCwgZjEyOG1lbSwgbWVtb3B2MmY2NCwgU1NFUGFja2VkRG91YmxlLCBJczJBZGRyPiwgVEIsIE9wU2l6ZTsNCisgIH0NCit9DQorDQorbXVsdGljbGFzcyBiYXNpY19zc2UxMl9mcF9iaW5vcF9wX3k8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlIE9wTm9kZT4gew0KKyAgbGV0IG1heUxvYWQgPSAwIGluIHsNCisgICAgZGVmbSBQU1kgOiBzc2UxMl9mcF9wYWNrZWQ8b3BjLCAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBzIiksIE9wTm9kZSwgVlIyNTYsDQorICAgICAgICAgICAgICAgIHY4ZjMyLCBmMjU2bWVtLCBtZW1vcHY4ZjMyLCBTU0VQYWNrZWRTaW5nbGUsIDA+LCBUQjsNCisgICAgZGVmbSBQRFkgOiBzc2UxMl9mcF9wYWNrZWQ8b3BjLCAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBkIiksIE9wTm9kZSwgVlIyNTYsDQorICAgICAgICAgICAgICAgIHY0ZjY0LCBmMjU2bWVtLCBtZW1vcHY0ZjY0LCBTU0VQYWNrZWREb3VibGUsIDA+LCBUQiwgT3BTaXplOw0KKyAgfQ0KK30NCisNCittdWx0aWNsYXNzIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3NfaW50PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IElzMkFkZHIgPSAxPiB7DQorICBkZWZtIFNTIDogc3NlMTJfZnBfc2NhbGFyX2ludDxvcGMsIE9wY29kZVN0ciwgVlIxMjgsDQorICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInNzIiksICIiLCAiX3NzIiwgc3NtZW0sIHNzZV9sb2FkX2YzMiwgSXMyQWRkcj4sIFhTOw0KKyAgZGVmbSBTRCA6IHNzZTEyX2ZwX3NjYWxhcl9pbnQ8b3BjLCBPcGNvZGVTdHIsIFZSMTI4LA0KKyAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJzZCIpLCAiMiIsICJfc2QiLCBzZG1lbSwgc3NlX2xvYWRfZjY0LCBJczJBZGRyPiwgWEQ7DQorfQ0KKw0KK211bHRpY2xhc3MgYmFzaWNfc3NlMTJfZnBfYmlub3BfcF9pbnQ8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGRlZm0gUFMgOiBzc2UxMl9mcF9wYWNrZWRfaW50PG9wYywgT3Bjb2RlU3RyLCBWUjEyOCwNCisgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicHMiKSwgInNzZSIsICJfcHMiLCBmMTI4bWVtLCBtZW1vcHY0ZjMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0VQYWNrZWRTaW5nbGUsIElzMkFkZHI+LCBUQjsNCisNCisgIGRlZm0gUEQgOiBzc2UxMl9mcF9wYWNrZWRfaW50PG9wYywgT3Bjb2RlU3RyLCBWUjEyOCwNCisgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicGQiKSwgInNzZTIiLCAiX3BkIiwgZjEyOG1lbSwgbWVtb3B2MmY2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTRVBhY2tlZERvdWJsZSwgSXMyQWRkcj4sIFRCLCBPcFNpemU7DQorfQ0KKw0KK211bHRpY2xhc3MgYmFzaWNfc3NlMTJfZnBfYmlub3BfcF95X2ludDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0cj4gew0KKyAgZGVmbSBQU1kgOiBzc2UxMl9mcF9wYWNrZWRfaW50PG9wYywgT3Bjb2RlU3RyLCBWUjI1NiwNCisgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicHMiKSwgImF2eCIsICJfcHNfMjU2IiwgZjI1Nm1lbSwgbWVtb3B2OGYzMiwNCisgICAgICBTU0VQYWNrZWRTaW5nbGUsIDA+LCBUQjsNCisNCisgIGRlZm0gUERZIDogc3NlMTJfZnBfcGFja2VkX2ludDxvcGMsIE9wY29kZVN0ciwgVlIyNTYsDQorICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBkIiksICJhdngiLCAiX3BkXzI1NiIsIGYyNTZtZW0sIG1lbW9wdjRmNjQsDQorICAgICAgU1NFUGFja2VkRG91YmxlLCAwPiwgVEIsIE9wU2l6ZTsNCit9DQorDQorLy8gQmluYXJ5IEFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKyAgZGVmbSBWQUREIDogYmFzaWNfc3NlMTJfZnBfYmlub3BfczwweDU4LCAiYWRkIiwgZmFkZCwgMD4sDQorICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9zX2ludDwweDU4LCAiYWRkIiwgMD4sDQorICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wPDB4NTgsICJhZGQiLCBmYWRkLCAwPiwNCisgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3BfeTwweDU4LCAiYWRkIiwgZmFkZD4sIFZFWF80VjsNCisgIGRlZm0gVk1VTCA6IGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3M8MHg1OSwgIm11bCIsIGZtdWwsIDA+LA0KKyAgICAgICAgICAgICAgYmFzaWNfc3NlMTJfZnBfYmlub3Bfc19pbnQ8MHg1OSwgIm11bCIsIDA+LA0KKyAgICAgICAgICAgICAgYmFzaWNfc3NlMTJfZnBfYmlub3BfcDwweDU5LCAibXVsIiwgZm11bCwgMD4sDQorICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wX3k8MHg1OSwgIm11bCIsIGZtdWw+LCBWRVhfNFY7DQorDQorICBsZXQgaXNDb21tdXRhYmxlID0gMCBpbiB7DQorICAgIGRlZm0gVlNVQiA6IGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3M8MHg1QywgInN1YiIsIGZzdWIsIDA+LA0KKyAgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9zX2ludDwweDVDLCAic3ViIiwgMD4sDQorICAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3A8MHg1QywgInN1YiIsIGZzdWIsIDA+LA0KKyAgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wX3k8MHg1QywgInN1YiIsIGZzdWI+LCBWRVhfNFY7DQorICAgIGRlZm0gVkRJViA6IGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3M8MHg1RSwgImRpdiIsIGZkaXYsIDA+LA0KKyAgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9zX2ludDwweDVFLCAiZGl2IiwgMD4sDQorICAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3A8MHg1RSwgImRpdiIsIGZkaXYsIDA+LA0KKyAgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wX3k8MHg1RSwgImRpdiIsIGZkaXY+LCBWRVhfNFY7DQorICAgIGRlZm0gVk1BWCA6IGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3M8MHg1RiwgIm1heCIsIFg4NmZtYXgsIDA+LA0KKyAgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9zX2ludDwweDVGLCAibWF4IiwgMD4sDQorICAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3A8MHg1RiwgIm1heCIsIFg4NmZtYXgsIDA+LA0KKyAgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wX2ludDwweDVGLCAibWF4IiwgMD4sDQorICAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3BfeTwweDVGLCAibWF4IiwgWDg2Zm1heD4sDQorICAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3BfeV9pbnQ8MHg1RiwgIm1heCI+LCBWRVhfNFY7DQorICAgIGRlZm0gVk1JTiA6IGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3M8MHg1RCwgIm1pbiIsIFg4NmZtaW4sIDA+LA0KKyAgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9zX2ludDwweDVELCAibWluIiwgMD4sDQorICAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3A8MHg1RCwgIm1pbiIsIFg4NmZtaW4sIDA+LA0KKyAgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wX2ludDwweDVELCAibWluIiwgMD4sDQorICAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3BfeV9pbnQ8MHg1RCwgIm1pbiI+LA0KKyAgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wX3k8MHg1RCwgIm1pbiIsIFg4NmZtaW4+LCBWRVhfNFY7DQorICB9DQorfQ0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCisgIGRlZm0gQUREIDogYmFzaWNfc3NlMTJfZnBfYmlub3BfczwweDU4LCAiYWRkIiwgZmFkZD4sDQorICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3A8MHg1OCwgImFkZCIsIGZhZGQ+LA0KKyAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9zX2ludDwweDU4LCAiYWRkIj47DQorICBkZWZtIE1VTCA6IGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3M8MHg1OSwgIm11bCIsIGZtdWw+LA0KKyAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wPDB4NTksICJtdWwiLCBmbXVsPiwNCisgICAgICAgICAgICAgYmFzaWNfc3NlMTJfZnBfYmlub3Bfc19pbnQ8MHg1OSwgIm11bCI+Ow0KKw0KKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDAgaW4gew0KKyAgICBkZWZtIFNVQiA6IGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3M8MHg1QywgInN1YiIsIGZzdWI+LA0KKyAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3A8MHg1QywgInN1YiIsIGZzdWI+LA0KKyAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3NfaW50PDB4NUMsICJzdWIiPjsNCisgICAgZGVmbSBESVYgOiBiYXNpY19zc2UxMl9mcF9iaW5vcF9zPDB4NUUsICJkaXYiLCBmZGl2PiwNCisgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wPDB4NUUsICJkaXYiLCBmZGl2PiwNCisgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9zX2ludDwweDVFLCAiZGl2Ij47DQorICAgIGRlZm0gTUFYIDogYmFzaWNfc3NlMTJfZnBfYmlub3BfczwweDVGLCAibWF4IiwgWDg2Zm1heD4sDQorICAgICAgICAgICAgICAgYmFzaWNfc3NlMTJfZnBfYmlub3BfcDwweDVGLCAibWF4IiwgWDg2Zm1heD4sDQorICAgICAgICAgICAgICAgYmFzaWNfc3NlMTJfZnBfYmlub3Bfc19pbnQ8MHg1RiwgIm1heCI+LA0KKyAgICAgICAgICAgICAgIGJhc2ljX3NzZTEyX2ZwX2Jpbm9wX3BfaW50PDB4NUYsICJtYXgiPjsNCisgICAgZGVmbSBNSU4gOiBiYXNpY19zc2UxMl9mcF9iaW5vcF9zPDB4NUQsICJtaW4iLCBYODZmbWluPiwNCisgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9wPDB4NUQsICJtaW4iLCBYODZmbWluPiwNCisgICAgICAgICAgICAgICBiYXNpY19zc2UxMl9mcF9iaW5vcF9zX2ludDwweDVELCAibWluIj4sDQorICAgICAgICAgICAgICAgYmFzaWNfc3NlMTJfZnBfYmlub3BfcF9pbnQ8MHg1RCwgIm1pbiI+Ow0KKyAgfQ0KK30NCisNCisvLy8gVW5vcCBBcml0aG1ldGljDQorLy8vIEluIGFkZGl0aW9uLCB3ZSBhbHNvIGhhdmUgYSBzcGVjaWFsIHZhcmlhbnQgb2YgdGhlIHNjYWxhciBmb3JtIGhlcmUgdG8NCisvLy8gcmVwcmVzZW50IHRoZSBhc3NvY2lhdGVkIGludHJpbnNpYyBvcGVyYXRpb24uICBUaGlzIGZvcm0gaXMgdW5saWtlIHRoZQ0KKy8vLyBwbGFpbiBzY2FsYXIgZm9ybSwgaW4gdGhhdCBpdCB0YWtlcyBhbiBlbnRpcmUgdmVjdG9yIChpbnN0ZWFkIG9mIGENCisvLy8gc2NhbGFyKSBhbmQgbGVhdmVzIHRoZSB0b3AgZWxlbWVudHMgdW5kZWZpbmVkLg0KKy8vLw0KKy8vLyBBbmQsIHdlIGhhdmUgYSBzcGVjaWFsIHZhcmlhbnQgZm9ybSBmb3IgYSBmdWxsLXZlY3RvciBpbnRyaW5zaWMgZm9ybS4NCisNCisvLy8gc3NlMV9mcF91bm9wX3MgLSBTU0UxIHVub3BzIGluIHNjYWxhciBmb3JtLg0KK211bHRpY2xhc3Mgc3NlMV9mcF91bm9wX3M8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgT3BOb2RlLCBJbnRyaW5zaWMgRjMySW50PiB7DQorICBkZWYgU1NyIDogU1NJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBGUjMyOiRkc3QpLCAoaW5zIEZSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAic3NcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgIFsoc2V0IEZSMzI6JGRzdCwgKE9wTm9kZSBGUjMyOiRzcmMpKV0+Ow0KKyAgLy8gRm9yIHNjYWxhciB1bmFyeSBvcGVyYXRpb25zLCBmb2xkIGEgbG9hZCBpbnRvIHRoZSBvcGVyYXRpb24NCisgIC8vIG9ubHkgaW4gT3B0Rm9yU2l6ZSBtb2RlLiBJdCBlbGltaW5hdGVzIGFuIGluc3RydWN0aW9uLCBidXQgaXQgYWxzbw0KKyAgLy8gZWxpbWluYXRlcyBhIHdob2xlLXJlZ2lzdGVyIGNsb2JiZXIgKHRoZSBsb2FkKSwgc28gaXQgaW50cm9kdWNlcyBhDQorICAvLyBwYXJ0aWFsIHJlZ2lzdGVyIHVwZGF0ZSBjb25kaXRpb24uDQorICBkZWYgU1NtIDogSTxvcGMsIE1STVNyY01lbSwgKG91dHMgRlIzMjokZHN0KSwgKGlucyBmMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAic3NcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgIFsoc2V0IEZSMzI6JGRzdCwgKE9wTm9kZSAobG9hZCBhZGRyOiRzcmMpKSldPiwgWFMsDQorICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTEsIE9wdEZvclNpemVdPjsNCisgIGRlZiBTU3JfSW50IDogU1NJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAic3NcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoRjMySW50IFZSMTI4OiRzcmMpKV0+Ow0KKyAgZGVmIFNTbV9JbnQgOiBTU0k8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIHNzbWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJzc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChGMzJJbnQgc3NlX2xvYWRfZjMyOiRzcmMpKV0+Ow0KK30NCisNCisvLy8gc3NlMV9mcF91bm9wX3NfYXZ4IC0gQVZYIFNTRTEgdW5vcHMgaW4gc2NhbGFyIGZvcm0uDQorbXVsdGljbGFzcyBzc2UxX2ZwX3Vub3Bfc19hdng8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlIE9wTm9kZSwgSW50cmluc2ljIEYzMkludD4gew0KKyAgZGVmIFNTciA6IFNTSTxvcGMsIE1STVNyY1JlZywgKG91dHMgRlIzMjokZHN0KSwgKGlucyBGUjMyOiRzcmMxLCBGUjMyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNzXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwgW10+Ow0KKyAgZGVmIFNTbSA6IEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIEZSMzI6JGRzdCksIChpbnMgRlIzMjokc3JjMSwgZjMybWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNzXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgW10+LCBYUywgUmVxdWlyZXM8W0hhc0FWWCwgT3B0Rm9yU2l6ZV0+Ow0KKyAgZGVmIFNTcl9JbnQgOiBTU0k8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3NcdHskc3JjLCAkZHN0LCAkZHN0fCRkc3QsICRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChGMzJJbnQgVlIxMjg6JHNyYykpXT47DQorICBkZWYgU1NtX0ludCA6IFNTSTxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgc3NtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzc1x0eyRzcmMsICRkc3QsICRkc3R8JGRzdCwgJGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEYzMkludCBzc2VfbG9hZF9mMzI6JHNyYykpXT47DQorfQ0KKw0KKy8vLyBzc2UxX2ZwX3Vub3BfcCAtIFNTRTEgdW5vcHMgaW4gcGFja2VkIGZvcm0uDQorbXVsdGljbGFzcyBzc2UxX2ZwX3Vub3BfcDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgU0ROb2RlIE9wTm9kZT4gew0KKyAgZGVmIFBTciA6IFBTSTxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHY0ZjMyIChPcE5vZGUgVlIxMjg6JHNyYykpKV0+Ow0KKyAgZGVmIFBTbSA6IFBTSTxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKE9wTm9kZSAobWVtb3B2NGYzMiBhZGRyOiRzcmMpKSldPjsNCit9DQorDQorLy8vIHNzZTFfZnBfdW5vcF9wX3kgLSBBVlggMjU2LWJpdCBTU0UxIHVub3BzIGluIHBhY2tlZCBmb3JtLg0KK211bHRpY2xhc3Mgc3NlMV9mcF91bm9wX3BfeTxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgU0ROb2RlIE9wTm9kZT4gew0KKyAgZGVmIFBTWXIgOiBQU0k8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSMjU2OiRkc3QpLCAoaW5zIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgIFsoc2V0IFZSMjU2OiRkc3QsICh2OGYzMiAoT3BOb2RlIFZSMjU2OiRzcmMpKSldPjsNCisgIGRlZiBQU1ltIDogUFNJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBmMjU2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICBbKHNldCBWUjI1NjokZHN0LCAoT3BOb2RlIChtZW1vcHY4ZjMyIGFkZHI6JHNyYykpKV0+Ow0KK30NCisNCisvLy8gc3NlMV9mcF91bm9wX3BfaW50IC0gU1NFMSBpbnRyaW5zaWNzIHVub3BzIGluIHBhY2tlZCBmb3Jtcy4NCittdWx0aWNsYXNzIHNzZTFfZnBfdW5vcF9wX2ludDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgVjRGMzJJbnQ+IHsNCisgIGRlZiBQU3JfSW50IDogUFNJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoVjRGMzJJbnQgVlIxMjg6JHNyYykpXT47DQorICBkZWYgUFNtX0ludCA6IFBTSTxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoVjRGMzJJbnQgKG1lbW9wdjRmMzIgYWRkcjokc3JjKSkpXT47DQorfQ0KKw0KKy8vLyBzc2UxX2ZwX3Vub3BfcF95X2ludCAtIEFWWCAyNTYtYml0IGludHJpbnNpY3MgdW5vcHMgaW4gcGFja2VkIGZvcm1zLg0KK211bHRpY2xhc3Mgc3NlMV9mcF91bm9wX3BfeV9pbnQ8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgVjRGMzJJbnQ+IHsNCisgIGRlZiBQU1lyX0ludCA6IFBTSTxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIyNTY6JGRzdCksIChpbnMgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIyNTY6JGRzdCwgKFY0RjMySW50IFZSMjU2OiRzcmMpKV0+Ow0KKyAgZGVmIFBTWW1fSW50IDogUFNJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBmMjU2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMjU2OiRkc3QsIChWNEYzMkludCAobWVtb3B2OGYzMiBhZGRyOiRzcmMpKSldPjsNCit9DQorDQorLy8vIHNzZTJfZnBfdW5vcF9zIC0gU1NFMiB1bm9wcyBpbiBzY2FsYXIgZm9ybS4NCittdWx0aWNsYXNzIHNzZTJfZnBfdW5vcF9zPGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlIE9wTm9kZSwgSW50cmluc2ljIEY2NEludD4gew0KKyAgZGVmIFNEciA6IFNESTxvcGMsIE1STVNyY1JlZywgKG91dHMgRlI2NDokZHN0KSwgKGlucyBGUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInNkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICBbKHNldCBGUjY0OiRkc3QsIChPcE5vZGUgRlI2NDokc3JjKSldPjsNCisgIC8vIFNlZSB0aGUgY29tbWVudHMgaW4gc3NlMV9mcF91bm9wX3MgZm9yIHdoeSB0aGlzIGlzIE9wdEZvclNpemUuDQorICBkZWYgU0RtIDogSTxvcGMsIE1STVNyY01lbSwgKG91dHMgRlI2NDokZHN0KSwgKGlucyBmNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAic2RcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgIFsoc2V0IEZSNjQ6JGRzdCwgKE9wTm9kZSAobG9hZCBhZGRyOiRzcmMpKSldPiwgWEQsDQorICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTIsIE9wdEZvclNpemVdPjsNCisgIGRlZiBTRHJfSW50IDogU0RJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAic2RcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoRjY0SW50IFZSMTI4OiRzcmMpKV0+Ow0KKyAgZGVmIFNEbV9JbnQgOiBTREk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIHNkbWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJzZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChGNjRJbnQgc3NlX2xvYWRfZjY0OiRzcmMpKV0+Ow0KK30NCisNCisvLy8gc3NlMl9mcF91bm9wX3NfYXZ4IC0gQVZYIFNTRTIgdW5vcHMgaW4gc2NhbGFyIGZvcm0uDQorbXVsdGljbGFzcyBzc2UyX2ZwX3Vub3Bfc19hdng8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlIE9wTm9kZSwgSW50cmluc2ljIEY2NEludD4gew0KKyAgZGVmIFNEciA6IFNESTxvcGMsIE1STVNyY1JlZywgKG91dHMgRlI2NDokZHN0KSwgKGlucyBGUjY0OiRzcmMxLCBGUjY0OiRzcmMyKSwNCisgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZFx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksIFtdPjsNCisgIGRlZiBTRG0gOiBTREk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIEZSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgKGlucyBGUjY0OiRzcmMxLCBmNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNkXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwgW10+Ow0KKyAgZGVmIFNEcl9JbnQgOiBTREk8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJzZFx0eyRzcmMsICRkc3QsICRkc3R8JGRzdCwgJGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChGNjRJbnQgVlIxMjg6JHNyYykpXT47DQorICBkZWYgU0RtX0ludCA6IFNESTxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgc2RtZW06JHNyYyksDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInNkXHR7JHNyYywgJGRzdCwgJGRzdHwkZHN0LCAkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEY2NEludCBzc2VfbG9hZF9mNjQ6JHNyYykpXT47DQorfQ0KKw0KKy8vLyBzc2UyX2ZwX3Vub3BfcCAtIFNTRTIgdW5vcHMgaW4gdmVjdG9yIGZvcm1zLg0KK211bHRpY2xhc3Mgc3NlMl9mcF91bm9wX3A8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgT3BOb2RlPiB7DQorICBkZWYgUERyIDogUERJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodjJmNjQgKE9wTm9kZSBWUjEyODokc3JjKSkpXT47DQorICBkZWYgUERtIDogUERJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBmMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoT3BOb2RlIChtZW1vcHYyZjY0IGFkZHI6JHNyYykpKV0+Ow0KK30NCisNCisvLy8gc3NlMl9mcF91bm9wX3BfeSAtIEFWWCBTU0UyIDI1Ni1iaXQgdW5vcHMgaW4gdmVjdG9yIGZvcm1zLg0KK211bHRpY2xhc3Mgc3NlMl9mcF91bm9wX3BfeTxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgU0ROb2RlIE9wTm9kZT4gew0KKyAgZGVmIFBEWXIgOiBQREk8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSMjU2OiRkc3QpLCAoaW5zIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgIFsoc2V0IFZSMjU2OiRkc3QsICh2NGY2NCAoT3BOb2RlIFZSMjU2OiRzcmMpKSldPjsNCisgIGRlZiBQRFltIDogUERJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBmMjU2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgInBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICBbKHNldCBWUjI1NjokZHN0LCAoT3BOb2RlIChtZW1vcHY0ZjY0IGFkZHI6JHNyYykpKV0+Ow0KK30NCisNCisvLy8gc3NlMl9mcF91bm9wX3BfaW50IC0gU1NFMiBpbnRyaW5zaWMgdW5vcHMgaW4gdmVjdG9yIGZvcm1zLg0KK211bHRpY2xhc3Mgc3NlMl9mcF91bm9wX3BfaW50PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBWMkY2NEludD4gew0KKyAgZGVmIFBEcl9JbnQgOiBQREk8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChWMkY2NEludCBWUjEyODokc3JjKSldPjsNCisgIGRlZiBQRG1fSW50IDogUERJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBmMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChWMkY2NEludCAobWVtb3B2MmY2NCBhZGRyOiRzcmMpKSldPjsNCit9DQorDQorLy8vIHNzZTJfZnBfdW5vcF9wX3lfaW50IC0gQVZYIDI1Ni1iaXQgaW50cmluc2ljIHVub3BzIGluIHZlY3RvciBmb3Jtcy4NCittdWx0aWNsYXNzIHNzZTJfZnBfdW5vcF9wX3lfaW50PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljIFYyRjY0SW50PiB7DQorICBkZWYgUERZcl9JbnQgOiBQREk8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSMjU2OiRkc3QpLCAoaW5zIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMjU2OiRkc3QsIChWMkY2NEludCBWUjI1Njokc3JjKSldPjsNCisgIGRlZiBQRFltX0ludCA6IFBESTxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIyNTY6JGRzdCksIChpbnMgZjI1Nm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAicGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjI1NjokZHN0LCAoVjJGNjRJbnQgKG1lbW9wdjRmNjQgYWRkcjokc3JjKSkpXT47DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KKyAgLy8gU3F1YXJlIHJvb3QuDQorICBkZWZtIFZTUVJUICA6IHNzZTFfZnBfdW5vcF9zX2F2eDwweDUxLCAidnNxcnQiLCBmc3FydCwgaW50X3g4Nl9zc2Vfc3FydF9zcz4sDQorICAgICAgICAgICAgICAgIHNzZTJfZnBfdW5vcF9zX2F2eDwweDUxLCAidnNxcnQiLCBmc3FydCwgaW50X3g4Nl9zc2UyX3NxcnRfc2Q+LA0KKyAgICAgICAgICAgICAgICBWRVhfNFY7DQorDQorICBkZWZtIFZTUVJUICA6IHNzZTFfZnBfdW5vcF9wPDB4NTEsICJ2c3FydCIsIGZzcXJ0PiwNCisgICAgICAgICAgICAgICAgc3NlMl9mcF91bm9wX3A8MHg1MSwgInZzcXJ0IiwgZnNxcnQ+LA0KKyAgICAgICAgICAgICAgICBzc2UxX2ZwX3Vub3BfcF95PDB4NTEsICJ2c3FydCIsIGZzcXJ0PiwNCisgICAgICAgICAgICAgICAgc3NlMl9mcF91bm9wX3BfeTwweDUxLCAidnNxcnQiLCBmc3FydD4sDQorICAgICAgICAgICAgICAgIHNzZTFfZnBfdW5vcF9wX2ludDwweDUxLCAidnNxcnQiLCBpbnRfeDg2X3NzZV9zcXJ0X3BzPiwNCisgICAgICAgICAgICAgICAgc3NlMl9mcF91bm9wX3BfaW50PDB4NTEsICJ2c3FydCIsIGludF94ODZfc3NlMl9zcXJ0X3BkPiwNCisgICAgICAgICAgICAgICAgc3NlMV9mcF91bm9wX3BfeV9pbnQ8MHg1MSwgInZzcXJ0IiwgaW50X3g4Nl9hdnhfc3FydF9wc18yNTY+LA0KKyAgICAgICAgICAgICAgICBzc2UyX2ZwX3Vub3BfcF95X2ludDwweDUxLCAidnNxcnQiLCBpbnRfeDg2X2F2eF9zcXJ0X3BkXzI1Nj4sDQorICAgICAgICAgICAgICAgIFZFWDsNCisNCisgIC8vIFJlY2lwcm9jYWwgYXBwcm94aW1hdGlvbnMuIE5vdGUgdGhhdCB0aGVzZSB0eXBpY2FsbHkgcmVxdWlyZSByZWZpbmVtZW50DQorICAvLyBpbiBvcmRlciB0byBvYnRhaW4gc3VpdGFibGUgcHJlY2lzaW9uLg0KKyAgZGVmbSBWUlNRUlQgOiBzc2UxX2ZwX3Vub3Bfc19hdng8MHg1MiwgInZyc3FydCIsIFg4NmZyc3FydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlX3JzcXJ0X3NzPiwgVkVYXzRWOw0KKyAgZGVmbSBWUlNRUlQgOiBzc2UxX2ZwX3Vub3BfcDwweDUyLCAidnJzcXJ0IiwgWDg2ZnJzcXJ0PiwNCisgICAgICAgICAgICAgICAgc3NlMV9mcF91bm9wX3BfeTwweDUyLCAidnJzcXJ0IiwgWDg2ZnJzcXJ0PiwNCisgICAgICAgICAgICAgICAgc3NlMV9mcF91bm9wX3BfeV9pbnQ8MHg1MiwgInZyc3FydCIsIGludF94ODZfYXZ4X3JzcXJ0X3BzXzI1Nj4sDQorICAgICAgICAgICAgICAgIHNzZTFfZnBfdW5vcF9wX2ludDwweDUyLCAidnJzcXJ0IiwgaW50X3g4Nl9zc2VfcnNxcnRfcHM+LCBWRVg7DQorDQorICBkZWZtIFZSQ1AgICA6IHNzZTFfZnBfdW5vcF9zX2F2eDwweDUzLCAidnJjcCIsIFg4NmZyY3AsIGludF94ODZfc3NlX3JjcF9zcz4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorICBkZWZtIFZSQ1AgICA6IHNzZTFfZnBfdW5vcF9wPDB4NTMsICJ2cmNwIiwgWDg2ZnJjcD4sDQorICAgICAgICAgICAgICAgIHNzZTFfZnBfdW5vcF9wX3k8MHg1MywgInZyY3AiLCBYODZmcmNwPiwNCisgICAgICAgICAgICAgICAgc3NlMV9mcF91bm9wX3BfeV9pbnQ8MHg1MywgInZyY3AiLCBpbnRfeDg2X2F2eF9yY3BfcHNfMjU2PiwNCisgICAgICAgICAgICAgICAgc3NlMV9mcF91bm9wX3BfaW50PDB4NTMsICJ2cmNwIiwgaW50X3g4Nl9zc2VfcmNwX3BzPiwgVkVYOw0KK30NCisNCisvLyBTcXVhcmUgcm9vdC4NCitkZWZtIFNRUlQgIDogc3NlMV9mcF91bm9wX3M8MHg1MSwgInNxcnQiLCAgZnNxcnQsIGludF94ODZfc3NlX3NxcnRfc3M+LA0KKyAgICAgICAgICAgICBzc2UxX2ZwX3Vub3BfcDwweDUxLCAic3FydCIsICBmc3FydD4sDQorICAgICAgICAgICAgIHNzZTFfZnBfdW5vcF9wX2ludDwweDUxLCAic3FydCIsICBpbnRfeDg2X3NzZV9zcXJ0X3BzPiwNCisgICAgICAgICAgICAgc3NlMl9mcF91bm9wX3M8MHg1MSwgInNxcnQiLCAgZnNxcnQsIGludF94ODZfc3NlMl9zcXJ0X3NkPiwNCisgICAgICAgICAgICAgc3NlMl9mcF91bm9wX3A8MHg1MSwgInNxcnQiLCAgZnNxcnQ+LA0KKyAgICAgICAgICAgICBzc2UyX2ZwX3Vub3BfcF9pbnQ8MHg1MSwgInNxcnQiLCBpbnRfeDg2X3NzZTJfc3FydF9wZD47DQorDQorLy8gUmVjaXByb2NhbCBhcHByb3hpbWF0aW9ucy4gTm90ZSB0aGF0IHRoZXNlIHR5cGljYWxseSByZXF1aXJlIHJlZmluZW1lbnQNCisvLyBpbiBvcmRlciB0byBvYnRhaW4gc3VpdGFibGUgcHJlY2lzaW9uLg0KK2RlZm0gUlNRUlQgOiBzc2UxX2ZwX3Vub3BfczwweDUyLCAicnNxcnQiLCBYODZmcnNxcnQsIGludF94ODZfc3NlX3JzcXJ0X3NzPiwNCisgICAgICAgICAgICAgc3NlMV9mcF91bm9wX3A8MHg1MiwgInJzcXJ0IiwgWDg2ZnJzcXJ0PiwNCisgICAgICAgICAgICAgc3NlMV9mcF91bm9wX3BfaW50PDB4NTIsICJyc3FydCIsIGludF94ODZfc3NlX3JzcXJ0X3BzPjsNCitkZWZtIFJDUCAgIDogc3NlMV9mcF91bm9wX3M8MHg1MywgInJjcCIsIFg4NmZyY3AsIGludF94ODZfc3NlX3JjcF9zcz4sDQorICAgICAgICAgICAgIHNzZTFfZnBfdW5vcF9wPDB4NTMsICJyY3AiLCBYODZmcmNwPiwNCisgICAgICAgICAgICAgc3NlMV9mcF91bm9wX3BfaW50PDB4NTMsICJyY3AiLCBpbnRfeDg2X3NzZV9yY3BfcHM+Ow0KKw0KKy8vIFRoZXJlIGlzIG5vIGY2NCB2ZXJzaW9uIG9mIHRoZSByZWNpcHJvY2FsIGFwcHJveGltYXRpb24gaW5zdHJ1Y3Rpb25zLg0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFIDEgJiAyIC0gTm9uLXRlbXBvcmFsIHN0b3Jlcw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKyAgZGVmIFZNT1ZOVFBTbXJfSW50IDogVlBTSTwweDJCLCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdm50cHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhpbnRfeDg2X3NzZV9tb3ZudF9wcyBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpXT4sIFZFWDsNCisgIGRlZiBWTU9WTlRQRG1yX0ludCA6IFZQREk8MHgyQiwgTVJNRGVzdE1lbSwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGkxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZudHBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFsoaW50X3g4Nl9zc2UyX21vdm50X3BkIGFkZHI6JGRzdCwgVlIxMjg6JHNyYyldPiwgVkVYOw0KKw0KKyAgbGV0IEV4ZURvbWFpbiA9IFNTRVBhY2tlZEludCBpbg0KKyAgICBkZWYgVk1PVk5URFFtcl9JbnQgOiBWUERJPDB4RTcsIE1STURlc3RNZW0sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgIChpbnMgZjEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3ZudGRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKGludF94ODZfc3NlMl9tb3ZudF9kcSBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpXT4sIFZFWDsNCisNCisgIGxldCBBZGRlZENvbXBsZXhpdHkgPSA0MDAgaW4geyAvLyBQcmVmZXIgbm9uLXRlbXBvcmFsIHZlcnNpb25zDQorICAgIGRlZiBWTU9WTlRQU21yIDogVlBTSTwweDJCLCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgZjEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdm50cHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkbm9udGVtcG9yYWxzdG9yZSAodjRmMzIgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjokZHN0KV0+LCBWRVg7DQorICAgIGRlZiBWTU9WTlRQRG1yIDogVlBESTwweDJCLCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgZjEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdm50cGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkbm9udGVtcG9yYWxzdG9yZSAodjJmNjQgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjokZHN0KV0+LCBWRVg7DQorICAgIGRlZiBWTU9WTlREUV82NG1yIDogVlBESTwweEU3LCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAibW92bnRkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkbm9udGVtcG9yYWxzdG9yZSAodjJmNjQgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCldPiwgVkVYOw0KKyAgICBsZXQgRXhlRG9tYWluID0gU1NFUGFja2VkSW50IGluDQorICAgIGRlZiBWTU9WTlREUW1yIDogVlBESTwweEU3LCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBmMTI4bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZudGRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkbm9udGVtcG9yYWxzdG9yZSAodjRmMzIgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyOiRkc3QpXT4sIFZFWDsNCisNCisgICAgZGVmIFZNT1ZOVFBTWW1yIDogVlBTSTwweDJCLCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgZjI1Nm1lbTokZHN0LCBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdm50cHNcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkbm9udGVtcG9yYWxzdG9yZSAodjhmMzIgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjokZHN0KV0+LCBWRVg7DQorICAgIGRlZiBWTU9WTlRQRFltciA6IFZQREk8MHgyQiwgTVJNRGVzdE1lbSwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGYyNTZtZW06JGRzdCwgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZudHBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFsoYWxpZ25lZG5vbnRlbXBvcmFsc3RvcmUgKHY0ZjY0IFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCldPiwgVkVYOw0KKyAgICBkZWYgVk1PVk5URFFZXzY0bXIgOiBWUERJPDB4RTcsIE1STURlc3RNZW0sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgZjI1Nm1lbTokZHN0LCBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZudGRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbKGFsaWduZWRub250ZW1wb3JhbHN0b3JlICh2NGY2NCBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjokZHN0KV0+LCBWRVg7DQorICAgIGxldCBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQgaW4NCisgICAgZGVmIFZNT1ZOVERRWW1yIDogVlBESTwweEU3LCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBmMjU2bWVtOiRkc3QsIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZudGRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkbm9udGVtcG9yYWxzdG9yZSAodjhmMzIgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyOiRkc3QpXT4sIFZFWDsNCisgIH0NCit9DQorDQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF9tb3ZudF9kcV8yNTYgYWRkcjokZHN0LCBWUjI1Njokc3JjKSwNCisgICAgICAgICAgKFZNT1ZOVERRWW1yIGFkZHI6JGRzdCwgVlIyNTY6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfbW92bnRfcGRfMjU2IGFkZHI6JGRzdCwgVlIyNTY6JHNyYyksDQorICAgICAgICAgIChWTU9WTlRQRFltciBhZGRyOiRkc3QsIFZSMjU2OiRzcmMpPjsNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X21vdm50X3BzXzI1NiBhZGRyOiRkc3QsIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAoVk1PVk5UUFNZbXIgYWRkcjokZHN0LCBWUjI1Njokc3JjKT47DQorDQorZGVmIE1PVk5UUFNtcl9JbnQgOiBQU0k8MHgyQiwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAibW92bnRwc1x0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhpbnRfeDg2X3NzZV9tb3ZudF9wcyBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpXT47DQorZGVmIE1PVk5UUERtcl9JbnQgOiBQREk8MHgyQiwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgIm1vdm50cGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKGludF94ODZfc3NlMl9tb3ZudF9wZCBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpXT47DQorDQorbGV0IEV4ZURvbWFpbiA9IFNTRVBhY2tlZEludCBpbg0KK2RlZiBNT1ZOVERRbXJfSW50IDogUERJPDB4RTcsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBmMTI4bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZudGRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhpbnRfeDg2X3NzZTJfbW92bnRfZHEgYWRkcjokZHN0LCBWUjEyODokc3JjKV0+Ow0KKw0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSA0MDAgaW4geyAvLyBQcmVmZXIgbm9uLXRlbXBvcmFsIHZlcnNpb25zDQorZGVmIE1PVk5UUFNtciA6IFBTSTwweDJCLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgZjEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJtb3ZudHBzXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKGFsaWduZWRub250ZW1wb3JhbHN0b3JlICh2NGYzMiBWUjEyODokc3JjKSwgYWRkcjokZHN0KV0+Ow0KK2RlZiBNT1ZOVFBEbXIgOiBQREk8MHgyQiwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAibW92bnRwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkbm9udGVtcG9yYWxzdG9yZSh2MmY2NCBWUjEyODokc3JjKSwgYWRkcjokZHN0KV0+Ow0KKw0KK2RlZiBNT1ZOVERRXzY0bXIgOiBQREk8MHhFNywgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAibW92bnRkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhhbGlnbmVkbm9udGVtcG9yYWxzdG9yZSAodjJmNjQgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCldPjsNCisNCitsZXQgRXhlRG9tYWluID0gU1NFUGFja2VkSW50IGluDQorZGVmIE1PVk5URFFtciA6IFBESTwweEU3LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgZjEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJtb3ZudGRxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKGFsaWduZWRub250ZW1wb3JhbHN0b3JlICh2NGYzMiBWUjEyODokc3JjKSwgYWRkcjokZHN0KV0+Ow0KKw0KKy8vIFRoZXJlIGlzIG5vIEFWWCBmb3JtIGZvciBpbnN0cnVjdGlvbnMgYmVsb3cgdGhpcyBwb2ludA0KK2RlZiBNT1ZOVEltciA6IEk8MHhDMywgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgIm1vdm50aVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgWyhub250ZW1wb3JhbHN0b3JlIChpMzIgR1IzMjokc3JjKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgIFRCLCBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KKw0KK2RlZiBNT1ZOVElfNjRtciA6IFJJPDB4QzMsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgR1I2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAibW92bnRpXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhub250ZW1wb3JhbHN0b3JlIChpNjQgR1I2NDokc3JjKSwgYWRkcjokZHN0KV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCLCBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KKw0KK30NCitkZWYgTU9WTlRJbXJfSW50ICA6ICAgSTwweEMzLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QsIEdSMzI6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAibW92bnRpXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKGludF94ODZfc3NlMl9tb3ZudF9pIGFkZHI6JGRzdCwgR1IzMjokc3JjKV0+LA0KKyAgICAgICAgICAgICAgICAgIFRCLCBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFIDEgJiAyIC0gTWlzYyBJbnN0cnVjdGlvbnMgKE5vIEFWWCBmb3JtKQ0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gUHJlZmV0Y2ggaW50cmluc2ljLg0KK2RlZiBQUkVGRVRDSFQwICAgOiBQU0k8MHgxOCwgTVJNMW0sIChvdXRzKSwgKGlucyBpOG1lbTokc3JjKSwNCisgICAgInByZWZldGNodDBcdCRzcmMiLCBbKHByZWZldGNoIGFkZHI6JHNyYywgaW1tLCAoaTMyIDMpKV0+Ow0KK2RlZiBQUkVGRVRDSFQxICAgOiBQU0k8MHgxOCwgTVJNMm0sIChvdXRzKSwgKGlucyBpOG1lbTokc3JjKSwNCisgICAgInByZWZldGNodDFcdCRzcmMiLCBbKHByZWZldGNoIGFkZHI6JHNyYywgaW1tLCAoaTMyIDIpKV0+Ow0KK2RlZiBQUkVGRVRDSFQyICAgOiBQU0k8MHgxOCwgTVJNM20sIChvdXRzKSwgKGlucyBpOG1lbTokc3JjKSwNCisgICAgInByZWZldGNodDJcdCRzcmMiLCBbKHByZWZldGNoIGFkZHI6JHNyYywgaW1tLCAoaTMyIDEpKV0+Ow0KK2RlZiBQUkVGRVRDSE5UQSAgOiBQU0k8MHgxOCwgTVJNMG0sIChvdXRzKSwgKGlucyBpOG1lbTokc3JjKSwNCisgICAgInByZWZldGNobnRhXHQkc3JjIiwgWyhwcmVmZXRjaCBhZGRyOiRzcmMsIGltbSwgKGkzMiAwKSldPjsNCisNCisvLyBMb2FkLCBzdG9yZSwgYW5kIG1lbW9yeSBmZW5jZQ0KK2RlZiBTRkVOQ0UgOiBJPDB4QUUsIE1STV9GOCwgKG91dHMpLCAoaW5zKSwgInNmZW5jZSIsIFsoaW50X3g4Nl9zc2Vfc2ZlbmNlKV0+LA0KKyAgICAgICAgICAgICBUQiwgUmVxdWlyZXM8W0hhc1NTRTFdPjsNCitkZWYgOiBQYXQ8KFg4NlNGZW5jZSksIChTRkVOQ0UpPjsNCisNCisvLyBBbGlhcyBpbnN0cnVjdGlvbnMgdGhhdCBtYXAgemVybyB2ZWN0b3IgdG8gcHhvciAvIHhvcnAqIGZvciBzc2UuDQorLy8gV2Ugc2V0IGNhbkZvbGRBc0xvYWQgYmVjYXVzZSB0aGlzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBjb25zdGFudC1wb29sDQorLy8gbG9hZCBvZiBhbiBhbGwtemVyb3MgdmFsdWUgaWYgZm9sZGluZyBpdCB3b3VsZCBiZSBiZW5lZmljaWFsLg0KKy8vIEZJWE1FOiBDaGFuZ2UgZW5jb2RpbmcgdG8gcHNldWRvIQ0KK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxLCBpc0FzQ2hlYXBBc0FNb3ZlID0gMSwgY2FuRm9sZEFzTG9hZCA9IDEsDQorICAgIGlzQ29kZUdlbk9ubHkgPSAxIGluIHsNCitkZWYgVl9TRVQwUFMgOiBQU0k8MHg1NywgTVJNSW5pdFJlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMpLCAiIiwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsICh2NGYzMiBpbW1BbGxaZXJvc1YpKV0+Ow0KK2RlZiBWX1NFVDBQRCA6IFBESTwweDU3LCBNUk1Jbml0UmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyksICIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHYyZjY0IGltbUFsbFplcm9zVikpXT47DQorbGV0IEV4ZURvbWFpbiA9IFNTRVBhY2tlZEludCBpbg0KK2RlZiBWX1NFVDBQSSA6IFBESTwweEVGLCBNUk1Jbml0UmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyksICIiLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHY0aTMyIGltbUFsbFplcm9zVikpXT47DQorfQ0KKw0KK2RlZiA6IFBhdDwodjJpNjQgaW1tQWxsWmVyb3NWKSwgKFZfU0VUMFBJKT47DQorZGVmIDogUGF0PCh2OGkxNiBpbW1BbGxaZXJvc1YpLCAoVl9TRVQwUEkpPjsNCitkZWYgOiBQYXQ8KHYxNmk4IGltbUFsbFplcm9zViksIChWX1NFVDBQSSk+Ow0KKw0KK2RlZiA6IFBhdDwoZjMyICh2ZWN0b3JfZXh0cmFjdCAodjRmMzIgVlIxMjg6JHNyYyksIChpUFRSIDApKSksDQorICAgICAgICAgIChmMzIgKEVYVFJBQ1RfU1VCUkVHICh2NGYzMiBWUjEyODokc3JjKSwgc3ViX3NzKSk+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFIDEgJiAyIC0gTG9hZC9TdG9yZSBYQ1NSIHJlZ2lzdGVyDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorICBkZWYgVkxETVhDU1IgOiBWUFNJPDB4QUUsIE1STTJtLCAob3V0cyksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgImxkbXhjc3JcdCRzcmMiLCBbKGludF94ODZfc3NlX2xkbXhjc3IgYWRkcjokc3JjKV0+LCBWRVg7DQorICBkZWYgVlNUTVhDU1IgOiBWUFNJPDB4QUUsIE1STTNtLCAob3V0cyksIChpbnMgaTMybWVtOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgInN0bXhjc3JcdCRkc3QiLCBbKGludF94ODZfc3NlX3N0bXhjc3IgYWRkcjokZHN0KV0+LCBWRVg7DQorfQ0KKw0KK2RlZiBMRE1YQ1NSIDogUFNJPDB4QUUsIE1STTJtLCAob3V0cyksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICJsZG14Y3NyXHQkc3JjIiwgWyhpbnRfeDg2X3NzZV9sZG14Y3NyIGFkZHI6JHNyYyldPjsNCitkZWYgU1RNWENTUiA6IFBTSTwweEFFLCBNUk0zbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0KSwNCisgICAgICAgICAgICAgICAgICAic3RteGNzclx0JGRzdCIsIFsoaW50X3g4Nl9zc2Vfc3RteGNzciBhZGRyOiRkc3QpXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRTIgLSBNb3ZlIEFsaWduZWQvVW5hbGlnbmVkIFBhY2tlZCBJbnRlZ2VyIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitsZXQgRXhlRG9tYWluID0gU1NFUGFja2VkSW50IGluIHsgLy8gU1NFIGludGVnZXIgaW5zdHJ1Y3Rpb25zDQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKyAgbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCisgIGRlZiBWTU9WRFFBcnIgIDogVlBESTwweDZGLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92ZHFhXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYOw0KKyAgZGVmIFZNT1ZEUUFZcnIgOiBWUERJPDB4NkYsIE1STVNyY1JlZywgKG91dHMgVlIyNTY6JGRzdCksIChpbnMgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJtb3ZkcWFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorICB9DQorICBkZWYgVk1PVkRRVXJyICA6IFZQREk8MHg2RiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmRxdVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFhTLCBWRVg7DQorICBkZWYgVk1PVkRRVVlyciA6IFZQREk8MHg2RiwgTVJNU3JjUmVnLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmRxdVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFhTLCBWRVg7DQorDQorICBsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIG1heUxvYWQgPSAxIGluIHsNCisgIGRlZiBWTU9WRFFBcm0gIDogVlBESTwweDZGLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGkxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgIm1vdmRxYVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCisgIGRlZiBWTU9WRFFBWXJtIDogVlBESTwweDZGLCBNUk1TcmNNZW0sIChvdXRzIFZSMjU2OiRkc3QpLCAoaW5zIGkyNTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgIm1vdmRxYVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCisgIGxldCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KKyAgICBkZWYgVk1PVkRRVXJtICA6IEk8MHg2RiwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAidm1vdmRxdVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLFtdPiwgWFMsIFZFWDsNCisgICAgZGVmIFZNT1ZEUVVZcm0gOiBJPDB4NkYsIE1STVNyY01lbSwgKG91dHMgVlIyNTY6JGRzdCksIChpbnMgaTI1Nm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZtb3ZkcXVcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IixbXT4sIFhTLCBWRVg7DQorICB9DQorICB9DQorDQorICBsZXQgbWF5U3RvcmUgPSAxIGluIHsNCisgIGRlZiBWTU9WRFFBbXIgIDogVlBESTwweDdGLCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAgICAgICAoaW5zIGkxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAibW92ZHFhXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYOw0KKyAgZGVmIFZNT1ZEUUFZbXIgOiBWUERJPDB4N0YsIE1STURlc3RNZW0sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTI1Nm1lbTokZHN0LCBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3ZkcWFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorICBsZXQgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisgIGRlZiBWTU9WRFFVbXIgIDogSTwweDdGLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJ2bW92ZHF1XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsW10+LCBYUywgVkVYOw0KKyAgZGVmIFZNT1ZEUVVZbXIgOiBJPDB4N0YsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMjU2bWVtOiRkc3QsIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgInZtb3ZkcXVcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IixbXT4sIFhTLCBWRVg7DQorICB9DQorICB9DQorfQ0KKw0KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbg0KK2RlZiBNT1ZEUUFyciA6IFBESTwweDZGLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92ZHFhXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPjsNCisNCitsZXQgY2FuRm9sZEFzTG9hZCA9IDEsIG1heUxvYWQgPSAxIGluIHsNCitkZWYgTU9WRFFBcm0gOiBQREk8MHg2RiwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAibW92ZHFhXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsvKihzZXQgVlIxMjg6JGRzdCwgKGFsaWduZWRsb2FkdjJpNjQgYWRkcjokc3JjKSkqL10+Ow0KK2RlZiBNT1ZEUVVybSA6ICAgSTwweDZGLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGkxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3ZkcXVcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWy8qKHNldCBWUjEyODokZHN0LCAobG9hZHYyaTY0IGFkZHI6JHNyYykpKi9dPiwNCisgICAgICAgICAgICAgICAgIFhTLCBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KK30NCisNCitsZXQgbWF5U3RvcmUgPSAxIGluIHsNCitkZWYgTU9WRFFBbXIgOiBQREk8MHg3RiwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJtb3ZkcWFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWy8qKGFsaWduZWRzdG9yZSAodjJpNjQgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCkqL10+Ow0KK2RlZiBNT1ZEUVVtciA6ICAgSTwweDdGLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIm1vdmRxdVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICBbLyooc3RvcmUgKHYyaTY0IFZSMTI4OiRzcmMpLCBhZGRyOiRkc3QpKi9dPiwNCisgICAgICAgICAgICAgICAgIFhTLCBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KK30NCisNCisvLyBJbnRyaW5zaWMgZm9ybXMgb2YgTU9WRFFVIGxvYWQgYW5kIHN0b3JlDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2xldCBjYW5Gb2xkQXNMb2FkID0gMSBpbg0KK2RlZiBWTU9WRFFVcm1fSW50IDogSTwweDZGLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGkxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAidm1vdmRxdVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9sb2FkdV9kcSBhZGRyOiRzcmMpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFhTLCBWRVgsIFJlcXVpcmVzPFtIYXNBVlhdPjsNCitkZWYgVk1PVkRRVW1yX0ludCA6IEk8MHg3RiwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkxMjhtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAidm1vdmRxdVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhpbnRfeDg2X3NzZTJfc3RvcmV1X2RxIGFkZHI6JGRzdCwgVlIxMjg6JHNyYyldPiwNCisgICAgICAgICAgICAgICAgICAgICBYUywgVkVYLCBSZXF1aXJlczxbSGFzQVZYXT47DQorfQ0KKw0KK2xldCBjYW5Gb2xkQXNMb2FkID0gMSBpbg0KK2RlZiBNT1ZEUVVybV9JbnQgOiAgIEk8MHg2RiwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdmRxdVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlMl9sb2FkdV9kcSBhZGRyOiRzcmMpKV0+LA0KKyAgICAgICAgICAgICAgICAgWFMsIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIE1PVkRRVW1yX0ludCA6ICAgSTwweDdGLCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTEyOG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3ZkcXVcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoaW50X3g4Nl9zc2UyX3N0b3JldV9kcSBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpXT4sDQorICAgICAgICAgICAgICAgICAgICAgWFMsIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorfSAvLyBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQNCisNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X2xvYWR1X2RxXzI1NiBhZGRyOiRzcmMpLCAoVk1PVkRRVVlybSBhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X3N0b3JldV9kcV8yNTYgYWRkcjokZHN0LCBWUjI1Njokc3JjKSwNCisgICAgICAgICAgKFZNT1ZEUVVZbXIgYWRkcjokZHN0LCBWUjI1Njokc3JjKT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRTIgLSBQYWNrZWQgSW50ZWdlciBBcml0aG1ldGljIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitsZXQgRXhlRG9tYWluID0gU1NFUGFja2VkSW50IGluIHsgLy8gU1NFIGludGVnZXIgaW5zdHJ1Y3Rpb25zDQorDQorbXVsdGljbGFzcyBQRElfYmlub3Bfcm1faW50PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLCBJbnRyaW5zaWMgSW50SWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBJc0NvbW11dGFibGUgPSAwLCBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGxldCBpc0NvbW11dGFibGUgPSBJc0NvbW11dGFibGUgaW4NCisgIGRlZiByciA6IFBESTxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEludElkIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpXT47DQorICBkZWYgcm0gOiBQREk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMTI4bWVtOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEludElkIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdGNvbnZlcnQgKG1lbW9wdjJpNjQgYWRkcjokc3JjMikpKSldPjsNCit9DQorDQorbXVsdGljbGFzcyBQRElfYmlub3Bfcm1pX2ludDxiaXRzPDg+IG9wYywgYml0czw4PiBvcGMyLCBGb3JtYXQgSW1tRm9ybSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsIEludHJpbnNpYyBJbnRJZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRJZDIsIGJpdCBJczJBZGRyID0gMT4gew0KKyAgZGVmIHJyIDogUERJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgICBbKHNldCBWUjEyODokZHN0LCAoSW50SWQgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSldPjsNCisgIGRlZiBybSA6IFBESTxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIGkxMjhtZW06JHNyYzIpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgICBbKHNldCBWUjEyODokZHN0LCAoSW50SWQgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0Y29udmVydCAobWVtb3B2Mmk2NCBhZGRyOiRzcmMyKSkpKV0+Ow0KKyAgZGVmIHJpIDogUERJaTg8b3BjMiwgSW1tRm9ybSwgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEludElkMiBWUjEyODokc3JjMSwgKGkzMiBpbW06JHNyYzIpKSldPjsNCit9DQorDQorLy8vIFBESV9iaW5vcF9ybSAtIFNpbXBsZSBTU0UyIGJpbmFyeSBvcGVyYXRvci4NCittdWx0aWNsYXNzIFBESV9iaW5vcF9ybTxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgU0ROb2RlIE9wTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgT3BWVCwgYml0IElzQ29tbXV0YWJsZSA9IDAsIGJpdCBJczJBZGRyID0gMT4gew0KKyAgbGV0IGlzQ29tbXV0YWJsZSA9IElzQ29tbXV0YWJsZSBpbg0KKyAgZGVmIHJyIDogUERJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgICBbKHNldCBWUjEyODokZHN0LCAoT3BWVCAoT3BOb2RlIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpKV0+Ow0KKyAgZGVmIHJtIDogUERJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMiksDQorICAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChPcFZUIChPcE5vZGUgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXRjb252ZXJ0IChtZW1vcHYyaTY0IGFkZHI6JHNyYzIpKSkpKV0+Ow0KK30NCisNCisvLy8gUERJX2Jpbm9wX3JtX3YyaTY0IC0gU2ltcGxlIFNTRTIgYmluYXJ5IG9wZXJhdG9yIHdob3NlIHR5cGUgaXMgdjJpNjQuDQorLy8vDQorLy8vIEZJWE1FOiB3ZSBjb3VsZCBlbGltaW5hdGUgdGhpcyBhbmQgdXNlIFBESV9iaW5vcF9ybSBpbnN0ZWFkIGlmIHRibGdlbiBrbmV3DQorLy8vIHRvIGNvbGxhcHNlIChiaXRjb252ZXJ0IFZUIHRvIFZUKSBpbnRvIGl0cyBvcGVyYW5kLg0KKy8vLw0KK211bHRpY2xhc3MgUERJX2Jpbm9wX3JtX3YyaTY0PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLCBTRE5vZGUgT3BOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBJc0NvbW11dGFibGUgPSAwLCBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGxldCBpc0NvbW11dGFibGUgPSBJc0NvbW11dGFibGUgaW4NCisgIGRlZiByciA6IFBESTxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHYyaTY0IChPcE5vZGUgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSkpXT47DQorICBkZWYgcm0gOiBQREk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMTI4bWVtOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKE9wTm9kZSBWUjEyODokc3JjMSwgKG1lbW9wdjJpNjQgYWRkcjokc3JjMikpKV0+Ow0KK30NCisNCit9IC8vIEV4ZURvbWFpbiA9IFNTRVBhY2tlZEludA0KKw0KKy8vIDEyOC1iaXQgSW50ZWdlciBBcml0aG1ldGljDQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbiB7DQorZGVmbSBWUEFEREIgIDogUERJX2Jpbm9wX3JtPDB4RkMsICJ2cGFkZGIiLCBhZGQsIHYxNmk4LCAxLCAwIC8qM2FkZHIqLz4sIFZFWF80VjsNCitkZWZtIFZQQUREVyAgOiBQRElfYmlub3Bfcm08MHhGRCwgInZwYWRkdyIsIGFkZCwgdjhpMTYsIDEsIDA+LCBWRVhfNFY7DQorZGVmbSBWUEFEREQgIDogUERJX2Jpbm9wX3JtPDB4RkUsICJ2cGFkZGQiLCBhZGQsIHY0aTMyLCAxLCAwPiwgVkVYXzRWOw0KK2RlZm0gVlBBRERRICA6IFBESV9iaW5vcF9ybV92Mmk2NDwweEQ0LCAidnBhZGRxIiwgYWRkLCAxLCAwPiwgVkVYXzRWOw0KK2RlZm0gVlBNVUxMVyA6IFBESV9iaW5vcF9ybTwweEQ1LCAidnBtdWxsdyIsIG11bCwgdjhpMTYsIDEsIDA+LCBWRVhfNFY7DQorZGVmbSBWUFNVQkIgOiBQRElfYmlub3Bfcm08MHhGOCwgInZwc3ViYiIsIHN1YiwgdjE2aTgsIDAsIDA+LCBWRVhfNFY7DQorZGVmbSBWUFNVQlcgOiBQRElfYmlub3Bfcm08MHhGOSwgInZwc3VidyIsIHN1YiwgdjhpMTYsIDAsIDA+LCBWRVhfNFY7DQorZGVmbSBWUFNVQkQgOiBQRElfYmlub3Bfcm08MHhGQSwgInZwc3ViZCIsIHN1YiwgdjRpMzIsIDAsIDA+LCBWRVhfNFY7DQorZGVmbSBWUFNVQlEgOiBQRElfYmlub3Bfcm1fdjJpNjQ8MHhGQiwgInZwc3VicSIsIHN1YiwgMCwgMD4sIFZFWF80VjsNCisNCisvLyBJbnRyaW5zaWMgZm9ybXMNCitkZWZtIFZQU1VCU0IgIDogUERJX2Jpbm9wX3JtX2ludDwweEU4LCAidnBzdWJzYiIgLCBpbnRfeDg2X3NzZTJfcHN1YnNfYiwgMCwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KK2RlZm0gVlBTVUJTVyAgOiBQRElfYmlub3Bfcm1faW50PDB4RTksICJ2cHN1YnN3IiAsIGludF94ODZfc3NlMl9wc3Vic193LCAwLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUFNVQlVTQiA6IFBESV9iaW5vcF9ybV9pbnQ8MHhEOCwgInZwc3VidXNiIiwgaW50X3g4Nl9zc2UyX3BzdWJ1c19iLCAwLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUFNVQlVTVyA6IFBESV9iaW5vcF9ybV9pbnQ8MHhEOSwgInZwc3VidXN3IiwgaW50X3g4Nl9zc2UyX3BzdWJ1c193LCAwLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUEFERFNCICA6IFBESV9iaW5vcF9ybV9pbnQ8MHhFQywgInZwYWRkc2IiICwgaW50X3g4Nl9zc2UyX3BhZGRzX2IsIDEsIDA+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCitkZWZtIFZQQUREU1cgIDogUERJX2Jpbm9wX3JtX2ludDwweEVELCAidnBhZGRzdyIgLCBpbnRfeDg2X3NzZTJfcGFkZHNfdywgMSwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KK2RlZm0gVlBBRERVU0IgOiBQRElfYmlub3Bfcm1faW50PDB4REMsICJ2cGFkZHVzYiIsIGludF94ODZfc3NlMl9wYWRkdXNfYiwgMSwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KK2RlZm0gVlBBRERVU1cgOiBQRElfYmlub3Bfcm1faW50PDB4REQsICJ2cGFkZHVzdyIsIGludF94ODZfc3NlMl9wYWRkdXNfdywgMSwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KK2RlZm0gVlBNVUxIVVcgOiBQRElfYmlub3Bfcm1faW50PDB4RTQsICJ2cG11bGh1dyIsIGludF94ODZfc3NlMl9wbXVsaHVfdywgMSwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KK2RlZm0gVlBNVUxIVyAgOiBQRElfYmlub3Bfcm1faW50PDB4RTUsICJ2cG11bGh3IiAsIGludF94ODZfc3NlMl9wbXVsaF93LCAxLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUE1VTFVEUSA6IFBESV9iaW5vcF9ybV9pbnQ8MHhGNCwgInZwbXVsdWRxIiwgaW50X3g4Nl9zc2UyX3BtdWx1X2RxLCAxLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUE1BRERXRCA6IFBESV9iaW5vcF9ybV9pbnQ8MHhGNSwgInZwbWFkZHdkIiwgaW50X3g4Nl9zc2UyX3BtYWRkX3dkLCAxLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUEFWR0IgICA6IFBESV9iaW5vcF9ybV9pbnQ8MHhFMCwgInZwYXZnYiIsIGludF94ODZfc3NlMl9wYXZnX2IsIDEsIDA+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCitkZWZtIFZQQVZHVyAgIDogUERJX2Jpbm9wX3JtX2ludDwweEUzLCAidnBhdmd3IiwgaW50X3g4Nl9zc2UyX3BhdmdfdywgMSwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KK2RlZm0gVlBNSU5VQiAgOiBQRElfYmlub3Bfcm1faW50PDB4REEsICJ2cG1pbnViIiwgaW50X3g4Nl9zc2UyX3BtaW51X2IsIDEsIDA+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCitkZWZtIFZQTUlOU1cgIDogUERJX2Jpbm9wX3JtX2ludDwweEVBLCAidnBtaW5zdyIsIGludF94ODZfc3NlMl9wbWluc193LCAxLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUE1BWFVCICA6IFBESV9iaW5vcF9ybV9pbnQ8MHhERSwgInZwbWF4dWIiLCBpbnRfeDg2X3NzZTJfcG1heHVfYiwgMSwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KK2RlZm0gVlBNQVhTVyAgOiBQRElfYmlub3Bfcm1faW50PDB4RUUsICJ2cG1heHN3IiwgaW50X3g4Nl9zc2UyX3BtYXhzX3csIDEsIDA+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCitkZWZtIFZQU0FEQlcgIDogUERJX2Jpbm9wX3JtX2ludDwweEY2LCAidnBzYWRidyIsIGludF94ODZfc3NlMl9wc2FkX2J3LCAxLCAwPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorfQ0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCitkZWZtIFBBRERCICA6IFBESV9iaW5vcF9ybTwweEZDLCAicGFkZGIiLCBhZGQsIHYxNmk4LCAxPjsNCitkZWZtIFBBRERXICA6IFBESV9iaW5vcF9ybTwweEZELCAicGFkZHciLCBhZGQsIHY4aTE2LCAxPjsNCitkZWZtIFBBREREICA6IFBESV9iaW5vcF9ybTwweEZFLCAicGFkZGQiLCBhZGQsIHY0aTMyLCAxPjsNCitkZWZtIFBBRERRICA6IFBESV9iaW5vcF9ybV92Mmk2NDwweEQ0LCAicGFkZHEiLCBhZGQsIDE+Ow0KK2RlZm0gUE1VTExXIDogUERJX2Jpbm9wX3JtPDB4RDUsICJwbXVsbHciLCBtdWwsIHY4aTE2LCAxPjsNCitkZWZtIFBTVUJCIDogUERJX2Jpbm9wX3JtPDB4RjgsICJwc3ViYiIsIHN1YiwgdjE2aTg+Ow0KK2RlZm0gUFNVQlcgOiBQRElfYmlub3Bfcm08MHhGOSwgInBzdWJ3Iiwgc3ViLCB2OGkxNj47DQorZGVmbSBQU1VCRCA6IFBESV9iaW5vcF9ybTwweEZBLCAicHN1YmQiLCBzdWIsIHY0aTMyPjsNCitkZWZtIFBTVUJRIDogUERJX2Jpbm9wX3JtX3YyaTY0PDB4RkIsICJwc3VicSIsIHN1Yj47DQorDQorLy8gSW50cmluc2ljIGZvcm1zDQorZGVmbSBQU1VCU0IgIDogUERJX2Jpbm9wX3JtX2ludDwweEU4LCAicHN1YnNiIiAsIGludF94ODZfc3NlMl9wc3Vic19iPjsNCitkZWZtIFBTVUJTVyAgOiBQRElfYmlub3Bfcm1faW50PDB4RTksICJwc3Vic3ciICwgaW50X3g4Nl9zc2UyX3BzdWJzX3c+Ow0KK2RlZm0gUFNVQlVTQiA6IFBESV9iaW5vcF9ybV9pbnQ8MHhEOCwgInBzdWJ1c2IiLCBpbnRfeDg2X3NzZTJfcHN1YnVzX2I+Ow0KK2RlZm0gUFNVQlVTVyA6IFBESV9iaW5vcF9ybV9pbnQ8MHhEOSwgInBzdWJ1c3ciLCBpbnRfeDg2X3NzZTJfcHN1YnVzX3c+Ow0KK2RlZm0gUEFERFNCICA6IFBESV9iaW5vcF9ybV9pbnQ8MHhFQywgInBhZGRzYiIgLCBpbnRfeDg2X3NzZTJfcGFkZHNfYiwgMT47DQorZGVmbSBQQUREU1cgIDogUERJX2Jpbm9wX3JtX2ludDwweEVELCAicGFkZHN3IiAsIGludF94ODZfc3NlMl9wYWRkc193LCAxPjsNCitkZWZtIFBBRERVU0IgOiBQRElfYmlub3Bfcm1faW50PDB4REMsICJwYWRkdXNiIiwgaW50X3g4Nl9zc2UyX3BhZGR1c19iLCAxPjsNCitkZWZtIFBBRERVU1cgOiBQRElfYmlub3Bfcm1faW50PDB4REQsICJwYWRkdXN3IiwgaW50X3g4Nl9zc2UyX3BhZGR1c193LCAxPjsNCitkZWZtIFBNVUxIVVcgOiBQRElfYmlub3Bfcm1faW50PDB4RTQsICJwbXVsaHV3IiwgaW50X3g4Nl9zc2UyX3BtdWxodV93LCAxPjsNCitkZWZtIFBNVUxIVyAgOiBQRElfYmlub3Bfcm1faW50PDB4RTUsICJwbXVsaHciICwgaW50X3g4Nl9zc2UyX3BtdWxoX3csIDE+Ow0KK2RlZm0gUE1VTFVEUSA6IFBESV9iaW5vcF9ybV9pbnQ8MHhGNCwgInBtdWx1ZHEiLCBpbnRfeDg2X3NzZTJfcG11bHVfZHEsIDE+Ow0KK2RlZm0gUE1BRERXRCA6IFBESV9iaW5vcF9ybV9pbnQ8MHhGNSwgInBtYWRkd2QiLCBpbnRfeDg2X3NzZTJfcG1hZGRfd2QsIDE+Ow0KK2RlZm0gUEFWR0IgICA6IFBESV9iaW5vcF9ybV9pbnQ8MHhFMCwgInBhdmdiIiwgaW50X3g4Nl9zc2UyX3BhdmdfYiwgMT47DQorZGVmbSBQQVZHVyAgIDogUERJX2Jpbm9wX3JtX2ludDwweEUzLCAicGF2Z3ciLCBpbnRfeDg2X3NzZTJfcGF2Z193LCAxPjsNCitkZWZtIFBNSU5VQiAgOiBQRElfYmlub3Bfcm1faW50PDB4REEsICJwbWludWIiLCBpbnRfeDg2X3NzZTJfcG1pbnVfYiwgMT47DQorZGVmbSBQTUlOU1cgIDogUERJX2Jpbm9wX3JtX2ludDwweEVBLCAicG1pbnN3IiwgaW50X3g4Nl9zc2UyX3BtaW5zX3csIDE+Ow0KK2RlZm0gUE1BWFVCICA6IFBESV9iaW5vcF9ybV9pbnQ8MHhERSwgInBtYXh1YiIsIGludF94ODZfc3NlMl9wbWF4dV9iLCAxPjsNCitkZWZtIFBNQVhTVyAgOiBQRElfYmlub3Bfcm1faW50PDB4RUUsICJwbWF4c3ciLCBpbnRfeDg2X3NzZTJfcG1heHNfdywgMT47DQorZGVmbSBQU0FEQlcgIDogUERJX2Jpbm9wX3JtX2ludDwweEY2LCAicHNhZGJ3IiwgaW50X3g4Nl9zc2UyX3BzYWRfYncsIDE+Ow0KKw0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0Ig0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0UyIC0gUGFja2VkIEludGVnZXIgTG9naWNhbCBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbiB7DQorZGVmbSBWUFNMTFcgOiBQRElfYmlub3Bfcm1pX2ludDwweEYxLCAweDcxLCBNUk02ciwgInZwc2xsdyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfcHNsbF93LCBpbnRfeDg2X3NzZTJfcHNsbGlfdywgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUFNMTEQgOiBQRElfYmlub3Bfcm1pX2ludDwweEYyLCAweDcyLCBNUk02ciwgInZwc2xsZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfcHNsbF9kLCBpbnRfeDg2X3NzZTJfcHNsbGlfZCwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUFNMTFEgOiBQRElfYmlub3Bfcm1pX2ludDwweEYzLCAweDczLCBNUk02ciwgInZwc2xscSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfcHNsbF9xLCBpbnRfeDg2X3NzZTJfcHNsbGlfcSwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorDQorZGVmbSBWUFNSTFcgOiBQRElfYmlub3Bfcm1pX2ludDwweEQxLCAweDcxLCBNUk0yciwgInZwc3JsdyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfcHNybF93LCBpbnRfeDg2X3NzZTJfcHNybGlfdywgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUFNSTEQgOiBQRElfYmlub3Bfcm1pX2ludDwweEQyLCAweDcyLCBNUk0yciwgInZwc3JsZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfcHNybF9kLCBpbnRfeDg2X3NzZTJfcHNybGlfZCwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUFNSTFEgOiBQRElfYmlub3Bfcm1pX2ludDwweEQzLCAweDczLCBNUk0yciwgInZwc3JscSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfcHNybF9xLCBpbnRfeDg2X3NzZTJfcHNybGlfcSwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorDQorZGVmbSBWUFNSQVcgOiBQRElfYmlub3Bfcm1pX2ludDwweEUxLCAweDcxLCBNUk00ciwgInZwc3JhdyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfcHNyYV93LCBpbnRfeDg2X3NzZTJfcHNyYWlfdywgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorZGVmbSBWUFNSQUQgOiBQRElfYmlub3Bfcm1pX2ludDwweEUyLCAweDcyLCBNUk00ciwgInZwc3JhZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTJfcHNyYV9kLCBpbnRfeDg2X3NzZTJfcHNyYWlfZCwgMD4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVhfNFY7DQorDQorZGVmbSBWUEFORCA6IFBESV9iaW5vcF9ybV92Mmk2NDwweERCLCAidnBhbmQiLCBhbmQsIDEsIDA+LCBWRVhfNFY7DQorZGVmbSBWUE9SICA6IFBESV9iaW5vcF9ybV92Mmk2NDwweEVCLCAidnBvciIgLCBvciwgMSwgMD4sIFZFWF80VjsNCitkZWZtIFZQWE9SIDogUERJX2Jpbm9wX3JtX3YyaTY0PDB4RUYsICJ2cHhvciIsIHhvciwgMSwgMD4sIFZFWF80VjsNCisNCitsZXQgRXhlRG9tYWluID0gU1NFUGFja2VkSW50IGluIHsNCisgIGxldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7DQorICAgIC8vIDEyOC1iaXQgbG9naWNhbCBzaGlmdHMuDQorICAgIGRlZiBWUFNMTERRcmkgOiBQRElpODwweDczLCBNUk03ciwNCisgICAgICAgICAgICAgICAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZwc2xsZHFcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsIFtdPiwNCisgICAgICAgICAgICAgICAgICAgICAgVkVYXzRWOw0KKyAgICBkZWYgVlBTUkxEUXJpIDogUERJaTg8MHg3MywgTVJNM3IsDQorICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJ2cHNybGRxXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLCBbXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCisgICAgLy8gUFNSQURRcmkgZG9lc24ndCBleGlzdCBpbiBTU0VbMS0zXS4NCisgIH0NCisgIGRlZiBWUEFORE5yciA6IFBESTwweERGLCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInZwYW5kblx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsICh2Mmk2NCAoYW5kICh2bm90IFZSMTI4OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjg6JHNyYzIpKSldPiwgVkVYXzRWOw0KKw0KKyAgZGVmIFZQQU5ETnJtIDogUERJPDB4REYsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBpMTI4bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJ2cGFuZG5cdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodjJpNjQgKGFuZCAodm5vdCBWUjEyODokc3JjMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1vcHYyaTY0IGFkZHI6JHNyYzIpKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWF80VjsNCit9DQorfQ0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCitkZWZtIFBTTExXIDogUERJX2Jpbm9wX3JtaV9pbnQ8MHhGMSwgMHg3MSwgTVJNNnIsICJwc2xsdyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9wc2xsX3csIGludF94ODZfc3NlMl9wc2xsaV93PjsNCitkZWZtIFBTTExEIDogUERJX2Jpbm9wX3JtaV9pbnQ8MHhGMiwgMHg3MiwgTVJNNnIsICJwc2xsZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9wc2xsX2QsIGludF94ODZfc3NlMl9wc2xsaV9kPjsNCitkZWZtIFBTTExRIDogUERJX2Jpbm9wX3JtaV9pbnQ8MHhGMywgMHg3MywgTVJNNnIsICJwc2xscSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9wc2xsX3EsIGludF94ODZfc3NlMl9wc2xsaV9xPjsNCisNCitkZWZtIFBTUkxXIDogUERJX2Jpbm9wX3JtaV9pbnQ8MHhEMSwgMHg3MSwgTVJNMnIsICJwc3JsdyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9wc3JsX3csIGludF94ODZfc3NlMl9wc3JsaV93PjsNCitkZWZtIFBTUkxEIDogUERJX2Jpbm9wX3JtaV9pbnQ8MHhEMiwgMHg3MiwgTVJNMnIsICJwc3JsZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9wc3JsX2QsIGludF94ODZfc3NlMl9wc3JsaV9kPjsNCitkZWZtIFBTUkxRIDogUERJX2Jpbm9wX3JtaV9pbnQ8MHhEMywgMHg3MywgTVJNMnIsICJwc3JscSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9wc3JsX3EsIGludF94ODZfc3NlMl9wc3JsaV9xPjsNCisNCitkZWZtIFBTUkFXIDogUERJX2Jpbm9wX3JtaV9pbnQ8MHhFMSwgMHg3MSwgTVJNNHIsICJwc3JhdyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9wc3JhX3csIGludF94ODZfc3NlMl9wc3JhaV93PjsNCitkZWZtIFBTUkFEIDogUERJX2Jpbm9wX3JtaV9pbnQ8MHhFMiwgMHg3MiwgTVJNNHIsICJwc3JhZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlMl9wc3JhX2QsIGludF94ODZfc3NlMl9wc3JhaV9kPjsNCisNCitkZWZtIFBBTkQgOiBQRElfYmlub3Bfcm1fdjJpNjQ8MHhEQiwgInBhbmQiLCBhbmQsIDE+Ow0KK2RlZm0gUE9SICA6IFBESV9iaW5vcF9ybV92Mmk2NDwweEVCLCAicG9yIiAsIG9yLCAxPjsNCitkZWZtIFBYT1IgOiBQRElfYmlub3Bfcm1fdjJpNjQ8MHhFRiwgInB4b3IiLCB4b3IsIDE+Ow0KKw0KK2xldCBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQgaW4gew0KKyAgbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluIHsNCisgICAgLy8gMTI4LWJpdCBsb2dpY2FsIHNoaWZ0cy4NCisgICAgZGVmIFBTTExEUXJpIDogUERJaTg8MHg3MywgTVJNN3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJwc2xsZHFcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLCBbXT47DQorICAgIGRlZiBQU1JMRFFyaSA6IFBESWk4PDB4NzMsIE1STTNyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAicHNybGRxXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwgW10+Ow0KKyAgICAvLyBQU1JBRFFyaSBkb2Vzbid0IGV4aXN0IGluIFNTRVsxLTNdLg0KKyAgfQ0KKyAgZGVmIFBBTkROcnIgOiBQREk8MHhERiwgTVJNU3JjUmVnLA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICJwYW5kblx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodjJpNjQgKGFuZCAodm5vdCBWUjEyODokc3JjMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSMTI4OiRzcmMyKSkpXT47DQorDQorICBkZWYgUEFORE5ybSA6IFBESTwweERGLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAicGFuZG5cdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHYyaTY0IChhbmQgKHZub3QgVlIxMjg6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtb3B2Mmk2NCBhZGRyOiRzcmMyKSkpKV0+Ow0KK30NCit9IC8vIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCINCisNCitsZXQgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisgIGRlZiA6IFBhdDwoaW50X3g4Nl9zc2UyX3BzbGxfZHEgVlIxMjg6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgICAgKHYyaTY0IChWUFNMTERRcmkgVlIxMjg6JHNyYzEsIChCWVRFX2ltbSBpbW06JHNyYzIpKSk+Ow0KKyAgZGVmIDogUGF0PChpbnRfeDg2X3NzZTJfcHNybF9kcSBWUjEyODokc3JjMSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAodjJpNjQgKFZQU1JMRFFyaSBWUjEyODokc3JjMSwgKEJZVEVfaW1tIGltbTokc3JjMikpKT47DQorICBkZWYgOiBQYXQ8KGludF94ODZfc3NlMl9wc2xsX2RxX2JzIFZSMTI4OiRzcmMxLCBpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICh2Mmk2NCAoVlBTTExEUXJpIFZSMTI4OiRzcmMxLCBpbW06JHNyYzIpKT47DQorICBkZWYgOiBQYXQ8KGludF94ODZfc3NlMl9wc3JsX2RxX2JzIFZSMTI4OiRzcmMxLCBpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICh2Mmk2NCAoVlBTUkxEUXJpIFZSMTI4OiRzcmMxLCBpbW06JHNyYzIpKT47DQorICBkZWYgOiBQYXQ8KHYyZjY0IChYODZmc3JsIFZSMTI4OiRzcmMxLCBpMzJpbW1TRXh0ODokc3JjMikpLA0KKyAgICAgICAgICAgICh2MmY2NCAoVlBTUkxEUXJpIFZSMTI4OiRzcmMxLCAoQllURV9pbW0gaW1tOiRzcmMyKSkpPjsNCisNCisgIC8vIFNoaWZ0IHVwIC8gZG93biBhbmQgaW5zZXJ0IHplcm8ncy4NCisgIGRlZiA6IFBhdDwodjJpNjQgKFg4NnZzaGwgIFZSMTI4OiRzcmMsIChpOCBpbW06JGFtdCkpKSwNCisgICAgICAgICAgICAodjJpNjQgKFZQU0xMRFFyaSBWUjEyODokc3JjLCAoQllURV9pbW0gaW1tOiRhbXQpKSk+Ow0KKyAgZGVmIDogUGF0PCh2Mmk2NCAoWDg2dnNociAgVlIxMjg6JHNyYywgKGk4IGltbTokYW10KSkpLA0KKyAgICAgICAgICAgICh2Mmk2NCAoVlBTUkxEUXJpIFZSMTI4OiRzcmMsIChCWVRFX2ltbSBpbW06JGFtdCkpKT47DQorfQ0KKw0KK2xldCBQcmVkaWNhdGVzID0gW0hhc1NTRTJdIGluIHsNCisgIGRlZiA6IFBhdDwoaW50X3g4Nl9zc2UyX3BzbGxfZHEgVlIxMjg6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgICAgKHYyaTY0IChQU0xMRFFyaSBWUjEyODokc3JjMSwgKEJZVEVfaW1tIGltbTokc3JjMikpKT47DQorICBkZWYgOiBQYXQ8KGludF94ODZfc3NlMl9wc3JsX2RxIFZSMTI4OiRzcmMxLCBpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICh2Mmk2NCAoUFNSTERRcmkgVlIxMjg6JHNyYzEsIChCWVRFX2ltbSBpbW06JHNyYzIpKSk+Ow0KKyAgZGVmIDogUGF0PChpbnRfeDg2X3NzZTJfcHNsbF9kcV9icyBWUjEyODokc3JjMSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAodjJpNjQgKFBTTExEUXJpIFZSMTI4OiRzcmMxLCBpbW06JHNyYzIpKT47DQorICBkZWYgOiBQYXQ8KGludF94ODZfc3NlMl9wc3JsX2RxX2JzIFZSMTI4OiRzcmMxLCBpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICh2Mmk2NCAoUFNSTERRcmkgVlIxMjg6JHNyYzEsIGltbTokc3JjMikpPjsNCisgIGRlZiA6IFBhdDwodjJmNjQgKFg4NmZzcmwgVlIxMjg6JHNyYzEsIGkzMmltbVNFeHQ4OiRzcmMyKSksDQorICAgICAgICAgICAgKHYyZjY0IChQU1JMRFFyaSBWUjEyODokc3JjMSwgKEJZVEVfaW1tIGltbTokc3JjMikpKT47DQorDQorICAvLyBTaGlmdCB1cCAvIGRvd24gYW5kIGluc2VydCB6ZXJvJ3MuDQorICBkZWYgOiBQYXQ8KHYyaTY0IChYODZ2c2hsICBWUjEyODokc3JjLCAoaTggaW1tOiRhbXQpKSksDQorICAgICAgICAgICAgKHYyaTY0IChQU0xMRFFyaSBWUjEyODokc3JjLCAoQllURV9pbW0gaW1tOiRhbXQpKSk+Ow0KKyAgZGVmIDogUGF0PCh2Mmk2NCAoWDg2dnNociAgVlIxMjg6JHNyYywgKGk4IGltbTokYW10KSkpLA0KKyAgICAgICAgICAgICh2Mmk2NCAoUFNSTERRcmkgVlIxMjg6JHNyYywgKEJZVEVfaW1tIGltbTokYW10KSkpPjsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRTIgLSBQYWNrZWQgSW50ZWdlciBDb21wYXJpc29uIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisgIGRlZm0gVlBDTVBFUUIgIDogUERJX2Jpbm9wX3JtX2ludDwweDc0LCAidnBjbXBlcWIiLCBpbnRfeDg2X3NzZTJfcGNtcGVxX2IsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBDTVBFUVcgIDogUERJX2Jpbm9wX3JtX2ludDwweDc1LCAidnBjbXBlcXciLCBpbnRfeDg2X3NzZTJfcGNtcGVxX3csIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBDTVBFUUQgIDogUERJX2Jpbm9wX3JtX2ludDwweDc2LCAidnBjbXBlcWQiLCBpbnRfeDg2X3NzZTJfcGNtcGVxX2QsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBDTVBHVEIgIDogUERJX2Jpbm9wX3JtX2ludDwweDY0LCAidnBjbXBndGIiLCBpbnRfeDg2X3NzZTJfcGNtcGd0X2IsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBDTVBHVFcgIDogUERJX2Jpbm9wX3JtX2ludDwweDY1LCAidnBjbXBndHciLCBpbnRfeDg2X3NzZTJfcGNtcGd0X3csIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBDTVBHVEQgIDogUERJX2Jpbm9wX3JtX2ludDwweDY2LCAidnBjbXBndGQiLCBpbnRfeDg2X3NzZTJfcGNtcGd0X2QsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCit9DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KKyAgZGVmbSBQQ01QRVFCICA6IFBESV9iaW5vcF9ybV9pbnQ8MHg3NCwgInBjbXBlcWIiLCBpbnRfeDg2X3NzZTJfcGNtcGVxX2IsIDE+Ow0KKyAgZGVmbSBQQ01QRVFXICA6IFBESV9iaW5vcF9ybV9pbnQ8MHg3NSwgInBjbXBlcXciLCBpbnRfeDg2X3NzZTJfcGNtcGVxX3csIDE+Ow0KKyAgZGVmbSBQQ01QRVFEICA6IFBESV9iaW5vcF9ybV9pbnQ8MHg3NiwgInBjbXBlcWQiLCBpbnRfeDg2X3NzZTJfcGNtcGVxX2QsIDE+Ow0KKyAgZGVmbSBQQ01QR1RCICA6IFBESV9iaW5vcF9ybV9pbnQ8MHg2NCwgInBjbXBndGIiLCBpbnRfeDg2X3NzZTJfcGNtcGd0X2I+Ow0KKyAgZGVmbSBQQ01QR1RXICA6IFBESV9iaW5vcF9ybV9pbnQ8MHg2NSwgInBjbXBndHciLCBpbnRfeDg2X3NzZTJfcGNtcGd0X3c+Ow0KKyAgZGVmbSBQQ01QR1REICA6IFBESV9iaW5vcF9ybV9pbnQ8MHg2NiwgInBjbXBndGQiLCBpbnRfeDg2X3NzZTJfcGNtcGd0X2Q+Ow0KK30gLy8gQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0Ig0KKw0KK2RlZiA6IFBhdDwodjE2aTggKFg4NnBjbXBlcWIgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSksDQorICAgICAgICAgIChQQ01QRVFCcnIgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKT47DQorZGVmIDogUGF0PCh2MTZpOCAoWDg2cGNtcGVxYiBWUjEyODokc3JjMSwgKG1lbW9wIGFkZHI6JHNyYzIpKSksDQorICAgICAgICAgIChQQ01QRVFCcm0gVlIxMjg6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHY4aTE2IChYODZwY21wZXF3IFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpLA0KKyAgICAgICAgICAoUENNUEVRV3JyIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjhpMTYgKFg4NnBjbXBlcXcgVlIxMjg6JHNyYzEsIChtZW1vcCBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAoUENNUEVRV3JtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorZGVmIDogUGF0PCh2NGkzMiAoWDg2cGNtcGVxZCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKFBDTVBFUURyciBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHY0aTMyIChYODZwY21wZXFkIFZSMTI4OiRzcmMxLCAobWVtb3AgYWRkcjokc3JjMikpKSwNCisgICAgICAgICAgKFBDTVBFUURybSBWUjEyODokc3JjMSwgYWRkcjokc3JjMik+Ow0KKw0KK2RlZiA6IFBhdDwodjE2aTggKFg4NnBjbXBndGIgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSksDQorICAgICAgICAgIChQQ01QR1RCcnIgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKT47DQorZGVmIDogUGF0PCh2MTZpOCAoWDg2cGNtcGd0YiBWUjEyODokc3JjMSwgKG1lbW9wIGFkZHI6JHNyYzIpKSksDQorICAgICAgICAgIChQQ01QR1RCcm0gVlIxMjg6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHY4aTE2IChYODZwY21wZ3R3IFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpLA0KKyAgICAgICAgICAoUENNUEdUV3JyIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjhpMTYgKFg4NnBjbXBndHcgVlIxMjg6JHNyYzEsIChtZW1vcCBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAoUENNUEdUV3JtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorZGVmIDogUGF0PCh2NGkzMiAoWDg2cGNtcGd0ZCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKFBDTVBHVERyciBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHY0aTMyIChYODZwY21wZ3RkIFZSMTI4OiRzcmMxLCAobWVtb3AgYWRkcjokc3JjMikpKSwNCisgICAgICAgICAgKFBDTVBHVERybSBWUjEyODokc3JjMSwgYWRkcjokc3JjMik+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0UyIC0gUGFja2VkIEludGVnZXIgUGFjayBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbiB7DQorZGVmbSBWUEFDS1NTV0IgOiBQRElfYmlub3Bfcm1faW50PDB4NjMsICJ2cGFja3Nzd2IiLCBpbnRfeDg2X3NzZTJfcGFja3Nzd2JfMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwPiwgVkVYXzRWOw0KK2RlZm0gVlBBQ0tTU0RXIDogUERJX2Jpbm9wX3JtX2ludDwweDZCLCAidnBhY2tzc2R3IiwgaW50X3g4Nl9zc2UyX3BhY2tzc2R3XzEyOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMD4sIFZFWF80VjsNCitkZWZtIFZQQUNLVVNXQiA6IFBESV9iaW5vcF9ybV9pbnQ8MHg2NywgInZwYWNrdXN3YiIsIGludF94ODZfc3NlMl9wYWNrdXN3Yl8xMjgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDA+LCBWRVhfNFY7DQorfQ0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCitkZWZtIFBBQ0tTU1dCIDogUERJX2Jpbm9wX3JtX2ludDwweDYzLCAicGFja3Nzd2IiLCBpbnRfeDg2X3NzZTJfcGFja3Nzd2JfMTI4PjsNCitkZWZtIFBBQ0tTU0RXIDogUERJX2Jpbm9wX3JtX2ludDwweDZCLCAicGFja3NzZHciLCBpbnRfeDg2X3NzZTJfcGFja3NzZHdfMTI4PjsNCitkZWZtIFBBQ0tVU1dCIDogUERJX2Jpbm9wX3JtX2ludDwweDY3LCAicGFja3Vzd2IiLCBpbnRfeDg2X3NzZTJfcGFja3Vzd2JfMTI4PjsNCit9IC8vIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCINCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMiAtIFBhY2tlZCBJbnRlZ2VyIFNodWZmbGUgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2xldCBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQgaW4gew0KK211bHRpY2xhc3Mgc3NlMl9wc2h1ZmZsZTxzdHJpbmcgT3Bjb2RlU3RyLCBWYWx1ZVR5cGUgdnQsIFBhdEZyYWcgcHNodWZfZnJhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgUGF0RnJhZyBiY19mcmFnPiB7DQorZGVmIHJpIDogSWk4PDB4NzAsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodnQgKHBzaHVmX2ZyYWc6JHNyYzIgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuZGVmKSkpKV0+Ow0KK2RlZiBtaSA6IElpODwweDcwLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpMTI4bWVtOiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodnQgKHBzaHVmX2ZyYWc6JHNyYzINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiY19mcmFnIChtZW1vcHYyaTY0IGFkZHI6JHNyYzEpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmRlZikpKSldPjsNCit9DQorfSAvLyBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQNCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisgIGxldCBBZGRlZENvbXBsZXhpdHkgPSA1IGluDQorICBkZWZtIFZQU0hVRkQgOiBzc2UyX3BzaHVmZmxlPCJ2cHNodWZkIiwgdjRpMzIsIHBzaHVmZCwgYmNfdjRpMzI+LCBPcFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCisNCisgIC8vIFNTRTIgd2l0aCBJbW1UID09IEltbTggYW5kIFhTIHByZWZpeC4NCisgIGRlZm0gVlBTSFVGSFcgOiBzc2UyX3BzaHVmZmxlPCJ2cHNodWZodyIsIHY4aTE2LCBwc2h1Zmh3LCBiY192OGkxNj4sIFhTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorDQorICAvLyBTU0UyIHdpdGggSW1tVCA9PSBJbW04IGFuZCBYRCBwcmVmaXguDQorICBkZWZtIFZQU0hVRkxXIDogc3NlMl9wc2h1ZmZsZTwidnBzaHVmbHciLCB2OGkxNiwgcHNodWZsdywgYmNfdjhpMTY+LCBYRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK30NCisNCitsZXQgUHJlZGljYXRlcyA9IFtIYXNTU0UyXSBpbiB7DQorICBsZXQgQWRkZWRDb21wbGV4aXR5ID0gNSBpbg0KKyAgZGVmbSBQU0hVRkQgOiBzc2UyX3BzaHVmZmxlPCJwc2h1ZmQiLCB2NGkzMiwgcHNodWZkLCBiY192NGkzMj4sIFRCLCBPcFNpemU7DQorDQorICAvLyBTU0UyIHdpdGggSW1tVCA9PSBJbW04IGFuZCBYUyBwcmVmaXguDQorICBkZWZtIFBTSFVGSFcgOiBzc2UyX3BzaHVmZmxlPCJwc2h1Zmh3IiwgdjhpMTYsIHBzaHVmaHcsIGJjX3Y4aTE2PiwgWFM7DQorDQorICAvLyBTU0UyIHdpdGggSW1tVCA9PSBJbW04IGFuZCBYRCBwcmVmaXguDQorICBkZWZtIFBTSFVGTFcgOiBzc2UyX3BzaHVmZmxlPCJwc2h1Zmx3IiwgdjhpMTYsIHBzaHVmbHcsIGJjX3Y4aTE2PiwgWEQ7DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0UyIC0gUGFja2VkIEludGVnZXIgVW5wYWNrIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitsZXQgRXhlRG9tYWluID0gU1NFUGFja2VkSW50IGluIHsNCittdWx0aWNsYXNzIHNzZTJfdW5wYWNrPGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLCBWYWx1ZVR5cGUgdnQsDQorICAgICAgICAgICAgICAgICAgICAgICBQYXRGcmFnIHVucF9mcmFnLCBQYXRGcmFnIGJjX2ZyYWcsIGJpdCBJczJBZGRyID0gMT4gew0KKyAgZGVmIHJyIDogUERJPG9wYywgTVJNU3JjUmVnLA0KKyAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiksDQorICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgIFsoc2V0IFZSMTI4OiRkc3QsICh2dCAodW5wX2ZyYWcgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSkpXT47DQorICBkZWYgcm0gOiBQREk8b3BjLCBNUk1TcmNNZW0sDQorICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIGkxMjhtZW06JHNyYzIpLA0KKyAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICBbKHNldCBWUjEyODokZHN0LCAodW5wX2ZyYWcgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiY19mcmFnIChtZW1vcHYyaTY0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyOiRzcmMyKSkpKV0+Ow0KK30NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisgIGRlZm0gVlBVTlBDS0xCVyAgOiBzc2UyX3VucGFjazwweDYwLCAidnB1bnBja2xidyIsIHYxNmk4LCB1bnBja2wsIGJjX3YxNmk4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQVU5QQ0tMV0QgIDogc3NlMl91bnBhY2s8MHg2MSwgInZwdW5wY2tsd2QiLCB2OGkxNiwgdW5wY2tsLCBiY192OGkxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWUFVOUENLTERRICA6IHNzZTJfdW5wYWNrPDB4NjIsICJ2cHVucGNrbGRxIiwgdjRpMzIsIHVucGNrbCwgYmNfdjRpMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisNCisgIC8vLyBGSVhNRTogd2UgY291bGQgZWxpbWluYXRlIHRoaXMgYW5kIHVzZSBzc2UyX3VucGFjayBpbnN0ZWFkIGlmIHRibGdlbg0KKyAgLy8vIGtuZXcgdG8gY29sbGFwc2UgKGJpdGNvbnZlcnQgVlQgdG8gVlQpIGludG8gaXRzIG9wZXJhbmQuDQorICBkZWYgVlBVTlBDS0xRRFFyciA6IFBESTwweDZDLCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJ2cHVucGNrbHFkcVx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyaTY0ICh1bnBja2wgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSkpXT4sIFZFWF80VjsNCisgIGRlZiBWUFVOUENLTFFEUXJtIDogUERJPDB4NkMsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIGkxMjhtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAidnB1bnBja2xxZHFcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCAodW5wY2tsIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbW9wdjJpNjQgYWRkcjokc3JjMikpKSldPiwgVkVYXzRWOw0KKw0KKyAgZGVmbSBWUFVOUENLSEJXICA6IHNzZTJfdW5wYWNrPDB4NjgsICJ2cHVucGNraGJ3IiwgdjE2aTgsIHVucGNraCwgYmNfdjE2aTgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBVTlBDS0hXRCAgOiBzc2UyX3VucGFjazwweDY5LCAidnB1bnBja2h3ZCIsIHY4aTE2LCB1bnBja2gsIGJjX3Y4aTE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQVU5QQ0tIRFEgIDogc3NlMl91bnBhY2s8MHg2QSwgInZwdW5wY2toZHEiLCB2NGkzMiwgdW5wY2toLCBiY192NGkzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPiwgVkVYXzRWOw0KKw0KKyAgLy8vIEZJWE1FOiB3ZSBjb3VsZCBlbGltaW5hdGUgdGhpcyBhbmQgdXNlIHNzZTJfdW5wYWNrIGluc3RlYWQgaWYgdGJsZ2VuDQorICAvLy8ga25ldyB0byBjb2xsYXBzZSAoYml0Y29udmVydCBWVCB0byBWVCkgaW50byBpdHMgb3BlcmFuZC4NCisgIGRlZiBWUFVOUENLSFFEUXJyIDogUERJPDB4NkQsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgInZwdW5wY2tocWRxXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAodjJpNjQgKHVucGNraCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSldPiwgVkVYXzRWOw0KKyAgZGVmIFZQVU5QQ0tIUURRcm0gOiBQREk8MHg2RCwgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBpMTI4bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAidnB1bnBja2hxZHFcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCAodW5wY2toIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbW9wdjJpNjQgYWRkcjokc3JjMikpKSldPiwgVkVYXzRWOw0KK30NCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorICBkZWZtIFBVTlBDS0xCVyAgOiBzc2UyX3VucGFjazwweDYwLCAicHVucGNrbGJ3IiwgdjE2aTgsIHVucGNrbCwgYmNfdjE2aTg+Ow0KKyAgZGVmbSBQVU5QQ0tMV0QgIDogc3NlMl91bnBhY2s8MHg2MSwgInB1bnBja2x3ZCIsIHY4aTE2LCB1bnBja2wsIGJjX3Y4aTE2PjsNCisgIGRlZm0gUFVOUENLTERRICA6IHNzZTJfdW5wYWNrPDB4NjIsICJwdW5wY2tsZHEiLCB2NGkzMiwgdW5wY2tsLCBiY192NGkzMj47DQorDQorICAvLy8gRklYTUU6IHdlIGNvdWxkIGVsaW1pbmF0ZSB0aGlzIGFuZCB1c2Ugc3NlMl91bnBhY2sgaW5zdGVhZCBpZiB0YmxnZW4NCisgIC8vLyBrbmV3IHRvIGNvbGxhcHNlIChiaXRjb252ZXJ0IFZUIHRvIFZUKSBpbnRvIGl0cyBvcGVyYW5kLg0KKyAgZGVmIFBVTlBDS0xRRFFyciA6IFBESTwweDZDLCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICJwdW5wY2tscWRxXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyaTY0ICh1bnBja2wgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSkpXT47DQorICBkZWYgUFVOUENLTFFEUXJtIDogUERJPDB4NkMsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIGkxMjhtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAicHVucGNrbHFkcVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCAodW5wY2tsIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbW9wdjJpNjQgYWRkcjokc3JjMikpKSldPjsNCisNCisgIGRlZm0gUFVOUENLSEJXICA6IHNzZTJfdW5wYWNrPDB4NjgsICJwdW5wY2toYnciLCB2MTZpOCwgdW5wY2toLCBiY192MTZpOD47DQorICBkZWZtIFBVTlBDS0hXRCAgOiBzc2UyX3VucGFjazwweDY5LCAicHVucGNraHdkIiwgdjhpMTYsIHVucGNraCwgYmNfdjhpMTY+Ow0KKyAgZGVmbSBQVU5QQ0tIRFEgIDogc3NlMl91bnBhY2s8MHg2QSwgInB1bnBja2hkcSIsIHY0aTMyLCB1bnBja2gsIGJjX3Y0aTMyPjsNCisNCisgIC8vLyBGSVhNRTogd2UgY291bGQgZWxpbWluYXRlIHRoaXMgYW5kIHVzZSBzc2UyX3VucGFjayBpbnN0ZWFkIGlmIHRibGdlbg0KKyAgLy8vIGtuZXcgdG8gY29sbGFwc2UgKGJpdGNvbnZlcnQgVlQgdG8gVlQpIGludG8gaXRzIG9wZXJhbmQuDQorICBkZWYgUFVOUENLSFFEUXJyIDogUERJPDB4NkQsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgInB1bnBja2hxZHFcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAodjJpNjQgKHVucGNraCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSldPjsNCisgIGRlZiBQVU5QQ0tIUURRcm0gOiBQREk8MHg2RCwgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBpMTI4bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAicHVucGNraHFkcVx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCAodW5wY2toIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbW9wdjJpNjQgYWRkcjokc3JjMikpKSldPjsNCit9DQorDQorfSAvLyBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMiAtIFBhY2tlZCBJbnRlZ2VyIEV4dHJhY3QgYW5kIEluc2VydA0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCitsZXQgRXhlRG9tYWluID0gU1NFUGFja2VkSW50IGluIHsNCittdWx0aWNsYXNzIHNzZTJfcGluc3J3PGJpdCBJczJBZGRyID0gMT4gew0KKyAgZGVmIHJyaSA6IElpODwweEM0LCBNUk1TcmNSZWcsDQorICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgR1IzMjokc3JjMiwgaTMyaThpbW06JHNyYzMpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICJwaW5zcndcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICAidnBpbnNyd1x0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAoWDg2cGluc3J3IFZSMTI4OiRzcmMxLCBHUjMyOiRzcmMyLCBpbW06JHNyYzMpKV0+Ow0KKyAgZGVmIHJtaSA6IElpODwweEM0LCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICBpMTZtZW06JHNyYzIsIGkzMmk4aW1tOiRzcmMzKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAicGluc3J3XHR7JHNyYzMsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAkc3JjM30iLA0KKyAgICAgICAgICAgInZwaW5zcndcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgKFg4NnBpbnNydyBWUjEyODokc3JjMSwgKGV4dGxvYWRpMTYgYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICBpbW06JHNyYzMpKV0+Ow0KK30NCisNCisvLyBFeHRyYWN0DQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbg0KK2RlZiBWUEVYVFJXcmkgOiBJaTg8MHhDNSwgTVJNU3JjUmVnLA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1IzMjokZHN0KSwgKGlucyBWUjEyODokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgInZwZXh0cndcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChYODZwZXh0cncgKHY4aTE2IFZSMTI4OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JHNyYzIpKV0+LCBPcFNpemUsIFZFWDsNCitkZWYgUEVYVFJXcmkgOiBQRElpODwweEM1LCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAicGV4dHJ3XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoWDg2cGV4dHJ3ICh2OGkxNiBWUjEyODokc3JjMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRzcmMyKSldPjsNCisNCisvLyBJbnNlcnQNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisgIGRlZm0gVlBJTlNSVyA6IHNzZTJfcGluc3J3PDA+LCBPcFNpemUsIFZFWF80VjsNCisgIGRlZiAgVlBJTlNSV3JyNjRpIDogSWk4PDB4QzQsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIEdSNjQ6JHNyYzIsIGkzMmk4aW1tOiRzcmMzKSwNCisgICAgICAgInZwaW5zcndcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgW10+LCBPcFNpemUsIFZFWF80VjsNCit9DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4NCisgIGRlZm0gUElOU1JXIDogc3NlMl9waW5zcncsIFRCLCBPcFNpemUsIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorfSAvLyBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMiAtIFBhY2tlZCBNYXNrIENyZWF0aW9uDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2xldCBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQgaW4gew0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCitkZWYgVlBNT1ZNU0tCcnIgIDogVlBESTwweEQ3LCBNUk1TcmNSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAicG1vdm1za2JcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKGludF94ODZfc3NlMl9wbW92bXNrYl8xMjggVlIxMjg6JHNyYykpXT4sIFZFWDsNCitkZWYgVlBNT1ZNU0tCcjY0ciA6IFZQREk8MHhENywgTVJNU3JjUmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgInBtb3Ztc2tiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYOw0KK30NCitkZWYgUE1PVk1TS0JyciA6IFBESTwweEQ3LCBNUk1TcmNSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAicG1vdm1za2JcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKGludF94ODZfc3NlMl9wbW92bXNrYl8xMjggVlIxMjg6JHNyYykpXT47DQorDQorfSAvLyBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMiAtIENvbmRpdGlvbmFsIFN0b3JlDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK2xldCBFeGVEb21haW4gPSBTU0VQYWNrZWRJbnQgaW4gew0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluIHsNCitsZXQgVXNlcyA9IFtFREldIGluDQorZGVmIFZNQVNLTU9WRFFVIDogVlBESTwweEY3LCBNUk1TcmNSZWcsIChvdXRzKSwNCisgICAgICAgICAgIChpbnMgVlIxMjg6JHNyYywgVlIxMjg6JG1hc2spLA0KKyAgICAgICAgICAgIm1hc2ttb3ZkcXVcdHskbWFzaywgJHNyY3wkc3JjLCAkbWFza30iLA0KKyAgICAgICAgICAgWyhpbnRfeDg2X3NzZTJfbWFza21vdl9kcXUgVlIxMjg6JHNyYywgVlIxMjg6JG1hc2ssIEVESSldPiwgVkVYOw0KK2xldCBVc2VzID0gW1JESV0gaW4NCitkZWYgVk1BU0tNT1ZEUVU2NCA6IFZQREk8MHhGNywgTVJNU3JjUmVnLCAob3V0cyksDQorICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMsIFZSMTI4OiRtYXNrKSwNCisgICAgICAgICAgICJtYXNrbW92ZHF1XHR7JG1hc2ssICRzcmN8JHNyYywgJG1hc2t9IiwNCisgICAgICAgICAgIFsoaW50X3g4Nl9zc2UyX21hc2ttb3ZfZHF1IFZSMTI4OiRzcmMsIFZSMTI4OiRtYXNrLCBSREkpXT4sIFZFWDsNCit9DQorDQorbGV0IFVzZXMgPSBbRURJXSBpbg0KK2RlZiBNQVNLTU9WRFFVIDogUERJPDB4RjcsIE1STVNyY1JlZywgKG91dHMpLCAoaW5zIFZSMTI4OiRzcmMsIFZSMTI4OiRtYXNrKSwNCisgICAgICAgICAgICJtYXNrbW92ZHF1XHR7JG1hc2ssICRzcmN8JHNyYywgJG1hc2t9IiwNCisgICAgICAgICAgIFsoaW50X3g4Nl9zc2UyX21hc2ttb3ZfZHF1IFZSMTI4OiRzcmMsIFZSMTI4OiRtYXNrLCBFREkpXT47DQorbGV0IFVzZXMgPSBbUkRJXSBpbg0KK2RlZiBNQVNLTU9WRFFVNjQgOiBQREk8MHhGNywgTVJNU3JjUmVnLCAob3V0cyksIChpbnMgVlIxMjg6JHNyYywgVlIxMjg6JG1hc2spLA0KKyAgICAgICAgICAgIm1hc2ttb3ZkcXVcdHskbWFzaywgJHNyY3wkc3JjLCAkbWFza30iLA0KKyAgICAgICAgICAgWyhpbnRfeDg2X3NzZTJfbWFza21vdl9kcXUgVlIxMjg6JHNyYywgVlIxMjg6JG1hc2ssIFJESSldPjsNCisNCit9IC8vIEV4ZURvbWFpbiA9IFNTRVBhY2tlZEludA0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0UyIC0gTW92ZSBEb3VibGV3b3JkDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIE1vdmUgSW50IERvdWJsZXdvcmQgdG8gUGFja2VkIERvdWJsZSBJbnQNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorZGVmIFZNT1ZESTJQRElyciA6IFZQREk8MHg2RSwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoc2NhbGFyX3RvX3ZlY3RvciBHUjMyOiRzcmMpKSldPiwgVkVYOw0KK2RlZiBWTU9WREkyUERJcm0gOiBWUERJPDB4NkUsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGkzMiBhZGRyOiRzcmMpKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCit9DQorZGVmIE1PVkRJMlBESXJyIDogUERJPDB4NkUsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAodjRpMzIgKHNjYWxhcl90b192ZWN0b3IgR1IzMjokc3JjKSkpXT47DQorZGVmIE1PVkRJMlBESXJtIDogUERJPDB4NkUsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGkzMiBhZGRyOiRzcmMpKSkpXT47DQorDQorDQorLy8gTW92ZSBJbnQgRG91Ymxld29yZCB0byBTaW5nbGUgU2NhbGFyDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2RlZiBWTU9WREkyU1NyciAgOiBWUERJPDB4NkUsIE1STVNyY1JlZywgKG91dHMgRlIzMjokZHN0KSwgKGlucyBHUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUjMyOiRkc3QsIChiaXRjb252ZXJ0IEdSMzI6JHNyYykpXT4sIFZFWDsNCisNCitkZWYgVk1PVkRJMlNTcm0gIDogVlBESTwweDZFLCBNUk1TcmNNZW0sIChvdXRzIEZSMzI6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUjMyOiRkc3QsIChiaXRjb252ZXJ0IChsb2FkaTMyIGFkZHI6JHNyYykpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorfQ0KK2RlZiBNT1ZESTJTU3JyICA6IFBESTwweDZFLCBNUk1TcmNSZWcsIChvdXRzIEZSMzI6JGRzdCksIChpbnMgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgRlIzMjokZHN0LCAoYml0Y29udmVydCBHUjMyOiRzcmMpKV0+Ow0KKw0KK2RlZiBNT1ZESTJTU3JtICA6IFBESTwweDZFLCBNUk1TcmNNZW0sIChvdXRzIEZSMzI6JGRzdCksIChpbnMgaTMybWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBGUjMyOiRkc3QsIChiaXRjb252ZXJ0IChsb2FkaTMyIGFkZHI6JHNyYykpKV0+Ow0KKw0KKy8vIE1vdmUgUGFja2VkIERvdWJsZXdvcmQgSW50IHRvIFBhY2tlZCBEb3VibGUgSW50DQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2RlZiBWTU9WUERJMkRJcnIgIDogVlBESTwweDdFLCBNUk1EZXN0UmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHZlY3Rvcl9leHRyYWN0ICh2NGkzMiBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlQVFIgMCkpKV0+LCBWRVg7DQorZGVmIFZNT1ZQREkyREltciAgOiBWUERJPDB4N0UsIE1STURlc3RNZW0sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgICAgICAgIChpbnMgaTMybWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGkzMiAodmVjdG9yX2V4dHJhY3QgKHY0aTMyIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaVBUUiAwKSkpLCBhZGRyOiRkc3QpXT4sIFZFWDsNCit9DQorZGVmIE1PVlBESTJESXJyICA6IFBESTwweDdFLCBNUk1EZXN0UmVnLCAob3V0cyBHUjMyOiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKHZlY3Rvcl9leHRyYWN0ICh2NGkzMiBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlQVFIgMCkpKV0+Ow0KK2RlZiBNT1ZQREkyREltciAgOiBQREk8MHg3RSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3ZkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChpMzIgKHZlY3Rvcl9leHRyYWN0ICh2NGkzMiBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlQVFIgMCkpKSwgYWRkcjokZHN0KV0+Ow0KKw0KKy8vIE1vdmUgU2NhbGFyIFNpbmdsZSB0byBEb3VibGUgSW50DQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2RlZiBWTU9WU1MyRElyciAgOiBWUERJPDB4N0UsIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksIChpbnMgRlIzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LCAoYml0Y29udmVydCBGUjMyOiRzcmMpKV0+LCBWRVg7DQorZGVmIFZNT1ZTUzJESW1yICA6IFZQREk8MHg3RSwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGkzMm1lbTokZHN0LCBGUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChpMzIgKGJpdGNvbnZlcnQgRlIzMjokc3JjKSksIGFkZHI6JGRzdCldPiwgVkVYOw0KK30NCitkZWYgTU9WU1MyRElyciAgOiBQREk8MHg3RSwgTVJNRGVzdFJlZywgKG91dHMgR1IzMjokZHN0KSwgKGlucyBGUjMyOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsIChiaXRjb252ZXJ0IEZSMzI6JHNyYykpXT47DQorZGVmIE1PVlNTMkRJbXIgIDogUERJPDB4N0UsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpMzJtZW06JGRzdCwgRlIzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdmRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoaTMyIChiaXRjb252ZXJ0IEZSMzI6JHNyYykpLCBhZGRyOiRkc3QpXT47DQorDQorLy8gbW92ZCAvIG1vdnEgdG8gWE1NIHJlZ2lzdGVyIHplcm8tZXh0ZW5kcw0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAxNSwgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorZGVmIFZNT1ZaREkyUERJcnIgOiBWUERJPDB4NkUsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3ZkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodjRpMzIgKFg4NnZ6bW92bA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIChzY2FsYXJfdG9fdmVjdG9yIEdSMzI6JHNyYykpKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorZGVmIFZNT1ZaUUkyUFFJcnIgOiBWUERJPDB4NkUsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgR1I2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3Z7ZHxxfVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCAvLyBYODYtNjQgb25seQ0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHYyaTY0IChYODZ2em1vdmwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCAoc2NhbGFyX3RvX3ZlY3RvciBHUjY0OiRzcmMpKSkpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYLCBWRVhfVzsNCit9DQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDE1IGluIHsNCitkZWYgTU9WWkRJMlBESXJyIDogUERJPDB4NkUsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgR1IzMjokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3ZkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodjRpMzIgKFg4NnZ6bW92bA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIChzY2FsYXJfdG9fdmVjdG9yIEdSMzI6JHNyYykpKSkpXT47DQorZGVmIE1PVlpRSTJQUUlyciA6IFJQREk8MHg2RSwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBHUjY0OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdntkfHF9XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIC8vIFg4Ni02NCBvbmx5DQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodjJpNjQgKFg4NnZ6bW92bA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyaTY0IChzY2FsYXJfdG9fdmVjdG9yIEdSNjQ6JHNyYykpKSkpXT47DQorfQ0KKw0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAyMCBpbiB7DQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4NCitkZWYgVk1PVlpESTJQRElybSA6IFZQREk8MHg2RSwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIChYODZ2em1vdmwgKHY0aTMyIChzY2FsYXJfdG9fdmVjdG9yDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWRpMzIgYWRkcjokc3JjKSkpKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK2RlZiBNT1ZaREkyUERJcm0gOiBQREk8MHg2RSwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpMzJtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKHY0aTMyIChYODZ2em1vdmwgKHY0aTMyIChzY2FsYXJfdG9fdmVjdG9yDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWRpMzIgYWRkcjokc3JjKSkpKSkpXT47DQorDQorZGVmIDogUGF0PCh2NGkzMiAoWDg2dnptb3ZsIChsb2FkdjRpMzIgYWRkcjokc3JjKSkpLA0KKyAgICAgICAgICAgIChNT1ZaREkyUERJcm0gYWRkcjokc3JjKT47DQorZGVmIDogUGF0PCh2NGkzMiAoWDg2dnptb3ZsIChiY192NGkzMiAobG9hZHY0ZjMyIGFkZHI6JHNyYykpKSksDQorICAgICAgICAgICAgKE1PVlpESTJQRElybSBhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KHY0aTMyIChYODZ2em1vdmwgKGJjX3Y0aTMyIChsb2FkdjJpNjQgYWRkcjokc3JjKSkpKSwNCisgICAgICAgICAgICAoTU9WWkRJMlBESXJtIGFkZHI6JHNyYyk+Ow0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMiAtIE1vdmUgUXVhZHdvcmQNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gTW92ZSBRdWFkd29yZCBJbnQgdG8gUGFja2VkIFF1YWR3b3JkIEludA0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluDQorZGVmIFZNT1ZRSTJQUUlybSA6IEk8MHg3RSwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAidm1vdnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGk2NCBhZGRyOiRzcmMpKSkpXT4sIFhTLA0KKyAgICAgICAgICAgICAgICAgICAgVkVYLCBSZXF1aXJlczxbSGFzQVZYXT47DQorZGVmIE1PVlFJMlBRSXJtIDogSTwweDdFLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGk2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICJtb3ZxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAodjJpNjQgKHNjYWxhcl90b192ZWN0b3IgKGxvYWRpNjQgYWRkcjokc3JjKSkpKV0+LCBYUywNCisgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UyXT47IC8vIFNTRTIgaW5zdHJ1Y3Rpb24gd2l0aCBYUyBQcmVmaXgNCisNCisvLyBNb3ZlIFBhY2tlZCBRdWFkd29yZCBJbnQgdG8gUXVhZHdvcmQgSW50DQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4NCitkZWYgVk1PVlBRSTJRSW1yIDogVlBESTwweEQ2LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92cVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHN0b3JlIChpNjQgKHZlY3Rvcl9leHRyYWN0ICh2Mmk2NCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaVBUUiAwKSkpLCBhZGRyOiRkc3QpXT4sIFZFWDsNCitkZWYgTU9WUFFJMlFJbXIgOiBQREk8MHhENiwgTVJNRGVzdE1lbSwgKG91dHMpLCAoaW5zIGk2NG1lbTokZHN0LCBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSAoaTY0ICh2ZWN0b3JfZXh0cmFjdCAodjJpNjQgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlQVFIgMCkpKSwgYWRkcjokZHN0KV0+Ow0KKw0KK2RlZiA6IFBhdDwoZjY0ICh2ZWN0b3JfZXh0cmFjdCAodjJmNjQgVlIxMjg6JHNyYyksIChpUFRSIDApKSksDQorICAgICAgICAgIChmNjQgKEVYVFJBQ1RfU1VCUkVHICh2MmY2NCBWUjEyODokc3JjKSwgc3ViX3NkKSk+Ow0KKw0KKy8vIFN0b3JlIC8gY29weSBsb3dlciA2NC1iaXRzIG9mIGEgWE1NIHJlZ2lzdGVyLg0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxIGluDQorZGVmIFZNT1ZMUTEyOG1yIDogVlBESTwweEQ2LCBNUk1EZXN0TWVtLCAob3V0cyksIChpbnMgaTY0bWVtOiRkc3QsIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJtb3ZxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhpbnRfeDg2X3NzZTJfc3RvcmVsX2RxIGFkZHI6JGRzdCwgVlIxMjg6JHNyYyldPiwgVkVYOw0KK2RlZiBNT1ZMUTEyOG1yIDogUERJPDB4RDYsIE1STURlc3RNZW0sIChvdXRzKSwgKGlucyBpNjRtZW06JGRzdCwgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgIm1vdnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICBbKGludF94ODZfc3NlMl9zdG9yZWxfZHEgYWRkcjokZHN0LCBWUjEyODokc3JjKV0+Ow0KKw0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAyMCwgaXNBc21QYXJzZXJPbmx5ID0gMSBpbg0KK2RlZiBWTU9WWlFJMlBRSXJtIDogSTwweDdFLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGk2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAidm1vdnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgKHYyaTY0IChYODZ2em1vdmwgKHYyaTY0IChzY2FsYXJfdG9fdmVjdG9yDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkaTY0IGFkZHI6JHNyYykpKSkpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgIFhTLCBWRVgsIFJlcXVpcmVzPFtIYXNBVlhdPjsNCisNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMjAgaW4gew0KK2RlZiBNT1ZaUUkyUFFJcm0gOiBJPDB4N0UsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgaTY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJtb3ZxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCAoWDg2dnptb3ZsICh2Mmk2NCAoc2NhbGFyX3RvX3ZlY3Rvcg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZGk2NCBhZGRyOiRzcmMpKSkpKSldPiwNCisgICAgICAgICAgICAgICAgICAgICBYUywgUmVxdWlyZXM8W0hhc1NTRTJdPjsNCisNCitkZWYgOiBQYXQ8KHYyaTY0IChYODZ2em1vdmwgKGxvYWR2Mmk2NCBhZGRyOiRzcmMpKSksDQorICAgICAgICAgICAgKE1PVlpRSTJQUUlybSBhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KHYyaTY0IChYODZ2em1vdmwgKGJjX3YyaTY0IChsb2FkdjRmMzIgYWRkcjokc3JjKSkpKSwNCisgICAgICAgICAgICAoTU9WWlFJMlBRSXJtIGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjJpNjQgKFg4NnZ6bG9hZCBhZGRyOiRzcmMpKSwgKE1PVlpRSTJQUUlybSBhZGRyOiRzcmMpPjsNCit9DQorDQorLy8gTW92aW5nIGZyb20gWE1NIHRvIFhNTSBhbmQgY2xlYXIgdXBwZXIgNjQgYml0cy4gTm90ZSwgdGhlcmUgaXMgYSBidWcgaW4NCisvLyBJQTMyIGRvY3VtZW50LiBtb3ZxIHhtbTEsIHhtbTIgZG9lcyBjbGVhciB0aGUgaGlnaCBiaXRzLg0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBBZGRlZENvbXBsZXhpdHkgPSAxNSBpbg0KK2RlZiBWTU9WWlBRSUxvMlBRSXJyIDogSTwweDdFLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJ2bW92cVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHYyaTY0IChYODZ2em1vdmwgKHYyaTY0IFZSMTI4OiRzcmMpKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFhTLCBWRVgsIFJlcXVpcmVzPFtIYXNBVlhdPjsNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTUgaW4NCitkZWYgTU9WWlBRSUxvMlBRSXJyIDogSTwweDdFLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodjJpNjQgKFg4NnZ6bW92bCAodjJpNjQgVlIxMjg6JHNyYykpKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgWFMsIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDIwLCBpc0FzbVBhcnNlck9ubHkgPSAxIGluDQorZGVmIFZNT1ZaUFFJTG8yUFFJcm0gOiBJPDB4N0UsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgaTEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAidm1vdnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsICh2Mmk2NCAoWDg2dnptb3ZsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWR2Mmk2NCBhZGRyOiRzcmMpKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgIFhTLCBWRVgsIFJlcXVpcmVzPFtIYXNBVlhdPjsNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMjAgaW4gew0KK2RlZiBNT1ZaUFFJTG8yUFFJcm0gOiBJPDB4N0UsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgaTEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAibW92cVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHYyaTY0IChYODZ2em1vdmwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZHYyaTY0IGFkZHI6JHNyYykpKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgWFMsIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorZGVmIDogUGF0PCh2Mmk2NCAoWDg2dnptb3ZsIChiY192Mmk2NCAobG9hZHY0aTMyIGFkZHI6JHNyYykpKSksDQorICAgICAgICAgICAgKE1PVlpQUUlMbzJQUUlybSBhZGRyOiRzcmMpPjsNCit9DQorDQorLy8gSW5zdHJ1Y3Rpb25zIHRvIG1hdGNoIGluIHRoZSBhc3NlbWJsZXINCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSBpbiB7DQorZGVmIFZNT1ZRczY0cnIgOiBWUERJPDB4NkUsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgR1I2NDokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgIm1vdnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVgsIFZFWF9XOw0KK2RlZiBWTU9WUWQ2NHJyIDogVlBESTwweDdFLCBNUk1EZXN0UmVnLCAob3V0cyBHUjY0OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAibW92cVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWCwgVkVYX1c7DQorLy8gUmVjb2duaXplICJtb3ZkIiB3aXRoIEdSNjQgZGVzdGluYXRpb24sIGJ1dCBlbmNvZGUgYXMgYSAibW92cSINCitkZWYgVk1PVlFkNjRycl9hbHQgOiBWUERJPDB4N0UsIE1STURlc3RSZWcsIChvdXRzIEdSNjQ6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAibW92ZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWCwgVkVYX1c7DQorfQ0KKw0KKy8vIEluc3RydWN0aW9ucyBmb3IgdGhlIGRpc2Fzc2VtYmxlcg0KKy8vIHhyID0gWE1NIHJlZ2lzdGVyDQorLy8geG0gPSBtZW02NA0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4NCitkZWYgVk1PVlF4cnhyOiBJPDB4N0UsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAidm1vdnFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVgsIFhTOw0KK2RlZiBNT1ZReHJ4ciA6IEk8MHg3RSwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICJtb3ZxXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgWFM7DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRTIgLSBNaXNjIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBGbHVzaCBjYWNoZQ0KK2RlZiBDTEZMVVNIIDogSTwweEFFLCBNUk03bSwgKG91dHMpLCAoaW5zIGk4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICJjbGZsdXNoXHQkc3JjIiwgWyhpbnRfeDg2X3NzZTJfY2xmbHVzaCBhZGRyOiRzcmMpXT4sDQorICAgICAgICAgICAgICBUQiwgUmVxdWlyZXM8W0hhc1NTRTJdPjsNCisNCisvLyBMb2FkLCBzdG9yZSwgYW5kIG1lbW9yeSBmZW5jZQ0KK2RlZiBMRkVOQ0UgOiBJPDB4QUUsIE1STV9FOCwgKG91dHMpLCAoaW5zKSwNCisgICAgICAgICAgICAgICAibGZlbmNlIiwgWyhpbnRfeDg2X3NzZTJfbGZlbmNlKV0+LCBUQiwgUmVxdWlyZXM8W0hhc1NTRTJdPjsNCitkZWYgTUZFTkNFIDogSTwweEFFLCBNUk1fRjAsIChvdXRzKSwgKGlucyksDQorICAgICAgICAgICAgICAgIm1mZW5jZSIsIFsoaW50X3g4Nl9zc2UyX21mZW5jZSldPiwgVEIsIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PChYODZMRmVuY2UpLCAoTEZFTkNFKT47DQorZGVmIDogUGF0PChYODZNRmVuY2UpLCAoTUZFTkNFKT47DQorDQorDQorLy8gUGF1c2UuIFRoaXMgImluc3RydWN0aW9uIiBpcyBlbmNvZGVkIGFzICJyZXA7IG5vcCIsIHNvIGV2ZW4gdGhvdWdoIGl0DQorLy8gd2FzIGludHJvZHVjZWQgd2l0aCBTU0UyLCBpdCdzIGJhY2t3YXJkIGNvbXBhdGlibGUuDQorZGVmIFBBVVNFIDogSTwweDkwLCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJwYXVzZSIsIFtdPiwgUkVQOw0KKw0KKy8vIEFsaWFzIGluc3RydWN0aW9ucyB0aGF0IG1hcCB6ZXJvIHZlY3RvciB0byBweG9yIC8geG9ycCogZm9yIHNzZS4NCisvLyBXZSBzZXQgY2FuRm9sZEFzTG9hZCBiZWNhdXNlIHRoaXMgY2FuIGJlIGNvbnZlcnRlZCB0byBhIGNvbnN0YW50LXBvb2wNCisvLyBsb2FkIG9mIGFuIGFsbC1vbmVzIHZhbHVlIGlmIGZvbGRpbmcgaXQgd291bGQgYmUgYmVuZWZpY2lhbC4NCitsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMSwgaXNBc0NoZWFwQXNBTW92ZSA9IDEsIGNhbkZvbGRBc0xvYWQgPSAxLA0KKyAgICBpc0NvZGVHZW5Pbmx5ID0gMSwgRXhlRG9tYWluID0gU1NFUGFja2VkSW50IGluDQorICAvLyBGSVhNRTogQ2hhbmdlIGVuY29kaW5nIHRvIHBzZXVkby4NCisgIGRlZiBWX1NFVEFMTE9ORVMgOiBQREk8MHg3NiwgTVJNSW5pdFJlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMpLCAiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKHY0aTMyIGltbUFsbE9uZXNWKSldPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMyAtIENvbnZlcnNpb24gSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIENvbnZlcnQgUGFja2VkIERvdWJsZSBGUCB0byBQYWNrZWQgRFcgSW50ZWdlcnMNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisvLyBUaGUgYXNzZW1ibGVyIGNhbiByZWNvZ25pemUgcnIgMjU2LWJpdCBpbnN0cnVjdGlvbnMgYnkgc2VlaW5nIGEgeW1tDQorLy8gcmVnaXN0ZXIsIGJ1dCB0aGUgc2FtZSBpc24ndCB0cnVlIHdoZW4gdXNpbmcgbWVtb3J5IG9wZXJhbmRzIGluc3RlYWQuDQorLy8gUHJvdmlkZSBvdGhlciBhc3NlbWJseSByciBhbmQgcm0gZm9ybXMgdG8gYWRkcmVzcyB0aGlzIGV4cGxpY2l0bHkuDQorZGVmIFZDVlRQRDJEUXJyICA6IFMzREk8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJ2Y3Z0cGQyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorZGVmIFZDVlRQRDJEUVhyWXIgIDogUzNESTwweEU2LCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgInZjdnRwZDJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCisNCisvLyBYTU0gb25seQ0KK2RlZiBWQ1ZUUEQyRFFYcnIgOiBTM0RJPDB4RTYsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJ2Y3Z0cGQyZHF4XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYOw0KK2RlZiBWQ1ZUUEQyRFFYcm0gOiBTM0RJPDB4RTYsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgInZjdnRwZDJkcXhcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorDQorLy8gWU1NIG9ubHkNCitkZWYgVkNWVFBEMkRRWXJyIDogUzNESTwweEU2LCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMjU2OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAidmN2dHBkMmRxeVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCitkZWYgVkNWVFBEMkRRWXJtIDogUzNESTwweEU2LCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYyNTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICJ2Y3Z0cGQyZHF5XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYLCBWRVhfTDsNCit9DQorDQorZGVmIENWVFBEMkRRcm0gIDogUzNESTwweEU2LCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAiY3Z0cGQyZHFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2RlZiBDVlRQRDJEUXJyICA6IFMzREk8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJjdnRwZDJkcVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorDQorLy8gQ29udmVydCBQYWNrZWQgRFcgSW50ZWdlcnMgdG8gUGFja2VkIERvdWJsZSBGUA0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KK2RlZiBWQ1ZURFEyUERybSAgOiBTM1NJPDB4RTYsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAidmN2dGRxMnBkXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsIFtdPiwgVkVYOw0KK2RlZiBWQ1ZURFEyUERyciAgOiBTM1NJPDB4RTYsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInZjdnRkcTJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCitkZWYgVkNWVERRMlBEWXJtICA6IFMzU0k8MHhFNiwgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBmMTI4bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgICJ2Y3Z0ZHEycGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+LCBWRVg7DQorZGVmIFZDVlREUTJQRFlyciAgOiBTM1NJPDB4RTYsIE1STVNyY1JlZywgKG91dHMgVlIyNTY6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgInZjdnRkcTJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT4sIFZFWDsNCit9DQorDQorZGVmIENWVERRMlBEcm0gIDogUzNTSTwweEU2LCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGYxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgICAiY3Z0ZHEycGRcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwgW10+Ow0KK2RlZiBDVlREUTJQRHJyICA6IFMzU0k8MHhFNiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJjdnRkcTJwZFx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLCBbXT47DQorDQorLy8gQVZYIDI1Ni1iaXQgcmVnaXN0ZXIgY29udmVyc2lvbiBpbnRyaW5zaWNzDQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF9jdnRkcTJfcGRfMjU2IFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgKFZDVlREUTJQRFlyciBWUjEyODokc3JjKT47DQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF9jdnRkcTJfcGRfMjU2IChtZW1vcHY0aTMyIGFkZHI6JHNyYykpLA0KKyAgICAgICAgICAgKFZDVlREUTJQRFlybSBhZGRyOiRzcmMpPjsNCisNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X2N2dF9wZDJkcV8yNTYgVlIyNTY6JHNyYyksDQorICAgICAgICAgIChWQ1ZUUEQyRFFZcnIgVlIyNTY6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfY3Z0X3BkMmRxXzI1NiAobWVtb3B2NGY2NCBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFZDVlRQRDJEUVlybSBhZGRyOiRzcmMpPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMyAtIE1vdmUgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIFJlcGxpY2F0ZSBTaW5nbGUgRlANCittdWx0aWNsYXNzIHNzZTNfcmVwbGljYXRlX3NmcDxiaXRzPDg+IG9wLCBQYXRGcmFnIHJlcF9mcmFnLCBzdHJpbmcgT3Bjb2RlU3RyPiB7DQorZGVmIHJyIDogUzNTSTxvcCwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAodjRmMzIgKHJlcF9mcmFnDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjg6JHNyYywgKHVuZGVmKSkpKV0+Ow0KK2RlZiBybSA6IFMzU0k8b3AsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAocmVwX2ZyYWcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1vcHY0ZjMyIGFkZHI6JHNyYyksICh1bmRlZikpKV0+Ow0KK30NCisNCittdWx0aWNsYXNzIHNzZTNfcmVwbGljYXRlX3NmcF95PGJpdHM8OD4gb3AsIFBhdEZyYWcgcmVwX2ZyYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgT3Bjb2RlU3RyPiB7DQorZGVmIHJyIDogUzNTSTxvcCwgTVJNU3JjUmVnLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBWUjI1Njokc3JjKSwNCisgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLCBbXT47DQorZGVmIHJtIDogUzNTSTxvcCwgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBmMjU2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksIFtdPjsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbiB7DQorICAvLyBGSVhNRTogTWVyZ2UgYWJvdmUgY2xhc3NlcyB3aGVuIHdlIGhhdmUgcGF0dGVybnMgZm9yIHRoZSB5bW0gdmVyc2lvbg0KKyAgZGVmbSBWTU9WU0hEVVAgIDogc3NlM19yZXBsaWNhdGVfc2ZwPDB4MTYsIG1vdnNoZHVwLCAidm1vdnNoZHVwIj4sIFZFWDsNCisgIGRlZm0gVk1PVlNMRFVQICA6IHNzZTNfcmVwbGljYXRlX3NmcDwweDEyLCBtb3ZzbGR1cCwgInZtb3ZzbGR1cCI+LCBWRVg7DQorICBkZWZtIFZNT1ZTSERVUFkgOiBzc2UzX3JlcGxpY2F0ZV9zZnBfeTwweDE2LCBtb3ZzaGR1cCwgInZtb3ZzaGR1cCI+LCBWRVg7DQorICBkZWZtIFZNT1ZTTERVUFkgOiBzc2UzX3JlcGxpY2F0ZV9zZnBfeTwweDEyLCBtb3ZzbGR1cCwgInZtb3ZzbGR1cCI+LCBWRVg7DQorfQ0KK2RlZm0gTU9WU0hEVVAgOiBzc2UzX3JlcGxpY2F0ZV9zZnA8MHgxNiwgbW92c2hkdXAsICJtb3ZzaGR1cCI+Ow0KK2RlZm0gTU9WU0xEVVAgOiBzc2UzX3JlcGxpY2F0ZV9zZnA8MHgxMiwgbW92c2xkdXAsICJtb3ZzbGR1cCI+Ow0KKw0KKy8vIFJlcGxpY2F0ZSBEb3VibGUgRlANCittdWx0aWNsYXNzIHNzZTNfcmVwbGljYXRlX2RmcDxzdHJpbmcgT3Bjb2RlU3RyPiB7DQorZGVmIHJyICA6IFMzREk8MHgxMiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwodjJmNjQgKG1vdmRkdXAgVlIxMjg6JHNyYywgKHVuZGVmKSkpKV0+Ow0KK2RlZiBybSAgOiBTM0RJPDB4MTIsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgZjY0bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAodjJmNjQgKG1vdmRkdXAgKHNjYWxhcl90b192ZWN0b3IgKGxvYWRmNjQgYWRkcjokc3JjKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5kZWYpKSkpXT47DQorfQ0KKw0KK211bHRpY2xhc3Mgc3NlM19yZXBsaWNhdGVfZGZwX3k8c3RyaW5nIE9wY29kZVN0cj4gew0KK2RlZiByciAgOiBTM0RJPDB4MTIsIE1STVNyY1JlZywgKG91dHMgVlIyNTY6JGRzdCksIChpbnMgVlIyNTY6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgIFtdPjsNCitkZWYgcm0gIDogUzNESTwweDEyLCBNUk1TcmNNZW0sIChvdXRzIFZSMjU2OiRkc3QpLCAoaW5zIGYyNTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgIFtdPjsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbiB7DQorICAvLyBGSVhNRTogTWVyZ2UgYWJvdmUgY2xhc3NlcyB3aGVuIHdlIGhhdmUgcGF0dGVybnMgZm9yIHRoZSB5bW0gdmVyc2lvbg0KKyAgZGVmbSBWTU9WRERVUCAgOiBzc2UzX3JlcGxpY2F0ZV9kZnA8InZtb3ZkZHVwIj4sIFZFWDsNCisgIGRlZm0gVk1PVkREVVBZIDogc3NlM19yZXBsaWNhdGVfZGZwX3k8InZtb3ZkZHVwIj4sIFZFWDsNCit9DQorZGVmbSBNT1ZERFVQIDogc3NlM19yZXBsaWNhdGVfZGZwPCJtb3ZkZHVwIj47DQorDQorLy8gTW92ZSBVbmFsaWduZWQgSW50ZWdlcg0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KKyAgZGVmIFZMRERRVXJtIDogUzNESTwweEYwLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGkxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICJ2bGRkcXVcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlM19sZHVfZHEgYWRkcjokc3JjKSldPiwgVkVYOw0KKyAgZGVmIFZMRERRVVlybSA6IFMzREk8MHhGMCwgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwgKGlucyBpMjU2bWVtOiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAidmxkZHF1XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMjU2OiRkc3QsIChpbnRfeDg2X2F2eF9sZHVfZHFfMjU2IGFkZHI6JHNyYykpXT4sIFZFWDsNCit9DQorZGVmIExERFFVcm0gOiBTM0RJPDB4RjAsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgaTEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgImxkZHF1XHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIsDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTNfbGR1X2RxIGFkZHI6JHNyYykpXT47DQorDQorZGVmIDogUGF0PChtb3ZkZHVwIChiY192MmY2NCAodjJpNjQgKHNjYWxhcl90b192ZWN0b3IgKGxvYWRpNjQgYWRkcjokc3JjKSkpKSwNCisgICAgICAgICAgICAgICAgICAgKHVuZGVmKSksDQorICAgICAgICAgIChNT1ZERFVQcm0gYWRkcjokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UzXT47DQorDQorLy8gU2V2ZXJhbCBNb3ZlIHBhdHRlcm5zDQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDUgaW4gew0KK2RlZiA6IFBhdDwobW92ZGR1cCAobWVtb3B2MmY2NCBhZGRyOiRzcmMpLCAodW5kZWYpKSwNCisgICAgICAgICAgKE1PVkREVVBybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTNdPjsNCitkZWYgOiBQYXQ8KG1vdmRkdXAgKGJjX3Y0ZjMyIChtZW1vcHYyZjY0IGFkZHI6JHNyYykpLCAodW5kZWYpKSwNCisgICAgICAgICAgKE1PVkREVVBybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTNdPjsNCitkZWYgOiBQYXQ8KG1vdmRkdXAgKG1lbW9wdjJpNjQgYWRkcjokc3JjKSwgKHVuZGVmKSksDQorICAgICAgICAgIChNT1ZERFVQcm0gYWRkcjokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UzXT47DQorZGVmIDogUGF0PChtb3ZkZHVwIChiY192NGkzMiAobWVtb3B2Mmk2NCBhZGRyOiRzcmMpKSwgKHVuZGVmKSksDQorICAgICAgICAgIChNT1ZERFVQcm0gYWRkcjokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UzXT47DQorfQ0KKw0KKy8vIHZlY3Rvcl9zaHVmZmxlIHYxLCA8dW5kZWY+IDwxLCAxLCAzLCAzPg0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAxNSBpbg0KK2RlZiA6IFBhdDwodjRpMzIgKG1vdnNoZHVwIFZSMTI4OiRzcmMsICh1bmRlZikpKSwNCisgICAgICAgICAgKE1PVlNIRFVQcnIgVlIxMjg6JHNyYyk+LCBSZXF1aXJlczxbSGFzU1NFM10+Ow0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAyMCBpbg0KK2RlZiA6IFBhdDwodjRpMzIgKG1vdnNoZHVwIChiY192NGkzMiAobWVtb3B2Mmk2NCBhZGRyOiRzcmMpKSwgKHVuZGVmKSkpLA0KKyAgICAgICAgICAoTU9WU0hEVVBybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTNdPjsNCisNCisvLyB2ZWN0b3Jfc2h1ZmZsZSB2MSwgPHVuZGVmPiA8MCwgMCwgMiwgMj4NCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTUgaW4NCisgIGRlZiA6IFBhdDwodjRpMzIgKG1vdnNsZHVwIFZSMTI4OiRzcmMsICh1bmRlZikpKSwNCisgICAgICAgICAgICAoTU9WU0xEVVByciBWUjEyODokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UzXT47DQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDIwIGluDQorICBkZWYgOiBQYXQ8KHY0aTMyIChtb3ZzbGR1cCAoYmNfdjRpMzIgKG1lbW9wdjJpNjQgYWRkcjokc3JjKSksICh1bmRlZikpKSwNCisgICAgICAgICAgICAoTU9WU0xEVVBybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTNdPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMyAtIEFyaXRobWV0aWMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorbXVsdGljbGFzcyBzc2UzX2FkZHN1YjxJbnRyaW5zaWMgSW50LCBzdHJpbmcgT3Bjb2RlU3RyLCBSZWdpc3RlckNsYXNzIFJDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWDg2TWVtT3BlcmFuZCB4ODZtZW1vcCwgYml0IElzMkFkZHIgPSAxPiB7DQorICBkZWYgcnIgOiBJPDB4RDAsIE1STVNyY1JlZywNCisgICAgICAgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIFJDOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgUkM6JGRzdCwgKEludCBSQzokc3JjMSwgUkM6JHNyYzIpKV0+Ow0KKyAgZGVmIHJtIDogSTwweEQwLCBNUk1TcmNNZW0sDQorICAgICAgIChvdXRzIFJDOiRkc3QpLCAoaW5zIFJDOiRzcmMxLCB4ODZtZW1vcDokc3JjMiksDQorICAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgIFsoc2V0IFJDOiRkc3QsIChJbnQgUkM6JHNyYzEsIChtZW1vcCBhZGRyOiRzcmMyKSkpXT47DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0sDQorICBFeGVEb21haW4gPSBTU0VQYWNrZWREb3VibGUgaW4gew0KKyAgZGVmbSBWQUREU1VCUFMgOiBzc2UzX2FkZHN1YjxpbnRfeDg2X3NzZTNfYWRkc3ViX3BzLCAidmFkZHN1YnBzIiwgVlIxMjgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYxMjhtZW0sIDA+LCBYRCwgVkVYXzRWOw0KKyAgZGVmbSBWQUREU1VCUEQgOiBzc2UzX2FkZHN1YjxpbnRfeDg2X3NzZTNfYWRkc3ViX3BkLCAidmFkZHN1YnBkIiwgVlIxMjgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYxMjhtZW0sIDA+LCBPcFNpemUsIFZFWF80VjsNCisgIGRlZm0gVkFERFNVQlBTWSA6IHNzZTNfYWRkc3ViPGludF94ODZfYXZ4X2FkZHN1Yl9wc18yNTYsICJ2YWRkc3VicHMiLCBWUjI1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjI1Nm1lbSwgMD4sIFhELCBWRVhfNFY7DQorICBkZWZtIFZBRERTVUJQRFkgOiBzc2UzX2FkZHN1YjxpbnRfeDg2X2F2eF9hZGRzdWJfcGRfMjU2LCAidmFkZHN1YnBkIiwgVlIyNTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYyNTZtZW0sIDA+LCBPcFNpemUsIFZFWF80VjsNCit9DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIsIFByZWRpY2F0ZXMgPSBbSGFzU1NFM10sDQorICAgIEV4ZURvbWFpbiA9IFNTRVBhY2tlZERvdWJsZSBpbiB7DQorICBkZWZtIEFERFNVQlBTIDogc3NlM19hZGRzdWI8aW50X3g4Nl9zc2UzX2FkZHN1Yl9wcywgImFkZHN1YnBzIiwgVlIxMjgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjEyOG1lbT4sIFhEOw0KKyAgZGVmbSBBRERTVUJQRCA6IHNzZTNfYWRkc3ViPGludF94ODZfc3NlM19hZGRzdWJfcGQsICJhZGRzdWJwZCIsIFZSMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYxMjhtZW0+LCBUQiwgT3BTaXplOw0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFMyBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gSG9yaXpvbnRhbCBvcHMNCittdWx0aWNsYXNzIFMzRF9JbnQ8Yml0czw4PiBvLCBzdHJpbmcgT3Bjb2RlU3RyLCBWYWx1ZVR5cGUgdnQsIFJlZ2lzdGVyQ2xhc3MgUkMsDQorICAgICAgICAgICAgICAgICAgIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsIEludHJpbnNpYyBJbnRJZCwgYml0IElzMkFkZHIgPSAxPiB7DQorICBkZWYgcnIgOiBTM0RJPG8sIE1STVNyY1JlZywgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIFJDOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgIFsoc2V0IFJDOiRkc3QsICh2dCAoSW50SWQgUkM6JHNyYzEsIFJDOiRzcmMyKSkpXT47DQorDQorICBkZWYgcm0gOiBTM0RJPG8sIE1STVNyY01lbSwgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIHg4Nm1lbW9wOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgIFsoc2V0IFJDOiRkc3QsICh2dCAoSW50SWQgUkM6JHNyYzEsIChtZW1vcCBhZGRyOiRzcmMyKSkpKV0+Ow0KK30NCittdWx0aWNsYXNzIFMzX0ludDxiaXRzPDg+IG8sIHN0cmluZyBPcGNvZGVTdHIsIFZhbHVlVHlwZSB2dCwgUmVnaXN0ZXJDbGFzcyBSQywNCisgICAgICAgICAgICAgICAgICBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLCBJbnRyaW5zaWMgSW50SWQsIGJpdCBJczJBZGRyID0gMT4gew0KKyAgZGVmIHJyIDogUzNJPG8sIE1STVNyY1JlZywgKG91dHMgUkM6JGRzdCksIChpbnMgUkM6JHNyYzEsIFJDOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgIFsoc2V0IFJDOiRkc3QsICh2dCAoSW50SWQgUkM6JHNyYzEsIFJDOiRzcmMyKSkpXT47DQorDQorICBkZWYgcm0gOiBTM0k8bywgTVJNU3JjTWVtLCAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSwgeDg2bWVtb3A6JHNyYzIpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgWyhzZXQgUkM6JGRzdCwgKHZ0IChJbnRJZCBSQzokc3JjMSwgKG1lbW9wIGFkZHI6JHNyYzIpKSkpXT47DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KKyAgZGVmbSBWSEFERFBTICA6IFMzRF9JbnQ8MHg3QywgInZoYWRkcHMiLCB2NGYzMiwgVlIxMjgsIGYxMjhtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTNfaGFkZF9wcywgMD4sIFZFWF80VjsNCisgIGRlZm0gVkhBRERQRCAgOiBTM19JbnQgPDB4N0MsICJ2aGFkZHBkIiwgdjJmNjQsIFZSMTI4LCBmMTI4bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc2UzX2hhZGRfcGQsIDA+LCBWRVhfNFY7DQorICBkZWZtIFZIU1VCUFMgIDogUzNEX0ludDwweDdELCAidmhzdWJwcyIsIHY0ZjMyLCBWUjEyOCwgZjEyOG1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlM19oc3ViX3BzLCAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWSFNVQlBEICA6IFMzX0ludCA8MHg3RCwgInZoc3VicGQiLCB2MmY2NCwgVlIxMjgsIGYxMjhtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTNfaHN1Yl9wZCwgMD4sIFZFWF80VjsNCisgIGRlZm0gVkhBRERQU1kgOiBTM0RfSW50PDB4N0MsICJ2aGFkZHBzIiwgdjhmMzIsIFZSMjU2LCBmMjU2bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfaGFkZF9wc18yNTYsIDA+LCBWRVhfNFY7DQorICBkZWZtIFZIQUREUERZIDogUzNfSW50IDwweDdDLCAidmhhZGRwZCIsIHY0ZjY0LCBWUjI1NiwgZjI1Nm1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYXZ4X2hhZGRfcGRfMjU2LCAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWSFNVQlBTWSA6IFMzRF9JbnQ8MHg3RCwgInZoc3VicHMiLCB2OGYzMiwgVlIyNTYsIGYyNTZtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2F2eF9oc3ViX3BzXzI1NiwgMD4sIFZFWF80VjsNCisgIGRlZm0gVkhTVUJQRFkgOiBTM19JbnQgPDB4N0QsICJ2aHN1YnBkIiwgdjRmNjQsIFZSMjU2LCBmMjU2bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfaHN1Yl9wZF8yNTYsIDA+LCBWRVhfNFY7DQorfQ0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCisgIGRlZm0gSEFERFBTIDogUzNEX0ludDwweDdDLCAiaGFkZHBzIiwgdjRmMzIsIFZSMTI4LCBmMTI4bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlM19oYWRkX3BzPjsNCisgIGRlZm0gSEFERFBEIDogUzNfSW50PDB4N0MsICJoYWRkcGQiLCB2MmY2NCwgVlIxMjgsIGYxMjhtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTNfaGFkZF9wZD47DQorICBkZWZtIEhTVUJQUyA6IFMzRF9JbnQ8MHg3RCwgImhzdWJwcyIsIHY0ZjMyLCBWUjEyOCwgZjEyOG1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTNfaHN1Yl9wcz47DQorICBkZWZtIEhTVUJQRCA6IFMzX0ludDwweDdELCAiaHN1YnBkIiwgdjJmNjQsIFZSMTI4LCBmMTI4bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc2UzX2hzdWJfcGQ+Ow0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NTRTMgLSBQYWNrZWQgQWJzb2x1dGUgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vLyBTUzNJX3Vub3Bfcm1faW50IC0gU2ltcGxlIFNTU0UzIHVuYXJ5IG9wIHdob3NlIHR5cGUgY2FuIGJlIHYqe2k4LGkxNixpMzJ9Lg0KK211bHRpY2xhc3MgU1MzSV91bm9wX3JtX2ludDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0RnJhZyBtZW1fZnJhZzY0LCBQYXRGcmFnIG1lbV9mcmFnMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50SWQ2NCwgSW50cmluc2ljIEludElkMTI4PiB7DQorICBkZWYgcnI2NCA6IFNTMzhJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIFZSNjQ6JHNyYyksDQorICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICAgICAgICAgICAgICBbKHNldCBWUjY0OiRkc3QsIChJbnRJZDY0IFZSNjQ6JHNyYykpXT47DQorDQorICBkZWYgcm02NCA6IFNTMzhJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjY0OiRkc3QpLCAoaW5zIGk2NG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAoSW50SWQ2NCAoYml0Y29udmVydCAobWVtX2ZyYWc2NCBhZGRyOiRzcmMpKSkpXT47DQorDQorICBkZWYgcnIxMjggOiBTUzM4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoSW50SWQxMjggVlIxMjg6JHNyYykpXT4sDQorICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorDQorICBkZWYgcm0xMjggOiBTUzM4STxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW5zIGkxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgIChJbnRJZDEyOA0KKyAgICAgICAgICAgICAgICAgICAgICAgKGJpdGNvbnZlcnQgKG1lbV9mcmFnMTI4IGFkZHI6JHNyYykpKSldPiwgT3BTaXplOw0KK30NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisgIGRlZm0gVlBBQlNCICA6IFNTM0lfdW5vcF9ybV9pbnQ8MHgxQywgInZwYWJzYiIsIG1lbW9wdjhpOCwgbWVtb3B2MTZpOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wYWJzX2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcGFic19iXzEyOD4sIFZFWDsNCisgIGRlZm0gVlBBQlNXICA6IFNTM0lfdW5vcF9ybV9pbnQ8MHgxRCwgInZwYWJzdyIsIG1lbW9wdjRpMTYsIG1lbW9wdjhpMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcGFic193LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BhYnNfd18xMjg+LCBWRVg7DQorICBkZWZtIFZQQUJTRCAgOiBTUzNJX3Vub3Bfcm1faW50PDB4MUUsICJ2cGFic2QiLCBtZW1vcHYyaTMyLCBtZW1vcHY0aTMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BhYnNfZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wYWJzX2RfMTI4PiwgVkVYOw0KK30NCisNCitkZWZtIFBBQlNCICAgICAgIDogU1MzSV91bm9wX3JtX2ludDwweDFDLCAicGFic2IiLCBtZW1vcHY4aTgsIG1lbW9wdjE2aTgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wYWJzX2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wYWJzX2JfMTI4PjsNCitkZWZtIFBBQlNXICAgICAgIDogU1MzSV91bm9wX3JtX2ludDwweDFELCAicGFic3ciLCBtZW1vcHY0aTE2LCBtZW1vcHY4aTE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcGFic193LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcGFic193XzEyOD47DQorZGVmbSBQQUJTRCAgICAgICA6IFNTM0lfdW5vcF9ybV9pbnQ8MHgxRSwgInBhYnNkIiwgbWVtb3B2MmkzMiwgbWVtb3B2NGkzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BhYnNfZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BhYnNfZF8xMjg+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU1NFMyAtIFBhY2tlZCBCaW5hcnkgT3BlcmF0b3IgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vLyBTUzNJX2Jpbm9wX3JtX2ludCAtIFNpbXBsZSBTU1NFMyBiaW4gb3Agd2hvc2UgdHlwZSBjYW4gYmUgdip7aTgsaTE2LGkzMn0uDQorbXVsdGljbGFzcyBTUzNJX2Jpbm9wX3JtX2ludDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdEZyYWcgbWVtX2ZyYWc2NCwgUGF0RnJhZyBtZW1fZnJhZzEyOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRJZDY0LCBJbnRyaW5zaWMgSW50SWQxMjgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGxldCBpc0NvbW11dGFibGUgPSAxIGluDQorICBkZWYgcnI2NCA6IFNTMzhJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLA0KKyAgICAgICAoaW5zIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgIFsoc2V0IFZSNjQ6JGRzdCwgKEludElkNjQgVlI2NDokc3JjMSwgVlI2NDokc3JjMikpXT47DQorICBkZWYgcm02NCA6IFNTMzhJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjY0OiRkc3QpLA0KKyAgICAgICAoaW5zIFZSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiksDQorICAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlI2NDokZHN0LA0KKyAgICAgICAgIChJbnRJZDY0IFZSNjQ6JHNyYzEsDQorICAgICAgICAgIChiaXRjb252ZXJ0IChtZW1vcHY4aTggYWRkcjokc3JjMikpKSldPjsNCisNCisgIGxldCBpc0NvbW11dGFibGUgPSAxIGluDQorICBkZWYgcnIxMjggOiBTUzM4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgICBbKHNldCBWUjEyODokZHN0LCAoSW50SWQxMjggVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSldPiwNCisgICAgICAgT3BTaXplOw0KKyAgZGVmIHJtMTI4IDogU1MzOEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMTI4bWVtOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgIChJbnRJZDEyOCBWUjEyODokc3JjMSwNCisgICAgICAgICAgKGJpdGNvbnZlcnQgKG1lbW9wdjE2aTggYWRkcjokc3JjMikpKSldPiwgT3BTaXplOw0KK30NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCitsZXQgaXNDb21tdXRhYmxlID0gMCBpbiB7DQorICBkZWZtIFZQSEFERFcgICAgOiBTUzNJX2Jpbm9wX3JtX2ludDwweDAxLCAidnBoYWRkdyIsIG1lbW9wdjRpMTYsIG1lbW9wdjhpMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BoYWRkX3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BoYWRkX3dfMTI4LCAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWUEhBREREICAgIDogU1MzSV9iaW5vcF9ybV9pbnQ8MHgwMiwgInZwaGFkZGQiLCBtZW1vcHYyaTMyLCBtZW1vcHY0aTMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waGFkZF9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waGFkZF9kXzEyOCwgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBIQUREU1cgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDMsICJ2cGhhZGRzdyIsIG1lbW9wdjRpMTYsIG1lbW9wdjhpMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BoYWRkX3N3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waGFkZF9zd18xMjgsIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQSFNVQlcgICAgOiBTUzNJX2Jpbm9wX3JtX2ludDwweDA1LCAidnBoc3VidyIsIG1lbW9wdjRpMTYsIG1lbW9wdjhpMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3Boc3ViX3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3Boc3ViX3dfMTI4LCAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWUEhTVUJEICAgIDogU1MzSV9iaW5vcF9ybV9pbnQ8MHgwNiwgInZwaHN1YmQiLCBtZW1vcHYyaTMyLCBtZW1vcHY0aTMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waHN1Yl9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waHN1Yl9kXzEyOCwgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBIU1VCU1cgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDcsICJ2cGhzdWJzdyIsIG1lbW9wdjRpMTYsIG1lbW9wdjhpMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3Boc3ViX3N3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waHN1Yl9zd18xMjgsIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQTUFERFVCU1cgOiBTUzNJX2Jpbm9wX3JtX2ludDwweDA0LCAidnBtYWRkdWJzdyIsIG1lbW9wdjhpOCwgbWVtb3B2MTZpOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcG1hZGRfdWJfc3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BtYWRkX3ViX3N3XzEyOCwgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBTSFVGQiAgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDAsICJ2cHNodWZiIiwgbWVtb3B2OGk4LCBtZW1vcHYxNmk4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wc2h1Zl9iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wc2h1Zl9iXzEyOCwgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBTSUdOQiAgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDgsICJ2cHNpZ25iIiwgbWVtb3B2OGk4LCBtZW1vcHYxNmk4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wc2lnbl9iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wc2lnbl9iXzEyOCwgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBTSUdOVyAgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDksICJ2cHNpZ253IiwgbWVtb3B2NGkxNiwgbWVtb3B2OGkxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcHNpZ25fdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcHNpZ25fd18xMjgsIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQU0lHTkQgICAgOiBTUzNJX2Jpbm9wX3JtX2ludDwweDBBLCAidnBzaWduZCIsIG1lbW9wdjJpMzIsIG1lbW9wdjRpMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BzaWduX2QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BzaWduX2RfMTI4LCAwPiwgVkVYXzRWOw0KK30NCitkZWZtIFZQTVVMSFJTVyAgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MEIsICJ2cG11bGhyc3ciLCBtZW1vcHY0aTE2LCBtZW1vcHY4aTE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wbXVsX2hyX3N3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wbXVsX2hyX3N3XzEyOCwgMD4sIFZFWF80VjsNCit9DQorDQorLy8gTm9uZSBvZiB0aGVzZSBoYXZlIGk4IGltbWVkaWF0ZSBmaWVsZHMuDQorbGV0IEltbVQgPSBOb0ltbSwgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbiB7DQorbGV0IGlzQ29tbXV0YWJsZSA9IDAgaW4gew0KKyAgZGVmbSBQSEFERFcgICAgOiBTUzNJX2Jpbm9wX3JtX2ludDwweDAxLCAicGhhZGR3IiwgbWVtb3B2NGkxNiwgbWVtb3B2OGkxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waGFkZF93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BoYWRkX3dfMTI4PjsNCisgIGRlZm0gUEhBREREICAgIDogU1MzSV9iaW5vcF9ybV9pbnQ8MHgwMiwgInBoYWRkZCIsIG1lbW9wdjJpMzIsIG1lbW9wdjRpMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcGhhZGRfZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waGFkZF9kXzEyOD47DQorICBkZWZtIFBIQUREU1cgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDMsICJwaGFkZHN3IiwgbWVtb3B2NGkxNiwgbWVtb3B2OGkxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waGFkZF9zdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waGFkZF9zd18xMjg+Ow0KKyAgZGVmbSBQSFNVQlcgICAgOiBTUzNJX2Jpbm9wX3JtX2ludDwweDA1LCAicGhzdWJ3IiwgbWVtb3B2NGkxNiwgbWVtb3B2OGkxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waHN1Yl93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3Boc3ViX3dfMTI4PjsNCisgIGRlZm0gUEhTVUJEICAgIDogU1MzSV9iaW5vcF9ybV9pbnQ8MHgwNiwgInBoc3ViZCIsIG1lbW9wdjJpMzIsIG1lbW9wdjRpMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcGhzdWJfZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waHN1Yl9kXzEyOD47DQorICBkZWZtIFBIU1VCU1cgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDcsICJwaHN1YnN3IiwgbWVtb3B2NGkxNiwgbWVtb3B2OGkxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waHN1Yl9zdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19waHN1Yl9zd18xMjg+Ow0KKyAgZGVmbSBQTUFERFVCU1cgOiBTUzNJX2Jpbm9wX3JtX2ludDwweDA0LCAicG1hZGR1YnN3IiwgbWVtb3B2OGk4LCBtZW1vcHYxNmk4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BtYWRkX3ViX3N3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BtYWRkX3ViX3N3XzEyOD47DQorICBkZWZtIFBTSFVGQiAgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDAsICJwc2h1ZmIiLCBtZW1vcHY4aTgsIG1lbW9wdjE2aTgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcHNodWZfYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wc2h1Zl9iXzEyOD47DQorICBkZWZtIFBTSUdOQiAgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDgsICJwc2lnbmIiLCBtZW1vcHY4aTgsIG1lbW9wdjE2aTgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcHNpZ25fYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wc2lnbl9iXzEyOD47DQorICBkZWZtIFBTSUdOVyAgICA6IFNTM0lfYmlub3Bfcm1faW50PDB4MDksICJwc2lnbnciLCBtZW1vcHY0aTE2LCBtZW1vcHY4aTE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BzaWduX3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcHNpZ25fd18xMjg+Ow0KKyAgZGVmbSBQU0lHTkQgICAgOiBTUzNJX2Jpbm9wX3JtX2ludDwweDBBLCAicHNpZ25kIiwgbWVtb3B2MmkzMiwgbWVtb3B2NGkzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BzaWduX2QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc3NlM19wc2lnbl9kXzEyOD47DQorfQ0KK2RlZm0gUE1VTEhSU1cgICAgOiBTUzNJX2Jpbm9wX3JtX2ludDwweDBCLCAicG11bGhyc3ciLCBtZW1vcHY0aTE2LCBtZW1vcHY4aTE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3Nzc2UzX3BtdWxfaHJfc3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NzZTNfcG11bF9ocl9zd18xMjg+Ow0KK30NCisNCitkZWYgOiBQYXQ8KFg4NnBzaHVmYiBWUjEyODokc3JjLCBWUjEyODokbWFzayksDQorICAgICAgICAgIChQU0hVRkJycjEyOCBWUjEyODokc3JjLCBWUjEyODokbWFzayk+LCBSZXF1aXJlczxbSGFzU1NTRTNdPjsNCitkZWYgOiBQYXQ8KFg4NnBzaHVmYiBWUjEyODokc3JjLCAoYmNfdjE2aTggKG1lbW9wdjJpNjQgYWRkcjokbWFzaykpKSwNCisgICAgICAgICAgKFBTSFVGQnJtMTI4IFZSMTI4OiRzcmMsIGFkZHI6JG1hc2spPiwgUmVxdWlyZXM8W0hhc1NTU0UzXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTU0UzIC0gUGFja2VkIEFsaWduIEluc3RydWN0aW9uIFBhdHRlcm5zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK211bHRpY2xhc3Mgc3NlM19wYWxpZ248c3RyaW5nIGFzbSwgYml0IElzMkFkZHIgPSAxPiB7DQorICBkZWYgUjY0cnIgIDogU1MzQUk8MHgwRiwgTVJNU3JjUmVnLCAob3V0cyBWUjY0OiRkc3QpLA0KKyAgICAgIChpbnMgVlI2NDokc3JjMSwgVlI2NDokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgICAgIXN0cmNvbmNhdChhc20sDQorICAgICAgICAgICAgICAgICAgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgW10+Ow0KKyAgZGVmIFI2NHJtICA6IFNTM0FJPDB4MEYsIE1STVNyY01lbSwgKG91dHMgVlI2NDokZHN0KSwNCisgICAgICAoaW5zIFZSNjQ6JHNyYzEsIGk2NG1lbTokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgICAgIXN0cmNvbmNhdChhc20sDQorICAgICAgICAgICAgICAgICAgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgW10+Ow0KKw0KKyAgZGVmIFIxMjhyciA6IFNTM0FJPDB4MEYsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIsIGk4aW1tOiRzcmMzKSwNCisgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYzMsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAkc3JjM30iKSwNCisgICAgICAgICFzdHJjb25jYXQoYXNtLA0KKyAgICAgICAgICAgICAgICAgICJcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IikpLA0KKyAgICAgIFtdPiwgT3BTaXplOw0KKyAgZGVmIFIxMjhybSA6IFNTM0FJPDB4MEYsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgICAgIXN0cmNvbmNhdChhc20sDQorICAgICAgICAgICAgICAgICAgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgW10+LCBPcFNpemU7DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4NCisgIGRlZm0gVlBBTElHTiA6IHNzZTNfcGFsaWduPCJ2cGFsaWduciIsIDA+LCBWRVhfNFY7DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4NCisgIGRlZm0gUEFMSUdOIDogc3NlM19wYWxpZ248InBhbGlnbnIiPjsNCisNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gNSBpbiB7DQorDQorZGVmIDogUGF0PCh2MWk2NCAocGFsaWduOiRzcmMzIFZSNjQ6JHNyYzEsIFZSNjQ6JHNyYzIpKSwNCisgICAgICAgICAgKFBBTElHTlI2NHJyIFZSNjQ6JHNyYzIsIFZSNjQ6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAoU0hVRkZMRV9nZXRfcGFsaWduX2ltbSBWUjY0OiRzcmMzKSk+LA0KKyAgICAgICAgICBSZXF1aXJlczxbSGFzU1NTRTNdPjsNCitkZWYgOiBQYXQ8KHYyaTMyIChwYWxpZ246JHNyYzMgVlI2NDokc3JjMSwgVlI2NDokc3JjMikpLA0KKyAgICAgICAgICAoUEFMSUdOUjY0cnIgVlI2NDokc3JjMiwgVlI2NDokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgIChTSFVGRkxFX2dldF9wYWxpZ25faW1tIFZSNjQ6JHNyYzMpKT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU1NFM10+Ow0KK2RlZiA6IFBhdDwodjRpMTYgKHBhbGlnbjokc3JjMyBWUjY0OiRzcmMxLCBWUjY0OiRzcmMyKSksDQorICAgICAgICAgIChQQUxJR05SNjRyciBWUjY0OiRzcmMyLCBWUjY0OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKFNIVUZGTEVfZ2V0X3BhbGlnbl9pbW0gVlI2NDokc3JjMykpPiwNCisgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTU0UzXT47DQorZGVmIDogUGF0PCh2OGk4IChwYWxpZ246JHNyYzMgVlI2NDokc3JjMSwgVlI2NDokc3JjMikpLA0KKyAgICAgICAgICAoUEFMSUdOUjY0cnIgVlI2NDokc3JjMiwgVlI2NDokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgIChTSFVGRkxFX2dldF9wYWxpZ25faW1tIFZSNjQ6JHNyYzMpKT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU1NFM10+Ow0KKw0KK2RlZiA6IFBhdDwodjRpMzIgKHBhbGlnbjokc3JjMyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKFBBTElHTlIxMjhyciBWUjEyODokc3JjMiwgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgKFNIVUZGTEVfZ2V0X3BhbGlnbl9pbW0gVlIxMjg6JHNyYzMpKT4sDQorICAgICAgUmVxdWlyZXM8W0hhc1NTU0UzXT47DQorZGVmIDogUGF0PCh2NGYzMiAocGFsaWduOiRzcmMzIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpLA0KKyAgICAgICAgICAoUEFMSUdOUjEyOHJyIFZSMTI4OiRzcmMyLCBWUjEyODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoU0hVRkZMRV9nZXRfcGFsaWduX2ltbSBWUjEyODokc3JjMykpPiwNCisgICAgICBSZXF1aXJlczxbSGFzU1NTRTNdPjsNCitkZWYgOiBQYXQ8KHY4aTE2IChwYWxpZ246JHNyYzMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSksDQorICAgICAgICAgIChQQUxJR05SMTI4cnIgVlIxMjg6JHNyYzIsIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChTSFVGRkxFX2dldF9wYWxpZ25faW1tIFZSMTI4OiRzcmMzKSk+LA0KKyAgICAgIFJlcXVpcmVzPFtIYXNTU1NFM10+Ow0KK2RlZiA6IFBhdDwodjE2aTggKHBhbGlnbjokc3JjMyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKFBBTElHTlIxMjhyciBWUjEyODokc3JjMiwgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgKFNIVUZGTEVfZ2V0X3BhbGlnbl9pbW0gVlIxMjg6JHNyYzMpKT4sDQorICAgICAgUmVxdWlyZXM8W0hhc1NTU0UzXT47DQorfQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU1NFMyBNaXNjIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBUaHJlYWQgc3luY2hyb25pemF0aW9uDQorZGVmIE1PTklUT1IgOiBJPDB4MDEsIE1STV9DOCwgKG91dHMpLCAoaW5zKSwgIm1vbml0b3IiLA0KKyAgICAgICAgICAgICAgICBbKGludF94ODZfc3NlM19tb25pdG9yIEVBWCwgRUNYLCBFRFgpXT4sVEIsIFJlcXVpcmVzPFtIYXNTU0UzXT47DQorZGVmIE1XQUlUICAgOiBJPDB4MDEsIE1STV9DOSwgKG91dHMpLCAoaW5zKSwgIm13YWl0IiwNCisgICAgICAgICAgICAgICAgWyhpbnRfeDg2X3NzZTNfbXdhaXQgRUNYLCBFQVgpXT4sIFRCLCBSZXF1aXJlczxbSGFzU1NFM10+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBOb24tSW5zdHJ1Y3Rpb24gUGF0dGVybnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gZXh0bG9hZCBmMzIgLT4gZjY0LiAgVGhpcyBtYXRjaGVzIGxvYWQrZmV4dGVuZCBiZWNhdXNlIHdlIGhhdmUgYSBoYWNrIGluDQorLy8gdGhlIGlzZWwgKFByZXByb2Nlc3NGb3JGUENvbnZlcnQpIHRoYXQgY2FuIGludHJvZHVjZSBsb2FkcyBhZnRlciBkYWcNCisvLyBjb21iaW5lLg0KKy8vIFNpbmNlIHRoZXNlIGxvYWRzIGFyZW4ndCBmb2xkZWQgaW50byB0aGUgZmV4dGVuZCwgd2UgaGF2ZSB0byBtYXRjaCBpdA0KKy8vIGV4cGxpY2l0bHkgaGVyZS4NCitsZXQgUHJlZGljYXRlcyA9IFtIYXNTU0UyXSBpbg0KKyBkZWYgOiBQYXQ8KGZleHRlbmQgKGxvYWRmMzIgYWRkcjokc3JjKSksDQorICAgICAgICAgICAoQ1ZUU1MyU0RybSBhZGRyOiRzcmMpPjsNCisNCisvLyBiaXRfY29udmVydA0KK2xldCBQcmVkaWNhdGVzID0gW0hhc1NTRTJdIGluIHsNCisgIGRlZiA6IFBhdDwodjJpNjQgKGJpdGNvbnZlcnQgKHY0aTMyIFZSMTI4OiRzcmMpKSksICh2Mmk2NCBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHYyaTY0IChiaXRjb252ZXJ0ICh2OGkxNiBWUjEyODokc3JjKSkpLCAodjJpNjQgVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2Mmk2NCAoYml0Y29udmVydCAodjE2aTggVlIxMjg6JHNyYykpKSwgKHYyaTY0IFZSMTI4OiRzcmMpPjsNCisgIGRlZiA6IFBhdDwodjJpNjQgKGJpdGNvbnZlcnQgKHYyZjY0IFZSMTI4OiRzcmMpKSksICh2Mmk2NCBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHYyaTY0IChiaXRjb252ZXJ0ICh2NGYzMiBWUjEyODokc3JjKSkpLCAodjJpNjQgVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjJpNjQgVlIxMjg6JHNyYykpKSwgKHY0aTMyIFZSMTI4OiRzcmMpPjsNCisgIGRlZiA6IFBhdDwodjRpMzIgKGJpdGNvbnZlcnQgKHY4aTE2IFZSMTI4OiRzcmMpKSksICh2NGkzMiBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHY0aTMyIChiaXRjb252ZXJ0ICh2MTZpOCBWUjEyODokc3JjKSkpLCAodjRpMzIgVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2NGkzMiAoYml0Y29udmVydCAodjJmNjQgVlIxMjg6JHNyYykpKSwgKHY0aTMyIFZSMTI4OiRzcmMpPjsNCisgIGRlZiA6IFBhdDwodjRpMzIgKGJpdGNvbnZlcnQgKHY0ZjMyIFZSMTI4OiRzcmMpKSksICh2NGkzMiBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHY4aTE2IChiaXRjb252ZXJ0ICh2Mmk2NCBWUjEyODokc3JjKSkpLCAodjhpMTYgVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2OGkxNiAoYml0Y29udmVydCAodjRpMzIgVlIxMjg6JHNyYykpKSwgKHY4aTE2IFZSMTI4OiRzcmMpPjsNCisgIGRlZiA6IFBhdDwodjhpMTYgKGJpdGNvbnZlcnQgKHYxNmk4IFZSMTI4OiRzcmMpKSksICh2OGkxNiBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHY4aTE2IChiaXRjb252ZXJ0ICh2MmY2NCBWUjEyODokc3JjKSkpLCAodjhpMTYgVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2OGkxNiAoYml0Y29udmVydCAodjRmMzIgVlIxMjg6JHNyYykpKSwgKHY4aTE2IFZSMTI4OiRzcmMpPjsNCisgIGRlZiA6IFBhdDwodjE2aTggKGJpdGNvbnZlcnQgKHYyaTY0IFZSMTI4OiRzcmMpKSksICh2MTZpOCBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHYxNmk4IChiaXRjb252ZXJ0ICh2NGkzMiBWUjEyODokc3JjKSkpLCAodjE2aTggVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2MTZpOCAoYml0Y29udmVydCAodjhpMTYgVlIxMjg6JHNyYykpKSwgKHYxNmk4IFZSMTI4OiRzcmMpPjsNCisgIGRlZiA6IFBhdDwodjE2aTggKGJpdGNvbnZlcnQgKHYyZjY0IFZSMTI4OiRzcmMpKSksICh2MTZpOCBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHYxNmk4IChiaXRjb252ZXJ0ICh2NGYzMiBWUjEyODokc3JjKSkpLCAodjE2aTggVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2NGYzMiAoYml0Y29udmVydCAodjJpNjQgVlIxMjg6JHNyYykpKSwgKHY0ZjMyIFZSMTI4OiRzcmMpPjsNCisgIGRlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHY0aTMyIFZSMTI4OiRzcmMpKSksICh2NGYzMiBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHY0ZjMyIChiaXRjb252ZXJ0ICh2OGkxNiBWUjEyODokc3JjKSkpLCAodjRmMzIgVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2NGYzMiAoYml0Y29udmVydCAodjE2aTggVlIxMjg6JHNyYykpKSwgKHY0ZjMyIFZSMTI4OiRzcmMpPjsNCisgIGRlZiA6IFBhdDwodjRmMzIgKGJpdGNvbnZlcnQgKHYyZjY0IFZSMTI4OiRzcmMpKSksICh2NGYzMiBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHYyZjY0IChiaXRjb252ZXJ0ICh2Mmk2NCBWUjEyODokc3JjKSkpLCAodjJmNjQgVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjRpMzIgVlIxMjg6JHNyYykpKSwgKHYyZjY0IFZSMTI4OiRzcmMpPjsNCisgIGRlZiA6IFBhdDwodjJmNjQgKGJpdGNvbnZlcnQgKHY4aTE2IFZSMTI4OiRzcmMpKSksICh2MmY2NCBWUjEyODokc3JjKT47DQorICBkZWYgOiBQYXQ8KHYyZjY0IChiaXRjb252ZXJ0ICh2MTZpOCBWUjEyODokc3JjKSkpLCAodjJmNjQgVlIxMjg6JHNyYyk+Ow0KKyAgZGVmIDogUGF0PCh2MmY2NCAoYml0Y29udmVydCAodjRmMzIgVlIxMjg6JHNyYykpKSwgKHYyZjY0IFZSMTI4OiRzcmMpPjsNCit9DQorDQorLy8gTW92ZSBzY2FsYXIgdG8gWE1NIHplcm8tZXh0ZW5kZWQNCisvLyBtb3ZkIHRvIFhNTSByZWdpc3RlciB6ZXJvLWV4dGVuZHMNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTUgaW4gew0KKy8vIFplcm9pbmcgYSBWUjEyOCB0aGVuIGRvIGEgTU9WU3tTfER9IHRvIHRoZSBsb3dlciBiaXRzLg0KK2RlZiA6IFBhdDwodjJmNjQgKFg4NnZ6bW92bCAodjJmNjQgKHNjYWxhcl90b192ZWN0b3IgRlI2NDokc3JjKSkpKSwNCisgICAgICAgICAgKE1PVlNEcnIgKHYyZjY0IChWX1NFVDBQUykpLCBGUjY0OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHY0ZjMyIChYODZ2em1vdmwgKHY0ZjMyIChzY2FsYXJfdG9fdmVjdG9yIEZSMzI6JHNyYykpKSksDQorICAgICAgICAgIChNT1ZTU3JyICh2NGYzMiAoVl9TRVQwUFMpKSwgRlIzMjokc3JjKT47DQorZGVmIDogUGF0PCh2NGYzMiAoWDg2dnptb3ZsICh2NGYzMiBWUjEyODokc3JjKSkpLA0KKyAgICAgICAgICAoTU9WU1NyciAodjRmMzIgKFZfU0VUMFBTKSksDQorICAgICAgICAgICAgICAgICAgIChmMzIgKEVYVFJBQ1RfU1VCUkVHICh2NGYzMiBWUjEyODokc3JjKSwgc3ViX3NzKSkpPjsNCitkZWYgOiBQYXQ8KHY0aTMyIChYODZ2em1vdmwgKHY0aTMyIFZSMTI4OiRzcmMpKSksDQorICAgICAgICAgIChNT1ZTU3JyICh2NGkzMiAoVl9TRVQwUEkpKSwNCisgICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHICh2NGkzMiBWUjEyODokc3JjKSwgc3ViX3NzKSk+Ow0KK30NCisNCisvLyBTcGxhdCB2MmY2NCAvIHYyaTY0DQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDEwIGluIHsNCitkZWYgOiBQYXQ8KHNwbGF0X2xvICh2MmY2NCBWUjEyODokc3JjKSwgKHVuZGVmKSksDQorICAgICAgICAgIChVTlBDS0xQRHJyIFZSMTI4OiRzcmMsIFZSMTI4OiRzcmMpPiwgICBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KK2RlZiA6IFBhdDwodW5wY2toICh2MmY2NCBWUjEyODokc3JjKSwgKHVuZGVmKSksDQorICAgICAgICAgIChVTlBDS0hQRHJyIFZSMTI4OiRzcmMsIFZSMTI4OiRzcmMpPiwgICBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KK2RlZiA6IFBhdDwoc3BsYXRfbG8gKHYyaTY0IFZSMTI4OiRzcmMpLCAodW5kZWYpKSwNCisgICAgICAgICAgKFBVTlBDS0xRRFFyciBWUjEyODokc3JjLCBWUjEyODokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh1bnBja2ggKHYyaTY0IFZSMTI4OiRzcmMpLCAodW5kZWYpKSwNCisgICAgICAgICAgKFBVTlBDS0hRRFFyciBWUjEyODokc3JjLCBWUjEyODokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorfQ0KKw0KKy8vIFNwZWNpYWwgdW5hcnkgU0hVRlBTcnJpIGNhc2UuDQorZGVmIDogUGF0PCh2NGYzMiAocHNodWZkOiRzcmMzIFZSMTI4OiRzcmMxLCAodW5kZWYpKSksDQorICAgICAgICAgIChTSFVGUFNycmkgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgIChTSFVGRkxFX2dldF9zaHVmX2ltbSBWUjEyODokc3JjMykpPjsNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gNSBpbg0KK2RlZiA6IFBhdDwodjRmMzIgKHBzaHVmZDokc3JjMiBWUjEyODokc3JjMSwgKHVuZGVmKSkpLA0KKyAgICAgICAgICAoUFNIVUZEcmkgVlIxMjg6JHNyYzEsIChTSFVGRkxFX2dldF9zaHVmX2ltbSBWUjEyODokc3JjMikpPiwNCisgICAgICBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KKy8vIFNwZWNpYWwgdW5hcnkgU0hVRlBEcnJpIGNhc2UuDQorZGVmIDogUGF0PCh2Mmk2NCAocHNodWZkOiRzcmMzIFZSMTI4OiRzcmMxLCAodW5kZWYpKSksDQorICAgICAgICAgIChTSFVGUERycmkgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgIChTSFVGRkxFX2dldF9zaHVmX2ltbSBWUjEyODokc3JjMykpPiwNCisgICAgICBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KKy8vIFNwZWNpYWwgdW5hcnkgU0hVRlBEcnJpIGNhc2UuDQorZGVmIDogUGF0PCh2MmY2NCAocHNodWZkOiRzcmMzIFZSMTI4OiRzcmMxLCAodW5kZWYpKSksDQorICAgICAgICAgIChTSFVGUERycmkgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgIChTSFVGRkxFX2dldF9zaHVmX2ltbSBWUjEyODokc3JjMykpPiwNCisgICAgICBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KKy8vIFVuYXJ5IHY0ZjMyIHNodWZmbGUgd2l0aCBQU0hVRiogaW4gb3JkZXIgdG8gZm9sZCBhIGxvYWQuDQorZGVmIDogUGF0PChwc2h1ZmQ6JHNyYzIgKGJjX3Y0aTMyIChtZW1vcHY0ZjMyIGFkZHI6JHNyYzEpKSwgKHVuZGVmKSksDQorICAgICAgICAgIChQU0hVRkRtaSBhZGRyOiRzcmMxLCAoU0hVRkZMRV9nZXRfc2h1Zl9pbW0gVlIxMjg6JHNyYzIpKT4sDQorICAgICAgUmVxdWlyZXM8W0hhc1NTRTJdPjsNCisNCisvLyBTcGVjaWFsIGJpbmFyeSB2NGkzMiBzaHVmZmxlIGNhc2VzIHdpdGggU0hVRlBTLg0KK2RlZiA6IFBhdDwodjRpMzIgKHNodWZwOiRzcmMzIFZSMTI4OiRzcmMxLCAodjRpMzIgVlIxMjg6JHNyYzIpKSksDQorICAgICAgICAgIChTSFVGUFNycmkgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgIChTSFVGRkxFX2dldF9zaHVmX2ltbSBWUjEyODokc3JjMykpPiwNCisgICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh2NGkzMiAoc2h1ZnA6JHNyYzMgVlIxMjg6JHNyYzEsIChiY192NGkzMiAobWVtb3B2Mmk2NCBhZGRyOiRzcmMyKSkpKSwNCisgICAgICAgICAgKFNIVUZQU3JtaSBWUjEyODokc3JjMSwgYWRkcjokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgIChTSFVGRkxFX2dldF9zaHVmX2ltbSBWUjEyODokc3JjMykpPiwNCisgICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorLy8gU3BlY2lhbCBiaW5hcnkgdjJpNjQgc2h1ZmZsZSBjYXNlcyB1c2luZyBTSFVGUERycmkuDQorZGVmIDogUGF0PCh2Mmk2NCAoc2h1ZnA6JHNyYzMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSksDQorICAgICAgICAgIChTSFVGUERycmkgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyLA0KKyAgICAgICAgICAgICAgICAgICAgIChTSFVGRkxFX2dldF9zaHVmX2ltbSBWUjEyODokc3JjMykpPiwNCisgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTJdPjsNCisNCisvLyB2ZWN0b3Jfc2h1ZmZsZSB2MSwgPHVuZGVmPiwgPDAsIDAsIDEsIDEsIC4uLj4NCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTUgaW4gew0KK2RlZiA6IFBhdDwodjRpMzIgKHVucGNrbF91bmRlZjokc3JjMiBWUjEyODokc3JjLCAodW5kZWYpKSksDQorICAgICAgICAgIChQU0hVRkRyaSBWUjEyODokc3JjLCAoU0hVRkZMRV9nZXRfc2h1Zl9pbW0gVlIxMjg6JHNyYzIpKT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtPcHRGb3JTcGVlZCwgSGFzU1NFMl0+Ow0KK2RlZiA6IFBhdDwodjRmMzIgKHVucGNrbF91bmRlZjokc3JjMiBWUjEyODokc3JjLCAodW5kZWYpKSksDQorICAgICAgICAgIChQU0hVRkRyaSBWUjEyODokc3JjLCAoU0hVRkZMRV9nZXRfc2h1Zl9pbW0gVlIxMjg6JHNyYzIpKT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtPcHRGb3JTcGVlZCwgSGFzU1NFMl0+Ow0KK30NCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTAgaW4gew0KK2RlZiA6IFBhdDwodjRmMzIgKHVucGNrbF91bmRlZiBWUjEyODokc3JjLCAodW5kZWYpKSksDQorICAgICAgICAgIChVTlBDS0xQU3JyIFZSMTI4OiRzcmMsIFZSMTI4OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHYxNmk4ICh1bnBja2xfdW5kZWYgVlIxMjg6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAoUFVOUENLTEJXcnIgVlIxMjg6JHNyYywgVlIxMjg6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjhpMTYgKHVucGNrbF91bmRlZiBWUjEyODokc3JjLCAodW5kZWYpKSksDQorICAgICAgICAgIChQVU5QQ0tMV0RyciBWUjEyODokc3JjLCBWUjEyODokc3JjKT47DQorZGVmIDogUGF0PCh2NGkzMiAodW5wY2tsX3VuZGVmIFZSMTI4OiRzcmMsICh1bmRlZikpKSwNCisgICAgICAgICAgKFBVTlBDS0xEUXJyIFZSMTI4OiRzcmMsIFZSMTI4OiRzcmMpPjsNCit9DQorDQorLy8gdmVjdG9yX3NodWZmbGUgdjEsIDx1bmRlZj4sIDwyLCAyLCAzLCAzLCAuLi4+DQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDE1IGluIHsNCitkZWYgOiBQYXQ8KHY0aTMyICh1bnBja2hfdW5kZWY6JHNyYzIgVlIxMjg6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAoUFNIVUZEcmkgVlIxMjg6JHNyYywgKFNIVUZGTEVfZ2V0X3NodWZfaW1tIFZSMTI4OiRzcmMyKSk+LA0KKyAgICAgICAgICBSZXF1aXJlczxbT3B0Rm9yU3BlZWQsIEhhc1NTRTJdPjsNCitkZWYgOiBQYXQ8KHY0ZjMyICh1bnBja2hfdW5kZWY6JHNyYzIgVlIxMjg6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAoUFNIVUZEcmkgVlIxMjg6JHNyYywgKFNIVUZGTEVfZ2V0X3NodWZfaW1tIFZSMTI4OiRzcmMyKSk+LA0KKyAgICAgICAgICBSZXF1aXJlczxbT3B0Rm9yU3BlZWQsIEhhc1NTRTJdPjsNCit9DQorbGV0IEFkZGVkQ29tcGxleGl0eSA9IDEwIGluIHsNCitkZWYgOiBQYXQ8KHY0ZjMyICh1bnBja2hfdW5kZWYgVlIxMjg6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAoVU5QQ0tIUFNyciBWUjEyODokc3JjLCBWUjEyODokc3JjKT47DQorZGVmIDogUGF0PCh2MTZpOCAodW5wY2toX3VuZGVmIFZSMTI4OiRzcmMsICh1bmRlZikpKSwNCisgICAgICAgICAgKFBVTlBDS0hCV3JyIFZSMTI4OiRzcmMsIFZSMTI4OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHY4aTE2ICh1bnBja2hfdW5kZWYgVlIxMjg6JHNyYywgKHVuZGVmKSkpLA0KKyAgICAgICAgICAoUFVOUENLSFdEcnIgVlIxMjg6JHNyYywgVlIxMjg6JHNyYyk+Ow0KK2RlZiA6IFBhdDwodjRpMzIgKHVucGNraF91bmRlZiBWUjEyODokc3JjLCAodW5kZWYpKSksDQorICAgICAgICAgIChQVU5QQ0tIRFFyciBWUjEyODokc3JjLCBWUjEyODokc3JjKT47DQorfQ0KKw0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAyMCBpbiB7DQorLy8gdmVjdG9yX3NodWZmbGUgdjEsIHYyIDwwLCAxLCA0LCA1PiB1c2luZyBNT1ZMSFBTDQorZGVmIDogUGF0PCh2NGkzMiAobW92bGhwcyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKE1PVkxIUFNyciBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpPjsNCisNCisvLyB2ZWN0b3Jfc2h1ZmZsZSB2MSwgdjIgPDYsIDcsIDIsIDM+IHVzaW5nIE1PVkhMUFMNCitkZWYgOiBQYXQ8KHY0aTMyIChtb3ZobHBzIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpLA0KKyAgICAgICAgICAoTU9WSExQU3JyIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMik+Ow0KKw0KKy8vIHZlY3Rvcl9zaHVmZmxlIHYxLCB1bmRlZiA8MiwgPywgPywgPz4gdXNpbmcgTU9WSExQUw0KK2RlZiA6IFBhdDwodjRmMzIgKG1vdmhscHNfdW5kZWYgVlIxMjg6JHNyYzEsICh1bmRlZikpKSwNCisgICAgICAgICAgKE1PVkhMUFNyciBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzEpPjsNCitkZWYgOiBQYXQ8KHY0aTMyIChtb3ZobHBzX3VuZGVmIFZSMTI4OiRzcmMxLCAodW5kZWYpKSksDQorICAgICAgICAgIChNT1ZITFBTcnIgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMxKT47DQorfQ0KKw0KK2xldCBBZGRlZENvbXBsZXhpdHkgPSAyMCBpbiB7DQorLy8gdmVjdG9yX3NodWZmbGUgdjEsIChsb2FkIHYyKSA8NCwgNSwgMiwgMz4gdXNpbmcgTU9WTFBTDQorZGVmIDogUGF0PCh2NGYzMiAobW92bHAgVlIxMjg6JHNyYzEsIChsb2FkIGFkZHI6JHNyYzIpKSksDQorICAgICAgICAgIChNT1ZMUFNybSBWUjEyODokc3JjMSwgYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjJmNjQgKG1vdmxwIFZSMTI4OiRzcmMxLCAobG9hZCBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAoTU9WTFBEcm0gVlIxMjg6JHNyYzEsIGFkZHI6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHY0aTMyIChtb3ZscCBWUjEyODokc3JjMSwgKGxvYWQgYWRkcjokc3JjMikpKSwNCisgICAgICAgICAgKE1PVkxQU3JtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorZGVmIDogUGF0PCh2Mmk2NCAobW92bHAgVlIxMjg6JHNyYzEsIChsb2FkIGFkZHI6JHNyYzIpKSksDQorICAgICAgICAgIChNT1ZMUERybSBWUjEyODokc3JjMSwgYWRkcjokc3JjMik+Ow0KK30NCisNCisvLyAoc3RvcmUgKHZlY3Rvcl9zaHVmZmxlIChsb2FkIGFkZHIpLCB2MiwgPDQsIDUsIDIsIDM+KSwgYWRkcikgdXNpbmcgTU9WTFBTDQorZGVmIDogUGF0PChzdG9yZSAodjRmMzIgKG1vdmxwIChsb2FkIGFkZHI6JHNyYzEpLCBWUjEyODokc3JjMikpLCBhZGRyOiRzcmMxKSwNCisgICAgICAgICAgKE1PVkxQU21yIGFkZHI6JHNyYzEsIFZSMTI4OiRzcmMyKT47DQorZGVmIDogUGF0PChzdG9yZSAodjJmNjQgKG1vdmxwIChsb2FkIGFkZHI6JHNyYzEpLCBWUjEyODokc3JjMikpLCBhZGRyOiRzcmMxKSwNCisgICAgICAgICAgKE1PVkxQRG1yIGFkZHI6JHNyYzEsIFZSMTI4OiRzcmMyKT47DQorZGVmIDogUGF0PChzdG9yZSAodjRpMzIgKG1vdmxwIChiY192NGkzMiAobG9hZHYyaTY0IGFkZHI6JHNyYzEpKSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgICAgICAgIGFkZHI6JHNyYzEpLA0KKyAgICAgICAgICAoTU9WTFBTbXIgYWRkcjokc3JjMSwgVlIxMjg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHN0b3JlICh2Mmk2NCAobW92bHAgKGxvYWQgYWRkcjokc3JjMSksIFZSMTI4OiRzcmMyKSksIGFkZHI6JHNyYzEpLA0KKyAgICAgICAgICAoTU9WTFBEbXIgYWRkcjokc3JjMSwgVlIxMjg6JHNyYzIpPjsNCisNCitsZXQgQWRkZWRDb21wbGV4aXR5ID0gMTUgaW4gew0KKy8vIFNldHRpbmcgdGhlIGxvd2VzdCBlbGVtZW50IGluIHRoZSB2ZWN0b3IuDQorZGVmIDogUGF0PCh2NGkzMiAobW92bCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKE1PVlNTcnIgKHY0aTMyIFZSMTI4OiRzcmMxKSwNCisgICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfU1VCUkVHICh2NGkzMiBWUjEyODokc3JjMiksIHN1Yl9zcykpPjsNCitkZWYgOiBQYXQ8KHYyaTY0IChtb3ZsIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpLA0KKyAgICAgICAgICAoTU9WU0RyciAodjJpNjQgVlIxMjg6JHNyYzEpLA0KKyAgICAgICAgICAgICAgICAgICAoRVhUUkFDVF9TVUJSRUcgKHYyaTY0IFZSMTI4OiRzcmMyKSwgc3ViX3NkKSk+Ow0KKw0KKy8vIHZlY3Rvcl9zaHVmZmxlIHYxLCB2MiA8NCwgNSwgMiwgMz4gdXNpbmcgbW92c2QNCitkZWYgOiBQYXQ8KHY0ZjMyIChtb3ZscCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKE1PVlNEcnIgVlIxMjg6JHNyYzEsIChFWFRSQUNUX1NVQlJFRyBWUjEyODokc3JjMiwgc3ViX3NkKSk+LA0KKyAgICAgIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh2NGkzMiAobW92bHAgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSksDQorICAgICAgICAgIChNT1ZTRHJyIFZSMTI4OiRzcmMxLCAoRVhUUkFDVF9TVUJSRUcgVlIxMjg6JHNyYzIsIHN1Yl9zZCkpPiwNCisgICAgICBSZXF1aXJlczxbSGFzU1NFMl0+Ow0KK30NCisNCisvLyB2ZWN0b3Jfc2h1ZmZsZSB2MSwgdjIgPDQsIDUsIDIsIDM+IHVzaW5nIFNIVUZQU3JyaSAod2UgcHJlZmVyIG1vdnNkLCBidXQNCisvLyBmYWxsIGJhY2sgdG8gdGhpcyBmb3IgU1NFMSkNCitkZWYgOiBQYXQ8KHY0ZjMyIChtb3ZscDokc3JjMyBWUjEyODokc3JjMSwgKHY0ZjMyIFZSMTI4OiRzcmMyKSkpLA0KKyAgICAgICAgICAoU0hVRlBTcnJpIFZSMTI4OiRzcmMyLCBWUjEyODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAoU0hVRkZMRV9nZXRfc2h1Zl9pbW0gVlIxMjg6JHNyYzMpKT47DQorDQorLy8gU2V0IGxvd2VzdCBlbGVtZW50IGFuZCB6ZXJvIHVwcGVyIGVsZW1lbnRzLg0KK2RlZiA6IFBhdDwodjJmNjQgKFg4NnZ6bW92bCAodjJmNjQgVlIxMjg6JHNyYykpKSwNCisgICAgICAgICAgKE1PVlpQUUlMbzJQUUlyciBWUjEyODokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorLy8gU29tZSBzcGVjaWFsIGNhc2UgcGFuZG4gcGF0dGVybnMuDQorZGVmIDogUGF0PCh2Mmk2NCAoYW5kICh4b3IgVlIxMjg6JHNyYzEsIChiY192Mmk2NCAodjRpMzIgaW1tQWxsT25lc1YpKSksDQorICAgICAgICAgICAgICAgICAgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKFBBTkROcnIgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh2Mmk2NCAoYW5kICh4b3IgVlIxMjg6JHNyYzEsIChiY192Mmk2NCAodjhpMTYgaW1tQWxsT25lc1YpKSksDQorICAgICAgICAgICAgICAgICAgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKFBBTkROcnIgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh2Mmk2NCAoYW5kICh4b3IgVlIxMjg6JHNyYzEsIChiY192Mmk2NCAodjE2aTggaW1tQWxsT25lc1YpKSksDQorICAgICAgICAgICAgICAgICAgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKFBBTkROcnIgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorZGVmIDogUGF0PCh2Mmk2NCAoYW5kICh4b3IgVlIxMjg6JHNyYzEsIChiY192Mmk2NCAodjRpMzIgaW1tQWxsT25lc1YpKSksDQorICAgICAgICAgICAgICAgICAgKG1lbW9wIGFkZHI6JHNyYzIpKSksDQorICAgICAgICAgIChQQU5ETnJtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh2Mmk2NCAoYW5kICh4b3IgVlIxMjg6JHNyYzEsIChiY192Mmk2NCAodjhpMTYgaW1tQWxsT25lc1YpKSksDQorICAgICAgICAgICAgICAgICAgKG1lbW9wIGFkZHI6JHNyYzIpKSksDQorICAgICAgICAgIChQQU5ETnJtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh2Mmk2NCAoYW5kICh4b3IgVlIxMjg6JHNyYzEsIChiY192Mmk2NCAodjE2aTggaW1tQWxsT25lc1YpKSksDQorICAgICAgICAgICAgICAgICAgKG1lbW9wIGFkZHI6JHNyYzIpKSksDQorICAgICAgICAgIChQQU5ETnJtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorLy8gdmVjdG9yIC0+IHZlY3RvciBjYXN0cw0KK2RlZiA6IFBhdDwodjRmMzIgKHNpbnRfdG9fZnAgKHY0aTMyIFZSMTI4OiRzcmMpKSksDQorICAgICAgICAgIChJbnRfQ1ZURFEyUFNyciBWUjEyODokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh2NGkzMiAoZnBfdG9fc2ludCAodjRmMzIgVlIxMjg6JHNyYykpKSwNCisgICAgICAgICAgKEludF9DVlRUUFMyRFFyciBWUjEyODokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh2MmY2NCAoc2ludF90b19mcCAodjJpMzIgVlI2NDokc3JjKSkpLA0KKyAgICAgICAgICAoSW50X0NWVFBJMlBEcnIgVlI2NDokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorZGVmIDogUGF0PCh2MmkzMiAoZnBfdG9fc2ludCAodjJmNjQgVlIxMjg6JHNyYykpKSwNCisgICAgICAgICAgKEludF9DVlRUUEQyUElyciBWUjEyODokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0UyXT47DQorDQorLy8gVXNlIG1vdmFwcyAvIG1vdnVwcyBmb3IgU1NFIGludGVnZXIgbG9hZCAvIHN0b3JlIChvbmUgYnl0ZSBzaG9ydGVyKS4NCitkZWYgOiBQYXQ8KGFsaWduZWRsb2FkdjRpMzIgYWRkcjokc3JjKSwNCisgICAgICAgICAgKE1PVkFQU3JtIGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwobG9hZHY0aTMyIGFkZHI6JHNyYyksDQorICAgICAgICAgIChNT1ZVUFNybSBhZGRyOiRzcmMpPjsNCitkZWYgOiBQYXQ8KGFsaWduZWRsb2FkdjJpNjQgYWRkcjokc3JjKSwNCisgICAgICAgICAgKE1PVkFQU3JtIGFkZHI6JHNyYyk+Ow0KK2RlZiA6IFBhdDwobG9hZHYyaTY0IGFkZHI6JHNyYyksDQorICAgICAgICAgIChNT1ZVUFNybSBhZGRyOiRzcmMpPjsNCisNCitkZWYgOiBQYXQ8KGFsaWduZWRzdG9yZSAodjJpNjQgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNT1ZBUFNtciBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpPjsNCitkZWYgOiBQYXQ8KGFsaWduZWRzdG9yZSAodjRpMzIgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNT1ZBUFNtciBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpPjsNCitkZWYgOiBQYXQ8KGFsaWduZWRzdG9yZSAodjhpMTYgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNT1ZBUFNtciBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpPjsNCitkZWYgOiBQYXQ8KGFsaWduZWRzdG9yZSAodjE2aTggVlIxMjg6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNT1ZBUFNtciBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHN0b3JlICh2Mmk2NCBWUjEyODokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1PVlVQU21yIGFkZHI6JGRzdCwgVlIxMjg6JHNyYyk+Ow0KK2RlZiA6IFBhdDwoc3RvcmUgKHY0aTMyIFZSMTI4OiRzcmMpLCBhZGRyOiRkc3QpLA0KKyAgICAgICAgICAoTU9WVVBTbXIgYWRkcjokZHN0LCBWUjEyODokc3JjKT47DQorZGVmIDogUGF0PChzdG9yZSAodjhpMTYgVlIxMjg6JHNyYyksIGFkZHI6JGRzdCksDQorICAgICAgICAgIChNT1ZVUFNtciBhZGRyOiRkc3QsIFZSMTI4OiRzcmMpPjsNCitkZWYgOiBQYXQ8KHN0b3JlICh2MTZpOCBWUjEyODokc3JjKSwgYWRkcjokZHN0KSwNCisgICAgICAgICAgKE1PVlVQU21yIGFkZHI6JGRzdCwgVlIxMjg6JHNyYyk+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFNC4xIC0gUGFja2VkIE1vdmUgd2l0aCBTaWduL1plcm8gRXh0ZW5kDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCittdWx0aWNsYXNzIFNTNDFJX2Jpbm9wX3JtX2ludDg8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsIEludHJpbnNpYyBJbnRJZD4gew0KKyAgZGVmIHJyIDogU1M0OEk8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoSW50SWQgVlIxMjg6JHNyYykpXT4sIE9wU2l6ZTsNCisNCisgIGRlZiBybSA6IFNTNDhJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpNjRtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAoSW50SWQgKGJpdGNvbnZlcnQgKHYyaTY0IChzY2FsYXJfdG9fdmVjdG9yIChsb2FkaTY0IGFkZHI6JHNyYykpKSkpKV0+LA0KKyAgICAgICBPcFNpemU7DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KK2RlZm0gVlBNT1ZTWEJXIDogU1M0MUlfYmlub3Bfcm1faW50ODwweDIwLCAidnBtb3ZzeGJ3IiwgaW50X3g4Nl9zc2U0MV9wbW92c3hidz4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCitkZWZtIFZQTU9WU1hXRCA6IFNTNDFJX2Jpbm9wX3JtX2ludDg8MHgyMywgInZwbW92c3h3ZCIsIGludF94ODZfc3NlNDFfcG1vdnN4d2Q+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorZGVmbSBWUE1PVlNYRFEgOiBTUzQxSV9iaW5vcF9ybV9pbnQ4PDB4MjUsICJ2cG1vdnN4ZHEiLCBpbnRfeDg2X3NzZTQxX3Btb3ZzeGRxPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK2RlZm0gVlBNT1ZaWEJXIDogU1M0MUlfYmlub3Bfcm1faW50ODwweDMwLCAidnBtb3Z6eGJ3IiwgaW50X3g4Nl9zc2U0MV9wbW92enhidz4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCitkZWZtIFZQTU9WWlhXRCA6IFNTNDFJX2Jpbm9wX3JtX2ludDg8MHgzMywgInZwbW92enh3ZCIsIGludF94ODZfc3NlNDFfcG1vdnp4d2Q+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorZGVmbSBWUE1PVlpYRFEgOiBTUzQxSV9iaW5vcF9ybV9pbnQ4PDB4MzUsICJ2cG1vdnp4ZHEiLCBpbnRfeDg2X3NzZTQxX3Btb3Z6eGRxPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK30NCisNCitkZWZtIFBNT1ZTWEJXICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ4PDB4MjAsICJwbW92c3hidyIsIGludF94ODZfc3NlNDFfcG1vdnN4Ync+Ow0KK2RlZm0gUE1PVlNYV0QgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDg8MHgyMywgInBtb3ZzeHdkIiwgaW50X3g4Nl9zc2U0MV9wbW92c3h3ZD47DQorZGVmbSBQTU9WU1hEUSAgIDogU1M0MUlfYmlub3Bfcm1faW50ODwweDI1LCAicG1vdnN4ZHEiLCBpbnRfeDg2X3NzZTQxX3Btb3ZzeGRxPjsNCitkZWZtIFBNT1ZaWEJXICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ4PDB4MzAsICJwbW92enhidyIsIGludF94ODZfc3NlNDFfcG1vdnp4Ync+Ow0KK2RlZm0gUE1PVlpYV0QgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDg8MHgzMywgInBtb3Z6eHdkIiwgaW50X3g4Nl9zc2U0MV9wbW92enh3ZD47DQorZGVmbSBQTU9WWlhEUSAgIDogU1M0MUlfYmlub3Bfcm1faW50ODwweDM1LCAicG1vdnp4ZHEiLCBpbnRfeDg2X3NzZTQxX3Btb3Z6eGRxPjsNCisNCisvLyBDb21tb24gcGF0dGVybnMgaW52b2x2aW5nIHNjYWxhciBsb2FkLg0KK2RlZiA6IFBhdDwoaW50X3g4Nl9zc2U0MV9wbW92c3hidyAodnptb3ZsX3YyaTY0IGFkZHI6JHNyYykpLA0KKyAgICAgICAgICAoUE1PVlNYQldybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTQxXT47DQorZGVmIDogUGF0PChpbnRfeDg2X3NzZTQxX3Btb3ZzeGJ3ICh2emxvYWRfdjJpNjQgYWRkcjokc3JjKSksDQorICAgICAgICAgIChQTU9WU1hCV3JtIGFkZHI6JHNyYyk+LCBSZXF1aXJlczxbSGFzU1NFNDFdPjsNCisNCitkZWYgOiBQYXQ8KGludF94ODZfc3NlNDFfcG1vdnN4d2QgKHZ6bW92bF92Mmk2NCBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFBNT1ZTWFdEcm0gYWRkcjokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0U0MV0+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9zc2U0MV9wbW92c3h3ZCAodnpsb2FkX3YyaTY0IGFkZHI6JHNyYykpLA0KKyAgICAgICAgICAoUE1PVlNYV0RybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTQxXT47DQorDQorZGVmIDogUGF0PChpbnRfeDg2X3NzZTQxX3Btb3ZzeGRxICh2em1vdmxfdjJpNjQgYWRkcjokc3JjKSksDQorICAgICAgICAgIChQTU9WU1hEUXJtIGFkZHI6JHNyYyk+LCBSZXF1aXJlczxbSGFzU1NFNDFdPjsNCitkZWYgOiBQYXQ8KGludF94ODZfc3NlNDFfcG1vdnN4ZHEgKHZ6bG9hZF92Mmk2NCBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFBNT1ZTWERRcm0gYWRkcjokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0U0MV0+Ow0KKw0KK2RlZiA6IFBhdDwoaW50X3g4Nl9zc2U0MV9wbW92enhidyAodnptb3ZsX3YyaTY0IGFkZHI6JHNyYykpLA0KKyAgICAgICAgICAoUE1PVlpYQldybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTQxXT47DQorZGVmIDogUGF0PChpbnRfeDg2X3NzZTQxX3Btb3Z6eGJ3ICh2emxvYWRfdjJpNjQgYWRkcjokc3JjKSksDQorICAgICAgICAgIChQTU9WWlhCV3JtIGFkZHI6JHNyYyk+LCBSZXF1aXJlczxbSGFzU1NFNDFdPjsNCisNCitkZWYgOiBQYXQ8KGludF94ODZfc3NlNDFfcG1vdnp4d2QgKHZ6bW92bF92Mmk2NCBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFBNT1ZaWFdEcm0gYWRkcjokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0U0MV0+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9zc2U0MV9wbW92enh3ZCAodnpsb2FkX3YyaTY0IGFkZHI6JHNyYykpLA0KKyAgICAgICAgICAoUE1PVlpYV0RybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTQxXT47DQorDQorZGVmIDogUGF0PChpbnRfeDg2X3NzZTQxX3Btb3Z6eGRxICh2em1vdmxfdjJpNjQgYWRkcjokc3JjKSksDQorICAgICAgICAgIChQTU9WWlhEUXJtIGFkZHI6JHNyYyk+LCBSZXF1aXJlczxbSGFzU1NFNDFdPjsNCitkZWYgOiBQYXQ8KGludF94ODZfc3NlNDFfcG1vdnp4ZHEgKHZ6bG9hZF92Mmk2NCBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFBNT1ZaWERRcm0gYWRkcjokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0U0MV0+Ow0KKw0KKw0KK211bHRpY2xhc3MgU1M0MUlfYmlub3Bfcm1faW50NDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgSW50cmluc2ljIEludElkPiB7DQorICBkZWYgcnIgOiBTUzQ4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChJbnRJZCBWUjEyODokc3JjKSldPiwgT3BTaXplOw0KKw0KKyAgZGVmIHJtIDogU1M0OEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIGkzMm1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYywgJGRzdHwkZHN0LCAkc3JjfSIpLA0KKyAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgIChJbnRJZCAoYml0Y29udmVydCAodjRpMzIgKHNjYWxhcl90b192ZWN0b3IgKGxvYWRpMzIgYWRkcjokc3JjKSkpKSkpXT4sDQorICAgICAgICAgIE9wU2l6ZTsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbiB7DQorZGVmbSBWUE1PVlNYQkQgOiBTUzQxSV9iaW5vcF9ybV9pbnQ0PDB4MjEsICJ2cG1vdnN4YmQiLCBpbnRfeDg2X3NzZTQxX3Btb3ZzeGJkPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK2RlZm0gVlBNT1ZTWFdRIDogU1M0MUlfYmlub3Bfcm1faW50NDwweDI0LCAidnBtb3ZzeHdxIiwgaW50X3g4Nl9zc2U0MV9wbW92c3h3cT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCitkZWZtIFZQTU9WWlhCRCA6IFNTNDFJX2Jpbm9wX3JtX2ludDQ8MHgzMSwgInZwbW92enhiZCIsIGludF94ODZfc3NlNDFfcG1vdnp4YmQ+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorZGVmbSBWUE1PVlpYV1EgOiBTUzQxSV9iaW5vcF9ybV9pbnQ0PDB4MzQsICJ2cG1vdnp4d3EiLCBpbnRfeDg2X3NzZTQxX3Btb3Z6eHdxPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK30NCisNCitkZWZtIFBNT1ZTWEJEICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ0PDB4MjEsICJwbW92c3hiZCIsIGludF94ODZfc3NlNDFfcG1vdnN4YmQ+Ow0KK2RlZm0gUE1PVlNYV1EgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDQ8MHgyNCwgInBtb3ZzeHdxIiwgaW50X3g4Nl9zc2U0MV9wbW92c3h3cT47DQorZGVmbSBQTU9WWlhCRCAgIDogU1M0MUlfYmlub3Bfcm1faW50NDwweDMxLCAicG1vdnp4YmQiLCBpbnRfeDg2X3NzZTQxX3Btb3Z6eGJkPjsNCitkZWZtIFBNT1ZaWFdRICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ0PDB4MzQsICJwbW92enh3cSIsIGludF94ODZfc3NlNDFfcG1vdnp4d3E+Ow0KKw0KKy8vIENvbW1vbiBwYXR0ZXJucyBpbnZvbHZpbmcgc2NhbGFyIGxvYWQNCitkZWYgOiBQYXQ8KGludF94ODZfc3NlNDFfcG1vdnN4YmQgKHZ6bW92bF92NGkzMiBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFBNT1ZTWEJEcm0gYWRkcjokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0U0MV0+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9zc2U0MV9wbW92c3h3cSAodnptb3ZsX3Y0aTMyIGFkZHI6JHNyYykpLA0KKyAgICAgICAgICAoUE1PVlNYV1FybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTQxXT47DQorDQorZGVmIDogUGF0PChpbnRfeDg2X3NzZTQxX3Btb3Z6eGJkICh2em1vdmxfdjRpMzIgYWRkcjokc3JjKSksDQorICAgICAgICAgIChQTU9WWlhCRHJtIGFkZHI6JHNyYyk+LCBSZXF1aXJlczxbSGFzU1NFNDFdPjsNCitkZWYgOiBQYXQ8KGludF94ODZfc3NlNDFfcG1vdnp4d3EgKHZ6bW92bF92NGkzMiBhZGRyOiRzcmMpKSwNCisgICAgICAgICAgKFBNT1ZaWFdRcm0gYWRkcjokc3JjKT4sIFJlcXVpcmVzPFtIYXNTU0U0MV0+Ow0KKw0KKw0KK211bHRpY2xhc3MgU1M0MUlfYmlub3Bfcm1faW50MjxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgSW50cmluc2ljIEludElkPiB7DQorICBkZWYgcnIgOiBTUzQ4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYyksDQorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChJbnRJZCBWUjEyODokc3JjKSldPiwgT3BTaXplOw0KKw0KKyAgLy8gRXhwZWN0aW5nIGEgaTE2IGxvYWQgYW55IGV4dGVuZGVkIHRvIGkzMiB2YWx1ZS4NCisgIGRlZiBybSA6IFNTNDhJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwgKGlucyBpMTZtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iKSwNCisgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChJbnRJZCAoYml0Y29udmVydA0KKyAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGkxNl9hbnlleHQgYWRkcjokc3JjKSkpKSkpXT4sDQorICAgICAgICAgICAgICAgICBPcFNpemU7DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KK2RlZm0gVlBNT1ZTWEJRIDogU1M0MUlfYmlub3Bfcm1faW50MjwweDIyLCAidnBtb3ZzeGJxIiwgaW50X3g4Nl9zc2U0MV9wbW92c3hicT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCitkZWZtIFZQTU9WWlhCUSA6IFNTNDFJX2Jpbm9wX3JtX2ludDI8MHgzMiwgInZwbW92enhicSIsIGludF94ODZfc3NlNDFfcG1vdnp4YnE+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorfQ0KK2RlZm0gUE1PVlNYQlEgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDI8MHgyMiwgInBtb3ZzeGJxIiwgaW50X3g4Nl9zc2U0MV9wbW92c3hicT47DQorZGVmbSBQTU9WWlhCUSAgIDogU1M0MUlfYmlub3Bfcm1faW50MjwweDMyLCAicG1vdnp4YnEiLCBpbnRfeDg2X3NzZTQxX3Btb3Z6eGJxPjsNCisNCisvLyBDb21tb24gcGF0dGVybnMgaW52b2x2aW5nIHNjYWxhciBsb2FkDQorZGVmIDogUGF0PChpbnRfeDg2X3NzZTQxX3Btb3ZzeGJxDQorICAgICAgICAgICAgKGJpdGNvbnZlcnQgKHY0aTMyIChYODZ2em1vdmwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGkzMiBhZGRyOiRzcmMpKSkpKSkpLA0KKyAgICAgICAgICAoUE1PVlNYQlFybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTQxXT47DQorDQorZGVmIDogUGF0PChpbnRfeDg2X3NzZTQxX3Btb3Z6eGJxDQorICAgICAgICAgICAgKGJpdGNvbnZlcnQgKHY0aTMyIChYODZ2em1vdmwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2NGkzMiAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGkzMiBhZGRyOiRzcmMpKSkpKSkpLA0KKyAgICAgICAgICAoUE1PVlpYQlFybSBhZGRyOiRzcmMpPiwgUmVxdWlyZXM8W0hhc1NTRTQxXT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0U0LjEgLSBFeHRyYWN0IEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8vIFNTNDFJX2Jpbm9wX2V4dDggLSBTU0UgNC4xIGV4dHJhY3QgOCBiaXRzIHRvIDMyIGJpdCByZWcgb3IgOCBiaXQgbWVtDQorbXVsdGljbGFzcyBTUzQxSV9leHRyYWN0ODxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0cj4gew0KKyAgZGVmIHJyIDogU1M0QUlpODxvcGMsIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwgKFg4NnBleHRyYiAodjE2aTggVlIxMjg6JHNyYzEpLCBpbW06JHNyYzIpKV0+LA0KKyAgICAgICAgICAgICAgICAgT3BTaXplOw0KKyAgZGVmIG1yIDogU1M0QUlpODxvcGMsIE1STURlc3RNZW0sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgIChpbnMgaThtZW06JGRzdCwgVlIxMjg6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgW10+LCBPcFNpemU7DQorLy8gRklYTUU6DQorLy8gVGhlcmUncyBhbiBBc3NlcnRaZXh0IGluIHRoZSB3YXkgb2Ygd3JpdGluZyB0aGUgc3RvcmUgcGF0dGVybg0KKy8vIChzdG9yZSAoaTggKHRydW5jIChYODZwZXh0cmIgKHYxNmk4IFZSMTI4OiRzcmMxKSwgaW1tOiRzcmMyKSkpLCBhZGRyOiRkc3QpDQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KKyAgZGVmbSBWUEVYVFJCIDogU1M0MUlfZXh0cmFjdDg8MHgxNCwgInZwZXh0cmIiPiwgVkVYOw0KKyAgZGVmICBWUEVYVFJCcnI2NCA6IFNTNEFJaTg8MHgxNCwgTVJNRGVzdFJlZywgKG91dHMgR1I2NDokZHN0KSwNCisgICAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgInZwZXh0cmJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsIFtdPiwgT3BTaXplLCBWRVg7DQorfQ0KKw0KK2RlZm0gUEVYVFJCICAgICAgOiBTUzQxSV9leHRyYWN0ODwweDE0LCAicGV4dHJiIj47DQorDQorDQorLy8vIFNTNDFJX2V4dHJhY3QxNiAtIFNTRSA0LjEgZXh0cmFjdCAxNiBiaXRzIHRvIG1lbW9yeSBkZXN0aW5hdGlvbg0KK211bHRpY2xhc3MgU1M0MUlfZXh0cmFjdDE2PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyPiB7DQorICBkZWYgbXIgOiBTUzRBSWk4PG9wYywgTVJNRGVzdE1lbSwgKG91dHMpLA0KKyAgICAgICAgICAgICAgICAgKGlucyBpMTZtZW06JGRzdCwgVlIxMjg6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgW10+LCBPcFNpemU7DQorLy8gRklYTUU6DQorLy8gVGhlcmUncyBhbiBBc3NlcnRaZXh0IGluIHRoZSB3YXkgb2Ygd3JpdGluZyB0aGUgc3RvcmUgcGF0dGVybg0KKy8vIChzdG9yZSAoaTE2ICh0cnVuYyAoWDg2cGV4dHJ3ICh2MTZpOCBWUjEyODokc3JjMSksIGltbTokc3JjMikpKSwgYWRkcjokZHN0KQ0KK30NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluDQorICBkZWZtIFZQRVhUUlcgOiBTUzQxSV9leHRyYWN0MTY8MHgxNSwgInZwZXh0cnciPiwgVkVYOw0KKw0KK2RlZm0gUEVYVFJXICAgICAgOiBTUzQxSV9leHRyYWN0MTY8MHgxNSwgInBleHRydyI+Ow0KKw0KKw0KKy8vLyBTUzQxSV9leHRyYWN0MzIgLSBTU0UgNC4xIGV4dHJhY3QgMzIgYml0cyB0byBpbnQgcmVnIG9yIG1lbW9yeSBkZXN0aW5hdGlvbg0KK211bHRpY2xhc3MgU1M0MUlfZXh0cmFjdDMyPGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyPiB7DQorICBkZWYgcnIgOiBTUzRBSWk4PG9wYywgTVJNRGVzdFJlZywgKG91dHMgR1IzMjokZHN0KSwNCisgICAgICAgICAgICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LA0KKyAgICAgICAgICAgICAgICAgIChleHRyYWN0ZWx0ICh2NGkzMiBWUjEyODokc3JjMSksIGltbTokc3JjMikpXT4sIE9wU2l6ZTsNCisgIGRlZiBtciA6IFNTNEFJaTg8b3BjLCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAoaW5zIGkzMm1lbTokZHN0LCBWUjEyODokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChleHRyYWN0ZWx0ICh2NGkzMiBWUjEyODokc3JjMSksIGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyOiRkc3QpXT4sIE9wU2l6ZTsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbg0KKyAgZGVmbSBWUEVYVFJEIDogU1M0MUlfZXh0cmFjdDMyPDB4MTYsICJ2cGV4dHJkIj4sIFZFWDsNCisNCitkZWZtIFBFWFRSRCAgICAgIDogU1M0MUlfZXh0cmFjdDMyPDB4MTYsICJwZXh0cmQiPjsNCisNCisvLy8gU1M0MUlfZXh0cmFjdDMyIC0gU1NFIDQuMSBleHRyYWN0IDMyIGJpdHMgdG8gaW50IHJlZyBvciBtZW1vcnkgZGVzdGluYXRpb24NCittdWx0aWNsYXNzIFNTNDFJX2V4dHJhY3Q2NDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0cj4gew0KKyAgZGVmIHJyIDogU1M0QUlpODxvcGMsIE1STURlc3RSZWcsIChvdXRzIEdSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSNjQ6JGRzdCwNCisgICAgICAgICAgICAgICAgICAoZXh0cmFjdGVsdCAodjJpNjQgVlIxMjg6JHNyYzEpLCBpbW06JHNyYzIpKV0+LCBPcFNpemUsIFJFWF9XOw0KKyAgZGVmIG1yIDogU1M0QUlpODxvcGMsIE1STURlc3RNZW0sIChvdXRzKSwNCisgICAgICAgICAgICAgICAgIChpbnMgaTY0bWVtOiRkc3QsIFZSMTI4OiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgIFsoc3RvcmUgKGV4dHJhY3RlbHQgKHYyaTY0IFZSMTI4OiRzcmMxKSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCldPiwgT3BTaXplLCBSRVhfVzsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbg0KKyAgZGVmbSBWUEVYVFJRIDogU1M0MUlfZXh0cmFjdDY0PDB4MTYsICJ2cGV4dHJxIj4sIFZFWCwgVkVYX1c7DQorDQorZGVmbSBQRVhUUlEgICAgICA6IFNTNDFJX2V4dHJhY3Q2NDwweDE2LCAicGV4dHJxIj47DQorDQorLy8vIFNTNDFJX2V4dHJhY3RmMzIgLSBTU0UgNC4xIGV4dHJhY3QgMzIgYml0cyBmcCB2YWx1ZSB0byBpbnQgcmVnIG9yIG1lbW9yeQ0KKy8vLyBkZXN0aW5hdGlvbg0KK211bHRpY2xhc3MgU1M0MUlfZXh0cmFjdGYzMjxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0cj4gew0KKyAgZGVmIHJyIDogU1M0QUlpODxvcGMsIE1STURlc3RSZWcsIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgIChleHRyYWN0ZWx0IChiY192NGkzMiAodjRmMzIgVlIxMjg6JHNyYzEpKSwgaW1tOiRzcmMyKSldPiwNCisgICAgICAgICAgIE9wU2l6ZTsNCisgIGRlZiBtciA6IFNTNEFJaTg8b3BjLCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgICAgICAoaW5zIGYzMm1lbTokZHN0LCBWUjEyODokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICAgICBbKHN0b3JlIChleHRyYWN0ZWx0IChiY192NGkzMiAodjRmMzIgVlIxMjg6JHNyYzEpKSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCldPiwgT3BTaXplOw0KK30NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisgIGRlZm0gVkVYVFJBQ1RQUyA6IFNTNDFJX2V4dHJhY3RmMzI8MHgxNywgInZleHRyYWN0cHMiPiwgVkVYOw0KKyAgZGVmIFZFWFRSQUNUUFNycjY0IDogU1M0QUlpODwweDE3LCBNUk1EZXN0UmVnLCAob3V0cyBHUjY0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAidmV4dHJhY3RwcyBcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgW10+LCBPcFNpemUsIFZFWDsNCit9DQorZGVmbSBFWFRSQUNUUFMgICA6IFNTNDFJX2V4dHJhY3RmMzI8MHgxNywgImV4dHJhY3RwcyI+Ow0KKw0KKy8vIEFsc28gbWF0Y2ggYW4gRVhUUkFDVFBTIHN0b3JlIHdoZW4gdGhlIHN0b3JlIGlzIGRvbmUgYXMgZjMyIGluc3RlYWQgb2YgaTMyLg0KK2RlZiA6IFBhdDwoc3RvcmUgKGYzMiAoYml0Y29udmVydCAoZXh0cmFjdGVsdCAoYmNfdjRpMzIgKHY0ZjMyIFZSMTI4OiRzcmMxKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokc3JjMikpKSwNCisgICAgICAgICAgICAgICAgIGFkZHI6JGRzdCksDQorICAgICAgICAgIChFWFRSQUNUUFNtciBhZGRyOiRkc3QsIFZSMTI4OiRzcmMxLCBpbW06JHNyYzIpPiwNCisgICAgICAgICBSZXF1aXJlczxbSGFzU1NFNDFdPjsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRTQuMSAtIEluc2VydCBJbnN0cnVjdGlvbnMNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK211bHRpY2xhc3MgU1M0MUlfaW5zZXJ0ODxiaXRzPDg+IG9wYywgc3RyaW5nIGFzbSwgYml0IElzMkFkZHIgPSAxPiB7DQorICBkZWYgcnIgOiBTUzRBSWk4PG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBHUjMyOiRzcmMyLCBpMzJpOGltbTokc3JjMyksDQorICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwNCisgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgIChYODZwaW5zcmIgVlIxMjg6JHNyYzEsIEdSMzI6JHNyYzIsIGltbTokc3JjMykpXT4sIE9wU2l6ZTsNCisgIGRlZiBybSA6IFNTNEFJaTg8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgIChpbnMgVlIxMjg6JHNyYzEsIGk4bWVtOiRzcmMyLCBpMzJpOGltbTokc3JjMyksDQorICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwNCisgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgIChYODZwaW5zcmIgVlIxMjg6JHNyYzEsIChleHRsb2FkaTggYWRkcjokc3JjMiksDQorICAgICAgICAgICAgICAgICAgIGltbTokc3JjMykpXT4sIE9wU2l6ZTsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbg0KKyAgZGVmbSBWUElOU1JCIDogU1M0MUlfaW5zZXJ0ODwweDIwLCAidnBpbnNyYiIsIDA+LCBWRVhfNFY7DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4NCisgIGRlZm0gUElOU1JCICA6IFNTNDFJX2luc2VydDg8MHgyMCwgInBpbnNyYiI+Ow0KKw0KK211bHRpY2xhc3MgU1M0MUlfaW5zZXJ0MzI8Yml0czw4PiBvcGMsIHN0cmluZyBhc20sIGJpdCBJczJBZGRyID0gMT4gew0KKyAgZGVmIHJyIDogU1M0QUlpODxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgKGlucyBWUjEyODokc3JjMSwgR1IzMjokc3JjMiwgaTMyaThpbW06JHNyYzMpLA0KKyAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgICAgIXN0cmNvbmNhdChhc20sDQorICAgICAgICAgICAgICAgICAgICJcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IikpLA0KKyAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAodjRpMzIgKGluc2VydGVsdCBWUjEyODokc3JjMSwgR1IzMjokc3JjMiwgaW1tOiRzcmMzKSkpXT4sDQorICAgICAgT3BTaXplOw0KKyAgZGVmIHJtIDogU1M0QUlpODxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgKGlucyBWUjEyODokc3JjMSwgaTMybWVtOiRzcmMyLCBpMzJpOGltbTokc3JjMyksDQorICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwNCisgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICh2NGkzMiAoaW5zZXJ0ZWx0IFZSMTI4OiRzcmMxLCAobG9hZGkzMiBhZGRyOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokc3JjMykpKV0+LCBPcFNpemU7DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4NCisgIGRlZm0gVlBJTlNSRCA6IFNTNDFJX2luc2VydDMyPDB4MjIsICJ2cGluc3JkIiwgMD4sIFZFWF80VjsNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbg0KKyAgZGVmbSBQSU5TUkQgOiBTUzQxSV9pbnNlcnQzMjwweDIyLCAicGluc3JkIj47DQorDQorbXVsdGljbGFzcyBTUzQxSV9pbnNlcnQ2NDxiaXRzPDg+IG9wYywgc3RyaW5nIGFzbSwgYml0IElzMkFkZHIgPSAxPiB7DQorICBkZWYgcnIgOiBTUzRBSWk4PG9wYywgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBHUjY0OiRzcmMyLCBpMzJpOGltbTokc3JjMyksDQorICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwNCisgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICh2Mmk2NCAoaW5zZXJ0ZWx0IFZSMTI4OiRzcmMxLCBHUjY0OiRzcmMyLCBpbW06JHNyYzMpKSldPiwNCisgICAgICBPcFNpemU7DQorICBkZWYgcm0gOiBTUzRBSWk4PG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpNjRtZW06JHNyYzIsIGkzMmk4aW1tOiRzcmMzKSwNCisgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYzMsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAkc3JjM30iKSwNCisgICAgICAgICFzdHJjb25jYXQoYXNtLA0KKyAgICAgICAgICAgICAgICAgICAiXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzIsICRzcmMzfSIpKSwNCisgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgKHYyaTY0IChpbnNlcnRlbHQgVlIxMjg6JHNyYzEsIChsb2FkaTY0IGFkZHI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tOiRzcmMzKSkpXT4sIE9wU2l6ZTsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbg0KKyAgZGVmbSBWUElOU1JRIDogU1M0MUlfaW5zZXJ0NjQ8MHgyMiwgInZwaW5zcnEiLCAwPiwgVkVYXzRWLCBWRVhfVzsNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbg0KKyAgZGVmbSBQSU5TUlEgOiBTUzQxSV9pbnNlcnQ2NDwweDIyLCAicGluc3JxIj4sIFJFWF9XOw0KKw0KKy8vIGluc2VydHBzIGhhcyBhIGZldyBkaWZmZXJlbnQgbW9kZXMsIHRoZXJlJ3MgdGhlIGZpcnN0IHR3byBoZXJlIGJlbG93IHdoaWNoDQorLy8gYXJlIG9wdGltaXplZCBpbnNlcnRzIHRoYXQgd29uJ3QgemVybyBhcmJpdHJhcnkgZWxlbWVudHMgaW4gdGhlIGRlc3RpbmF0aW9uDQorLy8gdmVjdG9yLiBUaGUgbmV4dCBvbmUgbWF0Y2hlcyB0aGUgaW50cmluc2ljIGFuZCBjb3VsZCB6ZXJvIGFyYml0cmFyeSBlbGVtZW50cw0KKy8vIGluIHRoZSB0YXJnZXQgdmVjdG9yLg0KK211bHRpY2xhc3MgU1M0MUlfaW5zZXJ0ZjMyPGJpdHM8OD4gb3BjLCBzdHJpbmcgYXNtLCBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGRlZiByciA6IFNTNEFJaTg8b3BjLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyLCBpMzJpOGltbTokc3JjMyksDQorICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgICAhc3RyY29uY2F0KGFzbSwNCisgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgIChYODZpbnNydHBzIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwgaW1tOiRzcmMzKSldPiwNCisgICAgICBPcFNpemU7DQorICBkZWYgcm0gOiBTUzRBSWk4PG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBmMzJtZW06JHNyYzIsIGkzMmk4aW1tOiRzcmMzKSwNCisgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYzMsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAkc3JjM30iKSwNCisgICAgICAgICFzdHJjb25jYXQoYXNtLA0KKyAgICAgICAgICAgICAgICAgICAiXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzIsICRzcmMzfSIpKSwNCisgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgKFg4Nmluc3J0cHMgVlIxMjg6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICh2NGYzMiAoc2NhbGFyX3RvX3ZlY3RvciAobG9hZGYzMiBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAgICAgICAgICAgaW1tOiRzcmMzKSldPiwgT3BTaXplOw0KK30NCisNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbg0KKyAgZGVmbSBJTlNFUlRQUyA6IFNTNDFJX2luc2VydGYzMjwweDIxLCAiaW5zZXJ0cHMiPjsNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluDQorICBkZWZtIFZJTlNFUlRQUyA6IFNTNDFJX2luc2VydGYzMjwweDIxLCAidmluc2VydHBzIiwgMD4sIFZFWF80VjsNCisNCitkZWYgOiBQYXQ8KGludF94ODZfc3NlNDFfaW5zZXJ0cHMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyLCBpbW06JHNyYzMpLA0KKyAgICAgICAgICAoVklOU0VSVFBTcnIgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyLCBpbW06JHNyYzMpPiwNCisgICAgICAgICAgUmVxdWlyZXM8W0hhc0FWWF0+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9zc2U0MV9pbnNlcnRwcyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIsIGltbTokc3JjMyksDQorICAgICAgICAgIChJTlNFUlRQU3JyIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwgaW1tOiRzcmMzKT4sDQorICAgICAgICAgIFJlcXVpcmVzPFtIYXNTU0U0MV0+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFNC4xIC0gUm91bmQgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCittdWx0aWNsYXNzIHNzZTQxX2ZwX3Vub3Bfcm08Yml0czw4PiBvcGNwcywgYml0czw4PiBvcGNwZCwgc3RyaW5nIE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2TWVtT3BlcmFuZCB4ODZtZW1vcCwgUmVnaXN0ZXJDbGFzcyBSQywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0RnJhZyBtZW1fZnJhZzMyLCBQYXRGcmFnIG1lbV9mcmFnNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBWNEYzMkludCwgSW50cmluc2ljIFYyRjY0SW50PiB7DQorICAvLyBJbnRyaW5zaWMgb3BlcmF0aW9uLCByZWcuDQorICAvLyBWZWN0b3IgaW50cmluc2ljIG9wZXJhdGlvbiwgcmVnDQorICBkZWYgUFNyX0ludCA6IFNTNEFJaTg8b3BjcHMsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIFJDOiRkc3QpLCAoaW5zIFJDOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICJwc1x0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBSQzokZHN0LCAoVjRGMzJJbnQgUkM6JHNyYzEsIGltbTokc3JjMikpXT4sDQorICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorDQorICAvLyBWZWN0b3IgaW50cmluc2ljIG9wZXJhdGlvbiwgbWVtDQorICBkZWYgUFNtX0ludCA6IElpODxvcGNwcywgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgUkM6JGRzdCksIChpbnMgZjI1Nm1lbTokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAicHNcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgICAgWyhzZXQgUkM6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChWNEYzMkludCAobWVtX2ZyYWczMiBhZGRyOiRzcmMxKSxpbW06JHNyYzIpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgVEEsIE9wU2l6ZSwNCisgICAgICAgICAgICAgICAgUmVxdWlyZXM8W0hhc1NTRTQxXT47DQorDQorICAvLyBWZWN0b3IgaW50cmluc2ljIG9wZXJhdGlvbiwgcmVnDQorICBkZWYgUERyX0ludCA6IFNTNEFJaTg8b3BjcGQsIE1STVNyY1JlZywNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIFJDOiRkc3QpLCAoaW5zIFJDOiRzcmMxLCBpMzJpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICJwZFx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBSQzokZHN0LCAoVjJGNjRJbnQgUkM6JHNyYzEsIGltbTokc3JjMikpXT4sDQorICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorDQorICAvLyBWZWN0b3IgaW50cmluc2ljIG9wZXJhdGlvbiwgbWVtDQorICBkZWYgUERtX0ludCA6IFNTNEFJaTg8b3BjcGQsIE1STVNyY01lbSwNCisgICAgICAgICAgICAgICAgICAgIChvdXRzIFJDOiRkc3QpLCAoaW5zIGYyNTZtZW06JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgInBkXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFJDOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoVjJGNjRJbnQgKG1lbV9mcmFnNjQgYWRkcjokc3JjMSksaW1tOiRzcmMyKSldPiwNCisgICAgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCit9DQorDQorbXVsdGljbGFzcyBzc2U0MV9mcF91bm9wX3JtX2F2eF9wPGJpdHM8OD4gb3BjcHMsIGJpdHM8OD4gb3BjcGQsDQorICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MgUkMsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsIHN0cmluZyBPcGNvZGVTdHI+IHsNCisgIC8vIEludHJpbnNpYyBvcGVyYXRpb24sIHJlZy4NCisgIC8vIFZlY3RvciBpbnRyaW5zaWMgb3BlcmF0aW9uLCByZWcNCisgIGRlZiBQU3IgOiBTUzRBSWk4PG9wY3BzLCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAicHNcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgICAgW10+LCBPcFNpemU7DQorDQorICAvLyBWZWN0b3IgaW50cmluc2ljIG9wZXJhdGlvbiwgbWVtDQorICBkZWYgUFNtIDogSWk4PG9wY3BzLCBNUk1TcmNNZW0sDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBSQzokZHN0KSwgKGlucyB4ODZtZW1vcDokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAicHNcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgICAgW10+LCBUQSwgT3BTaXplLCBSZXF1aXJlczxbSGFzU1NFNDFdPjsNCisNCisgIC8vIFZlY3RvciBpbnRyaW5zaWMgb3BlcmF0aW9uLCByZWcNCisgIGRlZiBQRHIgOiBTUzRBSWk4PG9wY3BkLCBNUk1TcmNSZWcsDQorICAgICAgICAgICAgICAgICAgICAob3V0cyBSQzokZHN0KSwgKGlucyBSQzokc3JjMSwgaTMyaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAicGRcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICAgICAgICAgW10+LCBPcFNpemU7DQorDQorICAvLyBWZWN0b3IgaW50cmluc2ljIG9wZXJhdGlvbiwgbWVtDQorICBkZWYgUERtIDogU1M0QUlpODxvcGNwZCwgTVJNU3JjTWVtLA0KKyAgICAgICAgICAgICAgICAgICAgKG91dHMgUkM6JGRzdCksIChpbnMgeDg2bWVtb3A6JHNyYzEsIGkzMmk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgInBkXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgICAgICAgIFtdPiwgT3BTaXplOw0KK30NCisNCittdWx0aWNsYXNzIHNzZTQxX2ZwX2Jpbm9wX3JtPGJpdHM8OD4gb3Bjc3MsIGJpdHM8OD4gb3Bjc2QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBGMzJJbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBGNjRJbnQsIGJpdCBJczJBZGRyID0gMT4gew0KKyAgLy8gSW50cmluc2ljIG9wZXJhdGlvbiwgcmVnLg0KKyAgZGVmIFNTcl9JbnQgOiBTUzRBSWk4PG9wY3NzLCBNUk1TcmNSZWcsDQorICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIsIGkzMmk4aW1tOiRzcmMzKSwNCisgICAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAic3NcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAic3NcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IikpLA0KKyAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEYzMkludCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIsIGltbTokc3JjMykpXT4sDQorICAgICAgICBPcFNpemU7DQorDQorICAvLyBJbnRyaW5zaWMgb3BlcmF0aW9uLCBtZW0uDQorICBkZWYgU1NtX0ludCA6IFNTNEFJaTg8b3Bjc3MsIE1STVNyY01lbSwNCisgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBzc21lbTokc3JjMiwgaTMyaThpbW06JHNyYzMpLA0KKyAgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICJzc1x0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICJzc1x0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgICAgICAoRjMySW50IFZSMTI4OiRzcmMxLCBzc2VfbG9hZF9mMzI6JHNyYzIsIGltbTokc3JjMykpXT4sDQorICAgICAgICBPcFNpemU7DQorDQorICAvLyBJbnRyaW5zaWMgb3BlcmF0aW9uLCByZWcuDQorICBkZWYgU0RyX0ludCA6IFNTNEFJaTg8b3Bjc2QsIE1STVNyY1JlZywNCisgICAgICAgIChvdXRzIFZSMTI4OiRkc3QpLCAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwgaTMyaThpbW06JHNyYzMpLA0KKyAgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICJzZFx0eyRzcmMzLCAkc3JjMiwgJGRzdHwkZHN0LCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICJzZFx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSksDQorICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoRjY0SW50IFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwgaW1tOiRzcmMzKSldPiwNCisgICAgICAgIE9wU2l6ZTsNCisNCisgIC8vIEludHJpbnNpYyBvcGVyYXRpb24sIG1lbS4NCisgIGRlZiBTRG1fSW50IDogU1M0QUlpODxvcGNzZCwgTVJNU3JjTWVtLA0KKyAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIHNkbWVtOiRzcmMyLCBpMzJpOGltbTokc3JjMyksDQorICAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgInNkXHR7JHNyYzMsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAkc3JjM30iKSwNCisgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgInNkXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzIsICRzcmMzfSIpKSwNCisgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAoRjY0SW50IFZSMTI4OiRzcmMxLCBzc2VfbG9hZF9mNjQ6JHNyYzIsIGltbTokc3JjMykpXT4sDQorICAgICAgICBPcFNpemU7DQorfQ0KKw0KK211bHRpY2xhc3Mgc3NlNDFfZnBfYmlub3Bfcm1fYXZ4X3M8Yml0czw4PiBvcGNzcywgYml0czw4PiBvcGNzZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBPcGNvZGVTdHI+IHsNCisgIC8vIEludHJpbnNpYyBvcGVyYXRpb24sIHJlZy4NCisgIGRlZiBTU3IgOiBTUzRBSWk4PG9wY3NzLCBNUk1TcmNSZWcsDQorICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIsIGkzMmk4aW1tOiRzcmMzKSwNCisgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAic3NcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgICBbXT4sIE9wU2l6ZTsNCisNCisgIC8vIEludHJpbnNpYyBvcGVyYXRpb24sIG1lbS4NCisgIGRlZiBTU20gOiBTUzRBSWk4PG9wY3NzLCBNUk1TcmNNZW0sDQorICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjMSwgc3NtZW06JHNyYzIsIGkzMmk4aW1tOiRzcmMzKSwNCisgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAic3NcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IiksDQorICAgICAgICBbXT4sIE9wU2l6ZTsNCisNCisgIC8vIEludHJpbnNpYyBvcGVyYXRpb24sIHJlZy4NCisgIGRlZiBTRHIgOiBTUzRBSWk4PG9wY3NkLCBNUk1TcmNSZWcsDQorICAgICAgICAob3V0cyBWUjEyODokZHN0KSwgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIsIGkzMmk4aW1tOiRzcmMzKSwNCisgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgInNkXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgICAgW10+LCBPcFNpemU7DQorDQorICAvLyBJbnRyaW5zaWMgb3BlcmF0aW9uLCBtZW0uDQorICBkZWYgU0RtIDogU1M0QUlpODxvcGNzZCwgTVJNU3JjTWVtLA0KKyAgICAgICAgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIHNkbWVtOiRzcmMyLCBpMzJpOGltbTokc3JjMyksDQorICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICJzZFx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSwNCisgICAgICAgIFtdPiwgT3BTaXplOw0KK30NCisNCisvLyBGUCByb3VuZCAtIHJvdW5kc3MsIHJvdW5kcHMsIHJvdW5kc2QsIHJvdW5kcGQNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCisgIC8vIEludHJpbnNpYyBmb3JtDQorICBkZWZtIFZST1VORCAgOiBzc2U0MV9mcF91bm9wX3JtPDB4MDgsIDB4MDksICJ2cm91bmQiLCBmMTI4bWVtLCBWUjEyOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3B2NGYzMiwgbWVtb3B2MmY2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc2U0MV9yb3VuZF9wcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc2U0MV9yb3VuZF9wZD4sIFZFWDsNCisgIGRlZm0gVlJPVU5EWSA6IHNzZTQxX2ZwX3Vub3Bfcm08MHgwOCwgMHgwOSwgInZyb3VuZCIsIGYyNTZtZW0sIFZSMjU2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcHY4ZjMyLCBtZW1vcHY0ZjY0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2F2eF9yb3VuZF9wc18yNTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYXZ4X3JvdW5kX3BkXzI1Nj4sIFZFWDsNCisgIGRlZm0gVlJPVU5EICA6IHNzZTQxX2ZwX2Jpbm9wX3JtPDB4MEEsIDB4MEIsICJ2cm91bmQiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTQxX3JvdW5kX3NzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X3NzZTQxX3JvdW5kX3NkLCAwPiwgVkVYXzRWOw0KKw0KKyAgLy8gSW5zdHJ1Y3Rpb25zIGZvciB0aGUgYXNzZW1ibGVyDQorICBkZWZtIFZST1VORCAgOiBzc2U0MV9mcF91bm9wX3JtX2F2eF9wPDB4MDgsIDB4MDksIFZSMTI4LCBmMTI4bWVtLCAidnJvdW5kIj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCisgIGRlZm0gVlJPVU5EWSA6IHNzZTQxX2ZwX3Vub3Bfcm1fYXZ4X3A8MHgwOCwgMHgwOSwgVlIyNTYsIGYyNTZtZW0sICJ2cm91bmQiPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KKyAgZGVmbSBWUk9VTkQgIDogc3NlNDFfZnBfYmlub3Bfcm1fYXZ4X3M8MHgwQSwgMHgwQiwgInZyb3VuZCI+LCBWRVhfNFY7DQorfQ0KKw0KK2RlZm0gUk9VTkQgIDogc3NlNDFfZnBfdW5vcF9ybTwweDA4LCAweDA5LCAicm91bmQiLCBmMTI4bWVtLCBWUjEyOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3B2NGYzMiwgbWVtb3B2MmY2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc2U0MV9yb3VuZF9wcywgaW50X3g4Nl9zc2U0MV9yb3VuZF9wZD47DQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4NCitkZWZtIFJPVU5EICA6IHNzZTQxX2ZwX2Jpbm9wX3JtPDB4MEEsIDB4MEIsICJyb3VuZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfc3NlNDFfcm91bmRfc3MsIGludF94ODZfc3NlNDFfcm91bmRfc2Q+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFNC4xIC0gUGFja2VkIEJpdCBUZXN0DQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBwdGVzdCBpbnN0cnVjdGlvbiB3ZSdsbCBsb3dlciB0byB0aGlzIGluIFg4NklTZWxMb3dlcmluZyBwcmltYXJpbHkgZnJvbQ0KKy8vIHRoZSBpbnRlbCBpbnRyaW5zaWMgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzLg0KK2xldCBEZWZzID0gW0VGTEFHU10sIGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbiB7DQorZGVmIFZQVEVTVHJyICA6IFNTNDhJPDB4MTcsIE1STVNyY1JlZywgKG91dHMpLCAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiksDQorICAgICAgICAgICAgICAgICJ2cHRlc3RcdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NnB0ZXN0IFZSMTI4OiRzcmMxLCAodjRmMzIgVlIxMjg6JHNyYzIpKSldPiwNCisgICAgICAgICAgICAgICAgT3BTaXplLCBWRVg7DQorZGVmIFZQVEVTVHJtICA6IFNTNDhJPDB4MTcsIE1STVNyY01lbSwgKG91dHMpLCAoaW5zIFZSMTI4OiRzcmMxLCBmMTI4bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgInZwdGVzdFx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLChYODZwdGVzdCBWUjEyODokc3JjMSwgKG1lbW9wdjRmMzIgYWRkcjokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgICBPcFNpemUsIFZFWDsNCisNCitkZWYgVlBURVNUWXJyIDogU1M0OEk8MHgxNywgTVJNU3JjUmVnLCAob3V0cyksIChpbnMgVlIyNTY6JHNyYzEsIFZSMjU2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgInZwdGVzdFx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2cHRlc3QgVlIyNTY6JHNyYzEsICh2NGk2NCBWUjI1Njokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgICBPcFNpemUsIFZFWDsNCitkZWYgVlBURVNUWXJtIDogU1M0OEk8MHgxNywgTVJNU3JjTWVtLCAob3V0cyksIChpbnMgVlIyNTY6JHNyYzEsIGkyNTZtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAidnB0ZXN0XHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICBbKHNldCBFRkxBR1MsKFg4NnB0ZXN0IFZSMjU2OiRzcmMxLCAobWVtb3B2NGk2NCBhZGRyOiRzcmMyKSkpXT4sDQorICAgICAgICAgICAgICAgIE9wU2l6ZSwgVkVYOw0KK30NCisNCitsZXQgRGVmcyA9IFtFRkxBR1NdIGluIHsNCitkZWYgUFRFU1RyciA6IFNTNDhJPDB4MTcsIE1STVNyY1JlZywgKG91dHMpLCAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiksDQorICAgICAgICAgICAgICAicHRlc3QgXHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgWyhzZXQgRUZMQUdTLCAoWDg2cHRlc3QgVlIxMjg6JHNyYzEsICh2NGYzMiBWUjEyODokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgT3BTaXplOw0KK2RlZiBQVEVTVHJtIDogU1M0OEk8MHgxNywgTVJNU3JjTWVtLCAob3V0cyksIChpbnMgVlIxMjg6JHNyYzEsIGYxMjhtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgInB0ZXN0IFx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgIFsoc2V0IEVGTEFHUywgKFg4NnB0ZXN0IFZSMTI4OiRzcmMxLCAobWVtb3B2NGYzMiBhZGRyOiRzcmMyKSkpXT4sDQorICAgICAgICAgICAgICBPcFNpemU7DQorfQ0KKw0KKy8vIFRoZSBiaXQgdGVzdCBpbnN0cnVjdGlvbnMgYmVsb3cgYXJlIEFWWCBvbmx5DQorbXVsdGljbGFzcyBhdnhfYml0dGVzdDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgUmVnaXN0ZXJDbGFzcyBSQywNCisgICAgICAgICAgICAgICAgICAgICAgIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsIFBhdEZyYWcgbWVtX2ZyYWcsIFZhbHVlVHlwZSB2dD4gew0KKyAgZGVmIHJyIDogU1M0OEk8b3BjLCBNUk1TcmNSZWcsIChvdXRzKSwgKGlucyBSQzokc3JjMSwgUkM6JHNyYzIpLA0KKyAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZ0ZXN0cCBSQzokc3JjMSwgKHZ0IFJDOiRzcmMyKSkpXT4sIE9wU2l6ZSwgVkVYOw0KKyAgZGVmIHJtIDogU1M0OEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzKSwgKGlucyBSQzokc3JjMSwgeDg2bWVtb3A6JHNyYzIpLA0KKyAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICBbKHNldCBFRkxBR1MsIChYODZ0ZXN0cCBSQzokc3JjMSwgKG1lbV9mcmFnIGFkZHI6JHNyYzIpKSldPiwNCisgICAgICAgICAgICBPcFNpemUsIFZFWDsNCit9DQorDQorbGV0IERlZnMgPSBbRUZMQUdTXSwgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCitkZWZtIFZURVNUUFMgIDogYXZ4X2JpdHRlc3Q8MHgwRSwgInZ0ZXN0cHMiLCBWUjEyOCwgZjEyOG1lbSwgbWVtb3B2NGYzMiwgdjRmMzI+Ow0KK2RlZm0gVlRFU1RQU1kgOiBhdnhfYml0dGVzdDwweDBFLCAidnRlc3RwcyIsIFZSMjU2LCBmMjU2bWVtLCBtZW1vcHY4ZjMyLCB2OGYzMj47DQorZGVmbSBWVEVTVFBEICA6IGF2eF9iaXR0ZXN0PDB4MEYsICJ2dGVzdHBkIiwgVlIxMjgsIGYxMjhtZW0sIG1lbW9wdjJmNjQsIHYyZjY0PjsNCitkZWZtIFZURVNUUERZIDogYXZ4X2JpdHRlc3Q8MHgwRiwgInZ0ZXN0cGQiLCBWUjI1NiwgZjI1Nm1lbSwgbWVtb3B2NGY2NCwgdjRmNjQ+Ow0KK30NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRTQuMSAtIE1pc2MgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBTUzQxSV91bm9wX3JtX2ludF92MTYgLSBTU0UgNC4xIHVuYXJ5IG9wZXJhdG9yIHdob3NlIHR5cGUgaXMgdjhpMTYuDQorbXVsdGljbGFzcyBTUzQxSV91bm9wX3JtX2ludF92MTY8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljIEludElkMTI4PiB7DQorICBkZWYgcnIxMjggOiBTUzQ4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMpLA0KKyAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgICBbKHNldCBWUjEyODokZHN0LCAoSW50SWQxMjggVlIxMjg6JHNyYykpXT4sIE9wU2l6ZTsNCisgIGRlZiBybTEyOCA6IFNTNDhJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAoaW5zIGkxMjhtZW06JHNyYyksDQorICAgICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgIChJbnRJZDEyOA0KKyAgICAgICAgICAgICAgICAgICAgICAgKGJpdGNvbnZlcnQgKG1lbW9wdjhpMTYgYWRkcjokc3JjKSkpKV0+LCBPcFNpemU7DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4NCitkZWZtIFZQSE1JTlBPU1VXIDogU1M0MUlfdW5vcF9ybV9pbnRfdjE2IDwweDQxLCAidnBobWlucG9zdXciLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc2U0MV9waG1pbnBvc3V3PiwgVkVYOw0KK2RlZm0gUEhNSU5QT1NVVyA6IFNTNDFJX3Vub3Bfcm1faW50X3YxNiA8MHg0MSwgInBobWlucG9zdXciLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9zc2U0MV9waG1pbnBvc3V3PjsNCisNCisvLy8gU1M0MUlfYmlub3Bfcm1faW50IC0gU2ltcGxlIFNTRSA0LjEgYmluYXJ5IG9wZXJhdG9yDQorbXVsdGljbGFzcyBTUzQxSV9iaW5vcF9ybV9pbnQ8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljIEludElkMTI4LCBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGxldCBpc0NvbW11dGFibGUgPSAxIGluDQorICBkZWYgcnIgOiBTUzQ4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEludElkMTI4IFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpXT4sIE9wU2l6ZTsNCisgIGRlZiBybSA6IFNTNDhJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMiksDQorICAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgKEludElkMTI4IFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAoYml0Y29udmVydCAobWVtb3B2MTZpOCBhZGRyOiRzcmMyKSkpKV0+LCBPcFNpemU7DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDAgaW4NCisgIGRlZm0gVlBBQ0tVU0RXIDogU1M0MUlfYmlub3Bfcm1faW50PDB4MkIsICJ2cGFja3VzZHciLCBpbnRfeDg2X3NzZTQxX3BhY2t1c2R3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQQ01QRVFRICA6IFNTNDFJX2Jpbm9wX3JtX2ludDwweDI5LCAidnBjbXBlcXEiLCAgaW50X3g4Nl9zc2U0MV9wY21wZXFxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQTUlOU0IgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDwweDM4LCAidnBtaW5zYiIsICAgaW50X3g4Nl9zc2U0MV9wbWluc2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBNSU5TRCAgIDogU1M0MUlfYmlub3Bfcm1faW50PDB4MzksICJ2cG1pbnNkIiwgICBpbnRfeDg2X3NzZTQxX3BtaW5zZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWUE1JTlVEICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ8MHgzQiwgInZwbWludWQiLCAgIGludF94ODZfc3NlNDFfcG1pbnVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQTUlOVVcgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDwweDNBLCAidnBtaW51dyIsICAgaW50X3g4Nl9zc2U0MV9wbWludXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBNQVhTQiAgIDogU1M0MUlfYmlub3Bfcm1faW50PDB4M0MsICJ2cG1heHNiIiwgICBpbnRfeDg2X3NzZTQxX3BtYXhzYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWUE1BWFNEICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ8MHgzRCwgInZwbWF4c2QiLCAgIGludF94ODZfc3NlNDFfcG1heHNkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQTUFYVUQgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDwweDNGLCAidnBtYXh1ZCIsICAgaW50X3g4Nl9zc2U0MV9wbWF4dWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCisgIGRlZm0gVlBNQVhVVyAgIDogU1M0MUlfYmlub3Bfcm1faW50PDB4M0UsICJ2cG1heHV3IiwgICBpbnRfeDg2X3NzZTQxX3BtYXh1dywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWUE1VTERRICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ8MHgyOCwgInZwbXVsZHEiLCAgIGludF94ODZfc3NlNDFfcG11bGRxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA+LCBWRVhfNFY7DQorfQ0KKw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCisgIGxldCBpc0NvbW11dGFibGUgPSAwIGluDQorICBkZWZtIFBBQ0tVU0RXIDogU1M0MUlfYmlub3Bfcm1faW50PDB4MkIsICJwYWNrdXNkdyIsIGludF94ODZfc3NlNDFfcGFja3VzZHc+Ow0KKyAgZGVmbSBQQ01QRVFRICA6IFNTNDFJX2Jpbm9wX3JtX2ludDwweDI5LCAicGNtcGVxcSIsICBpbnRfeDg2X3NzZTQxX3BjbXBlcXE+Ow0KKyAgZGVmbSBQTUlOU0IgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDwweDM4LCAicG1pbnNiIiwgICBpbnRfeDg2X3NzZTQxX3BtaW5zYj47DQorICBkZWZtIFBNSU5TRCAgIDogU1M0MUlfYmlub3Bfcm1faW50PDB4MzksICJwbWluc2QiLCAgIGludF94ODZfc3NlNDFfcG1pbnNkPjsNCisgIGRlZm0gUE1JTlVEICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ8MHgzQiwgInBtaW51ZCIsICAgaW50X3g4Nl9zc2U0MV9wbWludWQ+Ow0KKyAgZGVmbSBQTUlOVVcgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDwweDNBLCAicG1pbnV3IiwgICBpbnRfeDg2X3NzZTQxX3BtaW51dz47DQorICBkZWZtIFBNQVhTQiAgIDogU1M0MUlfYmlub3Bfcm1faW50PDB4M0MsICJwbWF4c2IiLCAgIGludF94ODZfc3NlNDFfcG1heHNiPjsNCisgIGRlZm0gUE1BWFNEICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ8MHgzRCwgInBtYXhzZCIsICAgaW50X3g4Nl9zc2U0MV9wbWF4c2Q+Ow0KKyAgZGVmbSBQTUFYVUQgICA6IFNTNDFJX2Jpbm9wX3JtX2ludDwweDNGLCAicG1heHVkIiwgICBpbnRfeDg2X3NzZTQxX3BtYXh1ZD47DQorICBkZWZtIFBNQVhVVyAgIDogU1M0MUlfYmlub3Bfcm1faW50PDB4M0UsICJwbWF4dXciLCAgIGludF94ODZfc3NlNDFfcG1heHV3PjsNCisgIGRlZm0gUE1VTERRICAgOiBTUzQxSV9iaW5vcF9ybV9pbnQ8MHgyOCwgInBtdWxkcSIsICAgaW50X3g4Nl9zc2U0MV9wbXVsZHE+Ow0KK30NCisNCitkZWYgOiBQYXQ8KHYyaTY0IChYODZwY21wZXFxIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpLA0KKyAgICAgICAgICAoUENNUEVRUXJyIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjJpNjQgKFg4NnBjbXBlcXEgVlIxMjg6JHNyYzEsIChtZW1vcCBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAoUENNUEVRUXJtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorDQorLy8vIFNTNDhJX2Jpbm9wX3JtIC0gU2ltcGxlIFNTRTQxIGJpbmFyeSBvcGVyYXRvci4NCittdWx0aWNsYXNzIFNTNDhJX2Jpbm9wX3JtPGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLCBTRE5vZGUgT3BOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZSBPcFZULCBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGxldCBpc0NvbW11dGFibGUgPSAxIGluDQorICBkZWYgcnIgOiBTUzQ4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKE9wVlQgKE9wTm9kZSBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSldPiwNCisgICAgICAgT3BTaXplOw0KKyAgZGVmIHJtIDogU1M0OEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMTI4bWVtOiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKE9wTm9kZSBWUjEyODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJjX3Y0aTMyIChtZW1vcHYyaTY0IGFkZHI6JHNyYzIpKSkpXT4sDQorICAgICAgIE9wU2l6ZTsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbg0KKyAgZGVmbSBWUE1VTExEIDogU1M0OElfYmlub3Bfcm08MHg0MCwgInZwbXVsbGQiLCBtdWwsIHY0aTMyLCAwPiwgVkVYXzRWOw0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluDQorICBkZWZtIFBNVUxMRCA6IFNTNDhJX2Jpbm9wX3JtPDB4NDAsICJwbXVsbGQiLCBtdWwsIHY0aTMyPjsNCisNCisvLy8gU1M0MUlfYmlub3Bfcm1pX2ludCAtIFNTRSA0LjEgYmluYXJ5IG9wZXJhdG9yIHdpdGggOC1iaXQgaW1tZWRpYXRlDQorbXVsdGljbGFzcyBTUzQxSV9iaW5vcF9ybWlfaW50PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgSW50cmluc2ljIEludElkLCBSZWdpc3RlckNsYXNzIFJDLCBQYXRGcmFnIG1lbW9wX2ZyYWcsDQorICAgICAgICAgICAgICAgICBYODZNZW1PcGVyYW5kIHg4Nm1lbW9wLCBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGxldCBpc0NvbW11dGFibGUgPSAxIGluDQorICBkZWYgcnJpIDogU1M0QUlpODxvcGMsIE1STVNyY1JlZywgKG91dHMgUkM6JGRzdCksDQorICAgICAgICAoaW5zIFJDOiRzcmMxLCBSQzokc3JjMiwgaTMyaThpbW06JHNyYzMpLA0KKyAgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICJcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAiXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzIsICRzcmMzfSIpKSwNCisgICAgICAgIFsoc2V0IFJDOiRkc3QsIChJbnRJZCBSQzokc3JjMSwgUkM6JHNyYzIsIGltbTokc3JjMykpXT4sDQorICAgICAgICBPcFNpemU7DQorICBkZWYgcm1pIDogU1M0QUlpODxvcGMsIE1STVNyY01lbSwgKG91dHMgUkM6JGRzdCksDQorICAgICAgICAoaW5zIFJDOiRzcmMxLCB4ODZtZW1vcDokc3JjMiwgaTMyaThpbW06JHNyYzMpLA0KKyAgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICJcdHskc3JjMywgJHNyYzIsICRkc3R8JGRzdCwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAiXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzIsICRzcmMzfSIpKSwNCisgICAgICAgIFsoc2V0IFJDOiRkc3QsDQorICAgICAgICAgIChJbnRJZCBSQzokc3JjMSwNCisgICAgICAgICAgIChiaXRjb252ZXJ0IChtZW1vcF9mcmFnIGFkZHI6JHNyYzIpKSwgaW1tOiRzcmMzKSldPiwNCisgICAgICAgIE9wU2l6ZTsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbiB7DQorICBsZXQgaXNDb21tdXRhYmxlID0gMCBpbiB7DQorICBkZWZtIFZCTEVORFBTIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDBDLCAidmJsZW5kcHMiLCBpbnRfeDg2X3NzZTQxX2JsZW5kcHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUjEyOCwgbWVtb3B2MTZpOCwgaTEyOG1lbSwgMD4sIFZFWF80VjsNCisgIGRlZm0gVkJMRU5EUEQgOiBTUzQxSV9iaW5vcF9ybWlfaW50PDB4MEQsICJ2YmxlbmRwZCIsIGludF94ODZfc3NlNDFfYmxlbmRwZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSMTI4LCBtZW1vcHYxNmk4LCBpMTI4bWVtLCAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWQkxFTkRQU1kgOiBTUzQxSV9iaW5vcF9ybWlfaW50PDB4MEMsICJ2YmxlbmRwcyIsDQorICAgICAgICAgICAgaW50X3g4Nl9hdnhfYmxlbmRfcHNfMjU2LCBWUjI1NiwgbWVtb3B2MzJpOCwgaTI1Nm1lbSwgMD4sIFZFWF80VjsNCisgIGRlZm0gVkJMRU5EUERZIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDBELCAidmJsZW5kcGQiLA0KKyAgICAgICAgICAgIGludF94ODZfYXZ4X2JsZW5kX3BkXzI1NiwgVlIyNTYsIG1lbW9wdjMyaTgsIGkyNTZtZW0sIDA+LCBWRVhfNFY7DQorICBkZWZtIFZQQkxFTkRXIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDBFLCAidnBibGVuZHciLCBpbnRfeDg2X3NzZTQxX3BibGVuZHcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUjEyOCwgbWVtb3B2MTZpOCwgaTEyOG1lbSwgMD4sIFZFWF80VjsNCisgIGRlZm0gVk1QU0FEQlcgOiBTUzQxSV9iaW5vcF9ybWlfaW50PDB4NDIsICJ2bXBzYWRidyIsIGludF94ODZfc3NlNDFfbXBzYWRidywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSMTI4LCBtZW1vcHYxNmk4LCBpMTI4bWVtLCAwPiwgVkVYXzRWOw0KKyAgfQ0KKyAgZGVmbSBWRFBQUyA6IFNTNDFJX2Jpbm9wX3JtaV9pbnQ8MHg0MCwgInZkcHBzIiwgaW50X3g4Nl9zc2U0MV9kcHBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjgsIG1lbW9wdjE2aTgsIGkxMjhtZW0sIDA+LCBWRVhfNFY7DQorICBkZWZtIFZEUFBEIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDQxLCAidmRwcGQiLCBpbnRfeDg2X3NzZTQxX2RwcGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUjEyOCwgbWVtb3B2MTZpOCwgaTEyOG1lbSwgMD4sIFZFWF80VjsNCisgIGRlZm0gVkRQUFNZIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDQwLCAidmRwcHMiLCBpbnRfeDg2X2F2eF9kcF9wc18yNTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUjI1NiwgbWVtb3B2MzJpOCwgaTI1Nm1lbSwgMD4sIFZFWF80VjsNCit9DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDAgaW4gew0KKyAgZGVmbSBCTEVORFBTIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDBDLCAiYmxlbmRwcyIsIGludF94ODZfc3NlNDFfYmxlbmRwcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjgsIG1lbW9wdjE2aTgsIGkxMjhtZW0+Ow0KKyAgZGVmbSBCTEVORFBEIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDBELCAiYmxlbmRwZCIsIGludF94ODZfc3NlNDFfYmxlbmRwZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjgsIG1lbW9wdjE2aTgsIGkxMjhtZW0+Ow0KKyAgZGVmbSBQQkxFTkRXIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDBFLCAicGJsZW5kdyIsIGludF94ODZfc3NlNDFfcGJsZW5kdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjgsIG1lbW9wdjE2aTgsIGkxMjhtZW0+Ow0KKyAgZGVmbSBNUFNBREJXIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDQyLCAibXBzYWRidyIsIGludF94ODZfc3NlNDFfbXBzYWRidywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjgsIG1lbW9wdjE2aTgsIGkxMjhtZW0+Ow0KKyAgfQ0KKyAgZGVmbSBEUFBTIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDQwLCAiZHBwcyIsIGludF94ODZfc3NlNDFfZHBwcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjgsIG1lbW9wdjE2aTgsIGkxMjhtZW0+Ow0KKyAgZGVmbSBEUFBEIDogU1M0MUlfYmlub3Bfcm1pX2ludDwweDQxLCAiZHBwZCIsIGludF94ODZfc3NlNDFfZHBwZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlIxMjgsIG1lbW9wdjE2aTgsIGkxMjhtZW0+Ow0KK30NCisNCisvLy8gU1M0MUlfcXVhdGVybmFyeV9pbnRfYXZ4IC0gQVZYIFNTRSA0LjEgd2l0aCA0IG9wZXJhdG9ycw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KK211bHRpY2xhc3MgU1M0MUlfcXVhdGVybmFyeV9pbnRfYXZ4PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MgUkMsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0RnJhZyBtZW1fZnJhZywgSW50cmluc2ljIEludElkPiB7DQorICBkZWYgcnIgOiBJPG9wYywgTVJNU3JjUmVnLCAob3V0cyBSQzokZHN0KSwNCisgICAgICAgICAgICAgICAgICAoaW5zIFJDOiRzcmMxLCBSQzokc3JjMiwgUkM6JHNyYzMpLA0KKyAgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iKSwNCisgICAgICAgICAgICAgICAgICBbKHNldCBSQzokZHN0LCAoSW50SWQgUkM6JHNyYzEsIFJDOiRzcmMyLCBSQzokc3JjMykpXSwNCisgICAgICAgICAgICAgICAgICBTU0VQYWNrZWRJbnQ+LCBPcFNpemUsIFRBLCBWRVhfNFYsIFZFWF9JOElNTTsNCisNCisgIGRlZiBybSA6IEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFJDOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgIChpbnMgUkM6JHNyYzEsIHg4Nm1lbW9wOiRzcmMyLCBSQzokc3JjMyksDQorICAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAiXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgICAgICAgICAgICAgIFsoc2V0IFJDOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgKEludElkIFJDOiRzcmMxLCAoYml0Y29udmVydCAobWVtX2ZyYWcgYWRkcjokc3JjMikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQzokc3JjMykpXSwNCisgICAgICAgICAgICAgICAgICBTU0VQYWNrZWRJbnQ+LCBPcFNpemUsIFRBLCBWRVhfNFYsIFZFWF9JOElNTTsNCit9DQorfQ0KKw0KK2RlZm0gVkJMRU5EVlBEICA6IFNTNDFJX3F1YXRlcm5hcnlfaW50X2F2eDwweDRCLCAidmJsZW5kdnBkIiwgVlIxMjgsIGkxMjhtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9wdjE2aTgsIGludF94ODZfc3NlNDFfYmxlbmR2cGQ+Ow0KK2RlZm0gVkJMRU5EVlBTICA6IFNTNDFJX3F1YXRlcm5hcnlfaW50X2F2eDwweDRBLCAidmJsZW5kdnBzIiwgVlIxMjgsIGkxMjhtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9wdjE2aTgsIGludF94ODZfc3NlNDFfYmxlbmR2cHM+Ow0KK2RlZm0gVlBCTEVORFZCICA6IFNTNDFJX3F1YXRlcm5hcnlfaW50X2F2eDwweDRDLCAidnBibGVuZHZiIiwgVlIxMjgsIGkxMjhtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9wdjE2aTgsIGludF94ODZfc3NlNDFfcGJsZW5kdmI+Ow0KK2RlZm0gVkJMRU5EVlBEWSA6IFNTNDFJX3F1YXRlcm5hcnlfaW50X2F2eDwweDRCLCAidmJsZW5kdnBkIiwgVlIyNTYsIGkyNTZtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcHYzMmk4LCBpbnRfeDg2X2F2eF9ibGVuZHZfcGRfMjU2PjsNCitkZWZtIFZCTEVORFZQU1kgOiBTUzQxSV9xdWF0ZXJuYXJ5X2ludF9hdng8MHg0QSwgInZibGVuZHZwcyIsIFZSMjU2LCBpMjU2bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3B2MzJpOCwgaW50X3g4Nl9hdnhfYmxlbmR2X3BzXzI1Nj47DQorDQorLy8vIFNTNDFJX3Rlcm5hcnlfaW50IC0gU1NFIDQuMSB0ZXJuYXJ5IG9wZXJhdG9yDQorbGV0IFVzZXMgPSBbWE1NMF0sIENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KKyAgbXVsdGljbGFzcyBTUzQxSV90ZXJuYXJ5X2ludDxiaXRzPDg+IG9wYywgc3RyaW5nIE9wY29kZVN0ciwgSW50cmluc2ljIEludElkPiB7DQorICAgIGRlZiBycjAgOiBTUzQ4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAiXHR7JXhtbTAsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAleG1tMH0iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChJbnRJZCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIsIFhNTTApKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgT3BTaXplOw0KKw0KKyAgICBkZWYgcm0wIDogU1M0OEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAiXHR7JXhtbTAsICRzcmMyLCAkZHN0fCRkc3QsICRzcmMyLCAleG1tMH0iKSwNCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgIChJbnRJZCBWUjEyODokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgIChiaXRjb252ZXJ0IChtZW1vcHYxNmk4IGFkZHI6JHNyYzIpKSwgWE1NMCkpXT4sIE9wU2l6ZTsNCisgIH0NCit9DQorDQorZGVmbSBCTEVORFZQRCAgICAgOiBTUzQxSV90ZXJuYXJ5X2ludDwweDE1LCAiYmxlbmR2cGQiLCBpbnRfeDg2X3NzZTQxX2JsZW5kdnBkPjsNCitkZWZtIEJMRU5EVlBTICAgICA6IFNTNDFJX3Rlcm5hcnlfaW50PDB4MTQsICJibGVuZHZwcyIsIGludF94ODZfc3NlNDFfYmxlbmR2cHM+Ow0KK2RlZm0gUEJMRU5EVkIgICAgIDogU1M0MUlfdGVybmFyeV9pbnQ8MHgxMCwgInBibGVuZHZiIiwgaW50X3g4Nl9zc2U0MV9wYmxlbmR2Yj47DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSBpbg0KK2RlZiBWTU9WTlREUUFybSA6IFNTNDhJPDB4MkEsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgaTEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJ2bW92bnRkcWFcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTQxX21vdm50ZHFhIGFkZHI6JHNyYykpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICBPcFNpemUsIFZFWDsNCitkZWYgTU9WTlREUUFybSA6IFNTNDhJPDB4MkEsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgaTEyOG1lbTokc3JjKSwNCisgICAgICAgICAgICAgICAgICAgICAgICJtb3ZudGRxYVx0eyRzcmMsICRkc3R8JGRzdCwgJHNyY30iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlNDFfbW92bnRkcWEgYWRkcjokc3JjKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFNTRTQuMiAtIENvbXBhcmUgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLy8gU1M0MklfYmlub3Bfcm1faW50IC0gU2ltcGxlIFNTRSA0LjIgYmluYXJ5IG9wZXJhdG9yDQorbXVsdGljbGFzcyBTUzQySV9iaW5vcF9ybV9pbnQ8Yml0czw4PiBvcGMsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljIEludElkMTI4LCBiaXQgSXMyQWRkciA9IDE+IHsNCisgIGRlZiByciA6IFNTNDI4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEludElkMTI4IFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpXT4sDQorICAgICAgIE9wU2l6ZTsNCisgIGRlZiBybSA6IFNTNDI4STxvcGMsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIGkxMjhtZW06JHNyYzIpLA0KKyAgICAgICAhaWYoSXMyQWRkciwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRkc3R8JGRzdCwgJHNyYzJ9IiksDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IikpLA0KKyAgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgIChJbnRJZDEyOCBWUjEyODokc3JjMSwNCisgICAgICAgICAgKGJpdGNvbnZlcnQgKG1lbW9wdjE2aTggYWRkcjokc3JjMikpKSldPiwgT3BTaXplOw0KK30NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluDQorICBkZWZtIFZQQ01QR1RRIDogU1M0MklfYmlub3Bfcm1faW50PDB4MzcsICJ2cGNtcGd0cSIsIGludF94ODZfc3NlNDJfcGNtcGd0cSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD4sIFZFWF80VjsNCitsZXQgQ29uc3RyYWludHMgPSAiJHNyYzEgPSAkZHN0IiBpbg0KKyAgZGVmbSBQQ01QR1RRIDogU1M0MklfYmlub3Bfcm1faW50PDB4MzcsICJwY21wZ3RxIiwgaW50X3g4Nl9zc2U0Ml9wY21wZ3RxPjsNCisNCitkZWYgOiBQYXQ8KHYyaTY0IChYODZwY21wZ3RxIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpLA0KKyAgICAgICAgICAoUENNUEdUUXJyIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjJpNjQgKFg4NnBjbXBndHEgVlIxMjg6JHNyYzEsIChtZW1vcCBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAoUENNUEdUUXJtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBTU0U0LjIgLSBTdHJpbmcvdGV4dCBQcm9jZXNzaW5nIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gUGFja2VkIENvbXBhcmUgSW1wbGljaXQgTGVuZ3RoIFN0cmluZ3MsIFJldHVybiBNYXNrDQorbXVsdGljbGFzcyBwc2V1ZG9fcGNtcGlzdHJtPHN0cmluZyBhc20+IHsNCisgIGRlZiBSRUcgOiBJaTg8MCwgUHNldWRvLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIsIGk4aW1tOiRzcmMzKSwgIXN0cmNvbmNhdChhc20sICJyciBQU0VVRE8iKSwNCisgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlNDJfcGNtcGlzdHJtMTI4IFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbTokc3JjMykpXT47DQorICBkZWYgTUVNIDogSWk4PDAsIFBzZXVkbywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgIChpbnMgVlIxMjg6JHNyYzEsIGkxMjhtZW06JHNyYzIsIGk4aW1tOiRzcmMzKSwgIXN0cmNvbmNhdChhc20sICJybSBQU0VVRE8iKSwNCisgICAgWyhzZXQgVlIxMjg6JGRzdCwgKGludF94ODZfc3NlNDJfcGNtcGlzdHJtMTI4DQorICAgICAgICAgICAgICAgICAgICAgICBWUjEyODokc3JjMSwgKGxvYWQgYWRkcjokc3JjMiksIGltbTokc3JjMykpXT47DQorfQ0KKw0KK2xldCBEZWZzID0gW0VGTEFHU10sIHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4gew0KKyAgZGVmbSBQQ01QSVNUUk0xMjggOiBwc2V1ZG9fcGNtcGlzdHJtPCIjUENNUElTVFJNMTI4Ij4sIFJlcXVpcmVzPFtIYXNTU0U0Ml0+Ow0KKyAgZGVmbSBWUENNUElTVFJNMTI4IDogcHNldWRvX3BjbXBpc3RybTwiI1ZQQ01QSVNUUk0xMjgiPiwgUmVxdWlyZXM8W0hhc0FWWF0+Ow0KK30NCisNCitsZXQgRGVmcyA9IFtYTU0wLCBFRkxBR1NdLCBpc0FzbVBhcnNlck9ubHkgPSAxLA0KKyAgICBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KKyAgZGVmIFZQQ01QSVNUUk0xMjhyciA6IFNTNDJBSTwweDYyLCBNUk1TcmNSZWcsIChvdXRzKSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICJ2cGNtcGlzdHJtXHR7JHNyYzMsICRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzIsICRzcmMzfSIsIFtdPiwgT3BTaXplLCBWRVg7DQorICBkZWYgVlBDTVBJU1RSTTEyOHJtIDogU1M0MkFJPDB4NjIsIE1STVNyY01lbSwgKG91dHMpLA0KKyAgICAgIChpbnMgVlIxMjg6JHNyYzEsIGkxMjhtZW06JHNyYzIsIGk4aW1tOiRzcmMzKSwNCisgICAgICAidnBjbXBpc3RybVx0eyRzcmMzLCAkc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyLCAkc3JjM30iLCBbXT4sIE9wU2l6ZSwgVkVYOw0KK30NCisNCitsZXQgRGVmcyA9IFtYTU0wLCBFRkxBR1NdIGluIHsNCisgIGRlZiBQQ01QSVNUUk0xMjhyciA6IFNTNDJBSTwweDYyLCBNUk1TcmNSZWcsIChvdXRzKSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICJwY21waXN0cm1cdHskc3JjMywgJHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMiwgJHNyYzN9IiwgW10+LCBPcFNpemU7DQorICBkZWYgUENNUElTVFJNMTI4cm0gOiBTUzQyQUk8MHg2MiwgTVJNU3JjTWVtLCAob3V0cyksDQorICAgICAgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICJwY21waXN0cm1cdHskc3JjMywgJHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMiwgJHNyYzN9IiwgW10+LCBPcFNpemU7DQorfQ0KKw0KKy8vIFBhY2tlZCBDb21wYXJlIEV4cGxpY2l0IExlbmd0aCBTdHJpbmdzLCBSZXR1cm4gTWFzaw0KK211bHRpY2xhc3MgcHNldWRvX3BjbXBlc3RybTxzdHJpbmcgYXNtPiB7DQorICBkZWYgUkVHIDogSWk4PDAsIFBzZXVkbywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMzLCBpOGltbTokc3JjNSksICFzdHJjb25jYXQoYXNtLCAicnIgUFNFVURPIiksDQorICAgIFsoc2V0IFZSMTI4OiRkc3QsIChpbnRfeDg2X3NzZTQyX3BjbXBlc3RybTEyOA0KKyAgICAgICAgICAgICAgICAgICAgICAgVlIxMjg6JHNyYzEsIEVBWCwgVlIxMjg6JHNyYzMsIEVEWCwgaW1tOiRzcmM1KSldPjsNCisgIGRlZiBNRU0gOiBJaTg8MCwgUHNldWRvLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMywgaThpbW06JHNyYzUpLCAhc3RyY29uY2F0KGFzbSwgInJtIFBTRVVETyIpLA0KKyAgICBbKHNldCBWUjEyODokZHN0LCAoaW50X3g4Nl9zc2U0Ml9wY21wZXN0cm0xMjgNCisgICAgICAgICAgICAgICAgICAgICAgIFZSMTI4OiRzcmMxLCBFQVgsIChsb2FkIGFkZHI6JHNyYzMpLCBFRFgsIGltbTokc3JjNSkpXT47DQorfQ0KKw0KK2xldCBEZWZzID0gW0VGTEFHU10sIFVzZXMgPSBbRUFYLCBFRFhdLCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxIGluIHsNCisgIGRlZm0gUENNUEVTVFJNMTI4IDogcHNldWRvX3BjbXBlc3RybTwiI1BDTVBFU1RSTTEyOCI+LCBSZXF1aXJlczxbSGFzU1NFNDJdPjsNCisgIGRlZm0gVlBDTVBFU1RSTTEyOCA6IHBzZXVkb19wY21wZXN0cm08IiNWUENNUEVTVFJNMTI4Ij4sIFJlcXVpcmVzPFtIYXNBVlhdPjsNCit9DQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEsIFByZWRpY2F0ZXMgPSBbSGFzQVZYXSwNCisgICAgRGVmcyA9IFtYTU0wLCBFRkxBR1NdLCBVc2VzID0gW0VBWCwgRURYXSBpbiB7DQorICBkZWYgVlBDTVBFU1RSTTEyOHJyIDogU1M0MkFJPDB4NjAsIE1STVNyY1JlZywgKG91dHMpLA0KKyAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMzLCBpOGltbTokc3JjNSksDQorICAgICAgInZwY21wZXN0cm1cdHskc3JjNSwgJHNyYzMsICRzcmMxfCRzcmMxLCAkc3JjMywgJHNyYzV9IiwgW10+LCBPcFNpemUsIFZFWDsNCisgIGRlZiBWUENNUEVTVFJNMTI4cm0gOiBTUzQyQUk8MHg2MCwgTVJNU3JjTWVtLCAob3V0cyksDQorICAgICAgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMywgaThpbW06JHNyYzUpLA0KKyAgICAgICJ2cGNtcGVzdHJtXHR7JHNyYzUsICRzcmMzLCAkc3JjMXwkc3JjMSwgJHNyYzMsICRzcmM1fSIsIFtdPiwgT3BTaXplLCBWRVg7DQorfQ0KKw0KK2xldCBEZWZzID0gW1hNTTAsIEVGTEFHU10sIFVzZXMgPSBbRUFYLCBFRFhdIGluIHsNCisgIGRlZiBQQ01QRVNUUk0xMjhyciA6IFNTNDJBSTwweDYwLCBNUk1TcmNSZWcsIChvdXRzKSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMywgaThpbW06JHNyYzUpLA0KKyAgICAgICJwY21wZXN0cm1cdHskc3JjNSwgJHNyYzMsICRzcmMxfCRzcmMxLCAkc3JjMywgJHNyYzV9IiwgW10+LCBPcFNpemU7DQorICBkZWYgUENNUEVTVFJNMTI4cm0gOiBTUzQyQUk8MHg2MCwgTVJNU3JjTWVtLCAob3V0cyksDQorICAgICAgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMywgaThpbW06JHNyYzUpLA0KKyAgICAgICJwY21wZXN0cm1cdHskc3JjNSwgJHNyYzMsICRzcmMxfCRzcmMxLCAkc3JjMywgJHNyYzV9IiwgW10+LCBPcFNpemU7DQorfQ0KKw0KKy8vIFBhY2tlZCBDb21wYXJlIEltcGxpY2l0IExlbmd0aCBTdHJpbmdzLCBSZXR1cm4gSW5kZXgNCitsZXQgRGVmcyA9IFtFQ1gsIEVGTEFHU10gaW4gew0KKyAgbXVsdGljbGFzcyBTUzQyQUlfcGNtcGlzdHJpPEludHJpbnNpYyBJbnRJZDEyOCwgc3RyaW5nIGFzbSA9ICJwY21waXN0cmkiPiB7DQorICAgIGRlZiByciA6IFNTNDJBSTwweDYzLCBNUk1TcmNSZWcsIChvdXRzKSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYzMsICRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzIsICRzcmMzfSIpLA0KKyAgICAgIFsoc2V0IEVDWCwgKEludElkMTI4IFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMiwgaW1tOiRzcmMzKSksDQorICAgICAgIChpbXBsaWNpdCBFRkxBR1MpXT4sIE9wU2l6ZTsNCisgICAgZGVmIHJtIDogU1M0MkFJPDB4NjMsIE1STVNyY01lbSwgKG91dHMpLA0KKyAgICAgIChpbnMgVlIxMjg6JHNyYzEsIGkxMjhtZW06JHNyYzIsIGk4aW1tOiRzcmMzKSwNCisgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMzLCAkc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyLCAkc3JjM30iKSwNCisgICAgICBbKHNldCBFQ1gsIChJbnRJZDEyOCBWUjEyODokc3JjMSwgKGxvYWQgYWRkcjokc3JjMiksIGltbTokc3JjMykpLA0KKyAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LCBPcFNpemU7DQorICB9DQorfQ0KKw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWF0gaW4gew0KK2RlZm0gVlBDTVBJU1RSSSAgOiBTUzQyQUlfcGNtcGlzdHJpPGludF94ODZfc3NlNDJfcGNtcGlzdHJpMTI4LCAidnBjbXBpc3RyaSI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCitkZWZtIFZQQ01QSVNUUklBIDogU1M0MkFJX3BjbXBpc3RyaTxpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaWExMjgsICJ2cGNtcGlzdHJpIj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK2RlZm0gVlBDTVBJU1RSSUMgOiBTUzQyQUlfcGNtcGlzdHJpPGludF94ODZfc3NlNDJfcGNtcGlzdHJpYzEyOCwgInZwY21waXN0cmkiPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorZGVmbSBWUENNUElTVFJJTyA6IFNTNDJBSV9wY21waXN0cmk8aW50X3g4Nl9zc2U0Ml9wY21waXN0cmlvMTI4LCAidnBjbXBpc3RyaSI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCitkZWZtIFZQQ01QSVNUUklTIDogU1M0MkFJX3BjbXBpc3RyaTxpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaXMxMjgsICJ2cGNtcGlzdHJpIj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK2RlZm0gVlBDTVBJU1RSSVogOiBTUzQyQUlfcGNtcGlzdHJpPGludF94ODZfc3NlNDJfcGNtcGlzdHJpejEyOCwgInZwY21waXN0cmkiPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorfQ0KKw0KK2RlZm0gUENNUElTVFJJICA6IFNTNDJBSV9wY21waXN0cmk8aW50X3g4Nl9zc2U0Ml9wY21waXN0cmkxMjg+Ow0KK2RlZm0gUENNUElTVFJJQSA6IFNTNDJBSV9wY21waXN0cmk8aW50X3g4Nl9zc2U0Ml9wY21waXN0cmlhMTI4PjsNCitkZWZtIFBDTVBJU1RSSUMgOiBTUzQyQUlfcGNtcGlzdHJpPGludF94ODZfc3NlNDJfcGNtcGlzdHJpYzEyOD47DQorZGVmbSBQQ01QSVNUUklPIDogU1M0MkFJX3BjbXBpc3RyaTxpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaW8xMjg+Ow0KK2RlZm0gUENNUElTVFJJUyA6IFNTNDJBSV9wY21waXN0cmk8aW50X3g4Nl9zc2U0Ml9wY21waXN0cmlzMTI4PjsNCitkZWZtIFBDTVBJU1RSSVogOiBTUzQyQUlfcGNtcGlzdHJpPGludF94ODZfc3NlNDJfcGNtcGlzdHJpejEyOD47DQorDQorLy8gUGFja2VkIENvbXBhcmUgRXhwbGljaXQgTGVuZ3RoIFN0cmluZ3MsIFJldHVybiBJbmRleA0KK2xldCBEZWZzID0gW0VDWCwgRUZMQUdTXSwgVXNlcyA9IFtFQVgsIEVEWF0gaW4gew0KKyAgbXVsdGljbGFzcyBTUzQyQUlfcGNtcGVzdHJpPEludHJpbnNpYyBJbnRJZDEyOCwgc3RyaW5nIGFzbSA9ICJwY21wZXN0cmkiPiB7DQorICAgIGRlZiByciA6IFNTNDJBSTwweDYxLCBNUk1TcmNSZWcsIChvdXRzKSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMywgaThpbW06JHNyYzUpLA0KKyAgICAgICFzdHJjb25jYXQoYXNtLCAiXHR7JHNyYzUsICRzcmMzLCAkc3JjMXwkc3JjMSwgJHNyYzMsICRzcmM1fSIpLA0KKyAgICAgIFsoc2V0IEVDWCwgKEludElkMTI4IFZSMTI4OiRzcmMxLCBFQVgsIFZSMTI4OiRzcmMzLCBFRFgsIGltbTokc3JjNSkpLA0KKyAgICAgICAoaW1wbGljaXQgRUZMQUdTKV0+LCBPcFNpemU7DQorICAgIGRlZiBybSA6IFNTNDJBSTwweDYxLCBNUk1TcmNNZW0sIChvdXRzKSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMTI4bWVtOiRzcmMzLCBpOGltbTokc3JjNSksDQorICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjNSwgJHNyYzMsICRzcmMxfCRzcmMxLCAkc3JjMywgJHNyYzV9IiksDQorICAgICAgIFsoc2V0IEVDWCwNCisgICAgICAgICAgICAgKEludElkMTI4IFZSMTI4OiRzcmMxLCBFQVgsIChsb2FkIGFkZHI6JHNyYzMpLCBFRFgsIGltbTokc3JjNSkpLA0KKyAgICAgICAgKGltcGxpY2l0IEVGTEFHUyldPiwgT3BTaXplOw0KKyAgfQ0KK30NCisNCitsZXQgaXNBc21QYXJzZXJPbmx5ID0gMSwgUHJlZGljYXRlcyA9IFtIYXNBVlhdIGluIHsNCitkZWZtIFZQQ01QRVNUUkkgIDogU1M0MkFJX3BjbXBlc3RyaTxpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaTEyOCwgInZwY21wZXN0cmkiPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorZGVmbSBWUENNUEVTVFJJQSA6IFNTNDJBSV9wY21wZXN0cmk8aW50X3g4Nl9zc2U0Ml9wY21wZXN0cmlhMTI4LCAidnBjbXBlc3RyaSI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCitkZWZtIFZQQ01QRVNUUklDIDogU1M0MkFJX3BjbXBlc3RyaTxpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaWMxMjgsICJ2cGNtcGVzdHJpIj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK2RlZm0gVlBDTVBFU1RSSU8gOiBTUzQyQUlfcGNtcGVzdHJpPGludF94ODZfc3NlNDJfcGNtcGVzdHJpbzEyOCwgInZwY21wZXN0cmkiPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVg7DQorZGVmbSBWUENNUEVTVFJJUyA6IFNTNDJBSV9wY21wZXN0cmk8aW50X3g4Nl9zc2U0Ml9wY21wZXN0cmlzMTI4LCAidnBjbXBlc3RyaSI+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFWDsNCitkZWZtIFZQQ01QRVNUUklaIDogU1M0MkFJX3BjbXBlc3RyaTxpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaXoxMjgsICJ2cGNtcGVzdHJpIj4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVYOw0KK30NCisNCitkZWZtIFBDTVBFU1RSSSAgOiBTUzQyQUlfcGNtcGVzdHJpPGludF94ODZfc3NlNDJfcGNtcGVzdHJpMTI4PjsNCitkZWZtIFBDTVBFU1RSSUEgOiBTUzQyQUlfcGNtcGVzdHJpPGludF94ODZfc3NlNDJfcGNtcGVzdHJpYTEyOD47DQorZGVmbSBQQ01QRVNUUklDIDogU1M0MkFJX3BjbXBlc3RyaTxpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaWMxMjg+Ow0KK2RlZm0gUENNUEVTVFJJTyA6IFNTNDJBSV9wY21wZXN0cmk8aW50X3g4Nl9zc2U0Ml9wY21wZXN0cmlvMTI4PjsNCitkZWZtIFBDTVBFU1RSSVMgOiBTUzQyQUlfcGNtcGVzdHJpPGludF94ODZfc3NlNDJfcGNtcGVzdHJpczEyOD47DQorZGVmbSBQQ01QRVNUUklaIDogU1M0MkFJX3BjbXBlc3RyaTxpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaXoxMjg+Ow0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gU1NFNC4yIC0gQ1JDIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8gTm8gQ1JDIGluc3RydWN0aW9ucyBoYXZlIEFWWCBlcXVpdmFsZW50cw0KKw0KKy8vIGNyYyBpbnRyaW5zaWMgaW5zdHJ1Y3Rpb24NCisvLyBUaGlzIHNldCBvZiBpbnN0cnVjdGlvbnMgYXJlIG9ubHkgcm0sIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIHNpemUNCisvLyBvZiByIGFuZCBtLg0KK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QiIGluIHsNCisgIGRlZiBDUkMzMm04ICA6IFNTNDJGSTwweEYwLCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgaThtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3JjMzJ7Yn0gXHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50X3g4Nl9zc2U0Ml9jcmMzMl84IEdSMzI6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkIGFkZHI6JHNyYzIpKSldPjsNCisgIGRlZiBDUkMzMnI4ICA6IFNTNDJGSTwweEYwLCBNUk1TcmNSZWcsIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgR1I4OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgImNyYzMye2J9IFx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKGludF94ODZfc3NlNDJfY3JjMzJfOCBHUjMyOiRzcmMxLCBHUjg6JHNyYzIpKV0+Ow0KKyAgZGVmIENSQzMybTE2ICA6IFNTNDJGSTwweEYxLCBNUk1TcmNNZW0sIChvdXRzIEdSMzI6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1IzMjokc3JjMSwgaTE2bWVtOiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgImNyYzMye3d9IFx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKGludF94ODZfc3NlNDJfY3JjMzJfMTYgR1IzMjokc3JjMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgYWRkcjokc3JjMikpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBPcFNpemU7DQorICBkZWYgQ1JDMzJyMTYgIDogU1M0MkZJPDB4RjEsIE1STVNyY1JlZywgKG91dHMgR1IzMjokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjMyOiRzcmMxLCBHUjE2OiRzcmMyKSwNCisgICAgICAgICAgICAgICAgICAgICAgImNyYzMye3d9IFx0eyRzcmMyLCAkc3JjMXwkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSMzI6JGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKGludF94ODZfc3NlNDJfY3JjMzJfMTYgR1IzMjokc3JjMSwgR1IxNjokc3JjMikpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgIE9wU2l6ZTsNCisgIGRlZiBDUkMzMm0zMiAgOiBTUzQyRkk8MHhGMSwgTVJNU3JjTWVtLCAob3V0cyBHUjMyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIGkzMm1lbTokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJjcmMzMntsfSBcdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjMyOiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRfeDg2X3NzZTQyX2NyYzMyXzMyIEdSMzI6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkIGFkZHI6JHNyYzIpKSldPjsNCisgIGRlZiBDUkMzMnIzMiAgOiBTUzQyRkk8MHhGMSwgTVJNU3JjUmVnLCAob3V0cyBHUjMyOiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSMzI6JHNyYzEsIEdSMzI6JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3JjMzJ7bH0gXHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1IzMjokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50X3g4Nl9zc2U0Ml9jcmMzMl8zMiBHUjMyOiRzcmMxLCBHUjMyOiRzcmMyKSldPjsNCisgIGRlZiBDUkM2NG04ICA6IFNTNDJGSTwweEYwLCBNUk1TcmNNZW0sIChvdXRzIEdSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgaThtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3JjMzJ7Yn0gXHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50X3g4Nl9zc2U0Ml9jcmM2NF84IEdSNjQ6JHNyYzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkIGFkZHI6JHNyYzIpKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgUkVYX1c7DQorICBkZWYgQ1JDNjRyOCAgOiBTUzQyRkk8MHhGMCwgTVJNU3JjUmVnLCAob3V0cyBHUjY0OiRkc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5zIEdSNjQ6JHNyYzEsIEdSODokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJjcmMzMntifSBcdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRfeDg2X3NzZTQyX2NyYzY0XzggR1I2NDokc3JjMSwgR1I4OiRzcmMyKSldPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgUkVYX1c7DQorICBkZWYgQ1JDNjRtNjQgIDogU1M0MkZJPDB4RjEsIE1STVNyY01lbSwgKG91dHMgR1I2NDokZHN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgKGlucyBHUjY0OiRzcmMxLCBpNjRtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAiY3JjMzJ7cX0gXHR7JHNyYzIsICRzcmMxfCRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1I2NDokZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50X3g4Nl9zc2U0Ml9jcmM2NF82NCBHUjY0OiRzcmMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZCBhZGRyOiRzcmMyKSkpXT4sDQorICAgICAgICAgICAgICAgICAgICAgICAgIFJFWF9XOw0KKyAgZGVmIENSQzY0cjY0ICA6IFNTNDJGSTwweEYxLCBNUk1TcmNSZWcsIChvdXRzIEdSNjQ6JGRzdCksDQorICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1I2NDokc3JjMSwgR1I2NDokc3JjMiksDQorICAgICAgICAgICAgICAgICAgICAgICJjcmMzMntxfSBcdHskc3JjMiwgJHNyYzF8JHNyYzEsICRzcmMyfSIsDQorICAgICAgICAgICAgICAgICAgICAgICBbKHNldCBHUjY0OiRkc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRfeDg2X3NzZTQyX2NyYzY0XzY0IEdSNjQ6JHNyYzEsIEdSNjQ6JHNyYzIpKV0+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBSRVhfVzsNCit9DQorDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLyBBRVMtTkkgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCittdWx0aWNsYXNzIEFFU0lfYmlub3Bfcm1faW50PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRJZDEyOCwgYml0IElzMkFkZHIgPSAxPiB7DQorICBkZWYgcnIgOiBBRVM4STxvcGMsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgIWlmKElzMkFkZHIsDQorICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkZHN0fCRkc3QsICRzcmMyfSIpLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpKSwNCisgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEludElkMTI4IFZSMTI4OiRzcmMxLCBWUjEyODokc3JjMikpXT4sDQorICAgICAgIE9wU2l6ZTsNCisgIGRlZiBybSA6IEFFUzhJPG9wYywgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAgKGlucyBWUjEyODokc3JjMSwgaTEyOG1lbTokc3JjMiksDQorICAgICAgICFpZihJczJBZGRyLA0KKyAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJGRzdHwkZHN0LCAkc3JjMn0iKSwNCisgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSksDQorICAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAgKEludElkMTI4IFZSMTI4OiRzcmMxLA0KKyAgICAgICAgICAoYml0Y29udmVydCAobWVtb3B2MTZpOCBhZGRyOiRzcmMyKSkpKV0+LCBPcFNpemU7DQorfQ0KKw0KKy8vIFBlcmZvcm0gT25lIFJvdW5kIG9mIGFuIEFFUyBFbmNyeXB0aW9uL0RlY3J5cHRpb24gRmxvdw0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWCwgSGFzQUVTXSBpbiB7DQorICBkZWZtIFZBRVNFTkMgICAgICAgICAgOiBBRVNJX2Jpbm9wX3JtX2ludDwweERDLCAidmFlc2VuYyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYWVzbmlfYWVzZW5jLCAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWQUVTRU5DTEFTVCAgICAgIDogQUVTSV9iaW5vcF9ybV9pbnQ8MHhERCwgInZhZXNlbmNsYXN0IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hZXNuaV9hZXNlbmNsYXN0LCAwPiwgVkVYXzRWOw0KKyAgZGVmbSBWQUVTREVDICAgICAgICAgIDogQUVTSV9iaW5vcF9ybV9pbnQ8MHhERSwgInZhZXNkZWMiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2Flc25pX2Flc2RlYywgMD4sIFZFWF80VjsNCisgIGRlZm0gVkFFU0RFQ0xBU1QgICAgICA6IEFFU0lfYmlub3Bfcm1faW50PDB4REYsICJ2YWVzZGVjbGFzdCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYWVzbmlfYWVzZGVjbGFzdCwgMD4sIFZFWF80VjsNCit9DQorDQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4gew0KKyAgZGVmbSBBRVNFTkMgICAgICAgICAgOiBBRVNJX2Jpbm9wX3JtX2ludDwweERDLCAiYWVzZW5jIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hZXNuaV9hZXNlbmM+Ow0KKyAgZGVmbSBBRVNFTkNMQVNUICAgICAgOiBBRVNJX2Jpbm9wX3JtX2ludDwweERELCAiYWVzZW5jbGFzdCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYWVzbmlfYWVzZW5jbGFzdD47DQorICBkZWZtIEFFU0RFQyAgICAgICAgICA6IEFFU0lfYmlub3Bfcm1faW50PDB4REUsICJhZXNkZWMiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2Flc25pX2Flc2RlYz47DQorICBkZWZtIEFFU0RFQ0xBU1QgICAgICA6IEFFU0lfYmlub3Bfcm1faW50PDB4REYsICJhZXNkZWNsYXN0IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hZXNuaV9hZXNkZWNsYXN0PjsNCit9DQorDQorZGVmIDogUGF0PCh2Mmk2NCAoaW50X3g4Nl9hZXNuaV9hZXNlbmMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSksDQorICAgICAgICAgIChBRVNFTkNyciBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHYyaTY0IChpbnRfeDg2X2Flc25pX2Flc2VuYyBWUjEyODokc3JjMSwgKG1lbW9wIGFkZHI6JHNyYzIpKSksDQorICAgICAgICAgIChBRVNFTkNybSBWUjEyODokc3JjMSwgYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjJpNjQgKGludF94ODZfYWVzbmlfYWVzZW5jbGFzdCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKEFFU0VOQ0xBU1RyciBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHYyaTY0IChpbnRfeDg2X2Flc25pX2Flc2VuY2xhc3QgVlIxMjg6JHNyYzEsIChtZW1vcCBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAoQUVTRU5DTEFTVHJtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorZGVmIDogUGF0PCh2Mmk2NCAoaW50X3g4Nl9hZXNuaV9hZXNkZWMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSksDQorICAgICAgICAgIChBRVNERUNyciBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHYyaTY0IChpbnRfeDg2X2Flc25pX2Flc2RlYyBWUjEyODokc3JjMSwgKG1lbW9wIGFkZHI6JHNyYzIpKSksDQorICAgICAgICAgIChBRVNERUNybSBWUjEyODokc3JjMSwgYWRkcjokc3JjMik+Ow0KK2RlZiA6IFBhdDwodjJpNjQgKGludF94ODZfYWVzbmlfYWVzZGVjbGFzdCBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpKSwNCisgICAgICAgICAgKEFFU0RFQ0xBU1RyciBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIpPjsNCitkZWYgOiBQYXQ8KHYyaTY0IChpbnRfeDg2X2Flc25pX2Flc2RlY2xhc3QgVlIxMjg6JHNyYzEsIChtZW1vcCBhZGRyOiRzcmMyKSkpLA0KKyAgICAgICAgICAoQUVTREVDTEFTVHJtIFZSMTI4OiRzcmMxLCBhZGRyOiRzcmMyKT47DQorDQorLy8gUGVyZm9ybSB0aGUgQUVTIEludk1peENvbHVtbiBUcmFuc2Zvcm1hdGlvbg0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWCwgSGFzQUVTXSBpbiB7DQorICBkZWYgVkFFU0lNQ3JyIDogQUVTOEk8MHhEQiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxKSwNCisgICAgICAidmFlc2ltY1x0eyRzcmMxLCAkZHN0fCRkc3QsICRzcmMxfSIsDQorICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgIChpbnRfeDg2X2Flc25pX2Flc2ltYyBWUjEyODokc3JjMSkpXT4sDQorICAgICAgT3BTaXplLCBWRVg7DQorICBkZWYgVkFFU0lNQ3JtIDogQUVTOEk8MHhEQiwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAoaW5zIGkxMjhtZW06JHNyYzEpLA0KKyAgICAgICJ2YWVzaW1jXHR7JHNyYzEsICRkc3R8JGRzdCwgJHNyYzF9IiwNCisgICAgICBbKHNldCBWUjEyODokZHN0LA0KKyAgICAgICAgKGludF94ODZfYWVzbmlfYWVzaW1jIChiaXRjb252ZXJ0IChtZW1vcHYyaTY0IGFkZHI6JHNyYzEpKSkpXT4sDQorICAgICAgT3BTaXplLCBWRVg7DQorfQ0KK2RlZiBBRVNJTUNyciA6IEFFUzhJPDB4REIsIE1STVNyY1JlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAoaW5zIFZSMTI4OiRzcmMxKSwNCisgICJhZXNpbWNcdHskc3JjMSwgJGRzdHwkZHN0LCAkc3JjMX0iLA0KKyAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgKGludF94ODZfYWVzbmlfYWVzaW1jIFZSMTI4OiRzcmMxKSldPiwNCisgIE9wU2l6ZTsNCitkZWYgQUVTSU1Dcm0gOiBBRVM4STwweERCLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgKGlucyBpMTI4bWVtOiRzcmMxKSwNCisgICJhZXNpbWNcdHskc3JjMSwgJGRzdHwkZHN0LCAkc3JjMX0iLA0KKyAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgKGludF94ODZfYWVzbmlfYWVzaW1jIChiaXRjb252ZXJ0IChtZW1vcHYyaTY0IGFkZHI6JHNyYzEpKSkpXT4sDQorICBPcFNpemU7DQorDQorLy8gQUVTIFJvdW5kIEtleSBHZW5lcmF0aW9uIEFzc2lzdA0KK2xldCBpc0FzbVBhcnNlck9ubHkgPSAxLCBQcmVkaWNhdGVzID0gW0hhc0FWWCwgSGFzQUVTXSBpbiB7DQorICBkZWYgVkFFU0tFWUdFTkFTU0lTVDEyOHJyIDogQUVTQUk8MHhERiwgTVJNU3JjUmVnLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgInZhZXNrZXlnZW5hc3Npc3RcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIsDQorICAgICAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgICAgIChpbnRfeDg2X2Flc25pX2Flc2tleWdlbmFzc2lzdCBWUjEyODokc3JjMSwgaW1tOiRzcmMyKSldPiwNCisgICAgICBPcFNpemUsIFZFWDsNCisgIGRlZiBWQUVTS0VZR0VOQVNTSVNUMTI4cm0gOiBBRVNBSTwweERGLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgIChpbnMgaTEyOG1lbTokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICJ2YWVza2V5Z2VuYXNzaXN0XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgICAgICAoaW50X3g4Nl9hZXNuaV9hZXNrZXlnZW5hc3Npc3QgKGJpdGNvbnZlcnQgKG1lbW9wdjJpNjQgYWRkcjokc3JjMSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JHNyYzIpKV0+LA0KKyAgICAgIE9wU2l6ZSwgVkVYOw0KK30NCitkZWYgQUVTS0VZR0VOQVNTSVNUMTI4cnIgOiBBRVNBSTwweERGLCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgKGlucyBWUjEyODokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgImFlc2tleWdlbmFzc2lzdFx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgIFsoc2V0IFZSMTI4OiRkc3QsDQorICAgIChpbnRfeDg2X2Flc25pX2Flc2tleWdlbmFzc2lzdCBWUjEyODokc3JjMSwgaW1tOiRzcmMyKSldPiwNCisgIE9wU2l6ZTsNCitkZWYgQUVTS0VZR0VOQVNTSVNUMTI4cm0gOiBBRVNBSTwweERGLCBNUk1TcmNNZW0sIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgKGlucyBpMTI4bWVtOiRzcmMxLCBpOGltbTokc3JjMiksDQorICAiYWVza2V5Z2VuYXNzaXN0XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgWyhzZXQgVlIxMjg6JGRzdCwNCisgICAgKGludF94ODZfYWVzbmlfYWVza2V5Z2VuYXNzaXN0IChiaXRjb252ZXJ0IChtZW1vcHYyaTY0IGFkZHI6JHNyYzEpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW06JHNyYzIpKV0+LA0KKyAgT3BTaXplOw0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQ0xNVUwgSW5zdHJ1Y3Rpb25zDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLyBPbmx5IHRoZSBBVlggdmVyc2lvbiBvZiBDTE1VTCBpbnN0cnVjdGlvbnMgYXJlIGRlc2NyaWJlZCBoZXJlLg0KKw0KKy8vIENhcnJ5LWxlc3MgTXVsdGlwbGljYXRpb24gaW5zdHJ1Y3Rpb25zDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KK2RlZiBWUENMTVVMUURRcnIgOiBDTE1VTElpODwweDQ0LCBNUk1TcmNSZWcsIChvdXRzIFZSMTI4OiRkc3QpLA0KKyAgICAgICAgICAgKGlucyBWUjEyODokc3JjMSwgVlIxMjg6JHNyYzIsIGk4aW1tOiRzcmMzKSwNCisgICAgICAgICAgICJ2cGNsbXVscWRxXHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgICBbXT47DQorDQorZGVmIFZQQ0xNVUxRRFFybSA6IENMTVVMSWk4PDB4NDQsIE1STVNyY01lbSwgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgICAgICAoaW5zIFZSMTI4OiRzcmMxLCBpMTI4bWVtOiRzcmMyLCBpOGltbTokc3JjMyksDQorICAgICAgICAgICAidnBjbG11bHFkcVx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iLA0KKyAgICAgICAgICAgW10+Ow0KKw0KKy8vIEFzc2VtYmxlciBPbmx5DQorbXVsdGljbGFzcyBhdnhfdnBjbG11bDxzdHJpbmcgYXNtPiB7DQorICBkZWYgcnIgOiBJPDAsIFBzZXVkbywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgICAgICAgIXN0cmNvbmNhdChhc20sICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICBbXT47DQorDQorICBkZWYgcm0gOiBJPDAsIFBzZXVkbywgKG91dHMgVlIxMjg6JGRzdCksIChpbnMgVlIxMjg6JHNyYzEsIGkxMjhtZW06JHNyYzIpLA0KKyAgICAgICAgICAgICAhc3RyY29uY2F0KGFzbSwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgIFtdPjsNCit9DQorZGVmbSBWUENMTVVMSFFIUURRIDogYXZ4X3ZwY2xtdWw8InZwY2xtdWxocWhxZHEiPjsNCitkZWZtIFZQQ0xNVUxIUUxRRFEgOiBhdnhfdnBjbG11bDwidnBjbG11bGhxbHFkcSI+Ow0KK2RlZm0gVlBDTE1VTExRSFFEUSA6IGF2eF92cGNsbXVsPCJ2cGNsbXVsbHFocWRxIj47DQorZGVmbSBWUENMTVVMTFFMUURRIDogYXZ4X3ZwY2xtdWw8InZwY2xtdWxscWxxZHEiPjsNCisNCit9IC8vIGlzQXNtUGFyc2VyT25seQ0KKw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorLy8gQVZYIEluc3RydWN0aW9ucw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorbGV0IGlzQXNtUGFyc2VyT25seSA9IDEgaW4gew0KKw0KKy8vIExvYWQgZnJvbSBtZW1vcnkgYW5kIGJyb2FkY2FzdCB0byBhbGwgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIG9wZXJhbmQNCitjbGFzcyBhdnhfYnJvYWRjYXN0PGJpdHM8OD4gb3BjLCBzdHJpbmcgT3Bjb2RlU3RyLCBSZWdpc3RlckNsYXNzIFJDLA0KKyAgICAgICAgICAgICAgICAgICAgWDg2TWVtT3BlcmFuZCB4ODZtZW1vcCwgSW50cmluc2ljIEludD4gOg0KKyAgQVZYOEk8b3BjLCBNUk1TcmNNZW0sIChvdXRzIFJDOiRkc3QpLCAoaW5zIHg4Nm1lbW9wOiRzcmMpLA0KKyAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjLCAkZHN0fCRkc3QsICRzcmN9IiksDQorICAgICAgICBbKHNldCBSQzokZHN0LCAoSW50IGFkZHI6JHNyYykpXT4sIFZFWDsNCisNCitkZWYgVkJST0FEQ0FTVFNTICAgOiBhdnhfYnJvYWRjYXN0PDB4MTgsICJ2YnJvYWRjYXN0c3MiLCBWUjEyOCwgZjMybWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfdmJyb2FkY2FzdHNzPjsNCitkZWYgVkJST0FEQ0FTVFNTWSAgOiBhdnhfYnJvYWRjYXN0PDB4MTgsICJ2YnJvYWRjYXN0c3MiLCBWUjI1NiwgZjMybWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfdmJyb2FkY2FzdHNzXzI1Nj47DQorZGVmIFZCUk9BRENBU1RTRCAgIDogYXZ4X2Jyb2FkY2FzdDwweDE5LCAidmJyb2FkY2FzdHNkIiwgVlIyNTYsIGY2NG1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYXZ4X3Zicm9hZGNhc3Rfc2RfMjU2PjsNCitkZWYgVkJST0FEQ0FTVEYxMjggOiBhdnhfYnJvYWRjYXN0PDB4MUEsICJ2YnJvYWRjYXN0ZjEyOCIsIFZSMjU2LCBmMTI4bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfdmJyb2FkY2FzdGYxMjhfcGRfMjU2PjsNCisNCisvLyBJbnNlcnQgcGFja2VkIGZsb2F0aW5nLXBvaW50IHZhbHVlcw0KK2RlZiBWSU5TRVJURjEyOHJyIDogQVZYQUlpODwweDE4LCBNUk1TcmNSZWcsIChvdXRzIFZSMjU2OiRkc3QpLA0KKyAgICAgICAgICAoaW5zIFZSMjU2OiRzcmMxLCBWUjEyODokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICAgICAidmluc2VydGYxMjhcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgW10+LCBWRVhfNFY7DQorZGVmIFZJTlNFUlRGMTI4cm0gOiBBVlhBSWk4PDB4MTgsIE1STVNyY01lbSwgKG91dHMgVlIyNTY6JGRzdCksDQorICAgICAgICAgIChpbnMgVlIyNTY6JHNyYzEsIGYxMjhtZW06JHNyYzIsIGk4aW1tOiRzcmMzKSwNCisgICAgICAgICAgInZpbnNlcnRmMTI4XHR7JHNyYzMsICRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzIsICRzcmMzfSIsDQorICAgICAgICAgIFtdPiwgVkVYXzRWOw0KKw0KKy8vIEV4dHJhY3QgcGFja2VkIGZsb2F0aW5nLXBvaW50IHZhbHVlcw0KK2RlZiBWRVhUUkFDVEYxMjhyciA6IEFWWEFJaTg8MHgxOSwgTVJNRGVzdFJlZywgKG91dHMgVlIxMjg6JGRzdCksDQorICAgICAgICAgIChpbnMgVlIyNTY6JHNyYzEsIGk4aW1tOiRzcmMyKSwNCisgICAgICAgICAgInZleHRyYWN0ZjEyOFx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiwNCisgICAgICAgICAgW10+LCBWRVg7DQorZGVmIFZFWFRSQUNURjEyOG1yIDogQVZYQUlpODwweDE5LCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgIChpbnMgZjEyOG1lbTokZHN0LCBWUjI1Njokc3JjMSwgaThpbW06JHNyYzIpLA0KKyAgICAgICAgICAidmV4dHJhY3RmMTI4XHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iLA0KKyAgICAgICAgICBbXT4sIFZFWDsNCisNCisvLyBDb25kaXRpb25hbCBTSU1EIFBhY2tlZCBMb2FkcyBhbmQgU3RvcmVzDQorbXVsdGljbGFzcyBhdnhfbW92bWFza19ybTxiaXRzPDg+IG9wY19ybSwgYml0czw4PiBvcGNfbXIsIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMgSW50TGQsIEludHJpbnNpYyBJbnRMZDI1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRTdCwgSW50cmluc2ljIEludFN0MjU2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0RnJhZyBwZjEyOCwgUGF0RnJhZyBwZjI1Nj4gew0KKyAgZGVmIHJtICA6IEFWWDhJPG9wY19ybSwgTVJNU3JjTWVtLCAob3V0cyBWUjEyODokZHN0KSwNCisgICAgICAgICAgICAgKGlucyBWUjEyODokc3JjMSwgZjEyOG1lbTokc3JjMiksDQorICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgWyhzZXQgVlIxMjg6JGRzdCwgKEludExkIGFkZHI6JHNyYzIsIFZSMTI4OiRzcmMxKSldPiwNCisgICAgICAgICAgICAgVkVYXzRWOw0KKyAgZGVmIFlybSA6IEFWWDhJPG9wY19ybSwgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwNCisgICAgICAgICAgICAgKGlucyBWUjI1Njokc3JjMSwgZjI1Nm1lbTokc3JjMiksDQorICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgWyhzZXQgVlIyNTY6JGRzdCwgKEludExkMjU2IGFkZHI6JHNyYzIsIFZSMjU2OiRzcmMxKSldPiwNCisgICAgICAgICAgICAgVkVYXzRWOw0KKyAgZGVmIG1yICA6IEFWWDhJPG9wY19tciwgTVJNRGVzdE1lbSwgKG91dHMpLA0KKyAgICAgICAgICAgICAoaW5zIGYxMjhtZW06JGRzdCwgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKSwNCisgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICBbKEludFN0IGFkZHI6JGRzdCwgVlIxMjg6JHNyYzEsIFZSMTI4OiRzcmMyKV0+LCBWRVhfNFY7DQorICBkZWYgWW1yIDogQVZYOEk8b3BjX21yLCBNUk1EZXN0TWVtLCAob3V0cyksDQorICAgICAgICAgICAgIChpbnMgZjI1Nm1lbTokZHN0LCBWUjI1Njokc3JjMSwgVlIyNTY6JHNyYzIpLA0KKyAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgIFsoSW50U3QyNTYgYWRkcjokZHN0LCBWUjI1Njokc3JjMSwgVlIyNTY6JHNyYzIpXT4sIFZFWF80VjsNCit9DQorDQorZGVmbSBWTUFTS01PVlBTIDogYXZ4X21vdm1hc2tfcm08MHgyQywgMHgyRSwgInZtYXNrbW92cHMiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYXZ4X21hc2tsb2FkX3BzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYXZ4X21hc2tsb2FkX3BzXzI1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2F2eF9tYXNrc3RvcmVfcHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfbWFza3N0b3JlX3BzXzI1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcHY0ZjMyLCBtZW1vcHY4ZjMyPjsNCitkZWZtIFZNQVNLTU9WUEQgOiBhdnhfbW92bWFza19ybTwweDJELCAweDJGLCAidm1hc2ttb3ZwZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfbWFza2xvYWRfcGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfbWFza2xvYWRfcGRfMjU2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYXZ4X21hc2tzdG9yZV9wZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2F2eF9tYXNrc3RvcmVfcGRfMjU2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9wdjJmNjQsIG1lbW9wdjRmNjQ+Ow0KKw0KKy8vIFBlcm11dGUgRmxvYXRpbmctUG9pbnQgVmFsdWVzDQorbXVsdGljbGFzcyBhdnhfcGVybWlsPGJpdHM8OD4gb3BjX3JtLCBiaXRzPDg+IG9wY19ybWksIHN0cmluZyBPcGNvZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MgUkMsIFg4Nk1lbU9wZXJhbmQgeDg2bWVtb3BfZiwNCisgICAgICAgICAgICAgICAgICAgICAgWDg2TWVtT3BlcmFuZCB4ODZtZW1vcF9pLCBQYXRGcmFnIGZfZnJhZywgUGF0RnJhZyBpX2ZyYWcsDQorICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYyBJbnRWYXIsIEludHJpbnNpYyBJbnRJbW0+IHsNCisgIGRlZiByciAgOiBBVlg4STxvcGNfcm0sIE1STVNyY1JlZywgKG91dHMgUkM6JGRzdCksDQorICAgICAgICAgICAgIChpbnMgUkM6JHNyYzEsIFJDOiRzcmMyKSwNCisgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNvZGVTdHIsICJcdHskc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyfSIpLA0KKyAgICAgICAgICAgICBbKHNldCBSQzokZHN0LCAoSW50VmFyIFJDOiRzcmMxLCBSQzokc3JjMikpXT4sIFZFWF80VjsNCisgIGRlZiBybSAgOiBBVlg4STxvcGNfcm0sIE1STVNyY01lbSwgKG91dHMgUkM6JGRzdCksDQorICAgICAgICAgICAgIChpbnMgUkM6JHNyYzEsIHg4Nm1lbW9wX2k6JHNyYzIpLA0KKyAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY29kZVN0ciwgIlx0eyRzcmMyLCAkc3JjMSwgJGRzdHwkZHN0LCAkc3JjMSwgJHNyYzJ9IiksDQorICAgICAgICAgICAgIFsoc2V0IFJDOiRkc3QsIChJbnRWYXIgUkM6JHNyYzEsIChpX2ZyYWcgYWRkcjokc3JjMikpKV0+LCBWRVhfNFY7DQorDQorICBkZWYgcmkgIDogQVZYQUlpODxvcGNfcm1pLCBNUk1TcmNSZWcsIChvdXRzIFJDOiRkc3QpLA0KKyAgICAgICAgICAgICAoaW5zIFJDOiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgWyhzZXQgUkM6JGRzdCwgKEludEltbSBSQzokc3JjMSwgaW1tOiRzcmMyKSldPiwgVkVYOw0KKyAgZGVmIG1pICA6IEFWWEFJaTg8b3BjX3JtaSwgTVJNU3JjTWVtLCAob3V0cyBSQzokZHN0KSwNCisgICAgICAgICAgICAgKGlucyB4ODZtZW1vcF9mOiRzcmMxLCBpOGltbTokc3JjMiksDQorICAgICAgICAgICAgICFzdHJjb25jYXQoT3Bjb2RlU3RyLCAiXHR7JHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMn0iKSwNCisgICAgICAgICAgICAgWyhzZXQgUkM6JGRzdCwgKEludEltbSAoZl9mcmFnIGFkZHI6JHNyYzEpLCBpbW06JHNyYzIpKV0+LCBWRVg7DQorfQ0KKw0KK2RlZm0gVlBFUk1JTFBTICA6IGF2eF9wZXJtaWw8MHgwQywgMHgwNCwgInZwZXJtaWxwcyIsIFZSMTI4LCBmMTI4bWVtLCBpMTI4bWVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3B2NGYzMiwgbWVtb3B2NGkzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYXZ4X3ZwZXJtaWx2YXJfcHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2F2eF92cGVybWlsX3BzPjsNCitkZWZtIFZQRVJNSUxQU1kgOiBhdnhfcGVybWlsPDB4MEMsIDB4MDQsICJ2cGVybWlscHMiLCBWUjI1NiwgZjI1Nm1lbSwgaTI1Nm1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9wdjhmMzIsIG1lbW9wdjhpMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2F2eF92cGVybWlsdmFyX3BzXzI1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF94ODZfYXZ4X3ZwZXJtaWxfcHNfMjU2PjsNCitkZWZtIFZQRVJNSUxQRCAgOiBhdnhfcGVybWlsPDB4MEQsIDB4MDUsICJ2cGVybWlscGQiLCBWUjEyOCwgZjEyOG1lbSwgaTEyOG1lbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9wdjJmNjQsIG1lbW9wdjJpNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2F2eF92cGVybWlsdmFyX3BkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfdnBlcm1pbF9wZD47DQorZGVmbSBWUEVSTUlMUERZIDogYXZ4X3Blcm1pbDwweDBELCAweDA1LCAidnBlcm1pbHBkIiwgVlIyNTYsIGYyNTZtZW0sIGkyNTZtZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcHY0ZjY0LCBtZW1vcHY0aTY0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3g4Nl9hdnhfdnBlcm1pbHZhcl9wZF8yNTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfeDg2X2F2eF92cGVybWlsX3BkXzI1Nj47DQorDQorZGVmIFZQRVJNMkYxMjhyciA6IEFWWEFJaTg8MHgwNiwgTVJNU3JjUmVnLCAob3V0cyBWUjI1NjokZHN0KSwNCisgICAgICAgICAgKGlucyBWUjI1Njokc3JjMSwgVlIyNTY6JHNyYzIsIGk4aW1tOiRzcmMzKSwNCisgICAgICAgICAgInZwZXJtMmYxMjhcdHskc3JjMywgJHNyYzIsICRzcmMxLCAkZHN0fCRkc3QsICRzcmMxLCAkc3JjMiwgJHNyYzN9IiwNCisgICAgICAgICAgW10+LCBWRVhfNFY7DQorZGVmIFZQRVJNMkYxMjhybSA6IEFWWEFJaTg8MHgwNiwgTVJNU3JjTWVtLCAob3V0cyBWUjI1NjokZHN0KSwNCisgICAgICAgICAgKGlucyBWUjI1Njokc3JjMSwgZjI1Nm1lbTokc3JjMiwgaThpbW06JHNyYzMpLA0KKyAgICAgICAgICAidnBlcm0yZjEyOFx0eyRzcmMzLCAkc3JjMiwgJHNyYzEsICRkc3R8JGRzdCwgJHNyYzEsICRzcmMyLCAkc3JjM30iLA0KKyAgICAgICAgICBbXT4sIFZFWF80VjsNCisNCisvLyBaZXJvIEFsbCBZTU0gcmVnaXN0ZXJzDQorZGVmIFZaRVJPQUxMIDogSTwweDc3LCBSYXdGcm0sIChvdXRzKSwgKGlucyksICJ2emVyb2FsbCIsDQorICAgICAgICAgICAgICAgICBbKGludF94ODZfYXZ4X3Z6ZXJvYWxsKV0+LCBWRVgsIFZFWF9MLCBSZXF1aXJlczxbSGFzQVZYXT47DQorDQorLy8gWmVybyBVcHBlciBiaXRzIG9mIFlNTSByZWdpc3RlcnMNCitkZWYgVlpFUk9VUFBFUiA6IEk8MHg3NywgUmF3RnJtLCAob3V0cyksIChpbnMpLCAidnplcm91cHBlciIsDQorICAgICAgICAgICAgICAgICAgIFsoaW50X3g4Nl9hdnhfdnplcm91cHBlcildPiwgVkVYLCBSZXF1aXJlczxbSGFzQVZYXT47DQorDQorfSAvLyBpc0FzbVBhcnNlck9ubHkNCisNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X3ZpbnNlcnRmMTI4X3BkXzI1NiBWUjI1Njokc3JjMSwgVlIxMjg6JHNyYzIsIGltbTokc3JjMyksDQorICAgICAgICAgIChWSU5TRVJURjEyOHJyIFZSMjU2OiRzcmMxLCBWUjEyODokc3JjMiwgaW1tOiRzcmMzKT47DQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF92aW5zZXJ0ZjEyOF9wc18yNTYgVlIyNTY6JHNyYzEsIFZSMTI4OiRzcmMyLCBpbW06JHNyYzMpLA0KKyAgICAgICAgICAoVklOU0VSVEYxMjhyciBWUjI1Njokc3JjMSwgVlIxMjg6JHNyYzIsIGltbTokc3JjMyk+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfdmluc2VydGYxMjhfc2lfMjU2IFZSMjU2OiRzcmMxLCBWUjEyODokc3JjMiwgaW1tOiRzcmMzKSwNCisgICAgICAgICAgKFZJTlNFUlRGMTI4cnIgVlIyNTY6JHNyYzEsIFZSMTI4OiRzcmMyLCBpbW06JHNyYzMpPjsNCisNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X3ZleHRyYWN0ZjEyOF9wZF8yNTYgVlIyNTY6JHNyYzEsIGltbTokc3JjMiksDQorICAgICAgICAgIChWRVhUUkFDVEYxMjhyciBWUjI1Njokc3JjMSwgaW1tOiRzcmMyKT47DQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF92ZXh0cmFjdGYxMjhfcHNfMjU2IFZSMjU2OiRzcmMxLCBpbW06JHNyYzIpLA0KKyAgICAgICAgICAoVkVYVFJBQ1RGMTI4cnIgVlIyNTY6JHNyYzEsIGltbTokc3JjMik+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfdmV4dHJhY3RmMTI4X3NpXzI1NiBWUjI1Njokc3JjMSwgaW1tOiRzcmMyKSwNCisgICAgICAgICAgKFZFWFRSQUNURjEyOHJyIFZSMjU2OiRzcmMxLCBpbW06JHNyYzIpPjsNCisNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X3Zicm9hZGNhc3RmMTI4X3BzXzI1NiBhZGRyOiRzcmMpLA0KKyAgICAgICAgICAoVkJST0FEQ0FTVEYxMjggYWRkcjokc3JjKT47DQorDQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF92cGVybTJmMTI4X3BzXzI1NiBWUjI1Njokc3JjMSwgVlIyNTY6JHNyYzIsIGltbTokc3JjMyksDQorICAgICAgICAgIChWUEVSTTJGMTI4cnIgVlIyNTY6JHNyYzEsIFZSMjU2OiRzcmMyLCBpbW06JHNyYzMpPjsNCitkZWYgOiBQYXQ8KGludF94ODZfYXZ4X3ZwZXJtMmYxMjhfcGRfMjU2IFZSMjU2OiRzcmMxLCBWUjI1Njokc3JjMiwgaW1tOiRzcmMzKSwNCisgICAgICAgICAgKFZQRVJNMkYxMjhyciBWUjI1Njokc3JjMSwgVlIyNTY6JHNyYzIsIGltbTokc3JjMyk+Ow0KK2RlZiA6IFBhdDwoaW50X3g4Nl9hdnhfdnBlcm0yZjEyOF9zaV8yNTYgVlIyNTY6JHNyYzEsIFZSMjU2OiRzcmMyLCBpbW06JHNyYzMpLA0KKyAgICAgICAgICAoVlBFUk0yRjEyOHJyIFZSMjU2OiRzcmMxLCBWUjI1Njokc3JjMiwgaW1tOiRzcmMzKT47DQorDQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF92cGVybTJmMTI4X3BzXzI1Ng0KKyAgICAgICAgICAgICAgICAgIFZSMjU2OiRzcmMxLCAobWVtb3B2OGYzMiBhZGRyOiRzcmMyKSwgaW1tOiRzcmMzKSwNCisgICAgICAgICAgKFZQRVJNMkYxMjhybSBWUjI1Njokc3JjMSwgYWRkcjokc3JjMiwgaW1tOiRzcmMzKT47DQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF92cGVybTJmMTI4X3BkXzI1Ng0KKyAgICAgICAgICAgICAgICAgIFZSMjU2OiRzcmMxLCAobWVtb3B2NGY2NCBhZGRyOiRzcmMyKSwgaW1tOiRzcmMzKSwNCisgICAgICAgICAgKFZQRVJNMkYxMjhybSBWUjI1Njokc3JjMSwgYWRkcjokc3JjMiwgaW1tOiRzcmMzKT47DQorZGVmIDogUGF0PChpbnRfeDg2X2F2eF92cGVybTJmMTI4X3NpXzI1Ng0KKyAgICAgICAgICAgICAgICAgIFZSMjU2OiRzcmMxLCAobWVtb3B2OGkzMiBhZGRyOiRzcmMyKSwgaW1tOiRzcmMzKSwNCisgICAgICAgICAgKFZQRVJNMkYxMjhybSBWUjI1Njokc3JjMSwgYWRkcjokc3JjMiwgaW1tOiRzcmMzKT47DQorDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SklUSW5mby5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZKSVRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjBhOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SklUSW5mby5jcHAKQEAgLTAsMCArMSw1NjYgQEAKKy8vPT09LS0gWDg2SklUSW5mby5jcHAgLSBJbXBsZW1lbnQgdGhlIEpJVCBpbnRlcmZhY2VzIGZvciB0aGUgWDg2IHRhcmdldCAtLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEpJVCBpbnRlcmZhY2VzIGZvciB0aGUgWDg2IHRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImppdCIKKyNpbmNsdWRlICJYODZKSVRJbmZvLmgiCisjaW5jbHVkZSAiWDg2UmVsb2NhdGlvbnMuaCIKKyNpbmNsdWRlICJYODZTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJYODZUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vVmFsZ3JpbmQuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gRGV0ZXJtaW5lIHRoZSBwbGF0Zm9ybSB3ZSdyZSBydW5uaW5nIG9uCisjaWYgZGVmaW5lZCAoX194ODZfNjRfXykgfHwgZGVmaW5lZCAoX01fQU1ENjQpIHx8IGRlZmluZWQgKF9NX1g2NCkKKyMgZGVmaW5lIFg4Nl82NF9KSVQKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfTV9JWDg2KQorIyBkZWZpbmUgWDg2XzMyX0pJVAorI2VuZGlmCisKK3ZvaWQgWDg2SklUSW5mbzo6cmVwbGFjZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24odm9pZCAqT2xkLCB2b2lkICpOZXcpIHsKKyAgdW5zaWduZWQgY2hhciAqT2xkQnl0ZSA9ICh1bnNpZ25lZCBjaGFyICopT2xkOworICAqT2xkQnl0ZSsrID0gMHhFOTsgICAgICAgICAgICAgICAgLy8gRW1pdCBKTVAgb3Bjb2RlLgorICB1bnNpZ25lZCAqT2xkV29yZCA9ICh1bnNpZ25lZCAqKU9sZEJ5dGU7CisgIHVuc2lnbmVkIE5ld0FkZHIgPSAoaW50cHRyX3QpTmV3OworICB1bnNpZ25lZCBPbGRBZGRyID0gKGludHB0cl90KU9sZFdvcmQ7CisgICpPbGRXb3JkID0gTmV3QWRkciAtIE9sZEFkZHIgLSA0OyAvLyBFbWl0IFBDLXJlbGF0aXZlIGFkZHIgb2YgTmV3IGNvZGUuCisKKyAgLy8gWDg2IGRvZXNuJ3QgbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBwcm9jZXNzb3IgY2FjaGUsIHNvIGp1c3QgaW52YWxpZGF0ZQorICAvLyBWYWxncmluZCdzIGNhY2hlIGRpcmVjdGx5LgorICBzeXM6OlZhbGdyaW5kRGlzY2FyZFRyYW5zbGF0aW9ucyhPbGQsIDUpOworfQorCisKKy8vLyBKSVRDb21waWxlckZ1bmN0aW9uIC0gVGhpcyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgSklUIGZ1bmN0aW9uIHVzZWQgdG8KKy8vLyBjb21waWxlIGEgZnVuY3Rpb24gbGF6aWx5Lgorc3RhdGljIFRhcmdldEpJVEluZm86OkpJVENvbXBpbGVyRm4gSklUQ29tcGlsZXJGdW5jdGlvbjsKKworLy8gR2V0IHRoZSBBU01QUkVGSVggZm9yIHRoZSBjdXJyZW50IGhvc3QuICBUaGlzIGlzIG9mdGVuICdfJy4KKyNpZm5kZWYgX19VU0VSX0xBQkVMX1BSRUZJWF9fCisjZGVmaW5lIF9fVVNFUl9MQUJFTF9QUkVGSVhfXworI2VuZGlmCisjZGVmaW5lIEdFVEFTTVBSRUZJWDIoWCkgI1gKKyNkZWZpbmUgR0VUQVNNUFJFRklYKFgpIEdFVEFTTVBSRUZJWDIoWCkKKyNkZWZpbmUgQVNNUFJFRklYIEdFVEFTTVBSRUZJWChfX1VTRVJfTEFCRUxfUFJFRklYX18pCisKKy8vIEZvciBFTEYgdGFyZ2V0cywgdXNlIGEgLnNpemUgYW5kIC50eXBlIGRpcmVjdGl2ZSwgdG8gbGV0IHRvb2xzCisvLyBrbm93IHRoZSBleHRlbnQgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gYXNzZW1ibGVyLgorI2lmIGRlZmluZWQoX19FTEZfXykKKyMgZGVmaW5lIFNJWkUoc3ltKSAiLnNpemUgIiAjc3ltICIsIC4gLSAiICNzeW0gIlxuIgorIyBkZWZpbmUgVFlQRV9GVU5DVElPTihzeW0pICIudHlwZSAiICNzeW0gIiwgQGZ1bmN0aW9uXG4iCisjZWxzZQorIyBkZWZpbmUgU0laRShzeW0pCisjIGRlZmluZSBUWVBFX0ZVTkNUSU9OKHN5bSkKKyNlbmRpZgorCisvLyBQcm92aWRlIGEgY29udmVuaWVudCB3YXkgZm9yIGRpc2FibGluZyB1c2FnZSBvZiBDRkkgZGlyZWN0aXZlcy4KKy8vIFRoaXMgaXMgbmVlZGVkIGZvciBvbGQvYnJva2VuIGFzc2VtYmxlcnMgKGZvciBleGFtcGxlLCBnYXMgb24KKy8vIERhcndpbiBpcyBwcmV0dHkgb2xkIGFuZCBkb2Vzbid0IHN1cHBvcnQgdGhlc2UgZGlyZWN0aXZlcykKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyMgZGVmaW5lIENGSSh4KQorI2Vsc2UKKy8vIEZJWE1FOiBEaXNhYmxlIHRoaXMgdW50aWwgd2UgcmVhbGx5IHdhbnQgdG8gdXNlIGl0LiBBbHNvLCB3ZSB3aWxsCisvLyAgICAgICAgbmVlZCB0byBhZGQgc29tZSB3b3JrYXJvdW5kcyBmb3IgY29tcGlsZXJzLCB3aGljaCBzdXBwb3J0CisvLyAgICAgICAgb25seSBzdWJzZXQgb2YgdGhlc2UgZGlyZWN0aXZlcy4KKyMgZGVmaW5lIENGSSh4KQorI2VuZGlmCisKKy8vIFByb3ZpZGUgYSB3cmFwcGVyIGZvciBYODZDb21waWxhdGlvbkNhbGxiYWNrMiB0aGF0IHNhdmVzIG5vbi10cmFkaXRpb25hbAorLy8gY2FsbGVlIHNhdmVkIHJlZ2lzdGVycywgZm9yIHRoZSBmYXN0Y2MgY2FsbGluZyBjb252ZW50aW9uLgorZXh0ZXJuICJDIiB7CisjaWYgZGVmaW5lZChYODZfNjRfSklUKQorIyBpZm5kZWYgX01TQ19WRVIKKyAgLy8gTm8gbmVlZCB0byBzYXZlIEVBWC9FRFggZm9yIFg4Ni02NC4KKyAgdm9pZCBYODZDb21waWxhdGlvbkNhbGxiYWNrKHZvaWQpOworICBhc20oCisgICAgIi50ZXh0XG4iCisgICAgIi5hbGlnbiA4XG4iCisgICAgIi5nbG9ibCAiIEFTTVBSRUZJWCAiWDg2Q29tcGlsYXRpb25DYWxsYmFja1xuIgorICAgIFRZUEVfRlVOQ1RJT04oWDg2Q29tcGlsYXRpb25DYWxsYmFjaykKKyAgQVNNUFJFRklYICJYODZDb21waWxhdGlvbkNhbGxiYWNrOlxuIgorICAgIENGSSgiLmNmaV9zdGFydHByb2NcbiIpCisgICAgLy8gU2F2ZSBSQlAKKyAgICAicHVzaHEgICAlcmJwXG4iCisgICAgQ0ZJKCIuY2ZpX2RlZl9jZmFfb2Zmc2V0IDE2XG4iKQorICAgIENGSSgiLmNmaV9vZmZzZXQgJXJicCwgLTE2XG4iKQorICAgIC8vIFNhdmUgUlNQCisgICAgIm1vdnEgICAgJXJzcCwgJXJicFxuIgorICAgIENGSSgiLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyICVyYnBcbiIpCisgICAgLy8gU2F2ZSBhbGwgaW50IGFyZyByZWdpc3RlcnMKKyAgICAicHVzaHEgICAlcmRpXG4iCisgICAgQ0ZJKCIuY2ZpX3JlbF9vZmZzZXQgJXJkaSwgMFxuIikKKyAgICAicHVzaHEgICAlcnNpXG4iCisgICAgQ0ZJKCIuY2ZpX3JlbF9vZmZzZXQgJXJzaSwgOFxuIikKKyAgICAicHVzaHEgICAlcmR4XG4iCisgICAgQ0ZJKCIuY2ZpX3JlbF9vZmZzZXQgJXJkeCwgMTZcbiIpCisgICAgInB1c2hxICAgJXJjeFxuIgorICAgIENGSSgiLmNmaV9yZWxfb2Zmc2V0ICVyY3gsIDI0XG4iKQorICAgICJwdXNocSAgICVyOFxuIgorICAgIENGSSgiLmNmaV9yZWxfb2Zmc2V0ICVyOCwgMzJcbiIpCisgICAgInB1c2hxICAgJXI5XG4iCisgICAgQ0ZJKCIuY2ZpX3JlbF9vZmZzZXQgJXI5LCA0MFxuIikKKyAgICAvLyBBbGlnbiBzdGFjayBvbiAxNi1ieXRlIGJvdW5kYXJ5LiBFU1AgbWlnaHQgbm90IGJlIHByb3Blcmx5IGFsaWduZWQKKyAgICAvLyAoOCBieXRlKSBpZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGFuIGluZGlyZWN0IHN0dWIuCisgICAgImFuZHEgICAgJC0xNiwgJXJzcFxuIgorICAgIC8vIFNhdmUgYWxsIFhNTSBhcmcgcmVnaXN0ZXJzCisgICAgInN1YnEgICAgJDEyOCwgJXJzcFxuIgorICAgICJtb3ZhcHMgICV4bW0wLCAoJXJzcClcbiIKKyAgICAibW92YXBzICAleG1tMSwgMTYoJXJzcClcbiIKKyAgICAibW92YXBzICAleG1tMiwgMzIoJXJzcClcbiIKKyAgICAibW92YXBzICAleG1tMywgNDgoJXJzcClcbiIKKyAgICAibW92YXBzICAleG1tNCwgNjQoJXJzcClcbiIKKyAgICAibW92YXBzICAleG1tNSwgODAoJXJzcClcbiIKKyAgICAibW92YXBzICAleG1tNiwgOTYoJXJzcClcbiIKKyAgICAibW92YXBzICAleG1tNywgMTEyKCVyc3ApXG4iCisgICAgLy8gSklUIGNhbGxlZQorICAgICJtb3ZxICAgICVyYnAsICVyZGlcbiIgICAgLy8gUGFzcyBwcmV2IGZyYW1lIGFuZCByZXR1cm4gYWRkcmVzcworICAgICJtb3ZxICAgIDgoJXJicCksICVyc2lcbiIKKyAgICAiY2FsbCAgICAiIEFTTVBSRUZJWCAiWDg2Q29tcGlsYXRpb25DYWxsYmFjazJcbiIKKyAgICAvLyBSZXN0b3JlIGFsbCBYTU0gYXJnIHJlZ2lzdGVycworICAgICJtb3ZhcHMgIDExMiglcnNwKSwgJXhtbTdcbiIKKyAgICAibW92YXBzICA5NiglcnNwKSwgJXhtbTZcbiIKKyAgICAibW92YXBzICA4MCglcnNwKSwgJXhtbTVcbiIKKyAgICAibW92YXBzICA2NCglcnNwKSwgJXhtbTRcbiIKKyAgICAibW92YXBzICA0OCglcnNwKSwgJXhtbTNcbiIKKyAgICAibW92YXBzICAzMiglcnNwKSwgJXhtbTJcbiIKKyAgICAibW92YXBzICAxNiglcnNwKSwgJXhtbTFcbiIKKyAgICAibW92YXBzICAoJXJzcCksICV4bW0wXG4iCisgICAgLy8gUmVzdG9yZSBSU1AKKyAgICAibW92cSAgICAlcmJwLCAlcnNwXG4iCisgICAgQ0ZJKCIuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIgJXJzcFxuIikKKyAgICAvLyBSZXN0b3JlIGFsbCBpbnQgYXJnIHJlZ2lzdGVycworICAgICJzdWJxICAgICQ0OCwgJXJzcFxuIgorICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCA0OFxuIikKKyAgICAicG9wcSAgICAlcjlcbiIKKyAgICBDRkkoIi5jZmlfYWRqdXN0X2NmYV9vZmZzZXQgLThcbiIpCisgICAgQ0ZJKCIuY2ZpX3Jlc3RvcmUgJXI5XG4iKQorICAgICJwb3BxICAgICVyOFxuIgorICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCAtOFxuIikKKyAgICBDRkkoIi5jZmlfcmVzdG9yZSAlcjhcbiIpCisgICAgInBvcHEgICAgJXJjeFxuIgorICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCAtOFxuIikKKyAgICBDRkkoIi5jZmlfcmVzdG9yZSAlcmN4XG4iKQorICAgICJwb3BxICAgICVyZHhcbiIKKyAgICBDRkkoIi5jZmlfYWRqdXN0X2NmYV9vZmZzZXQgLThcbiIpCisgICAgQ0ZJKCIuY2ZpX3Jlc3RvcmUgJXJkeFxuIikKKyAgICAicG9wcSAgICAlcnNpXG4iCisgICAgQ0ZJKCIuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IC04XG4iKQorICAgIENGSSgiLmNmaV9yZXN0b3JlICVyc2lcbiIpCisgICAgInBvcHEgICAgJXJkaVxuIgorICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCAtOFxuIikKKyAgICBDRkkoIi5jZmlfcmVzdG9yZSAlcmRpXG4iKQorICAgIC8vIFJlc3RvcmUgUkJQCisgICAgInBvcHEgICAgJXJicFxuIgorICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCAtOFxuIikKKyAgICBDRkkoIi5jZmlfcmVzdG9yZSAlcmJwXG4iKQorICAgICJyZXRcbiIKKyAgICBDRkkoIi5jZmlfZW5kcHJvY1xuIikKKyAgICBTSVpFKFg4NkNvbXBpbGF0aW9uQ2FsbGJhY2spCisgICk7CisjIGVsc2UKKyAgLy8gTm8gaW5saW5lIGFzc2VtYmxlciBzdXBwb3J0IG9uIHRoaXMgcGxhdGZvcm0uIFRoZSByb3V0aW5lIGlzIGluIGV4dGVybmFsCisgIC8vIGZpbGUuCisgIHZvaWQgWDg2Q29tcGlsYXRpb25DYWxsYmFjaygpOworCisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIChYODZfMzJfSklUKQorIyBpZm5kZWYgX01TQ19WRVIKKyAgdm9pZCBYODZDb21waWxhdGlvbkNhbGxiYWNrKHZvaWQpOworICBhc20oCisgICAgIi50ZXh0XG4iCisgICAgIi5hbGlnbiA4XG4iCisgICAgIi5nbG9ibCAiIEFTTVBSRUZJWCAiWDg2Q29tcGlsYXRpb25DYWxsYmFja1xuIgorICAgIFRZUEVfRlVOQ1RJT04oWDg2Q29tcGlsYXRpb25DYWxsYmFjaykKKyAgQVNNUFJFRklYICJYODZDb21waWxhdGlvbkNhbGxiYWNrOlxuIgorICAgIENGSSgiLmNmaV9zdGFydHByb2NcbiIpCisgICAgInB1c2hsICAgJWVicFxuIgorICAgIENGSSgiLmNmaV9kZWZfY2ZhX29mZnNldCA4XG4iKQorICAgIENGSSgiLmNmaV9vZmZzZXQgJWVicCwgLThcbiIpCisgICAgIm1vdmwgICAgJWVzcCwgJWVicFxuIiAgICAvLyBTdGFuZGFyZCBwcm9sb2d1ZQorICAgIENGSSgiLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyICVlYnBcbiIpCisgICAgInB1c2hsICAgJWVheFxuIgorICAgIENGSSgiLmNmaV9yZWxfb2Zmc2V0ICVlYXgsIDBcbiIpCisgICAgInB1c2hsICAgJWVkeFxuIiAgICAgICAgICAvLyBTYXZlIEVBWC9FRFgvRUNYCisgICAgQ0ZJKCIuY2ZpX3JlbF9vZmZzZXQgJWVkeCwgNFxuIikKKyAgICAicHVzaGwgICAlZWN4XG4iCisgICAgQ0ZJKCIuY2ZpX3JlbF9vZmZzZXQgJWVjeCwgOFxuIikKKyMgIGlmIGRlZmluZWQoX19BUFBMRV9fKQorICAgICJhbmRsICAgICQtMTYsICVlc3BcbiIgICAgLy8gQWxpZ24gRVNQIG9uIDE2LWJ5dGUgYm91bmRhcnkKKyMgIGVuZGlmCisgICAgInN1YmwgICAgJDE2LCAlZXNwXG4iCisgICAgIm1vdmwgICAgNCglZWJwKSwgJWVheFxuIiAvLyBQYXNzIHByZXYgZnJhbWUgYW5kIHJldHVybiBhZGRyZXNzCisgICAgIm1vdmwgICAgJWVheCwgNCglZXNwKVxuIgorICAgICJtb3ZsICAgICVlYnAsICglZXNwKVxuIgorICAgICJjYWxsICAgICIgQVNNUFJFRklYICJYODZDb21waWxhdGlvbkNhbGxiYWNrMlxuIgorICAgICJtb3ZsICAgICVlYnAsICVlc3BcbiIgICAgLy8gUmVzdG9yZSBFU1AKKyAgICBDRkkoIi5jZmlfZGVmX2NmYV9yZWdpc3RlciAlZXNwXG4iKQorICAgICJzdWJsICAgICQxMiwgJWVzcFxuIgorICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCAxMlxuIikKKyAgICAicG9wbCAgICAlZWN4XG4iCisgICAgQ0ZJKCIuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IC00XG4iKQorICAgIENGSSgiLmNmaV9yZXN0b3JlICVlY3hcbiIpCisgICAgInBvcGwgICAgJWVkeFxuIgorICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCAtNFxuIikKKyAgICBDRkkoIi5jZmlfcmVzdG9yZSAlZWR4XG4iKQorICAgICJwb3BsICAgICVlYXhcbiIKKyAgICBDRkkoIi5jZmlfYWRqdXN0X2NmYV9vZmZzZXQgLTRcbiIpCisgICAgQ0ZJKCIuY2ZpX3Jlc3RvcmUgJWVheFxuIikKKyAgICAicG9wbCAgICAlZWJwXG4iCisgICAgQ0ZJKCIuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IC00XG4iKQorICAgIENGSSgiLmNmaV9yZXN0b3JlICVlYnBcbiIpCisgICAgInJldFxuIgorICAgIENGSSgiLmNmaV9lbmRwcm9jXG4iKQorICAgIFNJWkUoWDg2Q29tcGlsYXRpb25DYWxsYmFjaykKKyAgKTsKKworICAvLyBTYW1lIGFzIFg4NkNvbXBpbGF0aW9uQ2FsbGJhY2sgYnV0IGFsc28gc2F2ZXMgWE1NIGFyZ3VtZW50IHJlZ2lzdGVycy4KKyAgdm9pZCBYODZDb21waWxhdGlvbkNhbGxiYWNrX1NTRSh2b2lkKTsKKyAgYXNtKAorICAgICIudGV4dFxuIgorICAgICIuYWxpZ24gOFxuIgorICAgICIuZ2xvYmwgIiBBU01QUkVGSVggIlg4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfU1NFXG4iCisgICAgVFlQRV9GVU5DVElPTihYODZDb21waWxhdGlvbkNhbGxiYWNrX1NTRSkKKyAgQVNNUFJFRklYICJYODZDb21waWxhdGlvbkNhbGxiYWNrX1NTRTpcbiIKKyAgICBDRkkoIi5jZmlfc3RhcnRwcm9jXG4iKQorICAgICJwdXNobCAgICVlYnBcbiIKKyAgICBDRkkoIi5jZmlfZGVmX2NmYV9vZmZzZXQgOFxuIikKKyAgICBDRkkoIi5jZmlfb2Zmc2V0ICVlYnAsIC04XG4iKQorICAgICJtb3ZsICAgICVlc3AsICVlYnBcbiIgICAgLy8gU3RhbmRhcmQgcHJvbG9ndWUKKyAgICBDRkkoIi5jZmlfZGVmX2NmYV9yZWdpc3RlciAlZWJwXG4iKQorICAgICJwdXNobCAgICVlYXhcbiIKKyAgICBDRkkoIi5jZmlfcmVsX29mZnNldCAlZWF4LCAwXG4iKQorICAgICJwdXNobCAgICVlZHhcbiIgICAgICAgICAgLy8gU2F2ZSBFQVgvRURYL0VDWAorICAgIENGSSgiLmNmaV9yZWxfb2Zmc2V0ICVlZHgsIDRcbiIpCisgICAgInB1c2hsICAgJWVjeFxuIgorICAgIENGSSgiLmNmaV9yZWxfb2Zmc2V0ICVlY3gsIDhcbiIpCisgICAgImFuZGwgICAgJC0xNiwgJWVzcFxuIiAgICAvLyBBbGlnbiBFU1Agb24gMTYtYnl0ZSBib3VuZGFyeQorICAgIC8vIFNhdmUgYWxsIFhNTSBhcmcgcmVnaXN0ZXJzCisgICAgInN1YmwgICAgJDY0LCAlZXNwXG4iCisgICAgLy8gRklYTUU6IHByb3ZpZGUgZnJhbWUgbW92ZSBpbmZvcm1hdGlvbiBmb3IgeG1tIHJlZ2lzdGVycy4KKyAgICAvLyBUaGlzIGNhbiBiZSB0cmlja3ksIGJlY2F1c2UgQ0ZBIHJlZ2lzdGVyIGlzIGVicCAodW5hbGlnbmVkKQorICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHByb2R1Y2Ugb2Zmc2V0cyByZWxhdGl2ZSB0byBpdC4KKyAgICAibW92YXBzICAleG1tMCwgKCVlc3ApXG4iCisgICAgIm1vdmFwcyAgJXhtbTEsIDE2KCVlc3ApXG4iCisgICAgIm1vdmFwcyAgJXhtbTIsIDMyKCVlc3ApXG4iCisgICAgIm1vdmFwcyAgJXhtbTMsIDQ4KCVlc3ApXG4iCisgICAgInN1YmwgICAgJDE2LCAlZXNwXG4iCisgICAgIm1vdmwgICAgNCglZWJwKSwgJWVheFxuIiAvLyBQYXNzIHByZXYgZnJhbWUgYW5kIHJldHVybiBhZGRyZXNzCisgICAgIm1vdmwgICAgJWVheCwgNCglZXNwKVxuIgorICAgICJtb3ZsICAgICVlYnAsICglZXNwKVxuIgorICAgICJjYWxsICAgICIgQVNNUFJFRklYICJYODZDb21waWxhdGlvbkNhbGxiYWNrMlxuIgorICAgICJhZGRsICAgICQxNiwgJWVzcFxuIgorICAgICJtb3ZhcHMgIDQ4KCVlc3ApLCAleG1tM1xuIgorICAgIENGSSgiLmNmaV9yZXN0b3JlICV4bW0zXG4iKQorICAgICJtb3ZhcHMgIDMyKCVlc3ApLCAleG1tMlxuIgorICAgIENGSSgiLmNmaV9yZXN0b3JlICV4bW0yXG4iKQorICAgICJtb3ZhcHMgIDE2KCVlc3ApLCAleG1tMVxuIgorICAgIENGSSgiLmNmaV9yZXN0b3JlICV4bW0xXG4iKQorICAgICJtb3ZhcHMgICglZXNwKSwgJXhtbTBcbiIKKyAgICBDRkkoIi5jZmlfcmVzdG9yZSAleG1tMFxuIikKKyAgICAibW92bCAgICAlZWJwLCAlZXNwXG4iICAgIC8vIFJlc3RvcmUgRVNQCisgICAgQ0ZJKCIuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIgZXNwXG4iKQorICAgICJzdWJsICAgICQxMiwgJWVzcFxuIgorICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCAxMlxuIikKKyAgICAicG9wbCAgICAlZWN4XG4iCisgICAgQ0ZJKCIuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IC00XG4iKQorICAgIENGSSgiLmNmaV9yZXN0b3JlICVlY3hcbiIpCisgICAgInBvcGwgICAgJWVkeFxuIgorICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCAtNFxuIikKKyAgICBDRkkoIi5jZmlfcmVzdG9yZSAlZWR4XG4iKQorICAgICJwb3BsICAgICVlYXhcbiIKKyAgICBDRkkoIi5jZmlfYWRqdXN0X2NmYV9vZmZzZXQgLTRcbiIpCisgICAgQ0ZJKCIuY2ZpX3Jlc3RvcmUgJWVheFxuIikKKyAgICAicG9wbCAgICAlZWJwXG4iCisgICAgQ0ZJKCIuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IC00XG4iKQorICAgIENGSSgiLmNmaV9yZXN0b3JlICVlYnBcbiIpCisgICAgInJldFxuIgorICAgIENGSSgiLmNmaV9lbmRwcm9jXG4iKQorICAgIFNJWkUoWDg2Q29tcGlsYXRpb25DYWxsYmFja19TU0UpCisgICk7CisjIGVsc2UKKyAgdm9pZCBYODZDb21waWxhdGlvbkNhbGxiYWNrMihpbnRwdHJfdCAqU3RhY2tQdHIsIGludHB0cl90IFJldEFkZHIpOworCisgIF9kZWNsc3BlYyhuYWtlZCkgdm9pZCBYODZDb21waWxhdGlvbkNhbGxiYWNrKHZvaWQpIHsKKyAgICBfX2FzbSB7CisgICAgICBwdXNoICBlYnAKKyAgICAgIG1vdiAgIGVicCwgZXNwCisgICAgICBwdXNoICBlYXgKKyAgICAgIHB1c2ggIGVkeAorICAgICAgcHVzaCAgZWN4CisgICAgICBhbmQgICBlc3AsIC0xNgorICAgICAgc3ViICAgZXNwLCAxNgorICAgICAgbW92ICAgZWF4LCBkd29yZCBwdHIgW2VicCs0XQorICAgICAgbW92ICAgZHdvcmQgcHRyIFtlc3ArNF0sIGVheAorICAgICAgbW92ICAgZHdvcmQgcHRyIFtlc3BdLCBlYnAKKyAgICAgIGNhbGwgIFg4NkNvbXBpbGF0aW9uQ2FsbGJhY2syCisgICAgICBtb3YgICBlc3AsIGVicAorICAgICAgc3ViICAgZXNwLCAxMgorICAgICAgcG9wICAgZWN4CisgICAgICBwb3AgICBlZHgKKyAgICAgIHBvcCAgIGVheAorICAgICAgcG9wICAgZWJwCisgICAgICByZXQKKyAgICB9CisgIH0KKworIyBlbmRpZiAvLyBfTVNDX1ZFUgorCisjZWxzZSAvLyBOb3QgYW4gaTM4NiBob3N0CisgIHZvaWQgWDg2Q29tcGlsYXRpb25DYWxsYmFjaygpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDYW5ub3QgY2FsbCBYODZDb21waWxhdGlvbkNhbGxiYWNrKCkgb24gYSBub24teDg2IGFyY2ghIik7CisgIH0KKyNlbmRpZgorfQorCisvLy8gWDg2Q29tcGlsYXRpb25DYWxsYmFjazIgLSBUaGlzIGlzIHRoZSB0YXJnZXQtc3BlY2lmaWMgZnVuY3Rpb24gaW52b2tlZCBieSB0aGUKKy8vLyBmdW5jdGlvbiBzdHViIHdoZW4gd2UgZGlkIG5vdCBrbm93IHRoZSByZWFsIHRhcmdldCBvZiBhIGNhbGwuICBUaGlzIGZ1bmN0aW9uCisvLy8gbXVzdCBsb2NhdGUgdGhlIHN0YXJ0IG9mIHRoZSBzdHViIG9yIGNhbGwgc2l0ZSBhbmQgcGFzcyBpdCBpbnRvIHRoZSBKSVQKKy8vLyBjb21waWxlciBmdW5jdGlvbi4KK2V4dGVybiAiQyIgeworI2lmICEoZGVmaW5lZCAoWDg2XzY0X0pJVCkgJiYgZGVmaW5lZChfTVNDX1ZFUikpCisgLy8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBmcm9tIHRoaXMgdHJhbnNsYXRpb24gdW5pdCwKKyAvLyB1bmxlc3Mgd2UgYXJlIHVuZGVyIDY0Yml0IFdpbmRvd3Mgd2l0aCBNU0MsIHdoZXJlIHRoZXJlIGlzIAorIC8vIG5vIHN1cHBvcnQgZm9yIGlubGluZSBhc3NlbWJseQorc3RhdGljCisjZW5kaWYKK3ZvaWQgQVRUUklCVVRFX1VTRUQKK1g4NkNvbXBpbGF0aW9uQ2FsbGJhY2syKGludHB0cl90ICpTdGFja1B0ciwgaW50cHRyX3QgUmV0QWRkcikgeworICBpbnRwdHJfdCAqUmV0QWRkckxvYyA9ICZTdGFja1B0clsxXTsKKyAgYXNzZXJ0KCpSZXRBZGRyTG9jID09IFJldEFkZHIgJiYKKyAgICAgICAgICJDb3VsZCBub3QgZmluZCByZXR1cm4gYWRkcmVzcyBvbiB0aGUgc3RhY2shIik7CisKKyAgLy8gSXQncyBhIHN0dWIgaWYgdGhlcmUgaXMgYW4gaW50ZXJydXB0IG1hcmtlciBhZnRlciB0aGUgY2FsbC4KKyAgYm9vbCBpc1N0dWIgPSAoKHVuc2lnbmVkIGNoYXIqKVJldEFkZHIpWzBdID09IDB4Q0U7CisKKyAgLy8gVGhlIGNhbGwgaW5zdHJ1Y3Rpb24gc2hvdWxkIGhhdmUgcHVzaGVkIHRoZSByZXR1cm4gdmFsdWUgb250byB0aGUgc3RhY2suLi4KKyNpZiBkZWZpbmVkIChYODZfNjRfSklUKQorICBSZXRBZGRyLS07ICAgICAvLyBCYWNrdHJhY2sgdG8gdGhlIHJlZmVyZW5jZSBpdHNlbGYuLi4KKyNlbHNlCisgIFJldEFkZHIgLT0gNDsgIC8vIEJhY2t0cmFjayB0byB0aGUgcmVmZXJlbmNlIGl0c2VsZi4uLgorI2VuZGlmCisKKyNpZiAwCisgIERFQlVHKGRiZ3MoKSA8PCAiSW4gY2FsbGJhY2shIEFkZHI9IiA8PCAodm9pZCopUmV0QWRkcgorICAgICAgICAgICAgICAgPDwgIiBFU1A9IiA8PCAodm9pZCopU3RhY2tQdHIKKyAgICAgICAgICAgICAgIDw8ICI6IFJlc29sdmluZyBjYWxsIHRvIGZ1bmN0aW9uOiAiCisgICAgICAgICAgICAgICA8PCBUaGVWTS0+Z2V0RnVuY3Rpb25SZWZlcmVuY2VkTmFtZSgodm9pZCopUmV0QWRkcikgPDwgIlxuIik7CisjZW5kaWYKKworICAvLyBTYW5pdHkgY2hlY2sgdG8gbWFrZSBzdXJlIHRoaXMgcmVhbGx5IGlzIGEgY2FsbCBpbnN0cnVjdGlvbi4KKyNpZiBkZWZpbmVkIChYODZfNjRfSklUKQorICBhc3NlcnQoKCh1bnNpZ25lZCBjaGFyKilSZXRBZGRyKVstMl0gPT0gMHg0MSAmJiJOb3QgYSBjYWxsIGluc3RyISIpOworICBhc3NlcnQoKCh1bnNpZ25lZCBjaGFyKilSZXRBZGRyKVstMV0gPT0gMHhGRiAmJiJOb3QgYSBjYWxsIGluc3RyISIpOworI2Vsc2UKKyAgYXNzZXJ0KCgodW5zaWduZWQgY2hhciopUmV0QWRkcilbLTFdID09IDB4RTggJiYiTm90IGEgY2FsbCBpbnN0ciEiKTsKKyNlbmRpZgorCisgIGludHB0cl90IE5ld1ZhbCA9IChpbnRwdHJfdClKSVRDb21waWxlckZ1bmN0aW9uKCh2b2lkKilSZXRBZGRyKTsKKworICAvLyBSZXdyaXRlIHRoZSBjYWxsIHRhcmdldC4uLiBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cCBoZXJlIGV2ZXJ5IHRpbWUgd2UKKyAgLy8gZXhlY3V0ZSB0aGUgY2FsbC4KKyNpZiBkZWZpbmVkIChYODZfNjRfSklUKQorICBhc3NlcnQoaXNTdHViICYmCisgICAgICAgICAiWDg2LTY0IGRvZXNuJ3Qgc3VwcG9ydCByZXdyaXRpbmcgbm9uLXN0dWIgbGF6eSBjb21waWxhdGlvbiBjYWxsczoiCisgICAgICAgICAiIHRoZSBjYWxsIGluc3RydWN0aW9uIHZhcmllcyB0b28gbXVjaC4iKTsKKyNlbHNlCisgICooaW50cHRyX3QgKilSZXRBZGRyID0gKGludHB0cl90KShOZXdWYWwtUmV0QWRkci00KTsKKyNlbmRpZgorCisgIGlmIChpc1N0dWIpIHsKKyAgICAvLyBJZiB0aGlzIGlzIGEgc3R1YiwgcmV3cml0ZSB0aGUgY2FsbCBpbnRvIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoCisgICAgLy8gaW5zdHJ1Y3Rpb24gc28gdGhhdCB0d28gcmV0dXJuIGFkZHJlc3NlcyBhcmUgbm90IHB1c2hlZCBvbnRvIHRoZSBzdGFjaworICAgIC8vIHdoZW4gdGhlIHJlcXVlc3RlZCBmdW5jdGlvbiBmaW5hbGx5IGdldHMgY2FsbGVkLiAgVGhpcyBhbHNvIG1ha2VzIHRoZQorICAgIC8vIDB4Q0UgYnl0ZSAoaW50ZXJydXB0KSBkZWFkLCBzbyB0aGUgbWFya2VyIGRvZXNuJ3QgZWZmZWN0IGFueXRoaW5nLgorI2lmIGRlZmluZWQgKFg4Nl82NF9KSVQpCisgICAgLy8gSWYgdGhlIHRhcmdldCBhZGRyZXNzIGlzIHdpdGhpbiAzMi1iaXQgcmFuZ2Ugb2YgdGhlIHN0dWIsIHVzZSBhCisgICAgLy8gUEMtcmVsYXRpdmUgYnJhbmNoIGluc3RlYWQgb2YgbG9hZGluZyB0aGUgYWN0dWFsIGFkZHJlc3MuICAoVGhpcyBpcworICAgIC8vIGNvbnNpZGVyYWJseSBzaG9ydGVyIHRoYW4gdGhlIDY0LWJpdCBpbW1lZGlhdGUgbG9hZCBhbHJlYWR5IHRoZXJlLikKKyAgICAvLyBXZSBhc3N1bWUgaGVyZSBpbnRwdHJfdCBpcyA2NCBiaXRzLgorICAgIGludHB0cl90IGRpZmYgPSBOZXdWYWwtUmV0QWRkcis3OworICAgIGlmIChkaWZmID49IC0yMTQ3NDgzNjQ4TEwgJiYgZGlmZiA8PSAyMTQ3NDgzNjQ3TEwpIHsKKyAgICAgICoodW5zaWduZWQgY2hhciopKFJldEFkZHItMHhjKSA9IDB4RTk7CisgICAgICAqKGludHB0cl90ICopKFJldEFkZHItMHhiKSA9IGRpZmYgJiAweGZmZmZmZmZmOworICAgIH0gZWxzZSB7CisgICAgICAqKGludHB0cl90ICopKFJldEFkZHIgLSAweGEpID0gTmV3VmFsOworICAgICAgKCh1bnNpZ25lZCBjaGFyKilSZXRBZGRyKVswXSA9ICgyIHwgKDQgPDwgMykgfCAoMyA8PCA2KSk7CisgICAgfQorICAgIHN5czo6VmFsZ3JpbmREaXNjYXJkVHJhbnNsYXRpb25zKCh2b2lkKikoUmV0QWRkci0weGMpLCAweGQpOworI2Vsc2UKKyAgICAoKHVuc2lnbmVkIGNoYXIqKVJldEFkZHIpWy0xXSA9IDB4RTk7CisgICAgc3lzOjpWYWxncmluZERpc2NhcmRUcmFuc2xhdGlvbnMoKHZvaWQqKShSZXRBZGRyLTEpLCA1KTsKKyNlbmRpZgorICB9CisKKyAgLy8gQ2hhbmdlIHRoZSByZXR1cm4gYWRkcmVzcyB0byByZWV4ZWN1dGUgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24uLi4KKyNpZiBkZWZpbmVkIChYODZfNjRfSklUKQorICAqUmV0QWRkckxvYyAtPSAweGQ7CisjZWxzZQorICAqUmV0QWRkckxvYyAtPSA1OworI2VuZGlmCit9Cit9CisKK1RhcmdldEpJVEluZm86OkxhenlSZXNvbHZlckZuCitYODZKSVRJbmZvOjpnZXRMYXp5UmVzb2x2ZXJGdW5jdGlvbihKSVRDb21waWxlckZuIEYpIHsKKyAgSklUQ29tcGlsZXJGdW5jdGlvbiA9IEY7CisKKyNpZiBkZWZpbmVkIChYODZfMzJfSklUKSAmJiAhZGVmaW5lZCAoX01TQ19WRVIpCisgIGlmIChTdWJ0YXJnZXQtPmhhc1NTRTEoKSkKKyAgICByZXR1cm4gWDg2Q29tcGlsYXRpb25DYWxsYmFja19TU0U7CisjZW5kaWYKKworICByZXR1cm4gWDg2Q29tcGlsYXRpb25DYWxsYmFjazsKK30KKworWDg2SklUSW5mbzo6WDg2SklUSW5mbyhYODZUYXJnZXRNYWNoaW5lICZ0bSkgOiBUTSh0bSkgeworICBTdWJ0YXJnZXQgPSAmVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKTsKKyAgdXNlR09UID0gMDsKKyAgVExTT2Zmc2V0ID0gMDsKK30KKwordm9pZCAqWDg2SklUSW5mbzo6ZW1pdEdsb2JhbFZhbHVlSW5kaXJlY3RTeW0oY29uc3QgR2xvYmFsVmFsdWUqIEdWLCB2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRDb2RlRW1pdHRlciAmSkNFKSB7CisjaWYgZGVmaW5lZCAoWDg2XzY0X0pJVCkKKyAgY29uc3QgdW5zaWduZWQgQWxpZ25tZW50ID0gODsKKyAgdWludDhfdCBCdWZmZXJbOF07CisgIHVpbnQ4X3QgKkN1ciA9IEJ1ZmZlcjsKKyAgTWFjaGluZUNvZGVFbWl0dGVyOjplbWl0V29yZExFSW50byhDdXIsICh1bnNpZ25lZCkoaW50cHRyX3QpcHRyKTsKKyAgTWFjaGluZUNvZGVFbWl0dGVyOjplbWl0V29yZExFSW50byhDdXIsICh1bnNpZ25lZCkoKChpbnRwdHJfdClwdHIpID4+IDMyKSk7CisjZWxzZQorICBjb25zdCB1bnNpZ25lZCBBbGlnbm1lbnQgPSA0OworICB1aW50OF90IEJ1ZmZlcls0XTsKKyAgdWludDhfdCAqQ3VyID0gQnVmZmVyOworICBNYWNoaW5lQ29kZUVtaXR0ZXI6OmVtaXRXb3JkTEVJbnRvKEN1ciwgKGludHB0cl90KXB0cik7CisjZW5kaWYKKyAgcmV0dXJuIEpDRS5hbGxvY0luZGlyZWN0R1YoR1YsIEJ1ZmZlciwgc2l6ZW9mKEJ1ZmZlciksIEFsaWdubWVudCk7Cit9CisKK1RhcmdldEpJVEluZm86OlN0dWJMYXlvdXQgWDg2SklUSW5mbzo6Z2V0U3R1YkxheW91dCgpIHsKKyAgLy8gVGhlIDY0LWJpdCBzdHViIGNvbnRhaW5zOgorICAvLyAgIG1vdmFicyByMTAgPC0gOC1ieXRlLXRhcmdldC1hZGRyZXNzICAjIDEwIGJ5dGVzCisgIC8vICAgY2FsbHxqbXAgKnIxMCAgIyAzIGJ5dGVzCisgIC8vIFRoZSAzMi1iaXQgc3R1YiBjb250YWlucyBhIDUtYnl0ZSBjYWxsfGptcC4KKyAgLy8gSWYgdGhlIHN0dWIgaXMgYSBjYWxsIHRvIHRoZSBjb21waWxhdGlvbiBjYWxsYmFjaywgYW4gZXh0cmEgYnl0ZSBpcyBhZGRlZAorICAvLyB0byBtYXJrIGl0IGFzIGEgc3R1Yi4KKyAgU3R1YkxheW91dCBSZXN1bHQgPSB7MTQsIDR9OworICByZXR1cm4gUmVzdWx0OworfQorCit2b2lkICpYODZKSVRJbmZvOjplbWl0RnVuY3Rpb25TdHViKGNvbnN0IEZ1bmN0aW9uKiBGLCB2b2lkICpUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpIHsKKyAgLy8gTm90ZSwgd2UgY2FzdCB0byBpbnRwdHJfdCBoZXJlIHRvIHNpbGVuY2UgYSAtcGVkYW50aWMgd2FybmluZyB0aGF0IAorICAvLyBjb21wbGFpbnMgYWJvdXQgY2FzdGluZyBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYSBub3JtYWwgcG9pbnRlci4KKyNpZiBkZWZpbmVkIChYODZfMzJfSklUKSAmJiAhZGVmaW5lZCAoX01TQ19WRVIpCisgIGJvb2wgTm90Q0MgPSAoVGFyZ2V0ICE9ICh2b2lkKikoaW50cHRyX3QpWDg2Q29tcGlsYXRpb25DYWxsYmFjayAmJgorICAgICAgICAgICAgICAgIFRhcmdldCAhPSAodm9pZCopKGludHB0cl90KVg4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfU1NFKTsKKyNlbHNlCisgIGJvb2wgTm90Q0MgPSBUYXJnZXQgIT0gKHZvaWQqKShpbnRwdHJfdClYODZDb21waWxhdGlvbkNhbGxiYWNrOworI2VuZGlmCisgIEpDRS5lbWl0QWxpZ25tZW50KDQpOworICB2b2lkICpSZXN1bHQgPSAodm9pZCopSkNFLmdldEN1cnJlbnRQQ1ZhbHVlKCk7CisgIGlmIChOb3RDQykgeworI2lmIGRlZmluZWQgKFg4Nl82NF9KSVQpCisgICAgSkNFLmVtaXRCeXRlKDB4NDkpOyAgICAgICAgICAvLyBSRVggcHJlZml4CisgICAgSkNFLmVtaXRCeXRlKDB4QjgrMik7ICAgICAgICAvLyBtb3ZhYnNxIHIxMAorICAgIEpDRS5lbWl0V29yZExFKCh1bnNpZ25lZCkoaW50cHRyX3QpVGFyZ2V0KTsKKyAgICBKQ0UuZW1pdFdvcmRMRSgodW5zaWduZWQpKCgoaW50cHRyX3QpVGFyZ2V0KSA+PiAzMikpOworICAgIEpDRS5lbWl0Qnl0ZSgweDQxKTsgICAgICAgICAgLy8gUkVYIHByZWZpeAorICAgIEpDRS5lbWl0Qnl0ZSgweEZGKTsgICAgICAgICAgLy8gam1wcSAqcjEwCisgICAgSkNFLmVtaXRCeXRlKDIgfCAoNCA8PCAzKSB8ICgzIDw8IDYpKTsKKyNlbHNlCisgICAgSkNFLmVtaXRCeXRlKDB4RTkpOworICAgIEpDRS5lbWl0V29yZExFKChpbnRwdHJfdClUYXJnZXQtSkNFLmdldEN1cnJlbnRQQ1ZhbHVlKCktNCk7CisjZW5kaWYKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyNpZiBkZWZpbmVkIChYODZfNjRfSklUKQorICBKQ0UuZW1pdEJ5dGUoMHg0OSk7ICAgICAgICAgIC8vIFJFWCBwcmVmaXgKKyAgSkNFLmVtaXRCeXRlKDB4QjgrMik7ICAgICAgICAvLyBtb3ZhYnNxIHIxMAorICBKQ0UuZW1pdFdvcmRMRSgodW5zaWduZWQpKGludHB0cl90KVRhcmdldCk7CisgIEpDRS5lbWl0V29yZExFKCh1bnNpZ25lZCkoKChpbnRwdHJfdClUYXJnZXQpID4+IDMyKSk7CisgIEpDRS5lbWl0Qnl0ZSgweDQxKTsgICAgICAgICAgLy8gUkVYIHByZWZpeAorICBKQ0UuZW1pdEJ5dGUoMHhGRik7ICAgICAgICAgIC8vIGNhbGxxICpyMTAKKyAgSkNFLmVtaXRCeXRlKDIgfCAoMiA8PCAzKSB8ICgzIDw8IDYpKTsKKyNlbHNlCisgIEpDRS5lbWl0Qnl0ZSgweEU4KTsgICAvLyBDYWxsIHdpdGggMzIgYml0IHBjLXJlbCBkZXN0aW5hdGlvbi4uLgorCisgIEpDRS5lbWl0V29yZExFKChpbnRwdHJfdClUYXJnZXQtSkNFLmdldEN1cnJlbnRQQ1ZhbHVlKCktNCk7CisjZW5kaWYKKworICAvLyBUaGlzIHVzZWQgdG8gdXNlIDB4Q0QsIGJ1dCB0aGF0IHZhbHVlIGlzIHVzZWQgYnkgSklUTWVtb3J5TWFuYWdlciB0bworICAvLyBpbml0aWFsaXplIHRoZSBidWZmZXIgd2l0aCBnYXJiYWdlLCB3aGljaCBtZWFucyBpdCBtYXkgZm9sbG93IGEKKyAgLy8gbm9yZXR1cm4gZnVuY3Rpb24gY2FsbCwgY29uZnVzaW5nIFg4NkNvbXBpbGF0aW9uQ2FsbGJhY2syLiAgUFIgNDkyOS4KKyAgSkNFLmVtaXRCeXRlKDB4Q0UpOyAgIC8vIEludGVycnVwdCAtIEp1c3QgYSBtYXJrZXIgaWRlbnRpZnlpbmcgdGhlIHN0dWIhCisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBnZXRQSUNKdW1wVGFibGVFbnRyeSAtIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBqdW1wdGFibGUgZW50cnkgZm9yIHRoZQorLy8vIHNwZWNpZmljIGJhc2ljIGJsb2NrLgordWludHB0cl90IFg4NkpJVEluZm86OmdldFBJQ0p1bXBUYWJsZUVudHJ5KHVpbnRwdHJfdCBCQiwgdWludHB0cl90IEVudHJ5KSB7CisjaWYgZGVmaW5lZChYODZfNjRfSklUKQorICByZXR1cm4gQkIgLSBFbnRyeTsKKyNlbHNlCisgIHJldHVybiBCQiAtIFBJQ0Jhc2U7CisjZW5kaWYKK30KKworLy8vIHJlbG9jYXRlIC0gQmVmb3JlIHRoZSBKSVQgY2FuIHJ1biBhIGJsb2NrIG9mIGNvZGUgdGhhdCBoYXMgYmVlbiBlbWl0dGVkLAorLy8vIGl0IG11c3QgcmV3cml0ZSB0aGUgY29kZSB0byBjb250YWluIHRoZSBhY3R1YWwgYWRkcmVzc2VzIG9mIGFueQorLy8vIHJlZmVyZW5jZWQgZ2xvYmFsIHN5bWJvbHMuCit2b2lkIFg4NkpJVEluZm86OnJlbG9jYXRlKHZvaWQgKkZ1bmN0aW9uLCBNYWNoaW5lUmVsb2NhdGlvbiAqTVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlbG9jcywgdW5zaWduZWQgY2hhciogR09UQmFzZSkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVJlbG9jczsgKytpLCArK01SKSB7CisgICAgdm9pZCAqUmVsb2NQb3MgPSAoY2hhciopRnVuY3Rpb24gKyBNUi0+Z2V0TWFjaGluZUNvZGVPZmZzZXQoKTsKKyAgICBpbnRwdHJfdCBSZXN1bHRQdHIgPSAoaW50cHRyX3QpTVItPmdldFJlc3VsdFBvaW50ZXIoKTsKKyAgICBzd2l0Y2ggKChYODY6OlJlbG9jYXRpb25UeXBlKU1SLT5nZXRSZWxvY2F0aW9uVHlwZSgpKSB7CisgICAgY2FzZSBYODY6OnJlbG9jX3BjcmVsX3dvcmQ6IHsKKyAgICAgIC8vIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24sIGFkZCB0aGUgcmVsb2NhdGVkIHZhbHVlIHRvIHRoZSB2YWx1ZSBhbHJlYWR5IGluCisgICAgICAvLyBtZW1vcnksIGFmdGVyIHdlIGFkanVzdCBpdCBmb3Igd2hlcmUgdGhlIFBDIGlzLgorICAgICAgUmVzdWx0UHRyID0gUmVzdWx0UHRyIC0oaW50cHRyX3QpUmVsb2NQb3MgLSA0IC0gTVItPmdldENvbnN0YW50VmFsKCk7CisgICAgICAqKCh1bnNpZ25lZCopUmVsb2NQb3MpICs9ICh1bnNpZ25lZClSZXN1bHRQdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYODY6OnJlbG9jX3BpY3JlbF93b3JkOiB7CisgICAgICAvLyBQSUMgYmFzZSByZWxhdGl2ZSByZWxvY2F0aW9uLCBhZGQgdGhlIHJlbG9jYXRlZCB2YWx1ZSB0byB0aGUgdmFsdWUKKyAgICAgIC8vIGFscmVhZHkgaW4gbWVtb3J5LCBhZnRlciB3ZSBhZGp1c3QgaXQgZm9yIHdoZXJlIHRoZSBQSUMgYmFzZSBpcy4KKyAgICAgIFJlc3VsdFB0ciA9IFJlc3VsdFB0ciAtICgoaW50cHRyX3QpRnVuY3Rpb24gKyBNUi0+Z2V0Q29uc3RhbnRWYWwoKSk7CisgICAgICAqKCh1bnNpZ25lZCopUmVsb2NQb3MpICs9ICh1bnNpZ25lZClSZXN1bHRQdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYODY6OnJlbG9jX2Fic29sdXRlX3dvcmQ6CisgICAgY2FzZSBYODY6OnJlbG9jX2Fic29sdXRlX3dvcmRfc2V4dDoKKyAgICAgIC8vIEFic29sdXRlIHJlbG9jYXRpb24sIGp1c3QgYWRkIHRoZSByZWxvY2F0ZWQgdmFsdWUgdG8gdGhlIHZhbHVlIGFscmVhZHkKKyAgICAgIC8vIGluIG1lbW9yeS4KKyAgICAgICooKHVuc2lnbmVkKilSZWxvY1BvcykgKz0gKHVuc2lnbmVkKVJlc3VsdFB0cjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWDg2OjpyZWxvY19hYnNvbHV0ZV9kd29yZDoKKyAgICAgICooKGludHB0cl90KilSZWxvY1BvcykgKz0gUmVzdWx0UHRyOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK2NoYXIqIFg4NkpJVEluZm86OmFsbG9jYXRlVGhyZWFkTG9jYWxNZW1vcnkoc2l6ZV90IHNpemUpIHsKKyNpZiBkZWZpbmVkKFg4Nl8zMl9KSVQpICYmICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX01TQ19WRVIpCisgIFRMU09mZnNldCAtPSBzaXplOworICByZXR1cm4gVExTT2Zmc2V0OworI2Vsc2UKKyAgbGx2bV91bnJlYWNoYWJsZSgiQ2Fubm90IGFsbG9jYXRlIHRocmVhZCBsb2NhbCBzdG9yYWdlIG9uIHRoaXMgYXJjaCEiKTsKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkpJVEluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NkpJVEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzg0MjBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2SklUSW5mby5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LSBYODZKSVRJbmZvLmggLSBYODYgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpJVCBpbnRlcmZhY2UgIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBYODYgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEpJVEluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBYODZKSVRJTkZPX0gKKyNkZWZpbmUgWDg2SklUSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0pJVENvZGVFbWl0dGVyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SklUSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFg4NlRhcmdldE1hY2hpbmU7CisgIGNsYXNzIFg4NlN1YnRhcmdldDsKKworICBjbGFzcyBYODZKSVRJbmZvIDogcHVibGljIFRhcmdldEpJVEluZm8geworICAgIFg4NlRhcmdldE1hY2hpbmUgJlRNOworICAgIGNvbnN0IFg4NlN1YnRhcmdldCAqU3VidGFyZ2V0OworICAgIHVpbnRwdHJfdCBQSUNCYXNlOworICAgIGNoYXIqIFRMU09mZnNldDsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFg4NkpJVEluZm8oWDg2VGFyZ2V0TWFjaGluZSAmdG0pOworCisgICAgLy8vIHJlcGxhY2VNYWNoaW5lQ29kZUZvckZ1bmN0aW9uIC0gTWFrZSBpdCBzbyB0aGF0IGNhbGxpbmcgdGhlIGZ1bmN0aW9uCisgICAgLy8vIHdob3NlIG1hY2hpbmUgY29kZSBpcyBhdCBPTEQgdHVybnMgaW50byBhIGNhbGwgdG8gTkVXLCBwZXJoYXBzIGJ5CisgICAgLy8vIG92ZXJ3cml0aW5nIE9MRCB3aXRoIGEgYnJhbmNoIHRvIE5FVy4gIFRoaXMgaXMgdXNlZCBmb3Igc2VsZi1tb2RpZnlpbmcKKyAgICAvLy8gY29kZS4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgcmVwbGFjZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24odm9pZCAqT2xkLCB2b2lkICpOZXcpOworCisgICAgLy8vIGVtaXRHbG9iYWxWYWx1ZUluZGlyZWN0U3ltIC0gVXNlIHRoZSBzcGVjaWZpZWQgSklUQ29kZUVtaXR0ZXIgb2JqZWN0CisgICAgLy8vIHRvIGVtaXQgYW4gaW5kaXJlY3Qgc3ltYm9sIHdoaWNoIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gcHRyLgorICAgIHZpcnR1YWwgdm9pZCAqZW1pdEdsb2JhbFZhbHVlSW5kaXJlY3RTeW0oY29uc3QgR2xvYmFsVmFsdWUqIEdWLCB2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRDb2RlRW1pdHRlciAmSkNFKTsKKworICAgIC8vIGdldFN0dWJMYXlvdXQgLSBSZXR1cm5zIHRoZSBzaXplIGFuZCBhbGlnbm1lbnQgb2YgdGhlIGxhcmdlc3QgY2FsbCBzdHViCisgICAgLy8gb24gWDg2LgorICAgIHZpcnR1YWwgU3R1YkxheW91dCBnZXRTdHViTGF5b3V0KCk7CisKKyAgICAvLy8gZW1pdEZ1bmN0aW9uU3R1YiAtIFVzZSB0aGUgc3BlY2lmaWVkIEpJVENvZGVFbWl0dGVyIG9iamVjdCB0byBlbWl0IGEKKyAgICAvLy8gc21hbGwgbmF0aXZlIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGNhbGxzIHRoZSBmdW5jdGlvbiBhdCB0aGUgc3BlY2lmaWVkCisgICAgLy8vIGFkZHJlc3MuCisgICAgdmlydHVhbCB2b2lkICplbWl0RnVuY3Rpb25TdHViKGNvbnN0IEZ1bmN0aW9uKiBGLCB2b2lkICpUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpOworCisgICAgLy8vIGdldFBJQ0p1bXBUYWJsZUVudHJ5IC0gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGp1bXB0YWJsZSBlbnRyeSBmb3IgdGhlCisgICAgLy8vIHNwZWNpZmljIGJhc2ljIGJsb2NrLgorICAgIHZpcnR1YWwgdWludHB0cl90IGdldFBJQ0p1bXBUYWJsZUVudHJ5KHVpbnRwdHJfdCBCQiwgdWludHB0cl90IEpUQmFzZSk7CisKKyAgICAvLy8gZ2V0TGF6eVJlc29sdmVyRnVuY3Rpb24gLSBFeHBvc2UgdGhlIGxhenkgcmVzb2x2ZXIgdG8gdGhlIEpJVC4KKyAgICB2aXJ0dWFsIExhenlSZXNvbHZlckZuIGdldExhenlSZXNvbHZlckZ1bmN0aW9uKEpJVENvbXBpbGVyRm4pOworCisgICAgLy8vIHJlbG9jYXRlIC0gQmVmb3JlIHRoZSBKSVQgY2FuIHJ1biBhIGJsb2NrIG9mIGNvZGUgdGhhdCBoYXMgYmVlbiBlbWl0dGVkLAorICAgIC8vLyBpdCBtdXN0IHJld3JpdGUgdGhlIGNvZGUgdG8gY29udGFpbiB0aGUgYWN0dWFsIGFkZHJlc3NlcyBvZiBhbnkKKyAgICAvLy8gcmVmZXJlbmNlZCBnbG9iYWwgc3ltYm9scy4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsb2NhdGUodm9pZCAqRnVuY3Rpb24sIE1hY2hpbmVSZWxvY2F0aW9uICpNUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVsb2NzLCB1bnNpZ25lZCBjaGFyKiBHT1RCYXNlKTsKKyAgICAKKyAgICAvLy8gYWxsb2NhdGVUaHJlYWRMb2NhbE1lbW9yeSAtIEVhY2ggdGFyZ2V0IGhhcyBpdHMgb3duIHdheSBvZgorICAgIC8vLyBoYW5kbGluZyB0aHJlYWQgbG9jYWwgdmFyaWFibGVzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgdmFsdWUgb25seQorICAgIC8vLyBtZWFuaW5nZnVsIHRvIHRoZSB0YXJnZXQuCisgICAgdmlydHVhbCBjaGFyKiBhbGxvY2F0ZVRocmVhZExvY2FsTWVtb3J5KHNpemVfdCBzaXplKTsKKworICAgIC8vLyBzZXRQSUNCYXNlIC8gZ2V0UElDQmFzZSAtIEdldHRlciAvIHNldHRlciBvZiBQSUNCYXNlLCB1c2VkIHRvIGNvbXB1dGUKKyAgICAvLy8gUElDIGp1bXB0YWJsZSBlbnRyeS4KKyAgICB2b2lkIHNldFBJQ0Jhc2UodWludHB0cl90IEJhc2UpIHsgUElDQmFzZSA9IEJhc2U7IH0KKyAgICB1aW50cHRyX3QgZ2V0UElDQmFzZSgpIGNvbnN0IHsgcmV0dXJuIFBJQ0Jhc2U7IH0KKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZNQ0FzbUluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2TUNBc21JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg3MjBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2TUNBc21JbmZvLmNwcApAQCAtMCwwICsxLDExMCBAQAorLy89PT0tLSBYODZNQ0FzbUluZm8uY3BwIC0gWDg2IGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiB0aGUgWDg2TUNBc21JbmZvIHByb3BlcnRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlg4Nk1DQXNtSW5mby5oIgorI2luY2x1ZGUgIlg4NlRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uRUxGLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworZW51bSBBc21Xcml0ZXJGbGF2b3JUeSB7CisgIC8vIE5vdGU6IFRoaXMgbnVtYmVyaW5nIGhhcyB0byBtYXRjaCB0aGUgR0NDIGFzc2VtYmxlciBkaWFsZWN0cyBmb3IgaW5saW5lCisgIC8vIGFzbSBhbHRlcm5hdGl2ZXMgdG8gd29yayByaWdodC4KKyAgQVRUID0gMCwgSW50ZWwgPSAxCit9OworCitzdGF0aWMgY2w6Om9wdDxBc21Xcml0ZXJGbGF2b3JUeT4KK0FzbVdyaXRlckZsYXZvcigieDg2LWFzbS1zeW50YXgiLCBjbDo6aW5pdChBVFQpLAorICBjbDo6ZGVzYygiQ2hvb3NlIHN0eWxlIG9mIGNvZGUgdG8gZW1pdCBmcm9tIFg4NiBiYWNrZW5kOiIpLAorICBjbDo6dmFsdWVzKGNsRW51bVZhbE4oQVRULCAgICJhdHQiLCAgICJFbWl0IEFUJlQtc3R5bGUgYXNzZW1ibHkiKSwKKyAgICAgICAgICAgICBjbEVudW1WYWxOKEludGVsLCAiaW50ZWwiLCAiRW1pdCBJbnRlbC1zdHlsZSBhc3NlbWJseSIpLAorICAgICAgICAgICAgIGNsRW51bVZhbEVuZCkpOworCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB4ODZfYXNtX3RhYmxlW10gPSB7CisgICJ7c2l9IiwgIlMiLAorICAie2RpfSIsICJEIiwKKyAgIntheH0iLCAiYSIsCisgICJ7Y3h9IiwgImMiLAorICAie21lbW9yeX0iLCAibWVtb3J5IiwKKyAgIntmbGFnc30iLCAiIiwKKyAgIntkaXJmbGFnfSIsICIiLAorICAie2Zwc3J9IiwgIiIsCisgICJ7Y2N9IiwgImNjIiwKKyAgMCwwfTsKKworWDg2TUNBc21JbmZvRGFyd2luOjpYODZNQ0FzbUluZm9EYXJ3aW4oY29uc3QgVHJpcGxlICZUcmlwbGUpIHsKKyAgQXNtVHJhbnNDQkUgPSB4ODZfYXNtX3RhYmxlOworICBBc3NlbWJsZXJEaWFsZWN0ID0gQXNtV3JpdGVyRmxhdm9yOworICAgIAorICBib29sIGlzNjRCaXQgPSBUcmlwbGUuZ2V0QXJjaCgpID09IFRyaXBsZTo6eDg2XzY0OworCisgIFRleHRBbGlnbkZpbGxWYWx1ZSA9IDB4OTA7CisKKyAgaWYgKCFpczY0Qml0KQorICAgIERhdGE2NGJpdHNEaXJlY3RpdmUgPSAwOyAgICAgICAvLyB3ZSBjYW4ndCBlbWl0IGEgNjQtYml0IHVuaXQKKworICAvLyBVc2UgIyMgYXMgYSBjb21tZW50IHN0cmluZyBzbyB0aGF0IC5zIGZpbGVzIGdlbmVyYXRlZCBieSBsbHZtIGNhbiBnbworICAvLyB0aHJvdWdoIHRoZSBHQ0MgcHJlcHJvY2Vzc29yIHdpdGhvdXQgY2F1c2luZyBhbiBlcnJvci4gIFRoaXMgaXMgbmVlZGVkCisgIC8vIGJlY2F1c2UgImNsYW5nIGZvby5zIiBydW5zIHRoZSBDIHByZXByb2Nlc3Nvciwgd2hpY2ggaXMgdXN1YWxseSByZXNlcnZlZAorICAvLyBmb3IgLlMgZmlsZXMgb24gb3RoZXIgc3lzdGVtcy4gIFBlcmhhcHMgdGhpcyBpcyBiZWNhdXNlIHRoZSBmaWxlIHN5c3RlbQorICAvLyB3YXNuJ3QgYWx3YXlzIGNhc2UgcHJlc2VydmluZyBvciBzb21ldGhpbmcuCisgIENvbW1lbnRTdHJpbmcgPSAiIyMiOworICBQQ1N5bWJvbCA9ICIuIjsKKworICBTdXBwb3J0c0RlYnVnSW5mb3JtYXRpb24gPSB0cnVlOworICBEd2FyZlVzZXNJbmxpbmVJbmZvU2VjdGlvbiA9IHRydWU7CisKKyAgLy8gRXhjZXB0aW9ucyBoYW5kbGluZworICBFeGNlcHRpb25zVHlwZSA9IEV4Y2VwdGlvbkhhbmRsaW5nOjpEd2FyZjsKK30KKworWDg2RUxGTUNBc21JbmZvOjpYODZFTEZNQ0FzbUluZm8oY29uc3QgVHJpcGxlICZUKSB7CisgIEFzbVRyYW5zQ0JFID0geDg2X2FzbV90YWJsZTsKKyAgQXNzZW1ibGVyRGlhbGVjdCA9IEFzbVdyaXRlckZsYXZvcjsKKworICBUZXh0QWxpZ25GaWxsVmFsdWUgPSAweDkwOworCisgIFByaXZhdGVHbG9iYWxQcmVmaXggPSAiLkwiOworICBXZWFrUmVmRGlyZWN0aXZlID0gIlx0LndlYWtcdCI7CisgIFBDU3ltYm9sID0gIi4iOworCisgIC8vIFNldCB1cCBEV0FSRiBkaXJlY3RpdmVzCisgIEhhc0xFQjEyOCA9IHRydWU7ICAvLyBUYXJnZXQgYXNtIHN1cHBvcnRzIGxlYjEyOCBkaXJlY3RpdmVzIChsaXR0bGUtZW5kaWFuKQorCisgIC8vIERlYnVnIEluZm9ybWF0aW9uCisgIFN1cHBvcnRzRGVidWdJbmZvcm1hdGlvbiA9IHRydWU7CisKKyAgLy8gRXhjZXB0aW9ucyBoYW5kbGluZworICBFeGNlcHRpb25zVHlwZSA9IEV4Y2VwdGlvbkhhbmRsaW5nOjpEd2FyZjsKKyAgCisgIC8vIE9wZW5CU0QgaGFzIGJ1Z2d5IHN1cHBvcnQgZm9yIC5xdWFkIGluIDMyLWJpdCBtb2RlLCBqdXN0IHNwbGl0IGludG8gdHdvCisgIC8vIC53b3Jkcy4KKyAgaWYgKFQuZ2V0T1MoKSA9PSBUcmlwbGU6Ok9wZW5CU0QgJiYgVC5nZXRBcmNoKCkgPT0gVHJpcGxlOjp4ODYpCisgICAgRGF0YTY0Yml0c0RpcmVjdGl2ZSA9IDA7Cit9CisKK2NvbnN0IE1DU2VjdGlvbiAqWDg2RUxGTUNBc21JbmZvOjoKK2dldE5vbmV4ZWN1dGFibGVTdGFja1NlY3Rpb24oTUNDb250ZXh0ICZDdHgpIGNvbnN0IHsKKyAgcmV0dXJuIEN0eC5nZXRFTEZTZWN0aW9uKCIubm90ZS5HTlUtc3RhY2siLCBNQ1NlY3Rpb25FTEY6OlNIVF9QUk9HQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFNlY3Rpb25LaW5kOjpnZXRNZXRhZGF0YSgpLCBmYWxzZSk7Cit9CisKK1g4Nk1DQXNtSW5mb0NPRkY6Olg4Nk1DQXNtSW5mb0NPRkYoY29uc3QgVHJpcGxlICZUcmlwbGUpIHsKKyAgQXNtVHJhbnNDQkUgPSB4ODZfYXNtX3RhYmxlOworICBBc3NlbWJsZXJEaWFsZWN0ID0gQXNtV3JpdGVyRmxhdm9yOworCisgIFRleHRBbGlnbkZpbGxWYWx1ZSA9IDB4OTA7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZNQ0FzbUluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nk1DQXNtSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTUyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZNQ0FzbUluZm8uaApAQCAtMCwwICsxLDM4IEBACisvLz09PT09LS0gWDg2TUNBc21JbmZvLmggLSBYODYgYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIFg4Nk1DQXNtSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFg4NlRBUkdFVEFTTUlORk9fSAorI2RlZmluZSBYODZUQVJHRVRBU01JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm9DT0ZGLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm9EYXJ3aW4uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBUcmlwbGU7CisKKyAgc3RydWN0IFg4Nk1DQXNtSW5mb0RhcndpbiA6IHB1YmxpYyBNQ0FzbUluZm9EYXJ3aW4geworICAgIGV4cGxpY2l0IFg4Nk1DQXNtSW5mb0Rhcndpbihjb25zdCBUcmlwbGUgJlRyaXBsZSk7CisgIH07CisKKyAgc3RydWN0IFg4NkVMRk1DQXNtSW5mbyA6IHB1YmxpYyBNQ0FzbUluZm8geworICAgIGV4cGxpY2l0IFg4NkVMRk1DQXNtSW5mbyhjb25zdCBUcmlwbGUgJlRyaXBsZSk7CisgICAgdmlydHVhbCBjb25zdCBNQ1NlY3Rpb24gKmdldE5vbmV4ZWN1dGFibGVTdGFja1NlY3Rpb24oTUNDb250ZXh0ICZDdHgpIGNvbnN0OworICB9OworCisgIHN0cnVjdCBYODZNQ0FzbUluZm9DT0ZGIDogcHVibGljIE1DQXNtSW5mb0NPRkYgeworICAgIGV4cGxpY2l0IFg4Nk1DQXNtSW5mb0NPRkYoY29uc3QgVHJpcGxlICZUcmlwbGUpOworICB9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nk1DQ29kZUVtaXR0ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2TUNDb2RlRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5ZmNlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4Nk1DQ29kZUVtaXR0ZXIuY3BwCkBAIC0wLDAgKzEsOTc0IEBACisvLz09PS0tIFg4Ni9YODZNQ0NvZGVFbWl0dGVyLmNwcCAtIENvbnZlcnQgWDg2IGNvZGUgdG8gbWFjaGluZSBjb2RlIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBYODZNQ0NvZGVFbWl0dGVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAieDg2LWVtaXR0ZXIiCisjaW5jbHVkZSAiWDg2LmgiCisjaW5jbHVkZSAiWDg2SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiWDg2Rml4dXBLaW5kcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb2RlRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworY2xhc3MgWDg2TUNDb2RlRW1pdHRlciA6IHB1YmxpYyBNQ0NvZGVFbWl0dGVyIHsKKyAgWDg2TUNDb2RlRW1pdHRlcihjb25zdCBYODZNQ0NvZGVFbWl0dGVyICYpOyAvLyBETyBOT1QgSU1QTEVNRU5UCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFg4Nk1DQ29kZUVtaXR0ZXIgJik7IC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE07CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJOworICBNQ0NvbnRleHQgJkN0eDsKKyAgYm9vbCBJczY0Qml0TW9kZTsKK3B1YmxpYzoKKyAgWDg2TUNDb2RlRW1pdHRlcihUYXJnZXRNYWNoaW5lICZ0bSwgTUNDb250ZXh0ICZjdHgsIGJvb2wgaXM2NEJpdCkKKyAgICA6IFRNKHRtKSwgVElJKCpUTS5nZXRJbnN0ckluZm8oKSksIEN0eChjdHgpIHsKKyAgICBJczY0Qml0TW9kZSA9IGlzNjRCaXQ7CisgIH0KKworICB+WDg2TUNDb2RlRW1pdHRlcigpIHt9CisKKyAgdW5zaWduZWQgZ2V0TnVtRml4dXBLaW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gNTsKKyAgfQorCisgIGNvbnN0IE1DRml4dXBLaW5kSW5mbyAmZ2V0Rml4dXBLaW5kSW5mbyhNQ0ZpeHVwS2luZCBLaW5kKSBjb25zdCB7CisgICAgY29uc3Qgc3RhdGljIE1DRml4dXBLaW5kSW5mbyBJbmZvc1tdID0geworICAgICAgeyAicmVsb2NfcGNyZWxfNGJ5dGUiLCAwLCA0ICogOCwgTUNGaXh1cEtpbmRJbmZvOjpGS0ZfSXNQQ1JlbCB9LAorICAgICAgeyAicmVsb2NfcGNyZWxfMWJ5dGUiLCAwLCAxICogOCwgTUNGaXh1cEtpbmRJbmZvOjpGS0ZfSXNQQ1JlbCB9LAorICAgICAgeyAicmVsb2NfcGNyZWxfMmJ5dGUiLCAwLCAyICogOCwgTUNGaXh1cEtpbmRJbmZvOjpGS0ZfSXNQQ1JlbCB9LAorICAgICAgeyAicmVsb2NfcmlwcmVsXzRieXRlIiwgMCwgNCAqIDgsIE1DRml4dXBLaW5kSW5mbzo6RktGX0lzUENSZWwgfSwKKyAgICAgIHsgInJlbG9jX3JpcHJlbF80Ynl0ZV9tb3ZxX2xvYWQiLCAwLCA0ICogOCwgTUNGaXh1cEtpbmRJbmZvOjpGS0ZfSXNQQ1JlbCB9CisgICAgfTsKKworICAgIGlmIChLaW5kIDwgRmlyc3RUYXJnZXRGaXh1cEtpbmQpCisgICAgICByZXR1cm4gTUNDb2RlRW1pdHRlcjo6Z2V0Rml4dXBLaW5kSW5mbyhLaW5kKTsKKworICAgIGFzc2VydCh1bnNpZ25lZChLaW5kIC0gRmlyc3RUYXJnZXRGaXh1cEtpbmQpIDwgZ2V0TnVtRml4dXBLaW5kcygpICYmCisgICAgICAgICAgICJJbnZhbGlkIGtpbmQhIik7CisgICAgcmV0dXJuIEluZm9zW0tpbmQgLSBGaXJzdFRhcmdldEZpeHVwS2luZF07CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgR2V0WDg2UmVnTnVtKGNvbnN0IE1DT3BlcmFuZCAmTU8pIHsKKyAgICByZXR1cm4gWDg2UmVnaXN0ZXJJbmZvOjpnZXRYODZSZWdOdW0oTU8uZ2V0UmVnKCkpOworICB9CisKKyAgLy8gT24gcmVndWxhciB4ODYsIGJvdGggWE1NMC1YTU03IGFuZCBYTU04LVhNTTE1IGFyZSBlbmNvZGVkIGluIHRoZSByYW5nZQorICAvLyAwLTcgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIDIgZ3JvdXBzIGlzIGdpdmVuIGJ5IHRoZSBSRVggcHJlZml4LgorICAvLyBJbiB0aGUgVkVYIHByZWZpeCwgcmVnaXN0ZXJzIGFyZSBzZWVuIHNlcXVlbmNpYWxseSBmcm9tIDAtMTUgYW5kIGVuY29kZWQKKyAgLy8gaW4gMSdzIGNvbXBsZW1lbnQgZm9ybSwgZXhhbXBsZToKKyAgLy8KKyAgLy8gIE1vZFJNIGZpZWxkID0+IFhNTTkgPT4gMQorICAvLyAgVkVYLlZWVlYgICAgPT4gWE1NOSA9PiB+OQorICAvLworICAvLyBTZWUgdGFibGUgNC0zNSBvZiBJbnRlbCBBVlggUHJvZ3JhbW1pbmcgUmVmZXJlbmNlIGZvciBkZXRhaWxzLgorICBzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRWRVhSZWdpc3RlckVuY29kaW5nKGNvbnN0IE1DSW5zdCAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BOdW0pIHsKKyAgICB1bnNpZ25lZCBTcmNSZWcgPSBNSS5nZXRPcGVyYW5kKE9wTnVtKS5nZXRSZWcoKTsKKyAgICB1bnNpZ25lZCBTcmNSZWdOdW0gPSBHZXRYODZSZWdOdW0oTUkuZ2V0T3BlcmFuZChPcE51bSkpOworICAgIGlmICgoU3JjUmVnID49IFg4Njo6WE1NOCAmJiBTcmNSZWcgPD0gWDg2OjpYTU0xNSkgfHwKKyAgICAgICAgKFNyY1JlZyA+PSBYODY6OllNTTggJiYgU3JjUmVnIDw9IFg4Njo6WU1NMTUpKQorICAgICAgU3JjUmVnTnVtICs9IDg7CisKKyAgICAvLyBUaGUgcmVnaXN0ZXJzIHJlcHJlc2VudGVkIHRocm91Z2ggVkVYX1ZWVlYgc2hvdWxkCisgICAgLy8gYmUgZW5jb2RlZCBpbiAxJ3MgY29tcGxlbWVudCBmb3JtLgorICAgIHJldHVybiAoflNyY1JlZ051bSkgJiAweGY7CisgIH0KKworICB2b2lkIEVtaXRCeXRlKHVuc2lnbmVkIGNoYXIgQywgdW5zaWduZWQgJkN1ckJ5dGUsIHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIE9TIDw8IChjaGFyKUM7CisgICAgKytDdXJCeXRlOworICB9CisKKyAgdm9pZCBFbWl0Q29uc3RhbnQodWludDY0X3QgVmFsLCB1bnNpZ25lZCBTaXplLCB1bnNpZ25lZCAmQ3VyQnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgLy8gT3V0cHV0IHRoZSBjb25zdGFudCBpbiBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBTaXplOyArK2kpIHsKKyAgICAgIEVtaXRCeXRlKFZhbCAmIDI1NSwgQ3VyQnl0ZSwgT1MpOworICAgICAgVmFsID4+PSA4OworICAgIH0KKyAgfQorCisgIHZvaWQgRW1pdEltbWVkaWF0ZShjb25zdCBNQ09wZXJhbmQgJkRpc3AsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbW1TaXplLCBNQ0ZpeHVwS2luZCBGaXh1cEtpbmQsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmQ3VyQnl0ZSwgcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1DRml4dXA+ICZGaXh1cHMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgSW1tT2Zmc2V0ID0gMCkgY29uc3Q7CisKKyAgaW5saW5lIHN0YXRpYyB1bnNpZ25lZCBjaGFyIE1vZFJNQnl0ZSh1bnNpZ25lZCBNb2QsIHVuc2lnbmVkIFJlZ09wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSTSkgeworICAgIGFzc2VydChNb2QgPCA0ICYmIFJlZ09wY29kZSA8IDggJiYgUk0gPCA4ICYmICJNb2RSTSBGaWVsZHMgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBSTSB8IChSZWdPcGNvZGUgPDwgMykgfCAoTW9kIDw8IDYpOworICB9CisKKyAgdm9pZCBFbWl0UmVnTW9kUk1CeXRlKGNvbnN0IE1DT3BlcmFuZCAmTW9kUk1SZWcsIHVuc2lnbmVkIFJlZ09wY29kZUZsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZDdXJCeXRlLCByYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICBFbWl0Qnl0ZShNb2RSTUJ5dGUoMywgUmVnT3Bjb2RlRmxkLCBHZXRYODZSZWdOdW0oTW9kUk1SZWcpKSwgQ3VyQnl0ZSwgT1MpOworICB9CisKKyAgdm9pZCBFbWl0U0lCQnl0ZSh1bnNpZ25lZCBTUywgdW5zaWduZWQgSW5kZXgsIHVuc2lnbmVkIEJhc2UsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkN1ckJ5dGUsIHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIC8vIFNJQiBieXRlIGlzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgTW9kUk1CeXRlLgorICAgIEVtaXRCeXRlKE1vZFJNQnl0ZShTUywgSW5kZXgsIEJhc2UpLCBDdXJCeXRlLCBPUyk7CisgIH0KKworCisgIHZvaWQgRW1pdE1lbU1vZFJNQnl0ZShjb25zdCBNQ0luc3QgJk1JLCB1bnNpZ25lZCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZ09wY29kZUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVFNGbGFncywgdW5zaWduZWQgJkN1ckJ5dGUsIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNQ0ZpeHVwPiAmRml4dXBzKSBjb25zdDsKKworICB2b2lkIEVuY29kZUluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAmTUksIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TUNGaXh1cD4gJkZpeHVwcykgY29uc3Q7CisKKyAgdm9pZCBFbWl0VkVYT3Bjb2RlUHJlZml4KHVpbnQ2NF90IFRTRmxhZ3MsIHVuc2lnbmVkICZDdXJCeXRlLCBpbnQgTWVtT3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdCAmTUksIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgdm9pZCBFbWl0U2VnbWVudE92ZXJyaWRlUHJlZml4KHVpbnQ2NF90IFRTRmxhZ3MsIHVuc2lnbmVkICZDdXJCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE1lbU9wZXJhbmQsIGNvbnN0IE1DSW5zdCAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIHZvaWQgRW1pdE9wY29kZVByZWZpeCh1aW50NjRfdCBUU0ZsYWdzLCB1bnNpZ25lZCAmQ3VyQnl0ZSwgaW50IE1lbU9wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3QgJk1JLCBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCisKK01DQ29kZUVtaXR0ZXIgKmxsdm06OmNyZWF0ZVg4Nl8zMk1DQ29kZUVtaXR0ZXIoY29uc3QgVGFyZ2V0ICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICByZXR1cm4gbmV3IFg4Nk1DQ29kZUVtaXR0ZXIoVE0sIEN0eCwgZmFsc2UpOworfQorCitNQ0NvZGVFbWl0dGVyICpsbHZtOjpjcmVhdGVYODZfNjRNQ0NvZGVFbWl0dGVyKGNvbnN0IFRhcmdldCAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgcmV0dXJuIG5ldyBYODZNQ0NvZGVFbWl0dGVyKFRNLCBDdHgsIHRydWUpOworfQorCisvLy8gaXNEaXNwOCAtIFJldHVybiB0cnVlIGlmIHRoaXMgc2lnbmVkIGRpc3BsYWNlbWVudCBmaXRzIGluIGEgOC1iaXQKKy8vLyBzaWduLWV4dGVuZGVkIGZpZWxkLgorc3RhdGljIGJvb2wgaXNEaXNwOChpbnQgVmFsdWUpIHsKKyAgcmV0dXJuIFZhbHVlID09IChzaWduZWQgY2hhcilWYWx1ZTsKK30KKworLy8vIGdldEltbUZpeHVwS2luZCAtIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgZml4dXAga2luZCB0byB1c2UgZm9yIGFuIGltbWVkaWF0ZQorLy8vIGluIGFuIGluc3RydWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBUU0ZsYWdzLgorc3RhdGljIE1DRml4dXBLaW5kIGdldEltbUZpeHVwS2luZCh1aW50NjRfdCBUU0ZsYWdzKSB7CisgIHVuc2lnbmVkIFNpemUgPSBYODZJSTo6Z2V0U2l6ZU9mSW1tKFRTRmxhZ3MpOworICBib29sIGlzUENSZWwgPSBYODZJSTo6aXNJbW1QQ1JlbChUU0ZsYWdzKTsKKworICBzd2l0Y2ggKFNpemUpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gaW1tZWRpYXRlIHNpemUiKTsKKyAgY2FzZSAxOiByZXR1cm4gaXNQQ1JlbCA/IE1DRml4dXBLaW5kKFg4Njo6cmVsb2NfcGNyZWxfMWJ5dGUpIDogRktfRGF0YV8xOworICBjYXNlIDI6IHJldHVybiBpc1BDUmVsID8gTUNGaXh1cEtpbmQoWDg2OjpyZWxvY19wY3JlbF8yYnl0ZSkgOiBGS19EYXRhXzI7CisgIGNhc2UgNDogcmV0dXJuIGlzUENSZWwgPyBNQ0ZpeHVwS2luZChYODY6OnJlbG9jX3BjcmVsXzRieXRlKSA6IEZLX0RhdGFfNDsKKyAgY2FzZSA4OiBhc3NlcnQoIWlzUENSZWwpOyByZXR1cm4gRktfRGF0YV84OworICB9Cit9CisKKwordm9pZCBYODZNQ0NvZGVFbWl0dGVyOjoKK0VtaXRJbW1lZGlhdGUoY29uc3QgTUNPcGVyYW5kICZEaXNwT3AsIHVuc2lnbmVkIFNpemUsIE1DRml4dXBLaW5kIEZpeHVwS2luZCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgJkN1ckJ5dGUsIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1DRml4dXA+ICZGaXh1cHMsIGludCBJbW1PZmZzZXQpIGNvbnN0IHsKKyAgLy8gSWYgdGhpcyBpcyBhIHNpbXBsZSBpbnRlZ2VyIGRpc3BsYWNlbWVudCB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhIHJlbG9jYXRpb24sCisgIC8vIGVtaXQgaXQgbm93LgorICBpZiAoRGlzcE9wLmlzSW1tKCkpIHsKKyAgICAvLyBGSVhNRTogaXMgdGhpcyByaWdodCBmb3IgcGMtcmVsIGVuY29kaW5nPz8gIFByb2JhYmx5IG5lZWQgdG8gZW1pdCB0aGlzIGFzCisgICAgLy8gYSBmaXh1cCBpZiBzby4KKyAgICBFbWl0Q29uc3RhbnQoRGlzcE9wLmdldEltbSgpK0ltbU9mZnNldCwgU2l6ZSwgQ3VyQnl0ZSwgT1MpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmIHdlIGhhdmUgYW4gaW1tb2Zmc2V0LCBhZGQgaXQgdG8gdGhlIGV4cHJlc3Npb24uCisgIGNvbnN0IE1DRXhwciAqRXhwciA9IERpc3BPcC5nZXRFeHByKCk7CisKKyAgLy8gSWYgdGhlIGZpeHVwIGlzIHBjLXJlbGF0aXZlLCB3ZSBuZWVkIHRvIGJpYXMgdGhlIHZhbHVlIHRvIGJlIHJlbGF0aXZlIHRvCisgIC8vIHRoZSBzdGFydCBvZiB0aGUgZmllbGQsIG5vdCB0aGUgZW5kIG9mIHRoZSBmaWVsZC4KKyAgaWYgKEZpeHVwS2luZCA9PSBNQ0ZpeHVwS2luZChYODY6OnJlbG9jX3BjcmVsXzRieXRlKSB8fAorICAgICAgRml4dXBLaW5kID09IE1DRml4dXBLaW5kKFg4Njo6cmVsb2NfcmlwcmVsXzRieXRlKSB8fAorICAgICAgRml4dXBLaW5kID09IE1DRml4dXBLaW5kKFg4Njo6cmVsb2NfcmlwcmVsXzRieXRlX21vdnFfbG9hZCkpCisgICAgSW1tT2Zmc2V0IC09IDQ7CisgIGlmIChGaXh1cEtpbmQgPT0gTUNGaXh1cEtpbmQoWDg2OjpyZWxvY19wY3JlbF8yYnl0ZSkpCisgICAgSW1tT2Zmc2V0IC09IDI7CisgIGlmIChGaXh1cEtpbmQgPT0gTUNGaXh1cEtpbmQoWDg2OjpyZWxvY19wY3JlbF8xYnl0ZSkpCisgICAgSW1tT2Zmc2V0IC09IDE7CisKKyAgaWYgKEltbU9mZnNldCkKKyAgICBFeHByID0gTUNCaW5hcnlFeHByOjpDcmVhdGVBZGQoRXhwciwgTUNDb25zdGFudEV4cHI6OkNyZWF0ZShJbW1PZmZzZXQsIEN0eCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCk7CisKKyAgLy8gRW1pdCBhIHN5bWJvbGljIGNvbnN0YW50IGFzIGEgZml4dXAgYW5kIDQgemVyb3MuCisgIEZpeHVwcy5wdXNoX2JhY2soTUNGaXh1cDo6Q3JlYXRlKEN1ckJ5dGUsIEV4cHIsIEZpeHVwS2luZCkpOworICBFbWl0Q29uc3RhbnQoMCwgU2l6ZSwgQ3VyQnl0ZSwgT1MpOworfQorCit2b2lkIFg4Nk1DQ29kZUVtaXR0ZXI6OkVtaXRNZW1Nb2RSTUJ5dGUoY29uc3QgTUNJbnN0ICZNSSwgdW5zaWduZWQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnT3Bjb2RlRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVFNGbGFncywgdW5zaWduZWQgJkN1ckJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNQ0ZpeHVwPiAmRml4dXBzKSBjb25zdHsKKyAgY29uc3QgTUNPcGVyYW5kICZEaXNwICAgICA9IE1JLmdldE9wZXJhbmQoT3ArMyk7CisgIGNvbnN0IE1DT3BlcmFuZCAmQmFzZSAgICAgPSBNSS5nZXRPcGVyYW5kKE9wKTsKKyAgY29uc3QgTUNPcGVyYW5kICZTY2FsZSAgICA9IE1JLmdldE9wZXJhbmQoT3ArMSk7CisgIGNvbnN0IE1DT3BlcmFuZCAmSW5kZXhSZWcgPSBNSS5nZXRPcGVyYW5kKE9wKzIpOworICB1bnNpZ25lZCBCYXNlUmVnID0gQmFzZS5nZXRSZWcoKTsKKworICAvLyBIYW5kbGUgJXJpcCByZWxhdGl2ZSBhZGRyZXNzaW5nLgorICBpZiAoQmFzZVJlZyA9PSBYODY6OlJJUCkgeyAgICAvLyBbZGlzcDMyK1JJUF0gaW4gWDg2LTY0IG1vZGUKKyAgICBhc3NlcnQoSXM2NEJpdE1vZGUgJiYgIlJpcC1yZWxhdGl2ZSBhZGRyZXNzaW5nIHJlcXVpcmVzIDY0LWJpdCBtb2RlIik7CisgICAgYXNzZXJ0KEluZGV4UmVnLmdldFJlZygpID09IDAgJiYgIkludmFsaWQgcmlwLXJlbGF0aXZlIGFkZHJlc3MiKTsKKyAgICBFbWl0Qnl0ZShNb2RSTUJ5dGUoMCwgUmVnT3Bjb2RlRmllbGQsIDUpLCBDdXJCeXRlLCBPUyk7CisKKyAgICB1bnNpZ25lZCBGaXh1cEtpbmQgPSBYODY6OnJlbG9jX3JpcHJlbF80Ynl0ZTsKKworICAgIC8vIG1vdnEgbG9hZHMgYXJlIGhhbmRsZWQgd2l0aCBhIHNwZWNpYWwgcmVsb2NhdGlvbiBmb3JtIHdoaWNoIGFsbG93cyB0aGUKKyAgICAvLyBsaW5rZXIgdG8gZWxpbWluYXRlIHNvbWUgbG9hZHMgZm9yIEdPVCByZWZlcmVuY2VzIHdoaWNoIGVuZCB1cCBpbiB0aGUKKyAgICAvLyBzYW1lIGxpbmthZ2UgdW5pdC4KKyAgICBpZiAoTUkuZ2V0T3Bjb2RlKCkgPT0gWDg2OjpNT1Y2NHJtIHx8CisgICAgICAgIE1JLmdldE9wY29kZSgpID09IFg4Njo6TU9WNjRybV9UQykKKyAgICAgIEZpeHVwS2luZCA9IFg4Njo6cmVsb2NfcmlwcmVsXzRieXRlX21vdnFfbG9hZDsKKworICAgIC8vIHJpcC1yZWxhdGl2ZSBhZGRyZXNzaW5nIGlzIGFjdHVhbGx5IHJlbGF0aXZlIHRvIHRoZSAqbmV4dCogaW5zdHJ1Y3Rpb24uCisgICAgLy8gU2luY2UgYW4gaW1tZWRpYXRlIGNhbiBmb2xsb3cgdGhlIG1vZC9ybSBieXRlIGZvciBhbiBpbnN0cnVjdGlvbiwgdGhpcworICAgIC8vIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBiaWFzIHRoZSBpbW1lZGlhdGUgZmllbGQgb2YgdGhlIGluc3RydWN0aW9uIHdpdGgKKyAgICAvLyB0aGUgc2l6ZSBvZiB0aGUgaW1tZWRpYXRlIGZpZWxkLiAgSWYgd2UgaGF2ZSB0aGlzIGNhc2UsIGFkZCBpdCBpbnRvIHRoZQorICAgIC8vIGV4cHJlc3Npb24gdG8gZW1pdC4KKyAgICBpbnQgSW1tU2l6ZSA9IFg4NklJOjpoYXNJbW0oVFNGbGFncykgPyBYODZJSTo6Z2V0U2l6ZU9mSW1tKFRTRmxhZ3MpIDogMDsKKworICAgIEVtaXRJbW1lZGlhdGUoRGlzcCwgNCwgTUNGaXh1cEtpbmQoRml4dXBLaW5kKSwKKyAgICAgICAgICAgICAgICAgIEN1ckJ5dGUsIE9TLCBGaXh1cHMsIC1JbW1TaXplKTsKKyAgICByZXR1cm47CisgIH0KKworICB1bnNpZ25lZCBCYXNlUmVnTm8gPSBCYXNlUmVnID8gR2V0WDg2UmVnTnVtKEJhc2UpIDogLTFVOworCisgIC8vIERldGVybWluZSB3aGV0aGVyIGEgU0lCIGJ5dGUgaXMgbmVlZGVkLgorICAvLyBJZiBubyBCYXNlUmVnLCBpc3N1ZSBhIFJJUCByZWxhdGl2ZSBpbnN0cnVjdGlvbiBvbmx5IGlmIHRoZSBNQ0UgY2FuCisgIC8vIHJlc29sdmUgYWRkcmVzc2VzIG9uLXRoZS1mbHksIG90aGVyd2lzZSB1c2UgU0lCIChJbnRlbCBNYW51YWwgMkEsIHRhYmxlCisgIC8vIDItNykgYW5kIGFic29sdXRlIHJlZmVyZW5jZXMuCisKKyAgaWYgKC8vIFRoZSBTSUIgYnl0ZSBtdXN0IGJlIHVzZWQgaWYgdGhlcmUgaXMgYW4gaW5kZXggcmVnaXN0ZXIuCisgICAgICBJbmRleFJlZy5nZXRSZWcoKSA9PSAwICYmCisgICAgICAvLyBUaGUgU0lCIGJ5dGUgbXVzdCBiZSB1c2VkIGlmIHRoZSBiYXNlIGlzIEVTUC9SU1AvUjEyLCBhbGwgb2Ygd2hpY2gKKyAgICAgIC8vIGVuY29kZSB0byBhbiBSL00gdmFsdWUgb2YgNCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgYSBTSUIgYnl0ZSBpcworICAgICAgLy8gcHJlc2VudC4KKyAgICAgIEJhc2VSZWdObyAhPSBOODY6OkVTUCAmJgorICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3RlciBhbmQgd2UncmUgaW4gNjQtYml0IG1vZGUsIHdlIG5lZWQgYSBTSUIKKyAgICAgIC8vIGJ5dGUgdG8gZW1pdCBhbiBhZGRyIHRoYXQgaXMganVzdCAnZGlzcDMyJyAodGhlIG5vbi1SSVAgcmVsYXRpdmUgZm9ybSkuCisgICAgICAoIUlzNjRCaXRNb2RlIHx8IEJhc2VSZWcgIT0gMCkpIHsKKworICAgIGlmIChCYXNlUmVnID09IDApIHsgICAgICAgICAgLy8gW2Rpc3AzMl0gICAgIGluIFg4Ni0zMiBtb2RlCisgICAgICBFbWl0Qnl0ZShNb2RSTUJ5dGUoMCwgUmVnT3Bjb2RlRmllbGQsIDUpLCBDdXJCeXRlLCBPUyk7CisgICAgICBFbWl0SW1tZWRpYXRlKERpc3AsIDQsIEZLX0RhdGFfNCwgQ3VyQnl0ZSwgT1MsIEZpeHVwcyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgdGhlIGJhc2UgaXMgbm90IEVCUC9FU1AgYW5kIHRoZXJlIGlzIG5vIGRpc3BsYWNlbWVudCwgdXNlIHNpbXBsZQorICAgIC8vIGluZGlyZWN0IHJlZ2lzdGVyIGVuY29kaW5nLCB0aGlzIGhhbmRsZXMgYWRkcmVzc2VzIGxpa2UgW0VBWF0uICBUaGUKKyAgICAvLyBlbmNvZGluZyBmb3IgW0VCUF0gd2l0aCBubyBkaXNwbGFjZW1lbnQgbWVhbnMgW2Rpc3AzMl0gc28gd2UgaGFuZGxlIGl0CisgICAgLy8gYnkgZW1pdHRpbmcgYSBkaXNwbGFjZW1lbnQgb2YgMCBiZWxvdy4KKyAgICBpZiAoRGlzcC5pc0ltbSgpICYmIERpc3AuZ2V0SW1tKCkgPT0gMCAmJiBCYXNlUmVnTm8gIT0gTjg2OjpFQlApIHsKKyAgICAgIEVtaXRCeXRlKE1vZFJNQnl0ZSgwLCBSZWdPcGNvZGVGaWVsZCwgQmFzZVJlZ05vKSwgQ3VyQnl0ZSwgT1MpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIGRpc3BsYWNlbWVudCBmaXRzIGluIGEgYnl0ZSwgZW5jb2RlIGFzIFtSRUcrZGlzcDhdLgorICAgIGlmIChEaXNwLmlzSW1tKCkgJiYgaXNEaXNwOChEaXNwLmdldEltbSgpKSkgeworICAgICAgRW1pdEJ5dGUoTW9kUk1CeXRlKDEsIFJlZ09wY29kZUZpZWxkLCBCYXNlUmVnTm8pLCBDdXJCeXRlLCBPUyk7CisgICAgICBFbWl0SW1tZWRpYXRlKERpc3AsIDEsIEZLX0RhdGFfMSwgQ3VyQnl0ZSwgT1MsIEZpeHVwcyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBlbWl0IHRoZSBtb3N0IGdlbmVyYWwgbm9uLVNJQiBlbmNvZGluZzogW1JFRytkaXNwMzJdCisgICAgRW1pdEJ5dGUoTW9kUk1CeXRlKDIsIFJlZ09wY29kZUZpZWxkLCBCYXNlUmVnTm8pLCBDdXJCeXRlLCBPUyk7CisgICAgRW1pdEltbWVkaWF0ZShEaXNwLCA0LCBGS19EYXRhXzQsIEN1ckJ5dGUsIE9TLCBGaXh1cHMpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFdlIG5lZWQgYSBTSUIgYnl0ZSwgc28gc3RhcnQgYnkgb3V0cHV0dGluZyB0aGUgTW9kUi9NIGJ5dGUgZmlyc3QKKyAgYXNzZXJ0KEluZGV4UmVnLmdldFJlZygpICE9IFg4Njo6RVNQICYmCisgICAgICAgICBJbmRleFJlZy5nZXRSZWcoKSAhPSBYODY6OlJTUCAmJiAiQ2Fubm90IHVzZSBFU1AgYXMgaW5kZXggcmVnISIpOworCisgIGJvb2wgRm9yY2VEaXNwMzIgPSBmYWxzZTsKKyAgYm9vbCBGb3JjZURpc3A4ICA9IGZhbHNlOworICBpZiAoQmFzZVJlZyA9PSAwKSB7CisgICAgLy8gSWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2UgZW1pdCB0aGUgc3BlY2lhbCBjYXNlIFNJQiBieXRlIHdpdGgKKyAgICAvLyBNT0Q9MCwgQkFTRT01LCB0byBKVVNUIGdldCB0aGUgaW5kZXgsIHNjYWxlLCBhbmQgZGlzcGxhY2VtZW50LgorICAgIEVtaXRCeXRlKE1vZFJNQnl0ZSgwLCBSZWdPcGNvZGVGaWVsZCwgNCksIEN1ckJ5dGUsIE9TKTsKKyAgICBGb3JjZURpc3AzMiA9IHRydWU7CisgIH0gZWxzZSBpZiAoIURpc3AuaXNJbW0oKSkgeworICAgIC8vIEVtaXQgdGhlIG5vcm1hbCBkaXNwMzIgZW5jb2RpbmcuCisgICAgRW1pdEJ5dGUoTW9kUk1CeXRlKDIsIFJlZ09wY29kZUZpZWxkLCA0KSwgQ3VyQnl0ZSwgT1MpOworICAgIEZvcmNlRGlzcDMyID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChEaXNwLmdldEltbSgpID09IDAgJiYKKyAgICAgICAgICAgICAvLyBCYXNlIHJlZyBjYW4ndCBiZSBhbnl0aGluZyB0aGF0IGVuZHMgdXAgd2l0aCAnNScgYXMgdGhlIGJhc2UKKyAgICAgICAgICAgICAvLyByZWcsIGl0IGlzIHRoZSBtYWdpYyBbKl0gbm9tZW5jbGF0dXJlIHRoYXQgaW5kaWNhdGVzIG5vIGJhc2UuCisgICAgICAgICAgICAgQmFzZVJlZ05vICE9IE44Njo6RUJQKSB7CisgICAgLy8gRW1pdCBubyBkaXNwbGFjZW1lbnQgTW9kUi9NIGJ5dGUKKyAgICBFbWl0Qnl0ZShNb2RSTUJ5dGUoMCwgUmVnT3Bjb2RlRmllbGQsIDQpLCBDdXJCeXRlLCBPUyk7CisgIH0gZWxzZSBpZiAoaXNEaXNwOChEaXNwLmdldEltbSgpKSkgeworICAgIC8vIEVtaXQgdGhlIGRpc3A4IGVuY29kaW5nLgorICAgIEVtaXRCeXRlKE1vZFJNQnl0ZSgxLCBSZWdPcGNvZGVGaWVsZCwgNCksIEN1ckJ5dGUsIE9TKTsKKyAgICBGb3JjZURpc3A4ID0gdHJ1ZTsgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0byBmb3JjZSA4IGJpdCBkaXNwIGlmIEJhc2U9RUJQCisgIH0gZWxzZSB7CisgICAgLy8gRW1pdCB0aGUgbm9ybWFsIGRpc3AzMiBlbmNvZGluZy4KKyAgICBFbWl0Qnl0ZShNb2RSTUJ5dGUoMiwgUmVnT3Bjb2RlRmllbGQsIDQpLCBDdXJCeXRlLCBPUyk7CisgIH0KKworICAvLyBDYWxjdWxhdGUgd2hhdCB0aGUgU1MgZmllbGQgdmFsdWUgc2hvdWxkIGJlLi4uCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTU1RhYmxlW10gPSB7IH4wLCAwLCAxLCB+MCwgMiwgfjAsIH4wLCB+MCwgMyB9OworICB1bnNpZ25lZCBTUyA9IFNTVGFibGVbU2NhbGUuZ2V0SW1tKCldOworCisgIGlmIChCYXNlUmVnID09IDApIHsKKyAgICAvLyBIYW5kbGUgdGhlIFNJQiBieXRlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBiYXNlLCBzZWUgSW50ZWwKKyAgICAvLyBNYW51YWwgMkEsIHRhYmxlIDItNy4gVGhlIGRpc3BsYWNlbWVudCBoYXMgYWxyZWFkeSBiZWVuIG91dHB1dC4KKyAgICB1bnNpZ25lZCBJbmRleFJlZ05vOworICAgIGlmIChJbmRleFJlZy5nZXRSZWcoKSkKKyAgICAgIEluZGV4UmVnTm8gPSBHZXRYODZSZWdOdW0oSW5kZXhSZWcpOworICAgIGVsc2UgLy8gRXhhbXBsZXM6IFtFU1ArMSo8bm9yZWc+KzRdIG9yIFtzY2FsZWQgaWR4XStkaXNwMzIgKE1PRD0wLEJBU0U9NSkKKyAgICAgIEluZGV4UmVnTm8gPSA0OworICAgIEVtaXRTSUJCeXRlKFNTLCBJbmRleFJlZ05vLCA1LCBDdXJCeXRlLCBPUyk7CisgIH0gZWxzZSB7CisgICAgdW5zaWduZWQgSW5kZXhSZWdObzsKKyAgICBpZiAoSW5kZXhSZWcuZ2V0UmVnKCkpCisgICAgICBJbmRleFJlZ05vID0gR2V0WDg2UmVnTnVtKEluZGV4UmVnKTsKKyAgICBlbHNlCisgICAgICBJbmRleFJlZ05vID0gNDsgICAvLyBGb3IgZXhhbXBsZSBbRVNQKzEqPG5vcmVnPis0XQorICAgIEVtaXRTSUJCeXRlKFNTLCBJbmRleFJlZ05vLCBHZXRYODZSZWdOdW0oQmFzZSksIEN1ckJ5dGUsIE9TKTsKKyAgfQorCisgIC8vIERvIHdlIG5lZWQgdG8gb3V0cHV0IGEgZGlzcGxhY2VtZW50PworICBpZiAoRm9yY2VEaXNwOCkKKyAgICBFbWl0SW1tZWRpYXRlKERpc3AsIDEsIEZLX0RhdGFfMSwgQ3VyQnl0ZSwgT1MsIEZpeHVwcyk7CisgIGVsc2UgaWYgKEZvcmNlRGlzcDMyIHx8IERpc3AuZ2V0SW1tKCkgIT0gMCkKKyAgICBFbWl0SW1tZWRpYXRlKERpc3AsIDQsIEZLX0RhdGFfNCwgQ3VyQnl0ZSwgT1MsIEZpeHVwcyk7Cit9CisKKy8vLyBFbWl0VkVYT3Bjb2RlUHJlZml4IC0gQVZYIGluc3RydWN0aW9ucyBhcmUgZW5jb2RlZCB1c2luZyBhIG9wY29kZSBwcmVmaXgKKy8vLyBjYWxsZWQgVkVYLgordm9pZCBYODZNQ0NvZGVFbWl0dGVyOjpFbWl0VkVYT3Bjb2RlUHJlZml4KHVpbnQ2NF90IFRTRmxhZ3MsIHVuc2lnbmVkICZDdXJCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBNZW1PcGVyYW5kLCBjb25zdCBNQ0luc3QgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgYm9vbCBIYXNWRVhfNFYgPSBmYWxzZTsKKyAgaWYgKFRTRmxhZ3MgJiBYODZJSTo6VkVYXzRWKQorICAgIEhhc1ZFWF80ViA9IHRydWU7CisKKyAgLy8gVkVYX1I6IG9wY29kZSBleHRlcm5zaW9uIGVxdWl2YWxlbnQgdG8gUkVYLlIgaW4KKyAgLy8gMSdzIGNvbXBsZW1lbnQgKGludmVydGVkKSBmb3JtCisgIC8vCisgIC8vICAxOiBTYW1lIGFzIFJFWF9SPTAgKG11c3QgYmUgMSBpbiAzMi1iaXQgbW9kZSkKKyAgLy8gIDA6IFNhbWUgYXMgUkVYX1I9MSAoNjQgYml0IG1vZGUgb25seSkKKyAgLy8KKyAgdW5zaWduZWQgY2hhciBWRVhfUiA9IDB4MTsKKworICAvLyBWRVhfWDogZXF1aXZhbGVudCB0byBSRVguWCwgb25seSB1c2VkIHdoZW4gYQorICAvLyByZWdpc3RlciBpcyB1c2VkIGZvciBpbmRleCBpbiBTSUIgQnl0ZS4KKyAgLy8KKyAgLy8gIDE6IFNhbWUgYXMgUkVYLlg9MCAobXVzdCBiZSAxIGluIDMyLWJpdCBtb2RlKQorICAvLyAgMDogU2FtZSBhcyBSRVguWD0xICg2NC1iaXQgbW9kZSBvbmx5KQorICB1bnNpZ25lZCBjaGFyIFZFWF9YID0gMHgxOworCisgIC8vIFZFWF9COgorICAvLworICAvLyAgMTogU2FtZSBhcyBSRVhfQj0wIChpZ25vcmVkIGluIDMyLWJpdCBtb2RlKQorICAvLyAgMDogU2FtZSBhcyBSRVhfQj0xICg2NCBiaXQgbW9kZSBvbmx5KQorICAvLworICB1bnNpZ25lZCBjaGFyIFZFWF9CID0gMHgxOworCisgIC8vIFZFWF9XOiBvcGNvZGUgc3BlY2lmaWMgKHVzZSBsaWtlIFJFWC5XLCBvciB1c2VkIGZvcgorICAvLyBvcGNvZGUgZXh0ZW5zaW9uLCBvciBpZ25vcmVkLCBkZXBlbmRpbmcgb24gdGhlIG9wY29kZSBieXRlKQorICB1bnNpZ25lZCBjaGFyIFZFWF9XID0gMDsKKworICAvLyBWRVhfNU0gKFZFWCBtLW1tbW1tIGZpZWxkKToKKyAgLy8KKyAgLy8gIDBiMDAwMDA6IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgIC8vICAwYjAwMDAxOiBpbXBsaWVkIDBGIGxlYWRpbmcgb3Bjb2RlCisgIC8vICAwYjAwMDEwOiBpbXBsaWVkIDBGIDM4IGxlYWRpbmcgb3Bjb2RlIGJ5dGVzCisgIC8vICAwYjAwMDExOiBpbXBsaWVkIDBGIDNBIGxlYWRpbmcgb3Bjb2RlIGJ5dGVzCisgIC8vICAwYjAwMTAwLTBiMTExMTE6IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgIC8vCisgIHVuc2lnbmVkIGNoYXIgVkVYXzVNID0gMHgxOworCisgIC8vIFZFWF80ViAoVkVYIHZ2dnYgZmllbGQpOiBhIHJlZ2lzdGVyIHNwZWNpZmllcgorICAvLyAoaW4gMSdzIGNvbXBsZW1lbnQgZm9ybSkgb3IgMTExMSBpZiB1bnVzZWQuCisgIHVuc2lnbmVkIGNoYXIgVkVYXzRWID0gMHhmOworCisgIC8vIFZFWF9MIChWZWN0b3IgTGVuZ3RoKToKKyAgLy8KKyAgLy8gIDA6IHNjYWxhciBvciAxMjgtYml0IHZlY3RvcgorICAvLyAgMTogMjU2LWJpdCB2ZWN0b3IKKyAgLy8KKyAgdW5zaWduZWQgY2hhciBWRVhfTCA9IDA7CisKKyAgLy8gVkVYX1BQOiBvcGNvZGUgZXh0ZW5zaW9uIHByb3ZpZGluZyBlcXVpdmFsZW50CisgIC8vIGZ1bmN0aW9uYWxpdHkgb2YgYSBTSU1EIHByZWZpeAorICAvLworICAvLyAgMGIwMDogTm9uZQorICAvLyAgMGIwMTogNjYKKyAgLy8gIDBiMTA6IEYzCisgIC8vICAwYjExOiBGMgorICAvLworICB1bnNpZ25lZCBjaGFyIFZFWF9QUCA9IDA7CisKKyAgLy8gRW5jb2RlIHRoZSBvcGVyYW5kIHNpemUgb3Bjb2RlIHByZWZpeCBhcyBuZWVkZWQuCisgIGlmIChUU0ZsYWdzICYgWDg2SUk6Ok9wU2l6ZSkKKyAgICBWRVhfUFAgPSAweDAxOworCisgIGlmIChUU0ZsYWdzICYgWDg2SUk6OlZFWF9XKQorICAgIFZFWF9XID0gMTsKKworICBpZiAoVFNGbGFncyAmIFg4NklJOjpWRVhfTCkKKyAgICBWRVhfTCA9IDE7CisKKyAgc3dpdGNoIChUU0ZsYWdzICYgWDg2SUk6Ok9wME1hc2spIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIkludmFsaWQgcHJlZml4ISIpOworICBjYXNlIFg4NklJOjpUODogIC8vIDBGIDM4CisgICAgVkVYXzVNID0gMHgyOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpUQTogIC8vIDBGIDNBCisgICAgVkVYXzVNID0gMHgzOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpURjogIC8vIEYyIDBGIDM4CisgICAgVkVYX1BQID0gMHgzOworICAgIFZFWF81TSA9IDB4MjsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6WFM6ICAvLyBGMyAwRgorICAgIFZFWF9QUCA9IDB4MjsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6WEQ6ICAvLyBGMiAwRgorICAgIFZFWF9QUCA9IDB4MzsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6VEI6ICAvLyBCeXBhc3M6IE5vdCB1c2VkIGJ5IFZFWAorICBjYXNlIDA6CisgICAgYnJlYWs7ICAvLyBObyBwcmVmaXghCisgIH0KKworICAvLyBTZXQgdGhlIHZlY3RvciBsZW5ndGggdG8gMjU2LWJpdCBpZiBZTU0wLVlNTTE1IGlzIHVzZWQKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNSS5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICBpZiAoIU1JLmdldE9wZXJhbmQoaSkuaXNSZWcoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHVuc2lnbmVkIFNyY1JlZyA9IE1JLmdldE9wZXJhbmQoaSkuZ2V0UmVnKCk7CisgICAgaWYgKFNyY1JlZyA+PSBYODY6OllNTTAgJiYgU3JjUmVnIDw9IFg4Njo6WU1NMTUpCisgICAgICBWRVhfTCA9IDE7CisgIH0KKworICB1bnNpZ25lZCBOdW1PcHMgPSBNSS5nZXROdW1PcGVyYW5kcygpOworICB1bnNpZ25lZCBDdXJPcCA9IDA7CisgIGJvb2wgSXNEZXN0TWVtID0gZmFsc2U7CisKKyAgc3dpdGNoIChUU0ZsYWdzICYgWDg2SUk6OkZvcm1NYXNrKSB7CisgIGNhc2UgWDg2SUk6Ok1STUluaXRSZWc6IGFzc2VydCgwICYmICJGSVhNRTogUmVtb3ZlIHRoaXMhIik7CisgIGNhc2UgWDg2SUk6Ok1STURlc3RNZW06CisgICAgSXNEZXN0TWVtID0gdHJ1ZTsKKyAgICAvLyBUaGUgaW1wb3J0YW50IGluZm8gZm9yIHRoZSBWRVggcHJlZml4IGlzIG5ldmVyIGJleW9uZCB0aGUgYWRkcmVzcworICAgIC8vIHJlZ2lzdGVycy4gRG9uJ3QgY2hlY2sgYmV5b25kIHRoYXQuCisgICAgTnVtT3BzID0gQ3VyT3AgPSBYODY6OkFkZHJOdW1PcGVyYW5kczsKKyAgY2FzZSBYODZJSTo6TVJNMG06IGNhc2UgWDg2SUk6Ok1STTFtOgorICBjYXNlIFg4NklJOjpNUk0ybTogY2FzZSBYODZJSTo6TVJNM206CisgIGNhc2UgWDg2SUk6Ok1STTRtOiBjYXNlIFg4NklJOjpNUk01bToKKyAgY2FzZSBYODZJSTo6TVJNNm06IGNhc2UgWDg2SUk6Ok1STTdtOgorICBjYXNlIFg4NklJOjpNUk1TcmNNZW06CisgIGNhc2UgWDg2SUk6Ok1STVNyY1JlZzoKKyAgICBpZiAoTUkuZ2V0TnVtT3BlcmFuZHMoKSA+IEN1ck9wICYmIE1JLmdldE9wZXJhbmQoQ3VyT3ApLmlzUmVnKCkgJiYKKyAgICAgICAgWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1JLmdldE9wZXJhbmQoQ3VyT3ApLmdldFJlZygpKSkKKyAgICAgIFZFWF9SID0gMHgwOworICAgIEN1ck9wKys7CisKKyAgICBpZiAoSGFzVkVYXzRWKSB7CisgICAgICBWRVhfNFYgPSBnZXRWRVhSZWdpc3RlckVuY29kaW5nKE1JLCBJc0Rlc3RNZW0gPyBDdXJPcC0xIDogQ3VyT3ApOworICAgICAgQ3VyT3ArKzsKKyAgICB9CisKKyAgICAvLyBUbyBvbmx5IGNoZWNrIG9wZXJhbmRzIGJlZm9yZSB0aGUgbWVtb3J5IGFkZHJlc3Mgb25lcywgc3RhcnQKKyAgICAvLyB0aGUgc2VhcmNoIGZyb20gdGhlIGJlZ2luaW5nCisgICAgaWYgKElzRGVzdE1lbSkKKyAgICAgIEN1ck9wID0gMDsKKworICAgIC8vIElmIHRoZSBsYXN0IHJlZ2lzdGVyIHNob3VsZCBiZSBlbmNvZGVkIGluIHRoZSBpbW1lZGlhdGUgZmllbGQKKyAgICAvLyBkbyBub3QgdXNlIGFueSBiaXQgZnJvbSBWRVggcHJlZml4IHRvIHRoaXMgcmVnaXN0ZXIsIGlnbm9yZSBpdAorICAgIGlmIChUU0ZsYWdzICYgWDg2SUk6OlZFWF9JOElNTSkKKyAgICAgIE51bU9wcy0tOworCisgICAgZm9yICg7IEN1ck9wICE9IE51bU9wczsgKytDdXJPcCkgeworICAgICAgY29uc3QgTUNPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoQ3VyT3ApOworICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1PLmdldFJlZygpKSkKKyAgICAgICAgVkVYX0IgPSAweDA7CisgICAgICBpZiAoIVZFWF9CICYmIE1PLmlzUmVnKCkgJiYKKyAgICAgICAgICAoKFRTRmxhZ3MgJiBYODZJSTo6Rm9ybU1hc2spID09IFg4NklJOjpNUk1TcmNNZW0pICYmCisgICAgICAgICAgWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1PLmdldFJlZygpKSkKKyAgICAgICAgVkVYX1ggPSAweDA7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OiAvLyBNUk1EZXN0UmVnLCBNUk0wci1NUk03ciwgUmF3RnJtCisgICAgaWYgKCFNSS5nZXROdW1PcGVyYW5kcygpKQorICAgICAgYnJlYWs7CisKKyAgICBpZiAoTUkuZ2V0T3BlcmFuZChDdXJPcCkuaXNSZWcoKSAmJgorICAgICAgICBYODZJbnN0ckluZm86OmlzWDg2XzY0RXh0ZW5kZWRSZWcoTUkuZ2V0T3BlcmFuZChDdXJPcCkuZ2V0UmVnKCkpKQorICAgICAgVkVYX0IgPSAwOworCisgICAgaWYgKEhhc1ZFWF80VikKKyAgICAgIFZFWF80ViA9IGdldFZFWFJlZ2lzdGVyRW5jb2RpbmcoTUksIEN1ck9wKTsKKworICAgIEN1ck9wKys7CisgICAgZm9yICg7IEN1ck9wICE9IE51bU9wczsgKytDdXJPcCkgeworICAgICAgY29uc3QgTUNPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoQ3VyT3ApOworICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgIUhhc1ZFWF80ViAmJgorICAgICAgICAgIFg4Nkluc3RySW5mbzo6aXNYODZfNjRFeHRlbmRlZFJlZyhNTy5nZXRSZWcoKSkpCisgICAgICAgIFZFWF9SID0gMHgwOworICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIC8vIEVtaXQgc2VnbWVudCBvdmVycmlkZSBvcGNvZGUgcHJlZml4IGFzIG5lZWRlZC4KKyAgRW1pdFNlZ21lbnRPdmVycmlkZVByZWZpeChUU0ZsYWdzLCBDdXJCeXRlLCBNZW1PcGVyYW5kLCBNSSwgT1MpOworCisgIC8vIFZFWCBvcGNvZGUgcHJlZml4IGNhbiBoYXZlIDIgb3IgMyBieXRlcworICAvLworICAvLyAgMyBieXRlczoKKyAgLy8gICAgKy0tLS0tKyArLS0tLS0tLS0tLS0tLS0rICstLS0tLS0tLS0tLS0tLS0tLS0tKworICAvLyAgICB8IEM0aCB8IHwgUlhCIHwgbS1tbW1tIHwgfCBXIHwgdnZ2diB8IEwgfCBwcCB8CisgIC8vICAgICstLS0tLSsgKy0tLS0tLS0tLS0tLS0tKyArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgLy8gIDIgYnl0ZXM6CisgIC8vICAgICstLS0tLSsgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgIHwgQzVoIHwgfCBSIHwgdnZ2diB8IEwgfCBwcCB8CisgIC8vICAgICstLS0tLSsgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vCisgIHVuc2lnbmVkIGNoYXIgTGFzdEJ5dGUgPSBWRVhfUFAgfCAoVkVYX0wgPDwgMikgfCAoVkVYXzRWIDw8IDMpOworCisgIGlmIChWRVhfQiAmJiBWRVhfWCAmJiAhVkVYX1cgJiYgKFZFWF81TSA9PSAxKSkgeyAvLyAyIGJ5dGUgVkVYIHByZWZpeAorICAgIEVtaXRCeXRlKDB4QzUsIEN1ckJ5dGUsIE9TKTsKKyAgICBFbWl0Qnl0ZShMYXN0Qnl0ZSB8IChWRVhfUiA8PCA3KSwgQ3VyQnl0ZSwgT1MpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIDMgYnl0ZSBWRVggcHJlZml4CisgIEVtaXRCeXRlKDB4QzQsIEN1ckJ5dGUsIE9TKTsKKyAgRW1pdEJ5dGUoVkVYX1IgPDwgNyB8IFZFWF9YIDw8IDYgfCBWRVhfQiA8PCA1IHwgVkVYXzVNLCBDdXJCeXRlLCBPUyk7CisgIEVtaXRCeXRlKExhc3RCeXRlIHwgKFZFWF9XIDw8IDcpLCBDdXJCeXRlLCBPUyk7Cit9CisKKy8vLyBEZXRlcm1pbmVSRVhQcmVmaXggLSBEZXRlcm1pbmUgaWYgdGhlIE1DSW5zdCBoYXMgdG8gYmUgZW5jb2RlZCB3aXRoIGEgWDg2LTY0CisvLy8gUkVYIHByZWZpeCB3aGljaCBzcGVjaWZpZXMgMSkgNjQtYml0IGluc3RydWN0aW9ucywgMikgbm9uLWRlZmF1bHQgb3BlcmFuZAorLy8vIHNpemUsIGFuZCAzKSB1c2Ugb2YgWDg2LTY0IGV4dGVuZGVkIHJlZ2lzdGVycy4KK3N0YXRpYyB1bnNpZ25lZCBEZXRlcm1pbmVSRVhQcmVmaXgoY29uc3QgTUNJbnN0ICZNSSwgdWludDY0X3QgVFNGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJEZXNjICZEZXNjKSB7CisgIHVuc2lnbmVkIFJFWCA9IDA7CisgIGlmIChUU0ZsYWdzICYgWDg2SUk6OlJFWF9XKQorICAgIFJFWCB8PSAxIDw8IDM7IC8vIHNldCBSRVguVworCisgIGlmIChNSS5nZXROdW1PcGVyYW5kcygpID09IDApIHJldHVybiBSRVg7CisKKyAgdW5zaWduZWQgTnVtT3BzID0gTUkuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgLy8gRklYTUU6IE1DSW5zdCBzaG91bGQgZXhwbGljaXRpemUgdGhlIHR3by1hZGRybmVzcy4KKyAgYm9vbCBpc1R3b0FkZHIgPSBOdW1PcHMgPiAxICYmCisgICAgICAgICAgICAgICAgICAgICAgRGVzYy5nZXRPcGVyYW5kQ29uc3RyYWludCgxLCBUT0k6OlRJRURfVE8pICE9IC0xOworCisgIC8vIElmIGl0IGFjY2Vzc2VzIFNQTCwgQlBMLCBTSUwsIG9yIERJTCwgdGhlbiBpdCByZXF1aXJlcyBhIDB4NDAgUkVYIHByZWZpeC4KKyAgdW5zaWduZWQgaSA9IGlzVHdvQWRkciA/IDEgOiAwOworICBmb3IgKDsgaSAhPSBOdW1PcHM7ICsraSkgeworICAgIGNvbnN0IE1DT3BlcmFuZCAmTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgIGlmICghTU8uaXNSZWcoKSkgY29udGludWU7CisgICAgdW5zaWduZWQgUmVnID0gTU8uZ2V0UmVnKCk7CisgICAgaWYgKCFYODZJbnN0ckluZm86OmlzWDg2XzY0Tm9uRXh0TG93Qnl0ZVJlZyhSZWcpKSBjb250aW51ZTsKKyAgICAvLyBGSVhNRTogVGhlIGNhbGxlciBvZiBEZXRlcm1pbmVSRVhQcmVmaXggc2xhcHMgdGhpcyBwcmVmaXggb250byBhbnl0aGluZworICAgIC8vIHRoYXQgcmV0dXJucyBub24temVyby4KKyAgICBSRVggfD0gMHg0MDsgLy8gUkVYIGZpeGVkIGVuY29kaW5nIHByZWZpeAorICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChUU0ZsYWdzICYgWDg2SUk6OkZvcm1NYXNrKSB7CisgIGNhc2UgWDg2SUk6Ok1STUluaXRSZWc6IGFzc2VydCgwICYmICJGSVhNRTogUmVtb3ZlIHRoaXMhIik7CisgIGNhc2UgWDg2SUk6Ok1STVNyY1JlZzoKKyAgICBpZiAoTUkuZ2V0T3BlcmFuZCgwKS5pc1JlZygpICYmCisgICAgICAgIFg4Nkluc3RySW5mbzo6aXNYODZfNjRFeHRlbmRlZFJlZyhNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpKSkKKyAgICAgIFJFWCB8PSAxIDw8IDI7IC8vIHNldCBSRVguUgorICAgIGkgPSBpc1R3b0FkZHIgPyAyIDogMTsKKyAgICBmb3IgKDsgaSAhPSBOdW1PcHM7ICsraSkgeworICAgICAgY29uc3QgTUNPcGVyYW5kICZNTyA9IE1JLmdldE9wZXJhbmQoaSk7CisgICAgICBpZiAoTU8uaXNSZWcoKSAmJiBYODZJbnN0ckluZm86OmlzWDg2XzY0RXh0ZW5kZWRSZWcoTU8uZ2V0UmVnKCkpKQorICAgICAgICBSRVggfD0gMSA8PCAwOyAvLyBzZXQgUkVYLkIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6Ok1STVNyY01lbTogeworICAgIGlmIChNSS5nZXRPcGVyYW5kKDApLmlzUmVnKCkgJiYKKyAgICAgICAgWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1JLmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpKQorICAgICAgUkVYIHw9IDEgPDwgMjsgLy8gc2V0IFJFWC5SCisgICAgdW5zaWduZWQgQml0ID0gMDsKKyAgICBpID0gaXNUd29BZGRyID8gMiA6IDE7CisgICAgZm9yICg7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICAgIGNvbnN0IE1DT3BlcmFuZCAmTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKE1PLmlzUmVnKCkpIHsKKyAgICAgICAgaWYgKFg4Nkluc3RySW5mbzo6aXNYODZfNjRFeHRlbmRlZFJlZyhNTy5nZXRSZWcoKSkpCisgICAgICAgICAgUkVYIHw9IDEgPDwgQml0OyAvLyBzZXQgUkVYLkIgKEJpdD0wKSBhbmQgUkVYLlggKEJpdD0xKQorICAgICAgICBCaXQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBYODZJSTo6TVJNMG06IGNhc2UgWDg2SUk6Ok1STTFtOgorICBjYXNlIFg4NklJOjpNUk0ybTogY2FzZSBYODZJSTo6TVJNM206CisgIGNhc2UgWDg2SUk6Ok1STTRtOiBjYXNlIFg4NklJOjpNUk01bToKKyAgY2FzZSBYODZJSTo6TVJNNm06IGNhc2UgWDg2SUk6Ok1STTdtOgorICBjYXNlIFg4NklJOjpNUk1EZXN0TWVtOiB7CisgICAgdW5zaWduZWQgZSA9IChpc1R3b0FkZHIgPyBYODY6OkFkZHJOdW1PcGVyYW5kcysxIDogWDg2OjpBZGRyTnVtT3BlcmFuZHMpOworICAgIGkgPSBpc1R3b0FkZHIgPyAxIDogMDsKKyAgICBpZiAoTnVtT3BzID4gZSAmJiBNSS5nZXRPcGVyYW5kKGUpLmlzUmVnKCkgJiYKKyAgICAgICAgWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1JLmdldE9wZXJhbmQoZSkuZ2V0UmVnKCkpKQorICAgICAgUkVYIHw9IDEgPDwgMjsgLy8gc2V0IFJFWC5SCisgICAgdW5zaWduZWQgQml0ID0gMDsKKyAgICBmb3IgKDsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IE1DT3BlcmFuZCAmTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKE1PLmlzUmVnKCkpIHsKKyAgICAgICAgaWYgKFg4Nkluc3RySW5mbzo6aXNYODZfNjRFeHRlbmRlZFJlZyhNTy5nZXRSZWcoKSkpCisgICAgICAgICAgUkVYIHw9IDEgPDwgQml0OyAvLyBSRVguQiAoQml0PTApIGFuZCBSRVguWCAoQml0PTEpCisgICAgICAgIEJpdCsrOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorICBkZWZhdWx0OgorICAgIGlmIChNSS5nZXRPcGVyYW5kKDApLmlzUmVnKCkgJiYKKyAgICAgICAgWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1JLmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpKQorICAgICAgUkVYIHw9IDEgPDwgMDsgLy8gc2V0IFJFWC5CCisgICAgaSA9IGlzVHdvQWRkciA/IDIgOiAxOworICAgIGZvciAodW5zaWduZWQgZSA9IE51bU9wczsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IE1DT3BlcmFuZCAmTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgWDg2SW5zdHJJbmZvOjppc1g4Nl82NEV4dGVuZGVkUmVnKE1PLmdldFJlZygpKSkKKyAgICAgICAgUkVYIHw9IDEgPDwgMjsgLy8gc2V0IFJFWC5SCisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBSRVg7Cit9CisKKy8vLyBFbWl0U2VnbWVudE92ZXJyaWRlUHJlZml4IC0gRW1pdCBzZWdtZW50IG92ZXJyaWRlIG9wY29kZSBwcmVmaXggYXMgbmVlZGVkCit2b2lkIFg4Nk1DQ29kZUVtaXR0ZXI6OkVtaXRTZWdtZW50T3ZlcnJpZGVQcmVmaXgodWludDY0X3QgVFNGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmQ3VyQnl0ZSwgaW50IE1lbU9wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgc3dpdGNoIChUU0ZsYWdzICYgWDg2SUk6OlNlZ092ck1hc2spIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIkludmFsaWQgc2VnbWVudCEiKTsKKyAgY2FzZSAwOgorICAgIC8vIE5vIHNlZ21lbnQgb3ZlcnJpZGUsIGNoZWNrIGZvciBleHBsaWNpdCBvbmUgb24gbWVtb3J5IG9wZXJhbmQuCisgICAgaWYgKE1lbU9wZXJhbmQgIT0gLTEpIHsgICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGEgbWVtb3J5IG9wZXJhbmQuCisgICAgICBzd2l0Y2ggKE1JLmdldE9wZXJhbmQoTWVtT3BlcmFuZCtYODY6OkFkZHJTZWdtZW50UmVnKS5nZXRSZWcoKSkgeworICAgICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gc2VnbWVudCByZWdpc3RlciEiKTsKKyAgICAgIGNhc2UgMDogYnJlYWs7CisgICAgICBjYXNlIFg4Njo6Q1M6IEVtaXRCeXRlKDB4MkUsIEN1ckJ5dGUsIE9TKTsgYnJlYWs7CisgICAgICBjYXNlIFg4Njo6U1M6IEVtaXRCeXRlKDB4MzYsIEN1ckJ5dGUsIE9TKTsgYnJlYWs7CisgICAgICBjYXNlIFg4Njo6RFM6IEVtaXRCeXRlKDB4M0UsIEN1ckJ5dGUsIE9TKTsgYnJlYWs7CisgICAgICBjYXNlIFg4Njo6RVM6IEVtaXRCeXRlKDB4MjYsIEN1ckJ5dGUsIE9TKTsgYnJlYWs7CisgICAgICBjYXNlIFg4Njo6RlM6IEVtaXRCeXRlKDB4NjQsIEN1ckJ5dGUsIE9TKTsgYnJlYWs7CisgICAgICBjYXNlIFg4Njo6R1M6IEVtaXRCeXRlKDB4NjUsIEN1ckJ5dGUsIE9TKTsgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpGUzoKKyAgICBFbWl0Qnl0ZSgweDY0LCBDdXJCeXRlLCBPUyk7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6OkdTOgorICAgIEVtaXRCeXRlKDB4NjUsIEN1ckJ5dGUsIE9TKTsKKyAgICBicmVhazsKKyAgfQorfQorCisvLy8gRW1pdE9wY29kZVByZWZpeCAtIEVtaXQgYWxsIGluc3RydWN0aW9uIHByZWZpeGVzIHByaW9yIHRvIHRoZSBvcGNvZGUuCisvLy8KKy8vLyBNZW1PcGVyYW5kIGlzIHRoZSBvcGVyYW5kICMgb2YgdGhlIHN0YXJ0IG9mIGEgbWVtb3J5IG9wZXJhbmQgaWYgcHJlc2VudC4gIElmCisvLy8gTm90IHByZXNlbnQsIGl0IGlzIC0xLgordm9pZCBYODZNQ0NvZGVFbWl0dGVyOjpFbWl0T3Bjb2RlUHJlZml4KHVpbnQ2NF90IFRTRmxhZ3MsIHVuc2lnbmVkICZDdXJCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBNZW1PcGVyYW5kLCBjb25zdCBNQ0luc3QgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RyRGVzYyAmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKworICAvLyBFbWl0IHRoZSBsb2NrIG9wY29kZSBwcmVmaXggYXMgbmVlZGVkLgorICBpZiAoVFNGbGFncyAmIFg4NklJOjpMT0NLKQorICAgIEVtaXRCeXRlKDB4RjAsIEN1ckJ5dGUsIE9TKTsKKworICAvLyBFbWl0IHNlZ21lbnQgb3ZlcnJpZGUgb3Bjb2RlIHByZWZpeCBhcyBuZWVkZWQuCisgIEVtaXRTZWdtZW50T3ZlcnJpZGVQcmVmaXgoVFNGbGFncywgQ3VyQnl0ZSwgTWVtT3BlcmFuZCwgTUksIE9TKTsKKworICAvLyBFbWl0IHRoZSByZXBlYXQgb3Bjb2RlIHByZWZpeCBhcyBuZWVkZWQuCisgIGlmICgoVFNGbGFncyAmIFg4NklJOjpPcDBNYXNrKSA9PSBYODZJSTo6UkVQKQorICAgIEVtaXRCeXRlKDB4RjMsIEN1ckJ5dGUsIE9TKTsKKworICAvLyBFbWl0IHRoZSBvcGVyYW5kIHNpemUgb3Bjb2RlIHByZWZpeCBhcyBuZWVkZWQuCisgIGlmIChUU0ZsYWdzICYgWDg2SUk6Ok9wU2l6ZSkKKyAgICBFbWl0Qnl0ZSgweDY2LCBDdXJCeXRlLCBPUyk7CisKKyAgLy8gRW1pdCB0aGUgYWRkcmVzcyBzaXplIG9wY29kZSBwcmVmaXggYXMgbmVlZGVkLgorICBpZiAoVFNGbGFncyAmIFg4NklJOjpBZFNpemUpCisgICAgRW1pdEJ5dGUoMHg2NywgQ3VyQnl0ZSwgT1MpOworCisgIGJvb2wgTmVlZDBGUHJlZml4ID0gZmFsc2U7CisgIHN3aXRjaCAoVFNGbGFncyAmIFg4NklJOjpPcDBNYXNrKSB7CisgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJJbnZhbGlkIHByZWZpeCEiKTsKKyAgY2FzZSAwOiBicmVhazsgIC8vIE5vIHByZWZpeCEKKyAgY2FzZSBYODZJSTo6UkVQOiBicmVhazsgLy8gYWxyZWFkeSBoYW5kbGVkLgorICBjYXNlIFg4NklJOjpUQjogIC8vIFR3by1ieXRlIG9wY29kZSBwcmVmaXgKKyAgY2FzZSBYODZJSTo6VDg6ICAvLyAwRiAzOAorICBjYXNlIFg4NklJOjpUQTogIC8vIDBGIDNBCisgICAgTmVlZDBGUHJlZml4ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6VEY6IC8vIEYyIDBGIDM4CisgICAgRW1pdEJ5dGUoMHhGMiwgQ3VyQnl0ZSwgT1MpOworICAgIE5lZWQwRlByZWZpeCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6OlhTOiAgIC8vIEYzIDBGCisgICAgRW1pdEJ5dGUoMHhGMywgQ3VyQnl0ZSwgT1MpOworICAgIE5lZWQwRlByZWZpeCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6OlhEOiAgIC8vIEYyIDBGCisgICAgRW1pdEJ5dGUoMHhGMiwgQ3VyQnl0ZSwgT1MpOworICAgIE5lZWQwRlByZWZpeCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6OkQ4OiBFbWl0Qnl0ZSgweEQ4LCBDdXJCeXRlLCBPUyk7IGJyZWFrOworICBjYXNlIFg4NklJOjpEOTogRW1pdEJ5dGUoMHhEOSwgQ3VyQnl0ZSwgT1MpOyBicmVhazsKKyAgY2FzZSBYODZJSTo6REE6IEVtaXRCeXRlKDB4REEsIEN1ckJ5dGUsIE9TKTsgYnJlYWs7CisgIGNhc2UgWDg2SUk6OkRCOiBFbWl0Qnl0ZSgweERCLCBDdXJCeXRlLCBPUyk7IGJyZWFrOworICBjYXNlIFg4NklJOjpEQzogRW1pdEJ5dGUoMHhEQywgQ3VyQnl0ZSwgT1MpOyBicmVhazsKKyAgY2FzZSBYODZJSTo6REQ6IEVtaXRCeXRlKDB4REQsIEN1ckJ5dGUsIE9TKTsgYnJlYWs7CisgIGNhc2UgWDg2SUk6OkRFOiBFbWl0Qnl0ZSgweERFLCBDdXJCeXRlLCBPUyk7IGJyZWFrOworICBjYXNlIFg4NklJOjpERjogRW1pdEJ5dGUoMHhERiwgQ3VyQnl0ZSwgT1MpOyBicmVhazsKKyAgfQorCisgIC8vIEhhbmRsZSBSRVggcHJlZml4LgorICAvLyBGSVhNRTogQ2FuIHRoaXMgY29tZSBiZWZvcmUgRjIgZXRjIHRvIHNpbXBsaWZ5IGVtaXNzaW9uPworICBpZiAoSXM2NEJpdE1vZGUpIHsKKyAgICBpZiAodW5zaWduZWQgUkVYID0gRGV0ZXJtaW5lUkVYUHJlZml4KE1JLCBUU0ZsYWdzLCBEZXNjKSkKKyAgICAgIEVtaXRCeXRlKDB4NDAgfCBSRVgsIEN1ckJ5dGUsIE9TKTsKKyAgfQorCisgIC8vIDB4MEYgZXNjYXBlIGNvZGUgbXVzdCBiZSBlbWl0dGVkIGp1c3QgYmVmb3JlIHRoZSBvcGNvZGUuCisgIGlmIChOZWVkMEZQcmVmaXgpCisgICAgRW1pdEJ5dGUoMHgwRiwgQ3VyQnl0ZSwgT1MpOworCisgIC8vIEZJWE1FOiBQdWxsIHRoaXMgdXAgaW50byBwcmV2aW91cyBzd2l0Y2ggaWYgUkVYIGNhbiBiZSBtb3ZlZCBlYXJsaWVyLgorICBzd2l0Y2ggKFRTRmxhZ3MgJiBYODZJSTo6T3AwTWFzaykgeworICBjYXNlIFg4NklJOjpURjogICAgLy8gRjIgMEYgMzgKKyAgY2FzZSBYODZJSTo6VDg6ICAgIC8vIDBGIDM4CisgICAgRW1pdEJ5dGUoMHgzOCwgQ3VyQnl0ZSwgT1MpOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpUQTogICAgLy8gMEYgM0EKKyAgICBFbWl0Qnl0ZSgweDNBLCBDdXJCeXRlLCBPUyk7CisgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBYODZNQ0NvZGVFbWl0dGVyOjoKK0VuY29kZUluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAmTUksIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNQ0ZpeHVwPiAmRml4dXBzKSBjb25zdCB7CisgIHVuc2lnbmVkIE9wY29kZSA9IE1JLmdldE9wY29kZSgpOworICBjb25zdCBUYXJnZXRJbnN0ckRlc2MgJkRlc2MgPSBUSUkuZ2V0KE9wY29kZSk7CisgIHVpbnQ2NF90IFRTRmxhZ3MgPSBEZXNjLlRTRmxhZ3M7CisKKyAgLy8gUHNldWRvIGluc3RydWN0aW9ucyBkb24ndCBnZXQgZW5jb2RlZC4KKyAgaWYgKChUU0ZsYWdzICYgWDg2SUk6OkZvcm1NYXNrKSA9PSBYODZJSTo6UHNldWRvKQorICAgIHJldHVybjsKKworICAvLyBJZiB0aGlzIGlzIGEgdHdvLWFkZHJlc3MgaW5zdHJ1Y3Rpb24sIHNraXAgb25lIG9mIHRoZSByZWdpc3RlciBvcGVyYW5kcy4KKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgZHVyaW5nIE1DSW5zdCBsb3dlcmluZy4KKyAgdW5zaWduZWQgTnVtT3BzID0gRGVzYy5nZXROdW1PcGVyYW5kcygpOworICB1bnNpZ25lZCBDdXJPcCA9IDA7CisgIGlmIChOdW1PcHMgPiAxICYmIERlc2MuZ2V0T3BlcmFuZENvbnN0cmFpbnQoMSwgVE9JOjpUSUVEX1RPKSAhPSAtMSkKKyAgICArK0N1ck9wOworICBlbHNlIGlmIChOdW1PcHMgPiAyICYmIERlc2MuZ2V0T3BlcmFuZENvbnN0cmFpbnQoTnVtT3BzLTEsIFRPSTo6VElFRF9UTyk9PSAwKQorICAgIC8vIFNraXAgdGhlIGxhc3Qgc291cmNlIG9wZXJhbmQgdGhhdCBpcyB0aWVkX3RvIHRoZSBkZXN0IHJlZy4gZS5nLiBMWEFERDMyCisgICAgLS1OdW1PcHM7CisKKyAgLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBieXRlIGJlaW5nIGVtaXR0ZWQuCisgIHVuc2lnbmVkIEN1ckJ5dGUgPSAwOworCisgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gZW5jb2RlZCB1c2luZyB0aGUgQVZYIFZFWCBwcmVmaXg/CisgIGJvb2wgSGFzVkVYUHJlZml4ID0gZmFsc2U7CisKKyAgLy8gSXQgdXNlcyB0aGUgVkVYLlZWVlYgZmllbGQ/CisgIGJvb2wgSGFzVkVYXzRWID0gZmFsc2U7CisKKyAgaWYgKFRTRmxhZ3MgJiBYODZJSTo6VkVYKQorICAgIEhhc1ZFWFByZWZpeCA9IHRydWU7CisgIGlmIChUU0ZsYWdzICYgWDg2SUk6OlZFWF80VikKKyAgICBIYXNWRVhfNFYgPSB0cnVlOworCisgIC8vIERldGVybWluZSB3aGVyZSB0aGUgbWVtb3J5IG9wZXJhbmQgc3RhcnRzLCBpZiBwcmVzZW50LgorICBpbnQgTWVtb3J5T3BlcmFuZCA9IFg4NklJOjpnZXRNZW1vcnlPcGVyYW5kTm8oVFNGbGFncyk7CisgIGlmIChNZW1vcnlPcGVyYW5kICE9IC0xKSBNZW1vcnlPcGVyYW5kICs9IEN1ck9wOworCisgIGlmICghSGFzVkVYUHJlZml4KQorICAgIEVtaXRPcGNvZGVQcmVmaXgoVFNGbGFncywgQ3VyQnl0ZSwgTWVtb3J5T3BlcmFuZCwgTUksIERlc2MsIE9TKTsKKyAgZWxzZQorICAgIEVtaXRWRVhPcGNvZGVQcmVmaXgoVFNGbGFncywgQ3VyQnl0ZSwgTWVtb3J5T3BlcmFuZCwgTUksIERlc2MsIE9TKTsKKworICB1bnNpZ25lZCBjaGFyIEJhc2VPcGNvZGUgPSBYODZJSTo6Z2V0QmFzZU9wY29kZUZvcihUU0ZsYWdzKTsKKyAgdW5zaWduZWQgU3JjUmVnTnVtID0gMDsKKyAgc3dpdGNoIChUU0ZsYWdzICYgWDg2SUk6OkZvcm1NYXNrKSB7CisgIGNhc2UgWDg2SUk6Ok1STUluaXRSZWc6CisgICAgYXNzZXJ0KDAgJiYgIkZJWE1FOiBSZW1vdmUgdGhpcyBmb3JtIHdoZW4gdGhlIEpJVCBtb3ZlcyB0byBNQ0NvZGVFbWl0dGVyISIpOworICBkZWZhdWx0OiBlcnJzKCkgPDwgIkZPUk06ICIgPDwgKFRTRmxhZ3MgJiBYODZJSTo6Rm9ybU1hc2spIDw8ICJcbiI7CisgICAgYXNzZXJ0KDAgJiYgIlVua25vd24gRm9ybU1hc2sgdmFsdWUgaW4gWDg2TUNDb2RlRW1pdHRlciEiKTsKKyAgY2FzZSBYODZJSTo6UHNldWRvOgorICAgIGFzc2VydCgwICYmICJQc2V1ZG8gaW5zdHJ1Y3Rpb24gc2hvdWxkbid0IGJlIGVtaXR0ZWQiKTsKKyAgY2FzZSBYODZJSTo6UmF3RnJtOgorICAgIEVtaXRCeXRlKEJhc2VPcGNvZGUsIEN1ckJ5dGUsIE9TKTsKKyAgICBicmVhazsKKworICBjYXNlIFg4NklJOjpBZGRSZWdGcm06CisgICAgRW1pdEJ5dGUoQmFzZU9wY29kZSArIEdldFg4NlJlZ051bShNSS5nZXRPcGVyYW5kKEN1ck9wKyspKSwgQ3VyQnl0ZSwgT1MpOworICAgIGJyZWFrOworCisgIGNhc2UgWDg2SUk6Ok1STURlc3RSZWc6CisgICAgRW1pdEJ5dGUoQmFzZU9wY29kZSwgQ3VyQnl0ZSwgT1MpOworICAgIEVtaXRSZWdNb2RSTUJ5dGUoTUkuZ2V0T3BlcmFuZChDdXJPcCksCisgICAgICAgICAgICAgICAgICAgICBHZXRYODZSZWdOdW0oTUkuZ2V0T3BlcmFuZChDdXJPcCsxKSksIEN1ckJ5dGUsIE9TKTsKKyAgICBDdXJPcCArPSAyOworICAgIGJyZWFrOworCisgIGNhc2UgWDg2SUk6Ok1STURlc3RNZW06CisgICAgRW1pdEJ5dGUoQmFzZU9wY29kZSwgQ3VyQnl0ZSwgT1MpOworICAgIFNyY1JlZ051bSA9IEN1ck9wICsgWDg2OjpBZGRyTnVtT3BlcmFuZHM7CisKKyAgICBpZiAoSGFzVkVYXzRWKSAvLyBTa2lwIDFzdCBzcmMgKHdoaWNoIGlzIGVuY29kZWQgaW4gVkVYX1ZWVlYpCisgICAgICBTcmNSZWdOdW0rKzsKKworICAgIEVtaXRNZW1Nb2RSTUJ5dGUoTUksIEN1ck9wLAorICAgICAgICAgICAgICAgICAgICAgR2V0WDg2UmVnTnVtKE1JLmdldE9wZXJhbmQoU3JjUmVnTnVtKSksCisgICAgICAgICAgICAgICAgICAgICBUU0ZsYWdzLCBDdXJCeXRlLCBPUywgRml4dXBzKTsKKyAgICBDdXJPcCA9IFNyY1JlZ051bSArIDE7CisgICAgYnJlYWs7CisKKyAgY2FzZSBYODZJSTo6TVJNU3JjUmVnOgorICAgIEVtaXRCeXRlKEJhc2VPcGNvZGUsIEN1ckJ5dGUsIE9TKTsKKyAgICBTcmNSZWdOdW0gPSBDdXJPcCArIDE7CisKKyAgICBpZiAoSGFzVkVYXzRWKSAvLyBTa2lwIDFzdCBzcmMgKHdoaWNoIGlzIGVuY29kZWQgaW4gVkVYX1ZWVlYpCisgICAgICBTcmNSZWdOdW0rKzsKKworICAgIEVtaXRSZWdNb2RSTUJ5dGUoTUkuZ2V0T3BlcmFuZChTcmNSZWdOdW0pLAorICAgICAgICAgICAgICAgICAgICAgR2V0WDg2UmVnTnVtKE1JLmdldE9wZXJhbmQoQ3VyT3ApKSwgQ3VyQnl0ZSwgT1MpOworICAgIEN1ck9wID0gU3JjUmVnTnVtICsgMTsKKyAgICBicmVhazsKKworICBjYXNlIFg4NklJOjpNUk1TcmNNZW06IHsKKyAgICBpbnQgQWRkck9wZXJhbmRzID0gWDg2OjpBZGRyTnVtT3BlcmFuZHM7CisgICAgdW5zaWduZWQgRmlyc3RNZW1PcCA9IEN1ck9wKzE7CisgICAgaWYgKEhhc1ZFWF80VikgeworICAgICAgKytBZGRyT3BlcmFuZHM7CisgICAgICArK0ZpcnN0TWVtT3A7ICAvLyBTa2lwIHRoZSByZWdpc3RlciBzb3VyY2UgKHdoaWNoIGlzIGVuY29kZWQgaW4gVkVYX1ZWVlYpLgorICAgIH0KKworICAgIEVtaXRCeXRlKEJhc2VPcGNvZGUsIEN1ckJ5dGUsIE9TKTsKKworICAgIEVtaXRNZW1Nb2RSTUJ5dGUoTUksIEZpcnN0TWVtT3AsIEdldFg4NlJlZ051bShNSS5nZXRPcGVyYW5kKEN1ck9wKSksCisgICAgICAgICAgICAgICAgICAgICBUU0ZsYWdzLCBDdXJCeXRlLCBPUywgRml4dXBzKTsKKyAgICBDdXJPcCArPSBBZGRyT3BlcmFuZHMgKyAxOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBYODZJSTo6TVJNMHI6IGNhc2UgWDg2SUk6Ok1STTFyOgorICBjYXNlIFg4NklJOjpNUk0ycjogY2FzZSBYODZJSTo6TVJNM3I6CisgIGNhc2UgWDg2SUk6Ok1STTRyOiBjYXNlIFg4NklJOjpNUk01cjoKKyAgY2FzZSBYODZJSTo6TVJNNnI6IGNhc2UgWDg2SUk6Ok1STTdyOgorICAgIGlmIChIYXNWRVhfNFYpIC8vIFNraXAgdGhlIHJlZ2lzdGVyIGRzdCAod2hpY2ggaXMgZW5jb2RlZCBpbiBWRVhfVlZWVikuCisgICAgICBDdXJPcCsrOworICAgIEVtaXRCeXRlKEJhc2VPcGNvZGUsIEN1ckJ5dGUsIE9TKTsKKyAgICBFbWl0UmVnTW9kUk1CeXRlKE1JLmdldE9wZXJhbmQoQ3VyT3ArKyksCisgICAgICAgICAgICAgICAgICAgICAoVFNGbGFncyAmIFg4NklJOjpGb3JtTWFzayktWDg2SUk6Ok1STTByLAorICAgICAgICAgICAgICAgICAgICAgQ3VyQnl0ZSwgT1MpOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpNUk0wbTogY2FzZSBYODZJSTo6TVJNMW06CisgIGNhc2UgWDg2SUk6Ok1STTJtOiBjYXNlIFg4NklJOjpNUk0zbToKKyAgY2FzZSBYODZJSTo6TVJNNG06IGNhc2UgWDg2SUk6Ok1STTVtOgorICBjYXNlIFg4NklJOjpNUk02bTogY2FzZSBYODZJSTo6TVJNN206CisgICAgRW1pdEJ5dGUoQmFzZU9wY29kZSwgQ3VyQnl0ZSwgT1MpOworICAgIEVtaXRNZW1Nb2RSTUJ5dGUoTUksIEN1ck9wLCAoVFNGbGFncyAmIFg4NklJOjpGb3JtTWFzayktWDg2SUk6Ok1STTBtLAorICAgICAgICAgICAgICAgICAgICAgVFNGbGFncywgQ3VyQnl0ZSwgT1MsIEZpeHVwcyk7CisgICAgQ3VyT3AgKz0gWDg2OjpBZGRyTnVtT3BlcmFuZHM7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6Ok1STV9DMToKKyAgICBFbWl0Qnl0ZShCYXNlT3Bjb2RlLCBDdXJCeXRlLCBPUyk7CisgICAgRW1pdEJ5dGUoMHhDMSwgQ3VyQnl0ZSwgT1MpOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpNUk1fQzI6CisgICAgRW1pdEJ5dGUoQmFzZU9wY29kZSwgQ3VyQnl0ZSwgT1MpOworICAgIEVtaXRCeXRlKDB4QzIsIEN1ckJ5dGUsIE9TKTsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6TVJNX0MzOgorICAgIEVtaXRCeXRlKEJhc2VPcGNvZGUsIEN1ckJ5dGUsIE9TKTsKKyAgICBFbWl0Qnl0ZSgweEMzLCBDdXJCeXRlLCBPUyk7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6Ok1STV9DNDoKKyAgICBFbWl0Qnl0ZShCYXNlT3Bjb2RlLCBDdXJCeXRlLCBPUyk7CisgICAgRW1pdEJ5dGUoMHhDNCwgQ3VyQnl0ZSwgT1MpOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpNUk1fQzg6CisgICAgRW1pdEJ5dGUoQmFzZU9wY29kZSwgQ3VyQnl0ZSwgT1MpOworICAgIEVtaXRCeXRlKDB4QzgsIEN1ckJ5dGUsIE9TKTsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6TVJNX0M5OgorICAgIEVtaXRCeXRlKEJhc2VPcGNvZGUsIEN1ckJ5dGUsIE9TKTsKKyAgICBFbWl0Qnl0ZSgweEM5LCBDdXJCeXRlLCBPUyk7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6Ok1STV9FODoKKyAgICBFbWl0Qnl0ZShCYXNlT3Bjb2RlLCBDdXJCeXRlLCBPUyk7CisgICAgRW1pdEJ5dGUoMHhFOCwgQ3VyQnl0ZSwgT1MpOworICAgIGJyZWFrOworICBjYXNlIFg4NklJOjpNUk1fRjA6CisgICAgRW1pdEJ5dGUoQmFzZU9wY29kZSwgQ3VyQnl0ZSwgT1MpOworICAgIEVtaXRCeXRlKDB4RjAsIEN1ckJ5dGUsIE9TKTsKKyAgICBicmVhazsKKyAgY2FzZSBYODZJSTo6TVJNX0Y4OgorICAgIEVtaXRCeXRlKEJhc2VPcGNvZGUsIEN1ckJ5dGUsIE9TKTsKKyAgICBFbWl0Qnl0ZSgweEY4LCBDdXJCeXRlLCBPUyk7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6Ok1STV9GOToKKyAgICBFbWl0Qnl0ZShCYXNlT3Bjb2RlLCBDdXJCeXRlLCBPUyk7CisgICAgRW1pdEJ5dGUoMHhGOSwgQ3VyQnl0ZSwgT1MpOworICAgIGJyZWFrOworICB9CisKKyAgLy8gSWYgdGhlcmUgaXMgYSByZW1haW5pbmcgb3BlcmFuZCwgaXQgbXVzdCBiZSBhIHRyYWlsaW5nIGltbWVkaWF0ZS4gIEVtaXQgaXQKKyAgLy8gYWNjb3JkaW5nIHRvIHRoZSByaWdodCBzaXplIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCisgIGlmIChDdXJPcCAhPSBOdW1PcHMpIHsKKyAgICAvLyBUaGUgbGFzdCBzb3VyY2UgcmVnaXN0ZXIgb2YgYSA0IG9wZXJhbmQgaW5zdHJ1Y3Rpb24gaW4gQVZYIGlzIGVuY29kZWQKKyAgICAvLyBpbiBiaXRzWzc6NF0gb2YgYSBpbW1lZGlhdGUgYnl0ZSwgYW5kIGJpdHNbMzowXSBhcmUgaWdub3JlZC4KKyAgICBpZiAoVFNGbGFncyAmIFg4NklJOjpWRVhfSThJTU0pIHsKKyAgICAgIGNvbnN0IE1DT3BlcmFuZCAmTU8gPSBNSS5nZXRPcGVyYW5kKEN1ck9wKyspOworICAgICAgYm9vbCBJc0V4dFJlZyA9CisgICAgICAgIFg4Nkluc3RySW5mbzo6aXNYODZfNjRFeHRlbmRlZFJlZyhNTy5nZXRSZWcoKSk7CisgICAgICB1bnNpZ25lZCBSZWdOdW0gPSAoSXNFeHRSZWcgPyAoMSA8PCA3KSA6IDApOworICAgICAgUmVnTnVtIHw9IEdldFg4NlJlZ051bShNTykgPDwgNDsKKyAgICAgIEVtaXRJbW1lZGlhdGUoTUNPcGVyYW5kOjpDcmVhdGVJbW0oUmVnTnVtKSwgMSwgRktfRGF0YV8xLCBDdXJCeXRlLCBPUywKKyAgICAgICAgICAgICAgICAgICAgRml4dXBzKTsKKyAgICB9IGVsc2UKKyAgICAgIEVtaXRJbW1lZGlhdGUoTUkuZ2V0T3BlcmFuZChDdXJPcCsrKSwKKyAgICAgICAgICAgICAgICAgICAgWDg2SUk6OmdldFNpemVPZkltbShUU0ZsYWdzKSwgZ2V0SW1tRml4dXBLaW5kKFRTRmxhZ3MpLAorICAgICAgICAgICAgICAgICAgICBDdXJCeXRlLCBPUywgRml4dXBzKTsKKyAgfQorCisKKyNpZm5kZWYgTkRFQlVHCisgIC8vIEZJWE1FOiBWZXJpZnkuCisgIGlmICgvKiFEZXNjLmlzVmFyaWFkaWMoKSAmJiovIEN1ck9wICE9IE51bU9wcykgeworICAgIGVycnMoKSA8PCAiQ2Fubm90IGVuY29kZSBhbGwgb3BlcmFuZHMgb2Y6ICI7CisgICAgTUkuZHVtcCgpOworICAgIGVycnMoKSA8PCAnXG4nOworICAgIGFib3J0KCk7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2TUNJbnN0TG93ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2TUNJbnN0TG93ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjBlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZNQ0luc3RMb3dlci5jcHAKQEAgLTAsMCArMSw1OTggQEAKKy8vPT09LS0gWDg2TUNJbnN0TG93ZXIuY3BwIC0gQ29udmVydCBYODYgTWFjaGluZUluc3RyIHRvIGFuIE1DSW5zdCAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgdG8gbG93ZXIgWDg2IE1hY2hpbmVJbnN0cnMgdG8gdGhlaXIgY29ycmVzcG9uZGluZworLy8gTUNJbnN0IHJlY29yZHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlg4Nk1DSW5zdExvd2VyLmgiCisjaW5jbHVkZSAiWDg2QXNtUHJpbnRlci5oIgorI2luY2x1ZGUgIlg4NkNPRkZNYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgIlg4Nk1DQXNtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mb0ltcGxzLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L01hbmdsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitYODZNQ0luc3RMb3dlcjo6WDg2TUNJbnN0TG93ZXIoTWFuZ2xlciAqbWFuZywgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODZBc21QcmludGVyICZhc21wcmludGVyKQorOiBDdHgobWYuZ2V0Q29udGV4dCgpKSwgTWFuZyhtYW5nKSwgTUYobWYpLCBUTShtZi5nZXRUYXJnZXQoKSksCisgIE1BSSgqVE0uZ2V0TUNBc21JbmZvKCkpLCBBc21QcmludGVyKGFzbXByaW50ZXIpIHt9CisKK01hY2hpbmVNb2R1bGVJbmZvTWFjaE8gJlg4Nk1DSW5zdExvd2VyOjpnZXRNYWNoT01NSSgpIGNvbnN0IHsKKyAgcmV0dXJuIE1GLmdldE1NSSgpLmdldE9iakZpbGVJbmZvPE1hY2hpbmVNb2R1bGVJbmZvTWFjaE8+KCk7Cit9CisKKworTUNTeW1ib2wgKlg4Nk1DSW5zdExvd2VyOjpHZXRQSUNCYXNlU3ltYm9sKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgWDg2VGFyZ2V0TG93ZXJpbmcqPihUTS5nZXRUYXJnZXRMb3dlcmluZygpKS0+CisgICAgZ2V0UElDQmFzZVN5bWJvbCgmTUYsIEN0eCk7Cit9CisKKy8vLyBHZXRTeW1ib2xGcm9tT3BlcmFuZCAtIExvd2VyIGFuIE1PX0dsb2JhbEFkZHJlc3Mgb3IgTU9fRXh0ZXJuYWxTeW1ib2wKKy8vLyBvcGVyYW5kIHRvIGFuIE1DU3ltYm9sLgorTUNTeW1ib2wgKlg4Nk1DSW5zdExvd2VyOjoKK0dldFN5bWJvbEZyb21PcGVyYW5kKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgY29uc3QgeworICBhc3NlcnQoKE1PLmlzR2xvYmFsKCkgfHwgTU8uaXNTeW1ib2woKSkgJiYgIklzbid0IGEgc3ltYm9sIHJlZmVyZW5jZSIpOworCisgIFNtYWxsU3RyaW5nPDEyOD4gTmFtZTsKKyAgCisgIGlmICghTU8uaXNHbG9iYWwoKSkgeworICAgIGFzc2VydChNTy5pc1N5bWJvbCgpKTsKKyAgICBOYW1lICs9IE1BSS5nZXRHbG9iYWxQcmVmaXgoKTsKKyAgICBOYW1lICs9IE1PLmdldFN5bWJvbE5hbWUoKTsKKyAgfSBlbHNlIHsgICAgCisgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gTU8uZ2V0R2xvYmFsKCk7CisgICAgYm9vbCBpc0ltcGxpY2l0bHlQcml2YXRlID0gZmFsc2U7CisgICAgaWYgKE1PLmdldFRhcmdldEZsYWdzKCkgPT0gWDg2SUk6Ok1PX0RBUldJTl9TVFVCIHx8CisgICAgICAgIE1PLmdldFRhcmdldEZsYWdzKCkgPT0gWDg2SUk6Ok1PX0RBUldJTl9OT05MQVpZIHx8CisgICAgICAgIE1PLmdldFRhcmdldEZsYWdzKCkgPT0gWDg2SUk6Ok1PX0RBUldJTl9OT05MQVpZX1BJQ19CQVNFIHx8CisgICAgICAgIE1PLmdldFRhcmdldEZsYWdzKCkgPT0gWDg2SUk6Ok1PX0RBUldJTl9ISURERU5fTk9OTEFaWV9QSUNfQkFTRSkKKyAgICAgIGlzSW1wbGljaXRseVByaXZhdGUgPSB0cnVlOworICAgIAorICAgIE1hbmctPmdldE5hbWVXaXRoUHJlZml4KE5hbWUsIEdWLCBpc0ltcGxpY2l0bHlQcml2YXRlKTsKKyAgfQorCisgIC8vIElmIHRoZSB0YXJnZXQgZmxhZ3Mgb24gdGhlIG9wZXJhbmQgY2hhbmdlcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLCBkbyB0aGF0CisgIC8vIGJlZm9yZSB3ZSByZXR1cm4gdGhlIHN5bWJvbC4KKyAgc3dpdGNoIChNTy5nZXRUYXJnZXRGbGFncygpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIFg4NklJOjpNT19ETExJTVBPUlQ6IHsKKyAgICAvLyBIYW5kbGUgZGxsaW1wb3J0IGxpbmthZ2UuCisgICAgY29uc3QgY2hhciAqUHJlZml4ID0gIl9faW1wXyI7CisgICAgTmFtZS5pbnNlcnQoTmFtZS5iZWdpbigpLCBQcmVmaXgsIFByZWZpeCtzdHJsZW4oUHJlZml4KSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBYODZJSTo6TU9fREFSV0lOX05PTkxBWlk6CisgIGNhc2UgWDg2SUk6Ok1PX0RBUldJTl9OT05MQVpZX1BJQ19CQVNFOiB7CisgICAgTmFtZSArPSAiJG5vbl9sYXp5X3B0ciI7CisgICAgTUNTeW1ib2wgKlN5bSA9IEN0eC5HZXRPckNyZWF0ZVN5bWJvbChOYW1lLnN0cigpKTsKKworICAgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6U3R1YlZhbHVlVHkgJlN0dWJTeW0gPQorICAgICAgZ2V0TWFjaE9NTUkoKS5nZXRHVlN0dWJFbnRyeShTeW0pOworICAgIGlmIChTdHViU3ltLmdldFBvaW50ZXIoKSA9PSAwKSB7CisgICAgICBhc3NlcnQoTU8uaXNHbG9iYWwoKSAmJiAiRXh0ZXJuIHN5bWJvbCBub3QgaGFuZGxlZCB5ZXQiKTsKKyAgICAgIFN0dWJTeW0gPQorICAgICAgICBNYWNoaW5lTW9kdWxlSW5mb0ltcGw6OgorICAgICAgICBTdHViVmFsdWVUeShNYW5nLT5nZXRTeW1ib2woTU8uZ2V0R2xvYmFsKCkpLAorICAgICAgICAgICAgICAgICAgICAhTU8uZ2V0R2xvYmFsKCktPmhhc0ludGVybmFsTGlua2FnZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIFN5bTsKKyAgfQorICBjYXNlIFg4NklJOjpNT19EQVJXSU5fSElEREVOX05PTkxBWllfUElDX0JBU0U6IHsKKyAgICBOYW1lICs9ICIkbm9uX2xhenlfcHRyIjsKKyAgICBNQ1N5bWJvbCAqU3ltID0gQ3R4LkdldE9yQ3JlYXRlU3ltYm9sKE5hbWUuc3RyKCkpOworICAgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6U3R1YlZhbHVlVHkgJlN0dWJTeW0gPQorICAgICAgZ2V0TWFjaE9NTUkoKS5nZXRIaWRkZW5HVlN0dWJFbnRyeShTeW0pOworICAgIGlmIChTdHViU3ltLmdldFBvaW50ZXIoKSA9PSAwKSB7CisgICAgICBhc3NlcnQoTU8uaXNHbG9iYWwoKSAmJiAiRXh0ZXJuIHN5bWJvbCBub3QgaGFuZGxlZCB5ZXQiKTsKKyAgICAgIFN0dWJTeW0gPQorICAgICAgICBNYWNoaW5lTW9kdWxlSW5mb0ltcGw6OgorICAgICAgICBTdHViVmFsdWVUeShNYW5nLT5nZXRTeW1ib2woTU8uZ2V0R2xvYmFsKCkpLAorICAgICAgICAgICAgICAgICAgICAhTU8uZ2V0R2xvYmFsKCktPmhhc0ludGVybmFsTGlua2FnZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIFN5bTsKKyAgfQorICBjYXNlIFg4NklJOjpNT19EQVJXSU5fU1RVQjogeworICAgIE5hbWUgKz0gIiRzdHViIjsKKyAgICBNQ1N5bWJvbCAqU3ltID0gQ3R4LkdldE9yQ3JlYXRlU3ltYm9sKE5hbWUuc3RyKCkpOworICAgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6U3R1YlZhbHVlVHkgJlN0dWJTeW0gPQorICAgICAgZ2V0TWFjaE9NTUkoKS5nZXRGblN0dWJFbnRyeShTeW0pOworICAgIGlmIChTdHViU3ltLmdldFBvaW50ZXIoKSkKKyAgICAgIHJldHVybiBTeW07CisgICAgCisgICAgaWYgKE1PLmlzR2xvYmFsKCkpIHsKKyAgICAgIFN0dWJTeW0gPQorICAgICAgICBNYWNoaW5lTW9kdWxlSW5mb0ltcGw6OgorICAgICAgICBTdHViVmFsdWVUeShNYW5nLT5nZXRTeW1ib2woTU8uZ2V0R2xvYmFsKCkpLAorICAgICAgICAgICAgICAgICAgICAhTU8uZ2V0R2xvYmFsKCktPmhhc0ludGVybmFsTGlua2FnZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgTmFtZS5lcmFzZShOYW1lLmVuZCgpLTUsIE5hbWUuZW5kKCkpOworICAgICAgU3R1YlN5bSA9CisgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbDo6CisgICAgICAgIFN0dWJWYWx1ZVR5KEN0eC5HZXRPckNyZWF0ZVN5bWJvbChOYW1lLnN0cigpKSwgZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gU3ltOworICB9CisgIH0KKworICByZXR1cm4gQ3R4LkdldE9yQ3JlYXRlU3ltYm9sKE5hbWUuc3RyKCkpOworfQorCitNQ09wZXJhbmQgWDg2TUNJbnN0TG93ZXI6Okxvd2VyU3ltYm9sT3BlcmFuZChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbCAqU3ltKSBjb25zdCB7CisgIC8vIEZJWE1FOiBXZSB3b3VsZCBsaWtlIGFuIGVmZmljaWVudCBmb3JtIGZvciB0aGlzLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGEKKyAgLy8gbG90IG9mIGV4dHJhIHVuaXF1aW5nLgorICBjb25zdCBNQ0V4cHIgKkV4cHIgPSAwOworICBNQ1N5bWJvbFJlZkV4cHI6OlZhcmlhbnRLaW5kIFJlZktpbmQgPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX05vbmU7CisgIAorICBzd2l0Y2ggKE1PLmdldFRhcmdldEZsYWdzKCkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB0YXJnZXQgZmxhZyBvbiBHViBvcGVyYW5kIik7CisgIGNhc2UgWDg2SUk6Ok1PX05PX0ZMQUc6ICAgIC8vIE5vIGZsYWcuCisgIC8vIFRoZXNlIGFmZmVjdCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLCBub3QgYW55IHN1ZmZpeC4KKyAgY2FzZSBYODZJSTo6TU9fREFSV0lOX05PTkxBWlk6CisgIGNhc2UgWDg2SUk6Ok1PX0RMTElNUE9SVDoKKyAgY2FzZSBYODZJSTo6TU9fREFSV0lOX1NUVUI6CisgICAgYnJlYWs7CisgICAgICAKKyAgY2FzZSBYODZJSTo6TU9fVExWUDogICAgICBSZWZLaW5kID0gTUNTeW1ib2xSZWZFeHByOjpWS19UTFZQOyBicmVhazsKKyAgY2FzZSBYODZJSTo6TU9fVExWUF9QSUNfQkFTRToKKyAgICBFeHByID0gTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoU3ltLCBNQ1N5bWJvbFJlZkV4cHI6OlZLX1RMVlAsIEN0eCk7CisgICAgLy8gU3VidHJhY3QgdGhlIHBpYyBiYXNlLgorICAgIEV4cHIgPSBNQ0JpbmFyeUV4cHI6OkNyZWF0ZVN1YihFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShHZXRQSUNCYXNlU3ltYm9sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCk7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2SUk6Ok1PX1RMU0dEOiAgICAgUmVmS2luZCA9IE1DU3ltYm9sUmVmRXhwcjo6VktfVExTR0Q7IGJyZWFrOworICBjYXNlIFg4NklJOjpNT19HT1RUUE9GRjogIFJlZktpbmQgPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX0dPVFRQT0ZGOyBicmVhazsKKyAgY2FzZSBYODZJSTo6TU9fSU5ETlRQT0ZGOiBSZWZLaW5kID0gTUNTeW1ib2xSZWZFeHByOjpWS19JTkROVFBPRkY7IGJyZWFrOworICBjYXNlIFg4NklJOjpNT19UUE9GRjogICAgIFJlZktpbmQgPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX1RQT0ZGOyBicmVhazsKKyAgY2FzZSBYODZJSTo6TU9fTlRQT0ZGOiAgICBSZWZLaW5kID0gTUNTeW1ib2xSZWZFeHByOjpWS19OVFBPRkY7IGJyZWFrOworICBjYXNlIFg4NklJOjpNT19HT1RQQ1JFTDogIFJlZktpbmQgPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX0dPVFBDUkVMOyBicmVhazsKKyAgY2FzZSBYODZJSTo6TU9fR09UOiAgICAgICBSZWZLaW5kID0gTUNTeW1ib2xSZWZFeHByOjpWS19HT1Q7IGJyZWFrOworICBjYXNlIFg4NklJOjpNT19HT1RPRkY6ICAgIFJlZktpbmQgPSBNQ1N5bWJvbFJlZkV4cHI6OlZLX0dPVE9GRjsgYnJlYWs7CisgIGNhc2UgWDg2SUk6Ok1PX1BMVDogICAgICAgUmVmS2luZCA9IE1DU3ltYm9sUmVmRXhwcjo6VktfUExUOyBicmVhazsKKyAgY2FzZSBYODZJSTo6TU9fUElDX0JBU0VfT0ZGU0VUOgorICBjYXNlIFg4NklJOjpNT19EQVJXSU5fTk9OTEFaWV9QSUNfQkFTRToKKyAgY2FzZSBYODZJSTo6TU9fREFSV0lOX0hJRERFTl9OT05MQVpZX1BJQ19CQVNFOgorICAgIEV4cHIgPSBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShTeW0sIEN0eCk7CisgICAgLy8gU3VidHJhY3QgdGhlIHBpYyBiYXNlLgorICAgIEV4cHIgPSBNQ0JpbmFyeUV4cHI6OkNyZWF0ZVN1YihFeHByLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShHZXRQSUNCYXNlU3ltYm9sKCksIEN0eCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCk7CisgICAgaWYgKE1PLmlzSlRJKCkgJiYgTUFJLmhhc1NldERpcmVjdGl2ZSgpKSB7CisgICAgICAvLyBJZiAuc2V0IGRpcmVjdGl2ZSBpcyBzdXBwb3J0ZWQsIHVzZSBpdCB0byByZWR1Y2UgdGhlIG51bWJlciBvZgorICAgICAgLy8gcmVsb2NhdGlvbnMgdGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuCisgICAgICAvLyBsb2NhbCBsYWJlbHMuIFRoaXMgaXMgb25seSBzYWZlIHdoZW4gdGhlIHN5bWJvbHMgYXJlIGluIHRoZSBzYW1lCisgICAgICAvLyBzZWN0aW9uIHNvIHdlIGFyZSByZXN0cmljdGluZyBpdCB0byBqdW1wdGFibGUgcmVmZXJlbmNlcy4KKyAgICAgIE1DU3ltYm9sICpMYWJlbCA9IEN0eC5DcmVhdGVUZW1wU3ltYm9sKCk7CisgICAgICBBc21QcmludGVyLk91dFN0cmVhbWVyLkVtaXRBc3NpZ25tZW50KExhYmVsLCBFeHByKTsKKyAgICAgIEV4cHIgPSBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShMYWJlbCwgQ3R4KTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgCisgIGlmIChFeHByID09IDApCisgICAgRXhwciA9IE1DU3ltYm9sUmVmRXhwcjo6Q3JlYXRlKFN5bSwgUmVmS2luZCwgQ3R4KTsKKyAgCisgIGlmICghTU8uaXNKVEkoKSAmJiBNTy5nZXRPZmZzZXQoKSkKKyAgICBFeHByID0gTUNCaW5hcnlFeHByOjpDcmVhdGVBZGQoRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb25zdGFudEV4cHI6OkNyZWF0ZShNTy5nZXRPZmZzZXQoKSwgQ3R4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3R4KTsKKyAgcmV0dXJuIE1DT3BlcmFuZDo6Q3JlYXRlRXhwcihFeHByKTsKK30KKworCisKK3N0YXRpYyB2b2lkIGxvd2VyX3N1YnJlZzMyKE1DSW5zdCAqTUksIHVuc2lnbmVkIE9wTm8pIHsKKyAgLy8gQ29udmVydCByZWdpc3RlcnMgaW4gdGhlIGFkZHIgbW9kZSBhY2NvcmRpbmcgdG8gc3VicmVnMzIuCisgIHVuc2lnbmVkIFJlZyA9IE1JLT5nZXRPcGVyYW5kKE9wTm8pLmdldFJlZygpOworICBpZiAoUmVnICE9IDApCisgICAgTUktPmdldE9wZXJhbmQoT3BObykuc2V0UmVnKGdldFg4NlN1YlN1cGVyUmVnaXN0ZXIoUmVnLCBNVlQ6OmkzMikpOworfQorCitzdGF0aWMgdm9pZCBsb3dlcl9sZWE2NF8zMm1lbShNQ0luc3QgKk1JLCB1bnNpZ25lZCBPcE5vKSB7CisgIC8vIENvbnZlcnQgcmVnaXN0ZXJzIGluIHRoZSBhZGRyIG1vZGUgYWNjb3JkaW5nIHRvIHN1YnJlZzY0LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDQ7ICsraSkgeworICAgIGlmICghTUktPmdldE9wZXJhbmQoT3BObytpKS5pc1JlZygpKSBjb250aW51ZTsKKyAgICAKKyAgICB1bnNpZ25lZCBSZWcgPSBNSS0+Z2V0T3BlcmFuZChPcE5vK2kpLmdldFJlZygpOworICAgIGlmIChSZWcgPT0gMCkgY29udGludWU7CisgICAgCisgICAgTUktPmdldE9wZXJhbmQoT3BObytpKS5zZXRSZWcoZ2V0WDg2U3ViU3VwZXJSZWdpc3RlcihSZWcsIE1WVDo6aTY0KSk7CisgIH0KK30KKworLy8vIExvd2VyU3ViUmVnMzJfT3AwIC0gVGhpbmdzIGxpa2UgTU9WWlgxNnJyOCAtPiBNT1ZaWDMycnI4Lgorc3RhdGljIHZvaWQgTG93ZXJTdWJSZWczMl9PcDAoTUNJbnN0ICZPdXRNSSwgdW5zaWduZWQgTmV3T3BjKSB7CisgIE91dE1JLnNldE9wY29kZShOZXdPcGMpOworICBsb3dlcl9zdWJyZWczMigmT3V0TUksIDApOworfQorLy8vIExvd2VyVW5hcnlUb1R3b0FkZHIgLSBSID0gc2V0YiAgIC0+IFIgPSBzYmIgUiwgUgorc3RhdGljIHZvaWQgTG93ZXJVbmFyeVRvVHdvQWRkcihNQ0luc3QgJk91dE1JLCB1bnNpZ25lZCBOZXdPcGMpIHsKKyAgT3V0TUkuc2V0T3Bjb2RlKE5ld09wYyk7CisgIE91dE1JLmFkZE9wZXJhbmQoT3V0TUkuZ2V0T3BlcmFuZCgwKSk7CisgIE91dE1JLmFkZE9wZXJhbmQoT3V0TUkuZ2V0T3BlcmFuZCgwKSk7Cit9CisKKy8vLyBcYnJpZWYgU2ltcGxpZnkgRk9PICRpbW0sICV7YWwsYXgsZWF4LHJheH0gdG8gRk9PICRpbW0sIGZvciBpbnN0cnVjdGlvbiB3aXRoCisvLy8gYSBzaG9ydCBmaXhlZC1yZWdpc3RlciBmb3JtLgorc3RhdGljIHZvaWQgU2ltcGxpZnlTaG9ydEltbUZvcm0oTUNJbnN0ICZJbnN0LCB1bnNpZ25lZCBPcGNvZGUpIHsKKyAgdW5zaWduZWQgSW1tT3AgPSBJbnN0LmdldE51bU9wZXJhbmRzKCkgLSAxOworICBhc3NlcnQoSW5zdC5nZXRPcGVyYW5kKDApLmlzUmVnKCkgJiYgSW5zdC5nZXRPcGVyYW5kKEltbU9wKS5pc0ltbSgpICYmCisgICAgICAgICAoKEluc3QuZ2V0TnVtT3BlcmFuZHMoKSA9PSAzICYmIEluc3QuZ2V0T3BlcmFuZCgxKS5pc1JlZygpICYmCisgICAgICAgICAgIEluc3QuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBJbnN0LmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpIHx8CisgICAgICAgICAgSW5zdC5nZXROdW1PcGVyYW5kcygpID09IDIpICYmICJVbmV4cGVjdGVkIGluc3RydWN0aW9uISIpOworCisgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGNhbiBiZSBmaXhlZC4KKyAgdW5zaWduZWQgUmVnID0gSW5zdC5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICBpZiAoUmVnICE9IFg4Njo6QUwgJiYgUmVnICE9IFg4Njo6QVggJiYgUmVnICE9IFg4Njo6RUFYICYmIFJlZyAhPSBYODY6OlJBWCkKKyAgICByZXR1cm47CisKKyAgLy8gSWYgc28sIHJld3JpdGUgdGhlIGluc3RydWN0aW9uLgorICBNQ09wZXJhbmQgU2F2ZWQgPSBJbnN0LmdldE9wZXJhbmQoSW1tT3ApOworICBJbnN0ID0gTUNJbnN0KCk7CisgIEluc3Quc2V0T3Bjb2RlKE9wY29kZSk7CisgIEluc3QuYWRkT3BlcmFuZChTYXZlZCk7Cit9CisKKy8vLyBcYnJpZWYgU2ltcGxpZnkgdGhpbmdzIGxpa2UgTU9WMzJybSB0byBNT1YzMm8zMmEuCitzdGF0aWMgdm9pZCBTaW1wbGlmeVNob3J0TW92ZUZvcm0oTUNJbnN0ICZJbnN0LCB1bnNpZ25lZCBPcGNvZGUpIHsKKyAgYm9vbCBJc1N0b3JlID0gSW5zdC5nZXRPcGVyYW5kKDApLmlzUmVnKCkgJiYgSW5zdC5nZXRPcGVyYW5kKDEpLmlzUmVnKCk7CisgIHVuc2lnbmVkIEFkZHJCYXNlID0gSXNTdG9yZTsKKyAgdW5zaWduZWQgUmVnT3AgPSBJc1N0b3JlID8gMCA6IDU7CisgIHVuc2lnbmVkIEFkZHJPcCA9IEFkZHJCYXNlICsgMzsKKyAgYXNzZXJ0KEluc3QuZ2V0TnVtT3BlcmFuZHMoKSA9PSA2ICYmIEluc3QuZ2V0T3BlcmFuZChSZWdPcCkuaXNSZWcoKSAmJgorICAgICAgICAgSW5zdC5nZXRPcGVyYW5kKEFkZHJCYXNlICsgMCkuaXNSZWcoKSAmJiAvLyBiYXNlCisgICAgICAgICBJbnN0LmdldE9wZXJhbmQoQWRkckJhc2UgKyAxKS5pc0ltbSgpICYmIC8vIHNjYWxlCisgICAgICAgICBJbnN0LmdldE9wZXJhbmQoQWRkckJhc2UgKyAyKS5pc1JlZygpICYmIC8vIGluZGV4IHJlZ2lzdGVyCisgICAgICAgICAoSW5zdC5nZXRPcGVyYW5kKEFkZHJPcCkuaXNFeHByKCkgfHwgICAgIC8vIGFkZHJlc3MKKyAgICAgICAgICBJbnN0LmdldE9wZXJhbmQoQWRkck9wKS5pc0ltbSgpKSYmCisgICAgICAgICBJbnN0LmdldE9wZXJhbmQoQWRkckJhc2UgKyA0KS5pc1JlZygpICYmIC8vIHNlZ21lbnQKKyAgICAgICAgICJVbmV4cGVjdGVkIGluc3RydWN0aW9uISIpOworCisgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGNhbiBiZSBmaXhlZC4KKyAgdW5zaWduZWQgUmVnID0gSW5zdC5nZXRPcGVyYW5kKFJlZ09wKS5nZXRSZWcoKTsKKyAgaWYgKFJlZyAhPSBYODY6OkFMICYmIFJlZyAhPSBYODY6OkFYICYmIFJlZyAhPSBYODY6OkVBWCAmJiBSZWcgIT0gWDg2OjpSQVgpCisgICAgcmV0dXJuOworCisgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBhYnNvbHV0ZSBhZGRyZXNzLgorICAvLyBGSVhNRTogV2Uga25vdyBUTFZQIHN5bWJvbCByZWZzIGFyZW4ndCwgYnV0IHRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgCisgIC8vIHRvIGRvIHRoaXMgaGVyZS4KKyAgYm9vbCBBYnNvbHV0ZSA9IHRydWU7CisgIGlmIChJbnN0LmdldE9wZXJhbmQoQWRkck9wKS5pc0V4cHIoKSkgeworICAgIGNvbnN0IE1DRXhwciAqTUNFID0gSW5zdC5nZXRPcGVyYW5kKEFkZHJPcCkuZ2V0RXhwcigpOworICAgIGlmIChjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKlNSRSA9IGR5bl9jYXN0PE1DU3ltYm9sUmVmRXhwcj4oTUNFKSkKKyAgICAgIGlmIChTUkUtPmdldEtpbmQoKSA9PSBNQ1N5bWJvbFJlZkV4cHI6OlZLX1RMVlApCisgICAgICAgIEFic29sdXRlID0gZmFsc2U7CisgIH0KKyAgCisgIGlmIChBYnNvbHV0ZSAmJgorICAgICAgKEluc3QuZ2V0T3BlcmFuZChBZGRyQmFzZSArIDApLmdldFJlZygpICE9IDAgfHwKKyAgICAgICBJbnN0LmdldE9wZXJhbmQoQWRkckJhc2UgKyAyKS5nZXRSZWcoKSAhPSAwIHx8CisgICAgICAgSW5zdC5nZXRPcGVyYW5kKEFkZHJCYXNlICsgNCkuZ2V0UmVnKCkgIT0gMCB8fAorICAgICAgIEluc3QuZ2V0T3BlcmFuZChBZGRyQmFzZSArIDEpLmdldEltbSgpICE9IDEpKQorICAgIHJldHVybjsKKworICAvLyBJZiBzbywgcmV3cml0ZSB0aGUgaW5zdHJ1Y3Rpb24uCisgIE1DT3BlcmFuZCBTYXZlZCA9IEluc3QuZ2V0T3BlcmFuZChBZGRyT3ApOworICBJbnN0ID0gTUNJbnN0KCk7CisgIEluc3Quc2V0T3Bjb2RlKE9wY29kZSk7CisgIEluc3QuYWRkT3BlcmFuZChTYXZlZCk7Cit9CisKK3ZvaWQgWDg2TUNJbnN0TG93ZXI6Okxvd2VyKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIE1DSW5zdCAmT3V0TUkpIGNvbnN0IHsKKyAgT3V0TUkuc2V0T3Bjb2RlKE1JLT5nZXRPcGNvZGUoKSk7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUktPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gTUktPmdldE9wZXJhbmQoaSk7CisgICAgCisgICAgTUNPcGVyYW5kIE1DT3A7CisgICAgc3dpdGNoIChNTy5nZXRUeXBlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgTUktPmR1bXAoKTsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoInVua25vd24gb3BlcmFuZCB0eXBlIik7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fUmVnaXN0ZXI6CisgICAgICAvLyBJZ25vcmUgYWxsIGltcGxpY2l0IHJlZ2lzdGVyIG9wZXJhbmRzLgorICAgICAgaWYgKE1PLmlzSW1wbGljaXQoKSkgY29udGludWU7CisgICAgICBNQ09wID0gTUNPcGVyYW5kOjpDcmVhdGVSZWcoTU8uZ2V0UmVnKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSW1tZWRpYXRlOgorICAgICAgTUNPcCA9IE1DT3BlcmFuZDo6Q3JlYXRlSW1tKE1PLmdldEltbSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrOgorICAgICAgTUNPcCA9IE1DT3BlcmFuZDo6Q3JlYXRlRXhwcihNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgTU8uZ2V0TUJCKCktPmdldFN5bWJvbCgpLCBDdHgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0dsb2JhbEFkZHJlc3M6CisgICAgICBNQ09wID0gTG93ZXJTeW1ib2xPcGVyYW5kKE1PLCBHZXRTeW1ib2xGcm9tT3BlcmFuZChNTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fRXh0ZXJuYWxTeW1ib2w6CisgICAgICBNQ09wID0gTG93ZXJTeW1ib2xPcGVyYW5kKE1PLCBHZXRTeW1ib2xGcm9tT3BlcmFuZChNTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXg6CisgICAgICBNQ09wID0gTG93ZXJTeW1ib2xPcGVyYW5kKE1PLCBBc21QcmludGVyLkdldEpUSVN5bWJvbChNTy5nZXRJbmRleCgpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19Db25zdGFudFBvb2xJbmRleDoKKyAgICAgIE1DT3AgPSBMb3dlclN5bWJvbE9wZXJhbmQoTU8sIEFzbVByaW50ZXIuR2V0Q1BJU3ltYm9sKE1PLmdldEluZGV4KCkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0Jsb2NrQWRkcmVzczoKKyAgICAgIE1DT3AgPSBMb3dlclN5bWJvbE9wZXJhbmQoTU8sCisgICAgICAgICAgICAgICAgICAgICBBc21QcmludGVyLkdldEJsb2NrQWRkcmVzc1N5bWJvbChNTy5nZXRCbG9ja0FkZHJlc3MoKSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIE91dE1JLmFkZE9wZXJhbmQoTUNPcCk7CisgIH0KKyAgCisgIC8vIEhhbmRsZSBhIGZldyBzcGVjaWFsIGNhc2VzIHRvIGVsaW1pbmF0ZSBvcGVyYW5kIG1vZGlmaWVycy4KKyAgc3dpdGNoIChPdXRNSS5nZXRPcGNvZGUoKSkgeworICBjYXNlIFg4Njo6TEVBNjRfMzJyOiAvLyBIYW5kbGUgJ3N1YnJlZyByZXdyaXRpbmcnIGZvciB0aGUgbGVhNjRfMzJtZW0gb3BlcmFuZC4KKyAgICBsb3dlcl9sZWE2NF8zMm1lbSgmT3V0TUksIDEpOworICAgIC8vIEZBTEwgVEhST1VHSC4KKyAgY2FzZSBYODY6OkxFQTY0cjoKKyAgY2FzZSBYODY6OkxFQTE2cjoKKyAgY2FzZSBYODY6OkxFQTMycjoKKyAgICAvLyBMRUEgc2hvdWxkIGhhdmUgYSBzZWdtZW50IHJlZ2lzdGVyLCBidXQgaXQgbXVzdCBiZSBlbXB0eS4KKyAgICBhc3NlcnQoT3V0TUkuZ2V0TnVtT3BlcmFuZHMoKSA9PSAxK1g4Njo6QWRkck51bU9wZXJhbmRzICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkICMgb2YgTEVBIG9wZXJhbmRzIik7CisgICAgYXNzZXJ0KE91dE1JLmdldE9wZXJhbmQoMStYODY6OkFkZHJTZWdtZW50UmVnKS5nZXRSZWcoKSA9PSAwICYmCisgICAgICAgICAgICJMRUEgaGFzIHNlZ21lbnQgc3BlY2lmaWVkISIpOworICAgIGJyZWFrOworICBjYXNlIFg4Njo6TU9WWlgxNnJyODogICBMb3dlclN1YlJlZzMyX09wMChPdXRNSSwgWDg2OjpNT1ZaWDMycnI4KTsgYnJlYWs7CisgIGNhc2UgWDg2OjpNT1ZaWDE2cm04OiAgIExvd2VyU3ViUmVnMzJfT3AwKE91dE1JLCBYODY6Ok1PVlpYMzJybTgpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1PVlNYMTZycjg6ICAgTG93ZXJTdWJSZWczMl9PcDAoT3V0TUksIFg4Njo6TU9WU1gzMnJyOCk7IGJyZWFrOworICBjYXNlIFg4Njo6TU9WU1gxNnJtODogICBMb3dlclN1YlJlZzMyX09wMChPdXRNSSwgWDg2OjpNT1ZTWDMycm04KTsgYnJlYWs7CisgIGNhc2UgWDg2OjpNT1ZaWDY0cnIzMjogIExvd2VyU3ViUmVnMzJfT3AwKE91dE1JLCBYODY6Ok1PVjMycnIpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1PVlpYNjRybTMyOiAgTG93ZXJTdWJSZWczMl9PcDAoT3V0TUksIFg4Njo6TU9WMzJybSk7IGJyZWFrOworICBjYXNlIFg4Njo6TU9WNjRyaTY0aTMyOiBMb3dlclN1YlJlZzMyX09wMChPdXRNSSwgWDg2OjpNT1YzMnJpKTsgYnJlYWs7CisgIGNhc2UgWDg2OjpNT1ZaWDY0cnI4OiAgIExvd2VyU3ViUmVnMzJfT3AwKE91dE1JLCBYODY6Ok1PVlpYMzJycjgpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1PVlpYNjRybTg6ICAgTG93ZXJTdWJSZWczMl9PcDAoT3V0TUksIFg4Njo6TU9WWlgzMnJtOCk7IGJyZWFrOworICBjYXNlIFg4Njo6TU9WWlg2NHJyMTY6ICBMb3dlclN1YlJlZzMyX09wMChPdXRNSSwgWDg2OjpNT1ZaWDMycnIxNik7IGJyZWFrOworICBjYXNlIFg4Njo6TU9WWlg2NHJtMTY6ICBMb3dlclN1YlJlZzMyX09wMChPdXRNSSwgWDg2OjpNT1ZaWDMycm0xNik7IGJyZWFrOworICBjYXNlIFg4Njo6U0VUQl9DOHI6ICAgICBMb3dlclVuYXJ5VG9Ud29BZGRyKE91dE1JLCBYODY6OlNCQjhycik7IGJyZWFrOworICBjYXNlIFg4Njo6U0VUQl9DMTZyOiAgICBMb3dlclVuYXJ5VG9Ud29BZGRyKE91dE1JLCBYODY6OlNCQjE2cnIpOyBicmVhazsKKyAgY2FzZSBYODY6OlNFVEJfQzMycjogICAgTG93ZXJVbmFyeVRvVHdvQWRkcihPdXRNSSwgWDg2OjpTQkIzMnJyKTsgYnJlYWs7CisgIGNhc2UgWDg2OjpTRVRCX0M2NHI6ICAgIExvd2VyVW5hcnlUb1R3b0FkZHIoT3V0TUksIFg4Njo6U0JCNjRycik7IGJyZWFrOworICBjYXNlIFg4Njo6TU9WOHIwOiAgICAgICBMb3dlclVuYXJ5VG9Ud29BZGRyKE91dE1JLCBYODY6OlhPUjhycik7IGJyZWFrOworICBjYXNlIFg4Njo6TU9WMzJyMDogICAgICBMb3dlclVuYXJ5VG9Ud29BZGRyKE91dE1JLCBYODY6OlhPUjMycnIpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1NWF9WX1NFVDA6ICAgTG93ZXJVbmFyeVRvVHdvQWRkcihPdXRNSSwgWDg2OjpNTVhfUFhPUnJyKTsgYnJlYWs7CisgIGNhc2UgWDg2OjpNTVhfVl9TRVRBTExPTkVTOgorICAgIExvd2VyVW5hcnlUb1R3b0FkZHIoT3V0TUksIFg4Njo6TU1YX1BDTVBFUURycik7IGJyZWFrOworICBjYXNlIFg4Njo6RnNGTEQwU1M6ICAgICBMb3dlclVuYXJ5VG9Ud29BZGRyKE91dE1JLCBYODY6OlBYT1Jycik7IGJyZWFrOworICBjYXNlIFg4Njo6RnNGTEQwU0Q6ICAgICBMb3dlclVuYXJ5VG9Ud29BZGRyKE91dE1JLCBYODY6OlBYT1Jycik7IGJyZWFrOworICBjYXNlIFg4Njo6Vl9TRVQwUFM6ICAgICBMb3dlclVuYXJ5VG9Ud29BZGRyKE91dE1JLCBYODY6OlhPUlBTcnIpOyBicmVhazsKKyAgY2FzZSBYODY6OlZfU0VUMFBEOiAgICAgTG93ZXJVbmFyeVRvVHdvQWRkcihPdXRNSSwgWDg2OjpYT1JQRHJyKTsgYnJlYWs7CisgIGNhc2UgWDg2OjpWX1NFVDBQSTogICAgIExvd2VyVW5hcnlUb1R3b0FkZHIoT3V0TUksIFg4Njo6UFhPUnJyKTsgYnJlYWs7CisgIGNhc2UgWDg2OjpWX1NFVEFMTE9ORVM6IExvd2VyVW5hcnlUb1R3b0FkZHIoT3V0TUksIFg4Njo6UENNUEVRRHJyKTsgYnJlYWs7CisKKyAgY2FzZSBYODY6Ok1PVjE2cjA6CisgICAgTG93ZXJTdWJSZWczMl9PcDAoT3V0TUksIFg4Njo6TU9WMzJyMCk7ICAgLy8gTU9WMTZyMCAtPiBNT1YzMnIwCisgICAgTG93ZXJVbmFyeVRvVHdvQWRkcihPdXRNSSwgWDg2OjpYT1IzMnJyKTsgLy8gTU9WMzJyMCAtPiBYT1IzMnJyCisgICAgYnJlYWs7CisgIGNhc2UgWDg2OjpNT1Y2NHIwOgorICAgIExvd2VyU3ViUmVnMzJfT3AwKE91dE1JLCBYODY6Ok1PVjMycjApOyAgIC8vIE1PVjY0cjAgLT4gTU9WMzJyMAorICAgIExvd2VyVW5hcnlUb1R3b0FkZHIoT3V0TUksIFg4Njo6WE9SMzJycik7IC8vIE1PVjMycjAgLT4gWE9SMzJycgorICAgIGJyZWFrOworCisgIC8vIFRBSUxKTVByNjQsIENBTEw2NHIsIENBTEw2NHBjcmVsMzIgLSBUaGVzZSBpbnN0cnVjdGlvbnMgaGF2ZQorICAvLyByZWdpc3RlciBpbnB1dHMgbW9kZWxlZCBhcyBub3JtYWwgdXNlcyBpbnN0ZWFkIG9mIGltcGxpY2l0IHVzZXMuICBBcyBzdWNoLAorICAvLyB0cnVuY2F0ZSBvZmYgYWxsIGJ1dCB0aGUgZmlyc3Qgb3BlcmFuZCAodGhlIGNhbGxlZSkuICBGSVhNRTogQ2hhbmdlIGlzZWwuCisgIGNhc2UgWDg2OjpUQUlMSk1QcjY0OgorICBjYXNlIFg4Njo6Q0FMTDY0cjoKKyAgY2FzZSBYODY6OkNBTEw2NHBjcmVsMzI6IHsKKyAgICB1bnNpZ25lZCBPcGNvZGUgPSBPdXRNSS5nZXRPcGNvZGUoKTsKKyAgICBNQ09wZXJhbmQgU2F2ZWQgPSBPdXRNSS5nZXRPcGVyYW5kKDApOworICAgIE91dE1JID0gTUNJbnN0KCk7CisgICAgT3V0TUkuc2V0T3Bjb2RlKE9wY29kZSk7CisgICAgT3V0TUkuYWRkT3BlcmFuZChTYXZlZCk7CisgICAgYnJlYWs7CisgIH0KKworICAvLyBUQUlMSk1QZCwgVEFJTEpNUGQ2NCAtIExvd2VyIHRvIHRoZSBjb3JyZWN0IGp1bXAgaW5zdHJ1Y3Rpb25zLgorICBjYXNlIFg4Njo6VEFJTEpNUHI6CisgIGNhc2UgWDg2OjpUQUlMSk1QZDoKKyAgY2FzZSBYODY6OlRBSUxKTVBkNjQ6IHsKKyAgICB1bnNpZ25lZCBPcGNvZGU7CisgICAgc3dpdGNoIChPdXRNSS5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJJbnZhbGlkIG9wY29kZSIpOworICAgIGNhc2UgWDg2OjpUQUlMSk1QcjogT3Bjb2RlID0gWDg2OjpKTVAzMnI7IGJyZWFrOworICAgIGNhc2UgWDg2OjpUQUlMSk1QZDoKKyAgICBjYXNlIFg4Njo6VEFJTEpNUGQ2NDogT3Bjb2RlID0gWDg2OjpKTVBfMTsgYnJlYWs7CisgICAgfQorICAgIAorICAgIE1DT3BlcmFuZCBTYXZlZCA9IE91dE1JLmdldE9wZXJhbmQoMCk7CisgICAgT3V0TUkgPSBNQ0luc3QoKTsKKyAgICBPdXRNSS5zZXRPcGNvZGUoT3Bjb2RlKTsKKyAgICBPdXRNSS5hZGRPcGVyYW5kKFNhdmVkKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8vIFRoZSBhc3NlbWJsZXIgYmFja2VuZCB3YW50cyB0byBzZWUgYnJhbmNoZXMgaW4gdGhlaXIgc21hbGwgZm9ybSBhbmQgcmVsYXgKKyAgLy8gdGhlbSB0byB0aGVpciBsYXJnZSBmb3JtLiAgVGhlIEpJVCBjYW4gb25seSBoYW5kbGUgdGhlIGxhcmdlIGZvcm0gYmVjYXVzZQorICAvLyBpdCBkb2VzIG5vdCBkbyByZWxheGF0aW9uLiAgRm9yIG5vdywgdHJhbnNsYXRlIHRoZSBsYXJnZSBmb3JtIHRvIHRoZQorICAvLyBzbWFsbCBvbmUgaGVyZS4KKyAgY2FzZSBYODY6OkpNUF80OiBPdXRNSS5zZXRPcGNvZGUoWDg2OjpKTVBfMSk7IGJyZWFrOworICBjYXNlIFg4Njo6Sk9fNDogIE91dE1JLnNldE9wY29kZShYODY6OkpPXzEpOyBicmVhazsKKyAgY2FzZSBYODY6OkpOT180OiBPdXRNSS5zZXRPcGNvZGUoWDg2OjpKTk9fMSk7IGJyZWFrOworICBjYXNlIFg4Njo6SkJfNDogIE91dE1JLnNldE9wY29kZShYODY6OkpCXzEpOyBicmVhazsKKyAgY2FzZSBYODY6OkpBRV80OiBPdXRNSS5zZXRPcGNvZGUoWDg2OjpKQUVfMSk7IGJyZWFrOworICBjYXNlIFg4Njo6SkVfNDogIE91dE1JLnNldE9wY29kZShYODY6OkpFXzEpOyBicmVhazsKKyAgY2FzZSBYODY6OkpORV80OiBPdXRNSS5zZXRPcGNvZGUoWDg2OjpKTkVfMSk7IGJyZWFrOworICBjYXNlIFg4Njo6SkJFXzQ6IE91dE1JLnNldE9wY29kZShYODY6OkpCRV8xKTsgYnJlYWs7CisgIGNhc2UgWDg2OjpKQV80OiAgT3V0TUkuc2V0T3Bjb2RlKFg4Njo6SkFfMSk7IGJyZWFrOworICBjYXNlIFg4Njo6SlNfNDogIE91dE1JLnNldE9wY29kZShYODY6OkpTXzEpOyBicmVhazsKKyAgY2FzZSBYODY6OkpOU180OiBPdXRNSS5zZXRPcGNvZGUoWDg2OjpKTlNfMSk7IGJyZWFrOworICBjYXNlIFg4Njo6SlBfNDogIE91dE1JLnNldE9wY29kZShYODY6OkpQXzEpOyBicmVhazsKKyAgY2FzZSBYODY6OkpOUF80OiBPdXRNSS5zZXRPcGNvZGUoWDg2OjpKTlBfMSk7IGJyZWFrOworICBjYXNlIFg4Njo6SkxfNDogIE91dE1JLnNldE9wY29kZShYODY6OkpMXzEpOyBicmVhazsKKyAgY2FzZSBYODY6OkpHRV80OiBPdXRNSS5zZXRPcGNvZGUoWDg2OjpKR0VfMSk7IGJyZWFrOworICBjYXNlIFg4Njo6SkxFXzQ6IE91dE1JLnNldE9wY29kZShYODY6OkpMRV8xKTsgYnJlYWs7CisgIGNhc2UgWDg2OjpKR180OiAgT3V0TUkuc2V0T3Bjb2RlKFg4Njo6SkdfMSk7IGJyZWFrOworCisgIC8vIFdlIGRvbid0IGN1cnJlbnRseSBzZWxlY3QgdGhlIGNvcnJlY3QgaW5zdHJ1Y3Rpb24gZm9ybSBmb3IgaW5zdHJ1Y3Rpb25zCisgIC8vIHdoaWNoIGhhdmUgYSBzaG9ydCAlZWF4LCBldGMuIGZvcm0uIEhhbmRsZSB0aGlzIGJ5IGN1c3RvbSBsb3dlcmluZywgZm9yCisgIC8vIG5vdy4KKyAgLy8KKyAgLy8gTm90ZSwgd2UgYXJlIGN1cnJlbnRseSBub3QgaGFuZGxpbmcgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnM6CisgIC8vIE1PVjY0YW84LCBNT1Y2NG84YQorICAvLyBYQ0hHMTZhciwgWENIRzMyYXIsIFhDSEc2NGFyCisgIGNhc2UgWDg2OjpNT1Y4bXJfTk9SRVg6CisgIGNhc2UgWDg2OjpNT1Y4bXI6ICAgICBTaW1wbGlmeVNob3J0TW92ZUZvcm0oT3V0TUksIFg4Njo6TU9WOGFvOCk7IGJyZWFrOworICBjYXNlIFg4Njo6TU9WOHJtX05PUkVYOgorICBjYXNlIFg4Njo6TU9WOHJtOiAgICAgU2ltcGxpZnlTaG9ydE1vdmVGb3JtKE91dE1JLCBYODY6Ok1PVjhvOGEpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1PVjE2bXI6ICAgIFNpbXBsaWZ5U2hvcnRNb3ZlRm9ybShPdXRNSSwgWDg2OjpNT1YxNmFvMTYpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1PVjE2cm06ICAgIFNpbXBsaWZ5U2hvcnRNb3ZlRm9ybShPdXRNSSwgWDg2OjpNT1YxNm8xNmEpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1PVjMybXI6ICAgIFNpbXBsaWZ5U2hvcnRNb3ZlRm9ybShPdXRNSSwgWDg2OjpNT1YzMmFvMzIpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1PVjMycm06ICAgIFNpbXBsaWZ5U2hvcnRNb3ZlRm9ybShPdXRNSSwgWDg2OjpNT1YzMm8zMmEpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1PVjY0bXI6ICAgIFNpbXBsaWZ5U2hvcnRNb3ZlRm9ybShPdXRNSSwgWDg2OjpNT1Y2NGFvNjQpOyBicmVhazsKKyAgY2FzZSBYODY6Ok1PVjY0cm06ICAgIFNpbXBsaWZ5U2hvcnRNb3ZlRm9ybShPdXRNSSwgWDg2OjpNT1Y2NG82NGEpOyBicmVhazsKKworICBjYXNlIFg4Njo6QURDOHJpOiAgICAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6QURDOGk4KTsgICAgYnJlYWs7CisgIGNhc2UgWDg2OjpBREMxNnJpOiAgICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpBREMxNmkxNik7ICBicmVhazsKKyAgY2FzZSBYODY6OkFEQzMycmk6ICAgIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OkFEQzMyaTMyKTsgIGJyZWFrOworICBjYXNlIFg4Njo6QURDNjRyaTMyOiAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6QURDNjRpMzIpOyAgYnJlYWs7CisgIGNhc2UgWDg2OjpBREQ4cmk6ICAgICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpBREQ4aTgpOyAgICBicmVhazsKKyAgY2FzZSBYODY6OkFERDE2cmk6ICAgIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OkFERDE2aTE2KTsgIGJyZWFrOworICBjYXNlIFg4Njo6QUREMzJyaTogICAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6QUREMzJpMzIpOyAgYnJlYWs7CisgIGNhc2UgWDg2OjpBREQ2NHJpMzI6ICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpBREQ2NGkzMik7ICBicmVhazsKKyAgY2FzZSBYODY6OkFORDhyaTogICAgIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OkFORDhpOCk7ICAgIGJyZWFrOworICBjYXNlIFg4Njo6QU5EMTZyaTogICAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6QU5EMTZpMTYpOyAgYnJlYWs7CisgIGNhc2UgWDg2OjpBTkQzMnJpOiAgICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpBTkQzMmkzMik7ICBicmVhazsKKyAgY2FzZSBYODY6OkFORDY0cmkzMjogIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OkFORDY0aTMyKTsgIGJyZWFrOworICBjYXNlIFg4Njo6Q01QOHJpOiAgICAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6Q01QOGk4KTsgICAgYnJlYWs7CisgIGNhc2UgWDg2OjpDTVAxNnJpOiAgICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpDTVAxNmkxNik7ICBicmVhazsKKyAgY2FzZSBYODY6OkNNUDMycmk6ICAgIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OkNNUDMyaTMyKTsgIGJyZWFrOworICBjYXNlIFg4Njo6Q01QNjRyaTMyOiAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6Q01QNjRpMzIpOyAgYnJlYWs7CisgIGNhc2UgWDg2OjpPUjhyaTogICAgICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpPUjhpOCk7ICAgICBicmVhazsKKyAgY2FzZSBYODY6Ok9SMTZyaTogICAgIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6Ok9SMTZpMTYpOyAgIGJyZWFrOworICBjYXNlIFg4Njo6T1IzMnJpOiAgICAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6T1IzMmkzMik7ICAgYnJlYWs7CisgIGNhc2UgWDg2OjpPUjY0cmkzMjogICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpPUjY0aTMyKTsgICBicmVhazsKKyAgY2FzZSBYODY6OlNCQjhyaTogICAgIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OlNCQjhpOCk7ICAgIGJyZWFrOworICBjYXNlIFg4Njo6U0JCMTZyaTogICAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6U0JCMTZpMTYpOyAgYnJlYWs7CisgIGNhc2UgWDg2OjpTQkIzMnJpOiAgICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpTQkIzMmkzMik7ICBicmVhazsKKyAgY2FzZSBYODY6OlNCQjY0cmkzMjogIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OlNCQjY0aTMyKTsgIGJyZWFrOworICBjYXNlIFg4Njo6U1VCOHJpOiAgICAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6U1VCOGk4KTsgICAgYnJlYWs7CisgIGNhc2UgWDg2OjpTVUIxNnJpOiAgICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpTVUIxNmkxNik7ICBicmVhazsKKyAgY2FzZSBYODY6OlNVQjMycmk6ICAgIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OlNVQjMyaTMyKTsgIGJyZWFrOworICBjYXNlIFg4Njo6U1VCNjRyaTMyOiAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6U1VCNjRpMzIpOyAgYnJlYWs7CisgIGNhc2UgWDg2OjpURVNUOHJpOiAgICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpURVNUOGk4KTsgICBicmVhazsKKyAgY2FzZSBYODY6OlRFU1QxNnJpOiAgIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OlRFU1QxNmkxNik7IGJyZWFrOworICBjYXNlIFg4Njo6VEVTVDMycmk6ICAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6VEVTVDMyaTMyKTsgYnJlYWs7CisgIGNhc2UgWDg2OjpURVNUNjRyaTMyOiBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpURVNUNjRpMzIpOyBicmVhazsKKyAgY2FzZSBYODY6OlhPUjhyaTogICAgIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OlhPUjhpOCk7ICAgIGJyZWFrOworICBjYXNlIFg4Njo6WE9SMTZyaTogICAgU2ltcGxpZnlTaG9ydEltbUZvcm0oT3V0TUksIFg4Njo6WE9SMTZpMTYpOyAgYnJlYWs7CisgIGNhc2UgWDg2OjpYT1IzMnJpOiAgICBTaW1wbGlmeVNob3J0SW1tRm9ybShPdXRNSSwgWDg2OjpYT1IzMmkzMik7ICBicmVhazsKKyAgY2FzZSBYODY6OlhPUjY0cmkzMjogIFNpbXBsaWZ5U2hvcnRJbW1Gb3JtKE91dE1JLCBYODY6OlhPUjY0aTMyKTsgIGJyZWFrOworICB9Cit9CisKKwordm9pZCBYODZBc21QcmludGVyOjpFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSkgeworICBYODZNQ0luc3RMb3dlciBNQ0luc3RMb3dlcmluZyhNYW5nLCAqTUYsICp0aGlzKTsKKyAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBUYXJnZXRPcGNvZGU6OkRCR19WQUxVRToKKyAgICBpZiAoaXNWZXJib3NlKCkgJiYgT3V0U3RyZWFtZXIuaGFzUmF3VGV4dFN1cHBvcnQoKSkgeworICAgICAgc3RkOjpzdHJpbmcgVG1wU3RyOworICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKFRtcFN0cik7CisgICAgICBQcmludERlYnVnVmFsdWVDb21tZW50KE1JLCBPUyk7CisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChTdHJpbmdSZWYoT1Muc3RyKCkpKTsKKyAgICB9CisgICAgcmV0dXJuOworCisgIC8vIEVtaXQgbm90aGluZyBoZXJlIGJ1dCBhIGNvbW1lbnQgaWYgd2UgY2FuLgorICBjYXNlIFg4Njo6SW50X01lbUJhcnJpZXI6CisgICAgaWYgKE91dFN0cmVhbWVyLmhhc1Jhd1RleHRTdXBwb3J0KCkpCisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChTdHJpbmdSZWYoIlx0I01FTUJBUlJJRVIiKSk7CisgICAgcmV0dXJuOworICAgICAgICAKKyAgY2FzZSBYODY6OlRBSUxKTVByOgorICBjYXNlIFg4Njo6VEFJTEpNUGQ6CisgIGNhc2UgWDg2OjpUQUlMSk1QZDY0OgorICAgIC8vIExvd2VyIHRoZXNlIGFzIG5vcm1hbCwgYnV0IGFkZCBzb21lIGNvbW1lbnRzLgorICAgIE91dFN0cmVhbWVyLkFkZENvbW1lbnQoIlRBSUxDQUxMIik7CisgICAgYnJlYWs7CisgICAgICAKKyAgY2FzZSBYODY6Ok1PVlBDMzJyOiB7CisgICAgTUNJbnN0IFRtcEluc3Q7CisgICAgLy8gVGhpcyBpcyBhIHBzZXVkbyBvcCBmb3IgYSB0d28gaW5zdHJ1Y3Rpb24gc2VxdWVuY2Ugd2l0aCBhIGxhYmVsLCB3aGljaAorICAgIC8vIGxvb2tzIGxpa2U6CisgICAgLy8gICAgIGNhbGwgIkwxJHBiIgorICAgIC8vICJMMSRwYiI6CisgICAgLy8gICAgIHBvcGwgJWVzaQorICAgIAorICAgIC8vIEVtaXQgdGhlIGNhbGwuCisgICAgTUNTeW1ib2wgKlBJQ0Jhc2UgPSBNQ0luc3RMb3dlcmluZy5HZXRQSUNCYXNlU3ltYm9sKCk7CisgICAgVG1wSW5zdC5zZXRPcGNvZGUoWDg2OjpDQUxMcGNyZWwzMik7CisgICAgLy8gRklYTUU6IFdlIHdvdWxkIGxpa2UgYW4gZWZmaWNpZW50IGZvcm0gZm9yIHRoaXMsIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYQorICAgIC8vIGxvdCBvZiBleHRyYSB1bmlxdWluZy4KKyAgICBUbXBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVFeHByKE1DU3ltYm9sUmVmRXhwcjo6Q3JlYXRlKFBJQ0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dENvbnRleHQpKSk7CisgICAgT3V0U3RyZWFtZXIuRW1pdEluc3RydWN0aW9uKFRtcEluc3QpOworICAgIAorICAgIC8vIEVtaXQgdGhlIGxhYmVsLgorICAgIE91dFN0cmVhbWVyLkVtaXRMYWJlbChQSUNCYXNlKTsKKyAgICAKKyAgICAvLyBwb3BsICRyZWcKKyAgICBUbXBJbnN0LnNldE9wY29kZShYODY6OlBPUDMycik7CisgICAgVG1wSW5zdC5nZXRPcGVyYW5kKDApID0gTUNPcGVyYW5kOjpDcmVhdGVSZWcoTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpOworICAgIE91dFN0cmVhbWVyLkVtaXRJbnN0cnVjdGlvbihUbXBJbnN0KTsKKyAgICByZXR1cm47CisgIH0KKyAgICAgIAorICBjYXNlIFg4Njo6QUREMzJyaTogeworICAgIC8vIExvd2VyIHRoZSBNT19HT1RfQUJTT0xVVEVfQUREUkVTUyBmb3JtIG9mIEFERDMycmkuCisgICAgaWYgKE1JLT5nZXRPcGVyYW5kKDIpLmdldFRhcmdldEZsYWdzKCkgIT0gWDg2SUk6Ok1PX0dPVF9BQlNPTFVURV9BRERSRVNTKQorICAgICAgYnJlYWs7CisgICAgCisgICAgLy8gT2theSwgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZToKKyAgICAvLyAgRUFYID0gQUREMzJyaSBFQVgsIE1PX0dPVF9BQlNPTFVURV9BRERSRVNTKEBNWUdMT0JBTCkKKyAgICAKKyAgICAvLyBGb3IgdGhpcywgd2Ugd2FudCB0byBwcmludCBzb21ldGhpbmcgbGlrZToKKyAgICAvLyAgIE1ZR0xPQkFMICsgKC4gLSBQSUNCQVNFKQorICAgIC8vIEhvd2V2ZXIsIHdlIGNhbid0IGdlbmVyYXRlIGEgIi4iLCBzbyBqdXN0IGVtaXQgYSBuZXcgbGFiZWwgaGVyZSBhbmQgcmVmZXIKKyAgICAvLyB0byBpdC4KKyAgICBNQ1N5bWJvbCAqRG90U3ltID0gT3V0Q29udGV4dC5DcmVhdGVUZW1wU3ltYm9sKCk7CisgICAgT3V0U3RyZWFtZXIuRW1pdExhYmVsKERvdFN5bSk7CisgICAgCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBlbWl0dGVkIHRoZSBsYWJlbCwgbG93ZXIgdGhlIGNvbXBsZXggb3BlcmFuZCBleHByZXNzaW9uLgorICAgIE1DU3ltYm9sICpPcFN5bSA9IE1DSW5zdExvd2VyaW5nLkdldFN5bWJvbEZyb21PcGVyYW5kKE1JLT5nZXRPcGVyYW5kKDIpKTsKKyAgICAKKyAgICBjb25zdCBNQ0V4cHIgKkRvdEV4cHIgPSBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShEb3RTeW0sIE91dENvbnRleHQpOworICAgIGNvbnN0IE1DRXhwciAqUElDQmFzZSA9CisgICAgICBNQ1N5bWJvbFJlZkV4cHI6OkNyZWF0ZShNQ0luc3RMb3dlcmluZy5HZXRQSUNCYXNlU3ltYm9sKCksIE91dENvbnRleHQpOworICAgIERvdEV4cHIgPSBNQ0JpbmFyeUV4cHI6OkNyZWF0ZVN1YihEb3RFeHByLCBQSUNCYXNlLCBPdXRDb250ZXh0KTsKKyAgICAKKyAgICBEb3RFeHByID0gTUNCaW5hcnlFeHByOjpDcmVhdGVBZGQoTUNTeW1ib2xSZWZFeHByOjpDcmVhdGUoT3BTeW0sT3V0Q29udGV4dCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3RFeHByLCBPdXRDb250ZXh0KTsKKyAgICAKKyAgICBNQ0luc3QgVG1wSW5zdDsKKyAgICBUbXBJbnN0LnNldE9wY29kZShYODY6OkFERDMycmkpOworICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkpOworICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZyhNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkpOworICAgIFRtcEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZUV4cHIoRG90RXhwcikpOworICAgIE91dFN0cmVhbWVyLkVtaXRJbnN0cnVjdGlvbihUbXBJbnN0KTsKKyAgICByZXR1cm47CisgIH0KKyAgfQorICAKKyAgTUNJbnN0IFRtcEluc3Q7CisgIE1DSW5zdExvd2VyaW5nLkxvd2VyKE1JLCBUbXBJbnN0KTsKKyAgT3V0U3RyZWFtZXIuRW1pdEluc3RydWN0aW9uKFRtcEluc3QpOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZNQ0luc3RMb3dlci5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2TUNJbnN0TG93ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzliMDliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2TUNJbnN0TG93ZXIuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0tIFg4Nk1DSW5zdExvd2VyLmggLSBMb3dlciBNYWNoaW5lSW5zdHIgdG8gTUNJbnN0IC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFg4Nl9NQ0lOU1RMT1dFUl9ICisjZGVmaW5lIFg4Nl9NQ0lOU1RMT1dFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNQ0FzbUluZm87CisgIGNsYXNzIE1DQ29udGV4dDsKKyAgY2xhc3MgTUNJbnN0OworICBjbGFzcyBNQ09wZXJhbmQ7CisgIGNsYXNzIE1DU3ltYm9sOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKyAgY2xhc3MgTWFjaGluZU1vZHVsZUluZm9NYWNoTzsKKyAgY2xhc3MgTWFjaGluZU9wZXJhbmQ7CisgIGNsYXNzIE1hbmdsZXI7CisgIGNsYXNzIFRhcmdldE1hY2hpbmU7CisgIGNsYXNzIFg4NkFzbVByaW50ZXI7CisgIAorLy8vIFg4Nk1DSW5zdExvd2VyIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGxvd2VyIGFuIE1hY2hpbmVJbnN0ciBpbnRvIGFuIE1DSW5zdC4KK2NsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIFg4Nk1DSW5zdExvd2VyIHsKKyAgTUNDb250ZXh0ICZDdHg7CisgIE1hbmdsZXIgKk1hbmc7CisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUY7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNOworICBjb25zdCBNQ0FzbUluZm8gJk1BSTsKKyAgWDg2QXNtUHJpbnRlciAmQXNtUHJpbnRlcjsKK3B1YmxpYzoKKyAgWDg2TUNJbnN0TG93ZXIoTWFuZ2xlciAqbWFuZywgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgWDg2QXNtUHJpbnRlciAmYXNtcHJpbnRlcik7CisgIAorICB2b2lkIExvd2VyKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIE1DSW5zdCAmT3V0TUkpIGNvbnN0OworCisgIE1DU3ltYm9sICpHZXRQSUNCYXNlU3ltYm9sKCkgY29uc3Q7CisgIAorICBNQ1N5bWJvbCAqR2V0U3ltYm9sRnJvbU9wZXJhbmQoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdDsKKyAgTUNPcGVyYW5kIExvd2VyU3ltYm9sT3BlcmFuZChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8sIE1DU3ltYm9sICpTeW0pIGNvbnN0OworICAKK3ByaXZhdGU6CisgIE1hY2hpbmVNb2R1bGVJbmZvTWFjaE8gJmdldE1hY2hPTU1JKCkgY29uc3Q7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2TWFjaGluZUZ1bmN0aW9uSW5mby5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2TWFjaGluZUZ1bmN0aW9uSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDQzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZNYWNoaW5lRnVuY3Rpb25JbmZvLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8vPT09PS0gWDg2TWFjaGluZUZ1Y3Rpb25JbmZvLmggLSBYODYgbWFjaGluZSBmdW5jdGlvbiBpbmZvIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgWDg2LXNwZWNpZmljIHBlci1tYWNoaW5lLWZ1bmN0aW9uIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWDg2TUFDSElORUZVTkNUSU9OSU5GT19ICisjZGVmaW5lIFg4Nk1BQ0hJTkVGVU5DVElPTklORk9fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBYODZNYWNoaW5lRnVuY3Rpb25JbmZvIC0gVGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gTWFjaGluZUZ1bmN0aW9uIGFuZAorLy8vIGNvbnRhaW5zIHByaXZhdGUgWDg2IHRhcmdldC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBNYWNoaW5lRnVuY3Rpb24uCitjbGFzcyBYODZNYWNoaW5lRnVuY3Rpb25JbmZvIDogcHVibGljIE1hY2hpbmVGdW5jdGlvbkluZm8geworICAvLy8gRm9yY2VGcmFtZVBvaW50ZXIgLSBUcnVlIGlmIHRoZSBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byB1c2Ugb2YgZnJhbWUKKyAgLy8vIHBvaW50ZXIgZm9yIHJlYXNvbnMgb3RoZXIgdGhhbiBpdCBjb250YWluaW5nIGR5bmFtaWMgYWxsb2NhdGlvbiBvciAKKyAgLy8vIHRoYXQgRlAgZWxpbWluYXRhdGlvbiBpcyB0dXJuZWQgb2ZmLiBGb3IgZXhhbXBsZSwgQ3lnd2luIG1haW4gZnVuY3Rpb24KKyAgLy8vIGNvbnRhaW5zIHN0YWNrIHBvaW50ZXIgcmUtYWxpZ25tZW50IGNvZGUgd2hpY2ggcmVxdWlyZXMgRlAuCisgIGJvb2wgRm9yY2VGcmFtZVBvaW50ZXI7CisKKyAgLy8vIENhbGxlZVNhdmVkRnJhbWVTaXplIC0gU2l6ZSBvZiB0aGUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIHBvcnRpb24gb2YgdGhlCisgIC8vLyBzdGFjayBmcmFtZSBpbiBieXRlcy4KKyAgdW5zaWduZWQgQ2FsbGVlU2F2ZWRGcmFtZVNpemU7CisKKyAgLy8vIEJ5dGVzVG9Qb3BPblJldHVybiAtIE51bWJlciBvZiBieXRlcyBmdW5jdGlvbiBwb3BzIG9uIHJldHVybiAoaW4gYWRkaXRpb24KKyAgLy8vIHRvIHRoZSBzcGFjZSB1c2VkIGJ5IHRoZSByZXR1cm4gYWRkcmVzcykuCisgIC8vLyBVc2VkIG9uIHdpbmRvd3MgcGxhdGZvcm0gZm9yIHN0ZGNhbGwgJiBmYXN0Y2FsbCBuYW1lIGRlY29yYXRpb24KKyAgdW5zaWduZWQgQnl0ZXNUb1BvcE9uUmV0dXJuOworCisgIC8vLyBSZXR1cm5BZGRySW5kZXggLSBGcmFtZUluZGV4IGZvciByZXR1cm4gc2xvdC4KKyAgaW50IFJldHVybkFkZHJJbmRleDsKKworICAvLy8gVGFpbENhbGxSZXR1cm5BZGRyRGVsdGEgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJ5IHdoaWNoIHJldHVybiBhZGRyZXNzCisgIC8vLyBzdGFjayBzbG90IGlzIG1vdmVkIGFzIHRoZSByZXN1bHQgb2YgdGFpbCBjYWxsIG9wdGltaXphdGlvbi4KKyAgaW50IFRhaWxDYWxsUmV0dXJuQWRkckRlbHRhOworCisgIC8vLyBTUmV0UmV0dXJuUmVnIC0gU29tZSBzdWJ0YXJnZXRzIHJlcXVpcmUgdGhhdCBzcmV0IGxvd2VyaW5nIGluY2x1ZGVzCisgIC8vLyByZXR1cm5pbmcgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBzdHJ1Y3QgaW4gYSByZWdpc3Rlci4gVGhpcyBmaWVsZAorICAvLy8gaG9sZHMgdGhlIHZpcnR1YWwgcmVnaXN0ZXIgaW50byB3aGljaCB0aGUgc3JldCBhcmd1bWVudCBpcyBwYXNzZWQuCisgIHVuc2lnbmVkIFNSZXRSZXR1cm5SZWc7CisKKyAgLy8vIEdsb2JhbEJhc2VSZWcgLSBrZWVwcyB0cmFjayBvZiB0aGUgdmlydHVhbCByZWdpc3RlciBpbml0aWFsaXplZCBmb3IKKyAgLy8vIHVzZSBhcyB0aGUgZ2xvYmFsIGJhc2UgcmVnaXN0ZXIuIFRoaXMgaXMgdXNlZCBmb3IgUElDIGluIHNvbWUgUElDCisgIC8vLyByZWxvY2F0aW9uIG1vZGVscy4KKyAgdW5zaWduZWQgR2xvYmFsQmFzZVJlZzsKKworICAvLy8gUmVzZXJ2ZUZQIC0gd2hldGhlciB0aGUgZnVuY3Rpb24gc2hvdWxkIHJlc2VydmUgdGhlIGZyYW1lIHBvaW50ZXIKKyAgLy8vIHdoZW4gYWxsb2NhdGluZywgZXZlbiBpZiB0aGVyZSBtYXkgbm90IGFjdHVhbGx5IGJlIGEgZnJhbWUgcG9pbnRlciB1c2VkLgorICBib29sIFJlc2VydmVGUDsKKworICAvLy8gVmFyQXJnc0ZyYW1lSW5kZXggLSBGcmFtZUluZGV4IGZvciBzdGFydCBvZiB2YXJhcmdzIGFyZWEuCisgIGludCBWYXJBcmdzRnJhbWVJbmRleDsKKyAgLy8vIFJlZ1NhdmVGcmFtZUluZGV4IC0gWDg2LTY0IHZhcmFyZyBmdW5jIHJlZ2lzdGVyIHNhdmUgYXJlYS4KKyAgaW50IFJlZ1NhdmVGcmFtZUluZGV4OworICAvLy8gVmFyQXJnc0dQT2Zmc2V0IC0gWDg2LTY0IHZhcmFyZyBmdW5jIGludCByZWcgb2Zmc2V0LgorICB1bnNpZ25lZCBWYXJBcmdzR1BPZmZzZXQ7CisgIC8vLyBWYXJBcmdzRlBPZmZzZXQgLSBYODYtNjQgdmFyYXJnIGZ1bmMgZnAgcmVnIG9mZnNldC4KKyAgdW5zaWduZWQgVmFyQXJnc0ZQT2Zmc2V0OworCitwdWJsaWM6CisgIFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8oKSA6IEZvcmNlRnJhbWVQb2ludGVyKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGVlU2F2ZWRGcmFtZVNpemUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzVG9Qb3BPblJldHVybigwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQWRkckluZGV4KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWlsQ2FsbFJldHVybkFkZHJEZWx0YSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JldFJldHVyblJlZygwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsQmFzZVJlZygwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyQXJnc0ZyYW1lSW5kZXgoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NhdmVGcmFtZUluZGV4KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJBcmdzR1BPZmZzZXQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhckFyZ3NGUE9mZnNldCgwKSB7fQorICAKKyAgZXhwbGljaXQgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyhNYWNoaW5lRnVuY3Rpb24gJk1GKQorICAgIDogRm9yY2VGcmFtZVBvaW50ZXIoZmFsc2UpLAorICAgICAgQ2FsbGVlU2F2ZWRGcmFtZVNpemUoMCksCisgICAgICBCeXRlc1RvUG9wT25SZXR1cm4oMCksCisgICAgICBSZXR1cm5BZGRySW5kZXgoMCksCisgICAgICBUYWlsQ2FsbFJldHVybkFkZHJEZWx0YSgwKSwKKyAgICAgIFNSZXRSZXR1cm5SZWcoMCksCisgICAgICBHbG9iYWxCYXNlUmVnKDApLAorICAgICAgUmVzZXJ2ZUZQKGZhbHNlKSwKKyAgICAgIFZhckFyZ3NGcmFtZUluZGV4KDApLAorICAgICAgUmVnU2F2ZUZyYW1lSW5kZXgoMCksCisgICAgICBWYXJBcmdzR1BPZmZzZXQoMCksCisgICAgICBWYXJBcmdzRlBPZmZzZXQoMCkge30KKyAgCisgIGJvb2wgZ2V0Rm9yY2VGcmFtZVBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBGb3JjZUZyYW1lUG9pbnRlcjt9IAorICB2b2lkIHNldEZvcmNlRnJhbWVQb2ludGVyKGJvb2wgZm9yY2VGUCkgeyBGb3JjZUZyYW1lUG9pbnRlciA9IGZvcmNlRlA7IH0KKworICB1bnNpZ25lZCBnZXRDYWxsZWVTYXZlZEZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENhbGxlZVNhdmVkRnJhbWVTaXplOyB9CisgIHZvaWQgc2V0Q2FsbGVlU2F2ZWRGcmFtZVNpemUodW5zaWduZWQgYnl0ZXMpIHsgQ2FsbGVlU2F2ZWRGcmFtZVNpemUgPSBieXRlczsgfQorCisgIHVuc2lnbmVkIGdldEJ5dGVzVG9Qb3BPblJldHVybigpIGNvbnN0IHsgcmV0dXJuIEJ5dGVzVG9Qb3BPblJldHVybjsgfQorICB2b2lkIHNldEJ5dGVzVG9Qb3BPblJldHVybiAodW5zaWduZWQgYnl0ZXMpIHsgQnl0ZXNUb1BvcE9uUmV0dXJuID0gYnl0ZXM7fQorCisgIGludCBnZXRSQUluZGV4KCkgY29uc3QgeyByZXR1cm4gUmV0dXJuQWRkckluZGV4OyB9CisgIHZvaWQgc2V0UkFJbmRleChpbnQgSW5kZXgpIHsgUmV0dXJuQWRkckluZGV4ID0gSW5kZXg7IH0KKworICBpbnQgZ2V0VENSZXR1cm5BZGRyRGVsdGEoKSBjb25zdCB7IHJldHVybiBUYWlsQ2FsbFJldHVybkFkZHJEZWx0YTsgfQorICB2b2lkIHNldFRDUmV0dXJuQWRkckRlbHRhKGludCBkZWx0YSkge1RhaWxDYWxsUmV0dXJuQWRkckRlbHRhID0gZGVsdGE7fQorCisgIHVuc2lnbmVkIGdldFNSZXRSZXR1cm5SZWcoKSBjb25zdCB7IHJldHVybiBTUmV0UmV0dXJuUmVnOyB9CisgIHZvaWQgc2V0U1JldFJldHVyblJlZyh1bnNpZ25lZCBSZWcpIHsgU1JldFJldHVyblJlZyA9IFJlZzsgfQorCisgIHVuc2lnbmVkIGdldEdsb2JhbEJhc2VSZWcoKSBjb25zdCB7IHJldHVybiBHbG9iYWxCYXNlUmVnOyB9CisgIHZvaWQgc2V0R2xvYmFsQmFzZVJlZyh1bnNpZ25lZCBSZWcpIHsgR2xvYmFsQmFzZVJlZyA9IFJlZzsgfQorCisgIGJvb2wgZ2V0UmVzZXJ2ZUZQKCkgY29uc3QgeyByZXR1cm4gUmVzZXJ2ZUZQOyB9CisgIHZvaWQgc2V0UmVzZXJ2ZUZQKGJvb2wgcmVzZXJ2ZUZQKSB7IFJlc2VydmVGUCA9IHJlc2VydmVGUDsgfQorCisgIGludCBnZXRWYXJBcmdzRnJhbWVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFZhckFyZ3NGcmFtZUluZGV4OyB9CisgIHZvaWQgc2V0VmFyQXJnc0ZyYW1lSW5kZXgoaW50IElkeCkgeyBWYXJBcmdzRnJhbWVJbmRleCA9IElkeDsgfQorCisgIGludCBnZXRSZWdTYXZlRnJhbWVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFJlZ1NhdmVGcmFtZUluZGV4OyB9CisgIHZvaWQgc2V0UmVnU2F2ZUZyYW1lSW5kZXgoaW50IElkeCkgeyBSZWdTYXZlRnJhbWVJbmRleCA9IElkeDsgfQorCisgIHVuc2lnbmVkIGdldFZhckFyZ3NHUE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIFZhckFyZ3NHUE9mZnNldDsgfQorICB2b2lkIHNldFZhckFyZ3NHUE9mZnNldCh1bnNpZ25lZCBPZmZzZXQpIHsgVmFyQXJnc0dQT2Zmc2V0ID0gT2Zmc2V0OyB9CisKKyAgdW5zaWduZWQgZ2V0VmFyQXJnc0ZQT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gVmFyQXJnc0ZQT2Zmc2V0OyB9CisgIHZvaWQgc2V0VmFyQXJnc0ZQT2Zmc2V0KHVuc2lnbmVkIE9mZnNldCkgeyBWYXJBcmdzRlBPZmZzZXQgPSBPZmZzZXQ7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2UmVnaXN0ZXJJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlJlZ2lzdGVySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5ZTQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlJlZ2lzdGVySW5mby5jcHAKQEAgLTAsMCArMSwxNTk0IEBACisvLz09PS0gWDg2UmVnaXN0ZXJJbmZvLmNwcCAtIFg4NiBSZWdpc3RlciBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgWDg2IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUYXJnZXRSZWdpc3RlckluZm8gY2xhc3MuCisvLyBUaGlzIGZpbGUgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uIG9wdGltaXphdGlvbgorLy8gb24gWDg2LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJYODYuaCIKKyNpbmNsdWRlICJYODZSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJYODZJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJYODZNYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAiWDg2U3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiWDg2VGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitGb3JjZVN0YWNrQWxpZ24oImZvcmNlLWFsaWduLXN0YWNrIiwKKyAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkZvcmNlIGFsaWduIHRoZSBzdGFjayB0byB0aGUgbWluaW11bSBhbGlnbm1lbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uLiIpLAorICAgICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSksIGNsOjpIaWRkZW4pOworCitYODZSZWdpc3RlckluZm86Olg4NlJlZ2lzdGVySW5mbyhYODZUYXJnZXRNYWNoaW5lICZ0bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpKQorICA6IFg4NkdlblJlZ2lzdGVySW5mbyh0bS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzNjRCaXQoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBREpDQUxMU1RBQ0tET1dONjQgOgorICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6QURKQ0FMTFNUQUNLRE9XTjMyLAorICAgICAgICAgICAgICAgICAgICAgICB0bS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzNjRCaXQoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpBREpDQUxMU1RBQ0tVUDY0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkFESkNBTExTVEFDS1VQMzIpLAorICAgIFRNKHRtKSwgVElJKHRpaSkgeworICAvLyBDYWNoZSBzb21lIGluZm9ybWF0aW9uLgorICBjb25zdCBYODZTdWJ0YXJnZXQgKlN1YnRhcmdldCA9ICZUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOworICBJczY0Qml0ID0gU3VidGFyZ2V0LT5pczY0Qml0KCk7CisgIElzV2luNjQgPSBTdWJ0YXJnZXQtPmlzVGFyZ2V0V2luNjQoKTsKKyAgU3RhY2tBbGlnbiA9IFRNLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja0FsaWdubWVudCgpOworCisgIGlmIChJczY0Qml0KSB7CisgICAgU2xvdFNpemUgPSA4OworICAgIFN0YWNrUHRyID0gWDg2OjpSU1A7CisgICAgRnJhbWVQdHIgPSBYODY6OlJCUDsKKyAgfSBlbHNlIHsKKyAgICBTbG90U2l6ZSA9IDQ7CisgICAgU3RhY2tQdHIgPSBYODY6OkVTUDsKKyAgICBGcmFtZVB0ciA9IFg4Njo6RUJQOworICB9Cit9CisKKy8vLyBnZXREd2FyZlJlZ051bSAtIFRoaXMgZnVuY3Rpb24gbWFwcyBMTFZNIHJlZ2lzdGVyIGlkZW50aWZpZXJzIHRvIHRoZSBEV0FSRgorLy8vIHNwZWNpZmljIG51bWJlcmluZywgdXNlZCBpbiBkZWJ1ZyBpbmZvIGFuZCBleGNlcHRpb24gdGFibGVzLgoraW50IFg4NlJlZ2lzdGVySW5mbzo6Z2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTm8sIGJvb2wgaXNFSCkgY29uc3QgeworICBjb25zdCBYODZTdWJ0YXJnZXQgKlN1YnRhcmdldCA9ICZUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOworICB1bnNpZ25lZCBGbGF2b3VyID0gRFdBUkZGbGF2b3VyOjpYODZfNjQ7CisKKyAgaWYgKCFTdWJ0YXJnZXQtPmlzNjRCaXQoKSkgeworICAgIGlmIChTdWJ0YXJnZXQtPmlzVGFyZ2V0RGFyd2luKCkpIHsKKyAgICAgIGlmIChpc0VIKQorICAgICAgICBGbGF2b3VyID0gRFdBUkZGbGF2b3VyOjpYODZfMzJfRGFyd2luRUg7CisgICAgICBlbHNlCisgICAgICAgIEZsYXZvdXIgPSBEV0FSRkZsYXZvdXI6Olg4Nl8zMl9HZW5lcmljOworICAgIH0gZWxzZSBpZiAoU3VidGFyZ2V0LT5pc1RhcmdldEN5Z01pbmcoKSkgeworICAgICAgLy8gVW5zdXBwb3J0ZWQgYnkgbm93LCBqdXN0IHF1aWNrIGZhbGxiYWNrCisgICAgICBGbGF2b3VyID0gRFdBUkZGbGF2b3VyOjpYODZfMzJfR2VuZXJpYzsKKyAgICB9IGVsc2UgeworICAgICAgRmxhdm91ciA9IERXQVJGRmxhdm91cjo6WDg2XzMyX0dlbmVyaWM7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFg4NkdlblJlZ2lzdGVySW5mbzo6Z2V0RHdhcmZSZWdOdW1GdWxsKFJlZ05vLCBGbGF2b3VyKTsKK30KKworLy8vIGdldFg4NlJlZ051bSAtIFRoaXMgZnVuY3Rpb24gbWFwcyBMTFZNIHJlZ2lzdGVyIGlkZW50aWZpZXJzIHRvIHRoZWlyIFg4NgorLy8vIHNwZWNpZmljIG51bWJlcmluZywgd2hpY2ggaXMgdXNlZCBpbiB2YXJpb3VzIHBsYWNlcyBlbmNvZGluZyBpbnN0cnVjdGlvbnMuCit1bnNpZ25lZCBYODZSZWdpc3RlckluZm86OmdldFg4NlJlZ051bSh1bnNpZ25lZCBSZWdObykgeworICBzd2l0Y2goUmVnTm8pIHsKKyAgY2FzZSBYODY6OlJBWDogY2FzZSBYODY6OkVBWDogY2FzZSBYODY6OkFYOiBjYXNlIFg4Njo6QUw6IHJldHVybiBOODY6OkVBWDsKKyAgY2FzZSBYODY6OlJDWDogY2FzZSBYODY6OkVDWDogY2FzZSBYODY6OkNYOiBjYXNlIFg4Njo6Q0w6IHJldHVybiBOODY6OkVDWDsKKyAgY2FzZSBYODY6OlJEWDogY2FzZSBYODY6OkVEWDogY2FzZSBYODY6OkRYOiBjYXNlIFg4Njo6REw6IHJldHVybiBOODY6OkVEWDsKKyAgY2FzZSBYODY6OlJCWDogY2FzZSBYODY6OkVCWDogY2FzZSBYODY6OkJYOiBjYXNlIFg4Njo6Qkw6IHJldHVybiBOODY6OkVCWDsKKyAgY2FzZSBYODY6OlJTUDogY2FzZSBYODY6OkVTUDogY2FzZSBYODY6OlNQOiBjYXNlIFg4Njo6U1BMOiBjYXNlIFg4Njo6QUg6CisgICAgcmV0dXJuIE44Njo6RVNQOworICBjYXNlIFg4Njo6UkJQOiBjYXNlIFg4Njo6RUJQOiBjYXNlIFg4Njo6QlA6IGNhc2UgWDg2OjpCUEw6IGNhc2UgWDg2OjpDSDoKKyAgICByZXR1cm4gTjg2OjpFQlA7CisgIGNhc2UgWDg2OjpSU0k6IGNhc2UgWDg2OjpFU0k6IGNhc2UgWDg2OjpTSTogY2FzZSBYODY6OlNJTDogY2FzZSBYODY6OkRIOgorICAgIHJldHVybiBOODY6OkVTSTsKKyAgY2FzZSBYODY6OlJESTogY2FzZSBYODY6OkVESTogY2FzZSBYODY6OkRJOiBjYXNlIFg4Njo6RElMOiBjYXNlIFg4Njo6Qkg6CisgICAgcmV0dXJuIE44Njo6RURJOworCisgIGNhc2UgWDg2OjpSODogIGNhc2UgWDg2OjpSOEQ6ICBjYXNlIFg4Njo6UjhXOiAgY2FzZSBYODY6OlI4QjoKKyAgICByZXR1cm4gTjg2OjpFQVg7CisgIGNhc2UgWDg2OjpSOTogIGNhc2UgWDg2OjpSOUQ6ICBjYXNlIFg4Njo6UjlXOiAgY2FzZSBYODY6OlI5QjoKKyAgICByZXR1cm4gTjg2OjpFQ1g7CisgIGNhc2UgWDg2OjpSMTA6IGNhc2UgWDg2OjpSMTBEOiBjYXNlIFg4Njo6UjEwVzogY2FzZSBYODY6OlIxMEI6CisgICAgcmV0dXJuIE44Njo6RURYOworICBjYXNlIFg4Njo6UjExOiBjYXNlIFg4Njo6UjExRDogY2FzZSBYODY6OlIxMVc6IGNhc2UgWDg2OjpSMTFCOgorICAgIHJldHVybiBOODY6OkVCWDsKKyAgY2FzZSBYODY6OlIxMjogY2FzZSBYODY6OlIxMkQ6IGNhc2UgWDg2OjpSMTJXOiBjYXNlIFg4Njo6UjEyQjoKKyAgICByZXR1cm4gTjg2OjpFU1A7CisgIGNhc2UgWDg2OjpSMTM6IGNhc2UgWDg2OjpSMTNEOiBjYXNlIFg4Njo6UjEzVzogY2FzZSBYODY6OlIxM0I6CisgICAgcmV0dXJuIE44Njo6RUJQOworICBjYXNlIFg4Njo6UjE0OiBjYXNlIFg4Njo6UjE0RDogY2FzZSBYODY6OlIxNFc6IGNhc2UgWDg2OjpSMTRCOgorICAgIHJldHVybiBOODY6OkVTSTsKKyAgY2FzZSBYODY6OlIxNTogY2FzZSBYODY6OlIxNUQ6IGNhc2UgWDg2OjpSMTVXOiBjYXNlIFg4Njo6UjE1QjoKKyAgICByZXR1cm4gTjg2OjpFREk7CisKKyAgY2FzZSBYODY6OlNUMDogY2FzZSBYODY6OlNUMTogY2FzZSBYODY6OlNUMjogY2FzZSBYODY6OlNUMzoKKyAgY2FzZSBYODY6OlNUNDogY2FzZSBYODY6OlNUNTogY2FzZSBYODY6OlNUNjogY2FzZSBYODY6OlNUNzoKKyAgICByZXR1cm4gUmVnTm8tWDg2OjpTVDA7CisKKyAgY2FzZSBYODY6OlhNTTA6IGNhc2UgWDg2OjpYTU04OgorICBjYXNlIFg4Njo6WU1NMDogY2FzZSBYODY6OllNTTg6IGNhc2UgWDg2OjpNTTA6CisgICAgcmV0dXJuIDA7CisgIGNhc2UgWDg2OjpYTU0xOiBjYXNlIFg4Njo6WE1NOToKKyAgY2FzZSBYODY6OllNTTE6IGNhc2UgWDg2OjpZTU05OiBjYXNlIFg4Njo6TU0xOgorICAgIHJldHVybiAxOworICBjYXNlIFg4Njo6WE1NMjogY2FzZSBYODY6OlhNTTEwOgorICBjYXNlIFg4Njo6WU1NMjogY2FzZSBYODY6OllNTTEwOiBjYXNlIFg4Njo6TU0yOgorICAgIHJldHVybiAyOworICBjYXNlIFg4Njo6WE1NMzogY2FzZSBYODY6OlhNTTExOgorICBjYXNlIFg4Njo6WU1NMzogY2FzZSBYODY6OllNTTExOiBjYXNlIFg4Njo6TU0zOgorICAgIHJldHVybiAzOworICBjYXNlIFg4Njo6WE1NNDogY2FzZSBYODY6OlhNTTEyOgorICBjYXNlIFg4Njo6WU1NNDogY2FzZSBYODY6OllNTTEyOiBjYXNlIFg4Njo6TU00OgorICAgIHJldHVybiA0OworICBjYXNlIFg4Njo6WE1NNTogY2FzZSBYODY6OlhNTTEzOgorICBjYXNlIFg4Njo6WU1NNTogY2FzZSBYODY6OllNTTEzOiBjYXNlIFg4Njo6TU01OgorICAgIHJldHVybiA1OworICBjYXNlIFg4Njo6WE1NNjogY2FzZSBYODY6OlhNTTE0OgorICBjYXNlIFg4Njo6WU1NNjogY2FzZSBYODY6OllNTTE0OiBjYXNlIFg4Njo6TU02OgorICAgIHJldHVybiA2OworICBjYXNlIFg4Njo6WE1NNzogY2FzZSBYODY6OlhNTTE1OgorICBjYXNlIFg4Njo6WU1NNzogY2FzZSBYODY6OllNTTE1OiBjYXNlIFg4Njo6TU03OgorICAgIHJldHVybiA3OworCisgIGNhc2UgWDg2OjpFUzoKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBYODY6OkNTOgorICAgIHJldHVybiAxOworICBjYXNlIFg4Njo6U1M6CisgICAgcmV0dXJuIDI7CisgIGNhc2UgWDg2OjpEUzoKKyAgICByZXR1cm4gMzsKKyAgY2FzZSBYODY6OkZTOgorICAgIHJldHVybiA0OworICBjYXNlIFg4Njo6R1M6CisgICAgcmV0dXJuIDU7CisKKyAgY2FzZSBYODY6OkNSMDoKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBYODY6OkNSMToKKyAgICByZXR1cm4gMTsKKyAgY2FzZSBYODY6OkNSMjoKKyAgICByZXR1cm4gMjsKKyAgY2FzZSBYODY6OkNSMzoKKyAgICByZXR1cm4gMzsKKyAgY2FzZSBYODY6OkNSNDoKKyAgICByZXR1cm4gNDsKKworICBjYXNlIFg4Njo6RFIwOgorICAgIHJldHVybiAwOworICBjYXNlIFg4Njo6RFIxOgorICAgIHJldHVybiAxOworICBjYXNlIFg4Njo6RFIyOgorICAgIHJldHVybiAyOworICBjYXNlIFg4Njo6RFIzOgorICAgIHJldHVybiAzOworICBjYXNlIFg4Njo6RFI0OgorICAgIHJldHVybiA0OworICBjYXNlIFg4Njo6RFI1OgorICAgIHJldHVybiA1OworICBjYXNlIFg4Njo6RFI2OgorICAgIHJldHVybiA2OworICBjYXNlIFg4Njo6RFI3OgorICAgIHJldHVybiA3OworCisgIC8vIFBzZXVkbyBpbmRleCByZWdpc3RlcnMgYXJlIGVxdWl2YWxlbnQgdG8gYSAibm9uZSIKKyAgLy8gc2NhbGVkIGluZGV4IChTZWUgSW50ZWwgTWFudWFsIDJBLCB0YWJsZSAyLTMpCisgIGNhc2UgWDg2OjpFSVo6CisgIGNhc2UgWDg2OjpSSVo6CisgICAgcmV0dXJuIDQ7CisKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoaXNWaXJ0dWFsUmVnaXN0ZXIoUmVnTm8pICYmICJVbmtub3duIHBoeXNpY2FsIHJlZ2lzdGVyISIpOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlJlZ2lzdGVyIGFsbG9jYXRvciBoYXNuJ3QgYWxsb2NhdGVkIHJlZyBjb3JyZWN0bHkgeWV0ISIpOworICAgIHJldHVybiAwOworICB9Cit9CisKK2NvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgorWDg2UmVnaXN0ZXJJbmZvOjpnZXRNYXRjaGluZ1N1cGVyUmVnQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWJJZHgpIGNvbnN0IHsKKyAgc3dpdGNoIChTdWJJZHgpIHsKKyAgZGVmYXVsdDogcmV0dXJuIDA7CisgIGNhc2UgWDg2OjpzdWJfOGJpdDoKKyAgICBpZiAoQiA9PSAmWDg2OjpHUjhSZWdDbGFzcykgeworICAgICAgaWYgKEEtPmdldFNpemUoKSA9PSAyIHx8IEEtPmdldFNpemUoKSA9PSA0IHx8IEEtPmdldFNpemUoKSA9PSA4KQorICAgICAgICByZXR1cm4gQTsKKyAgICB9IGVsc2UgaWYgKEIgPT0gJlg4Njo6R1I4X0FCQ0RfTFJlZ0NsYXNzIHx8IEIgPT0gJlg4Njo6R1I4X0FCQ0RfSFJlZ0NsYXNzKSB7CisgICAgICBpZiAoQSA9PSAmWDg2OjpHUjY0UmVnQ2xhc3MgfHwgQSA9PSAmWDg2OjpHUjY0X0FCQ0RSZWdDbGFzcyB8fAorICAgICAgICAgIEEgPT0gJlg4Njo6R1I2NF9OT1JFWFJlZ0NsYXNzIHx8CisgICAgICAgICAgQSA9PSAmWDg2OjpHUjY0X05PU1BSZWdDbGFzcyB8fAorICAgICAgICAgIEEgPT0gJlg4Njo6R1I2NF9OT1JFWF9OT1NQUmVnQ2xhc3MpCisgICAgICAgIHJldHVybiAmWDg2OjpHUjY0X0FCQ0RSZWdDbGFzczsKKyAgICAgIGVsc2UgaWYgKEEgPT0gJlg4Njo6R1IzMlJlZ0NsYXNzIHx8IEEgPT0gJlg4Njo6R1IzMl9BQkNEUmVnQ2xhc3MgfHwKKyAgICAgICAgICAgICAgIEEgPT0gJlg4Njo6R1IzMl9OT1JFWFJlZ0NsYXNzIHx8CisgICAgICAgICAgICAgICBBID09ICZYODY6OkdSMzJfTk9TUFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJlg4Njo6R1IzMl9BQkNEUmVnQ2xhc3M7CisgICAgICBlbHNlIGlmIChBID09ICZYODY6OkdSMTZSZWdDbGFzcyB8fCBBID09ICZYODY6OkdSMTZfQUJDRFJlZ0NsYXNzIHx8CisgICAgICAgICAgICAgICBBID09ICZYODY6OkdSMTZfTk9SRVhSZWdDbGFzcykKKyAgICAgICAgcmV0dXJuICZYODY6OkdSMTZfQUJDRFJlZ0NsYXNzOworICAgIH0gZWxzZSBpZiAoQiA9PSAmWDg2OjpHUjhfTk9SRVhSZWdDbGFzcykgeworICAgICAgaWYgKEEgPT0gJlg4Njo6R1I2NFJlZ0NsYXNzIHx8IEEgPT0gJlg4Njo6R1I2NF9OT1JFWFJlZ0NsYXNzIHx8CisgICAgICAgICAgQSA9PSAmWDg2OjpHUjY0X05PU1BSZWdDbGFzcyB8fCBBID09ICZYODY6OkdSNjRfTk9SRVhfTk9TUFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJlg4Njo6R1I2NF9OT1JFWFJlZ0NsYXNzOworICAgICAgZWxzZSBpZiAoQSA9PSAmWDg2OjpHUjY0X0FCQ0RSZWdDbGFzcykKKyAgICAgICAgcmV0dXJuICZYODY6OkdSNjRfQUJDRFJlZ0NsYXNzOworICAgICAgZWxzZSBpZiAoQSA9PSAmWDg2OjpHUjMyUmVnQ2xhc3MgfHwgQSA9PSAmWDg2OjpHUjMyX05PUkVYUmVnQ2xhc3MgfHwKKyAgICAgICAgICAgICAgIEEgPT0gJlg4Njo6R1IzMl9OT1NQUmVnQ2xhc3MpCisgICAgICAgIHJldHVybiAmWDg2OjpHUjMyX05PUkVYUmVnQ2xhc3M7CisgICAgICBlbHNlIGlmIChBID09ICZYODY6OkdSMzJfQUJDRFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJlg4Njo6R1IzMl9BQkNEUmVnQ2xhc3M7CisgICAgICBlbHNlIGlmIChBID09ICZYODY6OkdSMTZSZWdDbGFzcyB8fCBBID09ICZYODY6OkdSMTZfTk9SRVhSZWdDbGFzcykKKyAgICAgICAgcmV0dXJuICZYODY6OkdSMTZfTk9SRVhSZWdDbGFzczsKKyAgICAgIGVsc2UgaWYgKEEgPT0gJlg4Njo6R1IxNl9BQkNEUmVnQ2xhc3MpCisgICAgICAgIHJldHVybiAmWDg2OjpHUjE2X0FCQ0RSZWdDbGFzczsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgWDg2OjpzdWJfOGJpdF9oaToKKyAgICBpZiAoQiA9PSAmWDg2OjpHUjhfQUJDRF9IUmVnQ2xhc3MpIHsKKyAgICAgIGlmIChBID09ICZYODY6OkdSNjRSZWdDbGFzcyB8fCBBID09ICZYODY6OkdSNjRfQUJDRFJlZ0NsYXNzIHx8CisgICAgICAgICAgQSA9PSAmWDg2OjpHUjY0X05PUkVYUmVnQ2xhc3MgfHwKKyAgICAgICAgICBBID09ICZYODY6OkdSNjRfTk9TUFJlZ0NsYXNzIHx8CisgICAgICAgICAgQSA9PSAmWDg2OjpHUjY0X05PUkVYX05PU1BSZWdDbGFzcykKKyAgICAgICAgcmV0dXJuICZYODY6OkdSNjRfQUJDRFJlZ0NsYXNzOworICAgICAgZWxzZSBpZiAoQSA9PSAmWDg2OjpHUjMyUmVnQ2xhc3MgfHwgQSA9PSAmWDg2OjpHUjMyX0FCQ0RSZWdDbGFzcyB8fAorICAgICAgICAgICAgICAgQSA9PSAmWDg2OjpHUjMyX05PUkVYUmVnQ2xhc3MgfHwgQSA9PSAmWDg2OjpHUjMyX05PU1BSZWdDbGFzcykKKyAgICAgICAgcmV0dXJuICZYODY6OkdSMzJfQUJDRFJlZ0NsYXNzOworICAgICAgZWxzZSBpZiAoQSA9PSAmWDg2OjpHUjE2UmVnQ2xhc3MgfHwgQSA9PSAmWDg2OjpHUjE2X0FCQ0RSZWdDbGFzcyB8fAorICAgICAgICAgICAgICAgQSA9PSAmWDg2OjpHUjE2X05PUkVYUmVnQ2xhc3MpCisgICAgICAgIHJldHVybiAmWDg2OjpHUjE2X0FCQ0RSZWdDbGFzczsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgWDg2OjpzdWJfMTZiaXQ6CisgICAgaWYgKEIgPT0gJlg4Njo6R1IxNlJlZ0NsYXNzKSB7CisgICAgICBpZiAoQS0+Z2V0U2l6ZSgpID09IDQgfHwgQS0+Z2V0U2l6ZSgpID09IDgpCisgICAgICAgIHJldHVybiBBOworICAgIH0gZWxzZSBpZiAoQiA9PSAmWDg2OjpHUjE2X0FCQ0RSZWdDbGFzcykgeworICAgICAgaWYgKEEgPT0gJlg4Njo6R1I2NFJlZ0NsYXNzIHx8IEEgPT0gJlg4Njo6R1I2NF9BQkNEUmVnQ2xhc3MgfHwKKyAgICAgICAgICBBID09ICZYODY6OkdSNjRfTk9SRVhSZWdDbGFzcyB8fAorICAgICAgICAgIEEgPT0gJlg4Njo6R1I2NF9OT1NQUmVnQ2xhc3MgfHwKKyAgICAgICAgICBBID09ICZYODY6OkdSNjRfTk9SRVhfTk9TUFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJlg4Njo6R1I2NF9BQkNEUmVnQ2xhc3M7CisgICAgICBlbHNlIGlmIChBID09ICZYODY6OkdSMzJSZWdDbGFzcyB8fCBBID09ICZYODY6OkdSMzJfQUJDRFJlZ0NsYXNzIHx8CisgICAgICAgICAgICAgICBBID09ICZYODY6OkdSMzJfTk9SRVhSZWdDbGFzcyB8fCBBID09ICZYODY6OkdSMzJfTk9TUFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJlg4Njo6R1IzMl9BQkNEUmVnQ2xhc3M7CisgICAgfSBlbHNlIGlmIChCID09ICZYODY6OkdSMTZfTk9SRVhSZWdDbGFzcykgeworICAgICAgaWYgKEEgPT0gJlg4Njo6R1I2NFJlZ0NsYXNzIHx8IEEgPT0gJlg4Njo6R1I2NF9OT1JFWFJlZ0NsYXNzIHx8CisgICAgICAgICAgQSA9PSAmWDg2OjpHUjY0X05PU1BSZWdDbGFzcyB8fCBBID09ICZYODY6OkdSNjRfTk9SRVhfTk9TUFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJlg4Njo6R1I2NF9OT1JFWFJlZ0NsYXNzOworICAgICAgZWxzZSBpZiAoQSA9PSAmWDg2OjpHUjY0X0FCQ0RSZWdDbGFzcykKKyAgICAgICAgcmV0dXJuICZYODY6OkdSNjRfQUJDRFJlZ0NsYXNzOworICAgICAgZWxzZSBpZiAoQSA9PSAmWDg2OjpHUjMyUmVnQ2xhc3MgfHwgQSA9PSAmWDg2OjpHUjMyX05PUkVYUmVnQ2xhc3MgfHwKKyAgICAgICAgICAgICAgIEEgPT0gJlg4Njo6R1IzMl9OT1NQUmVnQ2xhc3MpCisgICAgICAgIHJldHVybiAmWDg2OjpHUjMyX05PUkVYUmVnQ2xhc3M7CisgICAgICBlbHNlIGlmIChBID09ICZYODY6OkdSMzJfQUJDRFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJlg4Njo6R1I2NF9BQkNEUmVnQ2xhc3M7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFg4Njo6c3ViXzMyYml0OgorICAgIGlmIChCID09ICZYODY6OkdSMzJSZWdDbGFzcyB8fCBCID09ICZYODY6OkdSMzJfTk9TUFJlZ0NsYXNzKSB7CisgICAgICBpZiAoQS0+Z2V0U2l6ZSgpID09IDgpCisgICAgICAgIHJldHVybiBBOworICAgIH0gZWxzZSBpZiAoQiA9PSAmWDg2OjpHUjMyX0FCQ0RSZWdDbGFzcykgeworICAgICAgaWYgKEEgPT0gJlg4Njo6R1I2NFJlZ0NsYXNzIHx8IEEgPT0gJlg4Njo6R1I2NF9BQkNEUmVnQ2xhc3MgfHwKKyAgICAgICAgICBBID09ICZYODY6OkdSNjRfTk9SRVhSZWdDbGFzcyB8fAorICAgICAgICAgIEEgPT0gJlg4Njo6R1I2NF9OT1NQUmVnQ2xhc3MgfHwKKyAgICAgICAgICBBID09ICZYODY6OkdSNjRfTk9SRVhfTk9TUFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJlg4Njo6R1I2NF9BQkNEUmVnQ2xhc3M7CisgICAgfSBlbHNlIGlmIChCID09ICZYODY6OkdSMzJfTk9SRVhSZWdDbGFzcykgeworICAgICAgaWYgKEEgPT0gJlg4Njo6R1I2NFJlZ0NsYXNzIHx8IEEgPT0gJlg4Njo6R1I2NF9OT1JFWFJlZ0NsYXNzIHx8CisgICAgICAgICAgQSA9PSAmWDg2OjpHUjY0X05PU1BSZWdDbGFzcyB8fCBBID09ICZYODY6OkdSNjRfTk9SRVhfTk9TUFJlZ0NsYXNzKQorICAgICAgICByZXR1cm4gJlg4Njo6R1I2NF9OT1JFWFJlZ0NsYXNzOworICAgICAgZWxzZSBpZiAoQSA9PSAmWDg2OjpHUjY0X0FCQ0RSZWdDbGFzcykKKyAgICAgICAgcmV0dXJuICZYODY6OkdSNjRfQUJDRFJlZ0NsYXNzOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBYODY6OnN1Yl9zczoKKyAgICBpZiAoQiA9PSAmWDg2OjpGUjMyUmVnQ2xhc3MpCisgICAgICByZXR1cm4gQTsKKyAgICBicmVhazsKKyAgY2FzZSBYODY6OnN1Yl9zZDoKKyAgICBpZiAoQiA9PSAmWDg2OjpGUjY0UmVnQ2xhc3MpCisgICAgICByZXR1cm4gQTsKKyAgICBicmVhazsKKyAgY2FzZSBYODY6OnN1Yl94bW06CisgICAgaWYgKEIgPT0gJlg4Njo6VlIxMjhSZWdDbGFzcykKKyAgICAgIHJldHVybiBBOworICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCitjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKK1g4NlJlZ2lzdGVySW5mbzo6Z2V0UG9pbnRlclJlZ0NsYXNzKHVuc2lnbmVkIEtpbmQpIGNvbnN0IHsKKyAgc3dpdGNoIChLaW5kKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgS2luZCBpbiBnZXRQb2ludGVyUmVnQ2xhc3MhIik7CisgIGNhc2UgMDogLy8gTm9ybWFsIEdQUnMuCisgICAgaWYgKFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXM2NEJpdCgpKQorICAgICAgcmV0dXJuICZYODY6OkdSNjRSZWdDbGFzczsKKyAgICByZXR1cm4gJlg4Njo6R1IzMlJlZ0NsYXNzOworICBjYXNlIDE6IC8vIE5vcm1hbCBHUlBzIGV4Y2VwdCB0aGUgc3RhY2sgcG9pbnRlciAoZm9yIGVuY29kaW5nIHJlYXNvbnMpLgorICAgIGlmIChUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzNjRCaXQoKSkKKyAgICAgIHJldHVybiAmWDg2OjpHUjY0X05PU1BSZWdDbGFzczsKKyAgICByZXR1cm4gJlg4Njo6R1IzMl9OT1NQUmVnQ2xhc3M7CisgIH0KK30KKworY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCitYODZSZWdpc3RlckluZm86OmdldENyb3NzQ29weVJlZ0NsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgIGlmIChSQyA9PSAmWDg2OjpDQ1JSZWdDbGFzcykgeworICAgIGlmIChJczY0Qml0KQorICAgICAgcmV0dXJuICZYODY6OkdSNjRSZWdDbGFzczsKKyAgICBlbHNlCisgICAgICByZXR1cm4gJlg4Njo6R1IzMlJlZ0NsYXNzOworICB9CisgIHJldHVybiBOVUxMOworfQorCitjb25zdCB1bnNpZ25lZCAqCitYODZSZWdpc3RlckluZm86OmdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GKSBjb25zdCB7CisgIGJvb2wgZ2hjQ2FsbCA9IGZhbHNlOworCisgIGlmIChNRikgeworICAgIGNvbnN0IEZ1bmN0aW9uICpGID0gTUYtPmdldEZ1bmN0aW9uKCk7CisgICAgZ2hjQ2FsbCA9IChGID8gRi0+Z2V0Q2FsbGluZ0NvbnYoKSA9PSBDYWxsaW5nQ29udjo6R0hDIDogZmFsc2UpOworICB9CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdoY0NhbGxlZVNhdmVkUmVnc1tdID0geworICAgIDAKKyAgfTsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ2FsbGVlU2F2ZWRSZWdzMzJCaXRbXSA9IHsKKyAgICBYODY6OkVTSSwgWDg2OjpFREksIFg4Njo6RUJYLCBYODY6OkVCUCwgIDAKKyAgfTsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ2FsbGVlU2F2ZWRSZWdzMzJFSFJldFtdID0geworICAgIFg4Njo6RUFYLCBYODY6OkVEWCwgWDg2OjpFU0ksIFg4Njo6RURJLCBYODY6OkVCWCwgWDg2OjpFQlAsICAwCisgIH07CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIENhbGxlZVNhdmVkUmVnczY0Qml0W10gPSB7CisgICAgWDg2OjpSQlgsIFg4Njo6UjEyLCBYODY6OlIxMywgWDg2OjpSMTQsIFg4Njo6UjE1LCBYODY6OlJCUCwgMAorICB9OworCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBDYWxsZWVTYXZlZFJlZ3M2NEVIUmV0W10gPSB7CisgICAgWDg2OjpSQVgsIFg4Njo6UkRYLCBYODY6OlJCWCwgWDg2OjpSMTIsCisgICAgWDg2OjpSMTMsIFg4Njo6UjE0LCBYODY6OlIxNSwgWDg2OjpSQlAsIDAKKyAgfTsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ2FsbGVlU2F2ZWRSZWdzV2luNjRbXSA9IHsKKyAgICBYODY6OlJCWCwgICBYODY6OlJCUCwgICBYODY6OlJESSwgICBYODY6OlJTSSwKKyAgICBYODY6OlIxMiwgICBYODY6OlIxMywgICBYODY6OlIxNCwgICBYODY6OlIxNSwKKyAgICBYODY6OlhNTTYsICBYODY6OlhNTTcsICBYODY6OlhNTTgsICBYODY6OlhNTTksCisgICAgWDg2OjpYTU0xMCwgWDg2OjpYTU0xMSwgWDg2OjpYTU0xMiwgWDg2OjpYTU0xMywKKyAgICBYODY6OlhNTTE0LCBYODY6OlhNTTE1LCAwCisgIH07CisKKyAgaWYgKGdoY0NhbGwpIHsKKyAgICByZXR1cm4gR2hjQ2FsbGVlU2F2ZWRSZWdzOworICB9IGVsc2UgaWYgKElzNjRCaXQpIHsKKyAgICBpZiAoSXNXaW42NCkKKyAgICAgIHJldHVybiBDYWxsZWVTYXZlZFJlZ3NXaW42NDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQ2FsbGVlU2F2ZWRSZWdzNjRCaXQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIENhbGxlZVNhdmVkUmVnczMyQml0OworICB9Cit9CisKK0JpdFZlY3RvciBYODZSZWdpc3RlckluZm86OmdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIEJpdFZlY3RvciBSZXNlcnZlZChnZXROdW1SZWdzKCkpOworICAvLyBTZXQgdGhlIHN0YWNrLXBvaW50ZXIgcmVnaXN0ZXIgYW5kIGl0cyBhbGlhc2VzIGFzIHJlc2VydmVkLgorICBSZXNlcnZlZC5zZXQoWDg2OjpSU1ApOworICBSZXNlcnZlZC5zZXQoWDg2OjpFU1ApOworICBSZXNlcnZlZC5zZXQoWDg2OjpTUCk7CisgIFJlc2VydmVkLnNldChYODY6OlNQTCk7CisKKyAgLy8gU2V0IHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHJlZ2lzdGVyIGFuZCBpdHMgYWxpYXNlcyBhcyByZXNlcnZlZC4KKyAgUmVzZXJ2ZWQuc2V0KFg4Njo6UklQKTsKKyAgUmVzZXJ2ZWQuc2V0KFg4Njo6RUlQKTsKKyAgUmVzZXJ2ZWQuc2V0KFg4Njo6SVApOworCisgIC8vIFNldCB0aGUgZnJhbWUtcG9pbnRlciByZWdpc3RlciBhbmQgaXRzIGFsaWFzZXMgYXMgcmVzZXJ2ZWQgaWYgbmVlZGVkLgorICBpZiAoaGFzRlAoTUYpKSB7CisgICAgUmVzZXJ2ZWQuc2V0KFg4Njo6UkJQKTsKKyAgICBSZXNlcnZlZC5zZXQoWDg2OjpFQlApOworICAgIFJlc2VydmVkLnNldChYODY6OkJQKTsKKyAgICBSZXNlcnZlZC5zZXQoWDg2OjpCUEwpOworICB9CisKKyAgLy8gTWFyayB0aGUgeDg3IHN0YWNrIHJlZ2lzdGVycyBhcyByZXNlcnZlZCwgc2luY2UgdGhleSBkb24ndCBiZWhhdmUgbm9ybWFsbHkKKyAgLy8gd2l0aCByZXNwZWN0IHRvIGxpdmVuZXNzLiBXZSBkb24ndCBmdWxseSBtb2RlbCB0aGUgZWZmZWN0cyBvZiB4ODcgc3RhY2sKKyAgLy8gcHVzaGVzIGFuZCBwb3BzIGFmdGVyIHN0YWNraWZpY2F0aW9uLgorICBSZXNlcnZlZC5zZXQoWDg2OjpTVDApOworICBSZXNlcnZlZC5zZXQoWDg2OjpTVDEpOworICBSZXNlcnZlZC5zZXQoWDg2OjpTVDIpOworICBSZXNlcnZlZC5zZXQoWDg2OjpTVDMpOworICBSZXNlcnZlZC5zZXQoWDg2OjpTVDQpOworICBSZXNlcnZlZC5zZXQoWDg2OjpTVDUpOworICBSZXNlcnZlZC5zZXQoWDg2OjpTVDYpOworICBSZXNlcnZlZC5zZXQoWDg2OjpTVDcpOworICByZXR1cm4gUmVzZXJ2ZWQ7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTdGFjayBGcmFtZSBQcm9jZXNzaW5nIG1ldGhvZHMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBoYXNGUCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gc2hvdWxkIGhhdmUgYSBkZWRpY2F0ZWQgZnJhbWUKKy8vLyBwb2ludGVyIHJlZ2lzdGVyLiAgVGhpcyBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBoYXMgdmFyaWFibGUgc2l6ZWQgYWxsb2NhcworLy8vIG9yIGlmIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24gaXMgZGlzYWJsZWQuCitib29sIFg4NlJlZ2lzdGVySW5mbzo6aGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgY29uc3QgTWFjaGluZU1vZHVsZUluZm8gJk1NSSA9IE1GLmdldE1NSSgpOworCisgIHJldHVybiAoRGlzYWJsZUZyYW1lUG9pbnRlckVsaW0oTUYpIHx8CisgICAgICAgICAgbmVlZHNTdGFja1JlYWxpZ25tZW50KE1GKSB8fAorICAgICAgICAgIE1GSS0+aGFzVmFyU2l6ZWRPYmplY3RzKCkgfHwKKyAgICAgICAgICBNRkktPmlzRnJhbWVBZGRyZXNzVGFrZW4oKSB8fAorICAgICAgICAgIE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKS0+Z2V0Rm9yY2VGcmFtZVBvaW50ZXIoKSk7Cit9CisKK2Jvb2wgWDg2UmVnaXN0ZXJJbmZvOjpjYW5SZWFsaWduU3RhY2soY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgcmV0dXJuIChSZWFsaWduU3RhY2sgJiYKKyAgICAgICAgICAhTUZJLT5oYXNWYXJTaXplZE9iamVjdHMoKSk7Cit9CisKK2Jvb2wgWDg2UmVnaXN0ZXJJbmZvOjpuZWVkc1N0YWNrUmVhbGlnbm1lbnQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgY29uc3QgRnVuY3Rpb24gKkYgPSBNRi5nZXRGdW5jdGlvbigpOworICBib29sIHJlcXVpcmVzUmVhbGlnbm1lbnQgPSAoKE1GSS0+Z2V0TWF4QWxpZ25tZW50KCkgPiBTdGFja0FsaWduKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYtPmhhc0ZuQXR0cihBdHRyaWJ1dGU6OlN0YWNrQWxpZ25tZW50KSk7CisKKyAgLy8gRklYTUU6IEN1cnJlbnRseSB3ZSBkb24ndCBzdXBwb3J0IHN0YWNrIHJlYWxpZ25tZW50IGZvciBmdW5jdGlvbnMgd2l0aAorICAvLyAgICAgICAgdmFyaWFibGUtc2l6ZWQgYWxsb2Nhcy4KKyAgLy8gRklYTUU6IEl0J3MgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoaXMuLi4KKyAgaWYgKDAgJiYgcmVxdWlyZXNSZWFsaWdubWVudCAmJiBNRkktPmhhc1ZhclNpemVkT2JqZWN0cygpKQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigKKyAgICAgICJTdGFjayByZWFsaWdubWVudCBpbiBwcmVzZW5zZSBvZiBkeW5hbWljIGFsbG9jYXMgaXMgbm90IHN1cHBvcnRlZCIpOworICAgIAorICAvLyBJZiB3ZSd2ZSByZXF1ZXN0ZWQgdGhhdCB3ZSBmb3JjZSBhbGlnbiB0aGUgc3RhY2sgZG8gc28gbm93LgorICBpZiAoRm9yY2VTdGFja0FsaWduKQorICAgIHJldHVybiBjYW5SZWFsaWduU3RhY2soTUYpOworICAgIAorICByZXR1cm4gcmVxdWlyZXNSZWFsaWdubWVudCAmJiBjYW5SZWFsaWduU3RhY2soTUYpOworfQorCitib29sIFg4NlJlZ2lzdGVySW5mbzo6aGFzUmVzZXJ2ZWRDYWxsRnJhbWUoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICByZXR1cm4gIU1GLmdldEZyYW1lSW5mbygpLT5oYXNWYXJTaXplZE9iamVjdHMoKTsKK30KKworYm9vbCBYODZSZWdpc3RlckluZm86Omhhc1Jlc2VydmVkU3BpbGxTbG90KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBpbnQgJkZyYW1lSWR4KSBjb25zdCB7CisgIGlmIChSZWcgPT0gRnJhbWVQdHIgJiYgaGFzRlAoTUYpKSB7CisgICAgRnJhbWVJZHggPSBNRi5nZXRGcmFtZUluZm8oKS0+Z2V0T2JqZWN0SW5kZXhCZWdpbigpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworaW50CitYODZSZWdpc3RlckluZm86OmdldEZyYW1lSW5kZXhPZmZzZXQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwgaW50IEZJKSBjb25zdCB7CisgIGNvbnN0IFRhcmdldEZyYW1lSW5mbyAmVEZJID0gKk1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpOworICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgaW50IE9mZnNldCA9IE1GSS0+Z2V0T2JqZWN0T2Zmc2V0KEZJKSAtIFRGSS5nZXRPZmZzZXRPZkxvY2FsQXJlYSgpOworICB1aW50NjRfdCBTdGFja1NpemUgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworCisgIGlmIChuZWVkc1N0YWNrUmVhbGlnbm1lbnQoTUYpKSB7CisgICAgaWYgKEZJIDwgMCkgeworICAgICAgLy8gU2tpcCB0aGUgc2F2ZWQgRUJQLgorICAgICAgT2Zmc2V0ICs9IFNsb3RTaXplOworICAgIH0gZWxzZSB7CisgICAgICB1bnNpZ25lZCBBbGlnbiA9IE1GSS0+Z2V0T2JqZWN0QWxpZ25tZW50KEZJKTsKKyAgICAgIGFzc2VydCgoLShPZmZzZXQgKyBTdGFja1NpemUpKSAlIEFsaWduID09IDApOworICAgICAgQWxpZ24gPSAwOworICAgICAgcmV0dXJuIE9mZnNldCArIFN0YWNrU2l6ZTsKKyAgICB9CisgICAgLy8gRklYTUU6IFN1cHBvcnQgdGFpbCBjYWxscworICB9IGVsc2UgeworICAgIGlmICghaGFzRlAoTUYpKQorICAgICAgcmV0dXJuIE9mZnNldCArIFN0YWNrU2l6ZTsKKworICAgIC8vIFNraXAgdGhlIHNhdmVkIEVCUC4KKyAgICBPZmZzZXQgKz0gU2xvdFNpemU7CisKKyAgICAvLyBTa2lwIHRoZSBSRVRBRERSIG1vdmUgYXJlYQorICAgIGNvbnN0IFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8gKlg4NkZJID0gTUYuZ2V0SW5mbzxYODZNYWNoaW5lRnVuY3Rpb25JbmZvPigpOworICAgIGludCBUYWlsQ2FsbFJldHVybkFkZHJEZWx0YSA9IFg4NkZJLT5nZXRUQ1JldHVybkFkZHJEZWx0YSgpOworICAgIGlmIChUYWlsQ2FsbFJldHVybkFkZHJEZWx0YSA8IDApCisgICAgICBPZmZzZXQgLT0gVGFpbENhbGxSZXR1cm5BZGRyRGVsdGE7CisgIH0KKworICByZXR1cm4gT2Zmc2V0OworfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0U1VCcmlPcGNvZGUodW5zaWduZWQgaXM2NEJpdCwgaW50NjRfdCBJbW0pIHsKKyAgaWYgKGlzNjRCaXQpIHsKKyAgICBpZiAoaXNJbnQ8OD4oSW1tKSkKKyAgICAgIHJldHVybiBYODY6OlNVQjY0cmk4OworICAgIHJldHVybiBYODY6OlNVQjY0cmkzMjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNJbnQ8OD4oSW1tKSkKKyAgICAgIHJldHVybiBYODY6OlNVQjMycmk4OworICAgIHJldHVybiBYODY6OlNVQjMycmk7CisgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGdldEFERHJpT3Bjb2RlKHVuc2lnbmVkIGlzNjRCaXQsIGludDY0X3QgSW1tKSB7CisgIGlmIChpczY0Qml0KSB7CisgICAgaWYgKGlzSW50PDg+KEltbSkpCisgICAgICByZXR1cm4gWDg2OjpBREQ2NHJpODsKKyAgICByZXR1cm4gWDg2OjpBREQ2NHJpMzI7CisgIH0gZWxzZSB7CisgICAgaWYgKGlzSW50PDg+KEltbSkpCisgICAgICByZXR1cm4gWDg2OjpBREQzMnJpODsKKyAgICByZXR1cm4gWDg2OjpBREQzMnJpOworICB9Cit9CisKK3ZvaWQgWDg2UmVnaXN0ZXJJbmZvOjoKK2VsaW1pbmF0ZUNhbGxGcmFtZVBzZXVkb0luc3RyKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgY29uc3QgeworICBpZiAoIWhhc1Jlc2VydmVkQ2FsbEZyYW1lKE1GKSkgeworICAgIC8vIElmIHRoZSBzdGFjayBwb2ludGVyIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIHByb2xvZ3VlLCB0dXJuIHRoZQorICAgIC8vIGFkamNhbGxzdGFja3VwIGluc3RydWN0aW9uIGludG8gYSAnc3ViIEVTUCwgPGFtdD4nIGFuZCB0aGUKKyAgICAvLyBhZGpjYWxsc3RhY2tkb3duIGluc3RydWN0aW9uIGludG8gJ2FkZCBFU1AsIDxhbXQ+JworICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHB1c2ggLyBwb3AgaW5zdGVhZCBvZiBzdWIgKyBzdG9yZSAvIGFkZAorICAgIE1hY2hpbmVJbnN0ciAqT2xkID0gSTsKKyAgICB1aW50NjRfdCBBbW91bnQgPSBPbGQtPmdldE9wZXJhbmQoMCkuZ2V0SW1tKCk7CisgICAgaWYgKEFtb3VudCAhPSAwKSB7CisgICAgICAvLyBXZSBuZWVkIHRvIGtlZXAgdGhlIHN0YWNrIGFsaWduZWQgcHJvcGVybHkuICBUbyBkbyB0aGlzLCB3ZSByb3VuZCB0aGUKKyAgICAgIC8vIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRoZSBvdXRnb2luZyBhcmd1bWVudHMgdXAgdG8gdGhlIG5leHQKKyAgICAgIC8vIGFsaWdubWVudCBib3VuZGFyeS4KKyAgICAgIEFtb3VudCA9IChBbW91bnQgKyBTdGFja0FsaWduIC0gMSkgLyBTdGFja0FsaWduICogU3RhY2tBbGlnbjsKKworICAgICAgTWFjaGluZUluc3RyICpOZXcgPSAwOworICAgICAgaWYgKE9sZC0+Z2V0T3Bjb2RlKCkgPT0gZ2V0Q2FsbEZyYW1lU2V0dXBPcGNvZGUoKSkgeworICAgICAgICBOZXcgPSBCdWlsZE1JKE1GLCBPbGQtPmdldERlYnVnTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgVElJLmdldChnZXRTVUJyaU9wY29kZShJczY0Qml0LCBBbW91bnQpKSwKKyAgICAgICAgICAgICAgICAgICAgICBTdGFja1B0cikKKyAgICAgICAgICAuYWRkUmVnKFN0YWNrUHRyKQorICAgICAgICAgIC5hZGRJbW0oQW1vdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChPbGQtPmdldE9wY29kZSgpID09IGdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKSk7CisKKyAgICAgICAgLy8gRmFjdG9yIG91dCB0aGUgYW1vdW50IHRoZSBjYWxsZWUgYWxyZWFkeSBwb3BwZWQuCisgICAgICAgIHVpbnQ2NF90IENhbGxlZUFtdCA9IE9sZC0+Z2V0T3BlcmFuZCgxKS5nZXRJbW0oKTsKKyAgICAgICAgQW1vdW50IC09IENhbGxlZUFtdDsKKyAgCisgICAgICBpZiAoQW1vdW50KSB7CisgICAgICAgICAgdW5zaWduZWQgT3BjID0gZ2V0QUREcmlPcGNvZGUoSXM2NEJpdCwgQW1vdW50KTsKKyAgICAgICAgICBOZXcgPSBCdWlsZE1JKE1GLCBPbGQtPmdldERlYnVnTG9jKCksIFRJSS5nZXQoT3BjKSwgU3RhY2tQdHIpCisgICAgICAgICAgICAuYWRkUmVnKFN0YWNrUHRyKQorICAgICAgICAgICAgLmFkZEltbShBbW91bnQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChOZXcpIHsKKyAgICAgICAgLy8gVGhlIEVGTEFHUyBpbXBsaWNpdCBkZWYgaXMgZGVhZC4KKyAgICAgICAgTmV3LT5nZXRPcGVyYW5kKDMpLnNldElzRGVhZCgpOworCisgICAgICAgIC8vIFJlcGxhY2UgdGhlIHBzZXVkbyBpbnN0cnVjdGlvbiB3aXRoIGEgbmV3IGluc3RydWN0aW9uLgorICAgICAgICBNQkIuaW5zZXJ0KEksIE5ldyk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKEktPmdldE9wY29kZSgpID09IGdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKSkgeworICAgIC8vIElmIHdlIGFyZSBwZXJmb3JtaW5nIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24gYW5kIGlmIHRoZSBjYWxsZWUgcG9wcworICAgIC8vIHNvbWV0aGluZyBvZmYgdGhlIHN0YWNrIHBvaW50ZXIsIGFkZCBpdCBiYWNrLiAgV2UgZG8gdGhpcyB1bnRpbCB3ZSBoYXZlCisgICAgLy8gbW9yZSBhZHZhbmNlZCBzdGFjayBwb2ludGVyIHRyYWNraW5nIGFiaWxpdHkuCisgICAgaWYgKHVpbnQ2NF90IENhbGxlZUFtdCA9IEktPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkpIHsKKyAgICAgIHVuc2lnbmVkIE9wYyA9IGdldFNVQnJpT3Bjb2RlKElzNjRCaXQsIENhbGxlZUFtdCk7CisgICAgICBNYWNoaW5lSW5zdHIgKk9sZCA9IEk7CisgICAgICBNYWNoaW5lSW5zdHIgKk5ldyA9CisgICAgICAgIEJ1aWxkTUkoTUYsIE9sZC0+Z2V0RGVidWdMb2MoKSwgVElJLmdldChPcGMpLCAKKyAgICAgICAgICAgICAgICBTdGFja1B0cikKKyAgICAgICAgICAuYWRkUmVnKFN0YWNrUHRyKQorICAgICAgICAgIC5hZGRJbW0oQ2FsbGVlQW10KTsKKworICAgICAgLy8gVGhlIEVGTEFHUyBpbXBsaWNpdCBkZWYgaXMgZGVhZC4KKyAgICAgIE5ldy0+Z2V0T3BlcmFuZCgzKS5zZXRJc0RlYWQoKTsKKyAgICAgIE1CQi5pbnNlcnQoSSwgTmV3KTsKKyAgICB9CisgIH0KKworICBNQkIuZXJhc2UoSSk7Cit9CisKK3Vuc2lnbmVkCitYODZSZWdpc3RlckluZm86OmVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUEFkaiwgRnJhbWVJbmRleFZhbHVlICpWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTKSBjb25zdHsKKyAgYXNzZXJ0KFNQQWRqID09IDAgJiYgIlVuZXhwZWN0ZWQiKTsKKworICB1bnNpZ25lZCBpID0gMDsKKyAgTWFjaGluZUluc3RyICZNSSA9ICpJSTsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNSS5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisKKyAgd2hpbGUgKCFNSS5nZXRPcGVyYW5kKGkpLmlzRkkoKSkgeworICAgICsraTsKKyAgICBhc3NlcnQoaSA8IE1JLmdldE51bU9wZXJhbmRzKCkgJiYgIkluc3RyIGRvZXNuJ3QgaGF2ZSBGcmFtZUluZGV4IG9wZXJhbmQhIik7CisgIH0KKworICBpbnQgRnJhbWVJbmRleCA9IE1JLmdldE9wZXJhbmQoaSkuZ2V0SW5kZXgoKTsKKyAgdW5zaWduZWQgQmFzZVB0cjsKKworICB1bnNpZ25lZCBPcGMgPSBNSS5nZXRPcGNvZGUoKTsKKyAgYm9vbCBBZnRlckZQUG9wID0gT3BjID09IFg4Njo6VEFJTEpNUG02NCB8fCBPcGMgPT0gWDg2OjpUQUlMSk1QbTsKKyAgaWYgKG5lZWRzU3RhY2tSZWFsaWdubWVudChNRikpCisgICAgQmFzZVB0ciA9IChGcmFtZUluZGV4IDwgMCA/IEZyYW1lUHRyIDogU3RhY2tQdHIpOworICBlbHNlIGlmIChBZnRlckZQUG9wKQorICAgIEJhc2VQdHIgPSBTdGFja1B0cjsKKyAgZWxzZQorICAgIEJhc2VQdHIgPSAoaGFzRlAoTUYpID8gRnJhbWVQdHIgOiBTdGFja1B0cik7CisKKyAgLy8gVGhpcyBtdXN0IGJlIHBhcnQgb2YgYSBmb3VyIG9wZXJhbmQgbWVtb3J5IHJlZmVyZW5jZS4gIFJlcGxhY2UgdGhlCisgIC8vIEZyYW1lSW5kZXggd2l0aCBiYXNlIHJlZ2lzdGVyIHdpdGggRUJQLiAgQWRkIGFuIG9mZnNldCB0byB0aGUgb2Zmc2V0LgorICBNSS5nZXRPcGVyYW5kKGkpLkNoYW5nZVRvUmVnaXN0ZXIoQmFzZVB0ciwgZmFsc2UpOworCisgIC8vIE5vdyBhZGQgdGhlIGZyYW1lIG9iamVjdCBvZmZzZXQgdG8gdGhlIG9mZnNldCBmcm9tIEVCUC4KKyAgaW50IEZJT2Zmc2V0OworICBpZiAoQWZ0ZXJGUFBvcCkgeworICAgIC8vIFRhaWwgY2FsbCBqbXAgaGFwcGVucyBhZnRlciBGUCBpcyBwb3BwZWQuCisgICAgY29uc3QgVGFyZ2V0RnJhbWVJbmZvICZURkkgPSAqTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCk7CisgICAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgICAgRklPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChGcmFtZUluZGV4KSAtIFRGSS5nZXRPZmZzZXRPZkxvY2FsQXJlYSgpOworICB9IGVsc2UKKyAgICBGSU9mZnNldCA9IGdldEZyYW1lSW5kZXhPZmZzZXQoTUYsIEZyYW1lSW5kZXgpOworCisgIGlmIChNSS5nZXRPcGVyYW5kKGkrMykuaXNJbW0oKSkgeworICAgIC8vIE9mZnNldCBpcyBhIDMyLWJpdCBpbnRlZ2VyLgorICAgIGludCBPZmZzZXQgPSBGSU9mZnNldCArIChpbnQpKE1JLmdldE9wZXJhbmQoaSArIDMpLmdldEltbSgpKTsKKyAgICBNSS5nZXRPcGVyYW5kKGkgKyAzKS5DaGFuZ2VUb0ltbWVkaWF0ZShPZmZzZXQpOworICB9IGVsc2UgeworICAgIC8vIE9mZnNldCBpcyBzeW1ib2xpYy4gVGhpcyBpcyBleHRyZW1lbHkgcmFyZS4KKyAgICB1aW50NjRfdCBPZmZzZXQgPSBGSU9mZnNldCArICh1aW50NjRfdClNSS5nZXRPcGVyYW5kKGkrMykuZ2V0T2Zmc2V0KCk7CisgICAgTUkuZ2V0T3BlcmFuZChpKzMpLnNldE9mZnNldChPZmZzZXQpOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkCitYODZSZWdpc3RlckluZm86OnByb2Nlc3NGdW5jdGlvbkJlZm9yZUNhbGxlZVNhdmVkU2NhbihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUykgY29uc3QgeworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKworICBYODZNYWNoaW5lRnVuY3Rpb25JbmZvICpYODZGSSA9IE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKyAgaW50MzJfdCBUYWlsQ2FsbFJldHVybkFkZHJEZWx0YSA9IFg4NkZJLT5nZXRUQ1JldHVybkFkZHJEZWx0YSgpOworCisgIGlmIChUYWlsQ2FsbFJldHVybkFkZHJEZWx0YSA8IDApIHsKKyAgICAvLyBjcmVhdGUgUkVUVVJOQUREUiBhcmVhCisgICAgLy8gICBhcmcKKyAgICAvLyAgIGFyZworICAgIC8vICAgUkVUQUREUgorICAgIC8vICAgeyAuLi4KKyAgICAvLyAgICAgUkVUQUREUiBhcmVhCisgICAgLy8gICAgIC4uLgorICAgIC8vICAgfQorICAgIC8vICAgW0VCUF0KKyAgICBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KC1UYWlsQ2FsbFJldHVybkFkZHJEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMVUqU2xvdFNpemUpK1RhaWxDYWxsUmV0dXJuQWRkckRlbHRhLCB0cnVlKTsKKyAgfQorCisgIGlmIChoYXNGUChNRikpIHsKKyAgICBhc3NlcnQoKFRhaWxDYWxsUmV0dXJuQWRkckRlbHRhIDw9IDApICYmCisgICAgICAgICAgICJUaGUgRGVsdGEgc2hvdWxkIGFsd2F5cyBiZSB6ZXJvIG9yIG5lZ2F0aXZlIik7CisgICAgY29uc3QgVGFyZ2V0RnJhbWVJbmZvICZURkkgPSAqTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCk7CisKKyAgICAvLyBDcmVhdGUgYSBmcmFtZSBlbnRyeSBmb3IgdGhlIEVCUCByZWdpc3RlciB0aGF0IG11c3QgYmUgc2F2ZWQuCisgICAgaW50IEZyYW1lSWR4ID0gTUZJLT5DcmVhdGVGaXhlZE9iamVjdChTbG90U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oaW50KVNsb3RTaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGSS5nZXRPZmZzZXRPZkxvY2FsQXJlYSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhaWxDYWxsUmV0dXJuQWRkckRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgYXNzZXJ0KEZyYW1lSWR4ID09IE1GSS0+Z2V0T2JqZWN0SW5kZXhCZWdpbigpICYmCisgICAgICAgICAgICJTbG90IGZvciBFQlAgcmVnaXN0ZXIgbXVzdCBiZSBsYXN0IGluIG9yZGVyIHRvIGJlIGZvdW5kISIpOworICAgIEZyYW1lSWR4ID0gMDsKKyAgfQorfQorCisvLy8gZW1pdFNQVXBkYXRlIC0gRW1pdCBhIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMgdG8gaW5jcmVtZW50IC8gZGVjcmVtZW50IHRoZQorLy8vIHN0YWNrIHBvaW50ZXIgYnkgYSBjb25zdGFudCB2YWx1ZS4KK3N0YXRpYwordm9pZCBlbWl0U1BVcGRhdGUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RhY2tQdHIsIGludDY0X3QgTnVtQnl0ZXMsIGJvb2wgSXM2NEJpdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJKSB7CisgIGJvb2wgaXNTdWIgPSBOdW1CeXRlcyA8IDA7CisgIHVpbnQ2NF90IE9mZnNldCA9IGlzU3ViID8gLU51bUJ5dGVzIDogTnVtQnl0ZXM7CisgIHVuc2lnbmVkIE9wYyA9IGlzU3ViID8KKyAgICBnZXRTVUJyaU9wY29kZShJczY0Qml0LCBPZmZzZXQpIDoKKyAgICBnZXRBRERyaU9wY29kZShJczY0Qml0LCBPZmZzZXQpOworICB1aW50NjRfdCBDaHVuayA9ICgxTEwgPDwgMzEpIC0gMTsKKyAgRGVidWdMb2MgREwgPSBNQkIuZmluZERlYnVnTG9jKE1CQkkpOworCisgIHdoaWxlIChPZmZzZXQpIHsKKyAgICB1aW50NjRfdCBUaGlzVmFsID0gKE9mZnNldCA+IENodW5rKSA/IENodW5rIDogT2Zmc2V0OworICAgIE1hY2hpbmVJbnN0ciAqTUkgPQorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KE9wYyksIFN0YWNrUHRyKQorICAgICAgICAuYWRkUmVnKFN0YWNrUHRyKQorICAgICAgICAuYWRkSW1tKFRoaXNWYWwpOworICAgIE1JLT5nZXRPcGVyYW5kKDMpLnNldElzRGVhZCgpOyAvLyBUaGUgRUZMQUdTIGltcGxpY2l0IGRlZiBpcyBkZWFkLgorICAgIE9mZnNldCAtPSBUaGlzVmFsOworICB9Cit9CisKKy8vLyBtZXJnZVNQVXBkYXRlc1VwIC0gTWVyZ2UgdHdvIHN0YWNrLW1hbmlwdWxhdGluZyBpbnN0cnVjdGlvbnMgdXBwZXIgaXRlcmF0b3IuCitzdGF0aWMKK3ZvaWQgbWVyZ2VTUFVwZGF0ZXNVcChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RhY2tQdHIsIHVpbnQ2NF90ICpOdW1CeXRlcyA9IE5VTEwpIHsKKyAgaWYgKE1CQkkgPT0gTUJCLmJlZ2luKCkpIHJldHVybjsKKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUEkgPSBwcmlvcihNQkJJKTsKKyAgdW5zaWduZWQgT3BjID0gUEktPmdldE9wY29kZSgpOworICBpZiAoKE9wYyA9PSBYODY6OkFERDY0cmkzMiB8fCBPcGMgPT0gWDg2OjpBREQ2NHJpOCB8fAorICAgICAgIE9wYyA9PSBYODY6OkFERDMycmkgfHwgT3BjID09IFg4Njo6QUREMzJyaTgpICYmCisgICAgICBQSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBTdGFja1B0cikgeworICAgIGlmIChOdW1CeXRlcykKKyAgICAgICpOdW1CeXRlcyArPSBQSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKTsKKyAgICBNQkIuZXJhc2UoUEkpOworICB9IGVsc2UgaWYgKChPcGMgPT0gWDg2OjpTVUI2NHJpMzIgfHwgT3BjID09IFg4Njo6U1VCNjRyaTggfHwKKyAgICAgICAgICAgICAgT3BjID09IFg4Njo6U1VCMzJyaSB8fCBPcGMgPT0gWDg2OjpTVUIzMnJpOCkgJiYKKyAgICAgICAgICAgICBQSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBTdGFja1B0cikgeworICAgIGlmIChOdW1CeXRlcykKKyAgICAgICpOdW1CeXRlcyAtPSBQSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKTsKKyAgICBNQkIuZXJhc2UoUEkpOworICB9Cit9CisKKy8vLyBtZXJnZVNQVXBkYXRlc1VwIC0gTWVyZ2UgdHdvIHN0YWNrLW1hbmlwdWxhdGluZyBpbnN0cnVjdGlvbnMgbG93ZXIgaXRlcmF0b3IuCitzdGF0aWMKK3ZvaWQgbWVyZ2VTUFVwZGF0ZXNEb3duKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJk1CQkksCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdGFja1B0ciwgdWludDY0X3QgKk51bUJ5dGVzID0gTlVMTCkgeworICAvLyBGSVhNRTogVEhJUyBJU04nVCBSVU4hISEKKyAgcmV0dXJuOworCisgIGlmIChNQkJJID09IE1CQi5lbmQoKSkgcmV0dXJuOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBOSSA9IGxsdm06Om5leHQoTUJCSSk7CisgIGlmIChOSSA9PSBNQkIuZW5kKCkpIHJldHVybjsKKworICB1bnNpZ25lZCBPcGMgPSBOSS0+Z2V0T3Bjb2RlKCk7CisgIGlmICgoT3BjID09IFg4Njo6QURENjRyaTMyIHx8IE9wYyA9PSBYODY6OkFERDY0cmk4IHx8CisgICAgICAgT3BjID09IFg4Njo6QUREMzJyaSB8fCBPcGMgPT0gWDg2OjpBREQzMnJpOCkgJiYKKyAgICAgIE5JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpID09IFN0YWNrUHRyKSB7CisgICAgaWYgKE51bUJ5dGVzKQorICAgICAgKk51bUJ5dGVzIC09IE5JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgIE1CQi5lcmFzZShOSSk7CisgICAgTUJCSSA9IE5JOworICB9IGVsc2UgaWYgKChPcGMgPT0gWDg2OjpTVUI2NHJpMzIgfHwgT3BjID09IFg4Njo6U1VCNjRyaTggfHwKKyAgICAgICAgICAgICAgT3BjID09IFg4Njo6U1VCMzJyaSB8fCBPcGMgPT0gWDg2OjpTVUIzMnJpOCkgJiYKKyAgICAgICAgICAgICBOSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBTdGFja1B0cikgeworICAgIGlmIChOdW1CeXRlcykKKyAgICAgICpOdW1CeXRlcyArPSBOSS0+Z2V0T3BlcmFuZCgyKS5nZXRJbW0oKTsKKyAgICBNQkIuZXJhc2UoTkkpOworICAgIE1CQkkgPSBOSTsKKyAgfQorfQorCisvLy8gbWVyZ2VTUFVwZGF0ZXMgLSBDaGVja3MgdGhlIGluc3RydWN0aW9uIGJlZm9yZS9hZnRlciB0aGUgcGFzc2VkCisvLy8gaW5zdHJ1Y3Rpb24uIElmIGl0IGlzIGFuIEFERC9TVUIgaW5zdHJ1Y3Rpb24gaXQgaXMgZGVsZXRlZCBhcmd1bWVudCBhbmQgdGhlCisvLy8gc3RhY2sgYWRqdXN0bWVudCBpcyByZXR1cm5lZCBhcyBhIHBvc2l0aXZlIHZhbHVlIGZvciBBREQgYW5kIGEgbmVnYXRpdmUgZm9yCisvLy8gU1VCLgorc3RhdGljIGludCBtZXJnZVNQVXBkYXRlcyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RhY2tQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTWVyZ2VXaXRoUHJldmlvdXMpIHsKKyAgaWYgKChkb01lcmdlV2l0aFByZXZpb3VzICYmIE1CQkkgPT0gTUJCLmJlZ2luKCkpIHx8CisgICAgICAoIWRvTWVyZ2VXaXRoUHJldmlvdXMgJiYgTUJCSSA9PSBNQkIuZW5kKCkpKQorICAgIHJldHVybiAwOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBQSSA9IGRvTWVyZ2VXaXRoUHJldmlvdXMgPyBwcmlvcihNQkJJKSA6IE1CQkk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBOSSA9IGRvTWVyZ2VXaXRoUHJldmlvdXMgPyAwIDogbGx2bTo6bmV4dChNQkJJKTsKKyAgdW5zaWduZWQgT3BjID0gUEktPmdldE9wY29kZSgpOworICBpbnQgT2Zmc2V0ID0gMDsKKworICBpZiAoKE9wYyA9PSBYODY6OkFERDY0cmkzMiB8fCBPcGMgPT0gWDg2OjpBREQ2NHJpOCB8fAorICAgICAgIE9wYyA9PSBYODY6OkFERDMycmkgfHwgT3BjID09IFg4Njo6QUREMzJyaTgpICYmCisgICAgICBQSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBTdGFja1B0cil7CisgICAgT2Zmc2V0ICs9IFBJLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgIE1CQi5lcmFzZShQSSk7CisgICAgaWYgKCFkb01lcmdlV2l0aFByZXZpb3VzKSBNQkJJID0gTkk7CisgIH0gZWxzZSBpZiAoKE9wYyA9PSBYODY6OlNVQjY0cmkzMiB8fCBPcGMgPT0gWDg2OjpTVUI2NHJpOCB8fAorICAgICAgICAgICAgICBPcGMgPT0gWDg2OjpTVUIzMnJpIHx8IE9wYyA9PSBYODY6OlNVQjMycmk4KSAmJgorICAgICAgICAgICAgIFBJLT5nZXRPcGVyYW5kKDApLmdldFJlZygpID09IFN0YWNrUHRyKSB7CisgICAgT2Zmc2V0IC09IFBJLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpOworICAgIE1CQi5lcmFzZShQSSk7CisgICAgaWYgKCFkb01lcmdlV2l0aFByZXZpb3VzKSBNQkJJID0gTkk7CisgIH0KKworICByZXR1cm4gT2Zmc2V0OworfQorCit2b2lkIFg4NlJlZ2lzdGVySW5mbzo6ZW1pdENhbGxlZVNhdmVkRnJhbWVNb3ZlcyhNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTeW1ib2wgKkxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRnJhbWVQdHIpIGNvbnN0IHsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVNb2R1bGVJbmZvICZNTUkgPSBNRi5nZXRNTUkoKTsKKworICAvLyBBZGQgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyB0byBtb3ZlIGxpc3QuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSA9IE1GSS0+Z2V0Q2FsbGVlU2F2ZWRJbmZvKCk7CisgIGlmIChDU0kuZW1wdHkoKSkgcmV0dXJuOworCisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVNb3ZlPiAmTW92ZXMgPSBNTUkuZ2V0RnJhbWVNb3ZlcygpOworICBjb25zdCBUYXJnZXREYXRhICpURCA9IE1GLmdldFRhcmdldCgpLmdldFRhcmdldERhdGEoKTsKKyAgYm9vbCBIYXNGUCA9IGhhc0ZQKE1GKTsKKworICAvLyBDYWxjdWxhdGUgYW1vdW50IG9mIGJ5dGVzIHVzZWQgZm9yIHJldHVybiBhZGRyZXNzIHN0b3JpbmcuCisgIGludCBzdGFja0dyb3d0aCA9CisgICAgKE1GLmdldFRhcmdldCgpLmdldEZyYW1lSW5mbygpLT5nZXRTdGFja0dyb3d0aERpcmVjdGlvbigpID09CisgICAgIFRhcmdldEZyYW1lSW5mbzo6U3RhY2tHcm93c1VwID8KKyAgICAgVEQtPmdldFBvaW50ZXJTaXplKCkgOiAtVEQtPmdldFBvaW50ZXJTaXplKCkpOworCisgIC8vIEZJWE1FOiBUaGlzIGlzIGRpcnR5IGhhY2suIFRoZSBjb2RlIGl0c2VsZiBpcyBwcmV0dHkgbWVzcyByaWdodCBub3cuCisgIC8vIEl0IHNob3VsZCBiZSByZXdyaXR0ZW4gZnJvbSBzY3JhdGNoIGFuZCBnZW5lcmFsaXplZCBzb21ldGltZXMuCisKKyAgLy8gRGV0ZXJtaW5lIG1heGltdW0gb2Zmc2V0IChtaW51bXVtIGR1ZSB0byBzdGFjayBncm93dGgpLgorICBpbnQ2NF90IE1heE9mZnNldCA9IDA7CisgIGZvciAoc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIEkgPSBDU0kuYmVnaW4oKSwgRSA9IENTSS5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgTWF4T2Zmc2V0ID0gc3RkOjptaW4oTWF4T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE1GSS0+Z2V0T2JqZWN0T2Zmc2V0KEktPmdldEZyYW1lSWR4KCkpKTsKKworICAvLyBDYWxjdWxhdGUgb2Zmc2V0cy4KKyAgaW50NjRfdCBzYXZlQXJlYU9mZnNldCA9IChIYXNGUCA/IDMgOiAyKSAqIHN0YWNrR3Jvd3RoOworICBmb3IgKHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICBJID0gQ1NJLmJlZ2luKCksIEUgPSBDU0kuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaW50NjRfdCBPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChJLT5nZXRGcmFtZUlkeCgpKTsKKyAgICB1bnNpZ25lZCBSZWcgPSBJLT5nZXRSZWcoKTsKKyAgICBPZmZzZXQgPSBNYXhPZmZzZXQgLSBPZmZzZXQgKyBzYXZlQXJlYU9mZnNldDsKKworICAgIC8vIERvbid0IG91dHB1dCBhIG5ldyBtYWNoaW5lIG1vdmUgaWYgd2UncmUgcmUtc2F2aW5nIHRoZSBmcmFtZQorICAgIC8vIHBvaW50ZXIuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBQcm9sb2dFcGlsb2dJbnNlcnRlciBoYXMgaW5zZXJ0ZWQgYW4gZXh0cmEKKyAgICAvLyAiUFVTSCIgb2YgdGhlIGZyYW1lIHBvaW50ZXIgLS0gdGhlICJlbWl0UHJvbG9ndWUiIG1ldGhvZCBhdXRvbWF0aWNhbGx5CisgICAgLy8gZ2VuZXJhdGVzIG9uZSB3aGVuIGZyYW1lIHBvaW50ZXJzIGFyZSB1c2VkLiBJZiB3ZSBnZW5lcmF0ZSBhICJtYWNoaW5lCisgICAgLy8gbW92ZSIgZm9yIHRoaXMgZXh0cmEgIlBVU0giLCB0aGUgbGlua2VyIHdpbGwgbG9zZSB0cmFjayBvZiB0aGUgZmFjdCB0aGF0CisgICAgLy8gdGhlIGZyYW1lIHBvaW50ZXIgc2hvdWxkIGhhdmUgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCAiUFVTSCIgd2hlbiBpdCdzCisgICAgLy8gdHJ5aW5nIHRvIHVud2luZC4KKyAgICAvLyAKKyAgICAvLyBGSVhNRTogVGhpcyBsb29rcyBpbmVsZWdhbnQuIEl0J3MgcG9zc2libHkgY29ycmVjdCwgYnV0IGl0J3MgY292ZXJpbmcgdXAKKyAgICAvLyAgICAgICAgYW5vdGhlciBidWcuIEkuZS4sIG9uZSB3aGVyZSB3ZSBnZW5lcmF0ZSBhIHByb2xvZyBsaWtlIHRoaXM6CisgICAgLy8KKyAgICAvLyAgICAgICAgICBwdXNobCAgJWVicAorICAgIC8vICAgICAgICAgIG1vdmwgICAlZXNwLCAlZWJwCisgICAgLy8gICAgICAgICAgcHVzaGwgICVlYnAKKyAgICAvLyAgICAgICAgICBwdXNobCAgJWVzaQorICAgIC8vICAgICAgICAgICAuLi4KKyAgICAvLworICAgIC8vICAgICAgICBUaGUgaW1tZWRpYXRlIHJlLXB1c2ggb2YgRUJQIGlzIHVubmVjZXNzYXJ5LiBBdCB0aGUgbGVhc3QsIGl0J3MgYW4KKyAgICAvLyAgICAgICAgb3B0aW1pemF0aW9uIGJ1Zy4gRUJQIGNhbiBiZSB1c2VkIGFzIGEgc2NyYXRjaCByZWdpc3RlciBpbiBjZXJ0YWluCisgICAgLy8gICAgICAgIGNhc2VzLCBidXQgcHJvYmFibHkgbm90IHdoZW4gd2UgaGF2ZSBhIGZyYW1lIHBvaW50ZXIuCisgICAgaWYgKEhhc0ZQICYmIEZyYW1lUHRyID09IFJlZykKKyAgICAgIGNvbnRpbnVlOworCisgICAgTWFjaGluZUxvY2F0aW9uIENTRHN0KE1hY2hpbmVMb2NhdGlvbjo6VmlydHVhbEZQLCBPZmZzZXQpOworICAgIE1hY2hpbmVMb2NhdGlvbiBDU1NyYyhSZWcpOworICAgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZShMYWJlbCwgQ1NEc3QsIENTU3JjKSk7CisgIH0KK30KKworLy8vIGVtaXRQcm9sb2d1ZSAtIFB1c2ggY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyBvbnRvIHRoZSBzdGFjaywgd2hpY2gKKy8vLyBhdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgc3RhY2sgcG9pbnRlci4gQWRqdXN0IHRoZSBzdGFjayBwb2ludGVyIHRvIGFsbG9jYXRlCisvLy8gc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcy4gQWxzbyBlbWl0IGxhYmVscyB1c2VkIGJ5IHRoZSBleGNlcHRpb24gaGFuZGxlciB0bworLy8vIGdlbmVyYXRlIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgZnJhbWVzLgordm9pZCBYODZSZWdpc3RlckluZm86OmVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIgPSBNRi5mcm9udCgpOyAvLyBQcm9sb2d1ZSBnb2VzIGluIGVudHJ5IEJCLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IE1CQi5iZWdpbigpOworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgPSBNRi5nZXRGcmFtZUluZm8oKTsKKyAgY29uc3QgRnVuY3Rpb24gKkZuID0gTUYuZ2V0RnVuY3Rpb24oKTsKKyAgY29uc3QgWDg2U3VidGFyZ2V0ICpTdWJ0YXJnZXQgPSAmTUYuZ2V0VGFyZ2V0KCkuZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKTsKKyAgTWFjaGluZU1vZHVsZUluZm8gJk1NSSA9IE1GLmdldE1NSSgpOworICBYODZNYWNoaW5lRnVuY3Rpb25JbmZvICpYODZGSSA9IE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKyAgYm9vbCBuZWVkc0ZyYW1lTW92ZXMgPSBNTUkuaGFzRGVidWdJbmZvKCk7CisgIHVpbnQ2NF90IE1heEFsaWduICA9IE1GSS0+Z2V0TWF4QWxpZ25tZW50KCk7IC8vIERlc2lyZWQgc3RhY2sgYWxpZ25tZW50LgorICB1aW50NjRfdCBTdGFja1NpemUgPSBNRkktPmdldFN0YWNrU2l6ZSgpOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUuCisgIGJvb2wgSGFzRlAgPSBoYXNGUChNRik7CisgIERlYnVnTG9jIERMOworCisgIC8vIElmIHdlJ3JlIGZvcmNpbmcgYSBzdGFjayByZWFsaWdubWVudCB3ZSBjYW4ndCByZWx5IG9uIGp1c3QgdGhlIGZyYW1lCisgIC8vIGluZm8sIHdlIG5lZWQgdG8ga25vdyB0aGUgQUJJIHN0YWNrIGFsaWdubWVudCBhcyB3ZWxsIGluIGNhc2Ugd2UKKyAgLy8gaGF2ZSBhIGNhbGwgb3V0LiAgT3RoZXJ3aXNlIGp1c3QgbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBhbGlnbm1lbnQgLSB3ZSdsbAorICAvLyBnbyB3aXRoIHRoZSBtaW5pbXVtIFNsb3RTaXplLgorICBpZiAoRm9yY2VTdGFja0FsaWduKSB7CisgICAgaWYgKE1GSS0+aGFzQ2FsbHMoKSkKKyAgICAgIE1heEFsaWduID0gKFN0YWNrQWxpZ24gPiBNYXhBbGlnbikgPyBTdGFja0FsaWduIDogTWF4QWxpZ247CisgICAgZWxzZSBpZiAoTWF4QWxpZ24gPCBTbG90U2l6ZSkKKyAgICAgIE1heEFsaWduID0gU2xvdFNpemU7CisgIH0KKworICAvLyBBZGQgUkVUQUREUiBtb3ZlIGFyZWEgdG8gY2FsbGVlIHNhdmVkIGZyYW1lIHNpemUuCisgIGludCBUYWlsQ2FsbFJldHVybkFkZHJEZWx0YSA9IFg4NkZJLT5nZXRUQ1JldHVybkFkZHJEZWx0YSgpOworICBpZiAoVGFpbENhbGxSZXR1cm5BZGRyRGVsdGEgPCAwKQorICAgIFg4NkZJLT5zZXRDYWxsZWVTYXZlZEZyYW1lU2l6ZSgKKyAgICAgIFg4NkZJLT5nZXRDYWxsZWVTYXZlZEZyYW1lU2l6ZSgpIC0gVGFpbENhbGxSZXR1cm5BZGRyRGVsdGEpOworCisgIC8vIElmIHRoaXMgaXMgeDg2LTY0IGFuZCB0aGUgUmVkIFpvbmUgaXMgbm90IGRpc2FibGVkLCBpZiB3ZSBhcmUgYSBsZWFmCisgIC8vIGZ1bmN0aW9uLCBhbmQgdXNlIHVwIHRvIDEyOCBieXRlcyBvZiBzdGFjayBzcGFjZSwgZG9uJ3QgaGF2ZSBhIGZyYW1lCisgIC8vIHBvaW50ZXIsIGNhbGxzLCBvciBkeW5hbWljIGFsbG9jYSB0aGVuIHdlIGRvIG5vdCBuZWVkIHRvIGFkanVzdCB0aGUKKyAgLy8gc3RhY2sgcG9pbnRlciAod2UgZml0IGluIHRoZSBSZWQgWm9uZSkuCisgIGlmIChJczY0Qml0ICYmICFGbi0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6Tm9SZWRab25lKSAmJgorICAgICAgIW5lZWRzU3RhY2tSZWFsaWdubWVudChNRikgJiYKKyAgICAgICFNRkktPmhhc1ZhclNpemVkT2JqZWN0cygpICYmICAgICAgICAgICAgICAgIC8vIE5vIGR5bmFtaWMgYWxsb2NhLgorICAgICAgIU1GSS0+YWRqdXN0c1N0YWNrKCkgJiYgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gY2FsbHMuCisgICAgICAhU3VidGFyZ2V0LT5pc1RhcmdldFdpbjY0KCkpIHsgICAgICAgICAgICAgICAvLyBXaW42NCBoYXMgbm8gUmVkIFpvbmUKKyAgICB1aW50NjRfdCBNaW5TaXplID0gWDg2RkktPmdldENhbGxlZVNhdmVkRnJhbWVTaXplKCk7CisgICAgaWYgKEhhc0ZQKSBNaW5TaXplICs9IFNsb3RTaXplOworICAgIFN0YWNrU2l6ZSA9IHN0ZDo6bWF4KE1pblNpemUsIFN0YWNrU2l6ZSA+IDEyOCA/IFN0YWNrU2l6ZSAtIDEyOCA6IDApOworICAgIE1GSS0+c2V0U3RhY2tTaXplKFN0YWNrU2l6ZSk7CisgIH0gZWxzZSBpZiAoU3VidGFyZ2V0LT5pc1RhcmdldFdpbjY0KCkpIHsKKyAgICAvLyBXZSBuZWVkIHRvIGFsd2F5cyBhbGxvY2F0ZSAzMiBieXRlcyBhcyByZWdpc3RlciBzcGlsbCBhcmVhLgorICAgIC8vIEZJWE1FOiBXZSBtaWdodCByZXVzZSB0aGVzZSAzMiBieXRlcyBmb3IgbGVhZiBmdW5jdGlvbnMuCisgICAgU3RhY2tTaXplICs9IDMyOworICAgIE1GSS0+c2V0U3RhY2tTaXplKFN0YWNrU2l6ZSk7CisgIH0KKworICAvLyBJbnNlcnQgc3RhY2sgcG9pbnRlciBhZGp1c3RtZW50IGZvciBsYXRlciBtb3Zpbmcgb2YgcmV0dXJuIGFkZHIuICBPbmx5CisgIC8vIGFwcGxpZXMgdG8gdGFpbCBjYWxsIG9wdGltaXplZCBmdW5jdGlvbnMgd2hlcmUgdGhlIGNhbGxlZSBhcmd1bWVudCBzdGFjaworICAvLyBzaXplIGlzIGJpZ2dlciB0aGFuIHRoZSBjYWxsZXJzLgorICBpZiAoVGFpbENhbGxSZXR1cm5BZGRyRGVsdGEgPCAwKSB7CisgICAgTWFjaGluZUluc3RyICpNSSA9CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsCisgICAgICAgICAgICAgIFRJSS5nZXQoZ2V0U1VCcmlPcGNvZGUoSXM2NEJpdCwgLVRhaWxDYWxsUmV0dXJuQWRkckRlbHRhKSksCisgICAgICAgICAgICAgIFN0YWNrUHRyKQorICAgICAgICAuYWRkUmVnKFN0YWNrUHRyKQorICAgICAgICAuYWRkSW1tKC1UYWlsQ2FsbFJldHVybkFkZHJEZWx0YSk7CisgICAgTUktPmdldE9wZXJhbmQoMykuc2V0SXNEZWFkKCk7IC8vIFRoZSBFRkxBR1MgaW1wbGljaXQgZGVmIGlzIGRlYWQuCisgIH0KKworICAvLyBNYXBwaW5nIGZvciBtYWNoaW5lIG1vdmVzOgorICAvLworICAvLyAgIERTVDogVmlydHVhbEZQIEFORAorICAvLyAgICAgICAgU1JDOiBWaXJ0dWFsRlAgICAgICAgICAgICAgID0+IERXX0NGQV9kZWZfY2ZhX29mZnNldAorICAvLyAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAgICAgICAgID0+IERXX0NGQV9kZWZfY2ZhCisgIC8vCisgIC8vICAgU1JDOiBWaXJ0dWFsRlAgQU5ECisgIC8vICAgICAgICBEU1Q6IFJlZ2lzdGVyICAgICAgICAgICAgICAgPT4gRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIKKyAgLy8KKyAgLy8gICBFTFNFCisgIC8vICAgICAgICBPRkZTRVQgPCAwICAgICAgICAgICAgICAgICAgPT4gRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZgorICAvLyAgICAgICAgUkVHIDwgNjQgICAgICAgICAgICAgICAgICAgID0+IERXX0NGQV9vZmZzZXQgKyBSZWcKKyAgLy8gICAgICAgIEVMU0UgICAgICAgICAgICAgICAgICAgICAgICA9PiBEV19DRkFfb2Zmc2V0X2V4dGVuZGVkCisKKyAgc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+ICZNb3ZlcyA9IE1NSS5nZXRGcmFtZU1vdmVzKCk7CisgIGNvbnN0IFRhcmdldERhdGEgKlREID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0VGFyZ2V0RGF0YSgpOworICB1aW50NjRfdCBOdW1CeXRlcyA9IDA7CisgIGludCBzdGFja0dyb3d0aCA9IC1URC0+Z2V0UG9pbnRlclNpemUoKTsKKworICBpZiAoSGFzRlApIHsKKyAgICAvLyBDYWxjdWxhdGUgcmVxdWlyZWQgc3RhY2sgYWRqdXN0bWVudC4KKyAgICB1aW50NjRfdCBGcmFtZVNpemUgPSBTdGFja1NpemUgLSBTbG90U2l6ZTsKKyAgICBpZiAobmVlZHNTdGFja1JlYWxpZ25tZW50KE1GKSkKKyAgICAgIEZyYW1lU2l6ZSA9IChGcmFtZVNpemUgKyBNYXhBbGlnbiAtIDEpIC8gTWF4QWxpZ24gKiBNYXhBbGlnbjsKKworICAgIE51bUJ5dGVzID0gRnJhbWVTaXplIC0gWDg2RkktPmdldENhbGxlZVNhdmVkRnJhbWVTaXplKCk7CisKKyAgICAvLyBHZXQgdGhlIG9mZnNldCBvZiB0aGUgc3RhY2sgc2xvdCBmb3IgdGhlIEVCUCByZWdpc3Rlciwgd2hpY2ggaXMKKyAgICAvLyBndWFyYW50ZWVkIHRvIGJlIHRoZSBsYXN0IHNsb3QgYnkgcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlRnJhbWVGaW5hbGl6ZWQuCisgICAgLy8gVXBkYXRlIHRoZSBmcmFtZSBvZmZzZXQgYWRqdXN0bWVudC4KKyAgICBNRkktPnNldE9mZnNldEFkanVzdG1lbnQoLU51bUJ5dGVzKTsKKworICAgIC8vIFNhdmUgRUJQL1JCUCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdGFjayBzbG90LgorICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwgVElJLmdldChJczY0Qml0ID8gWDg2OjpQVVNINjRyIDogWDg2OjpQVVNIMzJyKSkKKyAgICAgIC5hZGRSZWcoRnJhbWVQdHIsIFJlZ1N0YXRlOjpLaWxsKTsKKworICAgIGlmIChuZWVkc0ZyYW1lTW92ZXMpIHsKKyAgICAgIC8vIE1hcmsgdGhlIHBsYWNlIHdoZXJlIEVCUC9SQlAgd2FzIHNhdmVkLgorICAgICAgTUNTeW1ib2wgKkZyYW1lTGFiZWwgPSBNTUkuZ2V0Q29udGV4dCgpLkNyZWF0ZVRlbXBTeW1ib2woKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwgVElJLmdldChYODY6OlBST0xPR19MQUJFTCkpLmFkZFN5bShGcmFtZUxhYmVsKTsKKworICAgICAgLy8gRGVmaW5lIHRoZSBjdXJyZW50IENGQSBydWxlIHRvIHVzZSB0aGUgcHJvdmlkZWQgb2Zmc2V0LgorICAgICAgaWYgKFN0YWNrU2l6ZSkgeworICAgICAgICBNYWNoaW5lTG9jYXRpb24gU1BEc3QoTWFjaGluZUxvY2F0aW9uOjpWaXJ0dWFsRlApOworICAgICAgICBNYWNoaW5lTG9jYXRpb24gU1BTcmMoTWFjaGluZUxvY2F0aW9uOjpWaXJ0dWFsRlAsIDIgKiBzdGFja0dyb3d0aCk7CisgICAgICAgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZShGcmFtZUxhYmVsLCBTUERzdCwgU1BTcmMpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZJWE1FOiBWZXJpZnkgJiBpbXBsZW1lbnQgZm9yIEZQCisgICAgICAgIE1hY2hpbmVMb2NhdGlvbiBTUERzdChTdGFja1B0cik7CisgICAgICAgIE1hY2hpbmVMb2NhdGlvbiBTUFNyYyhTdGFja1B0ciwgc3RhY2tHcm93dGgpOworICAgICAgICBNb3Zlcy5wdXNoX2JhY2soTWFjaGluZU1vdmUoRnJhbWVMYWJlbCwgU1BEc3QsIFNQU3JjKSk7CisgICAgICB9CisKKyAgICAgIC8vIENoYW5nZSB0aGUgcnVsZSBmb3IgdGhlIEZyYW1lUHRyIHRvIGJlIGFuICJvZmZzZXQiIHJ1bGUuCisgICAgICBNYWNoaW5lTG9jYXRpb24gRlBEc3QoTWFjaGluZUxvY2F0aW9uOjpWaXJ0dWFsRlAsIDIgKiBzdGFja0dyb3d0aCk7CisgICAgICBNYWNoaW5lTG9jYXRpb24gRlBTcmMoRnJhbWVQdHIpOworICAgICAgTW92ZXMucHVzaF9iYWNrKE1hY2hpbmVNb3ZlKEZyYW1lTGFiZWwsIEZQRHN0LCBGUFNyYykpOworICAgIH0KKworICAgIC8vIFVwZGF0ZSBFQlAgd2l0aCB0aGUgbmV3IGJhc2UgdmFsdWUuLi4KKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsCisgICAgICAgICAgICBUSUkuZ2V0KElzNjRCaXQgPyBYODY6Ok1PVjY0cnIgOiBYODY6Ok1PVjMycnIpLCBGcmFtZVB0cikKKyAgICAgICAgLmFkZFJlZyhTdGFja1B0cik7CisKKyAgICBpZiAobmVlZHNGcmFtZU1vdmVzKSB7CisgICAgICAvLyBNYXJrIGVmZmVjdGl2ZSBiZWdpbm5pbmcgb2Ygd2hlbiBmcmFtZSBwb2ludGVyIGJlY29tZXMgdmFsaWQuCisgICAgICBNQ1N5bWJvbCAqRnJhbWVMYWJlbCA9IE1NSS5nZXRDb250ZXh0KCkuQ3JlYXRlVGVtcFN5bWJvbCgpOworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KFg4Njo6UFJPTE9HX0xBQkVMKSkuYWRkU3ltKEZyYW1lTGFiZWwpOworCisgICAgICAvLyBEZWZpbmUgdGhlIGN1cnJlbnQgQ0ZBIHRvIHVzZSB0aGUgRUJQL1JCUCByZWdpc3Rlci4KKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBGUERzdChGcmFtZVB0cik7CisgICAgICBNYWNoaW5lTG9jYXRpb24gRlBTcmMoTWFjaGluZUxvY2F0aW9uOjpWaXJ0dWFsRlApOworICAgICAgTW92ZXMucHVzaF9iYWNrKE1hY2hpbmVNb3ZlKEZyYW1lTGFiZWwsIEZQRHN0LCBGUFNyYykpOworICAgIH0KKworICAgIC8vIE1hcmsgdGhlIEZyYW1lUHRyIGFzIGxpdmUtaW4gaW4gZXZlcnkgYmxvY2sgZXhjZXB0IHRoZSBlbnRyeS4KKyAgICBmb3IgKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IGxsdm06Om5leHQoTUYuYmVnaW4oKSksIEUgPSBNRi5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgSS0+YWRkTGl2ZUluKEZyYW1lUHRyKTsKKworICAgIC8vIFJlYWxpZ24gc3RhY2sKKyAgICBpZiAobmVlZHNTdGFja1JlYWxpZ25tZW50KE1GKSkgeworICAgICAgTWFjaGluZUluc3RyICpNSSA9CisgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwKKyAgICAgICAgICAgICAgICBUSUkuZ2V0KElzNjRCaXQgPyBYODY6OkFORDY0cmkzMiA6IFg4Njo6QU5EMzJyaSksCisgICAgICAgICAgICAgICAgU3RhY2tQdHIpLmFkZFJlZyhTdGFja1B0cikuYWRkSW1tKC1NYXhBbGlnbik7CisKKyAgICAgIC8vIFRoZSBFRkxBR1MgaW1wbGljaXQgZGVmIGlzIGRlYWQuCisgICAgICBNSS0+Z2V0T3BlcmFuZCgzKS5zZXRJc0RlYWQoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgTnVtQnl0ZXMgPSBTdGFja1NpemUgLSBYODZGSS0+Z2V0Q2FsbGVlU2F2ZWRGcmFtZVNpemUoKTsKKyAgfQorCisgIC8vIFNraXAgdGhlIGNhbGxlZS1zYXZlZCBwdXNoIGluc3RydWN0aW9ucy4KKyAgYm9vbCBQdXNoZWRSZWdzID0gZmFsc2U7CisgIGludCBTdGFja09mZnNldCA9IDIgKiBzdGFja0dyb3d0aDsKKworICB3aGlsZSAoTUJCSSAhPSBNQkIuZW5kKCkgJiYKKyAgICAgICAgIChNQkJJLT5nZXRPcGNvZGUoKSA9PSBYODY6OlBVU0gzMnIgfHwKKyAgICAgICAgICBNQkJJLT5nZXRPcGNvZGUoKSA9PSBYODY6OlBVU0g2NHIpKSB7CisgICAgUHVzaGVkUmVncyA9IHRydWU7CisgICAgKytNQkJJOworCisgICAgaWYgKCFIYXNGUCAmJiBuZWVkc0ZyYW1lTW92ZXMpIHsKKyAgICAgIC8vIE1hcmsgY2FsbGVlLXNhdmVkIHB1c2ggaW5zdHJ1Y3Rpb24uCisgICAgICBNQ1N5bWJvbCAqTGFiZWwgPSBNTUkuZ2V0Q29udGV4dCgpLkNyZWF0ZVRlbXBTeW1ib2woKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwgVElJLmdldChYODY6OlBST0xPR19MQUJFTCkpLmFkZFN5bShMYWJlbCk7CisKKyAgICAgIC8vIERlZmluZSB0aGUgY3VycmVudCBDRkEgcnVsZSB0byB1c2UgdGhlIHByb3ZpZGVkIG9mZnNldC4KKyAgICAgIHVuc2lnbmVkIFB0ciA9IFN0YWNrU2l6ZSA/CisgICAgICAgIE1hY2hpbmVMb2NhdGlvbjo6VmlydHVhbEZQIDogU3RhY2tQdHI7CisgICAgICBNYWNoaW5lTG9jYXRpb24gU1BEc3QoUHRyKTsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBTUFNyYyhQdHIsIFN0YWNrT2Zmc2V0KTsKKyAgICAgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZShMYWJlbCwgU1BEc3QsIFNQU3JjKSk7CisgICAgICBTdGFja09mZnNldCArPSBzdGFja0dyb3d0aDsKKyAgICB9CisgIH0KKworICBETCA9IE1CQi5maW5kRGVidWdMb2MoTUJCSSk7CisKKyAgLy8gQWRqdXN0IHN0YWNrIHBvaW50ZXI6IEVTUCAtPSBudW1ieXRlcy4KKyAgaWYgKE51bUJ5dGVzID49IDQwOTYgJiYgU3VidGFyZ2V0LT5pc1RhcmdldEN5Z01pbmcoKSkgeworICAgIC8vIENoZWNrLCB3aGV0aGVyIEVBWCBpcyBsaXZlaW4gZm9yIHRoaXMgZnVuY3Rpb24uCisgICAgYm9vbCBpc0VBWEFsaXZlID0gZmFsc2U7CisgICAgZm9yIChNYWNoaW5lUmVnaXN0ZXJJbmZvOjpsaXZlaW5faXRlcmF0b3IKKyAgICAgICAgICAgSUkgPSBNRi5nZXRSZWdJbmZvKCkubGl2ZWluX2JlZ2luKCksCisgICAgICAgICAgIEVFID0gTUYuZ2V0UmVnSW5mbygpLmxpdmVpbl9lbmQoKTsgKElJICE9IEVFKSAmJiAhaXNFQVhBbGl2ZTsgKytJSSkgeworICAgICAgdW5zaWduZWQgUmVnID0gSUktPmZpcnN0OworICAgICAgaXNFQVhBbGl2ZSA9IChSZWcgPT0gWDg2OjpFQVggfHwgUmVnID09IFg4Njo6QVggfHwKKyAgICAgICAgICAgICAgICAgICAgUmVnID09IFg4Njo6QUggfHwgUmVnID09IFg4Njo6QUwpOworICAgIH0KKworICAgIC8vIEZ1bmN0aW9uIHByb2xvZ3VlIGNhbGxzIF9hbGxvY2EgdG8gcHJvYmUgdGhlIHN0YWNrIHdoZW4gYWxsb2NhdGluZyBtb3JlCisgICAgLy8gdGhhbiA0ayBieXRlcyBpbiBvbmUgZ28uIFRvdWNoaW5nIHRoZSBzdGFjayBhdCA0SyBpbmNyZW1lbnRzIGlzIG5lY2Vzc2FyeQorICAgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBndWFyZCBwYWdlcyB1c2VkIGJ5IHRoZSBPUyB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VyIGFyZQorICAgIC8vIGFsbG9jYXRlZCBpbiBjb3JyZWN0IHNlcXVlbmNlLgorICAgIGlmICghaXNFQVhBbGl2ZSkgeworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KFg4Njo6TU9WMzJyaSksIFg4Njo6RUFYKQorICAgICAgICAuYWRkSW1tKE51bUJ5dGVzKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwgVElJLmdldChYODY6OkNBTExwY3JlbDMyKSkKKyAgICAgICAgLmFkZEV4dGVybmFsU3ltYm9sKCJfYWxsb2NhIikKKyAgICAgICAgLmFkZFJlZyhTdGFja1B0ciwgUmVnU3RhdGU6OkRlZmluZSB8IFJlZ1N0YXRlOjpJbXBsaWNpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNhdmUgRUFYCisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsIFRJSS5nZXQoWDg2OjpQVVNIMzJyKSkKKyAgICAgICAgLmFkZFJlZyhYODY6OkVBWCwgUmVnU3RhdGU6OktpbGwpOworCisgICAgICAvLyBBbGxvY2F0ZSBOdW1CeXRlcy00IGJ5dGVzIG9uIHN0YWNrLiBXZSdsbCBhbHNvIHVzZSA0IGFscmVhZHkKKyAgICAgIC8vIGFsbG9jYXRlZCBieXRlcyBmb3IgRUFYLgorICAgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KFg4Njo6TU9WMzJyaSksIFg4Njo6RUFYKQorICAgICAgICAuYWRkSW1tKE51bUJ5dGVzIC0gNCk7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsIFRJSS5nZXQoWDg2OjpDQUxMcGNyZWwzMikpCisgICAgICAgIC5hZGRFeHRlcm5hbFN5bWJvbCgiX2FsbG9jYSIpCisgICAgICAgIC5hZGRSZWcoU3RhY2tQdHIsIFJlZ1N0YXRlOjpEZWZpbmUgfCBSZWdTdGF0ZTo6SW1wbGljaXQpOworCisgICAgICAvLyBSZXN0b3JlIEVBWAorICAgICAgTWFjaGluZUluc3RyICpNSSA9IGFkZFJlZ09mZnNldChCdWlsZE1JKE1GLCBETCwgVElJLmdldChYODY6Ok1PVjMycm0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg4Njo6RUFYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2tQdHIsIGZhbHNlLCBOdW1CeXRlcyAtIDQpOworICAgICAgTUJCLmluc2VydChNQkJJLCBNSSk7CisgICAgfQorICB9IGVsc2UgaWYgKE51bUJ5dGVzKSB7CisgICAgLy8gSWYgdGhlcmUgaXMgYW4gU1VCMzJyaSBvZiBFU1AgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgaW5zdHJ1Y3Rpb24sIG1lcmdlCisgICAgLy8gdGhlIHR3by4gVGhpcyBjYW4gYmUgdGhlIGNhc2Ugd2hlbiB0YWlsIGNhbGwgZWxpbWluYXRpb24gaXMgZW5hYmxlZCBhbmQKKyAgICAvLyB0aGUgY2FsbGVlIGhhcyBtb3JlIGFyZ3VtZW50cyB0aGVuIHRoZSBjYWxsZXIuCisgICAgTnVtQnl0ZXMgLT0gbWVyZ2VTUFVwZGF0ZXMoTUJCLCBNQkJJLCBTdGFja1B0ciwgdHJ1ZSk7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhbiBBREQzMnJpIG9yIFNVQjMycmkgb2YgRVNQIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMKKyAgICAvLyBpbnN0cnVjdGlvbiwgbWVyZ2UgdGhlIHR3byBpbnN0cnVjdGlvbnMuCisgICAgbWVyZ2VTUFVwZGF0ZXNEb3duKE1CQiwgTUJCSSwgU3RhY2tQdHIsICZOdW1CeXRlcyk7CisKKyAgICBpZiAoTnVtQnl0ZXMpCisgICAgICBlbWl0U1BVcGRhdGUoTUJCLCBNQkJJLCBTdGFja1B0ciwgLShpbnQ2NF90KU51bUJ5dGVzLCBJczY0Qml0LCBUSUkpOworICB9CisKKyAgaWYgKChOdW1CeXRlcyB8fCBQdXNoZWRSZWdzKSAmJiBuZWVkc0ZyYW1lTW92ZXMpIHsKKyAgICAvLyBNYXJrIGVuZCBvZiBzdGFjayBwb2ludGVyIGFkanVzdG1lbnQuCisgICAgTUNTeW1ib2wgKkxhYmVsID0gTU1JLmdldENvbnRleHQoKS5DcmVhdGVUZW1wU3ltYm9sKCk7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KFg4Njo6UFJPTE9HX0xBQkVMKSkuYWRkU3ltKExhYmVsKTsKKworICAgIGlmICghSGFzRlAgJiYgTnVtQnl0ZXMpIHsKKyAgICAgIC8vIERlZmluZSB0aGUgY3VycmVudCBDRkEgcnVsZSB0byB1c2UgdGhlIHByb3ZpZGVkIG9mZnNldC4KKyAgICAgIGlmIChTdGFja1NpemUpIHsKKyAgICAgICAgTWFjaGluZUxvY2F0aW9uIFNQRHN0KE1hY2hpbmVMb2NhdGlvbjo6VmlydHVhbEZQKTsKKyAgICAgICAgTWFjaGluZUxvY2F0aW9uIFNQU3JjKE1hY2hpbmVMb2NhdGlvbjo6VmlydHVhbEZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVN0YWNrU2l6ZSArIHN0YWNrR3Jvd3RoKTsKKyAgICAgICAgTW92ZXMucHVzaF9iYWNrKE1hY2hpbmVNb3ZlKExhYmVsLCBTUERzdCwgU1BTcmMpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZJWE1FOiBWZXJpZnkgJiBpbXBsZW1lbnQgZm9yIEZQCisgICAgICAgIE1hY2hpbmVMb2NhdGlvbiBTUERzdChTdGFja1B0cik7CisgICAgICAgIE1hY2hpbmVMb2NhdGlvbiBTUFNyYyhTdGFja1B0ciwgc3RhY2tHcm93dGgpOworICAgICAgICBNb3Zlcy5wdXNoX2JhY2soTWFjaGluZU1vdmUoTGFiZWwsIFNQRHN0LCBTUFNyYykpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEVtaXQgRFdBUkYgaW5mbyBzcGVjaWZ5aW5nIHRoZSBvZmZzZXRzIG9mIHRoZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLgorICAgIGlmIChQdXNoZWRSZWdzKQorICAgICAgZW1pdENhbGxlZVNhdmVkRnJhbWVNb3ZlcyhNRiwgTGFiZWwsIEhhc0ZQID8gRnJhbWVQdHIgOiBTdGFja1B0cik7CisgIH0KK30KKwordm9pZCBYODZSZWdpc3RlckluZm86OmVtaXRFcGlsb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCB7CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBYODZNYWNoaW5lRnVuY3Rpb25JbmZvICpYODZGSSA9IE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBwcmlvcihNQkIuZW5kKCkpOworICB1bnNpZ25lZCBSZXRPcGNvZGUgPSBNQkJJLT5nZXRPcGNvZGUoKTsKKyAgRGVidWdMb2MgREwgPSBNQkJJLT5nZXREZWJ1Z0xvYygpOworCisgIHN3aXRjaCAoUmV0T3Bjb2RlKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ2FuIG9ubHkgaW5zZXJ0IGVwaWxvZyBpbnRvIHJldHVybmluZyBibG9ja3MiKTsKKyAgY2FzZSBYODY6OlJFVDoKKyAgY2FzZSBYODY6OlJFVEk6CisgIGNhc2UgWDg2OjpUQ1JFVFVSTmRpOgorICBjYXNlIFg4Njo6VENSRVRVUk5yaToKKyAgY2FzZSBYODY6OlRDUkVUVVJObWk6CisgIGNhc2UgWDg2OjpUQ1JFVFVSTmRpNjQ6CisgIGNhc2UgWDg2OjpUQ1JFVFVSTnJpNjQ6CisgIGNhc2UgWDg2OjpUQ1JFVFVSTm1pNjQ6CisgIGNhc2UgWDg2OjpFSF9SRVRVUk46CisgIGNhc2UgWDg2OjpFSF9SRVRVUk42NDoKKyAgICBicmVhazsgIC8vIFRoZXNlIGFyZSBvaworICB9CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgRnJhbWVJbmZvLgorICB1aW50NjRfdCBTdGFja1NpemUgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworICB1aW50NjRfdCBNYXhBbGlnbiAgPSBNRkktPmdldE1heEFsaWdubWVudCgpOworICB1bnNpZ25lZCBDU1NpemUgPSBYODZGSS0+Z2V0Q2FsbGVlU2F2ZWRGcmFtZVNpemUoKTsKKyAgdWludDY0X3QgTnVtQnl0ZXMgPSAwOworCisgIC8vIElmIHdlJ3JlIGZvcmNpbmcgYSBzdGFjayByZWFsaWdubWVudCB3ZSBjYW4ndCByZWx5IG9uIGp1c3QgdGhlIGZyYW1lCisgIC8vIGluZm8sIHdlIG5lZWQgdG8ga25vdyB0aGUgQUJJIHN0YWNrIGFsaWdubWVudCBhcyB3ZWxsIGluIGNhc2Ugd2UKKyAgLy8gaGF2ZSBhIGNhbGwgb3V0LiAgT3RoZXJ3aXNlIGp1c3QgbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBhbGlnbm1lbnQgLSB3ZSdsbAorICAvLyBnbyB3aXRoIHRoZSBtaW5pbXVtLgorICBpZiAoRm9yY2VTdGFja0FsaWduKSB7CisgICAgaWYgKE1GSS0+aGFzQ2FsbHMoKSkKKyAgICAgIE1heEFsaWduID0gKFN0YWNrQWxpZ24gPiBNYXhBbGlnbikgPyBTdGFja0FsaWduIDogTWF4QWxpZ247CisgICAgZWxzZQorICAgICAgTWF4QWxpZ24gPSBNYXhBbGlnbiA/IE1heEFsaWduIDogNDsKKyAgfQorCisgIGlmIChoYXNGUChNRikpIHsKKyAgICAvLyBDYWxjdWxhdGUgcmVxdWlyZWQgc3RhY2sgYWRqdXN0bWVudC4KKyAgICB1aW50NjRfdCBGcmFtZVNpemUgPSBTdGFja1NpemUgLSBTbG90U2l6ZTsKKyAgICBpZiAobmVlZHNTdGFja1JlYWxpZ25tZW50KE1GKSkKKyAgICAgIEZyYW1lU2l6ZSA9IChGcmFtZVNpemUgKyBNYXhBbGlnbiAtIDEpL01heEFsaWduKk1heEFsaWduOworCisgICAgTnVtQnl0ZXMgPSBGcmFtZVNpemUgLSBDU1NpemU7CisKKyAgICAvLyBQb3AgRUJQLgorICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwKKyAgICAgICAgICAgIFRJSS5nZXQoSXM2NEJpdCA/IFg4Njo6UE9QNjRyIDogWDg2OjpQT1AzMnIpLCBGcmFtZVB0cik7CisgIH0gZWxzZSB7CisgICAgTnVtQnl0ZXMgPSBTdGFja1NpemUgLSBDU1NpemU7CisgIH0KKworICAvLyBTa2lwIHRoZSBjYWxsZWUtc2F2ZWQgcG9wIGluc3RydWN0aW9ucy4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIExhc3RDU1BvcCA9IE1CQkk7CisgIHdoaWxlIChNQkJJICE9IE1CQi5iZWdpbigpKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFBJID0gcHJpb3IoTUJCSSk7CisgICAgdW5zaWduZWQgT3BjID0gUEktPmdldE9wY29kZSgpOworCisgICAgaWYgKE9wYyAhPSBYODY6OlBPUDMyciAmJiBPcGMgIT0gWDg2OjpQT1A2NHIgJiYKKyAgICAgICAgIVBJLT5nZXREZXNjKCkuaXNUZXJtaW5hdG9yKCkpCisgICAgICBicmVhazsKKworICAgIC0tTUJCSTsKKyAgfQorCisgIERMID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKworICAvLyBJZiB0aGVyZSBpcyBhbiBBREQzMnJpIG9yIFNVQjMycmkgb2YgRVNQIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzCisgIC8vIGluc3RydWN0aW9uLCBtZXJnZSB0aGUgdHdvIGluc3RydWN0aW9ucy4KKyAgaWYgKE51bUJ5dGVzIHx8IE1GSS0+aGFzVmFyU2l6ZWRPYmplY3RzKCkpCisgICAgbWVyZ2VTUFVwZGF0ZXNVcChNQkIsIE1CQkksIFN0YWNrUHRyLCAmTnVtQnl0ZXMpOworCisgIC8vIElmIGR5bmFtaWMgYWxsb2NhIGlzIHVzZWQsIHRoZW4gcmVzZXQgZXNwIHRvIHBvaW50IHRvIHRoZSBsYXN0IGNhbGxlZS1zYXZlZAorICAvLyBzbG90IGJlZm9yZSBwb3BwaW5nIHRoZW0gb2ZmISBTYW1lIGFwcGxpZXMgZm9yIHRoZSBjYXNlLCB3aGVuIHN0YWNrIHdhcworICAvLyByZWFsaWduZWQuCisgIGlmIChuZWVkc1N0YWNrUmVhbGlnbm1lbnQoTUYpKSB7CisgICAgLy8gV2UgY2Fubm90IHVzZSBMRUEgaGVyZSwgYmVjYXVzZSBzdGFjayBwb2ludGVyIHdhcyByZWFsaWduZWQuIFdlIG5lZWQgdG8KKyAgICAvLyBkZWFsbG9jYXRlIGxvY2FsIGZyYW1lIGJhY2suCisgICAgaWYgKENTU2l6ZSkgeworICAgICAgZW1pdFNQVXBkYXRlKE1CQiwgTUJCSSwgU3RhY2tQdHIsIE51bUJ5dGVzLCBJczY0Qml0LCBUSUkpOworICAgICAgTUJCSSA9IHByaW9yKExhc3RDU1BvcCk7CisgICAgfQorCisgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLAorICAgICAgICAgICAgVElJLmdldChJczY0Qml0ID8gWDg2OjpNT1Y2NHJyIDogWDg2OjpNT1YzMnJyKSwKKyAgICAgICAgICAgIFN0YWNrUHRyKS5hZGRSZWcoRnJhbWVQdHIpOworICB9IGVsc2UgaWYgKE1GSS0+aGFzVmFyU2l6ZWRPYmplY3RzKCkpIHsKKyAgICBpZiAoQ1NTaXplKSB7CisgICAgICB1bnNpZ25lZCBPcGMgPSBJczY0Qml0ID8gWDg2OjpMRUE2NHIgOiBYODY6OkxFQTMycjsKKyAgICAgIE1hY2hpbmVJbnN0ciAqTUkgPQorICAgICAgICBhZGRSZWdPZmZzZXQoQnVpbGRNSShNRiwgREwsIFRJSS5nZXQoT3BjKSwgU3RhY2tQdHIpLAorICAgICAgICAgICAgICAgICAgICAgRnJhbWVQdHIsIGZhbHNlLCAtQ1NTaXplKTsKKyAgICAgIE1CQi5pbnNlcnQoTUJCSSwgTUkpOworICAgIH0gZWxzZSB7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsCisgICAgICAgICAgICAgIFRJSS5nZXQoSXM2NEJpdCA/IFg4Njo6TU9WNjRyciA6IFg4Njo6TU9WMzJyciksIFN0YWNrUHRyKQorICAgICAgICAuYWRkUmVnKEZyYW1lUHRyKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoTnVtQnl0ZXMpIHsKKyAgICAvLyBBZGp1c3Qgc3RhY2sgcG9pbnRlciBiYWNrOiBFU1AgKz0gbnVtYnl0ZXMuCisgICAgZW1pdFNQVXBkYXRlKE1CQiwgTUJCSSwgU3RhY2tQdHIsIE51bUJ5dGVzLCBJczY0Qml0LCBUSUkpOworICB9CisKKyAgLy8gV2UncmUgcmV0dXJuaW5nIGZyb20gZnVuY3Rpb24gdmlhIGVoX3JldHVybi4KKyAgaWYgKFJldE9wY29kZSA9PSBYODY6OkVIX1JFVFVSTiB8fCBSZXRPcGNvZGUgPT0gWDg2OjpFSF9SRVRVUk42NCkgeworICAgIE1CQkkgPSBwcmlvcihNQkIuZW5kKCkpOworICAgIE1hY2hpbmVPcGVyYW5kICZEZXN0QWRkciAgPSBNQkJJLT5nZXRPcGVyYW5kKDApOworICAgIGFzc2VydChEZXN0QWRkci5pc1JlZygpICYmICJPZmZzZXQgc2hvdWxkIGJlIGluIHJlZ2lzdGVyISIpOworICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwKKyAgICAgICAgICAgIFRJSS5nZXQoSXM2NEJpdCA/IFg4Njo6TU9WNjRyciA6IFg4Njo6TU9WMzJyciksCisgICAgICAgICAgICBTdGFja1B0cikuYWRkUmVnKERlc3RBZGRyLmdldFJlZygpKTsKKyAgfSBlbHNlIGlmIChSZXRPcGNvZGUgPT0gWDg2OjpUQ1JFVFVSTnJpIHx8IFJldE9wY29kZSA9PSBYODY6OlRDUkVUVVJOZGkgfHwKKyAgICAgICAgICAgICBSZXRPcGNvZGUgPT0gWDg2OjpUQ1JFVFVSTm1pIHx8CisgICAgICAgICAgICAgUmV0T3Bjb2RlID09IFg4Njo6VENSRVRVUk5yaTY0IHx8IFJldE9wY29kZSA9PSBYODY6OlRDUkVUVVJOZGk2NCB8fAorICAgICAgICAgICAgIFJldE9wY29kZSA9PSBYODY6OlRDUkVUVVJObWk2NCkgeworICAgIGJvb2wgaXNNZW0gPSBSZXRPcGNvZGUgPT0gWDg2OjpUQ1JFVFVSTm1pIHx8IFJldE9wY29kZSA9PSBYODY6OlRDUkVUVVJObWk2NDsKKyAgICAvLyBUYWlsIGNhbGwgcmV0dXJuOiBhZGp1c3QgdGhlIHN0YWNrIHBvaW50ZXIgYW5kIGp1bXAgdG8gY2FsbGVlLgorICAgIE1CQkkgPSBwcmlvcihNQkIuZW5kKCkpOworICAgIE1hY2hpbmVPcGVyYW5kICZKdW1wVGFyZ2V0ID0gTUJCSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBNYWNoaW5lT3BlcmFuZCAmU3RhY2tBZGp1c3QgPSBNQkJJLT5nZXRPcGVyYW5kKGlzTWVtID8gNSA6IDEpOworICAgIGFzc2VydChTdGFja0FkanVzdC5pc0ltbSgpICYmICJFeHBlY3RpbmcgaW1tZWRpYXRlIHZhbHVlLiIpOworCisgICAgLy8gQWRqdXN0IHN0YWNrIHBvaW50ZXIuCisgICAgaW50IFN0YWNrQWRqID0gU3RhY2tBZGp1c3QuZ2V0SW1tKCk7CisgICAgaW50IE1heFRDRGVsdGEgPSBYODZGSS0+Z2V0VENSZXR1cm5BZGRyRGVsdGEoKTsKKyAgICBpbnQgT2Zmc2V0ID0gMDsKKyAgICBhc3NlcnQoTWF4VENEZWx0YSA8PSAwICYmICJNYXhUQ0RlbHRhIHNob3VsZCBuZXZlciBiZSBwb3NpdGl2ZSIpOworCisgICAgLy8gSW5jb3BvcmF0ZSB0aGUgcmV0YWRkciBhcmVhLgorICAgIE9mZnNldCA9IFN0YWNrQWRqLU1heFRDRGVsdGE7CisgICAgYXNzZXJ0KE9mZnNldCA+PSAwICYmICJPZmZzZXQgc2hvdWxkIG5ldmVyIGJlIG5lZ2F0aXZlIik7CisKKyAgICBpZiAoT2Zmc2V0KSB7CisgICAgICAvLyBDaGVjayBmb3IgcG9zc2libGUgbWVyZ2Ugd2l0aCBwcmVjZWVkaW5nIEFERCBpbnN0cnVjdGlvbi4KKyAgICAgIE9mZnNldCArPSBtZXJnZVNQVXBkYXRlcyhNQkIsIE1CQkksIFN0YWNrUHRyLCB0cnVlKTsKKyAgICAgIGVtaXRTUFVwZGF0ZShNQkIsIE1CQkksIFN0YWNrUHRyLCBPZmZzZXQsIElzNjRCaXQsIFRJSSk7CisgICAgfQorCisgICAgLy8gSnVtcCB0byBsYWJlbCBvciB2YWx1ZSBpbiByZWdpc3Rlci4KKyAgICBpZiAoUmV0T3Bjb2RlID09IFg4Njo6VENSRVRVUk5kaSB8fCBSZXRPcGNvZGUgPT0gWDg2OjpUQ1JFVFVSTmRpNjQpIHsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBETCwgVElJLmdldCgoUmV0T3Bjb2RlID09IFg4Njo6VENSRVRVUk5kaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFg4Njo6VEFJTEpNUGQgOiBYODY6OlRBSUxKTVBkNjQpKS4KKyAgICAgICAgYWRkR2xvYmFsQWRkcmVzcyhKdW1wVGFyZ2V0LmdldEdsb2JhbCgpLCBKdW1wVGFyZ2V0LmdldE9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEp1bXBUYXJnZXQuZ2V0VGFyZ2V0RmxhZ3MoKSk7CisgICAgfSBlbHNlIGlmIChSZXRPcGNvZGUgPT0gWDg2OjpUQ1JFVFVSTm1pIHx8IFJldE9wY29kZSA9PSBYODY6OlRDUkVUVVJObWk2NCkgeworICAgICAgTWFjaGluZUluc3RyQnVpbGRlciBNSUIgPQorICAgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsIFRJSS5nZXQoKFJldE9wY29kZSA9PSBYODY6OlRDUkVUVVJObWkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFg4Njo6VEFJTEpNUG0gOiBYODY6OlRBSUxKTVBtNjQpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gNTsgKytpKQorICAgICAgICBNSUIuYWRkT3BlcmFuZChNQkJJLT5nZXRPcGVyYW5kKGkpKTsKKyAgICB9IGVsc2UgaWYgKFJldE9wY29kZSA9PSBYODY6OlRDUkVUVVJOcmk2NCkgeworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIERMLCBUSUkuZ2V0KFg4Njo6VEFJTEpNUHI2NCkpLgorICAgICAgICBhZGRSZWcoSnVtcFRhcmdldC5nZXRSZWcoKSwgUmVnU3RhdGU6OktpbGwpOworICAgIH0gZWxzZSB7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgREwsIFRJSS5nZXQoWDg2OjpUQUlMSk1QcikpLgorICAgICAgICBhZGRSZWcoSnVtcFRhcmdldC5nZXRSZWcoKSwgUmVnU3RhdGU6OktpbGwpOworICAgIH0KKworICAgIE1hY2hpbmVJbnN0ciAqTmV3TUkgPSBwcmlvcihNQkJJKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAyLCBlID0gTUJCSS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBOZXdNSS0+YWRkT3BlcmFuZChNQkJJLT5nZXRPcGVyYW5kKGkpKTsKKworICAgIC8vIERlbGV0ZSB0aGUgcHNldWRvIGluc3RydWN0aW9uIFRDUkVUVVJOLgorICAgIE1CQi5lcmFzZShNQkJJKTsKKyAgfSBlbHNlIGlmICgoUmV0T3Bjb2RlID09IFg4Njo6UkVUIHx8IFJldE9wY29kZSA9PSBYODY6OlJFVEkpICYmCisgICAgICAgICAgICAgKFg4NkZJLT5nZXRUQ1JldHVybkFkZHJEZWx0YSgpIDwgMCkpIHsKKyAgICAvLyBBZGQgdGhlIHJldHVybiBhZGRyIGFyZWEgZGVsdGEgYmFjayBzaW5jZSB3ZSBhcmUgbm90IHRhaWwgY2FsbGluZy4KKyAgICBpbnQgZGVsdGEgPSAtMSpYODZGSS0+Z2V0VENSZXR1cm5BZGRyRGVsdGEoKTsKKyAgICBNQkJJID0gcHJpb3IoTUJCLmVuZCgpKTsKKworICAgIC8vIENoZWNrIGZvciBwb3NzaWJsZSBtZXJnZSB3aXRoIHByZWNlZWRpbmcgQUREIGluc3RydWN0aW9uLgorICAgIGRlbHRhICs9IG1lcmdlU1BVcGRhdGVzKE1CQiwgTUJCSSwgU3RhY2tQdHIsIHRydWUpOworICAgIGVtaXRTUFVwZGF0ZShNQkIsIE1CQkksIFN0YWNrUHRyLCBkZWx0YSwgSXM2NEJpdCwgVElJKTsKKyAgfQorfQorCit1bnNpZ25lZCBYODZSZWdpc3RlckluZm86OmdldFJBUmVnaXN0ZXIoKSBjb25zdCB7CisgIHJldHVybiBJczY0Qml0ID8gWDg2OjpSSVAgICAgIC8vIFNob3VsZCBoYXZlIGR3YXJmICMxNi4KKyAgICAgICAgICAgICAgICAgOiBYODY6OkVJUDsgICAgLy8gU2hvdWxkIGhhdmUgZHdhcmYgIzguCit9CisKK3Vuc2lnbmVkIFg4NlJlZ2lzdGVySW5mbzo6Z2V0RnJhbWVSZWdpc3Rlcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIHJldHVybiBoYXNGUChNRikgPyBGcmFtZVB0ciA6IFN0YWNrUHRyOworfQorCit2b2lkCitYODZSZWdpc3RlckluZm86OmdldEluaXRpYWxGcmFtZVN0YXRlKHN0ZDo6dmVjdG9yPE1hY2hpbmVNb3ZlPiAmTW92ZXMpIGNvbnN0IHsKKyAgLy8gQ2FsY3VsYXRlIGFtb3VudCBvZiBieXRlcyB1c2VkIGZvciByZXR1cm4gYWRkcmVzcyBzdG9yaW5nCisgIGludCBzdGFja0dyb3d0aCA9IChJczY0Qml0ID8gLTggOiAtNCk7CisKKyAgLy8gSW5pdGlhbCBzdGF0ZSBvZiB0aGUgZnJhbWUgcG9pbnRlciBpcyBlc3Arc3RhY2tHcm93dGguCisgIE1hY2hpbmVMb2NhdGlvbiBEc3QoTWFjaGluZUxvY2F0aW9uOjpWaXJ0dWFsRlApOworICBNYWNoaW5lTG9jYXRpb24gU3JjKFN0YWNrUHRyLCBzdGFja0dyb3d0aCk7CisgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZSgwLCBEc3QsIFNyYykpOworCisgIC8vIEFkZCByZXR1cm4gYWRkcmVzcyB0byBtb3ZlIGxpc3QKKyAgTWFjaGluZUxvY2F0aW9uIENTRHN0KFN0YWNrUHRyLCBzdGFja0dyb3d0aCk7CisgIE1hY2hpbmVMb2NhdGlvbiBDU1NyYyhnZXRSQVJlZ2lzdGVyKCkpOworICBNb3Zlcy5wdXNoX2JhY2soTWFjaGluZU1vdmUoMCwgQ1NEc3QsIENTU3JjKSk7Cit9CisKK3Vuc2lnbmVkIFg4NlJlZ2lzdGVySW5mbzo6Z2V0RUhFeGNlcHRpb25SZWdpc3RlcigpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiV2hhdCBpcyB0aGUgZXhjZXB0aW9uIHJlZ2lzdGVyIik7CisgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBYODZSZWdpc3RlckluZm86OmdldEVISGFuZGxlclJlZ2lzdGVyKCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJXaGF0IGlzIHRoZSBleGNlcHRpb24gaGFuZGxlciByZWdpc3RlciIpOworICByZXR1cm4gMDsKK30KKworbmFtZXNwYWNlIGxsdm0gewordW5zaWduZWQgZ2V0WDg2U3ViU3VwZXJSZWdpc3Rlcih1bnNpZ25lZCBSZWcsIEVWVCBWVCwgYm9vbCBIaWdoKSB7CisgIHN3aXRjaCAoVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICBkZWZhdWx0OiByZXR1cm4gUmVnOworICBjYXNlIE1WVDo6aTg6CisgICAgaWYgKEhpZ2gpIHsKKyAgICAgIHN3aXRjaCAoUmVnKSB7CisgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgICAgIGNhc2UgWDg2OjpBSDogY2FzZSBYODY6OkFMOiBjYXNlIFg4Njo6QVg6IGNhc2UgWDg2OjpFQVg6IGNhc2UgWDg2OjpSQVg6CisgICAgICAgIHJldHVybiBYODY6OkFIOworICAgICAgY2FzZSBYODY6OkRIOiBjYXNlIFg4Njo6REw6IGNhc2UgWDg2OjpEWDogY2FzZSBYODY6OkVEWDogY2FzZSBYODY6OlJEWDoKKyAgICAgICAgcmV0dXJuIFg4Njo6REg7CisgICAgICBjYXNlIFg4Njo6Q0g6IGNhc2UgWDg2OjpDTDogY2FzZSBYODY6OkNYOiBjYXNlIFg4Njo6RUNYOiBjYXNlIFg4Njo6UkNYOgorICAgICAgICByZXR1cm4gWDg2OjpDSDsKKyAgICAgIGNhc2UgWDg2OjpCSDogY2FzZSBYODY6OkJMOiBjYXNlIFg4Njo6Qlg6IGNhc2UgWDg2OjpFQlg6IGNhc2UgWDg2OjpSQlg6CisgICAgICAgIHJldHVybiBYODY6OkJIOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKFJlZykgeworICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgICAgICBjYXNlIFg4Njo6QUg6IGNhc2UgWDg2OjpBTDogY2FzZSBYODY6OkFYOiBjYXNlIFg4Njo6RUFYOiBjYXNlIFg4Njo6UkFYOgorICAgICAgICByZXR1cm4gWDg2OjpBTDsKKyAgICAgIGNhc2UgWDg2OjpESDogY2FzZSBYODY6OkRMOiBjYXNlIFg4Njo6RFg6IGNhc2UgWDg2OjpFRFg6IGNhc2UgWDg2OjpSRFg6CisgICAgICAgIHJldHVybiBYODY6OkRMOworICAgICAgY2FzZSBYODY6OkNIOiBjYXNlIFg4Njo6Q0w6IGNhc2UgWDg2OjpDWDogY2FzZSBYODY6OkVDWDogY2FzZSBYODY6OlJDWDoKKyAgICAgICAgcmV0dXJuIFg4Njo6Q0w7CisgICAgICBjYXNlIFg4Njo6Qkg6IGNhc2UgWDg2OjpCTDogY2FzZSBYODY6OkJYOiBjYXNlIFg4Njo6RUJYOiBjYXNlIFg4Njo6UkJYOgorICAgICAgICByZXR1cm4gWDg2OjpCTDsKKyAgICAgIGNhc2UgWDg2OjpTSUw6IGNhc2UgWDg2OjpTSTogY2FzZSBYODY6OkVTSTogY2FzZSBYODY6OlJTSToKKyAgICAgICAgcmV0dXJuIFg4Njo6U0lMOworICAgICAgY2FzZSBYODY6OkRJTDogY2FzZSBYODY6OkRJOiBjYXNlIFg4Njo6RURJOiBjYXNlIFg4Njo6UkRJOgorICAgICAgICByZXR1cm4gWDg2OjpESUw7CisgICAgICBjYXNlIFg4Njo6QlBMOiBjYXNlIFg4Njo6QlA6IGNhc2UgWDg2OjpFQlA6IGNhc2UgWDg2OjpSQlA6CisgICAgICAgIHJldHVybiBYODY6OkJQTDsKKyAgICAgIGNhc2UgWDg2OjpTUEw6IGNhc2UgWDg2OjpTUDogY2FzZSBYODY6OkVTUDogY2FzZSBYODY6OlJTUDoKKyAgICAgICAgcmV0dXJuIFg4Njo6U1BMOworICAgICAgY2FzZSBYODY6OlI4QjogY2FzZSBYODY6OlI4VzogY2FzZSBYODY6OlI4RDogY2FzZSBYODY6OlI4OgorICAgICAgICByZXR1cm4gWDg2OjpSOEI7CisgICAgICBjYXNlIFg4Njo6UjlCOiBjYXNlIFg4Njo6UjlXOiBjYXNlIFg4Njo6UjlEOiBjYXNlIFg4Njo6Ujk6CisgICAgICAgIHJldHVybiBYODY6OlI5QjsKKyAgICAgIGNhc2UgWDg2OjpSMTBCOiBjYXNlIFg4Njo6UjEwVzogY2FzZSBYODY6OlIxMEQ6IGNhc2UgWDg2OjpSMTA6CisgICAgICAgIHJldHVybiBYODY6OlIxMEI7CisgICAgICBjYXNlIFg4Njo6UjExQjogY2FzZSBYODY6OlIxMVc6IGNhc2UgWDg2OjpSMTFEOiBjYXNlIFg4Njo6UjExOgorICAgICAgICByZXR1cm4gWDg2OjpSMTFCOworICAgICAgY2FzZSBYODY6OlIxMkI6IGNhc2UgWDg2OjpSMTJXOiBjYXNlIFg4Njo6UjEyRDogY2FzZSBYODY6OlIxMjoKKyAgICAgICAgcmV0dXJuIFg4Njo6UjEyQjsKKyAgICAgIGNhc2UgWDg2OjpSMTNCOiBjYXNlIFg4Njo6UjEzVzogY2FzZSBYODY6OlIxM0Q6IGNhc2UgWDg2OjpSMTM6CisgICAgICAgIHJldHVybiBYODY6OlIxM0I7CisgICAgICBjYXNlIFg4Njo6UjE0QjogY2FzZSBYODY6OlIxNFc6IGNhc2UgWDg2OjpSMTREOiBjYXNlIFg4Njo6UjE0OgorICAgICAgICByZXR1cm4gWDg2OjpSMTRCOworICAgICAgY2FzZSBYODY6OlIxNUI6IGNhc2UgWDg2OjpSMTVXOiBjYXNlIFg4Njo6UjE1RDogY2FzZSBYODY6OlIxNToKKyAgICAgICAgcmV0dXJuIFg4Njo6UjE1QjsKKyAgICAgIH0KKyAgICB9CisgIGNhc2UgTVZUOjppMTY6CisgICAgc3dpdGNoIChSZWcpIHsKKyAgICBkZWZhdWx0OiByZXR1cm4gUmVnOworICAgIGNhc2UgWDg2OjpBSDogY2FzZSBYODY6OkFMOiBjYXNlIFg4Njo6QVg6IGNhc2UgWDg2OjpFQVg6IGNhc2UgWDg2OjpSQVg6CisgICAgICByZXR1cm4gWDg2OjpBWDsKKyAgICBjYXNlIFg4Njo6REg6IGNhc2UgWDg2OjpETDogY2FzZSBYODY6OkRYOiBjYXNlIFg4Njo6RURYOiBjYXNlIFg4Njo6UkRYOgorICAgICAgcmV0dXJuIFg4Njo6RFg7CisgICAgY2FzZSBYODY6OkNIOiBjYXNlIFg4Njo6Q0w6IGNhc2UgWDg2OjpDWDogY2FzZSBYODY6OkVDWDogY2FzZSBYODY6OlJDWDoKKyAgICAgIHJldHVybiBYODY6OkNYOworICAgIGNhc2UgWDg2OjpCSDogY2FzZSBYODY6OkJMOiBjYXNlIFg4Njo6Qlg6IGNhc2UgWDg2OjpFQlg6IGNhc2UgWDg2OjpSQlg6CisgICAgICByZXR1cm4gWDg2OjpCWDsKKyAgICBjYXNlIFg4Njo6U0lMOiBjYXNlIFg4Njo6U0k6IGNhc2UgWDg2OjpFU0k6IGNhc2UgWDg2OjpSU0k6CisgICAgICByZXR1cm4gWDg2OjpTSTsKKyAgICBjYXNlIFg4Njo6RElMOiBjYXNlIFg4Njo6REk6IGNhc2UgWDg2OjpFREk6IGNhc2UgWDg2OjpSREk6CisgICAgICByZXR1cm4gWDg2OjpESTsKKyAgICBjYXNlIFg4Njo6QlBMOiBjYXNlIFg4Njo6QlA6IGNhc2UgWDg2OjpFQlA6IGNhc2UgWDg2OjpSQlA6CisgICAgICByZXR1cm4gWDg2OjpCUDsKKyAgICBjYXNlIFg4Njo6U1BMOiBjYXNlIFg4Njo6U1A6IGNhc2UgWDg2OjpFU1A6IGNhc2UgWDg2OjpSU1A6CisgICAgICByZXR1cm4gWDg2OjpTUDsKKyAgICBjYXNlIFg4Njo6UjhCOiBjYXNlIFg4Njo6UjhXOiBjYXNlIFg4Njo6UjhEOiBjYXNlIFg4Njo6Ujg6CisgICAgICByZXR1cm4gWDg2OjpSOFc7CisgICAgY2FzZSBYODY6OlI5QjogY2FzZSBYODY6OlI5VzogY2FzZSBYODY6OlI5RDogY2FzZSBYODY6OlI5OgorICAgICAgcmV0dXJuIFg4Njo6UjlXOworICAgIGNhc2UgWDg2OjpSMTBCOiBjYXNlIFg4Njo6UjEwVzogY2FzZSBYODY6OlIxMEQ6IGNhc2UgWDg2OjpSMTA6CisgICAgICByZXR1cm4gWDg2OjpSMTBXOworICAgIGNhc2UgWDg2OjpSMTFCOiBjYXNlIFg4Njo6UjExVzogY2FzZSBYODY6OlIxMUQ6IGNhc2UgWDg2OjpSMTE6CisgICAgICByZXR1cm4gWDg2OjpSMTFXOworICAgIGNhc2UgWDg2OjpSMTJCOiBjYXNlIFg4Njo6UjEyVzogY2FzZSBYODY6OlIxMkQ6IGNhc2UgWDg2OjpSMTI6CisgICAgICByZXR1cm4gWDg2OjpSMTJXOworICAgIGNhc2UgWDg2OjpSMTNCOiBjYXNlIFg4Njo6UjEzVzogY2FzZSBYODY6OlIxM0Q6IGNhc2UgWDg2OjpSMTM6CisgICAgICByZXR1cm4gWDg2OjpSMTNXOworICAgIGNhc2UgWDg2OjpSMTRCOiBjYXNlIFg4Njo6UjE0VzogY2FzZSBYODY6OlIxNEQ6IGNhc2UgWDg2OjpSMTQ6CisgICAgICByZXR1cm4gWDg2OjpSMTRXOworICAgIGNhc2UgWDg2OjpSMTVCOiBjYXNlIFg4Njo6UjE1VzogY2FzZSBYODY6OlIxNUQ6IGNhc2UgWDg2OjpSMTU6CisgICAgICByZXR1cm4gWDg2OjpSMTVXOworICAgIH0KKyAgY2FzZSBNVlQ6OmkzMjoKKyAgICBzd2l0Y2ggKFJlZykgeworICAgIGRlZmF1bHQ6IHJldHVybiBSZWc7CisgICAgY2FzZSBYODY6OkFIOiBjYXNlIFg4Njo6QUw6IGNhc2UgWDg2OjpBWDogY2FzZSBYODY6OkVBWDogY2FzZSBYODY6OlJBWDoKKyAgICAgIHJldHVybiBYODY6OkVBWDsKKyAgICBjYXNlIFg4Njo6REg6IGNhc2UgWDg2OjpETDogY2FzZSBYODY6OkRYOiBjYXNlIFg4Njo6RURYOiBjYXNlIFg4Njo6UkRYOgorICAgICAgcmV0dXJuIFg4Njo6RURYOworICAgIGNhc2UgWDg2OjpDSDogY2FzZSBYODY6OkNMOiBjYXNlIFg4Njo6Q1g6IGNhc2UgWDg2OjpFQ1g6IGNhc2UgWDg2OjpSQ1g6CisgICAgICByZXR1cm4gWDg2OjpFQ1g7CisgICAgY2FzZSBYODY6OkJIOiBjYXNlIFg4Njo6Qkw6IGNhc2UgWDg2OjpCWDogY2FzZSBYODY6OkVCWDogY2FzZSBYODY6OlJCWDoKKyAgICAgIHJldHVybiBYODY6OkVCWDsKKyAgICBjYXNlIFg4Njo6U0lMOiBjYXNlIFg4Njo6U0k6IGNhc2UgWDg2OjpFU0k6IGNhc2UgWDg2OjpSU0k6CisgICAgICByZXR1cm4gWDg2OjpFU0k7CisgICAgY2FzZSBYODY6OkRJTDogY2FzZSBYODY6OkRJOiBjYXNlIFg4Njo6RURJOiBjYXNlIFg4Njo6UkRJOgorICAgICAgcmV0dXJuIFg4Njo6RURJOworICAgIGNhc2UgWDg2OjpCUEw6IGNhc2UgWDg2OjpCUDogY2FzZSBYODY6OkVCUDogY2FzZSBYODY6OlJCUDoKKyAgICAgIHJldHVybiBYODY6OkVCUDsKKyAgICBjYXNlIFg4Njo6U1BMOiBjYXNlIFg4Njo6U1A6IGNhc2UgWDg2OjpFU1A6IGNhc2UgWDg2OjpSU1A6CisgICAgICByZXR1cm4gWDg2OjpFU1A7CisgICAgY2FzZSBYODY6OlI4QjogY2FzZSBYODY6OlI4VzogY2FzZSBYODY6OlI4RDogY2FzZSBYODY6OlI4OgorICAgICAgcmV0dXJuIFg4Njo6UjhEOworICAgIGNhc2UgWDg2OjpSOUI6IGNhc2UgWDg2OjpSOVc6IGNhc2UgWDg2OjpSOUQ6IGNhc2UgWDg2OjpSOToKKyAgICAgIHJldHVybiBYODY6OlI5RDsKKyAgICBjYXNlIFg4Njo6UjEwQjogY2FzZSBYODY6OlIxMFc6IGNhc2UgWDg2OjpSMTBEOiBjYXNlIFg4Njo6UjEwOgorICAgICAgcmV0dXJuIFg4Njo6UjEwRDsKKyAgICBjYXNlIFg4Njo6UjExQjogY2FzZSBYODY6OlIxMVc6IGNhc2UgWDg2OjpSMTFEOiBjYXNlIFg4Njo6UjExOgorICAgICAgcmV0dXJuIFg4Njo6UjExRDsKKyAgICBjYXNlIFg4Njo6UjEyQjogY2FzZSBYODY6OlIxMlc6IGNhc2UgWDg2OjpSMTJEOiBjYXNlIFg4Njo6UjEyOgorICAgICAgcmV0dXJuIFg4Njo6UjEyRDsKKyAgICBjYXNlIFg4Njo6UjEzQjogY2FzZSBYODY6OlIxM1c6IGNhc2UgWDg2OjpSMTNEOiBjYXNlIFg4Njo6UjEzOgorICAgICAgcmV0dXJuIFg4Njo6UjEzRDsKKyAgICBjYXNlIFg4Njo6UjE0QjogY2FzZSBYODY6OlIxNFc6IGNhc2UgWDg2OjpSMTREOiBjYXNlIFg4Njo6UjE0OgorICAgICAgcmV0dXJuIFg4Njo6UjE0RDsKKyAgICBjYXNlIFg4Njo6UjE1QjogY2FzZSBYODY6OlIxNVc6IGNhc2UgWDg2OjpSMTVEOiBjYXNlIFg4Njo6UjE1OgorICAgICAgcmV0dXJuIFg4Njo6UjE1RDsKKyAgICB9CisgIGNhc2UgTVZUOjppNjQ6CisgICAgc3dpdGNoIChSZWcpIHsKKyAgICBkZWZhdWx0OiByZXR1cm4gUmVnOworICAgIGNhc2UgWDg2OjpBSDogY2FzZSBYODY6OkFMOiBjYXNlIFg4Njo6QVg6IGNhc2UgWDg2OjpFQVg6IGNhc2UgWDg2OjpSQVg6CisgICAgICByZXR1cm4gWDg2OjpSQVg7CisgICAgY2FzZSBYODY6OkRIOiBjYXNlIFg4Njo6REw6IGNhc2UgWDg2OjpEWDogY2FzZSBYODY6OkVEWDogY2FzZSBYODY6OlJEWDoKKyAgICAgIHJldHVybiBYODY6OlJEWDsKKyAgICBjYXNlIFg4Njo6Q0g6IGNhc2UgWDg2OjpDTDogY2FzZSBYODY6OkNYOiBjYXNlIFg4Njo6RUNYOiBjYXNlIFg4Njo6UkNYOgorICAgICAgcmV0dXJuIFg4Njo6UkNYOworICAgIGNhc2UgWDg2OjpCSDogY2FzZSBYODY6OkJMOiBjYXNlIFg4Njo6Qlg6IGNhc2UgWDg2OjpFQlg6IGNhc2UgWDg2OjpSQlg6CisgICAgICByZXR1cm4gWDg2OjpSQlg7CisgICAgY2FzZSBYODY6OlNJTDogY2FzZSBYODY6OlNJOiBjYXNlIFg4Njo6RVNJOiBjYXNlIFg4Njo6UlNJOgorICAgICAgcmV0dXJuIFg4Njo6UlNJOworICAgIGNhc2UgWDg2OjpESUw6IGNhc2UgWDg2OjpESTogY2FzZSBYODY6OkVESTogY2FzZSBYODY6OlJESToKKyAgICAgIHJldHVybiBYODY6OlJESTsKKyAgICBjYXNlIFg4Njo6QlBMOiBjYXNlIFg4Njo6QlA6IGNhc2UgWDg2OjpFQlA6IGNhc2UgWDg2OjpSQlA6CisgICAgICByZXR1cm4gWDg2OjpSQlA7CisgICAgY2FzZSBYODY6OlNQTDogY2FzZSBYODY6OlNQOiBjYXNlIFg4Njo6RVNQOiBjYXNlIFg4Njo6UlNQOgorICAgICAgcmV0dXJuIFg4Njo6UlNQOworICAgIGNhc2UgWDg2OjpSOEI6IGNhc2UgWDg2OjpSOFc6IGNhc2UgWDg2OjpSOEQ6IGNhc2UgWDg2OjpSODoKKyAgICAgIHJldHVybiBYODY6OlI4OworICAgIGNhc2UgWDg2OjpSOUI6IGNhc2UgWDg2OjpSOVc6IGNhc2UgWDg2OjpSOUQ6IGNhc2UgWDg2OjpSOToKKyAgICAgIHJldHVybiBYODY6OlI5OworICAgIGNhc2UgWDg2OjpSMTBCOiBjYXNlIFg4Njo6UjEwVzogY2FzZSBYODY6OlIxMEQ6IGNhc2UgWDg2OjpSMTA6CisgICAgICByZXR1cm4gWDg2OjpSMTA7CisgICAgY2FzZSBYODY6OlIxMUI6IGNhc2UgWDg2OjpSMTFXOiBjYXNlIFg4Njo6UjExRDogY2FzZSBYODY6OlIxMToKKyAgICAgIHJldHVybiBYODY6OlIxMTsKKyAgICBjYXNlIFg4Njo6UjEyQjogY2FzZSBYODY6OlIxMlc6IGNhc2UgWDg2OjpSMTJEOiBjYXNlIFg4Njo6UjEyOgorICAgICAgcmV0dXJuIFg4Njo6UjEyOworICAgIGNhc2UgWDg2OjpSMTNCOiBjYXNlIFg4Njo6UjEzVzogY2FzZSBYODY6OlIxM0Q6IGNhc2UgWDg2OjpSMTM6CisgICAgICByZXR1cm4gWDg2OjpSMTM7CisgICAgY2FzZSBYODY6OlIxNEI6IGNhc2UgWDg2OjpSMTRXOiBjYXNlIFg4Njo6UjE0RDogY2FzZSBYODY6OlIxNDoKKyAgICAgIHJldHVybiBYODY6OlIxNDsKKyAgICBjYXNlIFg4Njo6UjE1QjogY2FzZSBYODY6OlIxNVc6IGNhc2UgWDg2OjpSMTVEOiBjYXNlIFg4Njo6UjE1OgorICAgICAgcmV0dXJuIFg4Njo6UjE1OworICAgIH0KKyAgfQorCisgIHJldHVybiBSZWc7Cit9Cit9CisKKyNpbmNsdWRlICJYODZHZW5SZWdpc3RlckluZm8uaW5jIgorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgTVNBSCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBNU0FIKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgICAgIGNvbnN0IFg4NlRhcmdldE1hY2hpbmUgKlRNID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgWDg2VGFyZ2V0TWFjaGluZSAqPigmTUYuZ2V0VGFyZ2V0KCkpOworICAgICAgY29uc3QgWDg2UmVnaXN0ZXJJbmZvICpYODZSSSA9IFRNLT5nZXRSZWdpc3RlckluZm8oKTsKKyAgICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJlJJID0gTUYuZ2V0UmVnSW5mbygpOworICAgICAgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyAqRnVuY0luZm8gPSBNRi5nZXRJbmZvPFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7CisgICAgICB1bnNpZ25lZCBTdGFja0FsaWdubWVudCA9IFg4NlJJLT5nZXRTdGFja0FsaWdubWVudCgpOworCisgICAgICAvLyBCZSBvdmVyLWNvbnNlcnZhdGl2ZTogc2NhbiBvdmVyIGFsbCB2cmVnIGRlZnMgYW5kIGZpbmQgd2hldGhlciB2ZWN0b3IKKyAgICAgIC8vIHJlZ2lzdGVycyBhcmUgdXNlZC4gSWYgeWVzLCB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdmVjdG9yIHJlZ2lzdGVyCisgICAgICAvLyB3aWxsIGJlIHNwaWxsZWQgYW5kIHRodXMgcmVxdWlyZSBkeW5hbWljIHN0YWNrIHJlYWxpZ25tZW50LgorICAgICAgZm9yICh1bnNpZ25lZCBSZWdOdW0gPSBUYXJnZXRSZWdpc3RlckluZm86OkZpcnN0VmlydHVhbFJlZ2lzdGVyOworICAgICAgICAgICBSZWdOdW0gPCBSSS5nZXRMYXN0VmlydFJlZygpOyArK1JlZ051bSkKKyAgICAgICAgaWYgKFJJLmdldFJlZ0NsYXNzKFJlZ051bSktPmdldEFsaWdubWVudCgpID4gU3RhY2tBbGlnbm1lbnQpIHsKKyAgICAgICAgICBGdW5jSW5mby0+c2V0UmVzZXJ2ZUZQKHRydWUpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJYODYgTWF4aW1hbCBTdGFjayBBbGlnbm1lbnQgQ2hlY2siOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICAgIH0KKyAgfTsKKworICBjaGFyIE1TQUg6OklEID0gMDsKK30KKworRnVuY3Rpb25QYXNzKgorbGx2bTo6Y3JlYXRlWDg2TWF4U3RhY2tBbGlnbm1lbnRIZXVyaXN0aWNQYXNzKCkgeyByZXR1cm4gbmV3IE1TQUgoKTsgfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2UmVnaXN0ZXJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZSZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDU2ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2UmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8vPT09LSBYODZSZWdpc3RlckluZm8uaCAtIFg4NiBSZWdpc3RlciBJbmZvcm1hdGlvbiBJbXBsIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBYODYgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldFJlZ2lzdGVySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFg4NlJFR0lTVEVSSU5GT19ICisjZGVmaW5lIFg4NlJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJYODZHZW5SZWdpc3RlckluZm8uaC5pbmMiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgVHlwZTsKKyAgY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworICBjbGFzcyBYODZUYXJnZXRNYWNoaW5lOworCisvLy8gTjg2IG5hbWVzcGFjZSAtIE5hdGl2ZSBYODYgcmVnaXN0ZXIgbnVtYmVycworLy8vCituYW1lc3BhY2UgTjg2IHsKKyAgZW51bSB7CisgICAgRUFYID0gMCwgRUNYID0gMSwgRURYID0gMiwgRUJYID0gMywgRVNQID0gNCwgRUJQID0gNSwgRVNJID0gNiwgRURJID0gNworICB9OworfQorCisvLy8gRFdBUkZGbGF2b3VyIC0gRmxhdm91ciBvZiBkd2FyZiByZWdudW1iZXJzCisvLy8KK25hbWVzcGFjZSBEV0FSRkZsYXZvdXIgeworICBlbnVtIHsKKyAgICBYODZfNjQgPSAwLCBYODZfMzJfRGFyd2luRUggPSAxLCBYODZfMzJfR2VuZXJpYyA9IDIKKyAgfTsKK30gCisgIAorY2xhc3MgWDg2UmVnaXN0ZXJJbmZvIDogcHVibGljIFg4NkdlblJlZ2lzdGVySW5mbyB7CitwdWJsaWM6CisgIFg4NlRhcmdldE1hY2hpbmUgJlRNOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSTsKKworcHJpdmF0ZToKKyAgLy8vIElzNjRCaXQgLSBJcyB0aGUgdGFyZ2V0IDY0LWJpdHMuCisgIC8vLworICBib29sIElzNjRCaXQ7CisKKyAgLy8vIElzV2luNjQgLSBJcyB0aGUgdGFyZ2V0IG9uIG9mIHdpbjY0IGZsYXZvdXJzCisgIC8vLworICBib29sIElzV2luNjQ7CisKKyAgLy8vIFNsb3RTaXplIC0gU3RhY2sgc2xvdCBzaXplIGluIGJ5dGVzLgorICAvLy8KKyAgdW5zaWduZWQgU2xvdFNpemU7CisKKyAgLy8vIFN0YWNrQWxpZ24gLSBEZWZhdWx0IHN0YWNrIGFsaWdubWVudC4KKyAgLy8vCisgIHVuc2lnbmVkIFN0YWNrQWxpZ247CisKKyAgLy8vIFN0YWNrUHRyIC0gWDg2IHBoeXNpY2FsIHJlZ2lzdGVyIHVzZWQgYXMgc3RhY2sgcHRyLgorICAvLy8KKyAgdW5zaWduZWQgU3RhY2tQdHI7CisKKyAgLy8vIEZyYW1lUHRyIC0gWDg2IHBoeXNpY2FsIHJlZ2lzdGVyIHVzZWQgYXMgZnJhbWUgcHRyLgorICAvLy8KKyAgdW5zaWduZWQgRnJhbWVQdHI7CisKK3B1YmxpYzoKKyAgWDg2UmVnaXN0ZXJJbmZvKFg4NlRhcmdldE1hY2hpbmUgJnRtLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gJnRpaSk7CisKKyAgLy8vIGdldFg4NlJlZ051bSAtIFJldHVybnMgdGhlIG5hdGl2ZSBYODYgcmVnaXN0ZXIgbnVtYmVyIGZvciB0aGUgZ2l2ZW4gTExWTQorICAvLy8gcmVnaXN0ZXIgaWRlbnRpZmllci4KKyAgc3RhdGljIHVuc2lnbmVkIGdldFg4NlJlZ051bSh1bnNpZ25lZCBSZWdObyk7CisKKyAgdW5zaWduZWQgZ2V0U3RhY2tBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBTdGFja0FsaWduOyB9CisKKyAgLy8vIGdldER3YXJmUmVnTnVtIC0gYWxsb3dzIG1vZGlmaWNhdGlvbiBvZiBYODZHZW5SZWdpc3RlckluZm86OmdldER3YXJmUmVnTnVtCisgIC8vLyAoY3JlYXRlZCBieSBUYWJsZUdlbikgZm9yIHRhcmdldCBkZXBlbmRlbmNpZXMuCisgIGludCBnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3Q7CisKKyAgLy8vIENvZGUgR2VuZXJhdGlvbiB2aXJ0dWFsIG1ldGhvZHMuLi4KKyAgLy8vIAorCisgIC8vLyBnZXRNYXRjaGluZ1N1cGVyUmVnQ2xhc3MgLSBSZXR1cm4gYSBzdWJjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyCisgIC8vLyBjbGFzcyBBIHNvIHRoYXQgZWFjaCByZWdpc3RlciBpbiBpdCBoYXMgYSBzdWItcmVnaXN0ZXIgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgc3ViLXJlZ2lzdGVyIGluZGV4IHdoaWNoIGlzIGluIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MgQi4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKKyAgZ2V0TWF0Y2hpbmdTdXBlclJlZ0NsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpCLCB1bnNpZ25lZCBJZHgpIGNvbnN0OworCisgIC8vLyBnZXRQb2ludGVyUmVnQ2xhc3MgLSBSZXR1cm5zIGEgVGFyZ2V0UmVnaXN0ZXJDbGFzcyB1c2VkIGZvciBwb2ludGVyCisgIC8vLyB2YWx1ZXMuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldFBvaW50ZXJSZWdDbGFzcyh1bnNpZ25lZCBLaW5kID0gMCkgY29uc3Q7CisKKyAgLy8vIGdldENyb3NzQ29weVJlZ0NsYXNzIC0gUmV0dXJucyBhIGxlZ2FsIHJlZ2lzdGVyIGNsYXNzIHRvIGNvcHkgYSByZWdpc3RlcgorICAvLy8gaW4gdGhlIHNwZWNpZmllZCBjbGFzcyB0byBvciBmcm9tLiBSZXR1cm5zIE5VTEwgaWYgaXQgaXMgcG9zc2libGUgdG8gY29weQorICAvLy8gYmV0d2VlbiBhIHR3byByZWdpc3RlcnMgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgIGdldENyb3NzQ29weVJlZ0NsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdDsKKworICAvLy8gZ2V0Q2FsbGVlU2F2ZWRSZWdzIC0gUmV0dXJuIGEgbnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgYWxsIG9mIHRoZQorICAvLy8gY2FsbGVlLXNhdmUgcmVnaXN0ZXJzIG9uIHRoaXMgdGFyZ2V0LgorICBjb25zdCB1bnNpZ25lZCAqZ2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiogTUYgPSAwKSBjb25zdDsKKworICAvLy8gZ2V0UmVzZXJ2ZWRSZWdzIC0gUmV0dXJucyBhIGJpdHNldCBpbmRleGVkIGJ5IHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlcgorICAvLy8gaW5kaWNhdGluZyBpZiBhIHJlZ2lzdGVyIGlzIGEgc3BlY2lhbCByZWdpc3RlciB0aGF0IGhhcyBwYXJ0aWN1bGFyIHVzZXMgYW5kCisgIC8vLyBzaG91bGQgYmUgY29uc2lkZXJlZCB1bmF2YWlsYWJsZSBhdCBhbGwgdGltZXMsIGUuZy4gU1AsIFJBLiBUaGlzIGlzIHVzZWQgYnkKKyAgLy8vIHJlZ2lzdGVyIHNjYXZlbmdlciB0byBkZXRlcm1pbmUgd2hhdCByZWdpc3RlcnMgYXJlIGZyZWUuCisgIEJpdFZlY3RvciBnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgYm9vbCBoYXNGUChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICBib29sIGNhblJlYWxpZ25TdGFjayhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICBib29sIG5lZWRzU3RhY2tSZWFsaWdubWVudChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICBib29sIGhhc1Jlc2VydmVkQ2FsbEZyYW1lKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIGJvb2wgaGFzUmVzZXJ2ZWRTcGlsbFNsb3QoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJZHgpIGNvbnN0OworCisgIHZvaWQgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSkgY29uc3Q7CisKKyAgdW5zaWduZWQgZWxpbWluYXRlRnJhbWVJbmRleChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCBGcmFtZUluZGV4VmFsdWUgKlZhbHVlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gTlVMTCkgY29uc3Q7CisKKyAgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVDYWxsZWVTYXZlZFNjYW4oTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IE5VTEwpIGNvbnN0OworCisgIHZvaWQgZW1pdENhbGxlZVNhdmVkRnJhbWVNb3ZlcyhNYWNoaW5lRnVuY3Rpb24gJk1GLCBNQ1N5bWJvbCAqTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGcmFtZVB0cikgY29uc3Q7CisgIHZvaWQgZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworICB2b2lkIGVtaXRFcGlsb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdDsKKworICAvLyBEZWJ1ZyBpbmZvcm1hdGlvbiBxdWVyaWVzLgorICB1bnNpZ25lZCBnZXRSQVJlZ2lzdGVyKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIGludCBnZXRGcmFtZUluZGV4T2Zmc2V0KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludCBGSSkgY29uc3Q7CisgIHZvaWQgZ2V0SW5pdGlhbEZyYW1lU3RhdGUoc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+ICZNb3ZlcykgY29uc3Q7CisKKyAgLy8gRXhjZXB0aW9uIGhhbmRsaW5nIHF1ZXJpZXMuCisgIHVuc2lnbmVkIGdldEVIRXhjZXB0aW9uUmVnaXN0ZXIoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0RUhIYW5kbGVyUmVnaXN0ZXIoKSBjb25zdDsKK307CisKKy8vIGdldFg4NlN1YlN1cGVyUmVnaXN0ZXIgLSBYODYgdXRpbGl0eSBmdW5jdGlvbi4gSXQgcmV0dXJucyB0aGUgc3ViIG9yIHN1cGVyCisvLyByZWdpc3RlciBvZiBhIHNwZWNpZmljIFg4NiByZWdpc3Rlci4KKy8vIGUuZy4gZ2V0WDg2U3ViU3VwZXJSZWdpc3RlcihYODY6OkVBWCwgRVZUOjppMTYpIHJldHVybiBYODY6QVgKK3Vuc2lnbmVkIGdldFg4NlN1YlN1cGVyUmVnaXN0ZXIodW5zaWduZWQsIEVWVCwgYm9vbCBIaWdoPWZhbHNlKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZSZWdpc3RlckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZSZWdpc3RlckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkOThjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlJlZ2lzdGVySW5mby50ZApAQCAtMCwwICsxLDgzNiBAQAorLy89PT0tIFg4NlJlZ2lzdGVySW5mby50ZCAtIERlc2NyaWJlIHRoZSBYODYgUmVnaXN0ZXIgRmlsZSAtLSotIHRhYmxlZ2VuIC0qLT09Ly8NCisvLyANCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorLy8NCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQorLy8gDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisvLw0KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIFg4NiBSZWdpc3RlciBmaWxlLCBkZWZpbmluZyB0aGUgcmVnaXN0ZXJzIHRoZW1zZWx2ZXMsDQorLy8gYWxpYXNlcyBiZXR3ZWVuIHRoZSByZWdpc3RlcnMsIGFuZCB0aGUgcmVnaXN0ZXIgY2xhc3NlcyBidWlsdCBvdXQgb2YgdGhlDQorLy8gcmVnaXN0ZXJzLg0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vICBSZWdpc3RlciBkZWZpbml0aW9ucy4uLg0KKy8vDQorbGV0IE5hbWVzcGFjZSA9ICJYODYiIGluIHsNCisNCisgIC8vIFN1YnJlZ2lzdGVyIGluZGljZXMuDQorICBkZWYgc3ViXzhiaXQgICAgOiBTdWJSZWdJbmRleDsNCisgIGRlZiBzdWJfOGJpdF9oaSA6IFN1YlJlZ0luZGV4Ow0KKyAgZGVmIHN1Yl8xNmJpdCAgIDogU3ViUmVnSW5kZXg7DQorICBkZWYgc3ViXzMyYml0ICAgOiBTdWJSZWdJbmRleDsNCisNCisgIGRlZiBzdWJfc3MgIDogU3ViUmVnSW5kZXg7DQorICBkZWYgc3ViX3NkICA6IFN1YlJlZ0luZGV4Ow0KKyAgZGVmIHN1Yl94bW0gOiBTdWJSZWdJbmRleDsNCisNCisNCisgIC8vIEluIHRoZSByZWdpc3RlciBhbGlhcyBkZWZpbml0aW9ucyBiZWxvdywgd2UgZGVmaW5lIHdoaWNoIHJlZ2lzdGVycyBhbGlhcw0KKyAgLy8gd2hpY2ggb3RoZXJzLiAgV2Ugb25seSBzcGVjaWZ5IHdoaWNoIHJlZ2lzdGVycyB0aGUgc21hbGwgcmVnaXN0ZXJzIGFsaWFzLA0KKyAgLy8gYmVjYXVzZSB0aGUgcmVnaXN0ZXIgZmlsZSBnZW5lcmF0b3IgaXMgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgdGhhdA0KKyAgLy8gQUwgYWxpYXNlcyBBWCBpZiB3ZSB0ZWxsIGl0IHRoYXQgQVggYWxpYXNlZCBBTCAoZm9yIGV4YW1wbGUpLg0KKw0KKyAgLy8gRHdhcmYgbnVtYmVyaW5nIGlzIGRpZmZlcmVudCBmb3IgMzItYml0IGFuZCA2NC1iaXQsIGFuZCB0aGVyZSBhcmUgDQorICAvLyB2YXJpYXRpb25zIGJ5IHRhcmdldCBhcyB3ZWxsLiBDdXJyZW50bHkgdGhlIGZpcnN0IGVudHJ5IGlzIGZvciBYODYtNjQsIA0KKyAgLy8gc2Vjb25kIC0gZm9yIEVIIG9uIFg4Ni0zMi9EYXJ3aW4gYW5kIHRoaXJkIGlzICdnZW5lcmljJyBvbmUgKFg4Ni0zMi9MaW51eA0KKyAgLy8gYW5kIGRlYnVnIGluZm9ybWF0aW9uIG9uIFg4Ni0zMi9EYXJ3aW4pDQorDQorICAvLyA4LWJpdCByZWdpc3RlcnMNCisgIC8vIExvdyByZWdpc3RlcnMNCisgIGRlZiBBTCA6IFJlZ2lzdGVyPCJhbCI+LCBEd2FyZlJlZ051bTxbMCwgMCwgMF0+Ow0KKyAgZGVmIERMIDogUmVnaXN0ZXI8ImRsIj4sIER3YXJmUmVnTnVtPFsxLCAyLCAyXT47DQorICBkZWYgQ0wgOiBSZWdpc3RlcjwiY2wiPiwgRHdhcmZSZWdOdW08WzIsIDEsIDFdPjsNCisgIGRlZiBCTCA6IFJlZ2lzdGVyPCJibCI+LCBEd2FyZlJlZ051bTxbMywgMywgM10+Ow0KKw0KKyAgLy8gWDg2LTY0IG9ubHkNCisgIGRlZiBTSUwgOiBSZWdpc3Rlcjwic2lsIj4sIER3YXJmUmVnTnVtPFs0LCA2LCA2XT47DQorICBkZWYgRElMIDogUmVnaXN0ZXI8ImRpbCI+LCBEd2FyZlJlZ051bTxbNSwgNywgN10+Ow0KKyAgZGVmIEJQTCA6IFJlZ2lzdGVyPCJicGwiPiwgRHdhcmZSZWdOdW08WzYsIDQsIDVdPjsNCisgIGRlZiBTUEwgOiBSZWdpc3Rlcjwic3BsIj4sIER3YXJmUmVnTnVtPFs3LCA1LCA0XT47DQorICBkZWYgUjhCICA6IFJlZ2lzdGVyPCJyOGIiPiwgIER3YXJmUmVnTnVtPFs4LCAtMiwgLTJdPjsNCisgIGRlZiBSOUIgIDogUmVnaXN0ZXI8InI5YiI+LCAgRHdhcmZSZWdOdW08WzksIC0yLCAtMl0+Ow0KKyAgZGVmIFIxMEIgOiBSZWdpc3RlcjwicjEwYiI+LCBEd2FyZlJlZ051bTxbMTAsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxMUIgOiBSZWdpc3RlcjwicjExYiI+LCBEd2FyZlJlZ051bTxbMTEsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxMkIgOiBSZWdpc3RlcjwicjEyYiI+LCBEd2FyZlJlZ051bTxbMTIsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxM0IgOiBSZWdpc3RlcjwicjEzYiI+LCBEd2FyZlJlZ051bTxbMTMsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxNEIgOiBSZWdpc3RlcjwicjE0YiI+LCBEd2FyZlJlZ051bTxbMTQsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxNUIgOiBSZWdpc3RlcjwicjE1YiI+LCBEd2FyZlJlZ051bTxbMTUsIC0yLCAtMl0+Ow0KKw0KKyAgLy8gSGlnaCByZWdpc3RlcnMuIE9uIHg4Ni02NCwgdGhlc2UgY2Fubm90IGJlIHVzZWQgaW4gYW55IGluc3RydWN0aW9uDQorICAvLyB3aXRoIGEgUkVYIHByZWZpeC4NCisgIGRlZiBBSCA6IFJlZ2lzdGVyPCJhaCI+LCBEd2FyZlJlZ051bTxbMCwgMCwgMF0+Ow0KKyAgZGVmIERIIDogUmVnaXN0ZXI8ImRoIj4sIER3YXJmUmVnTnVtPFsxLCAyLCAyXT47DQorICBkZWYgQ0ggOiBSZWdpc3RlcjwiY2giPiwgRHdhcmZSZWdOdW08WzIsIDEsIDFdPjsNCisgIGRlZiBCSCA6IFJlZ2lzdGVyPCJiaCI+LCBEd2FyZlJlZ051bTxbMywgMywgM10+Ow0KKw0KKyAgLy8gMTYtYml0IHJlZ2lzdGVycw0KKyAgbGV0IFN1YlJlZ0luZGljZXMgPSBbc3ViXzhiaXQsIHN1Yl84Yml0X2hpXSBpbiB7DQorICBkZWYgQVggOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJheCIsIFtBTCxBSF0+LCBEd2FyZlJlZ051bTxbMCwgMCwgMF0+Ow0KKyAgZGVmIERYIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZHgiLCBbREwsREhdPiwgRHdhcmZSZWdOdW08WzEsIDIsIDJdPjsNCisgIGRlZiBDWCA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8ImN4IiwgW0NMLENIXT4sIER3YXJmUmVnTnVtPFsyLCAxLCAxXT47DQorICBkZWYgQlggOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJieCIsIFtCTCxCSF0+LCBEd2FyZlJlZ051bTxbMywgMywgM10+Ow0KKyAgfQ0KKyAgbGV0IFN1YlJlZ0luZGljZXMgPSBbc3ViXzhiaXRdIGluIHsNCisgIGRlZiBTSSA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InNpIiwgW1NJTF0+LCBEd2FyZlJlZ051bTxbNCwgNiwgNl0+Ow0KKyAgZGVmIERJIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZGkiLCBbRElMXT4sIER3YXJmUmVnTnVtPFs1LCA3LCA3XT47DQorICBkZWYgQlAgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJicCIsIFtCUExdPiwgRHdhcmZSZWdOdW08WzYsIDQsIDVdPjsNCisgIGRlZiBTUCA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InNwIiwgW1NQTF0+LCBEd2FyZlJlZ051bTxbNywgNSwgNF0+Ow0KKyAgfQ0KKyAgZGVmIElQIDogUmVnaXN0ZXI8ImlwIj4sIER3YXJmUmVnTnVtPFsxNl0+Ow0KKyAgDQorICAvLyBYODYtNjQgb25seQ0KKyAgbGV0IFN1YlJlZ0luZGljZXMgPSBbc3ViXzhiaXRdIGluIHsNCisgIGRlZiBSOFcgIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwicjh3IiwgW1I4Ql0+LCBEd2FyZlJlZ051bTxbOCwgLTIsIC0yXT47DQorICBkZWYgUjlXICA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InI5dyIsIFtSOUJdPiwgRHdhcmZSZWdOdW08WzksIC0yLCAtMl0+Ow0KKyAgZGVmIFIxMFcgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyMTB3IiwgW1IxMEJdPiwgRHdhcmZSZWdOdW08WzEwLCAtMiwgLTJdPjsNCisgIGRlZiBSMTFXIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwicjExdyIsIFtSMTFCXT4sIER3YXJmUmVnTnVtPFsxMSwgLTIsIC0yXT47DQorICBkZWYgUjEyVyA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InIxMnciLCBbUjEyQl0+LCBEd2FyZlJlZ051bTxbMTIsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxM1cgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyMTN3IiwgW1IxM0JdPiwgRHdhcmZSZWdOdW08WzEzLCAtMiwgLTJdPjsNCisgIGRlZiBSMTRXIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwicjE0dyIsIFtSMTRCXT4sIER3YXJmUmVnTnVtPFsxNCwgLTIsIC0yXT47DQorICBkZWYgUjE1VyA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InIxNXciLCBbUjE1Ql0+LCBEd2FyZlJlZ051bTxbMTUsIC0yLCAtMl0+Ow0KKyAgfQ0KKyAgLy8gMzItYml0IHJlZ2lzdGVycw0KKyAgbGV0IFN1YlJlZ0luZGljZXMgPSBbc3ViXzE2Yml0XSBpbiB7DQorICBkZWYgRUFYIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZWF4IiwgW0FYXT4sIER3YXJmUmVnTnVtPFswLCAwLCAwXT47DQorICBkZWYgRURYIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZWR4IiwgW0RYXT4sIER3YXJmUmVnTnVtPFsxLCAyLCAyXT47DQorICBkZWYgRUNYIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZWN4IiwgW0NYXT4sIER3YXJmUmVnTnVtPFsyLCAxLCAxXT47DQorICBkZWYgRUJYIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZWJ4IiwgW0JYXT4sIER3YXJmUmVnTnVtPFszLCAzLCAzXT47DQorICBkZWYgRVNJIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZXNpIiwgW1NJXT4sIER3YXJmUmVnTnVtPFs0LCA2LCA2XT47DQorICBkZWYgRURJIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZWRpIiwgW0RJXT4sIER3YXJmUmVnTnVtPFs1LCA3LCA3XT47DQorICBkZWYgRUJQIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZWJwIiwgW0JQXT4sIER3YXJmUmVnTnVtPFs2LCA0LCA1XT47DQorICBkZWYgRVNQIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZXNwIiwgW1NQXT4sIER3YXJmUmVnTnVtPFs3LCA1LCA0XT47DQorICBkZWYgRUlQIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiZWlwIiwgW0lQXT4sIER3YXJmUmVnTnVtPFsxNiwgOCwgOF0+OyAgDQorICANCisgIC8vIFg4Ni02NCBvbmx5DQorICBkZWYgUjhEICA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InI4ZCIsIFtSOFddPiwgRHdhcmZSZWdOdW08WzgsIC0yLCAtMl0+Ow0KKyAgZGVmIFI5RCAgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyOWQiLCBbUjlXXT4sIER3YXJmUmVnTnVtPFs5LCAtMiwgLTJdPjsNCisgIGRlZiBSMTBEIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwicjEwZCIsIFtSMTBXXT4sIER3YXJmUmVnTnVtPFsxMCwgLTIsIC0yXT47DQorICBkZWYgUjExRCA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InIxMWQiLCBbUjExV10+LCBEd2FyZlJlZ051bTxbMTEsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxMkQgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyMTJkIiwgW1IxMlddPiwgRHdhcmZSZWdOdW08WzEyLCAtMiwgLTJdPjsNCisgIGRlZiBSMTNEIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwicjEzZCIsIFtSMTNXXT4sIER3YXJmUmVnTnVtPFsxMywgLTIsIC0yXT47DQorICBkZWYgUjE0RCA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InIxNGQiLCBbUjE0V10+LCBEd2FyZlJlZ051bTxbMTQsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxNUQgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyMTVkIiwgW1IxNVddPiwgRHdhcmZSZWdOdW08WzE1LCAtMiwgLTJdPjsNCisgIH0NCisNCisgIC8vIDY0LWJpdCByZWdpc3RlcnMsIFg4Ni02NCBvbmx5DQorICBsZXQgU3ViUmVnSW5kaWNlcyA9IFtzdWJfMzJiaXRdIGluIHsNCisgIGRlZiBSQVggOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyYXgiLCBbRUFYXT4sIER3YXJmUmVnTnVtPFswLCAtMiwgLTJdPjsNCisgIGRlZiBSRFggOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyZHgiLCBbRURYXT4sIER3YXJmUmVnTnVtPFsxLCAtMiwgLTJdPjsNCisgIGRlZiBSQ1ggOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyY3giLCBbRUNYXT4sIER3YXJmUmVnTnVtPFsyLCAtMiwgLTJdPjsNCisgIGRlZiBSQlggOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyYngiLCBbRUJYXT4sIER3YXJmUmVnTnVtPFszLCAtMiwgLTJdPjsNCisgIGRlZiBSU0kgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyc2kiLCBbRVNJXT4sIER3YXJmUmVnTnVtPFs0LCAtMiwgLTJdPjsNCisgIGRlZiBSREkgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyZGkiLCBbRURJXT4sIER3YXJmUmVnTnVtPFs1LCAtMiwgLTJdPjsNCisgIGRlZiBSQlAgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyYnAiLCBbRUJQXT4sIER3YXJmUmVnTnVtPFs2LCAtMiwgLTJdPjsNCisgIGRlZiBSU1AgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyc3AiLCBbRVNQXT4sIER3YXJmUmVnTnVtPFs3LCAtMiwgLTJdPjsNCisNCisgIGRlZiBSOCAgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyOCIsIFtSOERdPiwgRHdhcmZSZWdOdW08WzgsIC0yLCAtMl0+Ow0KKyAgZGVmIFI5ICA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InI5IiwgW1I5RF0+LCBEd2FyZlJlZ051bTxbOSwgLTIsIC0yXT47DQorICBkZWYgUjEwIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwicjEwIiwgW1IxMERdPiwgRHdhcmZSZWdOdW08WzEwLCAtMiwgLTJdPjsNCisgIGRlZiBSMTEgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyMTEiLCBbUjExRF0+LCBEd2FyZlJlZ051bTxbMTEsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxMiA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InIxMiIsIFtSMTJEXT4sIER3YXJmUmVnTnVtPFsxMiwgLTIsIC0yXT47DQorICBkZWYgUjEzIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwicjEzIiwgW1IxM0RdPiwgRHdhcmZSZWdOdW08WzEzLCAtMiwgLTJdPjsNCisgIGRlZiBSMTQgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJyMTQiLCBbUjE0RF0+LCBEd2FyZlJlZ051bTxbMTQsIC0yLCAtMl0+Ow0KKyAgZGVmIFIxNSA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InIxNSIsIFtSMTVEXT4sIER3YXJmUmVnTnVtPFsxNSwgLTIsIC0yXT47DQorICBkZWYgUklQIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwicmlwIiwgW0VJUF0+LCAgRHdhcmZSZWdOdW08WzE2LCAtMiwgLTJdPjsNCisgIH0NCisNCisgIC8vIE1NWCBSZWdpc3RlcnMuIFRoZXNlIGFyZSBhY3R1YWxseSBhbGlhc2VkIHRvIFNUMCAuLiBTVDcNCisgIGRlZiBNTTAgOiBSZWdpc3RlcjwibW0wIj4sIER3YXJmUmVnTnVtPFs0MSwgMjksIDI5XT47DQorICBkZWYgTU0xIDogUmVnaXN0ZXI8Im1tMSI+LCBEd2FyZlJlZ051bTxbNDIsIDMwLCAzMF0+Ow0KKyAgZGVmIE1NMiA6IFJlZ2lzdGVyPCJtbTIiPiwgRHdhcmZSZWdOdW08WzQzLCAzMSwgMzFdPjsNCisgIGRlZiBNTTMgOiBSZWdpc3RlcjwibW0zIj4sIER3YXJmUmVnTnVtPFs0NCwgMzIsIDMyXT47DQorICBkZWYgTU00IDogUmVnaXN0ZXI8Im1tNCI+LCBEd2FyZlJlZ051bTxbNDUsIDMzLCAzM10+Ow0KKyAgZGVmIE1NNSA6IFJlZ2lzdGVyPCJtbTUiPiwgRHdhcmZSZWdOdW08WzQ2LCAzNCwgMzRdPjsNCisgIGRlZiBNTTYgOiBSZWdpc3RlcjwibW02Ij4sIER3YXJmUmVnTnVtPFs0NywgMzUsIDM1XT47DQorICBkZWYgTU03IDogUmVnaXN0ZXI8Im1tNyI+LCBEd2FyZlJlZ051bTxbNDgsIDM2LCAzNl0+Ow0KKw0KKyAgLy8gUHNldWRvIEZsb2F0aW5nIFBvaW50IHJlZ2lzdGVycw0KKyAgZGVmIEZQMCA6IFJlZ2lzdGVyPCJmcDAiPjsNCisgIGRlZiBGUDEgOiBSZWdpc3RlcjwiZnAxIj47DQorICBkZWYgRlAyIDogUmVnaXN0ZXI8ImZwMiI+Ow0KKyAgZGVmIEZQMyA6IFJlZ2lzdGVyPCJmcDMiPjsNCisgIGRlZiBGUDQgOiBSZWdpc3RlcjwiZnA0Ij47DQorICBkZWYgRlA1IDogUmVnaXN0ZXI8ImZwNSI+Ow0KKyAgZGVmIEZQNiA6IFJlZ2lzdGVyPCJmcDYiPjsNCisNCisgIC8vIFhNTSBSZWdpc3RlcnMsIHVzZWQgYnkgdGhlIHZhcmlvdXMgU1NFIGluc3RydWN0aW9uIHNldCBleHRlbnNpb25zLg0KKyAgLy8gVGhlIHN1Yl9zcyBhbmQgc3ViX3NkIHN1YnJlZ3MgYXJlIHRoZSBzYW1lIHJlZ2lzdGVycyB3aXRoIGFub3RoZXIgcmVnY2xhc3MuDQorICBsZXQgQ29tcG9zaXRlSW5kaWNlcyA9IFsoc3ViX3NzKSwgKHN1Yl9zZCldIGluIHsNCisgIGRlZiBYTU0wOiBSZWdpc3RlcjwieG1tMCI+LCBEd2FyZlJlZ051bTxbMTcsIDIxLCAyMV0+Ow0KKyAgZGVmIFhNTTE6IFJlZ2lzdGVyPCJ4bW0xIj4sIER3YXJmUmVnTnVtPFsxOCwgMjIsIDIyXT47DQorICBkZWYgWE1NMjogUmVnaXN0ZXI8InhtbTIiPiwgRHdhcmZSZWdOdW08WzE5LCAyMywgMjNdPjsNCisgIGRlZiBYTU0zOiBSZWdpc3RlcjwieG1tMyI+LCBEd2FyZlJlZ051bTxbMjAsIDI0LCAyNF0+Ow0KKyAgZGVmIFhNTTQ6IFJlZ2lzdGVyPCJ4bW00Ij4sIER3YXJmUmVnTnVtPFsyMSwgMjUsIDI1XT47DQorICBkZWYgWE1NNTogUmVnaXN0ZXI8InhtbTUiPiwgRHdhcmZSZWdOdW08WzIyLCAyNiwgMjZdPjsNCisgIGRlZiBYTU02OiBSZWdpc3RlcjwieG1tNiI+LCBEd2FyZlJlZ051bTxbMjMsIDI3LCAyN10+Ow0KKyAgZGVmIFhNTTc6IFJlZ2lzdGVyPCJ4bW03Ij4sIER3YXJmUmVnTnVtPFsyNCwgMjgsIDI4XT47DQorDQorICAvLyBYODYtNjQgb25seQ0KKyAgZGVmIFhNTTg6ICBSZWdpc3RlcjwieG1tOCI+LCAgRHdhcmZSZWdOdW08WzI1LCAtMiwgLTJdPjsNCisgIGRlZiBYTU05OiAgUmVnaXN0ZXI8InhtbTkiPiwgIER3YXJmUmVnTnVtPFsyNiwgLTIsIC0yXT47DQorICBkZWYgWE1NMTA6IFJlZ2lzdGVyPCJ4bW0xMCI+LCBEd2FyZlJlZ051bTxbMjcsIC0yLCAtMl0+Ow0KKyAgZGVmIFhNTTExOiBSZWdpc3RlcjwieG1tMTEiPiwgRHdhcmZSZWdOdW08WzI4LCAtMiwgLTJdPjsNCisgIGRlZiBYTU0xMjogUmVnaXN0ZXI8InhtbTEyIj4sIER3YXJmUmVnTnVtPFsyOSwgLTIsIC0yXT47DQorICBkZWYgWE1NMTM6IFJlZ2lzdGVyPCJ4bW0xMyI+LCBEd2FyZlJlZ051bTxbMzAsIC0yLCAtMl0+Ow0KKyAgZGVmIFhNTTE0OiBSZWdpc3RlcjwieG1tMTQiPiwgRHdhcmZSZWdOdW08WzMxLCAtMiwgLTJdPjsNCisgIGRlZiBYTU0xNTogUmVnaXN0ZXI8InhtbTE1Ij4sIER3YXJmUmVnTnVtPFszMiwgLTIsIC0yXT47DQorICB9DQorDQorICAvLyBZTU0gUmVnaXN0ZXJzLCB1c2VkIGJ5IEFWWCBpbnN0cnVjdGlvbnMNCisgIGxldCBTdWJSZWdJbmRpY2VzID0gW3N1Yl94bW1dIGluIHsNCisgIGRlZiBZTU0wOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJ5bW0wIiwgW1hNTTBdPiwgRHdhcmZSZWdOdW08WzE3LCAyMSwgMjFdPjsNCisgIGRlZiBZTU0xOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJ5bW0xIiwgW1hNTTFdPiwgRHdhcmZSZWdOdW08WzE4LCAyMiwgMjJdPjsNCisgIGRlZiBZTU0yOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJ5bW0yIiwgW1hNTTJdPiwgRHdhcmZSZWdOdW08WzE5LCAyMywgMjNdPjsNCisgIGRlZiBZTU0zOiBSZWdpc3RlcldpdGhTdWJSZWdzPCJ5bW0zIiwgW1hNTTNdPiwgRHdhcmZSZWdOdW08WzIwLCAyNCwgMjRdPjsNCisgIGRlZiBZTU00OiBSZWdpc3RlcldpdGhTdWJSZWdzPCJ5bW00IiwgW1hNTTRdPiwgRHdhcmZSZWdOdW08WzIxLCAyNSwgMjVdPjsNCisgIGRlZiBZTU01OiBSZWdpc3RlcldpdGhTdWJSZWdzPCJ5bW01IiwgW1hNTTVdPiwgRHdhcmZSZWdOdW08WzIyLCAyNiwgMjZdPjsNCisgIGRlZiBZTU02OiBSZWdpc3RlcldpdGhTdWJSZWdzPCJ5bW02IiwgW1hNTTZdPiwgRHdhcmZSZWdOdW08WzIzLCAyNywgMjddPjsNCisgIGRlZiBZTU03OiBSZWdpc3RlcldpdGhTdWJSZWdzPCJ5bW03IiwgW1hNTTddPiwgRHdhcmZSZWdOdW08WzI0LCAyOCwgMjhdPjsNCisgIGRlZiBZTU04OiAgUmVnaXN0ZXJXaXRoU3ViUmVnczwieW1tOCIsIFtYTU04XT4sICBEd2FyZlJlZ051bTxbMjUsIC0yLCAtMl0+Ow0KKyAgZGVmIFlNTTk6ICBSZWdpc3RlcldpdGhTdWJSZWdzPCJ5bW05IiwgW1hNTTldPiwgIER3YXJmUmVnTnVtPFsyNiwgLTIsIC0yXT47DQorICBkZWYgWU1NMTA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InltbTEwIiwgW1hNTTEwXT4sIER3YXJmUmVnTnVtPFsyNywgLTIsIC0yXT47DQorICBkZWYgWU1NMTE6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InltbTExIiwgW1hNTTExXT4sIER3YXJmUmVnTnVtPFsyOCwgLTIsIC0yXT47DQorICBkZWYgWU1NMTI6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InltbTEyIiwgW1hNTTEyXT4sIER3YXJmUmVnTnVtPFsyOSwgLTIsIC0yXT47DQorICBkZWYgWU1NMTM6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InltbTEzIiwgW1hNTTEzXT4sIER3YXJmUmVnTnVtPFszMCwgLTIsIC0yXT47DQorICBkZWYgWU1NMTQ6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InltbTE0IiwgW1hNTTE0XT4sIER3YXJmUmVnTnVtPFszMSwgLTIsIC0yXT47DQorICBkZWYgWU1NMTU6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8InltbTE1IiwgW1hNTTE1XT4sIER3YXJmUmVnTnVtPFszMiwgLTIsIC0yXT47DQorICB9DQorDQorICAvLyBGbG9hdGluZyBwb2ludCBzdGFjayByZWdpc3RlcnMNCisgIGRlZiBTVDAgOiBSZWdpc3Rlcjwic3QoMCkiPiwgRHdhcmZSZWdOdW08WzMzLCAxMiwgMTFdPjsNCisgIGRlZiBTVDEgOiBSZWdpc3Rlcjwic3QoMSkiPiwgRHdhcmZSZWdOdW08WzM0LCAxMywgMTJdPjsNCisgIGRlZiBTVDIgOiBSZWdpc3Rlcjwic3QoMikiPiwgRHdhcmZSZWdOdW08WzM1LCAxNCwgMTNdPjsNCisgIGRlZiBTVDMgOiBSZWdpc3Rlcjwic3QoMykiPiwgRHdhcmZSZWdOdW08WzM2LCAxNSwgMTRdPjsNCisgIGRlZiBTVDQgOiBSZWdpc3Rlcjwic3QoNCkiPiwgRHdhcmZSZWdOdW08WzM3LCAxNiwgMTVdPjsNCisgIGRlZiBTVDUgOiBSZWdpc3Rlcjwic3QoNSkiPiwgRHdhcmZSZWdOdW08WzM4LCAxNywgMTZdPjsNCisgIGRlZiBTVDYgOiBSZWdpc3Rlcjwic3QoNikiPiwgRHdhcmZSZWdOdW08WzM5LCAxOCwgMTddPjsNCisgIGRlZiBTVDcgOiBSZWdpc3Rlcjwic3QoNykiPiwgRHdhcmZSZWdOdW08WzQwLCAxOSwgMThdPjsgDQorDQorICAvLyBTdGF0dXMgZmxhZ3MgcmVnaXN0ZXINCisgIGRlZiBFRkxBR1MgOiBSZWdpc3RlcjwiZmxhZ3MiPjsNCisNCisgIC8vIFNlZ21lbnQgcmVnaXN0ZXJzDQorICBkZWYgQ1MgOiBSZWdpc3RlcjwiY3MiPjsNCisgIGRlZiBEUyA6IFJlZ2lzdGVyPCJkcyI+Ow0KKyAgZGVmIFNTIDogUmVnaXN0ZXI8InNzIj47DQorICBkZWYgRVMgOiBSZWdpc3RlcjwiZXMiPjsNCisgIGRlZiBGUyA6IFJlZ2lzdGVyPCJmcyI+Ow0KKyAgZGVmIEdTIDogUmVnaXN0ZXI8ImdzIj47DQorICANCisgIC8vIERlYnVnIHJlZ2lzdGVycw0KKyAgZGVmIERSMCA6IFJlZ2lzdGVyPCJkcjAiPjsNCisgIGRlZiBEUjEgOiBSZWdpc3RlcjwiZHIxIj47DQorICBkZWYgRFIyIDogUmVnaXN0ZXI8ImRyMiI+Ow0KKyAgZGVmIERSMyA6IFJlZ2lzdGVyPCJkcjMiPjsNCisgIGRlZiBEUjQgOiBSZWdpc3RlcjwiZHI0Ij47DQorICBkZWYgRFI1IDogUmVnaXN0ZXI8ImRyNSI+Ow0KKyAgZGVmIERSNiA6IFJlZ2lzdGVyPCJkcjYiPjsNCisgIGRlZiBEUjcgOiBSZWdpc3RlcjwiZHI3Ij47DQorICANCisgIC8vIENvbmRpdGlvbiByZWdpc3RlcnMNCisgIGRlZiBDUjAgOiBSZWdpc3RlcjwiY3IwIj47DQorICBkZWYgQ1IxIDogUmVnaXN0ZXI8ImNyMSI+Ow0KKyAgZGVmIENSMiA6IFJlZ2lzdGVyPCJjcjIiPjsNCisgIGRlZiBDUjMgOiBSZWdpc3RlcjwiY3IzIj47DQorICBkZWYgQ1I0IDogUmVnaXN0ZXI8ImNyNCI+Ow0KKyAgZGVmIENSNSA6IFJlZ2lzdGVyPCJjcjUiPjsNCisgIGRlZiBDUjYgOiBSZWdpc3RlcjwiY3I2Ij47DQorICBkZWYgQ1I3IDogUmVnaXN0ZXI8ImNyNyI+Ow0KKyAgZGVmIENSOCA6IFJlZ2lzdGVyPCJjcjgiPjsNCisNCisgIC8vIFBzZXVkbyBpbmRleCByZWdpc3RlcnMNCisgIGRlZiBFSVogOiBSZWdpc3RlcjwiZWl6Ij47DQorICBkZWYgUklaIDogUmVnaXN0ZXI8InJpeiI+Ow0KK30NCisNCisNCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKy8vIFJlZ2lzdGVyIENsYXNzIERlZmluaXRpb25zLi4uIG5vdyB0aGF0IHdlIGhhdmUgYWxsIG9mIHRoZSBwaWVjZXMsIGRlZmluZSB0aGUNCisvLyB0b3AtbGV2ZWwgcmVnaXN0ZXIgY2xhc3Nlcy4gIFRoZSBvcmRlciBzcGVjaWZpZWQgaW4gdGhlIHJlZ2lzdGVyIGxpc3QgaXMNCisvLyBpbXBsaWNpdGx5IGRlZmluZWQgdG8gYmUgdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gb3JkZXIuDQorLy8NCisNCisvLyBMaXN0IGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVycyBiZWZvcmUgY2FsbGVlLXNhdmUgcmVnaXN0ZXJzLiBSQlgsIFJCUCwgKGFuZCANCisvLyBSMTIsIFIxMywgUjE0LCBhbmQgUjE1IGZvciBYODYtNjQpIGFyZSBjYWxsZWUtc2F2ZSByZWdpc3RlcnMuDQorLy8gSW4gNjQtbW9kZSwgdGhlcmUgYXJlIDEyIGFkZGl0aW9uYWwgaTggcmVnaXN0ZXJzLCBTSUwsIERJTCwgQlBMLCBTUEwsIGFuZA0KKy8vIFI4QiwgLi4uIFIxNUIuIA0KKy8vIEFsbG9jYXRlIFIxMiBhbmQgUjEzIGxhc3QsIGFzIHRoZXNlIHJlcXVpcmUgYW4gZXh0cmEgYnl0ZSB3aGVuDQorLy8gZW5jb2RlZCBpbiB4ODZfNjQgaW5zdHJ1Y3Rpb25zLg0KKy8vIEZJWE1FOiBBbGxvdyBBSCwgQ0gsIERILCBCSCB0byBiZSB1c2VkIGFzIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMgaW4NCisvLyA2NC1iaXQgbW9kZS4gVGhlIG1haW4gY29tcGxpY2F0aW9uIGlzIHRoYXQgdGhleSBjYW5ub3QgYmUgZW5jb2RlZCBpbiBhbg0KKy8vIGluc3RydWN0aW9uIHJlcXVpcmluZyBhIFJFWCBwcmVmaXgsIHdoaWxlIFNJTCwgRElMLCBCUEwsIFI4RCwgZXRjLg0KKy8vIHJlcXVpcmUgYSBSRVggcHJlZml4LiBGb3IgZXhhbXBsZSwgImFkZGIgJWFoLCAlZGlsIiBhbmQgIm1vdnpibCAlYWgsICVyOGQiDQorLy8gY2Fubm90IGJlIGVuY29kZWQuDQorZGVmIEdSOCA6IFJlZ2lzdGVyQ2xhc3M8Ilg4NiIsIFtpOF0sICA4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtBTCwgQ0wsIERMLCBBSCwgQ0gsIERILCBCTCwgQkgsIFNJTCwgRElMLCBCUEwsIFNQTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgUjhCLCBSOUIsIFIxMEIsIFIxMUIsIFIxNEIsIFIxNUIsIFIxMkIsIFIxM0JdPiB7DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgWDg2X0dSOF9BT182NFtdID0gew0KKyAgICAgIFg4Njo6QUwsICAgWDg2OjpDTCwgICBYODY6OkRMLCAgIFg4Njo6U0lMLCBYODY6OkRJTCwNCisgICAgICBYODY6OlI4QiwgIFg4Njo6UjlCLCAgWDg2OjpSMTBCLCBYODY6OlIxMUIsDQorICAgICAgWDg2OjpCTCwgICBYODY6OlIxNEIsIFg4Njo6UjE1QiwgWDg2OjpSMTJCLCBYODY6OlIxM0IsIFg4Njo6QlBMDQorICAgIH07DQorDQorICAgIEdSOENsYXNzOjppdGVyYXRvcg0KKyAgICBHUjhDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBYODZTdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCk7DQorICAgICAgaWYgKFN1YnRhcmdldC5pczY0Qml0KCkpDQorICAgICAgICByZXR1cm4gWDg2X0dSOF9BT182NDsNCisgICAgICBlbHNlDQorICAgICAgICByZXR1cm4gYmVnaW4oKTsNCisgICAgfQ0KKw0KKyAgICBHUjhDbGFzczo6aXRlcmF0b3INCisgICAgR1I4Q2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOw0KKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsNCisgICAgICBjb25zdCBYODZTdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCk7DQorICAgICAgY29uc3QgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyAqTUZJID0gTUYuZ2V0SW5mbzxYODZNYWNoaW5lRnVuY3Rpb25JbmZvPigpOw0KKyAgICAgIC8vIERvZXMgdGhlIGZ1bmN0aW9uIGRlZGljYXRlIFJCUCAvIEVCUCB0byBiZWluZyBhIGZyYW1lIHB0cj8NCisgICAgICBpZiAoIVN1YnRhcmdldC5pczY0Qml0KCkpDQorICAgICAgICAvLyBJbiAzMi1tb2RlLCBub25lIG9mIHRoZSA4LWJpdCByZWdpc3RlcnMgYWxpYXNlcyBFQlAgb3IgRVNQLg0KKyAgICAgICAgcmV0dXJuIGJlZ2luKCkgKyA4Ow0KKyAgICAgIGVsc2UgaWYgKFJJLT5oYXNGUChNRikgfHwgTUZJLT5nZXRSZXNlcnZlRlAoKSkNCisgICAgICAgIC8vIElmIHNvLCBkb24ndCBhbGxvY2F0ZSBTUEwgb3IgQlBMLg0KKyAgICAgICAgcmV0dXJuIGFycmF5X2VuZG9mKFg4Nl9HUjhfQU9fNjQpIC0gMTsNCisgICAgICBlbHNlDQorICAgICAgICAvLyBJZiBub3QsIGp1c3QgZG9uJ3QgYWxsb2NhdGUgU1BMLg0KKyAgICAgICAgcmV0dXJuIGFycmF5X2VuZG9mKFg4Nl9HUjhfQU9fNjQpOw0KKyAgICB9DQorICB9XTsNCit9DQorDQorZGVmIEdSMTYgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTE2XSwgMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFtBWCwgQ1gsIERYLCBTSSwgREksIEJYLCBCUCwgU1AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBSOFcsIFI5VywgUjEwVywgUjExVywgUjE0VywgUjE1VywgUjEyVywgUjEzV10+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjggc3ViXzhiaXQsIHN1Yl84Yml0X2hpKV07DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgWDg2X0dSMTZfQU9fNjRbXSA9IHsNCisgICAgICBYODY6OkFYLCAgWDg2OjpDWCwgICBYODY6OkRYLCAgIFg4Njo6U0ksICAgWDg2OjpESSwNCisgICAgICBYODY6OlI4VywgWDg2OjpSOVcsICBYODY6OlIxMFcsIFg4Njo6UjExVywNCisgICAgICBYODY6OkJYLCBYODY6OlIxNFcsIFg4Njo6UjE1VywgIFg4Njo6UjEyVywgWDg2OjpSMTNXLCBYODY6OkJQDQorICAgIH07DQorDQorICAgIEdSMTZDbGFzczo6aXRlcmF0b3INCisgICAgR1IxNkNsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOw0KKyAgICAgIGNvbnN0IFg4NlN1YnRhcmdldCAmU3VidGFyZ2V0ID0gVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKTsNCisgICAgICBpZiAoU3VidGFyZ2V0LmlzNjRCaXQoKSkNCisgICAgICAgIHJldHVybiBYODZfR1IxNl9BT182NDsNCisgICAgICBlbHNlDQorICAgICAgICByZXR1cm4gYmVnaW4oKTsNCisgICAgfQ0KKw0KKyAgICBHUjE2Q2xhc3M6Oml0ZXJhdG9yDQorICAgIEdSMTZDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOw0KKyAgICAgIGNvbnN0IFg4NlN1YnRhcmdldCAmU3VidGFyZ2V0ID0gVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKTsNCisgICAgICBjb25zdCBYODZNYWNoaW5lRnVuY3Rpb25JbmZvICpNRkkgPSBNRi5nZXRJbmZvPFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7DQorICAgICAgaWYgKFN1YnRhcmdldC5pczY0Qml0KCkpIHsNCisgICAgICAgIC8vIERvZXMgdGhlIGZ1bmN0aW9uIGRlZGljYXRlIFJCUCB0byBiZWluZyBhIGZyYW1lIHB0cj8NCisgICAgICAgIGlmIChSSS0+aGFzRlAoTUYpIHx8IE1GSS0+Z2V0UmVzZXJ2ZUZQKCkpDQorICAgICAgICAgIC8vIElmIHNvLCBkb24ndCBhbGxvY2F0ZSBTUCBvciBCUC4NCisgICAgICAgICAgcmV0dXJuIGFycmF5X2VuZG9mKFg4Nl9HUjE2X0FPXzY0KSAtIDE7DQorICAgICAgICBlbHNlDQorICAgICAgICAgIC8vIElmIG5vdCwganVzdCBkb24ndCBhbGxvY2F0ZSBTUC4NCisgICAgICAgICAgcmV0dXJuIGFycmF5X2VuZG9mKFg4Nl9HUjE2X0FPXzY0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgLy8gRG9lcyB0aGUgZnVuY3Rpb24gZGVkaWNhdGUgRUJQIHRvIGJlaW5nIGEgZnJhbWUgcHRyPw0KKyAgICAgICAgaWYgKFJJLT5oYXNGUChNRikgfHwgTUZJLT5nZXRSZXNlcnZlRlAoKSkNCisgICAgICAgICAgLy8gSWYgc28sIGRvbid0IGFsbG9jYXRlIFNQIG9yIEJQLg0KKyAgICAgICAgICByZXR1cm4gYmVnaW4oKSArIDY7DQorICAgICAgICBlbHNlDQorICAgICAgICAgIC8vIElmIG5vdCwganVzdCBkb24ndCBhbGxvY2F0ZSBTUC4NCisgICAgICAgICAgcmV0dXJuIGJlZ2luKCkgKyA3Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KK2RlZiBHUjMyIDogUmVnaXN0ZXJDbGFzczwiWDg2IiwgW2kzMl0sIDMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbRUFYLCBFQ1gsIEVEWCwgRVNJLCBFREksIEVCWCwgRUJQLCBFU1AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBSOEQsIFI5RCwgUjEwRCwgUjExRCwgUjE0RCwgUjE1RCwgUjEyRCwgUjEzRF0+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjggc3ViXzhiaXQsIHN1Yl84Yml0X2hpKSwgKEdSMTYgc3ViXzE2Yml0KV07DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgWDg2X0dSMzJfQU9fNjRbXSA9IHsNCisgICAgICBYODY6OkVBWCwgWDg2OjpFQ1gsICBYODY6OkVEWCwgIFg4Njo6RVNJLCAgWDg2OjpFREksDQorICAgICAgWDg2OjpSOEQsIFg4Njo6UjlELCAgWDg2OjpSMTBELCBYODY6OlIxMUQsDQorICAgICAgWDg2OjpFQlgsIFg4Njo6UjE0RCwgWDg2OjpSMTVELCBYODY6OlIxMkQsIFg4Njo6UjEzRCwgWDg2OjpFQlANCisgICAgfTsNCisNCisgICAgR1IzMkNsYXNzOjppdGVyYXRvcg0KKyAgICBHUjMyQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgWDg2U3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOw0KKyAgICAgIGlmIChTdWJ0YXJnZXQuaXM2NEJpdCgpKQ0KKyAgICAgICAgcmV0dXJuIFg4Nl9HUjMyX0FPXzY0Ow0KKyAgICAgIGVsc2UNCisgICAgICAgIHJldHVybiBiZWdpbigpOw0KKyAgICB9DQorDQorICAgIEdSMzJDbGFzczo6aXRlcmF0b3INCisgICAgR1IzMkNsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7DQorICAgICAgY29uc3QgWDg2U3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOw0KKyAgICAgIGNvbnN0IFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8gKk1GSSA9IE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsNCisgICAgICBpZiAoU3VidGFyZ2V0LmlzNjRCaXQoKSkgew0KKyAgICAgICAgLy8gRG9lcyB0aGUgZnVuY3Rpb24gZGVkaWNhdGUgUkJQIHRvIGJlaW5nIGEgZnJhbWUgcHRyPw0KKyAgICAgICAgaWYgKFJJLT5oYXNGUChNRikgfHwgTUZJLT5nZXRSZXNlcnZlRlAoKSkNCisgICAgICAgICAgLy8gSWYgc28sIGRvbid0IGFsbG9jYXRlIEVTUCBvciBFQlAuDQorICAgICAgICAgIHJldHVybiBhcnJheV9lbmRvZihYODZfR1IzMl9BT182NCkgLSAxOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAvLyBJZiBub3QsIGp1c3QgZG9uJ3QgYWxsb2NhdGUgRVNQLg0KKyAgICAgICAgICByZXR1cm4gYXJyYXlfZW5kb2YoWDg2X0dSMzJfQU9fNjQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICAvLyBEb2VzIHRoZSBmdW5jdGlvbiBkZWRpY2F0ZSBFQlAgdG8gYmVpbmcgYSBmcmFtZSBwdHI/DQorICAgICAgICBpZiAoUkktPmhhc0ZQKE1GKSB8fCBNRkktPmdldFJlc2VydmVGUCgpKQ0KKyAgICAgICAgICAvLyBJZiBzbywgZG9uJ3QgYWxsb2NhdGUgRVNQIG9yIEVCUC4NCisgICAgICAgICAgcmV0dXJuIGJlZ2luKCkgKyA2Ow0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAvLyBJZiBub3QsIGp1c3QgZG9uJ3QgYWxsb2NhdGUgRVNQLg0KKyAgICAgICAgICByZXR1cm4gYmVnaW4oKSArIDc7DQorICAgICAgfQ0KKyAgICB9DQorICB9XTsNCit9DQorDQorLy8gR1I2NCAtIDY0LWJpdCBHUFJzLiBUaGlzIG9kZGx5IGluY2x1ZGVzIFJJUCwgd2hpY2ggaXNuJ3QgYWNjdXJhdGUsIHNpbmNlDQorLy8gUklQIGlzbid0IHJlYWxseSBhIHJlZ2lzdGVyIGFuZCBpdCBjYW4ndCBiZSB1c2VkIGFueXdoZXJlIGV4Y2VwdCBpbiBhbg0KKy8vIGFkZHJlc3MsIGJ1dCBpdCBkb2Vzbid0IGNhdXNlIHRyb3VibGUuDQorZGVmIEdSNjQgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTY0XSwgNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFtSQVgsIFJDWCwgUkRYLCBSU0ksIFJESSwgUjgsIFI5LCBSMTAsIFIxMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJCWCwgUjE0LCBSMTUsIFIxMiwgUjEzLCBSQlAsIFJTUCwgUklQXT4gew0KKyAgbGV0IFN1YlJlZ0NsYXNzZXMgPSBbKEdSOCBzdWJfOGJpdCwgc3ViXzhiaXRfaGkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKEdSMTYgc3ViXzE2Yml0KSwNCisgICAgICAgICAgICAgICAgICAgICAgIChHUjMyIHN1Yl8zMmJpdCldOw0KKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgfV07DQorICBsZXQgTWV0aG9kQm9kaWVzID0gW3sNCisgICAgR1I2NENsYXNzOjppdGVyYXRvcg0KKyAgICBHUjY0Q2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOw0KKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsNCisgICAgICBjb25zdCBYODZTdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCk7DQorICAgICAgY29uc3QgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyAqTUZJID0gTUYuZ2V0SW5mbzxYODZNYWNoaW5lRnVuY3Rpb25JbmZvPigpOw0KKyAgICAgIGlmICghU3VidGFyZ2V0LmlzNjRCaXQoKSkNCisgICAgICAgIHJldHVybiBiZWdpbigpOyAgLy8gTm9uZSBvZiB0aGVzZSBhcmUgYWxsb2NhdGFibGUgaW4gMzItYml0Lg0KKyAgICAgIC8vIERvZXMgdGhlIGZ1bmN0aW9uIGRlZGljYXRlIFJCUCB0byBiZWluZyBhIGZyYW1lIHB0cj8NCisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSB8fCBNRkktPmdldFJlc2VydmVGUCgpKQ0KKyAgICAgICAgcmV0dXJuIGVuZCgpLTM7ICAvLyBJZiBzbywgZG9uJ3QgYWxsb2NhdGUgUklQLCBSU1Agb3IgUkJQDQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIGVuZCgpLTI7ICAvLyBJZiBub3QsIGp1c3QgZG9uJ3QgYWxsb2NhdGUgUklQIG9yIFJTUA0KKyAgICB9DQorICB9XTsNCit9DQorDQorLy8gU2VnbWVudCByZWdpc3RlcnMgZm9yIHVzZSBieSBNT1YgaW5zdHJ1Y3Rpb25zIChhbmQgb3RoZXJzKSB0aGF0IGhhdmUgYQ0KKy8vICAgc2VnbWVudCByZWdpc3RlciBhcyBvbmUgb3BlcmFuZC4gIEFsd2F5cyBjb250YWluIGEgMTYtYml0IHNlZ21lbnQNCisvLyAgIGRlc2NyaXB0b3IuDQorZGVmIFNFR01FTlRfUkVHIDogUmVnaXN0ZXJDbGFzczwiWDg2IiwgW2kxNl0sIDE2LCBbQ1MsIERTLCBTUywgRVMsIEZTLCBHU10+IHsNCit9DQorDQorLy8gRGVidWcgcmVnaXN0ZXJzLg0KK2RlZiBERUJVR19SRUcgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTMyXSwgMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RSMCwgRFIxLCBEUjIsIERSMywgRFI0LCBEUjUsIERSNiwgRFI3XT4gew0KK30NCisNCisvLyBDb250cm9sIHJlZ2lzdGVycy4NCitkZWYgQ09OVFJPTF9SRUcgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTY0XSwgNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQ1IwLCBDUjEsIENSMiwgQ1IzLCBDUjQsIENSNSwgQ1I2LCBDUjcsIENSOF0+IHsNCit9DQorDQorLy8gR1I4X0FCQ0RfTCwgR1I4X0FCQ0RfSCwgR1IxNl9BQkNELCBHUjMyX0FCQ0QsIEdSNjRfQUJDRCAtIFN1YmNsYXNzZXMgb2YNCisvLyBHUjgsIEdSMTYsIEdSMzIsIGFuZCBHUjY0IHdoaWNoIGNvbnRhaW4ganVzdCB0aGUgImEiICJiIiwgImMiLCBhbmQgImQiDQorLy8gcmVnaXN0ZXJzLiBPbiB4ODYtMzIsIEdSMTZfQUJDRCBhbmQgR1IzMl9BQkNEIGFyZSBjbGFzc2VzIGZvciByZWdpc3RlcnMNCisvLyB0aGF0IHN1cHBvcnQgOC1iaXQgc3VicmVnIG9wZXJhdGlvbnMuIE9uIHg4Ni02NCwgR1IxNl9BQkNELCBHUjMyX0FCQ0QsDQorLy8gYW5kIEdSNjRfQUJDRCBhcmUgY2xhc3NlcyBmb3IgcmVnaXN0ZXJzIHRoYXQgc3VwcG9ydCA4LWJpdCBoLXJlZ2lzdGVyDQorLy8gb3BlcmF0aW9ucy4NCitkZWYgR1I4X0FCQ0RfTCA6IFJlZ2lzdGVyQ2xhc3M8Ilg4NiIsIFtpOF0sIDgsIFtBTCwgQ0wsIERMLCBCTF0+IHsNCit9DQorZGVmIEdSOF9BQkNEX0ggOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaThdLCA4LCBbQUgsIENILCBESCwgQkhdPiB7DQorfQ0KK2RlZiBHUjE2X0FCQ0QgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTE2XSwgMTYsIFtBWCwgQ1gsIERYLCBCWF0+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjhfQUJDRF9MIHN1Yl84Yml0KSwgKEdSOF9BQkNEX0ggc3ViXzhiaXRfaGkpXTsNCit9DQorZGVmIEdSMzJfQUJDRCA6IFJlZ2lzdGVyQ2xhc3M8Ilg4NiIsIFtpMzJdLCAzMiwgW0VBWCwgRUNYLCBFRFgsIEVCWF0+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjhfQUJDRF9MIHN1Yl84Yml0KSwNCisgICAgICAgICAgICAgICAgICAgICAgIChHUjhfQUJDRF9IIHN1Yl84Yml0X2hpKSwNCisgICAgICAgICAgICAgICAgICAgICAgIChHUjE2X0FCQ0Qgc3ViXzE2Yml0KV07DQorfQ0KK2RlZiBHUjY0X0FCQ0QgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTY0XSwgNjQsIFtSQVgsIFJDWCwgUkRYLCBSQlhdPiB7DQorICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoR1I4X0FCQ0RfTCBzdWJfOGJpdCksDQorICAgICAgICAgICAgICAgICAgICAgICAoR1I4X0FCQ0RfSCBzdWJfOGJpdF9oaSksDQorICAgICAgICAgICAgICAgICAgICAgICAoR1IxNl9BQkNEIHN1Yl8xNmJpdCksDQorICAgICAgICAgICAgICAgICAgICAgICAoR1IzMl9BQkNEIHN1Yl8zMmJpdCldOw0KK30NCitkZWYgR1IzMl9UQyAgIDogUmVnaXN0ZXJDbGFzczwiWDg2IiwgW2kzMl0sIDMyLCBbRUFYLCBFQ1gsIEVEWF0+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjggc3ViXzhiaXQsIHN1Yl84Yml0X2hpKSwgKEdSMTYgc3ViXzE2Yml0KV07DQorfQ0KK2RlZiBHUjY0X1RDICAgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTY0XSwgNjQsIFtSQVgsIFJDWCwgUkRYLCBSU0ksIFJESSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUjgsIFI5LCBSMTFdPiB7DQorICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoR1I4IHN1Yl84Yml0LCBzdWJfOGJpdF9oaSksDQorICAgICAgICAgICAgICAgICAgICAgICAoR1IxNiBzdWJfMTZiaXQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKEdSMzJfVEMgc3ViXzMyYml0KV07DQorfQ0KKw0KKy8vIEdSOF9OT1JFWCAtIEdSOCByZWdpc3RlcnMgd2hpY2ggZG8gbm90IHJlcXVpcmUgYSBSRVggcHJlZml4Lg0KK2RlZiBHUjhfTk9SRVggOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaThdLCA4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBTCwgQ0wsIERMLCBBSCwgQ0gsIERILCBCTCwgQkhdPiB7DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICAvLyBJbiA2NC1iaXQgbW9kZSwgaXQncyBub3Qgc2FmZSB0byBibGluZGx5IGFsbG9jYXRlIEggcmVnaXN0ZXJzLg0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgWDg2X0dSOF9OT1JFWF9BT182NFtdID0gew0KKyAgICAgIFg4Njo6QUwsIFg4Njo6Q0wsIFg4Njo6REwsIFg4Njo6QkwNCisgICAgfTsNCisNCisgICAgR1I4X05PUkVYQ2xhc3M6Oml0ZXJhdG9yDQorICAgIEdSOF9OT1JFWENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOw0KKyAgICAgIGNvbnN0IFg4NlN1YnRhcmdldCAmU3VidGFyZ2V0ID0gVE0uZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKTsNCisgICAgICBpZiAoU3VidGFyZ2V0LmlzNjRCaXQoKSkNCisgICAgICAgIHJldHVybiBYODZfR1I4X05PUkVYX0FPXzY0Ow0KKyAgICAgIGVsc2UNCisgICAgICAgIHJldHVybiBiZWdpbigpOw0KKyAgICB9DQorDQorICAgIEdSOF9OT1JFWENsYXNzOjppdGVyYXRvcg0KKyAgICBHUjhfTk9SRVhDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgWDg2U3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOw0KKyAgICAgIGlmIChTdWJ0YXJnZXQuaXM2NEJpdCgpKQ0KKyAgICAgICAgcmV0dXJuIGFycmF5X2VuZG9mKFg4Nl9HUjhfTk9SRVhfQU9fNjQpOw0KKyAgICAgIGVsc2UNCisgICAgICAgIHJldHVybiBlbmQoKTsNCisgICAgfQ0KKyAgfV07DQorfQ0KKy8vIEdSMTZfTk9SRVggLSBHUjE2IHJlZ2lzdGVycyB3aGljaCBkbyBub3QgcmVxdWlyZSBhIFJFWCBwcmVmaXguDQorZGVmIEdSMTZfTk9SRVggOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTE2XSwgMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBWCwgQ1gsIERYLCBTSSwgREksIEJYLCBCUCwgU1BdPiB7DQorICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoR1I4X05PUkVYIHN1Yl84Yml0LCBzdWJfOGJpdF9oaSldOw0KKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgfV07DQorICBsZXQgTWV0aG9kQm9kaWVzID0gW3sNCisgICAgR1IxNl9OT1JFWENsYXNzOjppdGVyYXRvcg0KKyAgICBHUjE2X05PUkVYQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOw0KKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsNCisgICAgICBjb25zdCBYODZNYWNoaW5lRnVuY3Rpb25JbmZvICpNRkkgPSBNRi5nZXRJbmZvPFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7DQorICAgICAgLy8gRG9lcyB0aGUgZnVuY3Rpb24gZGVkaWNhdGUgUkJQIC8gRUJQIHRvIGJlaW5nIGEgZnJhbWUgcHRyPw0KKyAgICAgIGlmIChSSS0+aGFzRlAoTUYpIHx8IE1GSS0+Z2V0UmVzZXJ2ZUZQKCkpDQorICAgICAgICAvLyBJZiBzbywgZG9uJ3QgYWxsb2NhdGUgU1Agb3IgQlAuDQorICAgICAgICByZXR1cm4gZW5kKCkgLSAyOw0KKyAgICAgIGVsc2UNCisgICAgICAgIC8vIElmIG5vdCwganVzdCBkb24ndCBhbGxvY2F0ZSBTUC4NCisgICAgICAgIHJldHVybiBlbmQoKSAtIDE7DQorICAgIH0NCisgIH1dOw0KK30NCisvLyBHUjMyX05PUkVYIC0gR1IzMiByZWdpc3RlcnMgd2hpY2ggZG8gbm90IHJlcXVpcmUgYSBSRVggcHJlZml4Lg0KK2RlZiBHUjMyX05PUkVYIDogUmVnaXN0ZXJDbGFzczwiWDg2IiwgW2kzMl0sIDMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRUFYLCBFQ1gsIEVEWCwgRVNJLCBFREksIEVCWCwgRUJQLCBFU1BdPiB7DQorICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoR1I4X05PUkVYIHN1Yl84Yml0LCBzdWJfOGJpdF9oaSksDQorICAgICAgICAgICAgICAgICAgICAgICAoR1IxNl9OT1JFWCBzdWJfMTZiaXQpXTsNCisgIGxldCBNZXRob2RQcm90b3MgPSBbew0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgIH1dOw0KKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7DQorICAgIEdSMzJfTk9SRVhDbGFzczo6aXRlcmF0b3INCisgICAgR1IzMl9OT1JFWENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7DQorICAgICAgY29uc3QgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyAqTUZJID0gTUYuZ2V0SW5mbzxYODZNYWNoaW5lRnVuY3Rpb25JbmZvPigpOw0KKyAgICAgIC8vIERvZXMgdGhlIGZ1bmN0aW9uIGRlZGljYXRlIFJCUCAvIEVCUCB0byBiZWluZyBhIGZyYW1lIHB0cj8NCisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSB8fCBNRkktPmdldFJlc2VydmVGUCgpKQ0KKyAgICAgICAgLy8gSWYgc28sIGRvbid0IGFsbG9jYXRlIEVTUCBvciBFQlAuDQorICAgICAgICByZXR1cm4gZW5kKCkgLSAyOw0KKyAgICAgIGVsc2UNCisgICAgICAgIC8vIElmIG5vdCwganVzdCBkb24ndCBhbGxvY2F0ZSBFU1AuDQorICAgICAgICByZXR1cm4gZW5kKCkgLSAxOw0KKyAgICB9DQorICB9XTsNCit9DQorLy8gR1I2NF9OT1JFWCAtIEdSNjQgcmVnaXN0ZXJzIHdoaWNoIGRvIG5vdCByZXF1aXJlIGEgUkVYIHByZWZpeC4NCitkZWYgR1I2NF9OT1JFWCA6IFJlZ2lzdGVyQ2xhc3M8Ilg4NiIsIFtpNjRdLCA2NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JBWCwgUkNYLCBSRFgsIFJTSSwgUkRJLCBSQlgsIFJCUCwgUlNQLCBSSVBdPiB7DQorICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoR1I4X05PUkVYIHN1Yl84Yml0LCBzdWJfOGJpdF9oaSksDQorICAgICAgICAgICAgICAgICAgICAgICAoR1IxNl9OT1JFWCBzdWJfMTZiaXQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKEdSMzJfTk9SRVggc3ViXzMyYml0KV07DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBHUjY0X05PUkVYQ2xhc3M6Oml0ZXJhdG9yDQorICAgIEdSNjRfTk9SRVhDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSSSA9IFRNLmdldFJlZ2lzdGVySW5mbygpOw0KKyAgICAgIGNvbnN0IFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8gKk1GSSA9IE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsNCisgICAgICAvLyBEb2VzIHRoZSBmdW5jdGlvbiBkZWRpY2F0ZSBSQlAgdG8gYmVpbmcgYSBmcmFtZSBwdHI/DQorICAgICAgaWYgKFJJLT5oYXNGUChNRikgfHwgTUZJLT5nZXRSZXNlcnZlRlAoKSkNCisgICAgICAgIC8vIElmIHNvLCBkb24ndCBhbGxvY2F0ZSBSSVAsIFJTUCBvciBSQlAuDQorICAgICAgICByZXR1cm4gZW5kKCkgLSAzOw0KKyAgICAgIGVsc2UNCisgICAgICAgIC8vIElmIG5vdCwganVzdCBkb24ndCBhbGxvY2F0ZSBSSVAgb3IgUlNQLg0KKyAgICAgICAgcmV0dXJuIGVuZCgpIC0gMjsNCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KKy8vIEdSMzJfTk9TUCAtIEdSMzIgcmVnaXN0ZXJzIGV4Y2VwdCBFU1AuDQorZGVmIEdSMzJfTk9TUCA6IFJlZ2lzdGVyQ2xhc3M8Ilg4NiIsIFtpMzJdLCAzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRUFYLCBFQ1gsIEVEWCwgRVNJLCBFREksIEVCWCwgRUJQLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSOEQsIFI5RCwgUjEwRCwgUjExRCwgUjE0RCwgUjE1RCwgUjEyRCwgUjEzRF0+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjggc3ViXzhiaXQsIHN1Yl84Yml0X2hpKSwgKEdSMTYgc3ViXzE2Yml0KV07DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgWDg2X0dSMzJfTk9TUF9BT182NFtdID0gew0KKyAgICAgIFg4Njo6RUFYLCBYODY6OkVDWCwgIFg4Njo6RURYLCAgWDg2OjpFU0ksICBYODY6OkVESSwNCisgICAgICBYODY6OlI4RCwgWDg2OjpSOUQsICBYODY6OlIxMEQsIFg4Njo6UjExRCwNCisgICAgICBYODY6OkVCWCwgWDg2OjpSMTRELCBYODY6OlIxNUQsIFg4Njo6UjEyRCwgWDg2OjpSMTNELCBYODY6OkVCUA0KKyAgICB9Ow0KKw0KKyAgICBHUjMyX05PU1BDbGFzczo6aXRlcmF0b3INCisgICAgR1IzMl9OT1NQQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgWDg2U3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOw0KKyAgICAgIGlmIChTdWJ0YXJnZXQuaXM2NEJpdCgpKQ0KKyAgICAgICAgcmV0dXJuIFg4Nl9HUjMyX05PU1BfQU9fNjQ7DQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIGJlZ2luKCk7DQorICAgIH0NCisNCisgICAgR1IzMl9OT1NQQ2xhc3M6Oml0ZXJhdG9yDQorICAgIEdSMzJfTk9TUENsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7DQorICAgICAgY29uc3QgWDg2U3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOw0KKyAgICAgIGNvbnN0IFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8gKk1GSSA9IE1GLmdldEluZm88WDg2TWFjaGluZUZ1bmN0aW9uSW5mbz4oKTsNCisgICAgICBpZiAoU3VidGFyZ2V0LmlzNjRCaXQoKSkgew0KKyAgICAgICAgLy8gRG9lcyB0aGUgZnVuY3Rpb24gZGVkaWNhdGUgUkJQIHRvIGJlaW5nIGEgZnJhbWUgcHRyPw0KKyAgICAgICAgaWYgKFJJLT5oYXNGUChNRikgfHwgTUZJLT5nZXRSZXNlcnZlRlAoKSkNCisgICAgICAgICAgLy8gSWYgc28sIGRvbid0IGFsbG9jYXRlIEVCUC4NCisgICAgICAgICAgcmV0dXJuIGFycmF5X2VuZG9mKFg4Nl9HUjMyX05PU1BfQU9fNjQpIC0gMTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgLy8gSWYgbm90LCBhbnkgcmVnIGluIHRoaXMgY2xhc3MgaXMgb2suDQorICAgICAgICAgIHJldHVybiBhcnJheV9lbmRvZihYODZfR1IzMl9OT1NQX0FPXzY0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgLy8gRG9lcyB0aGUgZnVuY3Rpb24gZGVkaWNhdGUgRUJQIHRvIGJlaW5nIGEgZnJhbWUgcHRyPw0KKyAgICAgICAgaWYgKFJJLT5oYXNGUChNRikgfHwgTUZJLT5nZXRSZXNlcnZlRlAoKSkNCisgICAgICAgICAgLy8gSWYgc28sIGRvbid0IGFsbG9jYXRlIEVCUC4NCisgICAgICAgICAgcmV0dXJuIGJlZ2luKCkgKyA2Ow0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAvLyBJZiBub3QsIGFueSByZWcgaW4gdGhpcyBjbGFzcyBpcyBvay4NCisgICAgICAgICAgcmV0dXJuIGJlZ2luKCkgKyA3Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KKy8vIEdSNjRfTk9TUCAtIEdSNjQgcmVnaXN0ZXJzIGV4Y2VwdCBSU1AgKGFuZCBSSVApLg0KK2RlZiBHUjY0X05PU1AgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTY0XSwgNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JBWCwgUkNYLCBSRFgsIFJTSSwgUkRJLCBSOCwgUjksIFIxMCwgUjExLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQlgsIFIxNCwgUjE1LCBSMTIsIFIxMywgUkJQXT4gew0KKyAgbGV0IFN1YlJlZ0NsYXNzZXMgPSBbKEdSOCBzdWJfOGJpdCwgc3ViXzhiaXRfaGkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKEdSMTYgc3ViXzE2Yml0KSwNCisgICAgICAgICAgICAgICAgICAgICAgIChHUjMyX05PU1Agc3ViXzMyYml0KV07DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBHUjY0X05PU1BDbGFzczo6aXRlcmF0b3INCisgICAgR1I2NF9OT1NQQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsNCisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOw0KKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsNCisgICAgICBjb25zdCBYODZTdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCk7DQorICAgICAgY29uc3QgWDg2TWFjaGluZUZ1bmN0aW9uSW5mbyAqTUZJID0gTUYuZ2V0SW5mbzxYODZNYWNoaW5lRnVuY3Rpb25JbmZvPigpOw0KKyAgICAgIGlmICghU3VidGFyZ2V0LmlzNjRCaXQoKSkNCisgICAgICAgIHJldHVybiBiZWdpbigpOyAgLy8gTm9uZSBvZiB0aGVzZSBhcmUgYWxsb2NhdGFibGUgaW4gMzItYml0Lg0KKyAgICAgIC8vIERvZXMgdGhlIGZ1bmN0aW9uIGRlZGljYXRlIFJCUCB0byBiZWluZyBhIGZyYW1lIHB0cj8NCisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSB8fCBNRkktPmdldFJlc2VydmVGUCgpKQ0KKyAgICAgICAgcmV0dXJuIGVuZCgpLTE7ICAvLyBJZiBzbywgZG9uJ3QgYWxsb2NhdGUgUkJQDQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIGVuZCgpOyAgLy8gSWYgbm90LCBhbnkgcmVnIGluIHRoaXMgY2xhc3MgaXMgb2suDQorICAgIH0NCisgIH1dOw0KK30NCisNCisvLyBHUjY0X05PUkVYX05PU1AgLSBHUjY0X05PUkVYIHJlZ2lzdGVycyBleGNlcHQgUlNQLg0KK2RlZiBHUjY0X05PUkVYX05PU1AgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTY0XSwgNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JBWCwgUkNYLCBSRFgsIFJTSSwgUkRJLCBSQlgsIFJCUF0+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjhfTk9SRVggc3ViXzhiaXQsIHN1Yl84Yml0X2hpKSwNCisgICAgICAgICAgICAgICAgICAgICAgIChHUjE2X05PUkVYIHN1Yl8xNmJpdCksDQorICAgICAgICAgICAgICAgICAgICAgICAoR1IzMl9OT1JFWCBzdWJfMzJiaXQpXTsNCisgIGxldCBNZXRob2RQcm90b3MgPSBbew0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgIH1dOw0KKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7DQorICAgIEdSNjRfTk9SRVhfTk9TUENsYXNzOjppdGVyYXRvcg0KKyAgICBHUjY0X05PUkVYX05PU1BDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QNCisgIHsNCisgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSA9IE1GLmdldFRhcmdldCgpOw0KKyAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUkkgPSBUTS5nZXRSZWdpc3RlckluZm8oKTsNCisgICAgICBjb25zdCBYODZNYWNoaW5lRnVuY3Rpb25JbmZvICpNRkkgPSBNRi5nZXRJbmZvPFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8+KCk7DQorICAgICAgLy8gRG9lcyB0aGUgZnVuY3Rpb24gZGVkaWNhdGUgUkJQIHRvIGJlaW5nIGEgZnJhbWUgcHRyPw0KKyAgICAgIGlmIChSSS0+aGFzRlAoTUYpIHx8IE1GSS0+Z2V0UmVzZXJ2ZUZQKCkpDQorICAgICAgICAvLyBJZiBzbywgZG9uJ3QgYWxsb2NhdGUgUkJQLg0KKyAgICAgICAgcmV0dXJuIGVuZCgpIC0gMTsNCisgICAgICBlbHNlDQorICAgICAgICAvLyBJZiBub3QsIGFueSByZWcgaW4gdGhpcyBjbGFzcyBpcyBvay4NCisgICAgICAgIHJldHVybiBlbmQoKTsNCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KKy8vIEEgY2xhc3MgdG8gc3VwcG9ydCB0aGUgJ0EnIGFzc2VtYmxlciBjb25zdHJhaW50OiBFQVggdGhlbiBFRFguDQorZGVmIEdSMzJfQUQgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbaTMyXSwgMzIsIFtFQVgsIEVEWF0+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhHUjhfQUJDRF9MIHN1Yl84Yml0KSwNCisgICAgICAgICAgICAgICAgICAgICAgIChHUjhfQUJDRF9IIHN1Yl84Yml0X2hpKSwNCisgICAgICAgICAgICAgICAgICAgICAgIChHUjE2X0FCQ0Qgc3ViXzE2Yml0KV07DQorfQ0KKw0KKy8vIFNjYWxhciBTU0UyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4NCitkZWYgRlIzMiA6IFJlZ2lzdGVyQ2xhc3M8Ilg4NiIsIFtmMzJdLCAzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgW1hNTTAsIFhNTTEsIFhNTTIsIFhNTTMsIFhNTTQsIFhNTTUsIFhNTTYsIFhNTTcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBYTU04LCBYTU05LCBYTU0xMCwgWE1NMTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBYTU0xMiwgWE1NMTMsIFhNTTE0LCBYTU0xNV0+IHsNCisgIGxldCBNZXRob2RQcm90b3MgPSBbew0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgIH1dOw0KKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7DQorICAgIEZSMzJDbGFzczo6aXRlcmF0b3INCisgICAgRlIzMkNsYXNzOjphbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7DQorICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0gPSBNRi5nZXRUYXJnZXQoKTsNCisgICAgICBjb25zdCBYODZTdWJ0YXJnZXQgJlN1YnRhcmdldCA9IFRNLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCk7DQorICAgICAgaWYgKCFTdWJ0YXJnZXQuaXM2NEJpdCgpKQ0KKyAgICAgICAgcmV0dXJuIGVuZCgpLTg7IC8vIE9ubHkgWE1NMCB0byBYTU03IGFyZSBhdmFpbGFibGUgaW4gMzItYml0IG1vZGUuDQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIGVuZCgpOw0KKyAgICB9DQorICB9XTsNCit9DQorDQorZGVmIEZSNjQgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbZjY0XSwgNjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFtYTU0wLCBYTU0xLCBYTU0yLCBYTU0zLCBYTU00LCBYTU01LCBYTU02LCBYTU03LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWE1NOCwgWE1NOSwgWE1NMTAsIFhNTTExLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWE1NMTIsIFhNTTEzLCBYTU0xNCwgWE1NMTVdPiB7DQorICBsZXQgTWV0aG9kUHJvdG9zID0gW3sNCisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7DQorICB9XTsNCisgIGxldCBNZXRob2RCb2RpZXMgPSBbew0KKyAgICBGUjY0Q2xhc3M6Oml0ZXJhdG9yDQorICAgIEZSNjRDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgWDg2U3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOw0KKyAgICAgIGlmICghU3VidGFyZ2V0LmlzNjRCaXQoKSkNCisgICAgICAgIHJldHVybiBlbmQoKS04OyAvLyBPbmx5IFhNTTAgdG8gWE1NNyBhcmUgYXZhaWxhYmxlIGluIDMyLWJpdCBtb2RlLg0KKyAgICAgIGVsc2UNCisgICAgICAgIHJldHVybiBlbmQoKTsNCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KKw0KKy8vIEZJWE1FOiBUaGlzIHNldHMgdXAgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZpbGVzIGFzIHRob3VnaCB0aGV5IGFyZSBmNjQNCisvLyB2YWx1ZXMsIHRob3VnaCB0aGV5IHJlYWxseSBhcmUgZjgwIHZhbHVlcy4gIFRoaXMgd2lsbCBjYXVzZSB1cyB0byBzcGlsbA0KKy8vIHZhbHVlcyBhcyA2NC1iaXQgcXVhbnRpdGllcyBpbnN0ZWFkIG9mIDgwLWJpdCBxdWFudGl0aWVzLCB3aGljaCBpcyBtdWNoIG11Y2gNCisvLyBmYXN0ZXIgb24gY29tbW9uIGhhcmR3YXJlLiAgSW4gcmVhbGl0eSwgdGhpcyBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhDQorLy8gY29tbWFuZCBsaW5lIG9wdGlvbiBvciBzb21ldGhpbmcuDQorDQorZGVmIFJGUDMyIDogUmVnaXN0ZXJDbGFzczwiWDg2IixbZjMyXSwgMzIsIFtGUDAsIEZQMSwgRlAyLCBGUDMsIEZQNCwgRlA1LCBGUDZdPjsNCitkZWYgUkZQNjQgOiBSZWdpc3RlckNsYXNzPCJYODYiLFtmNjRdLCAzMiwgW0ZQMCwgRlAxLCBGUDIsIEZQMywgRlA0LCBGUDUsIEZQNl0+Ow0KK2RlZiBSRlA4MCA6IFJlZ2lzdGVyQ2xhc3M8Ilg4NiIsW2Y4MF0sIDMyLCBbRlAwLCBGUDEsIEZQMiwgRlAzLCBGUDQsIEZQNSwgRlA2XT47DQorDQorLy8gRmxvYXRpbmcgcG9pbnQgc3RhY2sgcmVnaXN0ZXJzICh0aGVzZSBhcmUgbm90IGFsbG9jYXRhYmxlIGJ5IHRoZQ0KKy8vIHJlZ2lzdGVyIGFsbG9jYXRvciAtIHRoZSBmbG9hdGluZyBwb2ludCBzdGFja2lmaWVyIGlzIHJlc3BvbnNpYmxlDQorLy8gZm9yIHRyYW5zZm9ybWluZyBGUG4gYWxsb2NhdGlvbnMgdG8gU1RuIHJlZ2lzdGVycykNCitkZWYgUlNUIDogUmVnaXN0ZXJDbGFzczwiWDg2IiwgW2Y4MCwgZjY0LCBmMzJdLCAzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICBbU1QwLCBTVDEsIFNUMiwgU1QzLCBTVDQsIFNUNSwgU1Q2LCBTVDddPiB7DQorICAgIGxldCBNZXRob2RQcm90b3MgPSBbew0KKyAgICBpdGVyYXRvciBhbGxvY2F0aW9uX29yZGVyX2VuZChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsNCisgIH1dOw0KKyAgbGV0IE1ldGhvZEJvZGllcyA9IFt7DQorICAgIFJTVENsYXNzOjppdGVyYXRvcg0KKyAgICBSU1RDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIHJldHVybiBiZWdpbigpOw0KKyAgICB9DQorICB9XTsNCit9DQorDQorLy8gR2VuZXJpYyB2ZWN0b3IgcmVnaXN0ZXJzOiBWUjY0IGFuZCBWUjEyOC4NCitkZWYgVlI2NCAgOiBSZWdpc3RlckNsYXNzPCJYODYiLCBbdjhpOCwgdjRpMTYsIHYyaTMyLCB2MWk2NF0sIDY0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW01NMCwgTU0xLCBNTTIsIE1NMywgTU00LCBNTTUsIE1NNiwgTU03XT47DQorZGVmIFZSMTI4IDogUmVnaXN0ZXJDbGFzczwiWDg2IiwgW3YxNmk4LCB2OGkxNiwgdjRpMzIsIHYyaTY0LCB2NGYzMiwgdjJmNjRdLDEyOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtYTU0wLCBYTU0xLCBYTU0yLCBYTU0zLCBYTU00LCBYTU01LCBYTU02LCBYTU03LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTTgsIFhNTTksIFhNTTEwLCBYTU0xMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTU0xMiwgWE1NMTMsIFhNTTE0LCBYTU0xNV0+IHsNCisgIGxldCBTdWJSZWdDbGFzc2VzID0gWyhGUjMyIHN1Yl9zcyksIChGUjY0IHN1Yl9zZCldOw0KKw0KKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgfV07DQorICBsZXQgTWV0aG9kQm9kaWVzID0gW3sNCisgICAgVlIxMjhDbGFzczo6aXRlcmF0b3INCisgICAgVlIxMjhDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgWDg2U3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOw0KKyAgICAgIGlmICghU3VidGFyZ2V0LmlzNjRCaXQoKSkNCisgICAgICAgIHJldHVybiBlbmQoKS04OyAvLyBPbmx5IFhNTTAgdG8gWE1NNyBhcmUgYXZhaWxhYmxlIGluIDMyLWJpdCBtb2RlLg0KKyAgICAgIGVsc2UNCisgICAgICAgIHJldHVybiBlbmQoKTsNCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KK2RlZiBWUjI1NiA6IFJlZ2lzdGVyQ2xhc3M8Ilg4NiIsIFt2MzJpOCwgdjhpMzIsIHY0aTY0LCB2OGYzMiwgdjRmNjRdLCAyNTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBbWU1NMCwgWU1NMSwgWU1NMiwgWU1NMywgWU1NNCwgWU1NNSwgWU1NNiwgWU1NNywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBZTU04LCBZTU05LCBZTU0xMCwgWU1NMTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWU1NMTIsIFlNTTEzLCBZTU0xNCwgWU1NMTVdPiB7DQorICBsZXQgU3ViUmVnQ2xhc3NlcyA9IFsoRlIzMiBzdWJfc3MpLCAoRlI2NCBzdWJfc2QpLCAoVlIxMjggc3ViX3htbSldOw0KKw0KKyAgbGV0IE1ldGhvZFByb3RvcyA9IFt7DQorICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0Ow0KKyAgfV07DQorICBsZXQgTWV0aG9kQm9kaWVzID0gW3sNCisgICAgVlIyNTZDbGFzczo6aXRlcmF0b3INCisgICAgVlIyNTZDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Qgew0KKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7DQorICAgICAgY29uc3QgWDg2U3VidGFyZ2V0ICZTdWJ0YXJnZXQgPSBUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpOw0KKyAgICAgIGlmICghU3VidGFyZ2V0LmlzNjRCaXQoKSkNCisgICAgICAgIHJldHVybiBlbmQoKS04OyAvLyBPbmx5IFlNTTAgdG8gWU1NNyBhcmUgYXZhaWxhYmxlIGluIDMyLWJpdCBtb2RlLg0KKyAgICAgIGVsc2UNCisgICAgICAgIHJldHVybiBlbmQoKTsNCisgICAgfQ0KKyAgfV07DQorfQ0KKw0KKy8vIFN0YXR1cyBmbGFncyByZWdpc3RlcnMuDQorZGVmIENDUiA6IFJlZ2lzdGVyQ2xhc3M8Ilg4NiIsIFtpMzJdLCAzMiwgW0VGTEFHU10+IHsNCisgIGxldCBDb3B5Q29zdCA9IC0xOyAgLy8gRG9uJ3QgYWxsb3cgY29weWluZyBvZiBzdGF0dXMgcmVnaXN0ZXJzLg0KK30NCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZSZWxvY2F0aW9ucy5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2UmVsb2NhdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTA5NjJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2UmVsb2NhdGlvbnMuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0gWDg2UmVsb2NhdGlvbnMuaCAtIFg4NiBDb2RlIFJlbG9jYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBYODYgdGFyZ2V0LXNwZWNpZmljIHJlbG9jYXRpb24gdHlwZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBYODZSRUxPQ0FUSU9OU19ICisjZGVmaW5lIFg4NlJFTE9DQVRJT05TX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVsb2NhdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIG5hbWVzcGFjZSBYODYgeworICAgIC8vLyBSZWxvY2F0aW9uVHlwZSAtIEFuIGVudW0gZm9yIHRoZSB4ODYgcmVsb2NhdGlvbiBjb2Rlcy4gTm90ZSB0aGF0CisgICAgLy8vIHRoZSB0ZXJtaW5vbG9neSBoZXJlIGRvZXNuJ3QgZm9sbG93IHg4NiBjb252ZW50aW9uIC0gd29yZCBtZWFucworICAgIC8vLyAzMi1iaXQgYW5kIGR3b3JkIG1lYW5zIDY0LWJpdC4gVGhlIHJlbG9jYXRpb25zIHdpbGwgYmUgdHJlYXRlZAorICAgIC8vLyBieSBKSVQgb3IgT2JqZWN0Q29kZSBlbWl0dGVycywgdGhpcyBpcyB0cmFuc3BhcmVudCB0byB0aGUgeDg2IGNvZGUgCisgICAgLy8vIGVtaXR0ZXIgYnV0IEpJVCBhbmQgT2JqZWN0Q29kZSB3aWxsIHRyZWF0IHRoZW0gZGlmZmVyZW50bHkKKyAgICBlbnVtIFJlbG9jYXRpb25UeXBlIHsKKyAgICAgIC8vLyByZWxvY19wY3JlbF93b3JkIC0gUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiwgYWRkIHRoZSByZWxvY2F0ZWQgdmFsdWUgdG8KKyAgICAgIC8vLyB0aGUgdmFsdWUgYWxyZWFkeSBpbiBtZW1vcnksIGFmdGVyIHdlIGFkanVzdCBpdCBmb3Igd2hlcmUgdGhlIFBDIGlzLgorICAgICAgcmVsb2NfcGNyZWxfd29yZCA9IDAsCisKKyAgICAgIC8vLyByZWxvY19waWNyZWxfd29yZCAtIFBJQyBiYXNlIHJlbGF0aXZlIHJlbG9jYXRpb24sIGFkZCB0aGUgcmVsb2NhdGVkCisgICAgICAvLy8gdmFsdWUgdG8gdGhlIHZhbHVlIGFscmVhZHkgaW4gbWVtb3J5LCBhZnRlciB3ZSBhZGp1c3QgaXQgZm9yIHdoZXJlIHRoZQorICAgICAgLy8vIFBJQyBiYXNlIGlzLgorICAgICAgcmVsb2NfcGljcmVsX3dvcmQgPSAxLAorCisgICAgICAvLy8gcmVsb2NfYWJzb2x1dGVfd29yZCAtIGFic29sdXRlIHJlbG9jYXRpb24sIGp1c3QgYWRkIHRoZSByZWxvY2F0ZWQKKyAgICAgIC8vLyB2YWx1ZSB0byB0aGUgdmFsdWUgYWxyZWFkeSBpbiBtZW1vcnkuCisgICAgICByZWxvY19hYnNvbHV0ZV93b3JkID0gMiwKKworICAgICAgLy8vIHJlbG9jX2Fic29sdXRlX3dvcmRfc2V4dCAtIGFic29sdXRlIHJlbG9jYXRpb24sIGp1c3QgYWRkIHRoZSByZWxvY2F0ZWQKKyAgICAgIC8vLyB2YWx1ZSB0byB0aGUgdmFsdWUgYWxyZWFkeSBpbiBtZW1vcnkuIEluIG9iamVjdCBmaWxlcywgaXQgcmVwcmVzZW50cyBhCisgICAgICAvLy8gdmFsdWUgd2hpY2ggbXVzdCBiZSBzaWduLWV4dGVuZGVkIHdoZW4gcmVzb2x2aW5nIHRoZSByZWxvY2F0aW9uLgorICAgICAgcmVsb2NfYWJzb2x1dGVfd29yZF9zZXh0ID0gMywKKworICAgICAgLy8vIHJlbG9jX2Fic29sdXRlX2R3b3JkIC0gYWJzb2x1dGUgcmVsb2NhdGlvbiwganVzdCBhZGQgdGhlIHJlbG9jYXRlZAorICAgICAgLy8vIHZhbHVlIHRvIHRoZSB2YWx1ZSBhbHJlYWR5IGluIG1lbW9yeS4KKyAgICAgIHJlbG9jX2Fic29sdXRlX2R3b3JkID0gNAorICAgIH07CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZTZWxlY3Rpb25EQUdJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlNlbGVjdGlvbkRBR0luZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTdhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZTZWxlY3Rpb25EQUdJbmZvLmNwcApAQCAtMCwwICsxLDI0MyBAQAorLy89PT0tLSBYODZTZWxlY3Rpb25EQUdJbmZvLmNwcCAtIFg4NiBTZWxlY3Rpb25EQUcgSW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgWDg2U2VsZWN0aW9uREFHSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgIng4Ni1zZWxlY3Rpb25kYWctaW5mbyIKKyNpbmNsdWRlICJYODZUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworWDg2U2VsZWN0aW9uREFHSW5mbzo6WDg2U2VsZWN0aW9uREFHSW5mbyhjb25zdCBYODZUYXJnZXRNYWNoaW5lICZUTSkgOgorICBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvKFRNKSwKKyAgU3VidGFyZ2V0KCZUTS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpKSwKKyAgVExJKCpUTS5nZXRUYXJnZXRMb3dlcmluZygpKSB7Cit9CisKK1g4NlNlbGVjdGlvbkRBR0luZm86On5YODZTZWxlY3Rpb25EQUdJbmZvKCkgeworfQorCitTRFZhbHVlCitYODZTZWxlY3Rpb25EQUdJbmZvOjpFbWl0VGFyZ2V0Q29kZUZvck1lbXNldChTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBEc3QsIFNEVmFsdWUgU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTaXplLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpEc3RTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERzdFNWT2ZmKSBjb25zdCB7CisgIENvbnN0YW50U0ROb2RlICpDb25zdGFudFNpemUgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oU2l6ZSk7CisKKyAgLy8gSWYgbm90IERXT1JEIGFsaWduZWQgb3Igc2l6ZSBpcyBtb3JlIHRoYW4gdGhlIHRocmVzaG9sZCwgY2FsbCB0aGUgbGlicmFyeS4KKyAgLy8gVGhlIGxpYmMgdmVyc2lvbiBpcyBsaWtlbHkgdG8gYmUgZmFzdGVyIGZvciB0aGVzZSBjYXNlcy4gSXQgY2FuIHVzZSB0aGUKKyAgLy8gYWRkcmVzcyB2YWx1ZSBhbmQgcnVuIHRpbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIENQVS4KKyAgaWYgKChBbGlnbiAmIDMpICE9IDAgfHwKKyAgICAgICFDb25zdGFudFNpemUgfHwKKyAgICAgIENvbnN0YW50U2l6ZS0+Z2V0WkV4dFZhbHVlKCkgPgorICAgICAgICBTdWJ0YXJnZXQtPmdldE1heElubGluZVNpemVUaHJlc2hvbGQoKSkgeworICAgIFNEVmFsdWUgSW5GbGFnKDAsIDApOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc3BlY2lhbGl6ZWQgZW50cnktcG9pbnQgZm9yIG1lbW9yeSB6ZXJvaW5nLgorICAgIENvbnN0YW50U0ROb2RlICpWID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KFNyYyk7CisKKyAgICBpZiAoY29uc3QgY2hhciAqYnplcm9FbnRyeSA9ICBWICYmCisgICAgICAgIFYtPmlzTnVsbFZhbHVlKCkgPyBTdWJ0YXJnZXQtPmdldEJaZXJvRW50cnkoKSA6IDApIHsKKyAgICAgIEVWVCBJbnRQdHIgPSBUTEkuZ2V0UG9pbnRlclR5KCk7CisgICAgICBjb25zdCBUeXBlICpJbnRQdHJUeSA9IGdldFRhcmdldERhdGEoKS0+Z2V0SW50UHRyVHlwZSgqREFHLmdldENvbnRleHQoKSk7CisgICAgICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdFR5IEFyZ3M7CisgICAgICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdEVudHJ5IEVudHJ5OworICAgICAgRW50cnkuTm9kZSA9IERzdDsKKyAgICAgIEVudHJ5LlR5ID0gSW50UHRyVHk7CisgICAgICBBcmdzLnB1c2hfYmFjayhFbnRyeSk7CisgICAgICBFbnRyeS5Ob2RlID0gU2l6ZTsKKyAgICAgIEFyZ3MucHVzaF9iYWNrKEVudHJ5KTsKKyAgICAgIHN0ZDo6cGFpcjxTRFZhbHVlLFNEVmFsdWU+IENhbGxSZXN1bHQgPQorICAgICAgICBUTEkuTG93ZXJDYWxsVG8oQ2hhaW4sIFR5cGU6OmdldFZvaWRUeSgqREFHLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIENhbGxpbmdDb252OjpDLCBmYWxzZSwgLyppc1JldHVyblZhbHVlVXNlZD0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldEV4dGVybmFsU3ltYm9sKGJ6ZXJvRW50cnksIEludFB0ciksIEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBEQUcsIGRsKTsKKyAgICAgIHJldHVybiBDYWxsUmVzdWx0LnNlY29uZDsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UgaGF2ZSB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgY2FsbCBtZW1zZXQuCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorCisgIHVpbnQ2NF90IFNpemVWYWwgPSBDb25zdGFudFNpemUtPmdldFpFeHRWYWx1ZSgpOworICBTRFZhbHVlIEluRmxhZygwLCAwKTsKKyAgRVZUIEFWVDsKKyAgU0RWYWx1ZSBDb3VudDsKKyAgQ29uc3RhbnRTRE5vZGUgKlZhbEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oU3JjKTsKKyAgdW5zaWduZWQgQnl0ZXNMZWZ0ID0gMDsKKyAgYm9vbCBUd29SZXBTdG9zID0gZmFsc2U7CisgIGlmIChWYWxDKSB7CisgICAgdW5zaWduZWQgVmFsUmVnOworICAgIHVpbnQ2NF90IFZhbCA9IFZhbEMtPmdldFpFeHRWYWx1ZSgpICYgMjU1OworCisgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGEgY29uc3RhbnQsIHRoZW4gd2UgY2FuIHBvdGVudGlhbGx5IHVzZSBsYXJnZXIgc2V0cy4KKyAgICBzd2l0Y2ggKEFsaWduICYgMykgeworICAgIGNhc2UgMjogICAvLyBXT1JEIGFsaWduZWQKKyAgICAgIEFWVCA9IE1WVDo6aTE2OworICAgICAgVmFsUmVnID0gWDg2OjpBWDsKKyAgICAgIFZhbCA9IChWYWwgPDwgOCkgfCBWYWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIDA6ICAvLyBEV09SRCBhbGlnbmVkCisgICAgICBBVlQgPSBNVlQ6OmkzMjsKKyAgICAgIFZhbFJlZyA9IFg4Njo6RUFYOworICAgICAgVmFsID0gKFZhbCA8PCA4KSAgfCBWYWw7CisgICAgICBWYWwgPSAoVmFsIDw8IDE2KSB8IFZhbDsKKyAgICAgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSAmJiAoKEFsaWduICYgMHg3KSA9PSAwKSkgeyAgLy8gUVdPUkQgYWxpZ25lZAorICAgICAgICBBVlQgPSBNVlQ6Omk2NDsKKyAgICAgICAgVmFsUmVnID0gWDg2OjpSQVg7CisgICAgICAgIFZhbCA9IChWYWwgPDwgMzIpIHwgVmFsOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogIC8vIEJ5dGUgYWxpZ25lZAorICAgICAgQVZUID0gTVZUOjppODsKKyAgICAgIFZhbFJlZyA9IFg4Njo6QUw7CisgICAgICBDb3VudCA9IERBRy5nZXRJbnRQdHJDb25zdGFudChTaXplVmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChBVlQuYml0c0dUKE1WVDo6aTgpKSB7CisgICAgICB1bnNpZ25lZCBVQnl0ZXMgPSBBVlQuZ2V0U2l6ZUluQml0cygpIC8gODsKKyAgICAgIENvdW50ID0gREFHLmdldEludFB0ckNvbnN0YW50KFNpemVWYWwgLyBVQnl0ZXMpOworICAgICAgQnl0ZXNMZWZ0ID0gU2l6ZVZhbCAlIFVCeXRlczsKKyAgICB9CisKKyAgICBDaGFpbiAgPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgVmFsUmVnLCBEQUcuZ2V0Q29uc3RhbnQoVmFsLCBBVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5GbGFnKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfSBlbHNlIHsKKyAgICBBVlQgPSBNVlQ6Omk4OworICAgIENvdW50ICA9IERBRy5nZXRJbnRQdHJDb25zdGFudChTaXplVmFsKTsKKyAgICBDaGFpbiAgPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgWDg2OjpBTCwgU3JjLCBJbkZsYWcpOworICAgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworICB9CisKKyAgQ2hhaW4gID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFN1YnRhcmdldC0+aXM2NEJpdCgpID8gWDg2OjpSQ1ggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkVDWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCwgSW5GbGFnKTsKKyAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIENoYWluICA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBTdWJ0YXJnZXQtPmlzNjRCaXQoKSA/IFg4Njo6UkRJIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpFREksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0LCBJbkZsYWcpOworICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKworICBTRFZUTGlzdCBUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBEQUcuZ2V0VmFsdWVUeXBlKEFWVCksIEluRmxhZyB9OworICBDaGFpbiA9IERBRy5nZXROb2RlKFg4NklTRDo6UkVQX1NUT1MsIGRsLCBUeXMsIE9wcywgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7CisKKyAgaWYgKFR3b1JlcFN0b3MpIHsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgICBDb3VudCAgPSBTaXplOworICAgIEVWVCBDVlQgPSBDb3VudC5nZXRWYWx1ZVR5cGUoKTsKKyAgICBTRFZhbHVlIExlZnQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIENWVCwgQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KChBVlQgPT0gTVZUOjppNjQpID8gNyA6IDMsIENWVCkpOworICAgIENoYWluICA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCAoQ1ZUID09IE1WVDo6aTY0KSA/IFg4Njo6UkNYIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkVDWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZnQsIEluRmxhZyk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgICAgVHlzID0gREFHLmdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkZsYWcpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBEQUcuZ2V0VmFsdWVUeXBlKE1WVDo6aTgpLCBJbkZsYWcgfTsKKyAgICBDaGFpbiA9IERBRy5nZXROb2RlKFg4NklTRDo6UkVQX1NUT1MsIGRsLCBUeXMsIE9wcywgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7CisgIH0gZWxzZSBpZiAoQnl0ZXNMZWZ0KSB7CisgICAgLy8gSGFuZGxlIHRoZSBsYXN0IDEgLSA3IGJ5dGVzLgorICAgIHVuc2lnbmVkIE9mZnNldCA9IFNpemVWYWwgLSBCeXRlc0xlZnQ7CisgICAgRVZUIEFkZHJWVCA9IERzdC5nZXRWYWx1ZVR5cGUoKTsKKyAgICBFVlQgU2l6ZVZUID0gU2l6ZS5nZXRWYWx1ZVR5cGUoKTsKKworICAgIENoYWluID0gREFHLmdldE1lbXNldChDaGFpbiwgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgQWRkclZULCBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChPZmZzZXQsIEFkZHJWVCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChCeXRlc0xlZnQsIFNpemVWVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWduLCBpc1ZvbGF0aWxlLCBEc3RTViwgRHN0U1ZPZmYgKyBPZmZzZXQpOworICB9CisKKyAgLy8gVE9ETzogVXNlIGEgVG9rZW5mYWN0b3IsIGFzIGluIG1lbWNweSwgaW5zdGVhZCBvZiBhIHNpbmdsZSBjaGFpbi4KKyAgcmV0dXJuIENoYWluOworfQorCitTRFZhbHVlCitYODZTZWxlY3Rpb25EQUdJbmZvOjpFbWl0VGFyZ2V0Q29kZUZvck1lbWNweShTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBEc3QsIFNEVmFsdWUgU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlLCBib29sIEFsd2F5c0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqRHN0U1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRHN0U1ZPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNyY1NWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNyY1NWT2ZmKSBjb25zdCB7CisgIC8vIFRoaXMgcmVxdWlyZXMgdGhlIGNvcHkgc2l6ZSB0byBiZSBhIGNvbnN0YW50LCBwcmVmZXJyYWJseQorICAvLyB3aXRoaW4gYSBzdWJ0YXJnZXQtc3BlY2lmaWMgbGltaXQuCisgIENvbnN0YW50U0ROb2RlICpDb25zdGFudFNpemUgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oU2l6ZSk7CisgIGlmICghQ29uc3RhbnRTaXplKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIHVpbnQ2NF90IFNpemVWYWwgPSBDb25zdGFudFNpemUtPmdldFpFeHRWYWx1ZSgpOworICBpZiAoIUFsd2F5c0lubGluZSAmJiBTaXplVmFsID4gU3VidGFyZ2V0LT5nZXRNYXhJbmxpbmVTaXplVGhyZXNob2xkKCkpCisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKworICAvLy8gSWYgbm90IERXT1JEIGFsaWduZWQsIGNhbGwgdGhlIGxpYnJhcnkuCisgIGlmICgoQWxpZ24gJiAzKSAhPSAwKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisKKyAgLy8gRFdPUkQgYWxpZ25lZAorICBFVlQgQVZUID0gTVZUOjppMzI7CisgIGlmIChTdWJ0YXJnZXQtPmlzNjRCaXQoKSAmJiAoKEFsaWduICYgMHg3KSA9PSAwKSkgIC8vIFFXT1JEIGFsaWduZWQKKyAgICBBVlQgPSBNVlQ6Omk2NDsKKworICB1bnNpZ25lZCBVQnl0ZXMgPSBBVlQuZ2V0U2l6ZUluQml0cygpIC8gODsKKyAgdW5zaWduZWQgQ291bnRWYWwgPSBTaXplVmFsIC8gVUJ5dGVzOworICBTRFZhbHVlIENvdW50ID0gREFHLmdldEludFB0ckNvbnN0YW50KENvdW50VmFsKTsKKyAgdW5zaWduZWQgQnl0ZXNMZWZ0ID0gU2l6ZVZhbCAlIFVCeXRlczsKKworICBTRFZhbHVlIEluRmxhZygwLCAwKTsKKyAgQ2hhaW4gID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFN1YnRhcmdldC0+aXM2NEJpdCgpID8gWDg2OjpSQ1ggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkVDWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCwgSW5GbGFnKTsKKyAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMSk7CisgIENoYWluICA9IERBRy5nZXRDb3B5VG9SZWcoQ2hhaW4sIGRsLCBTdWJ0YXJnZXQtPmlzNjRCaXQoKSA/IFg4Njo6UkRJIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDg2OjpFREksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0LCBJbkZsYWcpOworICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgQ2hhaW4gID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFN1YnRhcmdldC0+aXM2NEJpdCgpID8gWDg2OjpSU0kgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYODY6OkVTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcmMsIEluRmxhZyk7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIFNEVlRMaXN0IFR5cyA9IERBRy5nZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpGbGFnKTsKKyAgU0RWYWx1ZSBPcHNbXSA9IHsgQ2hhaW4sIERBRy5nZXRWYWx1ZVR5cGUoQVZUKSwgSW5GbGFnIH07CisgIFNEVmFsdWUgUmVwTW92cyA9IERBRy5nZXROb2RlKFg4NklTRDo6UkVQX01PVlMsIGRsLCBUeXMsIE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfbGVuZ3Rob2YoT3BzKSk7CisKKyAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gUmVzdWx0czsKKyAgUmVzdWx0cy5wdXNoX2JhY2soUmVwTW92cyk7CisgIGlmIChCeXRlc0xlZnQpIHsKKyAgICAvLyBIYW5kbGUgdGhlIGxhc3QgMSAtIDcgYnl0ZXMuCisgICAgdW5zaWduZWQgT2Zmc2V0ID0gU2l6ZVZhbCAtIEJ5dGVzTGVmdDsKKyAgICBFVlQgRHN0VlQgPSBEc3QuZ2V0VmFsdWVUeXBlKCk7CisgICAgRVZUIFNyY1ZUID0gU3JjLmdldFZhbHVlVHlwZSgpOworICAgIEVWVCBTaXplVlQgPSBTaXplLmdldFZhbHVlVHlwZSgpOworICAgIFJlc3VsdHMucHVzaF9iYWNrKERBRy5nZXRNZW1jcHkoQ2hhaW4sIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBEc3RWVCwgRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KE9mZnNldCwgRHN0VlQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgU3JjVlQsIFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChPZmZzZXQsIFNyY1ZUKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoQnl0ZXNMZWZ0LCBTaXplVlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ24sIGlzVm9sYXRpbGUsIEFsd2F5c0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERzdFNWLCBEc3RTVk9mZiArIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY1NWLCBTcmNTVk9mZiArIE9mZnNldCkpOworICB9CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6VG9rZW5GYWN0b3IsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgJlJlc3VsdHNbMF0sIFJlc3VsdHMuc2l6ZSgpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlNlbGVjdGlvbkRBR0luZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlNlbGVjdGlvbkRBR0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjMwZjMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2U2VsZWN0aW9uREFHSW5mby5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09LS0gWDg2U2VsZWN0aW9uREFHSW5mby5oIC0gWDg2IFNlbGVjdGlvbkRBRyBJbmZvIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFg4NiBzdWJjbGFzcyBmb3IgVGFyZ2V0U2VsZWN0aW9uREFHSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFg4NlNFTEVDVElPTkRBR0lORk9fSAorI2RlZmluZSBYODZTRUxFQ1RJT05EQUdJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBR0luZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBYODZUYXJnZXRMb3dlcmluZzsKK2NsYXNzIFg4NlRhcmdldE1hY2hpbmU7CitjbGFzcyBYODZTdWJ0YXJnZXQ7CisKK2NsYXNzIFg4NlNlbGVjdGlvbkRBR0luZm8gOiBwdWJsaWMgVGFyZ2V0U2VsZWN0aW9uREFHSW5mbyB7CisgIC8vLyBTdWJ0YXJnZXQgLSBLZWVwIGEgcG9pbnRlciB0byB0aGUgWDg2U3VidGFyZ2V0IGFyb3VuZCBzbyB0aGF0IHdlIGNhbgorICAvLy8gbWFrZSB0aGUgcmlnaHQgZGVjaXNpb24gd2hlbiBnZW5lcmF0aW5nIGNvZGUgZm9yIGRpZmZlcmVudCB0YXJnZXRzLgorICBjb25zdCBYODZTdWJ0YXJnZXQgKlN1YnRhcmdldDsKKworICBjb25zdCBYODZUYXJnZXRMb3dlcmluZyAmVExJOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFg4NlNlbGVjdGlvbkRBR0luZm8oY29uc3QgWDg2VGFyZ2V0TWFjaGluZSAmVE0pOworICB+WDg2U2VsZWN0aW9uREFHSW5mbygpOworCisgIHZpcnR1YWwKKyAgU0RWYWx1ZSBFbWl0VGFyZ2V0Q29kZUZvck1lbXNldChTZWxlY3Rpb25EQUcgJkRBRywgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIERzdCwgU0RWYWx1ZSBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTaXplLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkRzdFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERzdFNWT2ZmKSBjb25zdDsKKworICB2aXJ0dWFsCisgIFNEVmFsdWUgRW1pdFRhcmdldENvZGVGb3JNZW1jcHkoU2VsZWN0aW9uREFHICZEQUcsIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBEc3QsIFNEVmFsdWUgU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlLCBib29sIEFsd2F5c0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqRHN0U1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRHN0U1ZPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlNyY1NWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNyY1NWT2ZmKSBjb25zdDsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZTdWJ0YXJnZXQuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2U3VidGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQ0ZmUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2U3VidGFyZ2V0LmNwcApAQCAtMCwwICsxLDM2OSBAQAorLy89PT0tLSBYODZTdWJ0YXJnZXQuY3BwIC0gWDg2IFN1YnRhcmdldCBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgWDg2IHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInN1YnRhcmdldCIKKyNpbmNsdWRlICJYODZTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJYODZJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJYODZHZW5TdWJ0YXJnZXQuaW5jIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9Ib3N0LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2luY2x1ZGUgPGludHJpbi5oPgorI2VuZGlmCisKKy8vLyBDbGFzc2lmeUJsb2NrQWRkcmVzc1JlZmVyZW5jZSAtIENsYXNzaWZ5IGEgYmxvY2thZGRyZXNzIHJlZmVyZW5jZSBmb3IgdGhlCisvLy8gY3VycmVudCBzdWJ0YXJnZXQgYWNjb3JkaW5nIHRvIGhvdyB3ZSBzaG91bGQgcmVmZXJlbmNlIGl0IGluIGEgbm9uLXBjcmVsCisvLy8gY29udGV4dC4KK3Vuc2lnbmVkIGNoYXIgWDg2U3VidGFyZ2V0OjoKK0NsYXNzaWZ5QmxvY2tBZGRyZXNzUmVmZXJlbmNlKCkgY29uc3QgeworICBpZiAoaXNQSUNTdHlsZUdPVCgpKSAgICAvLyAzMi1iaXQgRUxGIHRhcmdldHMuCisgICAgcmV0dXJuIFg4NklJOjpNT19HT1RPRkY7CisgIAorICBpZiAoaXNQSUNTdHlsZVN0dWJQSUMoKSkgICAvLyBEYXJ3aW4vMzIgaW4gUElDIG1vZGUuCisgICAgcmV0dXJuIFg4NklJOjpNT19QSUNfQkFTRV9PRkZTRVQ7CisgIAorICAvLyBEaXJlY3Qgc3RhdGljIHJlZmVyZW5jZSB0byBsYWJlbC4KKyAgcmV0dXJuIFg4NklJOjpNT19OT19GTEFHOworfQorCisvLy8gQ2xhc3NpZnlHbG9iYWxSZWZlcmVuY2UgLSBDbGFzc2lmeSBhIGdsb2JhbCB2YXJpYWJsZSByZWZlcmVuY2UgZm9yIHRoZQorLy8vIGN1cnJlbnQgc3VidGFyZ2V0IGFjY29yZGluZyB0byBob3cgd2Ugc2hvdWxkIHJlZmVyZW5jZSBpdCBpbiBhIG5vbi1wY3JlbAorLy8vIGNvbnRleHQuCit1bnNpZ25lZCBjaGFyIFg4NlN1YnRhcmdldDo6CitDbGFzc2lmeUdsb2JhbFJlZmVyZW5jZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCB7CisgIC8vIERMTEltcG9ydCBvbmx5IGV4aXN0cyBvbiB3aW5kb3dzLCBpdCBpcyBpbXBsZW1lbnRlZCBhcyBhIGxvYWQgZnJvbSBhCisgIC8vIERMTElNUE9SVCBzdHViLgorICBpZiAoR1YtPmhhc0RMTEltcG9ydExpbmthZ2UoKSkKKyAgICByZXR1cm4gWDg2SUk6Ok1PX0RMTElNUE9SVDsKKworICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5pdGlvbiBvciBhIGRlY2xhcmF0aW9uLgorICAvLyBNYXRlcmlhbGl6YWJsZSBHVnMgKGluIEpJVCBsYXp5IGNvbXBpbGF0aW9uIG1vZGUpIGRvIG5vdCByZXF1aXJlIGFuIGV4dHJhCisgIC8vIGxvYWQgZnJvbSBzdHViLgorICBib29sIGlzRGVjbCA9IEdWLT5oYXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSgpOworICBpZiAoR1YtPmlzRGVjbGFyYXRpb24oKSAmJiAhR1YtPmlzTWF0ZXJpYWxpemFibGUoKSkKKyAgICBpc0RlY2wgPSB0cnVlOworCisgIC8vIFg4Ni02NCBpbiBQSUMgbW9kZS4KKyAgaWYgKGlzUElDU3R5bGVSSVBSZWwoKSkgeworICAgIC8vIExhcmdlIG1vZGVsIG5ldmVyIHVzZXMgc3R1YnMuCisgICAgaWYgKFRNLmdldENvZGVNb2RlbCgpID09IENvZGVNb2RlbDo6TGFyZ2UpCisgICAgICByZXR1cm4gWDg2SUk6Ok1PX05PX0ZMQUc7CisgICAgICAKKyAgICBpZiAoaXNUYXJnZXREYXJ3aW4oKSkgeworICAgICAgLy8gSWYgc3ltYm9sIHZpc2liaWxpdHkgaXMgaGlkZGVuLCB0aGUgZXh0cmEgbG9hZCBpcyBub3QgbmVlZGVkIGlmCisgICAgICAvLyB0YXJnZXQgaXMgeDg2LTY0IG9yIHRoZSBzeW1ib2wgaXMgZGVmaW5pdGVseSBkZWZpbmVkIGluIHRoZSBjdXJyZW50CisgICAgICAvLyB0cmFuc2xhdGlvbiB1bml0LgorICAgICAgaWYgKEdWLT5oYXNEZWZhdWx0VmlzaWJpbGl0eSgpICYmCisgICAgICAgICAgKGlzRGVjbCB8fCBHVi0+aXNXZWFrRm9yTGlua2VyKCkpKQorICAgICAgICByZXR1cm4gWDg2SUk6Ok1PX0dPVFBDUkVMOworICAgIH0gZWxzZSB7CisgICAgICAvLyBFeHRyYSBsb2FkIGlzIG5lZWRlZCBmb3IgYWxsIGV4dGVybmFsbHkgdmlzaWJsZS4KKyAgICAgIGlmICghR1YtPmhhc0xvY2FsTGlua2FnZSgpICYmIEdWLT5oYXNEZWZhdWx0VmlzaWJpbGl0eSgpKQorICAgICAgICByZXR1cm4gWDg2SUk6Ok1PX0dPVFBDUkVMOworICAgIH0KKworICAgIHJldHVybiBYODZJSTo6TU9fTk9fRkxBRzsKKyAgfQorICAKKyAgaWYgKGlzUElDU3R5bGVHT1QoKSkgeyAgIC8vIDMyLWJpdCBFTEYgdGFyZ2V0cy4KKyAgICAvLyBFeHRyYSBsb2FkIGlzIG5lZWRlZCBmb3IgYWxsIGV4dGVybmFsbHkgdmlzaWJsZS4KKyAgICBpZiAoR1YtPmhhc0xvY2FsTGlua2FnZSgpIHx8IEdWLT5oYXNIaWRkZW5WaXNpYmlsaXR5KCkpCisgICAgICByZXR1cm4gWDg2SUk6Ok1PX0dPVE9GRjsKKyAgICByZXR1cm4gWDg2SUk6Ok1PX0dPVDsKKyAgfQorICAKKyAgaWYgKGlzUElDU3R5bGVTdHViUElDKCkpIHsgIC8vIERhcndpbi8zMiBpbiBQSUMgbW9kZS4KKyAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIGEgc3R1YiByZWZlcmVuY2UgYW5kL29yIHdoZXRoZXIgdGhlIHJlZmVyZW5jZQorICAgIC8vIGlzIHJlbGF0aXZlIHRvIHRoZSBQSUMgYmFzZSBvciBub3QuCisgICAgCisgICAgLy8gSWYgdGhpcyBpcyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gYSBkZWZpbml0aW9uLCBpdCBpcyBkZWZpbml0ZWx5IG5vdAorICAgIC8vIHRocm91Z2ggYSBzdHViLgorICAgIGlmICghaXNEZWNsICYmICFHVi0+aXNXZWFrRm9yTGlua2VyKCkpCisgICAgICByZXR1cm4gWDg2SUk6Ok1PX1BJQ19CQVNFX09GRlNFVDsKKworICAgIC8vIFVubGVzcyB3ZSBoYXZlIGEgc3ltYm9sIHdpdGggaGlkZGVuIHZpc2liaWxpdHksIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCBhCisgICAgLy8gbm9ybWFsICRub25fbGF6eV9wdHIgc3R1YiBiZWNhdXNlIHRoaXMgc3ltYm9sIG1pZ2h0IGJlIHJlc29sdmVkIGxhdGUuCisgICAgaWYgKCFHVi0+aGFzSGlkZGVuVmlzaWJpbGl0eSgpKSAgLy8gTm9uLWhpZGRlbiAkbm9uX2xhenlfcHRyIHJlZmVyZW5jZS4KKyAgICAgIHJldHVybiBYODZJSTo6TU9fREFSV0lOX05PTkxBWllfUElDX0JBU0U7CisgICAgCisgICAgLy8gSWYgc3ltYm9sIHZpc2liaWxpdHkgaXMgaGlkZGVuLCB3ZSBoYXZlIGEgc3R1YiBmb3IgY29tbW9uIHN5bWJvbAorICAgIC8vIHJlZmVyZW5jZXMgYW5kIGV4dGVybmFsIGRlY2xhcmF0aW9ucy4KKyAgICBpZiAoaXNEZWNsIHx8IEdWLT5oYXNDb21tb25MaW5rYWdlKCkpIHsKKyAgICAgIC8vIEhpZGRlbiAkbm9uX2xhenlfcHRyIHJlZmVyZW5jZS4KKyAgICAgIHJldHVybiBYODZJSTo6TU9fREFSV0lOX0hJRERFTl9OT05MQVpZX1BJQ19CQVNFOworICAgIH0KKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIG5vIHN0dWIuCisgICAgcmV0dXJuIFg4NklJOjpNT19QSUNfQkFTRV9PRkZTRVQ7CisgIH0KKyAgCisgIGlmIChpc1BJQ1N0eWxlU3R1Yk5vRHluYW1pYygpKSB7ICAvLyBEYXJ3aW4vMzIgaW4gLW1keW5hbWljLW5vLXBpYyBtb2RlLgorICAgIC8vIERldGVybWluZSB3aGV0aGVyIHdlIGhhdmUgYSBzdHViIHJlZmVyZW5jZS4KKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGEgc3Ryb25nIHJlZmVyZW5jZSB0byBhIGRlZmluaXRpb24sIGl0IGlzIGRlZmluaXRlbHkgbm90CisgICAgLy8gdGhyb3VnaCBhIHN0dWIuCisgICAgaWYgKCFpc0RlY2wgJiYgIUdWLT5pc1dlYWtGb3JMaW5rZXIoKSkKKyAgICAgIHJldHVybiBYODZJSTo6TU9fTk9fRkxBRzsKKyAgICAKKyAgICAvLyBVbmxlc3Mgd2UgaGF2ZSBhIHN5bWJvbCB3aXRoIGhpZGRlbiB2aXNpYmlsaXR5LCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggYQorICAgIC8vIG5vcm1hbCAkbm9uX2xhenlfcHRyIHN0dWIgYmVjYXVzZSB0aGlzIHN5bWJvbCBtaWdodCBiZSByZXNvbHZlZCBsYXRlLgorICAgIGlmICghR1YtPmhhc0hpZGRlblZpc2liaWxpdHkoKSkgIC8vIE5vbi1oaWRkZW4gJG5vbl9sYXp5X3B0ciByZWZlcmVuY2UuCisgICAgICByZXR1cm4gWDg2SUk6Ok1PX0RBUldJTl9OT05MQVpZOworCisgICAgLy8gT3RoZXJ3aXNlLCBubyBzdHViLgorICAgIHJldHVybiBYODZJSTo6TU9fTk9fRkxBRzsKKyAgfQorICAKKyAgLy8gRGlyZWN0IHN0YXRpYyByZWZlcmVuY2UgdG8gZ2xvYmFsLgorICByZXR1cm4gWDg2SUk6Ok1PX05PX0ZMQUc7Cit9CisKKworLy8vIGdldEJaZXJvRW50cnkgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB3aGljaCBoYXMgYW4KKy8vLyBpbnRlcmZhY2UgbGlrZSB0aGUgbm9uLXN0YW5kYXJkIGJ6ZXJvIGZ1bmN0aW9uLCBpZiBzdWNoIGEgZnVuY3Rpb24gZXhpc3RzIG9uCisvLy8gdGhlIGN1cnJlbnQgc3VidGFyZ2V0IGFuZCBpdCBpcyBjb25zaWRlcmVkIHByZWZlcmVhYmxlIG92ZXIgbWVtc2V0IHdpdGggemVybworLy8vIHBhc3NlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiBPdGhlcndpc2UgaXQgcmV0dXJucyBudWxsLgorY29uc3QgY2hhciAqWDg2U3VidGFyZ2V0OjpnZXRCWmVyb0VudHJ5KCkgY29uc3QgeworICAvLyBEYXJ3aW4gMTAgaGFzIGEgX19iemVybyBlbnRyeSBwb2ludCBmb3IgdGhpcyBwdXJwb3NlLgorICBpZiAoZ2V0RGFyd2luVmVycygpID49IDEwKQorICAgIHJldHVybiAiX19iemVybyI7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBJc0xlZ2FsVG9DYWxsSW1tZWRpYXRlQWRkciAtIFJldHVybiB0cnVlIGlmIHRoZSBzdWJ0YXJnZXQgYWxsb3dzIGNhbGxzCisvLy8gdG8gaW1tZWRpYXRlIGFkZHJlc3MuCitib29sIFg4NlN1YnRhcmdldDo6SXNMZWdhbFRvQ2FsbEltbWVkaWF0ZUFkZHIoY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IHsKKyAgaWYgKElzNjRCaXQpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gVE0uZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlN0YXRpYzsKK30KKworLy8vIGdldFNwZWNpYWxBZGRyZXNzTGF0ZW5jeSAtIEZvciB0YXJnZXRzIHdoZXJlIGl0IGlzIGJlbmVmaWNpYWwgdG8KKy8vLyBiYWNrc2NoZWR1bGUgaW5zdHJ1Y3Rpb25zIHRoYXQgY29tcHV0ZSBhZGRyZXNzZXMsIHJldHVybiBhIHZhbHVlCisvLy8gaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHNjaGVkdWxpbmcgY3ljbGVzIG9mIGJhY2tzY2hlZHVsaW5nIHRoYXQKKy8vLyBzaG91bGQgYmUgYXR0ZW1wdGVkLgordW5zaWduZWQgWDg2U3VidGFyZ2V0OjpnZXRTcGVjaWFsQWRkcmVzc0xhdGVuY3koKSBjb25zdCB7CisgIC8vIEZvciB4ODYgb3V0LW9mLW9yZGVyIHRhcmdldHMsIGJhY2stc2NoZWR1bGUgYWRkcmVzcyBjb21wdXRhdGlvbnMgc28KKyAgLy8gdGhhdCBsb2FkcyBhbmQgc3RvcmVzIGFyZW4ndCBibG9ja2VkLgorICAvLyBUaGlzIHZhbHVlIHdhcyBjaG9zZW4gYXJiaXRyYXJpbHkuCisgIHJldHVybiAyMDA7Cit9CisKKy8vLyBHZXRDcHVJREFuZEluZm8gLSBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY3B1aWQgYW5kIHJldHVybiB0aGUgNCB2YWx1ZXMgaW4gdGhlCisvLy8gc3BlY2lmaWVkIGFyZ3VtZW50cy4gIElmIHdlIGNhbid0IHJ1biBjcHVpZCBvbiB0aGUgaG9zdCwgcmV0dXJuIHRydWUuCitzdGF0aWMgYm9vbCBHZXRDcHVJREFuZEluZm8odW5zaWduZWQgdmFsdWUsIHVuc2lnbmVkICpyRUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpyRUJYLCB1bnNpZ25lZCAqckVDWCwgdW5zaWduZWQgKnJFRFgpIHsKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQgKF9NX1g2NCkKKyAgI2lmIGRlZmluZWQoX19HTlVDX18pCisgICAgLy8gZ2NjIGRvZXNuJ3Qga25vdyBjcHVpZCB3b3VsZCBjbG9iYmVyIGVieC9yYnguIFByZXNldmUgaXQgbWFudWFsbHkuCisgICAgYXNtICgibW92cVx0JSVyYngsICUlcnNpXG5cdCIKKyAgICAgICAgICJjcHVpZFxuXHQiCisgICAgICAgICAieGNoZ3FcdCUlcmJ4LCAlJXJzaVxuXHQiCisgICAgICAgICA6ICI9YSIgKCpyRUFYKSwKKyAgICAgICAgICAgIj1TIiAoKnJFQlgpLAorICAgICAgICAgICAiPWMiICgqckVDWCksCisgICAgICAgICAgICI9ZCIgKCpyRURYKQorICAgICAgICAgOiAgImEiICh2YWx1ZSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBpbnQgcmVnaXN0ZXJzWzRdOworICAgIF9fY3B1aWQocmVnaXN0ZXJzLCB2YWx1ZSk7CisgICAgKnJFQVggPSByZWdpc3RlcnNbMF07CisgICAgKnJFQlggPSByZWdpc3RlcnNbMV07CisgICAgKnJFQ1ggPSByZWdpc3RlcnNbMl07CisgICAgKnJFRFggPSByZWdpc3RlcnNbM107CisgICAgcmV0dXJuIGZhbHNlOworICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpCisgICNpZiBkZWZpbmVkKF9fR05VQ19fKQorICAgIGFzbSAoIm1vdmxcdCUlZWJ4LCAlJWVzaVxuXHQiCisgICAgICAgICAiY3B1aWRcblx0IgorICAgICAgICAgInhjaGdsXHQlJWVieCwgJSVlc2lcblx0IgorICAgICAgICAgOiAiPWEiICgqckVBWCksCisgICAgICAgICAgICI9UyIgKCpyRUJYKSwKKyAgICAgICAgICAgIj1jIiAoKnJFQ1gpLAorICAgICAgICAgICAiPWQiICgqckVEWCkKKyAgICAgICAgIDogICJhIiAodmFsdWUpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgX19hc20geworICAgICAgbW92ICAgZWF4LHZhbHVlCisgICAgICBjcHVpZAorICAgICAgbW92ICAgZXNpLHJFQVgKKyAgICAgIG1vdiAgIGR3b3JkIHB0ciBbZXNpXSxlYXgKKyAgICAgIG1vdiAgIGVzaSxyRUJYCisgICAgICBtb3YgICBkd29yZCBwdHIgW2VzaV0sZWJ4CisgICAgICBtb3YgICBlc2ksckVDWAorICAgICAgbW92ICAgZHdvcmQgcHRyIFtlc2ldLGVjeAorICAgICAgbW92ICAgZXNpLHJFRFgKKyAgICAgIG1vdiAgIGR3b3JkIHB0ciBbZXNpXSxlZHgKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICAjZW5kaWYKKyNlbmRpZgorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgRGV0ZWN0RmFtaWx5TW9kZWwodW5zaWduZWQgRUFYLCB1bnNpZ25lZCAmRmFtaWx5LCB1bnNpZ25lZCAmTW9kZWwpIHsKKyAgRmFtaWx5ID0gKEVBWCA+PiA4KSAmIDB4ZjsgLy8gQml0cyA4IC0gMTEKKyAgTW9kZWwgID0gKEVBWCA+PiA0KSAmIDB4ZjsgLy8gQml0cyA0IC0gNworICBpZiAoRmFtaWx5ID09IDYgfHwgRmFtaWx5ID09IDB4ZikgeworICAgIGlmIChGYW1pbHkgPT0gMHhmKQorICAgICAgLy8gRXhhbWluZSBleHRlbmRlZCBmYW1pbHkgSUQgaWYgZmFtaWx5IElEIGlzIEYuCisgICAgICBGYW1pbHkgKz0gKEVBWCA+PiAyMCkgJiAweGZmOyAgICAvLyBCaXRzIDIwIC0gMjcKKyAgICAvLyBFeGFtaW5lIGV4dGVuZGVkIG1vZGVsIElEIGlmIGZhbWlseSBJRCBpcyA2IG9yIEYuCisgICAgTW9kZWwgKz0gKChFQVggPj4gMTYpICYgMHhmKSA8PCA0OyAvLyBCaXRzIDE2IC0gMTkKKyAgfQorfQorCit2b2lkIFg4NlN1YnRhcmdldDo6QXV0b0RldGVjdFN1YnRhcmdldEZlYXR1cmVzKCkgeworICB1bnNpZ25lZCBFQVggPSAwLCBFQlggPSAwLCBFQ1ggPSAwLCBFRFggPSAwOworICB1bmlvbiB7CisgICAgdW5zaWduZWQgdVszXTsKKyAgICBjaGFyICAgICBjWzEyXTsKKyAgfSB0ZXh0OworICAKKyAgaWYgKEdldENwdUlEQW5kSW5mbygwLCAmRUFYLCB0ZXh0LnUrMCwgdGV4dC51KzIsIHRleHQudSsxKSkKKyAgICByZXR1cm47CisKKyAgR2V0Q3B1SURBbmRJbmZvKDB4MSwgJkVBWCwgJkVCWCwgJkVDWCwgJkVEWCk7CisgIAorICBpZiAoKEVEWCA+PiAxNSkgJiAxKSBIYXNDTW92ID0gdHJ1ZTsKKyAgaWYgKChFRFggPj4gMjMpICYgMSkgWDg2U1NFTGV2ZWwgPSBNTVg7CisgIGlmICgoRURYID4+IDI1KSAmIDEpIFg4NlNTRUxldmVsID0gU1NFMTsKKyAgaWYgKChFRFggPj4gMjYpICYgMSkgWDg2U1NFTGV2ZWwgPSBTU0UyOworICBpZiAoRUNYICYgMHgxKSAgICAgICBYODZTU0VMZXZlbCA9IFNTRTM7CisgIGlmICgoRUNYID4+IDkpICAmIDEpIFg4NlNTRUxldmVsID0gU1NTRTM7CisgIGlmICgoRUNYID4+IDE5KSAmIDEpIFg4NlNTRUxldmVsID0gU1NFNDE7CisgIGlmICgoRUNYID4+IDIwKSAmIDEpIFg4NlNTRUxldmVsID0gU1NFNDI7CisKKyAgYm9vbCBJc0ludGVsID0gbWVtY21wKHRleHQuYywgIkdlbnVpbmVJbnRlbCIsIDEyKSA9PSAwOworICBib29sIElzQU1EICAgPSAhSXNJbnRlbCAmJiBtZW1jbXAodGV4dC5jLCAiQXV0aGVudGljQU1EIiwgMTIpID09IDA7CisKKyAgSGFzQ0xNVUwgPSBJc0ludGVsICYmICgoRUNYID4+IDEpICYgMHgxKTsKKyAgSGFzRk1BMyAgPSBJc0ludGVsICYmICgoRUNYID4+IDEyKSAmIDB4MSk7CisgIEhhc0FWWCAgID0gKChFQ1ggPj4gMjgpICYgMHgxKTsKKyAgSGFzQUVTICAgPSBJc0ludGVsICYmICgoRUNYID4+IDI1KSAmIDB4MSk7CisKKyAgaWYgKElzSW50ZWwgfHwgSXNBTUQpIHsKKyAgICAvLyBEZXRlcm1pbmUgaWYgYml0IHRlc3QgbWVtb3J5IGluc3RydWN0aW9ucyBhcmUgc2xvdy4KKyAgICB1bnNpZ25lZCBGYW1pbHkgPSAwOworICAgIHVuc2lnbmVkIE1vZGVsICA9IDA7CisgICAgRGV0ZWN0RmFtaWx5TW9kZWwoRUFYLCBGYW1pbHksIE1vZGVsKTsKKyAgICBJc0JUTWVtU2xvdyA9IElzQU1EIHx8IChGYW1pbHkgPT0gNiAmJiBNb2RlbCA+PSAxMyk7CisgICAgLy8gSWYgaXQncyBOZWhhbGVtLCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBpcyBmYXN0LgorICAgIGlmIChGYW1pbHkgPT0gMTUgJiYgTW9kZWwgPT0gMjYpCisgICAgICBJc1VBTWVtRmFzdCA9IHRydWU7CisKKyAgICBHZXRDcHVJREFuZEluZm8oMHg4MDAwMDAwMSwgJkVBWCwgJkVCWCwgJkVDWCwgJkVEWCk7CisgICAgSGFzWDg2XzY0ID0gKEVEWCA+PiAyOSkgJiAweDE7CisgICAgSGFzU1NFNEEgPSBJc0FNRCAmJiAoKEVDWCA+PiA2KSAmIDB4MSk7CisgICAgSGFzRk1BNCA9IElzQU1EICYmICgoRUNYID4+IDE2KSAmIDB4MSk7CisgIH0KK30KKworWDg2U3VidGFyZ2V0OjpYODZTdWJ0YXJnZXQoY29uc3Qgc3RkOjpzdHJpbmcgJlRULCBjb25zdCBzdGQ6OnN0cmluZyAmRlMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpczY0Qml0KQorICA6IFBJQ1N0eWxlKFBJQ1N0eWxlczo6Tm9uZSkKKyAgLCBYODZTU0VMZXZlbChOb01NWFNTRSkKKyAgLCBYODYzRE5vd0xldmVsKE5vVGhyZWVETm93KQorICAsIEhhc0NNb3YoZmFsc2UpCisgICwgSGFzWDg2XzY0KGZhbHNlKQorICAsIEhhc1NTRTRBKGZhbHNlKQorICAsIEhhc0FWWChmYWxzZSkKKyAgLCBIYXNBRVMoZmFsc2UpCisgICwgSGFzQ0xNVUwoZmFsc2UpCisgICwgSGFzRk1BMyhmYWxzZSkKKyAgLCBIYXNGTUE0KGZhbHNlKQorICAsIElzQlRNZW1TbG93KGZhbHNlKQorICAsIElzVUFNZW1GYXN0KGZhbHNlKQorICAsIEhhc1ZlY3RvclVBTWVtKGZhbHNlKQorICAsIHN0YWNrQWxpZ25tZW50KDgpCisgIC8vIEZJWE1FOiB0aGlzIGlzIGEga25vd24gZ29vZCB2YWx1ZSBmb3IgWW9uYWguIEhvdyBhYm91dCBvdGhlcnM/CisgICwgTWF4SW5saW5lU2l6ZVRocmVzaG9sZCgxMjgpCisgICwgVGFyZ2V0VHJpcGxlKFRUKQorICAsIElzNjRCaXQoaXM2NEJpdCkgeworCisgIC8vIGRlZmF1bHQgdG8gaGFyZCBmbG9hdCBBQkkKKyAgaWYgKEZsb2F0QUJJVHlwZSA9PSBGbG9hdEFCSTo6RGVmYXVsdCkKKyAgICBGbG9hdEFCSVR5cGUgPSBGbG9hdEFCSTo6SGFyZDsKKyAgICAKKyAgLy8gRGV0ZXJtaW5lIGRlZmF1bHQgYW5kIHVzZXIgc3BlY2lmaWVkIGNoYXJhY3RlcmlzdGljcworICBpZiAoIUZTLmVtcHR5KCkpIHsKKyAgICAvLyBJZiBmZWF0dXJlIHN0cmluZyBpcyBub3QgZW1wdHksIHBhcnNlIGZlYXR1cmVzIHN0cmluZy4KKyAgICBzdGQ6OnN0cmluZyBDUFUgPSBzeXM6OmdldEhvc3RDUFVOYW1lKCk7CisgICAgUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhGUywgQ1BVKTsKKyAgICAvLyBBbGwgWDg2LTY0IENQVXMgYWxzbyBoYXZlIFNTRTIsIGhvd2V2ZXIgdXNlciBtaWdodCByZXF1ZXN0IG5vIFNTRSB2aWEgCisgICAgLy8gLW1hdHRyLCBzbyBkb24ndCBmb3JjZSBTU0VMZXZlbCBoZXJlLgorICB9IGVsc2UgeworICAgIC8vIE90aGVyd2lzZSwgdXNlIENQVUlEIHRvIGF1dG8tZGV0ZWN0IGZlYXR1cmUgc2V0LgorICAgIEF1dG9EZXRlY3RTdWJ0YXJnZXRGZWF0dXJlcygpOworICAgIC8vIE1ha2Ugc3VyZSBTU0UyIGlzIGVuYWJsZWQ7IGl0IGlzIGF2YWlsYWJsZSBvbiBhbGwgWDg2LTY0IENQVXMuCisgICAgaWYgKElzNjRCaXQgJiYgWDg2U1NFTGV2ZWwgPCBTU0UyKQorICAgICAgWDg2U1NFTGV2ZWwgPSBTU0UyOworICB9CisKKyAgLy8gSWYgcmVxdWVzdGluZyBjb2RlZ2VuIGZvciBYODYtNjQsIG1ha2Ugc3VyZSB0aGF0IDY0LWJpdCBmZWF0dXJlcworICAvLyBhcmUgZW5hYmxlZC4KKyAgaWYgKElzNjRCaXQpIHsKKyAgICBIYXNYODZfNjQgPSB0cnVlOworCisgICAgLy8gQWxsIDY0LWJpdCBjcHVzIGhhdmUgY21vdiBzdXBwb3J0LgorICAgIEhhc0NNb3YgPSB0cnVlOworICB9CisgICAgCisgIERFQlVHKGRiZ3MoKSA8PCAiU3VidGFyZ2V0IGZlYXR1cmVzOiBTU0VMZXZlbCAiIDw8IFg4NlNTRUxldmVsCisgICAgICAgICAgICAgICA8PCAiLCAzRE5vd0xldmVsICIgPDwgWDg2M0ROb3dMZXZlbAorICAgICAgICAgICAgICAgPDwgIiwgNjRiaXQgIiA8PCBIYXNYODZfNjQgPDwgIlxuIik7CisgIGFzc2VydCgoIUlzNjRCaXQgfHwgSGFzWDg2XzY0KSAmJgorICAgICAgICAgIjY0LWJpdCBjb2RlIHJlcXVlc3RlZCBvbiBhIHN1YnRhcmdldCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBpdCEiKTsKKworICAvLyBTdGFjayBhbGlnbm1lbnQgaXMgMTYgYnl0ZXMgb24gRGFyd2luIChib3RoIDMyIGFuZCA2NCBiaXQpIGFuZCBmb3IgYWxsIDY0CisgIC8vIGJpdCB0YXJnZXRzLgorICBpZiAoaXNUYXJnZXREYXJ3aW4oKSB8fCBJczY0Qml0KQorICAgIHN0YWNrQWxpZ25tZW50ID0gMTY7CisKKyAgaWYgKFN0YWNrQWxpZ25tZW50KQorICAgIHN0YWNrQWxpZ25tZW50ID0gU3RhY2tBbGlnbm1lbnQ7Cit9CisKKy8vLyBJc0NhbGxlZVBvcCAtIERldGVybWluZXMgd2hldGhlciB0aGUgY2FsbGVlIGlzIHJlcXVpcmVkIHRvIHBvcCBpdHMKKy8vLyBvd24gYXJndW1lbnRzLiBDYWxsZWUgcG9wIGlzIG5lY2Vzc2FyeSB0byBzdXBwb3J0IHRhaWwgY2FsbHMuCitib29sIFg4NlN1YnRhcmdldDo6SXNDYWxsZWVQb3AoYm9vbCBJc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbGluZ0NvbnYpIGNvbnN0IHsKKyAgaWYgKElzVmFyQXJnKQorICAgIHJldHVybiBmYWxzZTsKKworICBzd2l0Y2ggKENhbGxpbmdDb252KSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIENhbGxpbmdDb252OjpYODZfU3RkQ2FsbDoKKyAgICByZXR1cm4gIWlzNjRCaXQoKTsKKyAgY2FzZSBDYWxsaW5nQ29udjo6WDg2X0Zhc3RDYWxsOgorICAgIHJldHVybiAhaXM2NEJpdCgpOworICBjYXNlIENhbGxpbmdDb252OjpYODZfVGhpc0NhbGw6CisgICAgcmV0dXJuICFpczY0Qml0KCk7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkZhc3Q6CisgICAgcmV0dXJuIEd1YXJhbnRlZWRUYWlsQ2FsbE9wdDsKKyAgY2FzZSBDYWxsaW5nQ29udjo6R0hDOgorICAgIHJldHVybiBHdWFyYW50ZWVkVGFpbENhbGxPcHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlN1YnRhcmdldC5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2U3VidGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlODExNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlN1YnRhcmdldC5oCkBAIC0wLDAgKzEsMjUyIEBACisvLz09PT09LS0tLSBYODZTdWJ0YXJnZXQuaCAtIERlZmluZSBTdWJ0YXJnZXQgZm9yIHRoZSBYODYgLS0tLS0qLSBDKysgLSotLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgWDg2IHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFg4NlNVQlRBUkdFVF9ICisjZGVmaW5lIFg4NlNVQlRBUkdFVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKKy8vLyBQSUNTdHlsZXMgLSBUaGUgWDg2IGJhY2tlbmQgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IHN0eWxlcyBvZiBQSUMuCisvLy8KK25hbWVzcGFjZSBQSUNTdHlsZXMgeworZW51bSBTdHlsZSB7CisgIFN0dWJQSUMsICAgICAgICAgIC8vIFVzZWQgb24gaTM4Ni1kYXJ3aW4gaW4gLWZQSUMgbW9kZS4KKyAgU3R1YkR5bmFtaWNOb1BJQywgLy8gVXNlZCBvbiBpMzg2LWRhcndpbiBpbiAtbWR5bmFtaWMtbm8tcGljIG1vZGUuCisgIEdPVCwgICAgICAgICAgICAgIC8vIFVzZWQgb24gbWFueSAzMi1iaXQgdW5pY2VzIGluIC1mUElDIG1vZGUuCisgIFJJUFJlbCwgICAgICAgICAgIC8vIFVzZWQgb24gWDg2LTY0IHdoZW4gbm90IGluIC1zdGF0aWMgbW9kZS4KKyAgTm9uZSAgICAgICAgICAgICAgLy8gU2V0IHdoZW4gaW4gLXN0YXRpYyBtb2RlIChub3QgUElDIG9yIER5bmFtaWNOb1BJQyBtb2RlKS4KK307Cit9CisKK2NsYXNzIFg4NlN1YnRhcmdldCA6IHB1YmxpYyBUYXJnZXRTdWJ0YXJnZXQgeworcHJvdGVjdGVkOgorICBlbnVtIFg4NlNTRUVudW0geworICAgIE5vTU1YU1NFLCBNTVgsIFNTRTEsIFNTRTIsIFNTRTMsIFNTU0UzLCBTU0U0MSwgU1NFNDIKKyAgfTsKKworICBlbnVtIFg4NjNETm93RW51bSB7CisgICAgTm9UaHJlZUROb3csIFRocmVlRE5vdywgVGhyZWVETm93QQorICB9OworCisgIC8vLyBQSUNTdHlsZSAtIFdoaWNoIFBJQyBzdHlsZSB0byB1c2UKKyAgLy8vCisgIFBJQ1N0eWxlczo6U3R5bGUgUElDU3R5bGU7CisKKyAgLy8vIFg4NlNTRUxldmVsIC0gTU1YLCBTU0UxLCBTU0UyLCBTU0UzLCBTU1NFMywgU1NFNDEsIFNTRTQyLCBvcgorICAvLy8gbm9uZSBzdXBwb3J0ZWQuCisgIFg4NlNTRUVudW0gWDg2U1NFTGV2ZWw7CisKKyAgLy8vIFg4NjNETm93TGV2ZWwgLSAzRE5vdyBvciAzRE5vdyBBdGhsb24sIG9yIG5vbmUgc3VwcG9ydGVkLgorICAvLy8KKyAgWDg2M0ROb3dFbnVtIFg4NjNETm93TGV2ZWw7CisKKyAgLy8vIEhhc0NNb3YgLSBUcnVlIGlmIHRoaXMgcHJvY2Vzc29yIGhhcyBjb25kaXRpb25hbCBtb3ZlIGluc3RydWN0aW9ucworICAvLy8gKGdlbmVyYWxseSBwZW50aXVtIHBybyspLgorICBib29sIEhhc0NNb3Y7CisKKyAgLy8vIEhhc1g4Nl82NCAtIFRydWUgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyBYODYtNjQgaW5zdHJ1Y3Rpb25zLgorICAvLy8KKyAgYm9vbCBIYXNYODZfNjQ7CisKKyAgLy8vIEhhc1NTRTRBIC0gVHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIFNTRTRBIGluc3RydWN0aW9ucy4KKyAgYm9vbCBIYXNTU0U0QTsKKworICAvLy8gSGFzQVZYIC0gVGFyZ2V0IGhhcyBBVlggaW5zdHJ1Y3Rpb25zCisgIGJvb2wgSGFzQVZYOworCisgIC8vLyBIYXNBRVMgLSBUYXJnZXQgaGFzIEFFUyBpbnN0cnVjdGlvbnMKKyAgYm9vbCBIYXNBRVM7CisKKyAgLy8vIEhhc0NMTVVMIC0gVGFyZ2V0IGhhcyBjYXJyeS1sZXNzIG11bHRpcGxpY2F0aW9uCisgIGJvb2wgSGFzQ0xNVUw7CisKKyAgLy8vIEhhc0ZNQTMgLSBUYXJnZXQgaGFzIDMtb3BlcmFuZCBmdXNlZCBtdWx0aXBseS1hZGQKKyAgYm9vbCBIYXNGTUEzOworCisgIC8vLyBIYXNGTUE0IC0gVGFyZ2V0IGhhcyA0LW9wZXJhbmQgZnVzZWQgbXVsdGlwbHktYWRkCisgIGJvb2wgSGFzRk1BNDsKKworICAvLy8gSXNCVE1lbVNsb3cgLSBUcnVlIGlmIEJUIChiaXQgdGVzdCkgb2YgbWVtb3J5IGluc3RydWN0aW9ucyBhcmUgc2xvdy4KKyAgYm9vbCBJc0JUTWVtU2xvdzsKKworICAvLy8gSXNVQU1lbUZhc3QgLSBUcnVlIGlmIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGlzIGZhc3QuCisgIGJvb2wgSXNVQU1lbUZhc3Q7CisKKyAgLy8vIEhhc1ZlY3RvclVBTWVtIC0gVHJ1ZSBpZiBTSU1EIG9wZXJhdGlvbnMgY2FuIGhhdmUgdW5hbGlnbmVkIG1lbW9yeQorICAvLy8gb3BlcmFuZHMuIFRoaXMgbWF5IHJlcXVpcmUgc2V0dGluZyBhIGZlYXR1cmUgYml0IGluIHRoZSBwcm9jZXNzb3IuCisgIGJvb2wgSGFzVmVjdG9yVUFNZW07CisKKyAgLy8vIHN0YWNrQWxpZ25tZW50IC0gVGhlIG1pbmltdW0gYWxpZ25tZW50IGtub3duIHRvIGhvbGQgb2YgdGhlIHN0YWNrIGZyYW1lIG9uCisgIC8vLyBlbnRyeSB0byB0aGUgZnVuY3Rpb24gYW5kIHdoaWNoIG11c3QgYmUgbWFpbnRhaW5lZCBieSBldmVyeSBmdW5jdGlvbi4KKyAgdW5zaWduZWQgc3RhY2tBbGlnbm1lbnQ7CisKKyAgLy8vIE1heC4gbWVtc2V0IC8gbWVtY3B5IHNpemUgdGhhdCBpcyB0dXJuZWQgaW50byByZXAvbW92cywgcmVwL3N0b3Mgb3BzLgorICAvLy8KKyAgdW5zaWduZWQgTWF4SW5saW5lU2l6ZVRocmVzaG9sZDsKKyAgCisgIC8vLyBUYXJnZXRUcmlwbGUgLSBXaGF0IHByb2Nlc3NvciBhbmQgT1Mgd2UncmUgdGFyZ2V0aW5nLgorICBUcmlwbGUgVGFyZ2V0VHJpcGxlOworCitwcml2YXRlOgorICAvLy8gSXM2NEJpdCAtIFRydWUgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyA2NC1iaXQgaW5zdHJ1Y3Rpb25zIGFuZAorICAvLy8gcG9pbnRlciBzaXplIGlzIDY0IGJpdC4KKyAgYm9vbCBJczY0Qml0OworCitwdWJsaWM6CisKKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIGRhdGEgbWVtYmVycyB0byBtYXRjaCB0aGF0CisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHRyaXBsZS4KKyAgLy8vCisgIFg4NlN1YnRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVFQsIGNvbnN0IHN0ZDo6c3RyaW5nICZGUywgYm9vbCBpczY0Qml0KTsKKworICAvLy8gZ2V0U3RhY2tBbGlnbm1lbnQgLSBSZXR1cm5zIHRoZSBtaW5pbXVtIGFsaWdubWVudCBrbm93biB0byBob2xkIG9mIHRoZQorICAvLy8gc3RhY2sgZnJhbWUgb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uIGFuZCB3aGljaCBtdXN0IGJlIG1haW50YWluZWQgYnkgZXZlcnkKKyAgLy8vIGZ1bmN0aW9uIGZvciB0aGlzIHN1YnRhcmdldC4KKyAgdW5zaWduZWQgZ2V0U3RhY2tBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBzdGFja0FsaWdubWVudDsgfQorCisgIC8vLyBnZXRNYXhJbmxpbmVTaXplVGhyZXNob2xkIC0gUmV0dXJucyB0aGUgbWF4aW11bSBtZW1zZXQgLyBtZW1jcHkgc2l6ZQorICAvLy8gdGhhdCBzdGlsbCBtYWtlcyBpdCBwcm9maXRhYmxlIHRvIGlubGluZSB0aGUgY2FsbC4KKyAgdW5zaWduZWQgZ2V0TWF4SW5saW5lU2l6ZVRocmVzaG9sZCgpIGNvbnN0IHsgcmV0dXJuIE1heElubGluZVNpemVUaHJlc2hvbGQ7IH0KKworICAvLy8gUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyAtIFBhcnNlcyBmZWF0dXJlcyBzdHJpbmcgc2V0dGluZyBzcGVjaWZpZWQKKyAgLy8vIHN1YnRhcmdldCBvcHRpb25zLiAgRGVmaW5pdGlvbiBvZiBmdW5jdGlvbiBpcyBhdXRvIGdlbmVyYXRlZCBieSB0YmxnZW4uCisgIHN0ZDo6c3RyaW5nIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcgJkZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZDUFUpOworCisgIC8vLyBBdXRvRGV0ZWN0U3VidGFyZ2V0RmVhdHVyZXMgLSBBdXRvLWRldGVjdCBDUFUgZmVhdHVyZXMgdXNpbmcgQ1BVSUQKKyAgLy8vIGluc3RydWN0aW9uLgorICB2b2lkIEF1dG9EZXRlY3RTdWJ0YXJnZXRGZWF0dXJlcygpOworCisgIGJvb2wgaXM2NEJpdCgpIGNvbnN0IHsgcmV0dXJuIElzNjRCaXQ7IH0KKworICBQSUNTdHlsZXM6OlN0eWxlIGdldFBJQ1N0eWxlKCkgY29uc3QgeyByZXR1cm4gUElDU3R5bGU7IH0KKyAgdm9pZCBzZXRQSUNTdHlsZShQSUNTdHlsZXM6OlN0eWxlIFN0eWxlKSAgeyBQSUNTdHlsZSA9IFN0eWxlOyB9CisKKyAgYm9vbCBoYXNDTW92KCkgY29uc3QgeyByZXR1cm4gSGFzQ01vdjsgfQorICBib29sIGhhc01NWCgpIGNvbnN0IHsgcmV0dXJuIFg4NlNTRUxldmVsID49IE1NWDsgfQorICBib29sIGhhc1NTRTEoKSBjb25zdCB7IHJldHVybiBYODZTU0VMZXZlbCA+PSBTU0UxOyB9CisgIGJvb2wgaGFzU1NFMigpIGNvbnN0IHsgcmV0dXJuIFg4NlNTRUxldmVsID49IFNTRTI7IH0KKyAgYm9vbCBoYXNTU0UzKCkgY29uc3QgeyByZXR1cm4gWDg2U1NFTGV2ZWwgPj0gU1NFMzsgfQorICBib29sIGhhc1NTU0UzKCkgY29uc3QgeyByZXR1cm4gWDg2U1NFTGV2ZWwgPj0gU1NTRTM7IH0KKyAgYm9vbCBoYXNTU0U0MSgpIGNvbnN0IHsgcmV0dXJuIFg4NlNTRUxldmVsID49IFNTRTQxOyB9CisgIGJvb2wgaGFzU1NFNDIoKSBjb25zdCB7IHJldHVybiBYODZTU0VMZXZlbCA+PSBTU0U0MjsgfQorICBib29sIGhhc1NTRTRBKCkgY29uc3QgeyByZXR1cm4gSGFzU1NFNEE7IH0KKyAgYm9vbCBoYXMzRE5vdygpIGNvbnN0IHsgcmV0dXJuIFg4NjNETm93TGV2ZWwgPj0gVGhyZWVETm93OyB9CisgIGJvb2wgaGFzM0ROb3dBKCkgY29uc3QgeyByZXR1cm4gWDg2M0ROb3dMZXZlbCA+PSBUaHJlZUROb3dBOyB9CisgIGJvb2wgaGFzQVZYKCkgY29uc3QgeyByZXR1cm4gSGFzQVZYOyB9CisgIGJvb2wgaGFzQUVTKCkgY29uc3QgeyByZXR1cm4gSGFzQUVTOyB9CisgIGJvb2wgaGFzQ0xNVUwoKSBjb25zdCB7IHJldHVybiBIYXNDTE1VTDsgfQorICBib29sIGhhc0ZNQTMoKSBjb25zdCB7IHJldHVybiBIYXNGTUEzOyB9CisgIGJvb2wgaGFzRk1BNCgpIGNvbnN0IHsgcmV0dXJuIEhhc0ZNQTQ7IH0KKyAgYm9vbCBpc0JUTWVtU2xvdygpIGNvbnN0IHsgcmV0dXJuIElzQlRNZW1TbG93OyB9CisgIGJvb2wgaXNVbmFsaWduZWRNZW1BY2Nlc3NGYXN0KCkgY29uc3QgeyByZXR1cm4gSXNVQU1lbUZhc3Q7IH0KKyAgYm9vbCBoYXNWZWN0b3JVQU1lbSgpIGNvbnN0IHsgcmV0dXJuIEhhc1ZlY3RvclVBTWVtOyB9CisKKyAgYm9vbCBpc1RhcmdldERhcndpbigpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFRyaXBsZS5nZXRPUygpID09IFRyaXBsZTo6RGFyd2luOyB9CisgIGJvb2wgaXNUYXJnZXRMaW51eCgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFRyaXBsZS5nZXRPUygpID09IFRyaXBsZTo6TGludXg7IH0KKyAgYm9vbCBpc1RhcmdldFdpbmRvd3MoKSBjb25zdCB7IHJldHVybiBUYXJnZXRUcmlwbGUuZ2V0T1MoKSA9PSBUcmlwbGU6OldpbjMyOyB9CisgIGJvb2wgaXNUYXJnZXRNaW5ndygpIGNvbnN0IHsgCisgICAgcmV0dXJuIFRhcmdldFRyaXBsZS5nZXRPUygpID09IFRyaXBsZTo6TWluR1czMiB8fAorICAgICAgICAgICBUYXJnZXRUcmlwbGUuZ2V0T1MoKSA9PSBUcmlwbGU6Ok1pbkdXNjQ7IH0KKyAgYm9vbCBpc1RhcmdldEN5Z3dpbigpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFRyaXBsZS5nZXRPUygpID09IFRyaXBsZTo6Q3lnd2luOyB9CisgIGJvb2wgaXNUYXJnZXRDeWdNaW5nKCkgY29uc3QgeworICAgIHJldHVybiBpc1RhcmdldE1pbmd3KCkgfHwgaXNUYXJnZXRDeWd3aW4oKTsKKyAgfQorICAKKyAgLy8vIGlzVGFyZ2V0Q09GRiAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW55IENPRkYvV2luZG93cyB0YXJnZXQgdmFyaWFudC4KKyAgYm9vbCBpc1RhcmdldENPRkYoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVGFyZ2V0TWluZ3coKSB8fCBpc1RhcmdldEN5Z3dpbigpIHx8IGlzVGFyZ2V0V2luZG93cygpOworICB9CisKKyAgYm9vbCBpc1RhcmdldFdpbjY0KCkgY29uc3QgeworICAgIHJldHVybiBJczY0Qml0ICYmIChpc1RhcmdldE1pbmd3KCkgfHwgaXNUYXJnZXRXaW5kb3dzKCkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0RGF0YUxheW91dCgpIGNvbnN0IHsKKyAgICBjb25zdCBjaGFyICpwOworICAgIGlmIChpczY0Qml0KCkpCisgICAgICBwID0gImUtcDo2NDo2NC1zOjY0LWY2NDo2NDo2NC1pNjQ6NjQ6NjQtZjgwOjEyODoxMjgtbjg6MTY6MzI6NjQiOworICAgIGVsc2UgaWYgKGlzVGFyZ2V0RGFyd2luKCkpCisgICAgICBwID0gImUtcDozMjozMi1mNjQ6MzI6NjQtaTY0OjMyOjY0LWY4MDoxMjg6MTI4LW44OjE2OjMyIjsKKyAgICBlbHNlIGlmIChpc1RhcmdldE1pbmd3KCkgfHwgaXNUYXJnZXRXaW5kb3dzKCkpCisgICAgICBwID0gImUtcDozMjozMi1mNjQ6NjQ6NjQtaTY0OjY0OjY0LWY4MDozMjozMi1uODoxNjozMiI7CisgICAgZWxzZQorICAgICAgcCA9ICJlLXA6MzI6MzItZjY0OjMyOjY0LWk2NDozMjo2NC1mODA6MzI6MzItbjg6MTY6MzIiOworCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHApOworICB9CisKKyAgYm9vbCBpc1BJQ1N0eWxlU2V0KCkgY29uc3QgeyByZXR1cm4gUElDU3R5bGUgIT0gUElDU3R5bGVzOjpOb25lOyB9CisgIGJvb2wgaXNQSUNTdHlsZUdPVCgpIGNvbnN0IHsgcmV0dXJuIFBJQ1N0eWxlID09IFBJQ1N0eWxlczo6R09UOyB9CisgIGJvb2wgaXNQSUNTdHlsZVJJUFJlbCgpIGNvbnN0IHsgcmV0dXJuIFBJQ1N0eWxlID09IFBJQ1N0eWxlczo6UklQUmVsOyB9CisKKyAgYm9vbCBpc1BJQ1N0eWxlU3R1YlBJQygpIGNvbnN0IHsKKyAgICByZXR1cm4gUElDU3R5bGUgPT0gUElDU3R5bGVzOjpTdHViUElDOworICB9CisKKyAgYm9vbCBpc1BJQ1N0eWxlU3R1Yk5vRHluYW1pYygpIGNvbnN0IHsKKyAgICByZXR1cm4gUElDU3R5bGUgPT0gUElDU3R5bGVzOjpTdHViRHluYW1pY05vUElDOworICB9CisgIGJvb2wgaXNQSUNTdHlsZVN0dWJBbnkoKSBjb25zdCB7CisgICAgcmV0dXJuIFBJQ1N0eWxlID09IFBJQ1N0eWxlczo6U3R1YkR5bmFtaWNOb1BJQyB8fAorICAgICAgICAgICBQSUNTdHlsZSA9PSBQSUNTdHlsZXM6OlN0dWJQSUM7IH0KKworICAvLy8gZ2V0RGFyd2luVmVycyAtIFJldHVybiB0aGUgZGFyd2luIHZlcnNpb24gbnVtYmVyLCA4ID0gVGlnZXIsIDkgPSBMZW9wYXJkLAorICAvLy8gMTAgPSBTbm93IExlb3BhcmQsIGV0Yy4KKyAgdW5zaWduZWQgZ2V0RGFyd2luVmVycygpIGNvbnN0IHsKKyAgICBpZiAoaXNUYXJnZXREYXJ3aW4oKSkgcmV0dXJuIFRhcmdldFRyaXBsZS5nZXREYXJ3aW5NYWpvck51bWJlcigpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIENsYXNzaWZ5R2xvYmFsUmVmZXJlbmNlIC0gQ2xhc3NpZnkgYSBnbG9iYWwgdmFyaWFibGUgcmVmZXJlbmNlIGZvciB0aGUKKyAgLy8vIGN1cnJlbnQgc3VidGFyZ2V0IGFjY29yZGluZyB0byBob3cgd2Ugc2hvdWxkIHJlZmVyZW5jZSBpdCBpbiBhIG5vbi1wY3JlbAorICAvLy8gY29udGV4dC4KKyAgdW5zaWduZWQgY2hhciBDbGFzc2lmeUdsb2JhbFJlZmVyZW5jZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pY29uc3Q7CisKKyAgLy8vIENsYXNzaWZ5QmxvY2tBZGRyZXNzUmVmZXJlbmNlIC0gQ2xhc3NpZnkgYSBibG9ja2FkZHJlc3MgcmVmZXJlbmNlIGZvciB0aGUKKyAgLy8vIGN1cnJlbnQgc3VidGFyZ2V0IGFjY29yZGluZyB0byBob3cgd2Ugc2hvdWxkIHJlZmVyZW5jZSBpdCBpbiBhIG5vbi1wY3JlbAorICAvLy8gY29udGV4dC4KKyAgdW5zaWduZWQgY2hhciBDbGFzc2lmeUJsb2NrQWRkcmVzc1JlZmVyZW5jZSgpIGNvbnN0OworCisgIC8vLyBJc0xlZ2FsVG9DYWxsSW1tZWRpYXRlQWRkciAtIFJldHVybiB0cnVlIGlmIHRoZSBzdWJ0YXJnZXQgYWxsb3dzIGNhbGxzCisgIC8vLyB0byBpbW1lZGlhdGUgYWRkcmVzcy4KKyAgYm9vbCBJc0xlZ2FsVG9DYWxsSW1tZWRpYXRlQWRkcihjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHdoaWNoIGhhcyBhbiBpbnRlcmZhY2UKKyAgLy8vIGxpa2UgdGhlIG5vbi1zdGFuZGFyZCBiemVybyBmdW5jdGlvbiwgaWYgc3VjaCBhIGZ1bmN0aW9uIGV4aXN0cyBvbgorICAvLy8gdGhlIGN1cnJlbnQgc3VidGFyZ2V0IGFuZCBpdCBpcyBjb25zaWRlcmVkIHByZWZlcmVhYmxlIG92ZXIKKyAgLy8vIG1lbXNldCB3aXRoIHplcm8gcGFzc2VkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuIE90aGVyd2lzZSBpdAorICAvLy8gcmV0dXJucyBudWxsLgorICBjb25zdCBjaGFyICpnZXRCWmVyb0VudHJ5KCkgY29uc3Q7CisKKyAgLy8vIGdldFNwZWNpYWxBZGRyZXNzTGF0ZW5jeSAtIEZvciB0YXJnZXRzIHdoZXJlIGl0IGlzIGJlbmVmaWNpYWwgdG8KKyAgLy8vIGJhY2tzY2hlZHVsZSBpbnN0cnVjdGlvbnMgdGhhdCBjb21wdXRlIGFkZHJlc3NlcywgcmV0dXJuIGEgdmFsdWUKKyAgLy8vIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBzY2hlZHVsaW5nIGN5Y2xlcyBvZiBiYWNrc2NoZWR1bGluZyB0aGF0CisgIC8vLyBzaG91bGQgYmUgYXR0ZW1wdGVkLgorICB1bnNpZ25lZCBnZXRTcGVjaWFsQWRkcmVzc0xhdGVuY3koKSBjb25zdDsKKworICAvLy8gSXNDYWxsZWVQb3AgLSBUZXN0IHdoZXRoZXIgYSBmdW5jdGlvbiBzaG91bGQgcG9wIGl0cyBvd24gYXJndW1lbnRzLgorICBib29sIElzQ2FsbGVlUG9wKGJvb2wgaXNWYXJBcmcsIENhbGxpbmdDb252OjpJRCBDYWxsQ29udikgY29uc3Q7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlRhcmdldE1hY2hpbmUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2VGFyZ2V0TWFjaGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2YTAyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWDg2L1g4NlRhcmdldE1hY2hpbmUuY3BwCkBAIC0wLDAgKzEsMjQxIEBACisvLz09PS0tIFg4NlRhcmdldE1hY2hpbmUuY3BwIC0gRGVmaW5lIFRhcmdldE1hY2hpbmUgZm9yIHRoZSBYODYgLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBYODYgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0TWFjaGluZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiWDg2TUNBc21JbmZvLmgiCisjaW5jbHVkZSAiWDg2VGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlg4Ni5oIgorI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb2RlRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTdHJlYW1lci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgTUNBc21JbmZvICpjcmVhdGVNQ0FzbUluZm8oY29uc3QgVGFyZ2V0ICZULCBTdHJpbmdSZWYgVFQpIHsKKyAgVHJpcGxlIFRoZVRyaXBsZShUVCk7CisgIHN3aXRjaCAoVGhlVHJpcGxlLmdldE9TKCkpIHsKKyAgY2FzZSBUcmlwbGU6OkRhcndpbjoKKyAgICByZXR1cm4gbmV3IFg4Nk1DQXNtSW5mb0RhcndpbihUaGVUcmlwbGUpOworICBjYXNlIFRyaXBsZTo6TWluR1czMjoKKyAgY2FzZSBUcmlwbGU6Ok1pbkdXNjQ6CisgIGNhc2UgVHJpcGxlOjpDeWd3aW46CisgIGNhc2UgVHJpcGxlOjpXaW4zMjoKKyAgICByZXR1cm4gbmV3IFg4Nk1DQXNtSW5mb0NPRkYoVGhlVHJpcGxlKTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gbmV3IFg4NkVMRk1DQXNtSW5mbyhUaGVUcmlwbGUpOworICB9Cit9CisKK3N0YXRpYyBNQ1N0cmVhbWVyICpjcmVhdGVNQ1N0cmVhbWVyKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgsIFRhcmdldEFzbUJhY2tlbmQgJlRBQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZfT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvZGVFbWl0dGVyICpfRW1pdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVsYXhBbGwpIHsKKyAgVHJpcGxlIFRoZVRyaXBsZShUVCk7CisgIHN3aXRjaCAoVGhlVHJpcGxlLmdldE9TKCkpIHsKKyAgY2FzZSBUcmlwbGU6OkRhcndpbjoKKyAgICByZXR1cm4gY3JlYXRlTWFjaE9TdHJlYW1lcihDdHgsIFRBQiwgX09TLCBfRW1pdHRlciwgUmVsYXhBbGwpOworICBjYXNlIFRyaXBsZTo6TWluR1czMjoKKyAgY2FzZSBUcmlwbGU6Ok1pbkdXNjQ6CisgIGNhc2UgVHJpcGxlOjpDeWd3aW46CisgIGNhc2UgVHJpcGxlOjpXaW4zMjoKKyAgICByZXR1cm4gY3JlYXRlV2luQ09GRlN0cmVhbWVyKEN0eCwgVEFCLCAqX0VtaXR0ZXIsIF9PUywgUmVsYXhBbGwpOworICBkZWZhdWx0OgorICAgIC8vIEZJWE1FOiBkZWZhdWx0IHRvIEVMRi4KKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIm9iamVjdCBlbWlzc2lvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0LiIpOworICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZVg4NlRhcmdldCgpIHsgCisgIC8vIFJlZ2lzdGVyIHRoZSB0YXJnZXQuCisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxYODZfMzJUYXJnZXRNYWNoaW5lPiBYKFRoZVg4Nl8zMlRhcmdldCk7CisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxYODZfNjRUYXJnZXRNYWNoaW5lPiBZKFRoZVg4Nl82NFRhcmdldCk7CisKKyAgLy8gUmVnaXN0ZXIgdGhlIHRhcmdldCBhc20gaW5mby4KKyAgUmVnaXN0ZXJBc21JbmZvRm4gQShUaGVYODZfMzJUYXJnZXQsIGNyZWF0ZU1DQXNtSW5mbyk7CisgIFJlZ2lzdGVyQXNtSW5mb0ZuIEIoVGhlWDg2XzY0VGFyZ2V0LCBjcmVhdGVNQ0FzbUluZm8pOworCisgIC8vIFJlZ2lzdGVyIHRoZSBjb2RlIGVtaXR0ZXIuCisgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3RlckNvZGVFbWl0dGVyKFRoZVg4Nl8zMlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlWDg2XzMyTUNDb2RlRW1pdHRlcik7CisgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3RlckNvZGVFbWl0dGVyKFRoZVg4Nl82NFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlWDg2XzY0TUNDb2RlRW1pdHRlcik7CisKKyAgLy8gUmVnaXN0ZXIgdGhlIGFzbSBiYWNrZW5kLgorICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJBc21CYWNrZW5kKFRoZVg4Nl8zMlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVYODZfMzJBc21CYWNrZW5kKTsKKyAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyQXNtQmFja2VuZChUaGVYODZfNjRUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlWDg2XzY0QXNtQmFja2VuZCk7CisKKyAgLy8gUmVnaXN0ZXIgdGhlIG9iamVjdCBzdHJlYW1lci4KKyAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyT2JqZWN0U3RyZWFtZXIoVGhlWDg2XzMyVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNQ1N0cmVhbWVyKTsKKyAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyT2JqZWN0U3RyZWFtZXIoVGhlWDg2XzY0VGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNQ1N0cmVhbWVyKTsKK30KKworCitYODZfMzJUYXJnZXRNYWNoaW5lOjpYODZfMzJUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJlRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpCisgIDogWDg2VGFyZ2V0TWFjaGluZShULCBUVCwgRlMsIGZhbHNlKSB7Cit9CisKKworWDg2XzY0VGFyZ2V0TWFjaGluZTo6WDg2XzY0VGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKQorICA6IFg4NlRhcmdldE1hY2hpbmUoVCwgVFQsIEZTLCB0cnVlKSB7Cit9CisKKy8vLyBYODZUYXJnZXRNYWNoaW5lIGN0b3IgLSBDcmVhdGUgYW4gWDg2IHRhcmdldC4KKy8vLworWDg2VGFyZ2V0TWFjaGluZTo6WDg2VGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGUywgYm9vbCBpczY0Qml0KQorICA6IExMVk1UYXJnZXRNYWNoaW5lKFQsIFRUKSwgCisgICAgU3VidGFyZ2V0KFRULCBGUywgaXM2NEJpdCksCisgICAgRGF0YUxheW91dChTdWJ0YXJnZXQuZ2V0RGF0YUxheW91dCgpKSwKKyAgICBGcmFtZUluZm8oVGFyZ2V0RnJhbWVJbmZvOjpTdGFja0dyb3dzRG93biwKKyAgICAgICAgICAgICAgU3VidGFyZ2V0LmdldFN0YWNrQWxpZ25tZW50KCksCisgICAgICAgICAgICAgIChTdWJ0YXJnZXQuaXNUYXJnZXRXaW42NCgpID8gLTQwIDoKKyAgICAgICAgICAgICAgIChTdWJ0YXJnZXQuaXM2NEJpdCgpID8gLTggOiAtNCkpKSwKKyAgICBJbnN0ckluZm8oKnRoaXMpLCBKSVRJbmZvKCp0aGlzKSwgVExJbmZvKCp0aGlzKSwgVFNJbmZvKCp0aGlzKSB7CisgIERlZlJlbG9jTW9kZWwgPSBnZXRSZWxvY2F0aW9uTW9kZWwoKTsKKyAgICAgIAorICAvLyBJZiBubyByZWxvY2F0aW9uIG1vZGVsIHdhcyBwaWNrZWQsIGRlZmF1bHQgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0YXJnZXQuCisgIGlmIChnZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6RGVmYXVsdCkgeworICAgIGlmICghU3VidGFyZ2V0LmlzVGFyZ2V0RGFyd2luKCkpCisgICAgICBzZXRSZWxvY2F0aW9uTW9kZWwoUmVsb2M6OlN0YXRpYyk7CisgICAgZWxzZSBpZiAoU3VidGFyZ2V0LmlzNjRCaXQoKSkKKyAgICAgIHNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6UElDXyk7CisgICAgZWxzZQorICAgICAgc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpEeW5hbWljTm9QSUMpOworICB9CisKKyAgYXNzZXJ0KGdldFJlbG9jYXRpb25Nb2RlbCgpICE9IFJlbG9jOjpEZWZhdWx0ICYmCisgICAgICAgICAiUmVsb2NhdGlvbiBtb2RlIG5vdCBwaWNrZWQiKTsKKworICAvLyBFTEYgYW5kIFg4Ni02NCBkb24ndCBoYXZlIGEgZGlzdGluY3QgRHluYW1pY05vUElDIG1vZGVsLiAgRHluYW1pY05vUElDCisgIC8vIGlzIGRlZmluZWQgYXMgYSBtb2RlbCBmb3IgY29kZSB3aGljaCBtYXkgYmUgdXNlZCBpbiBzdGF0aWMgb3IgZHluYW1pYworICAvLyBleGVjdXRhYmxlcyBidXQgbm90IG5lY2Vzc2FyaWx5IGEgc2hhcmVkIGxpYnJhcnkuIE9uIFg4Ni0zMiB3ZSBqdXN0CisgIC8vIGNvbXBpbGUgaW4gLXN0YXRpYyBtb2RlLCBpbiB4ODYtNjQgd2UgdXNlIFBJQy4KKyAgaWYgKGdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpEeW5hbWljTm9QSUMpIHsKKyAgICBpZiAoaXM2NEJpdCkKKyAgICAgIHNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6UElDXyk7CisgICAgZWxzZSBpZiAoIVN1YnRhcmdldC5pc1RhcmdldERhcndpbigpKQorICAgICAgc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpTdGF0aWMpOworICB9CisKKyAgLy8gSWYgd2UgYXJlIG9uIERhcndpbiwgZGlzYWxsb3cgc3RhdGljIHJlbG9jYXRpb24gbW9kZWwgaW4gWDg2LTY0IG1vZGUsIHNpbmNlCisgIC8vIHRoZSBNYWNoLU8gZmlsZSBmb3JtYXQgZG9lc24ndCBzdXBwb3J0IGl0LgorICBpZiAoZ2V0UmVsb2NhdGlvbk1vZGVsKCkgPT0gUmVsb2M6OlN0YXRpYyAmJgorICAgICAgU3VidGFyZ2V0LmlzVGFyZ2V0RGFyd2luKCkgJiYKKyAgICAgIGlzNjRCaXQpCisgICAgc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpQSUNfKTsKKyAgICAgIAorICAvLyBEZXRlcm1pbmUgdGhlIFBJQ1N0eWxlIGJhc2VkIG9uIHRoZSB0YXJnZXQgc2VsZWN0ZWQuCisgIGlmIChnZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6U3RhdGljKSB7CisgICAgLy8gVW5sZXNzIHdlJ3JlIGluIFBJQyBvciBEeW5hbWljTm9QSUMgbW9kZSwgc2V0IHRoZSBQSUMgc3R5bGUgdG8gTm9uZS4KKyAgICBTdWJ0YXJnZXQuc2V0UElDU3R5bGUoUElDU3R5bGVzOjpOb25lKTsKKyAgfSBlbHNlIGlmIChTdWJ0YXJnZXQuaXNUYXJnZXRDeWdNaW5nKCkpIHsKKyAgICBTdWJ0YXJnZXQuc2V0UElDU3R5bGUoUElDU3R5bGVzOjpOb25lKTsKKyAgfSBlbHNlIGlmIChTdWJ0YXJnZXQuaXNUYXJnZXREYXJ3aW4oKSkgeworICAgIGlmIChTdWJ0YXJnZXQuaXM2NEJpdCgpKQorICAgICAgU3VidGFyZ2V0LnNldFBJQ1N0eWxlKFBJQ1N0eWxlczo6UklQUmVsKTsKKyAgICBlbHNlIGlmIChnZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6UElDXykKKyAgICAgIFN1YnRhcmdldC5zZXRQSUNTdHlsZShQSUNTdHlsZXM6OlN0dWJQSUMpOworICAgIGVsc2UgeworICAgICAgYXNzZXJ0KGdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpEeW5hbWljTm9QSUMpOworICAgICAgU3VidGFyZ2V0LnNldFBJQ1N0eWxlKFBJQ1N0eWxlczo6U3R1YkR5bmFtaWNOb1BJQyk7CisgICAgfQorICB9CisgICAgICAKKyAgLy8gRmluYWxseSwgaWYgd2UgaGF2ZSAibm9uZSIgYXMgb3VyIFBJQyBzdHlsZSwgZm9yY2UgdG8gc3RhdGljIG1vZGUuCisgIGlmIChTdWJ0YXJnZXQuZ2V0UElDU3R5bGUoKSA9PSBQSUNTdHlsZXM6Ok5vbmUpCisgICAgc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpTdGF0aWMpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFzcyBQaXBlbGluZSBDb25maWd1cmF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitib29sIFg4NlRhcmdldE1hY2hpbmU6OmFkZEluc3RTZWxlY3RvcihQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgLy8gSW5zdGFsbCBhbiBpbnN0cnVjdGlvbiBzZWxlY3Rvci4KKyAgUE0uYWRkKGNyZWF0ZVg4NklTZWxEYWcoKnRoaXMsIE9wdExldmVsKSk7CisKKyAgLy8gRm9yIDMyLWJpdCwgcHJlcGVuZCBpbnN0cnVjdGlvbnMgdG8gc2V0IHRoZSAiZ2xvYmFsIGJhc2UgcmVnIiBmb3IgUElDLgorICBpZiAoIVN1YnRhcmdldC5pczY0Qml0KCkpCisgICAgUE0uYWRkKGNyZWF0ZUdsb2JhbEJhc2VSZWdQYXNzKCkpOworCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBYODZUYXJnZXRNYWNoaW5lOjphZGRQcmVSZWdBbGxvYyhQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgeworICBQTS5hZGQoY3JlYXRlWDg2TWF4U3RhY2tBbGlnbm1lbnRIZXVyaXN0aWNQYXNzKCkpOworICByZXR1cm4gZmFsc2U7ICAvLyAtcHJpbnQtbWFjaGluZWluc3RyIHNob3VsZG4ndCBwcmludCBhZnRlciB0aGlzLgorfQorCitib29sIFg4NlRhcmdldE1hY2hpbmU6OmFkZFBvc3RSZWdBbGxvYyhQYXNzTWFuYWdlckJhc2UgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgUE0uYWRkKGNyZWF0ZVg4NkZsb2F0aW5nUG9pbnRTdGFja2lmaWVyUGFzcygpKTsKKyAgcmV0dXJuIHRydWU7ICAvLyAtcHJpbnQtbWFjaGluZWluc3RyIHNob3VsZCBwcmludCBhZnRlciB0aGlzLgorfQorCitib29sIFg4NlRhcmdldE1hY2hpbmU6OmFkZFByZUVtaXRQYXNzKFBhc3NNYW5hZ2VyQmFzZSAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSB7CisgIGlmIChPcHRMZXZlbCAhPSBDb2RlR2VuT3B0OjpOb25lICYmIFN1YnRhcmdldC5oYXNTU0UyKCkpIHsKKyAgICBQTS5hZGQoY3JlYXRlU1NFRG9tYWluRml4UGFzcygpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgWDg2VGFyZ2V0TWFjaGluZTo6YWRkQ29kZUVtaXR0ZXIoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpIHsKKyAgLy8gRklYTUU6IE1vdmUgdGhpcyB0byBUYXJnZXRKSVRJbmZvIQorICAvLyBPbiBEYXJ3aW4sIGRvIG5vdCBvdmVycmlkZSA2NC1iaXQgc2V0dGluZyBtYWRlIGluIFg4NlRhcmdldE1hY2hpbmUoKS4KKyAgaWYgKERlZlJlbG9jTW9kZWwgPT0gUmVsb2M6OkRlZmF1bHQgJiYgCisgICAgICAoIVN1YnRhcmdldC5pc1RhcmdldERhcndpbigpIHx8ICFTdWJ0YXJnZXQuaXM2NEJpdCgpKSkgeworICAgIHNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6U3RhdGljKTsKKyAgICBTdWJ0YXJnZXQuc2V0UElDU3R5bGUoUElDU3R5bGVzOjpOb25lKTsKKyAgfQorICAKKworICBQTS5hZGQoY3JlYXRlWDg2SklUQ29kZUVtaXR0ZXJQYXNzKCp0aGlzLCBKQ0UpKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgWDg2VGFyZ2V0TWFjaGluZTo6c2V0Q29kZU1vZGVsRm9yU3RhdGljKCkgeworCisgICAgaWYgKGdldENvZGVNb2RlbCgpICE9IENvZGVNb2RlbDo6RGVmYXVsdCkgcmV0dXJuOworCisgICAgLy8gRm9yIHN0YXRpYyBjb2RlZ2VuLCBpZiB3ZSdyZSBub3QgYWxyZWFkeSBzZXQsIHVzZSBTbWFsbCBjb2RlZ2VuLgorICAgIHNldENvZGVNb2RlbChDb2RlTW9kZWw6OlNtYWxsKTsKK30KKworCit2b2lkIFg4NlRhcmdldE1hY2hpbmU6OnNldENvZGVNb2RlbEZvckpJVCgpIHsKKworICBpZiAoZ2V0Q29kZU1vZGVsKCkgIT0gQ29kZU1vZGVsOjpEZWZhdWx0KSByZXR1cm47CisKKyAgLy8gNjQtYml0IEpJVCBwbGFjZXMgZXZlcnl0aGluZyBpbiB0aGUgc2FtZSBidWZmZXIgZXhjZXB0IGV4dGVybmFsIGZ1bmN0aW9ucy4KKyAgaWYgKFN1YnRhcmdldC5pczY0Qml0KCkpCisgICAgc2V0Q29kZU1vZGVsKENvZGVNb2RlbDo6TGFyZ2UpOworICBlbHNlCisgICAgc2V0Q29kZU1vZGVsKENvZGVNb2RlbDo6U21hbGwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2VGFyZ2V0TWFjaGluZS5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YODYvWDg2VGFyZ2V0TWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmI1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1g4Ni9YODZUYXJnZXRNYWNoaW5lLmgKQEAgLTAsMCArMSw5MiBAQAorLy89PT0tLSBYODZUYXJnZXRNYWNoaW5lLmggLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgdGhlIFg4NiAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFg4NiBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRNYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWDg2VEFSR0VUTUFDSElORV9ICisjZGVmaW5lIFg4NlRBUkdFVE1BQ0hJTkVfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJYODYuaCIKKyNpbmNsdWRlICJYODZJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJYODZKSVRJbmZvLmgiCisjaW5jbHVkZSAiWDg2U3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiWDg2SVNlbExvd2VyaW5nLmgiCisjaW5jbHVkZSAiWDg2U2VsZWN0aW9uREFHSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIAorY2xhc3MgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOworCitjbGFzcyBYODZUYXJnZXRNYWNoaW5lIDogcHVibGljIExMVk1UYXJnZXRNYWNoaW5lIHsKKyAgWDg2U3VidGFyZ2V0ICAgICAgU3VidGFyZ2V0OworICBjb25zdCBUYXJnZXREYXRhICBEYXRhTGF5b3V0OyAvLyBDYWxjdWxhdGVzIHR5cGUgc2l6ZSAmIGFsaWdubWVudAorICBUYXJnZXRGcmFtZUluZm8gICBGcmFtZUluZm87CisgIFg4Nkluc3RySW5mbyAgICAgIEluc3RySW5mbzsKKyAgWDg2SklUSW5mbyAgICAgICAgSklUSW5mbzsKKyAgWDg2VGFyZ2V0TG93ZXJpbmcgVExJbmZvOworICBYODZTZWxlY3Rpb25EQUdJbmZvIFRTSW5mbzsKKyAgUmVsb2M6Ok1vZGVsICAgICAgRGVmUmVsb2NNb2RlbDsgLy8gUmVsb2MgbW9kZWwgYmVmb3JlIGl0J3Mgb3ZlcnJpZGRlbi4KKworcHJpdmF0ZToKKyAgLy8gV2UgaGF2ZSBzcGVjaWZpYyBkZWZhdWx0cyBmb3IgWDg2LgorICB2aXJ0dWFsIHZvaWQgc2V0Q29kZU1vZGVsRm9ySklUKCk7CisgIHZpcnR1YWwgdm9pZCBzZXRDb2RlTW9kZWxGb3JTdGF0aWMoKTsKKyAgCitwdWJsaWM6CisgIFg4NlRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsIAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGUywgYm9vbCBpczY0Qml0KTsKKworICB2aXJ0dWFsIGNvbnN0IFg4Nkluc3RySW5mbyAgICAgKmdldEluc3RySW5mbygpIGNvbnN0IHsgcmV0dXJuICZJbnN0ckluZm87IH0KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRGcmFtZUluZm8gICpnZXRGcmFtZUluZm8oKSBjb25zdCB7IHJldHVybiAmRnJhbWVJbmZvOyB9CisgIHZpcnR1YWwgICAgICAgWDg2SklUSW5mbyAgICAgICAqZ2V0SklUSW5mbygpICAgICAgICAgeyByZXR1cm4gJkpJVEluZm87IH0KKyAgdmlydHVhbCBjb25zdCBYODZTdWJ0YXJnZXQgICAgICpnZXRTdWJ0YXJnZXRJbXBsKCkgY29uc3R7IHJldHVybiAmU3VidGFyZ2V0OyB9CisgIHZpcnR1YWwgY29uc3QgWDg2VGFyZ2V0TG93ZXJpbmcgKmdldFRhcmdldExvd2VyaW5nKCkgY29uc3QgeyAKKyAgICByZXR1cm4gJlRMSW5mbzsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IFg4NlNlbGVjdGlvbkRBR0luZm8gKmdldFNlbGVjdGlvbkRBR0luZm8oKSBjb25zdCB7IAorICAgIHJldHVybiAmVFNJbmZvOworICB9CisgIHZpcnR1YWwgY29uc3QgWDg2UmVnaXN0ZXJJbmZvICAqZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeworICAgIHJldHVybiAmSW5zdHJJbmZvLmdldFJlZ2lzdGVySW5mbygpOworICB9CisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0RGF0YSAgICAgICAqZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuICZEYXRhTGF5b3V0OyB9CisKKyAgLy8gU2V0IHVwIHRoZSBwYXNzIHBpcGVsaW5lLgorICB2aXJ0dWFsIGJvb2wgYWRkSW5zdFNlbGVjdG9yKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKyAgdmlydHVhbCBib29sIGFkZFByZVJlZ0FsbG9jKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKyAgdmlydHVhbCBib29sIGFkZFBvc3RSZWdBbGxvYyhQYXNzTWFuYWdlckJhc2UgJlBNLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisgIHZpcnR1YWwgYm9vbCBhZGRQcmVFbWl0UGFzcyhQYXNzTWFuYWdlckJhc2UgJlBNLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisgIHZpcnR1YWwgYm9vbCBhZGRDb2RlRW1pdHRlcihQYXNzTWFuYWdlckJhc2UgJlBNLCBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVENvZGVFbWl0dGVyICZKQ0UpOworfTsKKworLy8vIFg4Nl8zMlRhcmdldE1hY2hpbmUgLSBYODYgMzItYml0IHRhcmdldCBtYWNoaW5lLgorLy8vCitjbGFzcyBYODZfMzJUYXJnZXRNYWNoaW5lIDogcHVibGljIFg4NlRhcmdldE1hY2hpbmUgeworcHVibGljOgorICBYODZfMzJUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgY29uc3Qgc3RkOjpzdHJpbmcgJk0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKK307CisKKy8vLyBYODZfNjRUYXJnZXRNYWNoaW5lIC0gWDg2IDY0LWJpdCB0YXJnZXQgbWFjaGluZS4KKy8vLworY2xhc3MgWDg2XzY0VGFyZ2V0TWFjaGluZSA6IHB1YmxpYyBYODZUYXJnZXRNYWNoaW5lIHsKK3B1YmxpYzoKKyAgWDg2XzY0VGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL0FzbVByaW50ZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3YzJmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvQXNtUHJpbnRlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4gKQorCithZGRfbGx2bV9saWJyYXJ5KExMVk1YQ29yZUFzbVByaW50ZXIKKyAgWENvcmVBc21QcmludGVyLmNwcAorICApCithZGRfZGVwZW5kZW5jaWVzKExMVk1YQ29yZUFzbVByaW50ZXIgWENvcmVDb2RlR2VuVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9Bc21QcmludGVyL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9Bc21QcmludGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MWY3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL0FzbVByaW50ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIyM9PT0tIGxpYi9UYXJnZXQvWENvcmUvQXNtUHJpbnRlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNWENvcmVBc21QcmludGVyCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyBYQ29yZSB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFAuRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4gLUkkKFBST0pfU1JDX0RJUikvLi4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvQXNtUHJpbnRlci9YQ29yZUFzbVByaW50ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9Bc21QcmludGVyL1hDb3JlQXNtUHJpbnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwNmRkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvQXNtUHJpbnRlci9YQ29yZUFzbVByaW50ZXIuY3BwCkBAIC0wLDAgKzEsMjgwIEBACisvLz09PS0tIFhDb3JlQXNtUHJpbnRlci5jcHAgLSBYQ29yZSBMTFZNIGFzc2VtYmx5IHdyaXRlciAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHByaW50ZXIgdGhhdCBjb252ZXJ0cyBmcm9tIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorLy8gb2YgbWFjaGluZS1kZXBlbmRlbnQgTExWTSBjb2RlIHRvIHRoZSBYQVMtZm9ybWF0IFhDb3JlIGFzc2VtYmx5IGxhbmd1YWdlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXNtLXByaW50ZXIiCisjaW5jbHVkZSAiWENvcmUuaCIKKyNpbmNsdWRlICJYQ29yZUluc3RySW5mby5oIgorI2luY2x1ZGUgIlhDb3JlU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAiWENvcmVNQ0FzbUluZm8uaCIKKyNpbmNsdWRlICJYQ29yZVRhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vQXNtUHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L01hbmdsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0cnkuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgY2w6Om9wdDx1bnNpZ25lZD4gTWF4VGhyZWFkcygieGNvcmUtbWF4LXRocmVhZHMiLCBjbDo6T3B0aW9uYWwsCisgIGNsOjpkZXNjKCJNYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIChmb3IgZW11bGF0aW9uIHRocmVhZC1sb2NhbCBzdG9yYWdlKSIpLAorICBjbDo6SGlkZGVuLAorICBjbDo6dmFsdWVfZGVzYygibnVtYmVyIiksCisgIGNsOjppbml0KDgpKTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgWENvcmVBc21QcmludGVyIDogcHVibGljIEFzbVByaW50ZXIgeworICAgIGNvbnN0IFhDb3JlU3VidGFyZ2V0ICZTdWJ0YXJnZXQ7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBYQ29yZUFzbVByaW50ZXIoVGFyZ2V0TWFjaGluZSAmVE0sIE1DU3RyZWFtZXIgJlN0cmVhbWVyKQorICAgICAgOiBBc21QcmludGVyKFRNLCBTdHJlYW1lciksIFN1YnRhcmdldChUTS5nZXRTdWJ0YXJnZXQ8WENvcmVTdWJ0YXJnZXQ+KCkpe30KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UGFzc05hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIlhDb3JlIEFzc2VtYmx5IFByaW50ZXIiOworICAgIH0KKworICAgIHZvaWQgcHJpbnRNZW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwgcmF3X29zdHJlYW0gJk8pOworICAgIHZvaWQgcHJpbnRJbmxpbmVKVChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0aXZlID0gIi5qbXB0YWJsZSIpOworICAgIHZvaWQgcHJpbnRJbmxpbmVKVDMyKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwgcmF3X29zdHJlYW0gJk8pIHsKKyAgICAgIHByaW50SW5saW5lSlQoTUksIG9wTnVtLCBPLCAiLmptcHRhYmxlMzIiKTsKKyAgICB9CisgICAgdm9pZCBwcmludE9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgaW50IG9wTnVtLCByYXdfb3N0cmVhbSAmTyk7CisgICAgYm9vbCBQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pOworCisgICAgdm9pZCBlbWl0QXJyYXlCb3VuZChNQ1N5bWJvbCAqU3ltLCBjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpOworICAgIHZpcnR1YWwgdm9pZCBFbWl0R2xvYmFsVmFyaWFibGUoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKTsKKworICAgIHZvaWQgcHJpbnRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmTyk7IC8vIGF1dG9nZW4nZC4KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0UmVnaXN0ZXJOYW1lKHVuc2lnbmVkIFJlZ05vKTsKKworICAgIHZvaWQgRW1pdEZ1bmN0aW9uRW50cnlMYWJlbCgpOworICAgIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworICAgIHZvaWQgRW1pdEZ1bmN0aW9uQm9keUVuZCgpOworICB9OworfSAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisjaW5jbHVkZSAiWENvcmVHZW5Bc21Xcml0ZXIuaW5jIgorCit2b2lkIFhDb3JlQXNtUHJpbnRlcjo6ZW1pdEFycmF5Qm91bmQoTUNTeW1ib2wgKlN5bSwgY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKSB7CisgIGFzc2VydCgoKEdWLT5oYXNFeHRlcm5hbExpbmthZ2UoKSB8fAorICAgIEdWLT5oYXNXZWFrTGlua2FnZSgpKSB8fAorICAgIEdWLT5oYXNMaW5rT25jZUxpbmthZ2UoKSkgJiYgIlVuZXhwZWN0ZWQgbGlua2FnZSIpOworICBpZiAoY29uc3QgQXJyYXlUeXBlICpBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KAorICAgIGNhc3Q8UG9pbnRlclR5cGU+KEdWLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSkgeworICAgIE91dFN0cmVhbWVyLkVtaXRTeW1ib2xBdHRyaWJ1dGUoU3ltLCBNQ1NBX0dsb2JhbCk7CisgICAgLy8gRklYTUU6IE1DU3RyZWFtZXJpemUuCisgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoU3RyaW5nUmVmKCIuZ2xvYm91bmQiKSk7CisgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIlx0LnNldFx0IiArIFR3aW5lKFN5bS0+Z2V0TmFtZSgpKSk7CisgICAgT3V0U3RyZWFtZXIuRW1pdFJhd1RleHQoIi5nbG9ib3VuZCwiICsgVHdpbmUoQVR5LT5nZXROdW1FbGVtZW50cygpKSk7CisgICAgaWYgKEdWLT5oYXNXZWFrTGlua2FnZSgpIHx8IEdWLT5oYXNMaW5rT25jZUxpbmthZ2UoKSkgeworICAgICAgLy8gVE9ETyBVc2UgQ09NREFUIGdyb3VwcyBmb3IgTGlua09uY2VMaW5rYWdlCisgICAgICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dChNQUktPmdldFdlYWtEZWZEaXJlY3RpdmUoKSArVHdpbmUoU3ltLT5nZXROYW1lKCkpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5nbG9ib3VuZCIpOworICAgIH0KKyAgfQorfQorCit2b2lkIFhDb3JlQXNtUHJpbnRlcjo6RW1pdEdsb2JhbFZhcmlhYmxlKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgeworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIHNwZWNpYWwgZ2xvYmFsIHVzZWQgYnkgTExWTSwgaWYgc28sIGVtaXQgaXQuCisgIGlmICghR1YtPmhhc0luaXRpYWxpemVyKCkgfHwKKyAgICAgIEVtaXRTcGVjaWFsTExWTUdsb2JhbChHVikpCisgICAgcmV0dXJuOworCisgIGNvbnN0IFRhcmdldERhdGEgKlREID0gVE0uZ2V0VGFyZ2V0RGF0YSgpOworICBPdXRTdHJlYW1lci5Td2l0Y2hTZWN0aW9uKGdldE9iakZpbGVMb3dlcmluZygpLlNlY3Rpb25Gb3JHbG9iYWwoR1YsIE1hbmcsVE0pKTsKKworICAKKyAgTUNTeW1ib2wgKkdWU3ltID0gTWFuZy0+Z2V0U3ltYm9sKEdWKTsKKyAgQ29uc3RhbnQgKkMgPSBHVi0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgdW5zaWduZWQgQWxpZ24gPSAodW5zaWduZWQpVEQtPmdldFByZWZlcnJlZFR5cGVBbGlnbm1lbnRTaGlmdChDLT5nZXRUeXBlKCkpOworICAKKyAgLy8gTWFyayB0aGUgc3RhcnQgb2YgdGhlIGdsb2JhbAorICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHQuY2NfdG9wICIgKyBUd2luZShHVlN5bS0+Z2V0TmFtZSgpKSArICIuZGF0YSwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZTeW0tPmdldE5hbWUoKSk7CisKKyAgc3dpdGNoIChHVi0+Z2V0TGlua2FnZSgpKSB7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkFwcGVuZGluZ0xpbmthZ2U6CisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJBcHBlbmRpbmdMaW5rYWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB0YXJnZXQhIik7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkxpbmtPbmNlQW55TGlua2FnZToKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua09uY2VPRFJMaW5rYWdlOgorICBjYXNlIEdsb2JhbFZhbHVlOjpXZWFrQW55TGlua2FnZToKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6V2Vha09EUkxpbmthZ2U6CisgIGNhc2UgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZToKKyAgICBlbWl0QXJyYXlCb3VuZChHVlN5bSwgR1YpOworICAgIE91dFN0cmVhbWVyLkVtaXRTeW1ib2xBdHRyaWJ1dGUoR1ZTeW0sIE1DU0FfR2xvYmFsKTsKKworICAgIC8vIFRPRE8gVXNlIENPTURBVCBncm91cHMgZm9yIExpbmtPbmNlTGlua2FnZQorICAgIGlmIChHVi0+aGFzV2Vha0xpbmthZ2UoKSB8fCBHVi0+aGFzTGlua09uY2VMaW5rYWdlKCkpCisgICAgICBPdXRTdHJlYW1lci5FbWl0U3ltYm9sQXR0cmlidXRlKEdWU3ltLCBNQ1NBX1dlYWspOworICAgIC8vIEZBTEwgVEhST1VHSAorICBjYXNlIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2U6CisgIGNhc2UgR2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlOgorICAgIGJyZWFrOworICBjYXNlIEdsb2JhbFZhbHVlOjpETExJbXBvcnRMaW5rYWdlOgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkRMTEltcG9ydCBsaW5rYWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB0YXJnZXQhIik7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkRMTEV4cG9ydExpbmthZ2U6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiRExMRXhwb3J0IGxpbmthZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHRhcmdldCEiKTsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGxpbmthZ2UgdHlwZSEiKTsKKyAgfQorCisgIEVtaXRBbGlnbm1lbnQoQWxpZ24gPiAyID8gQWxpZ24gOiAyLCBHVik7CisgIAorICB1bnNpZ25lZCBTaXplID0gVEQtPmdldFR5cGVBbGxvY1NpemUoQy0+Z2V0VHlwZSgpKTsKKyAgaWYgKEdWLT5pc1RocmVhZExvY2FsKCkpIHsKKyAgICBTaXplICo9IE1heFRocmVhZHM7CisgIH0KKyAgaWYgKE1BSS0+aGFzRG90VHlwZURvdFNpemVEaXJlY3RpdmUoKSkgeworICAgIE91dFN0cmVhbWVyLkVtaXRTeW1ib2xBdHRyaWJ1dGUoR1ZTeW0sIE1DU0FfRUxGX1R5cGVPYmplY3QpOworICAgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5zaXplICIgKyBUd2luZShHVlN5bS0+Z2V0TmFtZSgpKSArICIsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoU2l6ZSkpOworICB9CisgIE91dFN0cmVhbWVyLkVtaXRMYWJlbChHVlN5bSk7CisgIAorICBFbWl0R2xvYmFsQ29uc3RhbnQoQyk7CisgIGlmIChHVi0+aXNUaHJlYWRMb2NhbCgpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IE1heFRocmVhZHM7ICsraSkKKyAgICAgIEVtaXRHbG9iYWxDb25zdGFudChDKTsKKyAgfQorICAvLyBUaGUgQUJJIHJlcXVpcmVzIHRoYXQgdW5zaWduZWQgc2NhbGFyIHR5cGVzIHNtYWxsZXIgdGhhbiAzMiBiaXRzCisgIC8vIGFyZSBwYWRkZWQgdG8gMzIgYml0cy4KKyAgaWYgKFNpemUgPCA0KQorICAgIE91dFN0cmVhbWVyLkVtaXRaZXJvcyg0IC0gU2l6ZSwgMCk7CisgIAorICAvLyBNYXJrIHRoZSBlbmQgb2YgdGhlIGdsb2JhbAorICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHQuY2NfYm90dG9tICIgKyBUd2luZShHVlN5bS0+Z2V0TmFtZSgpKSArICIuZGF0YSIpOworfQorCisvLy8gRW1pdEZ1bmN0aW9uQm9keUVuZCAtIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZW1pdCBzdHVmZiBhZnRlcgorLy8vIHRoZSBsYXN0IGJhc2ljIGJsb2NrIGluIHRoZSBmdW5jdGlvbi4KK3ZvaWQgWENvcmVBc21QcmludGVyOjpFbWl0RnVuY3Rpb25Cb2R5RW5kKCkgeworICAvLyBFbWl0IGZ1bmN0aW9uIGVuZCBkaXJlY3RpdmVzCisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KCJcdC5jY19ib3R0b20gIiArIFR3aW5lKEN1cnJlbnRGblN5bS0+Z2V0TmFtZSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIuZnVuY3Rpb24iKTsKK30KKwordm9pZCBYQ29yZUFzbVByaW50ZXI6OkVtaXRGdW5jdGlvbkVudHJ5TGFiZWwoKSB7CisgIC8vIE1hcmsgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbgorICBPdXRTdHJlYW1lci5FbWl0UmF3VGV4dCgiXHQuY2NfdG9wICIgKyBUd2luZShDdXJyZW50Rm5TeW0tPmdldE5hbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiLmZ1bmN0aW9uLCIgKyBDdXJyZW50Rm5TeW0tPmdldE5hbWUoKSk7CisgIE91dFN0cmVhbWVyLkVtaXRMYWJlbChDdXJyZW50Rm5TeW0pOworfQorCit2b2lkIFhDb3JlQXNtUHJpbnRlcjo6cHJpbnRNZW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgcHJpbnRPcGVyYW5kKE1JLCBvcE51bSwgTyk7CisgIAorICBpZiAoTUktPmdldE9wZXJhbmQob3BOdW0rMSkuaXNJbW0oKSAmJiBNSS0+Z2V0T3BlcmFuZChvcE51bSsxKS5nZXRJbW0oKSA9PSAwKQorICAgIHJldHVybjsKKyAgCisgIE8gPDwgIisiOworICBwcmludE9wZXJhbmQoTUksIG9wTnVtKzEsIE8pOworfQorCit2b2lkIFhDb3JlQXNtUHJpbnRlcjo6CitwcmludElubGluZUpUKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGludCBvcE51bSwgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RpdmUpIHsKKyAgdW5zaWduZWQgSlRJID0gTUktPmdldE9wZXJhbmQob3BOdW0pLmdldEluZGV4KCk7CisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBNSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICBjb25zdCBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqTUpUSSA9IE1GLT5nZXRKdW1wVGFibGVJbmZvKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gJkpUID0gTUpUSS0+Z2V0SnVtcFRhYmxlcygpOworICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+ICZKVEJCcyA9IEpUW0pUSV0uTUJCczsKKyAgTyA8PCAiXHQiIDw8IGRpcmVjdGl2ZSA8PCAiICI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBKVEJCcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IEpUQkJzW2ldOworICAgIGlmIChpID4gMCkKKyAgICAgIE8gPDwgIiwiOworICAgIE8gPDwgKk1CQi0+Z2V0U3ltYm9sKCk7CisgIH0KK30KKwordm9pZCBYQ29yZUFzbVByaW50ZXI6OnByaW50T3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgb3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IE1JLT5nZXRPcGVyYW5kKG9wTnVtKTsKKyAgc3dpdGNoIChNTy5nZXRUeXBlKCkpIHsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fUmVnaXN0ZXI6CisgICAgTyA8PCBnZXRSZWdpc3Rlck5hbWUoTU8uZ2V0UmVnKCkpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgTyA8PCBNTy5nZXRJbW0oKTsKKyAgICBicmVhazsKKyAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fTWFjaGluZUJhc2ljQmxvY2s6CisgICAgTyA8PCAqTU8uZ2V0TUJCKCktPmdldFN5bWJvbCgpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOgorICAgIE8gPDwgKk1hbmctPmdldFN5bWJvbChNTy5nZXRHbG9iYWwoKSk7CisgICAgYnJlYWs7CisgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0V4dGVybmFsU3ltYm9sOgorICAgIE8gPDwgTU8uZ2V0U3ltYm9sTmFtZSgpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19Db25zdGFudFBvb2xJbmRleDoKKyAgICBPIDw8IE1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJDUEkiIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkKKyAgICAgIDw8ICdfJyA8PCBNTy5nZXRJbmRleCgpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19KdW1wVGFibGVJbmRleDoKKyAgICBPIDw8IE1BSS0+Z2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIDw8ICJKVEkiIDw8IGdldEZ1bmN0aW9uTnVtYmVyKCkKKyAgICAgIDw8ICdfJyA8PCBNTy5nZXRJbmRleCgpOworICAgIGJyZWFrOworICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19CbG9ja0FkZHJlc3M6CisgICAgTyA8PCAqR2V0QmxvY2tBZGRyZXNzU3ltYm9sKE1PLmdldEJsb2NrQWRkcmVzcygpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJub3QgaW1wbGVtZW50ZWQiKTsKKyAgfQorfQorCisvLy8gUHJpbnRBc21PcGVyYW5kIC0gUHJpbnQgb3V0IGFuIG9wZXJhbmQgZm9yIGFuIGlubGluZSBhc20gZXhwcmVzc2lvbi4KKy8vLworYm9vbCBYQ29yZUFzbVByaW50ZXI6OlByaW50QXNtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk8pIHsKKyAgcHJpbnRPcGVyYW5kKE1JLCBPcE5vLCBPKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFhDb3JlQXNtUHJpbnRlcjo6RW1pdEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgU21hbGxTdHJpbmc8MTI4PiBTdHI7CisgIHJhd19zdmVjdG9yX29zdHJlYW0gTyhTdHIpOworCisgIC8vIENoZWNrIGZvciBtb3YgbW5lbW9uaWMKKyAgaWYgKE1JLT5nZXRPcGNvZGUoKSA9PSBYQ29yZTo6QUREXzJydXMgJiYgIU1JLT5nZXRPcGVyYW5kKDIpLmdldEltbSgpKQorICAgIE8gPDwgIlx0bW92ICIgPDwgZ2V0UmVnaXN0ZXJOYW1lKE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpKSA8PCAiLCAiCisgICAgICA8PCBnZXRSZWdpc3Rlck5hbWUoTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpOworICBlbHNlCisgICAgcHJpbnRJbnN0cnVjdGlvbihNSSwgTyk7CisgIE91dFN0cmVhbWVyLkVtaXRSYXdUZXh0KE8uc3RyKCkpOworfQorCisvLyBGb3JjZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVYQ29yZUFzbVByaW50ZXIoKSB7IAorICBSZWdpc3RlckFzbVByaW50ZXI8WENvcmVBc21QcmludGVyPiBYKFRoZVhDb3JlVGFyZ2V0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjM1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjQgQEAKK3NldChMTFZNX1RBUkdFVF9ERUZJTklUSU9OUyBYQ29yZS50ZCkKKwordGFibGVnZW4oWENvcmVHZW5SZWdpc3RlckluZm8uaC5pbmMgLWdlbi1yZWdpc3Rlci1kZXNjLWhlYWRlcikKK3RhYmxlZ2VuKFhDb3JlR2VuUmVnaXN0ZXJOYW1lcy5pbmMgLWdlbi1yZWdpc3Rlci1lbnVtcykKK3RhYmxlZ2VuKFhDb3JlR2VuUmVnaXN0ZXJJbmZvLmluYyAtZ2VuLXJlZ2lzdGVyLWRlc2MpCit0YWJsZWdlbihYQ29yZUdlbkluc3RyTmFtZXMuaW5jIC1nZW4taW5zdHItZW51bXMpCit0YWJsZWdlbihYQ29yZUdlbkluc3RySW5mby5pbmMgLWdlbi1pbnN0ci1kZXNjKQordGFibGVnZW4oWENvcmVHZW5Bc21Xcml0ZXIuaW5jIC1nZW4tYXNtLXdyaXRlcikKK3RhYmxlZ2VuKFhDb3JlR2VuREFHSVNlbC5pbmMgLWdlbi1kYWctaXNlbCkKK3RhYmxlZ2VuKFhDb3JlR2VuQ2FsbGluZ0NvbnYuaW5jIC1nZW4tY2FsbGluZ2NvbnYpCit0YWJsZWdlbihYQ29yZUdlblN1YnRhcmdldC5pbmMgLWdlbi1zdWJ0YXJnZXQpCisKK2FkZF9sbHZtX3RhcmdldChYQ29yZUNvZGVHZW4KKyAgWENvcmVGcmFtZUluZm8uY3BwCisgIFhDb3JlSW5zdHJJbmZvLmNwcAorICBYQ29yZUlTZWxEQUdUb0RBRy5jcHAKKyAgWENvcmVJU2VsTG93ZXJpbmcuY3BwCisgIFhDb3JlTUNBc21JbmZvLmNwcAorICBYQ29yZVJlZ2lzdGVySW5mby5jcHAKKyAgWENvcmVTdWJ0YXJnZXQuY3BwCisgIFhDb3JlVGFyZ2V0TWFjaGluZS5jcHAKKyAgWENvcmVUYXJnZXRPYmplY3RGaWxlLmNwcAorICBYQ29yZVNlbGVjdGlvbkRBR0luZm8uY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzA5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMjPT09LSBsaWIvVGFyZ2V0L1hDb3JlL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVhDb3JlQ29kZUdlbgorVEFSR0VUID0gWENvcmUKKworIyBNYWtlIHN1cmUgdGhhdCB0YmxnZW4gaXMgcnVuLCBmaXJzdCB0aGluZy4KK0JVSUxUX1NPVVJDRVMgPSBYQ29yZUdlblJlZ2lzdGVySW5mby5oLmluYyBYQ29yZUdlblJlZ2lzdGVyTmFtZXMuaW5jIFwKKyAgICAgICAgICAgICAgICBYQ29yZUdlblJlZ2lzdGVySW5mby5pbmMgWENvcmVHZW5JbnN0ck5hbWVzLmluYyBcCisgICAgICAgICAgICAgICAgWENvcmVHZW5JbnN0ckluZm8uaW5jIFhDb3JlR2VuQXNtV3JpdGVyLmluYyBcCisgICAgICAgICAgICAgICAgWENvcmVHZW5EQUdJU2VsLmluYyBYQ29yZUdlbkNhbGxpbmdDb252LmluYyBcCisJCVhDb3JlR2VuU3VidGFyZ2V0LmluYworCitESVJTID0gQXNtUHJpbnRlciBUYXJnZXRJbmZvCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvUkVBRE1FLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjkyMDViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9SRUFETUUudHh0CkBAIC0wLDAgKzEsNyBAQAorVG8tZG8KKy0tLS0tCisKKyogSW5zdHJ1Y3Rpb24gZW5jb2RpbmdzCisqIFRhaWxjYWxscworKiBJbnZlc3RpZ2F0ZSBsb29wIGFsaWdubWVudAorKiBBZGQgYnVpbHRpbnMKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvVGFyZ2V0SW5mby9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTU2OGRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9UYXJnZXRJbmZvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiApCisKK2FkZF9sbHZtX2xpYnJhcnkoTExWTVhDb3JlSW5mbworICBYQ29yZVRhcmdldEluZm8uY3BwCisgICkKKworYWRkX2RlcGVuZGVuY2llcyhMTFZNWENvcmVJbmZvIFhDb3JlVGFibGVfZ2VuKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9UYXJnZXRJbmZvL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9UYXJnZXRJbmZvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTQwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1RhcmdldEluZm8vTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIyM9PT0tIGxpYi9UYXJnZXQvWENvcmUvVGFyZ2V0SW5mby9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLi8uLi8uLgorTElCUkFSWU5BTUUgPSBMTFZNWENvcmVJbmZvCisKKyMgSGFjazogd2UgbmVlZCB0byBpbmNsdWRlICdtYWluJyB0YXJnZXQgZGlyZWN0b3J5IHRvIGdyYWIgcHJpdmF0ZSBoZWFkZXJzCitDUFBGTEFHUyA9IC1JJChQUk9KX09CSl9ESVIpLy4uIC1JJChQUk9KX1NSQ19ESVIpLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1RhcmdldEluZm8vWENvcmVUYXJnZXRJbmZvLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvVGFyZ2V0SW5mby9YQ29yZVRhcmdldEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTg5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1RhcmdldEluZm8vWENvcmVUYXJnZXRJbmZvLmNwcApAQCAtMCwwICsxLDE5IEBACisvLz09PS0tIFhDb3JlVGFyZ2V0SW5mby5jcHAgLSBYQ29yZSBUYXJnZXQgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiWENvcmUuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFJlZ2lzdHJ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVGFyZ2V0IGxsdm06OlRoZVhDb3JlVGFyZ2V0OworCitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVYQ29yZVRhcmdldEluZm8oKSB7IAorICBSZWdpc3RlclRhcmdldDxUcmlwbGU6Onhjb3JlPiBYKFRoZVhDb3JlVGFyZ2V0LCAieGNvcmUiLCAiWENvcmUiKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmUuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTM3ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LS0gWENvcmUuaCAtIFRvcC1sZXZlbCBpbnRlcmZhY2UgZm9yIFhDb3JlIHJlcHJlc2VudGF0aW9uIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBlbnRyeSBwb2ludHMgZm9yIGdsb2JhbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgTExWTQorLy8gWENvcmUgYmFjay1lbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBUQVJHRVRfWENPUkVfSAorI2RlZmluZSBUQVJHRVRfWENPUkVfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZ1bmN0aW9uUGFzczsKKyAgY2xhc3MgVGFyZ2V0TWFjaGluZTsKKyAgY2xhc3MgWENvcmVUYXJnZXRNYWNoaW5lOworICBjbGFzcyBmb3JtYXR0ZWRfcmF3X29zdHJlYW07CisKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVYQ29yZUlTZWxEYWcoWENvcmVUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgZXh0ZXJuIFRhcmdldCBUaGVYQ29yZVRhcmdldDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm07CisKKy8vIERlZmluZXMgc3ltYm9saWMgbmFtZXMgZm9yIFhDb3JlIHJlZ2lzdGVycy4gIFRoaXMgZGVmaW5lcyBhIG1hcHBpbmcgZnJvbQorLy8gcmVnaXN0ZXIgbmFtZSB0byByZWdpc3RlciBudW1iZXIuCisvLworI2luY2x1ZGUgIlhDb3JlR2VuUmVnaXN0ZXJOYW1lcy5pbmMiCisKKy8vIERlZmluZXMgc3ltYm9saWMgbmFtZXMgZm9yIHRoZSBYQ29yZSBpbnN0cnVjdGlvbnMuCisvLworI2luY2x1ZGUgIlhDb3JlR2VuSW5zdHJOYW1lcy5pbmMiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZS50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmUudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0MDE4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmUudGQKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tIFhDb3JlLnRkIC0gRGVzY3JpYmUgdGhlIFhDb3JlIFRhcmdldCBNYWNoaW5lIC0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHdoaWNoIHdlIGFyZSBpbXBsZW1lbnRpbmcKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldC50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERlc2NyaXB0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW5jbHVkZSAiWENvcmVSZWdpc3RlckluZm8udGQiCitpbmNsdWRlICJYQ29yZUluc3RySW5mby50ZCIKK2luY2x1ZGUgIlhDb3JlQ2FsbGluZ0NvbnYudGQiCisKK2RlZiBYQ29yZUluc3RySW5mbyA6IEluc3RySW5mbzsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFhDb3JlIHByb2Nlc3NvcnMgc3VwcG9ydGVkLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgUHJvYzxzdHJpbmcgTmFtZSwgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBGZWF0dXJlcz4KKyA6IFByb2Nlc3NvcjxOYW1lLCBOb0l0aW5lcmFyaWVzLCBGZWF0dXJlcz47CisKK2RlZiA6IFByb2M8ImdlbmVyaWMiLCAgICAgIFtdPjsKK2RlZiA6IFByb2M8InhzMWItZ2VuZXJpYyIsIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERlY2xhcmUgdGhlIHRhcmdldCB3aGljaCB3ZSBhcmUgaW1wbGVtZW50aW5nCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgWENvcmUgOiBUYXJnZXQgeworICAvLyBQdWxsIGluIEluc3RydWN0aW9uIEluZm86CisgIGxldCBJbnN0cnVjdGlvblNldCA9IFhDb3JlSW5zdHJJbmZvOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZUNhbGxpbmdDb252LnRkIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZUNhbGxpbmdDb252LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDdlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlQ2FsbGluZ0NvbnYudGQKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tIFhDb3JlQ2FsbGluZ0NvbnYudGQgLSBDYWxsaW5nIENvbnZlbnRpb25zIGZvciBYQ29yZSAtKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgZGVzY3JpYmVzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciBYQ29yZSBhcmNoaXRlY3R1cmUuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gWENvcmUgUmV0dXJuIFZhbHVlIENhbGxpbmcgQ29udmVudGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2RlZiBSZXRDQ19YQ29yZSA6IENhbGxpbmdDb252PFsKKyAgLy8gaTMyIGFyZSByZXR1cm5lZCBpbiByZWdpc3RlcnMgUjAsIFIxLCBSMiwgUjMKKyAgQ0NJZlR5cGU8W2kzMl0sIENDQXNzaWduVG9SZWc8W1IwLCBSMSwgUjIsIFIzXT4+CitdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFhDb3JlIEFyZ3VtZW50IENhbGxpbmcgQ29udmVudGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgQ0NfWENvcmUgOiBDYWxsaW5nQ29udjxbCisgIC8vIFByb21vdGUgaTgvaTE2IGFyZ3VtZW50cyB0byBpMzIuCisgIENDSWZUeXBlPFtpOCwgaTE2XSwgQ0NQcm9tb3RlVG9UeXBlPGkzMj4+LAorCisgIC8vIFRoZSBmaXJzdCA0IGludGVnZXIgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnMuCisgIENDSWZUeXBlPFtpMzJdLCBDQ0Fzc2lnblRvUmVnPFtSMCwgUjEsIFIyLCBSM10+PiwKKworICAvLyBJbnRlZ2VyIHZhbHVlcyBnZXQgc3RvcmVkIGluIHN0YWNrIHNsb3RzIHRoYXQgYXJlIDQgYnl0ZXMgaW4KKyAgLy8gc2l6ZSBhbmQgNC1ieXRlIGFsaWduZWQuCisgIENDSWZUeXBlPFtpMzJdLCBDQ0Fzc2lnblRvU3RhY2s8NCwgND4+CitdPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVGcmFtZUluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZUZyYW1lSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwZGM5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVGcmFtZUluZm8uY3BwCkBAIC0wLDAgKzEsMjcgQEAKKy8vPT09LS0gWENvcmVGcmFtZUluZm8uY3BwIC0gRnJhbWUgaW5mbyBmb3IgWENvcmUgVGFyZ2V0IC0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIFhDb3JlIGZyYW1lIGluZm9ybWF0aW9uIHRoYXQgZG9lc24ndCBmaXQgYW55d2hlcmUgZWxzZQorLy8gY2xlYW5seS4uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJYQ29yZS5oIgorI2luY2x1ZGUgIlhDb3JlRnJhbWVJbmZvLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFhDb3JlRnJhbWVJbmZvOgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworWENvcmVGcmFtZUluZm86OlhDb3JlRnJhbWVJbmZvKGNvbnN0IFRhcmdldE1hY2hpbmUgJnRtKToKKyAgVGFyZ2V0RnJhbWVJbmZvKFRhcmdldEZyYW1lSW5mbzo6U3RhY2tHcm93c0Rvd24sIDQsIDApCit7CisgIC8vIERvIG5vdGhpbmcKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVGcmFtZUluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVGcmFtZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY3NTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZUZyYW1lSW5mby5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LS0gWENvcmVGcmFtZUluZm8uaCAtIEZyYW1lIGluZm8gZm9yIFhDb3JlIFRhcmdldCAtLS0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIFhDb3JlIGZyYW1lIGluZm9ybWF0aW9uIHRoYXQgZG9lc24ndCBmaXQgYW55d2hlcmUgZWxzZQorLy8gY2xlYW5seS4uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWENPUkVGUkFNRUlORk9fSAorI2RlZmluZSBYQ09SRUZSQU1FSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgWENvcmVGcmFtZUluZm86IHB1YmxpYyBUYXJnZXRGcmFtZUluZm8geworCisgIHB1YmxpYzoKKyAgICBYQ29yZUZyYW1lSW5mbyhjb25zdCBUYXJnZXRNYWNoaW5lICZ0bSk7CisKKyAgICAvLyEgU3RhY2sgc2xvdCBzaXplICg0IGJ5dGVzKQorICAgIHN0YXRpYyBpbnQgc3RhY2tTbG90U2l6ZSgpIHsKKyAgICAgIHJldHVybiA0OworICAgIH0KKyAgfTsKK30KKworI2VuZGlmIC8vIFhDT1JFRlJBTUVJTkZPX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJU2VsREFHVG9EQUcuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZUlTZWxEQUdUb0RBRy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2NGRkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJU2VsREFHVG9EQUcuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvLz09PS0tIFhDb3JlSVNlbERBR1RvREFHLmNwcCAtIEEgZGFnIHRvIGRhZyBpbnN0IHNlbGVjdG9yIGZvciBYQ29yZSAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGluc3RydWN0aW9uIHNlbGVjdG9yIGZvciB0aGUgWENvcmUgdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJYQ29yZS5oIgorI2luY2x1ZGUgIlhDb3JlVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHNldD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gWENvcmVEQUdUb0RBR0lTZWwgLSBYQ29yZSBzcGVjaWZpYyBjb2RlIHRvIHNlbGVjdCBYQ29yZSBtYWNoaW5lCisvLy8gaW5zdHJ1Y3Rpb25zIGZvciBTZWxlY3Rpb25EQUcgb3BlcmF0aW9ucy4KKy8vLworbmFtZXNwYWNlIHsKKyAgY2xhc3MgWENvcmVEQUdUb0RBR0lTZWwgOiBwdWJsaWMgU2VsZWN0aW9uREFHSVNlbCB7CisgICAgY29uc3QgWENvcmVUYXJnZXRMb3dlcmluZyAmTG93ZXJpbmc7CisgICAgY29uc3QgWENvcmVTdWJ0YXJnZXQgJlN1YnRhcmdldDsKKworICBwdWJsaWM6CisgICAgWENvcmVEQUdUb0RBR0lTZWwoWENvcmVUYXJnZXRNYWNoaW5lICZUTSkKKyAgICAgIDogU2VsZWN0aW9uREFHSVNlbChUTSksCisgICAgICAgIExvd2VyaW5nKCpUTS5nZXRUYXJnZXRMb3dlcmluZygpKSwgCisgICAgICAgIFN1YnRhcmdldCgqVE0uZ2V0U3VidGFyZ2V0SW1wbCgpKSB7IH0KKworICAgIFNETm9kZSAqU2VsZWN0KFNETm9kZSAqTik7CisgICAgCisgICAgLy8vIGdldEkzMkltbSAtIFJldHVybiBhIHRhcmdldCBjb25zdGFudCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUsIG9mIHR5cGUKKyAgICAvLy8gaTMyLgorICAgIGlubGluZSBTRFZhbHVlIGdldEkzMkltbSh1bnNpZ25lZCBJbW0pIHsKKyAgICAgIHJldHVybiBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KEltbSwgTVZUOjppMzIpOworICAgIH0KKworICAgIC8vIENvbXBsZXggUGF0dGVybiBTZWxlY3RvcnMuCisgICAgYm9vbCBTZWxlY3RBRERSc3BpaShTRE5vZGUgKk9wLCBTRFZhbHVlIEFkZHIsIFNEVmFsdWUgJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZPZmZzZXQpOworICAgIGJvb2wgU2VsZWN0QUREUmRwaWkoU0ROb2RlICpPcCwgU0RWYWx1ZSBBZGRyLCBTRFZhbHVlICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmT2Zmc2V0KTsKKyAgICBib29sIFNlbGVjdEFERFJjcGlpKFNETm9kZSAqT3AsIFNEVmFsdWUgQWRkciwgU0RWYWx1ZSAmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJk9mZnNldCk7CisgICAgCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAiWENvcmUgREFHLT5EQUcgUGF0dGVybiBJbnN0cnVjdGlvbiBTZWxlY3Rpb24iOworICAgIH0gCisgICAgCisgICAgLy8gSW5jbHVkZSB0aGUgcGllY2VzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0aW9uLgorICAjaW5jbHVkZSAiWENvcmVHZW5EQUdJU2VsLmluYyIKKyAgfTsKK30gIC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vLyBjcmVhdGVYQ29yZUlTZWxEYWcgLSBUaGlzIHBhc3MgY29udmVydHMgYSBsZWdhbGl6ZWQgREFHIGludG8gYSAKKy8vLyBYQ29yZS1zcGVjaWZpYyBEQUcsIHJlYWR5IGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorLy8vCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZVhDb3JlSVNlbERhZyhYQ29yZVRhcmdldE1hY2hpbmUgJlRNKSB7CisgIHJldHVybiBuZXcgWENvcmVEQUdUb0RBR0lTZWwoVE0pOworfQorCitib29sIFhDb3JlREFHVG9EQUdJU2VsOjpTZWxlY3RBRERSc3BpaShTRE5vZGUgKk9wLCBTRFZhbHVlIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmT2Zmc2V0KSB7CisgIEZyYW1lSW5kZXhTRE5vZGUgKkZJTiA9IDA7CisgIGlmICgoRklOID0gZHluX2Nhc3Q8RnJhbWVJbmRleFNETm9kZT4oQWRkcikpKSB7CisgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSU4tPmdldEluZGV4KCksIE1WVDo6aTMyKTsKKyAgICBPZmZzZXQgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoQWRkci5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIENvbnN0YW50U0ROb2RlICpDTiA9IDA7CisgICAgaWYgKChGSU4gPSBkeW5fY2FzdDxGcmFtZUluZGV4U0ROb2RlPihBZGRyLmdldE9wZXJhbmQoMCkpKQorICAgICAgJiYgKENOID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KEFkZHIuZ2V0T3BlcmFuZCgxKSkpCisgICAgICAmJiAoQ04tPmdldFNFeHRWYWx1ZSgpICUgNCA9PSAwICYmIENOLT5nZXRTRXh0VmFsdWUoKSA+PSAwKSkgeworICAgICAgLy8gQ29uc3RhbnQgcG9zaXRpdmUgd29yZCBvZmZzZXQgZnJvbSBmcmFtZSBpbmRleAorICAgICAgQmFzZSA9IEN1ckRBRy0+Z2V0VGFyZ2V0RnJhbWVJbmRleChGSU4tPmdldEluZGV4KCksIE1WVDo6aTMyKTsKKyAgICAgIE9mZnNldCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoQ04tPmdldFNFeHRWYWx1ZSgpLCBNVlQ6OmkzMik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFhDb3JlREFHVG9EQUdJU2VsOjpTZWxlY3RBRERSZHBpaShTRE5vZGUgKk9wLCBTRFZhbHVlIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQmFzZSwgU0RWYWx1ZSAmT2Zmc2V0KSB7CisgIGlmIChBZGRyLmdldE9wY29kZSgpID09IFhDb3JlSVNEOjpEUFJlbGF0aXZlV3JhcHBlcikgeworICAgIEJhc2UgPSBBZGRyLmdldE9wZXJhbmQoMCk7CisgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudCgwLCBNVlQ6OmkzMik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKEFkZHIuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQpIHsKKyAgICBDb25zdGFudFNETm9kZSAqQ04gPSAwOworICAgIGlmICgoQWRkci5nZXRPcGVyYW5kKDApLmdldE9wY29kZSgpID09IFhDb3JlSVNEOjpEUFJlbGF0aXZlV3JhcHBlcikKKyAgICAgICYmIChDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihBZGRyLmdldE9wZXJhbmQoMSkpKQorICAgICAgJiYgKENOLT5nZXRTRXh0VmFsdWUoKSAlIDQgPT0gMCkpIHsKKyAgICAgIC8vIENvbnN0YW50IHdvcmQgb2Zmc2V0IGZyb20gYSBvYmplY3QgaW4gdGhlIGRhdGEgcmVnaW9uCisgICAgICBCYXNlID0gQWRkci5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMCk7CisgICAgICBPZmZzZXQgPSBDdXJEQUctPmdldFRhcmdldENvbnN0YW50KENOLT5nZXRTRXh0VmFsdWUoKSwgTVZUOjppMzIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBYQ29yZURBR1RvREFHSVNlbDo6U2VsZWN0QUREUmNwaWkoU0ROb2RlICpPcCwgU0RWYWx1ZSBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkJhc2UsIFNEVmFsdWUgJk9mZnNldCkgeworICBpZiAoQWRkci5nZXRPcGNvZGUoKSA9PSBYQ29yZUlTRDo6Q1BSZWxhdGl2ZVdyYXBwZXIpIHsKKyAgICBCYXNlID0gQWRkci5nZXRPcGVyYW5kKDApOworICAgIE9mZnNldCA9IEN1ckRBRy0+Z2V0VGFyZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChBZGRyLmdldE9wY29kZSgpID09IElTRDo6QUREKSB7CisgICAgQ29uc3RhbnRTRE5vZGUgKkNOID0gMDsKKyAgICBpZiAoKEFkZHIuZ2V0T3BlcmFuZCgwKS5nZXRPcGNvZGUoKSA9PSBYQ29yZUlTRDo6Q1BSZWxhdGl2ZVdyYXBwZXIpCisgICAgICAmJiAoQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oQWRkci5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICYmIChDTi0+Z2V0U0V4dFZhbHVlKCkgJSA0ID09IDApKSB7CisgICAgICAvLyBDb25zdGFudCB3b3JkIG9mZnNldCBmcm9tIGEgb2JqZWN0IGluIHRoZSBkYXRhIHJlZ2lvbgorICAgICAgQmFzZSA9IEFkZHIuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDApOworICAgICAgT2Zmc2V0ID0gQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudChDTi0+Z2V0U0V4dFZhbHVlKCksIE1WVDo6aTMyKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK1NETm9kZSAqWENvcmVEQUdUb0RBR0lTZWw6OlNlbGVjdChTRE5vZGUgKk4pIHsKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICBFVlQgTlZUID0gTi0+Z2V0VmFsdWVUeXBlKDApOworICBpZiAoTlZUID09IE1WVDo6aTMyKSB7CisgICAgc3dpdGNoIChOLT5nZXRPcGNvZGUoKSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlIElTRDo6Q29uc3RhbnQ6IHsKKyAgICAgICAgaWYgKFByZWRpY2F0ZV9pbW1Nc2tCaXRwKE4pKSB7CisgICAgICAgICAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IGdldCB0aGUgc2l6ZSBvZiBhIG1hc2sKKyAgICAgICAgICBpbnQ2NF90IE1hc2tWYWwgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgICAgYXNzZXJ0KGlzTWFza18zMihNYXNrVmFsKSk7CisgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGZpcnN0IG5vbi16ZXJvIGJpdAorICAgICAgICAgIFNEVmFsdWUgTXNrU2l6ZSA9IGdldEkzMkltbSgzMiAtIENvdW50TGVhZGluZ1plcm9zXzMyKE1hc2tWYWwpKTsKKyAgICAgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShYQ29yZTo6TUtNU0tfcnVzLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OmkzMiwgTXNrU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoISBQcmVkaWNhdGVfaW1tVTE2KE4pKSB7CisgICAgICAgICAgdW5zaWduZWQgVmFsID0gY2FzdDxDb25zdGFudFNETm9kZT4oTiktPmdldFpFeHRWYWx1ZSgpOworICAgICAgICAgIFNEVmFsdWUgQ1BJZHggPQorICAgICAgICAgICAgQ3VyREFHLT5nZXRUYXJnZXRDb25zdGFudFBvb2woQ29uc3RhbnRJbnQ6OmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQzMlR5KCpDdXJEQUctPmdldENvbnRleHQoKSksIFZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkuZ2V0UG9pbnRlclR5KCkpOworICAgICAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFhDb3JlOjpMRFdDUF9scnU2LCBkbCwgTVZUOjppMzIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVDo6T3RoZXIsIENQSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEQUctPmdldEVudHJ5Tm9kZSgpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgWENvcmVJU0Q6OkxBREQ6IHsKKyAgICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDIpIH07CisgICAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFhDb3JlOjpMQUREX2w1ciwgZGwsIE1WVDo6aTMyLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAzKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgWENvcmVJU0Q6OkxTVUI6IHsKKyAgICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLT5nZXRPcGVyYW5kKDIpIH07CisgICAgICAgIHJldHVybiBDdXJEQUctPmdldE1hY2hpbmVOb2RlKFhDb3JlOjpMU1VCX2w1ciwgZGwsIE1WVDo6aTMyLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAzKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgWENvcmVJU0Q6Ok1BQ0NVOiB7CisgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7IE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMiksIE4tPmdldE9wZXJhbmQoMykgfTsKKyAgICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoWENvcmU6Ok1BQ0NVX2w0ciwgZGwsIE1WVDo6aTMyLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCA0KTsKKyAgICAgIH0KKyAgICAgIGNhc2UgWENvcmVJU0Q6Ok1BQ0NTOiB7CisgICAgICAgIFNEVmFsdWUgT3BzW10gPSB7IE4tPmdldE9wZXJhbmQoMCksIE4tPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMiksIE4tPmdldE9wZXJhbmQoMykgfTsKKyAgICAgICAgcmV0dXJuIEN1ckRBRy0+Z2V0TWFjaGluZU5vZGUoWENvcmU6Ok1BQ0NTX2w0ciwgZGwsIE1WVDo6aTMyLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCA0KTsKKyAgICAgIH0KKyAgICAgIGNhc2UgWENvcmVJU0Q6OkxNVUw6IHsKKyAgICAgICAgU0RWYWx1ZSBPcHNbXSA9IHsgTi0+Z2V0T3BlcmFuZCgwKSwgTi0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgyKSwgTi0+Z2V0T3BlcmFuZCgzKSB9OworICAgICAgICByZXR1cm4gQ3VyREFHLT5nZXRNYWNoaW5lTm9kZShYQ29yZTo6TE1VTF9sNnIsIGRsLCBNVlQ6OmkzMiwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgNCk7CisgICAgICB9CisgICAgICAvLyBPdGhlciBjYXNlcyBhcmUgYXV0b2dlbmVyYXRlZC4KKyAgICB9CisgIH0KKyAgcmV0dXJuIFNlbGVjdENvZGUoTik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlSVNlbExvd2VyaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJU2VsTG93ZXJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTdiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlSVNlbExvd2VyaW5nLmNwcApAQCAtMCwwICsxLDE1NjEgQEAKKy8vPT09LS0gWENvcmVJU2VsTG93ZXJpbmcuY3BwIC0gWENvcmUgREFHIExvd2VyaW5nIEltcGxlbWVudGF0aW9uICAgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgWENvcmVUYXJnZXRMb3dlcmluZyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInhjb3JlLWxvd2VyIgorCisjaW5jbHVkZSAiWENvcmVJU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJYQ29yZU1hY2hpbmVGdW5jdGlvbkluZm8uaCIKKyNpbmNsdWRlICJYQ29yZS5oIgorI2luY2x1ZGUgIlhDb3JlVGFyZ2V0T2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgIlhDb3JlVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgIlhDb3JlU3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbEFsaWFzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVmVjdG9yRXh0cmFzLmgiCisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c2V0PgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK2NvbnN0IGNoYXIgKlhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorZ2V0VGFyZ2V0Tm9kZU5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdCAKK3sKKyAgc3dpdGNoIChPcGNvZGUpIAorICB7CisgICAgY2FzZSBYQ29yZUlTRDo6QkwgICAgICAgICAgICAgICAgOiByZXR1cm4gIlhDb3JlSVNEOjpCTCI7CisgICAgY2FzZSBYQ29yZUlTRDo6UENSZWxhdGl2ZVdyYXBwZXIgOiByZXR1cm4gIlhDb3JlSVNEOjpQQ1JlbGF0aXZlV3JhcHBlciI7CisgICAgY2FzZSBYQ29yZUlTRDo6RFBSZWxhdGl2ZVdyYXBwZXIgOiByZXR1cm4gIlhDb3JlSVNEOjpEUFJlbGF0aXZlV3JhcHBlciI7CisgICAgY2FzZSBYQ29yZUlTRDo6Q1BSZWxhdGl2ZVdyYXBwZXIgOiByZXR1cm4gIlhDb3JlSVNEOjpDUFJlbGF0aXZlV3JhcHBlciI7CisgICAgY2FzZSBYQ29yZUlTRDo6U1RXU1AgICAgICAgICAgICAgOiByZXR1cm4gIlhDb3JlSVNEOjpTVFdTUCI7CisgICAgY2FzZSBYQ29yZUlTRDo6UkVUU1AgICAgICAgICAgICAgOiByZXR1cm4gIlhDb3JlSVNEOjpSRVRTUCI7CisgICAgY2FzZSBYQ29yZUlTRDo6TEFERCAgICAgICAgICAgICAgOiByZXR1cm4gIlhDb3JlSVNEOjpMQUREIjsKKyAgICBjYXNlIFhDb3JlSVNEOjpMU1VCICAgICAgICAgICAgICA6IHJldHVybiAiWENvcmVJU0Q6OkxTVUIiOworICAgIGNhc2UgWENvcmVJU0Q6OkxNVUwgICAgICAgICAgICAgIDogcmV0dXJuICJYQ29yZUlTRDo6TE1VTCI7CisgICAgY2FzZSBYQ29yZUlTRDo6TUFDQ1UgICAgICAgICAgICAgOiByZXR1cm4gIlhDb3JlSVNEOjpNQUNDVSI7CisgICAgY2FzZSBYQ29yZUlTRDo6TUFDQ1MgICAgICAgICAgICAgOiByZXR1cm4gIlhDb3JlSVNEOjpNQUNDUyI7CisgICAgY2FzZSBYQ29yZUlTRDo6QlJfSlQgICAgICAgICAgICAgOiByZXR1cm4gIlhDb3JlSVNEOjpCUl9KVCI7CisgICAgY2FzZSBYQ29yZUlTRDo6QlJfSlQzMiAgICAgICAgICAgOiByZXR1cm4gIlhDb3JlSVNEOjpCUl9KVDMyIjsKKyAgICBkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybiBOVUxMOworICB9Cit9CisKK1hDb3JlVGFyZ2V0TG93ZXJpbmc6OlhDb3JlVGFyZ2V0TG93ZXJpbmcoWENvcmVUYXJnZXRNYWNoaW5lICZYVE0pCisgIDogVGFyZ2V0TG93ZXJpbmcoWFRNLCBuZXcgWENvcmVUYXJnZXRPYmplY3RGaWxlKCkpLAorICAgIFRNKFhUTSksCisgICAgU3VidGFyZ2V0KCpYVE0uZ2V0U3VidGFyZ2V0SW1wbCgpKSB7CisKKyAgLy8gU2V0IHVwIHRoZSByZWdpc3RlciBjbGFzc2VzLgorICBhZGRSZWdpc3RlckNsYXNzKE1WVDo6aTMyLCBYQ29yZTo6R1JSZWdzUmVnaXN0ZXJDbGFzcyk7CisKKyAgLy8gQ29tcHV0ZSBkZXJpdmVkIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVnaXN0ZXIgY2xhc3NlcworICBjb21wdXRlUmVnaXN0ZXJQcm9wZXJ0aWVzKCk7CisKKyAgLy8gRGl2aXNpb24gaXMgZXhwZW5zaXZlCisgIHNldEludERpdklzQ2hlYXAoZmFsc2UpOworCisgIHNldFNoaWZ0QW1vdW50VHlwZShNVlQ6OmkzMik7CisgIHNldFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZShYQ29yZTo6U1ApOworCisgIHNldFNjaGVkdWxpbmdQcmVmZXJlbmNlKFNjaGVkOjpSZWdQcmVzc3VyZSk7CisKKyAgLy8gVXNlIGkzMiBmb3Igc2V0Y2Mgb3BlcmF0aW9ucyByZXN1bHRzIChzbHQsIHNndCwgLi4uKS4KKyAgc2V0Qm9vbGVhbkNvbnRlbnRzKFplcm9Pck9uZUJvb2xlYW5Db250ZW50KTsKKworICAvLyBYQ29yZSBkb2VzIG5vdCBoYXZlIHRoZSBOb2RlVHlwZXMgYmVsb3cuCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkJSX0NDLCAgICAgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0VMRUNUX0NDLCBNVlQ6OmkzMiwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBRERDLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6QURERSwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNVQkMsIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUJFLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKworICAvLyBTdG9wIHRoZSBjb21iaW5lciByZWNvbWJpbmluZyBzZWxlY3QgYW5kIHNldF9jYworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTRUxFQ1RfQ0MsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIAorICAvLyA2NGJpdAorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpBREQsIE1WVDo6aTY0LCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTVUIsIE1WVDo6aTY0LCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpTTVVMX0xPSEksIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpVTVVMX0xPSEksIE1WVDo6aTMyLCBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpNVUxIUywgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6Ok1VTEhVLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0hMX1BBUlRTLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JBX1BBUlRTLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1JMX1BBUlRTLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgCisgIC8vIEJpdCBNYW5pcHVsYXRpb24KKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q1RQT1AsIE1WVDo6aTMyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpST1RMICwgTVZUOjppMzIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlJPVFIgLCBNVlQ6OmkzMiwgRXhwYW5kKTsKKyAgCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlRSQVAsIE1WVDo6T3RoZXIsIExlZ2FsKTsKKyAgCisgIC8vIEp1bXAgdGFibGVzLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCUl9KVCwgTVZUOjpPdGhlciwgQ3VzdG9tKTsKKworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxBZGRyZXNzLCBNVlQ6OmkzMiwgICBDdXN0b20pOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpCbG9ja0FkZHJlc3MsIE1WVDo6aTMyICwgQ3VzdG9tKTsKKworICAvLyBUaHJlYWQgTG9jYWwgU3RvcmFnZQorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxUTFNBZGRyZXNzLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgCisgIC8vIENvbnZlcnNpb24gb2YgaTY0IC0+IGRvdWJsZSBwcm9kdWNlcyBjb25zdGFudHBvb2wgbm9kZXMKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6Q29uc3RhbnRQb29sLCBNVlQ6OmkzMiwgICBDdXN0b20pOworCisgIC8vIExvYWRzCisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCBNVlQ6OmkxLCBQcm9tb3RlKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlpFWFRMT0FELCBNVlQ6OmkxLCBQcm9tb3RlKTsKKyAgc2V0TG9hZEV4dEFjdGlvbihJU0Q6OlNFWFRMT0FELCBNVlQ6OmkxLCBQcm9tb3RlKTsKKworICBzZXRMb2FkRXh0QWN0aW9uKElTRDo6U0VYVExPQUQsIE1WVDo6aTgsIEV4cGFuZCk7CisgIHNldExvYWRFeHRBY3Rpb24oSVNEOjpaRVhUTE9BRCwgTVZUOjppMTYsIEV4cGFuZCk7CisKKyAgLy8gQ3VzdG9tIGV4cGFuZCBtaXNhbGlnbmVkIGxvYWRzIC8gc3RvcmVzLgorICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpMT0FELCBNVlQ6OmkzMiwgQ3VzdG9tKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RPUkUsIE1WVDo6aTMyLCBDdXN0b20pOworCisgIC8vIFZhcmFyZ3MKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFFTkQsIE1WVDo6T3RoZXIsIEV4cGFuZCk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBQ09QWSwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VkFBUkcsIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlZBU1RBUlQsIE1WVDo6T3RoZXIsIEN1c3RvbSk7CisgIAorICAvLyBEeW5hbWljIHN0YWNrCisgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlNUQUNLU0FWRSwgTVZUOjpPdGhlciwgRXhwYW5kKTsKKyAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U1RBQ0tSRVNUT1JFLCBNVlQ6Ok90aGVyLCBFeHBhbmQpOworICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpEWU5BTUlDX1NUQUNLQUxMT0MsIE1WVDo6aTMyLCBFeHBhbmQpOworICAKKyAgbWF4U3RvcmVzUGVyTWVtc2V0ID0gNDsKKyAgbWF4U3RvcmVzUGVyTWVtbW92ZSA9IG1heFN0b3Jlc1Blck1lbWNweSA9IDI7CisKKyAgLy8gV2UgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgZGFnIGNvbWJpbmUgcGF0dGVybnMgZm9yIHRoZSBmb2xsb3dpbmcgbm9kZXM6CisgIHNldFRhcmdldERBR0NvbWJpbmUoSVNEOjpTVE9SRSk7CisgIHNldFRhcmdldERBR0NvbWJpbmUoSVNEOjpBREQpOworfQorCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJPcGVyYXRpb24oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgCisgIHsKKyAgY2FzZSBJU0Q6Okdsb2JhbEFkZHJlc3M6ICAgIHJldHVybiBMb3dlckdsb2JhbEFkZHJlc3MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpHbG9iYWxUTFNBZGRyZXNzOiByZXR1cm4gTG93ZXJHbG9iYWxUTFNBZGRyZXNzKE9wLCBEQUcpOworICBjYXNlIElTRDo6QmxvY2tBZGRyZXNzOiAgICAgcmV0dXJuIExvd2VyQmxvY2tBZGRyZXNzKE9wLCBEQUcpOworICBjYXNlIElTRDo6Q29uc3RhbnRQb29sOiAgICAgcmV0dXJuIExvd2VyQ29uc3RhbnRQb29sKE9wLCBEQUcpOworICBjYXNlIElTRDo6QlJfSlQ6ICAgICAgICAgICAgcmV0dXJuIExvd2VyQlJfSlQoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpMT0FEOiAgICAgICAgICAgICByZXR1cm4gTG93ZXJMT0FEKE9wLCBEQUcpOworICBjYXNlIElTRDo6U1RPUkU6ICAgICAgICAgICAgcmV0dXJuIExvd2VyU1RPUkUoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpTRUxFQ1RfQ0M6ICAgICAgICByZXR1cm4gTG93ZXJTRUxFQ1RfQ0MoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpWQUFSRzogICAgICAgICAgICByZXR1cm4gTG93ZXJWQUFSRyhPcCwgREFHKTsKKyAgY2FzZSBJU0Q6OlZBU1RBUlQ6ICAgICAgICAgIHJldHVybiBMb3dlclZBU1RBUlQoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpTTVVMX0xPSEk6ICAgICAgICByZXR1cm4gTG93ZXJTTVVMX0xPSEkoT3AsIERBRyk7CisgIGNhc2UgSVNEOjpVTVVMX0xPSEk6ICAgICAgICByZXR1cm4gTG93ZXJVTVVMX0xPSEkoT3AsIERBRyk7CisgIC8vIEZJWE1FOiBSZW1vdmUgdGhlc2Ugd2hlbiBMZWdhbGl6ZURBR1R5cGVzIGxhbmRzLgorICBjYXNlIElTRDo6QUREOgorICBjYXNlIElTRDo6U1VCOiAgICAgICAgICAgICAgcmV0dXJuIEV4cGFuZEFERFNVQihPcC5nZXROb2RlKCksIERBRyk7CisgIGNhc2UgSVNEOjpGUkFNRUFERFI6ICAgICAgICByZXR1cm4gTG93ZXJGUkFNRUFERFIoT3AsIERBRyk7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgidW5pbXBsZW1lbnRlZCBvcGVyYW5kIik7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorfQorCisvLy8gUmVwbGFjZU5vZGVSZXN1bHRzIC0gUmVwbGFjZSB0aGUgcmVzdWx0cyBvZiBub2RlIHdpdGggYW4gaWxsZWdhbCByZXN1bHQKKy8vLyB0eXBlIHdpdGggbmV3IHZhbHVlcyBidWlsdCBvdXQgb2YgY3VzdG9tIGNvZGUuCit2b2lkIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OlJlcGxhY2VOb2RlUmVzdWx0cyhTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4mUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJEb24ndCBrbm93IGhvdyB0byBjdXN0b20gZXhwYW5kIHRoaXMhIik7CisgICAgcmV0dXJuOworICBjYXNlIElTRDo6QUREOgorICBjYXNlIElTRDo6U1VCOgorICAgIFJlc3VsdHMucHVzaF9iYWNrKEV4cGFuZEFERFNVQihOLCBEQUcpKTsKKyAgICByZXR1cm47CisgIH0KK30KKworLy8vIGdldEZ1bmN0aW9uQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBMb2cyIGFsaWdubWVudCBvZiB0aGlzIGZ1bmN0aW9uLgordW5zaWduZWQgWENvcmVUYXJnZXRMb3dlcmluZzo6CitnZXRGdW5jdGlvbkFsaWdubWVudChjb25zdCBGdW5jdGlvbiAqKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIE1pc2MgTG93ZXIgT3BlcmF0aW9uIGltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJTRUxFQ1RfQ0MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0Cit7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBDb25kID0gREFHLmdldE5vZGUoSVNEOjpTRVRDQywgZGwsIE1WVDo6aTMyLCBPcC5nZXRPcGVyYW5kKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDMpLCBPcC5nZXRPcGVyYW5kKDQpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6U0VMRUNULCBkbCwgTVZUOjppMzIsIENvbmQsIE9wLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICBPcC5nZXRPcGVyYW5kKDEpKTsKK30KKworU0RWYWx1ZSBYQ29yZVRhcmdldExvd2VyaW5nOjoKK2dldEdsb2JhbEFkZHJlc3NXcmFwcGVyKFNEVmFsdWUgR0EsIGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICAvLyBGSVhNRSB0aGVyZSBpcyBubyBhY3R1YWwgZGVidWcgaW5mbyBoZXJlCisgIERlYnVnTG9jIGRsID0gR0EuZ2V0RGVidWdMb2MoKTsKKyAgaWYgKGlzYTxGdW5jdGlvbj4oR1YpKSB7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKFhDb3JlSVNEOjpQQ1JlbGF0aXZlV3JhcHBlciwgZGwsIE1WVDo6aTMyLCBHQSk7CisgIH0KKyAgY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWYXIgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oR1YpOworICBpZiAoIUdWYXIpIHsKKyAgICAvLyBJZiBHViBpcyBhbiBhbGlhcyB0aGVuIHVzZSB0aGUgYWxpYXNlZSB0byBkZXRlcm1pbmUgY29uc3RuZXNzCisgICAgaWYgKGNvbnN0IEdsb2JhbEFsaWFzICpHQSA9IGR5bl9jYXN0PEdsb2JhbEFsaWFzPihHVikpCisgICAgICBHVmFyID0gZHluX2Nhc3Rfb3JfbnVsbDxHbG9iYWxWYXJpYWJsZT4oR0EtPnJlc29sdmVBbGlhc2VkR2xvYmFsKCkpOworICB9CisgIGJvb2wgaXNDb25zdCA9IEdWYXIgJiYgR1Zhci0+aXNDb25zdGFudCgpOworICBpZiAoaXNDb25zdCkgeworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShYQ29yZUlTRDo6Q1BSZWxhdGl2ZVdyYXBwZXIsIGRsLCBNVlQ6OmkzMiwgR0EpOworICB9CisgIHJldHVybiBEQUcuZ2V0Tm9kZShYQ29yZUlTRDo6RFBSZWxhdGl2ZVdyYXBwZXIsIGRsLCBNVlQ6OmkzMiwgR0EpOworfQorCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJHbG9iYWxBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKS0+Z2V0R2xvYmFsKCk7CisgIFNEVmFsdWUgR0EgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgT3AuZ2V0RGVidWdMb2MoKSwgTVZUOjppMzIpOworICAvLyBJZiBpdCdzIGEgZGVidWcgaW5mb3JtYXRpb24gZGVzY3JpcHRvciwgZG9uJ3QgbWVzcyB3aXRoIGl0LgorICBpZiAoREFHLmlzVmVyaWZpZWREZWJ1Z0luZm9EZXNjKE9wKSkKKyAgICByZXR1cm4gR0E7CisgIHJldHVybiBnZXRHbG9iYWxBZGRyZXNzV3JhcHBlcihHQSwgR1YsIERBRyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgU0RWYWx1ZSBCdWlsZEdldElkKFNlbGVjdGlvbkRBRyAmREFHLCBEZWJ1Z0xvYyBkbCkgeworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4sIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChJbnRyaW5zaWM6Onhjb3JlX2dldGlkLCBNVlQ6OmkzMikpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNaZXJvTGVuZ3RoQXJyYXkoY29uc3QgVHlwZSAqVHkpIHsKKyAgY29uc3QgQXJyYXlUeXBlICpBVCA9IGR5bl9jYXN0X29yX251bGw8QXJyYXlUeXBlPihUeSk7CisgIHJldHVybiBBVCAmJiAoQVQtPmdldE51bUVsZW1lbnRzKCkgPT0gMCk7Cit9CisKK1NEVmFsdWUgWENvcmVUYXJnZXRMb3dlcmluZzo6CitMb3dlckdsb2JhbFRMU0FkZHJlc3MoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0Cit7CisgIC8vIEZJWE1FIHRoZXJlIGlzbid0IHJlYWxseSBkZWJ1ZyBpbmZvIGhlcmUKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICAvLyB0cmFuc2Zvcm0gdG8gbGFiZWwgKyBnZXRpZCgpICogc2l6ZQorICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBjYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE9wKS0+Z2V0R2xvYmFsKCk7CisgIFNEVmFsdWUgR0EgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHViwgZGwsIE1WVDo6aTMyKTsKKyAgY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWYXIgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oR1YpOworICBpZiAoIUdWYXIpIHsKKyAgICAvLyBJZiBHViBpcyBhbiBhbGlhcyB0aGVuIHVzZSB0aGUgYWxpYXNlZSB0byBkZXRlcm1pbmUgc2l6ZQorICAgIGlmIChjb25zdCBHbG9iYWxBbGlhcyAqR0EgPSBkeW5fY2FzdDxHbG9iYWxBbGlhcz4oR1YpKQorICAgICAgR1ZhciA9IGR5bl9jYXN0X29yX251bGw8R2xvYmFsVmFyaWFibGU+KEdBLT5yZXNvbHZlQWxpYXNlZEdsb2JhbCgpKTsKKyAgfQorICBpZiAoISBHVmFyKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGhyZWFkIGxvY2FsIG9iamVjdCBub3QgYSBHbG9iYWxWYXJpYWJsZT8iKTsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisgIGNvbnN0IFR5cGUgKlR5ID0gY2FzdDxQb2ludGVyVHlwZT4oR1YtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgIGlmICghVHktPmlzU2l6ZWQoKSB8fCBpc1plcm9MZW5ndGhBcnJheShUeSkpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgZXJycygpIDw8ICJTaXplIG9mIHRocmVhZCBsb2NhbCBvYmplY3QgIiA8PCBHVmFyLT5nZXROYW1lKCkKKyAgICAgICAgICAgPDwgIiBpcyB1bmtub3duXG4iOworI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgwKTsKKyAgfQorICBTRFZhbHVlIGJhc2UgPSBnZXRHbG9iYWxBZGRyZXNzV3JhcHBlcihHQSwgR1YsIERBRyk7CisgIGNvbnN0IFRhcmdldERhdGEgKlREID0gVE0uZ2V0VGFyZ2V0RGF0YSgpOworICB1bnNpZ25lZCBTaXplID0gVEQtPmdldFR5cGVBbGxvY1NpemUoVHkpOworICBTRFZhbHVlIG9mZnNldCA9IERBRy5nZXROb2RlKElTRDo6TVVMLCBkbCwgTVZUOjppMzIsIEJ1aWxkR2V0SWQoREFHLCBkbCksCisgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChTaXplLCBNVlQ6OmkzMikpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgYmFzZSwgb2Zmc2V0KTsKK30KKworU0RWYWx1ZSBYQ29yZVRhcmdldExvd2VyaW5nOjoKK0xvd2VyQmxvY2tBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICBEZWJ1Z0xvYyBETCA9IE9wLmdldERlYnVnTG9jKCk7CisKKyAgY29uc3QgQmxvY2tBZGRyZXNzICpCQSA9IGNhc3Q8QmxvY2tBZGRyZXNzU0ROb2RlPihPcCktPmdldEJsb2NrQWRkcmVzcygpOworICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXRCbG9ja0FkZHJlc3MoQkEsIGdldFBvaW50ZXJUeSgpLCAvKmlzVGFyZ2V0PSovdHJ1ZSk7CisKKyAgcmV0dXJuIERBRy5nZXROb2RlKFhDb3JlSVNEOjpQQ1JlbGF0aXZlV3JhcHBlciwgREwsIGdldFBvaW50ZXJUeSgpLCBSZXN1bHQpOworfQorCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJDb25zdGFudFBvb2woU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0Cit7CisgIENvbnN0YW50UG9vbFNETm9kZSAqQ1AgPSBjYXN0PENvbnN0YW50UG9vbFNETm9kZT4oT3ApOworICAvLyBGSVhNRSB0aGVyZSBpc24ndCByZWFsbHkgZGVidWcgaW5mbyBoZXJlCisgIERlYnVnTG9jIGRsID0gQ1AtPmdldERlYnVnTG9jKCk7CisgIEVWVCBQdHJWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICBTRFZhbHVlIFJlczsKKyAgaWYgKENQLT5pc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSgpKSB7CisgICAgUmVzID0gREFHLmdldFRhcmdldENvbnN0YW50UG9vbChDUC0+Z2V0TWFjaGluZUNQVmFsKCksIFB0clZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1AtPmdldEFsaWdubWVudCgpKTsKKyAgfSBlbHNlIHsKKyAgICBSZXMgPSBEQUcuZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKENQLT5nZXRDb25zdFZhbCgpLCBQdHJWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQLT5nZXRBbGlnbm1lbnQoKSk7CisgIH0KKyAgcmV0dXJuIERBRy5nZXROb2RlKFhDb3JlSVNEOjpDUFJlbGF0aXZlV3JhcHBlciwgZGwsIE1WVDo6aTMyLCBSZXMpOworfQorCit1bnNpZ25lZCBYQ29yZVRhcmdldExvd2VyaW5nOjpnZXRKdW1wVGFibGVFbmNvZGluZygpIGNvbnN0IHsKKyAgcmV0dXJuIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19JbmxpbmU7Cit9CisKK1NEVmFsdWUgWENvcmVUYXJnZXRMb3dlcmluZzo6CitMb3dlckJSX0pUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICBTRFZhbHVlIENoYWluID0gT3AuZ2V0T3BlcmFuZCgwKTsKKyAgU0RWYWx1ZSBUYWJsZSA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgSW5kZXggPSBPcC5nZXRPcGVyYW5kKDIpOworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIEp1bXBUYWJsZVNETm9kZSAqSlQgPSBjYXN0PEp1bXBUYWJsZVNETm9kZT4oVGFibGUpOworICB1bnNpZ25lZCBKVEkgPSBKVC0+Z2V0SW5kZXgoKTsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgY29uc3QgTWFjaGluZUp1bXBUYWJsZUluZm8gKk1KVEkgPSBNRi5nZXRKdW1wVGFibGVJbmZvKCk7CisgIFNEVmFsdWUgVGFyZ2V0SlQgPSBEQUcuZ2V0VGFyZ2V0SnVtcFRhYmxlKEpULT5nZXRJbmRleCgpLCBNVlQ6OmkzMik7CisKKyAgdW5zaWduZWQgTnVtRW50cmllcyA9IE1KVEktPmdldEp1bXBUYWJsZXMoKVtKVEldLk1CQnMuc2l6ZSgpOworICBpZiAoTnVtRW50cmllcyA8PSAzMikgeworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShYQ29yZUlTRDo6QlJfSlQsIGRsLCBNVlQ6Ok90aGVyLCBDaGFpbiwgVGFyZ2V0SlQsIEluZGV4KTsKKyAgfQorICBhc3NlcnQoKE51bUVudHJpZXMgPj4gMzEpID09IDApOworICBTRFZhbHVlIFNjYWxlZEluZGV4ID0gREFHLmdldE5vZGUoSVNEOjpTSEwsIGRsLCBNVlQ6OmkzMiwgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMSwgTVZUOjppMzIpKTsKKyAgcmV0dXJuIERBRy5nZXROb2RlKFhDb3JlSVNEOjpCUl9KVDMyLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4sIFRhcmdldEpULAorICAgICAgICAgICAgICAgICAgICAgU2NhbGVkSW5kZXgpOworfQorCitzdGF0aWMgYm9vbAorSXNXb3JkQWxpZ25lZEJhc2VQbHVzQ29uc3RhbnRPZmZzZXQoU0RWYWx1ZSBBZGRyLCBTRFZhbHVlICZBbGlnbmVkQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJk9mZnNldCkKK3sKKyAgaWYgKEFkZHIuZ2V0T3Bjb2RlKCkgIT0gSVNEOjpBREQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgQ29uc3RhbnRTRE5vZGUgKkNOID0gMDsKKyAgaWYgKCEoQ04gPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oQWRkci5nZXRPcGVyYW5kKDEpKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW50NjRfdCBvZmYgPSBDTi0+Z2V0U0V4dFZhbHVlKCk7CisgIGNvbnN0IFNEVmFsdWUgJkJhc2UgPSBBZGRyLmdldE9wZXJhbmQoMCk7CisgIGNvbnN0IFNEVmFsdWUgKlJvb3QgPSAmQmFzZTsKKyAgaWYgKEJhc2UuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpBREQgJiYKKyAgICAgIEJhc2UuZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNITCkgeworICAgIENvbnN0YW50U0ROb2RlICpDTiA9IGR5bl9jYXN0PENvbnN0YW50U0ROb2RlPihCYXNlLmdldE9wZXJhbmQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoQ04gJiYgKENOLT5nZXRTRXh0VmFsdWUoKSA+PSAyKSkgeworICAgICAgUm9vdCA9ICZCYXNlLmdldE9wZXJhbmQoMCk7CisgICAgfQorICB9CisgIGlmIChpc2E8RnJhbWVJbmRleFNETm9kZT4oKlJvb3QpKSB7CisgICAgLy8gQWxsIGZyYW1lIGluZGljaWVzIGFyZSB3b3JkIGFsaWduZWQKKyAgICBBbGlnbmVkQmFzZSA9IEJhc2U7CisgICAgT2Zmc2V0ID0gb2ZmOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChSb290LT5nZXRPcGNvZGUoKSA9PSBYQ29yZUlTRDo6RFBSZWxhdGl2ZVdyYXBwZXIgfHwKKyAgICAgIFJvb3QtPmdldE9wY29kZSgpID09IFhDb3JlSVNEOjpDUFJlbGF0aXZlV3JhcHBlcikgeworICAgIC8vIEFsbCBkcCAvIGNwIHJlbGF0aXZlIGFkZHJlc3NlcyBhcmUgd29yZCBhbGlnbmVkCisgICAgQWxpZ25lZEJhc2UgPSBCYXNlOworICAgIE9mZnNldCA9IG9mZjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK1NEVmFsdWUgWENvcmVUYXJnZXRMb3dlcmluZzo6CitMb3dlckxPQUQoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0Cit7CisgIExvYWRTRE5vZGUgKkxEID0gY2FzdDxMb2FkU0ROb2RlPihPcCk7CisgIGFzc2VydChMRC0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6Tk9OX0VYVExPQUQgJiYKKyAgICAgICAgICJVbmV4cGVjdGVkIGV4dGVuc2lvbiB0eXBlIik7CisgIGFzc2VydChMRC0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OmkzMiAmJiAiVW5leHBlY3RlZCBsb2FkIEVWVCIpOworICBpZiAoYWxsb3dzVW5hbGlnbmVkTWVtb3J5QWNjZXNzZXMoTEQtPmdldE1lbW9yeVZUKCkpKSB7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorICB1bnNpZ25lZCBBQklBbGlnbm1lbnQgPSBnZXRUYXJnZXREYXRhKCktPgorICAgIGdldEFCSVR5cGVBbGlnbm1lbnQoTEQtPmdldE1lbW9yeVZUKCkuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSkpOworICAvLyBMZWF2ZSBhbGlnbmVkIGxvYWQgYWxvbmUuCisgIGlmIChMRC0+Z2V0QWxpZ25tZW50KCkgPj0gQUJJQWxpZ25tZW50KSB7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorICBTRFZhbHVlIENoYWluID0gTEQtPmdldENoYWluKCk7CisgIFNEVmFsdWUgQmFzZVB0ciA9IExELT5nZXRCYXNlUHRyKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgCisgIFNEVmFsdWUgQmFzZTsKKyAgaW50NjRfdCBPZmZzZXQ7CisgIGlmICghTEQtPmlzVm9sYXRpbGUoKSAmJgorICAgICAgSXNXb3JkQWxpZ25lZEJhc2VQbHVzQ29uc3RhbnRPZmZzZXQoQmFzZVB0ciwgQmFzZSwgT2Zmc2V0KSkgeworICAgIGlmIChPZmZzZXQgJSA0ID09IDApIHsKKyAgICAgIC8vIFdlJ3ZlIG1hbmFnZWQgdG8gaW5mZXIgYmV0dGVyIGFsaWdubWVudCBpbmZvcm1hdGlvbiB0aGFuIHRoZSBsb2FkCisgICAgICAvLyBhbHJlYWR5IGhhcy4gVXNlIGFuIGFsaWduZWQgbG9hZC4KKyAgICAgIC8vCisgICAgICAvLyBGSVhNRTogTm8gbmV3IGFsaWdubWVudCBpbmZvcm1hdGlvbiBpcyBhY3R1YWxseSBwYXNzZWQgaGVyZS4KKyAgICAgIC8vIFNob3VsZCB0aGUgb2Zmc2V0IHJlYWxseSBiZSA0PworICAgICAgLy8KKyAgICAgIHJldHVybiBEQUcuZ2V0TG9hZChnZXRQb2ludGVyVHkoKSwgZGwsIENoYWluLCBCYXNlUHRyLCBOVUxMLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgfQorICAgIC8vIExvd2VyIHRvCisgICAgLy8gbGR3IGxvdywgYmFzZVtvZmZzZXQgPj4gMl0KKyAgICAvLyBsZHcgaGlnaCwgYmFzZVsob2Zmc2V0ID4+IDIpICsgMV0KKyAgICAvLyBzaHIgbG93X3NoaWZ0ZWQsIGxvdywgKG9mZnNldCAmIDB4MykgKiA4CisgICAgLy8gc2hsIGhpZ2hfc2hpZnRlZCwgaGlnaCwgMzIgLSAob2Zmc2V0ICYgMHgzKSAqIDgKKyAgICAvLyBvciByZXN1bHQsIGxvd19zaGlmdGVkLCBoaWdoX3NoaWZ0ZWQKKyAgICBTRFZhbHVlIExvd09mZnNldCA9IERBRy5nZXRDb25zdGFudChPZmZzZXQgJiB+MHgzLCBNVlQ6OmkzMik7CisgICAgU0RWYWx1ZSBIaWdoT2Zmc2V0ID0gREFHLmdldENvbnN0YW50KChPZmZzZXQgJiB+MHgzKSArIDQsIE1WVDo6aTMyKTsKKyAgICBTRFZhbHVlIExvd1NoaWZ0ID0gREFHLmdldENvbnN0YW50KChPZmZzZXQgJiAweDMpICogOCwgTVZUOjppMzIpOworICAgIFNEVmFsdWUgSGlnaFNoaWZ0ID0gREFHLmdldENvbnN0YW50KDMyIC0gKE9mZnNldCAmIDB4MykgKiA4LCBNVlQ6OmkzMik7CisgICAgCisgICAgU0RWYWx1ZSBMb3dBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgQmFzZSwgTG93T2Zmc2V0KTsKKyAgICBTRFZhbHVlIEhpZ2hBZGRyID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgQmFzZSwgSGlnaE9mZnNldCk7CisgICAgCisgICAgU0RWYWx1ZSBMb3cgPSBEQUcuZ2V0TG9hZChnZXRQb2ludGVyVHkoKSwgZGwsIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG93QWRkciwgTlVMTCwgNCwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICBTRFZhbHVlIEhpZ2ggPSBEQUcuZ2V0TG9hZChnZXRQb2ludGVyVHkoKSwgZGwsIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hBZGRyLCBOVUxMLCA0LCBmYWxzZSwgZmFsc2UsIDApOworICAgIFNEVmFsdWUgTG93U2hpZnRlZCA9IERBRy5nZXROb2RlKElTRDo6U1JMLCBkbCwgTVZUOjppMzIsIExvdywgTG93U2hpZnQpOworICAgIFNEVmFsdWUgSGlnaFNoaWZ0ZWQgPSBEQUcuZ2V0Tm9kZShJU0Q6OlNITCwgZGwsIE1WVDo6aTMyLCBIaWdoLCBIaWdoU2hpZnQpOworICAgIFNEVmFsdWUgUmVzdWx0ID0gREFHLmdldE5vZGUoSVNEOjpPUiwgZGwsIE1WVDo6aTMyLCBMb3dTaGlmdGVkLCBIaWdoU2hpZnRlZCk7CisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgTG93LmdldFZhbHVlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoLmdldFZhbHVlKDEpKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBSZXN1bHQsIENoYWluIH07CisgICAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPcHMsIDIsIGRsKTsKKyAgfQorICAKKyAgaWYgKExELT5nZXRBbGlnbm1lbnQoKSA9PSAyKSB7CisgICAgaW50IFNWT2Zmc2V0ID0gTEQtPmdldFNyY1ZhbHVlT2Zmc2V0KCk7CisgICAgU0RWYWx1ZSBMb3cgPSBEQUcuZ2V0RXh0TG9hZChJU0Q6OlpFWFRMT0FELCBNVlQ6OmkzMiwgZGwsIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVB0ciwgTEQtPmdldFNyY1ZhbHVlKCksIFNWT2Zmc2V0LCBNVlQ6OmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5pc1ZvbGF0aWxlKCksIExELT5pc05vblRlbXBvcmFsKCksIDIpOworICAgIFNEVmFsdWUgSGlnaEFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCBCYXNlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMiwgTVZUOjppMzIpKTsKKyAgICBTRFZhbHVlIEhpZ2ggPSBEQUcuZ2V0RXh0TG9hZChJU0Q6OkVYVExPQUQsIE1WVDo6aTMyLCBkbCwgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaEFkZHIsIExELT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMTYsIExELT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmlzTm9uVGVtcG9yYWwoKSwgMik7CisgICAgU0RWYWx1ZSBIaWdoU2hpZnRlZCA9IERBRy5nZXROb2RlKElTRDo6U0hMLCBkbCwgTVZUOjppMzIsIEhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxNiwgTVZUOjppMzIpKTsKKyAgICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6T1IsIGRsLCBNVlQ6OmkzMiwgTG93LCBIaWdoU2hpZnRlZCk7CisgICAgQ2hhaW4gPSBEQUcuZ2V0Tm9kZShJU0Q6OlRva2VuRmFjdG9yLCBkbCwgTVZUOjpPdGhlciwgTG93LmdldFZhbHVlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoLmdldFZhbHVlKDEpKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBSZXN1bHQsIENoYWluIH07CisgICAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPcHMsIDIsIGRsKTsKKyAgfQorICAKKyAgLy8gTG93ZXIgdG8gYSBjYWxsIHRvIF9fbWlzYWxpZ25lZF9sb2FkKEJhc2VQdHIpLgorICBjb25zdCBUeXBlICpJbnRQdHJUeSA9IGdldFRhcmdldERhdGEoKS0+Z2V0SW50UHRyVHlwZSgqREFHLmdldENvbnRleHQoKSk7CisgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0VHkgQXJnczsKKyAgVGFyZ2V0TG93ZXJpbmc6OkFyZ0xpc3RFbnRyeSBFbnRyeTsKKyAgCisgIEVudHJ5LlR5ID0gSW50UHRyVHk7CisgIEVudHJ5Lk5vZGUgPSBCYXNlUHRyOworICBBcmdzLnB1c2hfYmFjayhFbnRyeSk7CisgIAorICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gQ2FsbFJlc3VsdCA9CisgICAgICAgIExvd2VyQ2FsbFRvKENoYWluLCBJbnRQdHJUeSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDAsIENhbGxpbmdDb252OjpDLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLyppc1JldHVyblZhbHVlVXNlZD0qL3RydWUsCisgICAgICAgICAgICAgICAgICAgIERBRy5nZXRFeHRlcm5hbFN5bWJvbCgiX19taXNhbGlnbmVkX2xvYWQiLCBnZXRQb2ludGVyVHkoKSksCisgICAgICAgICAgICAgICAgICAgIEFyZ3MsIERBRywgZGwpOworCisgIFNEVmFsdWUgT3BzW10gPQorICAgIHsgQ2FsbFJlc3VsdC5maXJzdCwgQ2FsbFJlc3VsdC5zZWNvbmQgfTsKKworICByZXR1cm4gREFHLmdldE1lcmdlVmFsdWVzKE9wcywgMiwgZGwpOworfQorCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJTVE9SRShTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QKK3sKKyAgU3RvcmVTRE5vZGUgKlNUID0gY2FzdDxTdG9yZVNETm9kZT4oT3ApOworICBhc3NlcnQoIVNULT5pc1RydW5jYXRpbmdTdG9yZSgpICYmICJVbmV4cGVjdGVkIHN0b3JlIHR5cGUiKTsKKyAgYXNzZXJ0KFNULT5nZXRNZW1vcnlWVCgpID09IE1WVDo6aTMyICYmICJVbmV4cGVjdGVkIHN0b3JlIEVWVCIpOworICBpZiAoYWxsb3dzVW5hbGlnbmVkTWVtb3J5QWNjZXNzZXMoU1QtPmdldE1lbW9yeVZUKCkpKSB7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorICB1bnNpZ25lZCBBQklBbGlnbm1lbnQgPSBnZXRUYXJnZXREYXRhKCktPgorICAgIGdldEFCSVR5cGVBbGlnbm1lbnQoU1QtPmdldE1lbW9yeVZUKCkuZ2V0VHlwZUZvckVWVCgqREFHLmdldENvbnRleHQoKSkpOworICAvLyBMZWF2ZSBhbGlnbmVkIHN0b3JlIGFsb25lLgorICBpZiAoU1QtPmdldEFsaWdubWVudCgpID49IEFCSUFsaWdubWVudCkgeworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKyAgU0RWYWx1ZSBDaGFpbiA9IFNULT5nZXRDaGFpbigpOworICBTRFZhbHVlIEJhc2VQdHIgPSBTVC0+Z2V0QmFzZVB0cigpOworICBTRFZhbHVlIFZhbHVlID0gU1QtPmdldFZhbHVlKCk7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgCisgIGlmIChTVC0+Z2V0QWxpZ25tZW50KCkgPT0gMikgeworICAgIGludCBTVk9mZnNldCA9IFNULT5nZXRTcmNWYWx1ZU9mZnNldCgpOworICAgIFNEVmFsdWUgTG93ID0gVmFsdWU7CisgICAgU0RWYWx1ZSBIaWdoID0gREFHLmdldE5vZGUoSVNEOjpTUkwsIGRsLCBNVlQ6OmkzMiwgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudCgxNiwgTVZUOjppMzIpKTsKKyAgICBTRFZhbHVlIFN0b3JlTG93ID0gREFHLmdldFRydW5jU3RvcmUoQ2hhaW4sIGRsLCBMb3csIEJhc2VQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5nZXRTcmNWYWx1ZSgpLCBTVk9mZnNldCwgTVZUOjppMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNULT5pc1ZvbGF0aWxlKCksIFNULT5pc05vblRlbXBvcmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworICAgIFNEVmFsdWUgSGlnaEFkZHIgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCBCYXNlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMiwgTVZUOjppMzIpKTsKKyAgICBTRFZhbHVlIFN0b3JlSGlnaCA9IERBRy5nZXRUcnVuY1N0b3JlKENoYWluLCBkbCwgSGlnaCwgSGlnaEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+Z2V0U3JjVmFsdWUoKSwgU1ZPZmZzZXQgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUOjppMTYsIFNULT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVC0+aXNOb25UZW1wb3JhbCgpLCAyKTsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIFN0b3JlTG93LCBTdG9yZUhpZ2gpOworICB9CisgIAorICAvLyBMb3dlciB0byBhIGNhbGwgdG8gX19taXNhbGlnbmVkX3N0b3JlKEJhc2VQdHIsIFZhbHVlKS4KKyAgY29uc3QgVHlwZSAqSW50UHRyVHkgPSBnZXRUYXJnZXREYXRhKCktPmdldEludFB0clR5cGUoKkRBRy5nZXRDb250ZXh0KCkpOworICBUYXJnZXRMb3dlcmluZzo6QXJnTGlzdFR5IEFyZ3M7CisgIFRhcmdldExvd2VyaW5nOjpBcmdMaXN0RW50cnkgRW50cnk7CisgIAorICBFbnRyeS5UeSA9IEludFB0clR5OworICBFbnRyeS5Ob2RlID0gQmFzZVB0cjsKKyAgQXJncy5wdXNoX2JhY2soRW50cnkpOworICAKKyAgRW50cnkuTm9kZSA9IFZhbHVlOworICBBcmdzLnB1c2hfYmFjayhFbnRyeSk7CisgIAorICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gQ2FsbFJlc3VsdCA9CisgICAgICAgIExvd2VyQ2FsbFRvKENoYWluLCBUeXBlOjpnZXRWb2lkVHkoKkRBRy5nZXRDb250ZXh0KCkpLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCwgQ2FsbGluZ0NvbnY6OkMsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKmlzUmV0dXJuVmFsdWVVc2VkPSovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgREFHLmdldEV4dGVybmFsU3ltYm9sKCJfX21pc2FsaWduZWRfc3RvcmUiLCBnZXRQb2ludGVyVHkoKSksCisgICAgICAgICAgICAgICAgICAgIEFyZ3MsIERBRywgZGwpOworCisgIHJldHVybiBDYWxsUmVzdWx0LnNlY29uZDsKK30KKworU0RWYWx1ZSBYQ29yZVRhcmdldExvd2VyaW5nOjoKK0xvd2VyU01VTF9MT0hJKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICBhc3NlcnQoT3AuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjppMzIgJiYgT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTTVVMX0xPSEkgJiYKKyAgICAgICAgICJVbmV4cGVjdGVkIG9wZXJhbmQgdG8gbG93ZXIhIik7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgU0RWYWx1ZSBMSFMgPSBPcC5nZXRPcGVyYW5kKDApOworICBTRFZhbHVlIFJIUyA9IE9wLmdldE9wZXJhbmQoMSk7CisgIFNEVmFsdWUgWmVybyA9IERBRy5nZXRDb25zdGFudCgwLCBNVlQ6OmkzMik7CisgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShYQ29yZUlTRDo6TUFDQ1MsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldFZUTGlzdChNVlQ6OmkzMiwgTVZUOjppMzIpLCBaZXJvLCBaZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTLCBSSFMpOworICBTRFZhbHVlIExvKEhpLmdldE5vZGUoKSwgMSk7CisgIFNEVmFsdWUgT3BzW10gPSB7IExvLCBIaSB9OworICByZXR1cm4gREFHLmdldE1lcmdlVmFsdWVzKE9wcywgMiwgZGwpOworfQorCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJVTVVMX0xPSEkoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0Cit7CisgIGFzc2VydChPcC5nZXRWYWx1ZVR5cGUoKSA9PSBNVlQ6OmkzMiAmJiBPcC5nZXRPcGNvZGUoKSA9PSBJU0Q6OlVNVUxfTE9ISSAmJgorICAgICAgICAgIlVuZXhwZWN0ZWQgb3BlcmFuZCB0byBsb3dlciEiKTsKKyAgRGVidWdMb2MgZGwgPSBPcC5nZXREZWJ1Z0xvYygpOworICBTRFZhbHVlIExIUyA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgUkhTID0gT3AuZ2V0T3BlcmFuZCgxKTsKKyAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBIaSA9IERBRy5nZXROb2RlKFhDb3JlSVNEOjpMTVVMLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoTVZUOjppMzIsIE1WVDo6aTMyKSwgTEhTLCBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBaZXJvLCBaZXJvKTsKKyAgU0RWYWx1ZSBMbyhIaS5nZXROb2RlKCksIDEpOworICBTRFZhbHVlIE9wc1tdID0geyBMbywgSGkgfTsKKyAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPcHMsIDIsIGRsKTsKK30KKworLy8vIGlzQUREQURETVVMIC0gUmV0dXJuIHdoZXRoZXIgT3AgaXMgaW4gYSBmb3JtIHRoYXQgaXMgZXF1aXZhbGVudCB0bworLy8vIGFkZChhZGQobXVsKHgseSksYSksYikuIElmIHJlcXVpcmVJbnRlcm1lZGlhdGVzSGF2ZU9uZVVzZSBpcyB0cnVlIHRoZW4KKy8vLyBlYWNoIGludGVybWVkaWF0ZSByZXN1bHQgaW4gdGhlIGNhbGN1bGF0aW9uIG11c3QgYWxzbyBoYXZlIGEgc2luZ2xlIHVzZS4KKy8vLyBJZiB0aGUgT3AgaXMgaW4gdGhlIGNvcnJlY3QgZm9ybSB0aGUgY29uc3RpdHVlbnQgcGFydHMgYXJlIHdyaXR0ZW4gdG8gTXVsMCwKKy8vLyBNdWwxLCBBZGRlbmQwIGFuZCBBZGRlbmQxLgorc3RhdGljIGJvb2wKK2lzQUREQURETVVMKFNEVmFsdWUgT3AsIFNEVmFsdWUgJk11bDAsIFNEVmFsdWUgJk11bDEsIFNEVmFsdWUgJkFkZGVuZDAsCisgICAgICAgICAgICBTRFZhbHVlICZBZGRlbmQxLCBib29sIHJlcXVpcmVJbnRlcm1lZGlhdGVzSGF2ZU9uZVVzZSkKK3sKKyAgaWYgKE9wLmdldE9wY29kZSgpICE9IElTRDo6QUREKQorICAgIHJldHVybiBmYWxzZTsKKyAgU0RWYWx1ZSBOMCA9IE9wLmdldE9wZXJhbmQoMCk7CisgIFNEVmFsdWUgTjEgPSBPcC5nZXRPcGVyYW5kKDEpOworICBTRFZhbHVlIEFkZE9wOworICBTRFZhbHVlIE90aGVyT3A7CisgIGlmIChOMC5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIEFkZE9wID0gTjA7CisgICAgT3RoZXJPcCA9IE4xOworICB9IGVsc2UgaWYgKE4xLmdldE9wY29kZSgpID09IElTRDo6QUREKSB7CisgICAgQWRkT3AgPSBOMTsKKyAgICBPdGhlck9wID0gTjA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChyZXF1aXJlSW50ZXJtZWRpYXRlc0hhdmVPbmVVc2UgJiYgIUFkZE9wLmhhc09uZVVzZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKE90aGVyT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpNVUwpIHsKKyAgICAvLyBhZGQoYWRkKGEsYiksbXVsKHgseSkpCisgICAgaWYgKHJlcXVpcmVJbnRlcm1lZGlhdGVzSGF2ZU9uZVVzZSAmJiAhT3RoZXJPcC5oYXNPbmVVc2UoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBNdWwwID0gT3RoZXJPcC5nZXRPcGVyYW5kKDApOworICAgIE11bDEgPSBPdGhlck9wLmdldE9wZXJhbmQoMSk7CisgICAgQWRkZW5kMCA9IEFkZE9wLmdldE9wZXJhbmQoMCk7CisgICAgQWRkZW5kMSA9IEFkZE9wLmdldE9wZXJhbmQoMSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKEFkZE9wLmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpNVUwpIHsKKyAgICAvLyBhZGQoYWRkKG11bCh4LHkpLGEpLGIpCisgICAgaWYgKHJlcXVpcmVJbnRlcm1lZGlhdGVzSGF2ZU9uZVVzZSAmJiAhQWRkT3AuZ2V0T3BlcmFuZCgwKS5oYXNPbmVVc2UoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBNdWwwID0gQWRkT3AuZ2V0T3BlcmFuZCgwKS5nZXRPcGVyYW5kKDApOworICAgIE11bDEgPSBBZGRPcC5nZXRPcGVyYW5kKDApLmdldE9wZXJhbmQoMSk7CisgICAgQWRkZW5kMCA9IEFkZE9wLmdldE9wZXJhbmQoMSk7CisgICAgQWRkZW5kMSA9IE90aGVyT3A7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKEFkZE9wLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpNVUwpIHsKKyAgICAvLyBhZGQoYWRkKGEsbXVsKHgseSkpLGIpCisgICAgaWYgKHJlcXVpcmVJbnRlcm1lZGlhdGVzSGF2ZU9uZVVzZSAmJiAhQWRkT3AuZ2V0T3BlcmFuZCgxKS5oYXNPbmVVc2UoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBNdWwwID0gQWRkT3AuZ2V0T3BlcmFuZCgxKS5nZXRPcGVyYW5kKDApOworICAgIE11bDEgPSBBZGRPcC5nZXRPcGVyYW5kKDEpLmdldE9wZXJhbmQoMSk7CisgICAgQWRkZW5kMCA9IEFkZE9wLmdldE9wZXJhbmQoMCk7CisgICAgQWRkZW5kMSA9IE90aGVyT3A7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorVHJ5RXhwYW5kQUREV2l0aE11bChTRE5vZGUgKk4sIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICBTRFZhbHVlIE11bDsKKyAgU0RWYWx1ZSBPdGhlcjsKKyAgaWYgKE4tPmdldE9wZXJhbmQoMCkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpNVUwpIHsKKyAgICBNdWwgPSBOLT5nZXRPcGVyYW5kKDApOworICAgIE90aGVyID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgfSBlbHNlIGlmIChOLT5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IElTRDo6TVVMKSB7CisgICAgTXVsID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgICBPdGhlciA9IE4tPmdldE9wZXJhbmQoMCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIFNEVmFsdWUgTEwsIFJMLCBBZGRlbmRMLCBBZGRlbmRIOworICBMTCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgTXVsLmdldE9wZXJhbmQoMCksICBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpKTsKKyAgUkwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgIE11bC5nZXRPcGVyYW5kKDEpLCAgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSk7CisgIEFkZGVuZEwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIsICBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpKTsKKyAgQWRkZW5kSCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICBPdGhlciwgIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6OmkzMikpOworICBBUEludCBIaWdoTWFzayA9IEFQSW50OjpnZXRIaWdoQml0c1NldCg2NCwgMzIpOworICB1bnNpZ25lZCBMSFNTQiA9IERBRy5Db21wdXRlTnVtU2lnbkJpdHMoTXVsLmdldE9wZXJhbmQoMCkpOworICB1bnNpZ25lZCBSSFNTQiA9IERBRy5Db21wdXRlTnVtU2lnbkJpdHMoTXVsLmdldE9wZXJhbmQoMSkpOworICBpZiAoREFHLk1hc2tlZFZhbHVlSXNaZXJvKE11bC5nZXRPcGVyYW5kKDApLCBIaWdoTWFzaykgJiYKKyAgICAgIERBRy5NYXNrZWRWYWx1ZUlzWmVybyhNdWwuZ2V0T3BlcmFuZCgxKSwgSGlnaE1hc2spKSB7CisgICAgLy8gVGhlIGlucHV0cyBhcmUgYm90aCB6ZXJvLWV4dGVuZGVkLgorICAgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShYQ29yZUlTRDo6TUFDQ1UsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlRMaXN0KE1WVDo6aTMyLCBNVlQ6OmkzMiksIEFkZGVuZEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVuZEwsIExMLCBSTCk7CisgICAgU0RWYWx1ZSBMbyhIaS5nZXROb2RlKCksIDEpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1BBSVIsIGRsLCBNVlQ6Omk2NCwgTG8sIEhpKTsKKyAgfQorICBpZiAoTEhTU0IgPiAzMiAmJiBSSFNTQiA+IDMyKSB7CisgICAgLy8gVGhlIGlucHV0cyBhcmUgYm90aCBzaWduLWV4dGVuZGVkLgorICAgIFNEVmFsdWUgSGkgPSBEQUcuZ2V0Tm9kZShYQ29yZUlTRDo6TUFDQ1MsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0VlRMaXN0KE1WVDo6aTMyLCBNVlQ6OmkzMiksIEFkZGVuZEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVuZEwsIExMLCBSTCk7CisgICAgU0RWYWx1ZSBMbyhIaS5nZXROb2RlKCksIDEpOworICAgIHJldHVybiBEQUcuZ2V0Tm9kZShJU0Q6OkJVSUxEX1BBSVIsIGRsLCBNVlQ6Omk2NCwgTG8sIEhpKTsKKyAgfQorICBTRFZhbHVlIExILCBSSDsKKyAgTEggPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgIE11bC5nZXRPcGVyYW5kKDApLCAgREFHLmdldENvbnN0YW50KDEsIE1WVDo6aTMyKSk7CisgIFJIID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICBNdWwuZ2V0T3BlcmFuZCgxKSwgIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6OmkzMikpOworICBTRFZhbHVlIEhpID0gREFHLmdldE5vZGUoWENvcmVJU0Q6Ok1BQ0NVLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoTVZUOjppMzIsIE1WVDo6aTMyKSwgQWRkZW5kSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVuZEwsIExMLCBSTCk7CisgIFNEVmFsdWUgTG8oSGkuZ2V0Tm9kZSgpLCAxKTsKKyAgUkggPSBEQUcuZ2V0Tm9kZShJU0Q6Ok1VTCwgZGwsIE1WVDo6aTMyLCBMTCwgUkgpOworICBMSCA9IERBRy5nZXROb2RlKElTRDo6TVVMLCBkbCwgTVZUOjppMzIsIExILCBSTCk7CisgIEhpID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBNVlQ6OmkzMiwgSGksIFJIKTsKKyAgSGkgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIE1WVDo6aTMyLCBIaSwgTEgpOworICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgTVZUOjppNjQsIExvLCBIaSk7Cit9CisKK1NEVmFsdWUgWENvcmVUYXJnZXRMb3dlcmluZzo6CitFeHBhbmRBRERTVUIoU0ROb2RlICpOLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QKK3sKKyAgYXNzZXJ0KE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6Omk2NCAmJgorICAgICAgICAgKE4tPmdldE9wY29kZSgpID09IElTRDo6QUREIHx8IE4tPmdldE9wY29kZSgpID09IElTRDo6U1VCKSAmJgorICAgICAgICAiVW5rbm93biBvcGVyYW5kIHRvIGxvd2VyISIpOworCisgIGlmIChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgeworICAgIFNEVmFsdWUgUmVzdWx0ID0gVHJ5RXhwYW5kQUREV2l0aE11bChOLCBEQUcpOworICAgIGlmIChSZXN1bHQuZ2V0Tm9kZSgpICE9IDApCisgICAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgRGVidWdMb2MgZGwgPSBOLT5nZXREZWJ1Z0xvYygpOworICAKKyAgLy8gRXh0cmFjdCBjb21wb25lbnRzCisgIFNEVmFsdWUgTEhTTCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgwKSwgIERBRy5nZXRDb25zdGFudCgwLCBNVlQ6OmkzMikpOworICBTRFZhbHVlIExIU0ggPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMCksICBEQUcuZ2V0Q29uc3RhbnQoMSwgTVZUOjppMzIpKTsKKyAgU0RWYWx1ZSBSSFNMID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0T3BlcmFuZCgxKSwgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSk7CisgIFNEVmFsdWUgUkhTSCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldE9wZXJhbmQoMSksIERBRy5nZXRDb25zdGFudCgxLCBNVlQ6OmkzMikpOworICAKKyAgLy8gRXhwYW5kCisgIHVuc2lnbmVkIE9wY29kZSA9IChOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERCkgPyBYQ29yZUlTRDo6TEFERCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQ29yZUlTRDo6TFNVQjsKKyAgU0RWYWx1ZSBaZXJvID0gREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKTsKKyAgU0RWYWx1ZSBDYXJyeSA9IERBRy5nZXROb2RlKE9wY29kZSwgZGwsIERBRy5nZXRWVExpc3QoTVZUOjppMzIsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNMLCBSSFNMLCBaZXJvKTsKKyAgU0RWYWx1ZSBMbyhDYXJyeS5nZXROb2RlKCksIDEpOworICAKKyAgU0RWYWx1ZSBJZ25vcmVkID0gREFHLmdldE5vZGUoT3Bjb2RlLCBkbCwgREFHLmdldFZUTGlzdChNVlQ6OmkzMiwgTVZUOjppMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIU0gsIFJIU0gsIENhcnJ5KTsKKyAgU0RWYWx1ZSBIaShJZ25vcmVkLmdldE5vZGUoKSwgMSk7CisgIC8vIE1lcmdlIHRoZSBwaWVjZXMKKyAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlVJTERfUEFJUiwgZGwsIE1WVDo6aTY0LCBMbywgSGkpOworfQorCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJWQUFSRyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QKK3sKKyAgbGx2bV91bnJlYWNoYWJsZSgidW5pbXBsZW1lbnRlZCIpOworICAvLyBGSVggQXJndW1lbnRzIHBhc3NlZCBieSByZWZlcmVuY2UgbmVlZCBhIGV4dHJhIGRlcmVmZXJlbmNlLgorICBTRE5vZGUgKk5vZGUgPSBPcC5nZXROb2RlKCk7CisgIERlYnVnTG9jIGRsID0gTm9kZS0+Z2V0RGVidWdMb2MoKTsKKyAgY29uc3QgVmFsdWUgKlYgPSBjYXN0PFNyY1ZhbHVlU0ROb2RlPihOb2RlLT5nZXRPcGVyYW5kKDIpKS0+Z2V0VmFsdWUoKTsKKyAgRVZUIFZUID0gTm9kZS0+Z2V0VmFsdWVUeXBlKDApOworICBTRFZhbHVlIFZBTGlzdCA9IERBRy5nZXRMb2FkKGdldFBvaW50ZXJUeSgpLCBkbCwgTm9kZS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRPcGVyYW5kKDEpLCBWLCAwLCBmYWxzZSwgZmFsc2UsIDApOworICAvLyBJbmNyZW1lbnQgdGhlIHBvaW50ZXIsIFZBTGlzdCwgdG8gdGhlIG5leHQgdmFyYXJnCisgIFNEVmFsdWUgVG1wMyA9IERBRy5nZXROb2RlKElTRDo6QURELCBkbCwgZ2V0UG9pbnRlclR5KCksIFZBTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoVlQuZ2V0U2l6ZUluQml0cygpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSkpOworICAvLyBTdG9yZSB0aGUgaW5jcmVtZW50ZWQgVkFMaXN0IHRvIHRoZSBsZWdhbGl6ZWQgcG9pbnRlcgorICBUbXAzID0gREFHLmdldFN0b3JlKFZBTGlzdC5nZXRWYWx1ZSgxKSwgZGwsIFRtcDMsIE5vZGUtPmdldE9wZXJhbmQoMSksIFYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKKyAgLy8gTG9hZCB0aGUgYWN0dWFsIGFyZ3VtZW50IG91dCBvZiB0aGUgcG9pbnRlciBWQUxpc3QKKyAgcmV0dXJuIERBRy5nZXRMb2FkKFZULCBkbCwgVG1wMywgVkFMaXN0LCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIDApOworfQorCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6OgorTG93ZXJWQVNUQVJUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdAoreworICBEZWJ1Z0xvYyBkbCA9IE9wLmdldERlYnVnTG9jKCk7CisgIC8vIHZhc3RhcnQgc3RvcmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBWYXJBcmdzRnJhbWVJbmRleCBzbG90IGludG8gdGhlCisgIC8vIG1lbW9yeSBsb2NhdGlvbiBhcmd1bWVudAorICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBYQ29yZUZ1bmN0aW9uSW5mbyAqWEZJID0gTUYuZ2V0SW5mbzxYQ29yZUZ1bmN0aW9uSW5mbz4oKTsKKyAgU0RWYWx1ZSBBZGRyID0gREFHLmdldEZyYW1lSW5kZXgoWEZJLT5nZXRWYXJBcmdzRnJhbWVJbmRleCgpLCBNVlQ6OmkzMik7CisgIGNvbnN0IFZhbHVlICpTViA9IGNhc3Q8U3JjVmFsdWVTRE5vZGU+KE9wLmdldE9wZXJhbmQoMikpLT5nZXRWYWx1ZSgpOworICByZXR1cm4gREFHLmdldFN0b3JlKE9wLmdldE9wZXJhbmQoMCksIGRsLCBBZGRyLCBPcC5nZXRPcGVyYW5kKDEpLCBTViwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworfQorCitTRFZhbHVlIFhDb3JlVGFyZ2V0TG93ZXJpbmc6Okxvd2VyRlJBTUVBRERSKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgIERlYnVnTG9jIGRsID0gT3AuZ2V0RGVidWdMb2MoKTsKKyAgLy8gRGVwdGhzID4gMCBub3Qgc3VwcG9ydGVkIHlldCEgCisgIGlmIChjYXN0PENvbnN0YW50U0ROb2RlPihPcC5nZXRPcGVyYW5kKDApKS0+Z2V0WkV4dFZhbHVlKCkgPiAwKQorICAgIHJldHVybiBTRFZhbHVlKCk7CisgIAorICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gREFHLmdldE1hY2hpbmVGdW5jdGlvbigpOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJlZ0luZm8gPSBnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIHJldHVybiBEQUcuZ2V0Q29weUZyb21SZWcoREFHLmdldEVudHJ5Tm9kZSgpLCBkbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnSW5mby0+Z2V0RnJhbWVSZWdpc3RlcihNRiksIE1WVDo6aTMyKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmcgQ29udmVudGlvbiBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlhDb3JlR2VuQ2FsbGluZ0NvbnYuaW5jIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICBDYWxsIENhbGxpbmcgQ29udmVudGlvbiBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFhDb3JlIGNhbGwgaW1wbGVtZW50YXRpb24KK1NEVmFsdWUKK1hDb3JlVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgLy8gWENvcmUgdGFyZ2V0IGRvZXMgbm90IHlldCBzdXBwb3J0IHRhaWwgY2FsbCBvcHRpbWl6YXRpb24uCisgIGlzVGFpbENhbGwgPSBmYWxzZTsKKworICAvLyBGb3Igbm93LCBvbmx5IENhbGxpbmdDb252OjpDIGltcGxlbWVudGVkCisgIHN3aXRjaCAoQ2FsbENvbnYpCisgIHsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgY2FsbGluZyBjb252ZW50aW9uIik7CisgICAgY2FzZSBDYWxsaW5nQ29udjo6RmFzdDoKKyAgICBjYXNlIENhbGxpbmdDb252OjpDOgorICAgICAgcmV0dXJuIExvd2VyQ0NDQ2FsbFRvKENoYWluLCBDYWxsZWUsIENhbGxDb252LCBpc1ZhckFyZywgaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRzLCBPdXRWYWxzLCBJbnMsIGRsLCBEQUcsIEluVmFscyk7CisgIH0KK30KKworLy8vIExvd2VyQ0NDQ2FsbFRvIC0gZnVuY3Rpb25zIGFyZ3VtZW50cyBhcmUgY29waWVkIGZyb20gdmlydHVhbAorLy8vIHJlZ3MgdG8gKHBoeXNpY2FsIHJlZ3MpLyhzdGFjayBmcmFtZSksIENBTExTRVFfU1RBUlQgYW5kCisvLy8gQ0FMTFNFUV9FTkQgYXJlIGVtaXR0ZWQuCisvLy8gVE9ETzogaXNUYWlsQ2FsbCwgc3JldC4KK1NEVmFsdWUKK1hDb3JlVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ0NDQ2FsbFRvKFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKworICAvLyBBbmFseXplIG9wZXJhbmRzIG9mIHRoZSBjYWxsLCBhc3NpZ25pbmcgbG9jYXRpb25zIHRvIGVhY2ggb3BlcmFuZC4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgQXJnTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIC8vIFRoZSBBQkkgZGljdGF0ZXMgdGhlcmUgc2hvdWxkIGJlIG9uZSBzdGFjayBzbG90IGF2YWlsYWJsZSB0byB0aGUgY2FsbGVlCisgIC8vIG9uIGZ1bmN0aW9uIGVudHJ5IChmb3Igc2F2aW5nIGxyKS4KKyAgQ0NJbmZvLkFsbG9jYXRlU3RhY2soNCwgNCk7CisKKyAgQ0NJbmZvLkFuYWx5emVDYWxsT3BlcmFuZHMoT3V0cywgQ0NfWENvcmUpOworCisgIC8vIEdldCBhIGNvdW50IG9mIGhvdyBtYW55IGJ5dGVzIGFyZSB0byBiZSBwdXNoZWQgb24gdGhlIHN0YWNrLgorICB1bnNpZ25lZCBOdW1CeXRlcyA9IENDSW5mby5nZXROZXh0U3RhY2tPZmZzZXQoKTsKKworICBDaGFpbiA9IERBRy5nZXRDQUxMU0VRX1NUQVJUKENoYWluLERBRy5nZXRDb25zdGFudChOdW1CeXRlcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludGVyVHkoKSwgdHJ1ZSkpOworCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgU0RWYWx1ZT4sIDQ+IFJlZ3NUb1Bhc3M7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDEyPiBNZW1PcENoYWluczsKKworICAvLyBXYWxrIHRoZSByZWdpc3Rlci9tZW1sb2MgYXNzaWdubWVudHMsIGluc2VydGluZyBjb3BpZXMvbG9hZHMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdMb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDQ1ZhbEFzc2lnbiAmVkEgPSBBcmdMb2NzW2ldOworICAgIFNEVmFsdWUgQXJnID0gT3V0VmFsc1tpXTsKKworICAgIC8vIFByb21vdGUgdGhlIHZhbHVlIGlmIG5lZWRlZC4KKyAgICBzd2l0Y2ggKFZBLmdldExvY0luZm8oKSkgeworICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBsb2MgaW5mbyEiKTsKKyAgICAgIGNhc2UgQ0NWYWxBc3NpZ246OkZ1bGw6IGJyZWFrOworICAgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6U0V4dDoKKyAgICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgZGwsIFZBLmdldExvY1ZUKCksIEFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6WkV4dDoKKyAgICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgZGwsIFZBLmdldExvY1ZUKCksIEFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQ1ZhbEFzc2lnbjo6QUV4dDoKKyAgICAgICAgQXJnID0gREFHLmdldE5vZGUoSVNEOjpBTllfRVhURU5ELCBkbCwgVkEuZ2V0TG9jVlQoKSwgQXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIC8vIEFyZ3VtZW50cyB0aGF0IGNhbiBiZSBwYXNzZWQgb24gcmVnaXN0ZXIgbXVzdCBiZSBrZXB0IGF0IAorICAgIC8vIFJlZ3NUb1Bhc3MgdmVjdG9yCisgICAgaWYgKFZBLmlzUmVnTG9jKCkpIHsKKyAgICAgIFJlZ3NUb1Bhc3MucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFZBLmdldExvY1JlZygpLCBBcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KFZBLmlzTWVtTG9jKCkpOworCisgICAgICBpbnQgT2Zmc2V0ID0gVkEuZ2V0TG9jTWVtT2Zmc2V0KCk7CisKKyAgICAgIE1lbU9wQ2hhaW5zLnB1c2hfYmFjayhEQUcuZ2V0Tm9kZShYQ29yZUlTRDo6U1RXU1AsIGRsLCBNVlQ6Ok90aGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbiwgQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChPZmZzZXQvNCwgTVZUOjppMzIpKSk7CisgICAgfQorICB9CisKKyAgLy8gVHJhbnNmb3JtIGFsbCBzdG9yZSBub2RlcyBpbnRvIG9uZSBzaW5nbGUgbm9kZSBiZWNhdXNlCisgIC8vIGFsbCBzdG9yZSBub2RlcyBhcmUgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlci4KKyAgaWYgKCFNZW1PcENoYWlucy5lbXB0eSgpKQorICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgJk1lbU9wQ2hhaW5zWzBdLCBNZW1PcENoYWlucy5zaXplKCkpOworCisgIC8vIEJ1aWxkIGEgc2VxdWVuY2Ugb2YgY29weS10by1yZWcgbm9kZXMgY2hhaW5lZCB0b2dldGhlciB3aXRoIHRva2VuIAorICAvLyBjaGFpbiBhbmQgZmxhZyBvcGVyYW5kcyB3aGljaCBjb3B5IHRoZSBvdXRnb2luZyBhcmdzIGludG8gcmVnaXN0ZXJzLgorICAvLyBUaGUgSW5GbGFnIGluIG5lY2Vzc2FyeSBzaW5jZSBhbGwgZW1pdGVkIGluc3RydWN0aW9ucyBtdXN0IGJlCisgIC8vIHN0dWNrIHRvZ2V0aGVyLgorICBTRFZhbHVlIEluRmxhZzsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3NUb1Bhc3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENoYWluID0gREFHLmdldENvcHlUb1JlZyhDaGFpbiwgZGwsIFJlZ3NUb1Bhc3NbaV0uZmlyc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdzVG9QYXNzW2ldLnNlY29uZCwgSW5GbGFnKTsKKyAgICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIC8vIElmIHRoZSBjYWxsZWUgaXMgYSBHbG9iYWxBZGRyZXNzIG5vZGUgKHF1aXRlIGNvbW1vbiwgZXZlcnkgZGlyZWN0IGNhbGwgaXMpCisgIC8vIHR1cm4gaXQgaW50byBhIFRhcmdldEdsb2JhbEFkZHJlc3Mgbm9kZSBzbyB0aGF0IGxlZ2FsaXplIGRvZXNuJ3QgaGFjayBpdC4KKyAgLy8gTGlrZXdpc2UgRXh0ZXJuYWxTeW1ib2wgLT4gVGFyZ2V0RXh0ZXJuYWxTeW1ib2wuCisgIGlmIChHbG9iYWxBZGRyZXNzU0ROb2RlICpHID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oQ2FsbGVlKSkKKyAgICBDYWxsZWUgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHLT5nZXRHbG9iYWwoKSwgZGwsIE1WVDo6aTMyKTsKKyAgZWxzZSBpZiAoRXh0ZXJuYWxTeW1ib2xTRE5vZGUgKkUgPSBkeW5fY2FzdDxFeHRlcm5hbFN5bWJvbFNETm9kZT4oQ2FsbGVlKSkKKyAgICBDYWxsZWUgPSBEQUcuZ2V0VGFyZ2V0RXh0ZXJuYWxTeW1ib2woRS0+Z2V0U3ltYm9sKCksIE1WVDo6aTMyKTsKKworICAvLyBYQ29yZUJyYW5jaExpbmsgPSAjY2hhaW4sICN0YXJnZXRfYWRkcmVzcywgI29wdF9pbl9mbGFncy4uLgorICAvLyAgICAgICAgICAgICA9IENoYWluLCBDYWxsZWUsIFJlZyMxLCBSZWcjMiwgLi4uICAKKyAgLy8KKyAgLy8gUmV0dXJucyBhIGNoYWluICYgYSBmbGFnIGZvciByZXR2YWwgY29weSB0byB1c2UuCisgIFNEVlRMaXN0IE5vZGVUeXMgPSBEQUcuZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6RmxhZyk7CisgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDg+IE9wczsKKyAgT3BzLnB1c2hfYmFjayhDaGFpbik7CisgIE9wcy5wdXNoX2JhY2soQ2FsbGVlKTsKKworICAvLyBBZGQgYXJndW1lbnQgcmVnaXN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gdGhhdCB0aGV5IGFyZSAKKyAgLy8ga25vd24gbGl2ZSBpbnRvIHRoZSBjYWxsLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnc1RvUGFzcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE9wcy5wdXNoX2JhY2soREFHLmdldFJlZ2lzdGVyKFJlZ3NUb1Bhc3NbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnc1RvUGFzc1tpXS5zZWNvbmQuZ2V0VmFsdWVUeXBlKCkpKTsKKworICBpZiAoSW5GbGFnLmdldE5vZGUoKSkKKyAgICBPcHMucHVzaF9iYWNrKEluRmxhZyk7CisKKyAgQ2hhaW4gID0gREFHLmdldE5vZGUoWENvcmVJU0Q6OkJMLCBkbCwgTm9kZVR5cywgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgIEluRmxhZyA9IENoYWluLmdldFZhbHVlKDEpOworCisgIC8vIENyZWF0ZSB0aGUgQ0FMTFNFUV9FTkQgbm9kZS4KKyAgQ2hhaW4gPSBEQUcuZ2V0Q0FMTFNFUV9FTkQoQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRDb25zdGFudChOdW1CeXRlcywgZ2V0UG9pbnRlclR5KCksIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoMCwgZ2V0UG9pbnRlclR5KCksIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkZsYWcpOworICBJbkZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKworICAvLyBIYW5kbGUgcmVzdWx0IHZhbHVlcywgY29weWluZyB0aGVtIG91dCBvZiBwaHlzcmVncyBpbnRvIHZyZWdzIHRoYXQgd2UKKyAgLy8gcmV0dXJuLgorICByZXR1cm4gTG93ZXJDYWxsUmVzdWx0KENoYWluLCBJbkZsYWcsIENhbGxDb252LCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnMsIGRsLCBEQUcsIEluVmFscyk7Cit9CisKKy8vLyBMb3dlckNhbGxSZXN1bHQgLSBMb3dlciB0aGUgcmVzdWx0IHZhbHVlcyBvZiBhIGNhbGwgaW50byB0aGUKKy8vLyBhcHByb3ByaWF0ZSBjb3BpZXMgb3V0IG9mIGFwcHJvcHJpYXRlIHBoeXNpY2FsIHJlZ2lzdGVycy4KK1NEVmFsdWUKK1hDb3JlVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbFJlc3VsdChTRFZhbHVlIENoYWluLCBTRFZhbHVlIEluRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmSW5WYWxzKSBjb25zdCB7CisKKyAgLy8gQXNzaWduIGxvY2F0aW9ucyB0byBlYWNoIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgY2FsbC4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBSVkxvY3M7CisgIENDU3RhdGUgQ0NJbmZvKENhbGxDb252LCBpc1ZhckFyZywgZ2V0VGFyZ2V0TWFjaGluZSgpLAorICAgICAgICAgICAgICAgICBSVkxvY3MsICpEQUcuZ2V0Q29udGV4dCgpKTsKKworICBDQ0luZm8uQW5hbHl6ZUNhbGxSZXN1bHQoSW5zLCBSZXRDQ19YQ29yZSk7CisKKyAgLy8gQ29weSBhbGwgb2YgdGhlIHJlc3VsdCByZWdpc3RlcnMgb3V0IG9mIHRoZWlyIHNwZWNpZmllZCBwaHlzcmVnLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJWTG9jcy5zaXplKCk7ICsraSkgeworICAgIENoYWluID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgUlZMb2NzW2ldLmdldExvY1JlZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlZMb2NzW2ldLmdldFZhbFZUKCksIEluRmxhZykuZ2V0VmFsdWUoMSk7CisgICAgSW5GbGFnID0gQ2hhaW4uZ2V0VmFsdWUoMik7CisgICAgSW5WYWxzLnB1c2hfYmFjayhDaGFpbi5nZXRWYWx1ZSgwKSk7CisgIH0KKworICByZXR1cm4gQ2hhaW47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICBGb3JtYWwgQXJndW1lbnRzIENhbGxpbmcgQ29udmVudGlvbiBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFhDb3JlIGZvcm1hbCBhcmd1bWVudHMgaW1wbGVtZW50YXRpb24KK1NEVmFsdWUKK1hDb3JlVGFyZ2V0TG93ZXJpbmc6Okxvd2VyRm9ybWFsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeworICBzd2l0Y2ggKENhbGxDb252KQorICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIGNhbGxpbmcgY29udmVudGlvbiIpOworICAgIGNhc2UgQ2FsbGluZ0NvbnY6OkM6CisgICAgY2FzZSBDYWxsaW5nQ29udjo6RmFzdDoKKyAgICAgIHJldHVybiBMb3dlckNDQ0FyZ3VtZW50cyhDaGFpbiwgQ2FsbENvbnYsIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucywgZGwsIERBRywgSW5WYWxzKTsKKyAgfQorfQorCisvLy8gTG93ZXJDQ0NBcmd1bWVudHMgLSB0cmFuc2Zvcm0gcGh5c2ljYWwgcmVnaXN0ZXJzIGludG8KKy8vLyB2aXJ0dWFsIHJlZ2lzdGVycyBhbmQgZ2VuZXJhdGUgbG9hZCBvcGVyYXRpb25zIGZvcgorLy8vIGFyZ3VtZW50cyBwbGFjZXMgb24gdGhlIHN0YWNrLgorLy8vIFRPRE86IHNyZXQKK1NEVmFsdWUKK1hDb3JlVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ0NDQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9IERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8gPSBNRi5nZXRSZWdJbmZvKCk7CisKKyAgLy8gQXNzaWduIGxvY2F0aW9ucyB0byBhbGwgb2YgdGhlIGluY29taW5nIGFyZ3VtZW50cy4KKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBBcmdMb2NzOworICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgQXJnTG9jcywgKkRBRy5nZXRDb250ZXh0KCkpOworCisgIENDSW5mby5BbmFseXplRm9ybWFsQXJndW1lbnRzKElucywgQ0NfWENvcmUpOworCisgIHVuc2lnbmVkIFN0YWNrU2xvdFNpemUgPSBYQ29yZUZyYW1lSW5mbzo6c3RhY2tTbG90U2l6ZSgpOworCisgIHVuc2lnbmVkIExSU2F2ZVNpemUgPSBTdGFja1Nsb3RTaXplOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ0xvY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworCisgICAgQ0NWYWxBc3NpZ24gJlZBID0gQXJnTG9jc1tpXTsKKyAgICAKKyAgICBpZiAoVkEuaXNSZWdMb2MoKSkgeworICAgICAgLy8gQXJndW1lbnRzIHBhc3NlZCBpbiByZWdpc3RlcnMKKyAgICAgIEVWVCBSZWdWVCA9IFZBLmdldExvY1ZUKCk7CisgICAgICBzd2l0Y2ggKFJlZ1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgZXJycygpIDw8ICJMb3dlckZvcm1hbEFyZ3VtZW50cyBVbmhhbmRsZWQgYXJndW1lbnQgdHlwZTogIgorICAgICAgICAgICAgICAgICA8PCBSZWdWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5IDw8ICJcbiI7CisjZW5kaWYKKyAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgICAgICB9CisgICAgICBjYXNlIE1WVDo6aTMyOgorICAgICAgICB1bnNpZ25lZCBWUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhDb3JlOjpHUlJlZ3NSZWdpc3RlckNsYXNzKTsKKyAgICAgICAgUmVnSW5mby5hZGRMaXZlSW4oVkEuZ2V0TG9jUmVnKCksIFZSZWcpOworICAgICAgICBJblZhbHMucHVzaF9iYWNrKERBRy5nZXRDb3B5RnJvbVJlZyhDaGFpbiwgZGwsIFZSZWcsIFJlZ1ZUKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHNhbml0eSBjaGVjaworICAgICAgYXNzZXJ0KFZBLmlzTWVtTG9jKCkpOworICAgICAgLy8gTG9hZCB0aGUgYXJndW1lbnQgdG8gYSB2aXJ0dWFsIHJlZ2lzdGVyCisgICAgICB1bnNpZ25lZCBPYmpTaXplID0gVkEuZ2V0TG9jVlQoKS5nZXRTaXplSW5CaXRzKCkvODsKKyAgICAgIGlmIChPYmpTaXplID4gU3RhY2tTbG90U2l6ZSkgeworICAgICAgICBlcnJzKCkgPDwgIkxvd2VyRm9ybWFsQXJndW1lbnRzIFVuaGFuZGxlZCBhcmd1bWVudCB0eXBlOiAiCisgICAgICAgICAgICAgICA8PCAodW5zaWduZWQpVkEuZ2V0TG9jVlQoKS5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5CisgICAgICAgICAgICAgICA8PCAiXG4iOworICAgICAgfQorICAgICAgLy8gQ3JlYXRlIHRoZSBmcmFtZSBpbmRleCBvYmplY3QgZm9yIHRoaXMgaW5jb21pbmcgcGFyYW1ldGVyLi4uCisgICAgICBpbnQgRkkgPSBNRkktPkNyZWF0ZUZpeGVkT2JqZWN0KE9ialNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExSU2F2ZVNpemUgKyBWQS5nZXRMb2NNZW1PZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisKKyAgICAgIC8vIENyZWF0ZSB0aGUgU2VsZWN0aW9uREFHIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gYSBsb2FkCisgICAgICAvL2Zyb20gdGhpcyBwYXJhbWV0ZXIKKyAgICAgIFNEVmFsdWUgRklOID0gREFHLmdldEZyYW1lSW5kZXgoRkksIE1WVDo6aTMyKTsKKyAgICAgIEluVmFscy5wdXNoX2JhY2soREFHLmdldExvYWQoVkEuZ2V0TG9jVlQoKSwgZGwsIENoYWluLCBGSU4sIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgMCkpOworICAgIH0KKyAgfQorICAKKyAgaWYgKGlzVmFyQXJnKSB7CisgICAgLyogQXJndW1lbnQgcmVnaXN0ZXJzICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEFyZ1JlZ3NbXSA9IHsKKyAgICAgIFhDb3JlOjpSMCwgWENvcmU6OlIxLCBYQ29yZTo6UjIsIFhDb3JlOjpSMworICAgIH07CisgICAgWENvcmVGdW5jdGlvbkluZm8gKlhGSSA9IE1GLmdldEluZm88WENvcmVGdW5jdGlvbkluZm8+KCk7CisgICAgdW5zaWduZWQgRmlyc3RWQVJlZyA9IENDSW5mby5nZXRGaXJzdFVuYWxsb2NhdGVkKEFyZ1JlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2xlbmd0aG9mKEFyZ1JlZ3MpKTsKKyAgICBpZiAoRmlyc3RWQVJlZyA8IGFycmF5X2xlbmd0aG9mKEFyZ1JlZ3MpKSB7CisgICAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBNZW1PcHM7CisgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgIC8vIFNhdmUgcmVtYWluaW5nIHJlZ2lzdGVycywgc3RvcmluZyBoaWdoZXIgcmVnaXN0ZXIgbnVtYmVycyBhdCBhIGhpZ2hlcgorICAgICAgLy8gYWRkcmVzcworICAgICAgZm9yICh1bnNpZ25lZCBpID0gYXJyYXlfbGVuZ3Rob2YoQXJnUmVncykgLSAxOyBpID49IEZpcnN0VkFSZWc7IC0taSkgeworICAgICAgICAvLyBDcmVhdGUgYSBzdGFjayBzbG90CisgICAgICAgIGludCBGSSA9IE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoNCwgb2Zmc2V0LCB0cnVlKTsKKyAgICAgICAgaWYgKGkgPT0gRmlyc3RWQVJlZykgeworICAgICAgICAgIFhGSS0+c2V0VmFyQXJnc0ZyYW1lSW5kZXgoRkkpOworICAgICAgICB9CisgICAgICAgIG9mZnNldCAtPSBTdGFja1Nsb3RTaXplOworICAgICAgICBTRFZhbHVlIEZJTiA9IERBRy5nZXRGcmFtZUluZGV4KEZJLCBNVlQ6OmkzMik7CisgICAgICAgIC8vIE1vdmUgYXJndW1lbnQgZnJvbSBwaHlzIHJlZyAtPiB2aXJ0IHJlZworICAgICAgICB1bnNpZ25lZCBWUmVnID0gUmVnSW5mby5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhDb3JlOjpHUlJlZ3NSZWdpc3RlckNsYXNzKTsKKyAgICAgICAgUmVnSW5mby5hZGRMaXZlSW4oQXJnUmVnc1tpXSwgVlJlZyk7CisgICAgICAgIFNEVmFsdWUgVmFsID0gREFHLmdldENvcHlGcm9tUmVnKENoYWluLCBkbCwgVlJlZywgTVZUOjppMzIpOworICAgICAgICAvLyBNb3ZlIGFyZ3VtZW50IGZyb20gdmlydCByZWcgLT4gc3RhY2sKKyAgICAgICAgU0RWYWx1ZSBTdG9yZSA9IERBRy5nZXRTdG9yZShWYWwuZ2V0VmFsdWUoMSksIGRsLCBWYWwsIEZJTiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICBNZW1PcHMucHVzaF9iYWNrKFN0b3JlKTsKKyAgICAgIH0KKyAgICAgIGlmICghTWVtT3BzLmVtcHR5KCkpCisgICAgICAgIENoYWluID0gREFHLmdldE5vZGUoSVNEOjpUb2tlbkZhY3RvciwgZGwsIE1WVDo6T3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbU9wc1swXSwgTWVtT3BzLnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoaXMgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBhcmd1bWVudCBwYXNzZWQgdmlhIHN0YWNrLgorICAgICAgWEZJLT5zZXRWYXJBcmdzRnJhbWVJbmRleCgKKyAgICAgICAgTUZJLT5DcmVhdGVGaXhlZE9iamVjdCg0LCBMUlNhdmVTaXplICsgQ0NJbmZvLmdldE5leHRTdGFja09mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiBDaGFpbjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgUmV0dXJuIFZhbHVlIENhbGxpbmcgQ29udmVudGlvbiBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworYm9vbCBYQ29yZVRhcmdldExvd2VyaW5nOjoKK0Nhbkxvd2VyUmV0dXJuKENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKyAgQ0NTdGF0ZSBDQ0luZm8oQ2FsbENvbnYsIGlzVmFyQXJnLCBnZXRUYXJnZXRNYWNoaW5lKCksCisgICAgICAgICAgICAgICAgIFJWTG9jcywgQ29udGV4dCk7CisgIHJldHVybiBDQ0luZm8uQ2hlY2tSZXR1cm4oT3V0cywgUmV0Q0NfWENvcmUpOworfQorCitTRFZhbHVlCitYQ29yZVRhcmdldExvd2VyaW5nOjpMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3QgeworCisgIC8vIENDVmFsQXNzaWduIC0gcmVwcmVzZW50IHRoZSBhc3NpZ25tZW50IG9mCisgIC8vIHRoZSByZXR1cm4gdmFsdWUgdG8gYSBsb2NhdGlvbgorICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFJWTG9jczsKKworICAvLyBDQ1N0YXRlIC0gSW5mbyBhYm91dCB0aGUgcmVnaXN0ZXJzIGFuZCBzdGFjayBzbG90LgorICBDQ1N0YXRlIENDSW5mbyhDYWxsQ29udiwgaXNWYXJBcmcsIGdldFRhcmdldE1hY2hpbmUoKSwKKyAgICAgICAgICAgICAgICAgUlZMb2NzLCAqREFHLmdldENvbnRleHQoKSk7CisKKyAgLy8gQW5hbGl6ZSByZXR1cm4gdmFsdWVzLgorICBDQ0luZm8uQW5hbHl6ZVJldHVybihPdXRzLCBSZXRDQ19YQ29yZSk7CisKKyAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgcmV0dXJuIGxvd2VyZWQgZm9yIHRoaXMgZnVuY3Rpb24sIGFkZCAKKyAgLy8gdGhlIHJlZ3MgdG8gdGhlIGxpdmVvdXQgc2V0IGZvciB0aGUgZnVuY3Rpb24uCisgIGlmIChEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0UmVnSW5mbygpLmxpdmVvdXRfZW1wdHkoKSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUlZMb2NzLnNpemUoKTsgKytpKQorICAgICAgaWYgKFJWTG9jc1tpXS5pc1JlZ0xvYygpKQorICAgICAgICBEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkuZ2V0UmVnSW5mbygpLmFkZExpdmVPdXQoUlZMb2NzW2ldLmdldExvY1JlZygpKTsKKyAgfQorCisgIFNEVmFsdWUgRmxhZzsKKworICAvLyBDb3B5IHRoZSByZXN1bHQgdmFsdWVzIGludG8gdGhlIG91dHB1dCByZWdpc3RlcnMuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUlZMb2NzLnNpemUoKTsgKytpKSB7CisgICAgQ0NWYWxBc3NpZ24gJlZBID0gUlZMb2NzW2ldOworICAgIGFzc2VydChWQS5pc1JlZ0xvYygpICYmICJDYW4gb25seSByZXR1cm4gaW4gcmVnaXN0ZXJzISIpOworCisgICAgQ2hhaW4gPSBEQUcuZ2V0Q29weVRvUmVnKENoYWluLCBkbCwgVkEuZ2V0TG9jUmVnKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRWYWxzW2ldLCBGbGFnKTsKKworICAgIC8vIGd1YXJhbnRlZSB0aGF0IGFsbCBlbWl0dGVkIGNvcGllcyBhcmUKKyAgICAvLyBzdHVjayB0b2dldGhlciwgYXZvaWRpbmcgc29tZXRoaW5nIGJhZAorICAgIEZsYWcgPSBDaGFpbi5nZXRWYWx1ZSgxKTsKKyAgfQorCisgIC8vIFJldHVybiBvbiBYQ29yZSBpcyBhbHdheXMgYSAicmV0c3AgMCIKKyAgaWYgKEZsYWcuZ2V0Tm9kZSgpKQorICAgIHJldHVybiBEQUcuZ2V0Tm9kZShYQ29yZUlTRDo6UkVUU1AsIGRsLCBNVlQ6Ok90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICBDaGFpbiwgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSwgRmxhZyk7CisgIGVsc2UgLy8gUmV0dXJuIFZvaWQKKyAgICByZXR1cm4gREFHLmdldE5vZGUoWENvcmVJU0Q6OlJFVFNQLCBkbCwgTVZUOjpPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW4sIERBRy5nZXRDb25zdGFudCgwLCBNVlQ6OmkzMikpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIE90aGVyIExvd2VyaW5nIENvZGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK01hY2hpbmVCYXNpY0Jsb2NrICoKK1hDb3JlVGFyZ2V0TG93ZXJpbmc6OkVtaXRJbnN0cldpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSA9ICpnZXRUYXJnZXRNYWNoaW5lKCkuZ2V0SW5zdHJJbmZvKCk7CisgIERlYnVnTG9jIGRsID0gTUktPmdldERlYnVnTG9jKCk7CisgIGFzc2VydCgoTUktPmdldE9wY29kZSgpID09IFhDb3JlOjpTRUxFQ1RfQ0MpICYmCisgICAgICAgICAiVW5leHBlY3RlZCBpbnN0ciB0eXBlIHRvIGluc2VydCIpOworICAKKyAgLy8gVG8gImluc2VydCIgYSBTRUxFQ1RfQ0MgaW5zdHJ1Y3Rpb24sIHdlIGFjdHVhbGx5IGhhdmUgdG8gaW5zZXJ0IHRoZSBkaWFtb25kCisgIC8vIGNvbnRyb2wtZmxvdyBwYXR0ZXJuLiAgVGhlIGluY29taW5nIGluc3RydWN0aW9uIGtub3dzIHRoZSBkZXN0aW5hdGlvbiB2cmVnCisgIC8vIHRvIHNldCwgdGhlIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyIHRvIGJyYW5jaCBvbiwgdGhlIHRydWUvZmFsc2UgdmFsdWVzIHRvCisgIC8vIHNlbGVjdCBiZXR3ZWVuLCBhbmQgYSBicmFuY2ggb3Bjb2RlIHRvIHVzZS4KKyAgY29uc3QgQmFzaWNCbG9jayAqTExWTV9CQiA9IEJCLT5nZXRCYXNpY0Jsb2NrKCk7CisgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgSXQgPSBCQjsKKyAgKytJdDsKKyAgCisgIC8vICB0aGlzTUJCOgorICAvLyAgLi4uCisgIC8vICAgVHJ1ZVZhbCA9IC4uLgorICAvLyAgIGNtcFRZIGNjWCwgcjEsIHIyCisgIC8vICAgYkNDIGNvcHkxTUJCCisgIC8vICAgZmFsbHRocm91Z2ggLS0+IGNvcHkwTUJCCisgIE1hY2hpbmVCYXNpY0Jsb2NrICp0aGlzTUJCID0gQkI7CisgIE1hY2hpbmVGdW5jdGlvbiAqRiA9IEJCLT5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmNvcHkwTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpzaW5rTUJCID0gRi0+Q3JlYXRlTWFjaGluZUJhc2ljQmxvY2soTExWTV9CQik7CisgIEYtPmluc2VydChJdCwgY29weTBNQkIpOworICBGLT5pbnNlcnQoSXQsIHNpbmtNQkIpOworCisgIC8vIFRyYW5zZmVyIHRoZSByZW1haW5kZXIgb2YgQkIgYW5kIGl0cyBzdWNjZXNzb3IgZWRnZXMgdG8gc2lua01CQi4KKyAgc2lua01CQi0+c3BsaWNlKHNpbmtNQkItPmJlZ2luKCksIEJCLAorICAgICAgICAgICAgICAgICAgbGx2bTo6bmV4dChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoTUkpKSwKKyAgICAgICAgICAgICAgICAgIEJCLT5lbmQoKSk7CisgIHNpbmtNQkItPnRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXMoQkIpOworCisgIC8vIE5leHQsIGFkZCB0aGUgdHJ1ZSBhbmQgZmFsbHRocm91Z2ggYmxvY2tzIGFzIGl0cyBzdWNjZXNzb3JzLgorICBCQi0+YWRkU3VjY2Vzc29yKGNvcHkwTUJCKTsKKyAgQkItPmFkZFN1Y2Nlc3NvcihzaW5rTUJCKTsKKyAgCisgIEJ1aWxkTUkoQkIsIGRsLCBUSUkuZ2V0KFhDb3JlOjpCUkZUX2xydTYpKQorICAgIC5hZGRSZWcoTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpLmFkZE1CQihzaW5rTUJCKTsKKworICAvLyAgY29weTBNQkI6CisgIC8vICAgJUZhbHNlVmFsdWUgPSAuLi4KKyAgLy8gICAjIGZhbGx0aHJvdWdoIHRvIHNpbmtNQkIKKyAgQkIgPSBjb3B5ME1CQjsKKyAgCisgIC8vIFVwZGF0ZSBtYWNoaW5lLUNGRyBlZGdlcworICBCQi0+YWRkU3VjY2Vzc29yKHNpbmtNQkIpOworICAKKyAgLy8gIHNpbmtNQkI6CisgIC8vICAgJVJlc3VsdCA9IHBoaSBbICVGYWxzZVZhbHVlLCBjb3B5ME1CQiBdLCBbICVUcnVlVmFsdWUsIHRoaXNNQkIgXQorICAvLyAgLi4uCisgIEJCID0gc2lua01CQjsKKyAgQnVpbGRNSSgqQkIsIEJCLT5iZWdpbigpLCBkbCwKKyAgICAgICAgICBUSUkuZ2V0KFhDb3JlOjpQSEkpLCBNSS0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkKKyAgICAuYWRkUmVnKE1JLT5nZXRPcGVyYW5kKDMpLmdldFJlZygpKS5hZGRNQkIoY29weTBNQkIpCisgICAgLmFkZFJlZyhNSS0+Z2V0T3BlcmFuZCgyKS5nZXRSZWcoKSkuYWRkTUJCKHRoaXNNQkIpOworICAKKyAgTUktPmVyYXNlRnJvbVBhcmVudCgpOyAgIC8vIFRoZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gaXMgZ29uZSBub3cuCisgIHJldHVybiBCQjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhcmdldCBPcHRpbWl6YXRpb24gSG9va3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NEVmFsdWUgWENvcmVUYXJnZXRMb3dlcmluZzo6UGVyZm9ybURBR0NvbWJpbmUoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0IHsKKyAgU2VsZWN0aW9uREFHICZEQUcgPSBEQ0kuREFHOworICBEZWJ1Z0xvYyBkbCA9IE4tPmdldERlYnVnTG9jKCk7CisgIHN3aXRjaCAoTi0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgWENvcmVJU0Q6OkxBREQ6IHsKKyAgICBTRFZhbHVlIE4wID0gTi0+Z2V0T3BlcmFuZCgwKTsKKyAgICBTRFZhbHVlIE4xID0gTi0+Z2V0T3BlcmFuZCgxKTsKKyAgICBTRFZhbHVlIE4yID0gTi0+Z2V0T3BlcmFuZCgyKTsKKyAgICBDb25zdGFudFNETm9kZSAqTjBDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4wKTsKKyAgICBDb25zdGFudFNETm9kZSAqTjFDID0gZHluX2Nhc3Q8Q29uc3RhbnRTRE5vZGU+KE4xKTsKKyAgICBFVlQgVlQgPSBOMC5nZXRWYWx1ZVR5cGUoKTsKKworICAgIC8vIGNhbm9uaWNhbGl6ZSBjb25zdGFudCB0byBSSFMKKyAgICBpZiAoTjBDICYmICFOMUMpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoWENvcmVJU0Q6OkxBREQsIGRsLCBEQUcuZ2V0VlRMaXN0KFZULCBWVCksIE4xLCBOMCwgTjIpOworCisgICAgLy8gZm9sZCAobGFkZCAwLCAwLCB4KSAtPiAwLCB4ICYgMQorICAgIGlmIChOMEMgJiYgTjBDLT5pc051bGxWYWx1ZSgpICYmIE4xQyAmJiBOMUMtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgIFNEVmFsdWUgQ2FycnkgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpOworICAgICAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFORCwgZGwsIFZULCBOMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDEsIFZUKSk7CisgICAgICBTRFZhbHVlIE9wcyBbXSA9IHsgQ2FycnksIFJlc3VsdCB9OworICAgICAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPcHMsIDIsIGRsKTsKKyAgICB9CisKKyAgICAvLyBmb2xkIChsYWRkIHgsIDAsIHkpIC0+IDAsIGFkZCB4LCB5IGlmZiBjYXJyeSBpcyB1bnVzZWQgYW5kIHkgaGFzIG9ubHkgdGhlCisgICAgLy8gbG93IGJpdCBzZXQKKyAgICBpZiAoTjFDICYmIE4xQy0+aXNOdWxsVmFsdWUoKSAmJiBOLT5oYXNOVXNlc09mVmFsdWUoMCwgMCkpIHsgCisgICAgICBBUEludCBLbm93blplcm8sIEtub3duT25lOworICAgICAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRIaWdoQml0c1NldChWVC5nZXRTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULmdldFNpemVJbkJpdHMoKSAtIDEpOworICAgICAgREFHLkNvbXB1dGVNYXNrZWRCaXRzKE4yLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lKTsKKyAgICAgIGlmIChLbm93blplcm8gPT0gTWFzaykgeworICAgICAgICBTRFZhbHVlIENhcnJ5ID0gREFHLmdldENvbnN0YW50KDAsIFZUKTsKKyAgICAgICAgU0RWYWx1ZSBSZXN1bHQgPSBEQUcuZ2V0Tm9kZShJU0Q6OkFERCwgZGwsIFZULCBOMCwgTjIpOworICAgICAgICBTRFZhbHVlIE9wcyBbXSA9IHsgQ2FycnksIFJlc3VsdCB9OworICAgICAgICByZXR1cm4gREFHLmdldE1lcmdlVmFsdWVzKE9wcywgMiwgZGwpOworICAgICAgfQorICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBYQ29yZUlTRDo6TFNVQjogeworICAgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICAgIFNEVmFsdWUgTjIgPSBOLT5nZXRPcGVyYW5kKDIpOworICAgIENvbnN0YW50U0ROb2RlICpOMEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjApOworICAgIENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEpOworICAgIEVWVCBWVCA9IE4wLmdldFZhbHVlVHlwZSgpOworCisgICAgLy8gZm9sZCAobHN1YiAwLCAwLCB4KSAtPiB4LCAteCBpZmYgeCBoYXMgb25seSB0aGUgbG93IGJpdCBzZXQKKyAgICBpZiAoTjBDICYmIE4wQy0+aXNOdWxsVmFsdWUoKSAmJiBOMUMgJiYgTjFDLT5pc051bGxWYWx1ZSgpKSB7ICAgCisgICAgICBBUEludCBLbm93blplcm8sIEtub3duT25lOworICAgICAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRIaWdoQml0c1NldChWVC5nZXRTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULmdldFNpemVJbkJpdHMoKSAtIDEpOworICAgICAgREFHLkNvbXB1dGVNYXNrZWRCaXRzKE4yLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lKTsKKyAgICAgIGlmIChLbm93blplcm8gPT0gTWFzaykgeworICAgICAgICBTRFZhbHVlIEJvcnJvdyA9IE4yOworICAgICAgICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHLmdldENvbnN0YW50KDAsIFZUKSwgTjIpOworICAgICAgICBTRFZhbHVlIE9wcyBbXSA9IHsgQm9ycm93LCBSZXN1bHQgfTsKKyAgICAgICAgcmV0dXJuIERBRy5nZXRNZXJnZVZhbHVlcyhPcHMsIDIsIGRsKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBmb2xkIChsc3ViIHgsIDAsIHkpIC0+IDAsIHN1YiB4LCB5IGlmZiBib3Jyb3cgaXMgdW51c2VkIGFuZCB5IGhhcyBvbmx5IHRoZQorICAgIC8vIGxvdyBiaXQgc2V0CisgICAgaWYgKE4xQyAmJiBOMUMtPmlzTnVsbFZhbHVlKCkgJiYgTi0+aGFzTlVzZXNPZlZhbHVlKDAsIDApKSB7IAorICAgICAgQVBJbnQgS25vd25aZXJvLCBLbm93bk9uZTsKKyAgICAgIEFQSW50IE1hc2sgPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoVlQuZ2V0U2l6ZUluQml0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVC5nZXRTaXplSW5CaXRzKCkgLSAxKTsKKyAgICAgIERBRy5Db21wdXRlTWFza2VkQml0cyhOMiwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSk7CisgICAgICBpZiAoS25vd25aZXJvID09IE1hc2spIHsKKyAgICAgICAgU0RWYWx1ZSBCb3Jyb3cgPSBEQUcuZ2V0Q29uc3RhbnQoMCwgVlQpOworICAgICAgICBTRFZhbHVlIFJlc3VsdCA9IERBRy5nZXROb2RlKElTRDo6U1VCLCBkbCwgVlQsIE4wLCBOMik7CisgICAgICAgIFNEVmFsdWUgT3BzIFtdID0geyBCb3Jyb3csIFJlc3VsdCB9OworICAgICAgICByZXR1cm4gREFHLmdldE1lcmdlVmFsdWVzKE9wcywgMiwgZGwpOworICAgICAgfQorICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBYQ29yZUlTRDo6TE1VTDogeworICAgIFNEVmFsdWUgTjAgPSBOLT5nZXRPcGVyYW5kKDApOworICAgIFNEVmFsdWUgTjEgPSBOLT5nZXRPcGVyYW5kKDEpOworICAgIFNEVmFsdWUgTjIgPSBOLT5nZXRPcGVyYW5kKDIpOworICAgIFNEVmFsdWUgTjMgPSBOLT5nZXRPcGVyYW5kKDMpOworICAgIENvbnN0YW50U0ROb2RlICpOMEMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjApOworICAgIENvbnN0YW50U0ROb2RlICpOMUMgPSBkeW5fY2FzdDxDb25zdGFudFNETm9kZT4oTjEpOworICAgIEVWVCBWVCA9IE4wLmdldFZhbHVlVHlwZSgpOworICAgIC8vIENhbm9uaWNhbGl6ZSBtdWx0aXBsaWNhdGl2ZSBjb25zdGFudCB0byBSSFMuIElmIGJvdGggbXVsdGlwbGljYXRpdmUKKyAgICAvLyBvcGVyYW5kcyBhcmUgY29uc3RhbnQgY2Fub25pY2FsaXplIHNtYWxsZXN0IHRvIFJIUy4KKyAgICBpZiAoKE4wQyAmJiAhTjFDKSB8fAorICAgICAgICAoTjBDICYmIE4xQyAmJiBOMEMtPmdldFpFeHRWYWx1ZSgpIDwgTjFDLT5nZXRaRXh0VmFsdWUoKSkpCisgICAgICByZXR1cm4gREFHLmdldE5vZGUoWENvcmVJU0Q6OkxNVUwsIGRsLCBEQUcuZ2V0VlRMaXN0KFZULCBWVCksIE4xLCBOMCwgTjIsIE4zKTsKKworICAgIC8vIGxtdWwoeCwgMCwgYSwgYikKKyAgICBpZiAoTjFDICYmIE4xQy0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgLy8gSWYgdGhlIGhpZ2ggcmVzdWx0IGlzIHVudXNlZCBmb2xkIHRvIGFkZChhLCBiKQorICAgICAgaWYgKE4tPmhhc05Vc2VzT2ZWYWx1ZSgwLCAwKSkgeworICAgICAgICBTRFZhbHVlIExvID0gREFHLmdldE5vZGUoSVNEOjpBREQsIGRsLCBWVCwgTjIsIE4zKTsKKyAgICAgICAgU0RWYWx1ZSBPcHMgW10gPSB7IExvLCBMbyB9OworICAgICAgICByZXR1cm4gREFHLmdldE1lcmdlVmFsdWVzKE9wcywgMiwgZGwpOworICAgICAgfQorICAgICAgLy8gT3RoZXJ3aXNlIGZvbGQgdG8gbGFkZChhLCBiLCAwKQorICAgICAgcmV0dXJuIERBRy5nZXROb2RlKFhDb3JlSVNEOjpMQURELCBkbCwgREFHLmdldFZUTGlzdChWVCwgVlQpLCBOMiwgTjMsIE4xKTsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgSVNEOjpBREQ6IHsKKyAgICAvLyBGb2xkIDMyIGJpdCBleHByZXNzaW9ucyBzdWNoIGFzIGFkZChhZGQobXVsKHgseSksYSksYikgLT4KKyAgICAvLyBsbXVsKHgsIHksIGEsIGIpLiBUaGUgaGlnaCByZXN1bHQgb2YgbG11bCB3aWxsIGJlIGlnbm9yZWQuCisgICAgLy8gVGhpcyBpcyBvbmx5IHByb2ZpdGFibGUgaWYgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIGFyZSB1bnVzZWQKKyAgICAvLyBlbHNld2hlcmUuCisgICAgU0RWYWx1ZSBNdWwwLCBNdWwxLCBBZGRlbmQwLCBBZGRlbmQxOworICAgIGlmIChOLT5nZXRWYWx1ZVR5cGUoMCkgPT0gTVZUOjppMzIgJiYKKyAgICAgICAgaXNBRERBRERNVUwoU0RWYWx1ZShOLCAwKSwgTXVsMCwgTXVsMSwgQWRkZW5kMCwgQWRkZW5kMSwgdHJ1ZSkpIHsKKyAgICAgIFNEVmFsdWUgSWdub3JlZCA9IERBRy5nZXROb2RlKFhDb3JlSVNEOjpMTVVMLCBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoTVZUOjppMzIsIE1WVDo6aTMyKSwgTXVsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bDEsIEFkZGVuZDAsIEFkZGVuZDEpOworICAgICAgU0RWYWx1ZSBSZXN1bHQoSWdub3JlZC5nZXROb2RlKCksIDEpOworICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgQVBJbnQgSGlnaE1hc2sgPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoNjQsIDMyKTsKKyAgICAvLyBGb2xkIDY0IGJpdCBleHByZXNzaW9uIHN1Y2ggYXMgYWRkKGFkZChtdWwoeCx5KSxhKSxiKSAtPgorICAgIC8vIGxtdWwoeCwgeSwgYSwgYikgaWYgYWxsIG9wZXJhbmRzIGFyZSB6ZXJvLWV4dGVuZGVkLiBXZSBkbyB0aGlzCisgICAgLy8gYmVmb3JlIHR5cGUgbGVnYWxpemF0aW9uIGFzIGl0IGlzIG1lc3N5IHRvIG1hdGNoIHRoZSBvcGVyYW5kcyBhZnRlcgorICAgIC8vIHRoYXQuCisgICAgaWYgKE4tPmdldFZhbHVlVHlwZSgwKSA9PSBNVlQ6Omk2NCAmJgorICAgICAgICBpc0FEREFERE1VTChTRFZhbHVlKE4sIDApLCBNdWwwLCBNdWwxLCBBZGRlbmQwLCBBZGRlbmQxLCBmYWxzZSkgJiYKKyAgICAgICAgREFHLk1hc2tlZFZhbHVlSXNaZXJvKE11bDAsIEhpZ2hNYXNrKSAmJgorICAgICAgICBEQUcuTWFza2VkVmFsdWVJc1plcm8oTXVsMSwgSGlnaE1hc2spICYmCisgICAgICAgIERBRy5NYXNrZWRWYWx1ZUlzWmVybyhBZGRlbmQwLCBIaWdoTWFzaykgJiYKKyAgICAgICAgREFHLk1hc2tlZFZhbHVlSXNaZXJvKEFkZGVuZDEsIEhpZ2hNYXNrKSkgeworICAgICAgU0RWYWx1ZSBNdWwwTCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsMCwgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSk7CisgICAgICBTRFZhbHVlIE11bDFMID0gREFHLmdldE5vZGUoSVNEOjpFWFRSQUNUX0VMRU1FTlQsIGRsLCBNVlQ6OmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWwxLCBEQUcuZ2V0Q29uc3RhbnQoMCwgTVZUOjppMzIpKTsKKyAgICAgIFNEVmFsdWUgQWRkZW5kMEwgPSBEQUcuZ2V0Tm9kZShJU0Q6OkVYVFJBQ1RfRUxFTUVOVCwgZGwsIE1WVDo6aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVuZDAsIERBRy5nZXRDb25zdGFudCgwLCBNVlQ6OmkzMikpOworICAgICAgU0RWYWx1ZSBBZGRlbmQxTCA9IERBRy5nZXROb2RlKElTRDo6RVhUUkFDVF9FTEVNRU5ULCBkbCwgTVZUOjppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkZW5kMSwgREFHLmdldENvbnN0YW50KDAsIE1WVDo6aTMyKSk7CisgICAgICBTRFZhbHVlIEhpID0gREFHLmdldE5vZGUoWENvcmVJU0Q6OkxNVUwsIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRy5nZXRWVExpc3QoTVZUOjppMzIsIE1WVDo6aTMyKSwgTXVsMEwsIE11bDFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVuZDBMLCBBZGRlbmQxTCk7CisgICAgICBTRFZhbHVlIExvKEhpLmdldE5vZGUoKSwgMSk7CisgICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCVUlMRF9QQUlSLCBkbCwgTVZUOjppNjQsIExvLCBIaSk7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIElTRDo6U1RPUkU6IHsKKyAgICAvLyBSZXBsYWNlIHVuYWxpZ25lZCBzdG9yZSBvZiB1bmFsaWduZWQgbG9hZCB3aXRoIG1lbW1vdmUuCisgICAgU3RvcmVTRE5vZGUgKlNUICA9IGNhc3Q8U3RvcmVTRE5vZGU+KE4pOworICAgIGlmICghRENJLmlzQmVmb3JlTGVnYWxpemUoKSB8fAorICAgICAgICBhbGxvd3NVbmFsaWduZWRNZW1vcnlBY2Nlc3NlcyhTVC0+Z2V0TWVtb3J5VlQoKSkgfHwKKyAgICAgICAgU1QtPmlzVm9sYXRpbGUoKSB8fCBTVC0+aXNJbmRleGVkKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBTRFZhbHVlIENoYWluID0gU1QtPmdldENoYWluKCk7CisKKyAgICB1bnNpZ25lZCBTdG9yZUJpdHMgPSBTVC0+Z2V0TWVtb3J5VlQoKS5nZXRTdG9yZVNpemVJbkJpdHMoKTsKKyAgICBpZiAoU3RvcmVCaXRzICUgOCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHVuc2lnbmVkIEFCSUFsaWdubWVudCA9IGdldFRhcmdldERhdGEoKS0+Z2V0QUJJVHlwZUFsaWdubWVudCgKKyAgICAgICAgU1QtPmdldE1lbW9yeVZUKCkuZ2V0VHlwZUZvckVWVCgqRENJLkRBRy5nZXRDb250ZXh0KCkpKTsKKyAgICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBTVC0+Z2V0QWxpZ25tZW50KCk7CisgICAgaWYgKEFsaWdubWVudCA+PSBBQklBbGlnbm1lbnQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChMb2FkU0ROb2RlICpMRCA9IGR5bl9jYXN0PExvYWRTRE5vZGU+KFNULT5nZXRWYWx1ZSgpKSkgeworICAgICAgaWYgKExELT5oYXNOVXNlc09mVmFsdWUoMSwgMCkgJiYgU1QtPmdldE1lbW9yeVZUKCkgPT0gTEQtPmdldE1lbW9yeVZUKCkgJiYKKyAgICAgICAgTEQtPmdldEFsaWdubWVudCgpID09IEFsaWdubWVudCAmJgorICAgICAgICAhTEQtPmlzVm9sYXRpbGUoKSAmJiAhTEQtPmlzSW5kZXhlZCgpICYmCisgICAgICAgIENoYWluLnJlYWNoZXNDaGFpbldpdGhvdXRTaWRlRWZmZWN0cyhTRFZhbHVlKExELCAxKSkpIHsKKyAgICAgICAgcmV0dXJuIERBRy5nZXRNZW1tb3ZlKENoYWluLCBkbCwgU1QtPmdldEJhc2VQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExELT5nZXRCYXNlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Q29uc3RhbnQoU3RvcmVCaXRzLzgsIE1WVDo6aTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCwgZmFsc2UsIFNULT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QtPmdldFNyY1ZhbHVlT2Zmc2V0KCksIExELT5nZXRTcmNWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEQtPmdldFNyY1ZhbHVlT2Zmc2V0KCkpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorICB9CisgIHJldHVybiBTRFZhbHVlKCk7Cit9CisKK3ZvaWQgWENvcmVUYXJnZXRMb3dlcmluZzo6Y29tcHV0ZU1hc2tlZEJpdHNGb3JUYXJnZXROb2RlKGNvbnN0IFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSBjb25zdCB7CisgIEtub3duWmVybyA9IEtub3duT25lID0gQVBJbnQoTWFzay5nZXRCaXRXaWR0aCgpLCAwKTsKKyAgc3dpdGNoIChPcC5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSBYQ29yZUlTRDo6TEFERDoKKyAgY2FzZSBYQ29yZUlTRDo6TFNVQjoKKyAgICBpZiAoT3AuZ2V0UmVzTm8oKSA9PSAwKSB7CisgICAgICAvLyBUb3AgYml0cyBvZiBjYXJyeSAvIGJvcnJvdyBhcmUgY2xlYXIuCisgICAgICBLbm93blplcm8gPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoTWFzay5nZXRCaXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2suZ2V0Qml0V2lkdGgoKSAtIDEpOworICAgICAgS25vd25aZXJvICY9IE1hc2s7CisgICAgfQorICAgIGJyZWFrOworICB9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgQWRkcmVzc2luZyBtb2RlIGRlc2NyaXB0aW9uIGhvb2tzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNJbW1VcyhpbnQ2NF90IHZhbCkKK3sKKyAgcmV0dXJuICh2YWwgPj0gMCAmJiB2YWwgPD0gMTEpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNJbW1VczIoaW50NjRfdCB2YWwpCit7CisgIHJldHVybiAodmFsJTIgPT0gMCAmJiBpc0ltbVVzKHZhbC8yKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0ltbVVzNChpbnQ2NF90IHZhbCkKK3sKKyAgcmV0dXJuICh2YWwlNCA9PSAwICYmIGlzSW1tVXModmFsLzQpKTsKK30KKworLy8vIGlzTGVnYWxBZGRyZXNzaW5nTW9kZSAtIFJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzaW5nIG1vZGUgcmVwcmVzZW50ZWQKKy8vLyBieSBBTSBpcyBsZWdhbCBmb3IgdGhpcyB0YXJnZXQsIGZvciBhIGxvYWQvc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorYm9vbAorWENvcmVUYXJnZXRMb3dlcmluZzo6aXNMZWdhbEFkZHJlc3NpbmdNb2RlKGNvbnN0IEFkZHJNb2RlICZBTSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIGNvbnN0IHsKKyAgaWYgKFR5LT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpWb2lkVHlJRCkKKyAgICByZXR1cm4gQU0uU2NhbGUgPT0gMCAmJiBpc0ltbVVzKEFNLkJhc2VPZmZzKSAmJiBpc0ltbVVzNChBTS5CYXNlT2Zmcyk7CisKKyAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSBUTS5nZXRUYXJnZXREYXRhKCk7CisgIHVuc2lnbmVkIFNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShUeSk7CisgIGlmIChBTS5CYXNlR1YpIHsKKyAgICByZXR1cm4gU2l6ZSA+PSA0ICYmICFBTS5IYXNCYXNlUmVnICYmIEFNLlNjYWxlID09IDAgJiYKKyAgICAgICAgICAgICAgICAgQU0uQmFzZU9mZnMlNCA9PSAwOworICB9CisgIAorICBzd2l0Y2ggKFNpemUpIHsKKyAgY2FzZSAxOgorICAgIC8vIHJlZyArIGltbQorICAgIGlmIChBTS5TY2FsZSA9PSAwKSB7CisgICAgICByZXR1cm4gaXNJbW1VcyhBTS5CYXNlT2Zmcyk7CisgICAgfQorICAgIC8vIHJlZyArIHJlZworICAgIHJldHVybiBBTS5TY2FsZSA9PSAxICYmIEFNLkJhc2VPZmZzID09IDA7CisgIGNhc2UgMjoKKyAgY2FzZSAzOgorICAgIC8vIHJlZyArIGltbQorICAgIGlmIChBTS5TY2FsZSA9PSAwKSB7CisgICAgICByZXR1cm4gaXNJbW1VczIoQU0uQmFzZU9mZnMpOworICAgIH0KKyAgICAvLyByZWcgKyByZWc8PDEKKyAgICByZXR1cm4gQU0uU2NhbGUgPT0gMiAmJiBBTS5CYXNlT2ZmcyA9PSAwOworICBkZWZhdWx0OgorICAgIC8vIHJlZyArIGltbQorICAgIGlmIChBTS5TY2FsZSA9PSAwKSB7CisgICAgICByZXR1cm4gaXNJbW1VczQoQU0uQmFzZU9mZnMpOworICAgIH0KKyAgICAvLyByZWcgKyByZWc8PDIKKyAgICByZXR1cm4gQU0uU2NhbGUgPT0gNCAmJiBBTS5CYXNlT2ZmcyA9PSAwOworICB9CisgIAorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhDb3JlIElubGluZSBBc3NlbWJseSBTdXBwb3J0CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gWENvcmVUYXJnZXRMb3dlcmluZzo6CitnZXRSZWdDbGFzc0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCAKK3sKKyAgaWYgKENvbnN0cmFpbnQuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPigpOworCisgIHN3aXRjaCAoQ29uc3RyYWludFswXSkgeworICAgIGRlZmF1bHQgOiBicmVhazsKKyAgICBjYXNlICdyJzoKKyAgICAgIHJldHVybiBtYWtlX3ZlY3Rvcjx1bnNpZ25lZD4oWENvcmU6OlIwLCBYQ29yZTo6UjEsICBYQ29yZTo6UjIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQ29yZTo6UjMsIFhDb3JlOjpSNCwgIFhDb3JlOjpSNSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhDb3JlOjpSNiwgWENvcmU6OlI3LCAgWENvcmU6OlI4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWENvcmU6OlI5LCBYQ29yZTo6UjEwLCBYQ29yZTo6UjExLCAwKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJU2VsTG93ZXJpbmcuaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJU2VsTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWJjMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZUlTZWxMb3dlcmluZy5oCkBAIC0wLDAgKzEsMjAxIEBACisvLz09PS0tIFhDb3JlSVNlbExvd2VyaW5nLmggLSBYQ29yZSBEQUcgTG93ZXJpbmcgSW50ZXJmYWNlIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgWENvcmUgdXNlcyB0byBsb3dlciBMTFZNIGNvZGUgaW50byBhCisvLyBzZWxlY3Rpb24gREFHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWENPUkVJU0VMTE9XRVJJTkdfSAorI2RlZmluZSBYQ09SRUlTRUxMT1dFUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJYQ29yZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIAorICAvLyBGb3J3YXJkIGRlbGNhcmF0aW9ucworICBjbGFzcyBYQ29yZVN1YnRhcmdldDsKKyAgY2xhc3MgWENvcmVUYXJnZXRNYWNoaW5lOworICAKKyAgbmFtZXNwYWNlIFhDb3JlSVNEIHsKKyAgICBlbnVtIE5vZGVUeXBlIHsKKyAgICAgIC8vIFN0YXJ0IHRoZSBudW1iZXJpbmcgd2hlcmUgdGhlIGJ1aWx0aW4gb3BzIGFuZCB0YXJnZXQgb3BzIGxlYXZlIG9mZi4KKyAgICAgIEZJUlNUX05VTUJFUiA9IElTRDo6QlVJTFRJTl9PUF9FTkQsCisKKyAgICAgIC8vIEJyYW5jaCBhbmQgbGluayAoY2FsbCkKKyAgICAgIEJMLAorCisgICAgICAvLyBwYyByZWxhdGl2ZSBhZGRyZXNzCisgICAgICBQQ1JlbGF0aXZlV3JhcHBlciwKKworICAgICAgLy8gZHAgcmVsYXRpdmUgYWRkcmVzcworICAgICAgRFBSZWxhdGl2ZVdyYXBwZXIsCisgICAgICAKKyAgICAgIC8vIGNwIHJlbGF0aXZlIGFkZHJlc3MKKyAgICAgIENQUmVsYXRpdmVXcmFwcGVyLAorICAgICAgCisgICAgICAvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCisgICAgICBTVFdTUCwKKworICAgICAgLy8gQ29ycmVzcG9uZHMgdG8gcmV0c3AgaW5zdHJ1Y3Rpb24KKyAgICAgIFJFVFNQLAorICAgICAgCisgICAgICAvLyBDb3JyZXNwb25kcyB0byBMQUREIGluc3RydWN0aW9uCisgICAgICBMQURELAorCisgICAgICAvLyBDb3JyZXNwb25kcyB0byBMU1VCIGluc3RydWN0aW9uCisgICAgICBMU1VCLAorCisgICAgICAvLyBDb3JyZXNwb25kcyB0byBMTVVMIGluc3RydWN0aW9uCisgICAgICBMTVVMLAorCisgICAgICAvLyBDb3JyZXNwb25kcyB0byBNQUNDVSBpbnN0cnVjdGlvbgorICAgICAgTUFDQ1UsCisKKyAgICAgIC8vIENvcnJlc3BvbmRzIHRvIE1BQ0NTIGluc3RydWN0aW9uCisgICAgICBNQUNDUywKKworICAgICAgLy8gSnVtcHRhYmxlIGJyYW5jaC4KKyAgICAgIEJSX0pULAorCisgICAgICAvLyBKdW1wdGFibGUgYnJhbmNoIHVzaW5nIGxvbmcgYnJhbmNoZXMgZm9yIGVhY2ggZW50cnkuCisgICAgICBCUl9KVDMyCisgICAgfTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUYXJnZXRMb3dlcmluZyBJbXBsZW1lbnRhdGlvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgY2xhc3MgWENvcmVUYXJnZXRMb3dlcmluZyA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZyAKKyAgeworICBwdWJsaWM6CisKKyAgICBleHBsaWNpdCBYQ29yZVRhcmdldExvd2VyaW5nKFhDb3JlVGFyZ2V0TWFjaGluZSAmVE0pOworCisgICAgdmlydHVhbCB1bnNpZ25lZCBnZXRKdW1wVGFibGVFbmNvZGluZygpIGNvbnN0OworCisgICAgLy8vIExvd2VyT3BlcmF0aW9uIC0gUHJvdmlkZSBjdXN0b20gbG93ZXJpbmcgaG9va3MgZm9yIHNvbWUgb3BlcmF0aW9ucy4KKyAgICB2aXJ0dWFsIFNEVmFsdWUgTG93ZXJPcGVyYXRpb24oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgICAgLy8vIFJlcGxhY2VOb2RlUmVzdWx0cyAtIFJlcGxhY2UgdGhlIHJlc3VsdHMgb2Ygbm9kZSB3aXRoIGFuIGlsbGVnYWwgcmVzdWx0CisgICAgLy8vIHR5cGUgd2l0aCBuZXcgdmFsdWVzIGJ1aWx0IG91dCBvZiBjdXN0b20gY29kZS4KKyAgICAvLy8KKyAgICB2aXJ0dWFsIHZvaWQgUmVwbGFjZU5vZGVSZXN1bHRzKFNETm9kZSAqTiwgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+JlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLy8gZ2V0VGFyZ2V0Tm9kZU5hbWUgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIGEgdGFyZ2V0IHNwZWNpZmljIAorICAgIC8vICBEQUcgbm9kZS4KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisgIAorICAgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2sgKgorICAgICAgRW1pdEluc3RyV2l0aEN1c3RvbUluc2VydGVyKE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNMZWdhbEFkZHJlc3NpbmdNb2RlKGNvbnN0IEFkZHJNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSBjb25zdDsKKworICAgIC8vLyBnZXRGdW5jdGlvbkFsaWdubWVudCAtIFJldHVybiB0aGUgTG9nMiBhbGlnbm1lbnQgb2YgdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldEZ1bmN0aW9uQWxpZ25tZW50KGNvbnN0IEZ1bmN0aW9uICpGKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIGNvbnN0IFhDb3JlVGFyZ2V0TWFjaGluZSAmVE07CisgICAgY29uc3QgWENvcmVTdWJ0YXJnZXQgJlN1YnRhcmdldDsKKyAgCisgICAgLy8gTG93ZXIgT3BlcmFuZCBoZWxwZXJzCisgICAgU0RWYWx1ZSBMb3dlckNDQ0FyZ3VtZW50cyhTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdMb2MgZGwsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJDQ0NDYWxsVG8oU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZPdXRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckNhbGxSZXN1bHQoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBJbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisgICAgU0RWYWx1ZSBnZXRSZXR1cm5BZGRyZXNzRnJhbWVJbmRleChTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBnZXRHbG9iYWxBZGRyZXNzV3JhcHBlcihTRFZhbHVlIEdBLCBjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICAvLyBMb3dlciBPcGVyYW5kIHNwZWNpZmljcworICAgIFNEVmFsdWUgTG93ZXJMT0FEKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU1RPUkUoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJHbG9iYWxBZGRyZXNzKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyR2xvYmFsVExTQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckJsb2NrQWRkcmVzcyhTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckNvbnN0YW50UG9vbChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisgICAgU0RWYWx1ZSBMb3dlckJSX0pUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU0VMRUNUX0NDKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyVkFBUkcoU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworICAgIFNEVmFsdWUgTG93ZXJWQVNUQVJUKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyVU1VTF9MT0hJKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyU01VTF9MT0hJKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIExvd2VyRlJBTUVBRERSKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgCisgICAgLy8gSW5saW5lIGFzbSBzdXBwb3J0CisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+CisgICAgZ2V0UmVnQ2xhc3NGb3JJbmxpbmVBc21Db25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0OworICAKKyAgICAvLyBFeHBhbmQgc3BlY2lmaWNzCisgICAgU0RWYWx1ZSBUcnlFeHBhbmRBRERXaXRoTXVsKFNETm9kZSAqT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKyAgICBTRFZhbHVlIEV4cGFuZEFERFNVQihTRE5vZGUgKk9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUgUGVyZm9ybURBR0NvbWJpbmUoU0ROb2RlICpOLCBEQUdDb21iaW5lckluZm8gJkRDSSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgY29tcHV0ZU1hc2tlZEJpdHNGb3JUYXJnZXROb2RlKGNvbnN0IFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyRm9ybWFsQXJndW1lbnRzKFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkluVmFscykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFNEVmFsdWUKKyAgICAgIExvd2VyQ2FsbChTRFZhbHVlIENoYWluLCBTRFZhbHVlIENhbGxlZSwKKyAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsIGJvb2wgaXNWYXJBcmcsCisgICAgICAgICAgICAgICAgYm9vbCAmaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBkbCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZJblZhbHMpIGNvbnN0OworCisgICAgdmlydHVhbCBTRFZhbHVlCisgICAgICBMb3dlclJldHVybihTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LCBib29sIGlzVmFyQXJnLAorICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscywKKyAgICAgICAgICAgICAgICAgIERlYnVnTG9jIGRsLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wKKyAgICAgIENhbkxvd2VyUmV0dXJuKENhbGxpbmdDb252OjpJRCBDYWxsQ29udiwgYm9vbCBpc1ZhckFyZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJkFyZ3NGbGFncywKKyAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0KSBjb25zdDsKKyAgfTsKK30KKworI2VuZGlmIC8vIFhDT1JFSVNFTExPV0VSSU5HX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJbnN0ckZvcm1hdHMudGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlSW5zdHJGb3JtYXRzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDJjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlSW5zdHJGb3JtYXRzLnRkCkBAIC0wLDAgKzEsMTIwIEBACisvLz09PS0gWENvcmVJbnN0ckZvcm1hdHMudGQgLSBYQ29yZSBJbnN0cnVjdGlvbiBGb3JtYXRzIC0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gZm9ybWF0IHN1cGVyY2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBJbnN0WENvcmU8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgIDogSW5zdHJ1Y3Rpb24geworICBmaWVsZCBiaXRzPDMyPiBJbnN0OworCisgIGxldCBOYW1lc3BhY2UgPSAiWENvcmUiOworICBkYWcgT3V0T3BlcmFuZExpc3QgPSBvdXRzOworICBkYWcgSW5PcGVyYW5kTGlzdCA9IGluczsKKyAgbGV0IEFzbVN0cmluZyAgID0gYXNtc3RyOworICBsZXQgUGF0dGVybiA9IHBhdHRlcm47Cit9CisKKy8vIFhDb3JlIHBzZXVkbyBpbnN0cnVjdGlvbnMgZm9ybWF0CitjbGFzcyBQc2V1ZG9JbnN0WENvcmU8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gZm9ybWF0cworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgX0YzUjxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRkwzUjxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRjJSVVM8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgIDogSW5zdFhDb3JlPG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTB9ID0gMDsKK30KKworY2xhc3MgX0ZMMlJVUzxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRlJVNjxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRkxSVTY8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgIDogSW5zdFhDb3JlPG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTB9ID0gMDsKK30KKworY2xhc3MgX0ZVNjxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRkxVNjxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRlUxMDxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRkxVMTA8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgIDogSW5zdFhDb3JlPG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTB9ID0gMDsKK30KKworY2xhc3MgX0YyUjxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRlJVUzxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRkwyUjxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfRjFSPGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICA6IEluc3RYQ29yZTxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj4geworICBsZXQgSW5zdHszMS0wfSA9IDA7Cit9CisKK2NsYXNzIF9GMFI8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgIDogSW5zdFhDb3JlPG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTB9ID0gMDsKK30KKworY2xhc3MgX0w0UjxkYWcgb3V0cywgZGFnIGlucywgc3RyaW5nIGFzbXN0ciwgbGlzdDxkYWc+IHBhdHRlcm4+CisgICAgOiBJbnN0WENvcmU8b3V0cywgaW5zLCBhc21zdHIsIHBhdHRlcm4+IHsKKyAgbGV0IEluc3R7MzEtMH0gPSAwOworfQorCitjbGFzcyBfTDVSPGRhZyBvdXRzLCBkYWcgaW5zLCBzdHJpbmcgYXNtc3RyLCBsaXN0PGRhZz4gcGF0dGVybj4KKyAgICA6IEluc3RYQ29yZTxvdXRzLCBpbnMsIGFzbXN0ciwgcGF0dGVybj4geworICBsZXQgSW5zdHszMS0wfSA9IDA7Cit9CisKK2NsYXNzIF9MNlI8ZGFnIG91dHMsIGRhZyBpbnMsIHN0cmluZyBhc21zdHIsIGxpc3Q8ZGFnPiBwYXR0ZXJuPgorICAgIDogSW5zdFhDb3JlPG91dHMsIGlucywgYXNtc3RyLCBwYXR0ZXJuPiB7CisgIGxldCBJbnN0ezMxLTB9ID0gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJbnN0ckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZUluc3RySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwMDA0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJbnN0ckluZm8uY3BwCkBAIC0wLDAgKzEsNDU5IEBACisvLz09PS0gWENvcmVJbnN0ckluZm8uY3BwIC0gWENvcmUgSW5zdHJ1Y3Rpb24gSW5mb3JtYXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgWENvcmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiWENvcmVNYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAiWENvcmVJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJYQ29yZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJYQ29yZUdlbkluc3RySW5mby5pbmMiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIFhDb3JlIHsKKworICAvLyBYQ29yZSBDb25kaXRpb24gQ29kZXMKKyAgZW51bSBDb25kQ29kZSB7CisgICAgQ09ORF9UUlVFLAorICAgIENPTkRfRkFMU0UsCisgICAgQ09ORF9JTlZBTElECisgIH07Cit9Cit9CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitYQ29yZUluc3RySW5mbzo6WENvcmVJbnN0ckluZm8oKQorICA6IFRhcmdldEluc3RySW5mb0ltcGwoWENvcmVJbnN0cywgYXJyYXlfbGVuZ3Rob2YoWENvcmVJbnN0cykpLAorICAgIFJJKCp0aGlzKSB7Cit9CisKK3N0YXRpYyBib29sIGlzWmVyb0ltbShjb25zdCBNYWNoaW5lT3BlcmFuZCAmb3ApIHsKKyAgcmV0dXJuIG9wLmlzSW1tKCkgJiYgb3AuZ2V0SW1tKCkgPT0gMDsKK30KKworLy8vIGlzTG9hZEZyb21TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKy8vLyBsb2FkIGZyb20gYSBzdGFjayBzbG90LCByZXR1cm4gdGhlIHZpcnR1YWwgb3IgcGh5c2ljYWwgcmVnaXN0ZXIgbnVtYmVyIG9mCisvLy8gdGhlIGRlc3RpbmF0aW9uIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKy8vLyBub3QsIHJldHVybiAwLiAgVGhpcyBwcmVkaWNhdGUgbXVzdCByZXR1cm4gMCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzCisvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIGxvYWRpbmcgZnJvbSB0aGUgc3RhY2sgc2xvdC4KK3Vuc2lnbmVkCitYQ29yZUluc3RySW5mbzo6aXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0eworICBpbnQgT3Bjb2RlID0gTUktPmdldE9wY29kZSgpOworICBpZiAoT3Bjb2RlID09IFhDb3JlOjpMRFdGSSkgCisgIHsKKyAgICBpZiAoKE1JLT5nZXRPcGVyYW5kKDEpLmlzRkkoKSkgJiYgLy8gaXMgYSBzdGFjayBzbG90CisgICAgICAgIChNSS0+Z2V0T3BlcmFuZCgyKS5pc0ltbSgpKSAmJiAgLy8gdGhlIGltbSBpcyB6ZXJvCisgICAgICAgIChpc1plcm9JbW0oTUktPmdldE9wZXJhbmQoMikpKSkgCisgICAgeworICAgICAgRnJhbWVJbmRleCA9IE1JLT5nZXRPcGVyYW5kKDEpLmdldEluZGV4KCk7CisgICAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorICAKKyAgLy8vIGlzU3RvcmVUb1N0YWNrU2xvdCAtIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBhIGRpcmVjdAorICAvLy8gc3RvcmUgdG8gYSBzdGFjayBzbG90LCByZXR1cm4gdGhlIHZpcnR1YWwgb3IgcGh5c2ljYWwgcmVnaXN0ZXIgbnVtYmVyIG9mCisgIC8vLyB0aGUgc291cmNlIHJlZyBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4IG9mIHRoZSBsb2FkZWQgc3RhY2sgc2xvdC4gIElmCisgIC8vLyBub3QsIHJldHVybiAwLiAgVGhpcyBwcmVkaWNhdGUgbXVzdCByZXR1cm4gMCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzCisgIC8vLyBhbnkgc2lkZSBlZmZlY3RzIG90aGVyIHRoYW4gc3RvcmluZyB0byB0aGUgc3RhY2sgc2xvdC4KK3Vuc2lnbmVkCitYQ29yZUluc3RySW5mbzo6aXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICBpbnQgT3Bjb2RlID0gTUktPmdldE9wY29kZSgpOworICBpZiAoT3Bjb2RlID09IFhDb3JlOjpTVFdGSSkKKyAgeworICAgIGlmICgoTUktPmdldE9wZXJhbmQoMSkuaXNGSSgpKSAmJiAvLyBpcyBhIHN0YWNrIHNsb3QKKyAgICAgICAgKE1JLT5nZXRPcGVyYW5kKDIpLmlzSW1tKCkpICYmICAvLyB0aGUgaW1tIGlzIHplcm8KKyAgICAgICAgKGlzWmVyb0ltbShNSS0+Z2V0T3BlcmFuZCgyKSkpKQorICAgIHsKKyAgICAgIEZyYW1lSW5kZXggPSBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRJbmRleCgpOworICAgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJyYW5jaCBBbmFseXNpcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RhdGljIGlubGluZSBib29sIElzQlJVKHVuc2lnbmVkIEJyT3BjKSB7CisgIHJldHVybiBCck9wYyA9PSBYQ29yZTo6QlJGVV91NgorICAgICAgfHwgQnJPcGMgPT0gWENvcmU6OkJSRlVfbHU2CisgICAgICB8fCBCck9wYyA9PSBYQ29yZTo6QlJCVV91NgorICAgICAgfHwgQnJPcGMgPT0gWENvcmU6OkJSQlVfbHU2OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgSXNCUlQodW5zaWduZWQgQnJPcGMpIHsKKyAgcmV0dXJuIEJyT3BjID09IFhDb3JlOjpCUkZUX3J1NgorICAgICAgfHwgQnJPcGMgPT0gWENvcmU6OkJSRlRfbHJ1NgorICAgICAgfHwgQnJPcGMgPT0gWENvcmU6OkJSQlRfcnU2CisgICAgICB8fCBCck9wYyA9PSBYQ29yZTo6QlJCVF9scnU2OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgSXNCUkYodW5zaWduZWQgQnJPcGMpIHsKKyAgcmV0dXJuIEJyT3BjID09IFhDb3JlOjpCUkZGX3J1NgorICAgICAgfHwgQnJPcGMgPT0gWENvcmU6OkJSRkZfbHJ1NgorICAgICAgfHwgQnJPcGMgPT0gWENvcmU6OkJSQkZfcnU2CisgICAgICB8fCBCck9wYyA9PSBYQ29yZTo6QlJCRl9scnU2OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgSXNDb25kQnJhbmNoKHVuc2lnbmVkIEJyT3BjKSB7CisgIHJldHVybiBJc0JSRihCck9wYykgfHwgSXNCUlQoQnJPcGMpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgSXNCUl9KVCh1bnNpZ25lZCBCck9wYykgeworICByZXR1cm4gQnJPcGMgPT0gWENvcmU6OkJSX0pUCisgICAgICB8fCBCck9wYyA9PSBYQ29yZTo6QlJfSlQzMjsKK30KKworLy8vIEdldENvbmRGcm9tQnJhbmNoT3BjIC0gUmV0dXJuIHRoZSBYQ29yZSBDQyB0aGF0IG1hdGNoZXMgCisvLy8gdGhlIGNvcnJlc3BvbmRlbnQgQnJhbmNoIGluc3RydWN0aW9uIG9wY29kZS4KK3N0YXRpYyBYQ29yZTo6Q29uZENvZGUgR2V0Q29uZEZyb21CcmFuY2hPcGModW5zaWduZWQgQnJPcGMpIAoreworICBpZiAoSXNCUlQoQnJPcGMpKSB7CisgICAgcmV0dXJuIFhDb3JlOjpDT05EX1RSVUU7CisgIH0gZWxzZSBpZiAoSXNCUkYoQnJPcGMpKSB7CisgICAgcmV0dXJuIFhDb3JlOjpDT05EX0ZBTFNFOworICB9IGVsc2UgeworICAgIHJldHVybiBYQ29yZTo6Q09ORF9JTlZBTElEOworICB9Cit9CisKKy8vLyBHZXRDb25kQnJhbmNoRnJvbUNvbmQgLSBSZXR1cm4gdGhlIEJyYW5jaCBpbnN0cnVjdGlvbgorLy8vIG9wY29kZSB0aGF0IG1hdGNoZXMgdGhlIGNjLgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBHZXRDb25kQnJhbmNoRnJvbUNvbmQoWENvcmU6OkNvbmRDb2RlIENDKSAKK3sKKyAgc3dpdGNoIChDQykgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIGNvbmRpdGlvbiBjb2RlISIpOworICBjYXNlIFhDb3JlOjpDT05EX1RSVUUgICA6IHJldHVybiBYQ29yZTo6QlJGVF9scnU2OworICBjYXNlIFhDb3JlOjpDT05EX0ZBTFNFICA6IHJldHVybiBYQ29yZTo6QlJGRl9scnU2OworICB9Cit9CisKKy8vLyBHZXRPcHBvc2l0ZUJyYW5jaENvbmRpdGlvbiAtIFJldHVybiB0aGUgaW52ZXJzZSBvZiB0aGUgc3BlY2lmaWVkIAorLy8vIGNvbmRpdGlvbiwgZS5nLiB0dXJuaW5nIENPTkRfRSB0byBDT05EX05FLgorc3RhdGljIGlubGluZSBYQ29yZTo6Q29uZENvZGUgR2V0T3Bwb3NpdGVCcmFuY2hDb25kaXRpb24oWENvcmU6OkNvbmRDb2RlIENDKQoreworICBzd2l0Y2ggKENDKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgY29uZGl0aW9uIGNvZGUhIik7CisgIGNhc2UgWENvcmU6OkNPTkRfVFJVRSAgIDogcmV0dXJuIFhDb3JlOjpDT05EX0ZBTFNFOworICBjYXNlIFhDb3JlOjpDT05EX0ZBTFNFICA6IHJldHVybiBYQ29yZTo6Q09ORF9UUlVFOworICB9Cit9CisKKy8vLyBBbmFseXplQnJhbmNoIC0gQW5hbHl6ZSB0aGUgYnJhbmNoaW5nIGNvZGUgYXQgdGhlIGVuZCBvZiBNQkIsIHJldHVybmluZworLy8vIHRydWUgaWYgaXQgY2Fubm90IGJlIHVuZGVyc3Rvb2QgKGUuZy4gaXQncyBhIHN3aXRjaCBkaXNwYXRjaCBvciBpc24ndAorLy8vIGltcGxlbWVudGVkIGZvciBhIHRhcmdldCkuICBVcG9uIHN1Y2Nlc3MsIHRoaXMgcmV0dXJucyBmYWxzZSBhbmQgcmV0dXJucworLy8vIHdpdGggdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpbiB2YXJpb3VzIGNhc2VzOgorLy8vCisvLy8gMS4gSWYgdGhpcyBibG9jayBlbmRzIHdpdGggbm8gYnJhbmNoZXMgKGl0IGp1c3QgZmFsbHMgdGhyb3VnaCB0byBpdHMgc3VjYykKKy8vLyAgICBqdXN0IHJldHVybiBmYWxzZSwgbGVhdmluZyBUQkIvRkJCIG51bGwuCisvLy8gMi4gSWYgdGhpcyBibG9jayBlbmRzIHdpdGggb25seSBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgaXQgc2V0cyBUQkIgdG8gYmUKKy8vLyAgICB0aGUgZGVzdGluYXRpb24gYmxvY2suCisvLy8gMy4gSWYgdGhpcyBibG9jayBlbmRzIHdpdGggYW4gY29uZGl0aW9uYWwgYnJhbmNoIGFuZCBpdCBmYWxscyB0aHJvdWdoIHRvCisvLy8gICAgYW4gc3VjY2Vzc29yIGJsb2NrLCBpdCBzZXRzIFRCQiB0byBiZSB0aGUgYnJhbmNoIGRlc3RpbmF0aW9uIGJsb2NrIGFuZCBhCisvLy8gICAgbGlzdCBvZiBvcGVyYW5kcyB0aGF0IGV2YWx1YXRlIHRoZSBjb25kaXRpb24uIFRoZXNlCisvLy8gICAgb3BlcmFuZHMgY2FuIGJlIHBhc3NlZCB0byBvdGhlciBUYXJnZXRJbnN0ckluZm8gbWV0aG9kcyB0byBjcmVhdGUgbmV3CisvLy8gICAgYnJhbmNoZXMuCisvLy8gNC4gSWYgdGhpcyBibG9jayBlbmRzIHdpdGggYW4gY29uZGl0aW9uYWwgYnJhbmNoIGFuZCBhbiB1bmNvbmRpdGlvbmFsCisvLy8gICAgYmxvY2ssIGl0IHJldHVybnMgdGhlICd0cnVlJyBkZXN0aW5hdGlvbiBpbiBUQkIsIHRoZSAnZmFsc2UnIGRlc3RpbmF0aW9uCisvLy8gICAgaW4gRkJCLCBhbmQgYSBsaXN0IG9mIG9wZXJhbmRzIHRoYXQgZXZhbHVhdGUgdGhlIGNvbmRpdGlvbi4gVGhlc2UKKy8vLyAgICBvcGVyYW5kcyBjYW4gYmUgcGFzc2VkIHRvIG90aGVyIFRhcmdldEluc3RySW5mbyBtZXRob2RzIHRvIGNyZWF0ZSBuZXcKKy8vLyAgICBicmFuY2hlcy4KKy8vLworLy8vIE5vdGUgdGhhdCBSZW1vdmVCcmFuY2ggYW5kIEluc2VydEJyYW5jaCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHN1cHBvcnQKKy8vLyBjYXNlcyB3aGVyZSB0aGlzIG1ldGhvZCByZXR1cm5zIHN1Y2Nlc3MuCisvLy8KK2Jvb2wKK1hDb3JlSW5zdHJJbmZvOjpBbmFseXplQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrIComVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSkgY29uc3QgeworICAvLyBJZiB0aGUgYmxvY2sgaGFzIG5vIHRlcm1pbmF0b3JzLCBpdCBqdXN0IGZhbGxzIGludG8gdGhlIGJsb2NrIGFmdGVyIGl0LgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IE1CQi5lbmQoKTsKKyAgaWYgKEkgPT0gTUJCLmJlZ2luKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAtLUk7CisgIHdoaWxlIChJLT5pc0RlYnVnVmFsdWUoKSkgeworICAgIGlmIChJID09IE1CQi5iZWdpbigpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC0tSTsKKyAgfQorICBpZiAoIWlzVW5wcmVkaWNhdGVkVGVybWluYXRvcihJKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gR2V0IHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBibG9jay4KKyAgTWFjaGluZUluc3RyICpMYXN0SW5zdCA9IEk7CisgIAorICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSB0ZXJtaW5hdG9yIGluc3RydWN0aW9uLCBwcm9jZXNzIGl0LgorICBpZiAoSSA9PSBNQkIuYmVnaW4oKSB8fCAhaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKC0tSSkpIHsKKyAgICBpZiAoSXNCUlUoTGFzdEluc3QtPmdldE9wY29kZSgpKSkgeworICAgICAgVEJCID0gTGFzdEluc3QtPmdldE9wZXJhbmQoMCkuZ2V0TUJCKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIFhDb3JlOjpDb25kQ29kZSBCcmFuY2hDb2RlID0gR2V0Q29uZEZyb21CcmFuY2hPcGMoTGFzdEluc3QtPmdldE9wY29kZSgpKTsKKyAgICBpZiAoQnJhbmNoQ29kZSA9PSBYQ29yZTo6Q09ORF9JTlZBTElEKQorICAgICAgcmV0dXJuIHRydWU7ICAvLyBDYW4ndCBoYW5kbGUgaW5kaXJlY3QgYnJhbmNoLgorICAgIAorICAgIC8vIENvbmRpdGlvbmFsIGJyYW5jaAorICAgIC8vIEJsb2NrIGVuZHMgd2l0aCBmYWxsLXRocm91Z2ggY29uZGJyYW5jaC4KKworICAgIFRCQiA9IExhc3RJbnN0LT5nZXRPcGVyYW5kKDEpLmdldE1CQigpOworICAgIENvbmQucHVzaF9iYWNrKE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVJbW0oQnJhbmNoQ29kZSkpOworICAgIENvbmQucHVzaF9iYWNrKExhc3RJbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIGl0IGlmIGl0J3MgYSB0ZXJtaW5hdG9yLgorICBNYWNoaW5lSW5zdHIgKlNlY29uZExhc3RJbnN0ID0gSTsKKworICAvLyBJZiB0aGVyZSBhcmUgdGhyZWUgdGVybWluYXRvcnMsIHdlIGRvbid0IGtub3cgd2hhdCBzb3J0IG9mIGJsb2NrIHRoaXMgaXMuCisgIGlmIChTZWNvbmRMYXN0SW5zdCAmJiBJICE9IE1CQi5iZWdpbigpICYmCisgICAgICBpc1VucHJlZGljYXRlZFRlcm1pbmF0b3IoLS1JKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIHVuc2lnbmVkIFNlY29uZExhc3RPcGMgICAgPSBTZWNvbmRMYXN0SW5zdC0+Z2V0T3Bjb2RlKCk7CisgIFhDb3JlOjpDb25kQ29kZSBCcmFuY2hDb2RlID0gR2V0Q29uZEZyb21CcmFuY2hPcGMoU2Vjb25kTGFzdE9wYyk7CisgIAorICAvLyBJZiB0aGUgYmxvY2sgZW5kcyB3aXRoIGNvbmRpdGlvbmFsIGJyYW5jaCBmb2xsb3dlZCBieSB1bmNvbmRpdGlvbmFsLAorICAvLyBoYW5kbGUgaXQuCisgIGlmIChCcmFuY2hDb2RlICE9IFhDb3JlOjpDT05EX0lOVkFMSUQKKyAgICAmJiBJc0JSVShMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkpKSB7CisKKyAgICBUQkIgPSBTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgxKS5nZXRNQkIoKTsKKyAgICBDb25kLnB1c2hfYmFjayhNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlSW1tKEJyYW5jaENvZGUpKTsKKyAgICBDb25kLnB1c2hfYmFjayhTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKSk7CisKKyAgICBGQkIgPSBMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIElmIHRoZSBibG9jayBlbmRzIHdpdGggdHdvIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMsIGhhbmRsZSBpdC4gIFRoZSBzZWNvbmQKKyAgLy8gb25lIGlzIG5vdCBleGVjdXRlZCwgc28gcmVtb3ZlIGl0LgorICBpZiAoSXNCUlUoU2Vjb25kTGFzdEluc3QtPmdldE9wY29kZSgpKSAmJiAKKyAgICAgIElzQlJVKExhc3RJbnN0LT5nZXRPcGNvZGUoKSkpIHsKKyAgICBUQkIgPSBTZWNvbmRMYXN0SW5zdC0+Z2V0T3BlcmFuZCgwKS5nZXRNQkIoKTsKKyAgICBJID0gTGFzdEluc3Q7CisgICAgaWYgKEFsbG93TW9kaWZ5KQorICAgICAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gTGlrZXdpc2UgaWYgaXQgZW5kcyB3aXRoIGEgYnJhbmNoIHRhYmxlIGZvbGxvd2VkIGJ5IGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLgorICBpZiAoSXNCUl9KVChTZWNvbmRMYXN0SW5zdC0+Z2V0T3Bjb2RlKCkpICYmIElzQlJVKExhc3RJbnN0LT5nZXRPcGNvZGUoKSkpIHsKKyAgICBJID0gTGFzdEluc3Q7CisgICAgaWYgKEFsbG93TW9kaWZ5KQorICAgICAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBPdGhlcndpc2UsIGNhbid0IGhhbmRsZSB0aGlzLgorICByZXR1cm4gdHJ1ZTsKK30KKwordW5zaWduZWQKK1hDb3JlSW5zdHJJbmZvOjpJbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQixNYWNoaW5lQmFzaWNCbG9jayAqVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0xvYyBETCljb25zdHsKKyAgLy8gU2hvdWxkbid0IGJlIGEgZmFsbCB0aHJvdWdoLgorICBhc3NlcnQoVEJCICYmICJJbnNlcnRCcmFuY2ggbXVzdCBub3QgYmUgdG9sZCB0byBpbnNlcnQgYSBmYWxsdGhyb3VnaCIpOworICBhc3NlcnQoKENvbmQuc2l6ZSgpID09IDIgfHwgQ29uZC5zaXplKCkgPT0gMCkgJiYKKyAgICAgICAgICJVbmV4cGVjdGVkIG51bWJlciBvZiBjb21wb25lbnRzISIpOworICAKKyAgaWYgKEZCQiA9PSAwKSB7IC8vIE9uZSB3YXkgYnJhbmNoLgorICAgIGlmIChDb25kLmVtcHR5KCkpIHsKKyAgICAgIC8vIFVuY29uZGl0aW9uYWwgYnJhbmNoCisgICAgICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoWENvcmU6OkJSRlVfbHU2KSkuYWRkTUJCKFRCQik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENvbmRpdGlvbmFsIGJyYW5jaC4KKyAgICAgIHVuc2lnbmVkIE9wYyA9IEdldENvbmRCcmFuY2hGcm9tQ29uZCgoWENvcmU6OkNvbmRDb2RlKUNvbmRbMF0uZ2V0SW1tKCkpOworICAgICAgQnVpbGRNSSgmTUJCLCBETCwgZ2V0KE9wYykpLmFkZFJlZyhDb25kWzFdLmdldFJlZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkTUJCKFRCQik7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIAorICAvLyBUd28td2F5IENvbmRpdGlvbmFsIGJyYW5jaC4KKyAgYXNzZXJ0KENvbmQuc2l6ZSgpID09IDIgJiYgIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbXBvbmVudHMhIik7CisgIHVuc2lnbmVkIE9wYyA9IEdldENvbmRCcmFuY2hGcm9tQ29uZCgoWENvcmU6OkNvbmRDb2RlKUNvbmRbMF0uZ2V0SW1tKCkpOworICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoT3BjKSkuYWRkUmVnKENvbmRbMV0uZ2V0UmVnKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1CQihUQkIpOworICBCdWlsZE1JKCZNQkIsIERMLCBnZXQoWENvcmU6OkJSRlVfbHU2KSkuYWRkTUJCKEZCQik7CisgIHJldHVybiAyOworfQorCit1bnNpZ25lZAorWENvcmVJbnN0ckluZm86OlJlbW92ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gTUJCLmVuZCgpOworICBpZiAoSSA9PSBNQkIuYmVnaW4oKSkgcmV0dXJuIDA7CisgIC0tSTsKKyAgd2hpbGUgKEktPmlzRGVidWdWYWx1ZSgpKSB7CisgICAgaWYgKEkgPT0gTUJCLmJlZ2luKCkpCisgICAgICByZXR1cm4gMDsKKyAgICAtLUk7CisgIH0KKyAgaWYgKCFJc0JSVShJLT5nZXRPcGNvZGUoKSkgJiYgIUlzQ29uZEJyYW5jaChJLT5nZXRPcGNvZGUoKSkpCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBSZW1vdmUgdGhlIGJyYW5jaC4KKyAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIAorICBJID0gTUJCLmVuZCgpOworCisgIGlmIChJID09IE1CQi5iZWdpbigpKSByZXR1cm4gMTsKKyAgLS1JOworICBpZiAoIUlzQ29uZEJyYW5jaChJLT5nZXRPcGNvZGUoKSkpCisgICAgcmV0dXJuIDE7CisgIAorICAvLyBSZW1vdmUgdGhlIGJyYW5jaC4KKyAgSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIHJldHVybiAyOworfQorCit2b2lkIFhDb3JlSW5zdHJJbmZvOjpjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdCB7CisgIGJvb2wgR1JEZXN0ID0gWENvcmU6OkdSUmVnc1JlZ0NsYXNzLmNvbnRhaW5zKERlc3RSZWcpOworICBib29sIEdSU3JjICA9IFhDb3JlOjpHUlJlZ3NSZWdDbGFzcy5jb250YWlucyhTcmNSZWcpOworCisgIGlmIChHUkRlc3QgJiYgR1JTcmMpIHsKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChYQ29yZTo6QUREXzJydXMpLCBEZXN0UmVnKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSkKKyAgICAgIC5hZGRJbW0oMCk7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZiAoR1JEZXN0ICYmIFNyY1JlZyA9PSBYQ29yZTo6U1ApIHsKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChYQ29yZTo6TERBV1NQX3J1NiksIERlc3RSZWcpLmFkZEltbSgwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoRGVzdFJlZyA9PSBYQ29yZTo6U1AgJiYgR1JTcmMpIHsKKyAgICBCdWlsZE1JKE1CQiwgSSwgREwsIGdldChYQ29yZTo6U0VUU1BfMXIpKQorICAgICAgLmFkZFJlZyhTcmNSZWcsIGdldEtpbGxSZWdTdGF0ZShLaWxsU3JjKSk7CisgICAgcmV0dXJuOworICB9CisgIGxsdm1fdW5yZWFjaGFibGUoIkltcG9zc2libGUgcmVnLXRvLXJlZyBjb3B5Iik7Cit9CisKK3ZvaWQgWENvcmVJbnN0ckluZm86OnN0b3JlUmVnVG9TdGFja1Nsb3QoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0Cit7CisgIERlYnVnTG9jIERMOworICBpZiAoSSAhPSBNQkIuZW5kKCkpIERMID0gSS0+Z2V0RGVidWdMb2MoKTsKKyAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoWENvcmU6OlNUV0ZJKSkKKyAgICAuYWRkUmVnKFNyY1JlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpCisgICAgLmFkZEZyYW1lSW5kZXgoRnJhbWVJbmRleCkKKyAgICAuYWRkSW1tKDApOworfQorCit2b2lkIFhDb3JlSW5zdHJJbmZvOjpsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0Cit7CisgIERlYnVnTG9jIERMOworICBpZiAoSSAhPSBNQkIuZW5kKCkpIERMID0gSS0+Z2V0RGVidWdMb2MoKTsKKyAgQnVpbGRNSShNQkIsIEksIERMLCBnZXQoWENvcmU6OkxEV0ZJKSwgRGVzdFJlZykKKyAgICAuYWRkRnJhbWVJbmRleChGcmFtZUluZGV4KQorICAgIC5hZGRJbW0oMCk7Cit9CisKK2Jvb2wgWENvcmVJbnN0ckluZm86OnNwaWxsQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgIGlmIChDU0kuZW1wdHkoKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBNQkIuZ2V0UGFyZW50KCk7CisgIFhDb3JlRnVuY3Rpb25JbmZvICpYRkkgPSBNRi0+Z2V0SW5mbzxYQ29yZUZ1bmN0aW9uSW5mbz4oKTsKKyAgCisgIGJvb2wgZW1pdEZyYW1lTW92ZXMgPSBYQ29yZVJlZ2lzdGVySW5mbzo6bmVlZHNGcmFtZU1vdmVzKCpNRik7CisKKyAgRGVidWdMb2MgREw7CisgIGlmIChNSSAhPSBNQkIuZW5kKCkpIERMID0gTUktPmdldERlYnVnTG9jKCk7CisgIAorICBmb3IgKHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQ1NJLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gQ1NJLmVuZCgpOyArK2l0KSB7CisgICAgLy8gQWRkIHRoZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIgYXMgbGl2ZS1pbi4gSXQncyBraWxsZWQgYXQgdGhlIHNwaWxsLgorICAgIE1CQi5hZGRMaXZlSW4oaXQtPmdldFJlZygpKTsKKworICAgIHVuc2lnbmVkIFJlZyA9IGl0LT5nZXRSZWcoKTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IFRSSS0+Z2V0TWluaW1hbFBoeXNSZWdDbGFzcyhSZWcpOworICAgIHN0b3JlUmVnVG9TdGFja1Nsb3QoTUJCLCBNSSwgUmVnLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgaXQtPmdldEZyYW1lSWR4KCksIFJDLCAmUkkpOworICAgIGlmIChlbWl0RnJhbWVNb3ZlcykgeworICAgICAgTUNTeW1ib2wgKlNhdmVMYWJlbCA9IE1GLT5nZXRDb250ZXh0KCkuQ3JlYXRlVGVtcFN5bWJvbCgpOworICAgICAgQnVpbGRNSShNQkIsIE1JLCBETCwgZ2V0KFhDb3JlOjpQUk9MT0dfTEFCRUwpKS5hZGRTeW0oU2F2ZUxhYmVsKTsKKyAgICAgIFhGSS0+Z2V0U3BpbGxMYWJlbHMoKS5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoU2F2ZUxhYmVsLCAqaXQpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWENvcmVJbnN0ckluZm86OnJlc3RvcmVDYWxsZWVTYXZlZFJlZ2lzdGVycyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QKK3sKKyAgYm9vbCBBdFN0YXJ0ID0gTUkgPT0gTUJCLmJlZ2luKCk7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWZvcmVJID0gTUk7CisgIGlmICghQXRTdGFydCkKKyAgICAtLUJlZm9yZUk7CisgIGZvciAoc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBDU0kuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBDU0kuZW5kKCk7ICsraXQpIHsKKyAgICB1bnNpZ25lZCBSZWcgPSBpdC0+Z2V0UmVnKCk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBUUkktPmdldE1pbmltYWxQaHlzUmVnQ2xhc3MoUmVnKTsKKyAgICBsb2FkUmVnRnJvbVN0YWNrU2xvdChNQkIsIE1JLCBpdC0+Z2V0UmVnKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPmdldEZyYW1lSWR4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgUkMsICZSSSk7CisgICAgYXNzZXJ0KE1JICE9IE1CQi5iZWdpbigpICYmCisgICAgICAgICAgICJsb2FkUmVnRnJvbVN0YWNrU2xvdCBkaWRuJ3QgaW5zZXJ0IGFueSBjb2RlISIpOworICAgIC8vIEluc2VydCBpbiByZXZlcnNlIG9yZGVyLiAgbG9hZFJlZ0Zyb21TdGFja1Nsb3QgY2FuIGluc2VydCBtdWx0aXBsZQorICAgIC8vIGluc3RydWN0aW9ucy4KKyAgICBpZiAoQXRTdGFydCkKKyAgICAgIE1JID0gTUJCLmJlZ2luKCk7CisgICAgZWxzZSB7CisgICAgICBNSSA9IEJlZm9yZUk7CisgICAgICArK01JOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFJldmVyc2VCcmFuY2hDb25kaXRpb24gLSBSZXR1cm4gdGhlIGludmVyc2Ugb3Bjb2RlIG9mIHRoZSAKKy8vLyBzcGVjaWZpZWQgQnJhbmNoIGluc3RydWN0aW9uLgorYm9vbCBYQ29yZUluc3RySW5mbzo6CitSZXZlcnNlQnJhbmNoQ29uZGl0aW9uKFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQpIGNvbnN0IAoreworICBhc3NlcnQoKENvbmQuc2l6ZSgpID09IDIpICYmIAorICAgICAgICAgICJJbnZhbGlkIFhDb3JlIGJyYW5jaCBjb25kaXRpb24hIik7CisgIENvbmRbMF0uc2V0SW1tKEdldE9wcG9zaXRlQnJhbmNoQ29uZGl0aW9uKChYQ29yZTo6Q29uZENvZGUpQ29uZFswXS5nZXRJbW0oKSkpOworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlSW5zdHJJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlSW5zdHJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiMTE2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJbnN0ckluZm8uaApAQCAtMCwwICsxLDk0IEBACisvLz09PS0gWENvcmVJbnN0ckluZm8uaCAtIFhDb3JlIEluc3RydWN0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgWENvcmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmdldEluc3RySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFhDT1JFSU5TVFJVQ1RJT05JTkZPX0gKKyNkZWZpbmUgWENPUkVJTlNUUlVDVElPTklORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiWENvcmVSZWdpc3RlckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBYQ29yZUluc3RySW5mbyA6IHB1YmxpYyBUYXJnZXRJbnN0ckluZm9JbXBsIHsKKyAgY29uc3QgWENvcmVSZWdpc3RlckluZm8gUkk7CitwdWJsaWM6CisgIFhDb3JlSW5zdHJJbmZvKCk7CisKKyAgLy8vIGdldFJlZ2lzdGVySW5mbyAtIFRhcmdldEluc3RySW5mbyBpcyBhIHN1cGVyc2V0IG9mIE1SZWdpc3RlciBpbmZvLiAgQXMKKyAgLy8vIHN1Y2gsIHdoZW5ldmVyIGEgY2xpZW50IGhhcyBhbiBpbnN0YW5jZSBvZiBpbnN0cnVjdGlvbiBpbmZvLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBiZSBhYmxlIHRvIGdldCByZWdpc3RlciBpbmZvIGFzIHdlbGwgKHRocm91Z2ggdGhpcyBtZXRob2QpLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIFJJOyB9CisKKyAgLy8vIGlzTG9hZEZyb21TdGFja1Nsb3QgLSBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKyAgLy8vIGxvYWQgZnJvbSBhIHN0YWNrIHNsb3QsIHJldHVybiB0aGUgdmlydHVhbCBvciBwaHlzaWNhbCByZWdpc3RlciBudW1iZXIgb2YKKyAgLy8vIHRoZSBkZXN0aW5hdGlvbiBhbG9uZyB3aXRoIHRoZSBGcmFtZUluZGV4IG9mIHRoZSBsb2FkZWQgc3RhY2sgc2xvdC4gIElmCisgIC8vLyBub3QsIHJldHVybiAwLiAgVGhpcyBwcmVkaWNhdGUgbXVzdCByZXR1cm4gMCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzCisgIC8vLyBhbnkgc2lkZSBlZmZlY3RzIG90aGVyIHRoYW4gbG9hZGluZyBmcm9tIHRoZSBzdGFjayBzbG90LgorICB2aXJ0dWFsIHVuc2lnbmVkIGlzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisgIAorICAvLy8gaXNTdG9yZVRvU3RhY2tTbG90IC0gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGEgZGlyZWN0CisgIC8vLyBzdG9yZSB0byBhIHN0YWNrIHNsb3QsIHJldHVybiB0aGUgdmlydHVhbCBvciBwaHlzaWNhbCByZWdpc3RlciBudW1iZXIgb2YKKyAgLy8vIHRoZSBzb3VyY2UgcmVnIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKyAgLy8vIG5vdCwgcmV0dXJuIDAuICBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiAwIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMKKyAgLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBzdG9yaW5nIHRvIHRoZSBzdGFjayBzbG90LgorICB2aXJ0dWFsIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworICAKKyAgdmlydHVhbCBib29sIEFuYWx5emVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKiZUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TW9kaWZ5KSBjb25zdDsKKyAgCisgIHZpcnR1YWwgdW5zaWduZWQgSW5zZXJ0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnTG9jIERMKSBjb25zdDsKKyAgCisgIHZpcnR1YWwgdW5zaWduZWQgUmVtb3ZlQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIERlYnVnTG9jIERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsU3JjKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgc3BpbGxDYWxsZWVTYXZlZFJlZ2lzdGVycyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZDU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKyAgCisgIHZpcnR1YWwgYm9vbCByZXN0b3JlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIFJldmVyc2VCcmFuY2hDb25kaXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCkgY29uc3Q7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZUluc3RySW5mby50ZCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJbnN0ckluZm8udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliOWIxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVJbnN0ckluZm8udGQKQEAgLTAsMCArMSwxMDMwIEBACisvLz09PS0gWENvcmVJbnN0ckluZm8udGQgLSBUYXJnZXQgRGVzY3JpcHRpb24gZm9yIFhDb3JlIC0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIFhDb3JlIGluc3RydWN0aW9ucyBpbiBUYWJsZUdlbiBmb3JtYXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVXNlcyBvZiBDUCwgRFAgYXJlIG5vdCBjdXJyZW50bHkgcmVmbGVjdGVkIGluIHRoZSBwYXR0ZXJucywgc2luY2UKKy8vIGhhdmluZyBhIHBoeXNpY2FsIHJlZ2lzdGVyIGFzIGFuIG9wZXJhbmQgcHJldmVudHMgbG9vcCBob2lzdGluZyBhbmQKKy8vIHNpbmNlIHRoZSB2YWx1ZSBvZiB0aGVzZSByZWdpc3RlcnMgbmV2ZXIgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmUgb2YgdGhlCisvLyBmdW5jdGlvbi4KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGZvcm1hdCBzdXBlcmNsYXNzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW5jbHVkZSAiWENvcmVJbnN0ckZvcm1hdHMudGQiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBYQ29yZSBzcGVjaWZpYyBEQUcgTm9kZXMuCisvLworCisvLyBDYWxsCitkZWYgU0RUX1hDb3JlQnJhbmNoTGluayA6IFNEVHlwZVByb2ZpbGU8MCwgMSwgW1NEVENpc1B0clR5PDA+XT47CitkZWYgWENvcmVCcmFuY2hMaW5rICAgICA6IFNETm9kZTwiWENvcmVJU0Q6OkJMIixTRFRfWENvcmVCcmFuY2hMaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWcsIFNETlBPdXRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5QVmFyaWFkaWNdPjsKKworZGVmIFhDb3JlUmV0c3AgICAgICAgOiBTRE5vZGU8IlhDb3JlSVNEOjpSRVRTUCIsIFNEVEJyaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBPcHRJbkZsYWddPjsKKworZGVmIFNEVF9YQ29yZUJSX0pUICAgIDogU0RUeXBlUHJvZmlsZTwwLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0RUQ2lzVlQ8MCwgaTMyPiwgU0RUQ2lzVlQ8MSwgaTMyPl0+OworCitkZWYgWENvcmVCUl9KVCA6IFNETm9kZTwiWENvcmVJU0Q6OkJSX0pUIiwgU0RUX1hDb3JlQlJfSlQsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluXT47CisKK2RlZiBYQ29yZUJSX0pUMzIgOiBTRE5vZGU8IlhDb3JlSVNEOjpCUl9KVDMyIiwgU0RUX1hDb3JlQlJfSlQsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluXT47CisKK2RlZiBTRFRfWENvcmVBZGRyZXNzICAgIDogU0RUeXBlUHJvZmlsZTwxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1B0clR5PDA+XT47CisKK2RlZiBwY3JlbHdyYXBwZXIgOiBTRE5vZGU8IlhDb3JlSVNEOjpQQ1JlbGF0aXZlV3JhcHBlciIsIFNEVF9YQ29yZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBkcHJlbHdyYXBwZXIgOiBTRE5vZGU8IlhDb3JlSVNEOjpEUFJlbGF0aXZlV3JhcHBlciIsIFNEVF9YQ29yZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBjcHJlbHdyYXBwZXIgOiBTRE5vZGU8IlhDb3JlSVNEOjpDUFJlbGF0aXZlV3JhcHBlciIsIFNEVF9YQ29yZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBTRFRfWENvcmVTdHdzcCAgICA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgW1NEVENpc0ludDwxPl0+OworZGVmIFhDb3JlU3R3c3AgICAgICAgIDogU0ROb2RlPCJYQ29yZUlTRDo6U1RXU1AiLCBTRFRfWENvcmVTdHdzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluXT47CisKKy8vIFRoZXNlIGFyZSB0YXJnZXQtaW5kZXBlbmRlbnQgbm9kZXMsIGJ1dCBoYXZlIHRhcmdldC1zcGVjaWZpYyBmb3JtYXRzLgorZGVmIFNEVF9YQ29yZUNhbGxTZXFTdGFydCA6IFNEQ2FsbFNlcVN0YXJ0PFsgU0RUQ2lzVlQ8MCwgaTMyPiBdPjsKK2RlZiBTRFRfWENvcmVDYWxsU2VxRW5kICAgOiBTRENhbGxTZXFFbmQ8WyBTRFRDaXNWVDwwLCBpMzI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVENpc1ZUPDEsIGkzMj4gXT47CisKK2RlZiBjYWxsc2VxX3N0YXJ0IDogU0ROb2RlPCJJU0Q6OkNBTExTRVFfU1RBUlQiLCBTRFRfWENvcmVDYWxsU2VxU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3V0RmxhZ10+OworZGVmIGNhbGxzZXFfZW5kICAgOiBTRE5vZGU8IklTRDo6Q0FMTFNFUV9FTkQiLCAgIFNEVF9YQ29yZUNhbGxTZXFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QT3B0SW5GbGFnLCBTRE5QT3V0RmxhZ10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gUGF0dGVybiBTdHVmZgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIGRpdjRfeGZvcm0gOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiBpbW0vNAorICBhc3NlcnQoTi0+Z2V0WkV4dFZhbHVlKCkgJSA0ID09IDApOworICByZXR1cm4gZ2V0STMySW1tKE4tPmdldFpFeHRWYWx1ZSgpLzQpOworfV0+OworCitkZWYgbXNrc2l6ZV94Zm9ybSA6IFNETm9kZVhGb3JtPGltbSwgW3sKKyAgLy8gVHJhbnNmb3JtYXRpb24gZnVuY3Rpb246IGdldCB0aGUgc2l6ZSBvZiBhIG1hc2sKKyAgYXNzZXJ0KGlzTWFza18zMihOLT5nZXRaRXh0VmFsdWUoKSkpOworICAvLyBsb29rIGZvciB0aGUgZmlyc3Qgbm9uLXplcm8gYml0CisgIHJldHVybiBnZXRJMzJJbW0oMzIgLSBDb3VudExlYWRpbmdaZXJvc18zMihOLT5nZXRaRXh0VmFsdWUoKSkpOworfV0+OworCitkZWYgbmVnX3hmb3JtIDogU0ROb2RlWEZvcm08aW1tLCBbeworICAvLyBUcmFuc2Zvcm1hdGlvbiBmdW5jdGlvbjogLWltbQorICB1aW50MzJfdCB2YWx1ZSA9IE4tPmdldFpFeHRWYWx1ZSgpOworICByZXR1cm4gZ2V0STMySW1tKC12YWx1ZSk7Cit9XT47CisKK2RlZiBicHdzdWJfeGZvcm0gOiBTRE5vZGVYRm9ybTxpbW0sIFt7CisgIC8vIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uOiAzMi1pbW0KKyAgdWludDMyX3QgdmFsdWUgPSBOLT5nZXRaRXh0VmFsdWUoKTsKKyAgcmV0dXJuIGdldEkzMkltbSgzMi12YWx1ZSk7Cit9XT47CisKK2RlZiBkaXY0bmVnX3hmb3JtIDogU0ROb2RlWEZvcm08aW1tLCBbeworICAvLyBUcmFuc2Zvcm1hdGlvbiBmdW5jdGlvbjogLWltbS80CisgIHVpbnQzMl90IHZhbHVlID0gTi0+Z2V0WkV4dFZhbHVlKCk7CisgIGFzc2VydCgtdmFsdWUgJSA0ID09IDApOworICByZXR1cm4gZ2V0STMySW1tKC12YWx1ZS80KTsKK31dPjsKKworZGVmIGltbVVzNE5lZyA6IFBhdExlYWY8KGltbSksIFt7CisgIHVpbnQzMl90IHZhbHVlID0gKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpOworICByZXR1cm4gKC12YWx1ZSklNCA9PSAwICYmICgtdmFsdWUpLzQgPD0gMTE7Cit9XT47CisKK2RlZiBpbW1VczQgOiBQYXRMZWFmPChpbW0pLCBbeworICB1aW50MzJfdCB2YWx1ZSA9ICh1aW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKTsKKyAgcmV0dXJuIHZhbHVlJTQgPT0gMCAmJiB2YWx1ZS80IDw9IDExOworfV0+OworCitkZWYgaW1tVXNOZWcgOiBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gLSgodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkpIDw9IDExOworfV0+OworCitkZWYgaW1tVXMgOiBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpIDw9IDExOworfV0+OworCitkZWYgaW1tVTYgOiBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpIDwgKDEgPDwgNik7Cit9XT47CisKK2RlZiBpbW1VMTAgOiBQYXRMZWFmPChpbW0pLCBbeworICByZXR1cm4gKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpIDwgKDEgPDwgMTApOworfV0+OworCitkZWYgaW1tVTE2IDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgcmV0dXJuICh1aW50MzJfdClOLT5nZXRaRXh0VmFsdWUoKSA8ICgxIDw8IDE2KTsKK31dPjsKKworZGVmIGltbVUyMCA6IFBhdExlYWY8KGltbSksIFt7CisgIHJldHVybiAodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCkgPCAoMSA8PCAyMCk7Cit9XT47CisKK2RlZiBpbW1Nc2tCaXRwIDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgdWludDMyX3QgdmFsdWUgPSAodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCk7CisgIGlmICghaXNNYXNrXzMyKHZhbHVlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgbXNrc2l6ZSA9IDMyIC0gQ291bnRMZWFkaW5nWmVyb3NfMzIodmFsdWUpOworICByZXR1cm4gKG1za3NpemUgPj0gMSAmJiBtc2tzaXplIDw9IDgpCisgICAgICAgICAgfHwgbXNrc2l6ZSA9PSAxNgorICAgICAgICAgIHx8IG1za3NpemUgPT0gMjQKKyAgICAgICAgICB8fCBtc2tzaXplID09IDMyOworfV0+OworCitkZWYgaW1tQml0cCA6IFBhdExlYWY8KGltbSksIFt7CisgIHVpbnQzMl90IHZhbHVlID0gKHVpbnQzMl90KU4tPmdldFpFeHRWYWx1ZSgpOworICByZXR1cm4gKHZhbHVlID49IDEgJiYgdmFsdWUgPD0gOCkKKyAgICAgICAgICB8fCB2YWx1ZSA9PSAxNgorICAgICAgICAgIHx8IHZhbHVlID09IDI0CisgICAgICAgICAgfHwgdmFsdWUgPT0gMzI7Cit9XT47CisKK2RlZiBpbW1CcHdTdWJCaXRwIDogUGF0TGVhZjwoaW1tKSwgW3sKKyAgdWludDMyX3QgdmFsdWUgPSAodWludDMyX3QpTi0+Z2V0WkV4dFZhbHVlKCk7CisgIHJldHVybiAodmFsdWUgPj0gMjQgJiYgdmFsdWUgPD0gMzEpCisgICAgICAgICAgfHwgdmFsdWUgPT0gMTYKKyAgICAgICAgICB8fCB2YWx1ZSA9PSA4CisgICAgICAgICAgfHwgdmFsdWUgPT0gMDsKK31dPjsKKworZGVmIGxkYTE2ZiA6IFBhdEZyYWc8KG9wcyBub2RlOiRhZGRyLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgKGFkZCBub2RlOiRhZGRyLCAoc2hsIG5vZGU6JG9mZnNldCwgMSkpPjsKK2RlZiBsZGExNmIgOiBQYXRGcmFnPChvcHMgbm9kZTokYWRkciwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgIChzdWIgbm9kZTokYWRkciwgKHNobCBub2RlOiRvZmZzZXQsIDEpKT47CitkZWYgbGRhd2YgOiBQYXRGcmFnPChvcHMgbm9kZTokYWRkciwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgIChhZGQgbm9kZTokYWRkciwgKHNobCBub2RlOiRvZmZzZXQsIDIpKT47CitkZWYgbGRhd2IgOiBQYXRGcmFnPChvcHMgbm9kZTokYWRkciwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgIChzdWIgbm9kZTokYWRkciwgKHNobCBub2RlOiRvZmZzZXQsIDIpKT47CisKKy8vIEluc3RydWN0aW9uIG9wZXJhbmQgdHlwZXMKK2RlZiBjYWxsdGFyZ2V0ICA6IE9wZXJhbmQ8aTMyPjsKK2RlZiBicnRhcmdldCA6IE9wZXJhbmQ8T3RoZXJWVD47CitkZWYgcGNsYWJlbCA6IE9wZXJhbmQ8aTMyPjsKKworLy8gQWRkcmVzc2luZyBtb2RlcworZGVmIEFERFJzcGlpIDogQ29tcGxleFBhdHRlcm48aTMyLCAyLCAiU2VsZWN0QUREUnNwaWkiLCBbYWRkLCBmcmFtZWluZGV4XSwgW10+OworZGVmIEFERFJkcGlpIDogQ29tcGxleFBhdHRlcm48aTMyLCAyLCAiU2VsZWN0QUREUmRwaWkiLCBbYWRkLCBkcHJlbHdyYXBwZXJdLAorICAgICAgICAgICAgICAgICBbXT47CitkZWYgQUREUmNwaWkgOiBDb21wbGV4UGF0dGVybjxpMzIsIDIsICJTZWxlY3RBRERSY3BpaSIsIFthZGQsIGNwcmVsd3JhcHBlcl0sCisgICAgICAgICAgICAgICAgIFtdPjsKKworLy8gQWRkcmVzcyBvcGVyYW5kcworZGVmIE1FTWlpIDogT3BlcmFuZDxpMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50TWVtT3BlcmFuZCI7CisgIGxldCBNSU9wZXJhbmRJbmZvID0gKG9wcyBpMzJpbW0sIGkzMmltbSk7Cit9CisKKy8vIEp1bXAgdGFibGVzLgorZGVmIElubGluZUpUIDogT3BlcmFuZDxpMzI+IHsKKyAgbGV0IFByaW50TWV0aG9kID0gInByaW50SW5saW5lSlQiOworfQorCitkZWYgSW5saW5lSlQzMiA6IE9wZXJhbmQ8aTMyPiB7CisgIGxldCBQcmludE1ldGhvZCA9ICJwcmludElubGluZUpUMzIiOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gQ2xhc3MgVGVtcGxhdGVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaHJlZSBvcGVyYW5kIHNob3J0CisKK211bHRpY2xhc3MgRjNSXzJSVVM8c3RyaW5nIE9wY1N0ciwgU0ROb2RlIE9wTm9kZT4geworICBkZWYgXzNyOiBfRjNSPAorICAgICAgICAgICAgICAgICAob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRiLCBHUlJlZ3M6JGMpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkZHN0LCAkYiwgJGMiKSwKKyAgICAgICAgICAgICAgICAgWyhzZXQgR1JSZWdzOiRkc3QsIChPcE5vZGUgR1JSZWdzOiRiLCBHUlJlZ3M6JGMpKV0+OworICBkZWYgXzJydXMgOiBfRjJSVVM8CisgICAgICAgICAgICAgICAgIChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBHUlJlZ3M6JGIsIGkzMmltbTokYyksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRkc3QsICRiLCAkYyIpLAorICAgICAgICAgICAgICAgICBbKHNldCBHUlJlZ3M6JGRzdCwgKE9wTm9kZSBHUlJlZ3M6JGIsIGltbVVzOiRjKSldPjsKK30KKworbXVsdGljbGFzcyBGM1JfMlJVU19ucDxzdHJpbmcgT3BjU3RyPiB7CisgIGRlZiBfM3I6IF9GM1I8CisgICAgICAgICAgICAgICAgIChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBHUlJlZ3M6JGIsIEdSUmVnczokYyksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRkc3QsICRiLCAkYyIpLAorICAgICAgICAgICAgICAgICBbXT47CisgIGRlZiBfMnJ1cyA6IF9GMlJVUzwKKyAgICAgICAgICAgICAgICAgKG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYiwgaTMyaW1tOiRjKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGRzdCwgJGIsICRjIiksCisgICAgICAgICAgICAgICAgIFtdPjsKK30KKworbXVsdGljbGFzcyBGM1JfMlJCSVRQPHN0cmluZyBPcGNTdHIsIFNETm9kZSBPcE5vZGU+IHsKKyAgZGVmIF8zcjogX0YzUjwKKyAgICAgICAgICAgICAgICAgKG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYiwgR1JSZWdzOiRjKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGRzdCwgJGIsICRjIiksCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAoT3BOb2RlIEdSUmVnczokYiwgR1JSZWdzOiRjKSldPjsKKyAgZGVmIF8ycnVzIDogX0YyUlVTPAorICAgICAgICAgICAgICAgICAob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRiLCBpMzJpbW06JGMpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkZHN0LCAkYiwgJGMiKSwKKyAgICAgICAgICAgICAgICAgWyhzZXQgR1JSZWdzOiRkc3QsIChPcE5vZGUgR1JSZWdzOiRiLCBpbW1CaXRwOiRjKSldPjsKK30KKworY2xhc3MgRjNSPHN0cmluZyBPcGNTdHIsIFNETm9kZSBPcE5vZGU+IDogX0YzUjwKKyAgICAgICAgICAgICAgICAgKG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYiwgR1JSZWdzOiRjKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGRzdCwgJGIsICRjIiksCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAoT3BOb2RlIEdSUmVnczokYiwgR1JSZWdzOiRjKSldPjsKKworY2xhc3MgRjNSX25wPHN0cmluZyBPcGNTdHI+IDogX0YzUjwKKyAgICAgICAgICAgICAgICAgKG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYiwgR1JSZWdzOiRjKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGRzdCwgJGIsICRjIiksCisgICAgICAgICAgICAgICAgIFtdPjsKKy8vIFRocmVlIG9wZXJhbmQgbG9uZworCisvLy8gRkwzUl9MMlJVUyBtdWx0aWNsYXNzIC0gRGVmaW5lIGEgbm9ybWFsIEZMM1IvRkwyUlVTIHBhdHRlcm4gaW4gb25lIHNob3QuCittdWx0aWNsYXNzIEZMM1JfTDJSVVM8c3RyaW5nIE9wY1N0ciwgU0ROb2RlIE9wTm9kZT4geworICBkZWYgX2wzcjogX0ZMM1I8CisgICAgICAgICAgICAgICAgIChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBHUlJlZ3M6JGIsIEdSUmVnczokYyksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRkc3QsICRiLCAkYyIpLAorICAgICAgICAgICAgICAgICBbKHNldCBHUlJlZ3M6JGRzdCwgKE9wTm9kZSBHUlJlZ3M6JGIsIEdSUmVnczokYykpXT47CisgIGRlZiBfbDJydXMgOiBfRkwyUlVTPAorICAgICAgICAgICAgICAgICAob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRiLCBpMzJpbW06JGMpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkZHN0LCAkYiwgJGMiKSwKKyAgICAgICAgICAgICAgICAgWyhzZXQgR1JSZWdzOiRkc3QsIChPcE5vZGUgR1JSZWdzOiRiLCBpbW1VczokYykpXT47Cit9CisKKy8vLyBGTDNSX0wyUlVTIG11bHRpY2xhc3MgLSBEZWZpbmUgYSBub3JtYWwgRkwzUi9GTDJSVVMgcGF0dGVybiBpbiBvbmUgc2hvdC4KK211bHRpY2xhc3MgRkwzUl9MMlJCSVRQPHN0cmluZyBPcGNTdHIsIFNETm9kZSBPcE5vZGU+IHsKKyAgZGVmIF9sM3I6IF9GTDNSPAorICAgICAgICAgICAgICAgICAob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRiLCBHUlJlZ3M6JGMpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkZHN0LCAkYiwgJGMiKSwKKyAgICAgICAgICAgICAgICAgWyhzZXQgR1JSZWdzOiRkc3QsIChPcE5vZGUgR1JSZWdzOiRiLCBHUlJlZ3M6JGMpKV0+OworICBkZWYgX2wycnVzIDogX0ZMMlJVUzwKKyAgICAgICAgICAgICAgICAgKG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYiwgaTMyaW1tOiRjKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGRzdCwgJGIsICRjIiksCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAoT3BOb2RlIEdSUmVnczokYiwgaW1tQml0cDokYykpXT47Cit9CisKK2NsYXNzIEZMM1I8c3RyaW5nIE9wY1N0ciwgU0ROb2RlIE9wTm9kZT4gOiBfRkwzUjwKKyAgICAgICAgICAgICAgICAgKG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYiwgR1JSZWdzOiRjKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGRzdCwgJGIsICRjIiksCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAoT3BOb2RlIEdSUmVnczokYiwgR1JSZWdzOiRjKSldPjsKKworLy8gUmVnaXN0ZXIgLSBVNgorLy8gT3BlcmFuZCByZWdpc3RlciAtIFU2CittdWx0aWNsYXNzIEZSVTZfTFJVNl9icmFuY2g8c3RyaW5nIE9wY1N0cj4geworICBkZWYgX3J1NjogX0ZSVTY8CisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUlJlZ3M6JGNvbmQsIGJydGFyZ2V0OiRkZXN0KSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGNvbmQsICRkZXN0IiksCisgICAgICAgICAgICAgICAgIFtdPjsKKyAgZGVmIF9scnU2OiBfRkxSVTY8CisgICAgICAgICAgICAgICAgIChvdXRzKSwgKGlucyBHUlJlZ3M6JGNvbmQsIGJydGFyZ2V0OiRkZXN0KSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGNvbmQsICRkZXN0IiksCisgICAgICAgICAgICAgICAgIFtdPjsKK30KKworbXVsdGljbGFzcyBGUlU2X0xSVTZfY3A8c3RyaW5nIE9wY1N0cj4geworICBkZWYgX3J1NjogX0ZSVTY8CisgICAgICAgICAgICAgICAgIChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBpMzJpbW06JGEpLAorICAgICAgICAgICAgICAgICAhc3RyY29uY2F0KE9wY1N0ciwgIiAkZHN0LCBjcFskYV0iKSwKKyAgICAgICAgICAgICAgICAgW10+OworICBkZWYgX2xydTY6IF9GTFJVNjwKKyAgICAgICAgICAgICAgICAgKG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIGkzMmltbTokYSksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRkc3QsIGNwWyRhXSIpLAorICAgICAgICAgICAgICAgICBbXT47Cit9CisKKy8vIFU2CittdWx0aWNsYXNzIEZVNl9MVTY8c3RyaW5nIE9wY1N0ciwgU0ROb2RlIE9wTm9kZT4geworICBkZWYgX3U2OiBfRlU2PAorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMyaW1tOiRiKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGIiKSwKKyAgICAgICAgICAgICAgICAgWyhPcE5vZGUgaW1tVTY6JGIpXT47CisgIGRlZiBfbHU2OiBfRkxVNjwKKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkzMmltbTokYiksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRiIiksCisgICAgICAgICAgICAgICAgIFsoT3BOb2RlIGltbVUxNjokYildPjsKK30KKworbXVsdGljbGFzcyBGVTZfTFU2X25wPHN0cmluZyBPcGNTdHI+IHsKKyAgZGVmIF91NjogX0ZVNjwKKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkzMmltbTokYiksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRiIiksCisgICAgICAgICAgICAgICAgIFtdPjsKKyAgZGVmIF9sdTY6IF9GTFU2PAorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMyaW1tOiRiKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGIiKSwKKyAgICAgICAgICAgICAgICAgW10+OworfQorCisvLyBVMTAKK211bHRpY2xhc3MgRlUxMF9MVTEwX25wPHN0cmluZyBPcGNTdHI+IHsKKyAgZGVmIF91MTA6IF9GVTEwPAorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgaTMyaW1tOiRiKSwKKyAgICAgICAgICAgICAgICAgIXN0cmNvbmNhdChPcGNTdHIsICIgJGIiKSwKKyAgICAgICAgICAgICAgICAgW10+OworICBkZWYgX2x1MTA6IF9GTFUxMDwKKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIGkzMmltbTokYiksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRiIiksCisgICAgICAgICAgICAgICAgIFtdPjsKK30KKworLy8gVHdvIG9wZXJhbmQgc2hvcnQKKworY2xhc3MgRjJSX25wPHN0cmluZyBPcGNTdHI+IDogX0YyUjwKKyAgICAgICAgICAgICAgICAgKG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYiksCisgICAgICAgICAgICAgICAgICFzdHJjb25jYXQoT3BjU3RyLCAiICRkc3QsICRiIiksCisgICAgICAgICAgICAgICAgIFtdPjsKKworLy8gVHdvIG9wZXJhbmQgbG9uZworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHNldWRvIEluc3RydWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbGV0IERlZnMgPSBbU1BdLCBVc2VzID0gW1NQXSBpbiB7CitkZWYgQURKQ0FMTFNUQUNLRE9XTiA6IFBzZXVkb0luc3RYQ29yZTwob3V0cyksIChpbnMgaTMyaW1tOiRhbXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkezpjb21tZW50fSBBREpDQUxMU1RBQ0tET1dOICRhbXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2FsbHNlcV9zdGFydCB0aW1tOiRhbXQpXT47CitkZWYgQURKQ0FMTFNUQUNLVVAgOiBQc2V1ZG9JbnN0WENvcmU8KG91dHMpLCAoaW5zIGkzMmltbTokYW10MSwgaTMyaW1tOiRhbXQyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH0gQURKQ0FMTFNUQUNLVVAgJGFtdDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2FsbHNlcV9lbmQgdGltbTokYW10MSwgdGltbTokYW10MildPjsKK30KKworZGVmIExEV0ZJIDogUHNldWRvSW5zdFhDb3JlPChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBNRU1paTokYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkezpjb21tZW50fSBMRFdGSSAkZHN0LCAkYWRkciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAobG9hZCBBRERSc3BpaTokYWRkcikpXT47CisKK2RlZiBMREFXRkkgOiBQc2V1ZG9JbnN0WENvcmU8KG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIE1FTWlpOiRhZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7OmNvbW1lbnR9IExEQVdGSSAkZHN0LCAkYWRkciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCBBRERSc3BpaTokYWRkcildPjsKKworZGVmIFNUV0ZJIDogUHNldWRvSW5zdFhDb3JlPChvdXRzKSwgKGlucyBHUlJlZ3M6JHNyYywgTUVNaWk6JGFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkezpjb21tZW50fSBTVFdGSSAkc3JjLCAkYWRkciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzdG9yZSBHUlJlZ3M6JHNyYywgQUREUnNwaWk6JGFkZHIpXT47CisKKy8vIFNFTEVDVF9DQ18qIC0gVXNlZCB0byBpbXBsZW1lbnQgdGhlIFNFTEVDVF9DQyBEQUcgb3BlcmF0aW9uLiAgRXhwYW5kZWQgYWZ0ZXIKKy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBpbnRvIGEgYnJhbmNoIHNlcXVlbmNlLgorbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDEgaW4geworICBkZWYgU0VMRUNUX0NDIDogUHNldWRvSW5zdFhDb3JlPChvdXRzIEdSUmVnczokZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMgR1JSZWdzOiRjb25kLCBHUlJlZ3M6JFQsIEdSUmVnczokRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHs6Y29tbWVudH0gU0VMRUNUX0NDIFBTRVVETyEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgR1JSZWdzOiRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0IEdSUmVnczokY29uZCwgR1JSZWdzOiRULCBHUlJlZ3M6JEYpKV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaHJlZSBvcGVyYW5kIHNob3J0CitkZWZtIEFERCA6IEYzUl8yUlVTPCJhZGQiLCBhZGQ+OworZGVmbSBTVUIgOiBGM1JfMlJVUzwic3ViIiwgc3ViPjsKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7CitkZWZtIEVRIDogRjNSXzJSVVNfbnA8ImVxIj47CitkZWYgTFNTXzNyIDogRjNSX25wPCJsc3MiPjsKK2RlZiBMU1VfM3IgOiBGM1JfbnA8ImxzdSI+OworfQorZGVmIEFORF8zciA6IEYzUjwiYW5kIiwgYW5kPjsKK2RlZiBPUl8zciA6IEYzUjwib3IiLCBvcj47CisKK2xldCBtYXlMb2FkPTEgaW4geworZGVmIExEV18zciA6IF9GM1I8KG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgImxkdyAkZHN0LCAkYWRkclskb2Zmc2V0XSIsCisgICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBMRFdfMnJ1cyA6IF9GMlJVUzwob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRhZGRyLCBpMzJpbW06JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAibGR3ICRkc3QsICRhZGRyWyRvZmZzZXRdIiwKKyAgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIExEMTZTXzNyIDogIF9GM1I8KG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgImxkMTZzICRkc3QsICRhZGRyWyRvZmZzZXRdIiwKKyAgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIExEOFVfM3IgOiAgX0YzUjwob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRhZGRyLCBHUlJlZ3M6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAibGQ4dSAkZHN0LCAkYWRkclskb2Zmc2V0XSIsCisgICAgICAgICAgICAgICAgICBbXT47Cit9CisKK2xldCBtYXlTdG9yZT0xIGluIHsKK2RlZiBTVFdfM3IgOiBfRjNSPChvdXRzKSwgKGlucyBHUlJlZ3M6JHZhbCwgR1JSZWdzOiRhZGRyLCBHUlJlZ3M6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAic3R3ICR2YWwsICRhZGRyWyRvZmZzZXRdIiwKKyAgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIFNUV18ycnVzIDogX0YyUlVTPChvdXRzKSwgKGlucyBHUlJlZ3M6JHZhbCwgR1JSZWdzOiRhZGRyLCBpMzJpbW06JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAic3R3ICR2YWwsICRhZGRyWyRvZmZzZXRdIiwKKyAgICAgICAgICAgICAgICAgIFtdPjsKK30KKworZGVmbSBTSEwgOiBGM1JfMlJCSVRQPCJzaGwiLCBzaGw+OworZGVmbSBTSFIgOiBGM1JfMlJCSVRQPCJzaHIiLCBzcmw+OworLy8gVE9ETyB0c2V0cgorCisvLyBUaHJlZSBvcGVyYW5kIGxvbmcKK2RlZiBMREFXRl9sM3IgOiBfRkwzUjwob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRhZGRyLCBHUlJlZ3M6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAibGRhdyAkZHN0LCAkYWRkclskb2Zmc2V0XSIsCisgICAgICAgICAgICAgICAgICBbKHNldCBHUlJlZ3M6JGRzdCwgKGxkYXdmIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpKV0+OworCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4KK2RlZiBMREFXRl9sMnJ1cyA6IF9GTDJSVVM8KG91dHMgR1JSZWdzOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSUmVnczokYWRkciwgaTMyaW1tOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAibGRhdyAkZHN0LCAkYWRkclskb2Zmc2V0XSIsCisgICAgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIExEQVdCX2wzciA6IF9GTDNSPChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBHUlJlZ3M6JGFkZHIsIEdSUmVnczokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICJsZGF3ICRkc3QsICRhZGRyWy0kb2Zmc2V0XSIsCisgICAgICAgICAgICAgICAgICBbKHNldCBHUlJlZ3M6JGRzdCwgKGxkYXdiIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpKV0+OworCitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4KK2RlZiBMREFXQl9sMnJ1cyA6IF9GTDJSVVM8KG91dHMgR1JSZWdzOiRkc3QpLAorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSUmVnczokYWRkciwgaTMyaW1tOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAibGRhdyAkZHN0LCAkYWRkclstJG9mZnNldF0iLAorICAgICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBMREExNkZfbDNyIDogX0ZMM1I8KG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgImxkYTE2ICRkc3QsICRhZGRyWyRvZmZzZXRdIiwKKyAgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAobGRhMTZmIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpKV0+OworCitkZWYgTERBMTZCX2wzciA6IF9GTDNSPChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBHUlJlZ3M6JGFkZHIsIEdSUmVnczokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICJsZGExNiAkZHN0LCAkYWRkclstJG9mZnNldF0iLAorICAgICAgICAgICAgICAgICAgWyhzZXQgR1JSZWdzOiRkc3QsIChsZGExNmIgR1JSZWdzOiRhZGRyLCBHUlJlZ3M6JG9mZnNldCkpXT47CisKK2RlZiBNVUxfbDNyIDogRkwzUjwibXVsIiwgbXVsPjsKKy8vIEluc3RydWN0aW9ucyB3aGljaCBtYXkgdHJhcCBhcmUgbWFya2VkIGFzIHNpZGUgZWZmZWN0aW5nLgorbGV0IGhhc1NpZGVFZmZlY3RzID0gMSBpbiB7CitkZWYgRElWU19sM3IgOiBGTDNSPCJkaXZzIiwgc2Rpdj47CitkZWYgRElWVV9sM3IgOiBGTDNSPCJkaXZ1IiwgdWRpdj47CitkZWYgUkVNU19sM3IgOiBGTDNSPCJyZW1zIiwgc3JlbT47CitkZWYgUkVNVV9sM3IgOiBGTDNSPCJyZW11IiwgdXJlbT47Cit9CitkZWYgWE9SX2wzciA6IEZMM1I8InhvciIsIHhvcj47CitkZWZtIEFTSFIgOiBGTDNSX0wyUkJJVFA8ImFzaHIiLCBzcmE+OworLy8gVE9ETyBjcmMzMiwgY3JjOCwgaW5wdywgb3V0cHcKK2xldCBtYXlTdG9yZT0xIGluIHsKK2RlZiBTVDE2X2wzciA6IF9GTDNSPChvdXRzKSwgKGlucyBHUlJlZ3M6JHZhbCwgR1JSZWdzOiRhZGRyLCBHUlJlZ3M6JG9mZnNldCksCisgICAgICAgICAgICAgICAgInN0MTYgJHZhbCwgJGFkZHJbJG9mZnNldF0iLAorICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIFNUOF9sM3IgOiBfRkwzUjwob3V0cyksIChpbnMgR1JSZWdzOiR2YWwsIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICJzdDggJHZhbCwgJGFkZHJbJG9mZnNldF0iLAorICAgICAgICAgICAgICAgIFtdPjsKK30KKworLy8gRm91ciBvcGVyYW5kIGxvbmcKK2xldCBDb25zdHJhaW50cyA9ICIkc3JjMSA9ICRkc3QxLCRzcmMyID0gJGRzdDIiIGluIHsKK2RlZiBNQUNDVV9sNHIgOiBfTDRSPChvdXRzIEdSUmVnczokZHN0MSwgR1JSZWdzOiRkc3QyKSwKKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUlJlZ3M6JHNyYzEsIEdSUmVnczokc3JjMiwgR1JSZWdzOiRzcmMzLAorICAgICAgICAgICAgICAgICAgICAgIEdSUmVnczokc3JjNCksCisgICAgICAgICAgICAgICAgICAgICJtYWNjdSAkZHN0MSwgJGRzdDIsICRzcmMzLCAkc3JjNCIsCisgICAgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIE1BQ0NTX2w0ciA6IF9MNFI8KG91dHMgR1JSZWdzOiRkc3QxLCBHUlJlZ3M6JGRzdDIpLAorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSUmVnczokc3JjMSwgR1JSZWdzOiRzcmMyLCBHUlJlZ3M6JHNyYzMsCisgICAgICAgICAgICAgICAgICAgICAgR1JSZWdzOiRzcmM0KSwKKyAgICAgICAgICAgICAgICAgICAgIm1hY2NzICRkc3QxLCAkZHN0MiwgJHNyYzMsICRzcmM0IiwKKyAgICAgICAgICAgICAgICAgICAgW10+OworfQorCisvLyBGaXZlIG9wZXJhbmQgbG9uZworCitkZWYgTEFERF9sNXIgOiBfTDVSPChvdXRzIEdSUmVnczokZHN0MSwgR1JSZWdzOiRkc3QyKSwKKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUlJlZ3M6JHNyYzEsIEdSUmVnczokc3JjMiwgR1JSZWdzOiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgImxhZGQgJGRzdDEsICRkc3QyLCAkc3JjMSwgJHNyYzIsICRzcmMzIiwKKyAgICAgICAgICAgICAgICAgICAgW10+OworCitkZWYgTFNVQl9sNXIgOiBfTDVSPChvdXRzIEdSUmVnczokZHN0MSwgR1JSZWdzOiRkc3QyKSwKKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUlJlZ3M6JHNyYzEsIEdSUmVnczokc3JjMiwgR1JSZWdzOiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgImxzdWIgJGRzdDEsICRkc3QyLCAkc3JjMSwgJHNyYzIsICRzcmMzIiwKKyAgICAgICAgICAgICAgICAgICAgW10+OworCitkZWYgTERJVl9sNXIgOiBfTDVSPChvdXRzIEdSUmVnczokZHN0MSwgR1JSZWdzOiRkc3QyKSwKKyAgICAgICAgICAgICAgICAgICAgKGlucyBHUlJlZ3M6JHNyYzEsIEdSUmVnczokc3JjMiwgR1JSZWdzOiRzcmMzKSwKKyAgICAgICAgICAgICAgICAgICAgImxkaXYgJGRzdDEsICRkc3QyLCAkc3JjMSwgJHNyYzIsICRzcmMzIiwKKyAgICAgICAgICAgICAgICAgICAgW10+OworCisvLyBTaXggb3BlcmFuZCBsb25nCisKK2RlZiBMTVVMX2w2ciA6IF9MNlI8KG91dHMgR1JSZWdzOiRkc3QxLCBHUlJlZ3M6JGRzdDIpLAorICAgICAgICAgICAgICAgICAgICAoaW5zIEdSUmVnczokc3JjMSwgR1JSZWdzOiRzcmMyLCBHUlJlZ3M6JHNyYzMsCisgICAgICAgICAgICAgICAgICAgICAgR1JSZWdzOiRzcmM0KSwKKyAgICAgICAgICAgICAgICAgICAgImxtdWwgJGRzdDEsICRkc3QyLCAkc3JjMSwgJHNyYzIsICRzcmMzLCAkc3JjNCIsCisgICAgICAgICAgICAgICAgICAgIFtdPjsKKworLy8gUmVnaXN0ZXIgLSBVNgorCisvL2xldCBVc2VzID0gW0RQXSBpbiAuLi4KK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSwgaXNSZU1hdGVyaWFsaXphYmxlID0gMSBpbgorZGVmIExEQVdEUF9ydTY6IF9GUlU2PChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBNRU1paTokYSksCisgICAgICAgICAgICAgICAgICAgICJsZGF3ICRkc3QsIGRwWyRhXSIsCisgICAgICAgICAgICAgICAgICAgIFtdPjsKKworbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4gICAgICAgICAgICAgICAgICAgIAorZGVmIExEQVdEUF9scnU2OiBfRkxSVTY8CisgICAgICAgICAgICAgICAgICAgIChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBNRU1paTokYSksCisgICAgICAgICAgICAgICAgICAgICJsZGF3ICRkc3QsIGRwWyRhXSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCBBRERSZHBpaTokYSldPjsKKworbGV0IG1heUxvYWQ9MSBpbgorZGVmIExEV0RQX3J1NjogX0ZSVTY8KG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIE1FTWlpOiRhKSwKKyAgICAgICAgICAgICAgICAgICAgImxkdyAkZHN0LCBkcFskYV0iLAorICAgICAgICAgICAgICAgICAgICBbXT47CisgICAgICAgICAgICAgICAgICAgIAorZGVmIExEV0RQX2xydTY6IF9GTFJVNjwKKyAgICAgICAgICAgICAgICAgICAgKG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIE1FTWlpOiRhKSwKKyAgICAgICAgICAgICAgICAgICAgImxkdyAkZHN0LCBkcFskYV0iLAorICAgICAgICAgICAgICAgICAgICBbKHNldCBHUlJlZ3M6JGRzdCwgKGxvYWQgQUREUmRwaWk6JGEpKV0+OworCitsZXQgbWF5U3RvcmU9MSBpbgorZGVmIFNUV0RQX3J1NiA6IF9GUlU2PChvdXRzKSwgKGlucyBHUlJlZ3M6JHZhbCwgTUVNaWk6JGFkZHIpLAorICAgICAgICAgICAgICAgICAgInN0dyAkdmFsLCBkcFskYWRkcl0iLAorICAgICAgICAgICAgICAgICAgW10+OworCitkZWYgU1RXRFBfbHJ1NiA6IF9GTFJVNjwob3V0cyksIChpbnMgR1JSZWdzOiR2YWwsIE1FTWlpOiRhZGRyKSwKKyAgICAgICAgICAgICAgICAgICJzdHcgJHZhbCwgZHBbJGFkZHJdIiwKKyAgICAgICAgICAgICAgICAgIFsoc3RvcmUgR1JSZWdzOiR2YWwsIEFERFJkcGlpOiRhZGRyKV0+OworCisvL2xldCBVc2VzID0gW0NQXSBpbiAuLgorbGV0IG1heUxvYWQgPSAxLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluCitkZWZtIExEV0NQIDogRlJVNl9MUlU2X2NwPCJsZHciPjsKKworbGV0IFVzZXMgPSBbU1BdIGluIHsKK2xldCBtYXlTdG9yZT0xIGluIHsKK2RlZiBTVFdTUF9ydTYgOiBfRlJVNjwKKyAgICAgICAgICAgICAgICAgKG91dHMpLCAoaW5zIEdSUmVnczokdmFsLCBpMzJpbW06JGluZGV4KSwKKyAgICAgICAgICAgICAgICAgInN0dyAkdmFsLCBzcFskaW5kZXhdIiwKKyAgICAgICAgICAgICAgICAgWyhYQ29yZVN0d3NwIEdSUmVnczokdmFsLCBpbW1VNjokaW5kZXgpXT47CisKK2RlZiBTVFdTUF9scnU2IDogX0ZMUlU2PAorICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgR1JSZWdzOiR2YWwsIGkzMmltbTokaW5kZXgpLAorICAgICAgICAgICAgICAgICAic3R3ICR2YWwsIHNwWyRpbmRleF0iLAorICAgICAgICAgICAgICAgICBbKFhDb3JlU3R3c3AgR1JSZWdzOiR2YWwsIGltbVUxNjokaW5kZXgpXT47Cit9CisKK2xldCBtYXlMb2FkPTEgaW4geworZGVmIExEV1NQX3J1NiA6IF9GUlU2PAorICAgICAgICAgICAgICAgICAob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgaTMyaW1tOiRiKSwKKyAgICAgICAgICAgICAgICAgImxkdyAkZHN0LCBzcFskYl0iLAorICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBMRFdTUF9scnU2IDogX0ZMUlU2PAorICAgICAgICAgICAgICAgICAob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgaTMyaW1tOiRiKSwKKyAgICAgICAgICAgICAgICAgImxkdyAkZHN0LCBzcFskYl0iLAorICAgICAgICAgICAgICAgICBbXT47Cit9CisKK2xldCBuZXZlckhhc1NpZGVFZmZlY3RzID0gMSBpbiB7CitkZWYgTERBV1NQX3J1NiA6IF9GUlU2PAorICAgICAgICAgICAgICAgICAob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgaTMyaW1tOiRiKSwKKyAgICAgICAgICAgICAgICAgImxkYXcgJGRzdCwgc3BbJGJdIiwKKyAgICAgICAgICAgICAgICAgW10+OworCitkZWYgTERBV1NQX2xydTYgOiBfRkxSVTY8CisgICAgICAgICAgICAgICAgIChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBpMzJpbW06JGIpLAorICAgICAgICAgICAgICAgICAibGRhdyAkZHN0LCBzcFskYl0iLAorICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBMREFXU1BfcnU2X1JSZWdzIDogX0ZSVTY8CisgICAgICAgICAgICAgICAgIChvdXRzIFJSZWdzOiRkc3QpLCAoaW5zIGkzMmltbTokYiksCisgICAgICAgICAgICAgICAgICJsZGF3ICRkc3QsIHNwWyRiXSIsCisgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIExEQVdTUF9scnU2X1JSZWdzIDogX0ZMUlU2PAorICAgICAgICAgICAgICAgICAob3V0cyBSUmVnczokZHN0KSwgKGlucyBpMzJpbW06JGIpLAorICAgICAgICAgICAgICAgICAibGRhdyAkZHN0LCBzcFskYl0iLAorICAgICAgICAgICAgICAgICBbXT47Cit9Cit9CisKK2xldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluIHsKK2RlZiBMRENfcnU2IDogX0ZSVTY8CisgICAgICAgICAgICAgICAgIChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBpMzJpbW06JGIpLAorICAgICAgICAgICAgICAgICAibGRjICRkc3QsICRiIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgR1JSZWdzOiRkc3QsIGltbVU2OiRiKV0+OworCitkZWYgTERDX2xydTYgOiBfRkxSVTY8CisgICAgICAgICAgICAgICAgIChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBpMzJpbW06JGIpLAorICAgICAgICAgICAgICAgICAibGRjICRkc3QsICRiIiwKKyAgICAgICAgICAgICAgICAgWyhzZXQgR1JSZWdzOiRkc3QsIGltbVUxNjokYildPjsKK30KKworLy8gT3BlcmFuZCByZWdpc3RlciAtIFU2CisvLyBUT0RPIHNldGMKK2xldCBpc0JyYW5jaCA9IDEsIGlzVGVybWluYXRvciA9IDEgaW4geworZGVmbSBCUkZUOiBGUlU2X0xSVTZfYnJhbmNoPCJidCI+OworZGVmbSBCUkJUOiBGUlU2X0xSVTZfYnJhbmNoPCJidCI+OworZGVmbSBCUkZGOiBGUlU2X0xSVTZfYnJhbmNoPCJiZiI+OworZGVmbSBCUkJGOiBGUlU2X0xSVTZfYnJhbmNoPCJiZiI+OworfQorCisvLyBVNgorbGV0IERlZnMgPSBbU1BdLCBVc2VzID0gW1NQXSBpbiB7CitsZXQgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEgaW4KK2RlZm0gRVhUU1AgOiBGVTZfTFU2X25wPCJleHRzcCI+OworbGV0IG1heVN0b3JlID0gMSBpbgorZGVmbSBFTlRTUCA6IEZVNl9MVTZfbnA8ImVudHNwIj47CisKK2xldCBpc1JldHVybiA9IDEsIGlzVGVybWluYXRvciA9IDEsIG1heUxvYWQgPSAxLCBpc0JhcnJpZXIgPSAxIGluIHsKK2RlZm0gUkVUU1AgOiBGVTZfTFU2PCJyZXRzcCIsIFhDb3JlUmV0c3A+OworfQorfQorCisvLyBUT0RPIGV4dGRwLCBrZW50c3AsIGtyZXN0c3AsIGJsYXQsIHNldHNyCisvLyBjbHJzciwgZ2V0c3IsIGthbGxpCitsZXQgaXNCcmFuY2ggPSAxLCBpc1Rlcm1pbmF0b3IgPSAxLCBpc0JhcnJpZXIgPSAxIGluIHsKK2RlZiBCUkJVX3U2IDogX0ZVNjwKKyAgICAgICAgICAgICAgICAgKG91dHMpLAorICAgICAgICAgICAgICAgICAoaW5zIGJydGFyZ2V0OiR0YXJnZXQpLAorICAgICAgICAgICAgICAgICAiYnUgJHRhcmdldCIsCisgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIEJSQlVfbHU2IDogX0ZMVTY8CisgICAgICAgICAgICAgICAgIChvdXRzKSwKKyAgICAgICAgICAgICAgICAgKGlucyBicnRhcmdldDokdGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgImJ1ICR0YXJnZXQiLAorICAgICAgICAgICAgICAgICBbXT47CisKK2RlZiBCUkZVX3U2IDogX0ZVNjwKKyAgICAgICAgICAgICAgICAgKG91dHMpLAorICAgICAgICAgICAgICAgICAoaW5zIGJydGFyZ2V0OiR0YXJnZXQpLAorICAgICAgICAgICAgICAgICAiYnUgJHRhcmdldCIsCisgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIEJSRlVfbHU2IDogX0ZMVTY8CisgICAgICAgICAgICAgICAgIChvdXRzKSwKKyAgICAgICAgICAgICAgICAgKGlucyBicnRhcmdldDokdGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgImJ1ICR0YXJnZXQiLAorICAgICAgICAgICAgICAgICBbXT47Cit9CisKKy8vbGV0IFVzZXMgPSBbQ1BdIGluIC4uLgorbGV0IERlZnMgPSBbUjExXSwgbmV2ZXJIYXNTaWRlRWZmZWN0cyA9IDEsIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEgaW4KK2RlZiBMREFXQ1BfdTY6IF9GUlU2PChvdXRzKSwgKGlucyBNRU1paTokYSksCisgICAgICAgICAgICAgICAgICAgICJsZGF3IHIxMSwgY3BbJGFdIiwKKyAgICAgICAgICAgICAgICAgICAgW10+OworCitsZXQgRGVmcyA9IFtSMTFdLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluCitkZWYgTERBV0NQX2x1NjogX0ZMUlU2PAorICAgICAgICAgICAgICAgICAgICAob3V0cyksIChpbnMgTUVNaWk6JGEpLAorICAgICAgICAgICAgICAgICAgICAibGRhdyByMTEsIGNwWyRhXSIsCisgICAgICAgICAgICAgICAgICAgIFsoc2V0IFIxMSwgQUREUmNwaWk6JGEpXT47CisKKy8vIFUxMAorLy8gVE9ETyBsZHdjcGwsIGJsYWNwCisKK2xldCBEZWZzID0gW1IxMV0sIGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluCitkZWYgTERBUF91MTAgOiBfRlUxMDwKKyAgICAgICAgICAgICAgICAgIChvdXRzKSwKKyAgICAgICAgICAgICAgICAgIChpbnMgaTMyaW1tOiRhZGRyKSwKKyAgICAgICAgICAgICAgICAgICJsZGFwIHIxMSwgJGFkZHIiLAorICAgICAgICAgICAgICAgICAgW10+OworCitsZXQgRGVmcyA9IFtSMTFdLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluCitkZWYgTERBUF9sdTEwIDogX0ZMVTEwPAorICAgICAgICAgICAgICAgICAgKG91dHMpLAorICAgICAgICAgICAgICAgICAgKGlucyBpMzJpbW06JGFkZHIpLAorICAgICAgICAgICAgICAgICAgImxkYXAgcjExLCAkYWRkciIsCisgICAgICAgICAgICAgICAgICBbKHNldCBSMTEsIChwY3JlbHdyYXBwZXIgdGdsb2JhbGFkZHI6JGFkZHIpKV0+OworCitsZXQgRGVmcyA9IFtSMTFdLCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxIGluCitkZWYgTERBUF9sdTEwX2JhIDogX0ZMVTEwPChvdXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucyBpMzJpbW06JGFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibGRhcCByMTEsICRhZGRyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZXQgUjExLCAocGNyZWx3cmFwcGVyIHRibG9ja2FkZHJlc3M6JGFkZHIpKV0+OworCitsZXQgaXNDYWxsPTEsCisvLyBBbGwgY2FsbHMgY2xvYmJlciB0aGUgbGluayByZWdpc3RlciBhbmQgdGhlIG5vbi1jYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzOgorRGVmcyA9IFtSMCwgUjEsIFIyLCBSMywgUjExLCBMUl0gaW4geworZGVmIEJMX3UxMCA6IF9GVTEwPAorICAgICAgICAgICAgICAgICAgKG91dHMpLAorICAgICAgICAgICAgICAgICAgKGlucyBjYWxsdGFyZ2V0OiR0YXJnZXQsIHZhcmlhYmxlX29wcyksCisgICAgICAgICAgICAgICAgICAiYmwgJHRhcmdldCIsCisgICAgICAgICAgICAgICAgICBbKFhDb3JlQnJhbmNoTGluayBpbW1VMTA6JHRhcmdldCldPjsKKworZGVmIEJMX2x1MTAgOiBfRkxVMTA8CisgICAgICAgICAgICAgICAgICAob3V0cyksCisgICAgICAgICAgICAgICAgICAoaW5zIGNhbGx0YXJnZXQ6JHRhcmdldCwgdmFyaWFibGVfb3BzKSwKKyAgICAgICAgICAgICAgICAgICJibCAkdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgIFsoWENvcmVCcmFuY2hMaW5rIGltbVUyMDokdGFyZ2V0KV0+OworfQorCisvLyBUd28gb3BlcmFuZCBzaG9ydAorLy8gVE9ETyBnZXRyLCBnZXRzdAorZGVmIE5PVCA6IF9GMlI8KG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokYiksCisgICAgICAgICAgICAgICAgICJub3QgJGRzdCwgJGIiLAorICAgICAgICAgICAgICAgICBbKHNldCBHUlJlZ3M6JGRzdCwgKG5vdCBHUlJlZ3M6JGIpKV0+OworCitkZWYgTkVHIDogX0YyUjwob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRiKSwKKyAgICAgICAgICAgICAgICAgIm5lZyAkZHN0LCAkYiIsCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAoaW5lZyBHUlJlZ3M6JGIpKV0+OworCisvLyBUT0RPIHNldGQsIGVldCwgZWVmLCBnZXR0cywgc2V0cHQsIG91dGN0LCBpbmN0LCBjaGtjdCwgb3V0dCwgaW50dCwgb3V0LAorLy8gaW4sIG91dHNociwgaW5zaHIsIHRlc3RjdCwgdGVzdHdjdCwgdGluaXRwYywgdGluaXRkcCwgdGluaXRzcCwgdGluaXRjcCwKKy8vIHRzZXRtciwgc2V4dCAocmVnKSwgemV4dCAocmVnKQorbGV0IENvbnN0cmFpbnRzID0gIiRzcmMxID0gJGRzdCIgaW4geworbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluCitkZWYgU0VYVF9ydXMgOiBfRlJVUzwob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRzcmMxLCBpMzJpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAic2V4dCAkZHN0LCAkc3JjMiIsCisgICAgICAgICAgICAgICAgIFtdPjsKKworbGV0IG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluCitkZWYgWkVYVF9ydXMgOiBfRlJVUzwob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRzcmMxLCBpMzJpbW06JHNyYzIpLAorICAgICAgICAgICAgICAgICAiemV4dCAkZHN0LCAkc3JjMiIsCisgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIEFORE5PVF8yciA6IF9GMlI8KG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokc3JjMSwgR1JSZWdzOiRzcmMyKSwKKyAgICAgICAgICAgICAgICAgImFuZG5vdCAkZHN0LCAkc3JjMiIsCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAoYW5kIEdSUmVnczokc3JjMSwgKG5vdCBHUlJlZ3M6JHNyYzIpKSldPjsKK30KKworbGV0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDEsIG5ldmVySGFzU2lkZUVmZmVjdHMgPSAxIGluCitkZWYgTUtNU0tfcnVzIDogX0ZSVVM8KG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIGkzMmltbTokc2l6ZSksCisgICAgICAgICAgICAgICAgICJta21zayAkZHN0LCAkc2l6ZSIsCisgICAgICAgICAgICAgICAgIFtdPjsKKworZGVmIE1LTVNLXzJyIDogX0ZSVVM8KG91dHMgR1JSZWdzOiRkc3QpLCAoaW5zIEdSUmVnczokc2l6ZSksCisgICAgICAgICAgICAgICAgICJta21zayAkZHN0LCAkc2l6ZSIsCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAoYWRkIChzaGwgMSwgR1JSZWdzOiRzaXplKSwgMHhmZmZmZmZmZikpXT47CisKKy8vIFR3byBvcGVyYW5kIGxvbmcKKy8vIFRPRE8gc2V0dHcsIHNldGNsaywgc2V0cmR5LCBzZXRwc2MsIGVuZGluLCBwZWVrLAorLy8gZ2V0ZCwgdGVzdGxjbCwgdGluaXRsciwgZ2V0cHMsIHNldHBzCitkZWYgQklUUkVWX2wyciA6IF9GTDJSPChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBHUlJlZ3M6JHNyYyksCisgICAgICAgICAgICAgICAgICJiaXRyZXYgJGRzdCwgJHNyYyIsCisgICAgICAgICAgICAgICAgIFsoc2V0IEdSUmVnczokZHN0LCAoaW50X3hjb3JlX2JpdHJldiBHUlJlZ3M6JHNyYykpXT47CisKK2RlZiBCWVRFUkVWX2wyciA6IF9GTDJSPChvdXRzIEdSUmVnczokZHN0KSwgKGlucyBHUlJlZ3M6JHNyYyksCisgICAgICAgICAgICAgICAgICJieXRlcmV2ICRkc3QsICRzcmMiLAorICAgICAgICAgICAgICAgICBbKHNldCBHUlJlZ3M6JGRzdCwgKGJzd2FwIEdSUmVnczokc3JjKSldPjsKKworZGVmIENMWl9sMnIgOiBfRkwyUjwob3V0cyBHUlJlZ3M6JGRzdCksIChpbnMgR1JSZWdzOiRzcmMpLAorICAgICAgICAgICAgICAgICAiY2x6ICRkc3QsICRzcmMiLAorICAgICAgICAgICAgICAgICBbKHNldCBHUlJlZ3M6JGRzdCwgKGN0bHogR1JSZWdzOiRzcmMpKV0+OworCisvLyBPbmUgb3BlcmFuZCBzaG9ydAorLy8gVE9ETyBlZHUsIGVldSwgd2FpdGV0LCB3YWl0ZWYsIGZyZWVyLCB0c3RhcnQsIG1zeW5jLCBtam9pbiwgc3luY3IsIGNscnRwCisvLyBzZXRkcCwgc2V0Y3AsIHNldHYsIHNldGV2LCBrY2FsbAorLy8gZGdldHJlZworbGV0IGlzQnJhbmNoPTEsIGlzSW5kaXJlY3RCcmFuY2g9MSwgaXNUZXJtaW5hdG9yPTEsIGlzQmFycmllciA9IDEgaW4KK2RlZiBCQVVfMXIgOiBfRjFSPChvdXRzKSwgKGlucyBHUlJlZ3M6JGFkZHIpLAorICAgICAgICAgICAgICAgICAiYmF1ICRhZGRyIiwKKyAgICAgICAgICAgICAgICAgWyhicmluZCBHUlJlZ3M6JGFkZHIpXT47CisKK2xldCBpc0JyYW5jaD0xLCBpc0luZGlyZWN0QnJhbmNoPTEsIGlzVGVybWluYXRvcj0xLCBpc0JhcnJpZXIgPSAxIGluCitkZWYgQlJfSlQgOiBQc2V1ZG9JbnN0WENvcmU8KG91dHMpLCAoaW5zIElubGluZUpUOiR0LCBHUlJlZ3M6JGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJicnUgJGlcbiR0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFhDb3JlQlJfSlQgdGp1bXB0YWJsZTokdCwgR1JSZWdzOiRpKV0+OworCitsZXQgaXNCcmFuY2g9MSwgaXNJbmRpcmVjdEJyYW5jaD0xLCBpc1Rlcm1pbmF0b3I9MSwgaXNCYXJyaWVyID0gMSBpbgorZGVmIEJSX0pUMzIgOiBQc2V1ZG9JbnN0WENvcmU8KG91dHMpLCAoaW5zIElubGluZUpUMzI6JHQsIEdSUmVnczokaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnJ1ICRpXG4kdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKFhDb3JlQlJfSlQzMiB0anVtcHRhYmxlOiR0LCBHUlJlZ3M6JGkpXT47CisKK2xldCBEZWZzPVtTUF0sIG5ldmVySGFzU2lkZUVmZmVjdHM9MSBpbgorZGVmIFNFVFNQXzFyIDogX0YxUjwob3V0cyksIChpbnMgR1JSZWdzOiRzcmMpLAorICAgICAgICAgICAgICAgICAic2V0IHNwLCAkc3JjIiwKKyAgICAgICAgICAgICAgICAgW10+OworCitsZXQgaGFzQ3RybERlcCA9IDEgaW4gCitkZWYgRUNBTExUXzFyIDogX0YxUjwob3V0cyksIChpbnMgR1JSZWdzOiRzcmMpLAorICAgICAgICAgICAgICAgICAiZWNhbGx0ICRzcmMiLAorICAgICAgICAgICAgICAgICBbXT47CisKK2xldCBoYXNDdHJsRGVwID0gMSBpbiAKK2RlZiBFQ0FMTEZfMXIgOiBfRjFSPChvdXRzKSwgKGlucyBHUlJlZ3M6JHNyYyksCisgICAgICAgICAgICAgICAgICJlY2FsbGYgJHNyYyIsCisgICAgICAgICAgICAgICAgIFtdPjsKKworbGV0IGlzQ2FsbD0xLCAKKy8vIEFsbCBjYWxscyBjbG9iYmVyIHRoZSBsaW5rIHJlZ2lzdGVyIGFuZCB0aGUgbm9uLWNhbGxlZS1zYXZlZCByZWdpc3RlcnM6CitEZWZzID0gW1IwLCBSMSwgUjIsIFIzLCBSMTEsIExSXSBpbiB7CitkZWYgQkxBXzFyIDogX0YxUjwob3V0cyksIChpbnMgR1JSZWdzOiRhZGRyLCB2YXJpYWJsZV9vcHMpLAorICAgICAgICAgICAgICAgICAiYmxhICRhZGRyIiwKKyAgICAgICAgICAgICAgICAgWyhYQ29yZUJyYW5jaExpbmsgR1JSZWdzOiRhZGRyKV0+OworfQorCisvLyBaZXJvIG9wZXJhbmQgc2hvcnQKKy8vIFRPRE8gd2FpdGV1LCBjbHJlLCBzc3luYywgZnJlZXQsIGxkc3BjLCBzdHNwYywgbGRzc3IsIHN0c3NyLCBsZHNlZCwgc3RzZWQsCisvLyBzdGV0LCBnZXRlZCwgZ2V0ZXQsIGdldGtlcCwgZ2V0a3NwLCBzZXRrZXAsIGdldGlkLCBrcmV0LCBkY2FsbCwgZHJldCwKKy8vIGRlbnRzcCwgZHJlc3RzcAorCitsZXQgRGVmcyA9IFtSMTFdIGluCitkZWYgR0VUSURfMFIgOiBfRjBSPChvdXRzKSwgKGlucyksCisgICAgICAgICAgICAgICAgICJnZXQgcjExLCBpZCIsCisgICAgICAgICAgICAgICAgIFsoc2V0IFIxMSwgKGludF94Y29yZV9nZXRpZCkpXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBOb24tSW5zdHJ1Y3Rpb24gUGF0dGVybnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiA6IFBhdDwoWENvcmVCcmFuY2hMaW5rIHRnbG9iYWxhZGRyOiRhZGRyKSwgKEJMX2x1MTAgdGdsb2JhbGFkZHI6JGFkZHIpPjsKK2RlZiA6IFBhdDwoWENvcmVCcmFuY2hMaW5rIHRleHRlcm5hbHN5bTokYWRkciksIChCTF9sdTEwIHRleHRlcm5hbHN5bTokYWRkcik+OworCisvLy8gc2V4dF9pbnJlZworZGVmIDogUGF0PChzZXh0X2lucmVnIEdSUmVnczokYiwgaTEpLCAoU0VYVF9ydXMgR1JSZWdzOiRiLCAxKT47CitkZWYgOiBQYXQ8KHNleHRfaW5yZWcgR1JSZWdzOiRiLCBpOCksIChTRVhUX3J1cyBHUlJlZ3M6JGIsIDgpPjsKK2RlZiA6IFBhdDwoc2V4dF9pbnJlZyBHUlJlZ3M6JGIsIGkxNiksIChTRVhUX3J1cyBHUlJlZ3M6JGIsIDE2KT47CisKKy8vLyBsb2FkcworZGVmIDogUGF0PCh6ZXh0bG9hZGk4IChhZGQgR1JSZWdzOiRhZGRyLCBHUlJlZ3M6JG9mZnNldCkpLAorICAgICAgICAgIChMRDhVXzNyIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpPjsKK2RlZiA6IFBhdDwoemV4dGxvYWRpOCBHUlJlZ3M6JGFkZHIpLCAoTEQ4VV8zciBHUlJlZ3M6JGFkZHIsIChMRENfcnU2IDApKT47CisKK2RlZiA6IFBhdDwoc2V4dGxvYWRpMTYgKGxkYTE2ZiBHUlJlZ3M6JGFkZHIsIEdSUmVnczokb2Zmc2V0KSksCisgICAgICAgICAgKExEMTZTXzNyIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpPjsKK2RlZiA6IFBhdDwoc2V4dGxvYWRpMTYgR1JSZWdzOiRhZGRyKSwgKExEMTZTXzNyIEdSUmVnczokYWRkciwgKExEQ19ydTYgMCkpPjsKKworZGVmIDogUGF0PChsb2FkIChsZGF3ZiBHUlJlZ3M6JGFkZHIsIEdSUmVnczokb2Zmc2V0KSksCisgICAgICAgICAgKExEV18zciBHUlJlZ3M6JGFkZHIsIEdSUmVnczokb2Zmc2V0KT47CitkZWYgOiBQYXQ8KGxvYWQgKGFkZCBHUlJlZ3M6JGFkZHIsIGltbVVzNDokb2Zmc2V0KSksCisgICAgICAgICAgKExEV18ycnVzIEdSUmVnczokYWRkciwgKGRpdjRfeGZvcm0gaW1tVXM0OiRvZmZzZXQpKT47CitkZWYgOiBQYXQ8KGxvYWQgR1JSZWdzOiRhZGRyKSwgKExEV18ycnVzIEdSUmVnczokYWRkciwgMCk+OworCisvLy8gYW55ZXh0CitkZWYgOiBQYXQ8KGV4dGxvYWRpOCAoYWRkIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpKSwKKyAgICAgICAgICAoTEQ4VV8zciBHUlJlZ3M6JGFkZHIsIEdSUmVnczokb2Zmc2V0KT47CitkZWYgOiBQYXQ8KGV4dGxvYWRpOCBHUlJlZ3M6JGFkZHIpLCAoTEQ4VV8zciBHUlJlZ3M6JGFkZHIsIChMRENfcnU2IDApKT47CitkZWYgOiBQYXQ8KGV4dGxvYWRpMTYgKGxkYTE2ZiBHUlJlZ3M6JGFkZHIsIEdSUmVnczokb2Zmc2V0KSksCisgICAgICAgICAgKExEMTZTXzNyIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpPjsKK2RlZiA6IFBhdDwoZXh0bG9hZGkxNiBHUlJlZ3M6JGFkZHIpLCAoTEQxNlNfM3IgR1JSZWdzOiRhZGRyLCAoTERDX3J1NiAwKSk+OworCisvLy8gc3RvcmVzCitkZWYgOiBQYXQ8KHRydW5jc3RvcmVpOCBHUlJlZ3M6JHZhbCwgKGFkZCBHUlJlZ3M6JGFkZHIsIEdSUmVnczokb2Zmc2V0KSksCisgICAgICAgICAgKFNUOF9sM3IgR1JSZWdzOiR2YWwsIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpPjsKK2RlZiA6IFBhdDwodHJ1bmNzdG9yZWk4IEdSUmVnczokdmFsLCBHUlJlZ3M6JGFkZHIpLAorICAgICAgICAgIChTVDhfbDNyIEdSUmVnczokdmFsLCBHUlJlZ3M6JGFkZHIsIChMRENfcnU2IDApKT47CisgICAgICAgICAgCitkZWYgOiBQYXQ8KHRydW5jc3RvcmVpMTYgR1JSZWdzOiR2YWwsIChsZGExNmYgR1JSZWdzOiRhZGRyLCBHUlJlZ3M6JG9mZnNldCkpLAorICAgICAgICAgIChTVDE2X2wzciBHUlJlZ3M6JHZhbCwgR1JSZWdzOiRhZGRyLCBHUlJlZ3M6JG9mZnNldCk+OworZGVmIDogUGF0PCh0cnVuY3N0b3JlaTE2IEdSUmVnczokdmFsLCBHUlJlZ3M6JGFkZHIpLAorICAgICAgICAgIChTVDE2X2wzciBHUlJlZ3M6JHZhbCwgR1JSZWdzOiRhZGRyLCAoTERDX3J1NiAwKSk+OworCitkZWYgOiBQYXQ8KHN0b3JlIEdSUmVnczokdmFsLCAobGRhd2YgR1JSZWdzOiRhZGRyLCBHUlJlZ3M6JG9mZnNldCkpLAorICAgICAgICAgIChTVFdfM3IgR1JSZWdzOiR2YWwsIEdSUmVnczokYWRkciwgR1JSZWdzOiRvZmZzZXQpPjsKK2RlZiA6IFBhdDwoc3RvcmUgR1JSZWdzOiR2YWwsIChhZGQgR1JSZWdzOiRhZGRyLCBpbW1VczQ6JG9mZnNldCkpLAorICAgICAgICAgIChTVFdfMnJ1cyBHUlJlZ3M6JHZhbCwgR1JSZWdzOiRhZGRyLCAoZGl2NF94Zm9ybSBpbW1VczQ6JG9mZnNldCkpPjsKK2RlZiA6IFBhdDwoc3RvcmUgR1JSZWdzOiR2YWwsIEdSUmVnczokYWRkciksCisgICAgICAgICAgKFNUV18ycnVzIEdSUmVnczokdmFsLCBHUlJlZ3M6JGFkZHIsIDApPjsKKworLy8vIGN0dHoKK2RlZiA6IFBhdDwoY3R0eiBHUlJlZ3M6JHNyYyksIChDTFpfbDJyIChCSVRSRVZfbDJyIEdSUmVnczokc3JjKSk+OworCisvLy8gdHJhcAorZGVmIDogUGF0PCh0cmFwKSwgKEVDQUxMRl8xciAoTERDX3J1NiAwKSk+OworCisvLy8KKy8vLyBicmFuY2ggcGF0dGVybnMKKy8vLworCisvLyB1bmNvbmRpdGlvbmFsIGJyYW5jaAorZGVmIDogUGF0PChiciBiYjokYWRkciksIChCUkZVX2x1NiBiYjokYWRkcik+OworCisvLyBkaXJlY3QgbWF0Y2ggZXF1YWwvbm90ZXF1YWwgemVybyBicmNvbmQKK2RlZiA6IFBhdDwoYnJjb25kIChzZXRuZSBHUlJlZ3M6JGxocywgMCksIGJiOiRkc3QpLAorICAgICAgICAgIChCUkZUX2xydTYgR1JSZWdzOiRsaHMsIGJiOiRkc3QpPjsKK2RlZiA6IFBhdDwoYnJjb25kIChzZXRlcSBHUlJlZ3M6JGxocywgMCksIGJiOiRkc3QpLAorICAgICAgICAgIChCUkZGX2xydTYgR1JSZWdzOiRsaHMsIGJiOiRkc3QpPjsKKworZGVmIDogUGF0PChicmNvbmQgKHNldGxlIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksIGJiOiRkc3QpLAorICAgICAgICAgIChCUkZGX2xydTYgKExTU18zciBHUlJlZ3M6JHJocywgR1JSZWdzOiRsaHMpLCBiYjokZHN0KT47CitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0dWxlIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksIGJiOiRkc3QpLAorICAgICAgICAgIChCUkZGX2xydTYgKExTVV8zciBHUlJlZ3M6JHJocywgR1JSZWdzOiRsaHMpLCBiYjokZHN0KT47CitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0Z2UgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKSwgYmI6JGRzdCksCisgICAgICAgICAgKEJSRkZfbHJ1NiAoTFNTXzNyIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksIGJiOiRkc3QpPjsKK2RlZiA6IFBhdDwoYnJjb25kIChzZXR1Z2UgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKSwgYmI6JGRzdCksCisgICAgICAgICAgKEJSRkZfbHJ1NiAoTFNVXzNyIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksIGJiOiRkc3QpPjsKK2RlZiA6IFBhdDwoYnJjb25kIChzZXRuZSBHUlJlZ3M6JGxocywgR1JSZWdzOiRyaHMpLCBiYjokZHN0KSwKKyAgICAgICAgICAoQlJGRl9scnU2IChFUV8zciBHUlJlZ3M6JGxocywgR1JSZWdzOiRyaHMpLCBiYjokZHN0KT47CitkZWYgOiBQYXQ8KGJyY29uZCAoc2V0bmUgR1JSZWdzOiRsaHMsIGltbVVzOiRyaHMpLCBiYjokZHN0KSwKKyAgICAgICAgICAoQlJGRl9scnU2IChFUV8ycnVzIEdSUmVnczokbGhzLCBpbW1VczokcmhzKSwgYmI6JGRzdCk+OworCisvLyBnZW5lcmljIGJyY29uZCBwYXR0ZXJuCitkZWYgOiBQYXQ8KGJyY29uZCBHUlJlZ3M6JGNvbmQsIGJiOiRhZGRyKSwgKEJSRlRfbHJ1NiBHUlJlZ3M6JGNvbmQsIGJiOiRhZGRyKT47CisKKworLy8vCisvLy8gU2VsZWN0IHBhdHRlcm5zCisvLy8KKworLy8gZGlyZWN0IG1hdGNoIGVxdWFsL25vdGVxdWFsIHplcm8gc2VsZWN0CitkZWYgOiBQYXQ8KHNlbGVjdCAoc2V0bmUgR1JSZWdzOiRsaHMsIDApLCBHUlJlZ3M6JFQsIEdSUmVnczokRiksCisgICAgICAgIChTRUxFQ1RfQ0MgR1JSZWdzOiRsaHMsIEdSUmVnczokVCwgR1JSZWdzOiRGKT47CisKK2RlZiA6IFBhdDwoc2VsZWN0IChzZXRlcSBHUlJlZ3M6JGxocywgMCksIEdSUmVnczokVCwgR1JSZWdzOiRGKSwKKyAgICAgICAgKFNFTEVDVF9DQyBHUlJlZ3M6JGxocywgR1JSZWdzOiRGLCBHUlJlZ3M6JFQpPjsKKworZGVmIDogUGF0PChzZWxlY3QgKHNldGxlIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksIEdSUmVnczokVCwgR1JSZWdzOiRGKSwKKyAgICAgICAgICAoU0VMRUNUX0NDIChMU1NfM3IgR1JSZWdzOiRyaHMsIEdSUmVnczokbGhzKSwgR1JSZWdzOiRGLCBHUlJlZ3M6JFQpPjsKK2RlZiA6IFBhdDwoc2VsZWN0IChzZXR1bGUgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKSwgR1JSZWdzOiRULCBHUlJlZ3M6JEYpLAorICAgICAgICAgIChTRUxFQ1RfQ0MgKExTVV8zciBHUlJlZ3M6JHJocywgR1JSZWdzOiRsaHMpLCBHUlJlZ3M6JEYsIEdSUmVnczokVCk+OworZGVmIDogUGF0PChzZWxlY3QgKHNldGdlIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksIEdSUmVnczokVCwgR1JSZWdzOiRGKSwKKyAgICAgICAgICAoU0VMRUNUX0NDIChMU1NfM3IgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKSwgR1JSZWdzOiRGLCBHUlJlZ3M6JFQpPjsKK2RlZiA6IFBhdDwoc2VsZWN0IChzZXR1Z2UgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKSwgR1JSZWdzOiRULCBHUlJlZ3M6JEYpLAorICAgICAgICAgIChTRUxFQ1RfQ0MgKExTVV8zciBHUlJlZ3M6JGxocywgR1JSZWdzOiRyaHMpLCBHUlJlZ3M6JEYsIEdSUmVnczokVCk+OworZGVmIDogUGF0PChzZWxlY3QgKHNldG5lIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksIEdSUmVnczokVCwgR1JSZWdzOiRGKSwKKyAgICAgICAgICAoU0VMRUNUX0NDIChFUV8zciBHUlJlZ3M6JGxocywgR1JSZWdzOiRyaHMpLCBHUlJlZ3M6JEYsIEdSUmVnczokVCk+OworZGVmIDogUGF0PChzZWxlY3QgKHNldG5lIEdSUmVnczokbGhzLCBpbW1VczokcmhzKSwgR1JSZWdzOiRULCBHUlJlZ3M6JEYpLAorICAgICAgICAgIChTRUxFQ1RfQ0MgKEVRXzJydXMgR1JSZWdzOiRsaHMsIGltbVVzOiRyaHMpLCBHUlJlZ3M6JEYsIEdSUmVnczokVCk+OworCisvLy8KKy8vLyBzZXRjYyBwYXR0ZXJucywgb25seSBtYXRjaGVkIHdoZW4gbm9uZSBvZiB0aGUgYWJvdmUgYnJjb25kCisvLy8gcGF0dGVybnMgbWF0Y2gKKy8vLworCisvLyBzZXRjYyAyIHJlZ2lzdGVyIG9wZXJhbmRzCitkZWYgOiBQYXQ8KHNldGxlIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksCisgICAgICAgICAgKEVRXzJydXMgKExTU18zciBHUlJlZ3M6JHJocywgR1JSZWdzOiRsaHMpLCAwKT47CitkZWYgOiBQYXQ8KHNldHVsZSBHUlJlZ3M6JGxocywgR1JSZWdzOiRyaHMpLAorICAgICAgICAgIChFUV8ycnVzIChMU1VfM3IgR1JSZWdzOiRyaHMsIEdSUmVnczokbGhzKSwgMCk+OworCitkZWYgOiBQYXQ8KHNldGd0IEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksCisgICAgICAgICAgKExTU18zciBHUlJlZ3M6JHJocywgR1JSZWdzOiRsaHMpPjsKK2RlZiA6IFBhdDwoc2V0dWd0IEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksCisgICAgICAgICAgKExTVV8zciBHUlJlZ3M6JHJocywgR1JSZWdzOiRsaHMpPjsKKworZGVmIDogUGF0PChzZXRnZSBHUlJlZ3M6JGxocywgR1JSZWdzOiRyaHMpLAorICAgICAgICAgIChFUV8ycnVzIChMU1NfM3IgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKSwgMCk+OworZGVmIDogUGF0PChzZXR1Z2UgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKSwKKyAgICAgICAgICAoRVFfMnJ1cyAoTFNVXzNyIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksIDApPjsKKworZGVmIDogUGF0PChzZXRsdCBHUlJlZ3M6JGxocywgR1JSZWdzOiRyaHMpLAorICAgICAgICAgIChMU1NfM3IgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKT47CitkZWYgOiBQYXQ8KHNldHVsdCBHUlJlZ3M6JGxocywgR1JSZWdzOiRyaHMpLAorICAgICAgICAgIChMU1VfM3IgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKT47CisKK2RlZiA6IFBhdDwoc2V0bmUgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKSwKKyAgICAgICAgICAoRVFfMnJ1cyAoRVFfM3IgR1JSZWdzOiRsaHMsIEdSUmVnczokcmhzKSwgMCk+OworCitkZWYgOiBQYXQ8KHNldGVxIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyksCisgICAgICAgICAgKEVRXzNyIEdSUmVnczokbGhzLCBHUlJlZ3M6JHJocyk+OworCisvLyBzZXRjYyByZWcvaW1tIG9wZXJhbmRzCitkZWYgOiBQYXQ8KHNldGVxIEdSUmVnczokbGhzLCBpbW1VczokcmhzKSwKKyAgICAgICAgICAoRVFfMnJ1cyBHUlJlZ3M6JGxocywgaW1tVXM6JHJocyk+OworZGVmIDogUGF0PChzZXRuZSBHUlJlZ3M6JGxocywgaW1tVXM6JHJocyksCisgICAgICAgICAgKEVRXzJydXMgKEVRXzJydXMgR1JSZWdzOiRsaHMsIGltbVVzOiRyaHMpLCAwKT47CisKKy8vIG1pc2MKK2RlZiA6IFBhdDwoYWRkIEdSUmVnczokYWRkciwgaW1tVXM0OiRvZmZzZXQpLAorICAgICAgICAgIChMREFXRl9sMnJ1cyBHUlJlZ3M6JGFkZHIsIChkaXY0X3hmb3JtIGltbVVzNDokb2Zmc2V0KSk+OworCitkZWYgOiBQYXQ8KHN1YiBHUlJlZ3M6JGFkZHIsIGltbVVzNDokb2Zmc2V0KSwKKyAgICAgICAgICAoTERBV0JfbDJydXMgR1JSZWdzOiRhZGRyLCAoZGl2NF94Zm9ybSBpbW1VczQ6JG9mZnNldCkpPjsKKworZGVmIDogUGF0PChhbmQgR1JSZWdzOiR2YWwsIGltbU1za0JpdHA6JG1hc2spLAorICAgICAgICAgIChaRVhUX3J1cyBHUlJlZ3M6JHZhbCwgKG1za3NpemVfeGZvcm0gaW1tTXNrQml0cDokbWFzaykpPjsKKworLy8gKHN1YiBYLCBpbW0pIGdldHMgY2Fub25pY2FsaXplZCB0byAoYWRkIFgsIC1pbW0pLiAgTWF0Y2ggdGhpcyBmb3JtLgorZGVmIDogUGF0PChhZGQgR1JSZWdzOiRzcmMxLCBpbW1Vc05lZzokc3JjMiksCisgICAgICAgICAgKFNVQl8ycnVzIEdSUmVnczokc3JjMSwgKG5lZ194Zm9ybSBpbW1Vc05lZzokc3JjMikpPjsKKworZGVmIDogUGF0PChhZGQgR1JSZWdzOiRzcmMxLCBpbW1VczROZWc6JHNyYzIpLAorICAgICAgICAgIChMREFXQl9sMnJ1cyBHUlJlZ3M6JHNyYzEsIChkaXY0bmVnX3hmb3JtIGltbVVzNE5lZzokc3JjMikpPjsKKworLy8vCisvLy8gU29tZSBwZWVwaG9sZXMKKy8vLworCitkZWYgOiBQYXQ8KG11bCBHUlJlZ3M6JHNyYywgMyksCisgICAgICAgICAgKExEQTE2Rl9sM3IgR1JSZWdzOiRzcmMsIEdSUmVnczokc3JjKT47CisKK2RlZiA6IFBhdDwobXVsIEdSUmVnczokc3JjLCA1KSwKKyAgICAgICAgICAoTERBV0ZfbDNyIEdSUmVnczokc3JjLCBHUlJlZ3M6JHNyYyk+OworCitkZWYgOiBQYXQ8KG11bCBHUlJlZ3M6JHNyYywgLTMpLAorICAgICAgICAgIChMREFXQl9sM3IgR1JSZWdzOiRzcmMsIEdSUmVnczokc3JjKT47CisKKy8vIGFzaHIgWCwgMzIgaXMgZXF1aXZhbGVudCB0byBhc2hyIFgsIDMxIG9uIHRoZSBYQ29yZS4KK2RlZiA6IFBhdDwoc3JhIEdSUmVnczokc3JjLCAzMSksCisgICAgICAgICAgKEFTSFJfbDJydXMgR1JSZWdzOiRzcmMsIDMyKT47CisKK2RlZiA6IFBhdDwoYnJjb25kIChzZXRsdCBHUlJlZ3M6JGxocywgMCksIGJiOiRkc3QpLAorICAgICAgICAgIChCUkZUX2xydTYgKEFTSFJfbDJydXMgR1JSZWdzOiRsaHMsIDMyKSwgYmI6JGRzdCk+OworCisvLyBzZXRnZSBYLCAwIGlzIGNhbm9uaWNhbGl6ZWQgdG8gc2V0Z3QgWCwgLTEKK2RlZiA6IFBhdDwoYnJjb25kIChzZXRndCBHUlJlZ3M6JGxocywgLTEpLCBiYjokZHN0KSwKKyAgICAgICAgICAoQlJGRl9scnU2IChBU0hSX2wycnVzIEdSUmVnczokbGhzLCAzMiksIGJiOiRkc3QpPjsKKworZGVmIDogUGF0PChzZWxlY3QgKHNldGx0IEdSUmVnczokbGhzLCAwKSwgR1JSZWdzOiRULCBHUlJlZ3M6JEYpLAorICAgICAgICAgIChTRUxFQ1RfQ0MgKEFTSFJfbDJydXMgR1JSZWdzOiRsaHMsIDMyKSwgR1JSZWdzOiRULCBHUlJlZ3M6JEYpPjsKKworZGVmIDogUGF0PChzZWxlY3QgKHNldGd0IEdSUmVnczokbGhzLCAtMSksIEdSUmVnczokVCwgR1JSZWdzOiRGKSwKKyAgICAgICAgICAoU0VMRUNUX0NDIChBU0hSX2wycnVzIEdSUmVnczokbGhzLCAzMiksIEdSUmVnczokRiwgR1JSZWdzOiRUKT47CisKK2RlZiA6IFBhdDwoc2V0Z3QgR1JSZWdzOiRsaHMsIC0xKSwKKyAgICAgICAgICAoRVFfMnJ1cyAoQVNIUl9sMnJ1cyBHUlJlZ3M6JGxocywgMzIpLCAwKT47CisKK2RlZiA6IFBhdDwoc3JhIChzaGwgR1JSZWdzOiRzcmMsIGltbUJwd1N1YkJpdHA6JGltbSksIGltbUJwd1N1YkJpdHA6JGltbSksCisgICAgICAgICAgKFNFWFRfcnVzIEdSUmVnczokc3JjLCAoYnB3c3ViX3hmb3JtIGltbUJwd1N1YkJpdHA6JGltbSkpPjsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVNQ0FzbUluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZU1DQXNtSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhYjFiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVNQ0FzbUluZm8uY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LS0gWENvcmVNQ0FzbUluZm8uY3BwIC0gWENvcmUgYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJYQ29yZU1DQXNtSW5mby5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1hDb3JlTUNBc21JbmZvOjpYQ29yZU1DQXNtSW5mbyhjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBUVCkgeworICBTdXBwb3J0c0RlYnVnSW5mb3JtYXRpb24gPSB0cnVlOworICBEYXRhMTZiaXRzRGlyZWN0aXZlID0gIlx0LnNob3J0XHQiOworICBEYXRhMzJiaXRzRGlyZWN0aXZlID0gIlx0LmxvbmdcdCI7CisgIERhdGE2NGJpdHNEaXJlY3RpdmUgPSAwOworICBaZXJvRGlyZWN0aXZlID0gIlx0LnNwYWNlXHQiOworICBDb21tZW50U3RyaW5nID0gIiMiOworICAgIAorICBQcml2YXRlR2xvYmFsUHJlZml4ID0gIi5MIjsKKyAgQXNjaXpEaXJlY3RpdmUgPSAiLmFzY2lpeiI7CisgIFdlYWtEZWZEaXJlY3RpdmUgPSAiXHQud2Vha1x0IjsKKyAgV2Vha1JlZkRpcmVjdGl2ZSA9ICJcdC53ZWFrXHQiOworCisgIC8vIERlYnVnCisgIEhhc0xFQjEyOCA9IHRydWU7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVNQ0FzbUluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVNQ0FzbUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDAzOTIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZU1DQXNtSW5mby5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vPT09PT0tLSBYQ29yZU1DQXNtSW5mby5oIC0gWENvcmUgYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi0tPT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgWENvcmVNQ0FzbUluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBYQ09SRVRBUkdFVEFTTUlORk9fSAorI2RlZmluZSBYQ09SRVRBUkdFVEFTTUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBUYXJnZXQ7CisKKyAgY2xhc3MgWENvcmVNQ0FzbUluZm8gOiBwdWJsaWMgTUNBc21JbmZvIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFhDb3JlTUNBc21JbmZvKGNvbnN0IFRhcmdldCAmVCwgU3RyaW5nUmVmIFRUKTsKKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVNYWNoaW5lRnVuY3Rpb25JbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlTWFjaGluZUZ1bmN0aW9uSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NzVhMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlTWFjaGluZUZ1bmN0aW9uSW5mby5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vPT09PS0gWENvcmVNYWNoaW5lRnVjdGlvbkluZm8uaCAtIFhDb3JlIG1hY2hpbmUgZnVuY3Rpb24gaW5mbyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIFhDb3JlLXNwZWNpZmljIHBlci1tYWNoaW5lLWZ1bmN0aW9uIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWENPUkVNQUNISU5FRlVOQ1RJT05JTkZPX0gKKyNkZWZpbmUgWENPUkVNQUNISU5FRlVOQ1RJT05JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucworY2xhc3MgRnVuY3Rpb247CisKKy8vLyBYQ29yZUZ1bmN0aW9uSW5mbyAtIFRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIE1hY2hpbmVGdW5jdGlvbiBwcml2YXRlCisvLy8gWENvcmUgdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBlYWNoIE1hY2hpbmVGdW5jdGlvbi4KK2NsYXNzIFhDb3JlRnVuY3Rpb25JbmZvIDogcHVibGljIE1hY2hpbmVGdW5jdGlvbkluZm8geworcHJpdmF0ZToKKyAgYm9vbCBVc2VzTFI7CisgIGludCBMUlNwaWxsU2xvdDsKKyAgaW50IEZQU3BpbGxTbG90OworICBpbnQgVmFyQXJnc0ZyYW1lSW5kZXg7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxNQ1N5bWJvbCosIENhbGxlZVNhdmVkSW5mbz4gPiBTcGlsbExhYmVsczsKKworcHVibGljOgorICBYQ29yZUZ1bmN0aW9uSW5mbygpIDoKKyAgICBVc2VzTFIoZmFsc2UpLAorICAgIExSU3BpbGxTbG90KDApLAorICAgIEZQU3BpbGxTbG90KDApLAorICAgIFZhckFyZ3NGcmFtZUluZGV4KDApIHt9CisgIAorICBleHBsaWNpdCBYQ29yZUZ1bmN0aW9uSW5mbyhNYWNoaW5lRnVuY3Rpb24gJk1GKSA6CisgICAgVXNlc0xSKGZhbHNlKSwKKyAgICBMUlNwaWxsU2xvdCgwKSwKKyAgICBGUFNwaWxsU2xvdCgwKSwKKyAgICBWYXJBcmdzRnJhbWVJbmRleCgwKSB7fQorICAKKyAgflhDb3JlRnVuY3Rpb25JbmZvKCkge30KKyAgCisgIHZvaWQgc2V0VmFyQXJnc0ZyYW1lSW5kZXgoaW50IG9mZikgeyBWYXJBcmdzRnJhbWVJbmRleCA9IG9mZjsgfQorICBpbnQgZ2V0VmFyQXJnc0ZyYW1lSW5kZXgoKSBjb25zdCB7IHJldHVybiBWYXJBcmdzRnJhbWVJbmRleDsgfQorICAKKyAgdm9pZCBzZXRVc2VzTFIoYm9vbCB2YWwpIHsgVXNlc0xSID0gdmFsOyB9CisgIGJvb2wgZ2V0VXNlc0xSKCkgY29uc3QgeyByZXR1cm4gVXNlc0xSOyB9CisgIAorICB2b2lkIHNldExSU3BpbGxTbG90KGludCBvZmYpIHsgTFJTcGlsbFNsb3QgPSBvZmY7IH0KKyAgaW50IGdldExSU3BpbGxTbG90KCkgY29uc3QgeyByZXR1cm4gTFJTcGlsbFNsb3Q7IH0KKyAgCisgIHZvaWQgc2V0RlBTcGlsbFNsb3QoaW50IG9mZikgeyBGUFNwaWxsU2xvdCA9IG9mZjsgfQorICBpbnQgZ2V0RlBTcGlsbFNsb3QoKSBjb25zdCB7IHJldHVybiBGUFNwaWxsU2xvdDsgfQorICAKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPE1DU3ltYm9sKiwgQ2FsbGVlU2F2ZWRJbmZvPiA+ICZnZXRTcGlsbExhYmVscygpIHsKKyAgICByZXR1cm4gU3BpbGxMYWJlbHM7CisgIH0KK307Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gWENPUkVNQUNISU5FRlVOQ1RJT05JTkZPX0gKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVSZWdpc3RlckluZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVJlZ2lzdGVySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1Y2E1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVSZWdpc3RlckluZm8uY3BwCkBAIC0wLDAgKzEsNTc2IEBACisvLz09PS0gWENvcmVSZWdpc3RlckluZm8uY3BwIC0gWENvcmUgUmVnaXN0ZXIgSW5mb3JtYXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgWENvcmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1SZWdpc3RlckluZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlhDb3JlUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAiWENvcmVNYWNoaW5lRnVuY3Rpb25JbmZvLmgiCisjaW5jbHVkZSAiWENvcmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworWENvcmVSZWdpc3RlckluZm86OlhDb3JlUmVnaXN0ZXJJbmZvKGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpKQorICA6IFhDb3JlR2VuUmVnaXN0ZXJJbmZvKFhDb3JlOjpBREpDQUxMU1RBQ0tET1dOLCBYQ29yZTo6QURKQ0FMTFNUQUNLVVApLAorICAgIFRJSSh0aWkpIHsKK30KKworLy8gaGVscGVyIGZ1bmN0aW9ucworc3RhdGljIGlubGluZSBib29sIGlzSW1tVXModW5zaWduZWQgdmFsKSB7CisgIHJldHVybiB2YWwgPD0gMTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0ltbVU2KHVuc2lnbmVkIHZhbCkgeworICByZXR1cm4gdmFsIDwgKDEgPDwgNik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0ltbVUxNih1bnNpZ25lZCB2YWwpIHsKKyAgcmV0dXJuIHZhbCA8ICgxIDw8IDE2KTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIFhDb3JlX0FyZ1JlZ3NbXSA9IHsKKyAgWENvcmU6OlIwLCBYQ29yZTo6UjEsIFhDb3JlOjpSMiwgWENvcmU6OlIzCit9OworCitjb25zdCB1bnNpZ25lZCAqIFhDb3JlUmVnaXN0ZXJJbmZvOjpnZXRBcmdSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYpCit7CisgIHJldHVybiBYQ29yZV9BcmdSZWdzOworfQorCit1bnNpZ25lZCBYQ29yZVJlZ2lzdGVySW5mbzo6Z2V0TnVtQXJnUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GKQoreworICByZXR1cm4gYXJyYXlfbGVuZ3Rob2YoWENvcmVfQXJnUmVncyk7Cit9CisKK2Jvb2wgWENvcmVSZWdpc3RlckluZm86Om5lZWRzRnJhbWVNb3Zlcyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgIHJldHVybiBNRi5nZXRNTUkoKS5oYXNEZWJ1Z0luZm8oKSB8fCAhTUYuZ2V0RnVuY3Rpb24oKS0+ZG9lc05vdFRocm93KCkgfHwKKyAgICAgICAgICBVbndpbmRUYWJsZXNNYW5kYXRvcnk7Cit9CisKK2NvbnN0IHVuc2lnbmVkKiBYQ29yZVJlZ2lzdGVySW5mbzo6Z2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ2FsbGVlU2F2ZWRSZWdzW10gPSB7CisgICAgWENvcmU6OlI0LCBYQ29yZTo6UjUsIFhDb3JlOjpSNiwgWENvcmU6OlI3LAorICAgIFhDb3JlOjpSOCwgWENvcmU6OlI5LCBYQ29yZTo6UjEwLCBYQ29yZTo6TFIsCisgICAgMAorICB9OworICByZXR1cm4gQ2FsbGVlU2F2ZWRSZWdzOworfQorCitCaXRWZWN0b3IgWENvcmVSZWdpc3RlckluZm86OmdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIEJpdFZlY3RvciBSZXNlcnZlZChnZXROdW1SZWdzKCkpOworICBSZXNlcnZlZC5zZXQoWENvcmU6OkNQKTsKKyAgUmVzZXJ2ZWQuc2V0KFhDb3JlOjpEUCk7CisgIFJlc2VydmVkLnNldChYQ29yZTo6U1ApOworICBSZXNlcnZlZC5zZXQoWENvcmU6OkxSKTsKKyAgaWYgKGhhc0ZQKE1GKSkgeworICAgIFJlc2VydmVkLnNldChYQ29yZTo6UjEwKTsKKyAgfQorICByZXR1cm4gUmVzZXJ2ZWQ7Cit9CisKK2Jvb2wKK1hDb3JlUmVnaXN0ZXJJbmZvOjpyZXF1aXJlc1JlZ2lzdGVyU2NhdmVuZ2luZyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIC8vIFRPRE8gY2FuIHdlIGVzdGltYXRlIHN0YWNrIHNpemU/CisgIHJldHVybiBoYXNGUChNRik7Cit9CisKK2Jvb2wgWENvcmVSZWdpc3RlckluZm86Omhhc0ZQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgcmV0dXJuIERpc2FibGVGcmFtZVBvaW50ZXJFbGltKE1GKSB8fCBNRi5nZXRGcmFtZUluZm8oKS0+aGFzVmFyU2l6ZWRPYmplY3RzKCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gZWxpbWluYXRlcyBBREpDQUxMU1RBQ0tET1dOLAorLy8gQURKQ0FMTFNUQUNLVVAgcHNldWRvIGluc3RydWN0aW9ucwordm9pZCBYQ29yZVJlZ2lzdGVySW5mbzo6CitlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIGNvbnN0IHsKKyAgaWYgKCFoYXNSZXNlcnZlZENhbGxGcmFtZShNRikpIHsKKyAgICAvLyBUdXJuIHRoZSBhZGpjYWxsc3RhY2tkb3duIGluc3RydWN0aW9uIGludG8gJ2V4dHNwIDxhbXQ+JyBhbmQgdGhlCisgICAgLy8gYWRqY2FsbHN0YWNrdXAgaW5zdHJ1Y3Rpb24gaW50byAnbGRhdyBzcCwgc3BbPGFtdD5dJworICAgIE1hY2hpbmVJbnN0ciAqT2xkID0gSTsKKyAgICB1aW50NjRfdCBBbW91bnQgPSBPbGQtPmdldE9wZXJhbmQoMCkuZ2V0SW1tKCk7CisgICAgaWYgKEFtb3VudCAhPSAwKSB7CisgICAgICAvLyBXZSBuZWVkIHRvIGtlZXAgdGhlIHN0YWNrIGFsaWduZWQgcHJvcGVybHkuICBUbyBkbyB0aGlzLCB3ZSByb3VuZCB0aGUKKyAgICAgIC8vIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRoZSBvdXRnb2luZyBhcmd1bWVudHMgdXAgdG8gdGhlIG5leHQKKyAgICAgIC8vIGFsaWdubWVudCBib3VuZGFyeS4KKyAgICAgIHVuc2lnbmVkIEFsaWduID0gTUYuZ2V0VGFyZ2V0KCkuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrQWxpZ25tZW50KCk7CisgICAgICBBbW91bnQgPSAoQW1vdW50K0FsaWduLTEpL0FsaWduKkFsaWduOworCisgICAgICBhc3NlcnQoQW1vdW50JTQgPT0gMCk7CisgICAgICBBbW91bnQgLz0gNDsKKyAgICAgIAorICAgICAgYm9vbCBpc1U2ID0gaXNJbW1VNihBbW91bnQpOworICAgICAgCisgICAgICBpZiAoIWlzVTYgJiYgIWlzSW1tVTE2KEFtb3VudCkpIHsKKyAgICAgICAgLy8gRklYIGNvdWxkIGVtaXQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgY2FzZS4KKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIGVycnMoKSA8PCAiZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIgc2l6ZSB0b28gYmlnOiAiCisgICAgICAgICAgICAgICA8PCBBbW91bnQgPDwgIlxuIjsKKyNlbmRpZgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKDApOworICAgICAgfQorCisgICAgICBNYWNoaW5lSW5zdHIgKk5ldzsKKyAgICAgIGlmIChPbGQtPmdldE9wY29kZSgpID09IFhDb3JlOjpBREpDQUxMU1RBQ0tET1dOKSB7CisgICAgICAgIGludCBPcGNvZGUgPSBpc1U2ID8gWENvcmU6OkVYVFNQX3U2IDogWENvcmU6OkVYVFNQX2x1NjsKKyAgICAgICAgTmV3PUJ1aWxkTUkoTUYsIE9sZC0+Z2V0RGVidWdMb2MoKSwgVElJLmdldChPcGNvZGUpKQorICAgICAgICAgIC5hZGRJbW0oQW1vdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChPbGQtPmdldE9wY29kZSgpID09IFhDb3JlOjpBREpDQUxMU1RBQ0tVUCk7CisgICAgICAgIGludCBPcGNvZGUgPSBpc1U2ID8gWENvcmU6OkxEQVdTUF9ydTZfUlJlZ3MgOiBYQ29yZTo6TERBV1NQX2xydTZfUlJlZ3M7CisgICAgICAgIE5ldz1CdWlsZE1JKE1GLCBPbGQtPmdldERlYnVnTG9jKCksIFRJSS5nZXQoT3Bjb2RlKSwgWENvcmU6OlNQKQorICAgICAgICAgIC5hZGRJbW0oQW1vdW50KTsKKyAgICAgIH0KKworICAgICAgLy8gUmVwbGFjZSB0aGUgcHNldWRvIGluc3RydWN0aW9uIHdpdGggYSBuZXcgaW5zdHJ1Y3Rpb24uLi4KKyAgICAgIE1CQi5pbnNlcnQoSSwgTmV3KTsKKyAgICB9CisgIH0KKyAgCisgIE1CQi5lcmFzZShJKTsKK30KKwordW5zaWduZWQKK1hDb3JlUmVnaXN0ZXJJbmZvOjplbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUEFkaiwgRnJhbWVJbmRleFZhbHVlICpWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMpIGNvbnN0IHsKKyAgYXNzZXJ0KFNQQWRqID09IDAgJiYgIlVuZXhwZWN0ZWQiKTsKKyAgTWFjaGluZUluc3RyICZNSSA9ICpJSTsKKyAgRGVidWdMb2MgZGwgPSBNSS5nZXREZWJ1Z0xvYygpOworICB1bnNpZ25lZCBpID0gMDsKKworICB3aGlsZSAoIU1JLmdldE9wZXJhbmQoaSkuaXNGSSgpKSB7CisgICAgKytpOworICAgIGFzc2VydChpIDwgTUkuZ2V0TnVtT3BlcmFuZHMoKSAmJiAiSW5zdHIgZG9lc24ndCBoYXZlIEZyYW1lSW5kZXggb3BlcmFuZCEiKTsKKyAgfQorCisgIE1hY2hpbmVPcGVyYW5kICZGcmFtZU9wID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgaW50IEZyYW1lSW5kZXggPSBGcmFtZU9wLmdldEluZGV4KCk7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpNSS5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgIGludCBPZmZzZXQgPSBNRi5nZXRGcmFtZUluZm8oKS0+Z2V0T2JqZWN0T2Zmc2V0KEZyYW1lSW5kZXgpOworICBpbnQgU3RhY2tTaXplID0gTUYuZ2V0RnJhbWVJbmZvKCktPmdldFN0YWNrU2l6ZSgpOworCisgICNpZm5kZWYgTkRFQlVHCisgIERFQlVHKGVycnMoKSA8PCAiXG5GdW5jdGlvbiAgICAgICAgIDogIiAKKyAgICAgICAgPDwgTUYuZ2V0RnVuY3Rpb24oKS0+Z2V0TmFtZSgpIDw8ICJcbiIpOworICBERUJVRyhlcnJzKCkgPDwgIjwtLS0tLS0tLS0+XG4iKTsKKyAgREVCVUcoTUkucHJpbnQoZXJycygpKSk7CisgIERFQlVHKGVycnMoKSA8PCAiRnJhbWVJbmRleCAgICAgICAgIDogIiA8PCBGcmFtZUluZGV4IDw8ICJcbiIpOworICBERUJVRyhlcnJzKCkgPDwgIkZyYW1lT2Zmc2V0ICAgICAgICA6ICIgPDwgT2Zmc2V0IDw8ICJcbiIpOworICBERUJVRyhlcnJzKCkgPDwgIlN0YWNrU2l6ZSAgICAgICAgICA6ICIgPDwgU3RhY2tTaXplIDw8ICJcbiIpOworICAjZW5kaWYKKworICBPZmZzZXQgKz0gU3RhY2tTaXplOworICAKKyAgLy8gZm9sZCBjb25zdGFudCBpbnRvIG9mZnNldC4KKyAgT2Zmc2V0ICs9IE1JLmdldE9wZXJhbmQoaSArIDEpLmdldEltbSgpOworICBNSS5nZXRPcGVyYW5kKGkgKyAxKS5DaGFuZ2VUb0ltbWVkaWF0ZSgwKTsKKyAgCisgIGFzc2VydChPZmZzZXQlNCA9PSAwICYmICJNaXNhbGlnbmVkIHN0YWNrIG9mZnNldCIpOworCisgIERFQlVHKGVycnMoKSA8PCAiT2Zmc2V0ICAgICAgICAgICAgIDogIiA8PCBPZmZzZXQgPDwgIlxuIiA8PCAiPC0tLS0tLS0tLT5cbiIpOworICAKKyAgT2Zmc2V0Lz00OworICAKKyAgYm9vbCBGUCA9IGhhc0ZQKE1GKTsKKyAgCisgIHVuc2lnbmVkIFJlZyA9IE1JLmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIGJvb2wgaXNLaWxsID0gTUkuZ2V0T3Bjb2RlKCkgPT0gWENvcmU6OlNUV0ZJICYmIE1JLmdldE9wZXJhbmQoMCkuaXNLaWxsKCk7CisKKyAgYXNzZXJ0KFhDb3JlOjpHUlJlZ3NSZWdpc3RlckNsYXNzLT5jb250YWlucyhSZWcpICYmCisgICAgICAgICAiVW5leHBlY3RlZCByZWdpc3RlciBvcGVyYW5kIik7CisgIAorICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCID0gKk1JLmdldFBhcmVudCgpOworICAKKyAgaWYgKEZQKSB7CisgICAgYm9vbCBpc1VzID0gaXNJbW1VcyhPZmZzZXQpOworICAgIHVuc2lnbmVkIEZyYW1lUHRyID0gWENvcmU6OlIxMDsKKyAgICAKKyAgICBpZiAoIWlzVXMpIHsKKyAgICAgIGlmICghUlMpCisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiZWxpbWluYXRlRnJhbWVJbmRleCBGcmFtZSBzaXplIHRvbyBiaWc6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoT2Zmc2V0KSk7CisgICAgICB1bnNpZ25lZCBTY3JhdGNoUmVnID0gUlMtPnNjYXZlbmdlUmVnaXN0ZXIoWENvcmU6OkdSUmVnc1JlZ2lzdGVyQ2xhc3MsIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQWRqKTsKKyAgICAgIGxvYWRDb25zdGFudChNQkIsIElJLCBTY3JhdGNoUmVnLCBPZmZzZXQsIGRsKTsKKyAgICAgIHN3aXRjaCAoTUkuZ2V0T3Bjb2RlKCkpIHsKKyAgICAgIGNhc2UgWENvcmU6OkxEV0ZJOgorICAgICAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KFhDb3JlOjpMRFdfM3IpLCBSZWcpCisgICAgICAgICAgICAgIC5hZGRSZWcoRnJhbWVQdHIpCisgICAgICAgICAgICAgIC5hZGRSZWcoU2NyYXRjaFJlZywgUmVnU3RhdGU6OktpbGwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWENvcmU6OlNUV0ZJOgorICAgICAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KFhDb3JlOjpTVFdfM3IpKQorICAgICAgICAgICAgICAuYWRkUmVnKFJlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpCisgICAgICAgICAgICAgIC5hZGRSZWcoRnJhbWVQdHIpCisgICAgICAgICAgICAgIC5hZGRSZWcoU2NyYXRjaFJlZywgUmVnU3RhdGU6OktpbGwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWENvcmU6OkxEQVdGSToKKyAgICAgICAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChYQ29yZTo6TERBV0ZfbDNyKSwgUmVnKQorICAgICAgICAgICAgICAuYWRkUmVnKEZyYW1lUHRyKQorICAgICAgICAgICAgICAuYWRkUmVnKFNjcmF0Y2hSZWcsIFJlZ1N0YXRlOjpLaWxsKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIE9wY29kZSIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKE1JLmdldE9wY29kZSgpKSB7CisgICAgICBjYXNlIFhDb3JlOjpMRFdGSToKKyAgICAgICAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChYQ29yZTo6TERXXzJydXMpLCBSZWcpCisgICAgICAgICAgICAgIC5hZGRSZWcoRnJhbWVQdHIpCisgICAgICAgICAgICAgIC5hZGRJbW0oT2Zmc2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhDb3JlOjpTVFdGSToKKyAgICAgICAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChYQ29yZTo6U1RXXzJydXMpKQorICAgICAgICAgICAgICAuYWRkUmVnKFJlZywgZ2V0S2lsbFJlZ1N0YXRlKGlzS2lsbCkpCisgICAgICAgICAgICAgIC5hZGRSZWcoRnJhbWVQdHIpCisgICAgICAgICAgICAgIC5hZGRJbW0oT2Zmc2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhDb3JlOjpMREFXRkk6CisgICAgICAgIEJ1aWxkTUkoTUJCLCBJSSwgZGwsIFRJSS5nZXQoWENvcmU6OkxEQVdGX2wycnVzKSwgUmVnKQorICAgICAgICAgICAgICAuYWRkUmVnKEZyYW1lUHRyKQorICAgICAgICAgICAgICAuYWRkSW1tKE9mZnNldCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBPcGNvZGUiKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgYm9vbCBpc1U2ID0gaXNJbW1VNihPZmZzZXQpOworICAgIGlmICghaXNVNiAmJiAhaXNJbW1VMTYoT2Zmc2V0KSkKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiZWxpbWluYXRlRnJhbWVJbmRleCBGcmFtZSBzaXplIHRvbyBiaWc6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKE9mZnNldCkpOworCisgICAgc3dpdGNoIChNSS5nZXRPcGNvZGUoKSkgeworICAgIGludCBOZXdPcGNvZGU7CisgICAgY2FzZSBYQ29yZTo6TERXRkk6CisgICAgICBOZXdPcGNvZGUgPSAoaXNVNikgPyBYQ29yZTo6TERXU1BfcnU2IDogWENvcmU6OkxEV1NQX2xydTY7CisgICAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KE5ld09wY29kZSksIFJlZykKKyAgICAgICAgICAgIC5hZGRJbW0oT2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWENvcmU6OlNUV0ZJOgorICAgICAgTmV3T3Bjb2RlID0gKGlzVTYpID8gWENvcmU6OlNUV1NQX3J1NiA6IFhDb3JlOjpTVFdTUF9scnU2OworICAgICAgQnVpbGRNSShNQkIsIElJLCBkbCwgVElJLmdldChOZXdPcGNvZGUpKQorICAgICAgICAgICAgLmFkZFJlZyhSZWcsIGdldEtpbGxSZWdTdGF0ZShpc0tpbGwpKQorICAgICAgICAgICAgLmFkZEltbShPZmZzZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYQ29yZTo6TERBV0ZJOgorICAgICAgTmV3T3Bjb2RlID0gKGlzVTYpID8gWENvcmU6OkxEQVdTUF9ydTYgOiBYQ29yZTo6TERBV1NQX2xydTY7CisgICAgICBCdWlsZE1JKE1CQiwgSUksIGRsLCBUSUkuZ2V0KE5ld09wY29kZSksIFJlZykKKyAgICAgICAgICAgIC5hZGRJbW0oT2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIE9wY29kZSIpOworICAgIH0KKyAgfQorICAvLyBFcmFzZSBvbGQgaW5zdHJ1Y3Rpb24uCisgIE1CQi5lcmFzZShJSSk7CisgIHJldHVybiAwOworfQorCit2b2lkCitYQ29yZVJlZ2lzdGVySW5mbzo6cHJvY2Vzc0Z1bmN0aW9uQmVmb3JlQ2FsbGVlU2F2ZWRTY2FuKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTKSBjb25zdCB7CisgIE1hY2hpbmVGcmFtZUluZm8gKk1GSSA9IE1GLmdldEZyYW1lSW5mbygpOworICBib29sIExSVXNlZCA9IE1GLmdldFJlZ0luZm8oKS5pc1BoeXNSZWdVc2VkKFhDb3JlOjpMUik7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gWENvcmU6OkdSUmVnc1JlZ2lzdGVyQ2xhc3M7CisgIFhDb3JlRnVuY3Rpb25JbmZvICpYRkkgPSBNRi5nZXRJbmZvPFhDb3JlRnVuY3Rpb25JbmZvPigpOworICBpZiAoTFJVc2VkKSB7CisgICAgTUYuZ2V0UmVnSW5mbygpLnNldFBoeXNSZWdVbnVzZWQoWENvcmU6OkxSKTsKKyAgICAKKyAgICBib29sIGlzVmFyQXJnID0gTUYuZ2V0RnVuY3Rpb24oKS0+aXNWYXJBcmcoKTsKKyAgICBpbnQgRnJhbWVJZHg7CisgICAgaWYgKCEgaXNWYXJBcmcpIHsKKyAgICAgIC8vIEEgZml4ZWQgb2Zmc2V0IG9mIDAgYWxsb3dzIHVzIHRvIHNhdmUgLyByZXN0b3JlIExSIHVzaW5nIGVudHNwIC8gcmV0c3AuCisgICAgICBGcmFtZUlkeCA9IE1GSS0+Q3JlYXRlRml4ZWRPYmplY3QoUkMtPmdldFNpemUoKSwgMCwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZyYW1lSWR4ID0gTUZJLT5DcmVhdGVTdGFja09iamVjdChSQy0+Z2V0U2l6ZSgpLCBSQy0+Z2V0QWxpZ25tZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIH0KKyAgICBYRkktPnNldFVzZXNMUihGcmFtZUlkeCk7CisgICAgWEZJLT5zZXRMUlNwaWxsU2xvdChGcmFtZUlkeCk7CisgIH0KKyAgaWYgKHJlcXVpcmVzUmVnaXN0ZXJTY2F2ZW5naW5nKE1GKSkgeworICAgIC8vIFJlc2VydmUgYSBzbG90IGNsb3NlIHRvIFNQIG9yIGZyYW1lIHBvaW50ZXIuCisgICAgUlMtPnNldFNjYXZlbmdpbmdGcmFtZUluZGV4KE1GSS0+Q3JlYXRlU3RhY2tPYmplY3QoUkMtPmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQy0+Z2V0QWxpZ25tZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKTsKKyAgfQorICBpZiAoaGFzRlAoTUYpKSB7CisgICAgLy8gQSBjYWxsZWUgc2F2ZSByZWdpc3RlciBpcyB1c2VkIHRvIGhvbGQgdGhlIEZQLgorICAgIC8vIFRoaXMgbmVlZHMgc2F2aW5nIC8gcmVzdG9yaW5nIGluIHRoZSBlcGlsb2d1ZSAvIHByb2xvZ3VlLgorICAgIFhGSS0+c2V0RlBTcGlsbFNsb3QoTUZJLT5DcmVhdGVTdGFja09iamVjdChSQy0+Z2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQy0+Z2V0QWxpZ25tZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisgIH0KK30KKwordm9pZCBYQ29yZVJlZ2lzdGVySW5mbzo6Citwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZChNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgIAorfQorCit2b2lkIFhDb3JlUmVnaXN0ZXJJbmZvOjoKK2xvYWRDb25zdGFudChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgIHVuc2lnbmVkIERzdFJlZywgaW50NjRfdCBWYWx1ZSwgRGVidWdMb2MgZGwpIGNvbnN0IHsKKyAgLy8gVE9ETyB1c2UgbWttc2sgaWYgcG9zc2libGUuCisgIGlmICghaXNJbW1VMTYoVmFsdWUpKSB7CisgICAgLy8gVE9ETyB1c2UgY29uc3RhbnQgcG9vbC4KKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoImxvYWRDb25zdGFudCB2YWx1ZSB0b28gYmlnICIgKyBUd2luZShWYWx1ZSkpOworICB9CisgIGludCBPcGNvZGUgPSBpc0ltbVU2KFZhbHVlKSA/IFhDb3JlOjpMRENfcnU2IDogWENvcmU6OkxEQ19scnU2OworICBCdWlsZE1JKE1CQiwgSSwgZGwsIFRJSS5nZXQoT3Bjb2RlKSwgRHN0UmVnKS5hZGRJbW0oVmFsdWUpOworfQorCit2b2lkIFhDb3JlUmVnaXN0ZXJJbmZvOjoKK3N0b3JlVG9TdGFjayhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgaW50IE9mZnNldCwgRGVidWdMb2MgZGwpIGNvbnN0IHsKKyAgYXNzZXJ0KE9mZnNldCU0ID09IDAgJiYgIk1pc2FsaWduZWQgc3RhY2sgb2Zmc2V0Iik7CisgIE9mZnNldC89NDsKKyAgYm9vbCBpc1U2ID0gaXNJbW1VNihPZmZzZXQpOworICBpZiAoIWlzVTYgJiYgIWlzSW1tVTE2KE9mZnNldCkpCisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJzdG9yZVRvU3RhY2sgb2Zmc2V0IHRvbyBiaWcgIiArIFR3aW5lKE9mZnNldCkpOworICBpbnQgT3Bjb2RlID0gaXNVNiA/IFhDb3JlOjpTVFdTUF9ydTYgOiBYQ29yZTo6U1RXU1BfbHJ1NjsKKyAgQnVpbGRNSShNQkIsIEksIGRsLCBUSUkuZ2V0KE9wY29kZSkpCisgICAgLmFkZFJlZyhTcmNSZWcpCisgICAgLmFkZEltbShPZmZzZXQpOworfQorCit2b2lkIFhDb3JlUmVnaXN0ZXJJbmZvOjoKK2xvYWRGcm9tU3RhY2soTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEc3RSZWcsIGludCBPZmZzZXQsIERlYnVnTG9jIGRsKSBjb25zdCB7CisgIGFzc2VydChPZmZzZXQlNCA9PSAwICYmICJNaXNhbGlnbmVkIHN0YWNrIG9mZnNldCIpOworICBPZmZzZXQvPTQ7CisgIGJvb2wgaXNVNiA9IGlzSW1tVTYoT2Zmc2V0KTsKKyAgaWYgKCFpc1U2ICYmICFpc0ltbVUxNihPZmZzZXQpKQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigibG9hZEZyb21TdGFjayBvZmZzZXQgdG9vIGJpZyAiICsgVHdpbmUoT2Zmc2V0KSk7CisgIGludCBPcGNvZGUgPSBpc1U2ID8gWENvcmU6OkxEV1NQX3J1NiA6IFhDb3JlOjpMRFdTUF9scnU2OworICBCdWlsZE1JKE1CQiwgSSwgZGwsIFRJSS5nZXQoT3Bjb2RlKSwgRHN0UmVnKQorICAgIC5hZGRJbW0oT2Zmc2V0KTsKK30KKwordm9pZCBYQ29yZVJlZ2lzdGVySW5mbzo6ZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiA9IE1GLmZyb250KCk7ICAgLy8gUHJvbG9nIGdvZXMgaW4gZW50cnkgQkIKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkgPSBNQkIuYmVnaW4oKTsKKyAgTWFjaGluZUZyYW1lSW5mbyAqTUZJID0gTUYuZ2V0RnJhbWVJbmZvKCk7CisgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUkgPSAmTUYuZ2V0TU1JKCk7CisgIFhDb3JlRnVuY3Rpb25JbmZvICpYRkkgPSBNRi5nZXRJbmZvPFhDb3JlRnVuY3Rpb25JbmZvPigpOworICBEZWJ1Z0xvYyBkbCA9IE1CQkkgIT0gTUJCLmVuZCgpID8gTUJCSS0+Z2V0RGVidWdMb2MoKSA6IERlYnVnTG9jKCk7CisKKyAgYm9vbCBGUCA9IGhhc0ZQKE1GKTsKKworICAvLyBXb3JrIG91dCBmcmFtZSBzaXplcy4KKyAgaW50IEZyYW1lU2l6ZSA9IE1GSS0+Z2V0U3RhY2tTaXplKCk7CisKKyAgYXNzZXJ0KEZyYW1lU2l6ZSU0ID09IDAgJiYgIk1pc2FsaWduZWQgZnJhbWUgc2l6ZSIpOworICAKKyAgRnJhbWVTaXplLz00OworICAKKyAgYm9vbCBpc1U2ID0gaXNJbW1VNihGcmFtZVNpemUpOworCisgIGlmICghaXNVNiAmJiAhaXNJbW1VMTYoRnJhbWVTaXplKSkgeworICAgIC8vIEZJWE1FIGNvdWxkIGVtaXQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zLgorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiZW1pdFByb2xvZ3VlIEZyYW1lIHNpemUgdG9vIGJpZzogIiArIFR3aW5lKEZyYW1lU2l6ZSkpOworICB9CisgIGJvb2wgZW1pdEZyYW1lTW92ZXMgPSBuZWVkc0ZyYW1lTW92ZXMoTUYpOworCisgIC8vIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrPworICBpZiAoRnJhbWVTaXplKSB7CisgICAgYm9vbCBzYXZlTFIgPSBYRkktPmdldFVzZXNMUigpOworICAgIGJvb2wgTFJTYXZlZE9uRW50cnkgPSBmYWxzZTsKKyAgICBpbnQgT3Bjb2RlOworICAgIGlmIChzYXZlTFIgJiYgKE1GSS0+Z2V0T2JqZWN0T2Zmc2V0KFhGSS0+Z2V0TFJTcGlsbFNsb3QoKSkgPT0gMCkpIHsKKyAgICAgIE9wY29kZSA9IChpc1U2KSA/IFhDb3JlOjpFTlRTUF91NiA6IFhDb3JlOjpFTlRTUF9sdTY7CisgICAgICBNQkIuYWRkTGl2ZUluKFhDb3JlOjpMUik7CisgICAgICBzYXZlTFIgPSBmYWxzZTsKKyAgICAgIExSU2F2ZWRPbkVudHJ5ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgT3Bjb2RlID0gKGlzVTYpID8gWENvcmU6OkVYVFNQX3U2IDogWENvcmU6OkVYVFNQX2x1NjsKKyAgICB9CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KE9wY29kZSkpLmFkZEltbShGcmFtZVNpemUpOworICAgIAorICAgIGlmIChlbWl0RnJhbWVNb3ZlcykgeworICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+ICZNb3ZlcyA9IE1NSS0+Z2V0RnJhbWVNb3ZlcygpOworICAgICAgCisgICAgICAvLyBTaG93IHVwZGF0ZSBvZiBTUC4KKyAgICAgIE1DU3ltYm9sICpGcmFtZUxhYmVsID0gTU1JLT5nZXRDb250ZXh0KCkuQ3JlYXRlVGVtcFN5bWJvbCgpOworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFhDb3JlOjpQUk9MT0dfTEFCRUwpKS5hZGRTeW0oRnJhbWVMYWJlbCk7CisgICAgICAKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBTUERzdChNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCk7CisgICAgICBNYWNoaW5lTG9jYXRpb24gU1BTcmMoTWFjaGluZUxvY2F0aW9uOjpWaXJ0dWFsRlAsIC1GcmFtZVNpemUgKiA0KTsKKyAgICAgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZShGcmFtZUxhYmVsLCBTUERzdCwgU1BTcmMpKTsKKyAgICAgIAorICAgICAgaWYgKExSU2F2ZWRPbkVudHJ5KSB7CisgICAgICAgIE1hY2hpbmVMb2NhdGlvbiBDU0RzdChNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCwgMCk7CisgICAgICAgIE1hY2hpbmVMb2NhdGlvbiBDU1NyYyhYQ29yZTo6TFIpOworICAgICAgICBNb3Zlcy5wdXNoX2JhY2soTWFjaGluZU1vdmUoRnJhbWVMYWJlbCwgQ1NEc3QsIENTU3JjKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChzYXZlTFIpIHsKKyAgICAgIGludCBMUlNwaWxsT2Zmc2V0ID0gTUZJLT5nZXRPYmplY3RPZmZzZXQoWEZJLT5nZXRMUlNwaWxsU2xvdCgpKTsKKyAgICAgIHN0b3JlVG9TdGFjayhNQkIsIE1CQkksIFhDb3JlOjpMUiwgTFJTcGlsbE9mZnNldCArIEZyYW1lU2l6ZSo0LCBkbCk7CisgICAgICBNQkIuYWRkTGl2ZUluKFhDb3JlOjpMUik7CisgICAgICAKKyAgICAgIGlmIChlbWl0RnJhbWVNb3ZlcykgeworICAgICAgICBNQ1N5bWJvbCAqU2F2ZUxSTGFiZWwgPSBNTUktPmdldENvbnRleHQoKS5DcmVhdGVUZW1wU3ltYm9sKCk7CisgICAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChYQ29yZTo6UFJPTE9HX0xBQkVMKSkuYWRkU3ltKFNhdmVMUkxhYmVsKTsKKyAgICAgICAgTWFjaGluZUxvY2F0aW9uIENTRHN0KE1hY2hpbmVMb2NhdGlvbjo6VmlydHVhbEZQLCBMUlNwaWxsT2Zmc2V0KTsKKyAgICAgICAgTWFjaGluZUxvY2F0aW9uIENTU3JjKFhDb3JlOjpMUik7CisgICAgICAgIE1NSS0+Z2V0RnJhbWVNb3ZlcygpLnB1c2hfYmFjayhNYWNoaW5lTW92ZShTYXZlTFJMYWJlbCwgQ1NEc3QsIENTU3JjKSk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBpZiAoRlApIHsKKyAgICAvLyBTYXZlIFIxMCB0byB0aGUgc3RhY2suCisgICAgaW50IEZQU3BpbGxPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChYRkktPmdldEZQU3BpbGxTbG90KCkpOworICAgIHN0b3JlVG9TdGFjayhNQkIsIE1CQkksIFhDb3JlOjpSMTAsIEZQU3BpbGxPZmZzZXQgKyBGcmFtZVNpemUqNCwgZGwpOworICAgIC8vIFIxMCBpcyBsaXZlLWluLiBJdCBpcyBraWxsZWQgYXQgdGhlIHNwaWxsLgorICAgIE1CQi5hZGRMaXZlSW4oWENvcmU6OlIxMCk7CisgICAgaWYgKGVtaXRGcmFtZU1vdmVzKSB7CisgICAgICBNQ1N5bWJvbCAqU2F2ZVIxMExhYmVsID0gTU1JLT5nZXRDb250ZXh0KCkuQ3JlYXRlVGVtcFN5bWJvbCgpOworICAgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFhDb3JlOjpQUk9MT0dfTEFCRUwpKS5hZGRTeW0oU2F2ZVIxMExhYmVsKTsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBDU0RzdChNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCwgRlBTcGlsbE9mZnNldCk7CisgICAgICBNYWNoaW5lTG9jYXRpb24gQ1NTcmMoWENvcmU6OlIxMCk7CisgICAgICBNTUktPmdldEZyYW1lTW92ZXMoKS5wdXNoX2JhY2soTWFjaGluZU1vdmUoU2F2ZVIxMExhYmVsLCBDU0RzdCwgQ1NTcmMpKTsKKyAgICB9CisgICAgLy8gU2V0IHRoZSBGUCBmcm9tIHRoZSBTUC4KKyAgICB1bnNpZ25lZCBGcmFtZVB0ciA9IFhDb3JlOjpSMTA7CisgICAgQnVpbGRNSShNQkIsIE1CQkksIGRsLCBUSUkuZ2V0KFhDb3JlOjpMREFXU1BfcnU2KSwgRnJhbWVQdHIpCisgICAgICAuYWRkSW1tKDApOworICAgIGlmIChlbWl0RnJhbWVNb3ZlcykgeworICAgICAgLy8gU2hvdyBGUCBpcyBub3cgdmFsaWQuCisgICAgICBNQ1N5bWJvbCAqRnJhbWVMYWJlbCA9IE1NSS0+Z2V0Q29udGV4dCgpLkNyZWF0ZVRlbXBTeW1ib2woKTsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChYQ29yZTo6UFJPTE9HX0xBQkVMKSkuYWRkU3ltKEZyYW1lTGFiZWwpOworICAgICAgTWFjaGluZUxvY2F0aW9uIFNQRHN0KEZyYW1lUHRyKTsKKyAgICAgIE1hY2hpbmVMb2NhdGlvbiBTUFNyYyhNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCk7CisgICAgICBNTUktPmdldEZyYW1lTW92ZXMoKS5wdXNoX2JhY2soTWFjaGluZU1vdmUoRnJhbWVMYWJlbCwgU1BEc3QsIFNQU3JjKSk7CisgICAgfQorICB9CisgIAorICBpZiAoZW1pdEZyYW1lTW92ZXMpIHsKKyAgICAvLyBGcmFtZSBtb3ZlcyBmb3IgY2FsbGVlIHNhdmVkLgorICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVNb3ZlPiAmTW92ZXMgPSBNTUktPmdldEZyYW1lTW92ZXMoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8TUNTeW1ib2wqLCBDYWxsZWVTYXZlZEluZm8+ID4mU3BpbGxMYWJlbHMgPQorICAgICAgICBYRkktPmdldFNwaWxsTGFiZWxzKCk7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFNwaWxsTGFiZWxzLnNpemUoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIE1DU3ltYm9sICpTcGlsbExhYmVsID0gU3BpbGxMYWJlbHNbSV0uZmlyc3Q7CisgICAgICBDYWxsZWVTYXZlZEluZm8gJkNTSSA9IFNwaWxsTGFiZWxzW0ldLnNlY29uZDsKKyAgICAgIGludCBPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChDU0kuZ2V0RnJhbWVJZHgoKSk7CisgICAgICB1bnNpZ25lZCBSZWcgPSBDU0kuZ2V0UmVnKCk7CisgICAgICBNYWNoaW5lTG9jYXRpb24gQ1NEc3QoTWFjaGluZUxvY2F0aW9uOjpWaXJ0dWFsRlAsIE9mZnNldCk7CisgICAgICBNYWNoaW5lTG9jYXRpb24gQ1NTcmMoUmVnKTsKKyAgICAgIE1vdmVzLnB1c2hfYmFjayhNYWNoaW5lTW92ZShTcGlsbExhYmVsLCBDU0RzdCwgQ1NTcmMpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBYQ29yZVJlZ2lzdGVySW5mbzo6ZW1pdEVwaWxvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgeworICBNYWNoaW5lRnJhbWVJbmZvICpNRkkgICAgICAgICAgICA9IE1GLmdldEZyYW1lSW5mbygpOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSA9IHByaW9yKE1CQi5lbmQoKSk7CisgIERlYnVnTG9jIGRsID0gTUJCSS0+Z2V0RGVidWdMb2MoKTsKKyAgCisgIGJvb2wgRlAgPSBoYXNGUChNRik7CisgIAorICBpZiAoRlApIHsKKyAgICAvLyBSZXN0b3JlIHRoZSBzdGFjayBwb2ludGVyLgorICAgIHVuc2lnbmVkIEZyYW1lUHRyID0gWENvcmU6OlIxMDsKKyAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoWENvcmU6OlNFVFNQXzFyKSkKKyAgICAgIC5hZGRSZWcoRnJhbWVQdHIpOworICB9CisKKyAgLy8gV29yayBvdXQgZnJhbWUgc2l6ZXMuCisgIGludCBGcmFtZVNpemUgPSBNRkktPmdldFN0YWNrU2l6ZSgpOworCisgIGFzc2VydChGcmFtZVNpemUlNCA9PSAwICYmICJNaXNhbGlnbmVkIGZyYW1lIHNpemUiKTsKKworICBGcmFtZVNpemUvPTQ7CisgIAorICBib29sIGlzVTYgPSBpc0ltbVU2KEZyYW1lU2l6ZSk7CisKKyAgaWYgKCFpc1U2ICYmICFpc0ltbVUxNihGcmFtZVNpemUpKSB7CisgICAgLy8gRklYTUUgY291bGQgZW1pdCBtdWx0aXBsZSBpbnN0cnVjdGlvbnMuCisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJlbWl0RXBpbG9ndWUgRnJhbWUgc2l6ZSB0b28gYmlnOiAiICsgVHdpbmUoRnJhbWVTaXplKSk7CisgIH0KKworICBpZiAoRnJhbWVTaXplKSB7CisgICAgWENvcmVGdW5jdGlvbkluZm8gKlhGSSA9IE1GLmdldEluZm88WENvcmVGdW5jdGlvbkluZm8+KCk7CisgICAgCisgICAgaWYgKEZQKSB7CisgICAgICAvLyBSZXN0b3JlIFIxMAorICAgICAgaW50IEZQU3BpbGxPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChYRkktPmdldEZQU3BpbGxTbG90KCkpOworICAgICAgRlBTcGlsbE9mZnNldCArPSBGcmFtZVNpemUqNDsKKyAgICAgIGxvYWRGcm9tU3RhY2soTUJCLCBNQkJJLCBYQ29yZTo6UjEwLCBGUFNwaWxsT2Zmc2V0LCBkbCk7CisgICAgfQorICAgIGJvb2wgcmVzdG9yZUxSID0gWEZJLT5nZXRVc2VzTFIoKTsKKyAgICBpZiAocmVzdG9yZUxSICYmIE1GSS0+Z2V0T2JqZWN0T2Zmc2V0KFhGSS0+Z2V0TFJTcGlsbFNsb3QoKSkgIT0gMCkgeworICAgICAgaW50IExSU3BpbGxPZmZzZXQgPSBNRkktPmdldE9iamVjdE9mZnNldChYRkktPmdldExSU3BpbGxTbG90KCkpOworICAgICAgTFJTcGlsbE9mZnNldCArPSBGcmFtZVNpemUqNDsKKyAgICAgIGxvYWRGcm9tU3RhY2soTUJCLCBNQkJJLCBYQ29yZTo6TFIsIExSU3BpbGxPZmZzZXQsIGRsKTsKKyAgICAgIHJlc3RvcmVMUiA9IGZhbHNlOworICAgIH0KKyAgICBpZiAocmVzdG9yZUxSKSB7CisgICAgICAvLyBGb2xkIHByb2xvZ3VlIGludG8gcmV0dXJuIGluc3RydWN0aW9uCisgICAgICBhc3NlcnQoTUJCSS0+Z2V0T3Bjb2RlKCkgPT0gWENvcmU6OlJFVFNQX3U2CisgICAgICAgIHx8IE1CQkktPmdldE9wY29kZSgpID09IFhDb3JlOjpSRVRTUF9sdTYpOworICAgICAgaW50IE9wY29kZSA9IChpc1U2KSA/IFhDb3JlOjpSRVRTUF91NiA6IFhDb3JlOjpSRVRTUF9sdTY7CisgICAgICBCdWlsZE1JKE1CQiwgTUJCSSwgZGwsIFRJSS5nZXQoT3Bjb2RlKSkuYWRkSW1tKEZyYW1lU2l6ZSk7CisgICAgICBNQkIuZXJhc2UoTUJCSSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBPcGNvZGUgPSAoaXNVNikgPyBYQ29yZTo6TERBV1NQX3J1Nl9SUmVncyA6IFhDb3JlOjpMREFXU1BfbHJ1Nl9SUmVnczsKKyAgICAgIEJ1aWxkTUkoTUJCLCBNQkJJLCBkbCwgVElJLmdldChPcGNvZGUpLCBYQ29yZTo6U1ApLmFkZEltbShGcmFtZVNpemUpOworICAgIH0KKyAgfQorfQorCitpbnQgWENvcmVSZWdpc3RlckluZm86OmdldER3YXJmUmVnTnVtKHVuc2lnbmVkIFJlZ051bSwgYm9vbCBpc0VIKSBjb25zdCB7CisgIHJldHVybiBYQ29yZUdlblJlZ2lzdGVySW5mbzo6Z2V0RHdhcmZSZWdOdW1GdWxsKFJlZ051bSwgMCk7Cit9CisKK3Vuc2lnbmVkIFhDb3JlUmVnaXN0ZXJJbmZvOjpnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgYm9vbCBGUCA9IGhhc0ZQKE1GKTsKKyAgCisgIHJldHVybiBGUCA/IFhDb3JlOjpSMTAgOiBYQ29yZTo6U1A7Cit9CisKK3Vuc2lnbmVkIFhDb3JlUmVnaXN0ZXJJbmZvOjpnZXRSQVJlZ2lzdGVyKCkgY29uc3QgeworICByZXR1cm4gWENvcmU6OkxSOworfQorCit2b2lkIFhDb3JlUmVnaXN0ZXJJbmZvOjpnZXRJbml0aWFsRnJhbWVTdGF0ZShzdGQ6OnZlY3RvcjxNYWNoaW5lTW92ZT4gJk1vdmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKKyAgLy8gSW5pdGlhbCBzdGF0ZSBvZiB0aGUgZnJhbWUgcG9pbnRlciBpcyBTUC4KKyAgTWFjaGluZUxvY2F0aW9uIERzdChNYWNoaW5lTG9jYXRpb246OlZpcnR1YWxGUCk7CisgIE1hY2hpbmVMb2NhdGlvbiBTcmMoWENvcmU6OlNQLCAwKTsKKyAgTW92ZXMucHVzaF9iYWNrKE1hY2hpbmVNb3ZlKDAsIERzdCwgU3JjKSk7Cit9CisKKyNpbmNsdWRlICJYQ29yZUdlblJlZ2lzdGVySW5mby5pbmMiCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVSZWdpc3RlckluZm8uaCBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVSZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjEzMmJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVJlZ2lzdGVySW5mby5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vPT09LSBYQ29yZVJlZ2lzdGVySW5mby5oIC0gWENvcmUgUmVnaXN0ZXIgSW5mb3JtYXRpb24gSW1wbCAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBYQ29yZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTVJlZ2lzdGVySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFhDT1JFUkVHSVNURVJJTkZPX0gKKyNkZWZpbmUgWENPUkVSRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAiWENvcmVHZW5SZWdpc3RlckluZm8uaC5pbmMiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworCitzdHJ1Y3QgWENvcmVSZWdpc3RlckluZm8gOiBwdWJsaWMgWENvcmVHZW5SZWdpc3RlckluZm8geworcHJpdmF0ZToKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUk7CisKKyAgdm9pZCBsb2FkQ29uc3RhbnQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRHN0UmVnLCBpbnQ2NF90IFZhbHVlLCBEZWJ1Z0xvYyBkbCkgY29uc3Q7CisKKyAgdm9pZCBzdG9yZVRvU3RhY2soTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBpbnQgT2Zmc2V0LCBEZWJ1Z0xvYyBkbCkgY29uc3Q7CisKKyAgdm9pZCBsb2FkRnJvbVN0YWNrKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdFJlZywgaW50IE9mZnNldCwgRGVidWdMb2MgZGwpIGNvbnN0OworCitwdWJsaWM6CisgIFhDb3JlUmVnaXN0ZXJJbmZvKGNvbnN0IFRhcmdldEluc3RySW5mbyAmdGlpKTsKKworICAvLy8gQ29kZSBHZW5lcmF0aW9uIHZpcnR1YWwgbWV0aG9kcy4uLgorCisgIGNvbnN0IHVuc2lnbmVkICpnZXRDYWxsZWVTYXZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IDApIGNvbnN0OworCisgIEJpdFZlY3RvciBnZXRSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIAorICBib29sIHJlcXVpcmVzUmVnaXN0ZXJTY2F2ZW5naW5nKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIGJvb2wgaGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgdm9pZCBlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIGNvbnN0OworCisgIHVuc2lnbmVkIGVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTUEFkaiwgRnJhbWVJbmRleFZhbHVlICpWYWx1ZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IE5VTEwpIGNvbnN0OworCisgIHZvaWQgcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlQ2FsbGVlU2F2ZWRTY2FuKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gTlVMTCkgY29uc3Q7CisKKyAgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZChNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICB2b2lkIGVtaXRQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKyAgdm9pZCBlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisgIAorICAvLyBEZWJ1ZyBpbmZvcm1hdGlvbiBxdWVyaWVzLgorICB1bnNpZ25lZCBnZXRSQVJlZ2lzdGVyKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIHZvaWQgZ2V0SW5pdGlhbEZyYW1lU3RhdGUoc3RkOjp2ZWN0b3I8TWFjaGluZU1vdmU+ICZNb3ZlcykgY29uc3Q7CisKKyAgLy8hIFJldHVybiB0aGUgYXJyYXkgb2YgYXJndW1lbnQgcGFzc2luZyByZWdpc3RlcnMKKyAgLyohCisgICAgXG5vdGUgVGhlIHNpemUgb2YgdGhpcyBhcnJheSBpcyByZXR1cm5lZCBieSBnZXRBcmdSZWdzU2l6ZSgpLgorICAgICovCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCAqZ2V0QXJnUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gMCk7CisKKyAgLy8hIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnQgcGFzc2luZyByZWdpc3RlciBhcnJheQorICBzdGF0aWMgdW5zaWduZWQgZ2V0TnVtQXJnUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gMCk7CisgIAorICAvLyEgUmV0dXJuIHdoZXRoZXIgdG8gZW1pdCBmcmFtZSBtb3ZlcworICBzdGF0aWMgYm9vbCBuZWVkc0ZyYW1lTW92ZXMoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgLy8hIEdldCBEV0FSRiBkZWJ1Z2dpbmcgcmVnaXN0ZXIgbnVtYmVyCisgIGludCBnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVSZWdpc3RlckluZm8udGQgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlUmVnaXN0ZXJJbmZvLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGFmNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlUmVnaXN0ZXJJbmZvLnRkCkBAIC0wLDAgKzEsOTEgQEAKKy8vPT09LSBYQ29yZVJlZ2lzdGVySW5mby50ZCAtIFhDb3JlIFJlZ2lzdGVyIGRlZnMgLS0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRGVjbGFyYXRpb25zIHRoYXQgZGVzY3JpYmUgdGhlIFhDb3JlIHJlZ2lzdGVyIGZpbGUgCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBYQ29yZVJlZzxzdHJpbmcgbj4gOiBSZWdpc3RlcjxuPiB7CisgIGZpZWxkIGJpdHM8ND4gTnVtOworICBsZXQgTmFtZXNwYWNlID0gIlhDb3JlIjsKK30KKworLy8gUmVnaXN0ZXJzIGFyZSBpZGVudGlmaWVkIHdpdGggNC1iaXQgSUQgbnVtYmVycy4KKy8vIFJpIC0gMzItYml0IGludGVnZXIgcmVnaXN0ZXJzCitjbGFzcyBSaTxiaXRzPDQ+IG51bSwgc3RyaW5nIG4+IDogWENvcmVSZWc8bj4geworICBsZXQgTnVtID0gbnVtOworfQorCisvLyBDUFUgcmVnaXN0ZXJzCitkZWYgUjAgIDogUmk8IDAsICJyMCI+LCBEd2FyZlJlZ051bTxbMF0+OworZGVmIFIxICA6IFJpPCAxLCAicjEiPiwgRHdhcmZSZWdOdW08WzFdPjsKK2RlZiBSMiAgOiBSaTwgMiwgInIyIj4sIER3YXJmUmVnTnVtPFsyXT47IAorZGVmIFIzICA6IFJpPCAzLCAicjMiPiwgRHdhcmZSZWdOdW08WzNdPjsKK2RlZiBSNCAgOiBSaTwgNCwgInI0Ij4sIER3YXJmUmVnTnVtPFs0XT47CitkZWYgUjUgIDogUmk8IDUsICJyNSI+LCBEd2FyZlJlZ051bTxbNV0+OyAKK2RlZiBSNiAgOiBSaTwgNiwgInI2Ij4sIER3YXJmUmVnTnVtPFs2XT47CitkZWYgUjcgIDogUmk8IDcsICJyNyI+LCBEd2FyZlJlZ051bTxbN10+OworZGVmIFI4ICA6IFJpPCA4LCAicjgiPiwgRHdhcmZSZWdOdW08WzhdPjsKK2RlZiBSOSAgOiBSaTwgOSwgInI5Ij4sIER3YXJmUmVnTnVtPFs5XT47IAorZGVmIFIxMCA6IFJpPDEwLCAicjEwIj4sIER3YXJmUmVnTnVtPFsxMF0+OworZGVmIFIxMSA6IFJpPDExLCAicjExIj4sIER3YXJmUmVnTnVtPFsxMV0+OworZGVmIENQIDogUmk8MTIsICJjcCI+LCBEd2FyZlJlZ051bTxbMTJdPjsgCitkZWYgRFAgOiBSaTwxMywgImRwIj4sIER3YXJmUmVnTnVtPFsxM10+OworZGVmIFNQIDogUmk8MTQsICJzcCI+LCBEd2FyZlJlZ051bTxbMTRdPjsKK2RlZiBMUiA6IFJpPDE1LCAibHIiPiwgRHdhcmZSZWdOdW08WzE1XT47CisKKy8vIFJlZ2lzdGVyIGNsYXNzZXMuCisvLworZGVmIEdSUmVncyA6IFJlZ2lzdGVyQ2xhc3M8IlhDb3JlIiwgW2kzMl0sIDMyLAorICAvLyBSZXR1cm4gdmFsdWVzIGFuZCBhcmd1bWVudHMKKyAgW1IwLCBSMSwgUjIsIFIzLAorICAvLyBOb3QgcHJlc2VydmVkIGFjcm9zcyBwcm9jZWR1cmUgY2FsbHMKKyAgUjExLAorICAvLyBDYWxsZWUgc2F2ZQorICBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LCBSMTBdPiB7CisgIGxldCBNZXRob2RQcm90b3MgPSBbeworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIH1dOworICBsZXQgTWV0aG9kQm9kaWVzID0gW3sKKyAgICBHUlJlZ3NDbGFzczo6aXRlcmF0b3IKKyAgICBHUlJlZ3NDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9iZWdpbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgICByZXR1cm4gYmVnaW4oKTsKKyAgICB9CisgICAgR1JSZWdzQ2xhc3M6Oml0ZXJhdG9yCisgICAgR1JSZWdzQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfZW5kKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gTUYuZ2V0VGFyZ2V0KCk7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJJID0gVE0uZ2V0UmVnaXN0ZXJJbmZvKCk7CisgICAgICBpZiAoUkktPmhhc0ZQKE1GKSkKKyAgICAgICAgcmV0dXJuIGVuZCgpLTE7ICAvLyBkb24ndCBhbGxvY2F0ZSBSMTAKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVuZCgpOworICAgIH0KKyAgfV07Cit9CisKK2RlZiBSUmVncyA6IFJlZ2lzdGVyQ2xhc3M8IlhDb3JlIiwgW2kzMl0sIDMyLAorICAvLyBSZXNlcnZlZAorICBbQ1AsIERQLCBTUCwgTFJdPiB7CisgIGxldCBNZXRob2RQcm90b3MgPSBbeworICAgIGl0ZXJhdG9yIGFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgICAgaXRlcmF0b3IgYWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisgIH1dOworICBsZXQgTWV0aG9kQm9kaWVzID0gW3sKKyAgICBSUmVnc0NsYXNzOjppdGVyYXRvcgorICAgIFJSZWdzQ2xhc3M6OmFsbG9jYXRpb25fb3JkZXJfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgcmV0dXJuIGJlZ2luKCk7CisgICAgfQorICAgIFJSZWdzQ2xhc3M6Oml0ZXJhdG9yCisgICAgUlJlZ3NDbGFzczo6YWxsb2NhdGlvbl9vcmRlcl9lbmQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgICAgLy8gTm8gYWxsb2NhdGFibGUgcmVnaXN0ZXJzCisgICAgICByZXR1cm4gYmVnaW4oKTsKKyAgICB9CisgIH1dOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVNlbGVjdGlvbkRBR0luZm8uY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVNlbGVjdGlvbkRBR0luZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YWViNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlU2VsZWN0aW9uREFHSW5mby5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy89PT0tLSBYQ29yZVNlbGVjdGlvbkRBR0luZm8uY3BwIC0gWENvcmUgU2VsZWN0aW9uREFHIEluZm8gLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgWENvcmVTZWxlY3Rpb25EQUdJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAieGNvcmUtc2VsZWN0aW9uZGFnLWluZm8iCisjaW5jbHVkZSAiWENvcmVUYXJnZXRNYWNoaW5lLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworWENvcmVTZWxlY3Rpb25EQUdJbmZvOjpYQ29yZVNlbGVjdGlvbkRBR0luZm8oY29uc3QgWENvcmVUYXJnZXRNYWNoaW5lICZUTSkKKyAgOiBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvKFRNKSB7Cit9CisKK1hDb3JlU2VsZWN0aW9uREFHSW5mbzo6flhDb3JlU2VsZWN0aW9uREFHSW5mbygpIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVTZWxlY3Rpb25EQUdJbmZvLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlU2VsZWN0aW9uREFHSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODY5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlU2VsZWN0aW9uREFHSW5mby5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LS0gWENvcmVTZWxlY3Rpb25EQUdJbmZvLmggLSBYQ29yZSBTZWxlY3Rpb25EQUcgSW5mbyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFhDb3JlIHN1YmNsYXNzIGZvciBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWENPUkVTRUxFQ1RJT05EQUdJTkZPX0gKKyNkZWZpbmUgWENPUkVTRUxFQ1RJT05EQUdJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBR0luZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBYQ29yZVRhcmdldE1hY2hpbmU7CisKK2NsYXNzIFhDb3JlU2VsZWN0aW9uREFHSW5mbyA6IHB1YmxpYyBUYXJnZXRTZWxlY3Rpb25EQUdJbmZvIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgWENvcmVTZWxlY3Rpb25EQUdJbmZvKGNvbnN0IFhDb3JlVGFyZ2V0TWFjaGluZSAmVE0pOworICB+WENvcmVTZWxlY3Rpb25EQUdJbmZvKCk7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVN1YnRhcmdldC5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlU3VidGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGE2ZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVN1YnRhcmdldC5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy89PT0tIFhDb3JlU3VidGFyZ2V0LmNwcCAtIFhDb3JlIFN1YnRhcmdldCBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgWENvcmUgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgVGFyZ2V0U3VidGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJYQ29yZVN1YnRhcmdldC5oIgorI2luY2x1ZGUgIlhDb3JlLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworWENvcmVTdWJ0YXJnZXQ6OlhDb3JlU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKQoreworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVN1YnRhcmdldC5oIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVN1YnRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YmUzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlU3VidGFyZ2V0LmgKQEAgLTAsMCArMSwzOSBAQAorLy89PT09PS0tIFhDb3JlU3VidGFyZ2V0LmggLSBEZWZpbmUgU3VidGFyZ2V0IGZvciB0aGUgWENvcmUgLS0tLS0qLSBDKysgLSotLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFhDb3JlIHNwZWNpZmljIHN1YmNsYXNzIG9mIFRhcmdldFN1YnRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFhDT1JFU1VCVEFSR0VUX0gKKyNkZWZpbmUgWENPUkVTVUJUQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U3VidGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFhDb3JlU3VidGFyZ2V0IDogcHVibGljIFRhcmdldFN1YnRhcmdldCB7CisKK3B1YmxpYzoKKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIGRhdGEgbWVtYmVycyB0byBtYXRjaCB0aGF0CisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHRyaXBsZS4KKyAgLy8vCisgIFhDb3JlU3VidGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUVCwgY29uc3Qgc3RkOjpzdHJpbmcgJkZTKTsKKyAgCisgIC8vLyBQYXJzZVN1YnRhcmdldEZlYXR1cmVzIC0gUGFyc2VzIGZlYXR1cmVzIHN0cmluZyBzZXR0aW5nIHNwZWNpZmllZCAKKyAgLy8vIHN1YnRhcmdldCBvcHRpb25zLiAgRGVmaW5pdGlvbiBvZiBmdW5jdGlvbiBpcyBhdXRvIGdlbmVyYXRlZCBieSB0YmxnZW4uCisgIHN0ZDo6c3RyaW5nIFBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcgJkZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZDUFUpOworfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVRhcmdldE1hY2hpbmUuY3BwIGIvc3JjL0xMVk0vbGliL1RhcmdldC9YQ29yZS9YQ29yZVRhcmdldE1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDEzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlVGFyZ2V0TWFjaGluZS5jcHAKQEAgLTAsMCArMSw0NSBAQAorLy89PT0tLSBYQ29yZVRhcmdldE1hY2hpbmUuY3BwIC0gRGVmaW5lIFRhcmdldE1hY2hpbmUgZm9yIFhDb3JlIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlhDb3JlTUNBc21JbmZvLmgiCisjaW5jbHVkZSAiWENvcmVUYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAiWENvcmUuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RyeS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBYQ29yZVRhcmdldE1hY2hpbmUgY3RvciAtIENyZWF0ZSBhbiBJTFAzMiBhcmNoaXRlY3R1cmUgbW9kZWwKKy8vLworWENvcmVUYXJnZXRNYWNoaW5lOjpYQ29yZVRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpCisgIDogTExWTVRhcmdldE1hY2hpbmUoVCwgVFQpLAorICAgIFN1YnRhcmdldChUVCwgRlMpLAorICAgIERhdGFMYXlvdXQoImUtcDozMjozMjozMi1hMDowOjMyLWYzMjozMjozMi1mNjQ6MzI6MzItaTE6ODozMi1pODo4OjMyLSIKKyAgICAgICAgICAgICAgICJpMTY6MTY6MzItaTMyOjMyOjMyLWk2NDozMjozMi1uMzIiKSwKKyAgICBJbnN0ckluZm8oKSwKKyAgICBGcmFtZUluZm8oKnRoaXMpLAorICAgIFRMSW5mbygqdGhpcyksCisgICAgVFNJbmZvKCp0aGlzKSB7Cit9CisKK2Jvb2wgWENvcmVUYXJnZXRNYWNoaW5lOjphZGRJbnN0U2VsZWN0b3IoUGFzc01hbmFnZXJCYXNlICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpIHsKKyAgUE0uYWRkKGNyZWF0ZVhDb3JlSVNlbERhZygqdGhpcykpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEZvcmNlIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KK2V4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZVhDb3JlVGFyZ2V0KCkgeworICBSZWdpc3RlclRhcmdldE1hY2hpbmU8WENvcmVUYXJnZXRNYWNoaW5lPiBYKFRoZVhDb3JlVGFyZ2V0KTsKKyAgUmVnaXN0ZXJBc21JbmZvPFhDb3JlTUNBc21JbmZvPiBZKFRoZVhDb3JlVGFyZ2V0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVUYXJnZXRNYWNoaW5lLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlVGFyZ2V0TWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDczYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlVGFyZ2V0TWFjaGluZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vPT09LS0gWENvcmVUYXJnZXRNYWNoaW5lLmggLSBEZWZpbmUgVGFyZ2V0TWFjaGluZSBmb3IgWENvcmUgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBYQ29yZSBzcGVjaWZpYyBzdWJjbGFzcyBvZiBUYXJnZXRNYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWENPUkVUQVJHRVRNQUNISU5FX0gKKyNkZWZpbmUgWENPUkVUQVJHRVRNQUNISU5FX0gKKworI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAiWENvcmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJYQ29yZVN1YnRhcmdldC5oIgorI2luY2x1ZGUgIlhDb3JlSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAiWENvcmVJU2VsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJYQ29yZVNlbGVjdGlvbkRBR0luZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBYQ29yZVRhcmdldE1hY2hpbmUgOiBwdWJsaWMgTExWTVRhcmdldE1hY2hpbmUgeworICBYQ29yZVN1YnRhcmdldCBTdWJ0YXJnZXQ7CisgIGNvbnN0IFRhcmdldERhdGEgRGF0YUxheW91dDsgICAgICAgLy8gQ2FsY3VsYXRlcyB0eXBlIHNpemUgJiBhbGlnbm1lbnQKKyAgWENvcmVJbnN0ckluZm8gSW5zdHJJbmZvOworICBYQ29yZUZyYW1lSW5mbyBGcmFtZUluZm87CisgIFhDb3JlVGFyZ2V0TG93ZXJpbmcgVExJbmZvOworICBYQ29yZVNlbGVjdGlvbkRBR0luZm8gVFNJbmZvOworcHVibGljOgorICBYQ29yZVRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBzdGQ6OnN0cmluZyAmVFQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRlMpOworCisgIHZpcnR1YWwgY29uc3QgWENvcmVJbnN0ckluZm8gKmdldEluc3RySW5mbygpIGNvbnN0IHsgcmV0dXJuICZJbnN0ckluZm87IH0KKyAgdmlydHVhbCBjb25zdCBYQ29yZUZyYW1lSW5mbyAqZ2V0RnJhbWVJbmZvKCkgY29uc3QgeyByZXR1cm4gJkZyYW1lSW5mbzsgfQorICB2aXJ0dWFsIGNvbnN0IFhDb3JlU3VidGFyZ2V0ICpnZXRTdWJ0YXJnZXRJbXBsKCkgY29uc3QgeyByZXR1cm4gJlN1YnRhcmdldDsgfQorICB2aXJ0dWFsIGNvbnN0IFhDb3JlVGFyZ2V0TG93ZXJpbmcgKmdldFRhcmdldExvd2VyaW5nKCkgY29uc3QgeworICAgIHJldHVybiAmVExJbmZvOworICB9CisKKyAgdmlydHVhbCBjb25zdCBYQ29yZVNlbGVjdGlvbkRBR0luZm8qIGdldFNlbGVjdGlvbkRBR0luZm8oKSBjb25zdCB7CisgICAgcmV0dXJuICZUU0luZm87CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeworICAgIHJldHVybiAmSW5zdHJJbmZvLmdldFJlZ2lzdGVySW5mbygpOworICB9CisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0RGF0YSAgICAgICAqZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuICZEYXRhTGF5b3V0OyB9CisKKyAgLy8gUGFzcyBQaXBlbGluZSBDb25maWd1cmF0aW9uCisgIHZpcnR1YWwgYm9vbCBhZGRJbnN0U2VsZWN0b3IoUGFzc01hbmFnZXJCYXNlICZQTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlVGFyZ2V0T2JqZWN0RmlsZS5jcHAgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlVGFyZ2V0T2JqZWN0RmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmNWE1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVUYXJnZXRPYmplY3RGaWxlLmNwcApAQCAtMCwwICsxLDY0IEBACisvLz09PS0tIFhDb3JlVGFyZ2V0T2JqZWN0RmlsZS5jcHAgLSBYQ29yZSBvYmplY3QgZmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiWENvcmVUYXJnZXRPYmplY3RGaWxlLmgiCisjaW5jbHVkZSAiWENvcmVTdWJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uRUxGLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKwordm9pZCBYQ29yZVRhcmdldE9iamVjdEZpbGU6OkluaXRpYWxpemUoTUNDb250ZXh0ICZDdHgsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKXsKKyAgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlRUxGOjpJbml0aWFsaXplKEN0eCwgVE0pOworCisgIERhdGFTZWN0aW9uID0KKyAgICBDdHguZ2V0RUxGU2VjdGlvbigiLmRwLmRhdGEiLCBNQ1NlY3Rpb25FTEY6OlNIVF9QUk9HQklUUywgCisgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfQUxMT0MgfCBNQ1NlY3Rpb25FTEY6OlNIRl9XUklURSB8CisgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpYQ09SRV9TSEZfRFBfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZDo6Z2V0RGF0YVJlbCgpLCBmYWxzZSk7CisgIEJTU1NlY3Rpb24gPQorICAgIEN0eC5nZXRFTEZTZWN0aW9uKCIuZHAuYnNzIiwgTUNTZWN0aW9uRUxGOjpTSFRfTk9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX0FMTE9DIHwgTUNTZWN0aW9uRUxGOjpTSEZfV1JJVEUgfAorICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6WENPUkVfU0hGX0RQX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQ6OmdldEJTUygpLCBmYWxzZSk7CisgIAorICBNZXJnZWFibGVDb25zdDRTZWN0aW9uID0gCisgICAgQ3R4LmdldEVMRlNlY3Rpb24oIi5jcC5yb2RhdGEuY3N0NCIsIE1DU2VjdGlvbkVMRjo6U0hUX1BST0dCSVRTLAorICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX0FMTE9DIHwgTUNTZWN0aW9uRUxGOjpTSEZfTUVSR0UgfAorICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6WENPUkVfU0hGX0NQX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQ6OmdldE1lcmdlYWJsZUNvbnN0NCgpLCBmYWxzZSk7CisgIE1lcmdlYWJsZUNvbnN0OFNlY3Rpb24gPSAKKyAgICBDdHguZ2V0RUxGU2VjdGlvbigiLmNwLnJvZGF0YS5jc3Q4IiwgTUNTZWN0aW9uRUxGOjpTSFRfUFJPR0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpTSEZfQUxMT0MgfCBNQ1NlY3Rpb25FTEY6OlNIRl9NRVJHRSB8CisgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uRUxGOjpYQ09SRV9TSEZfQ1BfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZDo6Z2V0TWVyZ2VhYmxlQ29uc3Q4KCksIGZhbHNlKTsKKyAgTWVyZ2VhYmxlQ29uc3QxNlNlY3Rpb24gPSAKKyAgICBDdHguZ2V0RUxGU2VjdGlvbigiLmNwLnJvZGF0YS5jc3QxNiIsIE1DU2VjdGlvbkVMRjo6U0hUX1BST0dCSVRTLAorICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX0FMTE9DIHwgTUNTZWN0aW9uRUxGOjpTSEZfTUVSR0UgfAorICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6WENPUkVfU0hGX0NQX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQ6OmdldE1lcmdlYWJsZUNvbnN0MTYoKSwgZmFsc2UpOworICAKKyAgLy8gVExTIGdsb2JhbHMgYXJlIGxvd2VyZWQgaW4gdGhlIGJhY2tlbmQgdG8gYXJyYXlzIGluZGV4ZWQgYnkgdGhlIGN1cnJlbnQKKyAgLy8gdGhyZWFkIGlkLiBBZnRlciBsb3dlcmluZyB0aGV5IHJlcXVpcmUgbm8gc3BlY2lhbCBoYW5kbGluZyBieSB0aGUgbGlua2VyCisgIC8vIGFuZCBjYW4gYmUgcGxhY2VkIGluIHRoZSBzdGFuZGFyZCBkYXRhIC8gYnNzIHNlY3Rpb25zLgorICBUTFNEYXRhU2VjdGlvbiA9IERhdGFTZWN0aW9uOworICBUTFNCU1NTZWN0aW9uID0gQlNTU2VjdGlvbjsKKworICBSZWFkT25seVNlY3Rpb24gPSAKKyAgICBDdHguZ2V0RUxGU2VjdGlvbigiLmNwLnJvZGF0YSIsIE1DU2VjdGlvbkVMRjo6U0hUX1BST0dCSVRTLAorICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbkVMRjo6U0hGX0FMTE9DIHwKKyAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb25FTEY6OlhDT1JFX1NIRl9DUF9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kOjpnZXRSZWFkT25seVdpdGhSZWwoKSwgZmFsc2UpOworCisgIC8vIER5bmFtaWMgbGlua2luZyBpcyBub3Qgc3VwcG9ydGVkLiBEYXRhIHdpdGggcmVsb2NhdGlvbnMgaXMgcGxhY2VkIGluIHRoZQorICAvLyBzYW1lIHNlY3Rpb24gYXMgZGF0YSB3aXRob3V0IHJlbG9jYXRpb25zLgorICBEYXRhUmVsU2VjdGlvbiA9IERhdGFSZWxMb2NhbFNlY3Rpb24gPSBEYXRhU2VjdGlvbjsKKyAgRGF0YVJlbFJPU2VjdGlvbiA9IERhdGFSZWxST0xvY2FsU2VjdGlvbiA9IFJlYWRPbmx5U2VjdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UYXJnZXQvWENvcmUvWENvcmVUYXJnZXRPYmplY3RGaWxlLmggYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlVGFyZ2V0T2JqZWN0RmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MjRjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVGFyZ2V0L1hDb3JlL1hDb3JlVGFyZ2V0T2JqZWN0RmlsZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vPT09LS0gbGx2bS9UYXJnZXQvWENvcmVUYXJnZXRPYmplY3RGaWxlLmggLSBYQ29yZSBPYmplY3QgSW5mbyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfWENPUkVfVEFSR0VUT0JKRUNURklMRV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1hDT1JFX1RBUkdFVE9CSkVDVEZJTEVfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZUltcGwuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIFhDb3JlVGFyZ2V0T2JqZWN0RmlsZSA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEYgeworICBwdWJsaWM6CisgICAgdm9pZCBJbml0aWFsaXplKE1DQ29udGV4dCAmQ3R4LCBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgICAvLyBUT0RPOiBDbGFzc2lmeSBnbG9iYWxzIGFzIHhjb3JlIHdpc2hlcy4KKyAgfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSGVsbG8vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9IZWxsby9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTdiNzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSGVsbG8vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzIEBACithZGRfbGx2bV9sb2FkYWJsZV9tb2R1bGUoIExMVk1IZWxsbworICBIZWxsby5jcHAKKyAgKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSGVsbG8vSGVsbG8uY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSGVsbG8vSGVsbG8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOGQ1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9IZWxsby9IZWxsby5jcHAKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tIEhlbGxvLmNwcCAtIEV4YW1wbGUgY29kZSBmcm9tICJXcml0aW5nIGFuIExMVk0gUGFzcyIgLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0d28gdmVyc2lvbnMgb2YgdGhlIExMVk0gIkhlbGxvIFdvcmxkIiBwYXNzIGRlc2NyaWJlZAorLy8gaW4gZG9jcy9Xcml0aW5nQW5MTFZNUGFzcy5odG1sCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJoZWxsbyIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKEhlbGxvQ291bnRlciwgIkNvdW50cyBudW1iZXIgb2YgZnVuY3Rpb25zIGdyZWV0ZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgLy8gSGVsbG8gLSBUaGUgZmlyc3QgaW1wbGVtZW50YXRpb24sIHdpdGhvdXQgZ2V0QW5hbHlzaXNVc2FnZS4KKyAgc3RydWN0IEhlbGxvIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBIZWxsbygpIDogRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgICAgICsrSGVsbG9Db3VudGVyOworICAgICAgZXJycygpIDw8ICJIZWxsbzogIjsKKyAgICAgIGVycnMoKS53cml0ZV9lc2NhcGVkKEYuZ2V0TmFtZSgpKSA8PCAnXG4nOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfTsKK30KKworY2hhciBIZWxsbzo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKEhlbGxvLCAiaGVsbG8iLCAiSGVsbG8gV29ybGQgUGFzcyIsIGZhbHNlLCBmYWxzZSk7CisKK25hbWVzcGFjZSB7CisgIC8vIEhlbGxvMiAtIFRoZSBzZWNvbmQgaW1wbGVtZW50YXRpb24gd2l0aCBnZXRBbmFseXNpc1VzYWdlIGltcGxlbWVudGVkLgorICBzdHJ1Y3QgSGVsbG8yIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBIZWxsbzIoKSA6IEZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgICAgICArK0hlbGxvQ291bnRlcjsKKyAgICAgIGVycnMoKSA8PCAiSGVsbG86ICI7CisgICAgICBlcnJzKCkud3JpdGVfZXNjYXBlZChGLmdldE5hbWUoKSkgPDwgJ1xuJzsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBXZSBkb24ndCBtb2RpZnkgdGhlIHByb2dyYW0sIHNvIHdlIHByZXNlcnZlIGFsbCBhbmFseXNlcworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICB9CisgIH07Cit9CisKK2NoYXIgSGVsbG8yOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoSGVsbG8yLCAiaGVsbG8yIiwKKyAgICAgICAgICAgICAgICAiSGVsbG8gV29ybGQgUGFzcyAod2l0aCBnZXRBbmFseXNpc1VzYWdlIGltcGxlbWVudGVkKSIsCisgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0hlbGxvL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSGVsbG8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlMzE0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0hlbGxvL01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMjPT09LSBsaWIvVHJhbnNmb3Jtcy9IZWxsby9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUhlbGxvCitMT0FEQUJMRV9NT0RVTEUgPSAxCitVU0VETElCUyA9CisKKyMgSWYgd2UgZG9uJ3QgbmVlZCBSVFRJIG9yIEVILCB0aGVyZSdzIG5vIHJlYXNvbiB0byBleHBvcnQgYW55dGhpbmcKKyMgZnJvbSB0aGUgaGVsbG8gcGx1Z2luLgoraWZuZXEgKCQoUkVRVUlSRVNfUlRUSSksIDEpCitpZm5lcSAoJChSRVFVSVJFU19FSCksIDEpCitFWFBPUlRFRF9TWU1CT0xfRklMRSA9ICQoUFJPSl9TUkNfRElSKS9IZWxsby5leHBvcnRzCitlbmRpZgorZW5kaWYKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0FyZ3VtZW50UHJvbW90aW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9Bcmd1bWVudFByb21vdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3N2UxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9Bcmd1bWVudFByb21vdGlvbi5jcHAKQEAgLTAsMCArMSw4ODkgQEAKKy8vPT09LS0gQXJndW1lbnRQcm9tb3Rpb24uY3BwIC0gUHJvbW90ZSBieS1yZWZlcmVuY2UgYXJndW1lbnRzIC0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHByb21vdGVzICJieSByZWZlcmVuY2UiIGFyZ3VtZW50cyB0byBiZSAiYnkgdmFsdWUiIGFyZ3VtZW50cy4gIEluCisvLyBwcmFjdGljZSwgdGhpcyBtZWFucyBsb29raW5nIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMgdGhhdCBoYXZlIHBvaW50ZXIKKy8vIGFyZ3VtZW50cy4gIElmIGl0IGNhbiBwcm92ZSwgdGhyb3VnaCB0aGUgdXNlIG9mIGFsaWFzIGFuYWx5c2lzLCB0aGF0IGFuCisvLyBhcmd1bWVudCBpcyAqb25seSogbG9hZGVkLCB0aGVuIGl0IGNhbiBwYXNzIHRoZSB2YWx1ZSBpbnRvIHRoZSBmdW5jdGlvbgorLy8gaW5zdGVhZCBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUuICBUaGlzIGNhbiBjYXVzZSByZWN1cnNpdmUgc2ltcGxpZmljYXRpb24KKy8vIG9mIGNvZGUgYW5kIGxlYWQgdG8gdGhlIGVsaW1pbmF0aW9uIG9mIGFsbG9jYXMgKGVzcGVjaWFsbHkgaW4gQysrIHRlbXBsYXRlCisvLyBjb2RlIGxpa2UgdGhlIFNUTCkuCisvLworLy8gVGhpcyBwYXNzIGFsc28gaGFuZGxlcyBhZ2dyZWdhdGUgYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCBpbnRvIGEgZnVuY3Rpb24sCisvLyBzY2FsYXJpemluZyB0aGVtIGlmIHRoZSBlbGVtZW50cyBvZiB0aGUgYWdncmVnYXRlIGFyZSBvbmx5IGxvYWRlZC4gIE5vdGUgdGhhdAorLy8gYnkgZGVmYXVsdCBpdCByZWZ1c2VzIHRvIHNjYWxhcml6ZSBhZ2dyZWdhdGVzIHdoaWNoIHdvdWxkIHJlcXVpcmUgcGFzc2luZyBpbgorLy8gbW9yZSB0aGFuIHRocmVlIG9wZXJhbmRzIHRvIHRoZSBmdW5jdGlvbiwgYmVjYXVzZSBwYXNzaW5nIHRob3VzYW5kcyBvZgorLy8gb3BlcmFuZHMgZm9yIGEgbGFyZ2UgYXJyYXkgb3Igc3RydWN0dXJlIGlzIHVucHJvZml0YWJsZSEgVGhpcyBsaW1pdCBjYW4gYmUKKy8vIGNvbmZpZ3VyZWQgb3IgZGlzYWJsZWQsIGhvd2V2ZXIuCisvLworLy8gTm90ZSB0aGF0IHRoaXMgdHJhbnNmb3JtYXRpb24gY291bGQgYWxzbyBiZSBkb25lIGZvciBhcmd1bWVudHMgdGhhdCBhcmUgb25seQorLy8gc3RvcmVkIHRvIChyZXR1cm5pbmcgdGhlIHZhbHVlIGluc3RlYWQpLCBidXQgZG9lcyBub3QgY3VycmVudGx5LiAgVGhpcyBjYXNlCisvLyB3b3VsZCBiZSBiZXN0IGhhbmRsZWQgd2hlbiBhbmQgaWYgTExWTSBiZWdpbnMgc3VwcG9ydGluZyBtdWx0aXBsZSByZXR1cm4KKy8vIHZhbHVlcyBmcm9tIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImFyZ3Byb21vdGlvbiIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9DYWxsR3JhcGhTQ0NQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DYWxsR3JhcGguaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgPHNldD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtQXJndW1lbnRzUHJvbW90ZWQgLCAiTnVtYmVyIG9mIHBvaW50ZXIgYXJndW1lbnRzIHByb21vdGVkIik7CitTVEFUSVNUSUMoTnVtQWdncmVnYXRlc1Byb21vdGVkLCAiTnVtYmVyIG9mIGFnZ3JlZ2F0ZSBhcmd1bWVudHMgcHJvbW90ZWQiKTsKK1NUQVRJU1RJQyhOdW1CeVZhbEFyZ3NQcm9tb3RlZCAsICJOdW1iZXIgb2YgYnl2YWwgYXJndW1lbnRzIHByb21vdGVkIik7CitTVEFUSVNUSUMoTnVtQXJndW1lbnRzRGVhZCAgICAgLCAiTnVtYmVyIG9mIGRlYWQgcG9pbnRlciBhcmdzIGVsaW1pbmF0ZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgLy8vIEFyZ1Byb21vdGlvbiAtIFRoZSAnYnkgcmVmZXJlbmNlJyB0byAnYnkgdmFsdWUnIGFyZ3VtZW50IHByb21vdGlvbiBwYXNzLgorICAvLy8KKyAgc3RydWN0IEFyZ1Byb21vdGlvbiA6IHB1YmxpYyBDYWxsR3JhcGhTQ0NQYXNzIHsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuYWRkUmVxdWlyZWQ8QWxpYXNBbmFseXNpcz4oKTsKKyAgICAgIENhbGxHcmFwaFNDQ1Bhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBydW5PblNDQyhDYWxsR3JhcGhTQ0MgJlNDQyk7CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBleHBsaWNpdCBBcmdQcm9tb3Rpb24odW5zaWduZWQgbWF4RWxlbWVudHMgPSAzKQorICAgICAgOiBDYWxsR3JhcGhTQ0NQYXNzKElEKSwgbWF4RWxlbWVudHMobWF4RWxlbWVudHMpIHt9CisKKyAgICAvLy8gQSB2ZWN0b3IgdXNlZCB0byBob2xkIHRoZSBpbmRpY2VzIG9mIGEgc2luZ2xlIEdFUCBpbnN0cnVjdGlvbgorICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IEluZGljZXNWZWN0b3I7CisKKyAgcHJpdmF0ZToKKyAgICBDYWxsR3JhcGhOb2RlICpQcm9tb3RlQXJndW1lbnRzKENhbGxHcmFwaE5vZGUgKkNHTik7CisgICAgYm9vbCBpc1NhZmVUb1Byb21vdGVBcmd1bWVudChBcmd1bWVudCAqQXJnLCBib29sIGlzQnlWYWwpIGNvbnN0OworICAgIENhbGxHcmFwaE5vZGUgKkRvUHJvbW90aW9uKEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PEFyZ3VtZW50KiwgOD4gJkFyZ3NUb1Byb21vdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8QXJndW1lbnQqLCA4PiAmQnlWYWxBcmdzVG9UcmFuc2Zvcm0pOworICAgIC8vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZXhwYW5kLCBvciAwIGZvciB1bmxpbWl0ZWQuCisgICAgdW5zaWduZWQgbWF4RWxlbWVudHM7CisgIH07Cit9CisKK2NoYXIgQXJnUHJvbW90aW9uOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoQXJnUHJvbW90aW9uLCAiYXJncHJvbW90aW9uIiwKKyAgICAgICAgICAgICAgICAiUHJvbW90ZSAnYnkgcmVmZXJlbmNlJyBhcmd1bWVudHMgdG8gc2NhbGFycyIsIGZhbHNlLCBmYWxzZSk7CisKK1Bhc3MgKmxsdm06OmNyZWF0ZUFyZ3VtZW50UHJvbW90aW9uUGFzcyh1bnNpZ25lZCBtYXhFbGVtZW50cykgeworICByZXR1cm4gbmV3IEFyZ1Byb21vdGlvbihtYXhFbGVtZW50cyk7Cit9CisKK2Jvb2wgQXJnUHJvbW90aW9uOjpydW5PblNDQyhDYWxsR3JhcGhTQ0MgJlNDQykgeworICBib29sIENoYW5nZWQgPSBmYWxzZSwgTG9jYWxDaGFuZ2U7CisKKyAgZG8geyAgLy8gSXRlcmF0ZSB1bnRpbCB3ZSBzdG9wIHByb21vdGluZyBmcm9tIHRoaXMgU0NDLgorICAgIExvY2FsQ2hhbmdlID0gZmFsc2U7CisgICAgLy8gQXR0ZW1wdCB0byBwcm9tb3RlIGFyZ3VtZW50cyBmcm9tIGFsbCBmdW5jdGlvbnMgaW4gdGhpcyBTQ0MuCisgICAgZm9yIChDYWxsR3JhcGhTQ0M6Oml0ZXJhdG9yIEkgPSBTQ0MuYmVnaW4oKSwgRSA9IFNDQy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChDYWxsR3JhcGhOb2RlICpDR04gPSBQcm9tb3RlQXJndW1lbnRzKCpJKSkgeworICAgICAgICBMb2NhbENoYW5nZSA9IHRydWU7CisgICAgICAgIFNDQy5SZXBsYWNlTm9kZSgqSSwgQ0dOKTsKKyAgICAgIH0KKyAgICB9CisgICAgQ2hhbmdlZCB8PSBMb2NhbENoYW5nZTsgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHdlIGNoYW5nZWQgc29tZXRoaW5nLgorICB9IHdoaWxlIChMb2NhbENoYW5nZSk7CisgIAorICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIFByb21vdGVBcmd1bWVudHMgLSBUaGlzIG1ldGhvZCBjaGVja3MgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0byBzZWUgaWYgdGhlcmUKKy8vLyBhcmUgYW55IHByb21vdGFibGUgYXJndW1lbnRzIGFuZCBpZiBpdCBpcyBzYWZlIHRvIHByb21vdGUgdGhlIGZ1bmN0aW9uIChmb3IKKy8vLyBleGFtcGxlLCBhbGwgY2FsbGVycyBhcmUgZGlyZWN0KS4gIElmIHNhZmUgdG8gcHJvbW90ZSBzb21lIGFyZ3VtZW50cywgaXQKKy8vLyBjYWxscyB0aGUgRG9Qcm9tb3Rpb24gbWV0aG9kLgorLy8vCitDYWxsR3JhcGhOb2RlICpBcmdQcm9tb3Rpb246OlByb21vdGVBcmd1bWVudHMoQ2FsbEdyYXBoTm9kZSAqQ0dOKSB7CisgIEZ1bmN0aW9uICpGID0gQ0dOLT5nZXRGdW5jdGlvbigpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGlzIGxvY2FsIHRvIHRoaXMgbW9kdWxlLgorICBpZiAoIUYgfHwgIUYtPmhhc0xvY2FsTGlua2FnZSgpKSByZXR1cm4gMDsKKworICAvLyBGaXJzdCBjaGVjazogc2VlIGlmIHRoZXJlIGFyZSBhbnkgcG9pbnRlciBhcmd1bWVudHMhICBJZiBub3QsIHF1aWNrIGV4aXQuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxBcmd1bWVudCosIHVuc2lnbmVkPiwgMTY+IFBvaW50ZXJBcmdzOworICB1bnNpZ25lZCBBcmdObyA9IDA7CisgIGZvciAoRnVuY3Rpb246OmFyZ19pdGVyYXRvciBJID0gRi0+YXJnX2JlZ2luKCksIEUgPSBGLT5hcmdfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0ksICsrQXJnTm8pCisgICAgaWYgKEktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgIFBvaW50ZXJBcmdzLnB1c2hfYmFjayhzdGQ6OnBhaXI8QXJndW1lbnQqLCB1bnNpZ25lZD4oSSwgQXJnTm8pKTsKKyAgaWYgKFBvaW50ZXJBcmdzLmVtcHR5KCkpIHJldHVybiAwOworCisgIC8vIFNlY29uZCBjaGVjazogbWFrZSBzdXJlIHRoYXQgYWxsIGNhbGxlcnMgYXJlIGRpcmVjdCBjYWxsZXJzLiAgV2UgY2FuJ3QKKyAgLy8gdHJhbnNmb3JtIGZ1bmN0aW9ucyB0aGF0IGhhdmUgaW5kaXJlY3QgY2FsbGVycy4KKyAgaWYgKEYtPmhhc0FkZHJlc3NUYWtlbigpKQorICAgIHJldHVybiAwOworCisgIC8vIENoZWNrIHRvIHNlZSB3aGljaCBhcmd1bWVudHMgYXJlIHByb21vdGFibGUuICBJZiBhbiBhcmd1bWVudCBpcyBwcm9tb3RhYmxlLAorICAvLyBhZGQgaXQgdG8gQXJnc1RvUHJvbW90ZS4KKyAgU21hbGxQdHJTZXQ8QXJndW1lbnQqLCA4PiBBcmdzVG9Qcm9tb3RlOworICBTbWFsbFB0clNldDxBcmd1bWVudCosIDg+IEJ5VmFsQXJnc1RvVHJhbnNmb3JtOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFBvaW50ZXJBcmdzLnNpemUoKTsgKytpKSB7CisgICAgYm9vbCBpc0J5VmFsID0gRi0+cGFyYW1IYXNBdHRyKFBvaW50ZXJBcmdzW2ldLnNlY29uZCsxLCBBdHRyaWJ1dGU6OkJ5VmFsKTsKKworICAgIC8vIElmIHRoaXMgaXMgYSBieXZhbCBhcmd1bWVudCwgYW5kIGlmIHRoZSBhZ2dyZWdhdGUgdHlwZSBpcyBzbWFsbCwganVzdAorICAgIC8vIHBhc3MgdGhlIGVsZW1lbnRzLCB3aGljaCBpcyBhbHdheXMgc2FmZS4KKyAgICBBcmd1bWVudCAqUHRyQXJnID0gUG9pbnRlckFyZ3NbaV0uZmlyc3Q7CisgICAgaWYgKGlzQnlWYWwpIHsKKyAgICAgIGNvbnN0IFR5cGUgKkFnVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihQdHJBcmctPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oQWdUeSkpIHsKKyAgICAgICAgaWYgKG1heEVsZW1lbnRzID4gMCAmJiBTVHktPmdldE51bUVsZW1lbnRzKCkgPiBtYXhFbGVtZW50cykgeworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiYXJncHJvbW90aW9uIGRpc2FibGUgcHJvbW90aW5nIGFyZ3VtZW50ICciCisgICAgICAgICAgICAgICAgPDwgUHRyQXJnLT5nZXROYW1lKCkgPDwgIicgYmVjYXVzZSBpdCB3b3VsZCByZXF1aXJlIGFkZGluZyBtb3JlIgorICAgICAgICAgICAgICAgIDw8ICIgdGhhbiAiIDw8IG1heEVsZW1lbnRzIDw8ICIgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIElmIGFsbCB0aGUgZWxlbWVudHMgYXJlIHNpbmdsZS12YWx1ZSB0eXBlcywgd2UgY2FuIHByb21vdGUgaXQuCisgICAgICAgICAgYm9vbCBBbGxTaW1wbGUgPSB0cnVlOworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgaWYgKCFTVHktPmdldEVsZW1lbnRUeXBlKGkpLT5pc1NpbmdsZVZhbHVlVHlwZSgpKSB7CisgICAgICAgICAgICAgIEFsbFNpbXBsZSA9IGZhbHNlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFNhZmUgdG8gdHJhbnNmb3JtLCBkb24ndCBldmVuIGJvdGhlciB0cnlpbmcgdG8gInByb21vdGUiIGl0LgorICAgICAgICAgIC8vIFBhc3NpbmcgdGhlIGVsZW1lbnRzIGFzIGEgc2NhbGFyIHdpbGwgYWxsb3cgc2NhbGFycmVwbCB0byBoYWNrIG9uCisgICAgICAgICAgLy8gdGhlIG5ldyBhbGxvY2Egd2UgaW50cm9kdWNlLgorICAgICAgICAgIGlmIChBbGxTaW1wbGUpIHsKKyAgICAgICAgICAgIEJ5VmFsQXJnc1RvVHJhbnNmb3JtLmluc2VydChQdHJBcmcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBzZWUgaWYgd2UgY2FuIHByb21vdGUgdGhlIHBvaW50ZXIgdG8gaXRzIHZhbHVlLgorICAgIGlmIChpc1NhZmVUb1Byb21vdGVBcmd1bWVudChQdHJBcmcsIGlzQnlWYWwpKQorICAgICAgQXJnc1RvUHJvbW90ZS5pbnNlcnQoUHRyQXJnKTsKKyAgfQorCisgIC8vIE5vIHByb21vdGFibGUgcG9pbnRlciBhcmd1bWVudHMuCisgIGlmIChBcmdzVG9Qcm9tb3RlLmVtcHR5KCkgJiYgQnlWYWxBcmdzVG9UcmFuc2Zvcm0uZW1wdHkoKSkgCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIERvUHJvbW90aW9uKEYsIEFyZ3NUb1Byb21vdGUsIEJ5VmFsQXJnc1RvVHJhbnNmb3JtKTsKK30KKworLy8vIElzQWx3YXlzVmFsaWRQb2ludGVyIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIGlzIGFsd2F5cyBsZWdhbAorLy8vIHRvIGxvYWQuCitzdGF0aWMgYm9vbCBJc0Fsd2F5c1ZhbGlkUG9pbnRlcihWYWx1ZSAqVikgeworICBpZiAoaXNhPEFsbG9jYUluc3Q+KFYpIHx8IGlzYTxHbG9iYWxWYXJpYWJsZT4oVikpIHJldHVybiB0cnVlOworICBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUCA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihWKSkKKyAgICByZXR1cm4gSXNBbHdheXNWYWxpZFBvaW50ZXIoR0VQLT5nZXRPcGVyYW5kKDApKTsKKyAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKQorICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpCisgICAgICByZXR1cm4gSXNBbHdheXNWYWxpZFBvaW50ZXIoQ0UtPmdldE9wZXJhbmQoMCkpOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEFsbENhbGxlZXNQYXNzSW5WYWxpZFBvaW50ZXJGb3JBcmd1bWVudCAtIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwcm92ZSB0aGF0CisvLy8gYWxsIGNhbGxlZXMgcGFzcyBpbiBhIHZhbGlkIHBvaW50ZXIgZm9yIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gYXJndW1lbnQuCitzdGF0aWMgYm9vbCBBbGxDYWxsZWVzUGFzc0luVmFsaWRQb2ludGVyRm9yQXJndW1lbnQoQXJndW1lbnQgKkFyZykgeworICBGdW5jdGlvbiAqQ2FsbGVlID0gQXJnLT5nZXRQYXJlbnQoKTsKKworICB1bnNpZ25lZCBBcmdObyA9IHN0ZDo6ZGlzdGFuY2UoQ2FsbGVlLT5hcmdfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IoQXJnKSk7CisKKyAgLy8gTG9vayBhdCBhbGwgY2FsbCBzaXRlcyBvZiB0aGUgZnVuY3Rpb24uICBBdCB0aGlzIHBvaW50ZXIgd2Uga25vdyB3ZSBvbmx5CisgIC8vIGhhdmUgZGlyZWN0IGNhbGxlZXMuCisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IENhbGxlZS0+dXNlX2JlZ2luKCksIEUgPSBDYWxsZWUtPnVzZV9lbmQoKTsKKyAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgQ2FsbFNpdGUgQ1MoKlVJKTsKKyAgICBhc3NlcnQoQ1MgJiYgIlNob3VsZCBvbmx5IGhhdmUgZGlyZWN0IGNhbGxzISIpOworCisgICAgaWYgKCFJc0Fsd2F5c1ZhbGlkUG9pbnRlcihDUy5nZXRBcmd1bWVudChBcmdObykpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gUmV0dXJucyB0cnVlIGlmIFByZWZpeCBpcyBhIHByZWZpeCBvZiBsb25nZXIuIFRoYXQgbWVhbnMsIExvbmdlciBoYXMgYSBzaXplCisvLy8gdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgcHJlZml4LCBhbmQgZWFjaCBvZiB0aGUKKy8vLyBlbGVtZW50cyBpbiBQcmVmaXggaXMgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gTG9uZ2VyLgorLy8vCisvLy8gVGhpcyBtZWFucyBpdCBhbHNvIHJldHVybnMgdHJ1ZSB3aGVuIFByZWZpeCBhbmQgTG9uZ2VyIGFyZSBlcXVhbCEKK3N0YXRpYyBib29sIElzUHJlZml4KGNvbnN0IEFyZ1Byb21vdGlvbjo6SW5kaWNlc1ZlY3RvciAmUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnUHJvbW90aW9uOjpJbmRpY2VzVmVjdG9yICZMb25nZXIpIHsKKyAgaWYgKFByZWZpeC5zaXplKCkgPiBMb25nZXIuc2l6ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFByZWZpeC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChQcmVmaXhbaV0gIT0gTG9uZ2VyW2ldKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8gQ2hlY2tzIGlmIEluZGljZXMsIG9yIGEgcHJlZml4IG9mIEluZGljZXMsIGlzIGluIFNldC4KK3N0YXRpYyBib29sIFByZWZpeEluKGNvbnN0IEFyZ1Byb21vdGlvbjo6SW5kaWNlc1ZlY3RvciAmSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PEFyZ1Byb21vdGlvbjo6SW5kaWNlc1ZlY3Rvcj4gJlNldCkgeworICAgIHN0ZDo6c2V0PEFyZ1Byb21vdGlvbjo6SW5kaWNlc1ZlY3Rvcj46Oml0ZXJhdG9yIExvdzsKKyAgICBMb3cgPSBTZXQudXBwZXJfYm91bmQoSW5kaWNlcyk7CisgICAgaWYgKExvdyAhPSBTZXQuYmVnaW4oKSkKKyAgICAgIExvdy0tOworICAgIC8vIExvdyBpcyBub3cgdGhlIGxhc3QgZWxlbWVudCBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gSW5kaWNlcy4gVGhpcyBtZWFucworICAgIC8vIGl0IHBvaW50cyB0byBhIHByZWZpeCBvZiBJbmRpY2VzIChwb3NzaWJseSBJbmRpY2VzIGl0c2VsZiksIGlmIHN1Y2gKKyAgICAvLyBwcmVmaXggZXhpc3RzLgorICAgIC8vCisgICAgLy8gVGhpcyBsb2FkIGlzIHNhZmUgaWYgYW55IHByZWZpeCBvZiBpdHMgb3BlcmFuZHMgaXMgc2FmZSB0byBsb2FkLgorICAgIHJldHVybiBMb3cgIT0gU2V0LmVuZCgpICYmIElzUHJlZml4KCpMb3csIEluZGljZXMpOworfQorCisvLy8gTWFyayB0aGUgZ2l2ZW4gaW5kaWNlcyAoVG9NYXJrKSBhcyBzYWZlIGluIHRoZSBnaXZlbiBzZXQgb2YgaW5kaWNlcworLy8vIChTYWZlKS4gTWFya2luZyBzYWZlIHVzdWFsbHkgbWVhbnMgYWRkaW5nIFRvTWFyayB0byBTYWZlLiBIb3dldmVyLCBpZiB0aGVyZQorLy8vIGlzIGFscmVhZHkgYSBwcmVmaXggb2YgSW5kaWNlcyBpbiBTYWZlLCBJbmRpY2VzIGFyZSBpbXBsaWNpdGVseSBtYXJrZWQgc2FmZQorLy8vIGFscmVhZHkuIEZ1cnRoZXJtb3JlLCBhbnkgaW5kaWNlcyB0aGF0IEluZGljZXMgaXMgaXRzZWxmIGEgcHJlZml4IG9mLCBhcmUKKy8vLyByZW1vdmVkIGZyb20gU2FmZSAoc2luY2UgdGhleSBhcmUgaW1wbGljaXRlbHkgc2FmZSBiZWNhdXNlIG9mIEluZGljZXMgbm93KS4KK3N0YXRpYyB2b2lkIE1hcmtJbmRpY2VzU2FmZShjb25zdCBBcmdQcm9tb3Rpb246OkluZGljZXNWZWN0b3IgJlRvTWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxBcmdQcm9tb3Rpb246OkluZGljZXNWZWN0b3I+ICZTYWZlKSB7CisgIHN0ZDo6c2V0PEFyZ1Byb21vdGlvbjo6SW5kaWNlc1ZlY3Rvcj46Oml0ZXJhdG9yIExvdzsKKyAgTG93ID0gU2FmZS51cHBlcl9ib3VuZChUb01hcmspOworICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSBjYXNlIHdoZXJlIFNhZmUgaXMgZW1wdHkKKyAgaWYgKExvdyAhPSBTYWZlLmJlZ2luKCkpCisgICAgTG93LS07CisgIC8vIExvdyBpcyBub3cgdGhlIGxhc3QgZWxlbWVudCBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gSW5kaWNlcy4gVGhpcworICAvLyBtZWFucyBpdCBwb2ludHMgdG8gYSBwcmVmaXggb2YgSW5kaWNlcyAocG9zc2libHkgSW5kaWNlcyBpdHNlbGYpLCBpZgorICAvLyBzdWNoIHByZWZpeCBleGlzdHMuCisgIGlmIChMb3cgIT0gU2FmZS5lbmQoKSkgeworICAgIGlmIChJc1ByZWZpeCgqTG93LCBUb01hcmspKQorICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHByZWZpeCBvZiB0aGVzZSBpbmRpY2VzIChvciBleGFjdGx5IHRoZXNlCisgICAgICAvLyBpbmRpY2VzKSBtYXJrZWQgYSBzYWZlLCBkb24ndCBib3RoZXIgYWRkaW5nIHRoZXNlIGluZGljZXMKKyAgICAgIHJldHVybjsKKworICAgIC8vIEluY3JlbWVudCBMb3csIHNvIHdlIGNhbiB1c2UgaXQgYXMgYSAiaW5zZXJ0IGJlZm9yZSIgaGludAorICAgICsrTG93OworICB9CisgIC8vIEluc2VydAorICBMb3cgPSBTYWZlLmluc2VydChMb3csIFRvTWFyayk7CisgICsrTG93OworICAvLyBJZiB0aGVyZSB3ZSdyZSBhIHByZWZpeCBvZiBsb25nZXIgaW5kZXggbGlzdChzKSwgcmVtb3ZlIHRob3NlCisgIHN0ZDo6c2V0PEFyZ1Byb21vdGlvbjo6SW5kaWNlc1ZlY3Rvcj46Oml0ZXJhdG9yIEVuZCA9IFNhZmUuZW5kKCk7CisgIHdoaWxlIChMb3cgIT0gRW5kICYmIElzUHJlZml4KFRvTWFyaywgKkxvdykpIHsKKyAgICBzdGQ6OnNldDxBcmdQcm9tb3Rpb246OkluZGljZXNWZWN0b3I+OjppdGVyYXRvciBSZW1vdmUgPSBMb3c7CisgICAgKytMb3c7CisgICAgU2FmZS5lcmFzZShSZW1vdmUpOworICB9Cit9CisKKy8vLyBpc1NhZmVUb1Byb21vdGVBcmd1bWVudCAtIEFzIHlvdSBtaWdodCBndWVzcyBmcm9tIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kLAorLy8vIGl0IGNoZWNrcyB0byBzZWUgaWYgaXQgaXMgYm90aCBzYWZlIGFuZCB1c2VmdWwgdG8gcHJvbW90ZSB0aGUgYXJndW1lbnQuCisvLy8gVGhpcyBtZXRob2QgbGltaXRzIHByb21vdGlvbiBvZiBhZ2dyZWdhdGVzIHRvIG9ubHkgcHJvbW90ZSB1cCB0byB0aHJlZQorLy8vIGVsZW1lbnRzIG9mIHRoZSBhZ2dyZWdhdGUgaW4gb3JkZXIgdG8gYXZvaWQgZXhwbG9kaW5nIHRoZSBudW1iZXIgb2YKKy8vLyBhcmd1bWVudHMgcGFzc2VkIGluLgorYm9vbCBBcmdQcm9tb3Rpb246OmlzU2FmZVRvUHJvbW90ZUFyZ3VtZW50KEFyZ3VtZW50ICpBcmcsIGJvb2wgaXNCeVZhbCkgY29uc3QgeworICB0eXBlZGVmIHN0ZDo6c2V0PEluZGljZXNWZWN0b3I+IEdFUEluZGljZXNTZXQ7CisKKyAgLy8gUXVpY2sgZXhpdCBmb3IgdW51c2VkIGFyZ3VtZW50cworICBpZiAoQXJnLT51c2VfZW1wdHkoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBXZSBjYW4gb25seSBwcm9tb3RlIHRoaXMgYXJndW1lbnQgaWYgYWxsIG9mIHRoZSB1c2VzIGFyZSBsb2Fkcywgb3IgYXJlIEdFUAorICAvLyBpbnN0cnVjdGlvbnMgKHdpdGggY29uc3RhbnQgaW5kaWNlcykgdGhhdCBhcmUgc3Vic2VxdWVudGx5IGxvYWRlZC4KKyAgLy8KKyAgLy8gUHJvbW90aW5nIHRoZSBhcmd1bWVudCBjYXVzZXMgaXQgdG8gYmUgbG9hZGVkIGluIHRoZSBjYWxsZXIKKyAgLy8gdW5jb25kaXRpb25hbGx5LiBUaGlzIGlzIG9ubHkgc2FmZSBpZiB3ZSBjYW4gcHJvdmUgdGhhdCBlaXRoZXIgdGhlIGxvYWQKKyAgLy8gd291bGQgaGF2ZSBoYXBwZW5lZCBpbiB0aGUgY2FsbGVlIGFueXdheSAoaWUsIHRoZXJlIGlzIGEgbG9hZCBpbiB0aGUgZW50cnkKKyAgLy8gYmxvY2spIG9yIHRoZSBwb2ludGVyIHBhc3NlZCBpbiBhdCBldmVyeSBjYWxsIHNpdGUgaXMgZ3VhcmFudGVlZCB0byBiZQorICAvLyB2YWxpZC4KKyAgLy8gSW4gdGhlIGZvcm1lciBjYXNlLCBpbnZhbGlkIGxvYWRzIGNhbiBoYXBwZW4sIGJ1dCB3b3VsZCBoYXZlIGhhcHBlbmVkCisgIC8vIGFueXdheSwgaW4gdGhlIGxhdHRlciBjYXNlLCBpbnZhbGlkIGxvYWRzIHdvbid0IGhhcHBlbi4gVGhpcyBwcmV2ZW50cyB1cworICAvLyBmcm9tIGludHJvZHVjaW5nIGFuIGludmFsaWQgbG9hZCB0aGF0IHdvdWxkbid0IGhhdmUgaGFwcGVuZWQgaW4gdGhlCisgIC8vIG9yaWdpbmFsIGNvZGUuCisgIC8vCisgIC8vIFRoaXMgc2V0IHdpbGwgY29udGFpbiBhbGwgc2V0cyBvZiBpbmRpY2VzIHRoYXQgYXJlIGxvYWRlZCBpbiB0aGUgZW50cnkKKyAgLy8gYmxvY2ssIGFuZCB0aHVzIGFyZSBzYWZlIHRvIHVuY29uZGl0aW9uYWxseSBsb2FkIGluIHRoZSBjYWxsZXIuCisgIEdFUEluZGljZXNTZXQgU2FmZVRvVW5jb25kaXRpb25hbGx5TG9hZDsKKworICAvLyBUaGlzIHNldCBjb250YWlucyBhbGwgdGhlIHNldHMgb2YgaW5kaWNlcyB0aGF0IHdlIGFyZSBwbGFubmluZyB0byBwcm9tb3RlLgorICAvLyBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGFkZGVkLgorICBHRVBJbmRpY2VzU2V0IFRvUHJvbW90ZTsKKworICAvLyBJZiB0aGUgcG9pbnRlciBpcyBhbHdheXMgdmFsaWQsIGFueSBsb2FkIHdpdGggZmlyc3QgaW5kZXggMCBpcyB2YWxpZC4KKyAgaWYgKGlzQnlWYWwgfHwgQWxsQ2FsbGVlc1Bhc3NJblZhbGlkUG9pbnRlckZvckFyZ3VtZW50KEFyZykpCisgICAgU2FmZVRvVW5jb25kaXRpb25hbGx5TG9hZC5pbnNlcnQoSW5kaWNlc1ZlY3RvcigxLCAwKSk7CisKKyAgLy8gRmlyc3QsIGl0ZXJhdGUgdGhlIGVudHJ5IGJsb2NrIGFuZCBtYXJrIGxvYWRzIG9mIChnZXBzIG9mKSBhcmd1bWVudHMgYXMKKyAgLy8gc2FmZS4KKyAgQmFzaWNCbG9jayAqRW50cnlCbG9jayA9IEFyZy0+Z2V0UGFyZW50KCktPmJlZ2luKCk7CisgIC8vIERlY2xhcmUgdGhpcyBoZXJlIHNvIHdlIGNhbiByZXVzZSBpdAorICBJbmRpY2VzVmVjdG9yIEluZGljZXM7CisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEVudHJ5QmxvY2stPmJlZ2luKCksIEUgPSBFbnRyeUJsb2NrLT5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KEkpKSB7CisgICAgICBWYWx1ZSAqViA9IExJLT5nZXRQb2ludGVyT3BlcmFuZCgpOworICAgICAgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVikpIHsKKyAgICAgICAgViA9IEdFUC0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgICAgICAgaWYgKFYgPT0gQXJnKSB7CisgICAgICAgICAgLy8gVGhpcyBsb2FkIGFjdHVhbGx5IGxvYWRzIChwYXJ0IG9mKSBBcmc/IENoZWNrIHRoZSBpbmRpY2VzIHRoZW4uCisgICAgICAgICAgSW5kaWNlcy5yZXNlcnZlKEdFUC0+Z2V0TnVtSW5kaWNlcygpKTsKKyAgICAgICAgICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIElJID0gR0VQLT5pZHhfYmVnaW4oKSwgSUUgPSBHRVAtPmlkeF9lbmQoKTsKKyAgICAgICAgICAgICAgIElJICE9IElFOyArK0lJKQorICAgICAgICAgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PigqSUkpKQorICAgICAgICAgICAgICBJbmRpY2VzLnB1c2hfYmFjayhDSS0+Z2V0U0V4dFZhbHVlKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIG5vbi1jb25zdGFudCBHRVAgaW5kZXggZm9yIHRoaXMgYXJndW1lbnQ/IEJhaWwgb3V0CisgICAgICAgICAgICAgIC8vIHJpZ2h0IGF3YXksIGNhbid0IHByb21vdGUgdGhpcyBhcmd1bWVudCBhdCBhbGwuCisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgIC8vIEluZGljZXMgY2hlY2tlZCBvdXQsIG1hcmsgdGhlbSBhcyBzYWZlCisgICAgICAgICAgTWFya0luZGljZXNTYWZlKEluZGljZXMsIFNhZmVUb1VuY29uZGl0aW9uYWxseUxvYWQpOworICAgICAgICAgIEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChWID09IEFyZykgeworICAgICAgICAvLyBEaXJlY3QgbG9hZHMgYXJlIGVxdWl2YWxlbnQgdG8gYSBHRVAgd2l0aCBhIHNpbmdsZSAwIGluZGV4LgorICAgICAgICBNYXJrSW5kaWNlc1NhZmUoSW5kaWNlc1ZlY3RvcigxLCAwKSwgU2FmZVRvVW5jb25kaXRpb25hbGx5TG9hZCk7CisgICAgICB9CisgICAgfQorCisgIC8vIE5vdywgaXRlcmF0ZSBhbGwgdXNlcyBvZiB0aGUgYXJndW1lbnQgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgdXNlcyB0aGF0IGFyZQorICAvLyBub3QgKEdFUCspbG9hZHMsIG9yIGFueSAoR0VQKylsb2FkcyB0aGF0IGFyZSBub3Qgc2FmZSB0byBwcm9tb3RlLgorICBTbWFsbFZlY3RvcjxMb2FkSW5zdCosIDE2PiBMb2FkczsKKyAgSW5kaWNlc1ZlY3RvciBPcGVyYW5kczsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gQXJnLT51c2VfYmVnaW4oKSwgRSA9IEFyZy0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IEU7ICsrVUkpIHsKKyAgICBVc2VyICpVID0gKlVJOworICAgIE9wZXJhbmRzLmNsZWFyKCk7CisgICAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihVKSkgeworICAgICAgaWYgKExJLT5pc1ZvbGF0aWxlKCkpIHJldHVybiBmYWxzZTsgIC8vIERvbid0IGhhY2sgdm9sYXRpbGUgbG9hZHMKKyAgICAgIExvYWRzLnB1c2hfYmFjayhMSSk7CisgICAgICAvLyBEaXJlY3QgbG9hZHMgYXJlIGVxdWl2YWxlbnQgdG8gYSBHRVAgd2l0aCBhIHplcm8gaW5kZXggYW5kIHRoZW4gYSBsb2FkLgorICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKDApOworICAgIH0gZWxzZSBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUCA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihVKSkgeworICAgICAgaWYgKEdFUC0+dXNlX2VtcHR5KCkpIHsKKyAgICAgICAgLy8gRGVhZCBHRVAncyBjYXVzZSB0cm91YmxlIGxhdGVyLiAgSnVzdCByZW1vdmUgdGhlbSBpZiB3ZSBydW4gaW50bworICAgICAgICAvLyB0aGVtLgorICAgICAgICBnZXRBbmFseXNpczxBbGlhc0FuYWx5c2lzPigpLmRlbGV0ZVZhbHVlKEdFUCk7CisgICAgICAgIEdFUC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIC8vIFRPRE86IFRoaXMgcnVucyB0aGUgYWJvdmUgbG9vcCBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBkZWFkIEdFUHMKKyAgICAgICAgLy8gQ291bGRuJ3Qgd2UganVzdCBkbyBpbmNyZW1lbnQgdGhlIFVJIGl0ZXJhdG9yIGVhcmxpZXIgYW5kIGVyYXNlIHRoZQorICAgICAgICAvLyB1c2U/CisgICAgICAgIHJldHVybiBpc1NhZmVUb1Byb21vdGVBcmd1bWVudChBcmcsIGlzQnlWYWwpOworICAgICAgfQorCisgICAgICAvLyBFbnN1cmUgdGhhdCBhbGwgb2YgdGhlIGluZGljZXMgYXJlIGNvbnN0YW50cy4KKyAgICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgaSA9IEdFUC0+aWR4X2JlZ2luKCksIGUgPSBHRVAtPmlkeF9lbmQoKTsKKyAgICAgICAgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PigqaSkpCisgICAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKEMtPmdldFNFeHRWYWx1ZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIE5vdCBhIGNvbnN0YW50IG9wZXJhbmQgR0VQIQorCisgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb25seSB1c2VycyBvZiB0aGUgR0VQIGFyZSBsb2FkIGluc3RydWN0aW9ucy4KKyAgICAgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEdFUC0+dXNlX2JlZ2luKCksIEUgPSBHRVAtPnVzZV9lbmQoKTsKKyAgICAgICAgICAgVUkgIT0gRTsgKytVSSkKKyAgICAgICAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PigqVUkpKSB7CisgICAgICAgICAgaWYgKExJLT5pc1ZvbGF0aWxlKCkpIHJldHVybiBmYWxzZTsgIC8vIERvbid0IGhhY2sgdm9sYXRpbGUgbG9hZHMKKyAgICAgICAgICBMb2Fkcy5wdXNoX2JhY2soTEkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIE90aGVyIHVzZXMgdGhhbiBsb2FkPworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBOb3QgYSBsb2FkIG9yIGEgR0VQLgorICAgIH0KKworICAgIC8vIE5vdywgc2VlIGlmIGl0IGlzIHNhZmUgdG8gcHJvbW90ZSB0aGlzIGxvYWQgLyBsb2FkcyBvZiB0aGlzIEdFUC4gTG9hZGluZworICAgIC8vIGlzIHNhZmUgaWYgT3BlcmFuZHMsIG9yIGEgcHJlZml4IG9mIE9wZXJhbmRzLCBpcyBtYXJrZWQgYXMgc2FmZS4KKyAgICBpZiAoIVByZWZpeEluKE9wZXJhbmRzLCBTYWZlVG9VbmNvbmRpdGlvbmFsbHlMb2FkKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFNlZSBpZiB3ZSBhcmUgYWxyZWFkeSBwcm9tb3RpbmcgYSBsb2FkIHdpdGggdGhlc2UgaW5kaWNlcy4gSWYgbm90LCBjaGVjaworICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZW4ndCBwcm9tb3RpbmcgdG9vIG1hbnkgZWxlbWVudHMuICBJZiBzbywgbm90aGluZworICAgIC8vIHRvIGRvLgorICAgIGlmIChUb1Byb21vdGUuZmluZChPcGVyYW5kcykgPT0gVG9Qcm9tb3RlLmVuZCgpKSB7CisgICAgICBpZiAobWF4RWxlbWVudHMgPiAwICYmIFRvUHJvbW90ZS5zaXplKCkgPT0gbWF4RWxlbWVudHMpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJhcmdwcm9tb3Rpb24gbm90IHByb21vdGluZyBhcmd1bWVudCAnIgorICAgICAgICAgICAgICA8PCBBcmctPmdldE5hbWUoKSA8PCAiJyBiZWNhdXNlIGl0IHdvdWxkIHJlcXVpcmUgYWRkaW5nIG1vcmUgIgorICAgICAgICAgICAgICA8PCAidGhhbiAiIDw8IG1heEVsZW1lbnRzIDw8ICIgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi5cbiIpOworICAgICAgICAvLyBXZSBsaW1pdCBhZ2dyZWdhdGUgcHJvbW90aW9uIHRvIG9ubHkgcHJvbW90aW5nIHVwIHRvIGEgZml4ZWQgbnVtYmVyCisgICAgICAgIC8vIG9mIGVsZW1lbnRzIG9mIHRoZSBhZ2dyZWdhdGUuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIFRvUHJvbW90ZS5pbnNlcnQoT3BlcmFuZHMpOworICAgIH0KKyAgfQorCisgIGlmIChMb2Fkcy5lbXB0eSgpKSByZXR1cm4gdHJ1ZTsgIC8vIE5vIHVzZXJzLCB0aGlzIGlzIGEgZGVhZCBhcmd1bWVudC4KKworICAvLyBPa2F5LCBub3cgd2Uga25vdyB0aGF0IHRoZSBhcmd1bWVudCBpcyBvbmx5IHVzZWQgYnkgbG9hZCBpbnN0cnVjdGlvbnMgYW5kCisgIC8vIGl0IGlzIHNhZmUgdG8gdW5jb25kaXRpb25hbGx5IHBlcmZvcm0gYWxsIG9mIHRoZW0uIFVzZSBhbGlhcyBhbmFseXNpcyB0bworICAvLyBjaGVjayB0byBzZWUgaWYgdGhlIHBvaW50ZXIgaXMgZ3VhcmFudGVlZCB0byBub3QgYmUgbW9kaWZpZWQgZnJvbSBlbnRyeSBvZgorICAvLyB0aGUgZnVuY3Rpb24gdG8gZWFjaCBvZiB0aGUgbG9hZCBpbnN0cnVjdGlvbnMuCisKKyAgLy8gQmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBzZXZlcmFsL21hbnkgbG9hZCBpbnN0cnVjdGlvbnMsIHJlbWVtYmVyIHdoaWNoCisgIC8vIGJsb2NrcyB3ZSBrbm93IHRvIGJlIHRyYW5zcGFyZW50IHRvIHRoZSBsb2FkLgorICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgMTY+IFRyYW5zcEJsb2NrczsKKworICBBbGlhc0FuYWx5c2lzICZBQSA9IGdldEFuYWx5c2lzPEFsaWFzQW5hbHlzaXM+KCk7CisgIFRhcmdldERhdGEgKlREID0gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxUYXJnZXREYXRhPigpOworICBpZiAoIVREKSByZXR1cm4gZmFsc2U7IC8vIFdpdGhvdXQgVGFyZ2V0RGF0YSwgYXNzdW1lIHRoZSB3b3JzdC4KKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTG9hZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbG9hZCBpcyBpbnZhbGlkYXRlZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgdG8KKyAgICAvLyB0aGUgbG9hZCBpdHNlbGYuCisgICAgTG9hZEluc3QgKkxvYWQgPSBMb2Fkc1tpXTsKKyAgICBCYXNpY0Jsb2NrICpCQiA9IExvYWQtPmdldFBhcmVudCgpOworCisgICAgY29uc3QgUG9pbnRlclR5cGUgKkxvYWRUeSA9CisgICAgICBjYXN0PFBvaW50ZXJUeXBlPihMb2FkLT5nZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCkpOworICAgIHVuc2lnbmVkIExvYWRTaXplID0odW5zaWduZWQpVEQtPmdldFR5cGVTdG9yZVNpemUoTG9hZFR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKworICAgIGlmIChBQS5jYW5JbnN0cnVjdGlvblJhbmdlTW9kaWZ5KEJCLT5mcm9udCgpLCAqTG9hZCwgQXJnLCBMb2FkU2l6ZSkpCisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBQb2ludGVyIGlzIGludmFsaWRhdGVkIQorCisgICAgLy8gTm93IGNoZWNrIGV2ZXJ5IHBhdGggZnJvbSB0aGUgZW50cnkgYmxvY2sgdG8gdGhlIGxvYWQgZm9yIHRyYW5zcGFyZW5jeS4KKyAgICAvLyBUbyBkbyB0aGlzLCB3ZSBwZXJmb3JtIGEgZGVwdGggZmlyc3Qgc2VhcmNoIG9uIHRoZSBpbnZlcnNlIENGRyBmcm9tIHRoZQorICAgIC8vIGxvYWRpbmcgYmxvY2suCisgICAgZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihCQiksIEUgPSBwcmVkX2VuZChCQik7IFBJICE9IEU7ICsrUEkpIHsKKyAgICAgIEJhc2ljQmxvY2sgKlAgPSAqUEk7CisgICAgICBmb3IgKGlkZl9leHRfaXRlcmF0b3I8QmFzaWNCbG9jayosIFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sqLCAxNj4gPgorICAgICAgICAgICAgIEkgPSBpZGZfZXh0X2JlZ2luKFAsIFRyYW5zcEJsb2NrcyksCisgICAgICAgICAgICAgRSA9IGlkZl9leHRfZW5kKFAsIFRyYW5zcEJsb2Nrcyk7IEkgIT0gRTsgKytJKQorICAgICAgICBpZiAoQUEuY2FuQmFzaWNCbG9ja01vZGlmeSgqKkksIEFyZywgTG9hZFNpemUpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgcGF0aCBmcm9tIHRoZSBlbnRyeSBvZiB0aGUgZnVuY3Rpb24gdG8gZWFjaCBsb2FkIGlzIGZyZWUgb2YKKyAgLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgcG90ZW50aWFsbHkgaW52YWxpZGF0ZSB0aGUgbG9hZCwgd2UgY2FuIG1ha2UgdGhlCisgIC8vIHRyYW5zZm9ybWF0aW9uIQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIERvUHJvbW90aW9uIC0gVGhpcyBtZXRob2QgYWN0dWFsbHkgcGVyZm9ybXMgdGhlIHByb21vdGlvbiBvZiB0aGUgc3BlY2lmaWVkCisvLy8gYXJndW1lbnRzLCBhbmQgcmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLiAgQXQgdGhpcyBwb2ludCwgd2Uga25vdyB0aGF0IGl0J3MKKy8vLyBzYWZlIHRvIGRvIHNvLgorQ2FsbEdyYXBoTm9kZSAqQXJnUHJvbW90aW9uOjpEb1Byb21vdGlvbihGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxBcmd1bWVudCosIDg+ICZBcmdzVG9Qcm9tb3RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8QXJndW1lbnQqLCA4PiAmQnlWYWxBcmdzVG9UcmFuc2Zvcm0pIHsKKworICAvLyBTdGFydCBieSBjb21wdXRpbmcgYSBuZXcgcHJvdG90eXBlIGZvciB0aGUgZnVuY3Rpb24sIHdoaWNoIGlzIHRoZSBzYW1lIGFzCisgIC8vIHRoZSBvbGQgZnVuY3Rpb24sIGJ1dCBoYXMgbW9kaWZpZWQgYXJndW1lbnRzLgorICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IEYtPmdldEZ1bmN0aW9uVHlwZSgpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gUGFyYW1zOworCisgIHR5cGVkZWYgc3RkOjpzZXQ8SW5kaWNlc1ZlY3Rvcj4gU2NhbGFyaXplVGFibGU7CisKKyAgLy8gU2NhbGFyaXplZEVsZW1lbnRzIC0gSWYgd2UgYXJlIHByb21vdGluZyBhIHBvaW50ZXIgdGhhdCBoYXMgZWxlbWVudHMKKyAgLy8gYWNjZXNzZWQgb3V0IG9mIGl0LCBrZWVwIHRyYWNrIG9mIHdoaWNoIGVsZW1lbnRzIGFyZSBhY2Nlc3NlZCBzbyB0aGF0IHdlCisgIC8vIGNhbiBhZGQgb25lIGFyZ3VtZW50IGZvciBlYWNoLgorICAvLworICAvLyBBcmd1bWVudHMgdGhhdCBhcmUgZGlyZWN0bHkgbG9hZGVkIHdpbGwgaGF2ZSBhIHplcm8gZWxlbWVudCB2YWx1ZSBoZXJlLCB0bworICAvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlcmUgYXJlIGJvdGggYSBkaXJlY3QgbG9hZCBhbmQgR0VQIGFjY2Vzc2VzLgorICAvLworICBzdGQ6Om1hcDxBcmd1bWVudCosIFNjYWxhcml6ZVRhYmxlPiBTY2FsYXJpemVkRWxlbWVudHM7CisKKyAgLy8gT3JpZ2luYWxMb2FkcyAtIEtlZXAgdHJhY2sgb2YgYSByZXByZXNlbnRhdGl2ZSBsb2FkIGluc3RydWN0aW9uIGZyb20gdGhlCisgIC8vIG9yaWdpbmFsIGZ1bmN0aW9uIHNvIHRoYXQgd2UgY2FuIHRlbGwgdGhlIGFsaWFzIGFuYWx5c2lzIGltcGxlbWVudGF0aW9uCisgIC8vIHdoYXQgdGhlIG5ldyBHRVAvTG9hZCBpbnN0cnVjdGlvbnMgd2UgYXJlIGluc2VydGluZyBsb29rIGxpa2UuCisgIHN0ZDo6bWFwPEluZGljZXNWZWN0b3IsIExvYWRJbnN0Kj4gT3JpZ2luYWxMb2FkczsKKworICAvLyBBdHRyaWJ1dGVzIC0gS2VlcCB0cmFjayBvZiB0aGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgZm9yIHRoZSBhcmd1bWVudHMKKyAgLy8gdGhhdCB3ZSBhcmUgKm5vdCogcHJvbW90aW5nLiBGb3IgdGhlIG9uZXMgdGhhdCB3ZSBkbyBwcm9tb3RlLCB0aGUgcGFyYW1ldGVyCisgIC8vIGF0dHJpYnV0ZXMgYXJlIGxvc3QKKyAgU21hbGxWZWN0b3I8QXR0cmlidXRlV2l0aEluZGV4LCA4PiBBdHRyaWJ1dGVzVmVjOworICBjb25zdCBBdHRyTGlzdFB0ciAmUEFMID0gRi0+Z2V0QXR0cmlidXRlcygpOworCisgIC8vIEFkZCBhbnkgcmV0dXJuIGF0dHJpYnV0ZXMuCisgIGlmIChBdHRyaWJ1dGVzIGF0dHJzID0gUEFMLmdldFJldEF0dHJpYnV0ZXMoKSkKKyAgICBBdHRyaWJ1dGVzVmVjLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCgwLCBhdHRycykpOworCisgIC8vIEZpcnN0LCBkZXRlcm1pbmUgdGhlIG5ldyBhcmd1bWVudCBsaXN0CisgIHVuc2lnbmVkIEFyZ0luZGV4ID0gMTsKKyAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEkgPSBGLT5hcmdfYmVnaW4oKSwgRSA9IEYtPmFyZ19lbmQoKTsgSSAhPSBFOworICAgICAgICsrSSwgKytBcmdJbmRleCkgeworICAgIGlmIChCeVZhbEFyZ3NUb1RyYW5zZm9ybS5jb3VudChJKSkgeworICAgICAgLy8gU2ltcGxlIGJ5dmFsIGFyZ3VtZW50PyBKdXN0IGFkZCBhbGwgdGhlIHN0cnVjdCBlbGVtZW50IHR5cGVzLgorICAgICAgY29uc3QgVHlwZSAqQWdUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KEktPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICBjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBjYXN0PFN0cnVjdFR5cGU+KEFnVHkpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNUeS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIFBhcmFtcy5wdXNoX2JhY2soU1R5LT5nZXRFbGVtZW50VHlwZShpKSk7CisgICAgICArK051bUJ5VmFsQXJnc1Byb21vdGVkOworICAgIH0gZWxzZSBpZiAoIUFyZ3NUb1Byb21vdGUuY291bnQoSSkpIHsKKyAgICAgIC8vIFVuY2hhbmdlZCBhcmd1bWVudAorICAgICAgUGFyYW1zLnB1c2hfYmFjayhJLT5nZXRUeXBlKCkpOworICAgICAgaWYgKEF0dHJpYnV0ZXMgYXR0cnMgPSBQQUwuZ2V0UGFyYW1BdHRyaWJ1dGVzKEFyZ0luZGV4KSkKKyAgICAgICAgQXR0cmlidXRlc1ZlYy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoUGFyYW1zLnNpemUoKSwgYXR0cnMpKTsKKyAgICB9IGVsc2UgaWYgKEktPnVzZV9lbXB0eSgpKSB7CisgICAgICAvLyBEZWFkIGFyZ3VtZW50ICh3aGljaCBhcmUgYWx3YXlzIG1hcmtlZCBhcyBwcm9tb3RhYmxlKQorICAgICAgKytOdW1Bcmd1bWVudHNEZWFkOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPa2F5LCB0aGlzIGlzIGJlaW5nIHByb21vdGVkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG9ubHkgdXNlcyBhcmUgbG9hZHMKKyAgICAgIC8vIG9yIEdFUHMgd2hpY2ggYXJlIG9ubHkgdXNlZCBieSBsb2FkcworCisgICAgICAvLyBJbiB0aGlzIHRhYmxlLCB3ZSB3aWxsIHRyYWNrIHdoaWNoIGluZGljZXMgYXJlIGxvYWRlZCBmcm9tIHRoZSBhcmd1bWVudAorICAgICAgLy8gKHdoZXJlIGRpcmVjdCBsb2FkcyBhcmUgdHJhY2tlZCBhcyBubyBpbmRpY2VzKS4KKyAgICAgIFNjYWxhcml6ZVRhYmxlICZBcmdJbmRpY2VzID0gU2NhbGFyaXplZEVsZW1lbnRzW0ldOworICAgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gSS0+dXNlX2JlZ2luKCksIEUgPSBJLT51c2VfZW5kKCk7IFVJICE9IEU7CisgICAgICAgICAgICsrVUkpIHsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gKlVzZXIgPSBjYXN0PEluc3RydWN0aW9uPigqVUkpOworICAgICAgICBhc3NlcnQoaXNhPExvYWRJbnN0PihVc2VyKSB8fCBpc2E8R2V0RWxlbWVudFB0ckluc3Q+KFVzZXIpKTsKKyAgICAgICAgSW5kaWNlc1ZlY3RvciBJbmRpY2VzOworICAgICAgICBJbmRpY2VzLnJlc2VydmUoVXNlci0+Z2V0TnVtT3BlcmFuZHMoKSAtIDEpOworICAgICAgICAvLyBTaW5jZSBsb2FkcyB3aWxsIG9ubHkgaGF2ZSBhIHNpbmdsZSBvcGVyYW5kLCBhbmQgR0VQcyBvbmx5IGEgc2luZ2xlCisgICAgICAgIC8vIG5vbi1pbmRleCBvcGVyYW5kLCB0aGlzIHdpbGwgcmVjb3JkIGRpcmVjdCBsb2FkcyB3aXRob3V0IGFueSBpbmRpY2VzLAorICAgICAgICAvLyBhbmQgZ2VwK2xvYWRzIHdpdGggdGhlIEdFUCBpbmRpY2VzLgorICAgICAgICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIElJID0gVXNlci0+b3BfYmVnaW4oKSArIDEsIElFID0gVXNlci0+b3BfZW5kKCk7CisgICAgICAgICAgICAgSUkgIT0gSUU7ICsrSUkpCisgICAgICAgICAgSW5kaWNlcy5wdXNoX2JhY2soY2FzdDxDb25zdGFudEludD4oKklJKS0+Z2V0U0V4dFZhbHVlKCkpOworICAgICAgICAvLyBHRVBzIHdpdGggYSBzaW5nbGUgMCBpbmRleCBjYW4gYmUgbWVyZ2VkIHdpdGggZGlyZWN0IGxvYWRzCisgICAgICAgIGlmIChJbmRpY2VzLnNpemUoKSA9PSAxICYmIEluZGljZXMuZnJvbnQoKSA9PSAwKQorICAgICAgICAgIEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgQXJnSW5kaWNlcy5pbnNlcnQoSW5kaWNlcyk7CisgICAgICAgIExvYWRJbnN0ICpPcmlnTG9hZDsKKyAgICAgICAgaWYgKExvYWRJbnN0ICpMID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFVzZXIpKQorICAgICAgICAgIE9yaWdMb2FkID0gTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIC8vIFRha2UgYW55IGxvYWQsIHdlIHdpbGwgdXNlIGl0IG9ubHkgdG8gdXBkYXRlIEFsaWFzIEFuYWx5c2lzCisgICAgICAgICAgT3JpZ0xvYWQgPSBjYXN0PExvYWRJbnN0PihVc2VyLT51c2VfYmFjaygpKTsKKyAgICAgICAgT3JpZ2luYWxMb2Fkc1tJbmRpY2VzXSA9IE9yaWdMb2FkOworICAgICAgfQorCisgICAgICAvLyBBZGQgYSBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uIGZvciBlYWNoIGVsZW1lbnQgcGFzc2VkIGluLgorICAgICAgZm9yIChTY2FsYXJpemVUYWJsZTo6aXRlcmF0b3IgU0kgPSBBcmdJbmRpY2VzLmJlZ2luKCksCisgICAgICAgICAgICAgRSA9IEFyZ0luZGljZXMuZW5kKCk7IFNJICE9IEU7ICsrU0kpIHsKKyAgICAgICAgLy8gbm90IGFsbG93ZWQgdG8gZGVyZWZlcmVuY2UgLT5iZWdpbigpIGlmIHNpemUoKSBpcyAwCisgICAgICAgIFBhcmFtcy5wdXNoX2JhY2soR2V0RWxlbWVudFB0ckluc3Q6OmdldEluZGV4ZWRUeXBlKEktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ktPmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJLT5lbmQoKSkpOworICAgICAgICBhc3NlcnQoUGFyYW1zLmJhY2soKSk7CisgICAgICB9CisKKyAgICAgIGlmIChBcmdJbmRpY2VzLnNpemUoKSA9PSAxICYmIEFyZ0luZGljZXMuYmVnaW4oKS0+ZW1wdHkoKSkKKyAgICAgICAgKytOdW1Bcmd1bWVudHNQcm9tb3RlZDsKKyAgICAgIGVsc2UKKyAgICAgICAgKytOdW1BZ2dyZWdhdGVzUHJvbW90ZWQ7CisgICAgfQorICB9CisKKyAgLy8gQWRkIGFueSBmdW5jdGlvbiBhdHRyaWJ1dGVzLgorICBpZiAoQXR0cmlidXRlcyBhdHRycyA9IFBBTC5nZXRGbkF0dHJpYnV0ZXMoKSkKKyAgICBBdHRyaWJ1dGVzVmVjLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCh+MCwgYXR0cnMpKTsKKworICBjb25zdCBUeXBlICpSZXRUeSA9IEZUeS0+Z2V0UmV0dXJuVHlwZSgpOworCisgIC8vIFdvcmsgYXJvdW5kIExMVk0gYnVnIFBSNTY6IHRoZSBDV3JpdGVyIGNhbm5vdCBlbWl0IHZhcmFyZ3MgZnVuY3Rpb25zIHdoaWNoCisgIC8vIGhhdmUgemVybyBmaXhlZCBhcmd1bWVudHMuCisgIGJvb2wgRXh0cmFBcmdIYWNrID0gZmFsc2U7CisgIGlmIChQYXJhbXMuZW1wdHkoKSAmJiBGVHktPmlzVmFyQXJnKCkpIHsKKyAgICBFeHRyYUFyZ0hhY2sgPSB0cnVlOworICAgIFBhcmFtcy5wdXNoX2JhY2soVHlwZTo6Z2V0SW50MzJUeShGLT5nZXRDb250ZXh0KCkpKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdCB0aGUgbmV3IGZ1bmN0aW9uIHR5cGUgdXNpbmcgdGhlIG5ldyBhcmd1bWVudHMuCisgIEZ1bmN0aW9uVHlwZSAqTkZUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KFJldFR5LCBQYXJhbXMsIEZUeS0+aXNWYXJBcmcoKSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBuZXcgZnVuY3Rpb24gYm9keSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIG1vZHVsZS4KKyAgRnVuY3Rpb24gKk5GID0gRnVuY3Rpb246OkNyZWF0ZShORlR5LCBGLT5nZXRMaW5rYWdlKCksIEYtPmdldE5hbWUoKSk7CisgIE5GLT5jb3B5QXR0cmlidXRlc0Zyb20oRik7CisKKyAgCisgIERFQlVHKGRiZ3MoKSA8PCAiQVJHIFBST01PVElPTjogIFByb21vdGluZyB0bzoiIDw8ICpORiA8PCAiXG4iCisgICAgICAgIDw8ICJGcm9tOiAiIDw8ICpGKTsKKyAgCisgIC8vIFJlY29tcHV0ZSB0aGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgbGlzdCBiYXNlZCBvbiB0aGUgbmV3IGFyZ3VtZW50cyBmb3IKKyAgLy8gdGhlIGZ1bmN0aW9uLgorICBORi0+c2V0QXR0cmlidXRlcyhBdHRyTGlzdFB0cjo6Z2V0KEF0dHJpYnV0ZXNWZWMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzVmVjLmVuZCgpKSk7CisgIEF0dHJpYnV0ZXNWZWMuY2xlYXIoKTsKKworICBGLT5nZXRQYXJlbnQoKS0+Z2V0RnVuY3Rpb25MaXN0KCkuaW5zZXJ0KEYsIE5GKTsKKyAgTkYtPnRha2VOYW1lKEYpOworCisgIC8vIEdldCB0aGUgYWxpYXMgYW5hbHlzaXMgaW5mb3JtYXRpb24gdGhhdCB3ZSBuZWVkIHRvIHVwZGF0ZSB0byByZWZsZWN0IG91cgorICAvLyBjaGFuZ2VzLgorICBBbGlhc0FuYWx5c2lzICZBQSA9IGdldEFuYWx5c2lzPEFsaWFzQW5hbHlzaXM+KCk7CisKKyAgLy8gR2V0IHRoZSBjYWxsZ3JhcGggaW5mb3JtYXRpb24gdGhhdCB3ZSBuZWVkIHRvIHVwZGF0ZSB0byByZWZsZWN0IG91cgorICAvLyBjaGFuZ2VzLgorICBDYWxsR3JhcGggJkNHID0gZ2V0QW5hbHlzaXM8Q2FsbEdyYXBoPigpOworICAKKyAgLy8gR2V0IGEgbmV3IGNhbGxncmFwaCBub2RlIGZvciBORi4KKyAgQ2FsbEdyYXBoTm9kZSAqTkZfQ0dOID0gQ0cuZ2V0T3JJbnNlcnRGdW5jdGlvbihORik7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgY2FsbGVycyBvZiB0aGUgZnVuY3Rpb24sIHRyYW5zZm9ybWluZyB0aGUgY2FsbCBzaXRlcworICAvLyB0byBwYXNzIGluIHRoZSBsb2FkZWQgcG9pbnRlcnMuCisgIC8vCisgIFNtYWxsVmVjdG9yPFZhbHVlKiwgMTY+IEFyZ3M7CisgIHdoaWxlICghRi0+dXNlX2VtcHR5KCkpIHsKKyAgICBDYWxsU2l0ZSBDUyhGLT51c2VfYmFjaygpKTsKKyAgICBhc3NlcnQoQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKSA9PSBGKTsKKyAgICBJbnN0cnVjdGlvbiAqQ2FsbCA9IENTLmdldEluc3RydWN0aW9uKCk7CisgICAgY29uc3QgQXR0ckxpc3RQdHIgJkNhbGxQQUwgPSBDUy5nZXRBdHRyaWJ1dGVzKCk7CisKKyAgICAvLyBBZGQgYW55IHJldHVybiBhdHRyaWJ1dGVzLgorICAgIGlmIChBdHRyaWJ1dGVzIGF0dHJzID0gQ2FsbFBBTC5nZXRSZXRBdHRyaWJ1dGVzKCkpCisgICAgICBBdHRyaWJ1dGVzVmVjLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCgwLCBhdHRycykpOworCisgICAgLy8gTG9vcCBvdmVyIHRoZSBvcGVyYW5kcywgaW5zZXJ0aW5nIEdFUCBhbmQgbG9hZHMgaW4gdGhlIGNhbGxlciBhcworICAgIC8vIGFwcHJvcHJpYXRlLgorICAgIENhbGxTaXRlOjphcmdfaXRlcmF0b3IgQUkgPSBDUy5hcmdfYmVnaW4oKTsKKyAgICBBcmdJbmRleCA9IDE7CisgICAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEkgPSBGLT5hcmdfYmVnaW4oKSwgRSA9IEYtPmFyZ19lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJLCArK0FJLCArK0FyZ0luZGV4KQorICAgICAgaWYgKCFBcmdzVG9Qcm9tb3RlLmNvdW50KEkpICYmICFCeVZhbEFyZ3NUb1RyYW5zZm9ybS5jb3VudChJKSkgeworICAgICAgICBBcmdzLnB1c2hfYmFjaygqQUkpOyAgICAgICAgICAvLyBVbm1vZGlmaWVkIGFyZ3VtZW50CisKKyAgICAgICAgaWYgKEF0dHJpYnV0ZXMgQXR0cnMgPSBDYWxsUEFMLmdldFBhcmFtQXR0cmlidXRlcyhBcmdJbmRleCkpCisgICAgICAgICAgQXR0cmlidXRlc1ZlYy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoQXJncy5zaXplKCksIEF0dHJzKSk7CisKKyAgICAgIH0gZWxzZSBpZiAoQnlWYWxBcmdzVG9UcmFuc2Zvcm0uY291bnQoSSkpIHsKKyAgICAgICAgLy8gRW1pdCBhIEdFUCBhbmQgbG9hZCBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBzdHJ1Y3QuCisgICAgICAgIGNvbnN0IFR5cGUgKkFnVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihJLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICBjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBjYXN0PFN0cnVjdFR5cGU+KEFnVHkpOworICAgICAgICBWYWx1ZSAqSWR4c1syXSA9IHsKKyAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEYtPmdldENvbnRleHQoKSksIDApLCAwIH07CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgSWR4c1sxXSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShGLT5nZXRDb250ZXh0KCkpLCBpKTsKKyAgICAgICAgICBWYWx1ZSAqSWR4ID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZSgqQUksIElkeHMsIElkeHMrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKkFJKS0+Z2V0TmFtZSgpKyIuIit1dG9zdHIoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCk7CisgICAgICAgICAgLy8gVE9ETzogVGVsbCBBQSBhYm91dCB0aGUgbmV3IHZhbHVlcz8KKyAgICAgICAgICBBcmdzLnB1c2hfYmFjayhuZXcgTG9hZEluc3QoSWR4LCBJZHgtPmdldE5hbWUoKSsiLnZhbCIsIENhbGwpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghSS0+dXNlX2VtcHR5KCkpIHsKKyAgICAgICAgLy8gTm9uLWRlYWQgYXJndW1lbnQ6IGluc2VydCBHRVBzIGFuZCBsb2FkcyBhcyBhcHByb3ByaWF0ZS4KKyAgICAgICAgU2NhbGFyaXplVGFibGUgJkFyZ0luZGljZXMgPSBTY2FsYXJpemVkRWxlbWVudHNbSV07CisgICAgICAgIC8vIFN0b3JlIHRoZSBWYWx1ZSogdmVyc2lvbiBvZiB0aGUgaW5kaWNlcyBpbiBoZXJlLCBidXQgZGVjbGFyZSBpdCBub3cKKyAgICAgICAgLy8gZm9yIHJldXNlLgorICAgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IE9wczsKKyAgICAgICAgZm9yIChTY2FsYXJpemVUYWJsZTo6aXRlcmF0b3IgU0kgPSBBcmdJbmRpY2VzLmJlZ2luKCksCisgICAgICAgICAgICAgICBFID0gQXJnSW5kaWNlcy5lbmQoKTsgU0kgIT0gRTsgKytTSSkgeworICAgICAgICAgIFZhbHVlICpWID0gKkFJOworICAgICAgICAgIExvYWRJbnN0ICpPcmlnTG9hZCA9IE9yaWdpbmFsTG9hZHNbKlNJXTsKKyAgICAgICAgICBpZiAoIVNJLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBPcHMucmVzZXJ2ZShTSS0+c2l6ZSgpKTsKKyAgICAgICAgICAgIGNvbnN0IFR5cGUgKkVsVHkgPSBWLT5nZXRUeXBlKCk7CisgICAgICAgICAgICBmb3IgKEluZGljZXNWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIElJID0gU0ktPmJlZ2luKCksCisgICAgICAgICAgICAgICAgIElFID0gU0ktPmVuZCgpOyBJSSAhPSBJRTsgKytJSSkgeworICAgICAgICAgICAgICAvLyBVc2UgaTMyIHRvIGluZGV4IHN0cnVjdHMsIGFuZCBpNjQgZm9yIG90aGVycyAocG9pbnRlcnMvYXJyYXlzKS4KKyAgICAgICAgICAgICAgLy8gVGhpcyBzYXRpc2ZpZXMgR0VQIGNvbnN0cmFpbnRzLgorICAgICAgICAgICAgICBjb25zdCBUeXBlICpJZHhUeSA9IChFbFR5LT5pc1N0cnVjdFR5KCkgPworICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQzMlR5KEYtPmdldENvbnRleHQoKSkgOiAKKyAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50NjRUeShGLT5nZXRDb250ZXh0KCkpKTsKKyAgICAgICAgICAgICAgT3BzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KElkeFR5LCAqSUkpKTsKKyAgICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgdHlwZSB3ZSdyZSBjdXJyZW50bHkgaW5kZXhpbmcuCisgICAgICAgICAgICAgIEVsVHkgPSBjYXN0PENvbXBvc2l0ZVR5cGU+KEVsVHkpLT5nZXRUeXBlQXRJbmRleCgqSUkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQW5kIGNyZWF0ZSBhIEdFUCB0byBleHRyYWN0IHRob3NlIGluZGljZXMuCisgICAgICAgICAgICBWID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShWLCBPcHMuYmVnaW4oKSwgT3BzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVi0+Z2V0TmFtZSgpKyIuaWR4IiwgQ2FsbCk7CisgICAgICAgICAgICBPcHMuY2xlYXIoKTsKKyAgICAgICAgICAgIEFBLmNvcHlWYWx1ZShPcmlnTG9hZC0+Z2V0T3BlcmFuZCgwKSwgVik7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFNpbmNlIHdlJ3JlIHJlcGxhY2luZyBhIGxvYWQgbWFrZSBzdXJlIHdlIHRha2UgdGhlIGFsaWdubWVudAorICAgICAgICAgIC8vIG9mIHRoZSBwcmV2aW91cyBsb2FkLgorICAgICAgICAgIExvYWRJbnN0ICpuZXdMb2FkID0gbmV3IExvYWRJbnN0KFYsIFYtPmdldE5hbWUoKSsiLnZhbCIsIENhbGwpOworICAgICAgICAgIG5ld0xvYWQtPnNldEFsaWdubWVudChPcmlnTG9hZC0+Z2V0QWxpZ25tZW50KCkpOworICAgICAgICAgIEFyZ3MucHVzaF9iYWNrKG5ld0xvYWQpOworICAgICAgICAgIEFBLmNvcHlWYWx1ZShPcmlnTG9hZCwgQXJncy5iYWNrKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICBpZiAoRXh0cmFBcmdIYWNrKQorICAgICAgQXJncy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KEYtPmdldENvbnRleHQoKSkpKTsKKworICAgIC8vIFB1c2ggYW55IHZhcmFyZ3MgYXJndW1lbnRzIG9uIHRoZSBsaXN0LgorICAgIGZvciAoOyBBSSAhPSBDUy5hcmdfZW5kKCk7ICsrQUksICsrQXJnSW5kZXgpIHsKKyAgICAgIEFyZ3MucHVzaF9iYWNrKCpBSSk7CisgICAgICBpZiAoQXR0cmlidXRlcyBBdHRycyA9IENhbGxQQUwuZ2V0UGFyYW1BdHRyaWJ1dGVzKEFyZ0luZGV4KSkKKyAgICAgICAgQXR0cmlidXRlc1ZlYy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoQXJncy5zaXplKCksIEF0dHJzKSk7CisgICAgfQorCisgICAgLy8gQWRkIGFueSBmdW5jdGlvbiBhdHRyaWJ1dGVzLgorICAgIGlmIChBdHRyaWJ1dGVzIGF0dHJzID0gQ2FsbFBBTC5nZXRGbkF0dHJpYnV0ZXMoKSkKKyAgICAgIEF0dHJpYnV0ZXNWZWMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KH4wLCBhdHRycykpOworCisgICAgSW5zdHJ1Y3Rpb24gKk5ldzsKKyAgICBpZiAoSW52b2tlSW5zdCAqSUkgPSBkeW5fY2FzdDxJbnZva2VJbnN0PihDYWxsKSkgeworICAgICAgTmV3ID0gSW52b2tlSW5zdDo6Q3JlYXRlKE5GLCBJSS0+Z2V0Tm9ybWFsRGVzdCgpLCBJSS0+Z2V0VW53aW5kRGVzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKSwgIiIsIENhbGwpOworICAgICAgY2FzdDxJbnZva2VJbnN0PihOZXcpLT5zZXRDYWxsaW5nQ29udihDUy5nZXRDYWxsaW5nQ29udigpKTsKKyAgICAgIGNhc3Q8SW52b2tlSW5zdD4oTmV3KS0+c2V0QXR0cmlidXRlcyhBdHRyTGlzdFB0cjo6Z2V0KEF0dHJpYnV0ZXNWZWMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzVmVjLmVuZCgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE5ldyA9IENhbGxJbnN0OjpDcmVhdGUoTkYsIEFyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKSwgIiIsIENhbGwpOworICAgICAgY2FzdDxDYWxsSW5zdD4oTmV3KS0+c2V0Q2FsbGluZ0NvbnYoQ1MuZ2V0Q2FsbGluZ0NvbnYoKSk7CisgICAgICBjYXN0PENhbGxJbnN0PihOZXcpLT5zZXRBdHRyaWJ1dGVzKEF0dHJMaXN0UHRyOjpnZXQoQXR0cmlidXRlc1ZlYy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzVmVjLmVuZCgpKSk7CisgICAgICBpZiAoY2FzdDxDYWxsSW5zdD4oQ2FsbCktPmlzVGFpbENhbGwoKSkKKyAgICAgICAgY2FzdDxDYWxsSW5zdD4oTmV3KS0+c2V0VGFpbENhbGwoKTsKKyAgICB9CisgICAgQXJncy5jbGVhcigpOworICAgIEF0dHJpYnV0ZXNWZWMuY2xlYXIoKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24gdG8ga25vdyB0aGF0IHdlIGFyZSByZXBsYWNpbmcKKyAgICAvLyB0aGUgb2xkIGNhbGwgd2l0aCBhIG5ldyBvbmUuCisgICAgQUEucmVwbGFjZVdpdGhOZXdWYWx1ZShDYWxsLCBOZXcpOworCisgICAgLy8gVXBkYXRlIHRoZSBjYWxsZ3JhcGggdG8ga25vdyB0aGF0IHRoZSBjYWxsc2l0ZSBoYXMgYmVlbiB0cmFuc2Zvcm1lZC4KKyAgICBDYWxsR3JhcGhOb2RlICpDYWxsZWVOb2RlID0gQ0dbQ2FsbC0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpXTsKKyAgICBDYWxsZWVOb2RlLT5yZXBsYWNlQ2FsbEVkZ2UoQ2FsbCwgTmV3LCBORl9DR04pOworCisgICAgaWYgKCFDYWxsLT51c2VfZW1wdHkoKSkgeworICAgICAgQ2FsbC0+cmVwbGFjZUFsbFVzZXNXaXRoKE5ldyk7CisgICAgICBOZXctPnRha2VOYW1lKENhbGwpOworICAgIH0KKworICAgIC8vIEZpbmFsbHksIHJlbW92ZSB0aGUgb2xkIGNhbGwgZnJvbSB0aGUgcHJvZ3JhbSwgcmVkdWNpbmcgdGhlIHVzZS1jb3VudCBvZgorICAgIC8vIEYuCisgICAgQ2FsbC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KKworICAvLyBTaW5jZSB3ZSBoYXZlIG5vdyBjcmVhdGVkIHRoZSBuZXcgZnVuY3Rpb24sIHNwbGljZSB0aGUgYm9keSBvZiB0aGUgb2xkCisgIC8vIGZ1bmN0aW9uIHJpZ2h0IGludG8gdGhlIG5ldyBmdW5jdGlvbiwgbGVhdmluZyB0aGUgb2xkIHJvdHRpbmcgaHVsayBvZiB0aGUKKyAgLy8gZnVuY3Rpb24gZW1wdHkuCisgIE5GLT5nZXRCYXNpY0Jsb2NrTGlzdCgpLnNwbGljZShORi0+YmVnaW4oKSwgRi0+Z2V0QmFzaWNCbG9ja0xpc3QoKSk7CisKKyAgLy8gTG9vcCBvdmVyIHRoZSBhcmd1bWVudCBsaXN0LCB0cmFuc2ZlcmluZyB1c2VzIG9mIHRoZSBvbGQgYXJndW1lbnRzIG92ZXIgdG8KKyAgLy8gdGhlIG5ldyBhcmd1bWVudHMsIGFsc28gdHJhbnNmZXJpbmcgb3ZlciB0aGUgbmFtZXMgYXMgd2VsbC4KKyAgLy8KKyAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEkgPSBGLT5hcmdfYmVnaW4oKSwgRSA9IEYtPmFyZ19lbmQoKSwKKyAgICAgICBJMiA9IE5GLT5hcmdfYmVnaW4oKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoIUFyZ3NUb1Byb21vdGUuY291bnQoSSkgJiYgIUJ5VmFsQXJnc1RvVHJhbnNmb3JtLmNvdW50KEkpKSB7CisgICAgICAvLyBJZiB0aGlzIGlzIGFuIHVubW9kaWZpZWQgYXJndW1lbnQsIG1vdmUgdGhlIG5hbWUgYW5kIHVzZXJzIG92ZXIgdG8gdGhlCisgICAgICAvLyBuZXcgdmVyc2lvbi4KKyAgICAgIEktPnJlcGxhY2VBbGxVc2VzV2l0aChJMik7CisgICAgICBJMi0+dGFrZU5hbWUoSSk7CisgICAgICBBQS5yZXBsYWNlV2l0aE5ld1ZhbHVlKEksIEkyKTsKKyAgICAgICsrSTI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoQnlWYWxBcmdzVG9UcmFuc2Zvcm0uY291bnQoSSkpIHsKKyAgICAgIC8vIEluIHRoZSBjYWxsZWUsIHdlIGNyZWF0ZSBhbiBhbGxvY2EsIGFuZCBzdG9yZSBlYWNoIG9mIHRoZSBuZXcgaW5jb21pbmcKKyAgICAgIC8vIGFyZ3VtZW50cyBpbnRvIHRoZSBhbGxvY2EuCisgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0UHQgPSBORi0+YmVnaW4oKS0+YmVnaW4oKTsKKworICAgICAgLy8gSnVzdCBhZGQgYWxsIHRoZSBzdHJ1Y3QgZWxlbWVudCB0eXBlcy4KKyAgICAgIGNvbnN0IFR5cGUgKkFnVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihJLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgVmFsdWUgKlRoZUFsbG9jYSA9IG5ldyBBbGxvY2FJbnN0KEFnVHksIDAsICIiLCBJbnNlcnRQdCk7CisgICAgICBjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBjYXN0PFN0cnVjdFR5cGU+KEFnVHkpOworICAgICAgVmFsdWUgKklkeHNbMl0gPSB7CisgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoRi0+Z2V0Q29udGV4dCgpKSwgMCksIDAgfTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNUeS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgSWR4c1sxXSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShGLT5nZXRDb250ZXh0KCkpLCBpKTsKKyAgICAgICAgVmFsdWUgKklkeCA9IAorICAgICAgICAgIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoVGhlQWxsb2NhLCBJZHhzLCBJZHhzKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVBbGxvY2EtPmdldE5hbWUoKSsiLiIrVHdpbmUoaSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0UHQpOworICAgICAgICBJMi0+c2V0TmFtZShJLT5nZXROYW1lKCkrIi4iK1R3aW5lKGkpKTsKKyAgICAgICAgbmV3IFN0b3JlSW5zdChJMisrLCBJZHgsIEluc2VydFB0KTsKKyAgICAgIH0KKworICAgICAgLy8gQW55dGhpbmcgdGhhdCB1c2VkIHRoZSBhcmcgc2hvdWxkIG5vdyB1c2UgdGhlIGFsbG9jYS4KKyAgICAgIEktPnJlcGxhY2VBbGxVc2VzV2l0aChUaGVBbGxvY2EpOworICAgICAgVGhlQWxsb2NhLT50YWtlTmFtZShJKTsKKyAgICAgIEFBLnJlcGxhY2VXaXRoTmV3VmFsdWUoSSwgVGhlQWxsb2NhKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChJLT51c2VfZW1wdHkoKSkgeworICAgICAgQUEuZGVsZXRlVmFsdWUoSSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGlmIHdlIHByb21vdGVkIHRoaXMgYXJndW1lbnQsIHRoZW4gYWxsIHVzZXJzIGFyZSBsb2FkCisgICAgLy8gaW5zdHJ1Y3Rpb25zIChvciBHRVBzIHdpdGggb25seSBsb2FkIHVzZXJzKSwgYW5kIGFsbCBsb2FkcyBzaG91bGQgYmUKKyAgICAvLyB1c2luZyB0aGUgbmV3IGFyZ3VtZW50IHRoYXQgd2UgYWRkZWQuCisgICAgU2NhbGFyaXplVGFibGUgJkFyZ0luZGljZXMgPSBTY2FsYXJpemVkRWxlbWVudHNbSV07CisKKyAgICB3aGlsZSAoIUktPnVzZV9lbXB0eSgpKSB7CisgICAgICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KEktPnVzZV9iYWNrKCkpKSB7CisgICAgICAgIGFzc2VydChBcmdJbmRpY2VzLmJlZ2luKCktPmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICJMb2FkIGVsZW1lbnQgc2hvdWxkIHNvcnQgdG8gZnJvbnQhIik7CisgICAgICAgIEkyLT5zZXROYW1lKEktPmdldE5hbWUoKSsiLnZhbCIpOworICAgICAgICBMSS0+cmVwbGFjZUFsbFVzZXNXaXRoKEkyKTsKKyAgICAgICAgQUEucmVwbGFjZVdpdGhOZXdWYWx1ZShMSSwgSTIpOworICAgICAgICBMSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiKioqIFByb21vdGVkIGxvYWQgb2YgYXJndW1lbnQgJyIgPDwgSS0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgIDw8ICInIGluIGZ1bmN0aW9uICciIDw8IEYtPmdldE5hbWUoKSA8PCAiJ1xuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHZXRFbGVtZW50UHRySW5zdCAqR0VQID0gY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oSS0+dXNlX2JhY2soKSk7CisgICAgICAgIEluZGljZXNWZWN0b3IgT3BlcmFuZHM7CisgICAgICAgIE9wZXJhbmRzLnJlc2VydmUoR0VQLT5nZXROdW1JbmRpY2VzKCkpOworICAgICAgICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIElJID0gR0VQLT5pZHhfYmVnaW4oKSwgSUUgPSBHRVAtPmlkeF9lbmQoKTsKKyAgICAgICAgICAgICBJSSAhPSBJRTsgKytJSSkKKyAgICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soY2FzdDxDb25zdGFudEludD4oKklJKS0+Z2V0U0V4dFZhbHVlKCkpOworCisgICAgICAgIC8vIEdFUHMgd2l0aCBhIHNpbmdsZSAwIGluZGV4IGNhbiBiZSBtZXJnZWQgd2l0aCBkaXJlY3QgbG9hZHMKKyAgICAgICAgaWYgKE9wZXJhbmRzLnNpemUoKSA9PSAxICYmIE9wZXJhbmRzLmZyb250KCkgPT0gMCkKKyAgICAgICAgICBPcGVyYW5kcy5jbGVhcigpOworCisgICAgICAgIEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgVGhlQXJnID0gSTI7CisgICAgICAgIGZvciAoU2NhbGFyaXplVGFibGU6Oml0ZXJhdG9yIEl0ID0gQXJnSW5kaWNlcy5iZWdpbigpOworICAgICAgICAgICAgICpJdCAhPSBPcGVyYW5kczsgKytJdCwgKytUaGVBcmcpIHsKKyAgICAgICAgICBhc3NlcnQoSXQgIT0gQXJnSW5kaWNlcy5lbmQoKSAmJiAiR0VQIG5vdCBoYW5kbGVkPz8iKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIE5ld05hbWUgPSBJLT5nZXROYW1lKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgICBOZXdOYW1lICs9ICIuIiArIHV0b3N0cihPcGVyYW5kc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgTmV3TmFtZSArPSAiLnZhbCI7CisgICAgICAgIFRoZUFyZy0+c2V0TmFtZShOZXdOYW1lKTsKKworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIioqKiBQcm9tb3RlZCBhZ2cgYXJndW1lbnQgJyIgPDwgVGhlQXJnLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgPDwgIicgb2YgZnVuY3Rpb24gJyIgPDwgTkYtPmdldE5hbWUoKSA8PCAiJ1xuIik7CisKKyAgICAgICAgLy8gQWxsIG9mIHRoZSB1c2VzIG11c3QgYmUgbG9hZCBpbnN0cnVjdGlvbnMuICBSZXBsYWNlIHRoZW0gYWxsIHdpdGgKKyAgICAgICAgLy8gdGhlIGFyZ3VtZW50IHNwZWNpZmllZCBieSBBcmdOby4KKyAgICAgICAgd2hpbGUgKCFHRVAtPnVzZV9lbXB0eSgpKSB7CisgICAgICAgICAgTG9hZEluc3QgKkwgPSBjYXN0PExvYWRJbnN0PihHRVAtPnVzZV9iYWNrKCkpOworICAgICAgICAgIEwtPnJlcGxhY2VBbGxVc2VzV2l0aChUaGVBcmcpOworICAgICAgICAgIEFBLnJlcGxhY2VXaXRoTmV3VmFsdWUoTCwgVGhlQXJnKTsKKyAgICAgICAgICBMLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBBQS5kZWxldGVWYWx1ZShHRVApOworICAgICAgICBHRVAtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEluY3JlbWVudCBJMiBwYXN0IGFsbCBvZiB0aGUgYXJndW1lbnRzIGFkZGVkIGZvciB0aGlzIHByb21vdGVkIHBvaW50ZXIuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ0luZGljZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICsrSTI7CisgIH0KKworICAvLyBOb3RpZnkgdGhlIGFsaWFzIGFuYWx5c2lzIGltcGxlbWVudGF0aW9uIHRoYXQgd2UgaW5zZXJ0ZWQgYSBuZXcgYXJndW1lbnQuCisgIGlmIChFeHRyYUFyZ0hhY2spCisgICAgQUEuY29weVZhbHVlKENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0SW50MzJUeShGLT5nZXRDb250ZXh0KCkpKSwgCisgICAgICAgICAgICAgICAgIE5GLT5hcmdfYmVnaW4oKSk7CisKKworICAvLyBUZWxsIHRoZSBhbGlhcyBhbmFseXNpcyB0aGF0IHRoZSBvbGQgZnVuY3Rpb24gaXMgYWJvdXQgdG8gZGlzYXBwZWFyLgorICBBQS5yZXBsYWNlV2l0aE5ld1ZhbHVlKEYsIE5GKTsKKworICAKKyAgTkZfQ0dOLT5zdGVhbENhbGxlZEZ1bmN0aW9uc0Zyb20oQ0dbRl0pOworICAKKyAgLy8gTm93IHRoYXQgdGhlIG9sZCBmdW5jdGlvbiBpcyBkZWFkLCBkZWxldGUgaXQuICBJZiB0aGVyZSBpcyBhIGRhbmdsaW5nCisgIC8vIHJlZmVyZW5jZSB0byB0aGUgQ2FsbGdyYXBoTm9kZSwganVzdCBsZWF2ZSB0aGUgZGVhZCBmdW5jdGlvbiBhcm91bmQgZm9yCisgIC8vIHNvbWVvbmUgZWxzZSB0byBudWtlLgorICBDYWxsR3JhcGhOb2RlICpDR04gPSBDR1tGXTsKKyAgaWYgKENHTi0+Z2V0TnVtUmVmZXJlbmNlcygpID09IDApCisgICAgZGVsZXRlIENHLnJlbW92ZUZ1bmN0aW9uRnJvbU1vZHVsZShDR04pOworICBlbHNlCisgICAgRi0+c2V0TGlua2FnZShGdW5jdGlvbjo6RXh0ZXJuYWxMaW5rYWdlKTsKKyAgCisgIHJldHVybiBORl9DR047Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0ODNlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI3IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1pcG8KKyAgQXJndW1lbnRQcm9tb3Rpb24uY3BwCisgIENvbnN0YW50TWVyZ2UuY3BwCisgIERlYWRBcmd1bWVudEVsaW1pbmF0aW9uLmNwcAorICBEZWFkVHlwZUVsaW1pbmF0aW9uLmNwcAorICBFeHRyYWN0R1YuY3BwCisgIEZ1bmN0aW9uQXR0cnMuY3BwCisgIEdsb2JhbERDRS5jcHAKKyAgR2xvYmFsT3B0LmNwcAorICBJUENvbnN0YW50UHJvcGFnYXRpb24uY3BwCisgIElQTy5jcHAKKyAgSW5saW5lQWx3YXlzLmNwcAorICBJbmxpbmVTaW1wbGUuY3BwCisgIElubGluZXIuY3BwCisgIEludGVybmFsaXplLmNwcAorICBMb29wRXh0cmFjdG9yLmNwcAorICBMb3dlclNldEptcC5jcHAKKyAgTWVyZ2VGdW5jdGlvbnMuY3BwCisgIFBhcnRpYWxJbmxpbmluZy5jcHAKKyAgUGFydGlhbFNwZWNpYWxpemF0aW9uLmNwcAorICBQcnVuZUVILmNwcAorICBTdHJpcERlYWRQcm90b3R5cGVzLmNwcAorICBTdHJpcFN5bWJvbHMuY3BwCisgIFN0cnVjdFJldFByb21vdGlvbi5jcHAKKyAgKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMgKExMVk1pcG8gTExWTVNjYWxhck9wdHMgTExWTUluc3RDb21iaW5lKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0NvbnN0YW50TWVyZ2UuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0NvbnN0YW50TWVyZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjgyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vQ29uc3RhbnRNZXJnZS5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8vPT09LSBDb25zdGFudE1lcmdlLmNwcCAtIE1lcmdlIGR1cGxpY2F0ZSBnbG9iYWwgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byBhIHBhc3MgdGhhdCBtZXJnZXMgZHVwbGljYXRlIGdsb2JhbAorLy8gY29uc3RhbnRzIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgY29uc3RhbnQgdGhhdCBpcyBzaGFyZWQuICBUaGlzIGlzIHVzZWZ1bAorLy8gYmVjYXVzZSBzb21lIHBhc3NlcyAoaWUgVHJhY2VWYWx1ZXMpIGluc2VydCBhIGxvdCBvZiBzdHJpbmcgY29uc3RhbnRzIGludG8KKy8vIHRoZSBwcm9ncmFtLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGFuIGV4aXN0aW5nIHN0cmluZyBpcyBhdmFpbGFibGUuCisvLworLy8gQWxnb3JpdGhtOiBDb25zdGFudE1lcmdlIGlzIGRlc2lnbmVkIHRvIGJ1aWxkIHVwIGEgbWFwIG9mIGF2YWlsYWJsZSBjb25zdGFudHMKKy8vIGFuZCBlbGltaW5hdGUgZHVwbGljYXRlcyB3aGVuIGl0IGlzIGluaXRpYWxpemVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiY29uc3RtZXJnZSIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bU1lcmdlZCwgIk51bWJlciBvZiBnbG9iYWwgY29uc3RhbnRzIG1lcmdlZCIpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgQ29uc3RhbnRNZXJnZSA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIENvbnN0YW50TWVyZ2UoKSA6IE1vZHVsZVBhc3MoSUQpIHt9CisKKyAgICAvLyBydW4gLSBGb3IgdGhpcyBwYXNzLCBwcm9jZXNzIGFsbCBvZiB0aGUgZ2xvYmFscyBpbiB0aGUgbW9kdWxlLAorICAgIC8vIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZSBjb25zdGFudHMuCisgICAgLy8KKyAgICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSk7CisgIH07Cit9CisKK2NoYXIgQ29uc3RhbnRNZXJnZTo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKENvbnN0YW50TWVyZ2UsICJjb25zdG1lcmdlIiwKKyAgICAgICAgICAgICAgICAiTWVyZ2UgRHVwbGljYXRlIEdsb2JhbCBDb25zdGFudHMiLCBmYWxzZSwgZmFsc2UpOworCitNb2R1bGVQYXNzICpsbHZtOjpjcmVhdGVDb25zdGFudE1lcmdlUGFzcygpIHsgcmV0dXJuIG5ldyBDb25zdGFudE1lcmdlKCk7IH0KKworYm9vbCBDb25zdGFudE1lcmdlOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgLy8gTWFwIHVuaXF1ZSBjb25zdGFudC9zZWN0aW9uIHBhaXJzIHRvIGdsb2JhbHMuICBXZSBkb24ndCB3YW50IHRvIG1lcmdlCisgIC8vIGdsb2JhbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zLgorICBEZW5zZU1hcDxDb25zdGFudCosIEdsb2JhbFZhcmlhYmxlKj4gQ01hcDsKKworICAvLyBSZXBsYWNlbWVudHMgLSBUaGlzIHZlY3RvciBjb250YWlucyBhIGxpc3Qgb2YgcmVwbGFjZW1lbnRzIHRvIHBlcmZvcm0uCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxHbG9iYWxWYXJpYWJsZSosIEdsb2JhbFZhcmlhYmxlKj4sIDMyPiBSZXBsYWNlbWVudHM7CisKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgLy8gSXRlcmF0ZSBjb25zdGFudCBtZXJnaW5nIHdoaWxlIHdlIGFyZSBzdGlsbCBtYWtpbmcgcHJvZ3Jlc3MuICBNZXJnaW5nIHR3bworICAvLyBjb25zdGFudHMgdG9nZXRoZXIgbWF5IGFsbG93IHVzIHRvIG1lcmdlIG90aGVyIGNvbnN0YW50cyB0b2dldGhlciBpZiB0aGUKKyAgLy8gc2Vjb25kIGxldmVsIGNvbnN0YW50cyBoYXZlIGluaXRpYWxpemVycyB3aGljaCBwb2ludCB0byB0aGUgZ2xvYmFscyB0aGF0CisgIC8vIHdlcmUganVzdCBtZXJnZWQuCisgIHdoaWxlICgxKSB7CisgICAgLy8gRmlyc3QgcGFzczogaWRlbnRpZnkgYWxsIGdsb2JhbHMgdGhhdCBjYW4gYmUgbWVyZ2VkIHRvZ2V0aGVyLCBmaWxsaW5nIGluCisgICAgLy8gdGhlIFJlcGxhY2VtZW50cyB2ZWN0b3IuICBXZSBjYW5ub3QgZG8gdGhlIHJlcGxhY2VtZW50IGluIHRoaXMgcGFzcworICAgIC8vIGJlY2F1c2UgZG9pbmcgc28gbWF5IGNhdXNlIGluaXRpYWxpemVycyBvZiBvdGhlciBnbG9iYWxzIHRvIGJlIHJld3JpdHRlbiwKKyAgICAvLyBpbnZhbGlkYXRpbmcgdGhlIENvbnN0YW50KiBwb2ludGVycyBpbiBDTWFwLgorICAgIC8vCisgICAgZm9yIChNb2R1bGU6Omdsb2JhbF9pdGVyYXRvciBHVkkgPSBNLmdsb2JhbF9iZWdpbigpLCBFID0gTS5nbG9iYWxfZW5kKCk7CisgICAgICAgICBHVkkgIT0gRTsgKSB7CisgICAgICBHbG9iYWxWYXJpYWJsZSAqR1YgPSBHVkkrKzsKKyAgICAgIAorICAgICAgLy8gSWYgdGhpcyBHViBpcyBkZWFkLCByZW1vdmUgaXQuCisgICAgICBHVi0+cmVtb3ZlRGVhZENvbnN0YW50VXNlcnMoKTsKKyAgICAgIGlmIChHVi0+dXNlX2VtcHR5KCkgJiYgR1YtPmhhc0xvY2FsTGlua2FnZSgpKSB7CisgICAgICAgIEdWLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIE9ubHkgcHJvY2VzcyBjb25zdGFudHMgd2l0aCBpbml0aWFsaXplcnMgaW4gdGhlIGRlZmF1bHQgYWRkcmVzIHNwYWNlLgorICAgICAgaWYgKCFHVi0+aXNDb25zdGFudCgpIHx8IUdWLT5oYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIoKSB8fAorICAgICAgICAgIEdWLT5nZXRUeXBlKCktPmdldEFkZHJlc3NTcGFjZSgpICE9IDAgfHwgIUdWLT5nZXRTZWN0aW9uKCkuZW1wdHkoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIENvbnN0YW50ICpJbml0ID0gR1YtPmdldEluaXRpYWxpemVyKCk7CisKKyAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgaW5pdGlhbGl6ZXIgaXMgYWxyZWFkeSBrbm93bi4KKyAgICAgIEdsb2JhbFZhcmlhYmxlIComU2xvdCA9IENNYXBbSW5pdF07CisKKyAgICAgIGlmIChTbG90ID09IDApIHsgICAgLy8gTm9wZSwgYWRkIGl0IHRvIHRoZSBtYXAuCisgICAgICAgIFNsb3QgPSBHVjsKKyAgICAgIH0gZWxzZSBpZiAoR1YtPmhhc0xvY2FsTGlua2FnZSgpKSB7ICAgIC8vIFl1cCwgdGhpcyBpcyBhIGR1cGxpY2F0ZSEKKyAgICAgICAgLy8gTWFrZSBhbGwgdXNlcyBvZiB0aGUgZHVwbGljYXRlIGNvbnN0YW50IHVzZSB0aGUgY2Fub25pY2FsIHZlcnNpb24uCisgICAgICAgIFJlcGxhY2VtZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoR1YsIFNsb3QpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUmVwbGFjZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgICBDTWFwLmNsZWFyKCk7CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGZpZ3VyZWQgb3V0IHdoaWNoIHJlcGxhY2VtZW50cyBtdXN0IGJlIG1hZGUsIGRvIHRoZW0gYWxsCisgICAgLy8gbm93LiAgVGhpcyBhdm9pZCBpbnZhbGlkYXRpbmcgdGhlIHBvaW50ZXJzIGluIENNYXAsIHdoaWNoIGFyZSB1bm5lZWRlZAorICAgIC8vIG5vdy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVwbGFjZW1lbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIC8vIEVsaW1pbmF0ZSBhbnkgdXNlcyBvZiB0aGUgZGVhZCBnbG9iYWwuCisgICAgICBSZXBsYWNlbWVudHNbaV0uZmlyc3QtPnJlcGxhY2VBbGxVc2VzV2l0aChSZXBsYWNlbWVudHNbaV0uc2Vjb25kKTsKKworICAgICAgLy8gRGVsZXRlIHRoZSBnbG9iYWwgdmFsdWUgZnJvbSB0aGUgbW9kdWxlLgorICAgICAgUmVwbGFjZW1lbnRzW2ldLmZpcnN0LT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICB9CisKKyAgICBOdW1NZXJnZWQgKz0gUmVwbGFjZW1lbnRzLnNpemUoKTsKKyAgICBSZXBsYWNlbWVudHMuY2xlYXIoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0RlYWRBcmd1bWVudEVsaW1pbmF0aW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9EZWFkQXJndW1lbnRFbGltaW5hdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkZjIzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9EZWFkQXJndW1lbnRFbGltaW5hdGlvbi5jcHAKQEAgLTAsMCArMSw5MzkgQEAKKy8vPT09LS0gRGVhZEFyZ3VtZW50RWxpbWluYXRpb24uY3BwIC0gRWxpbWluYXRlIGRlYWQgYXJndW1lbnRzIC0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGRlbGV0ZXMgZGVhZCBhcmd1bWVudHMgZnJvbSBpbnRlcm5hbCBmdW5jdGlvbnMuICBEZWFkIGFyZ3VtZW50CisvLyBlbGltaW5hdGlvbiByZW1vdmVzIGFyZ3VtZW50cyB3aGljaCBhcmUgZGlyZWN0bHkgZGVhZCwgYXMgd2VsbCBhcyBhcmd1bWVudHMKKy8vIG9ubHkgcGFzc2VkIGludG8gZnVuY3Rpb24gY2FsbHMgYXMgZGVhZCBhcmd1bWVudHMgb2Ygb3RoZXIgZnVuY3Rpb25zLiAgVGhpcworLy8gcGFzcyBhbHNvIGRlbGV0ZXMgZGVhZCByZXR1cm4gdmFsdWVzIGluIGEgc2ltaWxhciB3YXkuCisvLworLy8gVGhpcyBwYXNzIGlzIG9mdGVuIHVzZWZ1bCBhcyBhIGNsZWFudXAgcGFzcyB0byBydW4gYWZ0ZXIgYWdncmVzc2l2ZQorLy8gaW50ZXJwcm9jZWR1cmFsIHBhc3Nlcywgd2hpY2ggYWRkIHBvc3NpYmx5LWRlYWQgYXJndW1lbnRzIG9yIHJldHVybiB2YWx1ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJkZWFkYXJnZWxpbSIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1Bcmd1bWVudHNFbGltaW5hdGVkLCAiTnVtYmVyIG9mIHVucmVhZCBhcmdzIHJlbW92ZWQiKTsKK1NUQVRJU1RJQyhOdW1SZXRWYWxzRWxpbWluYXRlZCAgLCAiTnVtYmVyIG9mIHVudXNlZCByZXR1cm4gdmFsdWVzIHJlbW92ZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgLy8vIERBRSAtIFRoZSBkZWFkIGFyZ3VtZW50IGVsaW1pbmF0aW9uIHBhc3MuCisgIC8vLworICBjbGFzcyBEQUUgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgIHB1YmxpYzoKKworICAgIC8vLyBTdHJ1Y3QgdGhhdCByZXByZXNlbnRzIChwYXJ0IG9mKSBlaXRoZXIgYSByZXR1cm4gdmFsdWUgb3IgYSBmdW5jdGlvbgorICAgIC8vLyBhcmd1bWVudC4gIFVzZWQgc28gdGhhdCBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgY2FuIGJlIHVzZWQKKyAgICAvLy8gaW50ZXJjaGFuZ2FibHkuCisgICAgc3RydWN0IFJldE9yQXJnIHsKKyAgICAgIFJldE9yQXJnKGNvbnN0IEZ1bmN0aW9uICpGLCB1bnNpZ25lZCBJZHgsIGJvb2wgSXNBcmcpIDogRihGKSwgSWR4KElkeCksCisgICAgICAgICAgICAgICBJc0FyZyhJc0FyZykge30KKyAgICAgIGNvbnN0IEZ1bmN0aW9uICpGOworICAgICAgdW5zaWduZWQgSWR4OworICAgICAgYm9vbCBJc0FyZzsKKworICAgICAgLy8vIE1ha2UgUmV0T3JBcmcgY29tcGFyYWJsZSwgc28gd2UgY2FuIHB1dCBpdCBpbnRvIGEgbWFwLgorICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmV0T3JBcmcgJk8pIGNvbnN0IHsKKyAgICAgICAgaWYgKEYgIT0gTy5GKQorICAgICAgICAgIHJldHVybiBGIDwgTy5GOworICAgICAgICBlbHNlIGlmIChJZHggIT0gTy5JZHgpCisgICAgICAgICAgcmV0dXJuIElkeCA8IE8uSWR4OworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIElzQXJnIDwgTy5Jc0FyZzsKKyAgICAgIH0KKworICAgICAgLy8vIE1ha2UgUmV0T3JBcmcgY29tcGFyYWJsZSwgc28gd2UgY2FuIGVhc2lseSBpdGVyYXRlIHRoZSBtdWx0aW1hcC4KKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZXRPckFyZyAmTykgY29uc3QgeworICAgICAgICByZXR1cm4gRiA9PSBPLkYgJiYgSWR4ID09IE8uSWR4ICYmIElzQXJnID09IE8uSXNBcmc7CisgICAgICB9CisKKyAgICAgIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKElzQXJnID8gIkFyZ3VtZW50ICMiIDogIlJldHVybiB2YWx1ZSAjIikpCisgICAgICAgICAgICAgICArIHV0b3N0cihJZHgpICsgIiBvZiBmdW5jdGlvbiAiICsgRi0+Z2V0TmFtZVN0cigpOworICAgICAgfQorICAgIH07CisKKyAgICAvLy8gTGl2ZW5lc3MgZW51bSAtIER1cmluZyBvdXIgaW5pdGlhbCBwYXNzIG92ZXIgdGhlIHByb2dyYW0sIHdlIGRldGVybWluZQorICAgIC8vLyB0aGF0IHRoaW5ncyBhcmUgZWl0aGVyIGFsaXZlIG9yIG1heWJlIGFsaXZlLiBXZSBkb24ndCBtYXJrIGFueXRoaW5nCisgICAgLy8vIGV4cGxpY2l0bHkgZGVhZCAoZXZlbiBpZiB3ZSBrbm93IHRoZXkgYXJlKSwgc2luY2UgYW55dGhpbmcgbm90IGFsaXZlCisgICAgLy8vIHdpdGggbm8gcmVnaXN0ZXJlZCB1c2VzIChpbiBVc2VzKSB3aWxsIG5ldmVyIGJlIG1hcmtlZCBhbGl2ZSBhbmQgd2lsbAorICAgIC8vLyB0aHVzIGJlY29tZSBkZWFkIGluIHRoZSBlbmQuCisgICAgZW51bSBMaXZlbmVzcyB7IExpdmUsIE1heWJlTGl2ZSB9OworCisgICAgLy8vIENvbnZlbmllbmNlIHdyYXBwZXIKKyAgICBSZXRPckFyZyBDcmVhdGVSZXQoY29uc3QgRnVuY3Rpb24gKkYsIHVuc2lnbmVkIElkeCkgeworICAgICAgcmV0dXJuIFJldE9yQXJnKEYsIElkeCwgZmFsc2UpOworICAgIH0KKyAgICAvLy8gQ29udmVuaWVuY2Ugd3JhcHBlcgorICAgIFJldE9yQXJnIENyZWF0ZUFyZyhjb25zdCBGdW5jdGlvbiAqRiwgdW5zaWduZWQgSWR4KSB7CisgICAgICByZXR1cm4gUmV0T3JBcmcoRiwgSWR4LCB0cnVlKTsKKyAgICB9CisKKyAgICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8UmV0T3JBcmcsIFJldE9yQXJnPiBVc2VNYXA7CisgICAgLy8vIFRoaXMgbWFwcyBhIHJldHVybiB2YWx1ZSBvciBhcmd1bWVudCB0byBhbnkgTWF5YmVMaXZlIHJldHVybiB2YWx1ZXMgb3IKKyAgICAvLy8gYXJndW1lbnRzIGl0IHVzZXMuIFRoaXMgYWxsb3dzIHRoZSBNYXliZUxpdmUgdmFsdWVzIHRvIGJlIG1hcmtlZCBsaXZlCisgICAgLy8vIHdoZW4gYW55IG9mIGl0cyB1c2VycyBpcyBtYXJrZWQgbGl2ZS4KKyAgICAvLy8gRm9yIGV4YW1wbGUgKGluZGljZXMgYXJlIGxlZnQgb3V0IGZvciBjbGFyaXR5KToKKyAgICAvLy8gIC0gVXNlc1tyZXQgRl0gPSByZXQgRworICAgIC8vLyAgICBUaGlzIG1lYW5zIHRoYXQgRiBjYWxscyBHLCBhbmQgRiByZXR1cm5zIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBHLgorICAgIC8vLyAgLSBVc2VzW2FyZyBGXSA9IHJldCBHCisgICAgLy8vICAgIFRoaXMgbWVhbnMgdGhhdCBzb21lIGZ1bmN0aW9uIGNhbGxzIEcgYW5kIHBhc3NlcyBpdHMgcmVzdWx0IGFzIGFuCisgICAgLy8vICAgIGFyZ3VtZW50IHRvIEYuCisgICAgLy8vICAtIFVzZXNbcmV0IEZdID0gYXJnIEYKKyAgICAvLy8gICAgVGhpcyBtZWFucyB0aGF0IEYgcmV0dXJucyBvbmUgb2YgaXRzIG93biBhcmd1bWVudHMuCisgICAgLy8vICAtIFVzZXNbYXJnIEZdID0gYXJnIEcKKyAgICAvLy8gICAgVGhpcyBtZWFucyB0aGF0IEcgY2FsbHMgRiBhbmQgcGFzc2VzIG9uZSBvZiBpdHMgb3duIChHJ3MpIGFyZ3VtZW50cworICAgIC8vLyAgICBkaXJlY3RseSB0byBGLgorICAgIFVzZU1hcCBVc2VzOworCisgICAgdHlwZWRlZiBzdGQ6OnNldDxSZXRPckFyZz4gTGl2ZVNldDsKKyAgICB0eXBlZGVmIHN0ZDo6c2V0PGNvbnN0IEZ1bmN0aW9uKj4gTGl2ZUZ1bmNTZXQ7CisKKyAgICAvLy8gVGhpcyBzZXQgY29udGFpbnMgYWxsIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBkZXRlcm1pbmVkIHRvIGJlIGxpdmUuCisgICAgTGl2ZVNldCBMaXZlVmFsdWVzOworICAgIC8vLyBUaGlzIHNldCBjb250YWlucyBhbGwgdmFsdWVzIHRoYXQgYXJlIGNhbm5vdCBiZSBjaGFuZ2VkIGluIGFueSB3YXkuCisgICAgTGl2ZUZ1bmNTZXQgTGl2ZUZ1bmN0aW9uczsKKworICAgIHR5cGVkZWYgU21hbGxWZWN0b3I8UmV0T3JBcmcsIDU+IFVzZVZlY3RvcjsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gREFIIHVzZXMgdGhpcyB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IElELgorICAgIGV4cGxpY2l0IERBRShjaGFyICZJRCkgOiBNb2R1bGVQYXNzKElEKSB7fQorCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIERBRSgpIDogTW9kdWxlUGFzcyhJRCkge30KKworICAgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICAgIHZpcnR1YWwgYm9vbCBTaG91bGRIYWNrQXJndW1lbnRzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICBwcml2YXRlOgorICAgIExpdmVuZXNzIE1hcmtJZk5vdExpdmUoUmV0T3JBcmcgVXNlLCBVc2VWZWN0b3IgJk1heWJlTGl2ZVVzZXMpOworICAgIExpdmVuZXNzIFN1cnZleVVzZShWYWx1ZTo6Y29uc3RfdXNlX2l0ZXJhdG9yIFUsIFVzZVZlY3RvciAmTWF5YmVMaXZlVXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmV0VmFsTnVtID0gMCk7CisgICAgTGl2ZW5lc3MgU3VydmV5VXNlcyhjb25zdCBWYWx1ZSAqViwgVXNlVmVjdG9yICZNYXliZUxpdmVVc2VzKTsKKworICAgIHZvaWQgU3VydmV5RnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gJkYpOworICAgIHZvaWQgTWFya1ZhbHVlKGNvbnN0IFJldE9yQXJnICZSQSwgTGl2ZW5lc3MgTCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBVc2VWZWN0b3IgJk1heWJlTGl2ZVVzZXMpOworICAgIHZvaWQgTWFya0xpdmUoY29uc3QgUmV0T3JBcmcgJlJBKTsKKyAgICB2b2lkIE1hcmtMaXZlKGNvbnN0IEZ1bmN0aW9uICZGKTsKKyAgICB2b2lkIFByb3BhZ2F0ZUxpdmVuZXNzKGNvbnN0IFJldE9yQXJnICZSQSk7CisgICAgYm9vbCBSZW1vdmVEZWFkU3R1ZmZGcm9tRnVuY3Rpb24oRnVuY3Rpb24gKkYpOworICAgIGJvb2wgRGVsZXRlRGVhZFZhcmFyZ3MoRnVuY3Rpb24gJkZuKTsKKyAgfTsKK30KKworCitjaGFyIERBRTo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKERBRSwgImRlYWRhcmdlbGltIiwgIkRlYWQgQXJndW1lbnQgRWxpbWluYXRpb24iLCBmYWxzZSwgZmFsc2UpOworCituYW1lc3BhY2UgeworICAvLy8gREFIIC0gRGVhZEFyZ3VtZW50SGFja2luZyBwYXNzIC0gU2FtZSBhcyBkZWFkIGFyZ3VtZW50IGVsaW1pbmF0aW9uLCBidXQKKyAgLy8vIGRlbGV0ZXMgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucyB3aGljaCBhcmUgZXh0ZXJuYWwuICBUaGlzIGlzIG9ubHkgZm9yIHVzZQorICAvLy8gYnkgYnVncG9pbnQuCisgIHN0cnVjdCBEQUggOiBwdWJsaWMgREFFIHsKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBEQUgoKSA6IERBRShJRCkge30KKworICAgIHZpcnR1YWwgYm9vbCBTaG91bGRIYWNrQXJndW1lbnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICB9OworfQorCitjaGFyIERBSDo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKERBSCwgImRlYWRhcmdoYVgwciIsIAorICAgICAgICAgICAgICAgICJEZWFkIEFyZ3VtZW50IEhhY2tpbmcgKEJVR1BPSU5UIFVTRSBPTkxZOyBETyBOT1QgVVNFKSIsCisgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKworLy8vIGNyZWF0ZURlYWRBcmdFbGltaW5hdGlvblBhc3MgLSBUaGlzIHBhc3MgcmVtb3ZlcyBhcmd1bWVudHMgZnJvbSBmdW5jdGlvbnMKKy8vLyB3aGljaCBhcmUgbm90IHVzZWQgYnkgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLgorLy8vCitNb2R1bGVQYXNzICpsbHZtOjpjcmVhdGVEZWFkQXJnRWxpbWluYXRpb25QYXNzKCkgeyByZXR1cm4gbmV3IERBRSgpOyB9CitNb2R1bGVQYXNzICpsbHZtOjpjcmVhdGVEZWFkQXJnSGFja2luZ1Bhc3MoKSB7IHJldHVybiBuZXcgREFIKCk7IH0KKworLy8vIERlbGV0ZURlYWRWYXJhcmdzIC0gSWYgdGhpcyBpcyBhbiBmdW5jdGlvbiB0aGF0IHRha2VzIGEgLi4uIGxpc3QsIGFuZCBpZgorLy8vIGxsdm0udmFzdGFydCBpcyBuZXZlciBjYWxsZWQsIHRoZSB2YXJhcmdzIGxpc3QgaXMgZGVhZCBmb3IgdGhlIGZ1bmN0aW9uLgorYm9vbCBEQUU6OkRlbGV0ZURlYWRWYXJhcmdzKEZ1bmN0aW9uICZGbikgeworICBhc3NlcnQoRm4uZ2V0RnVuY3Rpb25UeXBlKCktPmlzVmFyQXJnKCkgJiYgIkZ1bmN0aW9uIGlzbid0IHZhcmFyZ3MhIik7CisgIGlmIChGbi5pc0RlY2xhcmF0aW9uKCkgfHwgIUZuLmhhc0xvY2FsTGlua2FnZSgpKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gRW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZGlyZWN0bHkgY2FsbGVkLgorICBpZiAoRm4uaGFzQWRkcmVzc1Rha2VuKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE9rYXksIHdlIGtub3cgd2UgY2FuIHRyYW5zZm9ybSB0aGlzIGZ1bmN0aW9uIGlmIHNhZmUuICBTY2FuIGl0cyBib2R5CisgIC8vIGxvb2tpbmcgZm9yIGNhbGxzIHRvIGxsdm0udmFzdGFydC4KKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGbi5iZWdpbigpLCBFID0gRm4uZW5kKCk7IEJCICE9IEU7ICsrQkIpIHsKKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChJbnRyaW5zaWNJbnN0ICpJSSA9IGR5bl9jYXN0PEludHJpbnNpY0luc3Q+KEkpKSB7CisgICAgICAgIGlmIChJSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6OnZhc3RhcnQpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIElmIHdlIGdldCBoZXJlLCB0aGVyZSBhcmUgbm8gY2FsbHMgdG8gbGx2bS52YXN0YXJ0IGluIHRoZSBmdW5jdGlvbiBib2R5LAorICAvLyByZW1vdmUgdGhlICIuLi4iIGFuZCBhZGp1c3QgYWxsIHRoZSBjYWxscy4KKworICAvLyBTdGFydCBieSBjb21wdXRpbmcgYSBuZXcgcHJvdG90eXBlIGZvciB0aGUgZnVuY3Rpb24sIHdoaWNoIGlzIHRoZSBzYW1lIGFzCisgIC8vIHRoZSBvbGQgZnVuY3Rpb24sIGJ1dCBkb2Vzbid0IGhhdmUgaXNWYXJBcmcgc2V0LgorICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IEZuLmdldEZ1bmN0aW9uVHlwZSgpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBQYXJhbXMoRlR5LT5wYXJhbV9iZWdpbigpLCBGVHktPnBhcmFtX2VuZCgpKTsKKyAgRnVuY3Rpb25UeXBlICpORlR5ID0gRnVuY3Rpb25UeXBlOjpnZXQoRlR5LT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMsIGZhbHNlKTsKKyAgdW5zaWduZWQgTnVtQXJncyA9IFBhcmFtcy5zaXplKCk7CisKKyAgLy8gQ3JlYXRlIHRoZSBuZXcgZnVuY3Rpb24gYm9keSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIG1vZHVsZS4uLgorICBGdW5jdGlvbiAqTkYgPSBGdW5jdGlvbjo6Q3JlYXRlKE5GVHksIEZuLmdldExpbmthZ2UoKSk7CisgIE5GLT5jb3B5QXR0cmlidXRlc0Zyb20oJkZuKTsKKyAgRm4uZ2V0UGFyZW50KCktPmdldEZ1bmN0aW9uTGlzdCgpLmluc2VydCgmRm4sIE5GKTsKKyAgTkYtPnRha2VOYW1lKCZGbik7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgY2FsbGVycyBvZiB0aGUgZnVuY3Rpb24sIHRyYW5zZm9ybWluZyB0aGUgY2FsbCBzaXRlcworICAvLyB0byBwYXNzIGluIGEgc21hbGxlciBudW1iZXIgb2YgYXJndW1lbnRzIGludG8gdGhlIG5ldyBmdW5jdGlvbi4KKyAgLy8KKyAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBBcmdzOworICB3aGlsZSAoIUZuLnVzZV9lbXB0eSgpKSB7CisgICAgQ2FsbFNpdGUgQ1MoRm4udXNlX2JhY2soKSk7CisgICAgSW5zdHJ1Y3Rpb24gKkNhbGwgPSBDUy5nZXRJbnN0cnVjdGlvbigpOworCisgICAgLy8gUGFzcyBhbGwgdGhlIHNhbWUgYXJndW1lbnRzLgorICAgIEFyZ3MuYXNzaWduKENTLmFyZ19iZWdpbigpLCBDUy5hcmdfYmVnaW4oKSArIE51bUFyZ3MpOworCisgICAgLy8gRHJvcCBhbnkgYXR0cmlidXRlcyB0aGF0IHdlcmUgb24gdGhlIHZhcmFyZyBhcmd1bWVudHMuCisgICAgQXR0ckxpc3RQdHIgUEFMID0gQ1MuZ2V0QXR0cmlidXRlcygpOworICAgIGlmICghUEFMLmlzRW1wdHkoKSAmJiBQQUwuZ2V0U2xvdChQQUwuZ2V0TnVtU2xvdHMoKSAtIDEpLkluZGV4ID4gTnVtQXJncykgeworICAgICAgU21hbGxWZWN0b3I8QXR0cmlidXRlV2l0aEluZGV4LCA4PiBBdHRyaWJ1dGVzVmVjOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgUEFMLmdldFNsb3QoaSkuSW5kZXggPD0gTnVtQXJnczsgKytpKQorICAgICAgICBBdHRyaWJ1dGVzVmVjLnB1c2hfYmFjayhQQUwuZ2V0U2xvdChpKSk7CisgICAgICBpZiAoQXR0cmlidXRlcyBGbkF0dHJzID0gUEFMLmdldEZuQXR0cmlidXRlcygpKQorICAgICAgICBBdHRyaWJ1dGVzVmVjLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCh+MCwgRm5BdHRycykpOworICAgICAgUEFMID0gQXR0ckxpc3RQdHI6OmdldChBdHRyaWJ1dGVzVmVjLmJlZ2luKCksIEF0dHJpYnV0ZXNWZWMuZW5kKCkpOworICAgIH0KKworICAgIEluc3RydWN0aW9uICpOZXc7CisgICAgaWYgKEludm9rZUluc3QgKklJID0gZHluX2Nhc3Q8SW52b2tlSW5zdD4oQ2FsbCkpIHsKKyAgICAgIE5ldyA9IEludm9rZUluc3Q6OkNyZWF0ZShORiwgSUktPmdldE5vcm1hbERlc3QoKSwgSUktPmdldFVud2luZERlc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCksICIiLCBDYWxsKTsKKyAgICAgIGNhc3Q8SW52b2tlSW5zdD4oTmV3KS0+c2V0Q2FsbGluZ0NvbnYoQ1MuZ2V0Q2FsbGluZ0NvbnYoKSk7CisgICAgICBjYXN0PEludm9rZUluc3Q+KE5ldyktPnNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgICB9IGVsc2UgeworICAgICAgTmV3ID0gQ2FsbEluc3Q6OkNyZWF0ZShORiwgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLCAiIiwgQ2FsbCk7CisgICAgICBjYXN0PENhbGxJbnN0PihOZXcpLT5zZXRDYWxsaW5nQ29udihDUy5nZXRDYWxsaW5nQ29udigpKTsKKyAgICAgIGNhc3Q8Q2FsbEluc3Q+KE5ldyktPnNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgICAgIGlmIChjYXN0PENhbGxJbnN0PihDYWxsKS0+aXNUYWlsQ2FsbCgpKQorICAgICAgICBjYXN0PENhbGxJbnN0PihOZXcpLT5zZXRUYWlsQ2FsbCgpOworICAgIH0KKyAgICBOZXctPnNldERlYnVnTG9jKENhbGwtPmdldERlYnVnTG9jKCkpOworCisgICAgQXJncy5jbGVhcigpOworCisgICAgaWYgKCFDYWxsLT51c2VfZW1wdHkoKSkKKyAgICAgIENhbGwtPnJlcGxhY2VBbGxVc2VzV2l0aChOZXcpOworCisgICAgTmV3LT50YWtlTmFtZShDYWxsKTsKKworICAgIC8vIEZpbmFsbHksIHJlbW92ZSB0aGUgb2xkIGNhbGwgZnJvbSB0aGUgcHJvZ3JhbSwgcmVkdWNpbmcgdGhlIHVzZS1jb3VudCBvZgorICAgIC8vIEYuCisgICAgQ2FsbC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KKworICAvLyBTaW5jZSB3ZSBoYXZlIG5vdyBjcmVhdGVkIHRoZSBuZXcgZnVuY3Rpb24sIHNwbGljZSB0aGUgYm9keSBvZiB0aGUgb2xkCisgIC8vIGZ1bmN0aW9uIHJpZ2h0IGludG8gdGhlIG5ldyBmdW5jdGlvbiwgbGVhdmluZyB0aGUgb2xkIHJvdHRpbmcgaHVsayBvZiB0aGUKKyAgLy8gZnVuY3Rpb24gZW1wdHkuCisgIE5GLT5nZXRCYXNpY0Jsb2NrTGlzdCgpLnNwbGljZShORi0+YmVnaW4oKSwgRm4uZ2V0QmFzaWNCbG9ja0xpc3QoKSk7CisKKyAgLy8gTG9vcCBvdmVyIHRoZSBhcmd1bWVudCBsaXN0LCB0cmFuc2ZlcmluZyB1c2VzIG9mIHRoZSBvbGQgYXJndW1lbnRzIG92ZXIgdG8KKyAgLy8gdGhlIG5ldyBhcmd1bWVudHMsIGFsc28gdHJhbnNmZXJpbmcgb3ZlciB0aGUgbmFtZXMgYXMgd2VsbC4gIFdoaWxlIHdlJ3JlIGF0CisgIC8vIGl0LCByZW1vdmUgdGhlIGRlYWQgYXJndW1lbnRzIGZyb20gdGhlIERlYWRBcmd1bWVudHMgbGlzdC4KKyAgLy8KKyAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEkgPSBGbi5hcmdfYmVnaW4oKSwgRSA9IEZuLmFyZ19lbmQoKSwKKyAgICAgICBJMiA9IE5GLT5hcmdfYmVnaW4oKTsgSSAhPSBFOyArK0ksICsrSTIpIHsKKyAgICAvLyBNb3ZlIHRoZSBuYW1lIGFuZCB1c2VycyBvdmVyIHRvIHRoZSBuZXcgdmVyc2lvbi4KKyAgICBJLT5yZXBsYWNlQWxsVXNlc1dpdGgoSTIpOworICAgIEkyLT50YWtlTmFtZShJKTsKKyAgfQorCisgIC8vIEZpbmFsbHksIG51a2UgdGhlIG9sZCBmdW5jdGlvbi4KKyAgRm4uZXJhc2VGcm9tUGFyZW50KCk7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmV0dXJuIHZhbHVlcy4gSXQgcmV0dXJucyAwCisvLy8gZm9yIHZvaWQgZnVuY3Rpb25zIGFuZCAxIGZvciBmdW5jdGlvbnMgbm90IHJldHVybmluZyBhIHN0cnVjdC4gSXQgcmV0dXJucworLy8vIHRoZSBudW1iZXIgb2Ygc3RydWN0IGVsZW1lbnRzIGZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIGEgc3RydWN0Lgorc3RhdGljIHVuc2lnbmVkIE51bVJldFZhbHMoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgaWYgKEYtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHkoKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZSBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oRi0+Z2V0UmV0dXJuVHlwZSgpKSkKKyAgICByZXR1cm4gU1R5LT5nZXROdW1FbGVtZW50cygpOworICBlbHNlCisgICAgcmV0dXJuIDE7Cit9CisKKy8vLyBNYXJrSWZOb3RMaXZlIC0gVGhpcyBjaGVja3MgVXNlIGZvciBsaXZlbmVzcyBpbiBMaXZlVmFsdWVzLiBJZiBVc2UgaXMgbm90CisvLy8gbGl2ZSwgaXQgYWRkcyBVc2UgdG8gdGhlIE1heWJlTGl2ZVVzZXMgYXJndW1lbnQuIFJldHVybnMgdGhlIGRldGVybWluZWQKKy8vLyBsaXZlbmVzcyBvZiBVc2UuCitEQUU6OkxpdmVuZXNzIERBRTo6TWFya0lmTm90TGl2ZShSZXRPckFyZyBVc2UsIFVzZVZlY3RvciAmTWF5YmVMaXZlVXNlcykgeworICAvLyBXZSdyZSBsaXZlIGlmIG91ciB1c2Ugb3IgaXRzIEZ1bmN0aW9uIGlzIGFscmVhZHkgbWFya2VkIGFzIGxpdmUuCisgIGlmIChMaXZlRnVuY3Rpb25zLmNvdW50KFVzZS5GKSB8fCBMaXZlVmFsdWVzLmNvdW50KFVzZSkpCisgICAgcmV0dXJuIExpdmU7CisKKyAgLy8gV2UncmUgbWF5YmUgbGl2ZSBvdGhlcndpc2UsIGJ1dCByZW1lbWJlciB0aGF0IHdlIG11c3QgYmVjb21lIGxpdmUgaWYKKyAgLy8gVXNlIGJlY29tZXMgbGl2ZS4KKyAgTWF5YmVMaXZlVXNlcy5wdXNoX2JhY2soVXNlKTsKKyAgcmV0dXJuIE1heWJlTGl2ZTsKK30KKworCisvLy8gU3VydmV5VXNlIC0gVGhpcyBsb29rcyBhdCBhIHNpbmdsZSB1c2Ugb2YgYW4gYXJndW1lbnQgb3IgcmV0dXJuIHZhbHVlCisvLy8gYW5kIGRldGVybWluZXMgaWYgaXQgc2hvdWxkIGJlIGFsaXZlIG9yIG5vdC4gQWRkcyB0aGlzIHVzZSB0byBNYXliZUxpdmVVc2VzCisvLy8gaWYgaXQgY2F1c2VzIHRoZSB1c2VkIHZhbHVlIHRvIGJlY29tZSBNYXliZUxpdmUuCisvLy8KKy8vLyBSZXRWYWxOdW0gaXMgdGhlIHJldHVybiB2YWx1ZSBudW1iZXIgdG8gdXNlIHdoZW4gdGhpcyB1c2UgaXMgdXNlZCBpbiBhCisvLy8gcmV0dXJuIGluc3RydWN0aW9uLiBUaGlzIGlzIHVzZWQgaW4gdGhlIHJlY3Vyc2lvbiwgeW91IHNob3VsZCBhbHdheXMgbGVhdmUKKy8vLyBpdCBhdCAwLgorREFFOjpMaXZlbmVzcyBEQUU6OlN1cnZleVVzZShWYWx1ZTo6Y29uc3RfdXNlX2l0ZXJhdG9yIFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZVZlY3RvciAmTWF5YmVMaXZlVXNlcywgdW5zaWduZWQgUmV0VmFsTnVtKSB7CisgICAgY29uc3QgVXNlciAqViA9ICpVOworICAgIGlmIChjb25zdCBSZXR1cm5JbnN0ICpSSSA9IGR5bl9jYXN0PFJldHVybkluc3Q+KFYpKSB7CisgICAgICAvLyBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJdCdzIG9ubHkgbGl2ZSB3aGVuIHRoZQorICAgICAgLy8gZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgaXMgbGl2ZS4gV2UgdXNlIFJldFZhbE51bSBoZXJlLCBmb3IgdGhlIGNhc2UKKyAgICAgIC8vIHRoYXQgVSBpcyByZWFsbHkgYSB1c2Ugb2YgYW4gaW5zZXJ0dmFsdWUgaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzIHRoZQorICAgICAgLy8gb3JnaW5hbCBVc2UuCisgICAgICBSZXRPckFyZyBVc2UgPSBDcmVhdGVSZXQoUkktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKSwgUmV0VmFsTnVtKTsKKyAgICAgIC8vIFdlIG1pZ2h0IGJlIGxpdmUsIGRlcGVuZGluZyBvbiB0aGUgbGl2ZW5lc3Mgb2YgVXNlLgorICAgICAgcmV0dXJuIE1hcmtJZk5vdExpdmUoVXNlLCBNYXliZUxpdmVVc2VzKTsKKyAgICB9CisgICAgaWYgKGNvbnN0IEluc2VydFZhbHVlSW5zdCAqSVYgPSBkeW5fY2FzdDxJbnNlcnRWYWx1ZUluc3Q+KFYpKSB7CisgICAgICBpZiAoVS5nZXRPcGVyYW5kTm8oKSAhPSBJbnNlcnRWYWx1ZUluc3Q6OmdldEFnZ3JlZ2F0ZU9wZXJhbmRJbmRleCgpCisgICAgICAgICAgJiYgSVYtPmhhc0luZGljZXMoKSkKKyAgICAgICAgLy8gVGhlIHVzZSB3ZSBhcmUgZXhhbWluaW5nIGlzIGluc2VydGVkIGludG8gYW4gYWdncmVnYXRlLiBPdXIgbGl2ZW5lc3MKKyAgICAgICAgLy8gZGVwZW5kcyBvbiBhbGwgdXNlcyBvZiB0aGF0IGFnZ3JlZ2F0ZSwgYnV0IGlmIGl0IGlzIHVzZWQgYXMgYSByZXR1cm4KKyAgICAgICAgLy8gdmFsdWUsIG9ubHkgaW5kZXggYXQgd2hpY2ggd2Ugd2VyZSBpbnNlcnRlZCBjb3VudHMuCisgICAgICAgIFJldFZhbE51bSA9ICpJVi0+aWR4X2JlZ2luKCk7CisKKyAgICAgIC8vIE5vdGUgdGhhdCBpZiB3ZSBhcmUgdXNlZCBhcyB0aGUgYWdncmVnYXRlIG9wZXJhbmQgdG8gdGhlIGluc2VydHZhbHVlLAorICAgICAgLy8gd2UgZG9uJ3QgY2hhbmdlIFJldFZhbE51bSwgYnV0IGRvIHN1cnZleSBhbGwgb3VyIHVzZXMuCisKKyAgICAgIExpdmVuZXNzIFJlc3VsdCA9IE1heWJlTGl2ZTsKKyAgICAgIGZvciAoVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvciBJID0gSVYtPnVzZV9iZWdpbigpLAorICAgICAgICAgICBFID0gVi0+dXNlX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBSZXN1bHQgPSBTdXJ2ZXlVc2UoSSwgTWF5YmVMaXZlVXNlcywgUmV0VmFsTnVtKTsKKyAgICAgICAgaWYgKFJlc3VsdCA9PSBMaXZlKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisKKyAgICBpZiAoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MgPSBWKSB7CisgICAgICBjb25zdCBGdW5jdGlvbiAqRiA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCk7CisgICAgICBpZiAoRikgeworICAgICAgICAvLyBVc2VkIGluIGEgZGlyZWN0IGNhbGwuCisKKyAgICAgICAgLy8gRmluZCB0aGUgYXJndW1lbnQgbnVtYmVyLiBXZSBrbm93IGZvciBzdXJlIHRoYXQgdGhpcyB1c2UgaXMgYW4KKyAgICAgICAgLy8gYXJndW1lbnQsIHNpbmNlIGlmIGl0IHdhcyB0aGUgZnVuY3Rpb24gYXJndW1lbnQgdGhpcyB3b3VsZCBiZSBhbgorICAgICAgICAvLyBpbmRpcmVjdCBjYWxsIGFuZCB0aGUgd2Uga25vdyBjYW4ndCBiZSBsb29raW5nIGF0IGEgdmFsdWUgb2YgdGhlCisgICAgICAgIC8vIGxhYmVsIHR5cGUgKGZvciB0aGUgaW52b2tlIGluc3RydWN0aW9uKS4KKyAgICAgICAgdW5zaWduZWQgQXJnTm8gPSBDUy5nZXRBcmd1bWVudE5vKFUpOworCisgICAgICAgIGlmIChBcmdObyA+PSBGLT5nZXRGdW5jdGlvblR5cGUoKS0+Z2V0TnVtUGFyYW1zKCkpCisgICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIHBhc3NlZCBpbiB0aHJvdWdoIGEgdmFyYXJnISBNdXN0IGJlIGxpdmUuCisgICAgICAgICAgcmV0dXJuIExpdmU7CisKKyAgICAgICAgYXNzZXJ0KENTLmdldEFyZ3VtZW50KEFyZ05vKQorICAgICAgICAgICAgICAgPT0gQ1MtPmdldE9wZXJhbmQoVS5nZXRPcGVyYW5kTm8oKSkKKyAgICAgICAgICAgICAgICYmICJBcmd1bWVudCBpcyBub3Qgd2hlcmUgd2UgZXhwZWN0ZWQgaXQiKTsKKworICAgICAgICAvLyBWYWx1ZSBwYXNzZWQgdG8gYSBub3JtYWwgY2FsbC4gSXQncyBvbmx5IGxpdmUgd2hlbiB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAvLyBhcmd1bWVudCB0byB0aGUgY2FsbGVkIGZ1bmN0aW9uIHR1cm5zIG91dCBsaXZlLgorICAgICAgICBSZXRPckFyZyBVc2UgPSBDcmVhdGVBcmcoRiwgQXJnTm8pOworICAgICAgICByZXR1cm4gTWFya0lmTm90TGl2ZShVc2UsIE1heWJlTGl2ZVVzZXMpOworICAgICAgfQorICAgIH0KKyAgICAvLyBVc2VkIGluIGFueSBvdGhlciB3YXk/IFZhbHVlIG11c3QgYmUgbGl2ZS4KKyAgICByZXR1cm4gTGl2ZTsKK30KKworLy8vIFN1cnZleVVzZXMgLSBUaGlzIGxvb2tzIGF0IGFsbCB0aGUgdXNlcyBvZiB0aGUgZ2l2ZW4gdmFsdWUKKy8vLyBSZXR1cm5zIHRoZSBMaXZlbmVzcyBkZWR1Y2VkIGZyb20gdGhlIHVzZXMgb2YgdGhpcyB2YWx1ZS4KKy8vLworLy8vIEFkZHMgYWxsIHVzZXMgdGhhdCBjYXVzZSB0aGUgcmVzdWx0IHRvIGJlIE1heWJlTGl2ZSB0byBNYXliZUxpdmVSZXRVc2VzLiBJZgorLy8vIHRoZSByZXN1bHQgaXMgTGl2ZSwgTWF5YmVMaXZlVXNlcyBtaWdodCBiZSBtb2RpZmllZCBidXQgaXRzIGNvbnRlbnQgc2hvdWxkCisvLy8gYmUgaWdub3JlZCAoc2luY2UgaXQgbWlnaHQgbm90IGJlIGNvbXBsZXRlKS4KK0RBRTo6TGl2ZW5lc3MgREFFOjpTdXJ2ZXlVc2VzKGNvbnN0IFZhbHVlICpWLCBVc2VWZWN0b3IgJk1heWJlTGl2ZVVzZXMpIHsKKyAgLy8gQXNzdW1lIGl0J3MgZGVhZCAod2hpY2ggd2lsbCBvbmx5IGhvbGQgaWYgdGhlcmUgYXJlIG5vIHVzZXMgYXQgYWxsLi4pLgorICBMaXZlbmVzcyBSZXN1bHQgPSBNYXliZUxpdmU7CisgIC8vIENoZWNrIGVhY2ggdXNlLgorICBmb3IgKFZhbHVlOjpjb25zdF91c2VfaXRlcmF0b3IgSSA9IFYtPnVzZV9iZWdpbigpLAorICAgICAgIEUgPSBWLT51c2VfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgUmVzdWx0ID0gU3VydmV5VXNlKEksIE1heWJlTGl2ZVVzZXMpOworICAgIGlmIChSZXN1bHQgPT0gTGl2ZSkKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vIFN1cnZleUZ1bmN0aW9uIC0gVGhpcyBwZXJmb3JtcyB0aGUgaW5pdGlhbCBzdXJ2ZXkgb2YgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiwKKy8vIGNoZWNraW5nIG91dCB3aGV0aGVyIG9yIG5vdCBpdCB1c2VzIGFueSBvZiBpdHMgaW5jb21pbmcgYXJndW1lbnRzIG9yIHdoZXRoZXIKKy8vIGFueSBjYWxsZXJzIHVzZSB0aGUgcmV0dXJuIHZhbHVlLiAgVGhpcyBmaWxscyBpbiB0aGUgTGl2ZVZhbHVlcyBzZXQgYW5kIFVzZXMKKy8vIG1hcC4KKy8vCisvLyBXZSBjb25zaWRlciBhcmd1bWVudHMgb2Ygbm9uLWludGVybmFsIGZ1bmN0aW9ucyB0byBiZSBpbnRyaW5zaWNhbGx5IGFsaXZlIGFzCisvLyB3ZWxsIGFzIGFyZ3VtZW50cyB0byBmdW5jdGlvbnMgd2hpY2ggaGF2ZSB0aGVpciAiYWRkcmVzcyB0YWtlbiIuCisvLwordm9pZCBEQUU6OlN1cnZleUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICZGKSB7CisgIHVuc2lnbmVkIFJldENvdW50ID0gTnVtUmV0VmFscygmRik7CisgIC8vIEFzc3VtZSBhbGwgcmV0dXJuIHZhbHVlcyBhcmUgZGVhZAorICB0eXBlZGVmIFNtYWxsVmVjdG9yPExpdmVuZXNzLCA1PiBSZXRWYWxzOworICBSZXRWYWxzIFJldFZhbExpdmVuZXNzKFJldENvdW50LCBNYXliZUxpdmUpOworCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8VXNlVmVjdG9yLCA1PiBSZXRVc2VzOworICAvLyBUaGVzZSB2ZWN0b3JzIG1hcCBlYWNoIHJldHVybiB2YWx1ZSB0byB0aGUgdXNlcyB0aGF0IG1ha2UgaXQgTWF5YmVMaXZlLCBzbworICAvLyB3ZSBjYW4gYWRkIHRob3NlIHRvIHRoZSBVc2VzIG1hcCBpZiB0aGUgcmV0dXJuIHZhbHVlIHJlYWxseSB0dXJucyBvdXQgdG8gYmUKKyAgLy8gTWF5YmVMaXZlLiBJbml0aWFsaXplZCB0byBhIGxpc3Qgb2YgUmV0Q291bnQgZW1wdHkgbGlzdHMuCisgIFJldFVzZXMgTWF5YmVMaXZlUmV0VXNlcyhSZXRDb3VudCk7CisKKyAgZm9yIChGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IgQkIgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBCQiAhPSBFOyArK0JCKQorICAgIGlmIChjb25zdCBSZXR1cm5JbnN0ICpSSSA9IGR5bl9jYXN0PFJldHVybkluc3Q+KEJCLT5nZXRUZXJtaW5hdG9yKCkpKQorICAgICAgaWYgKFJJLT5nZXROdW1PcGVyYW5kcygpICE9IDAgJiYgUkktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKQorICAgICAgICAgICE9IEYuZ2V0RnVuY3Rpb25UeXBlKCktPmdldFJldHVyblR5cGUoKSkgeworICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IG9sZCBzdHlsZSBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgorICAgICAgICBNYXJrTGl2ZShGKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgIGlmICghRi5oYXNMb2NhbExpbmthZ2UoKSAmJiAoIVNob3VsZEhhY2tBcmd1bWVudHMoKSB8fCBGLmlzSW50cmluc2ljKCkpKSB7CisgICAgTWFya0xpdmUoRik7CisgICAgcmV0dXJuOworICB9CisKKyAgREVCVUcoZGJncygpIDw8ICJEQUUgLSBJbnNwZWN0aW5nIGNhbGxlcnMgZm9yIGZuOiAiIDw8IEYuZ2V0TmFtZSgpIDw8ICJcbiIpOworICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgbGl2ZSByZXR2YWxzLCBzbyB3ZSBjYW4gc2tpcCBjaGVja3Mgb25jZSBhbGwKKyAgLy8gb2YgdGhlbSB0dXJuIG91dCB0byBiZSBsaXZlLgorICB1bnNpZ25lZCBOdW1MaXZlUmV0VmFscyA9IDA7CisgIGNvbnN0IFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KEYuZ2V0UmV0dXJuVHlwZSgpKTsKKyAgLy8gTG9vcCBhbGwgdXNlcyBvZiB0aGUgZnVuY3Rpb24uCisgIGZvciAoVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvciBJID0gRi51c2VfYmVnaW4oKSwgRSA9IEYudXNlX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGlzIFBBU1NFRCBJTiBhcyBhbiBhcmd1bWVudCwgaXRzIGFkZHJlc3MgaGFzIGJlZW4KKyAgICAvLyB0YWtlbi4KKyAgICBJbW11dGFibGVDYWxsU2l0ZSBDUygqSSk7CisgICAgaWYgKCFDUyB8fCAhQ1MuaXNDYWxsZWUoSSkpIHsKKyAgICAgIE1hcmtMaXZlKEYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIHRoaXMgdXNlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYSBjYWxsIHNpdGUsIHRoZSBmdW5jdGlvbiBpcyBhbGl2ZS4KKyAgICBjb25zdCBJbnN0cnVjdGlvbiAqVGhlQ2FsbCA9IENTLmdldEluc3RydWN0aW9uKCk7CisgICAgaWYgKCFUaGVDYWxsKSB7ICAgLy8gTm90IGEgZGlyZWN0IGNhbGwgc2l0ZT8KKyAgICAgIE1hcmtMaXZlKEYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIHdlIGVuZCB1cCBoZXJlLCB3ZSBhcmUgbG9va2luZyBhdCBhIGRpcmVjdCBjYWxsIHRvIG91ciBmdW5jdGlvbi4KKworICAgIC8vIE5vdywgY2hlY2sgaG93IG91ciByZXR1cm4gdmFsdWUocykgaXMvYXJlIHVzZWQgaW4gdGhpcyBjYWxsZXIuIERvbid0CisgICAgLy8gYm90aGVyIGNoZWNraW5nIHJldHVybiB2YWx1ZXMgaWYgYWxsIG9mIHRoZW0gYXJlIGxpdmUgYWxyZWFkeS4KKyAgICBpZiAoTnVtTGl2ZVJldFZhbHMgIT0gUmV0Q291bnQpIHsKKyAgICAgIGlmIChTVHkpIHsKKyAgICAgICAgLy8gQ2hlY2sgYWxsIHVzZXMgb2YgdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgICAgZm9yIChWYWx1ZTo6Y29uc3RfdXNlX2l0ZXJhdG9yIEkgPSBUaGVDYWxsLT51c2VfYmVnaW4oKSwKKyAgICAgICAgICAgICBFID0gVGhlQ2FsbC0+dXNlX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICAgIGNvbnN0IEV4dHJhY3RWYWx1ZUluc3QgKkV4dCA9IGR5bl9jYXN0PEV4dHJhY3RWYWx1ZUluc3Q+KCpJKTsKKyAgICAgICAgICBpZiAoRXh0ICYmIEV4dC0+aGFzSW5kaWNlcygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIHVzZSB1c2VzIGEgcGFydCBvZiBvdXIgcmV0dXJuIHZhbHVlLCBzdXJ2ZXkgdGhlIHVzZXMgb2YKKyAgICAgICAgICAgIC8vIHRoYXQgcGFydCBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgZm9yIHRoaXMgaW5kZXggb25seS4KKyAgICAgICAgICAgIHVuc2lnbmVkIElkeCA9ICpFeHQtPmlkeF9iZWdpbigpOworICAgICAgICAgICAgaWYgKFJldFZhbExpdmVuZXNzW0lkeF0gIT0gTGl2ZSkgeworICAgICAgICAgICAgICBSZXRWYWxMaXZlbmVzc1tJZHhdID0gU3VydmV5VXNlcyhFeHQsIE1heWJlTGl2ZVJldFVzZXNbSWR4XSk7CisgICAgICAgICAgICAgIGlmIChSZXRWYWxMaXZlbmVzc1tJZHhdID09IExpdmUpCisgICAgICAgICAgICAgICAgTnVtTGl2ZVJldFZhbHMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXNlZCBieSBzb21ldGhpbmcgZWxzZSB0aGFuIGV4dHJhY3R2YWx1ZS4gTWFyayBhbGwgcmV0dXJuCisgICAgICAgICAgICAvLyB2YWx1ZXMgYXMgbGl2ZS4KKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUmV0Q291bnQ7ICsraSApCisgICAgICAgICAgICAgIFJldFZhbExpdmVuZXNzW2ldID0gTGl2ZTsKKyAgICAgICAgICAgIE51bUxpdmVSZXRWYWxzID0gUmV0Q291bnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNpbmdsZSByZXR1cm4gdmFsdWUKKyAgICAgICAgUmV0VmFsTGl2ZW5lc3NbMF0gPSBTdXJ2ZXlVc2VzKFRoZUNhbGwsIE1heWJlTGl2ZVJldFVzZXNbMF0pOworICAgICAgICBpZiAoUmV0VmFsTGl2ZW5lc3NbMF0gPT0gTGl2ZSkKKyAgICAgICAgICBOdW1MaXZlUmV0VmFscyA9IFJldENvdW50OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE5vdyB3ZSd2ZSBpbnNwZWN0ZWQgYWxsIGNhbGxlcnMsIHJlY29yZCB0aGUgbGl2ZW5lc3Mgb2Ygb3VyIHJldHVybiB2YWx1ZXMuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUmV0Q291bnQ7ICsraSkKKyAgICBNYXJrVmFsdWUoQ3JlYXRlUmV0KCZGLCBpKSwgUmV0VmFsTGl2ZW5lc3NbaV0sIE1heWJlTGl2ZVJldFVzZXNbaV0pOworCisgIERFQlVHKGRiZ3MoKSA8PCAiREFFIC0gSW5zcGVjdGluZyBhcmdzIGZvciBmbjogIiA8PCBGLmdldE5hbWUoKSA8PCAiXG4iKTsKKworICAvLyBOb3csIGNoZWNrIGFsbCBvZiBvdXIgYXJndW1lbnRzLgorICB1bnNpZ25lZCBpID0gMDsKKyAgVXNlVmVjdG9yIE1heWJlTGl2ZUFyZ1VzZXM7CisgIGZvciAoRnVuY3Rpb246OmNvbnN0X2FyZ19pdGVyYXRvciBBSSA9IEYuYXJnX2JlZ2luKCksCisgICAgICAgRSA9IEYuYXJnX2VuZCgpOyBBSSAhPSBFOyArK0FJLCArK2kpIHsKKyAgICAvLyBTZWUgd2hhdCB0aGUgZWZmZWN0IG9mIHRoaXMgdXNlIGlzIChyZWNvcmRpbmcgYW55IHVzZXMgdGhhdCBjYXVzZQorICAgIC8vIE1heWJlTGl2ZSBpbiBNYXliZUxpdmVBcmdVc2VzKS4KKyAgICBMaXZlbmVzcyBSZXN1bHQgPSBTdXJ2ZXlVc2VzKEFJLCBNYXliZUxpdmVBcmdVc2VzKTsKKyAgICAvLyBNYXJrIHRoZSByZXN1bHQuCisgICAgTWFya1ZhbHVlKENyZWF0ZUFyZygmRiwgaSksIFJlc3VsdCwgTWF5YmVMaXZlQXJnVXNlcyk7CisgICAgLy8gQ2xlYXIgdGhlIHZlY3RvciBhZ2FpbiBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgorICAgIE1heWJlTGl2ZUFyZ1VzZXMuY2xlYXIoKTsKKyAgfQorfQorCisvLy8gTWFya1ZhbHVlIC0gVGhpcyBmdW5jdGlvbiBtYXJrcyB0aGUgbGl2ZW5lc3Mgb2YgUkEgZGVwZW5kaW5nIG9uIEwuIElmIEwgaXMKKy8vLyBNYXliZUxpdmUsIGl0IGFsc28gdGFrZXMgYWxsIHVzZXMgaW4gTWF5YmVMaXZlVXNlcyBhbmQgcmVjb3JkcyB0aGVtIGluIFVzZXMsCisvLy8gc3VjaCB0aGF0IFJBIHdpbGwgYmUgbWFya2VkIGxpdmUgaWYgYW55IHVzZSBpbiBNYXliZUxpdmVVc2VzIGdldHMgbWFya2VkCisvLy8gbGl2ZSBsYXRlciBvbi4KK3ZvaWQgREFFOjpNYXJrVmFsdWUoY29uc3QgUmV0T3JBcmcgJlJBLCBMaXZlbmVzcyBMLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVc2VWZWN0b3IgJk1heWJlTGl2ZVVzZXMpIHsKKyAgc3dpdGNoIChMKSB7CisgICAgY2FzZSBMaXZlOiBNYXJrTGl2ZShSQSk7IGJyZWFrOworICAgIGNhc2UgTWF5YmVMaXZlOgorICAgIHsKKyAgICAgIC8vIE5vdGUgYW55IHVzZXMgb2YgdGhpcyB2YWx1ZSwgc28gdGhpcyByZXR1cm4gdmFsdWUgY2FuIGJlCisgICAgICAvLyBtYXJrZWQgbGl2ZSB3aGVuZXZlciBvbmUgb2YgdGhlIHVzZXMgYmVjb21lcyBsaXZlLgorICAgICAgZm9yIChVc2VWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIFVJID0gTWF5YmVMaXZlVXNlcy5iZWdpbigpLAorICAgICAgICAgICBVRSA9IE1heWJlTGl2ZVVzZXMuZW5kKCk7IFVJICE9IFVFOyArK1VJKQorICAgICAgICBVc2VzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqVUksIFJBKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLy8vIE1hcmtMaXZlIC0gTWFyayB0aGUgZ2l2ZW4gRnVuY3Rpb24gYXMgYWxpdmUsIG1lYW5pbmcgdGhhdCBpdCBjYW5ub3QgYmUKKy8vLyBjaGFuZ2VkIGluIGFueSB3YXkuIEFkZGl0aW9uYWxseSwKKy8vLyBtYXJrIGFueSB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBhcyB0aGlzIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycyBvciBieSBpdHMgcmV0dXJuCisvLy8gdmFsdWVzIChhY2NvcmRpbmcgdG8gVXNlcykgbGl2ZSBhcyB3ZWxsLgordm9pZCBEQUU6Ok1hcmtMaXZlKGNvbnN0IEZ1bmN0aW9uICZGKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiREFFIC0gSW50cmluc2ljYWxseSBsaXZlIGZuOiAiIDw8IEYuZ2V0TmFtZSgpIDw8ICJcbiIpOworICAvLyBNYXJrIHRoZSBmdW5jdGlvbiBhcyBsaXZlLgorICBMaXZlRnVuY3Rpb25zLmluc2VydCgmRik7CisgIC8vIE1hcmsgYWxsIGFyZ3VtZW50cyBhcyBsaXZlLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRi5hcmdfc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBQcm9wYWdhdGVMaXZlbmVzcyhDcmVhdGVBcmcoJkYsIGkpKTsKKyAgLy8gTWFyayBhbGwgcmV0dXJuIHZhbHVlcyBhcyBsaXZlLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtUmV0VmFscygmRik7IGkgIT0gZTsgKytpKQorICAgIFByb3BhZ2F0ZUxpdmVuZXNzKENyZWF0ZVJldCgmRiwgaSkpOworfQorCisvLy8gTWFya0xpdmUgLSBNYXJrIHRoZSBnaXZlbiByZXR1cm4gdmFsdWUgb3IgYXJndW1lbnQgYXMgbGl2ZS4gQWRkaXRpb25hbGx5LAorLy8vIG1hcmsgYW55IHZhbHVlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoaXMgdmFsdWUgKGFjY29yZGluZyB0byBVc2VzKSBsaXZlIGFzCisvLy8gd2VsbC4KK3ZvaWQgREFFOjpNYXJrTGl2ZShjb25zdCBSZXRPckFyZyAmUkEpIHsKKyAgaWYgKExpdmVGdW5jdGlvbnMuY291bnQoUkEuRikpCisgICAgcmV0dXJuOyAvLyBGdW5jdGlvbiB3YXMgYWxyZWFkeSBtYXJrZWQgTGl2ZS4KKworICBpZiAoIUxpdmVWYWx1ZXMuaW5zZXJ0KFJBKS5zZWNvbmQpCisgICAgcmV0dXJuOyAvLyBXZSB3ZXJlIGFscmVhZHkgbWFya2VkIExpdmUuCisKKyAgREVCVUcoZGJncygpIDw8ICJEQUUgLSBNYXJraW5nICIgPDwgUkEuZ2V0RGVzY3JpcHRpb24oKSA8PCAiIGxpdmVcbiIpOworICBQcm9wYWdhdGVMaXZlbmVzcyhSQSk7Cit9CisKKy8vLyBQcm9wYWdhdGVMaXZlbmVzcyAtIEdpdmVuIHRoYXQgUkEgaXMgYSBsaXZlIHZhbHVlLCBwcm9wYWdhdGUgaXQncyBsaXZlbmVzcworLy8vIHRvIGFueSBvdGhlciB2YWx1ZXMgaXQgdXNlcyAoYWNjb3JkaW5nIHRvIFVzZXMpLgordm9pZCBEQUU6OlByb3BhZ2F0ZUxpdmVuZXNzKGNvbnN0IFJldE9yQXJnICZSQSkgeworICAvLyBXZSBkb24ndCB1c2UgdXBwZXJfYm91bmQgKG9yIGVxdWFsX3JhbmdlKSBoZXJlLCBiZWNhdXNlIG91ciByZWN1cnNpdmUgY2FsbAorICAvLyB0byBvdXJzZWx2ZXMgaXMgbGlrZWx5IHRvIGNhdXNlIHRoZSB1cHBlcl9ib3VuZCAod2hpY2ggaXMgdGhlIGZpcnN0IHZhbHVlCisgIC8vIG5vdCBiZWxvbmdpbmcgdG8gUkEpIHRvIGJlY29tZSBlcmFzZWQgYW5kIHRoZSBpdGVyYXRvciBpbnZhbGlkYXRlZC4KKyAgVXNlTWFwOjppdGVyYXRvciBCZWdpbiA9IFVzZXMubG93ZXJfYm91bmQoUkEpOworICBVc2VNYXA6Oml0ZXJhdG9yIEUgPSBVc2VzLmVuZCgpOworICBVc2VNYXA6Oml0ZXJhdG9yIEk7CisgIGZvciAoSSA9IEJlZ2luOyBJICE9IEUgJiYgSS0+Zmlyc3QgPT0gUkE7ICsrSSkKKyAgICBNYXJrTGl2ZShJLT5zZWNvbmQpOworCisgIC8vIEVyYXNlIFJBIGZyb20gdGhlIFVzZXMgbWFwIChmcm9tIHRoZSBsb3dlciBib3VuZCB0byB3aGVyZXZlciB3ZSBlbmRlZCB1cAorICAvLyBhZnRlciB0aGUgbG9vcCkuCisgIFVzZXMuZXJhc2UoQmVnaW4sIEkpOworfQorCisvLyBSZW1vdmVEZWFkU3R1ZmZGcm9tRnVuY3Rpb24gLSBSZW1vdmUgYW55IGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcyBmcm9tIEYKKy8vIHRoYXQgYXJlIG5vdCBpbiBMaXZlVmFsdWVzLiBUcmFuc2Zvcm0gdGhlIGZ1bmN0aW9uIGFuZCBhbGwgb2YgdGhlIGNhbGxlZXMgb2YKKy8vIHRoZSBmdW5jdGlvbiB0byBub3QgaGF2ZSB0aGVzZSBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMuCisvLworYm9vbCBEQUU6OlJlbW92ZURlYWRTdHVmZkZyb21GdW5jdGlvbihGdW5jdGlvbiAqRikgeworICAvLyBEb24ndCBtb2RpZnkgZnVsbHkgbGl2ZSBmdW5jdGlvbnMKKyAgaWYgKExpdmVGdW5jdGlvbnMuY291bnQoRikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFN0YXJ0IGJ5IGNvbXB1dGluZyBhIG5ldyBwcm90b3R5cGUgZm9yIHRoZSBmdW5jdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMKKyAgLy8gdGhlIG9sZCBmdW5jdGlvbiwgYnV0IGhhcyBmZXdlciBhcmd1bWVudHMgYW5kIGEgZGlmZmVyZW50IHJldHVybiB0eXBlLgorICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IEYtPmdldEZ1bmN0aW9uVHlwZSgpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gUGFyYW1zOworCisgIC8vIFNldCB1cCB0byBidWlsZCBhIG5ldyBsaXN0IG9mIHBhcmFtZXRlciBhdHRyaWJ1dGVzLgorICBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVXaXRoSW5kZXgsIDg+IEF0dHJpYnV0ZXNWZWM7CisgIGNvbnN0IEF0dHJMaXN0UHRyICZQQUwgPSBGLT5nZXRBdHRyaWJ1dGVzKCk7CisKKyAgLy8gVGhlIGV4aXN0aW5nIGZ1bmN0aW9uIHJldHVybiBhdHRyaWJ1dGVzLgorICBBdHRyaWJ1dGVzIFJBdHRycyA9IFBBTC5nZXRSZXRBdHRyaWJ1dGVzKCk7CisgIEF0dHJpYnV0ZXMgRm5BdHRycyA9IFBBTC5nZXRGbkF0dHJpYnV0ZXMoKTsKKworICAvLyBGaW5kIG91dCB0aGUgbmV3IHJldHVybiB2YWx1ZS4KKworICBjb25zdCBUeXBlICpSZXRUeSA9IEZUeS0+Z2V0UmV0dXJuVHlwZSgpOworICBjb25zdCBUeXBlICpOUmV0VHkgPSBOVUxMOworICB1bnNpZ25lZCBSZXRDb3VudCA9IE51bVJldFZhbHMoRik7CisKKyAgLy8gLTEgbWVhbnMgdW51c2VkLCBvdGhlciBudW1iZXJzIGFyZSB0aGUgbmV3IGluZGV4CisgIFNtYWxsVmVjdG9yPGludCwgNT4gTmV3UmV0SWR4cyhSZXRDb3VudCwgLTEpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gUmV0VHlwZXM7CisgIGlmIChSZXRUeS0+aXNWb2lkVHkoKSkgeworICAgIE5SZXRUeSA9IFJldFR5OworICB9IGVsc2UgeworICAgIGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFJldFR5KTsKKyAgICBpZiAoU1R5KQorICAgICAgLy8gTG9vayBhdCBlYWNoIG9mIHRoZSBvcmlnaW5hbCByZXR1cm4gdmFsdWVzIGluZGl2aWR1YWxseS4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUmV0Q291bnQ7ICsraSkgeworICAgICAgICBSZXRPckFyZyBSZXQgPSBDcmVhdGVSZXQoRiwgaSk7CisgICAgICAgIGlmIChMaXZlVmFsdWVzLmVyYXNlKFJldCkpIHsKKyAgICAgICAgICBSZXRUeXBlcy5wdXNoX2JhY2soU1R5LT5nZXRFbGVtZW50VHlwZShpKSk7CisgICAgICAgICAgTmV3UmV0SWR4c1tpXSA9IFJldFR5cGVzLnNpemUoKSAtIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytOdW1SZXRWYWxzRWxpbWluYXRlZDsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkRBRSAtIFJlbW92aW5nIHJldHVybiB2YWx1ZSAiIDw8IGkgPDwgIiBmcm9tICIKKyAgICAgICAgICAgICAgICA8PCBGLT5nZXROYW1lKCkgPDwgIlxuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICAvLyBXZSB1c2VkIHRvIHJldHVybiBhIHNpbmdsZSB2YWx1ZS4KKyAgICAgIGlmIChMaXZlVmFsdWVzLmVyYXNlKENyZWF0ZVJldChGLCAwKSkpIHsKKyAgICAgICAgUmV0VHlwZXMucHVzaF9iYWNrKFJldFR5KTsKKyAgICAgICAgTmV3UmV0SWR4c1swXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkRBRSAtIFJlbW92aW5nIHJldHVybiB2YWx1ZSBmcm9tICIgPDwgRi0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgIDw8ICJcbiIpOworICAgICAgICArK051bVJldFZhbHNFbGltaW5hdGVkOworICAgICAgfQorICAgIGlmIChSZXRUeXBlcy5zaXplKCkgPiAxKQorICAgICAgLy8gTW9yZSB0aGFuIG9uZSByZXR1cm4gdHlwZT8gUmV0dXJuIGEgc3RydWN0IHdpdGggdGhlbS4gQWxzbywgaWYgd2UgdXNlZAorICAgICAgLy8gdG8gcmV0dXJuIGEgc3RydWN0IGFuZCBkaWRuJ3QgY2hhbmdlIHRoZSBudW1iZXIgb2YgcmV0dXJuIHZhbHVlcywKKyAgICAgIC8vIHJldHVybiBhIHN0cnVjdCBhZ2Fpbi4gVGhpcyBwcmV2ZW50cyBjaGFuZ2luZyB7c29tZXRoaW5nfSBpbnRvCisgICAgICAvLyBzb21ldGhpbmcgYW5kIHt9IGludG8gdm9pZC4KKyAgICAgIC8vIE1ha2UgdGhlIG5ldyBzdHJ1Y3QgcGFja2VkIGlmIHdlIHVzZWQgdG8gcmV0dXJuIGEgcGFja2VkIHN0cnVjdAorICAgICAgLy8gYWxyZWFkeS4KKyAgICAgIE5SZXRUeSA9IFN0cnVjdFR5cGU6OmdldChTVHktPmdldENvbnRleHQoKSwgUmV0VHlwZXMsIFNUeS0+aXNQYWNrZWQoKSk7CisgICAgZWxzZSBpZiAoUmV0VHlwZXMuc2l6ZSgpID09IDEpCisgICAgICAvLyBPbmUgcmV0dXJuIHR5cGU/IEp1c3QgYSBzaW1wbGUgdmFsdWUgdGhlbiwgYnV0IG9ubHkgaWYgd2UgZGlkbid0IHVzZSB0bworICAgICAgLy8gcmV0dXJuIGEgc3RydWN0IHdpdGggdGhhdCBzaW1wbGUgdmFsdWUgYmVmb3JlLgorICAgICAgTlJldFR5ID0gUmV0VHlwZXMuZnJvbnQoKTsKKyAgICBlbHNlIGlmIChSZXRUeXBlcy5zaXplKCkgPT0gMCkKKyAgICAgIC8vIE5vIHJldHVybiB0eXBlcz8gTWFrZSBpdCB2b2lkLCBidXQgb25seSBpZiB3ZSBkaWRuJ3QgdXNlIHRvIHJldHVybiB7fS4KKyAgICAgIE5SZXRUeSA9IFR5cGU6OmdldFZvaWRUeShGLT5nZXRDb250ZXh0KCkpOworICB9CisKKyAgYXNzZXJ0KE5SZXRUeSAmJiAiTm8gbmV3IHJldHVybiB0eXBlIGZvdW5kPyIpOworCisgIC8vIFJlbW92ZSBhbnkgaW5jb21wYXRpYmxlIGF0dHJpYnV0ZXMsIGJ1dCBvbmx5IGlmIHdlIHJlbW92ZWQgYWxsIHJldHVybgorICAvLyB2YWx1ZXMuIE90aGVyd2lzZSwgZW5zdXJlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhbnkgY29uZmxpY3RpbmcgYXR0cmlidXRlcworICAvLyBoZXJlLiBDdXJyZW50bHksIHRoaXMgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSwgYnV0IHNwZWNpYWwgaGFuZGxpbmcgbWlnaHQgYmUKKyAgLy8gcmVxdWlyZWQgd2hlbiBuZXcgcmV0dXJuIHZhbHVlIGF0dHJpYnV0ZXMgYXJlIGFkZGVkLgorICBpZiAoTlJldFR5LT5pc1ZvaWRUeSgpKQorICAgIFJBdHRycyAmPSB+QXR0cmlidXRlOjp0eXBlSW5jb21wYXRpYmxlKE5SZXRUeSk7CisgIGVsc2UKKyAgICBhc3NlcnQoKFJBdHRycyAmIEF0dHJpYnV0ZTo6dHlwZUluY29tcGF0aWJsZShOUmV0VHkpKSA9PSAwCisgICAgICAgICAgICYmICJSZXR1cm4gYXR0cmlidXRlcyBubyBsb25nZXIgY29tcGF0aWJsZT8iKTsKKworICBpZiAoUkF0dHJzKQorICAgIEF0dHJpYnV0ZXNWZWMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KDAsIFJBdHRycykpOworCisgIC8vIFJlbWVtYmVyIHdoaWNoIGFyZ3VtZW50cyBhcmUgc3RpbGwgYWxpdmUuCisgIFNtYWxsVmVjdG9yPGJvb2wsIDEwPiBBcmdBbGl2ZShGVHktPmdldE51bVBhcmFtcygpLCBmYWxzZSk7CisgIC8vIENvbnN0cnVjdCB0aGUgbmV3IHBhcmFtZXRlciBsaXN0IGZyb20gbm9uLWRlYWQgYXJndW1lbnRzLiBBbHNvIGNvbnN0cnVjdAorICAvLyBhIG5ldyBzZXQgb2YgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgdG8gY29ycmVzcG9uZC4gU2tpcCB0aGUgZmlyc3QgcGFyYW1ldGVyCisgIC8vIGF0dHJpYnV0ZSwgc2luY2UgdGhhdCBiZWxvbmdzIHRvIHRoZSByZXR1cm4gdmFsdWUuCisgIHVuc2lnbmVkIGkgPSAwOworICBmb3IgKEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgSSA9IEYtPmFyZ19iZWdpbigpLCBFID0gRi0+YXJnX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJLCArK2kpIHsKKyAgICBSZXRPckFyZyBBcmcgPSBDcmVhdGVBcmcoRiwgaSk7CisgICAgaWYgKExpdmVWYWx1ZXMuZXJhc2UoQXJnKSkgeworICAgICAgUGFyYW1zLnB1c2hfYmFjayhJLT5nZXRUeXBlKCkpOworICAgICAgQXJnQWxpdmVbaV0gPSB0cnVlOworCisgICAgICAvLyBHZXQgdGhlIG9yaWdpbmFsIHBhcmFtZXRlciBhdHRyaWJ1dGVzIChza2lwcGluZyB0aGUgZmlyc3Qgb25lLCB0aGF0IGlzCisgICAgICAvLyBmb3IgdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgIGlmIChBdHRyaWJ1dGVzIEF0dHJzID0gUEFMLmdldFBhcmFtQXR0cmlidXRlcyhpICsgMSkpCisgICAgICAgIEF0dHJpYnV0ZXNWZWMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KFBhcmFtcy5zaXplKCksIEF0dHJzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICsrTnVtQXJndW1lbnRzRWxpbWluYXRlZDsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiREFFIC0gUmVtb3ZpbmcgYXJndW1lbnQgIiA8PCBpIDw8ICIgKCIgPDwgSS0+Z2V0TmFtZSgpCisgICAgICAgICAgICA8PCAiKSBmcm9tICIgPDwgRi0+Z2V0TmFtZSgpIDw8ICJcbiIpOworICAgIH0KKyAgfQorCisgIGlmIChGbkF0dHJzICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICBBdHRyaWJ1dGVzVmVjLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCh+MCwgRm5BdHRycykpOworCisgIC8vIFJlY29uc3RydWN0IHRoZSBBdHRyaWJ1dGVzTGlzdCBiYXNlZCBvbiB0aGUgdmVjdG9yIHdlIGNvbnN0cnVjdGVkLgorICBBdHRyTGlzdFB0ciBOZXdQQUwgPSBBdHRyTGlzdFB0cjo6Z2V0KEF0dHJpYnV0ZXNWZWMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzVmVjLmVuZCgpKTsKKworICAvLyBDcmVhdGUgdGhlIG5ldyBmdW5jdGlvbiB0eXBlIGJhc2VkIG9uIHRoZSByZWNvbXB1dGVkIHBhcmFtZXRlcnMuCisgIEZ1bmN0aW9uVHlwZSAqTkZUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KE5SZXRUeSwgUGFyYW1zLCBGVHktPmlzVmFyQXJnKCkpOworCisgIC8vIE5vIGNoYW5nZT8KKyAgaWYgKE5GVHkgPT0gRlR5KQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBDcmVhdGUgdGhlIG5ldyBmdW5jdGlvbiBib2R5IGFuZCBpbnNlcnQgaXQgaW50byB0aGUgbW9kdWxlLi4uCisgIEZ1bmN0aW9uICpORiA9IEZ1bmN0aW9uOjpDcmVhdGUoTkZUeSwgRi0+Z2V0TGlua2FnZSgpKTsKKyAgTkYtPmNvcHlBdHRyaWJ1dGVzRnJvbShGKTsKKyAgTkYtPnNldEF0dHJpYnV0ZXMoTmV3UEFMKTsKKyAgLy8gSW5zZXJ0IHRoZSBuZXcgZnVuY3Rpb24gYmVmb3JlIHRoZSBvbGQgZnVuY3Rpb24sIHNvIHdlIHdvbid0IGJlIHByb2Nlc3NpbmcKKyAgLy8gaXQgYWdhaW4uCisgIEYtPmdldFBhcmVudCgpLT5nZXRGdW5jdGlvbkxpc3QoKS5pbnNlcnQoRiwgTkYpOworICBORi0+dGFrZU5hbWUoRik7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgY2FsbGVycyBvZiB0aGUgZnVuY3Rpb24sIHRyYW5zZm9ybWluZyB0aGUgY2FsbCBzaXRlcworICAvLyB0byBwYXNzIGluIGEgc21hbGxlciBudW1iZXIgb2YgYXJndW1lbnRzIGludG8gdGhlIG5ldyBmdW5jdGlvbi4KKyAgLy8KKyAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBBcmdzOworICB3aGlsZSAoIUYtPnVzZV9lbXB0eSgpKSB7CisgICAgQ2FsbFNpdGUgQ1MoRi0+dXNlX2JhY2soKSk7CisgICAgSW5zdHJ1Y3Rpb24gKkNhbGwgPSBDUy5nZXRJbnN0cnVjdGlvbigpOworCisgICAgQXR0cmlidXRlc1ZlYy5jbGVhcigpOworICAgIGNvbnN0IEF0dHJMaXN0UHRyICZDYWxsUEFMID0gQ1MuZ2V0QXR0cmlidXRlcygpOworCisgICAgLy8gVGhlIGNhbGwgcmV0dXJuIGF0dHJpYnV0ZXMuCisgICAgQXR0cmlidXRlcyBSQXR0cnMgPSBDYWxsUEFMLmdldFJldEF0dHJpYnV0ZXMoKTsKKyAgICBBdHRyaWJ1dGVzIEZuQXR0cnMgPSBDYWxsUEFMLmdldEZuQXR0cmlidXRlcygpOworICAgIC8vIEFkanVzdCBpbiBjYXNlIHRoZSBmdW5jdGlvbiB3YXMgY2hhbmdlZCB0byByZXR1cm4gdm9pZC4KKyAgICBSQXR0cnMgJj0gfkF0dHJpYnV0ZTo6dHlwZUluY29tcGF0aWJsZShORi0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICBpZiAoUkF0dHJzKQorICAgICAgQXR0cmlidXRlc1ZlYy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoMCwgUkF0dHJzKSk7CisKKyAgICAvLyBEZWNsYXJlIHRoZXNlIG91dHNpZGUgb2YgdGhlIGxvb3BzLCBzbyB3ZSBjYW4gcmV1c2UgdGhlbSBmb3IgdGhlIHNlY29uZAorICAgIC8vIGxvb3AsIHdoaWNoIGxvb3BzIHRoZSB2YXJhcmdzLgorICAgIENhbGxTaXRlOjphcmdfaXRlcmF0b3IgSSA9IENTLmFyZ19iZWdpbigpOworICAgIHVuc2lnbmVkIGkgPSAwOworICAgIC8vIExvb3Agb3ZlciB0aG9zZSBvcGVyYW5kcywgY29ycmVzcG9uZGluZyB0byB0aGUgbm9ybWFsIGFyZ3VtZW50cyB0byB0aGUKKyAgICAvLyBvcmlnaW5hbCBmdW5jdGlvbiwgYW5kIGFkZCB0aG9zZSB0aGF0IGFyZSBzdGlsbCBhbGl2ZS4KKyAgICBmb3IgKHVuc2lnbmVkIGUgPSBGVHktPmdldE51bVBhcmFtcygpOyBpICE9IGU7ICsrSSwgKytpKQorICAgICAgaWYgKEFyZ0FsaXZlW2ldKSB7CisgICAgICAgIEFyZ3MucHVzaF9iYWNrKCpJKTsKKyAgICAgICAgLy8gR2V0IG9yaWdpbmFsIHBhcmFtZXRlciBhdHRyaWJ1dGVzLCBidXQgc2tpcCByZXR1cm4gYXR0cmlidXRlcy4KKyAgICAgICAgaWYgKEF0dHJpYnV0ZXMgQXR0cnMgPSBDYWxsUEFMLmdldFBhcmFtQXR0cmlidXRlcyhpICsgMSkpCisgICAgICAgICAgQXR0cmlidXRlc1ZlYy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoQXJncy5zaXplKCksIEF0dHJzKSk7CisgICAgICB9CisKKyAgICAvLyBQdXNoIGFueSB2YXJhcmdzIGFyZ3VtZW50cyBvbiB0aGUgbGlzdC4gRG9uJ3QgZm9yZ2V0IHRoZWlyIGF0dHJpYnV0ZXMuCisgICAgZm9yIChDYWxsU2l0ZTo6YXJnX2l0ZXJhdG9yIEUgPSBDUy5hcmdfZW5kKCk7IEkgIT0gRTsgKytJLCArK2kpIHsKKyAgICAgIEFyZ3MucHVzaF9iYWNrKCpJKTsKKyAgICAgIGlmIChBdHRyaWJ1dGVzIEF0dHJzID0gQ2FsbFBBTC5nZXRQYXJhbUF0dHJpYnV0ZXMoaSArIDEpKQorICAgICAgICBBdHRyaWJ1dGVzVmVjLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldChBcmdzLnNpemUoKSwgQXR0cnMpKTsKKyAgICB9CisKKyAgICBpZiAoRm5BdHRycyAhPSBBdHRyaWJ1dGU6Ok5vbmUpCisgICAgICBBdHRyaWJ1dGVzVmVjLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCh+MCwgRm5BdHRycykpOworCisgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIEF0dHJpYnV0ZXNMaXN0IGJhc2VkIG9uIHRoZSB2ZWN0b3Igd2UgY29uc3RydWN0ZWQuCisgICAgQXR0ckxpc3RQdHIgTmV3Q2FsbFBBTCA9IEF0dHJMaXN0UHRyOjpnZXQoQXR0cmlidXRlc1ZlYy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNWZWMuZW5kKCkpOworCisgICAgSW5zdHJ1Y3Rpb24gKk5ldzsKKyAgICBpZiAoSW52b2tlSW5zdCAqSUkgPSBkeW5fY2FzdDxJbnZva2VJbnN0PihDYWxsKSkgeworICAgICAgTmV3ID0gSW52b2tlSW5zdDo6Q3JlYXRlKE5GLCBJSS0+Z2V0Tm9ybWFsRGVzdCgpLCBJSS0+Z2V0VW53aW5kRGVzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKSwgIiIsIENhbGwpOworICAgICAgY2FzdDxJbnZva2VJbnN0PihOZXcpLT5zZXRDYWxsaW5nQ29udihDUy5nZXRDYWxsaW5nQ29udigpKTsKKyAgICAgIGNhc3Q8SW52b2tlSW5zdD4oTmV3KS0+c2V0QXR0cmlidXRlcyhOZXdDYWxsUEFMKTsKKyAgICB9IGVsc2UgeworICAgICAgTmV3ID0gQ2FsbEluc3Q6OkNyZWF0ZShORiwgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLCAiIiwgQ2FsbCk7CisgICAgICBjYXN0PENhbGxJbnN0PihOZXcpLT5zZXRDYWxsaW5nQ29udihDUy5nZXRDYWxsaW5nQ29udigpKTsKKyAgICAgIGNhc3Q8Q2FsbEluc3Q+KE5ldyktPnNldEF0dHJpYnV0ZXMoTmV3Q2FsbFBBTCk7CisgICAgICBpZiAoY2FzdDxDYWxsSW5zdD4oQ2FsbCktPmlzVGFpbENhbGwoKSkKKyAgICAgICAgY2FzdDxDYWxsSW5zdD4oTmV3KS0+c2V0VGFpbENhbGwoKTsKKyAgICB9CisgICAgTmV3LT5zZXREZWJ1Z0xvYyhDYWxsLT5nZXREZWJ1Z0xvYygpKTsKKworICAgIEFyZ3MuY2xlYXIoKTsKKworICAgIGlmICghQ2FsbC0+dXNlX2VtcHR5KCkpIHsKKyAgICAgIGlmIChOZXctPmdldFR5cGUoKSA9PSBDYWxsLT5nZXRUeXBlKCkpIHsKKyAgICAgICAgLy8gUmV0dXJuIHR5cGUgbm90IGNoYW5nZWQ/IEp1c3QgcmVwbGFjZSB1c2VycyB0aGVuLgorICAgICAgICBDYWxsLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3KTsKKyAgICAgICAgTmV3LT50YWtlTmFtZShDYWxsKTsKKyAgICAgIH0gZWxzZSBpZiAoTmV3LT5nZXRUeXBlKCktPmlzVm9pZFR5KCkpIHsKKyAgICAgICAgLy8gT3VyIHJldHVybiB2YWx1ZSBoYXMgdXNlcywgYnV0IHRoZXkgd2lsbCBnZXQgcmVtb3ZlZCBsYXRlciBvbi4KKyAgICAgICAgLy8gUmVwbGFjZSBieSBudWxsIGZvciBub3cuCisgICAgICAgIENhbGwtPnJlcGxhY2VBbGxVc2VzV2l0aChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKENhbGwtPmdldFR5cGUoKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KFJldFR5LT5pc1N0cnVjdFR5KCkgJiYKKyAgICAgICAgICAgICAgICJSZXR1cm4gdHlwZSBjaGFuZ2VkLCBidXQgbm90IGludG8gYSB2b2lkLiBUaGUgb2xkIHJldHVybiB0eXBlIgorICAgICAgICAgICAgICAgIiBtdXN0IGhhdmUgYmVlbiBhIHN0cnVjdCEiKTsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydFB0ID0gQ2FsbDsKKyAgICAgICAgaWYgKEludm9rZUluc3QgKklJID0gZHluX2Nhc3Q8SW52b2tlSW5zdD4oQ2FsbCkpIHsKKyAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCA9IElJLT5nZXROb3JtYWxEZXN0KCktPmJlZ2luKCk7CisgICAgICAgICAgd2hpbGUgKGlzYTxQSElOb2RlPihJUCkpICsrSVA7CisgICAgICAgICAgSW5zZXJ0UHQgPSBJUDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHVzZWQgdG8gcmV0dXJuIGEgc3RydWN0LiBJbnN0ZWFkIG9mIGRvaW5nIHNtYXJ0IHN0dWZmIHdpdGggYWxsIHRoZQorICAgICAgICAvLyB1c2VzIG9mIHRoaXMgc3RydWN0LCB3ZSB3aWxsIGp1c3QgcmVidWlsZCBpdCB1c2luZworICAgICAgICAvLyBleHRyYWN0L2luc2VydHZhbHVlIGNoYWluaW5nIGFuZCBsZXQgaW5zdGNvbWJpbmUgY2xlYW4gdGhhdCB1cC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gU3RhcnQgb3V0IGJ1aWxkaW5nIHVwIG91ciByZXR1cm4gdmFsdWUgZnJvbSB1bmRlZgorICAgICAgICBWYWx1ZSAqUmV0VmFsID0gVW5kZWZWYWx1ZTo6Z2V0KFJldFR5KTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSZXRDb3VudDsgKytpKQorICAgICAgICAgIGlmIChOZXdSZXRJZHhzW2ldICE9IC0xKSB7CisgICAgICAgICAgICBWYWx1ZSAqVjsKKyAgICAgICAgICAgIGlmIChSZXRUeXBlcy5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAvLyBXZSBhcmUgc3RpbGwgcmV0dXJuaW5nIGEgc3RydWN0LCBzbyBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tIG91cgorICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgICAgViA9IEV4dHJhY3RWYWx1ZUluc3Q6OkNyZWF0ZShOZXcsIE5ld1JldElkeHNbaV0sICJuZXdyZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydFB0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgLy8gV2UgYXJlIG5vdyByZXR1cm5pbmcgYSBzaW5nbGUgZWxlbWVudCwgc28ganVzdCBpbnNlcnQgdGhhdAorICAgICAgICAgICAgICBWID0gTmV3OworICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSB2YWx1ZSBhdCB0aGUgb2xkIHBvc2l0aW9uCisgICAgICAgICAgICBSZXRWYWwgPSBJbnNlcnRWYWx1ZUluc3Q6OkNyZWF0ZShSZXRWYWwsIFYsIGksICJvbGRyZXQiLCBJbnNlcnRQdCk7CisgICAgICAgICAgfQorICAgICAgICAvLyBOb3csIHJlcGxhY2UgYWxsIHVzZXMgb2YgdGhlIG9sZCBjYWxsIGluc3RydWN0aW9uIHdpdGggdGhlIHJldHVybgorICAgICAgICAvLyBzdHJ1Y3Qgd2UgYnVpbHQKKyAgICAgICAgQ2FsbC0+cmVwbGFjZUFsbFVzZXNXaXRoKFJldFZhbCk7CisgICAgICAgIE5ldy0+dGFrZU5hbWUoQ2FsbCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRmluYWxseSwgcmVtb3ZlIHRoZSBvbGQgY2FsbCBmcm9tIHRoZSBwcm9ncmFtLCByZWR1Y2luZyB0aGUgdXNlLWNvdW50IG9mCisgICAgLy8gRi4KKyAgICBDYWxsLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorCisgIC8vIFNpbmNlIHdlIGhhdmUgbm93IGNyZWF0ZWQgdGhlIG5ldyBmdW5jdGlvbiwgc3BsaWNlIHRoZSBib2R5IG9mIHRoZSBvbGQKKyAgLy8gZnVuY3Rpb24gcmlnaHQgaW50byB0aGUgbmV3IGZ1bmN0aW9uLCBsZWF2aW5nIHRoZSBvbGQgcm90dGluZyBodWxrIG9mIHRoZQorICAvLyBmdW5jdGlvbiBlbXB0eS4KKyAgTkYtPmdldEJhc2ljQmxvY2tMaXN0KCkuc3BsaWNlKE5GLT5iZWdpbigpLCBGLT5nZXRCYXNpY0Jsb2NrTGlzdCgpKTsKKworICAvLyBMb29wIG92ZXIgdGhlIGFyZ3VtZW50IGxpc3QsIHRyYW5zZmVyaW5nIHVzZXMgb2YgdGhlIG9sZCBhcmd1bWVudHMgb3ZlciB0bworICAvLyB0aGUgbmV3IGFyZ3VtZW50cywgYWxzbyB0cmFuc2ZlcmluZyBvdmVyIHRoZSBuYW1lcyBhcyB3ZWxsLgorICBpID0gMDsKKyAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEkgPSBGLT5hcmdfYmVnaW4oKSwgRSA9IEYtPmFyZ19lbmQoKSwKKyAgICAgICBJMiA9IE5GLT5hcmdfYmVnaW4oKTsgSSAhPSBFOyArK0ksICsraSkKKyAgICBpZiAoQXJnQWxpdmVbaV0pIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBsaXZlIGFyZ3VtZW50LCBtb3ZlIHRoZSBuYW1lIGFuZCB1c2VycyBvdmVyIHRvIHRoZSBuZXcKKyAgICAgIC8vIHZlcnNpb24uCisgICAgICBJLT5yZXBsYWNlQWxsVXNlc1dpdGgoSTIpOworICAgICAgSTItPnRha2VOYW1lKEkpOworICAgICAgKytJMjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgdGhpcyBhcmd1bWVudCBpcyBkZWFkLCByZXBsYWNlIGFueSB1c2VzIG9mIGl0IHdpdGggbnVsbCBjb25zdGFudHMKKyAgICAgIC8vICh0aGVzZSBhcmUgZ3VhcmFudGVlZCB0byBiZWNvbWUgdW51c2VkIGxhdGVyIG9uKS4KKyAgICAgIEktPnJlcGxhY2VBbGxVc2VzV2l0aChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEktPmdldFR5cGUoKSkpOworICAgIH0KKworICAvLyBJZiB3ZSBjaGFuZ2UgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gd2UgbXVzdCByZXdyaXRlIGFueSByZXR1cm4KKyAgLy8gaW5zdHJ1Y3Rpb25zLiAgQ2hlY2sgdGhpcyBub3cuCisgIGlmIChGLT5nZXRSZXR1cm5UeXBlKCkgIT0gTkYtPmdldFJldHVyblR5cGUoKSkKKyAgICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCQiA9IE5GLT5iZWdpbigpLCBFID0gTkYtPmVuZCgpOyBCQiAhPSBFOyArK0JCKQorICAgICAgaWYgKFJldHVybkluc3QgKlJJID0gZHluX2Nhc3Q8UmV0dXJuSW5zdD4oQkItPmdldFRlcm1pbmF0b3IoKSkpIHsKKyAgICAgICAgVmFsdWUgKlJldFZhbDsKKworICAgICAgICBpZiAoTkZUeS0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeSgpKSB7CisgICAgICAgICAgUmV0VmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhc3NlcnQgKFJldFR5LT5pc1N0cnVjdFR5KCkpOworICAgICAgICAgIC8vIFRoZSBvcmlnaW5hbCByZXR1cm4gdmFsdWUgd2FzIGEgc3RydWN0LCBpbnNlcnQKKyAgICAgICAgICAvLyBleHRyYWN0dmFsdWUvaW5zZXJ0dmFsdWUgY2hhaW5zIHRvIGV4dHJhY3Qgb25seSB0aGUgdmFsdWVzIHdlIG5lZWQKKyAgICAgICAgICAvLyB0byByZXR1cm4gYW5kIGluc2VydCB0aGVtIGludG8gb3VyIG5ldyByZXN1bHQuCisgICAgICAgICAgLy8gVGhpcyBkb2VzIGdlbmVyYXRlIG1lc3N5IGNvZGUsIGJ1dCB3ZSdsbCBsZXQgaXQgdG8gaW5zdGNvbWJpbmUgdG8KKyAgICAgICAgICAvLyBjbGVhbiB0aGF0IHVwLgorICAgICAgICAgIFZhbHVlICpPbGRSZXQgPSBSSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgICAvLyBTdGFydCBvdXQgYnVpbGRpbmcgdXAgb3VyIHJldHVybiB2YWx1ZSBmcm9tIHVuZGVmCisgICAgICAgICAgUmV0VmFsID0gVW5kZWZWYWx1ZTo6Z2V0KE5SZXRUeSk7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSZXRDb3VudDsgKytpKQorICAgICAgICAgICAgaWYgKE5ld1JldElkeHNbaV0gIT0gLTEpIHsKKyAgICAgICAgICAgICAgRXh0cmFjdFZhbHVlSW5zdCAqRVYgPSBFeHRyYWN0VmFsdWVJbnN0OjpDcmVhdGUoT2xkUmV0LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2xkcmV0IiwgUkkpOworICAgICAgICAgICAgICBpZiAoUmV0VHlwZXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHN0aWxsIHJldHVybmluZyBhIHN0cnVjdCwgc28gcmVpbnNlcnQgdGhlIHZhbHVlIGludG8KKyAgICAgICAgICAgICAgICAvLyBvdXIgbmV3IHJldHVybiB2YWx1ZSBhdCB0aGUgbmV3IGluZGV4CisKKyAgICAgICAgICAgICAgICBSZXRWYWwgPSBJbnNlcnRWYWx1ZUluc3Q6OkNyZWF0ZShSZXRWYWwsIEVWLCBOZXdSZXRJZHhzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdyZXQiLCBSSSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIG5vdyBvbmx5IHJldHVybmluZyBhIHNpbXBsZSB2YWx1ZSwgc28ganVzdCByZXR1cm4gdGhlCisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdGVkIHZhbHVlLgorICAgICAgICAgICAgICAgIFJldFZhbCA9IEVWOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVwbGFjZSB0aGUgcmV0dXJuIGluc3RydWN0aW9uIHdpdGggb25lIHJldHVybmluZyB0aGUgbmV3IHJldHVybgorICAgICAgICAvLyB2YWx1ZSAocG9zc2libHkgMCBpZiB3ZSBiZWNhbWUgdm9pZCkuCisgICAgICAgIFJldHVybkluc3Q6OkNyZWF0ZShGLT5nZXRDb250ZXh0KCksIFJldFZhbCwgUkkpOworICAgICAgICBCQi0+Z2V0SW5zdExpc3QoKS5lcmFzZShSSSk7CisgICAgICB9CisKKyAgLy8gTm93IHRoYXQgdGhlIG9sZCBmdW5jdGlvbiBpcyBkZWFkLCBkZWxldGUgaXQuCisgIEYtPmVyYXNlRnJvbVBhcmVudCgpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIERBRTo6cnVuT25Nb2R1bGUoTW9kdWxlICZNKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIC8vIEZpcnN0IHBhc3M6IERvIGEgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbnkgZnVuY3Rpb25zIGNhbiBoYXZlIHRoZWlyICIuLi4iCisgIC8vIHJlbW92ZWQuICBXZSBjYW4gZG8gdGhpcyBpZiB0aGV5IG5ldmVyIGNhbGwgdmFfc3RhcnQuICBUaGlzIGxvb3AgY2Fubm90IGJlCisgIC8vIGZ1c2VkIHdpdGggdGhlIG5leHQgbG9vcCwgYmVjYXVzZSBkZWxldGluZyBhIGZ1bmN0aW9uIGludmFsaWRhdGVzCisgIC8vIGluZm9ybWF0aW9uIGNvbXB1dGVkIHdoaWxlIHN1cnZleWluZyBvdGhlciBmdW5jdGlvbnMuCisgIERFQlVHKGRiZ3MoKSA8PCAiREFFIC0gRGVsZXRpbmcgZGVhZCB2YXJhcmdzXG4iKTsKKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEkgPSBNLmJlZ2luKCksIEUgPSBNLmVuZCgpOyBJICE9IEU7ICkgeworICAgIEZ1bmN0aW9uICZGID0gKkkrKzsKKyAgICBpZiAoRi5nZXRGdW5jdGlvblR5cGUoKS0+aXNWYXJBcmcoKSkKKyAgICAgIENoYW5nZWQgfD0gRGVsZXRlRGVhZFZhcmFyZ3MoRik7CisgIH0KKworICAvLyBTZWNvbmQgcGhhc2U6bG9vcCB0aHJvdWdoIHRoZSBtb2R1bGUsIGRldGVybWluaW5nIHdoaWNoIGFyZ3VtZW50cyBhcmUgbGl2ZS4KKyAgLy8gV2UgYXNzdW1lIGFsbCBhcmd1bWVudHMgYXJlIGRlYWQgdW5sZXNzIHByb3ZlbiBvdGhlcndpc2UgKGFsbG93aW5nIHVzIHRvCisgIC8vIGRldGVybWluZSB0aGF0IGRlYWQgYXJndW1lbnRzIHBhc3NlZCBpbnRvIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgYXJlIGRlYWQpLgorICAvLworICBERUJVRyhkYmdzKCkgPDwgIkRBRSAtIERldGVybWluaW5nIGxpdmVuZXNzXG4iKTsKKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEkgPSBNLmJlZ2luKCksIEUgPSBNLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBTdXJ2ZXlGdW5jdGlvbigqSSk7CisKKyAgLy8gTm93LCByZW1vdmUgYWxsIGRlYWQgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWVzIGZyb20gZWFjaCBmdW5jdGlvbiBpbgorICAvLyB0dXJuLgorICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgSSA9IE0uYmVnaW4oKSwgRSA9IE0uZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgLy8gSW5jcmVtZW50IG5vdywgYmVjYXVzZSB0aGUgZnVuY3Rpb24gd2lsbCBwcm9iYWJseSBnZXQgcmVtb3ZlZCAoaWUuCisgICAgLy8gcmVwbGFjZWQgYnkgYSBuZXcgb25lKS4KKyAgICBGdW5jdGlvbiAqRiA9IEkrKzsKKyAgICBDaGFuZ2VkIHw9IFJlbW92ZURlYWRTdHVmZkZyb21GdW5jdGlvbihGKTsKKyAgfQorICByZXR1cm4gQ2hhbmdlZDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9EZWFkVHlwZUVsaW1pbmF0aW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9EZWFkVHlwZUVsaW1pbmF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGM1MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0RlYWRUeXBlRWxpbWluYXRpb24uY3BwCkBAIC0wLDAgKzEsMTA2IEBACisvLz09PS0gRGVhZFR5cGVFbGltaW5hdGlvbi5jcHAgLSBFbGltaW5hdGUgdW51c2VkIHR5cGVzIGZvciBzeW1ib2wgdGFibGUgLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpcyB1c2VkIHRvIGNsZWFudXAgdGhlIG91dHB1dCBvZiBHQ0MuICBJdCBlbGltaW5hdGUgbmFtZXMgZm9yIHR5cGVzCisvLyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhlIGVudGlyZSB0cmFuc2xhdGlvbiB1bml0LCB1c2luZyB0aGUgRmluZFVzZWRUeXBlcyBwYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiZGVhZHR5cGVlbGltIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0ZpbmRVc2VkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZVN5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtS2lsbGVkLCAiTnVtYmVyIG9mIHVudXNlZCB0eXBlbmFtZXMgcmVtb3ZlZCBmcm9tIHN5bXRhYiIpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRFRFIDogcHVibGljIE1vZHVsZVBhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgRFRFKCkgOiBNb2R1bGVQYXNzKElEKSB7fQorCisgICAgLy8gZG9QYXNzSW5pdGlhbGl6YXRpb24gLSBGb3IgdGhpcyBwYXNzLCBpdCByZW1vdmVzIGdsb2JhbCBzeW1ib2wgdGFibGUKKyAgICAvLyBlbnRyaWVzIGZvciBwcmltaXRpdmUgdHlwZXMuICBUaGVzZSBhcmUgbmV2ZXIgdXNlZCBmb3IgbGlua2luZyBpbiBHQ0MgYW5kCisgICAgLy8gdGhleSBtYWtlIHRoZSBvdXRwdXQgdWdsaWVyIHRvIGxvb2sgYXQsIHNvIHdlIG51a2UgdGhlbS4KKyAgICAvLworICAgIC8vIEFsc28sIGluaXRpYWxpemUgaW5zdGFuY2UgdmFyaWFibGVzLgorICAgIC8vCisgICAgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pOworCisgICAgLy8gZ2V0QW5hbHlzaXNVc2FnZSAtIFRoaXMgZnVuY3Rpb24gbmVlZHMgRmluZFVzZWRUeXBlcyB0byBkbyBpdHMgam9iLi4uCisgICAgLy8KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuYWRkUmVxdWlyZWQ8RmluZFVzZWRUeXBlcz4oKTsKKyAgICB9CisgIH07Cit9CisKK2NoYXIgRFRFOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoRFRFLCAiZGVhZHR5cGVlbGltIiwgIkRlYWQgVHlwZSBFbGltaW5hdGlvbiIsIGZhbHNlLCBmYWxzZSk7CisKK01vZHVsZVBhc3MgKmxsdm06OmNyZWF0ZURlYWRUeXBlRWxpbWluYXRpb25QYXNzKCkgeworICByZXR1cm4gbmV3IERURSgpOworfQorCisKKy8vIFNob3VsZE51a2VTeW10YWJFbnRyeSAtIFJldHVybiB0cnVlIGlmIHRoaXMgbW9kdWxlIGxldmVsIHN5bWJvbCB0YWJsZSBlbnRyeQorLy8gc2hvdWxkIGJlIGVsaW1pbmF0ZWQuCisvLworc3RhdGljIGlubGluZSBib29sIFNob3VsZE51a2VTeW10YWJFbnRyeShjb25zdCBUeXBlICpUeSl7CisgIC8vIE51a2UgYWxsIG5hbWVzIGZvciBwcmltaXRpdmUgdHlwZXMhCisgIGlmIChUeS0+aXNQcmltaXRpdmVUeXBlKCkgfHwgVHktPmlzSW50ZWdlclR5KCkpIAorICAgIHJldHVybiB0cnVlOworCisgIC8vIE51a2UgYWxsIHBvaW50ZXJzIHRvIHByaW1pdGl2ZSB0eXBlcyBhcyB3ZWxsLi4uCisgIGlmIChjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oVHkpKQorICAgIGlmIChQVC0+Z2V0RWxlbWVudFR5cGUoKS0+aXNQcmltaXRpdmVUeXBlKCkgfHwKKyAgICAgICAgUFQtPmdldEVsZW1lbnRUeXBlKCktPmlzSW50ZWdlclR5KCkpIAorICAgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBydW4gLSBGb3IgdGhpcyBwYXNzLCBpdCByZW1vdmVzIGdsb2JhbCBzeW1ib2wgdGFibGUgZW50cmllcyBmb3IgcHJpbWl0aXZlCisvLyB0eXBlcy4gIFRoZXNlIGFyZSBuZXZlciB1c2VkIGZvciBsaW5raW5nIGluIEdDQyBhbmQgdGhleSBtYWtlIHRoZSBvdXRwdXQKKy8vIHVnbGllciB0byBsb29rIGF0LCBzbyB3ZSBudWtlIHRoZW0uICBBbHNvIGVsaW1pbmF0ZSB0eXBlcyB0aGF0IGFyZSBuZXZlciB1c2VkCisvLyBpbiB0aGUgZW50aXJlIHByb2dyYW0gYXMgaW5kaWNhdGVkIGJ5IEZpbmRVc2VkVHlwZXMuCisvLworYm9vbCBEVEU6OnJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBUeXBlU3ltYm9sVGFibGUgJlNUID0gTS5nZXRUeXBlU3ltYm9sVGFibGUoKTsKKyAgc3RkOjpzZXQ8Y29uc3QgVHlwZSAqPiBVc2VkVHlwZXMgPSBnZXRBbmFseXNpczxGaW5kVXNlZFR5cGVzPigpLmdldFR5cGVzKCk7CisKKyAgLy8gQ2hlY2sgdGhlIHN5bWJvbCB0YWJsZSBmb3Igc3VwZXJmbHVvdXMgdHlwZSBlbnRyaWVzLi4uCisgIC8vCisgIC8vIEdyYWIgdGhlICd0eXBlJyBwbGFuZSBvZiB0aGUgbW9kdWxlIHN5bWJvbC4uLgorICBUeXBlU3ltYm9sVGFibGU6Oml0ZXJhdG9yIFRJID0gU1QuYmVnaW4oKTsKKyAgVHlwZVN5bWJvbFRhYmxlOjppdGVyYXRvciBURSA9IFNULmVuZCgpOworICB3aGlsZSAoIFRJICE9IFRFICkgeworICAgIC8vIElmIHRoaXMgZW50cnkgc2hvdWxkIGJlIHVuY29uZGl0aW9uYWxseSByZW1vdmVkLCBvciBpZiB3ZSBkZXRlY3QgdGhhdAorICAgIC8vIHRoZSB0eXBlIGlzIG5vdCB1c2VkLCByZW1vdmUgaXQuCisgICAgY29uc3QgVHlwZSAqUkhTID0gVEktPnNlY29uZDsKKyAgICBpZiAoU2hvdWxkTnVrZVN5bXRhYkVudHJ5KFJIUykgfHwgIVVzZWRUeXBlcy5jb3VudChSSFMpKSB7CisgICAgICBTVC5yZW1vdmUoVEkrKyk7CisgICAgICArK051bUtpbGxlZDsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICArK1RJOworICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIGxlYXZlIG9uZSBuYW1lIGZvciBlYWNoIHR5cGUuCisgICAgICBVc2VkVHlwZXMuZXJhc2UoUkhTKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8gdmltOiBzdz0yCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vRXh0cmFjdEdWLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9FeHRyYWN0R1YuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjY5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vRXh0cmFjdEdWLmNwcApAQCAtMCwwICsxLDE3NSBAQAorLy89PT0tLSBFeHRyYWN0R1YuY3BwIC0gR2xvYmFsIFZhbHVlIGV4dHJhY3Rpb24gcGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgZXh0cmFjdHMgZ2xvYmFsIHZhbHVlcworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICAvLy8gQGJyaWVmIEEgcGFzcyB0byBleHRyYWN0IHNwZWNpZmljIGZ1bmN0aW9ucyBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzLgorICBjbGFzcyBHVkV4dHJhY3RvclBhc3MgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgICAgc3RkOjp2ZWN0b3I8R2xvYmFsVmFsdWUqPiBOYW1lZDsKKyAgICBib29sIGRlbGV0ZVN0dWZmOworICAgIGJvb2wgcmVMaW5rOworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICAgIC8vLyBGdW5jdGlvbkV4dHJhY3RvclBhc3MgLSBJZiBkZWxldGVGbiBpcyB0cnVlLCB0aGlzIHBhc3MgZGVsZXRlcyBhcyB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGZ1bmN0aW9uLiBPdGhlcndpc2UsIGl0IGRlbGV0ZXMgYXMgbXVjaCBvZiB0aGUgbW9kdWxlIGFzCisgICAgLy8vIHBvc3NpYmxlLCBleGNlcHQgZm9yIHRoZSBmdW5jdGlvbiBzcGVjaWZpZWQuCisgICAgLy8vCisgICAgZXhwbGljaXQgR1ZFeHRyYWN0b3JQYXNzKHN0ZDo6dmVjdG9yPEdsb2JhbFZhbHVlKj4mIEdWcywgYm9vbCBkZWxldGVTID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWxpbmtDYWxsZWVzID0gZmFsc2UpCisgICAgICA6IE1vZHVsZVBhc3MoSUQpLCBOYW1lZChHVnMpLCBkZWxldGVTdHVmZihkZWxldGVTKSwKKyAgICAgICAgcmVMaW5rKHJlbGlua0NhbGxlZXMpIHt9CisKKyAgICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICAgICAgaWYgKE5hbWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIE5vdGhpbmcgdG8gZXh0cmFjdAorICAgICAgfQorICAgICAgCisgICAgICAKKyAgICAgIGlmIChkZWxldGVTdHVmZikKKyAgICAgICAgcmV0dXJuIGRlbGV0ZUdWKCk7CisgICAgICBNLnNldE1vZHVsZUlubGluZUFzbSgiIik7CisgICAgICByZXR1cm4gaXNvbGF0ZUdWKE0pOworICAgIH0KKworICAgIGJvb2wgZGVsZXRlR1YoKSB7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPEdsb2JhbFZhbHVlKj46Oml0ZXJhdG9yIEdJID0gTmFtZWQuYmVnaW4oKSwgCisgICAgICAgICAgICAgR0UgPSBOYW1lZC5lbmQoKTsgR0kgIT0gR0U7ICsrR0kpIHsKKyAgICAgICAgaWYgKEZ1bmN0aW9uKiBOYW1lZEZ1bmMgPSBkeW5fY2FzdDxGdW5jdGlvbj4oKkdJKSkgeworICAgICAgICAgLy8gSWYgd2UncmUgaW4gcmVsaW5raW5nIG1vZGUsIHNldCBsaW5rYWdlIG9mIGFsbCBpbnRlcm5hbCBjYWxsZWVzIHRvCisgICAgICAgICAvLyBleHRlcm5hbC4gVGhpcyB3aWxsIGFsbG93IHVzIGV4dHJhY3QgZnVuY3Rpb24sIGFuZCB0aGVuIC0gbGluaworICAgICAgICAgLy8gZXZlcnl0aGluZyB0b2dldGhlcgorICAgICAgICAgaWYgKHJlTGluaykgeworICAgICAgICAgICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCID0gTmFtZWRGdW5jLT5iZWdpbigpLCBCRSA9IE5hbWVkRnVuYy0+ZW5kKCk7CisgICAgICAgICAgICAgICAgQiAhPSBCRTsgKytCKSB7CisgICAgICAgICAgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQi0+YmVnaW4oKSwgRSA9IEItPmVuZCgpOworICAgICAgICAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgICAgICAgIGlmIChDYWxsSW5zdCogY2FsbEluc3QgPSBkeW5fY2FzdDxDYWxsSW5zdD4oJipJKSkgeworICAgICAgICAgICAgICAgICBGdW5jdGlvbiogQ2FsbGVlID0gY2FsbEluc3QtPmdldENhbGxlZEZ1bmN0aW9uKCk7CisgICAgICAgICAgICAgICAgIGlmIChDYWxsZWUgJiYgQ2FsbGVlLT5oYXNMb2NhbExpbmthZ2UoKSkKKyAgICAgICAgICAgICAgICAgICBDYWxsZWUtPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgIE5hbWVkRnVuYy0+c2V0TGlua2FnZShHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlKTsKKyAgICAgICAgIE5hbWVkRnVuYy0+ZGVsZXRlQm9keSgpOworICAgICAgICAgYXNzZXJ0KE5hbWVkRnVuYy0+aXNEZWNsYXJhdGlvbigpICYmICJUaGlzIGRpZG4ndCBtYWtlIHRoZSBmdW5jdGlvbiBleHRlcm5hbCEiKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghKCpHSSktPmlzRGVjbGFyYXRpb24oKSkgeworICAgICAgICAgICAgY2FzdDxHbG9iYWxWYXJpYWJsZT4oKkdJKS0+c2V0SW5pdGlhbGl6ZXIoMCk7ICAvL2NsZWFyIHRoZSBpbml0aWFsaXplcgorICAgICAgICAgICAgKCpHSSktPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGlzb2xhdGVHVihNb2R1bGUgJk0pIHsKKyAgICAgIC8vIE1hcmsgYWxsIGdsb2JhbHMgaW50ZXJuYWwKKyAgICAgIC8vIEZJWE1FOiB3aGF0IHNob3VsZCB3ZSBkbyB3aXRoIHByaXZhdGUgbGlua2FnZT8KKyAgICAgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgIGlmICghSS0+aXNEZWNsYXJhdGlvbigpKSB7CisgICAgICAgICAgSS0+c2V0TGlua2FnZShHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlKTsKKyAgICAgICAgfQorICAgICAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEkgPSBNLmJlZ2luKCksIEUgPSBNLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgaWYgKCFJLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgICAgICBJLT5zZXRMaW5rYWdlKEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UpOworICAgICAgICB9CisKKyAgICAgIC8vIE1ha2Ugc3VyZSBvdXIgcmVzdWx0IGlzIGdsb2JhbGx5IGFjY2Vzc2libGUuLi4KKyAgICAgIC8vIGJ5IHB1dHRpbmcgdGhlbSBpbiB0aGUgdXNlZCBhcnJheQorICAgICAgeworICAgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCAqPiBBVUdzOworICAgICAgICBjb25zdCBUeXBlICpTQlA9CisgICAgICAgICAgICAgIFR5cGU6OmdldEludDhQdHJUeShNLmdldENvbnRleHQoKSk7CisgICAgICAgIGZvciAoc3RkOjp2ZWN0b3I8R2xvYmFsVmFsdWUqPjo6aXRlcmF0b3IgR0kgPSBOYW1lZC5iZWdpbigpLCAKKyAgICAgICAgICAgICAgIEdFID0gTmFtZWQuZW5kKCk7IEdJICE9IEdFOyArK0dJKSB7CisgICAgICAgICAgKCpHSSktPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSk7CisgICAgICAgICAgQVVHcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KCpHSSwgU0JQKSk7CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlUeXBlICpBVCA9IEFycmF5VHlwZTo6Z2V0KFNCUCwgQVVHcy5zaXplKCkpOworICAgICAgICBDb25zdGFudCAqSW5pdCA9IENvbnN0YW50QXJyYXk6OmdldChBVCwgQVVHcyk7CisgICAgICAgIEdsb2JhbFZhbHVlICpndiA9IG5ldyBHbG9iYWxWYXJpYWJsZShNLCBBVCwgZmFsc2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkFwcGVuZGluZ0xpbmthZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdCwgImxsdm0udXNlZCIpOworICAgICAgICBndi0+c2V0U2VjdGlvbigibGx2bS5tZXRhZGF0YSIpOworICAgICAgfQorCisgICAgICAvLyBBbGwgb2YgdGhlIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZCBieSBnbG9iYWwgdmFyaWFibGVzIG9yIHRoZSBuYW1lZAorICAgICAgLy8gZ2xvYmFscy4gIExvb3AgdGhyb3VnaCB0aGVtIGFuZCBjcmVhdGUgYSBuZXcsIGV4dGVybmFsIGZ1bmN0aW9ucyB0aGF0CisgICAgICAvLyBjYW4gYmUgInVzZWQiLCBpbnN0ZWFkIG9mIG9uZXMgd2l0aCBib2RpZXMuCisgICAgICBzdGQ6OnZlY3RvcjxGdW5jdGlvbio+IE5ld0Z1bmN0aW9uczsKKworICAgICAgRnVuY3Rpb24gKkxhc3QgPSAtLU0uZW5kKCk7ICAvLyBGaWd1cmUgb3V0IHdoZXJlIHRoZSBsYXN0IHJlYWwgZm4gaXMuCisKKyAgICAgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpOyA7ICsrSSkgeworICAgICAgICBpZiAoc3RkOjpmaW5kKE5hbWVkLmJlZ2luKCksIE5hbWVkLmVuZCgpLCAmKkkpID09IE5hbWVkLmVuZCgpKSB7CisgICAgICAgICAgRnVuY3Rpb24gKk5ldyA9IEZ1bmN0aW9uOjpDcmVhdGUoSS0+Z2V0RnVuY3Rpb25UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSk7CisgICAgICAgICAgTmV3LT5jb3B5QXR0cmlidXRlc0Zyb20oSSk7CisKKyAgICAgICAgICAvLyBJZiBpdCdzIG5vdCB0aGUgbmFtZWQgZnVuY3Rpb24sIGRlbGV0ZSB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgICAgICBJLT5kcm9wQWxsUmVmZXJlbmNlcygpOworCisgICAgICAgICAgTS5nZXRGdW5jdGlvbkxpc3QoKS5wdXNoX2JhY2soTmV3KTsKKyAgICAgICAgICBOZXdGdW5jdGlvbnMucHVzaF9iYWNrKE5ldyk7CisgICAgICAgICAgTmV3LT50YWtlTmFtZShJKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgmKkkgPT0gTGFzdCkgYnJlYWs7ICAvLyBTdG9wIGFmdGVyIHByb2Nlc3NpbmcgdGhlIGxhc3QgZnVuY3Rpb24KKyAgICAgIH0KKworICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSByZXBsYWNlbWVudHMgYWxsIHNldCB1cCwgbG9vcCB0aHJvdWdoIHRoZSBtb2R1bGUsCisgICAgICAvLyBkZWxldGluZyB0aGUgb2xkIGZ1bmN0aW9ucywgcmVwbGFjaW5nIHRoZW0gd2l0aCB0aGUgbmV3bHkgY3JlYXRlZAorICAgICAgLy8gZnVuY3Rpb25zLgorICAgICAgaWYgKCFOZXdGdW5jdGlvbnMuZW1wdHkoKSkgeworICAgICAgICB1bnNpZ25lZCBGdW5jTnVtID0gMDsKKyAgICAgICAgTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpOworICAgICAgICBkbyB7CisgICAgICAgICAgaWYgKHN0ZDo6ZmluZChOYW1lZC5iZWdpbigpLCBOYW1lZC5lbmQoKSwgJipJKSA9PSBOYW1lZC5lbmQoKSkgeworICAgICAgICAgICAgLy8gTWFrZSBldmVyeXRoaW5nIHRoYXQgdXNlcyB0aGUgb2xkIGZ1bmN0aW9uIHVzZSB0aGUgbmV3IGR1bW15IGZuCisgICAgICAgICAgICBJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3RnVuY3Rpb25zW0Z1bmNOdW0rK10pOworCisgICAgICAgICAgICBGdW5jdGlvbiAqT2xkID0gSTsKKyAgICAgICAgICAgICsrSTsgIC8vIE1vdmUgdGhlIGl0ZXJhdG9yIHRvIHRoZSBuZXcgZnVuY3Rpb24KKworICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBvbGQgZnVuY3Rpb24hCisgICAgICAgICAgICBNLmdldEZ1bmN0aW9uTGlzdCgpLmVyYXNlKE9sZCk7CisKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytJOyAgLy8gU2tpcCB0aGUgZnVuY3Rpb24gd2UgYXJlIGV4dHJhY3RpbmcKKyAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCYqSSAhPSBOZXdGdW5jdGlvbnNbMF0pOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH07CisKKyAgY2hhciBHVkV4dHJhY3RvclBhc3M6OklEID0gMDsKK30KKworTW9kdWxlUGFzcyAqbGx2bTo6Y3JlYXRlR1ZFeHRyYWN0aW9uUGFzcyhzdGQ6OnZlY3RvcjxHbG9iYWxWYWx1ZSo+JiBHVnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlbGV0ZUZuLCBib29sIHJlbGlua0NhbGxlZXMpIHsKKyAgcmV0dXJuIG5ldyBHVkV4dHJhY3RvclBhc3MoR1ZzLCBkZWxldGVGbiwgcmVsaW5rQ2FsbGVlcyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25BdHRycy5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25BdHRycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2NWJhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9GdW5jdGlvbkF0dHJzLmNwcApAQCAtMCwwICsxLDM5MSBAQAorLy89PT0tIEZ1bmN0aW9uQXR0cnMuY3BwIC0gUGFzcyB3aGljaCBtYXJrcyBmdW5jdGlvbnMgcmVhZG5vbmUgb3IgcmVhZG9ubHkgPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHNpbXBsZSBpbnRlcnByb2NlZHVyYWwgcGFzcyB3aGljaCB3YWxrcyB0aGUKKy8vIGNhbGwtZ3JhcGgsIGxvb2tpbmcgZm9yIGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgYWNjZXNzIG9yIG9ubHkgcmVhZAorLy8gbm9uLWxvY2FsIG1lbW9yeSwgYW5kIG1hcmtpbmcgdGhlbSByZWFkbm9uZS9yZWFkb25seS4gIEluIGFkZGl0aW9uLAorLy8gaXQgbWFya3MgZnVuY3Rpb24gYXJndW1lbnRzIChvZiBwb2ludGVyIHR5cGUpICdub2NhcHR1cmUnIGlmIGEgY2FsbAorLy8gdG8gdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNyZWF0ZSBhbnkgY29waWVzIG9mIHRoZSBwb2ludGVyIHZhbHVlIHRoYXQKKy8vIG91dGxpdmUgdGhlIGNhbGwuICBUaGlzIG1vcmUgb3IgbGVzcyBtZWFucyB0aGF0IHRoZSBwb2ludGVyIGlzIG9ubHkKKy8vIGRlcmVmZXJlbmNlZCwgYW5kIG5vdCByZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbiBvciBzdG9yZWQgaW4gYSBnbG9iYWwuCisvLyBUaGlzIHBhc3MgaXMgaW1wbGVtZW50ZWQgYXMgYSBib3R0b20tdXAgdHJhdmVyc2FsIG9mIHRoZSBjYWxsLWdyYXBoLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiZnVuY3Rpb25hdHRycyIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9DYWxsR3JhcGhTQ0NQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DYXB0dXJlVHJhY2tpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL01lbW9yeUJ1aWx0aW5zLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9VbmlxdWVWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSW5zdEl0ZXJhdG9yLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bVJlYWROb25lLCAiTnVtYmVyIG9mIGZ1bmN0aW9ucyBtYXJrZWQgcmVhZG5vbmUiKTsKK1NUQVRJU1RJQyhOdW1SZWFkT25seSwgIk51bWJlciBvZiBmdW5jdGlvbnMgbWFya2VkIHJlYWRvbmx5Iik7CitTVEFUSVNUSUMoTnVtTm9DYXB0dXJlLCAiTnVtYmVyIG9mIGFyZ3VtZW50cyBtYXJrZWQgbm9jYXB0dXJlIik7CitTVEFUSVNUSUMoTnVtTm9BbGlhcywgIk51bWJlciBvZiBmdW5jdGlvbiByZXR1cm5zIG1hcmtlZCBub2FsaWFzIik7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBGdW5jdGlvbkF0dHJzIDogcHVibGljIENhbGxHcmFwaFNDQ1Bhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgRnVuY3Rpb25BdHRycygpIDogQ2FsbEdyYXBoU0NDUGFzcyhJRCkge30KKworICAgIC8vIHJ1bk9uU0NDIC0gQW5hbHl6ZSB0aGUgU0NDLCBwZXJmb3JtaW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiBpZiBwb3NzaWJsZS4KKyAgICBib29sIHJ1bk9uU0NDKENhbGxHcmFwaFNDQyAmU0NDKTsKKworICAgIC8vIEFkZFJlYWRBdHRycyAtIERlZHVjZSByZWFkb25seS9yZWFkbm9uZSBhdHRyaWJ1dGVzIGZvciB0aGUgU0NDLgorICAgIGJvb2wgQWRkUmVhZEF0dHJzKGNvbnN0IENhbGxHcmFwaFNDQyAmU0NDKTsKKworICAgIC8vIEFkZE5vQ2FwdHVyZUF0dHJzIC0gRGVkdWNlIG5vY2FwdHVyZSBhdHRyaWJ1dGVzIGZvciB0aGUgU0NDLgorICAgIGJvb2wgQWRkTm9DYXB0dXJlQXR0cnMoY29uc3QgQ2FsbEdyYXBoU0NDICZTQ0MpOworCisgICAgLy8gSXNGdW5jdGlvbk1hbGxvY0xpa2UgLSBEb2VzIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGUgbmV3IG1lbW9yeT8KKyAgICBib29sIElzRnVuY3Rpb25NYWxsb2NMaWtlKEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8RnVuY3Rpb24qLCA4PiAmKSBjb25zdDsKKworICAgIC8vIEFkZE5vQWxpYXNBdHRycyAtIERlZHVjZSBub2FsaWFzIGF0dHJpYnV0ZXMgZm9yIHRoZSBTQ0MuCisgICAgYm9vbCBBZGROb0FsaWFzQXR0cnMoY29uc3QgQ2FsbEdyYXBoU0NDICZTQ0MpOworCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLnNldFByZXNlcnZlc0NGRygpOworICAgICAgQ2FsbEdyYXBoU0NDUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgICAgYm9vbCBQb2ludHNUb0xvY2FsTWVtb3J5KFZhbHVlICpWKTsKKyAgfTsKK30KKworY2hhciBGdW5jdGlvbkF0dHJzOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoRnVuY3Rpb25BdHRycywgImZ1bmN0aW9uYXR0cnMiLAorICAgICAgICAgICAgICAgICJEZWR1Y2UgZnVuY3Rpb24gYXR0cmlidXRlcyIsIGZhbHNlLCBmYWxzZSk7CisKK1Bhc3MgKmxsdm06OmNyZWF0ZUZ1bmN0aW9uQXR0cnNQYXNzKCkgeyByZXR1cm4gbmV3IEZ1bmN0aW9uQXR0cnMoKTsgfQorCisKKy8vLyBQb2ludHNUb0xvY2FsTWVtb3J5IC0gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBwb2ludGVyIHZhbHVlIHBvaW50cyB0bworLy8vIG1lbW9yeSB0aGF0IGlzIGxvY2FsIHRvIHRoZSBmdW5jdGlvbi4gIEdsb2JhbCBjb25zdGFudHMgYXJlIGNvbnNpZGVyZWQKKy8vLyBsb2NhbCB0byBhbGwgZnVuY3Rpb25zLgorYm9vbCBGdW5jdGlvbkF0dHJzOjpQb2ludHNUb0xvY2FsTWVtb3J5KFZhbHVlICpWKSB7CisgIFNtYWxsVmVjdG9yPFZhbHVlKiwgMTY+IFdvcmtsaXN0OworICB1bnNpZ25lZCBNYXhMb29rdXAgPSA4OworCisgIFdvcmtsaXN0LnB1c2hfYmFjayhWKTsKKworICBkbyB7CisgICAgViA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCk7CisKKyAgICAvLyBBbiBhbGxvY2EgaW5zdHJ1Y3Rpb24gZGVmaW5lcyBsb2NhbCBtZW1vcnkuCisgICAgaWYgKGlzYTxBbGxvY2FJbnN0PihWKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gQSBnbG9iYWwgY29uc3RhbnQgY291bnRzIGFzIGxvY2FsIG1lbW9yeSBmb3Igb3VyIHB1cnBvc2VzLgorICAgIGlmIChHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oVikpIHsKKyAgICAgIGlmICghR1YtPmlzQ29uc3RhbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgYm90aCBzZWxlY3QgdmFsdWVzIHBvaW50IHRvIGxvY2FsIG1lbW9yeSwgdGhlbiBzbyBkb2VzIHRoZSBzZWxlY3QuCisgICAgaWYgKFNlbGVjdEluc3QgKlNJID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oVikpIHsKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhTSS0+Z2V0VHJ1ZVZhbHVlKCkpOworICAgICAgV29ya2xpc3QucHVzaF9iYWNrKFNJLT5nZXRGYWxzZVZhbHVlKCkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgYWxsIHZhbHVlcyBpbmNvbWluZyB0byBhIHBoaSBub2RlIHBvaW50IHRvIGxvY2FsIG1lbW9yeSwgdGhlbiBzbyBkb2VzCisgICAgLy8gdGhlIHBoaS4KKyAgICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihWKSkgeworICAgICAgLy8gRG9uJ3QgYm90aGVyIGluc3BlY3RpbmcgcGhpIG5vZGVzIHdpdGggbWFueSBvcGVyYW5kcy4KKyAgICAgIGlmIChQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKSA+IE1heExvb2t1cCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgV29ya2xpc3QucHVzaF9iYWNrKFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfSB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkgJiYgLS1NYXhMb29rdXApOworCisgIHJldHVybiBXb3JrbGlzdC5lbXB0eSgpOworfQorCisvLy8gQWRkUmVhZEF0dHJzIC0gRGVkdWNlIHJlYWRvbmx5L3JlYWRub25lIGF0dHJpYnV0ZXMgZm9yIHRoZSBTQ0MuCitib29sIEZ1bmN0aW9uQXR0cnM6OkFkZFJlYWRBdHRycyhjb25zdCBDYWxsR3JhcGhTQ0MgJlNDQykgeworICBTbWFsbFB0clNldDxGdW5jdGlvbiosIDg+IFNDQ05vZGVzOworCisgIC8vIEZpbGwgU0NDTm9kZXMgd2l0aCB0aGUgZWxlbWVudHMgb2YgdGhlIFNDQy4gIFVzZWQgZm9yIHF1aWNrbHkKKyAgLy8gbG9va2luZyB1cCB3aGV0aGVyIGEgZ2l2ZW4gQ2FsbEdyYXBoTm9kZSBpcyBpbiB0aGlzIFNDQy4KKyAgZm9yIChDYWxsR3JhcGhTQ0M6Oml0ZXJhdG9yIEkgPSBTQ0MuYmVnaW4oKSwgRSA9IFNDQy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgU0NDTm9kZXMuaW5zZXJ0KCgqSSktPmdldEZ1bmN0aW9uKCkpOworCisgIC8vIENoZWNrIGlmIGFueSBvZiB0aGUgZnVuY3Rpb25zIGluIHRoZSBTQ0MgcmVhZCBvciB3cml0ZSBtZW1vcnkuICBJZiB0aGV5CisgIC8vIHdyaXRlIG1lbW9yeSB0aGVuIHRoZXkgY2FuJ3QgYmUgbWFya2VkIHJlYWRub25lIG9yIHJlYWRvbmx5LgorICBib29sIFJlYWRzTWVtb3J5ID0gZmFsc2U7CisgIGZvciAoQ2FsbEdyYXBoU0NDOjppdGVyYXRvciBJID0gU0NDLmJlZ2luKCksIEUgPSBTQ0MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgRnVuY3Rpb24gKkYgPSAoKkkpLT5nZXRGdW5jdGlvbigpOworCisgICAgaWYgKEYgPT0gMCkKKyAgICAgIC8vIEV4dGVybmFsIG5vZGUgLSBtYXkgd3JpdGUgbWVtb3J5LiAgSnVzdCBnaXZlIHVwLgorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKEYtPmRvZXNOb3RBY2Nlc3NNZW1vcnkoKSkKKyAgICAgIC8vIEFscmVhZHkgcGVyZmVjdCEKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gRGVmaW5pdGlvbnMgd2l0aCB3ZWFrIGxpbmthZ2UgbWF5IGJlIG92ZXJyaWRkZW4gYXQgbGlua3RpbWUgd2l0aAorICAgIC8vIHNvbWV0aGluZyB0aGF0IHdyaXRlcyBtZW1vcnksIHNvIHRyZWF0IHRoZW0gbGlrZSBkZWNsYXJhdGlvbnMuCisgICAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSB8fCBGLT5tYXlCZU92ZXJyaWRkZW4oKSkgeworICAgICAgaWYgKCFGLT5vbmx5UmVhZHNNZW1vcnkoKSkKKyAgICAgICAgLy8gTWF5IHdyaXRlIG1lbW9yeS4gIEp1c3QgZ2l2ZSB1cC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBSZWFkc01lbW9yeSA9IHRydWU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBTY2FuIHRoZSBmdW5jdGlvbiBib2R5IGZvciBpbnN0cnVjdGlvbnMgdGhhdCBtYXkgcmVhZCBvciB3cml0ZSBtZW1vcnkuCisgICAgZm9yIChpbnN0X2l0ZXJhdG9yIElJID0gaW5zdF9iZWdpbihGKSwgRSA9IGluc3RfZW5kKEYpOyBJSSAhPSBFOyArK0lJKSB7CisgICAgICBJbnN0cnVjdGlvbiAqSSA9ICYqSUk7CisKKyAgICAgIC8vIFNvbWUgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBpZ25vcmVkIGV2ZW4gaWYgdGhleSByZWFkIG9yIHdyaXRlIG1lbW9yeS4KKyAgICAgIC8vIERldGVjdCB0aGVzZSBub3csIHNraXBwaW5nIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIGlmIG9uZSBpcyBmb3VuZC4KKyAgICAgIENhbGxTaXRlIENTKGNhc3Q8VmFsdWU+KEkpKTsKKyAgICAgIGlmIChDUyAmJiBDUy5nZXRDYWxsZWRGdW5jdGlvbigpKSB7CisgICAgICAgIC8vIElnbm9yZSBjYWxscyB0byBmdW5jdGlvbnMgaW4gdGhlIHNhbWUgU0NDLgorICAgICAgICBpZiAoU0NDTm9kZXMuY291bnQoQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8vIElnbm9yZSBpbnRyaW5zaWNzIHRoYXQgb25seSBhY2Nlc3MgbG9jYWwgbWVtb3J5LgorICAgICAgICBpZiAodW5zaWduZWQgaWQgPSBDUy5nZXRDYWxsZWRGdW5jdGlvbigpLT5nZXRJbnRyaW5zaWNJRCgpKQorICAgICAgICAgIGlmIChBbGlhc0FuYWx5c2lzOjpnZXRJbnRyaW5zaWNNb2RSZWZCZWhhdmlvcihpZCkgPT0KKyAgICAgICAgICAgICAgQWxpYXNBbmFseXNpczo6QWNjZXNzZXNBcmd1bWVudHMpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWxsIHBvaW50ZXIgYXJndW1lbnRzIHBvaW50IHRvIGxvY2FsIG1lbW9yeS4KKyAgICAgICAgICAgIGZvciAoQ2FsbFNpdGU6OmFyZ19pdGVyYXRvciBDSSA9IENTLmFyZ19iZWdpbigpLCBDRSA9IENTLmFyZ19lbmQoKTsKKyAgICAgICAgICAgICAgICAgQ0kgIT0gQ0U7ICsrQ0kpIHsKKyAgICAgICAgICAgICAgVmFsdWUgKkFyZyA9ICpDSTsKKyAgICAgICAgICAgICAgaWYgKEFyZy0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICYmICFQb2ludHNUb0xvY2FsTWVtb3J5KEFyZykpCisgICAgICAgICAgICAgICAgLy8gV3JpdGVzIG1lbW9yeS4gIEp1c3QgZ2l2ZSB1cC4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBPbmx5IHJlYWRzIGFuZCB3cml0ZXMgbG9jYWwgbWVtb3J5LgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSSkpIHsKKyAgICAgICAgLy8gSWdub3JlIGxvYWRzIGZyb20gbG9jYWwgbWVtb3J5LgorICAgICAgICBpZiAoUG9pbnRzVG9Mb2NhbE1lbW9yeShMSS0+Z2V0UG9pbnRlck9wZXJhbmQoKSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEkpKSB7CisgICAgICAgIC8vIElnbm9yZSBzdG9yZXMgdG8gbG9jYWwgbWVtb3J5LgorICAgICAgICBpZiAoUG9pbnRzVG9Mb2NhbE1lbW9yeShTSS0+Z2V0UG9pbnRlck9wZXJhbmQoKSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIEFueSByZW1haW5pbmcgaW5zdHJ1Y3Rpb25zIG5lZWQgdG8gYmUgdGFrZW4gc2VyaW91c2x5ISAgQ2hlY2sgaWYgdGhleQorICAgICAgLy8gcmVhZCBvciB3cml0ZSBtZW1vcnkuCisgICAgICBpZiAoSS0+bWF5V3JpdGVUb01lbW9yeSgpKQorICAgICAgICAvLyBXcml0ZXMgbWVtb3J5LiAgSnVzdCBnaXZlIHVwLgorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChpc01hbGxvYyhJKSkKKyAgICAgICAgLy8gbWFsbG9jIGNsYWltcyBub3QgdG8gd3JpdGUgbWVtb3J5ISAgUFIzNzU0LgorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8vIElmIHRoaXMgaW5zdHJ1Y3Rpb24gbWF5IHJlYWQgbWVtb3J5LCByZW1lbWJlciB0aGF0LgorICAgICAgUmVhZHNNZW1vcnkgfD0gSS0+bWF5UmVhZEZyb21NZW1vcnkoKTsKKyAgICB9CisgIH0KKworICAvLyBTdWNjZXNzISAgRnVuY3Rpb25zIGluIHRoaXMgU0NDIGRvIG5vdCBhY2Nlc3MgbWVtb3J5LCBvciBvbmx5IHJlYWQgbWVtb3J5LgorICAvLyBHaXZlIHRoZW0gdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZS4KKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIGZvciAoQ2FsbEdyYXBoU0NDOjppdGVyYXRvciBJID0gU0NDLmJlZ2luKCksIEUgPSBTQ0MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgRnVuY3Rpb24gKkYgPSAoKkkpLT5nZXRGdW5jdGlvbigpOworCisgICAgaWYgKEYtPmRvZXNOb3RBY2Nlc3NNZW1vcnkoKSkKKyAgICAgIC8vIEFscmVhZHkgcGVyZmVjdCEKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKEYtPm9ubHlSZWFkc01lbW9yeSgpICYmIFJlYWRzTWVtb3J5KQorICAgICAgLy8gTm8gY2hhbmdlLgorICAgICAgY29udGludWU7CisKKyAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKworICAgIC8vIENsZWFyIG91dCBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcy4KKyAgICBGLT5yZW1vdmVBdHRyaWJ1dGUofjAsIEF0dHJpYnV0ZTo6UmVhZE9ubHkgfCBBdHRyaWJ1dGU6OlJlYWROb25lKTsKKworICAgIC8vIEFkZCBpbiB0aGUgbmV3IGF0dHJpYnV0ZS4KKyAgICBGLT5hZGRBdHRyaWJ1dGUofjAsIFJlYWRzTWVtb3J5PyBBdHRyaWJ1dGU6OlJlYWRPbmx5IDogQXR0cmlidXRlOjpSZWFkTm9uZSk7CisKKyAgICBpZiAoUmVhZHNNZW1vcnkpCisgICAgICArK051bVJlYWRPbmx5OworICAgIGVsc2UKKyAgICAgICsrTnVtUmVhZE5vbmU7CisgIH0KKworICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworLy8vIEFkZE5vQ2FwdHVyZUF0dHJzIC0gRGVkdWNlIG5vY2FwdHVyZSBhdHRyaWJ1dGVzIGZvciB0aGUgU0NDLgorYm9vbCBGdW5jdGlvbkF0dHJzOjpBZGROb0NhcHR1cmVBdHRycyhjb25zdCBDYWxsR3JhcGhTQ0MgJlNDQykgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICAvLyBDaGVjayBlYWNoIGZ1bmN0aW9uIGluIHR1cm4sIGRldGVybWluaW5nIHdoaWNoIHBvaW50ZXIgYXJndW1lbnRzIGFyZSBub3QKKyAgLy8gY2FwdHVyZWQuCisgIGZvciAoQ2FsbEdyYXBoU0NDOjppdGVyYXRvciBJID0gU0NDLmJlZ2luKCksIEUgPSBTQ0MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgRnVuY3Rpb24gKkYgPSAoKkkpLT5nZXRGdW5jdGlvbigpOworCisgICAgaWYgKEYgPT0gMCkKKyAgICAgIC8vIEV4dGVybmFsIG5vZGUgLSBza2lwIGl0OworICAgICAgY29udGludWU7CisKKyAgICAvLyBEZWZpbml0aW9ucyB3aXRoIHdlYWsgbGlua2FnZSBtYXkgYmUgb3ZlcnJpZGRlbiBhdCBsaW5rdGltZSB3aXRoCisgICAgLy8gc29tZXRoaW5nIHRoYXQgd3JpdGVzIG1lbW9yeSwgc28gdHJlYXQgdGhlbSBsaWtlIGRlY2xhcmF0aW9ucy4KKyAgICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpIHx8IEYtPm1heUJlT3ZlcnJpZGRlbigpKQorICAgICAgY29udGludWU7CisKKyAgICBmb3IgKEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgQSA9IEYtPmFyZ19iZWdpbigpLCBFID0gRi0+YXJnX2VuZCgpOyBBIT1FOyArK0EpCisgICAgICBpZiAoQS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICYmICFBLT5oYXNOb0NhcHR1cmVBdHRyKCkgJiYKKyAgICAgICAgICAhUG9pbnRlck1heUJlQ2FwdHVyZWQoQSwgdHJ1ZSwgLypTdG9yZUNhcHR1cmVzPSovZmFsc2UpKSB7CisgICAgICAgIEEtPmFkZEF0dHIoQXR0cmlidXRlOjpOb0NhcHR1cmUpOworICAgICAgICArK051bU5vQ2FwdHVyZTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICB9CisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIElzRnVuY3Rpb25NYWxsb2NMaWtlIC0gQSBmdW5jdGlvbiBpcyBtYWxsb2MtbGlrZSBpZiBpdCByZXR1cm5zIGVpdGhlciBudWxsCisvLy8gb3IgYSBwb2ludGVyIHRoYXQgZG9lc24ndCBhbGlhcyBhbnkgb3RoZXIgcG9pbnRlciB2aXNpYmxlIHRvIHRoZSBjYWxsZXIuCitib29sIEZ1bmN0aW9uQXR0cnM6OklzRnVuY3Rpb25NYWxsb2NMaWtlKEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8RnVuY3Rpb24qLCA4PiAmU0NDTm9kZXMpIGNvbnN0IHsKKyAgVW5pcXVlVmVjdG9yPFZhbHVlICo+IEZsb3dzVG9SZXR1cm47CisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChSZXR1cm5JbnN0ICpSZXQgPSBkeW5fY2FzdDxSZXR1cm5JbnN0PihJLT5nZXRUZXJtaW5hdG9yKCkpKQorICAgICAgRmxvd3NUb1JldHVybi5pbnNlcnQoUmV0LT5nZXRSZXR1cm5WYWx1ZSgpKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IEZsb3dzVG9SZXR1cm4uc2l6ZSgpOyArK2kpIHsKKyAgICBWYWx1ZSAqUmV0VmFsID0gRmxvd3NUb1JldHVybltpKzFdOyAgIC8vIFVuaXF1ZVZlY3RvclswXSBpcyByZXNlcnZlZC4KKworICAgIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihSZXRWYWwpKSB7CisgICAgICBpZiAoIUMtPmlzTnVsbFZhbHVlKCkgJiYgIWlzYTxVbmRlZlZhbHVlPihDKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoaXNhPEFyZ3VtZW50PihSZXRWYWwpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKEluc3RydWN0aW9uICpSVkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oUmV0VmFsKSkKKyAgICAgIHN3aXRjaCAoUlZJLT5nZXRPcGNvZGUoKSkgeworICAgICAgICAvLyBFeHRlbmQgdGhlIGFuYWx5c2lzIGJ5IGxvb2tpbmcgdXB3YXJkcy4KKyAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cjoKKyAgICAgICAgICBGbG93c1RvUmV0dXJuLmluc2VydChSVkktPmdldE9wZXJhbmQoMCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6IHsKKyAgICAgICAgICBTZWxlY3RJbnN0ICpTSSA9IGNhc3Q8U2VsZWN0SW5zdD4oUlZJKTsKKyAgICAgICAgICBGbG93c1RvUmV0dXJuLmluc2VydChTSS0+Z2V0VHJ1ZVZhbHVlKCkpOworICAgICAgICAgIEZsb3dzVG9SZXR1cm4uaW5zZXJ0KFNJLT5nZXRGYWxzZVZhbHVlKCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlBISTogeworICAgICAgICAgIFBISU5vZGUgKlBOID0gY2FzdDxQSElOb2RlPihSVkkpOworICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBlID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgRmxvd3NUb1JldHVybi5pbnNlcnQoUE4tPmdldEluY29taW5nVmFsdWUoaSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgcG9pbnRlciBjYW1lIGZyb20gYW4gYWxsb2NhdGlvbi4KKyAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWxsb2NhOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpDYWxsOgorICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpJbnZva2U6IHsKKyAgICAgICAgICBDYWxsU2l0ZSBDUyhSVkkpOworICAgICAgICAgIGlmIChDUy5wYXJhbUhhc0F0dHIoMCwgQXR0cmlidXRlOjpOb0FsaWFzKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChDUy5nZXRDYWxsZWRGdW5jdGlvbigpICYmCisgICAgICAgICAgICAgIFNDQ05vZGVzLmNvdW50KENTLmdldENhbGxlZEZ1bmN0aW9uKCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gRGlkIG5vdCBjb21lIGZyb20gYW4gYWxsb2NhdGlvbi4KKyAgICAgIH0KKworICAgIGlmIChQb2ludGVyTWF5QmVDYXB0dXJlZChSZXRWYWwsIGZhbHNlLCAvKlN0b3JlQ2FwdHVyZXM9Ki9mYWxzZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIEFkZE5vQWxpYXNBdHRycyAtIERlZHVjZSBub2FsaWFzIGF0dHJpYnV0ZXMgZm9yIHRoZSBTQ0MuCitib29sIEZ1bmN0aW9uQXR0cnM6OkFkZE5vQWxpYXNBdHRycyhjb25zdCBDYWxsR3JhcGhTQ0MgJlNDQykgeworICBTbWFsbFB0clNldDxGdW5jdGlvbiosIDg+IFNDQ05vZGVzOworCisgIC8vIEZpbGwgU0NDTm9kZXMgd2l0aCB0aGUgZWxlbWVudHMgb2YgdGhlIFNDQy4gIFVzZWQgZm9yIHF1aWNrbHkKKyAgLy8gbG9va2luZyB1cCB3aGV0aGVyIGEgZ2l2ZW4gQ2FsbEdyYXBoTm9kZSBpcyBpbiB0aGlzIFNDQy4KKyAgZm9yIChDYWxsR3JhcGhTQ0M6Oml0ZXJhdG9yIEkgPSBTQ0MuYmVnaW4oKSwgRSA9IFNDQy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgU0NDTm9kZXMuaW5zZXJ0KCgqSSktPmdldEZ1bmN0aW9uKCkpOworCisgIC8vIENoZWNrIGVhY2ggZnVuY3Rpb24gaW4gdHVybiwgZGV0ZXJtaW5pbmcgd2hpY2ggZnVuY3Rpb25zIHJldHVybiBub2FsaWFzCisgIC8vIHBvaW50ZXJzLgorICBmb3IgKENhbGxHcmFwaFNDQzo6aXRlcmF0b3IgSSA9IFNDQy5iZWdpbigpLCBFID0gU0NDLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEZ1bmN0aW9uICpGID0gKCpJKS0+Z2V0RnVuY3Rpb24oKTsKKworICAgIGlmIChGID09IDApCisgICAgICAvLyBFeHRlcm5hbCBub2RlIC0gc2tpcCBpdDsKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEFscmVhZHkgbm9hbGlhcy4KKyAgICBpZiAoRi0+ZG9lc05vdEFsaWFzKDApKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBEZWZpbml0aW9ucyB3aXRoIHdlYWsgbGlua2FnZSBtYXkgYmUgb3ZlcnJpZGRlbiBhdCBsaW5rdGltZSwgc28KKyAgICAvLyB0cmVhdCB0aGVtIGxpa2UgZGVjbGFyYXRpb25zLgorICAgIGlmIChGLT5pc0RlY2xhcmF0aW9uKCkgfHwgRi0+bWF5QmVPdmVycmlkZGVuKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBXZSBhbm5vdGF0ZSBub2FsaWFzIHJldHVybiB2YWx1ZXMsIHdoaWNoIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gCisgICAgLy8gcG9pbnRlciB0eXBlcy4KKyAgICBpZiAoIUYtPmdldFJldHVyblR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKCFJc0Z1bmN0aW9uTWFsbG9jTGlrZShGLCBTQ0NOb2RlcykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgZm9yIChDYWxsR3JhcGhTQ0M6Oml0ZXJhdG9yIEkgPSBTQ0MuYmVnaW4oKSwgRSA9IFNDQy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBGdW5jdGlvbiAqRiA9ICgqSSktPmdldEZ1bmN0aW9uKCk7CisgICAgaWYgKEYtPmRvZXNOb3RBbGlhcygwKSB8fCAhRi0+Z2V0UmV0dXJuVHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgY29udGludWU7CisKKyAgICBGLT5zZXREb2VzTm90QWxpYXMoMCk7CisgICAgKytOdW1Ob0FsaWFzOworICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICB9CisKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKK2Jvb2wgRnVuY3Rpb25BdHRyczo6cnVuT25TQ0MoQ2FsbEdyYXBoU0NDICZTQ0MpIHsKKyAgYm9vbCBDaGFuZ2VkID0gQWRkUmVhZEF0dHJzKFNDQyk7CisgIENoYW5nZWQgfD0gQWRkTm9DYXB0dXJlQXR0cnMoU0NDKTsKKyAgQ2hhbmdlZCB8PSBBZGROb0FsaWFzQXR0cnMoU0NDKTsKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vR2xvYmFsRENFLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9HbG9iYWxEQ0UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTg2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vR2xvYmFsRENFLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLy89PT0tLSBHbG9iYWxEQ0UuY3BwIC0gRENFIHVucmVhY2hhYmxlIGludGVybmFsIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRyYW5zZm9ybSBpcyBkZXNpZ25lZCB0byBlbGltaW5hdGUgdW5yZWFjaGFibGUgaW50ZXJuYWwgZ2xvYmFscyBmcm9tIHRoZQorLy8gcHJvZ3JhbS4gIEl0IHVzZXMgYW4gYWdncmVzc2l2ZSBhbGdvcml0aG0sIHNlYXJjaGluZyBvdXQgZ2xvYmFscyB0aGF0IGFyZQorLy8ga25vd24gdG8gYmUgYWxpdmUuICBBZnRlciBpdCBmaW5kcyBhbGwgb2YgdGhlIGdsb2JhbHMgd2hpY2ggYXJlIG5lZWRlZCwgaXQKKy8vIGRlbGV0ZXMgd2hhdGV2ZXIgaXMgbGVmdCBvdmVyLiAgVGhpcyBhbGxvd3MgaXQgdG8gZGVsZXRlIHJlY3Vyc2l2ZSBjaHVua3Mgb2YKKy8vIHRoZSBwcm9ncmFtIHdoaWNoIGFyZSB1bnJlYWNoYWJsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImdsb2JhbGRjZSIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUFsaWFzZXMgICwgIk51bWJlciBvZiBnbG9iYWwgYWxpYXNlcyByZW1vdmVkIik7CitTVEFUSVNUSUMoTnVtRnVuY3Rpb25zLCAiTnVtYmVyIG9mIGZ1bmN0aW9ucyByZW1vdmVkIik7CitTVEFUSVNUSUMoTnVtVmFyaWFibGVzLCAiTnVtYmVyIG9mIGdsb2JhbCB2YXJpYWJsZXMgcmVtb3ZlZCIpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgR2xvYmFsRENFIDogcHVibGljIE1vZHVsZVBhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgR2xvYmFsRENFKCkgOiBNb2R1bGVQYXNzKElEKSB7fQorCisgICAgLy8gcnVuIC0gRG8gdGhlIEdsb2JhbERDRSBwYXNzIG9uIHRoZSBzcGVjaWZpZWQgbW9kdWxlLCBvcHRpb25hbGx5IHVwZGF0aW5nCisgICAgLy8gdGhlIHNwZWNpZmllZCBjYWxsZ3JhcGggdG8gcmVmbGVjdCB0aGUgY2hhbmdlcy4KKyAgICAvLworICAgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICBwcml2YXRlOgorICAgIFNtYWxsUHRyU2V0PEdsb2JhbFZhbHVlKiwgMzI+IEFsaXZlR2xvYmFsczsKKworICAgIC8vLyBHbG9iYWxJc05lZWRlZCAtIG1hcmsgdGhlIHNwZWNpZmljIGdsb2JhbCB2YWx1ZSBhcyBuZWVkZWQsIGFuZAorICAgIC8vLyByZWN1cnNpdmVseSBtYXJrIGFueXRoaW5nIHRoYXQgaXQgdXNlcyBhcyBhbHNvIG5lZWRlZC4KKyAgICB2b2lkIEdsb2JhbElzTmVlZGVkKEdsb2JhbFZhbHVlICpHVik7CisgICAgdm9pZCBNYXJrVXNlZEdsb2JhbHNBc05lZWRlZChDb25zdGFudCAqQyk7CisKKyAgICBib29sIFJlbW92ZVVudXNlZEdsb2JhbFZhbHVlKEdsb2JhbFZhbHVlICZHVik7CisgIH07Cit9CisKK2NoYXIgR2xvYmFsRENFOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoR2xvYmFsRENFLCAiZ2xvYmFsZGNlIiwKKyAgICAgICAgICAgICAgICAiRGVhZCBHbG9iYWwgRWxpbWluYXRpb24iLCBmYWxzZSwgZmFsc2UpOworCitNb2R1bGVQYXNzICpsbHZtOjpjcmVhdGVHbG9iYWxEQ0VQYXNzKCkgeyByZXR1cm4gbmV3IEdsb2JhbERDRSgpOyB9CisKK2Jvb2wgR2xvYmFsRENFOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIAorICAvLyBMb29wIG92ZXIgdGhlIG1vZHVsZSwgYWRkaW5nIGdsb2JhbHMgd2hpY2ggYXJlIG9idmlvdXNseSBuZWNlc3NhcnkuCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBDaGFuZ2VkIHw9IFJlbW92ZVVudXNlZEdsb2JhbFZhbHVlKCpJKTsKKyAgICAvLyBGdW5jdGlvbnMgd2l0aCBleHRlcm5hbCBsaW5rYWdlIGFyZSBuZWVkZWQgaWYgdGhleSBoYXZlIGEgYm9keQorICAgIGlmICghSS0+aGFzTG9jYWxMaW5rYWdlKCkgJiYgIUktPmhhc0xpbmtPbmNlTGlua2FnZSgpICYmCisgICAgICAgICFJLT5pc0RlY2xhcmF0aW9uKCkgJiYgIUktPmhhc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKCkpCisgICAgICBHbG9iYWxJc05lZWRlZChJKTsKKyAgfQorCisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIENoYW5nZWQgfD0gUmVtb3ZlVW51c2VkR2xvYmFsVmFsdWUoKkkpOworICAgIC8vIEV4dGVybmFsbHkgdmlzaWJsZSAmIGFwcGVuZGluZyBnbG9iYWxzIGFyZSBuZWVkZWQsIGlmIHRoZXkgaGF2ZSBhbgorICAgIC8vIGluaXRpYWxpemVyLgorICAgIGlmICghSS0+aGFzTG9jYWxMaW5rYWdlKCkgJiYgIUktPmhhc0xpbmtPbmNlTGlua2FnZSgpICYmCisgICAgICAgICFJLT5pc0RlY2xhcmF0aW9uKCkgJiYgIUktPmhhc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKCkpCisgICAgICBHbG9iYWxJc05lZWRlZChJKTsKKyAgfQorCisgIGZvciAoTW9kdWxlOjphbGlhc19pdGVyYXRvciBJID0gTS5hbGlhc19iZWdpbigpLCBFID0gTS5hbGlhc19lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIENoYW5nZWQgfD0gUmVtb3ZlVW51c2VkR2xvYmFsVmFsdWUoKkkpOworICAgIC8vIEV4dGVybmFsbHkgdmlzaWJsZSBhbGlhc2VzIGFyZSBuZWVkZWQuCisgICAgaWYgKCFJLT5oYXNMb2NhbExpbmthZ2UoKSAmJiAhSS0+aGFzTGlua09uY2VMaW5rYWdlKCkpCisgICAgICBHbG9iYWxJc05lZWRlZChJKTsKKyAgfQorCisgIC8vIE5vdyB0aGF0IGFsbCBnbG9iYWxzIHdoaWNoIGFyZSBuZWVkZWQgYXJlIGluIHRoZSBBbGl2ZUdsb2JhbHMgc2V0LCB3ZSBsb29wCisgIC8vIHRocm91Z2ggdGhlIHByb2dyYW0sIGRlbGV0aW5nIHRob3NlIHdoaWNoIGFyZSBub3QgYWxpdmUuCisgIC8vCisKKyAgLy8gVGhlIGZpcnN0IHBhc3MgaXMgdG8gZHJvcCBpbml0aWFsaXplcnMgb2YgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBhcmUgZGVhZC4KKyAgc3RkOjp2ZWN0b3I8R2xvYmFsVmFyaWFibGUqPiBEZWFkR2xvYmFsVmFyczsgICAvLyBLZWVwIHRyYWNrIG9mIGRlYWQgZ2xvYmFscworICBmb3IgKE1vZHVsZTo6Z2xvYmFsX2l0ZXJhdG9yIEkgPSBNLmdsb2JhbF9iZWdpbigpLCBFID0gTS5nbG9iYWxfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgaWYgKCFBbGl2ZUdsb2JhbHMuY291bnQoSSkpIHsKKyAgICAgIERlYWRHbG9iYWxWYXJzLnB1c2hfYmFjayhJKTsgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGRlYWQgZ2xvYmFscworICAgICAgSS0+c2V0SW5pdGlhbGl6ZXIoMCk7CisgICAgfQorCisgIC8vIFRoZSBzZWNvbmQgcGFzcyBkcm9wcyB0aGUgYm9kaWVzIG9mIGZ1bmN0aW9ucyB3aGljaCBhcmUgZGVhZC4uLgorICBzdGQ6OnZlY3RvcjxGdW5jdGlvbio+IERlYWRGdW5jdGlvbnM7CisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFBbGl2ZUdsb2JhbHMuY291bnQoSSkpIHsKKyAgICAgIERlYWRGdW5jdGlvbnMucHVzaF9iYWNrKEkpOyAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgZGVhZCBnbG9iYWxzCisgICAgICBpZiAoIUktPmlzRGVjbGFyYXRpb24oKSkKKyAgICAgICAgSS0+ZGVsZXRlQm9keSgpOworICAgIH0KKworICAvLyBUaGUgdGhpcmQgcGFzcyBkcm9wcyB0YXJnZXRzIG9mIGFsaWFzZXMgd2hpY2ggYXJlIGRlYWQuLi4KKyAgc3RkOjp2ZWN0b3I8R2xvYmFsQWxpYXMqPiBEZWFkQWxpYXNlczsKKyAgZm9yIChNb2R1bGU6OmFsaWFzX2l0ZXJhdG9yIEkgPSBNLmFsaWFzX2JlZ2luKCksIEUgPSBNLmFsaWFzX2VuZCgpOyBJICE9IEU7CisgICAgICAgKytJKQorICAgIGlmICghQWxpdmVHbG9iYWxzLmNvdW50KEkpKSB7CisgICAgICBEZWFkQWxpYXNlcy5wdXNoX2JhY2soSSk7CisgICAgICBJLT5zZXRBbGlhc2VlKDApOworICAgIH0KKworICBpZiAoIURlYWRGdW5jdGlvbnMuZW1wdHkoKSkgeworICAgIC8vIE5vdyB0aGF0IGFsbCBpbnRlcmZlcmVuY2VzIGhhdmUgYmVlbiBkcm9wcGVkLCBkZWxldGUgdGhlIGFjdHVhbCBvYmplY3RzCisgICAgLy8gdGhlbXNlbHZlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVhZEZ1bmN0aW9ucy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBSZW1vdmVVbnVzZWRHbG9iYWxWYWx1ZSgqRGVhZEZ1bmN0aW9uc1tpXSk7CisgICAgICBNLmdldEZ1bmN0aW9uTGlzdCgpLmVyYXNlKERlYWRGdW5jdGlvbnNbaV0pOworICAgIH0KKyAgICBOdW1GdW5jdGlvbnMgKz0gRGVhZEZ1bmN0aW9ucy5zaXplKCk7CisgICAgQ2hhbmdlZCA9IHRydWU7CisgIH0KKworICBpZiAoIURlYWRHbG9iYWxWYXJzLmVtcHR5KCkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVhZEdsb2JhbFZhcnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgUmVtb3ZlVW51c2VkR2xvYmFsVmFsdWUoKkRlYWRHbG9iYWxWYXJzW2ldKTsKKyAgICAgIE0uZ2V0R2xvYmFsTGlzdCgpLmVyYXNlKERlYWRHbG9iYWxWYXJzW2ldKTsKKyAgICB9CisgICAgTnVtVmFyaWFibGVzICs9IERlYWRHbG9iYWxWYXJzLnNpemUoKTsKKyAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgfQorCisgIC8vIE5vdyBkZWxldGUgYW55IGRlYWQgYWxpYXNlcy4KKyAgaWYgKCFEZWFkQWxpYXNlcy5lbXB0eSgpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IERlYWRBbGlhc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFJlbW92ZVVudXNlZEdsb2JhbFZhbHVlKCpEZWFkQWxpYXNlc1tpXSk7CisgICAgICBNLmdldEFsaWFzTGlzdCgpLmVyYXNlKERlYWRBbGlhc2VzW2ldKTsKKyAgICB9CisgICAgTnVtQWxpYXNlcyArPSBEZWFkQWxpYXNlcy5zaXplKCk7CisgICAgQ2hhbmdlZCA9IHRydWU7CisgIH0KKworICAvLyBNYWtlIHN1cmUgdGhhdCBhbGwgbWVtb3J5IGlzIHJlbGVhc2VkCisgIEFsaXZlR2xvYmFscy5jbGVhcigpOworCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gR2xvYmFsSXNOZWVkZWQgLSB0aGUgc3BlY2lmaWMgZ2xvYmFsIHZhbHVlIGFzIG5lZWRlZCwgYW5kCisvLy8gcmVjdXJzaXZlbHkgbWFyayBhbnl0aGluZyB0aGF0IGl0IHVzZXMgYXMgYWxzbyBuZWVkZWQuCit2b2lkIEdsb2JhbERDRTo6R2xvYmFsSXNOZWVkZWQoR2xvYmFsVmFsdWUgKkcpIHsKKyAgLy8gSWYgdGhlIGdsb2JhbCBpcyBhbHJlYWR5IGluIHRoZSBzZXQsIG5vIG5lZWQgdG8gcmVwcm9jZXNzIGl0LgorICBpZiAoIUFsaXZlR2xvYmFscy5pbnNlcnQoRykpCisgICAgcmV0dXJuOworICAKKyAgaWYgKEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihHKSkgeworICAgIC8vIElmIHRoaXMgaXMgYSBnbG9iYWwgdmFyaWFibGUsIHdlIG11c3QgbWFrZSBzdXJlIHRvIGFkZCBhbnkgZ2xvYmFsIHZhbHVlcworICAgIC8vIHJlZmVyZW5jZWQgYnkgdGhlIGluaXRpYWxpemVyIHRvIHRoZSBhbGl2ZSBzZXQuCisgICAgaWYgKEdWLT5oYXNJbml0aWFsaXplcigpKQorICAgICAgTWFya1VzZWRHbG9iYWxzQXNOZWVkZWQoR1YtPmdldEluaXRpYWxpemVyKCkpOworICB9IGVsc2UgaWYgKEdsb2JhbEFsaWFzICpHQSA9IGR5bl9jYXN0PEdsb2JhbEFsaWFzPihHKSkgeworICAgIC8vIFRoZSB0YXJnZXQgb2YgYSBnbG9iYWwgYWxpYXMgaXMgbmVlZGVkLgorICAgIE1hcmtVc2VkR2xvYmFsc0FzTmVlZGVkKEdBLT5nZXRBbGlhc2VlKCkpOworICB9IGVsc2UgeworICAgIC8vIE90aGVyd2lzZSB0aGlzIG11c3QgYmUgYSBmdW5jdGlvbiBvYmplY3QuICBXZSBoYXZlIHRvIHNjYW4gdGhlIGJvZHkgb2YKKyAgICAvLyB0aGUgZnVuY3Rpb24gbG9va2luZyBmb3IgY29uc3RhbnRzIGFuZCBnbG9iYWwgdmFsdWVzIHdoaWNoIGFyZSB1c2VkIGFzCisgICAgLy8gb3BlcmFuZHMuICBBbnkgb3BlcmFuZHMgb2YgdGhlc2UgdHlwZXMgbXVzdCBiZSBwcm9jZXNzZWQgdG8gZW5zdXJlIHRoYXQKKyAgICAvLyBhbnkgZ2xvYmFscyB1c2VkIHdpbGwgYmUgbWFya2VkIGFzIG5lZWRlZC4KKyAgICBGdW5jdGlvbiAqRiA9IGNhc3Q8RnVuY3Rpb24+KEcpOworCisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpCisgICAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgVSA9IEktPm9wX2JlZ2luKCksIEUgPSBJLT5vcF9lbmQoKTsgVSAhPSBFOyArK1UpCisgICAgICAgICAgaWYgKEdsb2JhbFZhbHVlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhbHVlPigqVSkpCisgICAgICAgICAgICBHbG9iYWxJc05lZWRlZChHVik7CisgICAgICAgICAgZWxzZSBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oKlUpKQorICAgICAgICAgICAgTWFya1VzZWRHbG9iYWxzQXNOZWVkZWQoQyk7CisgIH0KK30KKwordm9pZCBHbG9iYWxEQ0U6Ok1hcmtVc2VkR2xvYmFsc0FzTmVlZGVkKENvbnN0YW50ICpDKSB7CisgIGlmIChHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oQykpCisgICAgcmV0dXJuIEdsb2JhbElzTmVlZGVkKEdWKTsKKyAgCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBjb25zdGFudCwgYWRkaW5nIGFueSBnbG9iYWxzIHRoZXkKKyAgLy8gdXNlIHRvIHRoZSBsaXN0IG9mIG5lZWRlZCBnbG9iYWxzLgorICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIEkgPSBDLT5vcF9iZWdpbigpLCBFID0gQy0+b3BfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChDb25zdGFudCAqT3BDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KCpJKSkKKyAgICAgIE1hcmtVc2VkR2xvYmFsc0FzTmVlZGVkKE9wQyk7Cit9CisKKy8vIFJlbW92ZVVudXNlZEdsb2JhbFZhbHVlIC0gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdXNlcyBvZiB0aGUgc3BlY2lmaWVkCisvLyBHbG9iYWxWYWx1ZSwgbG9va2luZyBmb3IgdGhlIGNvbnN0YW50IHBvaW50ZXIgcmVmIHRoYXQgbWF5IGJlIHBvaW50aW5nIHRvIGl0LgorLy8gSWYgZm91bmQsIGNoZWNrIHRvIHNlZSBpZiB0aGUgY29uc3RhbnQgcG9pbnRlciByZWYgaXMgc2FmZSB0byBkZXN0cm95LCBhbmQgaWYKKy8vIHNvLCBudWtlIGl0LiAgVGhpcyB3aWxsIHJlZHVjZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBnbG9iYWwgdmFsdWUsIHdoaWNoCisvLyBtaWdodCBtYWtlIGl0IGRlYWRlci4KKy8vCitib29sIEdsb2JhbERDRTo6UmVtb3ZlVW51c2VkR2xvYmFsVmFsdWUoR2xvYmFsVmFsdWUgJkdWKSB7CisgIGlmIChHVi51c2VfZW1wdHkoKSkgcmV0dXJuIGZhbHNlOworICBHVi5yZW1vdmVEZWFkQ29uc3RhbnRVc2VycygpOworICByZXR1cm4gR1YudXNlX2VtcHR5KCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vR2xvYmFsT3B0LmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9HbG9iYWxPcHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3N2FmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vR2xvYmFsT3B0LmNwcApAQCAtMCwwICsxLDI1NzYgQEAKKy8vPT09LSBHbG9iYWxPcHQuY3BwIC0gT3B0aW1pemUgR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHRyYW5zZm9ybXMgc2ltcGxlIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBuZXZlciBoYXZlIHRoZWlyIGFkZHJlc3MKKy8vIHRha2VuLiAgSWYgb2J2aW91c2x5IHRydWUsIGl0IG1hcmtzIHJlYWQvd3JpdGUgZ2xvYmFscyBhcyBjb25zdGFudCwgZGVsZXRlcworLy8gdmFyaWFibGVzIG9ubHkgc3RvcmVkIHRvLCBldGMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJnbG9iYWxvcHQiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9NZW1vcnlCdWlsdGlucy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bU1hcmtlZCAgICAsICJOdW1iZXIgb2YgZ2xvYmFscyBtYXJrZWQgY29uc3RhbnQiKTsKK1NUQVRJU1RJQyhOdW1TUkEgICAgICAgLCAiTnVtYmVyIG9mIGFnZ3JlZ2F0ZSBnbG9iYWxzIGJyb2tlbiBpbnRvIHNjYWxhcnMiKTsKK1NUQVRJU1RJQyhOdW1IZWFwU1JBICAgLCAiTnVtYmVyIG9mIGhlYXAgb2JqZWN0cyBTUkEnZCIpOworU1RBVElTVElDKE51bVN1YnN0aXR1dGUsIk51bWJlciBvZiBnbG9iYWxzIHdpdGggaW5pdGlhbGl6ZXJzIHN0b3JlZCBpbnRvIHRoZW0iKTsKK1NUQVRJU1RJQyhOdW1EZWxldGVkICAgLCAiTnVtYmVyIG9mIGdsb2JhbHMgZGVsZXRlZCIpOworU1RBVElTVElDKE51bUZuRGVsZXRlZCAsICJOdW1iZXIgb2YgZnVuY3Rpb25zIGRlbGV0ZWQiKTsKK1NUQVRJU1RJQyhOdW1HbG9iVXNlcyAgLCAiTnVtYmVyIG9mIGdsb2JhbCB1c2VzIGRldmlydHVhbGl6ZWQiKTsKK1NUQVRJU1RJQyhOdW1Mb2NhbGl6ZWQgLCAiTnVtYmVyIG9mIGdsb2JhbHMgbG9jYWxpemVkIik7CitTVEFUSVNUSUMoTnVtU2hydW5rVG9Cb29sICAsICJOdW1iZXIgb2YgZ2xvYmFsIHZhcnMgc2hydW5rIHRvIGJvb2xlYW5zIik7CitTVEFUSVNUSUMoTnVtRmFzdENhbGxGbnMgICAsICJOdW1iZXIgb2YgZnVuY3Rpb25zIGNvbnZlcnRlZCB0byBmYXN0Y2MiKTsKK1NUQVRJU1RJQyhOdW1DdG9yc0V2YWx1YXRlZCwgIk51bWJlciBvZiBzdGF0aWMgY3RvcnMgZXZhbHVhdGVkIik7CitTVEFUSVNUSUMoTnVtTmVzdFJlbW92ZWQgICAsICJOdW1iZXIgb2YgbmVzdCBhdHRyaWJ1dGVzIHJlbW92ZWQiKTsKK1NUQVRJU1RJQyhOdW1BbGlhc2VzUmVzb2x2ZWQsICJOdW1iZXIgb2YgZ2xvYmFsIGFsaWFzZXMgcmVzb2x2ZWQiKTsKK1NUQVRJU1RJQyhOdW1BbGlhc2VzUmVtb3ZlZCwgIk51bWJlciBvZiBnbG9iYWwgYWxpYXNlcyBlbGltaW5hdGVkIik7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBHbG9iYWxPcHQgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICB9CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBHbG9iYWxPcHQoKSA6IE1vZHVsZVBhc3MoSUQpIHt9CisKKyAgICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSk7CisKKyAgcHJpdmF0ZToKKyAgICBHbG9iYWxWYXJpYWJsZSAqRmluZEdsb2JhbEN0b3JzKE1vZHVsZSAmTSk7CisgICAgYm9vbCBPcHRpbWl6ZUZ1bmN0aW9ucyhNb2R1bGUgJk0pOworICAgIGJvb2wgT3B0aW1pemVHbG9iYWxWYXJzKE1vZHVsZSAmTSk7CisgICAgYm9vbCBPcHRpbWl6ZUdsb2JhbEFsaWFzZXMoTW9kdWxlICZNKTsKKyAgICBib29sIE9wdGltaXplR2xvYmFsQ3RvcnNMaXN0KEdsb2JhbFZhcmlhYmxlIComR0NMKTsKKyAgICBib29sIFByb2Nlc3NJbnRlcm5hbEdsb2JhbChHbG9iYWxWYXJpYWJsZSAqR1YsTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgJkdWSSk7CisgIH07Cit9CisKK2NoYXIgR2xvYmFsT3B0OjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoR2xvYmFsT3B0LCAiZ2xvYmFsb3B0IiwKKyAgICAgICAgICAgICAgICAiR2xvYmFsIFZhcmlhYmxlIE9wdGltaXplciIsIGZhbHNlLCBmYWxzZSk7CisKK01vZHVsZVBhc3MgKmxsdm06OmNyZWF0ZUdsb2JhbE9wdGltaXplclBhc3MoKSB7IHJldHVybiBuZXcgR2xvYmFsT3B0KCk7IH0KKworbmFtZXNwYWNlIHsKKworLy8vIEdsb2JhbFN0YXR1cyAtIEFzIHdlIGFuYWx5emUgZWFjaCBnbG9iYWwsIGtlZXAgdHJhY2sgb2Ygc29tZSBpbmZvcm1hdGlvbgorLy8vIGFib3V0IGl0LiAgSWYgd2UgZmluZCBvdXQgdGhhdCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2xvYmFsIGlzIHRha2VuLCBub25lIG9mCisvLy8gdGhpcyBpbmZvIHdpbGwgYmUgYWNjdXJhdGUuCitzdHJ1Y3QgR2xvYmFsU3RhdHVzIHsKKyAgLy8vIGlzTG9hZGVkIC0gVHJ1ZSBpZiB0aGUgZ2xvYmFsIGlzIGV2ZXIgbG9hZGVkLiAgSWYgdGhlIGdsb2JhbCBpc24ndCBldmVyCisgIC8vLyBsb2FkZWQgaXQgY2FuIGJlIGRlbGV0ZWQuCisgIGJvb2wgaXNMb2FkZWQ7CisKKyAgLy8vIFN0b3JlZFR5cGUgLSBLZWVwIHRyYWNrIG9mIHdoYXQgc3RvcmVzIHRvIHRoZSBnbG9iYWwgbG9vayBsaWtlLgorICAvLy8KKyAgZW51bSBTdG9yZWRUeXBlIHsKKyAgICAvLy8gTm90U3RvcmVkIC0gVGhlcmUgaXMgbm8gc3RvcmUgdG8gdGhpcyBnbG9iYWwuICBJdCBjYW4gdGh1cyBiZSBtYXJrZWQKKyAgICAvLy8gY29uc3RhbnQuCisgICAgTm90U3RvcmVkLAorCisgICAgLy8vIGlzSW5pdGlhbGl6ZXJTdG9yZWQgLSBUaGlzIGdsb2JhbCBpcyBzdG9yZWQgdG8sIGJ1dCB0aGUgb25seSB0aGluZworICAgIC8vLyBzdG9yZWQgaXMgdGhlIGNvbnN0YW50IGl0IHdhcyBpbml0aWFsaXplZCB3aXRoLiAgVGhpcyBpcyBvbmx5IHRyYWNrZWQKKyAgICAvLy8gZm9yIHNjYWxhciBnbG9iYWxzLgorICAgIGlzSW5pdGlhbGl6ZXJTdG9yZWQsCisKKyAgICAvLy8gaXNTdG9yZWRPbmNlIC0gVGhpcyBnbG9iYWwgaXMgc3RvcmVkIHRvLCBidXQgb25seSBpdHMgaW5pdGlhbGl6ZXIgYW5kCisgICAgLy8vIG9uZSBvdGhlciB2YWx1ZSBpcyBldmVyIHN0b3JlZCB0byBpdC4gIElmIHRoaXMgZ2xvYmFsIGlzU3RvcmVkT25jZSwgd2UKKyAgICAvLy8gdHJhY2sgdGhlIHZhbHVlIHN0b3JlZCB0byBpdCBpbiBTdG9yZWRPbmNlVmFsdWUgYmVsb3cuICBUaGlzIGlzIG9ubHkKKyAgICAvLy8gdHJhY2tlZCBmb3Igc2NhbGFyIGdsb2JhbHMuCisgICAgaXNTdG9yZWRPbmNlLAorCisgICAgLy8vIGlzU3RvcmVkIC0gVGhpcyBnbG9iYWwgaXMgc3RvcmVkIHRvIGJ5IG11bHRpcGxlIHZhbHVlcyBvciBzb21ldGhpbmcgZWxzZQorICAgIC8vLyB0aGF0IHdlIGNhbm5vdCB0cmFjay4KKyAgICBpc1N0b3JlZAorICB9IFN0b3JlZFR5cGU7CisKKyAgLy8vIFN0b3JlZE9uY2VWYWx1ZSAtIElmIG9ubHkgb25lIHZhbHVlIChiZXNpZGVzIHRoZSBpbml0aWFsaXplciBjb25zdGFudCkgaXMKKyAgLy8vIGV2ZXIgc3RvcmVkIHRvIHRoaXMgZ2xvYmFsLCBrZWVwIHRyYWNrIG9mIHdoYXQgdmFsdWUgaXQgaXMuCisgIFZhbHVlICpTdG9yZWRPbmNlVmFsdWU7CisKKyAgLy8vIEFjY2Vzc2luZ0Z1bmN0aW9uL0hhc011bHRpcGxlQWNjZXNzaW5nRnVuY3Rpb25zIC0gVGhlc2Ugc3RhcnQgb3V0CisgIC8vLyBudWxsL2ZhbHNlLiAgV2hlbiB0aGUgZmlyc3QgYWNjZXNzaW5nIGZ1bmN0aW9uIGlzIG5vdGljZWQsIGl0IGlzIHJlY29yZGVkLgorICAvLy8gV2hlbiBhIHNlY29uZCBkaWZmZXJlbnQgYWNjZXNzaW5nIGZ1bmN0aW9uIGlzIG5vdGljZWQsCisgIC8vLyBIYXNNdWx0aXBsZUFjY2Vzc2luZ0Z1bmN0aW9ucyBpcyBzZXQgdG8gdHJ1ZS4KKyAgY29uc3QgRnVuY3Rpb24gKkFjY2Vzc2luZ0Z1bmN0aW9uOworICBib29sIEhhc011bHRpcGxlQWNjZXNzaW5nRnVuY3Rpb25zOworCisgIC8vLyBIYXNOb25JbnN0cnVjdGlvblVzZXIgLSBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGdsb2JhbCBoYXMgYSB1c2VyIHRoYXQgaXMgbm90CisgIC8vLyBhbiBpbnN0cnVjdGlvbiAoZS5nLiBhIGNvbnN0YW50IGV4cHIgb3IgR1YgaW5pdGlhbGl6ZXIpLgorICBib29sIEhhc05vbkluc3RydWN0aW9uVXNlcjsKKworICAvLy8gSGFzUEhJVXNlciAtIFNldCB0byB0cnVlIGlmIHRoaXMgZ2xvYmFsIGhhcyBhIHVzZXIgdGhhdCBpcyBhIFBISSBub2RlLgorICBib29sIEhhc1BISVVzZXI7CisgIAorICBHbG9iYWxTdGF0dXMoKSA6IGlzTG9hZGVkKGZhbHNlKSwgU3RvcmVkVHlwZShOb3RTdG9yZWQpLCBTdG9yZWRPbmNlVmFsdWUoMCksCisgICAgICAgICAgICAgICAgICAgQWNjZXNzaW5nRnVuY3Rpb24oMCksIEhhc011bHRpcGxlQWNjZXNzaW5nRnVuY3Rpb25zKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICBIYXNOb25JbnN0cnVjdGlvblVzZXIoZmFsc2UpLCBIYXNQSElVc2VyKGZhbHNlKSB7fQorfTsKKworfQorCisvLyBTYWZlVG9EZXN0cm95Q29uc3RhbnQgLSBJdCBpcyBzYWZlIHRvIGRlc3Ryb3kgYSBjb25zdGFudCBpZmYgaXQgaXMgb25seSB1c2VkCisvLyBieSBjb25zdGFudHMgaXRzZWxmLiAgTm90ZSB0aGF0IGNvbnN0YW50cyBjYW5ub3QgYmUgY3ljbGljLCBzbyB0aGlzIHRlc3QgaXMKKy8vIHByZXR0eSBlYXN5IHRvIGltcGxlbWVudCByZWN1cnNpdmVseS4KKy8vCitzdGF0aWMgYm9vbCBTYWZlVG9EZXN0cm95Q29uc3RhbnQoY29uc3QgQ29uc3RhbnQgKkMpIHsKKyAgaWYgKGlzYTxHbG9iYWxWYWx1ZT4oQykpIHJldHVybiBmYWxzZTsKKworICBmb3IgKFZhbHVlOjpjb25zdF91c2VfaXRlcmF0b3IgVUkgPSBDLT51c2VfYmVnaW4oKSwgRSA9IEMtPnVzZV9lbmQoKTsgVUkgIT0gRTsKKyAgICAgICArK1VJKQorICAgIGlmIChjb25zdCBDb25zdGFudCAqQ1UgPSBkeW5fY2FzdDxDb25zdGFudD4oKlVJKSkgeworICAgICAgaWYgKCFTYWZlVG9EZXN0cm95Q29uc3RhbnQoQ1UpKSByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisKKy8vLyBBbmFseXplR2xvYmFsIC0gTG9vayBhdCBhbGwgdXNlcyBvZiB0aGUgZ2xvYmFsIGFuZCBmaWxsIGluIHRoZSBHbG9iYWxTdGF0dXMKKy8vLyBzdHJ1Y3R1cmUuICBJZiB0aGUgZ2xvYmFsIGhhcyBpdHMgYWRkcmVzcyB0YWtlbiwgcmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgd2UKKy8vLyBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIGl0LgorLy8vCitzdGF0aWMgYm9vbCBBbmFseXplR2xvYmFsKGNvbnN0IFZhbHVlICpWLCBHbG9iYWxTdGF0dXMgJkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxjb25zdCBQSElOb2RlKiwgMTY+ICZQSElVc2VycykgeworICBmb3IgKFZhbHVlOjpjb25zdF91c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsgVUkgIT0gRTsKKyAgICAgICArK1VJKSB7CisgICAgY29uc3QgVXNlciAqVSA9ICpVSTsKKyAgICBpZiAoY29uc3QgQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVSkpIHsKKyAgICAgIEdTLkhhc05vbkluc3RydWN0aW9uVXNlciA9IHRydWU7CisgICAgICBpZiAoQW5hbHl6ZUdsb2JhbChDRSwgR1MsIFBISVVzZXJzKSkgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChjb25zdCBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihVKSkgeworICAgICAgaWYgKCFHUy5IYXNNdWx0aXBsZUFjY2Vzc2luZ0Z1bmN0aW9ucykgeworICAgICAgICBjb25zdCBGdW5jdGlvbiAqRiA9IEktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKEdTLkFjY2Vzc2luZ0Z1bmN0aW9uID09IDApCisgICAgICAgICAgR1MuQWNjZXNzaW5nRnVuY3Rpb24gPSBGOworICAgICAgICBlbHNlIGlmIChHUy5BY2Nlc3NpbmdGdW5jdGlvbiAhPSBGKQorICAgICAgICAgIEdTLkhhc011bHRpcGxlQWNjZXNzaW5nRnVuY3Rpb25zID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjb25zdCBMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSSkpIHsKKyAgICAgICAgR1MuaXNMb2FkZWQgPSB0cnVlOworICAgICAgICBpZiAoTEktPmlzVm9sYXRpbGUoKSkgcmV0dXJuIHRydWU7ICAvLyBEb24ndCBoYWNrIG9uIHZvbGF0aWxlIGxvYWRzLgorICAgICAgfSBlbHNlIGlmIChjb25zdCBTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihJKSkgeworICAgICAgICAvLyBEb24ndCBhbGxvdyBhIHN0b3JlIE9GIHRoZSBhZGRyZXNzLCBvbmx5IHN0b3JlcyBUTyB0aGUgYWRkcmVzcy4KKyAgICAgICAgaWYgKFNJLT5nZXRPcGVyYW5kKDApID09IFYpIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChTSS0+aXNWb2xhdGlsZSgpKSByZXR1cm4gdHJ1ZTsgIC8vIERvbid0IGhhY2sgb24gdm9sYXRpbGUgc3RvcmVzLgorCisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBkaXJlY3Qgc3RvcmUgdG8gdGhlIGdsb2JhbCAoaS5lLiwgdGhlIGdsb2JhbCBpcyBhIHNjYWxhcgorICAgICAgICAvLyB2YWx1ZSwgbm90IGFuIGFnZ3JlZ2F0ZSksIGtlZXAgbW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dAorICAgICAgICAvLyBzdG9yZXMuCisgICAgICAgIGlmIChHUy5TdG9yZWRUeXBlICE9IEdsb2JhbFN0YXR1czo6aXNTdG9yZWQpIHsKKyAgICAgICAgICBpZiAoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICAgIFZhbHVlICpTdG9yZWRWYWwgPSBTSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgICAgIGlmIChTdG9yZWRWYWwgPT0gR1YtPmdldEluaXRpYWxpemVyKCkpIHsKKyAgICAgICAgICAgICAgaWYgKEdTLlN0b3JlZFR5cGUgPCBHbG9iYWxTdGF0dXM6OmlzSW5pdGlhbGl6ZXJTdG9yZWQpCisgICAgICAgICAgICAgICAgR1MuU3RvcmVkVHlwZSA9IEdsb2JhbFN0YXR1czo6aXNJbml0aWFsaXplclN0b3JlZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNhPExvYWRJbnN0PihTdG9yZWRWYWwpICYmCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8TG9hZEluc3Q+KFN0b3JlZFZhbCktPmdldE9wZXJhbmQoMCkgPT0gR1YpIHsKKyAgICAgICAgICAgICAgaWYgKEdTLlN0b3JlZFR5cGUgPCBHbG9iYWxTdGF0dXM6OmlzSW5pdGlhbGl6ZXJTdG9yZWQpCisgICAgICAgICAgICAgICAgR1MuU3RvcmVkVHlwZSA9IEdsb2JhbFN0YXR1czo6aXNJbml0aWFsaXplclN0b3JlZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoR1MuU3RvcmVkVHlwZSA8IEdsb2JhbFN0YXR1czo6aXNTdG9yZWRPbmNlKSB7CisgICAgICAgICAgICAgIEdTLlN0b3JlZFR5cGUgPSBHbG9iYWxTdGF0dXM6OmlzU3RvcmVkT25jZTsKKyAgICAgICAgICAgICAgR1MuU3RvcmVkT25jZVZhbHVlID0gU3RvcmVkVmFsOworICAgICAgICAgICAgfSBlbHNlIGlmIChHUy5TdG9yZWRUeXBlID09IEdsb2JhbFN0YXR1czo6aXNTdG9yZWRPbmNlICYmCisgICAgICAgICAgICAgICAgICAgICAgIEdTLlN0b3JlZE9uY2VWYWx1ZSA9PSBTdG9yZWRWYWwpIHsKKyAgICAgICAgICAgICAgLy8gbm9vcC4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIEdTLlN0b3JlZFR5cGUgPSBHbG9iYWxTdGF0dXM6OmlzU3RvcmVkOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHUy5TdG9yZWRUeXBlID0gR2xvYmFsU3RhdHVzOjppc1N0b3JlZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaXNhPEdldEVsZW1lbnRQdHJJbnN0PihJKSkgeworICAgICAgICBpZiAoQW5hbHl6ZUdsb2JhbChJLCBHUywgUEhJVXNlcnMpKSByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXNhPFNlbGVjdEluc3Q+KEkpKSB7CisgICAgICAgIGlmIChBbmFseXplR2xvYmFsKEksIEdTLCBQSElVc2VycykpIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmIChjb25zdCBQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEkpKSB7CisgICAgICAgIC8vIFBISSBub2RlcyB3ZSBjYW4gY2hlY2sganVzdCBsaWtlIHNlbGVjdCBvciBHRVAgaW5zdHJ1Y3Rpb25zLCBidXQgd2UKKyAgICAgICAgLy8gaGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0IGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICAgICAgaWYgKFBISVVzZXJzLmluc2VydChQTikpICAvLyBOb3QgYWxyZWFkeSB2aXNpdGVkLgorICAgICAgICAgIGlmIChBbmFseXplR2xvYmFsKEksIEdTLCBQSElVc2VycykpIHJldHVybiB0cnVlOworICAgICAgICBHUy5IYXNQSElVc2VyID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXNhPENtcEluc3Q+KEkpKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gYW5hbHlzZS4KKyAgICAgIH0gZWxzZSBpZiAoaXNhPE1lbVRyYW5zZmVySW5zdD4oSSkpIHsKKyAgICAgICAgY29uc3QgTWVtVHJhbnNmZXJJbnN0ICpNVEkgPSBjYXN0PE1lbVRyYW5zZmVySW5zdD4oSSk7CisgICAgICAgIGlmIChNVEktPmdldEFyZ09wZXJhbmQoMCkgPT0gVikKKyAgICAgICAgICBHUy5TdG9yZWRUeXBlID0gR2xvYmFsU3RhdHVzOjppc1N0b3JlZDsKKyAgICAgICAgaWYgKE1USS0+Z2V0QXJnT3BlcmFuZCgxKSA9PSBWKQorICAgICAgICAgIEdTLmlzTG9hZGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXNhPE1lbVNldEluc3Q+KEkpKSB7CisgICAgICAgIGFzc2VydChjYXN0PE1lbVNldEluc3Q+KEkpLT5nZXRBcmdPcGVyYW5kKDApID09IFYgJiYKKyAgICAgICAgICAgICAgICJNZW1zZXQgb25seSB0YWtlcyBvbmUgcG9pbnRlciEiKTsKKyAgICAgICAgR1MuU3RvcmVkVHlwZSA9IEdsb2JhbFN0YXR1czo6aXNTdG9yZWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEFueSBvdGhlciBub24tbG9hZCBpbnN0cnVjdGlvbiBtaWdodCB0YWtlIGFkZHJlc3MhCisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25zdCBDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihVKSkgeworICAgICAgR1MuSGFzTm9uSW5zdHJ1Y3Rpb25Vc2VyID0gdHJ1ZTsKKyAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYSBkZWFkIGFuZCBkYW5nbGluZyBjb25zdGFudCBoYW5naW5nIG9mZiBvZiBoZXJlLgorICAgICAgaWYgKCFTYWZlVG9EZXN0cm95Q29uc3RhbnQoQykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBHUy5IYXNOb25JbnN0cnVjdGlvblVzZXIgPSB0cnVlOworICAgICAgLy8gT3RoZXJ3aXNlIG11c3QgYmUgc29tZSBvdGhlciB1c2VyLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgQ29uc3RhbnQgKmdldEFnZ3JlZ2F0ZUNvbnN0YW50RWxlbWVudChDb25zdGFudCAqQWdnLCBDb25zdGFudCAqSWR4KSB7CisgIENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJZHgpOworICBpZiAoIUNJKSByZXR1cm4gMDsKKyAgdW5zaWduZWQgSWR4ViA9IENJLT5nZXRaRXh0VmFsdWUoKTsKKworICBpZiAoQ29uc3RhbnRTdHJ1Y3QgKkNTID0gZHluX2Nhc3Q8Q29uc3RhbnRTdHJ1Y3Q+KEFnZykpIHsKKyAgICBpZiAoSWR4ViA8IENTLT5nZXROdW1PcGVyYW5kcygpKSByZXR1cm4gQ1MtPmdldE9wZXJhbmQoSWR4Vik7CisgIH0gZWxzZSBpZiAoQ29uc3RhbnRBcnJheSAqQ0EgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihBZ2cpKSB7CisgICAgaWYgKElkeFYgPCBDQS0+Z2V0TnVtT3BlcmFuZHMoKSkgcmV0dXJuIENBLT5nZXRPcGVyYW5kKElkeFYpOworICB9IGVsc2UgaWYgKENvbnN0YW50VmVjdG9yICpDUCA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihBZ2cpKSB7CisgICAgaWYgKElkeFYgPCBDUC0+Z2V0TnVtT3BlcmFuZHMoKSkgcmV0dXJuIENQLT5nZXRPcGVyYW5kKElkeFYpOworICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEFnZykpIHsKKyAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oQWdnLT5nZXRUeXBlKCkpKSB7CisgICAgICBpZiAoSWR4ViA8IFNUeS0+Z2V0TnVtRWxlbWVudHMoKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoU1R5LT5nZXRFbGVtZW50VHlwZShJZHhWKSk7CisgICAgfSBlbHNlIGlmIChjb25zdCBTZXF1ZW50aWFsVHlwZSAqU1R5ID0KKyAgICAgICAgICAgICAgIGR5bl9jYXN0PFNlcXVlbnRpYWxUeXBlPihBZ2ctPmdldFR5cGUoKSkpIHsKKyAgICAgIHJldHVybiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFNUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgfQorICB9IGVsc2UgaWYgKGlzYTxVbmRlZlZhbHVlPihBZ2cpKSB7CisgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KEFnZy0+Z2V0VHlwZSgpKSkgeworICAgICAgaWYgKElkeFYgPCBTVHktPmdldE51bUVsZW1lbnRzKCkpCisgICAgICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoU1R5LT5nZXRFbGVtZW50VHlwZShJZHhWKSk7CisgICAgfSBlbHNlIGlmIChjb25zdCBTZXF1ZW50aWFsVHlwZSAqU1R5ID0KKyAgICAgICAgICAgICAgIGR5bl9jYXN0PFNlcXVlbnRpYWxUeXBlPihBZ2ctPmdldFR5cGUoKSkpIHsKKyAgICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoU1R5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworLy8vIENsZWFudXBDb25zdGFudEdsb2JhbFVzZXJzIC0gV2UganVzdCBtYXJrZWQgR1YgY29uc3RhbnQuICBMb29wIG92ZXIgYWxsCisvLy8gdXNlcnMgb2YgdGhlIGdsb2JhbCwgY2xlYW5pbmcgdXAgdGhlIG9idmlvdXMgb25lcy4gIFRoaXMgaXMgbGFyZ2VseSBqdXN0IGEKKy8vLyBxdWljayBzY2FuIG92ZXIgdGhlIHVzZSBsaXN0IHRvIGNsZWFuIHVwIHRoZSBlYXN5IGFuZCBvYnZpb3VzIGNydWZ0LiAgVGhpcworLy8vIHJldHVybnMgdHJ1ZSBpZiBpdCBtYWRlIGEgY2hhbmdlLgorc3RhdGljIGJvb2wgQ2xlYW51cENvbnN0YW50R2xvYmFsVXNlcnMoVmFsdWUgKlYsIENvbnN0YW50ICpJbml0KSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsgVUkgIT0gRTspIHsKKyAgICBVc2VyICpVID0gKlVJKys7CisKKyAgICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFUpKSB7CisgICAgICBpZiAoSW5pdCkgeworICAgICAgICAvLyBSZXBsYWNlIHRoZSBsb2FkIHdpdGggdGhlIGluaXRpYWxpemVyLgorICAgICAgICBMSS0+cmVwbGFjZUFsbFVzZXNXaXRoKEluaXQpOworICAgICAgICBMSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oVSkpIHsKKyAgICAgIC8vIFN0b3JlIG11c3QgYmUgdW5yZWFjaGFibGUgb3Igc3RvcmluZyBJbml0IGludG8gdGhlIGdsb2JhbC4KKyAgICAgIFNJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVSkpIHsKKyAgICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpIHsKKyAgICAgICAgQ29uc3RhbnQgKlN1YkluaXQgPSAwOworICAgICAgICBpZiAoSW5pdCkKKyAgICAgICAgICBTdWJJbml0ID0gQ29uc3RhbnRGb2xkTG9hZFRocm91Z2hHRVBDb25zdGFudEV4cHIoSW5pdCwgQ0UpOworICAgICAgICBDaGFuZ2VkIHw9IENsZWFudXBDb25zdGFudEdsb2JhbFVzZXJzKENFLCBTdWJJbml0KTsKKyAgICAgIH0gZWxzZSBpZiAoQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpCaXRDYXN0ICYmIAorICAgICAgICAgICAgICAgICBDRS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSB7CisgICAgICAgIC8vIFBvaW50ZXIgY2FzdCwgZGVsZXRlIGFueSBzdG9yZXMgYW5kIG1lbXNldHMgdG8gdGhlIGdsb2JhbC4KKyAgICAgICAgQ2hhbmdlZCB8PSBDbGVhbnVwQ29uc3RhbnRHbG9iYWxVc2VycyhDRSwgMCk7CisgICAgICB9CisKKyAgICAgIGlmIChDRS0+dXNlX2VtcHR5KCkpIHsKKyAgICAgICAgQ0UtPmRlc3Ryb3lDb25zdGFudCgpOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVSkpIHsKKyAgICAgIC8vIERvIG5vdCB0cmFuc2Zvcm0gImdlcGluc3QgKGdlcCBjb25zdGV4cHIgKEdWKSkiIGhlcmUsIGJlY2F1c2UgZm9ybWluZworICAgICAgLy8gImdlcGNvbnN0ZXhwciAoZ2VwIGNvbnN0ZXhwciAoR1YpKSIgd2lsbCBjYXVzZSB0aGUgdHdvIGdlcCdzIHRvIGZvbGQKKyAgICAgIC8vIGFuZCB3aWxsIGludmFsaWRhdGUgb3VyIG5vdGlvbiBvZiB3aGF0IEluaXQgaXMuCisgICAgICBDb25zdGFudCAqU3ViSW5pdCA9IDA7CisgICAgICBpZiAoIWlzYTxDb25zdGFudEV4cHI+KEdFUC0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgQ29uc3RhbnRFeHByICpDRSA9IAorICAgICAgICAgIGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRFeHByPihDb25zdGFudEZvbGRJbnN0cnVjdGlvbihHRVApKTsKKyAgICAgICAgaWYgKEluaXQgJiYgQ0UgJiYgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyKQorICAgICAgICAgIFN1YkluaXQgPSBDb25zdGFudEZvbGRMb2FkVGhyb3VnaEdFUENvbnN0YW50RXhwcihJbml0LCBDRSk7CisgICAgICB9CisgICAgICBDaGFuZ2VkIHw9IENsZWFudXBDb25zdGFudEdsb2JhbFVzZXJzKEdFUCwgU3ViSW5pdCk7CisKKyAgICAgIGlmIChHRVAtPnVzZV9lbXB0eSgpKSB7CisgICAgICAgIEdFUC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoTWVtSW50cmluc2ljICpNSSA9IGR5bl9jYXN0PE1lbUludHJpbnNpYz4oVSkpIHsgLy8gbWVtc2V0L2NweS9tdgorICAgICAgaWYgKE1JLT5nZXRSYXdEZXN0KCkgPT0gVikgeworICAgICAgICBNSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgfQorCisgICAgfSBlbHNlIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihVKSkgeworICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNoYWluIG9mIGRlYWQgY29uc3RhbnRleHBycyBvciBvdGhlciB0aGluZ3MgZGFuZ2xpbmcgZnJvbQorICAgICAgLy8gdXMsIGFuZCBpZiB0aGV5IGFyZSBhbGwgZGVhZCwgbnVrZSB0aGVtIHdpdGhvdXQgcmVtb3JzZS4KKyAgICAgIGlmIChTYWZlVG9EZXN0cm95Q29uc3RhbnQoQykpIHsKKyAgICAgICAgQy0+ZGVzdHJveUNvbnN0YW50KCk7CisgICAgICAgIC8vIFRoaXMgY291bGQgaGF2ZSBpbnZhbGlkYXRlZCBVSSwgc3RhcnQgb3ZlciBmcm9tIHNjcmF0Y2guCisgICAgICAgIENsZWFudXBDb25zdGFudEdsb2JhbFVzZXJzKFYsIEluaXQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBpc1NhZmVTUk9BRWxlbWVudFVzZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgYSBzYWZlCisvLy8gdXNlciBvZiBhIGRlcml2ZWQgZXhwcmVzc2lvbiBmcm9tIGEgZ2xvYmFsIHRoYXQgd2Ugd2FudCB0byBTUk9BLgorc3RhdGljIGJvb2wgaXNTYWZlU1JPQUVsZW1lbnRVc2UoVmFsdWUgKlYpIHsKKyAgLy8gV2UgbWlnaHQgaGF2ZSBhIGRlYWQgYW5kIGRhbmdsaW5nIGNvbnN0YW50IGhhbmdpbmcgb2ZmIG9mIGhlcmUuCisgIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICByZXR1cm4gU2FmZVRvRGVzdHJveUNvbnN0YW50KEMpOworICAKKyAgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVik7CisgIGlmICghSSkgcmV0dXJuIGZhbHNlOworCisgIC8vIExvYWRzIGFyZSBvay4KKyAgaWYgKGlzYTxMb2FkSW5zdD4oSSkpIHJldHVybiB0cnVlOworCisgIC8vIFN0b3JlcyAqdG8qIHRoZSBwb2ludGVyIGFyZSBvay4KKyAgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEkpKQorICAgIHJldHVybiBTSS0+Z2V0T3BlcmFuZCgwKSAhPSBWOworICAgIAorICAvLyBPdGhlcndpc2UsIGl0IG11c3QgYmUgYSBHRVAuCisgIEdldEVsZW1lbnRQdHJJbnN0ICpHRVBJID0gZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KEkpOworICBpZiAoR0VQSSA9PSAwKSByZXR1cm4gZmFsc2U7CisgIAorICBpZiAoR0VQSS0+Z2V0TnVtT3BlcmFuZHMoKSA8IDMgfHwgIWlzYTxDb25zdGFudD4oR0VQSS0+Z2V0T3BlcmFuZCgxKSkgfHwKKyAgICAgICFjYXN0PENvbnN0YW50PihHRVBJLT5nZXRPcGVyYW5kKDEpKS0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgSSA9IEdFUEktPnVzZV9iZWdpbigpLCBFID0gR0VQSS0+dXNlX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmICghaXNTYWZlU1JPQUVsZW1lbnRVc2UoKkkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8gSXNVc2VyT2ZHbG9iYWxTYWZlRm9yU1JBIC0gVSBpcyBhIGRpcmVjdCB1c2VyIG9mIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhbHVlLgorLy8vIExvb2sgYXQgaXQgYW5kIGl0cyB1c2VzIGFuZCBkZWNpZGUgd2hldGhlciBpdCBpcyBzYWZlIHRvIFNST0EgdGhpcyBnbG9iYWwuCisvLy8KK3N0YXRpYyBib29sIElzVXNlck9mR2xvYmFsU2FmZUZvclNSQShVc2VyICpVLCBHbG9iYWxWYWx1ZSAqR1YpIHsKKyAgLy8gVGhlIHVzZXIgb2YgdGhlIGdsb2JhbCBtdXN0IGJlIGEgR0VQIEluc3Qgb3IgYSBDb25zdGFudEV4cHIgR0VQLgorICBpZiAoIWlzYTxHZXRFbGVtZW50UHRySW5zdD4oVSkgJiYgCisgICAgICAoIWlzYTxDb25zdGFudEV4cHI+KFUpIHx8IAorICAgICAgIGNhc3Q8Q29uc3RhbnRFeHByPihVKS0+Z2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIENvbnN0YW50RXhwciBHRVAgaXMgU1JBJ2FibGUuICBJbiBwYXJ0aWN1bGFyLCB3ZQorICAvLyBkb24ndCBsaWtlIDwgMyBvcGVyYW5kIENFJ3MsIGFuZCB3ZSBkb24ndCBsaWtlIG5vbi1jb25zdGFudCBpbnRlZ2VyCisgIC8vIGluZGljZXMuICBUaGlzIGVuZm9yY2VzIHRoYXQgYWxsIHVzZXMgYXJlICdnZXAgR1YsIDAsIEMsIC4uLicgZm9yIHNvbWUKKyAgLy8gdmFsdWUgb2YgQy4KKyAgaWYgKFUtPmdldE51bU9wZXJhbmRzKCkgPCAzIHx8ICFpc2E8Q29uc3RhbnQ+KFUtPmdldE9wZXJhbmQoMSkpIHx8CisgICAgICAhY2FzdDxDb25zdGFudD4oVS0+Z2V0T3BlcmFuZCgxKSktPmlzTnVsbFZhbHVlKCkgfHwKKyAgICAgICFpc2E8Q29uc3RhbnRJbnQ+KFUtPmdldE9wZXJhbmQoMikpKQorICAgIHJldHVybiBmYWxzZTsKKworICBnZXBfdHlwZV9pdGVyYXRvciBHRVBJID0gZ2VwX3R5cGVfYmVnaW4oVSksIEUgPSBnZXBfdHlwZV9lbmQoVSk7CisgICsrR0VQSTsgIC8vIFNraXAgb3ZlciB0aGUgcG9pbnRlciBpbmRleC4KKyAgCisgIC8vIElmIHRoaXMgaXMgYSB1c2Ugb2YgYW4gYXJyYXkgYWxsb2NhdGlvbiwgZG8gYSBiaXQgbW9yZSBjaGVja2luZyBmb3Igc2FuaXR5LgorICBpZiAoY29uc3QgQXJyYXlUeXBlICpBVCA9IGR5bl9jYXN0PEFycmF5VHlwZT4oKkdFUEkpKSB7CisgICAgdWludDY0X3QgTnVtRWxlbWVudHMgPSBBVC0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICBDb25zdGFudEludCAqSWR4ID0gY2FzdDxDb25zdGFudEludD4oVS0+Z2V0T3BlcmFuZCgyKSk7CisgICAgCisgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgaW5kZXggZmFsbHMgd2l0aGluIHRoZSBhcnJheS4gIElmIG5vdCwKKyAgICAvLyBzb21ldGhpbmcgZnVubnkgaXMgZ29pbmcgb24sIHNvIHdlIHdvbid0IGRvIHRoZSBvcHRpbWl6YXRpb24uCisgICAgLy8KKyAgICBpZiAoSWR4LT5nZXRaRXh0VmFsdWUoKSA+PSBOdW1FbGVtZW50cykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIAorICAgIC8vIFdlIGNhbm5vdCBzY2FsYXIgcmVwbCB0aGlzIGxldmVsIG9mIHRoZSBhcnJheSB1bmxlc3MgYW55IGFycmF5CisgICAgLy8gc3ViLWluZGljZXMgYXJlIGluLXJhbmdlIGNvbnN0YW50cy4gIEluIHBhcnRpY3VsYXIsIGNvbnNpZGVyOgorICAgIC8vIEFbMF1baV0uICBXZSBjYW5ub3Qga25vdyB0aGF0IHRoZSB1c2VyIGlzbid0IGRvaW5nIGludmFsaWQgdGhpbmdzIGxpa2UKKyAgICAvLyBhbGxvd2luZyBpIHRvIGluZGV4IGFuIG91dC1vZi1yYW5nZSBzdWJzY3JpcHQgdGhhdCBhY2Nlc3NlcyBBWzFdLgorICAgIC8vCisgICAgLy8gU2NhbGFyIHJlcGxhY2luZyAqanVzdCogdGhlIG91dGVyIGluZGV4IG9mIHRoZSBhcnJheSBpcyBwcm9iYWJseSBub3QKKyAgICAvLyBnb2luZyB0byBiZSBhIHdpbiBhbnl3YXksIHNvIGp1c3QgZ2l2ZSB1cC4KKyAgICBmb3IgKCsrR0VQSTsgLy8gU2tpcCBhcnJheSBpbmRleC4KKyAgICAgICAgIEdFUEkgIT0gRTsKKyAgICAgICAgICsrR0VQSSkgeworICAgICAgdWludDY0X3QgTnVtRWxlbWVudHM7CisgICAgICBpZiAoY29uc3QgQXJyYXlUeXBlICpTdWJBcnJheVR5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPigqR0VQSSkpCisgICAgICAgIE51bUVsZW1lbnRzID0gU3ViQXJyYXlUeS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAgIGVsc2UgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlN1YlZlY3RvclR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oKkdFUEkpKQorICAgICAgICBOdW1FbGVtZW50cyA9IFN1YlZlY3RvclR5LT5nZXROdW1FbGVtZW50cygpOworICAgICAgZWxzZSB7CisgICAgICAgIGFzc2VydCgoKkdFUEkpLT5pc1N0cnVjdFR5KCkgJiYKKyAgICAgICAgICAgICAgICJJbmRleGVkIEdFUCB0eXBlIGlzIG5vdCBhcnJheSwgdmVjdG9yLCBvciBzdHJ1Y3QhIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICBDb25zdGFudEludCAqSWR4VmFsID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEdFUEkuZ2V0T3BlcmFuZCgpKTsKKyAgICAgIGlmICghSWR4VmFsIHx8IElkeFZhbC0+Z2V0WkV4dFZhbHVlKCkgPj0gTnVtRWxlbWVudHMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgSSA9IFUtPnVzZV9iZWdpbigpLCBFID0gVS0+dXNlX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoIWlzU2FmZVNST0FFbGVtZW50VXNlKCpJKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBHbG9iYWxVc2Vyc1NhZmVUb1NSQSAtIExvb2sgYXQgYWxsIHVzZXMgb2YgdGhlIGdsb2JhbCBhbmQgZGVjaWRlIHdoZXRoZXIgaXQKKy8vLyBpcyBzYWZlIGZvciB1cyB0byBwZXJmb3JtIHRoaXMgdHJhbnNmb3JtYXRpb24uCisvLy8KK3N0YXRpYyBib29sIEdsb2JhbFVzZXJzU2FmZVRvU1JBKEdsb2JhbFZhbHVlICpHVikgeworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBHVi0+dXNlX2JlZ2luKCksIEUgPSBHVi0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IEU7ICsrVUkpIHsKKyAgICBpZiAoIUlzVXNlck9mR2xvYmFsU2FmZUZvclNSQSgqVUksIEdWKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKyAKKworLy8vIFNSQUdsb2JhbCAtIFBlcmZvcm0gc2NhbGFyIHJlcGxhY2VtZW50IG9mIGFnZ3JlZ2F0ZXMgb24gdGhlIHNwZWNpZmllZCBnbG9iYWwKKy8vLyB2YXJpYWJsZS4gIFRoaXMgb3BlbnMgdGhlIGRvb3IgZm9yIG90aGVyIG9wdGltaXphdGlvbnMgYnkgZXhwb3NpbmcgdGhlCisvLy8gYmVoYXZpb3Igb2YgdGhlIHByb2dyYW0gaW4gYSBtb3JlIGZpbmUtZ3JhaW5lZCB3YXkuICBXZSBoYXZlIGRldGVybWluZWQgdGhhdAorLy8vIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgc2FmZSBhbHJlYWR5LiAgV2UgcmV0dXJuIHRoZSBmaXJzdCBnbG9iYWwgdmFyaWFibGUgd2UKKy8vLyBpbnNlcnQgc28gdGhhdCB0aGUgY2FsbGVyIGNhbiByZXByb2Nlc3MgaXQuCitzdGF0aWMgR2xvYmFsVmFyaWFibGUgKlNSQUdsb2JhbChHbG9iYWxWYXJpYWJsZSAqR1YsIGNvbnN0IFRhcmdldERhdGEgJlREKSB7CisgIC8vIE1ha2Ugc3VyZSB0aGlzIGdsb2JhbCBvbmx5IGhhcyBzaW1wbGUgdXNlcyB0aGF0IHdlIGNhbiBTUkEuCisgIGlmICghR2xvYmFsVXNlcnNTYWZlVG9TUkEoR1YpKQorICAgIHJldHVybiAwOworICAKKyAgYXNzZXJ0KEdWLT5oYXNMb2NhbExpbmthZ2UoKSAmJiAhR1YtPmlzQ29uc3RhbnQoKSk7CisgIENvbnN0YW50ICpJbml0ID0gR1YtPmdldEluaXRpYWxpemVyKCk7CisgIGNvbnN0IFR5cGUgKlR5ID0gSW5pdC0+Z2V0VHlwZSgpOworCisgIHN0ZDo6dmVjdG9yPEdsb2JhbFZhcmlhYmxlKj4gTmV3R2xvYmFsczsKKyAgTW9kdWxlOjpHbG9iYWxMaXN0VHlwZSAmR2xvYmFscyA9IEdWLT5nZXRQYXJlbnQoKS0+Z2V0R2xvYmFsTGlzdCgpOworCisgIC8vIEdldCB0aGUgYWxpZ25tZW50IG9mIHRoZSBnbG9iYWwsIGVpdGhlciBleHBsaWNpdCBvciB0YXJnZXQtc3BlY2lmaWMuCisgIHVuc2lnbmVkIFN0YXJ0QWxpZ25tZW50ID0gR1YtPmdldEFsaWdubWVudCgpOworICBpZiAoU3RhcnRBbGlnbm1lbnQgPT0gMCkKKyAgICBTdGFydEFsaWdubWVudCA9IFRELmdldEFCSVR5cGVBbGlnbm1lbnQoR1YtPmdldFR5cGUoKSk7CisgICAKKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkgeworICAgIE5ld0dsb2JhbHMucmVzZXJ2ZShTVHktPmdldE51bUVsZW1lbnRzKCkpOworICAgIGNvbnN0IFN0cnVjdExheW91dCAmTGF5b3V0ID0gKlRELmdldFN0cnVjdExheW91dChTVHkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBDb25zdGFudCAqSW4gPSBnZXRBZ2dyZWdhdGVDb25zdGFudEVsZW1lbnQoSW5pdCwKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFNUeS0+Z2V0Q29udGV4dCgpKSwgaSkpOworICAgICAgYXNzZXJ0KEluICYmICJDb3VsZG4ndCBnZXQgZWxlbWVudCBvZiBpbml0aWFsaXplcj8iKTsKKyAgICAgIEdsb2JhbFZhcmlhYmxlICpOR1YgPSBuZXcgR2xvYmFsVmFyaWFibGUoU1R5LT5nZXRFbGVtZW50VHlwZShpKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhcmlhYmxlOjpJbnRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluLCBHVi0+Z2V0TmFtZSgpKyIuIitUd2luZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1YtPmlzVGhyZWFkTG9jYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVi0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSk7CisgICAgICBHbG9iYWxzLmluc2VydChHViwgTkdWKTsKKyAgICAgIE5ld0dsb2JhbHMucHVzaF9iYWNrKE5HVik7CisgICAgICAKKyAgICAgIC8vIENhbGN1bGF0ZSB0aGUga25vd24gYWxpZ25tZW50IG9mIHRoZSBmaWVsZC4gIElmIHRoZSBvcmlnaW5hbCBhZ2dyZWdhdGUKKyAgICAgIC8vIGhhZCAyNTYgYnl0ZSBhbGlnbm1lbnQgZm9yIGV4YW1wbGUsIHNvbWV0aGluZyBtaWdodCBkZXBlbmQgb24gdGhhdDoKKyAgICAgIC8vIHByb3BhZ2F0ZSBpbmZvIHRvIGVhY2ggZmllbGQuCisgICAgICB1aW50NjRfdCBGaWVsZE9mZnNldCA9IExheW91dC5nZXRFbGVtZW50T2Zmc2V0KGkpOworICAgICAgdW5zaWduZWQgTmV3QWxpZ24gPSAodW5zaWduZWQpTWluQWxpZ24oU3RhcnRBbGlnbm1lbnQsIEZpZWxkT2Zmc2V0KTsKKyAgICAgIGlmIChOZXdBbGlnbiA+IFRELmdldEFCSVR5cGVBbGlnbm1lbnQoU1R5LT5nZXRFbGVtZW50VHlwZShpKSkpCisgICAgICAgIE5HVi0+c2V0QWxpZ25tZW50KE5ld0FsaWduKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoY29uc3QgU2VxdWVudGlhbFR5cGUgKlNUeSA9IGR5bl9jYXN0PFNlcXVlbnRpYWxUeXBlPihUeSkpIHsKKyAgICB1bnNpZ25lZCBOdW1FbGVtZW50cyA9IDA7CisgICAgaWYgKGNvbnN0IEFycmF5VHlwZSAqQVR5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihTVHkpKQorICAgICAgTnVtRWxlbWVudHMgPSBBVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgZWxzZQorICAgICAgTnVtRWxlbWVudHMgPSBjYXN0PFZlY3RvclR5cGU+KFNUeSktPmdldE51bUVsZW1lbnRzKCk7CisKKyAgICBpZiAoTnVtRWxlbWVudHMgPiAxNiAmJiBHVi0+aGFzTlVzZXNPck1vcmUoMTYpKQorICAgICAgcmV0dXJuIDA7IC8vIEl0J3Mgbm90IHdvcnRoIGl0LgorICAgIE5ld0dsb2JhbHMucmVzZXJ2ZShOdW1FbGVtZW50cyk7CisgICAgCisgICAgdWludDY0X3QgRWx0U2l6ZSA9IFRELmdldFR5cGVBbGxvY1NpemUoU1R5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICB1bnNpZ25lZCBFbHRBbGlnbiA9IFRELmdldEFCSVR5cGVBbGlnbm1lbnQoU1R5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtRWxlbWVudHM7IGkgIT0gZTsgKytpKSB7CisgICAgICBDb25zdGFudCAqSW4gPSBnZXRBZ2dyZWdhdGVDb25zdGFudEVsZW1lbnQoSW5pdCwKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEluaXQtPmdldENvbnRleHQoKSksIGkpKTsKKyAgICAgIGFzc2VydChJbiAmJiAiQ291bGRuJ3QgZ2V0IGVsZW1lbnQgb2YgaW5pdGlhbGl6ZXI/Iik7CisKKyAgICAgIEdsb2JhbFZhcmlhYmxlICpOR1YgPSBuZXcgR2xvYmFsVmFyaWFibGUoU1R5LT5nZXRFbGVtZW50VHlwZSgpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFyaWFibGU6OkludGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4sIEdWLT5nZXROYW1lKCkrIi4iK1R3aW5lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVi0+aXNUaHJlYWRMb2NhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWLT5nZXRUeXBlKCktPmdldEFkZHJlc3NTcGFjZSgpKTsKKyAgICAgIEdsb2JhbHMuaW5zZXJ0KEdWLCBOR1YpOworICAgICAgTmV3R2xvYmFscy5wdXNoX2JhY2soTkdWKTsKKyAgICAgIAorICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBrbm93biBhbGlnbm1lbnQgb2YgdGhlIGZpZWxkLiAgSWYgdGhlIG9yaWdpbmFsIGFnZ3JlZ2F0ZQorICAgICAgLy8gaGFkIDI1NiBieXRlIGFsaWdubWVudCBmb3IgZXhhbXBsZSwgc29tZXRoaW5nIG1pZ2h0IGRlcGVuZCBvbiB0aGF0OgorICAgICAgLy8gcHJvcGFnYXRlIGluZm8gdG8gZWFjaCBmaWVsZC4KKyAgICAgIHVuc2lnbmVkIE5ld0FsaWduID0gKHVuc2lnbmVkKU1pbkFsaWduKFN0YXJ0QWxpZ25tZW50LCBFbHRTaXplKmkpOworICAgICAgaWYgKE5ld0FsaWduID4gRWx0QWxpZ24pCisgICAgICAgIE5HVi0+c2V0QWxpZ25tZW50KE5ld0FsaWduKTsKKyAgICB9CisgIH0KKworICBpZiAoTmV3R2xvYmFscy5lbXB0eSgpKQorICAgIHJldHVybiAwOworICAKKyAgREVCVUcoZGJncygpIDw8ICJQRVJGT1JNSU5HIEdMT0JBTCBTUkEgT046ICIgPDwgKkdWKTsKKworICBDb25zdGFudCAqTnVsbEludCA9Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KEdWLT5nZXRDb250ZXh0KCkpKTsKKworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSB1c2VzIG9mIHRoZSBnbG9iYWwsIHJlcGxhY2luZyB0aGUgY29uc3RhbnRleHByIGdlcHMsCisgIC8vIHdpdGggc21hbGxlciBjb25zdGFudGV4cHIgZ2VwcyBvciBkaXJlY3QgcmVmZXJlbmNlcy4KKyAgd2hpbGUgKCFHVi0+dXNlX2VtcHR5KCkpIHsKKyAgICBVc2VyICpHRVAgPSBHVi0+dXNlX2JhY2soKTsKKyAgICBhc3NlcnQoKChpc2E8Q29uc3RhbnRFeHByPihHRVApICYmCisgICAgICAgICAgICAgY2FzdDxDb25zdGFudEV4cHI+KEdFUCktPmdldE9wY29kZSgpPT1JbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cil8fAorICAgICAgICAgICAgaXNhPEdldEVsZW1lbnRQdHJJbnN0PihHRVApKSAmJiAiTm9uR0VQIENFJ3MgYXJlIG5vdCBTUkFhYmxlISIpOworCisgICAgLy8gSWdub3JlIHRoZSAxdGggb3BlcmFuZCwgd2hpY2ggaGFzIHRvIGJlIHplcm8gb3IgZWxzZSB0aGUgcHJvZ3JhbSBpcyBxdWl0ZQorICAgIC8vIGJyb2tlbiAodW5kZWZpbmVkKS4gIEdldCB0aGUgMm5kIG9wZXJhbmQsIHdoaWNoIGlzIHRoZSBzdHJ1Y3R1cmUgb3IgYXJyYXkKKyAgICAvLyBpbmRleC4KKyAgICB1bnNpZ25lZCBWYWwgPSBjYXN0PENvbnN0YW50SW50PihHRVAtPmdldE9wZXJhbmQoMikpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBpZiAoVmFsID49IE5ld0dsb2JhbHMuc2l6ZSgpKSBWYWwgPSAwOyAvLyBPdXQgb2YgYm91bmQgYXJyYXkgYWNjZXNzLgorCisgICAgVmFsdWUgKk5ld1B0ciA9IE5ld0dsb2JhbHNbVmFsXTsKKworICAgIC8vIEZvcm0gYSBzaG9ydGVyIEdFUCBpZiBuZWVkZWQuCisgICAgaWYgKEdFUC0+Z2V0TnVtT3BlcmFuZHMoKSA+IDMpIHsKKyAgICAgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihHRVApKSB7CisgICAgICAgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgOD4gSWR4czsKKyAgICAgICAgSWR4cy5wdXNoX2JhY2soTnVsbEludCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDMsIGUgPSBDRS0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgSWR4cy5wdXNoX2JhY2soQ0UtPmdldE9wZXJhbmQoaSkpOworICAgICAgICBOZXdQdHIgPSBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoY2FzdDxDb25zdGFudD4oTmV3UHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJZHhzWzBdLCBJZHhzLnNpemUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHZXRFbGVtZW50UHRySW5zdCAqR0VQSSA9IGNhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KEdFUCk7CisgICAgICAgIFNtYWxsVmVjdG9yPFZhbHVlKiwgOD4gSWR4czsKKyAgICAgICAgSWR4cy5wdXNoX2JhY2soTnVsbEludCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDMsIGUgPSBHRVBJLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBJZHhzLnB1c2hfYmFjayhHRVBJLT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgICAgTmV3UHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShOZXdQdHIsIElkeHMuYmVnaW4oKSwgSWR4cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVBJLT5nZXROYW1lKCkrIi4iK1R3aW5lKFZhbCksR0VQSSk7CisgICAgICB9CisgICAgfQorICAgIEdFUC0+cmVwbGFjZUFsbFVzZXNXaXRoKE5ld1B0cik7CisKKyAgICBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUEkgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oR0VQKSkKKyAgICAgIEdFUEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIGVsc2UKKyAgICAgIGNhc3Q8Q29uc3RhbnRFeHByPihHRVApLT5kZXN0cm95Q29uc3RhbnQoKTsKKyAgfQorCisgIC8vIERlbGV0ZSB0aGUgb2xkIGdsb2JhbCwgbm93IHRoYXQgaXQgaXMgZGVhZC4KKyAgR2xvYmFscy5lcmFzZShHVik7CisgICsrTnVtU1JBOworCisgIC8vIExvb3Agb3ZlciB0aGUgbmV3IGdsb2JhbHMgYXJyYXkgZGVsZXRpbmcgYW55IGdsb2JhbHMgdGhhdCBhcmUgb2J2aW91c2x5CisgIC8vIGRlYWQuICBUaGlzIGNhbiBhcmlzZSBkdWUgdG8gc2NhbGFyaXphdGlvbiBvZiBhIHN0cnVjdHVyZSBvciBhbiBhcnJheSB0aGF0CisgIC8vIGhhcyBlbGVtZW50cyB0aGF0IGFyZSBkZWFkLgorICB1bnNpZ25lZCBGaXJzdEdsb2JhbCA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOZXdHbG9iYWxzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKE5ld0dsb2JhbHNbaV0tPnVzZV9lbXB0eSgpKSB7CisgICAgICBHbG9iYWxzLmVyYXNlKE5ld0dsb2JhbHNbaV0pOworICAgICAgaWYgKEZpcnN0R2xvYmFsID09IGkpICsrRmlyc3RHbG9iYWw7CisgICAgfQorCisgIHJldHVybiBGaXJzdEdsb2JhbCAhPSBOZXdHbG9iYWxzLnNpemUoKSA/IE5ld0dsb2JhbHNbRmlyc3RHbG9iYWxdIDogMDsKK30KKworLy8vIEFsbFVzZXNPZlZhbHVlV2lsbFRyYXBJZk51bGwgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgdXNlcnMgb2YgdGhlIHNwZWNpZmllZAorLy8vIHZhbHVlIHdpbGwgdHJhcCBpZiB0aGUgdmFsdWUgaXMgZHluYW1pY2FsbHkgbnVsbC4gIFBISXMga2VlcHMgdHJhY2sgb2YgYW55IAorLy8vIHBoaSBub2RlcyB3ZSd2ZSBzZWVuIHRvIGF2b2lkIHJlcHJvY2Vzc2luZyB0aGVtLgorc3RhdGljIGJvb2wgQWxsVXNlc09mVmFsdWVXaWxsVHJhcElmTnVsbChjb25zdCBWYWx1ZSAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgUEhJTm9kZSosIDg+ICZQSElzKSB7CisgIGZvciAoVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvciBVSSA9IFYtPnVzZV9iZWdpbigpLCBFID0gVi0+dXNlX2VuZCgpOyBVSSAhPSBFOworICAgICAgICsrVUkpIHsKKyAgICBjb25zdCBVc2VyICpVID0gKlVJOworCisgICAgaWYgKGlzYTxMb2FkSW5zdD4oVSkpIHsKKyAgICAgIC8vIFdpbGwgdHJhcC4KKyAgICB9IGVsc2UgaWYgKGNvbnN0IFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFUpKSB7CisgICAgICBpZiAoU0ktPmdldE9wZXJhbmQoMCkgPT0gVikgeworICAgICAgICAvL2NlcnIgPDwgIk5PTlRSQVBQSU5HIFVTRTogIiA8PCAqVTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gU3RvcmluZyB0aGUgdmFsdWUuCisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25zdCBDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oVSkpIHsKKyAgICAgIGlmIChDSS0+Z2V0Q2FsbGVkVmFsdWUoKSAhPSBWKSB7CisgICAgICAgIC8vY2VyciA8PCAiTk9OVFJBUFBJTkcgVVNFOiAiIDw8ICpVOworICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBOb3QgY2FsbGluZyB0aGUgcHRyCisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25zdCBJbnZva2VJbnN0ICpJSSA9IGR5bl9jYXN0PEludm9rZUluc3Q+KFUpKSB7CisgICAgICBpZiAoSUktPmdldENhbGxlZFZhbHVlKCkgIT0gVikgeworICAgICAgICAvL2NlcnIgPDwgIk5PTlRSQVBQSU5HIFVTRTogIiA8PCAqVTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gTm90IGNhbGxpbmcgdGhlIHB0cgorICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29uc3QgQml0Q2FzdEluc3QgKkNJID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KFUpKSB7CisgICAgICBpZiAoIUFsbFVzZXNPZlZhbHVlV2lsbFRyYXBJZk51bGwoQ0ksIFBISXMpKSByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChjb25zdCBHZXRFbGVtZW50UHRySW5zdCAqR0VQSSA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihVKSkgeworICAgICAgaWYgKCFBbGxVc2VzT2ZWYWx1ZVdpbGxUcmFwSWZOdWxsKEdFUEksIFBISXMpKSByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChjb25zdCBQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KFUpKSB7CisgICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBwaGkgbm9kZSwgaWdub3JlIGl0LCBpdCBoYXMgYWxyZWFkeSBiZWVuCisgICAgICAvLyBjaGVja2VkLgorICAgICAgaWYgKFBISXMuaW5zZXJ0KFBOKSAmJiAhQWxsVXNlc09mVmFsdWVXaWxsVHJhcElmTnVsbChQTiwgUEhJcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKGlzYTxJQ21wSW5zdD4oVSkgJiYKKyAgICAgICAgICAgICAgIGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihVSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIC8vIElnbm9yZSBpY21wIFgsIG51bGwKKyAgICB9IGVsc2UgeworICAgICAgLy9jZXJyIDw8ICJOT05UUkFQUElORyBVU0U6ICIgPDwgKlU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gQWxsVXNlc09mTG9hZGVkVmFsdWVXaWxsVHJhcElmTnVsbCAtIFJldHVybiB0cnVlIGlmIGFsbCB1c2VzIG9mIGFueSBsb2FkcworLy8vIGZyb20gR1Ygd2lsbCB0cmFwIGlmIHRoZSBsb2FkZWQgdmFsdWUgaXMgbnVsbC4gIE5vdGUgdGhhdCB0aGlzIGFsc28gcGVybWl0cworLy8vIGNvbXBhcmlzb25zIG9mIHRoZSBsb2FkZWQgdmFsdWUgYWdhaW5zdCBudWxsLCBhcyBhIHNwZWNpYWwgY2FzZS4KK3N0YXRpYyBib29sIEFsbFVzZXNPZkxvYWRlZFZhbHVlV2lsbFRyYXBJZk51bGwoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKSB7CisgIGZvciAoVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvciBVSSA9IEdWLT51c2VfYmVnaW4oKSwgRSA9IEdWLT51c2VfZW5kKCk7CisgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgIGNvbnN0IFVzZXIgKlUgPSAqVUk7CisKKyAgICBpZiAoY29uc3QgTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFUpKSB7CisgICAgICBTbWFsbFB0clNldDxjb25zdCBQSElOb2RlKiwgOD4gUEhJczsKKyAgICAgIGlmICghQWxsVXNlc09mVmFsdWVXaWxsVHJhcElmTnVsbChMSSwgUEhJcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKGlzYTxTdG9yZUluc3Q+KFUpKSB7CisgICAgICAvLyBJZ25vcmUgc3RvcmVzIHRvIHRoZSBnbG9iYWwuCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIGRvbid0IGtub3cgb3IgdW5kZXJzdGFuZCB0aGlzIHVzZXIsIGJhaWwgb3V0LgorICAgICAgLy9jZXJyIDw8ICJVTktOT1dOIFVTRVIgT0YgR0xPQkFMITogIiA8PCAqVTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIE9wdGltaXplQXdheVRyYXBwaW5nVXNlc09mVmFsdWUoVmFsdWUgKlYsIENvbnN0YW50ICpOZXdWKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsgVUkgIT0gRTsgKSB7CisgICAgSW5zdHJ1Y3Rpb24gKkkgPSBjYXN0PEluc3RydWN0aW9uPigqVUkrKyk7CisgICAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihJKSkgeworICAgICAgTEktPnNldE9wZXJhbmQoMCwgTmV3Vik7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEkpKSB7CisgICAgICBpZiAoU0ktPmdldE9wZXJhbmQoMSkgPT0gVikgeworICAgICAgICBTSS0+c2V0T3BlcmFuZCgxLCBOZXdWKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpc2E8Q2FsbEluc3Q+KEkpIHx8IGlzYTxJbnZva2VJbnN0PihJKSkgeworICAgICAgQ2FsbFNpdGUgQ1MoSSk7CisgICAgICBpZiAoQ1MuZ2V0Q2FsbGVkVmFsdWUoKSA9PSBWKSB7CisgICAgICAgIC8vIENhbGxpbmcgdGhyb3VnaCB0aGUgcG9pbnRlciEgIFR1cm4gaW50byBhIGRpcmVjdCBjYWxsLCBidXQgYmUgY2FyZWZ1bAorICAgICAgICAvLyB0aGF0IHRoZSBwb2ludGVyIGlzIG5vdCBhbHNvIGJlaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgQ1Muc2V0Q2FsbGVkRnVuY3Rpb24oTmV3Vik7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICBib29sIFBhc3NlZEFzQXJnID0gZmFsc2U7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUy5hcmdfc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBpZiAoQ1MuZ2V0QXJndW1lbnQoaSkgPT0gVikgeworICAgICAgICAgICAgUGFzc2VkQXNBcmcgPSB0cnVlOworICAgICAgICAgICAgQ1Muc2V0QXJndW1lbnQoaSwgTmV3Vik7CisgICAgICAgICAgfQorCisgICAgICAgIGlmIChQYXNzZWRBc0FyZykgeworICAgICAgICAgIC8vIEJlaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudCBhbHNvLiAgQmUgY2FyZWZ1bCB0byBub3QgaW52YWxpZGF0ZSBVSSEKKyAgICAgICAgICBVSSA9IFYtPnVzZV9iZWdpbigpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChDYXN0SW5zdCAqQ0kgPSBkeW5fY2FzdDxDYXN0SW5zdD4oSSkpIHsKKyAgICAgIENoYW5nZWQgfD0gT3B0aW1pemVBd2F5VHJhcHBpbmdVc2VzT2ZWYWx1ZShDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRDYXN0KENJLT5nZXRPcGNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1YsIENJLT5nZXRUeXBlKCkpKTsKKyAgICAgIGlmIChDSS0+dXNlX2VtcHR5KCkpIHsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVBJID0gZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KEkpKSB7CisgICAgICAvLyBTaG91bGQgaGFuZGxlIEdFUCBoZXJlLgorICAgICAgU21hbGxWZWN0b3I8Q29uc3RhbnQqLCA4PiBJZHhzOworICAgICAgSWR4cy5yZXNlcnZlKEdFUEktPmdldE51bU9wZXJhbmRzKCktMSk7CisgICAgICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIGkgPSBHRVBJLT5vcF9iZWdpbigpICsgMSwgZSA9IEdFUEktPm9wX2VuZCgpOworICAgICAgICAgICBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KCppKSkKKyAgICAgICAgICBJZHhzLnB1c2hfYmFjayhDKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKElkeHMuc2l6ZSgpID09IEdFUEktPmdldE51bU9wZXJhbmRzKCktMSkKKyAgICAgICAgQ2hhbmdlZCB8PSBPcHRpbWl6ZUF3YXlUcmFwcGluZ1VzZXNPZlZhbHVlKEdFUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihOZXdWLCAmSWR4c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4cy5zaXplKCkpKTsKKyAgICAgIGlmIChHRVBJLT51c2VfZW1wdHkoKSkgeworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgR0VQSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKworLy8vIE9wdGltaXplQXdheVRyYXBwaW5nVXNlc09mTG9hZHMgLSBUaGUgc3BlY2lmaWVkIGdsb2JhbCBoYXMgb25seSBvbmUgbm9uLW51bGwKKy8vLyB2YWx1ZSBzdG9yZWQgaW50byBpdC4gIElmIHRoZXJlIGFyZSB1c2VzIG9mIHRoZSBsb2FkZWQgdmFsdWUgdGhhdCB3b3VsZCB0cmFwCisvLy8gaWYgdGhlIGxvYWRlZCB2YWx1ZSBpcyBkeW5hbWljYWxseSBudWxsLCB0aGVuIHdlIGtub3cgdGhhdCB0aGV5IGNhbm5vdCBiZQorLy8vIHJlYWNoYWJsZSB3aXRoIGEgbnVsbCBvcHRpbWl6ZSBhd2F5IHRoZSBsb2FkLgorc3RhdGljIGJvb2wgT3B0aW1pemVBd2F5VHJhcHBpbmdVc2VzT2ZMb2FkcyhHbG9iYWxWYXJpYWJsZSAqR1YsIENvbnN0YW50ICpMVikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICAvLyBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgYXJlIGFibGUgdG8gcmVtb3ZlIGFsbCB0aGUgdXNlcyBvZiB0aGUgZ2xvYmFsCisgIC8vIG90aGVyIHRoYW4gdGhlIHN0b3JlIHRoYXQgZGVmaW5lcyBpdC4KKyAgYm9vbCBBbGxOb25TdG9yZVVzZXNHb25lID0gdHJ1ZTsKKyAgCisgIC8vIFJlcGxhY2UgYWxsIHVzZXMgb2YgbG9hZHMgd2l0aCB1c2VzIG9mIHVzZXMgb2YgdGhlIHN0b3JlZCB2YWx1ZS4KKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIEdVSSA9IEdWLT51c2VfYmVnaW4oKSwgRSA9IEdWLT51c2VfZW5kKCk7IEdVSSAhPSBFOyl7CisgICAgVXNlciAqR2xvYmFsVXNlciA9ICpHVUkrKzsKKyAgICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KEdsb2JhbFVzZXIpKSB7CisgICAgICBDaGFuZ2VkIHw9IE9wdGltaXplQXdheVRyYXBwaW5nVXNlc09mVmFsdWUoTEksIExWKTsKKyAgICAgIC8vIElmIHdlIHdlcmUgYWJsZSB0byBkZWxldGUgYWxsIHVzZXMgb2YgdGhlIGxvYWRzCisgICAgICBpZiAoTEktPnVzZV9lbXB0eSgpKSB7CisgICAgICAgIExJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBBbGxOb25TdG9yZVVzZXNHb25lID0gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpc2E8U3RvcmVJbnN0PihHbG9iYWxVc2VyKSkgeworICAgICAgLy8gSWdub3JlIHRoZSBzdG9yZSB0aGF0IHN0b3JlcyAiTFYiIHRvIHRoZSBnbG9iYWwuCisgICAgICBhc3NlcnQoR2xvYmFsVXNlci0+Z2V0T3BlcmFuZCgxKSA9PSBHViAmJgorICAgICAgICAgICAgICJNdXN0IGJlIHN0b3JpbmcgKnRvKiB0aGUgZ2xvYmFsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIEFsbE5vblN0b3JlVXNlc0dvbmUgPSBmYWxzZTsKKworICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgd2UgY291bGQgaGF2ZSBvdGhlciBjcmF6eSB1c2VzIHRoYXQgYXJlIHRyYW5zaXRpdmVseQorICAgICAgLy8gbG9hZGVkLgorICAgICAgYXNzZXJ0KChpc2E8UEhJTm9kZT4oR2xvYmFsVXNlcikgfHwgaXNhPFNlbGVjdEluc3Q+KEdsb2JhbFVzZXIpIHx8CisgICAgICAgICAgICAgIGlzYTxDb25zdGFudEV4cHI+KEdsb2JhbFVzZXIpKSAmJiAiT25seSBleHBlY3QgbG9hZCBhbmQgc3RvcmVzISIpOworICAgIH0KKyAgfQorCisgIGlmIChDaGFuZ2VkKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJPUFRJTUlaRUQgTE9BRFMgRlJPTSBTVE9SRUQgT05DRSBQT0lOVEVSOiAiIDw8ICpHVik7CisgICAgKytOdW1HbG9iVXNlczsKKyAgfQorCisgIC8vIElmIHdlIG51a2VkIGFsbCBvZiB0aGUgbG9hZHMsIHRoZW4gbm9uZSBvZiB0aGUgc3RvcmVzIGFyZSBuZWVkZWQgZWl0aGVyLAorICAvLyBub3IgaXMgdGhlIGdsb2JhbC4KKyAgaWYgKEFsbE5vblN0b3JlVXNlc0dvbmUpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgKioqIEdMT0JBTCBOT1cgREVBRCFcbiIpOworICAgIENsZWFudXBDb25zdGFudEdsb2JhbFVzZXJzKEdWLCAwKTsKKyAgICBpZiAoR1YtPnVzZV9lbXB0eSgpKSB7CisgICAgICBHVi0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICArK051bURlbGV0ZWQ7CisgICAgfQorICAgIENoYW5nZWQgPSB0cnVlOworICB9CisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gQ29uc3RhbnRQcm9wVXNlcnNPZiAtIFdhbGsgdGhlIHVzZSBsaXN0IG9mIFYsIGNvbnN0YW50IGZvbGRpbmcgYWxsIG9mIHRoZQorLy8vIGluc3RydWN0aW9ucyB0aGF0IGFyZSBmb2xkYWJsZS4KK3N0YXRpYyB2b2lkIENvbnN0YW50UHJvcFVzZXJzT2YoVmFsdWUgKlYpIHsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gVi0+dXNlX2JlZ2luKCksIEUgPSBWLT51c2VfZW5kKCk7IFVJICE9IEU7ICkKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oKlVJKyspKQorICAgICAgaWYgKENvbnN0YW50ICpOZXdDID0gQ29uc3RhbnRGb2xkSW5zdHJ1Y3Rpb24oSSkpIHsKKyAgICAgICAgSS0+cmVwbGFjZUFsbFVzZXNXaXRoKE5ld0MpOworCisgICAgICAgIC8vIEFkdmFuY2UgVUkgdG8gdGhlIG5leHQgbm9uLUkgdXNlIHRvIGF2b2lkIGludmFsaWRhdGluZyBpdCEKKyAgICAgICAgLy8gSW5zdHJ1Y3Rpb25zIGNvdWxkIG11bHRpcGx5IHVzZSBWLgorICAgICAgICB3aGlsZSAoVUkgIT0gRSAmJiAqVUkgPT0gSSkKKyAgICAgICAgICArK1VJOworICAgICAgICBJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIH0KK30KKworLy8vIE9wdGltaXplR2xvYmFsQWRkcmVzc09mTWFsbG9jIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgc3BlY2lmaWVkIGdsb2JhbAorLy8vIHZhcmlhYmxlLCBhbmQgdHJhbnNmb3JtcyB0aGUgcHJvZ3JhbSBhcyBpZiBpdCBhbHdheXMgY29udGFpbmVkIHRoZSByZXN1bHQgb2YKKy8vLyB0aGUgc3BlY2lmaWVkIG1hbGxvYy4gIEJlY2F1c2UgaXQgaXMgYWx3YXlzIHRoZSByZXN1bHQgb2YgdGhlIHNwZWNpZmllZAorLy8vIG1hbGxvYywgdGhlcmUgaXMgbm8gcmVhc29uIHRvIGFjdHVhbGx5IERPIHRoZSBtYWxsb2MuICBJbnN0ZWFkLCB0dXJuIHRoZQorLy8vIG1hbGxvYyBpbnRvIGEgZ2xvYmFsLCBhbmQgYW55IGxvYWRzIG9mIEdWIGFzIHVzZXMgb2YgdGhlIG5ldyBnbG9iYWwuCitzdGF0aWMgR2xvYmFsVmFyaWFibGUgKk9wdGltaXplR2xvYmFsQWRkcmVzc09mTWFsbG9jKEdsb2JhbFZhcmlhYmxlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEluc3QgKkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpBbGxvY1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludCAqTkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXREYXRhKiBURCkgeworICBERUJVRyhlcnJzKCkgPDwgIlBST01PVElORyBHTE9CQUw6ICIgPDwgKkdWIDw8ICIgIENBTEwgPSAiIDw8ICpDSSA8PCAnXG4nKTsKKyAgCisgIGNvbnN0IFR5cGUgKkdsb2JhbFR5cGU7CisgIGlmIChORWxlbWVudHMtPmdldFpFeHRWYWx1ZSgpID09IDEpCisgICAgR2xvYmFsVHlwZSA9IEFsbG9jVHk7CisgIGVsc2UKKyAgICAvLyBJZiB3ZSBoYXZlIGFuIGFycmF5IGFsbG9jYXRpb24sIHRoZSBnbG9iYWwgdmFyaWFibGUgaXMgb2YgYW4gYXJyYXkuCisgICAgR2xvYmFsVHlwZSA9IEFycmF5VHlwZTo6Z2V0KEFsbG9jVHksIE5FbGVtZW50cy0+Z2V0WkV4dFZhbHVlKCkpOworCisgIC8vIENyZWF0ZSB0aGUgbmV3IGdsb2JhbCB2YXJpYWJsZS4gIFRoZSBjb250ZW50cyBvZiB0aGUgbWFsbG9jJ2QgbWVtb3J5IGlzCisgIC8vIHVuZGVmaW5lZCwgc28gaW5pdGlhbGl6ZSB3aXRoIGFuIHVuZGVmIHZhbHVlLgorICBHbG9iYWxWYXJpYWJsZSAqTmV3R1YgPSBuZXcgR2xvYmFsVmFyaWFibGUoKkdWLT5nZXRQYXJlbnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxUeXBlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmRlZlZhbHVlOjpnZXQoR2xvYmFsVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVi0+Z2V0TmFtZSgpKyIuYm9keSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWLT5pc1RocmVhZExvY2FsKCkpOworICAKKyAgLy8gSWYgdGhlcmUgYXJlIGJpdGNhc3QgdXNlcnMgb2YgdGhlIG1hbGxvYyAod2hpY2ggaXMgdHlwaWNhbCwgdXN1YWxseSB3ZSBoYXZlCisgIC8vIGEgbWFsbG9jICsgYml0Y2FzdCkgdGhlbiByZXBsYWNlIHRoZW0gd2l0aCB1c2VzIG9mIHRoZSBuZXcgZ2xvYmFsLiAgVXBkYXRlCisgIC8vIG90aGVyIHVzZXJzIHRvIHVzZSB0aGUgZ2xvYmFsIGFzIHdlbGwuCisgIEJpdENhc3RJbnN0ICpUaGVCQyA9IDA7CisgIHdoaWxlICghQ0ktPnVzZV9lbXB0eSgpKSB7CisgICAgSW5zdHJ1Y3Rpb24gKlVzZXIgPSBjYXN0PEluc3RydWN0aW9uPihDSS0+dXNlX2JhY2soKSk7CisgICAgaWYgKEJpdENhc3RJbnN0ICpCQ0kgPSBkeW5fY2FzdDxCaXRDYXN0SW5zdD4oVXNlcikpIHsKKyAgICAgIGlmIChCQ0ktPmdldFR5cGUoKSA9PSBOZXdHVi0+Z2V0VHlwZSgpKSB7CisgICAgICAgIEJDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKE5ld0dWKTsKKyAgICAgICAgQkNJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEJDSS0+c2V0T3BlcmFuZCgwLCBOZXdHVik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChUaGVCQyA9PSAwKQorICAgICAgICBUaGVCQyA9IG5ldyBCaXRDYXN0SW5zdChOZXdHViwgQ0ktPmdldFR5cGUoKSwgIm5ld2d2IiwgQ0kpOworICAgICAgVXNlci0+cmVwbGFjZVVzZXNPZldpdGgoQ0ksIFRoZUJDKTsKKyAgICB9CisgIH0KKyAgCisgIENvbnN0YW50ICpSZXBWYWx1ZSA9IE5ld0dWOworICBpZiAoTmV3R1YtPmdldFR5cGUoKSAhPSBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpKQorICAgIFJlcFZhbHVlID0gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KFJlcFZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpKTsKKworICAvLyBJZiB0aGVyZSBpcyBhIGNvbXBhcmlzb24gYWdhaW5zdCBudWxsLCB3ZSB3aWxsIGluc2VydCBhIGdsb2JhbCBib29sIHRvCisgIC8vIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgZ2xvYmFsIHdhcyBpbml0aWFsaXplZCB5ZXQgb3Igbm90LgorICBHbG9iYWxWYXJpYWJsZSAqSW5pdEJvb2wgPQorICAgIG5ldyBHbG9iYWxWYXJpYWJsZShUeXBlOjpnZXRJbnQxVHkoR1YtPmdldENvbnRleHQoKSksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0RmFsc2UoR1YtPmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgIEdWLT5nZXROYW1lKCkrIi5pbml0IiwgR1YtPmlzVGhyZWFkTG9jYWwoKSk7CisgIGJvb2wgSW5pdEJvb2xVc2VkID0gZmFsc2U7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCB1c2VzIG9mIEdWLCBwcm9jZXNzaW5nIHRoZW0gaW4gdHVybi4KKyAgd2hpbGUgKCFHVi0+dXNlX2VtcHR5KCkpIHsKKyAgICBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oR1YtPnVzZV9iYWNrKCkpKSB7CisgICAgICAvLyBUaGUgZ2xvYmFsIGlzIGluaXRpYWxpemVkIHdoZW4gdGhlIHN0b3JlIHRvIGl0IG9jY3Vycy4KKyAgICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnRJbnQ6OmdldFRydWUoR1YtPmdldENvbnRleHQoKSksIEluaXRCb29sLCBTSSk7CisgICAgICBTSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgTG9hZEluc3QgKkxJID0gY2FzdDxMb2FkSW5zdD4oR1YtPnVzZV9iYWNrKCkpOworICAgIHdoaWxlICghTEktPnVzZV9lbXB0eSgpKSB7CisgICAgICBVc2UgJkxvYWRVc2UgPSBMSS0+dXNlX2JlZ2luKCkuZ2V0VXNlKCk7CisgICAgICBpZiAoIWlzYTxJQ21wSW5zdD4oTG9hZFVzZS5nZXRVc2VyKCkpKSB7CisgICAgICAgIExvYWRVc2UgPSBSZXBWYWx1ZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIElDbXBJbnN0ICpJQ0kgPSBjYXN0PElDbXBJbnN0PihMb2FkVXNlLmdldFVzZXIoKSk7CisgICAgICAvLyBSZXBsYWNlIHRoZSBjbXAgWCwgMCB3aXRoIGEgdXNlIG9mIHRoZSBib29sIHZhbHVlLgorICAgICAgVmFsdWUgKkxWID0gbmV3IExvYWRJbnN0KEluaXRCb29sLCBJbml0Qm9vbC0+Z2V0TmFtZSgpKyIudmFsIiwgSUNJKTsKKyAgICAgIEluaXRCb29sVXNlZCA9IHRydWU7CisgICAgICBzd2l0Y2ggKElDSS0+Z2V0UHJlZGljYXRlKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gSUNtcCBQcmVkaWNhdGUhIik7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDoKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiAgIC8vIFggPCBudWxsIC0+IGFsd2F5cyBmYWxzZQorICAgICAgICBMViA9IENvbnN0YW50SW50OjpnZXRGYWxzZShHVi0+Z2V0Q29udGV4dCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRToKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xFOgorICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUToKKyAgICAgICAgTFYgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTm90KExWLCAibm90aW5pdCIsIElDSSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORToKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOgorICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR0U6CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDoKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOgorICAgICAgICBicmVhazsgIC8vIG5vIGNoYW5nZS4KKyAgICAgIH0KKyAgICAgIElDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKExWKTsKKyAgICAgIElDSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgfQorICAgIExJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorCisgIC8vIElmIHRoZSBpbml0aWFsaXphdGlvbiBib29sZWFuIHdhcyB1c2VkLCBpbnNlcnQgaXQsIG90aGVyd2lzZSBkZWxldGUgaXQuCisgIGlmICghSW5pdEJvb2xVc2VkKSB7CisgICAgd2hpbGUgKCFJbml0Qm9vbC0+dXNlX2VtcHR5KCkpICAvLyBEZWxldGUgaW5pdGlhbGl6YXRpb25zCisgICAgICBjYXN0PFN0b3JlSW5zdD4oSW5pdEJvb2wtPnVzZV9iYWNrKCkpLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBkZWxldGUgSW5pdEJvb2w7CisgIH0gZWxzZQorICAgIEdWLT5nZXRQYXJlbnQoKS0+Z2V0R2xvYmFsTGlzdCgpLmluc2VydChHViwgSW5pdEJvb2wpOworCisgIC8vIE5vdyB0aGUgR1YgaXMgZGVhZCwgbnVrZSBpdCBhbmQgdGhlIG1hbGxvYy4uCisgIEdWLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vIFRvIGZ1cnRoZXIgb3RoZXIgb3B0aW1pemF0aW9ucywgbG9vcCBvdmVyIGFsbCB1c2VycyBvZiBOZXdHViBhbmQgdHJ5IHRvCisgIC8vIGNvbnN0YW50IHByb3AgdGhlbS4gIFRoaXMgd2lsbCBwcm9tb3RlIEdFUCBpbnN0cnVjdGlvbnMgd2l0aCBjb25zdGFudAorICAvLyBpbmRpY2VzIGludG8gR0VQIGNvbnN0YW50LWV4cHJzLCB3aGljaCB3aWxsIGFsbG93IGdsb2JhbC1vcHQgdG8gaGFjayBvbiBpdC4KKyAgQ29uc3RhbnRQcm9wVXNlcnNPZihOZXdHVik7CisgIGlmIChSZXBWYWx1ZSAhPSBOZXdHVikKKyAgICBDb25zdGFudFByb3BVc2Vyc09mKFJlcFZhbHVlKTsKKworICByZXR1cm4gTmV3R1Y7Cit9CisKKy8vLyBWYWx1ZUlzT25seVVzZWRMb2NhbGx5T3JTdG9yZWRUb09uZUdsb2JhbCAtIFNjYW4gdGhlIHVzZS1saXN0IG9mIFYgY2hlY2tpbmcKKy8vLyB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gY29tcGxleCB1c2VzIG9mIFYuICBXZSBwZXJtaXQgc2ltcGxlIHRoaW5ncworLy8vIGxpa2UgZGVyZWZlcmVuY2luZyB0aGUgcG9pbnRlciwgYnV0IG5vdCBzdG9yaW5nIHRocm91Z2ggdGhlIGFkZHJlc3MsIHVubGVzcworLy8vIGl0IGlzIHRvIHRoZSBzcGVjaWZpZWQgZ2xvYmFsLgorc3RhdGljIGJvb2wgVmFsdWVJc09ubHlVc2VkTG9jYWxseU9yU3RvcmVkVG9PbmVHbG9iYWwoY29uc3QgSW5zdHJ1Y3Rpb24gKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PGNvbnN0IFBISU5vZGUqLCA4PiAmUEhJcykgeworICBmb3IgKFZhbHVlOjpjb25zdF91c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsKKyAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkluc3QgPSBjYXN0PEluc3RydWN0aW9uPigqVUkpOworCisgICAgaWYgKGlzYTxMb2FkSW5zdD4oSW5zdCkgfHwgaXNhPENtcEluc3Q+KEluc3QpKSB7CisgICAgICBjb250aW51ZTsgLy8gRmluZSwgaWdub3JlLgorICAgIH0KKyAgICAKKyAgICBpZiAoY29uc3QgU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oSW5zdCkpIHsKKyAgICAgIGlmIChTSS0+Z2V0T3BlcmFuZCgwKSA9PSBWICYmIFNJLT5nZXRPcGVyYW5kKDEpICE9IEdWKQorICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBTdG9yaW5nIHRoZSBwb2ludGVyIGl0c2VsZi4uLiBiYWQuCisgICAgICBjb250aW51ZTsgLy8gT3RoZXJ3aXNlLCBzdG9yaW5nIHRocm91Z2ggaXQsIG9yIHN0b3JpbmcgaW50byBHVi4uLiBmaW5lLgorICAgIH0KKyAgICAKKyAgICAvLyBNdXN0IGluZGV4IGludG8gdGhlIGFycmF5IGFuZCBpbnRvIHRoZSBzdHJ1Y3QuCisgICAgaWYgKGlzYTxHZXRFbGVtZW50UHRySW5zdD4oSW5zdCkgJiYgSW5zdC0+Z2V0TnVtT3BlcmFuZHMoKSA+PSAzKSB7CisgICAgICBpZiAoIVZhbHVlSXNPbmx5VXNlZExvY2FsbHlPclN0b3JlZFRvT25lR2xvYmFsKEluc3QsIEdWLCBQSElzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIGlmIChjb25zdCBQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEluc3QpKSB7CisgICAgICAvLyBQSElzIGFyZSBvayBpZiBhbGwgdXNlcyBhcmUgb2suICBEb24ndCBpbmZpbml0ZWx5IHJlY3Vyc2UgdGhyb3VnaCBQSEkKKyAgICAgIC8vIGN5Y2xlcy4KKyAgICAgIGlmIChQSElzLmluc2VydChQTikpCisgICAgICAgIGlmICghVmFsdWVJc09ubHlVc2VkTG9jYWxseU9yU3RvcmVkVG9PbmVHbG9iYWwoUE4sIEdWLCBQSElzKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgaWYgKGNvbnN0IEJpdENhc3RJbnN0ICpCQ0kgPSBkeW5fY2FzdDxCaXRDYXN0SW5zdD4oSW5zdCkpIHsKKyAgICAgIGlmICghVmFsdWVJc09ubHlVc2VkTG9jYWxseU9yU3RvcmVkVG9PbmVHbG9iYWwoQkNJLCBHViwgUEhJcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBSZXBsYWNlVXNlc09mTWFsbG9jV2l0aEdsb2JhbCAtIFRoZSBBbGxvYyBwb2ludGVyIGlzIHN0b3JlZCBpbnRvIEdWCisvLy8gc29tZXdoZXJlLiAgVHJhbnNmb3JtIGFsbCB1c2VzIG9mIHRoZSBhbGxvY2F0aW9uIGludG8gbG9hZHMgZnJvbSB0aGUKKy8vLyBnbG9iYWwgYW5kIHVzZXMgb2YgdGhlIHJlc3VsdGFudCBwb2ludGVyLiAgRnVydGhlciwgZGVsZXRlIHRoZSBzdG9yZSBpbnRvCisvLy8gR1YuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGVzZSB2YWx1ZSBwYXNzIHRoZSAKKy8vLyAnVmFsdWVJc09ubHlVc2VkTG9jYWxseU9yU3RvcmVkVG9PbmVHbG9iYWwnIHByZWRpY2F0ZS4KK3N0YXRpYyB2b2lkIFJlcGxhY2VVc2VzT2ZNYWxsb2NXaXRoR2xvYmFsKEluc3RydWN0aW9uICpBbGxvYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYXJpYWJsZSAqR1YpIHsKKyAgd2hpbGUgKCFBbGxvYy0+dXNlX2VtcHR5KCkpIHsKKyAgICBJbnN0cnVjdGlvbiAqVSA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpBbGxvYy0+dXNlX2JlZ2luKCkpOworICAgIEluc3RydWN0aW9uICpJbnNlcnRQdCA9IFU7CisgICAgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFUpKSB7CisgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBzdG9yZSBvZiB0aGUgYWxsb2NhdGlvbiBpbnRvIHRoZSBnbG9iYWwsIHJlbW92ZSBpdC4KKyAgICAgIGlmIChTSS0+Z2V0T3BlcmFuZCgxKSA9PSBHVikgeworICAgICAgICBTSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihVKSkgeworICAgICAgLy8gSW5zZXJ0IHRoZSBsb2FkIGluIHRoZSBjb3JyZXNwb25kaW5nIHByZWRlY2Vzc29yLCBub3QgcmlnaHQgYmVmb3JlIHRoZQorICAgICAgLy8gUEhJLgorICAgICAgSW5zZXJ0UHQgPSBQTi0+Z2V0SW5jb21pbmdCbG9jayhBbGxvYy0+dXNlX2JlZ2luKCkpLT5nZXRUZXJtaW5hdG9yKCk7CisgICAgfSBlbHNlIGlmIChpc2E8Qml0Q2FzdEluc3Q+KFUpKSB7CisgICAgICAvLyBNdXN0IGJlIGJpdGNhc3QgYmV0d2VlbiB0aGUgbWFsbG9jIGFuZCBzdG9yZSB0byBpbml0aWFsaXplIHRoZSBnbG9iYWwuCisgICAgICBSZXBsYWNlVXNlc09mTWFsbG9jV2l0aEdsb2JhbChVLCBHVik7CisgICAgICBVLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUEkgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVSkpIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSAiR0VQIGJpdGNhc3QiIGFuZCB0aGUgdXNlciBpcyBhIHN0b3JlIHRvIHRoZSBnbG9iYWwsIHRoZW4KKyAgICAgIC8vIGp1c3QgcHJvY2VzcyBpdCBhcyBhIGJpdGNhc3QuCisgICAgICBpZiAoR0VQSS0+aGFzQWxsWmVyb0luZGljZXMoKSAmJiBHRVBJLT5oYXNPbmVVc2UoKSkKKyAgICAgICAgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEdFUEktPnVzZV9iYWNrKCkpKQorICAgICAgICAgIGlmIChTSS0+Z2V0T3BlcmFuZCgxKSA9PSBHVikgeworICAgICAgICAgICAgLy8gTXVzdCBiZSBiaXRjYXN0IEdFUCBiZXR3ZWVuIHRoZSBtYWxsb2MgYW5kIHN0b3JlIHRvIGluaXRpYWxpemUKKyAgICAgICAgICAgIC8vIHRoZSBnbG9iYWwuCisgICAgICAgICAgICBSZXBsYWNlVXNlc09mTWFsbG9jV2l0aEdsb2JhbChHRVBJLCBHVik7CisgICAgICAgICAgICBHRVBJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICB9CisgICAgICAKKyAgICAvLyBJbnNlcnQgYSBsb2FkIGZyb20gdGhlIGdsb2JhbCwgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIHRoZSBtYWxsb2MuCisgICAgVmFsdWUgKk5MID0gbmV3IExvYWRJbnN0KEdWLCBHVi0+Z2V0TmFtZSgpKyIudmFsIiwgSW5zZXJ0UHQpOworICAgIFUtPnJlcGxhY2VVc2VzT2ZXaXRoKEFsbG9jLCBOTCk7CisgIH0KK30KKworLy8vIExvYWRVc2VzU2ltcGxlRW5vdWdoRm9ySGVhcFNSQSAtIFZlcmlmeSB0aGF0IGFsbCB1c2VzIG9mIFYgKGEgbG9hZCwgb3IgYSBwaGkKKy8vLyBvZiBhIGxvYWQpIGFyZSBzaW1wbGUgZW5vdWdoIHRvIHBlcmZvcm0gaGVhcCBTUkEgb24uICBUaGlzIHBlcm1pdHMgR0VQJ3MKKy8vLyB0aGF0IGluZGV4IHRocm91Z2ggdGhlIGFycmF5IGFuZCBzdHJ1Y3QgZmllbGQsIGljbXBzIG9mIG51bGwsIGFuZCBQSElzLgorc3RhdGljIGJvb2wgTG9hZFVzZXNTaW1wbGVFbm91Z2hGb3JIZWFwU1JBKGNvbnN0IFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgUEhJTm9kZSosIDMyPiAmTG9hZFVzaW5nUEhJcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PGNvbnN0IFBISU5vZGUqLCAzMj4gJkxvYWRVc2luZ1BISXNQZXJMb2FkKSB7CisgIC8vIFdlIHBlcm1pdCB0d28gdXNlcnMgb2YgdGhlIGxvYWQ6IHNldGNjIGNvbXBhcmluZyBhZ2FpbnN0IHRoZSBudWxsCisgIC8vIHBvaW50ZXIsIGFuZCBhIGdldGVsZW1lbnRwdHIgb2YgYSBzcGVjaWZpYyBmb3JtLgorICBmb3IgKFZhbHVlOjpjb25zdF91c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsgVUkgIT0gRTsKKyAgICAgICArK1VJKSB7CisgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKlVzZXIgPSBjYXN0PEluc3RydWN0aW9uPigqVUkpOworICAgIAorICAgIC8vIENvbXBhcmlzb24gYWdhaW5zdCBudWxsIGlzIG9rLgorICAgIGlmIChjb25zdCBJQ21wSW5zdCAqSUNJID0gZHluX2Nhc3Q8SUNtcEluc3Q+KFVzZXIpKSB7CisgICAgICBpZiAoIWlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihJQ0ktPmdldE9wZXJhbmQoMSkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gZ2V0ZWxlbWVudHB0ciBpcyBhbHNvIG9rLCBidXQgb25seSBhIHNpbXBsZSBmb3JtLgorICAgIGlmIChjb25zdCBHZXRFbGVtZW50UHRySW5zdCAqR0VQSSA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihVc2VyKSkgeworICAgICAgLy8gTXVzdCBpbmRleCBpbnRvIHRoZSBhcnJheSBhbmQgaW50byB0aGUgc3RydWN0LgorICAgICAgaWYgKEdFUEktPmdldE51bU9wZXJhbmRzKCkgPCAzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSB0aGUgR0VQIGlzIG9rLgorICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIGlmIChjb25zdCBQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KFVzZXIpKSB7CisgICAgICBpZiAoIUxvYWRVc2luZ1BISXNQZXJMb2FkLmluc2VydChQTikpCisgICAgICAgIC8vIFRoaXMgbWVhbnMgc29tZSBwaGkgbm9kZXMgYXJlIGRlcGVuZGVudCBvbiBlYWNoIG90aGVyLgorICAgICAgICAvLyBBdm9pZCBpbmZpbml0ZSBsb29waW5nIQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIUxvYWRVc2luZ1BISXMuaW5zZXJ0KFBOKSkKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGFuYWx5emVkIHRoaXMgUEhJLCB0aGVuIGl0IGlzIHNhZmUuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBNYWtlIHN1cmUgYWxsIHVzZXMgb2YgdGhlIFBISSBhcmUgc2ltcGxlIGVub3VnaCB0byB0cmFuc2Zvcm0uCisgICAgICBpZiAoIUxvYWRVc2VzU2ltcGxlRW5vdWdoRm9ySGVhcFNSQShQTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRVc2luZ1BISXMsIExvYWRVc2luZ1BISXNQZXJMb2FkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gT3RoZXJ3aXNlIHdlIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzLCBub3Qgb2suCisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8gQWxsR2xvYmFsTG9hZFVzZXNTaW1wbGVFbm91Z2hGb3JIZWFwU1JBIC0gSWYgYWxsIHVzZXJzIG9mIHZhbHVlcyBsb2FkZWQgZnJvbQorLy8vIEdWIGFyZSBzaW1wbGUgZW5vdWdoIHRvIHBlcmZvcm0gSGVhcFNSQSwgcmV0dXJuIHRydWUuCitzdGF0aWMgYm9vbCBBbGxHbG9iYWxMb2FkVXNlc1NpbXBsZUVub3VnaEZvckhlYXBTUkEoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpTdG9yZWRWYWwpIHsKKyAgU21hbGxQdHJTZXQ8Y29uc3QgUEhJTm9kZSosIDMyPiBMb2FkVXNpbmdQSElzOworICBTbWFsbFB0clNldDxjb25zdCBQSElOb2RlKiwgMzI+IExvYWRVc2luZ1BISXNQZXJMb2FkOworICBmb3IgKFZhbHVlOjpjb25zdF91c2VfaXRlcmF0b3IgVUkgPSBHVi0+dXNlX2JlZ2luKCksIEUgPSBHVi0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IEU7ICsrVUkpCisgICAgaWYgKGNvbnN0IExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PigqVUkpKSB7CisgICAgICBpZiAoIUxvYWRVc2VzU2ltcGxlRW5vdWdoRm9ySGVhcFNSQShMSSwgTG9hZFVzaW5nUEhJcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRVc2luZ1BISXNQZXJMb2FkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgTG9hZFVzaW5nUEhJc1BlckxvYWQuY2xlYXIoKTsKKyAgICB9CisgIAorICAvLyBJZiB3ZSByZWFjaCBoZXJlLCB3ZSBrbm93IHRoYXQgYWxsIHVzZXMgb2YgdGhlIGxvYWRzIGFuZCB0cmFuc2l0aXZlIHVzZXMKKyAgLy8gKHRocm91Z2ggUEhJIG5vZGVzKSBhcmUgc2ltcGxlIGVub3VnaCB0byB0cmFuc2Zvcm0uICBIb3dldmVyLCB3ZSBkb24ndCBrbm93CisgIC8vIHRoYXQgYWxsIGlucHV0cyB0aGUgdG8gdGhlIFBISSBub2RlcyBhcmUgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2Ugc2V0cy4gCisgIC8vIENoZWNrIHRvIHZlcmlmeSB0aGF0IGFsbCBvcGVyYW5kcyBvZiB0aGUgUEhJcyBhcmUgZWl0aGVyIFBISVMgdGhhdCBjYW4gYmUKKyAgLy8gdHJhbnNmb3JtZWQsIGxvYWRzIGZyb20gR1YsIG9yIE1JIGl0c2VsZi4KKyAgZm9yIChTbWFsbFB0clNldDxjb25zdCBQSElOb2RlKiwgMzI+Ojpjb25zdF9pdGVyYXRvciBJID0gTG9hZFVzaW5nUEhJcy5iZWdpbigpCisgICAgICAgLCBFID0gTG9hZFVzaW5nUEhJcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBQSElOb2RlICpQTiA9ICpJOworICAgIGZvciAodW5zaWduZWQgb3AgPSAwLCBlID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IG9wICE9IGU7ICsrb3ApIHsKKyAgICAgIFZhbHVlICpJblZhbCA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlKG9wKTsKKyAgICAgIAorICAgICAgLy8gUEhJIG9mIHRoZSBzdG9yZWQgdmFsdWUgaXRzZWxmIGlzIG9rLgorICAgICAgaWYgKEluVmFsID09IFN0b3JlZFZhbCkgY29udGludWU7CisgICAgICAKKyAgICAgIGlmIChjb25zdCBQSElOb2RlICpJblBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSW5WYWwpKSB7CisgICAgICAgIC8vIE9uZSBvZiB0aGUgUEhJcyBpbiBvdXIgc2V0IGlzIChvcHRpbWlzdGljYWxseSkgb2suCisgICAgICAgIGlmIChMb2FkVXNpbmdQSElzLmNvdW50KEluUE4pKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIExvYWQgZnJvbSBHViBpcyBvay4KKyAgICAgIGlmIChjb25zdCBMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSW5WYWwpKQorICAgICAgICBpZiAoTEktPmdldE9wZXJhbmQoMCkgPT0gR1YpCisgICAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIFVOREVGPyBOVUxMPworICAgICAgCisgICAgICAvLyBBbnl0aGluZyBlbHNlIGlzIHJlamVjdGVkLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBWYWx1ZSAqR2V0SGVhcFNST0FWYWx1ZShWYWx1ZSAqViwgdW5zaWduZWQgRmllbGRObywKKyAgICAgICAgICAgICAgIERlbnNlTWFwPFZhbHVlKiwgc3RkOjp2ZWN0b3I8VmFsdWUqPiA+ICZJbnNlcnRlZFNjYWxhcml6ZWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFBISU5vZGUqLCB1bnNpZ25lZD4gPiAmUEhJc1RvUmV3cml0ZSkgeworICBzdGQ6OnZlY3RvcjxWYWx1ZSo+ICZGaWVsZFZhbHMgPSBJbnNlcnRlZFNjYWxhcml6ZWRWYWx1ZXNbVl07CisgIAorICBpZiAoRmllbGRObyA+PSBGaWVsZFZhbHMuc2l6ZSgpKQorICAgIEZpZWxkVmFscy5yZXNpemUoRmllbGRObysxKTsKKyAgCisgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIHZhbHVlLCBqdXN0IHJldXNlIHRoZSBwcmV2aW91c2x5IHNjYWxhcml6ZWQKKyAgLy8gdmVyc2lvbi4KKyAgaWYgKFZhbHVlICpGaWVsZFZhbCA9IEZpZWxkVmFsc1tGaWVsZE5vXSkKKyAgICByZXR1cm4gRmllbGRWYWw7CisgIAorICAvLyBEZXBlbmRpbmcgb24gd2hhdCBpbnN0cnVjdGlvbiB0aGlzIGlzLCB3ZSBoYXZlIHNldmVyYWwgY2FzZXMuCisgIFZhbHVlICpSZXN1bHQ7CisgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oVikpIHsKKyAgICAvLyBUaGlzIGlzIGEgc2NhbGFyaXplZCB2ZXJzaW9uIG9mIHRoZSBsb2FkIGZyb20gdGhlIGdsb2JhbC4gIEp1c3QgY3JlYXRlCisgICAgLy8gYSBuZXcgTG9hZCBvZiB0aGUgc2NhbGFyaXplZCBnbG9iYWwuCisgICAgUmVzdWx0ID0gbmV3IExvYWRJbnN0KEdldEhlYXBTUk9BVmFsdWUoTEktPmdldE9wZXJhbmQoMCksIEZpZWxkTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBISXNUb1Jld3JpdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMSS0+Z2V0TmFtZSgpKyIuZiIrVHdpbmUoRmllbGRObyksIExJKTsKKyAgfSBlbHNlIGlmIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KFYpKSB7CisgICAgLy8gUE4ncyB0eXBlIGlzIHBvaW50ZXIgdG8gc3RydWN0LiAgTWFrZSBhIG5ldyBQSEkgb2YgcG9pbnRlciB0byBzdHJ1Y3QKKyAgICAvLyBmaWVsZC4KKyAgICBjb25zdCBTdHJ1Y3RUeXBlICpTVCA9IAorICAgICAgY2FzdDxTdHJ1Y3RUeXBlPihjYXN0PFBvaW50ZXJUeXBlPihQTi0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgCisgICAgUmVzdWx0ID0KKyAgICAgUEhJTm9kZTo6Q3JlYXRlKFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoU1QtPmdldEVsZW1lbnRUeXBlKEZpZWxkTm8pKSwKKyAgICAgICAgICAgICAgICAgICAgIFBOLT5nZXROYW1lKCkrIi5mIitUd2luZShGaWVsZE5vKSwgUE4pOworICAgIFBISXNUb1Jld3JpdGUucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFBOLCBGaWVsZE5vKSk7CisgIH0gZWxzZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB1c2FibGUgdmFsdWUiKTsKKyAgICBSZXN1bHQgPSAwOworICB9CisgIAorICByZXR1cm4gRmllbGRWYWxzW0ZpZWxkTm9dID0gUmVzdWx0OworfQorCisvLy8gUmV3cml0ZUhlYXBTUk9BTG9hZFVzZXIgLSBHaXZlbiBhIGxvYWQgaW5zdHJ1Y3Rpb24gYW5kIGEgdmFsdWUgZGVyaXZlZCBmcm9tCisvLy8gdGhlIGxvYWQsIHJld3JpdGUgdGhlIGRlcml2ZWQgdmFsdWUgdG8gdXNlIHRoZSBIZWFwU1JvQSdkIGxvYWQuCitzdGF0aWMgdm9pZCBSZXdyaXRlSGVhcFNST0FMb2FkVXNlcihJbnN0cnVjdGlvbiAqTG9hZFVzZXIsIAorICAgICAgICAgICAgIERlbnNlTWFwPFZhbHVlKiwgc3RkOjp2ZWN0b3I8VmFsdWUqPiA+ICZJbnNlcnRlZFNjYWxhcml6ZWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFBISU5vZGUqLCB1bnNpZ25lZD4gPiAmUEhJc1RvUmV3cml0ZSkgeworICAvLyBJZiB0aGlzIGlzIGEgY29tcGFyaXNvbiBhZ2FpbnN0IG51bGwsIGhhbmRsZSBpdC4KKyAgaWYgKElDbXBJbnN0ICpTQ0kgPSBkeW5fY2FzdDxJQ21wSW5zdD4oTG9hZFVzZXIpKSB7CisgICAgYXNzZXJ0KGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihTQ0ktPmdldE9wZXJhbmQoMSkpKTsKKyAgICAvLyBJZiB3ZSBoYXZlIGEgc2V0Y2Mgb2YgdGhlIGxvYWRlZCBwb2ludGVyLCB3ZSBjYW4gdXNlIGEgc2V0Y2Mgb2YgYW55CisgICAgLy8gZmllbGQuCisgICAgVmFsdWUgKk5QdHIgPSBHZXRIZWFwU1JPQVZhbHVlKFNDSS0+Z2V0T3BlcmFuZCgwKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLCBQSElzVG9SZXdyaXRlKTsKKyAgICAKKyAgICBWYWx1ZSAqTmV3ID0gbmV3IElDbXBJbnN0KFNDSSwgU0NJLT5nZXRQcmVkaWNhdGUoKSwgTlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoTlB0ci0+Z2V0VHlwZSgpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0ktPmdldE5hbWUoKSk7CisgICAgU0NJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3KTsKKyAgICBTQ0ktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gSGFuZGxlICdnZXRlbGVtZW50cHRyIFB0ciwgSWR4LCBpMzIgRmllbGRObyAuLi4nCisgIGlmIChHZXRFbGVtZW50UHRySW5zdCAqR0VQSSA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihMb2FkVXNlcikpIHsKKyAgICBhc3NlcnQoR0VQSS0+Z2V0TnVtT3BlcmFuZHMoKSA+PSAzICYmIGlzYTxDb25zdGFudEludD4oR0VQSS0+Z2V0T3BlcmFuZCgyKSkKKyAgICAgICAgICAgJiYgIlVuZXhwZWN0ZWQgR0VQSSEiKTsKKyAgCisgICAgLy8gTG9hZCB0aGUgcG9pbnRlciBmb3IgdGhpcyBmaWVsZC4KKyAgICB1bnNpZ25lZCBGaWVsZE5vID0gY2FzdDxDb25zdGFudEludD4oR0VQSS0+Z2V0T3BlcmFuZCgyKSktPmdldFpFeHRWYWx1ZSgpOworICAgIFZhbHVlICpOZXdQdHIgPSBHZXRIZWFwU1JPQVZhbHVlKEdFUEktPmdldE9wZXJhbmQoMCksIEZpZWxkTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLCBQSElzVG9SZXdyaXRlKTsKKyAgICAKKyAgICAvLyBDcmVhdGUgdGhlIG5ldyBHRVAgaWR4IHZlY3Rvci4KKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IEdFUElkeDsKKyAgICBHRVBJZHgucHVzaF9iYWNrKEdFUEktPmdldE9wZXJhbmQoMSkpOworICAgIEdFUElkeC5hcHBlbmQoR0VQSS0+b3BfYmVnaW4oKSszLCBHRVBJLT5vcF9lbmQoKSk7CisgICAgCisgICAgVmFsdWUgKk5HRVBJID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShOZXdQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVBJZHguYmVnaW4oKSwgR0VQSWR4LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VQSS0+Z2V0TmFtZSgpLCBHRVBJKTsKKyAgICBHRVBJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTkdFUEkpOworICAgIEdFUEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFJlY3Vyc2l2ZWx5IHRyYW5zZm9ybSB0aGUgdXNlcnMgb2YgUEhJIG5vZGVzLiAgVGhpcyB3aWxsIGxhemlseSBjcmVhdGUgdGhlCisgIC8vIFBISXMgdGhhdCBhcmUgbmVlZGVkIGZvciBpbmRpdmlkdWFsIGVsZW1lbnRzLiAgS2VlcCB0cmFjayBvZiB3aGF0IFBISXMgd2UKKyAgLy8gc2VlIGluIEluc2VydGVkU2NhbGFyaXplZFZhbHVlcyBzbyB0aGF0IHdlIGRvbid0IGdldCBpbmZpbml0ZSBsb29wcyAodmVyeQorICAvLyBhbnRpc29jaWFsKS4gIElmIHRoZSBQSEkgaXMgYWxyZWFkeSBpbiBJbnNlcnRlZFNjYWxhcml6ZWRWYWx1ZXMsIGl0IGhhcworICAvLyBhbHJlYWR5IGJlZW4gc2VlbiBmaXJzdCBieSBhbm90aGVyIGxvYWQsIHNvIGl0cyB1c2VzIGhhdmUgYWxyZWFkeSBiZWVuCisgIC8vIHByb2Nlc3NlZC4KKyAgUEhJTm9kZSAqUE4gPSBjYXN0PFBISU5vZGU+KExvYWRVc2VyKTsKKyAgYm9vbCBJbnNlcnRlZDsKKyAgRGVuc2VNYXA8VmFsdWUqLCBzdGQ6OnZlY3RvcjxWYWx1ZSo+ID46Oml0ZXJhdG9yIEluc2VydFBvczsKKyAgdGllKEluc2VydFBvcywgSW5zZXJ0ZWQpID0KKyAgICBJbnNlcnRlZFNjYWxhcml6ZWRWYWx1ZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFBOLCBzdGQ6OnZlY3RvcjxWYWx1ZSo+KCkpKTsKKyAgaWYgKCFJbnNlcnRlZCkgcmV0dXJuOworICAKKyAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoaXMgUEhJLCByZWN1cnNpdmVseSBwcm9jZXNzIGFsbAorICAvLyB1c2Vycy4KKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gUE4tPnVzZV9iZWdpbigpLCBFID0gUE4tPnVzZV9lbmQoKTsgVUkgIT0gRTsgKSB7CisgICAgSW5zdHJ1Y3Rpb24gKlVzZXIgPSBjYXN0PEluc3RydWN0aW9uPigqVUkrKyk7CisgICAgUmV3cml0ZUhlYXBTUk9BTG9hZFVzZXIoVXNlciwgSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLCBQSElzVG9SZXdyaXRlKTsKKyAgfQorfQorCisvLy8gUmV3cml0ZVVzZXNPZkxvYWRGb3JIZWFwU1JvQSAtIFdlIGFyZSBwZXJmb3JtaW5nIEhlYXAgU1JvQSBvbiBhIGdsb2JhbC4gIFB0cgorLy8vIGlzIGEgdmFsdWUgbG9hZGVkIGZyb20gdGhlIGdsb2JhbC4gIEVsaW1pbmF0ZSBhbGwgdXNlcyBvZiBQdHIsIG1ha2luZyB0aGVtCisvLy8gdXNlIEZpZWxkR2xvYmFscyBpbnN0ZWFkLiAgQWxsIHVzZXMgb2YgbG9hZGVkIHZhbHVlcyBzYXRpc2Z5CisvLy8gQWxsR2xvYmFsTG9hZFVzZXNTaW1wbGVFbm91Z2hGb3JIZWFwU1JBLgorc3RhdGljIHZvaWQgUmV3cml0ZVVzZXNPZkxvYWRGb3JIZWFwU1JvQShMb2FkSW5zdCAqTG9hZCwgCisgICAgICAgICAgICAgICBEZW5zZU1hcDxWYWx1ZSosIHN0ZDo6dmVjdG9yPFZhbHVlKj4gPiAmSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxQSElOb2RlKiwgdW5zaWduZWQ+ID4gJlBISXNUb1Jld3JpdGUpIHsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gTG9hZC0+dXNlX2JlZ2luKCksIEUgPSBMb2FkLT51c2VfZW5kKCk7CisgICAgICAgVUkgIT0gRTsgKSB7CisgICAgSW5zdHJ1Y3Rpb24gKlVzZXIgPSBjYXN0PEluc3RydWN0aW9uPigqVUkrKyk7CisgICAgUmV3cml0ZUhlYXBTUk9BTG9hZFVzZXIoVXNlciwgSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLCBQSElzVG9SZXdyaXRlKTsKKyAgfQorICAKKyAgaWYgKExvYWQtPnVzZV9lbXB0eSgpKSB7CisgICAgTG9hZC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLmVyYXNlKExvYWQpOworICB9Cit9CisKKy8vLyBQZXJmb3JtSGVhcEFsbG9jU1JvQSAtIENJIGlzIGFuIGFsbG9jYXRpb24gb2YgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcy4gIEJyZWFrCisvLy8gaXQgdXAgaW50byBtdWx0aXBsZSBhbGxvY2F0aW9ucyBvZiBhcnJheXMgb2YgdGhlIGZpZWxkcy4KK3N0YXRpYyBHbG9iYWxWYXJpYWJsZSAqUGVyZm9ybUhlYXBBbGxvY1NSb0EoR2xvYmFsVmFyaWFibGUgKkdWLCBDYWxsSW5zdCAqQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBORWxlbXMsIFRhcmdldERhdGEgKlREKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiU1JPQSBIRUFQIEFMTE9DOiAiIDw8ICpHViA8PCAiICBNQUxMT0MgPSAiIDw8ICpDSSA8PCAnXG4nKTsKKyAgY29uc3QgVHlwZSogTUFUID0gZ2V0TWFsbG9jQWxsb2NhdGVkVHlwZShDSSk7CisgIGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGNhc3Q8U3RydWN0VHlwZT4oTUFUKTsKKworICAvLyBUaGVyZSBpcyBndWFyYW50ZWVkIHRvIGJlIGF0IGxlYXN0IG9uZSB1c2Ugb2YgdGhlIG1hbGxvYyAoc3RvcmluZworICAvLyBpdCBpbnRvIEdWKS4gIElmIHRoZXJlIGFyZSBvdGhlciB1c2VzLCBjaGFuZ2UgdGhlbSB0byBiZSB1c2VzIG9mCisgIC8vIHRoZSBnbG9iYWwgdG8gc2ltcGxpZnkgbGF0ZXIgY29kZS4gIFRoaXMgYWxzbyBkZWxldGVzIHRoZSBzdG9yZQorICAvLyBpbnRvIEdWLgorICBSZXBsYWNlVXNlc09mTWFsbG9jV2l0aEdsb2JhbChDSSwgR1YpOworCisgIC8vIE9rYXksIGF0IHRoaXMgcG9pbnQsIHRoZXJlIGFyZSBubyB1c2VycyBvZiB0aGUgbWFsbG9jLiAgSW5zZXJ0IE4KKyAgLy8gbmV3IG1hbGxvY3MgYXQgdGhlIHNhbWUgcGxhY2UgYXMgQ0ksIGFuZCBOIGdsb2JhbHMuCisgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gRmllbGRHbG9iYWxzOworICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IEZpZWxkTWFsbG9jczsKKyAgCisgIGZvciAodW5zaWduZWQgRmllbGRObyA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IEZpZWxkTm8gIT0gZTsrK0ZpZWxkTm8peworICAgIGNvbnN0IFR5cGUgKkZpZWxkVHkgPSBTVHktPmdldEVsZW1lbnRUeXBlKEZpZWxkTm8pOworICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQRmllbGRUeSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoRmllbGRUeSk7CisgICAgCisgICAgR2xvYmFsVmFyaWFibGUgKk5HViA9CisgICAgICBuZXcgR2xvYmFsVmFyaWFibGUoKkdWLT5nZXRQYXJlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQRmllbGRUeSwgZmFsc2UsIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShQRmllbGRUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgR1YtPmdldE5hbWUoKSArICIuZiIgKyBUd2luZShGaWVsZE5vKSwgR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1YtPmlzVGhyZWFkTG9jYWwoKSk7CisgICAgRmllbGRHbG9iYWxzLnB1c2hfYmFjayhOR1YpOworICAgIAorICAgIHVuc2lnbmVkIFR5cGVTaXplID0gVEQtPmdldFR5cGVBbGxvY1NpemUoRmllbGRUeSk7CisgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oRmllbGRUeSkpCisgICAgICBUeXBlU2l6ZSA9IFRELT5nZXRTdHJ1Y3RMYXlvdXQoU1QpLT5nZXRTaXplSW5CeXRlcygpOworICAgIGNvbnN0IFR5cGUgKkludFB0clR5ID0gVEQtPmdldEludFB0clR5cGUoQ0ktPmdldENvbnRleHQoKSk7CisgICAgVmFsdWUgKk5NSSA9IENhbGxJbnN0OjpDcmVhdGVNYWxsb2MoQ0ksIEludFB0clR5LCBGaWVsZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSW50UHRyVHksIFR5cGVTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORWxlbXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ktPmdldE5hbWUoKSArICIuZiIgKyBUd2luZShGaWVsZE5vKSk7CisgICAgRmllbGRNYWxsb2NzLnB1c2hfYmFjayhOTUkpOworICAgIG5ldyBTdG9yZUluc3QoTk1JLCBOR1YsIENJKTsKKyAgfQorICAKKyAgLy8gVGhlIHRyaWNreSBhc3BlY3Qgb2YgdGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBoYW5kbGluZyB0aGUgY2FzZSB3aGVuIG1hbGxvYworICAvLyBmYWlscy4gIEluIHRoZSBvcmlnaW5hbCBjb2RlLCBtYWxsb2MgZmFpbGluZyB3b3VsZCBzZXQgdGhlIHJlc3VsdCBwb2ludGVyCisgIC8vIG9mIG1hbGxvYyB0byBudWxsLiAgSW4gdGhpcyBjYXNlLCBzb21lIG1hbGxvY3MgY291bGQgc3VjY2VlZCBhbmQgb3RoZXJzCisgIC8vIGNvdWxkIGZhaWwuICBBcyBzdWNoLCB3ZSBlbWl0IGNvZGUgdGhhdCBsb29rcyBsaWtlIHRoaXM6CisgIC8vICAgIEYwID0gbWFsbG9jKGZpZWxkMCkKKyAgLy8gICAgRjEgPSBtYWxsb2MoZmllbGQxKQorICAvLyAgICBGMiA9IG1hbGxvYyhmaWVsZDIpCisgIC8vICAgIGlmIChGMCA9PSAwIHx8IEYxID09IDAgfHwgRjIgPT0gMCkgeworICAvLyAgICAgIGlmIChGMCkgeyBmcmVlKEYwKTsgRjAgPSAwOyB9CisgIC8vICAgICAgaWYgKEYxKSB7IGZyZWUoRjEpOyBGMSA9IDA7IH0KKyAgLy8gICAgICBpZiAoRjIpIHsgZnJlZShGMik7IEYyID0gMDsgfQorICAvLyAgICB9CisgIC8vIFRoZSBtYWxsb2MgY2FuIGFsc28gZmFpbCBpZiBpdHMgYXJndW1lbnQgaXMgdG9vIGxhcmdlLgorICBDb25zdGFudCAqQ29uc3RhbnRaZXJvID0gQ29uc3RhbnRJbnQ6OmdldChDSS0+Z2V0QXJnT3BlcmFuZCgwKS0+Z2V0VHlwZSgpLCAwKTsKKyAgVmFsdWUgKlJ1bm5pbmdPciA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfU0xULCBDSS0+Z2V0QXJnT3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudFplcm8sICJpc25lZyIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRmllbGRNYWxsb2NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBWYWx1ZSAqQ29uZCA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIEZpZWxkTWFsbG9jc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShGaWVsZE1hbGxvY3NbaV0tPmdldFR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzbnVsbCIpOworICAgIFJ1bm5pbmdPciA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihSdW5uaW5nT3IsIENvbmQsICJ0bXAiLCBDSSk7CisgIH0KKworICAvLyBTcGxpdCB0aGUgYmFzaWMgYmxvY2sgYXQgdGhlIG9sZCBtYWxsb2MuCisgIEJhc2ljQmxvY2sgKk9yaWdCQiA9IENJLT5nZXRQYXJlbnQoKTsKKyAgQmFzaWNCbG9jayAqQ29udEJCID0gT3JpZ0JCLT5zcGxpdEJhc2ljQmxvY2soQ0ksICJtYWxsb2NfY29udCIpOworICAKKyAgLy8gQ3JlYXRlIHRoZSBibG9jayB0byBjaGVjayB0aGUgZmlyc3QgY29uZGl0aW9uLiAgUHV0IGFsbCB0aGVzZSBibG9ja3MgYXQgdGhlCisgIC8vIGVuZCBvZiB0aGUgZnVuY3Rpb24gYXMgdGhleSBhcmUgdW5saWtlbHkgdG8gYmUgZXhlY3V0ZWQuCisgIEJhc2ljQmxvY2sgKk51bGxQdHJCbG9jayA9IEJhc2ljQmxvY2s6OkNyZWF0ZShPcmlnQkItPmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWxsb2NfcmV0X251bGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZ0JCLT5nZXRQYXJlbnQoKSk7CisgIAorICAvLyBSZW1vdmUgdGhlIHVuY29uZCBicmFuY2ggZnJvbSBPcmlnQkIgdG8gQ29udEJCLCB0dXJuaW5nIGl0IGludG8gYSBjb25kCisgIC8vIGJyYW5jaCBvbiBSdW5uaW5nT3IuCisgIE9yaWdCQi0+Z2V0VGVybWluYXRvcigpLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgQnJhbmNoSW5zdDo6Q3JlYXRlKE51bGxQdHJCbG9jaywgQ29udEJCLCBSdW5uaW5nT3IsIE9yaWdCQik7CisgIAorICAvLyBXaXRoaW4gdGhlIE51bGxQdHJCbG9jaywgd2UgbmVlZCB0byBlbWl0IGEgY29tcGFyaXNvbiBhbmQgYnJhbmNoIGZvciBlYWNoCisgIC8vIHBvaW50ZXIsIGJlY2F1c2Ugc29tZSBtYXkgYmUgbnVsbCB3aGlsZSBvdGhlcnMgYXJlIG5vdC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZpZWxkR2xvYmFscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgVmFsdWUgKkdWVmFsID0gbmV3IExvYWRJbnN0KEZpZWxkR2xvYmFsc1tpXSwgInRtcCIsIE51bGxQdHJCbG9jayk7CisgICAgVmFsdWUgKkNtcCA9IG5ldyBJQ21wSW5zdCgqTnVsbFB0ckJsb2NrLCBJQ21wSW5zdDo6SUNNUF9ORSwgR1ZWYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShHVlZhbC0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAiKTsKKyAgICBCYXNpY0Jsb2NrICpGcmVlQmxvY2sgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoQ21wLT5nZXRDb250ZXh0KCksICJmcmVlX2l0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZ0JCLT5nZXRQYXJlbnQoKSk7CisgICAgQmFzaWNCbG9jayAqTmV4dEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKENtcC0+Z2V0Q29udGV4dCgpLCAibmV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdCQi0+Z2V0UGFyZW50KCkpOworICAgIEluc3RydWN0aW9uICpCSSA9IEJyYW5jaEluc3Q6OkNyZWF0ZShGcmVlQmxvY2ssIE5leHRCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wLCBOdWxsUHRyQmxvY2spOworCisgICAgLy8gRmlsbCBpbiBGcmVlQmxvY2suCisgICAgQ2FsbEluc3Q6OkNyZWF0ZUZyZWUoR1ZWYWwsIEJJKTsKKyAgICBuZXcgU3RvcmVJbnN0KENvbnN0YW50OjpnZXROdWxsVmFsdWUoR1ZWYWwtPmdldFR5cGUoKSksIEZpZWxkR2xvYmFsc1tpXSwKKyAgICAgICAgICAgICAgICAgIEZyZWVCbG9jayk7CisgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKE5leHRCbG9jaywgRnJlZUJsb2NrKTsKKyAgICAKKyAgICBOdWxsUHRyQmxvY2sgPSBOZXh0QmxvY2s7CisgIH0KKyAgCisgIEJyYW5jaEluc3Q6OkNyZWF0ZShDb250QkIsIE51bGxQdHJCbG9jayk7CisKKyAgLy8gQ0kgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgcmVtb3ZlIGl0LgorICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIEluc2VydGVkU2NhbGFyaXplZExvYWRzIC0gQXMgd2UgcHJvY2VzcyBsb2FkcywgaWYgd2UgY2FuJ3QgaW1tZWRpYXRlbHkKKyAgLy8vIHVwZGF0ZSBhbGwgdXNlcyBvZiB0aGUgbG9hZCwga2VlcCB0cmFjayBvZiB3aGF0IHNjYWxhcml6ZWQgbG9hZHMgYXJlCisgIC8vLyBpbnNlcnRlZCBmb3IgYSBnaXZlbiBsb2FkLgorICBEZW5zZU1hcDxWYWx1ZSosIHN0ZDo6dmVjdG9yPFZhbHVlKj4gPiBJbnNlcnRlZFNjYWxhcml6ZWRWYWx1ZXM7CisgIEluc2VydGVkU2NhbGFyaXplZFZhbHVlc1tHVl0gPSBGaWVsZEdsb2JhbHM7CisgIAorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UEhJTm9kZSosIHVuc2lnbmVkPiA+IFBISXNUb1Jld3JpdGU7CisgIAorICAvLyBPa2F5LCB0aGUgbWFsbG9jIHNpdGUgaXMgY29tcGxldGVseSBoYW5kbGVkLiAgQWxsIG9mIHRoZSB1c2VzIG9mIEdWIGFyZSBub3cKKyAgLy8gbG9hZHMsIGFuZCBhbGwgdXNlcyBvZiB0aG9zZSBsb2FkcyBhcmUgc2ltcGxlLiAgUmV3cml0ZSB0aGVtIHRvIHVzZSBsb2FkcworICAvLyBvZiB0aGUgcGVyLWZpZWxkIGdsb2JhbHMgaW5zdGVhZC4KKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gR1YtPnVzZV9iZWdpbigpLCBFID0gR1YtPnVzZV9lbmQoKTsgVUkgIT0gRTspIHsKKyAgICBJbnN0cnVjdGlvbiAqVXNlciA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSsrKTsKKyAgICAKKyAgICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFVzZXIpKSB7CisgICAgICBSZXdyaXRlVXNlc09mTG9hZEZvckhlYXBTUm9BKExJLCBJbnNlcnRlZFNjYWxhcml6ZWRWYWx1ZXMsIFBISXNUb1Jld3JpdGUpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8vIE11c3QgYmUgYSBzdG9yZSBvZiBudWxsLgorICAgIFN0b3JlSW5zdCAqU0kgPSBjYXN0PFN0b3JlSW5zdD4oVXNlcik7CisgICAgYXNzZXJ0KGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihTSS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQgaGVhcC1zcmEgdXNlciEiKTsKKyAgICAKKyAgICAvLyBJbnNlcnQgYSBzdG9yZSBvZiBudWxsIGludG8gZWFjaCBnbG9iYWwuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZpZWxkR2xvYmFscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBjYXN0PFBvaW50ZXJUeXBlPihGaWVsZEdsb2JhbHNbaV0tPmdldFR5cGUoKSk7CisgICAgICBDb25zdGFudCAqTnVsbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoUFQtPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgbmV3IFN0b3JlSW5zdChOdWxsLCBGaWVsZEdsb2JhbHNbaV0sIFNJKTsKKyAgICB9CisgICAgLy8gRXJhc2UgdGhlIG9yaWdpbmFsIHN0b3JlLgorICAgIFNJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorCisgIC8vIFdoaWxlIHdlIGhhdmUgUEhJcyB0aGF0IGFyZSBpbnRlcmVzdGluZyB0byByZXdyaXRlLCBkbyBpdC4KKyAgd2hpbGUgKCFQSElzVG9SZXdyaXRlLmVtcHR5KCkpIHsKKyAgICBQSElOb2RlICpQTiA9IFBISXNUb1Jld3JpdGUuYmFjaygpLmZpcnN0OworICAgIHVuc2lnbmVkIEZpZWxkTm8gPSBQSElzVG9SZXdyaXRlLmJhY2soKS5zZWNvbmQ7CisgICAgUEhJc1RvUmV3cml0ZS5wb3BfYmFjaygpOworICAgIFBISU5vZGUgKkZpZWxkUE4gPSBjYXN0PFBISU5vZGU+KEluc2VydGVkU2NhbGFyaXplZFZhbHVlc1tQTl1bRmllbGROb10pOworICAgIGFzc2VydChGaWVsZFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpID09IDAgJiYiQWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBwaGkiKTsKKworICAgIC8vIEFkZCBhbGwgdGhlIGluY29taW5nIHZhbHVlcy4gIFRoaXMgY2FuIG1hdGVyaWFsaXplIG1vcmUgcGhpcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBWYWx1ZSAqSW5WYWwgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKTsKKyAgICAgIEluVmFsID0gR2V0SGVhcFNST0FWYWx1ZShJblZhbCwgRmllbGRObywgSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBISXNUb1Jld3JpdGUpOworICAgICAgRmllbGRQTi0+YWRkSW5jb21pbmcoSW5WYWwsIFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIERyb3AgYWxsIGludGVyLXBoaSBsaW5rcyBhbmQgYW55IGxvYWRzIHRoYXQgbWFkZSBpdCB0aGlzIGZhci4KKyAgZm9yIChEZW5zZU1hcDxWYWx1ZSosIHN0ZDo6dmVjdG9yPFZhbHVlKj4gPjo6aXRlcmF0b3IKKyAgICAgICBJID0gSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLmJlZ2luKCksIEUgPSBJbnNlcnRlZFNjYWxhcml6ZWRWYWx1ZXMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJLT5maXJzdCkpCisgICAgICBQTi0+ZHJvcEFsbFJlZmVyZW5jZXMoKTsKKyAgICBlbHNlIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSS0+Zmlyc3QpKQorICAgICAgTEktPmRyb3BBbGxSZWZlcmVuY2VzKCk7CisgIH0KKyAgCisgIC8vIERlbGV0ZSBhbGwgdGhlIHBoaXMgYW5kIGxvYWRzIG5vdyB0aGF0IGludGVyLXJlZmVyZW5jZXMgYXJlIGRlYWQuCisgIGZvciAoRGVuc2VNYXA8VmFsdWUqLCBzdGQ6OnZlY3RvcjxWYWx1ZSo+ID46Oml0ZXJhdG9yCisgICAgICAgSSA9IEluc2VydGVkU2NhbGFyaXplZFZhbHVlcy5iZWdpbigpLCBFID0gSW5zZXJ0ZWRTY2FsYXJpemVkVmFsdWVzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSS0+Zmlyc3QpKQorICAgICAgUE4tPmVyYXNlRnJvbVBhcmVudCgpOworICAgIGVsc2UgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihJLT5maXJzdCkpCisgICAgICBMSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KKyAgCisgIC8vIFRoZSBvbGQgZ2xvYmFsIGlzIG5vdyBkZWFkLCByZW1vdmUgaXQuCisgIEdWLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICArK051bUhlYXBTUkE7CisgIHJldHVybiBjYXN0PEdsb2JhbFZhcmlhYmxlPihGaWVsZEdsb2JhbHNbMF0pOworfQorCisvLy8gVHJ5VG9PcHRpbWl6ZVN0b3JlT2ZNYWxsb2NUb0dsb2JhbCAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2Ugc2VlIGEKKy8vLyBwb2ludGVyIGdsb2JhbCB2YXJpYWJsZSB3aXRoIGEgc2luZ2xlIHZhbHVlIHN0b3JlZCBpdCB0aGF0IGlzIGEgbWFsbG9jIG9yCisvLy8gY2FzdCBvZiBtYWxsb2MuCitzdGF0aWMgYm9vbCBUcnlUb09wdGltaXplU3RvcmVPZk1hbGxvY1RvR2xvYmFsKEdsb2JhbFZhcmlhYmxlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEluc3QgKkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpBbGxvY1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6Omdsb2JhbF9pdGVyYXRvciAmR1ZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXREYXRhICpURCkgeworICBpZiAoIVREKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIElmIHRoaXMgaXMgYSBtYWxsb2Mgb2YgYW4gYWJzdHJhY3QgdHlwZSwgZG9uJ3QgdG91Y2ggaXQuCisgIGlmICghQWxsb2NUeS0+aXNTaXplZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBXZSBjYW4ndCBvcHRpbWl6ZSB0aGlzIGdsb2JhbCB1bmxlc3MgYWxsIHVzZXMgb2YgaXQgYXJlICprbm93biogdG8gYmUKKyAgLy8gb2YgdGhlIG1hbGxvYyB2YWx1ZSwgbm90IG9mIHRoZSBudWxsIGluaXRpYWxpemVyIHZhbHVlIChjb25zaWRlciBhIHVzZQorICAvLyB0aGF0IGNvbXBhcmVzIHRoZSBnbG9iYWwncyB2YWx1ZSBhZ2FpbnN0IHplcm8gdG8gc2VlIGlmIHRoZSBtYWxsb2MgaGFzCisgIC8vIGJlZW4gcmVhY2hlZCkuICBUbyBkbyB0aGlzLCB3ZSBjaGVjayB0byBzZWUgaWYgYWxsIHVzZXMgb2YgdGhlIGdsb2JhbAorICAvLyB3b3VsZCB0cmFwIGlmIHRoZSBnbG9iYWwgd2VyZSBudWxsOiB0aGlzIHByb3ZlcyB0aGF0IHRoZXkgbXVzdCBhbGwKKyAgLy8gaGFwcGVuIGFmdGVyIHRoZSBtYWxsb2MuCisgIGlmICghQWxsVXNlc09mTG9hZGVkVmFsdWVXaWxsVHJhcElmTnVsbChHVikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFdlIGNhbid0IG9wdGltaXplIHRoaXMgaWYgdGhlIG1hbGxvYyBpdHNlbGYgaXMgdXNlZCBpbiBhIGNvbXBsZXggd2F5LAorICAvLyBmb3IgZXhhbXBsZSwgYmVpbmcgc3RvcmVkIGludG8gbXVsdGlwbGUgZ2xvYmFscy4gIFRoaXMgYWxsb3dzIHRoZQorICAvLyBtYWxsb2MgdG8gYmUgc3RvcmVkIGludG8gdGhlIHNwZWNpZmllZCBnbG9iYWwsIGxvYWRlZCBzZXRjYydkLCBhbmQKKyAgLy8gR0VQJ2QuICBUaGVzZSBhcmUgYWxsIHRoaW5ncyB3ZSBjb3VsZCB0cmFuc2Zvcm0gdG8gdXNpbmcgdGhlIGdsb2JhbAorICAvLyBmb3IuCisgIFNtYWxsUHRyU2V0PGNvbnN0IFBISU5vZGUqLCA4PiBQSElzOworICBpZiAoIVZhbHVlSXNPbmx5VXNlZExvY2FsbHlPclN0b3JlZFRvT25lR2xvYmFsKENJLCBHViwgUEhJcykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHdlIGhhdmUgYSBnbG9iYWwgdGhhdCBpcyBvbmx5IGluaXRpYWxpemVkIHdpdGggYSBmaXhlZCBzaXplIG1hbGxvYywKKyAgLy8gdHJhbnNmb3JtIHRoZSBwcm9ncmFtIHRvIHVzZSBnbG9iYWwgbWVtb3J5IGluc3RlYWQgb2YgbWFsbG9jJ2QgbWVtb3J5LgorICAvLyBUaGlzIGVsaW1pbmF0ZXMgZHluYW1pYyBhbGxvY2F0aW9uLCBhdm9pZHMgYW4gaW5kaXJlY3Rpb24gYWNjZXNzaW5nIHRoZQorICAvLyBkYXRhLCBhbmQgZXhwb3NlcyB0aGUgcmVzdWx0YW50IGdsb2JhbCB0byBmdXJ0aGVyIEdsb2JhbE9wdC4KKyAgLy8gV2UgY2Fubm90IG9wdGltaXplIHRoZSBtYWxsb2MgaWYgd2UgY2Fubm90IGRldGVybWluZSBtYWxsb2MgYXJyYXkgc2l6ZS4KKyAgVmFsdWUgKk5FbGVtcyA9IGdldE1hbGxvY0FycmF5U2l6ZShDSSwgVEQsIHRydWUpOworICBpZiAoIU5FbGVtcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKENvbnN0YW50SW50ICpORWxlbWVudHMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oTkVsZW1zKSkKKyAgICAvLyBSZXN0cmljdCB0aGlzIHRyYW5zZm9ybWF0aW9uIHRvIG9ubHkgd29ya2luZyBvbiBzbWFsbCBhbGxvY2F0aW9ucworICAgIC8vICgyMDQ4IGJ5dGVzIGN1cnJlbnRseSksIGFzIHdlIGRvbid0IHdhbnQgdG8gaW50cm9kdWNlIGEgMTZNIGdsb2JhbCBvcgorICAgIC8vIHNvbWV0aGluZy4KKyAgICBpZiAoTkVsZW1lbnRzLT5nZXRaRXh0VmFsdWUoKSAqIFRELT5nZXRUeXBlQWxsb2NTaXplKEFsbG9jVHkpIDwgMjA0OCkgeworICAgICAgR1ZJID0gT3B0aW1pemVHbG9iYWxBZGRyZXNzT2ZNYWxsb2MoR1YsIENJLCBBbGxvY1R5LCBORWxlbWVudHMsIFREKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgCisgIC8vIElmIHRoZSBhbGxvY2F0aW9uIGlzIGFuIGFycmF5IG9mIHN0cnVjdHVyZXMsIGNvbnNpZGVyIHRyYW5zZm9ybWluZyB0aGlzCisgIC8vIGludG8gbXVsdGlwbGUgbWFsbG9jJ2QgYXJyYXlzLCBvbmUgZm9yIGVhY2ggZmllbGQuICBUaGlzIGlzIGJhc2ljYWxseQorICAvLyBTUm9BIGZvciBtYWxsb2MnZCBtZW1vcnkuCisKKyAgLy8gSWYgdGhpcyBpcyBhbiBhbGxvY2F0aW9uIG9mIGEgZml4ZWQgc2l6ZSBhcnJheSBvZiBzdHJ1Y3RzLCBhbmFseXplIGFzIGEKKyAgLy8gdmFyaWFibGUgc2l6ZSBhcnJheS4gIG1hbGxvYyBbMTAwIHggc3RydWN0XSwxIC0+IG1hbGxvYyBzdHJ1Y3QsIDEwMAorICBpZiAoTkVsZW1zID09IENvbnN0YW50SW50OjpnZXQoQ0ktPmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKSwgMSkpCisgICAgaWYgKGNvbnN0IEFycmF5VHlwZSAqQVQgPSBkeW5fY2FzdDxBcnJheVR5cGU+KEFsbG9jVHkpKQorICAgICAgQWxsb2NUeSA9IEFULT5nZXRFbGVtZW50VHlwZSgpOworCisgIGNvbnN0IFN0cnVjdFR5cGUgKkFsbG9jU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oQWxsb2NUeSk7CisgIGlmICghQWxsb2NTVHkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFRoaXMgdGhlIHN0cnVjdHVyZSBoYXMgYW4gdW5yZWFzb25hYmxlIG51bWJlciBvZiBmaWVsZHMsIGxlYXZlIGl0CisgIC8vIGFsb25lLgorICBpZiAoQWxsb2NTVHktPmdldE51bUVsZW1lbnRzKCkgPD0gMTYgJiYgQWxsb2NTVHktPmdldE51bUVsZW1lbnRzKCkgIT0gMCAmJgorICAgICAgQWxsR2xvYmFsTG9hZFVzZXNTaW1wbGVFbm91Z2hGb3JIZWFwU1JBKEdWLCBDSSkpIHsKKworICAgIC8vIElmIHRoaXMgaXMgYSBmaXhlZCBzaXplIGFycmF5LCB0cmFuc2Zvcm0gdGhlIE1hbGxvYyB0byBiZSBhbiBhbGxvYyBvZgorICAgIC8vIHN0cnVjdHMuICBtYWxsb2MgWzEwMCB4IHN0cnVjdF0sMSAtPiBtYWxsb2Mgc3RydWN0LCAxMDAKKyAgICBpZiAoY29uc3QgQXJyYXlUeXBlICpBVCA9IGR5bl9jYXN0PEFycmF5VHlwZT4oZ2V0TWFsbG9jQWxsb2NhdGVkVHlwZShDSSkpKSB7CisgICAgICBjb25zdCBUeXBlICpJbnRQdHJUeSA9IFRELT5nZXRJbnRQdHJUeXBlKENJLT5nZXRDb250ZXh0KCkpOworICAgICAgdW5zaWduZWQgVHlwZVNpemUgPSBURC0+Z2V0U3RydWN0TGF5b3V0KEFsbG9jU1R5KS0+Z2V0U2l6ZUluQnl0ZXMoKTsKKyAgICAgIFZhbHVlICpBbGxvY1NpemUgPSBDb25zdGFudEludDo6Z2V0KEludFB0clR5LCBUeXBlU2l6ZSk7CisgICAgICBWYWx1ZSAqTnVtRWxlbWVudHMgPSBDb25zdGFudEludDo6Z2V0KEludFB0clR5LCBBVC0+Z2V0TnVtRWxlbWVudHMoKSk7CisgICAgICBJbnN0cnVjdGlvbiAqTWFsbG9jID0gQ2FsbEluc3Q6OkNyZWF0ZU1hbGxvYyhDSSwgSW50UHRyVHksIEFsbG9jU1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplLCBOdW1FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIENJLT5nZXROYW1lKCkpOworICAgICAgSW5zdHJ1Y3Rpb24gKkNhc3QgPSBuZXcgQml0Q2FzdEluc3QoTWFsbG9jLCBDSS0+Z2V0VHlwZSgpLCAidG1wIiwgQ0kpOworICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChDYXN0KTsKKyAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIENJID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KE1hbGxvYykgPworICAgICAgICBleHRyYWN0TWFsbG9jQ2FsbEZyb21CaXRDYXN0KE1hbGxvYykgOiBjYXN0PENhbGxJbnN0PihNYWxsb2MpOworICAgIH0KKyAgICAgIAorICAgIEdWSSA9IFBlcmZvcm1IZWFwQWxsb2NTUm9BKEdWLCBDSSwgZ2V0TWFsbG9jQXJyYXlTaXplKENJLCBURCwgdHJ1ZSksVEQpOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICByZXR1cm4gZmFsc2U7Cit9ICAKKworLy8gT3B0aW1pemVPbmNlU3RvcmVkR2xvYmFsIC0gVHJ5IHRvIG9wdGltaXplIGdsb2JhbHMgYmFzZWQgb24gdGhlIGtub3dsZWRnZQorLy8gdGhhdCBvbmx5IG9uZSB2YWx1ZSAoYmVzaWRlcyBpdHMgaW5pdGlhbGl6ZXIpIGlzIGV2ZXIgc3RvcmVkIHRvIHRoZSBnbG9iYWwuCitzdGF0aWMgYm9vbCBPcHRpbWl6ZU9uY2VTdG9yZWRHbG9iYWwoR2xvYmFsVmFyaWFibGUgKkdWLCBWYWx1ZSAqU3RvcmVkT25jZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6Omdsb2JhbF9pdGVyYXRvciAmR1ZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldERhdGEgKlREKSB7CisgIC8vIElnbm9yZSBuby1vcCBHRVBzIGFuZCBiaXRjYXN0cy4KKyAgU3RvcmVkT25jZVZhbCA9IFN0b3JlZE9uY2VWYWwtPnN0cmlwUG9pbnRlckNhc3RzKCk7CisKKyAgLy8gSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBvaW50ZXIgZ2xvYmFsIHRoYXQgaXMgaW5pdGlhbGl6ZWQgdG8gbnVsbCBhbmQKKyAgLy8gb25seSBoYXMgb25lIChub24tbnVsbCkgdmFsdWUgc3RvcmVkIGludG8gaXQsIHRoZW4gd2UgY2FuIG9wdGltaXplIGFueQorICAvLyB1c2VycyBvZiB0aGUgbG9hZGVkIHZhbHVlIChvZnRlbiBjYWxscyBhbmQgbG9hZHMpIHRoYXQgd291bGQgdHJhcCBpZiB0aGUKKyAgLy8gdmFsdWUgd2FzIG51bGwuCisgIGlmIChHVi0+Z2V0SW5pdGlhbGl6ZXIoKS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICYmCisgICAgICBHVi0+Z2V0SW5pdGlhbGl6ZXIoKS0+aXNOdWxsVmFsdWUoKSkgeworICAgIGlmIChDb25zdGFudCAqU09WQyA9IGR5bl9jYXN0PENvbnN0YW50PihTdG9yZWRPbmNlVmFsKSkgeworICAgICAgaWYgKEdWLT5nZXRJbml0aWFsaXplcigpLT5nZXRUeXBlKCkgIT0gU09WQy0+Z2V0VHlwZSgpKQorICAgICAgICBTT1ZDID0gCisgICAgICAgICBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoU09WQywgR1YtPmdldEluaXRpYWxpemVyKCktPmdldFR5cGUoKSk7CisKKyAgICAgIC8vIE9wdGltaXplIGF3YXkgYW55IHRyYXBwaW5nIHVzZXMgb2YgdGhlIGxvYWRlZCB2YWx1ZS4KKyAgICAgIGlmIChPcHRpbWl6ZUF3YXlUcmFwcGluZ1VzZXNPZkxvYWRzKEdWLCBTT1ZDKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChDYWxsSW5zdCAqQ0kgPSBleHRyYWN0TWFsbG9jQ2FsbChTdG9yZWRPbmNlVmFsKSkgeworICAgICAgY29uc3QgVHlwZSogTWFsbG9jVHlwZSA9IGdldE1hbGxvY0FsbG9jYXRlZFR5cGUoQ0kpOworICAgICAgaWYgKE1hbGxvY1R5cGUgJiYgVHJ5VG9PcHRpbWl6ZVN0b3JlT2ZNYWxsb2NUb0dsb2JhbChHViwgQ0ksIE1hbGxvY1R5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVkksIFREKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gVHJ5VG9TaHJpbmtHbG9iYWxUb0Jvb2xlYW4gLSBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGxlYXJuZWQgdGhhdCB0aGUgb25seQorLy8vIHR3byB2YWx1ZXMgZXZlciBzdG9yZWQgaW50byBHViBhcmUgaXRzIGluaXRpYWxpemVyIGFuZCBPdGhlclZhbC4gIFNlZSBpZiB3ZQorLy8vIGNhbiBzaHJpbmsgdGhlIGdsb2JhbCBpbnRvIGEgYm9vbGVhbiBhbmQgc2VsZWN0IGJldHdlZW4gdGhlIHR3byB2YWx1ZXMKKy8vLyB3aGVuZXZlciBpdCBpcyB1c2VkLiAgVGhpcyBleHBvc2VzIHRoZSB2YWx1ZXMgdG8gb3RoZXIgc2NhbGFyIG9wdGltaXphdGlvbnMuCitzdGF0aWMgYm9vbCBUcnlUb1Nocmlua0dsb2JhbFRvQm9vbGVhbihHbG9iYWxWYXJpYWJsZSAqR1YsIENvbnN0YW50ICpPdGhlclZhbCkgeworICBjb25zdCBUeXBlICpHVkVsVHlwZSA9IEdWLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCk7CisgIAorICAvLyBJZiBHVkVsVHlwZSBpcyBhbHJlYWR5IGkxLCBpdCBpcyBhbHJlYWR5IHNocnVuay4gIElmIHRoZSB0eXBlIG9mIHRoZSBHViBpcworICAvLyBhbiBGUCB2YWx1ZSwgcG9pbnRlciBvciB2ZWN0b3IsIGRvbid0IGRvIHRoaXMgb3B0aW1pemF0aW9uIGJlY2F1c2UgYSBzZWxlY3QKKyAgLy8gYmV0d2VlbiB0aGVtIGlzIHZlcnkgZXhwZW5zaXZlIGFuZCB1bmxpa2VseSB0byBsZWFkIHRvIGxhdGVyCisgIC8vIHNpbXBsaWZpY2F0aW9uLiAgSW4gdGhlc2UgY2FzZXMsIHdlIHR5cGljYWxseSBlbmQgdXAgd2l0aCAiY29uZCA/IHYxIDogdjIiCisgIC8vIHdoZXJlIHYxIGFuZCB2MiBib3RoIHJlcXVpcmUgY29uc3RhbnQgcG9vbCBsb2FkcywgYSBiaWcgbG9zcy4KKyAgaWYgKEdWRWxUeXBlID09IFR5cGU6OmdldEludDFUeShHVi0+Z2V0Q29udGV4dCgpKSB8fAorICAgICAgR1ZFbFR5cGUtPmlzRmxvYXRpbmdQb2ludFR5KCkgfHwKKyAgICAgIEdWRWxUeXBlLT5pc1BvaW50ZXJUeSgpIHx8IEdWRWxUeXBlLT5pc1ZlY3RvclR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFdhbGsgdGhlIHVzZSBsaXN0IG9mIHRoZSBnbG9iYWwgc2VlaW5nIGlmIGFsbCB0aGUgdXNlcyBhcmUgbG9hZCBvciBzdG9yZS4KKyAgLy8gSWYgdGhlcmUgaXMgYW55dGhpbmcgZWxzZSwgYmFpbCBvdXQuCisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBJID0gR1YtPnVzZV9iZWdpbigpLCBFID0gR1YtPnVzZV9lbmQoKTsgSSAhPSBFOyArK0kpeworICAgIFVzZXIgKlUgPSAqSTsKKyAgICBpZiAoIWlzYTxMb2FkSW5zdD4oVSkgJiYgIWlzYTxTdG9yZUluc3Q+KFUpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgREVCVUcoZGJncygpIDw8ICIgICAqKiogU0hSSU5LSU5HIFRPIEJPT0w6ICIgPDwgKkdWKTsKKyAgCisgIC8vIENyZWF0ZSB0aGUgbmV3IGdsb2JhbCwgaW5pdGlhbGl6aW5nIGl0IHRvIGZhbHNlLgorICBHbG9iYWxWYXJpYWJsZSAqTmV3R1YgPSBuZXcgR2xvYmFsVmFyaWFibGUoVHlwZTo6Z2V0SW50MVR5KEdWLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0RmFsc2UoR1YtPmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVi0+Z2V0TmFtZSgpKyIuYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVi0+aXNUaHJlYWRMb2NhbCgpKTsKKyAgR1YtPmdldFBhcmVudCgpLT5nZXRHbG9iYWxMaXN0KCkuaW5zZXJ0KEdWLCBOZXdHVik7CisKKyAgQ29uc3RhbnQgKkluaXRWYWwgPSBHVi0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgYXNzZXJ0KEluaXRWYWwtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRJbnQxVHkoR1YtPmdldENvbnRleHQoKSkgJiYKKyAgICAgICAgICJObyByZWFzb24gdG8gc2hyaW5rIHRvIGJvb2whIik7CisKKyAgLy8gSWYgaW5pdGlhbGl6ZWQgdG8gemVybyBhbmQgc3RvcmluZyBvbmUgaW50byB0aGUgZ2xvYmFsLCB3ZSBjYW4gdXNlIGEgY2FzdAorICAvLyBpbnN0ZWFkIG9mIGEgc2VsZWN0IHRvIHN5bnRoZXNpemUgdGhlIGRlc2lyZWQgdmFsdWUuCisgIGJvb2wgSXNPbmVaZXJvID0gZmFsc2U7CisgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3RoZXJWYWwpKQorICAgIElzT25lWmVybyA9IEluaXRWYWwtPmlzTnVsbFZhbHVlKCkgJiYgQ0ktPmlzT25lKCk7CisKKyAgd2hpbGUgKCFHVi0+dXNlX2VtcHR5KCkpIHsKKyAgICBJbnN0cnVjdGlvbiAqVUkgPSBjYXN0PEluc3RydWN0aW9uPihHVi0+dXNlX2JhY2soKSk7CisgICAgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFVJKSkgeworICAgICAgLy8gQ2hhbmdlIHRoZSBzdG9yZSBpbnRvIGEgYm9vbGVhbiBzdG9yZS4KKyAgICAgIGJvb2wgU3RvcmluZ090aGVyID0gU0ktPmdldE9wZXJhbmQoMCkgPT0gT3RoZXJWYWw7CisgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgd2Ugd2VyZW4ndCBzdG9yaW5nIGEgbG9hZGVkIHZhbHVlLgorICAgICAgVmFsdWUgKlN0b3JlVmFsOworICAgICAgaWYgKFN0b3JpbmdPdGhlciB8fCBTSS0+Z2V0T3BlcmFuZCgwKSA9PSBJbml0VmFsKQorICAgICAgICBTdG9yZVZhbCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KEdWLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmluZ090aGVyKTsKKyAgICAgIGVsc2UgeworICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGFyZSBzdG9yaW5nIGEgcHJldmlvdXNseSBsb2FkZWQgY29weS4gIFRvIGRvIHRoaXMsCisgICAgICAgIC8vIGNoYW5nZSB0aGUgY29weSBmcm9tIGNvcHlpbmcgdGhlIG9yaWdpbmFsIHZhbHVlIHRvIGp1c3QgY29weWluZyB0aGUKKyAgICAgICAgLy8gYm9vbC4KKyAgICAgICAgSW5zdHJ1Y3Rpb24gKlN0b3JlZFZhbCA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KFNJLT5nZXRPcGVyYW5kKDApKTsKKworICAgICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHJlcGxhY2VkIHRoZSBpbnB1dCwgU3RvcmVkVmFsIHdpbGwgYmUgYSBjYXN0IG9yCisgICAgICAgIC8vIHNlbGVjdCBpbnN0cnVjdGlvbi4gIElmIG5vdCwgaXQgd2lsbCBiZSBhIGxvYWQgb2YgdGhlIG9yaWdpbmFsCisgICAgICAgIC8vIGdsb2JhbC4KKyAgICAgICAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihTdG9yZWRWYWwpKSB7CisgICAgICAgICAgYXNzZXJ0KExJLT5nZXRPcGVyYW5kKDApID09IEdWICYmICJOb3QgYSBjb3B5ISIpOworICAgICAgICAgIC8vIEluc2VydCBhIG5ldyBsb2FkLCB0byBwcmVzZXJ2ZSB0aGUgc2F2ZWQgdmFsdWUuCisgICAgICAgICAgU3RvcmVWYWwgPSBuZXcgTG9hZEluc3QoTmV3R1YsIExJLT5nZXROYW1lKCkrIi5iIiwgTEkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFzc2VydCgoaXNhPENhc3RJbnN0PihTdG9yZWRWYWwpIHx8IGlzYTxTZWxlY3RJbnN0PihTdG9yZWRWYWwpKSAmJgorICAgICAgICAgICAgICAgICAiVGhpcyBpcyBub3QgYSBmb3JtIHRoYXQgd2UgdW5kZXJzdGFuZCEiKTsKKyAgICAgICAgICBTdG9yZVZhbCA9IFN0b3JlZFZhbC0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgICBhc3NlcnQoaXNhPExvYWRJbnN0PihTdG9yZVZhbCkgJiYgIk5vdCBhIGxvYWQgb2YgTmV3R1YhIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG5ldyBTdG9yZUluc3QoU3RvcmVWYWwsIE5ld0dWLCBTSSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENoYW5nZSB0aGUgbG9hZCBpbnRvIGEgbG9hZCBvZiBib29sIHRoZW4gYSBzZWxlY3QuCisgICAgICBMb2FkSW5zdCAqTEkgPSBjYXN0PExvYWRJbnN0PihVSSk7CisgICAgICBMb2FkSW5zdCAqTkxJID0gbmV3IExvYWRJbnN0KE5ld0dWLCBMSS0+Z2V0TmFtZSgpKyIuYiIsIExJKTsKKyAgICAgIFZhbHVlICpOU0k7CisgICAgICBpZiAoSXNPbmVaZXJvKQorICAgICAgICBOU0kgPSBuZXcgWkV4dEluc3QoTkxJLCBMSS0+Z2V0VHlwZSgpLCAiIiwgTEkpOworICAgICAgZWxzZQorICAgICAgICBOU0kgPSBTZWxlY3RJbnN0OjpDcmVhdGUoTkxJLCBPdGhlclZhbCwgSW5pdFZhbCwgIiIsIExJKTsKKyAgICAgIE5TSS0+dGFrZU5hbWUoTEkpOworICAgICAgTEktPnJlcGxhY2VBbGxVc2VzV2l0aChOU0kpOworICAgIH0KKyAgICBVSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KKworICBHVi0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIHJldHVybiB0cnVlOworfQorCisKKy8vLyBQcm9jZXNzSW50ZXJuYWxHbG9iYWwgLSBBbmFseXplIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhcmlhYmxlIGFuZCBvcHRpbWl6ZQorLy8vIGl0IGlmIHBvc3NpYmxlLiAgSWYgd2UgbWFrZSBhIGNoYW5nZSwgcmV0dXJuIHRydWUuCitib29sIEdsb2JhbE9wdDo6UHJvY2Vzc0ludGVybmFsR2xvYmFsKEdsb2JhbFZhcmlhYmxlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgJkdWSSkgeworICBTbWFsbFB0clNldDxjb25zdCBQSElOb2RlKiwgMTY+IFBISVVzZXJzOworICBHbG9iYWxTdGF0dXMgR1M7CisgIEdWLT5yZW1vdmVEZWFkQ29uc3RhbnRVc2VycygpOworCisgIGlmIChHVi0+dXNlX2VtcHR5KCkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkdMT0JBTCBERUFEOiAiIDw8ICpHVik7CisgICAgR1YtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICsrTnVtRGVsZXRlZDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmICghQW5hbHl6ZUdsb2JhbChHViwgR1MsIFBISVVzZXJzKSkgeworI2lmIDAKKyAgICBERUJVRyhkYmdzKCkgPDwgIkdsb2JhbDogIiA8PCAqR1YpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBpc0xvYWRlZCA9ICIgPDwgR1MuaXNMb2FkZWQgPDwgIlxuIik7CisgICAgREVCVUcoZGJncygpIDw8ICIgIFN0b3JlZFR5cGUgPSAiKTsKKyAgICBzd2l0Y2ggKEdTLlN0b3JlZFR5cGUpIHsKKyAgICBjYXNlIEdsb2JhbFN0YXR1czo6Tm90U3RvcmVkOiBERUJVRyhkYmdzKCkgPDwgIk5FVkVSIFNUT1JFRFxuIik7IGJyZWFrOworICAgIGNhc2UgR2xvYmFsU3RhdHVzOjppc0luaXRpYWxpemVyU3RvcmVkOiBERUJVRyhkYmdzKCkgPDwgIklOSVQgU1RPUkVEXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHbG9iYWxTdGF0dXM6OmlzU3RvcmVkT25jZTogREVCVUcoZGJncygpIDw8ICJTVE9SRUQgT05DRVxuIik7IGJyZWFrOworICAgIGNhc2UgR2xvYmFsU3RhdHVzOjppc1N0b3JlZDogREVCVUcoZGJncygpIDw8ICJzdG9yZWRcbiIpOyBicmVhazsKKyAgICB9CisgICAgaWYgKEdTLlN0b3JlZFR5cGUgPT0gR2xvYmFsU3RhdHVzOjppc1N0b3JlZE9uY2UgJiYgR1MuU3RvcmVkT25jZVZhbHVlKQorICAgICAgREVCVUcoZGJncygpIDw8ICIgIFN0b3JlZE9uY2VWYWx1ZSA9ICIgPDwgKkdTLlN0b3JlZE9uY2VWYWx1ZSA8PCAiXG4iKTsKKyAgICBpZiAoR1MuQWNjZXNzaW5nRnVuY3Rpb24gJiYgIUdTLkhhc011bHRpcGxlQWNjZXNzaW5nRnVuY3Rpb25zKQorICAgICAgREVCVUcoZGJncygpIDw8ICIgIEFjY2Vzc2luZ0Z1bmN0aW9uID0gIgorICAgICAgICAgICAgICAgICAgIDw8IEdTLkFjY2Vzc2luZ0Z1bmN0aW9uLT5nZXROYW1lKCkgPDwgIlxuIik7CisgICAgREVCVUcoZGJncygpIDw8ICIgIEhhc011bHRpcGxlQWNjZXNzaW5nRnVuY3Rpb25zID0gICIKKyAgICAgICAgICAgICAgICAgPDwgR1MuSGFzTXVsdGlwbGVBY2Nlc3NpbmdGdW5jdGlvbnMgPDwgIlxuIik7CisgICAgREVCVUcoZGJncygpIDw8ICIgIEhhc05vbkluc3RydWN0aW9uVXNlciA9ICIgCisgICAgICAgICAgICAgICAgIDw8IEdTLkhhc05vbkluc3RydWN0aW9uVXNlcjw8IlxuIik7CisgICAgREVCVUcoZGJncygpIDw8ICJcbiIpOworI2VuZGlmCisgICAgCisgICAgLy8gSWYgdGhpcyBpcyBhIGZpcnN0IGNsYXNzIGdsb2JhbCBhbmQgaGFzIG9ubHkgb25lIGFjY2Vzc2luZyBmdW5jdGlvbgorICAgIC8vIGFuZCB0aGlzIGZ1bmN0aW9uIGlzIG1haW4gKHdoaWNoIHdlIGtub3cgaXMgbm90IHJlY3Vyc2l2ZSB3ZSBjYW4gbWFrZQorICAgIC8vIHRoaXMgZ2xvYmFsIGEgbG9jYWwgdmFyaWFibGUpIHdlIHJlcGxhY2UgdGhlIGdsb2JhbCB3aXRoIGEgbG9jYWwgYWxsb2NhCisgICAgLy8gaW4gdGhpcyBmdW5jdGlvbi4KKyAgICAvLworICAgIC8vIE5PVEU6IEl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBwcm9tb3RlIG5vbiBzaW5nbGUtdmFsdWUgdHlwZXMgc2luY2Ugd2UKKyAgICAvLyBhcmUganVzdCByZXBsYWNpbmcgc3RhdGljIG1lbW9yeSB0byBzdGFjayBtZW1vcnkuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgZ2xvYmFsIGlzIGluIGRpZmZlcmVudCBhZGRyZXNzIHNwYWNlLCBkb24ndCBicmluZyBpdCB0byBzdGFjay4KKyAgICBpZiAoIUdTLkhhc011bHRpcGxlQWNjZXNzaW5nRnVuY3Rpb25zICYmCisgICAgICAgIEdTLkFjY2Vzc2luZ0Z1bmN0aW9uICYmICFHUy5IYXNOb25JbnN0cnVjdGlvblVzZXIgJiYKKyAgICAgICAgR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNTaW5nbGVWYWx1ZVR5cGUoKSAmJgorICAgICAgICBHUy5BY2Nlc3NpbmdGdW5jdGlvbi0+Z2V0TmFtZSgpID09ICJtYWluIiAmJgorICAgICAgICBHUy5BY2Nlc3NpbmdGdW5jdGlvbi0+aGFzRXh0ZXJuYWxMaW5rYWdlKCkgJiYKKyAgICAgICAgR1YtPmdldFR5cGUoKS0+Z2V0QWRkcmVzc1NwYWNlKCkgPT0gMCkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJMT0NBTElaSU5HIEdMT0JBTDogIiA8PCAqR1YpOworICAgICAgSW5zdHJ1Y3Rpb24mIEZpcnN0SSA9IGNvbnN0X2Nhc3Q8SW5zdHJ1Y3Rpb24mPigqR1MuQWNjZXNzaW5nRnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRFbnRyeUJsb2NrKCkuYmVnaW4oKSk7CisgICAgICBjb25zdCBUeXBlKiBFbGVtVHkgPSBHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgLy8gRklYTUU6IFBhc3MgR2xvYmFsJ3MgYWxpZ25tZW50IHdoZW4gZ2xvYmFscyBoYXZlIGFsaWdubWVudAorICAgICAgQWxsb2NhSW5zdCogQWxsb2NhID0gbmV3IEFsbG9jYUluc3QoRWxlbVR5LCBOVUxMLCBHVi0+Z2V0TmFtZSgpLCAmRmlyc3RJKTsKKyAgICAgIGlmICghaXNhPFVuZGVmVmFsdWU+KEdWLT5nZXRJbml0aWFsaXplcigpKSkKKyAgICAgICAgbmV3IFN0b3JlSW5zdChHVi0+Z2V0SW5pdGlhbGl6ZXIoKSwgQWxsb2NhLCAmRmlyc3RJKTsKKworICAgICAgR1YtPnJlcGxhY2VBbGxVc2VzV2l0aChBbGxvY2EpOworICAgICAgR1YtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgKytOdW1Mb2NhbGl6ZWQ7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLy8gSWYgdGhlIGdsb2JhbCBpcyBuZXZlciBsb2FkZWQgKGJ1dCBtYXkgYmUgc3RvcmVkIHRvKSwgaXQgaXMgZGVhZC4KKyAgICAvLyBEZWxldGUgaXQgbm93LgorICAgIGlmICghR1MuaXNMb2FkZWQpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiR0xPQkFMIE5FVkVSIExPQURFRDogIiA8PCAqR1YpOworCisgICAgICAvLyBEZWxldGUgYW55IHN0b3JlcyB3ZSBjYW4gZmluZCB0byB0aGUgZ2xvYmFsLiAgV2UgbWF5IG5vdCBiZSBhYmxlIHRvCisgICAgICAvLyBtYWtlIGl0IGNvbXBsZXRlbHkgZGVhZCB0aG91Z2guCisgICAgICBib29sIENoYW5nZWQgPSBDbGVhbnVwQ29uc3RhbnRHbG9iYWxVc2VycyhHViwgR1YtPmdldEluaXRpYWxpemVyKCkpOworCisgICAgICAvLyBJZiB0aGUgZ2xvYmFsIGlzIGRlYWQgbm93LCBkZWxldGUgaXQuCisgICAgICBpZiAoR1YtPnVzZV9lbXB0eSgpKSB7CisgICAgICAgIEdWLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgKytOdW1EZWxldGVkOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDaGFuZ2VkOworCisgICAgfSBlbHNlIGlmIChHUy5TdG9yZWRUeXBlIDw9IEdsb2JhbFN0YXR1czo6aXNJbml0aWFsaXplclN0b3JlZCkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJNQVJLSU5HIENPTlNUQU5UOiAiIDw8ICpHVik7CisgICAgICBHVi0+c2V0Q29uc3RhbnQodHJ1ZSk7CisKKyAgICAgIC8vIENsZWFuIHVwIGFueSBvYnZpb3VzbHkgc2ltcGxpZmlhYmxlIHVzZXJzIG5vdy4KKyAgICAgIENsZWFudXBDb25zdGFudEdsb2JhbFVzZXJzKEdWLCBHVi0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisKKyAgICAgIC8vIElmIHRoZSBnbG9iYWwgaXMgZGVhZCBub3csIGp1c3QgbnVrZSBpdC4KKyAgICAgIGlmIChHVi0+dXNlX2VtcHR5KCkpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgICAqKiogTWFya2luZyBjb25zdGFudCBhbGxvd2VkIHVzIHRvIHNpbXBsaWZ5ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJhbGwgdXNlcnMgYW5kIGRlbGV0ZSBnbG9iYWwhXG4iKTsKKyAgICAgICAgR1YtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICArK051bURlbGV0ZWQ7CisgICAgICB9CisKKyAgICAgICsrTnVtTWFya2VkOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmICghR1YtPmdldEluaXRpYWxpemVyKCktPmdldFR5cGUoKS0+aXNTaW5nbGVWYWx1ZVR5cGUoKSkgeworICAgICAgaWYgKFRhcmdldERhdGEgKlREID0gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxUYXJnZXREYXRhPigpKQorICAgICAgICBpZiAoR2xvYmFsVmFyaWFibGUgKkZpcnN0TmV3R1YgPSBTUkFHbG9iYWwoR1YsICpURCkpIHsKKyAgICAgICAgICBHVkkgPSBGaXJzdE5ld0dWOyAgLy8gRG9uJ3Qgc2tpcCB0aGUgbmV3bHkgcHJvZHVjZWQgZ2xvYmFscyEKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoR1MuU3RvcmVkVHlwZSA9PSBHbG9iYWxTdGF0dXM6OmlzU3RvcmVkT25jZSkgeworICAgICAgLy8gSWYgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBnbG9iYWwgd2FzIGFuIHVuZGVmIHZhbHVlLCBhbmQgaWYgb25seQorICAgICAgLy8gb25lIG90aGVyIHZhbHVlIHdhcyBzdG9yZWQgaW50byBpdCwgd2UgY2FuIGp1c3QgY2hhbmdlIHRoZQorICAgICAgLy8gaW5pdGlhbGl6ZXIgdG8gYmUgdGhlIHN0b3JlZCB2YWx1ZSwgdGhlbiBkZWxldGUgYWxsIHN0b3JlcyB0byB0aGUKKyAgICAgIC8vIGdsb2JhbC4gIFRoaXMgYWxsb3dzIHVzIHRvIG1hcmsgaXQgY29uc3RhbnQuCisgICAgICBpZiAoQ29uc3RhbnQgKlNPVkNvbnN0YW50ID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEdTLlN0b3JlZE9uY2VWYWx1ZSkpCisgICAgICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oR1YtPmdldEluaXRpYWxpemVyKCkpKSB7CisgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBpbml0aWFsIHZhbHVlIGhlcmUuCisgICAgICAgICAgR1YtPnNldEluaXRpYWxpemVyKFNPVkNvbnN0YW50KTsKKworICAgICAgICAgIC8vIENsZWFuIHVwIGFueSBvYnZpb3VzbHkgc2ltcGxpZmlhYmxlIHVzZXJzIG5vdy4KKyAgICAgICAgICBDbGVhbnVwQ29uc3RhbnRHbG9iYWxVc2VycyhHViwgR1YtPmdldEluaXRpYWxpemVyKCkpOworCisgICAgICAgICAgaWYgKEdWLT51c2VfZW1wdHkoKSkgeworICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgICAqKiogU3Vic3RpdHV0aW5nIGluaXRpYWxpemVyIGFsbG93ZWQgdXMgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzaW1wbGlmeSBhbGwgdXNlcnMgYW5kIGRlbGV0ZSBnbG9iYWwhXG4iKTsKKyAgICAgICAgICAgIEdWLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgICAgICsrTnVtRGVsZXRlZDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1ZJID0gR1Y7CisgICAgICAgICAgfQorICAgICAgICAgICsrTnVtU3Vic3RpdHV0ZTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAvLyBUcnkgdG8gb3B0aW1pemUgZ2xvYmFscyBiYXNlZCBvbiB0aGUga25vd2xlZGdlIHRoYXQgb25seSBvbmUgdmFsdWUKKyAgICAgIC8vIChiZXNpZGVzIGl0cyBpbml0aWFsaXplcikgaXMgZXZlciBzdG9yZWQgdG8gdGhlIGdsb2JhbC4KKyAgICAgIGlmIChPcHRpbWl6ZU9uY2VTdG9yZWRHbG9iYWwoR1YsIEdTLlN0b3JlZE9uY2VWYWx1ZSwgR1ZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFRhcmdldERhdGE+KCkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGUgZ2xvYmFsIHdhcyBub3QgYSBib29sZWFuLCB3ZSBjYW4gc2hyaW5rIGl0IHRvIGJlIGEKKyAgICAgIC8vIGJvb2xlYW4uCisgICAgICBpZiAoQ29uc3RhbnQgKlNPVkNvbnN0YW50ID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEdTLlN0b3JlZE9uY2VWYWx1ZSkpCisgICAgICAgIGlmIChUcnlUb1Nocmlua0dsb2JhbFRvQm9vbGVhbihHViwgU09WQ29uc3RhbnQpKSB7CisgICAgICAgICAgKytOdW1TaHJ1bmtUb0Jvb2w7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gQ2hhbmdlQ2FsbGVlc1RvRmFzdENhbGwgLSBXYWxrIGFsbCBvZiB0aGUgZGlyZWN0IGNhbGxzIG9mIHRoZSBzcGVjaWZpZWQKKy8vLyBmdW5jdGlvbiwgY2hhbmdpbmcgdGhlbSB0byBGYXN0Q0MuCitzdGF0aWMgdm9pZCBDaGFuZ2VDYWxsZWVzVG9GYXN0Q2FsbChGdW5jdGlvbiAqRikgeworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBGLT51c2VfYmVnaW4oKSwgRSA9IEYtPnVzZV9lbmQoKTsgVUkgIT0gRTsrK1VJKXsKKyAgICBDYWxsU2l0ZSBVc2VyKGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSkpOworICAgIFVzZXIuc2V0Q2FsbGluZ0NvbnYoQ2FsbGluZ0NvbnY6OkZhc3QpOworICB9Cit9CisKK3N0YXRpYyBBdHRyTGlzdFB0ciBTdHJpcE5lc3QoY29uc3QgQXR0ckxpc3RQdHIgJkF0dHJzKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBdHRycy5nZXROdW1TbG90cygpOyBpICE9IGU7ICsraSkgeworICAgIGlmICgoQXR0cnMuZ2V0U2xvdChpKS5BdHRycyAmIEF0dHJpYnV0ZTo6TmVzdCkgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gVGhlcmUgY2FuIGJlIG9ubHkgb25lLgorICAgIHJldHVybiBBdHRycy5yZW1vdmVBdHRyKEF0dHJzLmdldFNsb3QoaSkuSW5kZXgsIEF0dHJpYnV0ZTo6TmVzdCk7CisgIH0KKworICByZXR1cm4gQXR0cnM7Cit9CisKK3N0YXRpYyB2b2lkIFJlbW92ZU5lc3RBdHRyaWJ1dGUoRnVuY3Rpb24gKkYpIHsKKyAgRi0+c2V0QXR0cmlidXRlcyhTdHJpcE5lc3QoRi0+Z2V0QXR0cmlidXRlcygpKSk7CisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEYtPnVzZV9iZWdpbigpLCBFID0gRi0+dXNlX2VuZCgpOyBVSSAhPSBFOysrVUkpeworICAgIENhbGxTaXRlIFVzZXIoY2FzdDxJbnN0cnVjdGlvbj4oKlVJKSk7CisgICAgVXNlci5zZXRBdHRyaWJ1dGVzKFN0cmlwTmVzdChVc2VyLmdldEF0dHJpYnV0ZXMoKSkpOworICB9Cit9CisKK2Jvb2wgR2xvYmFsT3B0OjpPcHRpbWl6ZUZ1bmN0aW9ucyhNb2R1bGUgJk0pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIC8vIE9wdGltaXplIGZ1bmN0aW9ucy4KKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEZJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgRkkgIT0gRTsgKSB7CisgICAgRnVuY3Rpb24gKkYgPSBGSSsrOworICAgIC8vIEZ1bmN0aW9ucyB3aXRob3V0IG5hbWVzIGNhbm5vdCBiZSByZWZlcmVuY2VkIG91dHNpZGUgdGhpcyBtb2R1bGUuCisgICAgaWYgKCFGLT5oYXNOYW1lKCkgJiYgIUYtPmlzRGVjbGFyYXRpb24oKSkKKyAgICAgIEYtPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSk7CisgICAgRi0+cmVtb3ZlRGVhZENvbnN0YW50VXNlcnMoKTsKKyAgICBpZiAoRi0+dXNlX2VtcHR5KCkgJiYgKEYtPmhhc0xvY2FsTGlua2FnZSgpIHx8IEYtPmhhc0xpbmtPbmNlTGlua2FnZSgpKSkgeworICAgICAgRi0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICsrTnVtRm5EZWxldGVkOworICAgIH0gZWxzZSBpZiAoRi0+aGFzTG9jYWxMaW5rYWdlKCkpIHsKKyAgICAgIGlmIChGLT5nZXRDYWxsaW5nQ29udigpID09IENhbGxpbmdDb252OjpDICYmICFGLT5pc1ZhckFyZygpICYmCisgICAgICAgICAgIUYtPmhhc0FkZHJlc3NUYWtlbigpKSB7CisgICAgICAgIC8vIElmIHRoaXMgZnVuY3Rpb24gaGFzIEMgY2FsbGluZyBjb252ZW50aW9ucywgaXMgbm90IGEgdmFyYXJncworICAgICAgICAvLyBmdW5jdGlvbiwgYW5kIGlzIG9ubHkgY2FsbGVkIGRpcmVjdGx5LCBwcm9tb3RlIGl0IHRvIHVzZSB0aGUgRmFzdAorICAgICAgICAvLyBjYWxsaW5nIGNvbnZlbnRpb24uCisgICAgICAgIEYtPnNldENhbGxpbmdDb252KENhbGxpbmdDb252OjpGYXN0KTsKKyAgICAgICAgQ2hhbmdlQ2FsbGVlc1RvRmFzdENhbGwoRik7CisgICAgICAgICsrTnVtRmFzdENhbGxGbnM7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoRi0+Z2V0QXR0cmlidXRlcygpLmhhc0F0dHJTb21ld2hlcmUoQXR0cmlidXRlOjpOZXN0KSAmJgorICAgICAgICAgICFGLT5oYXNBZGRyZXNzVGFrZW4oKSkgeworICAgICAgICAvLyBUaGUgZnVuY3Rpb24gaXMgbm90IHVzZWQgYnkgYSB0cmFtcG9saW5lIGludHJpbnNpYywgc28gaXQgaXMgc2FmZQorICAgICAgICAvLyB0byByZW1vdmUgdGhlICduZXN0JyBhdHRyaWJ1dGUuCisgICAgICAgIFJlbW92ZU5lc3RBdHRyaWJ1dGUoRik7CisgICAgICAgICsrTnVtTmVzdFJlbW92ZWQ7CisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gQ2hhbmdlZDsKK30KKworYm9vbCBHbG9iYWxPcHQ6Ok9wdGltaXplR2xvYmFsVmFycyhNb2R1bGUgJk0pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgR1ZJID0gTS5nbG9iYWxfYmVnaW4oKSwgRSA9IE0uZ2xvYmFsX2VuZCgpOworICAgICAgIEdWSSAhPSBFOyApIHsKKyAgICBHbG9iYWxWYXJpYWJsZSAqR1YgPSBHVkkrKzsKKyAgICAvLyBHbG9iYWwgdmFyaWFibGVzIHdpdGhvdXQgbmFtZXMgY2Fubm90IGJlIHJlZmVyZW5jZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS4KKyAgICBpZiAoIUdWLT5oYXNOYW1lKCkgJiYgIUdWLT5pc0RlY2xhcmF0aW9uKCkpCisgICAgICBHVi0+c2V0TGlua2FnZShHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlKTsKKyAgICAvLyBTaW1wbGlmeSB0aGUgaW5pdGlhbGl6ZXIuCisgICAgaWYgKEdWLT5oYXNJbml0aWFsaXplcigpKQorICAgICAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KEdWLT5nZXRJbml0aWFsaXplcigpKSkgeworICAgICAgICBUYXJnZXREYXRhICpURCA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8VGFyZ2V0RGF0YT4oKTsKKyAgICAgICAgQ29uc3RhbnQgKk5ldyA9IENvbnN0YW50Rm9sZENvbnN0YW50RXhwcmVzc2lvbihDRSwgVEQpOworICAgICAgICBpZiAoTmV3ICYmIE5ldyAhPSBDRSkKKyAgICAgICAgICBHVi0+c2V0SW5pdGlhbGl6ZXIoTmV3KTsKKyAgICAgIH0KKyAgICAvLyBEbyBtb3JlIGludm9sdmVkIG9wdGltaXphdGlvbnMgaWYgdGhlIGdsb2JhbCBpcyBpbnRlcm5hbC4KKyAgICBpZiAoIUdWLT5pc0NvbnN0YW50KCkgJiYgR1YtPmhhc0xvY2FsTGlua2FnZSgpICYmCisgICAgICAgIEdWLT5oYXNJbml0aWFsaXplcigpKQorICAgICAgQ2hhbmdlZCB8PSBQcm9jZXNzSW50ZXJuYWxHbG9iYWwoR1YsIEdWSSk7CisgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBGaW5kR2xvYmFsQ3RvcnMgLSBGaW5kIHRoZSBsbHZtLmdsb2JhbGN0b3JzIGxpc3QsIHZlcmlmeWluZyB0aGF0IGFsbAorLy8vIGluaXRpYWxpemVycyBoYXZlIGFuIGluaXQgcHJpb3JpdHkgb2YgNjU1MzUuCitHbG9iYWxWYXJpYWJsZSAqR2xvYmFsT3B0OjpGaW5kR2xvYmFsQ3RvcnMoTW9kdWxlICZNKSB7CisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBpZiAoSS0+Z2V0TmFtZSgpID09ICJsbHZtLmdsb2JhbF9jdG9ycyIpIHsKKyAgICAgIC8vIEZvdW5kIGl0LCB2ZXJpZnkgaXQncyBhbiBhcnJheSBvZiB7IGludCwgdm9pZCgpKiB9LgorICAgICAgY29uc3QgQXJyYXlUeXBlICpBVHkgPWR5bl9jYXN0PEFycmF5VHlwZT4oSS0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICAgIGlmICghQVR5KSByZXR1cm4gMDsKKyAgICAgIGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KEFUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICBpZiAoIVNUeSB8fCBTVHktPmdldE51bUVsZW1lbnRzKCkgIT0gMiB8fAorICAgICAgICAgICFTVHktPmdldEVsZW1lbnRUeXBlKDApLT5pc0ludGVnZXJUeSgzMikpIHJldHVybiAwOworICAgICAgY29uc3QgUG9pbnRlclR5cGUgKlBGVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oU1R5LT5nZXRFbGVtZW50VHlwZSgxKSk7CisgICAgICBpZiAoIVBGVHkpIHJldHVybiAwOworICAgICAgY29uc3QgRnVuY3Rpb25UeXBlICpGVHkgPSBkeW5fY2FzdDxGdW5jdGlvblR5cGU+KFBGVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgaWYgKCFGVHkgfHwgIUZUeS0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeSgpIHx8CisgICAgICAgICAgRlR5LT5pc1ZhckFyZygpIHx8IEZUeS0+Z2V0TnVtUGFyYW1zKCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAKKyAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBpbml0aWFsaXplciBpcyBzaW1wbGUgZW5vdWdoIGZvciB1cyB0byBoYW5kbGUuCisgICAgICBpZiAoIUktPmhhc0RlZmluaXRpdmVJbml0aWFsaXplcigpKSByZXR1cm4gMDsKKyAgICAgIENvbnN0YW50QXJyYXkgKkNBID0gZHluX2Nhc3Q8Q29uc3RhbnRBcnJheT4oSS0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgICAgICBpZiAoIUNBKSByZXR1cm4gMDsKKyAgICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgaSA9IENBLT5vcF9iZWdpbigpLCBlID0gQ0EtPm9wX2VuZCgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKENvbnN0YW50U3RydWN0ICpDUyA9IGR5bl9jYXN0PENvbnN0YW50U3RydWN0PigqaSkpIHsKKyAgICAgICAgICBpZiAoaXNhPENvbnN0YW50UG9pbnRlck51bGw+KENTLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgLy8gTXVzdCBoYXZlIGEgZnVuY3Rpb24gb3IgbnVsbCBwdHIuCisgICAgICAgICAgaWYgKCFpc2E8RnVuY3Rpb24+KENTLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIAorICAgICAgICAgIC8vIEluaXQgcHJpb3JpdHkgbXVzdCBiZSBzdGFuZGFyZC4KKyAgICAgICAgICBDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQ1MtPmdldE9wZXJhbmQoMCkpOworICAgICAgICAgIGlmICghQ0kgfHwgQ0ktPmdldFpFeHRWYWx1ZSgpICE9IDY1NTM1KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIEk7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLy8vIFBhcnNlR2xvYmFsQ3RvcnMgLSBHaXZlbiBhIGxsdm0uZ2xvYmFsX2N0b3JzIGxpc3QgdGhhdCB3ZSBjYW4gdW5kZXJzdGFuZCwKKy8vLyByZXR1cm4gYSBsaXN0IG9mIHRoZSBmdW5jdGlvbnMgYW5kIG51bGwgdGVybWluYXRvciBhcyBhIHZlY3Rvci4KK3N0YXRpYyBzdGQ6OnZlY3RvcjxGdW5jdGlvbio+IFBhcnNlR2xvYmFsQ3RvcnMoR2xvYmFsVmFyaWFibGUgKkdWKSB7CisgIENvbnN0YW50QXJyYXkgKkNBID0gY2FzdDxDb25zdGFudEFycmF5PihHVi0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uKj4gUmVzdWx0OworICBSZXN1bHQucmVzZXJ2ZShDQS0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgaSA9IENBLT5vcF9iZWdpbigpLCBlID0gQ0EtPm9wX2VuZCgpOyBpICE9IGU7ICsraSkgeworICAgIENvbnN0YW50U3RydWN0ICpDUyA9IGNhc3Q8Q29uc3RhbnRTdHJ1Y3Q+KCppKTsKKyAgICBSZXN1bHQucHVzaF9iYWNrKGR5bl9jYXN0PEZ1bmN0aW9uPihDUy0+Z2V0T3BlcmFuZCgxKSkpOworICB9CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBJbnN0YWxsR2xvYmFsQ3RvcnMgLSBHaXZlbiBhIHNwZWNpZmllZCBsbHZtLmdsb2JhbF9jdG9ycyBsaXN0LCBpbnN0YWxsIHRoZQorLy8vIHNwZWNpZmllZCBhcnJheSwgcmV0dXJuaW5nIHRoZSBuZXcgZ2xvYmFsIHRvIHVzZS4KK3N0YXRpYyBHbG9iYWxWYXJpYWJsZSAqSW5zdGFsbEdsb2JhbEN0b3JzKEdsb2JhbFZhcmlhYmxlICpHQ0wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RnVuY3Rpb24qPiAmQ3RvcnMpIHsKKyAgLy8gSWYgd2UgbWFkZSBhIGNoYW5nZSwgcmVhc3NlbWJsZSB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDU1ZhbHM7CisgIENTVmFscy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEdDTC0+Z2V0Q29udGV4dCgpKSw2NTUzNSkpOworICBDU1ZhbHMucHVzaF9iYWNrKDApOworICAKKyAgLy8gQ3JlYXRlIHRoZSBuZXcgaW5pdCBsaXN0LgorICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IENBTGlzdDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEN0b3JzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoQ3RvcnNbaV0pIHsKKyAgICAgIENTVmFsc1sxXSA9IEN0b3JzW2ldOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBUeXBlICpGVHkgPSBGdW5jdGlvblR5cGU6OmdldChUeXBlOjpnZXRWb2lkVHkoR0NMLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgY29uc3QgUG9pbnRlclR5cGUgKlBGVHkgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEZUeSk7CisgICAgICBDU1ZhbHNbMV0gPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFBGVHkpOworICAgICAgQ1NWYWxzWzBdID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEdDTC0+Z2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ4MzY0Nyk7CisgICAgfQorICAgIENBTGlzdC5wdXNoX2JhY2soQ29uc3RhbnRTdHJ1Y3Q6OmdldChHQ0wtPmdldENvbnRleHQoKSwgQ1NWYWxzLCBmYWxzZSkpOworICB9CisgIAorICAvLyBDcmVhdGUgdGhlIGFycmF5IGluaXRpYWxpemVyLgorICBjb25zdCBUeXBlICpTdHJ1Y3RUeSA9CisgICAgICBjYXN0PEFycmF5VHlwZT4oR0NMLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICBDb25zdGFudCAqQ0EgPSBDb25zdGFudEFycmF5OjpnZXQoQXJyYXlUeXBlOjpnZXQoU3RydWN0VHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMaXN0LnNpemUoKSksIENBTGlzdCk7CisgIAorICAvLyBJZiB3ZSBkaWRuJ3QgY2hhbmdlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIGRvbid0IGNyZWF0ZSBhIG5ldyBHVi4KKyAgaWYgKENBLT5nZXRUeXBlKCkgPT0gR0NMLT5nZXRJbml0aWFsaXplcigpLT5nZXRUeXBlKCkpIHsKKyAgICBHQ0wtPnNldEluaXRpYWxpemVyKENBKTsKKyAgICByZXR1cm4gR0NMOworICB9CisgIAorICAvLyBDcmVhdGUgdGhlIG5ldyBnbG9iYWwgYW5kIGluc2VydCBpdCBuZXh0IHRvIHRoZSBleGlzdGluZyBsaXN0LgorICBHbG9iYWxWYXJpYWJsZSAqTkdWID0gbmV3IEdsb2JhbFZhcmlhYmxlKENBLT5nZXRUeXBlKCksIEdDTC0+aXNDb25zdGFudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDTC0+Z2V0TGlua2FnZSgpLCBDQSwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NMLT5pc1RocmVhZExvY2FsKCkpOworICBHQ0wtPmdldFBhcmVudCgpLT5nZXRHbG9iYWxMaXN0KCkuaW5zZXJ0KEdDTCwgTkdWKTsKKyAgTkdWLT50YWtlTmFtZShHQ0wpOworICAKKyAgLy8gTnVrZSB0aGUgb2xkIGxpc3QsIHJlcGxhY2luZyBhbnkgdXNlcyB3aXRoIHRoZSBuZXcgb25lLgorICBpZiAoIUdDTC0+dXNlX2VtcHR5KCkpIHsKKyAgICBDb25zdGFudCAqViA9IE5HVjsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpICE9IEdDTC0+Z2V0VHlwZSgpKQorICAgICAgViA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChWLCBHQ0wtPmdldFR5cGUoKSk7CisgICAgR0NMLT5yZXBsYWNlQWxsVXNlc1dpdGgoVik7CisgIH0KKyAgR0NMLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgCisgIGlmIChDdG9ycy5zaXplKCkpCisgICAgcmV0dXJuIE5HVjsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBDb25zdGFudCAqZ2V0VmFsKERlbnNlTWFwPFZhbHVlKiwgQ29uc3RhbnQqPiAmQ29tcHV0ZWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqVikgeworICBpZiAoQ29uc3RhbnQgKkNWID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKSByZXR1cm4gQ1Y7CisgIENvbnN0YW50ICpSID0gQ29tcHV0ZWRWYWx1ZXNbVl07CisgIGFzc2VydChSICYmICJSZWZlcmVuY2UgdG8gYW4gdW5jb21wdXRlZCB2YWx1ZSEiKTsKKyAgcmV0dXJuIFI7Cit9CisKKy8vLyBpc1NpbXBsZUVub3VnaFBvaW50ZXJUb0NvbW1pdCAtIFJldHVybiB0cnVlIGlmIHRoaXMgY29uc3RhbnQgaXMgc2ltcGxlCisvLy8gZW5vdWdoIGZvciB1cyB0byB1bmRlcnN0YW5kLiAgSW4gcGFydGljdWxhciwgaWYgaXQgaXMgYSBjYXN0IG9mIHNvbWV0aGluZywKKy8vLyB3ZSBwdW50LiAgV2UgYmFzaWNhbGx5IGp1c3Qgc3VwcG9ydCBkaXJlY3QgYWNjZXNzZXMgdG8gZ2xvYmFscyBhbmQgR0VQJ3Mgb2YKKy8vLyBnbG9iYWxzLiAgVGhpcyBzaG91bGQgYmUga2VwdCB1cCB0byBkYXRlIHdpdGggQ29tbWl0VmFsdWVUby4KK3N0YXRpYyBib29sIGlzU2ltcGxlRW5vdWdoUG9pbnRlclRvQ29tbWl0KENvbnN0YW50ICpDKSB7CisgIC8vIENvbnNlcnZhdGl2ZWx5LCBhdm9pZCBhZ2dyZWdhdGUgdHlwZXMuIFRoaXMgaXMgYmVjYXVzZSB3ZSBkb24ndAorICAvLyB3YW50IHRvIHdvcnJ5IGFib3V0IHRoZW0gcGFydGlhbGx5IG92ZXJsYXBwaW5nIG90aGVyIHN0b3Jlcy4KKyAgaWYgKCFjYXN0PFBvaW50ZXJUeXBlPihDLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpLT5pc1NpbmdsZVZhbHVlVHlwZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KEMpKQorICAgIC8vIERvIG5vdCBhbGxvdyB3ZWFrL2xpbmtvbmNlL2RsbGltcG9ydC9kbGxleHBvcnQgbGlua2FnZSBvcgorICAgIC8vIGV4dGVybmFsIGdsb2JhbHMuCisgICAgcmV0dXJuIEdWLT5oYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIoKTsKKworICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oQykpCisgICAgLy8gSGFuZGxlIGEgY29uc3RhbnRleHByIGdlcC4KKyAgICBpZiAoQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyICYmCisgICAgICAgIGlzYTxHbG9iYWxWYXJpYWJsZT4oQ0UtPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgIGNhc3Q8R0VQT3BlcmF0b3I+KENFKS0+aXNJbkJvdW5kcygpKSB7CisgICAgICBHbG9iYWxWYXJpYWJsZSAqR1YgPSBjYXN0PEdsb2JhbFZhcmlhYmxlPihDRS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICAvLyBEbyBub3QgYWxsb3cgd2Vhay9saW5rb25jZS9kbGxpbXBvcnQvZGxsZXhwb3J0IGxpbmthZ2Ugb3IKKyAgICAgIC8vIGV4dGVybmFsIGdsb2JhbHMuCisgICAgICBpZiAoIUdWLT5oYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBUaGUgZmlyc3QgaW5kZXggbXVzdCBiZSB6ZXJvLgorICAgICAgQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KCpsbHZtOjpuZXh0KENFLT5vcF9iZWdpbigpKSk7CisgICAgICBpZiAoIUNJIHx8ICFDSS0+aXNaZXJvKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gVGhlIHJlbWFpbmluZyBpbmRpY2VzIG11c3QgYmUgY29tcGlsZS10aW1lIGtub3duIGludGVnZXJzIHdpdGhpbiB0aGUKKyAgICAgIC8vIG5vdGlvbmFsIGJvdW5kcyBvZiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgYXJyYXkgdHlwZXMuCisgICAgICBpZiAoIUNFLT5pc0dFUFdpdGhOb05vdGlvbmFsT3ZlckluZGV4aW5nKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZExvYWRUaHJvdWdoR0VQQ29uc3RhbnRFeHByKEdWLT5nZXRJbml0aWFsaXplcigpLCBDRSk7CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBFdmFsdWF0ZVN0b3JlSW50byAtIEV2YWx1YXRlIGEgcGllY2Ugb2YgYSBjb25zdGFudGV4cHIgc3RvcmUgaW50byBhIGdsb2JhbAorLy8vIGluaXRpYWxpemVyLiAgVGhpcyByZXR1cm5zICdJbml0JyBtb2RpZmllZCB0byByZWZsZWN0ICdWYWwnIHN0b3JlZCBpbnRvIGl0LgorLy8vIEF0IHRoaXMgcG9pbnQsIHRoZSBHRVAgb3BlcmFuZHMgb2YgQWRkciBbMCwgT3BObykgaGF2ZSBiZWVuIHN0ZXBwZWQgaW50by4KK3N0YXRpYyBDb25zdGFudCAqRXZhbHVhdGVTdG9yZUludG8oQ29uc3RhbnQgKkluaXQsIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwciAqQWRkciwgdW5zaWduZWQgT3BObykgeworICAvLyBCYXNlIGNhc2Ugb2YgdGhlIHJlY3Vyc2lvbi4KKyAgaWYgKE9wTm8gPT0gQWRkci0+Z2V0TnVtT3BlcmFuZHMoKSkgeworICAgIGFzc2VydChWYWwtPmdldFR5cGUoKSA9PSBJbml0LT5nZXRUeXBlKCkgJiYgIlR5cGUgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIFZhbDsKKyAgfQorICAKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBFbHRzOworICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oSW5pdC0+Z2V0VHlwZSgpKSkgeworCisgICAgLy8gQnJlYWsgdXAgdGhlIGNvbnN0YW50IGludG8gaXRzIGVsZW1lbnRzLgorICAgIGlmIChDb25zdGFudFN0cnVjdCAqQ1MgPSBkeW5fY2FzdDxDb25zdGFudFN0cnVjdD4oSW5pdCkpIHsKKyAgICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgaSA9IENTLT5vcF9iZWdpbigpLCBlID0gQ1MtPm9wX2VuZCgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgRWx0cy5wdXNoX2JhY2soY2FzdDxDb25zdGFudD4oKmkpKTsKKyAgICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEluaXQpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU1R5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShTVHktPmdldEVsZW1lbnRUeXBlKGkpKSk7CisgICAgfSBlbHNlIGlmIChpc2E8VW5kZWZWYWx1ZT4oSW5pdCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBFbHRzLnB1c2hfYmFjayhVbmRlZlZhbHVlOjpnZXQoU1R5LT5nZXRFbGVtZW50VHlwZShpKSkpOworICAgIH0gZWxzZSB7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJUaGlzIGNvZGUgaXMgb3V0IG9mIHN5bmMgd2l0aCAiCisgICAgICAgICAgICAgIiBDb25zdGFudEZvbGRMb2FkVGhyb3VnaEdFUENvbnN0YW50RXhwciIpOworICAgIH0KKyAgICAKKyAgICAvLyBSZXBsYWNlIHRoZSBlbGVtZW50IHRoYXQgd2UgYXJlIHN1cHBvc2VkIHRvLgorICAgIENvbnN0YW50SW50ICpDVSA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEFkZHItPmdldE9wZXJhbmQoT3BObykpOworICAgIHVuc2lnbmVkIElkeCA9IENVLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBhc3NlcnQoSWR4IDwgU1R5LT5nZXROdW1FbGVtZW50cygpICYmICJTdHJ1Y3QgaW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgIEVsdHNbSWR4XSA9IEV2YWx1YXRlU3RvcmVJbnRvKEVsdHNbSWR4XSwgVmFsLCBBZGRyLCBPcE5vKzEpOworICAgIAorICAgIC8vIFJldHVybiB0aGUgbW9kaWZpZWQgc3RydWN0LgorICAgIHJldHVybiBDb25zdGFudFN0cnVjdDo6Z2V0KEluaXQtPmdldENvbnRleHQoKSwgJkVsdHNbMF0sIEVsdHMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUeS0+aXNQYWNrZWQoKSk7CisgIH0gZWxzZSB7CisgICAgQ29uc3RhbnRJbnQgKkNJID0gY2FzdDxDb25zdGFudEludD4oQWRkci0+Z2V0T3BlcmFuZChPcE5vKSk7CisgICAgY29uc3QgU2VxdWVudGlhbFR5cGUgKkluaXRUeSA9IGNhc3Q8U2VxdWVudGlhbFR5cGU+KEluaXQtPmdldFR5cGUoKSk7CisKKyAgICB1aW50NjRfdCBOdW1FbHRzOworICAgIGlmIChjb25zdCBBcnJheVR5cGUgKkFUeSA9IGR5bl9jYXN0PEFycmF5VHlwZT4oSW5pdFR5KSkKKyAgICAgIE51bUVsdHMgPSBBVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgZWxzZQorICAgICAgTnVtRWx0cyA9IGNhc3Q8VmVjdG9yVHlwZT4oSW5pdFR5KS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAKKyAgICAKKyAgICAvLyBCcmVhayB1cCB0aGUgYXJyYXkgaW50byBlbGVtZW50cy4KKyAgICBpZiAoQ29uc3RhbnRBcnJheSAqQ0EgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihJbml0KSkgeworICAgICAgZm9yIChVc2VyOjpvcF9pdGVyYXRvciBpID0gQ0EtPm9wX2JlZ2luKCksIGUgPSBDQS0+b3BfZW5kKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBFbHRzLnB1c2hfYmFjayhjYXN0PENvbnN0YW50PigqaSkpOworICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRWZWN0b3IgKkNWID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KEluaXQpKSB7CisgICAgICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIGkgPSBDVi0+b3BfYmVnaW4oKSwgZSA9IENWLT5vcF9lbmQoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIEVsdHMucHVzaF9iYWNrKGNhc3Q8Q29uc3RhbnQ+KCppKSk7CisgICAgfSBlbHNlIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihJbml0KSkgeworICAgICAgRWx0cy5hc3NpZ24oTnVtRWx0cywgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJbml0VHktPmdldEVsZW1lbnRUeXBlKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KGlzYTxVbmRlZlZhbHVlPihJbml0KSAmJiAiVGhpcyBjb2RlIGlzIG91dCBvZiBzeW5jIHdpdGggIgorICAgICAgICAgICAgICIgQ29uc3RhbnRGb2xkTG9hZFRocm91Z2hHRVBDb25zdGFudEV4cHIiKTsKKyAgICAgIEVsdHMuYXNzaWduKE51bUVsdHMsIFVuZGVmVmFsdWU6OmdldChJbml0VHktPmdldEVsZW1lbnRUeXBlKCkpKTsKKyAgICB9CisgICAgCisgICAgYXNzZXJ0KENJLT5nZXRaRXh0VmFsdWUoKSA8IE51bUVsdHMpOworICAgIEVsdHNbQ0ktPmdldFpFeHRWYWx1ZSgpXSA9CisgICAgICBFdmFsdWF0ZVN0b3JlSW50byhFbHRzW0NJLT5nZXRaRXh0VmFsdWUoKV0sIFZhbCwgQWRkciwgT3BObysxKTsKKyAgICAKKyAgICBpZiAoSW5pdC0+Z2V0VHlwZSgpLT5pc0FycmF5VHkoKSkKKyAgICAgIHJldHVybiBDb25zdGFudEFycmF5OjpnZXQoY2FzdDxBcnJheVR5cGU+KEluaXRUeSksIEVsdHMpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KCZFbHRzWzBdLCBFbHRzLnNpemUoKSk7CisgIH0gICAgCit9CisKKy8vLyBDb21taXRWYWx1ZVRvIC0gV2UgaGF2ZSBkZWNpZGVkIHRoYXQgQWRkciAod2hpY2ggc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUKKy8vLyBpc1NpbXBsZUVub3VnaFBvaW50ZXJUb0NvbW1pdCkgc2hvdWxkIGdldCBWYWwgYXMgaXRzIHZhbHVlLiAgTWFrZSBpdCBoYXBwZW4uCitzdGF0aWMgdm9pZCBDb21taXRWYWx1ZVRvKENvbnN0YW50ICpWYWwsIENvbnN0YW50ICpBZGRyKSB7CisgIGlmIChHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oQWRkcikpIHsKKyAgICBhc3NlcnQoR1YtPmhhc0luaXRpYWxpemVyKCkpOworICAgIEdWLT5zZXRJbml0aWFsaXplcihWYWwpOworICAgIHJldHVybjsKKyAgfQorCisgIENvbnN0YW50RXhwciAqQ0UgPSBjYXN0PENvbnN0YW50RXhwcj4oQWRkcik7CisgIEdsb2JhbFZhcmlhYmxlICpHViA9IGNhc3Q8R2xvYmFsVmFyaWFibGU+KENFLT5nZXRPcGVyYW5kKDApKTsKKyAgR1YtPnNldEluaXRpYWxpemVyKEV2YWx1YXRlU3RvcmVJbnRvKEdWLT5nZXRJbml0aWFsaXplcigpLCBWYWwsIENFLCAyKSk7Cit9CisKKy8vLyBDb21wdXRlTG9hZFJlc3VsdCAtIFJldHVybiB0aGUgdmFsdWUgdGhhdCB3b3VsZCBiZSBjb21wdXRlZCBieSBhIGxvYWQgZnJvbQorLy8vIFAgYWZ0ZXIgdGhlIHN0b3JlcyByZWZsZWN0ZWQgYnkgJ21lbW9yeScgaGF2ZSBiZWVuIHBlcmZvcm1lZC4gIElmIHdlIGNhbid0CisvLy8gZGVjaWRlLCByZXR1cm4gbnVsbC4KK3N0YXRpYyBDb25zdGFudCAqQ29tcHV0ZUxvYWRSZXN1bHQoQ29uc3RhbnQgKlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbnNlTWFwPENvbnN0YW50KiwgQ29uc3RhbnQqPiAmTWVtb3J5KSB7CisgIC8vIElmIHRoaXMgbWVtb3J5IGxvY2F0aW9uIGhhcyBiZWVuIHJlY2VudGx5IHN0b3JlZCwgdXNlIHRoZSBzdG9yZWQgdmFsdWU6IGl0CisgIC8vIGlzIHRoZSBtb3N0IHVwLXRvLWRhdGUuCisgIERlbnNlTWFwPENvbnN0YW50KiwgQ29uc3RhbnQqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IE1lbW9yeS5maW5kKFApOworICBpZiAoSSAhPSBNZW1vcnkuZW5kKCkpIHJldHVybiBJLT5zZWNvbmQ7CisgCisgIC8vIEFjY2VzcyBpdC4KKyAgaWYgKEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihQKSkgeworICAgIGlmIChHVi0+aGFzRGVmaW5pdGl2ZUluaXRpYWxpemVyKCkpCisgICAgICByZXR1cm4gR1YtPmdldEluaXRpYWxpemVyKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIC8vIEhhbmRsZSBhIGNvbnN0YW50ZXhwciBnZXRlbGVtZW50cHRyLgorICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oUCkpCisgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0ciAmJgorICAgICAgICBpc2E8R2xvYmFsVmFyaWFibGU+KENFLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgR2xvYmFsVmFyaWFibGUgKkdWID0gY2FzdDxHbG9iYWxWYXJpYWJsZT4oQ0UtPmdldE9wZXJhbmQoMCkpOworICAgICAgaWYgKEdWLT5oYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIoKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50Rm9sZExvYWRUaHJvdWdoR0VQQ29uc3RhbnRFeHByKEdWLT5nZXRJbml0aWFsaXplcigpLCBDRSk7CisgICAgfQorCisgIHJldHVybiAwOyAgLy8gZG9uJ3Qga25vdyBob3cgdG8gZXZhbHVhdGUuCit9CisKKy8vLyBFdmFsdWF0ZUZ1bmN0aW9uIC0gRXZhbHVhdGUgYSBjYWxsIHRvIGZ1bmN0aW9uIEYsIHJldHVybmluZyB0cnVlIGlmCisvLy8gc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgd2UgY2FuJ3QgZXZhbHVhdGUgaXQuICBBY3R1YWxBcmdzIGNvbnRhaW5zIHRoZSBmb3JtYWwKKy8vLyBhcmd1bWVudHMgZm9yIHRoZSBmdW5jdGlvbi4KK3N0YXRpYyBib29sIEV2YWx1YXRlRnVuY3Rpb24oRnVuY3Rpb24gKkYsIENvbnN0YW50IComUmV0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8Q29uc3RhbnQqPiAmQWN0dWFsQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RnVuY3Rpb24qPiAmQ2FsbFN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxDb25zdGFudCosIENvbnN0YW50Kj4gJk11dGF0ZWRNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEdsb2JhbFZhcmlhYmxlKj4gJkFsbG9jYVRtcHMpIHsKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgZnVuY3Rpb24gaXMgYWxyZWFkeSBleGVjdXRpbmcgKHJlY3Vyc2lvbikuICBJZiBzbywKKyAgLy8gYmFpbCBvdXQuICBUT0RPOiB3ZSBtaWdodCB3YW50IHRvIGFjY2VwdCBsaW1pdGVkIHJlY3Vyc2lvbi4KKyAgaWYgKHN0ZDo6ZmluZChDYWxsU3RhY2suYmVnaW4oKSwgQ2FsbFN0YWNrLmVuZCgpLCBGKSAhPSBDYWxsU3RhY2suZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgQ2FsbFN0YWNrLnB1c2hfYmFjayhGKTsKKyAgCisgIC8vLyBWYWx1ZXMgLSBBcyB3ZSBjb21wdXRlIFNTQSByZWdpc3RlciB2YWx1ZXMsIHdlIHN0b3JlIHRoZWlyIGNvbnRlbnRzIGhlcmUuCisgIERlbnNlTWFwPFZhbHVlKiwgQ29uc3RhbnQqPiBWYWx1ZXM7CisgIAorICAvLyBJbml0aWFsaXplIGFyZ3VtZW50cyB0byB0aGUgaW5jb21pbmcgdmFsdWVzIHNwZWNpZmllZC4KKyAgdW5zaWduZWQgQXJnTm8gPSAwOworICBmb3IgKEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgQUkgPSBGLT5hcmdfYmVnaW4oKSwgRSA9IEYtPmFyZ19lbmQoKTsgQUkgIT0gRTsKKyAgICAgICArK0FJLCArK0FyZ05vKQorICAgIFZhbHVlc1tBSV0gPSBBY3R1YWxBcmdzW0FyZ05vXTsKKworICAvLy8gRXhlY3V0ZWRCbG9ja3MgLSBXZSBvbmx5IGhhbmRsZSBub24tbG9vcGluZywgbm9uLXJlY3Vyc2l2ZSBjb2RlLiAgQXMgc3VjaCwKKyAgLy8vIHdlIGNhbiBvbmx5IGV2YWx1YXRlIGFueSBvbmUgYmFzaWMgYmxvY2sgYXQgbW9zdCBvbmNlLiAgVGhpcyBzZXQga2VlcHMKKyAgLy8vIHRyYWNrIG9mIHdoYXQgd2UgaGF2ZSBleGVjdXRlZCBzbyB3ZSBjYW4gZGV0ZWN0IHJlY3Vyc2l2ZSBjYXNlcyBldGMuCisgIFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sqLCAzMj4gRXhlY3V0ZWRCbG9ja3M7CisgIAorICAvLyBDdXJJbnN0IC0gVGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd2UncmUgZXZhbHVhdGluZy4KKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQ3VySW5zdCA9IEYtPmJlZ2luKCktPmJlZ2luKCk7CisgIAorICAvLyBUaGlzIGlzIHRoZSBtYWluIGV2YWx1YXRpb24gbG9vcC4KKyAgd2hpbGUgKDEpIHsKKyAgICBDb25zdGFudCAqSW5zdFJlc3VsdCA9IDA7CisgICAgCisgICAgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEN1ckluc3QpKSB7CisgICAgICBpZiAoU0ktPmlzVm9sYXRpbGUoKSkgcmV0dXJuIGZhbHNlOyAgLy8gbm8gdm9sYXRpbGUgYWNjZXNzZXMuCisgICAgICBDb25zdGFudCAqUHRyID0gZ2V0VmFsKFZhbHVlcywgU0ktPmdldE9wZXJhbmQoMSkpOworICAgICAgaWYgKCFpc1NpbXBsZUVub3VnaFBvaW50ZXJUb0NvbW1pdChQdHIpKQorICAgICAgICAvLyBJZiB0aGlzIGlzIHRvbyBjb21wbGV4IGZvciB1cyB0byBjb21taXQsIHJlamVjdCBpdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgQ29uc3RhbnQgKlZhbCA9IGdldFZhbChWYWx1ZXMsIFNJLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIE11dGF0ZWRNZW1vcnlbUHRyXSA9IFZhbDsKKyAgICB9IGVsc2UgaWYgKEJpbmFyeU9wZXJhdG9yICpCTyA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihDdXJJbnN0KSkgeworICAgICAgSW5zdFJlc3VsdCA9IENvbnN0YW50RXhwcjo6Z2V0KEJPLT5nZXRPcGNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWwoVmFsdWVzLCBCTy0+Z2V0T3BlcmFuZCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsKFZhbHVlcywgQk8tPmdldE9wZXJhbmQoMSkpKTsKKyAgICB9IGVsc2UgaWYgKENtcEluc3QgKkNJID0gZHluX2Nhc3Q8Q21wSW5zdD4oQ3VySW5zdCkpIHsKKyAgICAgIEluc3RSZXN1bHQgPSBDb25zdGFudEV4cHI6OmdldENvbXBhcmUoQ0ktPmdldFByZWRpY2F0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWwoVmFsdWVzLCBDSS0+Z2V0T3BlcmFuZCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbChWYWx1ZXMsIENJLT5nZXRPcGVyYW5kKDEpKSk7CisgICAgfSBlbHNlIGlmIChDYXN0SW5zdCAqQ0kgPSBkeW5fY2FzdDxDYXN0SW5zdD4oQ3VySW5zdCkpIHsKKyAgICAgIEluc3RSZXN1bHQgPSBDb25zdGFudEV4cHI6OmdldENhc3QoQ0ktPmdldE9wY29kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWwoVmFsdWVzLCBDSS0+Z2V0T3BlcmFuZCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJLT5nZXRUeXBlKCkpOworICAgIH0gZWxzZSBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihDdXJJbnN0KSkgeworICAgICAgSW5zdFJlc3VsdCA9IENvbnN0YW50RXhwcjo6Z2V0U2VsZWN0KGdldFZhbChWYWx1ZXMsIFNJLT5nZXRPcGVyYW5kKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWwoVmFsdWVzLCBTSS0+Z2V0T3BlcmFuZCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsKFZhbHVlcywgU0ktPmdldE9wZXJhbmQoMikpKTsKKyAgICB9IGVsc2UgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oQ3VySW5zdCkpIHsKKyAgICAgIENvbnN0YW50ICpQID0gZ2V0VmFsKFZhbHVlcywgR0VQLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgOD4gR0VQT3BzOworICAgICAgZm9yIChVc2VyOjpvcF9pdGVyYXRvciBpID0gR0VQLT5vcF9iZWdpbigpICsgMSwgZSA9IEdFUC0+b3BfZW5kKCk7CisgICAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgICBHRVBPcHMucHVzaF9iYWNrKGdldFZhbChWYWx1ZXMsICppKSk7CisgICAgICBJbnN0UmVzdWx0ID0gY2FzdDxHRVBPcGVyYXRvcj4oR0VQKS0+aXNJbkJvdW5kcygpID8KKyAgICAgICAgICBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihQLCAmR0VQT3BzWzBdLCBHRVBPcHMuc2l6ZSgpKSA6CisgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKFAsICZHRVBPcHNbMF0sIEdFUE9wcy5zaXplKCkpOworICAgIH0gZWxzZSBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KEN1ckluc3QpKSB7CisgICAgICBpZiAoTEktPmlzVm9sYXRpbGUoKSkgcmV0dXJuIGZhbHNlOyAgLy8gbm8gdm9sYXRpbGUgYWNjZXNzZXMuCisgICAgICBJbnN0UmVzdWx0ID0gQ29tcHV0ZUxvYWRSZXN1bHQoZ2V0VmFsKFZhbHVlcywgTEktPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11dGF0ZWRNZW1vcnkpOworICAgICAgaWYgKEluc3RSZXN1bHQgPT0gMCkgcmV0dXJuIGZhbHNlOyAvLyBDb3VsZCBub3QgZXZhbHVhdGUgbG9hZC4KKyAgICB9IGVsc2UgaWYgKEFsbG9jYUluc3QgKkFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oQ3VySW5zdCkpIHsKKyAgICAgIGlmIChBSS0+aXNBcnJheUFsbG9jYXRpb24oKSkgcmV0dXJuIGZhbHNlOyAgLy8gQ2Fubm90IGhhbmRsZSBhcnJheSBhbGxvY3MuCisgICAgICBjb25zdCBUeXBlICpUeSA9IEFJLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICBBbGxvY2FUbXBzLnB1c2hfYmFjayhuZXcgR2xvYmFsVmFyaWFibGUoVHksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZWZWYWx1ZTo6Z2V0KFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSS0+Z2V0TmFtZSgpKSk7CisgICAgICBJbnN0UmVzdWx0ID0gQWxsb2NhVG1wcy5iYWNrKCk7ICAgICAKKyAgICB9IGVsc2UgaWYgKENhbGxJbnN0ICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PihDdXJJbnN0KSkgeworCisgICAgICAvLyBEZWJ1ZyBpbmZvIGNhbiBzYWZlbHkgYmUgaWdub3JlZCBoZXJlLgorICAgICAgaWYgKGlzYTxEYmdJbmZvSW50cmluc2ljPihDSSkpIHsKKyAgICAgICAgKytDdXJJbnN0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gQ2Fubm90IGhhbmRsZSBpbmxpbmUgYXNtLgorICAgICAgaWYgKGlzYTxJbmxpbmVBc20+KENJLT5nZXRDYWxsZWRWYWx1ZSgpKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBSZXNvbHZlIGZ1bmN0aW9uIHBvaW50ZXJzLgorICAgICAgRnVuY3Rpb24gKkNhbGxlZSA9IGR5bl9jYXN0PEZ1bmN0aW9uPihnZXRWYWwoVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ktPmdldENhbGxlZFZhbHVlKCkpKTsKKyAgICAgIGlmICghQ2FsbGVlKSByZXR1cm4gZmFsc2U7ICAvLyBDYW5ub3QgcmVzb2x2ZS4KKworICAgICAgU21hbGxWZWN0b3I8Q29uc3RhbnQqLCA4PiBGb3JtYWxzOworICAgICAgQ2FsbFNpdGUgQ1MoQ0kpOworICAgICAgZm9yIChVc2VyOjpvcF9pdGVyYXRvciBpID0gQ1MuYXJnX2JlZ2luKCksIGUgPSBDUy5hcmdfZW5kKCk7CisgICAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgICBGb3JtYWxzLnB1c2hfYmFjayhnZXRWYWwoVmFsdWVzLCAqaSkpOworCisgICAgICBpZiAoQ2FsbGVlLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIHdlIGNhbiBjb25zdGFudCBmb2xkLCBkbyBpdC4KKyAgICAgICAgaWYgKENvbnN0YW50ICpDID0gQ29uc3RhbnRGb2xkQ2FsbChDYWxsZWUsIEZvcm1hbHMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hbHMuc2l6ZSgpKSkgeworICAgICAgICAgIEluc3RSZXN1bHQgPSBDOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKENhbGxlZS0+Z2V0RnVuY3Rpb25UeXBlKCktPmlzVmFyQXJnKCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgQ29uc3RhbnQgKlJldFZhbDsKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgY2FsbCwgaWYgc3VjY2Vzc2Z1bCwgdXNlIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICAgIGlmICghRXZhbHVhdGVGdW5jdGlvbihDYWxsZWUsIFJldFZhbCwgRm9ybWFscywgQ2FsbFN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0YXRlZE1lbW9yeSwgQWxsb2NhVG1wcykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBJbnN0UmVzdWx0ID0gUmV0VmFsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNhPFRlcm1pbmF0b3JJbnN0PihDdXJJbnN0KSkgeworICAgICAgQmFzaWNCbG9jayAqTmV3QkIgPSAwOworICAgICAgaWYgKEJyYW5jaEluc3QgKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oQ3VySW5zdCkpIHsKKyAgICAgICAgaWYgKEJJLT5pc1VuY29uZGl0aW9uYWwoKSkgeworICAgICAgICAgIE5ld0JCID0gQkktPmdldFN1Y2Nlc3NvcigwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDb25zdGFudEludCAqQ29uZCA9CisgICAgICAgICAgICBkeW5fY2FzdDxDb25zdGFudEludD4oZ2V0VmFsKFZhbHVlcywgQkktPmdldENvbmRpdGlvbigpKSk7CisgICAgICAgICAgaWYgKCFDb25kKSByZXR1cm4gZmFsc2U7ICAvLyBDYW5ub3QgZGV0ZXJtaW5lLgorCisgICAgICAgICAgTmV3QkIgPSBCSS0+Z2V0U3VjY2Vzc29yKCFDb25kLT5nZXRaRXh0VmFsdWUoKSk7ICAgICAgICAgIAorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKFN3aXRjaEluc3QgKlNJID0gZHluX2Nhc3Q8U3dpdGNoSW5zdD4oQ3VySW5zdCkpIHsKKyAgICAgICAgQ29uc3RhbnRJbnQgKlZhbCA9CisgICAgICAgICAgZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KGdldFZhbChWYWx1ZXMsIFNJLT5nZXRDb25kaXRpb24oKSkpOworICAgICAgICBpZiAoIVZhbCkgcmV0dXJuIGZhbHNlOyAgLy8gQ2Fubm90IGRldGVybWluZS4KKyAgICAgICAgTmV3QkIgPSBTSS0+Z2V0U3VjY2Vzc29yKFNJLT5maW5kQ2FzZVZhbHVlKFZhbCkpOworICAgICAgfSBlbHNlIGlmIChJbmRpcmVjdEJySW5zdCAqSUJJID0gZHluX2Nhc3Q8SW5kaXJlY3RCckluc3Q+KEN1ckluc3QpKSB7CisgICAgICAgIFZhbHVlICpWYWwgPSBnZXRWYWwoVmFsdWVzLCBJQkktPmdldEFkZHJlc3MoKSktPnN0cmlwUG9pbnRlckNhc3RzKCk7CisgICAgICAgIGlmIChCbG9ja0FkZHJlc3MgKkJBID0gZHluX2Nhc3Q8QmxvY2tBZGRyZXNzPihWYWwpKQorICAgICAgICAgIE5ld0JCID0gQkEtPmdldEJhc2ljQmxvY2soKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIENhbm5vdCBkZXRlcm1pbmUuCisgICAgICB9IGVsc2UgaWYgKFJldHVybkluc3QgKlJJID0gZHluX2Nhc3Q8UmV0dXJuSW5zdD4oQ3VySW5zdCkpIHsKKyAgICAgICAgaWYgKFJJLT5nZXROdW1PcGVyYW5kcygpKQorICAgICAgICAgIFJldFZhbCA9IGdldFZhbChWYWx1ZXMsIFJJLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgCisgICAgICAgIENhbGxTdGFjay5wb3BfYmFjaygpOyAgLy8gcmV0dXJuIGZyb20gZm4uCisgICAgICAgIHJldHVybiB0cnVlOyAgLy8gV2Ugc3VjY2VlZGVkIGF0IGV2YWx1YXRpbmcgdGhpcyBjdG9yIQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gaW52b2tlLCB1bndpbmQsIHVucmVhY2hhYmxlLgorICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBDYW5ub3QgaGFuZGxlIHRoaXMgdGVybWluYXRvci4KKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gT2theSwgd2Ugc3VjY2VlZGVkIGluIGV2YWx1YXRpbmcgdGhpcyBjb250cm9sIGZsb3cuICBTZWUgaWYgd2UgaGF2ZQorICAgICAgLy8gZXhlY3V0ZWQgdGhlIG5ldyBibG9jayBiZWZvcmUuICBJZiBzbywgd2UgaGF2ZSBhIGxvb3BpbmcgZnVuY3Rpb24sCisgICAgICAvLyB3aGljaCB3ZSBjYW5ub3QgZXZhbHVhdGUgaW4gcmVhc29uYWJsZSB0aW1lLgorICAgICAgaWYgKCFFeGVjdXRlZEJsb2Nrcy5pbnNlcnQoTmV3QkIpKQorICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBsb29wZWQhCisgICAgICAKKyAgICAgIC8vIE9rYXksIHdlIGhhdmUgbmV2ZXIgYmVlbiBpbiB0aGlzIGJsb2NrIGJlZm9yZS4gIENoZWNrIHRvIHNlZSBpZiB0aGVyZQorICAgICAgLy8gYXJlIGFueSBQSEkgbm9kZXMuICBJZiBzbywgZXZhbHVhdGUgdGhlbSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlCisgICAgICAvLyB3ZSBjYW1lIGZyb20uCisgICAgICBCYXNpY0Jsb2NrICpPbGRCQiA9IEN1ckluc3QtPmdldFBhcmVudCgpOworICAgICAgQ3VySW5zdCA9IE5ld0JCLT5iZWdpbigpOworICAgICAgUEhJTm9kZSAqUE47CisgICAgICBmb3IgKDsgKFBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oQ3VySW5zdCkpOyArK0N1ckluc3QpCisgICAgICAgIFZhbHVlc1tQTl0gPSBnZXRWYWwoVmFsdWVzLCBQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKE9sZEJCKSk7CisKKyAgICAgIC8vIERvIE5PVCBpbmNyZW1lbnQgQ3VySW5zdC4gIFdlIGtub3cgdGhhdCB0aGUgdGVybWluYXRvciBoYWQgbm8gdmFsdWUuCisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRGlkIG5vdCBrbm93IGhvdyB0byBldmFsdWF0ZSB0aGlzIQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBpZiAoIUN1ckluc3QtPnVzZV9lbXB0eSgpKQorICAgICAgVmFsdWVzW0N1ckluc3RdID0gSW5zdFJlc3VsdDsKKyAgICAKKyAgICAvLyBBZHZhbmNlIHByb2dyYW0gY291bnRlci4KKyAgICArK0N1ckluc3Q7CisgIH0KK30KKworLy8vIEV2YWx1YXRlU3RhdGljQ29uc3RydWN0b3IgLSBFdmFsdWF0ZSBzdGF0aWMgY29uc3RydWN0b3JzIGluIHRoZSBmdW5jdGlvbiwgaWYKKy8vLyB3ZSBjYW4uICBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4sIGZhbHNlIG90aGVyd2lzZS4KK3N0YXRpYyBib29sIEV2YWx1YXRlU3RhdGljQ29uc3RydWN0b3IoRnVuY3Rpb24gKkYpIHsKKyAgLy8vIE11dGF0ZWRNZW1vcnkgLSBGb3IgZWFjaCBzdG9yZSB3ZSBleGVjdXRlLCB3ZSB1cGRhdGUgdGhpcyBtYXAuICBMb2FkcworICAvLy8gY2hlY2sgdGhpcyB0byBnZXQgdGhlIG1vc3QgdXAtdG8tZGF0ZSB2YWx1ZS4gIElmIGV2YWx1YXRpb24gaXMgc3VjY2Vzc2Z1bCwKKyAgLy8vIHRoaXMgc3RhdGUgaXMgY29tbWl0dGVkIHRvIHRoZSBwcm9jZXNzLgorICBEZW5zZU1hcDxDb25zdGFudCosIENvbnN0YW50Kj4gTXV0YXRlZE1lbW9yeTsKKworICAvLy8gQWxsb2NhVG1wcyAtIFRvICdleGVjdXRlJyBhbiBhbGxvY2EsIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBnbG9iYWwgdmFyaWFibGUKKyAgLy8vIHRvIHJlcHJlc2VudCBpdHMgYm9keS4gIFRoaXMgdmVjdG9yIGlzIG5lZWRlZCBzbyB3ZSBjYW4gZGVsZXRlIHRoZQorICAvLy8gdGVtcG9yYXJ5IGdsb2JhbHMgd2hlbiB3ZSBhcmUgZG9uZS4KKyAgc3RkOjp2ZWN0b3I8R2xvYmFsVmFyaWFibGUqPiBBbGxvY2FUbXBzOworICAKKyAgLy8vIENhbGxTdGFjayAtIFRoaXMgaXMgdXNlZCB0byBkZXRlY3QgcmVjdXJzaW9uLiAgSW4gcGF0aG9sb2dpY2FsIHNpdHVhdGlvbnMKKyAgLy8vIHdlIGNvdWxkIGhpdCBleHBvbmVudGlhbCBiZWhhdmlvciwgYnV0IGF0IGxlYXN0IHRoZXJlIGlzIG5vdGhpbmcKKyAgLy8vIHVuYm91bmRlZC4KKyAgc3RkOjp2ZWN0b3I8RnVuY3Rpb24qPiBDYWxsU3RhY2s7CisKKyAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24uCisgIENvbnN0YW50ICpSZXRWYWxEdW1teTsKKyAgYm9vbCBFdmFsU3VjY2VzcyA9IEV2YWx1YXRlRnVuY3Rpb24oRiwgUmV0VmFsRHVtbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgMD4oKSwgQ2FsbFN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRhdGVkTWVtb3J5LCBBbGxvY2FUbXBzKTsKKyAgaWYgKEV2YWxTdWNjZXNzKSB7CisgICAgLy8gV2Ugc3VjY2VlZGVkIGF0IGV2YWx1YXRpb246IGNvbW1pdCB0aGUgcmVzdWx0LgorICAgIERFQlVHKGRiZ3MoKSA8PCAiRlVMTFkgRVZBTFVBVEVEIEdMT0JBTCBDVE9SIEZVTkNUSU9OICciCisgICAgICAgICAgPDwgRi0+Z2V0TmFtZSgpIDw8ICInIHRvICIgPDwgTXV0YXRlZE1lbW9yeS5zaXplKCkKKyAgICAgICAgICA8PCAiIHN0b3Jlcy5cbiIpOworICAgIGZvciAoRGVuc2VNYXA8Q29uc3RhbnQqLCBDb25zdGFudCo+OjppdGVyYXRvciBJID0gTXV0YXRlZE1lbW9yeS5iZWdpbigpLAorICAgICAgICAgRSA9IE11dGF0ZWRNZW1vcnkuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgQ29tbWl0VmFsdWVUbyhJLT5zZWNvbmQsIEktPmZpcnN0KTsKKyAgfQorICAKKyAgLy8gQXQgdGhpcyBwb2ludCwgd2UgYXJlIGRvbmUgaW50ZXJwcmV0aW5nLiAgSWYgd2UgY3JlYXRlZCBhbnkgJ2FsbG9jYScKKyAgLy8gdGVtcG9yYXJpZXMsIHJlbGVhc2UgdGhlbSBub3cuCisgIHdoaWxlICghQWxsb2NhVG1wcy5lbXB0eSgpKSB7CisgICAgR2xvYmFsVmFyaWFibGUgKlRtcCA9IEFsbG9jYVRtcHMuYmFjaygpOworICAgIEFsbG9jYVRtcHMucG9wX2JhY2soKTsKKyAgICAKKyAgICAvLyBJZiB0aGVyZSBhcmUgc3RpbGwgdXNlcnMgb2YgdGhlIGFsbG9jYSwgdGhlIHByb2dyYW0gaXMgZG9pbmcgc29tZXRoaW5nCisgICAgLy8gc2lsbHksIGUuZy4gc3RvcmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgYWxsb2NhIHNvbWV3aGVyZSBhbmQgdXNpbmcgaXQKKyAgICAvLyBsYXRlci4gIFNpbmNlIHRoaXMgaXMgdW5kZWZpbmVkLCB3ZSdsbCBqdXN0IG1ha2UgaXQgYmUgbnVsbC4KKyAgICBpZiAoIVRtcC0+dXNlX2VtcHR5KCkpCisgICAgICBUbXAtPnJlcGxhY2VBbGxVc2VzV2l0aChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFRtcC0+Z2V0VHlwZSgpKSk7CisgICAgZGVsZXRlIFRtcDsKKyAgfQorICAKKyAgcmV0dXJuIEV2YWxTdWNjZXNzOworfQorCisKKworLy8vIE9wdGltaXplR2xvYmFsQ3RvcnNMaXN0IC0gU2ltcGxpZnkgYW5kIGV2YWx1YXRpb24gZ2xvYmFsIGN0b3JzIGlmIHBvc3NpYmxlLgorLy8vIFJldHVybiB0cnVlIGlmIGFueXRoaW5nIGNoYW5nZWQuCitib29sIEdsb2JhbE9wdDo6T3B0aW1pemVHbG9iYWxDdG9yc0xpc3QoR2xvYmFsVmFyaWFibGUgKiZHQ0wpIHsKKyAgc3RkOjp2ZWN0b3I8RnVuY3Rpb24qPiBDdG9ycyA9IFBhcnNlR2xvYmFsQ3RvcnMoR0NMKTsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIGlmIChDdG9ycy5lbXB0eSgpKSByZXR1cm4gZmFsc2U7CisgIAorICAvLyBMb29wIG92ZXIgZ2xvYmFsIGN0b3JzLCBvcHRpbWl6aW5nIHRoZW0gd2hlbiB3ZSBjYW4uCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gQ3RvcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBGdW5jdGlvbiAqRiA9IEN0b3JzW2ldOworICAgIC8vIEZvdW5kIGEgbnVsbCB0ZXJtaW5hdG9yIGluIHRoZSBtaWRkbGUgb2YgdGhlIGxpc3QsIHBydW5lIG9mZiB0aGUgcmVzdCBvZgorICAgIC8vIHRoZSBsaXN0LgorICAgIGlmIChGID09IDApIHsKKyAgICAgIGlmIChpICE9IEN0b3JzLnNpemUoKS0xKSB7CisgICAgICAgIEN0b3JzLnJlc2l6ZShpKzEpOworICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICAvLyBXZSBjYW5ub3Qgc2ltcGxpZnkgZXh0ZXJuYWwgY3RvciBmdW5jdGlvbnMuCisgICAgaWYgKEYtPmVtcHR5KCkpIGNvbnRpbnVlOworICAgIAorICAgIC8vIElmIHdlIGNhbiBldmFsdWF0ZSB0aGUgY3RvciBhdCBjb21waWxlIHRpbWUsIGRvLgorICAgIGlmIChFdmFsdWF0ZVN0YXRpY0NvbnN0cnVjdG9yKEYpKSB7CisgICAgICBDdG9ycy5lcmFzZShDdG9ycy5iZWdpbigpK2kpOworICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAtLWk7CisgICAgICArK051bUN0b3JzRXZhbHVhdGVkOworICAgICAgY29udGludWU7CisgICAgfQorICB9CisgIAorICBpZiAoIU1hZGVDaGFuZ2UpIHJldHVybiBmYWxzZTsKKyAgCisgIEdDTCA9IEluc3RhbGxHbG9iYWxDdG9ycyhHQ0wsIEN0b3JzKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR2xvYmFsT3B0OjpPcHRpbWl6ZUdsb2JhbEFsaWFzZXMoTW9kdWxlICZNKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIGZvciAoTW9kdWxlOjphbGlhc19pdGVyYXRvciBJID0gTS5hbGlhc19iZWdpbigpLCBFID0gTS5hbGlhc19lbmQoKTsKKyAgICAgICBJICE9IEU7KSB7CisgICAgTW9kdWxlOjphbGlhc19pdGVyYXRvciBKID0gSSsrOworICAgIC8vIEFsaWFzZXMgd2l0aG91dCBuYW1lcyBjYW5ub3QgYmUgcmVmZXJlbmNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlLgorICAgIGlmICghSi0+aGFzTmFtZSgpICYmICFKLT5pc0RlY2xhcmF0aW9uKCkpCisgICAgICBKLT5zZXRMaW5rYWdlKEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UpOworICAgIC8vIElmIHRoZSBhbGlhc2VlIG1heSBjaGFuZ2UgYXQgbGluayB0aW1lLCBub3RoaW5nIGNhbiBiZSBkb25lIC0gYmFpbCBvdXQuCisgICAgaWYgKEotPm1heUJlT3ZlcnJpZGRlbigpKQorICAgICAgY29udGludWU7CisKKyAgICBDb25zdGFudCAqQWxpYXNlZSA9IEotPmdldEFsaWFzZWUoKTsKKyAgICBHbG9iYWxWYWx1ZSAqVGFyZ2V0ID0gY2FzdDxHbG9iYWxWYWx1ZT4oQWxpYXNlZS0+c3RyaXBQb2ludGVyQ2FzdHMoKSk7CisgICAgVGFyZ2V0LT5yZW1vdmVEZWFkQ29uc3RhbnRVc2VycygpOworICAgIGJvb2wgaGFzT25lVXNlID0gVGFyZ2V0LT5oYXNPbmVVc2UoKSAmJiBBbGlhc2VlLT5oYXNPbmVVc2UoKTsKKworICAgIC8vIE1ha2UgYWxsIHVzZXJzIG9mIHRoZSBhbGlhcyB1c2UgdGhlIGFsaWFzZWUgaW5zdGVhZC4KKyAgICBpZiAoIUotPnVzZV9lbXB0eSgpKSB7CisgICAgICBKLT5yZXBsYWNlQWxsVXNlc1dpdGgoQWxpYXNlZSk7CisgICAgICArK051bUFsaWFzZXNSZXNvbHZlZDsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIElmIHRoZSBhbGlhcyBpcyBleHRlcm5hbGx5IHZpc2libGUsIHdlIG1heSBzdGlsbCBiZSBhYmxlIHRvIHNpbXBsaWZ5IGl0LgorICAgIGlmICghSi0+aGFzTG9jYWxMaW5rYWdlKCkpIHsKKyAgICAgIC8vIElmIHRoZSBhbGlhc2VlIGhhcyBpbnRlcm5hbCBsaW5rYWdlLCBnaXZlIGl0IHRoZSBuYW1lIGFuZCBsaW5rYWdlCisgICAgICAvLyBvZiB0aGUgYWxpYXMsIGFuZCBkZWxldGUgdGhlIGFsaWFzLiAgVGhpcyB0dXJuczoKKyAgICAgIC8vICAgZGVmaW5lIGludGVybmFsIC4uLiBAZiguLi4pCisgICAgICAvLyAgIEBhID0gYWxpYXMgLi4uIEBmCisgICAgICAvLyBpbnRvOgorICAgICAgLy8gICBkZWZpbmUgLi4uIEBhKC4uLikKKyAgICAgIGlmICghVGFyZ2V0LT5oYXNMb2NhbExpbmthZ2UoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIERvIG5vdCBwZXJmb3JtIHRoZSB0cmFuc2Zvcm0gaWYgbXVsdGlwbGUgYWxpYXNlcyBwb3RlbnRpYWxseSB0YXJnZXQgdGhlCisgICAgICAvLyBhbGlhc2VlLiBUaGlzIGNoZWNrIGFsc28gZW5zdXJlcyB0aGF0IGl0IGlzIHNhZmUgdG8gcmVwbGFjZSB0aGUgc2VjdGlvbgorICAgICAgLy8gYW5kIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGFsaWFzZWUgd2l0aCB0aG9zZSBvZiB0aGUgYWxpYXMuCisgICAgICBpZiAoIWhhc09uZVVzZSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIEdpdmUgdGhlIGFsaWFzZWUgdGhlIG5hbWUsIGxpbmthZ2UgYW5kIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGFsaWFzLgorICAgICAgVGFyZ2V0LT50YWtlTmFtZShKKTsKKyAgICAgIFRhcmdldC0+c2V0TGlua2FnZShKLT5nZXRMaW5rYWdlKCkpOworICAgICAgVGFyZ2V0LT5HbG9iYWxWYWx1ZTo6Y29weUF0dHJpYnV0ZXNGcm9tKEopOworICAgIH0KKworICAgIC8vIERlbGV0ZSB0aGUgYWxpYXMuCisgICAgTS5nZXRBbGlhc0xpc3QoKS5lcmFzZShKKTsKKyAgICArK051bUFsaWFzZXNSZW1vdmVkOworICAgIENoYW5nZWQgPSB0cnVlOworICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2Jvb2wgR2xvYmFsT3B0OjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIAorICAvLyBUcnkgdG8gZmluZCB0aGUgbGx2bS5nbG9iYWxjdG9ycyBsaXN0LgorICBHbG9iYWxWYXJpYWJsZSAqR2xvYmFsQ3RvcnMgPSBGaW5kR2xvYmFsQ3RvcnMoTSk7CisKKyAgYm9vbCBMb2NhbENoYW5nZSA9IHRydWU7CisgIHdoaWxlIChMb2NhbENoYW5nZSkgeworICAgIExvY2FsQ2hhbmdlID0gZmFsc2U7CisgICAgCisgICAgLy8gRGVsZXRlIGZ1bmN0aW9ucyB0aGF0IGFyZSB0cml2aWFsbHkgZGVhZCwgY2NjIC0+IGZhc3RjYworICAgIExvY2FsQ2hhbmdlIHw9IE9wdGltaXplRnVuY3Rpb25zKE0pOworICAgIAorICAgIC8vIE9wdGltaXplIGdsb2JhbF9jdG9ycyBsaXN0LgorICAgIGlmIChHbG9iYWxDdG9ycykKKyAgICAgIExvY2FsQ2hhbmdlIHw9IE9wdGltaXplR2xvYmFsQ3RvcnNMaXN0KEdsb2JhbEN0b3JzKTsKKyAgICAKKyAgICAvLyBPcHRpbWl6ZSBub24tYWRkcmVzcy10YWtlbiBnbG9iYWxzLgorICAgIExvY2FsQ2hhbmdlIHw9IE9wdGltaXplR2xvYmFsVmFycyhNKTsKKworICAgIC8vIFJlc29sdmUgYWxpYXNlcywgd2hlbiBwb3NzaWJsZS4KKyAgICBMb2NhbENoYW5nZSB8PSBPcHRpbWl6ZUdsb2JhbEFsaWFzZXMoTSk7CisgICAgQ2hhbmdlZCB8PSBMb2NhbENoYW5nZTsKKyAgfQorICAKKyAgLy8gVE9ETzogTW92ZSBhbGwgZ2xvYmFsIGN0b3JzIGZ1bmN0aW9ucyB0byB0aGUgZW5kIG9mIHRoZSBtb2R1bGUgZm9yIGNvZGUKKyAgLy8gbGF5b3V0LgorICAKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vSVBDb25zdGFudFByb3BhZ2F0aW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9JUENvbnN0YW50UHJvcGFnYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2NmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vSVBDb25zdGFudFByb3BhZ2F0aW9uLmNwcApAQCAtMCwwICsxLDI3NyBAQAorLy89PT0tLSBJUENvbnN0YW50UHJvcGFnYXRpb24uY3BwIC0gUHJvcGFnYXRlIGNvbnN0YW50cyB0aHJvdWdoIGNhbGxzIC0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaW1wbGVtZW50cyBhbiBfZXh0cmVtZWx5XyBzaW1wbGUgaW50ZXJwcm9jZWR1cmFsIGNvbnN0YW50CisvLyBwcm9wYWdhdGlvbiBwYXNzLiAgSXQgY291bGQgY2VydGFpbmx5IGJlIGltcHJvdmVkIGluIG1hbnkgZGlmZmVyZW50IHdheXMsCisvLyBsaWtlIHVzaW5nIGEgd29ya2xpc3QuICBUaGlzIHBhc3MgbWFrZXMgYXJndW1lbnRzIGRlYWQsIGJ1dCBkb2VzIG5vdCByZW1vdmUKKy8vIHRoZW0uICBUaGUgZXhpc3RpbmcgZGVhZCBhcmd1bWVudCBlbGltaW5hdGlvbiBwYXNzIHNob3VsZCBiZSBydW4gYWZ0ZXIgdGhpcworLy8gdG8gY2xlYW4gdXAgdGhlIG1lc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJpcGNvbnN0cHJvcCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9WYWx1ZVRyYWNraW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtQXJndW1lbnRzUHJvcGVkLCAiTnVtYmVyIG9mIGFyZ3MgdHVybmVkIGludG8gY29uc3RhbnRzIik7CitTVEFUSVNUSUMoTnVtUmV0dXJuVmFsUHJvcGVkLCAiTnVtYmVyIG9mIHJldHVybiB2YWx1ZXMgdHVybmVkIGludG8gY29uc3RhbnRzIik7CisKK25hbWVzcGFjZSB7CisgIC8vLyBJUENQIC0gVGhlIGludGVycHJvY2VkdXJhbCBjb25zdGFudCBwcm9wYWdhdGlvbiBwYXNzCisgIC8vLworICBzdHJ1Y3QgSVBDUCA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIElQQ1AoKSA6IE1vZHVsZVBhc3MoSUQpIHt9CisKKyAgICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSk7CisgIHByaXZhdGU6CisgICAgYm9vbCBQcm9wYWdhdGVDb25zdGFudHNJbnRvQXJndW1lbnRzKEZ1bmN0aW9uICZGKTsKKyAgICBib29sIFByb3BhZ2F0ZUNvbnN0YW50UmV0dXJuKEZ1bmN0aW9uICZGKTsKKyAgfTsKK30KKworY2hhciBJUENQOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoSVBDUCwgImlwY29uc3Rwcm9wIiwKKyAgICAgICAgICAgICAgICAiSW50ZXJwcm9jZWR1cmFsIGNvbnN0YW50IHByb3BhZ2F0aW9uIiwgZmFsc2UsIGZhbHNlKTsKKworTW9kdWxlUGFzcyAqbGx2bTo6Y3JlYXRlSVBDb25zdGFudFByb3BhZ2F0aW9uUGFzcygpIHsgcmV0dXJuIG5ldyBJUENQKCk7IH0KKworYm9vbCBJUENQOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGJvb2wgTG9jYWxDaGFuZ2UgPSB0cnVlOworCisgIC8vIEZJWE1FOiBpbnN0ZWFkIG9mIHVzaW5nIHNtYXJ0IGFsZ29yaXRobXMsIHdlIGp1c3QgaXRlcmF0ZSB1bnRpbCB3ZSBzdG9wCisgIC8vIG1ha2luZyBjaGFuZ2VzLgorICB3aGlsZSAoTG9jYWxDaGFuZ2UpIHsKKyAgICBMb2NhbENoYW5nZSA9IGZhbHNlOworICAgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoIUktPmlzRGVjbGFyYXRpb24oKSkgeworICAgICAgICAvLyBEZWxldGUgYW55IGtsaW5nb25zLgorICAgICAgICBJLT5yZW1vdmVEZWFkQ29uc3RhbnRVc2VycygpOworICAgICAgICBpZiAoSS0+aGFzTG9jYWxMaW5rYWdlKCkpCisgICAgICAgICAgTG9jYWxDaGFuZ2UgfD0gUHJvcGFnYXRlQ29uc3RhbnRzSW50b0FyZ3VtZW50cygqSSk7CisgICAgICAgIENoYW5nZWQgfD0gUHJvcGFnYXRlQ29uc3RhbnRSZXR1cm4oKkkpOworICAgICAgfQorICAgIENoYW5nZWQgfD0gTG9jYWxDaGFuZ2U7CisgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBQcm9wYWdhdGVDb25zdGFudHNJbnRvQXJndW1lbnRzIC0gTG9vayBhdCBhbGwgdXNlcyBvZiB0aGUgc3BlY2lmaWVkCisvLy8gZnVuY3Rpb24uICBJZiBhbGwgdXNlcyBhcmUgZGlyZWN0IGNhbGwgc2l0ZXMsIGFuZCBhbGwgcGFzcyBhIHBhcnRpY3VsYXIKKy8vLyBjb25zdGFudCBpbiBmb3IgYW4gYXJndW1lbnQsIHByb3BhZ2F0ZSB0aGF0IGNvbnN0YW50IGluIGFzIHRoZSBhcmd1bWVudC4KKy8vLworYm9vbCBJUENQOjpQcm9wYWdhdGVDb25zdGFudHNJbnRvQXJndW1lbnRzKEZ1bmN0aW9uICZGKSB7CisgIGlmIChGLmFyZ19lbXB0eSgpIHx8IEYudXNlX2VtcHR5KCkpIHJldHVybiBmYWxzZTsgLy8gTm8gYXJndW1lbnRzPyBFYXJseSBleGl0LgorCisgIC8vIEZvciBlYWNoIGFyZ3VtZW50LCBrZWVwIHRyYWNrIG9mIGl0cyBjb25zdGFudCB2YWx1ZSBhbmQgd2hldGhlciBpdCBpcyBhCisgIC8vIGNvbnN0YW50IG9yIG5vdC4gIFRoZSBib29sIGlzIGRyaXZlbiB0byB0cnVlIHdoZW4gZm91bmQgdG8gYmUgbm9uLWNvbnN0YW50LgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Q29uc3RhbnQqLCBib29sPiwgMTY+IEFyZ3VtZW50Q29uc3RhbnRzOworICBBcmd1bWVudENvbnN0YW50cy5yZXNpemUoRi5hcmdfc2l6ZSgpKTsKKworICB1bnNpZ25lZCBOdW1Ob25jb25zdGFudCA9IDA7CisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEYudXNlX2JlZ2luKCksIEUgPSBGLnVzZV9lbmQoKTsgVUkgIT0gRTsgKytVSSkgeworICAgIFVzZXIgKlUgPSAqVUk7CisgICAgLy8gSWdub3JlIGJsb2NrYWRkcmVzcyB1c2VzLgorICAgIGlmIChpc2E8QmxvY2tBZGRyZXNzPihVKSkgY29udGludWU7CisgICAgCisgICAgLy8gVXNlZCBieSBhIG5vbi1pbnN0cnVjdGlvbiwgb3Igbm90IHRoZSBjYWxsZWUgb2YgYSBmdW5jdGlvbiwgZG8gbm90CisgICAgLy8gdHJhbnNmb3JtLgorICAgIGlmICghaXNhPENhbGxJbnN0PihVKSAmJiAhaXNhPEludm9rZUluc3Q+KFUpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIENhbGxTaXRlIENTKGNhc3Q8SW5zdHJ1Y3Rpb24+KFUpKTsKKyAgICBpZiAoIUNTLmlzQ2FsbGVlKFVJKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIENoZWNrIG91dCBhbGwgb2YgdGhlIHBvdGVudGlhbGx5IGNvbnN0YW50IGFyZ3VtZW50cy4gIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgIC8vIGluc3BlY3QgdmFyYXJncyBoZXJlLgorICAgIENhbGxTaXRlOjphcmdfaXRlcmF0b3IgQUkgPSBDUy5hcmdfYmVnaW4oKTsKKyAgICBGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEFyZyA9IEYuYXJnX2JlZ2luKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ3VtZW50Q29uc3RhbnRzLnNpemUoKTsgaSAhPSBlOworICAgICAgICAgKytpLCArK0FJLCArK0FyZykgeworICAgICAgCisgICAgICAvLyBJZiB0aGlzIGFyZ3VtZW50IGlzIGtub3duIG5vbi1jb25zdGFudCwgaWdub3JlIGl0LgorICAgICAgaWYgKEFyZ3VtZW50Q29uc3RhbnRzW2ldLnNlY29uZCkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KCpBSSk7CisgICAgICBpZiAoQyAmJiBBcmd1bWVudENvbnN0YW50c1tpXS5maXJzdCA9PSAwKSB7CisgICAgICAgIEFyZ3VtZW50Q29uc3RhbnRzW2ldLmZpcnN0ID0gQzsgICAvLyBGaXJzdCBjb25zdGFudCBzZWVuLgorICAgICAgfSBlbHNlIGlmIChDICYmIEFyZ3VtZW50Q29uc3RhbnRzW2ldLmZpcnN0ID09IEMpIHsKKyAgICAgICAgLy8gU3RpbGwgdGhlIGNvbnN0YW50IHZhbHVlIHdlIHRoaW5rIGl0IGlzLgorICAgICAgfSBlbHNlIGlmICgqQUkgPT0gJipBcmcpIHsKKyAgICAgICAgLy8gSWdub3JlIHJlY3Vyc2l2ZSBjYWxscyBwYXNzaW5nIGFyZ3VtZW50IGRvd24uCisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBBcmd1bWVudCBiZWNhbWUgbm9uLWNvbnN0YW50LiAgSWYgYWxsIGFyZ3VtZW50cyBhcmUgbm9uLWNvbnN0YW50IG5vdywKKyAgICAgICAgLy8gZ2l2ZSB1cCBvbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBpZiAoKytOdW1Ob25jb25zdGFudCA9PSBBcmd1bWVudENvbnN0YW50cy5zaXplKCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBBcmd1bWVudENvbnN0YW50c1tpXS5zZWNvbmQgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIElmIHdlIGdvdCB0byB0aGlzIHBvaW50LCB0aGVyZSBpcyBhIGNvbnN0YW50IGFyZ3VtZW50IQorICBhc3NlcnQoTnVtTm9uY29uc3RhbnQgIT0gQXJndW1lbnRDb25zdGFudHMuc2l6ZSgpKTsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgQUkgPSBGLmFyZ19iZWdpbigpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJndW1lbnRDb25zdGFudHMuc2l6ZSgpOyBpICE9IGU7ICsraSwgKytBSSkgeworICAgIC8vIERvIHdlIGhhdmUgYSBjb25zdGFudCBhcmd1bWVudD8KKyAgICBpZiAoQXJndW1lbnRDb25zdGFudHNbaV0uc2Vjb25kIHx8IEFJLT51c2VfZW1wdHkoKSB8fAorICAgICAgICAoQUktPmhhc0J5VmFsQXR0cigpICYmICFGLm9ubHlSZWFkc01lbW9yeSgpKSkKKyAgICAgIGNvbnRpbnVlOworICAKKyAgICBWYWx1ZSAqViA9IEFyZ3VtZW50Q29uc3RhbnRzW2ldLmZpcnN0OworICAgIGlmIChWID09IDApIFYgPSBVbmRlZlZhbHVlOjpnZXQoQUktPmdldFR5cGUoKSk7CisgICAgQUktPnJlcGxhY2VBbGxVc2VzV2l0aChWKTsKKyAgICArK051bUFyZ3VtZW50c1Byb3BlZDsKKyAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgfQorICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworCisvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG9uZSBvciBtb3JlIGNvbnN0YW50cy4gSWYgc28sIHJlcGxhY2UKKy8vIGFsbCBjYWxsZXJzIHRoYXQgdXNlIHRob3NlIHJldHVybiB2YWx1ZXMgd2l0aCB0aGUgY29uc3RhbnQgdmFsdWUuIFRoaXMgd2lsbAorLy8gbGVhdmUgaW4gdGhlIGFjdHVhbCByZXR1cm4gdmFsdWVzIGFuZCBpbnN0cnVjdGlvbnMsIGJ1dCBkZWFkYXJnZWxpbSB3aWxsCisvLyBjbGVhbiB0aGF0IHVwLgorLy8KKy8vIEFkZGl0aW9uYWxseSBpZiBhIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIG9uZSBvZiBpdHMgYXJndW1lbnRzIGRpcmVjdGx5LAorLy8gY2FsbGVycyB3aWxsIGJlIHVwZGF0ZWQgdG8gdXNlIHRoZSB2YWx1ZSB0aGV5IHBhc3MgaW4gZGlyZWN0bHkgaW5zdGVhZCBvZgorLy8gdXNpbmcgdGhlIHJldHVybiB2YWx1ZS4KK2Jvb2wgSVBDUDo6UHJvcGFnYXRlQ29uc3RhbnRSZXR1cm4oRnVuY3Rpb24gJkYpIHsKKyAgaWYgKEYuZ2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeSgpKQorICAgIHJldHVybiBmYWxzZTsgLy8gTm8gcmV0dXJuIHZhbHVlLgorCisgIC8vIElmIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgb3ZlcnJpZGRlbiBsYXRlciBpbiB0aGUgbGluayBzdGFnZSwgd2UgY2FuJ3QKKyAgLy8gcHJvcGFnYXRlIGluZm9ybWF0aW9uIGFib3V0IGl0cyByZXN1bHRzIGludG8gY2FsbGVycy4KKyAgaWYgKEYubWF5QmVPdmVycmlkZGVuKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY29uc3RhbnQuCisgIFNtYWxsVmVjdG9yPFZhbHVlICosND4gUmV0VmFsczsKKyAgY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oRi5nZXRSZXR1cm5UeXBlKCkpOworICBpZiAoU1R5KQorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgPCBlOyArK2kpIAorICAgICAgUmV0VmFscy5wdXNoX2JhY2soVW5kZWZWYWx1ZTo6Z2V0KFNUeS0+Z2V0RWxlbWVudFR5cGUoaSkpKTsKKyAgZWxzZQorICAgIFJldFZhbHMucHVzaF9iYWNrKFVuZGVmVmFsdWU6OmdldChGLmdldFJldHVyblR5cGUoKSkpOworCisgIHVuc2lnbmVkIE51bU5vbkNvbnN0YW50ID0gMDsKKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBCQiAhPSBFOyArK0JCKQorICAgIGlmIChSZXR1cm5JbnN0ICpSSSA9IGR5bl9jYXN0PFJldHVybkluc3Q+KEJCLT5nZXRUZXJtaW5hdG9yKCkpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmV0VmFscy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIC8vIEFscmVhZHkgZm91bmQgY29uZmxpY3RpbmcgcmV0dXJuIHZhbHVlcz8KKyAgICAgICAgVmFsdWUgKlJWID0gUmV0VmFsc1tpXTsKKyAgICAgICAgaWYgKCFSVikKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBGaW5kIHRoZSByZXR1cm5lZCB2YWx1ZQorICAgICAgICBWYWx1ZSAqVjsKKyAgICAgICAgaWYgKCFTVHkpCisgICAgICAgICAgViA9IFJJLT5nZXRPcGVyYW5kKGkpOworICAgICAgICBlbHNlCisgICAgICAgICAgViA9IEZpbmRJbnNlcnRlZFZhbHVlKFJJLT5nZXRPcGVyYW5kKDApLCBpKTsKKworICAgICAgICBpZiAoVikgeworICAgICAgICAgIC8vIElnbm9yZSB1bmRlZnMsIHdlIGNhbiBjaGFuZ2UgdGhlbSBpbnRvIGFueXRoaW5nCisgICAgICAgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihWKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIAorICAgICAgICAgIC8vIFRyeSB0byBzZWUgaWYgYWxsIHRoZSByZXRzIHJldHVybiB0aGUgc2FtZSBjb25zdGFudCBvciBhcmd1bWVudC4KKyAgICAgICAgICBpZiAoaXNhPENvbnN0YW50PihWKSB8fCBpc2E8QXJndW1lbnQ+KFYpKSB7CisgICAgICAgICAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KFJWKSkgeworICAgICAgICAgICAgICAvLyBObyB2YWx1ZSBmb3VuZCB5ZXQ/IFRyeSB0aGUgY3VycmVudCBvbmUuCisgICAgICAgICAgICAgIFJldFZhbHNbaV0gPSBWOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJldHVybmluZyB0aGUgc2FtZSB2YWx1ZT8gR29vZC4KKyAgICAgICAgICAgIGlmIChSViA9PSBWKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRGlmZmVyZW50IG9yIG5vIGtub3duIHJldHVybiB2YWx1ZT8gRG9uJ3QgcHJvcGFnYXRlIHRoaXMgcmV0dXJuCisgICAgICAgIC8vIHZhbHVlLgorICAgICAgICBSZXRWYWxzW2ldID0gMDsKKyAgICAgICAgLy8gQWxsIHZhbHVlcyBub24gY29uc3RhbnQ/IFN0b3AgbG9va2luZy4KKyAgICAgICAgaWYgKCsrTnVtTm9uQ29uc3RhbnQgPT0gUmV0VmFscy5zaXplKCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYXQgbGVhc3Qgb25lIGNvbnN0YW50IHZhbHVlLiAgTG9vcAorICAvLyBvdmVyIGFsbCB1c2VycywgcmVwbGFjaW5nIGFueSB1c2VzIG9mIHRoZSByZXR1cm4gdmFsdWUgd2l0aCB0aGUgcmV0dXJuZWQKKyAgLy8gY29uc3RhbnQuCisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBGLnVzZV9iZWdpbigpLCBFID0gRi51c2VfZW5kKCk7IFVJICE9IEU7ICsrVUkpIHsKKyAgICBDYWxsU2l0ZSBDUygqVUkpOworICAgIEluc3RydWN0aW9uKiBDYWxsID0gQ1MuZ2V0SW5zdHJ1Y3Rpb24oKTsKKworICAgIC8vIE5vdCBhIGNhbGwgaW5zdHJ1Y3Rpb24gb3IgYSBjYWxsIGluc3RydWN0aW9uIHRoYXQncyBub3QgY2FsbGluZyBGCisgICAgLy8gZGlyZWN0bHk/CisgICAgaWYgKCFDYWxsIHx8ICFDUy5pc0NhbGxlZShVSSkpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAvLyBDYWxsIHJlc3VsdCBub3QgdXNlZD8KKyAgICBpZiAoQ2FsbC0+dXNlX2VtcHR5KCkpCisgICAgICBjb250aW51ZTsKKworICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworCisgICAgaWYgKFNUeSA9PSAwKSB7CisgICAgICBWYWx1ZSogTmV3ID0gUmV0VmFsc1swXTsKKyAgICAgIGlmIChBcmd1bWVudCAqQSA9IGR5bl9jYXN0PEFyZ3VtZW50PihOZXcpKQorICAgICAgICAvLyBXYXMgYW4gYXJndW1lbnQgcmV0dXJuZWQ/IFRoZW4gZmluZCB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudCBpbgorICAgICAgICAvLyB0aGUgY2FsbCBpbnN0cnVjdGlvbiBhbmQgdXNlIHRoYXQuCisgICAgICAgIE5ldyA9IENTLmdldEFyZ3VtZW50KEEtPmdldEFyZ05vKCkpOworICAgICAgQ2FsbC0+cmVwbGFjZUFsbFVzZXNXaXRoKE5ldyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAKKyAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgSSA9IENhbGwtPnVzZV9iZWdpbigpLCBFID0gQ2FsbC0+dXNlX2VuZCgpOworICAgICAgICAgSSAhPSBFOykgeworICAgICAgSW5zdHJ1Y3Rpb24gKklucyA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpJKTsKKworICAgICAgLy8gSW5jcmVtZW50IG5vdywgc28gd2UgY2FuIHJlbW92ZSB0aGUgdXNlCisgICAgICArK0k7CisKKyAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSByZXR2YWwgdG8gcmVwbGFjZSB3aXRoCisgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgIGlmIChFeHRyYWN0VmFsdWVJbnN0ICpFViA9IGR5bl9jYXN0PEV4dHJhY3RWYWx1ZUluc3Q+KElucykpCisgICAgICAgIGlmIChFVi0+aGFzSW5kaWNlcygpKQorICAgICAgICAgIGluZGV4ID0gKkVWLT5pZHhfYmVnaW4oKTsKKworICAgICAgLy8gSWYgdGhpcyB1c2UgdXNlcyBhIHNwZWNpZmljIHJldHVybiB2YWx1ZSwgYW5kIHdlIGhhdmUgYSByZXBsYWNlbWVudCwKKyAgICAgIC8vIHJlcGxhY2UgaXQuCisgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgVmFsdWUgKk5ldyA9IFJldFZhbHNbaW5kZXhdOworICAgICAgICBpZiAoTmV3KSB7CisgICAgICAgICAgaWYgKEFyZ3VtZW50ICpBID0gZHluX2Nhc3Q8QXJndW1lbnQ+KE5ldykpCisgICAgICAgICAgICAvLyBXYXMgYW4gYXJndW1lbnQgcmV0dXJuZWQ/IFRoZW4gZmluZCB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudCBpbgorICAgICAgICAgICAgLy8gdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gYW5kIHVzZSB0aGF0LgorICAgICAgICAgICAgTmV3ID0gQ1MuZ2V0QXJndW1lbnQoQS0+Z2V0QXJnTm8oKSk7CisgICAgICAgICAgSW5zLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3KTsKKyAgICAgICAgICBJbnMtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKE1hZGVDaGFuZ2UpICsrTnVtUmV0dXJuVmFsUHJvcGVkOworICByZXR1cm4gTWFkZUNoYW5nZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9JUE8uY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0lQTy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwYjcwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9JUE8uY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8vPT09LS0gU2NhbGFyLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEMgYmluZGluZ3MgZm9yIGxpYkxMVk1JUE8uYSwgd2hpY2ggaW1wbGVtZW50cworLy8gc2V2ZXJhbCB0cmFuc2Zvcm1hdGlvbnMgb3ZlciB0aGUgTExWTSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0tYy9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCit2b2lkIExMVk1BZGRBcmd1bWVudFByb21vdGlvblBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKSB7CisgIHVud3JhcChQTSktPmFkZChjcmVhdGVBcmd1bWVudFByb21vdGlvblBhc3MoKSk7Cit9CisKK3ZvaWQgTExWTUFkZENvbnN0YW50TWVyZ2VQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSkgeworICB1bndyYXAoUE0pLT5hZGQoY3JlYXRlQ29uc3RhbnRNZXJnZVBhc3MoKSk7Cit9CisKK3ZvaWQgTExWTUFkZERlYWRBcmdFbGltaW5hdGlvblBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKSB7CisgIHVud3JhcChQTSktPmFkZChjcmVhdGVEZWFkQXJnRWxpbWluYXRpb25QYXNzKCkpOworfQorCit2b2lkIExMVk1BZGREZWFkVHlwZUVsaW1pbmF0aW9uUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pIHsKKyAgdW53cmFwKFBNKS0+YWRkKGNyZWF0ZURlYWRUeXBlRWxpbWluYXRpb25QYXNzKCkpOworfQorCit2b2lkIExMVk1BZGRGdW5jdGlvbkF0dHJzUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pIHsKKyAgdW53cmFwKFBNKS0+YWRkKGNyZWF0ZUZ1bmN0aW9uQXR0cnNQYXNzKCkpOworfQorCit2b2lkIExMVk1BZGRGdW5jdGlvbklubGluaW5nUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pIHsKKyAgdW53cmFwKFBNKS0+YWRkKGNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzKCkpOworfQorCit2b2lkIExMVk1BZGRHbG9iYWxEQ0VQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSkgeworICB1bndyYXAoUE0pLT5hZGQoY3JlYXRlR2xvYmFsRENFUGFzcygpKTsKK30KKwordm9pZCBMTFZNQWRkR2xvYmFsT3B0aW1pemVyUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pIHsKKyAgdW53cmFwKFBNKS0+YWRkKGNyZWF0ZUdsb2JhbE9wdGltaXplclBhc3MoKSk7Cit9CisKK3ZvaWQgTExWTUFkZElQQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKSB7CisgIHVud3JhcChQTSktPmFkZChjcmVhdGVJUENvbnN0YW50UHJvcGFnYXRpb25QYXNzKCkpOworfQorCit2b2lkIExMVk1BZGRMb3dlclNldEptcFBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKSB7CisgIHVud3JhcChQTSktPmFkZChjcmVhdGVMb3dlclNldEptcFBhc3MoKSk7Cit9CisKK3ZvaWQgTExWTUFkZFBydW5lRUhQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSkgeworICB1bndyYXAoUE0pLT5hZGQoY3JlYXRlUHJ1bmVFSFBhc3MoKSk7Cit9CisKK3ZvaWQgTExWTUFkZElQU0NDUFBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKSB7CisgIHVud3JhcChQTSktPmFkZChjcmVhdGVJUFNDQ1BQYXNzKCkpOworfQorCit2b2lkIExMVk1BZGRJbnRlcm5hbGl6ZVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNLCB1bnNpZ25lZCBBbGxCdXRNYWluKSB7CisgIHVud3JhcChQTSktPmFkZChjcmVhdGVJbnRlcm5hbGl6ZVBhc3MoQWxsQnV0TWFpbiAhPSAwKSk7Cit9CisKKwordm9pZCBMTFZNQWRkUmFpc2VBbGxvY2F0aW9uc1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKSB7CisgIC8vIEZJWE1FOiBSZW1vdmUgaW4gTExWTSAzLjAuCit9CisKK3ZvaWQgTExWTUFkZFN0cmlwRGVhZFByb3RvdHlwZXNQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSkgeworICB1bndyYXAoUE0pLT5hZGQoY3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MoKSk7Cit9CisKK3ZvaWQgTExWTUFkZFN0cmlwU3ltYm9sc1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKSB7CisgIHVud3JhcChQTSktPmFkZChjcmVhdGVTdHJpcFN5bWJvbHNQYXNzKCkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0lubGluZUFsd2F5cy5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vSW5saW5lQWx3YXlzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M2MGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0lubGluZUFsd2F5cy5jcHAKQEAgLTAsMCArMSw4MCBAQAorLy89PT0tIElubGluZUFsd2F5cy5jcHAgLSBDb2RlIHRvIGlubGluZSBhbHdheXNfaW5saW5lIGZ1bmN0aW9ucyAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGN1c3RvbSBpbmxpbmVyIHRoYXQgaGFuZGxlcyBvbmx5IGZ1bmN0aW9ucyB0aGF0CisvLyBhcmUgbWFya2VkIGFzICJhbHdheXMgaW5saW5lIi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImlubGluZSIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbmxpbmVDb3N0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8vSW5saW5lclBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworICAvLyBBbHdheXNJbmxpbmVyIG9ubHkgaW5saW5lcyBmdW5jdGlvbnMgdGhhdCBhcmUgbWFyayBhcyAiYWx3YXlzIGlubGluZSIuCisgIGNsYXNzIEFsd2F5c0lubGluZXIgOiBwdWJsaWMgSW5saW5lciB7CisgICAgLy8gRnVuY3Rpb25zIHRoYXQgYXJlIG5ldmVyIGlubGluZWQKKyAgICBTbWFsbFB0clNldDxjb25zdCBGdW5jdGlvbiosIDE2PiBOZXZlcklubGluZTsgCisgICAgSW5saW5lQ29zdEFuYWx5emVyIENBOworICBwdWJsaWM6CisgICAgLy8gVXNlIGV4dHJlbWVseSBsb3cgdGhyZXNob2xkLiAKKyAgICBBbHdheXNJbmxpbmVyKCkgOiBJbmxpbmVyKElELCAtMjAwMDAwMDAwMCkge30KKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIElubGluZUNvc3QgZ2V0SW5saW5lQ29zdChDYWxsU2l0ZSBDUykgeworICAgICAgcmV0dXJuIENBLmdldElubGluZUNvc3QoQ1MsIE5ldmVySW5saW5lKTsKKyAgICB9CisgICAgZmxvYXQgZ2V0SW5saW5lRnVkZ2VGYWN0b3IoQ2FsbFNpdGUgQ1MpIHsKKyAgICAgIHJldHVybiBDQS5nZXRJbmxpbmVGdWRnZUZhY3RvcihDUyk7CisgICAgfQorICAgIHZvaWQgcmVzZXRDYWNoZWRDb3N0SW5mbyhGdW5jdGlvbiAqQ2FsbGVyKSB7CisgICAgICBDQS5yZXNldENhY2hlZENvc3RJbmZvKENhbGxlcik7CisgICAgfQorICAgIHZvaWQgZ3Jvd0NhY2hlZENvc3RJbmZvKEZ1bmN0aW9uKiBDYWxsZXIsIEZ1bmN0aW9uKiBDYWxsZWUpIHsKKyAgICAgIENBLmdyb3dDYWNoZWRDb3N0SW5mbyhDYWxsZXIsIENhbGxlZSk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBkb0ZpbmFsaXphdGlvbihDYWxsR3JhcGggJkNHKSB7IAorICAgICAgcmV0dXJuIHJlbW92ZURlYWRGdW5jdGlvbnMoQ0csICZOZXZlcklubGluZSk7IAorICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgZG9Jbml0aWFsaXphdGlvbihDYWxsR3JhcGggJkNHKTsKKyAgICB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7CisgICAgICBDQS5jbGVhcigpOworICAgIH0KKyAgfTsKK30KKworY2hhciBBbHdheXNJbmxpbmVyOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoQWx3YXlzSW5saW5lciwgImFsd2F5cy1pbmxpbmUiLAorICAgICAgICAgICAgICAgICJJbmxpbmVyIGZvciBhbHdheXNfaW5saW5lIGZ1bmN0aW9ucyIsIGZhbHNlLCBmYWxzZSk7CisKK1Bhc3MgKmxsdm06OmNyZWF0ZUFsd2F5c0lubGluZXJQYXNzKCkgeyByZXR1cm4gbmV3IEFsd2F5c0lubGluZXIoKTsgfQorCisvLyBkb0luaXRpYWxpemF0aW9uIC0gSW5pdGlhbGl6ZXMgdGhlIHZlY3RvciBvZiBmdW5jdGlvbnMgdGhhdCBoYXZlIG5vdCAKKy8vIGJlZW4gYW5ub3RhdGVkIHdpdGggdGhlICJhbHdheXMgaW5saW5lIiBhdHRyaWJ1dGUuCitib29sIEFsd2F5c0lubGluZXI6OmRvSW5pdGlhbGl6YXRpb24oQ2FsbEdyYXBoICZDRykgeworICBNb2R1bGUgJk0gPSBDRy5nZXRNb2R1bGUoKTsKKyAgCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBpZiAoIUktPmlzRGVjbGFyYXRpb24oKSAmJiAhSS0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6QWx3YXlzSW5saW5lKSkKKyAgICAgIE5ldmVySW5saW5lLmluc2VydChJKTsKKworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vSW5saW5lU2ltcGxlLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9JbmxpbmVTaW1wbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNjYzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vSW5saW5lU2ltcGxlLmNwcApAQCAtMCwwICsxLDExMSBAQAorLy89PT0tIElubGluZVNpbXBsZS5jcHAgLSBDb2RlIHRvIHBlcmZvcm0gc2ltcGxlIGZ1bmN0aW9uIGlubGluaW5nIC0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBib3R0b20tdXAgaW5saW5pbmcgb2YgZnVuY3Rpb25zIGludG8gY2FsbGVlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImlubGluZSIKKyNpbmNsdWRlICJsbHZtL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbmxpbmVDb3N0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8vSW5saW5lclBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworICBjbGFzcyBTaW1wbGVJbmxpbmVyIDogcHVibGljIElubGluZXIgeworICAgIC8vIEZ1bmN0aW9ucyB0aGF0IGFyZSBuZXZlciBpbmxpbmVkCisgICAgU21hbGxQdHJTZXQ8Y29uc3QgRnVuY3Rpb24qLCAxNj4gTmV2ZXJJbmxpbmU7IAorICAgIElubGluZUNvc3RBbmFseXplciBDQTsKKyAgcHVibGljOgorICAgIFNpbXBsZUlubGluZXIoKSA6IElubGluZXIoSUQpIHt9CisgICAgU2ltcGxlSW5saW5lcihpbnQgVGhyZXNob2xkKSA6IElubGluZXIoSUQsIFRocmVzaG9sZCkge30KKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIElubGluZUNvc3QgZ2V0SW5saW5lQ29zdChDYWxsU2l0ZSBDUykgeworICAgICAgcmV0dXJuIENBLmdldElubGluZUNvc3QoQ1MsIE5ldmVySW5saW5lKTsKKyAgICB9CisgICAgZmxvYXQgZ2V0SW5saW5lRnVkZ2VGYWN0b3IoQ2FsbFNpdGUgQ1MpIHsKKyAgICAgIHJldHVybiBDQS5nZXRJbmxpbmVGdWRnZUZhY3RvcihDUyk7CisgICAgfQorICAgIHZvaWQgcmVzZXRDYWNoZWRDb3N0SW5mbyhGdW5jdGlvbiAqQ2FsbGVyKSB7CisgICAgICBDQS5yZXNldENhY2hlZENvc3RJbmZvKENhbGxlcik7CisgICAgfQorICAgIHZvaWQgZ3Jvd0NhY2hlZENvc3RJbmZvKEZ1bmN0aW9uKiBDYWxsZXIsIEZ1bmN0aW9uKiBDYWxsZWUpIHsKKyAgICAgIENBLmdyb3dDYWNoZWRDb3N0SW5mbyhDYWxsZXIsIENhbGxlZSk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBkb0luaXRpYWxpemF0aW9uKENhbGxHcmFwaCAmQ0cpOworICAgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIHsKKyAgICAgIENBLmNsZWFyKCk7CisgICAgfQorICB9OworfQorCitjaGFyIFNpbXBsZUlubGluZXI6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhTaW1wbGVJbmxpbmVyLCAiaW5saW5lIiwKKyAgICAgICAgICAgICAgICAiRnVuY3Rpb24gSW50ZWdyYXRpb24vSW5saW5pbmciLCBmYWxzZSwgZmFsc2UpOworCitQYXNzICpsbHZtOjpjcmVhdGVGdW5jdGlvbklubGluaW5nUGFzcygpIHsgcmV0dXJuIG5ldyBTaW1wbGVJbmxpbmVyKCk7IH0KKworUGFzcyAqbGx2bTo6Y3JlYXRlRnVuY3Rpb25JbmxpbmluZ1Bhc3MoaW50IFRocmVzaG9sZCkgeyAKKyAgcmV0dXJuIG5ldyBTaW1wbGVJbmxpbmVyKFRocmVzaG9sZCk7Cit9CisKKy8vIGRvSW5pdGlhbGl6YXRpb24gLSBJbml0aWFsaXplcyB0aGUgdmVjdG9yIG9mIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbgorLy8gYW5ub3RhdGVkIHdpdGggdGhlIG5vaW5saW5lIGF0dHJpYnV0ZS4KK2Jvb2wgU2ltcGxlSW5saW5lcjo6ZG9Jbml0aWFsaXphdGlvbihDYWxsR3JhcGggJkNHKSB7CisgIAorICBNb2R1bGUgJk0gPSBDRy5nZXRNb2R1bGUoKTsKKyAgCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBpZiAoIUktPmlzRGVjbGFyYXRpb24oKSAmJiBJLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpOb0lubGluZSkpCisgICAgICBOZXZlcklubGluZS5pbnNlcnQoSSk7CisKKyAgLy8gR2V0IGxsdm0ubm9pbmxpbmUKKyAgR2xvYmFsVmFyaWFibGUgKkdWID0gTS5nZXROYW1lZEdsb2JhbCgibGx2bS5ub2lubGluZSIpOworICAKKyAgaWYgKEdWID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIERvbid0IGNyYXNoIG9uIGludmFsaWQgY29kZQorICBpZiAoIUdWLT5oYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBjb25zdCBDb25zdGFudEFycmF5ICpJbml0TGlzdCA9IGR5bl9jYXN0PENvbnN0YW50QXJyYXk+KEdWLT5nZXRJbml0aWFsaXplcigpKTsKKyAgCisgIGlmIChJbml0TGlzdCA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBlbGVtZW50IGFuZCBhZGQgdG8gdGhlIE5ldmVySW5saW5lIHNldAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5pdExpc3QtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIAorICAgIC8vIEdldCBTb3VyY2UKKyAgICBjb25zdCBDb25zdGFudCAqRWx0ID0gSW5pdExpc3QtPmdldE9wZXJhbmQoaSk7CisgICAgICAgIAorICAgIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihFbHQpKQorICAgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCkgCisgICAgICAgIEVsdCA9IENFLT5nZXRPcGVyYW5kKDApOworICAgIAorICAgIC8vIEluc2VydCBpbnRvIHNldCBvZiBmdW5jdGlvbnMgdG8gbmV2ZXIgaW5saW5lCisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uICpGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KEVsdCkpCisgICAgICBOZXZlcklubGluZS5pbnNlcnQoRik7CisgIH0KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0lubGluZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0lubGluZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODNlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vSW5saW5lci5jcHAKQEAgLTAsMCArMSw1NDggQEAKKy8vPT09LSBJbmxpbmVyLmNwcCAtIENvZGUgY29tbW9uIHRvIGFsbCBpbmxpbmVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIG1lY2hhbmljcyByZXF1aXJlZCB0byBpbXBsZW1lbnQgaW5saW5pbmcgd2l0aG91dAorLy8gbWlzc2luZyBhbnkgY2FsbHMgYW5kIHVwZGF0aW5nIHRoZSBjYWxsIGdyYXBoLiAgVGhlIGRlY2lzaW9ucyBvZiB3aGljaCBjYWxscworLy8gYXJlIHByb2ZpdGFibGUgdG8gaW5saW5lIGFyZSBpbXBsZW1lbnRlZCBlbHNld2hlcmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJpbmxpbmUiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbmxpbmVDb3N0LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8vSW5saW5lclBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvQ2xvbmluZy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSA8c2V0PgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1JbmxpbmVkLCAiTnVtYmVyIG9mIGZ1bmN0aW9ucyBpbmxpbmVkIik7CitTVEFUSVNUSUMoTnVtQ2FsbHNEZWxldGVkLCAiTnVtYmVyIG9mIGNhbGwgc2l0ZXMgZGVsZXRlZCwgbm90IGlubGluZWQiKTsKK1NUQVRJU1RJQyhOdW1EZWxldGVkLCAiTnVtYmVyIG9mIGZ1bmN0aW9ucyBkZWxldGVkIGJlY2F1c2UgYWxsIGNhbGxlcnMgZm91bmQiKTsKK1NUQVRJU1RJQyhOdW1NZXJnZWRBbGxvY2FzLCAiTnVtYmVyIG9mIGFsbG9jYXMgbWVyZ2VkIHRvZ2V0aGVyIik7CisKK3N0YXRpYyBjbDo6b3B0PGludD4KK0lubGluZUxpbWl0KCJpbmxpbmUtdGhyZXNob2xkIiwgY2w6OkhpZGRlbiwgY2w6OmluaXQoMjI1KSwgY2w6Olplcm9Pck1vcmUsCisgICAgICAgIGNsOjpkZXNjKCJDb250cm9sIHRoZSBhbW91bnQgb2YgaW5saW5pbmcgdG8gcGVyZm9ybSAoZGVmYXVsdCA9IDIyNSkiKSk7CisKK3N0YXRpYyBjbDo6b3B0PGludD4KK0hpbnRUaHJlc2hvbGQoImlubGluZWhpbnQtdGhyZXNob2xkIiwgY2w6OkhpZGRlbiwgY2w6OmluaXQoMzI1KSwKKyAgICAgICAgICAgICAgY2w6OmRlc2MoIlRocmVzaG9sZCBmb3IgaW5saW5pbmcgZnVuY3Rpb25zIHdpdGggaW5saW5lIGhpbnQiKSk7CisKKy8vIFRocmVzaG9sZCB0byB1c2Ugd2hlbiBvcHRzaXplIGlzIHNwZWNpZmllZCAoYW5kIHRoZXJlIGlzIG5vIC1pbmxpbmUtbGltaXQpLgorY29uc3QgaW50IE9wdFNpemVUaHJlc2hvbGQgPSA3NTsKKworSW5saW5lcjo6SW5saW5lcihjaGFyICZJRCkgCisgIDogQ2FsbEdyYXBoU0NDUGFzcyhJRCksIElubGluZVRocmVzaG9sZChJbmxpbmVMaW1pdCkge30KKworSW5saW5lcjo6SW5saW5lcihjaGFyICZJRCwgaW50IFRocmVzaG9sZCkgCisgIDogQ2FsbEdyYXBoU0NDUGFzcyhJRCksIElubGluZVRocmVzaG9sZChUaHJlc2hvbGQpIHt9CisKKy8vLyBnZXRBbmFseXNpc1VzYWdlIC0gRm9yIHRoaXMgY2xhc3MsIHdlIGRlY2xhcmUgdGhhdCB3ZSByZXF1aXJlIGFuZCBwcmVzZXJ2ZQorLy8vIHRoZSBjYWxsIGdyYXBoLiAgSWYgdGhlIGRlcml2ZWQgY2xhc3MgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCwgaXQgc2hvdWxkCisvLy8gYWx3YXlzIGV4cGxpY2l0bHkgY2FsbCB0aGUgaW1wbGVtZW50YXRpb24gaGVyZS4KK3ZvaWQgSW5saW5lcjo6Z2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZJbmZvKSBjb25zdCB7CisgIENhbGxHcmFwaFNDQ1Bhc3M6OmdldEFuYWx5c2lzVXNhZ2UoSW5mbyk7Cit9CisKKwordHlwZWRlZiBEZW5zZU1hcDxjb25zdCBBcnJheVR5cGUqLCBzdGQ6OnZlY3RvcjxBbGxvY2FJbnN0Kj4gPgorSW5saW5lZEFycmF5QWxsb2Nhc1R5OworCisvLy8gSW5saW5lQ2FsbElmUG9zc2libGUgLSBJZiBpdCBpcyBwb3NzaWJsZSB0byBpbmxpbmUgdGhlIHNwZWNpZmllZCBjYWxsIHNpdGUsCisvLy8gZG8gc28gYW5kIHVwZGF0ZSB0aGUgQ2FsbEdyYXBoIGZvciB0aGlzIG9wZXJhdGlvbi4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gYWxzbyBkb2VzIHNvbWUgYmFzaWMgYm9vay1rZWVwaW5nIHRvIHVwZGF0ZSB0aGUgSVIuICBUaGUKKy8vLyBJbmxpbmVkQXJyYXlBbGxvY2FzIG1hcCBrZWVwcyB0cmFjayBvZiBhbnkgYWxsb2NhcyB0aGF0IGFyZSBhbHJlYWR5CisvLy8gYXZhaWxhYmxlIGZyb20gb3RoZXIgIGZ1bmN0aW9ucyBpbmxpbmVkIGludG8gdGhlIGNhbGxlci4gIElmIHdlIGFyZSBhYmxlIHRvCisvLy8gaW5saW5lIHRoaXMgY2FsbCBzaXRlIHdlIGF0dGVtcHQgdG8gcmV1c2UgYWxyZWFkeSBhdmFpbGFibGUgYWxsb2NhcyBvciBhZGQKKy8vLyBhbnkgbmV3IGFsbG9jYXMgdG8gdGhlIHNldCBpZiBub3QgcG9zc2libGUuCitzdGF0aWMgYm9vbCBJbmxpbmVDYWxsSWZQb3NzaWJsZShDYWxsU2l0ZSBDUywgSW5saW5lRnVuY3Rpb25JbmZvICZJRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmxpbmVkQXJyYXlBbGxvY2FzVHkgJklubGluZWRBcnJheUFsbG9jYXMpIHsKKyAgRnVuY3Rpb24gKkNhbGxlZSA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCk7CisgIEZ1bmN0aW9uICpDYWxsZXIgPSBDUy5nZXRDYWxsZXIoKTsKKworICAvLyBUcnkgdG8gaW5saW5lIHRoZSBmdW5jdGlvbi4gIEdldCB0aGUgbGlzdCBvZiBzdGF0aWMgYWxsb2NhcyB0aGF0IHdlcmUKKyAgLy8gaW5saW5lZC4KKyAgaWYgKCFJbmxpbmVGdW5jdGlvbihDUywgSUZJKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhlIGlubGluZWQgZnVuY3Rpb24gaGFkIGEgaGlnaGVyIHN0YWNrIHByb3RlY3Rpb24gbGV2ZWwgdGhhbiB0aGUKKyAgLy8gY2FsbGluZyBmdW5jdGlvbiwgdGhlbiBidW1wIHVwIHRoZSBjYWxsZXIncyBzdGFjayBwcm90ZWN0aW9uIGxldmVsLgorICBpZiAoQ2FsbGVlLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpTdGFja1Byb3RlY3RSZXEpKQorICAgIENhbGxlci0+YWRkRm5BdHRyKEF0dHJpYnV0ZTo6U3RhY2tQcm90ZWN0UmVxKTsKKyAgZWxzZSBpZiAoQ2FsbGVlLT5oYXNGbkF0dHIoQXR0cmlidXRlOjpTdGFja1Byb3RlY3QpICYmCisgICAgICAgICAgICFDYWxsZXItPmhhc0ZuQXR0cihBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdFJlcSkpCisgICAgQ2FsbGVyLT5hZGRGbkF0dHIoQXR0cmlidXRlOjpTdGFja1Byb3RlY3QpOworCisgIAorICAvLyBMb29rIGF0IGFsbCBvZiB0aGUgYWxsb2NhcyB0aGF0IHdlIGlubGluZWQgdGhyb3VnaCB0aGlzIGNhbGwgc2l0ZS4gIElmIHdlCisgIC8vIGhhdmUgYWxyZWFkeSBpbmxpbmVkIG90aGVyIGFsbG9jYXMgdGhyb3VnaCBvdGhlciBjYWxscyBpbnRvIHRoaXMgZnVuY3Rpb24sCisgIC8vIHRoZW4gd2Uga25vdyB0aGF0IHRoZXkgaGF2ZSBkaXNqb2ludCBsaWZldGltZXMgYW5kIHRoYXQgd2UgY2FuIG1lcmdlIHRoZW0uCisgIC8vCisgIC8vIFRoZXJlIGFyZSBtYW55IGhldXJpc3RpY3MgcG9zc2libGUgZm9yIG1lcmdpbmcgdGhlc2UgYWxsb2NhcywgYW5kIHRoZQorICAvLyBkaWZmZXJlbnQgb3B0aW9ucyBoYXZlIGRpZmZlcmVudCB0cmFkZW9mZnMuICBPbmUgdGhpbmcgdGhhdCB3ZSAqcmVhbGx5KgorICAvLyBkb24ndCB3YW50IHRvIGh1cnQgaXMgU1JvQTogb25jZSBpbmxpbmluZyBoYXBwZW5zLCBvZnRlbiBhbGxvY2FzIGFyZSBubworICAvLyBsb25nZXIgYWRkcmVzcyB0YWtlbiBhbmQgc28gdGhleSBjYW4gYmUgcHJvbW90ZWQuCisgIC8vCisgIC8vIE91ciAic29sdXRpb24iIGZvciB0aGF0IGlzIHRvIG9ubHkgbWVyZ2UgYWxsb2NhcyB3aG9zZSBvdXRlcm1vc3QgdHlwZSBpcyBhbgorICAvLyBhcnJheSB0eXBlLiAgVGhlc2UgYXJlIHVzdWFsbHkgbm90IHByb21vdGVkIGJlY2F1c2Ugc29tZW9uZSBpcyB1c2luZyBhCisgIC8vIHZhcmlhYmxlIGluZGV4IGludG8gdGhlbS4gIFRoZXNlIGFyZSBhbHNvIG9mdGVuIHRoZSBtb3N0IGltcG9ydGFudCBvbmVzIHRvCisgIC8vIG1lcmdlLgorICAvLworICAvLyBBIGJldHRlciBzb2x1dGlvbiB3b3VsZCBiZSB0byBoYXZlIHJlYWwgbWVtb3J5IGxpZmV0aW1lIG1hcmtlcnMgaW4gdGhlIElSCisgIC8vIGFuZCBub3QgaGF2ZSB0aGUgaW5saW5lciBkbyBhbnkgbWVyZ2luZyBvZiBhbGxvY2FzIGF0IGFsbC4gIFRoaXMgd291bGQKKyAgLy8gYWxsb3cgdGhlIGJhY2tlbmQgdG8gZG8gcHJvcGVyIHN0YWNrIHNsb3QgY29sb3Jpbmcgb2YgYWxsIGFsbG9jYXMgdGhhdAorICAvLyAqYWN0dWFsbHkgbWFrZSBpdCB0byB0aGUgYmFja2VuZCosIHdoaWNoIGlzIHJlYWxseSB3aGF0IHdlIHdhbnQuCisgIC8vCisgIC8vIEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLCB3ZSBkbyB0aGlzIHNpbXBsZSBhbmQgdXNlZnVsIGhhY2suCisgIC8vCisgIFNtYWxsUHRyU2V0PEFsbG9jYUluc3QqLCAxNj4gVXNlZEFsbG9jYXM7CisgIAorICAvLyBMb29wIG92ZXIgYWxsIHRoZSBhbGxvY2FzIHdlIGhhdmUgc28gZmFyIGFuZCBzZWUgaWYgdGhleSBjYW4gYmUgbWVyZ2VkIHdpdGgKKyAgLy8gYSBwcmV2aW91c2x5IGlubGluZWQgYWxsb2NhLiAgSWYgbm90LCByZW1lbWJlciB0aGF0IHdlIGhhZCBpdC4KKyAgZm9yICh1bnNpZ25lZCBBbGxvY2FObyA9IDAsIGUgPSBJRkkuU3RhdGljQWxsb2Nhcy5zaXplKCk7CisgICAgICAgQWxsb2NhTm8gIT0gZTsgKytBbGxvY2FObykgeworICAgIEFsbG9jYUluc3QgKkFJID0gSUZJLlN0YXRpY0FsbG9jYXNbQWxsb2NhTm9dOworICAgIAorICAgIC8vIERvbid0IGJvdGhlciB0cnlpbmcgdG8gbWVyZ2UgYXJyYXkgYWxsb2NhdGlvbnMgKHRoZXkgd2lsbCB1c3VhbGx5IGJlCisgICAgLy8gY2Fub25pY2FsaXplZCB0byBiZSBhbiBhbGxvY2F0aW9uICpvZiogYW4gYXJyYXkpLCBvciBhbGxvY2F0aW9ucyB3aG9zZQorICAgIC8vIHR5cGUgaXMgbm90IGl0c2VsZiBhbiBhcnJheSAoYmVjYXVzZSB3ZSdyZSBhZnJhaWQgb2YgcGVzc2ltaXppbmcgU1JvQSkuCisgICAgY29uc3QgQXJyYXlUeXBlICpBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCkpOworICAgIGlmIChBVHkgPT0gMCB8fCBBSS0+aXNBcnJheUFsbG9jYXRpb24oKSkKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIC8vIEdldCB0aGUgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGFsbG9jYXMgZm9yIHRoaXMgYXJyYXkgdHlwZS4KKyAgICBzdGQ6OnZlY3RvcjxBbGxvY2FJbnN0Kj4gJkFsbG9jYXNGb3JUeXBlID0gSW5saW5lZEFycmF5QWxsb2Nhc1tBVHldOworICAgIAorICAgIC8vIExvb3Agb3ZlciB0aGUgYWxsb2NhcyBpbiBBbGxvY2FzRm9yVHlwZSB0byBzZWUgaWYgd2UgY2FuIHJldXNlIG9uZS4gIE5vdGUKKyAgICAvLyB0aGF0IHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBub3QgdG8gcmV1c2UgdGhlIHNhbWUgImF2YWlsYWJsZSIgYWxsb2NhIGZvcgorICAgIC8vIG11bHRpcGxlIGRpZmZlcmVudCBhbGxvY2FzIHRoYXQgd2UganVzdCBpbmxpbmVkLCB3ZSB1c2UgdGhlICdVc2VkQWxsb2NhcycKKyAgICAvLyBzZXQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCAiYXZhaWxhYmxlIiBhbGxvY2FzIGFyZSBiZWluZyB1c2VkIGJ5IHRoaXMKKyAgICAvLyBmdW5jdGlvbi4gIEFsc28sIEFsbG9jYXNGb3JUeXBlIGNhbiBiZSBlbXB0eSBvZiBjb3Vyc2UhCisgICAgYm9vbCBNZXJnZWRBd2F5QWxsb2NhID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFsbG9jYXNGb3JUeXBlLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEFsbG9jYUluc3QgKkF2YWlsYWJsZUFsbG9jYSA9IEFsbG9jYXNGb3JUeXBlW2ldOworICAgICAgCisgICAgICAvLyBUaGUgYXZhaWxhYmxlIGFsbG9jYSBoYXMgdG8gYmUgaW4gdGhlIHJpZ2h0IGZ1bmN0aW9uLCBub3QgaW4gc29tZSBvdGhlcgorICAgICAgLy8gZnVuY3Rpb24gaW4gdGhpcyBTQ0MuCisgICAgICBpZiAoQXZhaWxhYmxlQWxsb2NhLT5nZXRQYXJlbnQoKSAhPSBBSS0+Z2V0UGFyZW50KCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBJZiB0aGUgaW5saW5lZCBmdW5jdGlvbiBhbHJlYWR5IHVzZXMgdGhpcyBhbGxvY2EgdGhlbiB3ZSBjYW4ndCByZXVzZQorICAgICAgLy8gaXQuCisgICAgICBpZiAoIVVzZWRBbGxvY2FzLmluc2VydChBdmFpbGFibGVBbGxvY2EpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSAqY2FuKiByZXVzZSBpdCwgUkFVVyBBSSBpbnRvIEF2YWlsYWJsZUFsbG9jYSBhbmQgZGVjbGFyZQorICAgICAgLy8gc3VjY2VzcyEKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICAgICoqKk1FUkdFRCBBTExPQ0E6ICIgPDwgKkFJKTsKKyAgICAgIAorICAgICAgQUktPnJlcGxhY2VBbGxVc2VzV2l0aChBdmFpbGFibGVBbGxvY2EpOworICAgICAgQUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgTWVyZ2VkQXdheUFsbG9jYSA9IHRydWU7CisgICAgICArK051bU1lcmdlZEFsbG9jYXM7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBhbHJlYWR5IG51a2VkIHRoZSBhbGxvY2EsIHdlJ3JlIGRvbmUgd2l0aCBpdC4KKyAgICBpZiAoTWVyZ2VkQXdheUFsbG9jYSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gSWYgd2Ugd2VyZSB1bmFibGUgdG8gbWVyZ2UgYXdheSB0aGUgYWxsb2NhIGVpdGhlciBiZWNhdXNlIHRoZXJlIGFyZSBubworICAgIC8vIGFsbG9jYXMgb2YgdGhlIHJpZ2h0IHR5cGUgYXZhaWxhYmxlIG9yIGJlY2F1c2Ugd2UgcmV1c2VkIHRoZW0gYWxsCisgICAgLy8gYWxyZWFkeSwgcmVtZW1iZXIgdGhhdCB0aGlzIGFsbG9jYSBjYW1lIGZyb20gYW4gaW5saW5lZCBmdW5jdGlvbiBhbmQgbWFyaworICAgIC8vIGl0IHVzZWQgc28gd2UgZG9uJ3QgcmV1c2UgaXQgZm9yIG90aGVyIGFsbG9jYXMgZnJvbSB0aGlzIGlubGluZQorICAgIC8vIG9wZXJhdGlvbi4KKyAgICBBbGxvY2FzRm9yVHlwZS5wdXNoX2JhY2soQUkpOworICAgIFVzZWRBbGxvY2FzLmluc2VydChBSSk7CisgIH0KKyAgCisgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBJbmxpbmVyOjpnZXRJbmxpbmVUaHJlc2hvbGQoQ2FsbFNpdGUgQ1MpIGNvbnN0IHsKKyAgaW50IHRocmVzID0gSW5saW5lVGhyZXNob2xkOworCisgIC8vIExpc3RlbiB0byBvcHRzaXplIHdoZW4gLWlubGluZS1saW1pdCBpcyBub3QgZ2l2ZW4uCisgIEZ1bmN0aW9uICpDYWxsZXIgPSBDUy5nZXRDYWxsZXIoKTsKKyAgaWYgKENhbGxlciAmJiAhQ2FsbGVyLT5pc0RlY2xhcmF0aW9uKCkgJiYKKyAgICAgIENhbGxlci0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6T3B0aW1pemVGb3JTaXplKSAmJgorICAgICAgSW5saW5lTGltaXQuZ2V0TnVtT2NjdXJyZW5jZXMoKSA9PSAwKQorICAgIHRocmVzID0gT3B0U2l6ZVRocmVzaG9sZDsKKworICAvLyBMaXN0ZW4gdG8gaW5saW5laGludCB3aGVuIGl0IHdvdWxkIGluY3JlYXNlIHRoZSB0aHJlc2hvbGQuCisgIEZ1bmN0aW9uICpDYWxsZWUgPSBDUy5nZXRDYWxsZWRGdW5jdGlvbigpOworICBpZiAoSGludFRocmVzaG9sZCA+IHRocmVzICYmIENhbGxlZSAmJiAhQ2FsbGVlLT5pc0RlY2xhcmF0aW9uKCkgJiYKKyAgICAgIENhbGxlZS0+aGFzRm5BdHRyKEF0dHJpYnV0ZTo6SW5saW5lSGludCkpCisgICAgdGhyZXMgPSBIaW50VGhyZXNob2xkOworCisgIHJldHVybiB0aHJlczsKK30KKworLy8vIHNob3VsZElubGluZSAtIFJldHVybiB0cnVlIGlmIHRoZSBpbmxpbmVyIHNob3VsZCBhdHRlbXB0IHRvIGlubGluZQorLy8vIGF0IHRoZSBnaXZlbiBDYWxsU2l0ZS4KK2Jvb2wgSW5saW5lcjo6c2hvdWxkSW5saW5lKENhbGxTaXRlIENTKSB7CisgIElubGluZUNvc3QgSUMgPSBnZXRJbmxpbmVDb3N0KENTKTsKKyAgCisgIGlmIChJQy5pc0Fsd2F5cygpKSB7CisgICAgREVCVUcoZGJncygpIDw8ICIgICAgSW5saW5pbmc6IGNvc3Q9YWx3YXlzIgorICAgICAgICAgIDw8ICIsIENhbGw6ICIgPDwgKkNTLmdldEluc3RydWN0aW9uKCkgPDwgIlxuIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIGlmIChJQy5pc05ldmVyKCkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgICBOT1QgSW5saW5pbmc6IGNvc3Q9bmV2ZXIiCisgICAgICAgICAgPDwgIiwgQ2FsbDogIiA8PCAqQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSA8PCAiXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIGludCBDb3N0ID0gSUMuZ2V0VmFsdWUoKTsKKyAgRnVuY3Rpb24gKkNhbGxlciA9IENTLmdldENhbGxlcigpOworICBpbnQgQ3VycmVudFRocmVzaG9sZCA9IGdldElubGluZVRocmVzaG9sZChDUyk7CisgIGZsb2F0IEZ1ZGdlRmFjdG9yID0gZ2V0SW5saW5lRnVkZ2VGYWN0b3IoQ1MpOworICBpbnQgQWRqVGhyZXNob2xkID0gKGludCkoQ3VycmVudFRocmVzaG9sZCAqIEZ1ZGdlRmFjdG9yKTsKKyAgaWYgKENvc3QgPj0gQWRqVGhyZXNob2xkKSB7CisgICAgREVCVUcoZGJncygpIDw8ICIgICAgTk9UIElubGluaW5nOiBjb3N0PSIgPDwgQ29zdAorICAgICAgICAgIDw8ICIsIHRocmVzPSIgPDwgQWRqVGhyZXNob2xkCisgICAgICAgICAgPDwgIiwgQ2FsbDogIiA8PCAqQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSA8PCAiXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIFRyeSB0byBkZXRlY3QgdGhlIGNhc2Ugd2hlcmUgdGhlIGN1cnJlbnQgaW5saW5pbmcgY2FuZGlkYXRlIGNhbGxlcgorICAvLyAoY2FsbCBpdCBCKSBpcyBhIHN0YXRpYyBmdW5jdGlvbiBhbmQgaXMgYW4gaW5saW5pbmcgY2FuZGlkYXRlIGVsc2V3aGVyZSwKKyAgLy8gYW5kIHRoZSBjdXJyZW50IGNhbmRpZGF0ZSBjYWxsZWUgKGNhbGwgaXQgQykgaXMgbGFyZ2UgZW5vdWdoIHRoYXQKKyAgLy8gaW5saW5pbmcgaXQgaW50byBCIHdvdWxkIG1ha2UgQiB0b28gYmlnIHRvIGlubGluZSBsYXRlci4gIEluIHRoZXNlCisgIC8vIGNpcmN1bXN0YW5jZXMgaXQgbWF5IGJlIGJlc3Qgbm90IHRvIGlubGluZSBDIGludG8gQiwgYnV0IHRvIGlubGluZSBCCisgIC8vIGludG8gaXRzIGNhbGxlcnMuCisgIGlmIChDYWxsZXItPmhhc0xvY2FsTGlua2FnZSgpKSB7CisgICAgaW50IFRvdGFsU2Vjb25kYXJ5Q29zdCA9IDA7CisgICAgYm9vbCBvdXRlckNhbGxzRm91bmQgPSBmYWxzZTsKKyAgICBib29sIGFsbE91dGVyQ2FsbHNXaWxsQmVJbmxpbmVkID0gdHJ1ZTsKKyAgICBib29sIHNvbWVPdXRlckNhbGxXb3VsZE5vdEJlSW5saW5lZCA9IGZhbHNlOworICAgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBJID0gQ2FsbGVyLT51c2VfYmVnaW4oKSwgRSA9Q2FsbGVyLT51c2VfZW5kKCk7IAorICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIENhbGxTaXRlIENTMigqSSk7CisKKyAgICAgIC8vIElmIHRoaXMgaXNuJ3QgYSBjYWxsIHRvIENhbGxlciAoaXQgY291bGQgYmUgc29tZSBvdGhlciBzb3J0CisgICAgICAvLyBvZiByZWZlcmVuY2UpIHNraXAgaXQuCisgICAgICBpZiAoIUNTMiB8fCBDUzIuZ2V0Q2FsbGVkRnVuY3Rpb24oKSAhPSBDYWxsZXIpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBJbmxpbmVDb3N0IElDMiA9IGdldElubGluZUNvc3QoQ1MyKTsKKyAgICAgIGlmIChJQzIuaXNOZXZlcigpKQorICAgICAgICBhbGxPdXRlckNhbGxzV2lsbEJlSW5saW5lZCA9IGZhbHNlOworICAgICAgaWYgKElDMi5pc0Fsd2F5cygpIHx8IElDMi5pc05ldmVyKCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBvdXRlckNhbGxzRm91bmQgPSB0cnVlOworICAgICAgaW50IENvc3QyID0gSUMyLmdldFZhbHVlKCk7CisgICAgICBpbnQgQ3VycmVudFRocmVzaG9sZDIgPSBnZXRJbmxpbmVUaHJlc2hvbGQoQ1MyKTsKKyAgICAgIGZsb2F0IEZ1ZGdlRmFjdG9yMiA9IGdldElubGluZUZ1ZGdlRmFjdG9yKENTMik7CisKKyAgICAgIGlmIChDb3N0MiA+PSAoaW50KShDdXJyZW50VGhyZXNob2xkMiAqIEZ1ZGdlRmFjdG9yMikpCisgICAgICAgIGFsbE91dGVyQ2FsbHNXaWxsQmVJbmxpbmVkID0gZmFsc2U7CisKKyAgICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHRoaXMgY2FzZS4gIFdlIHN1YnRyYWN0IG9mZiB0aGUgcGVuYWx0eQorICAgICAgLy8gZm9yIHRoZSBjYWxsIGluc3RydWN0aW9uLCB3aGljaCB3ZSB3b3VsZCBiZSBkZWxldGluZy4KKyAgICAgIGlmIChDb3N0MiA8IChpbnQpKEN1cnJlbnRUaHJlc2hvbGQyICogRnVkZ2VGYWN0b3IyKSAmJgorICAgICAgICAgIENvc3QyICsgQ29zdCAtIChJbmxpbmVDb25zdGFudHM6OkNhbGxQZW5hbHR5ICsgMSkgPj0gCisgICAgICAgICAgICAgICAgKGludCkoQ3VycmVudFRocmVzaG9sZDIgKiBGdWRnZUZhY3RvcjIpKSB7CisgICAgICAgIHNvbWVPdXRlckNhbGxXb3VsZE5vdEJlSW5saW5lZCA9IHRydWU7CisgICAgICAgIFRvdGFsU2Vjb25kYXJ5Q29zdCArPSBDb3N0MjsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgYWxsIG91dGVyIGNhbGxzIHRvIENhbGxlciB3b3VsZCBnZXQgaW5saW5lZCwgdGhlIGNvc3QgZm9yIHRoZSBsYXN0CisgICAgLy8gb25lIGlzIHNldCB2ZXJ5IGxvdyBieSBnZXRJbmxpbmVDb3N0LCBpbiBhbnRpY2lwYXRpb24gdGhhdCBDYWxsZXIgd2lsbAorICAgIC8vIGJlIHJlbW92ZWQgZW50aXJlbHkuICBXZSBkaWQgbm90IGFjY291bnQgZm9yIHRoaXMgYWJvdmUgdW5sZXNzIHRoZXJlCisgICAgLy8gaXMgb25seSBvbmUgY2FsbGVyIG9mIENhbGxlci4KKyAgICBpZiAoYWxsT3V0ZXJDYWxsc1dpbGxCZUlubGluZWQgJiYgQ2FsbGVyLT51c2VfYmVnaW4oKSAhPSBDYWxsZXItPnVzZV9lbmQoKSkKKyAgICAgIFRvdGFsU2Vjb25kYXJ5Q29zdCArPSBJbmxpbmVDb25zdGFudHM6Okxhc3RDYWxsVG9TdGF0aWNCb251czsKKworICAgIGlmIChvdXRlckNhbGxzRm91bmQgJiYgc29tZU91dGVyQ2FsbFdvdWxkTm90QmVJbmxpbmVkICYmIAorICAgICAgICBUb3RhbFNlY29uZGFyeUNvc3QgPCBDb3N0KSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgICBOT1QgSW5saW5pbmc6ICIgPDwgKkNTLmdldEluc3RydWN0aW9uKCkgPDwgCisgICAgICAgICAgICIgQ29zdCA9ICIgPDwgQ29zdCA8PCAKKyAgICAgICAgICAgIiwgb3V0ZXIgQ29zdCA9ICIgPDwgVG90YWxTZWNvbmRhcnlDb3N0IDw8ICdcbicpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiICAgIElubGluaW5nOiBjb3N0PSIgPDwgQ29zdAorICAgICAgICA8PCAiLCB0aHJlcz0iIDw8IEFkalRocmVzaG9sZAorICAgICAgICA8PCAiLCBDYWxsOiAiIDw8ICpDUy5nZXRJbnN0cnVjdGlvbigpIDw8ICdcbicpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIElubGluZUhpc3RvcnlJbmNsdWRlcyAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5saW5lIGhpc3RvcnkgSUQKKy8vLyBpbmRpY2F0ZXMgYW4gaW5saW5lIGhpc3RvcnkgdGhhdCBpbmNsdWRlcyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLgorc3RhdGljIGJvb2wgSW5saW5lSGlzdG9yeUluY2x1ZGVzKEZ1bmN0aW9uICpGLCBpbnQgSW5saW5lSGlzdG9yeUlELAorICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxGdW5jdGlvbiosIGludD4gPiAmSW5saW5lSGlzdG9yeSkgeworICB3aGlsZSAoSW5saW5lSGlzdG9yeUlEICE9IC0xKSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKElubGluZUhpc3RvcnlJRCkgPCBJbmxpbmVIaXN0b3J5LnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBpbmxpbmUgaGlzdG9yeSBJRCIpOworICAgIGlmIChJbmxpbmVIaXN0b3J5W0lubGluZUhpc3RvcnlJRF0uZmlyc3QgPT0gRikKKyAgICAgIHJldHVybiB0cnVlOworICAgIElubGluZUhpc3RvcnlJRCA9IElubGluZUhpc3RvcnlbSW5saW5lSGlzdG9yeUlEXS5zZWNvbmQ7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgSW5saW5lcjo6cnVuT25TQ0MoQ2FsbEdyYXBoU0NDICZTQ0MpIHsKKyAgQ2FsbEdyYXBoICZDRyA9IGdldEFuYWx5c2lzPENhbGxHcmFwaD4oKTsKKyAgY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFRhcmdldERhdGE+KCk7CisKKyAgU21hbGxQdHJTZXQ8RnVuY3Rpb24qLCA4PiBTQ0NGdW5jdGlvbnM7CisgIERFQlVHKGRiZ3MoKSA8PCAiSW5saW5lciB2aXNpdGluZyBTQ0M6Iik7CisgIGZvciAoQ2FsbEdyYXBoU0NDOjppdGVyYXRvciBJID0gU0NDLmJlZ2luKCksIEUgPSBTQ0MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgRnVuY3Rpb24gKkYgPSAoKkkpLT5nZXRGdW5jdGlvbigpOworICAgIGlmIChGKSBTQ0NGdW5jdGlvbnMuaW5zZXJ0KEYpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiICIgPDwgKEYgPyBGLT5nZXROYW1lKCkgOiAiSU5ESVJFQ1ROT0RFIikpOworICB9CisKKyAgLy8gU2NhbiB0aHJvdWdoIGFuZCBpZGVudGlmeSBhbGwgY2FsbCBzaXRlcyBhaGVhZCBvZiB0aW1lIHNvIHRoYXQgd2Ugb25seQorICAvLyBpbmxpbmUgY2FsbCBzaXRlcyBpbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb25zLCBub3QgY2FsbCBzaXRlcyB0aGF0IHJlc3VsdAorICAvLyBmcm9tIGlubGluaW5nIG90aGVyIGZ1bmN0aW9ucy4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPENhbGxTaXRlLCBpbnQ+LCAxNj4gQ2FsbFNpdGVzOworICAKKyAgLy8gV2hlbiBpbmxpbmluZyBhIGNhbGxlZSBwcm9kdWNlcyBuZXcgY2FsbCBzaXRlcywgd2Ugd2FudCB0byBrZWVwIHRyYWNrIG9mCisgIC8vIHRoZSBmYWN0IHRoYXQgdGhleSB3ZXJlIGlubGluZWQgZnJvbSB0aGUgY2FsbGVlLiAgVGhpcyBhbGxvd3MgdXMgdG8gYXZvaWQKKyAgLy8gaW5maW5pdGUgaW5saW5pbmcgaW4gc29tZSBvYnNjdXJlIGNhc2VzLiAgVG8gcmVwcmVzZW50IHRoaXMsIHdlIHVzZSBhbgorICAvLyBpbmRleCBpbnRvIHRoZSBJbmxpbmVIaXN0b3J5IHZlY3Rvci4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPEZ1bmN0aW9uKiwgaW50PiwgOD4gSW5saW5lSGlzdG9yeTsKKworICBmb3IgKENhbGxHcmFwaFNDQzo6aXRlcmF0b3IgSSA9IFNDQy5iZWdpbigpLCBFID0gU0NDLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEZ1bmN0aW9uICpGID0gKCpJKS0+Z2V0RnVuY3Rpb24oKTsKKyAgICBpZiAoIUYpIGNvbnRpbnVlOworICAgIAorICAgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEJCID0gRi0+YmVnaW4oKSwgRSA9IEYtPmVuZCgpOyBCQiAhPSBFOyArK0JCKQorICAgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIENhbGxTaXRlIENTKGNhc3Q8VmFsdWU+KEkpKTsKKyAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBhIGNhbGwsIG9yIGl0IGlzIGEgY2FsbCB0byBhbiBpbnRyaW5zaWMsIGl0IGNhbgorICAgICAgICAvLyBuZXZlciBiZSBpbmxpbmVkLgorICAgICAgICBpZiAoIUNTIHx8IGlzYTxJbnRyaW5zaWNJbnN0PihJKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBkaXJlY3QgY2FsbCB0byBhbiBleHRlcm5hbCBmdW5jdGlvbiwgd2UgY2FuIG5ldmVyIGlubGluZQorICAgICAgICAvLyBpdC4gIElmIGl0IGlzIGFuIGluZGlyZWN0IGNhbGwsIGlubGluaW5nIG1heSByZXNvbHZlIGl0IHRvIGJlIGEKKyAgICAgICAgLy8gZGlyZWN0IGNhbGwsIHNvIHdlIGtlZXAgaXQuCisgICAgICAgIGlmIChDUy5nZXRDYWxsZWRGdW5jdGlvbigpICYmIENTLmdldENhbGxlZEZ1bmN0aW9uKCktPmlzRGVjbGFyYXRpb24oKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIENhbGxTaXRlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQ1MsIC0xKSk7CisgICAgICB9CisgIH0KKworICBERUJVRyhkYmdzKCkgPDwgIjogIiA8PCBDYWxsU2l0ZXMuc2l6ZSgpIDw8ICIgY2FsbCBzaXRlcy5cbiIpOworCisgIC8vIElmIHRoZXJlIGFyZSBubyBjYWxscyBpbiB0aGlzIGZ1bmN0aW9uLCBleGl0IGVhcmx5LgorICBpZiAoQ2FsbFNpdGVzLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhbGwgb2YgdGhlIGNhbGwgc2l0ZXMsIG1vdmUgdGhlIG9uZXMgdG8gZnVuY3Rpb25zIGluIHRoZQorICAvLyBjdXJyZW50IFNDQyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICB1bnNpZ25lZCBGaXJzdENhbGxJblNDQyA9IENhbGxTaXRlcy5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBGaXJzdENhbGxJblNDQzsgKytpKQorICAgIGlmIChGdW5jdGlvbiAqRiA9IENhbGxTaXRlc1tpXS5maXJzdC5nZXRDYWxsZWRGdW5jdGlvbigpKQorICAgICAgaWYgKFNDQ0Z1bmN0aW9ucy5jb3VudChGKSkKKyAgICAgICAgc3RkOjpzd2FwKENhbGxTaXRlc1tpLS1dLCBDYWxsU2l0ZXNbLS1GaXJzdENhbGxJblNDQ10pOworCisgIAorICBJbmxpbmVkQXJyYXlBbGxvY2FzVHkgSW5saW5lZEFycmF5QWxsb2NhczsKKyAgSW5saW5lRnVuY3Rpb25JbmZvIElubGluZUluZm8oJkNHLCBURCk7CisgIAorICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGFsbCBvZiB0aGUgY2FsbCBzaXRlcywgbG9vcCBvdmVyIHRoZW0gYW5kIGlubGluZSB0aGVtIGlmCisgIC8vIGl0IGxvb2tzIHByb2ZpdGFibGUgdG8gZG8gc28uCisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBib29sIExvY2FsQ2hhbmdlOworICBkbyB7CisgICAgTG9jYWxDaGFuZ2UgPSBmYWxzZTsKKyAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIG91dGVyIGxvb3AgYmVjYXVzZSBpbmxpbmluZyBmdW5jdGlvbnMgY2FuIGNhdXNlIGluZGlyZWN0CisgICAgLy8gY2FsbHMgdG8gYmVjb21lIGRpcmVjdCBjYWxscy4KKyAgICBmb3IgKHVuc2lnbmVkIENTaSA9IDA7IENTaSAhPSBDYWxsU2l0ZXMuc2l6ZSgpOyArK0NTaSkgeworICAgICAgQ2FsbFNpdGUgQ1MgPSBDYWxsU2l0ZXNbQ1NpXS5maXJzdDsKKyAgICAgIAorICAgICAgRnVuY3Rpb24gKkNhbGxlciA9IENTLmdldENhbGxlcigpOworICAgICAgRnVuY3Rpb24gKkNhbGxlZSA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCk7CisKKyAgICAgIC8vIElmIHRoaXMgY2FsbCBzaXRlIGlzIGRlYWQgYW5kIGl0IGlzIHRvIGEgcmVhZG9ubHkgZnVuY3Rpb24sIHdlIHNob3VsZAorICAgICAgLy8ganVzdCBkZWxldGUgdGhlIGNhbGwgaW5zdGVhZCBvZiB0cnlpbmcgdG8gaW5saW5lIGl0LCByZWdhcmRsZXNzIG9mCisgICAgICAvLyBzaXplLiAgVGhpcyBoYXBwZW5zIGJlY2F1c2UgSVBTQ0NQIHByb3BhZ2F0ZXMgdGhlIHJlc3VsdCBvdXQgb2YgdGhlCisgICAgICAvLyBjYWxsIGFuZCB0aGVuIHdlJ3JlIGxlZnQgd2l0aCB0aGUgZGVhZCBjYWxsLgorICAgICAgaWYgKGlzSW5zdHJ1Y3Rpb25Ucml2aWFsbHlEZWFkKENTLmdldEluc3RydWN0aW9uKCkpKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICAgIC0+IERlbGV0aW5nIGRlYWQgY2FsbDogIgorICAgICAgICAgICAgICAgICAgICAgPDwgKkNTLmdldEluc3RydWN0aW9uKCkgPDwgIlxuIik7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgY2FsbCBncmFwaCBieSBkZWxldGluZyB0aGUgZWRnZSBmcm9tIENhbGxlZSB0byBDYWxsZXIuCisgICAgICAgIENHW0NhbGxlcl0tPnJlbW92ZUNhbGxFZGdlRm9yKENTKTsKKyAgICAgICAgQ1MuZ2V0SW5zdHJ1Y3Rpb24oKS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgICsrTnVtQ2FsbHNEZWxldGVkOworICAgICAgICAvLyBVcGRhdGUgdGhlIGNhY2hlZCBjb3N0IGluZm8gd2l0aCB0aGUgbWlzc2luZyBjYWxsCisgICAgICAgIGdyb3dDYWNoZWRDb3N0SW5mbyhDYWxsZXIsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UgY2FuIG9ubHkgaW5saW5lIGRpcmVjdCBjYWxscyB0byBub24tZGVjbGFyYXRpb25zLgorICAgICAgICBpZiAoQ2FsbGVlID09IDAgfHwgQ2FsbGVlLT5pc0RlY2xhcmF0aW9uKCkpIGNvbnRpbnVlOworICAgICAgCisgICAgICAgIC8vIElmIHRoaXMgY2FsbCBzaXRlIHdhcyBvYnRhaW5lZCBieSBpbmxpbmluZyBhbm90aGVyIGZ1bmN0aW9uLCB2ZXJpZnkKKyAgICAgICAgLy8gdGhhdCB0aGUgaW5jbHVkZSBwYXRoIGZvciB0aGUgZnVuY3Rpb24gZGlkIG5vdCBpbmNsdWRlIHRoZSBjYWxsZWUKKyAgICAgICAgLy8gaXRzZWxmLiAgSWYgc28sIHdlJ2QgYmUgcmVjdXJzaXZlbHkgaW5saW5saW5nIHRoZSBzYW1lIGZ1bmN0aW9uLAorICAgICAgICAvLyB3aGljaCB3b3VsZCBwcm92aWRlIHRoZSBzYW1lIGNhbGxzaXRlcywgd2hpY2ggd291bGQgY2F1c2UgdXMgdG8KKyAgICAgICAgLy8gaW5maW5pdGVseSBpbmxpbmUuCisgICAgICAgIGludCBJbmxpbmVIaXN0b3J5SUQgPSBDYWxsU2l0ZXNbQ1NpXS5zZWNvbmQ7CisgICAgICAgIGlmIChJbmxpbmVIaXN0b3J5SUQgIT0gLTEgJiYKKyAgICAgICAgICAgIElubGluZUhpc3RvcnlJbmNsdWRlcyhDYWxsZWUsIElubGluZUhpc3RvcnlJRCwgSW5saW5lSGlzdG9yeSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIHBvbGljeSBkZXRlcm1pbmVzIHRoYXQgd2Ugc2hvdWxkIGlubGluZSB0aGlzIGZ1bmN0aW9uLAorICAgICAgICAvLyB0cnkgdG8gZG8gc28uCisgICAgICAgIGlmICghc2hvdWxkSW5saW5lKENTKSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBBdHRlbXB0IHRvIGlubGluZSB0aGUgZnVuY3Rpb24uCisgICAgICAgIGlmICghSW5saW5lQ2FsbElmUG9zc2libGUoQ1MsIElubGluZUluZm8sIElubGluZWRBcnJheUFsbG9jYXMpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICArK051bUlubGluZWQ7CisgICAgICAgIAorICAgICAgICAvLyBJZiBpbmxpbmluZyB0aGlzIGZ1bmN0aW9uIGdhdmUgdXMgYW55IG5ldyBjYWxsIHNpdGVzLCB0aHJvdyB0aGVtCisgICAgICAgIC8vIG9udG8gb3VyIHdvcmtsaXN0IHRvIHByb2Nlc3MuICBUaGV5IGFyZSB1c2VmdWwgaW5saW5lIGNhbmRpZGF0ZXMuCisgICAgICAgIGlmICghSW5saW5lSW5mby5JbmxpbmVkQ2FsbHMuZW1wdHkoKSkgeworICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbmxpbmUgaGlzdG9yeSBlbnRyeSBmb3IgdGhpcywgc28gdGhhdCB3ZSByZW1lbWJlcgorICAgICAgICAgIC8vIHRoYXQgdGhlc2UgbmV3IGNhbGxzaXRlcyBjYW1lIGFib3V0IGR1ZSB0byBpbmxpbmluZyBDYWxsZWUuCisgICAgICAgICAgaW50IE5ld0hpc3RvcnlJRCA9IElubGluZUhpc3Rvcnkuc2l6ZSgpOworICAgICAgICAgIElubGluZUhpc3RvcnkucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKENhbGxlZSwgSW5saW5lSGlzdG9yeUlEKSk7CisKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5saW5lSW5mby5JbmxpbmVkQ2FsbHMuc2l6ZSgpOworICAgICAgICAgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICAgIFZhbHVlICpQdHIgPSBJbmxpbmVJbmZvLklubGluZWRDYWxsc1tpXTsKKyAgICAgICAgICAgIENhbGxTaXRlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQ2FsbFNpdGUoUHRyKSwgTmV3SGlzdG9yeUlEKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBVcGRhdGUgdGhlIGNhY2hlZCBjb3N0IGluZm8gd2l0aCB0aGUgaW5saW5lZCBjYWxsLgorICAgICAgICBncm93Q2FjaGVkQ29zdEluZm8oQ2FsbGVyLCBDYWxsZWUpOworICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiB3ZSBpbmxpbmVkIG9yIGRlbGV0ZWQgdGhlIGxhc3QgcG9zc2libGUgY2FsbCBzaXRlIHRvIHRoZSBmdW5jdGlvbiwKKyAgICAgIC8vIGRlbGV0ZSB0aGUgZnVuY3Rpb24gYm9keSBub3cuCisgICAgICBpZiAoQ2FsbGVlICYmIENhbGxlZS0+dXNlX2VtcHR5KCkgJiYgQ2FsbGVlLT5oYXNMb2NhbExpbmthZ2UoKSAmJgorICAgICAgICAgIC8vIFRPRE86IENhbiByZW1vdmUgaWYgaW4gU0NDIG5vdy4KKyAgICAgICAgICAhU0NDRnVuY3Rpb25zLmNvdW50KENhbGxlZSkgJiYKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBUaGUgZnVuY3Rpb24gbWF5IGJlIGFwcGFyZW50bHkgZGVhZCwgYnV0IGlmIHRoZXJlIGFyZSBpbmRpcmVjdAorICAgICAgICAgIC8vIGNhbGxncmFwaCByZWZlcmVuY2VzIHRvIHRoZSBub2RlLCB3ZSBjYW5ub3QgZGVsZXRlIGl0IHlldCwgdGhpcworICAgICAgICAgIC8vIGNvdWxkIGludmFsaWRhdGUgdGhlIENHU0NDIGl0ZXJhdG9yLgorICAgICAgICAgIENHW0NhbGxlZV0tPmdldE51bVJlZmVyZW5jZXMoKSA9PSAwKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICAgIC0+IERlbGV0aW5nIGRlYWQgZnVuY3Rpb246ICIKKyAgICAgICAgICAgICAgPDwgQ2FsbGVlLT5nZXROYW1lKCkgPDwgIlxuIik7CisgICAgICAgIENhbGxHcmFwaE5vZGUgKkNhbGxlZU5vZGUgPSBDR1tDYWxsZWVdOworICAgICAgICAKKyAgICAgICAgLy8gUmVtb3ZlIGFueSBjYWxsIGdyYXBoIGVkZ2VzIGZyb20gdGhlIGNhbGxlZSB0byBpdHMgY2FsbGVlcy4KKyAgICAgICAgQ2FsbGVlTm9kZS0+cmVtb3ZlQWxsQ2FsbGVkRnVuY3Rpb25zKCk7CisgICAgICAgIAorICAgICAgICByZXNldENhY2hlZENvc3RJbmZvKENhbGxlZSk7CisgICAgICAgIAorICAgICAgICAvLyBSZW1vdmluZyB0aGUgbm9kZSBmb3IgY2FsbGVlIGZyb20gdGhlIGNhbGwgZ3JhcGggYW5kIGRlbGV0ZSBpdC4KKyAgICAgICAgZGVsZXRlIENHLnJlbW92ZUZ1bmN0aW9uRnJvbU1vZHVsZShDYWxsZWVOb2RlKTsKKyAgICAgICAgKytOdW1EZWxldGVkOworICAgICAgfQorCisgICAgICAvLyBSZW1vdmUgdGhpcyBjYWxsIHNpdGUgZnJvbSB0aGUgbGlzdC4gIElmIHBvc3NpYmxlLCB1c2UgCisgICAgICAvLyBzd2FwL3BvcF9iYWNrIGZvciBlZmZpY2llbmN5LCBidXQgZG8gbm90IHVzZSBpdCBpZiBkb2luZyBzbyB3b3VsZAorICAgICAgLy8gbW92ZSBhIGNhbGwgc2l0ZSB0byBhIGZ1bmN0aW9uIGluIHRoaXMgU0NDIGJlZm9yZSB0aGUKKyAgICAgIC8vICdGaXJzdENhbGxJblNDQycgYmFycmllci4KKyAgICAgIGlmIChTQ0MuaXNTaW5ndWxhcigpKSB7CisgICAgICAgIENhbGxTaXRlc1tDU2ldID0gQ2FsbFNpdGVzLmJhY2soKTsKKyAgICAgICAgQ2FsbFNpdGVzLnBvcF9iYWNrKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDYWxsU2l0ZXMuZXJhc2UoQ2FsbFNpdGVzLmJlZ2luKCkrQ1NpKTsKKyAgICAgIH0KKyAgICAgIC0tQ1NpOworCisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIExvY2FsQ2hhbmdlID0gdHJ1ZTsKKyAgICB9CisgIH0gd2hpbGUgKExvY2FsQ2hhbmdlKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8gZG9GaW5hbGl6YXRpb24gLSBSZW1vdmUgbm93LWRlYWQgbGlua29uY2UgZnVuY3Rpb25zIGF0IHRoZSBlbmQgb2YKKy8vIHByb2Nlc3NpbmcgdG8gYXZvaWQgYnJlYWtpbmcgdGhlIFNDQyB0cmF2ZXJzYWwuCitib29sIElubGluZXI6OmRvRmluYWxpemF0aW9uKENhbGxHcmFwaCAmQ0cpIHsKKyAgcmV0dXJuIHJlbW92ZURlYWRGdW5jdGlvbnMoQ0cpOworfQorCisvLy8gcmVtb3ZlRGVhZEZ1bmN0aW9ucyAtIFJlbW92ZSBkZWFkIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4KKy8vLyBETlIgKERvIE5vdCBSZW1vdmUpIGxpc3QuCitib29sIElubGluZXI6OnJlbW92ZURlYWRGdW5jdGlvbnMoQ2FsbEdyYXBoICZDRywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgRnVuY3Rpb24gKiwgMTY+ICpETlIpIHsKKyAgU21hbGxQdHJTZXQ8Q2FsbEdyYXBoTm9kZSosIDE2PiBGdW5jdGlvbnNUb1JlbW92ZTsKKworICAvLyBTY2FuIGZvciBhbGwgb2YgdGhlIGZ1bmN0aW9ucywgbG9va2luZyBmb3Igb25lcyB0aGF0IHNob3VsZCBub3cgYmUgcmVtb3ZlZAorICAvLyBmcm9tIHRoZSBwcm9ncmFtLiAgSW5zZXJ0IHRoZSBkZWFkIG9uZXMgaW4gdGhlIEZ1bmN0aW9uc1RvUmVtb3ZlIHNldC4KKyAgZm9yIChDYWxsR3JhcGg6Oml0ZXJhdG9yIEkgPSBDRy5iZWdpbigpLCBFID0gQ0cuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgQ2FsbEdyYXBoTm9kZSAqQ0dOID0gSS0+c2Vjb25kOworICAgIGlmIChDR04tPmdldEZ1bmN0aW9uKCkgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIEZ1bmN0aW9uICpGID0gQ0dOLT5nZXRGdW5jdGlvbigpOworICAgIAorICAgIC8vIElmIHRoZSBvbmx5IHJlbWFpbmluZyB1c2VycyBvZiB0aGUgZnVuY3Rpb24gYXJlIGRlYWQgY29uc3RhbnRzLCByZW1vdmUKKyAgICAvLyB0aGVtLgorICAgIEYtPnJlbW92ZURlYWRDb25zdGFudFVzZXJzKCk7CisKKyAgICBpZiAoRE5SICYmIEROUi0+Y291bnQoRikpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIUYtPmhhc0xpbmtPbmNlTGlua2FnZSgpICYmICFGLT5oYXNMb2NhbExpbmthZ2UoKSAmJgorICAgICAgICAhRi0+aGFzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghRi0+dXNlX2VtcHR5KCkpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAvLyBSZW1vdmUgYW55IGNhbGwgZ3JhcGggZWRnZXMgZnJvbSB0aGUgZnVuY3Rpb24gdG8gaXRzIGNhbGxlZXMuCisgICAgQ0dOLT5yZW1vdmVBbGxDYWxsZWRGdW5jdGlvbnMoKTsKKworICAgIC8vIFJlbW92ZSBhbnkgZWRnZXMgZnJvbSB0aGUgZXh0ZXJuYWwgbm9kZSB0byB0aGUgZnVuY3Rpb24ncyBjYWxsIGdyYXBoCisgICAgLy8gbm9kZS4gIFRoZXNlIGVkZ2VzIG1pZ2h0IGhhdmUgYmVlbiBtYWRlIGlycmVsZWdhbnQgZHVlIHRvCisgICAgLy8gb3B0aW1pemF0aW9uIG9mIHRoZSBwcm9ncmFtLgorICAgIENHLmdldEV4dGVybmFsQ2FsbGluZ05vZGUoKS0+cmVtb3ZlQW55Q2FsbEVkZ2VUbyhDR04pOworCisgICAgLy8gUmVtb3ZpbmcgdGhlIG5vZGUgZm9yIGNhbGxlZSBmcm9tIHRoZSBjYWxsIGdyYXBoIGFuZCBkZWxldGUgaXQuCisgICAgRnVuY3Rpb25zVG9SZW1vdmUuaW5zZXJ0KENHTik7CisgIH0KKworICAvLyBOb3cgdGhhdCB3ZSBrbm93IHdoaWNoIGZ1bmN0aW9ucyB0byBkZWxldGUsIGRvIHNvLiAgV2UgZGlkbid0IHdhbnQgdG8gZG8KKyAgLy8gdGhpcyBpbmxpbmUsIGJlY2F1c2UgdGhhdCB3b3VsZCBpbnZhbGlkYXRlIG91ciBDYWxsR3JhcGg6Oml0ZXJhdG9yCisgIC8vIG9iamVjdHMuIDooCisgIC8vCisgIC8vIE5vdGUgdGhhdCBpdCBkb2Vzbid0IG1hdHRlciB0aGF0IHdlIGFyZSBpdGVyYXRpbmcgb3ZlciBhIG5vbi1zdGFibGUgc2V0CisgIC8vIGhlcmUgdG8gZG8gdGhpcywgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggb3JkZXIgdGhlIGZ1bmN0aW9ucyBhcmUgZGVsZXRlZAorICAvLyBpbi4KKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGZvciAoU21hbGxQdHJTZXQ8Q2FsbEdyYXBoTm9kZSosIDE2Pjo6aXRlcmF0b3IgSSA9IEZ1bmN0aW9uc1RvUmVtb3ZlLmJlZ2luKCksCisgICAgICAgRSA9IEZ1bmN0aW9uc1RvUmVtb3ZlLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIHJlc2V0Q2FjaGVkQ29zdEluZm8oKCpJKS0+Z2V0RnVuY3Rpb24oKSk7CisgICAgZGVsZXRlIENHLnJlbW92ZUZ1bmN0aW9uRnJvbU1vZHVsZSgqSSk7CisgICAgKytOdW1EZWxldGVkOworICAgIENoYW5nZWQgPSB0cnVlOworICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vSW50ZXJuYWxpemUuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0ludGVybmFsaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWQ5MTlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0ludGVybmFsaXplLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLy89PT0tLSBJbnRlcm5hbGl6ZS5jcHAgLSBNYXJrIGZ1bmN0aW9ucyBpbnRlcm5hbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgbG9vcHMgb3ZlciBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgaW5wdXQgbW9kdWxlLCBsb29raW5nIGZvciBhCisvLyBtYWluIGZ1bmN0aW9uLiAgSWYgYSBtYWluIGZ1bmN0aW9uIGlzIGZvdW5kLCBhbGwgb3RoZXIgZnVuY3Rpb25zIGFuZCBhbGwKKy8vIGdsb2JhbCB2YXJpYWJsZXMgd2l0aCBpbml0aWFsaXplcnMgYXJlIG1hcmtlZCBhcyBpbnRlcm5hbC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImludGVybmFsaXplIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUFsaWFzZXMgICwgIk51bWJlciBvZiBhbGlhc2VzIGludGVybmFsaXplZCIpOworU1RBVElTVElDKE51bUZ1bmN0aW9ucywgIk51bWJlciBvZiBmdW5jdGlvbnMgaW50ZXJuYWxpemVkIik7CitTVEFUSVNUSUMoTnVtR2xvYmFscyAgLCAiTnVtYmVyIG9mIGdsb2JhbCB2YXJzIGludGVybmFsaXplZCIpOworCisvLyBBUElGaWxlIC0gQSBmaWxlIHdoaWNoIGNvbnRhaW5zIGEgbGlzdCBvZiBzeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBtYXJrZWQKKy8vIGV4dGVybmFsLgorc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CitBUElGaWxlKCJpbnRlcm5hbGl6ZS1wdWJsaWMtYXBpLWZpbGUiLCBjbDo6dmFsdWVfZGVzYygiZmlsZW5hbWUiKSwKKyAgICAgICAgY2w6OmRlc2MoIkEgZmlsZSBjb250YWluaW5nIGxpc3Qgb2Ygc3ltYm9sIG5hbWVzIHRvIHByZXNlcnZlIikpOworCisvLyBBUElMaXN0IC0gQSBsaXN0IG9mIHN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIG1hcmtlZCBpbnRlcm5hbC4KK3N0YXRpYyBjbDo6bGlzdDxzdGQ6OnN0cmluZz4KK0FQSUxpc3QoImludGVybmFsaXplLXB1YmxpYy1hcGktbGlzdCIsIGNsOjp2YWx1ZV9kZXNjKCJsaXN0IiksCisgICAgICAgIGNsOjpkZXNjKCJBIGxpc3Qgb2Ygc3ltYm9sIG5hbWVzIHRvIHByZXNlcnZlIiksCisgICAgICAgIGNsOjpDb21tYVNlcGFyYXRlZCk7CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIEludGVybmFsaXplUGFzcyA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gRXh0ZXJuYWxOYW1lczsKKyAgICAvLy8gSWYgbm8gYXBpIHN5bWJvbHMgd2VyZSBzcGVjaWZpZWQgYW5kIGEgbWFpbiBmdW5jdGlvbiBpcyBkZWZpbmVkLAorICAgIC8vLyBhc3N1bWUgdGhlIG1haW4gZnVuY3Rpb24gaXMgdGhlIG9ubHkgQVBJCisgICAgYm9vbCBBbGxCdXRNYWluOworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBleHBsaWNpdCBJbnRlcm5hbGl6ZVBhc3MoYm9vbCBBbGxCdXRNYWluID0gdHJ1ZSk7CisgICAgZXhwbGljaXQgSW50ZXJuYWxpemVQYXNzKGNvbnN0IHN0ZDo6dmVjdG9yIDxjb25zdCBjaGFyICo+JiBleHBvcnRMaXN0KTsKKyAgICB2b2lkIExvYWRGaWxlKGNvbnN0IGNoYXIgKkZpbGVuYW1lKTsKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxDYWxsR3JhcGg+KCk7CisgICAgfQorICB9OworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCitjaGFyIEludGVybmFsaXplUGFzczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKEludGVybmFsaXplUGFzcywgImludGVybmFsaXplIiwKKyAgICAgICAgICAgICAgICAiSW50ZXJuYWxpemUgR2xvYmFsIFN5bWJvbHMiLCBmYWxzZSwgZmFsc2UpOworCitJbnRlcm5hbGl6ZVBhc3M6OkludGVybmFsaXplUGFzcyhib29sIEFsbEJ1dE1haW4pCisgIDogTW9kdWxlUGFzcyhJRCksIEFsbEJ1dE1haW4oQWxsQnV0TWFpbil7CisgIGlmICghQVBJRmlsZS5lbXB0eSgpKSAgICAgICAgICAgLy8gSWYgYSBmaWxlbmFtZSBpcyBzcGVjaWZpZWQsIHVzZSBpdC4KKyAgICBMb2FkRmlsZShBUElGaWxlLmNfc3RyKCkpOworICBpZiAoIUFQSUxpc3QuZW1wdHkoKSkgICAgICAgICAgIC8vIElmIGEgbGlzdCBpcyBzcGVjaWZpZWQsIHVzZSBpdCBhcyB3ZWxsLgorICAgIEV4dGVybmFsTmFtZXMuaW5zZXJ0KEFQSUxpc3QuYmVnaW4oKSwgQVBJTGlzdC5lbmQoKSk7Cit9CisKK0ludGVybmFsaXplUGFzczo6SW50ZXJuYWxpemVQYXNzKGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4mZXhwb3J0TGlzdCkKKyAgOiBNb2R1bGVQYXNzKElEKSwgQWxsQnV0TWFpbihmYWxzZSl7CisgIGZvcihzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+Ojpjb25zdF9pdGVyYXRvciBpdHIgPSBleHBvcnRMaXN0LmJlZ2luKCk7CisgICAgICAgIGl0ciAhPSBleHBvcnRMaXN0LmVuZCgpOyBpdHIrKykgeworICAgIEV4dGVybmFsTmFtZXMuaW5zZXJ0KCppdHIpOworICB9Cit9CisKK3ZvaWQgSW50ZXJuYWxpemVQYXNzOjpMb2FkRmlsZShjb25zdCBjaGFyICpGaWxlbmFtZSkgeworICAvLyBMb2FkIHRoZSBBUElGaWxlLi4uCisgIHN0ZDo6aWZzdHJlYW0gSW4oRmlsZW5hbWUpOworICBpZiAoIUluLmdvb2QoKSkgeworICAgIGVycnMoKSA8PCAiV0FSTklORzogSW50ZXJuYWxpemUgY291bGRuJ3QgbG9hZCBmaWxlICciIDw8IEZpbGVuYW1lCisgICAgICAgICA8PCAiJyEgQ29udGludWluZyBhcyBpZiBpdCdzIGVtcHR5LlxuIjsKKyAgICByZXR1cm47IC8vIEp1c3QgY29udGludWUgYXMgaWYgdGhlIGZpbGUgd2VyZSBlbXB0eQorICB9CisgIHdoaWxlIChJbikgeworICAgIHN0ZDo6c3RyaW5nIFN5bWJvbDsKKyAgICBJbiA+PiBTeW1ib2w7CisgICAgaWYgKCFTeW1ib2wuZW1wdHkoKSkKKyAgICAgIEV4dGVybmFsTmFtZXMuaW5zZXJ0KFN5bWJvbCk7CisgIH0KK30KKworYm9vbCBJbnRlcm5hbGl6ZVBhc3M6OnJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICBDYWxsR3JhcGggKkNHID0gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxDYWxsR3JhcGg+KCk7CisgIENhbGxHcmFwaE5vZGUgKkV4dGVybmFsTm9kZSA9IENHID8gQ0ctPmdldEV4dGVybmFsQ2FsbGluZ05vZGUoKSA6IDA7CisgIAorICBpZiAoRXh0ZXJuYWxOYW1lcy5lbXB0eSgpKSB7CisgICAgLy8gUmV0dXJuIGlmIHdlJ3JlIG5vdCBpbiAnYWxsIGJ1dCBtYWluJyBtb2RlIGFuZCBoYXZlIG5vIGV4dGVybmFsIGFwaQorICAgIGlmICghQWxsQnV0TWFpbikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBJZiBubyBsaXN0IG9yIGZpbGUgb2Ygc3ltYm9scyB3YXMgc3BlY2lmaWVkLCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYQorICAgIC8vICJtYWluIiBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgbW9kdWxlLiAgSWYgc28sIHVzZSBpdCwgb3RoZXJ3aXNlIGRvIG5vdAorICAgIC8vIGludGVybmFsaXplIHRoZSBtb2R1bGUsIGl0IG11c3QgYmUgYSBsaWJyYXJ5IG9yIHNvbWV0aGluZy4KKyAgICAvLworICAgIEZ1bmN0aW9uICpNYWluRnVuYyA9IE0uZ2V0RnVuY3Rpb24oIm1haW4iKTsKKyAgICBpZiAoTWFpbkZ1bmMgPT0gMCB8fCBNYWluRnVuYy0+aXNEZWNsYXJhdGlvbigpKQorICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gTm8gbWFpbiBmb3VuZCwgbXVzdCBiZSBhIGxpYnJhcnkuLi4KKworICAgIC8vIFByZXNlcnZlIG1haW4sIGludGVybmFsaXplIGFsbCBlbHNlLgorICAgIEV4dGVybmFsTmFtZXMuaW5zZXJ0KE1haW5GdW5jLT5nZXROYW1lKCkpOworICB9CisKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gTWFyayBhbGwgZnVuY3Rpb25zIG5vdCBpbiB0aGUgYXBpIGFzIGludGVybmFsLgorICAvLyBGSVhNRTogbWF5YmUgdXNlIHByaXZhdGUgbGlua2FnZT8KKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEkgPSBNLmJlZ2luKCksIEUgPSBNLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoIUktPmlzRGVjbGFyYXRpb24oKSAmJiAgICAgICAgIC8vIEZ1bmN0aW9uIG11c3QgYmUgZGVmaW5lZCBoZXJlCisgICAgICAgICFJLT5oYXNMb2NhbExpbmthZ2UoKSAmJiAgLy8gQ2FuJ3QgYWxyZWFkeSBoYXZlIGludGVybmFsIGxpbmthZ2UKKyAgICAgICAgIUV4dGVybmFsTmFtZXMuY291bnQoSS0+Z2V0TmFtZSgpKSkgey8vIE5vdCBtYXJrZWQgdG8ga2VlcCBleHRlcm5hbD8KKyAgICAgIEktPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSk7CisgICAgICAvLyBSZW1vdmUgYSBjYWxsZ3JhcGggZWRnZSBmcm9tIHRoZSBleHRlcm5hbCBub2RlIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICBpZiAoRXh0ZXJuYWxOb2RlKSBFeHRlcm5hbE5vZGUtPnJlbW92ZU9uZUFic3RyYWN0RWRnZVRvKCgqQ0cpW0ldKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgKytOdW1GdW5jdGlvbnM7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkludGVybmFsaXppbmcgZnVuYyAiIDw8IEktPmdldE5hbWUoKSA8PCAiXG4iKTsKKyAgICB9CisKKyAgLy8gTmV2ZXIgaW50ZXJuYWxpemUgdGhlIGxsdm0udXNlZCBzeW1ib2wuICBJdCBpcyB1c2VkIHRvIGltcGxlbWVudAorICAvLyBhdHRyaWJ1dGUoKHVzZWQpKS4KKyAgLy8gRklYTUU6IFNob3VsZG4ndCB0aGlzIGp1c3QgZmlsdGVyIG9uIGxsdm0ubWV0YWRhdGEgc2VjdGlvbj8/CisgIEV4dGVybmFsTmFtZXMuaW5zZXJ0KCJsbHZtLnVzZWQiKTsKKyAgRXh0ZXJuYWxOYW1lcy5pbnNlcnQoImxsdm0uY29tcGlsZXIudXNlZCIpOworCisgIC8vIE5ldmVyIGludGVybmFsaXplIGFuY2hvcnMgdXNlZCBieSB0aGUgbWFjaGluZSBtb2R1bGUgaW5mbywgZWxzZSB0aGUgaW5mbworICAvLyB3b24ndCBmaW5kIHRoZW0uICAoc2VlIE1hY2hpbmVNb2R1bGVJbmZvLikKKyAgRXh0ZXJuYWxOYW1lcy5pbnNlcnQoImxsdm0uZGJnLmNvbXBpbGVfdW5pdHMiKTsKKyAgRXh0ZXJuYWxOYW1lcy5pbnNlcnQoImxsdm0uZGJnLmdsb2JhbF92YXJpYWJsZXMiKTsKKyAgRXh0ZXJuYWxOYW1lcy5pbnNlcnQoImxsdm0uZGJnLnN1YnByb2dyYW1zIik7CisgIEV4dGVybmFsTmFtZXMuaW5zZXJ0KCJsbHZtLmdsb2JhbF9jdG9ycyIpOworICBFeHRlcm5hbE5hbWVzLmluc2VydCgibGx2bS5nbG9iYWxfZHRvcnMiKTsKKyAgRXh0ZXJuYWxOYW1lcy5pbnNlcnQoImxsdm0ubm9pbmxpbmUiKTsKKyAgRXh0ZXJuYWxOYW1lcy5pbnNlcnQoImxsdm0uZ2xvYmFsLmFubm90YXRpb25zIik7CisKKyAgLy8gTWFyayBhbGwgZ2xvYmFsIHZhcmlhYmxlcyB3aXRoIGluaXRpYWxpemVycyB0aGF0IGFyZSBub3QgaW4gdGhlIGFwaSBhcworICAvLyBpbnRlcm5hbCBhcyB3ZWxsLgorICAvLyBGSVhNRTogbWF5YmUgdXNlIHByaXZhdGUgbGlua2FnZT8KKyAgZm9yIChNb2R1bGU6Omdsb2JhbF9pdGVyYXRvciBJID0gTS5nbG9iYWxfYmVnaW4oKSwgRSA9IE0uZ2xvYmFsX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmICghSS0+aXNEZWNsYXJhdGlvbigpICYmICFJLT5oYXNMb2NhbExpbmthZ2UoKSAmJgorICAgICAgICAvLyBBdmFpbGFibGUgZXh0ZXJuYWxseSBpcyByZWFsbHkganVzdCBhICJkZWNsYXJhdGlvbiB3aXRoIGEgYm9keSIuCisgICAgICAgICFJLT5oYXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSgpICYmCisgICAgICAgICFFeHRlcm5hbE5hbWVzLmNvdW50KEktPmdldE5hbWUoKSkpIHsKKyAgICAgIEktPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSk7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICsrTnVtR2xvYmFsczsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiSW50ZXJuYWxpemVkIGd2YXIgIiA8PCBJLT5nZXROYW1lKCkgPDwgIlxuIik7CisgICAgfQorCisgIC8vIE1hcmsgYWxsIGFsaWFzZXMgdGhhdCBhcmUgbm90IGluIHRoZSBhcGkgYXMgaW50ZXJuYWwgYXMgd2VsbC4KKyAgZm9yIChNb2R1bGU6OmFsaWFzX2l0ZXJhdG9yIEkgPSBNLmFsaWFzX2JlZ2luKCksIEUgPSBNLmFsaWFzX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmICghSS0+aXNEZWNsYXJhdGlvbigpICYmICFJLT5oYXNJbnRlcm5hbExpbmthZ2UoKSAmJgorICAgICAgICAvLyBBdmFpbGFibGUgZXh0ZXJuYWxseSBpcyByZWFsbHkganVzdCBhICJkZWNsYXJhdGlvbiB3aXRoIGEgYm9keSIuCisgICAgICAgICFJLT5oYXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSgpICYmCisgICAgICAgICFFeHRlcm5hbE5hbWVzLmNvdW50KEktPmdldE5hbWUoKSkpIHsKKyAgICAgIEktPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSk7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICsrTnVtQWxpYXNlczsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiSW50ZXJuYWxpemVkIGFsaWFzICIgPDwgSS0+Z2V0TmFtZSgpIDw8ICJcbiIpOworICAgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworTW9kdWxlUGFzcyAqbGx2bTo6Y3JlYXRlSW50ZXJuYWxpemVQYXNzKGJvb2wgQWxsQnV0TWFpbikgeworICByZXR1cm4gbmV3IEludGVybmFsaXplUGFzcyhBbGxCdXRNYWluKTsKK30KKworTW9kdWxlUGFzcyAqbGx2bTo6Y3JlYXRlSW50ZXJuYWxpemVQYXNzKGNvbnN0IHN0ZDo6dmVjdG9yIDxjb25zdCBjaGFyICo+ICZlbCkgeworICByZXR1cm4gbmV3IEludGVybmFsaXplUGFzcyhlbCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vTG9vcEV4dHJhY3Rvci5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vTG9vcEV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4ZGZmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9Mb29wRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDI0MSBAQAorLy89PT0tIExvb3BFeHRyYWN0b3IuY3BwIC0gRXh0cmFjdCBlYWNoIGxvb3AgaW50byBhIG5ldyBmdW5jdGlvbiAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBIHBhc3Mgd3JhcHBlciBhcm91bmQgdGhlIEV4dHJhY3RMb29wKCkgc2NhbGFyIHRyYW5zZm9ybWF0aW9uIHRvIGV4dHJhY3QgZWFjaAorLy8gdG9wLWxldmVsIGxvb3AgaW50byBpdHMgb3duIG5ldyBmdW5jdGlvbi4gSWYgdGhlIGxvb3AgaXMgdGhlIE9OTFkgbG9vcCBpbiBhCisvLyBnaXZlbiBmdW5jdGlvbiwgaXQgaXMgbm90IHRvdWNoZWQuIFRoaXMgaXMgYSBwYXNzIG1vc3QgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKy8vIHZpYSBidWdwb2ludC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImxvb3AtZXh0cmFjdCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Z1bmN0aW9uVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtRXh0cmFjdGVkLCAiTnVtYmVyIG9mIGxvb3BzIGV4dHJhY3RlZCIpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgTG9vcEV4dHJhY3RvciA6IHB1YmxpYyBMb29wUGFzcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICB1bnNpZ25lZCBOdW1Mb29wczsKKworICAgIGV4cGxpY2l0IExvb3BFeHRyYWN0b3IodW5zaWduZWQgbnVtTG9vcHMgPSB+MCkgCisgICAgICA6IExvb3BQYXNzKElEKSwgTnVtTG9vcHMobnVtTG9vcHMpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25Mb29wKExvb3AgKkwsIExQUGFzc01hbmFnZXIgJkxQTSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuYWRkUmVxdWlyZWRJRChCcmVha0NyaXRpY2FsRWRnZXNJRCk7CisgICAgICBBVS5hZGRSZXF1aXJlZElEKExvb3BTaW1wbGlmeUlEKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPERvbWluYXRvclRyZWU+KCk7CisgICAgfQorICB9OworfQorCitjaGFyIExvb3BFeHRyYWN0b3I6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhMb29wRXh0cmFjdG9yLCAibG9vcC1leHRyYWN0IiwKKyAgICAgICAgICAgICAgICAiRXh0cmFjdCBsb29wcyBpbnRvIG5ldyBmdW5jdGlvbnMiLCBmYWxzZSwgZmFsc2UpOworCituYW1lc3BhY2UgeworICAvLy8gU2luZ2xlTG9vcEV4dHJhY3RvciAtIEZvciBidWdwb2ludC4KKyAgc3RydWN0IFNpbmdsZUxvb3BFeHRyYWN0b3IgOiBwdWJsaWMgTG9vcEV4dHJhY3RvciB7CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBTaW5nbGVMb29wRXh0cmFjdG9yKCkgOiBMb29wRXh0cmFjdG9yKDEpIHt9CisgIH07Cit9IC8vIEVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2NoYXIgU2luZ2xlTG9vcEV4dHJhY3Rvcjo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKFNpbmdsZUxvb3BFeHRyYWN0b3IsICJsb29wLWV4dHJhY3Qtc2luZ2xlIiwKKyAgICAgICAgICAgICAgICAiRXh0cmFjdCBhdCBtb3N0IG9uZSBsb29wIGludG8gYSBuZXcgZnVuY3Rpb24iLCBmYWxzZSwgZmFsc2UpOworCisvLyBjcmVhdGVMb29wRXh0cmFjdG9yUGFzcyAtIFRoaXMgcGFzcyBleHRyYWN0cyBhbGwgbmF0dXJhbCBsb29wcyBmcm9tIHRoZQorLy8gcHJvZ3JhbSBpbnRvIGEgZnVuY3Rpb24gaWYgaXQgY2FuLgorLy8KK1Bhc3MgKmxsdm06OmNyZWF0ZUxvb3BFeHRyYWN0b3JQYXNzKCkgeyByZXR1cm4gbmV3IExvb3BFeHRyYWN0b3IoKTsgfQorCitib29sIExvb3BFeHRyYWN0b3I6OnJ1bk9uTG9vcChMb29wICpMLCBMUFBhc3NNYW5hZ2VyICZMUE0pIHsKKyAgLy8gT25seSB2aXNpdCB0b3AtbGV2ZWwgbG9vcHMuCisgIGlmIChMLT5nZXRQYXJlbnRMb29wKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIExvb3BTaW1wbGlmeSBmb3JtIGlzIG5vdCBhdmFpbGFibGUsIHN0YXkgb3V0IG9mIHRyb3VibGUuCisgIGlmICghTC0+aXNMb29wU2ltcGxpZnlGb3JtKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIERvbWluYXRvclRyZWUgJkRUID0gZ2V0QW5hbHlzaXM8RG9taW5hdG9yVHJlZT4oKTsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSB0b3AtbGV2ZWwgbG9vcCBpbiB0aGlzIGZ1bmN0aW9uLCBleHRyYWN0IGFsbCBvZgorICAvLyB0aGUgbG9vcHMuIE90aGVyd2lzZSB0aGVyZSBpcyBleGFjdGx5IG9uZSB0b3AtbGV2ZWwgbG9vcDsgaW4gdGhpcyBjYXNlIGlmCisgIC8vIHRoaXMgZnVuY3Rpb24gaXMgbW9yZSB0aGFuIGEgbWluaW1hbCB3cmFwcGVyIGFyb3VuZCB0aGUgbG9vcCwgZXh0cmFjdAorICAvLyB0aGUgbG9vcC4KKyAgYm9vbCBTaG91bGRFeHRyYWN0TG9vcCA9IGZhbHNlOworCisgIC8vIEV4dHJhY3QgdGhlIGxvb3AgaWYgdGhlIGVudHJ5IGJsb2NrIGRvZXNuJ3QgYnJhbmNoIHRvIHRoZSBsb29wIGhlYWRlci4KKyAgVGVybWluYXRvckluc3QgKkVudHJ5VEkgPQorICAgIEwtPmdldEhlYWRlcigpLT5nZXRQYXJlbnQoKS0+Z2V0RW50cnlCbG9jaygpLmdldFRlcm1pbmF0b3IoKTsKKyAgaWYgKCFpc2E8QnJhbmNoSW5zdD4oRW50cnlUSSkgfHwKKyAgICAgICFjYXN0PEJyYW5jaEluc3Q+KEVudHJ5VEkpLT5pc1VuY29uZGl0aW9uYWwoKSB8fAorICAgICAgRW50cnlUSS0+Z2V0U3VjY2Vzc29yKDApICE9IEwtPmdldEhlYWRlcigpKQorICAgIFNob3VsZEV4dHJhY3RMb29wID0gdHJ1ZTsKKyAgZWxzZSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFueSBleGl0cyBmcm9tIHRoZSBsb29wIGFyZSBtb3JlIHRoYW4ganVzdCByZXR1cm4KKyAgICAvLyBibG9ja3MuCisgICAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDg+IEV4aXRCbG9ja3M7CisgICAgTC0+Z2V0RXhpdEJsb2NrcyhFeGl0QmxvY2tzKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRXhpdEJsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKCFpc2E8UmV0dXJuSW5zdD4oRXhpdEJsb2Nrc1tpXS0+Z2V0VGVybWluYXRvcigpKSkgeworICAgICAgICBTaG91bGRFeHRyYWN0TG9vcCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisgIGlmIChTaG91bGRFeHRyYWN0TG9vcCkgeworICAgIGlmIChOdW1Mb29wcyA9PSAwKSByZXR1cm4gQ2hhbmdlZDsKKyAgICAtLU51bUxvb3BzOworICAgIGlmIChFeHRyYWN0TG9vcChEVCwgTCkgIT0gMCkgeworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAvLyBBZnRlciBleHRyYWN0aW9uLCB0aGUgbG9vcCBpcyByZXBsYWNlZCBieSBhIGZ1bmN0aW9uIGNhbGwsIHNvCisgICAgICAvLyB3ZSBzaG91bGRuJ3QgdHJ5IHRvIHJ1biBhbnkgbW9yZSBsb29wIHBhc3NlcyBvbiBpdC4KKyAgICAgIExQTS5kZWxldGVMb29wRnJvbVF1ZXVlKEwpOworICAgIH0KKyAgICArK051bUV4dHJhY3RlZDsKKyAgfQorCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLyBjcmVhdGVTaW5nbGVMb29wRXh0cmFjdG9yUGFzcyAtIFRoaXMgcGFzcyBleHRyYWN0cyBvbmUgbmF0dXJhbCBsb29wIGZyb20gdGhlCisvLyBwcm9ncmFtIGludG8gYSBmdW5jdGlvbiBpZiBpdCBjYW4uICBUaGlzIGlzIHVzZWQgYnkgYnVncG9pbnQuCisvLworUGFzcyAqbGx2bTo6Y3JlYXRlU2luZ2xlTG9vcEV4dHJhY3RvclBhc3MoKSB7CisgIHJldHVybiBuZXcgU2luZ2xlTG9vcEV4dHJhY3RvcigpOworfQorCisKKy8vIEJsb2NrRmlsZSAtIEEgZmlsZSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YgYmxvY2tzIHRoYXQgc2hvdWxkIG5vdCBiZQorLy8gZXh0cmFjdGVkLgorc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CitCbG9ja0ZpbGUoImV4dHJhY3QtYmxvY2tzLWZpbGUiLCBjbDo6dmFsdWVfZGVzYygiZmlsZW5hbWUiKSwKKyAgICAgICAgICBjbDo6ZGVzYygiQSBmaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiBiYXNpYyBibG9ja3MgdG8gbm90IGV4dHJhY3QiKSwKKyAgICAgICAgICBjbDo6SGlkZGVuKTsKKworbmFtZXNwYWNlIHsKKyAgLy8vIEJsb2NrRXh0cmFjdG9yUGFzcyAtIFRoaXMgcGFzcyBpcyB1c2VkIGJ5IGJ1Z3BvaW50IHRvIGV4dHJhY3QgYWxsIGJsb2NrcworICAvLy8gZnJvbSB0aGUgbW9kdWxlIGludG8gdGhlaXIgb3duIGZ1bmN0aW9ucyBleGNlcHQgZm9yIHRob3NlIHNwZWNpZmllZCBieSB0aGUKKyAgLy8vIEJsb2Nrc1RvTm90RXh0cmFjdCBsaXN0LgorICBjbGFzcyBCbG9ja0V4dHJhY3RvclBhc3MgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgICAgdm9pZCBMb2FkRmlsZShjb25zdCBjaGFyICpGaWxlbmFtZSk7CisKKyAgICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gQmxvY2tzVG9Ob3RFeHRyYWN0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4gQmxvY2tzVG9Ob3RFeHRyYWN0QnlOYW1lOworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBCbG9ja0V4dHJhY3RvclBhc3MoKSA6IE1vZHVsZVBhc3MoSUQpIHsKKyAgICAgIGlmICghQmxvY2tGaWxlLmVtcHR5KCkpCisgICAgICAgIExvYWRGaWxlKEJsb2NrRmlsZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSk7CisgIH07Cit9CisKK2NoYXIgQmxvY2tFeHRyYWN0b3JQYXNzOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoQmxvY2tFeHRyYWN0b3JQYXNzLCAiZXh0cmFjdC1ibG9ja3MiLAorICAgICAgICAgICAgICAgICJFeHRyYWN0IEJhc2ljIEJsb2NrcyBGcm9tIE1vZHVsZSAoZm9yIGJ1Z3BvaW50IHVzZSkiLAorICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisKKy8vIGNyZWF0ZUJsb2NrRXh0cmFjdG9yUGFzcyAtIFRoaXMgcGFzcyBleHRyYWN0cyBhbGwgYmxvY2tzIChleGNlcHQgdGhvc2UKKy8vIHNwZWNpZmllZCBpbiB0aGUgYXJndW1lbnQgbGlzdCkgZnJvbSB0aGUgZnVuY3Rpb25zIGluIHRoZSBtb2R1bGUuCisvLworTW9kdWxlUGFzcyAqbGx2bTo6Y3JlYXRlQmxvY2tFeHRyYWN0b3JQYXNzKCkKK3sKKyAgcmV0dXJuIG5ldyBCbG9ja0V4dHJhY3RvclBhc3MoKTsKK30KKwordm9pZCBCbG9ja0V4dHJhY3RvclBhc3M6OkxvYWRGaWxlKGNvbnN0IGNoYXIgKkZpbGVuYW1lKSB7CisgIC8vIExvYWQgdGhlIEJsb2NrRmlsZS4uLgorICBzdGQ6Omlmc3RyZWFtIEluKEZpbGVuYW1lKTsKKyAgaWYgKCFJbi5nb29kKCkpIHsKKyAgICBlcnJzKCkgPDwgIldBUk5JTkc6IEJsb2NrRXh0cmFjdG9yIGNvdWxkbid0IGxvYWQgZmlsZSAnIiA8PCBGaWxlbmFtZQorICAgICAgICAgICA8PCAiJyFcbiI7CisgICAgcmV0dXJuOworICB9CisgIHdoaWxlIChJbikgeworICAgIHN0ZDo6c3RyaW5nIEZ1bmN0aW9uTmFtZSwgQmxvY2tOYW1lOworICAgIEluID4+IEZ1bmN0aW9uTmFtZTsKKyAgICBJbiA+PiBCbG9ja05hbWU7CisgICAgaWYgKCFCbG9ja05hbWUuZW1wdHkoKSkKKyAgICAgIEJsb2Nrc1RvTm90RXh0cmFjdEJ5TmFtZS5wdXNoX2JhY2soCisgICAgICAgICAgc3RkOjptYWtlX3BhaXIoRnVuY3Rpb25OYW1lLCBCbG9ja05hbWUpKTsKKyAgfQorfQorCitib29sIEJsb2NrRXh0cmFjdG9yUGFzczo6cnVuT25Nb2R1bGUoTW9kdWxlICZNKSB7CisgIHN0ZDo6c2V0PEJhc2ljQmxvY2sqPiBUcmFuc2xhdGVkQmxvY2tzVG9Ob3RFeHRyYWN0OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQmxvY2tzVG9Ob3RFeHRyYWN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBCYXNpY0Jsb2NrICpCQiA9IEJsb2Nrc1RvTm90RXh0cmFjdFtpXTsKKyAgICBGdW5jdGlvbiAqRiA9IEJCLT5nZXRQYXJlbnQoKTsKKworICAgIC8vIE1hcCB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBpbiB0aGlzIG1vZHVsZS4KKyAgICBGdW5jdGlvbiAqTUYgPSBNLmdldEZ1bmN0aW9uKEYtPmdldE5hbWUoKSk7CisgICAgYXNzZXJ0KE1GLT5nZXRGdW5jdGlvblR5cGUoKSA9PSBGLT5nZXRGdW5jdGlvblR5cGUoKSAmJiAiV3JvbmcgZnVuY3Rpb24/Iik7CisKKyAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIGluZGV4IHRoZSBiYXNpYyBibG9jayBpcyBpbiBpdHMgZnVuY3Rpb24uCisgICAgRnVuY3Rpb246Oml0ZXJhdG9yIEJCSSA9IE1GLT5iZWdpbigpOworICAgIHN0ZDo6YWR2YW5jZShCQkksIHN0ZDo6ZGlzdGFuY2UoRi0+YmVnaW4oKSwgRnVuY3Rpb246Oml0ZXJhdG9yKEJCKSkpOworICAgIFRyYW5zbGF0ZWRCbG9ja3NUb05vdEV4dHJhY3QuaW5zZXJ0KEJCSSk7CisgIH0KKworICB3aGlsZSAoIUJsb2Nrc1RvTm90RXh0cmFjdEJ5TmFtZS5lbXB0eSgpKSB7CisgICAgLy8gVGhlcmUncyBubyB3YXkgdG8gZmluZCBCQnMgYnkgbmFtZSB3aXRob3V0IGxvb2tpbmcgYXQgZXZlcnkgQkIgaW5zaWRlCisgICAgLy8gZXZlcnkgRnVuY3Rpb24uIEZvcnR1bmF0ZWx5LCB0aGlzIGlzIGFsd2F5cyBlbXB0eSBleGNlcHQgd2hlbiB1c2VkIGJ5CisgICAgLy8gYnVncG9pbnQgaW4gd2hpY2ggY2FzZSBjb3JyZWN0bmVzcyBpcyBtb3JlIGltcG9ydGFudCB0aGFuIHBlcmZvcm1hbmNlLgorCisgICAgc3RkOjpzdHJpbmcgJkZ1bmNOYW1lICA9IEJsb2Nrc1RvTm90RXh0cmFjdEJ5TmFtZS5iYWNrKCkuZmlyc3Q7CisgICAgc3RkOjpzdHJpbmcgJkJsb2NrTmFtZSA9IEJsb2Nrc1RvTm90RXh0cmFjdEJ5TmFtZS5iYWNrKCkuc2Vjb25kOworCisgICAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEZJID0gTS5iZWdpbigpLCBGRSA9IE0uZW5kKCk7IEZJICE9IEZFOyArK0ZJKSB7CisgICAgICBGdW5jdGlvbiAmRiA9ICpGSTsKKyAgICAgIGlmIChGLmdldE5hbWUoKSAhPSBGdW5jTmFtZSkgY29udGludWU7CisKKyAgICAgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEJJID0gRi5iZWdpbigpLCBCRSA9IEYuZW5kKCk7IEJJICE9IEJFOyArK0JJKSB7CisgICAgICAgIEJhc2ljQmxvY2sgJkJCID0gKkJJOworICAgICAgICBpZiAoQkIuZ2V0TmFtZSgpICE9IEJsb2NrTmFtZSkgY29udGludWU7CisKKyAgICAgICAgVHJhbnNsYXRlZEJsb2Nrc1RvTm90RXh0cmFjdC5pbnNlcnQoQkkpOworICAgICAgfQorICAgIH0KKworICAgIEJsb2Nrc1RvTm90RXh0cmFjdEJ5TmFtZS5wb3BfYmFjaygpOworICB9CisKKyAgLy8gTm93IHRoYXQgd2Uga25vdyB3aGljaCBibG9ja3MgdG8gbm90IGV4dHJhY3QsIGZpZ3VyZSBvdXQgd2hpY2ggb25lcyB3ZSBXQU5UCisgIC8vIHRvIGV4dHJhY3QuCisgIHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPiBCbG9ja3NUb0V4dHJhY3Q7CisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBGID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgRiAhPSBFOyArK0YpCisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpCisgICAgICBpZiAoIVRyYW5zbGF0ZWRCbG9ja3NUb05vdEV4dHJhY3QuY291bnQoQkIpKQorICAgICAgICBCbG9ja3NUb0V4dHJhY3QucHVzaF9iYWNrKEJCKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQmxvY2tzVG9FeHRyYWN0LnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgRXh0cmFjdEJhc2ljQmxvY2soQmxvY2tzVG9FeHRyYWN0W2ldKTsKKworICByZXR1cm4gIUJsb2Nrc1RvRXh0cmFjdC5lbXB0eSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL0xvd2VyU2V0Sm1wLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9Mb3dlclNldEptcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3MTVkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9Mb3dlclNldEptcC5jcHAKQEAgLTAsMCArMSw1NDUgQEAKKy8vPT09LSBMb3dlclNldEptcC5jcHAgLSBDb2RlIHBlcnRhaW5pbmcgdG8gbG93ZXJpbmcgc2V0L2xvbmcganVtcHMgLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBsb3dlcmluZyBvZiBzZXRqbXAgYW5kIGxvbmdqbXAgdG8gdXNlIHRoZQorLy8gIExMVk0gaW52b2tlIGFuZCB1bndpbmQgaW5zdHJ1Y3Rpb25zIGFzIG5lY2Vzc2FyeS4KKy8vCisvLyAgTG93ZXJpbmcgb2YgbG9uZ2ptcCBpcyBmYWlybHkgdHJpdmlhbC4gV2UgcmVwbGFjZSB0aGUgY2FsbCB3aXRoIGEKKy8vICBjYWxsIHRvIHRoZSBMTFZNIGxpYnJhcnkgZnVuY3Rpb24gIl9fbGx2bV9zamxqZWhfdGhyb3dfbG9uZ2ptcCgpIi4KKy8vICBUaGlzIHVud2luZHMgdGhlIHN0YWNrIGZvciB1cyBjYWxsaW5nIGFsbCBvZiB0aGUgZGVzdHJ1Y3RvcnMgZm9yCisvLyAgb2JqZWN0cyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorLy8KKy8vICBBdCBhIHNldGptcCBjYWxsLCB0aGUgYmFzaWMgYmxvY2sgaXMgc3BsaXQgYW5kIHRoZSBzZXRqbXAgcmVtb3ZlZC4KKy8vICBUaGUgY2FsbHMgaW4gYSBmdW5jdGlvbiB0aGF0IGhhdmUgYSBzZXRqbXAgYXJlIGNvbnZlcnRlZCB0byBpbnZva2UKKy8vICB3aGVyZSB0aGUgZXhjZXB0IHBhcnQgY2hlY2tzIHRvIHNlZSBpZiBpdCdzIGEgbG9uZ2ptcCBleGNlcHRpb24gYW5kLAorLy8gIGlmIHNvLCBpZiBpdCdzIGhhbmRsZWQgaW4gdGhlIGZ1bmN0aW9uLiBJZiBpdCBpcywgdGhlbiBpdCBnZXRzIHRoZQorLy8gIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBsb25nam1wIGFuZCBnb2VzIHRvIHdoZXJlIHRoZSBiYXNpYyBibG9jayB3YXMKKy8vICBzcGxpdC4gSW52b2tlIGluc3RydWN0aW9ucyBhcmUgaGFuZGxlZCBpbiBhIHNpbWlsYXIgZmFzaGlvbiB3aXRoIHRoZQorLy8gIG9yaWdpbmFsIGV4Y2VwdCBibG9jayBiZWluZyBleGVjdXRlZCBpZiBpdCBpc24ndCBhIGxvbmdqbXAgZXhjZXB0CisvLyAgdGhhdCBpcyBoYW5kbGVkIGJ5IHRoYXQgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZJWE1FOiBUaGlzIHBhc3MgZG9lc24ndCBkZWFsIHdpdGggUEhJIHN0YXRlbWVudHMganVzdCB5ZXQuIFRoYXQgaXMsCisvLyB3ZSBleHBlY3QgdGhpcyB0byBvY2N1ciBiZWZvcmUgU1NBaWZpY2F0aW9uIGlzIGRvbmUuIFRoaXMgd291bGQgc2VlbQorLy8gdG8gbWFrZSBzZW5zZSwgYnV0IGluIGdlbmVyYWwsIGl0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhIHRvIG1ha2UgdGhpcworLy8gcGFzcyBpbnZva2FibGUgdmlhIHRoZSAib3B0IiBjb21tYW5kIGF0IHdpbGwuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImxvd2Vyc2V0am1wIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8uaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0luc3RWaXNpdG9yLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSA8bWFwPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhMb25nSm1wc1RyYW5zZm9ybWVkLCAiTnVtYmVyIG9mIGxvbmdqbXBzIHRyYW5zZm9ybWVkIik7CitTVEFUSVNUSUMoU2V0Sm1wc1RyYW5zZm9ybWVkICwgIk51bWJlciBvZiBzZXRqbXBzIHRyYW5zZm9ybWVkIik7CitTVEFUSVNUSUMoQ2FsbHNUcmFuc2Zvcm1lZCAgICwgIk51bWJlciBvZiBjYWxscyBpbnZva2lmaWVkIik7CitTVEFUSVNUSUMoSW52b2tlc1RyYW5zZm9ybWVkICwgIk51bWJlciBvZiBpbnZva2VzIG1vZGlmaWVkIik7CisKK25hbWVzcGFjZSB7CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBMb3dlclNldEptcCBwYXNzIGltcGxlbWVudGF0aW9uLgorICBjbGFzcyBMb3dlclNldEptcCA6IHB1YmxpYyBNb2R1bGVQYXNzLCBwdWJsaWMgSW5zdFZpc2l0b3I8TG93ZXJTZXRKbXA+IHsKKyAgICAvLyBMTFZNIGxpYnJhcnkgZnVuY3Rpb25zLi4uCisgICAgQ29uc3RhbnQgKkluaXRTSk1hcDsgICAgICAgIC8vIF9fbGx2bV9zamxqZWhfaW5pdF9zZXRqbXBtYXAKKyAgICBDb25zdGFudCAqRGVzdHJveVNKTWFwOyAgICAgLy8gX19sbHZtX3NqbGplaF9kZXN0cm95X3NldGptcG1hcAorICAgIENvbnN0YW50ICpBZGRTSlRvTWFwOyAgICAgICAvLyBfX2xsdm1fc2psamVoX2FkZF9zZXRqbXBfdG9fbWFwCisgICAgQ29uc3RhbnQgKlRocm93TG9uZ0ptcDsgICAgIC8vIF9fbGx2bV9zamxqZWhfdGhyb3dfbG9uZ2ptcAorICAgIENvbnN0YW50ICpUcnlDYXRjaExKOyAgICAgICAvLyBfX2xsdm1fc2psamVoX3RyeV9jYXRjaGluZ19sb25nam1wX2V4Y2VwdGlvbgorICAgIENvbnN0YW50ICpJc0xKRXhjZXB0aW9uOyAgICAvLyBfX2xsdm1fc2psamVoX2lzX2xvbmdqbXBfZXhjZXB0aW9uCisgICAgQ29uc3RhbnQgKkdldExKVmFsdWU7ICAgICAgIC8vIF9fbGx2bV9zamxqZWhfZ2V0X2xvbmdqbXBfdmFsdWUKKworICAgIHR5cGVkZWYgc3RkOjpwYWlyPFN3aXRjaEluc3QqLCBDYWxsSW5zdCo+IFN3aXRjaFZhbHVlUGFpcjsKKworICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhvc2UgYmFzaWMgYmxvY2tzIHJlYWNoYWJsZSB2aWEgYSBkZXB0aC1maXJzdCBzZWFyY2ggb2YKKyAgICAvLyB0aGUgQ0ZHIGZyb20gYSBzZXRqbXAgY2FsbC4gV2Ugb25seSBuZWVkIHRvIHRyYW5zZm9ybSB0aG9zZSAiY2FsbCIgYW5kCisgICAgLy8gImludm9rZSIgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSBzZXRqbXAgY2FsbCBzaXRlLgorICAgIHN0ZDo6c2V0PEJhc2ljQmxvY2sqPiBERlNCbG9ja3M7CisKKyAgICAvLyBUaGUgc2V0am1wIG1hcCBpcyBnb2luZyB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHNldGptcHMKKyAgICAvLyB3ZXJlIGNhbGxlZCAoZWFjaCBzZXRqbXAgZ2V0cyBpdHMgb3duIG51bWJlcikgYW5kIHdpdGggd2hpY2gKKyAgICAvLyBidWZmZXIgaXQgd2FzIGNhbGxlZC4KKyAgICBzdGQ6Om1hcDxGdW5jdGlvbiosIEFsbG9jYUluc3QqPiAgICAgICAgICAgIFNKTWFwOworCisgICAgLy8gVGhlIHJldGhyb3cgYmFzaWMgYmxvY2sgbWFwIGhvbGRzIHRoZSBiYXNpYyBibG9jayB0byBicmFuY2ggdG8gaWYKKyAgICAvLyB0aGUgZXhjZXB0aW9uIGlzbid0IGhhbmRsZWQgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24gYW5kIG5lZWRzIHRvCisgICAgLy8gYmUgcmV0aHJvd24uCisgICAgc3RkOjptYXA8Y29uc3QgRnVuY3Rpb24qLCBCYXNpY0Jsb2NrKj4gICAgICBSZXRocm93QkJNYXA7CisKKyAgICAvLyBUaGUgcHJlbGltaW5hcnkgYmFzaWMgYmxvY2sgbWFwIGhvbGRzIGEgYmFzaWMgYmxvY2sgdGhhdCBncmFicyB0aGUKKyAgICAvLyBleGNlcHRpb24gYW5kIGRldGVybWluZXMgaWYgaXQncyBoYW5kbGVkIGJ5IHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAgIHN0ZDo6bWFwPGNvbnN0IEZ1bmN0aW9uKiwgQmFzaWNCbG9jayo+ICAgICAgUHJlbGltQkJNYXA7CisKKyAgICAvLyBUaGUgc3dpdGNoL3ZhbHVlIG1hcCBob2xkcyBhIHN3aXRjaCBpbnN0L2NhbGwgaW5zdCBwYWlyLiBUaGUKKyAgICAvLyBzd2l0Y2ggaW5zdCBjb250cm9scyB3aGljaCBoYW5kbGVyIChpZiBhbnkpIGdldHMgY2FsbGVkIGFuZCB0aGUKKyAgICAvLyB2YWx1ZSBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgdG8gdGhhdCBoYW5kbGVyIGJ5IHRoZSBjYWxsIHRvCisgICAgLy8gX19sbHZtX3NqbGplaF9nZXRfbG9uZ2ptcF92YWx1ZS4KKyAgICBzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiosIFN3aXRjaFZhbHVlUGFpcj4gIFN3aXRjaFZhbE1hcDsKKworICAgIC8vIEEgbWFwIG9mIHdoaWNoIHNldGptcHMgd2UndmUgc2VlbiBzbyBmYXIgaW4gYSBmdW5jdGlvbi4KKyAgICBzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiosIHVuc2lnbmVkPiAgICAgICAgIFNldEptcElETWFwOworCisgICAgQWxsb2NhSW5zdCogICAgIEdldFNldEptcE1hcChGdW5jdGlvbiogRnVuYyk7CisgICAgQmFzaWNCbG9jayogICAgIEdldFJldGhyb3dCQihGdW5jdGlvbiogRnVuYyk7CisgICAgU3dpdGNoVmFsdWVQYWlyIEdldFNKU3dpdGNoKEZ1bmN0aW9uKiBGdW5jLCBCYXNpY0Jsb2NrKiBSZXRocm93KTsKKworICAgIHZvaWQgVHJhbnNmb3JtTG9uZ0ptcENhbGwoQ2FsbEluc3QqIEluc3QpOworICAgIHZvaWQgVHJhbnNmb3JtU2V0Sm1wQ2FsbChDYWxsSW5zdCogSW5zdCk7CisKKyAgICBib29sIElzVHJhbnNmb3JtYWJsZUZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lKTsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgTG93ZXJTZXRKbXAoKSA6IE1vZHVsZVBhc3MoSUQpIHt9CisKKyAgICB2b2lkIHZpc2l0Q2FsbEluc3QoQ2FsbEluc3QmIENJKTsKKyAgICB2b2lkIHZpc2l0SW52b2tlSW5zdChJbnZva2VJbnN0JiBJSSk7CisgICAgdm9pZCB2aXNpdFJldHVybkluc3QoUmV0dXJuSW5zdCYgUkkpOworICAgIHZvaWQgdmlzaXRVbndpbmRJbnN0KFVud2luZEluc3QmIFVJKTsKKworICAgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlJiBNKTsKKyAgICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlJiBNKTsKKyAgfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworY2hhciBMb3dlclNldEptcDo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKExvd2VyU2V0Sm1wLCAibG93ZXJzZXRqbXAiLCAiTG93ZXIgU2V0IEp1bXAiLCBmYWxzZSwgZmFsc2UpOworCisvLyBydW4gLSBSdW4gdGhlIHRyYW5zZm9ybWF0aW9uIG9uIHRoZSBwcm9ncmFtLiBXZSBncmFiIHRoZSBmdW5jdGlvbgorLy8gcHJvdG90eXBlcyBmb3IgbG9uZ2ptcCBhbmQgc2V0am1wLiBJZiB0aGV5IGFyZSB1c2VkIGluIHRoZSBwcm9ncmFtLAorLy8gdGhlbiB3ZSBjYW4gZ28gZGlyZWN0bHkgdG8gdGhlIHBsYWNlcyB0aGV5J3JlIGF0IGFuZCB0cmFuc2Zvcm0gdGhlbS4KK2Jvb2wgTG93ZXJTZXRKbXA6OnJ1bk9uTW9kdWxlKE1vZHVsZSYgTSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICAvLyBUaGVzZSBhcmUgd2hhdCB0aGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQuCisgIEZ1bmN0aW9uKiBTZXRKbXAgPSBNLmdldEZ1bmN0aW9uKCJsbHZtLnNldGptcCIpOworICBGdW5jdGlvbiogTG9uZ0ptcCA9IE0uZ2V0RnVuY3Rpb24oImxsdm0ubG9uZ2ptcCIpOworCisgIC8vIFRoaXMgcHJvZ3JhbSBkb2Vzbid0IGhhdmUgbG9uZ2ptcCBhbmQgc2V0am1wIGNhbGxzLgorICBpZiAoKCFMb25nSm1wIHx8IExvbmdKbXAtPnVzZV9lbXB0eSgpKSAmJgorICAgICAgICAoIVNldEptcCB8fCBTZXRKbXAtPnVzZV9lbXB0eSgpKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgYW5kIGZ1bmN0aW9ucyB3ZSdsbCBuZWVkIHRvIHRyYW5zZm9ybSB0aGUKKyAgLy8gc2V0am1wL2xvbmdqbXAgZnVuY3Rpb25zLgorICBkb0luaXRpYWxpemF0aW9uKE0pOworCisgIGlmIChTZXRKbXApIHsKKyAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgQiA9IFNldEptcC0+dXNlX2JlZ2luKCksIEUgPSBTZXRKbXAtPnVzZV9lbmQoKTsKKyAgICAgICAgIEIgIT0gRTsgKytCKSB7CisgICAgICBCYXNpY0Jsb2NrKiBCQiA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpCKS0+Z2V0UGFyZW50KCk7CisgICAgICBmb3IgKGRmX2V4dF9pdGVyYXRvcjxCYXNpY0Jsb2NrKj4gSSA9IGRmX2V4dF9iZWdpbihCQiwgREZTQmxvY2tzKSwKKyAgICAgICAgICAgICBFID0gZGZfZXh0X2VuZChCQiwgREZTQmxvY2tzKTsgSSAhPSBFOyArK0kpCisgICAgICAgIC8qIGVtcHR5ICovOworICAgIH0KKworICAgIHdoaWxlICghU2V0Sm1wLT51c2VfZW1wdHkoKSkgeworICAgICAgYXNzZXJ0KGlzYTxDYWxsSW5zdD4oU2V0Sm1wLT51c2VfYmFjaygpKSAmJgorICAgICAgICAgICAgICJVc2VyIG9mIHNldGptcCBpbnRyaW5zaWMgbm90IGEgY2FsbD8iKTsKKyAgICAgIFRyYW5zZm9ybVNldEptcENhbGwoY2FzdDxDYWxsSW5zdD4oU2V0Sm1wLT51c2VfYmFjaygpKSk7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoTG9uZ0ptcCkKKyAgICB3aGlsZSAoIUxvbmdKbXAtPnVzZV9lbXB0eSgpKSB7CisgICAgICBhc3NlcnQoaXNhPENhbGxJbnN0PihMb25nSm1wLT51c2VfYmFjaygpKSAmJgorICAgICAgICAgICAgICJVc2VyIG9mIGxvbmdqbXAgaW50cmluc2ljIG5vdCBhIGNhbGw/Iik7CisgICAgICBUcmFuc2Zvcm1Mb25nSm1wQ2FsbChjYXN0PENhbGxJbnN0PihMb25nSm1wLT51c2VfYmFjaygpKSk7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgLy8gTm93IGdvIHRocm91Z2ggdGhlIGFmZmVjdGVkIGZ1bmN0aW9ucyBhbmQgY29udmVydCBjYWxscyBhbmQgaW52b2tlcworICAvLyB0byBuZXcgaW52b2tlcy4uLgorICBmb3IgKHN0ZDo6bWFwPEZ1bmN0aW9uKiwgQWxsb2NhSW5zdCo+OjppdGVyYXRvcgorICAgICAgQiA9IFNKTWFwLmJlZ2luKCksIEUgPSBTSk1hcC5lbmQoKTsgQiAhPSBFOyArK0IpIHsKKyAgICBGdW5jdGlvbiogRiA9IEItPmZpcnN0OworICAgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEJCID0gRi0+YmVnaW4oKSwgQkUgPSBGLT5lbmQoKTsgQkIgIT0gQkU7ICsrQkIpCisgICAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElCID0gQkItPmJlZ2luKCksIElFID0gQkItPmVuZCgpOyBJQiAhPSBJRTsgKSB7CisgICAgICAgIHZpc2l0KCpJQisrKTsKKyAgICAgICAgaWYgKElCICE9IEJCLT5lbmQoKSAmJiBJQi0+Z2V0UGFyZW50KCkgIT0gQkIpCisgICAgICAgICAgYnJlYWs7ICAvLyBUaGUgbmV4dCBpbnN0cnVjdGlvbiBnb3QgbW92ZWQgdG8gYSBkaWZmZXJlbnQgYmxvY2shCisgICAgICB9CisgIH0KKworICBERlNCbG9ja3MuY2xlYXIoKTsKKyAgU0pNYXAuY2xlYXIoKTsKKyAgUmV0aHJvd0JCTWFwLmNsZWFyKCk7CisgIFByZWxpbUJCTWFwLmNsZWFyKCk7CisgIFN3aXRjaFZhbE1hcC5jbGVhcigpOworICBTZXRKbXBJRE1hcC5jbGVhcigpOworCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLyBkb0luaXRpYWxpemF0aW9uIC0gRm9yIHRoZSBsb3dlciBsb25nL3NldGptcCBwYXNzLCB0aGlzIGVuc3VyZXMgdGhhdCBhCisvLyBtb2R1bGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBmb3IgdGhlIGludHJpc2ljIGZ1bmN0aW9ucyB3ZSBhcmUgZ29pbmcKKy8vIHRvIGNhbGwgdG8gY29udmVydCBsb25nam1wIGFuZCBzZXRqbXAgY2FsbHMuCisvLworLy8gVGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgc3VjY2Vzc2Z1bCwgdW5sZXNzIGl0IGlzbid0LgorYm9vbCBMb3dlclNldEptcDo6ZG9Jbml0aWFsaXphdGlvbihNb2R1bGUmIE0pCit7CisgIGNvbnN0IFR5cGUgKlNCUFR5ID0gVHlwZTo6Z2V0SW50OFB0clR5KE0uZ2V0Q29udGV4dCgpKTsKKyAgY29uc3QgVHlwZSAqU0JQUFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChTQlBUeSk7CisKKyAgLy8gTi5CLiBTZWUgbGx2bS9ydW50aW1lL0dDQ0xpYnJhcmllcy9saWJleGNlcHRpb24vU0pMSi1FeGNlcHRpb24uaCBmb3IKKyAgLy8gYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9sbG93aW5nIGxpYnJhcnkgZnVuY3Rpb25zLgorCisgIC8vIHZvaWQgX19sbHZtX3NqbGplaF9pbml0X3NldGptcG1hcCh2b2lkKiopCisgIEluaXRTSk1hcCA9IE0uZ2V0T3JJbnNlcnRGdW5jdGlvbigiX19sbHZtX3NqbGplaF9pbml0X3NldGptcG1hcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRWb2lkVHkoTS5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JQUFR5LCAoVHlwZSAqKTApOworICAvLyB2b2lkIF9fbGx2bV9zamxqZWhfZGVzdHJveV9zZXRqbXBtYXAodm9pZCoqKQorICBEZXN0cm95U0pNYXAgPSBNLmdldE9ySW5zZXJ0RnVuY3Rpb24oIl9fbGx2bV9zamxqZWhfZGVzdHJveV9zZXRqbXBtYXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0Vm9pZFR5KE0uZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUFBUeSwgKFR5cGUgKikwKTsKKworICAvLyB2b2lkIF9fbGx2bV9zamxqZWhfYWRkX3NldGptcF90b19tYXAodm9pZCoqLCB2b2lkKiwgdW5zaWduZWQpCisgIEFkZFNKVG9NYXAgPSBNLmdldE9ySW5zZXJ0RnVuY3Rpb24oIl9fbGx2bV9zamxqZWhfYWRkX3NldGptcF90b19tYXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldFZvaWRUeShNLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JQUFR5LCBTQlBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQzMlR5KE0uZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHlwZSAqKTApOworCisgIC8vIHZvaWQgX19sbHZtX3NqbGplaF90aHJvd19sb25nam1wKGludCosIGludCkKKyAgVGhyb3dMb25nSm1wID0gTS5nZXRPckluc2VydEZ1bmN0aW9uKCJfX2xsdm1fc2psamVoX3Rocm93X2xvbmdqbXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0Vm9pZFR5KE0uZ2V0Q29udGV4dCgpKSwgU0JQVHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50MzJUeShNLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHlwZSAqKTApOworCisgIC8vIHVuc2lnbmVkIF9fbGx2bV9zamxqZWhfdHJ5X2NhdGNoaW5nX2xvbmdqbXBfZXhjZXB0aW9uKHZvaWQgKiopCisgIFRyeUNhdGNoTEogPQorICAgIE0uZ2V0T3JJbnNlcnRGdW5jdGlvbigiX19sbHZtX3NqbGplaF90cnlfY2F0Y2hpbmdfbG9uZ2ptcF9leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQzMlR5KE0uZ2V0Q29udGV4dCgpKSwgU0JQUFR5LCAoVHlwZSAqKTApOworCisgIC8vIGJvb2wgX19sbHZtX3NqbGplaF9pc19sb25nam1wX2V4Y2VwdGlvbigpCisgIElzTEpFeGNlcHRpb24gPSBNLmdldE9ySW5zZXJ0RnVuY3Rpb24oIl9fbGx2bV9zamxqZWhfaXNfbG9uZ2ptcF9leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDFUeShNLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFR5cGUgKikwKTsKKworICAvLyBpbnQgX19sbHZtX3NqbGplaF9nZXRfbG9uZ2ptcF92YWx1ZSgpCisgIEdldExKVmFsdWUgPSBNLmdldE9ySW5zZXJ0RnVuY3Rpb24oIl9fbGx2bV9zamxqZWhfZ2V0X2xvbmdqbXBfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDMyVHkoTS5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUeXBlICopMCk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBJc1RyYW5zZm9ybWFibGVGdW5jdGlvbiAtIFJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBuYW1lIGlzbid0IG9uZQorLy8gb2YgdGhlIG9uZXMgd2UgZG9uJ3Qgd2FudCB0cmFuc2Zvcm1lZC4gQ3VycmVudGx5LCBkb24ndCB0cmFuc2Zvcm0gYW55CisvLyAibGx2bS57c2V0am1wLGxvbmdqbXB9IiBmdW5jdGlvbnMgYW5kIG5vbmUgb2YgdGhlIHNldGptcC9sb25nam1wIGVycm9yCisvLyBoYW5kbGluZyBmdW5jdGlvbnMgKGJlZ2lubmluZyB3aXRoIF9fbGx2bV9zamxqZWhfLi4udGhleSBkb24ndCB0aHJvdworLy8gZXhjZXB0aW9ucykuCitib29sIExvd2VyU2V0Sm1wOjpJc1RyYW5zZm9ybWFibGVGdW5jdGlvbihTdHJpbmdSZWYgTmFtZSkgeworICByZXR1cm4gIU5hbWUuc3RhcnRzd2l0aCgiX19sbHZtX3NqbGplaF8iKTsKK30KKworLy8gVHJhbnNmb3JtTG9uZ0ptcENhbGwgLSBUcmFuc2Zvcm0gYSBsb25nam1wIGNhbGwgaW50byBhIGNhbGwgdG8gdGhlCisvLyBpbnRlcm5hbCBfX2xsdm1fc2psamVoX3Rocm93X2xvbmdqbXAgZnVuY3Rpb24uIEl0IHRoZW4gdGFrZXMgY2FyZSBvZgorLy8gdGhyb3dpbmcgdGhlIGV4Y2VwdGlvbiBmb3IgdXMuCit2b2lkIExvd2VyU2V0Sm1wOjpUcmFuc2Zvcm1Mb25nSm1wQ2FsbChDYWxsSW5zdCogSW5zdCkKK3sKKyAgY29uc3QgVHlwZSogU0JQVHkgPSBUeXBlOjpnZXRJbnQ4UHRyVHkoSW5zdC0+Z2V0Q29udGV4dCgpKTsKKworICAvLyBDcmVhdGUgdGhlIGNhbGwgdG8gIl9fbGx2bV9zamxqZWhfdGhyb3dfbG9uZ2ptcCIuIFRoaXMgdGFrZXMgdGhlCisgIC8vIHNhbWUgcGFyYW1ldGVycyBhcyAibG9uZ2ptcCIsIGV4Y2VwdCB0aGF0IHRoZSBidWZmZXIgaXMgY2FzdCB0byBhCisgIC8vIGNoYXIqLiBJdCByZXR1cm5zICJ2b2lkIiwgc28gaXQgZG9lc24ndCBuZWVkIHRvIHJlcGxhY2UgYW55IG9mCisgIC8vIEluc3QncyB1c2VzIGFuZCBkb2Vzbid0IGdldCBhIG5hbWUuCisgIENhc3RJbnN0KiBDSSA9IAorICAgIG5ldyBCaXRDYXN0SW5zdChJbnN0LT5nZXRBcmdPcGVyYW5kKDApLCBTQlBUeSwgIkxKQnVmIiwgSW5zdCk7CisgIFZhbHVlICpBcmdzW10gPSB7IENJLCBJbnN0LT5nZXRBcmdPcGVyYW5kKDEpIH07CisgIENhbGxJbnN0OjpDcmVhdGUoVGhyb3dMb25nSm1wLCBBcmdzLCBBcmdzICsgMiwgIiIsIEluc3QpOworCisgIFN3aXRjaFZhbHVlUGFpciYgU1ZQID0gU3dpdGNoVmFsTWFwW0luc3QtPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKV07CisKKyAgLy8gSWYgdGhlIGZ1bmN0aW9uIGhhcyBhIHNldGptcCBjYWxsIGluIGl0ICh0aGV5IGFyZSB0cmFuc2Zvcm1lZCBmaXJzdCkKKyAgLy8gd2Ugc2hvdWxkIGJyYW5jaCB0byB0aGUgYmFzaWMgYmxvY2sgdGhhdCBkZXRlcm1pbmVzIGlmIHRoaXMgbG9uZ2ptcAorICAvLyBpcyBhcHBsaWNhYmxlIGhlcmUuIE90aGVyd2lzZSwgaXNzdWUgYW4gdW53aW5kLgorICBpZiAoU1ZQLmZpcnN0KQorICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShTVlAuZmlyc3QtPmdldFBhcmVudCgpLCBJbnN0KTsKKyAgZWxzZQorICAgIG5ldyBVbndpbmRJbnN0KEluc3QtPmdldENvbnRleHQoKSwgSW5zdCk7CisKKyAgLy8gUmVtb3ZlIGFsbCBpbnN0cyBhZnRlciB0aGUgYnJhbmNoL3Vud2luZCBpbnN0LiAgR28gZnJvbSBiYWNrIHRvIGZyb250IHRvCisgIC8vIGF2b2lkIHJlcGxhY2VBbGxVc2VzV2l0aCBpZiBwb3NzaWJsZS4KKyAgQmFzaWNCbG9jayAqQkIgPSBJbnN0LT5nZXRQYXJlbnQoKTsKKyAgSW5zdHJ1Y3Rpb24gKlJlbW92ZWQ7CisgIGRvIHsKKyAgICBSZW1vdmVkID0gJkJCLT5iYWNrKCk7CisgICAgLy8gSWYgdGhlIHJlbW92ZWQgaW5zdHJ1Y3Rpb25zIGhhdmUgYW55IHVzZXJzLCByZXBsYWNlIHRoZW0gbm93LgorICAgIGlmICghUmVtb3ZlZC0+dXNlX2VtcHR5KCkpCisgICAgICBSZW1vdmVkLT5yZXBsYWNlQWxsVXNlc1dpdGgoVW5kZWZWYWx1ZTo6Z2V0KFJlbW92ZWQtPmdldFR5cGUoKSkpOworICAgIFJlbW92ZWQtPmVyYXNlRnJvbVBhcmVudCgpOworICB9IHdoaWxlIChSZW1vdmVkICE9IEluc3QpOworCisgICsrTG9uZ0ptcHNUcmFuc2Zvcm1lZDsKK30KKworLy8gR2V0U2V0Sm1wTWFwIC0gUmV0cmlldmUgKGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSwgaWYgbmVjZXNzYXJ5KSB0aGUKKy8vIHNldGptcCBtYXAuIFRoaXMgbWFwIGlzIGdvaW5nIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggc2V0am1wcworLy8gd2VyZSBjYWxsZWQgKGVhY2ggc2V0am1wIGdldHMgaXRzIG93biBudW1iZXIpIGFuZCB3aXRoIHdoaWNoIGJ1ZmZlciBpdAorLy8gd2FzIGNhbGxlZC4gVGhlcmUgY2FuIGJlIG9ubHkgb25lIQorQWxsb2NhSW5zdCogTG93ZXJTZXRKbXA6OkdldFNldEptcE1hcChGdW5jdGlvbiogRnVuYykKK3sKKyAgaWYgKFNKTWFwW0Z1bmNdKSByZXR1cm4gU0pNYXBbRnVuY107CisKKyAgLy8gSW5zZXJ0IHRoZSBzZXRqbXAgbWFwIGluaXRpYWxpemF0aW9uIGJlZm9yZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4KKyAgLy8gdGhlIGZ1bmN0aW9uLgorICBJbnN0cnVjdGlvbiogSW5zdCA9IEZ1bmMtPmdldEVudHJ5QmxvY2soKS5iZWdpbigpOworICBhc3NlcnQoSW5zdCAmJiAiQ291bGRuJ3QgZmluZCBldmVuIE9ORSBpbnN0cnVjdGlvbiBpbiBlbnRyeSBibG9jayEiKTsKKworICAvLyBGaWxsIGluIHRoZSBhbGxvY2EgYW5kIGNhbGwgdG8gaW5pdGlhbGl6ZSB0aGUgU0ogbWFwLgorICBjb25zdCBUeXBlICpTQlBUeSA9CisgICAgICAgIFR5cGU6OmdldEludDhQdHJUeShGdW5jLT5nZXRDb250ZXh0KCkpOworICBBbGxvY2FJbnN0KiBNYXAgPSBuZXcgQWxsb2NhSW5zdChTQlBUeSwgMCwgIlNKTWFwIiwgSW5zdCk7CisgIENhbGxJbnN0OjpDcmVhdGUoSW5pdFNKTWFwLCBNYXAsICIiLCBJbnN0KTsKKyAgcmV0dXJuIFNKTWFwW0Z1bmNdID0gTWFwOworfQorCisvLyBHZXRSZXRocm93QkIgLSBPbmx5IG9uZSByZXRocm93IGJhc2ljIGJsb2NrIGlzIG5lZWRlZCBwZXIgZnVuY3Rpb24uCisvLyBJZiB0aGlzIGlzIGEgbG9uZ2ptcCBleGNlcHRpb24gYnV0IG5vdCBoYW5kbGVkIGluIHRoaXMgYmxvY2ssIHRoaXMgQkIKKy8vIHBlcmZvcm1zIHRoZSByZXRocm93LgorQmFzaWNCbG9jayogTG93ZXJTZXRKbXA6OkdldFJldGhyb3dCQihGdW5jdGlvbiogRnVuYykKK3sKKyAgaWYgKFJldGhyb3dCQk1hcFtGdW5jXSkgcmV0dXJuIFJldGhyb3dCQk1hcFtGdW5jXTsKKworICAvLyBUaGUgYmFzaWMgYmxvY2sgd2UncmUgZ29pbmcgdG8ganVtcCB0byBpZiB3ZSBuZWVkIHRvIHJldGhyb3cgdGhlCisgIC8vIGV4Y2VwdGlvbi4KKyAgQmFzaWNCbG9jayogUmV0aHJvdyA9CisgICAgICAgIEJhc2ljQmxvY2s6OkNyZWF0ZShGdW5jLT5nZXRDb250ZXh0KCksICJSZXRocm93RXhjZXB0IiwgRnVuYyk7CisKKyAgLy8gRmlsbCBpbiB0aGUgIlJldGhyb3ciIEJCIHdpdGggYSBjYWxsIHRvIHJldGhyb3cgdGhlIGV4Y2VwdGlvbi4gVGhpcworICAvLyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGUgQkIgc2luY2UgYXQgdGhpcyBwb2ludCB0aGUgcnVudGltZQorICAvLyBzaG91bGQgZXhpdCB0aGlzIGZ1bmN0aW9uIGFuZCBnbyB0byB0aGUgbmV4dCBmdW5jdGlvbi4KKyAgbmV3IFVud2luZEluc3QoRnVuYy0+Z2V0Q29udGV4dCgpLCBSZXRocm93KTsKKyAgcmV0dXJuIFJldGhyb3dCQk1hcFtGdW5jXSA9IFJldGhyb3c7Cit9CisKKy8vIEdldFNKU3dpdGNoIC0gUmV0dXJuIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHRoYXQgY29udHJvbHMgd2hpY2ggaGFuZGxlcgorLy8gKGlmIGFueSkgZ2V0cyBjYWxsZWQgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCB0byB0aGF0IGhhbmRsZXIuCitMb3dlclNldEptcDo6U3dpdGNoVmFsdWVQYWlyIExvd2VyU2V0Sm1wOjpHZXRTSlN3aXRjaChGdW5jdGlvbiogRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqIFJldGhyb3cpCit7CisgIGlmIChTd2l0Y2hWYWxNYXBbRnVuY10uZmlyc3QpIHJldHVybiBTd2l0Y2hWYWxNYXBbRnVuY107CisKKyAgQmFzaWNCbG9jayogTG9uZ0ptcFByZSA9CisgICAgICAgIEJhc2ljQmxvY2s6OkNyZWF0ZShGdW5jLT5nZXRDb250ZXh0KCksICJMb25nSm1wQmxrUHJlIiwgRnVuYyk7CisKKyAgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJlbGltaW5hcnkgYmFzaWMgYmxvY2sgZm9yIHNvbWUgb2YgdGhlIG90aGVyCisgIC8vIHRyYW5zZm9ybWF0aW9ucy4KKyAgUHJlbGltQkJNYXBbRnVuY10gPSBMb25nSm1wUHJlOworCisgIC8vIEdyYWIgdGhlIGV4Y2VwdGlvbi4KKyAgQ2FsbEluc3QqIENvbmQgPSBDYWxsSW5zdDo6Q3JlYXRlKElzTEpFeGNlcHRpb24sICJJc0xKRXhjZXB0IiwgTG9uZ0ptcFByZSk7CisKKyAgLy8gVGhlICJkZWNpc2lvbiBiYXNpYyBibG9jayIgZ2V0cyB0aGUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgLy8gc2V0am1wIGNhbGwgcmV0dXJuaW5nIHRvIHN3aXRjaCBvbiBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgIC8vIGxvbmdqbXAuCisgIEJhc2ljQmxvY2sqIERlY2lzaW9uQkIgPQorICAgICAgICBCYXNpY0Jsb2NrOjpDcmVhdGUoRnVuYy0+Z2V0Q29udGV4dCgpLCAiTEpEZWNpc2lvbkJCIiwgRnVuYyk7CisKKyAgQnJhbmNoSW5zdDo6Q3JlYXRlKERlY2lzaW9uQkIsIFJldGhyb3csIENvbmQsIExvbmdKbXBQcmUpOworCisgIC8vIEZpbGwgaW4gdGhlICJkZWNpc2lvbiIgYmFzaWMgYmxvY2suCisgIENhbGxJbnN0KiBMSlZhbCA9IENhbGxJbnN0OjpDcmVhdGUoR2V0TEpWYWx1ZSwgIkxKVmFsIiwgRGVjaXNpb25CQik7CisgIENhbGxJbnN0KiBTSk51bSA9IENhbGxJbnN0OjpDcmVhdGUoVHJ5Q2F0Y2hMSiwgR2V0U2V0Sm1wTWFwKEZ1bmMpLCAiU0pOdW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2lzaW9uQkIpOworCisgIFN3aXRjaEluc3QqIFNJID0gU3dpdGNoSW5zdDo6Q3JlYXRlKFNKTnVtLCBSZXRocm93LCAwLCBEZWNpc2lvbkJCKTsKKyAgcmV0dXJuIFN3aXRjaFZhbE1hcFtGdW5jXSA9IFN3aXRjaFZhbHVlUGFpcihTSSwgTEpWYWwpOworfQorCisvLyBUcmFuc2Zvcm1TZXRKbXBDYWxsIC0gVGhlIHNldGptcCBjYWxsIGlzIGEgYml0IHRyaWNraWVyIHRvIHRyYW5zZm9ybS4KKy8vIFdlJ3JlIGdvaW5nIHRvIGNvbnZlcnQgYWxsIHNldGptcCBjYWxscyB0byBub3BzLiBUaGVuIGFsbCAiY2FsbCIgYW5kCisvLyAiaW52b2tlIiBpbnN0cnVjdGlvbnMgaW4gdGhlIGZ1bmN0aW9uIGFyZSBjb252ZXJ0ZWQgdG8gImludm9rZSIgd2hlcmUKKy8vIHRoZSAiZXhjZXB0IiBicmFuY2ggaXMgdXNlZCB3aGVuIHJldHVybmluZyBmcm9tIGEgbG9uZ2ptcCBjYWxsLgordm9pZCBMb3dlclNldEptcDo6VHJhbnNmb3JtU2V0Sm1wQ2FsbChDYWxsSW5zdCogSW5zdCkKK3sKKyAgQmFzaWNCbG9jayogQUJsb2NrID0gSW5zdC0+Z2V0UGFyZW50KCk7CisgIEZ1bmN0aW9uKiBGdW5jID0gQUJsb2NrLT5nZXRQYXJlbnQoKTsKKworICAvLyBBZGQgdGhpcyBzZXRqbXAgdG8gdGhlIHNldGptcCBtYXAuCisgIGNvbnN0IFR5cGUqIFNCUFR5ID0KKyAgICAgICAgICBUeXBlOjpnZXRJbnQ4UHRyVHkoSW5zdC0+Z2V0Q29udGV4dCgpKTsKKyAgQ2FzdEluc3QqIEJ1ZlB0ciA9IAorICAgIG5ldyBCaXRDYXN0SW5zdChJbnN0LT5nZXRBcmdPcGVyYW5kKDApLCBTQlBUeSwgIlNCSm1wQnVmIiwgSW5zdCk7CisgIFZhbHVlICpBcmdzW10gPSB7CisgICAgR2V0U2V0Sm1wTWFwKEZ1bmMpLCBCdWZQdHIsCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEluc3QtPmdldENvbnRleHQoKSksIFNldEptcElETWFwW0Z1bmNdKyspCisgIH07CisgIENhbGxJbnN0OjpDcmVhdGUoQWRkU0pUb01hcCwgQXJncywgQXJncyArIDMsICIiLCBJbnN0KTsKKworICAvLyBXZSBhcmUgZ3VhcmFudGVlZCB0aGF0IHRoZXJlIGFyZSBubyB2YWx1ZXMgbGl2ZSBhY3Jvc3MgYmFzaWMgYmxvY2tzCisgIC8vIChiZWNhdXNlIHdlIGFyZSAibm90IGluIFNTQSBmb3JtIiB5ZXQpLCBidXQgdGhlcmUgY2FuIHN0aWxsIGJlIHZhbHVlcyBsaXZlCisgIC8vIGluIGJhc2ljIGJsb2Nrcy4gIEJlY2F1c2Ugb2YgdGhpcywgc3BsaXR0aW5nIHRoZSBzZXRqbXAgYmxvY2sgY2FuIGNhdXNlCisgIC8vIHZhbHVlcyBhYm92ZSB0aGUgc2V0am1wIHRvIG5vdCBkb21pbmF0ZSB1c2VzIHdoaWNoIGFyZSBhZnRlciB0aGUgc2V0am1wCisgIC8vIGNhbGwuICBGb3IgYWxsIG9mIHRoZXNlIG9jY2FzaW9ucywgd2UgbXVzdCBzcGlsbCB0aGUgdmFsdWUgdG8gdGhlIHN0YWNrLgorICAvLworICBzdGQ6OnNldDxJbnN0cnVjdGlvbio+IEluc3Ryc0FmdGVyQ2FsbDsKKworICAvLyBUaGUgY2FsbCBpcyBwcm9iYWJseSB2ZXJ5IGNsb3NlIHRvIHRoZSBlbmQgb2YgdGhlIGJhc2ljIGJsb2NrLCBmb3IgdGhlCisgIC8vIGNvbW1vbiB1c2FnZSBwYXR0ZXJuIG9mOiAnaWYgKHNldGptcCguLi4pKScsIHNvIGtlZXAgdHJhY2sgb2YgdGhlCisgIC8vIGluc3RydWN0aW9ucyBhZnRlciB0aGUgY2FsbC4KKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gKytCYXNpY0Jsb2NrOjppdGVyYXRvcihJbnN0KSwgRSA9IEFCbG9jay0+ZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgSW5zdHJzQWZ0ZXJDYWxsLmluc2VydChJKTsKKworICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gQUJsb2NrLT5iZWdpbigpOworICAgICAgIElJICE9IEJhc2ljQmxvY2s6Oml0ZXJhdG9yKEluc3QpOyArK0lJKQorICAgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIHVzZXMgb2YgaW5zdHJ1Y3Rpb24uICBJZiBhbnkgb2YgdGhlbSBhcmUgYWZ0ZXIgdGhlCisgICAgLy8gY2FsbCwgInNwaWxsIiB0aGUgdmFsdWUgdG8gdGhlIHN0YWNrLgorICAgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IElJLT51c2VfYmVnaW4oKSwgRSA9IElJLT51c2VfZW5kKCk7CisgICAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgICBVc2VyICpVID0gKlVJOworICAgICAgaWYgKGNhc3Q8SW5zdHJ1Y3Rpb24+KFUpLT5nZXRQYXJlbnQoKSAhPSBBQmxvY2sgfHwKKyAgICAgICAgICBJbnN0cnNBZnRlckNhbGwuY291bnQoY2FzdDxJbnN0cnVjdGlvbj4oVSkpKSB7CisgICAgICAgIERlbW90ZVJlZ1RvU3RhY2soKklJKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICBJbnN0cnNBZnRlckNhbGwuY2xlYXIoKTsKKworICAvLyBDaGFuZ2UgdGhlIHNldGptcCBjYWxsIGludG8gYSBicmFuY2ggc3RhdGVtZW50LiBXZSdsbCByZW1vdmUgdGhlCisgIC8vIHNldGptcCBjYWxsIGluIGEgbGl0dGxlIGJpdC4gTm8gd29ycmllcy4KKyAgQmFzaWNCbG9jayogU2V0Sm1wQ29udEJsb2NrID0gQUJsb2NrLT5zcGxpdEJhc2ljQmxvY2soSW5zdCk7CisgIGFzc2VydChTZXRKbXBDb250QmxvY2sgJiYgIkNvdWxkbid0IHNwbGl0IHNldGptcCBCQiEhIik7CisKKyAgU2V0Sm1wQ29udEJsb2NrLT5zZXROYW1lKEFCbG9jay0+Z2V0TmFtZSgpKyJTZXRKbXBDb250Iik7CisKKyAgLy8gQWRkIHRoZSBTZXRKbXBDb250QmxvY2sgdG8gdGhlIHNldCBvZiBibG9ja3MgcmVhY2hhYmxlIGZyb20gYSBzZXRqbXAuCisgIERGU0Jsb2Nrcy5pbnNlcnQoU2V0Sm1wQ29udEJsb2NrKTsKKworICAvLyBUaGlzIFBISSBub2RlIHdpbGwgYmUgaW4gdGhlIG5ldyBibG9jayBjcmVhdGVkIGZyb20gdGhlCisgIC8vIHNwbGl0QmFzaWNCbG9jayBjYWxsLgorICBQSElOb2RlKiBQSEkgPSBQSElOb2RlOjpDcmVhdGUoVHlwZTo6Z2V0SW50MzJUeShJbnN0LT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldEptcFJldHVybiIsIEluc3QpOworCisgIC8vIENvbWluZyBmcm9tIGEgY2FsbCB0byBzZXRqbXAsIHRoZSByZXR1cm4gaXMgMC4KKyAgUEhJLT5hZGRJbmNvbWluZyhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDMyVHkoSW5zdC0+Z2V0Q29udGV4dCgpKSksCisgICAgICAgICAgICAgICAgICAgQUJsb2NrKTsKKworICAvLyBBZGQgdGhlIGNhc2UgZm9yIHRoaXMgc2V0am1wJ3MgbnVtYmVyLi4uCisgIFN3aXRjaFZhbHVlUGFpciBTVlAgPSBHZXRTSlN3aXRjaChGdW5jLCBHZXRSZXRocm93QkIoRnVuYykpOworICBTVlAuZmlyc3QtPmFkZENhc2UoQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEluc3QtPmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEptcElETWFwW0Z1bmNdIC0gMSksCisgICAgICAgICAgICAgICAgICAgICBTZXRKbXBDb250QmxvY2spOworCisgIC8vIFZhbHVlIGNvbWluZyBmcm9tIHRoZSBoYW5kbGluZyBvZiB0aGUgZXhjZXB0aW9uLgorICBQSEktPmFkZEluY29taW5nKFNWUC5zZWNvbmQsIFNWUC5zZWNvbmQtPmdldFBhcmVudCgpKTsKKworICAvLyBSZXBsYWNlIGFsbCB1c2VzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgUEhJIG5vZGUgY3JlYXRlZCBieQorICAvLyB0aGUgZXJhZGljYXRpb24gb2Ygc2V0am1wLgorICBJbnN0LT5yZXBsYWNlQWxsVXNlc1dpdGgoUEhJKTsKKyAgSW5zdC0+ZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgKytTZXRKbXBzVHJhbnNmb3JtZWQ7Cit9CisKKy8vIHZpc2l0Q2FsbEluc3QgLSBUaGlzIGNvbnZlcnRzIGFsbCBMTFZNIGNhbGwgaW5zdHJ1Y3Rpb25zIGludG8gaW52b2tlCisvLyBpbnN0cnVjdGlvbnMuIFRoZSBleGNlcHQgcGFydCBvZiB0aGUgaW52b2tlIGdvZXMgdG8gdGhlICJMb25nSm1wQmxrUHJlIgorLy8gdGhhdCBncmFicyB0aGUgZXhjZXB0aW9uIGFuZCBwcm9jZWVkcyB0byBkZXRlcm1pbmUgaWYgaXQncyBhIGxvbmdqbXAKKy8vIGV4Y2VwdGlvbiBvciBub3QuCit2b2lkIExvd2VyU2V0Sm1wOjp2aXNpdENhbGxJbnN0KENhbGxJbnN0JiBDSSkKK3sKKyAgaWYgKENJLmdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgaWYgKCFJc1RyYW5zZm9ybWFibGVGdW5jdGlvbihDSS5nZXRDYWxsZWRGdW5jdGlvbigpLT5nZXROYW1lKCkpIHx8CisgICAgICAgIENJLmdldENhbGxlZEZ1bmN0aW9uKCktPmlzSW50cmluc2ljKCkpIHJldHVybjsKKworICBCYXNpY0Jsb2NrKiBPbGRCQiA9IENJLmdldFBhcmVudCgpOworCisgIC8vIElmIG5vdCByZWFjaGFibGUgZnJvbSBhIHNldGptcCBjYWxsLCBkb24ndCB0cmFuc2Zvcm0uCisgIGlmICghREZTQmxvY2tzLmNvdW50KE9sZEJCKSkgcmV0dXJuOworCisgIEJhc2ljQmxvY2sqIE5ld0JCID0gT2xkQkItPnNwbGl0QmFzaWNCbG9jayhDSSk7CisgIGFzc2VydChOZXdCQiAmJiAiQ291bGRuJ3Qgc3BsaXQgQkIgb2YgXCJjYWxsXCIgaW5zdHJ1Y3Rpb24hISIpOworICBERlNCbG9ja3MuaW5zZXJ0KE5ld0JCKTsKKyAgTmV3QkItPnNldE5hbWUoIkNhbGwySW52b2tlIik7CisKKyAgRnVuY3Rpb24qIEZ1bmMgPSBPbGRCQi0+Z2V0UGFyZW50KCk7CisKKyAgLy8gQ29uc3RydWN0IHRoZSBuZXcgImludm9rZSIgaW5zdHJ1Y3Rpb24uCisgIFRlcm1pbmF0b3JJbnN0KiBUZXJtID0gT2xkQkItPmdldFRlcm1pbmF0b3IoKTsKKyAgQ2FsbFNpdGUgQ1MoJkNJKTsKKyAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBQYXJhbXMoQ1MuYXJnX2JlZ2luKCksIENTLmFyZ19lbmQoKSk7CisgIEludm9rZUluc3QqIElJID0KKyAgICBJbnZva2VJbnN0OjpDcmVhdGUoQ0kuZ2V0Q2FsbGVkVmFsdWUoKSwgTmV3QkIsIFByZWxpbUJCTWFwW0Z1bmNdLAorICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMuYmVnaW4oKSwgUGFyYW1zLmVuZCgpLCBDSS5nZXROYW1lKCksIFRlcm0pOworICBJSS0+c2V0Q2FsbGluZ0NvbnYoQ0kuZ2V0Q2FsbGluZ0NvbnYoKSk7CisgIElJLT5zZXRBdHRyaWJ1dGVzKENJLmdldEF0dHJpYnV0ZXMoKSk7CisKKyAgLy8gUmVwbGFjZSB0aGUgb2xkIGNhbGwgaW5zdCB3aXRoIHRoZSBpbnZva2UgaW5zdCBhbmQgcmVtb3ZlIHRoZSBjYWxsLgorICBDSS5yZXBsYWNlQWxsVXNlc1dpdGgoSUkpOworICBDSS5lcmFzZUZyb21QYXJlbnQoKTsKKworICAvLyBUaGUgb2xkIHRlcm1pbmF0b3IgaXMgdXNlbGVzcyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBpbnZva2UgaW5zdC4KKyAgVGVybS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICsrQ2FsbHNUcmFuc2Zvcm1lZDsKK30KKworLy8gdmlzaXRJbnZva2VJbnN0IC0gQ29udmVydGluZyB0aGUgImludm9rZSIgaW5zdHJ1Y3Rpb24gaXMgZmFpcmx5CisvLyBzdHJhaWdodC1mb3J3YXJkLiBUaGUgb2xkIGV4Y2VwdGlvbiBwYXJ0IGlzIHJlcGxhY2VkIGJ5IGEgcXVlcnkgYXNraW5nCisvLyBpZiB0aGlzIGlzIGEgbG9uZ2ptcCBleGNlcHRpb24uIElmIGl0IGlzLCB0aGVuIGl0IGdvZXMgdG8gdGhlIGxvbmdqbXAKKy8vIGV4Y2VwdGlvbiBibG9ja3MuIE90aGVyd2lzZSwgY29udHJvbCBpcyBwYXNzZWQgdGhlIG9sZCBleGNlcHRpb24uCit2b2lkIExvd2VyU2V0Sm1wOjp2aXNpdEludm9rZUluc3QoSW52b2tlSW5zdCYgSUkpCit7CisgIGlmIChJSS5nZXRDYWxsZWRGdW5jdGlvbigpKQorICAgIGlmICghSXNUcmFuc2Zvcm1hYmxlRnVuY3Rpb24oSUkuZ2V0Q2FsbGVkRnVuY3Rpb24oKS0+Z2V0TmFtZSgpKSB8fAorICAgICAgICBJSS5nZXRDYWxsZWRGdW5jdGlvbigpLT5pc0ludHJpbnNpYygpKSByZXR1cm47CisKKyAgQmFzaWNCbG9jayogQkIgPSBJSS5nZXRQYXJlbnQoKTsKKworICAvLyBJZiBub3QgcmVhY2hhYmxlIGZyb20gYSBzZXRqbXAgY2FsbCwgZG9uJ3QgdHJhbnNmb3JtLgorICBpZiAoIURGU0Jsb2Nrcy5jb3VudChCQikpIHJldHVybjsKKworICBCYXNpY0Jsb2NrKiBFeGNlcHRCQiA9IElJLmdldFVud2luZERlc3QoKTsKKworICBGdW5jdGlvbiogRnVuYyA9IEJCLT5nZXRQYXJlbnQoKTsKKyAgQmFzaWNCbG9jayogTmV3RXhjZXB0QkIgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoSUkuZ2V0Q29udGV4dCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludm9rZUV4Y2VwdCIsIEZ1bmMpOworCisgIC8vIElmIHRoaXMgaXMgYSBsb25nam1wIGV4Y2VwdGlvbiwgdGhlbiBicmFuY2ggdG8gdGhlIHByZWxpbWluYXJ5IEJCIG9mCisgIC8vIHRoZSBsb25nam1wIGV4Y2VwdGlvbiBoYW5kbGluZy4gT3RoZXJ3aXNlLCBnbyB0byB0aGUgb2xkIGV4Y2VwdGlvbi4KKyAgQ2FsbEluc3QqIElzTEpFeGNlcHQgPSBDYWxsSW5zdDo6Q3JlYXRlKElzTEpFeGNlcHRpb24sICJJc0xKRXhjZXB0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0V4Y2VwdEJCKTsKKworICBCcmFuY2hJbnN0OjpDcmVhdGUoUHJlbGltQkJNYXBbRnVuY10sIEV4Y2VwdEJCLCBJc0xKRXhjZXB0LCBOZXdFeGNlcHRCQik7CisKKyAgSUkuc2V0VW53aW5kRGVzdChOZXdFeGNlcHRCQik7CisgICsrSW52b2tlc1RyYW5zZm9ybWVkOworfQorCisvLyB2aXNpdFJldHVybkluc3QgLSBXZSB3YW50IHRvIGRlc3Ryb3kgdGhlIHNldGptcCBtYXAgdXBvbiBleGl0IGZyb20gdGhlCisvLyBmdW5jdGlvbi4KK3ZvaWQgTG93ZXJTZXRKbXA6OnZpc2l0UmV0dXJuSW5zdChSZXR1cm5JbnN0ICZSSSkgeworICBGdW5jdGlvbiogRnVuYyA9IFJJLmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgQ2FsbEluc3Q6OkNyZWF0ZShEZXN0cm95U0pNYXAsIEdldFNldEptcE1hcChGdW5jKSwgIiIsICZSSSk7Cit9CisKKy8vIHZpc2l0VW53aW5kSW5zdCAtIFdlIHdhbnQgdG8gZGVzdHJveSB0aGUgc2V0am1wIG1hcCB1cG9uIGV4aXQgZnJvbSB0aGUKKy8vIGZ1bmN0aW9uLgordm9pZCBMb3dlclNldEptcDo6dmlzaXRVbndpbmRJbnN0KFVud2luZEluc3QgJlVJKSB7CisgIEZ1bmN0aW9uKiBGdW5jID0gVUkuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICBDYWxsSW5zdDo6Q3JlYXRlKERlc3Ryb3lTSk1hcCwgR2V0U2V0Sm1wTWFwKEZ1bmMpLCAiIiwgJlVJKTsKK30KKworTW9kdWxlUGFzcyAqbGx2bTo6Y3JlYXRlTG93ZXJTZXRKbXBQYXNzKCkgeworICByZXR1cm4gbmV3IExvd2VyU2V0Sm1wKCk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQyMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvVHJhbnNmb3Jtcy9JUE8vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTWlwbworQlVJTERfQVJDSElWRSA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL01lcmdlRnVuY3Rpb25zLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9NZXJnZUZ1bmN0aW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwNzViOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9NZXJnZUZ1bmN0aW9ucy5jcHAKQEAgLTAsMCArMSw2NDcgQEAKKy8vPT09LSBNZXJnZUZ1bmN0aW9ucy5jcHAgLSBNZXJnZSBpZGVudGljYWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGxvb2tzIGZvciBlcXVpdmFsZW50IGZ1bmN0aW9ucyB0aGF0IGFyZSBtZXJnYWJsZSBhbmQgZm9sZHMgdGhlbS4KKy8vCisvLyBBIGhhc2ggaXMgY29tcHV0ZWQgZnJvbSB0aGUgZnVuY3Rpb24sIGJhc2VkIG9uIGl0cyB0eXBlIGFuZCBudW1iZXIgb2YKKy8vIGJhc2ljIGJsb2Nrcy4KKy8vCisvLyBPbmNlIGFsbCBoYXNoZXMgYXJlIGNvbXB1dGVkLCB3ZSBwZXJmb3JtIGFuIGV4cGVuc2l2ZSBlcXVhbGl0eSBjb21wYXJpc29uCisvLyBvbiBlYWNoIGZ1bmN0aW9uIHBhaXIuIFRoaXMgdGFrZXMgbl4yLzIgY29tcGFyaXNvbnMgcGVyIGJ1Y2tldCwgc28gaXQncworLy8gaW1wb3J0YW50IHRoYXQgdGhlIGhhc2ggZnVuY3Rpb24gYmUgaGlnaCBxdWFsaXR5LiBUaGUgZXF1YWxpdHkgY29tcGFyaXNvbgorLy8gaXRlcmF0ZXMgdGhyb3VnaCBlYWNoIGluc3RydWN0aW9uIGluIGVhY2ggYmFzaWMgYmxvY2suCisvLworLy8gV2hlbiBhIG1hdGNoIGlzIGZvdW5kIHRoZSBmdW5jdGlvbnMgYXJlIGZvbGRlZC4gSWYgYm90aCBmdW5jdGlvbnMgYXJlCisvLyBvdmVycmlkYWJsZSwgd2UgbW92ZSB0aGUgZnVuY3Rpb25hbGl0eSBpbnRvIGEgbmV3IGludGVybmFsIGZ1bmN0aW9uIGFuZAorLy8gbGVhdmUgdHdvIG92ZXJyaWRhYmxlIHRodW5rcyB0byBpdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEZ1dHVyZSB3b3JrOgorLy8KKy8vICogdmlydHVhbCBmdW5jdGlvbnMuCisvLworLy8gTWFueSBmdW5jdGlvbnMgaGF2ZSB0aGVpciBhZGRyZXNzIHRha2VuIGJ5IHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGZvcgorLy8gdGhlIG9iamVjdCB0aGV5IGJlbG9uZyB0by4gSG93ZXZlciwgYXMgbG9uZyBhcyBpdCdzIG9ubHkgdXNlZCBmb3IgYSBsb29rdXAKKy8vIGFuZCBjYWxsLCB0aGlzIGlzIGlycmVsZXZhbnQsIGFuZCB3ZSdkIGxpa2UgdG8gZm9sZCBzdWNoIGZ1bmN0aW9ucy4KKy8vCisvLyAqIHN3aXRjaCBmcm9tIG5eMiBwYWlyLXdpc2UgY29tcGFyaXNvbnMgdG8gYW4gbi13YXkgY29tcGFyaXNvbiBmb3IgZWFjaAorLy8gYnVja2V0LgorLy8KKy8vICogYmUgc21hcnRlciBhYm91dCBiaXRjYXN0cy4KKy8vCisvLyBJbiBvcmRlciB0byBmb2xkIGZ1bmN0aW9ucywgd2Ugd2lsbCBzb21ldGltZXMgYWRkIGVpdGhlciBiaXRjYXN0IGluc3RydWN0aW9ucworLy8gb3IgYml0Y2FzdCBjb25zdGFudCBleHByZXNzaW9ucy4gVW5mb3J0dW5hdGVseSwgdGhpcyBjYW4gY29uZm91bmQgZnVydGhlcgorLy8gYW5hbHlzaXMgc2luY2UgdGhlIHR3byBmdW5jdGlvbnMgZGlmZmVyIHdoZXJlIG9uZSBoYXMgYSBiaXRjYXN0IGFuZCB0aGUKKy8vIG90aGVyIGRvZXNuJ3QuIFdlIHNob3VsZCBsZWFybiB0byBsb29rIHRocm91Z2ggYml0Y2FzdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJtZXJnZWZ1bmMiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lubGluZUFzbS5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSVJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUZ1bmN0aW9uc01lcmdlZCwgIk51bWJlciBvZiBmdW5jdGlvbnMgbWVyZ2VkIik7CisKK25hbWVzcGFjZSB7CisgIC8vLyBNZXJnZUZ1bmN0aW9ucyBmaW5kcyBmdW5jdGlvbnMgd2hpY2ggd2lsbCBnZW5lcmF0ZSBpZGVudGljYWwgbWFjaGluZSBjb2RlLAorICAvLy8gYnkgY29uc2lkZXJpbmcgYWxsIHBvaW50ZXIgdHlwZXMgdG8gYmUgZXF1aXZhbGVudC4gT25jZSBpZGVudGlmaWVkLAorICAvLy8gTWVyZ2VGdW5jdGlvbnMgd2lsbCBmb2xkIHRoZW0gYnkgcmVwbGFjaW5nIGEgY2FsbCB0byBvbmUgdG8gYSBjYWxsIHRvIGEKKyAgLy8vIGJpdGNhc3Qgb2YgdGhlIG90aGVyLgorICAvLy8KKyAgY2xhc3MgTWVyZ2VGdW5jdGlvbnMgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBNZXJnZUZ1bmN0aW9ucygpIDogTW9kdWxlUGFzcyhJRCkge30KKworICAgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICBwcml2YXRlOgorICAgIC8vLyBQYWlyd2lzZUNvbXBhcmVBbmRNZXJnZSAtIEdpdmVuIGEgbGlzdCBvZiBmdW5jdGlvbnMsIGNvbXBhcmUgZWFjaCBwYWlyCisgICAgLy8vIGFuZCBtZXJnZSB0aGUgcGFpcnMgb2YgZXF1aXZhbGVudCBmdW5jdGlvbnMuCisgICAgYm9vbCBQYWlyd2lzZUNvbXBhcmVBbmRNZXJnZShzdGQ6OnZlY3RvcjxGdW5jdGlvbiAqPiAmRm5WZWMpOworCisgICAgLy8vIE1lcmdlVHdvRnVuY3Rpb25zIC0gTWVyZ2UgdHdvIGVxdWl2YWxlbnQgZnVuY3Rpb25zLiBVcG9uIGNvbXBsZXRpb24sCisgICAgLy8vIEZuVmVjW2pdIHNob3VsZCBuZXZlciBiZSB2aXNpdGVkIGFnYWluLgorICAgIHZvaWQgTWVyZ2VUd29GdW5jdGlvbnMoc3RkOjp2ZWN0b3I8RnVuY3Rpb24gKj4gJkZuVmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaSwgdW5zaWduZWQgaikgY29uc3Q7CisKKyAgICAvLy8gV3JpdGVUaHVuayAtIFJlcGxhY2UgRyB3aXRoIGEgc2ltcGxlIHRhaWwgY2FsbCB0byBiaXRjYXN0KEYpLiBBbHNvCisgICAgLy8vIHJlcGxhY2UgZGlyZWN0IHVzZXMgb2YgRyB3aXRoIGJpdGNhc3QoRikuCisgICAgdm9pZCBXcml0ZVRodW5rKEZ1bmN0aW9uICpGLCBGdW5jdGlvbiAqRykgY29uc3Q7CisKKyAgICBUYXJnZXREYXRhICpURDsKKyAgfTsKK30KKworY2hhciBNZXJnZUZ1bmN0aW9uczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKE1lcmdlRnVuY3Rpb25zLCAibWVyZ2VmdW5jIiwgIk1lcmdlIEZ1bmN0aW9ucyIsIGZhbHNlLCBmYWxzZSk7CisKK01vZHVsZVBhc3MgKmxsdm06OmNyZWF0ZU1lcmdlRnVuY3Rpb25zUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBNZXJnZUZ1bmN0aW9ucygpOworfQorCituYW1lc3BhY2UgeworLy8vIEZ1bmN0aW9uQ29tcGFyYXRvciAtIENvbXBhcmVzIHR3byBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90CisvLy8gdGhleSB3aWxsIGdlbmVyYXRlIG1hY2hpbmUgY29kZSB3aXRoIHRoZSBzYW1lIGJlaGF2aW91ci4gVGFyZ2V0RGF0YSBpcworLy8vIHVzZWQgaWYgYXZhaWxhYmxlLiBUaGUgY29tcGFyYXRvciBhbHdheXMgZmFpbHMgY29uc2VydmF0aXZlbHkgKGVycmluZyBvbiB0aGUKKy8vLyBzaWRlIG9mIGNsYWltaW5nIHRoYXQgdHdvIGZ1bmN0aW9ucyBhcmUgZGlmZmVyZW50KS4KK2NsYXNzIEZ1bmN0aW9uQ29tcGFyYXRvciB7CitwdWJsaWM6CisgIEZ1bmN0aW9uQ29tcGFyYXRvcihUYXJnZXREYXRhICpURCwgRnVuY3Rpb24gKkYxLCBGdW5jdGlvbiAqRjIpCisgICAgOiBGMShGMSksIEYyKEYyKSwgVEQoVEQpLCBJRE1hcDFDb3VudCgwKSwgSURNYXAyQ291bnQoMCkge30KKworICAvLy8gQ29tcGFyZSAtIHRlc3Qgd2hldGhlciB0aGUgdHdvIGZ1bmN0aW9ucyBoYXZlIGVxdWl2YWxlbnQgYmVoYXZpb3VyLgorICBib29sIENvbXBhcmUoKTsKKworcHJpdmF0ZToKKyAgLy8vIENvbXBhcmUgLSB0ZXN0IHdoZXRoZXIgdHdvIGJhc2ljIGJsb2NrcyBoYXZlIGVxdWl2YWxlbnQgYmVoYXZpb3VyLgorICBib29sIENvbXBhcmUoY29uc3QgQmFzaWNCbG9jayAqQkIxLCBjb25zdCBCYXNpY0Jsb2NrICpCQjIpOworCisgIC8vLyBFbnVtZXJhdGUgLSBBc3NpZ24gb3IgbG9vayB1cCBwcmV2aW91c2x5IGFzc2lnbmVkIG51bWJlcnMgZm9yIHRoZSB0d28KKyAgLy8vIHZhbHVlcywgYW5kIHJldHVybiB3aGV0aGVyIHRoZSBudW1iZXJzIGFyZSBlcXVhbC4gTnVtYmVycyBhcmUgYXNzaWduZWQgaW4KKyAgLy8vIHRoZSBvcmRlciB2aXNpdGVkLgorICBib29sIEVudW1lcmF0ZShjb25zdCBWYWx1ZSAqVjEsIGNvbnN0IFZhbHVlICpWMik7CisKKyAgLy8vIGlzRXF1aXZhbGVudE9wZXJhdGlvbiAtIENvbXBhcmUgdHdvIEluc3RydWN0aW9ucyBmb3IgZXF1aXZhbGVuY2UsIHNpbWlsYXIKKyAgLy8vIHRvIEluc3RydWN0aW9uOjppc1NhbWVPcGVyYXRpb25BcyBidXQgd2l0aCBtb2RpZmljYXRpb25zIHRvIHRoZSB0eXBlCisgIC8vLyBjb21wYXJpc29uLgorICBib29sIGlzRXF1aXZhbGVudE9wZXJhdGlvbihjb25zdCBJbnN0cnVjdGlvbiAqSTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpJMikgY29uc3Q7CisKKyAgLy8vIGlzRXF1aXZhbGVudEdFUCAtIENvbXBhcmUgdHdvIEdFUHMgZm9yIGVxdWl2YWxlbnQgcG9pbnRlciBhcml0aG1ldGljLgorICBib29sIGlzRXF1aXZhbGVudEdFUChjb25zdCBHRVBPcGVyYXRvciAqR0VQMSwgY29uc3QgR0VQT3BlcmF0b3IgKkdFUDIpOworICBib29sIGlzRXF1aXZhbGVudEdFUChjb25zdCBHZXRFbGVtZW50UHRySW5zdCAqR0VQMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2V0RWxlbWVudFB0ckluc3QgKkdFUDIpIHsKKyAgICByZXR1cm4gaXNFcXVpdmFsZW50R0VQKGNhc3Q8R0VQT3BlcmF0b3I+KEdFUDEpLCBjYXN0PEdFUE9wZXJhdG9yPihHRVAyKSk7CisgIH0KKworICAvLy8gaXNFcXVpdmFsZW50VHlwZSAtIENvbXBhcmUgdHdvIFR5cGVzLCB0cmVhdGluZyBhbGwgcG9pbnRlciB0eXBlcyBhcyBlcXVhbC4KKyAgYm9vbCBpc0VxdWl2YWxlbnRUeXBlKGNvbnN0IFR5cGUgKlR5MSwgY29uc3QgVHlwZSAqVHkyKSBjb25zdDsKKworICAvLyBUaGUgdHdvIGZ1bmN0aW9ucyB1bmRlcmdvaW5nIGNvbXBhcmlzb24uCisgIEZ1bmN0aW9uICpGMSwgKkYyOworCisgIFRhcmdldERhdGEgKlREOworCisgIHR5cGVkZWYgRGVuc2VNYXA8Y29uc3QgVmFsdWUgKiwgdW5zaWduZWQgbG9uZz4gSURNYXA7CisgIElETWFwIE1hcDEsIE1hcDI7CisgIHVuc2lnbmVkIGxvbmcgSURNYXAxQ291bnQsIElETWFwMkNvdW50OworfTsKK30KKworLy8vIENvbXB1dGUgYSBoYXNoIGd1YXJhbnRlZWQgdG8gYmUgZXF1YWwgZm9yIHR3byBlcXVpdmFsZW50IGZ1bmN0aW9ucywgYnV0CisvLy8gdmVyeSBsaWtlbHkgdG8gYmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZnVuY3Rpb25zLgorc3RhdGljIHVuc2lnbmVkIGxvbmcgUHJvZmlsZUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlR5ID0gRi0+Z2V0RnVuY3Rpb25UeXBlKCk7CisKKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgSUQuQWRkSW50ZWdlcihGLT5zaXplKCkpOworICBJRC5BZGRJbnRlZ2VyKEYtPmdldENhbGxpbmdDb252KCkpOworICBJRC5BZGRCb29sZWFuKEYtPmhhc0dDKCkpOworICBJRC5BZGRCb29sZWFuKEZUeS0+aXNWYXJBcmcoKSk7CisgIElELkFkZEludGVnZXIoRlR5LT5nZXRSZXR1cm5UeXBlKCktPmdldFR5cGVJRCgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZUeS0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKQorICAgIElELkFkZEludGVnZXIoRlR5LT5nZXRQYXJhbVR5cGUoaSktPmdldFR5cGVJRCgpKTsKKyAgcmV0dXJuIElELkNvbXB1dGVIYXNoKCk7Cit9CisKKy8vLyBpc0VxdWl2YWxlbnRUeXBlIC0gYW55IHR3byBwb2ludGVycyBpbiB0aGUgc2FtZSBhZGRyZXNzIHNwYWNlIGFyZQorLy8vIGVxdWl2YWxlbnQuIE90aGVyd2lzZSwgc3RhbmRhcmQgdHlwZSBlcXVpdmFsZW5jZSBydWxlcyBhcHBseS4KK2Jvb2wgRnVuY3Rpb25Db21wYXJhdG9yOjppc0VxdWl2YWxlbnRUeXBlKGNvbnN0IFR5cGUgKlR5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5MikgY29uc3QgeworICBpZiAoVHkxID09IFR5MikKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKFR5MS0+Z2V0VHlwZUlEKCkgIT0gVHkyLT5nZXRUeXBlSUQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoKFR5MS0+Z2V0VHlwZUlEKCkpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHR5cGUhIik7CisgICAgLy8gRmFsbCB0aHJvdWdoIGluIFJlbGVhc2UgbW9kZS4KKyAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgY2FzZSBUeXBlOjpPcGFxdWVUeUlEOgorICAgIC8vIFR5MSA9PSBUeTIgd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlIGVhcmxpZXIuCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNhc2UgVHlwZTo6Vm9pZFR5SUQ6CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOgorICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6CisgIGNhc2UgVHlwZTo6WDg2X0ZQODBUeUlEOgorICBjYXNlIFR5cGU6OkZQMTI4VHlJRDoKKyAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOgorICBjYXNlIFR5cGU6OkxhYmVsVHlJRDoKKyAgY2FzZSBUeXBlOjpNZXRhZGF0YVR5SUQ6CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDogeworICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQVHkxID0gY2FzdDxQb2ludGVyVHlwZT4oVHkxKTsKKyAgICBjb25zdCBQb2ludGVyVHlwZSAqUFR5MiA9IGNhc3Q8UG9pbnRlclR5cGU+KFR5Mik7CisgICAgcmV0dXJuIFBUeTEtPmdldEFkZHJlc3NTcGFjZSgpID09IFBUeTItPmdldEFkZHJlc3NTcGFjZSgpOworICB9CisKKyAgY2FzZSBUeXBlOjpTdHJ1Y3RUeUlEOiB7CisgICAgY29uc3QgU3RydWN0VHlwZSAqU1R5MSA9IGNhc3Q8U3RydWN0VHlwZT4oVHkxKTsKKyAgICBjb25zdCBTdHJ1Y3RUeXBlICpTVHkyID0gY2FzdDxTdHJ1Y3RUeXBlPihUeTIpOworICAgIGlmIChTVHkxLT5nZXROdW1FbGVtZW50cygpICE9IFNUeTItPmdldE51bUVsZW1lbnRzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoU1R5MS0+aXNQYWNrZWQoKSAhPSBTVHkyLT5pc1BhY2tlZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNUeTEtPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoIWlzRXF1aXZhbGVudFR5cGUoU1R5MS0+Z2V0RWxlbWVudFR5cGUoaSksIFNUeTItPmdldEVsZW1lbnRUeXBlKGkpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVHlwZTo6VW5pb25UeUlEOiB7CisgICAgY29uc3QgVW5pb25UeXBlICpVVHkxID0gY2FzdDxVbmlvblR5cGU+KFR5MSk7CisgICAgY29uc3QgVW5pb25UeXBlICpVVHkyID0gY2FzdDxVbmlvblR5cGU+KFR5Mik7CisKKyAgICBpZiAoVVR5MS0+Z2V0TnVtRWxlbWVudHMoKSAhPSBVVHkyLT5nZXROdW1FbGVtZW50cygpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFVUeTEtPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoIWlzRXF1aXZhbGVudFR5cGUoVVR5MS0+Z2V0RWxlbWVudFR5cGUoaSksIFVUeTItPmdldEVsZW1lbnRUeXBlKGkpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVHlwZTo6RnVuY3Rpb25UeUlEOiB7CisgICAgY29uc3QgRnVuY3Rpb25UeXBlICpGVHkxID0gY2FzdDxGdW5jdGlvblR5cGU+KFR5MSk7CisgICAgY29uc3QgRnVuY3Rpb25UeXBlICpGVHkyID0gY2FzdDxGdW5jdGlvblR5cGU+KFR5Mik7CisgICAgaWYgKEZUeTEtPmdldE51bVBhcmFtcygpICE9IEZUeTItPmdldE51bVBhcmFtcygpIHx8CisgICAgICAgIEZUeTEtPmlzVmFyQXJnKCkgIT0gRlR5Mi0+aXNWYXJBcmcoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghaXNFcXVpdmFsZW50VHlwZShGVHkxLT5nZXRSZXR1cm5UeXBlKCksIEZUeTItPmdldFJldHVyblR5cGUoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlR5MS0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoIWlzRXF1aXZhbGVudFR5cGUoRlR5MS0+Z2V0UGFyYW1UeXBlKGkpLCBGVHkyLT5nZXRQYXJhbVR5cGUoaSkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUeXBlOjpBcnJheVR5SUQ6IHsKKyAgICBjb25zdCBBcnJheVR5cGUgKkFUeTEgPSBjYXN0PEFycmF5VHlwZT4oVHkxKTsKKyAgICBjb25zdCBBcnJheVR5cGUgKkFUeTIgPSBjYXN0PEFycmF5VHlwZT4oVHkyKTsKKyAgICByZXR1cm4gQVR5MS0+Z2V0TnVtRWxlbWVudHMoKSA9PSBBVHkyLT5nZXROdW1FbGVtZW50cygpICYmCisgICAgICAgICAgIGlzRXF1aXZhbGVudFR5cGUoQVR5MS0+Z2V0RWxlbWVudFR5cGUoKSwgQVR5Mi0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIH0KKworICBjYXNlIFR5cGU6OlZlY3RvclR5SUQ6IHsKKyAgICBjb25zdCBWZWN0b3JUeXBlICpWVHkxID0gY2FzdDxWZWN0b3JUeXBlPihUeTEpOworICAgIGNvbnN0IFZlY3RvclR5cGUgKlZUeTIgPSBjYXN0PFZlY3RvclR5cGU+KFR5Mik7CisgICAgcmV0dXJuIFZUeTEtPmdldE51bUVsZW1lbnRzKCkgPT0gVlR5Mi0+Z2V0TnVtRWxlbWVudHMoKSAmJgorICAgICAgICAgICBpc0VxdWl2YWxlbnRUeXBlKFZUeTEtPmdldEVsZW1lbnRUeXBlKCksIFZUeTItPmdldEVsZW1lbnRUeXBlKCkpOworICB9CisgIH0KK30KKworLy8vIGlzRXF1aXZhbGVudE9wZXJhdGlvbiAtIGRldGVybWluZSB3aGV0aGVyIHRoZSB0d28gb3BlcmF0aW9ucyBhcmUgdGhlIHNhbWUKKy8vLyBleGNlcHQgdGhhdCBwb2ludGVyLXRvLUEgYW5kIHBvaW50ZXItdG8tQiBhcmUgZXF1aXZhbGVudC4gVGhpcyBzaG91bGQgYmUKKy8vLyBrZXB0IGluIHN5bmMgd2l0aCBJbnN0cnVjdGlvbjo6aXNTYW1lT3BlcmF0aW9uQXMuCitib29sIEZ1bmN0aW9uQ29tcGFyYXRvcjo6aXNFcXVpdmFsZW50T3BlcmF0aW9uKGNvbnN0IEluc3RydWN0aW9uICpJMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkkyKSBjb25zdCB7CisgIGlmIChJMS0+Z2V0T3Bjb2RlKCkgIT0gSTItPmdldE9wY29kZSgpIHx8CisgICAgICBJMS0+Z2V0TnVtT3BlcmFuZHMoKSAhPSBJMi0+Z2V0TnVtT3BlcmFuZHMoKSB8fAorICAgICAgIWlzRXF1aXZhbGVudFR5cGUoSTEtPmdldFR5cGUoKSwgSTItPmdldFR5cGUoKSkgfHwKKyAgICAgICFJMS0+aGFzU2FtZVN1YmNsYXNzT3B0aW9uYWxEYXRhKEkyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gV2UgaGF2ZSB0d28gaW5zdHJ1Y3Rpb25zIG9mIGlkZW50aWNhbCBvcGNvZGUgYW5kICNvcGVyYW5kcy4gIENoZWNrIHRvIHNlZQorICAvLyBpZiBhbGwgb3BlcmFuZHMgYXJlIHRoZSBzYW1lIHR5cGUKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEkxLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoIWlzRXF1aXZhbGVudFR5cGUoSTEtPmdldE9wZXJhbmQoaSktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSTItPmdldE9wZXJhbmQoaSktPmdldFR5cGUoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2hlY2sgc3BlY2lhbCBzdGF0ZSB0aGF0IGlzIGEgcGFydCBvZiBzb21lIGluc3RydWN0aW9ucy4KKyAgaWYgKGNvbnN0IExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihJMSkpCisgICAgcmV0dXJuIExJLT5pc1ZvbGF0aWxlKCkgPT0gY2FzdDxMb2FkSW5zdD4oSTIpLT5pc1ZvbGF0aWxlKCkgJiYKKyAgICAgICAgICAgTEktPmdldEFsaWdubWVudCgpID09IGNhc3Q8TG9hZEluc3Q+KEkyKS0+Z2V0QWxpZ25tZW50KCk7CisgIGlmIChjb25zdCBTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihJMSkpCisgICAgcmV0dXJuIFNJLT5pc1ZvbGF0aWxlKCkgPT0gY2FzdDxTdG9yZUluc3Q+KEkyKS0+aXNWb2xhdGlsZSgpICYmCisgICAgICAgICAgIFNJLT5nZXRBbGlnbm1lbnQoKSA9PSBjYXN0PFN0b3JlSW5zdD4oSTIpLT5nZXRBbGlnbm1lbnQoKTsKKyAgaWYgKGNvbnN0IENtcEluc3QgKkNJID0gZHluX2Nhc3Q8Q21wSW5zdD4oSTEpKQorICAgIHJldHVybiBDSS0+Z2V0UHJlZGljYXRlKCkgPT0gY2FzdDxDbXBJbnN0PihJMiktPmdldFByZWRpY2F0ZSgpOworICBpZiAoY29uc3QgQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KEkxKSkKKyAgICByZXR1cm4gQ0ktPmlzVGFpbENhbGwoKSA9PSBjYXN0PENhbGxJbnN0PihJMiktPmlzVGFpbENhbGwoKSAmJgorICAgICAgICAgICBDSS0+Z2V0Q2FsbGluZ0NvbnYoKSA9PSBjYXN0PENhbGxJbnN0PihJMiktPmdldENhbGxpbmdDb252KCkgJiYKKyAgICAgICAgICAgQ0ktPmdldEF0dHJpYnV0ZXMoKS5nZXRSYXdQb2ludGVyKCkgPT0KKyAgICAgICAgICAgICBjYXN0PENhbGxJbnN0PihJMiktPmdldEF0dHJpYnV0ZXMoKS5nZXRSYXdQb2ludGVyKCk7CisgIGlmIChjb25zdCBJbnZva2VJbnN0ICpDSSA9IGR5bl9jYXN0PEludm9rZUluc3Q+KEkxKSkKKyAgICByZXR1cm4gQ0ktPmdldENhbGxpbmdDb252KCkgPT0gY2FzdDxJbnZva2VJbnN0PihJMiktPmdldENhbGxpbmdDb252KCkgJiYKKyAgICAgICAgICAgQ0ktPmdldEF0dHJpYnV0ZXMoKS5nZXRSYXdQb2ludGVyKCkgPT0KKyAgICAgICAgICAgICBjYXN0PEludm9rZUluc3Q+KEkyKS0+Z2V0QXR0cmlidXRlcygpLmdldFJhd1BvaW50ZXIoKTsKKyAgaWYgKGNvbnN0IEluc2VydFZhbHVlSW5zdCAqSVZJID0gZHluX2Nhc3Q8SW5zZXJ0VmFsdWVJbnN0PihJMSkpIHsKKyAgICBpZiAoSVZJLT5nZXROdW1JbmRpY2VzKCkgIT0gY2FzdDxJbnNlcnRWYWx1ZUluc3Q+KEkyKS0+Z2V0TnVtSW5kaWNlcygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJVkktPmdldE51bUluZGljZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoSVZJLT5pZHhfYmVnaW4oKVtpXSAhPSBjYXN0PEluc2VydFZhbHVlSW5zdD4oSTIpLT5pZHhfYmVnaW4oKVtpXSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChjb25zdCBFeHRyYWN0VmFsdWVJbnN0ICpFVkkgPSBkeW5fY2FzdDxFeHRyYWN0VmFsdWVJbnN0PihJMSkpIHsKKyAgICBpZiAoRVZJLT5nZXROdW1JbmRpY2VzKCkgIT0gY2FzdDxFeHRyYWN0VmFsdWVJbnN0PihJMiktPmdldE51bUluZGljZXMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRVZJLT5nZXROdW1JbmRpY2VzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKEVWSS0+aWR4X2JlZ2luKClbaV0gIT0gY2FzdDxFeHRyYWN0VmFsdWVJbnN0PihJMiktPmlkeF9iZWdpbigpW2ldKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzRXF1aXZhbGVudEdFUCAtIGRldGVybWluZSB3aGV0aGVyIHR3byBHRVAgb3BlcmF0aW9ucyBwZXJmb3JtIHRoZSBzYW1lCisvLy8gdW5kZXJseWluZyBhcml0aG1ldGljLgorYm9vbCBGdW5jdGlvbkNvbXBhcmF0b3I6OmlzRXF1aXZhbGVudEdFUChjb25zdCBHRVBPcGVyYXRvciAqR0VQMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0VQT3BlcmF0b3IgKkdFUDIpIHsKKyAgLy8gV2hlbiB3ZSBoYXZlIHRhcmdldCBkYXRhLCB3ZSBjYW4gcmVkdWNlIHRoZSBHRVAgZG93biB0byB0aGUgdmFsdWUgaW4gYnl0ZXMKKyAgLy8gYWRkZWQgdG8gdGhlIGFkZHJlc3MuCisgIGlmIChURCAmJiBHRVAxLT5oYXNBbGxDb25zdGFudEluZGljZXMoKSAmJiBHRVAyLT5oYXNBbGxDb25zdGFudEluZGljZXMoKSkgeworICAgIFNtYWxsVmVjdG9yPFZhbHVlICosIDg+IEluZGljZXMxKEdFUDEtPmlkeF9iZWdpbigpLCBHRVAxLT5pZHhfZW5kKCkpOworICAgIFNtYWxsVmVjdG9yPFZhbHVlICosIDg+IEluZGljZXMyKEdFUDItPmlkeF9iZWdpbigpLCBHRVAyLT5pZHhfZW5kKCkpOworICAgIHVpbnQ2NF90IE9mZnNldDEgPSBURC0+Z2V0SW5kZXhlZE9mZnNldChHRVAxLT5nZXRQb2ludGVyT3BlcmFuZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlczEuZGF0YSgpLCBJbmRpY2VzMS5zaXplKCkpOworICAgIHVpbnQ2NF90IE9mZnNldDIgPSBURC0+Z2V0SW5kZXhlZE9mZnNldChHRVAyLT5nZXRQb2ludGVyT3BlcmFuZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlczIuZGF0YSgpLCBJbmRpY2VzMi5zaXplKCkpOworICAgIHJldHVybiBPZmZzZXQxID09IE9mZnNldDI7CisgIH0KKworICBpZiAoR0VQMS0+Z2V0UG9pbnRlck9wZXJhbmQoKS0+Z2V0VHlwZSgpICE9CisgICAgICBHRVAyLT5nZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChHRVAxLT5nZXROdW1PcGVyYW5kcygpICE9IEdFUDItPmdldE51bU9wZXJhbmRzKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBHRVAxLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGlmICghRW51bWVyYXRlKEdFUDEtPmdldE9wZXJhbmQoaSksIEdFUDItPmdldE9wZXJhbmQoaSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBFbnVtZXJhdGUgLSBDb21wYXJlIHR3byB2YWx1ZXMgdXNlZCBieSB0aGUgdHdvIGZ1bmN0aW9ucyB1bmRlciBwYWlyLXdpc2UKKy8vLyBjb21wYXJpc29uLiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSB2YWx1ZXMgYXJlIHNlZW4sIHRoZXkncmUgYWRkZWQgdG8KKy8vLyB0aGUgbWFwcGluZyBzbyB0aGF0IHdlIHdpbGwgZGV0ZWN0IG1pc21hdGNoZXMgb24gbmV4dCB1c2UuCitib29sIEZ1bmN0aW9uQ29tcGFyYXRvcjo6RW51bWVyYXRlKGNvbnN0IFZhbHVlICpWMSwgY29uc3QgVmFsdWUgKlYyKSB7CisgIC8vIENoZWNrIGZvciBmdW5jdGlvbiBAZjEgcmVmZXJyaW5nIHRvIGl0c2VsZiBhbmQgZnVuY3Rpb24gQGYyIHJlZmVycmluZyB0bworICAvLyBpdHNlbGYsIG9yIHJlZmVycmluZyB0byBlYWNoIG90aGVyLCBvciBib3RoIHJlZmVycmluZyB0byBlaXRoZXIgb2YgdGhlbS4KKyAgLy8gVGhleSdyZSBhbGwgZXF1aXZhbGVudCBpZiB0aGUgdHdvIGZ1bmN0aW9ucyBhcmUgb3RoZXJ3aXNlIGVxdWl2YWxlbnQuCisgIGlmIChWMSA9PSBGMSAmJiBWMiA9PSBGMikKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKFYxID09IEYyICYmIFYyID09IEYxKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFRPRE86IGNvbnN0YW50IGV4cHJlc3Npb25zIHdpdGggR0VQIG9yIHJlZmVyZW5jZXMgdG8gRjEgb3IgRjIuCisgIGlmIChpc2E8Q29uc3RhbnQ+KFYxKSkKKyAgICByZXR1cm4gVjEgPT0gVjI7CisKKyAgaWYgKGlzYTxJbmxpbmVBc20+KFYxKSAmJiBpc2E8SW5saW5lQXNtPihWMikpIHsKKyAgICBjb25zdCBJbmxpbmVBc20gKklBMSA9IGNhc3Q8SW5saW5lQXNtPihWMSk7CisgICAgY29uc3QgSW5saW5lQXNtICpJQTIgPSBjYXN0PElubGluZUFzbT4oVjIpOworICAgIHJldHVybiBJQTEtPmdldEFzbVN0cmluZygpID09IElBMi0+Z2V0QXNtU3RyaW5nKCkgJiYKKyAgICAgICAgICAgSUExLT5nZXRDb25zdHJhaW50U3RyaW5nKCkgPT0gSUEyLT5nZXRDb25zdHJhaW50U3RyaW5nKCk7CisgIH0KKworICB1bnNpZ25lZCBsb25nICZJRDEgPSBNYXAxW1YxXTsKKyAgaWYgKCFJRDEpCisgICAgSUQxID0gKytJRE1hcDFDb3VudDsKKworICB1bnNpZ25lZCBsb25nICZJRDIgPSBNYXAyW1YyXTsKKyAgaWYgKCFJRDIpCisgICAgSUQyID0gKytJRE1hcDJDb3VudDsKKworICByZXR1cm4gSUQxID09IElEMjsKK30KKworLy8vIENvbXBhcmUgLSB0ZXN0IHdoZXRoZXIgdHdvIGJhc2ljIGJsb2NrcyBoYXZlIGVxdWl2YWxlbnQgYmVoYXZpb3VyLgorYm9vbCBGdW5jdGlvbkNvbXBhcmF0b3I6OkNvbXBhcmUoY29uc3QgQmFzaWNCbG9jayAqQkIxLCBjb25zdCBCYXNpY0Jsb2NrICpCQjIpIHsKKyAgQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgRjFJID0gQkIxLT5iZWdpbigpLCBGMUUgPSBCQjEtPmVuZCgpOworICBCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBGMkkgPSBCQjItPmJlZ2luKCksIEYyRSA9IEJCMi0+ZW5kKCk7CisKKyAgZG8geworICAgIGlmICghRW51bWVyYXRlKEYxSSwgRjJJKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChjb25zdCBHZXRFbGVtZW50UHRySW5zdCAqR0VQMSA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihGMUkpKSB7CisgICAgICBjb25zdCBHZXRFbGVtZW50UHRySW5zdCAqR0VQMiA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihGMkkpOworICAgICAgaWYgKCFHRVAyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICghRW51bWVyYXRlKEdFUDEtPmdldFBvaW50ZXJPcGVyYW5kKCksIEdFUDItPmdldFBvaW50ZXJPcGVyYW5kKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICghaXNFcXVpdmFsZW50R0VQKEdFUDEsIEdFUDIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghaXNFcXVpdmFsZW50T3BlcmF0aW9uKEYxSSwgRjJJKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBhc3NlcnQoRjFJLT5nZXROdW1PcGVyYW5kcygpID09IEYySS0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRjFJLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBWYWx1ZSAqT3BGMSA9IEYxSS0+Z2V0T3BlcmFuZChpKTsKKyAgICAgICAgVmFsdWUgKk9wRjIgPSBGMkktPmdldE9wZXJhbmQoaSk7CisKKyAgICAgICAgaWYgKCFFbnVtZXJhdGUoT3BGMSwgT3BGMikpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChPcEYxLT5nZXRWYWx1ZUlEKCkgIT0gT3BGMi0+Z2V0VmFsdWVJRCgpIHx8CisgICAgICAgICAgICAhaXNFcXVpdmFsZW50VHlwZShPcEYxLT5nZXRUeXBlKCksIE9wRjItPmdldFR5cGUoKSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgICsrRjFJLCArK0YySTsKKyAgfSB3aGlsZSAoRjFJICE9IEYxRSAmJiBGMkkgIT0gRjJFKTsKKworICByZXR1cm4gRjFJID09IEYxRSAmJiBGMkkgPT0gRjJFOworfQorCisvLy8gQ29tcGFyZSAtIHRlc3Qgd2hldGhlciB0aGUgdHdvIGZ1bmN0aW9ucyBoYXZlIGVxdWl2YWxlbnQgYmVoYXZpb3VyLgorYm9vbCBGdW5jdGlvbkNvbXBhcmF0b3I6OkNvbXBhcmUoKSB7CisgIC8vIFdlIG5lZWQgdG8gcmVjaGVjayBldmVyeXRoaW5nLCBidXQgY2hlY2sgdGhlIHRoaW5ncyB0aGF0IHdlcmVuJ3QgaW5jbHVkZWQKKyAgLy8gaW4gdGhlIGhhc2ggZmlyc3QuCisKKyAgaWYgKEYxLT5nZXRBdHRyaWJ1dGVzKCkgIT0gRjItPmdldEF0dHJpYnV0ZXMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKEYxLT5oYXNHQygpICE9IEYyLT5oYXNHQygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoRjEtPmhhc0dDKCkgJiYgRjEtPmdldEdDKCkgIT0gRjItPmdldEdDKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChGMS0+aGFzU2VjdGlvbigpICE9IEYyLT5oYXNTZWN0aW9uKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChGMS0+aGFzU2VjdGlvbigpICYmIEYxLT5nZXRTZWN0aW9uKCkgIT0gRjItPmdldFNlY3Rpb24oKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKEYxLT5pc1ZhckFyZygpICE9IEYyLT5pc1ZhckFyZygpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBUT0RPOiBpZiBpdCdzIGludGVybmFsIGFuZCBvbmx5IHVzZWQgaW4gZGlyZWN0IGNhbGxzLCB3ZSBjb3VsZCBoYW5kbGUgdGhpcworICAvLyBjYXNlIHRvby4KKyAgaWYgKEYxLT5nZXRDYWxsaW5nQ29udigpICE9IEYyLT5nZXRDYWxsaW5nQ29udigpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIWlzRXF1aXZhbGVudFR5cGUoRjEtPmdldEZ1bmN0aW9uVHlwZSgpLCBGMi0+Z2V0RnVuY3Rpb25UeXBlKCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQoRjEtPmFyZ19zaXplKCkgPT0gRjItPmFyZ19zaXplKCkgJiYKKyAgICAgICAgICJJZGVudGljYWwgZnVuY3Rpb25zIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGFyZ3MuIik7CisKKyAgLy8gVmlzaXQgdGhlIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgZ2V0IGVudW1lcmF0ZWQgaW4gdGhlIG9yZGVyIHRoZXkncmUKKyAgLy8gcGFzc2VkIGluLgorICBmb3IgKEZ1bmN0aW9uOjpjb25zdF9hcmdfaXRlcmF0b3IgZjFpID0gRjEtPmFyZ19iZWdpbigpLAorICAgICAgICAgZjJpID0gRjItPmFyZ19iZWdpbigpLCBmMWUgPSBGMS0+YXJnX2VuZCgpOyBmMWkgIT0gZjFlOyArK2YxaSwgKytmMmkpIHsKKyAgICBpZiAoIUVudW1lcmF0ZShmMWksIGYyaSkpCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJBcmd1bWVudHMgcmVwZWF0Iik7CisgIH0KKworICAvLyBXZSBkbyBhIENGRy1vcmRlcmVkIHdhbGsgc2luY2UgdGhlIGFjdHVhbCBvcmRlcmluZyBvZiB0aGUgYmxvY2tzIGluIHRoZQorICAvLyBsaW5rZWQgbGlzdCBpcyBpbW1hdGVyaWFsLiBPdXIgd2FsayBzdGFydHMgYXQgdGhlIGVudHJ5IGJsb2NrIGZvciBib3RoCisgIC8vIGZ1bmN0aW9ucywgdGhlbiB0YWtlcyBlYWNoIGJsb2NrIGZyb20gZWFjaCB0ZXJtaW5hdG9yIGluIG9yZGVyLiBBcyBhbgorICAvLyBhcnRpZmFjdCwgdGhpcyBhbHNvIG1lYW5zIHRoYXQgdW5yZWFjaGFibGUgYmxvY2tzIGFyZSBpZ25vcmVkLgorICBTbWFsbFZlY3Rvcjxjb25zdCBCYXNpY0Jsb2NrICosIDg+IEYxQkJzLCBGMkJCczsKKyAgU21hbGxTZXQ8Y29uc3QgQmFzaWNCbG9jayAqLCAxMjg+IFZpc2l0ZWRCQnM7IC8vIGluIHRlcm1zIG9mIEYxLgorCisgIEYxQkJzLnB1c2hfYmFjaygmRjEtPmdldEVudHJ5QmxvY2soKSk7CisgIEYyQkJzLnB1c2hfYmFjaygmRjItPmdldEVudHJ5QmxvY2soKSk7CisKKyAgVmlzaXRlZEJCcy5pbnNlcnQoRjFCQnNbMF0pOworICB3aGlsZSAoIUYxQkJzLmVtcHR5KCkpIHsKKyAgICBjb25zdCBCYXNpY0Jsb2NrICpGMUJCID0gRjFCQnMucG9wX2JhY2tfdmFsKCk7CisgICAgY29uc3QgQmFzaWNCbG9jayAqRjJCQiA9IEYyQkJzLnBvcF9iYWNrX3ZhbCgpOworCisgICAgaWYgKCFFbnVtZXJhdGUoRjFCQiwgRjJCQikgfHwgIUNvbXBhcmUoRjFCQiwgRjJCQikpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBUZXJtaW5hdG9ySW5zdCAqRjFUSSA9IEYxQkItPmdldFRlcm1pbmF0b3IoKTsKKyAgICBjb25zdCBUZXJtaW5hdG9ySW5zdCAqRjJUSSA9IEYyQkItPmdldFRlcm1pbmF0b3IoKTsKKworICAgIGFzc2VydChGMVRJLT5nZXROdW1TdWNjZXNzb3JzKCkgPT0gRjJUSS0+Z2V0TnVtU3VjY2Vzc29ycygpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRjFUSS0+Z2V0TnVtU3VjY2Vzc29ycygpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKCFWaXNpdGVkQkJzLmluc2VydChGMVRJLT5nZXRTdWNjZXNzb3IoaSkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgRjFCQnMucHVzaF9iYWNrKEYxVEktPmdldFN1Y2Nlc3NvcihpKSk7CisgICAgICBGMkJCcy5wdXNoX2JhY2soRjJUSS0+Z2V0U3VjY2Vzc29yKGkpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBXcml0ZVRodW5rIC0gUmVwbGFjZSBHIHdpdGggYSBzaW1wbGUgdGFpbCBjYWxsIHRvIGJpdGNhc3QoRikuIEFsc28gcmVwbGFjZQorLy8vIGRpcmVjdCB1c2VzIG9mIEcgd2l0aCBiaXRjYXN0KEYpLgordm9pZCBNZXJnZUZ1bmN0aW9uczo6V3JpdGVUaHVuayhGdW5jdGlvbiAqRiwgRnVuY3Rpb24gKkcpIGNvbnN0IHsKKyAgaWYgKCFHLT5tYXlCZU92ZXJyaWRkZW4oKSkgeworICAgIC8vIFJlZGlyZWN0IGRpcmVjdCBjYWxsZXJzIG9mIEcgdG8gRi4KKyAgICBDb25zdGFudCAqQml0Y2FzdEYgPSBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoRiwgRy0+Z2V0VHlwZSgpKTsKKyAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBHLT51c2VfYmVnaW4oKSwgVUUgPSBHLT51c2VfZW5kKCk7CisgICAgICAgICBVSSAhPSBVRTspIHsKKyAgICAgIFZhbHVlOjp1c2VfaXRlcmF0b3IgVGhlSXRlciA9IFVJOworICAgICAgKytVSTsKKyAgICAgIENhbGxTaXRlIENTKCpUaGVJdGVyKTsKKyAgICAgIGlmIChDUyAmJiBDUy5pc0NhbGxlZShUaGVJdGVyKSkKKyAgICAgICAgVGhlSXRlci5nZXRVc2UoKS5zZXQoQml0Y2FzdEYpOworICAgIH0KKyAgfQorCisgIC8vIElmIEcgd2FzIGludGVybmFsIHRoZW4gd2UgbWF5IGhhdmUgcmVwbGFjZWQgYWxsIHVzZXMgaWYgRyB3aXRoIEYuIElmIHNvLAorICAvLyBzdG9wIGhlcmUgYW5kIGRlbGV0ZSBHLiBUaGVyZSdzIG5vIG5lZWQgZm9yIGEgdGh1bmsuCisgIGlmIChHLT5oYXNMb2NhbExpbmthZ2UoKSAmJiBHLT51c2VfZW1wdHkoKSkgeworICAgIEctPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybjsKKyAgfQorCisgIEZ1bmN0aW9uICpOZXdHID0gRnVuY3Rpb246OkNyZWF0ZShHLT5nZXRGdW5jdGlvblR5cGUoKSwgRy0+Z2V0TGlua2FnZSgpLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEctPmdldFBhcmVudCgpKTsKKyAgQmFzaWNCbG9jayAqQkIgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoRi0+Z2V0Q29udGV4dCgpLCAiIiwgTmV3Ryk7CisgIElSQnVpbGRlcjxmYWxzZT4gQnVpbGRlcihCQik7CisKKyAgU21hbGxWZWN0b3I8VmFsdWUgKiwgMTY+IEFyZ3M7CisgIHVuc2lnbmVkIGkgPSAwOworICBjb25zdCBGdW5jdGlvblR5cGUgKkZGVHkgPSBGLT5nZXRGdW5jdGlvblR5cGUoKTsKKyAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEFJID0gTmV3Ry0+YXJnX2JlZ2luKCksIEFFID0gTmV3Ry0+YXJnX2VuZCgpOworICAgICAgIEFJICE9IEFFOyArK0FJKSB7CisgICAgQXJncy5wdXNoX2JhY2soQnVpbGRlci5DcmVhdGVCaXRDYXN0KEFJLCBGRlR5LT5nZXRQYXJhbVR5cGUoaSkpKTsKKyAgICArK2k7CisgIH0KKworICBDYWxsSW5zdCAqQ0kgPSBCdWlsZGVyLkNyZWF0ZUNhbGwoRiwgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpKTsKKyAgQ0ktPnNldFRhaWxDYWxsKCk7CisgIENJLT5zZXRDYWxsaW5nQ29udihGLT5nZXRDYWxsaW5nQ29udigpKTsKKyAgaWYgKE5ld0ctPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHkoKSkgeworICAgIEJ1aWxkZXIuQ3JlYXRlUmV0Vm9pZCgpOworICB9IGVsc2UgeworICAgIEJ1aWxkZXIuQ3JlYXRlUmV0KEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChDSSwgTmV3Ry0+Z2V0UmV0dXJuVHlwZSgpKSk7CisgIH0KKworICBOZXdHLT5jb3B5QXR0cmlidXRlc0Zyb20oRyk7CisgIE5ld0ctPnRha2VOYW1lKEcpOworICBHLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3Ryk7CisgIEctPmVyYXNlRnJvbVBhcmVudCgpOworfQorCisvLy8gTWVyZ2VUd29GdW5jdGlvbnMgLSBNZXJnZSB0d28gZXF1aXZhbGVudCBmdW5jdGlvbnMuIFVwb24gY29tcGxldGlvbiwKKy8vLyBGblZlY1tqXSBpcyBkZWxldGVkIGJ1dCBub3QgcmVtb3ZlZCBmcm9tIHRoZSB2ZWN0b3IuCit2b2lkIE1lcmdlRnVuY3Rpb25zOjpNZXJnZVR3b0Z1bmN0aW9ucyhzdGQ6OnZlY3RvcjxGdW5jdGlvbiAqPiAmRm5WZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpLCB1bnNpZ25lZCBqKSBjb25zdCB7CisgIEZ1bmN0aW9uICpGID0gRm5WZWNbaV07CisgIEZ1bmN0aW9uICpHID0gRm5WZWNbal07CisKKyAgaWYgKEYtPmlzV2Vha0ZvckxpbmtlcigpICYmICFHLT5pc1dlYWtGb3JMaW5rZXIoKSkgeworICAgIHN0ZDo6c3dhcChGblZlY1tpXSwgRm5WZWNbal0pOworICAgIHN0ZDo6c3dhcChGLCBHKTsKKyAgfQorCisgIGlmIChGLT5pc1dlYWtGb3JMaW5rZXIoKSkgeworICAgIGFzc2VydChHLT5pc1dlYWtGb3JMaW5rZXIoKSk7CisKKyAgICAvLyBNYWtlIHRoZW0gYm90aCB0aHVua3MgdG8gdGhlIHNhbWUgaW50ZXJuYWwgZnVuY3Rpb24uCisgICAgRnVuY3Rpb24gKkggPSBGdW5jdGlvbjo6Q3JlYXRlKEYtPmdldEZ1bmN0aW9uVHlwZSgpLCBGLT5nZXRMaW5rYWdlKCksICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGLT5nZXRQYXJlbnQoKSk7CisgICAgSC0+Y29weUF0dHJpYnV0ZXNGcm9tKEYpOworICAgIEgtPnRha2VOYW1lKEYpOworICAgIEYtPnJlcGxhY2VBbGxVc2VzV2l0aChIKTsKKworICAgIHVuc2lnbmVkIE1heEFsaWdubWVudCA9IHN0ZDo6bWF4KEctPmdldEFsaWdubWVudCgpLCBILT5nZXRBbGlnbm1lbnQoKSk7CisKKyAgICBXcml0ZVRodW5rKEYsIEcpOworICAgIFdyaXRlVGh1bmsoRiwgSCk7CisKKyAgICBGLT5zZXRBbGlnbm1lbnQoTWF4QWxpZ25tZW50KTsKKyAgICBGLT5zZXRMaW5rYWdlKEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UpOworICB9IGVsc2UgeworICAgIFdyaXRlVGh1bmsoRiwgRyk7CisgIH0KKworICArK051bUZ1bmN0aW9uc01lcmdlZDsKK30KKworLy8vIFBhaXJ3aXNlQ29tcGFyZUFuZE1lcmdlIC0gR2l2ZW4gYSBsaXN0IG9mIGZ1bmN0aW9ucywgY29tcGFyZSBlYWNoIHBhaXIgYW5kCisvLy8gbWVyZ2UgdGhlIHBhaXJzIG9mIGVxdWl2YWxlbnQgZnVuY3Rpb25zLgorYm9vbCBNZXJnZUZ1bmN0aW9uczo6UGFpcndpc2VDb21wYXJlQW5kTWVyZ2Uoc3RkOjp2ZWN0b3I8RnVuY3Rpb24gKj4gJkZuVmVjKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBmb3IgKGludCBpID0gMCwgZSA9IEZuVmVjLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gaSArIDE7IGogIT0gZTsgKytqKSB7CisgICAgICBib29sIGlzRXF1YWwgPSBGdW5jdGlvbkNvbXBhcmF0b3IoVEQsIEZuVmVjW2ldLCBGblZlY1tqXSkuQ29tcGFyZSgpOworCisgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgIiA8PCBGblZlY1tpXS0+Z2V0TmFtZSgpCisgICAgICAgICAgICA8PCAoaXNFcXVhbCA/ICIgPT0gIiA6ICIgIT0gIikgPDwgRm5WZWNbal0tPmdldE5hbWUoKSA8PCAiXG4iKTsKKworICAgICAgaWYgKGlzRXF1YWwpIHsKKyAgICAgICAgTWVyZ2VUd29GdW5jdGlvbnMoRm5WZWMsIGksIGopOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgRm5WZWMuZXJhc2UoRm5WZWMuYmVnaW4oKSArIGopOworICAgICAgICAtLWosIC0tZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2Jvb2wgTWVyZ2VGdW5jdGlvbnM6OnJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBzdGQ6Om1hcDx1bnNpZ25lZCBsb25nLCBzdGQ6OnZlY3RvcjxGdW5jdGlvbiAqPiA+IEZuTWFwOworCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBGID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgRiAhPSBFOyArK0YpIHsKKyAgICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpIHx8IEYtPmhhc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKCkpCisgICAgICBjb250aW51ZTsKKworICAgIEZuTWFwW1Byb2ZpbGVGdW5jdGlvbihGKV0ucHVzaF9iYWNrKEYpOworICB9CisKKyAgVEQgPSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFRhcmdldERhdGE+KCk7CisKKyAgYm9vbCBMb2NhbENoYW5nZWQ7CisgIGRvIHsKKyAgICBMb2NhbENoYW5nZWQgPSBmYWxzZTsKKyAgICBERUJVRyhkYmdzKCkgPDwgInNpemU6ICIgPDwgRm5NYXAuc2l6ZSgpIDw8ICJcbiIpOworICAgIGZvciAoc3RkOjptYXA8dW5zaWduZWQgbG9uZywgc3RkOjp2ZWN0b3I8RnVuY3Rpb24gKj4gPjo6aXRlcmF0b3IKKyAgICAgICAgICAgSSA9IEZuTWFwLmJlZ2luKCksIEUgPSBGbk1hcC5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uICo+ICZGblZlYyA9IEktPnNlY29uZDsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiaGFzaCAoIiA8PCBJLT5maXJzdCA8PCAiKTogIiA8PCBGblZlYy5zaXplKCkgPDwgIlxuIik7CisgICAgICBMb2NhbENoYW5nZWQgfD0gUGFpcndpc2VDb21wYXJlQW5kTWVyZ2UoRm5WZWMpOworICAgIH0KKyAgICBDaGFuZ2VkIHw9IExvY2FsQ2hhbmdlZDsKKyAgfSB3aGlsZSAoTG9jYWxDaGFuZ2VkKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9QYXJ0aWFsSW5saW5pbmcuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL1BhcnRpYWxJbmxpbmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhN2IzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9QYXJ0aWFsSW5saW5pbmcuY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvLz09PS0gUGFydGlhbElubGluaW5nLmNwcCAtIElubGluZSBwYXJ0cyBvZiBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBwZXJmb3JtcyBwYXJ0aWFsIGlubGluaW5nLCB0eXBpY2FsbHkgYnkgaW5saW5pbmcgYW4gaWYgc3RhdGVtZW50CisvLyB0aGF0IHN1cnJvdW5kcyB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwYXJ0aWFsaW5saW5pbmciCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvQ2xvbmluZy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9GdW5jdGlvblV0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1QYXJ0aWFsSW5saW5lZCwgIk51bWJlciBvZiBmdW5jdGlvbnMgcGFydGlhbGx5IGlubGluZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IFBhcnRpYWxJbmxpbmVyIDogcHVibGljIE1vZHVsZVBhc3MgeworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7IH0KKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIFBhcnRpYWxJbmxpbmVyKCkgOiBNb2R1bGVQYXNzKElEKSB7fQorICAgIAorICAgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlJiBNKTsKKyAgICAKKyAgcHJpdmF0ZToKKyAgICBGdW5jdGlvbiogdW5zd2l0Y2hGdW5jdGlvbihGdW5jdGlvbiogRik7CisgIH07Cit9CisKK2NoYXIgUGFydGlhbElubGluZXI6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhQYXJ0aWFsSW5saW5lciwgInBhcnRpYWwtaW5saW5lciIsCisgICAgICAgICAgICAgICAgIlBhcnRpYWwgSW5saW5lciIsIGZhbHNlLCBmYWxzZSk7CisKK01vZHVsZVBhc3MqIGxsdm06OmNyZWF0ZVBhcnRpYWxJbmxpbmluZ1Bhc3MoKSB7IHJldHVybiBuZXcgUGFydGlhbElubGluZXIoKTsgfQorCitGdW5jdGlvbiogUGFydGlhbElubGluZXI6OnVuc3dpdGNoRnVuY3Rpb24oRnVuY3Rpb24qIEYpIHsKKyAgLy8gRmlyc3QsIHZlcmlmeSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgYW4gdW5zd2l0Y2hpbmcgY2FuZGlkYXRlLi4uCisgIEJhc2ljQmxvY2sqIGVudHJ5QmxvY2sgPSBGLT5iZWdpbigpOworICBCcmFuY2hJbnN0ICpCUiA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KGVudHJ5QmxvY2stPmdldFRlcm1pbmF0b3IoKSk7CisgIGlmICghQlIgfHwgQlItPmlzVW5jb25kaXRpb25hbCgpKQorICAgIHJldHVybiAwOworICAKKyAgQmFzaWNCbG9jayogcmV0dXJuQmxvY2sgPSAwOworICBCYXNpY0Jsb2NrKiBub25SZXR1cm5CbG9jayA9IDA7CisgIHVuc2lnbmVkIHJldHVybkNvdW50ID0gMDsKKyAgZm9yIChzdWNjX2l0ZXJhdG9yIFNJID0gc3VjY19iZWdpbihlbnRyeUJsb2NrKSwgU0UgPSBzdWNjX2VuZChlbnRyeUJsb2NrKTsKKyAgICAgICBTSSAhPSBTRTsgKytTSSkKKyAgICBpZiAoaXNhPFJldHVybkluc3Q+KCgqU0kpLT5nZXRUZXJtaW5hdG9yKCkpKSB7CisgICAgICByZXR1cm5CbG9jayA9ICpTSTsKKyAgICAgIHJldHVybkNvdW50Kys7CisgICAgfSBlbHNlCisgICAgICBub25SZXR1cm5CbG9jayA9ICpTSTsKKyAgCisgIGlmIChyZXR1cm5Db3VudCAhPSAxKQorICAgIHJldHVybiAwOworICAKKyAgLy8gQ2xvbmUgdGhlIGZ1bmN0aW9uLCBzbyB0aGF0IHdlIGNhbiBoYWNrIGF3YXkgb24gaXQuCisgIFZhbHVlTWFwPGNvbnN0IFZhbHVlKiwgVmFsdWUqPiBWTWFwOworICBGdW5jdGlvbiogZHVwbGljYXRlRnVuY3Rpb24gPSBDbG9uZUZ1bmN0aW9uKEYsIFZNYXApOworICBkdXBsaWNhdGVGdW5jdGlvbi0+c2V0TGlua2FnZShHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlKTsKKyAgRi0+Z2V0UGFyZW50KCktPmdldEZ1bmN0aW9uTGlzdCgpLnB1c2hfYmFjayhkdXBsaWNhdGVGdW5jdGlvbik7CisgIEJhc2ljQmxvY2sqIG5ld0VudHJ5QmxvY2sgPSBjYXN0PEJhc2ljQmxvY2s+KFZNYXBbZW50cnlCbG9ja10pOworICBCYXNpY0Jsb2NrKiBuZXdSZXR1cm5CbG9jayA9IGNhc3Q8QmFzaWNCbG9jaz4oVk1hcFtyZXR1cm5CbG9ja10pOworICBCYXNpY0Jsb2NrKiBuZXdOb25SZXR1cm5CbG9jayA9IGNhc3Q8QmFzaWNCbG9jaz4oVk1hcFtub25SZXR1cm5CbG9ja10pOworICAKKyAgLy8gR28gYWhlYWQgYW5kIHVwZGF0ZSBhbGwgdXNlcyB0byB0aGUgZHVwbGljYXRlLCBzbyB0aGF0IHdlIGNhbiBqdXN0CisgIC8vIHVzZSB0aGUgaW5saW5lciBmdW5jdGlvbmFsaXR5IHdoZW4gd2UncmUgZG9uZSBoYWNraW5nLgorICBGLT5yZXBsYWNlQWxsVXNlc1dpdGgoZHVwbGljYXRlRnVuY3Rpb24pOworICAKKyAgLy8gU3BlY2lhbCBoYWNrZXJ5IGlzIG5lZWRlZCB3aXRoIFBISSBub2RlcyB0aGF0IGhhdmUgaW5wdXRzIGZyb20gbW9yZSB0aGFuCisgIC8vIG9uZSBleHRyYWN0ZWQgYmxvY2suICBGb3Igc2ltcGxpY2l0eSwganVzdCBzcGxpdCB0aGUgUEhJcyBpbnRvIGEgdHdvLWxldmVsCisgIC8vIHNlcXVlbmNlIG9mIFBISXMsIHNvbWUgb2Ygd2hpY2ggd2lsbCBnbyBpbiB0aGUgZXh0cmFjdGVkIHJlZ2lvbiwgYW5kIHNvbWUKKyAgLy8gb2Ygd2hpY2ggd2lsbCBnbyBvdXRzaWRlLgorICBCYXNpY0Jsb2NrKiBwcmVSZXR1cm4gPSBuZXdSZXR1cm5CbG9jazsKKyAgbmV3UmV0dXJuQmxvY2sgPSBuZXdSZXR1cm5CbG9jay0+c3BsaXRCYXNpY0Jsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JldHVybkJsb2NrLT5nZXRGaXJzdE5vblBISSgpKTsKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IHByZVJldHVybi0+YmVnaW4oKTsKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zID0gbmV3UmV0dXJuQmxvY2stPmJlZ2luKCk7CisgIHdoaWxlIChJICE9IHByZVJldHVybi0+ZW5kKCkpIHsKKyAgICBQSElOb2RlKiBPbGRQaGkgPSBkeW5fY2FzdDxQSElOb2RlPihJKTsKKyAgICBpZiAoIU9sZFBoaSkgYnJlYWs7CisgICAgCisgICAgUEhJTm9kZSogcmV0UGhpID0gUEhJTm9kZTo6Q3JlYXRlKE9sZFBoaS0+Z2V0VHlwZSgpLCAiIiwgSW5zKTsKKyAgICBPbGRQaGktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXRQaGkpOworICAgIElucyA9IG5ld1JldHVybkJsb2NrLT5nZXRGaXJzdE5vblBISSgpOworICAgIAorICAgIHJldFBoaS0+YWRkSW5jb21pbmcoSSwgcHJlUmV0dXJuKTsKKyAgICByZXRQaGktPmFkZEluY29taW5nKE9sZFBoaS0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKG5ld0VudHJ5QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnlCbG9jayk7CisgICAgT2xkUGhpLT5yZW1vdmVJbmNvbWluZ1ZhbHVlKG5ld0VudHJ5QmxvY2spOworICAgIAorICAgICsrSTsKKyAgfQorICBuZXdFbnRyeUJsb2NrLT5nZXRUZXJtaW5hdG9yKCktPnJlcGxhY2VVc2VzT2ZXaXRoKHByZVJldHVybiwgbmV3UmV0dXJuQmxvY2spOworICAKKyAgLy8gR2F0aGVyIHVwIHRoZSBibG9ja3MgdGhhdCB3ZSdyZSBnb2luZyB0byBleHRyYWN0LgorICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gdG9FeHRyYWN0OworICB0b0V4dHJhY3QucHVzaF9iYWNrKG5ld05vblJldHVybkJsb2NrKTsKKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgRkkgPSBkdXBsaWNhdGVGdW5jdGlvbi0+YmVnaW4oKSwKKyAgICAgICBGRSA9IGR1cGxpY2F0ZUZ1bmN0aW9uLT5lbmQoKTsgRkkgIT0gRkU7ICsrRkkpCisgICAgaWYgKCYqRkkgIT0gbmV3RW50cnlCbG9jayAmJiAmKkZJICE9IG5ld1JldHVybkJsb2NrICYmCisgICAgICAgICYqRkkgIT0gbmV3Tm9uUmV0dXJuQmxvY2spCisgICAgICB0b0V4dHJhY3QucHVzaF9iYWNrKEZJKTsKKyAgICAgIAorICAvLyBUaGUgQ29kZUV4dHJhY3RvciBuZWVkcyBhIGRvbWluYXRvciB0cmVlLgorICBEb21pbmF0b3JUcmVlIERUOworICBEVC5ydW5PbkZ1bmN0aW9uKCpkdXBsaWNhdGVGdW5jdGlvbik7CisgIAorICAvLyBFeHRyYWN0IHRoZSBib2R5IG9mIHRoZSBpZi4KKyAgRnVuY3Rpb24qIGV4dHJhY3RlZEZ1bmN0aW9uID0gRXh0cmFjdENvZGVSZWdpb24oRFQsIHRvRXh0cmFjdCk7CisgIAorICBJbmxpbmVGdW5jdGlvbkluZm8gSUZJOworICAKKyAgLy8gSW5saW5lIHRoZSB0b3AtbGV2ZWwgaWYgdGVzdCBpbnRvIGFsbCBjYWxsZXJzLgorICBzdGQ6OnZlY3RvcjxVc2VyKj4gVXNlcnMoZHVwbGljYXRlRnVuY3Rpb24tPnVzZV9iZWdpbigpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUZ1bmN0aW9uLT51c2VfZW5kKCkpOworICBmb3IgKHN0ZDo6dmVjdG9yPFVzZXIqPjo6aXRlcmF0b3IgVUkgPSBVc2Vycy5iZWdpbigpLCBVRSA9IFVzZXJzLmVuZCgpOworICAgICAgIFVJICE9IFVFOyArK1VJKQorICAgIGlmIChDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oKlVJKSkKKyAgICAgIElubGluZUZ1bmN0aW9uKENJLCBJRkkpOworICAgIGVsc2UgaWYgKEludm9rZUluc3QgKklJID0gZHluX2Nhc3Q8SW52b2tlSW5zdD4oKlVJKSkKKyAgICAgIElubGluZUZ1bmN0aW9uKElJLCBJRkkpOworICAKKyAgLy8gRGl0Y2ggdGhlIGR1cGxpY2F0ZSwgc2luY2Ugd2UncmUgZG9uZSB3aXRoIGl0LCBhbmQgcmV3cml0ZSBhbGwgcmVtYWluaW5nCisgIC8vIHVzZXJzIChmdW5jdGlvbiBwb2ludGVycywgZXRjLikgYmFjayB0byB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uCisgIGR1cGxpY2F0ZUZ1bmN0aW9uLT5yZXBsYWNlQWxsVXNlc1dpdGgoRik7CisgIGR1cGxpY2F0ZUZ1bmN0aW9uLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgCisgICsrTnVtUGFydGlhbElubGluZWQ7CisgIAorICByZXR1cm4gZXh0cmFjdGVkRnVuY3Rpb247Cit9CisKK2Jvb2wgUGFydGlhbElubGluZXI6OnJ1bk9uTW9kdWxlKE1vZHVsZSYgTSkgeworICBzdGQ6OnZlY3RvcjxGdW5jdGlvbio+IHdvcmtsaXN0OworICB3b3JrbGlzdC5yZXNlcnZlKE0uc2l6ZSgpKTsKKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEZJID0gTS5iZWdpbigpLCBGRSA9IE0uZW5kKCk7IEZJICE9IEZFOyArK0ZJKQorICAgIGlmICghRkktPnVzZV9lbXB0eSgpICYmICFGSS0+aXNEZWNsYXJhdGlvbigpKQorICAgICAgd29ya2xpc3QucHVzaF9iYWNrKCYqRkkpOworICAgIAorICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgd2hpbGUgKCF3b3JrbGlzdC5lbXB0eSgpKSB7CisgICAgRnVuY3Rpb24qIGN1cnJGdW5jID0gd29ya2xpc3QuYmFjaygpOworICAgIHdvcmtsaXN0LnBvcF9iYWNrKCk7CisgIAorICAgIGlmIChjdXJyRnVuYy0+dXNlX2VtcHR5KCkpIGNvbnRpbnVlOworICAgIAorICAgIGJvb2wgcmVjdXJzaXZlID0gZmFsc2U7CisgICAgZm9yIChGdW5jdGlvbjo6dXNlX2l0ZXJhdG9yIFVJID0gY3VyckZ1bmMtPnVzZV9iZWdpbigpLAorICAgICAgICAgVUUgPSBjdXJyRnVuYy0+dXNlX2VuZCgpOyBVSSAhPSBVRTsgKytVSSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiogSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPigqVUkpKQorICAgICAgICBpZiAoSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpID09IGN1cnJGdW5jKSB7CisgICAgICAgICAgcmVjdXJzaXZlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGlmIChyZWN1cnNpdmUpIGNvbnRpbnVlOworICAgICAgICAgIAorICAgIAorICAgIGlmIChGdW5jdGlvbiogbmV3RnVuYyA9IHVuc3dpdGNoRnVuY3Rpb24oY3VyckZ1bmMpKSB7CisgICAgICB3b3JrbGlzdC5wdXNoX2JhY2sobmV3RnVuYyk7CisgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgIH0KKyAgCisgIHJldHVybiBjaGFuZ2VkOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL1BhcnRpYWxTcGVjaWFsaXphdGlvbi5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vUGFydGlhbFNwZWNpYWxpemF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzI0NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL1BhcnRpYWxTcGVjaWFsaXphdGlvbi5jcHAKQEAgLTAsMCArMSwyMTUgQEAKKy8vPT09LS0gUGFydGlhbFNwZWNpYWxpemF0aW9uLmNwcCAtIFNwZWNpYWxpemUgZm9yIGNvbW1vbiBjb25zdGFudHMtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGZpbmRzIGZ1bmN0aW9uIGFyZ3VtZW50cyB0aGF0IGFyZSBvZnRlbiBhIGNvbW1vbiBjb25zdGFudCBhbmQgCisvLyBzcGVjaWFsaXplcyBhIHZlcnNpb24gb2YgdGhlIGNhbGxlZCBmdW5jdGlvbiBmb3IgdGhhdCBjb25zdGFudC4KKy8vCisvLyBUaGlzIHBhc3Mgc2ltcGx5IGRvZXMgdGhlIGNsb25pbmcgZm9yIGZ1bmN0aW9ucyBpdCBzcGVjaWFsaXplcy4gIEl0IGRlcGVuZHMKKy8vIG9uIElQU0NDUCBhbmQgREFFIHRvIGNsZWFuIHVwIHRoZSByZXN1bHRzLgorLy8KKy8vIFRoZSBpbml0aWFsIGhldXJpc3RpYyBmYXZvcnMgY29uc3RhbnQgYXJndW1lbnRzIHRoYXQgYXJlIHVzZWQgaW4gY29udHJvbCAKKy8vIGZsb3cuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJwYXJ0aWFsc3BlY2lhbGl6YXRpb24iCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Nsb25pbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgPG1hcD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMobnVtU3BlY2lhbGl6ZWQsICJOdW1iZXIgb2Ygc3BlY2lhbGl6ZWQgZnVuY3Rpb25zIGNyZWF0ZWQiKTsKK1NUQVRJU1RJQyhudW1SZXBsYWNlZCwgIk51bWJlciBvZiBjYWxsZXJzIHJlcGxhY2VkIGJ5IHNwZWNpYWxpemF0aW9uIik7CisKKy8vIE1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyBtYXJrYWJsZSBpbnRlcmVzdGVkCitzdGF0aWMgY29uc3QgaW50IE1heEludGVyZXN0cyA9IDY7CisKKy8vIENhbGwgbXVzdCBiZSB1c2VkIGF0IGxlYXN0IG9jY2FzaW9uYWxseQorc3RhdGljIGNvbnN0IGludCBDYWxsc01pbiA9IDU7CisKKy8vIE11c3QgaGF2ZSAxMCUgb2YgY2FsbHMgaGF2aW5nIHRoZSBzYW1lIGNvbnN0YW50IHRvIHNwZWNpYWxpemUgb24KK3N0YXRpYyBjb25zdCBkb3VibGUgQ29uc3RWYWxQZXJjZW50ID0gLjE7CisKK25hbWVzcGFjZSB7CisgIHR5cGVkZWYgU21hbGxWZWN0b3I8aW50LCBNYXhJbnRlcmVzdHM+IEludGVyZXN0aW5nQXJnVmVjdG9yOworICBjbGFzcyBQYXJ0U3BlYyA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKKyAgICB2b2lkIHNjYW5Gb3JJbnRlcmVzdChGdW5jdGlvbiYsIEludGVyZXN0aW5nQXJnVmVjdG9yJik7CisgICAgaW50IHNjYW5EaXN0cmlidXRpb24oRnVuY3Rpb24mLCBpbnQsIHN0ZDo6bWFwPENvbnN0YW50KiwgaW50PiYpOworICBwdWJsaWMgOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgUGFydFNwZWMoKSA6IE1vZHVsZVBhc3MoSUQpIHt9CisgICAgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pOworICB9OworfQorCitjaGFyIFBhcnRTcGVjOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoUGFydFNwZWMsICJwYXJ0aWFsc3BlY2lhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgICJQYXJ0aWFsIFNwZWNpYWxpemF0aW9uIiwgZmFsc2UsIGZhbHNlKTsKKworLy8gU3BlY2lhbGl6ZSBGIGJ5IHJlcGxhY2luZyB0aGUgYXJndW1lbnRzIChrZXlzKSBpbiByZXBsYWNlbWVudHMgd2l0aCB0aGUgCisvLyBjb25zdGFudHMgKHZhbHVlcykuICBSZXBsYWNlIGFsbCBjYWxscyB0byBGIHdpdGggdGhvc2UgY29uc3RhbnRzIHdpdGgKKy8vIGEgY2FsbCB0byB0aGUgc3BlY2lhbGl6ZWQgZnVuY3Rpb24uICBSZXR1cm5zIHRoZSBzcGVjaWFsaXplZCBmdW5jdGlvbgorc3RhdGljIEZ1bmN0aW9uKiAKK1NwZWNpYWxpemVGdW5jdGlvbihGdW5jdGlvbiogRiwgCisgICAgICAgICAgICAgICAgICAgVmFsdWVNYXA8Y29uc3QgVmFsdWUqLCBWYWx1ZSo+JiByZXBsYWNlbWVudHMpIHsKKyAgLy8gYXJnIG51bWJlcnMgb2YgZGVsZXRlZCBhcmd1bWVudHMKKyAgRGVuc2VNYXA8dW5zaWduZWQsIGNvbnN0IEFyZ3VtZW50Kj4gZGVsZXRlZDsKKyAgZm9yIChWYWx1ZU1hcDxjb25zdCBWYWx1ZSosIFZhbHVlKj46Oml0ZXJhdG9yIAorICAgICAgICAgcmVwYiA9IHJlcGxhY2VtZW50cy5iZWdpbigpLCByZXBlID0gcmVwbGFjZW1lbnRzLmVuZCgpOworICAgICAgIHJlcGIgIT0gcmVwZTsgKytyZXBiKSB7CisgICAgQXJndW1lbnQgY29uc3QgKmFyZyA9IGNhc3Q8Y29uc3QgQXJndW1lbnQ+KHJlcGItPmZpcnN0KTsKKyAgICBkZWxldGVkW2FyZy0+Z2V0QXJnTm8oKV0gPSBhcmc7CisgIH0KKworICBGdW5jdGlvbiogTkYgPSBDbG9uZUZ1bmN0aW9uKEYsIHJlcGxhY2VtZW50cyk7CisgIE5GLT5zZXRMaW5rYWdlKEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UpOworICBGLT5nZXRQYXJlbnQoKS0+Z2V0RnVuY3Rpb25MaXN0KCkucHVzaF9iYWNrKE5GKTsKKworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgaWkgPSBGLT51c2VfYmVnaW4oKSwgZWUgPSBGLT51c2VfZW5kKCk7IAorICAgICAgIGlpICE9IGVlOyApIHsKKyAgICBWYWx1ZTo6dXNlX2l0ZXJhdG9yIGkgPSBpaTsKKyAgICArK2lpOworICAgIFVzZXIgKlUgPSAqaTsKKyAgICBDYWxsU2l0ZSBDUyhVKTsKKyAgICBpZiAoQ1MpIHsKKyAgICAgIGlmIChDUy5nZXRDYWxsZWRGdW5jdGlvbigpID09IEYpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8VmFsdWUqLCA2PiBhcmdzOworICAgICAgICAvLyBBc3NlbWJsZSB0aGUgbm9uLXNwZWNpYWxpemVkIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZWQgY2FsbHNpdGUuCisgICAgICAgIC8vIEluIHRoZSBwcm9jZXNzLCBtYWtlIHN1cmUgdGhhdCB0aGUgc3BlY2lhbGl6ZWQgYXJndW1lbnRzIGFyZQorICAgICAgICAvLyBjb25zdGFudCBhbmQgbWF0Y2ggdGhlIHNwZWNpYWxpemF0aW9uLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwKKyAgICAgICAgLy8gdGhpcyBjYWxsc2l0ZSBuZWVkcyB0byBjYWxsIHRoZSBvcmlnaW5hbCBvciBzb21lIG90aGVyCisgICAgICAgIC8vIHNwZWNpYWxpemF0aW9uOyBkb24ndCBjaGFuZ2UgaXQgaGVyZS4KKyAgICAgICAgQ2FsbFNpdGU6OmFyZ19pdGVyYXRvciBhcyA9IENTLmFyZ19iZWdpbigpLCBhZSA9IENTLmFyZ19lbmQoKTsKKyAgICAgICAgZm9yIChDYWxsU2l0ZTo6YXJnX2l0ZXJhdG9yIGFpID0gYXM7IGFpICE9IGFlOyArK2FpKSB7CisgICAgICAgICAgRGVuc2VNYXA8dW5zaWduZWQsIGNvbnN0IEFyZ3VtZW50Kj46Oml0ZXJhdG9yIGRlbGl0ID0gZGVsZXRlZC5maW5kKAorICAgICAgICAgICAgc3RkOjpkaXN0YW5jZShhcywgYWkpKTsKKyAgICAgICAgICBpZiAoZGVsaXQgPT0gZGVsZXRlZC5lbmQoKSkKKyAgICAgICAgICAgIGFyZ3MucHVzaF9iYWNrKGNhc3Q8VmFsdWU+KGFpKSk7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDb25zdGFudCAqY2kgPSBkeW5fY2FzdDxDb25zdGFudD4oYWkpOworICAgICAgICAgICAgaWYgKCEoY2kgJiYgY2kgPT0gcmVwbGFjZW1lbnRzW2RlbGl0LT5zZWNvbmRdKSkKKyAgICAgICAgICAgICAgZ290byBuZXh0X3VzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVmFsdWUqIE5DYWxsOworICAgICAgICBpZiAoQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KFUpKSB7CisgICAgICAgICAgTkNhbGwgPSBDYWxsSW5zdDo6Q3JlYXRlKE5GLCBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSS0+Z2V0TmFtZSgpLCBDSSk7CisgICAgICAgICAgY2FzdDxDYWxsSW5zdD4oTkNhbGwpLT5zZXRUYWlsQ2FsbChDSS0+aXNUYWlsQ2FsbCgpKTsKKyAgICAgICAgICBjYXN0PENhbGxJbnN0PihOQ2FsbCktPnNldENhbGxpbmdDb252KENJLT5nZXRDYWxsaW5nQ29udigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBJbnZva2VJbnN0ICpJSSA9IGNhc3Q8SW52b2tlSW5zdD4oVSk7CisgICAgICAgICAgTkNhbGwgPSBJbnZva2VJbnN0OjpDcmVhdGUoTkYsIElJLT5nZXROb3JtYWxEZXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUktPmdldFVud2luZERlc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJLT5nZXROYW1lKCksIElJKTsKKyAgICAgICAgICBjYXN0PEludm9rZUluc3Q+KE5DYWxsKS0+c2V0Q2FsbGluZ0NvbnYoSUktPmdldENhbGxpbmdDb252KCkpOworICAgICAgICB9CisgICAgICAgIENTLmdldEluc3RydWN0aW9uKCktPnJlcGxhY2VBbGxVc2VzV2l0aChOQ2FsbCk7CisgICAgICAgIENTLmdldEluc3RydWN0aW9uKCktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICArK251bVJlcGxhY2VkOworICAgICAgfQorICAgIH0KKyAgICBuZXh0X3VzZTo7CisgIH0KKyAgcmV0dXJuIE5GOworfQorCisKK2Jvb2wgUGFydFNwZWM6OnJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEkgPSBNLmJlZ2luKCk7IEkgIT0gTS5lbmQoKTsgKytJKSB7CisgICAgRnVuY3Rpb24gJkYgPSAqSTsKKyAgICBpZiAoRi5pc0RlY2xhcmF0aW9uKCkgfHwgRi5tYXlCZU92ZXJyaWRkZW4oKSkgY29udGludWU7CisgICAgSW50ZXJlc3RpbmdBcmdWZWN0b3IgaW50ZXJlc3RpbmdBcmdzOworICAgIHNjYW5Gb3JJbnRlcmVzdChGLCBpbnRlcmVzdGluZ0FyZ3MpOworCisgICAgLy8gRmluZCB0aGUgZmlyc3QgaW50ZXJlc3RpbmcgQXJndW1lbnQgdGhhdCB3ZSBjYW4gc3BlY2lhbGl6ZSBvbgorICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBpbnRlcmVzdGluZyBBcmd1bWVudHMsIHRoZW4gdGhvc2Ugd2lsbCBiZSBmb3VuZAorICAgIC8vIHdoZW4gcHJvY2Vzc2luZyB0aGUgY2xvbmVkIGZ1bmN0aW9uLgorICAgIGJvb2wgYnJlYWtPdXRlciA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaW50IHggPSAwOyAhYnJlYWtPdXRlciAmJiB4IDwgaW50ZXJlc3RpbmdBcmdzLnNpemUoKTsgKyt4KSB7CisgICAgICBzdGQ6Om1hcDxDb25zdGFudCosIGludD4gZGlzdHJpYnV0aW9uOworICAgICAgaW50IHRvdGFsID0gc2NhbkRpc3RyaWJ1dGlvbihGLCBpbnRlcmVzdGluZ0FyZ3NbeF0sIGRpc3RyaWJ1dGlvbik7CisgICAgICBpZiAodG90YWwgPiBDYWxsc01pbikgCisgICAgICAgIGZvciAoc3RkOjptYXA8Q29uc3RhbnQqLCBpbnQ+OjppdGVyYXRvciBpaSA9IGRpc3RyaWJ1dGlvbi5iZWdpbigpLAorICAgICAgICAgICAgICAgZWUgPSBkaXN0cmlidXRpb24uZW5kKCk7IGlpICE9IGVlOyArK2lpKQorICAgICAgICAgIGlmICh0b3RhbCA+IGlpLT5zZWNvbmQgJiYgaWktPmZpcnN0ICYmCisgICAgICAgICAgICAgICBpaS0+c2Vjb25kID4gdG90YWwgKiBDb25zdFZhbFBlcmNlbnQpIHsKKyAgICAgICAgICAgIFZhbHVlTWFwPGNvbnN0IFZhbHVlKiwgVmFsdWUqPiBtOworICAgICAgICAgICAgRnVuY3Rpb246OmFyZ19pdGVyYXRvciBhcmcgPSBGLmFyZ19iZWdpbigpOworICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBpbnRlcmVzdGluZ0FyZ3NbeF07ICsreSkKKyAgICAgICAgICAgICAgKythcmc7CisgICAgICAgICAgICBtWyYqYXJnXSA9IGlpLT5maXJzdDsKKyAgICAgICAgICAgIFNwZWNpYWxpemVGdW5jdGlvbigmRiwgbSk7CisgICAgICAgICAgICArK251bVNwZWNpYWxpemVkOworICAgICAgICAgICAgYnJlYWtPdXRlciA9IHRydWU7CisgICAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gc2NhbkZvckludGVyZXN0IC0gVGhpcyBmdW5jdGlvbiBkZWNpZGVzIHdoaWNoIGFyZ3VtZW50cyB3b3VsZCBiZSB3b3J0aAorLy8vIHNwZWNpYWxpemluZyBvbi4KK3ZvaWQgUGFydFNwZWM6OnNjYW5Gb3JJbnRlcmVzdChGdW5jdGlvbiYgRiwgSW50ZXJlc3RpbmdBcmdWZWN0b3ImIGFyZ3MpIHsKKyAgZm9yKEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgaWkgPSBGLmFyZ19iZWdpbigpLCBlZSA9IEYuYXJnX2VuZCgpOworICAgICAgaWkgIT0gZWU7ICsraWkpIHsKKyAgICBmb3IoVmFsdWU6OnVzZV9pdGVyYXRvciB1aSA9IGlpLT51c2VfYmVnaW4oKSwgdWUgPSBpaS0+dXNlX2VuZCgpOworICAgICAgICB1aSAhPSB1ZTsgKyt1aSkgeworCisgICAgICBib29sIGludGVyZXN0aW5nID0gZmFsc2U7CisgICAgICBVc2VyICpVID0gKnVpOworICAgICAgaWYgKGlzYTxDbXBJbnN0PihVKSkgaW50ZXJlc3RpbmcgPSB0cnVlOworICAgICAgZWxzZSBpZiAoaXNhPENhbGxJbnN0PihVKSkKKyAgICAgICAgaW50ZXJlc3RpbmcgPSB1aS0+Z2V0T3BlcmFuZCgwKSA9PSBpaTsKKyAgICAgIGVsc2UgaWYgKGlzYTxJbnZva2VJbnN0PihVKSkKKyAgICAgICAgaW50ZXJlc3RpbmcgPSB1aS0+Z2V0T3BlcmFuZCgwKSA9PSBpaTsKKyAgICAgIGVsc2UgaWYgKGlzYTxTd2l0Y2hJbnN0PihVKSkgaW50ZXJlc3RpbmcgPSB0cnVlOworICAgICAgZWxzZSBpZiAoaXNhPEJyYW5jaEluc3Q+KFUpKSBpbnRlcmVzdGluZyA9IHRydWU7CisKKyAgICAgIGlmIChpbnRlcmVzdGluZykgeworICAgICAgICBhcmdzLnB1c2hfYmFjayhzdGQ6OmRpc3RhbmNlKEYuYXJnX2JlZ2luKCksIGlpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gc2NhbkRpc3RyaWJ1dGlvbiAtIENvbnN0cnVjdCBhIGhpc3RvZ3JhbSBvZiBjb25zdGFudHMgZm9yIGFyZyBvZiBGIGF0IGFyZy4KK2ludCBQYXJ0U3BlYzo6c2NhbkRpc3RyaWJ1dGlvbihGdW5jdGlvbiYgRiwgaW50IGFyZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Q29uc3RhbnQqLCBpbnQ+JiBkaXN0KSB7CisgIGJvb2wgaGFzSW5kaXJlY3QgPSBmYWxzZTsKKyAgaW50IHRvdGFsID0gMDsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIGlpID0gRi51c2VfYmVnaW4oKSwgZWUgPSBGLnVzZV9lbmQoKTsKKyAgICAgIGlpICE9IGVlOyArK2lpKSB7CisgICAgVXNlciAqVSA9ICppaTsKKyAgICBDYWxsU2l0ZSBDUyhVKTsKKyAgICBpZiAoQ1MgJiYgQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKSA9PSAmRikgeworICAgICAgKytkaXN0W2R5bl9jYXN0PENvbnN0YW50PihDUy5nZXRBcmd1bWVudChhcmcpKV07CisgICAgICArK3RvdGFsOworICAgIH0gZWxzZQorICAgICAgaGFzSW5kaXJlY3QgPSB0cnVlOworICB9CisKKyAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGFkZHJlc3MgdGFrZW4gZnVuY3Rpb24gZXZlbiBpZiBhbGwgb3RoZXIgdXNlcworICAvLyB3aWxsIGJlIHNwZWNpYWxpemVkLgorICBpZiAoaGFzSW5kaXJlY3QpICsrdG90YWw7CisgIHJldHVybiB0b3RhbDsKK30KKworTW9kdWxlUGFzcyogbGx2bTo6Y3JlYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uUGFzcygpIHsgcmV0dXJuIG5ldyBQYXJ0U3BlYygpOyB9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vUHJ1bmVFSC5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vUHJ1bmVFSC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhYzc2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9QcnVuZUVILmNwcApAQCAtMCwwICsxLDI1MiBAQAorLy89PT0tIFBydW5lRUguY3BwIC0gUGFzcyB3aGljaCBkZWxldGVzIHVudXNlZCBleGNlcHRpb24gaGFuZGxlcnMgLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHNpbXBsZSBpbnRlcnByb2NlZHVyYWwgcGFzcyB3aGljaCB3YWxrcyB0aGUKKy8vIGNhbGwtZ3JhcGgsIHR1cm5pbmcgaW52b2tlIGluc3RydWN0aW9ucyBpbnRvIGNhbGxzLCBpZmYgdGhlIGNhbGxlZSBjYW5ub3QKKy8vIHRocm93IGFuIGV4Y2VwdGlvbiwgYW5kIG1hcmtpbmcgZnVuY3Rpb25zICdub3Vud2luZCcgaWYgdGhleSBjYW5ub3QgdGhyb3cuCisvLyBJdCBpbXBsZW1lbnRzIHRoaXMgYXMgYSBib3R0b20tdXAgdHJhdmVyc2FsIG9mIHRoZSBjYWxsLWdyYXBoLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAicHJ1bmUtZWgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbEdyYXBoU0NDUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1SZW1vdmVkLCAiTnVtYmVyIG9mIGludm9rZXMgcmVtb3ZlZCIpOworU1RBVElTVElDKE51bVVucmVhY2gsICJOdW1iZXIgb2Ygbm9yZXR1cm4gY2FsbHMgb3B0aW1pemVkIik7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBQcnVuZUVIIDogcHVibGljIENhbGxHcmFwaFNDQ1Bhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgUHJ1bmVFSCgpIDogQ2FsbEdyYXBoU0NDUGFzcyhJRCkge30KKworICAgIC8vIHJ1bk9uU0NDIC0gQW5hbHl6ZSB0aGUgU0NDLCBwZXJmb3JtaW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiBpZiBwb3NzaWJsZS4KKyAgICBib29sIHJ1bk9uU0NDKENhbGxHcmFwaFNDQyAmU0NDKTsKKworICAgIGJvb2wgU2ltcGxpZnlGdW5jdGlvbihGdW5jdGlvbiAqRik7CisgICAgdm9pZCBEZWxldGVCYXNpY0Jsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKyAgfTsKK30KKworY2hhciBQcnVuZUVIOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoUHJ1bmVFSCwgInBydW5lLWVoIiwKKyAgICAgICAgICAgICAgICAiUmVtb3ZlIHVudXNlZCBleGNlcHRpb24gaGFuZGxpbmcgaW5mbyIsIGZhbHNlLCBmYWxzZSk7CisKK1Bhc3MgKmxsdm06OmNyZWF0ZVBydW5lRUhQYXNzKCkgeyByZXR1cm4gbmV3IFBydW5lRUgoKTsgfQorCisKK2Jvb2wgUHJ1bmVFSDo6cnVuT25TQ0MoQ2FsbEdyYXBoU0NDICZTQ0MpIHsKKyAgU21hbGxQdHJTZXQ8Q2FsbEdyYXBoTm9kZSAqLCA4PiBTQ0NOb2RlczsKKyAgQ2FsbEdyYXBoICZDRyA9IGdldEFuYWx5c2lzPENhbGxHcmFwaD4oKTsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgLy8gRmlsbCBTQ0NOb2RlcyB3aXRoIHRoZSBlbGVtZW50cyBvZiB0aGUgU0NDLiAgVXNlZCBmb3IgcXVpY2tseQorICAvLyBsb29raW5nIHVwIHdoZXRoZXIgYSBnaXZlbiBDYWxsR3JhcGhOb2RlIGlzIGluIHRoaXMgU0NDLgorICBmb3IgKENhbGxHcmFwaFNDQzo6aXRlcmF0b3IgSSA9IFNDQy5iZWdpbigpLCBFID0gU0NDLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBTQ0NOb2Rlcy5pbnNlcnQoKkkpOworCisgIC8vIEZpcnN0IHBhc3MsIHNjYW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhlIFNDQywgc2ltcGxpZnlpbmcgdGhlbQorICAvLyBhY2NvcmRpbmcgdG8gd2hhdCB3ZSBrbm93LgorICBmb3IgKENhbGxHcmFwaFNDQzo6aXRlcmF0b3IgSSA9IFNDQy5iZWdpbigpLCBFID0gU0NDLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoRnVuY3Rpb24gKkYgPSAoKkkpLT5nZXRGdW5jdGlvbigpKQorICAgICAgTWFkZUNoYW5nZSB8PSBTaW1wbGlmeUZ1bmN0aW9uKEYpOworCisgIC8vIE5leHQsIGNoZWNrIHRvIHNlZSBpZiBhbnkgY2FsbGVlcyBtaWdodCB0aHJvdyBvciBpZiB0aGVyZSBhcmUgYW55IGV4dGVybmFsCisgIC8vIGZ1bmN0aW9ucyBpbiB0aGlzIFNDQzogaWYgc28sIHdlIGNhbm5vdCBwcnVuZSBhbnkgZnVuY3Rpb25zIGluIHRoaXMgU0NDLgorICAvLyBEZWZpbml0aW9ucyB0aGF0IGFyZSB3ZWFrIGFuZCBub3QgZGVjbGFyZWQgbm9uLXRocm93aW5nIG1pZ2h0IGJlIAorICAvLyBvdmVycmlkZGVuIGF0IGxpbmt0aW1lIHdpdGggc29tZXRoaW5nIHRoYXQgdGhyb3dzLCBzbyBhc3N1bWUgdGhhdC4KKyAgLy8gSWYgdGhpcyBTQ0MgaW5jbHVkZXMgdGhlIHVud2luZCBpbnN0cnVjdGlvbiwgd2UgS05PVyBpdCB0aHJvd3MsIHNvCisgIC8vIG9idmlvdXNseSB0aGUgU0NDIG1pZ2h0IHRocm93LgorICAvLworICBib29sIFNDQ01pZ2h0VW53aW5kID0gZmFsc2UsIFNDQ01pZ2h0UmV0dXJuID0gZmFsc2U7CisgIGZvciAoQ2FsbEdyYXBoU0NDOjppdGVyYXRvciBJID0gU0NDLmJlZ2luKCksIEUgPSBTQ0MuZW5kKCk7IAorICAgICAgICghU0NDTWlnaHRVbndpbmQgfHwgIVNDQ01pZ2h0UmV0dXJuKSAmJiBJICE9IEU7ICsrSSkgeworICAgIEZ1bmN0aW9uICpGID0gKCpJKS0+Z2V0RnVuY3Rpb24oKTsKKyAgICBpZiAoRiA9PSAwKSB7CisgICAgICBTQ0NNaWdodFVud2luZCA9IHRydWU7CisgICAgICBTQ0NNaWdodFJldHVybiA9IHRydWU7CisgICAgfSBlbHNlIGlmIChGLT5pc0RlY2xhcmF0aW9uKCkgfHwgRi0+bWF5QmVPdmVycmlkZGVuKCkpIHsKKyAgICAgIFNDQ01pZ2h0VW53aW5kIHw9ICFGLT5kb2VzTm90VGhyb3coKTsKKyAgICAgIFNDQ01pZ2h0UmV0dXJuIHw9ICFGLT5kb2VzTm90UmV0dXJuKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJvb2wgQ2hlY2tVbndpbmQgPSAhU0NDTWlnaHRVbndpbmQgJiYgIUYtPmRvZXNOb3RUaHJvdygpOworICAgICAgYm9vbCBDaGVja1JldHVybiA9ICFTQ0NNaWdodFJldHVybiAmJiAhRi0+ZG9lc05vdFJldHVybigpOworCisgICAgICBpZiAoIUNoZWNrVW53aW5kICYmICFDaGVja1JldHVybikKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGFuIHVud2luZCBvciBjYWxscyBhbgorICAgICAgLy8gdW53aW5kaW5nIGZ1bmN0aW9uLgorICAgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpIHsKKyAgICAgICAgaWYgKENoZWNrVW53aW5kICYmIGlzYTxVbndpbmRJbnN0PihCQi0+Z2V0VGVybWluYXRvcigpKSkgeworICAgICAgICAgIC8vIFVzZXMgdW53aW5kIQorICAgICAgICAgIFNDQ01pZ2h0VW53aW5kID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChDaGVja1JldHVybiAmJiBpc2E8UmV0dXJuSW5zdD4oQkItPmdldFRlcm1pbmF0b3IoKSkpIHsKKyAgICAgICAgICBTQ0NNaWdodFJldHVybiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnZva2UgaW5zdHJ1Y3Rpb25zIGRvbid0IGFsbG93IHVud2luZGluZyB0byBjb250aW51ZSwgc28gd2UgYXJlCisgICAgICAgIC8vIG9ubHkgaW50ZXJlc3RlZCBpbiBjYWxsIGluc3RydWN0aW9ucy4KKyAgICAgICAgaWYgKENoZWNrVW53aW5kICYmICFTQ0NNaWdodFVud2luZCkKKyAgICAgICAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgICAgICBpZiAoQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KEkpKSB7CisgICAgICAgICAgICAgIGlmIChDSS0+ZG9lc05vdFRocm93KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbGwgY2Fubm90IHRocm93LgorICAgICAgICAgICAgICB9IGVsc2UgaWYgKEZ1bmN0aW9uICpDYWxsZWUgPSBDSS0+Z2V0Q2FsbGVkRnVuY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIENhbGxHcmFwaE5vZGUgKkNhbGxlZU5vZGUgPSBDR1tDYWxsZWVdOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjYWxsZWUgaXMgb3V0c2lkZSBvdXIgY3VycmVudCBTQ0MgdGhlbiB3ZSBtYXkKKyAgICAgICAgICAgICAgICAvLyB0aHJvdyBiZWNhdXNlIGl0IG1pZ2h0LgorICAgICAgICAgICAgICAgIGlmICghU0NDTm9kZXMuY291bnQoQ2FsbGVlTm9kZSkpIHsKKyAgICAgICAgICAgICAgICAgIFNDQ01pZ2h0VW53aW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJbmRpcmVjdCBjYWxsLCBpdCBtaWdodCB0aHJvdy4KKyAgICAgICAgICAgICAgICBTQ0NNaWdodFVud2luZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKFNDQ01pZ2h0VW53aW5kICYmIFNDQ01pZ2h0UmV0dXJuKSBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgU0NDIGRvZXNuJ3QgdW53aW5kIG9yIGRvZXNuJ3QgdGhyb3csIG5vdGUgdGhpcyBmYWN0LgorICBpZiAoIVNDQ01pZ2h0VW53aW5kIHx8ICFTQ0NNaWdodFJldHVybikKKyAgICBmb3IgKENhbGxHcmFwaFNDQzo6aXRlcmF0b3IgSSA9IFNDQy5iZWdpbigpLCBFID0gU0NDLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgQXR0cmlidXRlcyBOZXdBdHRyaWJ1dGVzID0gQXR0cmlidXRlOjpOb25lOworCisgICAgICBpZiAoIVNDQ01pZ2h0VW53aW5kKQorICAgICAgICBOZXdBdHRyaWJ1dGVzIHw9IEF0dHJpYnV0ZTo6Tm9VbndpbmQ7CisgICAgICBpZiAoIVNDQ01pZ2h0UmV0dXJuKQorICAgICAgICBOZXdBdHRyaWJ1dGVzIHw9IEF0dHJpYnV0ZTo6Tm9SZXR1cm47CisKKyAgICAgIEZ1bmN0aW9uICpGID0gKCpJKS0+Z2V0RnVuY3Rpb24oKTsKKyAgICAgIGNvbnN0IEF0dHJMaXN0UHRyICZQQUwgPSBGLT5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICBjb25zdCBBdHRyTGlzdFB0ciAmTlBBTCA9IFBBTC5hZGRBdHRyKH4wLCBOZXdBdHRyaWJ1dGVzKTsKKyAgICAgIGlmIChQQUwgIT0gTlBBTCkgeworICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgRi0+c2V0QXR0cmlidXRlcyhOUEFMKTsKKyAgICAgIH0KKyAgICB9CisKKyAgZm9yIChDYWxsR3JhcGhTQ0M6Oml0ZXJhdG9yIEkgPSBTQ0MuYmVnaW4oKSwgRSA9IFNDQy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAvLyBDb252ZXJ0IGFueSBpbnZva2UgaW5zdHJ1Y3Rpb25zIHRvIG5vbi10aHJvd2luZyBmdW5jdGlvbnMgaW4gdGhpcyBub2RlCisgICAgLy8gaW50byBjYWxsIGluc3RydWN0aW9ucyB3aXRoIGEgYnJhbmNoLiAgVGhpcyBtYWtlcyB0aGUgZXhjZXB0aW9uIGJsb2NrcworICAgIC8vIGRlYWQuCisgICAgaWYgKEZ1bmN0aW9uICpGID0gKCpJKS0+Z2V0RnVuY3Rpb24oKSkKKyAgICAgIE1hZGVDaGFuZ2UgfD0gU2ltcGxpZnlGdW5jdGlvbihGKTsKKyAgfQorCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisKKy8vIFNpbXBsaWZ5RnVuY3Rpb24gLSBHaXZlbiBpbmZvcm1hdGlvbiBhYm91dCBjYWxsZWVzLCBzaW1wbGlmeSB0aGUgc3BlY2lmaWVkCisvLyBmdW5jdGlvbiBpZiB3ZSBoYXZlIGludm9rZXMgdG8gbm9uLXVud2luZGluZyBmdW5jdGlvbnMgb3IgY29kZSBhZnRlciBjYWxscyB0bworLy8gbm8tcmV0dXJuIGZ1bmN0aW9ucy4KK2Jvb2wgUHJ1bmVFSDo6U2ltcGxpZnlGdW5jdGlvbihGdW5jdGlvbiAqRikgeworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpIHsKKyAgICBpZiAoSW52b2tlSW5zdCAqSUkgPSBkeW5fY2FzdDxJbnZva2VJbnN0PihCQi0+Z2V0VGVybWluYXRvcigpKSkKKyAgICAgIGlmIChJSS0+ZG9lc05vdFRocm93KCkpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8VmFsdWUqLCA4PiBBcmdzKElJLT5vcF9iZWdpbigpLCBJSS0+b3BfZW5kKCkgLSAzKTsKKyAgICAgICAgLy8gSW5zZXJ0IGEgY2FsbCBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGludm9rZS4KKyAgICAgICAgQ2FsbEluc3QgKkNhbGwgPSBDYWxsSW5zdDo6Q3JlYXRlKElJLT5nZXRDYWxsZWRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLCAiIiwgSUkpOworICAgICAgICBDYWxsLT50YWtlTmFtZShJSSk7CisgICAgICAgIENhbGwtPnNldENhbGxpbmdDb252KElJLT5nZXRDYWxsaW5nQ29udigpKTsKKyAgICAgICAgQ2FsbC0+c2V0QXR0cmlidXRlcyhJSS0+Z2V0QXR0cmlidXRlcygpKTsKKworICAgICAgICAvLyBBbnl0aGluZyB0aGF0IHVzZWQgdGhlIHZhbHVlIHByb2R1Y2VkIGJ5IHRoZSBpbnZva2UgaW5zdHJ1Y3Rpb24KKyAgICAgICAgLy8gbm93IHVzZXMgdGhlIHZhbHVlIHByb2R1Y2VkIGJ5IHRoZSBjYWxsIGluc3RydWN0aW9uLiAgTm90ZSB0aGF0IHdlCisgICAgICAgIC8vIGRvIHRoaXMgZXZlbiBmb3Igdm9pZCBmdW5jdGlvbnMgYW5kIGNhbGxzIHdpdGggbm8gdXNlcyBzbyB0aGF0IHRoZQorICAgICAgICAvLyBjYWxsZ3JhcGggZWRnZSBpcyB1cGRhdGVkLgorICAgICAgICBJSS0+cmVwbGFjZUFsbFVzZXNXaXRoKENhbGwpOworICAgICAgICBCYXNpY0Jsb2NrICpVbndpbmRCbG9jayA9IElJLT5nZXRVbndpbmREZXN0KCk7CisgICAgICAgIFVud2luZEJsb2NrLT5yZW1vdmVQcmVkZWNlc3NvcihJSS0+Z2V0UGFyZW50KCkpOworCisgICAgICAgIC8vIEluc2VydCBhIGJyYW5jaCB0byB0aGUgbm9ybWFsIGRlc3RpbmF0aW9uIHJpZ2h0IGJlZm9yZSB0aGUKKyAgICAgICAgLy8gaW52b2tlLgorICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoSUktPmdldE5vcm1hbERlc3QoKSwgSUkpOworCisgICAgICAgIC8vIEZpbmFsbHksIGRlbGV0ZSB0aGUgaW52b2tlIGluc3RydWN0aW9uIQorICAgICAgICBCQi0+Z2V0SW5zdExpc3QoKS5wb3BfYmFjaygpOworCisgICAgICAgIC8vIElmIHRoZSB1bndpbmQgYmxvY2sgaXMgbm93IGRlYWQsIG51a2UgaXQuCisgICAgICAgIGlmIChwcmVkX2JlZ2luKFVud2luZEJsb2NrKSA9PSBwcmVkX2VuZChVbndpbmRCbG9jaykpCisgICAgICAgICAgRGVsZXRlQmFzaWNCbG9jayhVbndpbmRCbG9jayk7ICAvLyBEZWxldGUgdGhlIG5ldyBCQi4KKworICAgICAgICArK051bVJlbW92ZWQ7CisgICAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgICAgfQorCisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7IEkgIT0gRTsgKQorICAgICAgaWYgKENhbGxJbnN0ICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PihJKyspKQorICAgICAgICBpZiAoQ0ktPmRvZXNOb3RSZXR1cm4oKSAmJiAhaXNhPFVucmVhY2hhYmxlSW5zdD4oSSkpIHsKKyAgICAgICAgICAvLyBUaGlzIGNhbGwgY2FsbHMgYSBmdW5jdGlvbiB0aGF0IGNhbm5vdCByZXR1cm4uICBJbnNlcnQgYW4KKyAgICAgICAgICAvLyB1bnJlYWNoYWJsZSBpbnN0cnVjdGlvbiBhZnRlciBpdCBhbmQgc2ltcGxpZnkgdGhlIGNvZGUuICBEbyB0aGlzCisgICAgICAgICAgLy8gYnkgc3BsaXR0aW5nIHRoZSBCQiwgYWRkaW5nIHRoZSB1bnJlYWNoYWJsZSwgdGhlbiBkZWxldGluZyB0aGUKKyAgICAgICAgICAvLyBuZXcgQkIuCisgICAgICAgICAgQmFzaWNCbG9jayAqTmV3ID0gQkItPnNwbGl0QmFzaWNCbG9jayhJKTsKKworICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdW5jb25kIGJyYW5jaCBhbmQgYWRkIGFuIHVucmVhY2hhYmxlLgorICAgICAgICAgIEJCLT5nZXRJbnN0TGlzdCgpLnBvcF9iYWNrKCk7CisgICAgICAgICAgbmV3IFVucmVhY2hhYmxlSW5zdChCQi0+Z2V0Q29udGV4dCgpLCBCQik7CisKKyAgICAgICAgICBEZWxldGVCYXNpY0Jsb2NrKE5ldyk7ICAvLyBEZWxldGUgdGhlIG5ldyBCQi4KKyAgICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICArK051bVVucmVhY2g7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgfQorCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisvLy8gRGVsZXRlQmFzaWNCbG9jayAtIHJlbW92ZSB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrIGZyb20gdGhlIHByb2dyYW0sCisvLy8gdXBkYXRpbmcgdGhlIGNhbGxncmFwaCB0byByZWZsZWN0IGFueSBub3ctb2Jzb2xldGUgZWRnZXMgZHVlIHRvIGNhbGxzIHRoYXQKKy8vLyBleGlzdCBpbiB0aGUgQkIuCit2b2lkIFBydW5lRUg6OkRlbGV0ZUJhc2ljQmxvY2soQmFzaWNCbG9jayAqQkIpIHsKKyAgYXNzZXJ0KHByZWRfYmVnaW4oQkIpID09IHByZWRfZW5kKEJCKSAmJiAiQkIgaXMgbm90IGRlYWQhIik7CisgIENhbGxHcmFwaCAmQ0cgPSBnZXRBbmFseXNpczxDYWxsR3JhcGg+KCk7CisKKyAgQ2FsbEdyYXBoTm9kZSAqQ0dOID0gQ0dbQkItPmdldFBhcmVudCgpXTsKKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQkItPmVuZCgpLCBFID0gQkItPmJlZ2luKCk7IEkgIT0gRTsgKSB7CisgICAgLS1JOworICAgIGlmIChDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oSSkpIHsKKyAgICAgIGlmICghaXNhPERiZ0luZm9JbnRyaW5zaWM+KEkpKQorICAgICAgICBDR04tPnJlbW92ZUNhbGxFZGdlRm9yKENJKTsKKyAgICB9IGVsc2UgaWYgKEludm9rZUluc3QgKklJID0gZHluX2Nhc3Q8SW52b2tlSW5zdD4oSSkpCisgICAgICBDR04tPnJlbW92ZUNhbGxFZGdlRm9yKElJKTsKKyAgICBpZiAoIUktPnVzZV9lbXB0eSgpKQorICAgICAgSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChJLT5nZXRUeXBlKCkpKTsKKyAgfQorCisgIC8vIEdldCB0aGUgbGlzdCBvZiBzdWNjZXNzb3JzIG9mIHRoaXMgYmxvY2suCisgIHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPiBTdWNjcyhzdWNjX2JlZ2luKEJCKSwgc3VjY19lbmQoQkIpKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3VjY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBTdWNjc1tpXS0+cmVtb3ZlUHJlZGVjZXNzb3IoQkIpOworCisgIEJCLT5lcmFzZUZyb21QYXJlbnQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9TdHJpcERlYWRQcm90b3R5cGVzLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9TdHJpcERlYWRQcm90b3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTEwYWQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSVBPL1N0cmlwRGVhZFByb3RvdHlwZXMuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8vPT09LS0gU3RyaXBEZWFkUHJvdG90eXBlcy5jcHAgLSBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAtLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgbG9vcHMgb3ZlciBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgaW5wdXQgbW9kdWxlLCBsb29raW5nIGZvciAKKy8vIGRlYWQgZGVjbGFyYXRpb25zIGFuZCByZW1vdmVzIHRoZW0uIERlYWQgZGVjbGFyYXRpb25zIGFyZSBkZWNsYXJhdGlvbnMgb2YKKy8vIGZ1bmN0aW9ucyBmb3Igd2hpY2ggbm8gaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIChpLmUuLCBkZWNsYXJhdGlvbnMgZm9yCisvLyB1bnVzZWQgbGlicmFyeSBmdW5jdGlvbnMpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAic3RyaXAtZGVhZC1wcm90b3R5cGVzIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1EZWFkUHJvdG90eXBlcywgIk51bWJlciBvZiBkZWFkIHByb3RvdHlwZXMgcmVtb3ZlZCIpOworCituYW1lc3BhY2UgeworCisvLy8gQGJyaWVmIFBhc3MgdG8gcmVtb3ZlIHVudXNlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCitjbGFzcyBTdHJpcERlYWRQcm90b3R5cGVzUGFzcyA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MoKSA6IE1vZHVsZVBhc3MoSUQpIHsgfQorICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKK307CisKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworY2hhciBTdHJpcERlYWRQcm90b3R5cGVzUGFzczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKFN0cmlwRGVhZFByb3RvdHlwZXNQYXNzLCAic3RyaXAtZGVhZC1wcm90b3R5cGVzIiwKKyAgICAgICAgICAgICAgICAiU3RyaXAgVW51c2VkIEZ1bmN0aW9uIFByb3RvdHlwZXMiLCBmYWxzZSwgZmFsc2UpOworCitib29sIFN0cmlwRGVhZFByb3RvdHlwZXNQYXNzOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIAorICAvLyBFcmFzZSBkZWFkIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgSSAhPSBFOyApIHsKKyAgICBGdW5jdGlvbiAqRiA9IEkrKzsKKyAgICAvLyBGdW5jdGlvbiBtdXN0IGJlIGEgcHJvdG90eXBlIGFuZCB1bnVzZWQuCisgICAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSAmJiBGLT51c2VfZW1wdHkoKSkgeworICAgICAgRi0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICArK051bURlYWRQcm90b3R5cGVzOworICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8gRXJhc2UgZGVhZCBnbG9iYWwgdmFyIHByb3RvdHlwZXMuCisgIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKKyAgICAgICBJICE9IEU7ICkgeworICAgIEdsb2JhbFZhcmlhYmxlICpHViA9IEkrKzsKKyAgICAvLyBHbG9iYWwgbXVzdCBiZSBhIHByb3RvdHlwZSBhbmQgdW51c2VkLgorICAgIGlmIChHVi0+aXNEZWNsYXJhdGlvbigpICYmIEdWLT51c2VfZW1wdHkoKSkKKyAgICAgIEdWLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorICAKKyAgLy8gUmV0dXJuIGFuIGluZGljYXRpb24gb2Ygd2hldGhlciB3ZSBjaGFuZ2VkIGFueXRoaW5nIG9yIG5vdC4KKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKK01vZHVsZVBhc3MgKmxsdm06OmNyZWF0ZVN0cmlwRGVhZFByb3RvdHlwZXNQYXNzKCkgeworICByZXR1cm4gbmV3IFN0cmlwRGVhZFByb3RvdHlwZXNQYXNzKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vU3RyaXBTeW1ib2xzLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9TdHJpcFN5bWJvbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzRmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vU3RyaXBTeW1ib2xzLmNwcApAQCAtMCwwICsxLDQwMCBAQAorLy89PT0tIFN0cmlwU3ltYm9scy5jcHAgLSBTdHJpcCBzeW1ib2xzIGFuZCBkZWJ1ZyBpbmZvIGZyb20gYSBtb2R1bGUgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgU3RyaXBTeW1ib2xzIHRyYW5zZm9ybWF0aW9uIGltcGxlbWVudHMgY29kZSBzdHJpcHBpbmcuIFNwZWNpZmljYWxseSwgaXQKKy8vIGNhbiBkZWxldGU6CisvLyAKKy8vICAgKiBuYW1lcyBmb3IgdmlydHVhbCByZWdpc3RlcnMKKy8vICAgKiBzeW1ib2xzIGZvciBpbnRlcm5hbCBnbG9iYWxzIGFuZCBmdW5jdGlvbnMKKy8vICAgKiBkZWJ1ZyBpbmZvcm1hdGlvbgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIHRyYW5zZm9ybWF0aW9uIG1ha2VzIGNvZGUgbXVjaCBsZXNzIHJlYWRhYmxlLCBzbyBpdCBzaG91bGQKKy8vIG9ubHkgYmUgdXNlZCBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSAnc3RyaXAnIHV0aWxpdHkgd291bGQgYmUgdXNlZCwgc3VjaCBhcworLy8gcmVkdWNpbmcgY29kZSBzaXplIG9yIG1ha2luZyBpdCBoYXJkZXIgdG8gcmV2ZXJzZSBlbmdpbmVlciBjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RlYnVnSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVmFsdWVTeW1ib2xUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vVHlwZVN5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgeworICBjbGFzcyBTdHJpcFN5bWJvbHMgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgICAgYm9vbCBPbmx5RGVidWdJbmZvOworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBleHBsaWNpdCBTdHJpcFN5bWJvbHMoYm9vbCBPREkgPSBmYWxzZSkgCisgICAgICA6IE1vZHVsZVBhc3MoSUQpLCBPbmx5RGVidWdJbmZvKE9ESSkge30KKworICAgIHZpcnR1YWwgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pOworCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICAgIH0KKyAgfTsKKworICBjbGFzcyBTdHJpcE5vbkRlYnVnU3ltYm9scyA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgZXhwbGljaXQgU3RyaXBOb25EZWJ1Z1N5bWJvbHMoKQorICAgICAgOiBNb2R1bGVQYXNzKElEKSB7fQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgfQorICB9OworCisgIGNsYXNzIFN0cmlwRGVidWdEZWNsYXJlIDogcHVibGljIE1vZHVsZVBhc3MgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBleHBsaWNpdCBTdHJpcERlYnVnRGVjbGFyZSgpCisgICAgICA6IE1vZHVsZVBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICB9CisgIH07CisKKyAgY2xhc3MgU3RyaXBEZWFkRGVidWdJbmZvIDogcHVibGljIE1vZHVsZVBhc3MgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBleHBsaWNpdCBTdHJpcERlYWREZWJ1Z0luZm8oKQorICAgICAgOiBNb2R1bGVQYXNzKElEKSB7fQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgfQorICB9OworfQorCitjaGFyIFN0cmlwU3ltYm9sczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKFN0cmlwU3ltYm9scywgInN0cmlwIiwKKyAgICAgICAgICAgICAgICAiU3RyaXAgYWxsIHN5bWJvbHMgZnJvbSBhIG1vZHVsZSIsIGZhbHNlLCBmYWxzZSk7CisKK01vZHVsZVBhc3MgKmxsdm06OmNyZWF0ZVN0cmlwU3ltYm9sc1Bhc3MoYm9vbCBPbmx5RGVidWdJbmZvKSB7CisgIHJldHVybiBuZXcgU3RyaXBTeW1ib2xzKE9ubHlEZWJ1Z0luZm8pOworfQorCitjaGFyIFN0cmlwTm9uRGVidWdTeW1ib2xzOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoU3RyaXBOb25EZWJ1Z1N5bWJvbHMsICJzdHJpcC1ub25kZWJ1ZyIsCisgICAgICAgICAgICAgICAgIlN0cmlwIGFsbCBzeW1ib2xzLCBleGNlcHQgZGJnIHN5bWJvbHMsIGZyb20gYSBtb2R1bGUiLAorICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisKK01vZHVsZVBhc3MgKmxsdm06OmNyZWF0ZVN0cmlwTm9uRGVidWdTeW1ib2xzUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBTdHJpcE5vbkRlYnVnU3ltYm9scygpOworfQorCitjaGFyIFN0cmlwRGVidWdEZWNsYXJlOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoU3RyaXBEZWJ1Z0RlY2xhcmUsICJzdHJpcC1kZWJ1Zy1kZWNsYXJlIiwKKyAgICAgICAgICAgICAgICAiU3RyaXAgYWxsIGxsdm0uZGJnLmRlY2xhcmUgaW50cmluc2ljcyIsIGZhbHNlLCBmYWxzZSk7CisKK01vZHVsZVBhc3MgKmxsdm06OmNyZWF0ZVN0cmlwRGVidWdEZWNsYXJlUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBTdHJpcERlYnVnRGVjbGFyZSgpOworfQorCitjaGFyIFN0cmlwRGVhZERlYnVnSW5mbzo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKFN0cmlwRGVhZERlYnVnSW5mbywgInN0cmlwLWRlYWQtZGVidWctaW5mbyIsCisgICAgICAgICAgICAgICAgIlN0cmlwIGRlYnVnIGluZm8gZm9yIHVudXNlZCBzeW1ib2xzIiwgZmFsc2UsIGZhbHNlKTsKKworTW9kdWxlUGFzcyAqbGx2bTo6Y3JlYXRlU3RyaXBEZWFkRGVidWdJbmZvUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBTdHJpcERlYWREZWJ1Z0luZm8oKTsKK30KKworLy8vIE9ubHlVc2VkQnkgLSBSZXR1cm4gdHJ1ZSBpZiBWIGlzIG9ubHkgdXNlZCBieSBVc3IuCitzdGF0aWMgYm9vbCBPbmx5VXNlZEJ5KFZhbHVlICpWLCBWYWx1ZSAqVXNyKSB7CisgIGZvcihWYWx1ZTo6dXNlX2l0ZXJhdG9yIEkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBVc2VyICpVID0gKkk7CisgICAgaWYgKFUgIT0gVXNyKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBSZW1vdmVEZWFkQ29uc3RhbnQoQ29uc3RhbnQgKkMpIHsKKyAgYXNzZXJ0KEMtPnVzZV9lbXB0eSgpICYmICJDb25zdGFudCBpcyBub3QgZGVhZCEiKTsKKyAgU21hbGxQdHJTZXQ8Q29uc3RhbnQqLCA0PiBPcGVyYW5kczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEMtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChpc2E8RGVyaXZlZFR5cGU+KEMtPmdldE9wZXJhbmQoaSktPmdldFR5cGUoKSkgJiYKKyAgICAgICAgT25seVVzZWRCeShDLT5nZXRPcGVyYW5kKGkpLCBDKSkgCisgICAgICBPcGVyYW5kcy5pbnNlcnQoY2FzdDxDb25zdGFudD4oQy0+Z2V0T3BlcmFuZChpKSkpOworICBpZiAoR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KEMpKSB7CisgICAgaWYgKCFHVi0+aGFzTG9jYWxMaW5rYWdlKCkpIHJldHVybjsgICAvLyBEb24ndCBkZWxldGUgbm9uIHN0YXRpYyBnbG9iYWxzLgorICAgIEdWLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorICBlbHNlIGlmICghaXNhPEZ1bmN0aW9uPihDKSkKKyAgICBpZiAoaXNhPENvbXBvc2l0ZVR5cGU+KEMtPmdldFR5cGUoKSkpCisgICAgICBDLT5kZXN0cm95Q29uc3RhbnQoKTsKKworICAvLyBJZiB0aGUgY29uc3RhbnQgcmVmZXJlbmNlZCBhbnl0aGluZywgc2VlIGlmIHdlIGNhbiBkZWxldGUgaXQgYXMgd2VsbC4KKyAgZm9yIChTbWFsbFB0clNldDxDb25zdGFudCosIDQ+OjppdGVyYXRvciBPSSA9IE9wZXJhbmRzLmJlZ2luKCksCisgICAgICAgICBPRSA9IE9wZXJhbmRzLmVuZCgpOyBPSSAhPSBPRTsgKytPSSkKKyAgICBSZW1vdmVEZWFkQ29uc3RhbnQoKk9JKTsKK30KKworLy8gU3RyaXAgdGhlIHN5bWJvbCB0YWJsZSBvZiBpdHMgbmFtZXMuCisvLworc3RhdGljIHZvaWQgU3RyaXBTeW10YWIoVmFsdWVTeW1ib2xUYWJsZSAmU1QsIGJvb2wgUHJlc2VydmVEYmdJbmZvKSB7CisgIGZvciAoVmFsdWVTeW1ib2xUYWJsZTo6aXRlcmF0b3IgVkkgPSBTVC5iZWdpbigpLCBWRSA9IFNULmVuZCgpOyBWSSAhPSBWRTsgKSB7CisgICAgVmFsdWUgKlYgPSBWSS0+Z2V0VmFsdWUoKTsKKyAgICArK1ZJOworICAgIGlmICghaXNhPEdsb2JhbFZhbHVlPihWKSB8fCBjYXN0PEdsb2JhbFZhbHVlPihWKS0+aGFzTG9jYWxMaW5rYWdlKCkpIHsKKyAgICAgIGlmICghUHJlc2VydmVEYmdJbmZvIHx8ICFWLT5nZXROYW1lKCkuc3RhcnRzd2l0aCgibGx2bS5kYmciKSkKKyAgICAgICAgLy8gU2V0IG5hbWUgdG8gIiIsIHJlbW92aW5nIGZyb20gc3ltYm9sIHRhYmxlIQorICAgICAgICBWLT5zZXROYW1lKCIiKTsKKyAgICB9CisgIH0KK30KKworLy8gU3RyaXAgdGhlIHN5bWJvbCB0YWJsZSBvZiBpdHMgbmFtZXMuCitzdGF0aWMgdm9pZCBTdHJpcFR5cGVTeW10YWIoVHlwZVN5bWJvbFRhYmxlICZTVCwgYm9vbCBQcmVzZXJ2ZURiZ0luZm8pIHsKKyAgZm9yIChUeXBlU3ltYm9sVGFibGU6Oml0ZXJhdG9yIFRJID0gU1QuYmVnaW4oKSwgRSA9IFNULmVuZCgpOyBUSSAhPSBFOyApIHsKKyAgICBpZiAoUHJlc2VydmVEYmdJbmZvICYmIFN0cmluZ1JlZihUSS0+Zmlyc3QpLnN0YXJ0c3dpdGgoImxsdm0uZGJnIikpCisgICAgICArK1RJOworICAgIGVsc2UKKyAgICAgIFNULnJlbW92ZShUSSsrKTsKKyAgfQorfQorCisvLy8gRmluZCB2YWx1ZXMgdGhhdCBhcmUgbWFya2VkIGFzIGxsdm0udXNlZC4KK3N0YXRpYyB2b2lkIGZpbmRVc2VkVmFsdWVzKEdsb2JhbFZhcmlhYmxlICpMTFZNVXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PGNvbnN0IEdsb2JhbFZhbHVlKiwgOD4gJlVzZWRWYWx1ZXMpIHsKKyAgaWYgKExMVk1Vc2VkID09IDApIHJldHVybjsKKyAgVXNlZFZhbHVlcy5pbnNlcnQoTExWTVVzZWQpOworICAKKyAgQ29uc3RhbnRBcnJheSAqSW5pdHMgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihMTFZNVXNlZC0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgIGlmIChJbml0cyA9PSAwKSByZXR1cm47CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5pdHMtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChHbG9iYWxWYWx1ZSAqR1YgPSAKKyAgICAgICAgICBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oSW5pdHMtPmdldE9wZXJhbmQoaSktPnN0cmlwUG9pbnRlckNhc3RzKCkpKQorICAgICAgVXNlZFZhbHVlcy5pbnNlcnQoR1YpOworfQorCisvLy8gU3RyaXBTeW1ib2xOYW1lcyAtIFN0cmlwIHN5bWJvbCBuYW1lcy4KK3N0YXRpYyBib29sIFN0cmlwU3ltYm9sTmFtZXMoTW9kdWxlICZNLCBib29sIFByZXNlcnZlRGJnSW5mbykgeworCisgIFNtYWxsUHRyU2V0PGNvbnN0IEdsb2JhbFZhbHVlKiwgOD4gbGx2bVVzZWRWYWx1ZXM7CisgIGZpbmRVc2VkVmFsdWVzKE0uZ2V0R2xvYmFsVmFyaWFibGUoImxsdm0udXNlZCIpLCBsbHZtVXNlZFZhbHVlcyk7CisgIGZpbmRVc2VkVmFsdWVzKE0uZ2V0R2xvYmFsVmFyaWFibGUoImxsdm0uY29tcGlsZXIudXNlZCIpLCBsbHZtVXNlZFZhbHVlcyk7CisKKyAgZm9yIChNb2R1bGU6Omdsb2JhbF9pdGVyYXRvciBJID0gTS5nbG9iYWxfYmVnaW4oKSwgRSA9IE0uZ2xvYmFsX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPmhhc0xvY2FsTGlua2FnZSgpICYmIGxsdm1Vc2VkVmFsdWVzLmNvdW50KEkpID09IDApCisgICAgICBpZiAoIVByZXNlcnZlRGJnSW5mbyB8fCAhSS0+Z2V0TmFtZSgpLnN0YXJ0c3dpdGgoImxsdm0uZGJnIikpCisgICAgICAgIEktPnNldE5hbWUoIiIpOyAgICAgLy8gSW50ZXJuYWwgc3ltYm9scyBjYW4ndCBwYXJ0aWNpcGF0ZSBpbiBsaW5rYWdlCisgIH0KKyAgCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+aGFzTG9jYWxMaW5rYWdlKCkgJiYgbGx2bVVzZWRWYWx1ZXMuY291bnQoSSkgPT0gMCkKKyAgICAgIGlmICghUHJlc2VydmVEYmdJbmZvIHx8ICFJLT5nZXROYW1lKCkuc3RhcnRzd2l0aCgibGx2bS5kYmciKSkKKyAgICAgICAgSS0+c2V0TmFtZSgiIik7ICAgICAvLyBJbnRlcm5hbCBzeW1ib2xzIGNhbid0IHBhcnRpY2lwYXRlIGluIGxpbmthZ2UKKyAgICBTdHJpcFN5bXRhYihJLT5nZXRWYWx1ZVN5bWJvbFRhYmxlKCksIFByZXNlcnZlRGJnSW5mbyk7CisgIH0KKyAgCisgIC8vIFJlbW92ZSBhbGwgbmFtZXMgZnJvbSB0eXBlcy4KKyAgU3RyaXBUeXBlU3ltdGFiKE0uZ2V0VHlwZVN5bWJvbFRhYmxlKCksIFByZXNlcnZlRGJnSW5mbyk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFN0cmlwRGVidWdJbmZvIC0gU3RyaXAgZGVidWcgaW5mbyBpbiB0aGUgbW9kdWxlIGlmIGl0IGV4aXN0cy4gIAorLy8gVG8gZG8gdGhpcywgd2UgcmVtb3ZlIGxsdm0uZGJnLmZ1bmMuc3RhcnQsIGxsdm0uZGJnLnN0b3Bwb2ludCwgYW5kIAorLy8gbGx2bS5kYmcucmVnaW9uLmVuZCBjYWxscywgYW5kIGFueSBnbG9iYWxzIHRoZXkgcG9pbnQgdG8gaWYgbm93IGRlYWQuCitzdGF0aWMgYm9vbCBTdHJpcERlYnVnSW5mbyhNb2R1bGUgJk0pIHsKKworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICAvLyBSZW1vdmUgYWxsIG9mIHRoZSBjYWxscyB0byB0aGUgZGVidWdnZXIgaW50cmluc2ljcywgYW5kIHJlbW92ZSB0aGVtIGZyb20KKyAgLy8gdGhlIG1vZHVsZS4KKyAgaWYgKEZ1bmN0aW9uICpEZWNsYXJlID0gTS5nZXRGdW5jdGlvbigibGx2bS5kYmcuZGVjbGFyZSIpKSB7CisgICAgd2hpbGUgKCFEZWNsYXJlLT51c2VfZW1wdHkoKSkgeworICAgICAgQ2FsbEluc3QgKkNJID0gY2FzdDxDYWxsSW5zdD4oRGVjbGFyZS0+dXNlX2JhY2soKSk7CisgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgfQorICAgIERlY2xhcmUtPmVyYXNlRnJvbVBhcmVudCgpOworICAgIENoYW5nZWQgPSB0cnVlOworICB9CisKKyAgaWYgKEZ1bmN0aW9uICpEYmdWYWwgPSBNLmdldEZ1bmN0aW9uKCJsbHZtLmRiZy52YWx1ZSIpKSB7CisgICAgd2hpbGUgKCFEYmdWYWwtPnVzZV9lbXB0eSgpKSB7CisgICAgICBDYWxsSW5zdCAqQ0kgPSBjYXN0PENhbGxJbnN0PihEYmdWYWwtPnVzZV9iYWNrKCkpOworICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIH0KKyAgICBEYmdWYWwtPmVyYXNlRnJvbVBhcmVudCgpOworICAgIENoYW5nZWQgPSB0cnVlOworICB9CisKKyAgZm9yIChNb2R1bGU6Om5hbWVkX21ldGFkYXRhX2l0ZXJhdG9yIE5NSSA9IE0ubmFtZWRfbWV0YWRhdGFfYmVnaW4oKSwKKyAgICAgICAgIE5NRSA9IE0ubmFtZWRfbWV0YWRhdGFfZW5kKCk7IE5NSSAhPSBOTUU7KSB7CisgICAgTmFtZWRNRE5vZGUgKk5NRCA9IE5NSTsKKyAgICArK05NSTsKKyAgICBpZiAoTk1ELT5nZXROYW1lKCkuc3RhcnRzd2l0aCgibGx2bS5kYmcuIikpIHsKKyAgICAgIE5NRC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgTUkgPSBNLmJlZ2luKCksIE1FID0gTS5lbmQoKTsgTUkgIT0gTUU7ICsrTUkpCisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgRkkgPSBNSS0+YmVnaW4oKSwgRkUgPSBNSS0+ZW5kKCk7IEZJICE9IEZFOworICAgICAgICAgKytGSSkKKyAgICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgQkkgPSBGSS0+YmVnaW4oKSwgQkUgPSBGSS0+ZW5kKCk7IEJJICE9IEJFOworICAgICAgICAgICArK0JJKSB7CisgICAgICAgIGlmICghQkktPmdldERlYnVnTG9jKCkuaXNVbmtub3duKCkpIHsKKyAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICBCSS0+c2V0RGVidWdMb2MoRGVidWdMb2MoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworYm9vbCBTdHJpcFN5bWJvbHM6OnJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgQ2hhbmdlZCB8PSBTdHJpcERlYnVnSW5mbyhNKTsKKyAgaWYgKCFPbmx5RGVidWdJbmZvKQorICAgIENoYW5nZWQgfD0gU3RyaXBTeW1ib2xOYW1lcyhNLCBmYWxzZSk7CisgIHJldHVybiBDaGFuZ2VkOworfQorCitib29sIFN0cmlwTm9uRGVidWdTeW1ib2xzOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgcmV0dXJuIFN0cmlwU3ltYm9sTmFtZXMoTSwgdHJ1ZSk7Cit9CisKK2Jvb2wgU3RyaXBEZWJ1Z0RlY2xhcmU6OnJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworCisgIEZ1bmN0aW9uICpEZWNsYXJlID0gTS5nZXRGdW5jdGlvbigibGx2bS5kYmcuZGVjbGFyZSIpOworICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IERlYWRDb25zdGFudHM7CisKKyAgaWYgKERlY2xhcmUpIHsKKyAgICB3aGlsZSAoIURlY2xhcmUtPnVzZV9lbXB0eSgpKSB7CisgICAgICBDYWxsSW5zdCAqQ0kgPSBjYXN0PENhbGxJbnN0PihEZWNsYXJlLT51c2VfYmFjaygpKTsKKyAgICAgIFZhbHVlICpBcmcxID0gQ0ktPmdldEFyZ09wZXJhbmQoMCk7CisgICAgICBWYWx1ZSAqQXJnMiA9IENJLT5nZXRBcmdPcGVyYW5kKDEpOworICAgICAgYXNzZXJ0KENJLT51c2VfZW1wdHkoKSAmJiAibGx2bS5kYmcgaW50cmluc2ljIHNob3VsZCBoYXZlIHZvaWQgcmVzdWx0Iik7CisgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBpZiAoQXJnMS0+dXNlX2VtcHR5KCkpIHsKKyAgICAgICAgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEFyZzEpKSAKKyAgICAgICAgICBEZWFkQ29uc3RhbnRzLnB1c2hfYmFjayhDKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICBSZWN1cnNpdmVseURlbGV0ZVRyaXZpYWxseURlYWRJbnN0cnVjdGlvbnMoQXJnMSk7CisgICAgICB9CisgICAgICBpZiAoQXJnMi0+dXNlX2VtcHR5KCkpCisgICAgICAgIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihBcmcyKSkgCisgICAgICAgICAgRGVhZENvbnN0YW50cy5wdXNoX2JhY2soQyk7CisgICAgfQorICAgIERlY2xhcmUtPmVyYXNlRnJvbVBhcmVudCgpOworICB9CisKKyAgd2hpbGUgKCFEZWFkQ29uc3RhbnRzLmVtcHR5KCkpIHsKKyAgICBDb25zdGFudCAqQyA9IERlYWRDb25zdGFudHMuYmFjaygpOworICAgIERlYWRDb25zdGFudHMucG9wX2JhY2soKTsKKyAgICBpZiAoR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KEMpKSB7CisgICAgICBpZiAoR1YtPmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgICBSZW1vdmVEZWFkQ29uc3RhbnQoR1YpOworICAgIH0gZWxzZQorICAgICAgUmVtb3ZlRGVhZENvbnN0YW50KEMpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBnZXRSZWFsTGlua2FnZU5hbWUgLSBJZiBzcGVjaWFsIExMVk0gcHJlZml4IHRoYXQgaXMgdXNlZCB0byBpbmZvcm0gdGhlIGFzbSAKKy8vLyBwcmludGVyIHRvIG5vdCBlbWl0IHVzdWFsIHN5bWJvbCBwcmVmaXggYmVmb3JlIHRoZSBzeW1ib2wgbmFtZSBpcyB1c2VkIHRoZW4KKy8vLyByZXR1cm4gbGlua2FnZSBuYW1lIGFmdGVyIHNraXBwaW5nIHRoaXMgc3BlY2lhbCBMTFZNIHByZWZpeC4KK3N0YXRpYyBTdHJpbmdSZWYgZ2V0UmVhbExpbmthZ2VOYW1lKFN0cmluZ1JlZiBMaW5rYWdlTmFtZSkgeworICBjaGFyIE9uZSA9ICdcMSc7CisgIGlmIChMaW5rYWdlTmFtZS5zdGFydHN3aXRoKFN0cmluZ1JlZigmT25lLCAxKSkpCisgICAgcmV0dXJuIExpbmthZ2VOYW1lLnN1YnN0cigxKTsKKyAgcmV0dXJuIExpbmthZ2VOYW1lOworfQorCitib29sIFN0cmlwRGVhZERlYnVnSW5mbzo6cnVuT25Nb2R1bGUoTW9kdWxlICZNKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIC8vIERlYnVnZ2luZyBpbmZvbXJhdGlvbiBpcyBlbmNvZGVkIGluIGxsdm0gSVIgdXNpbmcgbWV0YWRhdGEuIFRoaXMgaXMgZGVzaWduZWQKKyAgLy8gc3VjaCBhIHdheSB0aGF0IGRlYnVnIGluZm8gZm9yIHN5bWJvbHMgcHJlc2VydmVkIGV2ZW4gaWYgc3ltYm9scyBhcmUKKyAgLy8gb3B0aW1pemVkIGF3YXkgYnkgdGhlIG9wdGltaXplci4gVGhpcyBzcGVjaWFsIHBhc3MgcmVtb3ZlcyBkZWJ1ZyBpbmZvIGZvciAKKyAgLy8gc3VjaCBzeW1ib2xzLgorCisgIC8vIGxsdm0uZGJnLmd2IGtlZXBzIHRyYWNrIG9mIGRlYnVnIGluZm8gZm9yIGdsb2JhbCB2YXJpYWJsZXMuCisgIGlmIChOYW1lZE1ETm9kZSAqTk1EID0gTS5nZXROYW1lZE1ldGFkYXRhKCJsbHZtLmRiZy5ndiIpKSB7CisgICAgU21hbGxWZWN0b3I8TUROb2RlICosIDg+IE1EczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTk1ELT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChESUdsb2JhbFZhcmlhYmxlKE5NRC0+Z2V0T3BlcmFuZChpKSkuVmVyaWZ5KCkpCisgICAgICAgIE1Ecy5wdXNoX2JhY2soTk1ELT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgTk1ELT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBOTUQgPSBOVUxMOworCisgICAgZm9yIChTbWFsbFZlY3RvcjxNRE5vZGUgKiwgOD46Oml0ZXJhdG9yIEkgPSBNRHMuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE1Ecy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChNLmdldEdsb2JhbFZhcmlhYmxlKERJR2xvYmFsVmFyaWFibGUoKkkpLmdldEdsb2JhbCgpLT5nZXROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpIHsKKyAgICAgICAgaWYgKCFOTUQpCisgICAgICAgICAgTk1EID0gTS5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEoImxsdm0uZGJnLmd2Iik7CisgICAgICAgIE5NRC0+YWRkT3BlcmFuZCgqSSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIGxsdm0uZGJnLnNwIGtlZXBzIHRyYWNrIG9mIGRlYnVnIGluZm8gZm9yIHN1YnByb2dyYW1zLgorICBpZiAoTmFtZWRNRE5vZGUgKk5NRCA9IE0uZ2V0TmFtZWRNZXRhZGF0YSgibGx2bS5kYmcuc3AiKSkgeworICAgIFNtYWxsVmVjdG9yPE1ETm9kZSAqLCA4PiBNRHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5NRC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoRElTdWJwcm9ncmFtKE5NRC0+Z2V0T3BlcmFuZChpKSkuVmVyaWZ5KCkpCisgICAgICAgIE1Ecy5wdXNoX2JhY2soTk1ELT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgTk1ELT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBOTUQgPSBOVUxMOworCisgICAgZm9yIChTbWFsbFZlY3RvcjxNRE5vZGUgKiwgOD46Oml0ZXJhdG9yIEkgPSBNRHMuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE1Ecy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGJvb2wgRm5Jc0xpdmUgPSBmYWxzZTsKKyAgICAgIGlmIChGdW5jdGlvbiAqRiA9IERJU3VicHJvZ3JhbSgqSSkuZ2V0RnVuY3Rpb24oKSkKKyAgICAgICAgaWYgKE0uZ2V0RnVuY3Rpb24oRi0+Z2V0TmFtZSgpKSkKKyAgICAgICAgICBGbklzTGl2ZSA9IHRydWU7CisgICAgICBpZiAoRm5Jc0xpdmUpIHsKKyAgICAgICAgICBpZiAoIU5NRCkKKyAgICAgICAgICAgIE5NRCA9IE0uZ2V0T3JJbnNlcnROYW1lZE1ldGFkYXRhKCJsbHZtLmRiZy5zcCIpOworICAgICAgICAgIE5NRC0+YWRkT3BlcmFuZCgqSSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBSZW1vdmUgbGx2bS5kYmcubHYuZm5uYW1lIG5hbWVkIG1kbm9kZSB3aGljaCBtYXkgaGF2ZSBiZWVuIHVzZWQKKyAgICAgICAgLy8gdG8gaG9sZCBkZWJ1ZyBpbmZvIGZvciBkZWFkIGZ1bmN0aW9uJ3MgbG9jYWwgdmFyaWFibGVzLgorICAgICAgICBTdHJpbmdSZWYgRk5hbWUgPSBESVN1YnByb2dyYW0oKkkpLmdldExpbmthZ2VOYW1lKCk7CisgICAgICAgIGlmIChGTmFtZS5lbXB0eSgpKQorICAgICAgICAgIEZOYW1lID0gRElTdWJwcm9ncmFtKCpJKS5nZXROYW1lKCk7CisgICAgICAgIGlmIChOYW1lZE1ETm9kZSAqTFZOTUQgPSAKKyAgICAgICAgICAgIE0uZ2V0TmFtZWRNZXRhZGF0YShUd2luZSgibGx2bS5kYmcubHYuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVhbExpbmthZ2VOYW1lKEZOYW1lKSkpKSAKKyAgICAgICAgICBMVk5NRC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vU3RydWN0UmV0UHJvbW90aW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0lQTy9TdHJ1Y3RSZXRQcm9tb3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDcwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JUE8vU3RydWN0UmV0UHJvbW90aW9uLmNwcApAQCAtMCwwICsxLDM2NCBAQAorLy89PT0tLSBTdHJ1Y3RSZXRQcm9tb3Rpb24uY3BwIC0gUHJvbW90ZSBzcmV0IGFyZ3VtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBmaW5kcyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYSBzdHJ1Y3QgKHVzaW5nIGEgcG9pbnRlciB0byB0aGUgc3RydWN0CisvLyBhcyB0aGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGZ1bmN0aW9uLCBtYXJrZWQgd2l0aCB0aGUgJ3NyZXQnIGF0dHJpYnV0ZSkgYW5kCisvLyByZXBsYWNlcyB0aGVtIHdpdGggYSBuZXcgZnVuY3Rpb24gdGhhdCBzaW1wbHkgcmV0dXJucyBlYWNoIG9mIHRoZSBlbGVtZW50cyBvZgorLy8gdGhhdCBzdHJ1Y3QgKHVzaW5nIG11bHRpcGxlIHJldHVybiB2YWx1ZXMpLgorLy8KKy8vIFRoaXMgcGFzcyB3b3JrcyB1bmRlciBhIG51bWJlciBvZiBjb25kaXRpb25zOgorLy8gIDEuIFRoZSByZXR1cm5lZCBzdHJ1Y3QgbXVzdCBub3QgY29udGFpbiBvdGhlciBzdHJ1Y3RzCisvLyAgMi4gVGhlIHJldHVybmVkIHN0cnVjdCBtdXN0IG9ubHkgYmUgdXNlZCB0byBsb2FkIHZhbHVlcyBmcm9tCisvLyAgMy4gVGhlIHBsYWNlaG9sZGVyIHN0cnVjdCBwYXNzZWQgaW4gaXMgdGhlIHJlc3VsdCBvZiBhbiBhbGxvY2EKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInNyZXRwcm9tb3Rpb24iCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0NhbGxHcmFwaFNDQ1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bVJlamVjdGVkU1JFVFVzZXMgLCAiTnVtYmVyIG9mIHNyZXQgcmVqZWN0ZWQgZHVlIHRvIHVuZXhwZWN0ZWQgdXNlcyIpOworU1RBVElTVElDKE51bVNSRVQgLCAiTnVtYmVyIG9mIHNyZXQgcHJvbW90ZWQiKTsKK25hbWVzcGFjZSB7CisgIC8vLyBTUkVUUHJvbW90aW9uIC0gVGhpcyBwYXNzIHJlbW92ZXMgc3JldCBwYXJhbWV0ZXIgYW5kIHVwZGF0ZXMKKyAgLy8vIGZ1bmN0aW9uIHRvIHVzZSBtdWx0aXBsZSByZXR1cm4gdmFsdWUuCisgIC8vLworICBzdHJ1Y3QgU1JFVFByb21vdGlvbiA6IHB1YmxpYyBDYWxsR3JhcGhTQ0NQYXNzIHsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQ2FsbEdyYXBoU0NDUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uU0NDKENhbGxHcmFwaFNDQyAmU0NDKTsKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIFNSRVRQcm9tb3Rpb24oKSA6IENhbGxHcmFwaFNDQ1Bhc3MoSUQpIHt9CisKKyAgcHJpdmF0ZToKKyAgICBDYWxsR3JhcGhOb2RlICpQcm9tb3RlUmV0dXJuKENhbGxHcmFwaE5vZGUgKkNHTik7CisgICAgYm9vbCBpc1NhZmVUb1VwZGF0ZUFsbENhbGxlcnMoRnVuY3Rpb24gKkYpOworICAgIEZ1bmN0aW9uICpjbG9uZUZ1bmN0aW9uQm9keShGdW5jdGlvbiAqRiwgY29uc3QgU3RydWN0VHlwZSAqU1R5KTsKKyAgICBDYWxsR3JhcGhOb2RlICp1cGRhdGVDYWxsU2l0ZXMoRnVuY3Rpb24gKkYsIEZ1bmN0aW9uICpORik7CisgICAgYm9vbCBuZXN0ZWRTdHJ1Y3RUeXBlKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSk7CisgIH07Cit9CisKK2NoYXIgU1JFVFByb21vdGlvbjo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKFNSRVRQcm9tb3Rpb24sICJzcmV0cHJvbW90aW9uIiwKKyAgICAgICAgICAgICAgICAiUHJvbW90ZSBzcmV0IGFyZ3VtZW50cyB0byBtdWx0aXBsZSByZXQgdmFsdWVzIiwgZmFsc2UsIGZhbHNlKTsKKworUGFzcyAqbGx2bTo6Y3JlYXRlU3RydWN0UmV0UHJvbW90aW9uUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBTUkVUUHJvbW90aW9uKCk7Cit9CisKK2Jvb2wgU1JFVFByb21vdGlvbjo6cnVuT25TQ0MoQ2FsbEdyYXBoU0NDICZTQ0MpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgZm9yIChDYWxsR3JhcGhTQ0M6Oml0ZXJhdG9yIEkgPSBTQ0MuYmVnaW4oKSwgRSA9IFNDQy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKENhbGxHcmFwaE5vZGUgKk5ld05vZGUgPSBQcm9tb3RlUmV0dXJuKCpJKSkgeworICAgICAgU0NDLlJlcGxhY2VOb2RlKCpJLCBOZXdOb2RlKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIFByb21vdGVSZXR1cm4gLSBUaGlzIG1ldGhvZCBwcm9tb3RlcyBmdW5jdGlvbiB0aGF0IHVzZXMgU3RydWN0UmV0IHBhcmFtYXRlciAKKy8vLyBpbnRvIGEgZnVuY3Rpb24gdGhhdCB1c2VzIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCitDYWxsR3JhcGhOb2RlICpTUkVUUHJvbW90aW9uOjpQcm9tb3RlUmV0dXJuKENhbGxHcmFwaE5vZGUgKkNHTikgeworICBGdW5jdGlvbiAqRiA9IENHTi0+Z2V0RnVuY3Rpb24oKTsKKworICBpZiAoIUYgfHwgRi0+aXNEZWNsYXJhdGlvbigpIHx8ICFGLT5oYXNMb2NhbExpbmthZ2UoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBNYWtlIHN1cmUgdGhhdCBmdW5jdGlvbiByZXR1cm5zIHN0cnVjdC4KKyAgaWYgKEYtPmFyZ19zaXplKCkgPT0gMCB8fCAhRi0+aGFzU3RydWN0UmV0QXR0cigpIHx8IEYtPmRvZXNOb3RSZXR1cm4oKSkKKyAgICByZXR1cm4gMDsKKworICBERUJVRyhkYmdzKCkgPDwgIlNyZXRQcm9tb3Rpb246IExvb2tpbmcgYXQgc3JldCBmdW5jdGlvbiAiIAorICAgICAgICA8PCBGLT5nZXROYW1lKCkgPDwgIlxuIik7CisKKyAgYXNzZXJ0KEYtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHkoKSAmJiAiSW52YWxpZCBmdW5jdGlvbiByZXR1cm4gdHlwZSIpOworICBGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEFJID0gRi0+YXJnX2JlZ2luKCk7CisgIGNvbnN0IGxsdm06OlBvaW50ZXJUeXBlICpGQXJnVHlwZSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihBSS0+Z2V0VHlwZSgpKTsKKyAgYXNzZXJ0KEZBcmdUeXBlICYmICJJbnZhbGlkIHNyZXQgcGFyYW1ldGVyIHR5cGUiKTsKKyAgY29uc3QgbGx2bTo6U3RydWN0VHlwZSAqU1R5ID0gCisgICAgZHluX2Nhc3Q8U3RydWN0VHlwZT4oRkFyZ1R5cGUtPmdldEVsZW1lbnRUeXBlKCkpOworICBhc3NlcnQoU1R5ICYmICJJbnZhbGlkIHNyZXQgcGFyYW1ldGVyIGVsZW1lbnQgdHlwZSIpOworCisgIC8vIENoZWNrIGlmIGl0IGlzIG9rIHRvIHBlcmZvcm0gdGhpcyBwcm9tb3Rpb24uCisgIGlmIChpc1NhZmVUb1VwZGF0ZUFsbENhbGxlcnMoRikgPT0gZmFsc2UpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlNyZXRQcm9tb3Rpb246IE5vdCBhbGwgY2FsbGVycyBjYW4gYmUgdXBkYXRlZFxuIik7CisgICAgKytOdW1SZWplY3RlZFNSRVRVc2VzOworICAgIHJldHVybiAwOworICB9CisKKyAgREVCVUcoZGJncygpIDw8ICJTcmV0UHJvbW90aW9uOiBzcmV0IGFyZ3VtZW50IHdpbGwgYmUgcHJvbW90ZWRcbiIpOworICArK051bVNSRVQ7CisgIC8vIFsxXSBSZXBsYWNlIHVzZSBvZiBzcmV0IHBhcmFtZXRlciAKKyAgQWxsb2NhSW5zdCAqVGhlQWxsb2NhID0gbmV3IEFsbG9jYUluc3QoU1R5LCBOVUxMLCAibXJ2IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYtPmdldEVudHJ5QmxvY2soKS5iZWdpbigpKTsKKyAgVmFsdWUgKk5GaXJzdEFyZyA9IEYtPmFyZ19iZWdpbigpOworICBORmlyc3RBcmctPnJlcGxhY2VBbGxVc2VzV2l0aChUaGVBbGxvY2EpOworCisgIC8vIFsyXSBGaW5kIGFuZCByZXBsYWNlIHJldCBpbnN0cnVjdGlvbnMKKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgRkkgPSBGLT5iZWdpbigpLCBGRSA9IEYtPmVuZCgpOyAgRkkgIT0gRkU7ICsrRkkpIAorICAgIGZvcihCYXNpY0Jsb2NrOjppdGVyYXRvciBCSSA9IEZJLT5iZWdpbigpLCBCRSA9IEZJLT5lbmQoKTsgQkkgIT0gQkU7ICkgeworICAgICAgSW5zdHJ1Y3Rpb24gKkkgPSBCSTsKKyAgICAgICsrQkk7CisgICAgICBpZiAoaXNhPFJldHVybkluc3Q+KEkpKSB7CisgICAgICAgIFZhbHVlICpOViA9IG5ldyBMb2FkSW5zdChUaGVBbGxvY2EsICJtcnYubGQiLCBJKTsKKyAgICAgICAgUmV0dXJuSW5zdCAqTlIgPSBSZXR1cm5JbnN0OjpDcmVhdGUoRi0+Z2V0Q29udGV4dCgpLCBOViwgSSk7CisgICAgICAgIEktPnJlcGxhY2VBbGxVc2VzV2l0aChOUik7CisgICAgICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgfQorICAgIH0KKworICAvLyBbM10gQ3JlYXRlIHRoZSBuZXcgZnVuY3Rpb24gYm9keSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIG1vZHVsZS4KKyAgRnVuY3Rpb24gKk5GID0gY2xvbmVGdW5jdGlvbkJvZHkoRiwgU1R5KTsKKworICAvLyBbNF0gVXBkYXRlIGFsbCBjYWxsIHNpdGVzIHRvIHVzZSBuZXcgZnVuY3Rpb24KKyAgQ2FsbEdyYXBoTm9kZSAqTkZfQ0ZOID0gdXBkYXRlQ2FsbFNpdGVzKEYsIE5GKTsKKworICBDYWxsR3JhcGggJkNHID0gZ2V0QW5hbHlzaXM8Q2FsbEdyYXBoPigpOworICBORl9DRk4tPnN0ZWFsQ2FsbGVkRnVuY3Rpb25zRnJvbShDR1tGXSk7CisKKyAgZGVsZXRlIENHLnJlbW92ZUZ1bmN0aW9uRnJvbU1vZHVsZShGKTsKKyAgcmV0dXJuIE5GX0NGTjsKK30KKworLy8gQ2hlY2sgaWYgaXQgaXMgb2sgdG8gcGVyZm9ybSB0aGlzIHByb21vdGlvbi4KK2Jvb2wgU1JFVFByb21vdGlvbjo6aXNTYWZlVG9VcGRhdGVBbGxDYWxsZXJzKEZ1bmN0aW9uICpGKSB7CisKKyAgaWYgKEYtPnVzZV9lbXB0eSgpKQorICAgIC8vIE5vIHVzZXJzLiBPSyB0byBtb2RpZnkgc2lnbmF0dXJlLgorICAgIHJldHVybiB0cnVlOworCisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBGblVzZUkgPSBGLT51c2VfYmVnaW4oKSwgRm5Vc2VFID0gRi0+dXNlX2VuZCgpOworICAgICAgIEZuVXNlSSAhPSBGblVzZUU7ICsrRm5Vc2VJKSB7CisgICAgLy8gVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCB0byAocG9zc2libHkpIGFub3RoZXIgZnVuY3Rpb24sCisgICAgLy8gd2UgY2FuJ3QgY2hhbmdlIGl0IQorICAgIENhbGxTaXRlIENTKCpGblVzZUkpOworICAgIEluc3RydWN0aW9uICpDYWxsID0gQ1MuZ2V0SW5zdHJ1Y3Rpb24oKTsKKyAgICAvLyBUaGUgZnVuY3Rpb24gaXMgdXNlZCBieSBzb21ldGhpbmcgZWxzZSB0aGFuIGEgY2FsbCBvciBpbnZva2UgaW5zdHJ1Y3Rpb24sCisgICAgLy8gd2UgY2FuJ3QgY2hhbmdlIGl0IQorICAgIGlmICghQ2FsbCB8fCAhQ1MuaXNDYWxsZWUoRm5Vc2VJKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBDYWxsU2l0ZTo6YXJnX2l0ZXJhdG9yIEFJID0gQ1MuYXJnX2JlZ2luKCk7CisgICAgVmFsdWUgKkZpcnN0QXJnID0gKkFJOworCisgICAgaWYgKCFpc2E8QWxsb2NhSW5zdD4oRmlyc3RBcmcpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQ2hlY2sgRmlyc3RBcmcncyB1c2Vycy4KKyAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgQXJnSSA9IEZpcnN0QXJnLT51c2VfYmVnaW4oKSwgCisgICAgICAgICAgIEFyZ0UgPSBGaXJzdEFyZy0+dXNlX2VuZCgpOyBBcmdJICE9IEFyZ0U7ICsrQXJnSSkgeworICAgICAgVXNlciAqVSA9ICpBcmdJOworICAgICAgLy8gSWYgRmlyc3RBcmcgdXNlciBpcyBhIENhbGxJbnN0IHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBjdXJyZW50CisgICAgICAvLyBjYWxsIHNpdGUgdGhlbiB0aGlzIGZ1bmN0aW9uIEYgaXMgbm90IHN1aXRhYmxlIGZvciBzcmV0IHByb21vdGlvbi4KKyAgICAgIGlmIChDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oVSkpIHsKKyAgICAgICAgaWYgKENJICE9IENhbGwpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gSWYgRmlyc3RBcmcgdXNlciBpcyBhIEdFUCB3aG9zZSBhbGwgdXNlcnMgYXJlIG5vdCBMb2FkSW5zdCB0aGVuCisgICAgICAvLyB0aGlzIGZ1bmN0aW9uIEYgaXMgbm90IHN1aXRhYmxlIGZvciBzcmV0IHByb21vdGlvbi4KKyAgICAgIGVsc2UgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVSkpIHsKKyAgICAgICAgLy8gVE9ETyA6IFVzZSBkb20gaW5mbyBhbmQgaW5zZXJ0IFBISU5vZGVzIHRvIGNvbGxlY3QgZ2V0IHJlc3VsdHMKKyAgICAgICAgLy8gZnJvbSBtdWx0aXBsZSBjYWxsIHNpdGVzIGZvciB0aGlzIEdFUC4KKyAgICAgICAgaWYgKEdFUC0+Z2V0UGFyZW50KCkgIT0gQ2FsbC0+Z2V0UGFyZW50KCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgR0VQSSA9IEdFUC0+dXNlX2JlZ2luKCksIEdFUEUgPSBHRVAtPnVzZV9lbmQoKTsKKyAgICAgICAgICAgICBHRVBJICE9IEdFUEU7ICsrR0VQSSkgCisgICAgICAgICAgaWYgKCFpc2E8TG9hZEluc3Q+KCpHRVBJKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gCisgICAgICAvLyBBbnkgb3RoZXIgRmlyc3RBcmcgdXNlcnMgbWFrZSB0aGlzIGZ1bmN0aW9uIHVuc3VpdGFibGUgZm9yIHNyZXQgCisgICAgICAvLyBwcm9tb3Rpb24uCisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGNsb25lRnVuY3Rpb25Cb2R5IC0gQ3JlYXRlIGEgbmV3IGZ1bmN0aW9uIGJhc2VkIG9uIEYgYW5kCisvLy8gaW5zZXJ0IGl0IGludG8gbW9kdWxlLiBSZW1vdmUgZmlyc3QgYXJndW1lbnQuIFVzZSBTVHkgYXMKKy8vLyB0aGUgcmV0dXJuIHR5cGUgZm9yIG5ldyBmdW5jdGlvbi4KK0Z1bmN0aW9uICpTUkVUUHJvbW90aW9uOjpjbG9uZUZ1bmN0aW9uQm9keShGdW5jdGlvbiAqRiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RydWN0VHlwZSAqU1R5KSB7CisKKyAgY29uc3QgRnVuY3Rpb25UeXBlICpGVHkgPSBGLT5nZXRGdW5jdGlvblR5cGUoKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IFBhcmFtczsKKworICAvLyBBdHRyaWJ1dGVzIC0gS2VlcCB0cmFjayBvZiB0aGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgZm9yIHRoZSBhcmd1bWVudHMuCisgIFNtYWxsVmVjdG9yPEF0dHJpYnV0ZVdpdGhJbmRleCwgOD4gQXR0cmlidXRlc1ZlYzsKKyAgY29uc3QgQXR0ckxpc3RQdHIgJlBBTCA9IEYtPmdldEF0dHJpYnV0ZXMoKTsKKworICAvLyBBZGQgYW55IHJldHVybiBhdHRyaWJ1dGVzLgorICBpZiAoQXR0cmlidXRlcyBhdHRycyA9IFBBTC5nZXRSZXRBdHRyaWJ1dGVzKCkpCisgICAgQXR0cmlidXRlc1ZlYy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoMCwgYXR0cnMpKTsKKworICAvLyBTa2lwIGZpcnN0IGFyZ3VtZW50LgorICBGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEkgPSBGLT5hcmdfYmVnaW4oKSwgRSA9IEYtPmFyZ19lbmQoKTsKKyAgKytJOworICAvLyAwdGggcGFyYW1ldGVyIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBmb3IgcmV0dXJuIHR5cGUuCisgIC8vIDF0aCBwYXJhbWV0ZXIgYXR0cmlidXRlIGlzIGZvciBmaXJzdCAxc3Qgc3JldCBhcmd1bWVudC4KKyAgdW5zaWduZWQgUGFyYW1JbmRleCA9IDI7IAorICB3aGlsZSAoSSAhPSBFKSB7CisgICAgUGFyYW1zLnB1c2hfYmFjayhJLT5nZXRUeXBlKCkpOworICAgIGlmIChBdHRyaWJ1dGVzIEF0dHJzID0gUEFMLmdldFBhcmFtQXR0cmlidXRlcyhQYXJhbUluZGV4KSkKKyAgICAgIEF0dHJpYnV0ZXNWZWMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KFBhcmFtSW5kZXggLSAxLCBBdHRycykpOworICAgICsrSTsKKyAgICArK1BhcmFtSW5kZXg7CisgIH0KKworICAvLyBBZGQgYW55IGZuIGF0dHJpYnV0ZXMuCisgIGlmIChBdHRyaWJ1dGVzIGF0dHJzID0gUEFMLmdldEZuQXR0cmlidXRlcygpKQorICAgIEF0dHJpYnV0ZXNWZWMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KH4wLCBhdHRycykpOworCisKKyAgRnVuY3Rpb25UeXBlICpORlR5ID0gRnVuY3Rpb25UeXBlOjpnZXQoU1R5LCBQYXJhbXMsIEZUeS0+aXNWYXJBcmcoKSk7CisgIEZ1bmN0aW9uICpORiA9IEZ1bmN0aW9uOjpDcmVhdGUoTkZUeSwgRi0+Z2V0TGlua2FnZSgpKTsKKyAgTkYtPnRha2VOYW1lKEYpOworICBORi0+Y29weUF0dHJpYnV0ZXNGcm9tKEYpOworICBORi0+c2V0QXR0cmlidXRlcyhBdHRyTGlzdFB0cjo6Z2V0KEF0dHJpYnV0ZXNWZWMuYmVnaW4oKSwgQXR0cmlidXRlc1ZlYy5lbmQoKSkpOworICBGLT5nZXRQYXJlbnQoKS0+Z2V0RnVuY3Rpb25MaXN0KCkuaW5zZXJ0KEYsIE5GKTsKKyAgTkYtPmdldEJhc2ljQmxvY2tMaXN0KCkuc3BsaWNlKE5GLT5iZWdpbigpLCBGLT5nZXRCYXNpY0Jsb2NrTGlzdCgpKTsKKworICAvLyBSZXBsYWNlIGFyZ3VtZW50cworICBJID0gRi0+YXJnX2JlZ2luKCk7CisgIEUgPSBGLT5hcmdfZW5kKCk7CisgIEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgTkkgPSBORi0+YXJnX2JlZ2luKCk7CisgICsrSTsKKyAgd2hpbGUgKEkgIT0gRSkgeworICAgIEktPnJlcGxhY2VBbGxVc2VzV2l0aChOSSk7CisgICAgTkktPnRha2VOYW1lKEkpOworICAgICsrSTsKKyAgICArK05JOworICB9CisKKyAgcmV0dXJuIE5GOworfQorCisvLy8gdXBkYXRlQ2FsbFNpdGVzIC0gVXBkYXRlIGFsbCBzaXRlcyB0aGF0IGNhbGwgRiB0byB1c2UgTkYuCitDYWxsR3JhcGhOb2RlICpTUkVUUHJvbW90aW9uOjp1cGRhdGVDYWxsU2l0ZXMoRnVuY3Rpb24gKkYsIEZ1bmN0aW9uICpORikgeworICBDYWxsR3JhcGggJkNHID0gZ2V0QW5hbHlzaXM8Q2FsbEdyYXBoPigpOworICBTbWFsbFZlY3RvcjxWYWx1ZSosIDE2PiBBcmdzOworCisgIC8vIEF0dHJpYnV0ZXMgLSBLZWVwIHRyYWNrIG9mIHRoZSBwYXJhbWV0ZXIgYXR0cmlidXRlcyBmb3IgdGhlIGFyZ3VtZW50cy4KKyAgU21hbGxWZWN0b3I8QXR0cmlidXRlV2l0aEluZGV4LCA4PiBBcmdBdHRyc1ZlYzsKKworICAvLyBHZXQgYSBuZXcgY2FsbGdyYXBoIG5vZGUgZm9yIE5GLgorICBDYWxsR3JhcGhOb2RlICpORl9DR04gPSBDRy5nZXRPckluc2VydEZ1bmN0aW9uKE5GKTsKKworICB3aGlsZSAoIUYtPnVzZV9lbXB0eSgpKSB7CisgICAgQ2FsbFNpdGUgQ1MoKkYtPnVzZV9iZWdpbigpKTsKKyAgICBJbnN0cnVjdGlvbiAqQ2FsbCA9IENTLmdldEluc3RydWN0aW9uKCk7CisKKyAgICBjb25zdCBBdHRyTGlzdFB0ciAmUEFMID0gRi0+Z2V0QXR0cmlidXRlcygpOworICAgIC8vIEFkZCBhbnkgcmV0dXJuIGF0dHJpYnV0ZXMuCisgICAgaWYgKEF0dHJpYnV0ZXMgYXR0cnMgPSBQQUwuZ2V0UmV0QXR0cmlidXRlcygpKQorICAgICAgQXJnQXR0cnNWZWMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KDAsIGF0dHJzKSk7CisKKyAgICAvLyBDb3B5IGFyZ3VtZW50cywgaG93ZXZlciBza2lwIGZpcnN0IG9uZS4KKyAgICBDYWxsU2l0ZTo6YXJnX2l0ZXJhdG9yIEFJID0gQ1MuYXJnX2JlZ2luKCksIEFFID0gQ1MuYXJnX2VuZCgpOworICAgIFZhbHVlICpGaXJzdENBcmcgPSAqQUk7CisgICAgKytBSTsKKyAgICAvLyAwdGggcGFyYW1ldGVyIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBmb3IgcmV0dXJuIHR5cGUuCisgICAgLy8gMXRoIHBhcmFtZXRlciBhdHRyaWJ1dGUgaXMgZm9yIGZpcnN0IDFzdCBzcmV0IGFyZ3VtZW50LgorICAgIHVuc2lnbmVkIFBhcmFtSW5kZXggPSAyOyAKKyAgICB3aGlsZSAoQUkgIT0gQUUpIHsKKyAgICAgIEFyZ3MucHVzaF9iYWNrKCpBSSk7IAorICAgICAgaWYgKEF0dHJpYnV0ZXMgQXR0cnMgPSBQQUwuZ2V0UGFyYW1BdHRyaWJ1dGVzKFBhcmFtSW5kZXgpKQorICAgICAgICBBcmdBdHRyc1ZlYy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoUGFyYW1JbmRleCAtIDEsIEF0dHJzKSk7CisgICAgICArK1BhcmFtSW5kZXg7CisgICAgICArK0FJOworICAgIH0KKworICAgIC8vIEFkZCBhbnkgZnVuY3Rpb24gYXR0cmlidXRlcy4KKyAgICBpZiAoQXR0cmlidXRlcyBhdHRycyA9IFBBTC5nZXRGbkF0dHJpYnV0ZXMoKSkKKyAgICAgIEFyZ0F0dHJzVmVjLnB1c2hfYmFjayhBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCh+MCwgYXR0cnMpKTsKKyAgICAKKyAgICBBdHRyTGlzdFB0ciBOZXdQQUwgPSBBdHRyTGlzdFB0cjo6Z2V0KEFyZ0F0dHJzVmVjLmJlZ2luKCksIEFyZ0F0dHJzVmVjLmVuZCgpKTsKKyAgICAKKyAgICAvLyBCdWlsZCBuZXcgY2FsbCBpbnN0cnVjdGlvbi4KKyAgICBJbnN0cnVjdGlvbiAqTmV3OworICAgIGlmIChJbnZva2VJbnN0ICpJSSA9IGR5bl9jYXN0PEludm9rZUluc3Q+KENhbGwpKSB7CisgICAgICBOZXcgPSBJbnZva2VJbnN0OjpDcmVhdGUoTkYsIElJLT5nZXROb3JtYWxEZXN0KCksIElJLT5nZXRVbndpbmREZXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLCAiIiwgQ2FsbCk7CisgICAgICBjYXN0PEludm9rZUluc3Q+KE5ldyktPnNldENhbGxpbmdDb252KENTLmdldENhbGxpbmdDb252KCkpOworICAgICAgY2FzdDxJbnZva2VJbnN0PihOZXcpLT5zZXRBdHRyaWJ1dGVzKE5ld1BBTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE5ldyA9IENhbGxJbnN0OjpDcmVhdGUoTkYsIEFyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKSwgIiIsIENhbGwpOworICAgICAgY2FzdDxDYWxsSW5zdD4oTmV3KS0+c2V0Q2FsbGluZ0NvbnYoQ1MuZ2V0Q2FsbGluZ0NvbnYoKSk7CisgICAgICBjYXN0PENhbGxJbnN0PihOZXcpLT5zZXRBdHRyaWJ1dGVzKE5ld1BBTCk7CisgICAgICBpZiAoY2FzdDxDYWxsSW5zdD4oQ2FsbCktPmlzVGFpbENhbGwoKSkKKyAgICAgICAgY2FzdDxDYWxsSW5zdD4oTmV3KS0+c2V0VGFpbENhbGwoKTsKKyAgICB9CisgICAgQXJncy5jbGVhcigpOworICAgIEFyZ0F0dHJzVmVjLmNsZWFyKCk7CisgICAgTmV3LT50YWtlTmFtZShDYWxsKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgY2FsbGdyYXBoIHRvIGtub3cgdGhhdCB0aGUgY2FsbHNpdGUgaGFzIGJlZW4gdHJhbnNmb3JtZWQuCisgICAgQ2FsbEdyYXBoTm9kZSAqQ2FsbGVlTm9kZSA9IENHW0NhbGwtPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKV07CisgICAgQ2FsbGVlTm9kZS0+cmVtb3ZlQ2FsbEVkZ2VGb3IoQ2FsbCk7CisgICAgQ2FsbGVlTm9kZS0+YWRkQ2FsbGVkRnVuY3Rpb24oTmV3LCBORl9DR04pOworICAgIAorICAgIC8vIFVwZGF0ZSBhbGwgdXNlcnMgb2Ygc3JldCBwYXJhbWV0ZXIgdG8gZXh0cmFjdCB2YWx1ZSB1c2luZyBleHRyYWN0dmFsdWUuCisgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gRmlyc3RDQXJnLT51c2VfYmVnaW4oKSwgCisgICAgICAgICAgIFVFID0gRmlyc3RDQXJnLT51c2VfZW5kKCk7IFVJICE9IFVFOyApIHsKKyAgICAgIFVzZXIgKlUyID0gKlVJKys7CisgICAgICBDYWxsSW5zdCAqQzIgPSBkeW5fY2FzdDxDYWxsSW5zdD4oVTIpOworICAgICAgaWYgKEMyICYmIChDMiA9PSBDYWxsKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIEdldEVsZW1lbnRQdHJJbnN0ICpVR0VQID0gY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVTIpOworICAgICAgQ29uc3RhbnRJbnQgKklkeCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KFVHRVAtPmdldE9wZXJhbmQoMikpOworICAgICAgVmFsdWUgKkdSID0gRXh0cmFjdFZhbHVlSW5zdDo6Q3JlYXRlKE5ldywgSWR4LT5nZXRaRXh0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZpIiwgVUdFUCk7CisgICAgICB3aGlsZSghVUdFUC0+dXNlX2VtcHR5KCkpIHsKKyAgICAgICAgLy8gaXNTYWZlVG9VcGRhdGVBbGxDYWxsZXJzIGhhcyBjaGVja2VkIHRoYXQgYWxsIEdFUCB1c2VzIGFyZQorICAgICAgICAvLyBMb2FkSW5zdHMKKyAgICAgICAgTG9hZEluc3QgKkwgPSBjYXN0PExvYWRJbnN0PigqVUdFUC0+dXNlX2JlZ2luKCkpOworICAgICAgICBMLT5yZXBsYWNlQWxsVXNlc1dpdGgoR1IpOworICAgICAgICBMLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIH0KKyAgICAgIFVHRVAtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIENhbGwtPmVyYXNlRnJvbVBhcmVudCgpOworICB9CisgIAorICByZXR1cm4gTkZfQ0dOOworfQorCisvLy8gbmVzdGVkU3RydWN0VHlwZSAtIFJldHVybiB0cnVlIGlmIFNUeSBpbmNsdWRlcyBhbnkKKy8vLyBvdGhlciBhZ2dyZWdhdGUgdHlwZXMKK2Jvb2wgU1JFVFByb21vdGlvbjo6bmVzdGVkU3RydWN0VHlwZShjb25zdCBTdHJ1Y3RUeXBlICpTVHkpIHsKKyAgdW5zaWduZWQgTnVtID0gU1R5LT5nZXROdW1FbGVtZW50cygpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtOyBpKyspIHsKKyAgICBjb25zdCBUeXBlICpUeSA9IFNUeS0+Z2V0RWxlbWVudFR5cGUoaSk7CisgICAgaWYgKCFUeS0+aXNTaW5nbGVWYWx1ZVR5cGUoKSAmJiAhVHktPmlzVm9pZFR5KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMWZmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE3IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1JbnN0Q29tYmluZQorICBJbnN0cnVjdGlvbkNvbWJpbmluZy5jcHAKKyAgSW5zdENvbWJpbmVBZGRTdWIuY3BwCisgIEluc3RDb21iaW5lQW5kT3JYb3IuY3BwCisgIEluc3RDb21iaW5lQ2FsbHMuY3BwCisgIEluc3RDb21iaW5lQ2FzdHMuY3BwCisgIEluc3RDb21iaW5lQ29tcGFyZXMuY3BwCisgIEluc3RDb21iaW5lTG9hZFN0b3JlQWxsb2NhLmNwcAorICBJbnN0Q29tYmluZU11bERpdlJlbS5jcHAKKyAgSW5zdENvbWJpbmVQSEkuY3BwCisgIEluc3RDb21iaW5lU2VsZWN0LmNwcAorICBJbnN0Q29tYmluZVNoaWZ0cy5jcHAgCisgIEluc3RDb21iaW5lU2ltcGxpZnlEZW1hbmRlZC5jcHAKKyAgSW5zdENvbWJpbmVWZWN0b3JPcHMuY3BwCisgICkKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChMTFZNSW5zdENvbWJpbmUgTExWTVRyYW5zZm9ybVV0aWxzKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmUuaCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MDI0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lLmgKQEAgLTAsMCArMSwzNDcgQEAKKy8vPT09LSBJbnN0Q29tYmluZS5oIC0gTWFpbiBJbnN0Q29tYmluZSBwYXNzIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgSU5TVENPTUJJTkVfSU5TVENPTUJJTkVfSAorI2RlZmluZSBJTlNUQ09NQklORV9JTlNUQ09NQklORV9ICisKKyNpbmNsdWRlICJJbnN0Q29tYmluZVdvcmtsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9WYWx1ZVRyYWNraW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0lSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9JbnN0VmlzaXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UYXJnZXRGb2xkZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBDYWxsU2l0ZTsKKyAgY2xhc3MgVGFyZ2V0RGF0YTsKKyAgY2xhc3MgTWVtSW50cmluc2ljOworICBjbGFzcyBNZW1TZXRJbnN0OworICAKKy8vLyBTZWxlY3RQYXR0ZXJuRmxhdm9yIC0gV2UgY2FuIG1hdGNoIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgcGF0dGVybnMgZm9yCisvLy8gc2VsZWN0IG9wZXJhdGlvbnMuCitlbnVtIFNlbGVjdFBhdHRlcm5GbGF2b3IgeworICBTUEZfVU5LTk9XTiA9IDAsCisgIFNQRl9TTUlOLCBTUEZfVU1JTiwKKyAgU1BGX1NNQVgsIFNQRl9VTUFYCisgIC8vU1BGX0FCUyAtIFRPRE8uCit9OworICAKKy8vLyBnZXRDb21wbGV4aXR5OiAgQXNzaWduIGEgY29tcGxleGl0eSBvciByYW5rIHZhbHVlIHRvIExMVk0gVmFsdWVzLi4uCisvLy8gICAwIC0+IHVuZGVmLCAxIC0+IENvbnN0LCAyIC0+IE90aGVyLCAzIC0+IEFyZywgMyAtPiBVbmFyeSwgNCAtPiBPdGhlckluc3QKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0Q29tcGxleGl0eShWYWx1ZSAqVikgeworICBpZiAoaXNhPEluc3RydWN0aW9uPihWKSkgeworICAgIGlmIChCaW5hcnlPcGVyYXRvcjo6aXNOZWcoVikgfHwKKyAgICAgICAgQmluYXJ5T3BlcmF0b3I6OmlzRk5lZyhWKSB8fAorICAgICAgICBCaW5hcnlPcGVyYXRvcjo6aXNOb3QoVikpCisgICAgICByZXR1cm4gMzsKKyAgICByZXR1cm4gNDsKKyAgfQorICBpZiAoaXNhPEFyZ3VtZW50PihWKSkgcmV0dXJuIDM7CisgIHJldHVybiBpc2E8Q29uc3RhbnQ+KFYpID8gKGlzYTxVbmRlZlZhbHVlPihWKSA/IDAgOiAxKSA6IDI7Cit9CisKKyAgCisvLy8gSW5zdENvbWJpbmVJUkluc2VydGVyIC0gVGhpcyBpcyBhbiBJUkJ1aWxkZXIgaW5zZXJ0aW9uIGhlbHBlciB0aGF0IHdvcmtzCisvLy8ganVzdCBsaWtlIHRoZSBub3JtYWwgaW5zZXJ0aW9uIGhlbHBlciwgYnV0IGFsc28gYWRkcyBhbnkgbmV3IGluc3RydWN0aW9ucworLy8vIHRvIHRoZSBpbnN0Y29tYmluZSB3b3JrbGlzdC4KK2NsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIEluc3RDb21iaW5lSVJJbnNlcnRlciAKKyAgICA6IHB1YmxpYyBJUkJ1aWxkZXJEZWZhdWx0SW5zZXJ0ZXIgeworICBJbnN0Q29tYmluZVdvcmtsaXN0ICZXb3JrbGlzdDsKK3B1YmxpYzoKKyAgSW5zdENvbWJpbmVJUkluc2VydGVyKEluc3RDb21iaW5lV29ya2xpc3QgJldMKSA6IFdvcmtsaXN0KFdMKSB7fQorICAKKyAgdm9pZCBJbnNlcnRIZWxwZXIoSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdCkgY29uc3QgeworICAgIElSQnVpbGRlckRlZmF1bHRJbnNlcnRlcjo6SW5zZXJ0SGVscGVyKEksIEJCLCBJbnNlcnRQdCk7CisgICAgV29ya2xpc3QuQWRkKEkpOworICB9Cit9OworICAKKy8vLyBJbnN0Q29tYmluZXIgLSBUaGUgLWluc3Rjb21iaW5lIHBhc3MuCitjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBJbnN0Q29tYmluZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwdWJsaWMgRnVuY3Rpb25QYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJbnN0VmlzaXRvcjxJbnN0Q29tYmluZXIsIEluc3RydWN0aW9uKj4geworICBUYXJnZXREYXRhICpURDsKKyAgYm9vbCBNdXN0UHJlc2VydmVMQ1NTQTsKKyAgYm9vbCBNYWRlSVJDaGFuZ2U7CitwdWJsaWM6CisgIC8vLyBXb3JrbGlzdCAtIEFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHRoYXQgbmVlZCB0byBiZSBzaW1wbGlmaWVkLgorICBJbnN0Q29tYmluZVdvcmtsaXN0IFdvcmtsaXN0OworCisgIC8vLyBCdWlsZGVyIC0gVGhpcyBpcyBhbiBJUkJ1aWxkZXIgdGhhdCBhdXRvbWF0aWNhbGx5IGluc2VydHMgbmV3CisgIC8vLyBpbnN0cnVjdGlvbnMgaW50byB0aGUgd29ya2xpc3Qgd2hlbiB0aGV5IGFyZSBjcmVhdGVkLgorICB0eXBlZGVmIElSQnVpbGRlcjxUYXJnZXRGb2xkZXIsIEluc3RDb21iaW5lSVJJbnNlcnRlcj4gQnVpbGRlclR5OworICBCdWlsZGVyVHkgKkJ1aWxkZXI7CisgICAgICAKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgSW5zdENvbWJpbmVyKCkgOiBGdW5jdGlvblBhc3MoSUQpLCBURCgwKSwgQnVpbGRlcigwKSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKyAgCisgIGJvb2wgRG9PbmVJdGVyYXRpb24oRnVuY3Rpb24gJkYsIHVuc2lnbmVkIEl0TnVtKTsKKworICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgVGFyZ2V0RGF0YSAqZ2V0VGFyZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIFREOyB9CisKKyAgLy8gVmlzaXRhdGlvbiBpbXBsZW1lbnRhdGlvbiAtIEltcGxlbWVudCBpbnN0cnVjdGlvbiBjb21iaW5pbmcgZm9yIGRpZmZlcmVudAorICAvLyBpbnN0cnVjdGlvbiB0eXBlcy4gIFRoZSBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3M6CisgIC8vIFJldHVybiBWYWx1ZToKKyAgLy8gICAgbnVsbCAgICAgICAgLSBObyBjaGFuZ2Ugd2FzIG1hZGUKKyAgLy8gICAgIEkgICAgICAgICAgLSBDaGFuZ2Ugd2FzIG1hZGUsIEkgaXMgc3RpbGwgdmFsaWQsIEkgbWF5IGJlIGRlYWQgdGhvdWdoCisgIC8vICAgb3RoZXJ3aXNlICAgIC0gQ2hhbmdlIHdhcyBtYWRlLCByZXBsYWNlIEkgd2l0aCByZXR1cm5lZCBpbnN0cnVjdGlvbgorICAvLworICBJbnN0cnVjdGlvbiAqdmlzaXRBZGQoQmluYXJ5T3BlcmF0b3IgJkkpOworICBJbnN0cnVjdGlvbiAqdmlzaXRGQWRkKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgVmFsdWUgKk9wdGltaXplUG9pbnRlckRpZmZlcmVuY2UoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHlwZSAqVHkpOworICBJbnN0cnVjdGlvbiAqdmlzaXRTdWIoQmluYXJ5T3BlcmF0b3IgJkkpOworICBJbnN0cnVjdGlvbiAqdmlzaXRGU3ViKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0TXVsKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0Rk11bChCaW5hcnlPcGVyYXRvciAmSSk7CisgIEluc3RydWN0aW9uICp2aXNpdFVSZW0oQmluYXJ5T3BlcmF0b3IgJkkpOworICBJbnN0cnVjdGlvbiAqdmlzaXRTUmVtKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0RlJlbShCaW5hcnlPcGVyYXRvciAmSSk7CisgIGJvb2wgU2ltcGxpZnlEaXZSZW1PZlNlbGVjdChCaW5hcnlPcGVyYXRvciAmSSk7CisgIEluc3RydWN0aW9uICpjb21tb25SZW1UcmFuc2Zvcm1zKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKmNvbW1vbklSZW1UcmFuc2Zvcm1zKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKmNvbW1vbkRpdlRyYW5zZm9ybXMoQmluYXJ5T3BlcmF0b3IgJkkpOworICBJbnN0cnVjdGlvbiAqY29tbW9uSURpdlRyYW5zZm9ybXMoQmluYXJ5T3BlcmF0b3IgJkkpOworICBJbnN0cnVjdGlvbiAqdmlzaXRVRGl2KEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0U0RpdihCaW5hcnlPcGVyYXRvciAmSSk7CisgIEluc3RydWN0aW9uICp2aXNpdEZEaXYoQmluYXJ5T3BlcmF0b3IgJkkpOworICBWYWx1ZSAqRm9sZEFuZE9mSUNtcHMoSUNtcEluc3QgKkxIUywgSUNtcEluc3QgKlJIUyk7CisgIFZhbHVlICpGb2xkQW5kT2ZGQ21wcyhGQ21wSW5zdCAqTEhTLCBGQ21wSW5zdCAqUkhTKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0QW5kKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgVmFsdWUgKkZvbGRPck9mSUNtcHMoSUNtcEluc3QgKkxIUywgSUNtcEluc3QgKlJIUyk7CisgIFZhbHVlICpGb2xkT3JPZkZDbXBzKEZDbXBJbnN0ICpMSFMsIEZDbXBJbnN0ICpSSFMpOworICBJbnN0cnVjdGlvbiAqRm9sZE9yV2l0aENvbnN0YW50cyhCaW5hcnlPcGVyYXRvciAmSSwgVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQSwgVmFsdWUgKkIsIFZhbHVlICpDKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0T3IgKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0WG9yKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0U2hsKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0QVNocihCaW5hcnlPcGVyYXRvciAmSSk7CisgIEluc3RydWN0aW9uICp2aXNpdExTaHIoQmluYXJ5T3BlcmF0b3IgJkkpOworICBJbnN0cnVjdGlvbiAqY29tbW9uU2hpZnRUcmFuc2Zvcm1zKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKkZvbGRGQ21wX0ludFRvRlBfQ3N0KEZDbXBJbnN0ICZJLCBJbnN0cnVjdGlvbiAqTEhTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFNDKTsKKyAgSW5zdHJ1Y3Rpb24gKkZvbGRDbXBMb2FkRnJvbUluZGV4ZWRHbG9iYWwoR2V0RWxlbWVudFB0ckluc3QgKkdFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFyaWFibGUgKkdWLCBDbXBJbnN0ICZJQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50ICpBbmRDc3QgPSAwKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0RkNtcEluc3QoRkNtcEluc3QgJkkpOworICBJbnN0cnVjdGlvbiAqdmlzaXRJQ21wSW5zdChJQ21wSW5zdCAmSSk7CisgIEluc3RydWN0aW9uICp2aXNpdElDbXBJbnN0V2l0aENhc3RBbmRDYXN0KElDbXBJbnN0ICZJQ0kpOworICBJbnN0cnVjdGlvbiAqdmlzaXRJQ21wSW5zdFdpdGhJbnN0QW5kSW50Q3N0KElDbXBJbnN0ICZJQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludCAqUkhTKTsKKyAgSW5zdHJ1Y3Rpb24gKkZvbGRJQ21wRGl2Q3N0KElDbXBJbnN0ICZJQ0ksIEJpbmFyeU9wZXJhdG9yICpEaXZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQgKkRpdlJIUyk7CisgIEluc3RydWN0aW9uICpGb2xkSUNtcEFkZE9wQ3N0KElDbXBJbnN0ICZJQ0ksIFZhbHVlICpYLCBDb25zdGFudEludCAqQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgVmFsdWUgKlRoZUFkZCk7CisgIEluc3RydWN0aW9uICpGb2xkR0VQSUNtcChHRVBPcGVyYXRvciAqR0VQTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBDb25kLCBJbnN0cnVjdGlvbiAmSSk7CisgIEluc3RydWN0aW9uICpGb2xkU2hpZnRCeUNvbnN0YW50KFZhbHVlICpPcDAsIENvbnN0YW50SW50ICpPcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgSW5zdHJ1Y3Rpb24gKmNvbW1vbkNhc3RUcmFuc2Zvcm1zKENhc3RJbnN0ICZDSSk7CisgIEluc3RydWN0aW9uICpjb21tb25Qb2ludGVyQ2FzdFRyYW5zZm9ybXMoQ2FzdEluc3QgJkNJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0VHJ1bmMoVHJ1bmNJbnN0ICZDSSk7CisgIEluc3RydWN0aW9uICp2aXNpdFpFeHQoWkV4dEluc3QgJkNJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0U0V4dChTRXh0SW5zdCAmQ0kpOworICBJbnN0cnVjdGlvbiAqdmlzaXRGUFRydW5jKEZQVHJ1bmNJbnN0ICZDSSk7CisgIEluc3RydWN0aW9uICp2aXNpdEZQRXh0KENhc3RJbnN0ICZDSSk7CisgIEluc3RydWN0aW9uICp2aXNpdEZQVG9VSShGUFRvVUlJbnN0ICZGSSk7CisgIEluc3RydWN0aW9uICp2aXNpdEZQVG9TSShGUFRvU0lJbnN0ICZGSSk7CisgIEluc3RydWN0aW9uICp2aXNpdFVJVG9GUChDYXN0SW5zdCAmQ0kpOworICBJbnN0cnVjdGlvbiAqdmlzaXRTSVRvRlAoQ2FzdEluc3QgJkNJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0UHRyVG9JbnQoUHRyVG9JbnRJbnN0ICZDSSk7CisgIEluc3RydWN0aW9uICp2aXNpdEludFRvUHRyKEludFRvUHRySW5zdCAmQ0kpOworICBJbnN0cnVjdGlvbiAqdmlzaXRCaXRDYXN0KEJpdENhc3RJbnN0ICZDSSk7CisgIEluc3RydWN0aW9uICpGb2xkU2VsZWN0T3BPcChTZWxlY3RJbnN0ICZTSSwgSW5zdHJ1Y3Rpb24gKlRJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkZJKTsKKyAgSW5zdHJ1Y3Rpb24gKkZvbGRTZWxlY3RJbnRvT3AoU2VsZWN0SW5zdCAmU0ksIFZhbHVlKiwgVmFsdWUqKTsKKyAgSW5zdHJ1Y3Rpb24gKkZvbGRTUEZvZlNQRihJbnN0cnVjdGlvbiAqSW5uZXIsIFNlbGVjdFBhdHRlcm5GbGF2b3IgU1BGMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQSwgVmFsdWUgKkIsIEluc3RydWN0aW9uICZPdXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RQYXR0ZXJuRmxhdm9yIFNQRjIsIFZhbHVlICpDKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0U2VsZWN0SW5zdChTZWxlY3RJbnN0ICZTSSk7CisgIEluc3RydWN0aW9uICp2aXNpdFNlbGVjdEluc3RXaXRoSUNtcChTZWxlY3RJbnN0ICZTSSwgSUNtcEluc3QgKklDSSk7CisgIEluc3RydWN0aW9uICp2aXNpdENhbGxJbnN0KENhbGxJbnN0ICZDSSk7CisKKyAgSW5zdHJ1Y3Rpb24gKlNsaWNlVXBJbGxlZ2FsSW50ZWdlclBISShQSElOb2RlICZQTik7CisgIEluc3RydWN0aW9uICp2aXNpdFBISU5vZGUoUEhJTm9kZSAmUE4pOworICBJbnN0cnVjdGlvbiAqdmlzaXRHZXRFbGVtZW50UHRySW5zdChHZXRFbGVtZW50UHRySW5zdCAmR0VQKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0QWxsb2NhSW5zdChBbGxvY2FJbnN0ICZBSSk7CisgIEluc3RydWN0aW9uICp2aXNpdExvYWRJbnN0KExvYWRJbnN0ICZMSSk7CisgIEluc3RydWN0aW9uICp2aXNpdFN0b3JlSW5zdChTdG9yZUluc3QgJlNJKTsKKyAgSW5zdHJ1Y3Rpb24gKnZpc2l0QnJhbmNoSW5zdChCcmFuY2hJbnN0ICZCSSk7CisgIEluc3RydWN0aW9uICp2aXNpdFN3aXRjaEluc3QoU3dpdGNoSW5zdCAmU0kpOworICBJbnN0cnVjdGlvbiAqdmlzaXRJbnNlcnRFbGVtZW50SW5zdChJbnNlcnRFbGVtZW50SW5zdCAmSUUpOworICBJbnN0cnVjdGlvbiAqdmlzaXRFeHRyYWN0RWxlbWVudEluc3QoRXh0cmFjdEVsZW1lbnRJbnN0ICZFSSk7CisgIEluc3RydWN0aW9uICp2aXNpdFNodWZmbGVWZWN0b3JJbnN0KFNodWZmbGVWZWN0b3JJbnN0ICZTVkkpOworICBJbnN0cnVjdGlvbiAqdmlzaXRFeHRyYWN0VmFsdWVJbnN0KEV4dHJhY3RWYWx1ZUluc3QgJkVWKTsKKworICAvLyB2aXNpdEluc3RydWN0aW9uIC0gU3BlY2lmeSB3aGF0IHRvIHJldHVybiBmb3IgdW5oYW5kbGVkIGluc3RydWN0aW9ucy4uLgorICBJbnN0cnVjdGlvbiAqdmlzaXRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAmSSkgeyByZXR1cm4gMDsgfQorCitwcml2YXRlOgorICBib29sIFNob3VsZENoYW5nZVR5cGUoY29uc3QgVHlwZSAqRnJvbSwgY29uc3QgVHlwZSAqVG8pIGNvbnN0OworICBWYWx1ZSAqZHluX2Nhc3ROZWdWYWwoVmFsdWUgKlYpIGNvbnN0OworICBWYWx1ZSAqZHluX2Nhc3RGTmVnVmFsKFZhbHVlICpWKSBjb25zdDsKKyAgY29uc3QgVHlwZSAqRmluZEVsZW1lbnRBdE9mZnNldChjb25zdCBUeXBlICpUeSwgaW50NjRfdCBPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxWYWx1ZSo+ICZOZXdJbmRpY2VzKTsKKyAgSW5zdHJ1Y3Rpb24gKkZvbGRPcEludG9TZWxlY3QoSW5zdHJ1Y3Rpb24gJk9wLCBTZWxlY3RJbnN0ICpTSSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgLy8vIFNob3VsZE9wdGltaXplQ2FzdCAtIFJldHVybiB0cnVlIGlmIHRoZSBjYXN0IGZyb20gIlYgdG8gVHkiIGFjdHVhbGx5CisgIC8vLyByZXN1bHRzIGluIGFueSBjb2RlIGJlaW5nIGdlbmVyYXRlZCBhbmQgaXMgaW50ZXJlc3RpbmcgdG8gb3B0aW1pemUgb3V0LiBJZgorICAvLy8gdGhlIGNhc3QgY2FuIGJlIGVsaW1pbmF0ZWQgYnkgc29tZSBvdGhlciBzaW1wbGUgdHJhbnNmb3JtYXRpb24sIHdlIHByZWZlcgorICAvLy8gdG8gZG8gdGhlIHNpbXBsaWZpY2F0aW9uIGZpcnN0LgorICBib29sIFNob3VsZE9wdGltaXplQ2FzdChJbnN0cnVjdGlvbjo6Q2FzdE9wcyBvcGNvZGUsY29uc3QgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KTsKKworICBJbnN0cnVjdGlvbiAqdmlzaXRDYWxsU2l0ZShDYWxsU2l0ZSBDUyk7CisgIGJvb2wgdHJhbnNmb3JtQ29uc3RFeHByQ2FzdENhbGwoQ2FsbFNpdGUgQ1MpOworICBJbnN0cnVjdGlvbiAqdHJhbnNmb3JtQ2FsbFRocm91Z2hUcmFtcG9saW5lKENhbGxTaXRlIENTKTsKKyAgSW5zdHJ1Y3Rpb24gKnRyYW5zZm9ybVpFeHRJQ21wKElDbXBJbnN0ICpJQ0ksIEluc3RydWN0aW9uICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRG9YZm9ybSA9IHRydWUpOworICBib29sIFdpbGxOb3RPdmVyZmxvd1NpZ25lZEFkZChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKTsKKworICBWYWx1ZSAqRW1pdEdFUE9mZnNldChVc2VyICpHRVApOworCitwdWJsaWM6CisgIC8vIEluc2VydE5ld0luc3RCZWZvcmUgLSBpbnNlcnQgYW4gaW5zdHJ1Y3Rpb24gTmV3IGJlZm9yZSBpbnN0cnVjdGlvbiBPbGQKKyAgLy8gaW4gdGhlIHByb2dyYW0uICBBZGQgdGhlIG5ldyBpbnN0cnVjdGlvbiB0byB0aGUgd29ya2xpc3QuCisgIC8vCisgIEluc3RydWN0aW9uICpJbnNlcnROZXdJbnN0QmVmb3JlKEluc3RydWN0aW9uICpOZXcsIEluc3RydWN0aW9uICZPbGQpIHsKKyAgICBhc3NlcnQoTmV3ICYmIE5ldy0+Z2V0UGFyZW50KCkgPT0gMCAmJgorICAgICAgICAgICAiTmV3IGluc3RydWN0aW9uIGFscmVhZHkgaW5zZXJ0ZWQgaW50byBhIGJhc2ljIGJsb2NrISIpOworICAgIEJhc2ljQmxvY2sgKkJCID0gT2xkLmdldFBhcmVudCgpOworICAgIEJCLT5nZXRJbnN0TGlzdCgpLmluc2VydCgmT2xkLCBOZXcpOyAgLy8gSW5zZXJ0IGluc3QKKyAgICBXb3JrbGlzdC5BZGQoTmV3KTsKKyAgICByZXR1cm4gTmV3OworICB9CisgICAgICAKKyAgLy8gUmVwbGFjZUluc3RVc2VzV2l0aCAtIFRoaXMgbWV0aG9kIGlzIHRvIGJlIHVzZWQgd2hlbiBhbiBpbnN0cnVjdGlvbiBpcworICAvLyBmb3VuZCB0byBiZSBkZWFkLCByZXBsYWNhYmxlIHdpdGggYW5vdGhlciBwcmVleGlzdGluZyBleHByZXNzaW9uLiAgSGVyZQorICAvLyB3ZSBhZGQgYWxsIHVzZXMgb2YgSSB0byB0aGUgd29ya2xpc3QsIHJlcGxhY2UgYWxsIHVzZXMgb2YgSSB3aXRoIHRoZSBuZXcKKyAgLy8gdmFsdWUsIHRoZW4gcmV0dXJuIEksIHNvIHRoYXQgdGhlIGluc3QgY29tYmluZXIgd2lsbCBrbm93IHRoYXQgSSB3YXMKKyAgLy8gbW9kaWZpZWQuCisgIC8vCisgIEluc3RydWN0aW9uICpSZXBsYWNlSW5zdFVzZXNXaXRoKEluc3RydWN0aW9uICZJLCBWYWx1ZSAqVikgeworICAgIFdvcmtsaXN0LkFkZFVzZXJzVG9Xb3JrTGlzdChJKTsgICAvLyBBZGQgYWxsIG1vZGlmaWVkIGluc3RycyB0byB3b3JrbGlzdC4KKyAgICAKKyAgICAvLyBJZiB3ZSBhcmUgcmVwbGFjaW5nIHRoZSBpbnN0cnVjdGlvbiB3aXRoIGl0c2VsZiwgdGhpcyBtdXN0IGJlIGluIGEKKyAgICAvLyBzZWdtZW50IG9mIHVucmVhY2hhYmxlIGNvZGUsIHNvIGp1c3QgY2xvYmJlciB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgaWYgKCZJID09IFYpIAorICAgICAgViA9IFVuZGVmVmFsdWU6OmdldChJLmdldFR5cGUoKSk7CisgICAgICAKKyAgICBJLnJlcGxhY2VBbGxVc2VzV2l0aChWKTsKKyAgICByZXR1cm4gJkk7CisgIH0KKworICAvLyBFcmFzZUluc3RGcm9tRnVuY3Rpb24gLSBXaGVuIGRlYWxpbmcgd2l0aCBhbiBpbnN0cnVjdGlvbiB0aGF0IGhhcyBzaWRlCisgIC8vIGVmZmVjdHMgb3IgcHJvZHVjZXMgYSB2b2lkIHZhbHVlLCB3ZSBjYW4ndCByZWx5IG9uIERDRSB0byBkZWxldGUgdGhlCisgIC8vIGluc3RydWN0aW9uLiAgSW5zdGVhZCwgdmlzaXQgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAvLyB0aGlzIGZ1bmN0aW9uLgorICBJbnN0cnVjdGlvbiAqRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKEluc3RydWN0aW9uICZJKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJJQzogRVJBU0UgIiA8PCBJIDw8ICdcbicpOworCisgICAgYXNzZXJ0KEkudXNlX2VtcHR5KCkgJiYgIkNhbm5vdCBlcmFzZSBpbnN0cnVjdGlvbiB0aGF0IGlzIHVzZWQhIik7CisgICAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgcmVwcm9jZXNzIGFsbCBvcGVyYW5kcyBub3cgdGhhdCB3ZSByZWR1Y2VkIHRoZWlyCisgICAgLy8gdXNlIGNvdW50cy4KKyAgICBpZiAoSS5nZXROdW1PcGVyYW5kcygpIDwgOCkgeworICAgICAgZm9yIChVc2VyOjpvcF9pdGVyYXRvciBpID0gSS5vcF9iZWdpbigpLCBlID0gSS5vcF9lbmQoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqT3AgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oKmkpKQorICAgICAgICAgIFdvcmtsaXN0LkFkZChPcCk7CisgICAgfQorICAgIFdvcmtsaXN0LlJlbW92ZSgmSSk7CisgICAgSS5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBNYWRlSVJDaGFuZ2UgPSB0cnVlOworICAgIHJldHVybiAwOyAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBGSQorICB9CisgICAgICAKKyAgdm9pZCBDb21wdXRlTWFza2VkQml0cyhWYWx1ZSAqViwgY29uc3QgQVBJbnQgJk1hc2ssIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duT25lLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6Q29tcHV0ZU1hc2tlZEJpdHMoViwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSwgVEQsIERlcHRoKTsKKyAgfQorICAKKyAgYm9vbCBNYXNrZWRWYWx1ZUlzWmVybyhWYWx1ZSAqViwgY29uc3QgQVBJbnQgJk1hc2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpNYXNrZWRWYWx1ZUlzWmVybyhWLCBNYXNrLCBURCwgRGVwdGgpOworICB9CisgIHVuc2lnbmVkIENvbXB1dGVOdW1TaWduQml0cyhWYWx1ZSAqT3AsIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpDb21wdXRlTnVtU2lnbkJpdHMoT3AsIFRELCBEZXB0aCk7CisgIH0KKworcHJpdmF0ZToKKworICAvLy8gU2ltcGxpZnlDb21tdXRhdGl2ZSAtIFRoaXMgcGVyZm9ybXMgYSBmZXcgc2ltcGxpZmljYXRpb25zIGZvciAKKyAgLy8vIGNvbW11dGF0aXZlIG9wZXJhdG9ycy4KKyAgYm9vbCBTaW1wbGlmeUNvbW11dGF0aXZlKEJpbmFyeU9wZXJhdG9yICZJKTsKKworICAvLy8gU2ltcGxpZnlEZW1hbmRlZFVzZUJpdHMgLSBBdHRlbXB0cyB0byByZXBsYWNlIFYgd2l0aCBhIHNpbXBsZXIgdmFsdWUKKyAgLy8vIGJhc2VkIG9uIHRoZSBkZW1hbmRlZCBiaXRzLgorICBWYWx1ZSAqU2ltcGxpZnlEZW1hbmRlZFVzZUJpdHMoVmFsdWUgKlYsIEFQSW50IERlbWFuZGVkTWFzaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCYgS25vd25aZXJvLCBBUEludCYgS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCk7CisgIGJvb2wgU2ltcGxpZnlEZW1hbmRlZEJpdHMoVXNlICZVLCBBUEludCBEZW1hbmRlZE1hc2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50JiBLbm93blplcm8sIEFQSW50JiBLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aD0wKTsKKyAgICAgIAorICAvLy8gU2ltcGxpZnlEZW1hbmRlZEluc3RydWN0aW9uQml0cyAtIEluc3QgaXMgYW4gaW50ZWdlciBpbnN0cnVjdGlvbiB0aGF0CisgIC8vLyBTaW1wbGlmeURlbWFuZGVkQml0cyBrbm93cyBhYm91dC4gIFNlZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGFueQorICAvLy8gcHJvcGVydGllcyB0aGF0IGFsbG93IHVzIHRvIHNpbXBsaWZ5IGl0cyBvcGVyYW5kcy4KKyAgYm9vbCBTaW1wbGlmeURlbWFuZGVkSW5zdHJ1Y3Rpb25CaXRzKEluc3RydWN0aW9uICZJbnN0KTsKKyAgICAgIAorICBWYWx1ZSAqU2ltcGxpZnlEZW1hbmRlZFZlY3RvckVsdHMoVmFsdWUgKlYsIEFQSW50IERlbWFuZGVkRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50JiBVbmRlZkVsdHMsIHVuc2lnbmVkIERlcHRoID0gMCk7CisgICAgCisgIC8vIEZvbGRPcEludG9QaGkgLSBHaXZlbiBhIGJpbmFyeSBvcGVyYXRvciwgY2FzdCBpbnN0cnVjdGlvbiwgb3Igc2VsZWN0CisgIC8vIHdoaWNoIGhhcyBhIFBISSBub2RlIGFzIG9wZXJhbmQgIzAsIHNlZSBpZiB3ZSBjYW4gZm9sZCB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8gaW50byB0aGUgUEhJICh3aGljaCBpcyBvbmx5IHBvc3NpYmxlIGlmIGFsbCBvcGVyYW5kcyB0byB0aGUgUEhJIGFyZQorICAvLyBjb25zdGFudHMpLgorICAvLworICAvLyBJZiBBbGxvd0FnZ3Jlc3NpdmUgaXMgdHJ1ZSwgRm9sZE9wSW50b1BoaSB3aWxsIGFsbG93IGNlcnRhaW4gdHJhbnNmb3JtcworICAvLyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHVucHJvZml0YWJsZSBiZWNhdXNlIHRoZXkgc3Ryb25nbHkgZW5jb3VyYWdlIGp1bXAKKyAgLy8gdGhyZWFkaW5nLgorICBJbnN0cnVjdGlvbiAqRm9sZE9wSW50b1BoaShJbnN0cnVjdGlvbiAmSSwgYm9vbCBBbGxvd0FnZ3Jlc3NpdmUgPSBmYWxzZSk7CisKKyAgLy8gRm9sZFBISUFyZ09wSW50b1BISSAtIElmIGFsbCBvcGVyYW5kcyB0byBhIFBISSBub2RlIGFyZSB0aGUgc2FtZSAidW5hcnkiCisgIC8vIG9wZXJhdG9yIGFuZCB0aGV5IGFsbCBhcmUgb25seSB1c2VkIGJ5IHRoZSBQSEksIFBISSB0b2dldGhlciB0aGVpcgorICAvLyBpbnB1dHMsIGFuZCBkbyB0aGUgb3BlcmF0aW9uIG9uY2UsIHRvIHRoZSByZXN1bHQgb2YgdGhlIFBISS4KKyAgSW5zdHJ1Y3Rpb24gKkZvbGRQSElBcmdPcEludG9QSEkoUEhJTm9kZSAmUE4pOworICBJbnN0cnVjdGlvbiAqRm9sZFBISUFyZ0Jpbk9wSW50b1BISShQSElOb2RlICZQTik7CisgIEluc3RydWN0aW9uICpGb2xkUEhJQXJnR0VQSW50b1BISShQSElOb2RlICZQTik7CisgIEluc3RydWN0aW9uICpGb2xkUEhJQXJnTG9hZEludG9QSEkoUEhJTm9kZSAmUE4pOworCisgIAorICBJbnN0cnVjdGlvbiAqT3B0QW5kT3AoSW5zdHJ1Y3Rpb24gKk9wLCBDb25zdGFudEludCAqT3BSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludCAqQW5kUkhTLCBCaW5hcnlPcGVyYXRvciAmVGhlQW5kKTsKKyAgCisgIFZhbHVlICpGb2xkTG9naWNhbFBsdXNBbmQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgQ29uc3RhbnRJbnQgKk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N1YiwgSW5zdHJ1Y3Rpb24gJkkpOworICBWYWx1ZSAqSW5zZXJ0UmFuZ2VUZXN0KFZhbHVlICpWLCBDb25zdGFudCAqTG8sIENvbnN0YW50ICpIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkLCBib29sIEluc2lkZSk7CisgIEluc3RydWN0aW9uICpQcm9tb3RlQ2FzdE9mQWxsb2NhdGlvbihCaXRDYXN0SW5zdCAmQ0ksIEFsbG9jYUluc3QgJkFJKTsKKyAgSW5zdHJ1Y3Rpb24gKk1hdGNoQlN3YXAoQmluYXJ5T3BlcmF0b3IgJkkpOworICBib29sIFNpbXBsaWZ5U3RvcmVBdEVuZE9mQmxvY2soU3RvcmVJbnN0ICZTSSk7CisgIEluc3RydWN0aW9uICpTaW1wbGlmeU1lbVRyYW5zZmVyKE1lbUludHJpbnNpYyAqTUkpOworICBJbnN0cnVjdGlvbiAqU2ltcGxpZnlNZW1TZXQoTWVtU2V0SW5zdCAqTUkpOworCisKKyAgVmFsdWUgKkV2YWx1YXRlSW5EaWZmZXJlbnRUeXBlKFZhbHVlICpWLCBjb25zdCBUeXBlICpUeSwgYm9vbCBpc1NpZ25lZCk7CisKKyAgdW5zaWduZWQgR2V0T3JFbmZvcmNlS25vd25BbGlnbm1lbnQoVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByZWZBbGlnbiA9IDApOworCit9OworCisgICAgICAKKyAgCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZUFkZFN1Yi5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZUFkZFN1Yi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyYTg1NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lQWRkU3ViLmNwcApAQCAtMCwwICsxLDcyNyBAQAorLy89PT0tIEluc3RDb21iaW5lQWRkU3ViLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdmlzaXQgZnVuY3Rpb25zIGZvciBhZGQsIGZhZGQsIHN1YiwgYW5kIGZzdWIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkluc3RDb21iaW5lLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdHRlcm5NYXRjaC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBuYW1lc3BhY2UgUGF0dGVybk1hdGNoOworCisvLy8gQWRkT25lIC0gQWRkIG9uZSB0byBhIENvbnN0YW50SW50Lgorc3RhdGljIENvbnN0YW50ICpBZGRPbmUoQ29uc3RhbnQgKkMpIHsKKyAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0QWRkKEMsIENvbnN0YW50SW50OjpnZXQoQy0+Z2V0VHlwZSgpLCAxKSk7Cit9CisvLy8gU3ViT25lIC0gU3VidHJhY3Qgb25lIGZyb20gYSBDb25zdGFudEludC4KK3N0YXRpYyBDb25zdGFudCAqU3ViT25lKENvbnN0YW50SW50ICpDKSB7CisgIHJldHVybiBDb25zdGFudEludDo6Z2V0KEMtPmdldENvbnRleHQoKSwgQy0+Z2V0VmFsdWUoKS0xKTsKK30KKworCisvLyBkeW5fY2FzdEZvbGRhYmxlTXVsIC0gSWYgdGhpcyB2YWx1ZSBpcyBhIG11bHRpcGx5IHRoYXQgY2FuIGJlIGZvbGRlZCBpbnRvCisvLyBvdGhlciBjb21wdXRhdGlvbnMgKGJlY2F1c2UgaXQgaGFzIGEgY29uc3RhbnQgb3BlcmFuZCksIHJldHVybiB0aGUKKy8vIG5vbi1jb25zdGFudCBvcGVyYW5kIG9mIHRoZSBtdWx0aXBseSwgYW5kIHNldCBDU1QgdG8gcG9pbnQgdG8gdGhlIG11bHRpcGxpZXIuCisvLyBPdGhlcndpc2UsIHJldHVybiBudWxsLgorLy8KK3N0YXRpYyBpbmxpbmUgVmFsdWUgKmR5bl9jYXN0Rm9sZGFibGVNdWwoVmFsdWUgKlYsIENvbnN0YW50SW50IComQ1NUKSB7CisgIGlmICghVi0+aGFzT25lVXNlKCkgfHwgIVYtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpOworICBpZiAoSSA9PSAwKSByZXR1cm4gMDsKKyAgCisgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TXVsKQorICAgIGlmICgoQ1NUID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEktPmdldE9wZXJhbmQoMSkpKSkKKyAgICAgIHJldHVybiBJLT5nZXRPcGVyYW5kKDApOworICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNobCkKKyAgICBpZiAoKENTVCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKDEpKSkpIHsKKyAgICAgIC8vIFRoZSBtdWx0aXBsaWVyIGlzIHJlYWxseSAxIDw8IENTVC4KKyAgICAgIHVpbnQzMl90IEJpdFdpZHRoID0gY2FzdDxJbnRlZ2VyVHlwZT4oVi0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAgIHVpbnQzMl90IENTVFZhbCA9IENTVC0+Z2V0TGltaXRlZFZhbHVlKEJpdFdpZHRoKTsKKyAgICAgIENTVCA9IENvbnN0YW50SW50OjpnZXQoVi0+Z2V0VHlwZSgpLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50KEJpdFdpZHRoLCAxKS5zaGwoQ1NUVmFsKSk7CisgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisKKy8vLyBXaWxsTm90T3ZlcmZsb3dTaWduZWRBZGQgLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gcHJvdmUgdGhhdDoKKy8vLyAgICAoc2V4dCAoYWRkIExIUywgUkhTKSkgID09PSAoYWRkIChzZXh0IExIUyksIChzZXh0IFJIUykpCisvLy8gVGhpcyBiYXNpY2FsbHkgcmVxdWlyZXMgcHJvdmluZyB0aGF0IHRoZSBhZGQgaW4gdGhlIG9yaWdpbmFsIHR5cGUgd291bGQgbm90CisvLy8gb3ZlcmZsb3cgdG8gY2hhbmdlIHRoZSBzaWduIGJpdCBvciBoYXZlIGEgY2Fycnkgb3V0LgorYm9vbCBJbnN0Q29tYmluZXI6OldpbGxOb3RPdmVyZmxvd1NpZ25lZEFkZChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKSB7CisgIC8vIFRoZXJlIGFyZSBkaWZmZXJlbnQgaGV1cmlzdGljcyB3ZSBjYW4gdXNlIGZvciB0aGlzLiAgSGVyZSBhcmUgc29tZSBzaW1wbGUKKyAgLy8gb25lcy4KKyAgCisgIC8vIEFkZCBoYXMgdGhlIHByb3BlcnR5IHRoYXQgYWRkaW5nIGFueSB0d28gMidzIGNvbXBsZW1lbnQgbnVtYmVycyBjYW4gb25seSAKKyAgLy8gaGF2ZSBvbmUgY2FycnkgYml0IHdoaWNoIGNhbiBjaGFuZ2UgYSBzaWduLiAgQXMgc3VjaCwgaWYgTEhTIGFuZCBSSFMgZWFjaAorICAvLyBoYXZlIGF0IGxlYXN0IHR3byBzaWduIGJpdHMsIHdlIGtub3cgdGhhdCB0aGUgYWRkaXRpb24gb2YgdGhlIHR3byB2YWx1ZXMKKyAgLy8gd2lsbCBzaWduIGV4dGVuZCBmaW5lLgorICBpZiAoQ29tcHV0ZU51bVNpZ25CaXRzKExIUykgPiAxICYmIENvbXB1dGVOdW1TaWduQml0cyhSSFMpID4gMSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIAorICAvLyBJZiBvbmUgb2YgdGhlIG9wZXJhbmRzIG9ubHkgaGFzIG9uZSBub24temVybyBiaXQsIGFuZCBpZiB0aGUgb3RoZXIgb3BlcmFuZAorICAvLyBoYXMgYSBrbm93bi16ZXJvIGJpdCBpbiBhIG1vcmUgc2lnbmlmaWNhbnQgcGxhY2UgdGhhbiBpdCAobm90IGluY2x1ZGluZyB0aGUKKyAgLy8gc2lnbiBiaXQpIHRoZSByaXBwbGUgbWF5IGdvIHVwIHRvIGFuZCBmaWxsIHRoZSB6ZXJvLCBidXQgd29uJ3QgY2hhbmdlIHRoZQorICAvLyBzaWduLiAgRm9yIGV4YW1wbGUsIChYICYgfjQpICsgMS4KKyAgCisgIC8vIFRPRE86IEltcGxlbWVudC4KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRBZGQoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgYm9vbCBDaGFuZ2VkID0gU2ltcGxpZnlDb21tdXRhdGl2ZShJKTsKKyAgVmFsdWUgKkxIUyA9IEkuZ2V0T3BlcmFuZCgwKSwgKlJIUyA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICBpZiAoVmFsdWUgKlYgPSBTaW1wbGlmeUFkZEluc3QoTEhTLCBSSFMsIEkuaGFzTm9TaWduZWRXcmFwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLmhhc05vVW5zaWduZWRXcmFwKCksIFREKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBWKTsKKworICAKKyAgaWYgKENvbnN0YW50ICpSSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpIHsKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFJIU0MpKSB7CisgICAgICAvLyBYICsgKHNpZ25iaXQpIC0tPiBYIF4gc2lnbmJpdAorICAgICAgY29uc3QgQVBJbnQmIFZhbCA9IENJLT5nZXRWYWx1ZSgpOworICAgICAgdWludDMyX3QgQml0V2lkdGggPSBWYWwuZ2V0Qml0V2lkdGgoKTsKKyAgICAgIGlmIChWYWwgPT0gQVBJbnQ6OmdldFNpZ25CaXQoQml0V2lkdGgpKQorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcihMSFMsIFJIUyk7CisgICAgICAKKyAgICAgIC8vIFNlZSBpZiBTaW1wbGlmeURlbWFuZGVkQml0cyBjYW4gc2ltcGxpZnkgdGhpcy4gIFRoaXMgaGFuZGxlcyBzdHVmZiBsaWtlCisgICAgICAvLyAoWCAmIDI1NCkrMSAtPiAoWCYyNTQpfDEKKyAgICAgIGlmIChTaW1wbGlmeURlbWFuZGVkSW5zdHJ1Y3Rpb25CaXRzKEkpKQorICAgICAgICByZXR1cm4gJkk7CisKKyAgICAgIC8vIHpleHQoYm9vbCkgKyBDIC0+IGJvb2wgPyBDICsgMSA6IEMKKyAgICAgIGlmIChaRXh0SW5zdCAqWkkgPSBkeW5fY2FzdDxaRXh0SW5zdD4oTEhTKSkKKyAgICAgICAgaWYgKFpJLT5nZXRTcmNUeSgpID09IFR5cGU6OmdldEludDFUeShJLmdldENvbnRleHQoKSkpCisgICAgICAgICAgcmV0dXJuIFNlbGVjdEluc3Q6OkNyZWF0ZShaSS0+Z2V0T3BlcmFuZCgwKSwgQWRkT25lKENJKSwgQ0kpOworICAgIH0KKworICAgIGlmIChpc2E8UEhJTm9kZT4oTEhTKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEkpKQorICAgICAgICByZXR1cm4gTlY7CisgICAgCisgICAgQ29uc3RhbnRJbnQgKlhvclJIUyA9IDA7CisgICAgVmFsdWUgKlhvckxIUyA9IDA7CisgICAgaWYgKGlzYTxDb25zdGFudEludD4oUkhTQykgJiYKKyAgICAgICAgbWF0Y2goTEhTLCBtX1hvcihtX1ZhbHVlKFhvckxIUyksIG1fQ29uc3RhbnRJbnQoWG9yUkhTKSkpKSB7CisgICAgICB1aW50MzJfdCBUeVNpemVCaXRzID0gSS5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgIGNvbnN0IEFQSW50JiBSSFNWYWwgPSBjYXN0PENvbnN0YW50SW50PihSSFNDKS0+Z2V0VmFsdWUoKTsKKyAgICAgIHVuc2lnbmVkIEV4dGVuZEFtdCA9IDA7CisgICAgICAvLyBJZiB3ZSBoYXZlIEFERChYT1IoQU5EKFgsIDB4RkYpLCAweDgwKSwgMHhGLi5GODApLCBpdCdzIGEgc2V4dC4KKyAgICAgIC8vIElmIHdlIGhhdmUgQUREKFhPUihBTkQoWCwgMHhGRiksIDB4Ri4uRjgwKSwgMHg4MCksIGl0J3MgYSBzZXh0LgorICAgICAgaWYgKFhvclJIUy0+Z2V0VmFsdWUoKSA9PSAtUkhTVmFsKSB7CisgICAgICAgIGlmIChSSFNWYWwuaXNQb3dlck9mMigpKQorICAgICAgICAgIEV4dGVuZEFtdCA9IFR5U2l6ZUJpdHMgLSBSSFNWYWwubG9nQmFzZTIoKSAtIDE7CisgICAgICAgIGVsc2UgaWYgKFhvclJIUy0+Z2V0VmFsdWUoKS5pc1Bvd2VyT2YyKCkpCisgICAgICAgICAgRXh0ZW5kQW10ID0gVHlTaXplQml0cyAtIFhvclJIUy0+Z2V0VmFsdWUoKS5sb2dCYXNlMigpIC0gMTsKKyAgICAgIH0KKworICAgICAgaWYgKEV4dGVuZEFtdCkgeworICAgICAgICBBUEludCBNYXNrID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KFR5U2l6ZUJpdHMsIEV4dGVuZEFtdCk7CisgICAgICAgIGlmICghTWFza2VkVmFsdWVJc1plcm8oWG9yTEhTLCBNYXNrKSkKKyAgICAgICAgICBFeHRlbmRBbXQgPSAwOworICAgICAgfQorCisgICAgICBpZiAoRXh0ZW5kQW10KSB7CisgICAgICAgIENvbnN0YW50ICpTaEFtdCA9IENvbnN0YW50SW50OjpnZXQoSS5nZXRUeXBlKCksIEV4dGVuZEFtdCk7CisgICAgICAgIFZhbHVlICpOZXdTaGwgPSBCdWlsZGVyLT5DcmVhdGVTaGwoWG9yTEhTLCBTaEFtdCk7CisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQVNocihOZXdTaGwsIFNoQW10KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoSS5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDEpKQorICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKExIUywgUkhTKTsKKworICBpZiAoSS5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkpIHsKKyAgICAvLyBYICsgWCAtLT4gWCA8PCAxCisgICAgaWYgKExIUyA9PSBSSFMpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNobChMSFMsIENvbnN0YW50SW50OjpnZXQoSS5nZXRUeXBlKCksIDEpKTsKKworICAgIGlmIChJbnN0cnVjdGlvbiAqUkhTSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihSSFMpKSB7CisgICAgICBpZiAoUkhTSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN1YikKKyAgICAgICAgaWYgKExIUyA9PSBSSFNJLT5nZXRPcGVyYW5kKDEpKSAgICAgICAgICAgICAgICAgICAvLyBBICsgKEIgLSBBKSAtLT4gQgorICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIFJIU0ktPmdldE9wZXJhbmQoMCkpOworICAgIH0KKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkxIU0kgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oTEhTKSkgeworICAgICAgaWYgKExIU0ktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTdWIpCisgICAgICAgIGlmIChSSFMgPT0gTEhTSS0+Z2V0T3BlcmFuZCgxKSkgICAgICAgICAgICAgICAgICAgLy8gKEIgLSBBKSArIEEgLS0+IEIKKyAgICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBMSFNJLT5nZXRPcGVyYW5kKDApKTsKKyAgICB9CisgIH0KKworICAvLyAtQSArIEIgIC0tPiAgQiAtIEEKKyAgLy8gLUEgKyAtQiAgLS0+ICAtKEEgKyBCKQorICBpZiAoVmFsdWUgKkxIU1YgPSBkeW5fY2FzdE5lZ1ZhbChMSFMpKSB7CisgICAgaWYgKExIUy0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSkgeworICAgICAgaWYgKFZhbHVlICpSSFNWID0gZHluX2Nhc3ROZWdWYWwoUkhTKSkgeworICAgICAgICBWYWx1ZSAqTmV3QWRkID0gQnVpbGRlci0+Q3JlYXRlQWRkKExIU1YsIFJIU1YpOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5lZyhOZXdBZGQpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVN1YihSSFMsIExIU1YpOworICB9CisKKyAgLy8gQSArIC1CICAtLT4gIEEgLSBCCisgIGlmICghaXNhPENvbnN0YW50PihSSFMpKQorICAgIGlmIChWYWx1ZSAqViA9IGR5bl9jYXN0TmVnVmFsKFJIUykpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVN1YihMSFMsIFYpOworCisKKyAgQ29uc3RhbnRJbnQgKkMyOworICBpZiAoVmFsdWUgKlggPSBkeW5fY2FzdEZvbGRhYmxlTXVsKExIUywgQzIpKSB7CisgICAgaWYgKFggPT0gUkhTKSAgIC8vIFgqQyArIFggLS0+IFggKiAoQysxKQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVNdWwoUkhTLCBBZGRPbmUoQzIpKTsKKworICAgIC8vIFgqQzEgKyBYKkMyIC0tPiBYICogKEMxK0MyKQorICAgIENvbnN0YW50SW50ICpDMTsKKyAgICBpZiAoWCA9PSBkeW5fY2FzdEZvbGRhYmxlTXVsKFJIUywgQzEpKQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVNdWwoWCwgQ29uc3RhbnRFeHByOjpnZXRBZGQoQzEsIEMyKSk7CisgIH0KKworICAvLyBYICsgWCpDIC0tPiBYICogKEMrMSkKKyAgaWYgKGR5bl9jYXN0Rm9sZGFibGVNdWwoUkhTLCBDMikgPT0gTEhTKQorICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTXVsKExIUywgQWRkT25lKEMyKSk7CisKKyAgLy8gWCArIH5YIC0tPiAtMSAgIHNpbmNlICAgflggPSAtWC0xCisgIGlmIChtYXRjaChMSFMsIG1fTm90KG1fU3BlY2lmaWMoUkhTKSkpIHx8CisgICAgICBtYXRjaChSSFMsIG1fTm90KG1fU3BlY2lmaWMoTEhTKSkpKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoSS5nZXRUeXBlKCkpKTsKKworICAvLyBBK0IgLS0+IEF8QiBpZmYgQSBhbmQgQiBoYXZlIG5vIGJpdHMgc2V0IGluIGNvbW1vbi4KKyAgaWYgKGNvbnN0IEludGVnZXJUeXBlICpJVCA9IGR5bl9jYXN0PEludGVnZXJUeXBlPihJLmdldFR5cGUoKSkpIHsKKyAgICBBUEludCBNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShJVC0+Z2V0Qml0V2lkdGgoKSk7CisgICAgQVBJbnQgTEhTS25vd25PbmUoSVQtPmdldEJpdFdpZHRoKCksIDApOworICAgIEFQSW50IExIU0tub3duWmVybyhJVC0+Z2V0Qml0V2lkdGgoKSwgMCk7CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoTEhTLCBNYXNrLCBMSFNLbm93blplcm8sIExIU0tub3duT25lKTsKKyAgICBpZiAoTEhTS25vd25aZXJvICE9IDApIHsKKyAgICAgIEFQSW50IFJIU0tub3duT25lKElULT5nZXRCaXRXaWR0aCgpLCAwKTsKKyAgICAgIEFQSW50IFJIU0tub3duWmVybyhJVC0+Z2V0Qml0V2lkdGgoKSwgMCk7CisgICAgICBDb21wdXRlTWFza2VkQml0cyhSSFMsIE1hc2ssIFJIU0tub3duWmVybywgUkhTS25vd25PbmUpOworICAgICAgCisgICAgICAvLyBObyBiaXRzIGluIGNvbW1vbiAtPiBiaXR3aXNlIG9yLgorICAgICAgaWYgKChMSFNLbm93blplcm98UkhTS25vd25aZXJvKS5pc0FsbE9uZXNWYWx1ZSgpKQorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKExIUywgUkhTKTsKKyAgICB9CisgIH0KKworICAvLyBXKlggKyBZKlogLS0+IFcgKiAoWCtaKSAgaWZmIFcgPT0gWQorICBpZiAoSS5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpKSB7CisgICAgVmFsdWUgKlcsICpYLCAqWSwgKlo7CisgICAgaWYgKG1hdGNoKExIUywgbV9NdWwobV9WYWx1ZShXKSwgbV9WYWx1ZShYKSkpICYmCisgICAgICAgIG1hdGNoKFJIUywgbV9NdWwobV9WYWx1ZShZKSwgbV9WYWx1ZShaKSkpKSB7CisgICAgICBpZiAoVyAhPSBZKSB7CisgICAgICAgIGlmIChXID09IFopIHsKKyAgICAgICAgICBzdGQ6OnN3YXAoWSwgWik7CisgICAgICAgIH0gZWxzZSBpZiAoWSA9PSBYKSB7CisgICAgICAgICAgc3RkOjpzd2FwKFcsIFgpOworICAgICAgICB9IGVsc2UgaWYgKFggPT0gWikgeworICAgICAgICAgIHN0ZDo6c3dhcChZLCBaKTsKKyAgICAgICAgICBzdGQ6OnN3YXAoVywgWCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKFcgPT0gWSkgeworICAgICAgICBWYWx1ZSAqTmV3QWRkID0gQnVpbGRlci0+Q3JlYXRlQWRkKFgsIFopOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU11bChXLCBOZXdBZGQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChDb25zdGFudEludCAqQ1JIUyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihSSFMpKSB7CisgICAgVmFsdWUgKlggPSAwOworICAgIGlmIChtYXRjaChMSFMsIG1fTm90KG1fVmFsdWUoWCkpKSkgICAgLy8gflggKyBDIC0tPiAoQy0xKSAtIFgKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKFN1Yk9uZShDUkhTKSwgWCk7CisKKyAgICAvLyAoWCAmIEZGMDApICsgeHgwMCAgLT4gKFgreHgwMCkgJiBGRjAwCisgICAgaWYgKExIUy0+aGFzT25lVXNlKCkgJiYKKyAgICAgICAgbWF0Y2goTEhTLCBtX0FuZChtX1ZhbHVlKFgpLCBtX0NvbnN0YW50SW50KEMyKSkpKSB7CisgICAgICBDb25zdGFudCAqQW5kZWQgPSBDb25zdGFudEV4cHI6OmdldEFuZChDUkhTLCBDMik7CisgICAgICBpZiAoQW5kZWQgPT0gQ1JIUykgeworICAgICAgICAvLyBTZWUgaWYgYWxsIGJpdHMgZnJvbSB0aGUgZmlyc3QgYml0IHNldCBpbiB0aGUgQWRkIFJIUyB1cCBhcmUgaW5jbHVkZWQKKyAgICAgICAgLy8gaW4gdGhlIG1hc2suICBGaXJzdCwgZ2V0IHRoZSByaWdodG1vc3QgYml0LgorICAgICAgICBjb25zdCBBUEludCAmQWRkUkhTViA9IENSSFMtPmdldFZhbHVlKCk7CisKKyAgICAgICAgLy8gRm9ybSBhIG1hc2sgb2YgYWxsIGJpdHMgZnJvbSB0aGUgbG93ZXN0IGJpdCBhZGRlZCB0aHJvdWdoIHRoZSB0b3AuCisgICAgICAgIEFQSW50IEFkZFJIU0hpZ2hCaXRzKH4oKEFkZFJIU1YgJiAtQWRkUkhTViktMSkpOworCisgICAgICAgIC8vIFNlZSBpZiB0aGUgYW5kIG1hc2sgaW5jbHVkZXMgYWxsIG9mIHRoZXNlIGJpdHMuCisgICAgICAgIEFQSW50IEFkZFJIU0hpZ2hCaXRzQW5kKEFkZFJIU0hpZ2hCaXRzICYgQzItPmdldFZhbHVlKCkpOworCisgICAgICAgIGlmIChBZGRSSFNIaWdoQml0cyA9PSBBZGRSSFNIaWdoQml0c0FuZCkgeworICAgICAgICAgIC8vIE9rYXksIHRoZSB4Zm9ybSBpcyBzYWZlLiAgSW5zZXJ0IHRoZSBuZXcgYWRkIHByb250by4KKyAgICAgICAgICBWYWx1ZSAqTmV3QWRkID0gQnVpbGRlci0+Q3JlYXRlQWRkKFgsIENSSFMpOworICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKE5ld0FkZCwgQzIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gVHJ5IHRvIGZvbGQgY29uc3RhbnQgYWRkIGludG8gc2VsZWN0IGFyZ3VtZW50cy4KKyAgICBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihMSFMpKQorICAgICAgaWYgKEluc3RydWN0aW9uICpSID0gRm9sZE9wSW50b1NlbGVjdChJLCBTSSkpCisgICAgICAgIHJldHVybiBSOworICB9CisKKyAgLy8gYWRkIChzZWxlY3QgWCAwIChzdWIgbiBBKSkgQSAgLS0+ICBzZWxlY3QgWCBBIG4KKyAgeworICAgIFNlbGVjdEluc3QgKlNJID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oTEhTKTsKKyAgICBWYWx1ZSAqQSA9IFJIUzsKKyAgICBpZiAoIVNJKSB7CisgICAgICBTSSA9IGR5bl9jYXN0PFNlbGVjdEluc3Q+KFJIUyk7CisgICAgICBBID0gTEhTOworICAgIH0KKyAgICBpZiAoU0kgJiYgU0ktPmhhc09uZVVzZSgpKSB7CisgICAgICBWYWx1ZSAqVFYgPSBTSS0+Z2V0VHJ1ZVZhbHVlKCk7CisgICAgICBWYWx1ZSAqRlYgPSBTSS0+Z2V0RmFsc2VWYWx1ZSgpOworICAgICAgVmFsdWUgKk47CisKKyAgICAgIC8vIENhbiB3ZSBmb2xkIHRoZSBhZGQgaW50byB0aGUgYXJndW1lbnQgb2YgdGhlIHNlbGVjdD8KKyAgICAgIC8vIFdlIGNoZWNrIGJvdGggdHJ1ZSBhbmQgZmFsc2Ugc2VsZWN0IGFyZ3VtZW50cyBmb3IgYSBtYXRjaGluZyBzdWJ0cmFjdC4KKyAgICAgIGlmIChtYXRjaChGViwgbV9aZXJvKCkpICYmCisgICAgICAgICAgbWF0Y2goVFYsIG1fU3ViKG1fVmFsdWUoTiksIG1fU3BlY2lmaWMoQSkpKSkKKyAgICAgICAgLy8gRm9sZCB0aGUgYWRkIGludG8gdGhlIHRydWUgc2VsZWN0IHZhbHVlLgorICAgICAgICByZXR1cm4gU2VsZWN0SW5zdDo6Q3JlYXRlKFNJLT5nZXRDb25kaXRpb24oKSwgTiwgQSk7CisgICAgICBpZiAobWF0Y2goVFYsIG1fWmVybygpKSAmJgorICAgICAgICAgIG1hdGNoKEZWLCBtX1N1YihtX1ZhbHVlKE4pLCBtX1NwZWNpZmljKEEpKSkpCisgICAgICAgIC8vIEZvbGQgdGhlIGFkZCBpbnRvIHRoZSBmYWxzZSBzZWxlY3QgdmFsdWUuCisgICAgICAgIHJldHVybiBTZWxlY3RJbnN0OjpDcmVhdGUoU0ktPmdldENvbmRpdGlvbigpLCBBLCBOKTsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBmb3IgKGFkZCAoc2V4dCB4KSwgeSksIHNlZSBpZiB3ZSBjYW4gbWVyZ2UgdGhpcyBpbnRvIGFuCisgIC8vIGludGVnZXIgYWRkIGZvbGxvd2VkIGJ5IGEgc2V4dC4KKyAgaWYgKFNFeHRJbnN0ICpMSFNDb252ID0gZHluX2Nhc3Q8U0V4dEluc3Q+KExIUykpIHsKKyAgICAvLyAoYWRkIChzZXh0IHgpLCBjc3QpIC0tPiAoc2V4dCAoYWRkIHgsIGNzdCcpKQorICAgIGlmIChDb25zdGFudEludCAqUkhTQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihSSFMpKSB7CisgICAgICBDb25zdGFudCAqQ0kgPSAKKyAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRUcnVuYyhSSFNDLCBMSFNDb252LT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpOworICAgICAgaWYgKExIU0NvbnYtPmhhc09uZVVzZSgpICYmCisgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRTRXh0KENJLCBJLmdldFR5cGUoKSkgPT0gUkhTQyAmJgorICAgICAgICAgIFdpbGxOb3RPdmVyZmxvd1NpZ25lZEFkZChMSFNDb252LT5nZXRPcGVyYW5kKDApLCBDSSkpIHsKKyAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcsIHNtYWxsZXIgYWRkLgorICAgICAgICBWYWx1ZSAqTmV3QWRkID0gQnVpbGRlci0+Q3JlYXRlTlNXQWRkKExIU0NvbnYtPmdldE9wZXJhbmQoMCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTRXh0SW5zdChOZXdBZGQsIEkuZ2V0VHlwZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gKGFkZCAoc2V4dCB4KSwgKHNleHQgeSkpIC0tPiAoc2V4dCAoYWRkIGludCB4LCB5KSkKKyAgICBpZiAoU0V4dEluc3QgKlJIU0NvbnYgPSBkeW5fY2FzdDxTRXh0SW5zdD4oUkhTKSkgeworICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHgveSBoYXZlIHRoZSBzYW1lIHR5cGUsIGlmIGF0IGxhc3Qgb25lIG9mIHRoZW0gaGFzIGEKKyAgICAgIC8vIHNpbmdsZSB1c2UgKHNvIHdlIGRvbid0IGluY3JlYXNlIHRoZSBudW1iZXIgb2Ygc2V4dHMpLCBhbmQgaWYgdGhlCisgICAgICAvLyBpbnRlZ2VyIGFkZCB3aWxsIG5vdCBvdmVyZmxvdy4KKyAgICAgIGlmIChMSFNDb252LT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk9PVJIU0NvbnYtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSYmCisgICAgICAgICAgKExIU0NvbnYtPmhhc09uZVVzZSgpIHx8IFJIU0NvbnYtPmhhc09uZVVzZSgpKSAmJgorICAgICAgICAgIFdpbGxOb3RPdmVyZmxvd1NpZ25lZEFkZChMSFNDb252LT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFNDb252LT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBpbnRlZ2VyIGFkZC4KKyAgICAgICAgVmFsdWUgKk5ld0FkZCA9IEJ1aWxkZXItPkNyZWF0ZU5TV0FkZChMSFNDb252LT5nZXRPcGVyYW5kKDApLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0NvbnYtPmdldE9wZXJhbmQoMCkpOworICAgICAgICByZXR1cm4gbmV3IFNFeHRJbnN0KE5ld0FkZCwgSS5nZXRUeXBlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBDaGFuZ2VkID8gJkkgOiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdEZBZGQoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgYm9vbCBDaGFuZ2VkID0gU2ltcGxpZnlDb21tdXRhdGl2ZShJKTsKKyAgVmFsdWUgKkxIUyA9IEkuZ2V0T3BlcmFuZCgwKSwgKlJIUyA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICBpZiAoQ29uc3RhbnQgKlJIU0MgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkgeworICAgIC8vIFggKyAwIC0tPiBYCisgICAgaWYgKENvbnN0YW50RlAgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlA+KFJIU0MpKSB7CisgICAgICBpZiAoQ0ZQLT5pc0V4YWN0bHlWYWx1ZShDb25zdGFudEZQOjpnZXROZWdhdGl2ZVplcm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJLmdldFR5cGUoKSktPmdldFZhbHVlQVBGKCkpKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBMSFMpOworICAgIH0KKworICAgIGlmIChpc2E8UEhJTm9kZT4oTEhTKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEkpKQorICAgICAgICByZXR1cm4gTlY7CisgIH0KKworICAvLyAtQSArIEIgIC0tPiAgQiAtIEEKKyAgLy8gLUEgKyAtQiAgLS0+ICAtKEEgKyBCKQorICBpZiAoVmFsdWUgKkxIU1YgPSBkeW5fY2FzdEZOZWdWYWwoTEhTKSkKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZTdWIoUkhTLCBMSFNWKTsKKworICAvLyBBICsgLUIgIC0tPiAgQSAtIEIKKyAgaWYgKCFpc2E8Q29uc3RhbnQ+KFJIUykpCisgICAgaWYgKFZhbHVlICpWID0gZHluX2Nhc3RGTmVnVmFsKFJIUykpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZTdWIoTEhTLCBWKTsKKworICAvLyBDaGVjayBmb3IgWCswLjAuICBTaW1wbGlmeSBpdCB0byBYIGlmIHdlIGtub3cgWCBpcyBub3QgLTAuMC4KKyAgaWYgKENvbnN0YW50RlAgKkNGUCA9IGR5bl9jYXN0PENvbnN0YW50RlA+KFJIUykpCisgICAgaWYgKENGUC0+Z2V0VmFsdWVBUEYoKS5pc1Bvc1plcm8oKSAmJiBDYW5ub3RCZU5lZ2F0aXZlWmVybyhMSFMpKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgTEhTKTsKKworICAvLyBDaGVjayBmb3IgKGZhZGQgZG91YmxlIChzaXRvZnAgeCksIHkpLCBzZWUgaWYgd2UgY2FuIG1lcmdlIHRoaXMgaW50byBhbgorICAvLyBpbnRlZ2VyIGFkZCBmb2xsb3dlZCBieSBhIHByb21vdGlvbi4KKyAgaWYgKFNJVG9GUEluc3QgKkxIU0NvbnYgPSBkeW5fY2FzdDxTSVRvRlBJbnN0PihMSFMpKSB7CisgICAgLy8gKGZhZGQgZG91YmxlIChzaXRvZnAgeCksIGZwY3N0KSAtLT4gKHNpdG9mcCAoYWRkIGludCB4LCBpbnRjc3QpKQorICAgIC8vIC4uLiBpZiB0aGUgY29uc3RhbnQgZml0cyBpbiB0aGUgaW50ZWdlciB2YWx1ZS4gIFRoaXMgaXMgdXNlZnVsIGZvciB0aGluZ3MKKyAgICAvLyBsaWtlIChkb3VibGUpKHggJiAxMjM0KSArIDQuMCAtPiAoZG91YmxlKSgoWCAmIDEyMzQpKzQpIHdoaWNoIG5vIGxvbmdlcgorICAgIC8vIHJlcXVpcmVzIGEgY29uc3RhbnQgcG9vbCBsb2FkLCBhbmQgZ2VuZXJhbGx5IGFsbG93cyB0aGUgYWRkIHRvIGJlIGJldHRlcgorICAgIC8vIGluc3Rjb21iaW5lZC4KKyAgICBpZiAoQ29uc3RhbnRGUCAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oUkhTKSkgeworICAgICAgQ29uc3RhbnQgKkNJID0gCisgICAgICBDb25zdGFudEV4cHI6OmdldEZQVG9TSShDRlAsIExIU0NvbnYtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSk7CisgICAgICBpZiAoTEhTQ29udi0+aGFzT25lVXNlKCkgJiYKKyAgICAgICAgICBDb25zdGFudEV4cHI6OmdldFNJVG9GUChDSSwgSS5nZXRUeXBlKCkpID09IENGUCAmJgorICAgICAgICAgIFdpbGxOb3RPdmVyZmxvd1NpZ25lZEFkZChMSFNDb252LT5nZXRPcGVyYW5kKDApLCBDSSkpIHsKKyAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgaW50ZWdlciBhZGQuCisgICAgICAgIFZhbHVlICpOZXdBZGQgPSBCdWlsZGVyLT5DcmVhdGVOU1dBZGQoTEhTQ29udi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSSk7CisgICAgICAgIHJldHVybiBuZXcgU0lUb0ZQSW5zdChOZXdBZGQsIEkuZ2V0VHlwZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gKGZhZGQgZG91YmxlIChzaXRvZnAgeCksIChzaXRvZnAgeSkpIC0tPiAoc2l0b2ZwIChhZGQgaW50IHgsIHkpKQorICAgIGlmIChTSVRvRlBJbnN0ICpSSFNDb252ID0gZHluX2Nhc3Q8U0lUb0ZQSW5zdD4oUkhTKSkgeworICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHgveSBoYXZlIHRoZSBzYW1lIHR5cGUsIGlmIGF0IGxhc3Qgb25lIG9mIHRoZW0gaGFzIGEKKyAgICAgIC8vIHNpbmdsZSB1c2UgKHNvIHdlIGRvbid0IGluY3JlYXNlIHRoZSBudW1iZXIgb2YgaW50LT5mcCBjb252ZXJzaW9ucyksCisgICAgICAvLyBhbmQgaWYgdGhlIGludGVnZXIgYWRkIHdpbGwgbm90IG92ZXJmbG93LgorICAgICAgaWYgKExIU0NvbnYtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKT09UkhTQ29udi0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpJiYKKyAgICAgICAgICAoTEhTQ29udi0+aGFzT25lVXNlKCkgfHwgUkhTQ29udi0+aGFzT25lVXNlKCkpICYmCisgICAgICAgICAgV2lsbE5vdE92ZXJmbG93U2lnbmVkQWRkKExIU0NvbnYtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0NvbnYtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IGludGVnZXIgYWRkLgorICAgICAgICBWYWx1ZSAqTmV3QWRkID0gQnVpbGRlci0+Q3JlYXRlTlNXQWRkKExIU0NvbnYtPmdldE9wZXJhbmQoMCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0NvbnYtPmdldE9wZXJhbmQoMCkpOworICAgICAgICByZXR1cm4gbmV3IFNJVG9GUEluc3QoTmV3QWRkLCBJLmdldFR5cGUoKSk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICByZXR1cm4gQ2hhbmdlZCA/ICZJIDogMDsKK30KKworCisvLy8gRW1pdEdFUE9mZnNldCAtIEdpdmVuIGEgZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbi9jb25zdGFudGV4cHIsIGVtaXQgdGhlCisvLy8gY29kZSBuZWNlc3NhcnkgdG8gY29tcHV0ZSB0aGUgb2Zmc2V0IGZyb20gdGhlIGJhc2UgcG9pbnRlciAod2l0aG91dCBhZGRpbmcKKy8vLyBpbiB0aGUgYmFzZSBwb2ludGVyKS4gIFJldHVybiB0aGUgcmVzdWx0IGFzIGEgc2lnbmVkIGludGVnZXIgb2YgaW50cHRyIHNpemUuCitWYWx1ZSAqSW5zdENvbWJpbmVyOjpFbWl0R0VQT2Zmc2V0KFVzZXIgKkdFUCkgeworICBUYXJnZXREYXRhICZURCA9ICpnZXRUYXJnZXREYXRhKCk7CisgIGdlcF90eXBlX2l0ZXJhdG9yIEdUSSA9IGdlcF90eXBlX2JlZ2luKEdFUCk7CisgIGNvbnN0IFR5cGUgKkludFB0clR5ID0gVEQuZ2V0SW50UHRyVHlwZShHRVAtPmdldENvbnRleHQoKSk7CisgIFZhbHVlICpSZXN1bHQgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEludFB0clR5KTsKKworICAvLyBCdWlsZCBhIG1hc2sgZm9yIGhpZ2ggb3JkZXIgYml0cy4KKyAgdW5zaWduZWQgSW50UHRyV2lkdGggPSBURC5nZXRQb2ludGVyU2l6ZUluQml0cygpOworICB1aW50NjRfdCBQdHJTaXplTWFzayA9IH4wVUxMID4+ICg2NC1JbnRQdHJXaWR0aCk7CisKKyAgZm9yIChVc2VyOjpvcF9pdGVyYXRvciBpID0gR0VQLT5vcF9iZWdpbigpICsgMSwgZSA9IEdFUC0+b3BfZW5kKCk7IGkgIT0gZTsKKyAgICAgICArK2ksICsrR1RJKSB7CisgICAgVmFsdWUgKk9wID0gKmk7CisgICAgdWludDY0X3QgU2l6ZSA9IFRELmdldFR5cGVBbGxvY1NpemUoR1RJLmdldEluZGV4ZWRUeXBlKCkpICYgUHRyU2l6ZU1hc2s7CisgICAgaWYgKENvbnN0YW50SW50ICpPcEMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3ApKSB7CisgICAgICBpZiAoT3BDLT5pc1plcm8oKSkgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIEhhbmRsZSBhIHN0cnVjdCBpbmRleCwgd2hpY2ggYWRkcyBpdHMgZmllbGQgb2Zmc2V0IHRvIHRoZSBwb2ludGVyLgorICAgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KCpHVEkpKSB7CisgICAgICAgIFNpemUgPSBURC5nZXRTdHJ1Y3RMYXlvdXQoU1R5KS0+Z2V0RWxlbWVudE9mZnNldChPcEMtPmdldFpFeHRWYWx1ZSgpKTsKKyAgICAgICAgCisgICAgICAgIFJlc3VsdCA9IEJ1aWxkZXItPkNyZWF0ZUFkZChSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEludFB0clR5LCBTaXplKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICBDb25zdGFudCAqU2NhbGUgPSBDb25zdGFudEludDo6Z2V0KEludFB0clR5LCBTaXplKTsKKyAgICAgIENvbnN0YW50ICpPQyA9CisgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0SW50ZWdlckNhc3QoT3BDLCBJbnRQdHJUeSwgdHJ1ZSAvKlNFeHQqLyk7CisgICAgICBTY2FsZSA9IENvbnN0YW50RXhwcjo6Z2V0TXVsKE9DLCBTY2FsZSk7CisgICAgICAvLyBFbWl0IGFuIGFkZCBpbnN0cnVjdGlvbi4KKyAgICAgIFJlc3VsdCA9IEJ1aWxkZXItPkNyZWF0ZUFkZChSZXN1bHQsIFNjYWxlKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBDb252ZXJ0IHRvIGNvcnJlY3QgdHlwZS4KKyAgICBpZiAoT3AtPmdldFR5cGUoKSAhPSBJbnRQdHJUeSkKKyAgICAgIE9wID0gQnVpbGRlci0+Q3JlYXRlSW50Q2FzdChPcCwgSW50UHRyVHksIHRydWUpOworICAgIGlmIChTaXplICE9IDEpIHsKKyAgICAgIENvbnN0YW50ICpTY2FsZSA9IENvbnN0YW50SW50OjpnZXQoSW50UHRyVHksIFNpemUpOworICAgICAgLy8gV2UnbGwgbGV0IGluc3Rjb21iaW5lKG11bCkgY29udmVydCB0aGlzIHRvIGEgc2hsIGlmIHBvc3NpYmxlLgorICAgICAgT3AgPSBCdWlsZGVyLT5DcmVhdGVNdWwoT3AsIFNjYWxlKTsKKyAgICB9CisKKyAgICAvLyBFbWl0IGFuIGFkZCBpbnN0cnVjdGlvbi4KKyAgICBSZXN1bHQgPSBCdWlsZGVyLT5DcmVhdGVBZGQoT3AsIFJlc3VsdCk7CisgIH0KKyAgcmV0dXJuIFJlc3VsdDsKK30KKworCisKKworLy8vIE9wdGltaXplIHBvaW50ZXIgZGlmZmVyZW5jZXMgaW50byB0aGUgc2FtZSBhcnJheSBpbnRvIGEgc2l6ZS4gIENvbnNpZGVyOgorLy8vICAmQVsxMF0gLSAmQVswXTogd2Ugc2hvdWxkIGNvbXBpbGUgdGhpcyB0byAiMTAiLiAgTEhTL1JIUyBhcmUgdGhlIHBvaW50ZXIKKy8vLyBvcGVyYW5kcyB0byB0aGUgcHRydG9pbnQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgTEhTL1JIUyBvZiB0aGUgc3VidHJhY3QuCisvLy8KK1ZhbHVlICpJbnN0Q29tYmluZXI6Ok9wdGltaXplUG9pbnRlckRpZmZlcmVuY2UoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHkpIHsKKyAgYXNzZXJ0KFREICYmICJNdXN0IGhhdmUgdGFyZ2V0IGRhdGEgaW5mbyBmb3IgdGhpcyIpOworICAKKyAgLy8gSWYgTEhTIGlzIGEgZ2VwIGJhc2VkIG9uIFJIUyBvciBSSFMgaXMgYSBnZXAgYmFzZWQgb24gTEhTLCB3ZSBjYW4gb3B0aW1pemUKKyAgLy8gdGhpcy4KKyAgYm9vbCBTd2FwcGVkID0gZmFsc2U7CisgIEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSAwOworICBDb25zdGFudEV4cHIgKkNzdEdFUCA9IDA7CisgIAorICAvLyBUT0RPOiBDb3VsZCBhbHNvIG9wdGltaXplICZBW2ldIC0gJkFbal0gLT4gImktaiIsIGFuZCAiJkEuZm9vW2ldIC0gJkEuZm9vIi4KKyAgLy8gRm9yIG5vdyB3ZSByZXF1aXJlIG9uZSBzaWRlIHRvIGJlIHRoZSBiYXNlIHBvaW50ZXIgIkEiIG9yIGEgY29uc3RhbnQKKyAgLy8gZXhwcmVzc2lvbiBkZXJpdmVkIGZyb20gaXQuCisgIGlmIChHZXRFbGVtZW50UHRySW5zdCAqTEhTR0VQID0gZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KExIUykpIHsKKyAgICAvLyAoZ2VwIFgsIC4uLikgLSBYCisgICAgaWYgKExIU0dFUC0+Z2V0T3BlcmFuZCgwKSA9PSBSSFMpIHsKKyAgICAgIEdFUCA9IExIU0dFUDsKKyAgICAgIFN3YXBwZWQgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFJIUykpIHsKKyAgICAgIC8vIChnZXAgWCwgLi4uKSAtIChjZV9nZXAgWCwgLi4uKQorICAgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0ciAmJgorICAgICAgICAgIExIU0dFUC0+Z2V0T3BlcmFuZCgwKSA9PSBDRS0+Z2V0T3BlcmFuZCgwKSkgeworICAgICAgICBDc3RHRVAgPSBDRTsKKyAgICAgICAgR0VQID0gTEhTR0VQOworICAgICAgICBTd2FwcGVkID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBpZiAoR2V0RWxlbWVudFB0ckluc3QgKlJIU0dFUCA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihSSFMpKSB7CisgICAgLy8gWCAtIChnZXAgWCwgLi4uKQorICAgIGlmIChSSFNHRVAtPmdldE9wZXJhbmQoMCkgPT0gTEhTKSB7CisgICAgICBHRVAgPSBSSFNHRVA7CisgICAgICBTd2FwcGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KExIUykpIHsKKyAgICAgIC8vIChjZV9nZXAgWCwgLi4uKSAtIChnZXAgWCwgLi4uKQorICAgICAgaWYgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0ciAmJgorICAgICAgICAgIFJIU0dFUC0+Z2V0T3BlcmFuZCgwKSA9PSBDRS0+Z2V0T3BlcmFuZCgwKSkgeworICAgICAgICBDc3RHRVAgPSBDRTsKKyAgICAgICAgR0VQID0gUkhTR0VQOworICAgICAgICBTd2FwcGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIGlmIChHRVAgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIEVtaXQgdGhlIG9mZnNldCBvZiB0aGUgR0VQIGFuZCBhbiBpbnRwdHJfdC4KKyAgVmFsdWUgKlJlc3VsdCA9IEVtaXRHRVBPZmZzZXQoR0VQKTsKKyAgCisgIC8vIElmIHdlIGhhZCBhIGNvbnN0YW50IGV4cHJlc3Npb24gR0VQIG9uIHRoZSBvdGhlciBzaWRlIG9mZnNldHRpbmcgdGhlCisgIC8vIHBvaW50ZXIsIHN1YnRyYWN0IGl0IGZyb20gdGhlIG9mZnNldCB3ZSBoYXZlLgorICBpZiAoQ3N0R0VQKSB7CisgICAgVmFsdWUgKkNzdE9mZnNldCA9IEVtaXRHRVBPZmZzZXQoQ3N0R0VQKTsKKyAgICBSZXN1bHQgPSBCdWlsZGVyLT5DcmVhdGVTdWIoUmVzdWx0LCBDc3RPZmZzZXQpOworICB9CisgIAorCisgIC8vIElmIHdlIGhhdmUgcCAtIGdlcChwLCAuLi4pICB0aGVuIHdlIGhhdmUgdG8gbmVnYXRlIHRoZSByZXN1bHQuCisgIGlmIChTd2FwcGVkKQorICAgIFJlc3VsdCA9IEJ1aWxkZXItPkNyZWF0ZU5lZyhSZXN1bHQpOworCisgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVJbnRDYXN0KFJlc3VsdCwgVHksIHRydWUpOworfQorCisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0U3ViKEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIFZhbHVlICpPcDAgPSBJLmdldE9wZXJhbmQoMCksICpPcDEgPSBJLmdldE9wZXJhbmQoMSk7CisKKyAgaWYgKE9wMCA9PSBPcDEpICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViIFgsIFggIC0+IDAKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEkuZ2V0VHlwZSgpKSk7CisKKyAgLy8gSWYgdGhpcyBpcyBhICdCID0geC0oLUEpJywgY2hhbmdlIHRvIEIgPSB4K0EuICBUaGlzIHByZXNlcnZlcyBOU1cvTlVXLgorICBpZiAoVmFsdWUgKlYgPSBkeW5fY2FzdE5lZ1ZhbChPcDEpKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKlJlcyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoT3AwLCBWKTsKKyAgICBSZXMtPnNldEhhc05vU2lnbmVkV3JhcChJLmhhc05vU2lnbmVkV3JhcCgpKTsKKyAgICBSZXMtPnNldEhhc05vVW5zaWduZWRXcmFwKEkuaGFzTm9VbnNpZ25lZFdyYXAoKSk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oT3AwKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBPcDApOyAgICAvLyB1bmRlZiAtIFggLT4gdW5kZWYKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihPcDEpKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMSk7ICAgIC8vIFggLSB1bmRlZiAtPiB1bmRlZgorICBpZiAoSS5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDEpKQorICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKE9wMCwgT3AxKTsKKyAgCisgIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDApKSB7CisgICAgLy8gUmVwbGFjZSAoLTEgLSBBKSB3aXRoICh+QSkuCisgICAgaWYgKEMtPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5vdChPcDEpOworCisgICAgLy8gQyAtIH5YID09IFggKyAoMStDKQorICAgIFZhbHVlICpYID0gMDsKKyAgICBpZiAobWF0Y2goT3AxLCBtX05vdChtX1ZhbHVlKFgpKSkpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChYLCBBZGRPbmUoQykpOworCisgICAgLy8gLShYID4+dSAzMSkgLT4gKFggPj5zIDMxKQorICAgIC8vIC0oWCA+PnMgMzEpIC0+IChYID4+dSAzMSkKKyAgICBpZiAoQy0+aXNaZXJvKCkpIHsKKyAgICAgIGlmIChCaW5hcnlPcGVyYXRvciAqU0kgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oT3AxKSkgeworICAgICAgICBpZiAoU0ktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpMU2hyKSB7CisgICAgICAgICAgaWYgKENvbnN0YW50SW50ICpDVSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihTSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgc2hpZnRpbmcgb3V0IGV2ZXJ5dGhpbmcgYnV0IHRoZSBzaWduIGJpdC4KKyAgICAgICAgICAgIGlmIChDVS0+Z2V0TGltaXRlZFZhbHVlKFNJLT5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSkgPT0KKyAgICAgICAgICAgICAgICBTSS0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCktMSkgeworICAgICAgICAgICAgICAvLyBPaywgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHNhZmUuICBJbnNlcnQgQVNoci4KKyAgICAgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoSW5zdHJ1Y3Rpb246OkFTaHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ktPmdldE9wZXJhbmQoMCksIENVKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoU0ktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBU2hyKSB7CisgICAgICAgICAgaWYgKENvbnN0YW50SW50ICpDVSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihTSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgc2hpZnRpbmcgb3V0IGV2ZXJ5dGhpbmcgYnV0IHRoZSBzaWduIGJpdC4KKyAgICAgICAgICAgIGlmIChDVS0+Z2V0TGltaXRlZFZhbHVlKFNJLT5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSkgPT0KKyAgICAgICAgICAgICAgICBTSS0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCktMSkgeworICAgICAgICAgICAgICAvLyBPaywgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHNhZmUuICBJbnNlcnQgTFNoci4gCisgICAgICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTFNocigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJLT5nZXRPcGVyYW5kKDApLCBDVSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gVHJ5IHRvIGZvbGQgY29uc3RhbnQgc3ViIGludG8gc2VsZWN0IGFyZ3VtZW50cy4KKyAgICBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihPcDEpKQorICAgICAgaWYgKEluc3RydWN0aW9uICpSID0gRm9sZE9wSW50b1NlbGVjdChJLCBTSSkpCisgICAgICAgIHJldHVybiBSOworCisgICAgLy8gQyAtIHpleHQoYm9vbCkgLT4gYm9vbCA/IEMgLSAxIDogQworICAgIGlmIChaRXh0SW5zdCAqWkkgPSBkeW5fY2FzdDxaRXh0SW5zdD4oT3AxKSkKKyAgICAgIGlmIChaSS0+Z2V0U3JjVHkoKSA9PSBUeXBlOjpnZXRJbnQxVHkoSS5nZXRDb250ZXh0KCkpKQorICAgICAgICByZXR1cm4gU2VsZWN0SW5zdDo6Q3JlYXRlKFpJLT5nZXRPcGVyYW5kKDApLCBTdWJPbmUoQyksIEMpOworICB9CisKKyAgaWYgKEJpbmFyeU9wZXJhdG9yICpPcDFJID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMSkpIHsKKyAgICBpZiAoT3AxSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFkZCkgeworICAgICAgaWYgKE9wMUktPmdldE9wZXJhbmQoMCkgPT0gT3AwKSAgICAgICAgICAgICAgLy8gWC0oWCtZKSA9PSAtWQorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5lZyhPcDFJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIGVsc2UgaWYgKE9wMUktPmdldE9wZXJhbmQoMSkgPT0gT3AwKSAgICAgICAgIC8vIFgtKFkrWCkgPT0gLVkKKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOZWcoT3AxSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICBlbHNlIGlmIChDb25zdGFudEludCAqQ0kxID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEkuZ2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgaWYgKENvbnN0YW50SW50ICpDSTIgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AxSS0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICAgICAgLy8gQzEtKFgrQzIpIC0tPiAoQzEtQzIpLVgKKyAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVN1YigKKyAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0U3ViKENJMSwgQ0kyKSwgT3AxSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKE9wMUktPmhhc09uZVVzZSgpKSB7CisgICAgICAvLyBSZXBsYWNlICh4IC0gKHkgLSB6KSkgd2l0aCAoeCArICh6IC0geSkpIGlmIHRoZSAoeSAtIHopIHN1YmV4cHJlc3Npb24KKyAgICAgIC8vIGlzIG5vdCB1c2VkIGJ5IGFueW9uZSBlbHNlLi4uCisgICAgICAvLworICAgICAgaWYgKE9wMUktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTdWIpIHsKKyAgICAgICAgLy8gU3dhcCB0aGUgdHdvIG9wZXJhbmRzIG9mIHRoZSBzdWJleHByLi4uCisgICAgICAgIFZhbHVlICpJSU9wMCA9IE9wMUktPmdldE9wZXJhbmQoMCksICpJSU9wMSA9IE9wMUktPmdldE9wZXJhbmQoMSk7CisgICAgICAgIE9wMUktPnNldE9wZXJhbmQoMCwgSUlPcDEpOworICAgICAgICBPcDFJLT5zZXRPcGVyYW5kKDEsIElJT3AwKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyB0b3AgbGV2ZWwgYWRkIGluc3RydWN0aW9uLi4uCisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKE9wMCwgT3AxKTsKKyAgICAgIH0KKworICAgICAgLy8gUmVwbGFjZSAoQSAtIChBICYgQikpIHdpdGggKEEgJiB+QikgaWYgdGhpcyBpcyB0aGUgb25seSB1c2Ugb2YgKEEmQikuLi4KKyAgICAgIC8vCisgICAgICBpZiAoT3AxSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFuZCAmJgorICAgICAgICAgIChPcDFJLT5nZXRPcGVyYW5kKDApID09IE9wMCB8fCBPcDFJLT5nZXRPcGVyYW5kKDEpID09IE9wMCkpIHsKKyAgICAgICAgVmFsdWUgKk90aGVyT3AgPSBPcDFJLT5nZXRPcGVyYW5kKE9wMUktPmdldE9wZXJhbmQoMCkgPT0gT3AwKTsKKworICAgICAgICBWYWx1ZSAqTmV3Tm90ID0gQnVpbGRlci0+Q3JlYXRlTm90KE90aGVyT3ApOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChPcDAsIE5ld05vdCk7CisgICAgICB9CisKKyAgICAgIC8vIDAgLSAoWCBzZGl2IEMpICAtPiAoWCBzZGl2IC1DKQorICAgICAgaWYgKE9wMUktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTRGl2KQorICAgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNTSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDApKQorICAgICAgICAgIGlmIChDU0ktPmlzWmVybygpKQorICAgICAgICAgICAgaWYgKENvbnN0YW50ICpEaXZSSFMgPSBkeW5fY2FzdDxDb25zdGFudD4oT3AxSS0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU0RpdihPcDFJLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXROZWcoRGl2UkhTKSk7CisKKyAgICAgIC8vIDAgLSAoQyA8PCBYKSAgLT4gKC1DIDw8IFgpCisgICAgICBpZiAoT3AxSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNobCkKKyAgICAgICAgaWYgKENvbnN0YW50SW50ICpDU0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AwKSkKKyAgICAgICAgICBpZiAoQ1NJLT5pc1plcm8oKSkKKyAgICAgICAgICAgIGlmIChWYWx1ZSAqU2hsTEhTTmVnID0gZHluX2Nhc3ROZWdWYWwoT3AxSS0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKFNobExIU05lZywgT3AxSS0+Z2V0T3BlcmFuZCgxKSk7CisKKyAgICAgIC8vIFggLSBYKkMgLS0+IFggKiAoMS1DKQorICAgICAgQ29uc3RhbnRJbnQgKkMyID0gMDsKKyAgICAgIGlmIChkeW5fY2FzdEZvbGRhYmxlTXVsKE9wMUksIEMyKSA9PSBPcDApIHsKKyAgICAgICAgQ29uc3RhbnQgKkNQMSA9IAorICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0U3ViKENvbnN0YW50SW50OjpnZXQoSS5nZXRUeXBlKCksIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzIpOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU11bChPcDAsIENQMSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKEJpbmFyeU9wZXJhdG9yICpPcDBJID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMCkpIHsKKyAgICBpZiAoT3AwSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFkZCkgeworICAgICAgaWYgKE9wMEktPmdldE9wZXJhbmQoMCkgPT0gT3AxKSAgICAgICAgICAgICAvLyAoWStYKS1ZID09IFgKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgT3AwSS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICBlbHNlIGlmIChPcDBJLT5nZXRPcGVyYW5kKDEpID09IE9wMSkgICAgICAgIC8vIChYK1kpLVkgPT0gWAorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBPcDBJLT5nZXRPcGVyYW5kKDApKTsKKyAgICB9IGVsc2UgaWYgKE9wMEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTdWIpIHsKKyAgICAgIGlmIChPcDBJLT5nZXRPcGVyYW5kKDApID09IE9wMSkgICAgICAgICAgICAgLy8gKFgtWSktWCA9PSAtWQorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5lZyhPcDBJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICB9CisgIH0KKworICBDb25zdGFudEludCAqQzE7CisgIGlmIChWYWx1ZSAqWCA9IGR5bl9jYXN0Rm9sZGFibGVNdWwoT3AwLCBDMSkpIHsKKyAgICBpZiAoWCA9PSBPcDEpICAvLyBYKkMgLSBYIC0tPiBYICogKEMtMSkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTXVsKE9wMSwgU3ViT25lKEMxKSk7CisKKyAgICBDb25zdGFudEludCAqQzI7ICAgLy8gWCpDMSAtIFgqQzIgLT4gWCAqIChDMS1DMikKKyAgICBpZiAoWCA9PSBkeW5fY2FzdEZvbGRhYmxlTXVsKE9wMSwgQzIpKQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVNdWwoWCwgQ29uc3RhbnRFeHByOjpnZXRTdWIoQzEsIEMyKSk7CisgIH0KKyAgCisgIC8vIE9wdGltaXplIHBvaW50ZXIgZGlmZmVyZW5jZXMgaW50byB0aGUgc2FtZSBhcnJheSBpbnRvIGEgc2l6ZS4gIENvbnNpZGVyOgorICAvLyAgJkFbMTBdIC0gJkFbMF06IHdlIHNob3VsZCBjb21waWxlIHRoaXMgdG8gIjEwIi4KKyAgaWYgKFREKSB7CisgICAgVmFsdWUgKkxIU09wLCAqUkhTT3A7CisgICAgaWYgKG1hdGNoKE9wMCwgbV9QdHJUb0ludChtX1ZhbHVlKExIU09wKSkpICYmCisgICAgICAgIG1hdGNoKE9wMSwgbV9QdHJUb0ludChtX1ZhbHVlKFJIU09wKSkpKQorICAgICAgaWYgKFZhbHVlICpSZXMgPSBPcHRpbWl6ZVBvaW50ZXJEaWZmZXJlbmNlKExIU09wLCBSSFNPcCwgSS5nZXRUeXBlKCkpKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBSZXMpOworICAgIAorICAgIC8vIHRydW5jKHApLXRydW5jKHEpIC0+IHRydW5jKHAtcSkKKyAgICBpZiAobWF0Y2goT3AwLCBtX1RydW5jKG1fUHRyVG9JbnQobV9WYWx1ZShMSFNPcCkpKSkgJiYKKyAgICAgICAgbWF0Y2goT3AxLCBtX1RydW5jKG1fUHRyVG9JbnQobV9WYWx1ZShSSFNPcCkpKSkpCisgICAgICBpZiAoVmFsdWUgKlJlcyA9IE9wdGltaXplUG9pbnRlckRpZmZlcmVuY2UoTEhTT3AsIFJIU09wLCBJLmdldFR5cGUoKSkpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIFJlcyk7CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdEZTdWIoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICAvLyBJZiB0aGlzIGlzIGEgJ0IgPSB4LSgtQSknLCBjaGFuZ2UgdG8gQiA9IHgrQS4uLgorICBpZiAoVmFsdWUgKlYgPSBkeW5fY2FzdEZOZWdWYWwoT3AxKSkKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZBZGQoT3AwLCBWKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lQW5kT3JYb3IuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVBbmRPclhvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwMzM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lQW5kT3JYb3IuY3BwCkBAIC0wLDAgKzEsMTk4NSBAQAorLy89PT0tIEluc3RDb21iaW5lQW5kT3JYb3IuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdmlzaXRBbmQsIHZpc2l0T3IsIGFuZCB2aXNpdFhvciBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkluc3RDb21iaW5lLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdHRlcm5NYXRjaC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBuYW1lc3BhY2UgUGF0dGVybk1hdGNoOworCisKKy8vLyBBZGRPbmUgLSBBZGQgb25lIHRvIGEgQ29uc3RhbnRJbnQuCitzdGF0aWMgQ29uc3RhbnQgKkFkZE9uZShDb25zdGFudCAqQykgeworICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRBZGQoQywgQ29uc3RhbnRJbnQ6OmdldChDLT5nZXRUeXBlKCksIDEpKTsKK30KKy8vLyBTdWJPbmUgLSBTdWJ0cmFjdCBvbmUgZnJvbSBhIENvbnN0YW50SW50Lgorc3RhdGljIENvbnN0YW50ICpTdWJPbmUoQ29uc3RhbnRJbnQgKkMpIHsKKyAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoQy0+Z2V0Q29udGV4dCgpLCBDLT5nZXRWYWx1ZSgpLTEpOworfQorCisvLy8gaXNGcmVlVG9JbnZlcnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGZyZWUgdG8gaW52ZXJ0IChhcHBseQorLy8vIH4gdG8pLiAgVGhpcyBoYXBwZW5zIGluIGNhc2VzIHdoZXJlIHRoZSB+IGNhbiBiZSBlbGltaW5hdGVkLgorc3RhdGljIGlubGluZSBib29sIGlzRnJlZVRvSW52ZXJ0KFZhbHVlICpWKSB7CisgIC8vIH4ofihYKSkgLT4gWC4KKyAgaWYgKEJpbmFyeU9wZXJhdG9yOjppc05vdChWKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIC8vIENvbnN0YW50cyBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBub3QnZWQgdmFsdWVzLgorICBpZiAoaXNhPENvbnN0YW50SW50PihWKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIC8vIENvbXBhcmVzIGNhbiBiZSBpbnZlcnRlZCBpZiB0aGV5IGhhdmUgYSBzaW5nbGUgdXNlLgorICBpZiAoQ21wSW5zdCAqQ0kgPSBkeW5fY2FzdDxDbXBJbnN0PihWKSkKKyAgICByZXR1cm4gQ0ktPmhhc09uZVVzZSgpOworICAKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIFZhbHVlICpkeW5fY2FzdE5vdFZhbChWYWx1ZSAqVikgeworICAvLyBJZiB0aGlzIGlzIG5vdChub3QoeCkpIGRvbid0IHJldHVybiB0aGF0IHRoaXMgaXMgYSBub3Q6IHdlIHdhbnQgdGhlIHR3bworICAvLyBub3QncyB0byBiZSBmb2xkZWQgZmlyc3QuCisgIGlmIChCaW5hcnlPcGVyYXRvcjo6aXNOb3QoVikpIHsKKyAgICBWYWx1ZSAqT3BlcmFuZCA9IEJpbmFyeU9wZXJhdG9yOjpnZXROb3RBcmd1bWVudChWKTsKKyAgICBpZiAoIWlzRnJlZVRvSW52ZXJ0KE9wZXJhbmQpKQorICAgICAgcmV0dXJuIE9wZXJhbmQ7CisgIH0KKyAgCisgIC8vIENvbnN0YW50cyBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBub3QnZWQgdmFsdWVzLi4uCisgIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKSkKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChDLT5nZXRUeXBlKCksIH5DLT5nZXRWYWx1ZSgpKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLy8vIGdldElDbXBDb2RlIC0gRW5jb2RlIGEgaWNtcCBwcmVkaWNhdGUgaW50byBhIHRocmVlIGJpdCBtYXNrLiAgVGhlc2UgYml0cworLy8vIGFyZSBjYXJlZnVsbHkgYXJyYW5nZWQgdG8gYWxsb3cgZm9sZGluZyBvZiBleHByZXNzaW9ucyBzdWNoIGFzOgorLy8vCisvLy8gICAgICAoQSA8IEIpIHwgKEEgPiBCKSAtLT4gKEEgIT0gQikKKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGZpcnN0IGFuZCBzZWNvbmQgcHJlZGljYXRlcyBoYXZlIHRoZQorLy8vIHNhbWUgc2lnbi4gSXMgaWxsZWdhbCB0byBkbzogKEEgdTwgQikgfCAoQSBzPiBCKSAKKy8vLworLy8vIFRocmVlIGJpdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb25kaXRpb24sIGFzIGZvbGxvd3M6CisvLy8gICAwICBBID4gQgorLy8vICAgMSAgQSA9PSBCCisvLy8gICAyICBBIDwgQgorLy8vCisvLy8gPD0+ICBWYWx1ZSAgRGVmaW5pdGlvbgorLy8vIDAwMCAgICAgMCAgIEFsd2F5cyBmYWxzZQorLy8vIDAwMSAgICAgMSAgIEEgPiAgQgorLy8vIDAxMCAgICAgMiAgIEEgPT0gQgorLy8vIDAxMSAgICAgMyAgIEEgPj0gQgorLy8vIDEwMCAgICAgNCAgIEEgPCAgQgorLy8vIDEwMSAgICAgNSAgIEEgIT0gQgorLy8vIDExMCAgICAgNiAgIEEgPD0gQgorLy8vIDExMSAgICAgNyAgIEFsd2F5cyB0cnVlCisvLy8gIAorc3RhdGljIHVuc2lnbmVkIGdldElDbXBDb2RlKGNvbnN0IElDbXBJbnN0ICpJQ0kpIHsKKyAgc3dpdGNoIChJQ0ktPmdldFByZWRpY2F0ZSgpKSB7CisgICAgLy8gRmFsc2UgLT4gMAorICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDogcmV0dXJuIDE7ICAvLyAwMDEKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6IHJldHVybiAxOyAgLy8gMDAxCisgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6ICByZXR1cm4gMjsgIC8vIDAxMAorICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHRTogcmV0dXJuIDM7ICAvLyAwMTEKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR0U6IHJldHVybiAzOyAgLy8gMDExCisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOiByZXR1cm4gNDsgIC8vIDEwMAorICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogcmV0dXJuIDQ7ICAvLyAxMDAKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORTogIHJldHVybiA1OyAgLy8gMTAxCisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxFOiByZXR1cm4gNjsgIC8vIDExMAorICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRTogcmV0dXJuIDY7ICAvLyAxMTAKKyAgICAvLyBUcnVlIC0+IDcKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIElDbXAgcHJlZGljYXRlISIpOworICAgIHJldHVybiAwOworICB9Cit9CisKKy8vLyBnZXRGQ21wQ29kZSAtIFNpbWlsYXIgdG8gZ2V0SUNtcENvZGUgYnV0IGZvciBGQ21wSW5zdC4gVGhpcyBlbmNvZGVzIGEgZmNtcAorLy8vIHByZWRpY2F0ZSBpbnRvIGEgdGhyZWUgYml0IG1hc2suIEl0IGFsc28gcmV0dXJucyB3aGV0aGVyIGl0IGlzIGFuIG9yZGVyZWQKKy8vLyBwcmVkaWNhdGUgYnkgcmVmZXJlbmNlLgorc3RhdGljIHVuc2lnbmVkIGdldEZDbXBDb2RlKEZDbXBJbnN0OjpQcmVkaWNhdGUgQ0MsIGJvb2wgJmlzT3JkZXJlZCkgeworICBpc09yZGVyZWQgPSBmYWxzZTsKKyAgc3dpdGNoIChDQykgeworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09SRDogaXNPcmRlcmVkID0gdHJ1ZTsgcmV0dXJuIDA7ICAvLyAwMDAKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTk86ICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgLy8gMDAwCisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0dUOiBpc09yZGVyZWQgPSB0cnVlOyByZXR1cm4gMTsgIC8vIDAwMQorICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHVDogICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7ICAvLyAwMDEKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PRVE6IGlzT3JkZXJlZCA9IHRydWU7IHJldHVybiAyOyAgLy8gMDEwCisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUVROiAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsgIC8vIDAxMAorICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRTogaXNPcmRlcmVkID0gdHJ1ZTsgcmV0dXJuIDM7ICAvLyAwMTEKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VR0U6ICAgICAgICAgICAgICAgICAgIHJldHVybiAzOyAgLy8gMDExCisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xUOiBpc09yZGVyZWQgPSB0cnVlOyByZXR1cm4gNDsgIC8vIDEwMAorICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMVDogICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7ICAvLyAxMDAKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTkU6IGlzT3JkZXJlZCA9IHRydWU7IHJldHVybiA1OyAgLy8gMTAxCisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5FOiAgICAgICAgICAgICAgICAgICByZXR1cm4gNTsgIC8vIDEwMQorICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MRTogaXNPcmRlcmVkID0gdHJ1ZTsgcmV0dXJuIDY7ICAvLyAxMTAKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTEU6ICAgICAgICAgICAgICAgICAgIHJldHVybiA2OyAgLy8gMTEwCisgICAgLy8gVHJ1ZSAtPiA3CisgIGRlZmF1bHQ6CisgICAgLy8gTm90IGV4cGVjdGluZyBGQ01QX0ZBTFNFIGFuZCBGQ01QX1RSVUU7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBGQ21wIHByZWRpY2F0ZSEiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvLy8gZ2V0SUNtcFZhbHVlIC0gVGhpcyBpcyB0aGUgY29tcGxlbWVudCBvZiBnZXRJQ21wQ29kZSwgd2hpY2ggdHVybnMgYW4KKy8vLyBvcGNvZGUgYW5kIHR3byBvcGVyYW5kcyBpbnRvIGVpdGhlciBhIGNvbnN0YW50IHRydWUgb3IgZmFsc2UsIG9yIGEgYnJhbmQgCisvLy8gbmV3IElDbXAgaW5zdHJ1Y3Rpb24uIFRoZSBzaWduIGlzIHBhc3NlZCBpbiB0byBkZXRlcm1pbmUgd2hpY2gga2luZAorLy8vIG9mIHByZWRpY2F0ZSB0byB1c2UgaW4gdGhlIG5ldyBpY21wIGluc3RydWN0aW9uLgorc3RhdGljIFZhbHVlICpnZXRJQ21wVmFsdWUoYm9vbCBTaWduLCB1bnNpZ25lZCBDb2RlLCBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdENvbWJpbmVyOjpCdWlsZGVyVHkgKkJ1aWxkZXIpIHsKKyAgQ21wSW5zdDo6UHJlZGljYXRlIFByZWQ7CisgIHN3aXRjaCAoQ29kZSkgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiSWxsZWdhbCBJQ21wIGNvZGUhIik7CisgIGNhc2UgMDogLy8gRmFsc2UuCisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoQ21wSW5zdDo6bWFrZUNtcFJlc3VsdFR5cGUoTEhTLT5nZXRUeXBlKCkpLCAwKTsKKyAgY2FzZSAxOiBQcmVkID0gU2lnbiA/IElDbXBJbnN0OjpJQ01QX1NHVCA6IElDbXBJbnN0OjpJQ01QX1VHVDsgYnJlYWs7CisgIGNhc2UgMjogUHJlZCA9IElDbXBJbnN0OjpJQ01QX0VROyBicmVhazsKKyAgY2FzZSAzOiBQcmVkID0gU2lnbiA/IElDbXBJbnN0OjpJQ01QX1NHRSA6IElDbXBJbnN0OjpJQ01QX1VHRTsgYnJlYWs7CisgIGNhc2UgNDogUHJlZCA9IFNpZ24gPyBJQ21wSW5zdDo6SUNNUF9TTFQgOiBJQ21wSW5zdDo6SUNNUF9VTFQ7IGJyZWFrOworICBjYXNlIDU6IFByZWQgPSBJQ21wSW5zdDo6SUNNUF9ORTsgYnJlYWs7CisgIGNhc2UgNjogUHJlZCA9IFNpZ24gPyBJQ21wSW5zdDo6SUNNUF9TTEUgOiBJQ21wSW5zdDo6SUNNUF9VTEU7IGJyZWFrOworICBjYXNlIDc6IC8vIFRydWUuCisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoQ21wSW5zdDo6bWFrZUNtcFJlc3VsdFR5cGUoTEhTLT5nZXRUeXBlKCkpLCAxKTsKKyAgfQorICByZXR1cm4gQnVpbGRlci0+Q3JlYXRlSUNtcChQcmVkLCBMSFMsIFJIUyk7Cit9CisKKy8vLyBnZXRGQ21wVmFsdWUgLSBUaGlzIGlzIHRoZSBjb21wbGVtZW50IG9mIGdldEZDbXBDb2RlLCB3aGljaCB0dXJucyBhbgorLy8vIG9wY29kZSBhbmQgdHdvIG9wZXJhbmRzIGludG8gZWl0aGVyIGEgRkNtcCBpbnN0cnVjdGlvbi4gaXNvcmRlcmVkIGlzIHBhc3NlZAorLy8vIGluIHRvIGRldGVybWluZSB3aGljaCBraW5kIG9mIHByZWRpY2F0ZSB0byB1c2UgaW4gdGhlIG5ldyBmY21wIGluc3RydWN0aW9uLgorc3RhdGljIFZhbHVlICpnZXRGQ21wVmFsdWUoYm9vbCBpc29yZGVyZWQsIHVuc2lnbmVkIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdENvbWJpbmVyOjpCdWlsZGVyVHkgKkJ1aWxkZXIpIHsKKyAgQ21wSW5zdDo6UHJlZGljYXRlIFByZWQ7CisgIHN3aXRjaCAoY29kZSkgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiSWxsZWdhbCBGQ21wIGNvZGUhIik7CisgIGNhc2UgMDogUHJlZCA9IGlzb3JkZXJlZCA/IEZDbXBJbnN0OjpGQ01QX09SRCA6IEZDbXBJbnN0OjpGQ01QX1VOTzsgYnJlYWs7CisgIGNhc2UgMTogUHJlZCA9IGlzb3JkZXJlZCA/IEZDbXBJbnN0OjpGQ01QX09HVCA6IEZDbXBJbnN0OjpGQ01QX1VHVDsgYnJlYWs7CisgIGNhc2UgMjogUHJlZCA9IGlzb3JkZXJlZCA/IEZDbXBJbnN0OjpGQ01QX09FUSA6IEZDbXBJbnN0OjpGQ01QX1VFUTsgYnJlYWs7CisgIGNhc2UgMzogUHJlZCA9IGlzb3JkZXJlZCA/IEZDbXBJbnN0OjpGQ01QX09HRSA6IEZDbXBJbnN0OjpGQ01QX1VHRTsgYnJlYWs7CisgIGNhc2UgNDogUHJlZCA9IGlzb3JkZXJlZCA/IEZDbXBJbnN0OjpGQ01QX09MVCA6IEZDbXBJbnN0OjpGQ01QX1VMVDsgYnJlYWs7CisgIGNhc2UgNTogUHJlZCA9IGlzb3JkZXJlZCA/IEZDbXBJbnN0OjpGQ01QX09ORSA6IEZDbXBJbnN0OjpGQ01QX1VORTsgYnJlYWs7CisgIGNhc2UgNjogUHJlZCA9IGlzb3JkZXJlZCA/IEZDbXBJbnN0OjpGQ01QX09MRSA6IEZDbXBJbnN0OjpGQ01QX1VMRTsgYnJlYWs7CisgIGNhc2UgNzogcmV0dXJuIENvbnN0YW50SW50OjpnZXRUcnVlKExIUy0+Z2V0Q29udGV4dCgpKTsKKyAgfQorICByZXR1cm4gQnVpbGRlci0+Q3JlYXRlRkNtcChQcmVkLCBMSFMsIFJIUyk7Cit9CisKKy8vLyBQcmVkaWNhdGVzRm9sZGFibGUgLSBSZXR1cm4gdHJ1ZSBpZiBib3RoIHByZWRpY2F0ZXMgbWF0Y2ggc2lnbiBvciBpZiBhdAorLy8vIGxlYXN0IG9uZSBvZiB0aGVtIGlzIGFuIGVxdWFsaXR5IGNvbXBhcmlzb24gKHdoaWNoIGlzIHNpZ25sZXNzKS4KK3N0YXRpYyBib29sIFByZWRpY2F0ZXNGb2xkYWJsZShJQ21wSW5zdDo6UHJlZGljYXRlIHAxLCBJQ21wSW5zdDo6UHJlZGljYXRlIHAyKSB7CisgIHJldHVybiAoQ21wSW5zdDo6aXNTaWduZWQocDEpID09IENtcEluc3Q6OmlzU2lnbmVkKHAyKSkgfHwKKyAgICAgICAgIChDbXBJbnN0Ojppc1NpZ25lZChwMSkgJiYgSUNtcEluc3Q6OmlzRXF1YWxpdHkocDIpKSB8fAorICAgICAgICAgKENtcEluc3Q6OmlzU2lnbmVkKHAyKSAmJiBJQ21wSW5zdDo6aXNFcXVhbGl0eShwMSkpOworfQorCisvLyBPcHRBbmRPcCAtIFRoaXMgaGFuZGxlcyBleHByZXNzaW9ucyBvZiB0aGUgZm9ybSAoKHZhbCBPUCBDMSkgJiBDMikuICBXaGVyZQorLy8gdGhlIE9wIHBhcmFtZXRlciBpcyAnT1AnLCBPcFJIUyBpcyAnQzEnLCBhbmQgQW5kUkhTIGlzICdDMicuICBPcCBpcworLy8gZ3VhcmFudGVlZCB0byBiZSBhIGJpbmFyeSBvcGVyYXRvci4KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6Ok9wdEFuZE9wKEluc3RydWN0aW9uICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50ICpPcFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50ICpBbmRSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvciAmVGhlQW5kKSB7CisgIFZhbHVlICpYID0gT3AtPmdldE9wZXJhbmQoMCk7CisgIENvbnN0YW50ICpUb2dldGhlciA9IDA7CisgIGlmICghT3AtPmlzU2hpZnQoKSkKKyAgICBUb2dldGhlciA9IENvbnN0YW50RXhwcjo6Z2V0QW5kKEFuZFJIUywgT3BSSFMpOworCisgIHN3aXRjaCAoT3AtPmdldE9wY29kZSgpKSB7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgICBpZiAoT3AtPmhhc09uZVVzZSgpKSB7CisgICAgICAvLyAoWCBeIEMxKSAmIEMyIC0tPiAoWCAmIEMyKSBeIChDMSZDMikKKyAgICAgIFZhbHVlICpBbmQgPSBCdWlsZGVyLT5DcmVhdGVBbmQoWCwgQW5kUkhTKTsKKyAgICAgIEFuZC0+dGFrZU5hbWUoT3ApOworICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVYb3IoQW5kLCBUb2dldGhlcik7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpPcjoKKyAgICBpZiAoVG9nZXRoZXIgPT0gQW5kUkhTKSAvLyAoWCB8IEMpICYgQyAtLT4gQworICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoVGhlQW5kLCBBbmRSSFMpOworCisgICAgaWYgKE9wLT5oYXNPbmVVc2UoKSAmJiBUb2dldGhlciAhPSBPcFJIUykgeworICAgICAgLy8gKFggfCBDMSkgJiBDMiAtLT4gKFggfCAoQzEmQzIpKSAmIEMyCisgICAgICBWYWx1ZSAqT3IgPSBCdWlsZGVyLT5DcmVhdGVPcihYLCBUb2dldGhlcik7CisgICAgICBPci0+dGFrZU5hbWUoT3ApOworICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoT3IsIEFuZFJIUyk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgICAgaWYgKE9wLT5oYXNPbmVVc2UoKSkgeworICAgICAgLy8gQWRkaW5nIGEgb25lIHRvIGEgc2luZ2xlIGJpdCBiaXQtZmllbGQgc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGFuIFhPUgorICAgICAgLy8gb2YgdGhlIGJpdC4gIEZpcnN0IHRoaW5nIHRvIGNoZWNrIGlzIHRvIHNlZSBpZiB0aGlzIEFORCBpcyB3aXRoIGEKKyAgICAgIC8vIHNpbmdsZSBiaXQgY29uc3RhbnQuCisgICAgICBjb25zdCBBUEludCAmQW5kUkhTViA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEFuZFJIUyktPmdldFZhbHVlKCk7CisKKyAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIGJpdCBzZXQuCisgICAgICBpZiAoQW5kUkhTVi5pc1Bvd2VyT2YyKCkpIHsKKyAgICAgICAgLy8gT2ssIGF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCB3ZSBhcmUgbWFza2luZyB0aGUgcmVzdWx0IG9mIHRoZQorICAgICAgICAvLyBBREQgZG93biB0byBleGFjdGx5IG9uZSBiaXQuICBJZiB0aGUgY29uc3RhbnQgd2UgYXJlIGFkZGluZyBoYXMKKyAgICAgICAgLy8gbm8gYml0cyBzZXQgYmVsb3cgdGhpcyBiaXQsIHRoZW4gd2UgY2FuIGVsaW1pbmF0ZSB0aGUgQURELgorICAgICAgICBjb25zdCBBUEludCYgQWRkUkhTID0gY2FzdDxDb25zdGFudEludD4oT3BSSFMpLT5nZXRWYWx1ZSgpOworCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBhbnkgYml0cyBiZWxvdyB0aGUgb25lIGJpdCBzZXQgaW4gQW5kUkhTViBhcmUgc2V0LgorICAgICAgICBpZiAoKEFkZFJIUyAmIChBbmRSSFNWLTEpKSA9PSAwKSB7CisgICAgICAgICAgLy8gSWYgbm90LCB0aGUgb25seSB0aGluZyB0aGF0IGNhbiBlZmZlY3QgdGhlIG91dHB1dCBvZiB0aGUgQU5EIGlzCisgICAgICAgICAgLy8gdGhlIGJpdCBzcGVjaWZpZWQgYnkgQW5kUkhTVi4gIElmIHRoYXQgYml0IGlzIHNldCwgdGhlIGVmZmVjdCBvZgorICAgICAgICAgIC8vIHRoZSBYT1IgaXMgdG8gdG9nZ2xlIHRoZSBiaXQuICBJZiBpdCBpcyBjbGVhciwgdGhlbiB0aGUgQUREIGhhcworICAgICAgICAgIC8vIG5vIGVmZmVjdC4KKyAgICAgICAgICBpZiAoKEFkZFJIUyAmIEFuZFJIU1YpID09IDApIHsgLy8gQml0IGlzIG5vdCBzZXQsIG5vb3AKKyAgICAgICAgICAgIFRoZUFuZC5zZXRPcGVyYW5kKDAsIFgpOworICAgICAgICAgICAgcmV0dXJuICZUaGVBbmQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFB1bGwgdGhlIFhPUiBvdXQgb2YgdGhlIEFORC4KKyAgICAgICAgICAgIFZhbHVlICpOZXdBbmQgPSBCdWlsZGVyLT5DcmVhdGVBbmQoWCwgQW5kUkhTKTsKKyAgICAgICAgICAgIE5ld0FuZC0+dGFrZU5hbWUoT3ApOworICAgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVYb3IoTmV3QW5kLCBBbmRSSFMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIEluc3RydWN0aW9uOjpTaGw6IHsKKyAgICAvLyBXZSBrbm93IHRoYXQgdGhlIEFORCB3aWxsIG5vdCBwcm9kdWNlIGFueSBvZiB0aGUgYml0cyBzaGlmdGVkIGluLCBzbyBpZgorICAgIC8vIHRoZSBhbmRlZCBjb25zdGFudCBpbmNsdWRlcyB0aGVtLCBjbGVhciB0aGVtIG5vdyEKKyAgICAvLworICAgIHVpbnQzMl90IEJpdFdpZHRoID0gQW5kUkhTLT5nZXRUeXBlKCktPmdldEJpdFdpZHRoKCk7CisgICAgdWludDMyX3QgT3BSSFNWYWwgPSBPcFJIUy0+Z2V0TGltaXRlZFZhbHVlKEJpdFdpZHRoKTsKKyAgICBBUEludCBTaGxNYXNrKEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgQml0V2lkdGgtT3BSSFNWYWwpKTsKKyAgICBDb25zdGFudEludCAqQ0kgPSBDb25zdGFudEludDo6Z2V0KEFuZFJIUy0+Z2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kUkhTLT5nZXRWYWx1ZSgpICYgU2hsTWFzayk7CisKKyAgICBpZiAoQ0ktPmdldFZhbHVlKCkgPT0gU2hsTWFzaykgeyAKKyAgICAvLyBNYXNraW5nIG91dCBiaXRzIHRoYXQgdGhlIHNoaWZ0IGFscmVhZHkgbWFza3MKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFRoZUFuZCwgT3ApOyAgIC8vIE5vIG5lZWQgZm9yIHRoZSBhbmQuCisgICAgfSBlbHNlIGlmIChDSSAhPSBBbmRSSFMpIHsgICAgICAgICAgICAgICAgICAvLyBSZWR1Y2luZyBiaXRzIHNldCBpbiBhbmQuCisgICAgICBUaGVBbmQuc2V0T3BlcmFuZCgxLCBDSSk7CisgICAgICByZXR1cm4gJlRoZUFuZDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjogeworICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgQU5EIHdpbGwgbm90IHByb2R1Y2UgYW55IG9mIHRoZSBiaXRzIHNoaWZ0ZWQgaW4sIHNvIGlmCisgICAgLy8gdGhlIGFuZGVkIGNvbnN0YW50IGluY2x1ZGVzIHRoZW0sIGNsZWFyIHRoZW0gbm93ISAgVGhpcyBvbmx5IGFwcGxpZXMgdG8KKyAgICAvLyB1bnNpZ25lZCBzaGlmdHMsIGJlY2F1c2UgYSBzaWduZWQgc2hyIG1heSBicmluZyBpbiBzZXQgYml0cyEKKyAgICAvLworICAgIHVpbnQzMl90IEJpdFdpZHRoID0gQW5kUkhTLT5nZXRUeXBlKCktPmdldEJpdFdpZHRoKCk7CisgICAgdWludDMyX3QgT3BSSFNWYWwgPSBPcFJIUy0+Z2V0TGltaXRlZFZhbHVlKEJpdFdpZHRoKTsKKyAgICBBUEludCBTaHJNYXNrKEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLCBCaXRXaWR0aCAtIE9wUkhTVmFsKSk7CisgICAgQ29uc3RhbnRJbnQgKkNJID0gQ29uc3RhbnRJbnQ6OmdldChPcC0+Z2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kUkhTLT5nZXRWYWx1ZSgpICYgU2hyTWFzayk7CisKKyAgICBpZiAoQ0ktPmdldFZhbHVlKCkgPT0gU2hyTWFzaykgeyAgIAorICAgIC8vIE1hc2tpbmcgb3V0IGJpdHMgdGhhdCB0aGUgc2hpZnQgYWxyZWFkeSBtYXNrcy4KKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFRoZUFuZCwgT3ApOworICAgIH0gZWxzZSBpZiAoQ0kgIT0gQW5kUkhTKSB7CisgICAgICBUaGVBbmQuc2V0T3BlcmFuZCgxLCBDSSk7ICAvLyBSZWR1Y2UgYml0cyBzZXQgaW4gYW5kIGNzdC4KKyAgICAgIHJldHVybiAmVGhlQW5kOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpBU2hyOgorICAgIC8vIFNpZ25lZCBzaHIuCisgICAgLy8gU2VlIGlmIHRoaXMgaXMgc2hpZnRpbmcgaW4gc29tZSBzaWduIGV4dGVuc2lvbiwgdGhlbiBtYXNraW5nIGl0IG91dAorICAgIC8vIHdpdGggYW4gYW5kLgorICAgIGlmIChPcC0+aGFzT25lVXNlKCkpIHsKKyAgICAgIHVpbnQzMl90IEJpdFdpZHRoID0gQW5kUkhTLT5nZXRUeXBlKCktPmdldEJpdFdpZHRoKCk7CisgICAgICB1aW50MzJfdCBPcFJIU1ZhbCA9IE9wUkhTLT5nZXRMaW1pdGVkVmFsdWUoQml0V2lkdGgpOworICAgICAgQVBJbnQgU2hyTWFzayhBUEludDo6Z2V0TG93Qml0c1NldChCaXRXaWR0aCwgQml0V2lkdGggLSBPcFJIU1ZhbCkpOworICAgICAgQ29uc3RhbnQgKkMgPSBDb25zdGFudEludDo6Z2V0KE9wLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kUkhTLT5nZXRWYWx1ZSgpICYgU2hyTWFzayk7CisgICAgICBpZiAoQyA9PSBBbmRSSFMpIHsgICAgICAgICAgLy8gTWFza2luZyBvdXQgYml0cyBzaGlmdGVkIGluLgorICAgICAgICAvLyAoVmFsIGFzaHIgQzEpICYgQzIgLT4gKFZhbCBsc2hyIEMxKSAmIEMyCisgICAgICAgIC8vIE1ha2UgdGhlIGFyZ3VtZW50IHVuc2lnbmVkLgorICAgICAgICBWYWx1ZSAqU2hWYWwgPSBPcC0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgU2hWYWwgPSBCdWlsZGVyLT5DcmVhdGVMU2hyKFNoVmFsLCBPcFJIUyk7CisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKFNoVmFsLCBBbmRSSFMpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworCisvLy8gSW5zZXJ0UmFuZ2VUZXN0IC0gRW1pdCBhIGNvbXB1dGF0aW9uIG9mOiAoViA+PSBMbyAmJiBWIDwgSGkpIGlmIEluc2lkZSBpcworLy8vIHRydWUsIG90aGVyd2lzZSAoViA8IExvIHx8IFYgPj0gSGkpLiAgSW4gcHJhdGljZSwgd2UgZW1pdCB0aGUgbW9yZSBlZmZpY2llbnQKKy8vLyAoVi1MbykgPHUgSGktTG8uICBUaGlzIG1ldGhvZCBleHBlY3RzIHRoYXQgTG8gPD0gSGkuIGlzU2lnbmVkIGluZGljYXRlcworLy8vIHdoZXRoZXIgdG8gdHJlYXQgdGhlIFYsIExvIGFuZCBISSBhcyBzaWduZWQgb3Igbm90LiBJQiBpcyB0aGUgbG9jYXRpb24gdG8KKy8vLyBpbnNlcnQgbmV3IGluc3RydWN0aW9ucy4KK1ZhbHVlICpJbnN0Q29tYmluZXI6Okluc2VydFJhbmdlVGVzdChWYWx1ZSAqViwgQ29uc3RhbnQgKkxvLCBDb25zdGFudCAqSGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwgYm9vbCBJbnNpZGUpIHsKKyAgYXNzZXJ0KGNhc3Q8Q29uc3RhbnRJbnQ+KENvbnN0YW50RXhwcjo6Z2V0SUNtcCgoaXNTaWduZWQgPyAKKyAgICAgICAgICAgIElDbXBJbnN0OjpJQ01QX1NMRTpJQ21wSW5zdDo6SUNNUF9VTEUpLCBMbywgSGkpKS0+Z2V0WkV4dFZhbHVlKCkgJiYKKyAgICAgICAgICJMbyBpcyBub3QgPD0gSGkgaW4gcmFuZ2UgZW1pc3Npb24gY29kZSEiKTsKKyAgICAKKyAgaWYgKEluc2lkZSkgeworICAgIGlmIChMbyA9PSBIaSkgIC8vIFRyaXZpYWxseSBmYWxzZS4KKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0RmFsc2UoVi0+Z2V0Q29udGV4dCgpKTsKKworICAgIC8vIFYgPj0gTWluICYmIFYgPCBIaSAtLT4gViA8IEhpCisgICAgaWYgKGNhc3Q8Q29uc3RhbnRJbnQ+KExvKS0+aXNNaW5WYWx1ZShpc1NpZ25lZCkpIHsKKyAgICAgIElDbXBJbnN0OjpQcmVkaWNhdGUgcHJlZCA9IChpc1NpZ25lZCA/IAorICAgICAgICBJQ21wSW5zdDo6SUNNUF9TTFQgOiBJQ21wSW5zdDo6SUNNUF9VTFQpOworICAgICAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUlDbXAocHJlZCwgViwgSGkpOworICAgIH0KKworICAgIC8vIEVtaXQgVi1MbyA8dSBIaS1MbworICAgIENvbnN0YW50ICpOZWdMbyA9IENvbnN0YW50RXhwcjo6Z2V0TmVnKExvKTsKKyAgICBWYWx1ZSAqQWRkID0gQnVpbGRlci0+Q3JlYXRlQWRkKFYsIE5lZ0xvKTsKKyAgICBDb25zdGFudCAqVXBwZXJCb3VuZCA9IENvbnN0YW50RXhwcjo6Z2V0QWRkKE5lZ0xvLCBIaSk7CisgICAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUlDbXBVTFQoQWRkLCBVcHBlckJvdW5kKTsKKyAgfQorCisgIGlmIChMbyA9PSBIaSkgIC8vIFRyaXZpYWxseSB0cnVlLgorICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0VHJ1ZShWLT5nZXRDb250ZXh0KCkpOworCisgIC8vIFYgPCBNaW4gfHwgViA+PSBIaSAtPiBWID4gSGktMQorICBIaSA9IFN1Yk9uZShjYXN0PENvbnN0YW50SW50PihIaSkpOworICBpZiAoY2FzdDxDb25zdGFudEludD4oTG8pLT5pc01pblZhbHVlKGlzU2lnbmVkKSkgeworICAgIElDbXBJbnN0OjpQcmVkaWNhdGUgcHJlZCA9IChpc1NpZ25lZCA/IAorICAgICAgICBJQ21wSW5zdDo6SUNNUF9TR1QgOiBJQ21wSW5zdDo6SUNNUF9VR1QpOworICAgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVJQ21wKHByZWQsIFYsIEhpKTsKKyAgfQorCisgIC8vIEVtaXQgVi1MbyA+dSBIaS0xLUxvCisgIC8vIE5vdGUgdGhhdCBIaSBoYXMgYWxyZWFkeSBoYWQgb25lIHN1YnRyYWN0ZWQgZnJvbSBpdCwgYWJvdmUuCisgIENvbnN0YW50SW50ICpOZWdMbyA9IGNhc3Q8Q29uc3RhbnRJbnQ+KENvbnN0YW50RXhwcjo6Z2V0TmVnKExvKSk7CisgIFZhbHVlICpBZGQgPSBCdWlsZGVyLT5DcmVhdGVBZGQoViwgTmVnTG8pOworICBDb25zdGFudCAqTG93ZXJCb3VuZCA9IENvbnN0YW50RXhwcjo6Z2V0QWRkKE5lZ0xvLCBIaSk7CisgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVJQ21wVUdUKEFkZCwgTG93ZXJCb3VuZCk7Cit9CisKKy8vIGlzUnVuT2ZPbmVzIC0gUmV0dXJucyB0cnVlIGlmZiBWYWwgY29uc2lzdHMgb2Ygb25lIGNvbnRpZ3VvdXMgcnVuIG9mIDFzIHdpdGgKKy8vIGFueSBudW1iZXIgb2YgMHMgb24gZWl0aGVyIHNpZGUuICBUaGUgMXMgYXJlIGFsbG93ZWQgdG8gd3JhcCBmcm9tIExTQiB0bworLy8gTVNCLCBzbyAweDAwMEZGRjAsIDB4MDAwMEZGRkYsIGFuZCAweEZGMDAwMEZGIGFyZSBhbGwgcnVucy4gIDB4MEYwRjAwMDAgaXMKKy8vIG5vdCwgc2luY2UgYWxsIDFzIGFyZSBub3QgY29udGlndW91cy4KK3N0YXRpYyBib29sIGlzUnVuT2ZPbmVzKENvbnN0YW50SW50ICpWYWwsIHVpbnQzMl90ICZNQiwgdWludDMyX3QgJk1FKSB7CisgIGNvbnN0IEFQSW50JiBWID0gVmFsLT5nZXRWYWx1ZSgpOworICB1aW50MzJfdCBCaXRXaWR0aCA9IFZhbC0+Z2V0VHlwZSgpLT5nZXRCaXRXaWR0aCgpOworICBpZiAoIUFQSW50T3BzOjppc1NoaWZ0ZWRNYXNrKEJpdFdpZHRoLCBWKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIGxvb2sgZm9yIHRoZSBmaXJzdCB6ZXJvIGJpdCBhZnRlciB0aGUgcnVuIG9mIG9uZXMKKyAgTUIgPSBCaXRXaWR0aCAtICgoViAtIDEpIF4gVikuY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgLy8gbG9vayBmb3IgdGhlIGZpcnN0IG5vbi16ZXJvIGJpdAorICBNRSA9IFYuZ2V0QWN0aXZlQml0cygpOyAKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBGb2xkTG9naWNhbFBsdXNBbmQgLSBUaGlzIGlzIHBhcnQgb2YgYW4gZXhwcmVzc2lvbiAoTEhTICsvLSBSSFMpICYgTWFzaywKKy8vLyB3aGVyZSBpc1N1YiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG9wZXJhdG9yIGlzIGEgc3ViLiAgSWYgd2UgY2FuIGZvbGQgb25lIG9mCisvLy8gdGhlIGZvbGxvd2luZyB4Zm9ybXM6CisvLy8gCisvLy8gKChBICYgTikgKy8tIEIpICYgTWFzayAtPiAoQSArLy0gQikgJiBNYXNrIGlmZiBOJk1hc2sgPT0gTWFzaworLy8vICgoQSB8IE4pICsvLSBCKSAmIE1hc2sgLT4gKEEgKy8tIEIpICYgTWFzayBpZmYgTiZNYXNrID09IDAKKy8vLyAoKEEgXiBOKSArLy0gQikgJiBNYXNrIC0+IChBICsvLSBCKSAmIE1hc2sgaWZmIE4mTWFzayA9PSAwCisvLy8KKy8vLyByZXR1cm4gKEEgKy8tIEIpLgorLy8vCitWYWx1ZSAqSW5zdENvbWJpbmVyOjpGb2xkTG9naWNhbFBsdXNBbmQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludCAqTWFzaywgYm9vbCBpc1N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAmSSkgeworICBJbnN0cnVjdGlvbiAqTEhTSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihMSFMpOworICBpZiAoIUxIU0kgfHwgTEhTSS0+Z2V0TnVtT3BlcmFuZHMoKSAhPSAyIHx8CisgICAgICAhaXNhPENvbnN0YW50SW50PihMSFNJLT5nZXRPcGVyYW5kKDEpKSkgcmV0dXJuIDA7CisKKyAgQ29uc3RhbnRJbnQgKk4gPSBjYXN0PENvbnN0YW50SW50PihMSFNJLT5nZXRPcGVyYW5kKDEpKTsKKworICBzd2l0Y2ggKExIU0ktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IHJldHVybiAwOworICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgaWYgKENvbnN0YW50RXhwcjo6Z2V0QW5kKE4sIE1hc2spID09IE1hc2spIHsKKyAgICAgIC8vIElmIHRoZSBBbmRSSFMgaXMgYSBwb3dlciBvZiB0d28gbWludXMgb25lICgwKzErKSwgdGhpcyBpcyBzaW1wbGUuCisgICAgICBpZiAoKE1hc2stPmdldFZhbHVlKCkuY291bnRMZWFkaW5nWmVyb3MoKSArIAorICAgICAgICAgICBNYXNrLT5nZXRWYWx1ZSgpLmNvdW50UG9wdWxhdGlvbigpKSA9PSAKKyAgICAgICAgICBNYXNrLT5nZXRWYWx1ZSgpLmdldEJpdFdpZHRoKCkpCisgICAgICAgIGJyZWFrOworCisgICAgICAvLyBPdGhlcndpc2UsIGlmIE1hc2sgaXMgMCsxKzArLCBhbmQgaWYgQiBpcyBrbm93biB0byBoYXZlIHRoZSBsb3cgMCsKKyAgICAgIC8vIHBhcnQsIHdlIGRvbid0IG5lZWQgYW55IGV4cGxpY2l0IG1hc2tzIHRvIHRha2UgdGhlbSBvdXQgb2YgQS4gIElmIHRoYXQKKyAgICAgIC8vIGlzIGFsbCBOIGlzLCBpZ25vcmUgaXQuCisgICAgICB1aW50MzJfdCBNQiA9IDAsIE1FID0gMDsKKyAgICAgIGlmIChpc1J1bk9mT25lcyhNYXNrLCBNQiwgTUUpKSB7ICAvLyBiZWdpbi9lbmQgYml0IG9mIHJ1biwgaW5jbHVzaXZlCisgICAgICAgIHVpbnQzMl90IEJpdFdpZHRoID0gY2FzdDxJbnRlZ2VyVHlwZT4oUkhTLT5nZXRUeXBlKCkpLT5nZXRCaXRXaWR0aCgpOworICAgICAgICBBUEludCBNYXNrKEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLCBNQi0xKSk7CisgICAgICAgIGlmIChNYXNrZWRWYWx1ZUlzWmVybyhSSFMsIE1hc2spKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgICAvLyBJZiB0aGUgQW5kUkhTIGlzIGEgcG93ZXIgb2YgdHdvIG1pbnVzIG9uZSAoMCsxKyksIGFuZCBOJk1hc2sgPT0gMAorICAgIGlmICgoTWFzay0+Z2V0VmFsdWUoKS5jb3VudExlYWRpbmdaZXJvcygpICsgCisgICAgICAgICBNYXNrLT5nZXRWYWx1ZSgpLmNvdW50UG9wdWxhdGlvbigpKSA9PSBNYXNrLT5nZXRWYWx1ZSgpLmdldEJpdFdpZHRoKCkKKyAgICAgICAgJiYgQ29uc3RhbnRFeHByOjpnZXRBbmQoTiwgTWFzayktPmlzTnVsbFZhbHVlKCkpCisgICAgICBicmVhazsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaWYgKGlzU3ViKQorICAgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVTdWIoTEhTSS0+Z2V0T3BlcmFuZCgwKSwgUkhTKTsKKyAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUFkZChMSFNJLT5nZXRPcGVyYW5kKDApLCBSSFMpOworfQorCisvLy8gRm9sZEFuZE9mSUNtcHMgLSBGb2xkIChpY21wKSYoaWNtcCkgaWYgcG9zc2libGUuCitWYWx1ZSAqSW5zdENvbWJpbmVyOjpGb2xkQW5kT2ZJQ21wcyhJQ21wSW5zdCAqTEhTLCBJQ21wSW5zdCAqUkhTKSB7CisgIElDbXBJbnN0OjpQcmVkaWNhdGUgTEhTQ0MgPSBMSFMtPmdldFByZWRpY2F0ZSgpLCBSSFNDQyA9IFJIUy0+Z2V0UHJlZGljYXRlKCk7CisKKyAgLy8gKGljbXAxIEEsIEIpICYgKGljbXAyIEEsIEIpIC0tPiAoaWNtcDMgQSwgQikKKyAgaWYgKFByZWRpY2F0ZXNGb2xkYWJsZShMSFNDQywgUkhTQ0MpKSB7CisgICAgaWYgKExIUy0+Z2V0T3BlcmFuZCgwKSA9PSBSSFMtPmdldE9wZXJhbmQoMSkgJiYKKyAgICAgICAgTEhTLT5nZXRPcGVyYW5kKDEpID09IFJIUy0+Z2V0T3BlcmFuZCgwKSkKKyAgICAgIExIUy0+c3dhcE9wZXJhbmRzKCk7CisgICAgaWYgKExIUy0+Z2V0T3BlcmFuZCgwKSA9PSBSSFMtPmdldE9wZXJhbmQoMCkgJiYKKyAgICAgICAgTEhTLT5nZXRPcGVyYW5kKDEpID09IFJIUy0+Z2V0T3BlcmFuZCgxKSkgeworICAgICAgVmFsdWUgKk9wMCA9IExIUy0+Z2V0T3BlcmFuZCgwKSwgKk9wMSA9IExIUy0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgIHVuc2lnbmVkIENvZGUgPSBnZXRJQ21wQ29kZShMSFMpICYgZ2V0SUNtcENvZGUoUkhTKTsKKyAgICAgIGJvb2wgaXNTaWduZWQgPSBMSFMtPmlzU2lnbmVkKCkgfHwgUkhTLT5pc1NpZ25lZCgpOworICAgICAgcmV0dXJuIGdldElDbXBWYWx1ZShpc1NpZ25lZCwgQ29kZSwgT3AwLCBPcDEsIEJ1aWxkZXIpOworICAgIH0KKyAgfQorICAKKyAgLy8gVGhpcyBvbmx5IGhhbmRsZXMgaWNtcCBvZiBjb25zdGFudHM6IChpY21wMSBBLCBDMSkgJiAoaWNtcDIgQiwgQzIpLgorICBWYWx1ZSAqVmFsID0gTEhTLT5nZXRPcGVyYW5kKDApLCAqVmFsMiA9IFJIUy0+Z2V0T3BlcmFuZCgwKTsKKyAgQ29uc3RhbnRJbnQgKkxIU0NzdCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihMSFMtPmdldE9wZXJhbmQoMSkpOworICBDb25zdGFudEludCAqUkhTQ3N0ID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFJIUy0+Z2V0T3BlcmFuZCgxKSk7CisgIGlmIChMSFNDc3QgPT0gMCB8fCBSSFNDc3QgPT0gMCkgcmV0dXJuIDA7CisgIAorICBpZiAoTEhTQ3N0ID09IFJIU0NzdCAmJiBMSFNDQyA9PSBSSFNDQykgeworICAgIC8vIChpY21wIHVsdCBBLCBDKSAmIChpY21wIHVsdCBCLCBDKSAtLT4gKGljbXAgdWx0IChBfEIpLCBDKQorICAgIC8vIHdoZXJlIEMgaXMgYSBwb3dlciBvZiAyCisgICAgaWYgKExIU0NDID09IElDbXBJbnN0OjpJQ01QX1VMVCAmJgorICAgICAgICBMSFNDc3QtPmdldFZhbHVlKCkuaXNQb3dlck9mMigpKSB7CisgICAgICBWYWx1ZSAqTmV3T3IgPSBCdWlsZGVyLT5DcmVhdGVPcihWYWwsIFZhbDIpOworICAgICAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUlDbXAoTEhTQ0MsIE5ld09yLCBMSFNDc3QpOworICAgIH0KKyAgICAKKyAgICAvLyAoaWNtcCBlcSBBLCAwKSAmIChpY21wIGVxIEIsIDApIC0tPiAoaWNtcCBlcSAoQXxCKSwgMCkKKyAgICBpZiAoTEhTQ0MgPT0gSUNtcEluc3Q6OklDTVBfRVEgJiYgTEhTQ3N0LT5pc1plcm8oKSkgeworICAgICAgVmFsdWUgKk5ld09yID0gQnVpbGRlci0+Q3JlYXRlT3IoVmFsLCBWYWwyKTsKKyAgICAgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVJQ21wKExIU0NDLCBOZXdPciwgTEhTQ3N0KTsKKyAgICB9CisgICAgCisgICAgLy8gKGljbXAgbmUgKEEgJiBDMSksIDApICYgKGljbXAgbmUgKEEgJiBDMiksIDApIC0tPgorICAgIC8vIChpY21wIGVxIChBICYgKEMxfEMyKSksIChDMXxDMikpIHdoZXJlIEMxIGFuZCBDMiBhcmUgbm9uLXplcm8gUE9UCisgICAgaWYgKExIU0NDID09IElDbXBJbnN0OjpJQ01QX05FICYmIExIU0NzdC0+aXNaZXJvKCkpIHsKKyAgICAgIFZhbHVlICpPcDEgPSAwLCAqT3AyID0gMDsKKyAgICAgIENvbnN0YW50SW50ICpDSTEgPSAwLCAqQ0kyID0gMDsKKyAgICAgIGlmIChtYXRjaChMSFMtPmdldE9wZXJhbmQoMCksIG1fQW5kKG1fVmFsdWUoT3AxKSwgbV9Db25zdGFudEludChDSTEpKSkgJiYKKyAgICAgICAgICBtYXRjaChSSFMtPmdldE9wZXJhbmQoMCksIG1fQW5kKG1fVmFsdWUoT3AyKSwgbV9Db25zdGFudEludChDSTIpKSkpIHsKKyAgICAgICAgaWYgKE9wMSA9PSBPcDIgJiYgIUNJMS0+aXNaZXJvKCkgJiYgIUNJMi0+aXNaZXJvKCkgJiYKKyAgICAgICAgICAgIENJMS0+Z2V0VmFsdWUoKS5pc1Bvd2VyT2YyKCkgJiYgQ0kyLT5nZXRWYWx1ZSgpLmlzUG93ZXJPZjIoKSkgeworICAgICAgICAgIENvbnN0YW50ICpDb25zdE9yID0gQ29uc3RhbnRFeHByOjpnZXRPcihDSTEsIENJMik7CisgICAgICAgICAgVmFsdWUgKk5ld0FuZCA9IEJ1aWxkZXItPkNyZWF0ZUFuZChPcDEsIENvbnN0T3IpOworICAgICAgICAgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVJQ21wKElDbXBJbnN0OjpJQ01QX0VRLCBOZXdBbmQsIENvbnN0T3IpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvLyBGcm9tIGhlcmUgb24sIHdlIG9ubHkgaGFuZGxlOgorICAvLyAgICAoaWNtcDEgQSwgQzEpICYgKGljbXAyIEEsIEMyKSAtLT4gc29tZXRoaW5nIHNpbXBsZXIuCisgIGlmIChWYWwgIT0gVmFsMikgcmV0dXJuIDA7CisgIAorICAvLyBJQ01QX1tVU11bR0xdRSBYLCBDU1QgaXMgZm9sZGVkIHRvIElDTVBfW1VTXVtHTF1UIGVsc2V3aGVyZS4KKyAgaWYgKExIU0NDID09IElDbXBJbnN0OjpJQ01QX1VHRSB8fCBMSFNDQyA9PSBJQ21wSW5zdDo6SUNNUF9VTEUgfHwKKyAgICAgIFJIU0NDID09IElDbXBJbnN0OjpJQ01QX1VHRSB8fCBSSFNDQyA9PSBJQ21wSW5zdDo6SUNNUF9VTEUgfHwKKyAgICAgIExIU0NDID09IElDbXBJbnN0OjpJQ01QX1NHRSB8fCBMSFNDQyA9PSBJQ21wSW5zdDo6SUNNUF9TTEUgfHwKKyAgICAgIFJIU0NDID09IElDbXBJbnN0OjpJQ01QX1NHRSB8fCBSSFNDQyA9PSBJQ21wSW5zdDo6SUNNUF9TTEUpCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBXZSBjYW4ndCBmb2xkICh1Z3QgeCwgQykgJiAoc2d0IHgsIEMyKS4KKyAgaWYgKCFQcmVkaWNhdGVzRm9sZGFibGUoTEhTQ0MsIFJIU0NDKSkKKyAgICByZXR1cm4gMDsKKyAgICAKKyAgLy8gRW5zdXJlIHRoYXQgdGhlIGxhcmdlciBjb25zdGFudCBpcyBvbiB0aGUgUkhTLgorICBib29sIFNob3VsZFN3YXA7CisgIGlmIChDbXBJbnN0Ojppc1NpZ25lZChMSFNDQykgfHwKKyAgICAgIChJQ21wSW5zdDo6aXNFcXVhbGl0eShMSFNDQykgJiYgCisgICAgICAgQ21wSW5zdDo6aXNTaWduZWQoUkhTQ0MpKSkKKyAgICBTaG91bGRTd2FwID0gTEhTQ3N0LT5nZXRWYWx1ZSgpLnNndChSSFNDc3QtPmdldFZhbHVlKCkpOworICBlbHNlCisgICAgU2hvdWxkU3dhcCA9IExIU0NzdC0+Z2V0VmFsdWUoKS51Z3QoUkhTQ3N0LT5nZXRWYWx1ZSgpKTsKKyAgICAKKyAgaWYgKFNob3VsZFN3YXApIHsKKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgIHN0ZDo6c3dhcChMSFNDc3QsIFJIU0NzdCk7CisgICAgc3RkOjpzd2FwKExIU0NDLCBSSFNDQyk7CisgIH0KKworICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHdlIGhhdmUgdHdvIGljbXAgaW5zdHJ1Y3Rpb25zCisgIC8vIGNvbXBhcmluZyBhIHZhbHVlIGFnYWluc3QgdHdvIGNvbnN0YW50cyBhbmQgYW5kJ2luZyB0aGUgcmVzdWx0CisgIC8vIHRvZ2V0aGVyLiAgQmVjYXVzZSBvZiB0aGUgYWJvdmUgY2hlY2ssIHdlIGtub3cgdGhhdCB3ZSBvbmx5IGhhdmUKKyAgLy8gaWNtcCBlcSwgaWNtcCBuZSwgaWNtcCBbc3VdbHQsIGFuZCBpY21wIFtTVV1ndCBoZXJlLiBXZSBhbHNvIGtub3cgCisgIC8vIChmcm9tIHRoZSBpY21wIGZvbGRpbmcgY2hlY2sgYWJvdmUpLCB0aGF0IHRoZSB0d28gY29uc3RhbnRzIAorICAvLyBhcmUgbm90IGVxdWFsIGFuZCB0aGF0IHRoZSBsYXJnZXIgY29uc3RhbnQgaXMgb24gdGhlIFJIUworICBhc3NlcnQoTEhTQ3N0ICE9IFJIU0NzdCAmJiAiQ29tcGFyZXMgbm90IGZvbGRlZCBhYm92ZT8iKTsKKworICBzd2l0Y2ggKExIU0NDKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW50ZWdlciBjb25kaXRpb24gY29kZSEiKTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUToKKyAgICBzd2l0Y2ggKFJIU0NDKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBpbnRlZ2VyIGNvbmRpdGlvbiBjb2RlISIpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6ICAgICAgICAgLy8gKFggPT0gMTMgJiBYID09IDE1KSAtPiBmYWxzZQorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiAgICAgICAgLy8gKFggPT0gMTMgJiBYID4gIDE1KSAtPiBmYWxzZQorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiAgICAgICAgLy8gKFggPT0gMTMgJiBYID4gIDE1KSAtPiBmYWxzZQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoQ21wSW5zdDo6bWFrZUNtcFJlc3VsdFR5cGUoTEhTLT5nZXRUeXBlKCkpLCAwKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiAgICAgICAgIC8vIChYID09IDEzICYgWCAhPSAxNSkgLT4gWCA9PSAxMworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOiAgICAgICAgLy8gKFggPT0gMTMgJiBYIDwgIDE1KSAtPiBYID09IDEzCisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTFQ6ICAgICAgICAvLyAoWCA9PSAxMyAmIFggPCAgMTUpIC0+IFggPT0gMTMKKyAgICAgIHJldHVybiBMSFM7CisgICAgfQorICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOgorICAgIHN3aXRjaCAoUkhTQ0MpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgY29uZGl0aW9uIGNvZGUhIik7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6CisgICAgICBpZiAoTEhTQ3N0ID09IFN1Yk9uZShSSFNDc3QpKSAvLyAoWCAhPSAxMyAmIFggdTwgMTQpIC0+IFggPCAxMworICAgICAgICByZXR1cm4gQnVpbGRlci0+Q3JlYXRlSUNtcFVMVChWYWwsIExIU0NzdCk7CisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAvLyAoWCAhPSAxMyAmIFggdTwgMTUpIC0+IG5vIGNoYW5nZQorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOgorICAgICAgaWYgKExIU0NzdCA9PSBTdWJPbmUoUkhTQ3N0KSkgLy8gKFggIT0gMTMgJiBYIHM8IDE0KSAtPiBYIDwgMTMKKyAgICAgICAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUlDbXBTTFQoVmFsLCBMSFNDc3QpOworICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFggIT0gMTMgJiBYIHM8IDE1KSAtPiBubyBjaGFuZ2UKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiAgICAgICAgIC8vIChYICE9IDEzICYgWCA9PSAxNSkgLT4gWCA9PSAxNQorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiAgICAgICAgLy8gKFggIT0gMTMgJiBYIHU+IDE1KSAtPiBYIHU+IDE1CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6ICAgICAgICAvLyAoWCAhPSAxMyAmIFggcz4gMTUpIC0+IFggcz4gMTUKKyAgICAgIHJldHVybiBSSFM7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORToKKyAgICAgIGlmIChMSFNDc3QgPT0gU3ViT25lKFJIU0NzdCkpey8vIChYICE9IDEzICYgWCAhPSAxNCkgLT4gWC0xMyA+dSAxCisgICAgICAgIENvbnN0YW50ICpBZGRDU1QgPSBDb25zdGFudEV4cHI6OmdldE5lZyhMSFNDc3QpOworICAgICAgICBWYWx1ZSAqQWRkID0gQnVpbGRlci0+Q3JlYXRlQWRkKFZhbCwgQWRkQ1NUKTsKKyAgICAgICAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUlDbXBVR1QoQWRkLCBDb25zdGFudEludDo6Z2V0KEFkZC0+Z2V0VHlwZSgpLCAxKSk7CisgICAgICB9CisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAvLyAoWCAhPSAxMyAmIFggIT0gMTUpIC0+IG5vIGNoYW5nZQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6CisgICAgc3dpdGNoIChSSFNDQykgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW50ZWdlciBjb25kaXRpb24gY29kZSEiKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiAgICAgICAgIC8vIChYIHU8IDEzICYgWCA9PSAxNSkgLT4gZmFsc2UKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDogICAgICAgIC8vIChYIHU8IDEzICYgWCB1PiAxNSkgLT4gZmFsc2UKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENtcEluc3Q6Om1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwgMCk7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6ICAgICAgICAvLyAoWCB1PCAxMyAmIFggcz4gMTUpIC0+IG5vIGNoYW5nZQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORTogICAgICAgICAvLyAoWCB1PCAxMyAmIFggIT0gMTUpIC0+IFggdTwgMTMKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDogICAgICAgIC8vIChYIHU8IDEzICYgWCB1PCAxNSkgLT4gWCB1PCAxMworICAgICAgcmV0dXJuIExIUzsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogICAgICAgIC8vIChYIHU8IDEzICYgWCBzPCAxNSkgLT4gbm8gY2hhbmdlCisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOgorICAgIHN3aXRjaCAoUkhTQ0MpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgY29uZGl0aW9uIGNvZGUhIik7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogICAgICAgICAvLyAoWCBzPCAxMyAmIFggPT0gMTUpIC0+IGZhbHNlCisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6ICAgICAgICAvLyAoWCBzPCAxMyAmIFggcz4gMTUpIC0+IGZhbHNlCisgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChDbXBJbnN0OjptYWtlQ21wUmVzdWx0VHlwZShMSFMtPmdldFR5cGUoKSksIDApOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiAgICAgICAgLy8gKFggczwgMTMgJiBYIHU+IDE1KSAtPiBubyBjaGFuZ2UKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6ICAgICAgICAgLy8gKFggczwgMTMgJiBYICE9IDE1KSAtPiBYIDwgMTMKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogICAgICAgIC8vIChYIHM8IDEzICYgWCBzPCAxNSkgLT4gWCA8IDEzCisgICAgICByZXR1cm4gTEhTOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOiAgICAgICAgLy8gKFggczwgMTMgJiBYIHU8IDE1KSAtPiBubyBjaGFuZ2UKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6CisgICAgc3dpdGNoIChSSFNDQykgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW50ZWdlciBjb25kaXRpb24gY29kZSEiKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiAgICAgICAgIC8vIChYIHU+IDEzICYgWCA9PSAxNSkgLT4gWCA9PSAxNQorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiAgICAgICAgLy8gKFggdT4gMTMgJiBYIHU+IDE1KSAtPiBYIHU+IDE1CisgICAgICByZXR1cm4gUkhTOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiAgICAgICAgLy8gKFggdT4gMTMgJiBYIHM+IDE1KSAtPiBubyBjaGFuZ2UKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6CisgICAgICBpZiAoUkhTQ3N0ID09IEFkZE9uZShMSFNDc3QpKSAvLyAoWCB1PiAxMyAmIFggIT0gMTQpIC0+IFggdT4gMTQKKyAgICAgICAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUlDbXAoTEhTQ0MsIFZhbCwgUkhTQ3N0KTsKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChYIHU+IDEzICYgWCAhPSAxNSkgLT4gbm8gY2hhbmdlCisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6ICAgICAgICAvLyAoWCB1PiAxMyAmIFggdTwgMTUpIC0+IChYLTE0KSA8dSAxCisgICAgICByZXR1cm4gSW5zZXJ0UmFuZ2VUZXN0KFZhbCwgQWRkT25lKExIU0NzdCksIFJIU0NzdCwgZmFsc2UsIHRydWUpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiAgICAgICAgLy8gKFggdT4gMTMgJiBYIHM8IDE1KSAtPiBubyBjaGFuZ2UKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6CisgICAgc3dpdGNoIChSSFNDQykgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW50ZWdlciBjb25kaXRpb24gY29kZSEiKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiAgICAgICAgIC8vIChYIHM+IDEzICYgWCA9PSAxNSkgLT4gWCA9PSAxNQorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiAgICAgICAgLy8gKFggcz4gMTMgJiBYIHM+IDE1KSAtPiBYIHM+IDE1CisgICAgICByZXR1cm4gUkhTOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiAgICAgICAgLy8gKFggcz4gMTMgJiBYIHU+IDE1KSAtPiBubyBjaGFuZ2UKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6CisgICAgICBpZiAoUkhTQ3N0ID09IEFkZE9uZShMSFNDc3QpKSAvLyAoWCBzPiAxMyAmIFggIT0gMTQpIC0+IFggcz4gMTQKKyAgICAgICAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUlDbXAoTEhTQ0MsIFZhbCwgUkhTQ3N0KTsKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChYIHM+IDEzICYgWCAhPSAxNSkgLT4gbm8gY2hhbmdlCisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTFQ6ICAgICAgICAvLyAoWCBzPiAxMyAmIFggczwgMTUpIC0+IChYLTE0KSBzPCAxCisgICAgICByZXR1cm4gSW5zZXJ0UmFuZ2VUZXN0KFZhbCwgQWRkT25lKExIU0NzdCksIFJIU0NzdCwgdHJ1ZSwgdHJ1ZSk7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6ICAgICAgICAvLyAoWCBzPiAxMyAmIFggdTwgMTUpIC0+IG5vIGNoYW5nZQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICB9CisgCisgIHJldHVybiAwOworfQorCisvLy8gRm9sZEFuZE9mRkNtcHMgLSBPcHRpbWl6ZSAoZmNtcCkmKGZjbXApLiAgTk9URTogVW5saWtlIHRoZSByZXN0IG9mCisvLy8gaW5zdGNvbWJpbmUsIHRoaXMgcmV0dXJucyBhIFZhbHVlIHdoaWNoIHNob3VsZCBhbHJlYWR5IGJlIGluc2VydGVkIGludG8gdGhlCisvLy8gZnVuY3Rpb24uCitWYWx1ZSAqSW5zdENvbWJpbmVyOjpGb2xkQW5kT2ZGQ21wcyhGQ21wSW5zdCAqTEhTLCBGQ21wSW5zdCAqUkhTKSB7CisgIGlmIChMSFMtPmdldFByZWRpY2F0ZSgpID09IEZDbXBJbnN0OjpGQ01QX09SRCAmJgorICAgICAgUkhTLT5nZXRQcmVkaWNhdGUoKSA9PSBGQ21wSW5zdDo6RkNNUF9PUkQpIHsKKyAgICAvLyAoZmNtcCBvcmQgeCwgYykgJiAoZmNtcCBvcmQgeSwgYykgIC0+IChmY21wIG9yZCB4LCB5KQorICAgIGlmIChDb25zdGFudEZQICpMSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oTEhTLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIGlmIChDb25zdGFudEZQICpSSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oUkhTLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICAvLyBJZiBlaXRoZXIgb2YgdGhlIGNvbnN0YW50cyBhcmUgbmFucywgdGhlbiB0aGUgd2hvbGUgdGhpbmcgcmV0dXJucworICAgICAgICAvLyBmYWxzZS4KKyAgICAgICAgaWYgKExIU0MtPmdldFZhbHVlQVBGKCkuaXNOYU4oKSB8fCBSSFNDLT5nZXRWYWx1ZUFQRigpLmlzTmFOKCkpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXRGYWxzZShMSFMtPmdldENvbnRleHQoKSk7CisgICAgICAgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVGQ21wT1JEKExIUy0+Z2V0T3BlcmFuZCgwKSwgUkhTLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIH0KKyAgICAKKyAgICAvLyBIYW5kbGUgdmVjdG9yIHplcm9zLiAgVGhpcyBvY2N1cnMgYmVjYXVzZSB0aGUgY2Fub25pY2FsIGZvcm0gb2YKKyAgICAvLyAiZmNtcCBvcmQgeCx4IiBpcyAiZmNtcCBvcmQgeCwgMCIuCisgICAgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KExIUy0+Z2V0T3BlcmFuZCgxKSkgJiYKKyAgICAgICAgaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oUkhTLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVGQ21wT1JEKExIUy0+Z2V0T3BlcmFuZCgwKSwgUkhTLT5nZXRPcGVyYW5kKDApKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgVmFsdWUgKk9wMExIUyA9IExIUy0+Z2V0T3BlcmFuZCgwKSwgKk9wMFJIUyA9IExIUy0+Z2V0T3BlcmFuZCgxKTsKKyAgVmFsdWUgKk9wMUxIUyA9IFJIUy0+Z2V0T3BlcmFuZCgwKSwgKk9wMVJIUyA9IFJIUy0+Z2V0T3BlcmFuZCgxKTsKKyAgRkNtcEluc3Q6OlByZWRpY2F0ZSBPcDBDQyA9IExIUy0+Z2V0UHJlZGljYXRlKCksIE9wMUNDID0gUkhTLT5nZXRQcmVkaWNhdGUoKTsKKyAgCisgIAorICBpZiAoT3AwTEhTID09IE9wMVJIUyAmJiBPcDBSSFMgPT0gT3AxTEhTKSB7CisgICAgLy8gU3dhcCBSSFMgb3BlcmFuZHMgdG8gbWF0Y2ggTEhTLgorICAgIE9wMUNDID0gRkNtcEluc3Q6OmdldFN3YXBwZWRQcmVkaWNhdGUoT3AxQ0MpOworICAgIHN0ZDo6c3dhcChPcDFMSFMsIE9wMVJIUyk7CisgIH0KKyAgCisgIGlmIChPcDBMSFMgPT0gT3AxTEhTICYmIE9wMFJIUyA9PSBPcDFSSFMpIHsKKyAgICAvLyBTaW1wbGlmeSAoZmNtcCBjYzAgeCwgeSkgJiAoZmNtcCBjYzEgeCwgeSkuCisgICAgaWYgKE9wMENDID09IE9wMUNDKQorICAgICAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUZDbXAoKEZDbXBJbnN0OjpQcmVkaWNhdGUpT3AwQ0MsIE9wMExIUywgT3AwUkhTKTsKKyAgICBpZiAoT3AwQ0MgPT0gRkNtcEluc3Q6OkZDTVBfRkFMU0UgfHwgT3AxQ0MgPT0gRkNtcEluc3Q6OkZDTVBfRkFMU0UpCisgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChDbXBJbnN0OjptYWtlQ21wUmVzdWx0VHlwZShMSFMtPmdldFR5cGUoKSksIDApOworICAgIGlmIChPcDBDQyA9PSBGQ21wSW5zdDo6RkNNUF9UUlVFKQorICAgICAgcmV0dXJuIFJIUzsKKyAgICBpZiAoT3AxQ0MgPT0gRkNtcEluc3Q6OkZDTVBfVFJVRSkKKyAgICAgIHJldHVybiBMSFM7CisgICAgCisgICAgYm9vbCBPcDBPcmRlcmVkOworICAgIGJvb2wgT3AxT3JkZXJlZDsKKyAgICB1bnNpZ25lZCBPcDBQcmVkID0gZ2V0RkNtcENvZGUoT3AwQ0MsIE9wME9yZGVyZWQpOworICAgIHVuc2lnbmVkIE9wMVByZWQgPSBnZXRGQ21wQ29kZShPcDFDQywgT3AxT3JkZXJlZCk7CisgICAgaWYgKE9wMVByZWQgPT0gMCkgeworICAgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgICAgIHN0ZDo6c3dhcChPcDBQcmVkLCBPcDFQcmVkKTsKKyAgICAgIHN0ZDo6c3dhcChPcDBPcmRlcmVkLCBPcDFPcmRlcmVkKTsKKyAgICB9CisgICAgaWYgKE9wMFByZWQgPT0gMCkgeworICAgICAgLy8gdW5vICYmIHVlcSAtPiB1bm8gJiYgKHVubyB8fCBlcSkgLT4gdWVxCisgICAgICAvLyBvcmQgJiYgb2x0IC0+IG9yZCAmJiAob3JkICYmIGx0KSAtPiBvbHQKKyAgICAgIGlmIChPcDBPcmRlcmVkID09IE9wMU9yZGVyZWQpCisgICAgICAgIHJldHVybiBSSFM7CisgICAgICAKKyAgICAgIC8vIHVubyAmJiBvZXEgLT4gdW5vICYmIChvcmQgJiYgZXEpIC0+IGZhbHNlCisgICAgICAvLyB1bm8gJiYgb3JkIC0+IGZhbHNlCisgICAgICBpZiAoIU9wME9yZGVyZWQpCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENtcEluc3Q6Om1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwgMCk7CisgICAgICAvLyBvcmQgJiYgdWVxIC0+IG9yZCAmJiAodW5vIHx8IGVxKSAtPiBvZXEKKyAgICAgIHJldHVybiBnZXRGQ21wVmFsdWUodHJ1ZSwgT3AxUHJlZCwgT3AwTEhTLCBPcDBSSFMsIEJ1aWxkZXIpOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0QW5kKEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIGJvb2wgQ2hhbmdlZCA9IFNpbXBsaWZ5Q29tbXV0YXRpdmUoSSk7CisgIFZhbHVlICpPcDAgPSBJLmdldE9wZXJhbmQoMCksICpPcDEgPSBJLmdldE9wZXJhbmQoMSk7CisKKyAgaWYgKFZhbHVlICpWID0gU2ltcGxpZnlBbmRJbnN0KE9wMCwgT3AxLCBURCkpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgVik7CisKKyAgLy8gU2VlIGlmIHdlIGNhbiBzaW1wbGlmeSBhbnkgaW5zdHJ1Y3Rpb25zIHVzZWQgYnkgdGhlIGluc3RydWN0aW9uIHdob3NlIHNvbGUgCisgIC8vIHB1cnBvc2UgaXMgdG8gY29tcHV0ZSBiaXRzIHdlIGRvbid0IGNhcmUgYWJvdXQuCisgIGlmIChTaW1wbGlmeURlbWFuZGVkSW5zdHJ1Y3Rpb25CaXRzKEkpKQorICAgIHJldHVybiAmSTsgIAorCisgIGlmIChDb25zdGFudEludCAqQW5kUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wMSkpIHsKKyAgICBjb25zdCBBUEludCAmQW5kUkhTTWFzayA9IEFuZFJIUy0+Z2V0VmFsdWUoKTsKKyAgICBBUEludCBOb3RBbmRSSFMofkFuZFJIU01hc2spOworCisgICAgLy8gT3B0aW1pemUgYSB2YXJpZXR5IG9mICgodmFsIE9QIEMxKSAmIEMyKSBjb21iaW5hdGlvbnMuLi4KKyAgICBpZiAoQmluYXJ5T3BlcmF0b3IgKk9wMEkgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oT3AwKSkgeworICAgICAgVmFsdWUgKk9wMExIUyA9IE9wMEktPmdldE9wZXJhbmQoMCk7CisgICAgICBWYWx1ZSAqT3AwUkhTID0gT3AwSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgIHN3aXRjaCAoT3AwSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgICAgICAgIC8vIElmIHRoZSBtYXNrIGlzIG9ubHkgbmVlZGVkIG9uIG9uZSBpbmNvbWluZyBhcm0sIHB1c2ggaXQgdXAuCisgICAgICAgIGlmICghT3AwSS0+aGFzT25lVXNlKCkpIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBpZiAoTWFza2VkVmFsdWVJc1plcm8oT3AwTEhTLCBOb3RBbmRSSFMpKSB7CisgICAgICAgICAgLy8gTm90IG1hc2tpbmcgYW55dGhpbmcgb3V0IGZvciB0aGUgTEhTLCBtb3ZlIHRvIFJIUy4KKyAgICAgICAgICBWYWx1ZSAqTmV3UkhTID0gQnVpbGRlci0+Q3JlYXRlQW5kKE9wMFJIUywgQW5kUkhTKTsKKyAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShPcDBJLT5nZXRPcGNvZGUoKSwgT3AwTEhTLCBOZXdSSFMpOworICAgICAgICB9CisgICAgICAgIGlmICghaXNhPENvbnN0YW50PihPcDBSSFMpICYmCisgICAgICAgICAgICBNYXNrZWRWYWx1ZUlzWmVybyhPcDBSSFMsIE5vdEFuZFJIUykpIHsKKyAgICAgICAgICAvLyBOb3QgbWFza2luZyBhbnl0aGluZyBvdXQgZm9yIHRoZSBSSFMsIG1vdmUgdG8gTEhTLgorICAgICAgICAgIFZhbHVlICpOZXdMSFMgPSBCdWlsZGVyLT5DcmVhdGVBbmQoT3AwTEhTLCBBbmRSSFMpOworICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKE9wMEktPmdldE9wY29kZSgpLCBOZXdMSFMsIE9wMFJIUyk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICAgICAgLy8gKChBICYgTikgKyBCKSAmIEFuZFJIUyAtPiAoQSArIEIpICYgQW5kUkhTIGlmZiBOJkFuZFJIUyA9PSBBbmRSSFMuCisgICAgICAgIC8vICgoQSB8IE4pICsgQikgJiBBbmRSSFMgLT4gKEEgKyBCKSAmIEFuZFJIUyBpZmYgTiZBbmRSSFMgPT0gMAorICAgICAgICAvLyAoKEEgXiBOKSArIEIpICYgQW5kUkhTIC0+IChBICsgQikgJiBBbmRSSFMgaWZmIE4mQW5kUkhTID09IDAKKyAgICAgICAgaWYgKFZhbHVlICpWID0gRm9sZExvZ2ljYWxQbHVzQW5kKE9wMExIUywgT3AwUkhTLCBBbmRSSFMsIGZhbHNlLCBJKSkKKyAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChWLCBBbmRSSFMpOworICAgICAgICBpZiAoVmFsdWUgKlYgPSBGb2xkTG9naWNhbFBsdXNBbmQoT3AwUkhTLCBPcDBMSFMsIEFuZFJIUywgZmFsc2UsIEkpKQorICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKFYsIEFuZFJIUyk7ICAvLyBBZGQgY29tbXV0ZXMKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgICAgICAgLy8gKChBICYgTikgLSBCKSAmIEFuZFJIUyAtPiAoQSAtIEIpICYgQW5kUkhTIGlmZiBOJkFuZFJIUyA9PSBBbmRSSFMuCisgICAgICAgIC8vICgoQSB8IE4pIC0gQikgJiBBbmRSSFMgLT4gKEEgLSBCKSAmIEFuZFJIUyBpZmYgTiZBbmRSSFMgPT0gMAorICAgICAgICAvLyAoKEEgXiBOKSAtIEIpICYgQW5kUkhTIC0+IChBIC0gQikgJiBBbmRSSFMgaWZmIE4mQW5kUkhTID09IDAKKyAgICAgICAgaWYgKFZhbHVlICpWID0gRm9sZExvZ2ljYWxQbHVzQW5kKE9wMExIUywgT3AwUkhTLCBBbmRSSFMsIHRydWUsIEkpKQorICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKFYsIEFuZFJIUyk7CisKKyAgICAgICAgLy8gKEEgLSBOKSAmIEFuZFJIUyAtPiAtTiAmIEFuZFJIUyBpZmYgQSZBbmRSSFM9PTAgYW5kIEFuZFJIUworICAgICAgICAvLyBoYXMgMSdzIGZvciBhbGwgYml0cyB0aGF0IHRoZSBzdWJ0cmFjdGlvbiB3aXRoIEEgbWlnaHQgYWZmZWN0LgorICAgICAgICBpZiAoT3AwSS0+aGFzT25lVXNlKCkpIHsKKyAgICAgICAgICB1aW50MzJfdCBCaXRXaWR0aCA9IEFuZFJIU01hc2suZ2V0Qml0V2lkdGgoKTsKKyAgICAgICAgICB1aW50MzJfdCBaZXJvcyA9IEFuZFJIU01hc2suY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgICAgICAgICBBUEludCBNYXNrID0gQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsIEJpdFdpZHRoIC0gWmVyb3MpOworCisgICAgICAgICAgQ29uc3RhbnRJbnQgKkEgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AwTEhTKTsKKyAgICAgICAgICBpZiAoIShBICYmIEEtPmlzWmVybygpKSAmJiAgICAgICAgICAgICAgIC8vIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICAgICAgICAgICAgTWFza2VkVmFsdWVJc1plcm8oT3AwTEhTLCBNYXNrKSkgeworICAgICAgICAgICAgVmFsdWUgKk5ld05lZyA9IEJ1aWxkZXItPkNyZWF0ZU5lZyhPcDBSSFMpOworICAgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoTmV3TmVnLCBBbmRSSFMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgICAgICAgLy8gKDEgPDwgeCkgJiAxIC0tPiB6ZXh0KHggPT0gMCkKKyAgICAgICAgLy8gKDEgPj4geCkgJiAxIC0tPiB6ZXh0KHggPT0gMCkKKyAgICAgICAgaWYgKEFuZFJIU01hc2sgPT0gMSAmJiBPcDBMSFMgPT0gQW5kUkhTKSB7CisgICAgICAgICAgVmFsdWUgKk5ld0lDbXAgPQorICAgICAgICAgICAgQnVpbGRlci0+Q3JlYXRlSUNtcEVRKE9wMFJIUywgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJLmdldFR5cGUoKSkpOworICAgICAgICAgIHJldHVybiBuZXcgWkV4dEluc3QoTmV3SUNtcCwgSS5nZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoQ29uc3RhbnRJbnQgKk9wMENJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wMEktPmdldE9wZXJhbmQoMSkpKQorICAgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKlJlcyA9IE9wdEFuZE9wKE9wMEksIE9wMENJLCBBbmRSSFMsIEkpKQorICAgICAgICAgIHJldHVybiBSZXM7CisgICAgfSBlbHNlIGlmIChDYXN0SW5zdCAqQ0kgPSBkeW5fY2FzdDxDYXN0SW5zdD4oT3AwKSkgeworICAgICAgLy8gSWYgdGhpcyBpcyBhbiBpbnRlZ2VyIHRydW5jYXRpb24gb3IgY2hhbmdlIGZyb20gc2lnbmVkLXRvLXVuc2lnbmVkLCBhbmQKKyAgICAgIC8vIGlmIHRoZSBzb3VyY2UgaXMgYW4gYW5kL29yIHdpdGggaW1tZWRpYXRlLCB0cmFuc2Zvcm0gaXQuICBUaGlzCisgICAgICAvLyBmcmVxdWVudGx5IG9jY3VycyBmb3IgYml0ZmllbGQgYWNjZXNzZXMuCisgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKkNhc3RPcCA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihDSS0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgaWYgKChpc2E8VHJ1bmNJbnN0PihDSSkgfHwgaXNhPEJpdENhc3RJbnN0PihDSSkpICYmCisgICAgICAgICAgICBDYXN0T3AtPmdldE51bU9wZXJhbmRzKCkgPT0gMikKKyAgICAgICAgICBpZiAoQ29uc3RhbnRJbnQgKkFuZENJID1keW5fY2FzdDxDb25zdGFudEludD4oQ2FzdE9wLT5nZXRPcGVyYW5kKDEpKSl7CisgICAgICAgICAgICBpZiAoQ2FzdE9wLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kKSB7CisgICAgICAgICAgICAgIC8vIENoYW5nZTogYW5kIChjYXN0IChhbmQgWCwgQzEpIHRvIFQpLCBDMgorICAgICAgICAgICAgICAvLyBpbnRvICA6IGFuZCAoY2FzdCBYIHRvIFQpLCB0cnVuY19vcl9iaXRjYXN0KEMxKSZDMgorICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZm9sZCB0aGUgdHdvIGNvbnN0YW50cyB0b2dldGhlciwgd2hpY2ggbWF5IGFsbG93IAorICAgICAgICAgICAgICAvLyBvdGhlciBzaW1wbGlmaWNhdGlvbnMuCisgICAgICAgICAgICAgIFZhbHVlICpOZXdDYXN0ID0gQnVpbGRlci0+Q3JlYXRlVHJ1bmNPckJpdENhc3QoCisgICAgICAgICAgICAgICAgQ2FzdE9wLT5nZXRPcGVyYW5kKDApLCBJLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgIC8vIHRydW5jX29yX2JpdGNhc3QoQzEpJkMyCisgICAgICAgICAgICAgIENvbnN0YW50ICpDMyA9IENvbnN0YW50RXhwcjo6Z2V0VHJ1bmNPckJpdENhc3QoQW5kQ0ksSS5nZXRUeXBlKCkpOworICAgICAgICAgICAgICBDMyA9IENvbnN0YW50RXhwcjo6Z2V0QW5kKEMzLCBBbmRSSFMpOworICAgICAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChOZXdDYXN0LCBDMyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKENhc3RPcC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Ok9yKSB7CisgICAgICAgICAgICAgIC8vIENoYW5nZTogYW5kIChjYXN0IChvciBYLCBDMSkgdG8gVCksIEMyCisgICAgICAgICAgICAgIC8vIGludG8gIDogdHJ1bmMoQzEpJkMyIGlmZiB0cnVuYyhDMSkmQzIgPT0gQzIKKyAgICAgICAgICAgICAgQ29uc3RhbnQgKkMzID0gQ29uc3RhbnRFeHByOjpnZXRUcnVuY09yQml0Q2FzdChBbmRDSSxJLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgIGlmIChDb25zdGFudEV4cHI6OmdldEFuZChDMywgQW5kUkhTKSA9PSBBbmRSSFMpCisgICAgICAgICAgICAgICAgLy8gdHJ1bmMoQzEpJkMyCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQW5kUkhTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gVHJ5IHRvIGZvbGQgY29uc3RhbnQgYW5kIGludG8gc2VsZWN0IGFyZ3VtZW50cy4KKyAgICBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihPcDApKQorICAgICAgaWYgKEluc3RydWN0aW9uICpSID0gRm9sZE9wSW50b1NlbGVjdChJLCBTSSkpCisgICAgICAgIHJldHVybiBSOworICAgIGlmIChpc2E8UEhJTm9kZT4oT3AwKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEkpKQorICAgICAgICByZXR1cm4gTlY7CisgIH0KKworCisgIC8vICh+QSAmIH5CKSA9PSAofihBIHwgQikpIC0gRGUgTW9yZ2FuJ3MgTGF3CisgIGlmIChWYWx1ZSAqT3AwTm90VmFsID0gZHluX2Nhc3ROb3RWYWwoT3AwKSkKKyAgICBpZiAoVmFsdWUgKk9wMU5vdFZhbCA9IGR5bl9jYXN0Tm90VmFsKE9wMSkpCisgICAgICBpZiAoT3AwLT5oYXNPbmVVc2UoKSAmJiBPcDEtPmhhc09uZVVzZSgpKSB7CisgICAgICAgIFZhbHVlICpPciA9IEJ1aWxkZXItPkNyZWF0ZU9yKE9wME5vdFZhbCwgT3AxTm90VmFsKTsKKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOb3QoT3IpOworICAgICAgfQorCisgIHsKKyAgICBWYWx1ZSAqQSA9IDAsICpCID0gMCwgKkMgPSAwLCAqRCA9IDA7CisgICAgLy8gKEF8QikgJiB+KEEmQikgLT4gQV5CCisgICAgaWYgKG1hdGNoKE9wMCwgbV9PcihtX1ZhbHVlKEEpLCBtX1ZhbHVlKEIpKSkgJiYKKyAgICAgICAgbWF0Y2goT3AxLCBtX05vdChtX0FuZChtX1ZhbHVlKEMpLCBtX1ZhbHVlKEQpKSkpICYmCisgICAgICAgICgoQSA9PSBDICYmIEIgPT0gRCkgfHwgKEEgPT0gRCAmJiBCID09IEMpKSkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKEEsIEIpOworICAgIAorICAgIC8vIH4oQSZCKSAmIChBfEIpIC0+IEFeQgorICAgIGlmIChtYXRjaChPcDEsIG1fT3IobV9WYWx1ZShBKSwgbV9WYWx1ZShCKSkpICYmCisgICAgICAgIG1hdGNoKE9wMCwgbV9Ob3QobV9BbmQobV9WYWx1ZShDKSwgbV9WYWx1ZShEKSkpKSAmJgorICAgICAgICAoKEEgPT0gQyAmJiBCID09IEQpIHx8IChBID09IEQgJiYgQiA9PSBDKSkpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcihBLCBCKTsKKyAgICAKKyAgICBpZiAoT3AwLT5oYXNPbmVVc2UoKSAmJgorICAgICAgICBtYXRjaChPcDAsIG1fWG9yKG1fVmFsdWUoQSksIG1fVmFsdWUoQikpKSkgeworICAgICAgaWYgKEEgPT0gT3AxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoQV5CKSZBIC0+IEEmKEFeQikKKyAgICAgICAgSS5zd2FwT3BlcmFuZHMoKTsgICAgIC8vIFNpbXBsaWZ5IGJlbG93CisgICAgICAgIHN0ZDo6c3dhcChPcDAsIE9wMSk7CisgICAgICB9IGVsc2UgaWYgKEIgPT0gT3AxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChBXkIpJkIgLT4gQiYoQl5BKQorICAgICAgICBjYXN0PEJpbmFyeU9wZXJhdG9yPihPcDApLT5zd2FwT3BlcmFuZHMoKTsKKyAgICAgICAgSS5zd2FwT3BlcmFuZHMoKTsgICAgIC8vIFNpbXBsaWZ5IGJlbG93CisgICAgICAgIHN0ZDo6c3dhcChPcDAsIE9wMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKE9wMS0+aGFzT25lVXNlKCkgJiYKKyAgICAgICAgbWF0Y2goT3AxLCBtX1hvcihtX1ZhbHVlKEEpLCBtX1ZhbHVlKEIpKSkpIHsKKyAgICAgIGlmIChCID09IE9wMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQiYoQV5CKSAtPiBCJihCXkEpCisgICAgICAgIGNhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMSktPnN3YXBPcGVyYW5kcygpOworICAgICAgICBzdGQ6OnN3YXAoQSwgQik7CisgICAgICB9CisgICAgICBpZiAoQSA9PSBPcDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBJihBXkIpIC0+IEEgJiB+QgorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChBLCBCdWlsZGVyLT5DcmVhdGVOb3QoQikpOworICAgIH0KKworICAgIC8vIChBJigofkEpfEIpKSAtPiBBJkIKKyAgICBpZiAobWF0Y2goT3AwLCBtX09yKG1fTm90KG1fU3BlY2lmaWMoT3AxKSksIG1fVmFsdWUoQSkpKSB8fAorICAgICAgICBtYXRjaChPcDAsIG1fT3IobV9WYWx1ZShBKSwgbV9Ob3QobV9TcGVjaWZpYyhPcDEpKSkpKQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoQSwgT3AxKTsKKyAgICBpZiAobWF0Y2goT3AxLCBtX09yKG1fTm90KG1fU3BlY2lmaWMoT3AwKSksIG1fVmFsdWUoQSkpKSB8fAorICAgICAgICBtYXRjaChPcDEsIG1fT3IobV9WYWx1ZShBKSwgbV9Ob3QobV9TcGVjaWZpYyhPcDApKSkpKQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoQSwgT3AwKTsKKyAgfQorICAKKyAgaWYgKElDbXBJbnN0ICpSSFMgPSBkeW5fY2FzdDxJQ21wSW5zdD4oT3AxKSkKKyAgICBpZiAoSUNtcEluc3QgKkxIUyA9IGR5bl9jYXN0PElDbXBJbnN0PihPcDApKQorICAgICAgaWYgKFZhbHVlICpSZXMgPSBGb2xkQW5kT2ZJQ21wcyhMSFMsIFJIUykpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIFJlcyk7CisgIAorICAvLyBJZiBhbmQnaW5nIHR3byBmY21wLCB0cnkgY29tYmluZSB0aGVtIGludG8gb25lLgorICBpZiAoRkNtcEluc3QgKkxIUyA9IGR5bl9jYXN0PEZDbXBJbnN0PihJLmdldE9wZXJhbmQoMCkpKQorICAgIGlmIChGQ21wSW5zdCAqUkhTID0gZHluX2Nhc3Q8RkNtcEluc3Q+KEkuZ2V0T3BlcmFuZCgxKSkpCisgICAgICBpZiAoVmFsdWUgKlJlcyA9IEZvbGRBbmRPZkZDbXBzKExIUywgUkhTKSkKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgUmVzKTsKKyAgCisgIAorICAvLyBmb2xkIChhbmQgKGNhc3QgQSksIChjYXN0IEIpKSAtPiAoY2FzdCAoYW5kIEEsIEIpKQorICBpZiAoQ2FzdEluc3QgKk9wMEMgPSBkeW5fY2FzdDxDYXN0SW5zdD4oT3AwKSkKKyAgICBpZiAoQ2FzdEluc3QgKk9wMUMgPSBkeW5fY2FzdDxDYXN0SW5zdD4oT3AxKSkgeworICAgICAgY29uc3QgVHlwZSAqU3JjVHkgPSBPcDBDLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgICAgICBpZiAoT3AwQy0+Z2V0T3Bjb2RlKCkgPT0gT3AxQy0+Z2V0T3Bjb2RlKCkgJiYgLy8gc2FtZSBjYXN0IGtpbmQgPworICAgICAgICAgIFNyY1R5ID09IE9wMUMtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSAmJgorICAgICAgICAgIFNyY1R5LT5pc0ludE9ySW50VmVjdG9yVHkoKSkgeworICAgICAgICBWYWx1ZSAqT3AwQ09wID0gT3AwQy0+Z2V0T3BlcmFuZCgwKSwgKk9wMUNPcCA9IE9wMUMtPmdldE9wZXJhbmQoMCk7CisgICAgICAgIAorICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgdGhlIGNhc3RzIGJvdGggcmVhbGx5IGNhdXNlIGNvZGUgdG8gYmUgZ2VuZXJhdGVkLgorICAgICAgICBpZiAoU2hvdWxkT3B0aW1pemVDYXN0KE9wMEMtPmdldE9wY29kZSgpLCBPcDBDT3AsIEkuZ2V0VHlwZSgpKSAmJgorICAgICAgICAgICAgU2hvdWxkT3B0aW1pemVDYXN0KE9wMUMtPmdldE9wY29kZSgpLCBPcDFDT3AsIEkuZ2V0VHlwZSgpKSkgeworICAgICAgICAgIFZhbHVlICpOZXdPcCA9IEJ1aWxkZXItPkNyZWF0ZUFuZChPcDBDT3AsIE9wMUNPcCk7CisgICAgICAgICAgcmV0dXJuIENhc3RJbnN0OjpDcmVhdGUoT3AwQy0+Z2V0T3Bjb2RlKCksIE5ld09wLCBJLmdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoaXMgaXMgYW5kKGNhc3QoaWNtcCksIGNhc3QoaWNtcCkpLCB0cnkgdG8gZm9sZCB0aGlzIGV2ZW4gaWYgdGhlCisgICAgICAgIC8vIGNhc3QgaXMgb3RoZXJ3aXNlIG5vdCBvcHRpbWl6YWJsZS4gIFRoaXMgaGFwcGVucyBmb3IgdmVjdG9yIHNleHRzLgorICAgICAgICBpZiAoSUNtcEluc3QgKlJIUyA9IGR5bl9jYXN0PElDbXBJbnN0PihPcDFDT3ApKQorICAgICAgICAgIGlmIChJQ21wSW5zdCAqTEhTID0gZHluX2Nhc3Q8SUNtcEluc3Q+KE9wMENPcCkpCisgICAgICAgICAgICBpZiAoVmFsdWUgKlJlcyA9IEZvbGRBbmRPZklDbXBzKExIUywgUkhTKSkKKyAgICAgICAgICAgICAgcmV0dXJuIENhc3RJbnN0OjpDcmVhdGUoT3AwQy0+Z2V0T3Bjb2RlKCksIFJlcywgSS5nZXRUeXBlKCkpOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhbmQoY2FzdChmY21wKSwgY2FzdChmY21wKSksIHRyeSB0byBmb2xkIHRoaXMgZXZlbiBpZiB0aGUKKyAgICAgICAgLy8gY2FzdCBpcyBvdGhlcndpc2Ugbm90IG9wdGltaXphYmxlLiAgVGhpcyBoYXBwZW5zIGZvciB2ZWN0b3Igc2V4dHMuCisgICAgICAgIGlmIChGQ21wSW5zdCAqUkhTID0gZHluX2Nhc3Q8RkNtcEluc3Q+KE9wMUNPcCkpCisgICAgICAgICAgaWYgKEZDbXBJbnN0ICpMSFMgPSBkeW5fY2FzdDxGQ21wSW5zdD4oT3AwQ09wKSkKKyAgICAgICAgICAgIGlmIChWYWx1ZSAqUmVzID0gRm9sZEFuZE9mRkNtcHMoTEhTLCBSSFMpKQorICAgICAgICAgICAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZShPcDBDLT5nZXRPcGNvZGUoKSwgUmVzLCBJLmdldFR5cGUoKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAvLyAoWCA+PiBaKSAmIChZID4+IFopICAtPiAoWCZZKSA+PiBaICBmb3IgYWxsIHNoaWZ0cy4KKyAgaWYgKEJpbmFyeU9wZXJhdG9yICpTSTEgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oT3AxKSkgeworICAgIGlmIChCaW5hcnlPcGVyYXRvciAqU0kwID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMCkpCisgICAgICBpZiAoU0kwLT5pc1NoaWZ0KCkgJiYgU0kwLT5nZXRPcGNvZGUoKSA9PSBTSTEtPmdldE9wY29kZSgpICYmIAorICAgICAgICAgIFNJMC0+Z2V0T3BlcmFuZCgxKSA9PSBTSTEtPmdldE9wZXJhbmQoMSkgJiYKKyAgICAgICAgICAoU0kwLT5oYXNPbmVVc2UoKSB8fCBTSTEtPmhhc09uZVVzZSgpKSkgeworICAgICAgICBWYWx1ZSAqTmV3T3AgPQorICAgICAgICAgIEJ1aWxkZXItPkNyZWF0ZUFuZChTSTAtPmdldE9wZXJhbmQoMCksIFNJMS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKFNJMS0+Z2V0T3Bjb2RlKCksIE5ld09wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0kxLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBDaGFuZ2VkID8gJkkgOiAwOworfQorCisvLy8gQ29sbGVjdEJTd2FwUGFydHMgLSBBbmFseXplIHRoZSBzcGVjaWZpZWQgc3ViZXhwcmVzc2lvbiBhbmQgc2VlIGlmIGl0IGlzCisvLy8gY2FwYWJsZSBvZiBwcm92aWRpbmcgcGllY2VzIG9mIGEgYnN3YXAuICBUaGUgc3ViZXhwcmVzc2lvbiBwcm92aWRlcyBwaWVjZXMKKy8vLyBvZiBhIGJzd2FwIGlmIGl0IGlzIHByb3ZlbiB0aGF0IGVhY2ggb2YgdGhlIG5vbi16ZXJvIGJ5dGVzIGluIHRoZSBvdXRwdXQgb2YKKy8vLyB0aGUgZXhwcmVzc2lvbiBjYW1lIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgImJ5dGUgc3dhcHBlZCIgYnl0ZSBpbiBzb21lIG90aGVyCisvLy8gdmFsdWUuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgc3ViZXhwcmVzc2lvbiBpcyAiKHNobCBpMzIgJVgsIDI0KSIgdGhlbgorLy8vIHdlIGtub3cgdGhhdCB0aGUgZXhwcmVzc2lvbiBkZXBvc2l0cyB0aGUgbG93IGJ5dGUgb2YgJVggaW50byB0aGUgaGlnaCBieXRlCisvLy8gb2YgdGhlIGJzd2FwIHJlc3VsdCBhbmQgdGhhdCBhbGwgb3RoZXIgYnl0ZXMgYXJlIHplcm8uICBUaGlzIGV4cHJlc3Npb24gaXMKKy8vLyBhY2NlcHRlZCwgdGhlIGhpZ2ggYnl0ZSBvZiBCeXRlVmFsdWVzIGlzIHNldCB0byBYIHRvIGluZGljYXRlIGEgY29ycmVjdAorLy8vIG1hdGNoLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIG1hdGNoIHdhcyB1bnN1Y2Nlc3NmdWwgYW5kIGZhbHNlIGlmIHNvLgorLy8vIE9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbiB0aGUgIk92ZXJhbGxMZWZ0U2hpZnQiIGlzIGEgc2lnbmVkIGludGVnZXIgdmFsdWUKKy8vLyBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgc3ViZXhwcmVzc2lvbiBpcyBsYXRlciBzaGlmdGVkLiAgRm9yCisvLy8gZXhhbXBsZSwgaWYgdGhlIGV4cHJlc3Npb24gaXMgbGF0ZXIgcmlnaHQgc2hpZnRlZCBieSAxNiBiaXRzLCB0aGUKKy8vLyBPdmVyYWxsTGVmdFNoaWZ0IHZhbHVlIHdvdWxkIGJlIC0yIG9uIGVudHJ5LiAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2gKKy8vLyBieXRlIG9mIEJ5dGVWYWx1ZXMgaXMgYWN0dWFsbHkgYmVpbmcgc2V0LgorLy8vCisvLy8gU2ltaWxhcmx5LCBCeXRlTWFzayBpcyBhIGJpdG1hc2sgd2hlcmUgYSBiaXQgaXMgY2xlYXIgaWYgaXRzIGNvcnJlc3BvbmRpbmcKKy8vLyBieXRlIGlzIG1hc2tlZCB0byB6ZXJvIGJ5IGEgdXNlci4gIEZvciBleGFtcGxlLCBpbiAoWCAmIDI1NSksIFggd2lsbCBiZQorLy8vIHByb2Nlc3NlZCB3aXRoIGEgYnl0ZW1hc2sgb2YgMS4gIEJlY2F1c2UgYnl0ZW1hc2sgaXMgMzItYml0cywgdGhpcyBsaW1pdHMKKy8vLyB0aGlzIGZ1bmN0aW9uIHRvIHdvcmtpbmcgb24gdXAgdG8gMzItYnl0ZSAoMjU2IGJpdCkgdmFsdWVzLiAgQnl0ZU1hc2sgaXMKKy8vLyBhbHdheXMgaW4gdGhlIGxvY2FsIChPdmVyYWxsTGVmdFNoaWZ0KSBjb29yZGluYXRlIHNwYWNlLgorLy8vCitzdGF0aWMgYm9vbCBDb2xsZWN0QlN3YXBQYXJ0cyhWYWx1ZSAqViwgaW50IE92ZXJhbGxMZWZ0U2hpZnQsIHVpbnQzMl90IEJ5dGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8VmFsdWUqLCA4PiAmQnl0ZVZhbHVlcykgeworICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpIHsKKyAgICAvLyBJZiB0aGlzIGlzIGFuIG9yIGluc3RydWN0aW9uLCBpdCBtYXkgYmUgYW4gaW5uZXIgbm9kZSBvZiB0aGUgYnN3YXAuCisgICAgaWYgKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpPcikgeworICAgICAgcmV0dXJuIENvbGxlY3RCU3dhcFBhcnRzKEktPmdldE9wZXJhbmQoMCksIE92ZXJhbGxMZWZ0U2hpZnQsIEJ5dGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVWYWx1ZXMpIHx8CisgICAgICAgICAgICAgQ29sbGVjdEJTd2FwUGFydHMoSS0+Z2V0T3BlcmFuZCgxKSwgT3ZlcmFsbExlZnRTaGlmdCwgQnl0ZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVZhbHVlcyk7CisgICAgfQorICAKKyAgICAvLyBJZiB0aGlzIGlzIGEgbG9naWNhbCBzaGlmdCBieSBhIGNvbnN0YW50IG11bHRpcGxlIG9mIDgsIHJlY3Vyc2Ugd2l0aAorICAgIC8vIE92ZXJhbGxMZWZ0U2hpZnQgYW5kIEJ5dGVNYXNrIGFkanVzdGVkLgorICAgIGlmIChJLT5pc0xvZ2ljYWxTaGlmdCgpICYmIGlzYTxDb25zdGFudEludD4oSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHVuc2lnbmVkIFNoQW10ID0gCisgICAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KEktPmdldE9wZXJhbmQoMSkpLT5nZXRMaW1pdGVkVmFsdWUofjBVKTsKKyAgICAgIC8vIEVuc3VyZSB0aGUgc2hpZnQgYW1vdW50IGlzIGRlZmluZWQgYW5kIG9mIGEgYnl0ZSB2YWx1ZS4KKyAgICAgIGlmICgoU2hBbXQgJiA3KSB8fCAoU2hBbXQgPiA4KkJ5dGVWYWx1ZXMuc2l6ZSgpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIHVuc2lnbmVkIEJ5dGVTaGlmdCA9IFNoQW10ID4+IDM7CisgICAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNobCkgeworICAgICAgICAvLyBYIDw8IDIgLT4gY29sbGVjdChYLCArMikKKyAgICAgICAgT3ZlcmFsbExlZnRTaGlmdCArPSBCeXRlU2hpZnQ7CisgICAgICAgIEJ5dGVNYXNrID4+PSBCeXRlU2hpZnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBYID4+dSAyIC0+IGNvbGxlY3QoWCwgLTIpCisgICAgICAgIE92ZXJhbGxMZWZ0U2hpZnQgLT0gQnl0ZVNoaWZ0OworICAgICAgICBCeXRlTWFzayA8PD0gQnl0ZVNoaWZ0OworICAgICAgICBCeXRlTWFzayAmPSAofjBVID4+ICgzMi1CeXRlVmFsdWVzLnNpemUoKSkpOworICAgICAgfQorCisgICAgICBpZiAoT3ZlcmFsbExlZnRTaGlmdCA+PSAoaW50KUJ5dGVWYWx1ZXMuc2l6ZSgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChPdmVyYWxsTGVmdFNoaWZ0IDw9IC0oaW50KUJ5dGVWYWx1ZXMuc2l6ZSgpKSByZXR1cm4gdHJ1ZTsKKworICAgICAgcmV0dXJuIENvbGxlY3RCU3dhcFBhcnRzKEktPmdldE9wZXJhbmQoMCksIE92ZXJhbGxMZWZ0U2hpZnQsIEJ5dGVNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlVmFsdWVzKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGlzIGEgbG9naWNhbCAnYW5kJyB3aXRoIGEgbWFzayB0aGF0IGNsZWFycyBieXRlcywgY2xlYXIgdGhlCisgICAgLy8gY29ycmVzcG9uZGluZyBieXRlcyBpbiBCeXRlTWFzay4KKyAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFuZCAmJgorICAgICAgICBpc2E8Q29uc3RhbnRJbnQ+KEktPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAvLyBTY2FuIGV2ZXJ5IGJ5dGUgb2YgdGhlIGFuZCBtYXNrLCBzZWVpbmcgaWYgdGhlIGJ5dGUgaXMgZWl0aGVyIDAgb3IgMjU1LgorICAgICAgdW5zaWduZWQgTnVtQnl0ZXMgPSBCeXRlVmFsdWVzLnNpemUoKTsKKyAgICAgIEFQSW50IEJ5dGUoSS0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCksIDI1NSk7CisgICAgICBjb25zdCBBUEludCAmQW5kTWFzayA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEktPmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpOworICAgICAgCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUJ5dGVzOyArK2ksIEJ5dGUgPDw9IDgpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBieXRlIGlzIG1hc2tlZCBvdXQgYnkgYSBsYXRlciBvcGVyYXRpb24sIHdlIGRvbid0IGNhcmUgd2hhdAorICAgICAgICAvLyB0aGUgYW5kIG1hc2sgaXMuCisgICAgICAgIGlmICgoQnl0ZU1hc2sgJiAoMSA8PCBpKSkgPT0gMCkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBBbmRNYXNrIGlzIGFsbCB6ZXJvcyBmb3IgdGhpcyBieXRlLCBjbGVhciB0aGUgYml0LgorICAgICAgICBBUEludCBNYXNrQiA9IEFuZE1hc2sgJiBCeXRlOworICAgICAgICBpZiAoTWFza0IgPT0gMCkgeworICAgICAgICAgIEJ5dGVNYXNrICY9IH4oMVUgPDwgaSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBBbmRNYXNrIGlzIG5vdCBhbGwgb25lcyBmb3IgdGhpcyBieXRlLCBpdCdzIG5vdCBhIGJ5dGV6YXAuCisgICAgICAgIGlmIChNYXNrQiAhPSBCeXRlKQorICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIE90aGVyd2lzZSwgdGhpcyBieXRlIGlzIGtlcHQuCisgICAgICB9CisKKyAgICAgIHJldHVybiBDb2xsZWN0QlN3YXBQYXJ0cyhJLT5nZXRPcGVyYW5kKDApLCBPdmVyYWxsTGVmdFNoaWZ0LCBCeXRlTWFzaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVZhbHVlcyk7CisgICAgfQorICB9CisgIAorICAvLyBPa2F5LCB3ZSBnb3QgdG8gc29tZXRoaW5nIHRoYXQgaXNuJ3QgYSBzaGlmdCwgJ29yJyBvciAnYW5kJy4gIFRoaXMgbXVzdCBiZQorICAvLyB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIGJzd2FwLiAgU29tZSBvYnNlcnZhdGlvbnM6IDEpIGlmIG1vcmUgdGhhbiBvbmUgYnl0ZQorICAvLyBpcyBkZW1hbmRlZCBmcm9tIHRoaXMgaW5wdXQsIHRoZW4gaXQgY291bGQgbm90IGJlIHN1Y2Nlc3NmdWxseSBhc3NlbWJsZWQKKyAgLy8gaW50byBhIGJ5dGVzd2FwLiAgQXQgbGVhc3Qgb25lIG9mIHRoZSB0d28gYnl0ZXMgd291bGQgbm90IGJlIGFsaWduZWQgd2l0aAorICAvLyB0aGVpciB1bHRpbWF0ZSBkZXN0aW5hdGlvbi4KKyAgaWYgKCFpc1Bvd2VyT2YyXzMyKEJ5dGVNYXNrKSkgcmV0dXJuIHRydWU7CisgIHVuc2lnbmVkIElucHV0Qnl0ZU5vID0gQ291bnRUcmFpbGluZ1plcm9zXzMyKEJ5dGVNYXNrKTsKKyAgCisgIC8vIDIpIFRoZSBpbnB1dCBhbmQgdWx0aW1hdGUgZGVzdGluYXRpb25zIG11c3QgbGluZSB1cDogaWYgYnl0ZSAzIG9mIGFuIGkzMgorICAvLyBpcyBkZW1hbmRlZCwgaXQgbmVlZHMgdG8gZ28gaW50byBieXRlIDAgb2YgdGhlIHJlc3VsdC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKKyAgLy8gYnl0ZSBuZWVkcyB0byBiZSBzaGlmdGVkIHVudGlsIGl0IGxhbmRzIGluIHRoZSByaWdodCBieXRlIGJ1Y2tldC4gIFRoZQorICAvLyBzaGlmdCBhbW91bnQgZGVwZW5kcyBvbiB0aGUgcG9zaXRpb246IGlmIHRoZSBieXRlIGlzIGNvbWluZyBmcm9tIHRoZSBoaWdoCisgIC8vIHBhcnQgb2YgdGhlIHZhbHVlIChlLmcuIGJ5dGUgMykgdGhlbiBpdCBtdXN0IGJlIHNoaWZ0ZWQgcmlnaHQuICBJZiBmcm9tIHRoZQorICAvLyBsb3cgcGFydCwgaXQgbXVzdCBiZSBzaGlmdGVkIGxlZnQuCisgIHVuc2lnbmVkIERlc3RCeXRlTm8gPSBJbnB1dEJ5dGVObyArIE92ZXJhbGxMZWZ0U2hpZnQ7CisgIGlmIChJbnB1dEJ5dGVObyA8IEJ5dGVWYWx1ZXMuc2l6ZSgpLzIpIHsKKyAgICBpZiAoQnl0ZVZhbHVlcy5zaXplKCktMS1EZXN0Qnl0ZU5vICE9IElucHV0Qnl0ZU5vKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgaWYgKEJ5dGVWYWx1ZXMuc2l6ZSgpLTEtRGVzdEJ5dGVObyAhPSBJbnB1dEJ5dGVObykKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIAorICAvLyBJZiB0aGUgZGVzdGluYXRpb24gYnl0ZSB2YWx1ZSBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZSB2YWx1ZXMgYXJlIG9yJ2QKKyAgLy8gdG9nZXRoZXIsIHdoaWNoIGlzbid0IGEgYnN3YXAgKHVubGVzcyBpdCdzIGFuIG9yIG9mIHRoZSBzYW1lIGJpdHMpLgorICBpZiAoQnl0ZVZhbHVlc1tEZXN0Qnl0ZU5vXSAmJiBCeXRlVmFsdWVzW0Rlc3RCeXRlTm9dICE9IFYpCisgICAgcmV0dXJuIHRydWU7CisgIEJ5dGVWYWx1ZXNbRGVzdEJ5dGVOb10gPSBWOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBNYXRjaEJTd2FwIC0gR2l2ZW4gYW4gT1IgaW5zdHJ1Y3Rpb24sIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgYnN3YXAgaWRpb20uCisvLy8gSWYgc28sIGluc2VydCB0aGUgbmV3IGJzd2FwIGludHJpbnNpYyBhbmQgcmV0dXJuIGl0LgorSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6TWF0Y2hCU3dhcChCaW5hcnlPcGVyYXRvciAmSSkgeworICBjb25zdCBJbnRlZ2VyVHlwZSAqSVR5ID0gZHluX2Nhc3Q8SW50ZWdlclR5cGU+KEkuZ2V0VHlwZSgpKTsKKyAgaWYgKCFJVHkgfHwgSVR5LT5nZXRCaXRXaWR0aCgpICUgMTYgfHwgCisgICAgICAvLyBCeXRlTWFzayBvbmx5IGFsbG93cyB1cCB0byAzMi1ieXRlIHZhbHVlcy4KKyAgICAgIElUeS0+Z2V0Qml0V2lkdGgoKSA+IDMyKjgpIAorICAgIHJldHVybiAwOyAgIC8vIENhbiBvbmx5IGJzd2FwIHBhaXJzIG9mIGJ5dGVzLiAgQ2FuJ3QgZG8gdmVjdG9ycy4KKyAgCisgIC8vLyBCeXRlVmFsdWVzIC0gRm9yIGVhY2ggYnl0ZSBvZiB0aGUgcmVzdWx0LCB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIHZhbHVlCisgIC8vLyBkZWZpbmVzIGVhY2ggYnl0ZS4KKyAgU21hbGxWZWN0b3I8VmFsdWUqLCA4PiBCeXRlVmFsdWVzOworICBCeXRlVmFsdWVzLnJlc2l6ZShJVHktPmdldEJpdFdpZHRoKCkvOCk7CisgICAgCisgIC8vIFRyeSB0byBmaW5kIGFsbCB0aGUgcGllY2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJzd2FwLgorICB1aW50MzJfdCBCeXRlTWFzayA9IH4wVSA+PiAoMzItQnl0ZVZhbHVlcy5zaXplKCkpOworICBpZiAoQ29sbGVjdEJTd2FwUGFydHMoJkksIDAsIEJ5dGVNYXNrLCBCeXRlVmFsdWVzKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIENoZWNrIHRvIHNlZSBpZiBhbGwgb2YgdGhlIGJ5dGVzIGNvbWUgZnJvbSB0aGUgc2FtZSB2YWx1ZS4KKyAgVmFsdWUgKlYgPSBCeXRlVmFsdWVzWzBdOworICBpZiAoViA9PSAwKSByZXR1cm4gMDsgIC8vIERpZG4ndCBmaW5kIGEgYnl0ZT8gIE11c3QgYmUgemVyby4KKyAgCisgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiB0aGUgYnl0ZXMgY29tZSBmcm9tIHRoZSBzYW1lIHZhbHVlLgorICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gQnl0ZVZhbHVlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChCeXRlVmFsdWVzW2ldICE9IFYpCisgICAgICByZXR1cm4gMDsKKyAgY29uc3QgVHlwZSAqVHlzW10gPSB7IElUeSB9OworICBNb2R1bGUgKk0gPSBJLmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgIEZ1bmN0aW9uICpGID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihNLCBJbnRyaW5zaWM6OmJzd2FwLCBUeXMsIDEpOworICByZXR1cm4gQ2FsbEluc3Q6OkNyZWF0ZShGLCBWKTsKK30KKworLy8vIE1hdGNoU2VsZWN0RnJvbUFuZE9yIC0gV2UgaGF2ZSBhbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIChBJkMpfChCJkQpLiAgQ2hlY2sKKy8vLyBJZiBBIGlzIChjb25kPy0xOjApIGFuZCBlaXRoZXIgQiBvciBEIGlzIH4oY29uZD8tMSwwKSBvciAoY29uZD8wLC0xKSwgdGhlbgorLy8vIHdlIGNhbiBzaW1wbGlmeSB0aGlzIGV4cHJlc3Npb24gdG8gImNvbmQgPyBDIDogRCBvciBCIi4KK3N0YXRpYyBJbnN0cnVjdGlvbiAqTWF0Y2hTZWxlY3RGcm9tQW5kT3IoVmFsdWUgKkEsIFZhbHVlICpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQywgVmFsdWUgKkQpIHsKKyAgLy8gSWYgQSBpcyBub3QgYSBzZWxlY3Qgb2YgLTEvMCwgdGhpcyBjYW5ub3QgbWF0Y2guCisgIFZhbHVlICpDb25kID0gMDsKKyAgaWYgKCFtYXRjaChBLCBtX1NFeHQobV9WYWx1ZShDb25kKSkpIHx8CisgICAgICAhQ29uZC0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgxKSkKKyAgICByZXR1cm4gMDsKKworICAvLyAoKGNvbmQ/LTE6MCkmQykgfCAoQiYoY29uZD8wOi0xKSkgLT4gY29uZCA/IEMgOiBCLgorICBpZiAobWF0Y2goRCwgbV9Ob3QobV9TRXh0KG1fU3BlY2lmaWMoQ29uZCkpKSkpCisgICAgcmV0dXJuIFNlbGVjdEluc3Q6OkNyZWF0ZShDb25kLCBDLCBCKTsKKyAgaWYgKG1hdGNoKEQsIG1fU0V4dChtX05vdChtX1NwZWNpZmljKENvbmQpKSkpKQorICAgIHJldHVybiBTZWxlY3RJbnN0OjpDcmVhdGUoQ29uZCwgQywgQik7CisgIAorICAvLyAoKGNvbmQ/LTE6MCkmQykgfCAoKGNvbmQ/MDotMSkmRCkgLT4gY29uZCA/IEMgOiBELgorICBpZiAobWF0Y2goQiwgbV9Ob3QobV9TRXh0KG1fU3BlY2lmaWMoQ29uZCkpKSkpCisgICAgcmV0dXJuIFNlbGVjdEluc3Q6OkNyZWF0ZShDb25kLCBDLCBEKTsKKyAgaWYgKG1hdGNoKEIsIG1fU0V4dChtX05vdChtX1NwZWNpZmljKENvbmQpKSkpKQorICAgIHJldHVybiBTZWxlY3RJbnN0OjpDcmVhdGUoQ29uZCwgQywgRCk7CisgIHJldHVybiAwOworfQorCisvLy8gRm9sZE9yT2ZJQ21wcyAtIEZvbGQgKGljbXApfChpY21wKSBpZiBwb3NzaWJsZS4KK1ZhbHVlICpJbnN0Q29tYmluZXI6OkZvbGRPck9mSUNtcHMoSUNtcEluc3QgKkxIUywgSUNtcEluc3QgKlJIUykgeworICBJQ21wSW5zdDo6UHJlZGljYXRlIExIU0NDID0gTEhTLT5nZXRQcmVkaWNhdGUoKSwgUkhTQ0MgPSBSSFMtPmdldFByZWRpY2F0ZSgpOworCisgIC8vIChpY21wMSBBLCBCKSB8IChpY21wMiBBLCBCKSAtLT4gKGljbXAzIEEsIEIpCisgIGlmIChQcmVkaWNhdGVzRm9sZGFibGUoTEhTQ0MsIFJIU0NDKSkgeworICAgIGlmIChMSFMtPmdldE9wZXJhbmQoMCkgPT0gUkhTLT5nZXRPcGVyYW5kKDEpICYmCisgICAgICAgIExIUy0+Z2V0T3BlcmFuZCgxKSA9PSBSSFMtPmdldE9wZXJhbmQoMCkpCisgICAgICBMSFMtPnN3YXBPcGVyYW5kcygpOworICAgIGlmIChMSFMtPmdldE9wZXJhbmQoMCkgPT0gUkhTLT5nZXRPcGVyYW5kKDApICYmCisgICAgICAgIExIUy0+Z2V0T3BlcmFuZCgxKSA9PSBSSFMtPmdldE9wZXJhbmQoMSkpIHsKKyAgICAgIFZhbHVlICpPcDAgPSBMSFMtPmdldE9wZXJhbmQoMCksICpPcDEgPSBMSFMtPmdldE9wZXJhbmQoMSk7CisgICAgICB1bnNpZ25lZCBDb2RlID0gZ2V0SUNtcENvZGUoTEhTKSB8IGdldElDbXBDb2RlKFJIUyk7CisgICAgICBib29sIGlzU2lnbmVkID0gTEhTLT5pc1NpZ25lZCgpIHx8IFJIUy0+aXNTaWduZWQoKTsKKyAgICAgIHJldHVybiBnZXRJQ21wVmFsdWUoaXNTaWduZWQsIENvZGUsIE9wMCwgT3AxLCBCdWlsZGVyKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIFRoaXMgb25seSBoYW5kbGVzIGljbXAgb2YgY29uc3RhbnRzOiAoaWNtcDEgQSwgQzEpIHwgKGljbXAyIEIsIEMyKS4KKyAgVmFsdWUgKlZhbCA9IExIUy0+Z2V0T3BlcmFuZCgwKSwgKlZhbDIgPSBSSFMtPmdldE9wZXJhbmQoMCk7CisgIENvbnN0YW50SW50ICpMSFNDc3QgPSBkeW5fY2FzdDxDb25zdGFudEludD4oTEhTLT5nZXRPcGVyYW5kKDEpKTsKKyAgQ29uc3RhbnRJbnQgKlJIU0NzdCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihSSFMtPmdldE9wZXJhbmQoMSkpOworICBpZiAoTEhTQ3N0ID09IDAgfHwgUkhTQ3N0ID09IDApIHJldHVybiAwOworCisgIGlmIChMSFNDc3QgPT0gUkhTQ3N0ICYmIExIU0NDID09IFJIU0NDKSB7CisgICAgLy8gKGljbXAgbmUgQSwgMCkgfCAoaWNtcCBuZSBCLCAwKSAtLT4gKGljbXAgbmUgKEF8QiksIDApCisgICAgaWYgKExIU0NDID09IElDbXBJbnN0OjpJQ01QX05FICYmIExIU0NzdC0+aXNaZXJvKCkpIHsKKyAgICAgIFZhbHVlICpOZXdPciA9IEJ1aWxkZXItPkNyZWF0ZU9yKFZhbCwgVmFsMik7CisgICAgICByZXR1cm4gQnVpbGRlci0+Q3JlYXRlSUNtcChMSFNDQywgTmV3T3IsIExIU0NzdCk7CisgICAgfQorICAKKyAgICAvLyAoaWNtcCBlcSAoQSAmIEMxKSwgMCkgfCAoaWNtcCBlcSAoQSAmIEMyKSwgMCkgLS0+CisgICAgLy8gKGljbXAgbmUgKEEgJiAoQzF8QzIpKSwgKEMxfEMyKSkgd2hlcmUgQzEgYW5kIEMyIGFyZSBub24temVybyBQT1QKKyAgICBpZiAoTEhTQ0MgPT0gSUNtcEluc3Q6OklDTVBfRVEgJiYgTEhTQ3N0LT5pc1plcm8oKSkgeworICAgICAgVmFsdWUgKk9wMSA9IDAsICpPcDIgPSAwOworICAgICAgQ29uc3RhbnRJbnQgKkNJMSA9IDAsICpDSTIgPSAwOworICAgICAgaWYgKG1hdGNoKExIUy0+Z2V0T3BlcmFuZCgwKSwgbV9BbmQobV9WYWx1ZShPcDEpLCBtX0NvbnN0YW50SW50KENJMSkpKSAmJgorICAgICAgICAgIG1hdGNoKFJIUy0+Z2V0T3BlcmFuZCgwKSwgbV9BbmQobV9WYWx1ZShPcDIpLCBtX0NvbnN0YW50SW50KENJMikpKSkgeworICAgICAgICBpZiAoT3AxID09IE9wMiAmJiAhQ0kxLT5pc1plcm8oKSAmJiAhQ0kyLT5pc1plcm8oKSAmJgorICAgICAgICAgICAgQ0kxLT5nZXRWYWx1ZSgpLmlzUG93ZXJPZjIoKSAmJiBDSTItPmdldFZhbHVlKCkuaXNQb3dlck9mMigpKSB7CisgICAgICAgICAgQ29uc3RhbnQgKkNvbnN0T3IgPSBDb25zdGFudEV4cHI6OmdldE9yKENJMSwgQ0kyKTsKKyAgICAgICAgICBWYWx1ZSAqTmV3QW5kID0gQnVpbGRlci0+Q3JlYXRlQW5kKE9wMSwgQ29uc3RPcik7CisgICAgICAgICAgcmV0dXJuIEJ1aWxkZXItPkNyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfTkUsIE5ld0FuZCwgQ29uc3RPcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIEZyb20gaGVyZSBvbiwgd2Ugb25seSBoYW5kbGU6CisgIC8vICAgIChpY21wMSBBLCBDMSkgfCAoaWNtcDIgQSwgQzIpIC0tPiBzb21ldGhpbmcgc2ltcGxlci4KKyAgaWYgKFZhbCAhPSBWYWwyKSByZXR1cm4gMDsKKyAgCisgIC8vIElDTVBfW1VTXVtHTF1FIFgsIENTVCBpcyBmb2xkZWQgdG8gSUNNUF9bVVNdW0dMXVQgZWxzZXdoZXJlLgorICBpZiAoTEhTQ0MgPT0gSUNtcEluc3Q6OklDTVBfVUdFIHx8IExIU0NDID09IElDbXBJbnN0OjpJQ01QX1VMRSB8fAorICAgICAgUkhTQ0MgPT0gSUNtcEluc3Q6OklDTVBfVUdFIHx8IFJIU0NDID09IElDbXBJbnN0OjpJQ01QX1VMRSB8fAorICAgICAgTEhTQ0MgPT0gSUNtcEluc3Q6OklDTVBfU0dFIHx8IExIU0NDID09IElDbXBJbnN0OjpJQ01QX1NMRSB8fAorICAgICAgUkhTQ0MgPT0gSUNtcEluc3Q6OklDTVBfU0dFIHx8IFJIU0NDID09IElDbXBJbnN0OjpJQ01QX1NMRSkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIFdlIGNhbid0IGZvbGQgKHVndCB4LCBDKSB8IChzZ3QgeCwgQzIpLgorICBpZiAoIVByZWRpY2F0ZXNGb2xkYWJsZShMSFNDQywgUkhTQ0MpKQorICAgIHJldHVybiAwOworICAKKyAgLy8gRW5zdXJlIHRoYXQgdGhlIGxhcmdlciBjb25zdGFudCBpcyBvbiB0aGUgUkhTLgorICBib29sIFNob3VsZFN3YXA7CisgIGlmIChDbXBJbnN0Ojppc1NpZ25lZChMSFNDQykgfHwKKyAgICAgIChJQ21wSW5zdDo6aXNFcXVhbGl0eShMSFNDQykgJiYgCisgICAgICAgQ21wSW5zdDo6aXNTaWduZWQoUkhTQ0MpKSkKKyAgICBTaG91bGRTd2FwID0gTEhTQ3N0LT5nZXRWYWx1ZSgpLnNndChSSFNDc3QtPmdldFZhbHVlKCkpOworICBlbHNlCisgICAgU2hvdWxkU3dhcCA9IExIU0NzdC0+Z2V0VmFsdWUoKS51Z3QoUkhTQ3N0LT5nZXRWYWx1ZSgpKTsKKyAgCisgIGlmIChTaG91bGRTd2FwKSB7CisgICAgc3RkOjpzd2FwKExIUywgUkhTKTsKKyAgICBzdGQ6OnN3YXAoTEhTQ3N0LCBSSFNDc3QpOworICAgIHN0ZDo6c3dhcChMSFNDQywgUkhTQ0MpOworICB9CisgIAorICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHdlIGhhdmUgdHdvIGljbXAgaW5zdHJ1Y3Rpb25zCisgIC8vIGNvbXBhcmluZyBhIHZhbHVlIGFnYWluc3QgdHdvIGNvbnN0YW50cyBhbmQgb3InaW5nIHRoZSByZXN1bHQKKyAgLy8gdG9nZXRoZXIuICBCZWNhdXNlIG9mIHRoZSBhYm92ZSBjaGVjaywgd2Uga25vdyB0aGF0IHdlIG9ubHkgaGF2ZQorICAvLyBJQ01QX0VRLCBJQ01QX05FLCBJQ01QX0xULCBhbmQgSUNNUF9HVCBoZXJlLiBXZSBhbHNvIGtub3cgKGZyb20gdGhlCisgIC8vIGljbXAgZm9sZGluZyBjaGVjayBhYm92ZSksIHRoYXQgdGhlIHR3byBjb25zdGFudHMgYXJlIG5vdAorICAvLyBlcXVhbC4KKyAgYXNzZXJ0KExIU0NzdCAhPSBSSFNDc3QgJiYgIkNvbXBhcmVzIG5vdCBmb2xkZWQgYWJvdmU/Iik7CisKKyAgc3dpdGNoIChMSFNDQykgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgY29uZGl0aW9uIGNvZGUhIik7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6CisgICAgc3dpdGNoIChSSFNDQykgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW50ZWdlciBjb25kaXRpb24gY29kZSEiKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROgorICAgICAgaWYgKExIU0NzdCA9PSBTdWJPbmUoUkhTQ3N0KSkgeworICAgICAgICAvLyAoWCA9PSAxMyB8IFggPT0gMTQpIC0+IFgtMTMgPHUgMgorICAgICAgICBDb25zdGFudCAqQWRkQ1NUID0gQ29uc3RhbnRFeHByOjpnZXROZWcoTEhTQ3N0KTsKKyAgICAgICAgVmFsdWUgKkFkZCA9IEJ1aWxkZXItPkNyZWF0ZUFkZChWYWwsIEFkZENTVCk7CisgICAgICAgIEFkZENTVCA9IENvbnN0YW50RXhwcjo6Z2V0U3ViKEFkZE9uZShSSFNDc3QpLCBMSFNDc3QpOworICAgICAgICByZXR1cm4gQnVpbGRlci0+Q3JlYXRlSUNtcFVMVChBZGQsIEFkZENTVCk7CisgICAgICB9CisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFggPT0gMTMgfCBYID09IDE1KSAtPiBubyBjaGFuZ2UKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDogICAgICAgICAvLyAoWCA9PSAxMyB8IFggdT4gMTQpIC0+IG5vIGNoYW5nZQorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiAgICAgICAgIC8vIChYID09IDEzIHwgWCBzPiAxNCkgLT4gbm8gY2hhbmdlCisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiAgICAgICAgICAvLyAoWCA9PSAxMyB8IFggIT0gMTUpIC0+IFggIT0gMTUKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDogICAgICAgICAvLyAoWCA9PSAxMyB8IFggdTwgMTUpIC0+IFggdTwgMTUKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogICAgICAgICAvLyAoWCA9PSAxMyB8IFggczwgMTUpIC0+IFggczwgMTUKKyAgICAgIHJldHVybiBSSFM7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOgorICAgIHN3aXRjaCAoUkhTQ0MpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgY29uZGl0aW9uIGNvZGUhIik7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogICAgICAgICAgLy8gKFggIT0gMTMgfCBYID09IDE1KSAtPiBYICE9IDEzCisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6ICAgICAgICAgLy8gKFggIT0gMTMgfCBYIHU+IDE1KSAtPiBYICE9IDEzCisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6ICAgICAgICAgLy8gKFggIT0gMTMgfCBYIHM+IDE1KSAtPiBYICE9IDEzCisgICAgICByZXR1cm4gTEhTOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6ICAgICAgICAgIC8vIChYICE9IDEzIHwgWCAhPSAxNSkgLT4gdHJ1ZQorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOiAgICAgICAgIC8vIChYICE9IDEzIHwgWCB1PCAxNSkgLT4gdHJ1ZQorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiAgICAgICAgIC8vIChYICE9IDEzIHwgWCBzPCAxNSkgLT4gdHJ1ZQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXRUcnVlKExIUy0+Z2V0Q29udGV4dCgpKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOgorICAgIHN3aXRjaCAoUkhTQ0MpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgY29uZGl0aW9uIGNvZGUhIik7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogICAgICAgICAvLyAoWCB1PCAxMyB8IFggPT0gMTQpIC0+IG5vIGNoYW5nZQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6ICAgICAgICAvLyAoWCB1PCAxMyB8IFggdT4gMTUpIC0+IChYLTEzKSB1PiAyCisgICAgICAvLyBJZiBSSFNDc3QgaXMgW3VzXU1BWElOVCwgaXQgaXMgYWx3YXlzIGZhbHNlLiAgTm90IGhhbmRsaW5nCisgICAgICAvLyB0aGlzIGNhbiBjYXVzZSBvdmVyZmxvdy4KKyAgICAgIGlmIChSSFNDc3QtPmlzTWF4VmFsdWUoZmFsc2UpKQorICAgICAgICByZXR1cm4gTEhTOworICAgICAgcmV0dXJuIEluc2VydFJhbmdlVGVzdChWYWwsIExIU0NzdCwgQWRkT25lKFJIU0NzdCksIGZhbHNlLCBmYWxzZSk7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6ICAgICAgICAvLyAoWCB1PCAxMyB8IFggcz4gMTUpIC0+IG5vIGNoYW5nZQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORTogICAgICAgICAvLyAoWCB1PCAxMyB8IFggIT0gMTUpIC0+IFggIT0gMTUKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDogICAgICAgIC8vIChYIHU8IDEzIHwgWCB1PCAxNSkgLT4gWCB1PCAxNQorICAgICAgcmV0dXJuIFJIUzsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogICAgICAgIC8vIChYIHU8IDEzIHwgWCBzPCAxNSkgLT4gbm8gY2hhbmdlCisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOgorICAgIHN3aXRjaCAoUkhTQ0MpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgY29uZGl0aW9uIGNvZGUhIik7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogICAgICAgICAvLyAoWCBzPCAxMyB8IFggPT0gMTQpIC0+IG5vIGNoYW5nZQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6ICAgICAgICAvLyAoWCBzPCAxMyB8IFggcz4gMTUpIC0+IChYLTEzKSBzPiAyCisgICAgICAvLyBJZiBSSFNDc3QgaXMgW3VzXU1BWElOVCwgaXQgaXMgYWx3YXlzIGZhbHNlLiAgTm90IGhhbmRsaW5nCisgICAgICAvLyB0aGlzIGNhbiBjYXVzZSBvdmVyZmxvdy4KKyAgICAgIGlmIChSSFNDc3QtPmlzTWF4VmFsdWUodHJ1ZSkpCisgICAgICAgIHJldHVybiBMSFM7CisgICAgICByZXR1cm4gSW5zZXJ0UmFuZ2VUZXN0KFZhbCwgTEhTQ3N0LCBBZGRPbmUoUkhTQ3N0KSwgdHJ1ZSwgZmFsc2UpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiAgICAgICAgLy8gKFggczwgMTMgfCBYIHU+IDE1KSAtPiBubyBjaGFuZ2UKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6ICAgICAgICAgLy8gKFggczwgMTMgfCBYICE9IDE1KSAtPiBYICE9IDE1CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTFQ6ICAgICAgICAvLyAoWCBzPCAxMyB8IFggczwgMTUpIC0+IFggczwgMTUKKyAgICAgIHJldHVybiBSSFM7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6ICAgICAgICAvLyAoWCBzPCAxMyB8IFggdTwgMTUpIC0+IG5vIGNoYW5nZQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDoKKyAgICBzd2l0Y2ggKFJIU0NDKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBpbnRlZ2VyIGNvbmRpdGlvbiBjb2RlISIpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6ICAgICAgICAgLy8gKFggdT4gMTMgfCBYID09IDE1KSAtPiBYIHU+IDEzCisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6ICAgICAgICAvLyAoWCB1PiAxMyB8IFggdT4gMTUpIC0+IFggdT4gMTMKKyAgICAgIHJldHVybiBMSFM7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6ICAgICAgICAvLyAoWCB1PiAxMyB8IFggcz4gMTUpIC0+IG5vIGNoYW5nZQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORTogICAgICAgICAvLyAoWCB1PiAxMyB8IFggIT0gMTUpIC0+IHRydWUKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDogICAgICAgIC8vIChYIHU+IDEzIHwgWCB1PCAxNSkgLT4gdHJ1ZQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXRUcnVlKExIUy0+Z2V0Q29udGV4dCgpKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogICAgICAgIC8vIChYIHU+IDEzIHwgWCBzPCAxNSkgLT4gbm8gY2hhbmdlCisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOgorICAgIHN3aXRjaCAoUkhTQ0MpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGludGVnZXIgY29uZGl0aW9uIGNvZGUhIik7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogICAgICAgICAvLyAoWCBzPiAxMyB8IFggPT0gMTUpIC0+IFggPiAxMworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiAgICAgICAgLy8gKFggcz4gMTMgfCBYIHM+IDE1KSAtPiBYID4gMTMKKyAgICAgIHJldHVybiBMSFM7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6ICAgICAgICAvLyAoWCBzPiAxMyB8IFggdT4gMTUpIC0+IG5vIGNoYW5nZQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORTogICAgICAgICAvLyAoWCBzPiAxMyB8IFggIT0gMTUpIC0+IHRydWUKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogICAgICAgIC8vIChYIHM+IDEzIHwgWCBzPCAxNSkgLT4gdHJ1ZQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXRUcnVlKExIUy0+Z2V0Q29udGV4dCgpKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDogICAgICAgIC8vIChYIHM+IDEzIHwgWCB1PCAxNSkgLT4gbm8gY2hhbmdlCisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBGb2xkT3JPZkZDbXBzIC0gT3B0aW1pemUgKGZjbXApfChmY21wKS4gIE5PVEU6IFVubGlrZSB0aGUgcmVzdCBvZgorLy8vIGluc3Rjb21iaW5lLCB0aGlzIHJldHVybnMgYSBWYWx1ZSB3aGljaCBzaG91bGQgYWxyZWFkeSBiZSBpbnNlcnRlZCBpbnRvIHRoZQorLy8vIGZ1bmN0aW9uLgorVmFsdWUgKkluc3RDb21iaW5lcjo6Rm9sZE9yT2ZGQ21wcyhGQ21wSW5zdCAqTEhTLCBGQ21wSW5zdCAqUkhTKSB7CisgIGlmIChMSFMtPmdldFByZWRpY2F0ZSgpID09IEZDbXBJbnN0OjpGQ01QX1VOTyAmJgorICAgICAgUkhTLT5nZXRQcmVkaWNhdGUoKSA9PSBGQ21wSW5zdDo6RkNNUF9VTk8gJiYgCisgICAgICBMSFMtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSA9PSBSSFMtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkgeworICAgIGlmIChDb25zdGFudEZQICpMSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oTEhTLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIGlmIChDb25zdGFudEZQICpSSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oUkhTLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICAvLyBJZiBlaXRoZXIgb2YgdGhlIGNvbnN0YW50cyBhcmUgbmFucywgdGhlbiB0aGUgd2hvbGUgdGhpbmcgcmV0dXJucworICAgICAgICAvLyB0cnVlLgorICAgICAgICBpZiAoTEhTQy0+Z2V0VmFsdWVBUEYoKS5pc05hTigpIHx8IFJIU0MtPmdldFZhbHVlQVBGKCkuaXNOYU4oKSkKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldFRydWUoTEhTLT5nZXRDb250ZXh0KCkpOworICAgICAgICAKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBubyBuZWVkIHRvIGNvbXBhcmUgdGhlIHR3byBjb25zdGFudHMsIGNvbXBhcmUgdGhlCisgICAgICAgIC8vIHJlc3QuCisgICAgICAgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVGQ21wVU5PKExIUy0+Z2V0T3BlcmFuZCgwKSwgUkhTLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIH0KKyAgICAKKyAgICAvLyBIYW5kbGUgdmVjdG9yIHplcm9zLiAgVGhpcyBvY2N1cnMgYmVjYXVzZSB0aGUgY2Fub25pY2FsIGZvcm0gb2YKKyAgICAvLyAiZmNtcCB1bm8geCx4IiBpcyAiZmNtcCB1bm8geCwgMCIuCisgICAgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KExIUy0+Z2V0T3BlcmFuZCgxKSkgJiYKKyAgICAgICAgaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oUkhTLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVGQ21wVU5PKExIUy0+Z2V0T3BlcmFuZCgwKSwgUkhTLT5nZXRPcGVyYW5kKDApKTsKKyAgICAKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgVmFsdWUgKk9wMExIUyA9IExIUy0+Z2V0T3BlcmFuZCgwKSwgKk9wMFJIUyA9IExIUy0+Z2V0T3BlcmFuZCgxKTsKKyAgVmFsdWUgKk9wMUxIUyA9IFJIUy0+Z2V0T3BlcmFuZCgwKSwgKk9wMVJIUyA9IFJIUy0+Z2V0T3BlcmFuZCgxKTsKKyAgRkNtcEluc3Q6OlByZWRpY2F0ZSBPcDBDQyA9IExIUy0+Z2V0UHJlZGljYXRlKCksIE9wMUNDID0gUkhTLT5nZXRQcmVkaWNhdGUoKTsKKyAgCisgIGlmIChPcDBMSFMgPT0gT3AxUkhTICYmIE9wMFJIUyA9PSBPcDFMSFMpIHsKKyAgICAvLyBTd2FwIFJIUyBvcGVyYW5kcyB0byBtYXRjaCBMSFMuCisgICAgT3AxQ0MgPSBGQ21wSW5zdDo6Z2V0U3dhcHBlZFByZWRpY2F0ZShPcDFDQyk7CisgICAgc3RkOjpzd2FwKE9wMUxIUywgT3AxUkhTKTsKKyAgfQorICBpZiAoT3AwTEhTID09IE9wMUxIUyAmJiBPcDBSSFMgPT0gT3AxUkhTKSB7CisgICAgLy8gU2ltcGxpZnkgKGZjbXAgY2MwIHgsIHkpIHwgKGZjbXAgY2MxIHgsIHkpLgorICAgIGlmIChPcDBDQyA9PSBPcDFDQykKKyAgICAgIHJldHVybiBCdWlsZGVyLT5DcmVhdGVGQ21wKChGQ21wSW5zdDo6UHJlZGljYXRlKU9wMENDLCBPcDBMSFMsIE9wMFJIUyk7CisgICAgaWYgKE9wMENDID09IEZDbXBJbnN0OjpGQ01QX1RSVUUgfHwgT3AxQ0MgPT0gRkNtcEluc3Q6OkZDTVBfVFJVRSkKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENtcEluc3Q6Om1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwgMSk7CisgICAgaWYgKE9wMENDID09IEZDbXBJbnN0OjpGQ01QX0ZBTFNFKQorICAgICAgcmV0dXJuIFJIUzsKKyAgICBpZiAoT3AxQ0MgPT0gRkNtcEluc3Q6OkZDTVBfRkFMU0UpCisgICAgICByZXR1cm4gTEhTOworICAgIGJvb2wgT3AwT3JkZXJlZDsKKyAgICBib29sIE9wMU9yZGVyZWQ7CisgICAgdW5zaWduZWQgT3AwUHJlZCA9IGdldEZDbXBDb2RlKE9wMENDLCBPcDBPcmRlcmVkKTsKKyAgICB1bnNpZ25lZCBPcDFQcmVkID0gZ2V0RkNtcENvZGUoT3AxQ0MsIE9wMU9yZGVyZWQpOworICAgIGlmIChPcDBPcmRlcmVkID09IE9wMU9yZGVyZWQpIHsKKyAgICAgIC8vIElmIGJvdGggYXJlIG9yZGVyZWQgb3IgdW5vcmRlcmVkLCByZXR1cm4gYSBuZXcgZmNtcCB3aXRoCisgICAgICAvLyBvcidlZCBwcmVkaWNhdGVzLgorICAgICAgcmV0dXJuIGdldEZDbXBWYWx1ZShPcDBPcmRlcmVkLCBPcDBQcmVkfE9wMVByZWQsIE9wMExIUywgT3AwUkhTLCBCdWlsZGVyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBGb2xkT3JXaXRoQ29uc3RhbnRzIC0gVGhpcyBoZWxwZXIgZnVuY3Rpb24gZm9sZHM6CisvLy8KKy8vLyAgICAgKChBIHwgQikgJiBDMSkgfCAoQiAmIEMyKQorLy8vCisvLy8gaW50bzoKKy8vLyAKKy8vLyAgICAgKEEgJiBDMSkgfCBCCisvLy8KKy8vLyB3aGVuIHRoZSBYT1Igb2YgdGhlIHR3byBjb25zdGFudHMgaXMgImFsbCBvbmVzIiAoLTEpLgorSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6Rm9sZE9yV2l0aENvbnN0YW50cyhCaW5hcnlPcGVyYXRvciAmSSwgVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQSwgVmFsdWUgKkIsIFZhbHVlICpDKSB7CisgIENvbnN0YW50SW50ICpDSTEgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQyk7CisgIGlmICghQ0kxKSByZXR1cm4gMDsKKworICBWYWx1ZSAqVjEgPSAwOworICBDb25zdGFudEludCAqQ0kyID0gMDsKKyAgaWYgKCFtYXRjaChPcCwgbV9BbmQobV9WYWx1ZShWMSksIG1fQ29uc3RhbnRJbnQoQ0kyKSkpKSByZXR1cm4gMDsKKworICBBUEludCBYb3IgPSBDSTEtPmdldFZhbHVlKCkgXiBDSTItPmdldFZhbHVlKCk7CisgIGlmICghWG9yLmlzQWxsT25lc1ZhbHVlKCkpIHJldHVybiAwOworCisgIGlmIChWMSA9PSBBIHx8IFYxID09IEIpIHsKKyAgICBWYWx1ZSAqTmV3T3AgPSBCdWlsZGVyLT5DcmVhdGVBbmQoKFYxID09IEEpID8gQiA6IEEsIENJMSk7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihOZXdPcCwgVjEpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0T3IoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgYm9vbCBDaGFuZ2VkID0gU2ltcGxpZnlDb21tdXRhdGl2ZShJKTsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICBpZiAoVmFsdWUgKlYgPSBTaW1wbGlmeU9ySW5zdChPcDAsIE9wMSwgVEQpKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIFYpOworCisgIC8vIFNlZSBpZiB3ZSBjYW4gc2ltcGxpZnkgYW55IGluc3RydWN0aW9ucyB1c2VkIGJ5IHRoZSBpbnN0cnVjdGlvbiB3aG9zZSBzb2xlIAorICAvLyBwdXJwb3NlIGlzIHRvIGNvbXB1dGUgYml0cyB3ZSBkb24ndCBjYXJlIGFib3V0LgorICBpZiAoU2ltcGxpZnlEZW1hbmRlZEluc3RydWN0aW9uQml0cyhJKSkKKyAgICByZXR1cm4gJkk7CisKKyAgaWYgKENvbnN0YW50SW50ICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AxKSkgeworICAgIENvbnN0YW50SW50ICpDMSA9IDA7IFZhbHVlICpYID0gMDsKKyAgICAvLyAoWCAmIEMxKSB8IEMyIC0tPiAoWCB8IEMyKSAmIChDMXxDMikKKyAgICAvLyBpZmYgKEMxICYgQzIpID09IDAuCisgICAgaWYgKG1hdGNoKE9wMCwgbV9BbmQobV9WYWx1ZShYKSwgbV9Db25zdGFudEludChDMSkpKSAmJgorICAgICAgICAoUkhTLT5nZXRWYWx1ZSgpICYgQzEtPmdldFZhbHVlKCkpICE9IDAgJiYKKyAgICAgICAgT3AwLT5oYXNPbmVVc2UoKSkgeworICAgICAgVmFsdWUgKk9yID0gQnVpbGRlci0+Q3JlYXRlT3IoWCwgUkhTKTsKKyAgICAgIE9yLT50YWtlTmFtZShPcDApOworICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoT3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMtPmdldFZhbHVlKCkgfCBDMS0+Z2V0VmFsdWUoKSkpOworICAgIH0KKworICAgIC8vIChYIF4gQzEpIHwgQzIgLS0+IChYIHwgQzIpIF4gKEMxJn5DMikKKyAgICBpZiAobWF0Y2goT3AwLCBtX1hvcihtX1ZhbHVlKFgpLCBtX0NvbnN0YW50SW50KEMxKSkpICYmCisgICAgICAgIE9wMC0+aGFzT25lVXNlKCkpIHsKKyAgICAgIFZhbHVlICpPciA9IEJ1aWxkZXItPkNyZWF0ZU9yKFgsIFJIUyk7CisgICAgICBPci0+dGFrZU5hbWUoT3AwKTsKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKE9yLAorICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEkuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMxLT5nZXRWYWx1ZSgpICYgflJIUy0+Z2V0VmFsdWUoKSkpOworICAgIH0KKworICAgIC8vIFRyeSB0byBmb2xkIGNvbnN0YW50IGFuZCBpbnRvIHNlbGVjdCBhcmd1bWVudHMuCisgICAgaWYgKFNlbGVjdEluc3QgKlNJID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oT3AwKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqUiA9IEZvbGRPcEludG9TZWxlY3QoSSwgU0kpKQorICAgICAgICByZXR1cm4gUjsKKworICAgIGlmIChpc2E8UEhJTm9kZT4oT3AwKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEkpKQorICAgICAgICByZXR1cm4gTlY7CisgIH0KKworICBWYWx1ZSAqQSA9IDAsICpCID0gMDsKKyAgQ29uc3RhbnRJbnQgKkMxID0gMCwgKkMyID0gMDsKKworICAvLyAoQSB8IEIpIHwgQyAgYW5kICBBIHwgKEIgfCBDKSAgICAgICAgICAgICAgICAgIC0+IGJzd2FwIGlmIHBvc3NpYmxlLgorICAvLyAoQSA+PiBCKSB8IChDIDw8IEQpICBhbmQgIChBIDw8IEIpIHwgKEIgPj4gQykgIC0+IGJzd2FwIGlmIHBvc3NpYmxlLgorICBpZiAobWF0Y2goT3AwLCBtX09yKG1fVmFsdWUoKSwgbV9WYWx1ZSgpKSkgfHwKKyAgICAgIG1hdGNoKE9wMSwgbV9PcihtX1ZhbHVlKCksIG1fVmFsdWUoKSkpIHx8CisgICAgICAobWF0Y2goT3AwLCBtX1NoaWZ0KG1fVmFsdWUoKSwgbV9WYWx1ZSgpKSkgJiYKKyAgICAgICBtYXRjaChPcDEsIG1fU2hpZnQobV9WYWx1ZSgpLCBtX1ZhbHVlKCkpKSkpIHsKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkJTd2FwID0gTWF0Y2hCU3dhcChJKSkKKyAgICAgIHJldHVybiBCU3dhcDsKKyAgfQorICAKKyAgLy8gKFheQyl8WSAtPiAoWHxZKV5DIGlmZiBZJkMgPT0gMAorICBpZiAoT3AwLT5oYXNPbmVVc2UoKSAmJgorICAgICAgbWF0Y2goT3AwLCBtX1hvcihtX1ZhbHVlKEEpLCBtX0NvbnN0YW50SW50KEMxKSkpICYmCisgICAgICBNYXNrZWRWYWx1ZUlzWmVybyhPcDEsIEMxLT5nZXRWYWx1ZSgpKSkgeworICAgIFZhbHVlICpOT3IgPSBCdWlsZGVyLT5DcmVhdGVPcihBLCBPcDEpOworICAgIE5Pci0+dGFrZU5hbWUoT3AwKTsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcihOT3IsIEMxKTsKKyAgfQorCisgIC8vIFl8KFheQykgLT4gKFh8WSleQyBpZmYgWSZDID09IDAKKyAgaWYgKE9wMS0+aGFzT25lVXNlKCkgJiYKKyAgICAgIG1hdGNoKE9wMSwgbV9Yb3IobV9WYWx1ZShBKSwgbV9Db25zdGFudEludChDMSkpKSAmJgorICAgICAgTWFza2VkVmFsdWVJc1plcm8oT3AwLCBDMS0+Z2V0VmFsdWUoKSkpIHsKKyAgICBWYWx1ZSAqTk9yID0gQnVpbGRlci0+Q3JlYXRlT3IoQSwgT3AwKTsKKyAgICBOT3ItPnRha2VOYW1lKE9wMCk7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVYb3IoTk9yLCBDMSk7CisgIH0KKworICAvLyAoQSAmIEMpfChCICYgRCkKKyAgVmFsdWUgKkMgPSAwLCAqRCA9IDA7CisgIGlmIChtYXRjaChPcDAsIG1fQW5kKG1fVmFsdWUoQSksIG1fVmFsdWUoQykpKSAmJgorICAgICAgbWF0Y2goT3AxLCBtX0FuZChtX1ZhbHVlKEIpLCBtX1ZhbHVlKEQpKSkpIHsKKyAgICBWYWx1ZSAqVjEgPSAwLCAqVjIgPSAwLCAqVjMgPSAwOworICAgIEMxID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEMpOworICAgIEMyID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEQpOworICAgIGlmIChDMSAmJiBDMikgeyAgLy8gKEEgJiBDMSl8KEIgJiBDMikKKyAgICAgIC8vIElmIHdlIGhhdmU6ICgoViArIE4pICYgQzEpIHwgKFYgJiBDMikKKyAgICAgIC8vIC4uIGFuZCBDMiA9IH5DMSBhbmQgQzIgaXMgMCsxKyBhbmQgKE4gJiBDMikgPT0gMAorICAgICAgLy8gcmVwbGFjZSB3aXRoIFYrTi4KKyAgICAgIGlmIChDMS0+Z2V0VmFsdWUoKSA9PSB+QzItPmdldFZhbHVlKCkpIHsKKyAgICAgICAgaWYgKChDMi0+Z2V0VmFsdWUoKSAmIChDMi0+Z2V0VmFsdWUoKSsxKSkgPT0gMCAmJiAvLyBDMiA9PSAwKzErCisgICAgICAgICAgICBtYXRjaChBLCBtX0FkZChtX1ZhbHVlKFYxKSwgbV9WYWx1ZShWMikpKSkgeworICAgICAgICAgIC8vIEFkZCBjb21tdXRlcywgdHJ5IGJvdGggd2F5cy4KKyAgICAgICAgICBpZiAoVjEgPT0gQiAmJiBNYXNrZWRWYWx1ZUlzWmVybyhWMiwgQzItPmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQSk7CisgICAgICAgICAgaWYgKFYyID09IEIgJiYgTWFza2VkVmFsdWVJc1plcm8oVjEsIEMyLT5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIEEpOworICAgICAgICB9CisgICAgICAgIC8vIE9yIGNvbW11dGVzLCB0cnkgYm90aCB3YXlzLgorICAgICAgICBpZiAoKEMxLT5nZXRWYWx1ZSgpICYgKEMxLT5nZXRWYWx1ZSgpKzEpKSA9PSAwICYmCisgICAgICAgICAgICBtYXRjaChCLCBtX0FkZChtX1ZhbHVlKFYxKSwgbV9WYWx1ZShWMikpKSkgeworICAgICAgICAgIC8vIEFkZCBjb21tdXRlcywgdHJ5IGJvdGggd2F5cy4KKyAgICAgICAgICBpZiAoVjEgPT0gQSAmJiBNYXNrZWRWYWx1ZUlzWmVybyhWMiwgQzEtPmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQik7CisgICAgICAgICAgaWYgKFYyID09IEEgJiYgTWFza2VkVmFsdWVJc1plcm8oVjEsIEMxLT5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIEIpOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIGlmICgoQzEtPmdldFZhbHVlKCkgJiBDMi0+Z2V0VmFsdWUoKSkgPT0gMCkgeworICAgICAgICAvLyAoKFYgfCBOKSAmIEMxKSB8IChWICYgQzIpIC0tPiAoVnxOKSAmIChDMXxDMikKKyAgICAgICAgLy8gaWZmIChDMSZDMikgPT0gMCBhbmQgKE4mfkMxKSA9PSAwCisgICAgICAgIGlmIChtYXRjaChBLCBtX09yKG1fVmFsdWUoVjEpLCBtX1ZhbHVlKFYyKSkpICYmCisgICAgICAgICAgICAoKFYxID09IEIgJiYgTWFza2VkVmFsdWVJc1plcm8oVjIsIH5DMS0+Z2V0VmFsdWUoKSkpIHx8ICAvLyAoVnxOKQorICAgICAgICAgICAgIChWMiA9PSBCICYmIE1hc2tlZFZhbHVlSXNaZXJvKFYxLCB+QzEtPmdldFZhbHVlKCkpKSkpICAgLy8gKE58VikKKyAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoQS0+Z2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzEtPmdldFZhbHVlKCl8QzItPmdldFZhbHVlKCkpKTsKKyAgICAgICAgLy8gT3IgY29tbXV0ZXMsIHRyeSBib3RoIHdheXMuCisgICAgICAgIGlmIChtYXRjaChCLCBtX09yKG1fVmFsdWUoVjEpLCBtX1ZhbHVlKFYyKSkpICYmCisgICAgICAgICAgICAoKFYxID09IEEgJiYgTWFza2VkVmFsdWVJc1plcm8oVjIsIH5DMi0+Z2V0VmFsdWUoKSkpIHx8ICAvLyAoVnxOKQorICAgICAgICAgICAgIChWMiA9PSBBICYmIE1hc2tlZFZhbHVlSXNaZXJvKFYxLCB+QzItPmdldFZhbHVlKCkpKSkpICAgLy8gKE58VikKKyAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoQi0+Z2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzEtPmdldFZhbHVlKCl8QzItPmdldFZhbHVlKCkpKTsKKyAgICAgICAgCisgICAgICAgIC8vICgoVnxDMykmQzEpIHwgKChWfEM0KSZDMikgLS0+IChWfEMzfEM0KSYoQzF8QzIpCisgICAgICAgIC8vIGlmZiAoQzEmQzIpID09IDAgYW5kIChDMyZ+QzEpID09IDAgYW5kIChDNCZ+QzIpID09IDAuCisgICAgICAgIENvbnN0YW50SW50ICpDMyA9IDAsICpDNCA9IDA7CisgICAgICAgIGlmIChtYXRjaChBLCBtX09yKG1fVmFsdWUoVjEpLCBtX0NvbnN0YW50SW50KEMzKSkpICYmCisgICAgICAgICAgICAoQzMtPmdldFZhbHVlKCkgJiB+QzEtPmdldFZhbHVlKCkpID09IDAgJiYKKyAgICAgICAgICAgIG1hdGNoKEIsIG1fT3IobV9TcGVjaWZpYyhWMSksIG1fQ29uc3RhbnRJbnQoQzQpKSkgJiYKKyAgICAgICAgICAgIChDNC0+Z2V0VmFsdWUoKSAmIH5DMi0+Z2V0VmFsdWUoKSkgPT0gMCkgeworICAgICAgICAgIFYyID0gQnVpbGRlci0+Q3JlYXRlT3IoVjEsIENvbnN0YW50RXhwcjo6Z2V0T3IoQzMsIEM0KSk7CisgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChCLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMS0+Z2V0VmFsdWUoKXxDMi0+Z2V0VmFsdWUoKSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFueSBjb21tb24gdGhpbmdzIGJlaW5nIGFuZCdlZC4gIElmIHNvLCBmaW5kIHRoZQorICAgIC8vIHRlcm1zIGZvciBWMSAmIChWMnxWMykuCisgICAgaWYgKE9wMC0+aGFzT25lVXNlKCkgfHwgT3AxLT5oYXNPbmVVc2UoKSkgeworICAgICAgVjEgPSAwOworICAgICAgaWYgKEEgPT0gQikgICAgICAvLyAoQSAmIEMpfChBICYgRCkgPT0gQSAmIChDfEQpCisgICAgICAgIFYxID0gQSwgVjIgPSBDLCBWMyA9IEQ7CisgICAgICBlbHNlIGlmIChBID09IEQpIC8vIChBICYgQyl8KEIgJiBBKSA9PSBBICYgKEJ8QykKKyAgICAgICAgVjEgPSBBLCBWMiA9IEIsIFYzID0gQzsKKyAgICAgIGVsc2UgaWYgKEMgPT0gQikgLy8gKEEgJiBDKXwoQyAmIEQpID09IEMgJiAoQXxEKQorICAgICAgICBWMSA9IEMsIFYyID0gQSwgVjMgPSBEOworICAgICAgZWxzZSBpZiAoQyA9PSBEKSAvLyAoQSAmIEMpfChCICYgQykgPT0gQyAmIChBfEIpCisgICAgICAgIFYxID0gQywgVjIgPSBBLCBWMyA9IEI7CisgICAgICAKKyAgICAgIGlmIChWMSkgeworICAgICAgICBWYWx1ZSAqT3IgPSBCdWlsZGVyLT5DcmVhdGVPcihWMiwgVjMpOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChWMSwgT3IpOworICAgICAgfQorICAgIH0KKworICAgIC8vIChBICYgKEMwPy0xOjApKSB8IChCICYgfihDMD8tMTowKSkgLT4gIEMwID8gQSA6IEIsIGFuZCBjb21tdXRlZCB2YXJpYW50cy4KKyAgICAvLyBEb24ndCBkbyB0aGlzIGZvciB2ZWN0b3Igc2VsZWN0IGlkaW9tcywgdGhlIGNvZGUgZ2VuZXJhdG9yIGRvZXNuJ3QgaGFuZGxlCisgICAgLy8gdGhlbSB3ZWxsIHlldC4KKyAgICBpZiAoIUkuZ2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqTWF0Y2ggPSBNYXRjaFNlbGVjdEZyb21BbmRPcihBLCBCLCBDLCBEKSkKKyAgICAgICAgcmV0dXJuIE1hdGNoOworICAgICAgaWYgKEluc3RydWN0aW9uICpNYXRjaCA9IE1hdGNoU2VsZWN0RnJvbUFuZE9yKEIsIEEsIEQsIEMpKQorICAgICAgICByZXR1cm4gTWF0Y2g7CisgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKk1hdGNoID0gTWF0Y2hTZWxlY3RGcm9tQW5kT3IoQywgQiwgQSwgRCkpCisgICAgICAgIHJldHVybiBNYXRjaDsKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqTWF0Y2ggPSBNYXRjaFNlbGVjdEZyb21BbmRPcihELCBBLCBCLCBDKSkKKyAgICAgICAgcmV0dXJuIE1hdGNoOworICAgIH0KKworICAgIC8vICgoQSZ+Qil8KH5BJkIpKSAtPiBBXkIKKyAgICBpZiAoKG1hdGNoKEMsIG1fTm90KG1fU3BlY2lmaWMoRCkpKSAmJgorICAgICAgICAgbWF0Y2goQiwgbV9Ob3QobV9TcGVjaWZpYyhBKSkpKSkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKEEsIEQpOworICAgIC8vICgofkImQSl8KH5BJkIpKSAtPiBBXkIKKyAgICBpZiAoKG1hdGNoKEEsIG1fTm90KG1fU3BlY2lmaWMoRCkpKSAmJgorICAgICAgICAgbWF0Y2goQiwgbV9Ob3QobV9TcGVjaWZpYyhDKSkpKSkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKEMsIEQpOworICAgIC8vICgoQSZ+Qil8KEImfkEpKSAtPiBBXkIKKyAgICBpZiAoKG1hdGNoKEMsIG1fTm90KG1fU3BlY2lmaWMoQikpKSAmJgorICAgICAgICAgbWF0Y2goRCwgbV9Ob3QobV9TcGVjaWZpYyhBKSkpKSkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKEEsIEIpOworICAgIC8vICgofkImQSl8KEImfkEpKSAtPiBBXkIKKyAgICBpZiAoKG1hdGNoKEEsIG1fTm90KG1fU3BlY2lmaWMoQikpKSAmJgorICAgICAgICAgbWF0Y2goRCwgbV9Ob3QobV9TcGVjaWZpYyhDKSkpKSkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKEMsIEIpOworCisgICAgLy8gKChBfEIpJjEpfChCJi0yKSAtPiAoQSYxKSB8IEIKKyAgICBpZiAobWF0Y2goQSwgbV9PcihtX1ZhbHVlKFYxKSwgbV9TcGVjaWZpYyhCKSkpIHx8CisgICAgICAgIG1hdGNoKEEsIG1fT3IobV9TcGVjaWZpYyhCKSwgbV9WYWx1ZShWMSkpKSkgeworICAgICAgSW5zdHJ1Y3Rpb24gKlJldCA9IEZvbGRPcldpdGhDb25zdGFudHMoSSwgT3AxLCBWMSwgQiwgQyk7CisgICAgICBpZiAoUmV0KSByZXR1cm4gUmV0OworICAgIH0KKyAgICAvLyAoQiYtMil8KChBfEIpJjEpIC0+IChBJjEpIHwgQgorICAgIGlmIChtYXRjaChCLCBtX09yKG1fU3BlY2lmaWMoQSksIG1fVmFsdWUoVjEpKSkgfHwKKyAgICAgICAgbWF0Y2goQiwgbV9PcihtX1ZhbHVlKFYxKSwgbV9TcGVjaWZpYyhBKSkpKSB7CisgICAgICBJbnN0cnVjdGlvbiAqUmV0ID0gRm9sZE9yV2l0aENvbnN0YW50cyhJLCBPcDAsIEEsIFYxLCBEKTsKKyAgICAgIGlmIChSZXQpIHJldHVybiBSZXQ7CisgICAgfQorICB9CisgIAorICAvLyAoWCA+PiBaKSB8IChZID4+IFopICAtPiAoWHxZKSA+PiBaICBmb3IgYWxsIHNoaWZ0cy4KKyAgaWYgKEJpbmFyeU9wZXJhdG9yICpTSTEgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oT3AxKSkgeworICAgIGlmIChCaW5hcnlPcGVyYXRvciAqU0kwID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMCkpCisgICAgICBpZiAoU0kwLT5pc1NoaWZ0KCkgJiYgU0kwLT5nZXRPcGNvZGUoKSA9PSBTSTEtPmdldE9wY29kZSgpICYmIAorICAgICAgICAgIFNJMC0+Z2V0T3BlcmFuZCgxKSA9PSBTSTEtPmdldE9wZXJhbmQoMSkgJiYKKyAgICAgICAgICAoU0kwLT5oYXNPbmVVc2UoKSB8fCBTSTEtPmhhc09uZVVzZSgpKSkgeworICAgICAgICBWYWx1ZSAqTmV3T3AgPSBCdWlsZGVyLT5DcmVhdGVPcihTSTAtPmdldE9wZXJhbmQoMCksIFNJMS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKFNJMS0+Z2V0T3Bjb2RlKCksIE5ld09wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0kxLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIH0KKyAgfQorCisgIC8vICh+QSB8IH5CKSA9PSAofihBICYgQikpIC0gRGUgTW9yZ2FuJ3MgTGF3CisgIGlmIChWYWx1ZSAqT3AwTm90VmFsID0gZHluX2Nhc3ROb3RWYWwoT3AwKSkKKyAgICBpZiAoVmFsdWUgKk9wMU5vdFZhbCA9IGR5bl9jYXN0Tm90VmFsKE9wMSkpCisgICAgICBpZiAoT3AwLT5oYXNPbmVVc2UoKSAmJiBPcDEtPmhhc09uZVVzZSgpKSB7CisgICAgICAgIFZhbHVlICpBbmQgPSBCdWlsZGVyLT5DcmVhdGVBbmQoT3AwTm90VmFsLCBPcDFOb3RWYWwpOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5vdChBbmQpOworICAgICAgfQorCisgIGlmIChJQ21wSW5zdCAqUkhTID0gZHluX2Nhc3Q8SUNtcEluc3Q+KEkuZ2V0T3BlcmFuZCgxKSkpCisgICAgaWYgKElDbXBJbnN0ICpMSFMgPSBkeW5fY2FzdDxJQ21wSW5zdD4oSS5nZXRPcGVyYW5kKDApKSkKKyAgICAgIGlmIChWYWx1ZSAqUmVzID0gRm9sZE9yT2ZJQ21wcyhMSFMsIFJIUykpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIFJlcyk7CisgICAgCisgIC8vIChmY21wIHVubyB4LCBjKSB8IChmY21wIHVubyB5LCBjKSAgLT4gKGZjbXAgdW5vIHgsIHkpCisgIGlmIChGQ21wSW5zdCAqTEhTID0gZHluX2Nhc3Q8RkNtcEluc3Q+KEkuZ2V0T3BlcmFuZCgwKSkpCisgICAgaWYgKEZDbXBJbnN0ICpSSFMgPSBkeW5fY2FzdDxGQ21wSW5zdD4oSS5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIGlmIChWYWx1ZSAqUmVzID0gRm9sZE9yT2ZGQ21wcyhMSFMsIFJIUykpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIFJlcyk7CisgIAorICAvLyBmb2xkIChvciAoY2FzdCBBKSwgKGNhc3QgQikpIC0+IChjYXN0IChvciBBLCBCKSkKKyAgaWYgKENhc3RJbnN0ICpPcDBDID0gZHluX2Nhc3Q8Q2FzdEluc3Q+KE9wMCkpIHsKKyAgICBpZiAoQ2FzdEluc3QgKk9wMUMgPSBkeW5fY2FzdDxDYXN0SW5zdD4oT3AxKSkKKyAgICAgIGlmIChPcDBDLT5nZXRPcGNvZGUoKSA9PSBPcDFDLT5nZXRPcGNvZGUoKSkgey8vIHNhbWUgY2FzdCBraW5kID8KKyAgICAgICAgY29uc3QgVHlwZSAqU3JjVHkgPSBPcDBDLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgICAgICAgIGlmIChTcmNUeSA9PSBPcDFDLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIFNyY1R5LT5pc0ludE9ySW50VmVjdG9yVHkoKSkgeworICAgICAgICAgIFZhbHVlICpPcDBDT3AgPSBPcDBDLT5nZXRPcGVyYW5kKDApLCAqT3AxQ09wID0gT3AxQy0+Z2V0T3BlcmFuZCgwKTsKKworICAgICAgICAgIGlmICgoIWlzYTxJQ21wSW5zdD4oT3AwQ09wKSB8fCAhaXNhPElDbXBJbnN0PihPcDFDT3ApKSAmJgorICAgICAgICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgdGhlIGNhc3RzIGJvdGggcmVhbGx5IGNhdXNlIGNvZGUgdG8gYmUKKyAgICAgICAgICAgICAgLy8gZ2VuZXJhdGVkLgorICAgICAgICAgICAgICBTaG91bGRPcHRpbWl6ZUNhc3QoT3AwQy0+Z2V0T3Bjb2RlKCksIE9wMENPcCwgSS5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICAgIFNob3VsZE9wdGltaXplQ2FzdChPcDFDLT5nZXRPcGNvZGUoKSwgT3AxQ09wLCBJLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIFZhbHVlICpOZXdPcCA9IEJ1aWxkZXItPkNyZWF0ZU9yKE9wMENPcCwgT3AxQ09wKTsKKyAgICAgICAgICAgIHJldHVybiBDYXN0SW5zdDo6Q3JlYXRlKE9wMEMtPmdldE9wY29kZSgpLCBOZXdPcCwgSS5nZXRUeXBlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvLyBJZiB0aGlzIGlzIG9yKGNhc3QoaWNtcCksIGNhc3QoaWNtcCkpLCB0cnkgdG8gZm9sZCB0aGlzIGV2ZW4gaWYgdGhlCisgICAgICAgICAgLy8gY2FzdCBpcyBvdGhlcndpc2Ugbm90IG9wdGltaXphYmxlLiAgVGhpcyBoYXBwZW5zIGZvciB2ZWN0b3Igc2V4dHMuCisgICAgICAgICAgaWYgKElDbXBJbnN0ICpSSFMgPSBkeW5fY2FzdDxJQ21wSW5zdD4oT3AxQ09wKSkKKyAgICAgICAgICAgIGlmIChJQ21wSW5zdCAqTEhTID0gZHluX2Nhc3Q8SUNtcEluc3Q+KE9wMENPcCkpCisgICAgICAgICAgICAgIGlmIChWYWx1ZSAqUmVzID0gRm9sZE9yT2ZJQ21wcyhMSFMsIFJIUykpCisgICAgICAgICAgICAgICAgcmV0dXJuIENhc3RJbnN0OjpDcmVhdGUoT3AwQy0+Z2V0T3Bjb2RlKCksIFJlcywgSS5nZXRUeXBlKCkpOworICAgICAgICAgIAorICAgICAgICAgIC8vIElmIHRoaXMgaXMgb3IoY2FzdChmY21wKSwgY2FzdChmY21wKSksIHRyeSB0byBmb2xkIHRoaXMgZXZlbiBpZiB0aGUKKyAgICAgICAgICAvLyBjYXN0IGlzIG90aGVyd2lzZSBub3Qgb3B0aW1pemFibGUuICBUaGlzIGhhcHBlbnMgZm9yIHZlY3RvciBzZXh0cy4KKyAgICAgICAgICBpZiAoRkNtcEluc3QgKlJIUyA9IGR5bl9jYXN0PEZDbXBJbnN0PihPcDFDT3ApKQorICAgICAgICAgICAgaWYgKEZDbXBJbnN0ICpMSFMgPSBkeW5fY2FzdDxGQ21wSW5zdD4oT3AwQ09wKSkKKyAgICAgICAgICAgICAgaWYgKFZhbHVlICpSZXMgPSBGb2xkT3JPZkZDbXBzKExIUywgUkhTKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZShPcDBDLT5nZXRPcGNvZGUoKSwgUmVzLCBJLmdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIENoYW5nZWQgPyAmSSA6IDA7Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0WG9yKEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIGJvb2wgQ2hhbmdlZCA9IFNpbXBsaWZ5Q29tbXV0YXRpdmUoSSk7CisgIFZhbHVlICpPcDAgPSBJLmdldE9wZXJhbmQoMCksICpPcDEgPSBJLmdldE9wZXJhbmQoMSk7CisKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihPcDEpKSB7CisgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihPcDApKQorICAgICAgLy8gSGFuZGxlIHVuZGVmIF4gdW5kZWYgLT4gMCBzcGVjaWFsIGNhc2UuIFRoaXMgaXMgYSBjb21tb24KKyAgICAgIC8vIGlkaW9tIChtaXN1c2UpLgorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJLmdldFR5cGUoKSkpOworICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMSk7ICAvLyBYIF4gdW5kZWYgLT4gdW5kZWYKKyAgfQorCisgIC8vIHhvciBYLCBYID0gMAorICBpZiAoT3AwID09IE9wMSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEkuZ2V0VHlwZSgpKSk7CisgIAorICAvLyBTZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IGFueSBpbnN0cnVjdGlvbnMgdXNlZCBieSB0aGUgaW5zdHJ1Y3Rpb24gd2hvc2Ugc29sZSAKKyAgLy8gcHVycG9zZSBpcyB0byBjb21wdXRlIGJpdHMgd2UgZG9uJ3QgY2FyZSBhYm91dC4KKyAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRJbnN0cnVjdGlvbkJpdHMoSSkpCisgICAgcmV0dXJuICZJOworICBpZiAoSS5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSkKKyAgICBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oT3AxKSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMCk7ICAvLyBYIF4gPDAsMD4gLT4gWAorCisgIC8vIElzIHRoaXMgYSB+IG9wZXJhdGlvbj8KKyAgaWYgKFZhbHVlICpOb3RPcCA9IGR5bl9jYXN0Tm90VmFsKCZJKSkgeworICAgIGlmIChCaW5hcnlPcGVyYXRvciAqT3AwSSA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihOb3RPcCkpIHsKKyAgICAgIGlmIChPcDBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kIHx8IAorICAgICAgICAgIE9wMEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpPcikgeworICAgICAgICAvLyB+KH5YICYgWSkgLS0+IChYIHwgflkpIC0gRGUgTW9yZ2FuJ3MgTGF3CisgICAgICAgIC8vIH4oflggfCBZKSA9PT0gKFggJiB+WSkgLSBEZSBNb3JnYW4ncyBMYXcKKyAgICAgICAgaWYgKGR5bl9jYXN0Tm90VmFsKE9wMEktPmdldE9wZXJhbmQoMSkpKQorICAgICAgICAgIE9wMEktPnN3YXBPcGVyYW5kcygpOworICAgICAgICBpZiAoVmFsdWUgKk9wME5vdFZhbCA9IGR5bl9jYXN0Tm90VmFsKE9wMEktPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgICAgVmFsdWUgKk5vdFkgPQorICAgICAgICAgICAgQnVpbGRlci0+Q3JlYXRlTm90KE9wMEktPmdldE9wZXJhbmQoMSkpOworICAgICAgICAgIGlmIChPcDBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kKQorICAgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihPcDBOb3RWYWwsIE5vdFkpOworICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKE9wME5vdFZhbCwgTm90WSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIH4oWCAmIFkpIC0tPiAoflggfCB+WSkgLSBEZSBNb3JnYW4ncyBMYXcKKyAgICAgICAgLy8gfihYIHwgWSkgPT09ICh+WCAmIH5ZKSAtIERlIE1vcmdhbidzIExhdworICAgICAgICBpZiAoaXNGcmVlVG9JbnZlcnQoT3AwSS0+Z2V0T3BlcmFuZCgwKSkgJiYgCisgICAgICAgICAgICBpc0ZyZWVUb0ludmVydChPcDBJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICAgIFZhbHVlICpOb3RYID0KKyAgICAgICAgICAgIEJ1aWxkZXItPkNyZWF0ZU5vdChPcDBJLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgICBWYWx1ZSAqTm90WSA9CisgICAgICAgICAgICBCdWlsZGVyLT5DcmVhdGVOb3QoT3AwSS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAgICAgaWYgKE9wMEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBbmQpCisgICAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKE5vdFgsIE5vdFkpOworICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKE5vdFgsIE5vdFkpOworICAgICAgICB9CisKKyAgICAgIH0gZWxzZSBpZiAoT3AwSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFTaHIpIHsKKyAgICAgICAgLy8gfih+WCA+PnMgWSkgLS0+IChYID4+cyBZKQorICAgICAgICBpZiAoVmFsdWUgKk9wME5vdFZhbCA9IGR5bl9jYXN0Tm90VmFsKE9wMEktPmdldE9wZXJhbmQoMCkpKQorICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQVNocihPcDBOb3RWYWwsIE9wMEktPmdldE9wZXJhbmQoMSkpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgCisgIGlmIChDb25zdGFudEludCAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wMSkpIHsKKyAgICBpZiAoUkhTLT5pc09uZSgpICYmIE9wMC0+aGFzT25lVXNlKCkpCisgICAgICAvLyB4b3IgKGNtcCBBLCBCKSwgdHJ1ZSA9IG5vdCAoY21wIEEsIEIpID0gIWNtcCBBLCBCCisgICAgICBpZiAoQ21wSW5zdCAqQ0kgPSBkeW5fY2FzdDxDbXBJbnN0PihPcDApKQorICAgICAgICByZXR1cm4gQ21wSW5zdDo6Q3JlYXRlKENJLT5nZXRPcGNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSS0+Z2V0SW52ZXJzZVByZWRpY2F0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJLT5nZXRPcGVyYW5kKDApLCBDSS0+Z2V0T3BlcmFuZCgxKSk7CisKKyAgICAvLyBmb2xkICh4b3IoemV4dChjbXApKSwgMSkgYW5kICh4b3Ioc2V4dChjbXApKSwgLTEpIHRvIGV4dCghY21wKS4KKyAgICBpZiAoQ2FzdEluc3QgKk9wMEMgPSBkeW5fY2FzdDxDYXN0SW5zdD4oT3AwKSkgeworICAgICAgaWYgKENtcEluc3QgKkNJID0gZHluX2Nhc3Q8Q21wSW5zdD4oT3AwQy0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgaWYgKENJLT5oYXNPbmVVc2UoKSAmJiBPcDBDLT5oYXNPbmVVc2UoKSkgeworICAgICAgICAgIEluc3RydWN0aW9uOjpDYXN0T3BzIE9wY29kZSA9IE9wMEMtPmdldE9wY29kZSgpOworICAgICAgICAgIGlmICgoT3Bjb2RlID09IEluc3RydWN0aW9uOjpaRXh0IHx8IE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6U0V4dCkgJiYKKyAgICAgICAgICAgICAgKFJIUyA9PSBDb25zdGFudEV4cHI6OmdldENhc3QoT3Bjb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0VHJ1ZShJLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wMEMtPmdldERlc3RUeSgpKSkpIHsKKyAgICAgICAgICAgIENJLT5zZXRQcmVkaWNhdGUoQ0ktPmdldEludmVyc2VQcmVkaWNhdGUoKSk7CisgICAgICAgICAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZShPcGNvZGUsIENJLCBPcDBDLT5nZXRUeXBlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChCaW5hcnlPcGVyYXRvciAqT3AwSSA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihPcDApKSB7CisgICAgICAvLyB+KGMtWCkgPT0gWC1jLTEgPT0gWCsoLWMtMSkKKyAgICAgIGlmIChPcDBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U3ViICYmIFJIUy0+aXNBbGxPbmVzVmFsdWUoKSkKKyAgICAgICAgaWYgKENvbnN0YW50ICpPcDBJMEMgPSBkeW5fY2FzdDxDb25zdGFudD4oT3AwSS0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgICBDb25zdGFudCAqTmVnT3AwSTBDID0gQ29uc3RhbnRFeHByOjpnZXROZWcoT3AwSTBDKTsKKyAgICAgICAgICBDb25zdGFudCAqQ29uc3RhbnRSSFMgPSBDb25zdGFudEV4cHI6OmdldFN1YihOZWdPcDBJMEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSS5nZXRUeXBlKCksIDEpKTsKKyAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChPcDBJLT5nZXRPcGVyYW5kKDEpLCBDb25zdGFudFJIUyk7CisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgIGlmIChDb25zdGFudEludCAqT3AwQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AwSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgaWYgKE9wMEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQpIHsKKyAgICAgICAgICAvLyB+KFgtYykgLS0+ICgtYy0xKS1YCisgICAgICAgICAgaWYgKFJIUy0+aXNBbGxPbmVzVmFsdWUoKSkgeworICAgICAgICAgICAgQ29uc3RhbnQgKk5lZ09wMENJID0gQ29uc3RhbnRFeHByOjpnZXROZWcoT3AwQ0kpOworICAgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldFN1YihOZWdPcDBDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJLmdldFR5cGUoKSwgMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDBJLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKFJIUy0+Z2V0VmFsdWUoKS5pc1NpZ25CaXQoKSkgeworICAgICAgICAgICAgLy8gKFggKyBDKSBeIHNpZ25iaXQgLT4gKFggKyBDICsgc2lnbmJpdCkKKyAgICAgICAgICAgIENvbnN0YW50ICpDID0gQ29uc3RhbnRJbnQ6OmdldChJLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMtPmdldFZhbHVlKCkgKyBPcDBDSS0+Z2V0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChPcDBJLT5nZXRPcGVyYW5kKDApLCBDKTsKKworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChPcDBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6T3IpIHsKKyAgICAgICAgICAvLyAoWHxDMSleQzIgLT4gWF4oQzF8QzIpIGlmZiBYJn5DMSA9PSAwCisgICAgICAgICAgaWYgKE1hc2tlZFZhbHVlSXNaZXJvKE9wMEktPmdldE9wZXJhbmQoMCksIE9wMENJLT5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgQ29uc3RhbnQgKk5ld1JIUyA9IENvbnN0YW50RXhwcjo6Z2V0T3IoT3AwQ0ksIFJIUyk7CisgICAgICAgICAgICAvLyBBbnl0aGluZyBpbiBib3RoIEMxIGFuZCBDMiBpcyBrbm93biB0byBiZSB6ZXJvLCByZW1vdmUgaXQgZnJvbQorICAgICAgICAgICAgLy8gTmV3UkhTLgorICAgICAgICAgICAgQ29uc3RhbnQgKkNvbW1vbkJpdHMgPSBDb25zdGFudEV4cHI6OmdldEFuZChPcDBDSSwgUkhTKTsKKyAgICAgICAgICAgIE5ld1JIUyA9IENvbnN0YW50RXhwcjo6Z2V0QW5kKE5ld1JIUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldE5vdChDb21tb25CaXRzKSk7CisgICAgICAgICAgICBXb3JrbGlzdC5BZGQoT3AwSSk7CisgICAgICAgICAgICBJLnNldE9wZXJhbmQoMCwgT3AwSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICAgICAgICBJLnNldE9wZXJhbmQoMSwgTmV3UkhTKTsKKyAgICAgICAgICAgIHJldHVybiAmSTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUcnkgdG8gZm9sZCBjb25zdGFudCBhbmQgaW50byBzZWxlY3QgYXJndW1lbnRzLgorICAgIGlmIChTZWxlY3RJbnN0ICpTSSA9IGR5bl9jYXN0PFNlbGVjdEluc3Q+KE9wMCkpCisgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKlIgPSBGb2xkT3BJbnRvU2VsZWN0KEksIFNJKSkKKyAgICAgICAgcmV0dXJuIFI7CisgICAgaWYgKGlzYTxQSElOb2RlPihPcDApKQorICAgICAgaWYgKEluc3RydWN0aW9uICpOViA9IEZvbGRPcEludG9QaGkoSSkpCisgICAgICAgIHJldHVybiBOVjsKKyAgfQorCisgIGlmIChWYWx1ZSAqWCA9IGR5bl9jYXN0Tm90VmFsKE9wMCkpICAgLy8gfkEgXiBBID09IC0xCisgICAgaWYgKFggPT0gT3AxKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnQ6OmdldEFsbE9uZXNWYWx1ZShJLmdldFR5cGUoKSkpOworCisgIGlmIChWYWx1ZSAqWCA9IGR5bl9jYXN0Tm90VmFsKE9wMSkpICAgLy8gQSBeIH5BID09IC0xCisgICAgaWYgKFggPT0gT3AwKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnQ6OmdldEFsbE9uZXNWYWx1ZShJLmdldFR5cGUoKSkpOworCisgIAorICBCaW5hcnlPcGVyYXRvciAqT3AxSSA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihPcDEpOworICBpZiAoT3AxSSkgeworICAgIFZhbHVlICpBLCAqQjsKKyAgICBpZiAobWF0Y2goT3AxSSwgbV9PcihtX1ZhbHVlKEEpLCBtX1ZhbHVlKEIpKSkpIHsKKyAgICAgIGlmIChBID09IE9wMCkgeyAgICAgICAgICAgICAgLy8gQl4oQnxBKSA9PSAoQXxCKV5CCisgICAgICAgIE9wMUktPnN3YXBPcGVyYW5kcygpOworICAgICAgICBJLnN3YXBPcGVyYW5kcygpOworICAgICAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOworICAgICAgfSBlbHNlIGlmIChCID09IE9wMCkgeyAgICAgICAvLyBCXihBfEIpID09IChBfEIpXkIKKyAgICAgICAgSS5zd2FwT3BlcmFuZHMoKTsgICAgIC8vIFNpbXBsaWZpZWQgYmVsb3cuCisgICAgICAgIHN0ZDo6c3dhcChPcDAsIE9wMSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChtYXRjaChPcDFJLCBtX1hvcihtX1NwZWNpZmljKE9wMCksIG1fVmFsdWUoQikpKSkgeworICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQik7ICAgICAgICAgICAgICAgICAgICAgIC8vIEFeKEFeQikgPT0gQgorICAgIH0gZWxzZSBpZiAobWF0Y2goT3AxSSwgbV9Yb3IobV9WYWx1ZShBKSwgbV9TcGVjaWZpYyhPcDApKSkpIHsKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIEEpOyAgICAgICAgICAgICAgICAgICAgICAvLyBBXihCXkEpID09IEIKKyAgICB9IGVsc2UgaWYgKG1hdGNoKE9wMUksIG1fQW5kKG1fVmFsdWUoQSksIG1fVmFsdWUoQikpKSAmJiAKKyAgICAgICAgICAgICAgIE9wMUktPmhhc09uZVVzZSgpKXsKKyAgICAgIGlmIChBID09IE9wMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQV4oQSZCKSAtPiBBXihCJkEpCisgICAgICAgIE9wMUktPnN3YXBPcGVyYW5kcygpOworICAgICAgICBzdGQ6OnN3YXAoQSwgQik7CisgICAgICB9CisgICAgICBpZiAoQiA9PSBPcDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFeKEImQSkgLT4gKEImQSleQQorICAgICAgICBJLnN3YXBPcGVyYW5kcygpOyAgICAgLy8gU2ltcGxpZmllZCBiZWxvdy4KKyAgICAgICAgc3RkOjpzd2FwKE9wMCwgT3AxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIEJpbmFyeU9wZXJhdG9yICpPcDBJID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMCk7CisgIGlmIChPcDBJKSB7CisgICAgVmFsdWUgKkEsICpCOworICAgIGlmIChtYXRjaChPcDBJLCBtX09yKG1fVmFsdWUoQSksIG1fVmFsdWUoQikpKSAmJgorICAgICAgICBPcDBJLT5oYXNPbmVVc2UoKSkgeworICAgICAgaWYgKEEgPT0gT3AxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoQnxBKV5CID09IChBfEIpXkIKKyAgICAgICAgc3RkOjpzd2FwKEEsIEIpOworICAgICAgaWYgKEIgPT0gT3AxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoQXxCKV5CID09IEEgJiB+QgorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChBLCBCdWlsZGVyLT5DcmVhdGVOb3QoT3AxKSk7CisgICAgfSBlbHNlIGlmIChtYXRjaChPcDBJLCBtX1hvcihtX1NwZWNpZmljKE9wMSksIG1fVmFsdWUoQikpKSkgeworICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQik7ICAgICAgICAgICAgICAgICAgICAgIC8vIChBXkIpXkEgPT0gQgorICAgIH0gZWxzZSBpZiAobWF0Y2goT3AwSSwgbV9Yb3IobV9WYWx1ZShBKSwgbV9TcGVjaWZpYyhPcDEpKSkpIHsKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIEEpOyAgICAgICAgICAgICAgICAgICAgICAvLyAoQl5BKV5BID09IEIKKyAgICB9IGVsc2UgaWYgKG1hdGNoKE9wMEksIG1fQW5kKG1fVmFsdWUoQSksIG1fVmFsdWUoQikpKSAmJiAKKyAgICAgICAgICAgICAgIE9wMEktPmhhc09uZVVzZSgpKXsKKyAgICAgIGlmIChBID09IE9wMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKEEmQileQSAtPiAoQiZBKV5BCisgICAgICAgIHN0ZDo6c3dhcChBLCBCKTsKKyAgICAgIGlmIChCID09IE9wMSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKEImQSleQSA9PSB+QiAmIEEKKyAgICAgICAgICAhaXNhPENvbnN0YW50SW50PihPcDEpKSB7ICAvLyBDYW5vbmljYWwgZm9ybSBpcyAoQiZDKV5DCisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKEJ1aWxkZXItPkNyZWF0ZU5vdChBKSwgT3AxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIChYID4+IFopIF4gKFkgPj4gWikgIC0+IChYXlkpID4+IFogIGZvciBhbGwgc2hpZnRzLgorICBpZiAoT3AwSSAmJiBPcDFJICYmIE9wMEktPmlzU2hpZnQoKSAmJiAKKyAgICAgIE9wMEktPmdldE9wY29kZSgpID09IE9wMUktPmdldE9wY29kZSgpICYmIAorICAgICAgT3AwSS0+Z2V0T3BlcmFuZCgxKSA9PSBPcDFJLT5nZXRPcGVyYW5kKDEpICYmCisgICAgICAoT3AxSS0+aGFzT25lVXNlKCkgfHwgT3AxSS0+aGFzT25lVXNlKCkpKSB7CisgICAgVmFsdWUgKk5ld09wID0KKyAgICAgIEJ1aWxkZXItPkNyZWF0ZVhvcihPcDBJLT5nZXRPcGVyYW5kKDApLCBPcDFJLT5nZXRPcGVyYW5kKDApKTsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShPcDFJLT5nZXRPcGNvZGUoKSwgTmV3T3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wMUktPmdldE9wZXJhbmQoMSkpOworICB9CisgICAgCisgIGlmIChPcDBJICYmIE9wMUkpIHsKKyAgICBWYWx1ZSAqQSwgKkIsICpDLCAqRDsKKyAgICAvLyAoQSAmIEIpXihBIHwgQikgLT4gQSBeIEIKKyAgICBpZiAobWF0Y2goT3AwSSwgbV9BbmQobV9WYWx1ZShBKSwgbV9WYWx1ZShCKSkpICYmCisgICAgICAgIG1hdGNoKE9wMUksIG1fT3IobV9WYWx1ZShDKSwgbV9WYWx1ZShEKSkpKSB7CisgICAgICBpZiAoKEEgPT0gQyAmJiBCID09IEQpIHx8IChBID09IEQgJiYgQiA9PSBDKSkgCisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKEEsIEIpOworICAgIH0KKyAgICAvLyAoQSB8IEIpXihBICYgQikgLT4gQSBeIEIKKyAgICBpZiAobWF0Y2goT3AwSSwgbV9PcihtX1ZhbHVlKEEpLCBtX1ZhbHVlKEIpKSkgJiYKKyAgICAgICAgbWF0Y2goT3AxSSwgbV9BbmQobV9WYWx1ZShDKSwgbV9WYWx1ZShEKSkpKSB7CisgICAgICBpZiAoKEEgPT0gQyAmJiBCID09IEQpIHx8IChBID09IEQgJiYgQiA9PSBDKSkgCisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKEEsIEIpOworICAgIH0KKyAgICAKKyAgICAvLyAoQSAmIEIpXihDICYgRCkKKyAgICBpZiAoKE9wMEktPmhhc09uZVVzZSgpIHx8IE9wMUktPmhhc09uZVVzZSgpKSAmJgorICAgICAgICBtYXRjaChPcDBJLCBtX0FuZChtX1ZhbHVlKEEpLCBtX1ZhbHVlKEIpKSkgJiYKKyAgICAgICAgbWF0Y2goT3AxSSwgbV9BbmQobV9WYWx1ZShDKSwgbV9WYWx1ZShEKSkpKSB7CisgICAgICAvLyAoWCAmIFkpXihYICYgWSkgLT4gKFleWikgJiBYCisgICAgICBWYWx1ZSAqWCA9IDAsICpZID0gMCwgKlogPSAwOworICAgICAgaWYgKEEgPT0gQykKKyAgICAgICAgWCA9IEEsIFkgPSBCLCBaID0gRDsKKyAgICAgIGVsc2UgaWYgKEEgPT0gRCkKKyAgICAgICAgWCA9IEEsIFkgPSBCLCBaID0gQzsKKyAgICAgIGVsc2UgaWYgKEIgPT0gQykKKyAgICAgICAgWCA9IEIsIFkgPSBBLCBaID0gRDsKKyAgICAgIGVsc2UgaWYgKEIgPT0gRCkKKyAgICAgICAgWCA9IEIsIFkgPSBBLCBaID0gQzsKKyAgICAgIAorICAgICAgaWYgKFgpIHsKKyAgICAgICAgVmFsdWUgKk5ld09wID0gQnVpbGRlci0+Q3JlYXRlWG9yKFksIFopOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChOZXdPcCwgWCk7CisgICAgICB9CisgICAgfQorICB9CisgICAgCisgIC8vIChpY21wMSBBLCBCKSBeIChpY21wMiBBLCBCKSAtLT4gKGljbXAzIEEsIEIpCisgIGlmIChJQ21wSW5zdCAqUkhTID0gZHluX2Nhc3Q8SUNtcEluc3Q+KEkuZ2V0T3BlcmFuZCgxKSkpCisgICAgaWYgKElDbXBJbnN0ICpMSFMgPSBkeW5fY2FzdDxJQ21wSW5zdD4oSS5nZXRPcGVyYW5kKDApKSkKKyAgICAgIGlmIChQcmVkaWNhdGVzRm9sZGFibGUoTEhTLT5nZXRQcmVkaWNhdGUoKSwgUkhTLT5nZXRQcmVkaWNhdGUoKSkpIHsKKyAgICAgICAgaWYgKExIUy0+Z2V0T3BlcmFuZCgwKSA9PSBSSFMtPmdldE9wZXJhbmQoMSkgJiYKKyAgICAgICAgICAgIExIUy0+Z2V0T3BlcmFuZCgxKSA9PSBSSFMtPmdldE9wZXJhbmQoMCkpCisgICAgICAgICAgTEhTLT5zd2FwT3BlcmFuZHMoKTsKKyAgICAgICAgaWYgKExIUy0+Z2V0T3BlcmFuZCgwKSA9PSBSSFMtPmdldE9wZXJhbmQoMCkgJiYKKyAgICAgICAgICAgIExIUy0+Z2V0T3BlcmFuZCgxKSA9PSBSSFMtPmdldE9wZXJhbmQoMSkpIHsKKyAgICAgICAgICBWYWx1ZSAqT3AwID0gTEhTLT5nZXRPcGVyYW5kKDApLCAqT3AxID0gTEhTLT5nZXRPcGVyYW5kKDEpOworICAgICAgICAgIHVuc2lnbmVkIENvZGUgPSBnZXRJQ21wQ29kZShMSFMpIF4gZ2V0SUNtcENvZGUoUkhTKTsKKyAgICAgICAgICBib29sIGlzU2lnbmVkID0gTEhTLT5pc1NpZ25lZCgpIHx8IFJIUy0+aXNTaWduZWQoKTsKKyAgICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJQ21wVmFsdWUoaXNTaWduZWQsIENvZGUsIE9wMCwgT3AxLCBCdWlsZGVyKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAvLyBmb2xkICh4b3IgKGNhc3QgQSksIChjYXN0IEIpKSAtPiAoY2FzdCAoeG9yIEEsIEIpKQorICBpZiAoQ2FzdEluc3QgKk9wMEMgPSBkeW5fY2FzdDxDYXN0SW5zdD4oT3AwKSkgeworICAgIGlmIChDYXN0SW5zdCAqT3AxQyA9IGR5bl9jYXN0PENhc3RJbnN0PihPcDEpKQorICAgICAgaWYgKE9wMEMtPmdldE9wY29kZSgpID09IE9wMUMtPmdldE9wY29kZSgpKSB7IC8vIHNhbWUgY2FzdCBraW5kPworICAgICAgICBjb25zdCBUeXBlICpTcmNUeSA9IE9wMEMtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsKKyAgICAgICAgaWYgKFNyY1R5ID09IE9wMUMtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSAmJiBTcmNUeS0+aXNJbnRlZ2VyVHkoKSAmJgorICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHRoZSBjYXN0cyBib3RoIHJlYWxseSBjYXVzZSBjb2RlIHRvIGJlIGdlbmVyYXRlZC4KKyAgICAgICAgICAgIFNob3VsZE9wdGltaXplQ2FzdChPcDBDLT5nZXRPcGNvZGUoKSwgT3AwQy0+Z2V0T3BlcmFuZCgwKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICBTaG91bGRPcHRpbWl6ZUNhc3QoT3AxQy0+Z2V0T3Bjb2RlKCksIE9wMUMtPmdldE9wZXJhbmQoMCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkuZ2V0VHlwZSgpKSkgeworICAgICAgICAgIFZhbHVlICpOZXdPcCA9IEJ1aWxkZXItPkNyZWF0ZVhvcihPcDBDLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDFDLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZShPcDBDLT5nZXRPcGNvZGUoKSwgTmV3T3AsIEkuZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICB9CisKKyAgcmV0dXJuIENoYW5nZWQgPyAmSSA6IDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZUNhbGxzLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lQ2FsbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Mjg0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZUNhbGxzLmNwcApAQCAtMCwwICsxLDExNjIgQEAKKy8vPT09LSBJbnN0Q29tYmluZUNhbGxzLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHZpc2l0Q2FsbCBhbmQgdmlzaXRJbnZva2UgZnVuY3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJJbnN0Q29tYmluZS5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvQnVpbGRMaWJDYWxscy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vLyBnZXRQcm9tb3RlZFR5cGUgLSBSZXR1cm4gdGhlIHNwZWNpZmllZCB0eXBlIHByb21vdGVkIGFzIGl0IHdvdWxkIGJlIHRvIHBhc3MKKy8vLyB0aG91Z2ggYSB2YV9hcmcgYXJlYS4KK3N0YXRpYyBjb25zdCBUeXBlICpnZXRQcm9tb3RlZFR5cGUoY29uc3QgVHlwZSAqVHkpIHsKKyAgaWYgKGNvbnN0IEludGVnZXJUeXBlKiBJVHkgPSBkeW5fY2FzdDxJbnRlZ2VyVHlwZT4oVHkpKSB7CisgICAgaWYgKElUeS0+Z2V0Qml0V2lkdGgoKSA8IDMyKQorICAgICAgcmV0dXJuIFR5cGU6OmdldEludDMyVHkoVHktPmdldENvbnRleHQoKSk7CisgIH0KKyAgcmV0dXJuIFR5OworfQorCisvLy8gRW5mb3JjZUtub3duQWxpZ25tZW50IC0gSWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIHBvaW50cyB0byBhbiBvYmplY3QgdGhhdAorLy8vIHdlIGNvbnRyb2wsIG1vZGlmeSB0aGUgb2JqZWN0J3MgYWxpZ25tZW50IHRvIFByZWZBbGlnbi4gVGhpcyBpc24ndAorLy8vIG9mdGVuIHBvc3NpYmxlIHRob3VnaC4gSWYgYWxpZ25tZW50IGlzIGltcG9ydGFudCwgYSBtb3JlIHJlbGlhYmxlIGFwcHJvYWNoCisvLy8gaXMgdG8gc2ltcGx5IGFsaWduIGFsbCBnbG9iYWwgdmFyaWFibGVzIGFuZCBhbGxvY2F0aW9uIGluc3RydWN0aW9ucyB0bworLy8vIHRoZWlyIHByZWZlcnJlZCBhbGlnbm1lbnQgZnJvbSB0aGUgYmVnaW5uaW5nLgorLy8vCitzdGF0aWMgdW5zaWduZWQgRW5mb3JjZUtub3duQWxpZ25tZW50KFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgdW5zaWduZWQgUHJlZkFsaWduKSB7CisKKyAgVXNlciAqVSA9IGR5bl9jYXN0PFVzZXI+KFYpOworICBpZiAoIVUpIHJldHVybiBBbGlnbjsKKworICBzd2l0Y2ggKE9wZXJhdG9yOjpnZXRPcGNvZGUoVSkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6CisgICAgcmV0dXJuIEVuZm9yY2VLbm93bkFsaWdubWVudChVLT5nZXRPcGVyYW5kKDApLCBBbGlnbiwgUHJlZkFsaWduKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cjogeworICAgIC8vIElmIGFsbCBpbmRleGVzIGFyZSB6ZXJvLCBpdCBpcyBqdXN0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGJhc2UgcG9pbnRlci4KKyAgICBib29sIEFsbFplcm9PcGVyYW5kcyA9IHRydWU7CisgICAgZm9yIChVc2VyOjpvcF9pdGVyYXRvciBpID0gVS0+b3BfYmVnaW4oKSArIDEsIGUgPSBVLT5vcF9lbmQoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoIWlzYTxDb25zdGFudD4oKmkpIHx8CisgICAgICAgICAgIWNhc3Q8Q29uc3RhbnQ+KCppKS0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICBBbGxaZXJvT3BlcmFuZHMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICBpZiAoQWxsWmVyb09wZXJhbmRzKSB7CisgICAgICAvLyBUcmVhdCB0aGlzIGxpa2UgYSBiaXRjYXN0LgorICAgICAgcmV0dXJuIEVuZm9yY2VLbm93bkFsaWdubWVudChVLT5nZXRPcGVyYW5kKDApLCBBbGlnbiwgUHJlZkFsaWduKTsKKyAgICB9CisgICAgcmV0dXJuIEFsaWduOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFsbG9jYTogeworICAgIEFsbG9jYUluc3QgKkFJID0gY2FzdDxBbGxvY2FJbnN0PihWKTsKKyAgICAvLyBJZiB0aGVyZSBpcyBhIHJlcXVlc3RlZCBhbGlnbm1lbnQgYW5kIGlmIHRoaXMgaXMgYW4gYWxsb2NhLCByb3VuZCB1cC4KKyAgICBpZiAoQUktPmdldEFsaWdubWVudCgpID49IFByZWZBbGlnbikKKyAgICAgIHJldHVybiBBSS0+Z2V0QWxpZ25tZW50KCk7CisgICAgQUktPnNldEFsaWdubWVudChQcmVmQWxpZ24pOworICAgIHJldHVybiBQcmVmQWxpZ247CisgIH0KKyAgfQorCisgIGlmIChHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oVikpIHsKKyAgICAvLyBJZiB0aGVyZSBpcyBhIGxhcmdlIHJlcXVlc3RlZCBhbGlnbm1lbnQgYW5kIHdlIGNhbiwgYnVtcCB1cCB0aGUgYWxpZ25tZW50CisgICAgLy8gb2YgdGhlIGdsb2JhbC4KKyAgICBpZiAoR1YtPmlzRGVjbGFyYXRpb24oKSkgcmV0dXJuIEFsaWduOworICAgIAorICAgIGlmIChHVi0+Z2V0QWxpZ25tZW50KCkgPj0gUHJlZkFsaWduKQorICAgICAgcmV0dXJuIEdWLT5nZXRBbGlnbm1lbnQoKTsKKyAgICAvLyBXZSBjYW4gb25seSBpbmNyZWFzZSB0aGUgYWxpZ25tZW50IG9mIHRoZSBnbG9iYWwgaWYgaXQgaGFzIG5vIGFsaWdubWVudAorICAgIC8vIHNwZWNpZmllZCBvciBpZiBpdCBpcyBub3QgYXNzaWduZWQgYSBzZWN0aW9uLiAgSWYgaXQgaXMgYXNzaWduZWQgYQorICAgIC8vIHNlY3Rpb24sIHRoZSBnbG9iYWwgY291bGQgYmUgZGVuc2VseSBwYWNrZWQgd2l0aCBvdGhlciBvYmplY3RzIGluIHRoZQorICAgIC8vIHNlY3Rpb24sIGluY3JlYXNpbmcgdGhlIGFsaWdubWVudCBjb3VsZCBjYXVzZSBwYWRkaW5nIGlzc3Vlcy4KKyAgICBpZiAoIUdWLT5oYXNTZWN0aW9uKCkgfHwgR1YtPmdldEFsaWdubWVudCgpID09IDApCisgICAgICBHVi0+c2V0QWxpZ25tZW50KFByZWZBbGlnbik7CisgICAgcmV0dXJuIEdWLT5nZXRBbGlnbm1lbnQoKTsKKyAgfQorCisgIHJldHVybiBBbGlnbjsKK30KKworLy8vIEdldE9yRW5mb3JjZUtub3duQWxpZ25tZW50IC0gSWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIGhhcyBhbiBhbGlnbm1lbnQgdGhhdAorLy8vIHdlIGNhbiBkZXRlcm1pbmUsIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVybiAwLiAgSWYgUHJlZkFsaWduIGlzIHNwZWNpZmllZCwKKy8vLyBhbmQgaXQgaXMgbW9yZSB0aGFuIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHVsdGltYXRlIG9iamVjdCwgc2VlIGlmIHdlIGNhbgorLy8vIGluY3JlYXNlIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHVsdGltYXRlIG9iamVjdCwgbWFraW5nIHRoaXMgY2hlY2sgc3VjY2VlZC4KK3Vuc2lnbmVkIEluc3RDb21iaW5lcjo6R2V0T3JFbmZvcmNlS25vd25BbGlnbm1lbnQoVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByZWZBbGlnbikgeworICBhc3NlcnQoVi0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICYmCisgICAgICAgICAiR2V0T3JFbmZvcmNlS25vd25BbGlnbm1lbnQgZXhwZWN0cyBhIHBvaW50ZXIhIik7CisgIHVuc2lnbmVkIEJpdFdpZHRoID0gVEQgPyBURC0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKSA6IDY0OworICBBUEludCBNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShCaXRXaWR0aCk7CisgIEFQSW50IEtub3duWmVybyhCaXRXaWR0aCwgMCksIEtub3duT25lKEJpdFdpZHRoLCAwKTsKKyAgQ29tcHV0ZU1hc2tlZEJpdHMoViwgTWFzaywgS25vd25aZXJvLCBLbm93bk9uZSk7CisgIHVuc2lnbmVkIFRyYWlsWiA9IEtub3duWmVyby5jb3VudFRyYWlsaW5nT25lcygpOworCisgIC8vIEF2b2lkIHRyb3VibGUgd2l0aCByZWRpY3Vsb3VzbHkgbGFyZ2UgVHJhaWxaIHZhbHVlcywgc3VjaCBhcworICAvLyB0aG9zZSBjb21wdXRlZCBmcm9tIGEgbnVsbCBwb2ludGVyLgorICBUcmFpbFogPSBzdGQ6Om1pbihUcmFpbFosIHVuc2lnbmVkKHNpemVvZih1bnNpZ25lZCkgKiBDSEFSX0JJVCAtIDEpKTsKKworICB1bnNpZ25lZCBBbGlnbiA9IDF1IDw8IHN0ZDo6bWluKEJpdFdpZHRoIC0gMSwgVHJhaWxaKTsKKworICAvLyBMTFZNIGRvZXNuJ3Qgc3VwcG9ydCBhbGlnbm1lbnRzIGxhcmdlciB0aGFuIHRoaXMgY3VycmVudGx5LgorICBBbGlnbiA9IHN0ZDo6bWluKEFsaWduLCArVmFsdWU6Ok1heGltdW1BbGlnbm1lbnQpOworCisgIGlmIChQcmVmQWxpZ24gPiBBbGlnbikKKyAgICBBbGlnbiA9IEVuZm9yY2VLbm93bkFsaWdubWVudChWLCBBbGlnbiwgUHJlZkFsaWduKTsKKyAgCisgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBtYWtlIGFueSBhZGp1c3RtZW50LgorICByZXR1cm4gQWxpZ247Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OlNpbXBsaWZ5TWVtVHJhbnNmZXIoTWVtSW50cmluc2ljICpNSSkgeworICB1bnNpZ25lZCBEc3RBbGlnbiA9IEdldE9yRW5mb3JjZUtub3duQWxpZ25tZW50KE1JLT5nZXRBcmdPcGVyYW5kKDApKTsKKyAgdW5zaWduZWQgU3JjQWxpZ24gPSBHZXRPckVuZm9yY2VLbm93bkFsaWdubWVudChNSS0+Z2V0QXJnT3BlcmFuZCgxKSk7CisgIHVuc2lnbmVkIE1pbkFsaWduID0gc3RkOjptaW4oRHN0QWxpZ24sIFNyY0FsaWduKTsKKyAgdW5zaWduZWQgQ29weUFsaWduID0gTUktPmdldEFsaWdubWVudCgpOworCisgIGlmIChDb3B5QWxpZ24gPCBNaW5BbGlnbikgeworICAgIE1JLT5zZXRBbGlnbm1lbnQoQ29uc3RhbnRJbnQ6OmdldChNSS0+Z2V0QWxpZ25tZW50VHlwZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbkFsaWduLCBmYWxzZSkpOworICAgIHJldHVybiBNSTsKKyAgfQorICAKKyAgLy8gSWYgTWVtQ3B5SW5zdCBsZW5ndGggaXMgMS8yLzQvOCBieXRlcyB0aGVuIHJlcGxhY2UgbWVtY3B5IHdpdGgKKyAgLy8gbG9hZC9zdG9yZS4KKyAgQ29uc3RhbnRJbnQgKk1lbU9wTGVuZ3RoID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE1JLT5nZXRBcmdPcGVyYW5kKDIpKTsKKyAgaWYgKE1lbU9wTGVuZ3RoID09IDApIHJldHVybiAwOworICAKKyAgLy8gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVyIHR5cGVzIGFyZSBhbHdheXMgImk4KiIgZm9yIGludHJpbnNpYy4gIFNlZQorICAvLyBpZiB0aGUgc2l6ZSBpcyBzb21ldGhpbmcgd2UgY2FuIGhhbmRsZSB3aXRoIGEgc2luZ2xlIHByaW1pdGl2ZSBsb2FkL3N0b3JlLgorICAvLyBBIHNpbmdsZSBsb2FkK3N0b3JlIGNvcnJlY3RseSBoYW5kbGVzIG92ZXJsYXBwaW5nIG1lbW9yeSBpbiB0aGUgbWVtbW92ZQorICAvLyBjYXNlLgorICB1bnNpZ25lZCBTaXplID0gTWVtT3BMZW5ndGgtPmdldFpFeHRWYWx1ZSgpOworICBpZiAoU2l6ZSA9PSAwKSByZXR1cm4gTUk7ICAvLyBEZWxldGUgdGhpcyBtZW0gdHJhbnNmZXIuCisgIAorICBpZiAoU2l6ZSA+IDggfHwgKFNpemUmKFNpemUtMSkpKQorICAgIHJldHVybiAwOyAgLy8gSWYgbm90IDEvMi80LzggYnl0ZXMsIGV4aXQuCisgIAorICAvLyBVc2UgYW4gaW50ZWdlciBsb2FkK3N0b3JlIHVubGVzcyB3ZSBjYW4gZmluZCBzb21ldGhpbmcgYmV0dGVyLgorICB1bnNpZ25lZCBTcmNBZGRyU3AgPQorICAgIGNhc3Q8UG9pbnRlclR5cGU+KE1JLT5nZXRBcmdPcGVyYW5kKDEpLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgdW5zaWduZWQgRHN0QWRkclNwID0KKyAgICBjYXN0PFBvaW50ZXJUeXBlPihNSS0+Z2V0QXJnT3BlcmFuZCgwKS0+Z2V0VHlwZSgpKS0+Z2V0QWRkcmVzc1NwYWNlKCk7CisKKyAgY29uc3QgSW50ZWdlclR5cGUqIEludFR5cGUgPSBJbnRlZ2VyVHlwZTo6Z2V0KE1JLT5nZXRDb250ZXh0KCksIFNpemU8PDMpOworICBUeXBlICpOZXdTcmNQdHJUeSA9IFBvaW50ZXJUeXBlOjpnZXQoSW50VHlwZSwgU3JjQWRkclNwKTsKKyAgVHlwZSAqTmV3RHN0UHRyVHkgPSBQb2ludGVyVHlwZTo6Z2V0KEludFR5cGUsIERzdEFkZHJTcCk7CisgIAorICAvLyBNZW1jcHkgZm9yY2VzIHRoZSB1c2Ugb2YgaTgqIGZvciB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbi4gIFRoYXQgbWVhbnMKKyAgLy8gdGhhdCBpZiB5b3UncmUgdXNpbmcgbWVtY3B5IHRvIG1vdmUgb25lIGRvdWJsZSBhcm91bmQsIHlvdSdsbCBnZXQgYSBjYXN0CisgIC8vIGZyb20gZG91YmxlKiB0byBpOCouICBXZSdkIG11Y2ggcmF0aGVyIHVzZSBhIGRvdWJsZSBsb2FkK3N0b3JlIHJhdGhlciB0aGFuCisgIC8vIGFuIGk2NCBsb2FkK3N0b3JlLCBoZXJlIGJlY2F1c2UgdGhpcyBpbXByb3ZlcyB0aGUgb2RkcyB0aGF0IHRoZSBzb3VyY2Ugb3IKKyAgLy8gZGVzdCBhZGRyZXNzIHdpbGwgYmUgcHJvbW90YWJsZS4gIFNlZSBpZiB3ZSBjYW4gZmluZCBhIGJldHRlciB0eXBlIHRoYW4gdGhlCisgIC8vIGludGVnZXIgZGF0YXR5cGUuCisgIFZhbHVlICpTdHJpcHBlZERlc3QgPSBNSS0+Z2V0QXJnT3BlcmFuZCgwKS0+c3RyaXBQb2ludGVyQ2FzdHMoKTsKKyAgaWYgKFN0cmlwcGVkRGVzdCAhPSBNSS0+Z2V0QXJnT3BlcmFuZCgwKSkgeworICAgIGNvbnN0IFR5cGUgKlNyY0VUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KFN0cmlwcGVkRGVzdC0+Z2V0VHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRFbGVtZW50VHlwZSgpOworICAgIGlmIChURCAmJiBTcmNFVHktPmlzU2l6ZWQoKSAmJiBURC0+Z2V0VHlwZVN0b3JlU2l6ZShTcmNFVHkpID09IFNpemUpIHsKKyAgICAgIC8vIFRoZSBTcmNFVHkgbWlnaHQgYmUgc29tZXRoaW5nIGxpa2Uge3t7ZG91YmxlfX19IG9yIFsxIHggZG91YmxlXS4gIFJpcAorICAgICAgLy8gZG93biB0aHJvdWdoIHRoZXNlIGxldmVscyBpZiBzby4KKyAgICAgIHdoaWxlICghU3JjRVR5LT5pc1NpbmdsZVZhbHVlVHlwZSgpKSB7CisgICAgICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihTcmNFVHkpKSB7CisgICAgICAgICAgaWYgKFNUeS0+Z2V0TnVtRWxlbWVudHMoKSA9PSAxKQorICAgICAgICAgICAgU3JjRVR5ID0gU1R5LT5nZXRFbGVtZW50VHlwZSgwKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChjb25zdCBBcnJheVR5cGUgKkFUeSA9IGR5bl9jYXN0PEFycmF5VHlwZT4oU3JjRVR5KSkgeworICAgICAgICAgIGlmIChBVHktPmdldE51bUVsZW1lbnRzKCkgPT0gMSkKKyAgICAgICAgICAgIFNyY0VUeSA9IEFUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChTcmNFVHktPmlzU2luZ2xlVmFsdWVUeXBlKCkpIHsKKyAgICAgICAgTmV3U3JjUHRyVHkgPSBQb2ludGVyVHlwZTo6Z2V0KFNyY0VUeSwgU3JjQWRkclNwKTsKKyAgICAgICAgTmV3RHN0UHRyVHkgPSBQb2ludGVyVHlwZTo6Z2V0KFNyY0VUeSwgRHN0QWRkclNwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIAorICAvLyBJZiB0aGUgbWVtY3B5L21lbW1vdmUgcHJvdmlkZXMgYmV0dGVyIGFsaWdubWVudCBpbmZvIHRoYW4gd2UgY2FuCisgIC8vIGluZmVyLCB1c2UgaXQuCisgIFNyY0FsaWduID0gc3RkOjptYXgoU3JjQWxpZ24sIENvcHlBbGlnbik7CisgIERzdEFsaWduID0gc3RkOjptYXgoRHN0QWxpZ24sIENvcHlBbGlnbik7CisgIAorICBWYWx1ZSAqU3JjID0gQnVpbGRlci0+Q3JlYXRlQml0Q2FzdChNSS0+Z2V0QXJnT3BlcmFuZCgxKSwgTmV3U3JjUHRyVHkpOworICBWYWx1ZSAqRGVzdCA9IEJ1aWxkZXItPkNyZWF0ZUJpdENhc3QoTUktPmdldEFyZ09wZXJhbmQoMCksIE5ld0RzdFB0clR5KTsKKyAgSW5zdHJ1Y3Rpb24gKkwgPSBuZXcgTG9hZEluc3QoU3JjLCBNSS0+aXNWb2xhdGlsZSgpLCBTcmNBbGlnbik7CisgIEluc2VydE5ld0luc3RCZWZvcmUoTCwgKk1JKTsKKyAgSW5zZXJ0TmV3SW5zdEJlZm9yZShuZXcgU3RvcmVJbnN0KEwsIERlc3QsIE1JLT5pc1ZvbGF0aWxlKCksIERzdEFsaWduKSwKKyAgICAgICAgICAgICAgICAgICAgICAqTUkpOworCisgIC8vIFNldCB0aGUgc2l6ZSBvZiB0aGUgY29weSB0byAwLCBpdCB3aWxsIGJlIGRlbGV0ZWQgb24gdGhlIG5leHQgaXRlcmF0aW9uLgorICBNSS0+c2V0QXJnT3BlcmFuZCgyLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKE1lbU9wTGVuZ3RoLT5nZXRUeXBlKCkpKTsKKyAgcmV0dXJuIE1JOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjpTaW1wbGlmeU1lbVNldChNZW1TZXRJbnN0ICpNSSkgeworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBHZXRPckVuZm9yY2VLbm93bkFsaWdubWVudChNSS0+Z2V0RGVzdCgpKTsKKyAgaWYgKE1JLT5nZXRBbGlnbm1lbnQoKSA8IEFsaWdubWVudCkgeworICAgIE1JLT5zZXRBbGlnbm1lbnQoQ29uc3RhbnRJbnQ6OmdldChNSS0+Z2V0QWxpZ25tZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50LCBmYWxzZSkpOworICAgIHJldHVybiBNSTsKKyAgfQorICAKKyAgLy8gRXh0cmFjdCB0aGUgbGVuZ3RoIGFuZCBhbGlnbm1lbnQgYW5kIGZpbGwgaWYgdGhleSBhcmUgY29uc3RhbnQuCisgIENvbnN0YW50SW50ICpMZW5DID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE1JLT5nZXRMZW5ndGgoKSk7CisgIENvbnN0YW50SW50ICpGaWxsQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihNSS0+Z2V0VmFsdWUoKSk7CisgIGlmICghTGVuQyB8fCAhRmlsbEMgfHwgIUZpbGxDLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDgpKQorICAgIHJldHVybiAwOworICB1aW50NjRfdCBMZW4gPSBMZW5DLT5nZXRaRXh0VmFsdWUoKTsKKyAgQWxpZ25tZW50ID0gTUktPmdldEFsaWdubWVudCgpOworICAKKyAgLy8gSWYgdGhlIGxlbmd0aCBpcyB6ZXJvLCB0aGlzIGlzIGEgbm8tb3AKKyAgaWYgKExlbiA9PSAwKSByZXR1cm4gTUk7IC8vIG1lbXNldChkLGMsMCxhKSAtPiBub29wCisgIAorICAvLyBtZW1zZXQocyxjLG4pIC0+IHN0b3JlIHMsIGMgKGZvciBuPTEsMiw0LDgpCisgIGlmIChMZW4gPD0gOCAmJiBpc1Bvd2VyT2YyXzMyKCh1aW50MzJfdClMZW4pKSB7CisgICAgY29uc3QgVHlwZSAqSVR5ID0gSW50ZWdlclR5cGU6OmdldChNSS0+Z2V0Q29udGV4dCgpLCBMZW4qOCk7ICAvLyBuPTEgLT4gaTguCisgICAgCisgICAgVmFsdWUgKkRlc3QgPSBNSS0+Z2V0RGVzdCgpOworICAgIERlc3QgPSBCdWlsZGVyLT5DcmVhdGVCaXRDYXN0KERlc3QsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoSVR5KSk7CisKKyAgICAvLyBBbGlnbm1lbnQgMCBpcyBpZGVudGl0eSBmb3IgYWxpZ25tZW50IDEgZm9yIG1lbXNldCwgYnV0IG5vdCBzdG9yZS4KKyAgICBpZiAoQWxpZ25tZW50ID09IDApIEFsaWdubWVudCA9IDE7CisgICAgCisgICAgLy8gRXh0cmFjdCB0aGUgZmlsbCB2YWx1ZSBhbmQgc3RvcmUuCisgICAgdWludDY0X3QgRmlsbCA9IEZpbGxDLT5nZXRaRXh0VmFsdWUoKSoweDAxMDEwMTAxMDEwMTAxMDFVTEw7CisgICAgSW5zZXJ0TmV3SW5zdEJlZm9yZShuZXcgU3RvcmVJbnN0KENvbnN0YW50SW50OjpnZXQoSVR5LCBGaWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdCwgZmFsc2UsIEFsaWdubWVudCksICpNSSk7CisgICAgCisgICAgLy8gU2V0IHRoZSBzaXplIG9mIHRoZSBjb3B5IHRvIDAsIGl0IHdpbGwgYmUgZGVsZXRlZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24uCisgICAgTUktPnNldExlbmd0aChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKExlbkMtPmdldFR5cGUoKSkpOworICAgIHJldHVybiBNSTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvLy8gdmlzaXRDYWxsSW5zdCAtIENhbGxJbnN0IHNpbXBsaWZpY2F0aW9uLiAgVGhpcyBtb3N0bHkgb25seSBoYW5kbGVzIGZvbGRpbmcgCisvLy8gb2YgaW50cmluc2ljIGluc3RydWN0aW9ucy4gIEZvciBub3JtYWwgY2FsbHMsIGl0IGFsbG93cyB2aXNpdENhbGxTaXRlIHRvIGRvCisvLy8gdGhlIGhlYXZ5IGxpZnRpbmcuCisvLy8KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0Q2FsbEluc3QoQ2FsbEluc3QgJkNJKSB7CisgIEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oJkNJKTsKKyAgaWYgKCFJSSkgcmV0dXJuIHZpc2l0Q2FsbFNpdGUoJkNJKTsKKworICAvLyBJbnRyaW5zaWNzIGNhbm5vdCBvY2N1ciBpbiBhbiBpbnZva2UsIHNvIGhhbmRsZSB0aGVtIGhlcmUgaW5zdGVhZCBvZiBpbgorICAvLyB2aXNpdENhbGxTaXRlLgorICBpZiAoTWVtSW50cmluc2ljICpNSSA9IGR5bl9jYXN0PE1lbUludHJpbnNpYz4oSUkpKSB7CisgICAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgICAvLyBtZW1tb3ZlL2NweS9zZXQgb2YgemVybyBieXRlcyBpcyBhIG5vb3AuCisgICAgaWYgKENvbnN0YW50ICpOdW1CeXRlcyA9IGR5bl9jYXN0PENvbnN0YW50PihNSS0+Z2V0TGVuZ3RoKCkpKSB7CisgICAgICBpZiAoTnVtQnl0ZXMtPmlzTnVsbFZhbHVlKCkpIHJldHVybiBFcmFzZUluc3RGcm9tRnVuY3Rpb24oQ0kpOworCisgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE51bUJ5dGVzKSkKKyAgICAgICAgaWYgKENJLT5nZXRaRXh0VmFsdWUoKSA9PSAxKSB7CisgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgaW5zdHJ1Y3Rpb24gd2l0aCBqdXN0IGJ5dGUgb3BlcmF0aW9ucy4gIFdlIHdvdWxkCisgICAgICAgICAgLy8gdHJhbnNmb3JtIG90aGVyIGNhc2VzIHRvIGxvYWRzL3N0b3JlcywgYnV0IHdlIGRvbid0IGtub3cgaWYKKyAgICAgICAgICAvLyBhbGlnbm1lbnQgaXMgc3VmZmljaWVudC4KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgYSBtZW1tb3ZlIGFuZCB0aGUgc291cmNlIG9wZXJhdGlvbiBpcyBhIGNvbnN0YW50IGdsb2JhbCwKKyAgICAvLyB0aGVuIHRoZSBzb3VyY2UgYW5kIGRlc3QgcG9pbnRlcnMgY2FuJ3QgYWxpYXMsIHNvIHdlIGNhbiBjaGFuZ2UgdGhpcworICAgIC8vIGludG8gYSBjYWxsIHRvIG1lbWNweS4KKyAgICBpZiAoTWVtTW92ZUluc3QgKk1NSSA9IGR5bl9jYXN0PE1lbU1vdmVJbnN0PihNSSkpIHsKKyAgICAgIGlmIChHbG9iYWxWYXJpYWJsZSAqR1ZTcmMgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oTU1JLT5nZXRTb3VyY2UoKSkpCisgICAgICAgIGlmIChHVlNyYy0+aXNDb25zdGFudCgpKSB7CisgICAgICAgICAgTW9kdWxlICpNID0gQ0kuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgICBJbnRyaW5zaWM6OklEIE1lbUNweUlEID0gSW50cmluc2ljOjptZW1jcHk7CisgICAgICAgICAgY29uc3QgVHlwZSAqVHlzWzNdID0geyBDSS5nZXRBcmdPcGVyYW5kKDApLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSS5nZXRBcmdPcGVyYW5kKDEpLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSS5nZXRBcmdPcGVyYW5kKDIpLT5nZXRUeXBlKCkgfTsKKyAgICAgICAgICBDSS5zZXRDYWxsZWRGdW5jdGlvbihJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKE0sIE1lbUNweUlELCBUeXMsIDMpKTsKKyAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChNZW1UcmFuc2Zlckluc3QgKk1USSA9IGR5bl9jYXN0PE1lbVRyYW5zZmVySW5zdD4oTUkpKSB7CisgICAgICAvLyBtZW1tb3ZlKHgseCxzaXplKSAtPiBub29wLgorICAgICAgaWYgKE1USS0+Z2V0U291cmNlKCkgPT0gTVRJLT5nZXREZXN0KCkpCisgICAgICAgIHJldHVybiBFcmFzZUluc3RGcm9tRnVuY3Rpb24oQ0kpOworICAgIH0KKworICAgIC8vIElmIHdlIGNhbiBkZXRlcm1pbmUgYSBwb2ludGVyIGFsaWdubWVudCB0aGF0IGlzIGJpZ2dlciB0aGFuIGN1cnJlbnRseQorICAgIC8vIHNldCwgdXBkYXRlIHRoZSBhbGlnbm1lbnQuCisgICAgaWYgKGlzYTxNZW1UcmFuc2Zlckluc3Q+KE1JKSkgeworICAgICAgaWYgKEluc3RydWN0aW9uICpJID0gU2ltcGxpZnlNZW1UcmFuc2ZlcihNSSkpCisgICAgICAgIHJldHVybiBJOworICAgIH0gZWxzZSBpZiAoTWVtU2V0SW5zdCAqTVNJID0gZHluX2Nhc3Q8TWVtU2V0SW5zdD4oTUkpKSB7CisgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBTaW1wbGlmeU1lbVNldChNU0kpKQorICAgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICBpZiAoQ2hhbmdlZCkgcmV0dXJuIElJOworICB9CisgIAorICBzd2l0Y2ggKElJLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6b2JqZWN0c2l6ZTogeworICAgIC8vIFdlIG5lZWQgdGFyZ2V0IGRhdGEgZm9yIGp1c3QgYWJvdXQgZXZlcnl0aGluZyBzbyBkZXBlbmQgb24gaXQuCisgICAgaWYgKCFURCkgYnJlYWs7CisgICAgCisgICAgY29uc3QgVHlwZSAqUmV0dXJuVHkgPSBDSS5nZXRUeXBlKCk7CisgICAgYm9vbCBNaW4gPSAoY2FzdDxDb25zdGFudEludD4oSUktPmdldEFyZ09wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKSA9PSAxKTsKKworICAgIC8vIEdldCB0byB0aGUgcmVhbCBhbGxvY2F0ZWQgdGhpbmcgYW5kIG9mZnNldCBhcyBmYXN0IGFzIHBvc3NpYmxlLgorICAgIFZhbHVlICpPcDEgPSBJSS0+Z2V0QXJnT3BlcmFuZCgwKS0+c3RyaXBQb2ludGVyQ2FzdHMoKTsKKyAgICAKKyAgICAvLyBJZiB3ZSd2ZSBzdHJpcHBlZCBkb3duIHRvIGEgc2luZ2xlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IHdlCisgICAgLy8gY2FuIGtub3cgdGhlIHNpemUgb2YgdGhlbiBqdXN0IHJldHVybiB0aGF0LgorICAgIGlmIChHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oT3AxKSkgeworICAgICAgaWYgKEdWLT5oYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIoKSkgeworICAgICAgICBDb25zdGFudCAqQyA9IEdWLT5nZXRJbml0aWFsaXplcigpOworICAgICAgICB1aW50NjRfdCBHbG9iYWxTaXplID0gVEQtPmdldFR5cGVBbGxvY1NpemUoQy0+Z2V0VHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoQ0ksIENvbnN0YW50SW50OjpnZXQoUmV0dXJuVHksIEdsb2JhbFNpemUpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSBzaXplIG9mIHRoZSBHVi4KKyAgICAgICAgQ29uc3RhbnQgKlJldFZhbCA9IENvbnN0YW50SW50OjpnZXQoUmV0dXJuVHksIE1pbiA/IDAgOiAtMVVMTCk7CisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBSZXRWYWwpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoQWxsb2NhSW5zdCAqQUkgPSBkeW5fY2FzdDxBbGxvY2FJbnN0PihPcDEpKSB7CisgICAgICAvLyBHZXQgYWxsb2NhIHNpemUuCisgICAgICBpZiAoQUktPmdldEFsbG9jYXRlZFR5cGUoKS0+aXNTaXplZCgpKSB7CisgICAgICAgIHVpbnQ2NF90IEFsbG9jYVNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShBSS0+Z2V0QWxsb2NhdGVkVHlwZSgpKTsKKyAgICAgICAgaWYgKEFJLT5pc0FycmF5QWxsb2NhdGlvbigpKSB7CisgICAgICAgICAgY29uc3QgQ29uc3RhbnRJbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQUktPmdldEFycmF5U2l6ZSgpKTsKKyAgICAgICAgICBpZiAoIUMpIGJyZWFrOworICAgICAgICAgIEFsbG9jYVNpemUgKj0gQy0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoQ0ksIENvbnN0YW50SW50OjpnZXQoUmV0dXJuVHksIEFsbG9jYVNpemUpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KE9wMSkpIHsgICAgICAKKyAgICAgIC8vIE9ubHkgaGFuZGxlIGNvbnN0YW50IEdFUHMgaGVyZS4KKyAgICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpIGJyZWFrOworICAgICAgR0VQT3BlcmF0b3IgKkdFUCA9IGNhc3Q8R0VQT3BlcmF0b3I+KENFKTsKKyAgICAgIAorICAgICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBhIGNvbnN0YW50IG9mZnNldCBmcm9tIGFuIGV4dGVybmFsCisgICAgICAvLyBnbG9iYWwuCisgICAgICBWYWx1ZSAqT3BlcmFuZCA9IEdFUC0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgICAgIE9wZXJhbmQgPSBPcGVyYW5kLT5zdHJpcFBvaW50ZXJDYXN0cygpOworICAgICAgaWYgKEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihPcGVyYW5kKSkKKyAgICAgICAgaWYgKCFHVi0+aGFzRGVmaW5pdGl2ZUluaXRpYWxpemVyKCkpIGJyZWFrOworICAgICAgICAKKyAgICAgIC8vIEdldCB3aGF0IHdlJ3JlIHBvaW50aW5nIHRvIGFuZCBpdHMgc2l6ZS4gCisgICAgICBjb25zdCBQb2ludGVyVHlwZSAqQmFzZVR5cGUgPSAKKyAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oT3BlcmFuZC0+Z2V0VHlwZSgpKTsKKyAgICAgIHVpbnQ2NF90IFNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShCYXNlVHlwZS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgICAKKyAgICAgIC8vIEdldCB0aGUgY3VycmVudCBieXRlIG9mZnNldCBpbnRvIHRoZSB0aGluZy4gVXNlIHRoZSBvcmlnaW5hbAorICAgICAgLy8gb3BlcmFuZCBpbiBjYXNlIHdlJ3JlIGxvb2tpbmcgdGhyb3VnaCBhIGJpdGNhc3QuCisgICAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IE9wcyhDRS0+b3BfYmVnaW4oKSsxLCBDRS0+b3BfZW5kKCkpOworICAgICAgY29uc3QgUG9pbnRlclR5cGUgKk9mZnNldFR5cGUgPQorICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihHRVAtPmdldFBvaW50ZXJPcGVyYW5kKCktPmdldFR5cGUoKSk7CisgICAgICB1aW50NjRfdCBPZmZzZXQgPSBURC0+Z2V0SW5kZXhlZE9mZnNldChPZmZzZXRUeXBlLCAmT3BzWzBdLCBPcHMuc2l6ZSgpKTsKKworICAgICAgaWYgKFNpemUgPCBPZmZzZXQpIHsKKyAgICAgICAgLy8gT3V0IG9mIGJvdW5kIHJlZmVyZW5jZT8gTmVnYXRpdmUgaW5kZXggbm9ybWFsaXplZCB0byBsYXJnZQorICAgICAgICAvLyBpbmRleD8gSnVzdCByZXR1cm4gIkkgZG9uJ3Qga25vdyIuCisgICAgICAgIENvbnN0YW50ICpSZXRWYWwgPSBDb25zdGFudEludDo6Z2V0KFJldHVyblR5LCBNaW4gPyAwIDogLTFVTEwpOworICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChDSSwgUmV0VmFsKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgQ29uc3RhbnQgKlJldFZhbCA9IENvbnN0YW50SW50OjpnZXQoUmV0dXJuVHksIFNpemUtT2Zmc2V0KTsKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBSZXRWYWwpOworICAgIH0gCisKKyAgICAvLyBEbyBub3QgcmV0dXJuICJJIGRvbid0IGtub3ciIGhlcmUuIExhdGVyIG9wdGltaXphdGlvbiBwYXNzZXMgY291bGQKKyAgICAvLyBtYWtlIGl0IHBvc3NpYmxlIHRvIGV2YWx1YXRlIG9iamVjdHNpemUgdG8gYSBjb25zdGFudC4KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEludHJpbnNpYzo6YnN3YXA6CisgICAgLy8gYnN3YXAoYnN3YXAoeCkpIC0+IHgKKyAgICBpZiAoSW50cmluc2ljSW5zdCAqT3BlcmFuZCA9IGR5bl9jYXN0PEludHJpbnNpY0luc3Q+KElJLT5nZXRBcmdPcGVyYW5kKDApKSkKKyAgICAgIGlmIChPcGVyYW5kLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6YnN3YXApCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBPcGVyYW5kLT5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICAgIAorICAgIC8vIGJzd2FwKHRydW5jKGJzd2FwKHgpKSkgLT4gdHJ1bmMobHNocih4LCBjKSkKKyAgICBpZiAoVHJ1bmNJbnN0ICpUSSA9IGR5bl9jYXN0PFRydW5jSW5zdD4oSUktPmdldEFyZ09wZXJhbmQoMCkpKSB7CisgICAgICBpZiAoSW50cmluc2ljSW5zdCAqT3BlcmFuZCA9IGR5bl9jYXN0PEludHJpbnNpY0luc3Q+KFRJLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgaWYgKE9wZXJhbmQtPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpic3dhcCkgeworICAgICAgICAgIHVuc2lnbmVkIEMgPSBPcGVyYW5kLT5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSAtCisgICAgICAgICAgICAgICAgICAgICAgIFRJLT5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKTsKKyAgICAgICAgICBWYWx1ZSAqQ1YgPSBDb25zdGFudEludDo6Z2V0KE9wZXJhbmQtPmdldFR5cGUoKSwgQyk7CisgICAgICAgICAgVmFsdWUgKlYgPSBCdWlsZGVyLT5DcmVhdGVMU2hyKE9wZXJhbmQtPmdldEFyZ09wZXJhbmQoMCksIENWKTsKKyAgICAgICAgICByZXR1cm4gbmV3IFRydW5jSW5zdChWLCBUSS0+Z2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgIAorICAgIGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6cG93aToKKyAgICBpZiAoQ29uc3RhbnRJbnQgKlBvd2VyID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KElJLT5nZXRBcmdPcGVyYW5kKDEpKSkgeworICAgICAgLy8gcG93aSh4LCAwKSAtPiAxLjAKKyAgICAgIGlmIChQb3dlci0+aXNaZXJvKCkpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBDb25zdGFudEZQOjpnZXQoQ0kuZ2V0VHlwZSgpLCAxLjApKTsKKyAgICAgIC8vIHBvd2koeCwgMSkgLT4geAorICAgICAgaWYgKFBvd2VyLT5pc09uZSgpKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChDSSwgSUktPmdldEFyZ09wZXJhbmQoMCkpOworICAgICAgLy8gcG93aSh4LCAtMSkgLT4gMS94CisgICAgICBpZiAoUG93ZXItPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkRpdihDb25zdGFudEZQOjpnZXQoQ0kuZ2V0VHlwZSgpLCAxLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUktPmdldEFyZ09wZXJhbmQoMCkpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OmN0dHo6IHsKKyAgICAvLyBJZiBhbGwgYml0cyBiZWxvdyB0aGUgZmlyc3Qga25vd24gb25lIGFyZSBrbm93biB6ZXJvLAorICAgIC8vIHRoaXMgdmFsdWUgaXMgY29uc3RhbnQuCisgICAgY29uc3QgSW50ZWdlclR5cGUgKklUID0gY2FzdDxJbnRlZ2VyVHlwZT4oSUktPmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKSk7CisgICAgdWludDMyX3QgQml0V2lkdGggPSBJVC0+Z2V0Qml0V2lkdGgoKTsKKyAgICBBUEludCBLbm93blplcm8oQml0V2lkdGgsIDApOworICAgIEFQSW50IEtub3duT25lKEJpdFdpZHRoLCAwKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJSS0+Z2V0QXJnT3BlcmFuZCgwKSwgQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShCaXRXaWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvLCBLbm93bk9uZSk7CisgICAgdW5zaWduZWQgVHJhaWxpbmdaZXJvcyA9IEtub3duT25lLmNvdW50VHJhaWxpbmdaZXJvcygpOworICAgIEFQSW50IE1hc2soQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsIFRyYWlsaW5nWmVyb3MpKTsKKyAgICBpZiAoKE1hc2sgJiBLbm93blplcm8pID09IE1hc2spCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChDSSwgQ29uc3RhbnRJbnQ6OmdldChJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50KEJpdFdpZHRoLCBUcmFpbGluZ1plcm9zKSkpOworICAgIAorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OmN0bHo6IHsKKyAgICAvLyBJZiBhbGwgYml0cyBhYm92ZSB0aGUgZmlyc3Qga25vd24gb25lIGFyZSBrbm93biB6ZXJvLAorICAgIC8vIHRoaXMgdmFsdWUgaXMgY29uc3RhbnQuCisgICAgY29uc3QgSW50ZWdlclR5cGUgKklUID0gY2FzdDxJbnRlZ2VyVHlwZT4oSUktPmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKSk7CisgICAgdWludDMyX3QgQml0V2lkdGggPSBJVC0+Z2V0Qml0V2lkdGgoKTsKKyAgICBBUEludCBLbm93blplcm8oQml0V2lkdGgsIDApOworICAgIEFQSW50IEtub3duT25lKEJpdFdpZHRoLCAwKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhJSS0+Z2V0QXJnT3BlcmFuZCgwKSwgQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShCaXRXaWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvLCBLbm93bk9uZSk7CisgICAgdW5zaWduZWQgTGVhZGluZ1plcm9zID0gS25vd25PbmUuY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgICBBUEludCBNYXNrKEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgTGVhZGluZ1plcm9zKSk7CisgICAgaWYgKChNYXNrICYgS25vd25aZXJvKSA9PSBNYXNrKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoQ0ksIENvbnN0YW50SW50OjpnZXQoSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludChCaXRXaWR0aCwgTGVhZGluZ1plcm9zKSkpOworICAgIAorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnVhZGRfd2l0aF9vdmVyZmxvdzogeworICAgIFZhbHVlICpMSFMgPSBJSS0+Z2V0QXJnT3BlcmFuZCgwKSwgKlJIUyA9IElJLT5nZXRBcmdPcGVyYW5kKDEpOworICAgIGNvbnN0IEludGVnZXJUeXBlICpJVCA9IGNhc3Q8SW50ZWdlclR5cGU+KElJLT5nZXRBcmdPcGVyYW5kKDApLT5nZXRUeXBlKCkpOworICAgIHVpbnQzMl90IEJpdFdpZHRoID0gSVQtPmdldEJpdFdpZHRoKCk7CisgICAgQVBJbnQgTWFzayA9IEFQSW50OjpnZXRTaWduQml0KEJpdFdpZHRoKTsKKyAgICBBUEludCBMSFNLbm93blplcm8oQml0V2lkdGgsIDApOworICAgIEFQSW50IExIU0tub3duT25lKEJpdFdpZHRoLCAwKTsKKyAgICBDb21wdXRlTWFza2VkQml0cyhMSFMsIE1hc2ssIExIU0tub3duWmVybywgTEhTS25vd25PbmUpOworICAgIGJvb2wgTEhTS25vd25OZWdhdGl2ZSA9IExIU0tub3duT25lW0JpdFdpZHRoIC0gMV07CisgICAgYm9vbCBMSFNLbm93blBvc2l0aXZlID0gTEhTS25vd25aZXJvW0JpdFdpZHRoIC0gMV07CisKKyAgICBpZiAoTEhTS25vd25OZWdhdGl2ZSB8fCBMSFNLbm93blBvc2l0aXZlKSB7CisgICAgICBBUEludCBSSFNLbm93blplcm8oQml0V2lkdGgsIDApOworICAgICAgQVBJbnQgUkhTS25vd25PbmUoQml0V2lkdGgsIDApOworICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoUkhTLCBNYXNrLCBSSFNLbm93blplcm8sIFJIU0tub3duT25lKTsKKyAgICAgIGJvb2wgUkhTS25vd25OZWdhdGl2ZSA9IFJIU0tub3duT25lW0JpdFdpZHRoIC0gMV07CisgICAgICBib29sIFJIU0tub3duUG9zaXRpdmUgPSBSSFNLbm93blplcm9bQml0V2lkdGggLSAxXTsKKyAgICAgIGlmIChMSFNLbm93bk5lZ2F0aXZlICYmIFJIU0tub3duTmVnYXRpdmUpIHsKKyAgICAgICAgLy8gVGhlIHNpZ24gYml0IGlzIHNldCBpbiBib3RoIGNhc2VzOiB0aGlzIE1VU1Qgb3ZlcmZsb3cuCisgICAgICAgIC8vIENyZWF0ZSBhIHNpbXBsZSBhZGQgaW5zdHJ1Y3Rpb24sIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgc3RydWN0LgorICAgICAgICBJbnN0cnVjdGlvbiAqQWRkID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChMSFMsIFJIUywgJkNJKTsKKyAgICAgICAgV29ya2xpc3QuQWRkKEFkZCk7CisgICAgICAgIENvbnN0YW50ICpWW10gPSB7CisgICAgICAgICAgVW5kZWZWYWx1ZTo6Z2V0KExIUy0+Z2V0VHlwZSgpKSxDb25zdGFudEludDo6Z2V0VHJ1ZShJSS0+Z2V0Q29udGV4dCgpKQorICAgICAgICB9OworICAgICAgICBDb25zdGFudCAqU3RydWN0ID0gQ29uc3RhbnRTdHJ1Y3Q6OmdldChJSS0+Z2V0Q29udGV4dCgpLCBWLCAyLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBJbnNlcnRWYWx1ZUluc3Q6OkNyZWF0ZShTdHJ1Y3QsIEFkZCwgMCk7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChMSFNLbm93blBvc2l0aXZlICYmIFJIU0tub3duUG9zaXRpdmUpIHsKKyAgICAgICAgLy8gVGhlIHNpZ24gYml0IGlzIGNsZWFyIGluIGJvdGggY2FzZXM6IHRoaXMgQ0FOTk9UIG92ZXJmbG93LgorICAgICAgICAvLyBDcmVhdGUgYSBzaW1wbGUgYWRkIGluc3RydWN0aW9uLCBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIHN0cnVjdC4KKyAgICAgICAgSW5zdHJ1Y3Rpb24gKkFkZCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOVVdBZGQoTEhTLCBSSFMsICZDSSk7CisgICAgICAgIFdvcmtsaXN0LkFkZChBZGQpOworICAgICAgICBDb25zdGFudCAqVltdID0geworICAgICAgICAgIFVuZGVmVmFsdWU6OmdldChMSFMtPmdldFR5cGUoKSksCisgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKElJLT5nZXRDb250ZXh0KCkpCisgICAgICAgIH07CisgICAgICAgIENvbnN0YW50ICpTdHJ1Y3QgPSBDb25zdGFudFN0cnVjdDo6Z2V0KElJLT5nZXRDb250ZXh0KCksIFYsIDIsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIEluc2VydFZhbHVlSW5zdDo6Q3JlYXRlKFN0cnVjdCwgQWRkLCAwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gRkFMTCBUSFJPVUdIIHVhZGQgaW50byBzYWRkCisgIGNhc2UgSW50cmluc2ljOjpzYWRkX3dpdGhfb3ZlcmZsb3c6CisgICAgLy8gQ2Fub25pY2FsaXplIGNvbnN0YW50cyBpbnRvIHRoZSBSSFMuCisgICAgaWYgKGlzYTxDb25zdGFudD4oSUktPmdldEFyZ09wZXJhbmQoMCkpICYmCisgICAgICAgICFpc2E8Q29uc3RhbnQ+KElJLT5nZXRBcmdPcGVyYW5kKDEpKSkgeworICAgICAgVmFsdWUgKkxIUyA9IElJLT5nZXRBcmdPcGVyYW5kKDApOworICAgICAgSUktPnNldEFyZ09wZXJhbmQoMCwgSUktPmdldEFyZ09wZXJhbmQoMSkpOworICAgICAgSUktPnNldEFyZ09wZXJhbmQoMSwgTEhTKTsKKyAgICAgIHJldHVybiBJSTsKKyAgICB9CisKKyAgICAvLyBYICsgdW5kZWYgLT4gdW5kZWYKKyAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KElJLT5nZXRBcmdPcGVyYW5kKDEpKSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBVbmRlZlZhbHVlOjpnZXQoSUktPmdldFR5cGUoKSkpOworICAgICAgCisgICAgaWYgKENvbnN0YW50SW50ICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSUktPmdldEFyZ09wZXJhbmQoMSkpKSB7CisgICAgICAvLyBYICsgMCAtPiB7WCwgZmFsc2V9CisgICAgICBpZiAoUkhTLT5pc1plcm8oKSkgeworICAgICAgICBDb25zdGFudCAqVltdID0geworICAgICAgICAgIFVuZGVmVmFsdWU6OmdldChJSS0+Z2V0QXJnT3BlcmFuZCgwKS0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICBDb25zdGFudEludDo6Z2V0RmFsc2UoSUktPmdldENvbnRleHQoKSkKKyAgICAgICAgfTsKKyAgICAgICAgQ29uc3RhbnQgKlN0cnVjdCA9IENvbnN0YW50U3RydWN0OjpnZXQoSUktPmdldENvbnRleHQoKSwgViwgMiwgZmFsc2UpOworICAgICAgICByZXR1cm4gSW5zZXJ0VmFsdWVJbnN0OjpDcmVhdGUoU3RydWN0LCBJSS0+Z2V0QXJnT3BlcmFuZCgwKSwgMCk7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEludHJpbnNpYzo6dXN1Yl93aXRoX292ZXJmbG93OgorICBjYXNlIEludHJpbnNpYzo6c3N1Yl93aXRoX292ZXJmbG93OgorICAgIC8vIHVuZGVmIC0gWCAtPiB1bmRlZgorICAgIC8vIFggLSB1bmRlZiAtPiB1bmRlZgorICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oSUktPmdldEFyZ09wZXJhbmQoMCkpIHx8CisgICAgICAgIGlzYTxVbmRlZlZhbHVlPihJSS0+Z2V0QXJnT3BlcmFuZCgxKSkpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChDSSwgVW5kZWZWYWx1ZTo6Z2V0KElJLT5nZXRUeXBlKCkpKTsKKyAgICAgIAorICAgIGlmIChDb25zdGFudEludCAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KElJLT5nZXRBcmdPcGVyYW5kKDEpKSkgeworICAgICAgLy8gWCAtIDAgLT4ge1gsIGZhbHNlfQorICAgICAgaWYgKFJIUy0+aXNaZXJvKCkpIHsKKyAgICAgICAgQ29uc3RhbnQgKlZbXSA9IHsKKyAgICAgICAgICBVbmRlZlZhbHVlOjpnZXQoSUktPmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKSksCisgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKElJLT5nZXRDb250ZXh0KCkpCisgICAgICAgIH07CisgICAgICAgIENvbnN0YW50ICpTdHJ1Y3QgPSBDb25zdGFudFN0cnVjdDo6Z2V0KElJLT5nZXRDb250ZXh0KCksIFYsIDIsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIEluc2VydFZhbHVlSW5zdDo6Q3JlYXRlKFN0cnVjdCwgSUktPmdldEFyZ09wZXJhbmQoMCksIDApOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnRyaW5zaWM6OnVtdWxfd2l0aF9vdmVyZmxvdzoKKyAgY2FzZSBJbnRyaW5zaWM6OnNtdWxfd2l0aF9vdmVyZmxvdzoKKyAgICAvLyBDYW5vbmljYWxpemUgY29uc3RhbnRzIGludG8gdGhlIFJIUy4KKyAgICBpZiAoaXNhPENvbnN0YW50PihJSS0+Z2V0QXJnT3BlcmFuZCgwKSkgJiYKKyAgICAgICAgIWlzYTxDb25zdGFudD4oSUktPmdldEFyZ09wZXJhbmQoMSkpKSB7CisgICAgICBWYWx1ZSAqTEhTID0gSUktPmdldEFyZ09wZXJhbmQoMCk7CisgICAgICBJSS0+c2V0QXJnT3BlcmFuZCgwLCBJSS0+Z2V0QXJnT3BlcmFuZCgxKSk7CisgICAgICBJSS0+c2V0QXJnT3BlcmFuZCgxLCBMSFMpOworICAgICAgcmV0dXJuIElJOworICAgIH0KKworICAgIC8vIFggKiB1bmRlZiAtPiB1bmRlZgorICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oSUktPmdldEFyZ09wZXJhbmQoMSkpKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoQ0ksIFVuZGVmVmFsdWU6OmdldChJSS0+Z2V0VHlwZSgpKSk7CisgICAgICAKKyAgICBpZiAoQ29uc3RhbnRJbnQgKlJIU0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSUktPmdldEFyZ09wZXJhbmQoMSkpKSB7CisgICAgICAvLyBYKjAgLT4gezAsIGZhbHNlfQorICAgICAgaWYgKFJIU0ktPmlzWmVybygpKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChDSSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJSS0+Z2V0VHlwZSgpKSk7CisgICAgICAKKyAgICAgIC8vIFggKiAxIC0+IHtYLCBmYWxzZX0KKyAgICAgIGlmIChSSFNJLT5lcXVhbHNJbnQoMSkpIHsKKyAgICAgICAgQ29uc3RhbnQgKlZbXSA9IHsKKyAgICAgICAgICBVbmRlZlZhbHVlOjpnZXQoSUktPmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKSksCisgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKElJLT5nZXRDb250ZXh0KCkpCisgICAgICAgIH07CisgICAgICAgIENvbnN0YW50ICpTdHJ1Y3QgPSBDb25zdGFudFN0cnVjdDo6Z2V0KElJLT5nZXRDb250ZXh0KCksIFYsIDIsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIEluc2VydFZhbHVlSW5zdDo6Q3JlYXRlKFN0cnVjdCwgSUktPmdldEFyZ09wZXJhbmQoMCksIDApOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgLy9jYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfbHZ4OgorICAvL2Nhc2UgSW50cmluc2ljOjpwcGNfYWx0aXZlY19sdnhsOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9sb2FkdV9wczoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX2xvYWR1X3BkOgorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfbG9hZHVfZHE6CisgICAgLy8gVHVybiBQUEMgbHZ4ICAgICAtPiBsb2FkIGlmIHRoZSBwb2ludGVyIGlzIGtub3duIGFsaWduZWQuCisgICAgLy8gVHVybiBYODYgbG9hZHVwcyAtPiBsb2FkIGlmIHRoZSBwb2ludGVyIGlzIGtub3duIGFsaWduZWQuCisgICAgaWYgKEdldE9yRW5mb3JjZUtub3duQWxpZ25tZW50KElJLT5nZXRBcmdPcGVyYW5kKDApLCAxNikgPj0gMTYpIHsKKyAgICAgIFZhbHVlICpQdHIgPSBCdWlsZGVyLT5DcmVhdGVCaXRDYXN0KElJLT5nZXRBcmdPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKElJLT5nZXRUeXBlKCkpKTsKKyAgICAgIHJldHVybiBuZXcgTG9hZEluc3QoUHRyKTsKKyAgICB9CisgICAgYnJlYWs7CisgIC8vY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3N0dng6CisgIC8vY2FzZSBJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3N0dnhsOgorICAgIC8vIFR1cm4gc3R2eCAtPiBzdG9yZSBpZiB0aGUgcG9pbnRlciBpcyBrbm93biBhbGlnbmVkLgorICAgIGlmIChHZXRPckVuZm9yY2VLbm93bkFsaWdubWVudChJSS0+Z2V0QXJnT3BlcmFuZCgxKSwgMTYpID49IDE2KSB7CisgICAgICBjb25zdCBUeXBlICpPcFB0clR5ID0gCisgICAgICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoSUktPmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKSk7CisgICAgICBWYWx1ZSAqUHRyID0gQnVpbGRlci0+Q3JlYXRlQml0Q2FzdChJSS0+Z2V0QXJnT3BlcmFuZCgxKSwgT3BQdHJUeSk7CisgICAgICByZXR1cm4gbmV3IFN0b3JlSW5zdChJSS0+Z2V0QXJnT3BlcmFuZCgwKSwgUHRyKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3N0b3JldV9wczoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3N0b3JldV9wZDoKKyAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3N0b3JldV9kcToKKyAgICAvLyBUdXJuIFg4NiBzdG9yZXUgLT4gc3RvcmUgaWYgdGhlIHBvaW50ZXIgaXMga25vd24gYWxpZ25lZC4KKyAgICBpZiAoR2V0T3JFbmZvcmNlS25vd25BbGlnbm1lbnQoSUktPmdldEFyZ09wZXJhbmQoMCksIDE2KSA+PSAxNikgeworICAgICAgY29uc3QgVHlwZSAqT3BQdHJUeSA9IAorICAgICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKElJLT5nZXRBcmdPcGVyYW5kKDEpLT5nZXRUeXBlKCkpOworICAgICAgVmFsdWUgKlB0ciA9IEJ1aWxkZXItPkNyZWF0ZUJpdENhc3QoSUktPmdldEFyZ09wZXJhbmQoMCksIE9wUHRyVHkpOworICAgICAgcmV0dXJuIG5ldyBTdG9yZUluc3QoSUktPmdldEFyZ09wZXJhbmQoMSksIFB0cik7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9jdnR0c3Myc2k6IHsKKyAgICAvLyBUaGVzZSBpbnRyaW5zaWNzIG9ubHkgZGVtYW5kcyB0aGUgMHRoIGVsZW1lbnQgb2YgaXRzIGlucHV0IHZlY3Rvci4gIElmCisgICAgLy8gd2UgY2FuIHNpbXBsaWZ5IHRoZSBpbnB1dCBiYXNlZCBvbiB0aGF0LCBkbyBzbyBub3cuCisgICAgdW5zaWduZWQgVldpZHRoID0KKyAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oSUktPmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKSktPmdldE51bUVsZW1lbnRzKCk7CisgICAgQVBJbnQgRGVtYW5kZWRFbHRzKFZXaWR0aCwgMSk7CisgICAgQVBJbnQgVW5kZWZFbHRzKFZXaWR0aCwgMCk7CisgICAgaWYgKFZhbHVlICpWID0gU2ltcGxpZnlEZW1hbmRlZFZlY3RvckVsdHMoSUktPmdldEFyZ09wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVtYW5kZWRFbHRzLCBVbmRlZkVsdHMpKSB7CisgICAgICBJSS0+c2V0QXJnT3BlcmFuZCgwLCBWKTsKKyAgICAgIHJldHVybiBJSTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgICAKKyAgLy9jYXNlIEludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBlcm06CisgICAgLy8gVHVybiB2cGVybShWMSxWMixtYXNrKSAtPiBzaHVmZmxlKFYxLFYyLG1hc2spIGlmIG1hc2sgaXMgYSBjb25zdGFudC4KKyAgICBpZiAoQ29uc3RhbnRWZWN0b3IgKk1hc2sgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oSUktPmdldEFyZ09wZXJhbmQoMikpKSB7CisgICAgICBhc3NlcnQoTWFzay0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAxNiAmJiAiQmFkIHR5cGUgZm9yIGludHJpbnNpYyEiKTsKKyAgICAgIAorICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgb2YgdGhlIGVsZW1lbnRzIGFyZSBpbnRlZ2VyIGNvbnN0YW50cyBvciB1bmRlZnMuCisgICAgICBib29sIEFsbEVsdHNPayA9IHRydWU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDE2OyArK2kpIHsKKyAgICAgICAgaWYgKCFpc2E8Q29uc3RhbnRJbnQ+KE1hc2stPmdldE9wZXJhbmQoaSkpICYmIAorICAgICAgICAgICAgIWlzYTxVbmRlZlZhbHVlPihNYXNrLT5nZXRPcGVyYW5kKGkpKSkgeworICAgICAgICAgIEFsbEVsdHNPayA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChBbGxFbHRzT2spIHsKKyAgICAgICAgLy8gQ2FzdCB0aGUgaW5wdXQgdmVjdG9ycyB0byBieXRlIHZlY3RvcnMuCisgICAgICAgIFZhbHVlICpPcDAgPSBCdWlsZGVyLT5DcmVhdGVCaXRDYXN0KElJLT5nZXRBcmdPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrLT5nZXRUeXBlKCkpOworICAgICAgICBWYWx1ZSAqT3AxID0gQnVpbGRlci0+Q3JlYXRlQml0Q2FzdChJSS0+Z2V0QXJnT3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFzay0+Z2V0VHlwZSgpKTsKKyAgICAgICAgVmFsdWUgKlJlc3VsdCA9IFVuZGVmVmFsdWU6OmdldChPcDAtPmdldFR5cGUoKSk7CisgICAgICAgIAorICAgICAgICAvLyBPbmx5IGV4dHJhY3QgZWFjaCBlbGVtZW50IG9uY2UuCisgICAgICAgIFZhbHVlICpFeHRyYWN0ZWRFbHRzWzMyXTsKKyAgICAgICAgbWVtc2V0KEV4dHJhY3RlZEVsdHMsIDAsIHNpemVvZihFeHRyYWN0ZWRFbHRzKSk7CisgICAgICAgIAorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDE2OyArK2kpIHsKKyAgICAgICAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KE1hc2stPmdldE9wZXJhbmQoaSkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgdW5zaWduZWQgSWR4PWNhc3Q8Q29uc3RhbnRJbnQ+KE1hc2stPmdldE9wZXJhbmQoaSkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgICBJZHggJj0gMzE7ICAvLyBNYXRjaCB0aGUgaGFyZHdhcmUgYmVoYXZpb3IuCisgICAgICAgICAgCisgICAgICAgICAgaWYgKEV4dHJhY3RlZEVsdHNbSWR4XSA9PSAwKSB7CisgICAgICAgICAgICBFeHRyYWN0ZWRFbHRzW0lkeF0gPSAKKyAgICAgICAgICAgICAgQnVpbGRlci0+Q3JlYXRlRXh0cmFjdEVsZW1lbnQoSWR4IDwgMTYgPyBPcDAgOiBPcDEsIAorICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KElJLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZHgmMTUsIGZhbHNlKSk7CisgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAvLyBJbnNlcnQgdGhpcyB2YWx1ZSBpbnRvIHRoZSByZXN1bHQgdmVjdG9yLgorICAgICAgICAgIFJlc3VsdCA9IEJ1aWxkZXItPkNyZWF0ZUluc2VydEVsZW1lbnQoUmVzdWx0LCBFeHRyYWN0ZWRFbHRzW0lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KElJLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZmFsc2UpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZShJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgUmVzdWx0LCBDSS5nZXRUeXBlKCkpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIEludHJpbnNpYzo6c3RhY2tyZXN0b3JlOiB7CisgICAgLy8gSWYgdGhlIHNhdmUgaXMgcmlnaHQgbmV4dCB0byB0aGUgcmVzdG9yZSwgcmVtb3ZlIHRoZSByZXN0b3JlLiAgVGhpcyBjYW4KKyAgICAvLyBoYXBwZW4gd2hlbiB2YXJpYWJsZSBhbGxvY2FzIGFyZSBEQ0UnZC4KKyAgICBpZiAoSW50cmluc2ljSW5zdCAqU1MgPSBkeW5fY2FzdDxJbnRyaW5zaWNJbnN0PihJSS0+Z2V0QXJnT3BlcmFuZCgwKSkpIHsKKyAgICAgIGlmIChTUy0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6OnN0YWNrc2F2ZSkgeworICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCSSA9IFNTOworICAgICAgICBpZiAoJiorK0JJID09IElJKQorICAgICAgICAgIHJldHVybiBFcmFzZUluc3RGcm9tRnVuY3Rpb24oQ0kpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBTY2FuIGRvd24gdGhpcyBibG9jayB0byBzZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBzdGFjayByZXN0b3JlIGluIHRoZQorICAgIC8vIHNhbWUgYmxvY2sgd2l0aG91dCBhbiBpbnRlcnZlbmluZyBjYWxsL2FsbG9jYS4KKyAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCSSA9IElJOworICAgIFRlcm1pbmF0b3JJbnN0ICpUSSA9IElJLT5nZXRQYXJlbnQoKS0+Z2V0VGVybWluYXRvcigpOworICAgIGJvb2wgQ2Fubm90UmVtb3ZlID0gZmFsc2U7CisgICAgZm9yICgrK0JJOyAmKkJJICE9IFRJOyArK0JJKSB7CisgICAgICBpZiAoaXNhPEFsbG9jYUluc3Q+KEJJKSkgeworICAgICAgICBDYW5ub3RSZW1vdmUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChDYWxsSW5zdCAqQkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KEJJKSkgeworICAgICAgICBpZiAoSW50cmluc2ljSW5zdCAqSUkgPSBkeW5fY2FzdDxJbnRyaW5zaWNJbnN0PihCQ0kpKSB7CisgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzdGFja3Jlc3RvcmUgYmVsb3cgdGhpcyBvbmUsIHJlbW92ZSB0aGlzIG9uZS4KKyAgICAgICAgICBpZiAoSUktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpzdGFja3Jlc3RvcmUpCisgICAgICAgICAgICByZXR1cm4gRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKENJKTsKKyAgICAgICAgICAvLyBPdGhlcndpc2UsIGlnbm9yZSB0aGUgaW50cmluc2ljLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgbm9uLWludHJpbnNpYyBjYWxsLCB3ZSBjYW4ndCByZW1vdmUgdGhlIHN0YWNrCisgICAgICAgICAgLy8gcmVzdG9yZS4KKyAgICAgICAgICBDYW5ub3RSZW1vdmUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIElmIHRoZSBzdGFjayByZXN0b3JlIGlzIGluIGEgcmV0dXJuL3Vud2luZCBibG9jayBhbmQgaWYgdGhlcmUgYXJlIG5vCisgICAgLy8gYWxsb2NhcyBvciBjYWxscyBiZXR3ZWVuIHRoZSByZXN0b3JlIGFuZCB0aGUgcmV0dXJuLCBudWtlIHRoZSByZXN0b3JlLgorICAgIGlmICghQ2Fubm90UmVtb3ZlICYmIGlzYTxSZXR1cm5JbnN0PihUSSkpCisgICAgICByZXR1cm4gRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKENJKTsKKyAgICBicmVhazsKKyAgfQorICB9CisKKyAgcmV0dXJuIHZpc2l0Q2FsbFNpdGUoSUkpOworfQorCisvLy8gaXNTYWZlVG9FbGltaW5hdGVWYXJhcmdzQ2FzdCAtIElmIHRoaXMgY2FzdCBkb2VzIG5vdCBhZmZlY3QgdGhlIHZhbHVlIAorLy8vIHBhc3NlZCB0aHJvdWdoIHRoZSB2YXJhcmdzIGFyZWEsIHdlIGNhbiBlbGltaW5hdGUgdGhlIHVzZSBvZiB0aGUgY2FzdC4KK3N0YXRpYyBib29sIGlzU2FmZVRvRWxpbWluYXRlVmFyYXJnc0Nhc3QoY29uc3QgQ2FsbFNpdGUgQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhc3RJbnN0ICogY29uc3QgQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKiBjb25zdCBURCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGl4KSB7CisgIGlmICghQ0ktPmlzTG9zc2xlc3NDYXN0KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFRoZSBzaXplIG9mIEJ5VmFsIGFyZ3VtZW50cyBpcyBkZXJpdmVkIGZyb20gdGhlIHR5cGUsIHNvIHdlCisgIC8vIGNhbid0IGNoYW5nZSB0byBhIHR5cGUgd2l0aCBhIGRpZmZlcmVudCBzaXplLiAgSWYgdGhlIHNpemUgd2VyZQorICAvLyBwYXNzZWQgZXhwbGljaXRseSB3ZSBjb3VsZCBhdm9pZCB0aGlzIGNoZWNrLgorICBpZiAoIUNTLnBhcmFtSGFzQXR0cihpeCwgQXR0cmlidXRlOjpCeVZhbCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgY29uc3QgVHlwZSogU3JjVHkgPSAKKyAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KENJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICBjb25zdCBUeXBlKiBEc3RUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KENJLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICBpZiAoIVNyY1R5LT5pc1NpemVkKCkgfHwgIURzdFR5LT5pc1NpemVkKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIVREIHx8IFRELT5nZXRUeXBlQWxsb2NTaXplKFNyY1R5KSAhPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShEc3RUeSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gdmlzaXRDYWxsU2l0ZSAtIEltcHJvdmVtZW50cyBmb3IgY2FsbCBhbmQgaW52b2tlIGluc3RydWN0aW9ucy4KKy8vCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdENhbGxTaXRlKENhbGxTaXRlIENTKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIC8vIElmIHRoZSBjYWxsZWUgaXMgYSBjb25zdGV4cHIgY2FzdCBvZiBhIGZ1bmN0aW9uLCBhdHRlbXB0IHRvIG1vdmUgdGhlIGNhc3QKKyAgLy8gdG8gdGhlIGFyZ3VtZW50cyBvZiB0aGUgY2FsbC9pbnZva2UuCisgIGlmICh0cmFuc2Zvcm1Db25zdEV4cHJDYXN0Q2FsbChDUykpIHJldHVybiAwOworCisgIFZhbHVlICpDYWxsZWUgPSBDUy5nZXRDYWxsZWRWYWx1ZSgpOworCisgIGlmIChGdW5jdGlvbiAqQ2FsbGVlRiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihDYWxsZWUpKQorICAgIC8vIElmIHRoZSBjYWxsIGFuZCBjYWxsZWUgY2FsbGluZyBjb252ZW50aW9ucyBkb24ndCBtYXRjaCwgdGhpcyBjYWxsIG11c3QKKyAgICAvLyBiZSB1bnJlYWNoYWJsZSwgYXMgdGhlIGNhbGwgaXMgdW5kZWZpbmVkLgorICAgIGlmIChDYWxsZWVGLT5nZXRDYWxsaW5nQ29udigpICE9IENTLmdldENhbGxpbmdDb252KCkgJiYKKyAgICAgICAgLy8gT25seSBkbyB0aGlzIGZvciBjYWxscyB0byBhIGZ1bmN0aW9uIHdpdGggYSBib2R5LiAgQSBwcm90b3R5cGUgbWF5CisgICAgICAgIC8vIG5vdCBhY3R1YWxseSBlbmQgdXAgbWF0Y2hpbmcgdGhlIGltcGxlbWVudGF0aW9uJ3MgY2FsbGluZyBjb252IGZvciBhCisgICAgICAgIC8vIHZhcmlldHkgb2YgcmVhc29ucyAoZS5nLiBpdCBtYXkgYmUgd3JpdHRlbiBpbiBhc3NlbWJseSkuCisgICAgICAgICFDYWxsZWVGLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgIEluc3RydWN0aW9uICpPbGRDYWxsID0gQ1MuZ2V0SW5zdHJ1Y3Rpb24oKTsKKyAgICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnRJbnQ6OmdldFRydWUoQ2FsbGVlLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgIFVuZGVmVmFsdWU6OmdldChUeXBlOjpnZXRJbnQxUHRyVHkoQ2FsbGVlLT5nZXRDb250ZXh0KCkpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkQ2FsbCk7CisgICAgICAvLyBJZiBPbGRDYWxsIGR1ZXMgbm90IHJldHVybiB2b2lkIHRoZW4gcmVwbGFjZUFsbFVzZXNXaXRoIHVuZGVmLgorICAgICAgLy8gVGhpcyBhbGxvd3MgVmFsdWVIYW5kbGVycyBhbmQgY3VzdG9tIG1ldGFkYXRhIHRvIGFkanVzdCBpdHNlbGYuCisgICAgICBpZiAoIU9sZENhbGwtPmdldFR5cGUoKS0+aXNWb2lkVHkoKSkKKyAgICAgICAgT2xkQ2FsbC0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChPbGRDYWxsLT5nZXRUeXBlKCkpKTsKKyAgICAgIGlmIChpc2E8Q2FsbEluc3Q+KE9sZENhbGwpKQorICAgICAgICByZXR1cm4gRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKCpPbGRDYWxsKTsKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oQ2FsbGVlKSB8fCBpc2E8VW5kZWZWYWx1ZT4oQ2FsbGVlKSkgeworICAgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbm90IHJlYWNoYWJsZSwganVzdCByZW1vdmUgaXQuICBXZSBpbnNlcnQgYSBzdG9yZSB0bworICAgIC8vIHVuZGVmIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgY29kZSBpcyBub3QgcmVhY2hhYmxlLCBkZXNwaXRlIHRoZSBmYWN0CisgICAgLy8gdGhhdCB3ZSBjYW4ndCBtb2RpZnkgdGhlIENGRyBoZXJlLgorICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnRJbnQ6OmdldFRydWUoQ2FsbGVlLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgVW5kZWZWYWx1ZTo6Z2V0KFR5cGU6OmdldEludDFQdHJUeShDYWxsZWUtPmdldENvbnRleHQoKSkpLAorICAgICAgICAgICAgICAgICAgQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSk7CisKKyAgICAvLyBJZiBDUyBkb2VzIG5vdCByZXR1cm4gdm9pZCB0aGVuIHJlcGxhY2VBbGxVc2VzV2l0aCB1bmRlZi4KKyAgICAvLyBUaGlzIGFsbG93cyBWYWx1ZUhhbmRsZXJzIGFuZCBjdXN0b20gbWV0YWRhdGEgdG8gYWRqdXN0IGl0c2VsZi4KKyAgICBpZiAoIUNTLmdldEluc3RydWN0aW9uKCktPmdldFR5cGUoKS0+aXNWb2lkVHkoKSkKKyAgICAgIENTLmdldEluc3RydWN0aW9uKCktPgorICAgICAgICByZXBsYWNlQWxsVXNlc1dpdGgoVW5kZWZWYWx1ZTo6Z2V0KENTLmdldEluc3RydWN0aW9uKCktPmdldFR5cGUoKSkpOworCisgICAgcmV0dXJuIEVyYXNlSW5zdEZyb21GdW5jdGlvbigqQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSk7CisgIH0KKworICBpZiAoQml0Q2FzdEluc3QgKkJDID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KENhbGxlZSkpCisgICAgaWYgKEludHJpbnNpY0luc3QgKkluID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oQkMtPmdldE9wZXJhbmQoMCkpKQorICAgICAgaWYgKEluLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6aW5pdF90cmFtcG9saW5lKQorICAgICAgICByZXR1cm4gdHJhbnNmb3JtQ2FsbFRocm91Z2hUcmFtcG9saW5lKENTKTsKKworICBjb25zdCBQb2ludGVyVHlwZSAqUFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oQ2FsbGVlLT5nZXRUeXBlKCkpOworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9IGNhc3Q8RnVuY3Rpb25UeXBlPihQVHktPmdldEVsZW1lbnRUeXBlKCkpOworICBpZiAoRlR5LT5pc1ZhckFyZygpKSB7CisgICAgaW50IGl4ID0gRlR5LT5nZXROdW1QYXJhbXMoKSArIChJU0FfSU5WT0tFX0lOU1QoQ2FsbGVlKSA/IDMgOiAxKTsKKyAgICAvLyBTZWUgaWYgd2UgY2FuIG9wdGltaXplIGFueSBhcmd1bWVudHMgcGFzc2VkIHRocm91Z2ggdGhlIHZhcmFyZ3MgYXJlYSBvZgorICAgIC8vIHRoZSBjYWxsLgorICAgIGZvciAoQ2FsbFNpdGU6OmFyZ19pdGVyYXRvciBJID0gQ1MuYXJnX2JlZ2luKCkrRlR5LT5nZXROdW1QYXJhbXMoKSwKKyAgICAgICAgICAgRSA9IENTLmFyZ19lbmQoKTsgSSAhPSBFOyArK0ksICsraXgpIHsKKyAgICAgIENhc3RJbnN0ICpDSSA9IGR5bl9jYXN0PENhc3RJbnN0PigqSSk7CisgICAgICBpZiAoQ0kgJiYgaXNTYWZlVG9FbGltaW5hdGVWYXJhcmdzQ2FzdChDUywgQ0ksIFRELCBpeCkpIHsKKyAgICAgICAgKkkgPSBDSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIAorICByZXR1cm4gQ2hhbmdlZCA/IENTLmdldEluc3RydWN0aW9uKCkgOiAwOworfQorCisvLyB0cmFuc2Zvcm1Db25zdEV4cHJDYXN0Q2FsbCAtIElmIHRoZSBjYWxsZWUgaXMgYSBjb25zdGV4cHIgY2FzdCBvZiBhIGZ1bmN0aW9uLAorLy8gYXR0ZW1wdCB0byBtb3ZlIHRoZSBjYXN0IHRvIHRoZSBhcmd1bWVudHMgb2YgdGhlIGNhbGwvaW52b2tlLgorLy8KK2Jvb2wgSW5zdENvbWJpbmVyOjp0cmFuc2Zvcm1Db25zdEV4cHJDYXN0Q2FsbChDYWxsU2l0ZSBDUykgeworICBpZiAoIWlzYTxDb25zdGFudEV4cHI+KENTLmdldENhbGxlZFZhbHVlKCkpKSByZXR1cm4gZmFsc2U7CisgIENvbnN0YW50RXhwciAqQ0UgPSBjYXN0PENvbnN0YW50RXhwcj4oQ1MuZ2V0Q2FsbGVkVmFsdWUoKSk7CisgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QgfHwgCisgICAgICAhaXNhPEZ1bmN0aW9uPihDRS0+Z2V0T3BlcmFuZCgwKSkpCisgICAgcmV0dXJuIGZhbHNlOworICBGdW5jdGlvbiAqQ2FsbGVlID0gY2FzdDxGdW5jdGlvbj4oQ0UtPmdldE9wZXJhbmQoMCkpOworICBJbnN0cnVjdGlvbiAqQ2FsbGVyID0gQ1MuZ2V0SW5zdHJ1Y3Rpb24oKTsKKyAgY29uc3QgQXR0ckxpc3RQdHIgJkNhbGxlclBBTCA9IENTLmdldEF0dHJpYnV0ZXMoKTsKKworICAvLyBPa2F5LCB0aGlzIGlzIGEgY2FzdCBmcm9tIGEgZnVuY3Rpb24gdG8gYSBkaWZmZXJlbnQgdHlwZS4gIFVubGVzcyBkb2luZyBzbworICAvLyB3b3VsZCBjYXVzZSBhIHR5cGUgY29udmVyc2lvbiBvZiBvbmUgb2Ygb3VyIGFyZ3VtZW50cywgY2hhbmdlIHRoaXMgY2FsbCB0bworICAvLyBiZSBhIGRpcmVjdCBjYWxsIHdpdGggYXJndW1lbnRzIGNhc3RlZCB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZXMuCisgIC8vCisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPSBDYWxsZWUtPmdldEZ1bmN0aW9uVHlwZSgpOworICBjb25zdCBUeXBlICpPbGRSZXRUeSA9IENhbGxlci0+Z2V0VHlwZSgpOworICBjb25zdCBUeXBlICpOZXdSZXRUeSA9IEZULT5nZXRSZXR1cm5UeXBlKCk7CisKKyAgaWYgKE5ld1JldFR5LT5pc1N0cnVjdFR5KCkpCisgICAgcmV0dXJuIGZhbHNlOyAvLyBUT0RPOiBIYW5kbGUgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KKworICAvLyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGNoYW5naW5nIHRoZSByZXR1cm4gdHlwZS4uLgorICBpZiAoT2xkUmV0VHkgIT0gTmV3UmV0VHkpIHsKKyAgICBpZiAoQ2FsbGVlLT5pc0RlY2xhcmF0aW9uKCkgJiYKKyAgICAgICAgLy8gQ29udmVyc2lvbiBpcyBvayBpZiBjaGFuZ2luZyBmcm9tIG9uZSBwb2ludGVyIHR5cGUgdG8gYW5vdGhlciBvciBmcm9tCisgICAgICAgIC8vIGEgcG9pbnRlciB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzYW1lIHNpemUuCisgICAgICAgICEoKE9sZFJldFR5LT5pc1BvaW50ZXJUeSgpIHx8ICFURCB8fAorICAgICAgICAgICBPbGRSZXRUeSA9PSBURC0+Z2V0SW50UHRyVHlwZShDYWxsZXItPmdldENvbnRleHQoKSkpICYmCisgICAgICAgICAgKE5ld1JldFR5LT5pc1BvaW50ZXJUeSgpIHx8ICFURCB8fAorICAgICAgICAgICBOZXdSZXRUeSA9PSBURC0+Z2V0SW50UHRyVHlwZShDYWxsZXItPmdldENvbnRleHQoKSkpKSkKKyAgICAgIHJldHVybiBmYWxzZTsgICAvLyBDYW5ub3QgdHJhbnNmb3JtIHRoaXMgcmV0dXJuIHZhbHVlLgorCisgICAgaWYgKCFDYWxsZXItPnVzZV9lbXB0eSgpICYmCisgICAgICAgIC8vIHZvaWQgLT4gbm9uLXZvaWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkKKyAgICAgICAgIU5ld1JldFR5LT5pc1ZvaWRUeSgpICYmICFDYXN0SW5zdDo6aXNDYXN0YWJsZShOZXdSZXRUeSwgT2xkUmV0VHkpKQorICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIENhbm5vdCB0cmFuc2Zvcm0gdGhpcyByZXR1cm4gdmFsdWUuCisKKyAgICBpZiAoIUNhbGxlclBBTC5pc0VtcHR5KCkgJiYgIUNhbGxlci0+dXNlX2VtcHR5KCkpIHsKKyAgICAgIEF0dHJpYnV0ZXMgUkF0dHJzID0gQ2FsbGVyUEFMLmdldFJldEF0dHJpYnV0ZXMoKTsKKyAgICAgIGlmIChSQXR0cnMgJiBBdHRyaWJ1dGU6OnR5cGVJbmNvbXBhdGlibGUoTmV3UmV0VHkpKQorICAgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gQXR0cmlidXRlIG5vdCBjb21wYXRpYmxlIHdpdGggdHJhbnNmb3JtZWQgdmFsdWUuCisgICAgfQorICB9CisKKyAgdW5zaWduZWQgTnVtQWN0dWFsQXJncyA9IHVuc2lnbmVkKENTLmFyZ19lbmQoKS1DUy5hcmdfYmVnaW4oKSk7CisgIHVuc2lnbmVkIE51bUNvbW1vbkFyZ3MgPSBzdGQ6Om1pbihGVC0+Z2V0TnVtUGFyYW1zKCksIE51bUFjdHVhbEFyZ3MpOworCisgIENhbGxTaXRlOjphcmdfaXRlcmF0b3IgQUkgPSBDUy5hcmdfYmVnaW4oKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE51bUNvbW1vbkFyZ3M7IGkgIT0gZTsgKytpLCArK0FJKSB7CisgICAgY29uc3QgVHlwZSAqUGFyYW1UeSA9IEZULT5nZXRQYXJhbVR5cGUoaSk7CisgICAgY29uc3QgVHlwZSAqQWN0VHkgPSAoKkFJKS0+Z2V0VHlwZSgpOworCisgICAgaWYgKCFDYXN0SW5zdDo6aXNDYXN0YWJsZShBY3RUeSwgUGFyYW1UeSkpCisgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gQ2Fubm90IHRyYW5zZm9ybSB0aGlzIHBhcmFtZXRlciB2YWx1ZS4KKworICAgIGlmIChDYWxsZXJQQUwuZ2V0UGFyYW1BdHRyaWJ1dGVzKGkgKyAxKSAKKyAgICAgICAgJiBBdHRyaWJ1dGU6OnR5cGVJbmNvbXBhdGlibGUoUGFyYW1UeSkpCisgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gQXR0cmlidXRlIG5vdCBjb21wYXRpYmxlIHdpdGggdHJhbnNmb3JtZWQgdmFsdWUuCisKKyAgICAvLyBDb252ZXJ0aW5nIGZyb20gb25lIHBvaW50ZXIgdHlwZSB0byBhbm90aGVyIG9yIGJldHdlZW4gYSBwb2ludGVyIGFuZCBhbgorICAgIC8vIGludGVnZXIgb2YgdGhlIHNhbWUgc2l6ZSBpcyBzYWZlIGV2ZW4gaWYgd2UgZG8gbm90IGhhdmUgYSBib2R5LgorICAgIGJvb2wgaXNDb252ZXJ0aWJsZSA9IEFjdFR5ID09IFBhcmFtVHkgfHwKKyAgICAgIChURCAmJiAoKFBhcmFtVHktPmlzUG9pbnRlclR5KCkgfHwKKyAgICAgIFBhcmFtVHkgPT0gVEQtPmdldEludFB0clR5cGUoQ2FsbGVyLT5nZXRDb250ZXh0KCkpKSAmJgorICAgICAgICAgICAgICAoQWN0VHktPmlzUG9pbnRlclR5KCkgfHwKKyAgICAgICAgICAgICAgQWN0VHkgPT0gVEQtPmdldEludFB0clR5cGUoQ2FsbGVyLT5nZXRDb250ZXh0KCkpKSkpOworICAgIGlmIChDYWxsZWUtPmlzRGVjbGFyYXRpb24oKSAmJiAhaXNDb252ZXJ0aWJsZSkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKEZULT5nZXROdW1QYXJhbXMoKSA8IE51bUFjdHVhbEFyZ3MgJiYgIUZULT5pc1ZhckFyZygpICYmCisgICAgICBDYWxsZWUtPmlzRGVjbGFyYXRpb24oKSkKKyAgICByZXR1cm4gZmFsc2U7ICAgLy8gRG8gbm90IGRlbGV0ZSBhcmd1bWVudHMgdW5sZXNzIHdlIGhhdmUgYSBmdW5jdGlvbiBib2R5LgorCisgIGlmIChGVC0+Z2V0TnVtUGFyYW1zKCkgPCBOdW1BY3R1YWxBcmdzICYmIEZULT5pc1ZhckFyZygpICYmCisgICAgICAhQ2FsbGVyUEFMLmlzRW1wdHkoKSkKKyAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSBtb3JlIGFyZ3VtZW50cyB0aGFuIHRoZSBuZXcgZnVuY3Rpb24gdHlwZSwgYnV0IHdlCisgICAgLy8gd29uJ3QgYmUgZHJvcHBpbmcgdGhlbS4gIENoZWNrIHRoYXQgdGhlc2UgZXh0cmEgYXJndW1lbnRzIGhhdmUgYXR0cmlidXRlcworICAgIC8vIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBiZWluZyBhIHZhcmFyZyBjYWxsIGFyZ3VtZW50LgorICAgIGZvciAodW5zaWduZWQgaSA9IENhbGxlclBBTC5nZXROdW1TbG90cygpOyBpOyAtLWkpIHsKKyAgICAgIGlmIChDYWxsZXJQQUwuZ2V0U2xvdChpIC0gMSkuSW5kZXggPD0gRlQtPmdldE51bVBhcmFtcygpKQorICAgICAgICBicmVhazsKKyAgICAgIEF0dHJpYnV0ZXMgUEF0dHJzID0gQ2FsbGVyUEFMLmdldFNsb3QoaSAtIDEpLkF0dHJzOworICAgICAgaWYgKFBBdHRycyAmIEF0dHJpYnV0ZTo6VmFyQXJnc0luY29tcGF0aWJsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvLyBPa2F5LCB3ZSBkZWNpZGVkIHRoYXQgdGhpcyBpcyBhIHNhZmUgdGhpbmcgdG8gZG86IGdvIGFoZWFkIGFuZCBzdGFydAorICAvLyBpbnNlcnRpbmcgY2FzdCBpbnN0cnVjdGlvbnMgYXMgbmVjZXNzYXJ5Li4uCisgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJnczsKKyAgQXJncy5yZXNlcnZlKE51bUFjdHVhbEFyZ3MpOworICBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVXaXRoSW5kZXgsIDg+IGF0dHJWZWM7CisgIGF0dHJWZWMucmVzZXJ2ZShOdW1Db21tb25BcmdzKTsKKworICAvLyBHZXQgYW55IHJldHVybiBhdHRyaWJ1dGVzLgorICBBdHRyaWJ1dGVzIFJBdHRycyA9IENhbGxlclBBTC5nZXRSZXRBdHRyaWJ1dGVzKCk7CisKKyAgLy8gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgYmVpbmcgdXNlZCwgdGhlIHR5cGUgbWF5IG5vdCBiZSBjb21wYXRpYmxlCisgIC8vIHdpdGggdGhlIGV4aXN0aW5nIGF0dHJpYnV0ZXMuICBXaXBlIG91dCBhbnkgcHJvYmxlbWF0aWMgYXR0cmlidXRlcy4KKyAgUkF0dHJzICY9IH5BdHRyaWJ1dGU6OnR5cGVJbmNvbXBhdGlibGUoTmV3UmV0VHkpOworCisgIC8vIEFkZCB0aGUgbmV3IHJldHVybiBhdHRyaWJ1dGVzLgorICBpZiAoUkF0dHJzKQorICAgIGF0dHJWZWMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KDAsIFJBdHRycykpOworCisgIEFJID0gQ1MuYXJnX2JlZ2luKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtQ29tbW9uQXJnczsgKytpLCArK0FJKSB7CisgICAgY29uc3QgVHlwZSAqUGFyYW1UeSA9IEZULT5nZXRQYXJhbVR5cGUoaSk7CisgICAgaWYgKCgqQUkpLT5nZXRUeXBlKCkgPT0gUGFyYW1UeSkgeworICAgICAgQXJncy5wdXNoX2JhY2soKkFJKTsKKyAgICB9IGVsc2UgeworICAgICAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgb3Bjb2RlID0gQ2FzdEluc3Q6OmdldENhc3RPcGNvZGUoKkFJLAorICAgICAgICAgIGZhbHNlLCBQYXJhbVR5LCBmYWxzZSk7CisgICAgICBBcmdzLnB1c2hfYmFjayhCdWlsZGVyLT5DcmVhdGVDYXN0KG9wY29kZSwgKkFJLCBQYXJhbVR5KSk7CisgICAgfQorCisgICAgLy8gQWRkIGFueSBwYXJhbWV0ZXIgYXR0cmlidXRlcy4KKyAgICBpZiAoQXR0cmlidXRlcyBQQXR0cnMgPSBDYWxsZXJQQUwuZ2V0UGFyYW1BdHRyaWJ1dGVzKGkgKyAxKSkKKyAgICAgIGF0dHJWZWMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KGkgKyAxLCBQQXR0cnMpKTsKKyAgfQorCisgIC8vIElmIHRoZSBmdW5jdGlvbiB0YWtlcyBtb3JlIGFyZ3VtZW50cyB0aGFuIHRoZSBjYWxsIHdhcyB0YWtpbmcsIGFkZCB0aGVtCisgIC8vIG5vdy4KKyAgZm9yICh1bnNpZ25lZCBpID0gTnVtQ29tbW9uQXJnczsgaSAhPSBGVC0+Z2V0TnVtUGFyYW1zKCk7ICsraSkKKyAgICBBcmdzLnB1c2hfYmFjayhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEZULT5nZXRQYXJhbVR5cGUoaSkpKTsKKworICAvLyBJZiB3ZSBhcmUgcmVtb3ZpbmcgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbiwgZW1pdCBhbiBvYm5veGlvdXMgd2FybmluZy4KKyAgaWYgKEZULT5nZXROdW1QYXJhbXMoKSA8IE51bUFjdHVhbEFyZ3MpIHsKKyAgICBpZiAoIUZULT5pc1ZhckFyZygpKSB7CisgICAgICBlcnJzKCkgPDwgIldBUk5JTkc6IFdoaWxlIHJlc29sdmluZyBjYWxsIHRvIGZ1bmN0aW9uICciCisgICAgICAgICAgICAgPDwgQ2FsbGVlLT5nZXROYW1lKCkgPDwgIicgYXJndW1lbnRzIHdlcmUgZHJvcHBlZCFcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEFkZCBhbGwgb2YgdGhlIGFyZ3VtZW50cyBpbiB0aGVpciBwcm9tb3RlZCBmb3JtIHRvIHRoZSBhcmcgbGlzdC4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IEZULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBOdW1BY3R1YWxBcmdzOyArK2ksICsrQUkpIHsKKyAgICAgICAgY29uc3QgVHlwZSAqUFR5ID0gZ2V0UHJvbW90ZWRUeXBlKCgqQUkpLT5nZXRUeXBlKCkpOworICAgICAgICBpZiAoUFR5ICE9ICgqQUkpLT5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAvLyBNdXN0IHByb21vdGUgdG8gcGFzcyB0aHJvdWdoIHZhX2FyZyBhcmVhIQorICAgICAgICAgIEluc3RydWN0aW9uOjpDYXN0T3BzIG9wY29kZSA9CisgICAgICAgICAgICBDYXN0SW5zdDo6Z2V0Q2FzdE9wY29kZSgqQUksIGZhbHNlLCBQVHksIGZhbHNlKTsKKyAgICAgICAgICBBcmdzLnB1c2hfYmFjayhCdWlsZGVyLT5DcmVhdGVDYXN0KG9wY29kZSwgKkFJLCBQVHkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBcmdzLnB1c2hfYmFjaygqQUkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIGFueSBwYXJhbWV0ZXIgYXR0cmlidXRlcy4KKyAgICAgICAgaWYgKEF0dHJpYnV0ZXMgUEF0dHJzID0gQ2FsbGVyUEFMLmdldFBhcmFtQXR0cmlidXRlcyhpICsgMSkpCisgICAgICAgICAgYXR0clZlYy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoaSArIDEsIFBBdHRycykpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChBdHRyaWJ1dGVzIEZuQXR0cnMgPSAgQ2FsbGVyUEFMLmdldEZuQXR0cmlidXRlcygpKQorICAgIGF0dHJWZWMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KH4wLCBGbkF0dHJzKSk7CisKKyAgaWYgKE5ld1JldFR5LT5pc1ZvaWRUeSgpKQorICAgIENhbGxlci0+c2V0TmFtZSgiIik7ICAgLy8gVm9pZCB0eXBlIHNob3VsZCBub3QgaGF2ZSBhIG5hbWUuCisKKyAgY29uc3QgQXR0ckxpc3RQdHIgJk5ld0NhbGxlclBBTCA9IEF0dHJMaXN0UHRyOjpnZXQoYXR0clZlYy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmVjLmVuZCgpKTsKKworICBJbnN0cnVjdGlvbiAqTkMgPSBDYWxsSW5zdDo6Q3JlYXRlKENhbGxlZSwgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsZXItPmdldE5hbWUoKSwgQ2FsbGVyKTsKKyAgQ2FsbEluc3QgKkNJID0gY2FzdDxDYWxsSW5zdD4oQ2FsbGVyKTsKKyAgaWYgKENJLT5pc1RhaWxDYWxsKCkpCisgICAgY2FzdDxDYWxsSW5zdD4oTkMpLT5zZXRUYWlsQ2FsbCgpOworICBjYXN0PENhbGxJbnN0PihOQyktPnNldENhbGxpbmdDb252KENJLT5nZXRDYWxsaW5nQ29udigpKTsKKyAgY2FzdDxDYWxsSW5zdD4oTkMpLT5zZXRBdHRyaWJ1dGVzKE5ld0NhbGxlclBBTCk7CisKKyAgLy8gSW5zZXJ0IGEgY2FzdCBvZiB0aGUgcmV0dXJuIHR5cGUgYXMgbmVjZXNzYXJ5LgorICBWYWx1ZSAqTlYgPSBOQzsKKyAgaWYgKE9sZFJldFR5ICE9IE5WLT5nZXRUeXBlKCkgJiYgIUNhbGxlci0+dXNlX2VtcHR5KCkpIHsKKyAgICBpZiAoIU5WLT5nZXRUeXBlKCktPmlzVm9pZFR5KCkpIHsKKyAgICAgIEluc3RydWN0aW9uOjpDYXN0T3BzIG9wY29kZSA9IENhc3RJbnN0OjpnZXRDYXN0T3Bjb2RlKE5DLCBmYWxzZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGRSZXRUeSwgZmFsc2UpOworICAgICAgTlYgPSBOQyA9IENhc3RJbnN0OjpDcmVhdGUob3Bjb2RlLCBOQywgT2xkUmV0VHkpOworCisgICAgICBJbnNlcnROZXdJbnN0QmVmb3JlKE5DLCAqQ2FsbGVyKTsKKyAgICAgIFdvcmtsaXN0LkFkZFVzZXJzVG9Xb3JrTGlzdCgqQ2FsbGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgTlYgPSBVbmRlZlZhbHVlOjpnZXQoQ2FsbGVyLT5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCisKKyAgaWYgKCFDYWxsZXItPnVzZV9lbXB0eSgpKQorICAgIENhbGxlci0+cmVwbGFjZUFsbFVzZXNXaXRoKE5WKTsKKyAgCisgIEVyYXNlSW5zdEZyb21GdW5jdGlvbigqQ2FsbGVyKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHRyYW5zZm9ybUNhbGxUaHJvdWdoVHJhbXBvbGluZSAtIFR1cm4gYSBjYWxsIHRvIGEgZnVuY3Rpb24gY3JlYXRlZCBieSB0aGUKKy8vIGluaXRfdHJhbXBvbGluZSBpbnRyaW5zaWMgaW50byBhIGRpcmVjdCBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uLgorLy8KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnRyYW5zZm9ybUNhbGxUaHJvdWdoVHJhbXBvbGluZShDYWxsU2l0ZSBDUykgeworICBWYWx1ZSAqQ2FsbGVlID0gQ1MuZ2V0Q2FsbGVkVmFsdWUoKTsKKyAgY29uc3QgUG9pbnRlclR5cGUgKlBUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KENhbGxlZS0+Z2V0VHlwZSgpKTsKKyAgY29uc3QgRnVuY3Rpb25UeXBlICpGVHkgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oUFR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgY29uc3QgQXR0ckxpc3RQdHIgJkF0dHJzID0gQ1MuZ2V0QXR0cmlidXRlcygpOworCisgIC8vIElmIHRoZSBjYWxsIGFscmVhZHkgaGFzIHRoZSAnbmVzdCcgYXR0cmlidXRlIHNvbWV3aGVyZSB0aGVuIGdpdmUgdXAgLQorICAvLyBvdGhlcndpc2UgJ25lc3QnIHdvdWxkIG9jY3VyIHR3aWNlIGFmdGVyIHNwbGljaW5nIGluIHRoZSBjaGFpbi4KKyAgaWYgKEF0dHJzLmhhc0F0dHJTb21ld2hlcmUoQXR0cmlidXRlOjpOZXN0KSkKKyAgICByZXR1cm4gMDsKKworICBJbnRyaW5zaWNJbnN0ICpUcmFtcCA9CisgICAgY2FzdDxJbnRyaW5zaWNJbnN0PihjYXN0PEJpdENhc3RJbnN0PihDYWxsZWUpLT5nZXRPcGVyYW5kKDApKTsKKworICBGdW5jdGlvbiAqTmVzdEYgPWNhc3Q8RnVuY3Rpb24+KFRyYW1wLT5nZXRBcmdPcGVyYW5kKDEpLT5zdHJpcFBvaW50ZXJDYXN0cygpKTsKKyAgY29uc3QgUG9pbnRlclR5cGUgKk5lc3RGUFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oTmVzdEYtPmdldFR5cGUoKSk7CisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqTmVzdEZUeSA9IGNhc3Q8RnVuY3Rpb25UeXBlPihOZXN0RlBUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisKKyAgY29uc3QgQXR0ckxpc3RQdHIgJk5lc3RBdHRycyA9IE5lc3RGLT5nZXRBdHRyaWJ1dGVzKCk7CisgIGlmICghTmVzdEF0dHJzLmlzRW1wdHkoKSkgeworICAgIHVuc2lnbmVkIE5lc3RJZHggPSAxOworICAgIGNvbnN0IFR5cGUgKk5lc3RUeSA9IDA7CisgICAgQXR0cmlidXRlcyBOZXN0QXR0ciA9IEF0dHJpYnV0ZTo6Tm9uZTsKKworICAgIC8vIExvb2sgZm9yIGEgcGFyYW1ldGVyIG1hcmtlZCB3aXRoIHRoZSAnbmVzdCcgYXR0cmlidXRlLgorICAgIGZvciAoRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBJID0gTmVzdEZUeS0+cGFyYW1fYmVnaW4oKSwKKyAgICAgICAgIEUgPSBOZXN0RlR5LT5wYXJhbV9lbmQoKTsgSSAhPSBFOyArK05lc3RJZHgsICsrSSkKKyAgICAgIGlmIChOZXN0QXR0cnMucGFyYW1IYXNBdHRyKE5lc3RJZHgsIEF0dHJpYnV0ZTo6TmVzdCkpIHsKKyAgICAgICAgLy8gUmVjb3JkIHRoZSBwYXJhbWV0ZXIgdHlwZSBhbmQgYW55IG90aGVyIGF0dHJpYnV0ZXMuCisgICAgICAgIE5lc3RUeSA9ICpJOworICAgICAgICBOZXN0QXR0ciA9IE5lc3RBdHRycy5nZXRQYXJhbUF0dHJpYnV0ZXMoTmVzdElkeCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgaWYgKE5lc3RUeSkgeworICAgICAgSW5zdHJ1Y3Rpb24gKkNhbGxlciA9IENTLmdldEluc3RydWN0aW9uKCk7CisgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IE5ld0FyZ3M7CisgICAgICBOZXdBcmdzLnJlc2VydmUodW5zaWduZWQoQ1MuYXJnX2VuZCgpLUNTLmFyZ19iZWdpbigpKSsxKTsKKworICAgICAgU21hbGxWZWN0b3I8QXR0cmlidXRlV2l0aEluZGV4LCA4PiBOZXdBdHRyczsKKyAgICAgIE5ld0F0dHJzLnJlc2VydmUoQXR0cnMuZ2V0TnVtU2xvdHMoKSArIDEpOworCisgICAgICAvLyBJbnNlcnQgdGhlIG5lc3QgYXJndW1lbnQgaW50byB0aGUgY2FsbCBhcmd1bWVudCBsaXN0LCB3aGljaCBtYXkKKyAgICAgIC8vIG1lYW4gYXBwZW5kaW5nIGl0LiAgTGlrZXdpc2UgZm9yIGF0dHJpYnV0ZXMuCisKKyAgICAgIC8vIEFkZCBhbnkgcmVzdWx0IGF0dHJpYnV0ZXMuCisgICAgICBpZiAoQXR0cmlidXRlcyBBdHRyID0gQXR0cnMuZ2V0UmV0QXR0cmlidXRlcygpKQorICAgICAgICBOZXdBdHRycy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoMCwgQXR0cikpOworCisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIElkeCA9IDE7CisgICAgICAgIENhbGxTaXRlOjphcmdfaXRlcmF0b3IgSSA9IENTLmFyZ19iZWdpbigpLCBFID0gQ1MuYXJnX2VuZCgpOworICAgICAgICBkbyB7CisgICAgICAgICAgaWYgKElkeCA9PSBOZXN0SWR4KSB7CisgICAgICAgICAgICAvLyBBZGQgdGhlIGNoYWluIGFyZ3VtZW50IGFuZCBhdHRyaWJ1dGVzLgorICAgICAgICAgICAgVmFsdWUgKk5lc3RWYWwgPSBUcmFtcC0+Z2V0QXJnT3BlcmFuZCgyKTsKKyAgICAgICAgICAgIGlmIChOZXN0VmFsLT5nZXRUeXBlKCkgIT0gTmVzdFR5KQorICAgICAgICAgICAgICBOZXN0VmFsID0gbmV3IEJpdENhc3RJbnN0KE5lc3RWYWwsIE5lc3RUeSwgQ2FsbGVyKTsKKyAgICAgICAgICAgIE5ld0FyZ3MucHVzaF9iYWNrKE5lc3RWYWwpOworICAgICAgICAgICAgTmV3QXR0cnMucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KE5lc3RJZHgsIE5lc3RBdHRyKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKEkgPT0gRSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgLy8gQWRkIHRoZSBvcmlnaW5hbCBhcmd1bWVudCBhbmQgYXR0cmlidXRlcy4KKyAgICAgICAgICBOZXdBcmdzLnB1c2hfYmFjaygqSSk7CisgICAgICAgICAgaWYgKEF0dHJpYnV0ZXMgQXR0ciA9IEF0dHJzLmdldFBhcmFtQXR0cmlidXRlcyhJZHgpKQorICAgICAgICAgICAgTmV3QXR0cnMucHVzaF9iYWNrCisgICAgICAgICAgICAgIChBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldChJZHggKyAoSWR4ID49IE5lc3RJZHgpLCBBdHRyKSk7CisKKyAgICAgICAgICArK0lkeCwgKytJOworICAgICAgICB9IHdoaWxlICgxKTsKKyAgICAgIH0KKworICAgICAgLy8gQWRkIGFueSBmdW5jdGlvbiBhdHRyaWJ1dGVzLgorICAgICAgaWYgKEF0dHJpYnV0ZXMgQXR0ciA9IEF0dHJzLmdldEZuQXR0cmlidXRlcygpKQorICAgICAgICBOZXdBdHRycy5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQofjAsIEF0dHIpKTsKKworICAgICAgLy8gVGhlIHRyYW1wb2xpbmUgbWF5IGhhdmUgYmVlbiBiaXRjYXN0IHRvIGEgYm9ndXMgdHlwZSAoRlR5KS4KKyAgICAgIC8vIEhhbmRsZSB0aGlzIGJ5IHN5bnRoZXNpemluZyBhIG5ldyBmdW5jdGlvbiB0eXBlLCBlcXVhbCB0byBGVHkKKyAgICAgIC8vIHdpdGggdGhlIGNoYWluIHBhcmFtZXRlciBpbnNlcnRlZC4KKworICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IE5ld1R5cGVzOworICAgICAgTmV3VHlwZXMucmVzZXJ2ZShGVHktPmdldE51bVBhcmFtcygpKzEpOworCisgICAgICAvLyBJbnNlcnQgdGhlIGNoYWluJ3MgdHlwZSBpbnRvIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlcywgd2hpY2ggbWF5CisgICAgICAvLyBtZWFuIGFwcGVuZGluZyBpdC4KKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgSWR4ID0gMTsKKyAgICAgICAgRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBJID0gRlR5LT5wYXJhbV9iZWdpbigpLAorICAgICAgICAgIEUgPSBGVHktPnBhcmFtX2VuZCgpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAoSWR4ID09IE5lc3RJZHgpCisgICAgICAgICAgICAvLyBBZGQgdGhlIGNoYWluJ3MgdHlwZS4KKyAgICAgICAgICAgIE5ld1R5cGVzLnB1c2hfYmFjayhOZXN0VHkpOworCisgICAgICAgICAgaWYgKEkgPT0gRSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgLy8gQWRkIHRoZSBvcmlnaW5hbCB0eXBlLgorICAgICAgICAgIE5ld1R5cGVzLnB1c2hfYmFjaygqSSk7CisKKyAgICAgICAgICArK0lkeCwgKytJOworICAgICAgICB9IHdoaWxlICgxKTsKKyAgICAgIH0KKworICAgICAgLy8gUmVwbGFjZSB0aGUgdHJhbXBvbGluZSBjYWxsIHdpdGggYSBkaXJlY3QgY2FsbC4gIExldCB0aGUgZ2VuZXJpYworICAgICAgLy8gY29kZSBzb3J0IG91dCBhbnkgZnVuY3Rpb24gdHlwZSBtaXNtYXRjaGVzLgorICAgICAgRnVuY3Rpb25UeXBlICpOZXdGVHkgPSBGdW5jdGlvblR5cGU6OmdldChGVHktPmdldFJldHVyblR5cGUoKSwgTmV3VHlwZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlR5LT5pc1ZhckFyZygpKTsKKyAgICAgIENvbnN0YW50ICpOZXdDYWxsZWUgPQorICAgICAgICBOZXN0Ri0+Z2V0VHlwZSgpID09IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoTmV3RlR5KSA/CisgICAgICAgIE5lc3RGIDogQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KE5lc3RGLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChOZXdGVHkpKTsKKyAgICAgIGNvbnN0IEF0dHJMaXN0UHRyICZOZXdQQUwgPSBBdHRyTGlzdFB0cjo6Z2V0KE5ld0F0dHJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdBdHRycy5lbmQoKSk7CisKKyAgICAgIEluc3RydWN0aW9uICpOZXdDYWxsZXIgPSBDYWxsSW5zdDo6Q3JlYXRlKE5ld0NhbGxlZSwgTmV3QXJncy5iZWdpbigpLCBOZXdBcmdzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxlci0+Z2V0TmFtZSgpLCBDYWxsZXIpOworICAgICAgaWYgKGNhc3Q8Q2FsbEluc3Q+KENhbGxlciktPmlzVGFpbENhbGwoKSkKKyAgICAgICAgY2FzdDxDYWxsSW5zdD4oTmV3Q2FsbGVyKS0+c2V0VGFpbENhbGwoKTsKKyAgICAgIGNhc3Q8Q2FsbEluc3Q+KE5ld0NhbGxlciktPgorICAgICAgICBzZXRDYWxsaW5nQ29udihjYXN0PENhbGxJbnN0PihDYWxsZXIpLT5nZXRDYWxsaW5nQ29udigpKTsKKyAgICAgIGNhc3Q8Q2FsbEluc3Q+KE5ld0NhbGxlciktPnNldEF0dHJpYnV0ZXMoTmV3UEFMKTsKKyAgICAgIAorCSAgaWYgKCFDYWxsZXItPmdldFR5cGUoKS0+aXNWb2lkVHkoKSkKKyAgICAgICAgQ2FsbGVyLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3Q2FsbGVyKTsKKyAgICAgIENhbGxlci0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBXb3JrbGlzdC5SZW1vdmUoQ2FsbGVyKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIC8vIFJlcGxhY2UgdGhlIHRyYW1wb2xpbmUgY2FsbCB3aXRoIGEgZGlyZWN0IGNhbGwuICBTaW5jZSB0aGVyZSBpcyBubyAnbmVzdCcKKyAgLy8gcGFyYW1ldGVyLCB0aGVyZSBpcyBubyBuZWVkIHRvIGFkanVzdCB0aGUgYXJndW1lbnQgbGlzdC4gIExldCB0aGUgZ2VuZXJpYworICAvLyBjb2RlIHNvcnQgb3V0IGFueSBmdW5jdGlvbiB0eXBlIG1pc21hdGNoZXMuCisgIENvbnN0YW50ICpOZXdDYWxsZWUgPQorICAgIE5lc3RGLT5nZXRUeXBlKCkgPT0gUFR5ID8gTmVzdEYgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChOZXN0RiwgUFR5KTsKKyAgQ1Muc2V0Q2FsbGVkRnVuY3Rpb24oTmV3Q2FsbGVlKTsKKyAgcmV0dXJuIENTLmdldEluc3RydWN0aW9uKCk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lQ2FzdHMuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVDYXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzZmQyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lQ2FzdHMuY3BwCkBAIC0wLDAgKzEsMTQ0MCBAQAorLy89PT0tIEluc3RDb21iaW5lQ2FzdHMuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdmlzaXQgZnVuY3Rpb25zIGZvciBjYXN0IG9wZXJhdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkluc3RDb21iaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXR0ZXJuTWF0Y2guaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIFBhdHRlcm5NYXRjaDsKKworLy8vIERlY29tcG9zZVNpbXBsZUxpbmVhckV4cHIgLSBBbmFseXplICdWYWwnLCBzZWVpbmcgaWYgaXQgaXMgYSBzaW1wbGUgbGluZWFyCisvLy8gZXhwcmVzc2lvbi4gIElmIHNvLCBkZWNvbXBvc2UgaXQsIHJldHVybmluZyBzb21lIHZhbHVlIFgsIHN1Y2ggdGhhdCBWYWwgaXMKKy8vLyBYKlNjYWxlK09mZnNldC4KKy8vLworc3RhdGljIFZhbHVlICpEZWNvbXBvc2VTaW1wbGVMaW5lYXJFeHByKFZhbHVlICpWYWwsIHVuc2lnbmVkICZTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmT2Zmc2V0KSB7CisgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVmFsKSkgeworICAgIE9mZnNldCA9IENJLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBTY2FsZSAgPSAwOworICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFZhbC0+Z2V0VHlwZSgpLCAwKTsKKyAgfQorICAKKyAgaWYgKEJpbmFyeU9wZXJhdG9yICpJID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KFZhbCkpIHsKKyAgICBpZiAoQ29uc3RhbnRJbnQgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgaWYgKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGwpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIHZhbHVlIHNjYWxlZCBieSAnMSA8PCB0aGUgc2hpZnQgYW10Jy4KKyAgICAgICAgU2NhbGUgPSBVSU5UNjRfQygxKSA8PCBSSFMtPmdldFpFeHRWYWx1ZSgpOworICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpNdWwpIHsKKyAgICAgICAgLy8gVGhpcyB2YWx1ZSBpcyBzY2FsZWQgYnkgJ1JIUycuCisgICAgICAgIFNjYWxlID0gUkhTLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgcmV0dXJuIEktPmdldE9wZXJhbmQoMCk7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWRkKSB7CisgICAgICAgIC8vIFdlIGhhdmUgWCtDLiAgQ2hlY2sgdG8gc2VlIGlmIHdlIHJlYWxseSBoYXZlIChYKkMyKStDMSwgCisgICAgICAgIC8vIHdoZXJlIEMxIGlzIGRpdmlzaWJsZSBieSBDMi4KKyAgICAgICAgdW5zaWduZWQgU3ViU2NhbGU7CisgICAgICAgIFZhbHVlICpTdWJWYWwgPSAKKyAgICAgICAgICBEZWNvbXBvc2VTaW1wbGVMaW5lYXJFeHByKEktPmdldE9wZXJhbmQoMCksIFN1YlNjYWxlLCBPZmZzZXQpOworICAgICAgICBPZmZzZXQgKz0gUkhTLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgU2NhbGUgPSBTdWJTY2FsZTsKKyAgICAgICAgcmV0dXJuIFN1YlZhbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBPdGhlcndpc2UsIHdlIGNhbid0IGxvb2sgcGFzdCB0aGlzLgorICBTY2FsZSA9IDE7CisgIE9mZnNldCA9IDA7CisgIHJldHVybiBWYWw7Cit9CisKKy8vLyBQcm9tb3RlQ2FzdE9mQWxsb2NhdGlvbiAtIElmIHdlIGZpbmQgYSBjYXN0IG9mIGFuIGFsbG9jYXRpb24gaW5zdHJ1Y3Rpb24sCisvLy8gdHJ5IHRvIGVsaW1pbmF0ZSB0aGUgY2FzdCBieSBtb3ZpbmcgdGhlIHR5cGUgaW5mb3JtYXRpb24gaW50byB0aGUgYWxsb2MuCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjpQcm9tb3RlQ2FzdE9mQWxsb2NhdGlvbihCaXRDYXN0SW5zdCAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2FJbnN0ICZBSSkgeworICAvLyBUaGlzIHJlcXVpcmVzIFRhcmdldERhdGEgdG8gZ2V0IHRoZSBhbGxvY2EgYWxpZ25tZW50IGFuZCBzaXplIGluZm9ybWF0aW9uLgorICBpZiAoIVREKSByZXR1cm4gMDsKKworICBjb25zdCBQb2ludGVyVHlwZSAqUFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oQ0kuZ2V0VHlwZSgpKTsKKyAgCisgIEJ1aWxkZXJUeSBBbGxvY2FCdWlsZGVyKCpCdWlsZGVyKTsKKyAgQWxsb2NhQnVpbGRlci5TZXRJbnNlcnRQb2ludChBSS5nZXRQYXJlbnQoKSwgJkFJKTsKKworICAvLyBHZXQgdGhlIHR5cGUgcmVhbGx5IGFsbG9jYXRlZCBhbmQgdGhlIHR5cGUgY2FzdGVkIHRvLgorICBjb25zdCBUeXBlICpBbGxvY0VsVHkgPSBBSS5nZXRBbGxvY2F0ZWRUeXBlKCk7CisgIGNvbnN0IFR5cGUgKkNhc3RFbFR5ID0gUFR5LT5nZXRFbGVtZW50VHlwZSgpOworICBpZiAoIUFsbG9jRWxUeS0+aXNTaXplZCgpIHx8ICFDYXN0RWxUeS0+aXNTaXplZCgpKSByZXR1cm4gMDsKKworICB1bnNpZ25lZCBBbGxvY0VsVHlBbGlnbiA9IFRELT5nZXRBQklUeXBlQWxpZ25tZW50KEFsbG9jRWxUeSk7CisgIHVuc2lnbmVkIENhc3RFbFR5QWxpZ24gPSBURC0+Z2V0QUJJVHlwZUFsaWdubWVudChDYXN0RWxUeSk7CisgIGlmIChDYXN0RWxUeUFsaWduIDwgQWxsb2NFbFR5QWxpZ24pIHJldHVybiAwOworCisgIC8vIElmIHRoZSBhbGxvY2F0aW9uIGhhcyBtdWx0aXBsZSB1c2VzLCBvbmx5IHByb21vdGUgaXQgaWYgd2UgYXJlIHN0cmljdGx5CisgIC8vIGluY3JlYXNpbmcgdGhlIGFsaWdubWVudCBvZiB0aGUgcmVzdWx0YW50IGFsbG9jYXRpb24uICBJZiB3ZSBrZWVwIGl0IHRoZQorICAvLyBzYW1lLCB3ZSBvcGVuIHRoZSBkb29yIHRvIGluZmluaXRlIGxvb3BzIG9mIHZhcmlvdXMga2luZHMuICAoQSByZWZlcmVuY2UKKyAgLy8gZnJvbSBhIGRiZy5kZWNsYXJlIGRvZXNuJ3QgY291bnQgYXMgYSB1c2UgZm9yIHRoaXMgcHVycG9zZS4pCisgIGlmICghQUkuaGFzT25lVXNlKCkgJiYKKyAgICAgIENhc3RFbFR5QWxpZ24gPT0gQWxsb2NFbFR5QWxpZ24pIHJldHVybiAwOworCisgIHVpbnQ2NF90IEFsbG9jRWxUeVNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShBbGxvY0VsVHkpOworICB1aW50NjRfdCBDYXN0RWxUeVNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShDYXN0RWxUeSk7CisgIGlmIChDYXN0RWxUeVNpemUgPT0gMCB8fCBBbGxvY0VsVHlTaXplID09IDApIHJldHVybiAwOworCisgIC8vIFNlZSBpZiB3ZSBjYW4gc2F0aXNmeSB0aGUgbW9kdWx1cyBieSBwdWxsaW5nIGEgc2NhbGUgb3V0IG9mIHRoZSBhcnJheQorICAvLyBzaXplIGFyZ3VtZW50LgorICB1bnNpZ25lZCBBcnJheVNpemVTY2FsZTsKKyAgdWludDY0X3QgQXJyYXlPZmZzZXQ7CisgIFZhbHVlICpOdW1FbGVtZW50cyA9IC8vIFNlZSBpZiB0aGUgYXJyYXkgc2l6ZSBpcyBhIGRlY29tcG9zYWJsZSBsaW5lYXIgZXhwci4KKyAgICBEZWNvbXBvc2VTaW1wbGVMaW5lYXJFeHByKEFJLmdldE9wZXJhbmQoMCksIEFycmF5U2l6ZVNjYWxlLCBBcnJheU9mZnNldCk7CisgCisgIC8vIElmIHdlIGNhbiBub3cgc2F0aXNmeSB0aGUgbW9kdWx1cywgYnkgdXNpbmcgYSBub24tMSBzY2FsZSwgd2UgcmVhbGx5IGNhbgorICAvLyBkbyB0aGUgeGZvcm0uCisgIGlmICgoQWxsb2NFbFR5U2l6ZSpBcnJheVNpemVTY2FsZSkgJSBDYXN0RWxUeVNpemUgIT0gMCB8fAorICAgICAgKEFsbG9jRWxUeVNpemUqQXJyYXlPZmZzZXQgICApICUgQ2FzdEVsVHlTaXplICE9IDApIHJldHVybiAwOworCisgIHVuc2lnbmVkIFNjYWxlID0gKEFsbG9jRWxUeVNpemUqQXJyYXlTaXplU2NhbGUpL0Nhc3RFbFR5U2l6ZTsKKyAgVmFsdWUgKkFtdCA9IDA7CisgIGlmIChTY2FsZSA9PSAxKSB7CisgICAgQW10ID0gTnVtRWxlbWVudHM7CisgIH0gZWxzZSB7CisgICAgQW10ID0gQ29uc3RhbnRJbnQ6OmdldChBSS5nZXRBcnJheVNpemUoKS0+Z2V0VHlwZSgpLCBTY2FsZSk7CisgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgYWxsb2NhLCBub3QgYmVmb3JlIHRoZSBjYXN0LgorICAgIEFtdCA9IEFsbG9jYUJ1aWxkZXIuQ3JlYXRlTXVsKEFtdCwgTnVtRWxlbWVudHMpOworICB9CisgIAorICBpZiAodWludDY0X3QgT2Zmc2V0ID0gKEFsbG9jRWxUeVNpemUqQXJyYXlPZmZzZXQpL0Nhc3RFbFR5U2l6ZSkgeworICAgIFZhbHVlICpPZmYgPSBDb25zdGFudEludDo6Z2V0KEFJLmdldEFycmF5U2l6ZSgpLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LCB0cnVlKTsKKyAgICBBbXQgPSBBbGxvY2FCdWlsZGVyLkNyZWF0ZUFkZChBbXQsIE9mZik7CisgIH0KKyAgCisgIEFsbG9jYUluc3QgKk5ldyA9IEFsbG9jYUJ1aWxkZXIuQ3JlYXRlQWxsb2NhKENhc3RFbFR5LCBBbXQpOworICBOZXctPnNldEFsaWdubWVudChBSS5nZXRBbGlnbm1lbnQoKSk7CisgIE5ldy0+dGFrZU5hbWUoJkFJKTsKKyAgCisgIC8vIElmIHRoZSBhbGxvY2F0aW9uIGhhcyBtdWx0aXBsZSByZWFsIHVzZXMsIGluc2VydCBhIGNhc3QgYW5kIGNoYW5nZSBhbGwKKyAgLy8gdGhpbmdzIHRoYXQgdXNlZCBpdCB0byB1c2UgdGhlIG5ldyBjYXN0LiAgVGhpcyB3aWxsIGFsc28gaGFjayBvbiBDSSwgYnV0IGl0CisgIC8vIHdpbGwgZGllIHNvb24uCisgIGlmICghQUkuaGFzT25lVXNlKCkpIHsKKyAgICAvLyBOZXcgaXMgdGhlIGFsbG9jYXRpb24gaW5zdHJ1Y3Rpb24sIHBvaW50ZXIgdHlwZWQuIEFJIGlzIHRoZSBvcmlnaW5hbAorICAgIC8vIGFsbG9jYXRpb24gaW5zdHJ1Y3Rpb24sIGFsc28gcG9pbnRlciB0eXBlZC4gVGh1cywgY2FzdCB0byB1c2UgaXMgQml0Q2FzdC4KKyAgICBWYWx1ZSAqTmV3Q2FzdCA9IEFsbG9jYUJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChOZXcsIEFJLmdldFR5cGUoKSk7CisgICAgQUkucmVwbGFjZUFsbFVzZXNXaXRoKE5ld0Nhc3QpOworICB9CisgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBOZXcpOworfQorCisKKworLy8vIEV2YWx1YXRlSW5EaWZmZXJlbnRUeXBlIC0gR2l2ZW4gYW4gZXhwcmVzc2lvbiB0aGF0IAorLy8vIENhbkV2YWx1YXRlVHJ1bmNhdGVkIG9yIENhbkV2YWx1YXRlU0V4dGQgcmV0dXJucyB0cnVlIGZvciwgYWN0dWFsbHkKKy8vLyBpbnNlcnQgdGhlIGNvZGUgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24uCitWYWx1ZSAqSW5zdENvbWJpbmVyOjpFdmFsdWF0ZUluRGlmZmVyZW50VHlwZShWYWx1ZSAqViwgY29uc3QgVHlwZSAqVHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCkgeworICBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpIHsKKyAgICBDID0gQ29uc3RhbnRFeHByOjpnZXRJbnRlZ2VyQ2FzdChDLCBUeSwgaXNTaWduZWQgLypTZXh0IG9yIFpFeHQqLyk7CisgICAgLy8gSWYgd2UgZ290IGEgY29uc3RhbnRleHByIGJhY2ssIHRyeSB0byBzaW1wbGlmeSBpdCB3aXRoIFREIGluZm8uCisgICAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KEMpKQorICAgICAgQyA9IENvbnN0YW50Rm9sZENvbnN0YW50RXhwcmVzc2lvbihDRSwgVEQpOworICAgIHJldHVybiBDOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBpdCBtdXN0IGJlIGFuIGluc3RydWN0aW9uLgorICBJbnN0cnVjdGlvbiAqSSA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpOworICBJbnN0cnVjdGlvbiAqUmVzID0gMDsKKyAgdW5zaWduZWQgT3BjID0gSS0+Z2V0T3Bjb2RlKCk7CisgIHN3aXRjaCAoT3BjKSB7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOiB7CisgICAgVmFsdWUgKkxIUyA9IEV2YWx1YXRlSW5EaWZmZXJlbnRUeXBlKEktPmdldE9wZXJhbmQoMCksIFR5LCBpc1NpZ25lZCk7CisgICAgVmFsdWUgKlJIUyA9IEV2YWx1YXRlSW5EaWZmZXJlbnRUeXBlKEktPmdldE9wZXJhbmQoMSksIFR5LCBpc1NpZ25lZCk7CisgICAgUmVzID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZSgoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcylPcGMsIExIUywgUkhTKTsKKyAgICBicmVhazsKKyAgfSAgICAKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlpFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6CisgICAgLy8gSWYgdGhlIHNvdXJjZSB0eXBlIG9mIHRoZSBjYXN0IGlzIHRoZSB0eXBlIHdlJ3JlIHRyeWluZyBmb3IgdGhlbiB3ZSBjYW4KKyAgICAvLyBqdXN0IHJldHVybiB0aGUgc291cmNlLiAgVGhlcmUncyBubyBuZWVkIHRvIGluc2VydCBpdCBiZWNhdXNlIGl0IGlzIG5vdAorICAgIC8vIG5ldy4KKyAgICBpZiAoSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IFR5KQorICAgICAgcmV0dXJuIEktPmdldE9wZXJhbmQoMCk7CisgICAgCisgICAgLy8gT3RoZXJ3aXNlLCBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgb2YgY2FzdCwgc28ganVzdCByZWluc2VydCBhIG5ldyBvbmUuCisgICAgLy8gVGhpcyBhbHNvIGhhbmRsZXMgdGhlIGNhc2Ugb2YgemV4dCh0cnVuYyh4KSkgLT4gemV4dCh4KS4KKyAgICBSZXMgPSBDYXN0SW5zdDo6Q3JlYXRlSW50ZWdlckNhc3QoSS0+Z2V0T3BlcmFuZCgwKSwgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wYyA9PSBJbnN0cnVjdGlvbjo6U0V4dCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNlbGVjdDogeworICAgIFZhbHVlICpUcnVlID0gRXZhbHVhdGVJbkRpZmZlcmVudFR5cGUoSS0+Z2V0T3BlcmFuZCgxKSwgVHksIGlzU2lnbmVkKTsKKyAgICBWYWx1ZSAqRmFsc2UgPSBFdmFsdWF0ZUluRGlmZmVyZW50VHlwZShJLT5nZXRPcGVyYW5kKDIpLCBUeSwgaXNTaWduZWQpOworICAgIFJlcyA9IFNlbGVjdEluc3Q6OkNyZWF0ZShJLT5nZXRPcGVyYW5kKDApLCBUcnVlLCBGYWxzZSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6UEhJOiB7CisgICAgUEhJTm9kZSAqT1BOID0gY2FzdDxQSElOb2RlPihJKTsKKyAgICBQSElOb2RlICpOUE4gPSBQSElOb2RlOjpDcmVhdGUoVHkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBWYWx1ZSAqViA9RXZhbHVhdGVJbkRpZmZlcmVudFR5cGUoT1BOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpLCBUeSwgaXNTaWduZWQpOworICAgICAgTlBOLT5hZGRJbmNvbWluZyhWLCBPUE4tPmdldEluY29taW5nQmxvY2soaSkpOworICAgIH0KKyAgICBSZXMgPSBOUE47CisgICAgYnJlYWs7CisgIH0KKyAgZGVmYXVsdDogCisgICAgLy8gVE9ETzogQ2FuIGhhbmRsZSBtb3JlIGNhc2VzIGhlcmUuCisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5yZWFjaGFibGUhIik7CisgICAgYnJlYWs7CisgIH0KKyAgCisgIFJlcy0+dGFrZU5hbWUoSSk7CisgIHJldHVybiBJbnNlcnROZXdJbnN0QmVmb3JlKFJlcywgKkkpOworfQorCisKKy8vLyBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgQ2FzdEluc3Q6OmlzRWxpbWluYWJsZUNhc3RQYWlyLiBJdAorLy8vIHNpbXBseSBleHRyYWN0cyBhcmd1bWVudHMgYW5kIHJldHVybnMgd2hhdCB0aGF0IGZ1bmN0aW9uIHJldHVybnMuCitzdGF0aWMgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgCitpc0VsaW1pbmFibGVDYXN0UGFpcigKKyAgY29uc3QgQ2FzdEluc3QgKkNJLCAvLy88IFRoZSBmaXJzdCBjYXN0IGluc3RydWN0aW9uCisgIHVuc2lnbmVkIG9wY29kZSwgICAgICAgLy8vPCBUaGUgb3Bjb2RlIG9mIHRoZSBzZWNvbmQgY2FzdCBpbnN0cnVjdGlvbgorICBjb25zdCBUeXBlICpEc3RUeSwgICAgIC8vLzwgVGhlIHRhcmdldCB0eXBlIGZvciB0aGUgc2Vjb25kIGNhc3QgaW5zdHJ1Y3Rpb24KKyAgVGFyZ2V0RGF0YSAqVEQgICAgICAgICAvLy88IFRoZSB0YXJnZXQgZGF0YSBmb3IgcG9pbnRlciBzaXplCispIHsKKworICBjb25zdCBUeXBlICpTcmNUeSA9IENJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7ICAgLy8gQSBmcm9tIGFib3ZlCisgIGNvbnN0IFR5cGUgKk1pZFR5ID0gQ0ktPmdldFR5cGUoKTsgICAgICAgICAgICAgICAgICAvLyBCIGZyb20gYWJvdmUKKworICAvLyBHZXQgdGhlIG9wY29kZXMgb2YgdGhlIHR3byBDYXN0IGluc3RydWN0aW9ucworICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBmaXJzdE9wID0gSW5zdHJ1Y3Rpb246OkNhc3RPcHMoQ0ktPmdldE9wY29kZSgpKTsKKyAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgc2Vjb25kT3AgPSBJbnN0cnVjdGlvbjo6Q2FzdE9wcyhvcGNvZGUpOworCisgIHVuc2lnbmVkIFJlcyA9IENhc3RJbnN0Ojppc0VsaW1pbmFibGVDYXN0UGFpcihmaXJzdE9wLCBzZWNvbmRPcCwgU3JjVHksIE1pZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEQgPyBURC0+Z2V0SW50UHRyVHlwZShDSS0+Z2V0Q29udGV4dCgpKSA6IDApOworICAKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBmb3JtIGFuIGludHRvcHRyIG9yIHB0cnRvaW50IHRoYXQgY29udmVydHMgdG8gYW4gaW50ZWdlcgorICAvLyB0eXBlIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBwb2ludGVyIHNpemUuCisgIGlmICgoUmVzID09IEluc3RydWN0aW9uOjpJbnRUb1B0ciAmJgorICAgICAgICAgICghVEQgfHwgU3JjVHkgIT0gVEQtPmdldEludFB0clR5cGUoQ0ktPmdldENvbnRleHQoKSkpKSB8fAorICAgICAgKFJlcyA9PSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQgJiYKKyAgICAgICAgICAoIVREIHx8IERzdFR5ICE9IFRELT5nZXRJbnRQdHJUeXBlKENJLT5nZXRDb250ZXh0KCkpKSkpCisgICAgUmVzID0gMDsKKyAgCisgIHJldHVybiBJbnN0cnVjdGlvbjo6Q2FzdE9wcyhSZXMpOworfQorCisvLy8gU2hvdWxkT3B0aW1pemVDYXN0IC0gUmV0dXJuIHRydWUgaWYgdGhlIGNhc3QgZnJvbSAiViB0byBUeSIgYWN0dWFsbHkKKy8vLyByZXN1bHRzIGluIGFueSBjb2RlIGJlaW5nIGdlbmVyYXRlZCBhbmQgaXMgaW50ZXJlc3RpbmcgdG8gb3B0aW1pemUgb3V0LiBJZgorLy8vIHRoZSBjYXN0IGNhbiBiZSBlbGltaW5hdGVkIGJ5IHNvbWUgb3RoZXIgc2ltcGxlIHRyYW5zZm9ybWF0aW9uLCB3ZSBwcmVmZXIKKy8vLyB0byBkbyB0aGUgc2ltcGxpZmljYXRpb24gZmlyc3QuCitib29sIEluc3RDb21iaW5lcjo6U2hvdWxkT3B0aW1pemVDYXN0KEluc3RydWN0aW9uOjpDYXN0T3BzIG9wYywgY29uc3QgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlR5KSB7CisgIC8vIE5vb3AgY2FzdHMgYW5kIGNhc3RzIG9mIGNvbnN0YW50cyBzaG91bGQgYmUgZWxpbWluYXRlZCB0cml2aWFsbHkuCisgIGlmIChWLT5nZXRUeXBlKCkgPT0gVHkgfHwgaXNhPENvbnN0YW50PihWKSkgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gSWYgdGhpcyBpcyBhbm90aGVyIGNhc3QgdGhhdCBjYW4gYmUgZWxpbWluYXRlZCwgd2UgcHJlZmVyIHRvIGhhdmUgaXQKKyAgLy8gZWxpbWluYXRlZC4KKyAgaWYgKGNvbnN0IENhc3RJbnN0ICpDSSA9IGR5bl9jYXN0PENhc3RJbnN0PihWKSkKKyAgICBpZiAoaXNFbGltaW5hYmxlQ2FzdFBhaXIoQ0ksIG9wYywgVHksIFREKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIElmIHRoaXMgaXMgYSB2ZWN0b3Igc2V4dCBmcm9tIGEgY29tcGFyZSwgdGhlbiB3ZSBkb24ndCB3YW50IHRvIGJyZWFrIHRoZQorICAvLyBpZGlvbSB3aGVyZSBlYWNoIGVsZW1lbnQgb2YgdGhlIGV4dGVuZGVkIHZlY3RvciBpcyBlaXRoZXIgemVybyBvciBhbGwgb25lcy4KKyAgaWYgKG9wYyA9PSBJbnN0cnVjdGlvbjo6U0V4dCAmJiBpc2E8Q21wSW5zdD4oVikgJiYgVHktPmlzVmVjdG9yVHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8gQGJyaWVmIEltcGxlbWVudCB0aGUgdHJhbnNmb3JtcyBjb21tb24gdG8gYWxsIENhc3RJbnN0IHZpc2l0b3JzLgorSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6Y29tbW9uQ2FzdFRyYW5zZm9ybXMoQ2FzdEluc3QgJkNJKSB7CisgIFZhbHVlICpTcmMgPSBDSS5nZXRPcGVyYW5kKDApOworCisgIC8vIE1hbnkgY2FzZXMgb2YgImNhc3Qgb2YgYSBjYXN0IiBhcmUgZWxpbWluYWJsZS4gSWYgaXQncyBlbGltaW5hYmxlIHdlIGp1c3QKKyAgLy8gZWxpbWluYXRlIGl0IG5vdy4KKyAgaWYgKENhc3RJbnN0ICpDU3JjID0gZHluX2Nhc3Q8Q2FzdEluc3Q+KFNyYykpIHsgICAvLyBBLT5CLT5DIGNhc3QKKyAgICBpZiAoSW5zdHJ1Y3Rpb246OkNhc3RPcHMgb3BjID0gCisgICAgICAgIGlzRWxpbWluYWJsZUNhc3RQYWlyKENTcmMsIENJLmdldE9wY29kZSgpLCBDSS5nZXRUeXBlKCksIFREKSkgeworICAgICAgLy8gVGhlIGZpcnN0IGNhc3QgKENTcmMpIGlzIGVsaW1pbmFibGUgc28gd2UgbmVlZCB0byBmaXggdXAgb3IgcmVwbGFjZQorICAgICAgLy8gdGhlIHNlY29uZCBjYXN0IChDSSkuIENTcmMgd2lsbCB0aGVuIGhhdmUgYSBnb29kIGNoYW5jZSBvZiBiZWluZyBkZWFkLgorICAgICAgcmV0dXJuIENhc3RJbnN0OjpDcmVhdGUob3BjLCBDU3JjLT5nZXRPcGVyYW5kKDApLCBDSS5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCisgIC8vIElmIHdlIGFyZSBjYXN0aW5nIGEgc2VsZWN0IHRoZW4gZm9sZCB0aGUgY2FzdCBpbnRvIHRoZSBzZWxlY3QKKyAgaWYgKFNlbGVjdEluc3QgKlNJID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oU3JjKSkKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKk5WID0gRm9sZE9wSW50b1NlbGVjdChDSSwgU0kpKQorICAgICAgcmV0dXJuIE5WOworCisgIC8vIElmIHdlIGFyZSBjYXN0aW5nIGEgUEhJIHRoZW4gZm9sZCB0aGUgY2FzdCBpbnRvIHRoZSBQSEkKKyAgaWYgKGlzYTxQSElOb2RlPihTcmMpKSB7CisgICAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpZiB0aGlzIHdvdWxkIGNyZWF0ZSBhIFBISSBub2RlIHdpdGggYW4gaWxsZWdhbCB0eXBlIGlmCisgICAgLy8gaXQgaXMgY3VycmVudGx5IGxlZ2FsLgorICAgIGlmICghU3JjLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkgfHwKKyAgICAgICAgIUNJLmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSB8fAorICAgICAgICBTaG91bGRDaGFuZ2VUeXBlKENJLmdldFR5cGUoKSwgU3JjLT5nZXRUeXBlKCkpKQorICAgICAgaWYgKEluc3RydWN0aW9uICpOViA9IEZvbGRPcEludG9QaGkoQ0kpKQorICAgICAgICByZXR1cm4gTlY7CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCisvLy8gQ2FuRXZhbHVhdGVUcnVuY2F0ZWQgLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gZXZhbHVhdGUgdGhlIHNwZWNpZmllZAorLy8vIGV4cHJlc3Npb24gdHJlZSBhcyB0eXBlIFR5IGluc3RlYWQgb2YgaXRzIGxhcmdlciB0eXBlLCBhbmQgYXJyaXZlIHdpdGggdGhlCisvLy8gc2FtZSB2YWx1ZS4gIFRoaXMgaXMgdXNlZCBieSBjb2RlIHRoYXQgdHJpZXMgdG8gZWxpbWluYXRlIHRydW5jYXRlcy4KKy8vLworLy8vIFR5IHdpbGwgYWx3YXlzIGJlIGEgdHlwZSBzbWFsbGVyIHRoYW4gVi4gIFdlIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0cnVuYyhWKQorLy8vIGNhbiBiZSBjb21wdXRlZCBieSBjb21wdXRpbmcgViBpbiB0aGUgc21hbGxlciB0eXBlLiAgSWYgViBpcyBhbiBpbnN0cnVjdGlvbiwKKy8vLyB0aGVuIHRydW5jKGluc3QoeCx5KSkgY2FuIGJlIGNvbXB1dGVkIGFzIGluc3QodHJ1bmMoeCksdHJ1bmMoeSkpLCB3aGljaCBvbmx5CisvLy8gbWFrZXMgc2Vuc2UgaWYgeCBhbmQgeSBjYW4gYmUgZWZmaWNpZW50bHkgdHJ1bmNhdGVkLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBib3RoIHZlY3RvcnMgYW5kIHNjYWxhcnMuCisvLy8KK3N0YXRpYyBib29sIENhbkV2YWx1YXRlVHJ1bmNhdGVkKFZhbHVlICpWLCBjb25zdCBUeXBlICpUeSkgeworICAvLyBXZSBjYW4gYWx3YXlzIGV2YWx1YXRlIGNvbnN0YW50cyBpbiBhbm90aGVyIHR5cGUuCisgIGlmIChpc2E8Q29uc3RhbnQ+KFYpKQorICAgIHJldHVybiB0cnVlOworICAKKyAgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVik7CisgIGlmICghSSkgcmV0dXJuIGZhbHNlOworICAKKyAgY29uc3QgVHlwZSAqT3JpZ1R5ID0gVi0+Z2V0VHlwZSgpOworICAKKyAgLy8gSWYgdGhpcyBpcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgZGVzdCB0eXBlLCB3ZSBjYW4gZWxpbWluYXRlIGl0LCBldmVuIGlmIGl0CisgIC8vIGhhcyBtdWx0aXBsZSB1c2VzLgorICBpZiAoKGlzYTxaRXh0SW5zdD4oSSkgfHwgaXNhPFNFeHRJbnN0PihJKSkgJiYgCisgICAgICBJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgPT0gVHkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gV2UgY2FuJ3QgZXh0ZW5kIG9yIHNocmluayBzb21ldGhpbmcgdGhhdCBoYXMgbXVsdGlwbGUgdXNlczogZG9pbmcgc28gd291bGQKKyAgLy8gcmVxdWlyZSBkdXBsaWNhdGluZyB0aGUgaW5zdHJ1Y3Rpb24gaW4gZ2VuZXJhbCwgd2hpY2ggaXNuJ3QgcHJvZml0YWJsZS4KKyAgaWYgKCFJLT5oYXNPbmVVc2UoKSkgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIE9wYyA9IEktPmdldE9wY29kZSgpOworICBzd2l0Y2ggKE9wYykgeworICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgICAgLy8gVGhlc2Ugb3BlcmF0b3JzIGNhbiBhbGwgYXJiaXRyYXJpbHkgYmUgZXh0ZW5kZWQgb3IgdHJ1bmNhdGVkLgorICAgIHJldHVybiBDYW5FdmFsdWF0ZVRydW5jYXRlZChJLT5nZXRPcGVyYW5kKDApLCBUeSkgJiYKKyAgICAgICAgICAgQ2FuRXZhbHVhdGVUcnVuY2F0ZWQoSS0+Z2V0T3BlcmFuZCgxKSwgVHkpOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVEaXY6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06IHsKKyAgICAvLyBVRGl2IGFuZCBVUmVtIGNhbiBiZSB0cnVuY2F0ZWQgaWYgYWxsIHRoZSB0cnVuY2F0ZWQgYml0cyBhcmUgemVyby4KKyAgICB1aW50MzJfdCBPcmlnQml0V2lkdGggPSBPcmlnVHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICB1aW50MzJfdCBCaXRXaWR0aCA9IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgaWYgKEJpdFdpZHRoIDwgT3JpZ0JpdFdpZHRoKSB7CisgICAgICBBUEludCBNYXNrID0gQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KE9yaWdCaXRXaWR0aCwgT3JpZ0JpdFdpZHRoLUJpdFdpZHRoKTsKKyAgICAgIGlmIChNYXNrZWRWYWx1ZUlzWmVybyhJLT5nZXRPcGVyYW5kKDApLCBNYXNrKSAmJgorICAgICAgICAgIE1hc2tlZFZhbHVlSXNaZXJvKEktPmdldE9wZXJhbmQoMSksIE1hc2spKSB7CisgICAgICAgIHJldHVybiBDYW5FdmFsdWF0ZVRydW5jYXRlZChJLT5nZXRPcGVyYW5kKDApLCBUeSkgJiYKKyAgICAgICAgICAgICAgIENhbkV2YWx1YXRlVHJ1bmNhdGVkKEktPmdldE9wZXJhbmQoMSksIFR5KTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgIC8vIElmIHdlIGFyZSB0cnVuY2F0aW5nIHRoZSByZXN1bHQgb2YgdGhpcyBTSEwsIGFuZCBpZiBpdCdzIGEgc2hpZnQgb2YgYQorICAgIC8vIGNvbnN0YW50IGFtb3VudCwgd2UgY2FuIGFsd2F5cyBwZXJmb3JtIGEgU0hMIGluIGEgc21hbGxlciB0eXBlLgorICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHVpbnQzMl90IEJpdFdpZHRoID0gVHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgIGlmIChDSS0+Z2V0TGltaXRlZFZhbHVlKEJpdFdpZHRoKSA8IEJpdFdpZHRoKQorICAgICAgICByZXR1cm4gQ2FuRXZhbHVhdGVUcnVuY2F0ZWQoSS0+Z2V0T3BlcmFuZCgwKSwgVHkpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgICAvLyBJZiB0aGlzIGlzIGEgdHJ1bmNhdGUgb2YgYSBsb2dpY2FsIHNociwgd2UgY2FuIHRydW5jYXRlIGl0IHRvIGEgc21hbGxlcgorICAgIC8vIGxzaHIgaWZmIHdlIGtub3cgdGhhdCB0aGUgYml0cyB3ZSB3b3VsZCBvdGhlcndpc2UgYmUgc2hpZnRpbmcgaW4gYXJlCisgICAgLy8gYWxyZWFkeSB6ZXJvcy4KKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEktPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICB1aW50MzJfdCBPcmlnQml0V2lkdGggPSBPcmlnVHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgIHVpbnQzMl90IEJpdFdpZHRoID0gVHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgIGlmIChNYXNrZWRWYWx1ZUlzWmVybyhJLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KE9yaWdCaXRXaWR0aCwgT3JpZ0JpdFdpZHRoLUJpdFdpZHRoKSkgJiYKKyAgICAgICAgICBDSS0+Z2V0TGltaXRlZFZhbHVlKEJpdFdpZHRoKSA8IEJpdFdpZHRoKSB7CisgICAgICAgIHJldHVybiBDYW5FdmFsdWF0ZVRydW5jYXRlZChJLT5nZXRPcGVyYW5kKDApLCBUeSk7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzoKKyAgICAvLyB0cnVuYyh0cnVuYyh4KSkgLT4gdHJ1bmMoeCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2VsZWN0OiB7CisgICAgU2VsZWN0SW5zdCAqU0kgPSBjYXN0PFNlbGVjdEluc3Q+KEkpOworICAgIHJldHVybiBDYW5FdmFsdWF0ZVRydW5jYXRlZChTSS0+Z2V0VHJ1ZVZhbHVlKCksIFR5KSAmJgorICAgICAgICAgICBDYW5FdmFsdWF0ZVRydW5jYXRlZChTSS0+Z2V0RmFsc2VWYWx1ZSgpLCBUeSk7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6UEhJOiB7CisgICAgLy8gV2UgY2FuIGNoYW5nZSBhIHBoaSBpZiB3ZSBjYW4gY2hhbmdlIGFsbCBvcGVyYW5kcy4gIE5vdGUgdGhhdCB3ZSBuZXZlcgorICAgIC8vIGdldCBpbnRvIHRyb3VibGUgd2l0aCBjeWNsaWMgUEhJcyBoZXJlIGJlY2F1c2Ugd2Ugb25seSBjb25zaWRlcgorICAgIC8vIGluc3RydWN0aW9ucyB3aXRoIGEgc2luZ2xlIHVzZS4KKyAgICBQSElOb2RlICpQTiA9IGNhc3Q8UEhJTm9kZT4oSSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICghQ2FuRXZhbHVhdGVUcnVuY2F0ZWQoUE4tPmdldEluY29taW5nVmFsdWUoaSksIFR5KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGRlZmF1bHQ6CisgICAgLy8gVE9ETzogQ2FuIGhhbmRsZSBtb3JlIGNhc2VzIGhlcmUuCisgICAgYnJlYWs7CisgIH0KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRUcnVuYyhUcnVuY0luc3QgJkNJKSB7CisgIGlmIChJbnN0cnVjdGlvbiAqUmVzdWx0ID0gY29tbW9uQ2FzdFRyYW5zZm9ybXMoQ0kpKQorICAgIHJldHVybiBSZXN1bHQ7CisgIAorICAvLyBTZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IGFueSBpbnN0cnVjdGlvbnMgdXNlZCBieSB0aGUgaW5wdXQgd2hvc2Ugc29sZSAKKyAgLy8gcHVycG9zZSBpcyB0byBjb21wdXRlIGJpdHMgd2UgZG9uJ3QgY2FyZSBhYm91dC4KKyAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRJbnN0cnVjdGlvbkJpdHMoQ0kpKQorICAgIHJldHVybiAmQ0k7CisgIAorICBWYWx1ZSAqU3JjID0gQ0kuZ2V0T3BlcmFuZCgwKTsKKyAgY29uc3QgVHlwZSAqRGVzdFR5ID0gQ0kuZ2V0VHlwZSgpLCAqU3JjVHkgPSBTcmMtPmdldFR5cGUoKTsKKyAgCisgIC8vIEF0dGVtcHQgdG8gdHJ1bmNhdGUgdGhlIGVudGlyZSBpbnB1dCBleHByZXNzaW9uIHRyZWUgdG8gdGhlIGRlc3RpbmF0aW9uCisgIC8vIHR5cGUuICAgT25seSBkbyB0aGlzIGlmIHRoZSBkZXN0IHR5cGUgaXMgYSBzaW1wbGUgdHlwZSwgZG9uJ3QgY29udmVydCB0aGUKKyAgLy8gZXhwcmVzc2lvbiB0cmVlIHRvIHNvbWV0aGluZyB3ZWlyZCBsaWtlIGk5MyB1bmxlc3MgdGhlIHNvdXJjZSBpcyBhbHNvCisgIC8vIHN0cmFuZ2UuCisgIGlmICgoRGVzdFR5LT5pc1ZlY3RvclR5KCkgfHwgU2hvdWxkQ2hhbmdlVHlwZShTcmNUeSwgRGVzdFR5KSkgJiYKKyAgICAgIENhbkV2YWx1YXRlVHJ1bmNhdGVkKFNyYywgRGVzdFR5KSkgeworICAgICAgCisgICAgLy8gSWYgdGhpcyBjYXN0IGlzIGEgdHJ1bmNhdGUsIGV2YWx1dGluZyBpbiBhIGRpZmZlcmVudCB0eXBlIGFsd2F5cworICAgIC8vIGVsaW1pbmF0ZXMgdGhlIGNhc3QsIHNvIGl0IGlzIGFsd2F5cyBhIHdpbi4KKyAgICBERUJVRyhkYmdzKCkgPDwgIklDRTogRXZhbHVhdGVJbkRpZmZlcmVudFR5cGUgY29udmVydGluZyBleHByZXNzaW9uIHR5cGUiCisgICAgICAgICAgIiB0byBhdm9pZCBjYXN0OiAiIDw8IENJIDw8ICdcbicpOworICAgIFZhbHVlICpSZXMgPSBFdmFsdWF0ZUluRGlmZmVyZW50VHlwZShTcmMsIERlc3RUeSwgZmFsc2UpOworICAgIGFzc2VydChSZXMtPmdldFR5cGUoKSA9PSBEZXN0VHkpOworICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBSZXMpOworICB9CisKKyAgLy8gQ2Fub25pY2FsaXplIHRydW5jIHggdG8gaTEgLT4gKGljbXAgbmUgKGFuZCB4LCAxKSwgMCksIGxpa2V3aXNlIGZvciB2ZWN0b3IuCisgIGlmIChEZXN0VHktPmdldFNjYWxhclNpemVJbkJpdHMoKSA9PSAxKSB7CisgICAgQ29uc3RhbnQgKk9uZSA9IENvbnN0YW50SW50OjpnZXQoU3JjLT5nZXRUeXBlKCksIDEpOworICAgIFNyYyA9IEJ1aWxkZXItPkNyZWF0ZUFuZChTcmMsIE9uZSk7CisgICAgVmFsdWUgKlplcm8gPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFNyYy0+Z2V0VHlwZSgpKTsKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX05FLCBTcmMsIFplcm8pOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyB0cmFuc2Zvcm1aRXh0SUNtcCAtIFRyYW5zZm9ybSAoemV4dCBpY21wKSB0byBiaXR3aXNlIC8gaW50ZWdlciBvcGVyYXRpb25zCisvLy8gaW4gb3JkZXIgdG8gZWxpbWluYXRlIHRoZSBpY21wLgorSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dHJhbnNmb3JtWkV4dElDbXAoSUNtcEluc3QgKklDSSwgSW5zdHJ1Y3Rpb24gJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEb1hmb3JtKSB7CisgIC8vIElmIHdlIGFyZSBqdXN0IGNoZWNraW5nIGZvciBhIGljbXAgZXEgb2YgYSBzaW5nbGUgYml0IGFuZCB6ZXh0J2luZyBpdAorICAvLyB0byBhbiBpbnRlZ2VyLCB0aGVuIHNoaWZ0IHRoZSBiaXQgdG8gdGhlIGFwcHJvcHJpYXRlIHBsYWNlIGFuZCB0aGVuCisgIC8vIGNhc3QgdG8gaW50ZWdlciB0byBhdm9pZCB0aGUgY29tcGFyaXNvbi4KKyAgaWYgKENvbnN0YW50SW50ICpPcDFDID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KElDSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICBjb25zdCBBUEludCAmT3AxQ1YgPSBPcDFDLT5nZXRWYWx1ZSgpOworICAgICAgCisgICAgLy8gemV4dCAoeCA8cyAgMCkgdG8gaTMyIC0tPiB4Pj51MzEgICAgICB0cnVlIGlmIHNpZ25iaXQgc2V0LgorICAgIC8vIHpleHQgKHggPnMgLTEpIHRvIGkzMiAtLT4gKHg+PnUzMSleMSAgdHJ1ZSBpZiBzaWduYml0IGNsZWFyLgorICAgIGlmICgoSUNJLT5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9TTFQgJiYgT3AxQ1YgPT0gMCkgfHwKKyAgICAgICAgKElDSS0+Z2V0UHJlZGljYXRlKCkgPT0gSUNtcEluc3Q6OklDTVBfU0dUICYmT3AxQ1YuaXNBbGxPbmVzVmFsdWUoKSkpIHsKKyAgICAgIGlmICghRG9YZm9ybSkgcmV0dXJuIElDSTsKKworICAgICAgVmFsdWUgKkluID0gSUNJLT5nZXRPcGVyYW5kKDApOworICAgICAgVmFsdWUgKlNoID0gQ29uc3RhbnRJbnQ6OmdldChJbi0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbi0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCktMSk7CisgICAgICBJbiA9IEJ1aWxkZXItPkNyZWF0ZUxTaHIoSW4sIFNoKTsKKyAgICAgIGlmIChJbi0+Z2V0VHlwZSgpICE9IENJLmdldFR5cGUoKSkKKyAgICAgICAgSW4gPSBCdWlsZGVyLT5DcmVhdGVJbnRDYXN0KEluLCBDSS5nZXRUeXBlKCksIGZhbHNlLypaRXh0Ki8pOworCisgICAgICBpZiAoSUNJLT5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9TR1QpIHsKKyAgICAgICAgQ29uc3RhbnQgKk9uZSA9IENvbnN0YW50SW50OjpnZXQoSW4tPmdldFR5cGUoKSwgMSk7CisgICAgICAgIEluID0gQnVpbGRlci0+Q3JlYXRlWG9yKEluLCBPbmUpOworICAgICAgfQorCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChDSSwgSW4pOworICAgIH0KKyAgICAgIAorICAgICAgCisgICAgICAKKyAgICAvLyB6ZXh0IChYID09IDApIHRvIGkzMiAtLT4gWF4xICAgICAgaWZmIFggaGFzIG9ubHkgdGhlIGxvdyBiaXQgc2V0LgorICAgIC8vIHpleHQgKFggPT0gMCkgdG8gaTMyIC0tPiAoWD4+MSleMSBpZmYgWCBoYXMgb25seSB0aGUgMm5kIGJpdCBzZXQuCisgICAgLy8gemV4dCAoWCA9PSAxKSB0byBpMzIgLS0+IFggICAgICAgIGlmZiBYIGhhcyBvbmx5IHRoZSBsb3cgYml0IHNldC4KKyAgICAvLyB6ZXh0IChYID09IDIpIHRvIGkzMiAtLT4gWD4+MSAgICAgaWZmIFggaGFzIG9ubHkgdGhlIDJuZCBiaXQgc2V0LgorICAgIC8vIHpleHQgKFggIT0gMCkgdG8gaTMyIC0tPiBYICAgICAgICBpZmYgWCBoYXMgb25seSB0aGUgbG93IGJpdCBzZXQuCisgICAgLy8gemV4dCAoWCAhPSAwKSB0byBpMzIgLS0+IFg+PjEgICAgIGlmZiBYIGhhcyBvbmx5IHRoZSAybmQgYml0IHNldC4KKyAgICAvLyB6ZXh0IChYICE9IDEpIHRvIGkzMiAtLT4gWF4xICAgICAgaWZmIFggaGFzIG9ubHkgdGhlIGxvdyBiaXQgc2V0LgorICAgIC8vIHpleHQgKFggIT0gMikgdG8gaTMyIC0tPiAoWD4+MSleMSBpZmYgWCBoYXMgb25seSB0aGUgMm5kIGJpdCBzZXQuCisgICAgaWYgKChPcDFDViA9PSAwIHx8IE9wMUNWLmlzUG93ZXJPZjIoKSkgJiYgCisgICAgICAgIC8vIFRoaXMgb25seSB3b3JrcyBmb3IgRVEgYW5kIE5FCisgICAgICAgIElDSS0+aXNFcXVhbGl0eSgpKSB7CisgICAgICAvLyBJZiBPcDFDIHNvbWUgb3RoZXIgcG93ZXIgb2YgdHdvLCBjb252ZXJ0OgorICAgICAgdWludDMyX3QgQml0V2lkdGggPSBPcDFDLT5nZXRUeXBlKCktPmdldEJpdFdpZHRoKCk7CisgICAgICBBUEludCBLbm93blplcm8oQml0V2lkdGgsIDApLCBLbm93bk9uZShCaXRXaWR0aCwgMCk7CisgICAgICBBUEludCBUeXBlTWFzayhBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKSk7CisgICAgICBDb21wdXRlTWFza2VkQml0cyhJQ0ktPmdldE9wZXJhbmQoMCksIFR5cGVNYXNrLCBLbm93blplcm8sIEtub3duT25lKTsKKyAgICAgICAgCisgICAgICBBUEludCBLbm93blplcm9NYXNrKH5Lbm93blplcm8pOworICAgICAgaWYgKEtub3duWmVyb01hc2suaXNQb3dlck9mMigpKSB7IC8vIEV4YWN0bHkgMSBwb3NzaWJsZSAxPworICAgICAgICBpZiAoIURvWGZvcm0pIHJldHVybiBJQ0k7CisKKyAgICAgICAgYm9vbCBpc05FID0gSUNJLT5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9ORTsKKyAgICAgICAgaWYgKE9wMUNWICE9IDAgJiYgKE9wMUNWICE9IEtub3duWmVyb01hc2spKSB7CisgICAgICAgICAgLy8gKFgmNCkgPT0gMiAtLT4gZmFsc2UKKyAgICAgICAgICAvLyAoWCY0KSAhPSAyIC0tPiB0cnVlCisgICAgICAgICAgQ29uc3RhbnQgKlJlcyA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KENJLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNORSk7CisgICAgICAgICAgUmVzID0gQ29uc3RhbnRFeHByOjpnZXRaRXh0KFJlcywgQ0kuZ2V0VHlwZSgpKTsKKyAgICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChDSSwgUmVzKTsKKyAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICB1aW50MzJfdCBTaGlmdEFtdCA9IEtub3duWmVyb01hc2subG9nQmFzZTIoKTsKKyAgICAgICAgVmFsdWUgKkluID0gSUNJLT5nZXRPcGVyYW5kKDApOworICAgICAgICBpZiAoU2hpZnRBbXQpIHsKKyAgICAgICAgICAvLyBQZXJmb3JtIGEgbG9naWNhbCBzaHIgYnkgc2hpZnRhbXQuCisgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBzaGlmdCB0byBwdXQgdGhlIHJlc3VsdCBpbiB0aGUgbG93IGJpdC4KKyAgICAgICAgICBJbiA9IEJ1aWxkZXItPkNyZWF0ZUxTaHIoSW4sIENvbnN0YW50SW50OjpnZXQoSW4tPmdldFR5cGUoKSxTaGlmdEFtdCkpOworICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgIGlmICgoT3AxQ1YgIT0gMCkgPT0gaXNORSkgeyAvLyBUb2dnbGUgdGhlIGxvdyBiaXQuCisgICAgICAgICAgQ29uc3RhbnQgKk9uZSA9IENvbnN0YW50SW50OjpnZXQoSW4tPmdldFR5cGUoKSwgMSk7CisgICAgICAgICAgSW4gPSBCdWlsZGVyLT5DcmVhdGVYb3IoSW4sIE9uZSk7CisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgaWYgKENJLmdldFR5cGUoKSA9PSBJbi0+Z2V0VHlwZSgpKQorICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBJbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZUludGVnZXJDYXN0KEluLCBDSS5nZXRUeXBlKCksIGZhbHNlLypaRXh0Ki8pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGljbXAgbmUgQSwgQiBpcyBlcXVhbCB0byB4b3IgQSwgQiB3aGVuIEEgYW5kIEIgb25seSByZWFsbHkgaGF2ZSBvbmUgYml0LgorICAvLyBJdCBpcyBhbHNvIHByb2ZpdGFibGUgdG8gdHJhbnNmb3JtIGljbXAgZXEgaW50byBub3QoeG9yKEEsIEIpKSBiZWNhdXNlIHRoYXQKKyAgLy8gbWF5IGxlYWQgdG8gYWRkaXRpb25hbCBzaW1wbGlmaWNhdGlvbnMuCisgIGlmIChJQ0ktPmlzRXF1YWxpdHkoKSAmJiBDSS5nZXRUeXBlKCkgPT0gSUNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpIHsKKyAgICBpZiAoY29uc3QgSW50ZWdlclR5cGUgKklUeSA9IGR5bl9jYXN0PEludGVnZXJUeXBlPihDSS5nZXRUeXBlKCkpKSB7CisgICAgICB1aW50MzJfdCBCaXRXaWR0aCA9IElUeS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAgIFZhbHVlICpMSFMgPSBJQ0ktPmdldE9wZXJhbmQoMCk7CisgICAgICBWYWx1ZSAqUkhTID0gSUNJLT5nZXRPcGVyYW5kKDEpOworCisgICAgICBBUEludCBLbm93blplcm9MSFMoQml0V2lkdGgsIDApLCBLbm93bk9uZUxIUyhCaXRXaWR0aCwgMCk7CisgICAgICBBUEludCBLbm93blplcm9SSFMoQml0V2lkdGgsIDApLCBLbm93bk9uZVJIUyhCaXRXaWR0aCwgMCk7CisgICAgICBBUEludCBUeXBlTWFzayhBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKSk7CisgICAgICBDb21wdXRlTWFza2VkQml0cyhMSFMsIFR5cGVNYXNrLCBLbm93blplcm9MSFMsIEtub3duT25lTEhTKTsKKyAgICAgIENvbXB1dGVNYXNrZWRCaXRzKFJIUywgVHlwZU1hc2ssIEtub3duWmVyb1JIUywgS25vd25PbmVSSFMpOworCisgICAgICBpZiAoS25vd25aZXJvTEhTID09IEtub3duWmVyb1JIUyAmJiBLbm93bk9uZUxIUyA9PSBLbm93bk9uZVJIUykgeworICAgICAgICBBUEludCBLbm93bkJpdHMgPSBLbm93blplcm9MSFMgfCBLbm93bk9uZUxIUzsKKyAgICAgICAgQVBJbnQgVW5rbm93bkJpdCA9IH5Lbm93bkJpdHM7CisgICAgICAgIGlmIChVbmtub3duQml0LmNvdW50UG9wdWxhdGlvbigpID09IDEpIHsKKyAgICAgICAgICBpZiAoIURvWGZvcm0pIHJldHVybiBJQ0k7CisKKyAgICAgICAgICBWYWx1ZSAqUmVzdWx0ID0gQnVpbGRlci0+Q3JlYXRlWG9yKExIUywgUkhTKTsKKworICAgICAgICAgIC8vIE1hc2sgb2ZmIGFueSBiaXRzIHRoYXQgYXJlIHNldCBhbmQgd29uJ3QgYmUgc2hpZnRlZCBhd2F5LgorICAgICAgICAgIGlmIChLbm93bk9uZUxIUy51Z2UoVW5rbm93bkJpdCkpCisgICAgICAgICAgICBSZXN1bHQgPSBCdWlsZGVyLT5DcmVhdGVBbmQoUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSVR5LCBVbmtub3duQml0KSk7CisKKyAgICAgICAgICAvLyBTaGlmdCB0aGUgYml0IHdlJ3JlIHRlc3RpbmcgZG93biB0byB0aGUgbHNiLgorICAgICAgICAgIFJlc3VsdCA9IEJ1aWxkZXItPkNyZWF0ZUxTaHIoCisgICAgICAgICAgICAgICBSZXN1bHQsIENvbnN0YW50SW50OjpnZXQoSVR5LCBVbmtub3duQml0LmNvdW50VHJhaWxpbmdaZXJvcygpKSk7CisKKyAgICAgICAgICBpZiAoSUNJLT5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9FUSkKKyAgICAgICAgICAgIFJlc3VsdCA9IEJ1aWxkZXItPkNyZWF0ZVhvcihSZXN1bHQsIENvbnN0YW50SW50OjpnZXQoSVR5LCAxKSk7CisgICAgICAgICAgUmVzdWx0LT50YWtlTmFtZShJQ0kpOworICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBSZXN1bHQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBDYW5FdmFsdWF0ZVpFeHRkIC0gRGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgY2FuIGJlIGNvbXB1dGVkIGluIHRoZQorLy8vIHNwZWNpZmllZCB3aWRlciB0eXBlIGFuZCBwcm9kdWNlIHRoZSBzYW1lIGxvdyBiaXRzLiAgSWYgbm90LCByZXR1cm4gZmFsc2UuCisvLy8KKy8vLyBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgaXQgY2FuIGFsc28gcmV0dXJuIGEgbm9uLXplcm8gbnVtYmVyIG9mIGJpdHMKKy8vLyAoaW4gQml0c1RvQ2xlYXIpIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBpdCBjb21wdXRlcyBpcyBjb3JyZWN0IGZvcgorLy8vIHRoZSB6ZXJvIGV4dGVuZCwgYnV0IHRoYXQgdGhlIGFkZGl0aW9uYWwgQml0c1RvQ2xlYXIgYml0cyBuZWVkIHRvIGJlIHplcm8nZAorLy8vIG91dC4gIEZvciBleGFtcGxlLCB0byBwcm9tb3RlIHNvbWV0aGluZyBsaWtlOgorLy8vCisvLy8gICAlQiA9IHRydW5jIGk2NCAlQSB0byBpMzIKKy8vLyAgICVDID0gbHNociBpMzIgJUIsIDgKKy8vLyAgICVFID0gemV4dCBpMzIgJUMgdG8gaTY0CisvLy8KKy8vLyBDYW5FdmFsdWF0ZVpFeHRkIGZvciB0aGUgJ2xzaHInIHdpbGwgcmV0dXJuIHRydWUsIGFuZCBCaXRzVG9DbGVhciB3aWxsIGJlCisvLy8gc2V0IHRvIDggdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvbW90ZWQgdmFsdWUgbmVlZHMgdG8gaGF2ZSBiaXRzIDI0LTMxCisvLy8gY2xlYXJlZCBpbiBhZGRpdGlvbiB0byBiaXRzIDMyLTYzLiAgU2luY2UgYW4gJ2FuZCcgd2lsbCBiZSBnZW5lcmF0ZWQgdG8KKy8vLyBjbGVhciB0aGUgdG9wIGJpdHMgYW55d2F5LCBkb2luZyB0aGlzIGhhcyBubyBleHRyYSBjb3N0LgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBib3RoIHZlY3RvcnMgYW5kIHNjYWxhcnMuCitzdGF0aWMgYm9vbCBDYW5FdmFsdWF0ZVpFeHRkKFZhbHVlICpWLCBjb25zdCBUeXBlICpUeSwgdW5zaWduZWQgJkJpdHNUb0NsZWFyKSB7CisgIEJpdHNUb0NsZWFyID0gMDsKKyAgaWYgKGlzYTxDb25zdGFudD4oVikpCisgICAgcmV0dXJuIHRydWU7CisgIAorICBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKTsKKyAgaWYgKCFJKSByZXR1cm4gZmFsc2U7CisgIAorICAvLyBJZiB0aGUgaW5wdXQgaXMgYSB0cnVuY2F0ZSBmcm9tIHRoZSBkZXN0aW5hdGlvbiB0eXBlLCB3ZSBjYW4gdHJpdmlhbGx5CisgIC8vIGVsaW1pbmF0ZSBpdCwgZXZlbiBpZiBpdCBoYXMgbXVsdGlwbGUgdXNlcy4KKyAgLy8gRklYTUU6IFRoaXMgaXMgY3VycmVudGx5IGRpc2FibGVkIHVudGlsIGNvZGVnZW4gY2FuIGhhbmRsZSB0aGlzIHdpdGhvdXQKKyAgLy8gcGVzc2ltaXppbmcgY29kZSwgUFI1OTk3LgorICBpZiAoMCAmJiBpc2E8VHJ1bmNJbnN0PihJKSAmJiBJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgPT0gVHkpCisgICAgcmV0dXJuIHRydWU7CisgIAorICAvLyBXZSBjYW4ndCBleHRlbmQgb3Igc2hyaW5rIHNvbWV0aGluZyB0aGF0IGhhcyBtdWx0aXBsZSB1c2VzOiBkb2luZyBzbyB3b3VsZAorICAvLyByZXF1aXJlIGR1cGxpY2F0aW5nIHRoZSBpbnN0cnVjdGlvbiBpbiBnZW5lcmFsLCB3aGljaCBpc24ndCBwcm9maXRhYmxlLgorICBpZiAoIUktPmhhc09uZVVzZSgpKSByZXR1cm4gZmFsc2U7CisgIAorICB1bnNpZ25lZCBPcGMgPSBJLT5nZXRPcGNvZGUoKSwgVG1wOworICBzd2l0Y2ggKE9wYykgeworICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OiAgLy8gemV4dCh6ZXh0KHgpKSAtPiB6ZXh0KHgpLgorICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OiAgLy8gemV4dChzZXh0KHgpKSAtPiBzZXh0KHgpLgorICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzogLy8gemV4dCh0cnVuYyh4KSkgLT4gdHJ1bmMoeCkgb3IgemV4dCh4KQorICAgIHJldHVybiB0cnVlOworICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDoKKyAgICBpZiAoIUNhbkV2YWx1YXRlWkV4dGQoSS0+Z2V0T3BlcmFuZCgwKSwgVHksIEJpdHNUb0NsZWFyKSB8fAorICAgICAgICAhQ2FuRXZhbHVhdGVaRXh0ZChJLT5nZXRPcGVyYW5kKDEpLCBUeSwgVG1wKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBUaGVzZSBjYW4gYWxsIGJlIHByb21vdGVkIGlmIG5laXRoZXIgb3BlcmFuZCBoYXMgJ2JpdHMgdG8gY2xlYXInLgorICAgIGlmIChCaXRzVG9DbGVhciA9PSAwICYmIFRtcCA9PSAwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgICAKKyAgICAvLyBJZiB0aGUgb3BlcmF0aW9uIGlzIGFuIEFORC9PUi9YT1IgYW5kIHRoZSBiaXRzIHRvIGNsZWFyIGFyZSB6ZXJvIGluIHRoZQorICAgIC8vIG90aGVyIHNpZGUsIEJpdHNUb0NsZWFyIGlzIG9rLgorICAgIGlmIChUbXAgPT0gMCAmJgorICAgICAgICAoT3BjID09IEluc3RydWN0aW9uOjpBbmQgfHwgT3BjID09IEluc3RydWN0aW9uOjpPciB8fAorICAgICAgICAgT3BjID09IEluc3RydWN0aW9uOjpYb3IpKSB7CisgICAgICAvLyBXZSB1c2UgTWFza2VkVmFsdWVJc1plcm8gaGVyZSBmb3IgZ2VuZXJhbGl0eSwgYnV0IHRoZSBjYXNlIHdlIGNhcmUKKyAgICAgIC8vIGFib3V0IHRoZSBtb3N0IGlzIGNvbnN0YW50IFJIUy4KKyAgICAgIHVuc2lnbmVkIFZTaXplID0gVi0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICBpZiAoTWFza2VkVmFsdWVJc1plcm8oSS0+Z2V0T3BlcmFuZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludDo6Z2V0SGlnaEJpdHNTZXQoVlNpemUsIEJpdHNUb0NsZWFyKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAgIAorICAgIC8vIE90aGVyd2lzZSwgd2UgZG9uJ3Qga25vdyBob3cgdG8gYW5hbHl6ZSB0aGlzIEJpdHNUb0NsZWFyIGNhc2UgeWV0LgorICAgIHJldHVybiBmYWxzZTsKKyAgICAgIAorICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOgorICAgIC8vIFdlIGNhbiBwcm9tb3RlIGxzaHIoeCwgY3N0KSBpZiB3ZSBjYW4gcHJvbW90ZSB4LiAgVGhpcyByZXF1aXJlcyB0aGUKKyAgICAvLyB1bHRpbWF0ZSAnYW5kJyB0byBjbGVhciBvdXQgdGhlIGhpZ2ggemVybyBiaXRzIHdlJ3JlIGNsZWFyaW5nIG91dCB0aG91Z2guCisgICAgaWYgKENvbnN0YW50SW50ICpBbXQgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIGlmICghQ2FuRXZhbHVhdGVaRXh0ZChJLT5nZXRPcGVyYW5kKDApLCBUeSwgQml0c1RvQ2xlYXIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBCaXRzVG9DbGVhciArPSBBbXQtPmdldFpFeHRWYWx1ZSgpOworICAgICAgaWYgKEJpdHNUb0NsZWFyID4gVi0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkpCisgICAgICAgIEJpdHNUb0NsZWFyID0gVi0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gQ2Fubm90IHByb21vdGUgdmFyaWFibGUgTFNIUi4KKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNlbGVjdDoKKyAgICBpZiAoIUNhbkV2YWx1YXRlWkV4dGQoSS0+Z2V0T3BlcmFuZCgxKSwgVHksIFRtcCkgfHwKKyAgICAgICAgIUNhbkV2YWx1YXRlWkV4dGQoSS0+Z2V0T3BlcmFuZCgyKSwgVHksIEJpdHNUb0NsZWFyKSB8fAorICAgICAgICAvLyBUT0RPOiBJZiBpbXBvcnRhbnQsIHdlIGNvdWxkIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBCaXRzVG9DbGVhciBhcmUKKyAgICAgICAgLy8ga25vd24gemVybyBpbiB0aGUgZGlzYWdyZWVpbmcgc2lkZS4KKyAgICAgICAgVG1wICE9IEJpdHNUb0NsZWFyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICAgICAgCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlBISTogeworICAgIC8vIFdlIGNhbiBjaGFuZ2UgYSBwaGkgaWYgd2UgY2FuIGNoYW5nZSBhbGwgb3BlcmFuZHMuICBOb3RlIHRoYXQgd2UgbmV2ZXIKKyAgICAvLyBnZXQgaW50byB0cm91YmxlIHdpdGggY3ljbGljIFBISXMgaGVyZSBiZWNhdXNlIHdlIG9ubHkgY29uc2lkZXIKKyAgICAvLyBpbnN0cnVjdGlvbnMgd2l0aCBhIHNpbmdsZSB1c2UuCisgICAgUEhJTm9kZSAqUE4gPSBjYXN0PFBISU5vZGU+KEkpOworICAgIGlmICghQ2FuRXZhbHVhdGVaRXh0ZChQTi0+Z2V0SW5jb21pbmdWYWx1ZSgwKSwgVHksIEJpdHNUb0NsZWFyKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKCFDYW5FdmFsdWF0ZVpFeHRkKFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpLCBUeSwgVG1wKSB8fAorICAgICAgICAgIC8vIFRPRE86IElmIGltcG9ydGFudCwgd2UgY291bGQgaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIEJpdHNUb0NsZWFyCisgICAgICAgICAgLy8gYXJlIGtub3duIHplcm8gaW4gdGhlIGRpc2FncmVlaW5nIGlucHV0LgorICAgICAgICAgIFRtcCAhPSBCaXRzVG9DbGVhcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGRlZmF1bHQ6CisgICAgLy8gVE9ETzogQ2FuIGhhbmRsZSBtb3JlIGNhc2VzIGhlcmUuCisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0WkV4dChaRXh0SW5zdCAmQ0kpIHsKKyAgLy8gSWYgdGhpcyB6ZXJvIGV4dGVuZCBpcyBvbmx5IHVzZWQgYnkgYSB0cnVuY2F0ZSwgbGV0IHRoZSB0cnVuY2F0ZSBieQorICAvLyBlbGltaW5hdGVkIGJlZm9yZSB3ZSB0cnkgdG8gb3B0aW1pemUgdGhpcyB6ZXh0LgorICBpZiAoQ0kuaGFzT25lVXNlKCkgJiYgaXNhPFRydW5jSW5zdD4oQ0kudXNlX2JhY2soKSkpCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBJZiBvbmUgb2YgdGhlIGNvbW1vbiBjb252ZXJzaW9uIHdpbGwgd29yaywgZG8gaXQuCisgIGlmIChJbnN0cnVjdGlvbiAqUmVzdWx0ID0gY29tbW9uQ2FzdFRyYW5zZm9ybXMoQ0kpKQorICAgIHJldHVybiBSZXN1bHQ7CisKKyAgLy8gU2VlIGlmIHdlIGNhbiBzaW1wbGlmeSBhbnkgaW5zdHJ1Y3Rpb25zIHVzZWQgYnkgdGhlIGlucHV0IHdob3NlIHNvbGUgCisgIC8vIHB1cnBvc2UgaXMgdG8gY29tcHV0ZSBiaXRzIHdlIGRvbid0IGNhcmUgYWJvdXQuCisgIGlmIChTaW1wbGlmeURlbWFuZGVkSW5zdHJ1Y3Rpb25CaXRzKENJKSkKKyAgICByZXR1cm4gJkNJOworICAKKyAgVmFsdWUgKlNyYyA9IENJLmdldE9wZXJhbmQoMCk7CisgIGNvbnN0IFR5cGUgKlNyY1R5ID0gU3JjLT5nZXRUeXBlKCksICpEZXN0VHkgPSBDSS5nZXRUeXBlKCk7CisgIAorICAvLyBBdHRlbXB0IHRvIGV4dGVuZCB0aGUgZW50aXJlIGlucHV0IGV4cHJlc3Npb24gdHJlZSB0byB0aGUgZGVzdGluYXRpb24KKyAgLy8gdHlwZS4gICBPbmx5IGRvIHRoaXMgaWYgdGhlIGRlc3QgdHlwZSBpcyBhIHNpbXBsZSB0eXBlLCBkb24ndCBjb252ZXJ0IHRoZQorICAvLyBleHByZXNzaW9uIHRyZWUgdG8gc29tZXRoaW5nIHdlaXJkIGxpa2UgaTkzIHVubGVzcyB0aGUgc291cmNlIGlzIGFsc28KKyAgLy8gc3RyYW5nZS4KKyAgdW5zaWduZWQgQml0c1RvQ2xlYXI7CisgIGlmICgoRGVzdFR5LT5pc1ZlY3RvclR5KCkgfHwgU2hvdWxkQ2hhbmdlVHlwZShTcmNUeSwgRGVzdFR5KSkgJiYKKyAgICAgIENhbkV2YWx1YXRlWkV4dGQoU3JjLCBEZXN0VHksIEJpdHNUb0NsZWFyKSkgeyAKKyAgICBhc3NlcnQoQml0c1RvQ2xlYXIgPCBTcmNUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpICYmCisgICAgICAgICAgICJVbnJlYXNvbmFibGUgQml0c1RvQ2xlYXIiKTsKKyAgICAKKyAgICAvLyBPa2F5LCB3ZSBjYW4gdHJhbnNmb3JtIHRoaXMhICBJbnNlcnQgdGhlIG5ldyBleHByZXNzaW9uIG5vdy4KKyAgICBERUJVRyhkYmdzKCkgPDwgIklDRTogRXZhbHVhdGVJbkRpZmZlcmVudFR5cGUgY29udmVydGluZyBleHByZXNzaW9uIHR5cGUiCisgICAgICAgICAgIiB0byBhdm9pZCB6ZXJvIGV4dGVuZDogIiA8PCBDSSk7CisgICAgVmFsdWUgKlJlcyA9IEV2YWx1YXRlSW5EaWZmZXJlbnRUeXBlKFNyYywgRGVzdFR5LCBmYWxzZSk7CisgICAgYXNzZXJ0KFJlcy0+Z2V0VHlwZSgpID09IERlc3RUeSk7CisgICAgCisgICAgdWludDMyX3QgU3JjQml0c0tlcHQgPSBTcmNUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpLUJpdHNUb0NsZWFyOworICAgIHVpbnQzMl90IERlc3RCaXRTaXplID0gRGVzdFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgCisgICAgLy8gSWYgdGhlIGhpZ2ggYml0cyBhcmUgYWxyZWFkeSBmaWxsZWQgd2l0aCB6ZXJvcywganVzdCByZXBsYWNlIHRoaXMKKyAgICAvLyBjYXN0IHdpdGggdGhlIHJlc3VsdC4KKyAgICBpZiAoTWFza2VkVmFsdWVJc1plcm8oUmVzLCBBUEludDo6Z2V0SGlnaEJpdHNTZXQoRGVzdEJpdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RCaXRTaXplLVNyY0JpdHNLZXB0KSkpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChDSSwgUmVzKTsKKyAgICAKKyAgICAvLyBXZSBuZWVkIHRvIGVtaXQgYW4gQU5EIHRvIGNsZWFyIHRoZSBoaWdoIGJpdHMuCisgICAgQ29uc3RhbnQgKkMgPSBDb25zdGFudEludDo6Z2V0KFJlcy0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50OjpnZXRMb3dCaXRzU2V0KERlc3RCaXRTaXplLCBTcmNCaXRzS2VwdCkpOworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKFJlcywgQyk7CisgIH0KKworICAvLyBJZiB0aGlzIGlzIGEgVFJVTkMgZm9sbG93ZWQgYnkgYSBaRVhUIHRoZW4gd2UgYXJlIGRlYWxpbmcgd2l0aCBpbnRlZ3JhbAorICAvLyB0eXBlcyBhbmQgaWYgdGhlIHNpemVzIGFyZSBqdXN0IHJpZ2h0IHdlIGNhbiBjb252ZXJ0IHRoaXMgaW50byBhIGxvZ2ljYWwKKyAgLy8gJ2FuZCcgd2hpY2ggd2lsbCBiZSBtdWNoIGNoZWFwZXIgdGhhbiB0aGUgcGFpciBvZiBjYXN0cy4KKyAgaWYgKFRydW5jSW5zdCAqQ1NyYyA9IGR5bl9jYXN0PFRydW5jSW5zdD4oU3JjKSkgeyAgIC8vIEEtPkItPkMgY2FzdAorICAgIC8vIFRPRE86IFN1YnN1bWUgdGhpcyBpbnRvIEV2YWx1YXRlSW5EaWZmZXJlbnRUeXBlLgorICAgIAorICAgIC8vIEdldCB0aGUgc2l6ZXMgb2YgdGhlIHR5cGVzIGludm9sdmVkLiAgV2Uga25vdyB0aGF0IHRoZSBpbnRlcm1lZGlhdGUgdHlwZQorICAgIC8vIHdpbGwgYmUgc21hbGxlciB0aGFuIEEgb3IgQywgYnV0IGRvbid0IGtub3cgdGhlIHJlbGF0aW9uIGJldHdlZW4gQSBhbmQgQy4KKyAgICBWYWx1ZSAqQSA9IENTcmMtPmdldE9wZXJhbmQoMCk7CisgICAgdW5zaWduZWQgU3JjU2l6ZSA9IEEtPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgIHVuc2lnbmVkIE1pZFNpemUgPSBDU3JjLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICB1bnNpZ25lZCBEc3RTaXplID0gQ0kuZ2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgLy8gSWYgd2UncmUgYWN0dWFsbHkgZXh0ZW5kaW5nIHplcm8gYml0cywgdGhlbiBpZgorICAgIC8vIFNyY1NpemUgPCAgRHN0U2l6ZTogemV4dChhICYgbWFzaykKKyAgICAvLyBTcmNTaXplID09IERzdFNpemU6IGEgJiBtYXNrCisgICAgLy8gU3JjU2l6ZSAgPiBEc3RTaXplOiB0cnVuYyhhKSAmIG1hc2sKKyAgICBpZiAoU3JjU2l6ZSA8IERzdFNpemUpIHsKKyAgICAgIEFQSW50IEFuZFZhbHVlKEFQSW50OjpnZXRMb3dCaXRzU2V0KFNyY1NpemUsIE1pZFNpemUpKTsKKyAgICAgIENvbnN0YW50ICpBbmRDb25zdCA9IENvbnN0YW50SW50OjpnZXQoQS0+Z2V0VHlwZSgpLCBBbmRWYWx1ZSk7CisgICAgICBWYWx1ZSAqQW5kID0gQnVpbGRlci0+Q3JlYXRlQW5kKEEsIEFuZENvbnN0KTsKKyAgICAgIHJldHVybiBuZXcgWkV4dEluc3QoQW5kLCBDSS5nZXRUeXBlKCkpOworICAgIH0KKyAgICAKKyAgICBpZiAoU3JjU2l6ZSA9PSBEc3RTaXplKSB7CisgICAgICBBUEludCBBbmRWYWx1ZShBUEludDo6Z2V0TG93Qml0c1NldChTcmNTaXplLCBNaWRTaXplKSk7CisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChBLCBDb25zdGFudEludDo6Z2V0KEEtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kVmFsdWUpKTsKKyAgICB9CisgICAgaWYgKFNyY1NpemUgPiBEc3RTaXplKSB7CisgICAgICBWYWx1ZSAqVHJ1bmMgPSBCdWlsZGVyLT5DcmVhdGVUcnVuYyhBLCBDSS5nZXRUeXBlKCkpOworICAgICAgQVBJbnQgQW5kVmFsdWUoQVBJbnQ6OmdldExvd0JpdHNTZXQoRHN0U2l6ZSwgTWlkU2l6ZSkpOworICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoVHJ1bmMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUcnVuYy0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRWYWx1ZSkpOworICAgIH0KKyAgfQorCisgIGlmIChJQ21wSW5zdCAqSUNJID0gZHluX2Nhc3Q8SUNtcEluc3Q+KFNyYykpCisgICAgcmV0dXJuIHRyYW5zZm9ybVpFeHRJQ21wKElDSSwgQ0kpOworCisgIEJpbmFyeU9wZXJhdG9yICpTcmNJID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KFNyYyk7CisgIGlmIChTcmNJICYmIFNyY0ktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpPcikgeworICAgIC8vIHpleHQgKG9yIGljbXAsIGljbXApIC0tPiBvciAoemV4dCBpY21wKSwgKHpleHQgaWNtcCkgaWYgYXQgbGVhc3Qgb25lCisgICAgLy8gb2YgdGhlICh6ZXh0IGljbXApIHdpbGwgYmUgdHJhbnNmb3JtZWQuCisgICAgSUNtcEluc3QgKkxIUyA9IGR5bl9jYXN0PElDbXBJbnN0PihTcmNJLT5nZXRPcGVyYW5kKDApKTsKKyAgICBJQ21wSW5zdCAqUkhTID0gZHluX2Nhc3Q8SUNtcEluc3Q+KFNyY0ktPmdldE9wZXJhbmQoMSkpOworICAgIGlmIChMSFMgJiYgUkhTICYmIExIUy0+aGFzT25lVXNlKCkgJiYgUkhTLT5oYXNPbmVVc2UoKSAmJgorICAgICAgICAodHJhbnNmb3JtWkV4dElDbXAoTEhTLCBDSSwgZmFsc2UpIHx8CisgICAgICAgICB0cmFuc2Zvcm1aRXh0SUNtcChSSFMsIENJLCBmYWxzZSkpKSB7CisgICAgICBWYWx1ZSAqTENhc3QgPSBCdWlsZGVyLT5DcmVhdGVaRXh0KExIUywgQ0kuZ2V0VHlwZSgpKTsKKyAgICAgIFZhbHVlICpSQ2FzdCA9IEJ1aWxkZXItPkNyZWF0ZVpFeHQoUkhTLCBDSS5nZXRUeXBlKCkpOworICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoSW5zdHJ1Y3Rpb246Ok9yLCBMQ2FzdCwgUkNhc3QpOworICAgIH0KKyAgfQorCisgIC8vIHpleHQodHJ1bmModCkgJiBDKSAtPiAodCAmIHpleHQoQykpLgorICBpZiAoU3JjSSAmJiBTcmNJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kICYmIFNyY0ktPmhhc09uZVVzZSgpKQorICAgIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihTcmNJLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIGlmIChUcnVuY0luc3QgKlRJID0gZHluX2Nhc3Q8VHJ1bmNJbnN0PihTcmNJLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgICBWYWx1ZSAqVEkwID0gVEktPmdldE9wZXJhbmQoMCk7CisgICAgICAgIGlmIChUSTAtPmdldFR5cGUoKSA9PSBDSS5nZXRUeXBlKCkpCisgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKFRJMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRaRXh0KEMsIENJLmdldFR5cGUoKSkpOworICAgICAgfQorCisgIC8vIHpleHQoKHRydW5jKHQpICYgQykgXiBDKSAtPiAoKHQgJiB6ZXh0KEMpKSBeIHpleHQoQykpLgorICBpZiAoU3JjSSAmJiBTcmNJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6WG9yICYmIFNyY0ktPmhhc09uZVVzZSgpKQorICAgIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihTcmNJLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIGlmIChCaW5hcnlPcGVyYXRvciAqQW5kID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KFNyY0ktPmdldE9wZXJhbmQoMCkpKQorICAgICAgICBpZiAoQW5kLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kICYmIEFuZC0+aGFzT25lVXNlKCkgJiYKKyAgICAgICAgICAgIEFuZC0+Z2V0T3BlcmFuZCgxKSA9PSBDKQorICAgICAgICAgIGlmIChUcnVuY0luc3QgKlRJID0gZHluX2Nhc3Q8VHJ1bmNJbnN0PihBbmQtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgICAgICBWYWx1ZSAqVEkwID0gVEktPmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgICBpZiAoVEkwLT5nZXRUeXBlKCkgPT0gQ0kuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgIENvbnN0YW50ICpaQyA9IENvbnN0YW50RXhwcjo6Z2V0WkV4dChDLCBDSS5nZXRUeXBlKCkpOworICAgICAgICAgICAgICBWYWx1ZSAqTmV3QW5kID0gQnVpbGRlci0+Q3JlYXRlQW5kKFRJMCwgWkMpOworICAgICAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcihOZXdBbmQsIFpDKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgLy8gemV4dCAoeG9yIGkxIFgsIHRydWUpIHRvIGkzMiAgLS0+IHhvciAoemV4dCBpMSBYIHRvIGkzMiksIDEKKyAgVmFsdWUgKlg7CisgIGlmIChTcmNJICYmIFNyY0ktPmhhc09uZVVzZSgpICYmIFNyY0ktPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoMSkgJiYKKyAgICAgIG1hdGNoKFNyY0ksIG1fTm90KG1fVmFsdWUoWCkpKSAmJgorICAgICAgKCFYLT5oYXNPbmVVc2UoKSB8fCAhaXNhPENtcEluc3Q+KFgpKSkgeworICAgIFZhbHVlICpOZXcgPSBCdWlsZGVyLT5DcmVhdGVaRXh0KFgsIENJLmdldFR5cGUoKSk7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVYb3IoTmV3LCBDb25zdGFudEludDo6Z2V0KENJLmdldFR5cGUoKSwgMSkpOworICB9CisgIAorICByZXR1cm4gMDsKK30KKworLy8vIENhbkV2YWx1YXRlU0V4dGQgLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gdGFrZSB0aGUgc3BlY2lmaWVkIHZhbHVlCisvLy8gYW5kIHJldHVybiBpdCBhcyB0eXBlIFR5IHdpdGhvdXQgaW5zZXJ0aW5nIGFueSBuZXcgY2FzdHMgYW5kIHdpdGhvdXQKKy8vLyBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBsb3cgYml0cy4gIFRoaXMgaXMgdXNlZCBieSBjb2RlIHRoYXQgdHJpZXMKKy8vLyB0byBwcm9tb3RlIGludGVnZXIgb3BlcmF0aW9ucyB0byBhIHdpZGVyIHR5cGVzIHdpbGwgYWxsb3cgdXMgdG8gZWxpbWluYXRlCisvLy8gdGhlIGV4dGVuc2lvbi4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gd29ya3Mgb24gYm90aCB2ZWN0b3JzIGFuZCBzY2FsYXJzLgorLy8vCitzdGF0aWMgYm9vbCBDYW5FdmFsdWF0ZVNFeHRkKFZhbHVlICpWLCBjb25zdCBUeXBlICpUeSkgeworICBhc3NlcnQoVi0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPCBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpICYmCisgICAgICAgICAiQ2FuJ3Qgc2lnbiBleHRlbmQgdHlwZSB0byBhIHNtYWxsZXIgdHlwZSIpOworICAvLyBJZiB0aGlzIGlzIGEgY29uc3RhbnQsIGl0IGNhbiBiZSB0cml2aWFsbHkgcHJvbW90ZWQuCisgIGlmIChpc2E8Q29uc3RhbnQ+KFYpKQorICAgIHJldHVybiB0cnVlOworICAKKyAgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVik7CisgIGlmICghSSkgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gSWYgdGhpcyBpcyBhIHRydW5jYXRlIGZyb20gdGhlIGRlc3QgdHlwZSwgd2UgY2FuIHRyaXZpYWxseSBlbGltaW5hdGUgaXQsCisgIC8vIGV2ZW4gaWYgaXQgaGFzIG11bHRpcGxlIHVzZXMuCisgIC8vIEZJWE1FOiBUaGlzIGlzIGN1cnJlbnRseSBkaXNhYmxlZCB1bnRpbCBjb2RlZ2VuIGNhbiBoYW5kbGUgdGhpcyB3aXRob3V0CisgIC8vIHBlc3NpbWl6aW5nIGNvZGUsIFBSNTk5Ny4KKyAgaWYgKDAgJiYgaXNhPFRydW5jSW5zdD4oSSkgJiYgSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IFR5KQorICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gV2UgY2FuJ3QgZXh0ZW5kIG9yIHNocmluayBzb21ldGhpbmcgdGhhdCBoYXMgbXVsdGlwbGUgdXNlczogZG9pbmcgc28gd291bGQKKyAgLy8gcmVxdWlyZSBkdXBsaWNhdGluZyB0aGUgaW5zdHJ1Y3Rpb24gaW4gZ2VuZXJhbCwgd2hpY2ggaXNuJ3QgcHJvZml0YWJsZS4KKyAgaWYgKCFJLT5oYXNPbmVVc2UoKSkgcmV0dXJuIGZhbHNlOworCisgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDogIC8vIHNleHQoc2V4dCh4KSkgLT4gc2V4dCh4KQorICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OiAgLy8gc2V4dCh6ZXh0KHgpKSAtPiB6ZXh0KHgpCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOiAvLyBzZXh0KHRydW5jKHgpKSAtPiB0cnVuYyh4KSBvciBzZXh0KHgpCisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICBjYXNlIEluc3RydWN0aW9uOjpTdWI6CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDoKKyAgICAvLyBUaGVzZSBvcGVyYXRvcnMgY2FuIGFsbCBhcmJpdHJhcmlseSBiZSBleHRlbmRlZCBpZiB0aGVpciBpbnB1dHMgY2FuLgorICAgIHJldHVybiBDYW5FdmFsdWF0ZVNFeHRkKEktPmdldE9wZXJhbmQoMCksIFR5KSAmJgorICAgICAgICAgICBDYW5FdmFsdWF0ZVNFeHRkKEktPmdldE9wZXJhbmQoMSksIFR5KTsKKyAgICAgIAorICAvL2Nhc2UgSW5zdHJ1Y3Rpb246OlNobDogICBUT0RPCisgIC8vY2FzZSBJbnN0cnVjdGlvbjo6TFNocjogIFRPRE8KKyAgICAgIAorICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6CisgICAgcmV0dXJuIENhbkV2YWx1YXRlU0V4dGQoSS0+Z2V0T3BlcmFuZCgxKSwgVHkpICYmCisgICAgICAgICAgIENhbkV2YWx1YXRlU0V4dGQoSS0+Z2V0T3BlcmFuZCgyKSwgVHkpOworICAgICAgCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlBISTogeworICAgIC8vIFdlIGNhbiBjaGFuZ2UgYSBwaGkgaWYgd2UgY2FuIGNoYW5nZSBhbGwgb3BlcmFuZHMuICBOb3RlIHRoYXQgd2UgbmV2ZXIKKyAgICAvLyBnZXQgaW50byB0cm91YmxlIHdpdGggY3ljbGljIFBISXMgaGVyZSBiZWNhdXNlIHdlIG9ubHkgY29uc2lkZXIKKyAgICAvLyBpbnN0cnVjdGlvbnMgd2l0aCBhIHNpbmdsZSB1c2UuCisgICAgUEhJTm9kZSAqUE4gPSBjYXN0PFBISU5vZGU+KEkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoIUNhbkV2YWx1YXRlU0V4dGQoUE4tPmdldEluY29taW5nVmFsdWUoaSksIFR5KSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGRlZmF1bHQ6CisgICAgLy8gVE9ETzogQ2FuIGhhbmRsZSBtb3JlIGNhc2VzIGhlcmUuCisgICAgYnJlYWs7CisgIH0KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRTRXh0KFNFeHRJbnN0ICZDSSkgeworICAvLyBJZiB0aGlzIHNpZ24gZXh0ZW5kIGlzIG9ubHkgdXNlZCBieSBhIHRydW5jYXRlLCBsZXQgdGhlIHRydW5jYXRlIGJ5CisgIC8vIGVsaW1pbmF0ZWQgYmVmb3JlIHdlIHRyeSB0byBvcHRpbWl6ZSB0aGlzIHpleHQuCisgIGlmIChDSS5oYXNPbmVVc2UoKSAmJiBpc2E8VHJ1bmNJbnN0PihDSS51c2VfYmFjaygpKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGNvbW1vbkNhc3RUcmFuc2Zvcm1zKENJKSkKKyAgICByZXR1cm4gSTsKKyAgCisgIC8vIFNlZSBpZiB3ZSBjYW4gc2ltcGxpZnkgYW55IGluc3RydWN0aW9ucyB1c2VkIGJ5IHRoZSBpbnB1dCB3aG9zZSBzb2xlIAorICAvLyBwdXJwb3NlIGlzIHRvIGNvbXB1dGUgYml0cyB3ZSBkb24ndCBjYXJlIGFib3V0LgorICBpZiAoU2ltcGxpZnlEZW1hbmRlZEluc3RydWN0aW9uQml0cyhDSSkpCisgICAgcmV0dXJuICZDSTsKKyAgCisgIFZhbHVlICpTcmMgPSBDSS5nZXRPcGVyYW5kKDApOworICBjb25zdCBUeXBlICpTcmNUeSA9IFNyYy0+Z2V0VHlwZSgpLCAqRGVzdFR5ID0gQ0kuZ2V0VHlwZSgpOworCisgIC8vIEF0dGVtcHQgdG8gZXh0ZW5kIHRoZSBlbnRpcmUgaW5wdXQgZXhwcmVzc2lvbiB0cmVlIHRvIHRoZSBkZXN0aW5hdGlvbgorICAvLyB0eXBlLiAgIE9ubHkgZG8gdGhpcyBpZiB0aGUgZGVzdCB0eXBlIGlzIGEgc2ltcGxlIHR5cGUsIGRvbid0IGNvbnZlcnQgdGhlCisgIC8vIGV4cHJlc3Npb24gdHJlZSB0byBzb21ldGhpbmcgd2VpcmQgbGlrZSBpOTMgdW5sZXNzIHRoZSBzb3VyY2UgaXMgYWxzbworICAvLyBzdHJhbmdlLgorICBpZiAoKERlc3RUeS0+aXNWZWN0b3JUeSgpIHx8IFNob3VsZENoYW5nZVR5cGUoU3JjVHksIERlc3RUeSkpICYmCisgICAgICBDYW5FdmFsdWF0ZVNFeHRkKFNyYywgRGVzdFR5KSkgeworICAgIC8vIE9rYXksIHdlIGNhbiB0cmFuc2Zvcm0gdGhpcyEgIEluc2VydCB0aGUgbmV3IGV4cHJlc3Npb24gbm93LgorICAgIERFQlVHKGRiZ3MoKSA8PCAiSUNFOiBFdmFsdWF0ZUluRGlmZmVyZW50VHlwZSBjb252ZXJ0aW5nIGV4cHJlc3Npb24gdHlwZSIKKyAgICAgICAgICAiIHRvIGF2b2lkIHNpZ24gZXh0ZW5kOiAiIDw8IENJKTsKKyAgICBWYWx1ZSAqUmVzID0gRXZhbHVhdGVJbkRpZmZlcmVudFR5cGUoU3JjLCBEZXN0VHksIHRydWUpOworICAgIGFzc2VydChSZXMtPmdldFR5cGUoKSA9PSBEZXN0VHkpOworCisgICAgdWludDMyX3QgU3JjQml0U2l6ZSA9IFNyY1R5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgdWludDMyX3QgRGVzdEJpdFNpemUgPSBEZXN0VHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKworICAgIC8vIElmIHRoZSBoaWdoIGJpdHMgYXJlIGFscmVhZHkgZmlsbGVkIHdpdGggc2lnbiBiaXQsIGp1c3QgcmVwbGFjZSB0aGlzCisgICAgLy8gY2FzdCB3aXRoIHRoZSByZXN1bHQuCisgICAgaWYgKENvbXB1dGVOdW1TaWduQml0cyhSZXMpID4gRGVzdEJpdFNpemUgLSBTcmNCaXRTaXplKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoQ0ksIFJlcyk7CisgICAgCisgICAgLy8gV2UgbmVlZCB0byBlbWl0IGEgc2hsICsgYXNociB0byBkbyB0aGUgc2lnbiBleHRlbmQuCisgICAgVmFsdWUgKlNoQW10ID0gQ29uc3RhbnRJbnQ6OmdldChEZXN0VHksIERlc3RCaXRTaXplLVNyY0JpdFNpemUpOworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQVNocihCdWlsZGVyLT5DcmVhdGVTaGwoUmVzLCBTaEFtdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoQW10KTsKKyAgfQorCisgIC8vIElmIHRoaXMgaW5wdXQgaXMgYSB0cnVuYyBmcm9tIG91ciBkZXN0aW5hdGlvbiwgdGhlbiB0dXJuIHNleHQodHJ1bmMoeCkpCisgIC8vIGludG8gc2hpZnRzLgorICBpZiAoVHJ1bmNJbnN0ICpUSSA9IGR5bl9jYXN0PFRydW5jSW5zdD4oU3JjKSkKKyAgICBpZiAoVEktPmhhc09uZVVzZSgpICYmIFRJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgPT0gRGVzdFR5KSB7CisgICAgICB1aW50MzJfdCBTcmNCaXRTaXplID0gU3JjVHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgIHVpbnQzMl90IERlc3RCaXRTaXplID0gRGVzdFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICAKKyAgICAgIC8vIFdlIG5lZWQgdG8gZW1pdCBhIHNobCArIGFzaHIgdG8gZG8gdGhlIHNpZ24gZXh0ZW5kLgorICAgICAgVmFsdWUgKlNoQW10ID0gQ29uc3RhbnRJbnQ6OmdldChEZXN0VHksIERlc3RCaXRTaXplLVNyY0JpdFNpemUpOworICAgICAgVmFsdWUgKlJlcyA9IEJ1aWxkZXItPkNyZWF0ZVNobChUSS0+Z2V0T3BlcmFuZCgwKSwgU2hBbXQpOworICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBU2hyKFJlcywgU2hBbXQpOworICAgIH0KKyAgCisgIAorICAvLyAoeCA8cyAwKSA/IC0xIDogMCAtPiBhc2hyIHgsIDMxICAgLT4gYWxsIG9uZXMgaWYgc2lnbmVkCisgIC8vICh4ID5zIC0xKSA/IC0xIDogMCAtPiBhc2hyIHgsIDMxICAtPiBhbGwgb25lcyBpZiBub3Qgc2lnbmVkCisgIHsKKyAgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkOyBWYWx1ZSAqQ21wTEhTOyBDb25zdGFudEludCAqQ21wUkhTOworICBpZiAobWF0Y2goU3JjLCBtX0lDbXAoUHJlZCwgbV9WYWx1ZShDbXBMSFMpLCBtX0NvbnN0YW50SW50KENtcFJIUykpKSkgeworICAgIC8vIHNleHQgKHggPHMgIDApIHRvIGkzMiAtLT4geD4+czMxICAgICAgIHRydWUgaWYgc2lnbmJpdCBzZXQuCisgICAgLy8gc2V4dCAoeCA+cyAtMSkgdG8gaTMyIC0tPiAoeD4+czMxKV4tMSAgdHJ1ZSBpZiBzaWduYml0IGNsZWFyLgorICAgIGlmICgoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TTFQgJiYgQ21wUkhTLT5pc1plcm8oKSkgfHwKKyAgICAgICAgKFByZWQgPT0gSUNtcEluc3Q6OklDTVBfU0dUICYmIENtcFJIUy0+aXNBbGxPbmVzVmFsdWUoKSkpIHsKKyAgICAgIFZhbHVlICpTaCA9IENvbnN0YW50SW50OjpnZXQoQ21wTEhTLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENtcExIUy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCktMSk7CisgICAgICBWYWx1ZSAqSW4gPSBCdWlsZGVyLT5DcmVhdGVBU2hyKENtcExIUywgU2gpOworICAgICAgaWYgKEluLT5nZXRUeXBlKCkgIT0gQ0kuZ2V0VHlwZSgpKQorICAgICAgICBJbiA9IEJ1aWxkZXItPkNyZWF0ZUludENhc3QoSW4sIENJLmdldFR5cGUoKSwgdHJ1ZS8qU0V4dCovKTsKKyAgICAgIAorICAgICAgaWYgKFByZWQgPT0gSUNtcEluc3Q6OklDTVBfU0dUKQorICAgICAgICBJbiA9IEJ1aWxkZXItPkNyZWF0ZU5vdChJbik7CisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChDSSwgSW4pOworICAgIH0KKyAgfQorICB9CisgIAorICAKKyAgLy8gSWYgdGhlIGlucHV0IGlzIGEgc2hsL2FzaHIgcGFpciBvZiBhIHNhbWUgY29uc3RhbnQsIHRoZW4gdGhpcyBpcyBhIHNpZ24KKyAgLy8gZXh0ZW5zaW9uIGZyb20gYSBzbWFsbGVyIHZhbHVlLiAgSWYgd2UgY291bGQgdHJ1c3QgYXJiaXRyYXJ5IGJpdHdpZHRoCisgIC8vIGludGVnZXJzLCB3ZSBjb3VsZCB0dXJuIHRoaXMgaW50byBhIHRydW5jYXRlIHRvIHRoZSBzbWFsbGVyIGJpdCBhbmQgdGhlbgorICAvLyB1c2UgYSBzZXh0IGZvciB0aGUgd2hvbGUgZXh0ZW5zaW9uLiAgU2luY2Ugd2UgZG9uJ3QsIGxvb2sgZGVlcGVyIGFuZCBjaGVjaworICAvLyBmb3IgYSB0cnVuY2F0ZS4gIElmIHRoZSBzb3VyY2UgYW5kIGRlc3QgYXJlIHRoZSBzYW1lIHR5cGUsIGVsaW1pbmF0ZSB0aGUKKyAgLy8gdHJ1bmMgYW5kIGV4dGVuZCBhbmQganVzdCBkbyBzaGlmdHMuICBGb3IgZXhhbXBsZSwgdHVybjoKKyAgLy8gICAlYSA9IHRydW5jIGkzMiAlaSB0byBpOAorICAvLyAgICViID0gc2hsIGk4ICVhLCA2CisgIC8vICAgJWMgPSBhc2hyIGk4ICViLCA2CisgIC8vICAgJWQgPSBzZXh0IGk4ICVjIHRvIGkzMgorICAvLyBpbnRvOgorICAvLyAgICVhID0gc2hsIGkzMiAlaSwgMzAKKyAgLy8gICAlZCA9IGFzaHIgaTMyICVhLCAzMAorICBWYWx1ZSAqQSA9IDA7CisgIC8vIFRPRE86IEV2ZW50dWFsbHkgdGhpcyBjb3VsZCBiZSBzdWJzdW1lZCBieSBFdmFsdWF0ZUluRGlmZmVyZW50VHlwZS4KKyAgQ29uc3RhbnRJbnQgKkJBID0gMCwgKkNBID0gMDsKKyAgaWYgKG1hdGNoKFNyYywgbV9BU2hyKG1fU2hsKG1fVHJ1bmMobV9WYWx1ZShBKSksIG1fQ29uc3RhbnRJbnQoQkEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQ29uc3RhbnRJbnQoQ0EpKSkgJiYKKyAgICAgIEJBID09IENBICYmIEEtPmdldFR5cGUoKSA9PSBDSS5nZXRUeXBlKCkpIHsKKyAgICB1bnNpZ25lZCBNaWRTaXplID0gU3JjLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICB1bnNpZ25lZCBTcmNEc3RTaXplID0gQ0kuZ2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgdW5zaWduZWQgU2hBbXQgPSBDQS0+Z2V0WkV4dFZhbHVlKCkrU3JjRHN0U2l6ZS1NaWRTaXplOworICAgIENvbnN0YW50ICpTaEFtdFYgPSBDb25zdGFudEludDo6Z2V0KENJLmdldFR5cGUoKSwgU2hBbXQpOworICAgIEEgPSBCdWlsZGVyLT5DcmVhdGVTaGwoQSwgU2hBbXRWKTsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFTaHIoQSwgU2hBbXRWKTsKKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKKworLy8vIEZpdHNJbkZQVHlwZSAtIFJldHVybiBhIENvbnN0YW50KiBmb3IgdGhlIHNwZWNpZmllZCBGUCBjb25zdGFudCBpZiBpdCBmaXRzCisvLy8gaW4gdGhlIHNwZWNpZmllZCBGUCB0eXBlIHdpdGhvdXQgY2hhbmdpbmcgaXRzIHZhbHVlLgorc3RhdGljIENvbnN0YW50ICpGaXRzSW5GUFR5cGUoQ29uc3RhbnRGUCAqQ0ZQLCBjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSkgeworICBib29sIGxvc2VzSW5mbzsKKyAgQVBGbG9hdCBGID0gQ0ZQLT5nZXRWYWx1ZUFQRigpOworICAodm9pZClGLmNvbnZlcnQoU2VtLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuLCAmbG9zZXNJbmZvKTsKKyAgaWYgKCFsb3Nlc0luZm8pCisgICAgcmV0dXJuIENvbnN0YW50RlA6OmdldChDRlAtPmdldENvbnRleHQoKSwgRik7CisgIHJldHVybiAwOworfQorCisvLy8gTG9va1Rocm91Z2hGUEV4dGVuc2lvbnMgLSBJZiB0aGlzIGlzIGFuIGZwIGV4dGVuc2lvbiBpbnN0cnVjdGlvbiwgbG9vaworLy8vIHRocm91Z2ggaXQgdW50aWwgd2UgZ2V0IHRoZSBzb3VyY2UgdmFsdWUuCitzdGF0aWMgVmFsdWUgKkxvb2tUaHJvdWdoRlBFeHRlbnNpb25zKFZhbHVlICpWKSB7CisgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkKKyAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZQRXh0KQorICAgICAgcmV0dXJuIExvb2tUaHJvdWdoRlBFeHRlbnNpb25zKEktPmdldE9wZXJhbmQoMCkpOworICAKKyAgLy8gSWYgdGhpcyB2YWx1ZSBpcyBhIGNvbnN0YW50LCByZXR1cm4gdGhlIGNvbnN0YW50IGluIHRoZSBzbWFsbGVzdCBGUCB0eXBlCisgIC8vIHRoYXQgY2FuIGFjY3VyYXRlbHkgcmVwcmVzZW50IGl0LiAgVGhpcyBhbGxvd3MgdXMgdG8gdHVybgorICAvLyAoZmxvYXQpKChkb3VibGUpWCsyLjApIGludG8geCsyLjBmLgorICBpZiAoQ29uc3RhbnRGUCAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oVikpIHsKKyAgICBpZiAoQ0ZQLT5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0UFBDX0ZQMTI4VHkoVi0+Z2V0Q29udGV4dCgpKSkKKyAgICAgIHJldHVybiBWOyAgLy8gTm8gY29uc3RhbnQgZm9sZGluZyBvZiB0aGlzLgorICAgIC8vIFNlZSBpZiB0aGUgdmFsdWUgY2FuIGJlIHRydW5jYXRlZCB0byBmbG9hdCBhbmQgdGhlbiByZWV4dGVuZGVkLgorICAgIGlmIChWYWx1ZSAqViA9IEZpdHNJbkZQVHlwZShDRlAsIEFQRmxvYXQ6OklFRUVzaW5nbGUpKQorICAgICAgcmV0dXJuIFY7CisgICAgaWYgKENGUC0+Z2V0VHlwZSgpLT5pc0RvdWJsZVR5KCkpCisgICAgICByZXR1cm4gVjsgIC8vIFdvbid0IHNocmluay4KKyAgICBpZiAoVmFsdWUgKlYgPSBGaXRzSW5GUFR5cGUoQ0ZQLCBBUEZsb2F0OjpJRUVFZG91YmxlKSkKKyAgICAgIHJldHVybiBWOworICAgIC8vIERvbid0IHRyeSB0byBzaHJpbmsgdG8gdmFyaW91cyBsb25nIGRvdWJsZSB0eXBlcy4KKyAgfQorICAKKyAgcmV0dXJuIFY7Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0RlBUcnVuYyhGUFRydW5jSW5zdCAmQ0kpIHsKKyAgaWYgKEluc3RydWN0aW9uICpJID0gY29tbW9uQ2FzdFRyYW5zZm9ybXMoQ0kpKQorICAgIHJldHVybiBJOworICAKKyAgLy8gSWYgd2UgaGF2ZSBmcHRydW5jKGZhZGQgKGZwZXh0ZW5kIHgpLCAoZnBleHRlbmQgeSkpLCB3aGVyZSB4IGFuZCB5IGFyZQorICAvLyBzbWFsbGVyIHRoYW4gdGhlIGRlc3RpbmF0aW9uIHR5cGUsIHdlIGNhbiBlbGltaW5hdGUgdGhlIHRydW5jYXRlIGJ5IGRvaW5nCisgIC8vIHRoZSBhZGQgYXMgdGhlIHNtYWxsZXIgdHlwZS4gIFRoaXMgYXBwbGllcyB0byBmYWRkL2ZzdWIvZm11bC9mZGl2IGFzIHdlbGwKKyAgLy8gYXMgbWFueSBidWlsdGlucyAoc3FydCwgZXRjKS4KKyAgQmluYXJ5T3BlcmF0b3IgKk9wSSA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihDSS5nZXRPcGVyYW5kKDApKTsKKyAgaWYgKE9wSSAmJiBPcEktPmhhc09uZVVzZSgpKSB7CisgICAgc3dpdGNoIChPcEktPmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RkFkZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGU3ViOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZNdWw6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RkRpdjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUmVtOgorICAgICAgY29uc3QgVHlwZSAqU3JjVHkgPSBPcEktPmdldFR5cGUoKTsKKyAgICAgIFZhbHVlICpMSFNUcnVuYyA9IExvb2tUaHJvdWdoRlBFeHRlbnNpb25zKE9wSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICBWYWx1ZSAqUkhTVHJ1bmMgPSBMb29rVGhyb3VnaEZQRXh0ZW5zaW9ucyhPcEktPmdldE9wZXJhbmQoMSkpOworICAgICAgaWYgKExIU1RydW5jLT5nZXRUeXBlKCkgIT0gU3JjVHkgJiYgCisgICAgICAgICAgUkhTVHJ1bmMtPmdldFR5cGUoKSAhPSBTcmNUeSkgeworICAgICAgICB1bnNpZ25lZCBEc3RTaXplID0gQ0kuZ2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICAgIC8vIElmIHRoZSBzb3VyY2UgdHlwZXMgd2VyZSBib3RoIHNtYWxsZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gdHlwZSBvZgorICAgICAgICAvLyB0aGUgY2FzdCwgZG8gdGhpcyB4Zm9ybS4KKyAgICAgICAgaWYgKExIU1RydW5jLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKSA8PSBEc3RTaXplICYmCisgICAgICAgICAgICBSSFNUcnVuYy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPD0gRHN0U2l6ZSkgeworICAgICAgICAgIExIU1RydW5jID0gQnVpbGRlci0+Q3JlYXRlRlBFeHQoTEhTVHJ1bmMsIENJLmdldFR5cGUoKSk7CisgICAgICAgICAgUkhTVHJ1bmMgPSBCdWlsZGVyLT5DcmVhdGVGUEV4dChSSFNUcnVuYywgQ0kuZ2V0VHlwZSgpKTsKKyAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShPcEktPmdldE9wY29kZSgpLCBMSFNUcnVuYywgUkhTVHJ1bmMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsgIAorICAgIH0KKyAgfQorICAKKyAgLy8gRm9sZCAoZnB0cnVuYyAoc3FydCAoZnBleHQgeCkpKSAtPiAoc3FydGYgeCkKKyAgLy8gTk9URTogVGhpcyBzaG91bGQgYmUgZGlzYWJsZWQgYnkgLWZuby1idWlsdGluLXNxcnQgaWYgd2UgZXZlciBzdXBwb3J0IGl0LgorICBDYWxsSW5zdCAqQ2FsbCA9IGR5bl9jYXN0PENhbGxJbnN0PihDSS5nZXRPcGVyYW5kKDApKTsKKyAgaWYgKENhbGwgJiYgQ2FsbC0+Z2V0Q2FsbGVkRnVuY3Rpb24oKSAmJgorICAgICAgQ2FsbC0+Z2V0Q2FsbGVkRnVuY3Rpb24oKS0+Z2V0TmFtZSgpID09ICJzcXJ0IiAmJgorICAgICAgQ2FsbC0+Z2V0TnVtQXJnT3BlcmFuZHMoKSA9PSAxKSB7CisgICAgQ2FzdEluc3QgKkFyZyA9IGR5bl9jYXN0PENhc3RJbnN0PihDYWxsLT5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICBpZiAoQXJnICYmIEFyZy0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZQRXh0ICYmCisgICAgICAgIENJLmdldFR5cGUoKS0+aXNGbG9hdFR5KCkgJiYKKyAgICAgICAgQ2FsbC0+Z2V0VHlwZSgpLT5pc0RvdWJsZVR5KCkgJiYKKyAgICAgICAgQXJnLT5nZXRUeXBlKCktPmlzRG91YmxlVHkoKSAmJgorICAgICAgICBBcmctPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+aXNGbG9hdFR5KCkpIHsKKyAgICAgIEZ1bmN0aW9uICpDYWxsZWUgPSBDYWxsLT5nZXRDYWxsZWRGdW5jdGlvbigpOworICAgICAgTW9kdWxlICpNID0gQ0kuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICAgIENvbnN0YW50KiBTcXJ0ZkZ1bmMgPSBNLT5nZXRPckluc2VydEZ1bmN0aW9uKCJzcXJ0ZiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGVlLT5nZXRBdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLT5nZXRGbG9hdFR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLT5nZXRGbG9hdFR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIENhbGxJbnN0ICpyZXQgPSBDYWxsSW5zdDo6Q3JlYXRlKFNxcnRmRnVuYywgQXJnLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNxcnRmY2FsbCIpOworICAgICAgcmV0LT5zZXRBdHRyaWJ1dGVzKENhbGxlZS0+Z2V0QXR0cmlidXRlcygpKTsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisgIAorICByZXR1cm4gMDsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRGUEV4dChDYXN0SW5zdCAmQ0kpIHsKKyAgcmV0dXJuIGNvbW1vbkNhc3RUcmFuc2Zvcm1zKENJKTsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRGUFRvVUkoRlBUb1VJSW5zdCAmRkkpIHsKKyAgSW5zdHJ1Y3Rpb24gKk9wSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihGSS5nZXRPcGVyYW5kKDApKTsKKyAgaWYgKE9wSSA9PSAwKQorICAgIHJldHVybiBjb21tb25DYXN0VHJhbnNmb3JtcyhGSSk7CisKKyAgLy8gZnB0b3VpKHVpdG9mcChYKSkgLS0+IFgKKyAgLy8gZnB0b3VpKHNpdG9mcChYKSkgLS0+IFgKKyAgLy8gVGhpcyBpcyBzYWZlIGlmIHRoZSBpbnRlcm1lZGlhdGUgdHlwZSBoYXMgZW5vdWdoIGJpdHMgaW4gaXRzIG1hbnRpc3NhIHRvCisgIC8vIGFjY3VyYXRlbHkgcmVwcmVzZW50IGFsbCB2YWx1ZXMgb2YgWC4gIEZvciBleGFtcGxlLCBkbyBub3QgZG8gdGhpcyB3aXRoCisgIC8vIGk2NC0+ZmxvYXQtPmk2NC4gIFRoaXMgaXMgYWxzbyBzYWZlIGZvciBzaXRvZnAgY2FzZSwgYmVjYXVzZSBhbnkgbmVnYXRpdmUKKyAgLy8gJ1gnIHZhbHVlIHdvdWxkIGNhdXNlIGFuIHVuZGVmaW5lZCByZXN1bHQgZm9yIHRoZSBmcHRvdWkuIAorICBpZiAoKGlzYTxVSVRvRlBJbnN0PihPcEkpIHx8IGlzYTxTSVRvRlBJbnN0PihPcEkpKSAmJgorICAgICAgT3BJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgPT0gRkkuZ2V0VHlwZSgpICYmCisgICAgICAoaW50KUZJLmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpIDwgLypleHRyYSBiaXQgZm9yIHNpZ24gKi8KKyAgICAgICAgICAgICAgICAgICAgT3BJLT5nZXRUeXBlKCktPmdldEZQTWFudGlzc2FXaWR0aCgpKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEZJLCBPcEktPmdldE9wZXJhbmQoMCkpOworCisgIHJldHVybiBjb21tb25DYXN0VHJhbnNmb3JtcyhGSSk7Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0RlBUb1NJKEZQVG9TSUluc3QgJkZJKSB7CisgIEluc3RydWN0aW9uICpPcEkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oRkkuZ2V0T3BlcmFuZCgwKSk7CisgIGlmIChPcEkgPT0gMCkKKyAgICByZXR1cm4gY29tbW9uQ2FzdFRyYW5zZm9ybXMoRkkpOworICAKKyAgLy8gZnB0b3NpKHNpdG9mcChYKSkgLS0+IFgKKyAgLy8gZnB0b3NpKHVpdG9mcChYKSkgLS0+IFgKKyAgLy8gVGhpcyBpcyBzYWZlIGlmIHRoZSBpbnRlcm1lZGlhdGUgdHlwZSBoYXMgZW5vdWdoIGJpdHMgaW4gaXRzIG1hbnRpc3NhIHRvCisgIC8vIGFjY3VyYXRlbHkgcmVwcmVzZW50IGFsbCB2YWx1ZXMgb2YgWC4gIEZvciBleGFtcGxlLCBkbyBub3QgZG8gdGhpcyB3aXRoCisgIC8vIGk2NC0+ZmxvYXQtPmk2NC4gIFRoaXMgaXMgYWxzbyBzYWZlIGZvciBzaXRvZnAgY2FzZSwgYmVjYXVzZSBhbnkgbmVnYXRpdmUKKyAgLy8gJ1gnIHZhbHVlIHdvdWxkIGNhdXNlIGFuIHVuZGVmaW5lZCByZXN1bHQgZm9yIHRoZSBmcHRvdWkuIAorICBpZiAoKGlzYTxVSVRvRlBJbnN0PihPcEkpIHx8IGlzYTxTSVRvRlBJbnN0PihPcEkpKSAmJgorICAgICAgT3BJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgPT0gRkkuZ2V0VHlwZSgpICYmCisgICAgICAoaW50KUZJLmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpIDw9CisgICAgICAgICAgICAgICAgICAgIE9wSS0+Z2V0VHlwZSgpLT5nZXRGUE1hbnRpc3NhV2lkdGgoKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChGSSwgT3BJLT5nZXRPcGVyYW5kKDApKTsKKyAgCisgIHJldHVybiBjb21tb25DYXN0VHJhbnNmb3JtcyhGSSk7Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0VUlUb0ZQKENhc3RJbnN0ICZDSSkgeworICByZXR1cm4gY29tbW9uQ2FzdFRyYW5zZm9ybXMoQ0kpOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdFNJVG9GUChDYXN0SW5zdCAmQ0kpIHsKKyAgcmV0dXJuIGNvbW1vbkNhc3RUcmFuc2Zvcm1zKENJKTsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRJbnRUb1B0cihJbnRUb1B0ckluc3QgJkNJKSB7CisgIC8vIElmIHRoZSBzb3VyY2UgaW50ZWdlciB0eXBlIGlzIG5vdCB0aGUgaW50cHRyX3QgdHlwZSBmb3IgdGhpcyB0YXJnZXQsIGRvIGEKKyAgLy8gdHJ1bmMgb3IgemV4dCB0byB0aGUgaW50cHRyX3QgdHlwZSwgdGhlbiBpbnR0b3B0ciBvZiBpdC4gIFRoaXMgYWxsb3dzIHRoZQorICAvLyBjYXN0IHRvIGJlIGV4cG9zZWQgdG8gb3RoZXIgdHJhbnNmb3Jtcy4KKyAgaWYgKFREKSB7CisgICAgaWYgKENJLmdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpID4KKyAgICAgICAgVEQtPmdldFBvaW50ZXJTaXplSW5CaXRzKCkpIHsKKyAgICAgIFZhbHVlICpQID0gQnVpbGRlci0+Q3JlYXRlVHJ1bmMoQ0kuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEQtPmdldEludFB0clR5cGUoQ0kuZ2V0Q29udGV4dCgpKSk7CisgICAgICByZXR1cm4gbmV3IEludFRvUHRySW5zdChQLCBDSS5nZXRUeXBlKCkpOworICAgIH0KKyAgICBpZiAoQ0kuZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPAorICAgICAgICBURC0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKSkgeworICAgICAgVmFsdWUgKlAgPSBCdWlsZGVyLT5DcmVhdGVaRXh0KENJLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEQtPmdldEludFB0clR5cGUoQ0kuZ2V0Q29udGV4dCgpKSk7CisgICAgICByZXR1cm4gbmV3IEludFRvUHRySW5zdChQLCBDSS5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorICAKKyAgaWYgKEluc3RydWN0aW9uICpJID0gY29tbW9uQ2FzdFRyYW5zZm9ybXMoQ0kpKQorICAgIHJldHVybiBJOworCisgIHJldHVybiAwOworfQorCisvLy8gQGJyaWVmIEltcGxlbWVudCB0aGUgdHJhbnNmb3JtcyBmb3IgY2FzdCBvZiBwb2ludGVyIChiaXRjYXN0L3B0cnRvaW50KQorSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6Y29tbW9uUG9pbnRlckNhc3RUcmFuc2Zvcm1zKENhc3RJbnN0ICZDSSkgeworICBWYWx1ZSAqU3JjID0gQ0kuZ2V0T3BlcmFuZCgwKTsKKyAgCisgIGlmIChHZXRFbGVtZW50UHRySW5zdCAqR0VQID0gZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KFNyYykpIHsKKyAgICAvLyBJZiBjYXN0aW5nIHRoZSByZXN1bHQgb2YgYSBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9uIHdpdGggbm8gb2Zmc2V0LCB0dXJuCisgICAgLy8gdGhpcyBpbnRvIGEgY2FzdCBvZiB0aGUgb3JpZ2luYWwgcG9pbnRlciEKKyAgICBpZiAoR0VQLT5oYXNBbGxaZXJvSW5kaWNlcygpKSB7CisgICAgICAvLyBDaGFuZ2luZyB0aGUgY2FzdCBvcGVyYW5kIGlzIHVzdWFsbHkgbm90IGEgZ29vZCBpZGVhIGJ1dCBpdCBpcyBzYWZlCisgICAgICAvLyBoZXJlIGJlY2F1c2UgdGhlIHBvaW50ZXIgb3BlcmFuZCBpcyBiZWluZyByZXBsYWNlZCB3aXRoIGFub3RoZXIgCisgICAgICAvLyBwb2ludGVyIG9wZXJhbmQgc28gdGhlIG9wY29kZSBkb2Vzbid0IG5lZWQgdG8gY2hhbmdlLgorICAgICAgV29ya2xpc3QuQWRkKEdFUCk7CisgICAgICBDSS5zZXRPcGVyYW5kKDAsIEdFUC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICByZXR1cm4gJkNJOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGUgR0VQIGhhcyBhIHNpbmdsZSB1c2UsIGFuZCB0aGUgYmFzZSBwb2ludGVyIGlzIGEgYml0Y2FzdCwgYW5kIHRoZQorICAgIC8vIEdFUCBjb21wdXRlcyBhIGNvbnN0YW50IG9mZnNldCwgc2VlIGlmIHdlIGNhbiBjb252ZXJ0IHRoZXNlIHRocmVlCisgICAgLy8gaW5zdHJ1Y3Rpb25zIGludG8gZmV3ZXIuICBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdpdGggdW5pb25zIGFuZCBvdGhlcgorICAgIC8vIG5vbi10eXBlLXNhZmUgY29kZS4KKyAgICBpZiAoVEQgJiYgR0VQLT5oYXNPbmVVc2UoKSAmJiBpc2E8Qml0Q2FzdEluc3Q+KEdFUC0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgR0VQLT5oYXNBbGxDb25zdGFudEluZGljZXMoKSkgeworICAgICAgLy8gV2UgYXJlIGd1YXJhbnRlZWQgdG8gZ2V0IGEgY29uc3RhbnQgZnJvbSBFbWl0R0VQT2Zmc2V0LgorICAgICAgQ29uc3RhbnRJbnQgKk9mZnNldFYgPSBjYXN0PENvbnN0YW50SW50PihFbWl0R0VQT2Zmc2V0KEdFUCkpOworICAgICAgaW50NjRfdCBPZmZzZXQgPSBPZmZzZXRWLT5nZXRTRXh0VmFsdWUoKTsKKyAgICAgIAorICAgICAgLy8gR2V0IHRoZSBiYXNlIHBvaW50ZXIgaW5wdXQgb2YgdGhlIGJpdGNhc3QsIGFuZCB0aGUgdHlwZSBpdCBwb2ludHMgdG8uCisgICAgICBWYWx1ZSAqT3JpZ0Jhc2UgPSBjYXN0PEJpdENhc3RJbnN0PihHRVAtPmdldE9wZXJhbmQoMCkpLT5nZXRPcGVyYW5kKDApOworICAgICAgY29uc3QgVHlwZSAqR0VQSWR4VHkgPQorICAgICAgY2FzdDxQb2ludGVyVHlwZT4oT3JpZ0Jhc2UtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IE5ld0luZGljZXM7CisgICAgICBpZiAoRmluZEVsZW1lbnRBdE9mZnNldChHRVBJZHhUeSwgT2Zmc2V0LCBOZXdJbmRpY2VzKSkgeworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGFibGUgdG8gaW5kZXggZG93biBpbnRvIGFuIGVsZW1lbnQsIGNyZWF0ZSB0aGUgR0VQCisgICAgICAgIC8vIGFuZCBiaXRjYXN0IHRoZSByZXN1bHQuICBUaGlzIGVsaW1pbmF0ZXMgb25lIGJpdGNhc3QsIHBvdGVudGlhbGx5CisgICAgICAgIC8vIHR3by4KKyAgICAgICAgVmFsdWUgKk5HRVAgPSBjYXN0PEdFUE9wZXJhdG9yPihHRVApLT5pc0luQm91bmRzKCkgPworICAgICAgICBCdWlsZGVyLT5DcmVhdGVJbkJvdW5kc0dFUChPcmlnQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3SW5kaWNlcy5iZWdpbigpLCBOZXdJbmRpY2VzLmVuZCgpKSA6CisgICAgICAgIEJ1aWxkZXItPkNyZWF0ZUdFUChPcmlnQmFzZSwgTmV3SW5kaWNlcy5iZWdpbigpLCBOZXdJbmRpY2VzLmVuZCgpKTsKKyAgICAgICAgTkdFUC0+dGFrZU5hbWUoR0VQKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpc2E8Qml0Q2FzdEluc3Q+KENJKSkKKyAgICAgICAgICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KE5HRVAsIENJLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydChpc2E8UHRyVG9JbnRJbnN0PihDSSkpOworICAgICAgICByZXR1cm4gbmV3IFB0clRvSW50SW5zdChOR0VQLCBDSS5nZXRUeXBlKCkpOworICAgICAgfSAgICAgIAorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIGNvbW1vbkNhc3RUcmFuc2Zvcm1zKENJKTsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRQdHJUb0ludChQdHJUb0ludEluc3QgJkNJKSB7CisgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpbnRlZ2VyIHR5cGUgaXMgbm90IHRoZSBpbnRwdHJfdCB0eXBlIGZvciB0aGlzIHRhcmdldCwKKyAgLy8gZG8gYSBwdHJ0b2ludCB0byBpbnRwdHJfdCB0aGVuIGRvIGEgdHJ1bmMgb3IgemV4dC4gIFRoaXMgYWxsb3dzIHRoZSBjYXN0CisgIC8vIHRvIGJlIGV4cG9zZWQgdG8gb3RoZXIgdHJhbnNmb3Jtcy4KKyAgaWYgKFREKSB7CisgICAgaWYgKENJLmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpIDwgVEQtPmdldFBvaW50ZXJTaXplSW5CaXRzKCkpIHsKKyAgICAgIFZhbHVlICpQID0gQnVpbGRlci0+Q3JlYXRlUHRyVG9JbnQoQ0kuZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEQtPmdldEludFB0clR5cGUoQ0kuZ2V0Q29udGV4dCgpKSk7CisgICAgICByZXR1cm4gbmV3IFRydW5jSW5zdChQLCBDSS5nZXRUeXBlKCkpOworICAgIH0KKyAgICBpZiAoQ0kuZ2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPiBURC0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKSkgeworICAgICAgVmFsdWUgKlAgPSBCdWlsZGVyLT5DcmVhdGVQdHJUb0ludChDSS5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURC0+Z2V0SW50UHRyVHlwZShDSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgIHJldHVybiBuZXcgWkV4dEluc3QoUCwgQ0kuZ2V0VHlwZSgpKTsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiBjb21tb25Qb2ludGVyQ2FzdFRyYW5zZm9ybXMoQ0kpOworfQorCisvLy8gT3B0aW1pemVWZWN0b3JSZXNpemUgLSBUaGlzIGlucHV0IHZhbHVlICh3aGljaCBpcyBrbm93biB0byBoYXZlIHZlY3RvciB0eXBlKQorLy8vIGlzIGJlaW5nIHplcm8gZXh0ZW5kZWQgb3IgdHJ1bmNhdGVkIHRvIHRoZSBzcGVjaWZpZWQgdmVjdG9yIHR5cGUuICBUcnkgdG8KKy8vLyByZXBsYWNlIGl0IHdpdGggYSBzaHVmZmxlIChhbmQgdmVjdG9yL3ZlY3RvciBiaXRjYXN0KSBpZiBwb3NzaWJsZS4KKy8vLworLy8vIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHZlY3RvciB0eXBlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgZWxlbWVudCB0eXBlcy4KK3N0YXRpYyBJbnN0cnVjdGlvbiAqT3B0aW1pemVWZWN0b3JSZXNpemUoVmFsdWUgKkluVmFsLCBjb25zdCBWZWN0b3JUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RDb21iaW5lciAmSUMpIHsKKyAgLy8gV2UgY2FuIG9ubHkgZG8gdGhpcyBvcHRpbWl6YXRpb24gaWYgdGhlIG91dHB1dCBpcyBhIG11bHRpcGxlIG9mIHRoZSBpbnB1dAorICAvLyBlbGVtZW50IHNpemUsIG9yIHRoZSBpbnB1dCBpcyBhIG11bHRpcGxlIG9mIHRoZSBvdXRwdXQgZWxlbWVudCBzaXplLgorICAvLyBDb252ZXJ0IHRoZSBpbnB1dCB0eXBlIHRvIGhhdmUgdGhlIHNhbWUgZWxlbWVudCB0eXBlIGFzIHRoZSBvdXRwdXQuCisgIGNvbnN0IFZlY3RvclR5cGUgKlNyY1R5ID0gY2FzdDxWZWN0b3JUeXBlPihJblZhbC0+Z2V0VHlwZSgpKTsKKyAgCisgIGlmIChTcmNUeS0+Z2V0RWxlbWVudFR5cGUoKSAhPSBEZXN0VHktPmdldEVsZW1lbnRUeXBlKCkpIHsKKyAgICAvLyBUaGUgaW5wdXQgdHlwZXMgZG9uJ3QgbmVlZCB0byBiZSBpZGVudGljYWwsIGJ1dCBmb3Igbm93IHRoZXkgbXVzdCBiZSB0aGUKKyAgICAvLyBzYW1lIHNpemUuICBUaGVyZSBpcyBubyBzcGVjaWZpYyByZWFzb24gd2UgY291bGRuJ3QgaGFuZGxlIHRoaW5ncyBsaWtlCisgICAgLy8gPDQgeCBpMTY+IC0+IDw0IHggaTMyPiBieSBiaXRjYXN0aW5nIHRvIDwyIHggaTMyPiBidXQgaGF2ZW4ndCBnb3R0ZW4KKyAgICAvLyB0aGVyZSB5ZXQuIAorICAgIGlmIChTcmNUeS0+Z2V0RWxlbWVudFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpICE9CisgICAgICAgIERlc3RUeS0+Z2V0RWxlbWVudFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpKQorICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgU3JjVHkgPSBWZWN0b3JUeXBlOjpnZXQoRGVzdFR5LT5nZXRFbGVtZW50VHlwZSgpLCBTcmNUeS0+Z2V0TnVtRWxlbWVudHMoKSk7CisgICAgSW5WYWwgPSBJQy5CdWlsZGVyLT5DcmVhdGVCaXRDYXN0KEluVmFsLCBTcmNUeSk7CisgIH0KKyAgCisgIC8vIE5vdyB0aGF0IHRoZSBlbGVtZW50IHR5cGVzIG1hdGNoLCBnZXQgdGhlIHNodWZmbGUgbWFzayBhbmQgUkhTIG9mIHRoZQorICAvLyBzaHVmZmxlIHRvIHVzZSwgd2hpY2ggZGVwZW5kcyBvbiB3aGV0aGVyIHdlJ3JlIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUKKyAgLy8gc2l6ZSBvZiB0aGUgaW5wdXQuCisgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgMTY+IFNodWZmbGVNYXNrOworICBWYWx1ZSAqVjI7CisgIGNvbnN0IEludGVnZXJUeXBlICpJbnQzMlR5ID0gVHlwZTo6Z2V0SW50MzJUeShTcmNUeS0+Z2V0Q29udGV4dCgpKTsKKyAgCisgIGlmIChTcmNUeS0+Z2V0TnVtRWxlbWVudHMoKSA+IERlc3RUeS0+Z2V0TnVtRWxlbWVudHMoKSkgeworICAgIC8vIElmIHdlJ3JlIHNocmlua2luZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLCBqdXN0IHNodWZmbGUgaW4gdGhlIGxvdworICAgIC8vIGVsZW1lbnRzIGZyb20gdGhlIGlucHV0IGFuZCB1c2UgdW5kZWYgYXMgdGhlIHNlY29uZCBzaHVmZmxlIGlucHV0LgorICAgIFYyID0gVW5kZWZWYWx1ZTo6Z2V0KFNyY1R5KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVzdFR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkKKyAgICAgIFNodWZmbGVNYXNrLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KEludDMyVHksIGkpKTsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAvLyBJZiB3ZSdyZSBpbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIHNodWZmbGUgaW4gYWxsIG9mIHRoZQorICAgIC8vIGVsZW1lbnRzIGZyb20gSW5WYWwgYW5kIGZpbGwgdGhlIHJlc3Qgb2YgdGhlIHJlc3VsdCBlbGVtZW50cyB3aXRoIHplcm9zCisgICAgLy8gZnJvbSBhIGNvbnN0YW50IHplcm8uCisgICAgVjIgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFNyY1R5KTsKKyAgICB1bnNpZ25lZCBTcmNFbHRzID0gU3JjVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNyY0VsdHM7IGkgIT0gZTsgKytpKQorICAgICAgU2h1ZmZsZU1hc2sucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgaSkpOworCisgICAgLy8gVGhlIGV4Y2VzcyBlbGVtZW50cyByZWZlcmVuY2UgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHplcm8gaW5wdXQuCisgICAgU2h1ZmZsZU1hc2suYXBwZW5kKERlc3RUeS0+Z2V0TnVtRWxlbWVudHMoKS1TcmNFbHRzLAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEludDMyVHksIFNyY0VsdHMpKTsKKyAgfQorICAKKyAgQ29uc3RhbnQgKk1hc2sgPSBDb25zdGFudFZlY3Rvcjo6Z2V0KFNodWZmbGVNYXNrLmRhdGEoKSwgU2h1ZmZsZU1hc2suc2l6ZSgpKTsKKyAgcmV0dXJuIG5ldyBTaHVmZmxlVmVjdG9ySW5zdChJblZhbCwgVjIsIE1hc2spOworfQorCisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0Qml0Q2FzdChCaXRDYXN0SW5zdCAmQ0kpIHsKKyAgLy8gSWYgdGhlIG9wZXJhbmRzIGFyZSBpbnRlZ2VyIHR5cGVkIHRoZW4gYXBwbHkgdGhlIGludGVnZXIgdHJhbnNmb3JtcywKKyAgLy8gb3RoZXJ3aXNlIGp1c3QgYXBwbHkgdGhlIGNvbW1vbiBvbmVzLgorICBWYWx1ZSAqU3JjID0gQ0kuZ2V0T3BlcmFuZCgwKTsKKyAgY29uc3QgVHlwZSAqU3JjVHkgPSBTcmMtPmdldFR5cGUoKTsKKyAgY29uc3QgVHlwZSAqRGVzdFR5ID0gQ0kuZ2V0VHlwZSgpOworCisgIC8vIEdldCByaWQgb2YgY2FzdHMgZnJvbSBvbmUgdHlwZSB0byB0aGUgc2FtZSB0eXBlLiBUaGVzZSBhcmUgdXNlbGVzcyBhbmQgY2FuCisgIC8vIGJlIHJlcGxhY2VkIGJ5IHRoZSBvcGVyYW5kLgorICBpZiAoRGVzdFR5ID09IFNyYy0+Z2V0VHlwZSgpKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKENJLCBTcmMpOworCisgIGlmIChjb25zdCBQb2ludGVyVHlwZSAqRHN0UFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KERlc3RUeSkpIHsKKyAgICBjb25zdCBQb2ludGVyVHlwZSAqU3JjUFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oU3JjVHkpOworICAgIGNvbnN0IFR5cGUgKkRzdEVsVHkgPSBEc3RQVHktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgY29uc3QgVHlwZSAqU3JjRWxUeSA9IFNyY1BUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAKKyAgICAvLyBJZiB0aGUgYWRkcmVzcyBzcGFjZXMgZG9uJ3QgbWF0Y2gsIGRvbid0IGVsaW1pbmF0ZSB0aGUgYml0Y2FzdCwgd2hpY2ggaXMKKyAgICAvLyByZXF1aXJlZCBmb3IgY2hhbmdpbmcgdHlwZXMuCisgICAgaWYgKFNyY1BUeS0+Z2V0QWRkcmVzc1NwYWNlKCkgIT0gRHN0UFR5LT5nZXRBZGRyZXNzU3BhY2UoKSkKKyAgICAgIHJldHVybiAwOworICAgIAorICAgIC8vIElmIHdlIGFyZSBjYXN0aW5nIGEgYWxsb2NhIHRvIGEgcG9pbnRlciB0byBhIHR5cGUgb2YgdGhlIHNhbWUKKyAgICAvLyBzaXplLCByZXdyaXRlIHRoZSBhbGxvY2F0aW9uIGluc3RydWN0aW9uIHRvIGFsbG9jYXRlIHRoZSAicmlnaHQiIHR5cGUuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBtb2RpZnkgbWFsbG9jIGNhbGxzIGJlY2F1c2UgaXQgaXMgdGhlaXIgYml0Y2FzdCB0aGF0CisgICAgLy8gbmVlZHMgdG8gYmUgY2xlYW5lZCB1cC4KKyAgICBpZiAoQWxsb2NhSW5zdCAqQUkgPSBkeW5fY2FzdDxBbGxvY2FJbnN0PihTcmMpKQorICAgICAgaWYgKEluc3RydWN0aW9uICpWID0gUHJvbW90ZUNhc3RPZkFsbG9jYXRpb24oQ0ksICpBSSkpCisgICAgICAgIHJldHVybiBWOworICAgIAorICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBwb2ludGVycywgYW5kIHRoaXMgY2FzdCBpcyBlcXVpdmFsZW50CisgICAgLy8gdG8gYSBnZXRlbGVtZW50cHRyIFgsIDAsIDAsIDAuLi4gIHR1cm4gaXQgaW50byB0aGUgYXBwcm9wcmlhdGUgZ2VwLgorICAgIC8vIFRoaXMgY2FuIGVuaGFuY2UgU1JPQSBhbmQgb3RoZXIgdHJhbnNmb3JtcyB0aGF0IHdhbnQgdHlwZS1zYWZlIHBvaW50ZXJzLgorICAgIENvbnN0YW50ICpaZXJvVUludCA9CisgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDMyVHkoQ0kuZ2V0Q29udGV4dCgpKSk7CisgICAgdW5zaWduZWQgTnVtWmVyb3MgPSAwOworICAgIHdoaWxlIChTcmNFbFR5ICE9IERzdEVsVHkgJiYgCisgICAgICAgICAgIGlzYTxDb21wb3NpdGVUeXBlPihTcmNFbFR5KSAmJiAhU3JjRWxUeS0+aXNQb2ludGVyVHkoKSAmJgorICAgICAgICAgICBTcmNFbFR5LT5nZXROdW1Db250YWluZWRUeXBlcygpIC8qIG5vdCAie30iICovKSB7CisgICAgICBTcmNFbFR5ID0gY2FzdDxDb21wb3NpdGVUeXBlPihTcmNFbFR5KS0+Z2V0VHlwZUF0SW5kZXgoWmVyb1VJbnQpOworICAgICAgKytOdW1aZXJvczsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIHBhdGggZnJvbSB0aGUgc3JjIHRvIGRlc3QsIGNyZWF0ZSB0aGUgZ2V0ZWxlbWVudHB0ciBub3cuCisgICAgaWYgKFNyY0VsVHkgPT0gRHN0RWxUeSkgeworICAgICAgU21hbGxWZWN0b3I8VmFsdWUqLCA4PiBJZHhzKE51bVplcm9zKzEsIFplcm9VSW50KTsKKyAgICAgIHJldHVybiBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMoU3JjLCBJZHhzLmJlZ2luKCksIElkeHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW5zdHJ1Y3Rpb24qKU5VTEwpKTsKKyAgICB9CisgIH0KKworICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqRGVzdFZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KERlc3RUeSkpIHsKKyAgICBpZiAoRGVzdFZUeS0+Z2V0TnVtRWxlbWVudHMoKSA9PSAxICYmICFTcmNUeS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICBWYWx1ZSAqRWxlbSA9IEJ1aWxkZXItPkNyZWF0ZUJpdENhc3QoU3JjLCBEZXN0VlR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICAgIHJldHVybiBJbnNlcnRFbGVtZW50SW5zdDo6Q3JlYXRlKFVuZGVmVmFsdWU6OmdldChEZXN0VHkpLCBFbGVtLAorICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KENJLmdldENvbnRleHQoKSkpKTsKKyAgICAgIC8vIEZJWE1FOiBDYW5vbmljYWxpemUgYml0Y2FzdChpbnNlcnRlbGVtZW50KSAtPiBpbnNlcnRlbGVtZW50KGJpdGNhc3QpCisgICAgfQorICAgIAorICAgIC8vIElmIHRoaXMgaXMgYSBjYXN0IGZyb20gYW4gaW50ZWdlciB0byB2ZWN0b3IsIGNoZWNrIHRvIHNlZSBpZiB0aGUgaW5wdXQKKyAgICAvLyBpcyBhIHRydW5jIG9yIHpleHQgb2YgYSBiaXRjYXN0IGZyb20gdmVjdG9yLiAgSWYgc28sIHdlIGNhbiByZXBsYWNlIGFsbAorICAgIC8vIHRoZSBjYXN0cyB3aXRoIGEgc2h1ZmZsZSBhbmQgKHBvdGVudGlhbGx5KSBhIGJpdGNhc3QuCisgICAgaWYgKGlzYTxJbnRlZ2VyVHlwZT4oU3JjVHkpICYmIChpc2E8VHJ1bmNJbnN0PihTcmMpIHx8IGlzYTxaRXh0SW5zdD4oU3JjKSkpeworICAgICAgQ2FzdEluc3QgKlNyY0Nhc3QgPSBjYXN0PENhc3RJbnN0PihTcmMpOworICAgICAgaWYgKEJpdENhc3RJbnN0ICpCQ0luID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KFNyY0Nhc3QtPmdldE9wZXJhbmQoMCkpKQorICAgICAgICBpZiAoaXNhPFZlY3RvclR5cGU+KEJDSW4tPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkpCisgICAgICAgICAgaWYgKEluc3RydWN0aW9uICpJID0gT3B0aW1pemVWZWN0b3JSZXNpemUoQkNJbi0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxWZWN0b3JUeXBlPihEZXN0VHkpLCAqdGhpcykpCisgICAgICAgICAgICByZXR1cm4gSTsKKyAgICB9CisgIH0KKworICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqU3JjVlR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oU3JjVHkpKSB7CisgICAgaWYgKFNyY1ZUeS0+Z2V0TnVtRWxlbWVudHMoKSA9PSAxICYmICFEZXN0VHktPmlzVmVjdG9yVHkoKSkgeworICAgICAgVmFsdWUgKkVsZW0gPSAKKyAgICAgICAgQnVpbGRlci0+Q3JlYXRlRXh0cmFjdEVsZW1lbnQoU3JjLAorICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0SW50MzJUeShDSS5nZXRDb250ZXh0KCkpKSk7CisgICAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZShJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgRWxlbSwgRGVzdFR5KTsKKyAgICB9CisgIH0KKworICBpZiAoU2h1ZmZsZVZlY3Rvckluc3QgKlNWSSA9IGR5bl9jYXN0PFNodWZmbGVWZWN0b3JJbnN0PihTcmMpKSB7CisgICAgLy8gT2theSwgd2UgaGF2ZSAoYml0Y2FzdCAoc2h1ZmZsZSAuLikpLiAgQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMKKyAgICAvLyBhIGJpdGNhc3QgdG8gYSB2ZWN0b3Igd2l0aCB0aGUgc2FtZSAjIGVsdHMuCisgICAgaWYgKFNWSS0+aGFzT25lVXNlKCkgJiYgRGVzdFR5LT5pc1ZlY3RvclR5KCkgJiYgCisgICAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oRGVzdFR5KS0+Z2V0TnVtRWxlbWVudHMoKSA9PQorICAgICAgICAgICAgICBTVkktPmdldFR5cGUoKS0+Z2V0TnVtRWxlbWVudHMoKSAmJgorICAgICAgICBTVkktPmdldFR5cGUoKS0+Z2V0TnVtRWxlbWVudHMoKSA9PQorICAgICAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oU1ZJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpLT5nZXROdW1FbGVtZW50cygpKSB7CisgICAgICBCaXRDYXN0SW5zdCAqVG1wOworICAgICAgLy8gSWYgZWl0aGVyIG9mIHRoZSBvcGVyYW5kcyBpcyBhIGNhc3QgZnJvbSBDSS5nZXRUeXBlKCksIHRoZW4KKyAgICAgIC8vIGV2YWx1YXRpbmcgdGhlIHNodWZmbGUgaW4gdGhlIGNhc3RlZCBkZXN0aW5hdGlvbidzIHR5cGUgd2lsbCBhbGxvdworICAgICAgLy8gdXMgdG8gZWxpbWluYXRlIGF0IGxlYXN0IG9uZSBjYXN0LgorICAgICAgaWYgKCgoVG1wID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KFNWSS0+Z2V0T3BlcmFuZCgwKSkpICYmIAorICAgICAgICAgICBUbXAtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSA9PSBEZXN0VHkpIHx8CisgICAgICAgICAgKChUbXAgPSBkeW5fY2FzdDxCaXRDYXN0SW5zdD4oU1ZJLT5nZXRPcGVyYW5kKDEpKSkgJiYgCisgICAgICAgICAgIFRtcC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IERlc3RUeSkpIHsKKyAgICAgICAgVmFsdWUgKkxIUyA9IEJ1aWxkZXItPkNyZWF0ZUJpdENhc3QoU1ZJLT5nZXRPcGVyYW5kKDApLCBEZXN0VHkpOworICAgICAgICBWYWx1ZSAqUkhTID0gQnVpbGRlci0+Q3JlYXRlQml0Q2FzdChTVkktPmdldE9wZXJhbmQoMSksIERlc3RUeSk7CisgICAgICAgIC8vIFJldHVybiBhIG5ldyBzaHVmZmxlIHZlY3Rvci4gIFVzZSB0aGUgc2FtZSBlbGVtZW50IElEJ3MsIGFzIHdlCisgICAgICAgIC8vIGtub3cgdGhlIHZlY3RvciB0eXBlcyBtYXRjaCAjZWx0cy4KKyAgICAgICAgcmV0dXJuIG5ldyBTaHVmZmxlVmVjdG9ySW5zdChMSFMsIFJIUywgU1ZJLT5nZXRPcGVyYW5kKDIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIGlmIChTcmNUeS0+aXNQb2ludGVyVHkoKSkKKyAgICByZXR1cm4gY29tbW9uUG9pbnRlckNhc3RUcmFuc2Zvcm1zKENJKTsKKyAgcmV0dXJuIGNvbW1vbkNhc3RUcmFuc2Zvcm1zKENJKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lQ29tcGFyZXMuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVDb21wYXJlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZkM2M1OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lQ29tcGFyZXMuY3BwCkBAIC0wLDAgKzEsMjQ0MiBAQAorLy89PT0tIEluc3RDb21iaW5lQ29tcGFyZXMuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdmlzaXRJQ21wIGFuZCB2aXNpdEZDbXAgZnVuY3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJJbnN0Q29tYmluZS5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvSW5zdHJ1Y3Rpb25TaW1wbGlmeS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29uc3RhbnRSYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdHRlcm5NYXRjaC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBuYW1lc3BhY2UgUGF0dGVybk1hdGNoOworCisvLy8gQWRkT25lIC0gQWRkIG9uZSB0byBhIENvbnN0YW50SW50CitzdGF0aWMgQ29uc3RhbnQgKkFkZE9uZShDb25zdGFudCAqQykgeworICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRBZGQoQywgQ29uc3RhbnRJbnQ6OmdldChDLT5nZXRUeXBlKCksIDEpKTsKK30KKy8vLyBTdWJPbmUgLSBTdWJ0cmFjdCBvbmUgZnJvbSBhIENvbnN0YW50SW50CitzdGF0aWMgQ29uc3RhbnQgKlN1Yk9uZShDb25zdGFudEludCAqQykgeworICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRTdWIoQywgIENvbnN0YW50SW50OjpnZXQoQy0+Z2V0VHlwZSgpLCAxKSk7Cit9CisKK3N0YXRpYyBDb25zdGFudEludCAqRXh0cmFjdEVsZW1lbnQoQ29uc3RhbnQgKlYsIENvbnN0YW50ICpJZHgpIHsKKyAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KENvbnN0YW50RXhwcjo6Z2V0RXh0cmFjdEVsZW1lbnQoViwgSWR4KSk7Cit9CisKK3N0YXRpYyBib29sIEhhc0FkZE92ZXJmbG93KENvbnN0YW50SW50ICpSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludCAqSW4xLCBDb25zdGFudEludCAqSW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1NpZ25lZCkgeworICBpZiAoSXNTaWduZWQpCisgICAgaWYgKEluMi0+Z2V0VmFsdWUoKS5pc05lZ2F0aXZlKCkpCisgICAgICByZXR1cm4gUmVzdWx0LT5nZXRWYWx1ZSgpLnNndChJbjEtPmdldFZhbHVlKCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBSZXN1bHQtPmdldFZhbHVlKCkuc2x0KEluMS0+Z2V0VmFsdWUoKSk7CisgIGVsc2UKKyAgICByZXR1cm4gUmVzdWx0LT5nZXRWYWx1ZSgpLnVsdChJbjEtPmdldFZhbHVlKCkpOworfQorCisvLy8gQWRkV2l0aE92ZXJmbG93IC0gQ29tcHV0ZSBSZXN1bHQgPSBJbjErSW4yLCByZXR1cm5pbmcgdHJ1ZSBpZiB0aGUgcmVzdWx0CisvLy8gb3ZlcmZsb3dlZCBmb3IgdGhpcyB0eXBlLgorc3RhdGljIGJvb2wgQWRkV2l0aE92ZXJmbG93KENvbnN0YW50IComUmVzdWx0LCBDb25zdGFudCAqSW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJbjIsIGJvb2wgSXNTaWduZWQgPSBmYWxzZSkgeworICBSZXN1bHQgPSBDb25zdGFudEV4cHI6OmdldEFkZChJbjEsIEluMik7CisKKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KEluMS0+Z2V0VHlwZSgpKSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBDb25zdGFudCAqSWR4ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEluMS0+Z2V0Q29udGV4dCgpKSwgaSk7CisgICAgICBpZiAoSGFzQWRkT3ZlcmZsb3coRXh0cmFjdEVsZW1lbnQoUmVzdWx0LCBJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RFbGVtZW50KEluMSwgSWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0RWxlbWVudChJbjIsIElkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgSXNTaWduZWQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIEhhc0FkZE92ZXJmbG93KGNhc3Q8Q29uc3RhbnRJbnQ+KFJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50SW50PihJbjEpLCBjYXN0PENvbnN0YW50SW50PihJbjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSXNTaWduZWQpOworfQorCitzdGF0aWMgYm9vbCBIYXNTdWJPdmVyZmxvdyhDb25zdGFudEludCAqUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQgKkluMSwgQ29uc3RhbnRJbnQgKkluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTaWduZWQpIHsKKyAgaWYgKElzU2lnbmVkKQorICAgIGlmIChJbjItPmdldFZhbHVlKCkuaXNOZWdhdGl2ZSgpKQorICAgICAgcmV0dXJuIFJlc3VsdC0+Z2V0VmFsdWUoKS5zbHQoSW4xLT5nZXRWYWx1ZSgpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gUmVzdWx0LT5nZXRWYWx1ZSgpLnNndChJbjEtPmdldFZhbHVlKCkpOworICBlbHNlCisgICAgcmV0dXJuIFJlc3VsdC0+Z2V0VmFsdWUoKS51Z3QoSW4xLT5nZXRWYWx1ZSgpKTsKK30KKworLy8vIFN1YldpdGhPdmVyZmxvdyAtIENvbXB1dGUgUmVzdWx0ID0gSW4xLUluMiwgcmV0dXJuaW5nIHRydWUgaWYgdGhlIHJlc3VsdAorLy8vIG92ZXJmbG93ZWQgZm9yIHRoaXMgdHlwZS4KK3N0YXRpYyBib29sIFN1YldpdGhPdmVyZmxvdyhDb25zdGFudCAqJlJlc3VsdCwgQ29uc3RhbnQgKkluMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqSW4yLCBib29sIElzU2lnbmVkID0gZmFsc2UpIHsKKyAgUmVzdWx0ID0gQ29uc3RhbnRFeHByOjpnZXRTdWIoSW4xLCBJbjIpOworCisgIGlmIChjb25zdCBWZWN0b3JUeXBlICpWVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihJbjEtPmdldFR5cGUoKSkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgQ29uc3RhbnQgKklkeCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShJbjEtPmdldENvbnRleHQoKSksIGkpOworICAgICAgaWYgKEhhc1N1Yk92ZXJmbG93KEV4dHJhY3RFbGVtZW50KFJlc3VsdCwgSWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0RWxlbWVudChJbjEsIElkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEVsZW1lbnQoSW4yLCBJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIElzU2lnbmVkKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBIYXNTdWJPdmVyZmxvdyhjYXN0PENvbnN0YW50SW50PihSZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25zdGFudEludD4oSW4xKSwgY2FzdDxDb25zdGFudEludD4oSW4yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElzU2lnbmVkKTsKK30KKworLy8vIGlzU2lnbkJpdENoZWNrIC0gR2l2ZW4gYW4gZXhwbG9kZWQgaWNtcCBpbnN0cnVjdGlvbiwgcmV0dXJuIHRydWUgaWYgdGhlCisvLy8gY29tcGFyaXNvbiBvbmx5IGNoZWNrcyB0aGUgc2lnbiBiaXQuICBJZiBpdCBvbmx5IGNoZWNrcyB0aGUgc2lnbiBiaXQsIHNldAorLy8vIFRydWVJZlNpZ25lZCBpZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIHRydWUgd2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMKKy8vLyBzaWduZWQuCitzdGF0aWMgYm9vbCBpc1NpZ25CaXRDaGVjayhJQ21wSW5zdDo6UHJlZGljYXRlIHByZWQsIENvbnN0YW50SW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZUcnVlSWZTaWduZWQpIHsKKyAgc3dpdGNoIChwcmVkKSB7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiAgIC8vIFRydWUgaWYgTEhTIHM8IDAKKyAgICBUcnVlSWZTaWduZWQgPSB0cnVlOworICAgIHJldHVybiBSSFMtPmlzWmVybygpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRTogICAvLyBUcnVlIGlmIExIUyBzPD0gUkhTIGFuZCBSSFMgPT0gLTEKKyAgICBUcnVlSWZTaWduZWQgPSB0cnVlOworICAgIHJldHVybiBSSFMtPmlzQWxsT25lc1ZhbHVlKCk7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiAgIC8vIFRydWUgaWYgTEhTIHM+IC0xCisgICAgVHJ1ZUlmU2lnbmVkID0gZmFsc2U7CisgICAgcmV0dXJuIFJIUy0+aXNBbGxPbmVzVmFsdWUoKTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6CisgICAgLy8gVHJ1ZSBpZiBMSFMgdT4gUkhTIGFuZCBSSFMgPT0gaGlnaC1iaXQtbWFzayAtIDEKKyAgICBUcnVlSWZTaWduZWQgPSB0cnVlOworICAgIHJldHVybiBSSFMtPmdldFZhbHVlKCkgPT0KKyAgICAgIEFQSW50OjpnZXRTaWduZWRNYXhWYWx1ZShSSFMtPmdldFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpKTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6IAorICAgIC8vIFRydWUgaWYgTEhTIHU+PSBSSFMgYW5kIFJIUyA9PSBoaWdoLWJpdC1tYXNrICgyXjcsIDJeMTUsIDJeMzEsIGV0YykKKyAgICBUcnVlSWZTaWduZWQgPSB0cnVlOworICAgIHJldHVybiBSSFMtPmdldFZhbHVlKCkuaXNTaWduQml0KCk7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8vIGlzSGlnaE9uZXMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RhbnQgaXMgb2YgdGhlIGZvcm0gMSswKy4KKy8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgbG93b25lcyh+WCkuCitzdGF0aWMgYm9vbCBpc0hpZ2hPbmVzKGNvbnN0IENvbnN0YW50SW50ICpDSSkgeworICByZXR1cm4gKH5DSS0+Z2V0VmFsdWUoKSArIDEpLmlzUG93ZXJPZjIoKTsKK30KKworLy8vIENvbXB1dGVTaWduZWRNaW5NYXhWYWx1ZXNGcm9tS25vd25CaXRzIC0gR2l2ZW4gYSBzaWduZWQgaW50ZWdlciB0eXBlIGFuZCBhIAorLy8vIHNldCBvZiBrbm93biB6ZXJvIGFuZCBvbmUgYml0cywgY29tcHV0ZSB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMgdGhhdAorLy8vIGNvdWxkIGhhdmUgdGhlIHNwZWNpZmllZCBrbm93biB6ZXJvIGFuZCBrbm93biBvbmUgYml0cywgcmV0dXJuaW5nIHRoZW0gaW4KKy8vLyBtaW4vbWF4Lgorc3RhdGljIHZvaWQgQ29tcHV0ZVNpZ25lZE1pbk1heFZhbHVlc0Zyb21Lbm93bkJpdHMoY29uc3QgQVBJbnQmIEtub3duWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50JiBLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50JiBNaW4sIEFQSW50JiBNYXgpIHsKKyAgYXNzZXJ0KEtub3duWmVyby5nZXRCaXRXaWR0aCgpID09IEtub3duT25lLmdldEJpdFdpZHRoKCkgJiYKKyAgICAgICAgIEtub3duWmVyby5nZXRCaXRXaWR0aCgpID09IE1pbi5nZXRCaXRXaWR0aCgpICYmCisgICAgICAgICBLbm93blplcm8uZ2V0Qml0V2lkdGgoKSA9PSBNYXguZ2V0Qml0V2lkdGgoKSAmJgorICAgICAgICAgIktub3duWmVybywgS25vd25PbmUgYW5kIE1pbiwgTWF4IG11c3QgaGF2ZSBlcXVhbCBiaXR3aWR0aC4iKTsKKyAgQVBJbnQgVW5rbm93bkJpdHMgPSB+KEtub3duWmVyb3xLbm93bk9uZSk7CisKKyAgLy8gVGhlIG1pbmltdW0gdmFsdWUgaXMgd2hlbiBhbGwgdW5rbm93biBiaXRzIGFyZSB6ZXJvcywgRVhDRVBUIGZvciB0aGUgc2lnbgorICAvLyBiaXQgaWYgaXQgaXMgdW5rbm93bi4KKyAgTWluID0gS25vd25PbmU7CisgIE1heCA9IEtub3duT25lfFVua25vd25CaXRzOworICAKKyAgaWYgKFVua25vd25CaXRzLmlzTmVnYXRpdmUoKSkgeyAvLyBTaWduIGJpdCBpcyB1bmtub3duCisgICAgTWluLnNldChNaW4uZ2V0Qml0V2lkdGgoKS0xKTsKKyAgICBNYXguY2xlYXIoTWF4LmdldEJpdFdpZHRoKCktMSk7CisgIH0KK30KKworLy8gQ29tcHV0ZVVuc2lnbmVkTWluTWF4VmFsdWVzRnJvbUtub3duQml0cyAtIEdpdmVuIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBhbmQKKy8vIGEgc2V0IG9mIGtub3duIHplcm8gYW5kIG9uZSBiaXRzLCBjb21wdXRlIHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlcyB0aGF0CisvLyBjb3VsZCBoYXZlIHRoZSBzcGVjaWZpZWQga25vd24gemVybyBhbmQga25vd24gb25lIGJpdHMsIHJldHVybmluZyB0aGVtIGluCisvLyBtaW4vbWF4Lgorc3RhdGljIHZvaWQgQ29tcHV0ZVVuc2lnbmVkTWluTWF4VmFsdWVzRnJvbUtub3duQml0cyhjb25zdCBBUEludCAmS25vd25aZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZNaW4sIEFQSW50ICZNYXgpIHsKKyAgYXNzZXJ0KEtub3duWmVyby5nZXRCaXRXaWR0aCgpID09IEtub3duT25lLmdldEJpdFdpZHRoKCkgJiYKKyAgICAgICAgIEtub3duWmVyby5nZXRCaXRXaWR0aCgpID09IE1pbi5nZXRCaXRXaWR0aCgpICYmCisgICAgICAgICBLbm93blplcm8uZ2V0Qml0V2lkdGgoKSA9PSBNYXguZ2V0Qml0V2lkdGgoKSAmJgorICAgICAgICAgIlR5LCBLbm93blplcm8sIEtub3duT25lIGFuZCBNaW4sIE1heCBtdXN0IGhhdmUgZXF1YWwgYml0d2lkdGguIik7CisgIEFQSW50IFVua25vd25CaXRzID0gfihLbm93blplcm98S25vd25PbmUpOworICAKKyAgLy8gVGhlIG1pbmltdW0gdmFsdWUgaXMgd2hlbiB0aGUgdW5rbm93biBiaXRzIGFyZSBhbGwgemVyb3MuCisgIE1pbiA9IEtub3duT25lOworICAvLyBUaGUgbWF4aW11bSB2YWx1ZSBpcyB3aGVuIHRoZSB1bmtub3duIGJpdHMgYXJlIGFsbCBvbmVzLgorICBNYXggPSBLbm93bk9uZXxVbmtub3duQml0czsKK30KKworCisKKy8vLyBGb2xkQ21wTG9hZEZyb21JbmRleGVkR2xvYmFsIC0gQ2FsbGVkIHdlIHNlZSB0aGlzIHBhdHRlcm46CisvLy8gICBjbXAgcHJlZCAobG9hZCAoZ2VwIEdWLCAuLi4pKSwgY21wY3N0CisvLy8gd2hlcmUgR1YgaXMgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCBhIGNvbnN0YW50IGluaXRpYWxpemVyLiAgVHJ5IHRvIHNpbXBsaWZ5CisvLy8gdGhpcyBpbnRvIHNvbWUgc2ltcGxlIGNvbXB1dGF0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCB0aGUgbG9hZC4gIEZvciBleGFtcGxlCisvLy8gd2UgY2FuIG9wdGltaXplICJpY21wIGVxIChsb2FkIChnZXAgImZvbyIsIDAsIGkpKSwgMCIgaW50byAiaWNtcCBlcSBpLCAzIi4KKy8vLworLy8vIElmIEFuZENzdCBpcyBub24tbnVsbCwgdGhlbiB0aGUgbG9hZGVkIHZhbHVlIGlzIG1hc2tlZCB3aXRoIHRoYXQgY29uc3RhbnQKKy8vLyBiZWZvcmUgZG9pbmcgdGhlIGNvbXBhcmlzb24uICBUaGlzIGhhbmRsZXMgY2FzZXMgbGlrZSAiQVtpXSY0ID09IDAiLgorSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6CitGb2xkQ21wTG9hZEZyb21JbmRleGVkR2xvYmFsKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAsIEdsb2JhbFZhcmlhYmxlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdCAmSUNJLCBDb25zdGFudEludCAqQW5kQ3N0KSB7CisgIC8vIFdlIG5lZWQgVEQgaW5mb3JtYXRpb24gdG8ga25vdyB0aGUgcG9pbnRlciBzaXplIHVubGVzcyB0aGlzIGlzIGluYm91bmRzLgorICBpZiAoIUdFUC0+aXNJbkJvdW5kcygpICYmIFREID09IDApIHJldHVybiAwOworICAKKyAgQ29uc3RhbnRBcnJheSAqSW5pdCA9IGR5bl9jYXN0PENvbnN0YW50QXJyYXk+KEdWLT5nZXRJbml0aWFsaXplcigpKTsKKyAgaWYgKEluaXQgPT0gMCB8fCBJbml0LT5nZXROdW1PcGVyYW5kcygpID4gMTAyNCkgcmV0dXJuIDA7CisgIAorICAvLyBUaGVyZSBhcmUgbWFueSBmb3JtcyBvZiB0aGlzIG9wdGltaXphdGlvbiB3ZSBjYW4gaGFuZGxlLCBmb3Igbm93LCBqdXN0IGRvCisgIC8vIHRoZSBzaW1wbGUgaW5kZXggaW50byBhIHNpbmdsZS1kaW1lbnNpb25hbCBhcnJheS4KKyAgLy8KKyAgLy8gUmVxdWlyZTogR0VQIEdWLCAwLCBpIHt7LCBjb25zdGFudCBpbmRpY2VzfX0KKyAgaWYgKEdFUC0+Z2V0TnVtT3BlcmFuZHMoKSA8IDMgfHwKKyAgICAgICFpc2E8Q29uc3RhbnRJbnQ+KEdFUC0+Z2V0T3BlcmFuZCgxKSkgfHwKKyAgICAgICFjYXN0PENvbnN0YW50SW50PihHRVAtPmdldE9wZXJhbmQoMSkpLT5pc1plcm8oKSB8fAorICAgICAgaXNhPENvbnN0YW50PihHRVAtPmdldE9wZXJhbmQoMikpKQorICAgIHJldHVybiAwOworCisgIC8vIENoZWNrIHRoYXQgaW5kaWNlcyBhZnRlciB0aGUgdmFyaWFibGUgYXJlIGNvbnN0YW50cyBhbmQgaW4tcmFuZ2UgZm9yIHRoZQorICAvLyB0eXBlIHRoZXkgaW5kZXguICBDb2xsZWN0IHRoZSBpbmRpY2VzLiAgVGhpcyBpcyB0eXBpY2FsbHkgZm9yIGFycmF5cyBvZgorICAvLyBzdHJ1Y3RzLgorICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gTGF0ZXJJbmRpY2VzOworICAKKyAgY29uc3QgVHlwZSAqRWx0VHkgPSBjYXN0PEFycmF5VHlwZT4oSW5pdC0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMywgZSA9IEdFUC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDb25zdGFudEludCAqSWR4ID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEdFUC0+Z2V0T3BlcmFuZChpKSk7CisgICAgaWYgKElkeCA9PSAwKSByZXR1cm4gMDsgIC8vIFZhcmlhYmxlIGluZGV4LgorICAgIAorICAgIHVpbnQ2NF90IElkeFZhbCA9IElkeC0+Z2V0WkV4dFZhbHVlKCk7CisgICAgaWYgKCh1bnNpZ25lZClJZHhWYWwgIT0gSWR4VmFsKSByZXR1cm4gMDsgLy8gVG9vIGxhcmdlIGFycmF5IGluZGV4LgorICAgIAorICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihFbHRUeSkpCisgICAgICBFbHRUeSA9IFNUeS0+Z2V0RWxlbWVudFR5cGUoSWR4VmFsKTsKKyAgICBlbHNlIGlmIChjb25zdCBBcnJheVR5cGUgKkFUeSA9IGR5bl9jYXN0PEFycmF5VHlwZT4oRWx0VHkpKSB7CisgICAgICBpZiAoSWR4VmFsID49IEFUeS0+Z2V0TnVtRWxlbWVudHMoKSkgcmV0dXJuIDA7CisgICAgICBFbHRUeSA9IEFUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDA7IC8vIFVua25vd24gdHlwZS4KKyAgICB9CisgICAgCisgICAgTGF0ZXJJbmRpY2VzLnB1c2hfYmFjayhJZHhWYWwpOworICB9CisgIAorICBlbnVtIHsgT3ZlcmRlZmluZWQgPSAtMywgVW5kZWZpbmVkID0gLTIgfTsKKworICAvLyBWYXJpYWJsZXMgZm9yIG91ciBzdGF0ZSBtYWNoaW5lcy4KKyAgCisgIC8vIEZpcnN0VHJ1ZUVsZW1lbnQvU2Vjb25kVHJ1ZUVsZW1lbnQgLSBVc2VkIHRvIGVtaXQgYSBjb21wYXJpc29uIG9mIHRoZSBmb3JtCisgIC8vICJpID09IDQ3IHwgaSA9PSA4NyIsIHdoZXJlIDQ3IGlzIHRoZSBmaXJzdCBpbmRleCB0aGUgY29uZGl0aW9uIGlzIHRydWUgZm9yLAorICAvLyBhbmQgODcgaXMgdGhlIHNlY29uZCAoYW5kIGxhc3QpIGluZGV4LiAgRmlyc3RUcnVlRWxlbWVudCBpcyAtMiB3aGVuCisgIC8vIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIHNldCB0byB0aGUgZmlyc3QgdHJ1ZSBlbGVtZW50LiAgU2Vjb25kVHJ1ZUVsZW1lbnQgaXMKKyAgLy8gLTIgd2hlbiB1bmRlZmluZWQsIC0zIHdoZW4gb3ZlcmRlZmluZWQgYW5kID49IDAgd2hlbiB0aGF0IGluZGV4IGlzIHRydWUuCisgIGludCBGaXJzdFRydWVFbGVtZW50ID0gVW5kZWZpbmVkLCBTZWNvbmRUcnVlRWxlbWVudCA9IFVuZGVmaW5lZDsKKworICAvLyBGaXJzdEZhbHNlRWxlbWVudC9TZWNvbmRGYWxzZUVsZW1lbnQgLSBVc2VkIHRvIGVtaXQgYSBjb21wYXJpc29uIG9mIHRoZQorICAvLyBmb3JtICJpICE9IDQ3ICYgaSAhPSA4NyIuICBTYW1lIHN0YXRlIHRyYW5zaXRpb25zIGFzIGZvciB0cnVlIGVsZW1lbnRzLgorICBpbnQgRmlyc3RGYWxzZUVsZW1lbnQgPSBVbmRlZmluZWQsIFNlY29uZEZhbHNlRWxlbWVudCA9IFVuZGVmaW5lZDsKKyAgCisgIC8vLyBUcnVlUmFuZ2VFbmQvRmFsc2VSYW5nZUVuZCAtIEluIGNvbmp1bmN0aW9uIHdpdGggRmlyc3QqRWxlbWVudCwgdGhlc2UKKyAgLy8vIGRlZmluZSBhIHN0YXRlIG1hY2hpbmUgdGhhdCB0cmlnZ2VycyBmb3IgcmFuZ2VzIG9mIHZhbHVlcyB0aGF0IHRoZSBpbmRleAorICAvLy8gaXMgdHJ1ZSBvciBmYWxzZSBmb3IuICBUaGlzIHRyaWdnZXJzIG9uIHRoaW5ncyBsaWtlICJhYmJiYmMiW2ldID09ICdiJy4KKyAgLy8vIFRoaXMgaXMgLTIgd2hlbiB1bmRlZmluZWQsIC0zIHdoZW4gb3ZlcmRlZmluZWQsIGFuZCBvdGhlcndpc2UgdGhlIGxhc3QKKyAgLy8vIGluZGV4IGluIHRoZSByYW5nZSAoaW5jbHVzaXZlKS4gIFdlIHVzZSAtMiBmb3IgdW5kZWZpbmVkIGhlcmUgYmVjYXVzZSB3ZQorICAvLy8gdXNlIHJlbGF0aXZlIGNvbXBhcmlzb25zIGFuZCBkb24ndCB3YW50IDAtMSB0byBtYXRjaCAtMS4KKyAgaW50IFRydWVSYW5nZUVuZCA9IFVuZGVmaW5lZCwgRmFsc2VSYW5nZUVuZCA9IFVuZGVmaW5lZDsKKyAgCisgIC8vIE1hZ2ljQml0dmVjdG9yIC0gVGhpcyBpcyBhIG1hZ2ljIGJpdHZlY3RvciB3aGVyZSB3ZSBzZXQgYSBiaXQgaWYgdGhlCisgIC8vIGNvbXBhcmlzb24gaXMgdHJ1ZSBmb3IgZWxlbWVudCAnaScuICBJZiB0aGVyZSBhcmUgNjQgZWxlbWVudHMgb3IgbGVzcyBpbgorICAvLyB0aGUgYXJyYXksIHRoaXMgd2lsbCBmdWxseSByZXByZXNlbnQgYWxsIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCisgIHVpbnQ2NF90IE1hZ2ljQml0dmVjdG9yID0gMDsKKyAgCisgIAorICAvLyBTY2FuIHRoZSBhcnJheSBhbmQgc2VlIGlmIG9uZSBvZiBvdXIgcGF0dGVybnMgbWF0Y2hlcy4KKyAgQ29uc3RhbnQgKkNvbXBhcmVSSFMgPSBjYXN0PENvbnN0YW50PihJQ0kuZ2V0T3BlcmFuZCgxKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbml0LT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIENvbnN0YW50ICpFbHQgPSBJbml0LT5nZXRPcGVyYW5kKGkpOworICAgIAorICAgIC8vIElmIHRoaXMgaXMgaW5kZXhpbmcgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcywgZ2V0IHRoZSBzdHJ1Y3R1cmUgZWxlbWVudC4KKyAgICBpZiAoIUxhdGVySW5kaWNlcy5lbXB0eSgpKQorICAgICAgRWx0ID0gQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0VmFsdWUoRWx0LCBMYXRlckluZGljZXMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZXJJbmRpY2VzLnNpemUoKSk7CisgICAgCisgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbWFza2VkLCBoYW5kbGUgaXQuCisgICAgaWYgKEFuZENzdCkgRWx0ID0gQ29uc3RhbnRFeHByOjpnZXRBbmQoRWx0LCBBbmRDc3QpOworICAgIAorICAgIC8vIEZpbmQgb3V0IGlmIHRoZSBjb21wYXJpc29uIHdvdWxkIGJlIHRydWUgb3IgZmFsc2UgZm9yIHRoZSBpJ3RoIGVsZW1lbnQuCisgICAgQ29uc3RhbnQgKkMgPSBDb25zdGFudEZvbGRDb21wYXJlSW5zdE9wZXJhbmRzKElDSS5nZXRQcmVkaWNhdGUoKSwgRWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJlUkhTLCBURCk7CisgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyB1bmRlZiBmb3IgdGhpcyBlbGVtZW50LCBpZ25vcmUgaXQuCisgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihDKSkgeworICAgICAgLy8gRXh0ZW5kIHJhbmdlIHN0YXRlIG1hY2hpbmVzIHRvIGNvdmVyIHRoaXMgZWxlbWVudCBpbiBjYXNlIHRoZXJlIGlzIGFuCisgICAgICAvLyB1bmRlZiBpbiB0aGUgbWlkZGxlIG9mIHRoZSByYW5nZS4KKyAgICAgIGlmIChUcnVlUmFuZ2VFbmQgPT0gKGludClpLTEpCisgICAgICAgIFRydWVSYW5nZUVuZCA9IGk7CisgICAgICBpZiAoRmFsc2VSYW5nZUVuZCA9PSAoaW50KWktMSkKKyAgICAgICAgRmFsc2VSYW5nZUVuZCA9IGk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gSWYgd2UgY2FuJ3QgY29tcHV0ZSB0aGUgcmVzdWx0IGZvciBhbnkgb2YgdGhlIGVsZW1lbnRzLCB3ZSBoYXZlIHRvIGdpdmUKKyAgICAvLyB1cCBldmFsdWF0aW5nIHRoZSBlbnRpcmUgY29uZGl0aW9uYWwuCisgICAgaWYgKCFpc2E8Q29uc3RhbnRJbnQ+KEMpKSByZXR1cm4gMDsKKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIHdlIGtub3cgaWYgdGhlIGNvbXBhcmlzb24gaXMgdHJ1ZSBvciBmYWxzZSBmb3IgdGhpcyBlbGVtZW50LAorICAgIC8vIHVwZGF0ZSBvdXIgc3RhdGUgbWFjaGluZXMuCisgICAgYm9vbCBJc1RydWVGb3JFbHQgPSAhY2FzdDxDb25zdGFudEludD4oQyktPmlzWmVybygpOworICAgIAorICAgIC8vIFN0YXRlIG1hY2hpbmUgZm9yIHNpbmdsZS9kb3VibGUvcmFuZ2UgaW5kZXggY29tcGFyaXNvbi4KKyAgICBpZiAoSXNUcnVlRm9yRWx0KSB7CisgICAgICAvLyBVcGRhdGUgdGhlIFRydWVFbGVtZW50IHN0YXRlIG1hY2hpbmUuCisgICAgICBpZiAoRmlyc3RUcnVlRWxlbWVudCA9PSBVbmRlZmluZWQpCisgICAgICAgIEZpcnN0VHJ1ZUVsZW1lbnQgPSBUcnVlUmFuZ2VFbmQgPSBpOyAgLy8gRmlyc3QgdHJ1ZSBlbGVtZW50LgorICAgICAgZWxzZSB7CisgICAgICAgIC8vIFVwZGF0ZSBkb3VibGUtY29tcGFyZSBzdGF0ZSBtYWNoaW5lLgorICAgICAgICBpZiAoU2Vjb25kVHJ1ZUVsZW1lbnQgPT0gVW5kZWZpbmVkKQorICAgICAgICAgIFNlY29uZFRydWVFbGVtZW50ID0gaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFNlY29uZFRydWVFbGVtZW50ID0gT3ZlcmRlZmluZWQ7CisgICAgICAgIAorICAgICAgICAvLyBVcGRhdGUgcmFuZ2Ugc3RhdGUgbWFjaGluZS4KKyAgICAgICAgaWYgKFRydWVSYW5nZUVuZCA9PSAoaW50KWktMSkKKyAgICAgICAgICBUcnVlUmFuZ2VFbmQgPSBpOworICAgICAgICBlbHNlCisgICAgICAgICAgVHJ1ZVJhbmdlRW5kID0gT3ZlcmRlZmluZWQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFVwZGF0ZSB0aGUgRmFsc2VFbGVtZW50IHN0YXRlIG1hY2hpbmUuCisgICAgICBpZiAoRmlyc3RGYWxzZUVsZW1lbnQgPT0gVW5kZWZpbmVkKQorICAgICAgICBGaXJzdEZhbHNlRWxlbWVudCA9IEZhbHNlUmFuZ2VFbmQgPSBpOyAvLyBGaXJzdCBmYWxzZSBlbGVtZW50LgorICAgICAgZWxzZSB7CisgICAgICAgIC8vIFVwZGF0ZSBkb3VibGUtY29tcGFyZSBzdGF0ZSBtYWNoaW5lLgorICAgICAgICBpZiAoU2Vjb25kRmFsc2VFbGVtZW50ID09IFVuZGVmaW5lZCkKKyAgICAgICAgICBTZWNvbmRGYWxzZUVsZW1lbnQgPSBpOworICAgICAgICBlbHNlCisgICAgICAgICAgU2Vjb25kRmFsc2VFbGVtZW50ID0gT3ZlcmRlZmluZWQ7CisgICAgICAgIAorICAgICAgICAvLyBVcGRhdGUgcmFuZ2Ugc3RhdGUgbWFjaGluZS4KKyAgICAgICAgaWYgKEZhbHNlUmFuZ2VFbmQgPT0gKGludClpLTEpCisgICAgICAgICAgRmFsc2VSYW5nZUVuZCA9IGk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBGYWxzZVJhbmdlRW5kID0gT3ZlcmRlZmluZWQ7CisgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8vIElmIHRoaXMgZWxlbWVudCBpcyBpbiByYW5nZSwgdXBkYXRlIG91ciBtYWdpYyBiaXR2ZWN0b3IuCisgICAgaWYgKGkgPCA2NCAmJiBJc1RydWVGb3JFbHQpCisgICAgICBNYWdpY0JpdHZlY3RvciB8PSAxVUxMIDw8IGk7CisgICAgCisgICAgLy8gSWYgYWxsIG9mIG91ciBzdGF0ZXMgYmVjb21lIG92ZXJkZWZpbmVkLCBiYWlsIG91dCBlYXJseS4gIFNpbmNlIHRoZQorICAgIC8vIHByZWRpY2F0ZSBpcyBleHBlbnNpdmUsIG9ubHkgY2hlY2sgaXQgZXZlcnkgOCBlbGVtZW50cy4gIFRoaXMgaXMgb25seQorICAgIC8vIHJlYWxseSB1c2VmdWwgZm9yIHJlYWxseSBodWdlIGFycmF5cy4KKyAgICBpZiAoKGkgJiA4KSA9PSAwICYmIGkgPj0gNjQgJiYgU2Vjb25kVHJ1ZUVsZW1lbnQgPT0gT3ZlcmRlZmluZWQgJiYKKyAgICAgICAgU2Vjb25kRmFsc2VFbGVtZW50ID09IE92ZXJkZWZpbmVkICYmIFRydWVSYW5nZUVuZCA9PSBPdmVyZGVmaW5lZCAmJgorICAgICAgICBGYWxzZVJhbmdlRW5kID09IE92ZXJkZWZpbmVkKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBOb3cgdGhhdCB3ZSd2ZSBzY2FubmVkIHRoZSBlbnRpcmUgYXJyYXksIGVtaXQgb3VyIG5ldyBjb21wYXJpc29uKHMpLiAgV2UKKyAgLy8gb3JkZXIgdGhlIHN0YXRlIG1hY2hpbmVzIGluIGNvbXBsZXhpdHkgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLgorICBWYWx1ZSAqSWR4ID0gR0VQLT5nZXRPcGVyYW5kKDIpOworCisgIC8vIElmIHRoZSBpbmRleCBpcyBsYXJnZXIgdGhhbiB0aGUgcG9pbnRlciBzaXplIG9mIHRoZSB0YXJnZXQsIHRydW5jYXRlIHRoZQorICAvLyBpbmRleCBkb3duIGxpa2UgdGhlIEdFUCB3b3VsZCBkbyBpbXBsaWNpdGx5LiAgV2UgZG9uJ3QgaGF2ZSB0byBkbyB0aGlzIGZvcgorICAvLyBhbiBpbmJvdW5kcyBHRVAgYmVjYXVzZSB0aGUgaW5kZXggY2FuJ3QgYmUgb3V0IG9mIHJhbmdlLgorICBpZiAoIUdFUC0+aXNJbkJvdW5kcygpICYmCisgICAgICBJZHgtPmdldFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpID4gVEQtPmdldFBvaW50ZXJTaXplSW5CaXRzKCkpCisgICAgSWR4ID0gQnVpbGRlci0+Q3JlYXRlVHJ1bmMoSWR4LCBURC0+Z2V0SW50UHRyVHlwZShJZHgtPmdldENvbnRleHQoKSkpOworICAKKyAgLy8gSWYgdGhlIGNvbXBhcmlzb24gaXMgb25seSB0cnVlIGZvciBvbmUgb3IgdHdvIGVsZW1lbnRzLCBlbWl0IGRpcmVjdAorICAvLyBjb21wYXJpc29ucy4KKyAgaWYgKFNlY29uZFRydWVFbGVtZW50ICE9IE92ZXJkZWZpbmVkKSB7CisgICAgLy8gTm9uZSB0cnVlIC0+IGZhbHNlLgorICAgIGlmIChGaXJzdFRydWVFbGVtZW50ID09IFVuZGVmaW5lZCkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKEdFUC0+Z2V0Q29udGV4dCgpKSk7CisgICAgCisgICAgVmFsdWUgKkZpcnN0VHJ1ZUlkeCA9IENvbnN0YW50SW50OjpnZXQoSWR4LT5nZXRUeXBlKCksIEZpcnN0VHJ1ZUVsZW1lbnQpOworICAgIAorICAgIC8vIFRydWUgZm9yIG9uZSBlbGVtZW50IC0+ICdpID09IDQ3Jy4KKyAgICBpZiAoU2Vjb25kVHJ1ZUVsZW1lbnQgPT0gVW5kZWZpbmVkKQorICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6SUNNUF9FUSwgSWR4LCBGaXJzdFRydWVJZHgpOworICAgIAorICAgIC8vIFRydWUgZm9yIHR3byBlbGVtZW50cyAtPiAnaSA9PSA0NyB8IGkgPT0gNzInLgorICAgIFZhbHVlICpDMSA9IEJ1aWxkZXItPkNyZWF0ZUlDbXBFUShJZHgsIEZpcnN0VHJ1ZUlkeCk7CisgICAgVmFsdWUgKlNlY29uZFRydWVJZHggPSBDb25zdGFudEludDo6Z2V0KElkeC0+Z2V0VHlwZSgpLCBTZWNvbmRUcnVlRWxlbWVudCk7CisgICAgVmFsdWUgKkMyID0gQnVpbGRlci0+Q3JlYXRlSUNtcEVRKElkeCwgU2Vjb25kVHJ1ZUlkeCk7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihDMSwgQzIpOworICB9CisKKyAgLy8gSWYgdGhlIGNvbXBhcmlzb24gaXMgb25seSBmYWxzZSBmb3Igb25lIG9yIHR3byBlbGVtZW50cywgZW1pdCBkaXJlY3QKKyAgLy8gY29tcGFyaXNvbnMuCisgIGlmIChTZWNvbmRGYWxzZUVsZW1lbnQgIT0gT3ZlcmRlZmluZWQpIHsKKyAgICAvLyBOb25lIGZhbHNlIC0+IHRydWUuCisgICAgaWYgKEZpcnN0RmFsc2VFbGVtZW50ID09IFVuZGVmaW5lZCkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwgQ29uc3RhbnRJbnQ6OmdldFRydWUoR0VQLT5nZXRDb250ZXh0KCkpKTsKKyAgICAKKyAgICBWYWx1ZSAqRmlyc3RGYWxzZUlkeCA9IENvbnN0YW50SW50OjpnZXQoSWR4LT5nZXRUeXBlKCksIEZpcnN0RmFsc2VFbGVtZW50KTsKKworICAgIC8vIEZhbHNlIGZvciBvbmUgZWxlbWVudCAtPiAnaSAhPSA0NycuCisgICAgaWYgKFNlY29uZEZhbHNlRWxlbWVudCA9PSBVbmRlZmluZWQpCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX05FLCBJZHgsIEZpcnN0RmFsc2VJZHgpOworICAgICAKKyAgICAvLyBGYWxzZSBmb3IgdHdvIGVsZW1lbnRzIC0+ICdpICE9IDQ3ICYgaSAhPSA3MicuCisgICAgVmFsdWUgKkMxID0gQnVpbGRlci0+Q3JlYXRlSUNtcE5FKElkeCwgRmlyc3RGYWxzZUlkeCk7CisgICAgVmFsdWUgKlNlY29uZEZhbHNlSWR4ID0gQ29uc3RhbnRJbnQ6OmdldChJZHgtPmdldFR5cGUoKSxTZWNvbmRGYWxzZUVsZW1lbnQpOworICAgIFZhbHVlICpDMiA9IEJ1aWxkZXItPkNyZWF0ZUlDbXBORShJZHgsIFNlY29uZEZhbHNlSWR4KTsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChDMSwgQzIpOworICB9CisgIAorICAvLyBJZiB0aGUgY29tcGFyaXNvbiBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIHJhbmdlIGNvbXBhcmlzb24gZm9yIHRoZSBlbGVtZW50cworICAvLyB3aGVyZSBpdCBpcyB0cnVlLCBlbWl0IHRoZSByYW5nZSBjaGVjay4KKyAgaWYgKFRydWVSYW5nZUVuZCAhPSBPdmVyZGVmaW5lZCkgeworICAgIGFzc2VydChUcnVlUmFuZ2VFbmQgIT0gRmlyc3RUcnVlRWxlbWVudCAmJiAiU2hvdWxkIGVtaXQgc2luZ2xlIGNvbXBhcmUiKTsKKyAgICAKKyAgICAvLyBHZW5lcmF0ZSAoaS1GaXJzdFRydWUpIDx1IChUcnVlUmFuZ2VFbmQtRmlyc3RUcnVlKzEpLgorICAgIGlmIChGaXJzdFRydWVFbGVtZW50KSB7CisgICAgICBWYWx1ZSAqT2ZmcyA9IENvbnN0YW50SW50OjpnZXQoSWR4LT5nZXRUeXBlKCksIC1GaXJzdFRydWVFbGVtZW50KTsKKyAgICAgIElkeCA9IEJ1aWxkZXItPkNyZWF0ZUFkZChJZHgsIE9mZnMpOworICAgIH0KKyAgICAKKyAgICBWYWx1ZSAqRW5kID0gQ29uc3RhbnRJbnQ6OmdldChJZHgtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlUmFuZ2VFbmQtRmlyc3RUcnVlRWxlbWVudCsxKTsKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1VMVCwgSWR4LCBFbmQpOworICB9CisgIAorICAvLyBGYWxzZSByYW5nZSBjaGVjay4KKyAgaWYgKEZhbHNlUmFuZ2VFbmQgIT0gT3ZlcmRlZmluZWQpIHsKKyAgICBhc3NlcnQoRmFsc2VSYW5nZUVuZCAhPSBGaXJzdEZhbHNlRWxlbWVudCAmJiAiU2hvdWxkIGVtaXQgc2luZ2xlIGNvbXBhcmUiKTsKKyAgICAvLyBHZW5lcmF0ZSAoaS1GaXJzdEZhbHNlKSA+dSAoRmFsc2VSYW5nZUVuZC1GaXJzdEZhbHNlKS4KKyAgICBpZiAoRmlyc3RGYWxzZUVsZW1lbnQpIHsKKyAgICAgIFZhbHVlICpPZmZzID0gQ29uc3RhbnRJbnQ6OmdldChJZHgtPmdldFR5cGUoKSwgLUZpcnN0RmFsc2VFbGVtZW50KTsKKyAgICAgIElkeCA9IEJ1aWxkZXItPkNyZWF0ZUFkZChJZHgsIE9mZnMpOworICAgIH0KKyAgICAKKyAgICBWYWx1ZSAqRW5kID0gQ29uc3RhbnRJbnQ6OmdldChJZHgtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZVJhbmdlRW5kLUZpcnN0RmFsc2VFbGVtZW50KTsKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1VHVCwgSWR4LCBFbmQpOworICB9CisgIAorICAKKyAgLy8gSWYgYSAzMi1iaXQgb3IgNjQtYml0IG1hZ2ljIGJpdHZlY3RvciBjYXB0dXJlcyB0aGUgZW50aXJlIGNvbXBhcmlzb24gc3RhdGUKKyAgLy8gb2YgdGhpcyBsb2FkLCByZXBsYWNlIGl0IHdpdGggY29tcHV0YXRpb24gdGhhdCBkb2VzOgorICAvLyAgICgobWFnaWNfY3N0ID4+IGkpICYgMSkgIT0gMAorICBpZiAoSW5pdC0+Z2V0TnVtT3BlcmFuZHMoKSA8PSAzMiB8fAorICAgICAgKFREICYmIEluaXQtPmdldE51bU9wZXJhbmRzKCkgPD0gNjQgJiYgVEQtPmlzTGVnYWxJbnRlZ2VyKDY0KSkpIHsKKyAgICBjb25zdCBUeXBlICpUeTsKKyAgICBpZiAoSW5pdC0+Z2V0TnVtT3BlcmFuZHMoKSA8PSAzMikKKyAgICAgIFR5ID0gVHlwZTo6Z2V0SW50MzJUeShJbml0LT5nZXRDb250ZXh0KCkpOworICAgIGVsc2UKKyAgICAgIFR5ID0gVHlwZTo6Z2V0SW50NjRUeShJbml0LT5nZXRDb250ZXh0KCkpOworICAgIFZhbHVlICpWID0gQnVpbGRlci0+Q3JlYXRlSW50Q2FzdChJZHgsIFR5LCBmYWxzZSk7CisgICAgViA9IEJ1aWxkZXItPkNyZWF0ZUxTaHIoQ29uc3RhbnRJbnQ6OmdldChUeSwgTWFnaWNCaXR2ZWN0b3IpLCBWKTsKKyAgICBWID0gQnVpbGRlci0+Q3JlYXRlQW5kKENvbnN0YW50SW50OjpnZXQoVHksIDEpLCBWKTsKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX05FLCBWLCBDb25zdGFudEludDo6Z2V0KFR5LCAwKSk7CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCisKKy8vLyBFdmFsdWF0ZUdFUE9mZnNldEV4cHJlc3Npb24gLSBSZXR1cm4gYSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbXBhcmUKKy8vLyB0aGUgKm9mZnNldCogaW1wbGllZCBieSBhIEdFUCB0byB6ZXJvLiAgRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgJkFbaV0sIHdlCisvLy8gd2FudCB0byByZXR1cm4gJ2knIGZvciAiaWNtcCBuZSBpLCAwIi4gIE5vdGUgdGhhdCwgaW4gZ2VuZXJhbCwgaW5kaWNlcyBjYW4KKy8vLyBiZSBjb21wbGV4LCBhbmQgc2NhbGVzIGFyZSBpbnZvbHZlZC4gIFRoZSBhYm92ZSBleHByZXNzaW9uIHdvdWxkIGFsc28gYmUKKy8vLyBsZWdhbCB0byBjb2RlZ2VuIGFzICJpY21wIG5lIChpKjQpLCAwIiAoYXNzdW1pbmcgQSBpcyBhIHBvaW50ZXIgdG8gaTMyKS4KKy8vLyBUaGlzIGxhdGVyIGZvcm0gaXMgbGVzcyBhbWVuYWJsZSB0byBvcHRpbWl6YXRpb24gdGhvdWdoLCBhbmQgd2UgYXJlIGFsbG93ZWQKKy8vLyB0byBnZW5lcmF0ZSB0aGUgZmlyc3QgYnkga25vd2luZyB0aGF0IHBvaW50ZXIgYXJpdGhtZXRpYyBkb2Vzbid0IG92ZXJmbG93LgorLy8vCisvLy8gSWYgd2UgY2FuJ3QgZW1pdCBhbiBvcHRpbWl6ZWQgZm9ybSBmb3IgdGhpcyBleHByZXNzaW9uLCB0aGlzIHJldHVybnMgbnVsbC4KKy8vLyAKK3N0YXRpYyBWYWx1ZSAqRXZhbHVhdGVHRVBPZmZzZXRFeHByZXNzaW9uKFVzZXIgKkdFUCwgSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0Q29tYmluZXIgJklDKSB7CisgIFRhcmdldERhdGEgJlREID0gKklDLmdldFRhcmdldERhdGEoKTsKKyAgZ2VwX3R5cGVfaXRlcmF0b3IgR1RJID0gZ2VwX3R5cGVfYmVnaW4oR0VQKTsKKyAgCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGdlcCBvbmx5IGhhcyBhIHNpbmdsZSB2YXJpYWJsZSBpbmRleC4gIElmIHNvLCBhbmQgaWYKKyAgLy8gYW55IGNvbnN0YW50IGluZGljZXMgYXJlIGEgbXVsdGlwbGUgb2YgaXRzIHNjYWxlLCB0aGVuIHdlIGNhbiBjb21wdXRlIHRoaXMKKyAgLy8gaW4gdGVybXMgb2YgdGhlIHNjYWxlIG9mIHRoZSB2YXJpYWJsZSBpbmRleC4gIEZvciBleGFtcGxlLCBpZiB0aGUgR0VQCisgIC8vIGltcGxpZXMgYW4gb2Zmc2V0IG9mICIxMiArIGkqNCIsIHRoZW4gd2UgY2FuIGNvZGVnZW4gdGhpcyBhcyAiMyArIGkiLAorICAvLyBiZWNhdXNlIHRoZSBleHByZXNzaW9uIHdpbGwgY3Jvc3MgemVybyBhdCB0aGUgc2FtZSBwb2ludC4KKyAgdW5zaWduZWQgaSwgZSA9IEdFUC0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgaW50NjRfdCBPZmZzZXQgPSAwOworICBmb3IgKGkgPSAxOyBpICE9IGU7ICsraSwgKytHVEkpIHsKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEdFUC0+Z2V0T3BlcmFuZChpKSkpIHsKKyAgICAgIC8vIENvbXB1dGUgdGhlIGFnZ3JlZ2F0ZSBvZmZzZXQgb2YgY29uc3RhbnQgaW5kaWNlcy4KKyAgICAgIGlmIChDSS0+aXNaZXJvKCkpIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBIYW5kbGUgYSBzdHJ1Y3QgaW5kZXgsIHdoaWNoIGFkZHMgaXRzIGZpZWxkIG9mZnNldCB0byB0aGUgcG9pbnRlci4KKyAgICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPigqR1RJKSkgeworICAgICAgICBPZmZzZXQgKz0gVEQuZ2V0U3RydWN0TGF5b3V0KFNUeSktPmdldEVsZW1lbnRPZmZzZXQoQ0ktPmdldFpFeHRWYWx1ZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ2NF90IFNpemUgPSBURC5nZXRUeXBlQWxsb2NTaXplKEdUSS5nZXRJbmRleGVkVHlwZSgpKTsKKyAgICAgICAgT2Zmc2V0ICs9IFNpemUqQ0ktPmdldFNFeHRWYWx1ZSgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBGb3VuZCBvdXIgdmFyaWFibGUgaW5kZXguCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgCisgIC8vIElmIHRoZXJlIGFyZSBubyB2YXJpYWJsZSBpbmRpY2VzLCB3ZSBtdXN0IGhhdmUgYSBjb25zdGFudCBvZmZzZXQsIGp1c3QKKyAgLy8gZXZhbHVhdGUgaXQgdGhlIGdlbmVyYWwgd2F5LgorICBpZiAoaSA9PSBlKSByZXR1cm4gMDsKKyAgCisgIFZhbHVlICpWYXJpYWJsZUlkeCA9IEdFUC0+Z2V0T3BlcmFuZChpKTsKKyAgLy8gRGV0ZXJtaW5lIHRoZSBzY2FsZSBmYWN0b3Igb2YgdGhlIHZhcmlhYmxlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgdGhpcyBpcworICAvLyA0IGlmIHRoZSB2YXJpYWJsZSBpbmRleCBpcyBpbnRvIGFuIGFycmF5IG9mIGkzMi4KKyAgdWludDY0X3QgVmFyaWFibGVTY2FsZSA9IFRELmdldFR5cGVBbGxvY1NpemUoR1RJLmdldEluZGV4ZWRUeXBlKCkpOworICAKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyIHZhcmlhYmxlIGluZGljZXMuICBJZiBzbywgZW1pdCB0aGUgaGFyZCB3YXkuCisgIGZvciAoKytpLCArK0dUSTsgaSAhPSBlOyArK2ksICsrR1RJKSB7CisgICAgQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEdFUC0+Z2V0T3BlcmFuZChpKSk7CisgICAgaWYgKCFDSSkgcmV0dXJuIDA7CisgICAgCisgICAgLy8gQ29tcHV0ZSB0aGUgYWdncmVnYXRlIG9mZnNldCBvZiBjb25zdGFudCBpbmRpY2VzLgorICAgIGlmIChDSS0+aXNaZXJvKCkpIGNvbnRpbnVlOworICAgIAorICAgIC8vIEhhbmRsZSBhIHN0cnVjdCBpbmRleCwgd2hpY2ggYWRkcyBpdHMgZmllbGQgb2Zmc2V0IHRvIHRoZSBwb2ludGVyLgorICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPigqR1RJKSkgeworICAgICAgT2Zmc2V0ICs9IFRELmdldFN0cnVjdExheW91dChTVHkpLT5nZXRFbGVtZW50T2Zmc2V0KENJLT5nZXRaRXh0VmFsdWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQ2NF90IFNpemUgPSBURC5nZXRUeXBlQWxsb2NTaXplKEdUSS5nZXRJbmRleGVkVHlwZSgpKTsKKyAgICAgIE9mZnNldCArPSBTaXplKkNJLT5nZXRTRXh0VmFsdWUoKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIE9rYXksIHdlIGtub3cgd2UgaGF2ZSBhIHNpbmdsZSB2YXJpYWJsZSBpbmRleCwgd2hpY2ggbXVzdCBiZSBhCisgIC8vIHBvaW50ZXIvYXJyYXkvdmVjdG9yIGluZGV4LiAgSWYgdGhlcmUgaXMgbm8gb2Zmc2V0LCBsaWZlIGlzIHNpbXBsZSwgcmV0dXJuCisgIC8vIHRoZSBpbmRleC4KKyAgdW5zaWduZWQgSW50UHRyV2lkdGggPSBURC5nZXRQb2ludGVyU2l6ZUluQml0cygpOworICBpZiAoT2Zmc2V0ID09IDApIHsKKyAgICAvLyBDYXN0IHRvIGludHB0cnR5IGluIGNhc2UgYSB0cnVuY2F0aW9uIG9jY3Vycy4gIElmIGFuIGV4dGVuc2lvbiBpcyBuZWVkZWQsCisgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBib3RoZXIgZXh0ZW5kaW5nOiB0aGUgZXh0ZW5zaW9uIHdvbid0IGFmZmVjdCB3aGVyZSB0aGUKKyAgICAvLyBjb21wdXRhdGlvbiBjcm9zc2VzIHplcm8uCisgICAgaWYgKFZhcmlhYmxlSWR4LT5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA+IEludFB0cldpZHRoKQorICAgICAgVmFyaWFibGVJZHggPSBuZXcgVHJ1bmNJbnN0KFZhcmlhYmxlSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURC5nZXRJbnRQdHJUeXBlKFZhcmlhYmxlSWR4LT5nZXRDb250ZXh0KCkpLCAmSSk7CisgICAgcmV0dXJuIFZhcmlhYmxlSWR4OworICB9CisgIAorICAvLyBPdGhlcndpc2UsIHRoZXJlIGlzIGFuIGluZGV4LiAgVGhlIGNvbXB1dGF0aW9uIHdlIHdpbGwgZG8gd2lsbCBiZSBtb2R1bG8KKyAgLy8gdGhlIHBvaW50ZXIgc2l6ZSwgc28gZ2V0IGl0LgorICB1aW50NjRfdCBQdHJTaXplTWFzayA9IH4wVUxMID4+ICg2NC1JbnRQdHJXaWR0aCk7CisgIAorICBPZmZzZXQgJj0gUHRyU2l6ZU1hc2s7CisgIFZhcmlhYmxlU2NhbGUgJj0gUHRyU2l6ZU1hc2s7CisgIAorICAvLyBUbyBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uLCBhbnkgY29uc3RhbnQgaW5kZXggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZQorICAvLyB2YXJpYWJsZSBzY2FsZSBmYWN0b3IuICBGb3IgZXhhbXBsZSwgd2UgY2FuIGV2YWx1YXRlICIxMiArIDQqaSIgYXMgIjMgKyBpIiwKKyAgLy8gYnV0IHdlIGNhbid0IGV2YWx1YXRlICIxMCArIDMqaSIgaW4gdGVybXMgb2YgaS4gIENoZWNrIHRoYXQgdGhlIG9mZnNldCBpcyBhCisgIC8vIG11bHRpcGxlIG9mIHRoZSB2YXJpYWJsZSBzY2FsZS4KKyAgaW50NjRfdCBOZXdPZmZzID0gT2Zmc2V0IC8gKGludDY0X3QpVmFyaWFibGVTY2FsZTsKKyAgaWYgKE9mZnNldCAhPSBOZXdPZmZzKihpbnQ2NF90KVZhcmlhYmxlU2NhbGUpCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBPa2F5LCB3ZSBjYW4gZG8gdGhpcyBldmFsdWF0aW9uLiAgU3RhcnQgYnkgY29udmVydGluZyB0aGUgaW5kZXggdG8gaW50cHRyLgorICBjb25zdCBUeXBlICpJbnRQdHJUeSA9IFRELmdldEludFB0clR5cGUoVmFyaWFibGVJZHgtPmdldENvbnRleHQoKSk7CisgIGlmIChWYXJpYWJsZUlkeC0+Z2V0VHlwZSgpICE9IEludFB0clR5KQorICAgIFZhcmlhYmxlSWR4ID0gQ2FzdEluc3Q6OkNyZWF0ZUludGVnZXJDYXN0KFZhcmlhYmxlSWR4LCBJbnRQdHJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qU0V4dCovLCAmSSk7CisgIENvbnN0YW50ICpPZmZzZXRWYWwgPSBDb25zdGFudEludDo6Z2V0KEludFB0clR5LCBOZXdPZmZzKTsKKyAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoVmFyaWFibGVJZHgsIE9mZnNldFZhbCwgJkkpOworfQorCisvLy8gRm9sZEdFUElDbXAgLSBGb2xkIGNvbXBhcmlzb25zIGJldHdlZW4gYSBHRVAgaW5zdHJ1Y3Rpb24gYW5kIHNvbWV0aGluZworLy8vIGVsc2UuICBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGUgR0VQIGlzIG9uIHRoZSBMSFMgb2YgdGhlIGNvbXBhcmlzb24uCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjpGb2xkR0VQSUNtcChHRVBPcGVyYXRvciAqR0VQTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgLy8gTG9vayB0aHJvdWdoIGJpdGNhc3RzLgorICBpZiAoQml0Q2FzdEluc3QgKkJDSSA9IGR5bl9jYXN0PEJpdENhc3RJbnN0PihSSFMpKQorICAgIFJIUyA9IEJDSS0+Z2V0T3BlcmFuZCgwKTsKKworICBWYWx1ZSAqUHRyQmFzZSA9IEdFUExIUy0+Z2V0T3BlcmFuZCgwKTsKKyAgaWYgKFREICYmIFB0ckJhc2UgPT0gUkhTICYmIEdFUExIUy0+aXNJbkJvdW5kcygpKSB7CisgICAgLy8gKChnZXAgUHRyLCBPRkZTRVQpIGNtcCBQdHIpICAgLS0tPiAoT0ZGU0VUIGNtcCAwKS4KKyAgICAvLyBUaGlzIHRyYW5zZm9ybWF0aW9uIChpZ25vcmluZyB0aGUgYmFzZSBhbmQgc2NhbGVzKSBpcyB2YWxpZCBiZWNhdXNlIHdlCisgICAgLy8ga25vdyBwb2ludGVycyBjYW4ndCBvdmVyZmxvdyBzaW5jZSB0aGUgZ2VwIGlzIGluYm91bmRzLiAgU2VlIGlmIHdlIGNhbgorICAgIC8vIG91dHB1dCBhbiBvcHRpbWl6ZWQgZm9ybS4KKyAgICBWYWx1ZSAqT2Zmc2V0ID0gRXZhbHVhdGVHRVBPZmZzZXRFeHByZXNzaW9uKEdFUExIUywgSSwgKnRoaXMpOworICAgIAorICAgIC8vIElmIG5vdCwgc3ludGhlc2l6ZSB0aGUgb2Zmc2V0IHRoZSBoYXJkIHdheS4KKyAgICBpZiAoT2Zmc2V0ID09IDApCisgICAgICBPZmZzZXQgPSBFbWl0R0VQT2Zmc2V0KEdFUExIUyk7CisgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6Z2V0U2lnbmVkUHJlZGljYXRlKENvbmQpLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKE9mZnNldC0+Z2V0VHlwZSgpKSk7CisgIH0gZWxzZSBpZiAoR0VQT3BlcmF0b3IgKkdFUFJIUyA9IGR5bl9jYXN0PEdFUE9wZXJhdG9yPihSSFMpKSB7CisgICAgLy8gSWYgdGhlIGJhc2UgcG9pbnRlcnMgYXJlIGRpZmZlcmVudCwgYnV0IHRoZSBpbmRpY2VzIGFyZSB0aGUgc2FtZSwganVzdAorICAgIC8vIGNvbXBhcmUgdGhlIGJhc2UgcG9pbnRlci4KKyAgICBpZiAoUHRyQmFzZSAhPSBHRVBSSFMtPmdldE9wZXJhbmQoMCkpIHsKKyAgICAgIGJvb2wgSW5kaWNlc1RoZVNhbWUgPSBHRVBMSFMtPmdldE51bU9wZXJhbmRzKCk9PUdFUFJIUy0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgIEluZGljZXNUaGVTYW1lICY9IEdFUExIUy0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBHRVBSSFMtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsKKyAgICAgIGlmIChJbmRpY2VzVGhlU2FtZSkKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IEdFUExIUy0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgaWYgKEdFUExIUy0+Z2V0T3BlcmFuZChpKSAhPSBHRVBSSFMtPmdldE9wZXJhbmQoaSkpIHsKKyAgICAgICAgICAgIEluZGljZXNUaGVTYW1lID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgIC8vIElmIGFsbCBpbmRpY2VzIGFyZSB0aGUgc2FtZSwganVzdCBjb21wYXJlIHRoZSBiYXNlIHBvaW50ZXJzLgorICAgICAgaWYgKEluZGljZXNUaGVTYW1lKQorICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpnZXRTaWduZWRQcmVkaWNhdGUoQ29uZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VQTEhTLT5nZXRPcGVyYW5kKDApLCBHRVBSSFMtPmdldE9wZXJhbmQoMCkpOworCisgICAgICAvLyBPdGhlcndpc2UsIHRoZSBiYXNlIHBvaW50ZXJzIGFyZSBkaWZmZXJlbnQgYW5kIHRoZSBpbmRpY2VzIGFyZQorICAgICAgLy8gZGlmZmVyZW50LCBiYWlsIG91dC4KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIElmIG9uZSBvZiB0aGUgR0VQcyBoYXMgYWxsIHplcm8gaW5kaWNlcywgcmVjdXJzZS4KKyAgICBib29sIEFsbFplcm9zID0gdHJ1ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gR0VQTEhTLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICghaXNhPENvbnN0YW50PihHRVBMSFMtPmdldE9wZXJhbmQoaSkpIHx8CisgICAgICAgICAgIWNhc3Q8Q29uc3RhbnQ+KEdFUExIUy0+Z2V0T3BlcmFuZChpKSktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgQWxsWmVyb3MgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgaWYgKEFsbFplcm9zKQorICAgICAgcmV0dXJuIEZvbGRHRVBJQ21wKEdFUFJIUywgR0VQTEhTLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6Z2V0U3dhcHBlZFByZWRpY2F0ZShDb25kKSwgSSk7CisKKyAgICAvLyBJZiB0aGUgb3RoZXIgR0VQIGhhcyBhbGwgemVybyBpbmRpY2VzLCByZWN1cnNlLgorICAgIEFsbFplcm9zID0gdHJ1ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gR0VQUkhTLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICghaXNhPENvbnN0YW50PihHRVBSSFMtPmdldE9wZXJhbmQoaSkpIHx8CisgICAgICAgICAgIWNhc3Q8Q29uc3RhbnQ+KEdFUFJIUy0+Z2V0T3BlcmFuZChpKSktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgQWxsWmVyb3MgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgaWYgKEFsbFplcm9zKQorICAgICAgcmV0dXJuIEZvbGRHRVBJQ21wKEdFUExIUywgR0VQUkhTLT5nZXRPcGVyYW5kKDApLCBDb25kLCBJKTsKKworICAgIGlmIChHRVBMSFMtPmdldE51bU9wZXJhbmRzKCkgPT0gR0VQUkhTLT5nZXROdW1PcGVyYW5kcygpKSB7CisgICAgICAvLyBJZiB0aGUgR0VQcyBvbmx5IGRpZmZlciBieSBvbmUgaW5kZXgsIGNvbXBhcmUgaXQuCisgICAgICB1bnNpZ25lZCBOdW1EaWZmZXJlbmNlcyA9IDA7ICAvLyBLZWVwIHRyYWNrIG9mICMgZGlmZmVyZW5jZXMuCisgICAgICB1bnNpZ25lZCBEaWZmT3BlcmFuZCA9IDA7ICAgICAvLyBUaGUgb3BlcmFuZCB0aGF0IGRpZmZlcnMuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gR0VQUkhTLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKEdFUExIUy0+Z2V0T3BlcmFuZChpKSAhPSBHRVBSSFMtPmdldE9wZXJhbmQoaSkpIHsKKyAgICAgICAgICBpZiAoR0VQTEhTLT5nZXRPcGVyYW5kKGkpLT5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSAhPQorICAgICAgICAgICAgICAgICAgIEdFUFJIUy0+Z2V0T3BlcmFuZChpKS0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpIHsKKyAgICAgICAgICAgIC8vIElycmVjb25jaWxhYmxlIGRpZmZlcmVuY2VzLgorICAgICAgICAgICAgTnVtRGlmZmVyZW5jZXMgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChOdW1EaWZmZXJlbmNlcysrKSBicmVhazsKKyAgICAgICAgICAgIERpZmZPcGVyYW5kID0gaTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKE51bURpZmZlcmVuY2VzID09IDApICAgLy8gU0FNRSBHRVA/CisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIC8vIE5vIGNvbXBhcmlzb24gaXMgbmVlZGVkIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxVHkoSS5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OmlzVHJ1ZVdoZW5FcXVhbChDb25kKSkpOworCisgICAgICBlbHNlIGlmIChOdW1EaWZmZXJlbmNlcyA9PSAxKSB7CisgICAgICAgIFZhbHVlICpMSFNWID0gR0VQTEhTLT5nZXRPcGVyYW5kKERpZmZPcGVyYW5kKTsKKyAgICAgICAgVmFsdWUgKlJIU1YgPSBHRVBSSFMtPmdldE9wZXJhbmQoRGlmZk9wZXJhbmQpOworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG8gYSBzaWduZWQgY29tcGFyaXNvbiBoZXJlLgorICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpnZXRTaWduZWRQcmVkaWNhdGUoQ29uZCksIExIU1YsIFJIU1YpOworICAgICAgfQorICAgIH0KKworICAgIC8vIE9ubHkgbG93ZXIgdGhpcyBpZiB0aGUgaWNtcCBpcyB0aGUgb25seSB1c2VyIG9mIHRoZSBHRVAgb3IgaWYgd2UgZXhwZWN0CisgICAgLy8gdGhlIHJlc3VsdCB0byBmb2xkIHRvIGEgY29uc3RhbnQhCisgICAgaWYgKFREICYmCisgICAgICAgIChpc2E8Q29uc3RhbnRFeHByPihHRVBMSFMpIHx8IEdFUExIUy0+aGFzT25lVXNlKCkpICYmCisgICAgICAgIChpc2E8Q29uc3RhbnRFeHByPihHRVBSSFMpIHx8IEdFUFJIUy0+aGFzT25lVXNlKCkpKSB7CisgICAgICAvLyAoKGdlcCBQdHIsIE9GRlNFVDEpIGNtcCAoZ2VwIFB0ciwgT0ZGU0VUMikgIC0tLT4gIChPRkZTRVQxIGNtcCBPRkZTRVQyKQorICAgICAgVmFsdWUgKkwgPSBFbWl0R0VQT2Zmc2V0KEdFUExIUyk7CisgICAgICBWYWx1ZSAqUiA9IEVtaXRHRVBPZmZzZXQoR0VQUkhTKTsKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNtcEluc3Q6OmdldFNpZ25lZFByZWRpY2F0ZShDb25kKSwgTCwgUik7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLy8gRm9sZElDbXBBZGRPcENzdCAtIEZvbGQgImljbXAgcHJlZCAoWCtDSSksIFgiLgorSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6Rm9sZElDbXBBZGRPcENzdChJQ21wSW5zdCAmSUNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqWCwgQ29uc3RhbnRJbnQgKkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpUaGVBZGQpIHsKKyAgLy8gSWYgd2UgaGF2ZSBYKzAsIGV4aXQgZWFybHkgKHNpbXBsaWZ5aW5nIGxvZ2ljIGJlbG93KSBhbmQgbGV0IGl0IGdldCBmb2xkZWQKKyAgLy8gZWxzZXdoZXJlLiAgIGljbXAgWCswLCBYICAtPiBpY21wIFgsIFgKKyAgaWYgKENJLT5pc1plcm8oKSkgeworICAgIGJvb2wgaXNUcnVlID0gSUNtcEluc3Q6OmlzVHJ1ZVdoZW5FcXVhbChQcmVkKTsKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJQ0ksIENvbnN0YW50SW50OjpnZXQoSUNJLmdldFR5cGUoKSwgaXNUcnVlKSk7CisgIH0KKyAgCisgIC8vIChYKzQpID09IFggLT4gZmFsc2UuCisgIGlmIChQcmVkID09IElDbXBJbnN0OjpJQ01QX0VRKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKFgtPmdldENvbnRleHQoKSkpOworCisgIC8vIChYKzQpICE9IFggLT4gdHJ1ZS4KKyAgaWYgKFByZWQgPT0gSUNtcEluc3Q6OklDTVBfTkUpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShYLT5nZXRDb250ZXh0KCkpKTsKKworICAvLyBJZiB0aGlzIGlzIGFuIGluc3RydWN0aW9uIChhcyBvcHBvc2VkIHRvIGNvbnN0YW50ZXhwcikgZ2V0IE5VVy9OU1cgaW5mby4KKyAgYm9vbCBpc05VVyA9IGZhbHNlLCBpc05TVyA9IGZhbHNlOworICBpZiAoQmluYXJ5T3BlcmF0b3IgKkFkZCA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihUaGVBZGQpKSB7CisgICAgaXNOVVcgPSBBZGQtPmhhc05vVW5zaWduZWRXcmFwKCk7CisgICAgaXNOU1cgPSBBZGQtPmhhc05vU2lnbmVkV3JhcCgpOworICB9ICAgICAgCisgIAorICAvLyBGcm9tIHRoaXMgcG9pbnQgb24sIHdlIGtub3cgdGhhdCAoWCtDIDw9IFgpIC0tPiAoWCtDIDwgWCkgYmVjYXVzZSBDICE9IDAsCisgIC8vIHNvIHRoZSB2YWx1ZXMgY2FuIG5ldmVyIGJlIGVxdWFsLiAgU2ltaWxpYXJseSBmb3IgYWxsIG90aGVyICJvciBlcXVhbHMiCisgIC8vIG9wZXJhdG9ycy4KKyAgCisgIC8vIChYKzEpIDx1IFggICAgICAgIC0tPiBYID51IChNQVhVSU5ULTEpICAgICAgICAtLT4gWCA9PSAyNTUKKyAgLy8gKFgrMikgPHUgWCAgICAgICAgLS0+IFggPnUgKE1BWFVJTlQtMikgICAgICAgIC0tPiBYID4gMjUzCisgIC8vIChYK01BWFVJTlQpIDx1IFggIC0tPiBYID51IChNQVhVSU5ULU1BWFVJTlQpICAtLT4gWCAhPSAwCisgIGlmIChQcmVkID09IElDbXBJbnN0OjpJQ01QX1VMVCB8fCBQcmVkID09IElDbXBJbnN0OjpJQ01QX1VMRSkgeworICAgIC8vIElmIHRoaXMgaXMgYW4gTlVXIGFkZCwgdGhlbiB0aGlzIGlzIGFsd2F5cyBmYWxzZS4KKyAgICBpZiAoaXNOVVcpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJQ0ksIENvbnN0YW50SW50OjpnZXRGYWxzZShYLT5nZXRDb250ZXh0KCkpKTsgCisgICAgCisgICAgVmFsdWUgKlIgPSAKKyAgICAgIENvbnN0YW50RXhwcjo6Z2V0U3ViKENvbnN0YW50SW50OjpnZXRBbGxPbmVzVmFsdWUoQ0ktPmdldFR5cGUoKSksIENJKTsKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1VHVCwgWCwgUik7CisgIH0KKyAgCisgIC8vIChYKzEpID51IFggICAgICAgIC0tPiBYIDx1ICgwLTEpICAgICAgICAtLT4gWCAhPSAyNTUKKyAgLy8gKFgrMikgPnUgWCAgICAgICAgLS0+IFggPHUgKDAtMikgICAgICAgIC0tPiBYIDx1IDI1NAorICAvLyAoWCtNQVhVSU5UKSA+dSBYICAtLT4gWCA8dSAoMC1NQVhVSU5UKSAgLS0+IFggPHUgMSAgLS0+IFggPT0gMAorICBpZiAoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9VR1QgfHwgUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9VR0UpIHsKKyAgICAvLyBJZiB0aGlzIGlzIGFuIE5VVyBhZGQsIHRoZW4gdGhpcyBpcyBhbHdheXMgdHJ1ZS4KKyAgICBpZiAoaXNOVVcpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJQ0ksIENvbnN0YW50SW50OjpnZXRUcnVlKFgtPmdldENvbnRleHQoKSkpOyAKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1VMVCwgWCwgQ29uc3RhbnRFeHByOjpnZXROZWcoQ0kpKTsKKyAgfQorICAKKyAgdW5zaWduZWQgQml0V2lkdGggPSBDSS0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgIENvbnN0YW50SW50ICpTTWF4ID0gQ29uc3RhbnRJbnQ6OmdldChYLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludDo6Z2V0U2lnbmVkTWF4VmFsdWUoQml0V2lkdGgpKTsKKworICAvLyAoWCsgMSkgPHMgWCAgICAgICAtLT4gWCA+cyAoTUFYU0lOVC0xKSAgICAgICAgICAtLT4gWCA9PSAxMjcKKyAgLy8gKFgrIDIpIDxzIFggICAgICAgLS0+IFggPnMgKE1BWFNJTlQtMikgICAgICAgICAgLS0+IFggPnMgMTI1CisgIC8vIChYK01BWFNJTlQpIDxzIFggIC0tPiBYID5zIChNQVhTSU5ULU1BWFNJTlQpICAgIC0tPiBYID5zIDAKKyAgLy8gKFgrTUlOU0lOVCkgPHMgWCAgLS0+IFggPnMgKE1BWFNJTlQtTUlOU0lOVCkgICAgLS0+IFggPnMgLTEKKyAgLy8gKFgrIC0yKSA8cyBYICAgICAgLS0+IFggPnMgKE1BWFNJTlQtIC0yKSAgICAgICAgLS0+IFggPnMgMTI2CisgIC8vIChYKyAtMSkgPHMgWCAgICAgIC0tPiBYID5zIChNQVhTSU5ULSAtMSkgICAgICAgIC0tPiBYICE9IDEyNworICBpZiAoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TTFQgfHwgUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TTEUpIHsKKyAgICAvLyBJZiB0aGlzIGlzIGFuIE5TVyBhZGQsIHRoZW4gd2UgaGF2ZSB0d28gY2FzZXM6IGlmIHRoZSBjb25zdGFudCBpcworICAgIC8vIHBvc2l0aXZlLCB0aGVuIHRoaXMgaXMgYWx3YXlzIGZhbHNlLCBpZiBuZWdhdGl2ZSwgdGhpcyBpcyBhbHdheXMgdHJ1ZS4KKyAgICBpZiAoaXNOU1cpIHsKKyAgICAgIGJvb2wgaXNUcnVlID0gQ0ktPmdldFZhbHVlKCkuaXNOZWdhdGl2ZSgpOworICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLCBDb25zdGFudEludDo6Z2V0KElDSS5nZXRUeXBlKCksIGlzVHJ1ZSkpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1NHVCwgWCwgQ29uc3RhbnRFeHByOjpnZXRTdWIoU01heCwgQ0kpKTsKKyAgfQorICAKKyAgLy8gKFgrIDEpID5zIFggICAgICAgLS0+IFggPHMgKE1BWFNJTlQtKDEtMSkpICAgICAgIC0tPiBYICE9IDEyNworICAvLyAoWCsgMikgPnMgWCAgICAgICAtLT4gWCA8cyAoTUFYU0lOVC0oMi0xKSkgICAgICAgLS0+IFggPHMgMTI2CisgIC8vIChYK01BWFNJTlQpID5zIFggIC0tPiBYIDxzIChNQVhTSU5ULShNQVhTSU5ULTEpKSAtLT4gWCA8cyAxCisgIC8vIChYK01JTlNJTlQpID5zIFggIC0tPiBYIDxzIChNQVhTSU5ULShNSU5TSU5ULTEpKSAtLT4gWCA8cyAtMgorICAvLyAoWCsgLTIpID5zIFggICAgICAtLT4gWCA8cyAoTUFYU0lOVC0oLTItMSkpICAgICAgLS0+IFggPHMgLTEyNgorICAvLyAoWCsgLTEpID5zIFggICAgICAtLT4gWCA8cyAoTUFYU0lOVC0oLTEtMSkpICAgICAgLS0+IFggPT0gLTEyOAorICAKKyAgLy8gSWYgdGhpcyBpcyBhbiBOU1cgYWRkLCB0aGVuIHdlIGhhdmUgdHdvIGNhc2VzOiBpZiB0aGUgY29uc3RhbnQgaXMKKyAgLy8gcG9zaXRpdmUsIHRoZW4gdGhpcyBpcyBhbHdheXMgdHJ1ZSwgaWYgbmVnYXRpdmUsIHRoaXMgaXMgYWx3YXlzIGZhbHNlLgorICBpZiAoaXNOU1cpIHsKKyAgICBib29sIGlzVHJ1ZSA9ICFDSS0+Z2V0VmFsdWUoKS5pc05lZ2F0aXZlKCk7CisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLCBDb25zdGFudEludDo6Z2V0KElDSS5nZXRUeXBlKCksIGlzVHJ1ZSkpOworICB9CisgIAorICBhc3NlcnQoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TR1QgfHwgUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TR0UpOworICBDb25zdGFudCAqQyA9IENvbnN0YW50SW50OjpnZXQoWC0+Z2V0Q29udGV4dCgpLCBDSS0+Z2V0VmFsdWUoKS0xKTsKKyAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6SUNNUF9TTFQsIFgsIENvbnN0YW50RXhwcjo6Z2V0U3ViKFNNYXgsIEMpKTsKK30KKworLy8vIEZvbGRJQ21wRGl2Q3N0IC0gRm9sZCAiaWNtcCBwcmVkLCAoW3N1XWRpdiBYLCBEaXZSSFMpLCBDbXBSSFMiIHdoZXJlIERpdlJIUworLy8vIGFuZCBDbXBSSFMgYXJlIGJvdGgga25vd24gdG8gYmUgaW50ZWdlciBjb25zdGFudHMuCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjpGb2xkSUNtcERpdkNzdChJQ21wSW5zdCAmSUNJLCBCaW5hcnlPcGVyYXRvciAqRGl2SSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50ICpEaXZSSFMpIHsKKyAgQ29uc3RhbnRJbnQgKkNtcFJIUyA9IGNhc3Q8Q29uc3RhbnRJbnQ+KElDSS5nZXRPcGVyYW5kKDEpKTsKKyAgY29uc3QgQVBJbnQgJkNtcFJIU1YgPSBDbXBSSFMtPmdldFZhbHVlKCk7CisgIAorICAvLyBGSVhNRTogSWYgdGhlIG9wZXJhbmQgdHlwZXMgZG9uJ3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGRpdmlkZSAKKyAgLy8gdGhlbiBkb24ndCBhdHRlbXB0IHRoaXMgdHJhbnNmb3JtLiBUaGUgY29kZSBiZWxvdyBkb2Vzbid0IGhhdmUgdGhlCisgIC8vIGxvZ2ljIHRvIGRlYWwgd2l0aCBhIHNpZ25lZCBkaXZpZGUgYW5kIGFuIHVuc2lnbmVkIGNvbXBhcmUgKGFuZAorICAvLyB2aWNlIHZlcnNhKS4gVGhpcyBpcyBiZWNhdXNlICh4IC9zIEMxKSA8cyBDMiAgcHJvZHVjZXMgZGlmZmVyZW50IAorICAvLyByZXN1bHRzIHRoYW4gKHggL3MgQzEpIDx1IEMyIG9yICh4IC91IEMxKSA8cyBDMiBvciBldmVuCisgIC8vICh4IC91IEMxKSA8dSBDMi4gIFNpbXBseSBjYXN0aW5nIHRoZSBvcGVyYW5kcyBhbmQgcmVzdWx0IHdvbid0IAorICAvLyB3b3JrLiA6KCAgVGhlIGlmIHN0YXRlbWVudCBiZWxvdyB0ZXN0cyB0aGF0IGNvbmRpdGlvbiBhbmQgYmFpbHMgCisgIC8vIGlmIGl0IGZpbmRzIGl0LiAKKyAgYm9vbCBEaXZJc1NpZ25lZCA9IERpdkktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTRGl2OworICBpZiAoIUlDSS5pc0VxdWFsaXR5KCkgJiYgRGl2SXNTaWduZWQgIT0gSUNJLmlzU2lnbmVkKCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChEaXZSSFMtPmlzWmVybygpKQorICAgIHJldHVybiAwOyAvLyBUaGUgUHJvZE9WIGNvbXB1dGF0aW9uIGZhaWxzIG9uIGRpdmlkZSBieSB6ZXJvLgorICBpZiAoRGl2SXNTaWduZWQgJiYgRGl2UkhTLT5pc0FsbE9uZXNWYWx1ZSgpKQorICAgIHJldHVybiAwOyAvLyBUaGUgb3ZlcmZsb3cgY29tcHV0YXRpb24gYWxzbyBzY3Jld3MgdXAgaGVyZQorICBpZiAoRGl2UkhTLT5pc09uZSgpKQorICAgIHJldHVybiAwOyAvLyBOb3Qgd29ydGggYm90aGVyaW5nLCBhbmQgZWxpbWluYXRlcyBzb21lIGZ1bm55IGNhc2VzCisgICAgICAgICAgICAgIC8vIHdpdGggSU5UX01JTi4KKworICAvLyBDb21wdXRlIFByb2QgPSBDSSAqIERpdlJIUy4gV2UgYXJlIGVzc2VudGlhbGx5IHNvbHZpbmcgYW4gZXF1YXRpb24KKyAgLy8gb2YgZm9ybSBYL0MxPUMyLiBXZSBzb2x2ZSBmb3IgWCBieSBtdWx0aXBseWluZyBDMSAoRGl2UkhTKSBhbmQgCisgIC8vIEMyIChDSSkuIEJ5IHNvbHZpbmcgZm9yIFggd2UgY2FuIHR1cm4gdGhpcyBpbnRvIGEgcmFuZ2UgY2hlY2sgCisgIC8vIGluc3RlYWQgb2YgY29tcHV0aW5nIGEgZGl2aWRlLiAKKyAgQ29uc3RhbnQgKlByb2QgPSBDb25zdGFudEV4cHI6OmdldE11bChDbXBSSFMsIERpdlJIUyk7CisKKyAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBwcm9kdWN0IG92ZXJmbG93cyBieSBzZWVpbmcgaWYgdGhlIHByb2R1Y3QgaXMKKyAgLy8gbm90IGVxdWFsIHRvIHRoZSBkaXZpZGUuIE1ha2Ugc3VyZSB3ZSBkbyB0aGUgc2FtZSBraW5kIG9mIGRpdmlkZQorICAvLyBhcyBpbiB0aGUgTEhTIGluc3RydWN0aW9uIHRoYXQgd2UncmUgZm9sZGluZy4gCisgIGJvb2wgUHJvZE9WID0gKERpdklzU2lnbmVkID8gQ29uc3RhbnRFeHByOjpnZXRTRGl2KFByb2QsIERpdlJIUykgOgorICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldFVEaXYoUHJvZCwgRGl2UkhTKSkgIT0gQ21wUkhTOworCisgIC8vIEdldCB0aGUgSUNtcCBvcGNvZGUKKyAgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkID0gSUNJLmdldFByZWRpY2F0ZSgpOworCisgIC8vIEZpZ3VyZSBvdXQgdGhlIGludGVydmFsIHRoYXQgaXMgYmVpbmcgY2hlY2tlZC4gIEZvciBleGFtcGxlLCBhIGNvbXBhcmlzb24KKyAgLy8gbGlrZSAiWCAvdSA1ID09IDAiIGlzIHJlYWxseSBjaGVja2luZyB0aGF0IFggaXMgaW4gdGhlIGludGVydmFsIFswLCA1KS4gCisgIC8vIENvbXB1dGUgdGhpcyBpbnRlcnZhbCBiYXNlZCBvbiB0aGUgY29uc3RhbnRzIGludm9sdmVkIGFuZCB0aGUgc2lnbmVkbmVzcyBvZgorICAvLyB0aGUgY29tcGFyZS9kaXZpZGUuICBUaGlzIGNvbXB1dGVzIGEgaGFsZi1vcGVuIGludGVydmFsLCBrZWVwaW5nIHRyYWNrIG9mCisgIC8vIHdoZXRoZXIgZWl0aGVyIHZhbHVlIGluIHRoZSBpbnRlcnZhbCBvdmVyZmxvd3MuICBBZnRlciBhbmFseXNpcyBlYWNoCisgIC8vIG92ZXJmbG93IHZhcmlhYmxlIGlzIHNldCB0byAwIGlmIGl0J3MgY29ycmVzcG9uZGluZyBib3VuZCB2YXJpYWJsZSBpcyB2YWxpZAorICAvLyAtMSBpZiBvdmVyZmxvd2VkIG9mZiB0aGUgYm90dG9tIGVuZCwgb3IgKzEgaWYgb3ZlcmZsb3dlZCBvZmYgdGhlIHRvcCBlbmQuCisgIGludCBMb092ZXJmbG93ID0gMCwgSGlPdmVyZmxvdyA9IDA7CisgIENvbnN0YW50ICpMb0JvdW5kID0gMCwgKkhpQm91bmQgPSAwOworICAKKyAgaWYgKCFEaXZJc1NpZ25lZCkgeyAgLy8gdWRpdgorICAgIC8vIGUuZy4gWC81IG9wIDMgIC0tPiBbMTUsIDIwKQorICAgIExvQm91bmQgPSBQcm9kOworICAgIEhpT3ZlcmZsb3cgPSBMb092ZXJmbG93ID0gUHJvZE9WOworICAgIGlmICghSGlPdmVyZmxvdykKKyAgICAgIEhpT3ZlcmZsb3cgPSBBZGRXaXRoT3ZlcmZsb3coSGlCb3VuZCwgTG9Cb3VuZCwgRGl2UkhTLCBmYWxzZSk7CisgIH0gZWxzZSBpZiAoRGl2UkhTLT5nZXRWYWx1ZSgpLmlzU3RyaWN0bHlQb3NpdGl2ZSgpKSB7IC8vIERpdmlzb3IgaXMgPiAwLgorICAgIGlmIChDbXBSSFNWID09IDApIHsgICAgICAgLy8gKFggLyBwb3MpIG9wIDAKKyAgICAgIC8vIENhbid0IG92ZXJmbG93LiAgZS5nLiAgWC8yIG9wIDAgLS0+IFstMSwgMikKKyAgICAgIExvQm91bmQgPSBjYXN0PENvbnN0YW50SW50PihDb25zdGFudEV4cHI6OmdldE5lZyhTdWJPbmUoRGl2UkhTKSkpOworICAgICAgSGlCb3VuZCA9IERpdlJIUzsKKyAgICB9IGVsc2UgaWYgKENtcFJIU1YuaXNTdHJpY3RseVBvc2l0aXZlKCkpIHsgICAvLyAoWCAvIHBvcykgb3AgcG9zCisgICAgICBMb0JvdW5kID0gUHJvZDsgICAgIC8vIGUuZy4gICBYLzUgb3AgMyAtLT4gWzE1LCAyMCkKKyAgICAgIEhpT3ZlcmZsb3cgPSBMb092ZXJmbG93ID0gUHJvZE9WOworICAgICAgaWYgKCFIaU92ZXJmbG93KQorICAgICAgICBIaU92ZXJmbG93ID0gQWRkV2l0aE92ZXJmbG93KEhpQm91bmQsIFByb2QsIERpdlJIUywgdHJ1ZSk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIChYIC8gcG9zKSBvcCBuZWcKKyAgICAgIC8vIGUuZy4gWC81IG9wIC0zICAtLT4gWy0xNS00LCAtMTUrMSkgLS0+IFstMTksIC0xNCkKKyAgICAgIEhpQm91bmQgPSBBZGRPbmUoUHJvZCk7CisgICAgICBMb092ZXJmbG93ID0gSGlPdmVyZmxvdyA9IFByb2RPViA/IC0xIDogMDsKKyAgICAgIGlmICghTG9PdmVyZmxvdykgeworICAgICAgICBDb25zdGFudEludCogRGl2TmVnID0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50SW50PihDb25zdGFudEV4cHI6OmdldE5lZyhEaXZSSFMpKTsKKyAgICAgICAgTG9PdmVyZmxvdyA9IEFkZFdpdGhPdmVyZmxvdyhMb0JvdW5kLCBIaUJvdW5kLCBEaXZOZWcsIHRydWUpID8gLTEgOiAwOworICAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoRGl2UkhTLT5nZXRWYWx1ZSgpLmlzTmVnYXRpdmUoKSkgeyAvLyBEaXZpc29yIGlzIDwgMC4KKyAgICBpZiAoQ21wUkhTViA9PSAwKSB7ICAgICAgIC8vIChYIC8gbmVnKSBvcCAwCisgICAgICAvLyBlLmcuIFgvLTUgb3AgMCAgLS0+IFstNCwgNSkKKyAgICAgIExvQm91bmQgPSBBZGRPbmUoRGl2UkhTKTsKKyAgICAgIEhpQm91bmQgPSBjYXN0PENvbnN0YW50SW50PihDb25zdGFudEV4cHI6OmdldE5lZyhEaXZSSFMpKTsKKyAgICAgIGlmIChIaUJvdW5kID09IERpdlJIUykgeyAgICAgLy8gLUlOVE1JTiA9IElOVE1JTgorICAgICAgICBIaU92ZXJmbG93ID0gMTsgICAgICAgICAgICAvLyBbSU5UTUlOKzEsIG92ZXJmbG93KQorICAgICAgICBIaUJvdW5kID0gMDsgICAgICAgICAgICAgICAvLyBlLmcuIFgvSU5UTUlOID0gMCAtLT4gWCA+IElOVE1JTgorICAgICAgfQorICAgIH0gZWxzZSBpZiAoQ21wUkhTVi5pc1N0cmljdGx5UG9zaXRpdmUoKSkgeyAgIC8vIChYIC8gbmVnKSBvcCBwb3MKKyAgICAgIC8vIGUuZy4gWC8tNSBvcCAzICAtLT4gWy0xOSwgLTE0KQorICAgICAgSGlCb3VuZCA9IEFkZE9uZShQcm9kKTsKKyAgICAgIEhpT3ZlcmZsb3cgPSBMb092ZXJmbG93ID0gUHJvZE9WID8gLTEgOiAwOworICAgICAgaWYgKCFMb092ZXJmbG93KQorICAgICAgICBMb092ZXJmbG93ID0gQWRkV2l0aE92ZXJmbG93KExvQm91bmQsIEhpQm91bmQsIERpdlJIUywgdHJ1ZSkgPyAtMSA6IDA7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIChYIC8gbmVnKSBvcCBuZWcKKyAgICAgIExvQm91bmQgPSBQcm9kOyAgICAgICAvLyBlLmcuIFgvLTUgb3AgLTMgIC0tPiBbMTUsIDIwKQorICAgICAgTG9PdmVyZmxvdyA9IEhpT3ZlcmZsb3cgPSBQcm9kT1Y7CisgICAgICBpZiAoIUhpT3ZlcmZsb3cpCisgICAgICAgIEhpT3ZlcmZsb3cgPSBTdWJXaXRoT3ZlcmZsb3coSGlCb3VuZCwgUHJvZCwgRGl2UkhTLCB0cnVlKTsKKyAgICB9CisgICAgCisgICAgLy8gRGl2aWRpbmcgYnkgYSBuZWdhdGl2ZSBzd2FwcyB0aGUgY29uZGl0aW9uLiAgTFQgPC0+IEdUCisgICAgUHJlZCA9IElDbXBJbnN0OjpnZXRTd2FwcGVkUHJlZGljYXRlKFByZWQpOworICB9CisKKyAgVmFsdWUgKlggPSBEaXZJLT5nZXRPcGVyYW5kKDApOworICBzd2l0Y2ggKFByZWQpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIGljbXAgb3Bjb2RlISIpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROgorICAgIGlmIChMb092ZXJmbG93ICYmIEhpT3ZlcmZsb3cpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJQ0ksIENvbnN0YW50SW50OjpnZXRGYWxzZShJQ0kuZ2V0Q29udGV4dCgpKSk7CisgICAgaWYgKEhpT3ZlcmZsb3cpCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KERpdklzU2lnbmVkID8gSUNtcEluc3Q6OklDTVBfU0dFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OklDTVBfVUdFLCBYLCBMb0JvdW5kKTsKKyAgICBpZiAoTG9PdmVyZmxvdykKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoRGl2SXNTaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9TTFQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6SUNNUF9VTFQsIFgsIEhpQm91bmQpOworICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRSYW5nZVRlc3QoWCwgTG9Cb3VuZCwgSGlCb3VuZCwgRGl2SXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORToKKyAgICBpZiAoTG9PdmVyZmxvdyAmJiBIaU92ZXJmbG93KQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShJQ0kuZ2V0Q29udGV4dCgpKSk7CisgICAgaWYgKEhpT3ZlcmZsb3cpCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KERpdklzU2lnbmVkID8gSUNtcEluc3Q6OklDTVBfU0xUIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OklDTVBfVUxULCBYLCBMb0JvdW5kKTsKKyAgICBpZiAoTG9PdmVyZmxvdykKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoRGl2SXNTaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9TR0UgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6SUNNUF9VR0UsIFgsIEhpQm91bmQpOworICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwgSW5zZXJ0UmFuZ2VUZXN0KFgsIExvQm91bmQsIEhpQm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGl2SXNTaWduZWQsIGZhbHNlKSk7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOgorICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDoKKyAgICBpZiAoTG9PdmVyZmxvdyA9PSArMSkgICAvLyBMb3cgYm91bmQgaXMgZ3JlYXRlciB0aGFuIGlucHV0IHJhbmdlLgorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShJQ0kuZ2V0Q29udGV4dCgpKSk7CisgICAgaWYgKExvT3ZlcmZsb3cgPT0gLTEpICAgLy8gTG93IGJvdW5kIGlzIGxlc3MgdGhhbiBpbnB1dCByYW5nZS4KKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKElDSS5nZXRDb250ZXh0KCkpKTsKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KFByZWQsIFgsIExvQm91bmQpOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDoKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6CisgICAgaWYgKEhpT3ZlcmZsb3cgPT0gKzEpICAgICAgIC8vIEhpZ2ggYm91bmQgZ3JlYXRlciB0aGFuIGlucHV0IHJhbmdlLgorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLCBDb25zdGFudEludDo6Z2V0RmFsc2UoSUNJLmdldENvbnRleHQoKSkpOworICAgIGVsc2UgaWYgKEhpT3ZlcmZsb3cgPT0gLTEpICAvLyBIaWdoIGJvdW5kIGxlc3MgdGhhbiBpbnB1dCByYW5nZS4KKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwgQ29uc3RhbnRJbnQ6OmdldFRydWUoSUNJLmdldENvbnRleHQoKSkpOworICAgIGlmIChQcmVkID09IElDbXBJbnN0OjpJQ01QX1VHVCkKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNtcEluc3Q6OklDTVBfVUdFLCBYLCBIaUJvdW5kKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1NHRSwgWCwgSGlCb3VuZCk7CisgIH0KK30KKworCisvLy8gdmlzaXRJQ21wSW5zdFdpdGhJbnN0QW5kSW50Q3N0IC0gSGFuZGxlICJpY21wIChpbnN0ciwgaW50Y3N0KSIuCisvLy8KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0SUNtcEluc3RXaXRoSW5zdEFuZEludENzdChJQ21wSW5zdCAmSUNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpMSFNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50ICpSSFMpIHsKKyAgY29uc3QgQVBJbnQgJlJIU1YgPSBSSFMtPmdldFZhbHVlKCk7CisgIAorICBzd2l0Y2ggKExIU0ktPmdldE9wY29kZSgpKSB7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICAgIGlmIChJQ0kuaXNFcXVhbGl0eSgpICYmIExIU0ktPmhhc09uZVVzZSgpKSB7CisgICAgICAvLyBTaW1wbGlmeSBpY21wIGVxICh0cnVuYyB4IHRvIGk4KSwgNDIgLT4gaWNtcCBlcSB4LCA0MnxoaWdoYml0cyBpZiBhbGwKKyAgICAgIC8vIG9mIHRoZSBoaWdoIGJpdHMgdHJ1bmNhdGVkIG91dCBvZiB4IGFyZSBrbm93bi4KKyAgICAgIHVuc2lnbmVkIERzdEJpdHMgPSBMSFNJLT5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSwKKyAgICAgICAgICAgICBTcmNCaXRzID0gTEhTSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgICAgICBBUEludCBNYXNrKEFQSW50OjpnZXRIaWdoQml0c1NldChTcmNCaXRzLCBTcmNCaXRzLURzdEJpdHMpKTsKKyAgICAgIEFQSW50IEtub3duWmVybyhTcmNCaXRzLCAwKSwgS25vd25PbmUoU3JjQml0cywgMCk7CisgICAgICBDb21wdXRlTWFza2VkQml0cyhMSFNJLT5nZXRPcGVyYW5kKDApLCBNYXNrLCBLbm93blplcm8sIEtub3duT25lKTsKKyAgICAgIAorICAgICAgLy8gSWYgYWxsIHRoZSBoaWdoIGJpdHMgYXJlIGtub3duLCB3ZSBjYW4gZG8gdGhpcyB4Zm9ybS4KKyAgICAgIGlmICgoS25vd25aZXJvfEtub3duT25lKS5jb3VudExlYWRpbmdPbmVzKCkgPj0gU3JjQml0cy1Ec3RCaXRzKSB7CisgICAgICAgIC8vIFB1bGwgaW4gdGhlIGhpZ2ggYml0cyBmcm9tIGtub3duLW9uZXMgc2V0LgorICAgICAgICBBUEludCBOZXdSSFMoUkhTLT5nZXRWYWx1ZSgpKTsKKyAgICAgICAgTmV3UkhTLnpleHQoU3JjQml0cyk7CisgICAgICAgIE5ld1JIUyB8PSBLbm93bk9uZTsKKyAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ0kuZ2V0UHJlZGljYXRlKCksIExIU0ktPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJQ0kuZ2V0Q29udGV4dCgpLCBOZXdSSFMpKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgICAKKyAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOiAgICAgICAgIC8vIChpY21wIHByZWQgKHhvciBYLCBYb3JDU1QpLCBDSSkKKyAgICBpZiAoQ29uc3RhbnRJbnQgKlhvckNTVCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihMSFNJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbXBhcmlzb24gdGhhdCB0ZXN0cyB0aGUgc2lnbmJpdCAoWCA8IDApIG9yICh4ID4gLTEpLAorICAgICAgLy8gZm9sZCB0aGUgeG9yLgorICAgICAgaWYgKChJQ0kuZ2V0UHJlZGljYXRlKCkgPT0gSUNtcEluc3Q6OklDTVBfU0xUICYmIFJIU1YgPT0gMCkgfHwKKyAgICAgICAgICAoSUNJLmdldFByZWRpY2F0ZSgpID09IElDbXBJbnN0OjpJQ01QX1NHVCAmJiBSSFNWLmlzQWxsT25lc1ZhbHVlKCkpKSB7CisgICAgICAgIFZhbHVlICpDb21wYXJlVmFsID0gTEhTSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBzaWduIGJpdCBvZiB0aGUgWG9yQ1NUIGlzIG5vdCBzZXQsIHRoZXJlIGlzIG5vIGNoYW5nZSB0bworICAgICAgICAvLyB0aGUgb3BlcmF0aW9uLCBqdXN0IHN0b3AgdXNpbmcgdGhlIFhvci4KKyAgICAgICAgaWYgKCFYb3JDU1QtPmdldFZhbHVlKCkuaXNOZWdhdGl2ZSgpKSB7CisgICAgICAgICAgSUNJLnNldE9wZXJhbmQoMCwgQ29tcGFyZVZhbCk7CisgICAgICAgICAgV29ya2xpc3QuQWRkKExIU0kpOworICAgICAgICAgIHJldHVybiAmSUNJOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBXYXMgdGhlIG9sZCBjb25kaXRpb24gdHJ1ZSBpZiB0aGUgb3BlcmFuZCBpcyBwb3NpdGl2ZT8KKyAgICAgICAgYm9vbCBpc1RydWVJZlBvc2l0aXZlID0gSUNJLmdldFByZWRpY2F0ZSgpID09IElDbXBJbnN0OjpJQ01QX1NHVDsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHNvLCB0aGUgbmV3IG9uZSBpc24ndC4KKyAgICAgICAgaXNUcnVlSWZQb3NpdGl2ZSBePSB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKGlzVHJ1ZUlmUG9zaXRpdmUpCisgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6SUNNUF9TR1QsIENvbXBhcmVWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJPbmUoUkhTKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1NMVCwgQ29tcGFyZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZE9uZShSSFMpKTsKKyAgICAgIH0KKworICAgICAgaWYgKExIU0ktPmhhc09uZVVzZSgpKSB7CisgICAgICAgIC8vIChpY21wIHUvcyAoeG9yIEEgU2lnbkJpdCksIEMpIC0+IChpY21wIHMvdSBBLCAoeG9yIEMgU2lnbkJpdCkpCisgICAgICAgIGlmICghSUNJLmlzRXF1YWxpdHkoKSAmJiBYb3JDU1QtPmdldFZhbHVlKCkuaXNTaWduQml0KCkpIHsKKyAgICAgICAgICBjb25zdCBBUEludCAmU2lnbkJpdCA9IFhvckNTVC0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQgPSBJQ0kuaXNTaWduZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IElDSS5nZXRVbnNpZ25lZFByZWRpY2F0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSUNJLmdldFNpZ25lZFByZWRpY2F0ZSgpOworICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoUHJlZCwgTEhTSS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSUNJLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTViBeIFNpZ25CaXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIChpY21wIHUvcyAoeG9yIEEgflNpZ25CaXQpLCBDKSAtPiAoaWNtcCBzL3UgKHhvciBDIH5TaWduQml0KSwgQSkKKyAgICAgICAgaWYgKCFJQ0kuaXNFcXVhbGl0eSgpICYmIFhvckNTVC0+Z2V0VmFsdWUoKS5pc01heFNpZ25lZFZhbHVlKCkpIHsKKyAgICAgICAgICBjb25zdCBBUEludCAmTm90U2lnbkJpdCA9IFhvckNTVC0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQgPSBJQ0kuaXNTaWduZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IElDSS5nZXRVbnNpZ25lZFByZWRpY2F0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSUNJLmdldFNpZ25lZFByZWRpY2F0ZSgpOworICAgICAgICAgIFByZWQgPSBJQ0kuZ2V0U3dhcHBlZFByZWRpY2F0ZShQcmVkKTsKKyAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KFByZWQsIExIU0ktPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KElDSS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU1YgXiBOb3RTaWduQml0KSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDogICAgICAgICAvLyAoaWNtcCBwcmVkIChhbmQgWCwgQW5kQ1NUKSwgUkhTKQorICAgIGlmIChMSFNJLT5oYXNPbmVVc2UoKSAmJiBpc2E8Q29uc3RhbnRJbnQ+KExIU0ktPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgIExIU0ktPmdldE9wZXJhbmQoMCktPmhhc09uZVVzZSgpKSB7CisgICAgICBDb25zdGFudEludCAqQW5kQ1NUID0gY2FzdDxDb25zdGFudEludD4oTEhTSS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAKKyAgICAgIC8vIElmIHRoZSBMSFMgaXMgYW4gQU5EIG9mIGEgdHJ1bmNhdGluZyBjYXN0LCB3ZSBjYW4gd2lkZW4gdGhlCisgICAgICAvLyBhbmQvY29tcGFyZSB0byBiZSB0aGUgaW5wdXQgd2lkdGggd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUKKyAgICAgIC8vIHByb2R1Y2VkLCBlbGltaW5hdGluZyBhIGNhc3QuCisgICAgICBpZiAoVHJ1bmNJbnN0ICpDYXN0ID0gZHluX2Nhc3Q8VHJ1bmNJbnN0PihMSFNJLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgICAvLyBXZSBjYW4gZG8gdGhpcyB0cmFuc2Zvcm1hdGlvbiBpZiBlaXRoZXIgdGhlIEFORCBjb25zdGFudCBkb2VzIG5vdAorICAgICAgICAvLyBoYXZlIGl0cyBzaWduIGJpdCBzZXQgb3IgaWYgaXQgaXMgYW4gZXF1YWxpdHkgY29tcGFyaXNvbi4gCisgICAgICAgIC8vIEV4dGVuZGluZyBhIHJlbGF0aW9uYWwgY29tcGFyaXNvbiB3aGVuIHdlJ3JlIGNoZWNraW5nIHRoZSBzaWduCisgICAgICAgIC8vIGJpdCB3b3VsZCBub3Qgd29yay4KKyAgICAgICAgaWYgKENhc3QtPmhhc09uZVVzZSgpICYmCisgICAgICAgICAgICAoSUNJLmlzRXF1YWxpdHkoKSB8fAorICAgICAgICAgICAgIChBbmRDU1QtPmdldFZhbHVlKCkuaXNOb25OZWdhdGl2ZSgpICYmIFJIU1YuaXNOb25OZWdhdGl2ZSgpKSkpIHsKKyAgICAgICAgICB1aW50MzJfdCBCaXRXaWR0aCA9IAorICAgICAgICAgICAgY2FzdDxJbnRlZ2VyVHlwZT4oQ2FzdC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAgICAgICBBUEludCBOZXdDU1QgPSBBbmRDU1QtPmdldFZhbHVlKCk7CisgICAgICAgICAgTmV3Q1NULnpleHQoQml0V2lkdGgpOworICAgICAgICAgIEFQSW50IE5ld0NJID0gUkhTVjsKKyAgICAgICAgICBOZXdDSS56ZXh0KEJpdFdpZHRoKTsKKyAgICAgICAgICBWYWx1ZSAqTmV3QW5kID0gCisgICAgICAgICAgICBCdWlsZGVyLT5DcmVhdGVBbmQoQ2FzdC0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSUNJLmdldENvbnRleHQoKSwgTmV3Q1NUKSk7CisgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ0kuZ2V0UHJlZGljYXRlKCksIE5ld0FuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSUNJLmdldENvbnRleHQoKSwgTmV3Q0kpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiB0aGlzIGlzOiAoWCA+PiBDMSkgJiBDMiAhPSBDMyAod2hlcmUgYW55IHNoaWZ0IGFuZCBhbnkgY29tcGFyZQorICAgICAgLy8gY291bGQgZXhpc3QpLCB0dXJuIGl0IGludG8gKFggJiAoQzIgPDwgQzEpKSAhPSAoQzMgPDwgQzEpLiAgVGhpcworICAgICAgLy8gaGFwcGVucyBhIExPVCBpbiBjb2RlIHByb2R1Y2VkIGJ5IHRoZSBDIGZyb250LWVuZCwgZm9yIGJpdGZpZWxkCisgICAgICAvLyBhY2Nlc3MuCisgICAgICBCaW5hcnlPcGVyYXRvciAqU2hpZnQgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oTEhTSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICBpZiAoU2hpZnQgJiYgIVNoaWZ0LT5pc1NoaWZ0KCkpCisgICAgICAgIFNoaWZ0ID0gMDsKKyAgICAgIAorICAgICAgQ29uc3RhbnRJbnQgKlNoQW10OworICAgICAgU2hBbXQgPSBTaGlmdCA/IGR5bl9jYXN0PENvbnN0YW50SW50PihTaGlmdC0+Z2V0T3BlcmFuZCgxKSkgOiAwOworICAgICAgY29uc3QgVHlwZSAqVHkgPSBTaGlmdCA/IFNoaWZ0LT5nZXRUeXBlKCkgOiAwOyAgLy8gVHlwZSBvZiB0aGUgc2hpZnQuCisgICAgICBjb25zdCBUeXBlICpBbmRUeSA9IEFuZENTVC0+Z2V0VHlwZSgpOyAgICAgICAgICAvLyBUeXBlIG9mIHRoZSBhbmQuCisgICAgICAKKyAgICAgIC8vIFdlIGNhbiBmb2xkIHRoaXMgYXMgbG9uZyBhcyB3ZSBjYW4ndCBzaGlmdCB1bmtub3duIGJpdHMKKyAgICAgIC8vIGludG8gdGhlIG1hc2suICBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aXRoIHNpZ25lZCBzaGlmdAorICAgICAgLy8gcmlnaHRzLCBhcyB0aGV5IHNpZ24tZXh0ZW5kLgorICAgICAgaWYgKFNoQW10KSB7CisgICAgICAgIGJvb2wgQ2FuRm9sZCA9IFNoaWZ0LT5pc0xvZ2ljYWxTaGlmdCgpOworICAgICAgICBpZiAoIUNhbkZvbGQpIHsKKyAgICAgICAgICAvLyBUbyB0ZXN0IGZvciB0aGUgYmFkIGNhc2Ugb2YgdGhlIHNpZ25lZCBzaHIsIHNlZSBpZiBhbnkKKyAgICAgICAgICAvLyBvZiB0aGUgYml0cyBzaGlmdGVkIGluIGNvdWxkIGJlIHRlc3RlZCBhZnRlciB0aGUgbWFzay4KKyAgICAgICAgICB1aW50MzJfdCBUeUJpdHMgPSBUeS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworICAgICAgICAgIGludCBTaEFtdFZhbCA9IFR5Qml0cyAtIFNoQW10LT5nZXRMaW1pdGVkVmFsdWUoVHlCaXRzKTsKKyAgICAgICAgICAKKyAgICAgICAgICB1aW50MzJfdCBCaXRXaWR0aCA9IEFuZFR5LT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgICAgICAgICAgaWYgKChBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIEJpdFdpZHRoLVNoQW10VmFsKSAmIAorICAgICAgICAgICAgICAgQW5kQ1NULT5nZXRWYWx1ZSgpKSA9PSAwKQorICAgICAgICAgICAgQ2FuRm9sZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChDYW5Gb2xkKSB7CisgICAgICAgICAgQ29uc3RhbnQgKk5ld0NzdDsKKyAgICAgICAgICBpZiAoU2hpZnQtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGwpCisgICAgICAgICAgICBOZXdDc3QgPSBDb25zdGFudEV4cHI6OmdldExTaHIoUkhTLCBTaEFtdCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgTmV3Q3N0ID0gQ29uc3RhbnRFeHByOjpnZXRTaGwoUkhTLCBTaEFtdCk7CisgICAgICAgICAgCisgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBzaGlmdGluZyBvdXQgYW55IG9mIHRoZSBiaXRzIGJlaW5nCisgICAgICAgICAgLy8gY29tcGFyZWQuCisgICAgICAgICAgaWYgKENvbnN0YW50RXhwcjo6Z2V0KFNoaWZ0LT5nZXRPcGNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0NzdCwgU2hBbXQpICE9IFJIUykgeworICAgICAgICAgICAgLy8gSWYgd2Ugc2hpZnRlZCBiaXRzIG91dCwgdGhlIGZvbGQgaXMgbm90IGdvaW5nIHRvIHdvcmsgb3V0LgorICAgICAgICAgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1lYW5zIHRoYXQgdGhlCisgICAgICAgICAgICAvLyByZXN1bHQgaXMgYWx3YXlzIHRydWUgb3IgZmFsc2Ugbm93LgorICAgICAgICAgICAgaWYgKElDSS5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9FUSkKKyAgICAgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKElDSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgICAgICAgIGlmIChJQ0kuZ2V0UHJlZGljYXRlKCkgPT0gSUNtcEluc3Q6OklDTVBfTkUpCisgICAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXRUcnVlKElDSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSUNJLnNldE9wZXJhbmQoMSwgTmV3Q3N0KTsKKyAgICAgICAgICAgIENvbnN0YW50ICpOZXdBbmRDU1Q7CisgICAgICAgICAgICBpZiAoU2hpZnQtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGwpCisgICAgICAgICAgICAgIE5ld0FuZENTVCA9IENvbnN0YW50RXhwcjo6Z2V0TFNocihBbmRDU1QsIFNoQW10KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgTmV3QW5kQ1NUID0gQ29uc3RhbnRFeHByOjpnZXRTaGwoQW5kQ1NULCBTaEFtdCk7CisgICAgICAgICAgICBMSFNJLT5zZXRPcGVyYW5kKDEsIE5ld0FuZENTVCk7CisgICAgICAgICAgICBMSFNJLT5zZXRPcGVyYW5kKDAsIFNoaWZ0LT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgICAgIFdvcmtsaXN0LkFkZChTaGlmdCk7IC8vIFNoaWZ0IGlzIGRlYWQuCisgICAgICAgICAgICByZXR1cm4gJklDSTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gVHVybiAoKFggPj4gWSkgJiBDKSA9PSAwICBpbnRvICAoWCAmIChDIDw8IFkpKSA9PSAwLiAgVGhlIGxhdGVyIGlzCisgICAgICAvLyBwcmVmZXJhYmxlIGJlY2F1c2UgaXQgYWxsb3dzIHRoZSBDPDxZIGV4cHJlc3Npb24gdG8gYmUgaG9pc3RlZCBvdXQKKyAgICAgIC8vIG9mIGEgbG9vcCBpZiBZIGlzIGludmFyaWFudCBhbmQgWCBpcyBub3QuCisgICAgICBpZiAoU2hpZnQgJiYgU2hpZnQtPmhhc09uZVVzZSgpICYmIFJIU1YgPT0gMCAmJgorICAgICAgICAgIElDSS5pc0VxdWFsaXR5KCkgJiYgIVNoaWZ0LT5pc0FyaXRobWV0aWNTaGlmdCgpICYmCisgICAgICAgICAgIWlzYTxDb25zdGFudD4oU2hpZnQtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgIC8vIENvbXB1dGUgQyA8PCBZLgorICAgICAgICBWYWx1ZSAqTlM7CisgICAgICAgIGlmIChTaGlmdC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkxTaHIpIHsKKyAgICAgICAgICBOUyA9IEJ1aWxkZXItPkNyZWF0ZVNobChBbmRDU1QsIFNoaWZ0LT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBJbnNlcnQgYSBsb2dpY2FsIHNoaWZ0LgorICAgICAgICAgIE5TID0gQnVpbGRlci0+Q3JlYXRlTFNocihBbmRDU1QsIFNoaWZ0LT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ29tcHV0ZSBYICYgKEMgPDwgWSkuCisgICAgICAgIFZhbHVlICpOZXdBbmQgPSAKKyAgICAgICAgICBCdWlsZGVyLT5DcmVhdGVBbmQoU2hpZnQtPmdldE9wZXJhbmQoMCksIE5TKTsKKyAgICAgICAgCisgICAgICAgIElDSS5zZXRPcGVyYW5kKDAsIE5ld0FuZCk7CisgICAgICAgIHJldHVybiAmSUNJOworICAgICAgfQorICAgIH0KKyAgICAgIAorICAgIC8vIFRyeSB0byBvcHRpbWl6ZSB0aGluZ3MgbGlrZSAiQVtpXSY0MiA9PSAwIiB0byBpbmRleCBjb21wdXRhdGlvbnMuCisgICAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihMSFNJLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPQorICAgICAgICAgIGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihMSS0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICAgIGlmIChHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oR0VQLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgICBpZiAoR1YtPmlzQ29uc3RhbnQoKSAmJiBHVi0+aGFzRGVmaW5pdGl2ZUluaXRpYWxpemVyKCkgJiYKKyAgICAgICAgICAgICAgIUxJLT5pc1ZvbGF0aWxlKCkgJiYgaXNhPENvbnN0YW50SW50PihMSFNJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICAgICAgQ29uc3RhbnRJbnQgKkMgPSBjYXN0PENvbnN0YW50SW50PihMSFNJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqUmVzID0gRm9sZENtcExvYWRGcm9tSW5kZXhlZEdsb2JhbChHRVAsIEdWLElDSSwgQykpCisgICAgICAgICAgICAgIHJldHVybiBSZXM7CisgICAgICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIEluc3RydWN0aW9uOjpPcjogeworICAgIGlmICghSUNJLmlzRXF1YWxpdHkoKSB8fCAhUkhTLT5pc051bGxWYWx1ZSgpIHx8ICFMSFNJLT5oYXNPbmVVc2UoKSkKKyAgICAgIGJyZWFrOworICAgIFZhbHVlICpQLCAqUTsKKyAgICBpZiAobWF0Y2goTEhTSSwgbV9PcihtX1B0clRvSW50KG1fVmFsdWUoUCkpLCBtX1B0clRvSW50KG1fVmFsdWUoUSkpKSkpIHsKKyAgICAgIC8vIFNpbXBsaWZ5IGljbXAgZXEgKG9yIChwdHJ0b2ludCBQKSwgKHB0cnRvaW50IFEpKSwgMAorICAgICAgLy8gLT4gYW5kIChpY21wIGVxIFAsIG51bGwpLCAoaWNtcCBlcSBRLCBudWxsKS4KKworICAgICAgVmFsdWUgKklDSVAgPSBCdWlsZGVyLT5DcmVhdGVJQ21wKElDSS5nZXRQcmVkaWNhdGUoKSwgUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFAtPmdldFR5cGUoKSkpOworICAgICAgVmFsdWUgKklDSVEgPSBCdWlsZGVyLT5DcmVhdGVJQ21wKElDSS5nZXRQcmVkaWNhdGUoKSwgUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFEtPmdldFR5cGUoKSkpOworICAgICAgSW5zdHJ1Y3Rpb24gKk9wOworICAgICAgaWYgKElDSS5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9FUSkKKyAgICAgICAgT3AgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKElDSVAsIElDSVEpOworICAgICAgZWxzZQorICAgICAgICBPcCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihJQ0lQLCBJQ0lRKTsKKyAgICAgIHJldHVybiBPcDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgICAKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOiB7ICAgICAgIC8vIChpY21wIHByZWQgKHNobCBYLCBTaEFtdCksIENJKQorICAgIENvbnN0YW50SW50ICpTaEFtdCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihMSFNJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoIVNoQW10KSBicmVhazsKKyAgICAKKyAgICB1aW50MzJfdCBUeXBlQml0cyA9IFJIU1YuZ2V0Qml0V2lkdGgoKTsKKyAgICAKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBzaGlmdCBhbW91bnQgaXMgaW4gcmFuZ2UuICBJZiBub3QsIGRvbid0IHBlcmZvcm0KKyAgICAvLyB1bmRlZmluZWQgc2hpZnRzLiAgV2hlbiB0aGUgc2hpZnQgaXMgdmlzaXRlZCBpdCB3aWxsIGJlCisgICAgLy8gc2ltcGxpZmllZC4KKyAgICBpZiAoU2hBbXQtPnVnZShUeXBlQml0cykpCisgICAgICBicmVhazsKKyAgICAKKyAgICBpZiAoSUNJLmlzRXF1YWxpdHkoKSkgeworICAgICAgLy8gSWYgd2UgYXJlIGNvbXBhcmluZyBhZ2FpbnN0IGJpdHMgYWx3YXlzIHNoaWZ0ZWQgb3V0LCB0aGUKKyAgICAgIC8vIGNvbXBhcmlzb24gY2Fubm90IHN1Y2NlZWQuCisgICAgICBDb25zdGFudCAqQ29tcCA9CisgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0U2hsKENvbnN0YW50RXhwcjo6Z2V0TFNocihSSFMsIFNoQW10KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hBbXQpOworICAgICAgaWYgKENvbXAgIT0gUkhTKSB7Ly8gQ29tcGFyaW5nIGFnYWluc3QgYSBiaXQgdGhhdCB3ZSBrbm93IGlzIHplcm8uCisgICAgICAgIGJvb2wgSXNJQ01QX05FID0gSUNJLmdldFByZWRpY2F0ZSgpID09IElDbXBJbnN0OjpJQ01QX05FOworICAgICAgICBDb25zdGFudCAqQ3N0ID0KKyAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDFUeShJQ0kuZ2V0Q29udGV4dCgpKSwgSXNJQ01QX05FKTsKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLCBDc3QpOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoTEhTSS0+aGFzT25lVXNlKCkpIHsKKyAgICAgICAgLy8gT3RoZXJ3aXNlIHN0cmVuZ3RoIHJlZHVjZSB0aGUgc2hpZnQgaW50byBhbiBhbmQuCisgICAgICAgIHVpbnQzMl90IFNoQW10VmFsID0gKHVpbnQzMl90KVNoQW10LT5nZXRMaW1pdGVkVmFsdWUoVHlwZUJpdHMpOworICAgICAgICBDb25zdGFudCAqTWFzayA9CisgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJQ0kuZ2V0Q29udGV4dCgpLCBBUEludDo6Z2V0TG93Qml0c1NldChUeXBlQml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUJpdHMtU2hBbXRWYWwpKTsKKyAgICAgICAgCisgICAgICAgIFZhbHVlICpBbmQgPQorICAgICAgICAgIEJ1aWxkZXItPkNyZWF0ZUFuZChMSFNJLT5nZXRPcGVyYW5kKDApLE1hc2spOworICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDSS5nZXRQcmVkaWNhdGUoKSwgQW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSUNJLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU1YubHNocihTaEFtdFZhbCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGlzIGlzIGEgY29tcGFyaXNvbiBvZiB0aGUgc2lnbiBiaXQsIHNpbXBsaWZ5IHRvIGFuZC90ZXN0LgorICAgIGJvb2wgVHJ1ZUlmU2lnbmVkID0gZmFsc2U7CisgICAgaWYgKExIU0ktPmhhc09uZVVzZSgpICYmCisgICAgICAgIGlzU2lnbkJpdENoZWNrKElDSS5nZXRQcmVkaWNhdGUoKSwgUkhTLCBUcnVlSWZTaWduZWQpKSB7CisgICAgICAvLyAoWCA8PCAzMSkgPHMgMCAgLS0+IChYJjEpICE9IDAKKyAgICAgIENvbnN0YW50ICpNYXNrID0gQ29uc3RhbnRJbnQ6OmdldChJQ0kuZ2V0Q29udGV4dCgpLCBBUEludChUeXBlQml0cywgMSkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHlwZUJpdHMtU2hBbXQtPmdldFpFeHRWYWx1ZSgpLTEpKTsKKyAgICAgIFZhbHVlICpBbmQgPQorICAgICAgICBCdWlsZGVyLT5DcmVhdGVBbmQoTEhTSS0+Z2V0T3BlcmFuZCgwKSwgTWFzayk7CisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KFRydWVJZlNpZ25lZCA/IElDbXBJbnN0OjpJQ01QX05FIDogSUNtcEluc3Q6OklDTVBfRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZCwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShBbmQtPmdldFR5cGUoKSkpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICAgIAorICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOiAgICAgICAgIC8vIChpY21wIHByZWQgKHNociBYLCBTaEFtdCksIENJKQorICBjYXNlIEluc3RydWN0aW9uOjpBU2hyOiB7CisgICAgLy8gT25seSBoYW5kbGUgZXF1YWxpdHkgY29tcGFyaXNvbnMgb2Ygc2hpZnQtYnktY29uc3RhbnQuCisgICAgQ29uc3RhbnRJbnQgKlNoQW10ID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KExIU0ktPmdldE9wZXJhbmQoMSkpOworICAgIGlmICghU2hBbXQgfHwgIUlDSS5pc0VxdWFsaXR5KCkpIGJyZWFrOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgc2hpZnQgYW1vdW50IGlzIGluIHJhbmdlLiAgSWYgbm90LCBkb24ndCBwZXJmb3JtCisgICAgLy8gdW5kZWZpbmVkIHNoaWZ0cy4gIFdoZW4gdGhlIHNoaWZ0IGlzIHZpc2l0ZWQgaXQgd2lsbCBiZQorICAgIC8vIHNpbXBsaWZpZWQuCisgICAgdWludDMyX3QgVHlwZUJpdHMgPSBSSFNWLmdldEJpdFdpZHRoKCk7CisgICAgaWYgKFNoQW10LT51Z2UoVHlwZUJpdHMpKQorICAgICAgYnJlYWs7CisgICAgCisgICAgdWludDMyX3QgU2hBbXRWYWwgPSAodWludDMyX3QpU2hBbXQtPmdldExpbWl0ZWRWYWx1ZShUeXBlQml0cyk7CisgICAgICAKKyAgICAvLyBJZiB3ZSBhcmUgY29tcGFyaW5nIGFnYWluc3QgYml0cyBhbHdheXMgc2hpZnRlZCBvdXQsIHRoZQorICAgIC8vIGNvbXBhcmlzb24gY2Fubm90IHN1Y2NlZWQuCisgICAgQVBJbnQgQ29tcCA9IFJIU1YgPDwgU2hBbXRWYWw7CisgICAgaWYgKExIU0ktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpMU2hyKQorICAgICAgQ29tcCA9IENvbXAubHNocihTaEFtdFZhbCk7CisgICAgZWxzZQorICAgICAgQ29tcCA9IENvbXAuYXNocihTaEFtdFZhbCk7CisgICAgCisgICAgaWYgKENvbXAgIT0gUkhTVikgeyAvLyBDb21wYXJpbmcgYWdhaW5zdCBhIGJpdCB0aGF0IHdlIGtub3cgaXMgemVyby4KKyAgICAgIGJvb2wgSXNJQ01QX05FID0gSUNJLmdldFByZWRpY2F0ZSgpID09IElDbXBJbnN0OjpJQ01QX05FOworICAgICAgQ29uc3RhbnQgKkNzdCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KElDSS5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNJQ01QX05FKTsKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwgQ3N0KTsKKyAgICB9CisgICAgCisgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayB0byBzZWUgaWYgdGhlIGJpdHMgc2hpZnRlZCBvdXQgYXJlIGtub3duIHRvIGJlIHplcm8uCisgICAgLy8gSWYgc28sIHdlIGNhbiBjb21wYXJlIGFnYWluc3QgdGhlIHVuc2hpZnRlZCB2YWx1ZToKKyAgICAvLyAgKFggJiA0KSA+PiAxID09IDIgIC0tPiAoWCAmIDQpID09IDQuCisgICAgaWYgKExIU0ktPmhhc09uZVVzZSgpICYmCisgICAgICAgIE1hc2tlZFZhbHVlSXNaZXJvKExIU0ktPmdldE9wZXJhbmQoMCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludDo6Z2V0TG93Qml0c1NldChDb21wLmdldEJpdFdpZHRoKCksIFNoQW10VmFsKSkpIHsKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNJLmdldFByZWRpY2F0ZSgpLCBMSFNJLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldFNobChSSFMsIFNoQW10KSk7CisgICAgfQorICAgICAgCisgICAgaWYgKExIU0ktPmhhc09uZVVzZSgpKSB7CisgICAgICAvLyBPdGhlcndpc2Ugc3RyZW5ndGggcmVkdWNlIHRoZSBzaGlmdCBpbnRvIGFuIGFuZC4KKyAgICAgIEFQSW50IFZhbChBUEludDo6Z2V0SGlnaEJpdHNTZXQoVHlwZUJpdHMsIFR5cGVCaXRzIC0gU2hBbXRWYWwpKTsKKyAgICAgIENvbnN0YW50ICpNYXNrID0gQ29uc3RhbnRJbnQ6OmdldChJQ0kuZ2V0Q29udGV4dCgpLCBWYWwpOworICAgICAgCisgICAgICBWYWx1ZSAqQW5kID0gQnVpbGRlci0+Q3JlYXRlQW5kKExIU0ktPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2spOworICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ0kuZ2V0UHJlZGljYXRlKCksIEFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRTaGwoUkhTLCBTaEFtdCkpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICAgIAorICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICAgIC8vIEZvbGQ6IGljbXAgcHJlZCAoW3VzXWRpdiBYLCBDMSksIEMyIC0+IHJhbmdlIHRlc3QKKyAgICAvLyBGb2xkIHRoaXMgZGl2IGludG8gdGhlIGNvbXBhcmlzb24sIHByb2R1Y2luZyBhIHJhbmdlIGNoZWNrLiAKKyAgICAvLyBEZXRlcm1pbmUsIGJhc2VkIG9uIHRoZSBkaXZpZGUgdHlwZSwgd2hhdCB0aGUgcmFuZ2UgaXMgYmVpbmcgCisgICAgLy8gY2hlY2tlZC4gIElmIHRoZXJlIGlzIGFuIG92ZXJmbG93IG9uIHRoZSBsb3cgb3IgaGlnaCBzaWRlLCByZW1lbWJlciAKKyAgICAvLyBpdCwgb3RoZXJ3aXNlIGNvbXB1dGUgdGhlIHJhbmdlIFtsb3csIGhpKSBib3VuZGluZyB0aGUgbmV3IHZhbHVlLgorICAgIC8vIFNlZTogSW5zZXJ0UmFuZ2VUZXN0IGFib3ZlIGZvciB0aGUga2luZHMgb2YgcmVwbGFjZW1lbnRzIHBvc3NpYmxlLgorICAgIGlmIChDb25zdGFudEludCAqRGl2UkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KExIU0ktPmdldE9wZXJhbmQoMSkpKQorICAgICAgaWYgKEluc3RydWN0aW9uICpSID0gRm9sZElDbXBEaXZDc3QoSUNJLCBjYXN0PEJpbmFyeU9wZXJhdG9yPihMSFNJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpdlJIUykpCisgICAgICAgIHJldHVybiBSOworICAgIGJyZWFrOworCisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICAvLyBGb2xkOiBpY21wIHByZWQgKGFkZCBYLCBDMSksIEMyCisgICAgaWYgKCFJQ0kuaXNFcXVhbGl0eSgpKSB7CisgICAgICBDb25zdGFudEludCAqTEhTQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihMSFNJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIGlmICghTEhTQykgYnJlYWs7CisgICAgICBjb25zdCBBUEludCAmTEhTViA9IExIU0MtPmdldFZhbHVlKCk7CisKKyAgICAgIENvbnN0YW50UmFuZ2UgQ1IgPSBJQ0kubWFrZUNvbnN0YW50UmFuZ2UoSUNJLmdldFByZWRpY2F0ZSgpLCBSSFNWKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJ0cmFjdChMSFNWKTsKKworICAgICAgaWYgKElDSS5pc1NpZ25lZCgpKSB7CisgICAgICAgIGlmIChDUi5nZXRMb3dlcigpLmlzU2lnbkJpdCgpKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6SUNNUF9TTFQsIExIU0ktPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KElDSS5nZXRDb250ZXh0KCksQ1IuZ2V0VXBwZXIoKSkpOworICAgICAgICB9IGVsc2UgaWYgKENSLmdldFVwcGVyKCkuaXNTaWduQml0KCkpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1NHRSwgTEhTSS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSUNJLmdldENvbnRleHQoKSxDUi5nZXRMb3dlcigpKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChDUi5nZXRMb3dlcigpLmlzTWluVmFsdWUoKSkgeworICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNtcEluc3Q6OklDTVBfVUxULCBMSFNJLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJQ0kuZ2V0Q29udGV4dCgpLENSLmdldFVwcGVyKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChDUi5nZXRVcHBlcigpLmlzTWluVmFsdWUoKSkgeworICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNtcEluc3Q6OklDTVBfVUdFLCBMSFNJLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJQ0kuZ2V0Q29udGV4dCgpLENSLmdldExvd2VyKCkpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorICAKKyAgLy8gU2ltcGxpZnkgaWNtcF9lcSBhbmQgaWNtcF9uZSBpbnN0cnVjdGlvbnMgd2l0aCBpbnRlZ2VyIGNvbnN0YW50IFJIUy4KKyAgaWYgKElDSS5pc0VxdWFsaXR5KCkpIHsKKyAgICBib29sIGlzSUNNUF9ORSA9IElDSS5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9ORTsKKyAgICAKKyAgICAvLyBJZiB0aGUgZmlyc3Qgb3BlcmFuZCBpcyAoYWRkfHN1YnxhbmR8b3J8eG9yfHJlbSkgd2l0aCBhIGNvbnN0YW50LCBhbmQgCisgICAgLy8gdGhlIHNlY29uZCBvcGVyYW5kIGlzIGEgY29uc3RhbnQsIHNpbXBsaWZ5IGEgYml0LgorICAgIGlmIChCaW5hcnlPcGVyYXRvciAqQk8gPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oTEhTSSkpIHsKKyAgICAgIHN3aXRjaCAoQk8tPmdldE9wY29kZSgpKSB7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOgorICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgc2lnbmVkIChYICUgKDJeYykpID09IDAsIHR1cm4gaXQgaW50byBhbiB1bnNpZ25lZCBvbmUuCisgICAgICAgIGlmIChSSFNWID09IDAgJiYgaXNhPENvbnN0YW50SW50PihCTy0+Z2V0T3BlcmFuZCgxKSkgJiZCTy0+aGFzT25lVXNlKCkpeworICAgICAgICAgIGNvbnN0IEFQSW50ICZWID0gY2FzdDxDb25zdGFudEludD4oQk8tPmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpOworICAgICAgICAgIGlmIChWLnNndCgxKSAmJiBWLmlzUG93ZXJPZjIoKSkgeworICAgICAgICAgICAgVmFsdWUgKk5ld1JlbSA9CisgICAgICAgICAgICAgIEJ1aWxkZXItPkNyZWF0ZVVSZW0oQk8tPmdldE9wZXJhbmQoMCksIEJPLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNJLmdldFByZWRpY2F0ZSgpLCBOZXdSZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoQk8tPmdldFR5cGUoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICAgICAgLy8gUmVwbGFjZSAoKGFkZCBBLCBCKSAhPSBDKSB3aXRoIChBICE9IEMtQikgaWYgQiAmIEMgYXJlIGNvbnN0YW50cy4KKyAgICAgICAgaWYgKENvbnN0YW50SW50ICpCT3AxQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihCTy0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICBpZiAoQk8tPmhhc09uZVVzZSgpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ0kuZ2V0UHJlZGljYXRlKCksIEJPLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldFN1YihSSFMsIEJPcDFDKSk7CisgICAgICAgIH0gZWxzZSBpZiAoUkhTViA9PSAwKSB7CisgICAgICAgICAgLy8gUmVwbGFjZSAoKGFkZCBBLCBCKSAhPSAwKSB3aXRoIChBICE9IC1CKSBpZiBBIG9yIEIgaXMKKyAgICAgICAgICAvLyBlZmZpY2llbnRseSBpbnZlcnRpYmxlLCBvciBpZiB0aGUgYWRkIGhhcyBqdXN0IHRoaXMgb25lIHVzZS4KKyAgICAgICAgICBWYWx1ZSAqQk9wMCA9IEJPLT5nZXRPcGVyYW5kKDApLCAqQk9wMSA9IEJPLT5nZXRPcGVyYW5kKDEpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChWYWx1ZSAqTmVnVmFsID0gZHluX2Nhc3ROZWdWYWwoQk9wMSkpCisgICAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDSS5nZXRQcmVkaWNhdGUoKSwgQk9wMCwgTmVnVmFsKTsKKyAgICAgICAgICBlbHNlIGlmIChWYWx1ZSAqTmVnVmFsID0gZHluX2Nhc3ROZWdWYWwoQk9wMCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDSS5nZXRQcmVkaWNhdGUoKSwgTmVnVmFsLCBCT3AxKTsKKyAgICAgICAgICBlbHNlIGlmIChCTy0+aGFzT25lVXNlKCkpIHsKKyAgICAgICAgICAgIFZhbHVlICpOZWcgPSBCdWlsZGVyLT5DcmVhdGVOZWcoQk9wMSk7CisgICAgICAgICAgICBOZWctPnRha2VOYW1lKEJPKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNJLmdldFByZWRpY2F0ZSgpLCBCT3AwLCBOZWcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgICAgICAgLy8gRm9yIHRoZSB4b3IgY2FzZSwgd2UgY2FuIHhvciB0d28gY29uc3RhbnRzIHRvZ2V0aGVyLCBlbGltaW5hdGluZworICAgICAgICAvLyB0aGUgZXhwbGljaXQgeG9yLgorICAgICAgICBpZiAoQ29uc3RhbnQgKkJPQyA9IGR5bl9jYXN0PENvbnN0YW50PihCTy0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ0kuZ2V0UHJlZGljYXRlKCksIEJPLT5nZXRPcGVyYW5kKDApLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0WG9yKFJIUywgQk9DKSk7CisgICAgICAgIAorICAgICAgICAvLyBGQUxMVEhST1VHSAorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICAgICAgICAvLyBSZXBsYWNlICgoW3N1Ynx4b3JdIEEsIEIpICE9IDApIHdpdGggKEEgIT0gQikKKyAgICAgICAgaWYgKFJIU1YgPT0gMCkKKyAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDSS5nZXRQcmVkaWNhdGUoKSwgQk8tPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTy0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICAgICAgICAvLyBJZiBiaXRzIGFyZSBiZWluZyBvcidkIGluIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBjb25zdGFudCB3ZQorICAgICAgICAvLyBhcmUgY29tcGFyaW5nIGFnYWluc3QsIHRoZW4gdGhlIGNvbXBhcmlzb24gY291bGQgbmV2ZXIgc3VjY2VlZCEKKyAgICAgICAgaWYgKENvbnN0YW50SW50ICpCT0MgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQk8tPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgICAgQ29uc3RhbnQgKk5vdENJID0gQ29uc3RhbnRFeHByOjpnZXROb3QoUkhTKTsKKyAgICAgICAgICBpZiAoIUNvbnN0YW50RXhwcjo6Z2V0QW5kKEJPQywgTm90Q0kpLT5pc051bGxWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDFUeShJQ0kuZ2V0Q29udGV4dCgpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lDTVBfTkUpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgICAgIGlmIChDb25zdGFudEludCAqQk9DID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEJPLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICAgIC8vIElmIGJpdHMgYXJlIGJlaW5nIGNvbXBhcmVkIGFnYWluc3QgdGhhdCBhcmUgYW5kJ2Qgb3V0LCB0aGVuIHRoZQorICAgICAgICAgIC8vIGNvbXBhcmlzb24gY2FuIG5ldmVyIHN1Y2NlZWQhCisgICAgICAgICAgaWYgKChSSFNWICYgfkJPQy0+Z2V0VmFsdWUoKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxVHkoSUNJLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lDTVBfTkUpKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBJZiB3ZSBoYXZlICgoWCAmIEMpID09IEMpLCB0dXJuIGl0IGludG8gKChYICYgQykgIT0gMCkuCisgICAgICAgICAgaWYgKFJIUyA9PSBCT0MgJiYgUkhTVi5pc1Bvd2VyT2YyKCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KGlzSUNNUF9ORSA/IElDbXBJbnN0OjpJQ01QX0VRIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OklDTVBfTkUsIExIU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoUkhTLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBSZXBsYWNlIChhbmQgWCwgKDEgPDwgc2l6ZShYKS0xKSAhPSAwKSB3aXRoIHggczwgMAorICAgICAgICAgIGlmIChCT0MtPmdldFZhbHVlKCkuaXNTaWduQml0KCkpIHsKKyAgICAgICAgICAgIFZhbHVlICpYID0gQk8tPmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgICBDb25zdGFudCAqWmVybyA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoWC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICAgIElDbXBJbnN0OjpQcmVkaWNhdGUgcHJlZCA9IGlzSUNNUF9ORSA/IAorICAgICAgICAgICAgICBJQ21wSW5zdDo6SUNNUF9TTFQgOiBJQ21wSW5zdDo6SUNNUF9TR0U7CisgICAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KHByZWQsIFgsIFplcm8pOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvLyAoKFggJiB+NykgPT0gMCkgLS0+IFggPCA4CisgICAgICAgICAgaWYgKFJIU1YgPT0gMCAmJiBpc0hpZ2hPbmVzKEJPQykpIHsKKyAgICAgICAgICAgIFZhbHVlICpYID0gQk8tPmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgICBDb25zdGFudCAqTmVnWCA9IENvbnN0YW50RXhwcjo6Z2V0TmVnKEJPQyk7CisgICAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIHByZWQgPSBpc0lDTVBfTkUgPyAKKyAgICAgICAgICAgICAgSUNtcEluc3Q6OklDTVBfVUdFIDogSUNtcEluc3Q6OklDTVBfVUxUOworICAgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChwcmVkLCBYLCBOZWdYKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoSW50cmluc2ljSW5zdCAqSUkgPSBkeW5fY2FzdDxJbnRyaW5zaWNJbnN0PihMSFNJKSkgeworICAgICAgLy8gSGFuZGxlIGljbXAge2VxfG5lfSA8aW50cmluc2ljPiwgaW50Y3N0LgorICAgICAgc3dpdGNoIChJSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6OmJzd2FwOgorICAgICAgICBXb3JrbGlzdC5BZGQoSUkpOworICAgICAgICBJQ0kuc2V0T3BlcmFuZCgwLCBJSS0+Z2V0QXJnT3BlcmFuZCgwKSk7CisgICAgICAgIElDSS5zZXRPcGVyYW5kKDEsIENvbnN0YW50SW50OjpnZXQoSUktPmdldENvbnRleHQoKSwgUkhTVi5ieXRlU3dhcCgpKSk7CisgICAgICAgIHJldHVybiAmSUNJOworICAgICAgY2FzZSBJbnRyaW5zaWM6OmN0bHo6CisgICAgICBjYXNlIEludHJpbnNpYzo6Y3R0ejoKKyAgICAgICAgLy8gY3R6KEEpID09IGJpdHdpZHRoKGEpICAtPiAgQSA9PSAwIGFuZCBsaWtld2lzZSBmb3IgIT0KKyAgICAgICAgaWYgKFJIU1YgPT0gUkhTLT5nZXRUeXBlKCktPmdldEJpdFdpZHRoKCkpIHsKKyAgICAgICAgICBXb3JrbGlzdC5BZGQoSUkpOworICAgICAgICAgIElDSS5zZXRPcGVyYW5kKDAsIElJLT5nZXRBcmdPcGVyYW5kKDApKTsKKyAgICAgICAgICBJQ0kuc2V0T3BlcmFuZCgxLCBDb25zdGFudEludDo6Z2V0KFJIUy0+Z2V0VHlwZSgpLCAwKSk7CisgICAgICAgICAgcmV0dXJuICZJQ0k7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEludHJpbnNpYzo6Y3Rwb3A6CisgICAgICAgIC8vIHBvcGNvdW50KEEpID09IDAgIC0+ICBBID09IDAgYW5kIGxpa2V3aXNlIGZvciAhPQorICAgICAgICBpZiAoUkhTLT5pc1plcm8oKSkgeworICAgICAgICAgIFdvcmtsaXN0LkFkZChJSSk7CisgICAgICAgICAgSUNJLnNldE9wZXJhbmQoMCwgSUktPmdldEFyZ09wZXJhbmQoMCkpOworICAgICAgICAgIElDSS5zZXRPcGVyYW5kKDEsIFJIUyk7CisgICAgICAgICAgcmV0dXJuICZJQ0k7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyB2aXNpdElDbXBJbnN0V2l0aENhc3RBbmRDYXN0IC0gSGFuZGxlIGljbXAgKGNhc3QgeCB0byB5KSwgKGNhc3QvY3N0KS4KKy8vLyBXZSBvbmx5IGhhbmRsZSBleHRlbmRpbmcgY2FzdHMgc28gZmFyLgorLy8vCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdElDbXBJbnN0V2l0aENhc3RBbmRDYXN0KElDbXBJbnN0ICZJQ0kpIHsKKyAgY29uc3QgQ2FzdEluc3QgKkxIU0NJID0gY2FzdDxDYXN0SW5zdD4oSUNJLmdldE9wZXJhbmQoMCkpOworICBWYWx1ZSAqTEhTQ0lPcCAgICAgICAgPSBMSFNDSS0+Z2V0T3BlcmFuZCgwKTsKKyAgY29uc3QgVHlwZSAqU3JjVHkgICAgID0gTEhTQ0lPcC0+Z2V0VHlwZSgpOworICBjb25zdCBUeXBlICpEZXN0VHkgICAgPSBMSFNDSS0+Z2V0VHlwZSgpOworICBWYWx1ZSAqUkhTQ0lPcDsKKworICAvLyBUdXJuIGljbXAgKHB0cnRvaW50IHgpLCAocHRydG9pbnQvYykgaW50byBhIGNvbXBhcmUgb2YgdGhlIGlucHV0IGlmIHRoZSAKKyAgLy8gaW50ZWdlciB0eXBlIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIHBvaW50ZXIgdHlwZS4KKyAgaWYgKFREICYmIExIU0NJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQgJiYKKyAgICAgIFRELT5nZXRQb2ludGVyU2l6ZUluQml0cygpID09CisgICAgICAgICBjYXN0PEludGVnZXJUeXBlPihEZXN0VHkpLT5nZXRCaXRXaWR0aCgpKSB7CisgICAgVmFsdWUgKlJIU09wID0gMDsKKyAgICBpZiAoQ29uc3RhbnQgKlJIU0MgPSBkeW5fY2FzdDxDb25zdGFudD4oSUNJLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICBSSFNPcCA9IENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoUkhTQywgU3JjVHkpOworICAgIH0gZWxzZSBpZiAoUHRyVG9JbnRJbnN0ICpSSFNDID0gZHluX2Nhc3Q8UHRyVG9JbnRJbnN0PihJQ0kuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIFJIU09wID0gUkhTQy0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIC8vIElmIHRoZSBwb2ludGVyIHR5cGVzIGRvbid0IG1hdGNoLCBpbnNlcnQgYSBiaXRjYXN0LgorICAgICAgaWYgKExIU0NJT3AtPmdldFR5cGUoKSAhPSBSSFNPcC0+Z2V0VHlwZSgpKQorICAgICAgICBSSFNPcCA9IEJ1aWxkZXItPkNyZWF0ZUJpdENhc3QoUkhTT3AsIExIU0NJT3AtPmdldFR5cGUoKSk7CisgICAgfQorCisgICAgaWYgKFJIU09wKQorICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ0kuZ2V0UHJlZGljYXRlKCksIExIU0NJT3AsIFJIU09wKTsKKyAgfQorICAKKyAgLy8gVGhlIGNvZGUgYmVsb3cgb25seSBoYW5kbGVzIGV4dGVuc2lvbiBjYXN0IGluc3RydWN0aW9ucywgc28gZmFyLgorICAvLyBFbmZvcmNlIHRoaXMuCisgIGlmIChMSFNDSS0+Z2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246OlpFeHQgJiYKKyAgICAgIExIU0NJLT5nZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6U0V4dCkKKyAgICByZXR1cm4gMDsKKworICBib29sIGlzU2lnbmVkRXh0ID0gTEhTQ0ktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTRXh0OworICBib29sIGlzU2lnbmVkQ21wID0gSUNJLmlzU2lnbmVkKCk7CisKKyAgaWYgKENhc3RJbnN0ICpDSSA9IGR5bl9jYXN0PENhc3RJbnN0PihJQ0kuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAvLyBOb3QgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIHNhbWUgdHlwZT8KKyAgICBSSFNDSU9wID0gQ0ktPmdldE9wZXJhbmQoMCk7CisgICAgaWYgKFJIU0NJT3AtPmdldFR5cGUoKSAhPSBMSFNDSU9wLT5nZXRUeXBlKCkpIAorICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgLy8gSWYgdGhlIHNpZ25lZG5lc3Mgb2YgdGhlIHR3byBjYXN0cyBkb2Vzbid0IGFncmVlIChpLmUuIG9uZSBpcyBhIHNleHQKKyAgICAvLyBhbmQgdGhlIG90aGVyIGlzIGEgemV4dCksIHRoZW4gd2UgY2FuJ3QgaGFuZGxlIHRoaXMuCisgICAgaWYgKENJLT5nZXRPcGNvZGUoKSAhPSBMSFNDSS0+Z2V0T3Bjb2RlKCkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIERlYWwgd2l0aCBlcXVhbGl0eSBjYXNlcyBlYXJseS4KKyAgICBpZiAoSUNJLmlzRXF1YWxpdHkoKSkKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNJLmdldFByZWRpY2F0ZSgpLCBMSFNDSU9wLCBSSFNDSU9wKTsKKworICAgIC8vIEEgc2lnbmVkIGNvbXBhcmlzb24gb2Ygc2lnbiBleHRlbmRlZCB2YWx1ZXMgc2ltcGxpZmllcyBpbnRvIGEKKyAgICAvLyBzaWduZWQgY29tcGFyaXNvbi4KKyAgICBpZiAoaXNTaWduZWRDbXAgJiYgaXNTaWduZWRFeHQpCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDSS5nZXRQcmVkaWNhdGUoKSwgTEhTQ0lPcCwgUkhTQ0lPcCk7CisKKyAgICAvLyBUaGUgb3RoZXIgdGhyZWUgY2FzZXMgYWxsIGZvbGQgaW50byBhbiB1bnNpZ25lZCBjb21wYXJpc29uLgorICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNJLmdldFVuc2lnbmVkUHJlZGljYXRlKCksIExIU0NJT3AsIFJIU0NJT3ApOworICB9CisKKyAgLy8gSWYgd2UgYXJlbid0IGRlYWxpbmcgd2l0aCBhIGNvbnN0YW50IG9uIHRoZSBSSFMsIGV4aXQgZWFybHkKKyAgQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KElDSS5nZXRPcGVyYW5kKDEpKTsKKyAgaWYgKCFDSSkKKyAgICByZXR1cm4gMDsKKworICAvLyBDb21wdXRlIHRoZSBjb25zdGFudCB0aGF0IHdvdWxkIGhhcHBlbiBpZiB3ZSB0cnVuY2F0ZWQgdG8gU3JjVHkgdGhlbgorICAvLyByZWV4dGVuZGVkIHRvIERlc3RUeS4KKyAgQ29uc3RhbnQgKlJlczEgPSBDb25zdGFudEV4cHI6OmdldFRydW5jKENJLCBTcmNUeSk7CisgIENvbnN0YW50ICpSZXMyID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KExIU0NJLT5nZXRPcGNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlczEsIERlc3RUeSk7CisKKyAgLy8gSWYgdGhlIHJlLWV4dGVuZGVkIGNvbnN0YW50IGRpZG4ndCBjaGFuZ2UuLi4KKyAgaWYgKFJlczIgPT0gQ0kpIHsKKyAgICAvLyBEZWFsIHdpdGggZXF1YWxpdHkgY2FzZXMgZWFybHkuCisgICAgaWYgKElDSS5pc0VxdWFsaXR5KCkpCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDSS5nZXRQcmVkaWNhdGUoKSwgTEhTQ0lPcCwgUmVzMSk7CisKKyAgICAvLyBBIHNpZ25lZCBjb21wYXJpc29uIG9mIHNpZ24gZXh0ZW5kZWQgdmFsdWVzIHNpbXBsaWZpZXMgaW50byBhCisgICAgLy8gc2lnbmVkIGNvbXBhcmlzb24uCisgICAgaWYgKGlzU2lnbmVkRXh0ICYmIGlzU2lnbmVkQ21wKQorICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ0kuZ2V0UHJlZGljYXRlKCksIExIU0NJT3AsIFJlczEpOworCisgICAgLy8gVGhlIG90aGVyIHRocmVlIGNhc2VzIGFsbCBmb2xkIGludG8gYW4gdW5zaWduZWQgY29tcGFyaXNvbi4KKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDSS5nZXRVbnNpZ25lZFByZWRpY2F0ZSgpLCBMSFNDSU9wLCBSZXMxKTsKKyAgfQorCisgIC8vIFRoZSByZS1leHRlbmRlZCBjb25zdGFudCBjaGFuZ2VkIHNvIHRoZSBjb25zdGFudCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgCisgIC8vIGluIHRoZSBzaG9ydGVyIHR5cGUuIENvbnNlcXVlbnRseSwgd2UgY2Fubm90IGVtaXQgYSBzaW1wbGUgY29tcGFyaXNvbi4KKworICAvLyBGaXJzdCwgaGFuZGxlIHNvbWUgZWFzeSBjYXNlcy4gV2Uga25vdyB0aGUgcmVzdWx0IGNhbm5vdCBiZSBlcXVhbCBhdCB0aGlzCisgIC8vIHBvaW50IHNvIGhhbmRsZSB0aGUgSUNJLmlzRXF1YWxpdHkoKSBjYXNlcworICBpZiAoSUNJLmdldFByZWRpY2F0ZSgpID09IElDbXBJbnN0OjpJQ01QX0VRKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElDSSwgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKElDSS5nZXRDb250ZXh0KCkpKTsKKyAgaWYgKElDSS5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9ORSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJQ0ksIENvbnN0YW50SW50OjpnZXRUcnVlKElDSS5nZXRDb250ZXh0KCkpKTsKKworICAvLyBFdmFsdWF0ZSB0aGUgY29tcGFyaXNvbiBmb3IgTFQgKHdlIGludmVydCBmb3IgR1QgYmVsb3cpLiBMRSBhbmQgR0UgY2FzZXMKKyAgLy8gc2hvdWxkIGhhdmUgYmVlbiBmb2xkZWQgYXdheSBwcmV2aW91c2x5IGFuZCBub3QgZW50ZXIgaW4gaGVyZS4KKyAgVmFsdWUgKlJlc3VsdDsKKyAgaWYgKGlzU2lnbmVkQ21wKSB7CisgICAgLy8gV2UncmUgcGVyZm9ybWluZyBhIHNpZ25lZCBjb21wYXJpc29uLgorICAgIGlmIChjYXN0PENvbnN0YW50SW50PihDSSktPmdldFZhbHVlKCkuaXNOZWdhdGl2ZSgpKQorICAgICAgUmVzdWx0ID0gQ29uc3RhbnRJbnQ6OmdldEZhbHNlKElDSS5nZXRDb250ZXh0KCkpOyAvLyBYIDwgKHNtYWxsKSAtLT4gZmFsc2UKKyAgICBlbHNlCisgICAgICBSZXN1bHQgPSBDb25zdGFudEludDo6Z2V0VHJ1ZShJQ0kuZ2V0Q29udGV4dCgpKTsgIC8vIFggPCAobGFyZ2UpIC0tPiB0cnVlCisgIH0gZWxzZSB7CisgICAgLy8gV2UncmUgcGVyZm9ybWluZyBhbiB1bnNpZ25lZCBjb21wYXJpc29uLgorICAgIGlmIChpc1NpZ25lZEV4dCkgeworICAgICAgLy8gV2UncmUgcGVyZm9ybWluZyBhbiB1bnNpZ25lZCBjb21wIHdpdGggYSBzaWduIGV4dGVuZGVkIHZhbHVlLgorICAgICAgLy8gVGhpcyBpcyB0cnVlIGlmIHRoZSBpbnB1dCBpcyA+PSAwLiBbYWthID5zIC0xXQorICAgICAgQ29uc3RhbnQgKk5lZ09uZSA9IENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoU3JjVHkpOworICAgICAgUmVzdWx0ID0gQnVpbGRlci0+Q3JlYXRlSUNtcFNHVChMSFNDSU9wLCBOZWdPbmUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBVbnNpZ25lZCBleHRlbmQgJiB1bnNpZ25lZCBjb21wYXJlIC0+IGFsd2F5cyB0cnVlLgorICAgICAgUmVzdWx0ID0gQ29uc3RhbnRJbnQ6OmdldFRydWUoSUNJLmdldENvbnRleHQoKSk7CisgICAgfQorICB9CisKKyAgLy8gRmluYWxseSwgcmV0dXJuIHRoZSB2YWx1ZSBjb21wdXRlZC4KKyAgaWYgKElDSS5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9VTFQgfHwKKyAgICAgIElDSS5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9TTFQpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLCBSZXN1bHQpOworCisgIGFzc2VydCgoSUNJLmdldFByZWRpY2F0ZSgpPT1JQ21wSW5zdDo6SUNNUF9VR1QgfHwgCisgICAgICAgICAgSUNJLmdldFByZWRpY2F0ZSgpPT1JQ21wSW5zdDo6SUNNUF9TR1QpICYmCisgICAgICAgICAiSUNtcCBzaG91bGQgYmUgZm9sZGVkISIpOworICBpZiAoQ29uc3RhbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJlc3VsdCkpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUNJLCBDb25zdGFudEV4cHI6OmdldE5vdChDSSkpOworICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5vdChSZXN1bHQpOworfQorCisKKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRJQ21wSW5zdChJQ21wSW5zdCAmSSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKyAgCisgIC8vLyBPcmRlcnMgdGhlIG9wZXJhbmRzIG9mIHRoZSBjb21wYXJlIHNvIHRoYXQgdGhleSBhcmUgbGlzdGVkIGZyb20gbW9zdAorICAvLy8gY29tcGxleCB0byBsZWFzdCBjb21wbGV4LiAgVGhpcyBwdXRzIGNvbnN0YW50cyBiZWZvcmUgdW5hcnkgb3BlcmF0b3JzLAorICAvLy8gYmVmb3JlIGJpbmFyeSBvcGVyYXRvcnMuCisgIGlmIChnZXRDb21wbGV4aXR5KE9wMCkgPCBnZXRDb21wbGV4aXR5KE9wMSkpIHsKKyAgICBJLnN3YXBPcGVyYW5kcygpOworICAgIHN0ZDo6c3dhcChPcDAsIE9wMSk7CisgICAgQ2hhbmdlZCA9IHRydWU7CisgIH0KKyAgCisgIGlmIChWYWx1ZSAqViA9IFNpbXBsaWZ5SUNtcEluc3QoSS5nZXRQcmVkaWNhdGUoKSwgT3AwLCBPcDEsIFREKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBWKTsKKyAgCisgIGNvbnN0IFR5cGUgKlR5ID0gT3AwLT5nZXRUeXBlKCk7CisKKyAgLy8gaWNtcCdzIHdpdGggYm9vbGVhbiB2YWx1ZXMgY2FuIGFsd2F5cyBiZSB0dXJuZWQgaW50byBiaXR3aXNlIG9wZXJhdGlvbnMKKyAgaWYgKFR5LT5pc0ludGVnZXJUeSgxKSkgeworICAgIHN3aXRjaCAoSS5nZXRQcmVkaWNhdGUoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgaWNtcCBpbnN0cnVjdGlvbiEiKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiB7ICAgICAgICAgICAgICAgLy8gaWNtcCBlcSBpMSBBLCBCIC0+IH4oQV5CKQorICAgICAgVmFsdWUgKlhvciA9IEJ1aWxkZXItPkNyZWF0ZVhvcihPcDAsIE9wMSk7CisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5vdChYb3IpOworICAgIH0KKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiAgICAgICAgICAgICAgICAgIC8vIGljbXAgZXEgaTEgQSwgQiAtPiBBXkIKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKE9wMCwgT3AxKTsKKworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOgorICAgICAgc3RkOjpzd2FwKE9wMCwgT3AxKTsgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIGljbXAgdWd0IC0+IGljbXAgdWx0CisgICAgICAvLyBGQUxMIFRIUk9VR0gKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDp7ICAgICAgICAgICAgICAgLy8gaWNtcCB1bHQgaTEgQSwgQiAtPiB+QSAmIEIKKyAgICAgIFZhbHVlICpOb3QgPSBCdWlsZGVyLT5DcmVhdGVOb3QoT3AwKTsKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKE5vdCwgT3AxKTsKKyAgICB9CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6CisgICAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOyAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaWNtcCBzZ3QgLT4gaWNtcCBzbHQKKyAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiB7ICAgICAgICAgICAgICAgLy8gaWNtcCBzbHQgaTEgQSwgQiAtPiBBICYgfkIKKyAgICAgIFZhbHVlICpOb3QgPSBCdWlsZGVyLT5DcmVhdGVOb3QoT3AxKTsKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKE5vdCwgT3AwKTsKKyAgICB9CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6CisgICAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOyAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaWNtcCB1Z2UgLT4gaWNtcCB1bGUKKyAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxFOiB7ICAgICAgICAgICAgICAgLy8gIGljbXAgdWxlIGkxIEEsIEIgLT4gfkEgfCBCCisgICAgICBWYWx1ZSAqTm90ID0gQnVpbGRlci0+Q3JlYXRlTm90KE9wMCk7CisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKE5vdCwgT3AxKTsKKyAgICB9CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR0U6CisgICAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOyAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaWNtcCBzZ2UgLT4gaWNtcCBzbGUKKyAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xFOiB7ICAgICAgICAgICAgICAgLy8gIGljbXAgc2xlIGkxIEEsIEIgLT4gQSB8IH5CCisgICAgICBWYWx1ZSAqTm90ID0gQnVpbGRlci0+Q3JlYXRlTm90KE9wMSk7CisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKE5vdCwgT3AwKTsKKyAgICB9CisgICAgfQorICB9CisKKyAgdW5zaWduZWQgQml0V2lkdGggPSAwOworICBpZiAoVEQpCisgICAgQml0V2lkdGggPSBURC0+Z2V0VHlwZVNpemVJbkJpdHMoVHktPmdldFNjYWxhclR5cGUoKSk7CisgIGVsc2UgaWYgKFR5LT5pc0ludE9ySW50VmVjdG9yVHkoKSkKKyAgICBCaXRXaWR0aCA9IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisKKyAgYm9vbCBpc1NpZ25CaXQgPSBmYWxzZTsKKworICAvLyBTZWUgaWYgd2UgYXJlIGRvaW5nIGEgY29tcGFyaXNvbiB3aXRoIGEgY29uc3RhbnQuCisgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AxKSkgeworICAgIFZhbHVlICpBID0gMCwgKkIgPSAwOworICAgIAorICAgIC8vIChpY21wIG5lL2VxIChzdWIgQSBCKSAwKSAtPiAoaWNtcCBuZS9lcSBBLCBCKQorICAgIGlmIChJLmlzRXF1YWxpdHkoKSAmJiBDSS0+aXNaZXJvKCkgJiYKKyAgICAgICAgbWF0Y2goT3AwLCBtX1N1YihtX1ZhbHVlKEEpLCBtX1ZhbHVlKEIpKSkpIHsKKyAgICAgIC8vIChpY21wIGNvbmQgQSBCKSBpZiBjb25kIGlzIGVxdWFsaXR5CisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KEkuZ2V0UHJlZGljYXRlKCksIEEsIEIpOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB3ZSBoYXZlIGFuIGljbXAgbGUgb3IgaWNtcCBnZSBpbnN0cnVjdGlvbiwgdHVybiBpdCBpbnRvIHRoZQorICAgIC8vIGFwcHJvcHJpYXRlIGljbXAgbHQgb3IgaWNtcCBndCBpbnN0cnVjdGlvbi4gIFRoaXMgYWxsb3dzIHVzIHRvIHJlbHkgb24KKyAgICAvLyB0aGVtIGJlaW5nIGZvbGRlZCBpbiB0aGUgY29kZSBiZWxvdy4gIFRoZSBTaW1wbGlmeUlDbXBJbnN0IGNvZGUgaGFzCisgICAgLy8gYWxyZWFkeSBoYW5kbGVkIHRoZSBlZGdlIGNhc2VzIGZvciB1cywgc28gd2UganVzdCBhc3NlcnQgb24gdGhlbS4KKyAgICBzd2l0Y2ggKEkuZ2V0UHJlZGljYXRlKCkpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRToKKyAgICAgIGFzc2VydCghQ0ktPmlzTWF4VmFsdWUoZmFsc2UpKTsgICAgICAgICAgICAgICAgIC8vIEEgPD11IE1BWCAtPiBUUlVFCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1VMVCwgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KENJLT5nZXRDb250ZXh0KCksIENJLT5nZXRWYWx1ZSgpKzEpKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRToKKyAgICAgIGFzc2VydCghQ0ktPmlzTWF4VmFsdWUodHJ1ZSkpOyAgICAgICAgICAgICAgICAgIC8vIEEgPD1zIE1BWCAtPiBUUlVFCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1NMVCwgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KENJLT5nZXRDb250ZXh0KCksIENJLT5nZXRWYWx1ZSgpKzEpKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHRToKKyAgICAgIGFzc2VydCghQ0ktPmlzTWluVmFsdWUoZmFsc2UpKTsgICAgICAgICAgICAgICAgICAvLyBBID49dSBNSU4gLT4gVFJVRQorICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6SUNNUF9VR1QsIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChDSS0+Z2V0Q29udGV4dCgpLCBDSS0+Z2V0VmFsdWUoKS0xKSk7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR0U6CisgICAgICBhc3NlcnQoIUNJLT5pc01pblZhbHVlKHRydWUpKTsgICAgICAgICAgICAgICAgICAgLy8gQSA+PXMgTUlOIC0+IFRSVUUKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNtcEluc3Q6OklDTVBfU0dULCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoQ0ktPmdldENvbnRleHQoKSwgQ0ktPmdldFZhbHVlKCktMSkpOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGlzIGNvbXBhcmlzb24gaXMgYSBub3JtYWwgY29tcGFyaXNvbiwgaXQgZGVtYW5kcyBhbGwKKyAgICAvLyBiaXRzLCBpZiBpdCBpcyBhIHNpZ24gYml0IGNvbXBhcmlzb24sIGl0IG9ubHkgZGVtYW5kcyB0aGUgc2lnbiBiaXQuCisgICAgYm9vbCBVbnVzZWRCaXQ7CisgICAgaXNTaWduQml0ID0gaXNTaWduQml0Q2hlY2soSS5nZXRQcmVkaWNhdGUoKSwgQ0ksIFVudXNlZEJpdCk7CisgIH0KKworICAvLyBTZWUgaWYgd2UgY2FuIGZvbGQgdGhlIGNvbXBhcmlzb24gYmFzZWQgb24gcmFuZ2UgaW5mb3JtYXRpb24gd2UgY2FuIGdldAorICAvLyBieSBjaGVja2luZyB3aGV0aGVyIGJpdHMgYXJlIGtub3duIHRvIGJlIHplcm8gb3Igb25lIGluIHRoZSBpbnB1dC4KKyAgaWYgKEJpdFdpZHRoICE9IDApIHsKKyAgICBBUEludCBPcDBLbm93blplcm8oQml0V2lkdGgsIDApLCBPcDBLbm93bk9uZShCaXRXaWR0aCwgMCk7CisgICAgQVBJbnQgT3AxS25vd25aZXJvKEJpdFdpZHRoLCAwKSwgT3AxS25vd25PbmUoQml0V2lkdGgsIDApOworCisgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEkuZ2V0T3BlcmFuZFVzZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduQml0ID8gQVBJbnQ6OmdldFNpZ25CaXQoQml0V2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoQml0V2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDBLbm93blplcm8sIE9wMEtub3duT25lLCAwKSkKKyAgICAgIHJldHVybiAmSTsKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoSS5nZXRPcGVyYW5kVXNlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AxS25vd25aZXJvLCBPcDFLbm93bk9uZSwgMCkpCisgICAgICByZXR1cm4gJkk7CisKKyAgICAvLyBHaXZlbiB0aGUga25vd24gYW5kIHVua25vd24gYml0cywgY29tcHV0ZSBhIHJhbmdlIHRoYXQgdGhlIExIUyBjb3VsZCBiZQorICAgIC8vIGluLiAgQ29tcHV0ZSB0aGUgTWluLCBNYXggYW5kIFJIUyB2YWx1ZXMgYmFzZWQgb24gdGhlIGtub3duIGJpdHMuIEZvciB0aGUKKyAgICAvLyBFUSBhbmQgTkUgd2UgdXNlIHVuc2lnbmVkIHZhbHVlcy4KKyAgICBBUEludCBPcDBNaW4oQml0V2lkdGgsIDApLCBPcDBNYXgoQml0V2lkdGgsIDApOworICAgIEFQSW50IE9wMU1pbihCaXRXaWR0aCwgMCksIE9wMU1heChCaXRXaWR0aCwgMCk7CisgICAgaWYgKEkuaXNTaWduZWQoKSkgeworICAgICAgQ29tcHV0ZVNpZ25lZE1pbk1heFZhbHVlc0Zyb21Lbm93bkJpdHMoT3AwS25vd25aZXJvLCBPcDBLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wME1pbiwgT3AwTWF4KTsKKyAgICAgIENvbXB1dGVTaWduZWRNaW5NYXhWYWx1ZXNGcm9tS25vd25CaXRzKE9wMUtub3duWmVybywgT3AxS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDFNaW4sIE9wMU1heCk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvbXB1dGVVbnNpZ25lZE1pbk1heFZhbHVlc0Zyb21Lbm93bkJpdHMoT3AwS25vd25aZXJvLCBPcDBLbm93bk9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AwTWluLCBPcDBNYXgpOworICAgICAgQ29tcHV0ZVVuc2lnbmVkTWluTWF4VmFsdWVzRnJvbUtub3duQml0cyhPcDFLbm93blplcm8sIE9wMUtub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDFNaW4sIE9wMU1heCk7CisgICAgfQorCisgICAgLy8gSWYgTWluIGFuZCBNYXggYXJlIGtub3duIHRvIGJlIHRoZSBzYW1lLCB0aGVuIFNpbXBsaWZ5RGVtYW5kZWRCaXRzCisgICAgLy8gZmlndXJlZCBvdXQgdGhhdCB0aGUgTEhTIGlzIGEgY29uc3RhbnQuICBKdXN0IGNvbnN0YW50IGZvbGQgdGhpcyBub3cgc28KKyAgICAvLyB0aGF0IGNvZGUgYmVsb3cgY2FuIGFzc3VtZSB0aGF0IE1pbiAhPSBNYXguCisgICAgaWYgKCFpc2E8Q29uc3RhbnQ+KE9wMCkgJiYgT3AwTWluID09IE9wME1heCkKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSS5nZXRQcmVkaWNhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJLmdldENvbnRleHQoKSwgT3AwTWluKSwgT3AxKTsKKyAgICBpZiAoIWlzYTxDb25zdGFudD4oT3AxKSAmJiBPcDFNaW4gPT0gT3AxTWF4KQorICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJLmdldFByZWRpY2F0ZSgpLCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSS5nZXRDb250ZXh0KCksIE9wMU1pbikpOworCisgICAgLy8gQmFzZWQgb24gdGhlIHJhbmdlIGluZm9ybWF0aW9uIHdlIGtub3cgYWJvdXQgdGhlIExIUywgc2VlIGlmIHdlIGNhbgorICAgIC8vIHNpbXBsaWZ5IHRoaXMgY29tcGFyaXNvbi4gIEZvciBleGFtcGxlLCAoeCY0KSA8IDggIGlzIGFsd2F5cyB0cnVlLgorICAgIHN3aXRjaCAoSS5nZXRQcmVkaWNhdGUoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaWNtcCBvcGNvZGUhIik7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUToKKyAgICAgIGlmIChPcDBNYXgudWx0KE9wMU1pbikgfHwgT3AwTWluLnVndChPcDFNYXgpKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0RmFsc2UoSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6CisgICAgICBpZiAoT3AwTWF4LnVsdChPcDFNaW4pIHx8IE9wME1pbi51Z3QoT3AxTWF4KSkKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnRJbnQ6OmdldFRydWUoSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOgorICAgICAgaWYgKE9wME1heC51bHQoT3AxTWluKSkgICAgICAgICAgLy8gQSA8dSBCIC0+IHRydWUgaWYgbWF4KEEpIDwgbWluKEIpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRUcnVlKEkuZ2V0Q29udGV4dCgpKSk7CisgICAgICBpZiAoT3AwTWluLnVnZShPcDFNYXgpKSAgICAgICAgICAvLyBBIDx1IEIgLT4gZmFsc2UgaWYgbWluKEEpID49IG1heChCKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0RmFsc2UoSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgIGlmIChPcDFNaW4gPT0gT3AwTWF4KSAgICAgICAgICAgIC8vIEEgPHUgQiAtPiBBICE9IEIgaWYgbWF4KEEpID09IG1pbihCKQorICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX05FLCBPcDAsIE9wMSk7CisgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wMSkpIHsKKyAgICAgICAgaWYgKE9wMU1heCA9PSBPcDBNaW4rMSkgICAgICAgIC8vIEEgPHUgQyAtPiBBID09IEMtMSBpZiBtaW4oQSkrMSA9PSBDCisgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6SUNNUF9FUSwgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KENJLT5nZXRDb250ZXh0KCksIENJLT5nZXRWYWx1ZSgpLTEpKTsKKworICAgICAgICAvLyAoeCA8dSAyMTQ3NDgzNjQ4KSAtPiAoeCA+cyAtMSkgIC0+IHRydWUgaWYgc2lnbiBiaXQgY2xlYXIKKyAgICAgICAgaWYgKENJLT5pc01pblZhbHVlKHRydWUpKQorICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNtcEluc3Q6OklDTVBfU0dULCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0QWxsT25lc1ZhbHVlKE9wMC0+Z2V0VHlwZSgpKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDoKKyAgICAgIGlmIChPcDBNaW4udWd0KE9wMU1heCkpICAgICAgICAgIC8vIEEgPnUgQiAtPiB0cnVlIGlmIG1pbihBKSA+IG1heChCKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShJLmdldENvbnRleHQoKSkpOworICAgICAgaWYgKE9wME1heC51bGUoT3AxTWluKSkgICAgICAgICAgLy8gQSA+dSBCIC0+IGZhbHNlIGlmIG1heChBKSA8PSBtYXgoQikKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKEkuZ2V0Q29udGV4dCgpKSk7CisKKyAgICAgIGlmIChPcDFNYXggPT0gT3AwTWluKSAgICAgICAgICAgIC8vIEEgPnUgQiAtPiBBICE9IEIgaWYgbWluKEEpID09IG1heChCKQorICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX05FLCBPcDAsIE9wMSk7CisgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wMSkpIHsKKyAgICAgICAgaWYgKE9wMU1pbiA9PSBPcDBNYXgtMSkgICAgICAgIC8vIEEgPnUgQyAtPiBBID09IEMrMSBpZiBtYXgoYSktMSA9PSBDCisgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6SUNNUF9FUSwgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KENJLT5nZXRDb250ZXh0KCksIENJLT5nZXRWYWx1ZSgpKzEpKTsKKworICAgICAgICAvLyAoeCA+dSAyMTQ3NDgzNjQ3KSAtPiAoeCA8cyAwKSAgLT4gdHJ1ZSBpZiBzaWduIGJpdCBzZXQKKyAgICAgICAgaWYgKENJLT5pc01heFZhbHVlKHRydWUpKQorICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNtcEluc3Q6OklDTVBfU0xULCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKE9wMC0+Z2V0VHlwZSgpKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDoKKyAgICAgIGlmIChPcDBNYXguc2x0KE9wMU1pbikpICAgICAgICAgIC8vIEEgPHMgQiAtPiB0cnVlIGlmIG1heChBKSA8IG1pbihDKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShJLmdldENvbnRleHQoKSkpOworICAgICAgaWYgKE9wME1pbi5zZ2UoT3AxTWF4KSkgICAgICAgICAgLy8gQSA8cyBCIC0+IGZhbHNlIGlmIG1pbihBKSA+PSBtYXgoQykKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKEkuZ2V0Q29udGV4dCgpKSk7CisgICAgICBpZiAoT3AxTWluID09IE9wME1heCkgICAgICAgICAgICAvLyBBIDxzIEIgLT4gQSAhPSBCIGlmIG1heChBKSA9PSBtaW4oQikKKyAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6SUNNUF9ORSwgT3AwLCBPcDEpOworICAgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDEpKSB7CisgICAgICAgIGlmIChPcDFNYXggPT0gT3AwTWluKzEpICAgICAgICAvLyBBIDxzIEMgLT4gQSA9PSBDLTEgaWYgbWluKEEpKzEgPT0gQworICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSUNtcEluc3Q6OklDTVBfRVEsIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChDSS0+Z2V0Q29udGV4dCgpLCBDSS0+Z2V0VmFsdWUoKS0xKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHVDoKKyAgICAgIGlmIChPcDBNaW4uc2d0KE9wMU1heCkpICAgICAgICAgIC8vIEEgPnMgQiAtPiB0cnVlIGlmIG1pbihBKSA+IG1heChCKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShJLmdldENvbnRleHQoKSkpOworICAgICAgaWYgKE9wME1heC5zbGUoT3AxTWluKSkgICAgICAgICAgLy8gQSA+cyBCIC0+IGZhbHNlIGlmIG1heChBKSA8PSBtaW4oQikKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKEkuZ2V0Q29udGV4dCgpKSk7CisKKyAgICAgIGlmIChPcDFNYXggPT0gT3AwTWluKSAgICAgICAgICAgIC8vIEEgPnMgQiAtPiBBICE9IEIgaWYgbWluKEEpID09IG1heChCKQorICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX05FLCBPcDAsIE9wMSk7CisgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wMSkpIHsKKyAgICAgICAgaWYgKE9wMU1pbiA9PSBPcDBNYXgtMSkgICAgICAgIC8vIEEgPnMgQyAtPiBBID09IEMrMSBpZiBtYXgoQSktMSA9PSBDCisgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJQ21wSW5zdDo6SUNNUF9FUSwgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KENJLT5nZXRDb250ZXh0KCksIENJLT5nZXRWYWx1ZSgpKzEpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOgorICAgICAgYXNzZXJ0KCFpc2E8Q29uc3RhbnRJbnQ+KE9wMSkgJiYgIklDTVBfU0dFIHdpdGggQ29uc3RhbnRJbnQgbm90IGZvbGRlZCEiKTsKKyAgICAgIGlmIChPcDBNaW4uc2dlKE9wMU1heCkpICAgICAgICAgIC8vIEEgPj1zIEIgLT4gdHJ1ZSBpZiBtaW4oQSkgPj0gbWF4KEIpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRUcnVlKEkuZ2V0Q29udGV4dCgpKSk7CisgICAgICBpZiAoT3AwTWF4LnNsdChPcDFNaW4pKSAgICAgICAgICAvLyBBID49cyBCIC0+IGZhbHNlIGlmIG1heChBKSA8IG1pbihCKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0RmFsc2UoSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xFOgorICAgICAgYXNzZXJ0KCFpc2E8Q29uc3RhbnRJbnQ+KE9wMSkgJiYgIklDTVBfU0xFIHdpdGggQ29uc3RhbnRJbnQgbm90IGZvbGRlZCEiKTsKKyAgICAgIGlmIChPcDBNYXguc2xlKE9wMU1pbikpICAgICAgICAgIC8vIEEgPD1zIEIgLT4gdHJ1ZSBpZiBtYXgoQSkgPD0gbWluKEIpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRUcnVlKEkuZ2V0Q29udGV4dCgpKSk7CisgICAgICBpZiAoT3AwTWluLnNndChPcDFNYXgpKSAgICAgICAgICAvLyBBIDw9cyBCIC0+IGZhbHNlIGlmIG1pbihBKSA+IG1heChCKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0RmFsc2UoSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOgorICAgICAgYXNzZXJ0KCFpc2E8Q29uc3RhbnRJbnQ+KE9wMSkgJiYgIklDTVBfVUdFIHdpdGggQ29uc3RhbnRJbnQgbm90IGZvbGRlZCEiKTsKKyAgICAgIGlmIChPcDBNaW4udWdlKE9wMU1heCkpICAgICAgICAgIC8vIEEgPj11IEIgLT4gdHJ1ZSBpZiBtaW4oQSkgPj0gbWF4KEIpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRUcnVlKEkuZ2V0Q29udGV4dCgpKSk7CisgICAgICBpZiAoT3AwTWF4LnVsdChPcDFNaW4pKSAgICAgICAgICAvLyBBID49dSBCIC0+IGZhbHNlIGlmIG1heChBKSA8IG1pbihCKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0RmFsc2UoSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxFOgorICAgICAgYXNzZXJ0KCFpc2E8Q29uc3RhbnRJbnQ+KE9wMSkgJiYgIklDTVBfVUxFIHdpdGggQ29uc3RhbnRJbnQgbm90IGZvbGRlZCEiKTsKKyAgICAgIGlmIChPcDBNYXgudWxlKE9wMU1pbikpICAgICAgICAgIC8vIEEgPD11IEIgLT4gdHJ1ZSBpZiBtYXgoQSkgPD0gbWluKEIpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRUcnVlKEkuZ2V0Q29udGV4dCgpKSk7CisgICAgICBpZiAoT3AwTWluLnVndChPcDFNYXgpKSAgICAgICAgICAvLyBBIDw9dSBCIC0+IGZhbHNlIGlmIG1pbihBKSA+IG1heChCKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0RmFsc2UoSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFR1cm4gYSBzaWduZWQgY29tcGFyaXNvbiBpbnRvIGFuIHVuc2lnbmVkIG9uZSBpZiBib3RoIG9wZXJhbmRzCisgICAgLy8gYXJlIGtub3duIHRvIGhhdmUgdGhlIHNhbWUgc2lnbi4KKyAgICBpZiAoSS5pc1NpZ25lZCgpICYmCisgICAgICAgICgoT3AwS25vd25aZXJvLmlzTmVnYXRpdmUoKSAmJiBPcDFLbm93blplcm8uaXNOZWdhdGl2ZSgpKSB8fAorICAgICAgICAgKE9wMEtub3duT25lLmlzTmVnYXRpdmUoKSAmJiBPcDFLbm93bk9uZS5pc05lZ2F0aXZlKCkpKSkKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSS5nZXRVbnNpZ25lZFByZWRpY2F0ZSgpLCBPcDAsIE9wMSk7CisgIH0KKworICAvLyBUZXN0IGlmIHRoZSBJQ21wSW5zdCBpbnN0cnVjdGlvbiBpcyB1c2VkIGV4Y2x1c2l2ZWx5IGJ5IGEgc2VsZWN0IGFzCisgIC8vIHBhcnQgb2YgYSBtaW5pbXVtIG9yIG1heGltdW0gb3BlcmF0aW9uLiBJZiBzbywgcmVmcmFpbiBmcm9tIGRvaW5nCisgIC8vIGFueSBvdGhlciBmb2xkaW5nLiBUaGlzIGhlbHBzIG91dCBvdGhlciBhbmFseXNlcyB3aGljaCB1bmRlcnN0YW5kCisgIC8vIG5vbi1vYmZ1c2NhdGVkIG1pbmltdW0gYW5kIG1heGltdW0gaWRpb21zLCBzdWNoIGFzIFNjYWxhckV2b2x1dGlvbgorICAvLyBhbmQgQ29kZUdlbi4gQW5kIGluIHRoaXMgY2FzZSwgYXQgbGVhc3Qgb25lIG9mIHRoZSBjb21wYXJpc29uCisgIC8vIG9wZXJhbmRzIGhhcyBhdCBsZWFzdCBvbmUgdXNlciBiZXNpZGVzIHRoZSBjb21wYXJlICh0aGUgc2VsZWN0KSwKKyAgLy8gd2hpY2ggd291bGQgb2Z0ZW4gbGFyZ2VseSBuZWdhdGUgdGhlIGJlbmVmaXQgb2YgZm9sZGluZyBhbnl3YXkuCisgIGlmIChJLmhhc09uZVVzZSgpKQorICAgIGlmIChTZWxlY3RJbnN0ICpTSSA9IGR5bl9jYXN0PFNlbGVjdEluc3Q+KCpJLnVzZV9iZWdpbigpKSkKKyAgICAgIGlmICgoU0ktPmdldE9wZXJhbmQoMSkgPT0gT3AwICYmIFNJLT5nZXRPcGVyYW5kKDIpID09IE9wMSkgfHwKKyAgICAgICAgICAoU0ktPmdldE9wZXJhbmQoMikgPT0gT3AwICYmIFNJLT5nZXRPcGVyYW5kKDEpID09IE9wMSkpCisgICAgICAgIHJldHVybiAwOworCisgIC8vIFNlZSBpZiB3ZSBhcmUgZG9pbmcgYSBjb21wYXJpc29uIGJldHdlZW4gYSBjb25zdGFudCBhbmQgYW4gaW5zdHJ1Y3Rpb24gdGhhdAorICAvLyBjYW4gYmUgZm9sZGVkIGludG8gdGhlIGNvbXBhcmlzb24uCisgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AxKSkgeworICAgIC8vIFNpbmNlIHRoZSBSSFMgaXMgYSBDb25zdGFudEludCAoQ0kpLCBpZiB0aGUgbGVmdCBoYW5kIHNpZGUgaXMgYW4gCisgICAgLy8gaW5zdHJ1Y3Rpb24sIHNlZSBpZiB0aGF0IGluc3RydWN0aW9uIGFsc28gaGFzIGNvbnN0YW50cyBzbyB0aGF0IHRoZSAKKyAgICAvLyBpbnN0cnVjdGlvbiBjYW4gYmUgZm9sZGVkIGludG8gdGhlIGljbXAgCisgICAgaWYgKEluc3RydWN0aW9uICpMSFNJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KE9wMCkpCisgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKlJlcyA9IHZpc2l0SUNtcEluc3RXaXRoSW5zdEFuZEludENzdChJLCBMSFNJLCBDSSkpCisgICAgICAgIHJldHVybiBSZXM7CisgIH0KKworICAvLyBIYW5kbGUgaWNtcCB3aXRoIGNvbnN0YW50IChidXQgbm90IHNpbXBsZSBpbnRlZ2VyIGNvbnN0YW50KSBSSFMKKyAgaWYgKENvbnN0YW50ICpSSFNDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KE9wMSkpIHsKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkxIU0kgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oT3AwKSkKKyAgICAgIHN3aXRjaCAoTEhTSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHI6CisgICAgICAgICAgLy8gaWNtcCBwcmVkIEdFUCAoUCwgaW50IDAsIGludCAwLCBpbnQgMCksIG51bGwgLT4gaWNtcCBwcmVkIFAsIG51bGwKKyAgICAgICAgaWYgKFJIU0MtPmlzTnVsbFZhbHVlKCkgJiYKKyAgICAgICAgICAgIGNhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KExIU0kpLT5oYXNBbGxaZXJvSW5kaWNlcygpKQorICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSS5nZXRQcmVkaWNhdGUoKSwgTEhTSS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoTEhTSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6UEhJOgorICAgICAgICAvLyBPbmx5IGZvbGQgaWNtcCBpbnRvIHRoZSBQSEkgaWYgdGhlIHBoaSBhbmQgaWNtcCBhcmUgaW4gdGhlIHNhbWUKKyAgICAgICAgLy8gYmxvY2suICBJZiBpbiB0aGUgc2FtZSBibG9jaywgd2UncmUgZW5jb3VyYWdpbmcganVtcCB0aHJlYWRpbmcuICBJZgorICAgICAgICAvLyBub3QsIHdlIGFyZSBqdXN0IHBlc3NpbWl6aW5nIHRoZSBjb2RlIGJ5IG1ha2luZyBhbiBpMSBwaGkuCisgICAgICAgIGlmIChMSFNJLT5nZXRQYXJlbnQoKSA9PSBJLmdldFBhcmVudCgpKQorICAgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEksIHRydWUpKQorICAgICAgICAgICAgcmV0dXJuIE5WOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNlbGVjdDogeworICAgICAgICAvLyBJZiBlaXRoZXIgb3BlcmFuZCBvZiB0aGUgc2VsZWN0IGlzIGEgY29uc3RhbnQsIHdlIGNhbiBmb2xkIHRoZQorICAgICAgICAvLyBjb21wYXJpc29uIGludG8gdGhlIHNlbGVjdCBhcm1zLCB3aGljaCB3aWxsIGNhdXNlIG9uZSB0byBiZQorICAgICAgICAvLyBjb25zdGFudCBmb2xkZWQgYW5kIHRoZSBzZWxlY3QgdHVybmVkIGludG8gYSBiaXR3aXNlIG9yLgorICAgICAgICBWYWx1ZSAqT3AxID0gMCwgKk9wMiA9IDA7CisgICAgICAgIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFNJLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICAgICBPcDEgPSBDb25zdGFudEV4cHI6OmdldElDbXAoSS5nZXRQcmVkaWNhdGUoKSwgQywgUkhTQyk7CisgICAgICAgIGlmIChDb25zdGFudCAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFNJLT5nZXRPcGVyYW5kKDIpKSkKKyAgICAgICAgICBPcDIgPSBDb25zdGFudEV4cHI6OmdldElDbXAoSS5nZXRQcmVkaWNhdGUoKSwgQywgUkhTQyk7CisKKyAgICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHBlcmZvcm0gdGhpcyB0cmFuc2Zvcm1hdGlvbiBpZiBpdCB3aWxsIG5vdCBsZWFkIHRvCisgICAgICAgIC8vIGFkZGl0aW9uYWwgY29kZS4gVGhpcyBpcyB0cnVlIGlmIGVpdGhlciBib3RoIHNpZGVzIG9mIHRoZSBzZWxlY3QKKyAgICAgICAgLy8gZm9sZCB0byBhIGNvbnN0YW50IChpbiB3aGljaCBjYXNlIHRoZSBpY21wIGlzIHJlcGxhY2VkIHdpdGggYSBzZWxlY3QKKyAgICAgICAgLy8gd2hpY2ggd2lsbCB1c3VhbGx5IHNpbXBsaWZ5KSBvciB0aGlzIGlzIHRoZSBvbmx5IHVzZXIgb2YgdGhlCisgICAgICAgIC8vIHNlbGVjdCAoaW4gd2hpY2ggY2FzZSB3ZSBhcmUgdHJhZGluZyBhIHNlbGVjdCtpY21wIGZvciBhIHNpbXBsZXIKKyAgICAgICAgLy8gc2VsZWN0K2ljbXApLgorICAgICAgICBpZiAoKE9wMSAmJiBPcDIpIHx8IChMSFNJLT5oYXNPbmVVc2UoKSAmJiAoT3AxIHx8IE9wMikpKSB7CisgICAgICAgICAgaWYgKCFPcDEpCisgICAgICAgICAgICBPcDEgPSBCdWlsZGVyLT5DcmVhdGVJQ21wKEkuZ2V0UHJlZGljYXRlKCksIExIU0ktPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0MpOworICAgICAgICAgIGlmICghT3AyKQorICAgICAgICAgICAgT3AyID0gQnVpbGRlci0+Q3JlYXRlSUNtcChJLmdldFByZWRpY2F0ZSgpLCBMSFNJLT5nZXRPcGVyYW5kKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFNDKTsKKyAgICAgICAgICByZXR1cm4gU2VsZWN0SW5zdDo6Q3JlYXRlKExIU0ktPmdldE9wZXJhbmQoMCksIE9wMSwgT3AyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOgorICAgICAgICAvLyBpY21wIHByZWQgaW50dG9wdHIoWCksIG51bGwgLT4gaWNtcCBwcmVkIFgsIDAKKyAgICAgICAgaWYgKFJIU0MtPmlzTnVsbFZhbHVlKCkgJiYgVEQgJiYKKyAgICAgICAgICAgIFRELT5nZXRJbnRQdHJUeXBlKFJIU0MtPmdldENvbnRleHQoKSkgPT0gCisgICAgICAgICAgICAgICBMSFNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpCisgICAgICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJLmdldFByZWRpY2F0ZSgpLCBMSFNJLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShMSFNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkxvYWQ6CisgICAgICAgIC8vIFRyeSB0byBvcHRpbWl6ZSB0aGluZ3MgbGlrZSAiQVtpXSA+IDQiIHRvIGluZGV4IGNvbXB1dGF0aW9ucy4KKyAgICAgICAgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPQorICAgICAgICAgICAgICBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oTEhTSS0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgICBpZiAoR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KEdFUC0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICAgICAgICBpZiAoR1YtPmlzQ29uc3RhbnQoKSAmJiBHVi0+aGFzRGVmaW5pdGl2ZUluaXRpYWxpemVyKCkgJiYKKyAgICAgICAgICAgICAgICAhY2FzdDxMb2FkSW5zdD4oTEhTSSktPmlzVm9sYXRpbGUoKSkKKyAgICAgICAgICAgICAgaWYgKEluc3RydWN0aW9uICpSZXMgPSBGb2xkQ21wTG9hZEZyb21JbmRleGVkR2xvYmFsKEdFUCwgR1YsIEkpKQorICAgICAgICAgICAgICAgIHJldHVybiBSZXM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKworICAvLyBJZiB3ZSBjYW4gb3B0aW1pemUgYSAnaWNtcCBHRVAsIFAnIG9yICdpY21wIFAsIEdFUCcsIGRvIHNvIG5vdy4KKyAgaWYgKEdFUE9wZXJhdG9yICpHRVAgPSBkeW5fY2FzdDxHRVBPcGVyYXRvcj4oT3AwKSkKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKk5JID0gRm9sZEdFUElDbXAoR0VQLCBPcDEsIEkuZ2V0UHJlZGljYXRlKCksIEkpKQorICAgICAgcmV0dXJuIE5JOworICBpZiAoR0VQT3BlcmF0b3IgKkdFUCA9IGR5bl9jYXN0PEdFUE9wZXJhdG9yPihPcDEpKQorICAgIGlmIChJbnN0cnVjdGlvbiAqTkkgPSBGb2xkR0VQSUNtcChHRVAsIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElDbXBJbnN0OjpnZXRTd2FwcGVkUHJlZGljYXRlKEkuZ2V0UHJlZGljYXRlKCkpLCBJKSkKKyAgICAgIHJldHVybiBOSTsKKworICAvLyBUZXN0IHRvIHNlZSBpZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGljbXAgYXJlIGNhc3RlZCB2ZXJzaW9ucyBvZiBvdGhlcgorICAvLyB2YWx1ZXMuICBJZiB0aGUgcHRyLT5wdHIgY2FzdCBjYW4gYmUgc3RyaXBwZWQgb2ZmIGJvdGggYXJndW1lbnRzLCB3ZSBkbyBzbworICAvLyBub3cuCisgIGlmIChCaXRDYXN0SW5zdCAqQ0kgPSBkeW5fY2FzdDxCaXRDYXN0SW5zdD4oT3AwKSkgeworICAgIGlmIChPcDAtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSAmJiAKKyAgICAgICAgKGlzYTxDb25zdGFudD4oT3AxKSB8fCBpc2E8Qml0Q2FzdEluc3Q+KE9wMSkpKSB7IAorICAgICAgLy8gV2Uga2VlcCBtb3ZpbmcgdGhlIGNhc3QgZnJvbSB0aGUgbGVmdCBvcGVyYW5kIG92ZXIgdG8gdGhlIHJpZ2h0CisgICAgICAvLyBvcGVyYW5kLCB3aGVyZSBpdCBjYW4gb2Z0ZW4gYmUgZWxpbWluYXRlZCBjb21wbGV0ZWx5LgorICAgICAgT3AwID0gQ0ktPmdldE9wZXJhbmQoMCk7CisKKyAgICAgIC8vIElmIG9wZXJhbmQgIzEgaXMgYSBiaXRjYXN0IGluc3RydWN0aW9uLCBpdCBtdXN0IGFsc28gYmUgYSBwdHItPnB0ciBjYXN0CisgICAgICAvLyBzbyBlbGltaW5hdGUgaXQgYXMgd2VsbC4KKyAgICAgIGlmIChCaXRDYXN0SW5zdCAqQ0kyID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KE9wMSkpCisgICAgICAgIE9wMSA9IENJMi0+Z2V0T3BlcmFuZCgwKTsKKworICAgICAgLy8gSWYgT3AxIGlzIGEgY29uc3RhbnQsIHdlIGNhbiBmb2xkIHRoZSBjYXN0IGludG8gdGhlIGNvbnN0YW50LgorICAgICAgaWYgKE9wMC0+Z2V0VHlwZSgpICE9IE9wMS0+Z2V0VHlwZSgpKSB7CisgICAgICAgIGlmIChDb25zdGFudCAqT3AxQyA9IGR5bl9jYXN0PENvbnN0YW50PihPcDEpKSB7CisgICAgICAgICAgT3AxID0gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KE9wMUMsIE9wMC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBPdGhlcndpc2UsIGNhc3QgdGhlIFJIUyByaWdodCBiZWZvcmUgdGhlIGljbXAKKyAgICAgICAgICBPcDEgPSBCdWlsZGVyLT5DcmVhdGVCaXRDYXN0KE9wMSwgT3AwLT5nZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KEkuZ2V0UHJlZGljYXRlKCksIE9wMCwgT3AxKTsKKyAgICB9CisgIH0KKyAgCisgIGlmIChpc2E8Q2FzdEluc3Q+KE9wMCkpIHsKKyAgICAvLyBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZjogaWNtcCAoY2FzdCBib29sIHRvIFgpLCA8Y3N0PgorICAgIC8vIFRoaXMgY29tZXMgdXAgd2hlbiB5b3UgaGF2ZSBjb2RlIGxpa2UKKyAgICAvLyAgIGludCBYID0gQSA8IEI7CisgICAgLy8gICBpZiAoWCkgLi4uCisgICAgLy8gRm9yIGdlbmVyYWxpdHksIHdlIGhhbmRsZSBhbnkgemVyby1leHRlbnNpb24gb2YgYW55IG9wZXJhbmQgY29tcGFyaXNvbgorICAgIC8vIHdpdGggYSBjb25zdGFudCBvciBhbm90aGVyIGNhc3QgZnJvbSB0aGUgc2FtZSB0eXBlLgorICAgIGlmIChpc2E8Q29uc3RhbnQ+KE9wMSkgfHwgaXNhPENhc3RJbnN0PihPcDEpKQorICAgICAgaWYgKEluc3RydWN0aW9uICpSID0gdmlzaXRJQ21wSW5zdFdpdGhDYXN0QW5kQ2FzdChJKSkKKyAgICAgICAgcmV0dXJuIFI7CisgIH0KKyAgCisgIC8vIFNlZSBpZiBpdCdzIHRoZSBzYW1lIHR5cGUgb2YgaW5zdHJ1Y3Rpb24gb24gdGhlIGxlZnQgYW5kIHJpZ2h0LgorICBpZiAoQmluYXJ5T3BlcmF0b3IgKk9wMEkgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oT3AwKSkgeworICAgIGlmIChCaW5hcnlPcGVyYXRvciAqT3AxSSA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihPcDEpKSB7CisgICAgICBpZiAoT3AwSS0+Z2V0T3Bjb2RlKCkgPT0gT3AxSS0+Z2V0T3Bjb2RlKCkgJiYgT3AwSS0+aGFzT25lVXNlKCkgJiYKKyAgICAgICAgICBPcDFJLT5oYXNPbmVVc2UoKSAmJiBPcDBJLT5nZXRPcGVyYW5kKDEpID09IE9wMUktPmdldE9wZXJhbmQoMSkpIHsKKyAgICAgICAgc3dpdGNoIChPcDBJLT5nZXRPcGNvZGUoKSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpTdWI6CisgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgICAgICAgICBpZiAoSS5pc0VxdWFsaXR5KCkpICAgIC8vIGEreCBpY21wIGVxL25lIGIreCAtLT4gYSBpY21wIGIKKyAgICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSS5nZXRQcmVkaWNhdGUoKSwgT3AwSS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AxSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICAgICAgLy8gaWNtcCB1L3MgKGEgXiBzaWduYml0KSwgKGIgXiBzaWduYml0KSAtLT4gaWNtcCBzL3UgYSwgYgorICAgICAgICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AwSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICAgIGlmIChDSS0+Z2V0VmFsdWUoKS5pc1NpZ25CaXQoKSkgeworICAgICAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQgPSBJLmlzU2lnbmVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSS5nZXRVbnNpZ25lZFByZWRpY2F0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEkuZ2V0U2lnbmVkUHJlZGljYXRlKCk7CisgICAgICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoUHJlZCwgT3AwSS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDFJLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKENJLT5nZXRWYWx1ZSgpLmlzTWF4U2lnbmVkVmFsdWUoKSkgeworICAgICAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQgPSBJLmlzU2lnbmVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSS5nZXRVbnNpZ25lZFByZWRpY2F0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEkuZ2V0U2lnbmVkUHJlZGljYXRlKCk7CisgICAgICAgICAgICAgIFByZWQgPSBJLmdldFN3YXBwZWRQcmVkaWNhdGUoUHJlZCk7CisgICAgICAgICAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoUHJlZCwgT3AwSS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcDFJLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDoKKyAgICAgICAgICBpZiAoIUkuaXNFcXVhbGl0eSgpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wMEktPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgICAgICAvLyBhICogQ3N0IGljbXAgZXEvbmUgYiAqIENzdCAtLT4gYSAmIE1hc2sgaWNtcCBiICYgTWFzaworICAgICAgICAgICAgLy8gTWFzayA9IC0xID4+IGNvdW50LXRyYWlsaW5nLXplcm9zKENzdCkuCisgICAgICAgICAgICBpZiAoIUNJLT5pc1plcm8oKSAmJiAhQ0ktPmlzT25lKCkpIHsKKyAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJkFQID0gQ0ktPmdldFZhbHVlKCk7CisgICAgICAgICAgICAgIENvbnN0YW50SW50ICpNYXNrID0gQ29uc3RhbnRJbnQ6OmdldChJLmdldENvbnRleHQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50OjpnZXRMb3dCaXRzU2V0KEFQLmdldEJpdFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQLmdldEJpdFdpZHRoKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVAuY291bnRUcmFpbGluZ1plcm9zKCkpKTsKKyAgICAgICAgICAgICAgVmFsdWUgKkFuZDEgPSBCdWlsZGVyLT5DcmVhdGVBbmQoT3AwSS0+Z2V0T3BlcmFuZCgwKSwgTWFzayk7CisgICAgICAgICAgICAgIFZhbHVlICpBbmQyID0gQnVpbGRlci0+Q3JlYXRlQW5kKE9wMUktPmdldE9wZXJhbmQoMCksIE1hc2spOworICAgICAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KEkuZ2V0UHJlZGljYXRlKCksIEFuZDEsIEFuZDIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLy8gfnggPCB+eSAtLT4geSA8IHgKKyAgeyBWYWx1ZSAqQSwgKkI7CisgICAgaWYgKG1hdGNoKE9wMCwgbV9Ob3QobV9WYWx1ZShBKSkpICYmCisgICAgICAgIG1hdGNoKE9wMSwgbV9Ob3QobV9WYWx1ZShCKSkpKQorICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJLmdldFByZWRpY2F0ZSgpLCBCLCBBKTsKKyAgfQorICAKKyAgaWYgKEkuaXNFcXVhbGl0eSgpKSB7CisgICAgVmFsdWUgKkEsICpCLCAqQywgKkQ7CisgICAgCisgICAgLy8gLXggPT0gLXkgLS0+IHggPT0geQorICAgIGlmIChtYXRjaChPcDAsIG1fTmVnKG1fVmFsdWUoQSkpKSAmJgorICAgICAgICBtYXRjaChPcDEsIG1fTmVnKG1fVmFsdWUoQikpKSkKKyAgICAgIHJldHVybiBuZXcgSUNtcEluc3QoSS5nZXRQcmVkaWNhdGUoKSwgQSwgQik7CisgICAgCisgICAgaWYgKG1hdGNoKE9wMCwgbV9Yb3IobV9WYWx1ZShBKSwgbV9WYWx1ZShCKSkpKSB7CisgICAgICBpZiAoQSA9PSBPcDEgfHwgQiA9PSBPcDEpIHsgICAgLy8gKEFeQikgPT0gQSAgLT4gIEIgPT0gMAorICAgICAgICBWYWx1ZSAqT3RoZXJWYWwgPSBBID09IE9wMSA/IEIgOiBBOworICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KEkuZ2V0UHJlZGljYXRlKCksIE90aGVyVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoQS0+Z2V0VHlwZSgpKSk7CisgICAgICB9CisKKyAgICAgIGlmIChtYXRjaChPcDEsIG1fWG9yKG1fVmFsdWUoQyksIG1fVmFsdWUoRCkpKSkgeworICAgICAgICAvLyBBXmMxID09IENeYzIgLS0+IEEgPT0gQ14oYzFeYzIpCisgICAgICAgIENvbnN0YW50SW50ICpDMSwgKkMyOworICAgICAgICBpZiAobWF0Y2goQiwgbV9Db25zdGFudEludChDMSkpICYmCisgICAgICAgICAgICBtYXRjaChELCBtX0NvbnN0YW50SW50KEMyKSkgJiYgT3AxLT5oYXNPbmVVc2UoKSkgeworICAgICAgICAgIENvbnN0YW50ICpOQyA9IENvbnN0YW50SW50OjpnZXQoSS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMS0+Z2V0VmFsdWUoKSBeIEMyLT5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICBWYWx1ZSAqWG9yID0gQnVpbGRlci0+Q3JlYXRlWG9yKEMsIE5DKTsKKyAgICAgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KEkuZ2V0UHJlZGljYXRlKCksIEEsIFhvcik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEFeQiA9PSBBXkQgLT4gQiA9PSBECisgICAgICAgIGlmIChBID09IEMpIHJldHVybiBuZXcgSUNtcEluc3QoSS5nZXRQcmVkaWNhdGUoKSwgQiwgRCk7CisgICAgICAgIGlmIChBID09IEQpIHJldHVybiBuZXcgSUNtcEluc3QoSS5nZXRQcmVkaWNhdGUoKSwgQiwgQyk7CisgICAgICAgIGlmIChCID09IEMpIHJldHVybiBuZXcgSUNtcEluc3QoSS5nZXRQcmVkaWNhdGUoKSwgQSwgRCk7CisgICAgICAgIGlmIChCID09IEQpIHJldHVybiBuZXcgSUNtcEluc3QoSS5nZXRQcmVkaWNhdGUoKSwgQSwgQyk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChtYXRjaChPcDEsIG1fWG9yKG1fVmFsdWUoQSksIG1fVmFsdWUoQikpKSAmJgorICAgICAgICAoQSA9PSBPcDAgfHwgQiA9PSBPcDApKSB7CisgICAgICAvLyBBID09IChBXkIpICAtPiAgQiA9PSAwCisgICAgICBWYWx1ZSAqT3RoZXJWYWwgPSBBID09IE9wMCA/IEIgOiBBOworICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJLmdldFByZWRpY2F0ZSgpLCBPdGhlclZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShBLT5nZXRUeXBlKCkpKTsKKyAgICB9CisKKyAgICAvLyAoQS1CKSA9PSBBICAtPiAgQiA9PSAwCisgICAgaWYgKG1hdGNoKE9wMCwgbV9TdWIobV9TcGVjaWZpYyhPcDEpLCBtX1ZhbHVlKEIpKSkpCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KEkuZ2V0UHJlZGljYXRlKCksIEIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEItPmdldFR5cGUoKSkpOworCisgICAgLy8gQSA9PSAoQS1CKSAgLT4gIEIgPT0gMAorICAgIGlmIChtYXRjaChPcDEsIG1fU3ViKG1fU3BlY2lmaWMoT3AwKSwgbV9WYWx1ZShCKSkpKQorICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChJLmdldFByZWRpY2F0ZSgpLCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEItPmdldFR5cGUoKSkpOworICAgIAorICAgIC8vIChYJlopID09IChZJlopIC0+IChYXlkpICYgWiA9PSAwCisgICAgaWYgKE9wMC0+aGFzT25lVXNlKCkgJiYgT3AxLT5oYXNPbmVVc2UoKSAmJgorICAgICAgICBtYXRjaChPcDAsIG1fQW5kKG1fVmFsdWUoQSksIG1fVmFsdWUoQikpKSAmJiAKKyAgICAgICAgbWF0Y2goT3AxLCBtX0FuZChtX1ZhbHVlKEMpLCBtX1ZhbHVlKEQpKSkpIHsKKyAgICAgIFZhbHVlICpYID0gMCwgKlkgPSAwLCAqWiA9IDA7CisgICAgICAKKyAgICAgIGlmIChBID09IEMpIHsKKyAgICAgICAgWCA9IEI7IFkgPSBEOyBaID0gQTsKKyAgICAgIH0gZWxzZSBpZiAoQSA9PSBEKSB7CisgICAgICAgIFggPSBCOyBZID0gQzsgWiA9IEE7CisgICAgICB9IGVsc2UgaWYgKEIgPT0gQykgeworICAgICAgICBYID0gQTsgWSA9IEQ7IFogPSBCOworICAgICAgfSBlbHNlIGlmIChCID09IEQpIHsKKyAgICAgICAgWCA9IEE7IFkgPSBDOyBaID0gQjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKFgpIHsgICAvLyBCdWlsZCAoWF5ZKSAmIFoKKyAgICAgICAgT3AxID0gQnVpbGRlci0+Q3JlYXRlWG9yKFgsIFkpOworICAgICAgICBPcDEgPSBCdWlsZGVyLT5DcmVhdGVBbmQoT3AxLCBaKTsKKyAgICAgICAgSS5zZXRPcGVyYW5kKDAsIE9wMSk7CisgICAgICAgIEkuc2V0T3BlcmFuZCgxLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKE9wMS0+Z2V0VHlwZSgpKSk7CisgICAgICAgIHJldHVybiAmSTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHsKKyAgICBWYWx1ZSAqWDsgQ29uc3RhbnRJbnQgKkNzdDsKKyAgICAvLyBpY21wIFgrQ3N0LCBYCisgICAgaWYgKG1hdGNoKE9wMCwgbV9BZGQobV9WYWx1ZShYKSwgbV9Db25zdGFudEludChDc3QpKSkgJiYgT3AxID09IFgpCisgICAgICByZXR1cm4gRm9sZElDbXBBZGRPcENzdChJLCBYLCBDc3QsIEkuZ2V0UHJlZGljYXRlKCksIE9wMCk7CisKKyAgICAvLyBpY21wIFgsIFgrQ3N0CisgICAgaWYgKG1hdGNoKE9wMSwgbV9BZGQobV9WYWx1ZShYKSwgbV9Db25zdGFudEludChDc3QpKSkgJiYgT3AwID09IFgpCisgICAgICByZXR1cm4gRm9sZElDbXBBZGRPcENzdChJLCBYLCBDc3QsIEkuZ2V0U3dhcHBlZFByZWRpY2F0ZSgpLCBPcDEpOworICB9CisgIHJldHVybiBDaGFuZ2VkID8gJkkgOiAwOworfQorCisKKworCisKKworLy8vIEZvbGRGQ21wX0ludFRvRlBfQ3N0IC0gRm9sZCBmY21wIChbdXNdaXRvZnAgeCwgY3N0KSBpZiBwb3NzaWJsZS4KKy8vLworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6Rm9sZEZDbXBfSW50VG9GUF9Dc3QoRkNtcEluc3QgJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqTEhTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFNDKSB7CisgIGlmICghaXNhPENvbnN0YW50RlA+KFJIU0MpKSByZXR1cm4gMDsKKyAgY29uc3QgQVBGbG9hdCAmUkhTID0gY2FzdDxDb25zdGFudEZQPihSSFNDKS0+Z2V0VmFsdWVBUEYoKTsKKyAgCisgIC8vIEdldCB0aGUgd2lkdGggb2YgdGhlIG1hbnRpc3NhLiAgV2UgZG9uJ3Qgd2FudCB0byBoYWNrIG9uIGNvbnZlcnNpb25zIHRoYXQKKyAgLy8gbWlnaHQgbG9zZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnRlZ2VyLCBlLmcuICJpNjQgLT4gZmxvYXQiCisgIGludCBNYW50aXNzYVdpZHRoID0gTEhTSS0+Z2V0VHlwZSgpLT5nZXRGUE1hbnRpc3NhV2lkdGgoKTsKKyAgaWYgKE1hbnRpc3NhV2lkdGggPT0gLTEpIHJldHVybiAwOyAgLy8gVW5rbm93bi4KKyAgCisgIC8vIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBpbnB1dCBpcyBjb252ZXJ0ZWQgZnJvbSBhbiBpbnRlZ2VyIHR5cGUgdGhhdCBpcyBzbWFsbAorICAvLyBlbm91Z2ggdGhhdCBwcmVzZXJ2ZXMgYWxsIGJpdHMuICBUT0RPOiBjaGVjayBoZXJlIGZvciAia25vd24iIHNpZ24gYml0cy4KKyAgLy8gVGhpcyB3b3VsZCBhbGxvdyB1cyB0byBoYW5kbGUgKGZwdG9zaSAoeCA+PnMgNjIpIHRvIGZsb2F0KSBpZiB4IGlzIGk2NCBmLmUuCisgIHVuc2lnbmVkIElucHV0U2l6ZSA9IExIU0ktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAKKyAgLy8gSWYgdGhpcyBpcyBhIHVpdG9mcCBpbnN0cnVjdGlvbiwgd2UgbmVlZCBhbiBleHRyYSBiaXQgdG8gaG9sZCB0aGUgc2lnbi4KKyAgYm9vbCBMSFNVbnNpZ25lZCA9IGlzYTxVSVRvRlBJbnN0PihMSFNJKTsKKyAgaWYgKExIU1Vuc2lnbmVkKQorICAgICsrSW5wdXRTaXplOworICAKKyAgLy8gSWYgdGhlIGNvbnZlcnNpb24gd291bGQgbG9zZSBpbmZvLCBkb24ndCBoYWNrIG9uIHRoaXMuCisgIGlmICgoaW50KUlucHV0U2l6ZSA+IE1hbnRpc3NhV2lkdGgpCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBPdGhlcndpc2UsIHdlIGNhbiBwb3RlbnRpYWxseSBzaW1wbGlmeSB0aGUgY29tcGFyaXNvbi4gIFdlIGtub3cgdGhhdCBpdAorICAvLyB3aWxsIGFsd2F5cyBjb21lIHRocm91Z2ggYXMgYW4gaW50ZWdlciB2YWx1ZSBhbmQgd2Uga25vdyB0aGUgY29uc3RhbnQgaXMKKyAgLy8gbm90IGEgTkFOIChpdCB3b3VsZCBoYXZlIGJlZW4gcHJldmlvdXNseSBzaW1wbGlmaWVkKS4KKyAgYXNzZXJ0KCFSSFMuaXNOYU4oKSAmJiAiTmFOIGNvbXBhcmlzb24gbm90IGFscmVhZHkgZm9sZGVkISIpOworICAKKyAgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkOworICBzd2l0Y2ggKEkuZ2V0UHJlZGljYXRlKCkpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBwcmVkaWNhdGUhIik7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUVROgorICBjYXNlIEZDbXBJbnN0OjpGQ01QX09FUToKKyAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfRVE7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdUOgorICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HVDoKKyAgICBQcmVkID0gTEhTVW5zaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9VR1QgOiBJQ21wSW5zdDo6SUNNUF9TR1Q7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdFOgorICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRToKKyAgICBQcmVkID0gTEhTVW5zaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9VR0UgOiBJQ21wSW5zdDo6SUNNUF9TR0U7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxUOgorICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MVDoKKyAgICBQcmVkID0gTEhTVW5zaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9VTFQgOiBJQ21wSW5zdDo6SUNNUF9TTFQ7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxFOgorICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MRToKKyAgICBQcmVkID0gTEhTVW5zaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9VTEUgOiBJQ21wSW5zdDo6SUNNUF9TTEU7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5FOgorICBjYXNlIEZDbXBJbnN0OjpGQ01QX09ORToKKyAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfTkU7CisgICAgYnJlYWs7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT1JEOgorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRUcnVlKEkuZ2V0Q29udGV4dCgpKSk7CisgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5POgorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRGYWxzZShJLmdldENvbnRleHQoKSkpOworICB9CisgIAorICBjb25zdCBJbnRlZ2VyVHlwZSAqSW50VHkgPSBjYXN0PEludGVnZXJUeXBlPihMSFNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpOworICAKKyAgLy8gTm93IHdlIGtub3cgdGhhdCB0aGUgQVBGbG9hdCBpcyBhIG5vcm1hbCBudW1iZXIsIHplcm8gb3IgaW5mLgorICAKKyAgLy8gU2VlIGlmIHRoZSBGUCBjb25zdGFudCBpcyB0b28gbGFyZ2UgZm9yIHRoZSBpbnRlZ2VyLiAgRm9yIGV4YW1wbGUsCisgIC8vIGNvbXBhcmluZyBhbiBpOCB0byAzMDAuMC4KKyAgdW5zaWduZWQgSW50V2lkdGggPSBJbnRUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAKKyAgaWYgKCFMSFNVbnNpZ25lZCkgeworICAgIC8vIElmIHRoZSBSSFMgdmFsdWUgaXMgPiBTaWduZWRNYXgsIGZvbGQgdGhlIGNvbXBhcmlzb24uICBUaGlzIGhhbmRsZXMgK0lORgorICAgIC8vIGFuZCBsYXJnZSB2YWx1ZXMuCisgICAgQVBGbG9hdCBTTWF4KFJIUy5nZXRTZW1hbnRpY3MoKSwgQVBGbG9hdDo6ZmNaZXJvLCBmYWxzZSk7CisgICAgU01heC5jb252ZXJ0RnJvbUFQSW50KEFQSW50OjpnZXRTaWduZWRNYXhWYWx1ZShJbnRXaWR0aCksIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgIGlmIChTTWF4LmNvbXBhcmUoUkhTKSA9PSBBUEZsb2F0OjpjbXBMZXNzVGhhbikgeyAgLy8gc21heCA8IDEzMTIzLjAKKyAgICAgIGlmIChQcmVkID09IElDbXBJbnN0OjpJQ01QX05FICB8fCBQcmVkID09IElDbXBJbnN0OjpJQ01QX1NMVCB8fAorICAgICAgICAgIFByZWQgPT0gSUNtcEluc3Q6OklDTVBfU0xFKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShJLmdldENvbnRleHQoKSkpOworICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKEkuZ2V0Q29udGV4dCgpKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIElmIHRoZSBSSFMgdmFsdWUgaXMgPiBVbnNpZ25lZE1heCwgZm9sZCB0aGUgY29tcGFyaXNvbi4gVGhpcyBoYW5kbGVzCisgICAgLy8gK0lORiBhbmQgbGFyZ2UgdmFsdWVzLgorICAgIEFQRmxvYXQgVU1heChSSFMuZ2V0U2VtYW50aWNzKCksIEFQRmxvYXQ6OmZjWmVybywgZmFsc2UpOworICAgIFVNYXguY29udmVydEZyb21BUEludChBUEludDo6Z2V0TWF4VmFsdWUoSW50V2lkdGgpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgaWYgKFVNYXguY29tcGFyZShSSFMpID09IEFQRmxvYXQ6OmNtcExlc3NUaGFuKSB7ICAvLyB1bWF4IDwgMTMxMjMuMAorICAgICAgaWYgKFByZWQgPT0gSUNtcEluc3Q6OklDTVBfTkUgIHx8IFByZWQgPT0gSUNtcEluc3Q6OklDTVBfVUxUIHx8CisgICAgICAgICAgUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9VTEUpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRUcnVlKEkuZ2V0Q29udGV4dCgpKSk7CisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0RmFsc2UoSS5nZXRDb250ZXh0KCkpKTsKKyAgICB9CisgIH0KKyAgCisgIGlmICghTEhTVW5zaWduZWQpIHsKKyAgICAvLyBTZWUgaWYgdGhlIFJIUyB2YWx1ZSBpcyA8IFNpZ25lZE1pbi4KKyAgICBBUEZsb2F0IFNNaW4oUkhTLmdldFNlbWFudGljcygpLCBBUEZsb2F0OjpmY1plcm8sIGZhbHNlKTsKKyAgICBTTWluLmNvbnZlcnRGcm9tQVBJbnQoQVBJbnQ6OmdldFNpZ25lZE1pblZhbHVlKEludFdpZHRoKSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgaWYgKFNNaW4uY29tcGFyZShSSFMpID09IEFQRmxvYXQ6OmNtcEdyZWF0ZXJUaGFuKSB7IC8vIHNtaW4gPiAxMjMxMi4wCisgICAgICBpZiAoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9ORSB8fCBQcmVkID09IElDbXBJbnN0OjpJQ01QX1NHVCB8fAorICAgICAgICAgIFByZWQgPT0gSUNtcEluc3Q6OklDTVBfU0dFKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShJLmdldENvbnRleHQoKSkpOworICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnRJbnQ6OmdldEZhbHNlKEkuZ2V0Q29udGV4dCgpKSk7CisgICAgfQorICB9CisKKyAgLy8gT2theSwgbm93IHdlIGtub3cgdGhhdCB0aGUgRlAgY29uc3RhbnQgZml0cyBpbiB0aGUgcmFuZ2UgW1NNSU4sIFNNQVhdIG9yCisgIC8vIFswLCBVTUFYXSwgYnV0IGl0IG1heSBzdGlsbCBiZSBmcmFjdGlvbmFsLiAgU2VlIGlmIGl0IGlzIGZyYWN0aW9uYWwgYnkKKyAgLy8gY2FzdGluZyB0aGUgRlAgdmFsdWUgdG8gdGhlIGludGVnZXIgdmFsdWUgYW5kIGJhY2ssIGNoZWNraW5nIGZvciBlcXVhbGl0eS4KKyAgLy8gRG9uJ3QgZG8gdGhpcyBmb3IgemVybywgYmVjYXVzZSAtMC4wIGlzIG5vdCBmcmFjdGlvbmFsLgorICBDb25zdGFudCAqUkhTSW50ID0gTEhTVW5zaWduZWQKKyAgICA/IENvbnN0YW50RXhwcjo6Z2V0RlBUb1VJKFJIU0MsIEludFR5KQorICAgIDogQ29uc3RhbnRFeHByOjpnZXRGUFRvU0koUkhTQywgSW50VHkpOworICBpZiAoIVJIUy5pc1plcm8oKSkgeworICAgIGJvb2wgRXF1YWwgPSBMSFNVbnNpZ25lZAorICAgICAgPyBDb25zdGFudEV4cHI6OmdldFVJVG9GUChSSFNJbnQsIFJIU0MtPmdldFR5cGUoKSkgPT0gUkhTQworICAgICAgOiBDb25zdGFudEV4cHI6OmdldFNJVG9GUChSSFNJbnQsIFJIU0MtPmdldFR5cGUoKSkgPT0gUkhTQzsKKyAgICBpZiAoIUVxdWFsKSB7CisgICAgICAvLyBJZiB3ZSBoYWQgYSBjb21wYXJpc29uIGFnYWluc3QgYSBmcmFjdGlvbmFsIHZhbHVlLCB3ZSBoYXZlIHRvIGFkanVzdAorICAgICAgLy8gdGhlIGNvbXBhcmUgcHJlZGljYXRlIGFuZCBzb21ldGltZXMgdGhlIHZhbHVlLiAgUkhTQyBpcyByb3VuZGVkIHRvd2FyZHMKKyAgICAgIC8vIHplcm8gYXQgdGhpcyBwb2ludC4KKyAgICAgIHN3aXRjaCAoUHJlZCkgeworICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBpbnRlZ2VyIGNvbXBhcmlzb24hIik7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiAgLy8gKGZsb2F0KWludCAhPSA0LjQgICAtLT4gdHJ1ZQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShJLmdldENvbnRleHQoKSkpOworICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogIC8vIChmbG9hdClpbnQgPT0gNC40ICAgLS0+IGZhbHNlCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRGYWxzZShJLmdldENvbnRleHQoKSkpOworICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTEU6CisgICAgICAgIC8vIChmbG9hdClpbnQgPD0gNC40ICAgLS0+IGludCA8PSA0CisgICAgICAgIC8vIChmbG9hdClpbnQgPD0gLTQuNCAgLS0+IGZhbHNlCisgICAgICAgIGlmIChSSFMuaXNOZWdhdGl2ZSgpKQorICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50SW50OjpnZXRGYWxzZShJLmdldENvbnRleHQoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xFOgorICAgICAgICAvLyAoZmxvYXQpaW50IDw9IDQuNCAgIC0tPiBpbnQgPD0gNAorICAgICAgICAvLyAoZmxvYXQpaW50IDw9IC00LjQgIC0tPiBpbnQgPCAtNAorICAgICAgICBpZiAoUkhTLmlzTmVnYXRpdmUoKSkKKyAgICAgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfU0xUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOgorICAgICAgICAvLyAoZmxvYXQpaW50IDwgLTQuNCAgIC0tPiBmYWxzZQorICAgICAgICAvLyAoZmxvYXQpaW50IDwgNC40ICAgIC0tPiBpbnQgPD0gNAorICAgICAgICBpZiAoUkhTLmlzTmVnYXRpdmUoKSkKKyAgICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0RmFsc2UoSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1VMRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDoKKyAgICAgICAgLy8gKGZsb2F0KWludCA8IC00LjQgICAtLT4gaW50IDwgLTQKKyAgICAgICAgLy8gKGZsb2F0KWludCA8IDQuNCAgICAtLT4gaW50IDw9IDQKKyAgICAgICAgaWYgKCFSSFMuaXNOZWdhdGl2ZSgpKQorICAgICAgICAgIFByZWQgPSBJQ21wSW5zdDo6SUNNUF9TTEU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6CisgICAgICAgIC8vIChmbG9hdClpbnQgPiA0LjQgICAgLS0+IGludCA+IDQKKyAgICAgICAgLy8gKGZsb2F0KWludCA+IC00LjQgICAtLT4gdHJ1ZQorICAgICAgICBpZiAoUkhTLmlzTmVnYXRpdmUoKSkKKyAgICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudEludDo6Z2V0VHJ1ZShJLmdldENvbnRleHQoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOgorICAgICAgICAvLyAoZmxvYXQpaW50ID4gNC40ICAgIC0tPiBpbnQgPiA0CisgICAgICAgIC8vIChmbG9hdClpbnQgPiAtNC40ICAgLS0+IGludCA+PSAtNAorICAgICAgICBpZiAoUkhTLmlzTmVnYXRpdmUoKSkKKyAgICAgICAgICBQcmVkID0gSUNtcEluc3Q6OklDTVBfU0dFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOgorICAgICAgICAvLyAoZmxvYXQpaW50ID49IC00LjQgICAtLT4gdHJ1ZQorICAgICAgICAvLyAoZmxvYXQpaW50ID49IDQuNCAgICAtLT4gaW50ID4gNAorICAgICAgICBpZiAoIVJIUy5pc05lZ2F0aXZlKCkpCisgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnRJbnQ6OmdldFRydWUoSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1VHVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRToKKyAgICAgICAgLy8gKGZsb2F0KWludCA+PSAtNC40ICAgLS0+IGludCA+PSAtNAorICAgICAgICAvLyAoZmxvYXQpaW50ID49IDQuNCAgICAtLT4gaW50ID4gNAorICAgICAgICBpZiAoIVJIUy5pc05lZ2F0aXZlKCkpCisgICAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1NHVDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gTG93ZXIgdGhpcyBGUCBjb21wYXJpc29uIGludG8gYW4gYXBwcm9wcmlhdGUgaW50ZWdlciB2ZXJzaW9uIG9mIHRoZQorICAvLyBjb21wYXJpc29uLgorICByZXR1cm4gbmV3IElDbXBJbnN0KFByZWQsIExIU0ktPmdldE9wZXJhbmQoMCksIFJIU0ludCk7Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0RkNtcEluc3QoRkNtcEluc3QgJkkpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIAorICAvLy8gT3JkZXJzIHRoZSBvcGVyYW5kcyBvZiB0aGUgY29tcGFyZSBzbyB0aGF0IHRoZXkgYXJlIGxpc3RlZCBmcm9tIG1vc3QKKyAgLy8vIGNvbXBsZXggdG8gbGVhc3QgY29tcGxleC4gIFRoaXMgcHV0cyBjb25zdGFudHMgYmVmb3JlIHVuYXJ5IG9wZXJhdG9ycywKKyAgLy8vIGJlZm9yZSBiaW5hcnkgb3BlcmF0b3JzLgorICBpZiAoZ2V0Q29tcGxleGl0eShJLmdldE9wZXJhbmQoMCkpIDwgZ2V0Q29tcGxleGl0eShJLmdldE9wZXJhbmQoMSkpKSB7CisgICAgSS5zd2FwT3BlcmFuZHMoKTsKKyAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgfQorCisgIFZhbHVlICpPcDAgPSBJLmdldE9wZXJhbmQoMCksICpPcDEgPSBJLmdldE9wZXJhbmQoMSk7CisgIAorICBpZiAoVmFsdWUgKlYgPSBTaW1wbGlmeUZDbXBJbnN0KEkuZ2V0UHJlZGljYXRlKCksIE9wMCwgT3AxLCBURCkpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgVik7CisKKyAgLy8gU2ltcGxpZnkgJ2ZjbXAgcHJlZCBYLCBYJworICBpZiAoT3AwID09IE9wMSkgeworICAgIHN3aXRjaCAoSS5nZXRQcmVkaWNhdGUoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gcHJlZGljYXRlISIpOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5POiAgICAvLyBUcnVlIGlmIHVub3JkZXJlZDogaXNuYW4oWCkgfCBpc25hbihZKQorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxUOiAgICAvLyBUcnVlIGlmIHVub3JkZXJlZCBvciBsZXNzIHRoYW4KKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHVDogICAgLy8gVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgZ3JlYXRlciB0aGFuCisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTkU6ICAgIC8vIFRydWUgaWYgdW5vcmRlcmVkIG9yIG5vdCBlcXVhbAorICAgICAgLy8gQ2Fub25pY2FsaXplIHRoZXNlIHRvIGJlICdmY21wIHVubyAlWCwgMC4wJy4KKyAgICAgIEkuc2V0UHJlZGljYXRlKEZDbXBJbnN0OjpGQ01QX1VOTyk7CisgICAgICBJLnNldE9wZXJhbmQoMSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShPcDAtPmdldFR5cGUoKSkpOworICAgICAgcmV0dXJuICZJOworICAgICAgCisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PUkQ6ICAgIC8vIFRydWUgaWYgb3JkZXJlZCAobm8gbmFucykKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09FUTogICAgLy8gVHJ1ZSBpZiBvcmRlcmVkIGFuZCBlcXVhbAorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0dFOiAgICAvLyBUcnVlIGlmIG9yZGVyZWQgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xFOiAgICAvLyBUcnVlIGlmIG9yZGVyZWQgYW5kIGxlc3MgdGhhbiBvciBlcXVhbAorICAgICAgLy8gQ2Fub25pY2FsaXplIHRoZXNlIHRvIGJlICdmY21wIG9yZCAlWCwgMC4wJy4KKyAgICAgIEkuc2V0UHJlZGljYXRlKEZDbXBJbnN0OjpGQ01QX09SRCk7CisgICAgICBJLnNldE9wZXJhbmQoMSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShPcDAtPmdldFR5cGUoKSkpOworICAgICAgcmV0dXJuICZJOworICAgIH0KKyAgfQorICAgIAorICAvLyBIYW5kbGUgZmNtcCB3aXRoIGNvbnN0YW50IFJIUworICBpZiAoQ29uc3RhbnQgKlJIU0MgPSBkeW5fY2FzdDxDb25zdGFudD4oT3AxKSkgeworICAgIGlmIChJbnN0cnVjdGlvbiAqTEhTSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihPcDApKQorICAgICAgc3dpdGNoIChMSFNJLT5nZXRPcGNvZGUoKSkgeworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6UEhJOgorICAgICAgICAvLyBPbmx5IGZvbGQgZmNtcCBpbnRvIHRoZSBQSEkgaWYgdGhlIHBoaSBhbmQgZmNtcCBhcmUgaW4gdGhlIHNhbWUKKyAgICAgICAgLy8gYmxvY2suICBJZiBpbiB0aGUgc2FtZSBibG9jaywgd2UncmUgZW5jb3VyYWdpbmcganVtcCB0aHJlYWRpbmcuICBJZgorICAgICAgICAvLyBub3QsIHdlIGFyZSBqdXN0IHBlc3NpbWl6aW5nIHRoZSBjb2RlIGJ5IG1ha2luZyBhbiBpMSBwaGkuCisgICAgICAgIGlmIChMSFNJLT5nZXRQYXJlbnQoKSA9PSBJLmdldFBhcmVudCgpKQorICAgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEksIHRydWUpKQorICAgICAgICAgICAgcmV0dXJuIE5WOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNJVG9GUDoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgICAgICAgaWYgKEluc3RydWN0aW9uICpOViA9IEZvbGRGQ21wX0ludFRvRlBfQ3N0KEksIExIU0ksIFJIU0MpKQorICAgICAgICAgIHJldHVybiBOVjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTZWxlY3Q6IHsKKyAgICAgICAgLy8gSWYgZWl0aGVyIG9wZXJhbmQgb2YgdGhlIHNlbGVjdCBpcyBhIGNvbnN0YW50LCB3ZSBjYW4gZm9sZCB0aGUKKyAgICAgICAgLy8gY29tcGFyaXNvbiBpbnRvIHRoZSBzZWxlY3QgYXJtcywgd2hpY2ggd2lsbCBjYXVzZSBvbmUgdG8gYmUKKyAgICAgICAgLy8gY29uc3RhbnQgZm9sZGVkIGFuZCB0aGUgc2VsZWN0IHR1cm5lZCBpbnRvIGEgYml0d2lzZSBvci4KKyAgICAgICAgVmFsdWUgKk9wMSA9IDAsICpPcDIgPSAwOworICAgICAgICBpZiAoTEhTSS0+aGFzT25lVXNlKCkpIHsKKyAgICAgICAgICBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICAgIC8vIEZvbGQgdGhlIGtub3duIHZhbHVlIGludG8gdGhlIGNvbnN0YW50IG9wZXJhbmQuCisgICAgICAgICAgICBPcDEgPSBDb25zdGFudEV4cHI6OmdldENvbXBhcmUoSS5nZXRQcmVkaWNhdGUoKSwgQywgUkhTQyk7CisgICAgICAgICAgICAvLyBJbnNlcnQgYSBuZXcgRkNtcCBvZiB0aGUgb3RoZXIgc2VsZWN0IG9wZXJhbmQuCisgICAgICAgICAgICBPcDIgPSBCdWlsZGVyLT5DcmVhdGVGQ21wKEkuZ2V0UHJlZGljYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIU0ktPmdldE9wZXJhbmQoMiksIFJIU0MpOworICAgICAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTSS0+Z2V0T3BlcmFuZCgyKSkpIHsKKyAgICAgICAgICAgIC8vIEZvbGQgdGhlIGtub3duIHZhbHVlIGludG8gdGhlIGNvbnN0YW50IG9wZXJhbmQuCisgICAgICAgICAgICBPcDIgPSBDb25zdGFudEV4cHI6OmdldENvbXBhcmUoSS5nZXRQcmVkaWNhdGUoKSwgQywgUkhTQyk7CisgICAgICAgICAgICAvLyBJbnNlcnQgYSBuZXcgRkNtcCBvZiB0aGUgb3RoZXIgc2VsZWN0IG9wZXJhbmQuCisgICAgICAgICAgICBPcDEgPSBCdWlsZGVyLT5DcmVhdGVGQ21wKEkuZ2V0UHJlZGljYXRlKCksIExIU0ktPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChPcDEpCisgICAgICAgICAgcmV0dXJuIFNlbGVjdEluc3Q6OkNyZWF0ZShMSFNJLT5nZXRPcGVyYW5kKDApLCBPcDEsIE9wMik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6TG9hZDoKKyAgICAgICAgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPQorICAgICAgICAgICAgZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KExIU0ktPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgICAgaWYgKEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihHRVAtPmdldE9wZXJhbmQoMCkpKQorICAgICAgICAgICAgaWYgKEdWLT5pc0NvbnN0YW50KCkgJiYgR1YtPmhhc0RlZmluaXRpdmVJbml0aWFsaXplcigpICYmCisgICAgICAgICAgICAgICAgIWNhc3Q8TG9hZEluc3Q+KExIU0kpLT5pc1ZvbGF0aWxlKCkpCisgICAgICAgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqUmVzID0gRm9sZENtcExvYWRGcm9tSW5kZXhlZEdsb2JhbChHRVAsIEdWLCBJKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIENoYW5nZWQgPyAmSSA6IDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZUxvYWRTdG9yZUFsbG9jYS5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZUxvYWRTdG9yZUFsbG9jYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzNTViMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lTG9hZFN0b3JlQWxsb2NhLmNwcApAQCAtMCwwICsxLDYwOSBAQAorLy89PT0tIEluc3RDb21iaW5lTG9hZFN0b3JlQWxsb2NhLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdmlzaXQgZnVuY3Rpb25zIGZvciBsb2FkLCBzdG9yZSBhbmQgYWxsb2NhLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJJbnN0Q29tYmluZS5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9hZHMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Jhc2ljQmxvY2tVdGlscy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1EZWFkU3RvcmUsICJOdW1iZXIgb2YgZGVhZCBzdG9yZXMgZWxpbWluYXRlZCIpOworCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdEFsbG9jYUluc3QoQWxsb2NhSW5zdCAmQUkpIHsKKyAgLy8gRW5zdXJlIHRoYXQgdGhlIGFsbG9jYSBhcnJheSBzaXplIGFyZ3VtZW50IGhhcyB0eXBlIGludHB0cl90LCBzbyB0aGF0CisgIC8vIGFueSBjYXN0aW5nIGlzIGV4cG9zZWQgZWFybHkuCisgIGlmIChURCkgeworICAgIGNvbnN0IFR5cGUgKkludFB0clR5ID0gVEQtPmdldEludFB0clR5cGUoQUkuZ2V0Q29udGV4dCgpKTsKKyAgICBpZiAoQUkuZ2V0QXJyYXlTaXplKCktPmdldFR5cGUoKSAhPSBJbnRQdHJUeSkgeworICAgICAgVmFsdWUgKlYgPSBCdWlsZGVyLT5DcmVhdGVJbnRDYXN0KEFJLmdldEFycmF5U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFB0clR5LCBmYWxzZSk7CisgICAgICBBSS5zZXRPcGVyYW5kKDAsIFYpOworICAgICAgcmV0dXJuICZBSTsKKyAgICB9CisgIH0KKworICAvLyBDb252ZXJ0OiBhbGxvY2EgVHksIEMgLSB3aGVyZSBDIGlzIGEgY29uc3RhbnQgIT0gMSBpbnRvOiBhbGxvY2EgW0MgeCBUeV0sIDEKKyAgaWYgKEFJLmlzQXJyYXlBbGxvY2F0aW9uKCkpIHsgIC8vIENoZWNrIEMgIT0gMQorICAgIGlmIChjb25zdCBDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihBSS5nZXRBcnJheVNpemUoKSkpIHsKKyAgICAgIGNvbnN0IFR5cGUgKk5ld1R5ID0gCisgICAgICAgIEFycmF5VHlwZTo6Z2V0KEFJLmdldEFsbG9jYXRlZFR5cGUoKSwgQy0+Z2V0WkV4dFZhbHVlKCkpOworICAgICAgYXNzZXJ0KGlzYTxBbGxvY2FJbnN0PihBSSkgJiYgIlVua25vd24gdHlwZSBvZiBhbGxvY2F0aW9uIGluc3QhIik7CisgICAgICBBbGxvY2FJbnN0ICpOZXcgPSBCdWlsZGVyLT5DcmVhdGVBbGxvY2EoTmV3VHksIDApOworICAgICAgTmV3LT5zZXRBbGlnbm1lbnQoQUkuZ2V0QWxpZ25tZW50KCkpOworCisgICAgICAvLyBTY2FuIHRvIHRoZSBlbmQgb2YgdGhlIGFsbG9jYXRpb24gaW5zdHJ1Y3Rpb25zLCB0byBza2lwIG92ZXIgYSBibG9jayBvZgorICAgICAgLy8gYWxsb2NhcyBpZiBwb3NzaWJsZS4uLmFsc28gc2tpcCBpbnRlcmxlYXZlZCBkZWJ1ZyBpbmZvCisgICAgICAvLworICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSXQgPSBOZXc7CisgICAgICB3aGlsZSAoaXNhPEFsbG9jYUluc3Q+KCpJdCkgfHwgSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKCpJdCkpICsrSXQ7CisKKyAgICAgIC8vIE5vdyB0aGF0IEkgaXMgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IG5vbi1hbGxvY2F0aW9uLWluc3QgaW4gdGhlIGJsb2NrLAorICAgICAgLy8gaW5zZXJ0IG91ciBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9uLi4uCisgICAgICAvLworICAgICAgVmFsdWUgKk51bGxJZHggPUNvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0SW50MzJUeShBSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgIFZhbHVlICpJZHhbMl07CisgICAgICBJZHhbMF0gPSBOdWxsSWR4OworICAgICAgSWR4WzFdID0gTnVsbElkeDsKKyAgICAgIFZhbHVlICpWID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZUluQm91bmRzKE5ldywgSWR4LCBJZHggKyAyLCBJdCk7CisKKyAgICAgIC8vIE5vdyBtYWtlIGV2ZXJ5dGhpbmcgdXNlIHRoZSBnZXRlbGVtZW50cHRyIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsCisgICAgICAvLyBhbGxvY2F0aW9uLgorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoQUksIFYpOworICAgIH0gZWxzZSBpZiAoaXNhPFVuZGVmVmFsdWU+KEFJLmdldEFycmF5U2l6ZSgpKSkgeworICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoQUksIENvbnN0YW50OjpnZXROdWxsVmFsdWUoQUkuZ2V0VHlwZSgpKSk7CisgICAgfQorICB9CisKKyAgaWYgKFREICYmIGlzYTxBbGxvY2FJbnN0PihBSSkgJiYgQUkuZ2V0QWxsb2NhdGVkVHlwZSgpLT5pc1NpemVkKCkpIHsKKyAgICAvLyBJZiBhbGxvY2EnaW5nIGEgemVybyBieXRlIG9iamVjdCwgcmVwbGFjZSB0aGUgYWxsb2NhIHdpdGggYSBudWxsIHBvaW50ZXIuCisgICAgLy8gTm90ZSB0aGF0IHdlIG9ubHkgZG8gdGhpcyBmb3IgYWxsb2NhJ3MsIGJlY2F1c2UgbWFsbG9jIHNob3VsZCBhbGxvY2F0ZQorICAgIC8vIGFuZCByZXR1cm4gYSB1bmlxdWUgcG9pbnRlciwgZXZlbiBmb3IgYSB6ZXJvIGJ5dGUgYWxsb2NhdGlvbi4KKyAgICBpZiAoVEQtPmdldFR5cGVBbGxvY1NpemUoQUkuZ2V0QWxsb2NhdGVkVHlwZSgpKSA9PSAwKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoQUksIENvbnN0YW50OjpnZXROdWxsVmFsdWUoQUkuZ2V0VHlwZSgpKSk7CisKKyAgICAvLyBJZiB0aGUgYWxpZ25tZW50IGlzIDAgKHVuc3BlY2lmaWVkKSwgYXNzaWduIGl0IHRoZSBwcmVmZXJyZWQgYWxpZ25tZW50LgorICAgIGlmIChBSS5nZXRBbGlnbm1lbnQoKSA9PSAwKQorICAgICAgQUkuc2V0QWxpZ25tZW50KFRELT5nZXRQcmVmVHlwZUFsaWdubWVudChBSS5nZXRBbGxvY2F0ZWRUeXBlKCkpKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKKy8vLyBJbnN0Q29tYmluZUxvYWRDYXN0IC0gRm9sZCAnbG9hZCAoY2FzdCBQKScgLT4gY2FzdCAobG9hZCBQKScgd2hlbiBwb3NzaWJsZS4KK3N0YXRpYyBJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVMb2FkQ2FzdChJbnN0Q29tYmluZXIgJklDLCBMb2FkSW5zdCAmTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQpIHsKKyAgVXNlciAqQ0kgPSBjYXN0PFVzZXI+KExJLmdldE9wZXJhbmQoMCkpOworICBWYWx1ZSAqQ2FzdE9wID0gQ0ktPmdldE9wZXJhbmQoMCk7CisKKyAgY29uc3QgUG9pbnRlclR5cGUgKkRlc3RUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KENJLT5nZXRUeXBlKCkpOworICBjb25zdCBUeXBlICpEZXN0UFR5ID0gRGVzdFR5LT5nZXRFbGVtZW50VHlwZSgpOworICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlNyY1R5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KENhc3RPcC0+Z2V0VHlwZSgpKSkgeworCisgICAgLy8gSWYgdGhlIGFkZHJlc3Mgc3BhY2VzIGRvbid0IG1hdGNoLCBkb24ndCBlbGltaW5hdGUgdGhlIGNhc3QuCisgICAgaWYgKERlc3RUeS0+Z2V0QWRkcmVzc1NwYWNlKCkgIT0gU3JjVHktPmdldEFkZHJlc3NTcGFjZSgpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBjb25zdCBUeXBlICpTcmNQVHkgPSBTcmNUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKworICAgIGlmIChEZXN0UFR5LT5pc0ludGVnZXJUeSgpIHx8IERlc3RQVHktPmlzUG9pbnRlclR5KCkgfHwgCisgICAgICAgICBEZXN0UFR5LT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIC8vIElmIHRoZSBzb3VyY2UgaXMgYW4gYXJyYXksIHRoZSBjb2RlIGJlbG93IHdpbGwgbm90IHN1Y2NlZWQuICBDaGVjayB0bworICAgICAgLy8gc2VlIGlmIGEgdHJpdmlhbCAnZ2VwIFAsIDAsIDAnIHdpbGwgaGVscCBtYXR0ZXJzLiAgT25seSBkbyB0aGlzIGZvcgorICAgICAgLy8gY29uc3RhbnRzLgorICAgICAgaWYgKGNvbnN0IEFycmF5VHlwZSAqQVNyY1R5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihTcmNQVHkpKQorICAgICAgICBpZiAoQ29uc3RhbnQgKkNTcmMgPSBkeW5fY2FzdDxDb25zdGFudD4oQ2FzdE9wKSkKKyAgICAgICAgICBpZiAoQVNyY1R5LT5nZXROdW1FbGVtZW50cygpICE9IDApIHsKKyAgICAgICAgICAgIFZhbHVlICpJZHhzWzJdOworICAgICAgICAgICAgSWR4c1swXSA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0SW50MzJUeShMSS5nZXRDb250ZXh0KCkpKTsKKyAgICAgICAgICAgIElkeHNbMV0gPSBJZHhzWzBdOworICAgICAgICAgICAgQ2FzdE9wID0gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKENTcmMsIElkeHMsIDIpOworICAgICAgICAgICAgU3JjVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihDYXN0T3AtPmdldFR5cGUoKSk7CisgICAgICAgICAgICBTcmNQVHkgPSBTcmNUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgICB9CisKKyAgICAgIGlmIChJQy5nZXRUYXJnZXREYXRhKCkgJiYKKyAgICAgICAgICAoU3JjUFR5LT5pc0ludGVnZXJUeSgpIHx8IFNyY1BUeS0+aXNQb2ludGVyVHkoKSB8fCAKKyAgICAgICAgICAgIFNyY1BUeS0+aXNWZWN0b3JUeSgpKSAmJgorICAgICAgICAgIC8vIERvIG5vdCBhbGxvdyB0dXJuaW5nIHRoaXMgaW50byBhIGxvYWQgb2YgYW4gaW50ZWdlciwgd2hpY2ggaXMgdGhlbgorICAgICAgICAgIC8vIGNhc3RlZCB0byBhIHBvaW50ZXIsIHRoaXMgcGVzc2ltaXplcyBwb2ludGVyIGFuYWx5c2lzIGEgbG90LgorICAgICAgICAgIChTcmNQVHktPmlzUG9pbnRlclR5KCkgPT0gTEkuZ2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSAmJgorICAgICAgICAgIElDLmdldFRhcmdldERhdGEoKS0+Z2V0VHlwZVNpemVJbkJpdHMoU3JjUFR5KSA9PQorICAgICAgICAgICAgICAgSUMuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRUeXBlU2l6ZUluQml0cyhEZXN0UFR5KSkgeworCisgICAgICAgIC8vIE9rYXksIHdlIGFyZSBjYXN0aW5nIGZyb20gb25lIGludGVnZXIgb3IgcG9pbnRlciB0eXBlIHRvIGFub3RoZXIgb2YKKyAgICAgICAgLy8gdGhlIHNhbWUgc2l6ZS4gIEluc3RlYWQgb2YgY2FzdGluZyB0aGUgcG9pbnRlciBiZWZvcmUgdGhlIGxvYWQsIGNhc3QKKyAgICAgICAgLy8gdGhlIHJlc3VsdCBvZiB0aGUgbG9hZGVkIHZhbHVlLgorICAgICAgICBMb2FkSW5zdCAqTmV3TG9hZCA9IAorICAgICAgICAgIElDLkJ1aWxkZXItPkNyZWF0ZUxvYWQoQ2FzdE9wLCBMSS5pc1ZvbGF0aWxlKCkpOworICAgICAgICBOZXdMb2FkLT5zZXRBbGlnbm1lbnQoTEkuZ2V0QWxpZ25tZW50KCkpOworICAgICAgICAvLyBOb3cgY2FzdCB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkLgorICAgICAgICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KE5ld0xvYWQsIExJLmdldFR5cGUoKSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdExvYWRJbnN0KExvYWRJbnN0ICZMSSkgeworICBWYWx1ZSAqT3AgPSBMSS5nZXRPcGVyYW5kKDApOworCisgIC8vIEF0dGVtcHQgdG8gaW1wcm92ZSB0aGUgYWxpZ25tZW50LgorICBpZiAoVEQpIHsKKyAgICB1bnNpZ25lZCBLbm93bkFsaWduID0KKyAgICAgIEdldE9yRW5mb3JjZUtub3duQWxpZ25tZW50KE9wLCBURC0+Z2V0UHJlZlR5cGVBbGlnbm1lbnQoTEkuZ2V0VHlwZSgpKSk7CisgICAgdW5zaWduZWQgTG9hZEFsaWduID0gTEkuZ2V0QWxpZ25tZW50KCk7CisgICAgdW5zaWduZWQgRWZmZWN0aXZlTG9hZEFsaWduID0gTG9hZEFsaWduICE9IDAgPyBMb2FkQWxpZ24gOgorICAgICAgVEQtPmdldEFCSVR5cGVBbGlnbm1lbnQoTEkuZ2V0VHlwZSgpKTsKKworICAgIGlmIChLbm93bkFsaWduID4gRWZmZWN0aXZlTG9hZEFsaWduKQorICAgICAgTEkuc2V0QWxpZ25tZW50KEtub3duQWxpZ24pOworICAgIGVsc2UgaWYgKExvYWRBbGlnbiA9PSAwKQorICAgICAgTEkuc2V0QWxpZ25tZW50KEVmZmVjdGl2ZUxvYWRBbGlnbik7CisgIH0KKworICAvLyBsb2FkIChjYXN0IFgpIC0tPiBjYXN0IChsb2FkIFgpIGlmZiBzYWZlLgorICBpZiAoaXNhPENhc3RJbnN0PihPcCkpCisgICAgaWYgKEluc3RydWN0aW9uICpSZXMgPSBJbnN0Q29tYmluZUxvYWRDYXN0KCp0aGlzLCBMSSwgVEQpKQorICAgICAgcmV0dXJuIFJlczsKKworICAvLyBOb25lIG9mIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtcyBhcmUgbGVnYWwgZm9yIHZvbGF0aWxlIGxvYWRzLgorICBpZiAoTEkuaXNWb2xhdGlsZSgpKSByZXR1cm4gMDsKKyAgCisgIC8vIERvIHJlYWxseSBzaW1wbGUgc3RvcmUtdG8tbG9hZCBmb3J3YXJkaW5nIGFuZCBsb2FkIENTRSwgdG8gY2F0Y2ggY2FzZXMKKyAgLy8gd2hlcmUgdGhlcmUgYXJlIHNldmVyYWwgY29uc2VxdXRpdmUgbWVtb3J5IGFjY2Vzc2VzIHRvIHRoZSBzYW1lIGxvY2F0aW9uLAorICAvLyBzZXBhcmF0ZWQgYnkgYSBmZXcgYXJpdGhtZXRpYyBvcGVyYXRpb25zLgorICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSAmTEk7CisgIGlmIChWYWx1ZSAqQXZhaWxhYmxlVmFsID0gRmluZEF2YWlsYWJsZUxvYWRlZFZhbHVlKE9wLCBMSS5nZXRQYXJlbnQoKSwgQkJJLDYpKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKExJLCBBdmFpbGFibGVWYWwpOworCisgIC8vIGxvYWQoZ2VwIG51bGwsIC4uLikgLT4gdW5yZWFjaGFibGUKKyAgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVBJID0gZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KE9wKSkgeworICAgIGNvbnN0IFZhbHVlICpHRVBJMCA9IEdFUEktPmdldE9wZXJhbmQoMCk7CisgICAgLy8gVE9ETzogQ29uc2lkZXIgYSB0YXJnZXQgaG9vayBmb3IgdmFsaWQgYWRkcmVzcyBzcGFjZXMgZm9yIHRoaXMgeGZvcm0uCisgICAgaWYgKGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihHRVBJMCkgJiYgR0VQSS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpID09IDApeworICAgICAgLy8gSW5zZXJ0IGEgbmV3IHN0b3JlIHRvIG51bGwgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBsb2FkIHRvIGluZGljYXRlCisgICAgICAvLyB0aGF0IHRoaXMgY29kZSBpcyBub3QgcmVhY2hhYmxlLiAgV2UgZG8gdGhpcyBpbnN0ZWFkIG9mIGluc2VydGluZworICAgICAgLy8gYW4gdW5yZWFjaGFibGUgaW5zdHJ1Y3Rpb24gZGlyZWN0bHkgYmVjYXVzZSB3ZSBjYW5ub3QgbW9kaWZ5IHRoZQorICAgICAgLy8gQ0ZHLgorICAgICAgbmV3IFN0b3JlSW5zdChVbmRlZlZhbHVlOjpnZXQoTEkuZ2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShPcC0+Z2V0VHlwZSgpKSwgJkxJKTsKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKExJLCBVbmRlZlZhbHVlOjpnZXQoTEkuZ2V0VHlwZSgpKSk7CisgICAgfQorICB9IAorCisgIC8vIGxvYWQgbnVsbC91bmRlZiAtPiB1bnJlYWNoYWJsZQorICAvLyBUT0RPOiBDb25zaWRlciBhIHRhcmdldCBob29rIGZvciB2YWxpZCBhZGRyZXNzIHNwYWNlcyBmb3IgdGhpcyB4Zm9ybS4KKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihPcCkgfHwKKyAgICAgIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oT3ApICYmIExJLmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSA9PSAwKSkgeworICAgIC8vIEluc2VydCBhIG5ldyBzdG9yZSB0byBudWxsIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgbG9hZCB0byBpbmRpY2F0ZSB0aGF0CisgICAgLy8gdGhpcyBjb2RlIGlzIG5vdCByZWFjaGFibGUuICBXZSBkbyB0aGlzIGluc3RlYWQgb2YgaW5zZXJ0aW5nIGFuCisgICAgLy8gdW5yZWFjaGFibGUgaW5zdHJ1Y3Rpb24gZGlyZWN0bHkgYmVjYXVzZSB3ZSBjYW5ub3QgbW9kaWZ5IHRoZSBDRkcuCisgICAgbmV3IFN0b3JlSW5zdChVbmRlZlZhbHVlOjpnZXQoTEkuZ2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoT3AtPmdldFR5cGUoKSksICZMSSk7CisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoTEksIFVuZGVmVmFsdWU6OmdldChMSS5nZXRUeXBlKCkpKTsKKyAgfQorCisgIC8vIEluc3Rjb21iaW5lIGxvYWQgKGNvbnN0YW50ZXhwcl9jYXN0IGdsb2JhbCkgLT4gY2FzdCAobG9hZCBnbG9iYWwpCisgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihPcCkpCisgICAgaWYgKENFLT5pc0Nhc3QoKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqUmVzID0gSW5zdENvbWJpbmVMb2FkQ2FzdCgqdGhpcywgTEksIFREKSkKKyAgICAgICAgcmV0dXJuIFJlczsKKyAgCisgIGlmIChPcC0+aGFzT25lVXNlKCkpIHsKKyAgICAvLyBDaGFuZ2Ugc2VsZWN0IGFuZCBQSEkgbm9kZXMgdG8gc2VsZWN0IHZhbHVlcyBpbnN0ZWFkIG9mIGFkZHJlc3NlczogdGhpcworICAgIC8vIGhlbHBzIGFsaWFzIGFuYWx5c2lzIG91dCBhIGxvdCwgYWxsb3dzIG1hbnkgb3RoZXJzIHNpbXBsaWZpY2F0aW9ucywgYW5kCisgICAgLy8gZXhwb3NlcyByZWR1bmRhbmN5IGluIHRoZSBjb2RlLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBkbyB0aGUgdHJhbnNmb3JtYXRpb24gdW5sZXNzIHdlIGtub3cgdGhhdCB0aGUKKyAgICAvLyBpbnRyb2R1Y2VkIGxvYWRzIGNhbm5vdCB0cmFwISAgU29tZXRoaW5nIGxpa2UgdGhpcyBpcyB2YWxpZCBhcyBsb25nIGFzCisgICAgLy8gdGhlIGNvbmRpdGlvbiBpcyBhbHdheXMgZmFsc2U6IGxvYWQgKHNlbGVjdCBib29sICVDLCBpbnQqIG51bGwsIGludCogJUcpLAorICAgIC8vIGJ1dCBpdCB3b3VsZCBub3QgYmUgdmFsaWQgaWYgd2UgdHJhbnNmb3JtZWQgaXQgdG8gbG9hZCBmcm9tIG51bGwKKyAgICAvLyB1bmNvbmRpdGlvbmFsbHkuCisgICAgLy8KKyAgICBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihPcCkpIHsKKyAgICAgIC8vIGxvYWQgKHNlbGVjdCAoQ29uZCwgJlYxLCAmVjIpKSAgLS0+IHNlbGVjdChDb25kLCBsb2FkICZWMSwgbG9hZCAmVjIpLgorICAgICAgdW5zaWduZWQgQWxpZ24gPSBMSS5nZXRBbGlnbm1lbnQoKTsKKyAgICAgIGlmIChpc1NhZmVUb0xvYWRVbmNvbmRpdGlvbmFsbHkoU0ktPmdldE9wZXJhbmQoMSksIFNJLCBBbGlnbiwgVEQpICYmCisgICAgICAgICAgaXNTYWZlVG9Mb2FkVW5jb25kaXRpb25hbGx5KFNJLT5nZXRPcGVyYW5kKDIpLCBTSSwgQWxpZ24sIFREKSkgeworICAgICAgICBMb2FkSW5zdCAqVjEgPSBCdWlsZGVyLT5DcmVhdGVMb2FkKFNJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgTG9hZEluc3QgKlYyID0gQnVpbGRlci0+Q3JlYXRlTG9hZChTSS0+Z2V0T3BlcmFuZCgyKSk7CisgICAgICAgIFYxLT5zZXRBbGlnbm1lbnQoQWxpZ24pOworICAgICAgICBWMi0+c2V0QWxpZ25tZW50KEFsaWduKTsKKyAgICAgICAgcmV0dXJuIFNlbGVjdEluc3Q6OkNyZWF0ZShTSS0+Z2V0Q29uZGl0aW9uKCksIFYxLCBWMik7CisgICAgICB9CisKKyAgICAgIC8vIGxvYWQgKHNlbGVjdCAoY29uZCwgbnVsbCwgUCkpIC0+IGxvYWQgUAorICAgICAgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFNJLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICAgaWYgKEMtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgICBMSS5zZXRPcGVyYW5kKDAsIFNJLT5nZXRPcGVyYW5kKDIpKTsKKyAgICAgICAgICByZXR1cm4gJkxJOworICAgICAgICB9CisKKyAgICAgIC8vIGxvYWQgKHNlbGVjdCAoY29uZCwgUCwgbnVsbCkpIC0+IGxvYWQgUAorICAgICAgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFNJLT5nZXRPcGVyYW5kKDIpKSkKKyAgICAgICAgaWYgKEMtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgICBMSS5zZXRPcGVyYW5kKDAsIFNJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgICByZXR1cm4gJkxJOworICAgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLy8gSW5zdENvbWJpbmVTdG9yZVRvQ2FzdCAtIEZvbGQgc3RvcmUgViwgKGNhc3QgUCkgLT4gc3RvcmUgKGNhc3QgViksIFAKKy8vLyB3aGVuIHBvc3NpYmxlLiAgVGhpcyBtYWtlcyBpdCBnZW5lcmFsbHkgZWFzeSB0byBkbyBhbGlhcyBhbmFseXNpcyBhbmQvb3IKKy8vLyBTUk9BL21lbTJyZWcgb2YgdGhlIG1lbW9yeSBvYmplY3QuCitzdGF0aWMgSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lU3RvcmVUb0Nhc3QoSW5zdENvbWJpbmVyICZJQywgU3RvcmVJbnN0ICZTSSkgeworICBVc2VyICpDSSA9IGNhc3Q8VXNlcj4oU0kuZ2V0T3BlcmFuZCgxKSk7CisgIFZhbHVlICpDYXN0T3AgPSBDSS0+Z2V0T3BlcmFuZCgwKTsKKworICBjb25zdCBUeXBlICpEZXN0UFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oQ0ktPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgIGNvbnN0IFBvaW50ZXJUeXBlICpTcmNUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihDYXN0T3AtPmdldFR5cGUoKSk7CisgIGlmIChTcmNUeSA9PSAwKSByZXR1cm4gMDsKKyAgCisgIGNvbnN0IFR5cGUgKlNyY1BUeSA9IFNyY1R5LT5nZXRFbGVtZW50VHlwZSgpOworCisgIGlmICghRGVzdFBUeS0+aXNJbnRlZ2VyVHkoKSAmJiAhRGVzdFBUeS0+aXNQb2ludGVyVHkoKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vLyBOZXdHRVBJbmRpY2VzIC0gSWYgU3JjUFR5IGlzIGFuIGFnZ3JlZ2F0ZSB0eXBlLCB3ZSBjYW4gZW1pdCBhICJub29wIGdlcCIKKyAgLy8vIHRvIGl0cyBmaXJzdCBlbGVtZW50LiAgVGhpcyBhbGxvd3MgdXMgdG8gaGFuZGxlIHRoaW5ncyBsaWtlOgorICAvLy8gICBzdG9yZSBpMzIgeHh4LCAoYml0Y2FzdCB7Zm9vKiwgZmxvYXR9KiAlUCB0byBpMzIqKQorICAvLy8gb24gMzItYml0IGhvc3RzLgorICBTbWFsbFZlY3RvcjxWYWx1ZSosIDQ+IE5ld0dFUEluZGljZXM7CisgIAorICAvLyBJZiB0aGUgc291cmNlIGlzIGFuIGFycmF5LCB0aGUgY29kZSBiZWxvdyB3aWxsIG5vdCBzdWNjZWVkLiAgQ2hlY2sgdG8KKyAgLy8gc2VlIGlmIGEgdHJpdmlhbCAnZ2VwIFAsIDAsIDAnIHdpbGwgaGVscCBtYXR0ZXJzLiAgT25seSBkbyB0aGlzIGZvcgorICAvLyBjb25zdGFudHMuCisgIGlmIChTcmNQVHktPmlzQXJyYXlUeSgpIHx8IFNyY1BUeS0+aXNTdHJ1Y3RUeSgpKSB7CisgICAgLy8gSW5kZXggdGhyb3VnaCBwb2ludGVyLgorICAgIENvbnN0YW50ICpaZXJvID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KFNJLmdldENvbnRleHQoKSkpOworICAgIE5ld0dFUEluZGljZXMucHVzaF9iYWNrKFplcm8pOworICAgIAorICAgIHdoaWxlICgxKSB7CisgICAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oU3JjUFR5KSkgeworICAgICAgICBpZiAoIVNUeS0+Z2V0TnVtRWxlbWVudHMoKSkgLyogU3RydWN0IGNhbiBiZSBlbXB0eSB7fSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBOZXdHRVBJbmRpY2VzLnB1c2hfYmFjayhaZXJvKTsKKyAgICAgICAgU3JjUFR5ID0gU1R5LT5nZXRFbGVtZW50VHlwZSgwKTsKKyAgICAgIH0gZWxzZSBpZiAoY29uc3QgQXJyYXlUeXBlICpBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KFNyY1BUeSkpIHsKKyAgICAgICAgTmV3R0VQSW5kaWNlcy5wdXNoX2JhY2soWmVybyk7CisgICAgICAgIFNyY1BUeSA9IEFUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBTcmNUeSA9IFBvaW50ZXJUeXBlOjpnZXQoU3JjUFR5LCBTcmNUeS0+Z2V0QWRkcmVzc1NwYWNlKCkpOworICB9CisKKyAgaWYgKCFTcmNQVHktPmlzSW50ZWdlclR5KCkgJiYgIVNyY1BUeS0+aXNQb2ludGVyVHkoKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIElmIHRoZSBwb2ludGVycyBwb2ludCBpbnRvIGRpZmZlcmVudCBhZGRyZXNzIHNwYWNlcyBvciBpZiB0aGV5IHBvaW50IHRvCisgIC8vIHZhbHVlcyB3aXRoIGRpZmZlcmVudCBzaXplcywgd2UgY2FuJ3QgZG8gdGhlIHRyYW5zZm9ybWF0aW9uLgorICBpZiAoIUlDLmdldFRhcmdldERhdGEoKSB8fAorICAgICAgU3JjVHktPmdldEFkZHJlc3NTcGFjZSgpICE9IAorICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihDSS0+Z2V0VHlwZSgpKS0+Z2V0QWRkcmVzc1NwYWNlKCkgfHwKKyAgICAgIElDLmdldFRhcmdldERhdGEoKS0+Z2V0VHlwZVNpemVJbkJpdHMoU3JjUFR5KSAhPQorICAgICAgSUMuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRUeXBlU2l6ZUluQml0cyhEZXN0UFR5KSkKKyAgICByZXR1cm4gMDsKKworICAvLyBPa2F5LCB3ZSBhcmUgY2FzdGluZyBmcm9tIG9uZSBpbnRlZ2VyIG9yIHBvaW50ZXIgdHlwZSB0byBhbm90aGVyIG9mCisgIC8vIHRoZSBzYW1lIHNpemUuICBJbnN0ZWFkIG9mIGNhc3RpbmcgdGhlIHBvaW50ZXIgYmVmb3JlIAorICAvLyB0aGUgc3RvcmUsIGNhc3QgdGhlIHZhbHVlIHRvIGJlIHN0b3JlZC4KKyAgVmFsdWUgKk5ld0Nhc3Q7CisgIFZhbHVlICpTSU9wMCA9IFNJLmdldE9wZXJhbmQoMCk7CisgIEluc3RydWN0aW9uOjpDYXN0T3BzIG9wY29kZSA9IEluc3RydWN0aW9uOjpCaXRDYXN0OworICBjb25zdCBUeXBlKiBDYXN0U3JjVHkgPSBTSU9wMC0+Z2V0VHlwZSgpOworICBjb25zdCBUeXBlKiBDYXN0RHN0VHkgPSBTcmNQVHk7CisgIGlmIChDYXN0RHN0VHktPmlzUG9pbnRlclR5KCkpIHsKKyAgICBpZiAoQ2FzdFNyY1R5LT5pc0ludGVnZXJUeSgpKQorICAgICAgb3Bjb2RlID0gSW5zdHJ1Y3Rpb246OkludFRvUHRyOworICB9IGVsc2UgaWYgKENhc3REc3RUeS0+aXNJbnRlZ2VyVHkoKSkgeworICAgIGlmIChTSU9wMC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgb3Bjb2RlID0gSW5zdHJ1Y3Rpb246OlB0clRvSW50OworICB9CisgIAorICAvLyBTSU9wMCBpcyBhIHBvaW50ZXIgdG8gYWdncmVnYXRlIGFuZCB0aGlzIGlzIGEgc3RvcmUgdG8gdGhlIGZpcnN0IGZpZWxkLAorICAvLyBlbWl0IGEgR0VQIHRvIGluZGV4IGludG8gaXRzIGZpcnN0IGZpZWxkLgorICBpZiAoIU5ld0dFUEluZGljZXMuZW1wdHkoKSkKKyAgICBDYXN0T3AgPSBJQy5CdWlsZGVyLT5DcmVhdGVJbkJvdW5kc0dFUChDYXN0T3AsIE5ld0dFUEluZGljZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdHRVBJbmRpY2VzLmVuZCgpKTsKKyAgCisgIE5ld0Nhc3QgPSBJQy5CdWlsZGVyLT5DcmVhdGVDYXN0KG9wY29kZSwgU0lPcDAsIENhc3REc3RUeSk7CisgIHJldHVybiBuZXcgU3RvcmVJbnN0KE5ld0Nhc3QsIENhc3RPcCk7Cit9CisKKy8vLyBlcXVpdmFsZW50QWRkcmVzc1ZhbHVlcyAtIFRlc3QgaWYgQSBhbmQgQiB3aWxsIG9idmlvdXNseSBoYXZlIHRoZSBzYW1lCisvLy8gdmFsdWUuIFRoaXMgaW5jbHVkZXMgcmVjb2duaXppbmcgdGhhdCAldDAgYW5kICV0MSB3aWxsIGhhdmUgdGhlIHNhbWUKKy8vLyB2YWx1ZSBpbiBjb2RlIGxpa2UgdGhpczoKKy8vLyAgICV0MCA9IGdldGVsZW1lbnRwdHIgXEBhLCAwLCAzCisvLy8gICBzdG9yZSBpMzIgMCwgaTMyKiAldDAKKy8vLyAgICV0MSA9IGdldGVsZW1lbnRwdHIgXEBhLCAwLCAzCisvLy8gICAldDIgPSBsb2FkIGkzMiogJXQxCisvLy8KK3N0YXRpYyBib29sIGVxdWl2YWxlbnRBZGRyZXNzVmFsdWVzKFZhbHVlICpBLCBWYWx1ZSAqQikgeworICAvLyBUZXN0IGlmIHRoZSB2YWx1ZXMgYXJlIHRyaXZpYWxseSBlcXVpdmFsZW50LgorICBpZiAoQSA9PSBCKSByZXR1cm4gdHJ1ZTsKKyAgCisgIC8vIFRlc3QgaWYgdGhlIHZhbHVlcyBjb21lIGZvcm0gaWRlbnRpY2FsIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zLgorICAvLyBUaGlzIHVzZXMgaXNJZGVudGljYWxUb1doZW5EZWZpbmVkIGluc3RlYWQgb2YgaXNJZGVudGljYWxUbyBiZWNhdXNlCisgIC8vIGl0cyBvbmx5IHVzZWQgdG8gY29tcGFyZSB0d28gdXNlcyB3aXRoaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2ssIHdoaWNoCisgIC8vIG1lYW5zIHRoYXQgdGhleSdsbCBhbHdheXMgZWl0aGVyIGhhdmUgdGhlIHNhbWUgdmFsdWUgb3Igb25lIG9mIHRoZW0KKyAgLy8gd2lsbCBoYXZlIGFuIHVuZGVmaW5lZCB2YWx1ZS4KKyAgaWYgKGlzYTxCaW5hcnlPcGVyYXRvcj4oQSkgfHwKKyAgICAgIGlzYTxDYXN0SW5zdD4oQSkgfHwKKyAgICAgIGlzYTxQSElOb2RlPihBKSB8fAorICAgICAgaXNhPEdldEVsZW1lbnRQdHJJbnN0PihBKSkKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkJJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KEIpKQorICAgICAgaWYgKGNhc3Q8SW5zdHJ1Y3Rpb24+KEEpLT5pc0lkZW50aWNhbFRvV2hlbkRlZmluZWQoQkkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIC8vIE90aGVyd2lzZSB0aGV5IG1heSBub3QgYmUgZXF1aXZhbGVudC4KKyAgcmV0dXJuIGZhbHNlOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdFN0b3JlSW5zdChTdG9yZUluc3QgJlNJKSB7CisgIFZhbHVlICpWYWwgPSBTSS5nZXRPcGVyYW5kKDApOworICBWYWx1ZSAqUHRyID0gU0kuZ2V0T3BlcmFuZCgxKTsKKworICAvLyBJZiB0aGUgUkhTIGlzIGFuIGFsbG9jYSB3aXRoIGEgc2luZ2xlIHVzZSwgemFwaWZ5IHRoZSBzdG9yZSwgbWFraW5nIHRoZQorICAvLyBhbGxvY2EgZGVhZC4KKyAgLy8gSWYgdGhlIFJIUyBpcyBhbiBhbGxvY2Egd2l0aCBhIHR3byB1c2VzLCB0aGUgb3RoZXIgb25lIGJlaW5nIGEgCisgIC8vIGxsdm0uZGJnLmRlY2xhcmUsIHphcGlmeSB0aGUgc3RvcmUgYW5kIHRoZSBkZWNsYXJlLCBtYWtpbmcgdGhlCisgIC8vIGFsbG9jYSBkZWFkLiAgV2UgbXVzdCBkbyB0aGlzIHRvIHByZXZlbnQgZGVjbGFyZXMgZnJvbSBhZmZlY3RpbmcKKyAgLy8gY29kZWdlbi4KKyAgaWYgKCFTSS5pc1ZvbGF0aWxlKCkpIHsKKyAgICBpZiAoUHRyLT5oYXNPbmVVc2UoKSkgeworICAgICAgaWYgKGlzYTxBbGxvY2FJbnN0PihQdHIpKSAKKyAgICAgICAgcmV0dXJuIEVyYXNlSW5zdEZyb21GdW5jdGlvbihTSSk7CisgICAgICBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUCA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihQdHIpKSB7CisgICAgICAgIGlmIChpc2E8QWxsb2NhSW5zdD4oR0VQLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgICAgIGlmIChHRVAtPmdldE9wZXJhbmQoMCktPmhhc09uZVVzZSgpKQorICAgICAgICAgICAgcmV0dXJuIEVyYXNlSW5zdEZyb21GdW5jdGlvbihTSSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBBdHRlbXB0IHRvIGltcHJvdmUgdGhlIGFsaWdubWVudC4KKyAgaWYgKFREKSB7CisgICAgdW5zaWduZWQgS25vd25BbGlnbiA9CisgICAgICBHZXRPckVuZm9yY2VLbm93bkFsaWdubWVudChQdHIsIFRELT5nZXRQcmVmVHlwZUFsaWdubWVudChWYWwtPmdldFR5cGUoKSkpOworICAgIHVuc2lnbmVkIFN0b3JlQWxpZ24gPSBTSS5nZXRBbGlnbm1lbnQoKTsKKyAgICB1bnNpZ25lZCBFZmZlY3RpdmVTdG9yZUFsaWduID0gU3RvcmVBbGlnbiAhPSAwID8gU3RvcmVBbGlnbiA6CisgICAgICBURC0+Z2V0QUJJVHlwZUFsaWdubWVudChWYWwtPmdldFR5cGUoKSk7CisKKyAgICBpZiAoS25vd25BbGlnbiA+IEVmZmVjdGl2ZVN0b3JlQWxpZ24pCisgICAgICBTSS5zZXRBbGlnbm1lbnQoS25vd25BbGlnbik7CisgICAgZWxzZSBpZiAoU3RvcmVBbGlnbiA9PSAwKQorICAgICAgU0kuc2V0QWxpZ25tZW50KEVmZmVjdGl2ZVN0b3JlQWxpZ24pOworICB9CisKKyAgLy8gRG8gcmVhbGx5IHNpbXBsZSBEU0UsIHRvIGNhdGNoIGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBzZXZlcmFsIGNvbnNlY3V0aXZlCisgIC8vIHN0b3JlcyB0byB0aGUgc2FtZSBsb2NhdGlvbiwgc2VwYXJhdGVkIGJ5IGEgZmV3IGFyaXRobWV0aWMgb3BlcmF0aW9ucy4gVGhpcworICAvLyBzaXR1YXRpb24gb2Z0ZW4gb2NjdXJzIHdpdGggYml0ZmllbGQgYWNjZXNzZXMuCisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9ICZTSTsKKyAgZm9yICh1bnNpZ25lZCBTY2FuSW5zdHMgPSA2OyBCQkkgIT0gU0kuZ2V0UGFyZW50KCktPmJlZ2luKCkgJiYgU2Nhbkluc3RzOworICAgICAgIC0tU2Nhbkluc3RzKSB7CisgICAgLS1CQkk7CisgICAgLy8gRG9uJ3QgY291bnQgZGVidWcgaW5mbyBkaXJlY3RpdmVzLCBsZXN0IHRoZXkgYWZmZWN0IGNvZGVnZW4sCisgICAgLy8gYW5kIHdlIHNraXAgcG9pbnRlci10by1wb2ludGVyIGJpdGNhc3RzLCB3aGljaCBhcmUgTk9Qcy4KKyAgICBpZiAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEJCSSkgfHwKKyAgICAgICAgKGlzYTxCaXRDYXN0SW5zdD4oQkJJKSAmJiBCQkktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkpIHsKKyAgICAgIFNjYW5JbnN0cysrOworICAgICAgY29udGludWU7CisgICAgfSAgICAKKyAgICAKKyAgICBpZiAoU3RvcmVJbnN0ICpQcmV2U0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEJCSSkpIHsKKyAgICAgIC8vIFByZXYgc3RvcmUgaXNuJ3Qgdm9sYXRpbGUsIGFuZCBzdG9yZXMgdG8gdGhlIHNhbWUgbG9jYXRpb24/CisgICAgICBpZiAoIVByZXZTSS0+aXNWb2xhdGlsZSgpICYmZXF1aXZhbGVudEFkZHJlc3NWYWx1ZXMoUHJldlNJLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJLmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgICsrTnVtRGVhZFN0b3JlOworICAgICAgICArK0JCSTsKKyAgICAgICAgRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKCpQcmV2U0kpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGEgbG9hZCwgd2UgaGF2ZSB0byBzdG9wLiAgSG93ZXZlciwgaWYgdGhlIGxvYWRlZCB2YWx1ZSBpcyBmcm9tCisgICAgLy8gdGhlIHBvaW50ZXIgd2UncmUgbG9hZGluZyBhbmQgaXMgcHJvZHVjaW5nIHRoZSBwb2ludGVyIHdlJ3JlIHN0b3JpbmcsCisgICAgLy8gdGhlbiAqdGhpcyogc3RvcmUgaXMgZGVhZCAoWCA9IGxvYWQgUDsgc3RvcmUgWCAtPiBQKS4KKyAgICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KEJCSSkpIHsKKyAgICAgIGlmIChMSSA9PSBWYWwgJiYgZXF1aXZhbGVudEFkZHJlc3NWYWx1ZXMoTEktPmdldE9wZXJhbmQoMCksIFB0cikgJiYKKyAgICAgICAgICAhU0kuaXNWb2xhdGlsZSgpKQorICAgICAgICByZXR1cm4gRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKFNJKTsKKyAgICAgIAorICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgbG9hZCBmcm9tIHNvbWUgb3RoZXIgbG9jYXRpb24uICBTdG9yZXMgYmVmb3JlIGl0CisgICAgICAvLyBtYXkgbm90IGJlIGRlYWQuCisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgLy8gRG9uJ3Qgc2tpcCBvdmVyIGxvYWRzIG9yIHRoaW5ncyB0aGF0IGNhbiBtb2RpZnkgbWVtb3J5LgorICAgIGlmIChCQkktPm1heVdyaXRlVG9NZW1vcnkoKSB8fCBCQkktPm1heVJlYWRGcm9tTWVtb3J5KCkpCisgICAgICBicmVhazsKKyAgfQorICAKKyAgCisgIGlmIChTSS5pc1ZvbGF0aWxlKCkpIHJldHVybiAwOyAgLy8gRG9uJ3QgaGFjayB2b2xhdGlsZSBzdG9yZXMuCisKKyAgLy8gc3RvcmUgWCwgbnVsbCAgICAtPiB0dXJucyBpbnRvICd1bnJlYWNoYWJsZScgaW4gU2ltcGxpZnlDRkcKKyAgaWYgKGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihQdHIpICYmIFNJLmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSA9PSAwKSB7CisgICAgaWYgKCFpc2E8VW5kZWZWYWx1ZT4oVmFsKSkgeworICAgICAgU0kuc2V0T3BlcmFuZCgwLCBVbmRlZlZhbHVlOjpnZXQoVmFsLT5nZXRUeXBlKCkpKTsKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqVSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWYWwpKQorICAgICAgICBXb3JrbGlzdC5BZGQoVSk7ICAvLyBEcm9wcGVkIGEgdXNlLgorICAgIH0KKyAgICByZXR1cm4gMDsgIC8vIERvIG5vdCBtb2RpZnkgdGhlc2UhCisgIH0KKworICAvLyBzdG9yZSB1bmRlZiwgUHRyIC0+IG5vb3AKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihWYWwpKQorICAgIHJldHVybiBFcmFzZUluc3RGcm9tRnVuY3Rpb24oU0kpOworCisgIC8vIElmIHRoZSBwb2ludGVyIGRlc3RpbmF0aW9uIGlzIGEgY2FzdCwgc2VlIGlmIHdlIGNhbiBmb2xkIHRoZSBjYXN0IGludG8gdGhlCisgIC8vIHNvdXJjZSBpbnN0ZWFkLgorICBpZiAoaXNhPENhc3RJbnN0PihQdHIpKQorICAgIGlmIChJbnN0cnVjdGlvbiAqUmVzID0gSW5zdENvbWJpbmVTdG9yZVRvQ2FzdCgqdGhpcywgU0kpKQorICAgICAgcmV0dXJuIFJlczsKKyAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFB0cikpCisgICAgaWYgKENFLT5pc0Nhc3QoKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqUmVzID0gSW5zdENvbWJpbmVTdG9yZVRvQ2FzdCgqdGhpcywgU0kpKQorICAgICAgICByZXR1cm4gUmVzOworCisgIAorICAvLyBJZiB0aGlzIHN0b3JlIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBiYXNpYyBibG9jayAocG9zc2libHkKKyAgLy8gZXhjZXB0aW5nIGRlYnVnIGluZm8gaW5zdHJ1Y3Rpb25zKSwgYW5kIGlmIHRoZSBibG9jayBlbmRzIHdpdGggYW4KKyAgLy8gdW5jb25kaXRpb25hbCBicmFuY2gsIHRyeSB0byBtb3ZlIGl0IHRvIHRoZSBzdWNjZXNzb3IgYmxvY2suCisgIEJCSSA9ICZTSTsgCisgIGRvIHsKKyAgICArK0JCSTsKKyAgfSB3aGlsZSAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEJCSSkgfHwKKyAgICAgICAgICAgKGlzYTxCaXRDYXN0SW5zdD4oQkJJKSAmJiBCQkktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkpOworICBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihCQkkpKQorICAgIGlmIChCSS0+aXNVbmNvbmRpdGlvbmFsKCkpCisgICAgICBpZiAoU2ltcGxpZnlTdG9yZUF0RW5kT2ZCbG9jayhTSSkpCisgICAgICAgIHJldHVybiAwOyAgLy8geGZvcm0gZG9uZSEKKyAgCisgIHJldHVybiAwOworfQorCisvLy8gU2ltcGxpZnlTdG9yZUF0RW5kT2ZCbG9jayAtIFR1cm4gdGhpbmdzIGxpa2U6CisvLy8gICBpZiAoKSB7ICpQID0gdjE7IH0gZWxzZSB7ICpQID0gdjIgfQorLy8vIGludG8gYSBwaGkgbm9kZSB3aXRoIGEgc3RvcmUgaW4gdGhlIHN1Y2Nlc3Nvci4KKy8vLworLy8vIFNpbXBsaWZ5IHRoaW5ncyBsaWtlOgorLy8vICAgKlAgPSB2MTsgaWYgKCkgeyAqUCA9IHYyOyB9CisvLy8gaW50byBhIHBoaSBub2RlIHdpdGggYSBzdG9yZSBpbiB0aGUgc3VjY2Vzc29yLgorLy8vCitib29sIEluc3RDb21iaW5lcjo6U2ltcGxpZnlTdG9yZUF0RW5kT2ZCbG9jayhTdG9yZUluc3QgJlNJKSB7CisgIEJhc2ljQmxvY2sgKlN0b3JlQkIgPSBTSS5nZXRQYXJlbnQoKTsKKyAgCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgc3VjY2Vzc29yIGJsb2NrIGhhcyBleGFjdGx5IHR3byBpbmNvbWluZyBlZGdlcy4gIElmCisgIC8vIHNvLCBzZWUgaWYgdGhlIG90aGVyIHByZWRlY2Vzc29yIGNvbnRhaW5zIGEgc3RvcmUgdG8gdGhlIHNhbWUgbG9jYXRpb24uCisgIC8vIGlmIHNvLCBpbnNlcnQgYSBQSEkgbm9kZSAoaWYgbmVlZGVkKSBhbmQgbW92ZSB0aGUgc3RvcmVzIGRvd24uCisgIEJhc2ljQmxvY2sgKkRlc3RCQiA9IFN0b3JlQkItPmdldFRlcm1pbmF0b3IoKS0+Z2V0U3VjY2Vzc29yKDApOworICAKKyAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgRGVzdCBoYXMgZXhhY3RseSB0d28gcHJlZGVjZXNzb3JzIGFuZCwgaWYgc28sIGNvbXB1dGUKKyAgLy8gdGhlIG90aGVyIHByZWRlY2Vzc29yLgorICBwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihEZXN0QkIpOworICBCYXNpY0Jsb2NrICpQID0gKlBJOworICBCYXNpY0Jsb2NrICpPdGhlckJCID0gMDsKKworICBpZiAoUCAhPSBTdG9yZUJCKQorICAgIE90aGVyQkIgPSBQOworCisgIGlmICgrK1BJID09IHByZWRfZW5kKERlc3RCQikpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgUCA9ICpQSTsKKyAgaWYgKFAgIT0gU3RvcmVCQikgeworICAgIGlmIChPdGhlckJCKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIE90aGVyQkIgPSBQOworICB9CisgIGlmICgrK1BJICE9IHByZWRfZW5kKERlc3RCQikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEJhaWwgb3V0IGlmIGFsbCB0aGUgcmVsZXZhbnQgYmxvY2tzIGFyZW4ndCBkaXN0aW5jdCAodGhpcyBjYW4gaGFwcGVuLAorICAvLyBmb3IgZXhhbXBsZSwgaWYgU0kgaXMgaW4gYW4gaW5maW5pdGUgbG9vcCkKKyAgaWYgKFN0b3JlQkIgPT0gRGVzdEJCIHx8IE90aGVyQkIgPT0gRGVzdEJCKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBWZXJpZnkgdGhhdCB0aGUgb3RoZXIgYmxvY2sgZW5kcyBpbiBhIGJyYW5jaCBhbmQgaXMgbm90IG90aGVyd2lzZSBlbXB0eS4KKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gT3RoZXJCQi0+Z2V0VGVybWluYXRvcigpOworICBCcmFuY2hJbnN0ICpPdGhlckJyID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oQkJJKTsKKyAgaWYgKCFPdGhlckJyIHx8IEJCSSA9PSBPdGhlckJCLT5iZWdpbigpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIElmIHRoZSBvdGhlciBibG9jayBlbmRzIGluIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLCBjaGVjayBmb3IgdGhlICdpZiB0aGVuCisgIC8vIGVsc2UnIGNhc2UuICB0aGVyZSBpcyBhbiBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGJyYW5jaC4KKyAgU3RvcmVJbnN0ICpPdGhlclN0b3JlID0gMDsKKyAgaWYgKE90aGVyQnItPmlzVW5jb25kaXRpb25hbCgpKSB7CisgICAgLS1CQkk7CisgICAgLy8gU2tpcCBvdmVyIGRlYnVnZ2luZyBpbmZvLgorICAgIHdoaWxlIChJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoQkJJKSB8fAorICAgICAgICAgICAoaXNhPEJpdENhc3RJbnN0PihCQkkpICYmIEJCSS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSkgeworICAgICAgaWYgKEJCST09T3RoZXJCQi0+YmVnaW4oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgLS1CQkk7CisgICAgfQorICAgIC8vIElmIHRoaXMgaXNuJ3QgYSBzdG9yZSwgaXNuJ3QgYSBzdG9yZSB0byB0aGUgc2FtZSBsb2NhdGlvbiwgb3IgaWYgdGhlCisgICAgLy8gYWxpZ25tZW50cyBkaWZmZXIsIGJhaWwgb3V0LgorICAgIE90aGVyU3RvcmUgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEJCSSk7CisgICAgaWYgKCFPdGhlclN0b3JlIHx8IE90aGVyU3RvcmUtPmdldE9wZXJhbmQoMSkgIT0gU0kuZ2V0T3BlcmFuZCgxKSB8fAorICAgICAgICBPdGhlclN0b3JlLT5nZXRBbGlnbm1lbnQoKSAhPSBTSS5nZXRBbGlnbm1lbnQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPdGhlcndpc2UsIHRoZSBvdGhlciBibG9jayBlbmRlZCB3aXRoIGEgY29uZGl0aW9uYWwgYnJhbmNoLiBJZiBvbmUgb2YgdGhlCisgICAgLy8gZGVzdGluYXRpb25zIGlzIFN0b3JlQkIsIHRoZW4gd2UgaGF2ZSB0aGUgaWYvdGhlbiBjYXNlLgorICAgIGlmIChPdGhlckJyLT5nZXRTdWNjZXNzb3IoMCkgIT0gU3RvcmVCQiAmJiAKKyAgICAgICAgT3RoZXJCci0+Z2V0U3VjY2Vzc29yKDEpICE9IFN0b3JlQkIpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgLy8gT2theSwgd2Uga25vdyB0aGF0IE90aGVyQnIgbm93IGdvZXMgdG8gRGVzdCBhbmQgU3RvcmVCQiwgc28gdGhpcyBpcyBhbgorICAgIC8vIGlmL3RoZW4gdHJpYW5nbGUuICBTZWUgaWYgdGhlcmUgaXMgYSBzdG9yZSB0byB0aGUgc2FtZSBwdHIgYXMgU0kgdGhhdAorICAgIC8vIGxpdmVzIGluIE90aGVyQkIuCisgICAgZm9yICg7OyAtLUJCSSkgeworICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGZpbmQgdGhlIG1hdGNoaW5nIHN0b3JlLgorICAgICAgaWYgKChPdGhlclN0b3JlID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihCQkkpKSkgeworICAgICAgICBpZiAoT3RoZXJTdG9yZS0+Z2V0T3BlcmFuZCgxKSAhPSBTSS5nZXRPcGVyYW5kKDEpIHx8CisgICAgICAgICAgICBPdGhlclN0b3JlLT5nZXRBbGlnbm1lbnQoKSAhPSBTSS5nZXRBbGlnbm1lbnQoKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gSWYgd2UgZmluZCBzb21ldGhpbmcgdGhhdCBtYXkgYmUgdXNpbmcgb3Igb3ZlcndyaXRpbmcgdGhlIHN0b3JlZAorICAgICAgLy8gdmFsdWUsIG9yIGlmIHdlIHJ1biBvdXQgb2YgaW5zdHJ1Y3Rpb25zLCB3ZSBjYW4ndCBkbyB0aGUgeGZvcm0uCisgICAgICBpZiAoQkJJLT5tYXlSZWFkRnJvbU1lbW9yeSgpIHx8IEJCSS0+bWF5V3JpdGVUb01lbW9yeSgpIHx8CisgICAgICAgICAgQkJJID09IE90aGVyQkItPmJlZ2luKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgLy8gSW4gb3JkZXIgdG8gZWxpbWluYXRlIHRoZSBzdG9yZSBpbiBPdGhlckJyLCB3ZSBoYXZlIHRvCisgICAgLy8gbWFrZSBzdXJlIG5vdGhpbmcgcmVhZHMgb3Igb3ZlcndyaXRlcyB0aGUgc3RvcmVkIHZhbHVlIGluCisgICAgLy8gU3RvcmVCQi4KKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBTdG9yZUJCLT5iZWdpbigpOyAmKkkgIT0gJlNJOyArK0kpIHsKKyAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCByZWFsbHkgYmUgQUEgZHJpdmVuLgorICAgICAgaWYgKEktPm1heVJlYWRGcm9tTWVtb3J5KCkgfHwgSS0+bWF5V3JpdGVUb01lbW9yeSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIAorICAvLyBJbnNlcnQgYSBQSEkgbm9kZSBub3cgaWYgd2UgbmVlZCBpdC4KKyAgVmFsdWUgKk1lcmdlZFZhbCA9IE90aGVyU3RvcmUtPmdldE9wZXJhbmQoMCk7CisgIGlmIChNZXJnZWRWYWwgIT0gU0kuZ2V0T3BlcmFuZCgwKSkgeworICAgIFBISU5vZGUgKlBOID0gUEhJTm9kZTo6Q3JlYXRlKE1lcmdlZFZhbC0+Z2V0VHlwZSgpKTsKKyAgICBQTi0+cmVzZXJ2ZU9wZXJhbmRTcGFjZSgyKTsKKyAgICBQTi0+YWRkSW5jb21pbmcoU0kuZ2V0T3BlcmFuZCgwKSwgU0kuZ2V0UGFyZW50KCkpOworICAgIFBOLT5hZGRJbmNvbWluZyhPdGhlclN0b3JlLT5nZXRPcGVyYW5kKDApLCBPdGhlckJCKTsKKyAgICBNZXJnZWRWYWwgPSBJbnNlcnROZXdJbnN0QmVmb3JlKFBOLCBEZXN0QkItPmZyb250KCkpOworICB9CisgIAorICAvLyBBZHZhbmNlIHRvIGEgcGxhY2Ugd2hlcmUgaXQgaXMgc2FmZSB0byBpbnNlcnQgdGhlIG5ldyBzdG9yZSBhbmQKKyAgLy8gaW5zZXJ0IGl0LgorICBCQkkgPSBEZXN0QkItPmdldEZpcnN0Tm9uUEhJKCk7CisgIEluc2VydE5ld0luc3RCZWZvcmUobmV3IFN0b3JlSW5zdChNZXJnZWRWYWwsIFNJLmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlclN0b3JlLT5pc1ZvbGF0aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSS5nZXRBbGlnbm1lbnQoKSksICpCQkkpOworICAKKyAgLy8gTnVrZSB0aGUgb2xkIHN0b3Jlcy4KKyAgRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKFNJKTsKKyAgRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKCpPdGhlclN0b3JlKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZU11bERpdlJlbS5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZU11bERpdlJlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxMTFmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lTXVsRGl2UmVtLmNwcApAQCAtMCwwICsxLDY5MyBAQAorLy89PT0tIEluc3RDb21iaW5lTXVsRGl2UmVtLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdmlzaXQgZnVuY3Rpb25zIGZvciBtdWwsIGZtdWwsIHNkaXYsIHVkaXYsIGZkaXYsCisvLyBzcmVtLCB1cmVtLCBmcmVtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJJbnN0Q29tYmluZS5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXR0ZXJuTWF0Y2guaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIFBhdHRlcm5NYXRjaDsKKworLy8vIFN1Yk9uZSAtIFN1YnRyYWN0IG9uZSBmcm9tIGEgQ29uc3RhbnRJbnQuCitzdGF0aWMgQ29uc3RhbnQgKlN1Yk9uZShDb25zdGFudEludCAqQykgeworICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChDLT5nZXRDb250ZXh0KCksIEMtPmdldFZhbHVlKCktMSk7Cit9CisKKy8vLyBNdWx0aXBseU92ZXJmbG93cyAtIFRydWUgaWYgdGhlIG11bHRpcGx5IGNhbiBub3QgYmUgZXhwcmVzc2VkIGluIGFuIGludAorLy8vIHRoaXMgc2l6ZS4KK3N0YXRpYyBib29sIE11bHRpcGx5T3ZlcmZsb3dzKENvbnN0YW50SW50ICpDMSwgQ29uc3RhbnRJbnQgKkMyLCBib29sIHNpZ24pIHsKKyAgdWludDMyX3QgVyA9IEMxLT5nZXRCaXRXaWR0aCgpOworICBBUEludCBMSFNFeHQgPSBDMS0+Z2V0VmFsdWUoKSwgUkhTRXh0ID0gQzItPmdldFZhbHVlKCk7CisgIGlmIChzaWduKSB7CisgICAgTEhTRXh0LnNleHQoVyAqIDIpOworICAgIFJIU0V4dC5zZXh0KFcgKiAyKTsKKyAgfSBlbHNlIHsKKyAgICBMSFNFeHQuemV4dChXICogMik7CisgICAgUkhTRXh0LnpleHQoVyAqIDIpOworICB9CisgIAorICBBUEludCBNdWxFeHQgPSBMSFNFeHQgKiBSSFNFeHQ7CisgIAorICBpZiAoIXNpZ24pCisgICAgcmV0dXJuIE11bEV4dC51Z3QoQVBJbnQ6OmdldExvd0JpdHNTZXQoVyAqIDIsIFcpKTsKKyAgCisgIEFQSW50IE1pbiA9IEFQSW50OjpnZXRTaWduZWRNaW5WYWx1ZShXKS5zZXh0KFcgKiAyKTsKKyAgQVBJbnQgTWF4ID0gQVBJbnQ6OmdldFNpZ25lZE1heFZhbHVlKFcpLnNleHQoVyAqIDIpOworICByZXR1cm4gTXVsRXh0LnNsdChNaW4pIHx8IE11bEV4dC5zZ3QoTWF4KTsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRNdWwoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgYm9vbCBDaGFuZ2VkID0gU2ltcGxpZnlDb21tdXRhdGl2ZShJKTsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICBpZiAoaXNhPFVuZGVmVmFsdWU+KE9wMSkpICAgICAgICAgICAgICAvLyB1bmRlZiAqIFggLT4gMAorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSS5nZXRUeXBlKCkpKTsKKworICAvLyBTaW1wbGlmeSBtdWwgaW5zdHJ1Y3Rpb25zIHdpdGggYSBjb25zdGFudCBSSFMuCisgIGlmIChDb25zdGFudCAqT3AxQyA9IGR5bl9jYXN0PENvbnN0YW50PihPcDEpKSB7CisgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDFDKSkgeworCisgICAgICAvLyAoKFggPDwgQzEpKkMyKSA9PSAoWCAqIChDMiA8PCBDMSkpCisgICAgICBpZiAoQmluYXJ5T3BlcmF0b3IgKlNJID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMCkpCisgICAgICAgIGlmIChTSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNobCkKKyAgICAgICAgICBpZiAoQ29uc3RhbnQgKlNoT3AgPSBkeW5fY2FzdDxDb25zdGFudD4oU0ktPmdldE9wZXJhbmQoMSkpKQorICAgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVNdWwoU0ktPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRTaGwoQ0ksIFNoT3ApKTsKKworICAgICAgaWYgKENJLT5pc1plcm8oKSkKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgT3AxQyk7ICAvLyBYICogMCAgPT0gMAorICAgICAgaWYgKENJLT5lcXVhbHNJbnQoMSkpICAgICAgICAgICAgICAgICAgLy8gWCAqIDEgID09IFgKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgT3AwKTsKKyAgICAgIGlmIChDSS0+aXNBbGxPbmVzVmFsdWUoKSkgICAgICAgICAgICAgIC8vIFggKiAtMSA9PSAwIC0gWAorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5lZyhPcDApOworCisgICAgICBjb25zdCBBUEludCYgVmFsID0gY2FzdDxDb25zdGFudEludD4oQ0kpLT5nZXRWYWx1ZSgpOworICAgICAgaWYgKFZhbC5pc1Bvd2VyT2YyKCkpIHsgICAgICAgICAgLy8gUmVwbGFjZSBYKigyXkMpIHdpdGggWCA8PCBDCisgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKE9wMCwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChPcDAtPmdldFR5cGUoKSwgVmFsLmxvZ0Jhc2UyKCkpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKE9wMUMtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICBpZiAoT3AxQy0+aXNOdWxsVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgT3AxQyk7CisKKyAgICAgIGlmIChDb25zdGFudFZlY3RvciAqT3AxViA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihPcDFDKSkgeworICAgICAgICBpZiAoT3AxVi0+aXNBbGxPbmVzVmFsdWUoKSkgICAgICAgICAgICAgIC8vIFggKiAtMSA9PSAwIC0gWAorICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTmVnKE9wMCk7CisKKyAgICAgICAgLy8gQXMgYWJvdmUsIHZlY3RvciBYKnNwbGF0KDEuMCkgLT4gWCBpbiBhbGwgZGVmaW5lZCBjYXNlcy4KKyAgICAgICAgaWYgKENvbnN0YW50ICpTcGxhdCA9IE9wMVYtPmdldFNwbGF0VmFsdWUoKSkgeworICAgICAgICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oU3BsYXQpKQorICAgICAgICAgICAgaWYgKENJLT5lcXVhbHNJbnQoMSkpCisgICAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKEJpbmFyeU9wZXJhdG9yICpPcDBJID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMCkpCisgICAgICBpZiAoT3AwSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFkZCAmJiBPcDBJLT5oYXNPbmVVc2UoKSAmJgorICAgICAgICAgIGlzYTxDb25zdGFudEludD4oT3AwSS0+Z2V0T3BlcmFuZCgxKSkgJiYgaXNhPENvbnN0YW50SW50PihPcDFDKSkgeworICAgICAgICAvLyBDYW5vbmljYWxpemUgKFgrQzEpKkMyIC0+IFgqQzIrQzEqQzIuCisgICAgICAgIFZhbHVlICpBZGQgPSBCdWlsZGVyLT5DcmVhdGVNdWwoT3AwSS0+Z2V0T3BlcmFuZCgwKSwgT3AxQyk7CisgICAgICAgIFZhbHVlICpDMUMyID0gQnVpbGRlci0+Q3JlYXRlTXVsKE9wMUMsIE9wMEktPmdldE9wZXJhbmQoMSkpOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChBZGQsIEMxQzIpOworICAgICAgICAKKyAgICAgIH0KKworICAgIC8vIFRyeSB0byBmb2xkIGNvbnN0YW50IG11bCBpbnRvIHNlbGVjdCBhcmd1bWVudHMuCisgICAgaWYgKFNlbGVjdEluc3QgKlNJID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oT3AwKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqUiA9IEZvbGRPcEludG9TZWxlY3QoSSwgU0kpKQorICAgICAgICByZXR1cm4gUjsKKworICAgIGlmIChpc2E8UEhJTm9kZT4oT3AwKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEkpKQorICAgICAgICByZXR1cm4gTlY7CisgIH0KKworICBpZiAoVmFsdWUgKk9wMHYgPSBkeW5fY2FzdE5lZ1ZhbChPcDApKSAgICAgLy8gLVggKiAtWSA9IFgqWQorICAgIGlmIChWYWx1ZSAqT3AxdiA9IGR5bl9jYXN0TmVnVmFsKE9wMSkpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU11bChPcDB2LCBPcDF2KTsKKworICAvLyAoWCAvIFkpICogIFkgPSBYIC0gKFggJSBZKQorICAvLyAoWCAvIFkpICogLVkgPSAoWCAlIFkpIC0gWAorICB7CisgICAgVmFsdWUgKk9wMUMgPSBPcDE7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMCk7CisgICAgaWYgKCFCTyB8fAorICAgICAgICAoQk8tPmdldE9wY29kZSgpICE9IEluc3RydWN0aW9uOjpVRGl2ICYmIAorICAgICAgICAgQk8tPmdldE9wY29kZSgpICE9IEluc3RydWN0aW9uOjpTRGl2KSkgeworICAgICAgT3AxQyA9IE9wMDsKKyAgICAgIEJPID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMSk7CisgICAgfQorICAgIFZhbHVlICpOZWcgPSBkeW5fY2FzdE5lZ1ZhbChPcDFDKTsKKyAgICBpZiAoQk8gJiYgQk8tPmhhc09uZVVzZSgpICYmCisgICAgICAgIChCTy0+Z2V0T3BlcmFuZCgxKSA9PSBPcDFDIHx8IEJPLT5nZXRPcGVyYW5kKDEpID09IE5lZykgJiYKKyAgICAgICAgKEJPLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6VURpdiB8fAorICAgICAgICAgQk8tPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTRGl2KSkgeworICAgICAgVmFsdWUgKk9wMEJPID0gQk8tPmdldE9wZXJhbmQoMCksICpPcDFCTyA9IEJPLT5nZXRPcGVyYW5kKDEpOworCisgICAgICAvLyBJZiB0aGUgZGl2aXNpb24gaXMgZXhhY3QsIFggJSBZIGlzIHplcm8uCisgICAgICBpZiAoU0Rpdk9wZXJhdG9yICpTRGl2ID0gZHluX2Nhc3Q8U0Rpdk9wZXJhdG9yPihCTykpCisgICAgICAgIGlmIChTRGl2LT5pc0V4YWN0KCkpIHsKKyAgICAgICAgICBpZiAoT3AxQk8gPT0gT3AxQykKKyAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMEJPKTsKKyAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5lZyhPcDBCTyk7CisgICAgICAgIH0KKworICAgICAgVmFsdWUgKlJlbTsKKyAgICAgIGlmIChCTy0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlVEaXYpCisgICAgICAgIFJlbSA9IEJ1aWxkZXItPkNyZWF0ZVVSZW0oT3AwQk8sIE9wMUJPKTsKKyAgICAgIGVsc2UKKyAgICAgICAgUmVtID0gQnVpbGRlci0+Q3JlYXRlU1JlbShPcDBCTywgT3AxQk8pOworICAgICAgUmVtLT50YWtlTmFtZShCTyk7CisKKyAgICAgIGlmIChPcDFCTyA9PSBPcDFDKQorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVN1YihPcDBCTywgUmVtKTsKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKFJlbSwgT3AwQk8pOworICAgIH0KKyAgfQorCisgIC8vLyBpMSBtdWwgLT4gaTEgYW5kLgorICBpZiAoSS5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDEpKQorICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKE9wMCwgT3AxKTsKKworICAvLyBYKigxIDw8IFkpIC0tPiBYIDw8IFkKKyAgLy8gKDEgPDwgWSkqWCAtLT4gWCA8PCBZCisgIHsKKyAgICBWYWx1ZSAqWTsKKyAgICBpZiAobWF0Y2goT3AwLCBtX1NobChtX09uZSgpLCBtX1ZhbHVlKFkpKSkpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNobChPcDEsIFkpOworICAgIGlmIChtYXRjaChPcDEsIG1fU2hsKG1fT25lKCksIG1fVmFsdWUoWSkpKSkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKE9wMCwgWSk7CisgIH0KKyAgCisgIC8vIElmIG9uZSBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIG11bHRpcGx5IGlzIGEgY2FzdCBmcm9tIGEgYm9vbGVhbiB2YWx1ZSwgdGhlbgorICAvLyB3ZSBrbm93IHRoZSBib29sIGlzIGVpdGhlciB6ZXJvIG9yIG9uZSwgc28gdGhpcyBpcyBhICdtYXNraW5nJyBtdWx0aXBseS4KKyAgLy8gICBYICogWSAod2hlcmUgWSBpcyAwIG9yIDEpIC0+IFggJiAoMC1ZKQorICBpZiAoIUkuZ2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICAvLyAtMiBpcyAiLTEgPDwgMSIgc28gaXQgaXMgYWxsIGJpdHMgc2V0IGV4Y2VwdCB0aGUgbG93IG9uZS4KKyAgICBBUEludCBOZWdhdGl2ZTIoSS5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSwgKHVpbnQ2NF90KS0yLCB0cnVlKTsKKyAgICAKKyAgICBWYWx1ZSAqQm9vbENhc3QgPSAwLCAqT3RoZXJPcCA9IDA7CisgICAgaWYgKE1hc2tlZFZhbHVlSXNaZXJvKE9wMCwgTmVnYXRpdmUyKSkKKyAgICAgIEJvb2xDYXN0ID0gT3AwLCBPdGhlck9wID0gT3AxOworICAgIGVsc2UgaWYgKE1hc2tlZFZhbHVlSXNaZXJvKE9wMSwgTmVnYXRpdmUyKSkKKyAgICAgIEJvb2xDYXN0ID0gT3AxLCBPdGhlck9wID0gT3AwOworCisgICAgaWYgKEJvb2xDYXN0KSB7CisgICAgICBWYWx1ZSAqViA9IEJ1aWxkZXItPkNyZWF0ZVN1YihDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEkuZ2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xDYXN0KTsKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKFYsIE90aGVyT3ApOworICAgIH0KKyAgfQorCisgIHJldHVybiBDaGFuZ2VkID8gJkkgOiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdEZNdWwoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgYm9vbCBDaGFuZ2VkID0gU2ltcGxpZnlDb21tdXRhdGl2ZShJKTsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICAvLyBTaW1wbGlmeSBtdWwgaW5zdHJ1Y3Rpb25zIHdpdGggYSBjb25zdGFudCBSSFMuLi4KKyAgaWYgKENvbnN0YW50ICpPcDFDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KE9wMSkpIHsKKyAgICBpZiAoQ29uc3RhbnRGUCAqT3AxRiA9IGR5bl9jYXN0PENvbnN0YW50RlA+KE9wMUMpKSB7CisgICAgICAvLyAiSW4gSUVFRSBmbG9hdGluZyBwb2ludCwgeCoxIGlzIG5vdCBlcXVpdmFsZW50IHRvIHggZm9yIG5hbnMuICBIb3dldmVyLAorICAgICAgLy8gQU5TSSBzYXlzIHdlIGNhbiBkcm9wIHNpZ25hbHMsIHNvIHdlIGNhbiBkbyB0aGlzIGFueXdheS4iIChmcm9tIEdDQykKKyAgICAgIGlmIChPcDFGLT5pc0V4YWN0bHlWYWx1ZSgxLjApKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBPcDApOyAgLy8gRWxpbWluYXRlICdmbXVsIGRvdWJsZSAlWCwgMS4wJworICAgIH0gZWxzZSBpZiAoT3AxQy0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIGlmIChDb25zdGFudFZlY3RvciAqT3AxViA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihPcDFDKSkgeworICAgICAgICAvLyBBcyBhYm92ZSwgdmVjdG9yIFgqc3BsYXQoMS4wKSAtPiBYIGluIGFsbCBkZWZpbmVkIGNhc2VzLgorICAgICAgICBpZiAoQ29uc3RhbnQgKlNwbGF0ID0gT3AxVi0+Z2V0U3BsYXRWYWx1ZSgpKSB7CisgICAgICAgICAgaWYgKENvbnN0YW50RlAgKkYgPSBkeW5fY2FzdDxDb25zdGFudEZQPihTcGxhdCkpCisgICAgICAgICAgICBpZiAoRi0+aXNFeGFjdGx5VmFsdWUoMS4wKSkKKyAgICAgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgT3AwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIFRyeSB0byBmb2xkIGNvbnN0YW50IG11bCBpbnRvIHNlbGVjdCBhcmd1bWVudHMuCisgICAgaWYgKFNlbGVjdEluc3QgKlNJID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oT3AwKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqUiA9IEZvbGRPcEludG9TZWxlY3QoSSwgU0kpKQorICAgICAgICByZXR1cm4gUjsKKworICAgIGlmIChpc2E8UEhJTm9kZT4oT3AwKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEkpKQorICAgICAgICByZXR1cm4gTlY7CisgIH0KKworICBpZiAoVmFsdWUgKk9wMHYgPSBkeW5fY2FzdEZOZWdWYWwoT3AwKSkgICAgIC8vIC1YICogLVkgPSBYKlkKKyAgICBpZiAoVmFsdWUgKk9wMXYgPSBkeW5fY2FzdEZOZWdWYWwoT3AxKSkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRk11bChPcDB2LCBPcDF2KTsKKworICByZXR1cm4gQ2hhbmdlZCA/ICZJIDogMDsKK30KKworLy8vIFNpbXBsaWZ5RGl2UmVtT2ZTZWxlY3QgLSBUcnkgdG8gZm9sZCBhIGRpdmlkZSBvciByZW1haW5kZXIgb2YgYSBzZWxlY3QKKy8vLyBpbnN0cnVjdGlvbi4KK2Jvb2wgSW5zdENvbWJpbmVyOjpTaW1wbGlmeURpdlJlbU9mU2VsZWN0KEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIFNlbGVjdEluc3QgKlNJID0gY2FzdDxTZWxlY3RJbnN0PihJLmdldE9wZXJhbmQoMSkpOworICAKKyAgLy8gZGl2L3JlbSBYLCAoQ29uZCA/IDAgOiBZKSAtPiBkaXYvcmVtIFgsIFkKKyAgaW50IE5vbk51bGxPcGVyYW5kID0gLTE7CisgIGlmIChDb25zdGFudCAqU1QgPSBkeW5fY2FzdDxDb25zdGFudD4oU0ktPmdldE9wZXJhbmQoMSkpKQorICAgIGlmIChTVC0+aXNOdWxsVmFsdWUoKSkKKyAgICAgIE5vbk51bGxPcGVyYW5kID0gMjsKKyAgLy8gZGl2L3JlbSBYLCAoQ29uZCA/IFkgOiAwKSAtPiBkaXYvcmVtIFgsIFkKKyAgaWYgKENvbnN0YW50ICpTVCA9IGR5bl9jYXN0PENvbnN0YW50PihTSS0+Z2V0T3BlcmFuZCgyKSkpCisgICAgaWYgKFNULT5pc051bGxWYWx1ZSgpKQorICAgICAgTm9uTnVsbE9wZXJhbmQgPSAxOworICAKKyAgaWYgKE5vbk51bGxPcGVyYW5kID09IC0xKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIFZhbHVlICpTZWxlY3RDb25kID0gU0ktPmdldE9wZXJhbmQoMCk7CisgIAorICAvLyBDaGFuZ2UgdGhlIGRpdi9yZW0gdG8gdXNlICdZJyBpbnN0ZWFkIG9mIHRoZSBzZWxlY3QuCisgIEkuc2V0T3BlcmFuZCgxLCBTSS0+Z2V0T3BlcmFuZChOb25OdWxsT3BlcmFuZCkpOworICAKKyAgLy8gT2theSwgd2Uga25vdyB3ZSByZXBsYWNlIHRoZSBvcGVyYW5kIG9mIHRoZSBkaXYvcmVtIHdpdGggJ1knIHdpdGggbm8KKyAgLy8gcHJvYmxlbS4gIEhvd2V2ZXIsIHRoZSBzZWxlY3QsIG9yIHRoZSBjb25kaXRpb24gb2YgdGhlIHNlbGVjdCBtYXkgaGF2ZQorICAvLyBtdWx0aXBsZSB1c2VzLiAgQmFzZWQgb24gb3VyIGtub3dsZWRnZSB0aGF0IHRoZSBvcGVyYW5kIG11c3QgYmUgbm9uLXplcm8sCisgIC8vIHByb3BhZ2F0ZSB0aGUga25vd24gdmFsdWUgZm9yIHRoZSBzZWxlY3QgaW50byBvdGhlciB1c2VzIG9mIGl0LCBhbmQKKyAgLy8gcHJvcGFnYXRlIGEga25vd24gdmFsdWUgb2YgdGhlIGNvbmRpdGlvbiBpbnRvIGl0cyBvdGhlciB1c2Vycy4KKyAgCisgIC8vIElmIHRoZSBzZWxlY3QgYW5kIGNvbmRpdGlvbiBvbmx5IGhhdmUgYSBzaW5nbGUgdXNlLCBkb24ndCBib3RoZXIgd2l0aCB0aGlzLAorICAvLyBlYXJseSBleGl0LgorICBpZiAoU0ktPnVzZV9lbXB0eSgpICYmIFNlbGVjdENvbmQtPmhhc09uZVVzZSgpKQorICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gU2NhbiB0aGUgY3VycmVudCBibG9jayBiYWNrd2FyZCwgbG9va2luZyBmb3Igb3RoZXIgdXNlcyBvZiBTSS4KKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gJkksIEJCRnJvbnQgPSBJLmdldFBhcmVudCgpLT5iZWdpbigpOworICAKKyAgd2hpbGUgKEJCSSAhPSBCQkZyb250KSB7CisgICAgLS1CQkk7CisgICAgLy8gSWYgd2UgZm91bmQgYSBjYWxsIHRvIGEgZnVuY3Rpb24sIHdlIGNhbid0IGFzc3VtZSBpdCB3aWxsIHJldHVybiwgc28KKyAgICAvLyBpbmZvcm1hdGlvbiBmcm9tIGJlbG93IGl0IGNhbm5vdCBiZSBwcm9wYWdhdGVkIGFib3ZlIGl0LgorICAgIGlmIChpc2E8Q2FsbEluc3Q+KEJCSSkgJiYgIWlzYTxJbnRyaW5zaWNJbnN0PihCQkkpKQorICAgICAgYnJlYWs7CisgICAgCisgICAgLy8gUmVwbGFjZSB1c2VzIG9mIHRoZSBzZWxlY3Qgb3IgaXRzIGNvbmRpdGlvbiB3aXRoIHRoZSBrbm93biB2YWx1ZXMuCisgICAgZm9yIChJbnN0cnVjdGlvbjo6b3BfaXRlcmF0b3IgSSA9IEJCSS0+b3BfYmVnaW4oKSwgRSA9IEJCSS0+b3BfZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKCpJID09IFNJKSB7CisgICAgICAgICpJID0gU0ktPmdldE9wZXJhbmQoTm9uTnVsbE9wZXJhbmQpOworICAgICAgICBXb3JrbGlzdC5BZGQoQkJJKTsKKyAgICAgIH0gZWxzZSBpZiAoKkkgPT0gU2VsZWN0Q29uZCkgeworICAgICAgICAqSSA9IE5vbk51bGxPcGVyYW5kID09IDEgPyBDb25zdGFudEludDo6Z2V0VHJ1ZShCQkktPmdldENvbnRleHQoKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0RmFsc2UoQkJJLT5nZXRDb250ZXh0KCkpOworICAgICAgICBXb3JrbGlzdC5BZGQoQkJJKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gSWYgd2UgcGFzdCB0aGUgaW5zdHJ1Y3Rpb24sIHF1aXQgbG9va2luZyBmb3IgaXQuCisgICAgaWYgKCYqQkJJID09IFNJKQorICAgICAgU0kgPSAwOworICAgIGlmICgmKkJCSSA9PSBTZWxlY3RDb25kKQorICAgICAgU2VsZWN0Q29uZCA9IDA7CisgICAgCisgICAgLy8gSWYgd2UgcmFuIG91dCBvZiB0aGluZ3MgdG8gZWxpbWluYXRlLCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisgICAgaWYgKFNlbGVjdENvbmQgPT0gMCAmJiBTSSA9PSAwKQorICAgICAgYnJlYWs7CisgICAgCisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdHJhbnNmb3JtcyBvbiBkaXYgaW5zdHJ1Y3Rpb25zIHRoYXQgd29yaworLy8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGtpbmQgb2YgZGl2IGluc3RydWN0aW9uIGl0IGlzICh1ZGl2LCBzZGl2LCBvciBmZGl2KS4gSXQgaXMKKy8vLyB1c2VkIGJ5IHRoZSB2aXNpdG9ycyB0byB0aG9zZSBpbnN0cnVjdGlvbnMuCisvLy8gQGJyaWVmIFRyYW5zZm9ybXMgY29tbW9uIHRvIGFsbCB0aHJlZSBkaXYgaW5zdHJ1Y3Rpb25zCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjpjb21tb25EaXZUcmFuc2Zvcm1zKEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIFZhbHVlICpPcDAgPSBJLmdldE9wZXJhbmQoMCksICpPcDEgPSBJLmdldE9wZXJhbmQoMSk7CisKKyAgLy8gdW5kZWYgLyBYIC0+IDAgICAgICAgIGZvciBpbnRlZ2VyLgorICAvLyB1bmRlZiAvIFggLT4gdW5kZWYgICAgZm9yIEZQICh0aGUgdW5kZWYgY291bGQgYmUgYSBzbmFuKS4KKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihPcDApKSB7CisgICAgaWYgKE9wMC0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBPcDApOworICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSS5nZXRUeXBlKCkpKTsKKyAgfQorCisgIC8vIFggLyB1bmRlZiAtPiB1bmRlZgorICBpZiAoaXNhPFVuZGVmVmFsdWU+KE9wMSkpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgT3AxKTsKKworICByZXR1cm4gMDsKK30KKworLy8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdHJhbnNmb3JtcyBjb21tb24gdG8gYm90aCBpbnRlZ2VyIGRpdmlzaW9uCisvLy8gaW5zdHJ1Y3Rpb25zICh1ZGl2IGFuZCBzZGl2KS4gSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aXNpdG9ycyB0byB0aG9zZSBpbnRlZ2VyCisvLy8gZGl2aXNpb24gaW5zdHJ1Y3Rpb25zLgorLy8vIEBicmllZiBDb21tb24gaW50ZWdlciBkaXZpZGUgdHJhbnNmb3JtcworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6Y29tbW9uSURpdlRyYW5zZm9ybXMoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICAvLyAoc2RpdiBYLCBYKSAtLT4gMSAgICAgKHVkaXYgWCwgWCkgLS0+IDEKKyAgaWYgKE9wMCA9PSBPcDEpIHsKKyAgICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihJLmdldFR5cGUoKSkpIHsKKyAgICAgIENvbnN0YW50ICpDSSA9IENvbnN0YW50SW50OjpnZXQoVHktPmdldEVsZW1lbnRUeXBlKCksIDEpOworICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBFbHRzKFR5LT5nZXROdW1FbGVtZW50cygpLCBDSSk7CisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudFZlY3Rvcjo6Z2V0KEVsdHMpKTsKKyAgICB9CisKKyAgICBDb25zdGFudCAqQ0kgPSBDb25zdGFudEludDo6Z2V0KEkuZ2V0VHlwZSgpLCAxKTsKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDSSk7CisgIH0KKyAgCisgIGlmIChJbnN0cnVjdGlvbiAqQ29tbW9uID0gY29tbW9uRGl2VHJhbnNmb3JtcyhJKSkKKyAgICByZXR1cm4gQ29tbW9uOworICAKKyAgLy8gSGFuZGxlIGNhc2VzIGludm9sdmluZzogW3N1XWRpdiBYLCAoc2VsZWN0IENvbmQsIFksIFopCisgIC8vIFRoaXMgZG9lcyBub3QgYXBwbHkgZm9yIGZkaXYuCisgIGlmIChpc2E8U2VsZWN0SW5zdD4oT3AxKSAmJiBTaW1wbGlmeURpdlJlbU9mU2VsZWN0KEkpKQorICAgIHJldHVybiAmSTsKKworICBpZiAoQ29uc3RhbnRJbnQgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDEpKSB7CisgICAgLy8gZGl2IFgsIDEgPT0gWAorICAgIGlmIChSSFMtPmVxdWFsc0ludCgxKSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMCk7CisKKyAgICAvLyAoWCAvIEMxKSAvIEMyICAtPiBYIC8gKEMxKkMyKQorICAgIGlmIChJbnN0cnVjdGlvbiAqTEhTID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KE9wMCkpCisgICAgICBpZiAoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyhMSFMtPmdldE9wY29kZSgpKSA9PSBJLmdldE9wY29kZSgpKQorICAgICAgICBpZiAoQ29uc3RhbnRJbnQgKkxIU1JIUyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihMSFMtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgICAgaWYgKE11bHRpcGx5T3ZlcmZsb3dzKFJIUywgTEhTUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLmdldE9wY29kZSgpPT1JbnN0cnVjdGlvbjo6U0RpdikpCisgICAgICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEkuZ2V0VHlwZSgpKSk7CisgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEkuZ2V0T3Bjb2RlKCksIExIUy0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRNdWwoUkhTLCBMSFNSSFMpKTsKKyAgICAgICAgfQorCisgICAgaWYgKCFSSFMtPmlzWmVybygpKSB7IC8vIGF2b2lkIFggdWRpdiAwCisgICAgICBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihPcDApKQorICAgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKlIgPSBGb2xkT3BJbnRvU2VsZWN0KEksIFNJKSkKKyAgICAgICAgICByZXR1cm4gUjsKKyAgICAgIGlmIChpc2E8UEhJTm9kZT4oT3AwKSkKKyAgICAgICAgaWYgKEluc3RydWN0aW9uICpOViA9IEZvbGRPcEludG9QaGkoSSkpCisgICAgICAgICAgcmV0dXJuIE5WOworICAgIH0KKyAgfQorCisgIC8vIDAgLyBYID09IDAsIHdlIGRvbid0IG5lZWQgdG8gcHJlc2VydmUgZmF1bHRzIQorICBpZiAoQ29uc3RhbnRJbnQgKkxIUyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDApKQorICAgIGlmIChMSFMtPmVxdWFsc0ludCgwKSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSS5nZXRUeXBlKCkpKTsKKworICAvLyBJdCBjYW4ndCBiZSBkaXZpc2lvbiBieSB6ZXJvLCBoZW5jZSBpdCBtdXN0IGJlIGRpdmlzaW9uIGJ5IG9uZS4KKyAgaWYgKEkuZ2V0VHlwZSgpLT5pc0ludGVnZXJUeSgxKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBPcDApOworCisgIGlmIChDb25zdGFudFZlY3RvciAqT3AxViA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihPcDEpKSB7CisgICAgaWYgKENvbnN0YW50SW50ICpYID0gY2FzdF9vcl9udWxsPENvbnN0YW50SW50PihPcDFWLT5nZXRTcGxhdFZhbHVlKCkpKQorICAgICAgLy8gZGl2IFgsIDEgPT0gWAorICAgICAgaWYgKFgtPmlzT25lKCkpCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMCk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRVRGl2KEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIFZhbHVlICpPcDAgPSBJLmdldE9wZXJhbmQoMCksICpPcDEgPSBJLmdldE9wZXJhbmQoMSk7CisKKyAgLy8gSGFuZGxlIHRoZSBpbnRlZ2VyIGRpdiBjb21tb24gY2FzZXMKKyAgaWYgKEluc3RydWN0aW9uICpDb21tb24gPSBjb21tb25JRGl2VHJhbnNmb3JtcyhJKSkKKyAgICByZXR1cm4gQ29tbW9uOworCisgIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDEpKSB7CisgICAgLy8gWCB1ZGl2IDJeQyAtPiBYID4+IEMKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbiB1bnNpZ25lZCBkaXZpc2lvbiB3aXRoIGFuIGV4YWN0IHBvd2VyIG9mIDIsCisgICAgLy8gaWYgc28sIGNvbnZlcnQgdG8gYSByaWdodCBzaGlmdC4KKyAgICBpZiAoQy0+Z2V0VmFsdWUoKS5pc1Bvd2VyT2YyKCkpICAvLyAwIG5vdCBpbmNsdWRlZCBpbiBpc1Bvd2VyT2YyCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUxTaHIoT3AwLCAKKyAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoT3AwLT5nZXRUeXBlKCksIEMtPmdldFZhbHVlKCkubG9nQmFzZTIoKSkpOworCisgICAgLy8gWCB1ZGl2IEMsIHdoZXJlIEMgPj0gc2lnbmJpdAorICAgIGlmIChDLT5nZXRWYWx1ZSgpLmlzTmVnYXRpdmUoKSkgeworICAgICAgVmFsdWUgKklDID0gQnVpbGRlci0+Q3JlYXRlSUNtcFVMVCggT3AwLCBDKTsKKyAgICAgIHJldHVybiBTZWxlY3RJbnN0OjpDcmVhdGUoSUMsIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSS5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEkuZ2V0VHlwZSgpLCAxKSk7CisgICAgfQorICB9CisKKyAgLy8gWCB1ZGl2IChDMSA8PCBOKSwgd2hlcmUgQzEgaXMgIjE8PEMyIiAgLS0+ICBYID4+IChOK0MyKQorICBpZiAoQmluYXJ5T3BlcmF0b3IgKlJIU0kgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oSS5nZXRPcGVyYW5kKDEpKSkgeworICAgIGlmIChSSFNJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U2hsICYmCisgICAgICAgIGlzYTxDb25zdGFudEludD4oUkhTSS0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgIGNvbnN0IEFQSW50JiBDMSA9IGNhc3Q8Q29uc3RhbnRJbnQ+KFJIU0ktPmdldE9wZXJhbmQoMCkpLT5nZXRWYWx1ZSgpOworICAgICAgaWYgKEMxLmlzUG93ZXJPZjIoKSkgeworICAgICAgICBWYWx1ZSAqTiA9IFJIU0ktPmdldE9wZXJhbmQoMSk7CisgICAgICAgIGNvbnN0IFR5cGUgKk5UeSA9IE4tPmdldFR5cGUoKTsKKyAgICAgICAgaWYgKHVpbnQzMl90IEMyID0gQzEubG9nQmFzZTIoKSkKKyAgICAgICAgICBOID0gQnVpbGRlci0+Q3JlYXRlQWRkKE4sIENvbnN0YW50SW50OjpnZXQoTlR5LCBDMikpOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUxTaHIoT3AwLCBOKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIHVkaXYgWCwgKFNlbGVjdCBDb25kLCBDMSwgQzIpIC0tPiBTZWxlY3QgQ29uZCwgKHNociBYLCBDMSksIChzaHIgWCwgQzIpCisgIC8vIHdoZXJlIEMxJkMyIGFyZSBwb3dlcnMgb2YgdHdvLgorICBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihPcDEpKSAKKyAgICBpZiAoQ29uc3RhbnRJbnQgKlNUTyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihTSS0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICBpZiAoQ29uc3RhbnRJbnQgKlNGTyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihTSS0+Z2V0T3BlcmFuZCgyKSkpICB7CisgICAgICAgIGNvbnN0IEFQSW50ICZUVkEgPSBTVE8tPmdldFZhbHVlKCksICZGVkEgPSBTRk8tPmdldFZhbHVlKCk7CisgICAgICAgIGlmIChUVkEuaXNQb3dlck9mMigpICYmIEZWQS5pc1Bvd2VyT2YyKCkpIHsKKyAgICAgICAgICAvLyBDb21wdXRlIHRoZSBzaGlmdCBhbW91bnRzCisgICAgICAgICAgdWludDMyX3QgVFNBID0gVFZBLmxvZ0Jhc2UyKCksIEZTQSA9IEZWQS5sb2dCYXNlMigpOworICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgIm9uIHRydWUiIGNhc2Ugb2YgdGhlIHNlbGVjdAorICAgICAgICAgIENvbnN0YW50ICpUQyA9IENvbnN0YW50SW50OjpnZXQoT3AwLT5nZXRUeXBlKCksIFRTQSk7CisgICAgICAgICAgVmFsdWUgKlRTSSA9IEJ1aWxkZXItPkNyZWF0ZUxTaHIoT3AwLCBUQyk7CisgIAorICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgIm9uIGZhbHNlIiBjYXNlIG9mIHRoZSBzZWxlY3QKKyAgICAgICAgICBDb25zdGFudCAqRkMgPSBDb25zdGFudEludDo6Z2V0KE9wMC0+Z2V0VHlwZSgpLCBGU0EpOyAKKyAgICAgICAgICBWYWx1ZSAqRlNJID0gQnVpbGRlci0+Q3JlYXRlTFNocihPcDAsIEZDKTsKKworICAgICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgc2VsZWN0IGluc3RydWN0aW9uIGFuZCByZXR1cm4gaXQuCisgICAgICAgICAgcmV0dXJuIFNlbGVjdEluc3Q6OkNyZWF0ZShTSS0+Z2V0T3BlcmFuZCgwKSwgVFNJLCBGU0kpOworICAgICAgICB9CisgICAgICB9CisgIHJldHVybiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdFNEaXYoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICAvLyBIYW5kbGUgdGhlIGludGVnZXIgZGl2IGNvbW1vbiBjYXNlcworICBpZiAoSW5zdHJ1Y3Rpb24gKkNvbW1vbiA9IGNvbW1vbklEaXZUcmFuc2Zvcm1zKEkpKQorICAgIHJldHVybiBDb21tb247CisKKyAgaWYgKENvbnN0YW50SW50ICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AxKSkgeworICAgIC8vIHNkaXYgWCwgLTEgPT0gLVgKKyAgICBpZiAoUkhTLT5pc0FsbE9uZXNWYWx1ZSgpKQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOZWcoT3AwKTsKKworICAgIC8vIHNkaXYgWCwgQyAgLS0+ICBhc2hyIFgsIGxvZzIoQykKKyAgICBpZiAoY2FzdDxTRGl2T3BlcmF0b3I+KCZJKS0+aXNFeGFjdCgpICYmCisgICAgICAgIFJIUy0+Z2V0VmFsdWUoKS5pc05vbk5lZ2F0aXZlKCkgJiYKKyAgICAgICAgUkhTLT5nZXRWYWx1ZSgpLmlzUG93ZXJPZjIoKSkgeworICAgICAgVmFsdWUgKlNoQW10ID0gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChSSFMtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTLT5nZXRWYWx1ZSgpLmV4YWN0TG9nQmFzZTIoKSk7CisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFTaHIoT3AwLCBTaEFtdCk7CisgICAgfQorCisgICAgLy8gLVgvQyAgLS0+ICBYLy1DICBwcm92aWRlZCB0aGUgbmVnYXRpb24gZG9lc24ndCBvdmVyZmxvdy4KKyAgICBpZiAoU3ViT3BlcmF0b3IgKlN1YiA9IGR5bl9jYXN0PFN1Yk9wZXJhdG9yPihPcDApKQorICAgICAgaWYgKGlzYTxDb25zdGFudD4oU3ViLT5nZXRPcGVyYW5kKDApKSAmJgorICAgICAgICAgIGNhc3Q8Q29uc3RhbnQ+KFN1Yi0+Z2V0T3BlcmFuZCgwKSktPmlzTnVsbFZhbHVlKCkgJiYKKyAgICAgICAgICBTdWItPmhhc05vU2lnbmVkV3JhcCgpKQorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNEaXYoU3ViLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXROZWcoUkhTKSk7CisgIH0KKworICAvLyBJZiB0aGUgc2lnbiBiaXRzIG9mIGJvdGggb3BlcmFuZHMgYXJlIHplcm8gKGkuZS4gd2UgY2FuIHByb3ZlIHRoZXkgYXJlCisgIC8vIHVuc2lnbmVkIGlucHV0cyksIHR1cm4gdGhpcyBpbnRvIGEgdWRpdi4KKyAgaWYgKEkuZ2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpKSB7CisgICAgQVBJbnQgTWFzayhBUEludDo6Z2V0U2lnbkJpdChJLmdldFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpKSk7CisgICAgaWYgKE1hc2tlZFZhbHVlSXNaZXJvKE9wMCwgTWFzaykpIHsKKyAgICAgIGlmIChNYXNrZWRWYWx1ZUlzWmVybyhPcDEsIE1hc2spKSB7CisgICAgICAgIC8vIFggc2RpdiBZIC0+IFggdWRpdiBZLCBpZmYgWCBhbmQgWSBkb24ndCBoYXZlIHNpZ24gYml0IHNldAorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVVEaXYoT3AwLCBPcDEpOworICAgICAgfQorICAgICAgQ29uc3RhbnRJbnQgKlNoaWZ0ZWRJbnQ7CisgICAgICBpZiAobWF0Y2goT3AxLCBtX1NobChtX0NvbnN0YW50SW50KFNoaWZ0ZWRJbnQpLCBtX1ZhbHVlKCkpKSAmJgorICAgICAgICAgIFNoaWZ0ZWRJbnQtPmdldFZhbHVlKCkuaXNQb3dlck9mMigpKSB7CisgICAgICAgIC8vIFggc2RpdiAoMSA8PCBZKSAtPiBYIHVkaXYgKDEgPDwgWSkgKCAtPiBYIHU+PiBZKQorICAgICAgICAvLyBTYWZlIGJlY2F1c2UgdGhlIG9ubHkgbmVnYXRpdmUgdmFsdWUgKDEgPDwgWSkgY2FuIHRha2Ugb24gaXMKKyAgICAgICAgLy8gSU5UX01JTiwgYW5kIFggc2RpdiBJTlRfTUlOID09IFggdWRpdiBJTlRfTUlOID09IDAgaWYgWCBkb2Vzbid0IGhhdmUKKyAgICAgICAgLy8gdGhlIHNpZ24gYml0IHNldC4KKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVVRGl2KE9wMCwgT3AxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdEZEaXYoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgcmV0dXJuIGNvbW1vbkRpdlRyYW5zZm9ybXMoSSk7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHRyYW5zZm9ybXMgb24gcmVtIGluc3RydWN0aW9ucyB0aGF0IHdvcmsKKy8vLyByZWdhcmRsZXNzIG9mIHRoZSBraW5kIG9mIHJlbSBpbnN0cnVjdGlvbiBpdCBpcyAodXJlbSwgc3JlbSwgb3IgZnJlbSkuIEl0IAorLy8vIGlzIHVzZWQgYnkgdGhlIHZpc2l0b3JzIHRvIHRob3NlIGluc3RydWN0aW9ucy4KKy8vLyBAYnJpZWYgVHJhbnNmb3JtcyBjb21tb24gdG8gYWxsIHRocmVlIHJlbSBpbnN0cnVjdGlvbnMKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OmNvbW1vblJlbVRyYW5zZm9ybXMoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICBpZiAoaXNhPFVuZGVmVmFsdWU+KE9wMCkpIHsgICAgICAgICAgICAgLy8gdW5kZWYgJSBYIC0+IDAKKyAgICBpZiAoSS5nZXRUeXBlKCktPmlzRlBPckZQVmVjdG9yVHkoKSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMCk7ICAvLyBYICUgdW5kZWYgLT4gdW5kZWYgKGNvdWxkIGJlIFNOYU4pCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJLmdldFR5cGUoKSkpOworICB9CisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oT3AxKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBPcDEpOyAgLy8gWCAlIHVuZGVmIC0+IHVuZGVmCisKKyAgLy8gSGFuZGxlIGNhc2VzIGludm9sdmluZzogcmVtIFgsIChzZWxlY3QgQ29uZCwgWSwgWikKKyAgaWYgKGlzYTxTZWxlY3RJbnN0PihPcDEpICYmIFNpbXBsaWZ5RGl2UmVtT2ZTZWxlY3QoSSkpCisgICAgcmV0dXJuICZJOworCisgIHJldHVybiAwOworfQorCisvLy8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSB0cmFuc2Zvcm1zIGNvbW1vbiB0byBib3RoIGludGVnZXIgcmVtYWluZGVyCisvLy8gaW5zdHJ1Y3Rpb25zICh1cmVtIGFuZCBzcmVtKS4gSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aXNpdG9ycyB0byB0aG9zZSBpbnRlZ2VyCisvLy8gcmVtYWluZGVyIGluc3RydWN0aW9ucy4KKy8vLyBAYnJpZWYgQ29tbW9uIGludGVnZXIgcmVtYWluZGVyIHRyYW5zZm9ybXMKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OmNvbW1vbklSZW1UcmFuc2Zvcm1zKEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIFZhbHVlICpPcDAgPSBJLmdldE9wZXJhbmQoMCksICpPcDEgPSBJLmdldE9wZXJhbmQoMSk7CisKKyAgaWYgKEluc3RydWN0aW9uICpjb21tb24gPSBjb21tb25SZW1UcmFuc2Zvcm1zKEkpKQorICAgIHJldHVybiBjb21tb247CisKKyAgLy8gMCAlIFggPT0gMCBmb3IgaW50ZWdlciwgd2UgZG9uJ3QgbmVlZCB0byBwcmVzZXJ2ZSBmYXVsdHMhCisgIGlmIChDb25zdGFudCAqTEhTID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KE9wMCkpCisgICAgaWYgKExIUy0+aXNOdWxsVmFsdWUoKSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSS5nZXRUeXBlKCkpKTsKKworICBpZiAoQ29uc3RhbnRJbnQgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDEpKSB7CisgICAgLy8gWCAlIDAgPT0gdW5kZWYsIHdlIGRvbid0IG5lZWQgdG8gcHJlc2VydmUgZmF1bHRzIQorICAgIGlmIChSSFMtPmVxdWFsc0ludCgwKSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIFVuZGVmVmFsdWU6OmdldChJLmdldFR5cGUoKSkpOworICAgIAorICAgIGlmIChSSFMtPmVxdWFsc0ludCgxKSkgIC8vIFggJSAxID09IDAKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSS5nZXRUeXBlKCkpKTsKKworICAgIGlmIChJbnN0cnVjdGlvbiAqT3AwSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihPcDApKSB7CisgICAgICBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihPcDBJKSkgeworICAgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKlIgPSBGb2xkT3BJbnRvU2VsZWN0KEksIFNJKSkKKyAgICAgICAgICByZXR1cm4gUjsKKyAgICAgIH0gZWxzZSBpZiAoaXNhPFBISU5vZGU+KE9wMEkpKSB7CisgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEkpKQorICAgICAgICAgIHJldHVybiBOVjsKKyAgICAgIH0KKworICAgICAgLy8gU2VlIGlmIHdlIGNhbiBmb2xkIGF3YXkgdGhpcyByZW0gaW5zdHJ1Y3Rpb24uCisgICAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEluc3RydWN0aW9uQml0cyhJKSkKKyAgICAgICAgcmV0dXJuICZJOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdFVSZW0oQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICBpZiAoSW5zdHJ1Y3Rpb24gKmNvbW1vbiA9IGNvbW1vbklSZW1UcmFuc2Zvcm1zKEkpKQorICAgIHJldHVybiBjb21tb247CisgIAorICBpZiAoQ29uc3RhbnRJbnQgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDEpKSB7CisgICAgLy8gWCB1cmVtIENeMiAtPiBYIGFuZCBDCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gdW5zaWduZWQgcmVtYWluZGVyIHdpdGggYW4gZXhhY3QgcG93ZXIgb2YgMiwKKyAgICAvLyBpZiBzbywgY29udmVydCB0byBhIGJpdHdpc2UgYW5kLgorICAgIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihSSFMpKQorICAgICAgaWYgKEMtPmdldFZhbHVlKCkuaXNQb3dlck9mMigpKQorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChPcDAsIFN1Yk9uZShDKSk7CisgIH0KKworICBpZiAoSW5zdHJ1Y3Rpb24gKlJIU0kgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oSS5nZXRPcGVyYW5kKDEpKSkgeworICAgIC8vIFR1cm4gQSAlIChDIDw8IE4pLCB3aGVyZSBDIGlzIDJeaywgaW50byBBICYgKChDIDw8IE4pLTEpICAKKyAgICBpZiAoUkhTSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNobCAmJgorICAgICAgICBpc2E8Q29uc3RhbnRJbnQ+KFJIU0ktPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICBpZiAoY2FzdDxDb25zdGFudEludD4oUkhTSS0+Z2V0T3BlcmFuZCgwKSktPmdldFZhbHVlKCkuaXNQb3dlck9mMigpKSB7CisgICAgICAgIENvbnN0YW50ICpOMSA9IENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoSS5nZXRUeXBlKCkpOworICAgICAgICBWYWx1ZSAqQWRkID0gQnVpbGRlci0+Q3JlYXRlQWRkKFJIU0ksIE4xKTsKKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoT3AwLCBBZGQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIHVyZW0gWCwgKHNlbGVjdCBDb25kLCAyXkMxLCAyXkMyKSAtLT4gc2VsZWN0IENvbmQsIChhbmQgWCwgQzEpLCAoYW5kIFgsIEMyKQorICAvLyB3aGVyZSBDMSZDMiBhcmUgcG93ZXJzIG9mIHR3by4KKyAgaWYgKFNlbGVjdEluc3QgKlNJID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oT3AxKSkgeworICAgIGlmIChDb25zdGFudEludCAqU1RPID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFNJLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIGlmIChDb25zdGFudEludCAqU0ZPID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFNJLT5nZXRPcGVyYW5kKDIpKSkgeworICAgICAgICAvLyBTVE8gPT0gMCBhbmQgU0ZPID09IDAgaGFuZGxlZCBhYm92ZS4KKyAgICAgICAgaWYgKChTVE8tPmdldFZhbHVlKCkuaXNQb3dlck9mMigpKSAmJiAKKyAgICAgICAgICAgIChTRk8tPmdldFZhbHVlKCkuaXNQb3dlck9mMigpKSkgeworICAgICAgICAgIFZhbHVlICpUcnVlQW5kID0gQnVpbGRlci0+Q3JlYXRlQW5kKE9wMCwgU3ViT25lKFNUTykpOworICAgICAgICAgIFZhbHVlICpGYWxzZUFuZCA9IEJ1aWxkZXItPkNyZWF0ZUFuZChPcDAsIFN1Yk9uZShTRk8pKTsKKyAgICAgICAgICByZXR1cm4gU2VsZWN0SW5zdDo6Q3JlYXRlKFNJLT5nZXRPcGVyYW5kKDApLCBUcnVlQW5kLCBGYWxzZUFuZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0U1JlbShCaW5hcnlPcGVyYXRvciAmSSkgeworICBWYWx1ZSAqT3AwID0gSS5nZXRPcGVyYW5kKDApLCAqT3AxID0gSS5nZXRPcGVyYW5kKDEpOworCisgIC8vIEhhbmRsZSB0aGUgaW50ZWdlciByZW0gY29tbW9uIGNhc2VzCisgIGlmIChJbnN0cnVjdGlvbiAqQ29tbW9uID0gY29tbW9uSVJlbVRyYW5zZm9ybXMoSSkpCisgICAgcmV0dXJuIENvbW1vbjsKKyAgCisgIGlmIChWYWx1ZSAqUkhTTmVnID0gZHluX2Nhc3ROZWdWYWwoT3AxKSkKKyAgICBpZiAoIWlzYTxDb25zdGFudD4oUkhTTmVnKSB8fAorICAgICAgICAoaXNhPENvbnN0YW50SW50PihSSFNOZWcpICYmCisgICAgICAgICBjYXN0PENvbnN0YW50SW50PihSSFNOZWcpLT5nZXRWYWx1ZSgpLmlzU3RyaWN0bHlQb3NpdGl2ZSgpKSkgeworICAgICAgLy8gWCAlIC1ZIC0+IFggJSBZCisgICAgICBXb3JrbGlzdC5BZGRWYWx1ZShJLmdldE9wZXJhbmQoMSkpOworICAgICAgSS5zZXRPcGVyYW5kKDEsIFJIU05lZyk7CisgICAgICByZXR1cm4gJkk7CisgICAgfQorCisgIC8vIElmIHRoZSBzaWduIGJpdHMgb2YgYm90aCBvcGVyYW5kcyBhcmUgemVybyAoaS5lLiB3ZSBjYW4gcHJvdmUgdGhleSBhcmUKKyAgLy8gdW5zaWduZWQgaW5wdXRzKSwgdHVybiB0aGlzIGludG8gYSB1cmVtLgorICBpZiAoSS5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkpIHsKKyAgICBBUEludCBNYXNrKEFQSW50OjpnZXRTaWduQml0KEkuZ2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpKTsKKyAgICBpZiAoTWFza2VkVmFsdWVJc1plcm8oT3AxLCBNYXNrKSAmJiBNYXNrZWRWYWx1ZUlzWmVybyhPcDAsIE1hc2spKSB7CisgICAgICAvLyBYIHNyZW0gWSAtPiBYIHVyZW0gWSwgaWZmIFggYW5kIFkgZG9uJ3QgaGF2ZSBzaWduIGJpdCBzZXQKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlVVJlbShPcDAsIE9wMSk7CisgICAgfQorICB9CisKKyAgLy8gSWYgaXQncyBhIGNvbnN0YW50IHZlY3RvciwgZmxpcCBhbnkgbmVnYXRpdmUgdmFsdWVzIHBvc2l0aXZlLgorICBpZiAoQ29uc3RhbnRWZWN0b3IgKlJIU1YgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oT3AxKSkgeworICAgIHVuc2lnbmVkIFZXaWR0aCA9IFJIU1YtPmdldE51bU9wZXJhbmRzKCk7CisKKyAgICBib29sIGhhc05lZ2F0aXZlID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgIWhhc05lZ2F0aXZlICYmIGkgIT0gVldpZHRoOyArK2kpCisgICAgICBpZiAoQ29uc3RhbnRJbnQgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihSSFNWLT5nZXRPcGVyYW5kKGkpKSkKKyAgICAgICAgaWYgKFJIUy0+Z2V0VmFsdWUoKS5pc05lZ2F0aXZlKCkpCisgICAgICAgICAgaGFzTmVnYXRpdmUgPSB0cnVlOworCisgICAgaWYgKGhhc05lZ2F0aXZlKSB7CisgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCAqPiBFbHRzKFZXaWR0aCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFZXaWR0aDsgKytpKSB7CisgICAgICAgIGlmIChDb25zdGFudEludCAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFJIU1YtPmdldE9wZXJhbmQoaSkpKSB7CisgICAgICAgICAgaWYgKFJIUy0+Z2V0VmFsdWUoKS5pc05lZ2F0aXZlKCkpCisgICAgICAgICAgICBFbHRzW2ldID0gY2FzdDxDb25zdGFudEludD4oQ29uc3RhbnRFeHByOjpnZXROZWcoUkhTKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgRWx0c1tpXSA9IFJIUzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBDb25zdGFudCAqTmV3UkhTViA9IENvbnN0YW50VmVjdG9yOjpnZXQoRWx0cyk7CisgICAgICBpZiAoTmV3UkhTViAhPSBSSFNWKSB7CisgICAgICAgIFdvcmtsaXN0LkFkZFZhbHVlKEkuZ2V0T3BlcmFuZCgxKSk7CisgICAgICAgIEkuc2V0T3BlcmFuZCgxLCBOZXdSSFNWKTsKKyAgICAgICAgcmV0dXJuICZJOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdEZSZW0oQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgcmV0dXJuIGNvbW1vblJlbVRyYW5zZm9ybXMoSSk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lUEhJLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lUEhJLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjMzYmYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVQSEkuY3BwCkBAIC0wLDAgKzEsODIyIEBACisvLz09PS0gSW5zdENvbWJpbmVQSEkuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSB2aXNpdFBISU5vZGUgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkluc3RDb21iaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIEZvbGRQSElBcmdCaW5PcEludG9QSEkgLSBJZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlIHBoaSBbYWRkIChhLGIpLCBhZGQoYSxjKV0KKy8vLyBhbmQgaWYgYS9iL2MgYW5kIHRoZSBhZGQncyBhbGwgaGF2ZSBhIHNpbmdsZSB1c2UsIHR1cm4gdGhpcyBpbnRvIGEgcGhpCisvLy8gYW5kIGEgc2luZ2xlIGJpbm9wLgorSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6Rm9sZFBISUFyZ0Jpbk9wSW50b1BISShQSElOb2RlICZQTikgeworICBJbnN0cnVjdGlvbiAqRmlyc3RJbnN0ID0gY2FzdDxJbnN0cnVjdGlvbj4oUE4uZ2V0SW5jb21pbmdWYWx1ZSgwKSk7CisgIGFzc2VydChpc2E8QmluYXJ5T3BlcmF0b3I+KEZpcnN0SW5zdCkgfHwgaXNhPENtcEluc3Q+KEZpcnN0SW5zdCkpOworICB1bnNpZ25lZCBPcGMgPSBGaXJzdEluc3QtPmdldE9wY29kZSgpOworICBWYWx1ZSAqTEhTVmFsID0gRmlyc3RJbnN0LT5nZXRPcGVyYW5kKDApOworICBWYWx1ZSAqUkhTVmFsID0gRmlyc3RJbnN0LT5nZXRPcGVyYW5kKDEpOworICAgIAorICBjb25zdCBUeXBlICpMSFNUeXBlID0gTEhTVmFsLT5nZXRUeXBlKCk7CisgIGNvbnN0IFR5cGUgKlJIU1R5cGUgPSBSSFNWYWwtPmdldFR5cGUoKTsKKyAgCisgIC8vIFNjYW4gdG8gc2VlIGlmIGFsbCBvcGVyYW5kcyBhcmUgdGhlIHNhbWUgb3Bjb2RlLCBhbmQgYWxsIGhhdmUgb25lIHVzZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBQTi5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyArK2kpIHsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihQTi5nZXRJbmNvbWluZ1ZhbHVlKGkpKTsKKyAgICBpZiAoIUkgfHwgSS0+Z2V0T3Bjb2RlKCkgIT0gT3BjIHx8ICFJLT5oYXNPbmVVc2UoKSB8fAorICAgICAgICAvLyBWZXJpZnkgdHlwZSBvZiB0aGUgTEhTIG1hdGNoZXMgc28gd2UgZG9uJ3QgZm9sZCBjbXAncyBvZiBkaWZmZXJlbnQKKyAgICAgICAgLy8gdHlwZXMgb3IgR0VQJ3Mgd2l0aCBkaWZmZXJlbnQgaW5kZXggdHlwZXMuCisgICAgICAgIEktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSAhPSBMSFNUeXBlIHx8CisgICAgICAgIEktPmdldE9wZXJhbmQoMSktPmdldFR5cGUoKSAhPSBSSFNUeXBlKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBJZiB0aGV5IGFyZSBDbXBJbnN0IGluc3RydWN0aW9ucywgY2hlY2sgdGhlaXIgcHJlZGljYXRlcworICAgIGlmIChPcGMgPT0gSW5zdHJ1Y3Rpb246OklDbXAgfHwgT3BjID09IEluc3RydWN0aW9uOjpGQ21wKQorICAgICAgaWYgKGNhc3Q8Q21wSW5zdD4oSSktPmdldFByZWRpY2F0ZSgpICE9CisgICAgICAgICAgY2FzdDxDbXBJbnN0PihGaXJzdEluc3QpLT5nZXRQcmVkaWNhdGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgLy8gS2VlcCB0cmFjayBvZiB3aGljaCBvcGVyYW5kIG5lZWRzIGEgcGhpIG5vZGUuCisgICAgaWYgKEktPmdldE9wZXJhbmQoMCkgIT0gTEhTVmFsKSBMSFNWYWwgPSAwOworICAgIGlmIChJLT5nZXRPcGVyYW5kKDEpICE9IFJIU1ZhbCkgUkhTVmFsID0gMDsKKyAgfQorCisgIC8vIElmIGJvdGggTEhTIGFuZCBSSFMgd291bGQgbmVlZCBhIFBISSwgZG9uJ3QgZG8gdGhpcyB0cmFuc2Zvcm1hdGlvbiwKKyAgLy8gYmVjYXVzZSBpdCB3b3VsZCBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIFBISXMgZW50ZXJpbmcgdGhlIGJsb2NrLAorICAvLyB3aGljaCBsZWFkcyB0byBoaWdoZXIgcmVnaXN0ZXIgcHJlc3N1cmUuIFRoaXMgaXMgZXNwZWNpYWxseQorICAvLyBiYWQgd2hlbiB0aGUgUEhJcyBhcmUgaW4gdGhlIGhlYWRlciBvZiBhIGxvb3AuCisgIGlmICghTEhTVmFsICYmICFSSFNWYWwpCisgICAgcmV0dXJuIDA7CisgIAorICAvLyBPdGhlcndpc2UsIHRoaXMgaXMgc2FmZSB0byB0cmFuc2Zvcm0hCisgIAorICBWYWx1ZSAqSW5MSFMgPSBGaXJzdEluc3QtPmdldE9wZXJhbmQoMCk7CisgIFZhbHVlICpJblJIUyA9IEZpcnN0SW5zdC0+Z2V0T3BlcmFuZCgxKTsKKyAgUEhJTm9kZSAqTmV3TEhTID0gMCwgKk5ld1JIUyA9IDA7CisgIGlmIChMSFNWYWwgPT0gMCkgeworICAgIE5ld0xIUyA9IFBISU5vZGU6OkNyZWF0ZShMSFNUeXBlKTsKKyAgICBOZXdMSFMtPnJlc2VydmVPcGVyYW5kU3BhY2UoUE4uZ2V0TnVtT3BlcmFuZHMoKS8yKTsKKyAgICBOZXdMSFMtPmFkZEluY29taW5nKEluTEhTLCBQTi5nZXRJbmNvbWluZ0Jsb2NrKDApKTsKKyAgICBJbnNlcnROZXdJbnN0QmVmb3JlKE5ld0xIUywgUE4pOworICAgIExIU1ZhbCA9IE5ld0xIUzsKKyAgfQorICAKKyAgaWYgKFJIU1ZhbCA9PSAwKSB7CisgICAgTmV3UkhTID0gUEhJTm9kZTo6Q3JlYXRlKFJIU1R5cGUpOworICAgIE5ld1JIUy0+cmVzZXJ2ZU9wZXJhbmRTcGFjZShQTi5nZXROdW1PcGVyYW5kcygpLzIpOworICAgIE5ld1JIUy0+YWRkSW5jb21pbmcoSW5SSFMsIFBOLmdldEluY29taW5nQmxvY2soMCkpOworICAgIEluc2VydE5ld0luc3RCZWZvcmUoTmV3UkhTLCBQTik7CisgICAgUkhTVmFsID0gTmV3UkhTOworICB9CisgIAorICAvLyBBZGQgYWxsIG9wZXJhbmRzIHRvIHRoZSBuZXcgUEhJcy4KKyAgaWYgKE5ld0xIUyB8fCBOZXdSSFMpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gUE4uZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEluc3RydWN0aW9uICpJbkluc3QgPSBjYXN0PEluc3RydWN0aW9uPihQTi5nZXRJbmNvbWluZ1ZhbHVlKGkpKTsKKyAgICAgIGlmIChOZXdMSFMpIHsKKyAgICAgICAgVmFsdWUgKk5ld0luTEhTID0gSW5JbnN0LT5nZXRPcGVyYW5kKDApOworICAgICAgICBOZXdMSFMtPmFkZEluY29taW5nKE5ld0luTEhTLCBQTi5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgICAgIH0KKyAgICAgIGlmIChOZXdSSFMpIHsKKyAgICAgICAgVmFsdWUgKk5ld0luUkhTID0gSW5JbnN0LT5nZXRPcGVyYW5kKDEpOworICAgICAgICBOZXdSSFMtPmFkZEluY29taW5nKE5ld0luUkhTLCBQTi5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgICAKKyAgaWYgKEJpbmFyeU9wZXJhdG9yICpCaW5PcCA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihGaXJzdEluc3QpKQorICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEJpbk9wLT5nZXRPcGNvZGUoKSwgTEhTVmFsLCBSSFNWYWwpOworICBDbXBJbnN0ICpDSU9wID0gY2FzdDxDbXBJbnN0PihGaXJzdEluc3QpOworICByZXR1cm4gQ21wSW5zdDo6Q3JlYXRlKENJT3AtPmdldE9wY29kZSgpLCBDSU9wLT5nZXRQcmVkaWNhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMSFNWYWwsIFJIU1ZhbCk7Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OkZvbGRQSElBcmdHRVBJbnRvUEhJKFBISU5vZGUgJlBOKSB7CisgIEdldEVsZW1lbnRQdHJJbnN0ICpGaXJzdEluc3QgPWNhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KFBOLmdldEluY29taW5nVmFsdWUoMCkpOworICAKKyAgU21hbGxWZWN0b3I8VmFsdWUqLCAxNj4gRml4ZWRPcGVyYW5kcyhGaXJzdEluc3QtPm9wX2JlZ2luKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0SW5zdC0+b3BfZW5kKCkpOworICAvLyBUaGlzIGlzIHRydWUgaWYgYWxsIEdFUCBiYXNlcyBhcmUgYWxsb2NhcyBhbmQgaWYgYWxsIGluZGljZXMgaW50byB0aGVtIGFyZQorICAvLyBjb25zdGFudHMuCisgIGJvb2wgQWxsQmFzZVBvaW50ZXJzQXJlQWxsb2NhcyA9IHRydWU7CisKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byByZXBsYWNlIHRoaXMgcGhpIGlmIHRoZSByZXBsYWNlbWVudCB3b3VsZCByZXF1aXJlCisgIC8vIG1vcmUgdGhhbiBvbmUgcGhpLCB3aGljaCBsZWFkcyB0byBoaWdoZXIgcmVnaXN0ZXIgcHJlc3N1cmUuIFRoaXMgaXMKKyAgLy8gZXNwZWNpYWxseSBiYWQgd2hlbiB0aGUgUEhJcyBhcmUgaW4gdGhlIGhlYWRlciBvZiBhIGxvb3AuCisgIGJvb2wgTmVlZGVkUGhpID0gZmFsc2U7CisgIAorICAvLyBTY2FuIHRvIHNlZSBpZiBhbGwgb3BlcmFuZHMgYXJlIHRoZSBzYW1lIG9wY29kZSwgYW5kIGFsbCBoYXZlIG9uZSB1c2UuCisgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgIT0gUE4uZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgKytpKSB7CisgICAgR2V0RWxlbWVudFB0ckluc3QgKkdFUD0gZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KFBOLmdldEluY29taW5nVmFsdWUoaSkpOworICAgIGlmICghR0VQIHx8ICFHRVAtPmhhc09uZVVzZSgpIHx8IEdFUC0+Z2V0VHlwZSgpICE9IEZpcnN0SW5zdC0+Z2V0VHlwZSgpIHx8CisgICAgICBHRVAtPmdldE51bU9wZXJhbmRzKCkgIT0gRmlyc3RJbnN0LT5nZXROdW1PcGVyYW5kcygpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IGFsbCBHRVBzIGFyZSBvZiBhbGxvY2EgcG9pbnRlcnMuCisgICAgaWYgKEFsbEJhc2VQb2ludGVyc0FyZUFsbG9jYXMgJiYKKyAgICAgICAgKCFpc2E8QWxsb2NhSW5zdD4oR0VQLT5nZXRPcGVyYW5kKDApKSB8fAorICAgICAgICAgIUdFUC0+aGFzQWxsQ29uc3RhbnRJbmRpY2VzKCkpKQorICAgICAgQWxsQmFzZVBvaW50ZXJzQXJlQWxsb2NhcyA9IGZhbHNlOworICAgIAorICAgIC8vIENvbXBhcmUgdGhlIG9wZXJhbmQgbGlzdHMuCisgICAgZm9yICh1bnNpZ25lZCBvcCA9IDAsIGUgPSBGaXJzdEluc3QtPmdldE51bU9wZXJhbmRzKCk7IG9wICE9IGU7ICsrb3ApIHsKKyAgICAgIGlmIChGaXJzdEluc3QtPmdldE9wZXJhbmQob3ApID09IEdFUC0+Z2V0T3BlcmFuZChvcCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBEb24ndCBtZXJnZSB0d28gR0VQcyB3aGVuIHR3byBvcGVyYW5kcyBkaWZmZXIgKGludHJvZHVjaW5nIHBoaSBub2RlcykKKyAgICAgIC8vIGlmIG9uZSBvZiB0aGUgUEhJcyBoYXMgYSBjb25zdGFudCBmb3IgdGhlIGluZGV4LiAgVGhlIGluZGV4IG1heSBiZQorICAgICAgLy8gc3Vic3RhbnRpYWxseSBjaGVhcGVyIHRvIGNvbXB1dGUgZm9yIHRoZSBjb25zdGFudHMsIHNvIG1ha2luZyBpdCBhCisgICAgICAvLyB2YXJpYWJsZSBpbmRleCBjb3VsZCBwZXNzaW1pemUgdGhlIHBhdGguICBUaGlzIGFsc28gaGFuZGxlcyB0aGUgY2FzZQorICAgICAgLy8gZm9yIHN0cnVjdCBpbmRpY2VzLCB3aGljaCBtdXN0IGFsd2F5cyBiZSBjb25zdGFudC4KKyAgICAgIGlmIChpc2E8Q29uc3RhbnRJbnQ+KEZpcnN0SW5zdC0+Z2V0T3BlcmFuZChvcCkpIHx8CisgICAgICAgICAgaXNhPENvbnN0YW50SW50PihHRVAtPmdldE9wZXJhbmQob3ApKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAKKyAgICAgIGlmIChGaXJzdEluc3QtPmdldE9wZXJhbmQob3ApLT5nZXRUeXBlKCkgIT1HRVAtPmdldE9wZXJhbmQob3ApLT5nZXRUeXBlKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgICAvLyBJZiB3ZSBhbHJlYWR5IG5lZWRlZCBhIFBISSBmb3IgYW4gZWFybGllciBvcGVyYW5kLCBhbmQgYW5vdGhlciBvcGVyYW5kCisgICAgICAvLyBhbHNvIHJlcXVpcmVzIGEgUEhJLCB3ZSdkIGJlIGludHJvZHVjaW5nIG1vcmUgUEhJcyB0aGFuIHdlJ3JlCisgICAgICAvLyBlbGltaW5hdGluZywgd2hpY2ggaW5jcmVhc2VzIHJlZ2lzdGVyIHByZXNzdXJlIG9uIGVudHJ5IHRvIHRoZSBQSEkncworICAgICAgLy8gYmxvY2suCisgICAgICBpZiAoTmVlZGVkUGhpKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgRml4ZWRPcGVyYW5kc1tvcF0gPSAwOyAgLy8gTmVlZHMgYSBQSEkuCisgICAgICBOZWVkZWRQaGkgPSB0cnVlOworICAgIH0KKyAgfQorICAKKyAgLy8gSWYgYWxsIG9mIHRoZSBiYXNlIHBvaW50ZXJzIG9mIHRoZSBQSEknZCBHRVBzIGFyZSBmcm9tIGFsbG9jYXMsIGRvbid0CisgIC8vIGJvdGhlciBkb2luZyB0aGlzIHRyYW5zZm9ybWF0aW9uLiAgQXQgYmVzdCwgdGhpcyB3aWxsIGp1c3Qgc2F2ZSBhIGJpdCBvZgorICAvLyBvZmZzZXQgY2FsY3VsYXRpb24sIGJ1dCBhbGwgdGhlIHByZWRlY2Vzc29ycyB3aWxsIGhhdmUgdG8gbWF0ZXJpYWxpemUgdGhlCisgIC8vIHN0YWNrIGFkZHJlc3MgaW50byBhIHJlZ2lzdGVyIGFueXdheS4gIFdlJ2QgYWN0dWFsbHkgcmF0aGVyICpjbG9uZSogdGhlCisgIC8vIGxvYWQgdXAgaW50byB0aGUgcHJlZGVjZXNzb3JzIHNvIHRoYXQgd2UgaGF2ZSBhIGxvYWQgb2YgYSBnZXAgb2YgYW4gYWxsb2NhLAorICAvLyB3aGljaCBjYW4gdXN1YWxseSBhbGwgYmUgZm9sZGVkIGludG8gdGhlIGxvYWQuCisgIGlmIChBbGxCYXNlUG9pbnRlcnNBcmVBbGxvY2FzKQorICAgIHJldHVybiAwOworICAKKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIHNhZmUgdG8gdHJhbnNmb3JtLiAgSW5zZXJ0IFBISSBub2RlcyBmb3IgZWFjaCBvcGVyYW5kCisgIC8vIHRoYXQgaXMgdmFyaWFibGUuCisgIFNtYWxsVmVjdG9yPFBISU5vZGUqLCAxNj4gT3BlcmFuZFBoaXMoRml4ZWRPcGVyYW5kcy5zaXplKCkpOworICAKKyAgYm9vbCBIYXNBbnlQSElzID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGaXhlZE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoRml4ZWRPcGVyYW5kc1tpXSkgY29udGludWU7ICAvLyBvcGVyYW5kIGRvZXNuJ3QgbmVlZCBhIHBoaS4KKyAgICBWYWx1ZSAqRmlyc3RPcCA9IEZpcnN0SW5zdC0+Z2V0T3BlcmFuZChpKTsKKyAgICBQSElOb2RlICpOZXdQTiA9IFBISU5vZGU6OkNyZWF0ZShGaXJzdE9wLT5nZXRUeXBlKCkpOworICAgIEluc2VydE5ld0luc3RCZWZvcmUoTmV3UE4sIFBOKTsKKyAgICAKKyAgICBOZXdQTi0+cmVzZXJ2ZU9wZXJhbmRTcGFjZShlKTsKKyAgICBOZXdQTi0+YWRkSW5jb21pbmcoRmlyc3RPcCwgUE4uZ2V0SW5jb21pbmdCbG9jaygwKSk7CisgICAgT3BlcmFuZFBoaXNbaV0gPSBOZXdQTjsKKyAgICBGaXhlZE9wZXJhbmRzW2ldID0gTmV3UE47CisgICAgSGFzQW55UEhJcyA9IHRydWU7CisgIH0KKworICAKKyAgLy8gQWRkIGFsbCBvcGVyYW5kcyB0byB0aGUgbmV3IFBISXMuCisgIGlmIChIYXNBbnlQSElzKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFBOLmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBHZXRFbGVtZW50UHRySW5zdCAqSW5HRVAgPWNhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KFBOLmdldEluY29taW5nVmFsdWUoaSkpOworICAgICAgQmFzaWNCbG9jayAqSW5CQiA9IFBOLmdldEluY29taW5nQmxvY2soaSk7CisgICAgICAKKyAgICAgIGZvciAodW5zaWduZWQgb3AgPSAwLCBlID0gT3BlcmFuZFBoaXMuc2l6ZSgpOyBvcCAhPSBlOyArK29wKQorICAgICAgICBpZiAoUEhJTm9kZSAqT3BQaGkgPSBPcGVyYW5kUGhpc1tvcF0pCisgICAgICAgICAgT3BQaGktPmFkZEluY29taW5nKEluR0VQLT5nZXRPcGVyYW5kKG9wKSwgSW5CQik7CisgICAgfQorICB9CisgIAorICBWYWx1ZSAqQmFzZSA9IEZpeGVkT3BlcmFuZHNbMF07CisgIHJldHVybiBjYXN0PEdFUE9wZXJhdG9yPihGaXJzdEluc3QpLT5pc0luQm91bmRzKCkgPworICAgIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhCYXNlLCBGaXhlZE9wZXJhbmRzLmJlZ2luKCkrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRPcGVyYW5kcy5lbmQoKSkgOgorICAgIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoQmFzZSwgRml4ZWRPcGVyYW5kcy5iZWdpbigpKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZE9wZXJhbmRzLmVuZCgpKTsKK30KKworCisvLy8gaXNTYWZlQW5kUHJvZml0YWJsZVRvU2lua0xvYWQgLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBrbm93IHRoYXQgaXQgaXMgc2FmZSB0bworLy8vIHNpbmsgdGhlIGxvYWQgb3V0IG9mIHRoZSBibG9jayB0aGF0IGRlZmluZXMgaXQuICBUaGlzIG1lYW5zIHRoYXQgaXQgbXVzdCBiZQorLy8vIG9idmlvdXMgdGhlIHZhbHVlIG9mIHRoZSBsb2FkIGlzIG5vdCBjaGFuZ2VkIGZyb20gdGhlIHBvaW50IG9mIHRoZSBsb2FkIHRvCisvLy8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgaXQgaXMgaW4uCisvLy8KKy8vLyBGaW5hbGx5LCBpdCBpcyBzYWZlLCBidXQgbm90IHByb2ZpdGFibGUsIHRvIHNpbmsgYSBsb2FkIHRhcmdldHRpbmcgYQorLy8vIG5vbi1hZGRyZXNzLXRha2VuIGFsbG9jYS4gIERvaW5nIHNvIHdpbGwgY2F1c2UgdXMgdG8gbm90IHByb21vdGUgdGhlIGFsbG9jYQorLy8vIHRvIGEgcmVnaXN0ZXIuCitzdGF0aWMgYm9vbCBpc1NhZmVBbmRQcm9maXRhYmxlVG9TaW5rTG9hZChMb2FkSW5zdCAqTCkgeworICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSBMLCBFID0gTC0+Z2V0UGFyZW50KCktPmVuZCgpOworICAKKyAgZm9yICgrK0JCSTsgQkJJICE9IEU7ICsrQkJJKQorICAgIGlmIChCQkktPm1heVdyaXRlVG9NZW1vcnkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIENoZWNrIGZvciBub24tYWRkcmVzcyB0YWtlbiBhbGxvY2EuICBJZiBub3QgYWRkcmVzcy10YWtlbiBhbHJlYWR5LCBpdCBpc24ndAorICAvLyBwcm9maXRhYmxlIHRvIGRvIHRoaXMgeGZvcm0uCisgIGlmIChBbGxvY2FJbnN0ICpBSSA9IGR5bl9jYXN0PEFsbG9jYUluc3Q+KEwtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgYm9vbCBpc0FkZHJlc3NUYWtlbiA9IGZhbHNlOworICAgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEFJLT51c2VfYmVnaW4oKSwgRSA9IEFJLT51c2VfZW5kKCk7CisgICAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgICBVc2VyICpVID0gKlVJOworICAgICAgaWYgKGlzYTxMb2FkSW5zdD4oVSkpIGNvbnRpbnVlOworICAgICAgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFUpKSB7CisgICAgICAgIC8vIElmIHN0b3JpbmcgVE8gdGhlIGFsbG9jYSwgdGhlbiB0aGUgYWRkcmVzcyBpc24ndCB0YWtlbi4KKyAgICAgICAgaWYgKFNJLT5nZXRPcGVyYW5kKDEpID09IEFJKSBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlzQWRkcmVzc1Rha2VuID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBpZiAoIWlzQWRkcmVzc1Rha2VuICYmIEFJLT5pc1N0YXRpY0FsbG9jYSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLyBJZiB0aGlzIGxvYWQgaXMgYSBsb2FkIGZyb20gYSBHRVAgd2l0aCBhIGNvbnN0YW50IG9mZnNldCBmcm9tIGFuIGFsbG9jYSwKKyAgLy8gdGhlbiB3ZSBkb24ndCB3YW50IHRvIHNpbmsgaXQuICBJbiBpdHMgcHJlc2VudCBmb3JtLCBpdCB3aWxsIGJlCisgIC8vIGxvYWQgW2NvbnN0YW50IHN0YWNrIG9mZnNldF0uICBTaW5raW5nIGl0IHdpbGwgY2F1c2UgdXMgdG8gaGF2ZSB0bworICAvLyBtYXRlcmlhbGl6ZSB0aGUgc3RhY2sgYWRkcmVzc2VzIGluIGVhY2ggcHJlZGVjZXNzb3IgaW4gYSByZWdpc3RlciBvbmx5IHRvCisgIC8vIGRvIGEgc2hhcmVkIGxvYWQgZnJvbSByZWdpc3RlciBpbiB0aGUgc3VjY2Vzc29yLgorICBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUCA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihMLT5nZXRPcGVyYW5kKDApKSkKKyAgICBpZiAoQWxsb2NhSW5zdCAqQUkgPSBkeW5fY2FzdDxBbGxvY2FJbnN0PihHRVAtPmdldE9wZXJhbmQoMCkpKQorICAgICAgaWYgKEFJLT5pc1N0YXRpY0FsbG9jYSgpICYmIEdFUC0+aGFzQWxsQ29uc3RhbnRJbmRpY2VzKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgCisgIHJldHVybiB0cnVlOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjpGb2xkUEhJQXJnTG9hZEludG9QSEkoUEhJTm9kZSAmUE4pIHsKKyAgTG9hZEluc3QgKkZpcnN0TEkgPSBjYXN0PExvYWRJbnN0PihQTi5nZXRJbmNvbWluZ1ZhbHVlKDApKTsKKyAgCisgIC8vIFdoZW4gcHJvY2Vzc2luZyBsb2Fkcywgd2UgbmVlZCB0byBwcm9wYWdhdGUgdHdvIGJpdHMgb2YgaW5mb3JtYXRpb24gdG8gdGhlCisgIC8vIHN1bmsgbG9hZDogd2hldGhlciBpdCBpcyB2b2xhdGlsZSwgYW5kIHdoYXQgaXRzIGFsaWdubWVudCBpcy4gIFdlIGN1cnJlbnRseQorICAvLyBkb24ndCBzaW5rIGxvYWRzIHdoZW4gc29tZSBoYXZlIHRoZWlyIGFsaWdubWVudCBzcGVjaWZpZWQgYW5kIHNvbWUgZG9uJ3QuCisgIC8vIHZpc2l0TG9hZEluc3Qgd2lsbCBwcm9wYWdhdGUgYW4gYWxpZ25tZW50IG9udG8gdGhlIGxvYWQgd2hlbiBURCBpcyBhcm91bmQsCisgIC8vIGFuZCBpZiBURCBpc24ndCBhcm91bmQsIHdlIGNhbid0IGhhbmRsZSB0aGUgbWl4ZWQgY2FzZS4KKyAgYm9vbCBpc1ZvbGF0aWxlID0gRmlyc3RMSS0+aXNWb2xhdGlsZSgpOworICB1bnNpZ25lZCBMb2FkQWxpZ25tZW50ID0gRmlyc3RMSS0+Z2V0QWxpZ25tZW50KCk7CisgIHVuc2lnbmVkIExvYWRBZGRyU3BhY2UgPSBGaXJzdExJLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCk7CisgIAorICAvLyBXZSBjYW4ndCBzaW5rIHRoZSBsb2FkIGlmIHRoZSBsb2FkZWQgdmFsdWUgY291bGQgYmUgbW9kaWZpZWQgYmV0d2VlbiB0aGUKKyAgLy8gbG9hZCBhbmQgdGhlIFBISS4KKyAgaWYgKEZpcnN0TEktPmdldFBhcmVudCgpICE9IFBOLmdldEluY29taW5nQmxvY2soMCkgfHwKKyAgICAgICFpc1NhZmVBbmRQcm9maXRhYmxlVG9TaW5rTG9hZChGaXJzdExJKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIElmIHRoZSBQSEkgaXMgb2Ygdm9sYXRpbGUgbG9hZHMgYW5kIHRoZSBsb2FkIGJsb2NrIGhhcyBtdWx0aXBsZQorICAvLyBzdWNjZXNzb3JzLCBzaW5raW5nIGl0IHdvdWxkIHJlbW92ZSBhIGxvYWQgb2YgdGhlIHZvbGF0aWxlIHZhbHVlIGZyb20KKyAgLy8gdGhlIHBhdGggdGhyb3VnaCB0aGUgb3RoZXIgc3VjY2Vzc29yLgorICBpZiAoaXNWb2xhdGlsZSAmJiAKKyAgICAgIEZpcnN0TEktPmdldFBhcmVudCgpLT5nZXRUZXJtaW5hdG9yKCktPmdldE51bVN1Y2Nlc3NvcnMoKSAhPSAxKQorICAgIHJldHVybiAwOworICAKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFsbCBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIG9wZXJhdGlvbi4KKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFBOLmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFBOLmdldEluY29taW5nVmFsdWUoaSkpOworICAgIGlmICghTEkgfHwgIUxJLT5oYXNPbmVVc2UoKSkKKyAgICAgIHJldHVybiAwOworICAgIAorICAgIC8vIFdlIGNhbid0IHNpbmsgdGhlIGxvYWQgaWYgdGhlIGxvYWRlZCB2YWx1ZSBjb3VsZCBiZSBtb2RpZmllZCBiZXR3ZWVuIAorICAgIC8vIHRoZSBsb2FkIGFuZCB0aGUgUEhJLgorICAgIGlmIChMSS0+aXNWb2xhdGlsZSgpICE9IGlzVm9sYXRpbGUgfHwKKyAgICAgICAgTEktPmdldFBhcmVudCgpICE9IFBOLmdldEluY29taW5nQmxvY2soaSkgfHwKKyAgICAgICAgTEktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSAhPSBMb2FkQWRkclNwYWNlIHx8CisgICAgICAgICFpc1NhZmVBbmRQcm9maXRhYmxlVG9TaW5rTG9hZChMSSkpCisgICAgICByZXR1cm4gMDsKKyAgICAgIAorICAgIC8vIElmIHNvbWUgb2YgdGhlIGxvYWRzIGhhdmUgYW4gYWxpZ25tZW50IHNwZWNpZmllZCBidXQgbm90IGFsbCBvZiB0aGVtLAorICAgIC8vIHdlIGNhbid0IGRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICBpZiAoKExvYWRBbGlnbm1lbnQgIT0gMCkgIT0gKExJLT5nZXRBbGlnbm1lbnQoKSAhPSAwKSkKKyAgICAgIHJldHVybiAwOworICAgIAorICAgIExvYWRBbGlnbm1lbnQgPSBzdGQ6Om1pbihMb2FkQWxpZ25tZW50LCBMSS0+Z2V0QWxpZ25tZW50KCkpOworICAgIAorICAgIC8vIElmIHRoZSBQSEkgaXMgb2Ygdm9sYXRpbGUgbG9hZHMgYW5kIHRoZSBsb2FkIGJsb2NrIGhhcyBtdWx0aXBsZQorICAgIC8vIHN1Y2Nlc3NvcnMsIHNpbmtpbmcgaXQgd291bGQgcmVtb3ZlIGEgbG9hZCBvZiB0aGUgdm9sYXRpbGUgdmFsdWUgZnJvbQorICAgIC8vIHRoZSBwYXRoIHRocm91Z2ggdGhlIG90aGVyIHN1Y2Nlc3Nvci4KKyAgICBpZiAoaXNWb2xhdGlsZSAmJgorICAgICAgICBMSS0+Z2V0UGFyZW50KCktPmdldFRlcm1pbmF0b3IoKS0+Z2V0TnVtU3VjY2Vzc29ycygpICE9IDEpCisgICAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgLy8gT2theSwgdGhleSBhcmUgYWxsIHRoZSBzYW1lIG9wZXJhdGlvbi4gIENyZWF0ZSBhIG5ldyBQSEkgbm9kZSBvZiB0aGUKKyAgLy8gY29ycmVjdCB0eXBlLCBhbmQgUEhJIHRvZ2V0aGVyIGFsbCBvZiB0aGUgTEhTJ3Mgb2YgdGhlIGluc3RydWN0aW9ucy4KKyAgUEhJTm9kZSAqTmV3UE4gPSBQSElOb2RlOjpDcmVhdGUoRmlyc3RMSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKTsKKyAgTmV3UE4tPnJlc2VydmVPcGVyYW5kU3BhY2UoUE4uZ2V0TnVtT3BlcmFuZHMoKS8yKTsKKyAgCisgIFZhbHVlICpJblZhbCA9IEZpcnN0TEktPmdldE9wZXJhbmQoMCk7CisgIE5ld1BOLT5hZGRJbmNvbWluZyhJblZhbCwgUE4uZ2V0SW5jb21pbmdCbG9jaygwKSk7CisgIAorICAvLyBBZGQgYWxsIG9wZXJhbmRzIHRvIHRoZSBuZXcgUEhJLgorICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gUE4uZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBWYWx1ZSAqTmV3SW5WYWwgPSBjYXN0PExvYWRJbnN0PihQTi5nZXRJbmNvbWluZ1ZhbHVlKGkpKS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoTmV3SW5WYWwgIT0gSW5WYWwpCisgICAgICBJblZhbCA9IDA7CisgICAgTmV3UE4tPmFkZEluY29taW5nKE5ld0luVmFsLCBQTi5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgfQorICAKKyAgVmFsdWUgKlBoaVZhbDsKKyAgaWYgKEluVmFsKSB7CisgICAgLy8gVGhlIG5ldyBQSEkgdW5pb25zIGFsbCBvZiB0aGUgc2FtZSB2YWx1ZXMgdG9nZXRoZXIuICBUaGlzIGlzIHJlYWxseQorICAgIC8vIGNvbW1vbiwgc28gd2UgaGFuZGxlIGl0IGludGVsbGlnZW50bHkgaGVyZSBmb3IgY29tcGlsZS10aW1lIHNwZWVkLgorICAgIFBoaVZhbCA9IEluVmFsOworICAgIGRlbGV0ZSBOZXdQTjsKKyAgfSBlbHNlIHsKKyAgICBJbnNlcnROZXdJbnN0QmVmb3JlKE5ld1BOLCBQTik7CisgICAgUGhpVmFsID0gTmV3UE47CisgIH0KKyAgCisgIC8vIElmIHRoaXMgd2FzIGEgdm9sYXRpbGUgbG9hZCB0aGF0IHdlIGFyZSBtZXJnaW5nLCBtYWtlIHN1cmUgdG8gbG9vcCB0aHJvdWdoCisgIC8vIGFuZCBtYXJrIGFsbCB0aGUgaW5wdXQgbG9hZHMgYXMgbm9uLXZvbGF0aWxlLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2Ugd2lsbAorICAvLyBpbnNlcnQgYSBuZXcgdm9sYXRpbGUgbG9hZCBhbmQgdGhlIG9sZCBvbmVzIHdpbGwgbm90IGJlIGRlbGV0YWJsZS4KKyAgaWYgKGlzVm9sYXRpbGUpCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgY2FzdDxMb2FkSW5zdD4oUE4uZ2V0SW5jb21pbmdWYWx1ZShpKSktPnNldFZvbGF0aWxlKGZhbHNlKTsKKyAgCisgIHJldHVybiBuZXcgTG9hZEluc3QoUGhpVmFsLCBpc1ZvbGF0aWxlLCBMb2FkQWxpZ25tZW50KTsKK30KKworCisKKy8vLyBGb2xkUEhJQXJnT3BJbnRvUEhJIC0gSWYgYWxsIG9wZXJhbmRzIHRvIGEgUEhJIG5vZGUgYXJlIHRoZSBzYW1lICJ1bmFyeSIKKy8vLyBvcGVyYXRvciBhbmQgdGhleSBhbGwgYXJlIG9ubHkgdXNlZCBieSB0aGUgUEhJLCBQSEkgdG9nZXRoZXIgdGhlaXIKKy8vLyBpbnB1dHMsIGFuZCBkbyB0aGUgb3BlcmF0aW9uIG9uY2UsIHRvIHRoZSByZXN1bHQgb2YgdGhlIFBISS4KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OkZvbGRQSElBcmdPcEludG9QSEkoUEhJTm9kZSAmUE4pIHsKKyAgSW5zdHJ1Y3Rpb24gKkZpcnN0SW5zdCA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KFBOLmdldEluY29taW5nVmFsdWUoMCkpOworCisgIGlmIChpc2E8R2V0RWxlbWVudFB0ckluc3Q+KEZpcnN0SW5zdCkpCisgICAgcmV0dXJuIEZvbGRQSElBcmdHRVBJbnRvUEhJKFBOKTsKKyAgaWYgKGlzYTxMb2FkSW5zdD4oRmlyc3RJbnN0KSkKKyAgICByZXR1cm4gRm9sZFBISUFyZ0xvYWRJbnRvUEhJKFBOKTsKKyAgCisgIC8vIFNjYW4gdGhlIGluc3RydWN0aW9uLCBsb29raW5nIGZvciBpbnB1dCBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIGZvbGRlZCBhd2F5LgorICAvLyBJZiBhbGwgaW5wdXQgb3BlcmFuZHMgdG8gdGhlIHBoaSBhcmUgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gKGUuZy4gYSBjYXN0IGZyb20KKyAgLy8gdGhlIHNhbWUgdHlwZSBvciAiKzQyIikgd2UgY2FuIHB1bGwgdGhlIG9wZXJhdGlvbiB0aHJvdWdoIHRoZSBQSEksIHJlZHVjaW5nCisgIC8vIGNvZGUgc2l6ZSBhbmQgc2ltcGxpZnlpbmcgY29kZS4KKyAgQ29uc3RhbnQgKkNvbnN0YW50T3AgPSAwOworICBjb25zdCBUeXBlICpDYXN0U3JjVHkgPSAwOworICAKKyAgaWYgKGlzYTxDYXN0SW5zdD4oRmlyc3RJbnN0KSkgeworICAgIENhc3RTcmNUeSA9IEZpcnN0SW5zdC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpOworCisgICAgLy8gQmUgY2FyZWZ1bCBhYm91dCB0cmFuc2Zvcm1pbmcgaW50ZWdlciBQSElzLiAgV2UgZG9uJ3Qgd2FudCB0byBwZXNzaW1pemUKKyAgICAvLyB0aGUgY29kZSBieSB0dXJuaW5nIGFuIGkzMiBpbnRvIGFuIGkxMjkzLgorICAgIGlmIChQTi5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkgJiYgQ2FzdFNyY1R5LT5pc0ludGVnZXJUeSgpKSB7CisgICAgICBpZiAoIVNob3VsZENoYW5nZVR5cGUoUE4uZ2V0VHlwZSgpLCBDYXN0U3JjVHkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSBpZiAoaXNhPEJpbmFyeU9wZXJhdG9yPihGaXJzdEluc3QpIHx8IGlzYTxDbXBJbnN0PihGaXJzdEluc3QpKSB7CisgICAgLy8gQ2FuIGZvbGQgYmlub3AsIGNvbXBhcmUgb3Igc2hpZnQgaGVyZSBpZiB0aGUgUkhTIGlzIGEgY29uc3RhbnQsIAorICAgIC8vIG90aGVyd2lzZSBjYWxsIEZvbGRQSElBcmdCaW5PcEludG9QSEkuCisgICAgQ29uc3RhbnRPcCA9IGR5bl9jYXN0PENvbnN0YW50PihGaXJzdEluc3QtPmdldE9wZXJhbmQoMSkpOworICAgIGlmIChDb25zdGFudE9wID09IDApCisgICAgICByZXR1cm4gRm9sZFBISUFyZ0Jpbk9wSW50b1BISShQTik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7ICAvLyBDYW5ub3QgZm9sZCB0aGlzIG9wZXJhdGlvbi4KKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiBhbGwgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBvcGVyYXRpb24uCisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBQTi5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgIEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFBOLmdldEluY29taW5nVmFsdWUoaSkpOworICAgIGlmIChJID09IDAgfHwgIUktPmhhc09uZVVzZSgpIHx8ICFJLT5pc1NhbWVPcGVyYXRpb25BcyhGaXJzdEluc3QpKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKENhc3RTcmNUeSkgeworICAgICAgaWYgKEktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSAhPSBDYXN0U3JjVHkpCisgICAgICAgIHJldHVybiAwOyAgLy8gQ2FzdCBvcGVyYXRpb24gbXVzdCBtYXRjaC4KKyAgICB9IGVsc2UgaWYgKEktPmdldE9wZXJhbmQoMSkgIT0gQ29uc3RhbnRPcCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgLy8gT2theSwgdGhleSBhcmUgYWxsIHRoZSBzYW1lIG9wZXJhdGlvbi4gIENyZWF0ZSBhIG5ldyBQSEkgbm9kZSBvZiB0aGUKKyAgLy8gY29ycmVjdCB0eXBlLCBhbmQgUEhJIHRvZ2V0aGVyIGFsbCBvZiB0aGUgTEhTJ3Mgb2YgdGhlIGluc3RydWN0aW9ucy4KKyAgUEhJTm9kZSAqTmV3UE4gPSBQSElOb2RlOjpDcmVhdGUoRmlyc3RJbnN0LT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpOworICBOZXdQTi0+cmVzZXJ2ZU9wZXJhbmRTcGFjZShQTi5nZXROdW1PcGVyYW5kcygpLzIpOworCisgIFZhbHVlICpJblZhbCA9IEZpcnN0SW5zdC0+Z2V0T3BlcmFuZCgwKTsKKyAgTmV3UE4tPmFkZEluY29taW5nKEluVmFsLCBQTi5nZXRJbmNvbWluZ0Jsb2NrKDApKTsKKworICAvLyBBZGQgYWxsIG9wZXJhbmRzIHRvIHRoZSBuZXcgUEhJLgorICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gUE4uZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBWYWx1ZSAqTmV3SW5WYWwgPSBjYXN0PEluc3RydWN0aW9uPihQTi5nZXRJbmNvbWluZ1ZhbHVlKGkpKS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoTmV3SW5WYWwgIT0gSW5WYWwpCisgICAgICBJblZhbCA9IDA7CisgICAgTmV3UE4tPmFkZEluY29taW5nKE5ld0luVmFsLCBQTi5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgfQorCisgIFZhbHVlICpQaGlWYWw7CisgIGlmIChJblZhbCkgeworICAgIC8vIFRoZSBuZXcgUEhJIHVuaW9ucyBhbGwgb2YgdGhlIHNhbWUgdmFsdWVzIHRvZ2V0aGVyLiAgVGhpcyBpcyByZWFsbHkKKyAgICAvLyBjb21tb24sIHNvIHdlIGhhbmRsZSBpdCBpbnRlbGxpZ2VudGx5IGhlcmUgZm9yIGNvbXBpbGUtdGltZSBzcGVlZC4KKyAgICBQaGlWYWwgPSBJblZhbDsKKyAgICBkZWxldGUgTmV3UE47CisgIH0gZWxzZSB7CisgICAgSW5zZXJ0TmV3SW5zdEJlZm9yZShOZXdQTiwgUE4pOworICAgIFBoaVZhbCA9IE5ld1BOOworICB9CisKKyAgLy8gSW5zZXJ0IGFuZCByZXR1cm4gdGhlIG5ldyBvcGVyYXRpb24uCisgIGlmIChDYXN0SW5zdCAqRmlyc3RDSSA9IGR5bl9jYXN0PENhc3RJbnN0PihGaXJzdEluc3QpKQorICAgIHJldHVybiBDYXN0SW5zdDo6Q3JlYXRlKEZpcnN0Q0ktPmdldE9wY29kZSgpLCBQaGlWYWwsIFBOLmdldFR5cGUoKSk7CisgIAorICBpZiAoQmluYXJ5T3BlcmF0b3IgKkJpbk9wID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KEZpcnN0SW5zdCkpCisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoQmluT3AtPmdldE9wY29kZSgpLCBQaGlWYWwsIENvbnN0YW50T3ApOworICAKKyAgQ21wSW5zdCAqQ0lPcCA9IGNhc3Q8Q21wSW5zdD4oRmlyc3RJbnN0KTsKKyAgcmV0dXJuIENtcEluc3Q6OkNyZWF0ZShDSU9wLT5nZXRPcGNvZGUoKSwgQ0lPcC0+Z2V0UHJlZGljYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGhpVmFsLCBDb25zdGFudE9wKTsKK30KKworLy8vIERlYWRQSElDeWNsZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgUEhJIG5vZGUgaXMgb25seSB1c2VkIGJ5IGEgUEhJIG5vZGUgY3ljbGUKKy8vLyB0aGF0IGlzIGRlYWQuCitzdGF0aWMgYm9vbCBEZWFkUEhJQ3ljbGUoUEhJTm9kZSAqUE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8UEhJTm9kZSosIDE2PiAmUG90ZW50aWFsbHlEZWFkUEhJcykgeworICBpZiAoUE4tPnVzZV9lbXB0eSgpKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFQTi0+aGFzT25lVXNlKCkpIHJldHVybiBmYWxzZTsKKworICAvLyBSZW1lbWJlciB0aGlzIG5vZGUsIGFuZCBpZiB3ZSBmaW5kIHRoZSBjeWNsZSwgcmV0dXJuLgorICBpZiAoIVBvdGVudGlhbGx5RGVhZFBISXMuaW5zZXJ0KFBOKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisgIC8vIERvbid0IHNjYW4gY3JhemlseSBjb21wbGV4IHRoaW5ncy4KKyAgaWYgKFBvdGVudGlhbGx5RGVhZFBISXMuc2l6ZSgpID09IDE2KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoUEhJTm9kZSAqUFUgPSBkeW5fY2FzdDxQSElOb2RlPihQTi0+dXNlX2JhY2soKSkpCisgICAgcmV0dXJuIERlYWRQSElDeWNsZShQVSwgUG90ZW50aWFsbHlEZWFkUEhJcyk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUEhJc0VxdWFsVmFsdWUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBoaSBub2RlIGlzIGFsd2F5cyBlcXVhbCB0bworLy8vIE5vblBoaUluVmFsLiAgVGhpcyBoYXBwZW5zIHdpdGggbXV0dWFsbHkgY3ljbGljIHBoaSBub2RlcyBsaWtlOgorLy8vICAgeiA9IHNvbWUgdmFsdWU7IHggPSBwaGkgKHksIHopOyB5ID0gcGhpICh4LCB6KQorc3RhdGljIGJvb2wgUEhJc0VxdWFsVmFsdWUoUEhJTm9kZSAqUE4sIFZhbHVlICpOb25QaGlJblZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxQSElOb2RlKiwgMTY+ICZWYWx1ZUVxdWFsUEhJcykgeworICAvLyBTZWUgaWYgd2UgYWxyZWFkeSBzYXcgdGhpcyBQSEkgbm9kZS4KKyAgaWYgKCFWYWx1ZUVxdWFsUEhJcy5pbnNlcnQoUE4pKQorICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gRG9uJ3Qgc2NhbiBjcmF6aWx5IGNvbXBsZXggdGhpbmdzLgorICBpZiAoVmFsdWVFcXVhbFBISXMuc2l6ZSgpID09IDE2KQorICAgIHJldHVybiBmYWxzZTsKKyAKKyAgLy8gU2NhbiB0aGUgb3BlcmFuZHMgdG8gc2VlIGlmIHRoZXkgYXJlIGVpdGhlciBwaGkgbm9kZXMgb3IgYXJlIGVxdWFsIHRvCisgIC8vIHRoZSB2YWx1ZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgIFZhbHVlICpPcCA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpOworICAgIGlmIChQSElOb2RlICpPcFBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oT3ApKSB7CisgICAgICBpZiAoIVBISXNFcXVhbFZhbHVlKE9wUE4sIE5vblBoaUluVmFsLCBWYWx1ZUVxdWFsUEhJcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKE9wICE9IE5vblBoaUluVmFsKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworCituYW1lc3BhY2Ugeworc3RydWN0IFBISVVzYWdlUmVjb3JkIHsKKyAgdW5zaWduZWQgUEhJSWQ7ICAgICAvLyBUaGUgSUQgIyBvZiB0aGUgUEhJIChzb21ldGhpbmcgZGV0ZXJtaW5zdGljIHRvIHNvcnQgb24pCisgIHVuc2lnbmVkIFNoaWZ0OyAgICAgLy8gVGhlIGFtb3VudCBzaGlmdGVkLgorICBJbnN0cnVjdGlvbiAqSW5zdDsgIC8vIFRoZSB0cnVuYyBpbnN0cnVjdGlvbi4KKyAgCisgIFBISVVzYWdlUmVjb3JkKHVuc2lnbmVkIHBuLCB1bnNpZ25lZCBTaCwgSW5zdHJ1Y3Rpb24gKlVzZXIpCisgICAgOiBQSElJZChwbiksIFNoaWZ0KFNoKSwgSW5zdChVc2VyKSB7fQorICAKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUEhJVXNhZ2VSZWNvcmQgJlJIUykgY29uc3QgeworICAgIGlmIChQSElJZCA8IFJIUy5QSElJZCkgcmV0dXJuIHRydWU7CisgICAgaWYgKFBISUlkID4gUkhTLlBISUlkKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKFNoaWZ0IDwgUkhTLlNoaWZ0KSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoU2hpZnQgPiBSSFMuU2hpZnQpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gSW5zdC0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkgPAorICAgICAgICAgICBSSFMuSW5zdC0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgIH0KK307CisgIAorc3RydWN0IExvd2VyZWRQSElSZWNvcmQgeworICBQSElOb2RlICpQTjsgICAgICAgIC8vIFRoZSBQSEkgdGhhdCB3YXMgbG93ZXJlZC4KKyAgdW5zaWduZWQgU2hpZnQ7ICAgICAvLyBUaGUgYW1vdW50IHNoaWZ0ZWQuCisgIHVuc2lnbmVkIFdpZHRoOyAgICAgLy8gVGhlIHdpZHRoIGV4dHJhY3RlZC4KKyAgCisgIExvd2VyZWRQSElSZWNvcmQoUEhJTm9kZSAqcG4sIHVuc2lnbmVkIFNoLCBjb25zdCBUeXBlICpUeSkKKyAgICA6IFBOKHBuKSwgU2hpZnQoU2gpLCBXaWR0aChUeS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpKSB7fQorICAKKyAgLy8gQ3RvciBmb3JtIHVzZWQgYnkgRGVuc2VNYXAuCisgIExvd2VyZWRQSElSZWNvcmQoUEhJTm9kZSAqcG4sIHVuc2lnbmVkIFNoKQorICAgIDogUE4ocG4pLCBTaGlmdChTaCksIFdpZHRoKDApIHt9Cit9OworfQorCituYW1lc3BhY2UgbGx2bSB7CisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IERlbnNlTWFwSW5mbzxMb3dlcmVkUEhJUmVjb3JkPiB7CisgICAgc3RhdGljIGlubGluZSBMb3dlcmVkUEhJUmVjb3JkIGdldEVtcHR5S2V5KCkgeworICAgICAgcmV0dXJuIExvd2VyZWRQSElSZWNvcmQoMCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBpbmxpbmUgTG93ZXJlZFBISVJlY29yZCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgICByZXR1cm4gTG93ZXJlZFBISVJlY29yZCgwLCAxKTsKKyAgICB9CisgICAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBMb3dlcmVkUEhJUmVjb3JkICZWYWwpIHsKKyAgICAgIHJldHVybiBEZW5zZU1hcEluZm88UEhJTm9kZSo+OjpnZXRIYXNoVmFsdWUoVmFsLlBOKSBeIChWYWwuU2hpZnQ+PjMpIF4KKyAgICAgICAgICAgICAoVmFsLldpZHRoPj4zKTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBMb3dlcmVkUEhJUmVjb3JkICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb3dlcmVkUEhJUmVjb3JkICZSSFMpIHsKKyAgICAgIHJldHVybiBMSFMuUE4gPT0gUkhTLlBOICYmIExIUy5TaGlmdCA9PSBSSFMuU2hpZnQgJiYKKyAgICAgICAgICAgICBMSFMuV2lkdGggPT0gUkhTLldpZHRoOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGlzUG9kTGlrZTxMb3dlcmVkUEhJUmVjb3JkPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKK30KKworCisvLy8gU2xpY2VVcElsbGVnYWxJbnRlZ2VyUEhJIC0gVGhpcyBpcyBhbiBpbnRlZ2VyIFBISSBhbmQgd2Uga25vdyB0aGF0IGl0IGhhcyBhbgorLy8vIGlsbGVnYWwgdHlwZTogc2VlIGlmIGl0IGlzIG9ubHkgdXNlZCBieSB0cnVuYyBvciB0cnVuYyhsc2hyKSBvcGVyYXRpb25zLiAgSWYKKy8vLyBzbywgd2Ugc3BsaXQgdGhlIFBISSBpbnRvIHRoZSB2YXJpb3VzIHBpZWNlcyBiZWluZyBleHRyYWN0ZWQuICBUaGlzIHNvcnQgb2YKKy8vLyB0aGluZyBpcyBpbnRyb2R1Y2VkIHdoZW4gU1JPQSBwcm9tb3RlcyBhbiBhZ2dyZWdhdGUgdG8gbGFyZ2UgaW50ZWdlciB2YWx1ZXMuCisvLy8KKy8vLyBUT0RPOiBUaGUgdXNlciBvZiB0aGUgdHJ1bmMgbWF5IGJlIGFuIGJpdGNhc3QgdG8gZmxvYXQvZG91YmxlL3ZlY3RvciBvciBhbgorLy8vIGludHRvcHRyLiAgV2Ugc2hvdWxkIHByb2R1Y2UgbmV3IFBISXMgaW4gdGhlIHJpZ2h0IHR5cGUuCisvLy8KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OlNsaWNlVXBJbGxlZ2FsSW50ZWdlclBISShQSElOb2RlICZGaXJzdFBoaSkgeworICAvLyBQSElVc2VycyAtIEtlZXAgdHJhY2sgb2YgYWxsIG9mIHRoZSB0cnVuY2F0ZWQgdmFsdWVzIGV4dHJhY3RlZCBmcm9tIGEgc2V0CisgIC8vIG9mIFBISXMsIGFsb25nIHdpdGggdGhlaXIgb2Zmc2V0LiAgVGhlc2UgYXJlIHRoZSB0aGluZ3Mgd2Ugd2FudCB0byByZXdyaXRlLgorICBTbWFsbFZlY3RvcjxQSElVc2FnZVJlY29yZCwgMTY+IFBISVVzZXJzOworICAKKyAgLy8gUEhJcyBhcmUgb2Z0ZW4gbXV0dWFsbHkgY3ljbGljLCBzbyB3ZSBrZWVwIHRyYWNrIG9mIGEgd2hvbGUgc2V0IG9mIFBISQorICAvLyBub2RlcyB3aGljaCBhcmUgZXh0cmFjdGVkIGZyb20uIFBISXNUb1NsaWNlIGlzIGEgc2V0IHdlIHVzZSB0byBhdm9pZAorICAvLyByZXZpc2l0aW5nIFBISXMsIFBISXNJbnNwZWN0ZWQgaXMgYSBvcmRlcmVkIGxpc3Qgb2YgUEhJcyB0aGF0IHdlIG5lZWQgdG8KKyAgLy8gY2hlY2sgdGhlIHVzZXMgb2YgKHRvIGVuc3VyZSB0aGV5IGFyZSBhbGwgZXh0cmFjdHMpLgorICBTbWFsbFZlY3RvcjxQSElOb2RlKiwgOD4gUEhJc1RvU2xpY2U7CisgIFNtYWxsUHRyU2V0PFBISU5vZGUqLCA4PiBQSElzSW5zcGVjdGVkOworICAKKyAgUEhJc1RvU2xpY2UucHVzaF9iYWNrKCZGaXJzdFBoaSk7CisgIFBISXNJbnNwZWN0ZWQuaW5zZXJ0KCZGaXJzdFBoaSk7CisgIAorICBmb3IgKHVuc2lnbmVkIFBISUlkID0gMDsgUEhJSWQgIT0gUEhJc1RvU2xpY2Uuc2l6ZSgpOyArK1BISUlkKSB7CisgICAgUEhJTm9kZSAqUE4gPSBQSElzVG9TbGljZVtQSElJZF07CisgICAgCisgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gUE4tPnVzZV9iZWdpbigpLCBFID0gUE4tPnVzZV9lbmQoKTsKKyAgICAgICAgIFVJICE9IEU7ICsrVUkpIHsKKyAgICAgIEluc3RydWN0aW9uICpVc2VyID0gY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIHVzZXIgaXMgYSBQSEksIGluc3BlY3QgaXRzIHVzZXMgcmVjdXJzaXZlbHkuCisgICAgICBpZiAoUEhJTm9kZSAqVXNlclBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVXNlcikpIHsKKyAgICAgICAgaWYgKFBISXNJbnNwZWN0ZWQuaW5zZXJ0KFVzZXJQTikpCisgICAgICAgICAgUEhJc1RvU2xpY2UucHVzaF9iYWNrKFVzZXJQTik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICAvLyBUcnVuY2F0ZXMgYXJlIGFsd2F5cyBvay4KKyAgICAgIGlmIChpc2E8VHJ1bmNJbnN0PihVc2VyKSkgeworICAgICAgICBQSElVc2Vycy5wdXNoX2JhY2soUEhJVXNhZ2VSZWNvcmQoUEhJSWQsIDAsIFVzZXIpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSBpdCBtdXN0IGJlIGEgbHNociB3aGljaCBjYW4gb25seSBiZSB1c2VkIGJ5IG9uZSB0cnVuYy4KKyAgICAgIGlmIChVc2VyLT5nZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6TFNociB8fAorICAgICAgICAgICFVc2VyLT5oYXNPbmVVc2UoKSB8fCAhaXNhPFRydW5jSW5zdD4oVXNlci0+dXNlX2JhY2soKSkgfHwKKyAgICAgICAgICAhaXNhPENvbnN0YW50SW50PihVc2VyLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAKKyAgICAgIHVuc2lnbmVkIFNoaWZ0ID0gY2FzdDxDb25zdGFudEludD4oVXNlci0+Z2V0T3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpOworICAgICAgUEhJVXNlcnMucHVzaF9iYWNrKFBISVVzYWdlUmVjb3JkKFBISUlkLCBTaGlmdCwgVXNlci0+dXNlX2JhY2soKSkpOworICAgIH0KKyAgfQorICAKKyAgLy8gSWYgd2UgaGF2ZSBubyB1c2VycywgdGhleSBtdXN0IGJlIGFsbCBzZWxmIHVzZXMsIGp1c3QgbnVrZSB0aGUgUEhJLgorICBpZiAoUEhJVXNlcnMuZW1wdHkoKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChGaXJzdFBoaSwgVW5kZWZWYWx1ZTo6Z2V0KEZpcnN0UGhpLmdldFR5cGUoKSkpOworICAKKyAgLy8gSWYgdGhpcyBwaGkgbm9kZSBpcyB0cmFuc2Zvcm1hYmxlLCBjcmVhdGUgbmV3IFBISXMgZm9yIGFsbCB0aGUgcGllY2VzCisgIC8vIGV4dHJhY3RlZCBvdXQgb2YgaXQuICBGaXJzdCwgc29ydCB0aGUgdXNlcnMgYnkgdGhlaXIgb2Zmc2V0IGFuZCBzaXplLgorICBhcnJheV9wb2Rfc29ydChQSElVc2Vycy5iZWdpbigpLCBQSElVc2Vycy5lbmQoKSk7CisgIAorICBERUJVRyhlcnJzKCkgPDwgIlNMSUNJTkcgVVAgUEhJOiAiIDw8IEZpcnN0UGhpIDw8ICdcbic7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gUEhJc1RvU2xpY2Uuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICAgICAgZXJycygpIDw8ICJBTkQgVVNFUiBQSEkgIyIgPDwgaSA8PCAiOiAiIDw8ICpQSElzVG9TbGljZVtpXSA8PCdcbic7CisgICAgICAgICk7CisgIAorICAvLyBQcmVkVmFsdWVzIC0gVGhpcyBpcyBhIHRlbXBvcmFyeSB1c2VkIHdoZW4gcmV3cml0aW5nIFBISSBub2Rlcy4gIEl0IGlzCisgIC8vIGhvaXN0ZWQgb3V0IGhlcmUgdG8gYXZvaWQgY29uc3RydWN0aW9uL2Rlc3RydWN0aW9uIHRocmFzaGluZy4KKyAgRGVuc2VNYXA8QmFzaWNCbG9jayosIFZhbHVlKj4gUHJlZFZhbHVlczsKKyAgCisgIC8vIEV4dHJhY3RlZFZhbHMgLSBFYWNoIG5ldyBQSEkgd2UgaW50cm9kdWNlIGlzIHNhdmVkIGhlcmUgc28gd2UgZG9uJ3QKKyAgLy8gaW50cm9kdWNlIHJlZHVuZGFudCBQSElzLgorICBEZW5zZU1hcDxMb3dlcmVkUEhJUmVjb3JkLCBQSElOb2RlKj4gRXh0cmFjdGVkVmFsczsKKyAgCisgIGZvciAodW5zaWduZWQgVXNlckkgPSAwLCBVc2VyRSA9IFBISVVzZXJzLnNpemUoKTsgVXNlckkgIT0gVXNlckU7ICsrVXNlckkpIHsKKyAgICB1bnNpZ25lZCBQSElJZCA9IFBISVVzZXJzW1VzZXJJXS5QSElJZDsKKyAgICBQSElOb2RlICpQTiA9IFBISXNUb1NsaWNlW1BISUlkXTsKKyAgICB1bnNpZ25lZCBPZmZzZXQgPSBQSElVc2Vyc1tVc2VySV0uU2hpZnQ7CisgICAgY29uc3QgVHlwZSAqVHkgPSBQSElVc2Vyc1tVc2VySV0uSW5zdC0+Z2V0VHlwZSgpOworICAgIAorICAgIFBISU5vZGUgKkVsdFBISTsKKyAgICAKKyAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGxvd2VyZWQgYSB1c2VyIGxpa2UgdGhpcywgcmV1c2UgdGhlIHByZXZpb3VzbHkgbG93ZXJlZAorICAgIC8vIHZhbHVlLgorICAgIGlmICgoRWx0UEhJID0gRXh0cmFjdGVkVmFsc1tMb3dlcmVkUEhJUmVjb3JkKFBOLCBPZmZzZXQsIFR5KV0pID09IDApIHsKKyAgICAgIAorICAgICAgLy8gT3RoZXJ3aXNlLCBDcmVhdGUgdGhlIG5ldyBQSEkgbm9kZSBmb3IgdGhpcyB1c2VyLgorICAgICAgRWx0UEhJID0gUEhJTm9kZTo6Q3JlYXRlKFR5LCBQTik7CisgICAgICBhc3NlcnQoRWx0UEhJLT5nZXRUeXBlKCkgIT0gUE4tPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgICJUcnVuY2F0ZSBkaWRuJ3Qgc2hyaW5rIHBoaT8iKTsKKyAgICAKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgQmFzaWNCbG9jayAqUHJlZCA9IFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpOworICAgICAgICBWYWx1ZSAqJlByZWRWYWwgPSBQcmVkVmFsdWVzW1ByZWRdOworICAgICAgICAKKyAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgdmFsdWUgZm9yIHRoaXMgcHJlZGVjZXNzb3IsIHJldXNlIGl0LgorICAgICAgICBpZiAoUHJlZFZhbCkgeworICAgICAgICAgIEVsdFBISS0+YWRkSW5jb21pbmcoUHJlZFZhbCwgUHJlZCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgdGhlIFBISSBzZWxmLXJldXNlIGNhc2UuCisgICAgICAgIFZhbHVlICpJblZhbCA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpOworICAgICAgICBpZiAoSW5WYWwgPT0gUE4pIHsKKyAgICAgICAgICBQcmVkVmFsID0gRWx0UEhJOworICAgICAgICAgIEVsdFBISS0+YWRkSW5jb21pbmcoUHJlZFZhbCwgUHJlZCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChQSElOb2RlICpJblBISSA9IGR5bl9jYXN0PFBISU5vZGU+KFBOKSkgeworICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyB2YWx1ZSB3YXMgYSBQSEksIGFuZCBpZiBpdCB3YXMgb25lIG9mIHRoZSBQSElzIHdlCisgICAgICAgICAgLy8gYWxyZWFkeSByZXdyb3RlIGl0LCBqdXN0IHVzZSB0aGUgbG93ZXJlZCB2YWx1ZS4KKyAgICAgICAgICBpZiAoVmFsdWUgKlJlcyA9IEV4dHJhY3RlZFZhbHNbTG93ZXJlZFBISVJlY29yZChJblBISSwgT2Zmc2V0LCBUeSldKSB7CisgICAgICAgICAgICBQcmVkVmFsID0gUmVzOworICAgICAgICAgICAgRWx0UEhJLT5hZGRJbmNvbWluZyhQcmVkVmFsLCBQcmVkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBkbyBhbiBleHRyYWN0IGluIHRoZSBwcmVkZWNlc3Nvci4KKyAgICAgICAgQnVpbGRlci0+U2V0SW5zZXJ0UG9pbnQoUHJlZCwgUHJlZC0+Z2V0VGVybWluYXRvcigpKTsKKyAgICAgICAgVmFsdWUgKlJlcyA9IEluVmFsOworICAgICAgICBpZiAoT2Zmc2V0KQorICAgICAgICAgIFJlcyA9IEJ1aWxkZXItPkNyZWF0ZUxTaHIoUmVzLCBDb25zdGFudEludDo6Z2V0KEluVmFsLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0KSk7CisgICAgICAgIFJlcyA9IEJ1aWxkZXItPkNyZWF0ZVRydW5jKFJlcywgVHkpOworICAgICAgICBQcmVkVmFsID0gUmVzOworICAgICAgICBFbHRQSEktPmFkZEluY29taW5nKFJlcywgUHJlZCk7CisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgdmFsdWUgd2FzIGEgUEhJLCBhbmQgaWYgaXQgd2FzIG9uZSBvZiB0aGUgUEhJcyB3ZSBhcmUKKyAgICAgICAgLy8gcmV3cml0aW5nLCB3ZSB3aWxsIHVsdGltYXRlbHkgZGVsZXRlIHRoZSBjb2RlIHdlIGluc2VydGVkLiAgVGhpcworICAgICAgICAvLyBtZWFucyB3ZSBuZWVkIHRvIHJldmlzaXQgdGhhdCBQSEkgdG8gbWFrZSBzdXJlIHdlIGV4dHJhY3Qgb3V0IHRoZQorICAgICAgICAvLyBuZWVkZWQgcGllY2UuCisgICAgICAgIGlmIChQSElOb2RlICpPbGRJblZhbCA9IGR5bl9jYXN0PFBISU5vZGU+KFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpKSkKKyAgICAgICAgICBpZiAoUEhJc0luc3BlY3RlZC5jb3VudChPbGRJblZhbCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIFJlZlBISUlkID0gc3RkOjpmaW5kKFBISXNUb1NsaWNlLmJlZ2luKCksUEhJc1RvU2xpY2UuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGRJblZhbCktUEhJc1RvU2xpY2UuYmVnaW4oKTsKKyAgICAgICAgICAgIFBISVVzZXJzLnB1c2hfYmFjayhQSElVc2FnZVJlY29yZChSZWZQSElJZCwgT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PEluc3RydWN0aW9uPihSZXMpKSk7CisgICAgICAgICAgICArK1VzZXJFOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFByZWRWYWx1ZXMuY2xlYXIoKTsKKyAgICAgIAorICAgICAgREVCVUcoZXJycygpIDw8ICIgIE1hZGUgZWxlbWVudCBQSEkgZm9yIG9mZnNldCAiIDw8IE9mZnNldCA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgPDwgKkVsdFBISSA8PCAnXG4nKTsKKyAgICAgIEV4dHJhY3RlZFZhbHNbTG93ZXJlZFBISVJlY29yZChQTiwgT2Zmc2V0LCBUeSldID0gRWx0UEhJOworICAgIH0KKyAgICAKKyAgICAvLyBSZXBsYWNlIHRoZSB1c2Ugb2YgdGhpcyBwaWVjZSB3aXRoIHRoZSBQSEkgbm9kZS4KKyAgICBSZXBsYWNlSW5zdFVzZXNXaXRoKCpQSElVc2Vyc1tVc2VySV0uSW5zdCwgRWx0UEhJKTsKKyAgfQorICAKKyAgLy8gUmVwbGFjZSBhbGwgdGhlIHJlbWFpbmluZyB1c2VzIG9mIHRoZSBQSEkgbm9kZXMgKHNlbGYgdXNlcyBhbmQgdGhlIGxzaHJzKQorICAvLyB3aXRoIHVuZGVmcy4KKyAgVmFsdWUgKlVuZGVmID0gVW5kZWZWYWx1ZTo6Z2V0KEZpcnN0UGhpLmdldFR5cGUoKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBQSElzVG9TbGljZS5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFJlcGxhY2VJbnN0VXNlc1dpdGgoKlBISXNUb1NsaWNlW2ldLCBVbmRlZik7CisgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEZpcnN0UGhpLCBVbmRlZik7Cit9CisKKy8vIFBISU5vZGUgc2ltcGxpZmljYXRpb24KKy8vCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdFBISU5vZGUoUEhJTm9kZSAmUE4pIHsKKyAgLy8gSWYgTENTU0EgaXMgYXJvdW5kLCBkb24ndCBtZXNzIHdpdGggUGhpIG5vZGVzCisgIGlmIChNdXN0UHJlc2VydmVMQ1NTQSkgcmV0dXJuIDA7CisgIAorICBpZiAoVmFsdWUgKlYgPSBQTi5oYXNDb25zdGFudFZhbHVlKCkpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoUE4sIFYpOworCisgIC8vIElmIGFsbCBQSEkgb3BlcmFuZHMgYXJlIHRoZSBzYW1lIG9wZXJhdGlvbiwgcHVsbCB0aGVtIHRocm91Z2ggdGhlIFBISSwKKyAgLy8gcmVkdWNpbmcgY29kZSBzaXplLgorICBpZiAoaXNhPEluc3RydWN0aW9uPihQTi5nZXRJbmNvbWluZ1ZhbHVlKDApKSAmJgorICAgICAgaXNhPEluc3RydWN0aW9uPihQTi5nZXRJbmNvbWluZ1ZhbHVlKDEpKSAmJgorICAgICAgY2FzdDxJbnN0cnVjdGlvbj4oUE4uZ2V0SW5jb21pbmdWYWx1ZSgwKSktPmdldE9wY29kZSgpID09CisgICAgICBjYXN0PEluc3RydWN0aW9uPihQTi5nZXRJbmNvbWluZ1ZhbHVlKDEpKS0+Z2V0T3Bjb2RlKCkgJiYKKyAgICAgIC8vIEZJWE1FOiBUaGUgaGFzT25lVXNlIGNoZWNrIHdpbGwgZmFpbCBmb3IgUEhJcyB0aGF0IHVzZSB0aGUgdmFsdWUgbW9yZQorICAgICAgLy8gdGhhbiB0aGVtc2VsdmVzIG1vcmUgdGhhbiBvbmNlLgorICAgICAgUE4uZ2V0SW5jb21pbmdWYWx1ZSgwKS0+aGFzT25lVXNlKCkpCisgICAgaWYgKEluc3RydWN0aW9uICpSZXN1bHQgPSBGb2xkUEhJQXJnT3BJbnRvUEhJKFBOKSkKKyAgICAgIHJldHVybiBSZXN1bHQ7CisKKyAgLy8gSWYgdGhpcyBpcyBhIHRyaXZpYWwgY3ljbGUgaW4gdGhlIFBISSBub2RlIGdyYXBoLCByZW1vdmUgaXQuICBCYXNpY2FsbHksIGlmCisgIC8vIHRoaXMgUEhJIG9ubHkgaGFzIGEgc2luZ2xlIHVzZSAoYSBQSEkpLCBhbmQgaWYgdGhhdCBQSEkgb25seSBoYXMgb25lIHVzZSAoYQorICAvLyBQSEkpLi4uIGJyZWFrIHRoZSBjeWNsZS4KKyAgaWYgKFBOLmhhc09uZVVzZSgpKSB7CisgICAgSW5zdHJ1Y3Rpb24gKlBISVVzZXIgPSBjYXN0PEluc3RydWN0aW9uPihQTi51c2VfYmFjaygpKTsKKyAgICBpZiAoUEhJTm9kZSAqUFUgPSBkeW5fY2FzdDxQSElOb2RlPihQSElVc2VyKSkgeworICAgICAgU21hbGxQdHJTZXQ8UEhJTm9kZSosIDE2PiBQb3RlbnRpYWxseURlYWRQSElzOworICAgICAgUG90ZW50aWFsbHlEZWFkUEhJcy5pbnNlcnQoJlBOKTsKKyAgICAgIGlmIChEZWFkUEhJQ3ljbGUoUFUsIFBvdGVudGlhbGx5RGVhZFBISXMpKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChQTiwgVW5kZWZWYWx1ZTo6Z2V0KFBOLmdldFR5cGUoKSkpOworICAgIH0KKyAgIAorICAgIC8vIElmIHRoaXMgcGhpIGhhcyBhIHNpbmdsZSB1c2UsIGFuZCBpZiB0aGF0IHVzZSBqdXN0IGNvbXB1dGVzIGEgdmFsdWUgZm9yCisgICAgLy8gdGhlIG5leHQgaXRlcmF0aW9uIG9mIGEgbG9vcCwgZGVsZXRlIHRoZSBwaGkuICBUaGlzIG9jY3VycyB3aXRoIHVudXNlZAorICAgIC8vIGluZHVjdGlvbiB2YXJpYWJsZXMsIGUuZy4gImZvciAoaW50IGogPSAwOyA7ICsraik7Ii4gIERldGVjdGluZyB0aGlzCisgICAgLy8gY29tbW9uIGNhc2UgaGVyZSBpcyBnb29kIGJlY2F1c2UgdGhlIG9ubHkgb3RoZXIgdGhpbmdzIHRoYXQgY2F0Y2ggdGhpcworICAgIC8vIGFyZSBpbmR1Y3Rpb24gdmFyaWFibGUgYW5hbHlzaXMgKHNvbWV0aW1lcykgYW5kIEFEQ0UsIHdoaWNoIGlzIG9ubHkgcnVuCisgICAgLy8gbGF0ZS4KKyAgICBpZiAoUEhJVXNlci0+aGFzT25lVXNlKCkgJiYKKyAgICAgICAgKGlzYTxCaW5hcnlPcGVyYXRvcj4oUEhJVXNlcikgfHwgaXNhPEdldEVsZW1lbnRQdHJJbnN0PihQSElVc2VyKSkgJiYKKyAgICAgICAgUEhJVXNlci0+dXNlX2JhY2soKSA9PSAmUE4pIHsKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFBOLCBVbmRlZlZhbHVlOjpnZXQoUE4uZ2V0VHlwZSgpKSk7CisgICAgfQorICB9CisKKyAgLy8gV2Ugc29tZXRpbWVzIGVuZCB1cCB3aXRoIHBoaSBjeWNsZXMgdGhhdCBub24tb2J2aW91c2x5IGVuZCB1cCBiZWluZyB0aGUKKyAgLy8gc2FtZSB2YWx1ZSwgZm9yIGV4YW1wbGU6CisgIC8vICAgeiA9IHNvbWUgdmFsdWU7IHggPSBwaGkgKHksIHopOyB5ID0gcGhpICh4LCB6KQorICAvLyB3aGVyZSB0aGUgcGhpIG5vZGVzIGRvbid0IG5lY2Vzc2FyaWx5IG5lZWQgdG8gYmUgaW4gdGhlIHNhbWUgYmxvY2suICBEbyBhCisgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGUgUEhJIG5vZGUgb25seSBjb250YWlucyBhIHNpbmdsZSBub24tcGhpIHZhbHVlLCBpZgorICAvLyBzbywgc2NhbiB0byBzZWUgaWYgdGhlIHBoaSBjeWNsZSBpcyBhY3R1YWxseSBlcXVhbCB0byB0aGF0IHZhbHVlLgorICB7CisgICAgdW5zaWduZWQgSW5WYWxObyA9IDAsIE51bU9wZXJhbmRWYWxzID0gUE4uZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsKKyAgICAvLyBTY2FuIGZvciB0aGUgZmlyc3Qgbm9uLXBoaSBvcGVyYW5kLgorICAgIHdoaWxlIChJblZhbE5vICE9IE51bU9wZXJhbmRWYWxzICYmIAorICAgICAgICAgICBpc2E8UEhJTm9kZT4oUE4uZ2V0SW5jb21pbmdWYWx1ZShJblZhbE5vKSkpCisgICAgICArK0luVmFsTm87CisKKyAgICBpZiAoSW5WYWxObyAhPSBOdW1PcGVyYW5kVmFscykgeworICAgICAgVmFsdWUgKk5vblBoaUluVmFsID0gUE4uZ2V0T3BlcmFuZChJblZhbE5vKTsKKyAgICAgIAorICAgICAgLy8gU2NhbiB0aGUgcmVzdCBvZiB0aGUgb3BlcmFuZHMgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgY29uZmxpY3RzLCBpZiBzbworICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byByZWN1cnNpdmVseSBzY2FuIG90aGVyIHBoaXMuCisgICAgICBmb3IgKCsrSW5WYWxObzsgSW5WYWxObyAhPSBOdW1PcGVyYW5kVmFsczsgKytJblZhbE5vKSB7CisgICAgICAgIFZhbHVlICpPcFZhbCA9IFBOLmdldEluY29taW5nVmFsdWUoSW5WYWxObyk7CisgICAgICAgIGlmIChPcFZhbCAhPSBOb25QaGlJblZhbCAmJiAhaXNhPFBISU5vZGU+KE9wVmFsKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gSWYgd2Ugc2Nhbm5lZCBvdmVyIGFsbCBvcGVyYW5kcywgdGhlbiB3ZSBoYXZlIG9uZSB1bmlxdWUgdmFsdWUgcGx1cworICAgICAgLy8gcGhpIHZhbHVlcy4gIFNjYW4gUEhJIG5vZGVzIHRvIHNlZSBpZiB0aGV5IGFsbCBtZXJnZSBpbiBlYWNoIG90aGVyIG9yCisgICAgICAvLyB0aGUgdmFsdWUuCisgICAgICBpZiAoSW5WYWxObyA9PSBOdW1PcGVyYW5kVmFscykgeworICAgICAgICBTbWFsbFB0clNldDxQSElOb2RlKiwgMTY+IFZhbHVlRXF1YWxQSElzOworICAgICAgICBpZiAoUEhJc0VxdWFsVmFsdWUoJlBOLCBOb25QaGlJblZhbCwgVmFsdWVFcXVhbFBISXMpKQorICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFBOLCBOb25QaGlJblZhbCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIFBISXMsIHNvcnQgdGhlaXIgb3BlcmFuZHMgc28gdGhhdCB0aGV5IGFsbCBsaXN0CisgIC8vIHRoZSBibG9ja3MgaW4gdGhlIHNhbWUgb3JkZXIuIFRoaXMgd2lsbCBoZWxwIGlkZW50aWNhbCBQSElzIGJlIGVsaW1pbmF0ZWQKKyAgLy8gYnkgb3RoZXIgcGFzc2VzLiBPdGhlciBwYXNzZXMgc2hvdWxkbid0IGRlcGVuZCBvbiB0aGlzIGZvciBjb3JyZWN0bmVzcworICAvLyBob3dldmVyLgorICBQSElOb2RlICpGaXJzdFBOID0gY2FzdDxQSElOb2RlPihQTi5nZXRQYXJlbnQoKS0+YmVnaW4oKSk7CisgIGlmICgmUE4gIT0gRmlyc3RQTikKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRmlyc3RQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEJhc2ljQmxvY2sgKkJCQSA9IFBOLmdldEluY29taW5nQmxvY2soaSk7CisgICAgICBCYXNpY0Jsb2NrICpCQkIgPSBGaXJzdFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpOworICAgICAgaWYgKEJCQSAhPSBCQkIpIHsKKyAgICAgICAgVmFsdWUgKlZBID0gUE4uZ2V0SW5jb21pbmdWYWx1ZShpKTsKKyAgICAgICAgdW5zaWduZWQgaiA9IFBOLmdldEJhc2ljQmxvY2tJbmRleChCQkIpOworICAgICAgICBWYWx1ZSAqVkIgPSBQTi5nZXRJbmNvbWluZ1ZhbHVlKGopOworICAgICAgICBQTi5zZXRJbmNvbWluZ0Jsb2NrKGksIEJCQik7CisgICAgICAgIFBOLnNldEluY29taW5nVmFsdWUoaSwgVkIpOworICAgICAgICBQTi5zZXRJbmNvbWluZ0Jsb2NrKGosIEJCQSk7CisgICAgICAgIFBOLnNldEluY29taW5nVmFsdWUoaiwgVkEpOworICAgICAgICAvLyBOT1RFOiBJbnN0Y29tYmluZSBub3JtYWxseSB3b3VsZCB3YW50IHVzIHRvICJyZXR1cm4gJlBOIiBpZiB3ZQorICAgICAgICAvLyBtb2RpZmllZCBhbnkgb2YgdGhlIG9wZXJhbmRzIG9mIGFuIGluc3RydWN0aW9uLiAgSG93ZXZlciwgc2luY2Ugd2UKKyAgICAgICAgLy8gYXJlbid0IGFkZGluZyBvciByZW1vdmluZyB1c2VzIChqdXN0IHJlYXJyYW5naW5nIHRoZW0pIHdlIGRvbid0IGRvCisgICAgICAgIC8vIHRoaXMgaW4gdGhpcyBjYXNlLgorICAgICAgfQorICAgIH0KKworICAvLyBJZiB0aGlzIGlzIGFuIGludGVnZXIgUEhJIGFuZCB3ZSBrbm93IHRoYXQgaXQgaGFzIGFuIGlsbGVnYWwgdHlwZSwgc2VlIGlmCisgIC8vIGl0IGlzIG9ubHkgdXNlZCBieSB0cnVuYyBvciB0cnVuYyhsc2hyKSBvcGVyYXRpb25zLiAgSWYgc28sIHdlIHNwbGl0IHRoZQorICAvLyBQSEkgaW50byB0aGUgdmFyaW91cyBwaWVjZXMgYmVpbmcgZXh0cmFjdGVkLiAgVGhpcyBzb3J0IG9mIHRoaW5nIGlzCisgIC8vIGludHJvZHVjZWQgd2hlbiBTUk9BIHByb21vdGVzIGFuIGFnZ3JlZ2F0ZSB0byBhIHNpbmdsZSBsYXJnZSBpbnRlZ2VyIHR5cGUuCisgIGlmIChQTi5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkgJiYgVEQgJiYKKyAgICAgICFURC0+aXNMZWdhbEludGVnZXIoUE4uZ2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpKQorICAgIGlmIChJbnN0cnVjdGlvbiAqUmVzID0gU2xpY2VVcElsbGVnYWxJbnRlZ2VyUEhJKFBOKSkKKyAgICAgIHJldHVybiBSZXM7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lU2VsZWN0LmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lU2VsZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGYzZjRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVTZWxlY3QuY3BwCkBAIC0wLDAgKzEsNzAxIEBACisvLz09PS0gSW5zdENvbWJpbmVTZWxlY3QuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSB2aXNpdFNlbGVjdCBmdW5jdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiSW5zdENvbWJpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0dGVybk1hdGNoLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIG5hbWVzcGFjZSBQYXR0ZXJuTWF0Y2g7CisKKy8vLyBNYXRjaFNlbGVjdFBhdHRlcm4gLSBQYXR0ZXJuIG1hdGNoIGludGVnZXIgW1NVXU1JTiwgW1NVXU1BWCwgYW5kIEFCUyBpZGlvbXMsCisvLy8gcmV0dXJuaW5nIHRoZSBraW5kIGFuZCBwcm92aWRpbmcgdGhlIG91dCBwYXJhbWV0ZXIgcmVzdWx0cyBpZiB3ZQorLy8vIHN1Y2Nlc3NmdWxseSBtYXRjaC4KK3N0YXRpYyBTZWxlY3RQYXR0ZXJuRmxhdm9yCitNYXRjaFNlbGVjdFBhdHRlcm4oVmFsdWUgKlYsIFZhbHVlIComTEhTLCBWYWx1ZSAqJlJIUykgeworICBTZWxlY3RJbnN0ICpTSSA9IGR5bl9jYXN0PFNlbGVjdEluc3Q+KFYpOworICBpZiAoU0kgPT0gMCkgcmV0dXJuIFNQRl9VTktOT1dOOworICAKKyAgSUNtcEluc3QgKklDSSA9IGR5bl9jYXN0PElDbXBJbnN0PihTSS0+Z2V0Q29uZGl0aW9uKCkpOworICBpZiAoSUNJID09IDApIHJldHVybiBTUEZfVU5LTk9XTjsKKyAgCisgIExIUyA9IElDSS0+Z2V0T3BlcmFuZCgwKTsKKyAgUkhTID0gSUNJLT5nZXRPcGVyYW5kKDEpOworICAKKyAgLy8gKGljbXAgWCwgWSkgPyBYIDogWSAKKyAgaWYgKFNJLT5nZXRUcnVlVmFsdWUoKSA9PSBJQ0ktPmdldE9wZXJhbmQoMCkgJiYKKyAgICAgIFNJLT5nZXRGYWxzZVZhbHVlKCkgPT0gSUNJLT5nZXRPcGVyYW5kKDEpKSB7CisgICAgc3dpdGNoIChJQ0ktPmdldFByZWRpY2F0ZSgpKSB7CisgICAgZGVmYXVsdDogcmV0dXJuIFNQRl9VTktOT1dOOyAvLyBFcXVhbGl0eS4KKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDoKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHRTogcmV0dXJuIFNQRl9VTUFYOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOgorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOiByZXR1cm4gU1BGX1NNQVg7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTEU6IHJldHVybiBTUEZfVU1JTjsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDoKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRTogcmV0dXJuIFNQRl9TTUlOOworICAgIH0KKyAgfQorICAKKyAgLy8gKGljbXAgWCwgWSkgPyBZIDogWCAKKyAgaWYgKFNJLT5nZXRUcnVlVmFsdWUoKSA9PSBJQ0ktPmdldE9wZXJhbmQoMSkgJiYKKyAgICAgIFNJLT5nZXRGYWxzZVZhbHVlKCkgPT0gSUNJLT5nZXRPcGVyYW5kKDApKSB7CisgICAgc3dpdGNoIChJQ0ktPmdldFByZWRpY2F0ZSgpKSB7CisgICAgICBkZWZhdWx0OiByZXR1cm4gU1BGX1VOS05PV047IC8vIEVxdWFsaXR5LgorICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHRTogcmV0dXJuIFNQRl9VTUlOOworICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRTogcmV0dXJuIFNQRl9TTUlOOworICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRTogcmV0dXJuIFNQRl9VTUFYOworICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTFQ6CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRTogcmV0dXJuIFNQRl9TTUFYOworICAgIH0KKyAgfQorICAKKyAgLy8gVE9ETzogKFggPiA0KSA/IFggOiA1ICAgLS0+ICAoWCA+PSA1KSA/IFggOiA1ICAtLT4gIE1BWChYLCA1KQorICAKKyAgcmV0dXJuIFNQRl9VTktOT1dOOworfQorCisKKy8vLyBHZXRTZWxlY3RGb2xkYWJsZU9wZXJhbmRzIC0gV2Ugd2FudCB0byB0dXJuIGNvZGUgdGhhdCBsb29rcyBsaWtlIHRoaXM6CisvLy8gICAlQyA9IG9yICVBLCAlQgorLy8vICAgJUQgPSBzZWxlY3QgJWNvbmQsICVDLCAlQQorLy8vIGludG86CisvLy8gICAlQyA9IHNlbGVjdCAlY29uZCwgJUIsIDAKKy8vLyAgICVEID0gb3IgJUEsICVDCisvLy8KKy8vLyBBc3N1bWluZyB0aGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgYW4gb3BlcmFuZCB0byB0aGUgc2VsZWN0LCByZXR1cm4KKy8vLyBhIGJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBvcGVyYW5kcyBvZiB0aGlzIGluc3RydWN0aW9uIGFyZSBmb2xkYWJsZSBpZiB0aGV5CisvLy8gZXF1YWwgdGhlIG90aGVyIGluY29taW5nIHZhbHVlIG9mIHRoZSBzZWxlY3QuCisvLy8KK3N0YXRpYyB1bnNpZ25lZCBHZXRTZWxlY3RGb2xkYWJsZU9wZXJhbmRzKEluc3RydWN0aW9uICpJKSB7CisgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgICByZXR1cm4gMzsgICAgICAgICAgICAgIC8vIENhbiBmb2xkIHRocm91Z2ggZWl0aGVyIG9wZXJhbmQuCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjogICAvLyBDYW4gb25seSBmb2xkIG9uIHRoZSBhbW91bnQgc3VidHJhY3RlZC4KKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOiAgIC8vIENhbiBvbmx5IGZvbGQgb24gdGhlIHNoaWZ0IGFtb3VudC4KKyAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICByZXR1cm4gMTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgIC8vIENhbm5vdCBmb2xkCisgIH0KK30KKworLy8vIEdldFNlbGVjdEZvbGRhYmxlQ29uc3RhbnQgLSBGb3IgdGhlIHNhbWUgdHJhbnNmb3JtYXRpb24gYXMgdGhlIHByZXZpb3VzCisvLy8gZnVuY3Rpb24sIHJldHVybiB0aGUgaWRlbnRpdHkgY29uc3RhbnQgdGhhdCBnb2VzIGludG8gdGhlIHNlbGVjdC4KK3N0YXRpYyBDb25zdGFudCAqR2V0U2VsZWN0Rm9sZGFibGVDb25zdGFudChJbnN0cnVjdGlvbiAqSSkgeworICBzd2l0Y2ggKEktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlRoaXMgY2Fubm90IGhhcHBlbiEiKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICBjYXNlIEluc3RydWN0aW9uOjpTdWI6CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJLT5nZXRUeXBlKCkpOworICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgcmV0dXJuIENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoSS0+Z2V0VHlwZSgpKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KEktPmdldFR5cGUoKSwgMSk7CisgIH0KK30KKworLy8vIEZvbGRTZWxlY3RPcE9wIC0gSGVyZSB3ZSBoYXZlIChzZWxlY3QgYywgVEksIEZJKSwgYW5kIHdlIGtub3cgdGhhdCBUSSBhbmQgRkkKKy8vLyBoYXZlIHRoZSBzYW1lIG9wY29kZSBhbmQgb25seSBvbmUgdXNlIGVhY2guICBUcnkgdG8gc2ltcGxpZnkgdGhpcy4KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OkZvbGRTZWxlY3RPcE9wKFNlbGVjdEluc3QgJlNJLCBJbnN0cnVjdGlvbiAqVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqRkkpIHsKKyAgaWYgKFRJLT5nZXROdW1PcGVyYW5kcygpID09IDEpIHsKKyAgICAvLyBJZiB0aGlzIGlzIGEgbm9uLXZvbGF0aWxlIGxvYWQgb3IgYSBjYXN0IGZyb20gdGhlIHNhbWUgdHlwZSwKKyAgICAvLyBtZXJnZS4KKyAgICBpZiAoVEktPmlzQ2FzdCgpKSB7CisgICAgICBpZiAoVEktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSAhPSBGSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDA7ICAvLyB1bmtub3duIHVuYXJ5IG9wLgorICAgIH0KKworICAgIC8vIEZvbGQgdGhpcyBieSBpbnNlcnRpbmcgYSBzZWxlY3QgZnJvbSB0aGUgaW5wdXQgdmFsdWVzLgorICAgIFNlbGVjdEluc3QgKk5ld1NJID0gU2VsZWN0SW5zdDo6Q3JlYXRlKFNJLmdldENvbmRpdGlvbigpLCBUSS0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJLT5nZXRPcGVyYW5kKDApKTsKKyAgICBJbnNlcnROZXdJbnN0QmVmb3JlKE5ld1NJLCBTSSk7CisgICAgcmV0dXJuIENhc3RJbnN0OjpDcmVhdGUoSW5zdHJ1Y3Rpb246OkNhc3RPcHMoVEktPmdldE9wY29kZSgpKSwgTmV3U0ksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJLT5nZXRUeXBlKCkpOworICB9CisKKyAgLy8gT25seSBoYW5kbGUgYmluYXJ5IG9wZXJhdG9ycyBoZXJlLgorICBpZiAoIWlzYTxCaW5hcnlPcGVyYXRvcj4oVEkpKQorICAgIHJldHVybiAwOworCisgIC8vIEZpZ3VyZSBvdXQgaWYgdGhlIG9wZXJhdGlvbnMgaGF2ZSBhbnkgb3BlcmFuZHMgaW4gY29tbW9uLgorICBWYWx1ZSAqTWF0Y2hPcCwgKk90aGVyT3BULCAqT3RoZXJPcEY7CisgIGJvb2wgTWF0Y2hJc09wWmVybzsKKyAgaWYgKFRJLT5nZXRPcGVyYW5kKDApID09IEZJLT5nZXRPcGVyYW5kKDApKSB7CisgICAgTWF0Y2hPcCAgPSBUSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBPdGhlck9wVCA9IFRJLT5nZXRPcGVyYW5kKDEpOworICAgIE90aGVyT3BGID0gRkktPmdldE9wZXJhbmQoMSk7CisgICAgTWF0Y2hJc09wWmVybyA9IHRydWU7CisgIH0gZWxzZSBpZiAoVEktPmdldE9wZXJhbmQoMSkgPT0gRkktPmdldE9wZXJhbmQoMSkpIHsKKyAgICBNYXRjaE9wICA9IFRJLT5nZXRPcGVyYW5kKDEpOworICAgIE90aGVyT3BUID0gVEktPmdldE9wZXJhbmQoMCk7CisgICAgT3RoZXJPcEYgPSBGSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBNYXRjaElzT3BaZXJvID0gZmFsc2U7CisgIH0gZWxzZSBpZiAoIVRJLT5pc0NvbW11dGF0aXZlKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIGlmIChUSS0+Z2V0T3BlcmFuZCgwKSA9PSBGSS0+Z2V0T3BlcmFuZCgxKSkgeworICAgIE1hdGNoT3AgID0gVEktPmdldE9wZXJhbmQoMCk7CisgICAgT3RoZXJPcFQgPSBUSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBPdGhlck9wRiA9IEZJLT5nZXRPcGVyYW5kKDApOworICAgIE1hdGNoSXNPcFplcm8gPSB0cnVlOworICB9IGVsc2UgaWYgKFRJLT5nZXRPcGVyYW5kKDEpID09IEZJLT5nZXRPcGVyYW5kKDApKSB7CisgICAgTWF0Y2hPcCAgPSBUSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBPdGhlck9wVCA9IFRJLT5nZXRPcGVyYW5kKDApOworICAgIE90aGVyT3BGID0gRkktPmdldE9wZXJhbmQoMSk7CisgICAgTWF0Y2hJc09wWmVybyA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBJZiB3ZSByZWFjaCBoZXJlLCB0aGV5IGRvIGhhdmUgb3BlcmF0aW9ucyBpbiBjb21tb24uCisgIFNlbGVjdEluc3QgKk5ld1NJID0gU2VsZWN0SW5zdDo6Q3JlYXRlKFNJLmdldENvbmRpdGlvbigpLCBPdGhlck9wVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJPcEYpOworICBJbnNlcnROZXdJbnN0QmVmb3JlKE5ld1NJLCBTSSk7CisKKyAgaWYgKEJpbmFyeU9wZXJhdG9yICpCTyA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihUSSkpIHsKKyAgICBpZiAoTWF0Y2hJc09wWmVybykKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEJPLT5nZXRPcGNvZGUoKSwgTWF0Y2hPcCwgTmV3U0kpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEJPLT5nZXRPcGNvZGUoKSwgTmV3U0ksIE1hdGNoT3ApOworICB9CisgIGxsdm1fdW5yZWFjaGFibGUoIlNob3VsZG4ndCBnZXQgaGVyZSIpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgaXNTZWxlY3QwMShDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICBDb25zdGFudEludCAqQzFJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEMxKTsKKyAgaWYgKCFDMUkpCisgICAgcmV0dXJuIGZhbHNlOworICBDb25zdGFudEludCAqQzJJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEMyKTsKKyAgaWYgKCFDMkkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gKEMxSS0+aXNaZXJvKCkgfHwgQzFJLT5pc09uZSgpKSAmJiAoQzJJLT5pc1plcm8oKSB8fCBDMkktPmlzT25lKCkpOworfQorCisvLy8gRm9sZFNlbGVjdEludG9PcCAtIFRyeSBmb2xkIHRoZSBzZWxlY3QgaW50byBvbmUgb2YgdGhlIG9wZXJhbmRzIHRvCisvLy8gZmFjaWxpdGF0ZSBmdXJ0aGVyIG9wdGltaXphdGlvbi4KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OkZvbGRTZWxlY3RJbnRvT3AoU2VsZWN0SW5zdCAmU0ksIFZhbHVlICpUcnVlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqRmFsc2VWYWwpIHsKKyAgLy8gU2VlIHRoZSBjb21tZW50IGFib3ZlIEdldFNlbGVjdEZvbGRhYmxlT3BlcmFuZHMgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCisgIC8vIHRyYW5zZm9ybWF0aW9uIHdlIGFyZSBkb2luZyBoZXJlLgorICBpZiAoSW5zdHJ1Y3Rpb24gKlRWSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihUcnVlVmFsKSkgeworICAgIGlmIChUVkktPmhhc09uZVVzZSgpICYmIFRWSS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAyICYmCisgICAgICAgICFpc2E8Q29uc3RhbnQ+KEZhbHNlVmFsKSkgeworICAgICAgaWYgKHVuc2lnbmVkIFNGTyA9IEdldFNlbGVjdEZvbGRhYmxlT3BlcmFuZHMoVFZJKSkgeworICAgICAgICB1bnNpZ25lZCBPcFRvRm9sZCA9IDA7CisgICAgICAgIGlmICgoU0ZPICYgMSkgJiYgRmFsc2VWYWwgPT0gVFZJLT5nZXRPcGVyYW5kKDApKSB7CisgICAgICAgICAgT3BUb0ZvbGQgPSAxOworICAgICAgICB9IGVsc2UgIGlmICgoU0ZPICYgMikgJiYgRmFsc2VWYWwgPT0gVFZJLT5nZXRPcGVyYW5kKDEpKSB7CisgICAgICAgICAgT3BUb0ZvbGQgPSAyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE9wVG9Gb2xkKSB7CisgICAgICAgICAgQ29uc3RhbnQgKkMgPSBHZXRTZWxlY3RGb2xkYWJsZUNvbnN0YW50KFRWSSk7CisgICAgICAgICAgVmFsdWUgKk9PcCA9IFRWSS0+Z2V0T3BlcmFuZCgyLU9wVG9Gb2xkKTsKKyAgICAgICAgICAvLyBBdm9pZCBjcmVhdGluZyBzZWxlY3QgYmV0d2VlbiAyIGNvbnN0YW50cyB1bmxlc3MgaXQncyBzZWxlY3RpbmcKKyAgICAgICAgICAvLyBiZXR3ZWVuIDAgYW5kIDEuCisgICAgICAgICAgaWYgKCFpc2E8Q29uc3RhbnQ+KE9PcCkgfHwgaXNTZWxlY3QwMShDLCBjYXN0PENvbnN0YW50PihPT3ApKSkgeworICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKk5ld1NlbCA9IFNlbGVjdEluc3Q6OkNyZWF0ZShTSS5nZXRDb25kaXRpb24oKSwgT09wLCBDKTsKKyAgICAgICAgICAgIEluc2VydE5ld0luc3RCZWZvcmUoTmV3U2VsLCBTSSk7CisgICAgICAgICAgICBOZXdTZWwtPnRha2VOYW1lKFRWSSk7CisgICAgICAgICAgICBpZiAoQmluYXJ5T3BlcmF0b3IgKkJPID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KFRWSSkpCisgICAgICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEJPLT5nZXRPcGNvZGUoKSwgRmFsc2VWYWwsIE5ld1NlbCk7CisgICAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGluc3RydWN0aW9uISEiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoSW5zdHJ1Y3Rpb24gKkZWSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihGYWxzZVZhbCkpIHsKKyAgICBpZiAoRlZJLT5oYXNPbmVVc2UoKSAmJiBGVkktPmdldE51bU9wZXJhbmRzKCkgPT0gMiAmJgorICAgICAgICAhaXNhPENvbnN0YW50PihUcnVlVmFsKSkgeworICAgICAgaWYgKHVuc2lnbmVkIFNGTyA9IEdldFNlbGVjdEZvbGRhYmxlT3BlcmFuZHMoRlZJKSkgeworICAgICAgICB1bnNpZ25lZCBPcFRvRm9sZCA9IDA7CisgICAgICAgIGlmICgoU0ZPICYgMSkgJiYgVHJ1ZVZhbCA9PSBGVkktPmdldE9wZXJhbmQoMCkpIHsKKyAgICAgICAgICBPcFRvRm9sZCA9IDE7CisgICAgICAgIH0gZWxzZSAgaWYgKChTRk8gJiAyKSAmJiBUcnVlVmFsID09IEZWSS0+Z2V0T3BlcmFuZCgxKSkgeworICAgICAgICAgIE9wVG9Gb2xkID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChPcFRvRm9sZCkgeworICAgICAgICAgIENvbnN0YW50ICpDID0gR2V0U2VsZWN0Rm9sZGFibGVDb25zdGFudChGVkkpOworICAgICAgICAgIFZhbHVlICpPT3AgPSBGVkktPmdldE9wZXJhbmQoMi1PcFRvRm9sZCk7CisgICAgICAgICAgLy8gQXZvaWQgY3JlYXRpbmcgc2VsZWN0IGJldHdlZW4gMiBjb25zdGFudHMgdW5sZXNzIGl0J3Mgc2VsZWN0aW5nCisgICAgICAgICAgLy8gYmV0d2VlbiAwIGFuZCAxLgorICAgICAgICAgIGlmICghaXNhPENvbnN0YW50PihPT3ApIHx8IGlzU2VsZWN0MDEoQywgY2FzdDxDb25zdGFudD4oT09wKSkpIHsKKyAgICAgICAgICAgIEluc3RydWN0aW9uICpOZXdTZWwgPSBTZWxlY3RJbnN0OjpDcmVhdGUoU0kuZ2V0Q29uZGl0aW9uKCksIEMsIE9PcCk7CisgICAgICAgICAgICBJbnNlcnROZXdJbnN0QmVmb3JlKE5ld1NlbCwgU0kpOworICAgICAgICAgICAgTmV3U2VsLT50YWtlTmFtZShGVkkpOworICAgICAgICAgICAgaWYgKEJpbmFyeU9wZXJhdG9yICpCTyA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihGVkkpKQorICAgICAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShCTy0+Z2V0T3Bjb2RlKCksIFRydWVWYWwsIE5ld1NlbCk7CisgICAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGluc3RydWN0aW9uISEiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworLy8vIHZpc2l0U2VsZWN0SW5zdFdpdGhJQ21wIC0gVmlzaXQgYSBTZWxlY3RJbnN0IHRoYXQgaGFzIGFuCisvLy8gSUNtcEluc3QgYXMgaXRzIGZpcnN0IG9wZXJhbmQuCisvLy8KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0U2VsZWN0SW5zdFdpdGhJQ21wKFNlbGVjdEluc3QgJlNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3QgKklDSSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkID0gSUNJLT5nZXRQcmVkaWNhdGUoKTsKKyAgVmFsdWUgKkNtcExIUyA9IElDSS0+Z2V0T3BlcmFuZCgwKTsKKyAgVmFsdWUgKkNtcFJIUyA9IElDSS0+Z2V0T3BlcmFuZCgxKTsKKyAgVmFsdWUgKlRydWVWYWwgPSBTSS5nZXRUcnVlVmFsdWUoKTsKKyAgVmFsdWUgKkZhbHNlVmFsID0gU0kuZ2V0RmFsc2VWYWx1ZSgpOworCisgIC8vIENoZWNrIGNhc2VzIHdoZXJlIHRoZSBjb21wYXJpc29uIGlzIHdpdGggYSBjb25zdGFudCB0aGF0CisgIC8vIGNhbiBiZSBhZGp1c3RlZCB0byBmaXQgdGhlIG1pbi9tYXggaWRpb20uIFdlIG1heSBlZGl0IElDSSBpbgorICAvLyBwbGFjZSBoZXJlLCBzbyBtYWtlIHN1cmUgdGhlIHNlbGVjdCBpcyB0aGUgb25seSB1c2VyLgorICBpZiAoSUNJLT5oYXNPbmVVc2UoKSkKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENtcFJIUykpIHsKKyAgICAgIHN3aXRjaCAoUHJlZCkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDoKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiB7CisgICAgICAgIC8vIFggPCBNSU4gPyBUIDogRiAgLS0+ICBGCisgICAgICAgIGlmIChDSS0+aXNNaW5WYWx1ZShQcmVkID09IElDbXBJbnN0OjpJQ01QX1NMVCkpCisgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoU0ksIEZhbHNlVmFsKTsKKyAgICAgICAgLy8gWCA8IEMgPyBYIDogQy0xICAtLT4gIFggPiBDLTEgPyBDLTEgOiBYCisgICAgICAgIENvbnN0YW50ICpBZGp1c3RlZFJIUyA9CisgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChDSS0+Z2V0Q29udGV4dCgpLCBDSS0+Z2V0VmFsdWUoKS0xKTsKKyAgICAgICAgaWYgKChDbXBMSFMgPT0gVHJ1ZVZhbCAmJiBBZGp1c3RlZFJIUyA9PSBGYWxzZVZhbCkgfHwKKyAgICAgICAgICAgIChDbXBMSFMgPT0gRmFsc2VWYWwgJiYgQWRqdXN0ZWRSSFMgPT0gVHJ1ZVZhbCkpIHsKKyAgICAgICAgICBQcmVkID0gSUNtcEluc3Q6OmdldFN3YXBwZWRQcmVkaWNhdGUoUHJlZCk7CisgICAgICAgICAgQ21wUkhTID0gQWRqdXN0ZWRSSFM7CisgICAgICAgICAgc3RkOjpzd2FwKEZhbHNlVmFsLCBUcnVlVmFsKTsKKyAgICAgICAgICBJQ0ktPnNldFByZWRpY2F0ZShQcmVkKTsKKyAgICAgICAgICBJQ0ktPnNldE9wZXJhbmQoMSwgQ21wUkhTKTsKKyAgICAgICAgICBTSS5zZXRPcGVyYW5kKDEsIFRydWVWYWwpOworICAgICAgICAgIFNJLnNldE9wZXJhbmQoMiwgRmFsc2VWYWwpOworICAgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHVDogeworICAgICAgICAvLyBYID4gTUFYID8gVCA6IEYgIC0tPiAgRgorICAgICAgICBpZiAoQ0ktPmlzTWF4VmFsdWUoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TR1QpKQorICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFNJLCBGYWxzZVZhbCk7CisgICAgICAgIC8vIFggPiBDID8gWCA6IEMrMSAgLS0+ICBYIDwgQysxID8gQysxIDogWAorICAgICAgICBDb25zdGFudCAqQWRqdXN0ZWRSSFMgPQorICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoQ0ktPmdldENvbnRleHQoKSwgQ0ktPmdldFZhbHVlKCkrMSk7CisgICAgICAgIGlmICgoQ21wTEhTID09IFRydWVWYWwgJiYgQWRqdXN0ZWRSSFMgPT0gRmFsc2VWYWwpIHx8CisgICAgICAgICAgICAoQ21wTEhTID09IEZhbHNlVmFsICYmIEFkanVzdGVkUkhTID09IFRydWVWYWwpKSB7CisgICAgICAgICAgUHJlZCA9IElDbXBJbnN0OjpnZXRTd2FwcGVkUHJlZGljYXRlKFByZWQpOworICAgICAgICAgIENtcFJIUyA9IEFkanVzdGVkUkhTOworICAgICAgICAgIHN0ZDo6c3dhcChGYWxzZVZhbCwgVHJ1ZVZhbCk7CisgICAgICAgICAgSUNJLT5zZXRQcmVkaWNhdGUoUHJlZCk7CisgICAgICAgICAgSUNJLT5zZXRPcGVyYW5kKDEsIENtcFJIUyk7CisgICAgICAgICAgU0kuc2V0T3BlcmFuZCgxLCBUcnVlVmFsKTsKKyAgICAgICAgICBTSS5zZXRPcGVyYW5kKDIsIEZhbHNlVmFsKTsKKyAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgLy8gVHJhbnNmb3JtIChYID5zIC0xKSA/IEMxIDogQzIgLS0+ICgoWCA+PnMgMzEpICYgKEMyIC0gQzEpKSArIEMxCisgIC8vIGFuZCAgICAgICAoWCA8cyAgMCkgPyBDMiA6IEMxIC0tPiAoKFggPj5zIDMxKSAmIChDMiAtIEMxKSkgKyBDMQorICAvLyBGSVhNRTogVHlwZSBhbmQgY29uc3RuZXNzIGNvbnN0cmFpbnRzIGNvdWxkIGJlIGxpZnRlZCwgYnV0IHdlIGhhdmUgdG8KKyAgLy8gICAgICAgIHdhdGNoIGNvZGUgc2l6ZSBjYXJlZnVsbHkuIFdlIHNob3VsZCBjb25zaWRlciB4b3IgaW5zdGVhZCBvZgorICAvLyAgICAgICAgc3ViL2FkZCB3aGVuIHdlIGRlY2lkZSB0byBkbyB0aGF0LgorICBpZiAoY29uc3QgSW50ZWdlclR5cGUgKlR5ID0gZHluX2Nhc3Q8SW50ZWdlclR5cGU+KENtcExIUy0+Z2V0VHlwZSgpKSkgeworICAgIGlmIChUcnVlVmFsLT5nZXRUeXBlKCkgPT0gVHkpIHsKKyAgICAgIGlmIChDb25zdGFudEludCAqQ21wID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENtcFJIUykpIHsKKyAgICAgICAgQ29uc3RhbnRJbnQgKkMxID0gTlVMTCwgKkMyID0gTlVMTDsKKyAgICAgICAgaWYgKFByZWQgPT0gSUNtcEluc3Q6OklDTVBfU0dUICYmIENtcC0+aXNBbGxPbmVzVmFsdWUoKSkgeworICAgICAgICAgIEMxID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFRydWVWYWwpOworICAgICAgICAgIEMyID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEZhbHNlVmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChQcmVkID09IElDbXBJbnN0OjpJQ01QX1NMVCAmJiBDbXAtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgICBDMSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihGYWxzZVZhbCk7CisgICAgICAgICAgQzIgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVHJ1ZVZhbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEMxICYmIEMyKSB7CisgICAgICAgICAgLy8gVGhpcyBzaGlmdCByZXN1bHRzIGluIGVpdGhlciAtMSBvciAwLgorICAgICAgICAgIFZhbHVlICpBU2hyID0gQnVpbGRlci0+Q3JlYXRlQVNocihDbXBMSFMsIFR5LT5nZXRCaXRXaWR0aCgpLTEpOworCisgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGV4cHJlc3MgdGhlIG9wZXJhdGlvbiB3aXRoIGEgc2luZ2xlIG9yLgorICAgICAgICAgIGlmIChDMi0+aXNBbGxPbmVzVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFNJLCBCdWlsZGVyLT5DcmVhdGVPcihBU2hyLCBDMSkpOworCisgICAgICAgICAgVmFsdWUgKkFuZCA9IEJ1aWxkZXItPkNyZWF0ZUFuZChBU2hyLCBDMi0+Z2V0VmFsdWUoKS1DMS0+Z2V0VmFsdWUoKSk7CisgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoU0ksIEJ1aWxkZXItPkNyZWF0ZUFkZChBbmQsIEMxKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoQ21wTEhTID09IFRydWVWYWwgJiYgQ21wUkhTID09IEZhbHNlVmFsKSB7CisgICAgLy8gVHJhbnNmb3JtIChYID09IFkpID8gWCA6IFkgIC0+IFkKKyAgICBpZiAoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9FUSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFNJLCBGYWxzZVZhbCk7CisgICAgLy8gVHJhbnNmb3JtIChYICE9IFkpID8gWCA6IFkgIC0+IFgKKyAgICBpZiAoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9ORSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFNJLCBUcnVlVmFsKTsKKyAgICAvLy8gTk9URTogaWYgd2Ugd2FudGVkIHRvLCB0aGlzIGlzIHdoZXJlIHRvIGRldGVjdCBpbnRlZ2VyIE1JTi9NQVgKKworICB9IGVsc2UgaWYgKENtcExIUyA9PSBGYWxzZVZhbCAmJiBDbXBSSFMgPT0gVHJ1ZVZhbCkgeworICAgIC8vIFRyYW5zZm9ybSAoWCA9PSBZKSA/IFkgOiBYICAtPiBYCisgICAgaWYgKFByZWQgPT0gSUNtcEluc3Q6OklDTVBfRVEpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChTSSwgRmFsc2VWYWwpOworICAgIC8vIFRyYW5zZm9ybSAoWCAhPSBZKSA/IFkgOiBYICAtPiBZCisgICAgaWYgKFByZWQgPT0gSUNtcEluc3Q6OklDTVBfTkUpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChTSSwgVHJ1ZVZhbCk7CisgICAgLy8vIE5PVEU6IGlmIHdlIHdhbnRlZCB0bywgdGhpcyBpcyB3aGVyZSB0byBkZXRlY3QgaW50ZWdlciBNSU4vTUFYCisgIH0KKyAgcmV0dXJuIENoYW5nZWQgPyAmU0kgOiAwOworfQorCisKKy8vLyBDYW5TZWxlY3RPcGVyYW5kQmVNYXBwaW5nSW50b1ByZWRCbG9jayAtIFNJIGlzIGEgc2VsZWN0IHdob3NlIGNvbmRpdGlvbiBpcyBhCisvLy8gUEhJIG5vZGUgKGJ1dCB0aGUgdHdvIG1heSBiZSBpbiBkaWZmZXJlbnQgYmxvY2tzKS4gIFNlZSBpZiB0aGUgdHJ1ZS9mYWxzZQorLy8vIHZhbHVlcyAoVikgYXJlIGxpdmUgaW4gYWxsIG9mIHRoZSBwcmVkZWNlc3NvciBibG9ja3Mgb2YgdGhlIFBISS4gIEZvcgorLy8vIGV4YW1wbGUsIGNhc2VzIGxpa2UgdGhpcyBjYW5ub3QgYmUgbWFwcGVkOgorLy8vCisvLy8gICBYID0gcGhpIFsgQzEsIEJCMV0sIFtDMiwgQkIyXQorLy8vICAgWSA9IGFkZAorLy8vICAgWiA9IHNlbGVjdCBYLCBZLCAwCisvLy8KKy8vLyBiZWNhdXNlIFkgaXMgbm90IGxpdmUgaW4gQkIxL0JCMi4KKy8vLworc3RhdGljIGJvb2wgQ2FuU2VsZWN0T3BlcmFuZEJlTWFwcGluZ0ludG9QcmVkQmxvY2soY29uc3QgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3RJbnN0ICZTSSkgeworICAvLyBJZiB0aGUgdmFsdWUgaXMgYSBub24taW5zdHJ1Y3Rpb24gdmFsdWUgbGlrZSBhIGNvbnN0YW50IG9yIGFyZ3VtZW50LCBpdAorICAvLyBjYW4gYWx3YXlzIGJlIG1hcHBlZC4KKyAgY29uc3QgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVik7CisgIGlmIChJID09IDApIHJldHVybiB0cnVlOworICAKKyAgLy8gSWYgViBpcyBhIFBISSBub2RlIGRlZmluZWQgaW4gdGhlIHNhbWUgYmxvY2sgYXMgdGhlIGNvbmRpdGlvbiBQSEksIHdlIGNhbgorICAvLyBtYXAgdGhlIGFyZ3VtZW50cy4KKyAgY29uc3QgUEhJTm9kZSAqQ29uZFBISSA9IGNhc3Q8UEhJTm9kZT4oU0kuZ2V0Q29uZGl0aW9uKCkpOworICAKKyAgaWYgKGNvbnN0IFBISU5vZGUgKlZQID0gZHluX2Nhc3Q8UEhJTm9kZT4oSSkpCisgICAgaWYgKFZQLT5nZXRQYXJlbnQoKSA9PSBDb25kUEhJLT5nZXRQYXJlbnQoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gT3RoZXJ3aXNlLCBpZiB0aGUgUEhJIGFuZCBzZWxlY3QgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgYmxvY2sgYW5kIGlmIFYgaXMKKyAgLy8gZGVmaW5lZCBpbiBhIGRpZmZlcmVudCBibG9jaywgdGhlbiB3ZSBjYW4gdHJhbnNmb3JtIGl0LgorICBpZiAoU0kuZ2V0UGFyZW50KCkgPT0gQ29uZFBISS0+Z2V0UGFyZW50KCkgJiYKKyAgICAgIEktPmdldFBhcmVudCgpICE9IENvbmRQSEktPmdldFBhcmVudCgpKQorICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gT3RoZXJ3aXNlIHdlIGhhdmUgYSAnaGFyZCcgY2FzZSBhbmQgd2UgY2FuJ3QgdGVsbCB3aXRob3V0IGRvaW5nIG1vcmUKKyAgLy8gZGV0YWlsZWQgZG9taW5hdG9yIGJhc2VkIGFuYWx5c2lzLCBwdW50LgorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBGb2xkU1BGb2ZTUEYgLSBXZSBoYXZlIGFuIFNQRiAoZS5nLiBhIG1pbiBvciBtYXgpIG9mIGFuIFNQRiBvZiB0aGUgZm9ybToKKy8vLyAgIFNQRjIoU1BGMShBLCBCKSwgQykgCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjpGb2xkU1BGb2ZTUEYoSW5zdHJ1Y3Rpb24gKklubmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdFBhdHRlcm5GbGF2b3IgU1BGMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQSwgVmFsdWUgKkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gJk91dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdFBhdHRlcm5GbGF2b3IgU1BGMiwgVmFsdWUgKkMpIHsKKyAgaWYgKEMgPT0gQSB8fCBDID09IEIpIHsKKyAgICAvLyBNQVgoTUFYKEEsIEIpLCBCKSAtPiBNQVgoQSwgQikKKyAgICAvLyBNSU4oTUlOKGEsIGIpLCBhKSAtPiBNSU4oYSwgYikKKyAgICBpZiAoU1BGMSA9PSBTUEYyKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoT3V0ZXIsIElubmVyKTsKKyAgICAKKyAgICAvLyBNQVgoTUlOKGEsIGIpLCBhKSAtPiBhCisgICAgLy8gTUlOKE1BWChhLCBiKSwgYSkgLT4gYQorICAgIGlmICgoU1BGMSA9PSBTUEZfU01JTiAmJiBTUEYyID09IFNQRl9TTUFYKSB8fAorICAgICAgICAoU1BGMSA9PSBTUEZfU01BWCAmJiBTUEYyID09IFNQRl9TTUlOKSB8fAorICAgICAgICAoU1BGMSA9PSBTUEZfVU1JTiAmJiBTUEYyID09IFNQRl9VTUFYKSB8fAorICAgICAgICAoU1BGMSA9PSBTUEZfVU1BWCAmJiBTUEYyID09IFNQRl9VTUlOKSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKE91dGVyLCBDKTsKKyAgfQorICAKKyAgLy8gVE9ETzogTUlOKE1JTihBLCAyMyksIDk3KQorICByZXR1cm4gMDsKK30KKworCisKKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRTZWxlY3RJbnN0KFNlbGVjdEluc3QgJlNJKSB7CisgIFZhbHVlICpDb25kVmFsID0gU0kuZ2V0Q29uZGl0aW9uKCk7CisgIFZhbHVlICpUcnVlVmFsID0gU0kuZ2V0VHJ1ZVZhbHVlKCk7CisgIFZhbHVlICpGYWxzZVZhbCA9IFNJLmdldEZhbHNlVmFsdWUoKTsKKworICBpZiAoVmFsdWUgKlYgPSBTaW1wbGlmeVNlbGVjdEluc3QoQ29uZFZhbCwgVHJ1ZVZhbCwgRmFsc2VWYWwsIFREKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChTSSwgVik7CisKKyAgaWYgKFNJLmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoMSkpIHsKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVHJ1ZVZhbCkpIHsKKyAgICAgIGlmIChDLT5nZXRaRXh0VmFsdWUoKSkgeworICAgICAgICAvLyBDaGFuZ2U6IEEgPSBzZWxlY3QgQiwgdHJ1ZSwgQyAtLT4gQSA9IG9yIEIsIEMKKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihDb25kVmFsLCBGYWxzZVZhbCk7CisgICAgICB9CisgICAgICAvLyBDaGFuZ2U6IEEgPSBzZWxlY3QgQiwgZmFsc2UsIEMgLS0+IEEgPSBhbmQgIUIsIEMKKyAgICAgIFZhbHVlICpOb3RDb25kID0KKyAgICAgICAgSW5zZXJ0TmV3SW5zdEJlZm9yZShCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTm90KENvbmRWYWwpLCBTSSk7CisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChOb3RDb25kLCBGYWxzZVZhbCk7CisgICAgfSBlbHNlIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihGYWxzZVZhbCkpIHsKKyAgICAgIGlmIChDLT5nZXRaRXh0VmFsdWUoKSA9PSBmYWxzZSkgeworICAgICAgICAvLyBDaGFuZ2U6IEEgPSBzZWxlY3QgQiwgQywgZmFsc2UgLS0+IEEgPSBhbmQgQiwgQworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChDb25kVmFsLCBUcnVlVmFsKTsKKyAgICAgIH0KKyAgICAgIC8vIENoYW5nZTogQSA9IHNlbGVjdCBCLCBDLCB0cnVlIC0tPiBBID0gb3IgIUIsIEMKKyAgICAgIFZhbHVlICpOb3RDb25kID0KKyAgICAgICAgSW5zZXJ0TmV3SW5zdEJlZm9yZShCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTm90KENvbmRWYWwpLCBTSSk7CisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKE5vdENvbmQsIFRydWVWYWwpOworICAgIH0KKyAgICAKKyAgICAvLyBzZWxlY3QgYSwgYiwgYSAgLT4gYSZiCisgICAgLy8gc2VsZWN0IGEsIGEsIGIgIC0+IGF8YgorICAgIGlmIChDb25kVmFsID09IFRydWVWYWwpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKENvbmRWYWwsIEZhbHNlVmFsKTsKKyAgICBlbHNlIGlmIChDb25kVmFsID09IEZhbHNlVmFsKQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoQ29uZFZhbCwgVHJ1ZVZhbCk7CisgIH0KKworICAvLyBTZWxlY3RpbmcgYmV0d2VlbiB0d28gaW50ZWdlciBjb25zdGFudHM/CisgIGlmIChDb25zdGFudEludCAqVHJ1ZVZhbEMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVHJ1ZVZhbCkpCisgICAgaWYgKENvbnN0YW50SW50ICpGYWxzZVZhbEMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oRmFsc2VWYWwpKSB7CisgICAgICAvLyBzZWxlY3QgQywgMSwgMCAtPiB6ZXh0IEMgdG8gaW50CisgICAgICBpZiAoRmFsc2VWYWxDLT5pc1plcm8oKSAmJiBUcnVlVmFsQy0+Z2V0VmFsdWUoKSA9PSAxKQorICAgICAgICByZXR1cm4gbmV3IFpFeHRJbnN0KENvbmRWYWwsIFNJLmdldFR5cGUoKSk7CisKKyAgICAgIC8vIHNlbGVjdCBDLCAtMSwgMCAtPiBzZXh0IEMgdG8gaW50CisgICAgICBpZiAoRmFsc2VWYWxDLT5pc1plcm8oKSAmJiBUcnVlVmFsQy0+aXNBbGxPbmVzVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIG5ldyBTRXh0SW5zdChDb25kVmFsLCBTSS5nZXRUeXBlKCkpOworICAgICAgCisgICAgICAvLyBzZWxlY3QgQywgMCwgMSAtPiB6ZXh0ICFDIHRvIGludAorICAgICAgaWYgKFRydWVWYWxDLT5pc1plcm8oKSAmJiBGYWxzZVZhbEMtPmdldFZhbHVlKCkgPT0gMSkgeworICAgICAgICBWYWx1ZSAqTm90Q29uZCA9IEJ1aWxkZXItPkNyZWF0ZU5vdChDb25kVmFsKTsKKyAgICAgICAgcmV0dXJuIG5ldyBaRXh0SW5zdChOb3RDb25kLCBTSS5nZXRUeXBlKCkpOworICAgICAgfQorCisgICAgICAvLyBzZWxlY3QgQywgMCwgLTEgLT4gc2V4dCAhQyB0byBpbnQKKyAgICAgIGlmIChUcnVlVmFsQy0+aXNaZXJvKCkgJiYgRmFsc2VWYWxDLT5pc0FsbE9uZXNWYWx1ZSgpKSB7CisgICAgICAgIFZhbHVlICpOb3RDb25kID0gQnVpbGRlci0+Q3JlYXRlTm90KENvbmRWYWwpOworICAgICAgICByZXR1cm4gbmV3IFNFeHRJbnN0KE5vdENvbmQsIFNJLmdldFR5cGUoKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChJQ21wSW5zdCAqSUMgPSBkeW5fY2FzdDxJQ21wSW5zdD4oU0kuZ2V0Q29uZGl0aW9uKCkpKSB7CisgICAgICAgIC8vIElmIG9uZSBvZiB0aGUgY29uc3RhbnRzIGlzIHplcm8gKHdlIGtub3cgdGhleSBjYW4ndCBib3RoIGJlKSBhbmQgd2UKKyAgICAgICAgLy8gaGF2ZSBhbiBpY21wIGluc3RydWN0aW9uIHdpdGggemVybywgYW5kIHdlIGhhdmUgYW4gJ2FuZCcgd2l0aCB0aGUKKyAgICAgICAgLy8gbm9uLWNvbnN0YW50IHZhbHVlLCBlbGltaW5hdGUgdGhpcyB3aG9sZSBtZXNzLiAgVGhpcyBjb3JyZXNwb25kcyB0bworICAgICAgICAvLyBjYXNlcyBsaWtlIHRoaXM6ICgoWCAmIDI3KSA/IDI3IDogMCkKKyAgICAgICAgaWYgKFRydWVWYWxDLT5pc1plcm8oKSB8fCBGYWxzZVZhbEMtPmlzWmVybygpKQorICAgICAgICAgIGlmIChJQy0+aXNFcXVhbGl0eSgpICYmIGlzYTxDb25zdGFudEludD4oSUMtPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnQ+KElDLT5nZXRPcGVyYW5kKDEpKS0+aXNOdWxsVmFsdWUoKSkKKyAgICAgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqSUNBID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KElDLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgICAgICAgaWYgKElDQS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFuZCAmJgorICAgICAgICAgICAgICAgICAgaXNhPENvbnN0YW50SW50PihJQ0EtPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgICAgICAgICAoSUNBLT5nZXRPcGVyYW5kKDEpID09IFRydWVWYWxDIHx8CisgICAgICAgICAgICAgICAgICAgSUNBLT5nZXRPcGVyYW5kKDEpID09IEZhbHNlVmFsQykgJiYKKyAgICAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KElDQS0+Z2V0T3BlcmFuZCgxKSktPmdldFZhbHVlKCkuaXNQb3dlck9mMigpKSB7CisgICAgICAgICAgICAgICAgLy8gT2theSwgbm93IHdlIGtub3cgdGhhdCBldmVyeXRoaW5nIGlzIHNldCB1cCwgd2UganVzdCBkb24ndAorICAgICAgICAgICAgICAgIC8vIGtub3cgd2hldGhlciB3ZSBoYXZlIGEgaWNtcF9uZSBvciBpY21wX2VxIGFuZCB3aGV0aGVyIHRoZSAKKyAgICAgICAgICAgICAgICAvLyB0cnVlIG9yIGZhbHNlIHZhbCBpcyB0aGUgemVyby4KKyAgICAgICAgICAgICAgICBib29sIFNob3VsZE5vdFZhbCA9ICFUcnVlVmFsQy0+aXNaZXJvKCk7CisgICAgICAgICAgICAgICAgU2hvdWxkTm90VmFsIF49IElDLT5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9ORTsKKyAgICAgICAgICAgICAgICBWYWx1ZSAqViA9IElDQTsKKyAgICAgICAgICAgICAgICBpZiAoU2hvdWxkTm90VmFsKQorICAgICAgICAgICAgICAgICAgViA9IEJ1aWxkZXItPkNyZWF0ZVhvcihWLCBJQ0EtPmdldE9wZXJhbmQoMSkpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFNJLCBWKTsKKyAgICAgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAvLyBTZWUgaWYgd2UgYXJlIHNlbGVjdGluZyB0d28gdmFsdWVzIGJhc2VkIG9uIGEgY29tcGFyaXNvbiBvZiB0aGUgdHdvIHZhbHVlcy4KKyAgaWYgKEZDbXBJbnN0ICpGQ0kgPSBkeW5fY2FzdDxGQ21wSW5zdD4oQ29uZFZhbCkpIHsKKyAgICBpZiAoRkNJLT5nZXRPcGVyYW5kKDApID09IFRydWVWYWwgJiYgRkNJLT5nZXRPcGVyYW5kKDEpID09IEZhbHNlVmFsKSB7CisgICAgICAvLyBUcmFuc2Zvcm0gKFggPT0gWSkgPyBYIDogWSAgLT4gWQorICAgICAgaWYgKEZDSS0+Z2V0UHJlZGljYXRlKCkgPT0gRkNtcEluc3Q6OkZDTVBfT0VRKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IHNhZmUgaW4gZ2VuZXJhbCBmb3IgZmxvYXRpbmcgcG9pbnQ6ICAKKyAgICAgICAgLy8gY29uc2lkZXIgWD09IC0wLCBZPT0gKzAuCisgICAgICAgIC8vIEl0IGJlY29tZXMgc2FmZSBpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIG5vbnplcm8gY29uc3RhbnQuCisgICAgICAgIENvbnN0YW50RlAgKkNGUHQsICpDRlBmOworICAgICAgICBpZiAoKChDRlB0ID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oVHJ1ZVZhbCkpICYmCisgICAgICAgICAgICAgICFDRlB0LT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKSB8fAorICAgICAgICAgICAgKChDRlBmID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oRmFsc2VWYWwpKSAmJgorICAgICAgICAgICAgICFDRlBmLT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKSkKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoU0ksIEZhbHNlVmFsKTsKKyAgICAgIH0KKyAgICAgIC8vIFRyYW5zZm9ybSAoWCB1bmUgWSkgPyBYIDogWSAgLT4gWAorICAgICAgaWYgKEZDSS0+Z2V0UHJlZGljYXRlKCkgPT0gRkNtcEluc3Q6OkZDTVBfVU5FKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IHNhZmUgaW4gZ2VuZXJhbCBmb3IgZmxvYXRpbmcgcG9pbnQ6ICAKKyAgICAgICAgLy8gY29uc2lkZXIgWD09IC0wLCBZPT0gKzAuCisgICAgICAgIC8vIEl0IGJlY29tZXMgc2FmZSBpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIG5vbnplcm8gY29uc3RhbnQuCisgICAgICAgIENvbnN0YW50RlAgKkNGUHQsICpDRlBmOworICAgICAgICBpZiAoKChDRlB0ID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oVHJ1ZVZhbCkpICYmCisgICAgICAgICAgICAgICFDRlB0LT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKSB8fAorICAgICAgICAgICAgKChDRlBmID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oRmFsc2VWYWwpKSAmJgorICAgICAgICAgICAgICFDRlBmLT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKSkKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoU0ksIFRydWVWYWwpOworICAgICAgfQorICAgICAgLy8gTk9URTogaWYgd2Ugd2FudGVkIHRvLCB0aGlzIGlzIHdoZXJlIHRvIGRldGVjdCBNSU4vTUFYCisKKyAgICB9IGVsc2UgaWYgKEZDSS0+Z2V0T3BlcmFuZCgwKSA9PSBGYWxzZVZhbCAmJiBGQ0ktPmdldE9wZXJhbmQoMSkgPT0gVHJ1ZVZhbCl7CisgICAgICAvLyBUcmFuc2Zvcm0gKFggPT0gWSkgPyBZIDogWCAgLT4gWAorICAgICAgaWYgKEZDSS0+Z2V0UHJlZGljYXRlKCkgPT0gRkNtcEluc3Q6OkZDTVBfT0VRKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IHNhZmUgaW4gZ2VuZXJhbCBmb3IgZmxvYXRpbmcgcG9pbnQ6ICAKKyAgICAgICAgLy8gY29uc2lkZXIgWD09IC0wLCBZPT0gKzAuCisgICAgICAgIC8vIEl0IGJlY29tZXMgc2FmZSBpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIG5vbnplcm8gY29uc3RhbnQuCisgICAgICAgIENvbnN0YW50RlAgKkNGUHQsICpDRlBmOworICAgICAgICBpZiAoKChDRlB0ID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oVHJ1ZVZhbCkpICYmCisgICAgICAgICAgICAgICFDRlB0LT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKSB8fAorICAgICAgICAgICAgKChDRlBmID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oRmFsc2VWYWwpKSAmJgorICAgICAgICAgICAgICFDRlBmLT5nZXRWYWx1ZUFQRigpLmlzWmVybygpKSkKKyAgICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChTSSwgRmFsc2VWYWwpOworICAgICAgfQorICAgICAgLy8gVHJhbnNmb3JtIChYIHVuZSBZKSA/IFkgOiBYICAtPiBZCisgICAgICBpZiAoRkNJLT5nZXRQcmVkaWNhdGUoKSA9PSBGQ21wSW5zdDo6RkNNUF9VTkUpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3Qgc2FmZSBpbiBnZW5lcmFsIGZvciBmbG9hdGluZyBwb2ludDogIAorICAgICAgICAvLyBjb25zaWRlciBYPT0gLTAsIFk9PSArMC4KKyAgICAgICAgLy8gSXQgYmVjb21lcyBzYWZlIGlmIGVpdGhlciBvcGVyYW5kIGlzIGEgbm9uemVybyBjb25zdGFudC4KKyAgICAgICAgQ29uc3RhbnRGUCAqQ0ZQdCwgKkNGUGY7CisgICAgICAgIGlmICgoKENGUHQgPSBkeW5fY2FzdDxDb25zdGFudEZQPihUcnVlVmFsKSkgJiYKKyAgICAgICAgICAgICAgIUNGUHQtPmdldFZhbHVlQVBGKCkuaXNaZXJvKCkpIHx8CisgICAgICAgICAgICAoKENGUGYgPSBkeW5fY2FzdDxDb25zdGFudEZQPihGYWxzZVZhbCkpICYmCisgICAgICAgICAgICAgIUNGUGYtPmdldFZhbHVlQVBGKCkuaXNaZXJvKCkpKQorICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFNJLCBUcnVlVmFsKTsKKyAgICAgIH0KKyAgICAgIC8vIE5PVEU6IGlmIHdlIHdhbnRlZCB0bywgdGhpcyBpcyB3aGVyZSB0byBkZXRlY3QgTUlOL01BWAorICAgIH0KKyAgICAvLyBOT1RFOiBpZiB3ZSB3YW50ZWQgdG8sIHRoaXMgaXMgd2hlcmUgdG8gZGV0ZWN0IEFCUworICB9CisKKyAgLy8gU2VlIGlmIHdlIGFyZSBzZWxlY3RpbmcgdHdvIHZhbHVlcyBiYXNlZCBvbiBhIGNvbXBhcmlzb24gb2YgdGhlIHR3byB2YWx1ZXMuCisgIGlmIChJQ21wSW5zdCAqSUNJID0gZHluX2Nhc3Q8SUNtcEluc3Q+KENvbmRWYWwpKQorICAgIGlmIChJbnN0cnVjdGlvbiAqUmVzdWx0ID0gdmlzaXRTZWxlY3RJbnN0V2l0aElDbXAoU0ksIElDSSkpCisgICAgICByZXR1cm4gUmVzdWx0OworCisgIGlmIChJbnN0cnVjdGlvbiAqVEkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVHJ1ZVZhbCkpCisgICAgaWYgKEluc3RydWN0aW9uICpGSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihGYWxzZVZhbCkpCisgICAgICBpZiAoVEktPmhhc09uZVVzZSgpICYmIEZJLT5oYXNPbmVVc2UoKSkgeworICAgICAgICBJbnN0cnVjdGlvbiAqQWRkT3AgPSAwLCAqU3ViT3AgPSAwOworCisgICAgICAgIC8vIFR1cm4gKHNlbGVjdCBDLCAob3AgWCwgWSksIChvcCBYLCBaKSkgLT4gKG9wIFgsIChzZWxlY3QgQywgWSwgWikpCisgICAgICAgIGlmIChUSS0+Z2V0T3Bjb2RlKCkgPT0gRkktPmdldE9wY29kZSgpKQorICAgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqSVYgPSBGb2xkU2VsZWN0T3BPcChTSSwgVEksIEZJKSkKKyAgICAgICAgICAgIHJldHVybiBJVjsKKworICAgICAgICAvLyBUdXJuIHNlbGVjdCBDLCAoWCtZKSwgKFgtWSkgLS0+IChYKyhzZWxlY3QgQywgWSwgKC1ZKSkpLiAgVGhpcyBpcworICAgICAgICAvLyBldmVuIGxlZ2FsIGZvciBGUC4KKyAgICAgICAgaWYgKChUSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN1YiAmJgorICAgICAgICAgICAgIEZJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWRkKSB8fAorICAgICAgICAgICAgKFRJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RlN1YiAmJgorICAgICAgICAgICAgIEZJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkFkZCkpIHsKKyAgICAgICAgICBBZGRPcCA9IEZJOyBTdWJPcCA9IFRJOworICAgICAgICB9IGVsc2UgaWYgKChGSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN1YiAmJgorICAgICAgICAgICAgICAgICAgICBUSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFkZCkgfHwKKyAgICAgICAgICAgICAgICAgICAoRkktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpGU3ViICYmCisgICAgICAgICAgICAgICAgICAgIFRJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkFkZCkpIHsKKyAgICAgICAgICBBZGRPcCA9IFRJOyBTdWJPcCA9IEZJOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEFkZE9wKSB7CisgICAgICAgICAgVmFsdWUgKk90aGVyQWRkT3AgPSAwOworICAgICAgICAgIGlmIChTdWJPcC0+Z2V0T3BlcmFuZCgwKSA9PSBBZGRPcC0+Z2V0T3BlcmFuZCgwKSkgeworICAgICAgICAgICAgT3RoZXJBZGRPcCA9IEFkZE9wLT5nZXRPcGVyYW5kKDEpOworICAgICAgICAgIH0gZWxzZSBpZiAoU3ViT3AtPmdldE9wZXJhbmQoMCkgPT0gQWRkT3AtPmdldE9wZXJhbmQoMSkpIHsKKyAgICAgICAgICAgIE90aGVyQWRkT3AgPSBBZGRPcC0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoT3RoZXJBZGRPcCkgeworICAgICAgICAgICAgLy8gU28gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHdlIGhhdmUgKFkgLT4gT3RoZXJBZGRPcCk6CisgICAgICAgICAgICAvLyAgICAgICAgc2VsZWN0IEMsIChhZGQgWCwgWSksIChzdWIgWCwgWikKKyAgICAgICAgICAgIFZhbHVlICpOZWdWYWw7ICAvLyBDb21wdXRlIC1aCisgICAgICAgICAgICBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oU3ViT3AtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgICAgICAgIE5lZ1ZhbCA9IENvbnN0YW50RXhwcjo6Z2V0TmVnKEMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgTmVnVmFsID0gSW5zZXJ0TmV3SW5zdEJlZm9yZSgKKyAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5lZyhTdWJPcC0+Z2V0T3BlcmFuZCgxKSksIFNJKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmFsdWUgKk5ld1RydWVPcCA9IE90aGVyQWRkT3A7CisgICAgICAgICAgICBWYWx1ZSAqTmV3RmFsc2VPcCA9IE5lZ1ZhbDsKKyAgICAgICAgICAgIGlmIChBZGRPcCAhPSBUSSkKKyAgICAgICAgICAgICAgc3RkOjpzd2FwKE5ld1RydWVPcCwgTmV3RmFsc2VPcCk7CisgICAgICAgICAgICBJbnN0cnVjdGlvbiAqTmV3U2VsID0KKyAgICAgICAgICAgICAgU2VsZWN0SW5zdDo6Q3JlYXRlKENvbmRWYWwsIE5ld1RydWVPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0ZhbHNlT3ApOworCisgICAgICAgICAgICBOZXdTZWwgPSBJbnNlcnROZXdJbnN0QmVmb3JlKE5ld1NlbCwgU0kpOworICAgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoU3ViT3AtPmdldE9wZXJhbmQoMCksIE5ld1NlbCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgLy8gU2VlIGlmIHdlIGNhbiBmb2xkIHRoZSBzZWxlY3QgaW50byBvbmUgb2Ygb3VyIG9wZXJhbmRzLgorICBpZiAoU0kuZ2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpKSB7CisgICAgaWYgKEluc3RydWN0aW9uICpGb2xkSSA9IEZvbGRTZWxlY3RJbnRvT3AoU0ksIFRydWVWYWwsIEZhbHNlVmFsKSkKKyAgICAgIHJldHVybiBGb2xkSTsKKyAgICAKKyAgICAvLyBNQVgoTUFYKGEsIGIpLCBhKSAtPiBNQVgoYSwgYikKKyAgICAvLyBNSU4oTUlOKGEsIGIpLCBhKSAtPiBNSU4oYSwgYikKKyAgICAvLyBNQVgoTUlOKGEsIGIpLCBhKSAtPiBhCisgICAgLy8gTUlOKE1BWChhLCBiKSwgYSkgLT4gYQorICAgIFZhbHVlICpMSFMsICpSSFMsICpMSFMyLCAqUkhTMjsKKyAgICBpZiAoU2VsZWN0UGF0dGVybkZsYXZvciBTUEYgPSBNYXRjaFNlbGVjdFBhdHRlcm4oJlNJLCBMSFMsIFJIUykpIHsKKyAgICAgIGlmIChTZWxlY3RQYXR0ZXJuRmxhdm9yIFNQRjIgPSBNYXRjaFNlbGVjdFBhdHRlcm4oTEhTLCBMSFMyLCBSSFMyKSkKKyAgICAgICAgaWYgKEluc3RydWN0aW9uICpSID0gRm9sZFNQRm9mU1BGKGNhc3Q8SW5zdHJ1Y3Rpb24+KExIUyksU1BGMixMSFMyLFJIUzIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ksIFNQRiwgUkhTKSkKKyAgICAgICAgICByZXR1cm4gUjsKKyAgICAgIGlmIChTZWxlY3RQYXR0ZXJuRmxhdm9yIFNQRjIgPSBNYXRjaFNlbGVjdFBhdHRlcm4oUkhTLCBMSFMyLCBSSFMyKSkKKyAgICAgICAgaWYgKEluc3RydWN0aW9uICpSID0gRm9sZFNQRm9mU1BGKGNhc3Q8SW5zdHJ1Y3Rpb24+KFJIUyksU1BGMixMSFMyLFJIUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSSwgU1BGLCBMSFMpKQorICAgICAgICAgIHJldHVybiBSOworICAgIH0KKworICAgIC8vIFRPRE8uCisgICAgLy8gQUJTKC1YKSAtPiBBQlMoWCkKKyAgICAvLyBBQlMoQUJTKFgpKSAtPiBBQlMoWCkKKyAgfQorCisgIC8vIFNlZSBpZiB3ZSBjYW4gZm9sZCB0aGUgc2VsZWN0IGludG8gYSBwaGkgbm9kZSBpZiB0aGUgY29uZGl0aW9uIGlzIGEgc2VsZWN0LgorICBpZiAoaXNhPFBISU5vZGU+KFNJLmdldENvbmRpdGlvbigpKSkgCisgICAgLy8gVGhlIHRydWUvZmFsc2UgdmFsdWVzIGhhdmUgdG8gYmUgbGl2ZSBpbiB0aGUgUEhJIHByZWRlY2Vzc29yJ3MgYmxvY2tzLgorICAgIGlmIChDYW5TZWxlY3RPcGVyYW5kQmVNYXBwaW5nSW50b1ByZWRCbG9jayhUcnVlVmFsLCBTSSkgJiYKKyAgICAgICAgQ2FuU2VsZWN0T3BlcmFuZEJlTWFwcGluZ0ludG9QcmVkQmxvY2soRmFsc2VWYWwsIFNJKSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKFNJKSkKKyAgICAgICAgcmV0dXJuIE5WOworCisgIGlmIChCaW5hcnlPcGVyYXRvcjo6aXNOb3QoQ29uZFZhbCkpIHsKKyAgICBTSS5zZXRPcGVyYW5kKDAsIEJpbmFyeU9wZXJhdG9yOjpnZXROb3RBcmd1bWVudChDb25kVmFsKSk7CisgICAgU0kuc2V0T3BlcmFuZCgxLCBGYWxzZVZhbCk7CisgICAgU0kuc2V0T3BlcmFuZCgyLCBUcnVlVmFsKTsKKyAgICByZXR1cm4gJlNJOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZVNoaWZ0cy5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZVNoaWZ0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjNzNkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lU2hpZnRzLmNwcApAQCAtMCwwICsxLDQ1NyBAQAorLy89PT0tIEluc3RDb21iaW5lU2hpZnRzLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdmlzaXRTaGwsIHZpc2l0TFNociwgYW5kIHZpc2l0QVNociBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkluc3RDb21iaW5lLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdHRlcm5NYXRjaC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBuYW1lc3BhY2UgUGF0dGVybk1hdGNoOworCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjpjb21tb25TaGlmdFRyYW5zZm9ybXMoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgYXNzZXJ0KEkuZ2V0T3BlcmFuZCgxKS0+Z2V0VHlwZSgpID09IEkuZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKTsKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKworICAvLyBzaGwgWCwgMCA9PSBYIGFuZCBzaHIgWCwgMCA9PSBYCisgIC8vIHNobCAwLCBYID09IDAgYW5kIHNociAwLCBYID09IDAKKyAgaWYgKE9wMSA9PSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKE9wMS0+Z2V0VHlwZSgpKSB8fAorICAgICAgT3AwID09IENvbnN0YW50OjpnZXROdWxsVmFsdWUoT3AwLT5nZXRUeXBlKCkpKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMCk7CisgIAorICBpZiAoaXNhPFVuZGVmVmFsdWU+KE9wMCkpIHsgICAgICAgICAgICAKKyAgICBpZiAoSS5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QVNocikgLy8gdW5kZWYgPj5zIFggLT4gdW5kZWYKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEksIE9wMCk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmIDw8IFggLT4gMCwgdW5kZWYgPj51IFggLT4gMAorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJLmdldFR5cGUoKSkpOworICB9CisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oT3AxKSkgeworICAgIGlmIChJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBU2hyKSAgLy8gWCA+PnMgdW5kZWYgLT4gWAorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgT3AwKTsgICAgICAgICAgCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYIDw8IHVuZGVmLCBYID4+dSB1bmRlZiAtPiAwCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEkuZ2V0VHlwZSgpKSk7CisgIH0KKworICAvLyBTZWUgaWYgd2UgY2FuIGZvbGQgYXdheSB0aGlzIHNoaWZ0LgorICBpZiAoU2ltcGxpZnlEZW1hbmRlZEluc3RydWN0aW9uQml0cyhJKSkKKyAgICByZXR1cm4gJkk7CisKKyAgLy8gVHJ5IHRvIGZvbGQgY29uc3RhbnQgYW5kIGludG8gc2VsZWN0IGFyZ3VtZW50cy4KKyAgaWYgKGlzYTxDb25zdGFudD4oT3AwKSkKKyAgICBpZiAoU2VsZWN0SW5zdCAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihPcDEpKQorICAgICAgaWYgKEluc3RydWN0aW9uICpSID0gRm9sZE9wSW50b1NlbGVjdChJLCBTSSkpCisgICAgICAgIHJldHVybiBSOworCisgIGlmIChDb25zdGFudEludCAqQ1VJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9wMSkpCisgICAgaWYgKEluc3RydWN0aW9uICpSZXMgPSBGb2xkU2hpZnRCeUNvbnN0YW50KE9wMCwgQ1VJLCBJKSkKKyAgICAgIHJldHVybiBSZXM7CisgIHJldHVybiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjpGb2xkU2hpZnRCeUNvbnN0YW50KFZhbHVlICpPcDAsIENvbnN0YW50SW50ICpPcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIGJvb2wgaXNMZWZ0U2hpZnQgPSBJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGw7CisKKyAgLy8gU2VlIGlmIHdlIGNhbiBzaW1wbGlmeSBhbnkgaW5zdHJ1Y3Rpb25zIHVzZWQgYnkgdGhlIGluc3RydWN0aW9uIHdob3NlIHNvbGUgCisgIC8vIHB1cnBvc2UgaXMgdG8gY29tcHV0ZSBiaXRzIHdlIGRvbid0IGNhcmUgYWJvdXQuCisgIHVpbnQzMl90IFR5cGVCaXRzID0gT3AwLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgCisgIC8vIHNobCBpMzIgWCwgMzIgPSAwIGFuZCBzcmwgaTggWSwgOSA9IDAsIC4uLiBqdXN0IGRvbid0IGVsaW1pbmF0ZQorICAvLyBhIHNpZ25lZCBzaGlmdC4KKyAgLy8KKyAgaWYgKE9wMS0+dWdlKFR5cGVCaXRzKSkgeworICAgIGlmIChJLmdldE9wY29kZSgpICE9IEluc3RydWN0aW9uOjpBU2hyKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShPcDAtPmdldFR5cGUoKSkpOworICAgIC8vIGFzaHIgaTMyIFgsIDMyIC0tPiBhc2hyIGkzMiBYLCAzMQorICAgIEkuc2V0T3BlcmFuZCgxLCBDb25zdGFudEludDo6Z2V0KEkuZ2V0VHlwZSgpLCBUeXBlQml0cy0xKSk7CisgICAgcmV0dXJuICZJOworICB9CisgIAorICAvLyAoKFgqQzEpIDw8IEMyKSA9PSAoWCAqIChDMSA8PCBDMikpCisgIGlmIChCaW5hcnlPcGVyYXRvciAqQk8gPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oT3AwKSkKKyAgICBpZiAoQk8tPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpNdWwgJiYgaXNMZWZ0U2hpZnQpCisgICAgICBpZiAoQ29uc3RhbnQgKkJPT3AgPSBkeW5fY2FzdDxDb25zdGFudD4oQk8tPmdldE9wZXJhbmQoMSkpKQorICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU11bChCTy0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldFNobChCT09wLCBPcDEpKTsKKyAgCisgIC8vIFRyeSB0byBmb2xkIGNvbnN0YW50IGFuZCBpbnRvIHNlbGVjdCBhcmd1bWVudHMuCisgIGlmIChTZWxlY3RJbnN0ICpTSSA9IGR5bl9jYXN0PFNlbGVjdEluc3Q+KE9wMCkpCisgICAgaWYgKEluc3RydWN0aW9uICpSID0gRm9sZE9wSW50b1NlbGVjdChJLCBTSSkpCisgICAgICByZXR1cm4gUjsKKyAgaWYgKGlzYTxQSElOb2RlPihPcDApKQorICAgIGlmIChJbnN0cnVjdGlvbiAqTlYgPSBGb2xkT3BJbnRvUGhpKEkpKQorICAgICAgcmV0dXJuIE5WOworICAKKyAgLy8gRm9sZCBzaGlmdDIodHJ1bmMoc2hpZnQxKHgsYzEpKSwgYzIpIC0+IHRydW5jKHNoaWZ0MihzaGlmdDEoeCxjMSksYzIpKQorICBpZiAoVHJ1bmNJbnN0ICpUSSA9IGR5bl9jYXN0PFRydW5jSW5zdD4oT3AwKSkgeworICAgIEluc3RydWN0aW9uICpUck9wID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFRJLT5nZXRPcGVyYW5kKDApKTsKKyAgICAvLyBJZiAnc2hpZnQyJyBpcyBhbiBhc2hyLCB3ZSB3b3VsZCBoYXZlIHRvIGdldCB0aGUgc2lnbiBiaXQgaW50byBhIGZ1bm55CisgICAgLy8gcGxhY2UuICBEb24ndCB0cnkgdG8gZG8gdGhpcyB0cmFuc2Zvcm1hdGlvbiBpbiB0aGlzIGNhc2UuICBBbHNvLCB3ZQorICAgIC8vIHJlcXVpcmUgdGhhdCB0aGUgaW5wdXQgb3BlcmFuZCBpcyBhIHNoaWZ0LWJ5LWNvbnN0YW50IHNvIHRoYXQgd2UgaGF2ZQorICAgIC8vIGNvbmZpZGVuY2UgdGhhdCB0aGUgc2hpZnRzIHdpbGwgZ2V0IGZvbGRlZCB0b2dldGhlci4gIFdlIGNvdWxkIGRvIHRoaXMKKyAgICAvLyB4Zm9ybSBpbiBtb3JlIGNhc2VzLCBidXQgaXQgaXMgdW5saWtlbHkgdG8gYmUgcHJvZml0YWJsZS4KKyAgICBpZiAoVHJPcCAmJiBJLmlzTG9naWNhbFNoaWZ0KCkgJiYgVHJPcC0+aXNTaGlmdCgpICYmIAorICAgICAgICBpc2E8Q29uc3RhbnRJbnQ+KFRyT3AtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAvLyBPa2F5LCB3ZSdsbCBkbyB0aGlzIHhmb3JtLiAgTWFrZSB0aGUgc2hpZnQgb2Ygc2hpZnQuCisgICAgICBDb25zdGFudCAqU2hBbXQgPSBDb25zdGFudEV4cHI6OmdldFpFeHQoT3AxLCBUck9wLT5nZXRUeXBlKCkpOworICAgICAgLy8gKHNoaWZ0MiAoc2hpZnQxICYgMHgwMEZGKSwgYzIpCisgICAgICBWYWx1ZSAqTlNoID0gQnVpbGRlci0+Q3JlYXRlQmluT3AoSS5nZXRPcGNvZGUoKSwgVHJPcCwgU2hBbXQpOworCisgICAgICAvLyBGb3IgbG9naWNhbCBzaGlmdHMsIHRoZSB0cnVuY2F0aW9uIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyB0aGUgaGlnaAorICAgICAgLy8gcGFydCBvZiB0aGUgcmVnaXN0ZXIgYmUgemVyb3MuICBFbXVsYXRlIHRoaXMgYnkgaW5zZXJ0aW5nIGFuIEFORCB0bworICAgICAgLy8gY2xlYXIgdGhlIHRvcCBiaXRzIGFzIG5lZWRlZC4gIFRoaXMgJ2FuZCcgd2lsbCB1c3VhbGx5IGJlIHphcHBlZCBieQorICAgICAgLy8gb3RoZXIgeGZvcm1zIGxhdGVyIGlmIGRlYWQuCisgICAgICB1bnNpZ25lZCBTcmNTaXplID0gVHJPcC0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICB1bnNpZ25lZCBEc3RTaXplID0gVEktPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgICAgQVBJbnQgTWFza1YoQVBJbnQ6OmdldExvd0JpdHNTZXQoU3JjU2l6ZSwgRHN0U2l6ZSkpOworICAgICAgCisgICAgICAvLyBUaGUgbWFzayB3ZSBjb25zdHJ1Y3RlZCBzYXlzIHdoYXQgdGhlIHRydW5jIHdvdWxkIGRvIGlmIG9jY3VycmluZworICAgICAgLy8gYmV0d2VlbiB0aGUgc2hpZnRzLiAgV2Ugd2FudCB0byBrbm93IHRoZSBlZmZlY3QgKmFmdGVyKiB0aGUgc2Vjb25kCisgICAgICAvLyBzaGlmdC4gIFdlIGtub3cgdGhhdCBpdCBpcyBhIGxvZ2ljYWwgc2hpZnQgYnkgYSBjb25zdGFudCwgc28gYWRqdXN0IHRoZQorICAgICAgLy8gbWFzayBhcyBhcHByb3ByaWF0ZS4KKyAgICAgIGlmIChJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGwpCisgICAgICAgIE1hc2tWIDw8PSBPcDEtPmdldFpFeHRWYWx1ZSgpOworICAgICAgZWxzZSB7CisgICAgICAgIGFzc2VydChJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpMU2hyICYmICJVbmtub3duIGxvZ2ljYWwgc2hpZnQiKTsKKyAgICAgICAgTWFza1YgPSBNYXNrVi5sc2hyKE9wMS0+Z2V0WkV4dFZhbHVlKCkpOworICAgICAgfQorCisgICAgICAvLyBzaGlmdDEgJiAweDAwRkYKKyAgICAgIFZhbHVlICpBbmQgPSBCdWlsZGVyLT5DcmVhdGVBbmQoTlNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEkuZ2V0Q29udGV4dCgpLCBNYXNrVikpOworCisgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIHRydW5jYXRlZCB0byB0aGUgaW50ZXJlc3Rpbmcgc2l6ZS4KKyAgICAgIHJldHVybiBuZXcgVHJ1bmNJbnN0KEFuZCwgSS5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorICAKKyAgaWYgKE9wMC0+aGFzT25lVXNlKCkpIHsKKyAgICBpZiAoQmluYXJ5T3BlcmF0b3IgKk9wMEJPID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMCkpIHsKKyAgICAgIC8vIFR1cm4gKChYID4+IEMpICsgWSkgPDwgQyAgLT4gIChYICsgKFkgPDwgQykpICYgKH4wIDw8IEMpCisgICAgICBWYWx1ZSAqVjEsICpWMjsKKyAgICAgIENvbnN0YW50SW50ICpDQzsKKyAgICAgIHN3aXRjaCAoT3AwQk8tPmdldE9wY29kZSgpKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOiB7CisgICAgICAgIC8vIFRoZXNlIG9wZXJhdG9ycyBjb21tdXRlLgorICAgICAgICAvLyBUdXJuIChZICsgKFggPj4gQykpIDw8IEMgIC0+ICAoWCArIChZIDw8IEMpKSAmICh+MCA8PCBDKQorICAgICAgICBpZiAoaXNMZWZ0U2hpZnQgJiYgT3AwQk8tPmdldE9wZXJhbmQoMSktPmhhc09uZVVzZSgpICYmCisgICAgICAgICAgICBtYXRjaChPcDBCTy0+Z2V0T3BlcmFuZCgxKSwgbV9TaHIobV9WYWx1ZShWMSksCisgICAgICAgICAgICAgICAgICBtX1NwZWNpZmljKE9wMSkpKSkgeworICAgICAgICAgIFZhbHVlICpZUyA9ICAgICAgICAgLy8gKFkgPDwgQykKKyAgICAgICAgICAgIEJ1aWxkZXItPkNyZWF0ZVNobChPcDBCTy0+Z2V0T3BlcmFuZCgwKSwgT3AxKTsKKyAgICAgICAgICAvLyAoWCArIChZIDw8IEMpKQorICAgICAgICAgIFZhbHVlICpYID0gQnVpbGRlci0+Q3JlYXRlQmluT3AoT3AwQk8tPmdldE9wY29kZSgpLCBZUywgVjEpOworICAgICAgICAgIHVpbnQzMl90IE9wMVZhbCA9IE9wMS0+Z2V0TGltaXRlZFZhbHVlKFR5cGVCaXRzKTsKKyAgICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChYLCBDb25zdGFudEludDo6Z2V0KEkuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KFR5cGVCaXRzLCBUeXBlQml0cy1PcDFWYWwpKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFR1cm4gKFkgKyAoKFggPj4gQykgJiBDQykpIDw8IEMgIC0+ICAoKFggJiAoQ0MgPDwgQykpICsgKFkgPDwgQykpCisgICAgICAgIFZhbHVlICpPcDBCT09wMSA9IE9wMEJPLT5nZXRPcGVyYW5kKDEpOworICAgICAgICBpZiAoaXNMZWZ0U2hpZnQgJiYgT3AwQk9PcDEtPmhhc09uZVVzZSgpICYmCisgICAgICAgICAgICBtYXRjaChPcDBCT09wMSwgCisgICAgICAgICAgICAgICAgICBtX0FuZChtX1NocihtX1ZhbHVlKFYxKSwgbV9TcGVjaWZpYyhPcDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQ29uc3RhbnRJbnQoQ0MpKSkgJiYKKyAgICAgICAgICAgIGNhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wMEJPT3AxKS0+Z2V0T3BlcmFuZCgwKS0+aGFzT25lVXNlKCkpIHsKKyAgICAgICAgICBWYWx1ZSAqWVMgPSAgIC8vIChZIDw8IEMpCisgICAgICAgICAgICBCdWlsZGVyLT5DcmVhdGVTaGwoT3AwQk8tPmdldE9wZXJhbmQoMCksIE9wMSk7CisgICAgICAgICAgLy8gWCAmIChDQyA8PCBDKQorICAgICAgICAgIFZhbHVlICpYTSA9IEJ1aWxkZXItPkNyZWF0ZUFuZChWMSwgQ29uc3RhbnRFeHByOjpnZXRTaGwoQ0MsIE9wMSkpOworICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKE9wMEJPLT5nZXRPcGNvZGUoKSwgWVMsIFhNKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgICAKKyAgICAgIC8vIEZBTEwgVEhST1VHSC4KKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjogeworICAgICAgICAvLyBUdXJuICgoWCA+PiBDKSArIFkpIDw8IEMgIC0+ICAoWCArIChZIDw8IEMpKSAmICh+MCA8PCBDKQorICAgICAgICBpZiAoaXNMZWZ0U2hpZnQgJiYgT3AwQk8tPmdldE9wZXJhbmQoMCktPmhhc09uZVVzZSgpICYmCisgICAgICAgICAgICBtYXRjaChPcDBCTy0+Z2V0T3BlcmFuZCgwKSwgbV9TaHIobV9WYWx1ZShWMSksCisgICAgICAgICAgICAgICAgICBtX1NwZWNpZmljKE9wMSkpKSkgeworICAgICAgICAgIFZhbHVlICpZUyA9ICAvLyAoWSA8PCBDKQorICAgICAgICAgICAgQnVpbGRlci0+Q3JlYXRlU2hsKE9wMEJPLT5nZXRPcGVyYW5kKDEpLCBPcDEpOworICAgICAgICAgIC8vIChYICsgKFkgPDwgQykpCisgICAgICAgICAgVmFsdWUgKlggPSBCdWlsZGVyLT5DcmVhdGVCaW5PcChPcDBCTy0+Z2V0T3Bjb2RlKCksIFYxLCBZUyk7CisgICAgICAgICAgdWludDMyX3QgT3AxVmFsID0gT3AxLT5nZXRMaW1pdGVkVmFsdWUoVHlwZUJpdHMpOworICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKFgsIENvbnN0YW50SW50OjpnZXQoSS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICBBUEludDo6Z2V0SGlnaEJpdHNTZXQoVHlwZUJpdHMsIFR5cGVCaXRzLU9wMVZhbCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVHVybiAoKChYID4+IEMpJkNDKSArIFkpIDw8IEMgIC0+ICAoWCArIChZIDw8IEMpKSAmIChDQyA8PCBDKQorICAgICAgICBpZiAoaXNMZWZ0U2hpZnQgJiYgT3AwQk8tPmdldE9wZXJhbmQoMCktPmhhc09uZVVzZSgpICYmCisgICAgICAgICAgICBtYXRjaChPcDBCTy0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgIG1fQW5kKG1fU2hyKG1fVmFsdWUoVjEpLCBtX1ZhbHVlKFYyKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtX0NvbnN0YW50SW50KENDKSkpICYmIFYyID09IE9wMSAmJgorICAgICAgICAgICAgY2FzdDxCaW5hcnlPcGVyYXRvcj4oT3AwQk8tPmdldE9wZXJhbmQoMCkpCisgICAgICAgICAgICAgICAgLT5nZXRPcGVyYW5kKDApLT5oYXNPbmVVc2UoKSkgeworICAgICAgICAgIFZhbHVlICpZUyA9IC8vIChZIDw8IEMpCisgICAgICAgICAgICBCdWlsZGVyLT5DcmVhdGVTaGwoT3AwQk8tPmdldE9wZXJhbmQoMSksIE9wMSk7CisgICAgICAgICAgLy8gWCAmIChDQyA8PCBDKQorICAgICAgICAgIFZhbHVlICpYTSA9IEJ1aWxkZXItPkNyZWF0ZUFuZChWMSwgQ29uc3RhbnRFeHByOjpnZXRTaGwoQ0MsIE9wMSkpOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKE9wMEJPLT5nZXRPcGNvZGUoKSwgWE0sIFlTKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIG9wZXJhbmQgaXMgYW4gYml0d2lzZSBvcGVyYXRvciB3aXRoIGEgY29uc3RhbnQgUkhTLCBhbmQgdGhlCisgICAgICAvLyBzaGlmdCBpcyB0aGUgb25seSB1c2UsIHdlIGNhbiBwdWxsIGl0IG91dCBvZiB0aGUgc2hpZnQuCisgICAgICBpZiAoQ29uc3RhbnRJbnQgKk9wMEMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AwQk8tPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgIGJvb2wgaXNWYWxpZCA9IHRydWU7ICAgICAvLyBWYWxpZCBvbmx5IGZvciBBbmQsIE9yLCBYb3IKKyAgICAgICAgYm9vbCBoaWdoQml0U2V0ID0gZmFsc2U7IC8vIFRyYW5zZm9ybSBpZiBoaWdoIGJpdCBvZiBjb25zdGFudCBzZXQ/CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKE9wMEJPLT5nZXRPcGNvZGUoKSkgeworICAgICAgICBkZWZhdWx0OiBpc1ZhbGlkID0gZmFsc2U7IGJyZWFrOyAgIC8vIERvIG5vdCBwZXJmb3JtIHRyYW5zZm9ybSEKKyAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOgorICAgICAgICAgIGlzVmFsaWQgPSBpc0xlZnRTaGlmdDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgICAgICAgICBoaWdoQml0U2V0ID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgICAgICAgICBoaWdoQml0U2V0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHNpZ25lZCBzaGlmdCByaWdodCwgYW5kIHRoZSBoaWdoIGJpdCBpcyBtb2RpZmllZAorICAgICAgICAvLyBieSB0aGUgbG9naWNhbCBvcGVyYXRpb24sIGRvIG5vdCBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgLy8gVGhlIGhpZ2hCaXRTZXQgYm9vbGVhbiBpbmRpY2F0ZXMgdGhlIHZhbHVlIG9mIHRoZSBoaWdoIGJpdCBvZgorICAgICAgICAvLyB0aGUgY29uc3RhbnQgd2hpY2ggd291bGQgY2F1c2UgaXQgdG8gYmUgbW9kaWZpZWQgZm9yIHRoaXMKKyAgICAgICAgLy8gb3BlcmF0aW9uLgorICAgICAgICAvLworICAgICAgICBpZiAoaXNWYWxpZCAmJiBJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBU2hyKQorICAgICAgICAgIGlzVmFsaWQgPSBPcDBDLT5nZXRWYWx1ZSgpW1R5cGVCaXRzLTFdID09IGhpZ2hCaXRTZXQ7CisgICAgICAgIAorICAgICAgICBpZiAoaXNWYWxpZCkgeworICAgICAgICAgIENvbnN0YW50ICpOZXdSSFMgPSBDb25zdGFudEV4cHI6OmdldChJLmdldE9wY29kZSgpLCBPcDBDLCBPcDEpOworICAgICAgICAgIAorICAgICAgICAgIFZhbHVlICpOZXdTaGlmdCA9CisgICAgICAgICAgICBCdWlsZGVyLT5DcmVhdGVCaW5PcChJLmdldE9wY29kZSgpLCBPcDBCTy0+Z2V0T3BlcmFuZCgwKSwgT3AxKTsKKyAgICAgICAgICBOZXdTaGlmdC0+dGFrZU5hbWUoT3AwQk8pOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKE9wMEJPLT5nZXRPcGNvZGUoKSwgTmV3U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3UkhTKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLy8gRmluZCBvdXQgaWYgdGhpcyBpcyBhIHNoaWZ0IG9mIGEgc2hpZnQgYnkgYSBjb25zdGFudC4KKyAgQmluYXJ5T3BlcmF0b3IgKlNoaWZ0T3AgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oT3AwKTsKKyAgaWYgKFNoaWZ0T3AgJiYgIVNoaWZ0T3AtPmlzU2hpZnQoKSkKKyAgICBTaGlmdE9wID0gMDsKKyAgCisgIGlmIChTaGlmdE9wICYmIGlzYTxDb25zdGFudEludD4oU2hpZnRPcC0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICBDb25zdGFudEludCAqU2hpZnRBbXQxQyA9IGNhc3Q8Q29uc3RhbnRJbnQ+KFNoaWZ0T3AtPmdldE9wZXJhbmQoMSkpOworICAgIHVpbnQzMl90IFNoaWZ0QW10MSA9IFNoaWZ0QW10MUMtPmdldExpbWl0ZWRWYWx1ZShUeXBlQml0cyk7CisgICAgdWludDMyX3QgU2hpZnRBbXQyID0gT3AxLT5nZXRMaW1pdGVkVmFsdWUoVHlwZUJpdHMpOworICAgIGFzc2VydChTaGlmdEFtdDIgIT0gMCAmJiAiU2hvdWxkIGhhdmUgYmVlbiBzaW1wbGlmaWVkIGVhcmxpZXIiKTsKKyAgICBpZiAoU2hpZnRBbXQxID09IDApIHJldHVybiAwOyAgLy8gV2lsbCBiZSBzaW1wbGlmaWVkIGluIHRoZSBmdXR1cmUuCisgICAgVmFsdWUgKlggPSBTaGlmdE9wLT5nZXRPcGVyYW5kKDApOworICAgIAorICAgIHVpbnQzMl90IEFtdFN1bSA9IFNoaWZ0QW10MStTaGlmdEFtdDI7ICAgLy8gRm9sZCBpbnRvIG9uZSBiaWcgc2hpZnQuCisgICAgCisgICAgY29uc3QgSW50ZWdlclR5cGUgKlR5ID0gY2FzdDxJbnRlZ2VyVHlwZT4oSS5nZXRUeXBlKCkpOworICAgIAorICAgIC8vIENoZWNrIGZvciAoWCA8PCBjMSkgPDwgYzIgIGFuZCAgKFggPj4gYzEpID4+IGMyCisgICAgaWYgKEkuZ2V0T3Bjb2RlKCkgPT0gU2hpZnRPcC0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgb3ZlcnNpemVkIGNvbXBvc2l0ZSBzaGlmdCwgdGhlbiB1bnNpZ25lZCBzaGlmdHMgZ2V0IDAsIGFzaHIKKyAgICAgIC8vIHNhdHVyYXRlcy4KKyAgICAgIGlmIChBbXRTdW0gPj0gVHlwZUJpdHMpIHsKKyAgICAgICAgaWYgKEkuZ2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246OkFTaHIpCisgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJLmdldFR5cGUoKSkpOworICAgICAgICBBbXRTdW0gPSBUeXBlQml0cy0xOyAgLy8gU2F0dXJhdGUgdG8gMzEgZm9yIGkzMiBhc2hyLgorICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShJLmdldE9wY29kZSgpLCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeSwgQW10U3VtKSk7CisgICAgfQorICAgIAorICAgIGlmIChTaGlmdE9wLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TFNociAmJgorICAgICAgICBJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBU2hyKSB7CisgICAgICBpZiAoQW10U3VtID49IFR5cGVCaXRzKQorICAgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEkuZ2V0VHlwZSgpKSk7CisgICAgICAKKyAgICAgIC8vICgoWCA+PnUgQzEpID4+cyBDMikgLT4gKFggPj51IChDMStDMikpICBzaW5jZSBDMSAhPSAwLgorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVMU2hyKFgsIENvbnN0YW50SW50OjpnZXQoVHksIEFtdFN1bSkpOworICAgIH0KKyAgICAKKyAgICBpZiAoU2hpZnRPcC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFTaHIgJiYKKyAgICAgICAgSS5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TFNocikgeworICAgICAgLy8gKChYID4+cyBDMSkgPj51IEMyKSAtPiAoKFggPj5zIChDMStDMikpICYgbWFzaykgc2luY2UgQzEgIT0gMC4KKyAgICAgIGlmIChBbXRTdW0gPj0gVHlwZUJpdHMpCisgICAgICAgIEFtdFN1bSA9IFR5cGVCaXRzLTE7CisgICAgICAKKyAgICAgIFZhbHVlICpTaGlmdCA9IEJ1aWxkZXItPkNyZWF0ZUFTaHIoWCwgQ29uc3RhbnRJbnQ6OmdldChUeSwgQW10U3VtKSk7CisKKyAgICAgIEFQSW50IE1hc2soQVBJbnQ6OmdldExvd0JpdHNTZXQoVHlwZUJpdHMsIFR5cGVCaXRzIC0gU2hpZnRBbXQyKSk7CisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSS5nZXRDb250ZXh0KCksIE1hc2spKTsKKyAgICB9CisgICAgCisgICAgLy8gT2theSwgaWYgd2UgZ2V0IGhlcmUsIG9uZSBzaGlmdCBtdXN0IGJlIGxlZnQsIGFuZCB0aGUgb3RoZXIgc2hpZnQgbXVzdCBiZQorICAgIC8vIHJpZ2h0LiAgU2VlIGlmIHRoZSBhbW91bnRzIGFyZSBlcXVhbC4KKyAgICBpZiAoU2hpZnRBbXQxID09IFNoaWZ0QW10MikgeworICAgICAgLy8gSWYgd2UgaGF2ZSAoKFggPj4/IEMpIDw8IEMpLCB0dXJuIHRoaXMgaW50byBYICYgKC0xIDw8IEMpLgorICAgICAgaWYgKEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNobCkgeworICAgICAgICBBUEludCBNYXNrKEFQSW50OjpnZXRIaWdoQml0c1NldChUeXBlQml0cywgVHlwZUJpdHMgLSBTaGlmdEFtdDEpKTsKKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJLmdldENvbnRleHQoKSxNYXNrKSk7CisgICAgICB9CisgICAgICAvLyBJZiB3ZSBoYXZlICgoWCA8PCBDKSA+PnUgQyksIHR1cm4gdGhpcyBpbnRvIFggJiAoLTEgPj51IEMpLgorICAgICAgaWYgKEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkxTaHIpIHsKKyAgICAgICAgQVBJbnQgTWFzayhBUEludDo6Z2V0TG93Qml0c1NldChUeXBlQml0cywgVHlwZUJpdHMgLSBTaGlmdEFtdDEpKTsKKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEkuZ2V0Q29udGV4dCgpLCBNYXNrKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChTaGlmdEFtdDEgPCBTaGlmdEFtdDIpIHsKKyAgICAgIHVpbnQzMl90IFNoaWZ0RGlmZiA9IFNoaWZ0QW10Mi1TaGlmdEFtdDE7CisgICAgICAKKyAgICAgIC8vIChYID4+PyBDMSkgPDwgQzIgLS0+IFggPDwgKEMyLUMxKSAmICgtMSA8PCBDMikKKyAgICAgIGlmIChJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGwpIHsKKyAgICAgICAgYXNzZXJ0KFNoaWZ0T3AtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpMU2hyIHx8CisgICAgICAgICAgICAgICBTaGlmdE9wLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QVNocik7CisgICAgICAgIFZhbHVlICpTaGlmdCA9IEJ1aWxkZXItPkNyZWF0ZVNobChYLCBDb25zdGFudEludDo6Z2V0KFR5LCBTaGlmdERpZmYpKTsKKyAgICAgICAgCisgICAgICAgIEFQSW50IE1hc2soQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KFR5cGVCaXRzLCBUeXBlQml0cyAtIFNoaWZ0QW10MikpOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJLmdldENvbnRleHQoKSxNYXNrKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIChYIDw8IEMxKSA+PnUgQzIgIC0tPiBYID4+dSAoQzItQzEpICYgKC0xID4+IEMyKQorICAgICAgaWYgKEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkxTaHIpIHsKKyAgICAgICAgYXNzZXJ0KFNoaWZ0T3AtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGwpOworICAgICAgICBWYWx1ZSAqU2hpZnQgPSBCdWlsZGVyLT5DcmVhdGVMU2hyKFgsIENvbnN0YW50SW50OjpnZXQoVHksIFNoaWZ0RGlmZikpOworICAgICAgICAKKyAgICAgICAgQVBJbnQgTWFzayhBUEludDo6Z2V0TG93Qml0c1NldChUeXBlQml0cywgVHlwZUJpdHMgLSBTaGlmdEFtdDIpKTsKKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSS5nZXRDb250ZXh0KCksTWFzaykpOworICAgICAgfQorICAgICAgCisgICAgICAvLyBXZSBjYW4ndCBoYW5kbGUgKFggPDwgQzEpID4+cyBDMiwgaXQgc2hpZnRzIGFyYml0cmFyeSBiaXRzIGluLgorICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoU2hpZnRBbXQyIDwgU2hpZnRBbXQxKTsKKyAgICAgIHVpbnQzMl90IFNoaWZ0RGlmZiA9IFNoaWZ0QW10MS1TaGlmdEFtdDI7CisKKyAgICAgIC8vIChYID4+PyBDMSkgPDwgQzIgLS0+IFggPj4/IChDMS1DMikgJiAoLTEgPDwgQzIpCisgICAgICBpZiAoSS5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U2hsKSB7CisgICAgICAgIGFzc2VydChTaGlmdE9wLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TFNociB8fAorICAgICAgICAgICAgICAgU2hpZnRPcC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFTaHIpOworICAgICAgICBWYWx1ZSAqU2hpZnQgPSBCdWlsZGVyLT5DcmVhdGVCaW5PcChTaGlmdE9wLT5nZXRPcGNvZGUoKSwgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeSwgU2hpZnREaWZmKSk7CisgICAgICAgIAorICAgICAgICBBUEludCBNYXNrKEFQSW50OjpnZXRIaWdoQml0c1NldChUeXBlQml0cywgVHlwZUJpdHMgLSBTaGlmdEFtdDIpKTsKKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSS5nZXRDb250ZXh0KCksTWFzaykpOworICAgICAgfQorICAgICAgCisgICAgICAvLyAoWCA8PCBDMSkgPj51IEMyICAtLT4gWCA8PCAoQzEtQzIpICYgKC0xID4+IEMyKQorICAgICAgaWYgKEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkxTaHIpIHsKKyAgICAgICAgYXNzZXJ0KFNoaWZ0T3AtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGwpOworICAgICAgICBWYWx1ZSAqU2hpZnQgPSBCdWlsZGVyLT5DcmVhdGVTaGwoWCwgQ29uc3RhbnRJbnQ6OmdldChUeSwgU2hpZnREaWZmKSk7CisgICAgICAgIAorICAgICAgICBBUEludCBNYXNrKEFQSW50OjpnZXRMb3dCaXRzU2V0KFR5cGVCaXRzLCBUeXBlQml0cyAtIFNoaWZ0QW10MikpOworICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJLmdldENvbnRleHQoKSxNYXNrKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFdlIGNhbid0IGhhbmRsZSAoWCA8PCBDMSkgPj5hIEMyLCBpdCBzaGlmdHMgYXJiaXRyYXJ5IGJpdHMgaW4uCisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdFNobChCaW5hcnlPcGVyYXRvciAmSSkgeworICByZXR1cm4gY29tbW9uU2hpZnRUcmFuc2Zvcm1zKEkpOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdExTaHIoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgaWYgKEluc3RydWN0aW9uICpSID0gY29tbW9uU2hpZnRUcmFuc2Zvcm1zKEkpKQorICAgIHJldHVybiBSOworICAKKyAgVmFsdWUgKk9wMCA9IEkuZ2V0T3BlcmFuZCgwKSwgKk9wMSA9IEkuZ2V0T3BlcmFuZCgxKTsKKyAgCisgIGlmIChDb25zdGFudEludCAqT3AxQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDEpKQorICAgIGlmIChJbnRyaW5zaWNJbnN0ICpJSSA9IGR5bl9jYXN0PEludHJpbnNpY0luc3Q+KE9wMCkpIHsKKyAgICAgIHVuc2lnbmVkIEJpdFdpZHRoID0gT3AwLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgIC8vIGN0bHouaTMyKHgpPj41ICAtLT4gemV4dCh4ID09IDApCisgICAgICAvLyBjdHR6LmkzMih4KT4+NSAgLS0+IHpleHQoeCA9PSAwKQorICAgICAgLy8gY3Rwb3AuaTMyKHgpPj41IC0tPiB6ZXh0KHggPT0gLTEpCisgICAgICBpZiAoKElJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6Y3RseiB8fAorICAgICAgICAgICBJSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6OmN0dHogfHwKKyAgICAgICAgICAgSUktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpjdHBvcCkgJiYKKyAgICAgICAgICBpc1Bvd2VyT2YyXzMyKEJpdFdpZHRoKSAmJiBMb2cyXzMyKEJpdFdpZHRoKSA9PSBPcDFDLT5nZXRaRXh0VmFsdWUoKSl7CisgICAgICAgIGJvb2wgaXNDdFBvcCA9IElJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6Y3Rwb3A7CisgICAgICAgIENvbnN0YW50ICpSSFMgPSBDb25zdGFudEludDo6Z2V0U2lnbmVkKE9wMC0+Z2V0VHlwZSgpLCBpc0N0UG9wID8gLTE6MCk7CisgICAgICAgIFZhbHVlICpDbXAgPSBCdWlsZGVyLT5DcmVhdGVJQ21wRVEoSUktPmdldEFyZ09wZXJhbmQoMCksIFJIUyk7CisgICAgICAgIHJldHVybiBuZXcgWkV4dEluc3QoQ21wLCBJSS0+Z2V0VHlwZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gMDsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRBU2hyKEJpbmFyeU9wZXJhdG9yICZJKSB7CisgIGlmIChJbnN0cnVjdGlvbiAqUiA9IGNvbW1vblNoaWZ0VHJhbnNmb3JtcyhJKSkKKyAgICByZXR1cm4gUjsKKyAgCisgIFZhbHVlICpPcDAgPSBJLmdldE9wZXJhbmQoMCksICpPcDEgPSBJLmdldE9wZXJhbmQoMSk7CisgIAorICBpZiAoQ29uc3RhbnRJbnQgKkNTSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihPcDApKSB7CisgICAgLy8gYXNociBpbnQgLTEsIFggPSAtMSAgIChmb3IgYW55IGFyaXRobWV0aWMgc2hpZnQgcmlnaHRzIG9mIH4wKQorICAgIGlmIChDU0ktPmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChJLCBDU0kpOworICB9CisgIAorICBpZiAoQ29uc3RhbnRJbnQgKk9wMUMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3AxKSkgeworICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIFNITCBieSB0aGUgc2FtZSBjb25zdGFudCAoYXNociAoc2hsIFgsIEMpLCBDKSwgdGhlbiB3ZQorICAgIC8vIGhhdmUgYSBzaWduLWV4dGVuZCBpZGlvbS4KKyAgICBWYWx1ZSAqWDsKKyAgICBpZiAobWF0Y2goT3AwLCBtX1NobChtX1ZhbHVlKFgpLCBtX1NwZWNpZmljKE9wMSkpKSkgeworICAgICAgLy8gSWYgdGhlIGlucHV0IHZhbHVlIGlzIGtub3duIHRvIGFscmVhZHkgYmUgc2lnbiBleHRlbmRlZCBlbm91Z2gsIGRlbGV0ZQorICAgICAgLy8gdGhlIGV4dGVuc2lvbi4KKyAgICAgIGlmIChDb21wdXRlTnVtU2lnbkJpdHMoWCkgPiBPcDFDLT5nZXRaRXh0VmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgWCk7CisKKyAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgc2hpZnRlZCBhbW91bnQgdmFsdWUsIGUuZy4KKyAgICAgIC8vICAgJXggPSB6ZXh0IGk4ICVBIHRvIGkzMgorICAgICAgLy8gICAleSA9IHNobCBpMzIgJXgsIDI0CisgICAgICAvLyAgICV6ID0gYXNociAleSwgMjQKKyAgICAgIC8vIHRoZW4gdHVybiB0aGlzIGludG8gInogPSBzZXh0IGk4IEEgdG8gaTMyIi4KKyAgICAgIGlmIChaRXh0SW5zdCAqWkkgPSBkeW5fY2FzdDxaRXh0SW5zdD4oWCkpIHsKKyAgICAgICAgdWludDMyX3QgU3JjQml0cyA9IFpJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgICAgdWludDMyX3QgRGVzdEJpdHMgPSBaSS0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICAgIGlmIChPcDFDLT5nZXRaRXh0VmFsdWUoKSA9PSBEZXN0Qml0cy1TcmNCaXRzKQorICAgICAgICAgIHJldHVybiBuZXcgU0V4dEluc3QoWkktPmdldE9wZXJhbmQoMCksIFpJLT5nZXRUeXBlKCkpOworICAgICAgfQorICAgIH0KKyAgfSAgICAgICAgICAgIAorICAKKyAgLy8gU2VlIGlmIHdlIGNhbiB0dXJuIGEgc2lnbmVkIHNociBpbnRvIGFuIHVuc2lnbmVkIHNoci4KKyAgaWYgKE1hc2tlZFZhbHVlSXNaZXJvKE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50OjpnZXRTaWduQml0KEkuZ2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkpKSkKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUxTaHIoT3AwLCBPcDEpOworICAKKyAgLy8gQXJpdGhtZXRpYyBzaGlmdGluZyBhbiBhbGwtc2lnbi1iaXQgdmFsdWUgaXMgYSBuby1vcC4KKyAgdW5zaWduZWQgTnVtU2lnbkJpdHMgPSBDb21wdXRlTnVtU2lnbkJpdHMoT3AwKTsKKyAgaWYgKE51bVNpZ25CaXRzID09IE9wMC0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgT3AwKTsKKyAgCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZVNpbXBsaWZ5RGVtYW5kZWQuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVTaW1wbGlmeURlbWFuZGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjYwOWNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVTaW1wbGlmeURlbWFuZGVkLmNwcApAQCAtMCwwICsxLDExMDggQEAKKy8vPT09LSBJbnN0Q29tYmluZVNpbXBsaWZ5RGVtYW5kZWQuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGxvZ2ljIGZvciBzaW1wbGlmeWluZyBpbnN0cnVjdGlvbnMgYmFzZWQgb24gaW5mb3JtYXRpb24KKy8vIGFib3V0IGhvdyB0aGV5IGFyZSB1c2VkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIkluc3RDb21iaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworCisvLy8gU2hyaW5rRGVtYW5kZWRDb25zdGFudCAtIENoZWNrIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgb2YgdGhlIAorLy8vIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBpcyBhIGNvbnN0YW50IGludGVnZXIuICBJZiBzbywgY2hlY2sgdG8gc2VlIGlmIHRoZXJlCisvLy8gYXJlIGFueSBiaXRzIHNldCBpbiB0aGUgY29uc3RhbnQgdGhhdCBhcmUgbm90IGRlbWFuZGVkLiAgSWYgc28sIHNocmluayB0aGUKKy8vLyBjb25zdGFudCBhbmQgcmV0dXJuIHRydWUuCitzdGF0aWMgYm9vbCBTaHJpbmtEZW1hbmRlZENvbnN0YW50KEluc3RydWN0aW9uICpJLCB1bnNpZ25lZCBPcE5vLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgRGVtYW5kZWQpIHsKKyAgYXNzZXJ0KEkgJiYgIk5vIGluc3RydWN0aW9uPyIpOworICBhc3NlcnQoT3BObyA8IEktPmdldE51bU9wZXJhbmRzKCkgJiYgIk9wZXJhbmQgaW5kZXggdG9vIGxhcmdlIik7CisKKyAgLy8gSWYgdGhlIG9wZXJhbmQgaXMgbm90IGEgY29uc3RhbnQgaW50ZWdlciwgbm90aGluZyB0byBkby4KKyAgQ29uc3RhbnRJbnQgKk9wQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKE9wTm8pKTsKKyAgaWYgKCFPcEMpIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGVyZSBhcmUgbm8gYml0cyBzZXQgdGhhdCBhcmVuJ3QgZGVtYW5kZWQsIG5vdGhpbmcgdG8gZG8uCisgIERlbWFuZGVkLnpleHRPclRydW5jKE9wQy0+Z2V0VmFsdWUoKS5nZXRCaXRXaWR0aCgpKTsKKyAgaWYgKCh+RGVtYW5kZWQgJiBPcEMtPmdldFZhbHVlKCkpID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgcHJvZHVjaW5nIGJpdHMgdGhhdCBhcmUgbm90IGRlbWFuZGVkLiBTaHJpbmsgdGhlIFJIUy4KKyAgRGVtYW5kZWQgJj0gT3BDLT5nZXRWYWx1ZSgpOworICBJLT5zZXRPcGVyYW5kKE9wTm8sIENvbnN0YW50SW50OjpnZXQoT3BDLT5nZXRUeXBlKCksIERlbWFuZGVkKSk7CisgIHJldHVybiB0cnVlOworfQorCisKKworLy8vIFNpbXBsaWZ5RGVtYW5kZWRJbnN0cnVjdGlvbkJpdHMgLSBJbnN0IGlzIGFuIGludGVnZXIgaW5zdHJ1Y3Rpb24gdGhhdAorLy8vIFNpbXBsaWZ5RGVtYW5kZWRCaXRzIGtub3dzIGFib3V0LiAgU2VlIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMgYW55CisvLy8gcHJvcGVydGllcyB0aGF0IGFsbG93IHVzIHRvIHNpbXBsaWZ5IGl0cyBvcGVyYW5kcy4KK2Jvb2wgSW5zdENvbWJpbmVyOjpTaW1wbGlmeURlbWFuZGVkSW5zdHJ1Y3Rpb25CaXRzKEluc3RydWN0aW9uICZJbnN0KSB7CisgIHVuc2lnbmVkIEJpdFdpZHRoID0gSW5zdC5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgQVBJbnQgS25vd25aZXJvKEJpdFdpZHRoLCAwKSwgS25vd25PbmUoQml0V2lkdGgsIDApOworICBBUEludCBEZW1hbmRlZE1hc2soQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShCaXRXaWR0aCkpOworICAKKyAgVmFsdWUgKlYgPSBTaW1wbGlmeURlbWFuZGVkVXNlQml0cygmSW5zdCwgRGVtYW5kZWRNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8sIEtub3duT25lLCAwKTsKKyAgaWYgKFYgPT0gMCkgcmV0dXJuIGZhbHNlOworICBpZiAoViA9PSAmSW5zdCkgcmV0dXJuIHRydWU7CisgIFJlcGxhY2VJbnN0VXNlc1dpdGgoSW5zdCwgVik7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gU2ltcGxpZnlEZW1hbmRlZEJpdHMgLSBUaGlzIGZvcm0gb2YgU2ltcGxpZnlEZW1hbmRlZEJpdHMgc2ltcGxpZmllcyB0aGUKKy8vLyBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gb3BlcmFuZCBpZiBwb3NzaWJsZSwgdXBkYXRpbmcgaXQgaW4gcGxhY2UuICBJdCByZXR1cm5zCisvLy8gdHJ1ZSBpZiBpdCBtYWRlIGFueSBjaGFuZ2UgYW5kIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgSW5zdENvbWJpbmVyOjpTaW1wbGlmeURlbWFuZGVkQml0cyhVc2UgJlUsIEFQSW50IERlbWFuZGVkTWFzaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duWmVybywgQVBJbnQgJktub3duT25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSB7CisgIFZhbHVlICpOZXdWYWwgPSBTaW1wbGlmeURlbWFuZGVkVXNlQml0cyhVLmdldCgpLCBEZW1hbmRlZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCk7CisgIGlmIChOZXdWYWwgPT0gMCkgcmV0dXJuIGZhbHNlOworICBVID0gTmV3VmFsOworICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8gU2ltcGxpZnlEZW1hbmRlZFVzZUJpdHMgLSBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIHJlcGxhY2UgViB3aXRoIGEgc2ltcGxlcgorLy8vIHZhbHVlIGJhc2VkIG9uIHRoZSBkZW1hbmRlZCBiaXRzLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQgaXMga25vd24KKy8vLyB0aGF0IG9ubHkgdGhlIGJpdHMgc2V0IGluIERlbWFuZGVkTWFzayBvZiB0aGUgcmVzdWx0IG9mIFYgYXJlIGV2ZXIgdXNlZAorLy8vIGRvd25zdHJlYW0uIENvbnNlcXVlbnRseSwgZGVwZW5kaW5nIG9uIHRoZSBtYXNrIGFuZCBWLCBpdCBtYXkgYmUgcG9zc2libGUKKy8vLyB0byByZXBsYWNlIFYgd2l0aCBhIGNvbnN0YW50IG9yIG9uZSBvZiBpdHMgb3BlcmFuZHMuIEluIHN1Y2ggY2FzZXMsIHRoaXMKKy8vLyBmdW5jdGlvbiBkb2VzIHRoZSByZXBsYWNlbWVudCBhbmQgcmV0dXJucyB0cnVlLiBJbiBhbGwgb3RoZXIgY2FzZXMsIGl0CisvLy8gcmV0dXJucyBmYWxzZSBhZnRlciBhbmFseXppbmcgdGhlIGV4cHJlc3Npb24gYW5kIHNldHRpbmcgS25vd25PbmUgYW5kIGtub3duCisvLy8gdG8gYmUgb25lIGluIHRoZSBleHByZXNzaW9uLiAgS25vd25aZXJvIGNvbnRhaW5zIGFsbCB0aGUgYml0cyB0aGF0IGFyZSBrbm93bgorLy8vIHRvIGJlIHplcm8gaW4gdGhlIGV4cHJlc3Npb24uIFRoZXNlIGFyZSBwcm92aWRlZCB0byBwb3RlbnRpYWxseSBhbGxvdyB0aGUKKy8vLyBjYWxsZXIgKHdoaWNoIG1pZ2h0IHJlY3Vyc2l2ZWx5IGJlIFNpbXBsaWZ5RGVtYW5kZWRCaXRzIGl0c2VsZikgdG8gc2ltcGxpZnkKKy8vLyB0aGUgZXhwcmVzc2lvbi4gS25vd25PbmUgYW5kIEtub3duWmVybyBhbHdheXMgZm9sbG93IHRoZSBpbnZhcmlhbnQgdGhhdCAKKy8vLyBLbm93bk9uZSAmIEtub3duWmVybyA9PSAwLiBUaGF0IGlzLCBhIGJpdCBjYW4ndCBiZSBib3RoIDEgYW5kIDAuIE5vdGUgdGhhdAorLy8vIHRoZSBiaXRzIGluIEtub3duT25lIGFuZCBLbm93blplcm8gbWF5IG9ubHkgYmUgYWNjdXJhdGUgZm9yIHRob3NlIGJpdHMgc2V0CisvLy8gaW4gRGVtYW5kZWRNYXNrLiBOb3RlIGFsc28gdGhhdCB0aGUgYml0d2lkdGggb2YgViwgRGVtYW5kZWRNYXNrLCBLbm93blplcm8KKy8vLyBhbmQgS25vd25PbmUgbXVzdCBhbGwgYmUgdGhlIHNhbWUuCisvLy8KKy8vLyBUaGlzIHJldHVybnMgbnVsbCBpZiBpdCBkaWQgbm90IGNoYW5nZSBhbnl0aGluZyBhbmQgaXQgcGVybWl0cyBubworLy8vIHNpbXBsaWZpY2F0aW9uLiAgVGhpcyByZXR1cm5zIFYgaXRzZWxmIGlmIGl0IGRpZCBzb21lIHNpbXBsaWZpY2F0aW9uIG9mIFYncworLy8vIG9wZXJhbmRzIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJpdHMgYXJlIGRlbWFuZGVkLiBUaGlzIHJldHVybnMKKy8vLyBzb21lIG90aGVyIG5vbi1udWxsIHZhbHVlIGlmIGl0IGZvdW5kIG91dCB0aGF0IFYgaXMgZXF1YWwgdG8gYW5vdGhlciB2YWx1ZQorLy8vIGluIHRoZSBjb250ZXh0IHdoZXJlIHRoZSBzcGVjaWZpZWQgYml0cyBhcmUgZGVtYW5kZWQsIGJ1dCBub3QgZm9yIGFsbCB1c2Vycy4KK1ZhbHVlICpJbnN0Q29tYmluZXI6OlNpbXBsaWZ5RGVtYW5kZWRVc2VCaXRzKFZhbHVlICpWLCBBUEludCBEZW1hbmRlZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25aZXJvLCBBUEludCAmS25vd25PbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCkgeworICBhc3NlcnQoViAhPSAwICYmICJOdWxsIHBvaW50ZXIgb2YgVmFsdWU/Pz8iKTsKKyAgYXNzZXJ0KERlcHRoIDw9IDYgJiYgIkxpbWl0IFNlYXJjaCBEZXB0aCIpOworICB1aW50MzJfdCBCaXRXaWR0aCA9IERlbWFuZGVkTWFzay5nZXRCaXRXaWR0aCgpOworICBjb25zdCBUeXBlICpWVHkgPSBWLT5nZXRUeXBlKCk7CisgIGFzc2VydCgoVEQgfHwgIVZUeS0+aXNQb2ludGVyVHkoKSkgJiYKKyAgICAgICAgICJTaW1wbGlmeURlbWFuZGVkQml0cyBuZWVkcyB0byBrbm93IGJpdCB3aWR0aHMhIik7CisgIGFzc2VydCgoIVREIHx8IFRELT5nZXRUeXBlU2l6ZUluQml0cyhWVHktPmdldFNjYWxhclR5cGUoKSkgPT0gQml0V2lkdGgpICYmCisgICAgICAgICAoIVZUeS0+aXNJbnRPckludFZlY3RvclR5KCkgfHwKKyAgICAgICAgICBWVHktPmdldFNjYWxhclNpemVJbkJpdHMoKSA9PSBCaXRXaWR0aCkgJiYKKyAgICAgICAgIEtub3duWmVyby5nZXRCaXRXaWR0aCgpID09IEJpdFdpZHRoICYmCisgICAgICAgICBLbm93bk9uZS5nZXRCaXRXaWR0aCgpID09IEJpdFdpZHRoICYmCisgICAgICAgICAiVmFsdWUgKlYsIERlbWFuZGVkTWFzaywgS25vd25aZXJvIGFuZCBLbm93bk9uZSAiCisgICAgICAgICAibXVzdCBoYXZlIHNhbWUgQml0V2lkdGgiKTsKKyAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKSkgeworICAgIC8vIFdlIGtub3cgYWxsIG9mIHRoZSBiaXRzIGZvciBhIGNvbnN0YW50IQorICAgIEtub3duT25lID0gQ0ktPmdldFZhbHVlKCkgJiBEZW1hbmRlZE1hc2s7CisgICAgS25vd25aZXJvID0gfktub3duT25lICYgRGVtYW5kZWRNYXNrOworICAgIHJldHVybiAwOworICB9CisgIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oVikpIHsKKyAgICAvLyBXZSBrbm93IGFsbCBvZiB0aGUgYml0cyBmb3IgYSBjb25zdGFudCEKKyAgICBLbm93bk9uZS5jbGVhcigpOworICAgIEtub3duWmVybyA9IERlbWFuZGVkTWFzazsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIEtub3duWmVyby5jbGVhcigpOworICBLbm93bk9uZS5jbGVhcigpOworICBpZiAoRGVtYW5kZWRNYXNrID09IDApIHsgICAvLyBOb3QgZGVtYW5kaW5nIGFueSBiaXRzIGZyb20gVi4KKyAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KFYpKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChWVHkpOworICB9CisgIAorICBpZiAoRGVwdGggPT0gNikgICAgICAgIC8vIExpbWl0IHNlYXJjaCBkZXB0aC4KKyAgICByZXR1cm4gMDsKKyAgCisgIEFQSW50IExIU0tub3duWmVybyhCaXRXaWR0aCwgMCksIExIU0tub3duT25lKEJpdFdpZHRoLCAwKTsKKyAgQVBJbnQgUkhTS25vd25aZXJvKEJpdFdpZHRoLCAwKSwgUkhTS25vd25PbmUoQml0V2lkdGgsIDApOworCisgIEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpOworICBpZiAoIUkpIHsKKyAgICBDb21wdXRlTWFza2VkQml0cyhWLCBEZW1hbmRlZE1hc2ssIEtub3duWmVybywgS25vd25PbmUsIERlcHRoKTsKKyAgICByZXR1cm4gMDsgICAgICAgIC8vIE9ubHkgYW5hbHl6ZSBpbnN0cnVjdGlvbnMuCisgIH0KKworICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgdXNlcyBvZiB0aGlzIHZhbHVlIGFuZCB3ZSBhcmVuJ3QgYXQgdGhlIHJvb3QsIHRoZW4KKyAgLy8gd2UgY2FuJ3QgZG8gYW55IHNpbXBsaWZpY2F0aW9ucyBvZiB0aGUgb3BlcmFuZHMsIGJlY2F1c2UgRGVtYW5kZWRNYXNrCisgIC8vIG9ubHkgcmVmbGVjdHMgdGhlIGJpdHMgZGVtYW5kZWQgYnkgKm9uZSogb2YgdGhlIHVzZXJzLgorICBpZiAoRGVwdGggIT0gMCAmJiAhSS0+aGFzT25lVXNlKCkpIHsKKyAgICAvLyBEZXNwaXRlIHRoZSBmYWN0IHRoYXQgd2UgY2FuJ3Qgc2ltcGxpZnkgdGhpcyBpbnN0cnVjdGlvbiBpbiBhbGwgVXNlcidzCisgICAgLy8gY29udGV4dCwgd2UgY2FuIGF0IGxlYXN0IGNvbXB1dGUgdGhlIGtub3duemVyby9rbm93bm9uZSBiaXRzLCBhbmQgd2UgY2FuCisgICAgLy8gZG8gc2ltcGxpZmljYXRpb25zIHRoYXQgYXBwbHkgdG8gKmp1c3QqIHRoZSBvbmUgdXNlciBpZiB3ZSBrbm93IHRoYXQKKyAgICAvLyB0aGlzIGluc3RydWN0aW9uIGhhcyBhIHNpbXBsZXIgdmFsdWUgaW4gdGhhdCBjb250ZXh0LgorICAgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kKSB7CisgICAgICAvLyBJZiBlaXRoZXIgdGhlIExIUyBvciB0aGUgUkhTIGFyZSBaZXJvLCB0aGUgcmVzdWx0IGlzIHplcm8uCisgICAgICBDb21wdXRlTWFza2VkQml0cyhJLT5nZXRPcGVyYW5kKDEpLCBEZW1hbmRlZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBSSFNLbm93blplcm8sIFJIU0tub3duT25lLCBEZXB0aCsxKTsKKyAgICAgIENvbXB1dGVNYXNrZWRCaXRzKEktPmdldE9wZXJhbmQoMCksIERlbWFuZGVkTWFzayAmIH5SSFNLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICBMSFNLbm93blplcm8sIExIU0tub3duT25lLCBEZXB0aCsxKTsKKyAgICAgIAorICAgICAgLy8gSWYgYWxsIG9mIHRoZSBkZW1hbmRlZCBiaXRzIGFyZSBrbm93biAxIG9uIG9uZSBzaWRlLCByZXR1cm4gdGhlIG90aGVyLgorICAgICAgLy8gVGhlc2UgYml0cyBjYW5ub3QgY29udHJpYnV0ZSB0byB0aGUgcmVzdWx0IG9mIHRoZSAnYW5kJyBpbiB0aGlzCisgICAgICAvLyBjb250ZXh0LgorICAgICAgaWYgKChEZW1hbmRlZE1hc2sgJiB+TEhTS25vd25aZXJvICYgUkhTS25vd25PbmUpID09IAorICAgICAgICAgIChEZW1hbmRlZE1hc2sgJiB+TEhTS25vd25aZXJvKSkKKyAgICAgICAgcmV0dXJuIEktPmdldE9wZXJhbmQoMCk7CisgICAgICBpZiAoKERlbWFuZGVkTWFzayAmIH5SSFNLbm93blplcm8gJiBMSFNLbm93bk9uZSkgPT0gCisgICAgICAgICAgKERlbWFuZGVkTWFzayAmIH5SSFNLbm93blplcm8pKQorICAgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgIAorICAgICAgLy8gSWYgYWxsIG9mIHRoZSBkZW1hbmRlZCBiaXRzIGluIHRoZSBpbnB1dHMgYXJlIGtub3duIHplcm9zLCByZXR1cm4gemVyby4KKyAgICAgIGlmICgoRGVtYW5kZWRNYXNrICYgKFJIU0tub3duWmVyb3xMSFNLbm93blplcm8pKSA9PSBEZW1hbmRlZE1hc2spCisgICAgICAgIHJldHVybiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFZUeSk7CisgICAgICAKKyAgICB9IGVsc2UgaWYgKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpPcikgeworICAgICAgLy8gV2UgY2FuIHNpbXBsaWZ5IChYfFkpIC0+IFggb3IgWSBpbiB0aGUgdXNlcidzIGNvbnRleHQgaWYgd2Uga25vdyB0aGF0CisgICAgICAvLyBvbmx5IGJpdHMgZnJvbSBYIG9yIFkgYXJlIGRlbWFuZGVkLgorICAgICAgCisgICAgICAvLyBJZiBlaXRoZXIgdGhlIExIUyBvciB0aGUgUkhTIGFyZSBPbmUsIHRoZSByZXN1bHQgaXMgT25lLgorICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSS0+Z2V0T3BlcmFuZCgxKSwgRGVtYW5kZWRNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFJIU0tub3duWmVybywgUkhTS25vd25PbmUsIERlcHRoKzEpOworICAgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSS0+Z2V0T3BlcmFuZCgwKSwgRGVtYW5kZWRNYXNrICYgflJIU0tub3duT25lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIExIU0tub3duWmVybywgTEhTS25vd25PbmUsIERlcHRoKzEpOworICAgICAgCisgICAgICAvLyBJZiBhbGwgb2YgdGhlIGRlbWFuZGVkIGJpdHMgYXJlIGtub3duIHplcm8gb24gb25lIHNpZGUsIHJldHVybiB0aGUKKyAgICAgIC8vIG90aGVyLiAgVGhlc2UgYml0cyBjYW5ub3QgY29udHJpYnV0ZSB0byB0aGUgcmVzdWx0IG9mIHRoZSAnb3InIGluIHRoaXMKKyAgICAgIC8vIGNvbnRleHQuCisgICAgICBpZiAoKERlbWFuZGVkTWFzayAmIH5MSFNLbm93bk9uZSAmIFJIU0tub3duWmVybykgPT0gCisgICAgICAgICAgKERlbWFuZGVkTWFzayAmIH5MSFNLbm93bk9uZSkpCisgICAgICAgIHJldHVybiBJLT5nZXRPcGVyYW5kKDApOworICAgICAgaWYgKChEZW1hbmRlZE1hc2sgJiB+UkhTS25vd25PbmUgJiBMSFNLbm93blplcm8pID09IAorICAgICAgICAgIChEZW1hbmRlZE1hc2sgJiB+UkhTS25vd25PbmUpKQorICAgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgIAorICAgICAgLy8gSWYgYWxsIG9mIHRoZSBwb3RlbnRpYWxseSBzZXQgYml0cyBvbiBvbmUgc2lkZSBhcmUga25vd24gdG8gYmUgc2V0IG9uCisgICAgICAvLyB0aGUgb3RoZXIgc2lkZSwganVzdCB1c2UgdGhlICdvdGhlcicgc2lkZS4KKyAgICAgIGlmICgoRGVtYW5kZWRNYXNrICYgKH5SSFNLbm93blplcm8pICYgTEhTS25vd25PbmUpID09IAorICAgICAgICAgIChEZW1hbmRlZE1hc2sgJiAoflJIU0tub3duWmVybykpKQorICAgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIGlmICgoRGVtYW5kZWRNYXNrICYgKH5MSFNLbm93blplcm8pICYgUkhTS25vd25PbmUpID09IAorICAgICAgICAgIChEZW1hbmRlZE1hc2sgJiAofkxIU0tub3duWmVybykpKQorICAgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICB9CisgICAgCisgICAgLy8gQ29tcHV0ZSB0aGUgS25vd25aZXJvL0tub3duT25lIGJpdHMgdG8gc2ltcGxpZnkgdGhpbmdzIGRvd25zdHJlYW0uCisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSSwgRGVtYW5kZWRNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIC8vIElmIHRoaXMgaXMgdGhlIHJvb3QgYmVpbmcgc2ltcGxpZmllZCwgYWxsb3cgaXQgdG8gaGF2ZSBtdWx0aXBsZSB1c2VzLAorICAvLyBqdXN0IHNldCB0aGUgRGVtYW5kZWRNYXNrIHRvIGFsbCBiaXRzIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBzaW1wbGlmeSB0aGUKKyAgLy8gb3BlcmFuZHMuICBUaGlzIGFsbG93cyB2aXNpdFRydW5jSW5zdCAoZm9yIGV4YW1wbGUpIHRvIHNpbXBsaWZ5IHRoZQorICAvLyBvcGVyYW5kIG9mIGEgdHJ1bmMgd2l0aG91dCBkdXBsaWNhdGluZyBhbGwgdGhlIGxvZ2ljIGJlbG93LgorICBpZiAoRGVwdGggPT0gMCAmJiAhVi0+aGFzT25lVXNlKCkpCisgICAgRGVtYW5kZWRNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShCaXRXaWR0aCk7CisgIAorICBzd2l0Y2ggKEktPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoSSwgRGVtYW5kZWRNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCk7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgICAvLyBJZiBlaXRoZXIgdGhlIExIUyBvciB0aGUgUkhTIGFyZSBaZXJvLCB0aGUgcmVzdWx0IGlzIHplcm8uCisgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEktPmdldE9wZXJhbmRVc2UoMSksIERlbWFuZGVkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTS25vd25aZXJvLCBSSFNLbm93bk9uZSwgRGVwdGgrMSkgfHwKKyAgICAgICAgU2ltcGxpZnlEZW1hbmRlZEJpdHMoSS0+Z2V0T3BlcmFuZFVzZSgwKSwgRGVtYW5kZWRNYXNrICYgflJIU0tub3duWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTS25vd25aZXJvLCBMSFNLbm93bk9uZSwgRGVwdGgrMSkpCisgICAgICByZXR1cm4gSTsKKyAgICBhc3NlcnQoIShSSFNLbm93blplcm8gJiBSSFNLbm93bk9uZSkgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICBhc3NlcnQoIShMSFNLbm93blplcm8gJiBMSFNLbm93bk9uZSkgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKworICAgIC8vIElmIGFsbCBvZiB0aGUgZGVtYW5kZWQgYml0cyBhcmUga25vd24gMSBvbiBvbmUgc2lkZSwgcmV0dXJuIHRoZSBvdGhlci4KKyAgICAvLyBUaGVzZSBiaXRzIGNhbm5vdCBjb250cmlidXRlIHRvIHRoZSByZXN1bHQgb2YgdGhlICdhbmQnLgorICAgIGlmICgoRGVtYW5kZWRNYXNrICYgfkxIU0tub3duWmVybyAmIFJIU0tub3duT25lKSA9PSAKKyAgICAgICAgKERlbWFuZGVkTWFzayAmIH5MSFNLbm93blplcm8pKQorICAgICAgcmV0dXJuIEktPmdldE9wZXJhbmQoMCk7CisgICAgaWYgKChEZW1hbmRlZE1hc2sgJiB+UkhTS25vd25aZXJvICYgTEhTS25vd25PbmUpID09IAorICAgICAgICAoRGVtYW5kZWRNYXNrICYgflJIU0tub3duWmVybykpCisgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAKKyAgICAvLyBJZiBhbGwgb2YgdGhlIGRlbWFuZGVkIGJpdHMgaW4gdGhlIGlucHV0cyBhcmUga25vd24gemVyb3MsIHJldHVybiB6ZXJvLgorICAgIGlmICgoRGVtYW5kZWRNYXNrICYgKFJIU0tub3duWmVyb3xMSFNLbm93blplcm8pKSA9PSBEZW1hbmRlZE1hc2spCisgICAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShWVHkpOworICAgICAgCisgICAgLy8gSWYgdGhlIFJIUyBpcyBhIGNvbnN0YW50LCBzZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IGl0LgorICAgIGlmIChTaHJpbmtEZW1hbmRlZENvbnN0YW50KEksIDEsIERlbWFuZGVkTWFzayAmIH5MSFNLbm93blplcm8pKQorICAgICAgcmV0dXJuIEk7CisgICAgICAKKyAgICAvLyBPdXRwdXQga25vd24tMSBiaXRzIGFyZSBvbmx5IGtub3duIGlmIHNldCBpbiBib3RoIHRoZSBMSFMgJiBSSFMuCisgICAgS25vd25PbmUgPSBSSFNLbm93bk9uZSAmIExIU0tub3duT25lOworICAgIC8vIE91dHB1dCBrbm93bi0wIGFyZSBrbm93biB0byBiZSBjbGVhciBpZiB6ZXJvIGluIGVpdGhlciB0aGUgTEhTIHwgUkhTLgorICAgIEtub3duWmVybyA9IFJIU0tub3duWmVybyB8IExIU0tub3duWmVybzsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgICAgLy8gSWYgZWl0aGVyIHRoZSBMSFMgb3IgdGhlIFJIUyBhcmUgT25lLCB0aGUgcmVzdWx0IGlzIE9uZS4KKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoSS0+Z2V0T3BlcmFuZFVzZSgxKSwgRGVtYW5kZWRNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTS25vd25aZXJvLCBSSFNLbm93bk9uZSwgRGVwdGgrMSkgfHwKKyAgICAgICAgU2ltcGxpZnlEZW1hbmRlZEJpdHMoSS0+Z2V0T3BlcmFuZFVzZSgwKSwgRGVtYW5kZWRNYXNrICYgflJIU0tub3duT25lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTS25vd25aZXJvLCBMSFNLbm93bk9uZSwgRGVwdGgrMSkpCisgICAgICByZXR1cm4gSTsKKyAgICBhc3NlcnQoIShSSFNLbm93blplcm8gJiBSSFNLbm93bk9uZSkgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICBhc3NlcnQoIShMSFNLbm93blplcm8gJiBMSFNLbm93bk9uZSkgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOyAKKyAgICAKKyAgICAvLyBJZiBhbGwgb2YgdGhlIGRlbWFuZGVkIGJpdHMgYXJlIGtub3duIHplcm8gb24gb25lIHNpZGUsIHJldHVybiB0aGUgb3RoZXIuCisgICAgLy8gVGhlc2UgYml0cyBjYW5ub3QgY29udHJpYnV0ZSB0byB0aGUgcmVzdWx0IG9mIHRoZSAnb3InLgorICAgIGlmICgoRGVtYW5kZWRNYXNrICYgfkxIU0tub3duT25lICYgUkhTS25vd25aZXJvKSA9PSAKKyAgICAgICAgKERlbWFuZGVkTWFzayAmIH5MSFNLbm93bk9uZSkpCisgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoKERlbWFuZGVkTWFzayAmIH5SSFNLbm93bk9uZSAmIExIU0tub3duWmVybykgPT0gCisgICAgICAgIChEZW1hbmRlZE1hc2sgJiB+UkhTS25vd25PbmUpKQorICAgICAgcmV0dXJuIEktPmdldE9wZXJhbmQoMSk7CisKKyAgICAvLyBJZiBhbGwgb2YgdGhlIHBvdGVudGlhbGx5IHNldCBiaXRzIG9uIG9uZSBzaWRlIGFyZSBrbm93biB0byBiZSBzZXQgb24KKyAgICAvLyB0aGUgb3RoZXIgc2lkZSwganVzdCB1c2UgdGhlICdvdGhlcicgc2lkZS4KKyAgICBpZiAoKERlbWFuZGVkTWFzayAmICh+UkhTS25vd25aZXJvKSAmIExIU0tub3duT25lKSA9PSAKKyAgICAgICAgKERlbWFuZGVkTWFzayAmICh+UkhTS25vd25aZXJvKSkpCisgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoKERlbWFuZGVkTWFzayAmICh+TEhTS25vd25aZXJvKSAmIFJIU0tub3duT25lKSA9PSAKKyAgICAgICAgKERlbWFuZGVkTWFzayAmICh+TEhTS25vd25aZXJvKSkpCisgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgICAgCisgICAgLy8gSWYgdGhlIFJIUyBpcyBhIGNvbnN0YW50LCBzZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IGl0LgorICAgIGlmIChTaHJpbmtEZW1hbmRlZENvbnN0YW50KEksIDEsIERlbWFuZGVkTWFzaykpCisgICAgICByZXR1cm4gSTsKKyAgICAgICAgICAKKyAgICAvLyBPdXRwdXQga25vd24tMCBiaXRzIGFyZSBvbmx5IGtub3duIGlmIGNsZWFyIGluIGJvdGggdGhlIExIUyAmIFJIUy4KKyAgICBLbm93blplcm8gPSBSSFNLbm93blplcm8gJiBMSFNLbm93blplcm87CisgICAgLy8gT3V0cHV0IGtub3duLTEgYXJlIGtub3duIHRvIGJlIHNldCBpZiBzZXQgaW4gZWl0aGVyIHRoZSBMSFMgfCBSSFMuCisgICAgS25vd25PbmUgPSBSSFNLbm93bk9uZSB8IExIU0tub3duT25lOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpYb3I6IHsKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoSS0+Z2V0T3BlcmFuZFVzZSgxKSwgRGVtYW5kZWRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFNLbm93blplcm8sIFJIU0tub3duT25lLCBEZXB0aCsxKSB8fAorICAgICAgICBTaW1wbGlmeURlbWFuZGVkQml0cyhJLT5nZXRPcGVyYW5kVXNlKDApLCBEZW1hbmRlZE1hc2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNLbm93blplcm8sIExIU0tub3duT25lLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiBJOworICAgIGFzc2VydCghKFJIU0tub3duWmVybyAmIFJIU0tub3duT25lKSAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIGFzc2VydCghKExIU0tub3duWmVybyAmIExIU0tub3duT25lKSAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIAorICAgIC8vIElmIGFsbCBvZiB0aGUgZGVtYW5kZWQgYml0cyBhcmUga25vd24gemVybyBvbiBvbmUgc2lkZSwgcmV0dXJuIHRoZSBvdGhlci4KKyAgICAvLyBUaGVzZSBiaXRzIGNhbm5vdCBjb250cmlidXRlIHRvIHRoZSByZXN1bHQgb2YgdGhlICd4b3InLgorICAgIGlmICgoRGVtYW5kZWRNYXNrICYgUkhTS25vd25aZXJvKSA9PSBEZW1hbmRlZE1hc2spCisgICAgICByZXR1cm4gSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBpZiAoKERlbWFuZGVkTWFzayAmIExIU0tub3duWmVybykgPT0gRGVtYW5kZWRNYXNrKQorICAgICAgcmV0dXJuIEktPmdldE9wZXJhbmQoMSk7CisgICAgCisgICAgLy8gSWYgYWxsIG9mIHRoZSBkZW1hbmRlZCBiaXRzIGFyZSBrbm93biB0byBiZSB6ZXJvIG9uIG9uZSBzaWRlIG9yIHRoZQorICAgIC8vIG90aGVyLCB0dXJuIHRoaXMgaW50byBhbiAqaW5jbHVzaXZlKiBvci4KKyAgICAvLyAgICBlLmcuIChBICYgQzEpXihCICYgQzIpIC0+IChBICYgQzEpfChCICYgQzIpIGlmZiBDMSZDMiA9PSAwCisgICAgaWYgKChEZW1hbmRlZE1hc2sgJiB+UkhTS25vd25aZXJvICYgfkxIU0tub3duWmVybykgPT0gMCkgeworICAgICAgSW5zdHJ1Y3Rpb24gKk9yID0gCisgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihJLT5nZXRPcGVyYW5kKDApLCBJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIHJldHVybiBJbnNlcnROZXdJbnN0QmVmb3JlKE9yLCAqSSk7CisgICAgfQorICAgIAorICAgIC8vIElmIGFsbCBvZiB0aGUgZGVtYW5kZWQgYml0cyBvbiBvbmUgc2lkZSBhcmUga25vd24sIGFuZCBhbGwgb2YgdGhlIHNldAorICAgIC8vIGJpdHMgb24gdGhhdCBzaWRlIGFyZSBhbHNvIGtub3duIHRvIGJlIHNldCBvbiB0aGUgb3RoZXIgc2lkZSwgdHVybiB0aGlzCisgICAgLy8gaW50byBhbiBBTkQsIGFzIHdlIGtub3cgdGhlIGJpdHMgd2lsbCBiZSBjbGVhcmVkLgorICAgIC8vICAgIGUuZy4gKFggfCBDMSkgXiBDMiAtLT4gKFggfCBDMSkgJiB+QzIgaWZmIChDMSZDMikgPT0gQzIKKyAgICBpZiAoKERlbWFuZGVkTWFzayAmIChSSFNLbm93blplcm98UkhTS25vd25PbmUpKSA9PSBEZW1hbmRlZE1hc2spIHsgCisgICAgICAvLyBhbGwga25vd24KKyAgICAgIGlmICgoUkhTS25vd25PbmUgJiBMSFNLbm93bk9uZSkgPT0gUkhTS25vd25PbmUpIHsKKyAgICAgICAgQ29uc3RhbnQgKkFuZEMgPSBDb25zdGFudDo6Z2V0SW50ZWdlclZhbHVlKFZUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5SSFNLbm93bk9uZSAmIERlbWFuZGVkTWFzayk7CisgICAgICAgIEluc3RydWN0aW9uICpBbmQgPSAKKyAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKEktPmdldE9wZXJhbmQoMCksIEFuZEMpOworICAgICAgICByZXR1cm4gSW5zZXJ0TmV3SW5zdEJlZm9yZShBbmQsICpJKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gSWYgdGhlIFJIUyBpcyBhIGNvbnN0YW50LCBzZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IGl0LgorICAgIC8vIEZJWE1FOiBmb3IgWE9SLCB3ZSBwcmVmZXIgdG8gZm9yY2UgYml0cyB0byAxIGlmIHRoZXkgd2lsbCBtYWtlIGEgLTEuCisgICAgaWYgKFNocmlua0RlbWFuZGVkQ29uc3RhbnQoSSwgMSwgRGVtYW5kZWRNYXNrKSkKKyAgICAgIHJldHVybiBJOworICAgIAorICAgIC8vIElmIG91ciBMSFMgaXMgYW4gJ2FuZCcgYW5kIGlmIGl0IGhhcyBvbmUgdXNlLCBhbmQgaWYgYW55IG9mIHRoZSBiaXRzIHdlCisgICAgLy8gYXJlIGZsaXBwaW5nIGFyZSBrbm93biB0byBiZSBzZXQsIHRoZW4gdGhlIHhvciBpcyBqdXN0IHJlc2V0dGluZyB0aG9zZQorICAgIC8vIGJpdHMgdG8gemVyby4gIFdlIGNhbiBqdXN0IGtub2NrIG91dCBiaXRzIGZyb20gdGhlICdhbmQnIGFuZCB0aGUgJ3hvcicsCisgICAgLy8gc2ltcGxpZnlpbmcgYm90aCBvZiB0aGVtLgorICAgIGlmIChJbnN0cnVjdGlvbiAqTEhTSW5zdCA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihJLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgIGlmIChMSFNJbnN0LT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kICYmIExIU0luc3QtPmhhc09uZVVzZSgpICYmCisgICAgICAgICAgaXNhPENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgICAgIGlzYTxDb25zdGFudEludD4oTEhTSW5zdC0+Z2V0T3BlcmFuZCgxKSkgJiYKKyAgICAgICAgICAoTEhTS25vd25PbmUgJiBSSFNLbm93bk9uZSAmIERlbWFuZGVkTWFzaykgIT0gMCkgeworICAgICAgICBDb25zdGFudEludCAqQW5kUkhTID0gY2FzdDxDb25zdGFudEludD4oTEhTSW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAgIENvbnN0YW50SW50ICpYb3JSSFMgPSBjYXN0PENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgQVBJbnQgTmV3TWFzayA9IH4oTEhTS25vd25PbmUgJiBSSFNLbm93bk9uZSAmIERlbWFuZGVkTWFzayk7CisgICAgICAgIAorICAgICAgICBDb25zdGFudCAqQW5kQyA9CisgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJLT5nZXRUeXBlKCksIE5ld01hc2sgJiBBbmRSSFMtPmdldFZhbHVlKCkpOworICAgICAgICBJbnN0cnVjdGlvbiAqTmV3QW5kID0gCisgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChJLT5nZXRPcGVyYW5kKDApLCBBbmRDKTsKKyAgICAgICAgSW5zZXJ0TmV3SW5zdEJlZm9yZShOZXdBbmQsICpJKTsKKyAgICAgICAgCisgICAgICAgIENvbnN0YW50ICpYb3JDID0KKyAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEktPmdldFR5cGUoKSwgTmV3TWFzayAmIFhvclJIUy0+Z2V0VmFsdWUoKSk7CisgICAgICAgIEluc3RydWN0aW9uICpOZXdYb3IgPQorICAgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVYb3IoTmV3QW5kLCBYb3JDKTsKKyAgICAgICAgcmV0dXJuIEluc2VydE5ld0luc3RCZWZvcmUoTmV3WG9yLCAqSSk7CisgICAgICB9CisKKyAgICAvLyBPdXRwdXQga25vd24tMCBiaXRzIGFyZSBrbm93biBpZiBjbGVhciBvciBzZXQgaW4gYm90aCB0aGUgTEhTICYgUkhTLgorICAgIEtub3duWmVybz0gKFJIU0tub3duWmVybyAmIExIU0tub3duWmVybykgfCAoUkhTS25vd25PbmUgJiBMSFNLbm93bk9uZSk7CisgICAgLy8gT3V0cHV0IGtub3duLTEgYXJlIGtub3duIHRvIGJlIHNldCBpZiBzZXQgaW4gb25seSBvbmUgb2YgdGhlIExIUywgUkhTLgorICAgIEtub3duT25lID0gKFJIU0tub3duWmVybyAmIExIU0tub3duT25lKSB8IChSSFNLbm93bk9uZSAmIExIU0tub3duWmVybyk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2VsZWN0OgorICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhJLT5nZXRPcGVyYW5kVXNlKDIpLCBEZW1hbmRlZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU0tub3duWmVybywgUkhTS25vd25PbmUsIERlcHRoKzEpIHx8CisgICAgICAgIFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEktPmdldE9wZXJhbmRVc2UoMSksIERlbWFuZGVkTWFzaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIU0tub3duWmVybywgTEhTS25vd25PbmUsIERlcHRoKzEpKQorICAgICAgcmV0dXJuIEk7CisgICAgYXNzZXJ0KCEoUkhTS25vd25aZXJvICYgUkhTS25vd25PbmUpICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgYXNzZXJ0KCEoTEhTS25vd25aZXJvICYgTEhTS25vd25PbmUpICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgCisgICAgLy8gSWYgdGhlIG9wZXJhbmRzIGFyZSBjb25zdGFudHMsIHNlZSBpZiB3ZSBjYW4gc2ltcGxpZnkgdGhlbS4KKyAgICBpZiAoU2hyaW5rRGVtYW5kZWRDb25zdGFudChJLCAxLCBEZW1hbmRlZE1hc2spIHx8CisgICAgICAgIFNocmlua0RlbWFuZGVkQ29uc3RhbnQoSSwgMiwgRGVtYW5kZWRNYXNrKSkKKyAgICAgIHJldHVybiBJOworICAgIAorICAgIC8vIE9ubHkga25vd24gaWYga25vd24gaW4gYm90aCB0aGUgTEhTIGFuZCBSSFMuCisgICAgS25vd25PbmUgPSBSSFNLbm93bk9uZSAmIExIU0tub3duT25lOworICAgIEtub3duWmVybyA9IFJIU0tub3duWmVybyAmIExIU0tub3duWmVybzsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6IHsKKyAgICB1bnNpZ25lZCB0cnVuY0JmID0gSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgRGVtYW5kZWRNYXNrLnpleHQodHJ1bmNCZik7CisgICAgS25vd25aZXJvLnpleHQodHJ1bmNCZik7CisgICAgS25vd25PbmUuemV4dCh0cnVuY0JmKTsKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoSS0+Z2V0T3BlcmFuZFVzZSgwKSwgRGVtYW5kZWRNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvLCBLbm93bk9uZSwgRGVwdGgrMSkpCisgICAgICByZXR1cm4gSTsKKyAgICBEZW1hbmRlZE1hc2sudHJ1bmMoQml0V2lkdGgpOworICAgIEtub3duWmVyby50cnVuYyhCaXRXaWR0aCk7CisgICAgS25vd25PbmUudHJ1bmMoQml0V2lkdGgpOworICAgIGFzc2VydCghKEtub3duWmVybyAmIEtub3duT25lKSAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6CisgICAgaWYgKCFJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpKQorICAgICAgcmV0dXJuIDA7ICAvLyB2ZWN0b3ItPmludCBvciBmcC0+aW50PworCisgICAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKkRzdFZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KEktPmdldFR5cGUoKSkpIHsKKyAgICAgIGlmIChjb25zdCBWZWN0b3JUeXBlICpTcmNWVHkgPQorICAgICAgICAgICAgZHluX2Nhc3Q8VmVjdG9yVHlwZT4oSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKSkgeworICAgICAgICBpZiAoRHN0VlR5LT5nZXROdW1FbGVtZW50cygpICE9IFNyY1ZUeS0+Z2V0TnVtRWxlbWVudHMoKSkKKyAgICAgICAgICAvLyBEb24ndCB0b3VjaCBhIGJpdGNhc3QgYmV0d2VlbiB2ZWN0b3JzIG9mIGRpZmZlcmVudCBlbGVtZW50IGNvdW50cy4KKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0gZWxzZQorICAgICAgICAvLyBEb24ndCB0b3VjaCBhIHNjYWxhci10by12ZWN0b3IgYml0Y2FzdC4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSkKKyAgICAgIC8vIERvbid0IHRvdWNoIGEgdmVjdG9yLXRvLXNjYWxhciBiaXRjYXN0LgorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoSS0+Z2V0T3BlcmFuZFVzZSgwKSwgRGVtYW5kZWRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiBJOworICAgIGFzc2VydCghKEtub3duWmVybyAmIEtub3duT25lKSAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OiB7CisgICAgLy8gQ29tcHV0ZSB0aGUgYml0cyBpbiB0aGUgcmVzdWx0IHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBpbnB1dC4KKyAgICB1bnNpZ25lZCBTcmNCaXRXaWR0aCA9SS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgCisgICAgRGVtYW5kZWRNYXNrLnRydW5jKFNyY0JpdFdpZHRoKTsKKyAgICBLbm93blplcm8udHJ1bmMoU3JjQml0V2lkdGgpOworICAgIEtub3duT25lLnRydW5jKFNyY0JpdFdpZHRoKTsKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoSS0+Z2V0T3BlcmFuZFVzZSgwKSwgRGVtYW5kZWRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiBJOworICAgIERlbWFuZGVkTWFzay56ZXh0KEJpdFdpZHRoKTsKKyAgICBLbm93blplcm8uemV4dChCaXRXaWR0aCk7CisgICAgS25vd25PbmUuemV4dChCaXRXaWR0aCk7CisgICAgYXNzZXJ0KCEoS25vd25aZXJvICYgS25vd25PbmUpICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgLy8gVGhlIHRvcCBiaXRzIGFyZSBrbm93biB0byBiZSB6ZXJvLgorICAgIEtub3duWmVybyB8PSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIEJpdFdpZHRoIC0gU3JjQml0V2lkdGgpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6IHsKKyAgICAvLyBDb21wdXRlIHRoZSBiaXRzIGluIHRoZSByZXN1bHQgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGlucHV0LgorICAgIHVuc2lnbmVkIFNyY0JpdFdpZHRoID1JLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAKKyAgICBBUEludCBJbnB1dERlbWFuZGVkQml0cyA9IERlbWFuZGVkTWFzayAmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsIFNyY0JpdFdpZHRoKTsKKworICAgIEFQSW50IE5ld0JpdHMoQVBJbnQ6OmdldEhpZ2hCaXRzU2V0KEJpdFdpZHRoLCBCaXRXaWR0aCAtIFNyY0JpdFdpZHRoKSk7CisgICAgLy8gSWYgYW55IG9mIHRoZSBzaWduIGV4dGVuZGVkIGJpdHMgYXJlIGRlbWFuZGVkLCB3ZSBrbm93IHRoYXQgdGhlIHNpZ24KKyAgICAvLyBiaXQgaXMgZGVtYW5kZWQuCisgICAgaWYgKChOZXdCaXRzICYgRGVtYW5kZWRNYXNrKSAhPSAwKQorICAgICAgSW5wdXREZW1hbmRlZEJpdHMuc2V0KFNyY0JpdFdpZHRoLTEpOworICAgICAgCisgICAgSW5wdXREZW1hbmRlZEJpdHMudHJ1bmMoU3JjQml0V2lkdGgpOworICAgIEtub3duWmVyby50cnVuYyhTcmNCaXRXaWR0aCk7CisgICAgS25vd25PbmUudHJ1bmMoU3JjQml0V2lkdGgpOworICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhJLT5nZXRPcGVyYW5kVXNlKDApLCBJbnB1dERlbWFuZGVkQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvLCBLbm93bk9uZSwgRGVwdGgrMSkpCisgICAgICByZXR1cm4gSTsKKyAgICBJbnB1dERlbWFuZGVkQml0cy56ZXh0KEJpdFdpZHRoKTsKKyAgICBLbm93blplcm8uemV4dChCaXRXaWR0aCk7CisgICAgS25vd25PbmUuemV4dChCaXRXaWR0aCk7CisgICAgYXNzZXJ0KCEoS25vd25aZXJvICYgS25vd25PbmUpICYmICJCaXRzIGtub3duIHRvIGJlIG9uZSBBTkQgemVybz8iKTsgCisgICAgICAKKyAgICAvLyBJZiB0aGUgc2lnbiBiaXQgb2YgdGhlIGlucHV0IGlzIGtub3duIHNldCBvciBjbGVhciwgdGhlbiB3ZSBrbm93IHRoZQorICAgIC8vIHRvcCBiaXRzIG9mIHRoZSByZXN1bHQuCisKKyAgICAvLyBJZiB0aGUgaW5wdXQgc2lnbiBiaXQgaXMga25vd24gemVybywgb3IgaWYgdGhlIE5ld0JpdHMgYXJlIG5vdCBkZW1hbmRlZAorICAgIC8vIGNvbnZlcnQgdGhpcyBpbnRvIGEgemVybyBleHRlbnNpb24uCisgICAgaWYgKEtub3duWmVyb1tTcmNCaXRXaWR0aC0xXSB8fCAoTmV3Qml0cyAmIH5EZW1hbmRlZE1hc2spID09IE5ld0JpdHMpIHsKKyAgICAgIC8vIENvbnZlcnQgdG8gWkV4dCBjYXN0CisgICAgICBDYXN0SW5zdCAqTmV3Q2FzdCA9IG5ldyBaRXh0SW5zdChJLT5nZXRPcGVyYW5kKDApLCBWVHkpOworICAgICAgcmV0dXJuIEluc2VydE5ld0luc3RCZWZvcmUoTmV3Q2FzdCwgKkkpOworICAgIH0gZWxzZSBpZiAoS25vd25PbmVbU3JjQml0V2lkdGgtMV0pIHsgICAgLy8gSW5wdXQgc2lnbiBiaXQga25vd24gc2V0CisgICAgICBLbm93bk9uZSB8PSBOZXdCaXRzOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6IHsKKyAgICAvLyBGaWd1cmUgb3V0IHdoYXQgdGhlIGlucHV0IGJpdHMgYXJlLiAgSWYgdGhlIHRvcCBiaXRzIG9mIHRoZSBhbmQgcmVzdWx0CisgICAgLy8gYXJlIG5vdCBkZW1hbmRlZCwgdGhlbiB0aGUgYWRkIGRvZXNuJ3QgZGVtYW5kIHRoZW0gZnJvbSBpdHMgaW5wdXQKKyAgICAvLyBlaXRoZXIuCisgICAgdW5zaWduZWQgTkxaID0gRGVtYW5kZWRNYXNrLmNvdW50TGVhZGluZ1plcm9zKCk7CisgICAgICAKKyAgICAvLyBJZiB0aGVyZSBpcyBhIGNvbnN0YW50IG9uIHRoZSBSSFMsIHRoZXJlIGFyZSBhIHZhcmlldHkgb2YgeGZvcm1hdGlvbnMKKyAgICAvLyB3ZSBjYW4gZG8uCisgICAgaWYgKENvbnN0YW50SW50ICpSSFMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIC8vIElmIG51bGwsIHRoaXMgc2hvdWxkIGJlIHNpbXBsaWZpZWQgZWxzZXdoZXJlLiAgU29tZSBvZiB0aGUgeGZvcm1zIGhlcmUKKyAgICAgIC8vIHdvbid0IHdvcmsgaWYgdGhlIFJIUyBpcyB6ZXJvLgorICAgICAgaWYgKFJIUy0+aXNaZXJvKCkpCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAvLyBJZiB0aGUgdG9wIGJpdCBvZiB0aGUgb3V0cHV0IGlzIGRlbWFuZGVkLCBkZW1hbmQgZXZlcnl0aGluZyBmcm9tIHRoZQorICAgICAgLy8gaW5wdXQuICBPdGhlcndpc2UsIHdlIGRlbWFuZCBhbGwgdGhlIGlucHV0IGJpdHMgZXhjZXB0IE5MWiB0b3AgYml0cy4KKyAgICAgIEFQSW50IEluRGVtYW5kZWRCaXRzKEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLCBCaXRXaWR0aCAtIE5MWikpOworCisgICAgICAvLyBGaW5kIGluZm9ybWF0aW9uIGFib3V0IGtub3duIHplcm8vb25lIGJpdHMgaW4gdGhlIGlucHV0LgorICAgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEktPmdldE9wZXJhbmRVc2UoMCksIEluRGVtYW5kZWRCaXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNLbm93blplcm8sIExIU0tub3duT25lLCBEZXB0aCsxKSkKKyAgICAgICAgcmV0dXJuIEk7CisKKyAgICAgIC8vIElmIHRoZSBSSFMgb2YgdGhlIGFkZCBoYXMgYml0cyBzZXQgdGhhdCBjYW4ndCBhZmZlY3QgdGhlIGlucHV0LCByZWR1Y2UKKyAgICAgIC8vIHRoZSBjb25zdGFudC4KKyAgICAgIGlmIChTaHJpbmtEZW1hbmRlZENvbnN0YW50KEksIDEsIEluRGVtYW5kZWRCaXRzKSkKKyAgICAgICAgcmV0dXJuIEk7CisgICAgICAKKyAgICAgIC8vIEF2b2lkIGV4Y2VzcyB3b3JrLgorICAgICAgaWYgKExIU0tub3duWmVybyA9PSAwICYmIExIU0tub3duT25lID09IDApCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAvLyBUdXJuIGl0IGludG8gT1IgaWYgaW5wdXQgYml0cyBhcmUgemVyby4KKyAgICAgIGlmICgoTEhTS25vd25aZXJvICYgUkhTLT5nZXRWYWx1ZSgpKSA9PSBSSFMtPmdldFZhbHVlKCkpIHsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gKk9yID0KKyAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlT3IoSS0+Z2V0T3BlcmFuZCgwKSwgSS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAgIHJldHVybiBJbnNlcnROZXdJbnN0QmVmb3JlKE9yLCAqSSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFdlIGNhbiBzYXkgc29tZXRoaW5nIGFib3V0IHRoZSBvdXRwdXQga25vd24temVybyBhbmQga25vd24tb25lIGJpdHMsCisgICAgICAvLyBkZXBlbmRpbmcgb24gcG90ZW50aWFsIGNhcnJpZXMgZnJvbSB0aGUgaW5wdXQgY29uc3RhbnQgYW5kIHRoZQorICAgICAgLy8gdW5rbm93bnMuICBGb3IgZXhhbXBsZSBpZiB0aGUgTEhTIGlzIGtub3duIHRvIGhhdmUgYXQgbW9zdCB0aGUgMHgwRjBGMAorICAgICAgLy8gYml0cyBzZXQgYW5kIHRoZSBSSFMgY29uc3RhbnQgaXMgMHgwMTAwMSwgdGhlbiB3ZSBrbm93IHdlIGhhdmUgYSBrbm93bgorICAgICAgLy8gb25lIG1hc2sgb2YgMHgwMDAwMSBhbmQgYSBrbm93biB6ZXJvIG1hc2sgb2YgMHhFMEYwRS4KKyAgICAgIAorICAgICAgLy8gVG8gY29tcHV0ZSB0aGlzLCB3ZSBmaXJzdCBjb21wdXRlIHRoZSBwb3RlbnRpYWwgY2FycnkgYml0cy4gIFRoZXNlIGFyZQorICAgICAgLy8gdGhlIGJpdHMgd2hpY2ggbWF5IGJlIG1vZGlmaWVkLiAgSSdtIG5vdCBhd2FyZSBvZiBhIGJldHRlciB3YXkgdG8gZG8KKyAgICAgIC8vIHRoaXMgc2Nhbi4KKyAgICAgIGNvbnN0IEFQSW50ICZSSFNWYWwgPSBSSFMtPmdldFZhbHVlKCk7CisgICAgICBBUEludCBDYXJyeUJpdHMoKH5MSFNLbm93blplcm8gKyBSSFNWYWwpIF4gKH5MSFNLbm93blplcm8gXiBSSFNWYWwpKTsKKyAgICAgIAorICAgICAgLy8gTm93IHRoYXQgd2Uga25vdyB3aGljaCBiaXRzIGhhdmUgY2FycmllcywgY29tcHV0ZSB0aGUga25vd24tMS8wIHNldHMuCisgICAgICAKKyAgICAgIC8vIEJpdHMgYXJlIGtub3duIG9uZSBpZiB0aGV5IGFyZSBrbm93biB6ZXJvIGluIG9uZSBvcGVyYW5kIGFuZCBvbmUgaW4gdGhlCisgICAgICAvLyBvdGhlciwgYW5kIHRoZXJlIGlzIG5vIGlucHV0IGNhcnJ5LgorICAgICAgS25vd25PbmUgPSAoKExIU0tub3duWmVybyAmIFJIU1ZhbCkgfCAKKyAgICAgICAgICAgICAgICAgIChMSFNLbm93bk9uZSAmIH5SSFNWYWwpKSAmIH5DYXJyeUJpdHM7CisgICAgICAKKyAgICAgIC8vIEJpdHMgYXJlIGtub3duIHplcm8gaWYgdGhleSBhcmUga25vd24gemVybyBpbiBib3RoIG9wZXJhbmRzIGFuZCB0aGVyZQorICAgICAgLy8gaXMgbm8gaW5wdXQgY2FycnkuCisgICAgICBLbm93blplcm8gPSBMSFNLbm93blplcm8gJiB+UkhTVmFsICYgfkNhcnJ5Qml0czsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgdGhlIGhpZ2gtYml0cyBvZiB0aGlzIEFERCBhcmUgbm90IGRlbWFuZGVkLCB0aGVuIGl0IGRvZXMgbm90IGRlbWFuZAorICAgICAgLy8gdGhlIGhpZ2ggYml0cyBvZiBpdHMgTEhTIG9yIFJIUy4KKyAgICAgIGlmIChEZW1hbmRlZE1hc2tbQml0V2lkdGgtMV0gPT0gMCkgeworICAgICAgICAvLyBSaWdodCBmaWxsIHRoZSBtYXNrIG9mIGJpdHMgZm9yIHRoaXMgQUREIHRvIGRlbWFuZCB0aGUgbW9zdAorICAgICAgICAvLyBzaWduaWZpY2FudCBiaXQgYW5kIGFsbCB0aG9zZSBiZWxvdyBpdC4KKyAgICAgICAgQVBJbnQgRGVtYW5kZWRGcm9tT3BzKEFQSW50OjpnZXRMb3dCaXRzU2V0KEJpdFdpZHRoLCBCaXRXaWR0aC1OTFopKTsKKyAgICAgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEktPmdldE9wZXJhbmRVc2UoMCksIERlbWFuZGVkRnJvbU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIU0tub3duWmVybywgTEhTS25vd25PbmUsIERlcHRoKzEpIHx8CisgICAgICAgICAgICBTaW1wbGlmeURlbWFuZGVkQml0cyhJLT5nZXRPcGVyYW5kVXNlKDEpLCBEZW1hbmRlZEZyb21PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNLbm93blplcm8sIExIU0tub3duT25lLCBEZXB0aCsxKSkKKyAgICAgICAgICByZXR1cm4gSTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICAgIC8vIElmIHRoZSBoaWdoLWJpdHMgb2YgdGhpcyBTVUIgYXJlIG5vdCBkZW1hbmRlZCwgdGhlbiBpdCBkb2VzIG5vdCBkZW1hbmQKKyAgICAvLyB0aGUgaGlnaCBiaXRzIG9mIGl0cyBMSFMgb3IgUkhTLgorICAgIGlmIChEZW1hbmRlZE1hc2tbQml0V2lkdGgtMV0gPT0gMCkgeworICAgICAgLy8gUmlnaHQgZmlsbCB0aGUgbWFzayBvZiBiaXRzIGZvciB0aGlzIFNVQiB0byBkZW1hbmQgdGhlIG1vc3QKKyAgICAgIC8vIHNpZ25pZmljYW50IGJpdCBhbmQgYWxsIHRob3NlIGJlbG93IGl0LgorICAgICAgdWludDMyX3QgTkxaID0gRGVtYW5kZWRNYXNrLmNvdW50TGVhZGluZ1plcm9zKCk7CisgICAgICBBUEludCBEZW1hbmRlZEZyb21PcHMoQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsIEJpdFdpZHRoLU5MWikpOworICAgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEktPmdldE9wZXJhbmRVc2UoMCksIERlbWFuZGVkRnJvbU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNLbm93blplcm8sIExIU0tub3duT25lLCBEZXB0aCsxKSB8fAorICAgICAgICAgIFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEktPmdldE9wZXJhbmRVc2UoMSksIERlbWFuZGVkRnJvbU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNLbm93blplcm8sIExIU0tub3duT25lLCBEZXB0aCsxKSkKKyAgICAgICAgcmV0dXJuIEk7CisgICAgfQorICAgIC8vIE90aGVyd2lzZSBqdXN0IGhhbmQgdGhlIHN1YiBvZmYgdG8gQ29tcHV0ZU1hc2tlZEJpdHMgdG8gZmlsbCBpbgorICAgIC8vIHRoZSBrbm93biB6ZXJvcyBhbmQgb25lcy4KKyAgICBDb21wdXRlTWFza2VkQml0cyhWLCBEZW1hbmRlZE1hc2ssIEtub3duWmVybywgS25vd25PbmUsIERlcHRoKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgIGlmIChDb25zdGFudEludCAqU0EgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHVpbnQ2NF90IFNoaWZ0QW10ID0gU0EtPmdldExpbWl0ZWRWYWx1ZShCaXRXaWR0aCk7CisgICAgICBBUEludCBEZW1hbmRlZE1hc2tJbihEZW1hbmRlZE1hc2subHNocihTaGlmdEFtdCkpOworICAgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEktPmdldE9wZXJhbmRVc2UoMCksIERlbWFuZGVkTWFza0luLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKSkKKyAgICAgICAgcmV0dXJuIEk7CisgICAgICBhc3NlcnQoIShLbm93blplcm8gJiBLbm93bk9uZSkgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOworICAgICAgS25vd25aZXJvIDw8PSBTaGlmdEFtdDsKKyAgICAgIEtub3duT25lICA8PD0gU2hpZnRBbXQ7CisgICAgICAvLyBsb3cgYml0cyBrbm93biB6ZXJvLgorICAgICAgaWYgKFNoaWZ0QW10KQorICAgICAgICBLbm93blplcm8gfD0gQVBJbnQ6OmdldExvd0JpdHNTZXQoQml0V2lkdGgsIFNoaWZ0QW10KTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6CisgICAgLy8gRm9yIGEgbG9naWNhbCBzaGlmdCByaWdodAorICAgIGlmIChDb25zdGFudEludCAqU0EgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHVpbnQ2NF90IFNoaWZ0QW10ID0gU0EtPmdldExpbWl0ZWRWYWx1ZShCaXRXaWR0aCk7CisgICAgICAKKyAgICAgIC8vIFVuc2lnbmVkIHNoaWZ0IHJpZ2h0LgorICAgICAgQVBJbnQgRGVtYW5kZWRNYXNrSW4oRGVtYW5kZWRNYXNrLnNobChTaGlmdEFtdCkpOworICAgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEktPmdldE9wZXJhbmRVc2UoMCksIERlbWFuZGVkTWFza0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybywgS25vd25PbmUsIERlcHRoKzEpKQorICAgICAgICByZXR1cm4gSTsKKyAgICAgIGFzc2VydCghKEtub3duWmVybyAmIEtub3duT25lKSAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7CisgICAgICBLbm93blplcm8gPSBBUEludE9wczo6bHNocihLbm93blplcm8sIFNoaWZ0QW10KTsKKyAgICAgIEtub3duT25lICA9IEFQSW50T3BzOjpsc2hyKEtub3duT25lLCBTaGlmdEFtdCk7CisgICAgICBpZiAoU2hpZnRBbXQpIHsKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGJpdHMgdGhhdCBhcmUgYXQgdGhlIHRvcCBub3cuCisgICAgICAgIEFQSW50IEhpZ2hCaXRzKEFQSW50OjpnZXRIaWdoQml0c1NldChCaXRXaWR0aCwgU2hpZnRBbXQpKTsKKyAgICAgICAgS25vd25aZXJvIHw9IEhpZ2hCaXRzOyAgLy8gaGlnaCBiaXRzIGtub3duIHplcm8uCisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpBU2hyOgorICAgIC8vIElmIHRoaXMgaXMgYW4gYXJpdGhtZXRpYyBzaGlmdCByaWdodCBhbmQgb25seSB0aGUgbG93LWJpdCBpcyBzZXQsIHdlIGNhbgorICAgIC8vIGFsd2F5cyBjb252ZXJ0IHRoaXMgaW50byBhIGxvZ2ljYWwgc2hyLCBldmVuIGlmIHRoZSBzaGlmdCBhbW91bnQgaXMKKyAgICAvLyB2YXJpYWJsZS4gIFRoZSBsb3cgYml0IG9mIHRoZSBzaGlmdCBjYW5ub3QgYmUgYW4gaW5wdXQgc2lnbiBiaXQgdW5sZXNzCisgICAgLy8gdGhlIHNoaWZ0IGFtb3VudCBpcyA+PSB0aGUgc2l6ZSBvZiB0aGUgZGF0YXR5cGUsIHdoaWNoIGlzIHVuZGVmaW5lZC4KKyAgICBpZiAoRGVtYW5kZWRNYXNrID09IDEpIHsKKyAgICAgIC8vIFBlcmZvcm0gdGhlIGxvZ2ljYWwgc2hpZnQgcmlnaHQuCisgICAgICBJbnN0cnVjdGlvbiAqTmV3VmFsID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUxTaHIoCisgICAgICAgICAgICAgICAgICAgICAgICBJLT5nZXRPcGVyYW5kKDApLCBJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIHJldHVybiBJbnNlcnROZXdJbnN0QmVmb3JlKE5ld1ZhbCwgKkkpOworICAgIH0gICAgCisKKyAgICAvLyBJZiB0aGUgc2lnbiBiaXQgaXMgdGhlIG9ubHkgYml0IGRlbWFuZGVkIGJ5IHRoaXMgYXNociwgdGhlbiB0aGVyZSBpcyBubworICAgIC8vIG5lZWQgdG8gZG8gaXQsIHRoZSBzaGlmdCBkb2Vzbid0IGNoYW5nZSB0aGUgaGlnaCBiaXQuCisgICAgaWYgKERlbWFuZGVkTWFzay5pc1NpZ25CaXQoKSkKKyAgICAgIHJldHVybiBJLT5nZXRPcGVyYW5kKDApOworICAgIAorICAgIGlmIChDb25zdGFudEludCAqU0EgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIHVpbnQzMl90IFNoaWZ0QW10ID0gU0EtPmdldExpbWl0ZWRWYWx1ZShCaXRXaWR0aCk7CisgICAgICAKKyAgICAgIC8vIFNpZ25lZCBzaGlmdCByaWdodC4KKyAgICAgIEFQSW50IERlbWFuZGVkTWFza0luKERlbWFuZGVkTWFzay5zaGwoU2hpZnRBbXQpKTsKKyAgICAgIC8vIElmIGFueSBvZiB0aGUgImhpZ2ggYml0cyIgYXJlIGRlbWFuZGVkLCB3ZSBzaG91bGQgc2V0IHRoZSBzaWduIGJpdCBhcworICAgICAgLy8gZGVtYW5kZWQuCisgICAgICBpZiAoRGVtYW5kZWRNYXNrLmNvdW50TGVhZGluZ1plcm9zKCkgPD0gU2hpZnRBbXQpCisgICAgICAgIERlbWFuZGVkTWFza0luLnNldChCaXRXaWR0aC0xKTsKKyAgICAgIGlmIChTaW1wbGlmeURlbWFuZGVkQml0cyhJLT5nZXRPcGVyYW5kVXNlKDApLCBEZW1hbmRlZE1hc2tJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCsxKSkKKyAgICAgICAgcmV0dXJuIEk7CisgICAgICBhc3NlcnQoIShLbm93blplcm8gJiBLbm93bk9uZSkgJiYgIkJpdHMga25vd24gdG8gYmUgb25lIEFORCB6ZXJvPyIpOworICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGJpdHMgdGhhdCBhcmUgYXQgdGhlIHRvcCBub3cuCisgICAgICBBUEludCBIaWdoQml0cyhBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIFNoaWZ0QW10KSk7CisgICAgICBLbm93blplcm8gPSBBUEludE9wczo6bHNocihLbm93blplcm8sIFNoaWZ0QW10KTsKKyAgICAgIEtub3duT25lICA9IEFQSW50T3BzOjpsc2hyKEtub3duT25lLCBTaGlmdEFtdCk7CisgICAgICAgIAorICAgICAgLy8gSGFuZGxlIHRoZSBzaWduIGJpdHMuCisgICAgICBBUEludCBTaWduQml0KEFQSW50OjpnZXRTaWduQml0KEJpdFdpZHRoKSk7CisgICAgICAvLyBBZGp1c3QgdG8gd2hlcmUgaXQgaXMgbm93IGluIHRoZSBtYXNrLgorICAgICAgU2lnbkJpdCA9IEFQSW50T3BzOjpsc2hyKFNpZ25CaXQsIFNoaWZ0QW10KTsgIAorICAgICAgICAKKyAgICAgIC8vIElmIHRoZSBpbnB1dCBzaWduIGJpdCBpcyBrbm93biB0byBiZSB6ZXJvLCBvciBpZiBub25lIG9mIHRoZSB0b3AgYml0cworICAgICAgLy8gYXJlIGRlbWFuZGVkLCB0dXJuIHRoaXMgaW50byBhbiB1bnNpZ25lZCBzaGlmdCByaWdodC4KKyAgICAgIGlmIChCaXRXaWR0aCA8PSBTaGlmdEFtdCB8fCBLbm93blplcm9bQml0V2lkdGgtU2hpZnRBbXQtMV0gfHwgCisgICAgICAgICAgKEhpZ2hCaXRzICYgfkRlbWFuZGVkTWFzaykgPT0gSGlnaEJpdHMpIHsKKyAgICAgICAgLy8gUGVyZm9ybSB0aGUgbG9naWNhbCBzaGlmdCByaWdodC4KKyAgICAgICAgSW5zdHJ1Y3Rpb24gKk5ld1ZhbCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVMU2hyKAorICAgICAgICAgICAgICAgICAgICAgICAgICBJLT5nZXRPcGVyYW5kKDApLCBTQSk7CisgICAgICAgIHJldHVybiBJbnNlcnROZXdJbnN0QmVmb3JlKE5ld1ZhbCwgKkkpOworICAgICAgfSBlbHNlIGlmICgoS25vd25PbmUgJiBTaWduQml0KSAhPSAwKSB7IC8vIE5ldyBiaXRzIGFyZSBrbm93biBvbmUuCisgICAgICAgIEtub3duT25lIHw9IEhpZ2hCaXRzOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICBpZiAoQ29uc3RhbnRJbnQgKlJlbSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJLT5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgQVBJbnQgUkEgPSBSZW0tPmdldFZhbHVlKCkuYWJzKCk7CisgICAgICBpZiAoUkEuaXNQb3dlck9mMigpKSB7CisgICAgICAgIGlmIChEZW1hbmRlZE1hc2sudWx0KFJBKSkgICAgLy8gc3JlbSB3b24ndCBhZmZlY3QgZGVtYW5kZWQgYml0cworICAgICAgICAgIHJldHVybiBJLT5nZXRPcGVyYW5kKDApOworCisgICAgICAgIEFQSW50IExvd0JpdHMgPSBSQSAtIDE7CisgICAgICAgIEFQSW50IE1hc2syID0gTG93Qml0cyB8IEFQSW50OjpnZXRTaWduQml0KEJpdFdpZHRoKTsKKyAgICAgICAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRCaXRzKEktPmdldE9wZXJhbmRVc2UoMCksIE1hc2syLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTS25vd25aZXJvLCBMSFNLbm93bk9uZSwgRGVwdGgrMSkpCisgICAgICAgICAgcmV0dXJuIEk7CisKKyAgICAgICAgLy8gVGhlIGxvdyBiaXRzIG9mIExIUyBhcmUgdW5jaGFuZ2VkIGJ5IHRoZSBzcmVtLgorICAgICAgICBLbm93blplcm8gPSBMSFNLbm93blplcm8gJiBMb3dCaXRzOworICAgICAgICBLbm93bk9uZSA9IExIU0tub3duT25lICYgTG93Qml0czsKKworICAgICAgICAvLyBJZiBMSFMgaXMgbm9uLW5lZ2F0aXZlIG9yIGhhcyBhbGwgbG93IGJpdHMgemVybywgdGhlbiB0aGUgdXBwZXIgYml0cworICAgICAgICAvLyBhcmUgYWxsIHplcm8uCisgICAgICAgIGlmIChMSFNLbm93blplcm9bQml0V2lkdGgtMV0gfHwgKChMSFNLbm93blplcm8gJiBMb3dCaXRzKSA9PSBMb3dCaXRzKSkKKyAgICAgICAgICBLbm93blplcm8gfD0gfkxvd0JpdHM7CisKKyAgICAgICAgLy8gSWYgTEhTIGlzIG5lZ2F0aXZlIGFuZCBub3QgYWxsIGxvdyBiaXRzIGFyZSB6ZXJvLCB0aGVuIHRoZSB1cHBlciBiaXRzCisgICAgICAgIC8vIGFyZSBhbGwgb25lLgorICAgICAgICBpZiAoTEhTS25vd25PbmVbQml0V2lkdGgtMV0gJiYgKChMSFNLbm93bk9uZSAmIExvd0JpdHMpICE9IDApKQorICAgICAgICAgIEtub3duT25lIHw9IH5Mb3dCaXRzOworCisgICAgICAgIGFzc2VydCghKEtub3duWmVybyAmIEtub3duT25lKSAmJiAiQml0cyBrbm93biB0byBiZSBvbmUgQU5EIHplcm8/Iik7IAorICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbTogeworICAgIEFQSW50IEtub3duWmVybzIoQml0V2lkdGgsIDApLCBLbm93bk9uZTIoQml0V2lkdGgsIDApOworICAgIEFQSW50IEFsbE9uZXMgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKEJpdFdpZHRoKTsKKyAgICBpZiAoU2ltcGxpZnlEZW1hbmRlZEJpdHMoSS0+Z2V0T3BlcmFuZFVzZSgwKSwgQWxsT25lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25aZXJvMiwgS25vd25PbmUyLCBEZXB0aCsxKSB8fAorICAgICAgICBTaW1wbGlmeURlbWFuZGVkQml0cyhJLT5nZXRPcGVyYW5kVXNlKDEpLCBBbGxPbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93blplcm8yLCBLbm93bk9uZTIsIERlcHRoKzEpKQorICAgICAgcmV0dXJuIEk7CisKKyAgICB1bnNpZ25lZCBMZWFkZXJzID0gS25vd25aZXJvMi5jb3VudExlYWRpbmdPbmVzKCk7CisgICAgTGVhZGVycyA9IHN0ZDo6bWF4KExlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgIEtub3duWmVybzIuY291bnRMZWFkaW5nT25lcygpKTsKKyAgICBLbm93blplcm8gPSBBUEludDo6Z2V0SGlnaEJpdHNTZXQoQml0V2lkdGgsIExlYWRlcnMpICYgRGVtYW5kZWRNYXNrOworICAgIGJyZWFrOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhbGw6CisgICAgaWYgKEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oSSkpIHsKKyAgICAgIHN3aXRjaCAoSUktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBJbnRyaW5zaWM6OmJzd2FwOiB7CisgICAgICAgIC8vIElmIHRoZSBvbmx5IGJpdHMgZGVtYW5kZWQgY29tZSBmcm9tIG9uZSBieXRlIG9mIHRoZSBic3dhcCByZXN1bHQsCisgICAgICAgIC8vIGp1c3Qgc2hpZnQgdGhlIGlucHV0IGJ5dGUgaW50byBwb3NpdGlvbiB0byBlbGltaW5hdGUgdGhlIGJzd2FwLgorICAgICAgICB1bnNpZ25lZCBOTFogPSBEZW1hbmRlZE1hc2suY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgICAgICAgdW5zaWduZWQgTlRaID0gRGVtYW5kZWRNYXNrLmNvdW50VHJhaWxpbmdaZXJvcygpOworICAgICAgICAgIAorICAgICAgICAvLyBSb3VuZCBOVFogZG93biB0byB0aGUgbmV4dCBieXRlLiAgSWYgd2UgaGF2ZSAxMSB0cmFpbGluZyB6ZXJvcywgdGhlbgorICAgICAgICAvLyB3ZSBuZWVkIGFsbCB0aGUgYml0cyBkb3duIHRvIGJpdCA4LiAgTGlrZXdpc2UsIHJvdW5kIE5MWi4gIElmIHdlCisgICAgICAgIC8vIGhhdmUgMTQgbGVhZGluZyB6ZXJvcywgcm91bmQgdG8gOC4KKyAgICAgICAgTkxaICY9IH43OworICAgICAgICBOVFogJj0gfjc7CisgICAgICAgIC8vIElmIHdlIG5lZWQgZXhhY3RseSBvbmUgYnl0ZSwgd2UgY2FuIGRvIHRoaXMgdHJhbnNmb3JtYXRpb24uCisgICAgICAgIGlmIChCaXRXaWR0aC1OTFotTlRaID09IDgpIHsKKyAgICAgICAgICB1bnNpZ25lZCBSZXN1bHRCaXQgPSBOVFo7CisgICAgICAgICAgdW5zaWduZWQgSW5wdXRCaXQgPSBCaXRXaWR0aC1OVFotODsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBSZXBsYWNlIHRoaXMgd2l0aCBlaXRoZXIgYSBsZWZ0IG9yIHJpZ2h0IHNoaWZ0IHRvIGdldCB0aGUgYnl0ZSBpbnRvCisgICAgICAgICAgLy8gdGhlIHJpZ2h0IHBsYWNlLgorICAgICAgICAgIEluc3RydWN0aW9uICpOZXdWYWw7CisgICAgICAgICAgaWYgKElucHV0Qml0ID4gUmVzdWx0Qml0KQorICAgICAgICAgICAgTmV3VmFsID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUxTaHIoSUktPmdldEFyZ09wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSS0+Z2V0VHlwZSgpLCBJbnB1dEJpdC1SZXN1bHRCaXQpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBOZXdWYWwgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKElJLT5nZXRBcmdPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEktPmdldFR5cGUoKSwgUmVzdWx0Qml0LUlucHV0Qml0KSk7CisgICAgICAgICAgTmV3VmFsLT50YWtlTmFtZShJKTsKKyAgICAgICAgICByZXR1cm4gSW5zZXJ0TmV3SW5zdEJlZm9yZShOZXdWYWwsICpJKTsKKyAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAvLyBUT0RPOiBDb3VsZCBjb21wdXRlIGtub3duIHplcm8vb25lIGJpdHMgYmFzZWQgb24gdGhlIGlucHV0LgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgQ29tcHV0ZU1hc2tlZEJpdHMoViwgRGVtYW5kZWRNYXNrLCBLbm93blplcm8sIEtub3duT25lLCBEZXB0aCk7CisgICAgYnJlYWs7CisgIH0KKyAgCisgIC8vIElmIHRoZSBjbGllbnQgaXMgb25seSBkZW1hbmRpbmcgYml0cyB0aGF0IHdlIGtub3csIHJldHVybiB0aGUga25vd24KKyAgLy8gY29uc3RhbnQuCisgIGlmICgoRGVtYW5kZWRNYXNrICYgKEtub3duWmVyb3xLbm93bk9uZSkpID09IERlbWFuZGVkTWFzaykKKyAgICByZXR1cm4gQ29uc3RhbnQ6OmdldEludGVnZXJWYWx1ZShWVHksIEtub3duT25lKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLy8vIFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzIC0gVGhlIHNwZWNpZmllZCB2YWx1ZSBwcm9kdWNlcyBhIHZlY3RvciB3aXRoCisvLy8gYW55IG51bWJlciBvZiBlbGVtZW50cy4gRGVtYW5kZWRFbHRzIGNvbnRhaW5zIHRoZSBzZXQgb2YgZWxlbWVudHMgdGhhdCBhcmUKKy8vLyBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjYWxsZXIuICBUaGlzIG1ldGhvZCBhbmFseXplcyB3aGljaCBlbGVtZW50cyBvZiB0aGUKKy8vLyBvcGVyYW5kIGFyZSB1bmRlZiBhbmQgcmV0dXJucyB0aGF0IGluZm9ybWF0aW9uIGluIFVuZGVmRWx0cy4KKy8vLworLy8vIElmIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBkZW1hbmRlZCBlbGVtZW50cyBjYW4gYmUgdXNlZCB0byBzaW1wbGlmeSB0aGUKKy8vLyBvcGVyYXRpb24sIHRoZSBvcGVyYXRpb24gaXMgc2ltcGxpZmllZCwgdGhlbiB0aGUgcmVzdWx0YW50IHZhbHVlIGlzCisvLy8gcmV0dXJuZWQuICBUaGlzIHJldHVybnMgbnVsbCBpZiBubyBjaGFuZ2Ugd2FzIG1hZGUuCitWYWx1ZSAqSW5zdENvbWJpbmVyOjpTaW1wbGlmeURlbWFuZGVkVmVjdG9yRWx0cyhWYWx1ZSAqViwgQVBJbnQgRGVtYW5kZWRFbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJlVuZGVmRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSB7CisgIHVuc2lnbmVkIFZXaWR0aCA9IGNhc3Q8VmVjdG9yVHlwZT4oVi0+Z2V0VHlwZSgpKS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgQVBJbnQgRWx0TWFzayhBUEludDo6Z2V0QWxsT25lc1ZhbHVlKFZXaWR0aCkpOworICBhc3NlcnQoKERlbWFuZGVkRWx0cyAmIH5FbHRNYXNrKSA9PSAwICYmICJJbnZhbGlkIERlbWFuZGVkRWx0cyEiKTsKKworICBpZiAoaXNhPFVuZGVmVmFsdWU+KFYpKSB7CisgICAgLy8gSWYgdGhlIGVudGlyZSB2ZWN0b3IgaXMgdW5kZWZpbmVkLCBqdXN0IHJldHVybiB0aGlzIGluZm8uCisgICAgVW5kZWZFbHRzID0gRWx0TWFzazsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaWYgKERlbWFuZGVkRWx0cyA9PSAwKSB7IC8vIElmIG5vdGhpbmcgaXMgZGVtYW5kZWQsIHByb3ZpZGUgdW5kZWYuCisgICAgVW5kZWZFbHRzID0gRWx0TWFzazsKKyAgICByZXR1cm4gVW5kZWZWYWx1ZTo6Z2V0KFYtPmdldFR5cGUoKSk7CisgIH0KKworICBVbmRlZkVsdHMgPSAwOworICBpZiAoQ29uc3RhbnRWZWN0b3IgKkNWID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KFYpKSB7CisgICAgY29uc3QgVHlwZSAqRWx0VHkgPSBjYXN0PFZlY3RvclR5cGU+KFYtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgQ29uc3RhbnQgKlVuZGVmID0gVW5kZWZWYWx1ZTo6Z2V0KEVsdFR5KTsKKworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gRWx0czsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFZXaWR0aDsgKytpKQorICAgICAgaWYgKCFEZW1hbmRlZEVsdHNbaV0pIHsgICAvLyBJZiBub3QgZGVtYW5kZWQsIHNldCB0byB1bmRlZi4KKyAgICAgICAgRWx0cy5wdXNoX2JhY2soVW5kZWYpOworICAgICAgICBVbmRlZkVsdHMuc2V0KGkpOworICAgICAgfSBlbHNlIGlmIChpc2E8VW5kZWZWYWx1ZT4oQ1YtPmdldE9wZXJhbmQoaSkpKSB7ICAgLy8gQWxyZWFkeSB1bmRlZi4KKyAgICAgICAgRWx0cy5wdXNoX2JhY2soVW5kZWYpOworICAgICAgICBVbmRlZkVsdHMuc2V0KGkpOworICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBkZWZpbmVkLgorICAgICAgICBFbHRzLnB1c2hfYmFjayhDVi0+Z2V0T3BlcmFuZChpKSk7CisgICAgICB9CisKKyAgICAvLyBJZiB3ZSBjaGFuZ2VkIHRoZSBjb25zdGFudCwgcmV0dXJuIGl0LgorICAgIENvbnN0YW50ICpOZXdDUCA9IENvbnN0YW50VmVjdG9yOjpnZXQoRWx0cyk7CisgICAgcmV0dXJuIE5ld0NQICE9IENWID8gTmV3Q1AgOiAwOworICB9CisgIAorICBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oVikpIHsKKyAgICAvLyBTaW1wbGlmeSB0aGUgQ0FaIHRvIGEgQ29uc3RhbnRWZWN0b3Igd2hlcmUgdGhlIG5vbi1kZW1hbmRlZCBlbGVtZW50cyBhcmUKKyAgICAvLyBzZXQgdG8gdW5kZWYuCisgICAgCisgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBpZGVudGl0eS4gSWYgc28sIHJldHVybiAwIHNpbmNlIHdlIGFyZSBub3Qgc2ltcGxpZnlpbmcKKyAgICAvLyBhbnl0aGluZy4KKyAgICBpZiAoRGVtYW5kZWRFbHRzLmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBjb25zdCBUeXBlICpFbHRUeSA9IGNhc3Q8VmVjdG9yVHlwZT4oVi0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICBDb25zdGFudCAqWmVybyA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgIENvbnN0YW50ICpVbmRlZiA9IFVuZGVmVmFsdWU6OmdldChFbHRUeSk7CisgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBFbHRzOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gVldpZHRoOyArK2kpIHsKKyAgICAgIENvbnN0YW50ICpFbHQgPSBEZW1hbmRlZEVsdHNbaV0gPyBaZXJvIDogVW5kZWY7CisgICAgICBFbHRzLnB1c2hfYmFjayhFbHQpOworICAgIH0KKyAgICBVbmRlZkVsdHMgPSBEZW1hbmRlZEVsdHMgXiBFbHRNYXNrOworICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KEVsdHMpOworICB9CisgIAorICAvLyBMaW1pdCBzZWFyY2ggZGVwdGguCisgIGlmIChEZXB0aCA9PSAxMCkKKyAgICByZXR1cm4gMDsKKworICAvLyBJZiBtdWx0aXBsZSB1c2VycyBhcmUgdXNpbmcgdGhlIHJvb3QgdmFsdWUsIHByb2NlZGUgd2l0aAorICAvLyBzaW1wbGlmaWNhdGlvbiBjb25zZXJ2YXRpdmVseSBhc3N1bWluZyB0aGF0IGFsbCBlbGVtZW50cworICAvLyBhcmUgbmVlZGVkLgorICBpZiAoIVYtPmhhc09uZVVzZSgpKSB7CisgICAgLy8gUXVpdCBpZiB3ZSBmaW5kIG11bHRpcGxlIHVzZXJzIG9mIGEgbm9uLXJvb3QgdmFsdWUgdGhvdWdoLgorICAgIC8vIFRoZXknbGwgYmUgaGFuZGxlZCB3aGVuIGl0J3MgdGhlaXIgdHVybiB0byBiZSB2aXNpdGVkIGJ5CisgICAgLy8gdGhlIG1haW4gaW5zdGNvbWJpbmUgcHJvY2Vzcy4KKyAgICBpZiAoRGVwdGggIT0gMCkKKyAgICAgIC8vIFRPRE86IEp1c3QgY29tcHV0ZSB0aGUgVW5kZWZFbHRzIGluZm9ybWF0aW9uIHJlY3Vyc2l2ZWx5LgorICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBDb25zZXJ2YXRpdmVseSBhc3N1bWUgdGhhdCBhbGwgZWxlbWVudHMgYXJlIG5lZWRlZC4KKyAgICBEZW1hbmRlZEVsdHMgPSBFbHRNYXNrOworICB9CisgIAorICBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKTsKKyAgaWYgKCFJKSByZXR1cm4gMDsgICAgICAgIC8vIE9ubHkgYW5hbHl6ZSBpbnN0cnVjdGlvbnMuCisgIAorICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgQVBJbnQgVW5kZWZFbHRzMihWV2lkdGgsIDApOworICBWYWx1ZSAqVG1wVjsKKyAgc3dpdGNoIChJLT5nZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgICAKKyAgY2FzZSBJbnN0cnVjdGlvbjo6SW5zZXJ0RWxlbWVudDogeworICAgIC8vIElmIHRoaXMgaXMgYSB2YXJpYWJsZSBpbmRleCwgd2UgZG9uJ3Qga25vdyB3aGljaCBlbGVtZW50IGl0IG92ZXJ3cml0ZXMuCisgICAgLy8gZGVtYW5kIGV4YWN0bHkgdGhlIHNhbWUgaW5wdXQgYXMgd2UgcHJvZHVjZS4KKyAgICBDb25zdGFudEludCAqSWR4ID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEktPmdldE9wZXJhbmQoMikpOworICAgIGlmIChJZHggPT0gMCkgeworICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IHByb3BhZ2F0ZSB1bmRlZiBlbHQgaW5mbywgYmVjYXVzZSB3ZSBkb24ndCBrbm93CisgICAgICAvLyB3aGljaCBlbHQgaXMgZ2V0dGluZyB1cGRhdGVkLgorICAgICAgVG1wViA9IFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKEktPmdldE9wZXJhbmQoMCksIERlbWFuZGVkRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmRlZkVsdHMyLCBEZXB0aCsxKTsKKyAgICAgIGlmIChUbXBWKSB7IEktPnNldE9wZXJhbmQoMCwgVG1wVik7IE1hZGVDaGFuZ2UgPSB0cnVlOyB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgLy8gSWYgdGhpcyBpcyBpbnNlcnRpbmcgYW4gZWxlbWVudCB0aGF0IGlzbid0IGRlbWFuZGVkLCByZW1vdmUgdGhpcworICAgIC8vIGluc2VydGVsZW1lbnQuCisgICAgdW5zaWduZWQgSWR4Tm8gPSBJZHgtPmdldFpFeHRWYWx1ZSgpOworICAgIGlmIChJZHhObyA+PSBWV2lkdGggfHwgIURlbWFuZGVkRWx0c1tJZHhOb10pIHsKKyAgICAgIFdvcmtsaXN0LkFkZChJKTsKKyAgICAgIHJldHVybiBJLT5nZXRPcGVyYW5kKDApOworICAgIH0KKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIHRoZSBlbGVtZW50IGluc2VydGVkIG92ZXJ3cml0ZXMgd2hhdGV2ZXIgd2FzIHRoZXJlLCBzbyB0aGUKKyAgICAvLyBpbnB1dCBkZW1hbmRlZCBzZXQgaXMgc2ltcGxlciB0aGFuIHRoZSBvdXRwdXQgc2V0LgorICAgIEFQSW50IERlbWFuZGVkRWx0czIgPSBEZW1hbmRlZEVsdHM7CisgICAgRGVtYW5kZWRFbHRzMi5jbGVhcihJZHhObyk7CisgICAgVG1wViA9IFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKEktPmdldE9wZXJhbmQoMCksIERlbWFuZGVkRWx0czIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZGVmRWx0cywgRGVwdGgrMSk7CisgICAgaWYgKFRtcFYpIHsgSS0+c2V0T3BlcmFuZCgwLCBUbXBWKTsgTWFkZUNoYW5nZSA9IHRydWU7IH0KKworICAgIC8vIFRoZSBpbnNlcnRlZCBlbGVtZW50IGlzIGRlZmluZWQuCisgICAgVW5kZWZFbHRzLmNsZWFyKElkeE5vKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpTaHVmZmxlVmVjdG9yOiB7CisgICAgU2h1ZmZsZVZlY3Rvckluc3QgKlNodWZmbGUgPSBjYXN0PFNodWZmbGVWZWN0b3JJbnN0PihJKTsKKyAgICB1aW50NjRfdCBMSFNWV2lkdGggPQorICAgICAgY2FzdDxWZWN0b3JUeXBlPihTaHVmZmxlLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpLT5nZXROdW1FbGVtZW50cygpOworICAgIEFQSW50IExlZnREZW1hbmRlZChMSFNWV2lkdGgsIDApLCBSaWdodERlbWFuZGVkKExIU1ZXaWR0aCwgMCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFZXaWR0aDsgaSsrKSB7CisgICAgICBpZiAoRGVtYW5kZWRFbHRzW2ldKSB7CisgICAgICAgIHVuc2lnbmVkIE1hc2tWYWwgPSBTaHVmZmxlLT5nZXRNYXNrVmFsdWUoaSk7CisgICAgICAgIGlmIChNYXNrVmFsICE9IC0xdSkgeworICAgICAgICAgIGFzc2VydChNYXNrVmFsIDwgTEhTVldpZHRoICogMiAmJgorICAgICAgICAgICAgICAgICAic2h1ZmZsZXZlY3RvciBtYXNrIGluZGV4IG91dCBvZiByYW5nZSEiKTsKKyAgICAgICAgICBpZiAoTWFza1ZhbCA8IExIU1ZXaWR0aCkKKyAgICAgICAgICAgIExlZnREZW1hbmRlZC5zZXQoTWFza1ZhbCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgUmlnaHREZW1hbmRlZC5zZXQoTWFza1ZhbCAtIExIU1ZXaWR0aCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBBUEludCBVbmRlZkVsdHM0KExIU1ZXaWR0aCwgMCk7CisgICAgVG1wViA9IFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKEktPmdldE9wZXJhbmQoMCksIExlZnREZW1hbmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZWZFbHRzNCwgRGVwdGgrMSk7CisgICAgaWYgKFRtcFYpIHsgSS0+c2V0T3BlcmFuZCgwLCBUbXBWKTsgTWFkZUNoYW5nZSA9IHRydWU7IH0KKworICAgIEFQSW50IFVuZGVmRWx0czMoTEhTVldpZHRoLCAwKTsKKyAgICBUbXBWID0gU2ltcGxpZnlEZW1hbmRlZFZlY3RvckVsdHMoSS0+Z2V0T3BlcmFuZCgxKSwgUmlnaHREZW1hbmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZWZFbHRzMywgRGVwdGgrMSk7CisgICAgaWYgKFRtcFYpIHsgSS0+c2V0T3BlcmFuZCgxLCBUbXBWKTsgTWFkZUNoYW5nZSA9IHRydWU7IH0KKworICAgIGJvb2wgTmV3VW5kZWZFbHRzID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFZXaWR0aDsgaSsrKSB7CisgICAgICB1bnNpZ25lZCBNYXNrVmFsID0gU2h1ZmZsZS0+Z2V0TWFza1ZhbHVlKGkpOworICAgICAgaWYgKE1hc2tWYWwgPT0gLTF1KSB7CisgICAgICAgIFVuZGVmRWx0cy5zZXQoaSk7CisgICAgICB9IGVsc2UgaWYgKE1hc2tWYWwgPCBMSFNWV2lkdGgpIHsKKyAgICAgICAgaWYgKFVuZGVmRWx0czRbTWFza1ZhbF0pIHsKKyAgICAgICAgICBOZXdVbmRlZkVsdHMgPSB0cnVlOworICAgICAgICAgIFVuZGVmRWx0cy5zZXQoaSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChVbmRlZkVsdHMzW01hc2tWYWwgLSBMSFNWV2lkdGhdKSB7CisgICAgICAgICAgTmV3VW5kZWZFbHRzID0gdHJ1ZTsKKyAgICAgICAgICBVbmRlZkVsdHMuc2V0KGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKE5ld1VuZGVmRWx0cykgeworICAgICAgLy8gQWRkIGFkZGl0aW9uYWwgZGlzY292ZXJlZCB1bmRlZnMuCisgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEVsdHM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgVldpZHRoOyArK2kpIHsKKyAgICAgICAgaWYgKFVuZGVmRWx0c1tpXSkKKyAgICAgICAgICBFbHRzLnB1c2hfYmFjayhVbmRlZlZhbHVlOjpnZXQoVHlwZTo6Z2V0SW50MzJUeShJLT5nZXRDb250ZXh0KCkpKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoSS0+Z2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNodWZmbGUtPmdldE1hc2tWYWx1ZShpKSkpOworICAgICAgfQorICAgICAgSS0+c2V0T3BlcmFuZCgyLCBDb25zdGFudFZlY3Rvcjo6Z2V0KEVsdHMpKTsKKyAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpCaXRDYXN0OiB7CisgICAgLy8gVmVjdG9yLT52ZWN0b3IgY2FzdHMgb25seS4KKyAgICBjb25zdCBWZWN0b3JUeXBlICpWVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpOworICAgIGlmICghVlR5KSBicmVhazsKKyAgICB1bnNpZ25lZCBJblZXaWR0aCA9IFZUeS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICBBUEludCBJbnB1dERlbWFuZGVkRWx0cyhJblZXaWR0aCwgMCk7CisgICAgdW5zaWduZWQgUmF0aW87CisKKyAgICBpZiAoVldpZHRoID09IEluVldpZHRoKSB7CisgICAgICAvLyBJZiB3ZSBhcmUgY29udmVydGluZyBmcm9tIDw0IHggaTMyPiAtPiA8NCB4IGYzMj4sIHdlIGRlbWFuZCB0aGUgc2FtZQorICAgICAgLy8gZWxlbWVudHMgYXMgYXJlIGRlbWFuZGVkIG9mIHVzLgorICAgICAgUmF0aW8gPSAxOworICAgICAgSW5wdXREZW1hbmRlZEVsdHMgPSBEZW1hbmRlZEVsdHM7CisgICAgfSBlbHNlIGlmIChWV2lkdGggPiBJblZXaWR0aCkgeworICAgICAgLy8gVW50ZXN0ZWQgc28gZmFyLgorICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGluIHRoZSByZXN1bHQgdGhhbiB0aGVyZSBhcmUgaW4gdGhlIHNvdXJjZSwKKyAgICAgIC8vIHRoZW4gYW4gaW5wdXQgZWxlbWVudCBpcyBsaXZlIGlmIGFueSBvZiB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKKyAgICAgIC8vIGVsZW1lbnRzIGFyZSBsaXZlLgorICAgICAgUmF0aW8gPSBWV2lkdGgvSW5WV2lkdGg7CisgICAgICBmb3IgKHVuc2lnbmVkIE91dElkeCA9IDA7IE91dElkeCAhPSBWV2lkdGg7ICsrT3V0SWR4KSB7CisgICAgICAgIGlmIChEZW1hbmRlZEVsdHNbT3V0SWR4XSkKKyAgICAgICAgICBJbnB1dERlbWFuZGVkRWx0cy5zZXQoT3V0SWR4L1JhdGlvKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gVW50ZXN0ZWQgc28gZmFyLgorICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGluIHRoZSBzb3VyY2UgdGhhbiB0aGVyZSBhcmUgaW4gdGhlIHJlc3VsdCwKKyAgICAgIC8vIHRoZW4gYW4gaW5wdXQgZWxlbWVudCBpcyBsaXZlIGlmIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBlbGVtZW50IGlzCisgICAgICAvLyBsaXZlLgorICAgICAgUmF0aW8gPSBJblZXaWR0aC9WV2lkdGg7CisgICAgICBmb3IgKHVuc2lnbmVkIEluSWR4ID0gMDsgSW5JZHggIT0gSW5WV2lkdGg7ICsrSW5JZHgpCisgICAgICAgIGlmIChEZW1hbmRlZEVsdHNbSW5JZHgvUmF0aW9dKQorICAgICAgICAgIElucHV0RGVtYW5kZWRFbHRzLnNldChJbklkeCk7CisgICAgfQorICAgIAorICAgIC8vIGRpdi9yZW0gZGVtYW5kIGFsbCBpbnB1dHMsIGJlY2F1c2UgdGhleSBkb24ndCB3YW50IGRpdmlkZSBieSB6ZXJvLgorICAgIFRtcFYgPSBTaW1wbGlmeURlbWFuZGVkVmVjdG9yRWx0cyhJLT5nZXRPcGVyYW5kKDApLCBJbnB1dERlbWFuZGVkRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZWZFbHRzMiwgRGVwdGgrMSk7CisgICAgaWYgKFRtcFYpIHsKKyAgICAgIEktPnNldE9wZXJhbmQoMCwgVG1wVik7CisgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgVW5kZWZFbHRzID0gVW5kZWZFbHRzMjsKKyAgICBpZiAoVldpZHRoID4gSW5WV2lkdGgpIHsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaW1wIik7CisgICAgICAvLyBJZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cyBpbiB0aGUgcmVzdWx0IHRoYW4gdGhlcmUgYXJlIGluIHRoZSBzb3VyY2UsCisgICAgICAvLyB0aGVuIGFuIG91dHB1dCBlbGVtZW50IGlzIHVuZGVmIGlmIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGVsZW1lbnQgaXMKKyAgICAgIC8vIHVuZGVmLgorICAgICAgZm9yICh1bnNpZ25lZCBPdXRJZHggPSAwOyBPdXRJZHggIT0gVldpZHRoOyArK091dElkeCkKKyAgICAgICAgaWYgKFVuZGVmRWx0czJbT3V0SWR4L1JhdGlvXSkKKyAgICAgICAgICBVbmRlZkVsdHMuc2V0KE91dElkeCk7CisgICAgfSBlbHNlIGlmIChWV2lkdGggPCBJblZXaWR0aCkgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5pbXAiKTsKKyAgICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGluIHRoZSBzb3VyY2UgdGhhbiB0aGVyZSBhcmUgaW4gdGhlIHJlc3VsdCwKKyAgICAgIC8vIHRoZW4gYSByZXN1bHQgZWxlbWVudCBpcyB1bmRlZiBpZiBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQKKyAgICAgIC8vIGVsZW1lbnRzIGFyZSB1bmRlZi4KKyAgICAgIFVuZGVmRWx0cyA9IH4wVUxMID4+ICg2NC1WV2lkdGgpOyAgLy8gU3RhcnQgb3V0IGFsbCB1bmRlZi4KKyAgICAgIGZvciAodW5zaWduZWQgSW5JZHggPSAwOyBJbklkeCAhPSBJblZXaWR0aDsgKytJbklkeCkKKyAgICAgICAgaWYgKCFVbmRlZkVsdHMyW0luSWR4XSkgICAgICAgICAgICAvLyBOb3QgdW5kZWY/CisgICAgICAgICAgVW5kZWZFbHRzLmNsZWFyKEluSWR4L1JhdGlvKTsgICAgLy8gQ2xlYXIgdW5kZWYgYml0LgorICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgICAgLy8gZGl2L3JlbSBkZW1hbmQgYWxsIGlucHV0cywgYmVjYXVzZSB0aGV5IGRvbid0IHdhbnQgZGl2aWRlIGJ5IHplcm8uCisgICAgVG1wViA9IFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKEktPmdldE9wZXJhbmQoMCksIERlbWFuZGVkRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZWZFbHRzLCBEZXB0aCsxKTsKKyAgICBpZiAoVG1wVikgeyBJLT5zZXRPcGVyYW5kKDAsIFRtcFYpOyBNYWRlQ2hhbmdlID0gdHJ1ZTsgfQorICAgIFRtcFYgPSBTaW1wbGlmeURlbWFuZGVkVmVjdG9yRWx0cyhJLT5nZXRPcGVyYW5kKDEpLCBEZW1hbmRlZEVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZGVmRWx0czIsIERlcHRoKzEpOworICAgIGlmIChUbXBWKSB7IEktPnNldE9wZXJhbmQoMSwgVG1wVik7IE1hZGVDaGFuZ2UgPSB0cnVlOyB9CisgICAgICAKKyAgICAvLyBPdXRwdXQgZWxlbWVudHMgYXJlIHVuZGVmaW5lZCBpZiBib3RoIGFyZSB1bmRlZmluZWQuICBDb25zaWRlciB0aGluZ3MKKyAgICAvLyBsaWtlIHVuZGVmJjAuICBUaGUgcmVzdWx0IGlzIGtub3duIHplcm8sIG5vdCB1bmRlZi4KKyAgICBVbmRlZkVsdHMgJj0gVW5kZWZFbHRzMjsKKyAgICBicmVhazsKKyAgICAKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Q2FsbDogeworICAgIEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oSSk7CisgICAgaWYgKCFJSSkgYnJlYWs7CisgICAgc3dpdGNoIChJSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgCisgICAgLy8gQmluYXJ5IHZlY3RvciBvcGVyYXRpb25zIHRoYXQgd29yayBjb2x1bW4td2lzZS4gIEEgZGVzdCBlbGVtZW50IGlzIGEKKyAgICAvLyBmdW5jdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCBlbGVtZW50cyBmcm9tIHRoZSB0d28gaW5wdXRzLgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3N1Yl9zczoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9tdWxfc3M6CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfbWluX3NzOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX21heF9zczoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfc3ViX3NkOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9tdWxfc2Q6CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX21pbl9zZDoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfbWF4X3NkOgorICAgICAgVG1wViA9IFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKElJLT5nZXRBcmdPcGVyYW5kKDApLCBEZW1hbmRlZEVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZWZFbHRzLCBEZXB0aCsxKTsKKyAgICAgIGlmIChUbXBWKSB7IElJLT5zZXRBcmdPcGVyYW5kKDAsIFRtcFYpOyBNYWRlQ2hhbmdlID0gdHJ1ZTsgfQorICAgICAgVG1wViA9IFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKElJLT5nZXRBcmdPcGVyYW5kKDEpLCBEZW1hbmRlZEVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZWZFbHRzMiwgRGVwdGgrMSk7CisgICAgICBpZiAoVG1wVikgeyBJSS0+c2V0QXJnT3BlcmFuZCgxLCBUbXBWKTsgTWFkZUNoYW5nZSA9IHRydWU7IH0KKworICAgICAgLy8gSWYgb25seSB0aGUgbG93IGVsdCBpcyBkZW1hbmRlZCBhbmQgdGhpcyBpcyBhIHNjYWxhcml6YWJsZSBpbnRyaW5zaWMsCisgICAgICAvLyBzY2FsYXJpemUgaXQgbm93LgorICAgICAgaWYgKERlbWFuZGVkRWx0cyA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAoSUktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3N1Yl9zczoKKyAgICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfbXVsX3NzOgorICAgICAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfc3ViX3NkOgorICAgICAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfbXVsX3NkOgorICAgICAgICAgIC8vIFRPRE86IExvd2VyIE1JTi9NQVgvQUJTL2V0YworICAgICAgICAgIFZhbHVlICpMSFMgPSBJSS0+Z2V0QXJnT3BlcmFuZCgwKTsKKyAgICAgICAgICBWYWx1ZSAqUkhTID0gSUktPmdldEFyZ09wZXJhbmQoMSk7CisgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgZWxlbWVudCBhcyBzY2FsYXJzLgorICAgICAgICAgIExIUyA9IEluc2VydE5ld0luc3RCZWZvcmUoRXh0cmFjdEVsZW1lbnRJbnN0OjpDcmVhdGUoTEhTLCAKKyAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShJLT5nZXRDb250ZXh0KCkpLCAwVSkpLCAqSUkpOworICAgICAgICAgIFJIUyA9IEluc2VydE5ld0luc3RCZWZvcmUoRXh0cmFjdEVsZW1lbnRJbnN0OjpDcmVhdGUoUkhTLAorICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEktPmdldENvbnRleHQoKSksIDBVKSksICpJSSk7CisgICAgICAgICAgCisgICAgICAgICAgc3dpdGNoIChJSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIkNhc2Ugc3RtdHMgb3V0IG9mIHN5bmMhIik7CisgICAgICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2Vfc3ViX3NzOgorICAgICAgICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9zdWJfc2Q6CisgICAgICAgICAgICBUbXBWID0gSW5zZXJ0TmV3SW5zdEJlZm9yZShCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRlN1YihMSFMsIFJIUyksICpJSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9tdWxfc3M6CisgICAgICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX211bF9zZDoKKyAgICAgICAgICAgIFRtcFYgPSBJbnNlcnROZXdJbnN0QmVmb3JlKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGTXVsKExIUywgUkhTKSwgKklJKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBJbnN0cnVjdGlvbiAqTmV3ID0KKyAgICAgICAgICAgIEluc2VydEVsZW1lbnRJbnN0OjpDcmVhdGUoCisgICAgICAgICAgICAgIFVuZGVmVmFsdWU6OmdldChJSS0+Z2V0VHlwZSgpKSwgVG1wViwKKyAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEktPmdldENvbnRleHQoKSksIDBVLCBmYWxzZSkpOworICAgICAgICAgIEluc2VydE5ld0luc3RCZWZvcmUoTmV3LCAqSUkpOworICAgICAgICAgIHJldHVybiBOZXc7CisgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgIH0KKyAgICAgICAgCisgICAgICAvLyBPdXRwdXQgZWxlbWVudHMgYXJlIHVuZGVmaW5lZCBpZiBib3RoIGFyZSB1bmRlZmluZWQuICBDb25zaWRlciB0aGluZ3MKKyAgICAgIC8vIGxpa2UgdW5kZWYmMC4gIFRoZSByZXN1bHQgaXMga25vd24gemVybywgbm90IHVuZGVmLgorICAgICAgVW5kZWZFbHRzICY9IFVuZGVmRWx0czI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgfQorICByZXR1cm4gTWFkZUNoYW5nZSA/IEkgOiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVWZWN0b3JPcHMuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVWZWN0b3JPcHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZmZhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZVZlY3Rvck9wcy5jcHAKQEAgLTAsMCArMSw2MzYgQEAKKy8vPT09LSBJbnN0Q29tYmluZVZlY3Rvck9wcy5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgaW5zdGNvbWJpbmUgZm9yIEV4dHJhY3RFbGVtZW50LCBJbnNlcnRFbGVtZW50IGFuZAorLy8gU2h1ZmZsZVZlY3Rvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiSW5zdENvbWJpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gQ2hlYXBUb1NjYWxhcml6ZSAtIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBjaGVhcGVyIHRvIHNjYWxhcml6ZSB0aGFuIGl0CisvLy8gaXMgdG8gbGVhdmUgYXMgYSB2ZWN0b3Igb3BlcmF0aW9uLgorc3RhdGljIGJvb2wgQ2hlYXBUb1NjYWxhcml6ZShWYWx1ZSAqViwgYm9vbCBpc0NvbnN0YW50KSB7CisgIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihWKSkgCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChDb25zdGFudFZlY3RvciAqQyA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihWKSkgeworICAgIGlmIChpc0NvbnN0YW50KSByZXR1cm4gdHJ1ZTsKKyAgICAvLyBJZiBhbGwgZWx0cyBhcmUgdGhlIHNhbWUsIHdlIGNhbiBleHRyYWN0LgorICAgIENvbnN0YW50ICpPcDAgPSBDLT5nZXRPcGVyYW5kKDApOworICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBDLT5nZXROdW1PcGVyYW5kcygpOyArK2kpCisgICAgICBpZiAoQy0+Z2V0T3BlcmFuZChpKSAhPSBPcDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKTsKKyAgaWYgKCFJKSByZXR1cm4gZmFsc2U7CisgIAorICAvLyBJbnNlcnQgZWxlbWVudCBnZXRzIHNpbXBsaWZpZWQgdG8gdGhlIGluc2VydGVkIGVsZW1lbnQgb3IgaXMgZGVsZXRlZCBpZgorICAvLyB0aGlzIGlzIGNvbnN0YW50IGlkeCBleHRyYWN0IGVsZW1lbnQgYW5kIGl0cyBhIGNvbnN0YW50IGlkeCBpbnNlcnRlbHQuCisgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW5zZXJ0RWxlbWVudCAmJiBpc0NvbnN0YW50ICYmCisgICAgICBpc2E8Q29uc3RhbnRJbnQ+KEktPmdldE9wZXJhbmQoMikpKQorICAgIHJldHVybiB0cnVlOworICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkxvYWQgJiYgSS0+aGFzT25lVXNlKCkpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChCaW5hcnlPcGVyYXRvciAqQk8gPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oSSkpCisgICAgaWYgKEJPLT5oYXNPbmVVc2UoKSAmJgorICAgICAgICAoQ2hlYXBUb1NjYWxhcml6ZShCTy0+Z2V0T3BlcmFuZCgwKSwgaXNDb25zdGFudCkgfHwKKyAgICAgICAgIENoZWFwVG9TY2FsYXJpemUoQk8tPmdldE9wZXJhbmQoMSksIGlzQ29uc3RhbnQpKSkKKyAgICAgIHJldHVybiB0cnVlOworICBpZiAoQ21wSW5zdCAqQ0kgPSBkeW5fY2FzdDxDbXBJbnN0PihJKSkKKyAgICBpZiAoQ0ktPmhhc09uZVVzZSgpICYmCisgICAgICAgIChDaGVhcFRvU2NhbGFyaXplKENJLT5nZXRPcGVyYW5kKDApLCBpc0NvbnN0YW50KSB8fAorICAgICAgICAgQ2hlYXBUb1NjYWxhcml6ZShDSS0+Z2V0T3BlcmFuZCgxKSwgaXNDb25zdGFudCkpKQorICAgICAgcmV0dXJuIHRydWU7CisgIAorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBSZWFkIGFuZCBkZWNvZGUgYSBzaHVmZmxldmVjdG9yIG1hc2suCisvLy8KKy8vLyBJdCB0dXJucyB1bmRlZiBlbGVtZW50cyBpbnRvIHZhbHVlcyB0aGF0IGFyZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mCisvLy8gZWxlbWVudHMgaW4gdGhlIGlucHV0Lgorc3RhdGljIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBnZXRTaHVmZmxlTWFzayhjb25zdCBTaHVmZmxlVmVjdG9ySW5zdCAqU1ZJKSB7CisgIHVuc2lnbmVkIE5FbHRzID0gU1ZJLT5nZXRUeXBlKCktPmdldE51bUVsZW1lbnRzKCk7CisgIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihTVkktPmdldE9wZXJhbmQoMikpKQorICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oTkVsdHMsIDApOworICBpZiAoaXNhPFVuZGVmVmFsdWU+KFNWSS0+Z2V0T3BlcmFuZCgyKSkpCisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPihORWx0cywgMipORWx0cyk7CisgIAorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUmVzdWx0OworICBjb25zdCBDb25zdGFudFZlY3RvciAqQ1AgPSBjYXN0PENvbnN0YW50VmVjdG9yPihTVkktPmdldE9wZXJhbmQoMikpOworICBmb3IgKFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yIGkgPSBDUC0+b3BfYmVnaW4oKSwgZSA9IENQLT5vcF9lbmQoKTsgaSE9ZTsgKytpKQorICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oKmkpKQorICAgICAgUmVzdWx0LnB1c2hfYmFjayhORWx0cyoyKTsgIC8vIHVuZGVmIC0+IDgKKyAgICBlbHNlCisgICAgICBSZXN1bHQucHVzaF9iYWNrKGNhc3Q8Q29uc3RhbnRJbnQ+KCppKS0+Z2V0WkV4dFZhbHVlKCkpOworICByZXR1cm4gUmVzdWx0OworfQorCisvLy8gRmluZFNjYWxhckVsZW1lbnQgLSBHaXZlbiBhIHZlY3RvciBhbmQgYW4gZWxlbWVudCBudW1iZXIsIHNlZSBpZiB0aGUgc2NhbGFyCisvLy8gdmFsdWUgaXMgYWxyZWFkeSBhcm91bmQgYXMgYSByZWdpc3RlciwgZm9yIGV4YW1wbGUgaWYgaXQgd2VyZSBpbnNlcnRlZCB0aGVuCisvLy8gZXh0cmFjdGVkIGZyb20gdGhlIHZlY3Rvci4KK3N0YXRpYyBWYWx1ZSAqRmluZFNjYWxhckVsZW1lbnQoVmFsdWUgKlYsIHVuc2lnbmVkIEVsdE5vKSB7CisgIGFzc2VydChWLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSAmJiAiTm90IGxvb2tpbmcgYXQgYSB2ZWN0b3I/Iik7CisgIGNvbnN0IFZlY3RvclR5cGUgKlBUeSA9IGNhc3Q8VmVjdG9yVHlwZT4oVi0+Z2V0VHlwZSgpKTsKKyAgdW5zaWduZWQgV2lkdGggPSBQVHktPmdldE51bUVsZW1lbnRzKCk7CisgIGlmIChFbHRObyA+PSBXaWR0aCkgIC8vIE91dCBvZiByYW5nZSBhY2Nlc3MuCisgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChQVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihWKSkKKyAgICByZXR1cm4gVW5kZWZWYWx1ZTo6Z2V0KFBUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihWKSkKKyAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShQVHktPmdldEVsZW1lbnRUeXBlKCkpOworICBpZiAoQ29uc3RhbnRWZWN0b3IgKkNQID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KFYpKQorICAgIHJldHVybiBDUC0+Z2V0T3BlcmFuZChFbHRObyk7CisgIAorICBpZiAoSW5zZXJ0RWxlbWVudEluc3QgKklJSSA9IGR5bl9jYXN0PEluc2VydEVsZW1lbnRJbnN0PihWKSkgeworICAgIC8vIElmIHRoaXMgaXMgYW4gaW5zZXJ0IHRvIGEgdmFyaWFibGUgZWxlbWVudCwgd2UgZG9uJ3Qga25vdyB3aGF0IGl0IGlzLgorICAgIGlmICghaXNhPENvbnN0YW50SW50PihJSUktPmdldE9wZXJhbmQoMikpKSAKKyAgICAgIHJldHVybiAwOworICAgIHVuc2lnbmVkIElJRWx0ID0gY2FzdDxDb25zdGFudEludD4oSUlJLT5nZXRPcGVyYW5kKDIpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgCisgICAgLy8gSWYgdGhpcyBpcyBhbiBpbnNlcnQgdG8gdGhlIGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLCByZXR1cm4gdGhlCisgICAgLy8gaW5zZXJ0ZWQgdmFsdWUuCisgICAgaWYgKEVsdE5vID09IElJRWx0KSAKKyAgICAgIHJldHVybiBJSUktPmdldE9wZXJhbmQoMSk7CisgICAgCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgaW5zZXJ0ZWxlbWVudCBkb2Vzbid0IG1vZGlmeSB0aGUgdmFsdWUsIHJlY3Vyc2Ugb24gaXRzCisgICAgLy8gdmVjdG9yIGlucHV0LgorICAgIHJldHVybiBGaW5kU2NhbGFyRWxlbWVudChJSUktPmdldE9wZXJhbmQoMCksIEVsdE5vKTsKKyAgfQorICAKKyAgaWYgKFNodWZmbGVWZWN0b3JJbnN0ICpTVkkgPSBkeW5fY2FzdDxTaHVmZmxlVmVjdG9ySW5zdD4oVikpIHsKKyAgICB1bnNpZ25lZCBMSFNXaWR0aCA9CisgICAgY2FzdDxWZWN0b3JUeXBlPihTVkktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSktPmdldE51bUVsZW1lbnRzKCk7CisgICAgdW5zaWduZWQgSW5FbCA9IGdldFNodWZmbGVNYXNrKFNWSSlbRWx0Tm9dOworICAgIGlmIChJbkVsIDwgTEhTV2lkdGgpCisgICAgICByZXR1cm4gRmluZFNjYWxhckVsZW1lbnQoU1ZJLT5nZXRPcGVyYW5kKDApLCBJbkVsKTsKKyAgICBlbHNlIGlmIChJbkVsIDwgTEhTV2lkdGgqMikKKyAgICAgIHJldHVybiBGaW5kU2NhbGFyRWxlbWVudChTVkktPmdldE9wZXJhbmQoMSksIEluRWwgLSBMSFNXaWR0aCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChQVHktPmdldEVsZW1lbnRUeXBlKCkpOworICB9CisgIAorICAvLyBPdGhlcndpc2UsIHdlIGRvbid0IGtub3cuCisgIHJldHVybiAwOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdEV4dHJhY3RFbGVtZW50SW5zdChFeHRyYWN0RWxlbWVudEluc3QgJkVJKSB7CisgIC8vIElmIHZlY3RvciB2YWwgaXMgdW5kZWYsIHJlcGxhY2UgZXh0cmFjdCB3aXRoIHNjYWxhciB1bmRlZi4KKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihFSS5nZXRPcGVyYW5kKDApKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChFSSwgVW5kZWZWYWx1ZTo6Z2V0KEVJLmdldFR5cGUoKSkpOworICAKKyAgLy8gSWYgdmVjdG9yIHZhbCBpcyBjb25zdGFudCAwLCByZXBsYWNlIGV4dHJhY3Qgd2l0aCBzY2FsYXIgMC4KKyAgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEVJLmdldE9wZXJhbmQoMCkpKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEVJLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVJLmdldFR5cGUoKSkpOworICAKKyAgaWYgKENvbnN0YW50VmVjdG9yICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KEVJLmdldE9wZXJhbmQoMCkpKSB7CisgICAgLy8gSWYgdmVjdG9yIHZhbCBpcyBjb25zdGFudCB3aXRoIGFsbCBlbGVtZW50cyB0aGUgc2FtZSwgcmVwbGFjZSBFSSB3aXRoCisgICAgLy8gdGhhdCBlbGVtZW50LiBXaGVuIHRoZSBlbGVtZW50cyBhcmUgbm90IGlkZW50aWNhbCwgd2UgY2Fubm90IHJlcGxhY2UgeWV0CisgICAgLy8gKHdlIGRvIHRoYXQgYmVsb3csIGJ1dCBvbmx5IHdoZW4gdGhlIGluZGV4IGlzIGNvbnN0YW50KS4KKyAgICBDb25zdGFudCAqb3AwID0gQy0+Z2V0T3BlcmFuZCgwKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IEMtPmdldE51bU9wZXJhbmRzKCk7ICsraSkKKyAgICAgIGlmIChDLT5nZXRPcGVyYW5kKGkpICE9IG9wMCkgeworICAgICAgICBvcDAgPSAwOyAKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgaWYgKG9wMCkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEVJLCBvcDApOworICB9CisgIAorICAvLyBJZiBleHRyYWN0aW5nIGEgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIHZlY3Rvciwgc2VlIGlmIHdlIGNhbiByZWN1cnNpdmVseQorICAvLyBmaW5kIGEgcHJldmlvdXNseSBjb21wdXRlZCBzY2FsYXIgdGhhdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgdmVjdG9yLgorICBpZiAoQ29uc3RhbnRJbnQgKklkeEMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oRUkuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICB1bnNpZ25lZCBJbmRleFZhbCA9IElkeEMtPmdldFpFeHRWYWx1ZSgpOworICAgIHVuc2lnbmVkIFZlY3RvcldpZHRoID0gRUkuZ2V0VmVjdG9yT3BlcmFuZFR5cGUoKS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGV4dHJhY3RpbmcgYW4gaW52YWxpZCBpbmRleCwgdHVybiB0aGlzIGludG8gdW5kZWYsIHRvIGF2b2lkCisgICAgLy8gY3Jhc2hpbmcgdGhlIGNvZGUgYmVsb3cuCisgICAgaWYgKEluZGV4VmFsID49IFZlY3RvcldpZHRoKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoRUksIFVuZGVmVmFsdWU6OmdldChFSS5nZXRUeXBlKCkpKTsKKyAgICAKKyAgICAvLyBUaGlzIGluc3RydWN0aW9uIG9ubHkgZGVtYW5kcyB0aGUgc2luZ2xlIGVsZW1lbnQgZnJvbSB0aGUgaW5wdXQgdmVjdG9yLgorICAgIC8vIElmIHRoZSBpbnB1dCB2ZWN0b3IgaGFzIGEgc2luZ2xlIHVzZSwgc2ltcGxpZnkgaXQgYmFzZWQgb24gdGhpcyB1c2UKKyAgICAvLyBwcm9wZXJ0eS4KKyAgICBpZiAoRUkuZ2V0T3BlcmFuZCgwKS0+aGFzT25lVXNlKCkgJiYgVmVjdG9yV2lkdGggIT0gMSkgeworICAgICAgQVBJbnQgVW5kZWZFbHRzKFZlY3RvcldpZHRoLCAwKTsKKyAgICAgIEFQSW50IERlbWFuZGVkTWFzayhWZWN0b3JXaWR0aCwgMCk7CisgICAgICBEZW1hbmRlZE1hc2suc2V0KEluZGV4VmFsKTsKKyAgICAgIGlmIChWYWx1ZSAqViA9IFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKEVJLmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW1hbmRlZE1hc2ssIFVuZGVmRWx0cykpIHsKKyAgICAgICAgRUkuc2V0T3BlcmFuZCgwLCBWKTsKKyAgICAgICAgcmV0dXJuICZFSTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKFZhbHVlICpFbHQgPSBGaW5kU2NhbGFyRWxlbWVudChFSS5nZXRPcGVyYW5kKDApLCBJbmRleFZhbCkpCisgICAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChFSSwgRWx0KTsKKyAgICAKKyAgICAvLyBJZiB0aGUgdGhpcyBleHRyYWN0ZWxlbWVudCBpcyBkaXJlY3RseSB1c2luZyBhIGJpdGNhc3QgZnJvbSBhIHZlY3RvciBvZgorICAgIC8vIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cywgc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSBzb3VyY2UgZWxlbWVudCBmcm9tCisgICAgLy8gaXQuICBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZW5kIHVwIG5lZWRpbmcgdG8gYml0Y2FzdCB0aGUgc2NhbGFycy4KKyAgICBpZiAoQml0Q2FzdEluc3QgKkJDSSA9IGR5bl9jYXN0PEJpdENhc3RJbnN0PihFSS5nZXRPcGVyYW5kKDApKSkgeworICAgICAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUID0gCisgICAgICAgICAgZHluX2Nhc3Q8VmVjdG9yVHlwZT4oQkNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpKQorICAgICAgICBpZiAoVlQtPmdldE51bUVsZW1lbnRzKCkgPT0gVmVjdG9yV2lkdGgpCisgICAgICAgICAgaWYgKFZhbHVlICpFbHQgPSBGaW5kU2NhbGFyRWxlbWVudChCQ0ktPmdldE9wZXJhbmQoMCksIEluZGV4VmFsKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQml0Q2FzdEluc3QoRWx0LCBFSS5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorICAKKyAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KEVJLmdldE9wZXJhbmQoMCkpKSB7CisgICAgLy8gUHVzaCBleHRyYWN0ZWxlbWVudCBpbnRvIHByZWRlY2Vzc29yIG9wZXJhdGlvbiBpZiBsZWdhbCBhbmQKKyAgICAvLyBwcm9maXRhYmxlIHRvIGRvIHNvCisgICAgaWYgKEJpbmFyeU9wZXJhdG9yICpCTyA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihJKSkgeworICAgICAgaWYgKEktPmhhc09uZVVzZSgpICYmCisgICAgICAgICAgQ2hlYXBUb1NjYWxhcml6ZShCTywgaXNhPENvbnN0YW50SW50PihFSS5nZXRPcGVyYW5kKDEpKSkpIHsKKyAgICAgICAgVmFsdWUgKm5ld0VJMCA9CisgICAgICAgIEJ1aWxkZXItPkNyZWF0ZUV4dHJhY3RFbGVtZW50KEJPLT5nZXRPcGVyYW5kKDApLCBFSS5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgVmFsdWUgKm5ld0VJMSA9CisgICAgICAgIEJ1aWxkZXItPkNyZWF0ZUV4dHJhY3RFbGVtZW50KEJPLT5nZXRPcGVyYW5kKDEpLCBFSS5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoQk8tPmdldE9wY29kZSgpLCBuZXdFSTAsIG5ld0VJMSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChJbnNlcnRFbGVtZW50SW5zdCAqSUUgPSBkeW5fY2FzdDxJbnNlcnRFbGVtZW50SW5zdD4oSSkpIHsKKyAgICAgIC8vIEV4dHJhY3RpbmcgdGhlIGluc2VydGVkIGVsZW1lbnQ/CisgICAgICBpZiAoSUUtPmdldE9wZXJhbmQoMikgPT0gRUkuZ2V0T3BlcmFuZCgxKSkKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoRUksIElFLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIC8vIElmIHRoZSBpbnNlcnRlZCBhbmQgZXh0cmFjdGVkIGVsZW1lbnRzIGFyZSBjb25zdGFudHMsIHRoZXkgbXVzdCBub3QKKyAgICAgIC8vIGJlIHRoZSBzYW1lIHZhbHVlLCBleHRyYWN0IGZyb20gdGhlIHByZS1pbnNlcnRlZCB2YWx1ZSBpbnN0ZWFkLgorICAgICAgaWYgKGlzYTxDb25zdGFudD4oSUUtPmdldE9wZXJhbmQoMikpICYmIGlzYTxDb25zdGFudD4oRUkuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgV29ya2xpc3QuQWRkVmFsdWUoRUkuZ2V0T3BlcmFuZCgwKSk7CisgICAgICAgIEVJLnNldE9wZXJhbmQoMCwgSUUtPmdldE9wZXJhbmQoMCkpOworICAgICAgICByZXR1cm4gJkVJOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoU2h1ZmZsZVZlY3Rvckluc3QgKlNWSSA9IGR5bl9jYXN0PFNodWZmbGVWZWN0b3JJbnN0PihJKSkgeworICAgICAgLy8gSWYgdGhpcyBpcyBleHRyYWN0aW5nIGFuIGVsZW1lbnQgZnJvbSBhIHNodWZmbGV2ZWN0b3IsIGZpZ3VyZSBvdXQgd2hlcmUKKyAgICAgIC8vIGl0IGNhbWUgZnJvbSBhbmQgZXh0cmFjdCBmcm9tIHRoZSBhcHByb3ByaWF0ZSBpbnB1dCBlbGVtZW50IGluc3RlYWQuCisgICAgICBpZiAoQ29uc3RhbnRJbnQgKkVsdCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihFSS5nZXRPcGVyYW5kKDEpKSkgeworICAgICAgICB1bnNpZ25lZCBTcmNJZHggPSBnZXRTaHVmZmxlTWFzayhTVkkpW0VsdC0+Z2V0WkV4dFZhbHVlKCldOworICAgICAgICBWYWx1ZSAqU3JjOworICAgICAgICB1bnNpZ25lZCBMSFNXaWR0aCA9CisgICAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oU1ZJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpLT5nZXROdW1FbGVtZW50cygpOworICAgICAgICAKKyAgICAgICAgaWYgKFNyY0lkeCA8IExIU1dpZHRoKQorICAgICAgICAgIFNyYyA9IFNWSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgZWxzZSBpZiAoU3JjSWR4IDwgTEhTV2lkdGgqMikgeworICAgICAgICAgIFNyY0lkeCAtPSBMSFNXaWR0aDsKKyAgICAgICAgICBTcmMgPSBTVkktPmdldE9wZXJhbmQoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoRUksIFVuZGVmVmFsdWU6OmdldChFSS5nZXRUeXBlKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRXh0cmFjdEVsZW1lbnRJbnN0OjpDcmVhdGUoU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KEVJLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY0lkeCwgZmFsc2UpKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gRklYTUU6IENhbm9uaWNhbGl6ZSBleHRyYWN0ZWxlbWVudChiaXRjYXN0KSAtPiBiaXRjYXN0KGV4dHJhY3RlbGVtZW50KQorICB9CisgIHJldHVybiAwOworfQorCisvLy8gQ29sbGVjdFNpbmdsZVNodWZmbGVFbGVtZW50cyAtIElmIFYgaXMgYSBzaHVmZmxlIG9mIHZhbHVlcyB0aGF0IE9OTFkgcmV0dXJucworLy8vIGVsZW1lbnRzIGZyb20gZWl0aGVyIExIUyBvciBSSFMsIHJldHVybiB0aGUgc2h1ZmZsZSBtYXNrIGFuZCB0cnVlLiAKKy8vLyBPdGhlcndpc2UsIHJldHVybiBmYWxzZS4KK3N0YXRpYyBib29sIENvbGxlY3RTaW5nbGVTaHVmZmxlRWxlbWVudHMoVmFsdWUgKlYsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJk1hc2spIHsKKyAgYXNzZXJ0KFYtPmdldFR5cGUoKSA9PSBMSFMtPmdldFR5cGUoKSAmJiBWLT5nZXRUeXBlKCkgPT0gUkhTLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICJJbnZhbGlkIENvbGxlY3RTaW5nbGVTaHVmZmxlRWxlbWVudHMiKTsKKyAgdW5zaWduZWQgTnVtRWx0cyA9IGNhc3Q8VmVjdG9yVHlwZT4oVi0+Z2V0VHlwZSgpKS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgCisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oVikpIHsKKyAgICBNYXNrLmFzc2lnbihOdW1FbHRzLCBVbmRlZlZhbHVlOjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWLT5nZXRDb250ZXh0KCkpKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIGlmIChWID09IExIUykgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWx0czsgKytpKQorICAgICAgTWFzay5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFYtPmdldENvbnRleHQoKSksIGkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgaWYgKFYgPT0gUkhTKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbHRzOyArK2kpCisgICAgICBNYXNrLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVi0+Z2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaStOdW1FbHRzKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIGlmIChJbnNlcnRFbGVtZW50SW5zdCAqSUVJID0gZHluX2Nhc3Q8SW5zZXJ0RWxlbWVudEluc3Q+KFYpKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhbiBpbnNlcnQgb2YgYW4gZXh0cmFjdCBmcm9tIHNvbWUgb3RoZXIgdmVjdG9yLCBpbmNsdWRlIGl0LgorICAgIFZhbHVlICpWZWNPcCAgICA9IElFSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBWYWx1ZSAqU2NhbGFyT3AgPSBJRUktPmdldE9wZXJhbmQoMSk7CisgICAgVmFsdWUgKklkeE9wICAgID0gSUVJLT5nZXRPcGVyYW5kKDIpOworICAgIAorICAgIGlmICghaXNhPENvbnN0YW50SW50PihJZHhPcCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgdW5zaWduZWQgSW5zZXJ0ZWRJZHggPSBjYXN0PENvbnN0YW50SW50PihJZHhPcCktPmdldFpFeHRWYWx1ZSgpOworICAgIAorICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oU2NhbGFyT3ApKSB7ICAvLyBpbnNlcnRpbmcgdW5kZWYgaW50byB2ZWN0b3IuCisgICAgICAvLyBPa2F5LCB3ZSBjYW4gaGFuZGxlIHRoaXMgaWYgdGhlIHZlY3RvciB3ZSBhcmUgaW5zZXJ0aW50aW5nIGludG8gaXMKKyAgICAgIC8vIHRyYW5zaXRpdmVseSBvay4KKyAgICAgIGlmIChDb2xsZWN0U2luZ2xlU2h1ZmZsZUVsZW1lbnRzKFZlY09wLCBMSFMsIFJIUywgTWFzaykpIHsKKyAgICAgICAgLy8gSWYgc28sIHVwZGF0ZSB0aGUgbWFzayB0byByZWZsZWN0IHRoZSBpbnNlcnRlZCB1bmRlZi4KKyAgICAgICAgTWFza1tJbnNlcnRlZElkeF0gPSBVbmRlZlZhbHVlOjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWLT5nZXRDb250ZXh0KCkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9ICAgICAgCisgICAgfSBlbHNlIGlmIChFeHRyYWN0RWxlbWVudEluc3QgKkVJID0gZHluX2Nhc3Q8RXh0cmFjdEVsZW1lbnRJbnN0PihTY2FsYXJPcCkpeworICAgICAgaWYgKGlzYTxDb25zdGFudEludD4oRUktPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgRUktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSA9PSBWLT5nZXRUeXBlKCkpIHsKKyAgICAgICAgdW5zaWduZWQgRXh0cmFjdGVkSWR4ID0KKyAgICAgICAgY2FzdDxDb25zdGFudEludD4oRUktPmdldE9wZXJhbmQoMSkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBleHRyYWN0aW5nIGZyb20gZWl0aGVyIExIUyBvciBSSFMuCisgICAgICAgIGlmIChFSS0+Z2V0T3BlcmFuZCgwKSA9PSBMSFMgfHwgRUktPmdldE9wZXJhbmQoMCkgPT0gUkhTKSB7CisgICAgICAgICAgLy8gT2theSwgd2UgY2FuIGhhbmRsZSB0aGlzIGlmIHRoZSB2ZWN0b3Igd2UgYXJlIGluc2VydGludGluZyBpbnRvIGlzCisgICAgICAgICAgLy8gdHJhbnNpdGl2ZWx5IG9rLgorICAgICAgICAgIGlmIChDb2xsZWN0U2luZ2xlU2h1ZmZsZUVsZW1lbnRzKFZlY09wLCBMSFMsIFJIUywgTWFzaykpIHsKKyAgICAgICAgICAgIC8vIElmIHNvLCB1cGRhdGUgdGhlIG1hc2sgdG8gcmVmbGVjdCB0aGUgaW5zZXJ0ZWQgdmFsdWUuCisgICAgICAgICAgICBpZiAoRUktPmdldE9wZXJhbmQoMCkgPT0gTEhTKSB7CisgICAgICAgICAgICAgIE1hc2tbSW5zZXJ0ZWRJZHggJSBOdW1FbHRzXSA9IAorICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVi0+Z2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0ZWRJZHgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgYXNzZXJ0KEVJLT5nZXRPcGVyYW5kKDApID09IFJIUyk7CisgICAgICAgICAgICAgIE1hc2tbSW5zZXJ0ZWRJZHggJSBOdW1FbHRzXSA9IAorICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVi0+Z2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0ZWRJZHgrTnVtRWx0cyk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8vIFRPRE86IEhhbmRsZSBzaHVmZmxldmVjdG9yIGhlcmUhCisgIAorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBDb2xsZWN0U2h1ZmZsZUVsZW1lbnRzIC0gV2UgYXJlIGJ1aWxkaW5nIGEgc2h1ZmZsZSBvZiBWLCB1c2luZyBSSFMgYXMgdGhlCisvLy8gUkhTIG9mIHRoZSBzaHVmZmxlIGluc3RydWN0aW9uLCBpZiBpdCBpcyBub3QgbnVsbC4gIFJldHVybiBhIHNodWZmbGUgbWFzaworLy8vIHRoYXQgY29tcHV0ZXMgViBhbmQgdGhlIExIUyB2YWx1ZSBvZiB0aGUgc2h1ZmZsZS4KK3N0YXRpYyBWYWx1ZSAqQ29sbGVjdFNodWZmbGVFbGVtZW50cyhWYWx1ZSAqViwgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqJlJIUykgeworICBhc3NlcnQoVi0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkgJiYgCisgICAgICAgICAoUkhTID09IDAgfHwgVi0+Z2V0VHlwZSgpID09IFJIUy0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgIkludmFsaWQgc2h1ZmZsZSEiKTsKKyAgdW5zaWduZWQgTnVtRWx0cyA9IGNhc3Q8VmVjdG9yVHlwZT4oVi0+Z2V0VHlwZSgpKS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgCisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oVikpIHsKKyAgICBNYXNrLmFzc2lnbihOdW1FbHRzLCBVbmRlZlZhbHVlOjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWLT5nZXRDb250ZXh0KCkpKSk7CisgICAgcmV0dXJuIFY7CisgIH0gZWxzZSBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oVikpIHsKKyAgICBNYXNrLmFzc2lnbihOdW1FbHRzLCBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVi0+Z2V0Q29udGV4dCgpKSwwKSk7CisgICAgcmV0dXJuIFY7CisgIH0gZWxzZSBpZiAoSW5zZXJ0RWxlbWVudEluc3QgKklFSSA9IGR5bl9jYXN0PEluc2VydEVsZW1lbnRJbnN0PihWKSkgeworICAgIC8vIElmIHRoaXMgaXMgYW4gaW5zZXJ0IG9mIGFuIGV4dHJhY3QgZnJvbSBzb21lIG90aGVyIHZlY3RvciwgaW5jbHVkZSBpdC4KKyAgICBWYWx1ZSAqVmVjT3AgICAgPSBJRUktPmdldE9wZXJhbmQoMCk7CisgICAgVmFsdWUgKlNjYWxhck9wID0gSUVJLT5nZXRPcGVyYW5kKDEpOworICAgIFZhbHVlICpJZHhPcCAgICA9IElFSS0+Z2V0T3BlcmFuZCgyKTsKKyAgICAKKyAgICBpZiAoRXh0cmFjdEVsZW1lbnRJbnN0ICpFSSA9IGR5bl9jYXN0PEV4dHJhY3RFbGVtZW50SW5zdD4oU2NhbGFyT3ApKSB7CisgICAgICBpZiAoaXNhPENvbnN0YW50SW50PihFSS0+Z2V0T3BlcmFuZCgxKSkgJiYgaXNhPENvbnN0YW50SW50PihJZHhPcCkgJiYKKyAgICAgICAgICBFSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IFYtPmdldFR5cGUoKSkgeworICAgICAgICB1bnNpZ25lZCBFeHRyYWN0ZWRJZHggPQorICAgICAgICBjYXN0PENvbnN0YW50SW50PihFSS0+Z2V0T3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpOworICAgICAgICB1bnNpZ25lZCBJbnNlcnRlZElkeCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KElkeE9wKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgIAorICAgICAgICAvLyBFaXRoZXIgdGhlIGV4dHJhY3RlZCBmcm9tIG9yIGluc2VydGVkIGludG8gdmVjdG9yIG11c3QgYmUgUkhTVmVjLAorICAgICAgICAvLyBvdGhlcndpc2Ugd2UnZCBlbmQgdXAgd2l0aCBhIHNodWZmbGUgb2YgdGhyZWUgaW5wdXRzLgorICAgICAgICBpZiAoRUktPmdldE9wZXJhbmQoMCkgPT0gUkhTIHx8IFJIUyA9PSAwKSB7CisgICAgICAgICAgUkhTID0gRUktPmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgVmFsdWUgKlYgPSBDb2xsZWN0U2h1ZmZsZUVsZW1lbnRzKFZlY09wLCBNYXNrLCBSSFMpOworICAgICAgICAgIE1hc2tbSW5zZXJ0ZWRJZHggJSBOdW1FbHRzXSA9IAorICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShWLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtRWx0cytFeHRyYWN0ZWRJZHgpOworICAgICAgICAgIHJldHVybiBWOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoVmVjT3AgPT0gUkhTKSB7CisgICAgICAgICAgVmFsdWUgKlYgPSBDb2xsZWN0U2h1ZmZsZUVsZW1lbnRzKEVJLT5nZXRPcGVyYW5kKDApLCBNYXNrLCBSSFMpOworICAgICAgICAgIC8vIEV2ZXJ5dGhpbmcgYnV0IHRoZSBleHRyYWN0ZWQgZWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIHRoZSBSSFMuCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbHRzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpICE9IEluc2VydGVkSWR4KQorICAgICAgICAgICAgICBNYXNrW2ldID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFYtPmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUVsdHMraSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBWOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGlzIGluc2VydGVsZW1lbnQgaXMgYSBjaGFpbiB0aGF0IGNvbWVzIGZyb20gZXhhY3RseSB0aGVzZSB0d28KKyAgICAgICAgLy8gdmVjdG9ycywgcmV0dXJuIHRoZSB2ZWN0b3IgYW5kIHRoZSBlZmZlY3RpdmUgc2h1ZmZsZS4KKyAgICAgICAgaWYgKENvbGxlY3RTaW5nbGVTaHVmZmxlRWxlbWVudHMoSUVJLCBFSS0+Z2V0T3BlcmFuZCgwKSwgUkhTLCBNYXNrKSkKKyAgICAgICAgICByZXR1cm4gRUktPmdldE9wZXJhbmQoMCk7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIFRPRE86IEhhbmRsZSBzaHVmZmxldmVjdG9yIGhlcmUhCisgIAorICAvLyBPdGhlcndpc2UsIGNhbid0IGRvIGFueXRoaW5nIGZhbmN5LiAgUmV0dXJuIGFuIGlkZW50aXR5IHZlY3Rvci4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbHRzOyArK2kpCisgICAgTWFzay5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFYtPmdldENvbnRleHQoKSksIGkpKTsKKyAgcmV0dXJuIFY7Cit9CisKK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OnZpc2l0SW5zZXJ0RWxlbWVudEluc3QoSW5zZXJ0RWxlbWVudEluc3QgJklFKSB7CisgIFZhbHVlICpWZWNPcCAgICA9IElFLmdldE9wZXJhbmQoMCk7CisgIFZhbHVlICpTY2FsYXJPcCA9IElFLmdldE9wZXJhbmQoMSk7CisgIFZhbHVlICpJZHhPcCAgICA9IElFLmdldE9wZXJhbmQoMik7CisgIAorICAvLyBJbnNlcnRpbmcgYW4gdW5kZWYgb3IgaW50byBhbiB1bmRlZmluZWQgcGxhY2UsIHJlbW92ZSB0aGlzLgorICBpZiAoaXNhPFVuZGVmVmFsdWU+KFNjYWxhck9wKSB8fCBpc2E8VW5kZWZWYWx1ZT4oSWR4T3ApKQorICAgIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUUsIFZlY09wKTsKKyAgCisgIC8vIElmIHRoZSBpbnNlcnRlZCBlbGVtZW50IHdhcyBleHRyYWN0ZWQgZnJvbSBzb21lIG90aGVyIHZlY3RvciwgYW5kIGlmIHRoZSAKKyAgLy8gaW5kZXhlcyBhcmUgY29uc3RhbnQsIHRyeSB0byB0dXJuIHRoaXMgaW50byBhIHNodWZmbGV2ZWN0b3Igb3BlcmF0aW9uLgorICBpZiAoRXh0cmFjdEVsZW1lbnRJbnN0ICpFSSA9IGR5bl9jYXN0PEV4dHJhY3RFbGVtZW50SW5zdD4oU2NhbGFyT3ApKSB7CisgICAgaWYgKGlzYTxDb25zdGFudEludD4oRUktPmdldE9wZXJhbmQoMSkpICYmIGlzYTxDb25zdGFudEludD4oSWR4T3ApICYmCisgICAgICAgIEVJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgPT0gSUUuZ2V0VHlwZSgpKSB7CisgICAgICB1bnNpZ25lZCBOdW1WZWN0b3JFbHRzID0gSUUuZ2V0VHlwZSgpLT5nZXROdW1FbGVtZW50cygpOworICAgICAgdW5zaWduZWQgRXh0cmFjdGVkSWR4ID0KKyAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KEVJLT5nZXRPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICB1bnNpZ25lZCBJbnNlcnRlZElkeCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KElkeE9wKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAKKyAgICAgIGlmIChFeHRyYWN0ZWRJZHggPj0gTnVtVmVjdG9yRWx0cykgLy8gT3V0IG9mIHJhbmdlIGV4dHJhY3QuCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKElFLCBWZWNPcCk7CisgICAgICAKKyAgICAgIGlmIChJbnNlcnRlZElkeCA+PSBOdW1WZWN0b3JFbHRzKSAgLy8gT3V0IG9mIHJhbmdlIGluc2VydC4KKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUUsIFVuZGVmVmFsdWU6OmdldChJRS5nZXRUeXBlKCkpKTsKKyAgICAgIAorICAgICAgLy8gSWYgd2UgYXJlIGV4dHJhY3RpbmcgYSB2YWx1ZSBmcm9tIGEgdmVjdG9yLCB0aGVuIGluc2VydGluZyBpdCByaWdodAorICAgICAgLy8gYmFjayBpbnRvIHRoZSBzYW1lIHBsYWNlLCBqdXN0IHVzZSB0aGUgaW5wdXQgdmVjdG9yLgorICAgICAgaWYgKEVJLT5nZXRPcGVyYW5kKDApID09IFZlY09wICYmIEV4dHJhY3RlZElkeCA9PSBJbnNlcnRlZElkeCkKKyAgICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSUUsIFZlY09wKTsgICAgICAKKyAgICAgIAorICAgICAgLy8gSWYgdGhpcyBpbnNlcnRlbGVtZW50IGlzbid0IHVzZWQgYnkgc29tZSBvdGhlciBpbnNlcnRlbGVtZW50LCB0dXJuIGl0CisgICAgICAvLyAoYW5kIGFueSBpbnNlcnRlbGVtZW50cyBpdCBwb2ludHMgdG8pLCBpbnRvIG9uZSBiaWcgc2h1ZmZsZS4KKyAgICAgIGlmICghSUUuaGFzT25lVXNlKCkgfHwgIWlzYTxJbnNlcnRFbGVtZW50SW5zdD4oSUUudXNlX2JhY2soKSkpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBNYXNrOworICAgICAgICBWYWx1ZSAqUkhTID0gMDsKKyAgICAgICAgVmFsdWUgKkxIUyA9IENvbGxlY3RTaHVmZmxlRWxlbWVudHMoJklFLCBNYXNrLCBSSFMpOworICAgICAgICBpZiAoUkhTID09IDApIFJIUyA9IFVuZGVmVmFsdWU6OmdldChMSFMtPmdldFR5cGUoKSk7CisgICAgICAgIC8vIFdlIG5vdyBoYXZlIGEgc2h1ZmZsZSBvZiBMSFMsIFJIUywgTWFzay4KKyAgICAgICAgcmV0dXJuIG5ldyBTaHVmZmxlVmVjdG9ySW5zdChMSFMsIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudFZlY3Rvcjo6Z2V0KE1hc2spKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHVuc2lnbmVkIFZXaWR0aCA9IGNhc3Q8VmVjdG9yVHlwZT4oVmVjT3AtPmdldFR5cGUoKSktPmdldE51bUVsZW1lbnRzKCk7CisgIEFQSW50IFVuZGVmRWx0cyhWV2lkdGgsIDApOworICBBUEludCBBbGxPbmVzRWx0TWFzayhBUEludDo6Z2V0QWxsT25lc1ZhbHVlKFZXaWR0aCkpOworICBpZiAoU2ltcGxpZnlEZW1hbmRlZFZlY3RvckVsdHMoJklFLCBBbGxPbmVzRWx0TWFzaywgVW5kZWZFbHRzKSkKKyAgICByZXR1cm4gJklFOworICAKKyAgcmV0dXJuIDA7Cit9CisKKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRTaHVmZmxlVmVjdG9ySW5zdChTaHVmZmxlVmVjdG9ySW5zdCAmU1ZJKSB7CisgIFZhbHVlICpMSFMgPSBTVkkuZ2V0T3BlcmFuZCgwKTsKKyAgVmFsdWUgKlJIUyA9IFNWSS5nZXRPcGVyYW5kKDEpOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gTWFzayA9IGdldFNodWZmbGVNYXNrKCZTVkkpOworICAKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIAorICAvLyBVbmRlZmluZWQgc2h1ZmZsZSBtYXNrIC0+IHVuZGVmaW5lZCB2YWx1ZS4KKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihTVkkuZ2V0T3BlcmFuZCgyKSkpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoU1ZJLCBVbmRlZlZhbHVlOjpnZXQoU1ZJLmdldFR5cGUoKSkpOworICAKKyAgdW5zaWduZWQgVldpZHRoID0gTWFzay5zaXplKCk7CisgIHVuc2lnbmVkIExIU1dpZHRoID0gY2FzdDxWZWN0b3JUeXBlPihMSFMtPmdldFR5cGUoKSktPmdldE51bUVsZW1lbnRzKCk7CisgIAorICBBUEludCBVbmRlZkVsdHMoVldpZHRoLCAwKTsKKyAgQVBJbnQgQWxsT25lc0VsdE1hc2soQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShWV2lkdGgpKTsKKyAgaWYgKFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKCZTVkksIEFsbE9uZXNFbHRNYXNrLCBVbmRlZkVsdHMpKSB7CisgICAgTEhTID0gU1ZJLmdldE9wZXJhbmQoMCk7CisgICAgUkhTID0gU1ZJLmdldE9wZXJhbmQoMSk7CisgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgIH0KKyAgCisgIC8vIENhbm9uaWNhbGl6ZSBzaHVmZmxlKHggICAgLHgsbWFzaykgLT4gc2h1ZmZsZSh4LCB1bmRlZixtYXNrJykKKyAgLy8gQ2Fub25pY2FsaXplIHNodWZmbGUodW5kZWYseCxtYXNrKSAtPiBzaHVmZmxlKHgsIHVuZGVmLG1hc2snKS4KKyAgaWYgKExIUyA9PSBSSFMgfHwgaXNhPFVuZGVmVmFsdWU+KExIUykpIHsKKyAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KExIUykgJiYgTEhTID09IFJIUykKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKFNWSSwgVW5kZWZWYWx1ZTo6Z2V0KFNWSS5nZXRUeXBlKCkpKTsKKyAgICAKKyAgICAvLyBSZW1hcCBhbnkgcmVmZXJlbmNlcyB0byBSSFMgdG8gdXNlIExIUy4KKyAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEVsdHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExIU1dpZHRoOyBpICE9IFZXaWR0aDsgKytpKSB7CisgICAgICBpZiAoTWFza1tpXSA+PSAyKmUpCisgICAgICAgIEVsdHMucHVzaF9iYWNrKFVuZGVmVmFsdWU6OmdldChUeXBlOjpnZXRJbnQzMlR5KFNWSS5nZXRDb250ZXh0KCkpKSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKChNYXNrW2ldID49IGUgJiYgaXNhPFVuZGVmVmFsdWU+KFJIUykpIHx8CisgICAgICAgICAgICAoTWFza1tpXSA8ICBlICYmIGlzYTxVbmRlZlZhbHVlPihMSFMpKSkgeworICAgICAgICAgIE1hc2tbaV0gPSAyKmU7ICAgICAvLyBUdXJuIGludG8gdW5kZWYuCisgICAgICAgICAgRWx0cy5wdXNoX2JhY2soVW5kZWZWYWx1ZTo6Z2V0KFR5cGU6OmdldEludDMyVHkoU1ZJLmdldENvbnRleHQoKSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNYXNrW2ldID0gTWFza1tpXSAlIGU7ICAvLyBGb3JjZSB0byBMSFMuCisgICAgICAgICAgRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFNWSS5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFza1tpXSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFNWSS5zZXRPcGVyYW5kKDAsIFNWSS5nZXRPcGVyYW5kKDEpKTsKKyAgICBTVkkuc2V0T3BlcmFuZCgxLCBVbmRlZlZhbHVlOjpnZXQoUkhTLT5nZXRUeXBlKCkpKTsKKyAgICBTVkkuc2V0T3BlcmFuZCgyLCBDb25zdGFudFZlY3Rvcjo6Z2V0KEVsdHMpKTsKKyAgICBMSFMgPSBTVkkuZ2V0T3BlcmFuZCgwKTsKKyAgICBSSFMgPSBTVkkuZ2V0T3BlcmFuZCgxKTsKKyAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgfQorICAKKyAgLy8gQW5hbHl6ZSB0aGUgc2h1ZmZsZSwgYXJlIHRoZSBMSFMgb3IgUkhTIGFuZCBpZGVudGl0eSBzaHVmZmxlcz8KKyAgaWYgKFZXaWR0aCA9PSBMSFNXaWR0aCkgeworICAgIGJvb2wgaXNMSFNJRCA9IHRydWUsIGlzUkhTSUQgPSB0cnVlOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNYXNrLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChNYXNrW2ldID49IGUqMikgY29udGludWU7ICAvLyBJZ25vcmUgdW5kZWYgdmFsdWVzLgorICAgICAgLy8gSXMgdGhpcyBhbiBpZGVudGl0eSBzaHVmZmxlIG9mIHRoZSBMSFMgdmFsdWU/CisgICAgICBpc0xIU0lEICY9IChNYXNrW2ldID09IGkpOworICAgICAgCisgICAgICAvLyBJcyB0aGlzIGFuIGlkZW50aXR5IHNodWZmbGUgb2YgdGhlIFJIUyB2YWx1ZT8KKyAgICAgIGlzUkhTSUQgJj0gKE1hc2tbaV0tZSA9PSBpKTsKKyAgICB9CisgIAorICAgIC8vIEVsaW1pbmF0ZSBpZGVudGl0eSBzaHVmZmxlcy4KKyAgICBpZiAoaXNMSFNJRCkgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoU1ZJLCBMSFMpOworICAgIGlmIChpc1JIU0lEKSByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChTVkksIFJIUyk7CisgIH0KKyAgCisgIC8vIENoZWNrIGZvciBhIGhhbmRmdWwgb2YgaW1wb3J0YW50IHNodWZmbGUoc2h1ZmZsZSgpKSBjb21iaW5hdGlvbnMuCisgIFNodWZmbGVWZWN0b3JJbnN0ICpMU1ZJID0gZHluX2Nhc3Q8U2h1ZmZsZVZlY3Rvckluc3Q+KExIUyk7CisgIGlmICghTFNWSSkKKyAgICByZXR1cm4gTWFkZUNoYW5nZSA/ICZTVkkgOiAwOworCisgIExIUyA9IExTVkktPmdldE9wZXJhbmQoMCk7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBMSFNNYXNrID0gZ2V0U2h1ZmZsZU1hc2soTFNWSSk7CisgIHVuc2lnbmVkIExIU0luTkVsdHMgPSBjYXN0PFZlY3RvclR5cGU+KExIUy0+Z2V0VHlwZSgpKS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgCisgIC8vIElmIGxocyBpcyBpZGVudGl0eSwgcHJvcGFnYXRlCisgIGJvb2wgaXNMSFNMb0V4dHJhY3QgPSB0cnVlLCBpc0xIU0hpRXh0cmFjdCA9IHRydWU7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMSFNNYXNrLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoTEhTTWFza1tpXSA+PSBMSFNJbk5FbHRzKjIpIGNvbnRpbnVlOyAvLyBJZ25vcmUgdW5kZWYgdmFsdWVzOworICAgIGlzTEhTTG9FeHRyYWN0ICY9IChMSFNNYXNrW2ldID09IGkpOworICAgIGlzTEhTSGlFeHRyYWN0ICY9IChMSFNNYXNrW2ldID09IGkrKExIU0luTkVsdHMvMikpOworICB9CisgIGlmICgoaXNMSFNMb0V4dHJhY3QgfHwgaXNMSFNIaUV4dHJhY3QpICYmIAorICAgICAgKGlzYTxVbmRlZlZhbHVlPihSSFMpIHx8IChMSFNXaWR0aCA9PSBMSFNJbk5FbHRzKSkpIHsKKyAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEVsdHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZXaWR0aDsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChNYXNrW2ldID49IDIqTEhTV2lkdGgpCisgICAgICAgIEVsdHMucHVzaF9iYWNrKFVuZGVmVmFsdWU6OmdldChUeXBlOjpnZXRJbnQzMlR5KFNWSS5nZXRDb250ZXh0KCkpKSk7CisgICAgICBlbHNlCisgICAgICAgIEVsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShTVkkuZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNNYXNrW01hc2tbaV1dKSk7CisgICAgfQorICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oUkhTKSkKKyAgICAgIFJIUyA9IFVuZGVmVmFsdWU6OmdldChMSFMtPmdldFR5cGUoKSk7CisgICAgcmV0dXJuIG5ldyBTaHVmZmxlVmVjdG9ySW5zdChMSFMsIFJIUywgQ29uc3RhbnRWZWN0b3I6OmdldChFbHRzKSk7CisgIH0KKyAgCisgIC8vIElmIHN2aSArIGxocyBmb3JtcyBhIGZ1bGwgdW5wYWNrLCBtZXJnZSBpdC4gVGhpcyBhbGxvd3MgbGx2bSB0byBlbWl0IAorICAvLyBlZmZpY2llbnQgY29kZSBmb3IgbWF0cml4IHRyYW5zcG9zZXMgd3JpdHRlbiB3aXRoIGdlbmVyaWMgdmVjdG9yIG9wcy4KKyAgaWYgKChMSFNNYXNrLnNpemUoKSA9PSBNYXNrLnNpemUoKSkgJiYgaXNQb3dlck9mMl8zMihNYXNrLnNpemUoKSkgJiYgCisgICAgICAoTWFzay5zaXplKCkgPiAxKSkgeworICAgIGJvb2wgaXNVbnBhY2tMbyA9IHRydWUsIGlzVW5wYWNrSGkgPSB0cnVlOworICAgIC8vIGNoZWNrIGxocyBtYXNrIGZvciA8MCwgdSwgMSwgdSAuLiA+OworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMSFNNYXNrLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChMSFNNYXNrW2ldID49IDIqZSkgY29udGludWU7CisgICAgICBpc1VucGFja0xvICY9IChMSFNNYXNrW2ldID09IChpLzIpKTsKKyAgICAgIGlzVW5wYWNrSGkgJj0gKExIU01hc2tbaV0gPT0gKGkvMikgKyAoZS8yKSk7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNYXNrLnNpemUoKTsgaSAhPSBlICYmIChpc1VucGFja0xvIHx8IGlzVW5wYWNrSGkpOworICAgICAgICAgaSArPSAyKSB7CisgICAgICBpc1VucGFja0xvICY9IChNYXNrW2ldID09IGkpICYmIChNYXNrW2krMV0gPT0gKGkvMikrZSk7CisgICAgICBpc1VucGFja0hpICY9IChNYXNrW2ldID09IGkpICYmIChNYXNrW2krMV0gPT0gKGkvMikrZSsoZS8yKSk7CisgICAgfQorICAgIGlmIChpc1VucGFja0xvIHx8IGlzVW5wYWNrSGkpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gRWx0czsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNYXNrLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgaWYgKE1hc2tbaV0gPj0gMiplKQorICAgICAgICAgIEVsdHMucHVzaF9iYWNrKFVuZGVmVmFsdWU6OmdldChUeXBlOjpnZXRJbnQzMlR5KFNWSS5nZXRDb250ZXh0KCkpKSk7CisgICAgICAgIGVsc2UgaWYgKE1hc2tbaV0gPj0gZSkKKyAgICAgICAgICBFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoU1ZJLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrW2ldKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoU1ZJLmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNNYXNrW01hc2tbaV1dKSk7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IFNodWZmbGVWZWN0b3JJbnN0KExIUywgUkhTLCBDb25zdGFudFZlY3Rvcjo6Z2V0KEVsdHMpKTsKKyAgICB9CisgIH0KKworICAvLyBJZiByaHMgaXMgc2h1ZmZsZSArIGlkZW50aXR5LCBwcm9wYWdhdGUuCisgIGlmIChTaHVmZmxlVmVjdG9ySW5zdCAqUlNWSSA9IGR5bl9jYXN0PFNodWZmbGVWZWN0b3JJbnN0PihSSFMpKSB7CisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFJIU01hc2sgPSBnZXRTaHVmZmxlTWFzayhSU1ZJKTsKKyAgICB1bnNpZ25lZCBSSFNJbk5FbHRzID0gCisgICAgICBjYXN0PFZlY3RvclR5cGU+KFJTVkktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSktPmdldE51bUVsZW1lbnRzKCk7CisKKyAgICAvLyBJZiByaHMgaXMgaWRlbnRpdHksIHByb3BhZ2F0ZQorICAgIGJvb2wgaXNSSFNMb0V4dHJhY3QgPSB0cnVlLCBpc1JIU0hpRXh0cmFjdCA9IHRydWU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJIU01hc2suc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKFJIU01hc2tbaV0gPj0gUkhTSW5ORWx0cyoyKSBjb250aW51ZTsgLy8gSWdub3JlIHVuZGVmIHZhbHVlczsKKyAgICAgIGlzUkhTTG9FeHRyYWN0ICY9IChSSFNNYXNrW2ldID09IGkpOworICAgICAgaXNSSFNIaUV4dHJhY3QgJj0gKFJIU01hc2tbaV0gPT0gaSsoUkhTSW5ORWx0cy8yKSk7CisgICAgfQorICAgIGlmICgoaXNSSFNMb0V4dHJhY3QgfHwgaXNSSFNIaUV4dHJhY3QpICYmIChMSFNXaWR0aCA9PSBSSFNJbk5FbHRzKSkgeworICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBFbHRzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZXaWR0aDsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgaWYgKE1hc2tbaV0gPj0gMipMSFNXaWR0aCkKKyAgICAgICAgICBFbHRzLnB1c2hfYmFjayhVbmRlZlZhbHVlOjpnZXQoVHlwZTo6Z2V0SW50MzJUeShTVkkuZ2V0Q29udGV4dCgpKSkpOworICAgICAgICBlbHNlIGlmIChNYXNrW2ldIDwgTEhTV2lkdGgpCisgICAgICAgICAgRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFNWSS5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFza1tpXSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KFNWSS5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTTWFza1tNYXNrW2ldLUxIU1dpZHRoXStMSFNXaWR0aCkpOworICAgICAgfQorICAgICAgU1ZJLnNldE9wZXJhbmQoMSwgUlNWSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICBTVkkuc2V0T3BlcmFuZCgyLCBDb25zdGFudFZlY3Rvcjo6Z2V0KEVsdHMpKTsKKyAgICAgIHJldHVybiAmU1ZJOworICAgIH0KKyAgfQorICAKKyAgLy8gQmUgZXh0cmVtZWx5IGNvbnNlcnZhdGl2ZSB3aGVuIG1lcmdpbmcgc2h1ZmZsZXZlY3RvciBpbnN0cnVjdGlvbnMuICBJdCBpcyAKKyAgLy8gZGlmZmljdWx0IGZvciB0aGUgY29kZSBnZW5lcmF0b3IgdG8gcmVjb2duaXplIGEgbWVyZ2VkIHNodWZmbGUsIHdoaWNoIAorICAvLyB1c3VhbGx5IGxlYWRzIHRvIHdvcnNlIGNvZGUgZnJvbSBtZXJnaW5nIGEgc2h1ZmZsZS4KKyAgaWYgKCFpc2E8VW5kZWZWYWx1ZT4oUkhTKSkKKyAgICByZXR1cm4gTWFkZUNoYW5nZSA/ICZTVkkgOiAwOworICAKKyAgLy8gSWYgdGhlIG1lcmdlZCBzaHVmZmxlIG1hc2sgaXMgb25lIG9mIHRoZSB0d28gaW5wdXQgc2h1ZmZsZSBtYXNrcywgd2hpY2gKKyAgLy8ganVzdCByZW1vdmVzIG9uZSBpbnN0cnVjdGlvbi4gIFRoaXMgc2hvdWxkIGhhbmRsZSBzcGxhdChzcGxhdCkgLT4gc3BsYXQuCisgIGlmIChMSFNNYXNrLnNpemUoKSA9PSBNYXNrLnNpemUoKSkgeworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBOZXdNYXNrOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNYXNrLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoTWFza1tpXSA+PSBlKQorICAgICAgICBOZXdNYXNrLnB1c2hfYmFjaygyKmUpOworICAgICAgZWxzZQorICAgICAgICBOZXdNYXNrLnB1c2hfYmFjayhMSFNNYXNrW01hc2tbaV1dKTsKKyAgICAKKyAgICAvLyBJZiB0aGUgcmVzdWx0IG1hc2sgaXMgZXF1YWwgdG8gdGhlIHNyYyBzaHVmZmxlIG9yIHRoaXMgc2h1ZmZsZSBtYXNrLAorICAgIC8vIGRvIHRoZSByZXBsYWNlbWVudC4KKyAgICBpZiAoTmV3TWFzayA9PSBMSFNNYXNrIHx8IE5ld01hc2sgPT0gTWFzaykgeworICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBFbHRzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5ld01hc2suc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBpZiAoTmV3TWFza1tpXSA+PSBMSFNJbk5FbHRzKjIpIHsKKyAgICAgICAgICBFbHRzLnB1c2hfYmFjayhVbmRlZlZhbHVlOjpnZXQoVHlwZTo6Z2V0SW50MzJUeShTVkkuZ2V0Q29udGV4dCgpKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShTVkkuZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld01hc2tbaV0pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBTaHVmZmxlVmVjdG9ySW5zdChMSFMsIExTVkktPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50VmVjdG9yOjpnZXQoRWx0cykpOworICAgIH0KKyAgfQorICByZXR1cm4gTWFkZUNoYW5nZSA/ICZTVkkgOiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVXb3JrbGlzdC5oIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVXb3JrbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMDBhODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZVdvcmtsaXN0LmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vPT09LSBJbnN0Q29tYmluZVdvcmtsaXN0LmggLSBXb3JrbGlzdCBmb3IgdGhlIEluc3RDb21iaW5lIHBhc3MgLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgSU5TVENPTUJJTkVfV09SS0xJU1RfSAorI2RlZmluZSBJTlNUQ09NQklORV9XT1JLTElTVF9ICisKKyNkZWZpbmUgREVCVUdfVFlQRSAiaW5zdGNvbWJpbmUiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworICAKKy8vLyBJbnN0Q29tYmluZVdvcmtsaXN0IC0gVGhpcyBpcyB0aGUgd29ya2xpc3QgbWFuYWdlbWVudCBsb2dpYyBmb3IKKy8vLyBJbnN0Q29tYmluZS4KK2NsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIEluc3RDb21iaW5lV29ya2xpc3QgeworICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiosIDI1Nj4gV29ya2xpc3Q7CisgIERlbnNlTWFwPEluc3RydWN0aW9uKiwgdW5zaWduZWQ+IFdvcmtsaXN0TWFwOworICAKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSW5zdENvbWJpbmVXb3JrbGlzdCZSSFMpOyAgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgSW5zdENvbWJpbmVXb3JrbGlzdChjb25zdCBJbnN0Q29tYmluZVdvcmtsaXN0Jik7IC8vIERPIE5PVCBJTVBMRU1FTlQKK3B1YmxpYzoKKyAgSW5zdENvbWJpbmVXb3JrbGlzdCgpIHt9CisgIAorICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBXb3JrbGlzdC5lbXB0eSgpOyB9CisgIAorICAvLy8gQWRkIC0gQWRkIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gdG8gdGhlIHdvcmtsaXN0IGlmIGl0IGlzbid0IGFscmVhZHkKKyAgLy8vIGluIGl0LgorICB2b2lkIEFkZChJbnN0cnVjdGlvbiAqSSkgeworICAgIGlmIChXb3JrbGlzdE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSSwgV29ya2xpc3Quc2l6ZSgpKSkuc2Vjb25kKSB7CisgICAgICBERUJVRyhlcnJzKCkgPDwgIklDOiBBREQ6ICIgPDwgKkkgPDwgJ1xuJyk7CisgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soSSk7CisgICAgfQorICB9CisgIAorICB2b2lkIEFkZFZhbHVlKFZhbHVlICpWKSB7CisgICAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKQorICAgICAgQWRkKEkpOworICB9CisgIAorICAvLy8gQWRkSW5pdGlhbEdyb3VwIC0gQWRkIHRoZSBzcGVjaWZpZWQgYmF0Y2ggb2Ygc3R1ZmYgaW4gcmV2ZXJzZSBvcmRlci4KKyAgLy8vIHdoaWNoIHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbiB0aGUgd29ya2xpc3QgaXMgZW1wdHkgYW5kIHdoZW4gdGhlIGdyb3VwCisgIC8vLyBoYXMgbm8gZHVwbGljYXRlcy4KKyAgdm9pZCBBZGRJbml0aWFsR3JvdXAoSW5zdHJ1Y3Rpb24gKmNvbnN0ICpMaXN0LCB1bnNpZ25lZCBOdW1FbnRyaWVzKSB7CisgICAgYXNzZXJ0KFdvcmtsaXN0LmVtcHR5KCkgJiYgIldvcmtsaXN0IG11c3QgYmUgZW1wdHkgdG8gYWRkIGluaXRpYWwgZ3JvdXAiKTsKKyAgICBXb3JrbGlzdC5yZXNlcnZlKE51bUVudHJpZXMrMTYpOworICAgIERFQlVHKGVycnMoKSA8PCAiSUM6IEFERElORzogIiA8PCBOdW1FbnRyaWVzIDw8ICIgaW5zdHJzIHRvIHdvcmtsaXN0XG4iKTsKKyAgICBmb3IgKDsgTnVtRW50cmllczsgLS1OdW1FbnRyaWVzKSB7CisgICAgICBJbnN0cnVjdGlvbiAqSSA9IExpc3RbTnVtRW50cmllcy0xXTsKKyAgICAgIFdvcmtsaXN0TWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihJLCBXb3JrbGlzdC5zaXplKCkpKTsKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhJKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIFJlbW92ZSAtIHJlbW92ZSBJIGZyb20gdGhlIHdvcmtsaXN0IGlmIGl0IGV4aXN0cy4KKyAgdm9pZCBSZW1vdmUoSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBEZW5zZU1hcDxJbnN0cnVjdGlvbiosIHVuc2lnbmVkPjo6aXRlcmF0b3IgSXQgPSBXb3JrbGlzdE1hcC5maW5kKEkpOworICAgIGlmIChJdCA9PSBXb3JrbGlzdE1hcC5lbmQoKSkgcmV0dXJuOyAvLyBOb3QgaW4gd29ya2xpc3QuCisgICAgCisgICAgLy8gRG9uJ3QgYm90aGVyIG1vdmluZyBldmVyeXRoaW5nIGRvd24sIGp1c3QgbnVsbCBvdXQgdGhlIHNsb3QuCisgICAgV29ya2xpc3RbSXQtPnNlY29uZF0gPSAwOworICAgIAorICAgIFdvcmtsaXN0TWFwLmVyYXNlKEl0KTsKKyAgfQorICAKKyAgSW5zdHJ1Y3Rpb24gKlJlbW92ZU9uZSgpIHsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IFdvcmtsaXN0LmJhY2soKTsKKyAgICBXb3JrbGlzdC5wb3BfYmFjaygpOworICAgIFdvcmtsaXN0TWFwLmVyYXNlKEkpOworICAgIHJldHVybiBJOworICB9CisgIAorICAvLy8gQWRkVXNlcnNUb1dvcmtMaXN0IC0gV2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBzaW1wbGlmaWVkLCBhZGQgYWxsIHVzZXJzIG9mCisgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHdvcmsgbGlzdHMgYmVjYXVzZSB0aGV5IG1pZ2h0IGdldCBtb3JlIHNpbXBsaWZpZWQKKyAgLy8vIG5vdy4KKyAgLy8vCisgIHZvaWQgQWRkVXNlcnNUb1dvcmtMaXN0KEluc3RydWN0aW9uICZJKSB7CisgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gSS51c2VfYmVnaW4oKSwgVUUgPSBJLnVzZV9lbmQoKTsKKyAgICAgICAgIFVJICE9IFVFOyArK1VJKQorICAgICAgQWRkKGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSkpOworICB9CisgIAorICAKKyAgLy8vIFphcCAtIGNoZWNrIHRoYXQgdGhlIHdvcmtsaXN0IGlzIGVtcHR5IGFuZCBudWtlIHRoZSBiYWNraW5nIHN0b3JlIGZvcgorICAvLy8gdGhlIG1hcCBpZiBpdCBpcyBsYXJnZS4KKyAgdm9pZCBaYXAoKSB7CisgICAgYXNzZXJ0KFdvcmtsaXN0TWFwLmVtcHR5KCkgJiYgIldvcmtsaXN0IGVtcHR5LCBidXQgbWFwIG5vdD8iKTsKKyAgICAKKyAgICAvLyBEbyBhbiBleHBsaWNpdCBjbGVhciwgdGhpcyBzaHJpbmtzIHRoZSBtYXAgaWYgbmVlZGVkLgorICAgIFdvcmtsaXN0TWFwLmNsZWFyKCk7CisgIH0KK307CisgIAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdHJ1Y3Rpb25Db21iaW5pbmcuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdHJ1Y3Rpb25Db21iaW5pbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZjZiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0cnVjdGlvbkNvbWJpbmluZy5jcHAKQEAgLTAsMCArMSwxMjQ1IEBACisvLz09PS0gSW5zdHJ1Y3Rpb25Db21iaW5pbmcuY3BwIC0gQ29tYmluZSBtdWx0aXBsZSBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEluc3RydWN0aW9uQ29tYmluaW5nIC0gQ29tYmluZSBpbnN0cnVjdGlvbnMgdG8gZm9ybSBmZXdlciwgc2ltcGxlCisvLyBpbnN0cnVjdGlvbnMuICBUaGlzIHBhc3MgZG9lcyBub3QgbW9kaWZ5IHRoZSBDRkcuICBUaGlzIHBhc3MgaXMgd2hlcmUKKy8vIGFsZ2VicmFpYyBzaW1wbGlmaWNhdGlvbiBoYXBwZW5zLgorLy8KKy8vIFRoaXMgcGFzcyBjb21iaW5lcyB0aGluZ3MgbGlrZToKKy8vICAgICVZID0gYWRkIGkzMiAlWCwgMQorLy8gICAgJVogPSBhZGQgaTMyICVZLCAxCisvLyBpbnRvOgorLy8gICAgJVogPSBhZGQgaTMyICVYLCAyCisvLworLy8gVGhpcyBpcyBhIHNpbXBsZSB3b3JrbGlzdCBkcml2ZW4gYWxnb3JpdGhtLgorLy8KKy8vIFRoaXMgcGFzcyBndWFyYW50ZWVzIHRoYXQgdGhlIGZvbGxvd2luZyBjYW5vbmljYWxpemF0aW9ucyBhcmUgcGVyZm9ybWVkIG9uCisvLyB0aGUgcHJvZ3JhbToKKy8vICAgIDEuIElmIGEgYmluYXJ5IG9wZXJhdG9yIGhhcyBhIGNvbnN0YW50IG9wZXJhbmQsIGl0IGlzIG1vdmVkIHRvIHRoZSBSSFMKKy8vICAgIDIuIEJpdHdpc2Ugb3BlcmF0b3JzIHdpdGggY29uc3RhbnQgb3BlcmFuZHMgYXJlIGFsd2F5cyBncm91cGVkIHNvIHRoYXQKKy8vICAgICAgIHNoaWZ0cyBhcmUgcGVyZm9ybWVkIGZpcnN0LCB0aGVuIG9yJ3MsIHRoZW4gYW5kJ3MsIHRoZW4geG9yJ3MuCisvLyAgICAzLiBDb21wYXJlIGluc3RydWN0aW9ucyBhcmUgY29udmVydGVkIGZyb20gPCw+LDw9LD49IHRvID09LCE9IGlmIHBvc3NpYmxlCisvLyAgICA0LiBBbGwgY21wIGluc3RydWN0aW9ucyBvbiBib29sZWFuIHZhbHVlcyBhcmUgcmVwbGFjZWQgd2l0aCBsb2dpY2FsIG9wcworLy8gICAgNS4gYWRkIFgsIFggaXMgcmVwcmVzZW50ZWQgYXMgKFgqMikgPT4gKFggPDwgMSkKKy8vICAgIDYuIE11bHRpcGxpZXMgd2l0aCBhIHBvd2VyLW9mLXR3byBjb25zdGFudCBhcmd1bWVudCBhcmUgdHJhbnNmb3JtZWQgaW50bworLy8gICAgICAgc2hpZnRzLgorLy8gICAuLi4gZXRjLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiaW5zdGNvbWJpbmUiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIgorI2luY2x1ZGUgIkluc3RDb21iaW5lLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Db25zdGFudEZvbGRpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0luc3RydWN0aW9uU2ltcGxpZnkuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdHRlcm5NYXRjaC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNsaW1pdHM+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOjpQYXR0ZXJuTWF0Y2g7CisKK1NUQVRJU1RJQyhOdW1Db21iaW5lZCAsICJOdW1iZXIgb2YgaW5zdHMgY29tYmluZWQiKTsKK1NUQVRJU1RJQyhOdW1Db25zdFByb3AsICJOdW1iZXIgb2YgY29uc3RhbnQgZm9sZHMiKTsKK1NUQVRJU1RJQyhOdW1EZWFkSW5zdCAsICJOdW1iZXIgb2YgZGVhZCBpbnN0IGVsaW1pbmF0ZWQiKTsKK1NUQVRJU1RJQyhOdW1TdW5rSW5zdCAsICJOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHN1bmsiKTsKKworCitjaGFyIEluc3RDb21iaW5lcjo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKEluc3RDb21iaW5lciwgImluc3Rjb21iaW5lIiwKKyAgICAgICAgICAgICAgICAiQ29tYmluZSByZWR1bmRhbnQgaW5zdHJ1Y3Rpb25zIiwgZmFsc2UsIGZhbHNlKTsKKwordm9pZCBJbnN0Q29tYmluZXI6OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuYWRkUHJlc2VydmVkSUQoTENTU0FJRCk7CisgIEFVLnNldFByZXNlcnZlc0NGRygpOworfQorCisKKy8vLyBTaG91bGRDaGFuZ2VUeXBlIC0gUmV0dXJuIHRydWUgaWYgaXQgaXMgZGVzaXJhYmxlIHRvIGNvbnZlcnQgYSBjb21wdXRhdGlvbgorLy8vIGZyb20gJ0Zyb20nIHRvICdUbycuICBXZSBkb24ndCB3YW50IHRvIGNvbnZlcnQgZnJvbSBhIGxlZ2FsIHRvIGFuIGlsbGVnYWwKKy8vLyB0eXBlIGZvciBleGFtcGxlLCBvciBmcm9tIGEgc21hbGxlciB0byBhIGxhcmdlciBpbGxlZ2FsIHR5cGUuCitib29sIEluc3RDb21iaW5lcjo6U2hvdWxkQ2hhbmdlVHlwZShjb25zdCBUeXBlICpGcm9tLCBjb25zdCBUeXBlICpUbykgY29uc3QgeworICBhc3NlcnQoRnJvbS0+aXNJbnRlZ2VyVHkoKSAmJiBUby0+aXNJbnRlZ2VyVHkoKSk7CisgIAorICAvLyBJZiB3ZSBkb24ndCBoYXZlIFRELCB3ZSBkb24ndCBrbm93IGlmIHRoZSBzb3VyY2UvZGVzdCBhcmUgbGVnYWwuCisgIGlmICghVEQpIHJldHVybiBmYWxzZTsKKyAgCisgIHVuc2lnbmVkIEZyb21XaWR0aCA9IEZyb20tPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKTsKKyAgdW5zaWduZWQgVG9XaWR0aCA9IFRvLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgIGJvb2wgRnJvbUxlZ2FsID0gVEQtPmlzTGVnYWxJbnRlZ2VyKEZyb21XaWR0aCk7CisgIGJvb2wgVG9MZWdhbCA9IFRELT5pc0xlZ2FsSW50ZWdlcihUb1dpZHRoKTsKKyAgCisgIC8vIElmIHRoaXMgaXMgYSBsZWdhbCBpbnRlZ2VyIGZyb20gdHlwZSwgYW5kIHRoZSByZXN1bHQgd291bGQgYmUgYW4gaWxsZWdhbAorICAvLyB0eXBlLCBkb24ndCBkbyB0aGUgdHJhbnNmb3JtYXRpb24uCisgIGlmIChGcm9tTGVnYWwgJiYgIVRvTGVnYWwpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gT3RoZXJ3aXNlLCBpZiBib3RoIGFyZSBpbGxlZ2FsLCBkbyBub3QgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4gV2UKKyAgLy8gZG8gYWxsb3cgdGhpbmdzIGxpa2UgaTE2MCAtPiBpNjQsIGJ1dCBub3QgaTY0IC0+IGkxNjAuCisgIGlmICghRnJvbUxlZ2FsICYmICFUb0xlZ2FsICYmIFRvV2lkdGggPiBGcm9tV2lkdGgpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gU2ltcGxpZnlDb21tdXRhdGl2ZSAtIFRoaXMgcGVyZm9ybXMgYSBmZXcgc2ltcGxpZmljYXRpb25zIGZvciBjb21tdXRhdGl2ZQorLy8gb3BlcmF0b3JzOgorLy8KKy8vICAxLiBPcmRlciBvcGVyYW5kcyBzdWNoIHRoYXQgdGhleSBhcmUgbGlzdGVkIGZyb20gcmlnaHQgKGxlYXN0IGNvbXBsZXgpIHRvCisvLyAgICAgbGVmdCAobW9zdCBjb21wbGV4KS4gIFRoaXMgcHV0cyBjb25zdGFudHMgYmVmb3JlIHVuYXJ5IG9wZXJhdG9ycyBiZWZvcmUKKy8vICAgICBiaW5hcnkgb3BlcmF0b3JzLgorLy8KKy8vICAyLiBUcmFuc2Zvcm06IChvcCAob3AgViwgQzEpLCBDMikgPT0+IChvcCBWLCAob3AgQzEsIEMyKSkKKy8vICAzLiBUcmFuc2Zvcm06IChvcCAob3AgVjEsIEMxKSwgKG9wIFYyLCBDMikpID09PiAob3AgKG9wIFYxLCBWMiksIChvcCBDMSxDMikpCisvLworYm9vbCBJbnN0Q29tYmluZXI6OlNpbXBsaWZ5Q29tbXV0YXRpdmUoQmluYXJ5T3BlcmF0b3IgJkkpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGlmIChnZXRDb21wbGV4aXR5KEkuZ2V0T3BlcmFuZCgwKSkgPCBnZXRDb21wbGV4aXR5KEkuZ2V0T3BlcmFuZCgxKSkpCisgICAgQ2hhbmdlZCA9ICFJLnN3YXBPcGVyYW5kcygpOworCisgIGlmICghSS5pc0Fzc29jaWF0aXZlKCkpIHJldHVybiBDaGFuZ2VkOworICAKKyAgSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBPcGNvZGUgPSBJLmdldE9wY29kZSgpOworICBpZiAoQmluYXJ5T3BlcmF0b3IgKk9wID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KEkuZ2V0T3BlcmFuZCgwKSkpCisgICAgaWYgKE9wLT5nZXRPcGNvZGUoKSA9PSBPcGNvZGUgJiYgaXNhPENvbnN0YW50PihPcC0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgIGlmIChpc2E8Q29uc3RhbnQ+KEkuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgQ29uc3RhbnQgKkZvbGRlZCA9IENvbnN0YW50RXhwcjo6Z2V0KEkuZ2V0T3Bjb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50PihJLmdldE9wZXJhbmQoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxDb25zdGFudD4oT3AtPmdldE9wZXJhbmQoMSkpKTsKKyAgICAgICAgSS5zZXRPcGVyYW5kKDAsIE9wLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgSS5zZXRPcGVyYW5kKDEsIEZvbGRlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoQmluYXJ5T3BlcmF0b3IgKk9wMSA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihJLmdldE9wZXJhbmQoMSkpKQorICAgICAgICBpZiAoT3AxLT5nZXRPcGNvZGUoKSA9PSBPcGNvZGUgJiYgaXNhPENvbnN0YW50PihPcDEtPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgICBPcC0+aGFzT25lVXNlKCkgJiYgT3AxLT5oYXNPbmVVc2UoKSkgeworICAgICAgICAgIENvbnN0YW50ICpDMSA9IGNhc3Q8Q29uc3RhbnQ+KE9wLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgICBDb25zdGFudCAqQzIgPSBjYXN0PENvbnN0YW50PihPcDEtPmdldE9wZXJhbmQoMSkpOworCisgICAgICAgICAgLy8gRm9sZCAob3AgKG9wIFYxLCBDMSksIChvcCBWMiwgQzIpKSA9PT4gKG9wIChvcCBWMSwgVjIpLCAob3AgQzEsQzIpKQorICAgICAgICAgIENvbnN0YW50ICpGb2xkZWQgPSBDb25zdGFudEV4cHI6OmdldChJLmdldE9wY29kZSgpLCBDMSwgQzIpOworICAgICAgICAgIEluc3RydWN0aW9uICpOZXcgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKE9wY29kZSwgT3AtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AxLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJKTsKKyAgICAgICAgICBXb3JrbGlzdC5BZGQoTmV3KTsKKyAgICAgICAgICBJLnNldE9wZXJhbmQoMCwgTmV3KTsKKyAgICAgICAgICBJLnNldE9wZXJhbmQoMSwgRm9sZGVkKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vIGR5bl9jYXN0TmVnVmFsIC0gR2l2ZW4gYSAnc3ViJyBpbnN0cnVjdGlvbiwgcmV0dXJuIHRoZSBSSFMgb2YgdGhlIGluc3RydWN0aW9uCisvLyBpZiB0aGUgTEhTIGlzIGEgY29uc3RhbnQgemVybyAod2hpY2ggaXMgdGhlICduZWdhdGUnIGZvcm0pLgorLy8KK1ZhbHVlICpJbnN0Q29tYmluZXI6OmR5bl9jYXN0TmVnVmFsKFZhbHVlICpWKSBjb25zdCB7CisgIGlmIChCaW5hcnlPcGVyYXRvcjo6aXNOZWcoVikpCisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpnZXROZWdBcmd1bWVudChWKTsKKworICAvLyBDb25zdGFudHMgY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUgbmVnYXRlZCB2YWx1ZXMgaWYgdGhleSBjYW4gYmUgZm9sZGVkLgorICBpZiAoQ29uc3RhbnRJbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpCisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TmVnKEMpOworCisgIGlmIChDb25zdGFudFZlY3RvciAqQyA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihWKSkKKyAgICBpZiAoQy0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpLT5pc0ludGVnZXJUeSgpKQorICAgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TmVnKEMpOworCisgIHJldHVybiAwOworfQorCisvLyBkeW5fY2FzdEZOZWdWYWwgLSBHaXZlbiBhICdmc3ViJyBpbnN0cnVjdGlvbiwgcmV0dXJuIHRoZSBSSFMgb2YgdGhlCisvLyBpbnN0cnVjdGlvbiBpZiB0aGUgTEhTIGlzIGEgY29uc3RhbnQgbmVnYXRpdmUgemVybyAod2hpY2ggaXMgdGhlICduZWdhdGUnCisvLyBmb3JtKS4KKy8vCitWYWx1ZSAqSW5zdENvbWJpbmVyOjpkeW5fY2FzdEZOZWdWYWwoVmFsdWUgKlYpIGNvbnN0IHsKKyAgaWYgKEJpbmFyeU9wZXJhdG9yOjppc0ZOZWcoVikpCisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpnZXRGTmVnQXJndW1lbnQoVik7CisKKyAgLy8gQ29uc3RhbnRzIGNhbiBiZSBjb25zaWRlcmVkIHRvIGJlIG5lZ2F0ZWQgdmFsdWVzIGlmIHRoZXkgY2FuIGJlIGZvbGRlZC4KKyAgaWYgKENvbnN0YW50RlAgKkMgPSBkeW5fY2FzdDxDb25zdGFudEZQPihWKSkKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRGTmVnKEMpOworCisgIGlmIChDb25zdGFudFZlY3RvciAqQyA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihWKSkKKyAgICBpZiAoQy0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpLT5pc0Zsb2F0aW5nUG9pbnRUeSgpKQorICAgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Rk5lZyhDKTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIFZhbHVlICpGb2xkT3BlcmF0aW9uSW50b1NlbGVjdE9wZXJhbmQoSW5zdHJ1Y3Rpb24gJkksIFZhbHVlICpTTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RDb21iaW5lciAqSUMpIHsKKyAgaWYgKENhc3RJbnN0ICpDSSA9IGR5bl9jYXN0PENhc3RJbnN0PigmSSkpCisgICAgcmV0dXJuIElDLT5CdWlsZGVyLT5DcmVhdGVDYXN0KENJLT5nZXRPcGNvZGUoKSwgU08sIEkuZ2V0VHlwZSgpKTsKKworICAvLyBGaWd1cmUgb3V0IGlmIHRoZSBjb25zdGFudCBpcyB0aGUgbGVmdCBvciB0aGUgcmlnaHQgYXJndW1lbnQuCisgIGJvb2wgQ29uc3RJc1JIUyA9IGlzYTxDb25zdGFudD4oSS5nZXRPcGVyYW5kKDEpKTsKKyAgQ29uc3RhbnQgKkNvbnN0T3BlcmFuZCA9IGNhc3Q8Q29uc3RhbnQ+KEkuZ2V0T3BlcmFuZChDb25zdElzUkhTKSk7CisKKyAgaWYgKENvbnN0YW50ICpTT0MgPSBkeW5fY2FzdDxDb25zdGFudD4oU08pKSB7CisgICAgaWYgKENvbnN0SXNSSFMpCisgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXQoSS5nZXRPcGNvZGUoKSwgU09DLCBDb25zdE9wZXJhbmQpOworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldChJLmdldE9wY29kZSgpLCBDb25zdE9wZXJhbmQsIFNPQyk7CisgIH0KKworICBWYWx1ZSAqT3AwID0gU08sICpPcDEgPSBDb25zdE9wZXJhbmQ7CisgIGlmICghQ29uc3RJc1JIUykKKyAgICBzdGQ6OnN3YXAoT3AwLCBPcDEpOworICAKKyAgaWYgKEJpbmFyeU9wZXJhdG9yICpCTyA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPigmSSkpCisgICAgcmV0dXJuIElDLT5CdWlsZGVyLT5DcmVhdGVCaW5PcChCTy0+Z2V0T3Bjb2RlKCksIE9wMCwgT3AxKTsKKyAgaWYgKElDbXBJbnN0ICpDSSA9IGR5bl9jYXN0PElDbXBJbnN0PigmSSkpCisgICAgcmV0dXJuIElDLT5CdWlsZGVyLT5DcmVhdGVJQ21wKENJLT5nZXRQcmVkaWNhdGUoKSwgT3AwLCBPcDEpOworICBpZiAoRkNtcEluc3QgKkNJID0gZHluX2Nhc3Q8RkNtcEluc3Q+KCZJKSkKKyAgICByZXR1cm4gSUMtPkJ1aWxkZXItPkNyZWF0ZUlDbXAoQ0ktPmdldFByZWRpY2F0ZSgpLCBPcDAsIE9wMSk7CisgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYmluYXJ5IGluc3RydWN0aW9uIHR5cGUhIik7Cit9CisKKy8vIEZvbGRPcEludG9TZWxlY3QgLSBHaXZlbiBhbiBpbnN0cnVjdGlvbiB3aXRoIGEgc2VsZWN0IGFzIG9uZSBvcGVyYW5kIGFuZCBhCisvLyBjb25zdGFudCBhcyB0aGUgb3RoZXIgb3BlcmFuZCwgdHJ5IHRvIGZvbGQgdGhlIGJpbmFyeSBvcGVyYXRvciBpbnRvIHRoZQorLy8gc2VsZWN0IGFyZ3VtZW50cy4gIFRoaXMgYWxzbyB3b3JrcyBmb3IgQ2FzdCBpbnN0cnVjdGlvbnMsIHdoaWNoIG9idmlvdXNseSBkbworLy8gbm90IGhhdmUgYSBzZWNvbmQgb3BlcmFuZC4KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OkZvbGRPcEludG9TZWxlY3QoSW5zdHJ1Y3Rpb24gJk9wLCBTZWxlY3RJbnN0ICpTSSkgeworICAvLyBEb24ndCBtb2RpZnkgc2hhcmVkIHNlbGVjdCBpbnN0cnVjdGlvbnMKKyAgaWYgKCFTSS0+aGFzT25lVXNlKCkpIHJldHVybiAwOworICBWYWx1ZSAqVFYgPSBTSS0+Z2V0T3BlcmFuZCgxKTsKKyAgVmFsdWUgKkZWID0gU0ktPmdldE9wZXJhbmQoMik7CisKKyAgaWYgKGlzYTxDb25zdGFudD4oVFYpIHx8IGlzYTxDb25zdGFudD4oRlYpKSB7CisgICAgLy8gQm9vbCBzZWxlY3RzIHdpdGggY29uc3RhbnQgb3BlcmFuZHMgY2FuIGJlIGZvbGRlZCB0byBsb2dpY2FsIG9wcy4KKyAgICBpZiAoU0ktPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoMSkpIHJldHVybiAwOworCisgICAgVmFsdWUgKlNlbGVjdFRydWVWYWwgPSBGb2xkT3BlcmF0aW9uSW50b1NlbGVjdE9wZXJhbmQoT3AsIFRWLCB0aGlzKTsKKyAgICBWYWx1ZSAqU2VsZWN0RmFsc2VWYWwgPSBGb2xkT3BlcmF0aW9uSW50b1NlbGVjdE9wZXJhbmQoT3AsIEZWLCB0aGlzKTsKKworICAgIHJldHVybiBTZWxlY3RJbnN0OjpDcmVhdGUoU0ktPmdldENvbmRpdGlvbigpLCBTZWxlY3RUcnVlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0RmFsc2VWYWwpOworICB9CisgIHJldHVybiAwOworfQorCisKKy8vLyBGb2xkT3BJbnRvUGhpIC0gR2l2ZW4gYSBiaW5hcnkgb3BlcmF0b3IsIGNhc3QgaW5zdHJ1Y3Rpb24sIG9yIHNlbGVjdCB3aGljaAorLy8vIGhhcyBhIFBISSBub2RlIGFzIG9wZXJhbmQgIzAsIHNlZSBpZiB3ZSBjYW4gZm9sZCB0aGUgaW5zdHJ1Y3Rpb24gaW50byB0aGUKKy8vLyBQSEkgKHdoaWNoIGlzIG9ubHkgcG9zc2libGUgaWYgYWxsIG9wZXJhbmRzIHRvIHRoZSBQSEkgYXJlIGNvbnN0YW50cykuCisvLy8KKy8vLyBJZiBBbGxvd0FnZ3Jlc3NpdmUgaXMgdHJ1ZSwgRm9sZE9wSW50b1BoaSB3aWxsIGFsbG93IGNlcnRhaW4gdHJhbnNmb3JtcworLy8vIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgdW5wcm9maXRhYmxlIGJlY2F1c2UgdGhleSBzdHJvbmdseSBlbmNvdXJhZ2UganVtcAorLy8vIHRocmVhZGluZy4KK0luc3RydWN0aW9uICpJbnN0Q29tYmluZXI6OkZvbGRPcEludG9QaGkoSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dBZ2dyZXNzaXZlKSB7CisgIEFsbG93QWdncmVzc2l2ZSA9IGZhbHNlOworICBQSElOb2RlICpQTiA9IGNhc3Q8UEhJTm9kZT4oSS5nZXRPcGVyYW5kKDApKTsKKyAgdW5zaWduZWQgTnVtUEhJVmFsdWVzID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7CisgIGlmIChOdW1QSElWYWx1ZXMgPT0gMCB8fAorICAgICAgLy8gV2Ugbm9ybWFsbHkgb25seSB0cmFuc2Zvcm0gcGhpcyB3aXRoIGEgc2luZ2xlIHVzZSwgdW5sZXNzIHdlJ3JlIHRyeWluZworICAgICAgLy8gaGFyZCB0byBtYWtlIGp1bXAgdGhyZWFkaW5nIGhhcHBlbi4KKyAgICAgICghUE4tPmhhc09uZVVzZSgpICYmICFBbGxvd0FnZ3Jlc3NpdmUpKQorICAgIHJldHVybiAwOworICAKKyAgCisgIC8vIENoZWNrIHRvIHNlZSBpZiBhbGwgb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBQSEkgYXJlIHNpbXBsZSBjb25zdGFudHMKKyAgLy8gKGNvbnN0YW50aW50L2NvbnN0YW50ZnAvdW5kZWYpLiAgSWYgdGhlcmUgaXMgb25lIG5vbi1jb25zdGFudCB2YWx1ZSwKKyAgLy8gcmVtZW1iZXIgdGhlIEJCIGl0IGlzIGluLiAgSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBvciBpZiAqaXQqIGlzIGEgUEhJLAorICAvLyBiYWlsIG91dC4gIFdlIGRvbid0IGRvIGFyYml0cmFyeSBjb25zdGFudCBleHByZXNzaW9ucyBoZXJlIGJlY2F1c2UgbW92aW5nCisgIC8vIHRoZWlyIGNvbXB1dGF0aW9uIGNhbiBiZSBleHBlbnNpdmUgd2l0aG91dCBhIGNvc3QgbW9kZWwuCisgIEJhc2ljQmxvY2sgKk5vbkNvbnN0QkIgPSAwOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVBISVZhbHVlczsgKytpKQorICAgIGlmICghaXNhPENvbnN0YW50PihQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKSkgfHwKKyAgICAgICAgaXNhPENvbnN0YW50RXhwcj4oUE4tPmdldEluY29taW5nVmFsdWUoaSkpKSB7CisgICAgICBpZiAoTm9uQ29uc3RCQikgcmV0dXJuIDA7ICAvLyBNb3JlIHRoYW4gb25lIG5vbi1jb25zdCB2YWx1ZS4KKyAgICAgIGlmIChpc2E8UEhJTm9kZT4oUE4tPmdldEluY29taW5nVmFsdWUoaSkpKSByZXR1cm4gMDsgIC8vIEl0c2VsZiBhIHBoaS4KKyAgICAgIE5vbkNvbnN0QkIgPSBQTi0+Z2V0SW5jb21pbmdCbG9jayhpKTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIGluY29taW5nIG5vbi1jb25zdGFudCB2YWx1ZSBpcyBpbiBJJ3MgYmxvY2ssIHdlIGhhdmUgYW4gaW5maW5pdGUKKyAgICAgIC8vIGxvb3AuCisgICAgICBpZiAoTm9uQ29uc3RCQiA9PSBJLmdldFBhcmVudCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgIAorICAvLyBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBub24tY29uc3RhbnQgdmFsdWUsIHdlIGNhbiBpbnNlcnQgYSBjb3B5IG9mIHRoZQorICAvLyBvcGVyYXRpb24gaW4gdGhhdCBibG9jay4gIEhvd2V2ZXIsIGlmIHRoaXMgaXMgYSBjcml0aWNhbCBlZGdlLCB3ZSB3b3VsZCBiZQorICAvLyBpbnNlcnRpbmcgdGhlIGNvbXB1dGF0aW9uIG9uZSBzb21lIG90aGVyIHBhdGhzIChlLmcuIGluc2lkZSBhIGxvb3ApLiAgT25seQorICAvLyBkbyB0aGlzIGlmIHRoZSBwcmVkIGJsb2NrIGlzIHVuY29uZGl0aW9uYWxseSBicmFuY2hpbmcgaW50byB0aGUgcGhpIGJsb2NrLgorICBpZiAoTm9uQ29uc3RCQiAhPSAwICYmICFBbGxvd0FnZ3Jlc3NpdmUpIHsKKyAgICBCcmFuY2hJbnN0ICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KE5vbkNvbnN0QkItPmdldFRlcm1pbmF0b3IoKSk7CisgICAgaWYgKCFCSSB8fCAhQkktPmlzVW5jb25kaXRpb25hbCgpKSByZXR1cm4gMDsKKyAgfQorCisgIC8vIE9rYXksIHdlIGNhbiBkbyB0aGUgdHJhbnNmb3JtYXRpb246IGNyZWF0ZSB0aGUgbmV3IFBISSBub2RlLgorICBQSElOb2RlICpOZXdQTiA9IFBISU5vZGU6OkNyZWF0ZShJLmdldFR5cGUoKSk7CisgIE5ld1BOLT5yZXNlcnZlT3BlcmFuZFNwYWNlKFBOLT5nZXROdW1PcGVyYW5kcygpLzIpOworICBJbnNlcnROZXdJbnN0QmVmb3JlKE5ld1BOLCAqUE4pOworICBOZXdQTi0+dGFrZU5hbWUoUE4pOworCisgIC8vIE5leHQsIGFkZCBhbGwgb2YgdGhlIG9wZXJhbmRzIHRvIHRoZSBQSEkuCisgIGlmIChTZWxlY3RJbnN0ICpTSSA9IGR5bl9jYXN0PFNlbGVjdEluc3Q+KCZJKSkgeworICAgIC8vIFdlIG9ubHkgY3VycmVudGx5IHRyeSB0byBmb2xkIHRoZSBjb25kaXRpb24gb2YgYSBzZWxlY3Qgd2hlbiBpdCBpcyBhIHBoaSwKKyAgICAvLyBub3QgdGhlIHRydWUvZmFsc2UgdmFsdWVzLgorICAgIFZhbHVlICpUcnVlViA9IFNJLT5nZXRUcnVlVmFsdWUoKTsKKyAgICBWYWx1ZSAqRmFsc2VWID0gU0ktPmdldEZhbHNlVmFsdWUoKTsKKyAgICBCYXNpY0Jsb2NrICpQaGlUcmFuc0JCID0gUE4tPmdldFBhcmVudCgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUEhJVmFsdWVzOyArK2kpIHsKKyAgICAgIEJhc2ljQmxvY2sgKlRoaXNCQiA9IFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpOworICAgICAgVmFsdWUgKlRydWVWSW5QcmVkID0gVHJ1ZVYtPkRvUEhJVHJhbnNsYXRpb24oUGhpVHJhbnNCQiwgVGhpc0JCKTsKKyAgICAgIFZhbHVlICpGYWxzZVZJblByZWQgPSBGYWxzZVYtPkRvUEhJVHJhbnNsYXRpb24oUGhpVHJhbnNCQiwgVGhpc0JCKTsKKyAgICAgIFZhbHVlICpJblYgPSAwOworICAgICAgaWYgKENvbnN0YW50ICpJbkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUE4tPmdldEluY29taW5nVmFsdWUoaSkpKSB7CisgICAgICAgIEluViA9IEluQy0+aXNOdWxsVmFsdWUoKSA/IEZhbHNlVkluUHJlZCA6IFRydWVWSW5QcmVkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpID09IE5vbkNvbnN0QkIpOworICAgICAgICBJblYgPSBTZWxlY3RJbnN0OjpDcmVhdGUoUE4tPmdldEluY29taW5nVmFsdWUoaSksIFRydWVWSW5QcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2VWSW5QcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uQ29uc3RCQi0+Z2V0VGVybWluYXRvcigpKTsKKyAgICAgICAgV29ya2xpc3QuQWRkKGNhc3Q8SW5zdHJ1Y3Rpb24+KEluVikpOworICAgICAgfQorICAgICAgTmV3UE4tPmFkZEluY29taW5nKEluViwgVGhpc0JCKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoSS5nZXROdW1PcGVyYW5kcygpID09IDIpIHsKKyAgICBDb25zdGFudCAqQyA9IGNhc3Q8Q29uc3RhbnQ+KEkuZ2V0T3BlcmFuZCgxKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1QSElWYWx1ZXM7ICsraSkgeworICAgICAgVmFsdWUgKkluViA9IDA7CisgICAgICBpZiAoQ29uc3RhbnQgKkluQyA9IGR5bl9jYXN0PENvbnN0YW50PihQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKSkpIHsKKyAgICAgICAgaWYgKENtcEluc3QgKkNJID0gZHluX2Nhc3Q8Q21wSW5zdD4oJkkpKQorICAgICAgICAgIEluViA9IENvbnN0YW50RXhwcjo6Z2V0Q29tcGFyZShDSS0+Z2V0UHJlZGljYXRlKCksIEluQywgQyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBJblYgPSBDb25zdGFudEV4cHI6OmdldChJLmdldE9wY29kZSgpLCBJbkMsIEMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpID09IE5vbkNvbnN0QkIpOworICAgICAgICBpZiAoQmluYXJ5T3BlcmF0b3IgKkJPID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KCZJKSkgCisgICAgICAgICAgSW5WID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShCTy0+Z2V0T3Bjb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKSwgQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbkNvbnN0QkItPmdldFRlcm1pbmF0b3IoKSk7CisgICAgICAgIGVsc2UgaWYgKENtcEluc3QgKkNJID0gZHluX2Nhc3Q8Q21wSW5zdD4oJkkpKQorICAgICAgICAgIEluViA9IENtcEluc3Q6OkNyZWF0ZShDSS0+Z2V0T3Bjb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJLT5nZXRQcmVkaWNhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE4tPmdldEluY29taW5nVmFsdWUoaSksIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbkNvbnN0QkItPmdldFRlcm1pbmF0b3IoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGJpbm9wISIpOworICAgICAgICAKKyAgICAgICAgV29ya2xpc3QuQWRkKGNhc3Q8SW5zdHJ1Y3Rpb24+KEluVikpOworICAgICAgfQorICAgICAgTmV3UE4tPmFkZEluY29taW5nKEluViwgUE4tPmdldEluY29taW5nQmxvY2soaSkpOworICAgIH0KKyAgfSBlbHNlIHsgCisgICAgQ2FzdEluc3QgKkNJID0gY2FzdDxDYXN0SW5zdD4oJkkpOworICAgIGNvbnN0IFR5cGUgKlJldFR5ID0gQ0ktPmdldFR5cGUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVBISVZhbHVlczsgKytpKSB7CisgICAgICBWYWx1ZSAqSW5WOworICAgICAgaWYgKENvbnN0YW50ICpJbkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUE4tPmdldEluY29taW5nVmFsdWUoaSkpKSB7CisgICAgICAgIEluViA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChDSS0+Z2V0T3Bjb2RlKCksIEluQywgUmV0VHkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpID09IE5vbkNvbnN0QkIpOworICAgICAgICBJblYgPSBDYXN0SW5zdDo6Q3JlYXRlKENJLT5nZXRPcGNvZGUoKSwgUE4tPmdldEluY29taW5nVmFsdWUoaSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbkNvbnN0QkItPmdldFRlcm1pbmF0b3IoKSk7CisgICAgICAgIFdvcmtsaXN0LkFkZChjYXN0PEluc3RydWN0aW9uPihJblYpKTsKKyAgICAgIH0KKyAgICAgIE5ld1BOLT5hZGRJbmNvbWluZyhJblYsIFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoSSwgTmV3UE4pOworfQorCisvLy8gRmluZEVsZW1lbnRBdE9mZnNldCAtIEdpdmVuIGEgdHlwZSBhbmQgYSBjb25zdGFudCBvZmZzZXQsIGRldGVybWluZSB3aGV0aGVyCisvLy8gb3Igbm90IHRoZXJlIGlzIGEgc2VxdWVuY2Ugb2YgR0VQIGluZGljZXMgaW50byB0aGUgdHlwZSB0aGF0IHdpbGwgbGFuZCB1cyBhdAorLy8vIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiAgSWYgc28sIGZpbGwgdGhlbSBpbnRvIE5ld0luZGljZXMgYW5kIHJldHVybiB0aGUKKy8vLyByZXN1bHRhbnQgZWxlbWVudCB0eXBlLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCitjb25zdCBUeXBlICpJbnN0Q29tYmluZXI6OkZpbmRFbGVtZW50QXRPZmZzZXQoY29uc3QgVHlwZSAqVHksIGludDY0X3QgT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxWYWx1ZSo+ICZOZXdJbmRpY2VzKSB7CisgIGlmICghVEQpIHJldHVybiAwOworICBpZiAoIVR5LT5pc1NpemVkKCkpIHJldHVybiAwOworICAKKyAgLy8gU3RhcnQgd2l0aCB0aGUgaW5kZXggb3ZlciB0aGUgb3V0ZXIgdHlwZS4gIE5vdGUgdGhhdCB0aGUgdHlwZSBzaXplCisgIC8vIG1pZ2h0IGJlIHplcm8gKGV2ZW4gaWYgdGhlIG9mZnNldCBpc24ndCB6ZXJvKSBpZiB0aGUgaW5kZXhlZCB0eXBlCisgIC8vIGlzIHNvbWV0aGluZyBsaWtlIFswIHgge2ludCwgaW50fV0KKyAgY29uc3QgVHlwZSAqSW50UHRyVHkgPSBURC0+Z2V0SW50UHRyVHlwZShUeS0+Z2V0Q29udGV4dCgpKTsKKyAgaW50NjRfdCBGaXJzdElkeCA9IDA7CisgIGlmIChpbnQ2NF90IFR5U2l6ZSA9IFRELT5nZXRUeXBlQWxsb2NTaXplKFR5KSkgeworICAgIEZpcnN0SWR4ID0gT2Zmc2V0L1R5U2l6ZTsKKyAgICBPZmZzZXQgLT0gRmlyc3RJZHgqVHlTaXplOworICAgIAorICAgIC8vIEhhbmRsZSBob3N0cyB3aGVyZSAlIHJldHVybnMgbmVnYXRpdmUgaW5zdGVhZCBvZiB2YWx1ZXMgWzAuLlR5U2l6ZSkuCisgICAgaWYgKE9mZnNldCA8IDApIHsKKyAgICAgIC0tRmlyc3RJZHg7CisgICAgICBPZmZzZXQgKz0gVHlTaXplOworICAgICAgYXNzZXJ0KE9mZnNldCA+PSAwKTsKKyAgICB9CisgICAgYXNzZXJ0KCh1aW50NjRfdClPZmZzZXQgPCAodWludDY0X3QpVHlTaXplICYmICJPdXQgb2YgcmFuZ2Ugb2Zmc2V0Iik7CisgIH0KKyAgCisgIE5ld0luZGljZXMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoSW50UHRyVHksIEZpcnN0SWR4KSk7CisgICAgCisgIC8vIEluZGV4IGludG8gdGhlIHR5cGVzLiAgSWYgd2UgZmFpbCwgc2V0IE9yaWdCYXNlIHRvIG51bGwuCisgIHdoaWxlIChPZmZzZXQpIHsKKyAgICAvLyBJbmRleGluZyBpbnRvIHRhaWwgcGFkZGluZyBiZXR3ZWVuIHN0cnVjdC9hcnJheSBlbGVtZW50cy4KKyAgICBpZiAodWludDY0X3QoT2Zmc2V0KjgpID49IFRELT5nZXRUeXBlU2l6ZUluQml0cyhUeSkpCisgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oVHkpKSB7CisgICAgICBjb25zdCBTdHJ1Y3RMYXlvdXQgKlNMID0gVEQtPmdldFN0cnVjdExheW91dChTVHkpOworICAgICAgYXNzZXJ0KE9mZnNldCA8IChpbnQ2NF90KVNMLT5nZXRTaXplSW5CeXRlcygpICYmCisgICAgICAgICAgICAgIk9mZnNldCBtdXN0IHN0YXkgd2l0aGluIHRoZSBpbmRleGVkIHR5cGUiKTsKKyAgICAgIAorICAgICAgdW5zaWduZWQgRWx0ID0gU0wtPmdldEVsZW1lbnRDb250YWluaW5nT2Zmc2V0KE9mZnNldCk7CisgICAgICBOZXdJbmRpY2VzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVHktPmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsdCkpOworICAgICAgCisgICAgICBPZmZzZXQgLT0gU0wtPmdldEVsZW1lbnRPZmZzZXQoRWx0KTsKKyAgICAgIFR5ID0gU1R5LT5nZXRFbGVtZW50VHlwZShFbHQpOworICAgIH0gZWxzZSBpZiAoY29uc3QgQXJyYXlUeXBlICpBVCA9IGR5bl9jYXN0PEFycmF5VHlwZT4oVHkpKSB7CisgICAgICB1aW50NjRfdCBFbHRTaXplID0gVEQtPmdldFR5cGVBbGxvY1NpemUoQVQtPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgYXNzZXJ0KEVsdFNpemUgJiYgIkNhbm5vdCBpbmRleCBpbnRvIGEgemVyby1zaXplZCBhcnJheSIpOworICAgICAgTmV3SW5kaWNlcy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChJbnRQdHJUeSxPZmZzZXQvRWx0U2l6ZSkpOworICAgICAgT2Zmc2V0ICU9IEVsdFNpemU7CisgICAgICBUeSA9IEFULT5nZXRFbGVtZW50VHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UsIHdlIGNhbid0IGluZGV4IGludG8gdGhlIG1pZGRsZSBvZiB0aGlzIGF0b21pYyB0eXBlLCBiYWlsLgorICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIAorICByZXR1cm4gVHk7Cit9CisKKworCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdEdldEVsZW1lbnRQdHJJbnN0KEdldEVsZW1lbnRQdHJJbnN0ICZHRVApIHsKKyAgU21hbGxWZWN0b3I8VmFsdWUqLCA4PiBPcHMoR0VQLm9wX2JlZ2luKCksIEdFUC5vcF9lbmQoKSk7CisKKyAgaWYgKFZhbHVlICpWID0gU2ltcGxpZnlHRVBJbnN0KCZPcHNbMF0sIE9wcy5zaXplKCksIFREKSkKKyAgICByZXR1cm4gUmVwbGFjZUluc3RVc2VzV2l0aChHRVAsIFYpOworCisgIFZhbHVlICpQdHJPcCA9IEdFUC5nZXRPcGVyYW5kKDApOworCisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oR0VQLmdldE9wZXJhbmQoMCkpKQorICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEdFUCwgVW5kZWZWYWx1ZTo6Z2V0KEdFUC5nZXRUeXBlKCkpKTsKKworICAvLyBFbGltaW5hdGUgdW5uZWVkZWQgY2FzdHMgZm9yIGluZGljZXMuCisgIGlmIChURCkgeworICAgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICAgIHVuc2lnbmVkIFB0clNpemUgPSBURC0+Z2V0UG9pbnRlclNpemVJbkJpdHMoKTsKKyAgICAKKyAgICBnZXBfdHlwZV9pdGVyYXRvciBHVEkgPSBnZXBfdHlwZV9iZWdpbihHRVApOworICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgSSA9IEdFUC5vcF9iZWdpbigpICsgMSwgRSA9IEdFUC5vcF9lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJLCArK0dUSSkgeworICAgICAgaWYgKCFpc2E8U2VxdWVudGlhbFR5cGU+KCpHVEkpKSBjb250aW51ZTsKKyAgICAgIAorICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIGEgd2lkZXIgaW5kZXggdGhhbiBuZWVkZWQgZm9yIHRoaXMgcGxhdGZvcm0sIHNocmluayBpdAorICAgICAgLy8gdG8gd2hhdCB3ZSBuZWVkLiAgSWYgbmFycm93ZXIsIHNpZ24tZXh0ZW5kIGl0IHRvIHdoYXQgd2UgbmVlZC4gIFRoaXMKKyAgICAgIC8vIGV4cGxpY2l0IGNhc3QgY2FuIG1ha2Ugc3Vic2VxdWVudCBvcHRpbWl6YXRpb25zIG1vcmUgb2J2aW91cy4KKyAgICAgIHVuc2lnbmVkIE9wQml0cyA9IGNhc3Q8SW50ZWdlclR5cGU+KCgqSSktPmdldFR5cGUoKSktPmdldEJpdFdpZHRoKCk7CisgICAgICBpZiAoT3BCaXRzID09IFB0clNpemUpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICAqSSA9IEJ1aWxkZXItPkNyZWF0ZUludENhc3QoKkksIFRELT5nZXRJbnRQdHJUeXBlKEdFUC5nZXRDb250ZXh0KCkpLHRydWUpOworICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgfQorICAgIGlmIChNYWRlQ2hhbmdlKSByZXR1cm4gJkdFUDsKKyAgfQorCisgIC8vIENvbWJpbmUgSW5kaWNlcyAtIElmIHRoZSBzb3VyY2UgcG9pbnRlciB0byB0aGlzIGdldGVsZW1lbnRwdHIgaW5zdHJ1Y3Rpb24KKyAgLy8gaXMgYSBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9uLCBjb21iaW5lIHRoZSBpbmRpY2VzIG9mIHRoZSB0d28KKyAgLy8gZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbnMgaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbi4KKyAgLy8KKyAgaWYgKEdFUE9wZXJhdG9yICpTcmMgPSBkeW5fY2FzdDxHRVBPcGVyYXRvcj4oUHRyT3ApKSB7CisgICAgLy8gTm90ZSB0aGF0IGlmIG91ciBzb3VyY2UgaXMgYSBnZXAgY2hhaW4gaXRzZWxmIHRoYXQgd2Ugd2FpdCBmb3IgdGhhdAorICAgIC8vIGNoYWluIHRvIGJlIHJlc29sdmVkIGJlZm9yZSB3ZSBwZXJmb3JtIHRoaXMgdHJhbnNmb3JtYXRpb24uICBUaGlzCisgICAgLy8gYXZvaWRzIHVzIGNyZWF0aW5nIGEgVE9OIG9mIGNvZGUgaW4gc29tZSBjYXNlcy4KKyAgICAvLworICAgIGlmIChHZXRFbGVtZW50UHRySW5zdCAqU3JjR0VQID0KKyAgICAgICAgICBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oU3JjLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgIGlmIChTcmNHRVAtPmdldE51bU9wZXJhbmRzKCkgPT0gMikKKyAgICAgICAgcmV0dXJuIDA7ICAgLy8gV2FpdCB1bnRpbCBvdXIgc291cmNlIGlzIGZvbGRlZCB0byBjb21wbGV0aW9uLgorCisgICAgU21hbGxWZWN0b3I8VmFsdWUqLCA4PiBJbmRpY2VzOworCisgICAgLy8gRmluZCBvdXQgd2hldGhlciB0aGUgbGFzdCBpbmRleCBpbiB0aGUgc291cmNlIEdFUCBpcyBhIHNlcXVlbnRpYWwgaWR4LgorICAgIGJvb2wgRW5kc1dpdGhTZXF1ZW50aWFsID0gZmFsc2U7CisgICAgZm9yIChnZXBfdHlwZV9pdGVyYXRvciBJID0gZ2VwX3R5cGVfYmVnaW4oKlNyYyksIEUgPSBnZXBfdHlwZV9lbmQoKlNyYyk7CisgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIEVuZHNXaXRoU2VxdWVudGlhbCA9ICEoKkkpLT5pc1N0cnVjdFR5KCk7CisKKyAgICAvLyBDYW4gd2UgY29tYmluZSB0aGUgdHdvIHBvaW50ZXIgYXJpdGhtZXRpY3Mgb2Zmc2V0cz8KKyAgICBpZiAoRW5kc1dpdGhTZXF1ZW50aWFsKSB7CisgICAgICAvLyBSZXBsYWNlOiBnZXAgKGdlcCAlUCwgbG9uZyBCKSwgbG9uZyBBLCAuLi4KKyAgICAgIC8vIFdpdGg6ICAgIFQgPSBsb25nIEErQjsgZ2VwICVQLCBULCAuLi4KKyAgICAgIC8vCisgICAgICBWYWx1ZSAqU3VtOworICAgICAgVmFsdWUgKlNPMSA9IFNyYy0+Z2V0T3BlcmFuZChTcmMtPmdldE51bU9wZXJhbmRzKCktMSk7CisgICAgICBWYWx1ZSAqR08xID0gR0VQLmdldE9wZXJhbmQoMSk7CisgICAgICBpZiAoU08xID09IENvbnN0YW50OjpnZXROdWxsVmFsdWUoU08xLT5nZXRUeXBlKCkpKSB7CisgICAgICAgIFN1bSA9IEdPMTsKKyAgICAgIH0gZWxzZSBpZiAoR08xID09IENvbnN0YW50OjpnZXROdWxsVmFsdWUoR08xLT5nZXRUeXBlKCkpKSB7CisgICAgICAgIFN1bSA9IFNPMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHRoZXkgYXJlbid0IHRoZSBzYW1lIHR5cGUsIHRoZW4gdGhlIGlucHV0IGhhc24ndCBiZWVuIHByb2Nlc3NlZAorICAgICAgICAvLyBieSB0aGUgbG9vcCBhYm92ZSB5ZXQgKHdoaWNoIGNhbm9uaWNhbGl6ZXMgc2VxdWVudGlhbCBpbmRleCB0eXBlcyB0bworICAgICAgICAvLyBpbnRwdHJfdCkuICBKdXN0IGF2b2lkIHRyYW5zZm9ybWluZyB0aGlzIHVudGlsIHRoZSBpbnB1dCBoYXMgYmVlbgorICAgICAgICAvLyBub3JtYWxpemVkLgorICAgICAgICBpZiAoU08xLT5nZXRUeXBlKCkgIT0gR08xLT5nZXRUeXBlKCkpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIFN1bSA9IEJ1aWxkZXItPkNyZWF0ZUFkZChTTzEsIEdPMSk7CisgICAgICB9CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgR0VQIGluIHBsYWNlIGlmIHBvc3NpYmxlLgorICAgICAgaWYgKFNyYy0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAyKSB7CisgICAgICAgIEdFUC5zZXRPcGVyYW5kKDAsIFNyYy0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICAgIEdFUC5zZXRPcGVyYW5kKDEsIFN1bSk7CisgICAgICAgIHJldHVybiAmR0VQOworICAgICAgfQorICAgICAgSW5kaWNlcy5hcHBlbmQoU3JjLT5vcF9iZWdpbigpKzEsIFNyYy0+b3BfZW5kKCktMSk7CisgICAgICBJbmRpY2VzLnB1c2hfYmFjayhTdW0pOworICAgICAgSW5kaWNlcy5hcHBlbmQoR0VQLm9wX2JlZ2luKCkrMiwgR0VQLm9wX2VuZCgpKTsKKyAgICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudD4oKkdFUC5pZHhfYmVnaW4oKSkgJiYKKyAgICAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnQ+KCpHRVAuaWR4X2JlZ2luKCkpLT5pc051bGxWYWx1ZSgpICYmCisgICAgICAgICAgICAgICBTcmMtPmdldE51bU9wZXJhbmRzKCkgIT0gMSkgeworICAgICAgLy8gT3RoZXJ3aXNlIHdlIGNhbiBkbyB0aGUgZm9sZCBpZiB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIEdFUCBpcyBhIHplcm8KKyAgICAgIEluZGljZXMuYXBwZW5kKFNyYy0+b3BfYmVnaW4oKSsxLCBTcmMtPm9wX2VuZCgpKTsKKyAgICAgIEluZGljZXMuYXBwZW5kKEdFUC5pZHhfYmVnaW4oKSsxLCBHRVAuaWR4X2VuZCgpKTsKKyAgICB9CisKKyAgICBpZiAoIUluZGljZXMuZW1wdHkoKSkKKyAgICAgIHJldHVybiAoR0VQLmlzSW5Cb3VuZHMoKSAmJiBTcmMtPmlzSW5Cb3VuZHMoKSkgPworICAgICAgICBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMoU3JjLT5nZXRPcGVyYW5kKDApLCBJbmRpY2VzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpY2VzLmVuZCgpKSA6CisgICAgICAgIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoU3JjLT5nZXRPcGVyYW5kKDApLCBJbmRpY2VzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcy5lbmQoKSk7CisgIH0KKyAgCisgIC8vIEhhbmRsZSBnZXAoYml0Y2FzdCB4KSBhbmQgZ2VwKGdlcCB4LCAwLCAwLCAwKS4KKyAgVmFsdWUgKlN0cmlwcGVkUHRyID0gUHRyT3AtPnN0cmlwUG9pbnRlckNhc3RzKCk7CisgIGlmIChTdHJpcHBlZFB0ciAhPSBQdHJPcCkgeworICAgIGNvbnN0IFBvaW50ZXJUeXBlICpTdHJpcHBlZFB0clR5ID1jYXN0PFBvaW50ZXJUeXBlPihTdHJpcHBlZFB0ci0+Z2V0VHlwZSgpKTsKKworICAgIGJvb2wgSGFzWmVyb1BvaW50ZXJJbmRleCA9IGZhbHNlOworICAgIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihHRVAuZ2V0T3BlcmFuZCgxKSkpCisgICAgICBIYXNaZXJvUG9pbnRlckluZGV4ID0gQy0+aXNaZXJvKCk7CisgICAgCisgICAgLy8gVHJhbnNmb3JtOiBHRVAgKGJpdGNhc3QgWzEwIHggaThdKiBYIHRvIFswIHggaThdKiksIGkzMiAwLCAuLi4KKyAgICAvLyBpbnRvICAgICA6IEdFUCBbMTAgeCBpOF0qIFgsIGkzMiAwLCAuLi4KKyAgICAvLworICAgIC8vIExpa2V3aXNlLCB0cmFuc2Zvcm06IEdFUCAoYml0Y2FzdCBpOCogWCB0byBbMCB4IGk4XSopLCBpMzIgMCwgLi4uCisgICAgLy8gICAgICAgICAgIGludG8gICAgIDogR0VQIGk4KiBYLCAuLi4KKyAgICAvLyAKKyAgICAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZSBwcm9ncmFtIGRlY2xhcmVzIGFuIGFycmF5IGV4dGVybiBsaWtlICJpbnQgWFtdOyIKKyAgICBpZiAoSGFzWmVyb1BvaW50ZXJJbmRleCkgeworICAgICAgY29uc3QgUG9pbnRlclR5cGUgKkNQVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihQdHJPcC0+Z2V0VHlwZSgpKTsKKyAgICAgIGlmIChjb25zdCBBcnJheVR5cGUgKkNBVHkgPQorICAgICAgICAgIGR5bl9jYXN0PEFycmF5VHlwZT4oQ1BUeS0+Z2V0RWxlbWVudFR5cGUoKSkpIHsKKyAgICAgICAgLy8gR0VQIChiaXRjYXN0IGk4KiBYIHRvIFswIHggaThdKiksIGkzMiAwLCAuLi4gPworICAgICAgICBpZiAoQ0FUeS0+Z2V0RWxlbWVudFR5cGUoKSA9PSBTdHJpcHBlZFB0clR5LT5nZXRFbGVtZW50VHlwZSgpKSB7CisgICAgICAgICAgLy8gLT4gR0VQIGk4KiBYLCAuLi4KKyAgICAgICAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IElkeChHRVAuaWR4X2JlZ2luKCkrMSwgR0VQLmlkeF9lbmQoKSk7CisgICAgICAgICAgR2V0RWxlbWVudFB0ckluc3QgKlJlcyA9CisgICAgICAgICAgICBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKFN0cmlwcGVkUHRyLCBJZHguYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4LmVuZCgpKTsKKyAgICAgICAgICBSZXMtPnNldElzSW5Cb3VuZHMoR0VQLmlzSW5Cb3VuZHMoKSk7CisgICAgICAgICAgcmV0dXJuIFJlczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNvbnN0IEFycmF5VHlwZSAqWEFUeSA9CisgICAgICAgICAgICAgIGR5bl9jYXN0PEFycmF5VHlwZT4oU3RyaXBwZWRQdHJUeS0+Z2V0RWxlbWVudFR5cGUoKSkpeworICAgICAgICAgIC8vIEdFUCAoYml0Y2FzdCBbMTAgeCBpOF0qIFggdG8gWzAgeCBpOF0qKSwgaTMyIDAsIC4uLiA/CisgICAgICAgICAgaWYgKENBVHktPmdldEVsZW1lbnRUeXBlKCkgPT0gWEFUeS0+Z2V0RWxlbWVudFR5cGUoKSkgeworICAgICAgICAgICAgLy8gLT4gR0VQIFsxMCB4IGk4XSogWCwgaTMyIDAsIC4uLgorICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Uga25vdyB0aGF0IHRoZSBjYXN0IHNvdXJjZSB0eXBlIGlzIGEgcG9pbnRlcgorICAgICAgICAgICAgLy8gdG8gYW4gYXJyYXkgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgZGVzdGluYXRpb24gcG9pbnRlcgorICAgICAgICAgICAgLy8gYXJyYXkuICBCZWNhdXNlIHRoZSBhcnJheSB0eXBlIGlzIG5ldmVyIHN0ZXBwZWQgb3ZlciAodGhlcmUKKyAgICAgICAgICAgIC8vIGlzIGEgbGVhZGluZyB6ZXJvKSB3ZSBjYW4gZm9sZCB0aGUgY2FzdCBpbnRvIHRoaXMgR0VQLgorICAgICAgICAgICAgR0VQLnNldE9wZXJhbmQoMCwgU3RyaXBwZWRQdHIpOworICAgICAgICAgICAgcmV0dXJuICZHRVA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChHRVAuZ2V0TnVtT3BlcmFuZHMoKSA9PSAyKSB7CisgICAgICAvLyBUcmFuc2Zvcm0gdGhpbmdzIGxpa2U6CisgICAgICAvLyAldCA9IGdldGVsZW1lbnRwdHIgaTMyKiBiaXRjYXN0IChbMiB4IGkzMl0qICVzdHIgdG8gaTMyKiksIGkzMiAlVgorICAgICAgLy8gaW50bzogICV0MSA9IGdldGVsZW1lbnRwdHIgWzIgeCBpMzJdKiAlc3RyLCBpMzIgMCwgaTMyICVWOyBiaXRjYXN0CisgICAgICBjb25zdCBUeXBlICpTcmNFbFR5ID0gU3RyaXBwZWRQdHJUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgIGNvbnN0IFR5cGUgKlJlc0VsVHk9Y2FzdDxQb2ludGVyVHlwZT4oUHRyT3AtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICBpZiAoVEQgJiYgU3JjRWxUeS0+aXNBcnJheVR5KCkgJiYKKyAgICAgICAgICBURC0+Z2V0VHlwZUFsbG9jU2l6ZShjYXN0PEFycmF5VHlwZT4oU3JjRWxUeSktPmdldEVsZW1lbnRUeXBlKCkpID09CisgICAgICAgICAgVEQtPmdldFR5cGVBbGxvY1NpemUoUmVzRWxUeSkpIHsKKyAgICAgICAgVmFsdWUgKklkeFsyXTsKKyAgICAgICAgSWR4WzBdID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KEdFUC5nZXRDb250ZXh0KCkpKTsKKyAgICAgICAgSWR4WzFdID0gR0VQLmdldE9wZXJhbmQoMSk7CisgICAgICAgIFZhbHVlICpOZXdHRVAgPSBHRVAuaXNJbkJvdW5kcygpID8KKyAgICAgICAgICBCdWlsZGVyLT5DcmVhdGVJbkJvdW5kc0dFUChTdHJpcHBlZFB0ciwgSWR4LCBJZHggKyAyKSA6CisgICAgICAgICAgQnVpbGRlci0+Q3JlYXRlR0VQKFN0cmlwcGVkUHRyLCBJZHgsIElkeCArIDIpOworICAgICAgICAvLyBWIGFuZCBHRVAgYXJlIGJvdGggcG9pbnRlciB0eXBlcyAtLT4gQml0Q2FzdAorICAgICAgICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KE5ld0dFUCwgR0VQLmdldFR5cGUoKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFRyYW5zZm9ybSB0aGluZ3MgbGlrZToKKyAgICAgIC8vIGdldGVsZW1lbnRwdHIgaTgqIGJpdGNhc3QgKFsxMDAgeCBkb3VibGVdKiBYIHRvIGk4KiksIGkzMiAldG1wCisgICAgICAvLyAgICh3aGVyZSB0bXAgPSA4KnRtcDIpIGludG86CisgICAgICAvLyBnZXRlbGVtZW50cHRyIFsxMDAgeCBkb3VibGVdKiAlYXJyLCBpMzIgMCwgaTMyICV0bXAyOyBiaXRjYXN0CisgICAgICAKKyAgICAgIGlmIChURCAmJiBTcmNFbFR5LT5pc0FycmF5VHkoKSAmJiBSZXNFbFR5LT5pc0ludGVnZXJUeSg4KSkgeworICAgICAgICB1aW50NjRfdCBBcnJheUVsdFNpemUgPQorICAgICAgICAgICAgVEQtPmdldFR5cGVBbGxvY1NpemUoY2FzdDxBcnJheVR5cGU+KFNyY0VsVHkpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiAidG1wIiBpcyBhIHNjYWxlIGJ5IGEgbXVsdGlwbGUgb2YgQXJyYXlFbHRTaXplLiAgV2UKKyAgICAgICAgLy8gYWxsb3cgZWl0aGVyIGEgbXVsLCBzaGlmdCwgb3IgY29uc3RhbnQgaGVyZS4KKyAgICAgICAgVmFsdWUgKk5ld0lkeCA9IDA7CisgICAgICAgIENvbnN0YW50SW50ICpTY2FsZSA9IDA7CisgICAgICAgIGlmIChBcnJheUVsdFNpemUgPT0gMSkgeworICAgICAgICAgIE5ld0lkeCA9IEdFUC5nZXRPcGVyYW5kKDEpOworICAgICAgICAgIFNjYWxlID0gQ29uc3RhbnRJbnQ6OmdldChjYXN0PEludGVnZXJUeXBlPihOZXdJZHgtPmdldFR5cGUoKSksIDEpOworICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihHRVAuZ2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICBOZXdJZHggPSBDb25zdGFudEludDo6Z2V0KENJLT5nZXRUeXBlKCksIDEpOworICAgICAgICAgIFNjYWxlID0gQ0k7CisgICAgICAgIH0gZWxzZSBpZiAoSW5zdHJ1Y3Rpb24gKkluc3QgPWR5bl9jYXN0PEluc3RydWN0aW9uPihHRVAuZ2V0T3BlcmFuZCgxKSkpeworICAgICAgICAgIGlmIChJbnN0LT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U2hsICYmCisgICAgICAgICAgICAgIGlzYTxDb25zdGFudEludD4oSW5zdC0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICAgIENvbnN0YW50SW50ICpTaEFtdCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEluc3QtPmdldE9wZXJhbmQoMSkpOworICAgICAgICAgICAgdWludDMyX3QgU2hBbXRWYWwgPSBTaEFtdC0+Z2V0TGltaXRlZFZhbHVlKDY0KTsKKyAgICAgICAgICAgIFNjYWxlID0gQ29uc3RhbnRJbnQ6OmdldChjYXN0PEludGVnZXJUeXBlPihJbnN0LT5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFVTEwgPDwgU2hBbXRWYWwpOworICAgICAgICAgICAgTmV3SWR4ID0gSW5zdC0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKEluc3QtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpNdWwgJiYKKyAgICAgICAgICAgICAgICAgICAgIGlzYTxDb25zdGFudEludD4oSW5zdC0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgICAgIFNjYWxlID0gY2FzdDxDb25zdGFudEludD4oSW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAgICAgICBOZXdJZHggPSBJbnN0LT5nZXRPcGVyYW5kKDApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIGluZGV4IHdpbGwgYmUgdG8gZXhhY3RseSB0aGUgcmlnaHQgb2Zmc2V0IHdpdGggdGhlIHNjYWxlIHRha2VuCisgICAgICAgIC8vIG91dCwgcGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24uIE5vdGUsIHdlIGRvbid0IGtub3cgd2hldGhlciBTY2FsZSBpcworICAgICAgICAvLyBzaWduZWQgb3Igbm90LiBXZSdsbCB1c2UgdW5zaWduZWQgdmVyc2lvbiBvZiBkaXZpc2lvbi9tb2R1bG8KKyAgICAgICAgLy8gb3BlcmF0aW9uIGFmdGVyIG1ha2luZyBzdXJlIFNjYWxlIGRvZXNuJ3QgaGF2ZSB0aGUgc2lnbiBiaXQgc2V0LgorICAgICAgICBpZiAoQXJyYXlFbHRTaXplICYmIFNjYWxlICYmIFNjYWxlLT5nZXRTRXh0VmFsdWUoKSA+PSAwTEwgJiYKKyAgICAgICAgICAgIFNjYWxlLT5nZXRaRXh0VmFsdWUoKSAlIEFycmF5RWx0U2l6ZSA9PSAwKSB7CisgICAgICAgICAgU2NhbGUgPSBDb25zdGFudEludDo6Z2V0KFNjYWxlLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlLT5nZXRaRXh0VmFsdWUoKSAvIEFycmF5RWx0U2l6ZSk7CisgICAgICAgICAgaWYgKFNjYWxlLT5nZXRaRXh0VmFsdWUoKSAhPSAxKSB7CisgICAgICAgICAgICBDb25zdGFudCAqQyA9IENvbnN0YW50RXhwcjo6Z2V0SW50ZWdlckNhc3QoU2NhbGUsIE5ld0lkeC0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qWkV4dCovKTsKKyAgICAgICAgICAgIE5ld0lkeCA9IEJ1aWxkZXItPkNyZWF0ZU11bChOZXdJZHgsIEMpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IEdFUCBpbnN0cnVjdGlvbi4KKyAgICAgICAgICBWYWx1ZSAqSWR4WzJdOworICAgICAgICAgIElkeFswXSA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0SW50MzJUeShHRVAuZ2V0Q29udGV4dCgpKSk7CisgICAgICAgICAgSWR4WzFdID0gTmV3SWR4OworICAgICAgICAgIFZhbHVlICpOZXdHRVAgPSBHRVAuaXNJbkJvdW5kcygpID8KKyAgICAgICAgICAgIEJ1aWxkZXItPkNyZWF0ZUluQm91bmRzR0VQKFN0cmlwcGVkUHRyLCBJZHgsIElkeCArIDIpOgorICAgICAgICAgICAgQnVpbGRlci0+Q3JlYXRlR0VQKFN0cmlwcGVkUHRyLCBJZHgsIElkeCArIDIpOworICAgICAgICAgIC8vIFRoZSBOZXdHRVAgbXVzdCBiZSBwb2ludGVyIHR5cGVkLCBzbyBtdXN0IHRoZSBvbGQgb25lIC0+IEJpdENhc3QKKyAgICAgICAgICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KE5ld0dFUCwgR0VQLmdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vLyBTZWUgaWYgd2UgY2FuIHNpbXBsaWZ5OgorICAvLy8gICBYID0gYml0Y2FzdCBBKiB0byBCKgorICAvLy8gICBZID0gZ2VwIFgsIDwuLi5jb25zdGFudCBpbmRpY2VzLi4uPgorICAvLy8gaW50byBhIGdlcCBvZiB0aGUgb3JpZ2luYWwgc3RydWN0LiAgVGhpcyBpcyBpbXBvcnRhbnQgZm9yIFNST0EgYW5kIGFsaWFzCisgIC8vLyBhbmFseXNpcyBvZiB1bmlvbnMuICBJZiAiQSIgaXMgYWxzbyBhIGJpdGNhc3QsIHdhaXQgZm9yIEEvWCB0byBiZSBtZXJnZWQuCisgIGlmIChCaXRDYXN0SW5zdCAqQkNJID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KFB0ck9wKSkgeworICAgIGlmIChURCAmJgorICAgICAgICAhaXNhPEJpdENhc3RJbnN0PihCQ0ktPmdldE9wZXJhbmQoMCkpICYmIEdFUC5oYXNBbGxDb25zdGFudEluZGljZXMoKSkgeworICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBtdWNoIHRoZSBHRVAgbW92ZXMgdGhlIHBvaW50ZXIuICBXZSBhcmUgZ3VhcmFudGVlZCB0byBnZXQKKyAgICAgIC8vIGEgY29uc3RhbnQgYmFjayBmcm9tIEVtaXRHRVBPZmZzZXQuCisgICAgICBDb25zdGFudEludCAqT2Zmc2V0ViA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEVtaXRHRVBPZmZzZXQoJkdFUCkpOworICAgICAgaW50NjRfdCBPZmZzZXQgPSBPZmZzZXRWLT5nZXRTRXh0VmFsdWUoKTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhpcyBHRVAgaW5zdHJ1Y3Rpb24gZG9lc24ndCBtb3ZlIHRoZSBwb2ludGVyLCBqdXN0IHJlcGxhY2UgdGhlIEdFUAorICAgICAgLy8gd2l0aCBhIGJpdGNhc3Qgb2YgdGhlIHJlYWwgaW5wdXQgdG8gdGhlIGRlc3QgdHlwZS4KKyAgICAgIGlmIChPZmZzZXQgPT0gMCkgeworICAgICAgICAvLyBJZiB0aGUgYml0Y2FzdCBpcyBvZiBhbiBhbGxvY2F0aW9uLCBhbmQgdGhlIGFsbG9jYXRpb24gd2lsbCBiZQorICAgICAgICAvLyBjb252ZXJ0ZWQgdG8gbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGNhc3QsIGRvbid0IHRvdWNoIHRoaXMuCisgICAgICAgIGlmIChpc2E8QWxsb2NhSW5zdD4oQkNJLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgICAgIC8vIFNlZSBpZiB0aGUgYml0Y2FzdCBzaW1wbGlmaWVzLCBpZiBzbywgZG9uJ3QgbnVrZSB0aGlzIEdFUCB5ZXQuCisgICAgICAgICAgaWYgKEluc3RydWN0aW9uICpJID0gdmlzaXRCaXRDYXN0KCpCQ0kpKSB7CisgICAgICAgICAgICBpZiAoSSAhPSBCQ0kpIHsKKyAgICAgICAgICAgICAgSS0+dGFrZU5hbWUoQkNJKTsKKyAgICAgICAgICAgICAgQkNJLT5nZXRQYXJlbnQoKS0+Z2V0SW5zdExpc3QoKS5pbnNlcnQoQkNJLCBJKTsKKyAgICAgICAgICAgICAgUmVwbGFjZUluc3RVc2VzV2l0aCgqQkNJLCBJKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAmR0VQOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KEJDSS0+Z2V0T3BlcmFuZCgwKSwgR0VQLmdldFR5cGUoKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIG9mZnNldCBpcyBub24temVybywgd2UgbmVlZCB0byBmaW5kIG91dCBpZiB0aGVyZSBpcyBhCisgICAgICAvLyBmaWVsZCBhdCBPZmZzZXQgaW4gJ0EncyB0eXBlLiAgSWYgc28sIHdlIGNhbiBwdWxsIHRoZSBjYXN0IHRocm91Z2ggdGhlCisgICAgICAvLyBHRVAuCisgICAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IE5ld0luZGljZXM7CisgICAgICBjb25zdCBUeXBlICpJblR5ID0KKyAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oQkNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgaWYgKEZpbmRFbGVtZW50QXRPZmZzZXQoSW5UeSwgT2Zmc2V0LCBOZXdJbmRpY2VzKSkgeworICAgICAgICBWYWx1ZSAqTkdFUCA9IEdFUC5pc0luQm91bmRzKCkgPworICAgICAgICAgIEJ1aWxkZXItPkNyZWF0ZUluQm91bmRzR0VQKEJDSS0+Z2V0T3BlcmFuZCgwKSwgTmV3SW5kaWNlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0luZGljZXMuZW5kKCkpIDoKKyAgICAgICAgICBCdWlsZGVyLT5DcmVhdGVHRVAoQkNJLT5nZXRPcGVyYW5kKDApLCBOZXdJbmRpY2VzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0luZGljZXMuZW5kKCkpOworICAgICAgICAKKyAgICAgICAgaWYgKE5HRVAtPmdldFR5cGUoKSA9PSBHRVAuZ2V0VHlwZSgpKQorICAgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEdFUCwgTkdFUCk7CisgICAgICAgIE5HRVAtPnRha2VOYW1lKCZHRVApOworICAgICAgICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KE5HRVAsIEdFUC5nZXRUeXBlKCkpOworICAgICAgfQorICAgIH0KKyAgfSAgICAKKyAgICAKKyAgcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgYm9vbCBJc09ubHlOdWxsQ29tcGFyZWRBbmRGcmVlZChjb25zdCBWYWx1ZSAmVikgeworICBmb3IgKFZhbHVlOjpjb25zdF91c2VfaXRlcmF0b3IgVUkgPSBWLnVzZV9iZWdpbigpLCBVRSA9IFYudXNlX2VuZCgpOworICAgICAgIFVJICE9IFVFOyArK1VJKSB7CisgICAgY29uc3QgVXNlciAqVSA9ICpVSTsKKyAgICBpZiAoY29uc3QgSUNtcEluc3QgKklDSSA9IGR5bl9jYXN0PElDbXBJbnN0PihVKSkKKyAgICAgIGlmIChJQ0ktPmlzRXF1YWxpdHkoKSAmJiBpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oSUNJLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICAgY29udGludWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitJbnN0cnVjdGlvbiAqSW5zdENvbWJpbmVyOjp2aXNpdEJyYW5jaEluc3QoQnJhbmNoSW5zdCAmQkkpIHsKKyAgLy8gQ2hhbmdlIGJyIChub3QgWCksIGxhYmVsIFRydWUsIGxhYmVsIEZhbHNlIHRvOiBiciBYLCBsYWJlbCBGYWxzZSwgVHJ1ZQorICBWYWx1ZSAqWCA9IDA7CisgIEJhc2ljQmxvY2sgKlRydWVEZXN0OworICBCYXNpY0Jsb2NrICpGYWxzZURlc3Q7CisgIGlmIChtYXRjaCgmQkksIG1fQnIobV9Ob3QobV9WYWx1ZShYKSksIFRydWVEZXN0LCBGYWxzZURlc3QpKSAmJgorICAgICAgIWlzYTxDb25zdGFudD4oWCkpIHsKKyAgICAvLyBTd2FwIERlc3RpbmF0aW9ucyBhbmQgY29uZGl0aW9uLi4uCisgICAgQkkuc2V0Q29uZGl0aW9uKFgpOworICAgIEJJLnNldFN1Y2Nlc3NvcigwLCBGYWxzZURlc3QpOworICAgIEJJLnNldFN1Y2Nlc3NvcigxLCBUcnVlRGVzdCk7CisgICAgcmV0dXJuICZCSTsKKyAgfQorCisgIC8vIENhbm5vbmljYWxpemUgZmNtcF9vbmUgLT4gZmNtcF9vZXEKKyAgRkNtcEluc3Q6OlByZWRpY2F0ZSBGUHJlZDsgVmFsdWUgKlk7CisgIGlmIChtYXRjaCgmQkksIG1fQnIobV9GQ21wKEZQcmVkLCBtX1ZhbHVlKFgpLCBtX1ZhbHVlKFkpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVEZXN0LCBGYWxzZURlc3QpKSAmJgorICAgICAgQkkuZ2V0Q29uZGl0aW9uKCktPmhhc09uZVVzZSgpKQorICAgIGlmIChGUHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9PTkUgfHwgRlByZWQgPT0gRkNtcEluc3Q6OkZDTVBfT0xFIHx8CisgICAgICAgIEZQcmVkID09IEZDbXBJbnN0OjpGQ01QX09HRSkgeworICAgICAgRkNtcEluc3QgKkNvbmQgPSBjYXN0PEZDbXBJbnN0PihCSS5nZXRDb25kaXRpb24oKSk7CisgICAgICBDb25kLT5zZXRQcmVkaWNhdGUoRkNtcEluc3Q6OmdldEludmVyc2VQcmVkaWNhdGUoRlByZWQpKTsKKyAgICAgIAorICAgICAgLy8gU3dhcCBEZXN0aW5hdGlvbnMgYW5kIGNvbmRpdGlvbi4KKyAgICAgIEJJLnNldFN1Y2Nlc3NvcigwLCBGYWxzZURlc3QpOworICAgICAgQkkuc2V0U3VjY2Vzc29yKDEsIFRydWVEZXN0KTsKKyAgICAgIFdvcmtsaXN0LkFkZChDb25kKTsKKyAgICAgIHJldHVybiAmQkk7CisgICAgfQorCisgIC8vIENhbm5vbmljYWxpemUgaWNtcF9uZSAtPiBpY21wX2VxCisgIElDbXBJbnN0OjpQcmVkaWNhdGUgSVByZWQ7CisgIGlmIChtYXRjaCgmQkksIG1fQnIobV9JQ21wKElQcmVkLCBtX1ZhbHVlKFgpLCBtX1ZhbHVlKFkpKSwKKyAgICAgICAgICAgICAgICAgICAgICBUcnVlRGVzdCwgRmFsc2VEZXN0KSkgJiYKKyAgICAgIEJJLmdldENvbmRpdGlvbigpLT5oYXNPbmVVc2UoKSkKKyAgICBpZiAoSVByZWQgPT0gSUNtcEluc3Q6OklDTVBfTkUgIHx8IElQcmVkID09IElDbXBJbnN0OjpJQ01QX1VMRSB8fAorICAgICAgICBJUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TTEUgfHwgSVByZWQgPT0gSUNtcEluc3Q6OklDTVBfVUdFIHx8CisgICAgICAgIElQcmVkID09IElDbXBJbnN0OjpJQ01QX1NHRSkgeworICAgICAgSUNtcEluc3QgKkNvbmQgPSBjYXN0PElDbXBJbnN0PihCSS5nZXRDb25kaXRpb24oKSk7CisgICAgICBDb25kLT5zZXRQcmVkaWNhdGUoSUNtcEluc3Q6OmdldEludmVyc2VQcmVkaWNhdGUoSVByZWQpKTsKKyAgICAgIC8vIFN3YXAgRGVzdGluYXRpb25zIGFuZCBjb25kaXRpb24uCisgICAgICBCSS5zZXRTdWNjZXNzb3IoMCwgRmFsc2VEZXN0KTsKKyAgICAgIEJJLnNldFN1Y2Nlc3NvcigxLCBUcnVlRGVzdCk7CisgICAgICBXb3JrbGlzdC5BZGQoQ29uZCk7CisgICAgICByZXR1cm4gJkJJOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRTd2l0Y2hJbnN0KFN3aXRjaEluc3QgJlNJKSB7CisgIFZhbHVlICpDb25kID0gU0kuZ2V0Q29uZGl0aW9uKCk7CisgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihDb25kKSkgeworICAgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWRkKQorICAgICAgaWYgKENvbnN0YW50SW50ICpBZGRSSFMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSS0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgLy8gY2hhbmdlICdzd2l0Y2ggKFgrNCkgY2FzZSAxOicgaW50byAnc3dpdGNoIChYKSBjYXNlIC0zJworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAyLCBlID0gU0kuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyBpICs9IDIpCisgICAgICAgICAgU0kuc2V0T3BlcmFuZChpLAorICAgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0U3ViKGNhc3Q8Q29uc3RhbnQ+KFNJLmdldE9wZXJhbmQoaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUkhTKSk7CisgICAgICAgIFNJLnNldE9wZXJhbmQoMCwgSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICAgIFdvcmtsaXN0LkFkZChJKTsKKyAgICAgICAgcmV0dXJuICZTSTsKKyAgICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworSW5zdHJ1Y3Rpb24gKkluc3RDb21iaW5lcjo6dmlzaXRFeHRyYWN0VmFsdWVJbnN0KEV4dHJhY3RWYWx1ZUluc3QgJkVWKSB7CisgIFZhbHVlICpBZ2cgPSBFVi5nZXRBZ2dyZWdhdGVPcGVyYW5kKCk7CisKKyAgaWYgKCFFVi5oYXNJbmRpY2VzKCkpCisgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoRVYsIEFnZyk7CisKKyAgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEFnZykpIHsKKyAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KEMpKQorICAgICAgcmV0dXJuIFJlcGxhY2VJbnN0VXNlc1dpdGgoRVYsIFVuZGVmVmFsdWU6OmdldChFVi5nZXRUeXBlKCkpKTsKKyAgICAgIAorICAgIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihDKSkKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEVWLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVWLmdldFR5cGUoKSkpOworCisgICAgaWYgKGlzYTxDb25zdGFudEFycmF5PihDKSB8fCBpc2E8Q29uc3RhbnRTdHJ1Y3Q+KEMpKSB7CisgICAgICAvLyBFeHRyYWN0IHRoZSBlbGVtZW50IGluZGV4ZWQgYnkgdGhlIGZpcnN0IGluZGV4IG91dCBvZiB0aGUgY29uc3RhbnQKKyAgICAgIFZhbHVlICpWID0gQy0+Z2V0T3BlcmFuZCgqRVYuaWR4X2JlZ2luKCkpOworICAgICAgaWYgKEVWLmdldE51bUluZGljZXMoKSA+IDEpCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHJlbWFpbmluZyBpbmRpY2VzIG91dCBvZiB0aGUgY29uc3RhbnQgaW5kZXhlZCBieSB0aGUKKyAgICAgICAgLy8gZmlyc3QgaW5kZXgKKyAgICAgICAgcmV0dXJuIEV4dHJhY3RWYWx1ZUluc3Q6OkNyZWF0ZShWLCBFVi5pZHhfYmVnaW4oKSArIDEsIEVWLmlkeF9lbmQoKSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEVWLCBWKTsKKyAgICB9CisgICAgcmV0dXJuIDA7IC8vIENhbid0IGhhbmRsZSBvdGhlciBjb25zdGFudHMKKyAgfSAKKyAgaWYgKEluc2VydFZhbHVlSW5zdCAqSVYgPSBkeW5fY2FzdDxJbnNlcnRWYWx1ZUluc3Q+KEFnZykpIHsKKyAgICAvLyBXZSdyZSBleHRyYWN0aW5nIGZyb20gYW4gaW5zZXJ0dmFsdWUgaW5zdHJ1Y3Rpb24sIGNvbXBhcmUgdGhlIGluZGljZXMKKyAgICBjb25zdCB1bnNpZ25lZCAqZXh0aSwgKmV4dGUsICppbnNpLCAqaW5zZTsKKyAgICBmb3IgKGV4dGkgPSBFVi5pZHhfYmVnaW4oKSwgaW5zaSA9IElWLT5pZHhfYmVnaW4oKSwKKyAgICAgICAgIGV4dGUgPSBFVi5pZHhfZW5kKCksIGluc2UgPSBJVi0+aWR4X2VuZCgpOworICAgICAgICAgZXh0aSAhPSBleHRlICYmIGluc2kgIT0gaW5zZTsKKyAgICAgICAgICsrZXh0aSwgKytpbnNpKSB7CisgICAgICBpZiAoKmluc2kgIT0gKmV4dGkpCisgICAgICAgIC8vIFRoZSBpbnNlcnQgYW5kIGV4dHJhY3QgYm90aCByZWZlcmVuY2UgZGlzdGluY3RseSBkaWZmZXJlbnQgZWxlbWVudHMuCisgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIGV4dHJhY3QgaXMgbm90IGluZmx1ZW5jZWQgYnkgdGhlIGluc2VydCwgYW5kIHdlIGNhbgorICAgICAgICAvLyByZXBsYWNlIHRoZSBhZ2dyZWdhdGUgb3BlcmFuZCBvZiB0aGUgZXh0cmFjdCB3aXRoIHRoZSBhZ2dyZWdhdGUKKyAgICAgICAgLy8gb3BlcmFuZCBvZiB0aGUgaW5zZXJ0LiBpLmUuLCByZXBsYWNlCisgICAgICAgIC8vICVJID0gaW5zZXJ0dmFsdWUgeyBpMzIsIHsgaTMyIH0gfSAlQSwgeyBpMzIgfSB7IGkzMiA0MiB9LCAxCisgICAgICAgIC8vICVFID0gZXh0cmFjdHZhbHVlIHsgaTMyLCB7IGkzMiB9IH0gJUksIDAKKyAgICAgICAgLy8gd2l0aAorICAgICAgICAvLyAlRSA9IGV4dHJhY3R2YWx1ZSB7IGkzMiwgeyBpMzIgfSB9ICVBLCAwCisgICAgICAgIHJldHVybiBFeHRyYWN0VmFsdWVJbnN0OjpDcmVhdGUoSVYtPmdldEFnZ3JlZ2F0ZU9wZXJhbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVi5pZHhfYmVnaW4oKSwgRVYuaWR4X2VuZCgpKTsKKyAgICB9CisgICAgaWYgKGV4dGkgPT0gZXh0ZSAmJiBpbnNpID09IGluc2UpCisgICAgICAvLyBCb3RoIGl0ZXJhdG9ycyBhcmUgYXQgdGhlIGVuZDogSW5kZXggbGlzdHMgYXJlIGlkZW50aWNhbC4gUmVwbGFjZQorICAgICAgLy8gJUIgPSBpbnNlcnR2YWx1ZSB7IGkzMiwgeyBpMzIgfSB9ICVBLCBpMzIgNDIsIDEsIDAKKyAgICAgIC8vICVDID0gZXh0cmFjdHZhbHVlIHsgaTMyLCB7IGkzMiB9IH0gJUIsIDEsIDAKKyAgICAgIC8vIHdpdGggImkzMiA0MiIKKyAgICAgIHJldHVybiBSZXBsYWNlSW5zdFVzZXNXaXRoKEVWLCBJVi0+Z2V0SW5zZXJ0ZWRWYWx1ZU9wZXJhbmQoKSk7CisgICAgaWYgKGV4dGkgPT0gZXh0ZSkgeworICAgICAgLy8gVGhlIGV4dHJhY3QgbGlzdCBpcyBhIHByZWZpeCBvZiB0aGUgaW5zZXJ0IGxpc3QuIGkuZS4gcmVwbGFjZQorICAgICAgLy8gJUkgPSBpbnNlcnR2YWx1ZSB7IGkzMiwgeyBpMzIgfSB9ICVBLCBpMzIgNDIsIDEsIDAKKyAgICAgIC8vICVFID0gZXh0cmFjdHZhbHVlIHsgaTMyLCB7IGkzMiB9IH0gJUksIDEKKyAgICAgIC8vIHdpdGgKKyAgICAgIC8vICVYID0gZXh0cmFjdHZhbHVlIHsgaTMyLCB7IGkzMiB9IH0gJUEsIDEKKyAgICAgIC8vICVFID0gaW5zZXJ0dmFsdWUgeyBpMzIgfSAlWCwgaTMyIDQyLCAwCisgICAgICAvLyBieSBzd2l0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSBpbnNlcnQgYW5kIGV4dHJhY3QgKHRob3VnaCB0aGUKKyAgICAgIC8vIGluc2VydHZhbHVlIHNob3VsZCBiZSBsZWZ0IGluLCBzaW5jZSBpdCBtYXkgaGF2ZSBvdGhlciB1c2VzKS4KKyAgICAgIFZhbHVlICpOZXdFViA9IEJ1aWxkZXItPkNyZWF0ZUV4dHJhY3RWYWx1ZShJVi0+Z2V0QWdncmVnYXRlT3BlcmFuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWLmlkeF9iZWdpbigpLCBFVi5pZHhfZW5kKCkpOworICAgICAgcmV0dXJuIEluc2VydFZhbHVlSW5zdDo6Q3JlYXRlKE5ld0VWLCBJVi0+Z2V0SW5zZXJ0ZWRWYWx1ZU9wZXJhbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpLCBpbnNlKTsKKyAgICB9CisgICAgaWYgKGluc2kgPT0gaW5zZSkKKyAgICAgIC8vIFRoZSBpbnNlcnQgbGlzdCBpcyBhIHByZWZpeCBvZiB0aGUgZXh0cmFjdCBsaXN0CisgICAgICAvLyBXZSBjYW4gc2ltcGx5IHJlbW92ZSB0aGUgY29tbW9uIGluZGljZXMgZnJvbSB0aGUgZXh0cmFjdCBhbmQgbWFrZSBpdAorICAgICAgLy8gb3BlcmF0ZSBvbiB0aGUgaW5zZXJ0ZWQgdmFsdWUgaW5zdGVhZCBvZiB0aGUgaW5zZXJ0dmFsdWUgcmVzdWx0LgorICAgICAgLy8gaS5lLiwgcmVwbGFjZQorICAgICAgLy8gJUkgPSBpbnNlcnR2YWx1ZSB7IGkzMiwgeyBpMzIgfSB9ICVBLCB7IGkzMiB9IHsgaTMyIDQyIH0sIDEKKyAgICAgIC8vICVFID0gZXh0cmFjdHZhbHVlIHsgaTMyLCB7IGkzMiB9IH0gJUksIDEsIDAKKyAgICAgIC8vIHdpdGgKKyAgICAgIC8vICVFIGV4dHJhY3R2YWx1ZSB7IGkzMiB9IHsgaTMyIDQyIH0sIDAKKyAgICAgIHJldHVybiBFeHRyYWN0VmFsdWVJbnN0OjpDcmVhdGUoSVYtPmdldEluc2VydGVkVmFsdWVPcGVyYW5kKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRpLCBleHRlKTsKKyAgfQorICBpZiAoSW50cmluc2ljSW5zdCAqSUkgPSBkeW5fY2FzdDxJbnRyaW5zaWNJbnN0PihBZ2cpKSB7CisgICAgLy8gV2UncmUgZXh0cmFjdGluZyBmcm9tIGFuIGludHJpbnNpYywgc2VlIGlmIHdlJ3JlIHRoZSBvbmx5IHVzZXIsIHdoaWNoCisgICAgLy8gYWxsb3dzIHVzIHRvIHNpbXBsaWZ5IG11bHRpcGxlIHJlc3VsdCBpbnRyaW5zaWNzIHRvIHNpbXBsZXIgdGhpbmdzIHRoYXQKKyAgICAvLyBqdXN0IGdldCBvbmUgdmFsdWUuCisgICAgaWYgKElJLT5oYXNPbmVVc2UoKSkgeworICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZ3JhYmJpbmcgdGhlIG92ZXJmbG93IGJpdCBvciB0aGUgcmVzdWx0IG9mIGEgJ3dpdGgKKyAgICAgIC8vIG92ZXJmbG93JyBpbnRyaW5zaWMuICBJZiBpdCdzIHRoZSBsYXR0ZXIgd2UgY2FuIHJlbW92ZSB0aGUgaW50cmluc2ljCisgICAgICAvLyBhbmQgcmVwbGFjZSBpdCB3aXRoIGEgdHJhZGl0aW9uYWwgYmluYXJ5IGluc3RydWN0aW9uLgorICAgICAgc3dpdGNoIChJSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6OnVhZGRfd2l0aF9vdmVyZmxvdzoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpzYWRkX3dpdGhfb3ZlcmZsb3c6CisgICAgICAgIGlmICgqRVYuaWR4X2JlZ2luKCkgPT0gMCkgeyAgLy8gTm9ybWFsIHJlc3VsdC4KKyAgICAgICAgICBWYWx1ZSAqTEhTID0gSUktPmdldEFyZ09wZXJhbmQoMCksICpSSFMgPSBJSS0+Z2V0QXJnT3BlcmFuZCgxKTsKKyAgICAgICAgICBJSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChJSS0+Z2V0VHlwZSgpKSk7CisgICAgICAgICAgRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKCpJSSk7CisgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoTEhTLCBSSFMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJbnRyaW5zaWM6OnVzdWJfd2l0aF9vdmVyZmxvdzoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpzc3ViX3dpdGhfb3ZlcmZsb3c6CisgICAgICAgIGlmICgqRVYuaWR4X2JlZ2luKCkgPT0gMCkgeyAgLy8gTm9ybWFsIHJlc3VsdC4KKyAgICAgICAgICBWYWx1ZSAqTEhTID0gSUktPmdldEFyZ09wZXJhbmQoMCksICpSSFMgPSBJSS0+Z2V0QXJnT3BlcmFuZCgxKTsKKyAgICAgICAgICBJSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChJSS0+Z2V0VHlwZSgpKSk7CisgICAgICAgICAgRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKCpJSSk7CisgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIoTEhTLCBSSFMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJbnRyaW5zaWM6OnVtdWxfd2l0aF9vdmVyZmxvdzoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpzbXVsX3dpdGhfb3ZlcmZsb3c6CisgICAgICAgIGlmICgqRVYuaWR4X2JlZ2luKCkgPT0gMCkgeyAgLy8gTm9ybWFsIHJlc3VsdC4KKyAgICAgICAgICBWYWx1ZSAqTEhTID0gSUktPmdldEFyZ09wZXJhbmQoMCksICpSSFMgPSBJSS0+Z2V0QXJnT3BlcmFuZCgxKTsKKyAgICAgICAgICBJSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChJSS0+Z2V0VHlwZSgpKSk7CisgICAgICAgICAgRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKCpJSSk7CisgICAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVNdWwoTEhTLCBSSFMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIENhbid0IHNpbXBsaWZ5IGV4dHJhY3RzIGZyb20gb3RoZXIgdmFsdWVzLiBOb3RlIHRoYXQgbmVzdGVkIGV4dHJhY3RzIGFyZQorICAvLyBhbHJlYWR5IHNpbXBsaWZpZWQgaW1wbGljaXRlbHkgYnkgdGhlIGFib3ZlIChleHRyYWN0ICggZXh0cmFjdCAoaW5zZXJ0KSApCisgIC8vIHdpbGwgYmUgdHJhbnNsYXRlZCBpbnRvIGV4dHJhY3QgKCBpbnNlcnQgKCBleHRyYWN0ICkgKSBmaXJzdCBhbmQgdGhlbiBqdXN0CisgIC8vIHRoZSB2YWx1ZSBpbnNlcnRlZCwgaWYgYXBwcm9wcmlhdGUpLgorICByZXR1cm4gMDsKK30KKworCisKKworLy8vIFRyeVRvU2lua0luc3RydWN0aW9uIC0gVHJ5IHRvIG1vdmUgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBmcm9tIGl0cworLy8vIGN1cnJlbnQgYmxvY2sgaW50byB0aGUgYmVnaW5uaW5nIG9mIERlc3RCbG9jaywgd2hpY2ggY2FuIG9ubHkgaGFwcGVuIGlmIGl0J3MKKy8vLyBzYWZlIHRvIG1vdmUgdGhlIGluc3RydWN0aW9uIHBhc3QgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgYmV0d2VlbiBpdCBhbmQgdGhlCisvLy8gZW5kIG9mIGl0cyBibG9jay4KK3N0YXRpYyBib29sIFRyeVRvU2lua0luc3RydWN0aW9uKEluc3RydWN0aW9uICpJLCBCYXNpY0Jsb2NrICpEZXN0QmxvY2spIHsKKyAgYXNzZXJ0KEktPmhhc09uZVVzZSgpICYmICJJbnZhcmlhbnRzIGRpZG4ndCBob2xkISIpOworCisgIC8vIENhbm5vdCBtb3ZlIGNvbnRyb2wtZmxvdy1pbnZvbHZpbmcsIHZvbGF0aWxlIGxvYWRzLCB2YWFyZywgZXRjLgorICBpZiAoaXNhPFBISU5vZGU+KEkpIHx8IEktPm1heUhhdmVTaWRlRWZmZWN0cygpIHx8IGlzYTxUZXJtaW5hdG9ySW5zdD4oSSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIERvIG5vdCBzaW5rIGFsbG9jYSBpbnN0cnVjdGlvbnMgb3V0IG9mIHRoZSBlbnRyeSBibG9jay4KKyAgaWYgKGlzYTxBbGxvY2FJbnN0PihJKSAmJiBJLT5nZXRQYXJlbnQoKSA9PQorICAgICAgICAmRGVzdEJsb2NrLT5nZXRQYXJlbnQoKS0+Z2V0RW50cnlCbG9jaygpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBXZSBjYW4gb25seSBzaW5rIGxvYWQgaW5zdHJ1Y3Rpb25zIGlmIHRoZXJlIGlzIG5vdGhpbmcgYmV0d2VlbiB0aGUgbG9hZCBhbmQKKyAgLy8gdGhlIGVuZCBvZiBibG9jayB0aGF0IGNvdWxkIGNoYW5nZSB0aGUgdmFsdWUuCisgIGlmIChJLT5tYXlSZWFkRnJvbU1lbW9yeSgpKSB7CisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBTY2FuID0gSSwgRSA9IEktPmdldFBhcmVudCgpLT5lbmQoKTsKKyAgICAgICAgIFNjYW4gIT0gRTsgKytTY2FuKQorICAgICAgaWYgKFNjYW4tPm1heVdyaXRlVG9NZW1vcnkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UG9zID0gRGVzdEJsb2NrLT5nZXRGaXJzdE5vblBISSgpOworCisgIEktPm1vdmVCZWZvcmUoSW5zZXJ0UG9zKTsKKyAgKytOdW1TdW5rSW5zdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vIEFkZFJlYWNoYWJsZUNvZGVUb1dvcmtsaXN0IC0gV2FsayB0aGUgZnVuY3Rpb24gaW4gZGVwdGgtZmlyc3Qgb3JkZXIsIGFkZGluZworLy8vIGFsbCByZWFjaGFibGUgY29kZSB0byB0aGUgd29ya2xpc3QuCisvLy8KKy8vLyBUaGlzIGhhcyBhIGNvdXBsZSBvZiB0cmlja3MgdG8gbWFrZSB0aGUgY29kZSBmYXN0ZXIgYW5kIG1vcmUgcG93ZXJmdWwuICBJbgorLy8vIHBhcnRpY3VsYXIsIHdlIGNvbnN0YW50IGZvbGQgYW5kIERDRSBpbnN0cnVjdGlvbnMgYXMgd2UgZ28sIHRvIGF2b2lkIGFkZGluZworLy8vIHRoZW0gdG8gdGhlIHdvcmtsaXN0ICh0aGlzIHNpZ25pZmljYW50bHkgc3BlZWRzIHVwIGluc3Rjb21iaW5lIG9uIGNvZGUgd2hlcmUKKy8vLyBtYW55IGluc3RydWN0aW9ucyBhcmUgZGVhZCBvciBjb25zdGFudCkuICBBZGRpdGlvbmFsbHksIGlmIHdlIGZpbmQgYSBicmFuY2gKKy8vLyB3aG9zZSBjb25kaXRpb24gaXMgYSBrbm93biBjb25zdGFudCwgd2Ugb25seSB2aXNpdCB0aGUgcmVhY2hhYmxlIHN1Y2Nlc3NvcnMuCisvLy8KK3N0YXRpYyBib29sIEFkZFJlYWNoYWJsZUNvZGVUb1dvcmtsaXN0KEJhc2ljQmxvY2sgKkJCLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sqLCA2ND4gJlZpc2l0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0Q29tYmluZXIgJklDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAqVEQpIHsKKyAgYm9vbCBNYWRlSVJDaGFuZ2UgPSBmYWxzZTsKKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDI1Nj4gV29ya2xpc3Q7CisgIFdvcmtsaXN0LnB1c2hfYmFjayhCQik7CisgIAorICBzdGQ6OnZlY3RvcjxJbnN0cnVjdGlvbio+IEluc3Ryc0Zvckluc3RDb21iaW5lV29ya2xpc3Q7CisgIEluc3Ryc0Zvckluc3RDb21iaW5lV29ya2xpc3QucmVzZXJ2ZSgxMjgpOworCisgIFNtYWxsUHRyU2V0PENvbnN0YW50RXhwciosIDY0PiBGb2xkZWRDb25zdGFudHM7CisgIAorICBkbyB7CisgICAgQkIgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAKKyAgICAvLyBXZSBoYXZlIG5vdyB2aXNpdGVkIHRoaXMgYmxvY2shICBJZiB3ZSd2ZSBhbHJlYWR5IGJlZW4gaGVyZSwgaWdub3JlIGl0LgorICAgIGlmICghVmlzaXRlZC5pbnNlcnQoQkIpKSBjb250aW51ZTsKKworICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7IEJCSSAhPSBFOyApIHsKKyAgICAgIEluc3RydWN0aW9uICpJbnN0ID0gQkJJKys7CisgICAgICAKKyAgICAgIC8vIERDRSBpbnN0cnVjdGlvbiBpZiB0cml2aWFsbHkgZGVhZC4KKyAgICAgIGlmIChpc0luc3RydWN0aW9uVHJpdmlhbGx5RGVhZChJbnN0KSkgeworICAgICAgICArK051bURlYWRJbnN0OworICAgICAgICBERUJVRyhlcnJzKCkgPDwgIklDOiBEQ0U6ICIgPDwgKkluc3QgPDwgJ1xuJyk7CisgICAgICAgIEluc3QtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gQ29uc3RhbnRQcm9wIGluc3RydWN0aW9uIGlmIHRyaXZpYWxseSBjb25zdGFudC4KKyAgICAgIGlmICghSW5zdC0+dXNlX2VtcHR5KCkgJiYgaXNhPENvbnN0YW50PihJbnN0LT5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgaWYgKENvbnN0YW50ICpDID0gQ29uc3RhbnRGb2xkSW5zdHJ1Y3Rpb24oSW5zdCwgVEQpKSB7CisgICAgICAgICAgREVCVUcoZXJycygpIDw8ICJJQzogQ29uc3RGb2xkIHRvOiAiIDw8ICpDIDw8ICIgZnJvbTogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAqSW5zdCA8PCAnXG4nKTsKKyAgICAgICAgICBJbnN0LT5yZXBsYWNlQWxsVXNlc1dpdGgoQyk7CisgICAgICAgICAgKytOdW1Db25zdFByb3A7CisgICAgICAgICAgSW5zdC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKFREKSB7CisgICAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gY29uc3RhbnQgZm9sZCBpdHMgb3BlcmFuZHMuCisgICAgICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgaSA9IEluc3QtPm9wX2JlZ2luKCksIGUgPSBJbnN0LT5vcF9lbmQoKTsKKyAgICAgICAgICAgICBpICE9IGU7ICsraSkgeworICAgICAgICAgIENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KGkpOworICAgICAgICAgIGlmIChDRSA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGZvbGRlZCB0aGlzIGNvbnN0YW50LCBkb24ndCB0cnkgYWdhaW4uCisgICAgICAgICAgaWYgKCFGb2xkZWRDb25zdGFudHMuaW5zZXJ0KENFKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIAorICAgICAgICAgIENvbnN0YW50ICpOZXdDID0gQ29uc3RhbnRGb2xkQ29uc3RhbnRFeHByZXNzaW9uKENFLCBURCk7CisgICAgICAgICAgaWYgKE5ld0MgJiYgTmV3QyAhPSBDRSkgeworICAgICAgICAgICAgKmkgPSBOZXdDOworICAgICAgICAgICAgTWFkZUlSQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgSW5zdHJzRm9ySW5zdENvbWJpbmVXb3JrbGlzdC5wdXNoX2JhY2soSW5zdCk7CisgICAgfQorCisgICAgLy8gUmVjdXJzaXZlbHkgdmlzaXQgc3VjY2Vzc29ycy4gIElmIHRoaXMgaXMgYSBicmFuY2ggb3Igc3dpdGNoIG9uIGEKKyAgICAvLyBjb25zdGFudCwgb25seSB2aXNpdCB0aGUgcmVhY2hhYmxlIHN1Y2Nlc3Nvci4KKyAgICBUZXJtaW5hdG9ySW5zdCAqVEkgPSBCQi0+Z2V0VGVybWluYXRvcigpOworICAgIGlmIChCcmFuY2hJbnN0ICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KFRJKSkgeworICAgICAgaWYgKEJJLT5pc0NvbmRpdGlvbmFsKCkgJiYgaXNhPENvbnN0YW50SW50PihCSS0+Z2V0Q29uZGl0aW9uKCkpKSB7CisgICAgICAgIGJvb2wgQ29uZFZhbCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEJJLT5nZXRDb25kaXRpb24oKSktPmdldFpFeHRWYWx1ZSgpOworICAgICAgICBCYXNpY0Jsb2NrICpSZWFjaGFibGVCQiA9IEJJLT5nZXRTdWNjZXNzb3IoIUNvbmRWYWwpOworICAgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soUmVhY2hhYmxlQkIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFN3aXRjaEluc3QgKlNJID0gZHluX2Nhc3Q8U3dpdGNoSW5zdD4oVEkpKSB7CisgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNvbmQgPSBkeW5fY2FzdDxDb25zdGFudEludD4oU0ktPmdldENvbmRpdGlvbigpKSkgeworICAgICAgICAvLyBTZWUgaWYgdGhpcyBpcyBhbiBleHBsaWNpdCBkZXN0aW5hdGlvbi4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFNJLT5nZXROdW1TdWNjZXNzb3JzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIGlmIChTSS0+Z2V0Q2FzZVZhbHVlKGkpID09IENvbmQpIHsKKyAgICAgICAgICAgIEJhc2ljQmxvY2sgKlJlYWNoYWJsZUJCID0gU0ktPmdldFN1Y2Nlc3NvcihpKTsKKyAgICAgICAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhSZWFjaGFibGVCQik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBPdGhlcndpc2UgaXQgaXMgdGhlIGRlZmF1bHQgZGVzdGluYXRpb24uCisgICAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhTSS0+Z2V0U3VjY2Vzc29yKDApKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUSS0+Z2V0TnVtU3VjY2Vzc29ycygpOyBpICE9IGU7ICsraSkKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhUSS0+Z2V0U3VjY2Vzc29yKGkpKTsKKyAgfSB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpOworICAKKyAgLy8gT25jZSB3ZSd2ZSBmb3VuZCBhbGwgb2YgdGhlIGluc3RydWN0aW9ucyB0byBhZGQgdG8gaW5zdGNvbWJpbmUncyB3b3JrbGlzdCwKKyAgLy8gYWRkIHRoZW0gaW4gcmV2ZXJzZSBvcmRlci4gIFRoaXMgd2F5IGluc3Rjb21iaW5lIHdpbGwgdmlzaXQgZnJvbSB0aGUgdG9wCisgIC8vIG9mIHRoZSBmdW5jdGlvbiBkb3duLiAgVGhpcyBqaXZlcyB3ZWxsIHdpdGggdGhlIHdheSB0aGF0IGl0IGFkZHMgYWxsIHVzZXMKKyAgLy8gb2YgaW5zdHJ1Y3Rpb25zIHRvIHRoZSB3b3JrbGlzdCBhZnRlciBkb2luZyBhIHRyYW5zZm9ybWF0aW9uLCB0aHVzIGF2b2lkaW5nCisgIC8vIHNvbWUgTl4yIGJlaGF2aW9yIGluIHBhdGhvbG9naWNhbCBjYXNlcy4KKyAgSUMuV29ya2xpc3QuQWRkSW5pdGlhbEdyb3VwKCZJbnN0cnNGb3JJbnN0Q29tYmluZVdvcmtsaXN0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJzRm9ySW5zdENvbWJpbmVXb3JrbGlzdC5zaXplKCkpOworICAKKyAgcmV0dXJuIE1hZGVJUkNoYW5nZTsKK30KKworYm9vbCBJbnN0Q29tYmluZXI6OkRvT25lSXRlcmF0aW9uKEZ1bmN0aW9uICZGLCB1bnNpZ25lZCBJdGVyYXRpb24pIHsKKyAgTWFkZUlSQ2hhbmdlID0gZmFsc2U7CisgIAorICBERUJVRyhlcnJzKCkgPDwgIlxuXG5JTlNUQ09NQklORSBJVEVSQVRJT04gIyIgPDwgSXRlcmF0aW9uIDw8ICIgb24gIgorICAgICAgICA8PCBGLmdldE5hbWVTdHIoKSA8PCAiXG4iKTsKKworICB7CisgICAgLy8gRG8gYSBkZXB0aC1maXJzdCB0cmF2ZXJzYWwgb2YgdGhlIGZ1bmN0aW9uLCBwb3B1bGF0ZSB0aGUgd29ya2xpc3Qgd2l0aAorICAgIC8vIHRoZSByZWFjaGFibGUgaW5zdHJ1Y3Rpb25zLiAgSWdub3JlIGJsb2NrcyB0aGF0IGFyZSBub3QgcmVhY2hhYmxlLiAgS2VlcAorICAgIC8vIHRyYWNrIG9mIHdoaWNoIGJsb2NrcyB3ZSB2aXNpdC4KKyAgICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgNjQ+IFZpc2l0ZWQ7CisgICAgTWFkZUlSQ2hhbmdlIHw9IEFkZFJlYWNoYWJsZUNvZGVUb1dvcmtsaXN0KEYuYmVnaW4oKSwgVmlzaXRlZCwgKnRoaXMsIFREKTsKKworICAgIC8vIERvIGEgcXVpY2sgc2NhbiBvdmVyIHRoZSBmdW5jdGlvbi4gIElmIHdlIGZpbmQgYW55IGJsb2NrcyB0aGF0IGFyZQorICAgIC8vIHVucmVhY2hhYmxlLCByZW1vdmUgYW55IGluc3RydWN0aW9ucyBpbnNpZGUgb2YgdGhlbS4gIFRoaXMgcHJldmVudHMKKyAgICAvLyB0aGUgaW5zdGNvbWJpbmUgY29kZSBmcm9tIGhhdmluZyB0byBkZWFsIHdpdGggc29tZSBiYWQgc3BlY2lhbCBjYXNlcy4KKyAgICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCQiA9IEYuYmVnaW4oKSwgRSA9IEYuZW5kKCk7IEJCICE9IEU7ICsrQkIpCisgICAgICBpZiAoIVZpc2l0ZWQuY291bnQoQkIpKSB7CisgICAgICAgIEluc3RydWN0aW9uICpUZXJtID0gQkItPmdldFRlcm1pbmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKFRlcm0gIT0gQkItPmJlZ2luKCkpIHsgICAvLyBSZW1vdmUgaW5zdHJzIGJvdHRvbS11cAorICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBUZXJtOyAtLUk7CisKKyAgICAgICAgICBERUJVRyhlcnJzKCkgPDwgIklDOiBEQ0U6ICIgPDwgKkkgPDwgJ1xuJyk7CisgICAgICAgICAgLy8gQSBkZWJ1ZyBpbnRyaW5zaWMgc2hvdWxkbid0IGZvcmNlIGFub3RoZXIgaXRlcmF0aW9uIGlmIHdlIHdlcmVuJ3QKKyAgICAgICAgICAvLyBnb2luZyB0byBkbyBvbmUgd2l0aG91dCBpdC4KKyAgICAgICAgICBpZiAoIUlTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJKSkgeworICAgICAgICAgICAgKytOdW1EZWFkSW5zdDsKKyAgICAgICAgICAgIE1hZGVJUkNoYW5nZSA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gSWYgSSBpcyBub3Qgdm9pZCB0eXBlIHRoZW4gcmVwbGFjZUFsbFVzZXNXaXRoIHVuZGVmLgorICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIFZhbHVlSGFuZGxlcnMgYW5kIGN1c3RvbSBtZXRhZGF0YSB0byBhZGp1c3QgaXRzZWxmLgorICAgICAgICAgIGlmICghSS0+Z2V0VHlwZSgpLT5pc1ZvaWRUeSgpKQorICAgICAgICAgICAgSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChJLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgICBJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgfQorICB9CisKKyAgd2hpbGUgKCFXb3JrbGlzdC5pc0VtcHR5KCkpIHsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IFdvcmtsaXN0LlJlbW92ZU9uZSgpOworICAgIGlmIChJID09IDApIGNvbnRpbnVlOyAgLy8gc2tpcCBudWxsIHZhbHVlcy4KKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gRENFIHRoZSBpbnN0cnVjdGlvbi4KKyAgICBpZiAoaXNJbnN0cnVjdGlvblRyaXZpYWxseURlYWQoSSkpIHsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAiSUM6IERDRTogIiA8PCAqSSA8PCAnXG4nKTsKKyAgICAgIEVyYXNlSW5zdEZyb21GdW5jdGlvbigqSSk7CisgICAgICArK051bURlYWRJbnN0OworICAgICAgTWFkZUlSQ2hhbmdlID0gdHJ1ZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIEluc3RydWN0aW9uIGlzbid0IGRlYWQsIHNlZSBpZiB3ZSBjYW4gY29uc3RhbnQgcHJvcGFnYXRlIGl0LgorICAgIGlmICghSS0+dXNlX2VtcHR5KCkgJiYgaXNhPENvbnN0YW50PihJLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgIGlmIChDb25zdGFudCAqQyA9IENvbnN0YW50Rm9sZEluc3RydWN0aW9uKEksIFREKSkgeworICAgICAgICBERUJVRyhlcnJzKCkgPDwgIklDOiBDb25zdEZvbGQgdG86ICIgPDwgKkMgPDwgIiBmcm9tOiAiIDw8ICpJIDw8ICdcbicpOworCisgICAgICAgIC8vIEFkZCBvcGVyYW5kcyB0byB0aGUgd29ya2xpc3QuCisgICAgICAgIFJlcGxhY2VJbnN0VXNlc1dpdGgoKkksIEMpOworICAgICAgICArK051bUNvbnN0UHJvcDsKKyAgICAgICAgRXJhc2VJbnN0RnJvbUZ1bmN0aW9uKCpJKTsKKyAgICAgICAgTWFkZUlSQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAvLyBTZWUgaWYgd2UgY2FuIHRyaXZpYWxseSBzaW5rIHRoaXMgaW5zdHJ1Y3Rpb24gdG8gYSBzdWNjZXNzb3IgYmFzaWMgYmxvY2suCisgICAgaWYgKEktPmhhc09uZVVzZSgpKSB7CisgICAgICBCYXNpY0Jsb2NrICpCQiA9IEktPmdldFBhcmVudCgpOworICAgICAgSW5zdHJ1Y3Rpb24gKlVzZXJJbnN0ID0gY2FzdDxJbnN0cnVjdGlvbj4oSS0+dXNlX2JhY2soKSk7CisgICAgICBCYXNpY0Jsb2NrICpVc2VyUGFyZW50OworICAgICAgCisgICAgICAvLyBHZXQgdGhlIGJsb2NrIHRoZSB1c2Ugb2NjdXJzIGluLgorICAgICAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVXNlckluc3QpKQorICAgICAgICBVc2VyUGFyZW50ID0gUE4tPmdldEluY29taW5nQmxvY2soSS0+dXNlX2JlZ2luKCkuZ2V0VXNlKCkpOworICAgICAgZWxzZQorICAgICAgICBVc2VyUGFyZW50ID0gVXNlckluc3QtPmdldFBhcmVudCgpOworICAgICAgCisgICAgICBpZiAoVXNlclBhcmVudCAhPSBCQikgeworICAgICAgICBib29sIFVzZXJJc1N1Y2Nlc3NvciA9IGZhbHNlOworICAgICAgICAvLyBTZWUgaWYgdGhlIHVzZXIgaXMgb25lIG9mIG91ciBzdWNjZXNzb3JzLgorICAgICAgICBmb3IgKHN1Y2NfaXRlcmF0b3IgU0kgPSBzdWNjX2JlZ2luKEJCKSwgRSA9IHN1Y2NfZW5kKEJCKTsgU0kgIT0gRTsgKytTSSkKKyAgICAgICAgICBpZiAoKlNJID09IFVzZXJQYXJlbnQpIHsKKyAgICAgICAgICAgIFVzZXJJc1N1Y2Nlc3NvciA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHVzZXIgaXMgb25lIG9mIG91ciBpbW1lZGlhdGUgc3VjY2Vzc29ycywgYW5kIGlmIHRoYXQgc3VjY2Vzc29yCisgICAgICAgIC8vIG9ubHkgaGFzIHVzIGFzIGEgcHJlZGVjZXNzb3JzICh3ZSdkIGhhdmUgdG8gc3BsaXQgdGhlIGNyaXRpY2FsIGVkZ2UKKyAgICAgICAgLy8gb3RoZXJ3aXNlKSwgd2UgY2FuIGtlZXAgZ29pbmcuCisgICAgICAgIGlmIChVc2VySXNTdWNjZXNzb3IgJiYgVXNlclBhcmVudC0+Z2V0U2luZ2xlUHJlZGVjZXNzb3IoKSkKKyAgICAgICAgICAvLyBPa2F5LCB0aGUgQ0ZHIGlzIHNpbXBsZSBlbm91Z2gsIHRyeSB0byBzaW5rIHRoaXMgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgTWFkZUlSQ2hhbmdlIHw9IFRyeVRvU2lua0luc3RydWN0aW9uKEksIFVzZXJQYXJlbnQpOworICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYW4gaW5zdHJ1Y3Rpb24sIHRyeSBjb21iaW5pbmcgaXQgdG8gc2ltcGxpZnkgaXQuCisgICAgQnVpbGRlci0+U2V0SW5zZXJ0UG9pbnQoSS0+Z2V0UGFyZW50KCksIEkpOworICAgIAorI2lmbmRlZiBOREVCVUcKKyAgICBzdGQ6OnN0cmluZyBPcmlnSTsKKyNlbmRpZgorICAgIERFQlVHKHJhd19zdHJpbmdfb3N0cmVhbSBTUyhPcmlnSSk7IEktPnByaW50KFNTKTsgT3JpZ0kgPSBTUy5zdHIoKTspOworICAgIERFQlVHKGVycnMoKSA8PCAiSUM6IFZpc2l0aW5nOiAiIDw8IE9yaWdJIDw8ICdcbicpOworCisgICAgaWYgKEluc3RydWN0aW9uICpSZXN1bHQgPSB2aXNpdCgqSSkpIHsKKyAgICAgICsrTnVtQ29tYmluZWQ7CisgICAgICAvLyBTaG91bGQgd2UgcmVwbGFjZSB0aGUgb2xkIGluc3RydWN0aW9uIHdpdGggYSBuZXcgb25lPworICAgICAgaWYgKFJlc3VsdCAhPSBJKSB7CisgICAgICAgIERFQlVHKGVycnMoKSA8PCAiSUM6IE9sZCA9ICIgPDwgKkkgPDwgJ1xuJworICAgICAgICAgICAgICAgICAgICAgPDwgIiAgICBOZXcgPSAiIDw8ICpSZXN1bHQgPDwgJ1xuJyk7CisKKyAgICAgICAgLy8gRXZlcnl0aGluZyB1c2VzIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gbm93LgorICAgICAgICBJLT5yZXBsYWNlQWxsVXNlc1dpdGgoUmVzdWx0KTsKKworICAgICAgICAvLyBQdXNoIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gYW5kIGFueSB1c2VycyBvbnRvIHRoZSB3b3JrbGlzdC4KKyAgICAgICAgV29ya2xpc3QuQWRkKFJlc3VsdCk7CisgICAgICAgIFdvcmtsaXN0LkFkZFVzZXJzVG9Xb3JrTGlzdCgqUmVzdWx0KTsKKworICAgICAgICAvLyBNb3ZlIHRoZSBuYW1lIHRvIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gZmlyc3QuCisgICAgICAgIFJlc3VsdC0+dGFrZU5hbWUoSSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24gaW50byB0aGUgYmFzaWMgYmxvY2suLi4KKyAgICAgICAgQmFzaWNCbG9jayAqSW5zdFBhcmVudCA9IEktPmdldFBhcmVudCgpOworICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQb3MgPSBJOworCisgICAgICAgIGlmICghaXNhPFBISU5vZGU+KFJlc3VsdCkpICAgICAgICAvLyBJZiBjb21iaW5pbmcgYSBQSEksIGRvbid0IGluc2VydAorICAgICAgICAgIHdoaWxlIChpc2E8UEhJTm9kZT4oSW5zZXJ0UG9zKSkgLy8gbWlkZGxlIG9mIGEgYmxvY2sgb2YgUEhJcy4KKyAgICAgICAgICAgICsrSW5zZXJ0UG9zOworCisgICAgICAgIEluc3RQYXJlbnQtPmdldEluc3RMaXN0KCkuaW5zZXJ0KEluc2VydFBvcywgUmVzdWx0KTsKKworICAgICAgICBFcmFzZUluc3RGcm9tRnVuY3Rpb24oKkkpOworICAgICAgfSBlbHNlIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIERFQlVHKGVycnMoKSA8PCAiSUM6IE1vZCA9ICIgPDwgT3JpZ0kgPDwgJ1xuJworICAgICAgICAgICAgICAgICAgICAgPDwgIiAgICBOZXcgPSAiIDw8ICpJIDw8ICdcbicpOworI2VuZGlmCisKKyAgICAgICAgLy8gSWYgdGhlIGluc3RydWN0aW9uIHdhcyBtb2RpZmllZCwgaXQncyBwb3NzaWJsZSB0aGF0IGl0IGlzIG5vdyBkZWFkLgorICAgICAgICAvLyBpZiBzbywgcmVtb3ZlIGl0LgorICAgICAgICBpZiAoaXNJbnN0cnVjdGlvblRyaXZpYWxseURlYWQoSSkpIHsKKyAgICAgICAgICBFcmFzZUluc3RGcm9tRnVuY3Rpb24oKkkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFdvcmtsaXN0LkFkZChJKTsKKyAgICAgICAgICBXb3JrbGlzdC5BZGRVc2Vyc1RvV29ya0xpc3QoKkkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBNYWRlSVJDaGFuZ2UgPSB0cnVlOworICAgIH0KKyAgfQorCisgIFdvcmtsaXN0LlphcCgpOworICByZXR1cm4gTWFkZUlSQ2hhbmdlOworfQorCisKK2Jvb2wgSW5zdENvbWJpbmVyOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgIE11c3RQcmVzZXJ2ZUxDU1NBID0gbXVzdFByZXNlcnZlQW5hbHlzaXNJRChMQ1NTQUlEKTsKKyAgVEQgPSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFRhcmdldERhdGE+KCk7CisKKyAgCisgIC8vLyBCdWlsZGVyIC0gVGhpcyBpcyBhbiBJUkJ1aWxkZXIgdGhhdCBhdXRvbWF0aWNhbGx5IGluc2VydHMgbmV3CisgIC8vLyBpbnN0cnVjdGlvbnMgaW50byB0aGUgd29ya2xpc3Qgd2hlbiB0aGV5IGFyZSBjcmVhdGVkLgorICBJUkJ1aWxkZXI8VGFyZ2V0Rm9sZGVyLCBJbnN0Q29tYmluZUlSSW5zZXJ0ZXI+IAorICAgIFRoZUJ1aWxkZXIoRi5nZXRDb250ZXh0KCksIFRhcmdldEZvbGRlcihURCksCisgICAgICAgICAgICAgICBJbnN0Q29tYmluZUlSSW5zZXJ0ZXIoV29ya2xpc3QpKTsKKyAgQnVpbGRlciA9ICZUaGVCdWlsZGVyOworICAKKyAgYm9vbCBFdmVyTWFkZUNoYW5nZSA9IGZhbHNlOworCisgIC8vIEl0ZXJhdGUgd2hpbGUgdGhlcmUgaXMgd29yayB0byBkby4KKyAgdW5zaWduZWQgSXRlcmF0aW9uID0gMDsKKyAgd2hpbGUgKERvT25lSXRlcmF0aW9uKEYsIEl0ZXJhdGlvbisrKSkKKyAgICBFdmVyTWFkZUNoYW5nZSA9IHRydWU7CisgIAorICBCdWlsZGVyID0gMDsKKyAgcmV0dXJuIEV2ZXJNYWRlQ2hhbmdlOworfQorCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBJbnN0Q29tYmluZXIoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL01ha2VmaWxlIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0ODhlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUluc3RDb21iaW5lCitCVUlMRF9BUkNISVZFID0gMQorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4YmY0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDUgQEAKK2FkZF9sbHZtX2xpYnJhcnkoTExWTUluc3RydW1lbnRhdGlvbgorICBFZGdlUHJvZmlsaW5nLmNwcAorICBPcHRpbWFsRWRnZVByb2ZpbGluZy5jcHAKKyAgUHJvZmlsaW5nVXRpbHMuY3BwCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9FZGdlUHJvZmlsaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9FZGdlUHJvZmlsaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdkNzBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0VkZ2VQcm9maWxpbmcuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvLz09PS0gRWRnZVByb2ZpbGluZy5jcHAgLSBJbnNlcnQgY291bnRlcnMgZm9yIGVkZ2UgcHJvZmlsaW5nIC0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaW5zdHJ1bWVudHMgdGhlIHNwZWNpZmllZCBwcm9ncmFtIHdpdGggY291bnRlcnMgZm9yIGVkZ2UgcHJvZmlsaW5nLgorLy8gRWRnZSBwcm9maWxpbmcgY2FuIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24gb2YgdGhlIGhvdCBwYXRocyB0aHJvdWdoIGEKKy8vIHByb2dyYW0sIGFuZCBpcyB1c2VkIGZvciBhIHdpZGUgdmFyaWV0eSBvZiBwcm9ncmFtIHRyYW5zZm9ybWF0aW9ucy4KKy8vCisvLyBOb3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IG5haXZlLiAgV2UgaW5zZXJ0IGEgY291bnRlciBmb3IgKmV2ZXJ5KgorLy8gZWRnZSBpbiB0aGUgcHJvZ3JhbSwgaW5zdGVhZCBvZiB1c2luZyBjb250cm9sIGZsb3cgaW5mb3JtYXRpb24gdG8gcHJ1bmUgdGhlCisvLyBudW1iZXIgb2YgY291bnRlcnMgaW5zZXJ0ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNkZWZpbmUgREVCVUdfVFlQRSAiaW5zZXJ0LWVkZ2UtcHJvZmlsaW5nIgorI2luY2x1ZGUgIlByb2ZpbGluZ1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvQmFzaWNCbG9ja1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgPHNldD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtRWRnZXNJbnNlcnRlZCwgIlRoZSAjIG9mIGVkZ2VzIGluc2VydGVkLiIpOworCituYW1lc3BhY2UgeworICBjbGFzcyBFZGdlUHJvZmlsZXIgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgICAgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pOworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBFZGdlUHJvZmlsZXIoKSA6IE1vZHVsZVBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJFZGdlIFByb2ZpbGVyIjsKKyAgICB9CisgIH07Cit9CisKK2NoYXIgRWRnZVByb2ZpbGVyOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoRWRnZVByb2ZpbGVyLCAiaW5zZXJ0LWVkZ2UtcHJvZmlsaW5nIiwKKyAgICAgICAgICAgICAgICAiSW5zZXJ0IGluc3RydW1lbnRhdGlvbiBmb3IgZWRnZSBwcm9maWxpbmciLCBmYWxzZSwgZmFsc2UpOworCitNb2R1bGVQYXNzICpsbHZtOjpjcmVhdGVFZGdlUHJvZmlsZXJQYXNzKCkgeyByZXR1cm4gbmV3IEVkZ2VQcm9maWxlcigpOyB9CisKK2Jvb2wgRWRnZVByb2ZpbGVyOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgRnVuY3Rpb24gKk1haW4gPSBNLmdldEZ1bmN0aW9uKCJtYWluIik7CisgIGlmIChNYWluID09IDApIHsKKyAgICBlcnJzKCkgPDwgIldBUk5JTkc6IGNhbm5vdCBpbnNlcnQgZWRnZSBwcm9maWxpbmcgaW50byBhIG1vZHVsZSIKKyAgICAgICAgICAgPDwgIiB3aXRoIG5vIG1haW4gZnVuY3Rpb24hXG4iOworICAgIHJldHVybiBmYWxzZTsgIC8vIE5vIG1haW4sIG5vIGluc3RydW1lbnRhdGlvbiEKKyAgfQorCisgIHN0ZDo6c2V0PEJhc2ljQmxvY2sqPiBCbG9ja3NUb0luc3RydW1lbnQ7CisgIHVuc2lnbmVkIE51bUVkZ2VzID0gMDsKKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEYgPSBNLmJlZ2luKCksIEUgPSBNLmVuZCgpOyBGICE9IEU7ICsrRikgeworICAgIGlmIChGLT5pc0RlY2xhcmF0aW9uKCkpIGNvbnRpbnVlOworICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yICgwLGVudHJ5KSBlZGdlLgorICAgICsrTnVtRWRnZXM7CisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpIHsKKyAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggYmxvY2tzIG5lZWQgdG8gYmUgaW5zdHJ1bWVudGVkLiAgV2UgZG9uJ3Qgd2FudCB0bworICAgICAgLy8gaW5zdHJ1bWVudCBibG9ja3MgdGhhdCBhcmUgYWRkZWQgYXMgdGhlIHJlc3VsdCBvZiBicmVha2luZyBjcml0aWNhbAorICAgICAgLy8gZWRnZXMhCisgICAgICBCbG9ja3NUb0luc3RydW1lbnQuaW5zZXJ0KEJCKTsKKyAgICAgIE51bUVkZ2VzICs9IEJCLT5nZXRUZXJtaW5hdG9yKCktPmdldE51bVN1Y2Nlc3NvcnMoKTsKKyAgICB9CisgIH0KKworICBjb25zdCBUeXBlICpBVHkgPSBBcnJheVR5cGU6OmdldChUeXBlOjpnZXRJbnQzMlR5KE0uZ2V0Q29udGV4dCgpKSwgTnVtRWRnZXMpOworICBHbG9iYWxWYXJpYWJsZSAqQ291bnRlcnMgPQorICAgIG5ldyBHbG9iYWxWYXJpYWJsZShNLCBBVHksIGZhbHNlLCBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEFUeSksICJFZGdlUHJvZkNvdW50ZXJzIik7CisgIE51bUVkZ2VzSW5zZXJ0ZWQgPSBOdW1FZGdlczsKKworICAvLyBJbnN0cnVtZW50IGFsbCBvZiB0aGUgZWRnZXMuLi4KKyAgdW5zaWduZWQgaSA9IDA7CisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBGID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgRiAhPSBFOyArK0YpIHsKKyAgICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpKSBjb250aW51ZTsKKyAgICAvLyBDcmVhdGUgY291bnRlciBmb3IgKDAsZW50cnkpIGVkZ2UuCisgICAgSW5jcmVtZW50Q291bnRlckluQmxvY2soJkYtPmdldEVudHJ5QmxvY2soKSwgaSsrLCBDb3VudGVycyk7CisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpCisgICAgICBpZiAoQmxvY2tzVG9JbnN0cnVtZW50LmNvdW50KEJCKSkgeyAgLy8gRG9uJ3QgaW5zdHJ1bWVudCBpbnNlcnRlZCBibG9ja3MKKyAgICAgICAgLy8gT2theSwgd2UgaGF2ZSB0byBhZGQgYSBjb3VudGVyIG9mIGVhY2ggb3V0Z29pbmcgZWRnZS4gIElmIHRoZQorICAgICAgICAvLyBvdXRnb2luZyBlZGdlIGlzIG5vdCBjcml0aWNhbCBkb24ndCBzcGxpdCBpdCwganVzdCBpbnNlcnQgdGhlIGNvdW50ZXIKKyAgICAgICAgLy8gaW4gdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvZiB0aGUgZWRnZS4KKyAgICAgICAgVGVybWluYXRvckluc3QgKlRJID0gQkItPmdldFRlcm1pbmF0b3IoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBzID0gMCwgZSA9IFRJLT5nZXROdW1TdWNjZXNzb3JzKCk7IHMgIT0gZTsgKytzKSB7CisgICAgICAgICAgLy8gSWYgdGhlIGVkZ2UgaXMgY3JpdGljYWwsIHNwbGl0IGl0LgorICAgICAgICAgIFNwbGl0Q3JpdGljYWxFZGdlKFRJLCBzLCB0aGlzKTsKKworICAgICAgICAgIC8vIE9rYXksIHdlIGFyZSBndWFyYW50ZWVkIHRoYXQgdGhlIGVkZ2UgaXMgbm8gbG9uZ2VyIGNyaXRpY2FsLiAgSWYgd2UKKyAgICAgICAgICAvLyBvbmx5IGhhdmUgYSBzaW5nbGUgc3VjY2Vzc29yLCBpbnNlcnQgdGhlIGNvdW50ZXIgaW4gdGhpcyBibG9jaywKKyAgICAgICAgICAvLyBvdGhlcndpc2UgaW5zZXJ0IGl0IGluIHRoZSBzdWNjZXNzb3IgYmxvY2suCisgICAgICAgICAgaWYgKFRJLT5nZXROdW1TdWNjZXNzb3JzKCkgPT0gMSkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IGNvdW50ZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jaworICAgICAgICAgICAgSW5jcmVtZW50Q291bnRlckluQmxvY2soQkIsIGkrKywgQ291bnRlcnMpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgY291bnRlciBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrCisgICAgICAgICAgICBJbmNyZW1lbnRDb3VudGVySW5CbG9jayhUSS0+Z2V0U3VjY2Vzc29yKHMpLCBpKyssIENvdW50ZXJzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIC8vIEFkZCB0aGUgaW5pdGlhbGl6YXRpb24gY2FsbCB0byBtYWluLgorICBJbnNlcnRQcm9maWxpbmdJbml0Q2FsbChNYWluLCAibGx2bV9zdGFydF9lZGdlX3Byb2ZpbGluZyIsIENvdW50ZXJzKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2JjN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUluc3RydW1lbnRhdGlvbgorQlVJTERfQVJDSElWRSA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL01heGltdW1TcGFubmluZ1RyZWUuaCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9NYXhpbXVtU3Bhbm5pbmdUcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5ZGE2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9NYXhpbXVtU3Bhbm5pbmdUcmVlLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL01heGltdW1TcGFubmluZ1RyZWUuaCAtIEludGVyZmFjZSAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBtb2R1bGUgcHJpdmlkZXMgbWVhbnMgZm9yIGNhbGN1bGF0aW5nIGEgbWF4aW11bSBzcGFubmluZyB0cmVlIGZvciBhCisvLyBnaXZlbiBzZXQgb2Ygd2VpZ2h0ZWQgZWRnZXMuIFRoZSB0eXBlIHBhcmFtZXRlciBUIGlzIHRoZSB0eXBlIG9mIGEgbm9kZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTUFYSU1VTVNQQU5OSU5HVFJFRV9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTUFYSU1VTVNQQU5OSU5HVFJFRV9ICisKKyNpbmNsdWRlICJsbHZtL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9FcXVpdmFsZW5jZUNsYXNzZXMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIE1heGltdW1TcGFubmluZ1RyZWUgLSBBIE1TVCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vIFRoZSB0eXBlIHBhcmFtZXRlciBUIGRldGVybWluZXMgdGhlIHR5cGUgb2YgdGhlIG5vZGVzIG9mIHRoZSBncmFwaC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNsYXNzIE1heGltdW1TcGFubmluZ1RyZWUgeworCisgICAgLy8gQSBjb21wYXJpbmcgY2xhc3MgZm9yIGNvbXBhcmluZyB3ZWlnaHRlZCBlZGdlcy4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1Q+CisgICAgc3RydWN0IEVkZ2VXZWlnaHRDb21wYXJlIHsKKyAgICAgIGJvb2wgb3BlcmF0b3IoKSh0eXBlbmFtZSBNYXhpbXVtU3Bhbm5pbmdUcmVlPENUPjo6RWRnZVdlaWdodCBYLCAKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXhpbXVtU3Bhbm5pbmdUcmVlPENUPjo6RWRnZVdlaWdodCBZKSBjb25zdCB7CisgICAgICAgIGlmIChYLnNlY29uZCA+IFkuc2Vjb25kKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKFguc2Vjb25kIDwgWS5zZWNvbmQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGNvbnN0IEJhc2ljQmxvY2sgKkJCWCA9IGR5bl9jYXN0PEJhc2ljQmxvY2s+KFguZmlyc3QuZmlyc3QpKSB7CisgICAgICAgICAgaWYgKGNvbnN0IEJhc2ljQmxvY2sgKkJCWSA9IGR5bl9jYXN0PEJhc2ljQmxvY2s+KFkuZmlyc3QuZmlyc3QpKSB7CisgICAgICAgICAgICBpZiAoQkJYLT5zaXplKCkgPiBCQlktPnNpemUoKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoQkJYLT5zaXplKCkgPCBCQlktPnNpemUoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29uc3QgQmFzaWNCbG9jayAqQkJYID0gZHluX2Nhc3Q8QmFzaWNCbG9jaz4oWC5maXJzdC5zZWNvbmQpKSB7CisgICAgICAgICAgaWYgKGNvbnN0IEJhc2ljQmxvY2sgKkJCWSA9IGR5bl9jYXN0PEJhc2ljQmxvY2s+KFkuZmlyc3Quc2Vjb25kKSkgeworICAgICAgICAgICAgaWYgKEJCWC0+c2l6ZSgpID4gQkJZLT5zaXplKCkpIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKEJCWC0+c2l6ZSgpIDwgQkJZLT5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH07CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IFQqLCBjb25zdCBUKj4gRWRnZTsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxFZGdlLCBkb3VibGU+IEVkZ2VXZWlnaHQ7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxFZGdlV2VpZ2h0PiBFZGdlV2VpZ2h0czsKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8RWRnZT4gTWF4U3BhblRyZWU7CisKKyAgICBNYXhTcGFuVHJlZSBNU1Q7CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBDbGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpbmZvCisKKyAgICAvLy8gTWF4aW11bVNwYW5uaW5nVHJlZSgpIC0gVGFrZXMgYSB2ZWN0b3Igb2Ygd2VpZ2h0ZWQgZWRnZXMgYW5kIHJldHVybnMgYQorICAgIC8vLyBzcGFubmluZyB0cmVlLgorICAgIE1heGltdW1TcGFubmluZ1RyZWUoRWRnZVdlaWdodHMgJkVkZ2VWZWN0b3IpIHsKKworICAgICAgc3RkOjpzdGFibGVfc29ydChFZGdlVmVjdG9yLmJlZ2luKCksIEVkZ2VWZWN0b3IuZW5kKCksIEVkZ2VXZWlnaHRDb21wYXJlPFQ+KCkpOworCisgICAgICAvLyBDcmVhdGUgc3Bhbm5pbmcgdHJlZSwgRm9yZXN0IGNvbnRhaW5zIGEgc3BlY2lhbCBkYXRhIHN0cnVjdHVyZQorICAgICAgLy8gdGhhdCBtYWtlcyBjaGVja2luZyBpZiB0d28gbm9kZXMgYXJlIGFscmVhZHkgaW4gYSBjb21tb24gKHN1Yi0pdHJlZQorICAgICAgLy8gZmFzdCBhbmQgY2hlYXAuCisgICAgICBFcXVpdmFsZW5jZUNsYXNzZXM8Y29uc3QgVCo+IEZvcmVzdDsKKyAgICAgIGZvciAodHlwZW5hbWUgRWRnZVdlaWdodHM6Oml0ZXJhdG9yIEVXaSA9IEVkZ2VWZWN0b3IuYmVnaW4oKSwKKyAgICAgICAgICAgRVdlID0gRWRnZVZlY3Rvci5lbmQoKTsgRVdpICE9IEVXZTsgKytFV2kpIHsKKyAgICAgICAgRWRnZSBlID0gKCpFV2kpLmZpcnN0OworCisgICAgICAgIEZvcmVzdC5pbnNlcnQoZS5maXJzdCk7CisgICAgICAgIEZvcmVzdC5pbnNlcnQoZS5zZWNvbmQpOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHNvcnRlZCBlZGdlcywgYmlnZ2VzdCBmaXJzdC4KKyAgICAgIGZvciAodHlwZW5hbWUgRWRnZVdlaWdodHM6Oml0ZXJhdG9yIEVXaSA9IEVkZ2VWZWN0b3IuYmVnaW4oKSwKKyAgICAgICAgICAgRVdlID0gRWRnZVZlY3Rvci5lbmQoKTsgRVdpICE9IEVXZTsgKytFV2kpIHsKKyAgICAgICAgRWRnZSBlID0gKCpFV2kpLmZpcnN0OworCisgICAgICAgIGlmIChGb3Jlc3QuZmluZExlYWRlcihlLmZpcnN0KSAhPSBGb3Jlc3QuZmluZExlYWRlcihlLnNlY29uZCkpIHsKKyAgICAgICAgICBGb3Jlc3QudW5pb25TZXRzKGUuZmlyc3QsIGUuc2Vjb25kKTsKKyAgICAgICAgICAvLyBTbyB3ZSBrbm93IG5vdyB0aGF0IHRoZSBlZGdlIGlzIG5vdCBhbHJlYWR5IGluIGEgc3VidHJlZSwgc28gd2UgcHVzaAorICAgICAgICAgIC8vIHRoZSBlZGdlIHRvIHRoZSBNU1QuCisgICAgICAgICAgTVNULnB1c2hfYmFjayhlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHR5cGVuYW1lIE1heFNwYW5UcmVlOjppdGVyYXRvciBiZWdpbigpIHsKKyAgICAgIHJldHVybiBNU1QuYmVnaW4oKTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBNYXhTcGFuVHJlZTo6aXRlcmF0b3IgZW5kKCkgeworICAgICAgcmV0dXJuIE1TVC5lbmQoKTsKKyAgICB9CisgIH07CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL09wdGltYWxFZGdlUHJvZmlsaW5nLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9PcHRpbWFsRWRnZVByb2ZpbGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlYzk4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9PcHRpbWFsRWRnZVByb2ZpbGluZy5jcHAKQEAgLTAsMCArMSwyMTggQEAKKy8vPT09LSBPcHRpbWFsRWRnZVByb2ZpbGluZy5jcHAgLSBJbnNlcnQgY291bnRlcnMgZm9yIG9wdC4gZWRnZSBwcm9maWxpbmcgLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpbnN0cnVtZW50cyB0aGUgc3BlY2lmaWVkIHByb2dyYW0gd2l0aCBjb3VudGVycyBmb3IgZWRnZSBwcm9maWxpbmcuCisvLyBFZGdlIHByb2ZpbGluZyBjYW4gZ2l2ZSBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgaG90IHBhdGhzIHRocm91Z2ggYQorLy8gcHJvZ3JhbSwgYW5kIGlzIHVzZWQgZm9yIGEgd2lkZSB2YXJpZXR5IG9mIHByb2dyYW0gdHJhbnNmb3JtYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjZGVmaW5lIERFQlVHX1RZUEUgImluc2VydC1vcHRpbWFsLWVkZ2UtcHJvZmlsaW5nIgorI2luY2x1ZGUgIlByb2ZpbGluZ1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUHJvZmlsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1Byb2ZpbGVJbmZvTG9hZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Jhc2ljQmxvY2tVdGlscy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgIk1heGltdW1TcGFubmluZ1RyZWUuaCIKKyNpbmNsdWRlIDxzZXQ+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUVkZ2VzSW5zZXJ0ZWQsICJUaGUgIyBvZiBlZGdlcyBpbnNlcnRlZC4iKTsKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgT3B0aW1hbEVkZ2VQcm9maWxlciA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKKyAgICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSk7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIE9wdGltYWxFZGdlUHJvZmlsZXIoKSA6IE1vZHVsZVBhc3MoSUQpIHt9CisKKyAgICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLmFkZFJlcXVpcmVkSUQoUHJvZmlsZUVzdGltYXRvclBhc3NJRCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxQcm9maWxlSW5mbz4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuICJPcHRpbWFsIEVkZ2UgUHJvZmlsZXIiOworICAgIH0KKyAgfTsKK30KKworY2hhciBPcHRpbWFsRWRnZVByb2ZpbGVyOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoT3B0aW1hbEVkZ2VQcm9maWxlciwgImluc2VydC1vcHRpbWFsLWVkZ2UtcHJvZmlsaW5nIiwgCisgICAgICAgICAgICAgICAgIkluc2VydCBvcHRpbWFsIGluc3RydW1lbnRhdGlvbiBmb3IgZWRnZSBwcm9maWxpbmciLAorICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisKK01vZHVsZVBhc3MgKmxsdm06OmNyZWF0ZU9wdGltYWxFZGdlUHJvZmlsZXJQYXNzKCkgeworICByZXR1cm4gbmV3IE9wdGltYWxFZGdlUHJvZmlsZXIoKTsKK30KKworaW5saW5lIHN0YXRpYyB2b2lkIHByaW50RWRnZUNvdW50ZXIoUHJvZmlsZUluZm86OkVkZ2UgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiLS1FZGdlIENvdW50ZXIgZm9yICIgPDwgKGUpIDw8ICIgaW4gIiBcCisgICAgICAgICAgICAgICA8PCAoKGIpPyhiKS0+Z2V0TmFtZVN0cigpOiIwIikgPDwgIiAoIyAiIDw8IChpKSA8PCAiKVxuIik7Cit9CisKK2Jvb2wgT3B0aW1hbEVkZ2VQcm9maWxlcjo6cnVuT25Nb2R1bGUoTW9kdWxlICZNKSB7CisgIEZ1bmN0aW9uICpNYWluID0gTS5nZXRGdW5jdGlvbigibWFpbiIpOworICBpZiAoTWFpbiA9PSAwKSB7CisgICAgZXJycygpIDw8ICJXQVJOSU5HOiBjYW5ub3QgaW5zZXJ0IGVkZ2UgcHJvZmlsaW5nIGludG8gYSBtb2R1bGUiCisgICAgICAgICAgIDw8ICIgd2l0aCBubyBtYWluIGZ1bmN0aW9uIVxuIjsKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBObyBtYWluLCBubyBpbnN0cnVtZW50YXRpb24hCisgIH0KKworICAvLyBOdW1FZGdlcyBjb3VudHMgYWxsIHRoZSBlZGdlcyB0aGF0IG1heSBiZSBpbnN0cnVtZW50ZWQuIExhdGVyIG9uIGl0cworICAvLyBkZWNpZGVkIHdoaWNoIGVkZ2VzIHRvIGFjdHVhbGx5IGluc3RydW1lbnQsIHRvIGFjaGlldmUgb3B0aW1hbCBwcm9maWxpbmcuCisgIC8vIEZvciB0aGUgZW50cnkgYmxvY2sgYSB2aXJ0dWFsIGVkZ2UgKDAsZW50cnkpIGlzIHJlc2VydmVkLCBmb3IgZWFjaCBibG9jaworICAvLyB3aXRoIG5vIHN1Y2Nlc3NvcnMgYW4gZWRnZSAoQkIsMCkgaXMgcmVzZXJ2ZWQuIFRoZXNlIGVkZ2VzIGFyZSBuZWNlc3NhcnkKKyAgLy8gdG8gY2FsY3VsYXRlIGEgdHJ1bHkgb3B0aW1hbCBtYXhpbXVtIHNwYW5uaW5nIHRyZWUgYW5kIHRodXMgYW4gb3B0aW1hbAorICAvLyBpbnN0cnVtZW50YXRpb24uCisgIHVuc2lnbmVkIE51bUVkZ2VzID0gMDsKKworICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgRiA9IE0uYmVnaW4oKSwgRSA9IE0uZW5kKCk7IEYgIT0gRTsgKytGKSB7CisgICAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSkgY29udGludWU7CisgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgKDAsZW50cnkpIGVkZ2UuCisgICAgKytOdW1FZGdlczsKKyAgICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCQiA9IEYtPmJlZ2luKCksIEUgPSBGLT5lbmQoKTsgQkIgIT0gRTsgKytCQikgeworICAgICAgLy8gS2VlcCB0cmFjayBvZiB3aGljaCBibG9ja3MgbmVlZCB0byBiZSBpbnN0cnVtZW50ZWQuICBXZSBkb24ndCB3YW50IHRvCisgICAgICAvLyBpbnN0cnVtZW50IGJsb2NrcyB0aGF0IGFyZSBhZGRlZCBhcyB0aGUgcmVzdWx0IG9mIGJyZWFraW5nIGNyaXRpY2FsCisgICAgICAvLyBlZGdlcyEKKyAgICAgIGlmIChCQi0+Z2V0VGVybWluYXRvcigpLT5nZXROdW1TdWNjZXNzb3JzKCkgPT0gMCkgeworICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciAoQkIsMCkgZWRnZS4KKyAgICAgICAgKytOdW1FZGdlczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE51bUVkZ2VzICs9IEJCLT5nZXRUZXJtaW5hdG9yKCktPmdldE51bVN1Y2Nlc3NvcnMoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBJbiB0aGUgcHJvZmlsaW5nIG91dHB1dCBhIGNvdW50ZXIgZm9yIGVhY2ggZWRnZSBpcyByZXNlcnZlZCwgYnV0IG9ubHkgZmV3CisgIC8vIGFyZSB1c2VkLiBUaGlzIGlzIGRvbmUgdG8gYmUgYWJsZSB0byByZWFkIGJhY2sgaW4gdGhlIHByb2ZpbGUgd2l0aG91dAorICAvLyBjYWx1bGF0aW5nIHRoZSBtYXhpbXVtIHNwYW5uaW5nIHRyZWUgYWdhaW4sIGluc3RlYWQgZWFjaCBlZGdlIGNvdW50ZXIgdGhhdAorICAvLyBpcyBub3QgdXNlZCBpcyBpbml0aWFsaXNlZCB3aXRoIC0xIHRvIHNpZ25hbCB0aGF0IHRoaXMgZWRnZSBjb3VudGVyIGhhcyB0bworICAvLyBiZSBjYWxjdWxhdGVkIGZyb20gb3RoZXIgZWRnZSBjb3VudGVycyBvbiByZWFkaW5nIHRoZSBwcm9maWxlIGluZm8gYmFjaworICAvLyBpbi4KKworICBjb25zdCBUeXBlICpJbnQzMiA9IFR5cGU6OmdldEludDMyVHkoTS5nZXRDb250ZXh0KCkpOworICBjb25zdCBBcnJheVR5cGUgKkFUeSA9IEFycmF5VHlwZTo6Z2V0KEludDMyLCBOdW1FZGdlcyk7CisgIEdsb2JhbFZhcmlhYmxlICpDb3VudGVycyA9CisgICAgbmV3IEdsb2JhbFZhcmlhYmxlKE0sIEFUeSwgZmFsc2UsIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoQVR5KSwgIk9wdEVkZ2VQcm9mQ291bnRlcnMiKTsKKyAgTnVtRWRnZXNJbnNlcnRlZCA9IDA7CisKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBJbml0aWFsaXplcihOdW1FZGdlcyk7CisgIENvbnN0YW50KiBaZXJvID0gQ29uc3RhbnRJbnQ6OmdldChJbnQzMiwgMCk7CisgIENvbnN0YW50KiBVbmNvdW50ZWQgPSBDb25zdGFudEludDo6Z2V0KEludDMyLCBQcm9maWxlSW5mb0xvYWRlcjo6VW5jb3VudGVkKTsKKworICAvLyBJbnN0cnVtZW50IGFsbCBvZiB0aGUgZWRnZXMgbm90IGluIE1TVC4uLgorICB1bnNpZ25lZCBpID0gMDsKKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEYgPSBNLmJlZ2luKCksIEUgPSBNLmVuZCgpOyBGICE9IEU7ICsrRikgeworICAgIGlmIChGLT5pc0RlY2xhcmF0aW9uKCkpIGNvbnRpbnVlOworICAgIERFQlVHKGRiZ3MoKTw8Ildvcmtpbmcgb24gIjw8Ri0+Z2V0TmFtZVN0cigpPDwiXG4iKTsKKworICAgIC8vIENhbGN1bGF0ZSBhIE1heGltdW0gU3Bhbm5pbmcgVHJlZSB3aXRoIHRoZSBlZGdlIHdlaWdodHMgZGV0ZXJtaW5lZCBieQorICAgIC8vIFByb2ZpbGVFc3RpbWF0b3IuIFByb2ZpbGVFc3RpbWF0b3IgYWxzbyBhc3NpZ24gd2VpZ2h0cyB0byB0aGUgdmlydHVhbAorICAgIC8vIGVkZ2VzICgwLGVudHJ5KSBhbmQgKEJCLDApIChmb3IgYmxvY2tzIHdpdGggbm8gc3VjY2Vzc29ycykgYW5kIHRoaXMKKyAgICAvLyBlZGdlcyBhbHNvIHBhcnRpY2lwYXRlIGluIHRoZSBtYXhpbXVtIHNwYW5uaW5nIHRyZWUgY2FsY3VsYXRpb24uIAorICAgIC8vIFRoZSB0aGlyZCBwYXJhbWV0ZXIgb2YgTWF4aW11bVNwYW5uaW5nVHJlZSgpIGhhcyB0aGUgZWZmZWN0IHRoYXQgbm90IHRoZQorICAgIC8vIGFjdHVhbCBNU1QgaXMgcmV0dXJuZWQgYnV0IHRoZSBlZGdlcyBfbm90XyBpbiB0aGUgTVNULgorCisgICAgUHJvZmlsZUluZm86OkVkZ2VXZWlnaHRzIEVDcyA9IAorICAgICAgZ2V0QW5hbHlzaXM8UHJvZmlsZUluZm8+KCpGKS5nZXRFZGdlV2VpZ2h0cyhGKTsKKyAgICBzdGQ6OnZlY3RvcjxQcm9maWxlSW5mbzo6RWRnZVdlaWdodD4gRWRnZVZlY3RvcihFQ3MuYmVnaW4oKSwgRUNzLmVuZCgpKTsKKyAgICBNYXhpbXVtU3Bhbm5pbmdUcmVlPEJhc2ljQmxvY2s+IE1TVCAoRWRnZVZlY3Rvcik7CisgICAgc3RkOjpzdGFibGVfc29ydChNU1QuYmVnaW4oKSxNU1QuZW5kKCkpOworCisgICAgLy8gQ2hlY2sgaWYgKDAsZW50cnkpIG5vdCBpbiB0aGUgTVNULiBJZiBub3QsIGluc3RydW1lbnQgZWRnZQorICAgIC8vIChJbmNyZW1lbnRDb3VudGVySW5CbG9jaygpKSBhbmQgc2V0IHRoZSBjb3VudGVyIGluaXRpYWxseSB0byB6ZXJvLCBpZgorICAgIC8vIHRoZSBlZGdlIGlzIGluIHRoZSBNU1QgdGhlIGNvdW50ZXIgaXMgaW5pdGlhbGlzZWQgdG8gLTEuCisKKyAgICBCYXNpY0Jsb2NrICplbnRyeSA9ICYoRi0+Z2V0RW50cnlCbG9jaygpKTsKKyAgICBQcm9maWxlSW5mbzo6RWRnZSBlZGdlID0gUHJvZmlsZUluZm86OmdldEVkZ2UoMCxlbnRyeSk7CisgICAgaWYgKCFzdGQ6OmJpbmFyeV9zZWFyY2goTVNULmJlZ2luKCksIE1TVC5lbmQoKSwgZWRnZSkpIHsKKyAgICAgIHByaW50RWRnZUNvdW50ZXIoZWRnZSxlbnRyeSxpKTsKKyAgICAgIEluY3JlbWVudENvdW50ZXJJbkJsb2NrKGVudHJ5LCBpLCBDb3VudGVycyk7ICsrTnVtRWRnZXNJbnNlcnRlZDsKKyAgICAgIEluaXRpYWxpemVyW2krK10gPSAoWmVybyk7CisgICAgfSBlbHNleworICAgICAgSW5pdGlhbGl6ZXJbaSsrXSA9IChVbmNvdW50ZWQpOworICAgIH0KKworICAgIC8vIEluc2VydGVkQmxvY2tzIGNvbnRhaW5zIGFsbCBibG9ja3MgdGhhdCB3ZXJlIGluc2VydGVkIGZvciBzcGxpdHRpbmcgYW4KKyAgICAvLyBlZGdlLCB0aGlzIGJsb2NrcyBkbyBub3QgaGF2ZSB0byBiZSBpbnN0cnVtZW50ZWQuCisgICAgRGVuc2VTZXQ8QmFzaWNCbG9jayo+IEluc2VydGVkQmxvY2tzOworICAgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEJCID0gRi0+YmVnaW4oKSwgRSA9IEYtPmVuZCgpOyBCQiAhPSBFOyArK0JCKSB7CisgICAgICAvLyBDaGVjayBpZiBibG9jayB3YXMgbm90IGluc2VydGVkIGFuZCB0aHVzIGRvZXMgbm90IGhhdmUgdG8gYmUKKyAgICAgIC8vIGluc3RydW1lbnRlZC4KKyAgICAgIGlmIChJbnNlcnRlZEJsb2Nrcy5jb3VudChCQikpIGNvbnRpbnVlOworCisgICAgICAvLyBPa2F5LCB3ZSBoYXZlIHRvIGFkZCBhIGNvdW50ZXIgb2YgZWFjaCBvdXRnb2luZyBlZGdlIG5vdCBpbiBNU1QuIElmCisgICAgICAvLyB0aGUgb3V0Z29pbmcgZWRnZSBpcyBub3QgY3JpdGljYWwgZG9uJ3Qgc3BsaXQgaXQsIGp1c3QgaW5zZXJ0IHRoZQorICAgICAgLy8gY291bnRlciBpbiB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIG9mIHRoZSBlZGdlLiBBbHNvLCBpZiB0aGUgYmxvY2sKKyAgICAgIC8vIGhhcyBubyBzdWNjZXNzb3JzLCB0aGUgdmlydHVhbCBlZGdlIChCQiwwKSBpcyBwcm9jZXNzZWQuCisgICAgICBUZXJtaW5hdG9ySW5zdCAqVEkgPSBCQi0+Z2V0VGVybWluYXRvcigpOworICAgICAgaWYgKFRJLT5nZXROdW1TdWNjZXNzb3JzKCkgPT0gMCkgeworICAgICAgICBQcm9maWxlSW5mbzo6RWRnZSBlZGdlID0gUHJvZmlsZUluZm86OmdldEVkZ2UoQkIsMCk7CisgICAgICAgIGlmICghc3RkOjpiaW5hcnlfc2VhcmNoKE1TVC5iZWdpbigpLCBNU1QuZW5kKCksIGVkZ2UpKSB7CisgICAgICAgICAgcHJpbnRFZGdlQ291bnRlcihlZGdlLEJCLGkpOworICAgICAgICAgIEluY3JlbWVudENvdW50ZXJJbkJsb2NrKEJCLCBpLCBDb3VudGVycyk7ICsrTnVtRWRnZXNJbnNlcnRlZDsKKyAgICAgICAgICBJbml0aWFsaXplcltpKytdID0gKFplcm8pOworICAgICAgICB9IGVsc2V7CisgICAgICAgICAgSW5pdGlhbGl6ZXJbaSsrXSA9IChVbmNvdW50ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKHVuc2lnbmVkIHMgPSAwLCBlID0gVEktPmdldE51bVN1Y2Nlc3NvcnMoKTsgcyAhPSBlOyArK3MpIHsKKyAgICAgICAgQmFzaWNCbG9jayAqU3VjYyA9IFRJLT5nZXRTdWNjZXNzb3Iocyk7CisgICAgICAgIFByb2ZpbGVJbmZvOjpFZGdlIGVkZ2UgPSBQcm9maWxlSW5mbzo6Z2V0RWRnZShCQixTdWNjKTsKKyAgICAgICAgaWYgKCFzdGQ6OmJpbmFyeV9zZWFyY2goTVNULmJlZ2luKCksIE1TVC5lbmQoKSwgZWRnZSkpIHsKKworICAgICAgICAgIC8vIElmIHRoZSBlZGdlIGlzIGNyaXRpY2FsLCBzcGxpdCBpdC4KKyAgICAgICAgICBib29sIHdhc0luc2VydGVkID0gU3BsaXRDcml0aWNhbEVkZ2UoVEksIHMsIHRoaXMpOworICAgICAgICAgIFN1Y2MgPSBUSS0+Z2V0U3VjY2Vzc29yKHMpOworICAgICAgICAgIGlmICh3YXNJbnNlcnRlZCkKKyAgICAgICAgICAgIEluc2VydGVkQmxvY2tzLmluc2VydChTdWNjKTsKKworICAgICAgICAgIC8vIE9rYXksIHdlIGFyZSBndWFyYW50ZWVkIHRoYXQgdGhlIGVkZ2UgaXMgbm8gbG9uZ2VyIGNyaXRpY2FsLiAgSWYKKyAgICAgICAgICAvLyB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgc3VjY2Vzc29yLCBpbnNlcnQgdGhlIGNvdW50ZXIgaW4gdGhpcyBibG9jaywKKyAgICAgICAgICAvLyBvdGhlcndpc2UgaW5zZXJ0IGl0IGluIHRoZSBzdWNjZXNzb3IgYmxvY2suCisgICAgICAgICAgaWYgKFRJLT5nZXROdW1TdWNjZXNzb3JzKCkgPT0gMSkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IGNvdW50ZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jaworICAgICAgICAgICAgcHJpbnRFZGdlQ291bnRlcihlZGdlLEJCLGkpOworICAgICAgICAgICAgSW5jcmVtZW50Q291bnRlckluQmxvY2soQkIsIGksIENvdW50ZXJzKTsgKytOdW1FZGdlc0luc2VydGVkOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgY291bnRlciBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrCisgICAgICAgICAgICBwcmludEVkZ2VDb3VudGVyKGVkZ2UsU3VjYyxpKTsKKyAgICAgICAgICAgIEluY3JlbWVudENvdW50ZXJJbkJsb2NrKFN1Y2MsIGksIENvdW50ZXJzKTsgKytOdW1FZGdlc0luc2VydGVkOworICAgICAgICAgIH0KKyAgICAgICAgICBJbml0aWFsaXplcltpKytdID0gKFplcm8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEluaXRpYWxpemVyW2krK10gPSAoVW5jb3VudGVkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENoZWNrIGlmIHRoZSBudW1iZXIgb2YgZWRnZXMgY291bnRlZCBhdCBmaXJzdCB3YXMgdGhlIG51bWJlciBvZiBlZGdlcyB3ZQorICAvLyBjb25zaWRlcmVkIGZvciBpbnN0cnVtZW50YXRpb24uCisgIGFzc2VydChpPT1OdW1FZGdlcyAmJiAidGhlIG51bWJlciBvZiBlZGdlcyBpbiBjb3VudGluZyBhcnJheSBpcyB3cm9uZyIpOworCisgIC8vIEFzc2luZyB0aGUgbm93IGNvbXBsZXRlbHkgZGVmaW5lZCBpbml0aWFsaXNlciB0byB0aGUgYXJyYXkuCisgIENvbnN0YW50ICppbml0ID0gQ29uc3RhbnRBcnJheTo6Z2V0KEFUeSwgSW5pdGlhbGl6ZXIpOworICBDb3VudGVycy0+c2V0SW5pdGlhbGl6ZXIoaW5pdCk7CisKKyAgLy8gQWRkIHRoZSBpbml0aWFsaXphdGlvbiBjYWxsIHRvIG1haW4uCisgIEluc2VydFByb2ZpbGluZ0luaXRDYWxsKE1haW4sICJsbHZtX3N0YXJ0X29wdF9lZGdlX3Byb2ZpbGluZyIsIENvdW50ZXJzKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9Qcm9maWxpbmdVdGlscy5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vUHJvZmlsaW5nVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMzBlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vUHJvZmlsaW5nVXRpbHMuY3BwCkBAIC0wLDAgKzEsMTMxIEBACisvLz09PS0gUHJvZmlsaW5nVXRpbHMuY3BwIC0gSGVscGVyIGZ1bmN0aW9ucyBzaGFyZWQgYnkgcHJvZmlsZXJzIC0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgZmV3IGhlbHBlciBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWQgYnkgcHJvZmlsZQorLy8gaW5zdHJ1bWVudGF0aW9uIGNvZGUgdG8gaW5zdHJ1bWVudCB0aGUgY29kZS4gIFRoaXMgYWxsb3dzIHRoZSBwcm9maWxlciBwYXNzCisvLyB0byB3b3JyeSBhYm91dCAqd2hhdCogdG8gaW5zZXJ0LCBhbmQgdGhlc2UgZnVuY3Rpb25zIHRha2UgY2FyZSBvZiAqaG93KiB0byBkbworLy8gaXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlByb2ZpbGluZ1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisKK3ZvaWQgbGx2bTo6SW5zZXJ0UHJvZmlsaW5nSW5pdENhbGwoRnVuY3Rpb24gKk1haW5GbiwgY29uc3QgY2hhciAqRm5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZSAqQXJyYXkpIHsKKyAgTExWTUNvbnRleHQgJkNvbnRleHQgPSBNYWluRm4tPmdldENvbnRleHQoKTsKKyAgY29uc3QgVHlwZSAqQXJnVlR5ID0gCisgICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4UHRyVHkoQ29udGV4dCkpOworICBjb25zdCBQb2ludGVyVHlwZSAqVUludFB0ciA9CisgICAgICAgIFR5cGU6OmdldEludDMyUHRyVHkoQ29udGV4dCk7CisgIE1vZHVsZSAmTSA9ICpNYWluRm4tPmdldFBhcmVudCgpOworICBDb25zdGFudCAqSW5pdEZuID0gTS5nZXRPckluc2VydEZ1bmN0aW9uKEZuTmFtZSwgVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1ZUeSwgVUludFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUeXBlICopMCk7CisKKyAgLy8gVGhpcyBjb3VsZCBmb3JjZSBhcmdjIGFuZCBhcmd2IGludG8gcHJvZ3JhbXMgdGhhdCB3b3VsZG4ndCBvdGhlcndpc2UgaGF2ZQorICAvLyB0aGVtLCBidXQgaW5zdGVhZCB3ZSBqdXN0IHBhc3MgbnVsbCB2YWx1ZXMgaW4uCisgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJncyg0KTsKKyAgQXJnc1swXSA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSk7CisgIEFyZ3NbMV0gPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEFyZ1ZUeSk7CisKKyAgLy8gU2tpcCBvdmVyIGFueSBhbGxvY2FzIGluIHRoZSBlbnRyeSBibG9jay4KKyAgQmFzaWNCbG9jayAqRW50cnkgPSBNYWluRm4tPmJlZ2luKCk7CisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFBvcyA9IEVudHJ5LT5iZWdpbigpOworICB3aGlsZSAoaXNhPEFsbG9jYUluc3Q+KEluc2VydFBvcykpICsrSW5zZXJ0UG9zOworCisgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gR0VQSW5kaWNlcygyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDMyVHkoQ29udGV4dCkpKTsKKyAgdW5zaWduZWQgTnVtRWxlbWVudHMgPSAwOworICBpZiAoQXJyYXkpIHsKKyAgICBBcmdzWzJdID0gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKEFycmF5LCAmR0VQSW5kaWNlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFUEluZGljZXMuc2l6ZSgpKTsKKyAgICBOdW1FbGVtZW50cyA9CisgICAgICBjYXN0PEFycmF5VHlwZT4oQXJyYXktPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSktPmdldE51bUVsZW1lbnRzKCk7CisgIH0gZWxzZSB7CisgICAgLy8gSWYgdGhpcyBwcm9maWxpbmcgaW5zdHJ1bWVudGF0aW9uIGRvZXNuJ3QgaGF2ZSBhIGNvbnN0YW50IGFycmF5LCBqdXN0CisgICAgLy8gcGFzcyBudWxsLgorICAgIEFyZ3NbMl0gPSBDb25zdGFudFBvaW50ZXJOdWxsOjpnZXQoVUludFB0cik7CisgIH0KKyAgQXJnc1szXSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgTnVtRWxlbWVudHMpOworCisgIENhbGxJbnN0ICpJbml0Q2FsbCA9IENhbGxJbnN0OjpDcmVhdGUoSW5pdEZuLCBBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld2FyZ2MiLCBJbnNlcnRQb3MpOworCisgIC8vIElmIGFyZ2Mgb3IgYXJndiBhcmUgbm90IGF2YWlsYWJsZSBpbiBtYWluLCBqdXN0IHBhc3MgbnVsbCB2YWx1ZXMgaW4uCisgIEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgQUk7CisgIHN3aXRjaCAoTWFpbkZuLT5hcmdfc2l6ZSgpKSB7CisgIGRlZmF1bHQ6CisgIGNhc2UgMjoKKyAgICBBSSA9IE1haW5Gbi0+YXJnX2JlZ2luKCk7ICsrQUk7CisgICAgaWYgKEFJLT5nZXRUeXBlKCkgIT0gQXJnVlR5KSB7CisgICAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBvcGNvZGUgPSBDYXN0SW5zdDo6Z2V0Q2FzdE9wY29kZShBSSwgZmFsc2UsIEFyZ1ZUeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICBJbml0Q2FsbC0+c2V0QXJnT3BlcmFuZCgxLCAKKyAgICAgICAgICBDYXN0SW5zdDo6Q3JlYXRlKG9wY29kZSwgQUksIEFyZ1ZUeSwgImFyZ3YuY2FzdCIsIEluaXRDYWxsKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEluaXRDYWxsLT5zZXRBcmdPcGVyYW5kKDEsIEFJKTsKKyAgICB9CisgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgY2FzZSAxOgorICAgIEFJID0gTWFpbkZuLT5hcmdfYmVnaW4oKTsKKyAgICAvLyBJZiB0aGUgcHJvZ3JhbSBsb29rZWQgYXQgYXJnYywgaGF2ZSBpdCBsb29rIGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCisgICAgLy8gaW5pdCBjYWxsIGluc3RlYWQuCisgICAgaWYgKCFBSS0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgzMikpIHsKKyAgICAgIEluc3RydWN0aW9uOjpDYXN0T3BzIG9wY29kZTsKKyAgICAgIGlmICghQUktPnVzZV9lbXB0eSgpKSB7CisgICAgICAgIG9wY29kZSA9IENhc3RJbnN0OjpnZXRDYXN0T3Bjb2RlKEluaXRDYWxsLCB0cnVlLCBBSS0+Z2V0VHlwZSgpLCB0cnVlKTsKKyAgICAgICAgQUktPnJlcGxhY2VBbGxVc2VzV2l0aCgKKyAgICAgICAgICBDYXN0SW5zdDo6Q3JlYXRlKG9wY29kZSwgSW5pdENhbGwsIEFJLT5nZXRUeXBlKCksICIiLCBJbnNlcnRQb3MpKTsKKyAgICAgIH0KKyAgICAgIG9wY29kZSA9IENhc3RJbnN0OjpnZXRDYXN0T3Bjb2RlKEFJLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgdHJ1ZSk7CisgICAgICBJbml0Q2FsbC0+c2V0QXJnT3BlcmFuZCgwLCAKKyAgICAgICAgICBDYXN0SW5zdDo6Q3JlYXRlKG9wY29kZSwgQUksIFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJnYy5jYXN0IiwgSW5pdENhbGwpKTsKKyAgICB9IGVsc2UgeworICAgICAgQUktPnJlcGxhY2VBbGxVc2VzV2l0aChJbml0Q2FsbCk7CisgICAgICBJbml0Q2FsbC0+c2V0QXJnT3BlcmFuZCgwLCBBSSk7CisgICAgfQorCisgIGNhc2UgMDogYnJlYWs7CisgIH0KK30KKwordm9pZCBsbHZtOjpJbmNyZW1lbnRDb3VudGVySW5CbG9jayhCYXNpY0Jsb2NrICpCQiwgdW5zaWduZWQgQ291bnRlck51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWUgKkNvdW50ZXJBcnJheSkgeworICAvLyBJbnNlcnQgdGhlIGluY3JlbWVudCBhZnRlciBhbnkgYWxsb2NhIG9yIFBISSBpbnN0cnVjdGlvbnMuLi4KKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UG9zID0gQkItPmdldEZpcnN0Tm9uUEhJKCk7CisgIHdoaWxlIChpc2E8QWxsb2NhSW5zdD4oSW5zZXJ0UG9zKSkKKyAgICArK0luc2VydFBvczsKKworICBMTFZNQ29udGV4dCAmQ29udGV4dCA9IEJCLT5nZXRDb250ZXh0KCk7CisKKyAgLy8gQ3JlYXRlIHRoZSBnZXRlbGVtZW50cHRyIGNvbnN0YW50IGV4cHJlc3Npb24KKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBJbmRpY2VzKDIpOworICBJbmRpY2VzWzBdID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpKTsKKyAgSW5kaWNlc1sxXSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgQ291bnRlck51bSk7CisgIENvbnN0YW50ICpFbGVtZW50UHRyID0gCisgICAgQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKENvdW50ZXJBcnJheSwgJkluZGljZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpY2VzLnNpemUoKSk7CisKKyAgLy8gTG9hZCwgaW5jcmVtZW50IGFuZCBzdG9yZSB0aGUgdmFsdWUgYmFjay4KKyAgVmFsdWUgKk9sZFZhbCA9IG5ldyBMb2FkSW5zdChFbGVtZW50UHRyLCAiT2xkRnVuY0NvdW50ZXIiLCBJbnNlcnRQb3MpOworICBWYWx1ZSAqTmV3VmFsID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShJbnN0cnVjdGlvbjo6QWRkLCBPbGRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmV3RnVuY0NvdW50ZXIiLCBJbnNlcnRQb3MpOworICBuZXcgU3RvcmVJbnN0KE5ld1ZhbCwgRWxlbWVudFB0ciwgSW5zZXJ0UG9zKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9Qcm9maWxpbmdVdGlscy5oIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL1Byb2ZpbGluZ1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlZmZmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9Qcm9maWxpbmdVdGlscy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LSBQcm9maWxpbmdVdGlscy5oIC0gSGVscGVyIGZ1bmN0aW9ucyBzaGFyZWQgYnkgcHJvZmlsZXJzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBmZXcgaGVscGVyIGZ1bmN0aW9ucyB3aGljaCBhcmUgdXNlZCBieSBwcm9maWxlCisvLyBpbnN0cnVtZW50YXRpb24gY29kZSB0byBpbnN0cnVtZW50IHRoZSBjb2RlLiAgVGhpcyBhbGxvd3MgdGhlIHByb2ZpbGVyIHBhc3MKKy8vIHRvIHdvcnJ5IGFib3V0ICp3aGF0KiB0byBpbnNlcnQsIGFuZCB0aGVzZSBmdW5jdGlvbnMgdGFrZSBjYXJlIG9mICpob3cqIHRvIGRvCisvLyBpdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFBST0ZJTElOR1VUSUxTX0gKKyNkZWZpbmUgUFJPRklMSU5HVVRJTFNfSAorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBHbG9iYWxWYWx1ZTsKKyAgY2xhc3MgQmFzaWNCbG9jazsKKworICB2b2lkIEluc2VydFByb2ZpbGluZ0luaXRDYWxsKEZ1bmN0aW9uICpNYWluRm4sIGNvbnN0IGNoYXIgKkZuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZSAqQXJyID0gMCk7CisgIHZvaWQgSW5jcmVtZW50Q291bnRlckluQmxvY2soQmFzaWNCbG9jayAqQkIsIHVuc2lnbmVkIENvdW50ZXJOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWUgKkNvdW50ZXJBcnJheSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvTWFrZWZpbGUgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTI3YmUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorIyM9PT0tIGxpYi9UcmFuc2Zvcm1zL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorUEFSQUxMRUxfRElSUyA9IFV0aWxzIEluc3RydW1lbnRhdGlvbiBTY2FsYXIgSW5zdENvbWJpbmUgSVBPIEhlbGxvCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCisKKyMgTm8gc3VwcG9ydCBmb3IgcGx1Z2lucyBvbiB3aW5kb3dzIHRhcmdldHMKK2lmZXEgKCQoSE9TVF9PUyksICQoZmlsdGVyICQoSE9TVF9PUyksIEN5Z3dpbiBNaW5nVyBNaW5peCkpCisgIFBBUkFMTEVMX0RJUlMgOj0gJChmaWx0ZXItb3V0IEhlbGxvLCAkKFBBUkFMTEVMX0RJUlMpKQorZW5kaWYKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9BRENFLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9BRENFLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmJiMDhkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL0FEQ0UuY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8vPT09LSBEQ0UuY3BwIC0gQ29kZSB0byBwZXJmb3JtIGRlYWQgY29kZSBlbGltaW5hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEFnZ3Jlc3NpdmUgRGVhZCBDb2RlIEVsaW1pbmF0aW9uIHBhc3MuICBUaGlzIHBhc3MKKy8vIG9wdGltaXN0aWNhbGx5IGFzc3VtZXMgdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIGFyZSBkZWFkIHVudGlsIHByb3ZlbiBvdGhlcndpc2UsCisvLyBhbGxvd2luZyBpdCB0byBlbGltaW5hdGUgZGVhZCBjb21wdXRhdGlvbnMgdGhhdCBvdGhlciBEQ0UgcGFzc2VzIGRvIG5vdCAKKy8vIGNhdGNoLCBwYXJ0aWN1bGFybHkgaW52b2x2aW5nIGxvb3AgY29tcHV0YXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYWRjZSIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0luc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtUmVtb3ZlZCwgIk51bWJlciBvZiBpbnN0cnVjdGlvbnMgcmVtb3ZlZCIpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgQURDRSA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgQURDRSgpIDogRnVuY3Rpb25QYXNzKElEKSB7fQorICAgIAorICAgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uJiBGKTsKKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlJiBBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQ0ZHKCk7CisgICAgfQorICAgIAorICB9OworfQorCitjaGFyIEFEQ0U6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhBRENFLCAiYWRjZSIsICJBZ2dyZXNzaXZlIERlYWQgQ29kZSBFbGltaW5hdGlvbiIsIGZhbHNlLCBmYWxzZSk7CisKK2Jvb2wgQURDRTo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiYgRikgeworICBTbWFsbFB0clNldDxJbnN0cnVjdGlvbiosIDEyOD4gYWxpdmU7CisgIFNtYWxsVmVjdG9yPEluc3RydWN0aW9uKiwgMTI4PiB3b3JrbGlzdDsKKyAgCisgIC8vIENvbGxlY3QgdGhlIHNldCBvZiAicm9vdCIgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGtub3duIGxpdmUuCisgIGZvciAoaW5zdF9pdGVyYXRvciBJID0gaW5zdF9iZWdpbihGKSwgRSA9IGluc3RfZW5kKEYpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoaXNhPFRlcm1pbmF0b3JJbnN0PihJLmdldEluc3RydWN0aW9uSXRlcmF0b3IoKSkgfHwKKyAgICAgICAgSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEkuZ2V0SW5zdHJ1Y3Rpb25JdGVyYXRvcigpKSB8fAorICAgICAgICBJLT5tYXlIYXZlU2lkZUVmZmVjdHMoKSkgeworICAgICAgYWxpdmUuaW5zZXJ0KEkuZ2V0SW5zdHJ1Y3Rpb25JdGVyYXRvcigpKTsKKyAgICAgIHdvcmtsaXN0LnB1c2hfYmFjayhJLmdldEluc3RydWN0aW9uSXRlcmF0b3IoKSk7CisgICAgfQorICAKKyAgLy8gUHJvcGFnYXRlIGxpdmVuZXNzIGJhY2t3YXJkcyB0byBvcGVyYW5kcy4KKyAgd2hpbGUgKCF3b3JrbGlzdC5lbXB0eSgpKSB7CisgICAgSW5zdHJ1Y3Rpb24qIGN1cnIgPSB3b3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAKKyAgICBmb3IgKEluc3RydWN0aW9uOjpvcF9pdGVyYXRvciBPSSA9IGN1cnItPm9wX2JlZ2luKCksIE9FID0gY3Vyci0+b3BfZW5kKCk7CisgICAgICAgICBPSSAhPSBPRTsgKytPSSkKKyAgICAgIGlmIChJbnN0cnVjdGlvbiogSW5zdCA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihPSSkpCisgICAgICAgIGlmIChhbGl2ZS5pbnNlcnQoSW5zdCkpCisgICAgICAgICAgd29ya2xpc3QucHVzaF9iYWNrKEluc3QpOworICB9CisgIAorICAvLyBUaGUgaW52ZXJzZSBvZiB0aGUgbGl2ZSBzZXQgaXMgdGhlIGRlYWQgc2V0LiAgVGhlc2UgYXJlIHRob3NlIGluc3RydWN0aW9ucworICAvLyB3aGljaCBoYXZlIG5vIHNpZGUgZWZmZWN0cyBhbmQgZG8gbm90IGluZmx1ZW5jZSB0aGUgY29udHJvbCBmbG93IG9yIHJldHVybgorICAvLyB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24sIGFuZCBtYXkgdGhlcmVmb3JlIGJlIGRlbGV0ZWQgc2FmZWx5LgorICAvLyBOT1RFOiBXZSByZXVzZSB0aGUgd29ya2xpc3QgdmVjdG9yIGhlcmUgZm9yIG1lbW9yeSBlZmZpY2llbmN5LgorICBmb3IgKGluc3RfaXRlcmF0b3IgSSA9IGluc3RfYmVnaW4oRiksIEUgPSBpbnN0X2VuZChGKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFhbGl2ZS5jb3VudChJLmdldEluc3RydWN0aW9uSXRlcmF0b3IoKSkpIHsKKyAgICAgIHdvcmtsaXN0LnB1c2hfYmFjayhJLmdldEluc3RydWN0aW9uSXRlcmF0b3IoKSk7CisgICAgICBJLT5kcm9wQWxsUmVmZXJlbmNlcygpOworICAgIH0KKyAgCisgIGZvciAoU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24qLCAxMDI0Pjo6aXRlcmF0b3IgSSA9IHdvcmtsaXN0LmJlZ2luKCksCisgICAgICAgRSA9IHdvcmtsaXN0LmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICsrTnVtUmVtb3ZlZDsKKyAgICAoKkkpLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorCisgIHJldHVybiAhd29ya2xpc3QuZW1wdHkoKTsKK30KKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVBZ2dyZXNzaXZlRENFUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBBRENFKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwMjhjMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDM1IEBACithZGRfbGx2bV9saWJyYXJ5KExMVk1TY2FsYXJPcHRzCisgIEFCQ0QuY3BwCisgIEFEQ0UuY3BwCisgIEJhc2ljQmxvY2tQbGFjZW1lbnQuY3BwCisgIENvZGVHZW5QcmVwYXJlLmNwcAorICBDb25zdGFudFByb3AuY3BwCisgIERDRS5jcHAKKyAgRGVhZFN0b3JlRWxpbWluYXRpb24uY3BwCisgIEdFUFNwbGl0dGVyLmNwcAorICBHVk4uY3BwCisgIEluZFZhclNpbXBsaWZ5LmNwcAorICBKdW1wVGhyZWFkaW5nLmNwcAorICBMSUNNLmNwcAorICBMb29wRGVsZXRpb24uY3BwCisgIExvb3BJbmRleFNwbGl0LmNwcAorICBMb29wUm90YXRpb24uY3BwCisgIExvb3BTdHJlbmd0aFJlZHVjZS5jcHAKKyAgTG9vcFVucm9sbFBhc3MuY3BwCisgIExvb3BVbnN3aXRjaC5jcHAKKyAgTG93ZXJBdG9taWMuY3BwCisgIE1lbUNweU9wdGltaXplci5jcHAKKyAgUmVhc3NvY2lhdGUuY3BwCisgIFJlZzJNZW0uY3BwCisgIFNDQ1AuY3BwCisgIFNjYWxhci5jcHAKKyAgU2NhbGFyUmVwbEFnZ3JlZ2F0ZXMuY3BwCisgIFNpbXBsaWZ5Q0ZHUGFzcy5jcHAKKyAgU2ltcGxpZnlIYWxmUG93ckxpYkNhbGxzLmNwcAorICBTaW1wbGlmeUxpYkNhbGxzLmNwcAorICBTaW5rLmNwcAorICBUYWlsRHVwbGljYXRpb24uY3BwCisgIFRhaWxSZWN1cnNpb25FbGltaW5hdGlvbi5jcHAKKyAgKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMgKExMVk1TY2FsYXJPcHRzIExMVk1UcmFuc2Zvcm1VdGlscykKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9Db2RlR2VuUHJlcGFyZS5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvQ29kZUdlblByZXBhcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTAyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvQ29kZUdlblByZXBhcmUuY3BwCkBAIC0wLDAgKzEsOTI1IEBACisvLz09PS0gQ29kZUdlblByZXBhcmUuY3BwIC0gUHJlcGFyZSBhIGZ1bmN0aW9uIGZvciBjb2RlIGdlbmVyYXRpb24gLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBtdW5nZXMgdGhlIGNvZGUgaW4gdGhlIGlucHV0IGZ1bmN0aW9uIHRvIGJldHRlciBwcmVwYXJlIGl0IGZvcgorLy8gU2VsZWN0aW9uREFHLWJhc2VkIGNvZGUgZ2VuZXJhdGlvbi4gVGhpcyB3b3JrcyBhcm91bmQgbGltaXRhdGlvbnMgaW4gaXQncworLy8gYmFzaWMtYmxvY2stYXQtYS10aW1lIGFwcHJvYWNoLiBJdCBzaG91bGQgZXZlbnR1YWxseSBiZSByZW1vdmVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiY29kZWdlbnByZXBhcmUiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUHJvZmlsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvQWRkck1vZGVNYXRjaGVyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Jhc2ljQmxvY2tVdGlscy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9CdWlsZExpYkNhbGxzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0dGVybk1hdGNoLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0lSQnVpbGRlci5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBuYW1lc3BhY2UgbGx2bTo6UGF0dGVybk1hdGNoOworCituYW1lc3BhY2UgeworICBjbGFzcyBDb2RlR2VuUHJlcGFyZSA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICAgIC8vLyBUTEkgLSBLZWVwIGEgcG9pbnRlciBvZiBhIFRhcmdldExvd2VyaW5nIHRvIGNvbnN1bHQgZm9yIGRldGVybWluaW5nCisgICAgLy8vIHRyYW5zZm9ybWF0aW9uIHByb2ZpdGFiaWxpdHkuCisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSTsKKyAgICBQcm9maWxlSW5mbyAqUEZJOworCisgICAgLy8vIEJhY2tFZGdlcyAtIEtlZXAgYSBzZXQgb2YgYWxsIHRoZSBsb29wIGJhY2sgZWRnZXMuCisgICAgLy8vCisgICAgU21hbGxTZXQ8c3RkOjpwYWlyPGNvbnN0IEJhc2ljQmxvY2sqLCBjb25zdCBCYXNpY0Jsb2NrKj4sIDg+IEJhY2tFZGdlczsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgZXhwbGljaXQgQ29kZUdlblByZXBhcmUoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKnRsaSA9IDApCisgICAgICA6IEZ1bmN0aW9uUGFzcyhJRCksIFRMSSh0bGkpIHt9CisgICAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8UHJvZmlsZUluZm8+KCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7CisgICAgICBCYWNrRWRnZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIEVsaW1pbmF0ZU1vc3RseUVtcHR5QmxvY2tzKEZ1bmN0aW9uICZGKTsKKyAgICBib29sIENhbk1lcmdlQmxvY2tzKGNvbnN0IEJhc2ljQmxvY2sgKkJCLCBjb25zdCBCYXNpY0Jsb2NrICpEZXN0QkIpIGNvbnN0OworICAgIHZvaWQgRWxpbWluYXRlTW9zdGx5RW1wdHlCbG9jayhCYXNpY0Jsb2NrICpCQik7CisgICAgYm9vbCBPcHRpbWl6ZUJsb2NrKEJhc2ljQmxvY2sgJkJCKTsKKyAgICBib29sIE9wdGltaXplTWVtb3J5SW5zdChJbnN0cnVjdGlvbiAqSSwgVmFsdWUgKkFkZHIsIGNvbnN0IFR5cGUgKkFjY2Vzc1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFZhbHVlKixWYWx1ZSo+ICZTdW5rQWRkcnMpOworICAgIGJvb2wgT3B0aW1pemVJbmxpbmVBc21JbnN0KEluc3RydWN0aW9uICpJLCBDYWxsU2l0ZSBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxWYWx1ZSosVmFsdWUqPiAmU3Vua0FkZHJzKTsKKyAgICBib29sIE9wdGltaXplQ2FsbEluc3QoQ2FsbEluc3QgKkNJKTsKKyAgICBib29sIE1vdmVFeHRUb0Zvcm1FeHRMb2FkKEluc3RydWN0aW9uICpJKTsKKyAgICBib29sIE9wdGltaXplRXh0VXNlcyhJbnN0cnVjdGlvbiAqSSk7CisgICAgdm9pZCBmaW5kTG9vcEJhY2tFZGdlcyhjb25zdCBGdW5jdGlvbiAmRik7CisgIH07Cit9CisKK2NoYXIgQ29kZUdlblByZXBhcmU6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhDb2RlR2VuUHJlcGFyZSwgImNvZGVnZW5wcmVwYXJlIiwKKyAgICAgICAgICAgICAgICAiT3B0aW1pemUgZm9yIGNvZGUgZ2VuZXJhdGlvbiIsIGZhbHNlLCBmYWxzZSk7CisKK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlQ29kZUdlblByZXBhcmVQYXNzKGNvbnN0IFRhcmdldExvd2VyaW5nICpUTEkpIHsKKyAgcmV0dXJuIG5ldyBDb2RlR2VuUHJlcGFyZShUTEkpOworfQorCisvLy8gZmluZExvb3BCYWNrRWRnZXMgLSBEbyBhIERGUyB3YWxrIHRvIGZpbmQgbG9vcCBiYWNrIGVkZ2VzLgorLy8vCit2b2lkIENvZGVHZW5QcmVwYXJlOjpmaW5kTG9vcEJhY2tFZGdlcyhjb25zdCBGdW5jdGlvbiAmRikgeworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgQmFzaWNCbG9jayosY29uc3QgQmFzaWNCbG9jayo+LCAzMj4gRWRnZXM7CisgIEZpbmRGdW5jdGlvbkJhY2tlZGdlcyhGLCBFZGdlcyk7CisgIAorICBCYWNrRWRnZXMuaW5zZXJ0KEVkZ2VzLmJlZ2luKCksIEVkZ2VzLmVuZCgpKTsKK30KKworCitib29sIENvZGVHZW5QcmVwYXJlOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgIGJvb2wgRXZlck1hZGVDaGFuZ2UgPSBmYWxzZTsKKworICBQRkkgPSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFByb2ZpbGVJbmZvPigpOworICAvLyBGaXJzdCBwYXNzLCBlbGltaW5hdGUgYmxvY2tzIHRoYXQgY29udGFpbiBvbmx5IFBISSBub2RlcyBhbmQgYW4KKyAgLy8gdW5jb25kaXRpb25hbCBicmFuY2guCisgIEV2ZXJNYWRlQ2hhbmdlIHw9IEVsaW1pbmF0ZU1vc3RseUVtcHR5QmxvY2tzKEYpOworCisgIC8vIE5vdyBmaW5kIGxvb3AgYmFjayBlZGdlcy4KKyAgZmluZExvb3BCYWNrRWRnZXMoRik7CisKKyAgYm9vbCBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgd2hpbGUgKE1hZGVDaGFuZ2UpIHsKKyAgICBNYWRlQ2hhbmdlID0gZmFsc2U7CisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBCQiAhPSBFOyArK0JCKQorICAgICAgTWFkZUNoYW5nZSB8PSBPcHRpbWl6ZUJsb2NrKCpCQik7CisgICAgRXZlck1hZGVDaGFuZ2UgfD0gTWFkZUNoYW5nZTsKKyAgfQorICByZXR1cm4gRXZlck1hZGVDaGFuZ2U7Cit9CisKKy8vLyBFbGltaW5hdGVNb3N0bHlFbXB0eUJsb2NrcyAtIGVsaW1pbmF0ZSBibG9ja3MgdGhhdCBjb250YWluIG9ubHkgUEhJIG5vZGVzLAorLy8vIGRlYnVnIGluZm8gZGlyZWN0aXZlcywgYW5kIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgUGFzc2VzIGJlZm9yZSBpc2VsCisvLy8gKGUuZy4gTFNSL2xvb3BzaW1wbGlmeSkgb2Z0ZW4gc3BsaXQgZWRnZXMgaW4gd2F5cyB0aGF0IGFyZSBub24tb3B0aW1hbCBmb3IKKy8vLyBpc2VsLiAgU3RhcnQgYnkgZWxpbWluYXRpbmcgdGhlc2UgYmxvY2tzIHNvIHdlIGNhbiBzcGxpdCB0aGVtIHRoZSB3YXkgd2UKKy8vLyB3YW50IHRoZW0uCitib29sIENvZGVHZW5QcmVwYXJlOjpFbGltaW5hdGVNb3N0bHlFbXB0eUJsb2NrcyhGdW5jdGlvbiAmRikgeworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgLy8gTm90ZSB0aGF0IHRoaXMgaW50ZW50aW9uYWxseSBza2lwcyB0aGUgZW50cnkgYmxvY2suCisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSArK0YuYmVnaW4oKSwgRSA9IEYuZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgQmFzaWNCbG9jayAqQkIgPSBJKys7CisKKyAgICAvLyBJZiB0aGlzIGJsb2NrIGRvZXNuJ3QgZW5kIHdpdGggYW4gdW5jb25kIGJyYW5jaCwgaWdub3JlIGl0LgorICAgIEJyYW5jaEluc3QgKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oQkItPmdldFRlcm1pbmF0b3IoKSk7CisgICAgaWYgKCFCSSB8fCAhQkktPmlzVW5jb25kaXRpb25hbCgpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBicmFuY2ggKHNraXBwaW5nIGRlYnVnIGluZm8pIGlzbid0IGEgcGhpCisgICAgLy8gbm9kZSwgdGhlbiBvdGhlciBzdHVmZiBpcyBoYXBwZW5pbmcgaGVyZS4KKyAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSBCSTsKKyAgICBpZiAoQkJJICE9IEJCLT5iZWdpbigpKSB7CisgICAgICAtLUJCSTsKKyAgICAgIHdoaWxlIChJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoQkJJKSkgeworICAgICAgICBpZiAoQkJJID09IEJCLT5iZWdpbigpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICAtLUJCSTsKKyAgICAgIH0KKyAgICAgIGlmICghSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEJCSSkgJiYgIWlzYTxQSElOb2RlPihCQkkpKQorICAgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYnJlYWsgaW5maW5pdGUgbG9vcHMuCisgICAgQmFzaWNCbG9jayAqRGVzdEJCID0gQkktPmdldFN1Y2Nlc3NvcigwKTsKKyAgICBpZiAoRGVzdEJCID09IEJCKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIUNhbk1lcmdlQmxvY2tzKEJCLCBEZXN0QkIpKQorICAgICAgY29udGludWU7CisKKyAgICBFbGltaW5hdGVNb3N0bHlFbXB0eUJsb2NrKEJCKTsKKyAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgfQorICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworLy8vIENhbk1lcmdlQmxvY2tzIC0gUmV0dXJuIHRydWUgaWYgd2UgY2FuIG1lcmdlIEJCIGludG8gRGVzdEJCIGlmIHRoZXJlIGlzIGEKKy8vLyBzaW5nbGUgdW5jb25kIGJyYW5jaCBiZXR3ZWVuIHRoZW0sIGFuZCBCQiBjb250YWlucyBubyBvdGhlciBub24tcGhpCisvLy8gaW5zdHJ1Y3Rpb25zLgorYm9vbCBDb2RlR2VuUHJlcGFyZTo6Q2FuTWVyZ2VCbG9ja3MoY29uc3QgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrICpEZXN0QkIpIGNvbnN0IHsKKyAgLy8gV2Ugb25seSB3YW50IHRvIGVsaW1pbmF0ZSBibG9ja3Mgd2hvc2UgcGhpIG5vZGVzIGFyZSB1c2VkIGJ5IHBoaSBub2RlcyBpbgorICAvLyB0aGUgc3VjY2Vzc29yLiAgSWYgdGhlcmUgYXJlIG1vcmUgY29tcGxleCBjb25kaXRpb24gKGUuZy4gcHJlaGVhZGVycyksCisgIC8vIGRvbid0IG1lc3MgYXJvdW5kIHdpdGggdGhlbS4KKyAgQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgQkJJID0gQkItPmJlZ2luKCk7CisgIHdoaWxlIChjb25zdCBQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEJCSSsrKSkgeworICAgIGZvciAoVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvciBVSSA9IFBOLT51c2VfYmVnaW4oKSwgRSA9IFBOLT51c2VfZW5kKCk7CisgICAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqVXNlciA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSk7CisgICAgICBpZiAoVXNlci0+Z2V0UGFyZW50KCkgIT0gRGVzdEJCIHx8ICFpc2E8UEhJTm9kZT4oVXNlcikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIC8vIElmIFVzZXIgaXMgaW5zaWRlIERlc3RCQiBibG9jayBhbmQgaXQgaXMgYSBQSElOb2RlIHRoZW4gY2hlY2sKKyAgICAgIC8vIGluY29taW5nIHZhbHVlLiBJZiBpbmNvbWluZyB2YWx1ZSBpcyBub3QgZnJvbSBCQiB0aGVuIHRoaXMgaXMKKyAgICAgIC8vIGEgY29tcGxleCBjb25kaXRpb24gKGUuZy4gcHJlaGVhZGVycykgd2Ugd2FudCB0byBhdm9pZCBoZXJlLgorICAgICAgaWYgKFVzZXItPmdldFBhcmVudCgpID09IERlc3RCQikgeworICAgICAgICBpZiAoY29uc3QgUEhJTm9kZSAqVVBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVXNlcikpCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFVQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNuID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFVQTi0+Z2V0SW5jb21pbmdWYWx1ZShJKSk7CisgICAgICAgICAgICBpZiAoSW5zbiAmJiBJbnNuLT5nZXRQYXJlbnQoKSA9PSBCQiAmJgorICAgICAgICAgICAgICAgIEluc24tPmdldFBhcmVudCgpICE9IFVQTi0+Z2V0SW5jb21pbmdCbG9jayhJKSkKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBJZiBCQiBhbmQgRGVzdEJCIGNvbnRhaW4gYW55IGNvbW1vbiBwcmVkZWNlc3NvcnMsIHRoZW4gdGhlIHBoaSBub2RlcyBpbiBCQgorICAvLyBhbmQgRGVzdEJCIG1heSBoYXZlIGNvbmZsaWN0aW5nIGluY29taW5nIHZhbHVlcyBmb3IgdGhlIGJsb2NrLiAgSWYgc28sIHdlCisgIC8vIGNhbid0IG1lcmdlIHRoZSBibG9jay4KKyAgY29uc3QgUEhJTm9kZSAqRGVzdEJCUE4gPSBkeW5fY2FzdDxQSElOb2RlPihEZXN0QkItPmJlZ2luKCkpOworICBpZiAoIURlc3RCQlBOKSByZXR1cm4gdHJ1ZTsgIC8vIG5vIGNvbmZsaWN0LgorCisgIC8vIENvbGxlY3QgdGhlIHByZWRzIG9mIEJCLgorICBTbWFsbFB0clNldDxjb25zdCBCYXNpY0Jsb2NrKiwgMTY+IEJCUHJlZHM7CisgIGlmIChjb25zdCBQSElOb2RlICpCQlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oQkItPmJlZ2luKCkpKSB7CisgICAgLy8gSXQgaXMgZmFzdGVyIHRvIGdldCBwcmVkcyBmcm9tIGEgUEhJIHRoYW4gd2l0aCBwcmVkX2l0ZXJhdG9yLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCQlBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICAgIEJCUHJlZHMuaW5zZXJ0KEJCUE4tPmdldEluY29taW5nQmxvY2soaSkpOworICB9IGVsc2UgeworICAgIEJCUHJlZHMuaW5zZXJ0KHByZWRfYmVnaW4oQkIpLCBwcmVkX2VuZChCQikpOworICB9CisKKyAgLy8gV2FsayB0aGUgcHJlZHMgb2YgRGVzdEJCLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVzdEJCUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQmFzaWNCbG9jayAqUHJlZCA9IERlc3RCQlBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpOworICAgIGlmIChCQlByZWRzLmNvdW50KFByZWQpKSB7ICAgLy8gQ29tbW9uIHByZWRlY2Vzc29yPworICAgICAgQkJJID0gRGVzdEJCLT5iZWdpbigpOworICAgICAgd2hpbGUgKGNvbnN0IFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oQkJJKyspKSB7CisgICAgICAgIGNvbnN0IFZhbHVlICpWMSA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soUHJlZCk7CisgICAgICAgIGNvbnN0IFZhbHVlICpWMiA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soQkIpOworCisgICAgICAgIC8vIElmIFYyIGlzIGEgcGhpIG5vZGUgaW4gQkIsIGxvb2sgdXAgd2hhdCB0aGUgbWFwcGVkIHZhbHVlIHdpbGwgYmUuCisgICAgICAgIGlmIChjb25zdCBQSElOb2RlICpWMlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVjIpKQorICAgICAgICAgIGlmIChWMlBOLT5nZXRQYXJlbnQoKSA9PSBCQikKKyAgICAgICAgICAgIFYyID0gVjJQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKFByZWQpOworCisgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY29uZmxpY3QsIGJhaWwgb3V0LgorICAgICAgICBpZiAoVjEgIT0gVjIpIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8gRWxpbWluYXRlTW9zdGx5RW1wdHlCbG9jayAtIEVsaW1pbmF0ZSBhIGJhc2ljIGJsb2NrIHRoYXQgaGF2ZSBvbmx5IHBoaSdzIGFuZAorLy8vIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIGluIGl0Lgordm9pZCBDb2RlR2VuUHJlcGFyZTo6RWxpbWluYXRlTW9zdGx5RW1wdHlCbG9jayhCYXNpY0Jsb2NrICpCQikgeworICBCcmFuY2hJbnN0ICpCSSA9IGNhc3Q8QnJhbmNoSW5zdD4oQkItPmdldFRlcm1pbmF0b3IoKSk7CisgIEJhc2ljQmxvY2sgKkRlc3RCQiA9IEJJLT5nZXRTdWNjZXNzb3IoMCk7CisKKyAgREVCVUcoZGJncygpIDw8ICJNRVJHSU5HIE1PU1RMWSBFTVBUWSBCTE9DS1MgLSBCRUZPUkU6XG4iIDw8ICpCQiA8PCAqRGVzdEJCKTsKKworICAvLyBJZiB0aGUgZGVzdGluYXRpb24gYmxvY2sgaGFzIGEgc2luZ2xlIHByZWQsIHRoZW4gdGhpcyBpcyBhIHRyaXZpYWwgZWRnZSwKKyAgLy8ganVzdCBjb2xsYXBzZSBpdC4KKyAgaWYgKEJhc2ljQmxvY2sgKlNpbmdsZVByZWQgPSBEZXN0QkItPmdldFNpbmdsZVByZWRlY2Vzc29yKCkpIHsKKyAgICBpZiAoU2luZ2xlUHJlZCAhPSBEZXN0QkIpIHsKKyAgICAgIC8vIFJlbWVtYmVyIGlmIFNpbmdsZVByZWQgd2FzIHRoZSBlbnRyeSBibG9jayBvZiB0aGUgZnVuY3Rpb24uICBJZiBzbywgd2UKKyAgICAgIC8vIHdpbGwgbmVlZCB0byBtb3ZlIEJCIGJhY2sgdG8gdGhlIGVudHJ5IHBvc2l0aW9uLgorICAgICAgYm9vbCBpc0VudHJ5ID0gU2luZ2xlUHJlZCA9PSAmU2luZ2xlUHJlZC0+Z2V0UGFyZW50KCktPmdldEVudHJ5QmxvY2soKTsKKyAgICAgIE1lcmdlQmFzaWNCbG9ja0ludG9Pbmx5UHJlZChEZXN0QkIsIHRoaXMpOworCisgICAgICBpZiAoaXNFbnRyeSAmJiBCQiAhPSAmQkItPmdldFBhcmVudCgpLT5nZXRFbnRyeUJsb2NrKCkpCisgICAgICAgIEJCLT5tb3ZlQmVmb3JlKCZCQi0+Z2V0UGFyZW50KCktPmdldEVudHJ5QmxvY2soKSk7CisgICAgICAKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQUZURVI6XG4iIDw8ICpEZXN0QkIgPDwgIlxuXG5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSBtdWx0aXBsZSBwcmVkZWNlc3NvcnMgb2YgQkIuICBVcGRhdGUgdGhlIFBISXMgaW4gRGVzdEJCCisgIC8vIHRvIGhhbmRsZSB0aGUgbmV3IGluY29taW5nIGVkZ2VzIGl0IGlzIGFib3V0IHRvIGhhdmUuCisgIFBISU5vZGUgKlBOOworICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9IERlc3RCQi0+YmVnaW4oKTsKKyAgICAgICAoUE4gPSBkeW5fY2FzdDxQSElOb2RlPihCQkkpKTsgKytCQkkpIHsKKyAgICAvLyBSZW1vdmUgdGhlIGluY29taW5nIHZhbHVlIGZvciBCQiwgYW5kIHJlbWVtYmVyIGl0LgorICAgIFZhbHVlICpJblZhbCA9IFBOLT5yZW1vdmVJbmNvbWluZ1ZhbHVlKEJCLCBmYWxzZSk7CisKKyAgICAvLyBUd28gb3B0aW9uczogZWl0aGVyIHRoZSBJblZhbCBpcyBhIHBoaSBub2RlIGRlZmluZWQgaW4gQkIgb3IgaXQgaXMgc29tZQorICAgIC8vIHZhbHVlIHRoYXQgZG9taW5hdGVzIEJCLgorICAgIFBISU5vZGUgKkluVmFsUGhpID0gZHluX2Nhc3Q8UEhJTm9kZT4oSW5WYWwpOworICAgIGlmIChJblZhbFBoaSAmJiBJblZhbFBoaS0+Z2V0UGFyZW50KCkgPT0gQkIpIHsKKyAgICAgIC8vIEFkZCBhbGwgb2YgdGhlIGlucHV0IHZhbHVlcyBvZiB0aGUgaW5wdXQgUEhJIGFzIGlucHV0cyBvZiB0aGlzIHBoaS4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJblZhbFBoaS0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIFBOLT5hZGRJbmNvbWluZyhJblZhbFBoaS0+Z2V0SW5jb21pbmdWYWx1ZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluVmFsUGhpLT5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gT3RoZXJ3aXNlLCBhZGQgb25lIGluc3RhbmNlIG9mIHRoZSBkb21pbmF0aW5nIHZhbHVlIGZvciBlYWNoIGVkZ2UgdGhhdAorICAgICAgLy8gd2Ugd2lsbCBiZSBhZGRpbmcuCisgICAgICBpZiAoUEhJTm9kZSAqQkJQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEJCLT5iZWdpbigpKSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQkJQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgUE4tPmFkZEluY29taW5nKEluVmFsLCBCQlBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAocHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oQkIpLCBFID0gcHJlZF9lbmQoQkIpOyBQSSAhPSBFOyArK1BJKQorICAgICAgICAgIFBOLT5hZGRJbmNvbWluZyhJblZhbCwgKlBJKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBUaGUgUEhJcyBhcmUgbm93IHVwZGF0ZWQsIGNoYW5nZSBldmVyeXRoaW5nIHRoYXQgcmVmZXJzIHRvIEJCIHRvIHVzZQorICAvLyBEZXN0QkIgYW5kIHJlbW92ZSBCQi4KKyAgQkItPnJlcGxhY2VBbGxVc2VzV2l0aChEZXN0QkIpOworICBpZiAoUEZJKSB7CisgICAgUEZJLT5yZXBsYWNlQWxsVXNlcyhCQiwgRGVzdEJCKTsKKyAgICBQRkktPnJlbW92ZUVkZ2UoUHJvZmlsZUluZm86OmdldEVkZ2UoQkIsIERlc3RCQikpOworICB9CisgIEJCLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICBERUJVRyhkYmdzKCkgPDwgIkFGVEVSOlxuIiA8PCAqRGVzdEJCIDw8ICJcblxuXG4iKTsKK30KKworLy8vIEZpbmRSZXVzYWJsZVByZWRCQiAtIENoZWNrIGFsbCBvZiB0aGUgcHJlZGVjZXNzb3JzIG9mIHRoZSBibG9jayBEZXN0UEhJCisvLy8gbGl2ZXMgaW4gdG8gc2VlIGlmIHRoZXJlIGlzIGEgYmxvY2sgdGhhdCB3ZSBjYW4gcmV1c2UgYXMgYSBjcml0aWNhbCBlZGdlCisvLy8gZnJvbSBUSUJCLgorc3RhdGljIEJhc2ljQmxvY2sgKkZpbmRSZXVzYWJsZVByZWRCQihQSElOb2RlICpEZXN0UEhJLCBCYXNpY0Jsb2NrICpUSUJCKSB7CisgIEJhc2ljQmxvY2sgKkRlc3QgPSBEZXN0UEhJLT5nZXRQYXJlbnQoKTsKKyAgCisgIC8vLyBUSVBISVZhbHVlcyAtIFRoaXMgYXJyYXkgaXMgbGF6aWx5IGNvbXB1dGVkIHRvIGRldGVybWluZSB0aGUgdmFsdWVzIG9mCisgIC8vLyBQSElzIGluIERlc3QgdGhhdCBUSSB3b3VsZCBwcm92aWRlLgorICBTbWFsbFZlY3RvcjxWYWx1ZSosIDMyPiBUSVBISVZhbHVlczsKKyAgCisgIC8vLyBUSUJCRW50cnlObyAtIFRoaXMgaXMgYSBjYWNoZSB0byBzcGVlZCB1cCBwcmVkIHF1ZXJpZXMgZm9yIFRJQkIuCisgIHVuc2lnbmVkIFRJQkJFbnRyeU5vID0gMDsKKyAgCisgIC8vIENoZWNrIHRvIHNlZSBpZiBEZXN0IGhhcyBhbnkgYmxvY2tzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBzcGxpdCBlZGdlIGZvcgorICAvLyB0aGlzIHRlcm1pbmF0b3IuCisgIGZvciAodW5zaWduZWQgcGkgPSAwLCBlID0gRGVzdFBISS0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgcGkgIT0gZTsgKytwaSkgeworICAgIEJhc2ljQmxvY2sgKlByZWQgPSBEZXN0UEhJLT5nZXRJbmNvbWluZ0Jsb2NrKHBpKTsKKyAgICAvLyBUbyBiZSB1c2FibGUsIHRoZSBwcmVkIGhhcyB0byBlbmQgd2l0aCBhbiB1bmNvbmQgYnJhbmNoIHRvIHRoZSBkZXN0LgorICAgIEJyYW5jaEluc3QgKlByZWRCciA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KFByZWQtPmdldFRlcm1pbmF0b3IoKSk7CisgICAgaWYgKCFQcmVkQnIgfHwgIVByZWRCci0+aXNVbmNvbmRpdGlvbmFsKCkpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBNdXN0IGJlIGVtcHR5IG90aGVyIHRoYW4gdGhlIGJyYW5jaCBhbmQgZGVidWcgaW5mby4KKyAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gUHJlZC0+YmVnaW4oKTsKKyAgICB3aGlsZSAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEkpKQorICAgICAgSSsrOworICAgIGlmICgmKkkgIT0gUHJlZEJyKQorICAgICAgY29udGludWU7CisgICAgLy8gQ2Fubm90IGJlIHRoZSBlbnRyeSBibG9jazsgaXRzIGxhYmVsIGRvZXMgbm90IGdldCBlbWl0dGVkLgorICAgIGlmIChQcmVkID09ICZEZXN0LT5nZXRQYXJlbnQoKS0+Z2V0RW50cnlCbG9jaygpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgLy8gRmluYWxseSwgc2luY2Ugd2Uga25vdyB0aGF0IERlc3QgaGFzIHBoaSBub2RlcyBpbiBpdCwgd2UgaGF2ZSB0byBtYWtlCisgICAgLy8gc3VyZSB0aGF0IGp1bXBpbmcgdG8gUHJlZCB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzIGdvaW5nIHRvIERlc3QgaW4KKyAgICAvLyB0ZXJtcyBvZiBQSEkgdmFsdWVzLgorICAgIFBISU5vZGUgKlBOOworICAgIHVuc2lnbmVkIFBISU5vID0gMDsKKyAgICB1bnNpZ25lZCBQcmVkRW50cnlObyA9IHBpOworICAgIAorICAgIGJvb2wgRm91bmRNYXRjaCA9IHRydWU7CisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gRGVzdC0+YmVnaW4oKTsKKyAgICAgICAgIChQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEkpKTsgKytJLCArK1BISU5vKSB7CisgICAgICBpZiAoUEhJTm8gPT0gVElQSElWYWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgIGlmIChQTi0+Z2V0SW5jb21pbmdCbG9jayhUSUJCRW50cnlObykgIT0gVElCQikKKyAgICAgICAgICBUSUJCRW50cnlObyA9IFBOLT5nZXRCYXNpY0Jsb2NrSW5kZXgoVElCQik7CisgICAgICAgIFRJUEhJVmFsdWVzLnB1c2hfYmFjayhQTi0+Z2V0SW5jb21pbmdWYWx1ZShUSUJCRW50cnlObykpOworICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiB0aGUgUEhJIGVudHJ5IGRvZXNuJ3Qgd29yaywgd2UgY2FuJ3QgdXNlIHRoaXMgcHJlZC4KKyAgICAgIGlmIChQTi0+Z2V0SW5jb21pbmdCbG9jayhQcmVkRW50cnlObykgIT0gUHJlZCkKKyAgICAgICAgUHJlZEVudHJ5Tm8gPSBQTi0+Z2V0QmFzaWNCbG9ja0luZGV4KFByZWQpOworICAgICAgCisgICAgICBpZiAoVElQSElWYWx1ZXNbUEhJTm9dICE9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlKFByZWRFbnRyeU5vKSkgeworICAgICAgICBGb3VuZE1hdGNoID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIHdvcmthYmxlIHByZWRlY2Vzc29yLCBjaGFuZ2UgVEkgdG8gYnJhbmNoIHRvIFN1Y2MuCisgICAgaWYgKEZvdW5kTWF0Y2gpCisgICAgICByZXR1cm4gUHJlZDsKKyAgfQorICByZXR1cm4gMDsgIAorfQorCisKKy8vLyBTcGxpdEVkZ2VOaWNlbHkgLSBTcGxpdCB0aGUgY3JpdGljYWwgZWRnZSBmcm9tIFRJIHRvIGl0cyBzcGVjaWZpZWQKKy8vLyBzdWNjZXNzb3IgaWYgaXQgd2lsbCBpbXByb3ZlIGNvZGVnZW4uICBXZSBvbmx5IGRvIHRoaXMgaWYgdGhlIHN1Y2Nlc3NvciBoYXMKKy8vLyBwaGkgbm9kZXMgKG90aGVyd2lzZSBjcml0aWNhbCBlZGdlcyBhcmUgb2spLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhbm90aGVyCisvLy8gcHJlZGVjZXNzb3Igb2YgdGhlIHN1Y2MgdGhhdCBpcyBlbXB0eSAoYW5kIHRodXMgaGFzIG5vIHBoaSBub2RlcyksIHVzZSBpdAorLy8vIGluc3RlYWQgb2YgaW50cm9kdWNpbmcgYSBuZXcgYmxvY2suCitzdGF0aWMgdm9pZCBTcGxpdEVkZ2VOaWNlbHkoVGVybWluYXRvckluc3QgKlRJLCB1bnNpZ25lZCBTdWNjTnVtLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxTZXQ8c3RkOjpwYWlyPGNvbnN0IEJhc2ljQmxvY2sqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2ljQmxvY2sqPiwgOD4gJkJhY2tFZGdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzcyAqUCkgeworICBCYXNpY0Jsb2NrICpUSUJCID0gVEktPmdldFBhcmVudCgpOworICBCYXNpY0Jsb2NrICpEZXN0ID0gVEktPmdldFN1Y2Nlc3NvcihTdWNjTnVtKTsKKyAgYXNzZXJ0KGlzYTxQSElOb2RlPihEZXN0LT5iZWdpbigpKSAmJgorICAgICAgICAgIlRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIERlc3QgaGFzIGEgUEhJISIpOworICBQSElOb2RlICpEZXN0UEhJID0gY2FzdDxQSElOb2RlPihEZXN0LT5iZWdpbigpKTsKKworICAvLyBBcyBhIGhhY2ssIG5ldmVyIHNwbGl0IGJhY2tlZGdlcyBvZiBsb29wcy4gIEV2ZW4gdGhvdWdoIHRoZSBjb3B5IGZvciBhbnkKKyAgLy8gUEhJcyBpbnNlcnRlZCBvbiB0aGUgYmFja2VkZ2Ugd291bGQgYmUgZGVhZCBmb3IgZXhpdHMgZnJvbSB0aGUgbG9vcCwgd2UKKyAgLy8gYXNzdW1lIHRoYXQgdGhlIGNvc3Qgb2YgKnNwbGl0dGluZyogdGhlIGJhY2tlZGdlIHdvdWxkIGJlIHRvbyBoaWdoLgorICBpZiAoQmFja0VkZ2VzLmNvdW50KHN0ZDo6bWFrZV9wYWlyKFRJQkIsIERlc3QpKSkKKyAgICByZXR1cm47CisKKyAgaWYgKEJhc2ljQmxvY2sgKlJldXNlQkIgPSBGaW5kUmV1c2FibGVQcmVkQkIoRGVzdFBISSwgVElCQikpIHsKKyAgICBQcm9maWxlSW5mbyAqUEZJID0gUC0+Z2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxQcm9maWxlSW5mbz4oKTsKKyAgICBpZiAoUEZJKQorICAgICAgUEZJLT5zcGxpdEVkZ2UoVElCQiwgRGVzdCwgUmV1c2VCQik7CisgICAgRGVzdC0+cmVtb3ZlUHJlZGVjZXNzb3IoVElCQik7CisgICAgVEktPnNldFN1Y2Nlc3NvcihTdWNjTnVtLCBSZXVzZUJCKTsKKyAgICByZXR1cm47CisgIH0KKworICBTcGxpdENyaXRpY2FsRWRnZShUSSwgU3VjY051bSwgUCwgdHJ1ZSk7Cit9CisKKworLy8vIE9wdGltaXplTm9vcENvcHlFeHByZXNzaW9uIC0gSWYgdGhlIHNwZWNpZmllZCBjYXN0IGluc3RydWN0aW9uIGlzIGEgbm9vcAorLy8vIGNvcHkgKGUuZy4gaXQncyBjYXN0aW5nIGZyb20gb25lIHBvaW50ZXIgdHlwZSB0byBhbm90aGVyLCBpMzItPmk4IG9uIFBQQyksCisvLy8gc2luayBpdCBpbnRvIHVzZXIgYmxvY2tzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHZpcnR1YWwKKy8vLyByZWdpc3RlcnMgdGhhdCBtdXN0IGJlIGNyZWF0ZWQgYW5kIGNvYWxlc2NlZC4KKy8vLworLy8vIFJldHVybiB0cnVlIGlmIGFueSBjaGFuZ2VzIGFyZSBtYWRlLgorLy8vCitzdGF0aWMgYm9vbCBPcHRpbWl6ZU5vb3BDb3B5RXhwcmVzc2lvbihDYXN0SW5zdCAqQ0ksIGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEkpeworICAvLyBJZiB0aGlzIGlzIGEgbm9vcCBjb3B5LAorICBFVlQgU3JjVlQgPSBUTEkuZ2V0VmFsdWVUeXBlKENJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpOworICBFVlQgRHN0VlQgPSBUTEkuZ2V0VmFsdWVUeXBlKENJLT5nZXRUeXBlKCkpOworCisgIC8vIFRoaXMgaXMgYW4gZnA8LT5pbnQgY29udmVyc2lvbj8KKyAgaWYgKFNyY1ZULmlzSW50ZWdlcigpICE9IERzdFZULmlzSW50ZWdlcigpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGlzIGlzIGFuIGV4dGVuc2lvbiwgaXQgd2lsbCBiZSBhIHplcm8gb3Igc2lnbiBleHRlbnNpb24sIHdoaWNoCisgIC8vIGlzbid0IGEgbm9vcC4KKyAgaWYgKFNyY1ZULmJpdHNMVChEc3RWVCkpIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB0aGVzZSB2YWx1ZXMgd2lsbCBiZSBwcm9tb3RlZCwgZmluZCBvdXQgd2hhdCB0aGV5IHdpbGwgYmUgcHJvbW90ZWQKKyAgLy8gdG8uICBUaGlzIGhlbHBzIHVzIGNvbnNpZGVyIHRydW5jYXRlcyBvbiBQUEMgYXMgbm9vcCBjb3BpZXMgd2hlbiB0aGV5CisgIC8vIGFyZS4KKyAgaWYgKFRMSS5nZXRUeXBlQWN0aW9uKENJLT5nZXRDb250ZXh0KCksIFNyY1ZUKSA9PSBUYXJnZXRMb3dlcmluZzo6UHJvbW90ZSkKKyAgICBTcmNWVCA9IFRMSS5nZXRUeXBlVG9UcmFuc2Zvcm1UbyhDSS0+Z2V0Q29udGV4dCgpLCBTcmNWVCk7CisgIGlmIChUTEkuZ2V0VHlwZUFjdGlvbihDSS0+Z2V0Q29udGV4dCgpLCBEc3RWVCkgPT0gVGFyZ2V0TG93ZXJpbmc6OlByb21vdGUpCisgICAgRHN0VlQgPSBUTEkuZ2V0VHlwZVRvVHJhbnNmb3JtVG8oQ0ktPmdldENvbnRleHQoKSwgRHN0VlQpOworCisgIC8vIElmLCBhZnRlciBwcm9tb3Rpb24sIHRoZXNlIGFyZSB0aGUgc2FtZSB0eXBlcywgdGhpcyBpcyBhIG5vb3AgY29weS4KKyAgaWYgKFNyY1ZUICE9IERzdFZUKQorICAgIHJldHVybiBmYWxzZTsKKworICBCYXNpY0Jsb2NrICpEZWZCQiA9IENJLT5nZXRQYXJlbnQoKTsKKworICAvLy8gSW5zZXJ0ZWRDYXN0cyAtIE9ubHkgaW5zZXJ0IGEgY2FzdCBpbiBlYWNoIGJsb2NrIG9uY2UuCisgIERlbnNlTWFwPEJhc2ljQmxvY2sqLCBDYXN0SW5zdCo+IEluc2VydGVkQ2FzdHM7CisKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IENJLT51c2VfYmVnaW4oKSwgRSA9IENJLT51c2VfZW5kKCk7CisgICAgICAgVUkgIT0gRTsgKSB7CisgICAgVXNlICZUaGVVc2UgPSBVSS5nZXRVc2UoKTsKKyAgICBJbnN0cnVjdGlvbiAqVXNlciA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSk7CisKKyAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIEJCIHRoaXMgY2FzdCBpcyB1c2VkIGluLiAgRm9yIFBISSdzIHRoaXMgaXMgdGhlCisgICAgLy8gYXBwcm9wcmlhdGUgcHJlZGVjZXNzb3IgYmxvY2suCisgICAgQmFzaWNCbG9jayAqVXNlckJCID0gVXNlci0+Z2V0UGFyZW50KCk7CisgICAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVXNlcikpIHsKKyAgICAgIFVzZXJCQiA9IFBOLT5nZXRJbmNvbWluZ0Jsb2NrKFVJKTsKKyAgICB9CisKKyAgICAvLyBQcmVpbmNyZW1lbnQgdXNlIGl0ZXJhdG9yIHNvIHdlIGRvbid0IGludmFsaWRhdGUgaXQuCisgICAgKytVSTsKKworICAgIC8vIElmIHRoaXMgdXNlciBpcyBpbiB0aGUgc2FtZSBibG9jayBhcyB0aGUgY2FzdCwgZG9uJ3QgY2hhbmdlIHRoZSBjYXN0LgorICAgIGlmIChVc2VyQkIgPT0gRGVmQkIpIGNvbnRpbnVlOworCisgICAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGluc2VydGVkIGEgY2FzdCBpbnRvIHRoaXMgYmxvY2ssIHVzZSBpdC4KKyAgICBDYXN0SW5zdCAqJkluc2VydGVkQ2FzdCA9IEluc2VydGVkQ2FzdHNbVXNlckJCXTsKKworICAgIGlmICghSW5zZXJ0ZWRDYXN0KSB7CisgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdCA9IFVzZXJCQi0+Z2V0Rmlyc3ROb25QSEkoKTsKKworICAgICAgSW5zZXJ0ZWRDYXN0ID0KKyAgICAgICAgQ2FzdEluc3Q6OkNyZWF0ZShDSS0+Z2V0T3Bjb2RlKCksIENJLT5nZXRPcGVyYW5kKDApLCBDSS0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydFB0KTsKKyAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgIH0KKworICAgIC8vIFJlcGxhY2UgYSB1c2Ugb2YgdGhlIGNhc3Qgd2l0aCBhIHVzZSBvZiB0aGUgbmV3IGNhc3QuCisgICAgVGhlVXNlID0gSW5zZXJ0ZWRDYXN0OworICB9CisKKyAgLy8gSWYgd2UgcmVtb3ZlZCBhbGwgdXNlcywgbnVrZSB0aGUgY2FzdC4KKyAgaWYgKENJLT51c2VfZW1wdHkoKSkgeworICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisvLy8gT3B0aW1pemVDbXBFeHByZXNzaW9uIC0gc2luayB0aGUgZ2l2ZW4gQ21wSW5zdCBpbnRvIHVzZXIgYmxvY2tzIHRvIHJlZHVjZQorLy8vIHRoZSBudW1iZXIgb2YgdmlydHVhbCByZWdpc3RlcnMgdGhhdCBtdXN0IGJlIGNyZWF0ZWQgYW5kIGNvYWxlc2NlZC4gIFRoaXMgaXMKKy8vLyBhIGNsZWFyIHdpbiBleGNlcHQgb24gdGFyZ2V0cyB3aXRoIG11bHRpcGxlIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVycworLy8vICAoUG93ZXJQQyksIHdoZXJlIGl0IG1pZ2h0IGxvc2U7IHNvbWUgYWRqdXN0bWVudCBtYXkgYmUgd2FudGVkIHRoZXJlLgorLy8vCisvLy8gUmV0dXJuIHRydWUgaWYgYW55IGNoYW5nZXMgYXJlIG1hZGUuCitzdGF0aWMgYm9vbCBPcHRpbWl6ZUNtcEV4cHJlc3Npb24oQ21wSW5zdCAqQ0kpIHsKKyAgQmFzaWNCbG9jayAqRGVmQkIgPSBDSS0+Z2V0UGFyZW50KCk7CisKKyAgLy8vIEluc2VydGVkQ21wIC0gT25seSBpbnNlcnQgYSBjbXAgaW4gZWFjaCBibG9jayBvbmNlLgorICBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgQ21wSW5zdCo+IEluc2VydGVkQ21wczsKKworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gQ0ktPnVzZV9iZWdpbigpLCBFID0gQ0ktPnVzZV9lbmQoKTsKKyAgICAgICBVSSAhPSBFOyApIHsKKyAgICBVc2UgJlRoZVVzZSA9IFVJLmdldFVzZSgpOworICAgIEluc3RydWN0aW9uICpVc2VyID0gY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKworICAgIC8vIFByZWluY3JlbWVudCB1c2UgaXRlcmF0b3Igc28gd2UgZG9uJ3QgaW52YWxpZGF0ZSBpdC4KKyAgICArK1VJOworCisgICAgLy8gRG9uJ3QgYm90aGVyIGZvciBQSEkgbm9kZXMuCisgICAgaWYgKGlzYTxQSElOb2RlPihVc2VyKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gRmlndXJlIG91dCB3aGljaCBCQiB0aGlzIGNtcCBpcyB1c2VkIGluLgorICAgIEJhc2ljQmxvY2sgKlVzZXJCQiA9IFVzZXItPmdldFBhcmVudCgpOworCisgICAgLy8gSWYgdGhpcyB1c2VyIGlzIGluIHRoZSBzYW1lIGJsb2NrIGFzIHRoZSBjbXAsIGRvbid0IGNoYW5nZSB0aGUgY21wLgorICAgIGlmIChVc2VyQkIgPT0gRGVmQkIpIGNvbnRpbnVlOworCisgICAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGluc2VydGVkIGEgY21wIGludG8gdGhpcyBibG9jaywgdXNlIGl0LgorICAgIENtcEluc3QgKiZJbnNlcnRlZENtcCA9IEluc2VydGVkQ21wc1tVc2VyQkJdOworCisgICAgaWYgKCFJbnNlcnRlZENtcCkgeworICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQgPSBVc2VyQkItPmdldEZpcnN0Tm9uUEhJKCk7CisKKyAgICAgIEluc2VydGVkQ21wID0KKyAgICAgICAgQ21wSW5zdDo6Q3JlYXRlKENJLT5nZXRPcGNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENJLT5nZXRQcmVkaWNhdGUoKSwgIENJLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ktPmdldE9wZXJhbmQoMSksIEluc2VydFB0KTsKKyAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgIH0KKworICAgIC8vIFJlcGxhY2UgYSB1c2Ugb2YgdGhlIGNtcCB3aXRoIGEgdXNlIG9mIHRoZSBuZXcgY21wLgorICAgIFRoZVVzZSA9IEluc2VydGVkQ21wOworICB9CisKKyAgLy8gSWYgd2UgcmVtb3ZlZCBhbGwgdXNlcywgbnVrZSB0aGUgY21wLgorICBpZiAoQ0ktPnVzZV9lbXB0eSgpKQorICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworYm9vbCBDb2RlR2VuUHJlcGFyZTo6T3B0aW1pemVDYWxsSW5zdChDYWxsSW5zdCAqQ0kpIHsKKyAgLy8gTG93ZXIgYWxsIHVzZXMgb2YgbGx2bS5vYmplY3RzaXplLioKKyAgSW50cmluc2ljSW5zdCAqSUkgPSBkeW5fY2FzdDxJbnRyaW5zaWNJbnN0PihDSSk7CisgIGlmIChJSSAmJiBJSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Om9iamVjdHNpemUpIHsKKyAgICBib29sIE1pbiA9IChjYXN0PENvbnN0YW50SW50PihJSS0+Z2V0QXJnT3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpID09IDEpOworICAgIGNvbnN0IFR5cGUgKlJldHVyblR5ID0gQ0ktPmdldFR5cGUoKTsKKyAgICBDb25zdGFudCAqUmV0VmFsID0gQ29uc3RhbnRJbnQ6OmdldChSZXR1cm5UeSwgTWluID8gMCA6IC0xVUxMKTsgICAgCisgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChSZXRWYWwpOworICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgcmV0dXJuIGZhbHNlOworfQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1lbW9yeSBPcHRpbWl6YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBJc05vbkxvY2FsVmFsdWUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBhCisvLy8gZGlmZmVyZW50IGJhc2ljIGJsb2NrIHRoYW4gQkIuCitzdGF0aWMgYm9vbCBJc05vbkxvY2FsVmFsdWUoVmFsdWUgKlYsIEJhc2ljQmxvY2sgKkJCKSB7CisgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkKKyAgICByZXR1cm4gSS0+Z2V0UGFyZW50KCkgIT0gQkI7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIE9wdGltaXplTWVtb3J5SW5zdCAtIExvYWQgYW5kIFN0b3JlIEluc3RydWN0aW9ucyBvZnRlbiBoYXZlCisvLy8gYWRkcmVzc2luZyBtb2RlcyB0aGF0IGNhbiBkbyBzaWduaWZpY2FudCBhbW91bnRzIG9mIGNvbXB1dGF0aW9uLiAgQXMgc3VjaCwKKy8vLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gd2lsbCB0cnkgdG8gZ2V0IHRoZSBsb2FkIG9yIHN0b3JlIHRvIGRvIGFzIG11Y2gKKy8vLyBjb21wdXRhdGlvbiBhcyBwb3NzaWJsZSBmb3IgdGhlIHByb2dyYW0uICBUaGUgcHJvYmxlbSBpcyB0aGF0IGlzZWwgY2FuIG9ubHkKKy8vLyBzZWUgd2l0aGluIGEgc2luZ2xlIGJsb2NrLiAgQXMgc3VjaCwgd2Ugc2luayBhcyBtdWNoIGxlZ2FsIGFkZHJlc3NpbmcgbW9kZQorLy8vIHN0dWZmIGludG8gdGhlIGJsb2NrIGFzIHBvc3NpYmxlLgorLy8vCisvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBvcHRpbWl6ZSBib3RoIGxvYWQvc3RvcmUgYW5kIGlubGluZSBhc21zIHdpdGggbWVtb3J5CisvLy8gb3BlcmFuZHMuCitib29sIENvZGVHZW5QcmVwYXJlOjpPcHRpbWl6ZU1lbW9yeUluc3QoSW5zdHJ1Y3Rpb24gKk1lbW9yeUluc3QsIFZhbHVlICpBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKkFjY2Vzc1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFZhbHVlKixWYWx1ZSo+ICZTdW5rQWRkcnMpIHsKKyAgLy8gRmlndXJlIG91dCB3aGF0IGFkZHJlc3NpbmcgbW9kZSB3aWxsIGJlIGJ1aWx0IHVwIGZvciB0aGlzIG9wZXJhdGlvbi4KKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24qLCAxNj4gQWRkck1vZGVJbnN0czsKKyAgRXh0QWRkck1vZGUgQWRkck1vZGUgPSBBZGRyZXNzaW5nTW9kZU1hdGNoZXI6Ok1hdGNoKEFkZHIsIEFjY2Vzc1R5LE1lbW9yeUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTW9kZUluc3RzLCAqVExJKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZSBpbnN0cnVjdGlvbnMgc3VwZXJzdW1lZCBieSB0aGlzIGFkZHIgbW9kZSBhcmUKKyAgLy8gbm9uLWxvY2FsIHRvIEkncyBCQi4KKyAgYm9vbCBBbnlOb25Mb2NhbCA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQWRkck1vZGVJbnN0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKElzTm9uTG9jYWxWYWx1ZShBZGRyTW9kZUluc3RzW2ldLCBNZW1vcnlJbnN0LT5nZXRQYXJlbnQoKSkpIHsKKyAgICAgIEFueU5vbkxvY2FsID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIElmIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIG1hdGNoZWQgYXJlIGFscmVhZHkgaW4gdGhpcyBCQiwgZG9uJ3QgZG8gYW55dGhpbmcuCisgIGlmICghQW55Tm9uTG9jYWwpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkNHUDogRm91bmQgICAgICBsb2NhbCBhZGRybW9kZTogIiA8PCBBZGRyTW9kZSA8PCAiXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJbnNlcnQgdGhpcyBjb21wdXRhdGlvbiByaWdodCBhZnRlciB0aGlzIHVzZXIuICBTaW5jZSBvdXIgY2FsbGVyIGlzCisgIC8vIHNjYW5uaW5nIGZyb20gdGhlIHRvcCBvZiB0aGUgQkIgdG8gdGhlIGJvdHRvbSwgcmV1c2Ugb2YgdGhlIGV4cHIgYXJlCisgIC8vIGd1YXJhbnRlZWQgdG8gaGFwcGVuIGxhdGVyLgorICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdCA9IE1lbW9yeUluc3Q7CisKKyAgLy8gTm93IHRoYXQgd2UgZGV0ZXJtaW5lZCB0aGUgYWRkcmVzc2luZyBleHByZXNzaW9uIHdlIHdhbnQgdG8gdXNlIGFuZCBrbm93CisgIC8vIHRoYXQgd2UgaGF2ZSB0byBzaW5rIGl0IGludG8gdGhpcyBibG9jay4gIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkKKyAgLy8gZG9uZSB0aGlzIGZvciBzb21lIG90aGVyIGxvYWQvc3RvcmUgaW5zdHIgaW4gdGhpcyBibG9jay4gIElmIHNvLCByZXVzZSB0aGUKKyAgLy8gY29tcHV0YXRpb24uCisgIFZhbHVlIComU3Vua0FkZHIgPSBTdW5rQWRkcnNbQWRkcl07CisgIGlmIChTdW5rQWRkcikgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiQ0dQOiBSZXVzaW5nIG5vbmxvY2FsIGFkZHJtb2RlOiAiIDw8IEFkZHJNb2RlIDw8ICIgZm9yICIKKyAgICAgICAgICAgICAgICAgPDwgKk1lbW9yeUluc3QpOworICAgIGlmIChTdW5rQWRkci0+Z2V0VHlwZSgpICE9IEFkZHItPmdldFR5cGUoKSkKKyAgICAgIFN1bmtBZGRyID0gbmV3IEJpdENhc3RJbnN0KFN1bmtBZGRyLCBBZGRyLT5nZXRUeXBlKCksIEluc2VydFB0KTsKKyAgfSBlbHNlIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkNHUDogU0lOS0lORyBub25sb2NhbCBhZGRybW9kZTogIiA8PCBBZGRyTW9kZSA8PCAiIGZvciAiCisgICAgICAgICAgICAgICAgIDw8ICpNZW1vcnlJbnN0KTsKKyAgICBjb25zdCBUeXBlICpJbnRQdHJUeSA9CisgICAgICAgICAgVExJLT5nZXRUYXJnZXREYXRhKCktPmdldEludFB0clR5cGUoQWNjZXNzVHktPmdldENvbnRleHQoKSk7CisKKyAgICBWYWx1ZSAqUmVzdWx0ID0gMDsKKworICAgIC8vIFN0YXJ0IHdpdGggdGhlIGJhc2UgcmVnaXN0ZXIuIERvIHRoaXMgZmlyc3Qgc28gdGhhdCBzdWJzZXF1ZW50IGFkZHJlc3MKKyAgICAvLyBtYXRjaGluZyBmaW5kcyBpdCBsYXN0LCB3aGljaCB3aWxsIHByZXZlbnQgaXQgZnJvbSB0cnlpbmcgdG8gbWF0Y2ggaXQKKyAgICAvLyBhcyB0aGUgc2NhbGVkIHZhbHVlIGluIGNhc2UgaXQgaGFwcGVucyB0byBiZSBhIG11bC4gVGhhdCB3b3VsZCBiZQorICAgIC8vIHByb2JsZW1hdGljIGlmIHdlJ3ZlIHN1bmsgYSBkaWZmZXJlbnQgbXVsIGZvciB0aGUgc2NhbGUsIGJlY2F1c2UgdGhlbgorICAgIC8vIHdlJ2QgZW5kIHVwIHNpbmtpbmcgYm90aCBtdWxzLgorICAgIGlmIChBZGRyTW9kZS5CYXNlUmVnKSB7CisgICAgICBWYWx1ZSAqViA9IEFkZHJNb2RlLkJhc2VSZWc7CisgICAgICBpZiAoVi0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgICBWID0gbmV3IFB0clRvSW50SW5zdChWLCBJbnRQdHJUeSwgSW5zZXJ0UHQpOworICAgICAgaWYgKFYtPmdldFR5cGUoKSAhPSBJbnRQdHJUeSkKKyAgICAgICAgViA9IENhc3RJbnN0OjpDcmVhdGVJbnRlZ2VyQ2FzdChWLCBJbnRQdHJUeSwgLyppc1NpZ25lZD0qL3RydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0UHQpOworICAgICAgUmVzdWx0ID0gVjsKKyAgICB9CisKKyAgICAvLyBBZGQgdGhlIHNjYWxlIHZhbHVlLgorICAgIGlmIChBZGRyTW9kZS5TY2FsZSkgeworICAgICAgVmFsdWUgKlYgPSBBZGRyTW9kZS5TY2FsZWRSZWc7CisgICAgICBpZiAoVi0+Z2V0VHlwZSgpID09IEludFB0clR5KSB7CisgICAgICAgIC8vIGRvbmUuCisgICAgICB9IGVsc2UgaWYgKFYtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkgeworICAgICAgICBWID0gbmV3IFB0clRvSW50SW5zdChWLCBJbnRQdHJUeSwgSW5zZXJ0UHQpOworICAgICAgfSBlbHNlIGlmIChjYXN0PEludGVnZXJUeXBlPihJbnRQdHJUeSktPmdldEJpdFdpZHRoKCkgPAorICAgICAgICAgICAgICAgICBjYXN0PEludGVnZXJUeXBlPihWLT5nZXRUeXBlKCkpLT5nZXRCaXRXaWR0aCgpKSB7CisgICAgICAgIFYgPSBuZXcgVHJ1bmNJbnN0KFYsIEludFB0clR5LCBJbnNlcnRQdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBWID0gbmV3IFNFeHRJbnN0KFYsIEludFB0clR5LCBJbnNlcnRQdCk7CisgICAgICB9CisgICAgICBpZiAoQWRkck1vZGUuU2NhbGUgIT0gMSkKKyAgICAgICAgViA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVNdWwoViwgQ29uc3RhbnRJbnQ6OmdldChJbnRQdHJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTW9kZS5TY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydFB0KTsKKyAgICAgIGlmIChSZXN1bHQpCisgICAgICAgIFJlc3VsdCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoUmVzdWx0LCBWLCBJbnNlcnRQdCk7CisgICAgICBlbHNlCisgICAgICAgIFJlc3VsdCA9IFY7CisgICAgfQorCisgICAgLy8gQWRkIGluIHRoZSBCYXNlR1YgaWYgcHJlc2VudC4KKyAgICBpZiAoQWRkck1vZGUuQmFzZUdWKSB7CisgICAgICBWYWx1ZSAqViA9IG5ldyBQdHJUb0ludEluc3QoQWRkck1vZGUuQmFzZUdWLCBJbnRQdHJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRQdCk7CisgICAgICBpZiAoUmVzdWx0KQorICAgICAgICBSZXN1bHQgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKFJlc3VsdCwgViwgSW5zZXJ0UHQpOworICAgICAgZWxzZQorICAgICAgICBSZXN1bHQgPSBWOworICAgIH0KKworICAgIC8vIEFkZCBpbiB0aGUgQmFzZSBPZmZzZXQgaWYgcHJlc2VudC4KKyAgICBpZiAoQWRkck1vZGUuQmFzZU9mZnMpIHsKKyAgICAgIFZhbHVlICpWID0gQ29uc3RhbnRJbnQ6OmdldChJbnRQdHJUeSwgQWRkck1vZGUuQmFzZU9mZnMpOworICAgICAgaWYgKFJlc3VsdCkKKyAgICAgICAgUmVzdWx0ID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChSZXN1bHQsIFYsIEluc2VydFB0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgUmVzdWx0ID0gVjsKKyAgICB9CisKKyAgICBpZiAoUmVzdWx0ID09IDApCisgICAgICBTdW5rQWRkciA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoQWRkci0+Z2V0VHlwZSgpKTsKKyAgICBlbHNlCisgICAgICBTdW5rQWRkciA9IG5ldyBJbnRUb1B0ckluc3QoUmVzdWx0LCBBZGRyLT5nZXRUeXBlKCksIEluc2VydFB0KTsKKyAgfQorCisgIE1lbW9yeUluc3QtPnJlcGxhY2VVc2VzT2ZXaXRoKEFkZHIsIFN1bmtBZGRyKTsKKworICBpZiAoQWRkci0+dXNlX2VtcHR5KCkpIHsKKyAgICBSZWN1cnNpdmVseURlbGV0ZVRyaXZpYWxseURlYWRJbnN0cnVjdGlvbnMoQWRkcik7CisgICAgLy8gVGhpcyBhZGRyZXNzIGlzIG5vdyBhdmFpbGFibGUgZm9yIHJlYXNzaWdubWVudCwgc28gZXJhc2UgdGhlIHRhYmxlIGVudHJ5OworICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gbWF0Y2ggc29tZSBjb21wbGV0ZWx5IGRpZmZlcmVudCBpbnN0cnVjdGlvbi4KKyAgICBTdW5rQWRkcnNbQWRkcl0gPSAwOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gT3B0aW1pemVJbmxpbmVBc21JbnN0IC0gSWYgdGhlcmUgYXJlIGFueSBtZW1vcnkgb3BlcmFuZHMsIHVzZQorLy8vIE9wdGltaXplTWVtb3J5SW5zdCB0byBzaW5rIHRoZWlyIGFkZHJlc3MgY29tcHV0aW5nIGludG8gdGhlIGJsb2NrIHdoZW4KKy8vLyBwb3NzaWJsZSAvIHByb2ZpdGFibGUuCitib29sIENvZGVHZW5QcmVwYXJlOjpPcHRpbWl6ZUlubGluZUFzbUluc3QoSW5zdHJ1Y3Rpb24gKkksIENhbGxTaXRlIENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFZhbHVlKixWYWx1ZSo+ICZTdW5rQWRkcnMpIHsKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIElubGluZUFzbSAqSUEgPSBjYXN0PElubGluZUFzbT4oQ1MuZ2V0Q2FsbGVkVmFsdWUoKSk7CisKKyAgLy8gRG8gYSBwcmVwYXNzIG92ZXIgdGhlIGNvbnN0cmFpbnRzLCBjYW5vbmljYWxpemluZyB0aGVtLCBhbmQgYnVpbGRpbmcgdXAgdGhlCisgIC8vIENvbnN0cmFpbnRPcGVyYW5kcyBsaXN0LgorICBzdGQ6OnZlY3RvcjxJbmxpbmVBc206OkNvbnN0cmFpbnRJbmZvPgorICAgIENvbnN0cmFpbnRJbmZvcyA9IElBLT5QYXJzZUNvbnN0cmFpbnRzKCk7CisKKyAgLy8vIENvbnN0cmFpbnRPcGVyYW5kcyAtIEluZm9ybWF0aW9uIGFib3V0IGFsbCBvZiB0aGUgY29uc3RyYWludHMuCisgIHN0ZDo6dmVjdG9yPFRhcmdldExvd2VyaW5nOjpBc21PcGVyYW5kSW5mbz4gQ29uc3RyYWludE9wZXJhbmRzOworICB1bnNpZ25lZCBBcmdObyA9IDA7ICAgLy8gQXJnTm8gLSBUaGUgYXJndW1lbnQgb2YgdGhlIENhbGxJbnN0LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ29uc3RyYWludEluZm9zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDb25zdHJhaW50T3BlcmFuZHMuCisgICAgICBwdXNoX2JhY2soVGFyZ2V0TG93ZXJpbmc6OkFzbU9wZXJhbmRJbmZvKENvbnN0cmFpbnRJbmZvc1tpXSkpOworICAgIFRhcmdldExvd2VyaW5nOjpBc21PcGVyYW5kSW5mbyAmT3BJbmZvID0gQ29uc3RyYWludE9wZXJhbmRzLmJhY2soKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHZhbHVlIHR5cGUgZm9yIGVhY2ggb3BlcmFuZC4KKyAgICBzd2l0Y2ggKE9wSW5mby5UeXBlKSB7CisgICAgY2FzZSBJbmxpbmVBc206OmlzT3V0cHV0OgorICAgICAgaWYgKE9wSW5mby5pc0luZGlyZWN0KQorICAgICAgICBPcEluZm8uQ2FsbE9wZXJhbmRWYWwgPSBDUy5nZXRBcmd1bWVudChBcmdObysrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5saW5lQXNtOjppc0lucHV0OgorICAgICAgT3BJbmZvLkNhbGxPcGVyYW5kVmFsID0gQ1MuZ2V0QXJndW1lbnQoQXJnTm8rKyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElubGluZUFzbTo6aXNDbG9iYmVyOgorICAgICAgLy8gTm90aGluZyB0byBkby4KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIGNvbnN0cmFpbnQgY29kZSBhbmQgQ29uc3RyYWludFR5cGUgdG8gdXNlLgorICAgIFRMSS0+Q29tcHV0ZUNvbnN0cmFpbnRUb1VzZShPcEluZm8sIFNEVmFsdWUoKSk7CisKKyAgICBpZiAoT3BJbmZvLkNvbnN0cmFpbnRUeXBlID09IFRhcmdldExvd2VyaW5nOjpDX01lbW9yeSAmJgorICAgICAgICBPcEluZm8uaXNJbmRpcmVjdCkgeworICAgICAgVmFsdWUgKk9wVmFsID0gT3BJbmZvLkNhbGxPcGVyYW5kVmFsOworICAgICAgTWFkZUNoYW5nZSB8PSBPcHRpbWl6ZU1lbW9yeUluc3QoSSwgT3BWYWwsIE9wVmFsLT5nZXRUeXBlKCksIFN1bmtBZGRycyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vLyBNb3ZlRXh0VG9Gb3JtRXh0TG9hZCAtIE1vdmUgYSB6ZXh0IG9yIHNleHQgZmVkIGJ5IGEgbG9hZCBpbnRvIHRoZSBzYW1lCisvLy8gYmFzaWMgYmxvY2sgYXMgdGhlIGxvYWQsIHVubGVzcyBjb25kaXRpb25zIGFyZSB1bmZhdm9yYWJsZS4gVGhpcyBhbGxvd3MKKy8vLyBTZWxlY3Rpb25EQUcgdG8gZm9sZCB0aGUgZXh0ZW5kIGludG8gdGhlIGxvYWQuCisvLy8KK2Jvb2wgQ29kZUdlblByZXBhcmU6Ok1vdmVFeHRUb0Zvcm1FeHRMb2FkKEluc3RydWN0aW9uICpJKSB7CisgIC8vIExvb2sgZm9yIGEgbG9hZCBiZWluZyBleHRlbmRlZC4KKyAgTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KEktPmdldE9wZXJhbmQoMCkpOworICBpZiAoIUxJKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhleSdyZSBhbHJlYWR5IGluIHRoZSBzYW1lIGJsb2NrLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCisgIGlmIChMSS0+Z2V0UGFyZW50KCkgPT0gSS0+Z2V0UGFyZW50KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHRoZSBsb2FkIGhhcyBvdGhlciB1c2VycyBhbmQgdGhlIHRydW5jYXRlIGlzIG5vdCBmcmVlLCB0aGlzIHByb2JhYmx5CisgIC8vIGlzbid0IHdvcnRod2hpbGUuCisgIGlmICghTEktPmhhc09uZVVzZSgpICYmCisgICAgICBUTEkgJiYgIVRMSS0+aXNUcnVuY2F0ZUZyZWUoSS0+Z2V0VHlwZSgpLCBMSS0+Z2V0VHlwZSgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0IHN1cHBvcnRzIGNhc3RzIGZvbGRlZCBpbnRvIGxvYWRzLgorICB1bnNpZ25lZCBMVHlwZTsKKyAgaWYgKGlzYTxaRXh0SW5zdD4oSSkpCisgICAgTFR5cGUgPSBJU0Q6OlpFWFRMT0FEOworICBlbHNlIHsKKyAgICBhc3NlcnQoaXNhPFNFeHRJbnN0PihJKSAmJiAiVW5leHBlY3RlZCBleHQgdHlwZSEiKTsKKyAgICBMVHlwZSA9IElTRDo6U0VYVExPQUQ7CisgIH0KKyAgaWYgKFRMSSAmJiAhVExJLT5pc0xvYWRFeHRMZWdhbChMVHlwZSwgVExJLT5nZXRWYWx1ZVR5cGUoTEktPmdldFR5cGUoKSkpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBNb3ZlIHRoZSBleHRlbmQgaW50byB0aGUgc2FtZSBibG9jayBhcyB0aGUgbG9hZCwgc28gdGhhdCBTZWxlY3Rpb25EQUcKKyAgLy8gY2FuIGZvbGQgaXQuCisgIEktPnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgSS0+aW5zZXJ0QWZ0ZXIoTEkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlR2VuUHJlcGFyZTo6T3B0aW1pemVFeHRVc2VzKEluc3RydWN0aW9uICpJKSB7CisgIEJhc2ljQmxvY2sgKkRlZkJCID0gSS0+Z2V0UGFyZW50KCk7CisKKyAgLy8gSWYgYm90aCByZXN1bHQgb2YgdGhlIHtzfHp9eHQgYW5kIGl0cyBzb3VyY2UgYXJlIGxpdmUgb3V0LCByZXdyaXRlIGFsbAorICAvLyBvdGhlciB1c2VzIG9mIHRoZSBzb3VyY2Ugd2l0aCByZXN1bHQgb2YgZXh0ZW5zaW9uLgorICBWYWx1ZSAqU3JjID0gSS0+Z2V0T3BlcmFuZCgwKTsKKyAgaWYgKFNyYy0+aGFzT25lVXNlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE9ubHkgZG8gdGhpcyB4Zm9ybSBpZiB0cnVuY2F0aW5nIGlzIGZyZWUuCisgIGlmIChUTEkgJiYgIVRMSS0+aXNUcnVuY2F0ZUZyZWUoSS0+Z2V0VHlwZSgpLCBTcmMtPmdldFR5cGUoKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE9ubHkgc2FmZSB0byBwZXJmb3JtIHRoZSBvcHRpbWl6YXRpb24gaWYgdGhlIHNvdXJjZSBpcyBhbHNvIGRlZmluZWQgaW4KKyAgLy8gdGhpcyBibG9jay4KKyAgaWYgKCFpc2E8SW5zdHJ1Y3Rpb24+KFNyYykgfHwgRGVmQkIgIT0gY2FzdDxJbnN0cnVjdGlvbj4oU3JjKS0+Z2V0UGFyZW50KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgRGVmSXNMaXZlT3V0ID0gZmFsc2U7CisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEktPnVzZV9iZWdpbigpLCBFID0gSS0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IEU7ICsrVUkpIHsKKyAgICBJbnN0cnVjdGlvbiAqVXNlciA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSk7CisKKyAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIEJCIHRoaXMgZXh0IGlzIHVzZWQgaW4uCisgICAgQmFzaWNCbG9jayAqVXNlckJCID0gVXNlci0+Z2V0UGFyZW50KCk7CisgICAgaWYgKFVzZXJCQiA9PSBEZWZCQikgY29udGludWU7CisgICAgRGVmSXNMaXZlT3V0ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorICBpZiAoIURlZklzTGl2ZU91dCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gTWFrZSBzdXJlIG5vbiBvZiB0aGUgdXNlcyBhcmUgUEhJIG5vZGVzLgorICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBTcmMtPnVzZV9iZWdpbigpLCBFID0gU3JjLT51c2VfZW5kKCk7CisgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgIEluc3RydWN0aW9uICpVc2VyID0gY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKyAgICBCYXNpY0Jsb2NrICpVc2VyQkIgPSBVc2VyLT5nZXRQYXJlbnQoKTsKKyAgICBpZiAoVXNlckJCID09IERlZkJCKSBjb250aW51ZTsKKyAgICAvLyBCZSBjb25zZXJ2YXRpdmUuIFdlIGRvbid0IHdhbnQgdGhpcyB4Zm9ybSB0byBlbmQgdXAgaW50cm9kdWNpbmcKKyAgICAvLyByZWxvYWRzIGp1c3QgYmVmb3JlIGxvYWQgLyBzdG9yZSBpbnN0cnVjdGlvbnMuCisgICAgaWYgKGlzYTxQSElOb2RlPihVc2VyKSB8fCBpc2E8TG9hZEluc3Q+KFVzZXIpIHx8IGlzYTxTdG9yZUluc3Q+KFVzZXIpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSW5zZXJ0ZWRUcnVuY3MgLSBPbmx5IGluc2VydCBvbmUgdHJ1bmMgaW4gZWFjaCBibG9jayBvbmNlLgorICBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgSW5zdHJ1Y3Rpb24qPiBJbnNlcnRlZFRydW5jczsKKworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gU3JjLT51c2VfYmVnaW4oKSwgRSA9IFNyYy0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IEU7ICsrVUkpIHsKKyAgICBVc2UgJlRoZVVzZSA9IFVJLmdldFVzZSgpOworICAgIEluc3RydWN0aW9uICpVc2VyID0gY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKworICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggQkIgdGhpcyBleHQgaXMgdXNlZCBpbi4KKyAgICBCYXNpY0Jsb2NrICpVc2VyQkIgPSBVc2VyLT5nZXRQYXJlbnQoKTsKKyAgICBpZiAoVXNlckJCID09IERlZkJCKSBjb250aW51ZTsKKworICAgIC8vIEJvdGggc3JjIGFuZCBkZWYgYXJlIGxpdmUgaW4gdGhpcyBibG9jay4gUmV3cml0ZSB0aGUgdXNlLgorICAgIEluc3RydWN0aW9uIComSW5zZXJ0ZWRUcnVuYyA9IEluc2VydGVkVHJ1bmNzW1VzZXJCQl07CisKKyAgICBpZiAoIUluc2VydGVkVHJ1bmMpIHsKKyAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFB0ID0gVXNlckJCLT5nZXRGaXJzdE5vblBISSgpOworCisgICAgICBJbnNlcnRlZFRydW5jID0gbmV3IFRydW5jSW5zdChJLCBTcmMtPmdldFR5cGUoKSwgSW5zZXJ0UHQpOworICAgIH0KKworICAgIC8vIFJlcGxhY2UgYSB1c2Ugb2YgdGhlIHtzfHp9ZXh0IHNvdXJjZSB3aXRoIGEgdXNlIG9mIHRoZSByZXN1bHQuCisgICAgVGhlVXNlID0gSW5zZXJ0ZWRUcnVuYzsKKworICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICB9CisKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vIEluIHRoaXMgcGFzcyB3ZSBsb29rIGZvciBHRVAgYW5kIGNhc3QgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHVzZWQKKy8vIGFjcm9zcyBiYXNpYyBibG9ja3MgYW5kIHJld3JpdGUgdGhlbSB0byBpbXByb3ZlIGJhc2ljLWJsb2NrLWF0LWEtdGltZQorLy8gc2VsZWN0aW9uLgorYm9vbCBDb2RlR2VuUHJlcGFyZTo6T3B0aW1pemVCbG9jayhCYXNpY0Jsb2NrICZCQikgeworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKworICAvLyBTcGxpdCBhbGwgY3JpdGljYWwgZWRnZXMgd2hlcmUgdGhlIGRlc3QgYmxvY2sgaGFzIGEgUEhJLgorICBUZXJtaW5hdG9ySW5zdCAqQkJUSSA9IEJCLmdldFRlcm1pbmF0b3IoKTsKKyAgaWYgKEJCVEktPmdldE51bVN1Y2Nlc3NvcnMoKSA+IDEgJiYgIWlzYTxJbmRpcmVjdEJySW5zdD4oQkJUSSkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQkJUSS0+Z2V0TnVtU3VjY2Vzc29ycygpOyBpICE9IGU7ICsraSkgeworICAgICAgQmFzaWNCbG9jayAqU3VjY0JCID0gQkJUSS0+Z2V0U3VjY2Vzc29yKGkpOworICAgICAgaWYgKGlzYTxQSElOb2RlPihTdWNjQkItPmJlZ2luKCkpICYmIGlzQ3JpdGljYWxFZGdlKEJCVEksIGksIHRydWUpKQorICAgICAgICBTcGxpdEVkZ2VOaWNlbHkoQkJUSSwgaSwgQmFja0VkZ2VzLCB0aGlzKTsKKyAgICB9CisgIH0KKworICAvLyBLZWVwIHRyYWNrIG9mIG5vbi1sb2NhbCBhZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gc3VuayBpbnRvIHRoaXMgYmxvY2suCisgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGF2b2lkIGluc2VydGluZyBkdXBsaWNhdGUgY29kZSBmb3IgYmxvY2tzIHdpdGggbXVsdGlwbGUKKyAgLy8gbG9hZC9zdG9yZXMgb2YgdGhlIHNhbWUgYWRkcmVzcy4KKyAgRGVuc2VNYXA8VmFsdWUqLCBWYWx1ZSo+IFN1bmtBZGRyczsKKworICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9IEJCLmJlZ2luKCksIEUgPSBCQi5lbmQoKTsgQkJJICE9IEU7ICkgeworICAgIEluc3RydWN0aW9uICpJID0gQkJJKys7CisKKyAgICBpZiAoQ2FzdEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FzdEluc3Q+KEkpKSB7CisgICAgICAvLyBJZiB0aGUgc291cmNlIG9mIHRoZSBjYXN0IGlzIGEgY29uc3RhbnQsIHRoZW4gdGhpcyBzaG91bGQgaGF2ZQorICAgICAgLy8gYWxyZWFkeSBiZWVuIGNvbnN0YW50IGZvbGRlZC4gIFRoZSBvbmx5IHJlYXNvbiBOT1QgdG8gY29uc3RhbnQgZm9sZAorICAgICAgLy8gaXQgaXMgaWYgc29tZXRoaW5nIChlLmcuIExTUikgd2FzIGNhcmVmdWwgdG8gcGxhY2UgdGhlIGNvbnN0YW50CisgICAgICAvLyBldmFsdWF0aW9uIGluIGEgYmxvY2sgb3RoZXIgdGhhbiB0aGVuIG9uZSB0aGF0IHVzZXMgaXQgKGUuZy4gdG8gaG9pc3QKKyAgICAgIC8vIHRoZSBhZGRyZXNzIG9mIGdsb2JhbHMgb3V0IG9mIGEgbG9vcCkuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSBkb24ndAorICAgICAgLy8gd2FudCB0byBmb3J3YXJkLXN1YnN0IHRoZSBjYXN0LgorICAgICAgaWYgKGlzYTxDb25zdGFudD4oQ0ktPmdldE9wZXJhbmQoMCkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgYm9vbCBDaGFuZ2UgPSBmYWxzZTsKKyAgICAgIGlmIChUTEkpIHsKKyAgICAgICAgQ2hhbmdlID0gT3B0aW1pemVOb29wQ29weUV4cHJlc3Npb24oQ0ksICpUTEkpOworICAgICAgICBNYWRlQ2hhbmdlIHw9IENoYW5nZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFDaGFuZ2UgJiYgKGlzYTxaRXh0SW5zdD4oSSkgfHwgaXNhPFNFeHRJbnN0PihJKSkpIHsKKyAgICAgICAgTWFkZUNoYW5nZSB8PSBNb3ZlRXh0VG9Gb3JtRXh0TG9hZChJKTsKKyAgICAgICAgTWFkZUNoYW5nZSB8PSBPcHRpbWl6ZUV4dFVzZXMoSSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChDbXBJbnN0ICpDSSA9IGR5bl9jYXN0PENtcEluc3Q+KEkpKSB7CisgICAgICBNYWRlQ2hhbmdlIHw9IE9wdGltaXplQ21wRXhwcmVzc2lvbihDSSk7CisgICAgfSBlbHNlIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSSkpIHsKKyAgICAgIGlmIChUTEkpCisgICAgICAgIE1hZGVDaGFuZ2UgfD0gT3B0aW1pemVNZW1vcnlJbnN0KEksIEktPmdldE9wZXJhbmQoMCksIExJLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1bmtBZGRycyk7CisgICAgfSBlbHNlIGlmIChTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihJKSkgeworICAgICAgaWYgKFRMSSkKKyAgICAgICAgTWFkZUNoYW5nZSB8PSBPcHRpbWl6ZU1lbW9yeUluc3QoSSwgU0ktPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1bmtBZGRycyk7CisgICAgfSBlbHNlIGlmIChHZXRFbGVtZW50UHRySW5zdCAqR0VQSSA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihJKSkgeworICAgICAgaWYgKEdFUEktPmhhc0FsbFplcm9JbmRpY2VzKCkpIHsKKyAgICAgICAgLy8vIFRoZSBHRVAgb3BlcmFuZCBtdXN0IGJlIGEgcG9pbnRlciwgc28gbXVzdCBpdHMgcmVzdWx0IC0+IEJpdENhc3QKKyAgICAgICAgSW5zdHJ1Y3Rpb24gKk5DID0gbmV3IEJpdENhc3RJbnN0KEdFUEktPmdldE9wZXJhbmQoMCksIEdFUEktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFUEkpOworICAgICAgICBHRVBJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTkMpOworICAgICAgICBHRVBJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgIEJCSSA9IE5DOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KEkpKSB7CisgICAgICBNYWRlQ2hhbmdlIHw9IE9wdGltaXplQ2FsbEluc3QoQ0kpOworICAgIH0KKyAgfQorCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL0RlYWRTdG9yZUVsaW1pbmF0aW9uLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9EZWFkU3RvcmVFbGltaW5hdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlNmE0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9EZWFkU3RvcmVFbGltaW5hdGlvbi5jcHAKQEAgLTAsMCArMSw1NjYgQEAKKy8vPT09LSBEZWFkU3RvcmVFbGltaW5hdGlvbi5jcHAgLSBGYXN0IERlYWQgU3RvcmUgRWxpbWluYXRpb24gLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB0cml2aWFsIGRlYWQgc3RvcmUgZWxpbWluYXRpb24gdGhhdCBvbmx5IGNvbnNpZGVycworLy8gYmFzaWMtYmxvY2sgbG9jYWwgcmVkdW5kYW50IHN0b3Jlcy4KKy8vCisvLyBGSVhNRTogVGhpcyBzaG91bGQgZXZlbnR1YWxseSBiZSBleHRlbmRlZCB0byBiZSBhIHBvc3QtZG9taW5hdG9yIHRyZWUKKy8vIHRyYXZlcnNhbC4gIERvaW5nIHNvIHdvdWxkIGJlIHByZXR0eSB0cml2aWFsLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiZHNlIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9NZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUZhc3RTdG9yZXMsICJOdW1iZXIgb2Ygc3RvcmVzIGRlbGV0ZWQiKTsKK1NUQVRJU1RJQyhOdW1GYXN0T3RoZXIgLCAiTnVtYmVyIG9mIG90aGVyIGluc3RycyByZW1vdmVkIik7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBEU0UgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgICBUYXJnZXREYXRhICpURDsKKworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgRFNFKCkgOiBGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICAgICAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgICAgICAKKyAgICAgIERvbWluYXRvclRyZWUgJkRUID0gZ2V0QW5hbHlzaXM8RG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIAorICAgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IEYuYmVnaW4oKSwgRSA9IEYuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICAvLyBPbmx5IGNoZWNrIG5vbi1kZWFkIGJsb2Nrcy4gIERlYWQgYmxvY2tzIG1heSBoYXZlIHN0cmFuZ2UgcG9pbnRlcgorICAgICAgICAvLyBjeWNsZXMgdGhhdCB3aWxsIGNvbmZ1c2UgYWxpYXMgYW5hbHlzaXMuCisgICAgICAgIGlmIChEVC5pc1JlYWNoYWJsZUZyb21FbnRyeShJKSkKKyAgICAgICAgICBDaGFuZ2VkIHw9IHJ1bk9uQmFzaWNCbG9jaygqSSk7CisgICAgICByZXR1cm4gQ2hhbmdlZDsKKyAgICB9CisgICAgCisgICAgYm9vbCBydW5PbkJhc2ljQmxvY2soQmFzaWNCbG9jayAmQkIpOworICAgIGJvb2wgaGFuZGxlRnJlZVdpdGhOb25Ucml2aWFsRGVwZW5kZW5jeShjb25zdCBDYWxsSW5zdCAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtRGVwUmVzdWx0IERlcCk7CisgICAgYm9vbCBoYW5kbGVFbmRCbG9jayhCYXNpY0Jsb2NrICZCQik7CisgICAgYm9vbCBSZW1vdmVVbmRlYWRQb2ludGVycyhWYWx1ZSAqUHRyLCB1aW50NjRfdCBraWxsUG9pbnRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciAmQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8VmFsdWUqLCA2ND4gJmRlYWRQb2ludGVycyk7CisgICAgdm9pZCBEZWxldGVEZWFkSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8VmFsdWUqLCA2ND4gKmRlYWRQb2ludGVycyA9IDApOworICAgIAorCisgICAgLy8gZ2V0QW5hbHlzaXNVc2FnZSAtIFdlIHJlcXVpcmUgcG9zdCBkb21pbmFuY2UgZnJvbnRpZXJzIChha2EgQ29udHJvbAorICAgIC8vIERlcGVuZGVuY2UgR3JhcGgpCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLnNldFByZXNlcnZlc0NGRygpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8RG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPEFsaWFzQW5hbHlzaXM+KCk7CisgICAgICBBVS5hZGRSZXF1aXJlZDxNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8RG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM+KCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0UG9pbnRlclNpemUoVmFsdWUgKlYpIGNvbnN0OworICB9OworfQorCitjaGFyIERTRTo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKERTRSwgImRzZSIsICJEZWFkIFN0b3JlIEVsaW1pbmF0aW9uIiwgZmFsc2UsIGZhbHNlKTsKKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVEZWFkU3RvcmVFbGltaW5hdGlvblBhc3MoKSB7IHJldHVybiBuZXcgRFNFKCk7IH0KKworLy8vIGRvZXNDbG9iYmVyTWVtb3J5IC0gRG9lcyB0aGlzIGluc3RydWN0aW9uIGNsb2JiZXIgKHdyaXRlIHdpdGhvdXQgcmVhZGluZykKKy8vLyBzb21lIG1lbW9yeT8KK3N0YXRpYyBib29sIGRvZXNDbG9iYmVyTWVtb3J5KEluc3RydWN0aW9uICpJKSB7CisgIGlmIChpc2E8U3RvcmVJbnN0PihJKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oSSkpIHsKKyAgICBzd2l0Y2ggKElJLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEludHJpbnNpYzo6bWVtc2V0OgorICAgIGNhc2UgSW50cmluc2ljOjptZW1tb3ZlOgorICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHk6CisgICAgY2FzZSBJbnRyaW5zaWM6OmluaXRfdHJhbXBvbGluZToKKyAgICBjYXNlIEludHJpbnNpYzo6bGlmZXRpbWVfZW5kOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzRWxpZGFibGUgLSBJZiB0aGUgdmFsdWUgb2YgdGhpcyBpbnN0cnVjdGlvbiBhbmQgdGhlIG1lbW9yeSBpdCB3cml0ZXMgdG8gaXMKKy8vLyB1bnVzZWQsIG1heSB3ZSBkZWxldGUgdGhpcyBpbnN0cnRjdGlvbj8KK3N0YXRpYyBib29sIGlzRWxpZGFibGUoSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgYXNzZXJ0KGRvZXNDbG9iYmVyTWVtb3J5KEkpKTsKKyAgaWYgKEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oSSkpCisgICAgcmV0dXJuIElJLT5nZXRJbnRyaW5zaWNJRCgpICE9IEludHJpbnNpYzo6bGlmZXRpbWVfZW5kOworICBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oSSkpCisgICAgcmV0dXJuICFTSS0+aXNWb2xhdGlsZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGdldFBvaW50ZXJPcGVyYW5kIC0gUmV0dXJuIHRoZSBwb2ludGVyIHRoYXQgaXMgYmVpbmcgY2xvYmJlcmVkLgorc3RhdGljIFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZChJbnN0cnVjdGlvbiAqSSkgeworICBhc3NlcnQoZG9lc0Nsb2JiZXJNZW1vcnkoSSkpOworICBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oSSkpCisgICAgcmV0dXJuIFNJLT5nZXRQb2ludGVyT3BlcmFuZCgpOworICBpZiAoTWVtSW50cmluc2ljICpNSSA9IGR5bl9jYXN0PE1lbUludHJpbnNpYz4oSSkpCisgICAgcmV0dXJuIE1JLT5nZXRBcmdPcGVyYW5kKDApOworCisgIEludHJpbnNpY0luc3QgKklJID0gY2FzdDxJbnRyaW5zaWNJbnN0PihJKTsKKyAgc3dpdGNoIChJSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UgJiYgIlVuZXhwZWN0ZWQgaW50cmluc2ljISIpOworICBjYXNlIEludHJpbnNpYzo6aW5pdF90cmFtcG9saW5lOgorICAgIHJldHVybiBJSS0+Z2V0QXJnT3BlcmFuZCgwKTsKKyAgY2FzZSBJbnRyaW5zaWM6OmxpZmV0aW1lX2VuZDoKKyAgICByZXR1cm4gSUktPmdldEFyZ09wZXJhbmQoMSk7CisgIH0KK30KKworLy8vIGdldFN0b3JlU2l6ZSAtIFJldHVybiB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSB3cml0ZSBieSB0aGUgY2xvYmJlcmluZworLy8vIGluc3RydWN0aW9uLiBJZiB2YXJpYWJsZSBvciB1bmtub3duLCByZXR1cm5zIC0xLgorc3RhdGljIHVuc2lnbmVkIGdldFN0b3JlU2l6ZShJbnN0cnVjdGlvbiAqSSwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpIHsKKyAgYXNzZXJ0KGRvZXNDbG9iYmVyTWVtb3J5KEkpKTsKKyAgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEkpKSB7CisgICAgaWYgKCFURCkgcmV0dXJuIC0xdTsKKyAgICByZXR1cm4gVEQtPmdldFR5cGVTdG9yZVNpemUoU0ktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSk7CisgIH0KKworICBWYWx1ZSAqTGVuOworICBpZiAoTWVtSW50cmluc2ljICpNSSA9IGR5bl9jYXN0PE1lbUludHJpbnNpYz4oSSkpIHsKKyAgICBMZW4gPSBNSS0+Z2V0TGVuZ3RoKCk7CisgIH0gZWxzZSB7CisgICAgSW50cmluc2ljSW5zdCAqSUkgPSBjYXN0PEludHJpbnNpY0luc3Q+KEkpOworICAgIHN3aXRjaCAoSUktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UgJiYgIlVuZXhwZWN0ZWQgaW50cmluc2ljISIpOworICAgIGNhc2UgSW50cmluc2ljOjppbml0X3RyYW1wb2xpbmU6CisgICAgICByZXR1cm4gLTF1OworICAgIGNhc2UgSW50cmluc2ljOjpsaWZldGltZV9lbmQ6CisgICAgICBMZW4gPSBJSS0+Z2V0QXJnT3BlcmFuZCgwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoQ29uc3RhbnRJbnQgKkxlbkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KExlbikpCisgICAgaWYgKCFMZW5DSS0+aXNBbGxPbmVzVmFsdWUoKSkKKyAgICAgIHJldHVybiBMZW5DSS0+Z2V0WkV4dFZhbHVlKCk7CisgIHJldHVybiAtMXU7Cit9CisKKy8vLyBpc1N0b3JlQXRMZWFzdEFzV2lkZUFzIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNpemUgb2YgdGhlIHN0b3JlIGluIEkxIGlzCisvLy8gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzdG9yZSBpbiBJMi4gIFRoaXMgcmV0dXJucyBmYWxzZSBpZiB3ZSBkb24ndAorLy8vIGtub3cuCisvLy8KK3N0YXRpYyBib29sIGlzU3RvcmVBdExlYXN0QXNXaWRlQXMoSW5zdHJ1Y3Rpb24gKkkxLCBJbnN0cnVjdGlvbiAqSTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIGNvbnN0IFR5cGUgKkkxVHkgPSBnZXRQb2ludGVyT3BlcmFuZChJMSktPmdldFR5cGUoKTsKKyAgY29uc3QgVHlwZSAqSTJUeSA9IGdldFBvaW50ZXJPcGVyYW5kKEkyKS0+Z2V0VHlwZSgpOworICAKKyAgLy8gRXhhY3RseSB0aGUgc2FtZSB0eXBlLCBtdXN0IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBzaXplLgorICBpZiAoSTFUeSA9PSBJMlR5KSByZXR1cm4gdHJ1ZTsKKyAgCisgIGludCBJMVNpemUgPSBnZXRTdG9yZVNpemUoSTEsIFREKTsKKyAgaW50IEkyU2l6ZSA9IGdldFN0b3JlU2l6ZShJMiwgVEQpOworICAKKyAgcmV0dXJuIEkxU2l6ZSAhPSAtMSAmJiBJMlNpemUgIT0gLTEgJiYgSTFTaXplID49IEkyU2l6ZTsKK30KKworYm9vbCBEU0U6OnJ1bk9uQmFzaWNCbG9jayhCYXNpY0Jsb2NrICZCQikgeworICBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMgJk1EID0gZ2V0QW5hbHlzaXM8TWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzPigpOworICBURCA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8VGFyZ2V0RGF0YT4oKTsKKworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgCisgIC8vIERvIGEgdG9wLWRvd24gd2FsayBvbiB0aGUgQkIuCisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gQkIuYmVnaW4oKSwgQkJFID0gQkIuZW5kKCk7IEJCSSAhPSBCQkU7ICkgeworICAgIEluc3RydWN0aW9uICpJbnN0ID0gQkJJKys7CisgICAgCisgICAgLy8gSWYgd2UgZmluZCBhIHN0b3JlIG9yIGEgZnJlZSwgZ2V0IGl0cyBtZW1vcnkgZGVwZW5kZW5jZS4KKyAgICBpZiAoIWRvZXNDbG9iYmVyTWVtb3J5KEluc3QpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgTWVtRGVwUmVzdWx0IEluc3REZXAgPSBNRC5nZXREZXBlbmRlbmN5KEluc3QpOworICAgIAorICAgIC8vIElnbm9yZSBub24tbG9jYWwgc3RvcmVzLgorICAgIC8vIEZJWE1FOiBjcm9zcy1ibG9jayBEU0Ugd291bGQgYmUgZnVuLiA6KQorICAgIGlmIChJbnN0RGVwLmlzTm9uTG9jYWwoKSkgY29udGludWU7CisgIAorICAgIC8vIElmIG5vdCBhIGRlZmluaXRlIG11c3QtYWxpYXMgZGVwZW5kZW5jeSwgaWdub3JlIGl0LgorICAgIGlmICghSW5zdERlcC5pc0RlZigpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgLy8gSWYgdGhpcyBpcyBhIHN0b3JlLXN0b3JlIGRlcGVuZGVuY2UsIHRoZW4gdGhlIHByZXZpb3VzIHN0b3JlIGlzIGRlYWQgc28KKyAgICAvLyBsb25nIGFzIHRoaXMgc3RvcmUgaXMgYXQgbGVhc3QgYXMgYmlnIGFzIGl0LgorICAgIGlmIChkb2VzQ2xvYmJlck1lbW9yeShJbnN0RGVwLmdldEluc3QoKSkpIHsKKyAgICAgIEluc3RydWN0aW9uICpEZXBTdG9yZSA9IEluc3REZXAuZ2V0SW5zdCgpOworICAgICAgaWYgKGlzU3RvcmVBdExlYXN0QXNXaWRlQXMoSW5zdCwgRGVwU3RvcmUsIFREKSAmJgorICAgICAgICAgIGlzRWxpZGFibGUoRGVwU3RvcmUpKSB7CisgICAgICAgIC8vIERlbGV0ZSB0aGUgc3RvcmUgYW5kIG5vdy1kZWFkIGluc3RydWN0aW9ucyB0aGF0IGZlZWQgaXQuCisgICAgICAgIERlbGV0ZURlYWRJbnN0cnVjdGlvbihEZXBTdG9yZSk7CisgICAgICAgICsrTnVtRmFzdFN0b3JlczsKKyAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisKKyAgICAgICAgLy8gRGVsZXRlRGVhZEluc3RydWN0aW9uIGNhbiBkZWxldGUgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaW4gbG9vcAorICAgICAgICAvLyBjYXNlcywgcmVzZXQgQkJJLgorICAgICAgICBCQkkgPSBJbnN0OworICAgICAgICBpZiAoQkJJICE9IEJCLmJlZ2luKCkpCisgICAgICAgICAgLS1CQkk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoIWlzRWxpZGFibGUoSW5zdCkpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAvLyBJZiB3ZSdyZSBzdG9yaW5nIHRoZSBzYW1lIHZhbHVlIGJhY2sgdG8gYSBwb2ludGVyIHRoYXQgd2UganVzdAorICAgIC8vIGxvYWRlZCBmcm9tLCB0aGVuIHRoZSBzdG9yZSBjYW4gYmUgcmVtb3ZlZC4KKyAgICBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oSW5zdCkpIHsKKyAgICAgIGlmIChMb2FkSW5zdCAqRGVwTG9hZCA9IGR5bl9jYXN0PExvYWRJbnN0PihJbnN0RGVwLmdldEluc3QoKSkpIHsKKyAgICAgICAgaWYgKFNJLT5nZXRQb2ludGVyT3BlcmFuZCgpID09IERlcExvYWQtPmdldFBvaW50ZXJPcGVyYW5kKCkgJiYKKyAgICAgICAgICAgIFNJLT5nZXRPcGVyYW5kKDApID09IERlcExvYWQpIHsKKyAgICAgICAgICAvLyBEZWxldGVEZWFkSW5zdHJ1Y3Rpb24gY2FuIGRlbGV0ZSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gIFNhdmUgQkJJCisgICAgICAgICAgLy8gaW4gY2FzZSB3ZSBuZWVkIGl0LgorICAgICAgICAgIFdlYWtWSCBOZXh0SW5zdChCQkkpOworICAgICAgICAgIAorICAgICAgICAgIERlbGV0ZURlYWRJbnN0cnVjdGlvbihTSSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKE5leHRJbnN0ID09IDApICAvLyBOZXh0IGluc3RydWN0aW9uIGRlbGV0ZWQuCisgICAgICAgICAgICBCQkkgPSBCQi5iZWdpbigpOworICAgICAgICAgIGVsc2UgaWYgKEJCSSAhPSBCQi5iZWdpbigpKSAgLy8gUmV2aXNpdCB0aGlzIGluc3RydWN0aW9uIGlmIHBvc3NpYmxlLgorICAgICAgICAgICAgLS1CQkk7CisgICAgICAgICAgKytOdW1GYXN0U3RvcmVzOworICAgICAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIElmIHRoaXMgaXMgYSBsaWZldGltZSBlbmQgbWFya2VyLCB3ZSBjYW4gdGhyb3cgYXdheSB0aGUgc3RvcmUuCisgICAgaWYgKEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oSW5zdERlcC5nZXRJbnN0KCkpKSB7CisgICAgICBpZiAoSUktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpsaWZldGltZV9lbmQpIHsKKyAgICAgICAgLy8gRGVsZXRlIHRoZSBzdG9yZSBhbmQgbm93LWRlYWQgaW5zdHJ1Y3Rpb25zIHRoYXQgZmVlZCBpdC4KKyAgICAgICAgLy8gRGVsZXRlRGVhZEluc3RydWN0aW9uIGNhbiBkZWxldGUgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICBTYXZlIEJCSQorICAgICAgICAvLyBpbiBjYXNlIHdlIG5lZWQgaXQuCisgICAgICAgIFdlYWtWSCBOZXh0SW5zdChCQkkpOworICAgICAgICAKKyAgICAgICAgRGVsZXRlRGVhZEluc3RydWN0aW9uKEluc3QpOworICAgICAgICAKKyAgICAgICAgaWYgKE5leHRJbnN0ID09IDApICAvLyBOZXh0IGluc3RydWN0aW9uIGRlbGV0ZWQuCisgICAgICAgICAgQkJJID0gQkIuYmVnaW4oKTsKKyAgICAgICAgZWxzZSBpZiAoQkJJICE9IEJCLmJlZ2luKCkpICAvLyBSZXZpc2l0IHRoaXMgaW5zdHJ1Y3Rpb24gaWYgcG9zc2libGUuCisgICAgICAgICAgLS1CQkk7CisgICAgICAgICsrTnVtRmFzdFN0b3JlczsKKyAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLy8gSWYgdGhpcyBibG9jayBlbmRzIGluIGEgcmV0dXJuLCB1bndpbmQsIG9yIHVucmVhY2hhYmxlLCBhbGwgYWxsb2NhcyBhcmUKKyAgLy8gZGVhZCBhdCBpdHMgZW5kLCB3aGljaCBtZWFucyBzdG9yZXMgdG8gdGhlbSBhcmUgYWxzbyBkZWFkLgorICBpZiAoQkIuZ2V0VGVybWluYXRvcigpLT5nZXROdW1TdWNjZXNzb3JzKCkgPT0gMCkKKyAgICBNYWRlQ2hhbmdlIHw9IGhhbmRsZUVuZEJsb2NrKEJCKTsKKyAgCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisvLy8gaGFuZGxlRnJlZVdpdGhOb25Ucml2aWFsRGVwZW5kZW5jeSAtIEhhbmRsZSBmcmVlcyBvZiBlbnRpcmUgc3RydWN0dXJlcyB3aG9zZQorLy8vIGRlcGVuZGVuY3kgaXMgYSBzdG9yZSB0byBhIGZpZWxkIG9mIHRoYXQgc3RydWN0dXJlLgorYm9vbCBEU0U6OmhhbmRsZUZyZWVXaXRoTm9uVHJpdmlhbERlcGVuZGVuY3koY29uc3QgQ2FsbEluc3QgKkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1EZXBSZXN1bHQgRGVwKSB7CisgIEFsaWFzQW5hbHlzaXMgJkFBID0gZ2V0QW5hbHlzaXM8QWxpYXNBbmFseXNpcz4oKTsKKyAgCisgIEluc3RydWN0aW9uICpEZXBlbmRlbmN5ID0gRGVwLmdldEluc3QoKTsKKyAgaWYgKCFEZXBlbmRlbmN5IHx8ICFkb2VzQ2xvYmJlck1lbW9yeShEZXBlbmRlbmN5KSB8fCAhaXNFbGlkYWJsZShEZXBlbmRlbmN5KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBWYWx1ZSAqRGVwUG9pbnRlciA9IGdldFBvaW50ZXJPcGVyYW5kKERlcGVuZGVuY3kpLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCk7CisKKyAgLy8gQ2hlY2sgZm9yIGFsaWFzaW5nLgorICBpZiAoQUEuYWxpYXMoRi0+Z2V0QXJnT3BlcmFuZCgwKSwgMSwgRGVwUG9pbnRlciwgMSkgIT0KKyAgICAgICAgIEFsaWFzQW5hbHlzaXM6Ok11c3RBbGlhcykKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICAvLyBEQ0UgaW5zdHJ1Y3Rpb25zIG9ubHkgdXNlZCB0byBjYWxjdWxhdGUgdGhhdCBzdG9yZQorICBEZWxldGVEZWFkSW5zdHJ1Y3Rpb24oRGVwZW5kZW5jeSk7CisgICsrTnVtRmFzdFN0b3JlczsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBoYW5kbGVFbmRCbG9jayAtIFJlbW92ZSBkZWFkIHN0b3JlcyB0byBzdGFjay1hbGxvY2F0ZWQgbG9jYXRpb25zIGluIHRoZQorLy8vIGZ1bmN0aW9uIGVuZCBibG9jay4gIEV4OgorLy8vICVBID0gYWxsb2NhIGkzMgorLy8vIC4uLgorLy8vIHN0b3JlIGkzMiAxLCBpMzIqICVBCisvLy8gcmV0IHZvaWQKK2Jvb2wgRFNFOjpoYW5kbGVFbmRCbG9jayhCYXNpY0Jsb2NrICZCQikgeworICBBbGlhc0FuYWx5c2lzICZBQSA9IGdldEFuYWx5c2lzPEFsaWFzQW5hbHlzaXM+KCk7CisgIAorICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgCisgIC8vIFBvaW50ZXJzIGFsbG9jYSdkIGluIHRoaXMgZnVuY3Rpb24gYXJlIGRlYWQgaW4gdGhlIGVuZCBibG9jaworICBTbWFsbFB0clNldDxWYWx1ZSosIDY0PiBkZWFkUG9pbnRlcnM7CisgIAorICAvLyBGaW5kIGFsbCBvZiB0aGUgYWxsb2NhJ2QgcG9pbnRlcnMgaW4gdGhlIGVudHJ5IGJsb2NrLgorICBCYXNpY0Jsb2NrICpFbnRyeSA9IEJCLmdldFBhcmVudCgpLT5iZWdpbigpOworICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBFbnRyeS0+YmVnaW4oKSwgRSA9IEVudHJ5LT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKEFsbG9jYUluc3QgKkFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oSSkpCisgICAgICBkZWFkUG9pbnRlcnMuaW5zZXJ0KEFJKTsKKyAgCisgIC8vIFRyZWF0IGJ5dmFsIGFyZ3VtZW50cyB0aGUgc2FtZSwgc3RvcmVzIHRvIHRoZW0gYXJlIGRlYWQgYXQgdGhlIGVuZCBvZiB0aGUKKyAgLy8gZnVuY3Rpb24uCisgIGZvciAoRnVuY3Rpb246OmFyZ19pdGVyYXRvciBBSSA9IEJCLmdldFBhcmVudCgpLT5hcmdfYmVnaW4oKSwKKyAgICAgICBBRSA9IEJCLmdldFBhcmVudCgpLT5hcmdfZW5kKCk7IEFJICE9IEFFOyArK0FJKQorICAgIGlmIChBSS0+aGFzQnlWYWxBdHRyKCkpCisgICAgICBkZWFkUG9pbnRlcnMuaW5zZXJ0KEFJKTsKKyAgCisgIC8vIFNjYW4gdGhlIGJhc2ljIGJsb2NrIGJhY2t3YXJkcworICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9IEJCLmVuZCgpOyBCQkkgIT0gQkIuYmVnaW4oKTsgKXsKKyAgICAtLUJCSTsKKyAgICAKKyAgICAvLyBJZiB3ZSBmaW5kIGEgc3RvcmUgd2hvc2UgcG9pbnRlciBpcyBkZWFkLgorICAgIGlmIChkb2VzQ2xvYmJlck1lbW9yeShCQkkpKSB7CisgICAgICBpZiAoaXNFbGlkYWJsZShCQkkpKSB7CisgICAgICAgIC8vIFNlZSB0aHJvdWdoIHBvaW50ZXItdG8tcG9pbnRlciBiaXRjYXN0cworICAgICAgICBWYWx1ZSAqcG9pbnRlck9wZXJhbmQgPSBnZXRQb2ludGVyT3BlcmFuZChCQkkpLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCk7CisKKyAgICAgICAgLy8gQWxsb2NhJ2QgcG9pbnRlcnMgb3IgYnl2YWwgYXJndW1lbnRzICh3aGljaCBhcmUgZnVuY3Rpb25hbGx5IGxpa2UKKyAgICAgICAgLy8gYWxsb2NhJ3MpIGFyZSB2YWxpZCBjYW5kaWRhdGVzIGZvciByZW1vdmFsLgorICAgICAgICBpZiAoZGVhZFBvaW50ZXJzLmNvdW50KHBvaW50ZXJPcGVyYW5kKSkgeworICAgICAgICAgIC8vIERDRSBpbnN0cnVjdGlvbnMgb25seSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGF0IHN0b3JlLgorICAgICAgICAgIEluc3RydWN0aW9uICpEZWFkID0gQkJJOworICAgICAgICAgICsrQkJJOworICAgICAgICAgIERlbGV0ZURlYWRJbnN0cnVjdGlvbihEZWFkLCAmZGVhZFBvaW50ZXJzKTsKKyAgICAgICAgICArK051bUZhc3RTdG9yZXM7CisgICAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gQmVjYXVzZSBhIG1lbWNweSBvciBtZW1tb3ZlIGlzIGFsc28gYSBsb2FkLCB3ZSBjYW4ndCBza2lwIGl0IGlmIHdlCisgICAgICAvLyBkaWRuJ3QgcmVtb3ZlIGl0LgorICAgICAgaWYgKCFpc2E8TWVtVHJhbnNmZXJJbnN0PihCQkkpKQorICAgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgVmFsdWUgKmtpbGxQb2ludGVyID0gMDsKKyAgICB1aW50NjRfdCBraWxsUG9pbnRlclNpemUgPSB+MFVMOworICAgIAorICAgIC8vIElmIHdlIGVuY291bnRlciBhIHVzZSBvZiB0aGUgcG9pbnRlciwgaXQgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgZGVhZAorICAgIGlmIChMb2FkSW5zdCAqTCA9IGR5bl9jYXN0PExvYWRJbnN0PihCQkkpKSB7CisgICAgICAvLyBIb3dldmVyLCBpZiB0aGlzIGxvYWQgaXMgdW51c2VkIGFuZCBub3Qgdm9sYXRpbGUsIHdlIGNhbiBnbyBhaGVhZCBhbmQKKyAgICAgIC8vIHJlbW92ZSBpdCwgYW5kIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0IG1ha2luZyBvdXIgcG9pbnRlciB1bmRlYWQhCisgICAgICBpZiAoTC0+dXNlX2VtcHR5KCkgJiYgIUwtPmlzVm9sYXRpbGUoKSkgeworICAgICAgICArK0JCSTsKKyAgICAgICAgRGVsZXRlRGVhZEluc3RydWN0aW9uKEwsICZkZWFkUG9pbnRlcnMpOworICAgICAgICArK051bUZhc3RPdGhlcjsKKyAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICBraWxsUG9pbnRlciA9IEwtPmdldFBvaW50ZXJPcGVyYW5kKCk7CisgICAgfSBlbHNlIGlmIChpc2E8TWVtVHJhbnNmZXJJbnN0PihCQkkpICYmCisgICAgICAgICAgICAgICBpc2E8Q29uc3RhbnRJbnQ+KGNhc3Q8TWVtVHJhbnNmZXJJbnN0PihCQkkpLT5nZXRMZW5ndGgoKSkpIHsKKyAgICAgIGtpbGxQb2ludGVyID0gY2FzdDxNZW1UcmFuc2Zlckluc3Q+KEJCSSktPmdldFNvdXJjZSgpOworICAgICAga2lsbFBvaW50ZXJTaXplID0gY2FzdDxDb25zdGFudEludD4oCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8TWVtVHJhbnNmZXJJbnN0PihCQkkpLT5nZXRMZW5ndGgoKSktPmdldFpFeHRWYWx1ZSgpOworICAgIH0gZWxzZSBpZiAoQWxsb2NhSW5zdCAqQSA9IGR5bl9jYXN0PEFsbG9jYUluc3Q+KEJCSSkpIHsKKyAgICAgIGRlYWRQb2ludGVycy5lcmFzZShBKTsKKyAgICAgIAorICAgICAgLy8gRGVhZCBhbGxvY2EncyBjYW4gYmUgRENFJ2Qgd2hlbiB3ZSByZWFjaCB0aGVtCisgICAgICBpZiAoQS0+dXNlX2VtcHR5KCkpIHsKKyAgICAgICAgKytCQkk7CisgICAgICAgIERlbGV0ZURlYWRJbnN0cnVjdGlvbihBLCAmZGVhZFBvaW50ZXJzKTsKKyAgICAgICAgKytOdW1GYXN0T3RoZXI7CisgICAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgICAgfQorICAgICAgCisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKENhbGxTaXRlIENTID0gY2FzdDxWYWx1ZT4oQkJJKSkgeworICAgICAgLy8gSWYgdGhpcyBjYWxsIGRvZXMgbm90IGFjY2VzcyBtZW1vcnksIGl0IGNhbid0CisgICAgICAvLyBiZSB1bmRlYWRpZnlpbmcgYW55IG9mIG91ciBwb2ludGVycy4KKyAgICAgIGlmIChBQS5kb2VzTm90QWNjZXNzTWVtb3J5KENTKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIHVuc2lnbmVkIG1vZFJlZiA9IDA7CisgICAgICB1bnNpZ25lZCBvdGhlciA9IDA7CisgICAgICAKKyAgICAgIC8vIFJlbW92ZSBhbnkgcG9pbnRlcnMgbWFkZSB1bmRlYWQgYnkgdGhlIGNhbGwgZnJvbSB0aGUgZGVhZCBzZXQKKyAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gZGVhZDsKKyAgICAgIGZvciAoU21hbGxQdHJTZXQ8VmFsdWUqLCA2ND46Oml0ZXJhdG9yIEkgPSBkZWFkUG9pbnRlcnMuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IGRlYWRQb2ludGVycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgLy8gSEFDSzogaWYgd2UgZGV0ZWN0IHRoYXQgb3VyIEFBIGlzIGltcHJlY2lzZSwgaXQncyBub3QKKyAgICAgICAgLy8gd29ydGggaXQgdG8gc2NhbiB0aGUgcmVzdCBvZiB0aGUgZGVhZFBvaW50ZXJzIHNldC4gIEp1c3QKKyAgICAgICAgLy8gYXNzdW1lIHRoYXQgdGhlIEFBIHdpbGwgcmV0dXJuIE1vZFJlZiBmb3IgZXZlcnl0aGluZywgYW5kCisgICAgICAgIC8vIGdvIGFoZWFkIGFuZCBiYWlsLgorICAgICAgICBpZiAobW9kUmVmID49IDE2ICYmIG90aGVyID09IDApIHsKKyAgICAgICAgICBkZWFkUG9pbnRlcnMuY2xlYXIoKTsKKyAgICAgICAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU2VlIGlmIHRoZSBjYWxsIHNpdGUgdG91Y2hlcyBpdAorICAgICAgICBBbGlhc0FuYWx5c2lzOjpNb2RSZWZSZXN1bHQgQSA9IEFBLmdldE1vZFJlZkluZm8oQ1MsICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnRlclNpemUoKkkpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChBID09IEFsaWFzQW5hbHlzaXM6Ok1vZFJlZikKKyAgICAgICAgICArK21vZFJlZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICsrb3RoZXI7CisgICAgICAgIAorICAgICAgICBpZiAoQSA9PSBBbGlhc0FuYWx5c2lzOjpNb2RSZWYgfHwgQSA9PSBBbGlhc0FuYWx5c2lzOjpSZWYpCisgICAgICAgICAgZGVhZC5wdXNoX2JhY2soKkkpOworICAgICAgfQorCisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPFZhbHVlKj46Oml0ZXJhdG9yIEkgPSBkZWFkLmJlZ2luKCksIEUgPSBkZWFkLmVuZCgpOworICAgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgICAgZGVhZFBvaW50ZXJzLmVyYXNlKCpJKTsKKyAgICAgIAorICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChpc0luc3RydWN0aW9uVHJpdmlhbGx5RGVhZChCQkkpKSB7CisgICAgICAvLyBGb3IgYW55IG5vbi1tZW1vcnktYWZmZWN0aW5nIG5vbi10ZXJtaW5hdG9ycywgRENFIHRoZW0gYXMgd2UgcmVhY2ggdGhlbQorICAgICAgSW5zdHJ1Y3Rpb24gKkluc3QgPSBCQkk7CisgICAgICArK0JCSTsKKyAgICAgIERlbGV0ZURlYWRJbnN0cnVjdGlvbihJbnN0LCAmZGVhZFBvaW50ZXJzKTsKKyAgICAgICsrTnVtRmFzdE90aGVyOworICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgaWYgKCFraWxsUG9pbnRlcikKKyAgICAgIGNvbnRpbnVlOworCisgICAga2lsbFBvaW50ZXIgPSBraWxsUG9pbnRlci0+Z2V0VW5kZXJseWluZ09iamVjdCgpOworCisgICAgLy8gRGVhbCB3aXRoIHVuZGVhZCBwb2ludGVycworICAgIE1hZGVDaGFuZ2UgfD0gUmVtb3ZlVW5kZWFkUG9pbnRlcnMoa2lsbFBvaW50ZXIsIGtpbGxQb2ludGVyU2l6ZSwgQkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhZFBvaW50ZXJzKTsKKyAgfQorICAKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vLyBSZW1vdmVVbmRlYWRQb2ludGVycyAtIGNoZWNrIGZvciB1c2VzIG9mIGEgcG9pbnRlciB0aGF0IG1ha2UgaXQKKy8vLyB1bmRlYWQgd2hlbiBzY2FubmluZyBmb3IgZGVhZCBzdG9yZXMgdG8gYWxsb2NhJ3MuCitib29sIERTRTo6UmVtb3ZlVW5kZWFkUG9pbnRlcnMoVmFsdWUgKmtpbGxQb2ludGVyLCB1aW50NjRfdCBraWxsUG9pbnRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgJkJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxWYWx1ZSosIDY0PiAmZGVhZFBvaW50ZXJzKSB7CisgIEFsaWFzQW5hbHlzaXMgJkFBID0gZ2V0QW5hbHlzaXM8QWxpYXNBbmFseXNpcz4oKTsKKworICAvLyBJZiB0aGUga2lsbCBwb2ludGVyIGNhbiBiZSBlYXNpbHkgcmVkdWNlZCB0byBhbiBhbGxvY2EsCisgIC8vIGRvbid0IGJvdGhlciBkb2luZyBleHRyYW5lb3VzIEFBIHF1ZXJpZXMuCisgIGlmIChkZWFkUG9pbnRlcnMuY291bnQoa2lsbFBvaW50ZXIpKSB7CisgICAgZGVhZFBvaW50ZXJzLmVyYXNlKGtpbGxQb2ludGVyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIEEgZ2xvYmFsIGNhbid0IGJlIGluIHRoZSBkZWFkIHBvaW50ZXIgc2V0LgorICBpZiAoaXNhPEdsb2JhbFZhbHVlPihraWxsUG9pbnRlcikpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIAorICBTbWFsbFZlY3RvcjxWYWx1ZSosIDE2PiB1bmRlYWQ7CisgIAorICBmb3IgKFNtYWxsUHRyU2V0PFZhbHVlKiwgNjQ+OjppdGVyYXRvciBJID0gZGVhZFBvaW50ZXJzLmJlZ2luKCksCisgICAgICAgRSA9IGRlYWRQb2ludGVycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAvLyBTZWUgaWYgdGhpcyBwb2ludGVyIGNvdWxkIGFsaWFzIGl0CisgICAgQWxpYXNBbmFseXNpczo6QWxpYXNSZXN1bHQgQSA9IEFBLmFsaWFzKCpJLCBnZXRQb2ludGVyU2l6ZSgqSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxQb2ludGVyLCBraWxsUG9pbnRlclNpemUpOworCisgICAgLy8gSWYgaXQgbXVzdC1hbGlhcyBhbmQgYSBzdG9yZSwgd2UgY2FuIGRlbGV0ZSBpdAorICAgIGlmIChpc2E8U3RvcmVJbnN0PihCQkkpICYmIEEgPT0gQWxpYXNBbmFseXNpczo6TXVzdEFsaWFzKSB7CisgICAgICBTdG9yZUluc3QgKlMgPSBjYXN0PFN0b3JlSW5zdD4oQkJJKTsKKworICAgICAgLy8gUmVtb3ZlIGl0IQorICAgICAgKytCQkk7CisgICAgICBEZWxldGVEZWFkSW5zdHJ1Y3Rpb24oUywgJmRlYWRQb2ludGVycyk7CisgICAgICArK051bUZhc3RTdG9yZXM7CisgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKworICAgICAgY29udGludWU7CisKKyAgICAgIC8vIE90aGVyd2lzZSwgaXQgaXMgdW5kZWFkCisgICAgfSBlbHNlIGlmIChBICE9IEFsaWFzQW5hbHlzaXM6Ok5vQWxpYXMpCisgICAgICB1bmRlYWQucHVzaF9iYWNrKCpJKTsKKyAgfQorCisgIGZvciAoU21hbGxWZWN0b3I8VmFsdWUqLCAxNj46Oml0ZXJhdG9yIEkgPSB1bmRlYWQuYmVnaW4oKSwgRSA9IHVuZGVhZC5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIGRlYWRQb2ludGVycy5lcmFzZSgqSSk7CisgIAorICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworLy8vIERlbGV0ZURlYWRJbnN0cnVjdGlvbiAtIERlbGV0ZSB0aGlzIGluc3RydWN0aW9uLiAgQmVmb3JlIHdlIGRvLCBnbyB0aHJvdWdoCisvLy8gYW5kIHplcm8gb3V0IGFsbCB0aGUgb3BlcmFuZHMgb2YgdGhpcyBpbnN0cnVjdGlvbi4gIElmIGFueSBvZiB0aGVtIGJlY29tZQorLy8vIGRlYWQsIGRlbGV0ZSB0aGVtIGFuZCB0aGUgY29tcHV0YXRpb24gdHJlZSB0aGF0IGZlZWRzIHRoZW0uCisvLy8KKy8vLyBJZiBWYWx1ZVNldCBpcyBub24tbnVsbCwgcmVtb3ZlIGFueSBkZWxldGVkIGluc3RydWN0aW9ucyBmcm9tIGl0IGFzIHdlbGwuCisvLy8KK3ZvaWQgRFNFOjpEZWxldGVEZWFkSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PFZhbHVlKiwgNjQ+ICpWYWx1ZVNldCkgeworICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiosIDMyPiBOb3dEZWFkSW5zdHM7CisgIAorICBOb3dEZWFkSW5zdHMucHVzaF9iYWNrKEkpOworICAtLU51bUZhc3RPdGhlcjsKKworICAvLyBCZWZvcmUgd2UgdG91Y2ggdGhpcyBpbnN0cnVjdGlvbiwgcmVtb3ZlIGl0IGZyb20gbWVtZGVwIQorICBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMgJk1EQSA9IGdldEFuYWx5c2lzPE1lbW9yeURlcGVuZGVuY2VBbmFseXNpcz4oKTsKKyAgZG8geworICAgIEluc3RydWN0aW9uICpEZWFkSW5zdCA9IE5vd0RlYWRJbnN0cy5wb3BfYmFja192YWwoKTsKKyAgICAKKyAgICArK051bUZhc3RPdGhlcjsKKyAgICAKKyAgICAvLyBUaGlzIGluc3RydWN0aW9uIGlzIGRlYWQsIHphcCBpdCwgaW4gc3RhZ2VzLiAgU3RhcnQgYnkgcmVtb3ZpbmcgaXQgZnJvbQorICAgIC8vIE1lbURlcCwgd2hpY2ggbmVlZHMgdG8ga25vdyB0aGUgb3BlcmFuZHMgYW5kIG5lZWRzIGl0IHRvIGJlIGluIHRoZQorICAgIC8vIGZ1bmN0aW9uLgorICAgIE1EQS5yZW1vdmVJbnN0cnVjdGlvbihEZWFkSW5zdCk7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBvcCA9IDAsIGUgPSBEZWFkSW5zdC0+Z2V0TnVtT3BlcmFuZHMoKTsgb3AgIT0gZTsgKytvcCkgeworICAgICAgVmFsdWUgKk9wID0gRGVhZEluc3QtPmdldE9wZXJhbmQob3ApOworICAgICAgRGVhZEluc3QtPnNldE9wZXJhbmQob3AsIDApOworICAgICAgCisgICAgICAvLyBJZiB0aGlzIG9wZXJhbmQganVzdCBiZWNhbWUgZGVhZCwgYWRkIGl0IHRvIHRoZSBOb3dEZWFkSW5zdHMgbGlzdC4KKyAgICAgIGlmICghT3AtPnVzZV9lbXB0eSgpKSBjb250aW51ZTsKKyAgICAgIAorICAgICAgaWYgKEluc3RydWN0aW9uICpPcEkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oT3ApKQorICAgICAgICBpZiAoaXNJbnN0cnVjdGlvblRyaXZpYWxseURlYWQoT3BJKSkKKyAgICAgICAgICBOb3dEZWFkSW5zdHMucHVzaF9iYWNrKE9wSSk7CisgICAgfQorICAgIAorICAgIERlYWRJbnN0LT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAKKyAgICBpZiAoVmFsdWVTZXQpIFZhbHVlU2V0LT5lcmFzZShEZWFkSW5zdCk7CisgIH0gd2hpbGUgKCFOb3dEZWFkSW5zdHMuZW1wdHkoKSk7Cit9CisKK3Vuc2lnbmVkIERTRTo6Z2V0UG9pbnRlclNpemUoVmFsdWUgKlYpIGNvbnN0IHsKKyAgaWYgKFREKSB7CisgICAgaWYgKEFsbG9jYUluc3QgKkEgPSBkeW5fY2FzdDxBbGxvY2FJbnN0PihWKSkgeworICAgICAgLy8gR2V0IHNpemUgaW5mb3JtYXRpb24gZm9yIHRoZSBhbGxvY2EKKyAgICAgIGlmIChDb25zdGFudEludCAqQyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihBLT5nZXRBcnJheVNpemUoKSkpCisgICAgICAgIHJldHVybiBDLT5nZXRaRXh0VmFsdWUoKSAqIFRELT5nZXRUeXBlQWxsb2NTaXplKEEtPmdldEFsbG9jYXRlZFR5cGUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChpc2E8QXJndW1lbnQ+KFYpICYmICJFeHBlY3RlZCBBbGxvY2FJbnN0IG9yIEFyZ3VtZW50ISIpOworICAgICAgY29uc3QgUG9pbnRlclR5cGUgKlBUID0gY2FzdDxQb2ludGVyVHlwZT4oVi0+Z2V0VHlwZSgpKTsKKyAgICAgIHJldHVybiBURC0+Z2V0VHlwZUFsbG9jU2l6ZShQVC0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgfQorICB9CisgIHJldHVybiB+MFU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvR0VQU3BsaXR0ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL0dFUFNwbGl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE1MzhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL0dFUFNwbGl0dGVyLmNwcApAQCAtMCwwICsxLDgxIEBACisvLz09PS0gR0VQU3BsaXR0ZXIuY3BwIC0gU3BsaXQgY29tcGxleCBHRVBzIGludG8gc2ltcGxlIG9uZXMgLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZnVuY3Rpb24gYnJlYWtzIEdFUHMgd2l0aCBtb3JlIHRoYW4gMiBub24temVybyBvcGVyYW5kcyBpbnRvIHNtYWxsZXIKKy8vIEdFUHMgZWFjaCB3aXRoIG5vIG1vcmUgdGhhbiAyIG5vbi16ZXJvIG9wZXJhbmRzLiBUaGlzIGV4cG9zZXMgcmVkdW5kYW5jeQorLy8gYmV0d2VlbiBHRVBzIHdpdGggY29tbW9uIGluaXRpYWwgb3BlcmFuZCBzZXF1ZW5jZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzcGxpdC1nZXBzIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIGNsYXNzIEdFUFNwbGl0dGVyIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgICAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdDsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgZXhwbGljaXQgR0VQU3BsaXR0ZXIoKSA6IEZ1bmN0aW9uUGFzcyhJRCkge30KKyAgfTsKK30KKworY2hhciBHRVBTcGxpdHRlcjo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKEdFUFNwbGl0dGVyLCAic3BsaXQtZ2VwcyIsCisgICAgICAgICAgICAgICAgInNwbGl0IGNvbXBsZXggR0VQcyBpbnRvIHNpbXBsZSBHRVBzIiwgZmFsc2UsIGZhbHNlKTsKKworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVHRVBTcGxpdHRlclBhc3MoKSB7CisgIHJldHVybiBuZXcgR0VQU3BsaXR0ZXIoKTsKK30KKworYm9vbCBHRVBTcGxpdHRlcjo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICAvLyBWaXNpdCBlYWNoIEdFUCBpbnN0cnVjdGlvbi4KKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IEYuYmVnaW4oKSwgRSA9IEYuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSUkgPSBJLT5iZWdpbigpLCBJRSA9IEktPmVuZCgpOyBJSSAhPSBJRTsgKQorICAgICAgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oSUkrKykpIHsKKyAgICAgICAgdW5zaWduZWQgTnVtT3BzID0gR0VQLT5nZXROdW1PcGVyYW5kcygpOworICAgICAgICAvLyBJZ25vcmUgR0VQcyB3aGljaCBhcmUgYWxyZWFkeSBzaW1wbGUuCisgICAgICAgIGlmIChOdW1PcHMgPD0gMikKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYm9vbCBGaXJzdEluZGV4SXNaZXJvID0gaXNhPENvbnN0YW50SW50PihHRVAtPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KEdFUC0+Z2V0T3BlcmFuZCgxKSktPmlzWmVybygpOworICAgICAgICBpZiAoTnVtT3BzID09IDMgJiYgRmlyc3RJbmRleElzWmVybykKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gVGhlIGZpcnN0IGluZGV4IGlzIHNwZWNpYWwgYW5kIGdldHMgZXhwYW5kZWQgd2l0aCBhIDItb3BlcmFuZCBHRVAKKyAgICAgICAgLy8gKHVubGVzcyBpdCdzIHplcm8sIGluIHdoaWNoIGNhc2Ugd2UgY2FuIHNraXAgdGhpcykuCisgICAgICAgIFZhbHVlICpOZXdHRVAgPSBGaXJzdEluZGV4SXNaZXJvID8KKyAgICAgICAgICBHRVAtPmdldE9wZXJhbmQoMCkgOgorICAgICAgICAgIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoR0VQLT5nZXRPcGVyYW5kKDApLCBHRVAtPmdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVApOworICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGluZGljZXMgZ2V0IGV4cGFuZGVkIHdpdGggYSAzLW9wZXJhbmQgR0VQIHdpdGggemVybworICAgICAgICAvLyBhcyB0aGUgc2Vjb25kIG9wZXJhbmQuCisgICAgICAgIFZhbHVlICpJZHhzWzJdOworICAgICAgICBJZHhzWzBdID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KEYuZ2V0Q29udGV4dCgpKSwgMCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDI7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICAgICAgICBJZHhzWzFdID0gR0VQLT5nZXRPcGVyYW5kKGkpOworICAgICAgICAgIE5ld0dFUCA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoTmV3R0VQLCBJZHhzLCBJZHhzKzIsIEdFUCk7CisgICAgICAgIH0KKyAgICAgICAgR0VQLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3R0VQKTsKKyAgICAgICAgR0VQLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK3ZvaWQgR0VQU3BsaXR0ZXI6OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgQVUuc2V0UHJlc2VydmVzQ0ZHKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvR1ZOLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9HVk4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZmI2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvR1ZOLmNwcApAQCAtMCwwICsxLDIzMTYgQEAKKy8vPT09LSBHVk4uY3BwIC0gRWxpbWluYXRlIHJlZHVuZGFudCB2YWx1ZXMgYW5kIGxvYWRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHBlcmZvcm1zIGdsb2JhbCB2YWx1ZSBudW1iZXJpbmcgdG8gZWxpbWluYXRlIGZ1bGx5IHJlZHVuZGFudAorLy8gaW5zdHJ1Y3Rpb25zLiAgSXQgYWxzbyBwZXJmb3JtcyBzaW1wbGUgZGVhZCBsb2FkIGVsaW1pbmF0aW9uLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIHBhc3MgZG9lcyB0aGUgdmFsdWUgbnVtYmVyaW5nIGl0c2VsZjsgaXQgZG9lcyBub3QgdXNlIHRoZQorLy8gVmFsdWVOdW1iZXJpbmcgYW5hbHlzaXMgcGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiZ3ZuIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb2Fkcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9QSElUcmFuc0FkZHIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Jhc2ljQmxvY2tVdGlscy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9TU0FVcGRhdGVyLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUdWTkluc3RyLCAgIk51bWJlciBvZiBpbnN0cnVjdGlvbnMgZGVsZXRlZCIpOworU1RBVElTVElDKE51bUdWTkxvYWQsICAgIk51bWJlciBvZiBsb2FkcyBkZWxldGVkIik7CitTVEFUSVNUSUMoTnVtR1ZOUFJFLCAgICAiTnVtYmVyIG9mIGluc3RydWN0aW9ucyBQUkUnZCIpOworU1RBVElTVElDKE51bUdWTkJsb2NrcywgIk51bWJlciBvZiBibG9ja3MgbWVyZ2VkIik7CitTVEFUSVNUSUMoTnVtUFJFTG9hZCwgICAiTnVtYmVyIG9mIGxvYWRzIFBSRSdkIik7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IEVuYWJsZVBSRSgiZW5hYmxlLXByZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQodHJ1ZSksIGNsOjpIaWRkZW4pOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRW5hYmxlTG9hZFBSRSgiZW5hYmxlLWxvYWQtcHJlIiwgY2w6OmluaXQodHJ1ZSkpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRW5hYmxlRnVsbExvYWRQUkUoImVuYWJsZS1mdWxsLWxvYWQtcHJlIiwgY2w6OmluaXQoZmFsc2UpKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVGFibGUgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIGhvbGRzIHRoZSBtYXBwaW5nIGJldHdlZW4gdmFsdWVzIGFuZCB2YWx1ZSBudW1iZXJzLiAgSXQgaXMgdXNlZAorLy8vIGFzIGFuIGVmZmljaWVudCBtZWNoYW5pc20gdG8gZGV0ZXJtaW5lIHRoZSBleHByZXNzaW9uLXdpc2UgZXF1aXZhbGVuY2Ugb2YKKy8vLyB0d28gdmFsdWVzLgorbmFtZXNwYWNlIHsKKyAgc3RydWN0IEV4cHJlc3Npb24geworICAgIGVudW0gRXhwcmVzc2lvbk9wY29kZSB7IAorICAgICAgQUREID0gSW5zdHJ1Y3Rpb246OkFkZCwKKyAgICAgIEZBREQgPSBJbnN0cnVjdGlvbjo6RkFkZCwKKyAgICAgIFNVQiA9IEluc3RydWN0aW9uOjpTdWIsCisgICAgICBGU1VCID0gSW5zdHJ1Y3Rpb246OkZTdWIsCisgICAgICBNVUwgPSBJbnN0cnVjdGlvbjo6TXVsLAorICAgICAgRk1VTCA9IEluc3RydWN0aW9uOjpGTXVsLAorICAgICAgVURJViA9IEluc3RydWN0aW9uOjpVRGl2LAorICAgICAgU0RJViA9IEluc3RydWN0aW9uOjpTRGl2LAorICAgICAgRkRJViA9IEluc3RydWN0aW9uOjpGRGl2LAorICAgICAgVVJFTSA9IEluc3RydWN0aW9uOjpVUmVtLAorICAgICAgU1JFTSA9IEluc3RydWN0aW9uOjpTUmVtLAorICAgICAgRlJFTSA9IEluc3RydWN0aW9uOjpGUmVtLAorICAgICAgU0hMID0gSW5zdHJ1Y3Rpb246OlNobCwKKyAgICAgIExTSFIgPSBJbnN0cnVjdGlvbjo6TFNociwKKyAgICAgIEFTSFIgPSBJbnN0cnVjdGlvbjo6QVNociwKKyAgICAgIEFORCA9IEluc3RydWN0aW9uOjpBbmQsCisgICAgICBPUiA9IEluc3RydWN0aW9uOjpPciwKKyAgICAgIFhPUiA9IEluc3RydWN0aW9uOjpYb3IsCisgICAgICBUUlVOQyA9IEluc3RydWN0aW9uOjpUcnVuYywKKyAgICAgIFpFWFQgPSBJbnN0cnVjdGlvbjo6WkV4dCwKKyAgICAgIFNFWFQgPSBJbnN0cnVjdGlvbjo6U0V4dCwKKyAgICAgIEZQVE9VSSA9IEluc3RydWN0aW9uOjpGUFRvVUksCisgICAgICBGUFRPU0kgPSBJbnN0cnVjdGlvbjo6RlBUb1NJLAorICAgICAgVUlUT0ZQID0gSW5zdHJ1Y3Rpb246OlVJVG9GUCwKKyAgICAgIFNJVE9GUCA9IEluc3RydWN0aW9uOjpTSVRvRlAsCisgICAgICBGUFRSVU5DID0gSW5zdHJ1Y3Rpb246OkZQVHJ1bmMsCisgICAgICBGUEVYVCA9IEluc3RydWN0aW9uOjpGUEV4dCwKKyAgICAgIFBUUlRPSU5UID0gSW5zdHJ1Y3Rpb246OlB0clRvSW50LAorICAgICAgSU5UVE9QVFIgPSBJbnN0cnVjdGlvbjo6SW50VG9QdHIsCisgICAgICBCSVRDQVNUID0gSW5zdHJ1Y3Rpb246OkJpdENhc3QsCisgICAgICBJQ01QRVEsIElDTVBORSwgSUNNUFVHVCwgSUNNUFVHRSwgSUNNUFVMVCwgSUNNUFVMRSwKKyAgICAgIElDTVBTR1QsIElDTVBTR0UsIElDTVBTTFQsIElDTVBTTEUsIEZDTVBPRVEsCisgICAgICBGQ01QT0dULCBGQ01QT0dFLCBGQ01QT0xULCBGQ01QT0xFLCBGQ01QT05FLAorICAgICAgRkNNUE9SRCwgRkNNUFVOTywgRkNNUFVFUSwgRkNNUFVHVCwgRkNNUFVHRSwKKyAgICAgIEZDTVBVTFQsIEZDTVBVTEUsIEZDTVBVTkUsIEVYVFJBQ1QsIElOU0VSVCwKKyAgICAgIFNIVUZGTEUsIFNFTEVDVCwgR0VQLCBDQUxMLCBDT05TVEFOVCwKKyAgICAgIElOU0VSVFZBTFVFLCBFWFRSQUNUVkFMVUUsIEVNUFRZLCBUT01CU1RPTkUgfTsKKworICAgIEV4cHJlc3Npb25PcGNvZGUgb3Bjb2RlOworICAgIGNvbnN0IFR5cGUqIHR5cGU7CisgICAgU21hbGxWZWN0b3I8dWludDMyX3QsIDQ+IHZhcmFyZ3M7CisgICAgVmFsdWUgKmZ1bmN0aW9uOworCisgICAgRXhwcmVzc2lvbigpIHsgfQorICAgIEV4cHJlc3Npb24oRXhwcmVzc2lvbk9wY29kZSBvKSA6IG9wY29kZShvKSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHByZXNzaW9uICZvdGhlcikgY29uc3QgeworICAgICAgaWYgKG9wY29kZSAhPSBvdGhlci5vcGNvZGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGVsc2UgaWYgKG9wY29kZSA9PSBFTVBUWSB8fCBvcGNvZGUgPT0gVE9NQlNUT05FKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGVsc2UgaWYgKHR5cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgZWxzZSBpZiAoZnVuY3Rpb24gIT0gb3RoZXIuZnVuY3Rpb24pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGVsc2UgeworICAgICAgICBpZiAodmFyYXJncy5zaXplKCkgIT0gb3RoZXIudmFyYXJncy5zaXplKCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFyYXJncy5zaXplKCk7ICsraSkKKyAgICAgICAgICBpZiAodmFyYXJnc1tpXSAhPSBvdGhlci52YXJhcmdzW2ldKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBFeHByZXNzaW9uICZvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKyAgfTsKKworICBjbGFzcyBWYWx1ZVRhYmxlIHsKKyAgICBwcml2YXRlOgorICAgICAgRGVuc2VNYXA8VmFsdWUqLCB1aW50MzJfdD4gdmFsdWVOdW1iZXJpbmc7CisgICAgICBEZW5zZU1hcDxFeHByZXNzaW9uLCB1aW50MzJfdD4gZXhwcmVzc2lvbk51bWJlcmluZzsKKyAgICAgIEFsaWFzQW5hbHlzaXMqIEFBOworICAgICAgTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzKiBNRDsKKyAgICAgIERvbWluYXRvclRyZWUqIERUOworCisgICAgICB1aW50MzJfdCBuZXh0VmFsdWVOdW1iZXI7CisKKyAgICAgIEV4cHJlc3Npb246OkV4cHJlc3Npb25PcGNvZGUgZ2V0T3Bjb2RlKENtcEluc3QqIEMpOworICAgICAgRXhwcmVzc2lvbiBjcmVhdGVfZXhwcmVzc2lvbihCaW5hcnlPcGVyYXRvciogQk8pOworICAgICAgRXhwcmVzc2lvbiBjcmVhdGVfZXhwcmVzc2lvbihDbXBJbnN0KiBDKTsKKyAgICAgIEV4cHJlc3Npb24gY3JlYXRlX2V4cHJlc3Npb24oU2h1ZmZsZVZlY3Rvckluc3QqIFYpOworICAgICAgRXhwcmVzc2lvbiBjcmVhdGVfZXhwcmVzc2lvbihFeHRyYWN0RWxlbWVudEluc3QqIEMpOworICAgICAgRXhwcmVzc2lvbiBjcmVhdGVfZXhwcmVzc2lvbihJbnNlcnRFbGVtZW50SW5zdCogVik7CisgICAgICBFeHByZXNzaW9uIGNyZWF0ZV9leHByZXNzaW9uKFNlbGVjdEluc3QqIFYpOworICAgICAgRXhwcmVzc2lvbiBjcmVhdGVfZXhwcmVzc2lvbihDYXN0SW5zdCogQyk7CisgICAgICBFeHByZXNzaW9uIGNyZWF0ZV9leHByZXNzaW9uKEdldEVsZW1lbnRQdHJJbnN0KiBHKTsKKyAgICAgIEV4cHJlc3Npb24gY3JlYXRlX2V4cHJlc3Npb24oQ2FsbEluc3QqIEMpOworICAgICAgRXhwcmVzc2lvbiBjcmVhdGVfZXhwcmVzc2lvbihDb25zdGFudCogQyk7CisgICAgICBFeHByZXNzaW9uIGNyZWF0ZV9leHByZXNzaW9uKEV4dHJhY3RWYWx1ZUluc3QqIEMpOworICAgICAgRXhwcmVzc2lvbiBjcmVhdGVfZXhwcmVzc2lvbihJbnNlcnRWYWx1ZUluc3QqIEMpOworICAgICAgCisgICAgICB1aW50MzJfdCBsb29rdXBfb3JfYWRkX2NhbGwoQ2FsbEluc3QqIEMpOworICAgIHB1YmxpYzoKKyAgICAgIFZhbHVlVGFibGUoKSA6IG5leHRWYWx1ZU51bWJlcigxKSB7IH0KKyAgICAgIHVpbnQzMl90IGxvb2t1cF9vcl9hZGQoVmFsdWUgKlYpOworICAgICAgdWludDMyX3QgbG9va3VwKFZhbHVlICpWKSBjb25zdDsKKyAgICAgIHZvaWQgYWRkKFZhbHVlICpWLCB1aW50MzJfdCBudW0pOworICAgICAgdm9pZCBjbGVhcigpOworICAgICAgdm9pZCBlcmFzZShWYWx1ZSAqdik7CisgICAgICB1bnNpZ25lZCBzaXplKCk7CisgICAgICB2b2lkIHNldEFsaWFzQW5hbHlzaXMoQWxpYXNBbmFseXNpcyogQSkgeyBBQSA9IEE7IH0KKyAgICAgIEFsaWFzQW5hbHlzaXMgKmdldEFsaWFzQW5hbHlzaXMoKSBjb25zdCB7IHJldHVybiBBQTsgfQorICAgICAgdm9pZCBzZXRNZW1EZXAoTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzKiBNKSB7IE1EID0gTTsgfQorICAgICAgdm9pZCBzZXREb21UcmVlKERvbWluYXRvclRyZWUqIEQpIHsgRFQgPSBEOyB9CisgICAgICB1aW50MzJfdCBnZXROZXh0VW51c2VkVmFsdWVOdW1iZXIoKSB7IHJldHVybiBuZXh0VmFsdWVOdW1iZXI7IH0KKyAgICAgIHZvaWQgdmVyaWZ5UmVtb3ZlZChjb25zdCBWYWx1ZSAqKSBjb25zdDsKKyAgfTsKK30KKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxFeHByZXNzaW9uPiB7CisgIHN0YXRpYyBpbmxpbmUgRXhwcmVzc2lvbiBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gRXhwcmVzc2lvbihFeHByZXNzaW9uOjpFTVBUWSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIEV4cHJlc3Npb24gZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBFeHByZXNzaW9uKEV4cHJlc3Npb246OlRPTUJTVE9ORSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEV4cHJlc3Npb24gZSkgeworICAgIHVuc2lnbmVkIGhhc2ggPSBlLm9wY29kZTsKKworICAgIGhhc2ggPSAoKHVuc2lnbmVkKSgodWludHB0cl90KWUudHlwZSA+PiA0KSBeCisgICAgICAgICAgICAodW5zaWduZWQpKCh1aW50cHRyX3QpZS50eXBlID4+IDkpKTsKKworICAgIGZvciAoU21hbGxWZWN0b3I8dWludDMyX3QsIDQ+Ojpjb25zdF9pdGVyYXRvciBJID0gZS52YXJhcmdzLmJlZ2luKCksCisgICAgICAgICBFID0gZS52YXJhcmdzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGhhc2ggPSAqSSArIGhhc2ggKiAzNzsKKworICAgIGhhc2ggPSAoKHVuc2lnbmVkKSgodWludHB0cl90KWUuZnVuY3Rpb24gPj4gNCkgXgorICAgICAgICAgICAgKHVuc2lnbmVkKSgodWludHB0cl90KWUuZnVuY3Rpb24gPj4gOSkpICsKKyAgICAgICAgICAgaGFzaCAqIDM3OworCisgICAgcmV0dXJuIGhhc2g7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBFeHByZXNzaW9uICZMSFMsIGNvbnN0IEV4cHJlc3Npb24gJlJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworICAKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaXNQb2RMaWtlPEV4cHJlc3Npb24+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgIFZhbHVlVGFibGUgSW50ZXJuYWwgRnVuY3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitFeHByZXNzaW9uOjpFeHByZXNzaW9uT3Bjb2RlIFZhbHVlVGFibGU6OmdldE9wY29kZShDbXBJbnN0KiBDKSB7CisgIGlmIChpc2E8SUNtcEluc3Q+KEMpKSB7CisgICAgc3dpdGNoIChDLT5nZXRQcmVkaWNhdGUoKSkgeworICAgIGRlZmF1bHQ6ICAvLyBUSElTIFNIT1VMRCBORVZFUiBIQVBQRU4KKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvbXBhcmlzb24gd2l0aCB1bmtub3duIHByZWRpY2F0ZT8iKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROiAgcmV0dXJuIEV4cHJlc3Npb246OklDTVBFUTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiAgcmV0dXJuIEV4cHJlc3Npb246OklDTVBORTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDogcmV0dXJuIEV4cHJlc3Npb246OklDTVBVR1Q7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6IHJldHVybiBFeHByZXNzaW9uOjpJQ01QVUdFOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOiByZXR1cm4gRXhwcmVzc2lvbjo6SUNNUFVMVDsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRTogcmV0dXJuIEV4cHJlc3Npb246OklDTVBVTEU7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6IHJldHVybiBFeHByZXNzaW9uOjpJQ01QU0dUOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOiByZXR1cm4gRXhwcmVzc2lvbjo6SUNNUFNHRTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogcmV0dXJuIEV4cHJlc3Npb246OklDTVBTTFQ7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6IHJldHVybiBFeHByZXNzaW9uOjpJQ01QU0xFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKEMtPmdldFByZWRpY2F0ZSgpKSB7CisgICAgZGVmYXVsdDogLy8gVEhJUyBTSE9VTEQgTkVWRVIgSEFQUEVOCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJDb21wYXJpc29uIHdpdGggdW5rbm93biBwcmVkaWNhdGU/Iik7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PRVE6IHJldHVybiBFeHByZXNzaW9uOjpGQ01QT0VROworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0dUOiByZXR1cm4gRXhwcmVzc2lvbjo6RkNNUE9HVDsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRTogcmV0dXJuIEV4cHJlc3Npb246OkZDTVBPR0U7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTFQ6IHJldHVybiBFeHByZXNzaW9uOjpGQ01QT0xUOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xFOiByZXR1cm4gRXhwcmVzc2lvbjo6RkNNUE9MRTsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09ORTogcmV0dXJuIEV4cHJlc3Npb246OkZDTVBPTkU7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PUkQ6IHJldHVybiBFeHByZXNzaW9uOjpGQ01QT1JEOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5POiByZXR1cm4gRXhwcmVzc2lvbjo6RkNNUFVOTzsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VFUTogcmV0dXJuIEV4cHJlc3Npb246OkZDTVBVRVE7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VR1Q6IHJldHVybiBFeHByZXNzaW9uOjpGQ01QVUdUOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdFOiByZXR1cm4gRXhwcmVzc2lvbjo6RkNNUFVHRTsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMVDogcmV0dXJuIEV4cHJlc3Npb246OkZDTVBVTFQ7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTEU6IHJldHVybiBFeHByZXNzaW9uOjpGQ01QVUxFOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5FOiByZXR1cm4gRXhwcmVzc2lvbjo6RkNNUFVORTsKKyAgICB9CisgIH0KK30KKworRXhwcmVzc2lvbiBWYWx1ZVRhYmxlOjpjcmVhdGVfZXhwcmVzc2lvbihDYWxsSW5zdCogQykgeworICBFeHByZXNzaW9uIGU7CisKKyAgZS50eXBlID0gQy0+Z2V0VHlwZSgpOworICBlLmZ1bmN0aW9uID0gQy0+Z2V0Q2FsbGVkRnVuY3Rpb24oKTsKKyAgZS5vcGNvZGUgPSBFeHByZXNzaW9uOjpDQUxMOworCisgIENhbGxTaXRlIENTKEMpOworICBmb3IgKENhbGxJbnN0OjpvcF9pdGVyYXRvciBJID0gQ1MuYXJnX2JlZ2luKCksIEUgPSBDUy5hcmdfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgZS52YXJhcmdzLnB1c2hfYmFjayhsb29rdXBfb3JfYWRkKCpJKSk7CisKKyAgcmV0dXJuIGU7Cit9CisKK0V4cHJlc3Npb24gVmFsdWVUYWJsZTo6Y3JlYXRlX2V4cHJlc3Npb24oQmluYXJ5T3BlcmF0b3IqIEJPKSB7CisgIEV4cHJlc3Npb24gZTsKKyAgZS52YXJhcmdzLnB1c2hfYmFjayhsb29rdXBfb3JfYWRkKEJPLT5nZXRPcGVyYW5kKDApKSk7CisgIGUudmFyYXJncy5wdXNoX2JhY2sobG9va3VwX29yX2FkZChCTy0+Z2V0T3BlcmFuZCgxKSkpOworICBlLmZ1bmN0aW9uID0gMDsKKyAgZS50eXBlID0gQk8tPmdldFR5cGUoKTsKKyAgZS5vcGNvZGUgPSBzdGF0aWNfY2FzdDxFeHByZXNzaW9uOjpFeHByZXNzaW9uT3Bjb2RlPihCTy0+Z2V0T3Bjb2RlKCkpOworCisgIHJldHVybiBlOworfQorCitFeHByZXNzaW9uIFZhbHVlVGFibGU6OmNyZWF0ZV9leHByZXNzaW9uKENtcEluc3QqIEMpIHsKKyAgRXhwcmVzc2lvbiBlOworCisgIGUudmFyYXJncy5wdXNoX2JhY2sobG9va3VwX29yX2FkZChDLT5nZXRPcGVyYW5kKDApKSk7CisgIGUudmFyYXJncy5wdXNoX2JhY2sobG9va3VwX29yX2FkZChDLT5nZXRPcGVyYW5kKDEpKSk7CisgIGUuZnVuY3Rpb24gPSAwOworICBlLnR5cGUgPSBDLT5nZXRUeXBlKCk7CisgIGUub3Bjb2RlID0gZ2V0T3Bjb2RlKEMpOworCisgIHJldHVybiBlOworfQorCitFeHByZXNzaW9uIFZhbHVlVGFibGU6OmNyZWF0ZV9leHByZXNzaW9uKENhc3RJbnN0KiBDKSB7CisgIEV4cHJlc3Npb24gZTsKKworICBlLnZhcmFyZ3MucHVzaF9iYWNrKGxvb2t1cF9vcl9hZGQoQy0+Z2V0T3BlcmFuZCgwKSkpOworICBlLmZ1bmN0aW9uID0gMDsKKyAgZS50eXBlID0gQy0+Z2V0VHlwZSgpOworICBlLm9wY29kZSA9IHN0YXRpY19jYXN0PEV4cHJlc3Npb246OkV4cHJlc3Npb25PcGNvZGU+KEMtPmdldE9wY29kZSgpKTsKKworICByZXR1cm4gZTsKK30KKworRXhwcmVzc2lvbiBWYWx1ZVRhYmxlOjpjcmVhdGVfZXhwcmVzc2lvbihTaHVmZmxlVmVjdG9ySW5zdCogUykgeworICBFeHByZXNzaW9uIGU7CisKKyAgZS52YXJhcmdzLnB1c2hfYmFjayhsb29rdXBfb3JfYWRkKFMtPmdldE9wZXJhbmQoMCkpKTsKKyAgZS52YXJhcmdzLnB1c2hfYmFjayhsb29rdXBfb3JfYWRkKFMtPmdldE9wZXJhbmQoMSkpKTsKKyAgZS52YXJhcmdzLnB1c2hfYmFjayhsb29rdXBfb3JfYWRkKFMtPmdldE9wZXJhbmQoMikpKTsKKyAgZS5mdW5jdGlvbiA9IDA7CisgIGUudHlwZSA9IFMtPmdldFR5cGUoKTsKKyAgZS5vcGNvZGUgPSBFeHByZXNzaW9uOjpTSFVGRkxFOworCisgIHJldHVybiBlOworfQorCitFeHByZXNzaW9uIFZhbHVlVGFibGU6OmNyZWF0ZV9leHByZXNzaW9uKEV4dHJhY3RFbGVtZW50SW5zdCogRSkgeworICBFeHByZXNzaW9uIGU7CisKKyAgZS52YXJhcmdzLnB1c2hfYmFjayhsb29rdXBfb3JfYWRkKEUtPmdldE9wZXJhbmQoMCkpKTsKKyAgZS52YXJhcmdzLnB1c2hfYmFjayhsb29rdXBfb3JfYWRkKEUtPmdldE9wZXJhbmQoMSkpKTsKKyAgZS5mdW5jdGlvbiA9IDA7CisgIGUudHlwZSA9IEUtPmdldFR5cGUoKTsKKyAgZS5vcGNvZGUgPSBFeHByZXNzaW9uOjpFWFRSQUNUOworCisgIHJldHVybiBlOworfQorCitFeHByZXNzaW9uIFZhbHVlVGFibGU6OmNyZWF0ZV9leHByZXNzaW9uKEluc2VydEVsZW1lbnRJbnN0KiBJKSB7CisgIEV4cHJlc3Npb24gZTsKKworICBlLnZhcmFyZ3MucHVzaF9iYWNrKGxvb2t1cF9vcl9hZGQoSS0+Z2V0T3BlcmFuZCgwKSkpOworICBlLnZhcmFyZ3MucHVzaF9iYWNrKGxvb2t1cF9vcl9hZGQoSS0+Z2V0T3BlcmFuZCgxKSkpOworICBlLnZhcmFyZ3MucHVzaF9iYWNrKGxvb2t1cF9vcl9hZGQoSS0+Z2V0T3BlcmFuZCgyKSkpOworICBlLmZ1bmN0aW9uID0gMDsKKyAgZS50eXBlID0gSS0+Z2V0VHlwZSgpOworICBlLm9wY29kZSA9IEV4cHJlc3Npb246OklOU0VSVDsKKworICByZXR1cm4gZTsKK30KKworRXhwcmVzc2lvbiBWYWx1ZVRhYmxlOjpjcmVhdGVfZXhwcmVzc2lvbihTZWxlY3RJbnN0KiBJKSB7CisgIEV4cHJlc3Npb24gZTsKKworICBlLnZhcmFyZ3MucHVzaF9iYWNrKGxvb2t1cF9vcl9hZGQoSS0+Z2V0Q29uZGl0aW9uKCkpKTsKKyAgZS52YXJhcmdzLnB1c2hfYmFjayhsb29rdXBfb3JfYWRkKEktPmdldFRydWVWYWx1ZSgpKSk7CisgIGUudmFyYXJncy5wdXNoX2JhY2sobG9va3VwX29yX2FkZChJLT5nZXRGYWxzZVZhbHVlKCkpKTsKKyAgZS5mdW5jdGlvbiA9IDA7CisgIGUudHlwZSA9IEktPmdldFR5cGUoKTsKKyAgZS5vcGNvZGUgPSBFeHByZXNzaW9uOjpTRUxFQ1Q7CisKKyAgcmV0dXJuIGU7Cit9CisKK0V4cHJlc3Npb24gVmFsdWVUYWJsZTo6Y3JlYXRlX2V4cHJlc3Npb24oR2V0RWxlbWVudFB0ckluc3QqIEcpIHsKKyAgRXhwcmVzc2lvbiBlOworCisgIGUudmFyYXJncy5wdXNoX2JhY2sobG9va3VwX29yX2FkZChHLT5nZXRQb2ludGVyT3BlcmFuZCgpKSk7CisgIGUuZnVuY3Rpb24gPSAwOworICBlLnR5cGUgPSBHLT5nZXRUeXBlKCk7CisgIGUub3Bjb2RlID0gRXhwcmVzc2lvbjo6R0VQOworCisgIGZvciAoR2V0RWxlbWVudFB0ckluc3Q6Om9wX2l0ZXJhdG9yIEkgPSBHLT5pZHhfYmVnaW4oKSwgRSA9IEctPmlkeF9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBlLnZhcmFyZ3MucHVzaF9iYWNrKGxvb2t1cF9vcl9hZGQoKkkpKTsKKworICByZXR1cm4gZTsKK30KKworRXhwcmVzc2lvbiBWYWx1ZVRhYmxlOjpjcmVhdGVfZXhwcmVzc2lvbihFeHRyYWN0VmFsdWVJbnN0KiBFKSB7CisgIEV4cHJlc3Npb24gZTsKKworICBlLnZhcmFyZ3MucHVzaF9iYWNrKGxvb2t1cF9vcl9hZGQoRS0+Z2V0QWdncmVnYXRlT3BlcmFuZCgpKSk7CisgIGZvciAoRXh0cmFjdFZhbHVlSW5zdDo6aWR4X2l0ZXJhdG9yIElJID0gRS0+aWR4X2JlZ2luKCksIElFID0gRS0+aWR4X2VuZCgpOworICAgICAgIElJICE9IElFOyArK0lJKQorICAgIGUudmFyYXJncy5wdXNoX2JhY2soKklJKTsKKyAgZS5mdW5jdGlvbiA9IDA7CisgIGUudHlwZSA9IEUtPmdldFR5cGUoKTsKKyAgZS5vcGNvZGUgPSBFeHByZXNzaW9uOjpFWFRSQUNUVkFMVUU7CisKKyAgcmV0dXJuIGU7Cit9CisKK0V4cHJlc3Npb24gVmFsdWVUYWJsZTo6Y3JlYXRlX2V4cHJlc3Npb24oSW5zZXJ0VmFsdWVJbnN0KiBFKSB7CisgIEV4cHJlc3Npb24gZTsKKworICBlLnZhcmFyZ3MucHVzaF9iYWNrKGxvb2t1cF9vcl9hZGQoRS0+Z2V0QWdncmVnYXRlT3BlcmFuZCgpKSk7CisgIGUudmFyYXJncy5wdXNoX2JhY2sobG9va3VwX29yX2FkZChFLT5nZXRJbnNlcnRlZFZhbHVlT3BlcmFuZCgpKSk7CisgIGZvciAoSW5zZXJ0VmFsdWVJbnN0OjppZHhfaXRlcmF0b3IgSUkgPSBFLT5pZHhfYmVnaW4oKSwgSUUgPSBFLT5pZHhfZW5kKCk7CisgICAgICAgSUkgIT0gSUU7ICsrSUkpCisgICAgZS52YXJhcmdzLnB1c2hfYmFjaygqSUkpOworICBlLmZ1bmN0aW9uID0gMDsKKyAgZS50eXBlID0gRS0+Z2V0VHlwZSgpOworICBlLm9wY29kZSA9IEV4cHJlc3Npb246OklOU0VSVFZBTFVFOworCisgIHJldHVybiBlOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICBWYWx1ZVRhYmxlIEV4dGVybmFsIEZ1bmN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGFkZCAtIEluc2VydCBhIHZhbHVlIGludG8gdGhlIHRhYmxlIHdpdGggYSBzcGVjaWZpZWQgdmFsdWUgbnVtYmVyLgordm9pZCBWYWx1ZVRhYmxlOjphZGQoVmFsdWUgKlYsIHVpbnQzMl90IG51bSkgeworICB2YWx1ZU51bWJlcmluZy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoViwgbnVtKSk7Cit9CisKK3VpbnQzMl90IFZhbHVlVGFibGU6Omxvb2t1cF9vcl9hZGRfY2FsbChDYWxsSW5zdCogQykgeworICBpZiAoQUEtPmRvZXNOb3RBY2Nlc3NNZW1vcnkoQykpIHsKKyAgICBFeHByZXNzaW9uIGV4cCA9IGNyZWF0ZV9leHByZXNzaW9uKEMpOworICAgIHVpbnQzMl90JiBlID0gZXhwcmVzc2lvbk51bWJlcmluZ1tleHBdOworICAgIGlmICghZSkgZSA9IG5leHRWYWx1ZU51bWJlcisrOworICAgIHZhbHVlTnVtYmVyaW5nW0NdID0gZTsKKyAgICByZXR1cm4gZTsKKyAgfSBlbHNlIGlmIChBQS0+b25seVJlYWRzTWVtb3J5KEMpKSB7CisgICAgRXhwcmVzc2lvbiBleHAgPSBjcmVhdGVfZXhwcmVzc2lvbihDKTsKKyAgICB1aW50MzJfdCYgZSA9IGV4cHJlc3Npb25OdW1iZXJpbmdbZXhwXTsKKyAgICBpZiAoIWUpIHsKKyAgICAgIGUgPSBuZXh0VmFsdWVOdW1iZXIrKzsKKyAgICAgIHZhbHVlTnVtYmVyaW5nW0NdID0gZTsKKyAgICAgIHJldHVybiBlOworICAgIH0KKyAgICBpZiAoIU1EKSB7CisgICAgICBlID0gbmV4dFZhbHVlTnVtYmVyKys7CisgICAgICB2YWx1ZU51bWJlcmluZ1tDXSA9IGU7CisgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICBNZW1EZXBSZXN1bHQgbG9jYWxfZGVwID0gTUQtPmdldERlcGVuZGVuY3koQyk7CisKKyAgICBpZiAoIWxvY2FsX2RlcC5pc0RlZigpICYmICFsb2NhbF9kZXAuaXNOb25Mb2NhbCgpKSB7CisgICAgICB2YWx1ZU51bWJlcmluZ1tDXSA9ICBuZXh0VmFsdWVOdW1iZXI7CisgICAgICByZXR1cm4gbmV4dFZhbHVlTnVtYmVyKys7CisgICAgfQorCisgICAgaWYgKGxvY2FsX2RlcC5pc0RlZigpKSB7CisgICAgICBDYWxsSW5zdCogbG9jYWxfY2RlcCA9IGNhc3Q8Q2FsbEluc3Q+KGxvY2FsX2RlcC5nZXRJbnN0KCkpOworCisgICAgICBpZiAobG9jYWxfY2RlcC0+Z2V0TnVtQXJnT3BlcmFuZHMoKSAhPSBDLT5nZXROdW1BcmdPcGVyYW5kcygpKSB7CisgICAgICAgIHZhbHVlTnVtYmVyaW5nW0NdID0gbmV4dFZhbHVlTnVtYmVyOworICAgICAgICByZXR1cm4gbmV4dFZhbHVlTnVtYmVyKys7CisgICAgICB9CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDLT5nZXROdW1BcmdPcGVyYW5kcygpOyBpIDwgZTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IGNfdm4gPSBsb29rdXBfb3JfYWRkKEMtPmdldEFyZ09wZXJhbmQoaSkpOworICAgICAgICB1aW50MzJfdCBjZF92biA9IGxvb2t1cF9vcl9hZGQobG9jYWxfY2RlcC0+Z2V0QXJnT3BlcmFuZChpKSk7CisgICAgICAgIGlmIChjX3ZuICE9IGNkX3ZuKSB7CisgICAgICAgICAgdmFsdWVOdW1iZXJpbmdbQ10gPSBuZXh0VmFsdWVOdW1iZXI7CisgICAgICAgICAgcmV0dXJuIG5leHRWYWx1ZU51bWJlcisrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHVpbnQzMl90IHYgPSBsb29rdXBfb3JfYWRkKGxvY2FsX2NkZXApOworICAgICAgdmFsdWVOdW1iZXJpbmdbQ10gPSB2OworICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLy8gTm9uLWxvY2FsIGNhc2UuCisgICAgY29uc3QgTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzOjpOb25Mb2NhbERlcEluZm8gJmRlcHMgPQorICAgICAgTUQtPmdldE5vbkxvY2FsQ2FsbERlcGVuZGVuY3koQ2FsbFNpdGUoQykpOworICAgIC8vIEZJWE1FOiBjYWxsL2NhbGwgZGVwZW5kZW5jaWVzIGZvciByZWFkb25seSBjYWxscyBzaG91bGQgcmV0dXJuIGRlZiwgbm90CisgICAgLy8gY2xvYmJlciEgIE1vdmUgdGhlIGNoZWNraW5nIGxvZ2ljIHRvIE1lbURlcCEKKyAgICBDYWxsSW5zdCogY2RlcCA9IDA7CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHNpbmdsZSBkb21pbmF0aW5nIGNhbGwgaW5zdHJ1Y3Rpb24gdGhhdCBpcworICAgIC8vIGlkZW50aWNhbCB0byBDLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBkZXBzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IE5vbkxvY2FsRGVwRW50cnkgKkkgPSAmZGVwc1tpXTsKKyAgICAgIC8vIElnbm9yZSBub24tbG9jYWwgZGVwZW5kZW5jaWVzLgorICAgICAgaWYgKEktPmdldFJlc3VsdCgpLmlzTm9uTG9jYWwoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFdlIGRvbid0IGhhbmRsZSBub24tZGVwZWRlbmNpZXMuICBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBjYWxsLCByZWplY3QKKyAgICAgIC8vIGluc3RydWN0aW9uIGRlcGVuZGVuY2llcy4KKyAgICAgIGlmIChJLT5nZXRSZXN1bHQoKS5pc0Nsb2JiZXIoKSB8fCBjZGVwICE9IDApIHsKKyAgICAgICAgY2RlcCA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBDYWxsSW5zdCAqTm9uTG9jYWxEZXBDYWxsID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KEktPmdldFJlc3VsdCgpLmdldEluc3QoKSk7CisgICAgICAvLyBGSVhNRTogQWxsIGR1cGxpY2F0ZWQgd2l0aCBub24tbG9jYWwgY2FzZS4KKyAgICAgIGlmIChOb25Mb2NhbERlcENhbGwgJiYgRFQtPnByb3Blcmx5RG9taW5hdGVzKEktPmdldEJCKCksIEMtPmdldFBhcmVudCgpKSl7CisgICAgICAgIGNkZXAgPSBOb25Mb2NhbERlcENhbGw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBjZGVwID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghY2RlcCkgeworICAgICAgdmFsdWVOdW1iZXJpbmdbQ10gPSBuZXh0VmFsdWVOdW1iZXI7CisgICAgICByZXR1cm4gbmV4dFZhbHVlTnVtYmVyKys7CisgICAgfQorCisgICAgaWYgKGNkZXAtPmdldE51bUFyZ09wZXJhbmRzKCkgIT0gQy0+Z2V0TnVtQXJnT3BlcmFuZHMoKSkgeworICAgICAgdmFsdWVOdW1iZXJpbmdbQ10gPSBuZXh0VmFsdWVOdW1iZXI7CisgICAgICByZXR1cm4gbmV4dFZhbHVlTnVtYmVyKys7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDLT5nZXROdW1BcmdPcGVyYW5kcygpOyBpIDwgZTsgKytpKSB7CisgICAgICB1aW50MzJfdCBjX3ZuID0gbG9va3VwX29yX2FkZChDLT5nZXRBcmdPcGVyYW5kKGkpKTsKKyAgICAgIHVpbnQzMl90IGNkX3ZuID0gbG9va3VwX29yX2FkZChjZGVwLT5nZXRBcmdPcGVyYW5kKGkpKTsKKyAgICAgIGlmIChjX3ZuICE9IGNkX3ZuKSB7CisgICAgICAgIHZhbHVlTnVtYmVyaW5nW0NdID0gbmV4dFZhbHVlTnVtYmVyOworICAgICAgICByZXR1cm4gbmV4dFZhbHVlTnVtYmVyKys7CisgICAgICB9CisgICAgfQorCisgICAgdWludDMyX3QgdiA9IGxvb2t1cF9vcl9hZGQoY2RlcCk7CisgICAgdmFsdWVOdW1iZXJpbmdbQ10gPSB2OworICAgIHJldHVybiB2OworCisgIH0gZWxzZSB7CisgICAgdmFsdWVOdW1iZXJpbmdbQ10gPSBuZXh0VmFsdWVOdW1iZXI7CisgICAgcmV0dXJuIG5leHRWYWx1ZU51bWJlcisrOworICB9Cit9CisKKy8vLyBsb29rdXBfb3JfYWRkIC0gUmV0dXJucyB0aGUgdmFsdWUgbnVtYmVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLCBhc3NpZ25pbmcKKy8vLyBpdCBhIG5ldyBudW1iZXIgaWYgaXQgZGlkIG5vdCBoYXZlIG9uZSBiZWZvcmUuCit1aW50MzJfdCBWYWx1ZVRhYmxlOjpsb29rdXBfb3JfYWRkKFZhbHVlICpWKSB7CisgIERlbnNlTWFwPFZhbHVlKiwgdWludDMyX3Q+OjppdGVyYXRvciBWSSA9IHZhbHVlTnVtYmVyaW5nLmZpbmQoVik7CisgIGlmIChWSSAhPSB2YWx1ZU51bWJlcmluZy5lbmQoKSkKKyAgICByZXR1cm4gVkktPnNlY29uZDsKKworICBpZiAoIWlzYTxJbnN0cnVjdGlvbj4oVikpIHsKKyAgICB2YWx1ZU51bWJlcmluZ1tWXSA9IG5leHRWYWx1ZU51bWJlcjsKKyAgICByZXR1cm4gbmV4dFZhbHVlTnVtYmVyKys7CisgIH0KKyAgCisgIEluc3RydWN0aW9uKiBJID0gY2FzdDxJbnN0cnVjdGlvbj4oVik7CisgIEV4cHJlc3Npb24gZXhwOworICBzd2l0Y2ggKEktPmdldE9wY29kZSgpKSB7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6Q2FsbDoKKyAgICAgIHJldHVybiBsb29rdXBfb3JfYWRkX2NhbGwoY2FzdDxDYWxsSW5zdD4oSSkpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGQWRkOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGU3ViOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGTXVsOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVEaXY6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0RpdjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUmVtOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QW5kOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yIDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgICAgICBleHAgPSBjcmVhdGVfZXhwcmVzc2lvbihjYXN0PEJpbmFyeU9wZXJhdG9yPihJKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpJQ21wOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZDbXA6CisgICAgICBleHAgPSBjcmVhdGVfZXhwcmVzc2lvbihjYXN0PENtcEluc3Q+KEkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlpFeHQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUFRvVUk6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1NJOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTSVRvRlA6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUEV4dDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpQdHJUb0ludDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpJbnRUb1B0cjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpCaXRDYXN0OgorICAgICAgZXhwID0gY3JlYXRlX2V4cHJlc3Npb24oY2FzdDxDYXN0SW5zdD4oSSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U2VsZWN0OgorICAgICAgZXhwID0gY3JlYXRlX2V4cHJlc3Npb24oY2FzdDxTZWxlY3RJbnN0PihJKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudDoKKyAgICAgIGV4cCA9IGNyZWF0ZV9leHByZXNzaW9uKGNhc3Q8RXh0cmFjdEVsZW1lbnRJbnN0PihJKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50OgorICAgICAgZXhwID0gY3JlYXRlX2V4cHJlc3Npb24oY2FzdDxJbnNlcnRFbGVtZW50SW5zdD4oSSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U2h1ZmZsZVZlY3RvcjoKKyAgICAgIGV4cCA9IGNyZWF0ZV9leHByZXNzaW9uKGNhc3Q8U2h1ZmZsZVZlY3Rvckluc3Q+KEkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkV4dHJhY3RWYWx1ZToKKyAgICAgIGV4cCA9IGNyZWF0ZV9leHByZXNzaW9uKGNhc3Q8RXh0cmFjdFZhbHVlSW5zdD4oSSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6SW5zZXJ0VmFsdWU6CisgICAgICBleHAgPSBjcmVhdGVfZXhwcmVzc2lvbihjYXN0PEluc2VydFZhbHVlSW5zdD4oSSkpOworICAgICAgYnJlYWs7ICAgICAgCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cjoKKyAgICAgIGV4cCA9IGNyZWF0ZV9leHByZXNzaW9uKGNhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KEkpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB2YWx1ZU51bWJlcmluZ1tWXSA9IG5leHRWYWx1ZU51bWJlcjsKKyAgICAgIHJldHVybiBuZXh0VmFsdWVOdW1iZXIrKzsKKyAgfQorCisgIHVpbnQzMl90JiBlID0gZXhwcmVzc2lvbk51bWJlcmluZ1tleHBdOworICBpZiAoIWUpIGUgPSBuZXh0VmFsdWVOdW1iZXIrKzsKKyAgdmFsdWVOdW1iZXJpbmdbVl0gPSBlOworICByZXR1cm4gZTsKK30KKworLy8vIGxvb2t1cCAtIFJldHVybnMgdGhlIHZhbHVlIG51bWJlciBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLiBGYWlscyBpZgorLy8vIHRoZSB2YWx1ZSBoYXMgbm90IHlldCBiZWVuIG51bWJlcmVkLgordWludDMyX3QgVmFsdWVUYWJsZTo6bG9va3VwKFZhbHVlICpWKSBjb25zdCB7CisgIERlbnNlTWFwPFZhbHVlKiwgdWludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBWSSA9IHZhbHVlTnVtYmVyaW5nLmZpbmQoVik7CisgIGFzc2VydChWSSAhPSB2YWx1ZU51bWJlcmluZy5lbmQoKSAmJiAiVmFsdWUgbm90IG51bWJlcmVkPyIpOworICByZXR1cm4gVkktPnNlY29uZDsKK30KKworLy8vIGNsZWFyIC0gUmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIFZhbHVlVGFibGUKK3ZvaWQgVmFsdWVUYWJsZTo6Y2xlYXIoKSB7CisgIHZhbHVlTnVtYmVyaW5nLmNsZWFyKCk7CisgIGV4cHJlc3Npb25OdW1iZXJpbmcuY2xlYXIoKTsKKyAgbmV4dFZhbHVlTnVtYmVyID0gMTsKK30KKworLy8vIGVyYXNlIC0gUmVtb3ZlIGEgdmFsdWUgZnJvbSB0aGUgdmFsdWUgbnVtYmVyaW5nCit2b2lkIFZhbHVlVGFibGU6OmVyYXNlKFZhbHVlICpWKSB7CisgIHZhbHVlTnVtYmVyaW5nLmVyYXNlKFYpOworfQorCisvLy8gdmVyaWZ5UmVtb3ZlZCAtIFZlcmlmeSB0aGF0IHRoZSB2YWx1ZSBpcyByZW1vdmVkIGZyb20gYWxsIGludGVybmFsIGRhdGEKKy8vLyBzdHJ1Y3R1cmVzLgordm9pZCBWYWx1ZVRhYmxlOjp2ZXJpZnlSZW1vdmVkKGNvbnN0IFZhbHVlICpWKSBjb25zdCB7CisgIGZvciAoRGVuc2VNYXA8VmFsdWUqLCB1aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICBJID0gdmFsdWVOdW1iZXJpbmcuYmVnaW4oKSwgRSA9IHZhbHVlTnVtYmVyaW5nLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGFzc2VydChJLT5maXJzdCAhPSBWICYmICJJbnN0IHN0aWxsIG9jY3VycyBpbiB2YWx1ZSBudW1iZXJpbmcgbWFwISIpOworICB9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZOIFBhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBWYWx1ZU51bWJlclNjb3BlIHsKKyAgICBWYWx1ZU51bWJlclNjb3BlKiBwYXJlbnQ7CisgICAgRGVuc2VNYXA8dWludDMyX3QsIFZhbHVlKj4gdGFibGU7CisKKyAgICBWYWx1ZU51bWJlclNjb3BlKFZhbHVlTnVtYmVyU2NvcGUqIHApIDogcGFyZW50KHApIHsgfQorICB9OworfQorCituYW1lc3BhY2UgeworCisgIGNsYXNzIEdWTiA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICAgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIGV4cGxpY2l0IEdWTihib29sIG5vbG9hZHMgPSBmYWxzZSkKKyAgICAgIDogRnVuY3Rpb25QYXNzKElEKSwgTm9Mb2Fkcyhub2xvYWRzKSwgTUQoMCkgeyB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIE5vTG9hZHM7CisgICAgTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzICpNRDsKKyAgICBEb21pbmF0b3JUcmVlICpEVDsKKworICAgIFZhbHVlVGFibGUgVk47CisgICAgRGVuc2VNYXA8QmFzaWNCbG9jayosIFZhbHVlTnVtYmVyU2NvcGUqPiBsb2NhbEF2YWlsOworCisgICAgLy8gTGlzdCBvZiBjcml0aWNhbCBlZGdlcyB0byBiZSBzcGxpdCBiZXR3ZWVuIGl0ZXJhdGlvbnMuCisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPFRlcm1pbmF0b3JJbnN0KiwgdW5zaWduZWQ+LCA0PiB0b1NwbGl0OworCisgICAgLy8gVGhpcyB0cmFuc2Zvcm1hdGlvbiByZXF1aXJlcyBkb21pbmF0b3IgcG9zdGRvbWluYXRvciBpbmZvCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPERvbWluYXRvclRyZWU+KCk7CisgICAgICBpZiAoIU5vTG9hZHMpCisgICAgICAgIEFVLmFkZFJlcXVpcmVkPE1lbW9yeURlcGVuZGVuY2VBbmFseXNpcz4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPEFsaWFzQW5hbHlzaXM+KCk7CisKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxEb21pbmF0b3JUcmVlPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPEFsaWFzQW5hbHlzaXM+KCk7CisgICAgfQorCisgICAgLy8gSGVscGVyIGZ1Y3Rpb25zCisgICAgLy8gRklYTUU6IGVsaW1pbmF0ZSBvciBkb2N1bWVudCB0aGVzZSBiZXR0ZXIKKyAgICBib29sIHByb2Nlc3NMb2FkKExvYWRJbnN0KiBMLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uKj4gJnRvRXJhc2UpOworICAgIGJvb2wgcHJvY2Vzc0luc3RydWN0aW9uKEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbio+ICZ0b0VyYXNlKTsKKyAgICBib29sIHByb2Nlc3NOb25Mb2NhbExvYWQoTG9hZEluc3QqIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbio+ICZ0b0VyYXNlKTsKKyAgICBib29sIHByb2Nlc3NCbG9jayhCYXNpY0Jsb2NrICpCQik7CisgICAgdm9pZCBkdW1wKERlbnNlTWFwPHVpbnQzMl90LCBWYWx1ZSo+JiBkKTsKKyAgICBib29sIGl0ZXJhdGVPbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKyAgICBWYWx1ZSAqQ29sbGFwc2VQaGkoUEhJTm9kZSogcCk7CisgICAgYm9vbCBwZXJmb3JtUFJFKEZ1bmN0aW9uJiBGKTsKKyAgICBWYWx1ZSAqbG9va3VwTnVtYmVyKEJhc2ljQmxvY2sgKkJCLCB1aW50MzJfdCBudW0pOworICAgIHZvaWQgY2xlYW51cEdsb2JhbFNldHMoKTsKKyAgICB2b2lkIHZlcmlmeVJlbW92ZWQoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0OworICAgIGJvb2wgc3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgIH07CisKKyAgY2hhciBHVk46OklEID0gMDsKK30KKworLy8gY3JlYXRlR1ZOUGFzcyAtIFRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoaXMgZmlsZS4uLgorRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVHVk5QYXNzKGJvb2wgTm9Mb2FkcykgeworICByZXR1cm4gbmV3IEdWTihOb0xvYWRzKTsKK30KKworSU5JVElBTElaRV9QQVNTKEdWTiwgImd2biIsICJHbG9iYWwgVmFsdWUgTnVtYmVyaW5nIiwgZmFsc2UsIGZhbHNlKTsKKwordm9pZCBHVk46OmR1bXAoRGVuc2VNYXA8dWludDMyX3QsIFZhbHVlKj4mIGQpIHsKKyAgZXJycygpIDw8ICJ7XG4iOworICBmb3IgKERlbnNlTWFwPHVpbnQzMl90LCBWYWx1ZSo+OjppdGVyYXRvciBJID0gZC5iZWdpbigpLAorICAgICAgIEUgPSBkLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgZXJycygpIDw8IEktPmZpcnN0IDw8ICJcbiI7CisgICAgICBJLT5zZWNvbmQtPmR1bXAoKTsKKyAgfQorICBlcnJzKCkgPDwgIn1cbiI7Cit9CisKK3N0YXRpYyBib29sIGlzU2FmZVJlcGxhY2VtZW50KFBISU5vZGUqIHAsIEluc3RydWN0aW9uICppbnN0KSB7CisgIGlmICghaXNhPFBISU5vZGU+KGluc3QpKQorICAgIHJldHVybiB0cnVlOworCisgIGZvciAoSW5zdHJ1Y3Rpb246OnVzZV9pdGVyYXRvciBVSSA9IHAtPnVzZV9iZWdpbigpLCBFID0gcC0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IEU7ICsrVUkpCisgICAgaWYgKFBISU5vZGUqIHVzZV9waGkgPSBkeW5fY2FzdDxQSElOb2RlPigqVUkpKQorICAgICAgaWYgKHVzZV9waGktPmdldFBhcmVudCgpID09IGluc3QtPmdldFBhcmVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK1ZhbHVlICpHVk46OkNvbGxhcHNlUGhpKFBISU5vZGUgKlBOKSB7CisgIFZhbHVlICpDb25zdFZhbCA9IFBOLT5oYXNDb25zdGFudFZhbHVlKERUKTsKKyAgaWYgKCFDb25zdFZhbCkgcmV0dXJuIDA7CisKKyAgSW5zdHJ1Y3Rpb24gKkluc3QgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oQ29uc3RWYWwpOworICBpZiAoIUluc3QpCisgICAgcmV0dXJuIENvbnN0VmFsOworCisgIGlmIChEVC0+ZG9taW5hdGVzKEluc3QsIFBOKSkKKyAgICBpZiAoaXNTYWZlUmVwbGFjZW1lbnQoUE4sIEluc3QpKQorICAgICAgcmV0dXJuIEluc3Q7CisgIHJldHVybiAwOworfQorCisvLy8gSXNWYWx1ZUZ1bGx5QXZhaWxhYmxlSW5CbG9jayAtIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwcm92ZSB0aGF0IHRoZSB2YWx1ZQorLy8vIHdlJ3JlIGFuYWx5emluZyBpcyBmdWxseSBhdmFpbGFibGUgaW4gdGhlIHNwZWNpZmllZCBibG9jay4gIEFzIHdlIGdvLCBrZWVwCisvLy8gdHJhY2sgb2Ygd2hpY2ggYmxvY2tzIHdlIGtub3cgYXJlIGZ1bGx5IGFsaXZlIGluIEZ1bGx5QXZhaWxhYmxlQmxvY2tzLiAgVGhpcworLy8vIG1hcCBpcyBhY3R1YWxseSBhIHRyaS1zdGF0ZSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKy8vLyAgIDApIHdlIGtub3cgdGhlIGJsb2NrICppcyBub3QqIGZ1bGx5IGF2YWlsYWJsZS4KKy8vLyAgIDEpIHdlIGtub3cgdGhlIGJsb2NrICppcyogZnVsbHkgYXZhaWxhYmxlLgorLy8vICAgMikgd2UgZG8gbm90IGtub3cgd2hldGhlciB0aGUgYmxvY2sgaXMgZnVsbHkgYXZhaWxhYmxlIG9yIG5vdCwgYnV0IHdlIGFyZQorLy8vICAgICAgY3VycmVudGx5IHNwZWN1bGF0aW5nIHRoYXQgaXQgd2lsbCBiZS4KKy8vLyAgIDMpIHdlIGFyZSBzcGVjdWxhdGluZyBmb3IgdGhpcyBibG9jayBhbmQgaGF2ZSB1c2VkIHRoYXQgdG8gc3BlY3VsYXRlIGZvcgorLy8vICAgICAgb3RoZXIgYmxvY2tzLgorc3RhdGljIGJvb2wgSXNWYWx1ZUZ1bGx5QXZhaWxhYmxlSW5CbG9jayhCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgY2hhcj4gJkZ1bGx5QXZhaWxhYmxlQmxvY2tzKSB7CisgIC8vIE9wdGltaXN0aWNhbGx5IGFzc3VtZSB0aGF0IHRoZSBibG9jayBpcyBmdWxseSBhdmFpbGFibGUgYW5kIGNoZWNrIHRvIHNlZQorICAvLyBpZiB3ZSBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyBibG9jayBpbiBvbmUgbG9va3VwLgorICBzdGQ6OnBhaXI8RGVuc2VNYXA8QmFzaWNCbG9jayosIGNoYXI+OjppdGVyYXRvciwgY2hhcj4gSVYgPQorICAgIEZ1bGx5QXZhaWxhYmxlQmxvY2tzLmluc2VydChzdGQ6Om1ha2VfcGFpcihCQiwgMikpOworCisgIC8vIElmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0ZWQgZm9yIHRoaXMgYmxvY2ssIHJldHVybiB0aGUgcHJlY29tcHV0ZWQgdmFsdWUuCisgIGlmICghSVYuc2Vjb25kKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhIHNwZWN1bGF0aXZlICJhdmFpbGFibGUiIHZhbHVlLCBtYXJrIGl0IGFzIGJlaW5nIHVzZWQgZm9yCisgICAgLy8gc3BlY3VsYXRpb24gb2Ygb3RoZXIgYmxvY2tzLgorICAgIGlmIChJVi5maXJzdC0+c2Vjb25kID09IDIpCisgICAgICBJVi5maXJzdC0+c2Vjb25kID0gMzsKKyAgICByZXR1cm4gSVYuZmlyc3QtPnNlY29uZCAhPSAwOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBzZWUgaWYgaXQgaXMgZnVsbHkgYXZhaWxhYmxlIGluIGFsbCBwcmVkZWNlc3NvcnMuCisgIHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEJCKSwgUEUgPSBwcmVkX2VuZChCQik7CisKKyAgLy8gSWYgdGhpcyBibG9jayBoYXMgbm8gcHJlZGVjZXNzb3JzLCBpdCBpc24ndCBsaXZlLWluIGhlcmUuCisgIGlmIChQSSA9PSBQRSkKKyAgICBnb3RvIFNwZWN1bGF0aW9uRmFpbHVyZTsKKworICBmb3IgKDsgUEkgIT0gUEU7ICsrUEkpCisgICAgLy8gSWYgdGhlIHZhbHVlIGlzbid0IGZ1bGx5IGF2YWlsYWJsZSBpbiBvbmUgb2Ygb3VyIHByZWRlY2Vzc29ycywgdGhlbiBpdAorICAgIC8vIGlzbid0IGZ1bGx5IGF2YWlsYWJsZSBpbiB0aGlzIGJsb2NrIGVpdGhlci4gIFVuZG8gb3VyIHByZXZpb3VzCisgICAgLy8gb3B0aW1pc3RpYyBhc3N1bXB0aW9uIGFuZCBiYWlsIG91dC4KKyAgICBpZiAoIUlzVmFsdWVGdWxseUF2YWlsYWJsZUluQmxvY2soKlBJLCBGdWxseUF2YWlsYWJsZUJsb2NrcykpCisgICAgICBnb3RvIFNwZWN1bGF0aW9uRmFpbHVyZTsKKworICByZXR1cm4gdHJ1ZTsKKworLy8gU3BlY3VsYXRpb25GYWlsdXJlIC0gSWYgd2UgZ2V0IGhlcmUsIHdlIGZvdW5kIG91dCB0aGF0IHRoaXMgaXMgbm90LCBhZnRlcgorLy8gYWxsLCBhIGZ1bGx5LWF2YWlsYWJsZSBibG9jay4gIFdlIGhhdmUgYSBwcm9ibGVtIGlmIHdlIHNwZWN1bGF0ZWQgb24gdGhpcyBhbmQKKy8vIHVzZWQgdGhlIHNwZWN1bGF0aW9uIHRvIG1hcmsgb3RoZXIgYmxvY2tzIGFzIGF2YWlsYWJsZS4KK1NwZWN1bGF0aW9uRmFpbHVyZToKKyAgY2hhciAmQkJWYWwgPSBGdWxseUF2YWlsYWJsZUJsb2Nrc1tCQl07CisKKyAgLy8gSWYgd2UgZGlkbid0IHNwZWN1bGF0ZSBvbiB0aGlzLCBqdXN0IHJldHVybiB3aXRoIGl0IHNldCB0byBmYWxzZS4KKyAgaWYgKEJCVmFsID09IDIpIHsKKyAgICBCQlZhbCA9IDA7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYgd2UgZGlkIHNwZWN1bGF0ZSBvbiB0aGlzIHZhbHVlLCB3ZSBjb3VsZCBoYXZlIGJsb2NrcyBzZXQgdG8gMSB0aGF0IGFyZQorICAvLyBpbmNvcnJlY3QuICBXYWxrIHRoZSAodHJhbnNpdGl2ZSkgc3VjY2Vzc29ycyBvZiB0aGlzIGJsb2NrIGFuZCBtYXJrIHRoZW0gYXMKKyAgLy8gMCBpZiBzZXQgdG8gb25lLgorICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgMzI+IEJCV29ya2xpc3Q7CisgIEJCV29ya2xpc3QucHVzaF9iYWNrKEJCKTsKKworICBkbyB7CisgICAgQmFzaWNCbG9jayAqRW50cnkgPSBCQldvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgIC8vIE5vdGUgdGhhdCB0aGlzIHNldHMgYmxvY2tzIHRvIDAgKHVuYXZhaWxhYmxlKSBpZiB0aGV5IGhhcHBlbiB0byBub3QKKyAgICAvLyBhbHJlYWR5IGJlIGluIEZ1bGx5QXZhaWxhYmxlQmxvY2tzLiAgVGhpcyBpcyBzYWZlLgorICAgIGNoYXIgJkVudHJ5VmFsID0gRnVsbHlBdmFpbGFibGVCbG9ja3NbRW50cnldOworICAgIGlmIChFbnRyeVZhbCA9PSAwKSBjb250aW51ZTsgIC8vIEFscmVhZHkgdW5hdmFpbGFibGUuCisKKyAgICAvLyBNYXJrIGFzIHVuYXZhaWxhYmxlLgorICAgIEVudHJ5VmFsID0gMDsKKworICAgIGZvciAoc3VjY19pdGVyYXRvciBJID0gc3VjY19iZWdpbihFbnRyeSksIEUgPSBzdWNjX2VuZChFbnRyeSk7IEkgIT0gRTsgKytJKQorICAgICAgQkJXb3JrbGlzdC5wdXNoX2JhY2soKkkpOworICB9IHdoaWxlICghQkJXb3JrbGlzdC5lbXB0eSgpKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIENhbkNvZXJjZU11c3RBbGlhc2VkVmFsdWVUb0xvYWQgLSBSZXR1cm4gdHJ1ZSBpZgorLy8vIENvZXJjZUF2YWlsYWJsZVZhbHVlVG9Mb2FkVHlwZSB3aWxsIHN1Y2NlZWQuCitzdGF0aWMgYm9vbCBDYW5Db2VyY2VNdXN0QWxpYXNlZFZhbHVlVG9Mb2FkKFZhbHVlICpTdG9yZWRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKkxvYWRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAmVEQpIHsKKyAgLy8gSWYgdGhlIGxvYWRlZCBvciBzdG9yZWQgdmFsdWUgaXMgYW4gZmlyc3QgY2xhc3MgYXJyYXkgb3Igc3RydWN0LCBkb24ndCB0cnkKKyAgLy8gdG8gdHJhbnNmb3JtIHRoZW0uICBXZSBuZWVkIHRvIGJlIGFibGUgdG8gYml0Y2FzdCB0byBpbnRlZ2VyLgorICBpZiAoTG9hZFR5LT5pc1N0cnVjdFR5KCkgfHwgTG9hZFR5LT5pc0FycmF5VHkoKSB8fAorICAgICAgU3RvcmVkVmFsLT5nZXRUeXBlKCktPmlzU3RydWN0VHkoKSB8fAorICAgICAgU3RvcmVkVmFsLT5nZXRUeXBlKCktPmlzQXJyYXlUeSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIFRoZSBzdG9yZSBoYXMgdG8gYmUgYXQgbGVhc3QgYXMgYmlnIGFzIHRoZSBsb2FkLgorICBpZiAoVEQuZ2V0VHlwZVNpemVJbkJpdHMoU3RvcmVkVmFsLT5nZXRUeXBlKCkpIDwKKyAgICAgICAgVEQuZ2V0VHlwZVNpemVJbkJpdHMoTG9hZFR5KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKyAgCisKKy8vLyBDb2VyY2VBdmFpbGFibGVWYWx1ZVRvTG9hZFR5cGUgLSBJZiB3ZSBzYXcgYSBzdG9yZSBvZiBhIHZhbHVlIHRvIG1lbW9yeSwgYW5kCisvLy8gdGhlbiBhIGxvYWQgZnJvbSBhIG11c3QtYWxpYXNlZCBwb2ludGVyIG9mIGEgZGlmZmVyZW50IHR5cGUsIHRyeSB0byBjb2VyY2UKKy8vLyB0aGUgc3RvcmVkIHZhbHVlLiAgTG9hZGVkVHkgaXMgdGhlIHR5cGUgb2YgdGhlIGxvYWQgd2Ugd2FudCB0byByZXBsYWNlIGFuZAorLy8vIEluc2VydFB0IGlzIHRoZSBwbGFjZSB0byBpbnNlcnQgbmV3IGluc3RydWN0aW9ucy4KKy8vLworLy8vIElmIHdlIGNhbid0IGRvIGl0LCByZXR1cm4gbnVsbC4KK3N0YXRpYyBWYWx1ZSAqQ29lcmNlQXZhaWxhYmxlVmFsdWVUb0xvYWRUeXBlKFZhbHVlICpTdG9yZWRWYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqTG9hZGVkVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICZURCkgeworICBpZiAoIUNhbkNvZXJjZU11c3RBbGlhc2VkVmFsdWVUb0xvYWQoU3RvcmVkVmFsLCBMb2FkZWRUeSwgVEQpKQorICAgIHJldHVybiAwOworICAKKyAgY29uc3QgVHlwZSAqU3RvcmVkVmFsVHkgPSBTdG9yZWRWYWwtPmdldFR5cGUoKTsKKyAgCisgIHVpbnQ2NF90IFN0b3JlU2l6ZSA9IFRELmdldFR5cGVTdG9yZVNpemVJbkJpdHMoU3RvcmVkVmFsVHkpOworICB1aW50NjRfdCBMb2FkU2l6ZSA9IFRELmdldFR5cGVTaXplSW5CaXRzKExvYWRlZFR5KTsKKyAgCisgIC8vIElmIHRoZSBzdG9yZSBhbmQgcmVsb2FkIGFyZSB0aGUgc2FtZSBzaXplLCB3ZSBjYW4gYWx3YXlzIHJldXNlIGl0LgorICBpZiAoU3RvcmVTaXplID09IExvYWRTaXplKSB7CisgICAgaWYgKFN0b3JlZFZhbFR5LT5pc1BvaW50ZXJUeSgpICYmIExvYWRlZFR5LT5pc1BvaW50ZXJUeSgpKSB7CisgICAgICAvLyBQb2ludGVyIHRvIFBvaW50ZXIgLT4gdXNlIGJpdGNhc3QuCisgICAgICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KFN0b3JlZFZhbCwgTG9hZGVkVHksIEluc2VydFB0KTsKKyAgICB9CisgICAgCisgICAgLy8gQ29udmVydCBzb3VyY2UgcG9pbnRlcnMgdG8gaW50ZWdlcnMsIHdoaWNoIGNhbiBiZSBiaXRjYXN0LgorICAgIGlmIChTdG9yZWRWYWxUeS0+aXNQb2ludGVyVHkoKSkgeworICAgICAgU3RvcmVkVmFsVHkgPSBURC5nZXRJbnRQdHJUeXBlKFN0b3JlZFZhbFR5LT5nZXRDb250ZXh0KCkpOworICAgICAgU3RvcmVkVmFsID0gbmV3IFB0clRvSW50SW5zdChTdG9yZWRWYWwsIFN0b3JlZFZhbFR5LCBJbnNlcnRQdCk7CisgICAgfQorICAgIAorICAgIGNvbnN0IFR5cGUgKlR5cGVUb0Nhc3RUbyA9IExvYWRlZFR5OworICAgIGlmIChUeXBlVG9DYXN0VG8tPmlzUG9pbnRlclR5KCkpCisgICAgICBUeXBlVG9DYXN0VG8gPSBURC5nZXRJbnRQdHJUeXBlKFN0b3JlZFZhbFR5LT5nZXRDb250ZXh0KCkpOworICAgIAorICAgIGlmIChTdG9yZWRWYWxUeSAhPSBUeXBlVG9DYXN0VG8pCisgICAgICBTdG9yZWRWYWwgPSBuZXcgQml0Q2FzdEluc3QoU3RvcmVkVmFsLCBUeXBlVG9DYXN0VG8sIEluc2VydFB0KTsKKyAgICAKKyAgICAvLyBDYXN0IHRvIHBvaW50ZXIgaWYgdGhlIGxvYWQgbmVlZHMgYSBwb2ludGVyIHR5cGUuCisgICAgaWYgKExvYWRlZFR5LT5pc1BvaW50ZXJUeSgpKQorICAgICAgU3RvcmVkVmFsID0gbmV3IEludFRvUHRySW5zdChTdG9yZWRWYWwsIExvYWRlZFR5LCBJbnNlcnRQdCk7CisgICAgCisgICAgcmV0dXJuIFN0b3JlZFZhbDsKKyAgfQorICAKKyAgLy8gSWYgdGhlIGxvYWRlZCB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGF2YWlsYWJsZSB2YWx1ZSwgdGhlbiB3ZSBjYW4KKyAgLy8gZXh0cmFjdCBvdXQgYSBwaWVjZSBmcm9tIGl0LiAgSWYgdGhlIGF2YWlsYWJsZSB2YWx1ZSBpcyB0b28gc21hbGwsIHRoZW4gd2UKKyAgLy8gY2FuJ3QgZG8gYW55dGhpbmcuCisgIGFzc2VydChTdG9yZVNpemUgPj0gTG9hZFNpemUgJiYgIkNhbkNvZXJjZU11c3RBbGlhc2VkVmFsdWVUb0xvYWQgZmFpbCIpOworICAKKyAgLy8gQ29udmVydCBzb3VyY2UgcG9pbnRlcnMgdG8gaW50ZWdlcnMsIHdoaWNoIGNhbiBiZSBtYW5pcHVsYXRlZC4KKyAgaWYgKFN0b3JlZFZhbFR5LT5pc1BvaW50ZXJUeSgpKSB7CisgICAgU3RvcmVkVmFsVHkgPSBURC5nZXRJbnRQdHJUeXBlKFN0b3JlZFZhbFR5LT5nZXRDb250ZXh0KCkpOworICAgIFN0b3JlZFZhbCA9IG5ldyBQdHJUb0ludEluc3QoU3RvcmVkVmFsLCBTdG9yZWRWYWxUeSwgSW5zZXJ0UHQpOworICB9CisgIAorICAvLyBDb252ZXJ0IHZlY3RvcnMgYW5kIGZwIHRvIGludGVnZXIsIHdoaWNoIGNhbiBiZSBtYW5pcHVsYXRlZC4KKyAgaWYgKCFTdG9yZWRWYWxUeS0+aXNJbnRlZ2VyVHkoKSkgeworICAgIFN0b3JlZFZhbFR5ID0gSW50ZWdlclR5cGU6OmdldChTdG9yZWRWYWxUeS0+Z2V0Q29udGV4dCgpLCBTdG9yZVNpemUpOworICAgIFN0b3JlZFZhbCA9IG5ldyBCaXRDYXN0SW5zdChTdG9yZWRWYWwsIFN0b3JlZFZhbFR5LCBJbnNlcnRQdCk7CisgIH0KKyAgCisgIC8vIElmIHRoaXMgaXMgYSBiaWctZW5kaWFuIHN5c3RlbSwgd2UgbmVlZCB0byBzaGlmdCB0aGUgdmFsdWUgZG93biB0byB0aGUgbG93CisgIC8vIGJpdHMgc28gdGhhdCBhIHRydW5jYXRlIHdpbGwgd29yay4KKyAgaWYgKFRELmlzQmlnRW5kaWFuKCkpIHsKKyAgICBDb25zdGFudCAqVmFsID0gQ29uc3RhbnRJbnQ6OmdldChTdG9yZWRWYWwtPmdldFR5cGUoKSwgU3RvcmVTaXplLUxvYWRTaXplKTsKKyAgICBTdG9yZWRWYWwgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTFNocihTdG9yZWRWYWwsIFZhbCwgSW5zZXJ0UHQpOworICB9CisgIAorICAvLyBUcnVuY2F0ZSB0aGUgaW50ZWdlciB0byB0aGUgcmlnaHQgc2l6ZSBub3cuCisgIGNvbnN0IFR5cGUgKk5ld0ludFR5ID0gSW50ZWdlclR5cGU6OmdldChTdG9yZWRWYWxUeS0+Z2V0Q29udGV4dCgpLCBMb2FkU2l6ZSk7CisgIFN0b3JlZFZhbCA9IG5ldyBUcnVuY0luc3QoU3RvcmVkVmFsLCBOZXdJbnRUeSwgSW5zZXJ0UHQpOworICAKKyAgaWYgKExvYWRlZFR5ID09IE5ld0ludFR5KQorICAgIHJldHVybiBTdG9yZWRWYWw7CisgIAorICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgcG9pbnRlciwgaW50dG9wdHIuCisgIGlmIChMb2FkZWRUeS0+aXNQb2ludGVyVHkoKSkKKyAgICByZXR1cm4gbmV3IEludFRvUHRySW5zdChTdG9yZWRWYWwsIExvYWRlZFR5LCBJbnNlcnRQdCk7CisgIAorICAvLyBPdGhlcndpc2UsIGJpdGNhc3QuCisgIHJldHVybiBuZXcgQml0Q2FzdEluc3QoU3RvcmVkVmFsLCBMb2FkZWRUeSwgSW5zZXJ0UHQpOworfQorCisvLy8gR2V0QmFzZVdpdGhDb25zdGFudE9mZnNldCAtIEFuYWx5emUgdGhlIHNwZWNpZmllZCBwb2ludGVyIHRvIHNlZSBpZiBpdCBjYW4KKy8vLyBiZSBleHByZXNzZWQgYXMgYSBiYXNlIHBvaW50ZXIgcGx1cyBhIGNvbnN0YW50IG9mZnNldC4gIFJldHVybiB0aGUgYmFzZSBhbmQKKy8vLyBvZmZzZXQgdG8gdGhlIGNhbGxlci4KK3N0YXRpYyBWYWx1ZSAqR2V0QmFzZVdpdGhDb25zdGFudE9mZnNldChWYWx1ZSAqUHRyLCBpbnQ2NF90ICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAmVEQpIHsKKyAgT3BlcmF0b3IgKlB0ck9wID0gZHluX2Nhc3Q8T3BlcmF0b3I+KFB0cik7CisgIGlmIChQdHJPcCA9PSAwKSByZXR1cm4gUHRyOworICAKKyAgLy8gSnVzdCBsb29rIHRocm91Z2ggYml0Y2FzdHMuCisgIGlmIChQdHJPcC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QpCisgICAgcmV0dXJuIEdldEJhc2VXaXRoQ29uc3RhbnRPZmZzZXQoUHRyT3AtPmdldE9wZXJhbmQoMCksIE9mZnNldCwgVEQpOworICAKKyAgLy8gSWYgdGhpcyBpcyBhIEdFUCB3aXRoIGNvbnN0YW50IGluZGljZXMsIHdlIGNhbiBsb29rIHRocm91Z2ggaXQuCisgIEdFUE9wZXJhdG9yICpHRVAgPSBkeW5fY2FzdDxHRVBPcGVyYXRvcj4oUHRyT3ApOworICBpZiAoR0VQID09IDAgfHwgIUdFUC0+aGFzQWxsQ29uc3RhbnRJbmRpY2VzKCkpIHJldHVybiBQdHI7CisgIAorICBnZXBfdHlwZV9pdGVyYXRvciBHVEkgPSBnZXBfdHlwZV9iZWdpbihHRVApOworICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIEkgPSBHRVAtPmlkeF9iZWdpbigpLCBFID0gR0VQLT5pZHhfZW5kKCk7IEkgIT0gRTsKKyAgICAgICArK0ksICsrR1RJKSB7CisgICAgQ29uc3RhbnRJbnQgKk9wQyA9IGNhc3Q8Q29uc3RhbnRJbnQ+KCpJKTsKKyAgICBpZiAoT3BDLT5pc1plcm8oKSkgY29udGludWU7CisgICAgCisgICAgLy8gSGFuZGxlIGEgc3RydWN0IGFuZCBhcnJheSBpbmRpY2VzIHdoaWNoIGFkZCB0aGVpciBvZmZzZXQgdG8gdGhlIHBvaW50ZXIuCisgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KCpHVEkpKSB7CisgICAgICBPZmZzZXQgKz0gVEQuZ2V0U3RydWN0TGF5b3V0KFNUeSktPmdldEVsZW1lbnRPZmZzZXQoT3BDLT5nZXRaRXh0VmFsdWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQ2NF90IFNpemUgPSBURC5nZXRUeXBlQWxsb2NTaXplKEdUSS5nZXRJbmRleGVkVHlwZSgpKTsKKyAgICAgIE9mZnNldCArPSBPcEMtPmdldFNFeHRWYWx1ZSgpKlNpemU7CisgICAgfQorICB9CisgIAorICAvLyBSZS1zaWduIGV4dGVuZCBmcm9tIHRoZSBwb2ludGVyIHNpemUgaWYgbmVlZGVkIHRvIGdldCBvdmVyZmxvdyBlZGdlIGNhc2VzCisgIC8vIHJpZ2h0LgorICB1bnNpZ25lZCBQdHJTaXplID0gVEQuZ2V0UG9pbnRlclNpemVJbkJpdHMoKTsKKyAgaWYgKFB0clNpemUgPCA2NCkKKyAgICBPZmZzZXQgPSAoT2Zmc2V0IDw8ICg2NC1QdHJTaXplKSkgPj4gKDY0LVB0clNpemUpOworICAKKyAgcmV0dXJuIEdldEJhc2VXaXRoQ29uc3RhbnRPZmZzZXQoR0VQLT5nZXRQb2ludGVyT3BlcmFuZCgpLCBPZmZzZXQsIFREKTsKK30KKworCisvLy8gQW5hbHl6ZUxvYWRGcm9tQ2xvYmJlcmluZ1dyaXRlIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGEKKy8vLyBtZW1kZXAgcXVlcnkgb2YgYSBsb2FkIHRoYXQgZW5kcyB1cCBiZWluZyBhIGNsb2JiZXJpbmcgbWVtb3J5IHdyaXRlIChzdG9yZSwKKy8vLyBtZW1zZXQsIG1lbWNweSwgbWVtbW92ZSkuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHdyaXRlICptYXkqIHByb3ZpZGUgYml0cyB1c2VkCisvLy8gYnkgdGhlIGxvYWQgYnV0IHdlIGNhbid0IGJlIHN1cmUgYmVjYXVzZSB0aGUgcG9pbnRlcnMgZG9uJ3QgbXVzdGFsaWFzLgorLy8vCisvLy8gQ2hlY2sgdGhpcyBjYXNlIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyBtb3JlIHdlIGNhbiBkbyBiZWZvcmUgd2UgZ2l2ZQorLy8vIHVwLiAgVGhpcyByZXR1cm5zIC0xIGlmIHdlIGhhdmUgdG8gZ2l2ZSB1cCwgb3IgYSBieXRlIG51bWJlciBpbiB0aGUgc3RvcmVkCisvLy8gdmFsdWUgb2YgdGhlIHBpZWNlIHRoYXQgZmVlZHMgdGhlIGxvYWQuCitzdGF0aWMgaW50IEFuYWx5emVMb2FkRnJvbUNsb2JiZXJpbmdXcml0ZShjb25zdCBUeXBlICpMb2FkVHksIFZhbHVlICpMb2FkUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKldyaXRlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgV3JpdGVTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0RGF0YSAmVEQpIHsKKyAgLy8gSWYgdGhlIGxvYWRlZCBvciBzdG9yZWQgdmFsdWUgaXMgYW4gZmlyc3QgY2xhc3MgYXJyYXkgb3Igc3RydWN0LCBkb24ndCB0cnkKKyAgLy8gdG8gdHJhbnNmb3JtIHRoZW0uICBXZSBuZWVkIHRvIGJlIGFibGUgdG8gYml0Y2FzdCB0byBpbnRlZ2VyLgorICBpZiAoTG9hZFR5LT5pc1N0cnVjdFR5KCkgfHwgTG9hZFR5LT5pc0FycmF5VHkoKSkKKyAgICByZXR1cm4gLTE7CisgIAorICBpbnQ2NF90IFN0b3JlT2Zmc2V0ID0gMCwgTG9hZE9mZnNldCA9IDA7CisgIFZhbHVlICpTdG9yZUJhc2UgPSBHZXRCYXNlV2l0aENvbnN0YW50T2Zmc2V0KFdyaXRlUHRyLCBTdG9yZU9mZnNldCwgVEQpOworICBWYWx1ZSAqTG9hZEJhc2UgPSAKKyAgICBHZXRCYXNlV2l0aENvbnN0YW50T2Zmc2V0KExvYWRQdHIsIExvYWRPZmZzZXQsIFREKTsKKyAgaWYgKFN0b3JlQmFzZSAhPSBMb2FkQmFzZSkKKyAgICByZXR1cm4gLTE7CisgIAorICAvLyBJZiB0aGUgbG9hZCBhbmQgc3RvcmUgYXJlIHRvIHRoZSBleGFjdCBzYW1lIGFkZHJlc3MsIHRoZXkgc2hvdWxkIGhhdmUgYmVlbgorICAvLyBhIG11c3QgYWxpYXMuICBBQSBtdXN0IGhhdmUgZ290dGVuIGNvbmZ1c2VkLgorICAvLyBGSVhNRTogU3R1ZHkgdG8gc2VlIGlmL3doZW4gdGhpcyBoYXBwZW5zLiAgT25lIGNhc2UgaXMgZm9yd2FyZGluZyBhIG1lbXNldAorICAvLyB0byBhIGxvYWQgZnJvbSB0aGUgYmFzZSBvZiB0aGUgbWVtc2V0LgorI2lmIDAKKyAgaWYgKExvYWRPZmZzZXQgPT0gU3RvcmVPZmZzZXQpIHsKKyAgICBkYmdzKCkgPDwgIlNUT1JFL0xPQUQgREVQIFdJVEggQ09NTU9OIFBPSU5URVIgTUlTU0VEOlxuIgorICAgIDw8ICJCYXNlICAgICAgID0gIiA8PCAqU3RvcmVCYXNlIDw8ICJcbiIKKyAgICA8PCAiU3RvcmUgUHRyICA9ICIgPDwgKldyaXRlUHRyIDw8ICJcbiIKKyAgICA8PCAiU3RvcmUgT2ZmcyA9ICIgPDwgU3RvcmVPZmZzZXQgPDwgIlxuIgorICAgIDw8ICJMb2FkIFB0ciAgID0gIiA8PCAqTG9hZFB0ciA8PCAiXG4iOworICAgIGFib3J0KCk7CisgIH0KKyNlbmRpZgorICAKKyAgLy8gSWYgdGhlIGxvYWQgYW5kIHN0b3JlIGRvbid0IG92ZXJsYXAgYXQgYWxsLCB0aGUgc3RvcmUgZG9lc24ndCBwcm92aWRlCisgIC8vIGFueXRoaW5nIHRvIHRoZSBsb2FkLiAgSW4gdGhpcyBjYXNlLCB0aGV5IHJlYWxseSBkb24ndCBhbGlhcyBhdCBhbGwsIEFBCisgIC8vIG11c3QgaGF2ZSBnb3R0ZW4gY29uZnVzZWQuCisgIC8vIEZJWE1FOiBJbnZlc3RpZ2F0ZSBjYXNlcyB3aGVyZSB0aGlzIGJhaWxzIG91dCwgZS5nLiByZGFyOi8vNzIzODYxNC4gVGhlbgorICAvLyByZW1vdmUgdGhpcyBjaGVjaywgYXMgaXQgaXMgZHVwbGljYXRlZCB3aXRoIHdoYXQgd2UgaGF2ZSBiZWxvdy4KKyAgdWludDY0X3QgTG9hZFNpemUgPSBURC5nZXRUeXBlU2l6ZUluQml0cyhMb2FkVHkpOworICAKKyAgaWYgKChXcml0ZVNpemVJbkJpdHMgJiA3KSB8IChMb2FkU2l6ZSAmIDcpKQorICAgIHJldHVybiAtMTsKKyAgdWludDY0X3QgU3RvcmVTaXplID0gV3JpdGVTaXplSW5CaXRzID4+IDM7ICAvLyBDb252ZXJ0IHRvIGJ5dGVzLgorICBMb2FkU2l6ZSA+Pj0gMzsKKyAgCisgIAorICBib29sIGlzQUFGYWlsdXJlID0gZmFsc2U7CisgIGlmIChTdG9yZU9mZnNldCA8IExvYWRPZmZzZXQpCisgICAgaXNBQUZhaWx1cmUgPSBTdG9yZU9mZnNldCtpbnQ2NF90KFN0b3JlU2l6ZSkgPD0gTG9hZE9mZnNldDsKKyAgZWxzZQorICAgIGlzQUFGYWlsdXJlID0gTG9hZE9mZnNldCtpbnQ2NF90KExvYWRTaXplKSA8PSBTdG9yZU9mZnNldDsKKworICBpZiAoaXNBQUZhaWx1cmUpIHsKKyNpZiAwCisgICAgZGJncygpIDw8ICJTVE9SRSBMT0FEIERFUCBXSVRIIENPTU1PTiBCQVNFOlxuIgorICAgIDw8ICJCYXNlICAgICAgID0gIiA8PCAqU3RvcmVCYXNlIDw8ICJcbiIKKyAgICA8PCAiU3RvcmUgUHRyICA9ICIgPDwgKldyaXRlUHRyIDw8ICJcbiIKKyAgICA8PCAiU3RvcmUgT2ZmcyA9ICIgPDwgU3RvcmVPZmZzZXQgPDwgIlxuIgorICAgIDw8ICJMb2FkIFB0ciAgID0gIiA8PCAqTG9hZFB0ciA8PCAiXG4iOworICAgIGFib3J0KCk7CisjZW5kaWYKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgCisgIC8vIElmIHRoZSBMb2FkIGlzbid0IGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgc3RvcmVkIGJpdHMsIHdlIGRvbid0CisgIC8vIGhhdmUgYWxsIHRoZSBiaXRzIHRvIGZlZWQgaXQuICBXZSBjb3VsZCBkbyBzb21ldGhpbmcgY3JhenkgaW4gdGhlIGZ1dHVyZQorICAvLyAoaXNzdWUgYSBzbWFsbGVyIGxvYWQgdGhlbiBtZXJnZSB0aGUgYml0cyBpbikgYnV0IHRoaXMgc2VlbXMgdW5saWtlbHkgdG8gYmUKKyAgLy8gdmFsdWFibGUuCisgIGlmIChTdG9yZU9mZnNldCA+IExvYWRPZmZzZXQgfHwKKyAgICAgIFN0b3JlT2Zmc2V0K1N0b3JlU2l6ZSA8IExvYWRPZmZzZXQrTG9hZFNpemUpCisgICAgcmV0dXJuIC0xOworICAKKyAgLy8gT2theSwgd2UgY2FuIGRvIHRoaXMgdHJhbnNmb3JtYXRpb24uICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZQorICAvLyBzdG9yZSB0aGF0IHRoZSBsb2FkIGlzLgorICByZXR1cm4gTG9hZE9mZnNldC1TdG9yZU9mZnNldDsKK30gIAorCisvLy8gQW5hbHl6ZUxvYWRGcm9tQ2xvYmJlcmluZ1N0b3JlIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGEKKy8vLyBtZW1kZXAgcXVlcnkgb2YgYSBsb2FkIHRoYXQgZW5kcyB1cCBiZWluZyBhIGNsb2JiZXJpbmcgc3RvcmUuCitzdGF0aWMgaW50IEFuYWx5emVMb2FkRnJvbUNsb2JiZXJpbmdTdG9yZShjb25zdCBUeXBlICpMb2FkVHksIFZhbHVlICpMb2FkUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVJbnN0ICpEZXBTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgJlREKSB7CisgIC8vIENhbm5vdCBoYW5kbGUgcmVhZGluZyBmcm9tIHN0b3JlIG9mIGZpcnN0LWNsYXNzIGFnZ3JlZ2F0ZSB5ZXQuCisgIGlmIChEZXBTSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc1N0cnVjdFR5KCkgfHwKKyAgICAgIERlcFNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmlzQXJyYXlUeSgpKQorICAgIHJldHVybiAtMTsKKworICBWYWx1ZSAqU3RvcmVQdHIgPSBEZXBTSS0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgdWludDY0X3QgU3RvcmVTaXplID0gVEQuZ2V0VHlwZVNpemVJbkJpdHMoRGVwU0ktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSk7CisgIHJldHVybiBBbmFseXplTG9hZEZyb21DbG9iYmVyaW5nV3JpdGUoTG9hZFR5LCBMb2FkUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlUHRyLCBTdG9yZVNpemUsIFREKTsKK30KKworc3RhdGljIGludCBBbmFseXplTG9hZEZyb21DbG9iYmVyaW5nTWVtSW5zdChjb25zdCBUeXBlICpMb2FkVHksIFZhbHVlICpMb2FkUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1JbnRyaW5zaWMgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICZURCkgeworICAvLyBJZiB0aGUgbWVtIG9wZXJhdGlvbiBpcyBhIG5vbi1jb25zdGFudCBzaXplLCB3ZSBjYW4ndCBoYW5kbGUgaXQuCisgIENvbnN0YW50SW50ICpTaXplQ3N0ID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE1JLT5nZXRMZW5ndGgoKSk7CisgIGlmIChTaXplQ3N0ID09IDApIHJldHVybiAtMTsKKyAgdWludDY0X3QgTWVtU2l6ZUluQml0cyA9IFNpemVDc3QtPmdldFpFeHRWYWx1ZSgpKjg7CisKKyAgLy8gSWYgdGhpcyBpcyBtZW1zZXQsIHdlIGp1c3QgbmVlZCB0byBzZWUgaWYgdGhlIG9mZnNldCBpcyB2YWxpZCBpbiB0aGUgc2l6ZQorICAvLyBvZiB0aGUgbWVtc2V0Li4KKyAgaWYgKE1JLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bWVtc2V0KQorICAgIHJldHVybiBBbmFseXplTG9hZEZyb21DbG9iYmVyaW5nV3JpdGUoTG9hZFR5LCBMb2FkUHRyLCBNSS0+Z2V0RGVzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZUluQml0cywgVEQpOworICAKKyAgLy8gSWYgd2UgaGF2ZSBhIG1lbWNweS9tZW1tb3ZlLCB0aGUgb25seSBjYXNlIHdlIGNhbiBoYW5kbGUgaXMgaWYgdGhpcyBpcyBhCisgIC8vIGNvcHkgZnJvbSBjb25zdGFudCBtZW1vcnkuICBJbiB0aGF0IGNhc2UsIHdlIGNhbiByZWFkIGRpcmVjdGx5IGZyb20gdGhlCisgIC8vIGNvbnN0YW50IG1lbW9yeS4KKyAgTWVtVHJhbnNmZXJJbnN0ICpNVEkgPSBjYXN0PE1lbVRyYW5zZmVySW5zdD4oTUkpOworICAKKyAgQ29uc3RhbnQgKlNyYyA9IGR5bl9jYXN0PENvbnN0YW50PihNVEktPmdldFNvdXJjZSgpKTsKKyAgaWYgKFNyYyA9PSAwKSByZXR1cm4gLTE7CisgIAorICBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oU3JjLT5nZXRVbmRlcmx5aW5nT2JqZWN0KCkpOworICBpZiAoR1YgPT0gMCB8fCAhR1YtPmlzQ29uc3RhbnQoKSkgcmV0dXJuIC0xOworICAKKyAgLy8gU2VlIGlmIHRoZSBhY2Nlc3MgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHRyYW5zZmVyLgorICBpbnQgT2Zmc2V0ID0gQW5hbHl6ZUxvYWRGcm9tQ2xvYmJlcmluZ1dyaXRlKExvYWRUeSwgTG9hZFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSS0+Z2V0RGVzdCgpLCBNZW1TaXplSW5CaXRzLCBURCk7CisgIGlmIChPZmZzZXQgPT0gLTEpCisgICAgcmV0dXJuIE9mZnNldDsKKyAgCisgIC8vIE90aGVyd2lzZSwgc2VlIGlmIHdlIGNhbiBjb25zdGFudCBmb2xkIGEgbG9hZCBmcm9tIHRoZSBjb25zdGFudCB3aXRoIHRoZQorICAvLyBvZmZzZXQgYXBwbGllZCBhcyBhcHByb3ByaWF0ZS4KKyAgU3JjID0gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGU6OmdldEludDhQdHJUeShTcmMtPmdldENvbnRleHQoKSkpOworICBDb25zdGFudCAqT2Zmc2V0Q3N0ID0gCisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KFNyYy0+Z2V0Q29udGV4dCgpKSwgKHVuc2lnbmVkKU9mZnNldCk7CisgIFNyYyA9IENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihTcmMsICZPZmZzZXRDc3QsIDEpOworICBTcmMgPSBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoU3JjLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKExvYWRUeSkpOworICBpZiAoQ29uc3RhbnRGb2xkTG9hZEZyb21Db25zdFB0cihTcmMsICZURCkpCisgICAgcmV0dXJuIE9mZnNldDsKKyAgcmV0dXJuIC0xOworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLy8vIEdldFN0b3JlVmFsdWVGb3JMb2FkIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGEKKy8vLyBtZW1kZXAgcXVlcnkgb2YgYSBsb2FkIHRoYXQgZW5kcyB1cCBiZWluZyBhIGNsb2JiZXJpbmcgc3RvcmUuICBUaGlzIG1lYW5zCisvLy8gdGhhdCB0aGUgc3RvcmUgKm1heSogcHJvdmlkZSBiaXRzIHVzZWQgYnkgdGhlIGxvYWQgYnV0IHdlIGNhbid0IGJlIHN1cmUKKy8vLyBiZWNhdXNlIHRoZSBwb2ludGVycyBkb24ndCBtdXN0YWxpYXMuICBDaGVjayB0aGlzIGNhc2UgdG8gc2VlIGlmIHRoZXJlIGlzCisvLy8gYW55dGhpbmcgbW9yZSB3ZSBjYW4gZG8gYmVmb3JlIHdlIGdpdmUgdXAuCitzdGF0aWMgVmFsdWUgKkdldFN0b3JlVmFsdWVGb3JMb2FkKFZhbHVlICpTcmNWYWwsIHVuc2lnbmVkIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqTG9hZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0UHQsIGNvbnN0IFRhcmdldERhdGEgJlREKXsKKyAgTExWTUNvbnRleHQgJkN0eCA9IFNyY1ZhbC0+Z2V0VHlwZSgpLT5nZXRDb250ZXh0KCk7CisgIAorICB1aW50NjRfdCBTdG9yZVNpemUgPSAoVEQuZ2V0VHlwZVNpemVJbkJpdHMoU3JjVmFsLT5nZXRUeXBlKCkpICsgNykgLyA4OworICB1aW50NjRfdCBMb2FkU2l6ZSA9IChURC5nZXRUeXBlU2l6ZUluQml0cyhMb2FkVHkpICsgNykgLyA4OworICAKKyAgSVJCdWlsZGVyPD4gQnVpbGRlcihJbnNlcnRQdC0+Z2V0UGFyZW50KCksIEluc2VydFB0KTsKKyAgCisgIC8vIENvbXB1dGUgd2hpY2ggYml0cyBvZiB0aGUgc3RvcmVkIHZhbHVlIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBsb2FkLiAgQ29udmVydAorICAvLyB0byBhbiBpbnRlZ2VyIHR5cGUgdG8gc3RhcnQgd2l0aC4KKyAgaWYgKFNyY1ZhbC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgIFNyY1ZhbCA9IEJ1aWxkZXIuQ3JlYXRlUHRyVG9JbnQoU3JjVmFsLCBURC5nZXRJbnRQdHJUeXBlKEN0eCkpOworICBpZiAoIVNyY1ZhbC0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpKQorICAgIFNyY1ZhbCA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChTcmNWYWwsIEludGVnZXJUeXBlOjpnZXQoQ3R4LCBTdG9yZVNpemUqOCkpOworICAKKyAgLy8gU2hpZnQgdGhlIGJpdHMgdG8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGRlcGVuZGluZyBvbiBlbmRpYW5uZXNzLgorICB1bnNpZ25lZCBTaGlmdEFtdDsKKyAgaWYgKFRELmlzTGl0dGxlRW5kaWFuKCkpCisgICAgU2hpZnRBbXQgPSBPZmZzZXQqODsKKyAgZWxzZQorICAgIFNoaWZ0QW10ID0gKFN0b3JlU2l6ZS1Mb2FkU2l6ZS1PZmZzZXQpKjg7CisgIAorICBpZiAoU2hpZnRBbXQpCisgICAgU3JjVmFsID0gQnVpbGRlci5DcmVhdGVMU2hyKFNyY1ZhbCwgU2hpZnRBbXQpOworICAKKyAgaWYgKExvYWRTaXplICE9IFN0b3JlU2l6ZSkKKyAgICBTcmNWYWwgPSBCdWlsZGVyLkNyZWF0ZVRydW5jKFNyY1ZhbCwgSW50ZWdlclR5cGU6OmdldChDdHgsIExvYWRTaXplKjgpKTsKKyAgCisgIHJldHVybiBDb2VyY2VBdmFpbGFibGVWYWx1ZVRvTG9hZFR5cGUoU3JjVmFsLCBMb2FkVHksIEluc2VydFB0LCBURCk7Cit9CisKKy8vLyBHZXRNZW1JbnN0VmFsdWVGb3JMb2FkIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGEKKy8vLyBtZW1kZXAgcXVlcnkgb2YgYSBsb2FkIHRoYXQgZW5kcyB1cCBiZWluZyBhIGNsb2JiZXJpbmcgbWVtIGludHJpbnNpYy4KK3N0YXRpYyBWYWx1ZSAqR2V0TWVtSW5zdFZhbHVlRm9yTG9hZChNZW1JbnRyaW5zaWMgKlNyY0luc3QsIHVuc2lnbmVkIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpMb2FkVHksIEluc3RydWN0aW9uICpJbnNlcnRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXREYXRhICZURCl7CisgIExMVk1Db250ZXh0ICZDdHggPSBMb2FkVHktPmdldENvbnRleHQoKTsKKyAgdWludDY0X3QgTG9hZFNpemUgPSBURC5nZXRUeXBlU2l6ZUluQml0cyhMb2FkVHkpLzg7CisKKyAgSVJCdWlsZGVyPD4gQnVpbGRlcihJbnNlcnRQdC0+Z2V0UGFyZW50KCksIEluc2VydFB0KTsKKyAgCisgIC8vIFdlIGtub3cgdGhhdCB0aGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBtZW0gdHJhbnNmZXIgZnVsbHkKKyAgLy8gcHJvdmlkZXMgdGhlIGJpdHMgZm9yIHRoZSBsb2FkLgorICBpZiAoTWVtU2V0SW5zdCAqTVNJID0gZHluX2Nhc3Q8TWVtU2V0SW5zdD4oU3JjSW5zdCkpIHsKKyAgICAvLyBtZW1zZXQoUCwgJ3gnLCAxMjM0KSAtPiBzcGxhdCgneCcpLCBldmVuIGlmIHggaXMgYSB2YXJpYWJsZSwgYW5kCisgICAgLy8gaW5kZXBlbmRlbnRseSBvZiB3aGF0IHRoZSBvZmZzZXQgaXMuCisgICAgVmFsdWUgKlZhbCA9IE1TSS0+Z2V0VmFsdWUoKTsKKyAgICBpZiAoTG9hZFNpemUgIT0gMSkKKyAgICAgIFZhbCA9IEJ1aWxkZXIuQ3JlYXRlWkV4dChWYWwsIEludGVnZXJUeXBlOjpnZXQoQ3R4LCBMb2FkU2l6ZSo4KSk7CisgICAgCisgICAgVmFsdWUgKk9uZUVsdCA9IFZhbDsKKyAgICAKKyAgICAvLyBTcGxhdCB0aGUgdmFsdWUgb3V0IHRvIHRoZSByaWdodCBudW1iZXIgb2YgYml0cy4KKyAgICBmb3IgKHVuc2lnbmVkIE51bUJ5dGVzU2V0ID0gMTsgTnVtQnl0ZXNTZXQgIT0gTG9hZFNpemU7ICkgeworICAgICAgLy8gSWYgd2UgY2FuIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNldCwgZG8gaXQuCisgICAgICBpZiAoTnVtQnl0ZXNTZXQqMiA8PSBMb2FkU2l6ZSkgeworICAgICAgICBWYWx1ZSAqU2hWYWwgPSBCdWlsZGVyLkNyZWF0ZVNobChWYWwsIE51bUJ5dGVzU2V0KjgpOworICAgICAgICBWYWwgPSBCdWlsZGVyLkNyZWF0ZU9yKFZhbCwgU2hWYWwpOworICAgICAgICBOdW1CeXRlc1NldCA8PD0gMTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSBpbnNlcnQgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgVmFsdWUgKlNoVmFsID0gQnVpbGRlci5DcmVhdGVTaGwoVmFsLCAxKjgpOworICAgICAgVmFsID0gQnVpbGRlci5DcmVhdGVPcihPbmVFbHQsIFNoVmFsKTsKKyAgICAgICsrTnVtQnl0ZXNTZXQ7CisgICAgfQorICAgIAorICAgIHJldHVybiBDb2VyY2VBdmFpbGFibGVWYWx1ZVRvTG9hZFR5cGUoVmFsLCBMb2FkVHksIEluc2VydFB0LCBURCk7CisgIH0KKyAKKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgbWVtY3B5L21lbW1vdmUgZnJvbSBhIGNvbnN0YW50IGdsb2JhbC4KKyAgTWVtVHJhbnNmZXJJbnN0ICpNVEkgPSBjYXN0PE1lbVRyYW5zZmVySW5zdD4oU3JjSW5zdCk7CisgIENvbnN0YW50ICpTcmMgPSBjYXN0PENvbnN0YW50PihNVEktPmdldFNvdXJjZSgpKTsKKworICAvLyBPdGhlcndpc2UsIHNlZSBpZiB3ZSBjYW4gY29uc3RhbnQgZm9sZCBhIGxvYWQgZnJvbSB0aGUgY29uc3RhbnQgd2l0aCB0aGUKKyAgLy8gb2Zmc2V0IGFwcGxpZWQgYXMgYXBwcm9wcmlhdGUuCisgIFNyYyA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpUeXBlOjpnZXRJbnQ4UHRyVHkoU3JjLT5nZXRDb250ZXh0KCkpKTsKKyAgQ29uc3RhbnQgKk9mZnNldENzdCA9IAorICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoU3JjLT5nZXRDb250ZXh0KCkpLCAodW5zaWduZWQpT2Zmc2V0KTsKKyAgU3JjID0gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKFNyYywgJk9mZnNldENzdCwgMSk7CisgIFNyYyA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChTcmMsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoTG9hZFR5KSk7CisgIHJldHVybiBDb25zdGFudEZvbGRMb2FkRnJvbUNvbnN0UHRyKFNyYywgJlREKTsKK30KKworbmFtZXNwYWNlIHsKKworc3RydWN0IEF2YWlsYWJsZVZhbHVlSW5CbG9jayB7CisgIC8vLyBCQiAtIFRoZSBiYXNpYyBibG9jayBpbiBxdWVzdGlvbi4KKyAgQmFzaWNCbG9jayAqQkI7CisgIGVudW0gVmFsVHlwZSB7CisgICAgU2ltcGxlVmFsLCAgLy8gQSBzaW1wbGUgb2Zmc2V0dGVkIHZhbHVlIHRoYXQgaXMgYWNjZXNzZWQuCisgICAgTWVtSW50cmluICAgLy8gQSBtZW1vcnkgaW50cmluc2ljIHdoaWNoIGlzIGxvYWRlZCBmcm9tLgorICB9OworICAKKyAgLy8vIFYgLSBUaGUgdmFsdWUgdGhhdCBpcyBsaXZlIG91dCBvZiB0aGUgYmxvY2suCisgIFBvaW50ZXJJbnRQYWlyPFZhbHVlICosIDEsIFZhbFR5cGU+IFZhbDsKKyAgCisgIC8vLyBPZmZzZXQgLSBUaGUgYnl0ZSBvZmZzZXQgaW4gVmFsIHRoYXQgaXMgaW50ZXJlc3RpbmcgZm9yIHRoZSBsb2FkIHF1ZXJ5LgorICB1bnNpZ25lZCBPZmZzZXQ7CisgIAorICBzdGF0aWMgQXZhaWxhYmxlVmFsdWVJbkJsb2NrIGdldChCYXNpY0Jsb2NrICpCQiwgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9mZnNldCA9IDApIHsKKyAgICBBdmFpbGFibGVWYWx1ZUluQmxvY2sgUmVzOworICAgIFJlcy5CQiA9IEJCOworICAgIFJlcy5WYWwuc2V0UG9pbnRlcihWKTsKKyAgICBSZXMuVmFsLnNldEludChTaW1wbGVWYWwpOworICAgIFJlcy5PZmZzZXQgPSBPZmZzZXQ7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIHN0YXRpYyBBdmFpbGFibGVWYWx1ZUluQmxvY2sgZ2V0TUkoQmFzaWNCbG9jayAqQkIsIE1lbUludHJpbnNpYyAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT2Zmc2V0ID0gMCkgeworICAgIEF2YWlsYWJsZVZhbHVlSW5CbG9jayBSZXM7CisgICAgUmVzLkJCID0gQkI7CisgICAgUmVzLlZhbC5zZXRQb2ludGVyKE1JKTsKKyAgICBSZXMuVmFsLnNldEludChNZW1JbnRyaW4pOworICAgIFJlcy5PZmZzZXQgPSBPZmZzZXQ7CisgICAgcmV0dXJuIFJlczsKKyAgfQorICAKKyAgYm9vbCBpc1NpbXBsZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldEludCgpID09IFNpbXBsZVZhbDsgfQorICBWYWx1ZSAqZ2V0U2ltcGxlVmFsdWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU2ltcGxlVmFsdWUoKSAmJiAiV3JvbmcgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gVmFsLmdldFBvaW50ZXIoKTsKKyAgfQorICAKKyAgTWVtSW50cmluc2ljICpnZXRNZW1JbnRyaW5WYWx1ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzU2ltcGxlVmFsdWUoKSAmJiAiV3JvbmcgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gY2FzdDxNZW1JbnRyaW5zaWM+KFZhbC5nZXRQb2ludGVyKCkpOworICB9CisgIAorICAvLy8gTWF0ZXJpYWxpemVBZGp1c3RlZFZhbHVlIC0gRW1pdCBjb2RlIGludG8gdGhpcyBibG9jayB0byBhZGp1c3QgdGhlIHZhbHVlCisgIC8vLyBkZWZpbmVkIGhlcmUgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiAgVGhpcyBoYW5kbGVzIHZhcmlvdXMgY29lcmNpb24gY2FzZXMuCisgIFZhbHVlICpNYXRlcmlhbGl6ZUFkanVzdGVkVmFsdWUoY29uc3QgVHlwZSAqTG9hZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlREKSBjb25zdCB7CisgICAgVmFsdWUgKlJlczsKKyAgICBpZiAoaXNTaW1wbGVWYWx1ZSgpKSB7CisgICAgICBSZXMgPSBnZXRTaW1wbGVWYWx1ZSgpOworICAgICAgaWYgKFJlcy0+Z2V0VHlwZSgpICE9IExvYWRUeSkgeworICAgICAgICBhc3NlcnQoVEQgJiYgIk5lZWQgdGFyZ2V0IGRhdGEgdG8gaGFuZGxlIHR5cGUgbWlzbWF0Y2ggY2FzZSIpOworICAgICAgICBSZXMgPSBHZXRTdG9yZVZhbHVlRm9yTG9hZChSZXMsIE9mZnNldCwgTG9hZFR5LCBCQi0+Z2V0VGVybWluYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVEQpOworICAgICAgICAKKyAgICAgICAgREVCVUcoZXJycygpIDw8ICJHVk4gQ09FUkNFRCBOT05MT0NBTCBWQUw6XG5PZmZzZXQ6ICIgPDwgT2Zmc2V0IDw8ICIgICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICpnZXRTaW1wbGVWYWx1ZSgpIDw8ICdcbicKKyAgICAgICAgICAgICAgICAgICAgIDw8ICpSZXMgPDwgJ1xuJyA8PCAiXG5cblxuIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFJlcyA9IEdldE1lbUluc3RWYWx1ZUZvckxvYWQoZ2V0TWVtSW50cmluVmFsdWUoKSwgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkVHksIEJCLT5nZXRUZXJtaW5hdG9yKCksICpURCk7CisgICAgICBERUJVRyhlcnJzKCkgPDwgIkdWTiBDT0VSQ0VEIE5PTkxPQ0FMIE1FTSBJTlRSSU46XG5PZmZzZXQ6ICIgPDwgT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgPDwgIiAgIiA8PCAqZ2V0TWVtSW50cmluVmFsdWUoKSA8PCAnXG4nCisgICAgICAgICAgICAgICAgICAgPDwgKlJlcyA8PCAnXG4nIDw8ICJcblxuXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIFJlczsKKyAgfQorfTsKKworfQorCisvLy8gQ29uc3RydWN0U1NBRm9yTG9hZFNldCAtIEdpdmVuIGEgc2V0IG9mIGxvYWRzIHNwZWNpZmllZCBieSBWYWx1ZXNQZXJCbG9jaywKKy8vLyBjb25zdHJ1Y3QgU1NBIGZvcm0sIGFsbG93aW5nIHVzIHRvIGVsaW1pbmF0ZSBMSS4gIFRoaXMgcmV0dXJucyB0aGUgdmFsdWUKKy8vLyB0aGF0IHNob3VsZCBiZSB1c2VkIGF0IExJJ3MgZGVmaW5pdGlvbiBzaXRlLgorc3RhdGljIFZhbHVlICpDb25zdHJ1Y3RTU0FGb3JMb2FkU2V0KExvYWRJbnN0ICpMSSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEF2YWlsYWJsZVZhbHVlSW5CbG9jaz4gJlZhbHVlc1BlckJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldERhdGEgKlRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgJkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBKSB7CisgIC8vIENoZWNrIGZvciB0aGUgZnVsbHkgcmVkdW5kYW50LCBkb21pbmF0aW5nIGxvYWQgY2FzZS4gIEluIHRoaXMgY2FzZSwgd2UgY2FuCisgIC8vIGp1c3QgdXNlIHRoZSBkb21pbmF0aW5nIHZhbHVlIGRpcmVjdGx5LgorICBpZiAoVmFsdWVzUGVyQmxvY2suc2l6ZSgpID09IDEgJiYgCisgICAgICBEVC5wcm9wZXJseURvbWluYXRlcyhWYWx1ZXNQZXJCbG9ja1swXS5CQiwgTEktPmdldFBhcmVudCgpKSkKKyAgICByZXR1cm4gVmFsdWVzUGVyQmxvY2tbMF0uTWF0ZXJpYWxpemVBZGp1c3RlZFZhbHVlKExJLT5nZXRUeXBlKCksIFREKTsKKworICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gY29uc3RydWN0IFNTQSBmb3JtLgorICBTbWFsbFZlY3RvcjxQSElOb2RlKiwgOD4gTmV3UEhJczsKKyAgU1NBVXBkYXRlciBTU0FVcGRhdGUoJk5ld1BISXMpOworICBTU0FVcGRhdGUuSW5pdGlhbGl6ZShMSSk7CisgIAorICBjb25zdCBUeXBlICpMb2FkVHkgPSBMSS0+Z2V0VHlwZSgpOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHVlc1BlckJsb2NrLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBBdmFpbGFibGVWYWx1ZUluQmxvY2sgJkFWID0gVmFsdWVzUGVyQmxvY2tbaV07CisgICAgQmFzaWNCbG9jayAqQkIgPSBBVi5CQjsKKyAgICAKKyAgICBpZiAoU1NBVXBkYXRlLkhhc1ZhbHVlRm9yQmxvY2soQkIpKQorICAgICAgY29udGludWU7CisKKyAgICBTU0FVcGRhdGUuQWRkQXZhaWxhYmxlVmFsdWUoQkIsIEFWLk1hdGVyaWFsaXplQWRqdXN0ZWRWYWx1ZShMb2FkVHksIFREKSk7CisgIH0KKyAgCisgIC8vIFBlcmZvcm0gUEhJIGNvbnN0cnVjdGlvbi4KKyAgVmFsdWUgKlYgPSBTU0FVcGRhdGUuR2V0VmFsdWVJbk1pZGRsZU9mQmxvY2soTEktPmdldFBhcmVudCgpKTsKKyAgCisgIC8vIElmIG5ldyBQSEkgbm9kZXMgd2VyZSBjcmVhdGVkLCBub3RpZnkgYWxpYXMgYW5hbHlzaXMuCisgIGlmIChWLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5ld1BISXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIEFBLT5jb3B5VmFsdWUoTEksIE5ld1BISXNbaV0pOworCisgIHJldHVybiBWOworfQorCitzdGF0aWMgYm9vbCBpc0xpZmV0aW1lU3RhcnQoY29uc3QgSW5zdHJ1Y3Rpb24gKkluc3QpIHsKKyAgaWYgKGNvbnN0IEludHJpbnNpY0luc3QqIElJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oSW5zdCkpCisgICAgcmV0dXJuIElJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bGlmZXRpbWVfc3RhcnQ7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIHByb2Nlc3NOb25Mb2NhbExvYWQgLSBBdHRlbXB0IHRvIGVsaW1pbmF0ZSBhIGxvYWQgd2hvc2UgZGVwZW5kZW5jaWVzIGFyZQorLy8vIG5vbi1sb2NhbCBieSBwZXJmb3JtaW5nIFBISSBjb25zdHJ1Y3Rpb24uCitib29sIEdWTjo6cHJvY2Vzc05vbkxvY2FsTG9hZChMb2FkSW5zdCAqTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24qPiAmdG9FcmFzZSkgeworICAvLyBGaW5kIHRoZSBub24tbG9jYWwgZGVwZW5kZW5jaWVzIG9mIHRoZSBsb2FkLgorICBTbWFsbFZlY3RvcjxOb25Mb2NhbERlcFJlc3VsdCwgNjQ+IERlcHM7CisgIE1ELT5nZXROb25Mb2NhbFBvaW50ZXJEZXBlbmRlbmN5KExJLT5nZXRPcGVyYW5kKDApLCB0cnVlLCBMSS0+Z2V0UGFyZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHMpOworICAvL0RFQlVHKGRiZ3MoKSA8PCAiSU5WRVNUSUdBVElORyBOT05MT0NBTCBMT0FEOiAiCisgIC8vICAgICAgICAgICAgIDw8IERlcHMuc2l6ZSgpIDw8ICpMSSA8PCAnXG4nKTsKKworICAvLyBJZiB3ZSBoYWQgdG8gcHJvY2VzcyBtb3JlIHRoYW4gb25lIGh1bmRyZWQgYmxvY2tzIHRvIGZpbmQgdGhlCisgIC8vIGRlcGVuZGVuY2llcywgdGhpcyBsb2FkIGlzbid0IHdvcnRoIHdvcnJ5aW5nIGFib3V0LiAgT3B0aW1pemluZworICAvLyBpdCB3aWxsIGJlIHRvbyBleHBlbnNpdmUuCisgIGlmIChEZXBzLnNpemUoKSA+IDEwMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgd2UgaGFkIGEgcGhpIHRyYW5zbGF0aW9uIGZhaWx1cmUsIHdlJ2xsIGhhdmUgYSBzaW5nbGUgZW50cnkgd2hpY2ggaXMgYQorICAvLyBjbG9iYmVyIGluIHRoZSBjdXJyZW50IGJsb2NrLiAgUmVqZWN0IHRoaXMgZWFybHkuCisgIGlmIChEZXBzLnNpemUoKSA9PSAxICYmIERlcHNbMF0uZ2V0UmVzdWx0KCkuaXNDbG9iYmVyKCkpIHsKKyAgICBERUJVRygKKyAgICAgIGRiZ3MoKSA8PCAiR1ZOOiBub24tbG9jYWwgbG9hZCAiOworICAgICAgV3JpdGVBc09wZXJhbmQoZGJncygpLCBMSSk7CisgICAgICBkYmdzKCkgPDwgIiBpcyBjbG9iYmVyZWQgYnkgIiA8PCAqRGVwc1swXS5nZXRSZXN1bHQoKS5nZXRJbnN0KCkgPDwgJ1xuJzsKKyAgICApOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEZpbHRlciBvdXQgdXNlbGVzcyByZXN1bHRzIChub24tbG9jYWxzLCBldGMpLiAgS2VlcCB0cmFjayBvZiB0aGUgYmxvY2tzCisgIC8vIHdoZXJlIHdlIGhhdmUgYSB2YWx1ZSBhdmFpbGFibGUgaW4gcmVwbCwgYWxzbyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2Ugc2VlCisgIC8vIGRlcGVuZGVuY2llcyB0aGF0IHByb2R1Y2UgYW4gdW5rbm93biB2YWx1ZSBmb3IgdGhlIGxvYWQgKHN1Y2ggYXMgYSBjYWxsCisgIC8vIHRoYXQgY291bGQgcG90ZW50aWFsbHkgY2xvYmJlciB0aGUgbG9hZCkuCisgIFNtYWxsVmVjdG9yPEF2YWlsYWJsZVZhbHVlSW5CbG9jaywgMTY+IFZhbHVlc1BlckJsb2NrOworICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgMTY+IFVuYXZhaWxhYmxlQmxvY2tzOworCisgIGNvbnN0IFRhcmdldERhdGEgKlREID0gMDsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEZXBzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBCYXNpY0Jsb2NrICpEZXBCQiA9IERlcHNbaV0uZ2V0QkIoKTsKKyAgICBNZW1EZXBSZXN1bHQgRGVwSW5mbyA9IERlcHNbaV0uZ2V0UmVzdWx0KCk7CisKKyAgICBpZiAoRGVwSW5mby5pc0Nsb2JiZXIoKSkgeworICAgICAgLy8gVGhlIGFkZHJlc3MgYmVpbmcgbG9hZGVkIGluIHRoaXMgbm9uLWxvY2FsIGJsb2NrIG1heSBub3QgYmUgdGhlIHNhbWUgYXMKKyAgICAgIC8vIHRoZSBwb2ludGVyIG9wZXJhbmQgb2YgdGhlIGxvYWQgaWYgUEhJIHRyYW5zbGF0aW9uIG9jY3Vycy4gIE1ha2Ugc3VyZQorICAgICAgLy8gdG8gY29uc2lkZXIgdGhlIHJpZ2h0IGFkZHJlc3MuCisgICAgICBWYWx1ZSAqQWRkcmVzcyA9IERlcHNbaV0uZ2V0QWRkcmVzcygpOworICAgICAgCisgICAgICAvLyBJZiB0aGUgZGVwZW5kZW5jZSBpcyB0byBhIHN0b3JlIHRoYXQgd3JpdGVzIHRvIGEgc3VwZXJzZXQgb2YgdGhlIGJpdHMKKyAgICAgIC8vIHJlYWQgYnkgdGhlIGxvYWQsIHdlIGNhbiBleHRyYWN0IHRoZSBiaXRzIHdlIG5lZWQgZm9yIHRoZSBsb2FkIGZyb20gdGhlCisgICAgICAvLyBzdG9yZWQgdmFsdWUuCisgICAgICBpZiAoU3RvcmVJbnN0ICpEZXBTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oRGVwSW5mby5nZXRJbnN0KCkpKSB7CisgICAgICAgIGlmIChURCA9PSAwKQorICAgICAgICAgIFREID0gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxUYXJnZXREYXRhPigpOworICAgICAgICBpZiAoVEQgJiYgQWRkcmVzcykgeworICAgICAgICAgIGludCBPZmZzZXQgPSBBbmFseXplTG9hZEZyb21DbG9iYmVyaW5nU3RvcmUoTEktPmdldFR5cGUoKSwgQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcFNJLCAqVEQpOworICAgICAgICAgIGlmIChPZmZzZXQgIT0gLTEpIHsKKyAgICAgICAgICAgIFZhbHVlc1BlckJsb2NrLnB1c2hfYmFjayhBdmFpbGFibGVWYWx1ZUluQmxvY2s6OmdldChEZXBCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwU0ktPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0KSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhlIGNsb2JiZXJpbmcgdmFsdWUgaXMgYSBtZW1zZXQvbWVtY3B5L21lbW1vdmUsIHNlZSBpZiB3ZSBjYW4KKyAgICAgIC8vIGZvcndhcmQgYSB2YWx1ZSBvbiBmcm9tIGl0LgorICAgICAgaWYgKE1lbUludHJpbnNpYyAqRGVwTUkgPSBkeW5fY2FzdDxNZW1JbnRyaW5zaWM+KERlcEluZm8uZ2V0SW5zdCgpKSkgeworICAgICAgICBpZiAoVEQgPT0gMCkKKyAgICAgICAgICBURCA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8VGFyZ2V0RGF0YT4oKTsKKyAgICAgICAgaWYgKFREICYmIEFkZHJlc3MpIHsKKyAgICAgICAgICBpbnQgT2Zmc2V0ID0gQW5hbHl6ZUxvYWRGcm9tQ2xvYmJlcmluZ01lbUluc3QoTEktPmdldFR5cGUoKSwgQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwTUksICpURCk7CisgICAgICAgICAgaWYgKE9mZnNldCAhPSAtMSkgeworICAgICAgICAgICAgVmFsdWVzUGVyQmxvY2sucHVzaF9iYWNrKEF2YWlsYWJsZVZhbHVlSW5CbG9jazo6Z2V0TUkoRGVwQkIsIERlcE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0KSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgVW5hdmFpbGFibGVCbG9ja3MucHVzaF9iYWNrKERlcEJCKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEluc3RydWN0aW9uICpEZXBJbnN0ID0gRGVwSW5mby5nZXRJbnN0KCk7CisKKyAgICAvLyBMb2FkaW5nIHRoZSBhbGxvY2F0aW9uIC0+IHVuZGVmLgorICAgIGlmIChpc2E8QWxsb2NhSW5zdD4oRGVwSW5zdCkgfHwKKyAgICAgICAgLy8gTG9hZGluZyBpbW1lZGlhdGVseSBhZnRlciBsaWZldGltZSBiZWdpbiAtPiB1bmRlZi4KKyAgICAgICAgaXNMaWZldGltZVN0YXJ0KERlcEluc3QpKSB7CisgICAgICBWYWx1ZXNQZXJCbG9jay5wdXNoX2JhY2soQXZhaWxhYmxlVmFsdWVJbkJsb2NrOjpnZXQoRGVwQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmRlZlZhbHVlOjpnZXQoTEktPmdldFR5cGUoKSkpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBpZiAoU3RvcmVJbnN0ICpTID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihEZXBJbnN0KSkgeworICAgICAgLy8gUmVqZWN0IGxvYWRzIGFuZCBzdG9yZXMgdGhhdCBhcmUgdG8gdGhlIHNhbWUgYWRkcmVzcyBidXQgYXJlIG9mCisgICAgICAvLyBkaWZmZXJlbnQgdHlwZXMgaWYgd2UgaGF2ZSB0by4KKyAgICAgIGlmIChTLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgIT0gTEktPmdldFR5cGUoKSkgeworICAgICAgICBpZiAoVEQgPT0gMCkKKyAgICAgICAgICBURCA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8VGFyZ2V0RGF0YT4oKTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBzdG9yZWQgdmFsdWUgaXMgbGFyZ2VyIG9yIGVxdWFsIHRvIHRoZSBsb2FkZWQgdmFsdWUsIHdlIGNhbgorICAgICAgICAvLyByZXVzZSBpdC4KKyAgICAgICAgaWYgKFREID09IDAgfHwgIUNhbkNvZXJjZU11c3RBbGlhc2VkVmFsdWVUb0xvYWQoUy0+Z2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEktPmdldFR5cGUoKSwgKlREKSkgeworICAgICAgICAgIFVuYXZhaWxhYmxlQmxvY2tzLnB1c2hfYmFjayhEZXBCQik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgVmFsdWVzUGVyQmxvY2sucHVzaF9iYWNrKEF2YWlsYWJsZVZhbHVlSW5CbG9jazo6Z2V0KERlcEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMtPmdldE9wZXJhbmQoMCkpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBpZiAoTG9hZEluc3QgKkxEID0gZHluX2Nhc3Q8TG9hZEluc3Q+KERlcEluc3QpKSB7CisgICAgICAvLyBJZiB0aGUgdHlwZXMgbWlzbWF0Y2ggYW5kIHdlIGNhbid0IGhhbmRsZSBpdCwgcmVqZWN0IHJldXNlIG9mIHRoZSBsb2FkLgorICAgICAgaWYgKExELT5nZXRUeXBlKCkgIT0gTEktPmdldFR5cGUoKSkgeworICAgICAgICBpZiAoVEQgPT0gMCkKKyAgICAgICAgICBURCA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8VGFyZ2V0RGF0YT4oKTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBzdG9yZWQgdmFsdWUgaXMgbGFyZ2VyIG9yIGVxdWFsIHRvIHRoZSBsb2FkZWQgdmFsdWUsIHdlIGNhbgorICAgICAgICAvLyByZXVzZSBpdC4KKyAgICAgICAgaWYgKFREID09IDAgfHwgIUNhbkNvZXJjZU11c3RBbGlhc2VkVmFsdWVUb0xvYWQoTEQsIExJLT5nZXRUeXBlKCksKlREKSl7CisgICAgICAgICAgVW5hdmFpbGFibGVCbG9ja3MucHVzaF9iYWNrKERlcEJCKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSAgICAgICAgICAKKyAgICAgIH0KKyAgICAgIFZhbHVlc1BlckJsb2NrLnB1c2hfYmFjayhBdmFpbGFibGVWYWx1ZUluQmxvY2s6OmdldChEZXBCQiwgTEQpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBVbmF2YWlsYWJsZUJsb2Nrcy5wdXNoX2JhY2soRGVwQkIpOworICAgIGNvbnRpbnVlOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSBubyBwcmVkZWNlc3NvcnMgdGhhdCBwcm9kdWNlIGEga25vd24gdmFsdWUgZm9yIHRoaXMgbG9hZCwgZXhpdAorICAvLyBlYXJseS4KKyAgaWYgKFZhbHVlc1BlckJsb2NrLmVtcHR5KCkpIHJldHVybiBmYWxzZTsKKworICAvLyBJZiBhbGwgb2YgdGhlIGluc3RydWN0aW9ucyB3ZSBkZXBlbmQgb24gcHJvZHVjZSBhIGtub3duIHZhbHVlIGZvciB0aGlzCisgIC8vIGxvYWQsIHRoZW4gaXQgaXMgZnVsbHkgcmVkdW5kYW50IGFuZCB3ZSBjYW4gdXNlIFBISSBpbnNlcnRpb24gdG8gY29tcHV0ZQorICAvLyBpdHMgdmFsdWUuICBJbnNlcnQgUEhJcyBhbmQgcmVtb3ZlIHRoZSBmdWxseSByZWR1bmRhbnQgdmFsdWUgbm93LgorICBpZiAoVW5hdmFpbGFibGVCbG9ja3MuZW1wdHkoKSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiR1ZOIFJFTU9WSU5HIE5PTkxPQ0FMIExPQUQ6ICIgPDwgKkxJIDw8ICdcbicpOworICAgIAorICAgIC8vIFBlcmZvcm0gUEhJIGNvbnN0cnVjdGlvbi4KKyAgICBWYWx1ZSAqViA9IENvbnN0cnVjdFNTQUZvckxvYWRTZXQoTEksIFZhbHVlc1BlckJsb2NrLCBURCwgKkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTi5nZXRBbGlhc0FuYWx5c2lzKCkpOworICAgIExJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVik7CisKKyAgICBpZiAoaXNhPFBISU5vZGU+KFYpKQorICAgICAgVi0+dGFrZU5hbWUoTEkpOworICAgIGlmIChWLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgICBNRC0+aW52YWxpZGF0ZUNhY2hlZFBvaW50ZXJJbmZvKFYpOworICAgIFZOLmVyYXNlKExJKTsKKyAgICB0b0VyYXNlLnB1c2hfYmFjayhMSSk7CisgICAgKytOdW1HVk5Mb2FkOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKCFFbmFibGVQUkUgfHwgIUVuYWJsZUxvYWRQUkUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE9rYXksIHdlIGhhdmUgKnNvbWUqIGRlZmluaXRpb25zIG9mIHRoZSB2YWx1ZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgdmFsdWUKKyAgLy8gaXMgYXZhaWxhYmxlIGluIHNvbWUgb2Ygb3VyICh0cmFuc2l0aXZlKSBwcmVkZWNlc3NvcnMuICBMZXRzIHRoaW5rIGFib3V0CisgIC8vIGRvaW5nIFBSRSBvZiB0aGlzIGxvYWQuICBUaGlzIHdpbGwgaW52b2x2ZSBpbnNlcnRpbmcgYSBuZXcgbG9hZCBpbnRvIHRoZQorICAvLyBwcmVkZWNlc3NvciB3aGVuIGl0J3Mgbm90IGF2YWlsYWJsZS4gIFdlIGNvdWxkIGRvIHRoaXMgaW4gZ2VuZXJhbCwgYnV0CisgIC8vIHByZWZlciB0byBub3QgaW5jcmVhc2UgY29kZSBzaXplLiAgQXMgc3VjaCwgd2Ugb25seSBkbyB0aGlzIHdoZW4gd2Uga25vdworICAvLyB0aGF0IHdlIG9ubHkgaGF2ZSB0byBpbnNlcnQgKm9uZSogbG9hZCAod2hpY2ggbWVhbnMgd2UncmUgYmFzaWNhbGx5IG1vdmluZworICAvLyB0aGUgbG9hZCwgbm90IGluc2VydGluZyBhIG5ldyBvbmUpLgorCisgIFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sgKiwgND4gQmxvY2tlcnM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVbmF2YWlsYWJsZUJsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIEJsb2NrZXJzLmluc2VydChVbmF2YWlsYWJsZUJsb2Nrc1tpXSk7CisKKyAgLy8gTGV0cyBmaW5kIGZpcnN0IGJhc2ljIGJsb2NrIHdpdGggbW9yZSB0aGFuIG9uZSBwcmVkZWNlc3Nvci4gIFdhbGsgYmFja3dhcmRzCisgIC8vIHRocm91Z2ggcHJlZGVjZXNzb3JzIGlmIG5lZWRlZC4KKyAgQmFzaWNCbG9jayAqTG9hZEJCID0gTEktPmdldFBhcmVudCgpOworICBCYXNpY0Jsb2NrICpUbXBCQiA9IExvYWRCQjsKKworICBib29sIGlzU2luZ2xlUHJlZCA9IGZhbHNlOworICBib29sIGFsbFNpbmdsZVN1Y2MgPSB0cnVlOworICB3aGlsZSAoVG1wQkItPmdldFNpbmdsZVByZWRlY2Vzc29yKCkpIHsKKyAgICBpc1NpbmdsZVByZWQgPSB0cnVlOworICAgIFRtcEJCID0gVG1wQkItPmdldFNpbmdsZVByZWRlY2Vzc29yKCk7CisgICAgaWYgKFRtcEJCID09IExvYWRCQikgLy8gSW5maW5pdGUgKHVucmVhY2hhYmxlKSBsb29wLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChCbG9ja2Vycy5jb3VudChUbXBCQikpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKFRtcEJCLT5nZXRUZXJtaW5hdG9yKCktPmdldE51bVN1Y2Nlc3NvcnMoKSAhPSAxKQorICAgICAgYWxsU2luZ2xlU3VjYyA9IGZhbHNlOworICB9CisKKyAgYXNzZXJ0KFRtcEJCKTsKKyAgTG9hZEJCID0gVG1wQkI7CisKKyAgLy8gSWYgd2UgaGF2ZSBhIHJlcGwgc2V0IHdpdGggTEkgaXRzZWxmIGluIGl0LCB0aGlzIG1lYW5zIHdlIGhhdmUgYSBsb29wIHdoZXJlCisgIC8vIGF0IGxlYXN0IG9uZSBvZiB0aGUgdmFsdWVzIGlzIExJLiAgU2luY2UgdGhpcyBtZWFucyB0aGF0IHdlIHdvbid0IGJlIGFibGUKKyAgLy8gdG8gZWxpbWluYXRlIExJIGV2ZW4gaWYgd2UgaW5zZXJ0IHVzZXMgaW4gdGhlIG90aGVyIHByZWRlY2Vzc29ycywgd2Ugd2lsbAorICAvLyBlbmQgdXAgaW5jcmVhc2luZyBjb2RlIHNpemUuICBSZWplY3QgdGhpcyBieSBzY2FubmluZyBmb3IgTEkuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYWx1ZXNQZXJCbG9jay5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKFZhbHVlc1BlckJsb2NrW2ldLmlzU2ltcGxlVmFsdWUoKSAmJgorICAgICAgICBWYWx1ZXNQZXJCbG9ja1tpXS5nZXRTaW1wbGVWYWx1ZSgpID09IExJKSB7CisgICAgICAvLyBTa2lwIGNhc2VzIHdoZXJlIExJIGlzIHRoZSBvbmx5IGRlZmluaXRpb24sIGV2ZW4gZm9yIEVuYWJsZUZ1bGxMb2FkUFJFLgorICAgICAgaWYgKCFFbmFibGVGdWxsTG9hZFBSRSB8fCBlID09IDEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBGSVhNRTogSXQgaXMgZXh0cmVtZWx5IHVuY2xlYXIgd2hhdCB0aGlzIGxvb3AgaXMgZG9pbmcsIG90aGVyIHRoYW4KKyAgLy8gYXJ0aWZpY2lhbGx5IHJlc3RyaWN0aW5nIGxvYWRwcmUuCisgIGlmIChpc1NpbmdsZVByZWQpIHsKKyAgICBib29sIGlzSG90ID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHVlc1BlckJsb2NrLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IEF2YWlsYWJsZVZhbHVlSW5CbG9jayAmQVYgPSBWYWx1ZXNQZXJCbG9ja1tpXTsKKyAgICAgIGlmIChBVi5pc1NpbXBsZVZhbHVlKCkpCisgICAgICAgIC8vICJIb3QiIEluc3RydWN0aW9uIGlzIGluIHNvbWUgbG9vcCAoYmVjYXVzZSBpdCBkb21pbmF0ZXMgaXRzIGRlcC4KKyAgICAgICAgLy8gaW5zdHJ1Y3Rpb24pLgorICAgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oQVYuZ2V0U2ltcGxlVmFsdWUoKSkpCisgICAgICAgICAgaWYgKERULT5kb21pbmF0ZXMoTEksIEkpKSB7CisgICAgICAgICAgICBpc0hvdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgYXJlIGludGVyZXN0ZWQgb25seSBpbiAiaG90IiBpbnN0cnVjdGlvbnMuIFdlIGRvbid0IHdhbnQgdG8gZG8gYW55CisgICAgLy8gbWlzLW9wdGltaXphdGlvbnMgaGVyZS4KKyAgICBpZiAoIWlzSG90KQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGhvdyBtYW55IHByZWRlY2Vzc29ycyBoYXZlIHRoZSBsb2FkZWQgdmFsdWUgZnVsbHkKKyAgLy8gYXZhaWxhYmxlLgorICBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgVmFsdWUqPiBQcmVkTG9hZHM7CisgIERlbnNlTWFwPEJhc2ljQmxvY2sqLCBjaGFyPiBGdWxseUF2YWlsYWJsZUJsb2NrczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHVlc1BlckJsb2NrLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgRnVsbHlBdmFpbGFibGVCbG9ja3NbVmFsdWVzUGVyQmxvY2tbaV0uQkJdID0gdHJ1ZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFVuYXZhaWxhYmxlQmxvY2tzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgRnVsbHlBdmFpbGFibGVCbG9ja3NbVW5hdmFpbGFibGVCbG9ja3NbaV1dID0gZmFsc2U7CisKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPFRlcm1pbmF0b3JJbnN0KiwgdW5zaWduZWQ+LCA0PiBOZWVkVG9TcGxpdDsKKyAgZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihMb2FkQkIpLCBFID0gcHJlZF9lbmQoTG9hZEJCKTsKKyAgICAgICBQSSAhPSBFOyArK1BJKSB7CisgICAgQmFzaWNCbG9jayAqUHJlZCA9ICpQSTsKKyAgICBpZiAoSXNWYWx1ZUZ1bGx5QXZhaWxhYmxlSW5CbG9jayhQcmVkLCBGdWxseUF2YWlsYWJsZUJsb2NrcykpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBQcmVkTG9hZHNbUHJlZF0gPSAwOworCisgICAgaWYgKFByZWQtPmdldFRlcm1pbmF0b3IoKS0+Z2V0TnVtU3VjY2Vzc29ycygpICE9IDEpIHsKKyAgICAgIGlmIChpc2E8SW5kaXJlY3RCckluc3Q+KFByZWQtPmdldFRlcm1pbmF0b3IoKSkpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJDT1VMRCBOT1QgUFJFIExPQUQgQkVDQVVTRSBPRiBJTkRCUiBDUklUSUNBTCBFREdFICciCisgICAgICAgICAgICAgIDw8IFByZWQtPmdldE5hbWUoKSA8PCAiJzogIiA8PCAqTEkgPDwgJ1xuJyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHVuc2lnbmVkIFN1Y2NOdW0gPSBHZXRTdWNjZXNzb3JOdW1iZXIoUHJlZCwgTG9hZEJCKTsKKyAgICAgIE5lZWRUb1NwbGl0LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihQcmVkLT5nZXRUZXJtaW5hdG9yKCksIFN1Y2NOdW0pKTsKKyAgICB9CisgIH0KKyAgaWYgKCFOZWVkVG9TcGxpdC5lbXB0eSgpKSB7CisgICAgdG9TcGxpdC5hcHBlbmQoTmVlZFRvU3BsaXQuYmVnaW4oKSwgTmVlZFRvU3BsaXQuZW5kKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIERlY2lkZSB3aGV0aGVyIFBSRSBpcyBwcm9maXRhYmxlIGZvciB0aGlzIGxvYWQuCisgIHVuc2lnbmVkIE51bVVuYXZhaWxhYmxlUHJlZHMgPSBQcmVkTG9hZHMuc2l6ZSgpOworICBhc3NlcnQoTnVtVW5hdmFpbGFibGVQcmVkcyAhPSAwICYmCisgICAgICAgICAiRnVsbHkgYXZhaWxhYmxlIHZhbHVlIHNob3VsZCBiZSBlbGltaW5hdGVkIGFib3ZlISIpOworICBpZiAoIUVuYWJsZUZ1bGxMb2FkUFJFKSB7CisgICAgLy8gSWYgdGhpcyBsb2FkIGlzIHVuYXZhaWxhYmxlIGluIG11bHRpcGxlIHByZWRlY2Vzc29ycywgcmVqZWN0IGl0LgorICAgIC8vIEZJWE1FOiBJZiB3ZSBjb3VsZCByZXN0cnVjdHVyZSB0aGUgQ0ZHLCB3ZSBjb3VsZCBtYWtlIGEgY29tbW9uIHByZWQgd2l0aAorICAgIC8vIGFsbCB0aGUgcHJlZHMgdGhhdCBkb24ndCBoYXZlIGFuIGF2YWlsYWJsZSBMSSBhbmQgaW5zZXJ0IGEgbmV3IGxvYWQgaW50bworICAgIC8vIHRoYXQgb25lIGJsb2NrLgorICAgIGlmIChOdW1VbmF2YWlsYWJsZVByZWRzICE9IDEpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBDaGVjayBpZiB0aGUgbG9hZCBjYW4gc2FmZWx5IGJlIG1vdmVkIHRvIGFsbCB0aGUgdW5hdmFpbGFibGUgcHJlZGVjZXNzb3JzLgorICBib29sIENhbkRvUFJFID0gdHJ1ZTsKKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24qLCA4PiBOZXdJbnN0czsKKyAgZm9yIChEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgVmFsdWUqPjo6aXRlcmF0b3IgSSA9IFByZWRMb2Fkcy5iZWdpbigpLAorICAgICAgICAgRSA9IFByZWRMb2Fkcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBCYXNpY0Jsb2NrICpVbmF2YWlsYWJsZVByZWQgPSBJLT5maXJzdDsKKworICAgIC8vIERvIFBISSB0cmFuc2xhdGlvbiB0byBnZXQgaXRzIHZhbHVlIGluIHRoZSBwcmVkZWNlc3NvciBpZiBuZWNlc3NhcnkuICBUaGUKKyAgICAvLyByZXR1cm5lZCBwb2ludGVyIChpZiBub24tbnVsbCkgaXMgZ3VhcmFudGVlZCB0byBkb21pbmF0ZSBVbmF2YWlsYWJsZVByZWQuCisKKyAgICAvLyBJZiBhbGwgcHJlZHMgaGF2ZSBhIHNpbmdsZSBzdWNjZXNzb3IsIHRoZW4gd2Uga25vdyBpdCBpcyBzYWZlIHRvIGluc2VydAorICAgIC8vIHRoZSBsb2FkIG9uIHRoZSBwcmVkICg/IT8pLCBzbyB3ZSBjYW4gaW5zZXJ0IGNvZGUgdG8gbWF0ZXJpYWxpemUgdGhlCisgICAgLy8gcG9pbnRlciBpZiBpdCBpcyBub3QgYXZhaWxhYmxlLgorICAgIFBISVRyYW5zQWRkciBBZGRyZXNzKExJLT5nZXRPcGVyYW5kKDApLCBURCk7CisgICAgVmFsdWUgKkxvYWRQdHIgPSAwOworICAgIGlmIChhbGxTaW5nbGVTdWNjKSB7CisgICAgICBMb2FkUHRyID0gQWRkcmVzcy5QSElUcmFuc2xhdGVXaXRoSW5zZXJ0aW9uKExvYWRCQiwgVW5hdmFpbGFibGVQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRFQsIE5ld0luc3RzKTsKKyAgICB9IGVsc2UgeworICAgICAgQWRkcmVzcy5QSElUcmFuc2xhdGVWYWx1ZShMb2FkQkIsIFVuYXZhaWxhYmxlUHJlZCwgRFQpOworICAgICAgTG9hZFB0ciA9IEFkZHJlc3MuZ2V0QWRkcigpOworICAgIH0KKworICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgb3IgaW5zZXJ0IGEgY29tcHV0YXRpb24gb2YgdGhpcyBwaGkgdHJhbnNsYXRlZCB2YWx1ZSwKKyAgICAvLyB3ZSBmYWlsIFBSRS4KKyAgICBpZiAoTG9hZFB0ciA9PSAwKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkNPVUxETidUIElOU0VSVCBQSEkgVFJBTlNMQVRFRCBWQUxVRSBPRjogIgorICAgICAgICAgICAgPDwgKkxJLT5nZXRPcGVyYW5kKDApIDw8ICJcbiIpOworICAgICAgQ2FuRG9QUkUgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSBpdCBpcyB2YWxpZCB0byBtb3ZlIHRoaXMgbG9hZCBoZXJlLiAgV2UgaGF2ZSB0byB3YXRjaCBvdXQgZm9yOgorICAgIC8vICBAMSA9IGdldGVsZW1lbnRwdHIgKGk4KiBwLCAuLi4KKyAgICAvLyAgdGVzdCBwIGFuZCBicmFuY2ggaWYgPT0gMAorICAgIC8vICBsb2FkIEAxCisgICAgLy8gSXQgaXMgdmFsaWQgdG8gaGF2ZSB0aGUgZ2V0ZWxlbWVudHB0ciBiZWZvcmUgdGhlIHRlc3QsIGV2ZW4gaWYgcCBjYW4gYmUgMCwKKyAgICAvLyBhcyBnZXRlbGVtZW50cHRyIG9ubHkgZG9lcyBhZGRyZXNzIGFyaXRobWV0aWMuCisgICAgLy8gSWYgd2UgYXJlIG5vdCBwdXNoaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGFueSBtdWx0aXBsZS1zdWNjZXNzb3IgYmxvY2tzCisgICAgLy8gd2UgZG8gbm90IGhhdmUgdGhpcyBjYXNlLiAgT3RoZXJ3aXNlLCBjaGVjayB0aGF0IHRoZSBsb2FkIGlzIHNhZmUgdG8KKyAgICAvLyBwdXQgYW55d2hlcmU7IHRoaXMgY2FuIGJlIGltcHJvdmVkLCBidXQgc2hvdWxkIGJlIGNvbnNlcnZhdGl2ZWx5IHNhZmUuCisgICAgaWYgKCFhbGxTaW5nbGVTdWNjICYmCisgICAgICAgIC8vIEZJWE1FOiBSRUVWQUxVVEUgVEhJUy4KKyAgICAgICAgIWlzU2FmZVRvTG9hZFVuY29uZGl0aW9uYWxseShMb2FkUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuYXZhaWxhYmxlUHJlZC0+Z2V0VGVybWluYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJLT5nZXRBbGlnbm1lbnQoKSwgVEQpKSB7CisgICAgICBDYW5Eb1BSRSA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgSS0+c2Vjb25kID0gTG9hZFB0cjsKKyAgfQorCisgIGlmICghQ2FuRG9QUkUpIHsKKyAgICB3aGlsZSAoIU5ld0luc3RzLmVtcHR5KCkpCisgICAgICBOZXdJbnN0cy5wb3BfYmFja192YWwoKS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gT2theSwgd2UgY2FuIGVsaW1pbmF0ZSB0aGlzIGxvYWQgYnkgaW5zZXJ0aW5nIGEgcmVsb2FkIGluIHRoZSBwcmVkZWNlc3NvcgorICAvLyBhbmQgdXNpbmcgUEhJIGNvbnN0cnVjdGlvbiB0byBnZXQgdGhlIHZhbHVlIGluIHRoZSBvdGhlciBwcmVkZWNlc3NvcnMsIGRvCisgIC8vIGl0LgorICBERUJVRyhkYmdzKCkgPDwgIkdWTiBSRU1PVklORyBQUkUgTE9BRDogIiA8PCAqTEkgPDwgJ1xuJyk7CisgIERFQlVHKGlmICghTmV3SW5zdHMuZW1wdHkoKSkKKyAgICAgICAgICBkYmdzKCkgPDwgIklOU0VSVEVEICIgPDwgTmV3SW5zdHMuc2l6ZSgpIDw8ICIgSU5TVFM6ICIKKyAgICAgICAgICAgICAgICAgPDwgKk5ld0luc3RzLmJhY2soKSA8PCAnXG4nKTsKKyAgCisgIC8vIEFzc2lnbiB2YWx1ZSBudW1iZXJzIHRvIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3SW5zdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIC8vIEZJWE1FOiBXZSByZWFsbHkgX291Z2h0XyB0byBpbnNlcnQgdGhlc2UgdmFsdWUgbnVtYmVycyBpbnRvIHRoZWlyIAorICAgIC8vIHBhcmVudCdzIGF2YWlsYWJpbGl0eSBtYXAuICBIb3dldmVyLCBpbiBkb2luZyBzbywgd2UgcmlzayBnZXR0aW5nIGludG8KKyAgICAvLyBvcmRlcmluZyBpc3N1ZXMuICBJZiBhIGJsb2NrIGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQsIHdlIHdvdWxkIGJlCisgICAgLy8gbWFya2luZyBhIHZhbHVlIGFzIEFWQUlMLUlOLCB3aGljaCBpc24ndCB3aGF0IHdlIGludGVuZC4KKyAgICBWTi5sb29rdXBfb3JfYWRkKE5ld0luc3RzW2ldKTsKKyAgfQorCisgIGZvciAoRGVuc2VNYXA8QmFzaWNCbG9jayosIFZhbHVlKj46Oml0ZXJhdG9yIEkgPSBQcmVkTG9hZHMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBQcmVkTG9hZHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgQmFzaWNCbG9jayAqVW5hdmFpbGFibGVQcmVkID0gSS0+Zmlyc3Q7CisgICAgVmFsdWUgKkxvYWRQdHIgPSBJLT5zZWNvbmQ7CisKKyAgICBWYWx1ZSAqTmV3TG9hZCA9IG5ldyBMb2FkSW5zdChMb2FkUHRyLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSS0+Z2V0QWxpZ25tZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hdmFpbGFibGVQcmVkLT5nZXRUZXJtaW5hdG9yKCkpOworCisgICAgLy8gQWRkIHRoZSBuZXdseSBjcmVhdGVkIGxvYWQuCisgICAgVmFsdWVzUGVyQmxvY2sucHVzaF9iYWNrKEF2YWlsYWJsZVZhbHVlSW5CbG9jazo6Z2V0KFVuYXZhaWxhYmxlUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3TG9hZCkpOworICAgIE1ELT5pbnZhbGlkYXRlQ2FjaGVkUG9pbnRlckluZm8oTG9hZFB0cik7CisgICAgREVCVUcoZGJncygpIDw8ICJHVk4gSU5TRVJURUQgIiA8PCAqTmV3TG9hZCA8PCAnXG4nKTsKKyAgfQorCisgIC8vIFBlcmZvcm0gUEhJIGNvbnN0cnVjdGlvbi4KKyAgVmFsdWUgKlYgPSBDb25zdHJ1Y3RTU0FGb3JMb2FkU2V0KExJLCBWYWx1ZXNQZXJCbG9jaywgVEQsICpEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOLmdldEFsaWFzQW5hbHlzaXMoKSk7CisgIExJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVik7CisgIGlmIChpc2E8UEhJTm9kZT4oVikpCisgICAgVi0+dGFrZU5hbWUoTEkpOworICBpZiAoVi0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgIE1ELT5pbnZhbGlkYXRlQ2FjaGVkUG9pbnRlckluZm8oVik7CisgIFZOLmVyYXNlKExJKTsKKyAgdG9FcmFzZS5wdXNoX2JhY2soTEkpOworICArK051bVBSRUxvYWQ7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gcHJvY2Vzc0xvYWQgLSBBdHRlbXB0IHRvIGVsaW1pbmF0ZSBhIGxvYWQsIGZpcnN0IGJ5IGVsaW1pbmF0aW5nIGl0CisvLy8gbG9jYWxseSwgYW5kIHRoZW4gYXR0ZW1wdGluZyBub24tbG9jYWwgZWxpbWluYXRpb24gaWYgdGhhdCBmYWlscy4KK2Jvb2wgR1ZOOjpwcm9jZXNzTG9hZChMb2FkSW5zdCAqTCwgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uKj4gJnRvRXJhc2UpIHsKKyAgaWYgKCFNRCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKEwtPmlzVm9sYXRpbGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gLi4uIHRvIGEgcG9pbnRlciB0aGF0IGhhcyBiZWVuIGxvYWRlZCBmcm9tIGJlZm9yZS4uLgorICBNZW1EZXBSZXN1bHQgRGVwID0gTUQtPmdldERlcGVuZGVuY3koTCk7CisKKyAgLy8gSWYgdGhlIHZhbHVlIGlzbid0IGF2YWlsYWJsZSwgZG9uJ3QgZG8gYW55dGhpbmchCisgIGlmIChEZXAuaXNDbG9iYmVyKCkpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSB0aGlzOgorICAgIC8vICAgc3RvcmUgaTMyIDEyMywgaTMyKiAlUAorICAgIC8vICAgJUEgPSBiaXRjYXN0IGkzMiogJVAgdG8gaTgqCisgICAgLy8gICAlQiA9IGdlcCBpOCogJUEsIGkzMiAxCisgICAgLy8gICAlQyA9IGxvYWQgaTgqICVCCisgICAgLy8KKyAgICAvLyBXZSBjb3VsZCBkbyB0aGF0IGJ5IHJlY29nbml6aW5nIGlmIHRoZSBjbG9iYmVyIGluc3RydWN0aW9ucyBhcmUgb2J2aW91c2x5CisgICAgLy8gYSBjb21tb24gYmFzZSArIGNvbnN0YW50IG9mZnNldCwgYW5kIGlmIHRoZSBwcmV2aW91cyBzdG9yZSAob3IgbWVtc2V0KQorICAgIC8vIGNvbXBsZXRlbHkgY292ZXJzIHRoaXMgbG9hZC4gIFRoaXMgc29ydCBvZiB0aGluZyBjYW4gaGFwcGVuIGluIGJpdGZpZWxkCisgICAgLy8gYWNjZXNzIGNvZGUuCisgICAgVmFsdWUgKkF2YWlsVmFsID0gMDsKKyAgICBpZiAoU3RvcmVJbnN0ICpEZXBTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oRGVwLmdldEluc3QoKSkpCisgICAgICBpZiAoY29uc3QgVGFyZ2V0RGF0YSAqVEQgPSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFRhcmdldERhdGE+KCkpIHsKKyAgICAgICAgaW50IE9mZnNldCA9IEFuYWx5emVMb2FkRnJvbUNsb2JiZXJpbmdTdG9yZShMLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTC0+Z2V0UG9pbnRlck9wZXJhbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBTSSwgKlREKTsKKyAgICAgICAgaWYgKE9mZnNldCAhPSAtMSkKKyAgICAgICAgICBBdmFpbFZhbCA9IEdldFN0b3JlVmFsdWVGb3JMb2FkKERlcFNJLT5nZXRPcGVyYW5kKDApLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMLT5nZXRUeXBlKCksIEwsICpURCk7CisgICAgICB9CisgICAgCisgICAgLy8gSWYgdGhlIGNsb2JiZXJpbmcgdmFsdWUgaXMgYSBtZW1zZXQvbWVtY3B5L21lbW1vdmUsIHNlZSBpZiB3ZSBjYW4gZm9yd2FyZAorICAgIC8vIGEgdmFsdWUgb24gZnJvbSBpdC4KKyAgICBpZiAoTWVtSW50cmluc2ljICpEZXBNSSA9IGR5bl9jYXN0PE1lbUludHJpbnNpYz4oRGVwLmdldEluc3QoKSkpIHsKKyAgICAgIGlmIChjb25zdCBUYXJnZXREYXRhICpURCA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8VGFyZ2V0RGF0YT4oKSkgeworICAgICAgICBpbnQgT2Zmc2V0ID0gQW5hbHl6ZUxvYWRGcm9tQ2xvYmJlcmluZ01lbUluc3QoTC0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTC0+Z2V0UG9pbnRlck9wZXJhbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcE1JLCAqVEQpOworICAgICAgICBpZiAoT2Zmc2V0ICE9IC0xKQorICAgICAgICAgIEF2YWlsVmFsID0gR2V0TWVtSW5zdFZhbHVlRm9yTG9hZChEZXBNSSwgT2Zmc2V0LCBMLT5nZXRUeXBlKCksIEwsKlREKTsKKyAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIGlmIChBdmFpbFZhbCkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJHVk4gQ09FUkNFRCBJTlNUOlxuIiA8PCAqRGVwLmdldEluc3QoKSA8PCAnXG4nCisgICAgICAgICAgICA8PCAqQXZhaWxWYWwgPDwgJ1xuJyA8PCAqTCA8PCAiXG5cblxuIik7CisgICAgICAKKyAgICAgIC8vIFJlcGxhY2UgdGhlIGxvYWQhCisgICAgICBMLT5yZXBsYWNlQWxsVXNlc1dpdGgoQXZhaWxWYWwpOworICAgICAgaWYgKEF2YWlsVmFsLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgICAgIE1ELT5pbnZhbGlkYXRlQ2FjaGVkUG9pbnRlckluZm8oQXZhaWxWYWwpOworICAgICAgVk4uZXJhc2UoTCk7CisgICAgICB0b0VyYXNlLnB1c2hfYmFjayhMKTsKKyAgICAgICsrTnVtR1ZOTG9hZDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAgICAgCisgICAgREVCVUcoCisgICAgICAvLyBmYXN0IHByaW50IGRlcCwgdXNpbmcgb3BlcmF0b3I8PCBvbiBpbnN0cnVjdGlvbiB3b3VsZCBiZSB0b28gc2xvdworICAgICAgZGJncygpIDw8ICJHVk46IGxvYWQgIjsKKyAgICAgIFdyaXRlQXNPcGVyYW5kKGRiZ3MoKSwgTCk7CisgICAgICBJbnN0cnVjdGlvbiAqSSA9IERlcC5nZXRJbnN0KCk7CisgICAgICBkYmdzKCkgPDwgIiBpcyBjbG9iYmVyZWQgYnkgIiA8PCAqSSA8PCAnXG4nOworICAgICk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYgaXQgaXMgZGVmaW5lZCBpbiBhbm90aGVyIGJsb2NrLCB0cnkgaGFyZGVyLgorICBpZiAoRGVwLmlzTm9uTG9jYWwoKSkKKyAgICByZXR1cm4gcHJvY2Vzc05vbkxvY2FsTG9hZChMLCB0b0VyYXNlKTsKKworICBJbnN0cnVjdGlvbiAqRGVwSW5zdCA9IERlcC5nZXRJbnN0KCk7CisgIGlmIChTdG9yZUluc3QgKkRlcFNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihEZXBJbnN0KSkgeworICAgIFZhbHVlICpTdG9yZWRWYWwgPSBEZXBTSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAKKyAgICAvLyBUaGUgc3RvcmUgYW5kIGxvYWQgYXJlIHRvIGEgbXVzdC1hbGlhc2VkIHBvaW50ZXIsIGJ1dCB0aGV5IG1heSBub3QKKyAgICAvLyBhY3R1YWxseSBoYXZlIHRoZSBzYW1lIHR5cGUuICBTZWUgaWYgd2Uga25vdyBob3cgdG8gcmV1c2UgdGhlIHN0b3JlZAorICAgIC8vIHZhbHVlIChkZXBlbmRpbmcgb24gaXRzIHR5cGUpLgorICAgIGNvbnN0IFRhcmdldERhdGEgKlREID0gMDsKKyAgICBpZiAoU3RvcmVkVmFsLT5nZXRUeXBlKCkgIT0gTC0+Z2V0VHlwZSgpKSB7CisgICAgICBpZiAoKFREID0gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxUYXJnZXREYXRhPigpKSkgeworICAgICAgICBTdG9yZWRWYWwgPSBDb2VyY2VBdmFpbGFibGVWYWx1ZVRvTG9hZFR5cGUoU3RvcmVkVmFsLCBMLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMLCAqVEQpOworICAgICAgICBpZiAoU3RvcmVkVmFsID09IDApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJHVk4gQ09FUkNFRCBTVE9SRTpcbiIgPDwgKkRlcFNJIDw8ICdcbicgPDwgKlN0b3JlZFZhbAorICAgICAgICAgICAgICAgICAgICAgPDwgJ1xuJyA8PCAqTCA8PCAiXG5cblxuIik7CisgICAgICB9CisgICAgICBlbHNlIAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIGl0IQorICAgIEwtPnJlcGxhY2VBbGxVc2VzV2l0aChTdG9yZWRWYWwpOworICAgIGlmIChTdG9yZWRWYWwtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgIE1ELT5pbnZhbGlkYXRlQ2FjaGVkUG9pbnRlckluZm8oU3RvcmVkVmFsKTsKKyAgICBWTi5lcmFzZShMKTsKKyAgICB0b0VyYXNlLnB1c2hfYmFjayhMKTsKKyAgICArK051bUdWTkxvYWQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoTG9hZEluc3QgKkRlcExJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KERlcEluc3QpKSB7CisgICAgVmFsdWUgKkF2YWlsYWJsZVZhbCA9IERlcExJOworICAgIAorICAgIC8vIFRoZSBsb2FkcyBhcmUgb2YgYSBtdXN0LWFsaWFzZWQgcG9pbnRlciwgYnV0IHRoZXkgbWF5IG5vdCBhY3R1YWxseSBoYXZlCisgICAgLy8gdGhlIHNhbWUgdHlwZS4gIFNlZSBpZiB3ZSBrbm93IGhvdyB0byByZXVzZSB0aGUgcHJldmlvdXNseSBsb2FkZWQgdmFsdWUKKyAgICAvLyAoZGVwZW5kaW5nIG9uIGl0cyB0eXBlKS4KKyAgICBjb25zdCBUYXJnZXREYXRhICpURCA9IDA7CisgICAgaWYgKERlcExJLT5nZXRUeXBlKCkgIT0gTC0+Z2V0VHlwZSgpKSB7CisgICAgICBpZiAoKFREID0gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxUYXJnZXREYXRhPigpKSkgeworICAgICAgICBBdmFpbGFibGVWYWwgPSBDb2VyY2VBdmFpbGFibGVWYWx1ZVRvTG9hZFR5cGUoRGVwTEksIEwtPmdldFR5cGUoKSwgTCwqVEQpOworICAgICAgICBpZiAoQXZhaWxhYmxlVmFsID09IDApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiR1ZOIENPRVJDRUQgTE9BRDpcbiIgPDwgKkRlcExJIDw8ICJcbiIgPDwgKkF2YWlsYWJsZVZhbAorICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCAqTCA8PCAiXG5cblxuIik7CisgICAgICB9CisgICAgICBlbHNlIAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8vIFJlbW92ZSBpdCEKKyAgICBMLT5yZXBsYWNlQWxsVXNlc1dpdGgoQXZhaWxhYmxlVmFsKTsKKyAgICBpZiAoRGVwTEktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgIE1ELT5pbnZhbGlkYXRlQ2FjaGVkUG9pbnRlckluZm8oRGVwTEkpOworICAgIFZOLmVyYXNlKEwpOworICAgIHRvRXJhc2UucHVzaF9iYWNrKEwpOworICAgICsrTnVtR1ZOTG9hZDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIElmIHRoaXMgbG9hZCByZWFsbHkgZG9lc24ndCBkZXBlbmQgb24gYW55dGhpbmcsIHRoZW4gd2UgbXVzdCBiZSBsb2FkaW5nIGFuCisgIC8vIHVuZGVmIHZhbHVlLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gbG9hZGluZyBmb3IgYSBmcmVzaCBhbGxvY2F0aW9uIHdpdGggbm8KKyAgLy8gaW50ZXJ2ZW5pbmcgc3RvcmVzLCBmb3IgZXhhbXBsZS4KKyAgaWYgKGlzYTxBbGxvY2FJbnN0PihEZXBJbnN0KSkgeworICAgIEwtPnJlcGxhY2VBbGxVc2VzV2l0aChVbmRlZlZhbHVlOjpnZXQoTC0+Z2V0VHlwZSgpKSk7CisgICAgVk4uZXJhc2UoTCk7CisgICAgdG9FcmFzZS5wdXNoX2JhY2soTCk7CisgICAgKytOdW1HVk5Mb2FkOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICAvLyBJZiB0aGlzIGxvYWQgb2NjdXJzIGVpdGhlciByaWdodCBhZnRlciBhIGxpZmV0aW1lIGJlZ2luLAorICAvLyB0aGVuIHRoZSBsb2FkZWQgdmFsdWUgaXMgdW5kZWZpbmVkLgorICBpZiAoSW50cmluc2ljSW5zdCogSUkgPSBkeW5fY2FzdDxJbnRyaW5zaWNJbnN0PihEZXBJbnN0KSkgeworICAgIGlmIChJSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6OmxpZmV0aW1lX3N0YXJ0KSB7CisgICAgICBMLT5yZXBsYWNlQWxsVXNlc1dpdGgoVW5kZWZWYWx1ZTo6Z2V0KEwtPmdldFR5cGUoKSkpOworICAgICAgVk4uZXJhc2UoTCk7CisgICAgICB0b0VyYXNlLnB1c2hfYmFjayhMKTsKKyAgICAgICsrTnVtR1ZOTG9hZDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworVmFsdWUgKkdWTjo6bG9va3VwTnVtYmVyKEJhc2ljQmxvY2sgKkJCLCB1aW50MzJfdCBudW0pIHsKKyAgRGVuc2VNYXA8QmFzaWNCbG9jayosIFZhbHVlTnVtYmVyU2NvcGUqPjo6aXRlcmF0b3IgSSA9IGxvY2FsQXZhaWwuZmluZChCQik7CisgIGlmIChJID09IGxvY2FsQXZhaWwuZW5kKCkpCisgICAgcmV0dXJuIDA7CisKKyAgVmFsdWVOdW1iZXJTY29wZSAqTG9jYWxzID0gSS0+c2Vjb25kOworICB3aGlsZSAoTG9jYWxzKSB7CisgICAgRGVuc2VNYXA8dWludDMyX3QsIFZhbHVlKj46Oml0ZXJhdG9yIEkgPSBMb2NhbHMtPnRhYmxlLmZpbmQobnVtKTsKKyAgICBpZiAoSSAhPSBMb2NhbHMtPnRhYmxlLmVuZCgpKQorICAgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgICBMb2NhbHMgPSBMb2NhbHMtPnBhcmVudDsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKKy8vLyBwcm9jZXNzSW5zdHJ1Y3Rpb24gLSBXaGVuIGNhbGN1bGF0aW5nIGF2YWlsYWJpbGl0eSwgaGFuZGxlIGFuIGluc3RydWN0aW9uCisvLy8gYnkgaW5zZXJ0aW5nIGl0IGludG8gdGhlIGFwcHJvcHJpYXRlIHNldHMKK2Jvb2wgR1ZOOjpwcm9jZXNzSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbio+ICZ0b0VyYXNlKSB7CisgIC8vIElnbm9yZSBkYmcgaW5mbyBpbnRyaW5zaWNzLgorICBpZiAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KEkpKSB7CisgICAgYm9vbCBDaGFuZ2VkID0gcHJvY2Vzc0xvYWQoTEksIHRvRXJhc2UpOworCisgICAgaWYgKCFDaGFuZ2VkKSB7CisgICAgICB1bnNpZ25lZCBOdW0gPSBWTi5sb29rdXBfb3JfYWRkKExJKTsKKyAgICAgIGxvY2FsQXZhaWxbSS0+Z2V0UGFyZW50KCldLT50YWJsZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTnVtLCBMSSkpOworICAgIH0KKworICAgIHJldHVybiBDaGFuZ2VkOworICB9CisKKyAgdWludDMyX3QgTmV4dE51bSA9IFZOLmdldE5leHRVbnVzZWRWYWx1ZU51bWJlcigpOworICB1bnNpZ25lZCBOdW0gPSBWTi5sb29rdXBfb3JfYWRkKEkpOworCisgIGlmIChCcmFuY2hJbnN0ICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KEkpKSB7CisgICAgbG9jYWxBdmFpbFtJLT5nZXRQYXJlbnQoKV0tPnRhYmxlLmluc2VydChzdGQ6Om1ha2VfcGFpcihOdW0sIEkpKTsKKworICAgIGlmICghQkktPmlzQ29uZGl0aW9uYWwoKSB8fCBpc2E8Q29uc3RhbnQ+KEJJLT5nZXRDb25kaXRpb24oKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBWYWx1ZSAqQnJhbmNoQ29uZCA9IEJJLT5nZXRDb25kaXRpb24oKTsKKyAgICB1aW50MzJfdCBDb25kVk4gPSBWTi5sb29rdXBfb3JfYWRkKEJyYW5jaENvbmQpOworCisgICAgQmFzaWNCbG9jayAqVHJ1ZVN1Y2MgPSBCSS0+Z2V0U3VjY2Vzc29yKDApOworICAgIEJhc2ljQmxvY2sgKkZhbHNlU3VjYyA9IEJJLT5nZXRTdWNjZXNzb3IoMSk7CisKKyAgICBpZiAoVHJ1ZVN1Y2MtPmdldFNpbmdsZVByZWRlY2Vzc29yKCkpCisgICAgICBsb2NhbEF2YWlsW1RydWVTdWNjXS0+dGFibGVbQ29uZFZOXSA9CisgICAgICAgIENvbnN0YW50SW50OjpnZXRUcnVlKFRydWVTdWNjLT5nZXRDb250ZXh0KCkpOworICAgIGlmIChGYWxzZVN1Y2MtPmdldFNpbmdsZVByZWRlY2Vzc29yKCkpCisgICAgICBsb2NhbEF2YWlsW0ZhbHNlU3VjY10tPnRhYmxlW0NvbmRWTl0gPQorICAgICAgICBDb25zdGFudEludDo6Z2V0RmFsc2UoVHJ1ZVN1Y2MtPmdldENvbnRleHQoKSk7CisKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQWxsb2NhdGlvbnMgYXJlIGFsd2F5cyB1bmlxdWVseSBudW1iZXJlZCwgc28gd2UgY2FuIHNhdmUgdGltZSBhbmQgbWVtb3J5CisgIC8vIGJ5IGZhc3QgZmFpbGluZyB0aGVtLgorICB9IGVsc2UgaWYgKGlzYTxBbGxvY2FJbnN0PihJKSB8fCBpc2E8VGVybWluYXRvckluc3Q+KEkpKSB7CisgICAgbG9jYWxBdmFpbFtJLT5nZXRQYXJlbnQoKV0tPnRhYmxlLmluc2VydChzdGQ6Om1ha2VfcGFpcihOdW0sIEkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBDb2xsYXBzZSBQSEkgbm9kZXMKKyAgaWYgKFBISU5vZGUqIHAgPSBkeW5fY2FzdDxQSElOb2RlPihJKSkgeworICAgIFZhbHVlICpjb25zdFZhbCA9IENvbGxhcHNlUGhpKHApOworCisgICAgaWYgKGNvbnN0VmFsKSB7CisgICAgICBwLT5yZXBsYWNlQWxsVXNlc1dpdGgoY29uc3RWYWwpOworICAgICAgaWYgKE1EICYmIGNvbnN0VmFsLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgICAgIE1ELT5pbnZhbGlkYXRlQ2FjaGVkUG9pbnRlckluZm8oY29uc3RWYWwpOworICAgICAgVk4uZXJhc2UocCk7CisKKyAgICAgIHRvRXJhc2UucHVzaF9iYWNrKHApOworICAgIH0gZWxzZSB7CisgICAgICBsb2NhbEF2YWlsW0ktPmdldFBhcmVudCgpXS0+dGFibGUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE51bSwgSSkpOworICAgIH0KKworICAvLyBJZiB0aGUgbnVtYmVyIHdlIHdlcmUgYXNzaWduZWQgd2FzIGEgYnJhbmQgbmV3IFZOLCB0aGVuIHdlIGRvbid0CisgIC8vIG5lZWQgdG8gZG8gYSBsb29rdXAgdG8gc2VlIGlmIHRoZSBudW1iZXIgYWxyZWFkeSBleGlzdHMKKyAgLy8gc29tZXdoZXJlIGluIHRoZSBkb210cmVlOiBpdCBjYW4ndCEKKyAgfSBlbHNlIGlmIChOdW0gPT0gTmV4dE51bSkgeworICAgIGxvY2FsQXZhaWxbSS0+Z2V0UGFyZW50KCldLT50YWJsZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTnVtLCBJKSk7CisKKyAgLy8gUGVyZm9ybSBmYXN0LXBhdGggdmFsdWUtbnVtYmVyIGJhc2VkIGVsaW1pbmF0aW9uIG9mIHZhbHVlcyBpbmhlcml0ZWQgZnJvbQorICAvLyBkb21pbmF0b3JzLgorICB9IGVsc2UgaWYgKFZhbHVlICpyZXBsID0gbG9va3VwTnVtYmVyKEktPmdldFBhcmVudCgpLCBOdW0pKSB7CisgICAgLy8gUmVtb3ZlIGl0IQorICAgIFZOLmVyYXNlKEkpOworICAgIEktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXBsKTsKKyAgICBpZiAoTUQgJiYgcmVwbC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgTUQtPmludmFsaWRhdGVDYWNoZWRQb2ludGVySW5mbyhyZXBsKTsKKyAgICB0b0VyYXNlLnB1c2hfYmFjayhJKTsKKyAgICByZXR1cm4gdHJ1ZTsKKworICB9IGVsc2UgeworICAgIGxvY2FsQXZhaWxbSS0+Z2V0UGFyZW50KCldLT50YWJsZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTnVtLCBJKSk7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBydW5PbkZ1bmN0aW9uIC0gVGhpcyBpcyB0aGUgbWFpbiB0cmFuc2Zvcm1hdGlvbiBlbnRyeSBwb2ludCBmb3IgYSBmdW5jdGlvbi4KK2Jvb2wgR1ZOOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uJiBGKSB7CisgIGlmICghTm9Mb2FkcykKKyAgICBNRCA9ICZnZXRBbmFseXNpczxNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM+KCk7CisgIERUID0gJmdldEFuYWx5c2lzPERvbWluYXRvclRyZWU+KCk7CisgIFZOLnNldEFsaWFzQW5hbHlzaXMoJmdldEFuYWx5c2lzPEFsaWFzQW5hbHlzaXM+KCkpOworICBWTi5zZXRNZW1EZXAoTUQpOworICBWTi5zZXREb21UcmVlKERUKTsKKworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgYm9vbCBTaG91bGRDb250aW51ZSA9IHRydWU7CisKKyAgLy8gTWVyZ2UgdW5jb25kaXRpb25hbCBicmFuY2hlcywgYWxsb3dpbmcgUFJFIHRvIGNhdGNoIG1vcmUKKyAgLy8gb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMuCisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEZJID0gRi5iZWdpbigpLCBGRSA9IEYuZW5kKCk7IEZJICE9IEZFOyApIHsKKyAgICBCYXNpY0Jsb2NrICpCQiA9IEZJOworICAgICsrRkk7CisgICAgYm9vbCByZW1vdmVkQmxvY2sgPSBNZXJnZUJsb2NrSW50b1ByZWRlY2Vzc29yKEJCLCB0aGlzKTsKKyAgICBpZiAocmVtb3ZlZEJsb2NrKSArK051bUdWTkJsb2NrczsKKworICAgIENoYW5nZWQgfD0gcmVtb3ZlZEJsb2NrOworICB9CisKKyAgdW5zaWduZWQgSXRlcmF0aW9uID0gMDsKKworICB3aGlsZSAoU2hvdWxkQ29udGludWUpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkdWTiBpdGVyYXRpb246ICIgPDwgSXRlcmF0aW9uIDw8ICJcbiIpOworICAgIFNob3VsZENvbnRpbnVlID0gaXRlcmF0ZU9uRnVuY3Rpb24oRik7CisgICAgaWYgKHNwbGl0Q3JpdGljYWxFZGdlcygpKQorICAgICAgU2hvdWxkQ29udGludWUgPSB0cnVlOworICAgIENoYW5nZWQgfD0gU2hvdWxkQ29udGludWU7CisgICAgKytJdGVyYXRpb247CisgIH0KKworICBpZiAoRW5hYmxlUFJFKSB7CisgICAgYm9vbCBQUkVDaGFuZ2VkID0gdHJ1ZTsKKyAgICB3aGlsZSAoUFJFQ2hhbmdlZCkgeworICAgICAgUFJFQ2hhbmdlZCA9IHBlcmZvcm1QUkUoRik7CisgICAgICBDaGFuZ2VkIHw9IFBSRUNoYW5nZWQ7CisgICAgfQorICB9CisgIC8vIEZJWE1FOiBTaG91bGQgcGVyZm9ybSBHVk4gYWdhaW4gYWZ0ZXIgUFJFIGRvZXMgc29tZXRoaW5nLiAgUFJFIGNhbiBtb3ZlCisgIC8vIGNvbXB1dGF0aW9ucyBpbnRvIGJsb2NrcyB3aGVyZSB0aGV5IGJlY29tZSBmdWxseSByZWR1bmRhbnQuICBOb3RlIHRoYXQKKyAgLy8gd2UgY2FuJ3QgZG8gdGhpcyB1bnRpbCBQUkUncyBjcml0aWNhbCBlZGdlIHNwbGl0dGluZyB1cGRhdGVzIG1lbWRlcC4KKyAgLy8gQWN0dWFsbHksIHdoZW4gdGhpcyBoYXBwZW5zLCB3ZSBzaG91bGQganVzdCBmdWxseSBpbnRlZ3JhdGUgUFJFIGludG8gR1ZOLgorCisgIGNsZWFudXBHbG9iYWxTZXRzKCk7CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKworYm9vbCBHVk46OnByb2Nlc3NCbG9jayhCYXNpY0Jsb2NrICpCQikgeworICAvLyBGSVhNRTogS2lsbCBvZmYgdG9FcmFzZSBieSBkb2luZyBlcmFzaW5nIGVhZ2VybHkgaW4gYSBoZWxwZXIgZnVuY3Rpb24gKGFuZAorICAvLyBpbmNyZW1lbnRpbmcgQkkgYmVmb3JlIHByb2Nlc3NpbmcgYW4gaW5zdHJ1Y3Rpb24pLgorICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiosIDg+IHRvRXJhc2U7CisgIGJvb2wgQ2hhbmdlZEZ1bmN0aW9uID0gZmFsc2U7CisKKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBCSSA9IEJCLT5iZWdpbigpLCBCRSA9IEJCLT5lbmQoKTsKKyAgICAgICBCSSAhPSBCRTspIHsKKyAgICBDaGFuZ2VkRnVuY3Rpb24gfD0gcHJvY2Vzc0luc3RydWN0aW9uKEJJLCB0b0VyYXNlKTsKKyAgICBpZiAodG9FcmFzZS5lbXB0eSgpKSB7CisgICAgICArK0JJOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgd2UgbmVlZCBzb21lIGluc3RydWN0aW9ucyBkZWxldGVkLCBkbyBpdCBub3cuCisgICAgTnVtR1ZOSW5zdHIgKz0gdG9FcmFzZS5zaXplKCk7CisKKyAgICAvLyBBdm9pZCBpdGVyYXRvciBpbnZhbGlkYXRpb24uCisgICAgYm9vbCBBdFN0YXJ0ID0gQkkgPT0gQkItPmJlZ2luKCk7CisgICAgaWYgKCFBdFN0YXJ0KQorICAgICAgLS1CSTsKKworICAgIGZvciAoU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24qLCA0Pjo6aXRlcmF0b3IgSSA9IHRvRXJhc2UuYmVnaW4oKSwKKyAgICAgICAgIEUgPSB0b0VyYXNlLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJHVk4gcmVtb3ZlZDogIiA8PCAqKkkgPDwgJ1xuJyk7CisgICAgICBpZiAoTUQpIE1ELT5yZW1vdmVJbnN0cnVjdGlvbigqSSk7CisgICAgICAoKkkpLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIERFQlVHKHZlcmlmeVJlbW92ZWQoKkkpKTsKKyAgICB9CisgICAgdG9FcmFzZS5jbGVhcigpOworCisgICAgaWYgKEF0U3RhcnQpCisgICAgICBCSSA9IEJCLT5iZWdpbigpOworICAgIGVsc2UKKyAgICAgICsrQkk7CisgIH0KKworICByZXR1cm4gQ2hhbmdlZEZ1bmN0aW9uOworfQorCisvLy8gcGVyZm9ybVBSRSAtIFBlcmZvcm0gYSBwdXJlbHkgbG9jYWwgZm9ybSBvZiBQUkUgdGhhdCBsb29rcyBmb3IgZGlhbW9uZAorLy8vIGNvbnRyb2wgZmxvdyBwYXR0ZXJucyBhbmQgYXR0ZW1wdHMgdG8gcGVyZm9ybSBzaW1wbGUgUFJFIGF0IHRoZSBqb2luIHBvaW50LgorYm9vbCBHVk46OnBlcmZvcm1QUkUoRnVuY3Rpb24gJkYpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIERlbnNlTWFwPEJhc2ljQmxvY2sqLCBWYWx1ZSo+IHByZWRNYXA7CisgIGZvciAoZGZfaXRlcmF0b3I8QmFzaWNCbG9jayo+IERJID0gZGZfYmVnaW4oJkYuZ2V0RW50cnlCbG9jaygpKSwKKyAgICAgICBERSA9IGRmX2VuZCgmRi5nZXRFbnRyeUJsb2NrKCkpOyBESSAhPSBERTsgKytESSkgeworICAgIEJhc2ljQmxvY2sgKkN1cnJlbnRCbG9jayA9ICpESTsKKworICAgIC8vIE5vdGhpbmcgdG8gUFJFIGluIHRoZSBlbnRyeSBibG9jay4KKyAgICBpZiAoQ3VycmVudEJsb2NrID09ICZGLmdldEVudHJ5QmxvY2soKSkgY29udGludWU7CisKKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJJID0gQ3VycmVudEJsb2NrLT5iZWdpbigpLAorICAgICAgICAgQkUgPSBDdXJyZW50QmxvY2stPmVuZCgpOyBCSSAhPSBCRTsgKSB7CisgICAgICBJbnN0cnVjdGlvbiAqQ3VySW5zdCA9IEJJKys7CisKKyAgICAgIGlmIChpc2E8QWxsb2NhSW5zdD4oQ3VySW5zdCkgfHwKKyAgICAgICAgICBpc2E8VGVybWluYXRvckluc3Q+KEN1ckluc3QpIHx8IGlzYTxQSElOb2RlPihDdXJJbnN0KSB8fAorICAgICAgICAgIEN1ckluc3QtPmdldFR5cGUoKS0+aXNWb2lkVHkoKSB8fAorICAgICAgICAgIEN1ckluc3QtPm1heVJlYWRGcm9tTWVtb3J5KCkgfHwgQ3VySW5zdC0+bWF5SGF2ZVNpZGVFZmZlY3RzKCkgfHwKKyAgICAgICAgICBJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoQ3VySW5zdCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBXZSBkb24ndCBjdXJyZW50bHkgdmFsdWUgbnVtYmVyIEFOWSBpbmxpbmUgYXNtIGNhbGxzLgorICAgICAgaWYgKENhbGxJbnN0ICpDYWxsSSA9IGR5bl9jYXN0PENhbGxJbnN0PihDdXJJbnN0KSkKKyAgICAgICAgaWYgKENhbGxJLT5pc0lubGluZUFzbSgpKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICB1aW50MzJfdCBWYWxObyA9IFZOLmxvb2t1cChDdXJJbnN0KTsKKworICAgICAgLy8gTG9vayBmb3IgdGhlIHByZWRlY2Vzc29ycyBmb3IgUFJFIG9wcG9ydHVuaXRpZXMuICBXZSdyZQorICAgICAgLy8gb25seSB0cnlpbmcgdG8gc29sdmUgdGhlIGJhc2ljIGRpYW1vbmQgY2FzZSwgd2hlcmUKKyAgICAgIC8vIGEgdmFsdWUgaXMgY29tcHV0ZWQgaW4gdGhlIHN1Y2Nlc3NvciBhbmQgb25lIHByZWRlY2Vzc29yLAorICAgICAgLy8gYnV0IG5vdCB0aGUgb3RoZXIuICBXZSBhbHNvIGV4cGxpY2l0bHkgZGlzYWxsb3cgY2FzZXMKKyAgICAgIC8vIHdoZXJlIHRoZSBzdWNjZXNzb3IgaXMgaXRzIG93biBwcmVkZWNlc3NvciwgYmVjYXVzZSB0aGV5J3JlCisgICAgICAvLyBtb3JlIGNvbXBsaWNhdGVkIHRvIGdldCByaWdodC4KKyAgICAgIHVuc2lnbmVkIE51bVdpdGggPSAwOworICAgICAgdW5zaWduZWQgTnVtV2l0aG91dCA9IDA7CisgICAgICBCYXNpY0Jsb2NrICpQUkVQcmVkID0gMDsKKyAgICAgIHByZWRNYXAuY2xlYXIoKTsKKworICAgICAgZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihDdXJyZW50QmxvY2spLAorICAgICAgICAgICBQRSA9IHByZWRfZW5kKEN1cnJlbnRCbG9jayk7IFBJICE9IFBFOyArK1BJKSB7CisgICAgICAgIEJhc2ljQmxvY2sgKlAgPSAqUEk7CisgICAgICAgIC8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIFBSRSB3aGVyZSB0aGUgYmxvY2sgaXMgaXRzCisgICAgICAgIC8vIG93biBwcmVkZWNlc3Nvciwgb3IgaW4gYmxvY2tzIHdpdGggcHJlZGVjZXNzb3JzCisgICAgICAgIC8vIHRoYXQgYXJlIG5vdCByZWFjaGFibGUuCisgICAgICAgIGlmIChQID09IEN1cnJlbnRCbG9jaykgeworICAgICAgICAgIE51bVdpdGhvdXQgPSAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKCFsb2NhbEF2YWlsLmNvdW50KFApKSAgeworICAgICAgICAgIE51bVdpdGhvdXQgPSAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgRGVuc2VNYXA8dWludDMyX3QsIFZhbHVlKj46Oml0ZXJhdG9yIHByZWRWID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxBdmFpbFtQXS0+dGFibGUuZmluZChWYWxObyk7CisgICAgICAgIGlmIChwcmVkViA9PSBsb2NhbEF2YWlsW1BdLT50YWJsZS5lbmQoKSkgeworICAgICAgICAgIFBSRVByZWQgPSBQOworICAgICAgICAgICsrTnVtV2l0aG91dDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVkVi0+c2Vjb25kID09IEN1ckluc3QpIHsKKyAgICAgICAgICBOdW1XaXRob3V0ID0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmVkTWFwW1BdID0gcHJlZFYtPnNlY29uZDsKKyAgICAgICAgICArK051bVdpdGg7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gRG9uJ3QgZG8gUFJFIHdoZW4gaXQgbWlnaHQgaW5jcmVhc2UgY29kZSBzaXplLCBpLmUuIHdoZW4KKyAgICAgIC8vIHdlIHdvdWxkIG5lZWQgdG8gaW5zZXJ0IGluc3RydWN0aW9ucyBpbiBtb3JlIHRoYW4gb25lIHByZWQuCisgICAgICBpZiAoTnVtV2l0aG91dCAhPSAxIHx8IE51bVdpdGggPT0gMCkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIERvbid0IGRvIFBSRSBhY3Jvc3MgaW5kaXJlY3QgYnJhbmNoLgorICAgICAgaWYgKGlzYTxJbmRpcmVjdEJySW5zdD4oUFJFUHJlZC0+Z2V0VGVybWluYXRvcigpKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFdlIGNhbid0IGRvIFBSRSBzYWZlbHkgb24gYSBjcml0aWNhbCBlZGdlLCBzbyBpbnN0ZWFkIHdlIHNjaGVkdWxlCisgICAgICAvLyB0aGUgZWRnZSB0byBiZSBzcGxpdCBhbmQgcGVyZm9ybSB0aGUgUFJFIHRoZSBuZXh0IHRpbWUgd2UgaXRlcmF0ZQorICAgICAgLy8gb24gdGhlIGZ1bmN0aW9uLgorICAgICAgdW5zaWduZWQgU3VjY051bSA9IEdldFN1Y2Nlc3Nvck51bWJlcihQUkVQcmVkLCBDdXJyZW50QmxvY2spOworICAgICAgaWYgKGlzQ3JpdGljYWxFZGdlKFBSRVByZWQtPmdldFRlcm1pbmF0b3IoKSwgU3VjY051bSkpIHsKKyAgICAgICAgdG9TcGxpdC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUFJFUHJlZC0+Z2V0VGVybWluYXRvcigpLCBTdWNjTnVtKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBJbnN0YW50aWF0ZSB0aGUgZXhwcmVzc2lvbiBpbiB0aGUgcHJlZGVjZXNzb3IgdGhhdCBsYWNrZWQgaXQuCisgICAgICAvLyBCZWNhdXNlIHdlIGFyZSBnb2luZyB0b3AtZG93biB0aHJvdWdoIHRoZSBibG9jaywgYWxsIHZhbHVlIG51bWJlcnMKKyAgICAgIC8vIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBwcmVkZWNlc3NvciBieSB0aGUgdGltZSB3ZSBuZWVkIHRoZW0uICBBbnkKKyAgICAgIC8vIHRoYXQgd2VyZW4ndCBvcmlnaW5hbGx5IHByZXNlbnQgd2lsbCBoYXZlIGJlZW4gaW5zdGFudGlhdGVkIGVhcmxpZXIKKyAgICAgIC8vIGluIHRoaXMgbG9vcC4KKyAgICAgIEluc3RydWN0aW9uICpQUkVJbnN0ciA9IEN1ckluc3QtPmNsb25lKCk7CisgICAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEN1ckluc3QtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFZhbHVlICpPcCA9IFBSRUluc3RyLT5nZXRPcGVyYW5kKGkpOworICAgICAgICBpZiAoaXNhPEFyZ3VtZW50PihPcCkgfHwgaXNhPENvbnN0YW50PihPcCkgfHwgaXNhPEdsb2JhbFZhbHVlPihPcCkpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKFZhbHVlICpWID0gbG9va3VwTnVtYmVyKFBSRVByZWQsIFZOLmxvb2t1cChPcCkpKSB7CisgICAgICAgICAgUFJFSW5zdHItPnNldE9wZXJhbmQoaSwgVik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEZhaWwgb3V0IGlmIHdlIGVuY291bnRlciBhbiBvcGVyYW5kIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbgorICAgICAgLy8gdGhlIFBSRSBwcmVkZWNlc3Nvci4gIFRoaXMgaXMgdHlwaWNhbGx5IGJlY2F1c2Ugb2YgbG9hZHMgd2hpY2gKKyAgICAgIC8vIGFyZSBub3QgdmFsdWUgbnVtYmVyZWQgcHJlY2lzZWx5LgorICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIGRlbGV0ZSBQUkVJbnN0cjsKKyAgICAgICAgREVCVUcodmVyaWZ5UmVtb3ZlZChQUkVJbnN0cikpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgUFJFSW5zdHItPmluc2VydEJlZm9yZShQUkVQcmVkLT5nZXRUZXJtaW5hdG9yKCkpOworICAgICAgUFJFSW5zdHItPnNldE5hbWUoQ3VySW5zdC0+Z2V0TmFtZSgpICsgIi5wcmUiKTsKKyAgICAgIHByZWRNYXBbUFJFUHJlZF0gPSBQUkVJbnN0cjsKKyAgICAgIFZOLmFkZChQUkVJbnN0ciwgVmFsTm8pOworICAgICAgKytOdW1HVk5QUkU7CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgYXZhaWxhYmlsaXR5IG1hcCB0byBpbmNsdWRlIHRoZSBuZXcgaW5zdHJ1Y3Rpb24uCisgICAgICBsb2NhbEF2YWlsW1BSRVByZWRdLT50YWJsZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoVmFsTm8sIFBSRUluc3RyKSk7CisKKyAgICAgIC8vIENyZWF0ZSBhIFBISSB0byBtYWtlIHRoZSB2YWx1ZSBhdmFpbGFibGUgaW4gdGhpcyBibG9jay4KKyAgICAgIFBISU5vZGUqIFBoaSA9IFBISU5vZGU6OkNyZWF0ZShDdXJJbnN0LT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudEJsb2NrLT5iZWdpbigpKTsKKyAgICAgIGZvciAocHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oQ3VycmVudEJsb2NrKSwKKyAgICAgICAgICAgUEUgPSBwcmVkX2VuZChDdXJyZW50QmxvY2spOyBQSSAhPSBQRTsgKytQSSkgeworICAgICAgICBCYXNpY0Jsb2NrICpQID0gKlBJOworICAgICAgICBQaGktPmFkZEluY29taW5nKHByZWRNYXBbUF0sIFApOworICAgICAgfQorCisgICAgICBWTi5hZGQoUGhpLCBWYWxObyk7CisgICAgICBsb2NhbEF2YWlsW0N1cnJlbnRCbG9ja10tPnRhYmxlW1ZhbE5vXSA9IFBoaTsKKworICAgICAgQ3VySW5zdC0+cmVwbGFjZUFsbFVzZXNXaXRoKFBoaSk7CisgICAgICBpZiAoTUQgJiYgUGhpLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgICAgIE1ELT5pbnZhbGlkYXRlQ2FjaGVkUG9pbnRlckluZm8oUGhpKTsKKyAgICAgIFZOLmVyYXNlKEN1ckluc3QpOworCisgICAgICBERUJVRyhkYmdzKCkgPDwgIkdWTiBQUkUgcmVtb3ZlZDogIiA8PCAqQ3VySW5zdCA8PCAnXG4nKTsKKyAgICAgIGlmIChNRCkgTUQtPnJlbW92ZUluc3RydWN0aW9uKEN1ckluc3QpOworICAgICAgQ3VySW5zdC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBERUJVRyh2ZXJpZnlSZW1vdmVkKEN1ckluc3QpKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChzcGxpdENyaXRpY2FsRWRnZXMoKSkKKyAgICBDaGFuZ2VkID0gdHJ1ZTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIHNwbGl0Q3JpdGljYWxFZGdlcyAtIFNwbGl0IGNyaXRpY2FsIGVkZ2VzIGZvdW5kIGR1cmluZyB0aGUgcHJldmlvdXMKKy8vLyBpdGVyYXRpb24gdGhhdCBtYXkgZW5hYmxlIGZ1cnRoZXIgb3B0aW1pemF0aW9uLgorYm9vbCBHVk46OnNwbGl0Q3JpdGljYWxFZGdlcygpIHsKKyAgaWYgKHRvU3BsaXQuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGRvIHsKKyAgICBzdGQ6OnBhaXI8VGVybWluYXRvckluc3QqLCB1bnNpZ25lZD4gRWRnZSA9IHRvU3BsaXQucG9wX2JhY2tfdmFsKCk7CisgICAgU3BsaXRDcml0aWNhbEVkZ2UoRWRnZS5maXJzdCwgRWRnZS5zZWNvbmQsIHRoaXMpOworICB9IHdoaWxlICghdG9TcGxpdC5lbXB0eSgpKTsKKyAgaWYgKE1EKSBNRC0+aW52YWxpZGF0ZUNhY2hlZFByZWRlY2Vzc29ycygpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGl0ZXJhdGVPbkZ1bmN0aW9uIC0gRXhlY3V0ZXMgb25lIGl0ZXJhdGlvbiBvZiBHVk4KK2Jvb2wgR1ZOOjppdGVyYXRlT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICBjbGVhbnVwR2xvYmFsU2V0cygpOworCisgIGZvciAoZGZfaXRlcmF0b3I8RG9tVHJlZU5vZGUqPiBESSA9IGRmX2JlZ2luKERULT5nZXRSb290Tm9kZSgpKSwKKyAgICAgICBERSA9IGRmX2VuZChEVC0+Z2V0Um9vdE5vZGUoKSk7IERJICE9IERFOyArK0RJKSB7CisgICAgaWYgKERJLT5nZXRJRG9tKCkpCisgICAgICBsb2NhbEF2YWlsW0RJLT5nZXRCbG9jaygpXSA9CisgICAgICAgICAgICAgICAgICAgbmV3IFZhbHVlTnVtYmVyU2NvcGUobG9jYWxBdmFpbFtESS0+Z2V0SURvbSgpLT5nZXRCbG9jaygpXSk7CisgICAgZWxzZQorICAgICAgbG9jYWxBdmFpbFtESS0+Z2V0QmxvY2soKV0gPSBuZXcgVmFsdWVOdW1iZXJTY29wZSgwKTsKKyAgfQorCisgIC8vIFRvcC1kb3duIHdhbGsgb2YgdGhlIGRvbWluYXRvciB0cmVlCisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworI2lmIDAKKyAgLy8gTmVlZGVkIGZvciB2YWx1ZSBudW1iZXJpbmcgd2l0aCBwaGkgY29uc3RydWN0aW9uIHRvIHdvcmsuCisgIFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWw8RnVuY3Rpb24qPiBSUE9UKCZGKTsKKyAgZm9yIChSZXZlcnNlUG9zdE9yZGVyVHJhdmVyc2FsPEZ1bmN0aW9uKj46OnJwb19pdGVyYXRvciBSSSA9IFJQT1QuYmVnaW4oKSwKKyAgICAgICBSRSA9IFJQT1QuZW5kKCk7IFJJICE9IFJFOyArK1JJKQorICAgIENoYW5nZWQgfD0gcHJvY2Vzc0Jsb2NrKCpSSSk7CisjZWxzZQorICBmb3IgKGRmX2l0ZXJhdG9yPERvbVRyZWVOb2RlKj4gREkgPSBkZl9iZWdpbihEVC0+Z2V0Um9vdE5vZGUoKSksCisgICAgICAgREUgPSBkZl9lbmQoRFQtPmdldFJvb3ROb2RlKCkpOyBESSAhPSBERTsgKytESSkKKyAgICBDaGFuZ2VkIHw9IHByb2Nlc3NCbG9jayhESS0+Z2V0QmxvY2soKSk7CisjZW5kaWYKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKwordm9pZCBHVk46OmNsZWFudXBHbG9iYWxTZXRzKCkgeworICBWTi5jbGVhcigpOworCisgIGZvciAoRGVuc2VNYXA8QmFzaWNCbG9jayosIFZhbHVlTnVtYmVyU2NvcGUqPjo6aXRlcmF0b3IKKyAgICAgICBJID0gbG9jYWxBdmFpbC5iZWdpbigpLCBFID0gbG9jYWxBdmFpbC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgZGVsZXRlIEktPnNlY29uZDsKKyAgbG9jYWxBdmFpbC5jbGVhcigpOworfQorCisvLy8gdmVyaWZ5UmVtb3ZlZCAtIFZlcmlmeSB0aGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gZG9lcyBub3Qgb2NjdXIgaW4gb3VyCisvLy8gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgordm9pZCBHVk46OnZlcmlmeVJlbW92ZWQoY29uc3QgSW5zdHJ1Y3Rpb24gKkluc3QpIGNvbnN0IHsKKyAgVk4udmVyaWZ5UmVtb3ZlZChJbnN0KTsKKworICAvLyBXYWxrIHRocm91Z2ggdGhlIHZhbHVlIG51bWJlciBzY29wZSB0byBtYWtlIHN1cmUgdGhlIGluc3RydWN0aW9uIGlzbid0CisgIC8vIGZlcnJldGVkIGF3YXkgaW4gaXQuCisgIGZvciAoRGVuc2VNYXA8QmFzaWNCbG9jayosIFZhbHVlTnVtYmVyU2NvcGUqPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIEkgPSBsb2NhbEF2YWlsLmJlZ2luKCksIEUgPSBsb2NhbEF2YWlsLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IFZhbHVlTnVtYmVyU2NvcGUgKlZOUyA9IEktPnNlY29uZDsKKworICAgIHdoaWxlIChWTlMpIHsKKyAgICAgIGZvciAoRGVuc2VNYXA8dWludDMyX3QsIFZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgSUkgPSBWTlMtPnRhYmxlLmJlZ2luKCksIElFID0gVk5TLT50YWJsZS5lbmQoKTsgSUkgIT0gSUU7ICsrSUkpIHsKKyAgICAgICAgYXNzZXJ0KElJLT5zZWNvbmQgIT0gSW5zdCAmJiAiSW5zdCBzdGlsbCBpbiB2YWx1ZSBudW1iZXJpbmcgc2NvcGUhIik7CisgICAgICB9CisKKyAgICAgIFZOUyA9IFZOUy0+cGFyZW50OworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL0xJQ00uY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL0xJQ00uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTVkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvTElDTS5jcHAKQEAgLTAsMCArMSw4ODEgQEAKKy8vPT09LS0gTElDTS5jcHAgLSBMb29wIEludmFyaWFudCBDb2RlIE1vdGlvbiBQYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHBlcmZvcm1zIGxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uLCBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhcyBtdWNoCisvLyBjb2RlIGZyb20gdGhlIGJvZHkgb2YgYSBsb29wIGFzIHBvc3NpYmxlLiAgSXQgZG9lcyB0aGlzIGJ5IGVpdGhlciBob2lzdGluZworLy8gY29kZSBpbnRvIHRoZSBwcmVoZWFkZXIgYmxvY2ssIG9yIGJ5IHNpbmtpbmcgY29kZSB0byB0aGUgZXhpdCBibG9ja3MgaWYgaXQgaXMKKy8vIHNhZmUuICBUaGlzIHBhc3MgYWxzbyBwcm9tb3RlcyBtdXN0LWFsaWFzZWQgbWVtb3J5IGxvY2F0aW9ucyBpbiB0aGUgbG9vcCB0bworLy8gbGl2ZSBpbiByZWdpc3RlcnMsIHRodXMgaG9pc3RpbmcgYW5kIHNpbmtpbmcgImludmFyaWFudCIgbG9hZHMgYW5kIHN0b3Jlcy4KKy8vCisvLyBUaGlzIHBhc3MgdXNlcyBhbGlhcyBhbmFseXNpcyBmb3IgdHdvIHB1cnBvc2VzOgorLy8KKy8vICAxLiBNb3ZpbmcgbG9vcCBpbnZhcmlhbnQgbG9hZHMgYW5kIGNhbGxzIG91dCBvZiBsb29wcy4gIElmIHdlIGNhbiBkZXRlcm1pbmUKKy8vICAgICB0aGF0IGEgbG9hZCBvciBjYWxsIGluc2lkZSBvZiBhIGxvb3AgbmV2ZXIgYWxpYXNlcyBhbnl0aGluZyBzdG9yZWQgdG8sCisvLyAgICAgd2UgY2FuIGhvaXN0IGl0IG9yIHNpbmsgaXQgbGlrZSBhbnkgb3RoZXIgaW5zdHJ1Y3Rpb24uCisvLyAgMi4gU2NhbGFyIFByb21vdGlvbiBvZiBNZW1vcnkgLSBJZiB0aGVyZSBpcyBhIHN0b3JlIGluc3RydWN0aW9uIGluc2lkZSBvZgorLy8gICAgIHRoZSBsb29wLCB3ZSB0cnkgdG8gbW92ZSB0aGUgc3RvcmUgdG8gaGFwcGVuIEFGVEVSIHRoZSBsb29wIGluc3RlYWQgb2YKKy8vICAgICBpbnNpZGUgb2YgdGhlIGxvb3AuICBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBhIGZldyBjb25kaXRpb25zIGFyZSB0cnVlOgorLy8gICAgICAgQS4gVGhlIHBvaW50ZXIgc3RvcmVkIHRocm91Z2ggaXMgbG9vcCBpbnZhcmlhbnQKKy8vICAgICAgIEIuIFRoZXJlIGFyZSBubyBzdG9yZXMgb3IgbG9hZHMgaW4gdGhlIGxvb3Agd2hpY2ggX21heV8gYWxpYXMgdGhlCisvLyAgICAgICAgICBwb2ludGVyLiAgVGhlcmUgYXJlIG5vIGNhbGxzIGluIHRoZSBsb29wIHdoaWNoIG1vZC9yZWYgdGhlIHBvaW50ZXIuCisvLyAgICAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgdHJ1ZSwgd2UgY2FuIHByb21vdGUgdGhlIGxvYWRzIGFuZCBzdG9yZXMgaW4gdGhlCisvLyAgICAgbG9vcCBvZiB0aGUgcG9pbnRlciB0byB1c2UgYSB0ZW1wb3JhcnkgYWxsb2NhJ2QgdmFyaWFibGUuICBXZSB0aGVuIHVzZQorLy8gICAgIHRoZSBtZW0ycmVnIGZ1bmN0aW9uYWxpdHkgdG8gY29uc3RydWN0IHRoZSBhcHByb3ByaWF0ZSBTU0EgZm9ybSBmb3IgdGhlCisvLyAgICAgdmFyaWFibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJsaWNtIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzU2V0VHJhY2tlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Byb21vdGVNZW1Ub1JlZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bVN1bmsgICAgICAsICJOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHN1bmsgb3V0IG9mIGxvb3AiKTsKK1NUQVRJU1RJQyhOdW1Ib2lzdGVkICAgLCAiTnVtYmVyIG9mIGluc3RydWN0aW9ucyBob2lzdGVkIG91dCBvZiBsb29wIik7CitTVEFUSVNUSUMoTnVtTW92ZWRMb2FkcywgIk51bWJlciBvZiBsb2FkIGluc3RzIGhvaXN0ZWQgb3Igc3VuayIpOworU1RBVElTVElDKE51bU1vdmVkQ2FsbHMsICJOdW1iZXIgb2YgY2FsbCBpbnN0cyBob2lzdGVkIG9yIHN1bmsiKTsKK1NUQVRJU1RJQyhOdW1Qcm9tb3RlZCAgLCAiTnVtYmVyIG9mIG1lbW9yeSBsb2NhdGlvbnMgcHJvbW90ZWQgdG8gcmVnaXN0ZXJzIik7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitEaXNhYmxlUHJvbW90aW9uKCJkaXNhYmxlLWxpY20tcHJvbW90aW9uIiwgY2w6OkhpZGRlbiwKKyAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkRpc2FibGUgbWVtb3J5IHByb21vdGlvbiBpbiBMSUNNIHBhc3MiKSk7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBMSUNNIDogcHVibGljIExvb3BQYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIExJQ00oKSA6IExvb3BQYXNzKElEKSB7fQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uTG9vcChMb29wICpMLCBMUFBhc3NNYW5hZ2VyICZMUE0pOworCisgICAgLy8vIFRoaXMgdHJhbnNmb3JtYXRpb24gcmVxdWlyZXMgbmF0dXJhbCBsb29wIGluZm9ybWF0aW9uICYgcmVxdWlyZXMgdGhhdAorICAgIC8vLyBsb29wIHByZWhlYWRlcnMgYmUgaW5zZXJ0ZWQgaW50byB0aGUgQ0ZHLi4uCisgICAgLy8vCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIEFVLnNldFByZXNlcnZlc0NGRygpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8RG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkPERvbWluYW5jZUZyb250aWVyPigpOyAgLy8gRm9yIHNjYWxhciBwcm9tb3Rpb24gKG1lbTJyZWcpCisgICAgICBBVS5hZGRSZXF1aXJlZDxMb29wSW5mbz4oKTsKKyAgICAgIEFVLmFkZFJlcXVpcmVkSUQoTG9vcFNpbXBsaWZ5SUQpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8QWxpYXNBbmFseXNpcz4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxTY2FsYXJFdm9sdXRpb24+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8RG9taW5hbmNlRnJvbnRpZXI+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWRJRChMb29wU2ltcGxpZnlJRCk7CisgICAgfQorCisgICAgYm9vbCBkb0ZpbmFsaXphdGlvbigpIHsKKyAgICAgIC8vIEZyZWUgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIG1hcAorICAgICAgZm9yIChzdGQ6Om1hcDxMb29wICosIEFsaWFzU2V0VHJhY2tlciAqPjo6aXRlcmF0b3IKKyAgICAgICAgICAgICBJID0gTG9vcFRvQWxpYXNNYXAuYmVnaW4oKSwgRSA9IExvb3BUb0FsaWFzTWFwLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgZGVsZXRlIEktPnNlY29uZDsKKworICAgICAgTG9vcFRvQWxpYXNNYXAuY2xlYXIoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLyBWYXJpb3VzIGFuYWx5c2VzIHRoYXQgd2UgdXNlLi4uCisgICAgQWxpYXNBbmFseXNpcyAqQUE7ICAgICAgIC8vIEN1cnJlbnQgQWxpYXNBbmFseXNpcyBpbmZvcm1hdGlvbgorICAgIExvb3BJbmZvICAgICAgKkxJOyAgICAgICAvLyBDdXJyZW50IExvb3BJbmZvCisgICAgRG9taW5hdG9yVHJlZSAqRFQ7ICAgICAgIC8vIERvbWluYXRvciBUcmVlIGZvciB0aGUgY3VycmVudCBMb29wLi4uCisgICAgRG9taW5hbmNlRnJvbnRpZXIgKkRGOyAgIC8vIEN1cnJlbnQgRG9taW5hbmNlIEZyb250aWVyCisKKyAgICAvLyBTdGF0ZSB0aGF0IGlzIHVwZGF0ZWQgYXMgd2UgcHJvY2VzcyBsb29wcworICAgIGJvb2wgQ2hhbmdlZDsgICAgICAgICAgICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHdlIGNoYW5nZSBhbnl0aGluZy4KKyAgICBCYXNpY0Jsb2NrICpQcmVoZWFkZXI7ICAgLy8gVGhlIHByZWhlYWRlciBibG9jayBvZiB0aGUgY3VycmVudCBsb29wLi4uCisgICAgTG9vcCAqQ3VyTG9vcDsgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGxvb3Agd2UgYXJlIHdvcmtpbmcgb24uLi4KKyAgICBBbGlhc1NldFRyYWNrZXIgKkN1ckFTVDsgLy8gQWxpYXNTZXQgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGxvb3AuLi4KKyAgICBzdGQ6Om1hcDxMb29wICosIEFsaWFzU2V0VHJhY2tlciAqPiBMb29wVG9BbGlhc01hcDsKKworICAgIC8vLyBjbG9uZUJhc2ljQmxvY2tBbmFseXNpcyAtIFNpbXBsZSBBbmFseXNpcyBob29rLiBDbG9uZSBhbGlhcyBzZXQgaW5mby4KKyAgICB2b2lkIGNsb25lQmFzaWNCbG9ja0FuYWx5c2lzKEJhc2ljQmxvY2sgKkZyb20sIEJhc2ljQmxvY2sgKlRvLCBMb29wICpMKTsKKworICAgIC8vLyBkZWxldGVBbmFseXNpc1ZhbHVlIC0gU2ltcGxlIEFuYWx5c2lzIGhvb2suIERlbGV0ZSB2YWx1ZSBWIGZyb20gYWxpYXMKKyAgICAvLy8gc2V0LgorICAgIHZvaWQgZGVsZXRlQW5hbHlzaXNWYWx1ZShWYWx1ZSAqViwgTG9vcCAqTCk7CisKKyAgICAvLy8gU2lua1JlZ2lvbiAtIFdhbGsgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgdGhlIENGRyAoZGVmaW5lZCBieSBhbGwgYmxvY2tzCisgICAgLy8vIGRvbWluYXRlZCBieSB0aGUgc3BlY2lmaWVkIGJsb2NrLCBhbmQgdGhhdCBhcmUgaW4gdGhlIGN1cnJlbnQgbG9vcCkgaW4KKyAgICAvLy8gcmV2ZXJzZSBkZXB0aCBmaXJzdCBvcmRlciB3LnIudCB0aGUgRG9taW5hdG9yVHJlZS4gIFRoaXMgYWxsb3dzIHVzIHRvCisgICAgLy8vIHZpc2l0IHVzZXMgYmVmb3JlIGRlZmluaXRpb25zLCBhbGxvd2luZyB1cyB0byBzaW5rIGEgbG9vcCBib2R5IGluIG9uZQorICAgIC8vLyBwYXNzIHdpdGhvdXQgaXRlcmF0aW9uLgorICAgIC8vLworICAgIHZvaWQgU2lua1JlZ2lvbihEb21UcmVlTm9kZSAqTik7CisKKyAgICAvLy8gSG9pc3RSZWdpb24gLSBXYWxrIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIHRoZSBDRkcgKGRlZmluZWQgYnkgYWxsCisgICAgLy8vIGJsb2NrcyBkb21pbmF0ZWQgYnkgdGhlIHNwZWNpZmllZCBibG9jaywgYW5kIHRoYXQgYXJlIGluIHRoZSBjdXJyZW50CisgICAgLy8vIGxvb3ApIGluIGRlcHRoIGZpcnN0IG9yZGVyIHcuci50IHRoZSBEb21pbmF0b3JUcmVlLiAgVGhpcyBhbGxvd3MgdXMgdG8KKyAgICAvLy8gdmlzaXQgZGVmaW5pdGlvbnMgYmVmb3JlIHVzZXMsIGFsbG93aW5nIHVzIHRvIGhvaXN0IGEgbG9vcCBib2R5IGluIG9uZQorICAgIC8vLyBwYXNzIHdpdGhvdXQgaXRlcmF0aW9uLgorICAgIC8vLworICAgIHZvaWQgSG9pc3RSZWdpb24oRG9tVHJlZU5vZGUgKk4pOworCisgICAgLy8vIGluU3ViTG9vcCAtIExpdHRsZSBwcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBiYXNpYworICAgIC8vLyBibG9jayBpcyBpbiBhIHN1Ymxvb3Agb2YgdGhlIGN1cnJlbnQgb25lLCBub3QgdGhlIGN1cnJlbnQgb25lIGl0c2VsZi4KKyAgICAvLy8KKyAgICBib29sIGluU3ViTG9vcChCYXNpY0Jsb2NrICpCQikgeworICAgICAgYXNzZXJ0KEN1ckxvb3AtPmNvbnRhaW5zKEJCKSAmJiAiT25seSB2YWxpZCBpZiBCQiBpcyBJTiB0aGUgbG9vcCIpOworICAgICAgZm9yIChMb29wOjppdGVyYXRvciBJID0gQ3VyTG9vcC0+YmVnaW4oKSwgRSA9IEN1ckxvb3AtPmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgaWYgKCgqSSktPmNvbnRhaW5zKEJCKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEEgc3VibG9vcCBhY3R1YWxseSBjb250YWlucyB0aGlzIGJsb2NrIQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyBpc0V4aXRCbG9ja0RvbWluYXRlZEJ5QmxvY2tJbkxvb3AgLSBUaGlzIG1ldGhvZCBjaGVja3MgdG8gc2VlIGlmIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgZXhpdCBibG9jayBvZiB0aGUgbG9vcCBpcyBkb21pbmF0ZWQgYnkgdGhlIHNwZWNpZmllZCBibG9jaworICAgIC8vLyB0aGF0IGlzIGluIHRoZSBib2R5IG9mIHRoZSBsb29wLiAgV2UgdXNlIHRoZXNlIGNvbnN0cmFpbnRzIHRvCisgICAgLy8vIGRyYW1hdGljYWxseSBsaW1pdCB0aGUgYW1vdW50IG9mIHRoZSBkb21pbmF0b3IgdHJlZSB0aGF0IG5lZWRzIHRvIGJlCisgICAgLy8vIHNlYXJjaGVkLgorICAgIGJvb2wgaXNFeGl0QmxvY2tEb21pbmF0ZWRCeUJsb2NrSW5Mb29wKEJhc2ljQmxvY2sgKkV4aXRCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCbG9ja0luTG9vcCkgY29uc3QgeworICAgICAgLy8gSWYgdGhlIGJsb2NrIGluIHRoZSBsb29wIGlzIHRoZSBsb29wIGhlYWRlciwgaXQgbXVzdCBiZSBkb21pbmF0ZWQhCisgICAgICBCYXNpY0Jsb2NrICpMb29wSGVhZGVyID0gQ3VyTG9vcC0+Z2V0SGVhZGVyKCk7CisgICAgICBpZiAoQmxvY2tJbkxvb3AgPT0gTG9vcEhlYWRlcikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIERvbVRyZWVOb2RlICpCbG9ja0luTG9vcE5vZGUgPSBEVC0+Z2V0Tm9kZShCbG9ja0luTG9vcCk7CisgICAgICBEb21UcmVlTm9kZSAqSURvbSAgICAgICAgICAgID0gRFQtPmdldE5vZGUoRXhpdEJsb2NrKTsKKworICAgICAgLy8gQmVjYXVzZSB0aGUgZXhpdCBibG9jayBpcyBub3QgaW4gdGhlIGxvb3AsIHdlIGtub3cgd2UgaGF2ZSB0byBnZXQgX2F0CisgICAgICAvLyBsZWFzdF8gaXRzIGltbWVkaWF0ZSBkb21pbmF0b3IuCisgICAgICBJRG9tID0gSURvbS0+Z2V0SURvbSgpOworICAgICAgCisgICAgICB3aGlsZSAoSURvbSAmJiBJRG9tICE9IEJsb2NrSW5Mb29wTm9kZSkgeworICAgICAgICAvLyBJZiB3ZSBoYXZlIGdvdCB0byB0aGUgaGVhZGVyIG9mIHRoZSBsb29wLCB0aGVuIHRoZSBpbnN0cnVjdGlvbnMgYmxvY2sKKyAgICAgICAgLy8gZGlkIG5vdCBkb21pbmF0ZSB0aGUgZXhpdCBub2RlLCBzbyB3ZSBjYW4ndCBob2lzdCBpdC4KKyAgICAgICAgaWYgKElEb20tPmdldEJsb2NrKCkgPT0gTG9vcEhlYWRlcikKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gR2V0IG5leHQgSW1tZWRpYXRlIERvbWluYXRvci4KKyAgICAgICAgSURvbSA9IElEb20tPmdldElEb20oKTsKKyAgICAgIH07CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBzaW5rIC0gV2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBmb3VuZCB0byBvbmx5IGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgbG9vcCwKKyAgICAvLy8gdGhpcyBmdW5jdGlvbiBtb3ZlcyBpdCB0byB0aGUgZXhpdCBibG9ja3MgYW5kIHBhdGNoZXMgdXAgU1NBIGZvcm0gYXMKKyAgICAvLy8gbmVlZGVkLgorICAgIC8vLworICAgIHZvaWQgc2luayhJbnN0cnVjdGlvbiAmSSk7CisKKyAgICAvLy8gaG9pc3QgLSBXaGVuIGFuIGluc3RydWN0aW9uIGlzIGZvdW5kIHRvIG9ubHkgdXNlIGxvb3AgaW52YXJpYW50IG9wZXJhbmRzCisgICAgLy8vIHRoYXQgaXMgc2FmZSB0byBob2lzdCwgdGhpcyBpbnN0cnVjdGlvbiBpcyBjYWxsZWQgdG8gZG8gdGhlIGRpcnR5IHdvcmsuCisgICAgLy8vCisgICAgdm9pZCBob2lzdChJbnN0cnVjdGlvbiAmSSk7CisKKyAgICAvLy8gaXNTYWZlVG9FeGVjdXRlVW5jb25kaXRpb25hbGx5IC0gT25seSBzaW5rIG9yIGhvaXN0IGFuIGluc3RydWN0aW9uIGlmIGl0CisgICAgLy8vIGlzIG5vdCBhIHRyYXBwaW5nIGluc3RydWN0aW9uIG9yIGlmIGl0IGlzIGEgdHJhcHBpbmcgaW5zdHJ1Y3Rpb24gYW5kIGlzCisgICAgLy8vIGd1YXJhbnRlZWQgdG8gZXhlY3V0ZS4KKyAgICAvLy8KKyAgICBib29sIGlzU2FmZVRvRXhlY3V0ZVVuY29uZGl0aW9uYWxseShJbnN0cnVjdGlvbiAmSSk7CisKKyAgICAvLy8gcG9pbnRlckludmFsaWRhdGVkQnlMb29wIC0gUmV0dXJuIHRydWUgaWYgdGhlIGJvZHkgb2YgdGhpcyBsb29wIG1heQorICAgIC8vLyBzdG9yZSBpbnRvIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSBWLgorICAgIC8vLworICAgIGJvb2wgcG9pbnRlckludmFsaWRhdGVkQnlMb29wKFZhbHVlICpWLCB1bnNpZ25lZCBTaXplKSB7CisgICAgICAvLyBDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZSBiYXNpYyBibG9ja3MgaW4gQ3VyTG9vcCBpbnZhbGlkYXRlICpWLgorICAgICAgcmV0dXJuIEN1ckFTVC0+Z2V0QWxpYXNTZXRGb3JQb2ludGVyKFYsIFNpemUpLmlzTW9kKCk7CisgICAgfQorCisgICAgYm9vbCBjYW5TaW5rT3JIb2lzdEluc3QoSW5zdHJ1Y3Rpb24gJkkpOworICAgIGJvb2wgaXNMb29wSW52YXJpYW50SW5zdChJbnN0cnVjdGlvbiAmSSk7CisgICAgYm9vbCBpc05vdFVzZWRJbkxvb3AoSW5zdHJ1Y3Rpb24gJkkpOworCisgICAgLy8vIFByb21vdGVWYWx1ZXNJbkxvb3AgLSBMb29rIGF0IHRoZSBzdG9yZXMgaW4gdGhlIGxvb3AgYW5kIHByb21vdGUgYXMgbWFueQorICAgIC8vLyB0byBzY2FsYXJzIGFzIHdlIGNhbi4KKyAgICAvLy8KKyAgICB2b2lkIFByb21vdGVWYWx1ZXNJbkxvb3AoKTsKKworICAgIC8vLyBGaW5kUHJvbW90YWJsZVZhbHVlc0luTG9vcCAtIENoZWNrIHRoZSBjdXJyZW50IGxvb3AgZm9yIHN0b3JlcyB0bworICAgIC8vLyBkZWZpbml0ZSBwb2ludGVycywgd2hpY2ggYXJlIG5vdCBsb2FkZWQgYW5kIHN0b3JlZCB0aHJvdWdoIG1heSBhbGlhc2VzLgorICAgIC8vLyBJZiB0aGVzZSBhcmUgZm91bmQsIGNyZWF0ZSBhbiBhbGxvY2EgZm9yIHRoZSB2YWx1ZSwgYWRkIGl0IHRvIHRoZQorICAgIC8vLyBQcm9tb3RlZFZhbHVlcyBsaXN0LCBhbmQga2VlcCB0cmFjayBvZiB0aGUgbWFwcGluZyBmcm9tIHZhbHVlIHRvCisgICAgLy8vIGFsbG9jYS4uLgorICAgIC8vLworICAgIHZvaWQgRmluZFByb21vdGFibGVWYWx1ZXNJbkxvb3AoCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEFsbG9jYUluc3QqLCBWYWx1ZSo+ID4gJlByb21vdGVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8VmFsdWUqLCBBbGxvY2FJbnN0Kj4gJlZhbDJBbE1hcCk7CisgIH07Cit9CisKK2NoYXIgTElDTTo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKExJQ00sICJsaWNtIiwgIkxvb3AgSW52YXJpYW50IENvZGUgTW90aW9uIiwgZmFsc2UsIGZhbHNlKTsKKworUGFzcyAqbGx2bTo6Y3JlYXRlTElDTVBhc3MoKSB7IHJldHVybiBuZXcgTElDTSgpOyB9CisKKy8vLyBIb2lzdCBleHByZXNzaW9ucyBvdXQgb2YgdGhlIHNwZWNpZmllZCBsb29wLiBOb3RlLCBhbGlhcyBpbmZvIGZvciBpbm5lcgorLy8vIGxvb3AgaXMgbm90IHByZXNlcnZlZCBzbyBpdCBpcyBub3QgYSBnb29kIGlkZWEgdG8gcnVuIExJQ00gbXVsdGlwbGUgCisvLy8gdGltZXMgb24gb25lIGxvb3AuCisvLy8KK2Jvb2wgTElDTTo6cnVuT25Mb29wKExvb3AgKkwsIExQUGFzc01hbmFnZXIgJkxQTSkgeworICBDaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gR2V0IG91ciBMb29wIGFuZCBBbGlhcyBBbmFseXNpcyBpbmZvcm1hdGlvbi4uLgorICBMSSA9ICZnZXRBbmFseXNpczxMb29wSW5mbz4oKTsKKyAgQUEgPSAmZ2V0QW5hbHlzaXM8QWxpYXNBbmFseXNpcz4oKTsKKyAgREYgPSAmZ2V0QW5hbHlzaXM8RG9taW5hbmNlRnJvbnRpZXI+KCk7CisgIERUID0gJmdldEFuYWx5c2lzPERvbWluYXRvclRyZWU+KCk7CisKKyAgQ3VyQVNUID0gbmV3IEFsaWFzU2V0VHJhY2tlcigqQUEpOworICAvLyBDb2xsZWN0IEFsaWFzIGluZm8gZnJvbSBzdWJsb29wcworICBmb3IgKExvb3A6Oml0ZXJhdG9yIExvb3BJdHIgPSBMLT5iZWdpbigpLCBMb29wSXRyRSA9IEwtPmVuZCgpOworICAgICAgIExvb3BJdHIgIT0gTG9vcEl0ckU7ICsrTG9vcEl0cikgeworICAgIExvb3AgKklubmVyTCA9ICpMb29wSXRyOworICAgIEFsaWFzU2V0VHJhY2tlciAqSW5uZXJBU1QgPSBMb29wVG9BbGlhc01hcFtJbm5lckxdOworICAgIGFzc2VydCAoSW5uZXJBU1QgJiYgIldoZXJlIGlzIG15IEFTVD8iKTsKKworICAgIC8vIFdoYXQgaWYgSW5uZXJMb29wIHdhcyBtb2RpZmllZCBieSBvdGhlciBwYXNzZXMgPworICAgIEN1ckFTVC0+YWRkKCpJbm5lckFTVCk7CisgIH0KKyAgCisgIEN1ckxvb3AgPSBMOworCisgIC8vIEdldCB0aGUgcHJlaGVhZGVyIGJsb2NrIHRvIG1vdmUgaW5zdHJ1Y3Rpb25zIGludG8uLi4KKyAgUHJlaGVhZGVyID0gTC0+Z2V0TG9vcFByZWhlYWRlcigpOworCisgIC8vIExvb3Agb3ZlciB0aGUgYm9keSBvZiB0aGlzIGxvb3AsIGxvb2tpbmcgZm9yIGNhbGxzLCBpbnZva2VzLCBhbmQgc3RvcmVzLgorICAvLyBCZWNhdXNlIHN1Ymxvb3BzIGhhdmUgYWxyZWFkeSBiZWVuIGluY29ycG9yYXRlZCBpbnRvIEFTVCwgd2Ugc2tpcCBibG9ja3MgaW4KKyAgLy8gc3VibG9vcHMuCisgIC8vCisgIGZvciAoTG9vcDo6YmxvY2tfaXRlcmF0b3IgSSA9IEwtPmJsb2NrX2JlZ2luKCksIEUgPSBMLT5ibG9ja19lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIEJhc2ljQmxvY2sgKkJCID0gKkk7CisgICAgaWYgKExJLT5nZXRMb29wRm9yKEJCKSA9PSBMKSAgICAgICAgLy8gSWdub3JlIGJsb2NrcyBpbiBzdWJsb29wcy4uLgorICAgICAgQ3VyQVNULT5hZGQoKkJCKTsgICAgICAgICAgICAgICAgIC8vIEluY29ycG9yYXRlIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sKKyAgfQorCisgIC8vIFdlIHdhbnQgdG8gdmlzaXQgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhpcyBsb29wLi4uIHRoYXQgYXJlIG5vdCBwYXJ0cworICAvLyBvZiBvdXIgc3VibG9vcHMgKHRoZXkgaGF2ZSBhbHJlYWR5IGhhZCB0aGVpciBpbnZhcmlhbnRzIGhvaXN0ZWQgb3V0IG9mCisgIC8vIHRoZWlyIGxvb3AsIGludG8gdGhpcyBsb29wLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlIEJPRElFUyBvZgorICAvLyB0aGUgc3VibG9vcHMpLgorICAvLworICAvLyBUcmF2ZXJzZSB0aGUgYm9keSBvZiB0aGUgbG9vcCBpbiBkZXB0aCBmaXJzdCBvcmRlciBvbiB0aGUgZG9taW5hdG9yIHRyZWUgc28KKyAgLy8gdGhhdCB3ZSBhcmUgZ3VhcmFudGVlZCB0byBzZWUgZGVmaW5pdGlvbnMgYmVmb3JlIHdlIHNlZSB1c2VzLiAgVGhpcyBhbGxvd3MKKyAgLy8gdXMgdG8gc2luayBpbnN0cnVjdGlvbnMgaW4gb25lIHBhc3MsIHdpdGhvdXQgaXRlcmF0aW9uLiAgQWZ0ZXIgc2lua2luZworICAvLyBpbnN0cnVjdGlvbnMsIHdlIHBlcmZvcm0gYW5vdGhlciBwYXNzIHRvIGhvaXN0IHRoZW0gb3V0IG9mIHRoZSBsb29wLgorICAvLworICBpZiAoTC0+aGFzRGVkaWNhdGVkRXhpdHMoKSkKKyAgICBTaW5rUmVnaW9uKERULT5nZXROb2RlKEwtPmdldEhlYWRlcigpKSk7CisgIGlmIChQcmVoZWFkZXIpCisgICAgSG9pc3RSZWdpb24oRFQtPmdldE5vZGUoTC0+Z2V0SGVhZGVyKCkpKTsKKworICAvLyBOb3cgdGhhdCBhbGwgbG9vcCBpbnZhcmlhbnRzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxvb3AsIHByb21vdGUgYW55CisgIC8vIG1lbW9yeSByZWZlcmVuY2VzIHRvIHNjYWxhcnMgdGhhdCB3ZSBjYW4uLi4KKyAgaWYgKCFEaXNhYmxlUHJvbW90aW9uICYmIFByZWhlYWRlciAmJiBMLT5oYXNEZWRpY2F0ZWRFeGl0cygpKQorICAgIFByb21vdGVWYWx1ZXNJbkxvb3AoKTsKKworICAvLyBDbGVhciBvdXQgbG9vcHMgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbgorICBDdXJMb29wID0gMDsKKyAgUHJlaGVhZGVyID0gMDsKKworICBMb29wVG9BbGlhc01hcFtMXSA9IEN1ckFTVDsKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBTaW5rUmVnaW9uIC0gV2FsayB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgQ0ZHIChkZWZpbmVkIGJ5IGFsbCBibG9ja3MKKy8vLyBkb21pbmF0ZWQgYnkgdGhlIHNwZWNpZmllZCBibG9jaywgYW5kIHRoYXQgYXJlIGluIHRoZSBjdXJyZW50IGxvb3ApIGluCisvLy8gcmV2ZXJzZSBkZXB0aCBmaXJzdCBvcmRlciB3LnIudCB0aGUgRG9taW5hdG9yVHJlZS4gIFRoaXMgYWxsb3dzIHVzIHRvIHZpc2l0CisvLy8gdXNlcyBiZWZvcmUgZGVmaW5pdGlvbnMsIGFsbG93aW5nIHVzIHRvIHNpbmsgYSBsb29wIGJvZHkgaW4gb25lIHBhc3Mgd2l0aG91dAorLy8vIGl0ZXJhdGlvbi4KKy8vLwordm9pZCBMSUNNOjpTaW5rUmVnaW9uKERvbVRyZWVOb2RlICpOKSB7CisgIGFzc2VydChOICE9IDAgJiYgIk51bGwgZG9taW5hdG9yIHRyZWUgbm9kZT8iKTsKKyAgQmFzaWNCbG9jayAqQkIgPSBOLT5nZXRCbG9jaygpOworCisgIC8vIElmIHRoaXMgc3VicmVnaW9uIGlzIG5vdCBpbiB0aGUgdG9wIGxldmVsIGxvb3AgYXQgYWxsLCBleGl0LgorICBpZiAoIUN1ckxvb3AtPmNvbnRhaW5zKEJCKSkgcmV0dXJuOworCisgIC8vIFdlIGFyZSBwcm9jZXNzaW5nIGJsb2NrcyBpbiByZXZlcnNlIGRmbywgc28gcHJvY2VzcyBjaGlsZHJlbiBmaXJzdC4uLgorICBjb25zdCBzdGQ6OnZlY3RvcjxEb21UcmVlTm9kZSo+ICZDaGlsZHJlbiA9IE4tPmdldENoaWxkcmVuKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDaGlsZHJlbi5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFNpbmtSZWdpb24oQ2hpbGRyZW5baV0pOworCisgIC8vIE9ubHkgbmVlZCB0byBwcm9jZXNzIHRoZSBjb250ZW50cyBvZiB0aGlzIGJsb2NrIGlmIGl0IGlzIG5vdCBwYXJ0IG9mIGEKKyAgLy8gc3VibG9vcCAod2hpY2ggd291bGQgYWxyZWFkeSBoYXZlIGJlZW4gcHJvY2Vzc2VkKS4KKyAgaWYgKGluU3ViTG9vcChCQikpIHJldHVybjsKKworICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gQkItPmVuZCgpOyBJSSAhPSBCQi0+YmVnaW4oKTsgKSB7CisgICAgSW5zdHJ1Y3Rpb24gJkkgPSAqLS1JSTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gc2luayB0aGlzIGluc3RydWN0aW9uIHRvIHRoZSBleGl0IGJsb2NrcworICAgIC8vIG9mIHRoZSBsb29wLiAgV2UgY2FuIGRvIHRoaXMgaWYgdGhlIGFsbCB1c2VycyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlCisgICAgLy8gb3V0c2lkZSBvZiB0aGUgbG9vcC4gIEluIHRoaXMgY2FzZSwgaXQgZG9lc24ndCBldmVuIG1hdHRlciBpZiB0aGUKKyAgICAvLyBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIGxvb3AgaW52YXJpYW50LgorICAgIC8vCisgICAgaWYgKGlzTm90VXNlZEluTG9vcChJKSAmJiBjYW5TaW5rT3JIb2lzdEluc3QoSSkpIHsKKyAgICAgICsrSUk7CisgICAgICBzaW5rKEkpOworICAgIH0KKyAgfQorfQorCisvLy8gSG9pc3RSZWdpb24gLSBXYWxrIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIHRoZSBDRkcgKGRlZmluZWQgYnkgYWxsIGJsb2NrcworLy8vIGRvbWluYXRlZCBieSB0aGUgc3BlY2lmaWVkIGJsb2NrLCBhbmQgdGhhdCBhcmUgaW4gdGhlIGN1cnJlbnQgbG9vcCkgaW4gZGVwdGgKKy8vLyBmaXJzdCBvcmRlciB3LnIudCB0aGUgRG9taW5hdG9yVHJlZS4gIFRoaXMgYWxsb3dzIHVzIHRvIHZpc2l0IGRlZmluaXRpb25zCisvLy8gYmVmb3JlIHVzZXMsIGFsbG93aW5nIHVzIHRvIGhvaXN0IGEgbG9vcCBib2R5IGluIG9uZSBwYXNzIHdpdGhvdXQgaXRlcmF0aW9uLgorLy8vCit2b2lkIExJQ006OkhvaXN0UmVnaW9uKERvbVRyZWVOb2RlICpOKSB7CisgIGFzc2VydChOICE9IDAgJiYgIk51bGwgZG9taW5hdG9yIHRyZWUgbm9kZT8iKTsKKyAgQmFzaWNCbG9jayAqQkIgPSBOLT5nZXRCbG9jaygpOworCisgIC8vIElmIHRoaXMgc3VicmVnaW9uIGlzIG5vdCBpbiB0aGUgdG9wIGxldmVsIGxvb3AgYXQgYWxsLCBleGl0LgorICBpZiAoIUN1ckxvb3AtPmNvbnRhaW5zKEJCKSkgcmV0dXJuOworCisgIC8vIE9ubHkgbmVlZCB0byBwcm9jZXNzIHRoZSBjb250ZW50cyBvZiB0aGlzIGJsb2NrIGlmIGl0IGlzIG5vdCBwYXJ0IG9mIGEKKyAgLy8gc3VibG9vcCAod2hpY2ggd291bGQgYWxyZWFkeSBoYXZlIGJlZW4gcHJvY2Vzc2VkKS4KKyAgaWYgKCFpblN1Ykxvb3AoQkIpKQorICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSUkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSUkgIT0gRTsgKSB7CisgICAgICBJbnN0cnVjdGlvbiAmSSA9ICpJSSsrOworCisgICAgICAvLyBUcnkgaG9pc3RpbmcgdGhlIGluc3RydWN0aW9uIG91dCB0byB0aGUgcHJlaGVhZGVyLiAgV2UgY2FuIG9ubHkgZG8gdGhpcworICAgICAgLy8gaWYgYWxsIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIGxvb3AgaW52YXJpYW50IGFuZCBpZiBpdAorICAgICAgLy8gaXMgc2FmZSB0byBob2lzdCB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgICAvLworICAgICAgaWYgKGlzTG9vcEludmFyaWFudEluc3QoSSkgJiYgY2FuU2lua09ySG9pc3RJbnN0KEkpICYmCisgICAgICAgICAgaXNTYWZlVG9FeGVjdXRlVW5jb25kaXRpb25hbGx5KEkpKQorICAgICAgICBob2lzdChJKTsKKyAgICAgIH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxEb21UcmVlTm9kZSo+ICZDaGlsZHJlbiA9IE4tPmdldENoaWxkcmVuKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDaGlsZHJlbi5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIEhvaXN0UmVnaW9uKENoaWxkcmVuW2ldKTsKK30KKworLy8vIGNhblNpbmtPckhvaXN0SW5zdCAtIFJldHVybiB0cnVlIGlmIHRoZSBob2lzdGVyIGFuZCBzaW5rZXIgY2FuIGhhbmRsZSB0aGlzCisvLy8gaW5zdHJ1Y3Rpb24uCisvLy8KK2Jvb2wgTElDTTo6Y2FuU2lua09ySG9pc3RJbnN0KEluc3RydWN0aW9uICZJKSB7CisgIC8vIExvYWRzIGhhdmUgZXh0cmEgY29uc3RyYWludHMgd2UgaGF2ZSB0byB2ZXJpZnkgYmVmb3JlIHdlIGNhbiBob2lzdCB0aGVtLgorICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KCZJKSkgeworICAgIGlmIChMSS0+aXNWb2xhdGlsZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgLy8gRG9uJ3QgaG9pc3Qgdm9sYXRpbGUgbG9hZHMhCisKKyAgICAvLyBMb2FkcyBmcm9tIGNvbnN0YW50IG1lbW9yeSBhcmUgYWx3YXlzIHNhZmUgdG8gbW92ZSwgZXZlbiBpZiB0aGV5IGVuZCB1cAorICAgIC8vIGluIHRoZSBzYW1lIGFsaWFzIHNldCBhcyBzb21ldGhpbmcgdGhhdCBlbmRzIHVwIGJlaW5nIG1vZGlmaWVkLgorICAgIGlmIChBQS0+cG9pbnRzVG9Db25zdGFudE1lbW9yeShMSS0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICAvLyBEb24ndCBob2lzdCBsb2FkcyB3aGljaCBoYXZlIG1heS1hbGlhc2VkIHN0b3JlcyBpbiBsb29wLgorICAgIHVuc2lnbmVkIFNpemUgPSAwOworICAgIGlmIChMSS0+Z2V0VHlwZSgpLT5pc1NpemVkKCkpCisgICAgICBTaXplID0gQUEtPmdldFR5cGVTdG9yZVNpemUoTEktPmdldFR5cGUoKSk7CisgICAgcmV0dXJuICFwb2ludGVySW52YWxpZGF0ZWRCeUxvb3AoTEktPmdldE9wZXJhbmQoMCksIFNpemUpOworICB9IGVsc2UgaWYgKENhbGxJbnN0ICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PigmSSkpIHsKKyAgICAvLyBIYW5kbGUgb2J2aW91cyBjYXNlcyBlZmZpY2llbnRseS4KKyAgICBBbGlhc0FuYWx5c2lzOjpNb2RSZWZCZWhhdmlvciBCZWhhdmlvciA9IEFBLT5nZXRNb2RSZWZCZWhhdmlvcihDSSk7CisgICAgaWYgKEJlaGF2aW9yID09IEFsaWFzQW5hbHlzaXM6OkRvZXNOb3RBY2Nlc3NNZW1vcnkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlIGlmIChCZWhhdmlvciA9PSBBbGlhc0FuYWx5c2lzOjpPbmx5UmVhZHNNZW1vcnkpIHsKKyAgICAgIC8vIElmIHRoaXMgY2FsbCBvbmx5IHJlYWRzIGZyb20gbWVtb3J5IGFuZCB0aGVyZSBhcmUgbm8gd3JpdGVzIHRvIG1lbW9yeQorICAgICAgLy8gaW4gdGhlIGxvb3AsIHdlIGNhbiBob2lzdCBvciBzaW5rIHRoZSBjYWxsIGFzIGFwcHJvcHJpYXRlLgorICAgICAgYm9vbCBGb3VuZE1vZCA9IGZhbHNlOworICAgICAgZm9yIChBbGlhc1NldFRyYWNrZXI6Oml0ZXJhdG9yIEkgPSBDdXJBU1QtPmJlZ2luKCksIEUgPSBDdXJBU1QtPmVuZCgpOworICAgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgICBBbGlhc1NldCAmQVMgPSAqSTsKKyAgICAgICAgaWYgKCFBUy5pc0ZvcndhcmRpbmdBbGlhc1NldCgpICYmIEFTLmlzTW9kKCkpIHsKKyAgICAgICAgICBGb3VuZE1vZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghRm91bmRNb2QpIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgbW9kL3JlZiBpbmZvcm1hdGlvbiB0byBzZWUgaWYgd2UgY2FuIGhvaXN0IG9yIHNpbmsKKyAgICAvLyB0aGUgY2FsbC4KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE90aGVyd2lzZSB0aGVzZSBpbnN0cnVjdGlvbnMgYXJlIGhvaXN0YWJsZS9zaW5rYWJsZQorICByZXR1cm4gaXNhPEJpbmFyeU9wZXJhdG9yPihJKSB8fCBpc2E8Q2FzdEluc3Q+KEkpIHx8CisgICAgICAgICBpc2E8U2VsZWN0SW5zdD4oSSkgfHwgaXNhPEdldEVsZW1lbnRQdHJJbnN0PihJKSB8fCBpc2E8Q21wSW5zdD4oSSkgfHwKKyAgICAgICAgIGlzYTxJbnNlcnRFbGVtZW50SW5zdD4oSSkgfHwgaXNhPEV4dHJhY3RFbGVtZW50SW5zdD4oSSkgfHwKKyAgICAgICAgIGlzYTxTaHVmZmxlVmVjdG9ySW5zdD4oSSk7Cit9CisKKy8vLyBpc05vdFVzZWRJbkxvb3AgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgb25seSB1c2VycyBvZiB0aGlzIGluc3RydWN0aW9uIGFyZQorLy8vIG91dHNpZGUgb2YgdGhlIGxvb3AuICBJZiB0aGlzIGlzIHRydWUsIHdlIGNhbiBzaW5rIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUKKy8vLyBleGl0IGJsb2NrcyBvZiB0aGUgbG9vcC4KKy8vLworYm9vbCBMSUNNOjppc05vdFVzZWRJbkxvb3AoSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gSS51c2VfYmVnaW4oKSwgRSA9IEkudXNlX2VuZCgpOyBVSSAhPSBFOyArK1VJKSB7CisgICAgSW5zdHJ1Y3Rpb24gKlVzZXIgPSBjYXN0PEluc3RydWN0aW9uPigqVUkpOworICAgIGlmIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KFVzZXIpKSB7CisgICAgICAvLyBQSEkgbm9kZSB1c2VzIG9jY3VyIGluIHByZWRlY2Vzc29yIGJsb2NrcyEKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKSA9PSAmSSkKKyAgICAgICAgICBpZiAoQ3VyTG9vcC0+Y29udGFpbnMoUE4tPmdldEluY29taW5nQmxvY2soaSkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoQ3VyTG9vcC0+Y29udGFpbnMoVXNlcikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vIGlzTG9vcEludmFyaWFudEluc3QgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgb3BlcmFuZHMgb2YgdGhpcyBpbnN0cnVjdGlvbiBhcmUKKy8vLyBsb29wIGludmFyaWFudC4gIFdlIGFsc28gZmlsdGVyIG91dCBub24taG9pc3RhYmxlIGluc3RydWN0aW9ucyBoZXJlIGp1c3QgZm9yCisvLy8gZWZmaWNpZW5jeS4KKy8vLworYm9vbCBMSUNNOjppc0xvb3BJbnZhcmlhbnRJbnN0KEluc3RydWN0aW9uICZJKSB7CisgIC8vIFRoZSBpbnN0cnVjdGlvbiBpcyBsb29wIGludmFyaWFudCBpZiBhbGwgb2YgaXRzIG9wZXJhbmRzIGFyZSBsb29wLWludmFyaWFudAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoIUN1ckxvb3AtPmlzTG9vcEludmFyaWFudChJLmdldE9wZXJhbmQoaSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHdlIGdvdCB0aGlzIGZhciwgdGhlIGluc3RydWN0aW9uIGlzIGxvb3AgaW52YXJpYW50IQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIHNpbmsgLSBXaGVuIGFuIGluc3RydWN0aW9uIGlzIGZvdW5kIHRvIG9ubHkgYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBsb29wLAorLy8vIHRoaXMgZnVuY3Rpb24gbW92ZXMgaXQgdG8gdGhlIGV4aXQgYmxvY2tzIGFuZCBwYXRjaGVzIHVwIFNTQSBmb3JtIGFzIG5lZWRlZC4KKy8vLyBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIHJlbW92ZSB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gZnJvbSBpdHMKKy8vLyBwb3NpdGlvbiwgYW5kIG1heSBlaXRoZXIgZGVsZXRlIGl0IG9yIG1vdmUgaXQgdG8gb3V0c2lkZSBvZiB0aGUgbG9vcC4KKy8vLwordm9pZCBMSUNNOjpzaW5rKEluc3RydWN0aW9uICZJKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiTElDTSBzaW5raW5nIGluc3RydWN0aW9uOiAiIDw8IEkgPDwgIlxuIik7CisKKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDg+IEV4aXRCbG9ja3M7CisgIEN1ckxvb3AtPmdldEV4aXRCbG9ja3MoRXhpdEJsb2Nrcyk7CisKKyAgaWYgKGlzYTxMb2FkSW5zdD4oSSkpICsrTnVtTW92ZWRMb2FkczsKKyAgZWxzZSBpZiAoaXNhPENhbGxJbnN0PihJKSkgKytOdW1Nb3ZlZENhbGxzOworICArK051bVN1bms7CisgIENoYW5nZWQgPSB0cnVlOworCisgIC8vIFRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgZXhpdCBub2RlIG9mIHRoaXMgbG9vcCBpcyBjb21tb24KKyAgLy8gZW5vdWdoIHRoYXQgd2UgaGFuZGxlIGl0IGFzIGEgc3BlY2lhbCAobW9yZSBlZmZpY2llbnQpIGNhc2UuICBJdCBpcyBtb3JlCisgIC8vIGVmZmljaWVudCB0byBoYW5kbGUgYmVjYXVzZSB0aGVyZSBhcmUgbm8gUEhJIG5vZGVzIHRoYXQgbmVlZCB0byBiZSBwbGFjZWQuCisgIGlmIChFeGl0QmxvY2tzLnNpemUoKSA9PSAxKSB7CisgICAgaWYgKCFpc0V4aXRCbG9ja0RvbWluYXRlZEJ5QmxvY2tJbkxvb3AoRXhpdEJsb2Nrc1swXSwgSS5nZXRQYXJlbnQoKSkpIHsKKyAgICAgIC8vIEluc3RydWN0aW9uIGlzIG5vdCB1c2VkLCBqdXN0IGRlbGV0ZSBpdC4KKyAgICAgIEN1ckFTVC0+ZGVsZXRlVmFsdWUoJkkpOworICAgICAgLy8gSWYgSSBoYXMgdXNlcnMgaW4gdW5yZWFjaGFibGUgYmxvY2tzLCBlbGltaW5hdGUuCisgICAgICAvLyBJZiBJIGlzIG5vdCB2b2lkIHR5cGUgdGhlbiByZXBsYWNlQWxsVXNlc1dpdGggdW5kZWYuCisgICAgICAvLyBUaGlzIGFsbG93cyBWYWx1ZUhhbmRsZXJzIGFuZCBjdXN0b20gbWV0YWRhdGEgdG8gYWRqdXN0IGl0c2VsZi4KKyAgICAgIGlmICghSS5nZXRUeXBlKCktPmlzVm9pZFR5KCkpCisgICAgICAgIEkucmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChJLmdldFR5cGUoKSkpOworICAgICAgSS5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTW92ZSB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBleGl0IGJsb2NrLCBhZnRlciBhbnkgUEhJCisgICAgICAvLyBub2RlcyBpbiBpdC4KKyAgICAgIEkucmVtb3ZlRnJvbVBhcmVudCgpOworICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQgPSBFeGl0QmxvY2tzWzBdLT5nZXRGaXJzdE5vblBISSgpOworICAgICAgRXhpdEJsb2Nrc1swXS0+Z2V0SW5zdExpc3QoKS5pbnNlcnQoSW5zZXJ0UHQsICZJKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoRXhpdEJsb2Nrcy5lbXB0eSgpKSB7CisgICAgLy8gVGhlIGluc3RydWN0aW9uIGlzIGFjdHVhbGx5IGRlYWQgaWYgdGhlcmUgQVJFIE5PIGV4aXQgYmxvY2tzLgorICAgIEN1ckFTVC0+ZGVsZXRlVmFsdWUoJkkpOworICAgIC8vIElmIEkgaGFzIHVzZXJzIGluIHVucmVhY2hhYmxlIGJsb2NrcywgZWxpbWluYXRlLgorICAgIC8vIElmIEkgaXMgbm90IHZvaWQgdHlwZSB0aGVuIHJlcGxhY2VBbGxVc2VzV2l0aCB1bmRlZi4KKyAgICAvLyBUaGlzIGFsbG93cyBWYWx1ZUhhbmRsZXJzIGFuZCBjdXN0b20gbWV0YWRhdGEgdG8gYWRqdXN0IGl0c2VsZi4KKyAgICBpZiAoIUkuZ2V0VHlwZSgpLT5pc1ZvaWRUeSgpKQorICAgICAgSS5yZXBsYWNlQWxsVXNlc1dpdGgoVW5kZWZWYWx1ZTo6Z2V0KEkuZ2V0VHlwZSgpKSk7CisgICAgSS5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPdGhlcndpc2UsIGlmIHdlIGhhdmUgbXVsdGlwbGUgZXhpdHMsIHVzZSB0aGUgUHJvbW90ZU1lbTJSZWcgZnVuY3Rpb24gdG8KKyAgICAvLyBkbyBhbGwgb2YgdGhlIGhhcmQgd29yayBvZiBpbnNlcnRpbmcgUEhJIG5vZGVzIGFzIG5lY2Vzc2FyeS4gIFdlIGNvbnZlcnQKKyAgICAvLyB0aGUgdmFsdWUgaW50byBhIHN0YWNrIG9iamVjdCB0byBnZXQgaXQgdG8gZG8gdGhpcy4KKworICAgIC8vIEZpcnN0bHksIHdlIGNyZWF0ZSBhIHN0YWNrIG9iamVjdCB0byBob2xkIHRoZSB2YWx1ZS4uLgorICAgIEFsbG9jYUluc3QgKkFJID0gMDsKKworICAgIGlmICghSS5nZXRUeXBlKCktPmlzVm9pZFR5KCkpIHsKKyAgICAgIEFJID0gbmV3IEFsbG9jYUluc3QoSS5nZXRUeXBlKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEkuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXRFbnRyeUJsb2NrKCkuYmVnaW4oKSk7CisgICAgICBDdXJBU1QtPmFkZChBSSk7CisgICAgfQorCisgICAgLy8gU2Vjb25kbHksIGluc2VydCBsb2FkIGluc3RydWN0aW9ucyBmb3IgZWFjaCB1c2Ugb2YgdGhlIGluc3RydWN0aW9uCisgICAgLy8gb3V0c2lkZSBvZiB0aGUgbG9vcC4KKyAgICB3aGlsZSAoIUkudXNlX2VtcHR5KCkpIHsKKyAgICAgIEluc3RydWN0aW9uICpVID0gY2FzdDxJbnN0cnVjdGlvbj4oSS51c2VfYmFjaygpKTsKKworICAgICAgLy8gSWYgdGhlIHVzZXIgaXMgYSBQSEkgTm9kZSwgd2UgYWN0dWFsbHkgaGF2ZSB0byBpbnNlcnQgbG9hZCBpbnN0cnVjdGlvbnMKKyAgICAgIC8vIGluIGFsbCBwcmVkZWNlc3NvciBibG9ja3MsIG5vdCBpbiB0aGUgUEhJIGJsb2NrIGl0c2VsZiEKKyAgICAgIGlmIChQSElOb2RlICpVUE4gPSBkeW5fY2FzdDxQSElOb2RlPihVKSkgeworICAgICAgICAvLyBPbmx5IGluc2VydCBpbnRvIGVhY2ggcHJlZGVjZXNzb3Igb25jZSwgc28gdGhhdCB3ZSBkb24ndCBoYXZlCisgICAgICAgIC8vIGRpZmZlcmVudCBpbmNvbWluZyB2YWx1ZXMgZnJvbSB0aGUgc2FtZSBibG9jayEKKyAgICAgICAgc3RkOjptYXA8QmFzaWNCbG9jayosIFZhbHVlKj4gSW5zZXJ0ZWRCbG9ja3M7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIGlmIChVUE4tPmdldEluY29taW5nVmFsdWUoaSkgPT0gJkkpIHsKKyAgICAgICAgICAgIEJhc2ljQmxvY2sgKlByZWQgPSBVUE4tPmdldEluY29taW5nQmxvY2soaSk7CisgICAgICAgICAgICBWYWx1ZSAqJlByZWRWYWwgPSBJbnNlcnRlZEJsb2Nrc1tQcmVkXTsKKyAgICAgICAgICAgIGlmICghUHJlZFZhbCkgeworICAgICAgICAgICAgICAvLyBJbnNlcnQgYSBuZXcgbG9hZCBpbnN0cnVjdGlvbiByaWdodCBiZWZvcmUgdGhlIHRlcm1pbmF0b3IgaW4KKyAgICAgICAgICAgICAgLy8gdGhlIHByZWRlY2Vzc29yIGJsb2NrLgorICAgICAgICAgICAgICBQcmVkVmFsID0gbmV3IExvYWRJbnN0KEFJLCBQcmVkLT5nZXRUZXJtaW5hdG9yKCkpOworICAgICAgICAgICAgICBDdXJBU1QtPmFkZChjYXN0PExvYWRJbnN0PihQcmVkVmFsKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFVQTi0+c2V0SW5jb21pbmdWYWx1ZShpLCBQcmVkVmFsKTsKKyAgICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExvYWRJbnN0ICpMID0gbmV3IExvYWRJbnN0KEFJLCBVKTsKKyAgICAgICAgVS0+cmVwbGFjZVVzZXNPZldpdGgoJkksIEwpOworICAgICAgICBDdXJBU1QtPmFkZChMKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlyZGx5LCBpbnNlcnQgYSBjb3B5IG9mIHRoZSBpbnN0cnVjdGlvbiBpbiBlYWNoIGV4aXQgYmxvY2sgb2YgdGhlIGxvb3AKKyAgICAvLyB0aGF0IGlzIGRvbWluYXRlZCBieSB0aGUgaW5zdHJ1Y3Rpb24sIHN0b3JpbmcgdGhlIHJlc3VsdCBpbnRvIHRoZSBtZW1vcnkKKyAgICAvLyBsb2NhdGlvbi4gIEJlIGNhcmVmdWwgbm90IHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50byBhbnkgcGFydGljdWxhcgorICAgIC8vIGJhc2ljIGJsb2NrIG1vcmUgdGhhbiBvbmNlLgorICAgIHN0ZDo6c2V0PEJhc2ljQmxvY2sqPiBJbnNlcnRlZEJsb2NrczsKKyAgICBCYXNpY0Jsb2NrICpJbnN0T3JpZ0JCID0gSS5nZXRQYXJlbnQoKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBFeGl0QmxvY2tzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEJhc2ljQmxvY2sgKkV4aXRCbG9jayA9IEV4aXRCbG9ja3NbaV07CisKKyAgICAgIGlmIChpc0V4aXRCbG9ja0RvbWluYXRlZEJ5QmxvY2tJbkxvb3AoRXhpdEJsb2NrLCBJbnN0T3JpZ0JCKSkgeworICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZXhpdCBibG9jaywgZG8gc28gbm93LgorICAgICAgICBpZiAoSW5zZXJ0ZWRCbG9ja3MuaW5zZXJ0KEV4aXRCbG9jaykuc2Vjb25kKSB7CisgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBjb2RlIGFmdGVyIHRoZSBsYXN0IFBISSBub2RlLi4uCisgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQgPSBFeGl0QmxvY2stPmdldEZpcnN0Tm9uUEhJKCk7CisKKyAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBleGl0IGJsb2NrIHByb2Nlc3NlZCwganVzdCBtb3ZlIHRoZSBvcmlnaW5hbAorICAgICAgICAgIC8vIGluc3RydWN0aW9uLCBvdGhlcndpc2UgY2xvbmUgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIGFuZCBpbnNlcnQKKyAgICAgICAgICAvLyB0aGUgY29weS4KKyAgICAgICAgICBJbnN0cnVjdGlvbiAqTmV3OworICAgICAgICAgIGlmIChJbnNlcnRlZEJsb2Nrcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgSS5yZW1vdmVGcm9tUGFyZW50KCk7CisgICAgICAgICAgICBFeGl0QmxvY2stPmdldEluc3RMaXN0KCkuaW5zZXJ0KEluc2VydFB0LCAmSSk7CisgICAgICAgICAgICBOZXcgPSAmSTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTmV3ID0gSS5jbG9uZSgpOworICAgICAgICAgICAgQ3VyQVNULT5jb3B5VmFsdWUoJkksIE5ldyk7CisgICAgICAgICAgICBpZiAoIUkuZ2V0TmFtZSgpLmVtcHR5KCkpCisgICAgICAgICAgICAgIE5ldy0+c2V0TmFtZShJLmdldE5hbWUoKSsiLmxlIik7CisgICAgICAgICAgICBFeGl0QmxvY2stPmdldEluc3RMaXN0KCkuaW5zZXJ0KEluc2VydFB0LCBOZXcpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgaW5zZXJ0ZWQgdGhlIGluc3RydWN0aW9uLCBzdG9yZSBpdCBpbnRvIHRoZSBhbGxvY2EKKyAgICAgICAgICBpZiAoQUkpIG5ldyBTdG9yZUluc3QoTmV3LCBBSSwgSW5zZXJ0UHQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGRvZXNuJ3QgZG9taW5hdGUgYW55IGV4aXQgYmxvY2tzLCBpdCBtdXN0IGJlIGRlYWQuCisgICAgaWYgKEluc2VydGVkQmxvY2tzLmVtcHR5KCkpIHsKKyAgICAgIEN1ckFTVC0+ZGVsZXRlVmFsdWUoJkkpOworICAgICAgSS5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICB9CisKKyAgICAvLyBGaW5hbGx5LCBwcm9tb3RlIHRoZSBmaW5lIHZhbHVlIHRvIFNTQSBmb3JtLgorICAgIGlmIChBSSkgeworICAgICAgc3RkOjp2ZWN0b3I8QWxsb2NhSW5zdCo+IEFsbG9jYXM7CisgICAgICBBbGxvY2FzLnB1c2hfYmFjayhBSSk7CisgICAgICBQcm9tb3RlTWVtVG9SZWcoQWxsb2NhcywgKkRULCAqREYsIEN1ckFTVCk7CisgICAgfQorICB9Cit9CisKKy8vLyBob2lzdCAtIFdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMgZm91bmQgdG8gb25seSB1c2UgbG9vcCBpbnZhcmlhbnQgb3BlcmFuZHMKKy8vLyB0aGF0IGlzIHNhZmUgdG8gaG9pc3QsIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkIHRvIGRvIHRoZSBkaXJ0eSB3b3JrLgorLy8vCit2b2lkIExJQ006OmhvaXN0KEluc3RydWN0aW9uICZJKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiTElDTSBob2lzdGluZyB0byAiIDw8IFByZWhlYWRlci0+Z2V0TmFtZSgpIDw8ICI6ICIKKyAgICAgICAgPDwgSSA8PCAiXG4iKTsKKworICAvLyBSZW1vdmUgdGhlIGluc3RydWN0aW9uIGZyb20gaXRzIGN1cnJlbnQgYmFzaWMgYmxvY2suLi4gYnV0IGRvbid0IGRlbGV0ZSB0aGUKKyAgLy8gaW5zdHJ1Y3Rpb24uCisgIEkucmVtb3ZlRnJvbVBhcmVudCgpOworCisgIC8vIEluc2VydCB0aGUgbmV3IG5vZGUgaW4gUHJlaGVhZGVyLCBiZWZvcmUgdGhlIHRlcm1pbmF0b3IuCisgIFByZWhlYWRlci0+Z2V0SW5zdExpc3QoKS5pbnNlcnQoUHJlaGVhZGVyLT5nZXRUZXJtaW5hdG9yKCksICZJKTsKKworICBpZiAoaXNhPExvYWRJbnN0PihJKSkgKytOdW1Nb3ZlZExvYWRzOworICBlbHNlIGlmIChpc2E8Q2FsbEluc3Q+KEkpKSArK051bU1vdmVkQ2FsbHM7CisgICsrTnVtSG9pc3RlZDsKKyAgQ2hhbmdlZCA9IHRydWU7Cit9CisKKy8vLyBpc1NhZmVUb0V4ZWN1dGVVbmNvbmRpdGlvbmFsbHkgLSBPbmx5IHNpbmsgb3IgaG9pc3QgYW4gaW5zdHJ1Y3Rpb24gaWYgaXQgaXMKKy8vLyBub3QgYSB0cmFwcGluZyBpbnN0cnVjdGlvbiBvciBpZiBpdCBpcyBhIHRyYXBwaW5nIGluc3RydWN0aW9uIGFuZCBpcworLy8vIGd1YXJhbnRlZWQgdG8gZXhlY3V0ZS4KKy8vLworYm9vbCBMSUNNOjppc1NhZmVUb0V4ZWN1dGVVbmNvbmRpdGlvbmFsbHkoSW5zdHJ1Y3Rpb24gJkluc3QpIHsKKyAgLy8gSWYgaXQgaXMgbm90IGEgdHJhcHBpbmcgaW5zdHJ1Y3Rpb24sIGl0IGlzIGFsd2F5cyBzYWZlIHRvIGhvaXN0LgorICBpZiAoSW5zdC5pc1NhZmVUb1NwZWN1bGF0aXZlbHlFeGVjdXRlKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gT3RoZXJ3aXNlIHdlIGhhdmUgdG8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGluc3RydWN0aW9uIGRvbWluYXRlcyBhbGwKKyAgLy8gb2YgdGhlIGV4aXQgYmxvY2tzLiAgSWYgaXQgZG9lc24ndCwgdGhlbiB0aGVyZSBpcyBhIHBhdGggb3V0IG9mIHRoZSBsb29wCisgIC8vIHdoaWNoIGRvZXMgbm90IGV4ZWN1dGUgdGhpcyBpbnN0cnVjdGlvbiwgc28gd2UgY2FuJ3QgaG9pc3QgaXQuCisKKyAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGlzIGluIHRoZSBoZWFkZXIgYmxvY2sgZm9yIHRoZSBsb29wICh3aGljaCBpcyB2ZXJ5CisgIC8vIGNvbW1vbiksIGl0IGlzIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvbWluYXRlIHRoZSBleGl0IGJsb2Nrcy4gIFNpbmNlIHRoaXMKKyAgLy8gaXMgYSBjb21tb24gY2FzZSwgYW5kIGNhbiBzYXZlIHNvbWUgd29yaywgY2hlY2sgaXQgbm93LgorICBpZiAoSW5zdC5nZXRQYXJlbnQoKSA9PSBDdXJMb29wLT5nZXRIZWFkZXIoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBHZXQgdGhlIGV4aXQgYmxvY2tzIGZvciB0aGUgY3VycmVudCBsb29wLgorICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgOD4gRXhpdEJsb2NrczsKKyAgQ3VyTG9vcC0+Z2V0RXhpdEJsb2NrcyhFeGl0QmxvY2tzKTsKKworICAvLyBGb3IgZWFjaCBleGl0IGJsb2NrLCBnZXQgdGhlIERUIG5vZGUgYW5kIHdhbGsgdXAgdGhlIERUIHVudGlsIHRoZQorICAvLyBpbnN0cnVjdGlvbidzIGJhc2ljIGJsb2NrIGlzIGZvdW5kIG9yIHdlIGV4aXQgdGhlIGxvb3AuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBFeGl0QmxvY2tzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFpc0V4aXRCbG9ja0RvbWluYXRlZEJ5QmxvY2tJbkxvb3AoRXhpdEJsb2Nrc1tpXSwgSW5zdC5nZXRQYXJlbnQoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vIFByb21vdGVWYWx1ZXNJbkxvb3AgLSBUcnkgdG8gcHJvbW90ZSBtZW1vcnkgdmFsdWVzIHRvIHNjYWxhcnMgYnkgc2lua2luZworLy8vIHN0b3JlcyBvdXQgb2YgdGhlIGxvb3AgYW5kIG1vdmluZyBsb2FkcyB0byBiZWZvcmUgdGhlIGxvb3AuICBXZSBkbyB0aGlzIGJ5CisvLy8gbG9vcGluZyBvdmVyIHRoZSBzdG9yZXMgaW4gdGhlIGxvb3AsIGxvb2tpbmcgZm9yIHN0b3JlcyB0byBNdXN0IHBvaW50ZXJzCisvLy8gd2hpY2ggYXJlIGxvb3AgaW52YXJpYW50LiAgV2UgcHJvbW90ZSB0aGVzZSBtZW1vcnkgbG9jYXRpb25zIHRvIHVzZSBhbGxvY2FzCisvLy8gaW5zdGVhZC4gIFRoZXNlIGFsbG9jYXMgY2FuIGVhc2lseSBiZSByYWlzZWQgdG8gcmVnaXN0ZXIgdmFsdWVzIGJ5IHRoZQorLy8vIFByb21vdGVNZW0yUmVnIGZ1bmN0aW9uYWxpdHkuCisvLy8KK3ZvaWQgTElDTTo6UHJvbW90ZVZhbHVlc0luTG9vcCgpIHsKKyAgLy8gUHJvbW90ZWRWYWx1ZXMgLSBMaXN0IG9mIHZhbHVlcyB0aGF0IGFyZSBwcm9tb3RlZCBvdXQgb2YgdGhlIGxvb3AuICBFYWNoCisgIC8vIHZhbHVlIGhhcyBhbiBhbGxvY2EgaW5zdHJ1Y3Rpb24gZm9yIGl0LCBhbmQgYSBjYW5vbmljYWwgdmVyc2lvbiBvZiB0aGUKKyAgLy8gcG9pbnRlci4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEFsbG9jYUluc3QqLCBWYWx1ZSo+ID4gUHJvbW90ZWRWYWx1ZXM7CisgIHN0ZDo6bWFwPFZhbHVlKiwgQWxsb2NhSW5zdCo+IFZhbHVlVG9BbGxvY2FNYXA7IC8vIE1hcCBvZiBwdHIgdG8gYWxsb2NhCisKKyAgRmluZFByb21vdGFibGVWYWx1ZXNJbkxvb3AoUHJvbW90ZWRWYWx1ZXMsIFZhbHVlVG9BbGxvY2FNYXApOworICBpZiAoVmFsdWVUb0FsbG9jYU1hcC5lbXB0eSgpKSByZXR1cm47ICAgLy8gSWYgdGhlcmUgYXJlIHZhbHVlcyB0byBwcm9tb3RlLgorCisgIENoYW5nZWQgPSB0cnVlOworICBOdW1Qcm9tb3RlZCArPSBQcm9tb3RlZFZhbHVlcy5zaXplKCk7CisKKyAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBQb2ludGVyVmFsdWVOdW1iZXJzOworCisgIC8vIEVtaXQgYSBjb3B5IGZyb20gdGhlIHZhbHVlIGludG8gdGhlIGFsbG9jYSdkIHZhbHVlIGluIHRoZSBsb29wIHByZWhlYWRlcgorICBUZXJtaW5hdG9ySW5zdCAqTG9vcFByZWRJbnN0ID0gUHJlaGVhZGVyLT5nZXRUZXJtaW5hdG9yKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcm9tb3RlZFZhbHVlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgVmFsdWUgKlB0ciA9IFByb21vdGVkVmFsdWVzW2ldLnNlY29uZDsKKworICAgIC8vIElmIHdlIGFyZSBwcm9tb3RpbmcgYSBwb2ludGVyIHZhbHVlLCB1cGRhdGUgYWxpYXMgaW5mb3JtYXRpb24gZm9yIHRoZQorICAgIC8vIGluc2VydGVkIGxvYWQuCisgICAgVmFsdWUgKkxvYWRWYWx1ZSA9IDA7CisgICAgaWYgKGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNQb2ludGVyVHkoKSkgeworICAgICAgLy8gTG9jYXRlIGEgbG9hZCBvciBzdG9yZSB0aHJvdWdoIHRoZSBwb2ludGVyLCBhbmQgYXNzaWduIHRoZSBzYW1lIHZhbHVlCisgICAgICAvLyB0byBMSSBhcyB3ZSBhcmUgbG9hZGluZyBvciBzdG9yaW5nLiAgU2luY2Ugd2Uga25vdyB0aGF0IHRoZSB2YWx1ZSBpcworICAgICAgLy8gc3RvcmVkIGluIHRoaXMgbG9vcCwgdGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkLgorICAgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gUHRyLT51c2VfYmVnaW4oKSwgRSA9IFB0ci0+dXNlX2VuZCgpOworICAgICAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgICAgIFVzZXIgKlUgPSAqVUk7CisgICAgICAgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oVSkpIHsKKyAgICAgICAgICBMb2FkVmFsdWUgPSBMSTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihVKSkgeworICAgICAgICAgIGlmIChTSS0+Z2V0T3BlcmFuZCgxKSA9PSBQdHIpIHsKKyAgICAgICAgICAgIExvYWRWYWx1ZSA9IFNJLT5nZXRPcGVyYW5kKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBhc3NlcnQoTG9hZFZhbHVlICYmICJObyBzdG9yZSB0aHJvdWdoIHRoZSBwb2ludGVyIGZvdW5kISIpOworICAgICAgUG9pbnRlclZhbHVlTnVtYmVycy5wdXNoX2JhY2soTG9hZFZhbHVlKTsgIC8vIFJlbWVtYmVyIHRoaXMgZm9yIGxhdGVyLgorICAgIH0KKworICAgIC8vIExvYWQgZnJvbSB0aGUgbWVtb3J5IHdlIGFyZSBwcm9tb3RpbmcuCisgICAgTG9hZEluc3QgKkxJID0gbmV3IExvYWRJbnN0KFB0ciwgTG9vcFByZWRJbnN0KTsKKworICAgIGlmIChMb2FkVmFsdWUpIEN1ckFTVC0+Y29weVZhbHVlKExvYWRWYWx1ZSwgTEkpOworCisgICAgLy8gU3RvcmUgaW50byB0aGUgdGVtcG9yYXJ5IGFsbG9jYS4KKyAgICBuZXcgU3RvcmVJbnN0KExJLCBQcm9tb3RlZFZhbHVlc1tpXS5maXJzdCwgTG9vcFByZWRJbnN0KTsKKyAgfQorCisgIC8vIFNjYW4gdGhlIGJhc2ljIGJsb2NrcyBpbiB0aGUgbG9vcCwgcmVwbGFjaW5nIHVzZXMgb2Ygb3VyIHBvaW50ZXJzIHdpdGgKKyAgLy8gdXNlcyBvZiB0aGUgYWxsb2NhcyBpbiBxdWVzdGlvbi4KKyAgLy8KKyAgZm9yIChMb29wOjpibG9ja19pdGVyYXRvciBJID0gQ3VyTG9vcC0+YmxvY2tfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBDdXJMb29wLT5ibG9ja19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBCYXNpY0Jsb2NrICpCQiA9ICpJOworICAgIC8vIFJld3JpdGUgYWxsIGxvYWRzIGFuZCBzdG9yZXMgaW4gdGhlIGJsb2NrIG9mIHRoZSBwb2ludGVyLi4uCisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBJSSAhPSBFOyArK0lJKSB7CisgICAgICBpZiAoTG9hZEluc3QgKkwgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSUkpKSB7CisgICAgICAgIHN0ZDo6bWFwPFZhbHVlKiwgQWxsb2NhSW5zdCo+OjppdGVyYXRvcgorICAgICAgICAgIEkgPSBWYWx1ZVRvQWxsb2NhTWFwLmZpbmQoTC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICAgIGlmIChJICE9IFZhbHVlVG9BbGxvY2FNYXAuZW5kKCkpCisgICAgICAgICAgTC0+c2V0T3BlcmFuZCgwLCBJLT5zZWNvbmQpOyAgICAvLyBSZXdyaXRlIGxvYWQgaW5zdHJ1Y3Rpb24uLi4KKyAgICAgIH0gZWxzZSBpZiAoU3RvcmVJbnN0ICpTID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihJSSkpIHsKKyAgICAgICAgc3RkOjptYXA8VmFsdWUqLCBBbGxvY2FJbnN0Kj46Oml0ZXJhdG9yCisgICAgICAgICAgSSA9IFZhbHVlVG9BbGxvY2FNYXAuZmluZChTLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgaWYgKEkgIT0gVmFsdWVUb0FsbG9jYU1hcC5lbmQoKSkKKyAgICAgICAgICBTLT5zZXRPcGVyYW5kKDEsIEktPnNlY29uZCk7ICAgIC8vIFJld3JpdGUgc3RvcmUgaW5zdHJ1Y3Rpb24uLi4KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBOb3cgdGhhdCB0aGUgYm9keSBvZiB0aGUgbG9vcCB1c2VzIHRoZSBhbGxvY2FzIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsCisgIC8vIG1lbW9yeSBsb2NhdGlvbnMsIGluc2VydCBjb2RlIHRvIGNvcHkgdGhlIGFsbG9jYSB2YWx1ZSBiYWNrIGludG8gdGhlCisgIC8vIG9yaWdpbmFsIG1lbW9yeSBsb2NhdGlvbiBvbiBhbGwgZXhpdHMgZnJvbSB0aGUgbG9vcC4gIE5vdGUgdGhhdCB3ZSBvbmx5CisgIC8vIHdhbnQgdG8gaW5zZXJ0IG9uZSBjb3B5IG9mIHRoZSBjb2RlIGluIGVhY2ggZXhpdCBibG9jaywgdGhvdWdoIHRoZSBsb29wIG1heQorICAvLyBleGl0IHRvIHRoZSBzYW1lIGJsb2NrIG1vcmUgdGhhbiBvbmNlLgorICAvLworICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgMTY+IFByb2Nlc3NlZEJsb2NrczsKKworICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgOD4gRXhpdEJsb2NrczsKKyAgQ3VyTG9vcC0+Z2V0RXhpdEJsb2NrcyhFeGl0QmxvY2tzKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEV4aXRCbG9ja3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmICghUHJvY2Vzc2VkQmxvY2tzLmluc2VydChFeGl0QmxvY2tzW2ldKSkKKyAgICAgIGNvbnRpbnVlOworICAKKyAgICAvLyBDb3B5IGFsbCBvZiB0aGUgYWxsb2NhcyBpbnRvIHRoZWlyIG1lbW9yeSBsb2NhdGlvbnMuCisgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQkkgPSBFeGl0QmxvY2tzW2ldLT5nZXRGaXJzdE5vblBISSgpOworICAgIEluc3RydWN0aW9uICpJbnNlcnRQb3MgPSBCSTsKKyAgICB1bnNpZ25lZCBQVk4gPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcm9tb3RlZFZhbHVlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAvLyBMb2FkIGZyb20gdGhlIGFsbG9jYS4KKyAgICAgIExvYWRJbnN0ICpMSSA9IG5ldyBMb2FkSW5zdChQcm9tb3RlZFZhbHVlc1tpXS5maXJzdCwgSW5zZXJ0UG9zKTsKKworICAgICAgLy8gSWYgdGhpcyBpcyBhIHBvaW50ZXIgdHlwZSwgdXBkYXRlIGFsaWFzIGluZm8gYXBwcm9wcmlhdGVseS4KKyAgICAgIGlmIChMSS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgICBDdXJBU1QtPmNvcHlWYWx1ZShQb2ludGVyVmFsdWVOdW1iZXJzW1BWTisrXSwgTEkpOworCisgICAgICAvLyBTdG9yZSBpbnRvIHRoZSBtZW1vcnkgd2UgcHJvbW90ZWQuCisgICAgICBuZXcgU3RvcmVJbnN0KExJLCBQcm9tb3RlZFZhbHVlc1tpXS5zZWNvbmQsIEluc2VydFBvcyk7CisgICAgfQorICB9CisKKyAgLy8gTm93IHRoYXQgd2UgaGF2ZSBkb25lIHRoZSBkZWVkLCB1c2UgdGhlIG1lbTJyZWcgZnVuY3Rpb25hbGl0eSB0byBwcm9tb3RlCisgIC8vIGFsbCBvZiB0aGUgbmV3IGFsbG9jYXMgd2UganVzdCBjcmVhdGVkIGludG8gcmVhbCBTU0EgcmVnaXN0ZXJzLgorICAvLworICBzdGQ6OnZlY3RvcjxBbGxvY2FJbnN0Kj4gUHJvbW90ZWRBbGxvY2FzOworICBQcm9tb3RlZEFsbG9jYXMucmVzZXJ2ZShQcm9tb3RlZFZhbHVlcy5zaXplKCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUHJvbW90ZWRWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBQcm9tb3RlZEFsbG9jYXMucHVzaF9iYWNrKFByb21vdGVkVmFsdWVzW2ldLmZpcnN0KTsKKyAgUHJvbW90ZU1lbVRvUmVnKFByb21vdGVkQWxsb2NhcywgKkRULCAqREYsIEN1ckFTVCk7Cit9CisKKy8vLyBGaW5kUHJvbW90YWJsZVZhbHVlc0luTG9vcCAtIENoZWNrIHRoZSBjdXJyZW50IGxvb3AgZm9yIHN0b3JlcyB0byBkZWZpbml0ZQorLy8vIHBvaW50ZXJzLCB3aGljaCBhcmUgbm90IGxvYWRlZCBhbmQgc3RvcmVkIHRocm91Z2ggbWF5IGFsaWFzZXMgYW5kIGFyZSBzYWZlCisvLy8gZm9yIHByb21vdGlvbi4gIElmIHRoZXNlIGFyZSBmb3VuZCwgY3JlYXRlIGFuIGFsbG9jYSBmb3IgdGhlIHZhbHVlLCBhZGQgaXQgCisvLy8gdG8gdGhlIFByb21vdGVkVmFsdWVzIGxpc3QsIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSBtYXBwaW5nIGZyb20gdmFsdWUgdG8gCisvLy8gYWxsb2NhLiAKK3ZvaWQgTElDTTo6RmluZFByb21vdGFibGVWYWx1ZXNJbkxvb3AoCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEFsbG9jYUluc3QqLCBWYWx1ZSo+ID4gJlByb21vdGVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxWYWx1ZSosIEFsbG9jYUluc3QqPiAmVmFsdWVUb0FsbG9jYU1hcCkgeworICBJbnN0cnVjdGlvbiAqRm5TdGFydCA9IEN1ckxvb3AtPmdldEhlYWRlcigpLT5nZXRQYXJlbnQoKS0+YmVnaW4oKS0+YmVnaW4oKTsKKworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBhbGlhcyBzZXRzIGluIHRoZSB0cmFja2VyIG9iamVjdC4KKyAgZm9yIChBbGlhc1NldFRyYWNrZXI6Oml0ZXJhdG9yIEkgPSBDdXJBU1QtPmJlZ2luKCksIEUgPSBDdXJBU1QtPmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgQWxpYXNTZXQgJkFTID0gKkk7CisgICAgLy8gV2UgY2FuIHByb21vdGUgdGhpcyBhbGlhcyBzZXQgaWYgaXQgaGFzIGEgc3RvcmUsIGlmIGl0IGlzIGEgIk11c3QiIGFsaWFzCisgICAgLy8gc2V0LCBpZiB0aGUgcG9pbnRlciBpcyBsb29wIGludmFyaWFudCwgYW5kIGlmIHdlIGFyZSBub3QgZWxpbWluYXRpbmcgYW55CisgICAgLy8gdm9sYXRpbGUgbG9hZHMgb3Igc3RvcmVzLgorICAgIGlmIChBUy5pc0ZvcndhcmRpbmdBbGlhc1NldCgpIHx8ICFBUy5pc01vZCgpIHx8ICFBUy5pc011c3RBbGlhcygpIHx8CisgICAgICAgIEFTLmlzVm9sYXRpbGUoKSB8fCAhQ3VyTG9vcC0+aXNMb29wSW52YXJpYW50KEFTLmJlZ2luKCktPmdldFZhbHVlKCkpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgYXNzZXJ0KCFBUy5lbXB0eSgpICYmCisgICAgICAgICAgICJNdXN0IGFsaWFzIHNldCBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgcG9pbnRlciBlbGVtZW50IGluIGl0ISIpOworICAgIFZhbHVlICpWID0gQVMuYmVnaW4oKS0+Z2V0VmFsdWUoKTsKKworICAgIC8vIENoZWNrIHRoYXQgYWxsIG9mIHRoZSBwb2ludGVycyBpbiB0aGUgYWxpYXMgc2V0IGhhdmUgdGhlIHNhbWUgdHlwZS4gIFdlCisgICAgLy8gY2Fubm90ICh5ZXQpIHByb21vdGUgYSBtZW1vcnkgbG9jYXRpb24gdGhhdCBpcyBsb2FkZWQgYW5kIHN0b3JlZCBpbgorICAgIC8vIGRpZmZlcmVudCBzaXplcy4KKyAgICB7CisgICAgICBib29sIFBvaW50ZXJPayA9IHRydWU7CisgICAgICBmb3IgKEFsaWFzU2V0OjppdGVyYXRvciBJID0gQVMuYmVnaW4oKSwgRSA9IEFTLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgaWYgKFYtPmdldFR5cGUoKSAhPSBJLT5nZXRWYWx1ZSgpLT5nZXRUeXBlKCkpIHsKKyAgICAgICAgICBQb2ludGVyT2sgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgaWYgKCFQb2ludGVyT2spCisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIEl0IGlzbid0IHNhZmUgdG8gcHJvbW90ZSBhIGxvYWQvc3RvcmUgZnJvbSB0aGUgbG9vcCBpZiB0aGUgbG9hZC9zdG9yZSBpcworICAgIC8vIGNvbmRpdGlvbmFsLiAgRm9yIGV4YW1wbGUsIHR1cm5pbmc6CisgICAgLy8KKyAgICAvLyAgICBmb3IgKCkgeyBpZiAoYykgKlAgKz0gMTsgfQorICAgIC8vCisgICAgLy8gaW50bzoKKyAgICAvLworICAgIC8vICAgIHRtcCA9ICpQOyAgZm9yICgpIHsgaWYgKGMpIHRtcCArPTE7IH0gKlAgPSB0bXA7CisgICAgLy8KKyAgICAvLyBpcyBub3Qgc2FmZSwgYmVjYXVzZSAqUCBtYXkgb25seSBiZSB2YWxpZCB0byBhY2Nlc3MgaWYgJ2MnIGlzIHRydWUuCisgICAgLy8gCisgICAgLy8gSXQgaXMgc2FmZSB0byBwcm9tb3RlIFAgaWYgYWxsIHVzZXMgYXJlIGRpcmVjdCBsb2FkL3N0b3JlcyBhbmQgaWYgYXQKKyAgICAvLyBsZWFzdCBvbmUgaXMgZ3VhcmFudGVlZCB0byBiZSBleGVjdXRlZC4KKyAgICBib29sIEd1YXJhbnRlZWRUb0V4ZWN1dGUgPSBmYWxzZTsKKyAgICBib29sIEludmFsaWRJbnN0ID0gZmFsc2U7CisgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gVi0+dXNlX2JlZ2luKCksIFVFID0gVi0+dXNlX2VuZCgpOworICAgICAgICAgVUkgIT0gVUU7ICsrVUkpIHsKKyAgICAgIC8vIElnbm9yZSBpbnN0cnVjdGlvbnMgbm90IGluIHRoaXMgbG9vcC4KKyAgICAgIEluc3RydWN0aW9uICpVc2UgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKyAgICAgIGlmICghVXNlIHx8ICFDdXJMb29wLT5jb250YWlucyhVc2UpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKCFpc2E8TG9hZEluc3Q+KFVzZSkgJiYgIWlzYTxTdG9yZUluc3Q+KFVzZSkpIHsKKyAgICAgICAgSW52YWxpZEluc3QgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFHdWFyYW50ZWVkVG9FeGVjdXRlKQorICAgICAgICBHdWFyYW50ZWVkVG9FeGVjdXRlID0gaXNTYWZlVG9FeGVjdXRlVW5jb25kaXRpb25hbGx5KCpVc2UpOworICAgIH0KKworICAgIC8vIElmIHRoZXJlIGlzIGFuIG5vbi1sb2FkL3N0b3JlIGluc3RydWN0aW9uIGluIHRoZSBsb29wLCB3ZSBjYW4ndCBwcm9tb3RlCisgICAgLy8gaXQuICBJZiB0aGVyZSBpc24ndCBhIGd1YXJhbnRlZWQtdG8tZXhlY3V0ZSBpbnN0cnVjdGlvbiwgd2UgY2FuJ3QKKyAgICAvLyBwcm9tb3RlLgorICAgIGlmIChJbnZhbGlkSW5zdCB8fCAhR3VhcmFudGVlZFRvRXhlY3V0ZSkKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIGNvbnN0IFR5cGUgKlR5ID0gY2FzdDxQb2ludGVyVHlwZT4oVi0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICBBbGxvY2FJbnN0ICpBSSA9IG5ldyBBbGxvY2FJbnN0KFR5LCAwLCBGblN0YXJ0KTsKKyAgICBQcm9tb3RlZFZhbHVlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQUksIFYpKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgQVNUIGFuZCBhbGlhcyBhbmFseXNpcy4KKyAgICBDdXJBU1QtPmNvcHlWYWx1ZShWLCBBSSk7CisKKyAgICBmb3IgKEFsaWFzU2V0OjppdGVyYXRvciBJID0gQVMuYmVnaW4oKSwgRSA9IEFTLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIFZhbHVlVG9BbGxvY2FNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEktPmdldFZhbHVlKCksIEFJKSk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIkxJQ006IFByb21vdGluZyB2YWx1ZTogIiA8PCAqViA8PCAiXG4iKTsKKyAgfQorfQorCisvLy8gY2xvbmVCYXNpY0Jsb2NrQW5hbHlzaXMgLSBTaW1wbGUgQW5hbHlzaXMgaG9vay4gQ2xvbmUgYWxpYXMgc2V0IGluZm8uCit2b2lkIExJQ006OmNsb25lQmFzaWNCbG9ja0FuYWx5c2lzKEJhc2ljQmxvY2sgKkZyb20sIEJhc2ljQmxvY2sgKlRvLCBMb29wICpMKSB7CisgIEFsaWFzU2V0VHJhY2tlciAqQVNUID0gTG9vcFRvQWxpYXNNYXBbTF07CisgIGlmICghQVNUKQorICAgIHJldHVybjsKKworICBBU1QtPmNvcHlWYWx1ZShGcm9tLCBUbyk7Cit9CisKKy8vLyBkZWxldGVBbmFseXNpc1ZhbHVlIC0gU2ltcGxlIEFuYWx5c2lzIGhvb2suIERlbGV0ZSB2YWx1ZSBWIGZyb20gYWxpYXMKKy8vLyBzZXQuCit2b2lkIExJQ006OmRlbGV0ZUFuYWx5c2lzVmFsdWUoVmFsdWUgKlYsIExvb3AgKkwpIHsKKyAgQWxpYXNTZXRUcmFja2VyICpBU1QgPSBMb29wVG9BbGlhc01hcFtMXTsKKyAgaWYgKCFBU1QpCisgICAgcmV0dXJuOworCisgIEFTVC0+ZGVsZXRlVmFsdWUoVik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFN0cmVuZ3RoUmVkdWNlLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wU3RyZW5ndGhSZWR1Y2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzQzZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFN0cmVuZ3RoUmVkdWNlLmNwcApAQCAtMCwwICsxLDM3ODQgQEAKKy8vPT09LSBMb29wU3RyZW5ndGhSZWR1Y2UuY3BwIC0gU3RyZW5ndGggUmVkdWNlIElWcyBpbiBMb29wcyAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0cmFuc2Zvcm1hdGlvbiBhbmFseXplcyBhbmQgdHJhbnNmb3JtcyB0aGUgaW5kdWN0aW9uIHZhcmlhYmxlcyAoYW5kCisvLyBjb21wdXRhdGlvbnMgZGVyaXZlZCBmcm9tIHRoZW0pIGludG8gZm9ybXMgc3VpdGFibGUgZm9yIGVmZmljaWVudCBleGVjdXRpb24KKy8vIG9uIHRoZSB0YXJnZXQuCisvLworLy8gVGhpcyBwYXNzIHBlcmZvcm1zIGEgc3RyZW5ndGggcmVkdWN0aW9uIG9uIGFycmF5IHJlZmVyZW5jZXMgaW5zaWRlIGxvb3BzIHRoYXQKKy8vIGhhdmUgYXMgb25lIG9yIG1vcmUgb2YgdGhlaXIgY29tcG9uZW50cyB0aGUgbG9vcCBpbmR1Y3Rpb24gdmFyaWFibGUsIGl0CisvLyByZXdyaXRlcyBleHByZXNzaW9ucyB0byB0YWtlIGFkdmFudGFnZSBvZiBzY2FsZWQtaW5kZXggYWRkcmVzc2luZyBtb2RlcworLy8gYXZhaWxhYmxlIG9uIHRoZSB0YXJnZXQsIGFuZCBpdCBwZXJmb3JtcyBhIHZhcmlldHkgb2Ygb3RoZXIgb3B0aW1pemF0aW9ucworLy8gcmVsYXRlZCB0byBsb29wIGluZHVjdGlvbiB2YXJpYWJsZXMuCisvLworLy8gVGVybWlub2xvZ3kgbm90ZTogdGhpcyBjb2RlIGhhcyBhIGxvdCBvZiBoYW5kbGluZyBmb3IgInBvc3QtaW5jcmVtZW50IiBvcgorLy8gInBvc3QtaW5jIiB1c2Vycy4gVGhpcyBpcyBub3QgdGFsa2luZyBhYm91dCBwb3N0LWluY3JlbWVudCBhZGRyZXNzaW5nIG1vZGVzOworLy8gaXQgaXMgaW5zdGVhZCB0YWxraW5nIGFib3V0IGNvZGUgbGlrZSB0aGlzOgorLy8KKy8vICAgJWkgPSBwaGkgWyAwLCAlZW50cnkgXSwgWyAlaS5uZXh0LCAlbGF0Y2ggXQorLy8gICAuLi4KKy8vICAgJWkubmV4dCA9IGFkZCAlaSwgMQorLy8gICAlYyA9IGljbXAgZXEgJWkubmV4dCwgJW4KKy8vCisvLyBUaGUgU0NFViBmb3IgJWkgaXMgezAsKywxfTwlTD4uIFRoZSBTQ0VWIGZvciAlaS5uZXh0IGlzIHsxLCssMX08JUw+LCBob3dldmVyCisvLyBpdCdzIHVzZWZ1bCB0byB0aGluayBhYm91dCB0aGVzZSBhcyB0aGUgc2FtZSByZWdpc3Rlciwgd2l0aCBzb21lIHVzZXMgdXNpbmcKKy8vIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgYmVmb3JlIHRoZSBhZGQgYW5kIHNvbWUgdXNpbmcgLy8gaXQgYWZ0ZXIuIEluIHRoaXMKKy8vIGV4YW1wbGUsIHRoZSBpY21wIGlzIGEgcG9zdC1pbmNyZW1lbnQgdXNlciwgc2luY2UgaXQgdXNlcyAlaS5uZXh0LCB3aGljaCBpcworLy8gdGhlIHZhbHVlIG9mIHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUgYWZ0ZXIgdGhlIGluY3JlbWVudC4gVGhlIG90aGVyIGNvbW1vbgorLy8gY2FzZSBvZiBwb3N0LWluY3JlbWVudCB1c2VycyBpcyB1c2VycyBvdXRzaWRlIHRoZSBsb29wLgorLy8KKy8vIFRPRE86IE1vcmUgc29waGlzdGljYXRpb24gaW4gdGhlIHdheSBGb3JtdWxhZSBhcmUgZ2VuZXJhdGVkIGFuZCBmaWx0ZXJlZC4KKy8vCisvLyBUT0RPOiBIYW5kbGUgbXVsdGlwbGUgbG9vcHMgYXQgYSB0aW1lLgorLy8KKy8vIFRPRE86IFNob3VsZCBUYXJnZXRMb3dlcmluZzo6QWRkck1vZGU6OkJhc2VHViBiZSBjaGFuZ2VkIHRvIGEgQ29uc3RhbnRFeHByCisvLyAgICAgICBpbnN0ZWFkIG9mIGEgR2xvYmFsVmFsdWU/CisvLworLy8gVE9ETzogV2hlbiB0cnVuY2F0aW9uIGlzIGZyZWUsIHRydW5jYXRlIElDbXAgdXNlcnMnIG9wZXJhbmRzIHRvIG1ha2UgaXQgYQorLy8gICAgICAgc21hbGxlciBlbmNvZGluZyAob24geDg2IGF0IGxlYXN0KS4KKy8vCisvLyBUT0RPOiBXaGVuIGEgbmVnYXRlZCByZWdpc3RlciBpcyB1c2VkIGJ5IGFuIGFkZCAoc3VjaCBhcyBpbiBhIGxpc3Qgb2YKKy8vICAgICAgIG11bHRpcGxlIGJhc2UgcmVnaXN0ZXJzLCBvciBhcyB0aGUgaW5jcmVtZW50IGV4cHJlc3Npb24gaW4gYW4gYWRkcmVjKSwKKy8vICAgICAgIHdlIG1heSBub3QgYWN0dWFsbHkgbmVlZCBib3RoIHJlZyBhbmQgKC0xICogcmVnKSBpbiByZWdpc3RlcnM7IHRoZQorLy8gICAgICAgbmVnYXRpb24gY2FuIGJlIGltcGxlbWVudGVkIGJ5IHVzaW5nIGEgc3ViIGluc3RlYWQgb2YgYW4gYWRkLiBUaGUKKy8vICAgICAgIGxhY2sgb2Ygc3VwcG9ydCBmb3IgdGFraW5nIHRoaXMgaW50byBjb25zaWRlcmF0aW9uIHdoZW4gbWFraW5nCisvLyAgICAgICByZWdpc3RlciBwcmVzc3VyZSBkZWNpc2lvbnMgaXMgcGFydGx5IHdvcmtlZCBhcm91bmQgYnkgdGhlICJTcGVjaWFsIgorLy8gICAgICAgdXNlIGtpbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJsb29wLXJlZHVjZSIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JVlVzZXJzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwYW5kZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvQmFzaWNCbG9ja1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxCaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisKKy8vLyBSZWdTb3J0RGF0YSAtIFRoaXMgY2xhc3MgaG9sZHMgZGF0YSB3aGljaCBpcyB1c2VkIHRvIG9yZGVyIHJldXNlIGNhbmRpZGF0ZXMuCitjbGFzcyBSZWdTb3J0RGF0YSB7CitwdWJsaWM6CisgIC8vLyBVc2VkQnlJbmRpY2VzIC0gVGhpcyByZXByZXNlbnRzIHRoZSBzZXQgb2YgTFNSVXNlIGluZGljZXMgd2hpY2ggcmVmZXJlbmNlCisgIC8vLyBhIHBhcnRpY3VsYXIgcmVnaXN0ZXIuCisgIFNtYWxsQml0VmVjdG9yIFVzZWRCeUluZGljZXM7CisKKyAgUmVnU29ydERhdGEoKSB7fQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCit9CisKK3ZvaWQgUmVnU29ydERhdGE6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBPUyA8PCAiW051bVVzZXM9IiA8PCBVc2VkQnlJbmRpY2VzLmNvdW50KCkgPDwgJ10nOworfQorCit2b2lkIFJlZ1NvcnREYXRhOjpkdW1wKCkgY29uc3QgeworICBwcmludChlcnJzKCkpOyBlcnJzKCkgPDwgJ1xuJzsKK30KKworbmFtZXNwYWNlIHsKKworLy8vIFJlZ1VzZVRyYWNrZXIgLSBNYXAgcmVnaXN0ZXIgY2FuZGlkYXRlcyB0byBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhleSBhcmUKKy8vLyB1c2VkLgorY2xhc3MgUmVnVXNlVHJhY2tlciB7CisgIHR5cGVkZWYgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBSZWdTb3J0RGF0YT4gUmVnVXNlc1R5OworCisgIFJlZ1VzZXNUeSBSZWdVc2VzTWFwOworICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDE2PiBSZWdTZXF1ZW5jZTsKKworcHVibGljOgorICB2b2lkIENvdW50UmVnaXN0ZXIoY29uc3QgU0NFViAqUmVnLCBzaXplX3QgTFVJZHgpOworICB2b2lkIERyb3BSZWdpc3Rlcihjb25zdCBTQ0VWICpSZWcsIHNpemVfdCBMVUlkeCk7CisgIHZvaWQgRHJvcFVzZShzaXplX3QgTFVJZHgpOworCisgIGJvb2wgaXNSZWdVc2VkQnlVc2VzT3RoZXJUaGFuKGNvbnN0IFNDRVYgKlJlZywgc2l6ZV90IExVSWR4KSBjb25zdDsKKworICBjb25zdCBTbWFsbEJpdFZlY3RvciAmZ2V0VXNlZEJ5SW5kaWNlcyhjb25zdCBTQ0VWICpSZWcpIGNvbnN0OworCisgIHZvaWQgY2xlYXIoKTsKKworICB0eXBlZGVmIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gUmVnU2VxdWVuY2UuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIFJlZ1NlcXVlbmNlLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUmVnU2VxdWVuY2UuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsgcmV0dXJuIFJlZ1NlcXVlbmNlLmVuZCgpOyB9Cit9OworCit9CisKK3ZvaWQKK1JlZ1VzZVRyYWNrZXI6OkNvdW50UmVnaXN0ZXIoY29uc3QgU0NFViAqUmVnLCBzaXplX3QgTFVJZHgpIHsKKyAgc3RkOjpwYWlyPFJlZ1VzZXNUeTo6aXRlcmF0b3IsIGJvb2w+IFBhaXIgPQorICAgIFJlZ1VzZXNNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFJlZywgUmVnU29ydERhdGEoKSkpOworICBSZWdTb3J0RGF0YSAmUlNEID0gUGFpci5maXJzdC0+c2Vjb25kOworICBpZiAoUGFpci5zZWNvbmQpCisgICAgUmVnU2VxdWVuY2UucHVzaF9iYWNrKFJlZyk7CisgIFJTRC5Vc2VkQnlJbmRpY2VzLnJlc2l6ZShzdGQ6Om1heChSU0QuVXNlZEJ5SW5kaWNlcy5zaXplKCksIExVSWR4ICsgMSkpOworICBSU0QuVXNlZEJ5SW5kaWNlcy5zZXQoTFVJZHgpOworfQorCit2b2lkCitSZWdVc2VUcmFja2VyOjpEcm9wUmVnaXN0ZXIoY29uc3QgU0NFViAqUmVnLCBzaXplX3QgTFVJZHgpIHsKKyAgUmVnVXNlc1R5OjppdGVyYXRvciBJdCA9IFJlZ1VzZXNNYXAuZmluZChSZWcpOworICBhc3NlcnQoSXQgIT0gUmVnVXNlc01hcC5lbmQoKSk7CisgIFJlZ1NvcnREYXRhICZSU0QgPSBJdC0+c2Vjb25kOworICBhc3NlcnQoUlNELlVzZWRCeUluZGljZXMuc2l6ZSgpID4gTFVJZHgpOworICBSU0QuVXNlZEJ5SW5kaWNlcy5yZXNldChMVUlkeCk7Cit9CisKK3ZvaWQKK1JlZ1VzZVRyYWNrZXI6OkRyb3BVc2Uoc2l6ZV90IExVSWR4KSB7CisgIC8vIFJlbW92ZSB0aGUgdXNlIGluZGV4IGZyb20gZXZlcnkgcmVnaXN0ZXIncyB1c2UgbGlzdC4KKyAgZm9yIChSZWdVc2VzVHk6Oml0ZXJhdG9yIEkgPSBSZWdVc2VzTWFwLmJlZ2luKCksIEUgPSBSZWdVc2VzTWFwLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIEktPnNlY29uZC5Vc2VkQnlJbmRpY2VzLnJlc2V0KExVSWR4KTsKK30KKworYm9vbAorUmVnVXNlVHJhY2tlcjo6aXNSZWdVc2VkQnlVc2VzT3RoZXJUaGFuKGNvbnN0IFNDRVYgKlJlZywgc2l6ZV90IExVSWR4KSBjb25zdCB7CisgIGlmICghUmVnVXNlc01hcC5jb3VudChSZWcpKSByZXR1cm4gZmFsc2U7CisgIGNvbnN0IFNtYWxsQml0VmVjdG9yICZVc2VkQnlJbmRpY2VzID0KKyAgICBSZWdVc2VzTWFwLmZpbmQoUmVnKS0+c2Vjb25kLlVzZWRCeUluZGljZXM7CisgIGludCBpID0gVXNlZEJ5SW5kaWNlcy5maW5kX2ZpcnN0KCk7CisgIGlmIChpID09IC0xKSByZXR1cm4gZmFsc2U7CisgIGlmICgoc2l6ZV90KWkgIT0gTFVJZHgpIHJldHVybiB0cnVlOworICByZXR1cm4gVXNlZEJ5SW5kaWNlcy5maW5kX25leHQoaSkgIT0gLTE7Cit9CisKK2NvbnN0IFNtYWxsQml0VmVjdG9yICZSZWdVc2VUcmFja2VyOjpnZXRVc2VkQnlJbmRpY2VzKGNvbnN0IFNDRVYgKlJlZykgY29uc3QgeworICBSZWdVc2VzVHk6OmNvbnN0X2l0ZXJhdG9yIEkgPSBSZWdVc2VzTWFwLmZpbmQoUmVnKTsKKyAgYXNzZXJ0KEkgIT0gUmVnVXNlc01hcC5lbmQoKSAmJiAiVW5rbm93biByZWdpc3RlciEiKTsKKyAgcmV0dXJuIEktPnNlY29uZC5Vc2VkQnlJbmRpY2VzOworfQorCit2b2lkIFJlZ1VzZVRyYWNrZXI6OmNsZWFyKCkgeworICBSZWdVc2VzTWFwLmNsZWFyKCk7CisgIFJlZ1NlcXVlbmNlLmNsZWFyKCk7Cit9CisKK25hbWVzcGFjZSB7CisKKy8vLyBGb3JtdWxhIC0gVGhpcyBjbGFzcyBob2xkcyBpbmZvcm1hdGlvbiB0aGF0IGRlc2NyaWJlcyBhIGZvcm11bGEgZm9yCisvLy8gY29tcHV0aW5nIHNhdGlzZnlpbmcgYSB1c2UuIEl0IG1heSBpbmNsdWRlIGJyb2tlbi1vdXQgaW1tZWRpYXRlcyBhbmQgc2NhbGVkCisvLy8gcmVnaXN0ZXJzLgorc3RydWN0IEZvcm11bGEgeworICAvLy8gQU0gLSBUaGlzIGlzIHVzZWQgdG8gcmVwcmVzZW50IGNvbXBsZXggYWRkcmVzc2luZywgYXMgd2VsbCBhcyBvdGhlciBraW5kcworICAvLy8gb2YgaW50ZXJlc3RpbmcgdXNlcy4KKyAgVGFyZ2V0TG93ZXJpbmc6OkFkZHJNb2RlIEFNOworCisgIC8vLyBCYXNlUmVncyAtIFRoZSBsaXN0IG9mICJiYXNlIiByZWdpc3RlcnMgZm9yIHRoaXMgdXNlLiBXaGVuIHRoaXMgaXMKKyAgLy8vIG5vbi1lbXB0eSwgQU0uSGFzQmFzZVJlZyBzaG91bGQgYmUgc2V0IHRvIHRydWUuCisgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gQmFzZVJlZ3M7CisKKyAgLy8vIFNjYWxlZFJlZyAtIFRoZSAnc2NhbGVkJyByZWdpc3RlciBmb3IgdGhpcyB1c2UuIFRoaXMgc2hvdWxkIGJlIG5vbi1udWxsCisgIC8vLyB3aGVuIEFNLlNjYWxlIGlzIG5vdCB6ZXJvLgorICBjb25zdCBTQ0VWICpTY2FsZWRSZWc7CisKKyAgRm9ybXVsYSgpIDogU2NhbGVkUmVnKDApIHt9CisKKyAgdm9pZCBJbml0aWFsTWF0Y2goY29uc3QgU0NFViAqUywgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSwgRG9taW5hdG9yVHJlZSAmRFQpOworCisgIHVuc2lnbmVkIGdldE51bVJlZ3MoKSBjb25zdDsKKyAgY29uc3QgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0OworCisgIHZvaWQgRGVsZXRlQmFzZVJlZyhjb25zdCBTQ0VWIComUyk7CisKKyAgYm9vbCByZWZlcmVuY2VzUmVnKGNvbnN0IFNDRVYgKlMpIGNvbnN0OworICBib29sIGhhc1JlZ3NVc2VkQnlVc2VzT3RoZXJUaGFuKHNpemVfdCBMVUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdVc2VUcmFja2VyICZSZWdVc2VzKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworfQorCisvLy8gRG9Jbml0aWFsTWF0Y2ggLSBSZWN1cnNpb24gaGVscGVyIGZvciBJbml0aWFsTWF0Y2guCitzdGF0aWMgdm9pZCBEb0luaXRpYWxNYXRjaChjb25zdCBTQ0VWICpTLCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJkdvb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmQmFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSwgRG9taW5hdG9yVHJlZSAmRFQpIHsKKyAgLy8gQ29sbGVjdCBleHByZXNzaW9ucyB3aGljaCBwcm9wZXJseSBkb21pbmF0ZSB0aGUgbG9vcCBoZWFkZXIuCisgIGlmIChTLT5wcm9wZXJseURvbWluYXRlcyhMLT5nZXRIZWFkZXIoKSwgJkRUKSkgeworICAgIEdvb2QucHVzaF9iYWNrKFMpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIExvb2sgYXQgYWRkIG9wZXJhbmRzLgorICBpZiAoY29uc3QgU0NFVkFkZEV4cHIgKkFkZCA9IGR5bl9jYXN0PFNDRVZBZGRFeHByPihTKSkgeworICAgIGZvciAoU0NFVkFkZEV4cHI6Om9wX2l0ZXJhdG9yIEkgPSBBZGQtPm9wX2JlZ2luKCksIEUgPSBBZGQtPm9wX2VuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBEb0luaXRpYWxNYXRjaCgqSSwgTCwgR29vZCwgQmFkLCBTRSwgRFQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIExvb2sgYXQgYWRkcmVjIG9wZXJhbmRzLgorICBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KFMpKQorICAgIGlmICghQVItPmdldFN0YXJ0KCktPmlzWmVybygpKSB7CisgICAgICBEb0luaXRpYWxNYXRjaChBUi0+Z2V0U3RhcnQoKSwgTCwgR29vZCwgQmFkLCBTRSwgRFQpOworICAgICAgRG9Jbml0aWFsTWF0Y2goU0UuZ2V0QWRkUmVjRXhwcihTRS5nZXRDb25zdGFudChBUi0+Z2V0VHlwZSgpLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVItPmdldFN0ZXBSZWN1cnJlbmNlKFNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVItPmdldExvb3AoKSksCisgICAgICAgICAgICAgICAgICAgICBMLCBHb29kLCBCYWQsIFNFLCBEVCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8vIEhhbmRsZSBhIG11bHRpcGxpY2F0aW9uIGJ5IC0xIChuZWdhdGlvbikgaWYgaXQgZGlkbid0IGZvbGQuCisgIGlmIChjb25zdCBTQ0VWTXVsRXhwciAqTXVsID0gZHluX2Nhc3Q8U0NFVk11bEV4cHI+KFMpKQorICAgIGlmIChNdWwtPmdldE9wZXJhbmQoMCktPmlzQWxsT25lc1ZhbHVlKCkpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gT3BzKE11bC0+b3BfYmVnaW4oKSsxLCBNdWwtPm9wX2VuZCgpKTsKKyAgICAgIGNvbnN0IFNDRVYgKk5ld011bCA9IFNFLmdldE11bEV4cHIoT3BzKTsKKworICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiBNeUdvb2Q7CisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IE15QmFkOworICAgICAgRG9Jbml0aWFsTWF0Y2goTmV3TXVsLCBMLCBNeUdvb2QsIE15QmFkLCBTRSwgRFQpOworICAgICAgY29uc3QgU0NFViAqTmVnT25lID0gU0UuZ2V0U0NFVihDb25zdGFudEludDo6Z2V0QWxsT25lc1ZhbHVlKAorICAgICAgICBTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShOZXdNdWwtPmdldFR5cGUoKSkpKTsKKyAgICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBNeUdvb2QuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE15R29vZC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgIEdvb2QucHVzaF9iYWNrKFNFLmdldE11bEV4cHIoTmVnT25lLCAqSSkpOworICAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IE15QmFkLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBNeUJhZC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgIEJhZC5wdXNoX2JhY2soU0UuZ2V0TXVsRXhwcihOZWdPbmUsICpJKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8vIE9rLCB3ZSBjYW4ndCBkbyBhbnl0aGluZyBpbnRlcmVzdGluZy4gSnVzdCBzdHVmZiB0aGUgd2hvbGUgdGhpbmcgaW50byBhCisgIC8vIHJlZ2lzdGVyIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKyAgQmFkLnB1c2hfYmFjayhTKTsKK30KKworLy8vIEluaXRpYWxNYXRjaCAtIEluY29ycG9yYXRlIGxvb3AtdmFyaWFudCBwYXJ0cyBvZiBTIGludG8gdGhpcyBGb3JtdWxhLAorLy8vIGF0dGVtcHRpbmcgdG8ga2VlcCBhbGwgbG9vcC1pbnZhcmlhbnQgYW5kIGxvb3AtY29tcHV0YWJsZSB2YWx1ZXMgaW4gYQorLy8vIHNpbmdsZSBiYXNlIHJlZ2lzdGVyLgordm9pZCBGb3JtdWxhOjpJbml0aWFsTWF0Y2goY29uc3QgU0NFViAqUywgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UsIERvbWluYXRvclRyZWUgJkRUKSB7CisgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gR29vZDsKKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiBCYWQ7CisgIERvSW5pdGlhbE1hdGNoKFMsIEwsIEdvb2QsIEJhZCwgU0UsIERUKTsKKyAgaWYgKCFHb29kLmVtcHR5KCkpIHsKKyAgICBjb25zdCBTQ0VWICpTdW0gPSBTRS5nZXRBZGRFeHByKEdvb2QpOworICAgIGlmICghU3VtLT5pc1plcm8oKSkKKyAgICAgIEJhc2VSZWdzLnB1c2hfYmFjayhTdW0pOworICAgIEFNLkhhc0Jhc2VSZWcgPSB0cnVlOworICB9CisgIGlmICghQmFkLmVtcHR5KCkpIHsKKyAgICBjb25zdCBTQ0VWICpTdW0gPSBTRS5nZXRBZGRFeHByKEJhZCk7CisgICAgaWYgKCFTdW0tPmlzWmVybygpKQorICAgICAgQmFzZVJlZ3MucHVzaF9iYWNrKFN1bSk7CisgICAgQU0uSGFzQmFzZVJlZyA9IHRydWU7CisgIH0KK30KKworLy8vIGdldE51bVJlZ3MgLSBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiByZWdpc3RlciBvcGVyYW5kcyB1c2VkIGJ5IHRoaXMKKy8vLyBmb3JtdWxhLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgcmVnaXN0ZXIgdXNlcyBpbXBsaWVkIGJ5IG5vbi1jb25zdGFudAorLy8vIGFkZHJlYyBzdHJpZGVzLgordW5zaWduZWQgRm9ybXVsYTo6Z2V0TnVtUmVncygpIGNvbnN0IHsKKyAgcmV0dXJuICEhU2NhbGVkUmVnICsgQmFzZVJlZ3Muc2l6ZSgpOworfQorCisvLy8gZ2V0VHlwZSAtIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGZvcm11bGEsIGlmIGl0IGhhcyBvbmUsIG9yIG51bGwKKy8vLyBvdGhlcndpc2UuIFRoaXMgdHlwZSBpcyBtZWFuaW5nbGVzcyBleGNlcHQgZm9yIHRoZSBiaXQgc2l6ZS4KK2NvbnN0IFR5cGUgKkZvcm11bGE6OmdldFR5cGUoKSBjb25zdCB7CisgIHJldHVybiAhQmFzZVJlZ3MuZW1wdHkoKSA/IEJhc2VSZWdzLmZyb250KCktPmdldFR5cGUoKSA6CisgICAgICAgICBTY2FsZWRSZWcgPyBTY2FsZWRSZWctPmdldFR5cGUoKSA6CisgICAgICAgICBBTS5CYXNlR1YgPyBBTS5CYXNlR1YtPmdldFR5cGUoKSA6CisgICAgICAgICAwOworfQorCisvLy8gRGVsZXRlQmFzZVJlZyAtIERlbGV0ZSB0aGUgZ2l2ZW4gYmFzZSByZWcgZnJvbSB0aGUgQmFzZVJlZ3MgbGlzdC4KK3ZvaWQgRm9ybXVsYTo6RGVsZXRlQmFzZVJlZyhjb25zdCBTQ0VWIComUykgeworICBpZiAoJlMgIT0gJkJhc2VSZWdzLmJhY2soKSkKKyAgICBzdGQ6OnN3YXAoUywgQmFzZVJlZ3MuYmFjaygpKTsKKyAgQmFzZVJlZ3MucG9wX2JhY2soKTsKK30KKworLy8vIHJlZmVyZW5jZXNSZWcgLSBUZXN0IGlmIHRoaXMgZm9ybXVsYSByZWZlcmVuY2VzIHRoZSBnaXZlbiByZWdpc3Rlci4KK2Jvb2wgRm9ybXVsYTo6cmVmZXJlbmNlc1JlZyhjb25zdCBTQ0VWICpTKSBjb25zdCB7CisgIHJldHVybiBTID09IFNjYWxlZFJlZyB8fAorICAgICAgICAgc3RkOjpmaW5kKEJhc2VSZWdzLmJlZ2luKCksIEJhc2VSZWdzLmVuZCgpLCBTKSAhPSBCYXNlUmVncy5lbmQoKTsKK30KKworLy8vIGhhc1JlZ3NVc2VkQnlVc2VzT3RoZXJUaGFuIC0gVGVzdCB3aGV0aGVyIHRoaXMgZm9ybXVsYSB1c2VzIHJlZ2lzdGVycworLy8vIHdoaWNoIGFyZSB1c2VkIGJ5IHVzZXMgb3RoZXIgdGhhbiB0aGUgdXNlIHdpdGggdGhlIGdpdmVuIGluZGV4LgorYm9vbCBGb3JtdWxhOjpoYXNSZWdzVXNlZEJ5VXNlc090aGVyVGhhbihzaXplX3QgTFVJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ1VzZVRyYWNrZXIgJlJlZ1VzZXMpIGNvbnN0IHsKKyAgaWYgKFNjYWxlZFJlZykKKyAgICBpZiAoUmVnVXNlcy5pc1JlZ1VzZWRCeVVzZXNPdGhlclRoYW4oU2NhbGVkUmVnLCBMVUlkeCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgZm9yIChTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IEJhc2VSZWdzLmJlZ2luKCksCisgICAgICAgRSA9IEJhc2VSZWdzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoUmVnVXNlcy5pc1JlZ1VzZWRCeVVzZXNPdGhlclRoYW4oKkksIExVSWR4KSkKKyAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRm9ybXVsYTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGJvb2wgRmlyc3QgPSB0cnVlOworICBpZiAoQU0uQmFzZUdWKSB7CisgICAgaWYgKCFGaXJzdCkgT1MgPDwgIiArICI7IGVsc2UgRmlyc3QgPSBmYWxzZTsKKyAgICBXcml0ZUFzT3BlcmFuZChPUywgQU0uQmFzZUdWLCAvKlByaW50VHlwZT0qL2ZhbHNlKTsKKyAgfQorICBpZiAoQU0uQmFzZU9mZnMgIT0gMCkgeworICAgIGlmICghRmlyc3QpIE9TIDw8ICIgKyAiOyBlbHNlIEZpcnN0ID0gZmFsc2U7CisgICAgT1MgPDwgQU0uQmFzZU9mZnM7CisgIH0KKyAgZm9yIChTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IEJhc2VSZWdzLmJlZ2luKCksCisgICAgICAgRSA9IEJhc2VSZWdzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGlmICghRmlyc3QpIE9TIDw8ICIgKyAiOyBlbHNlIEZpcnN0ID0gZmFsc2U7CisgICAgT1MgPDwgInJlZygiIDw8ICoqSSA8PCAnKSc7CisgIH0KKyAgaWYgKEFNLkhhc0Jhc2VSZWcgJiYgQmFzZVJlZ3MuZW1wdHkoKSkgeworICAgIGlmICghRmlyc3QpIE9TIDw8ICIgKyAiOyBlbHNlIEZpcnN0ID0gZmFsc2U7CisgICAgT1MgPDwgIioqZXJyb3I6IEhhc0Jhc2VSZWcqKiI7CisgIH0gZWxzZSBpZiAoIUFNLkhhc0Jhc2VSZWcgJiYgIUJhc2VSZWdzLmVtcHR5KCkpIHsKKyAgICBpZiAoIUZpcnN0KSBPUyA8PCAiICsgIjsgZWxzZSBGaXJzdCA9IGZhbHNlOworICAgIE9TIDw8ICIqKmVycm9yOiAhSGFzQmFzZVJlZyoqIjsKKyAgfQorICBpZiAoQU0uU2NhbGUgIT0gMCkgeworICAgIGlmICghRmlyc3QpIE9TIDw8ICIgKyAiOyBlbHNlIEZpcnN0ID0gZmFsc2U7CisgICAgT1MgPDwgQU0uU2NhbGUgPDwgIipyZWcoIjsKKyAgICBpZiAoU2NhbGVkUmVnKQorICAgICAgT1MgPDwgKlNjYWxlZFJlZzsKKyAgICBlbHNlCisgICAgICBPUyA8PCAiPHVua25vd24+IjsKKyAgICBPUyA8PCAnKSc7CisgIH0KK30KKwordm9pZCBGb3JtdWxhOjpkdW1wKCkgY29uc3QgeworICBwcmludChlcnJzKCkpOyBlcnJzKCkgPDwgJ1xuJzsKK30KKworLy8vIGlzQWRkUmVjU0V4dGFibGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYWRkcmVjIGNhbiBiZSBzaWduLWV4dGVuZGVkCisvLy8gd2l0aG91dCBjaGFuZ2luZyBpdHMgdmFsdWUuCitzdGF0aWMgYm9vbCBpc0FkZFJlY1NFeHRhYmxlKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiwgU2NhbGFyRXZvbHV0aW9uICZTRSkgeworICBjb25zdCBUeXBlICpXaWRlVHkgPQorICAgIEludGVnZXJUeXBlOjpnZXQoU0UuZ2V0Q29udGV4dCgpLCBTRS5nZXRUeXBlU2l6ZUluQml0cyhBUi0+Z2V0VHlwZSgpKSArIDEpOworICByZXR1cm4gaXNhPFNDRVZBZGRSZWNFeHByPihTRS5nZXRTaWduRXh0ZW5kRXhwcihBUiwgV2lkZVR5KSk7Cit9CisKKy8vLyBpc0FkZFNFeHRhYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGFkZCBjYW4gYmUgc2lnbi1leHRlbmRlZAorLy8vIHdpdGhvdXQgY2hhbmdpbmcgaXRzIHZhbHVlLgorc3RhdGljIGJvb2wgaXNBZGRTRXh0YWJsZShjb25zdCBTQ0VWQWRkRXhwciAqQSwgU2NhbGFyRXZvbHV0aW9uICZTRSkgeworICBjb25zdCBUeXBlICpXaWRlVHkgPQorICAgIEludGVnZXJUeXBlOjpnZXQoU0UuZ2V0Q29udGV4dCgpLCBTRS5nZXRUeXBlU2l6ZUluQml0cyhBLT5nZXRUeXBlKCkpICsgMSk7CisgIHJldHVybiBpc2E8U0NFVkFkZEV4cHI+KFNFLmdldFNpZ25FeHRlbmRFeHByKEEsIFdpZGVUeSkpOworfQorCisvLy8gaXNNdWxTRXh0YWJsZSAtIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBtdWwgY2FuIGJlIHNpZ24tZXh0ZW5kZWQKKy8vLyB3aXRob3V0IGNoYW5naW5nIGl0cyB2YWx1ZS4KK3N0YXRpYyBib29sIGlzTXVsU0V4dGFibGUoY29uc3QgU0NFVk11bEV4cHIgKk0sIFNjYWxhckV2b2x1dGlvbiAmU0UpIHsKKyAgY29uc3QgVHlwZSAqV2lkZVR5ID0KKyAgICBJbnRlZ2VyVHlwZTo6Z2V0KFNFLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgIFNFLmdldFR5cGVTaXplSW5CaXRzKE0tPmdldFR5cGUoKSkgKiBNLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgcmV0dXJuIGlzYTxTQ0VWTXVsRXhwcj4oU0UuZ2V0U2lnbkV4dGVuZEV4cHIoTSwgV2lkZVR5KSk7Cit9CisKKy8vLyBnZXRFeGFjdFNEaXYgLSBSZXR1cm4gYW4gZXhwcmVzc2lvbiBmb3IgTEhTIC9zIFJIUywgaWYgaXQgY2FuIGJlIGRldGVybWluZWQKKy8vLyBhbmQgaWYgdGhlIHJlbWFpbmRlciBpcyBrbm93biB0byBiZSB6ZXJvLCAgb3IgbnVsbCBvdGhlcndpc2UuIElmCisvLy8gSWdub3JlU2lnbmlmaWNhbnRCaXRzIGlzIHRydWUsIGV4cHJlc3Npb25zIGxpa2UgKFggKiBZKSAvcyBZIGFyZSBzaW1wbGlmaWVkCisvLy8gdG8gWSwgaWdub3JpbmcgdGhhdCB0aGUgbXVsdGlwbGljYXRpb24gbWF5IG92ZXJmbG93LCB3aGljaCBpcyB1c2VmdWwgd2hlbgorLy8vIHRoZSByZXN1bHQgd2lsbCBiZSB1c2VkIGluIGEgY29udGV4dCB3aGVyZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIGFyZQorLy8vIGlnbm9yZWQuCitzdGF0aWMgY29uc3QgU0NFViAqZ2V0RXhhY3RTRGl2KGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZVNpZ25pZmljYW50Qml0cyA9IGZhbHNlKSB7CisgIC8vIEhhbmRsZSB0aGUgdHJpdmlhbCBjYXNlLCB3aGljaCB3b3JrcyBmb3IgYW55IFNDRVYgdHlwZS4KKyAgaWYgKExIUyA9PSBSSFMpCisgICAgcmV0dXJuIFNFLmdldENvbnN0YW50KExIUy0+Z2V0VHlwZSgpLCAxKTsKKworICAvLyBIYW5kbGUgYSBmZXcgUkhTIHNwZWNpYWwgY2FzZXMuCisgIGNvbnN0IFNDRVZDb25zdGFudCAqUkMgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KFJIUyk7CisgIGlmIChSQykgeworICAgIGNvbnN0IEFQSW50ICZSQSA9IFJDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpOworICAgIC8vIEhhbmRsZSB4IC9zIC0xIGFzIHggKiAtMSwgdG8gZ2l2ZSBTY2FsYXJFdm9sdXRpb24gYSBjaGFuY2UgdG8gZG8KKyAgICAvLyBzb21lIGZvbGRpbmcuCisgICAgaWYgKFJBLmlzQWxsT25lc1ZhbHVlKCkpCisgICAgICByZXR1cm4gU0UuZ2V0TXVsRXhwcihMSFMsIFJDKTsKKyAgICAvLyBIYW5kbGUgeCAvcyAxIGFzIHguCisgICAgaWYgKFJBID09IDEpCisgICAgICByZXR1cm4gTEhTOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGEgZGl2aXNpb24gb2YgYSBjb25zdGFudCBieSBhIGNvbnN0YW50LgorICBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihMSFMpKSB7CisgICAgaWYgKCFSQykKKyAgICAgIHJldHVybiAwOworICAgIGNvbnN0IEFQSW50ICZMQSA9IEMtPmdldFZhbHVlKCktPmdldFZhbHVlKCk7CisgICAgY29uc3QgQVBJbnQgJlJBID0gUkMtPmdldFZhbHVlKCktPmdldFZhbHVlKCk7CisgICAgaWYgKExBLnNyZW0oUkEpICE9IDApCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gU0UuZ2V0Q29uc3RhbnQoTEEuc2RpdihSQSkpOworICB9CisKKyAgLy8gRGlzdHJpYnV0ZSB0aGUgc2RpdiBvdmVyIGFkZHJlYyBvcGVyYW5kcywgaWYgdGhlIGFkZHJlYyBkb2Vzbid0IG92ZXJmbG93LgorICBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KExIUykpIHsKKyAgICBpZiAoSWdub3JlU2lnbmlmaWNhbnRCaXRzIHx8IGlzQWRkUmVjU0V4dGFibGUoQVIsIFNFKSkgeworICAgICAgY29uc3QgU0NFViAqU3RhcnQgPSBnZXRFeGFjdFNEaXYoQVItPmdldFN0YXJ0KCksIFJIUywgU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVTaWduaWZpY2FudEJpdHMpOworICAgICAgaWYgKCFTdGFydCkgcmV0dXJuIDA7CisgICAgICBjb25zdCBTQ0VWICpTdGVwID0gZ2V0RXhhY3RTRGl2KEFSLT5nZXRTdGVwUmVjdXJyZW5jZShTRSksIFJIUywgU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZVNpZ25pZmljYW50Qml0cyk7CisgICAgICBpZiAoIVN0ZXApIHJldHVybiAwOworICAgICAgcmV0dXJuIFNFLmdldEFkZFJlY0V4cHIoU3RhcnQsIFN0ZXAsIEFSLT5nZXRMb29wKCkpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIERpc3RyaWJ1dGUgdGhlIHNkaXYgb3ZlciBhZGQgb3BlcmFuZHMsIGlmIHRoZSBhZGQgZG9lc24ndCBvdmVyZmxvdy4KKyAgaWYgKGNvbnN0IFNDRVZBZGRFeHByICpBZGQgPSBkeW5fY2FzdDxTQ0VWQWRkRXhwcj4oTEhTKSkgeworICAgIGlmIChJZ25vcmVTaWduaWZpY2FudEJpdHMgfHwgaXNBZGRTRXh0YWJsZShBZGQsIFNFKSkgeworICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBPcHM7CisgICAgICBmb3IgKFNDRVZBZGRFeHByOjpvcF9pdGVyYXRvciBJID0gQWRkLT5vcF9iZWdpbigpLCBFID0gQWRkLT5vcF9lbmQoKTsKKyAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgY29uc3QgU0NFViAqT3AgPSBnZXRFeGFjdFNEaXYoKkksIFJIUywgU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZVNpZ25pZmljYW50Qml0cyk7CisgICAgICAgIGlmICghT3ApIHJldHVybiAwOworICAgICAgICBPcHMucHVzaF9iYWNrKE9wKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBTRS5nZXRBZGRFeHByKE9wcyk7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGEgbXVsdGlwbHkgb3BlcmFuZCB0aGF0IHdlIGNhbiBwdWxsIFJIUyBvdXQgb2YuCisgIGlmIChjb25zdCBTQ0VWTXVsRXhwciAqTXVsID0gZHluX2Nhc3Q8U0NFVk11bEV4cHI+KExIUykpIHsKKyAgICBpZiAoSWdub3JlU2lnbmlmaWNhbnRCaXRzIHx8IGlzTXVsU0V4dGFibGUoTXVsLCBTRSkpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gT3BzOworICAgICAgYm9vbCBGb3VuZCA9IGZhbHNlOworICAgICAgZm9yIChTQ0VWTXVsRXhwcjo6b3BfaXRlcmF0b3IgSSA9IE11bC0+b3BfYmVnaW4oKSwgRSA9IE11bC0+b3BfZW5kKCk7CisgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAgIGNvbnN0IFNDRVYgKlMgPSAqSTsKKyAgICAgICAgaWYgKCFGb3VuZCkKKyAgICAgICAgICBpZiAoY29uc3QgU0NFViAqUSA9IGdldEV4YWN0U0RpdihTLCBSSFMsIFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZVNpZ25pZmljYW50Qml0cykpIHsKKyAgICAgICAgICAgIFMgPSBROworICAgICAgICAgICAgRm91bmQgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgT3BzLnB1c2hfYmFjayhTKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGb3VuZCA/IFNFLmdldE11bEV4cHIoT3BzKSA6IDA7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgLy8gT3RoZXJ3aXNlIHdlIGRvbid0IGtub3cuCisgIHJldHVybiAwOworfQorCisvLy8gRXh0cmFjdEltbWVkaWF0ZSAtIElmIFMgaW52b2x2ZXMgdGhlIGFkZGl0aW9uIG9mIGEgY29uc3RhbnQgaW50ZWdlciB2YWx1ZSwKKy8vLyByZXR1cm4gdGhhdCBpbnRlZ2VyIHZhbHVlLCBhbmQgbXV0YXRlIFMgdG8gcG9pbnQgdG8gYSBuZXcgU0NFViB3aXRoIHRoYXQKKy8vLyB2YWx1ZSBleGNsdWRlZC4KK3N0YXRpYyBpbnQ2NF90IEV4dHJhY3RJbW1lZGlhdGUoY29uc3QgU0NFViAqJlMsIFNjYWxhckV2b2x1dGlvbiAmU0UpIHsKKyAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oUykpIHsKKyAgICBpZiAoQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKS5nZXRNaW5TaWduZWRCaXRzKCkgPD0gNjQpIHsKKyAgICAgIFMgPSBTRS5nZXRDb25zdGFudChDLT5nZXRUeXBlKCksIDApOworICAgICAgcmV0dXJuIEMtPmdldFZhbHVlKCktPmdldFNFeHRWYWx1ZSgpOworICAgIH0KKyAgfSBlbHNlIGlmIChjb25zdCBTQ0VWQWRkRXhwciAqQWRkID0gZHluX2Nhc3Q8U0NFVkFkZEV4cHI+KFMpKSB7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBOZXdPcHMoQWRkLT5vcF9iZWdpbigpLCBBZGQtPm9wX2VuZCgpKTsKKyAgICBpbnQ2NF90IFJlc3VsdCA9IEV4dHJhY3RJbW1lZGlhdGUoTmV3T3BzLmZyb250KCksIFNFKTsKKyAgICBTID0gU0UuZ2V0QWRkRXhwcihOZXdPcHMpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0gZWxzZSBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KFMpKSB7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBOZXdPcHMoQVItPm9wX2JlZ2luKCksIEFSLT5vcF9lbmQoKSk7CisgICAgaW50NjRfdCBSZXN1bHQgPSBFeHRyYWN0SW1tZWRpYXRlKE5ld09wcy5mcm9udCgpLCBTRSk7CisgICAgUyA9IFNFLmdldEFkZFJlY0V4cHIoTmV3T3BzLCBBUi0+Z2V0TG9vcCgpKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisgIHJldHVybiAwOworfQorCisvLy8gRXh0cmFjdFN5bWJvbCAtIElmIFMgaW52b2x2ZXMgdGhlIGFkZGl0aW9uIG9mIGEgR2xvYmFsVmFsdWUgYWRkcmVzcywKKy8vLyByZXR1cm4gdGhhdCBzeW1ib2wsIGFuZCBtdXRhdGUgUyB0byBwb2ludCB0byBhIG5ldyBTQ0VWIHdpdGggdGhhdAorLy8vIHZhbHVlIGV4Y2x1ZGVkLgorc3RhdGljIEdsb2JhbFZhbHVlICpFeHRyYWN0U3ltYm9sKGNvbnN0IFNDRVYgKiZTLCBTY2FsYXJFdm9sdXRpb24gJlNFKSB7CisgIGlmIChjb25zdCBTQ0VWVW5rbm93biAqVSA9IGR5bl9jYXN0PFNDRVZVbmtub3duPihTKSkgeworICAgIGlmIChHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oVS0+Z2V0VmFsdWUoKSkpIHsKKyAgICAgIFMgPSBTRS5nZXRDb25zdGFudChHVi0+Z2V0VHlwZSgpLCAwKTsKKyAgICAgIHJldHVybiBHVjsKKyAgICB9CisgIH0gZWxzZSBpZiAoY29uc3QgU0NFVkFkZEV4cHIgKkFkZCA9IGR5bl9jYXN0PFNDRVZBZGRFeHByPihTKSkgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgOD4gTmV3T3BzKEFkZC0+b3BfYmVnaW4oKSwgQWRkLT5vcF9lbmQoKSk7CisgICAgR2xvYmFsVmFsdWUgKlJlc3VsdCA9IEV4dHJhY3RTeW1ib2woTmV3T3BzLmJhY2soKSwgU0UpOworICAgIFMgPSBTRS5nZXRBZGRFeHByKE5ld09wcyk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfSBlbHNlIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUykpIHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IE5ld09wcyhBUi0+b3BfYmVnaW4oKSwgQVItPm9wX2VuZCgpKTsKKyAgICBHbG9iYWxWYWx1ZSAqUmVzdWx0ID0gRXh0cmFjdFN5bWJvbChOZXdPcHMuZnJvbnQoKSwgU0UpOworICAgIFMgPSBTRS5nZXRBZGRSZWNFeHByKE5ld09wcywgQVItPmdldExvb3AoKSk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIGlzQWRkcmVzc1VzZSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGlzIHVzaW5nIHRoZQorLy8vIHNwZWNpZmllZCB2YWx1ZSBhcyBhbiBhZGRyZXNzLgorc3RhdGljIGJvb2wgaXNBZGRyZXNzVXNlKEluc3RydWN0aW9uICpJbnN0LCBWYWx1ZSAqT3BlcmFuZFZhbCkgeworICBib29sIGlzQWRkcmVzcyA9IGlzYTxMb2FkSW5zdD4oSW5zdCk7CisgIGlmIChTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihJbnN0KSkgeworICAgIGlmIChTSS0+Z2V0T3BlcmFuZCgxKSA9PSBPcGVyYW5kVmFsKQorICAgICAgaXNBZGRyZXNzID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChJbnRyaW5zaWNJbnN0ICpJSSA9IGR5bl9jYXN0PEludHJpbnNpY0luc3Q+KEluc3QpKSB7CisgICAgLy8gQWRkcmVzc2luZyBtb2RlcyBjYW4gYWxzbyBiZSBmb2xkZWQgaW50byBwcmVmZXRjaGVzIGFuZCBhIHZhcmlldHkKKyAgICAvLyBvZiBpbnRyaW5zaWNzLgorICAgIHN3aXRjaCAoSUktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSBJbnRyaW5zaWM6OnByZWZldGNoOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX2xvYWR1X2RxOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX2xvYWR1X3BkOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2VfbG9hZHVfcHM6CisgICAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZV9zdG9yZXVfcHM6CisgICAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfc3RvcmV1X3BkOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3N0b3JldV9kcToKKyAgICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9zdG9yZWxfZHE6CisgICAgICAgIGlmIChJSS0+Z2V0QXJnT3BlcmFuZCgwKSA9PSBPcGVyYW5kVmFsKQorICAgICAgICAgIGlzQWRkcmVzcyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gaXNBZGRyZXNzOworfQorCisvLy8gZ2V0QWNjZXNzVHlwZSAtIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgbWVtb3J5IGJlaW5nIGFjY2Vzc2VkLgorc3RhdGljIGNvbnN0IFR5cGUgKmdldEFjY2Vzc1R5cGUoY29uc3QgSW5zdHJ1Y3Rpb24gKkluc3QpIHsKKyAgY29uc3QgVHlwZSAqQWNjZXNzVHkgPSBJbnN0LT5nZXRUeXBlKCk7CisgIGlmIChjb25zdCBTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihJbnN0KSkKKyAgICBBY2Nlc3NUeSA9IFNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgIGVsc2UgaWYgKGNvbnN0IEludHJpbnNpY0luc3QgKklJID0gZHluX2Nhc3Q8SW50cmluc2ljSW5zdD4oSW5zdCkpIHsKKyAgICAvLyBBZGRyZXNzaW5nIG1vZGVzIGNhbiBhbHNvIGJlIGZvbGRlZCBpbnRvIHByZWZldGNoZXMgYW5kIGEgdmFyaWV0eQorICAgIC8vIG9mIGludHJpbnNpY3MuCisgICAgc3dpdGNoIChJSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlX3N0b3JldV9wczoKKyAgICBjYXNlIEludHJpbnNpYzo6eDg2X3NzZTJfc3RvcmV1X3BkOgorICAgIGNhc2UgSW50cmluc2ljOjp4ODZfc3NlMl9zdG9yZXVfZHE6CisgICAgY2FzZSBJbnRyaW5zaWM6Ong4Nl9zc2UyX3N0b3JlbF9kcToKKyAgICAgIEFjY2Vzc1R5ID0gSUktPmdldEFyZ09wZXJhbmQoMCktPmdldFR5cGUoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIEFsbCBwb2ludGVycyBoYXZlIHRoZSBzYW1lIHJlcXVpcmVtZW50cywgc28gY2Fub25pY2FsaXplIHRoZW0gdG8gYW4KKyAgLy8gYXJiaXRyYXJ5IHBvaW50ZXIgdHlwZSB0byBtaW5pbWl6ZSB2YXJpYXRpb24uCisgIGlmIChjb25zdCBQb2ludGVyVHlwZSAqUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KEFjY2Vzc1R5KSkKKyAgICBBY2Nlc3NUeSA9IFBvaW50ZXJUeXBlOjpnZXQoSW50ZWdlclR5cGU6OmdldChQVHktPmdldENvbnRleHQoKSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUeS0+Z2V0QWRkcmVzc1NwYWNlKCkpOworCisgIHJldHVybiBBY2Nlc3NUeTsKK30KKworLy8vIERlbGV0ZVRyaXZpYWxseURlYWRJbnN0cnVjdGlvbnMgLSBJZiBhbnkgb2YgdGhlIGluc3RydWN0aW9ucyBpcyB0aGUKKy8vLyBzcGVjaWZpZWQgc2V0IGFyZSB0cml2aWFsbHkgZGVhZCwgZGVsZXRlIHRoZW0gYW5kIHNlZSBpZiB0aGlzIG1ha2VzIGFueSBvZgorLy8vIHRoZWlyIG9wZXJhbmRzIHN1YnNlcXVlbnRseSBkZWFkLgorc3RhdGljIGJvb2wKK0RlbGV0ZVRyaXZpYWxseURlYWRJbnN0cnVjdGlvbnMoU21hbGxWZWN0b3JJbXBsPFdlYWtWSD4gJkRlYWRJbnN0cykgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICB3aGlsZSAoIURlYWRJbnN0cy5lbXB0eSgpKSB7CisgICAgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdF9vcl9udWxsPEluc3RydWN0aW9uPihEZWFkSW5zdHMucG9wX2JhY2tfdmFsKCkpOworCisgICAgaWYgKEkgPT0gMCB8fCAhaXNJbnN0cnVjdGlvblRyaXZpYWxseURlYWQoSSkpCisgICAgICBjb250aW51ZTsKKworICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgT0kgPSBJLT5vcF9iZWdpbigpLCBFID0gSS0+b3BfZW5kKCk7IE9JICE9IEU7ICsrT0kpCisgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKlUgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oKk9JKSkgeworICAgICAgICAqT0kgPSAwOworICAgICAgICBpZiAoVS0+dXNlX2VtcHR5KCkpCisgICAgICAgICAgRGVhZEluc3RzLnB1c2hfYmFjayhVKTsKKyAgICAgIH0KKworICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIENoYW5nZWQgPSB0cnVlOworICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK25hbWVzcGFjZSB7CisKKy8vLyBDb3N0IC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG1lYXN1cmUgYW5kIGNvbXBhcmUgY2FuZGlkYXRlIGZvcm11bGFlLgorY2xhc3MgQ29zdCB7CisgIC8vLyBUT0RPOiBTb21lIG9mIHRoZXNlIGNvdWxkIGJlIG1lcmdlZC4gQWxzbywgYSBsZXhpY2FsIG9yZGVyaW5nCisgIC8vLyBpc24ndCBhbHdheXMgb3B0aW1hbC4KKyAgdW5zaWduZWQgTnVtUmVnczsKKyAgdW5zaWduZWQgQWRkUmVjQ29zdDsKKyAgdW5zaWduZWQgTnVtSVZNdWxzOworICB1bnNpZ25lZCBOdW1CYXNlQWRkczsKKyAgdW5zaWduZWQgSW1tQ29zdDsKKyAgdW5zaWduZWQgU2V0dXBDb3N0OworCitwdWJsaWM6CisgIENvc3QoKQorICAgIDogTnVtUmVncygwKSwgQWRkUmVjQ29zdCgwKSwgTnVtSVZNdWxzKDApLCBOdW1CYXNlQWRkcygwKSwgSW1tQ29zdCgwKSwKKyAgICAgIFNldHVwQ29zdCgwKSB7fQorCisgIHVuc2lnbmVkIGdldE51bVJlZ3MoKSBjb25zdCB7IHJldHVybiBOdW1SZWdzOyB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ29zdCAmT3RoZXIpIGNvbnN0OworCisgIHZvaWQgTG9vc2UoKTsKKworICB2b2lkIFJhdGVGb3JtdWxhKGNvbnN0IEZvcm11bGEgJkYsCisgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgU0NFViAqLCAxNj4gJlJlZ3MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGVuc2VTZXQ8Y29uc3QgU0NFViAqPiAmVmlzaXRlZFJlZ3MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8aW50NjRfdD4gJk9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSwgRG9taW5hdG9yVHJlZSAmRFQpOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHZvaWQgUmF0ZVJlZ2lzdGVyKGNvbnN0IFNDRVYgKlJlZywKKyAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgU0NFViAqLCAxNj4gJlJlZ3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UsIERvbWluYXRvclRyZWUgJkRUKTsKKyAgdm9pZCBSYXRlUHJpbWFyeVJlZ2lzdGVyKGNvbnN0IFNDRVYgKlJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PGNvbnN0IFNDRVYgKiwgMTY+ICZSZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UsIERvbWluYXRvclRyZWUgJkRUKTsKK307CisKK30KKworLy8vIFJhdGVSZWdpc3RlciAtIFRhbGx5IHVwIGludGVyZXN0aW5nIHF1YW50aXRpZXMgZnJvbSB0aGUgZ2l2ZW4gcmVnaXN0ZXIuCit2b2lkIENvc3Q6OlJhdGVSZWdpc3Rlcihjb25zdCBTQ0VWICpSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxjb25zdCBTQ0VWICosIDE2PiAmUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFLCBEb21pbmF0b3JUcmVlICZEVCkgeworICBpZiAoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSID0gZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KFJlZykpIHsKKyAgICBpZiAoQVItPmdldExvb3AoKSA9PSBMKQorICAgICAgQWRkUmVjQ29zdCArPSAxOyAvLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgYSBmdW5jdGlvbiBvZiB0aGUgc3RyaWRlLgorCisgICAgLy8gSWYgdGhpcyBpcyBhbiBhZGRyZWMgZm9yIGEgbG9vcCB0aGF0J3MgYWxyZWFkeSBiZWVuIHZpc2l0ZWQgYnkgTFNSLAorICAgIC8vIGRvbid0IHNlY29uZC1ndWVzcyBpdHMgYWRkcmVjIHBoaSBub2Rlcy4gTFNSIGlzbid0IGN1cnJlbnRseSBzbWFydAorICAgIC8vIGVub3VnaCB0byByZWFzb24gYWJvdXQgbW9yZSB0aGFuIG9uZSBsb29wIGF0IGEgdGltZS4gQ29uc2lkZXIgdGhlc2UKKyAgICAvLyByZWdpc3RlcnMgZnJlZSBhbmQgbGVhdmUgdGhlbSBhbG9uZS4KKyAgICBlbHNlIGlmIChMLT5jb250YWlucyhBUi0+Z2V0TG9vcCgpKSB8fAorICAgICAgICAgICAgICghQVItPmdldExvb3AoKS0+Y29udGFpbnMoTCkgJiYKKyAgICAgICAgICAgICAgRFQuZG9taW5hdGVzKEwtPmdldEhlYWRlcigpLCBBUi0+Z2V0TG9vcCgpLT5nZXRIZWFkZXIoKSkpKSB7CisgICAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBBUi0+Z2V0TG9vcCgpLT5nZXRIZWFkZXIoKS0+YmVnaW4oKTsKKyAgICAgICAgICAgUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJKTsgKytJKQorICAgICAgICBpZiAoU0UuaXNTQ0VWYWJsZShQTi0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgICAgKFNFLmdldEVmZmVjdGl2ZVNDRVZUeXBlKFBOLT5nZXRUeXBlKCkpID09CisgICAgICAgICAgICAgU0UuZ2V0RWZmZWN0aXZlU0NFVlR5cGUoQVItPmdldFR5cGUoKSkpICYmCisgICAgICAgICAgICBTRS5nZXRTQ0VWKFBOKSA9PSBBUikKKyAgICAgICAgICByZXR1cm47CisKKyAgICAgIC8vIElmIHRoaXMgaXNuJ3Qgb25lIG9mIHRoZSBhZGRyZWNzIHRoYXQgdGhlIGxvb3AgYWxyZWFkeSBoYXMsIGl0CisgICAgICAvLyB3b3VsZCByZXF1aXJlIGEgY29zdGx5IG5ldyBwaGkgYW5kIGFkZC4gVE9ETzogVGhpcyBpc24ndAorICAgICAgLy8gcHJlY2lzZWx5IG1vZGVsZWQgcmlnaHQgbm93LgorICAgICAgKytOdW1CYXNlQWRkczsKKyAgICAgIGlmICghUmVncy5jb3VudChBUi0+Z2V0U3RhcnQoKSkpCisgICAgICAgIFJhdGVSZWdpc3RlcihBUi0+Z2V0U3RhcnQoKSwgUmVncywgTCwgU0UsIERUKTsKKyAgICB9CisKKyAgICAvLyBBZGQgdGhlIHN0ZXAgdmFsdWUgcmVnaXN0ZXIsIGlmIGl0IG5lZWRzIG9uZS4KKyAgICAvLyBUT0RPOiBUaGUgbm9uLWFmZmluZSBjYXNlIGlzbid0IHByZWNpc2VseSBtb2RlbGVkIGhlcmUuCisgICAgaWYgKCFBUi0+aXNBZmZpbmUoKSB8fCAhaXNhPFNDRVZDb25zdGFudD4oQVItPmdldE9wZXJhbmQoMSkpKQorICAgICAgaWYgKCFSZWdzLmNvdW50KEFSLT5nZXRTdGFydCgpKSkKKyAgICAgICAgUmF0ZVJlZ2lzdGVyKEFSLT5nZXRPcGVyYW5kKDEpLCBSZWdzLCBMLCBTRSwgRFQpOworICB9CisgICsrTnVtUmVnczsKKworICAvLyBSb3VnaCBoZXVyaXN0aWM7IGZhdm9yIHJlZ2lzdGVycyB3aGljaCBkb24ndCByZXF1aXJlIGV4dHJhIHNldHVwCisgIC8vIGluc3RydWN0aW9ucyBpbiB0aGUgcHJlaGVhZGVyLgorICBpZiAoIWlzYTxTQ0VWVW5rbm93bj4oUmVnKSAmJgorICAgICAgIWlzYTxTQ0VWQ29uc3RhbnQ+KFJlZykgJiYKKyAgICAgICEoaXNhPFNDRVZBZGRSZWNFeHByPihSZWcpICYmCisgICAgICAgIChpc2E8U0NFVlVua25vd24+KGNhc3Q8U0NFVkFkZFJlY0V4cHI+KFJlZyktPmdldFN0YXJ0KCkpIHx8CisgICAgICAgICBpc2E8U0NFVkNvbnN0YW50PihjYXN0PFNDRVZBZGRSZWNFeHByPihSZWcpLT5nZXRTdGFydCgpKSkpKQorICAgICsrU2V0dXBDb3N0OworfQorCisvLy8gUmF0ZVByaW1hcnlSZWdpc3RlciAtIFJlY29yZCB0aGlzIHJlZ2lzdGVyIGluIHRoZSBzZXQuIElmIHdlIGhhdmVuJ3Qgc2VlbiBpdAorLy8vIGJlZm9yZSwgcmF0ZSBpdC4KK3ZvaWQgQ29zdDo6UmF0ZVByaW1hcnlSZWdpc3Rlcihjb25zdCBTQ0VWICpSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgU0NFViAqLCAxNj4gJlJlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFLCBEb21pbmF0b3JUcmVlICZEVCkgeworICBpZiAoUmVncy5pbnNlcnQoUmVnKSkKKyAgICBSYXRlUmVnaXN0ZXIoUmVnLCBSZWdzLCBMLCBTRSwgRFQpOworfQorCit2b2lkIENvc3Q6OlJhdGVGb3JtdWxhKGNvbnN0IEZvcm11bGEgJkYsCisgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PGNvbnN0IFNDRVYgKiwgMTY+ICZSZWdzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW5zZVNldDxjb25zdCBTQ0VWICo+ICZWaXNpdGVkUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPGludDY0X3Q+ICZPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFLCBEb21pbmF0b3JUcmVlICZEVCkgeworICAvLyBUYWxseSB1cCB0aGUgcmVnaXN0ZXJzLgorICBpZiAoY29uc3QgU0NFViAqU2NhbGVkUmVnID0gRi5TY2FsZWRSZWcpIHsKKyAgICBpZiAoVmlzaXRlZFJlZ3MuY291bnQoU2NhbGVkUmVnKSkgeworICAgICAgTG9vc2UoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgUmF0ZVByaW1hcnlSZWdpc3RlcihTY2FsZWRSZWcsIFJlZ3MsIEwsIFNFLCBEVCk7CisgIH0KKyAgZm9yIChTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IEYuQmFzZVJlZ3MuYmVnaW4oKSwKKyAgICAgICBFID0gRi5CYXNlUmVncy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBTQ0VWICpCYXNlUmVnID0gKkk7CisgICAgaWYgKFZpc2l0ZWRSZWdzLmNvdW50KEJhc2VSZWcpKSB7CisgICAgICBMb29zZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSYXRlUHJpbWFyeVJlZ2lzdGVyKEJhc2VSZWcsIFJlZ3MsIEwsIFNFLCBEVCk7CisKKyAgICBOdW1JVk11bHMgKz0gaXNhPFNDRVZNdWxFeHByPihCYXNlUmVnKSAmJgorICAgICAgICAgICAgICAgICBCYXNlUmVnLT5oYXNDb21wdXRhYmxlTG9vcEV2b2x1dGlvbihMKTsKKyAgfQorCisgIGlmIChGLkJhc2VSZWdzLnNpemUoKSA+IDEpCisgICAgTnVtQmFzZUFkZHMgKz0gRi5CYXNlUmVncy5zaXplKCkgLSAxOworCisgIC8vIFRhbGx5IHVwIHRoZSBub24temVybyBpbW1lZGlhdGVzLgorICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxpbnQ2NF90Pjo6Y29uc3RfaXRlcmF0b3IgSSA9IE9mZnNldHMuYmVnaW4oKSwKKyAgICAgICBFID0gT2Zmc2V0cy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpbnQ2NF90IE9mZnNldCA9ICh1aW50NjRfdCkqSSArIEYuQU0uQmFzZU9mZnM7CisgICAgaWYgKEYuQU0uQmFzZUdWKQorICAgICAgSW1tQ29zdCArPSA2NDsgLy8gSGFuZGxlIHN5bWJvbGljIHZhbHVlcyBjb25zZXJ2YXRpdmVseS4KKyAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHRoZSBwb2ludGVyIHNpemUuCisgICAgZWxzZSBpZiAoT2Zmc2V0ICE9IDApCisgICAgICBJbW1Db3N0ICs9IEFQSW50KDY0LCBPZmZzZXQsIHRydWUpLmdldE1pblNpZ25lZEJpdHMoKTsKKyAgfQorfQorCisvLy8gTG9vc2UgLSBTZXQgdGhpcyBjb3N0IHRvIGEgbG9vc2luZyB2YWx1ZS4KK3ZvaWQgQ29zdDo6TG9vc2UoKSB7CisgIE51bVJlZ3MgPSB+MHU7CisgIEFkZFJlY0Nvc3QgPSB+MHU7CisgIE51bUlWTXVscyA9IH4wdTsKKyAgTnVtQmFzZUFkZHMgPSB+MHU7CisgIEltbUNvc3QgPSB+MHU7CisgIFNldHVwQ29zdCA9IH4wdTsKK30KKworLy8vIG9wZXJhdG9yPCAtIENob29zZSB0aGUgbG93ZXIgY29zdC4KK2Jvb2wgQ29zdDo6b3BlcmF0b3I8KGNvbnN0IENvc3QgJk90aGVyKSBjb25zdCB7CisgIGlmIChOdW1SZWdzICE9IE90aGVyLk51bVJlZ3MpCisgICAgcmV0dXJuIE51bVJlZ3MgPCBPdGhlci5OdW1SZWdzOworICBpZiAoQWRkUmVjQ29zdCAhPSBPdGhlci5BZGRSZWNDb3N0KQorICAgIHJldHVybiBBZGRSZWNDb3N0IDwgT3RoZXIuQWRkUmVjQ29zdDsKKyAgaWYgKE51bUlWTXVscyAhPSBPdGhlci5OdW1JVk11bHMpCisgICAgcmV0dXJuIE51bUlWTXVscyA8IE90aGVyLk51bUlWTXVsczsKKyAgaWYgKE51bUJhc2VBZGRzICE9IE90aGVyLk51bUJhc2VBZGRzKQorICAgIHJldHVybiBOdW1CYXNlQWRkcyA8IE90aGVyLk51bUJhc2VBZGRzOworICBpZiAoSW1tQ29zdCAhPSBPdGhlci5JbW1Db3N0KQorICAgIHJldHVybiBJbW1Db3N0IDwgT3RoZXIuSW1tQ29zdDsKKyAgaWYgKFNldHVwQ29zdCAhPSBPdGhlci5TZXR1cENvc3QpCisgICAgcmV0dXJuIFNldHVwQ29zdCA8IE90aGVyLlNldHVwQ29zdDsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENvc3Q6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBPUyA8PCBOdW1SZWdzIDw8ICIgcmVnIiA8PCAoTnVtUmVncyA9PSAxID8gIiIgOiAicyIpOworICBpZiAoQWRkUmVjQ29zdCAhPSAwKQorICAgIE9TIDw8ICIsIHdpdGggYWRkcmVjIGNvc3QgIiA8PCBBZGRSZWNDb3N0OworICBpZiAoTnVtSVZNdWxzICE9IDApCisgICAgT1MgPDwgIiwgcGx1cyAiIDw8IE51bUlWTXVscyA8PCAiIElWIG11bCIgPDwgKE51bUlWTXVscyA9PSAxID8gIiIgOiAicyIpOworICBpZiAoTnVtQmFzZUFkZHMgIT0gMCkKKyAgICBPUyA8PCAiLCBwbHVzICIgPDwgTnVtQmFzZUFkZHMgPDwgIiBiYXNlIGFkZCIKKyAgICAgICA8PCAoTnVtQmFzZUFkZHMgPT0gMSA/ICIiIDogInMiKTsKKyAgaWYgKEltbUNvc3QgIT0gMCkKKyAgICBPUyA8PCAiLCBwbHVzICIgPDwgSW1tQ29zdCA8PCAiIGltbSBjb3N0IjsKKyAgaWYgKFNldHVwQ29zdCAhPSAwKQorICAgIE9TIDw8ICIsIHBsdXMgIiA8PCBTZXR1cENvc3QgPDwgIiBzZXR1cCBjb3N0IjsKK30KKwordm9pZCBDb3N0OjpkdW1wKCkgY29uc3QgeworICBwcmludChlcnJzKCkpOyBlcnJzKCkgPDwgJ1xuJzsKK30KKworbmFtZXNwYWNlIHsKKworLy8vIExTUkZpeHVwIC0gQW4gb3BlcmFuZCB2YWx1ZSBpbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBpcyB0byBiZSByZXBsYWNlZAorLy8vIHdpdGggc29tZSBlcXVpdmFsZW50LCBwb3NzaWJseSBzdHJlbmd0aC1yZWR1Y2VkLCByZXBsYWNlbWVudC4KK3N0cnVjdCBMU1JGaXh1cCB7CisgIC8vLyBVc2VySW5zdCAtIFRoZSBpbnN0cnVjdGlvbiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQuCisgIEluc3RydWN0aW9uICpVc2VySW5zdDsKKworICAvLy8gT3BlcmFuZFZhbFRvUmVwbGFjZSAtIFRoZSBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3aWxsCisgIC8vLyBiZSByZXBsYWNlZC4gVGhlIG9wZXJhbmQgbWF5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2U7IGV2ZXJ5IGluc3RhbmNlCisgIC8vLyB3aWxsIGJlIHJlcGxhY2VkLgorICBWYWx1ZSAqT3BlcmFuZFZhbFRvUmVwbGFjZTsKKworICAvLy8gUG9zdEluY0xvb3BzIC0gSWYgdGhpcyB1c2VyIGlzIHRvIHVzZSB0aGUgcG9zdC1pbmNyZW1lbnRlZCB2YWx1ZSBvZiBhbgorICAvLy8gaW5kdWN0aW9uIHZhcmlhYmxlLCB0aGlzIHZhcmlhYmxlIGlzIG5vbi1udWxsIGFuZCBob2xkcyB0aGUgbG9vcAorICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUuCisgIFBvc3RJbmNMb29wU2V0IFBvc3RJbmNMb29wczsKKworICAvLy8gTFVJZHggLSBUaGUgaW5kZXggb2YgdGhlIExTUlVzZSBkZXNjcmliaW5nIHRoZSBleHByZXNzaW9uIHdoaWNoCisgIC8vLyB0aGlzIGZpeHVwIG5lZWRzLCBtaW51cyBhbiBvZmZzZXQgKGJlbG93KS4KKyAgc2l6ZV90IExVSWR4OworCisgIC8vLyBPZmZzZXQgLSBBIGNvbnN0YW50IG9mZnNldCB0byBiZSBhZGRlZCB0byB0aGUgTFNSVXNlIGV4cHJlc3Npb24uCisgIC8vLyBUaGlzIGFsbG93cyBtdWx0aXBsZSBmaXh1cHMgdG8gc2hhcmUgdGhlIHNhbWUgTFNSVXNlIHdpdGggZGlmZmVyZW50CisgIC8vLyBvZmZzZXRzLCBmb3IgZXhhbXBsZSBpbiBhbiB1bnJvbGxlZCBsb29wLgorICBpbnQ2NF90IE9mZnNldDsKKworICBib29sIGlzVXNlRnVsbHlPdXRzaWRlTG9vcChjb25zdCBMb29wICpMKSBjb25zdDsKKworICBMU1JGaXh1cCgpOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCit9CisKK0xTUkZpeHVwOjpMU1JGaXh1cCgpCisgIDogVXNlckluc3QoMCksIE9wZXJhbmRWYWxUb1JlcGxhY2UoMCksIExVSWR4KH5zaXplX3QoMCkpLCBPZmZzZXQoMCkge30KKworLy8vIGlzVXNlRnVsbHlPdXRzaWRlTG9vcCAtIFRlc3Qgd2hldGhlciB0aGlzIGZpeHVwIGFsd2F5cyB1c2VzIGl0cworLy8vIHZhbHVlIG91dHNpZGUgb2YgdGhlIGdpdmVuIGxvb3AuCitib29sIExTUkZpeHVwOjppc1VzZUZ1bGx5T3V0c2lkZUxvb3AoY29uc3QgTG9vcCAqTCkgY29uc3QgeworICAvLyBQSEkgbm9kZXMgdXNlIHRoZWlyIHZhbHVlIGluIHRoZWlyIGluY29taW5nIGJsb2Nrcy4KKyAgaWYgKGNvbnN0IFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVXNlckluc3QpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKSA9PSBPcGVyYW5kVmFsVG9SZXBsYWNlICYmCisgICAgICAgICAgTC0+Y29udGFpbnMoUE4tPmdldEluY29taW5nQmxvY2soaSkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gIUwtPmNvbnRhaW5zKFVzZXJJbnN0KTsKK30KKwordm9pZCBMU1JGaXh1cDo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICJVc2VySW5zdD0iOworICAvLyBTdG9yZSBpcyBjb21tb24gYW5kIGludGVyZXN0aW5nIGVub3VnaCB0byBiZSB3b3J0aCBzcGVjaWFsLWNhc2luZy4KKyAgaWYgKFN0b3JlSW5zdCAqU3RvcmUgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFVzZXJJbnN0KSkgeworICAgIE9TIDw8ICJzdG9yZSAiOworICAgIFdyaXRlQXNPcGVyYW5kKE9TLCBTdG9yZS0+Z2V0T3BlcmFuZCgwKSwgLypQcmludFR5cGU9Ki9mYWxzZSk7CisgIH0gZWxzZSBpZiAoVXNlckluc3QtPmdldFR5cGUoKS0+aXNWb2lkVHkoKSkKKyAgICBPUyA8PCBVc2VySW5zdC0+Z2V0T3Bjb2RlTmFtZSgpOworICBlbHNlCisgICAgV3JpdGVBc09wZXJhbmQoT1MsIFVzZXJJbnN0LCAvKlByaW50VHlwZT0qL2ZhbHNlKTsKKworICBPUyA8PCAiLCBPcGVyYW5kVmFsVG9SZXBsYWNlPSI7CisgIFdyaXRlQXNPcGVyYW5kKE9TLCBPcGVyYW5kVmFsVG9SZXBsYWNlLCAvKlByaW50VHlwZT0qL2ZhbHNlKTsKKworICBmb3IgKFBvc3RJbmNMb29wU2V0Ojpjb25zdF9pdGVyYXRvciBJID0gUG9zdEluY0xvb3BzLmJlZ2luKCksCisgICAgICAgRSA9IFBvc3RJbmNMb29wcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBPUyA8PCAiLCBQb3N0SW5jTG9vcD0iOworICAgIFdyaXRlQXNPcGVyYW5kKE9TLCAoKkkpLT5nZXRIZWFkZXIoKSwgLypQcmludFR5cGU9Ki9mYWxzZSk7CisgIH0KKworICBpZiAoTFVJZHggIT0gfnNpemVfdCgwKSkKKyAgICBPUyA8PCAiLCBMVUlkeD0iIDw8IExVSWR4OworCisgIGlmIChPZmZzZXQgIT0gMCkKKyAgICBPUyA8PCAiLCBPZmZzZXQ9IiA8PCBPZmZzZXQ7Cit9CisKK3ZvaWQgTFNSRml4dXA6OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGVycnMoKSk7IGVycnMoKSA8PCAnXG4nOworfQorCituYW1lc3BhY2UgeworCisvLy8gVW5pcXVpZmllckRlbnNlTWFwSW5mbyAtIEEgRGVuc2VNYXBJbmZvIGltcGxlbWVudGF0aW9uIGZvciBob2xkaW5nCisvLy8gRGVuc2VNYXBzIGFuZCBEZW5zZVNldHMgb2Ygc29ydGVkIFNtYWxsVmVjdG9ycyBvZiBjb25zdCBTQ0VWKi4KK3N0cnVjdCBVbmlxdWlmaWVyRGVuc2VNYXBJbmZvIHsKKyAgc3RhdGljIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gZ2V0RW1wdHlLZXkoKSB7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBWOworICAgIFYucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU0NFViAqPigtMSkpOworICAgIHJldHVybiBWOworICB9CisKKyAgc3RhdGljIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gVjsKKyAgICBWLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PGNvbnN0IFNDRVYgKj4oLTIpKTsKKyAgICByZXR1cm4gVjsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiAmVikgeworICAgIHVuc2lnbmVkIFJlc3VsdCA9IDA7CisgICAgZm9yIChTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IFYuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBWLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIFJlc3VsdCBePSBEZW5zZU1hcEluZm88Y29uc3QgU0NFViAqPjo6Z2V0SGFzaFZhbHVlKCpJKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDI+ICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vLyBMU1JVc2UgLSBUaGlzIGNsYXNzIGhvbGRzIHRoZSBzdGF0ZSB0aGF0IExTUiBrZWVwcyBmb3IgZWFjaCB1c2UgaW4KKy8vLyBJVlVzZXJzLCBhcyB3ZWxsIGFzIHVzZXMgaW52ZW50ZWQgYnkgTFNSIGl0c2VsZi4gSXQgaW5jbHVkZXMgaW5mb3JtYXRpb24KKy8vLyBhYm91dCB3aGF0IGtpbmRzIG9mIHRoaW5ncyBjYW4gYmUgZm9sZGVkIGludG8gdGhlIHVzZXIsIGluZm9ybWF0aW9uIGFib3V0CisvLy8gdGhlIHVzZXIgaXRzZWxmLCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSB1c2UgbWF5IGJlIHNhdGlzZmllZC4KKy8vLyBUT0RPOiBSZXByZXNlbnQgbXVsdGlwbGUgdXNlcnMgb2YgdGhlIHNhbWUgZXhwcmVzc2lvbiBpbiBjb21tb24/CitjbGFzcyBMU1JVc2UgeworICBEZW5zZVNldDxTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDI+LCBVbmlxdWlmaWVyRGVuc2VNYXBJbmZvPiBVbmlxdWlmaWVyOworCitwdWJsaWM6CisgIC8vLyBLaW5kVHlwZSAtIEFuIGVudW0gZm9yIGEga2luZCBvZiB1c2UsIGluZGljYXRpbmcgd2hhdCB0eXBlcyBvZgorICAvLy8gc2NhbGVkIGFuZCBpbW1lZGlhdGUgb3BlcmFuZHMgaXQgbWlnaHQgc3VwcG9ydC4KKyAgZW51bSBLaW5kVHlwZSB7CisgICAgQmFzaWMsICAgLy8vPCBBIG5vcm1hbCB1c2UsIHdpdGggbm8gZm9sZGluZy4KKyAgICBTcGVjaWFsLCAvLy88IEEgc3BlY2lhbCBjYXNlIG9mIGJhc2ljLCBhbGxvd2luZyAtMSBzY2FsZXMuCisgICAgQWRkcmVzcywgLy8vPCBBbiBhZGRyZXNzIHVzZTsgZm9sZGluZyBhY2NvcmRpbmcgdG8gVGFyZ2V0TG93ZXJpbmcKKyAgICBJQ21wWmVybyAvLy88IEFuIGVxdWFsaXR5IGljbXAgd2l0aCBib3RoIG9wZXJhbmRzIGZvbGRlZCBpbnRvIG9uZS4KKyAgICAvLyBUT0RPOiBBZGQgYSBnZW5lcmljIGljbXAgdG9vPworICB9OworCisgIEtpbmRUeXBlIEtpbmQ7CisgIGNvbnN0IFR5cGUgKkFjY2Vzc1R5OworCisgIFNtYWxsVmVjdG9yPGludDY0X3QsIDg+IE9mZnNldHM7CisgIGludDY0X3QgTWluT2Zmc2V0OworICBpbnQ2NF90IE1heE9mZnNldDsKKworICAvLy8gQWxsRml4dXBzT3V0c2lkZUxvb3AgLSBUaGlzIHJlY29yZHMgd2hldGhlciBhbGwgb2YgdGhlIGZpeHVwcyB1c2luZyB0aGlzCisgIC8vLyBMU1JVc2UgYXJlIG91dHNpZGUgb2YgdGhlIGxvb3AsIGluIHdoaWNoIGNhc2Ugc29tZSBzcGVjaWFsLWNhc2UgaGV1cmlzdGljcworICAvLy8gbWF5IGJlIHVzZWQuCisgIGJvb2wgQWxsRml4dXBzT3V0c2lkZUxvb3A7CisKKyAgLy8vIFdpZGVzdEZpeHVwVHlwZSAtIFRoaXMgcmVjb3JkcyB0aGUgd2lkZXN0IHVzZSB0eXBlIGZvciBhbnkgZml4dXAgdXNpbmcKKyAgLy8vIHRoaXMgTFNSVXNlLiBGaW5kVXNlV2l0aFNpbWlsYXJGb3JtdWxhIGNhbid0IGNvbnNpZGVyIHVzZXMgd2l0aCBkaWZmZXJlbnQKKyAgLy8vIG1heCBmaXh1cCB3aWR0aHMgdG8gYmUgZXF1aXZhbGVudCwgYmVjYXVzZSB0aGUgbmFycm93ZXIgb25lIG1heSBiZSByZWx5aW5nCisgIC8vLyBvbiB0aGUgaW1wbGljaXQgdHJ1bmNhdGlvbiB0byB0cnVuY2F0ZSBhd2F5IGJvZ3VzIGJpdHMuCisgIGNvbnN0IFR5cGUgKldpZGVzdEZpeHVwVHlwZTsKKworICAvLy8gRm9ybXVsYWUgLSBBIGxpc3Qgb2Ygd2F5cyB0byBidWlsZCBhIHZhbHVlIHRoYXQgY2FuIHNhdGlzZnkgdGhpcyB1c2VyLgorICAvLy8gQWZ0ZXIgdGhlIGxpc3QgaXMgcG9wdWxhdGVkLCBvbmUgb2YgdGhlc2UgaXMgc2VsZWN0ZWQgaGV1cmlzdGljYWxseSBhbmQKKyAgLy8vIHVzZWQgdG8gZm9ybXVsYXRlIGEgcmVwbGFjZW1lbnQgZm9yIE9wZXJhbmRWYWxUb1JlcGxhY2UgaW4gVXNlckluc3QuCisgIFNtYWxsVmVjdG9yPEZvcm11bGEsIDEyPiBGb3JtdWxhZTsKKworICAvLy8gUmVncyAtIFRoZSBzZXQgb2YgcmVnaXN0ZXIgY2FuZGlkYXRlcyB1c2VkIGJ5IGFsbCBmb3JtdWxhZSBpbiB0aGlzIExTUlVzZS4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgU0NFViAqLCA0PiBSZWdzOworCisgIExTUlVzZShLaW5kVHlwZSBLLCBjb25zdCBUeXBlICpUKSA6IEtpbmQoSyksIEFjY2Vzc1R5KFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5PZmZzZXQoSU5UNjRfTUFYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4T2Zmc2V0KElOVDY0X01JTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbEZpeHVwc091dHNpZGVMb29wKHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlc3RGaXh1cFR5cGUoMCkge30KKworICBib29sIEhhc0Zvcm11bGFXaXRoU2FtZVJlZ3MoY29uc3QgRm9ybXVsYSAmRikgY29uc3Q7CisgIGJvb2wgSW5zZXJ0Rm9ybXVsYShjb25zdCBGb3JtdWxhICZGKTsKKyAgdm9pZCBEZWxldGVGb3JtdWxhKEZvcm11bGEgJkYpOworICB2b2lkIFJlY29tcHV0ZVJlZ3Moc2l6ZV90IExVSWR4LCBSZWdVc2VUcmFja2VyICZSZWd1c2VzKTsKKworICB2b2lkIGNoZWNrKCkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK30KKworLy8vIEhhc0Zvcm11bGEgLSBUZXN0IHdoZXRoZXIgdGhpcyB1c2UgYXMgYSBmb3JtdWxhIHdoaWNoIGhhcyB0aGUgc2FtZQorLy8vIHJlZ2lzdGVycyBhcyB0aGUgZ2l2ZW4gZm9ybXVsYS4KK2Jvb2wgTFNSVXNlOjpIYXNGb3JtdWxhV2l0aFNhbWVSZWdzKGNvbnN0IEZvcm11bGEgJkYpIGNvbnN0IHsKKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBLZXkgPSBGLkJhc2VSZWdzOworICBpZiAoRi5TY2FsZWRSZWcpIEtleS5wdXNoX2JhY2soRi5TY2FsZWRSZWcpOworICAvLyBVbnN0YWJsZSBzb3J0IGJ5IGhvc3Qgb3JkZXIgb2ssIGJlY2F1c2UgdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHVuaXF1aWZ5aW5nLgorICBzdGQ6OnNvcnQoS2V5LmJlZ2luKCksIEtleS5lbmQoKSk7CisgIHJldHVybiBVbmlxdWlmaWVyLmNvdW50KEtleSk7Cit9CisKKy8vLyBJbnNlcnRGb3JtdWxhIC0gSWYgdGhlIGdpdmVuIGZvcm11bGEgaGFzIG5vdCB5ZXQgYmVlbiBpbnNlcnRlZCwgYWRkIGl0IHRvCisvLy8gdGhlIGxpc3QsIGFuZCByZXR1cm4gdHJ1ZS4gUmV0dXJuIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgTFNSVXNlOjpJbnNlcnRGb3JtdWxhKGNvbnN0IEZvcm11bGEgJkYpIHsKKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBLZXkgPSBGLkJhc2VSZWdzOworICBpZiAoRi5TY2FsZWRSZWcpIEtleS5wdXNoX2JhY2soRi5TY2FsZWRSZWcpOworICAvLyBVbnN0YWJsZSBzb3J0IGJ5IGhvc3Qgb3JkZXIgb2ssIGJlY2F1c2UgdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHVuaXF1aWZ5aW5nLgorICBzdGQ6OnNvcnQoS2V5LmJlZ2luKCksIEtleS5lbmQoKSk7CisKKyAgaWYgKCFVbmlxdWlmaWVyLmluc2VydChLZXkpLnNlY29uZCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVXNpbmcgYSByZWdpc3RlciB0byBob2xkIHRoZSB2YWx1ZSBvZiAwIGlzIG5vdCBwcm9maXRhYmxlLgorICBhc3NlcnQoKCFGLlNjYWxlZFJlZyB8fCAhRi5TY2FsZWRSZWctPmlzWmVybygpKSAmJgorICAgICAgICAgIlplcm8gYWxsb2NhdGVkIGluIGEgc2NhbGVkIHJlZ2lzdGVyISIpOworI2lmbmRlZiBOREVCVUcKKyAgZm9yIChTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPjo6Y29uc3RfaXRlcmF0b3IgSSA9CisgICAgICAgRi5CYXNlUmVncy5iZWdpbigpLCBFID0gRi5CYXNlUmVncy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgYXNzZXJ0KCEoKkkpLT5pc1plcm8oKSAmJiAiWmVybyBhbGxvY2F0ZWQgaW4gYSBiYXNlIHJlZ2lzdGVyISIpOworI2VuZGlmCisKKyAgLy8gQWRkIHRoZSBmb3JtdWxhIHRvIHRoZSBsaXN0LgorICBGb3JtdWxhZS5wdXNoX2JhY2soRik7CisKKyAgLy8gUmVjb3JkIHJlZ2lzdGVycyBub3cgYmVpbmcgdXNlZCBieSB0aGlzIHVzZS4KKyAgaWYgKEYuU2NhbGVkUmVnKSBSZWdzLmluc2VydChGLlNjYWxlZFJlZyk7CisgIFJlZ3MuaW5zZXJ0KEYuQmFzZVJlZ3MuYmVnaW4oKSwgRi5CYXNlUmVncy5lbmQoKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBEZWxldGVGb3JtdWxhIC0gUmVtb3ZlIHRoZSBnaXZlbiBmb3JtdWxhIGZyb20gdGhpcyB1c2UncyBsaXN0Lgordm9pZCBMU1JVc2U6OkRlbGV0ZUZvcm11bGEoRm9ybXVsYSAmRikgeworICBpZiAoJkYgIT0gJkZvcm11bGFlLmJhY2soKSkKKyAgICBzdGQ6OnN3YXAoRiwgRm9ybXVsYWUuYmFjaygpKTsKKyAgRm9ybXVsYWUucG9wX2JhY2soKTsKKyAgYXNzZXJ0KCFGb3JtdWxhZS5lbXB0eSgpICYmICJMU1JVc2UgaGFzIG5vIGZvcm11bGFlIGxlZnQhIik7Cit9CisKKy8vLyBSZWNvbXB1dGVSZWdzIC0gUmVjb21wdXRlIHRoZSBSZWdzIGZpZWxkLCBhbmQgdXBkYXRlIFJlZ1VzZXMuCit2b2lkIExTUlVzZTo6UmVjb21wdXRlUmVncyhzaXplX3QgTFVJZHgsIFJlZ1VzZVRyYWNrZXIgJlJlZ1VzZXMpIHsKKyAgLy8gTm93IHRoYXQgd2UndmUgZmlsdGVyZWQgb3V0IHNvbWUgZm9ybXVsYWUsIHJlY29tcHV0ZSB0aGUgUmVncyBzZXQuCisgIFNtYWxsUHRyU2V0PGNvbnN0IFNDRVYgKiwgND4gT2xkUmVncyA9IFJlZ3M7CisgIFJlZ3MuY2xlYXIoKTsKKyAgZm9yIChTbWFsbFZlY3RvckltcGw8Rm9ybXVsYT46OmNvbnN0X2l0ZXJhdG9yIEkgPSBGb3JtdWxhZS5iZWdpbigpLAorICAgICAgIEUgPSBGb3JtdWxhZS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBGb3JtdWxhICZGID0gKkk7CisgICAgaWYgKEYuU2NhbGVkUmVnKSBSZWdzLmluc2VydChGLlNjYWxlZFJlZyk7CisgICAgUmVncy5pbnNlcnQoRi5CYXNlUmVncy5iZWdpbigpLCBGLkJhc2VSZWdzLmVuZCgpKTsKKyAgfQorCisgIC8vIFVwZGF0ZSB0aGUgUmVnVHJhY2tlci4KKyAgZm9yIChTbWFsbFB0clNldDxjb25zdCBTQ0VWICosIDQ+OjppdGVyYXRvciBJID0gT2xkUmVncy5iZWdpbigpLAorICAgICAgIEUgPSBPbGRSZWdzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoIVJlZ3MuY291bnQoKkkpKQorICAgICAgUmVnVXNlcy5Ecm9wUmVnaXN0ZXIoKkksIExVSWR4KTsKK30KKwordm9pZCBMU1JVc2U6OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBPUyA8PCAiTFNSIFVzZTogS2luZD0iOworICBzd2l0Y2ggKEtpbmQpIHsKKyAgY2FzZSBCYXNpYzogICAgT1MgPDwgIkJhc2ljIjsgYnJlYWs7CisgIGNhc2UgU3BlY2lhbDogIE9TIDw8ICJTcGVjaWFsIjsgYnJlYWs7CisgIGNhc2UgSUNtcFplcm86IE9TIDw8ICJJQ21wWmVybyI7IGJyZWFrOworICBjYXNlIEFkZHJlc3M6CisgICAgT1MgPDwgIkFkZHJlc3Mgb2YgIjsKKyAgICBpZiAoQWNjZXNzVHktPmlzUG9pbnRlclR5KCkpCisgICAgICBPUyA8PCAicG9pbnRlciI7IC8vIHRoZSBmdWxsIHBvaW50ZXIgdHlwZSBjb3VsZCBiZSByZWFsbHkgdmVyYm9zZQorICAgIGVsc2UKKyAgICAgIE9TIDw8ICpBY2Nlc3NUeTsKKyAgfQorCisgIE9TIDw8ICIsIE9mZnNldHM9eyI7CisgIGZvciAoU21hbGxWZWN0b3JJbXBsPGludDY0X3Q+Ojpjb25zdF9pdGVyYXRvciBJID0gT2Zmc2V0cy5iZWdpbigpLAorICAgICAgIEUgPSBPZmZzZXRzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE9TIDw8ICpJOworICAgIGlmIChsbHZtOjpuZXh0KEkpICE9IEUpCisgICAgICBPUyA8PCAnLCc7CisgIH0KKyAgT1MgPDwgJ30nOworCisgIGlmIChBbGxGaXh1cHNPdXRzaWRlTG9vcCkKKyAgICBPUyA8PCAiLCBhbGwtZml4dXBzLW91dHNpZGUtbG9vcCI7CisKKyAgaWYgKFdpZGVzdEZpeHVwVHlwZSkKKyAgICBPUyA8PCAiLCB3aWRlc3QgZml4dXAgdHlwZTogIiA8PCAqV2lkZXN0Rml4dXBUeXBlOworfQorCit2b2lkIExTUlVzZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZXJycygpKTsgZXJycygpIDw8ICdcbic7Cit9CisKKy8vLyBpc0xlZ2FsVXNlIC0gVGVzdCB3aGV0aGVyIHRoZSB1c2UgZGVzY3JpYmVkIGJ5IEFNIGlzICJsZWdhbCIsIG1lYW5pbmcgaXQgY2FuCisvLy8gYmUgY29tcGxldGVseSBmb2xkZWQgaW50byB0aGUgdXNlciBpbnN0cnVjdGlvbiBhdCBpc2VsIHRpbWUuIFRoaXMgaW5jbHVkZXMKKy8vLyBhZGRyZXNzLW1vZGUgZm9sZGluZyBhbmQgc3BlY2lhbCBpY21wIHRyaWNrcy4KK3N0YXRpYyBib29sIGlzTGVnYWxVc2UoY29uc3QgVGFyZ2V0TG93ZXJpbmc6OkFkZHJNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgTFNSVXNlOjpLaW5kVHlwZSBLaW5kLCBjb25zdCBUeXBlICpBY2Nlc3NUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSSkgeworICBzd2l0Y2ggKEtpbmQpIHsKKyAgY2FzZSBMU1JVc2U6OkFkZHJlc3M6CisgICAgLy8gSWYgd2UgaGF2ZSBsb3ctbGV2ZWwgdGFyZ2V0IGluZm9ybWF0aW9uLCBhc2sgdGhlIHRhcmdldCBpZiBpdCBjYW4KKyAgICAvLyBjb21wbGV0ZWx5IGZvbGQgdGhpcyBhZGRyZXNzLgorICAgIGlmIChUTEkpIHJldHVybiBUTEktPmlzTGVnYWxBZGRyZXNzaW5nTW9kZShBTSwgQWNjZXNzVHkpOworCisgICAgLy8gT3RoZXJ3aXNlLCBqdXN0IGd1ZXNzIHRoYXQgcmVnK3JlZyBhZGRyZXNzaW5nIGlzIGxlZ2FsLgorICAgIHJldHVybiAhQU0uQmFzZUdWICYmIEFNLkJhc2VPZmZzID09IDAgJiYgQU0uU2NhbGUgPD0gMTsKKworICBjYXNlIExTUlVzZTo6SUNtcFplcm86CisgICAgLy8gVGhlcmUncyBub3QgZXZlbiBhIHRhcmdldCBob29rIGZvciBxdWVyeWluZyB3aGV0aGVyIGl0IHdvdWxkIGJlIGxlZ2FsIHRvCisgICAgLy8gZm9sZCBhIEdWIGludG8gYW4gSUNtcC4KKyAgICBpZiAoQU0uQmFzZUdWKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSUNtcCBvbmx5IGhhcyB0d28gb3BlcmFuZHM7IGRvbid0IGFsbG93IG1vcmUgdGhhbiB0d28gbm9uLXRyaXZpYWwgcGFydHMuCisgICAgaWYgKEFNLlNjYWxlICE9IDAgJiYgQU0uSGFzQmFzZVJlZyAmJiBBTS5CYXNlT2ZmcyAhPSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSUNtcCBvbmx5IHN1cHBvcnRzIG5vIHNjYWxlIG9yIGEgLTEgc2NhbGUsIGFzIHdlIGNhbiAiZm9sZCIgYSAtMSBzY2FsZSBieQorICAgIC8vIHB1dHRpbmcgdGhlIHNjYWxlZCByZWdpc3RlciBpbiB0aGUgb3RoZXIgb3BlcmFuZCBvZiB0aGUgaWNtcC4KKyAgICBpZiAoQU0uU2NhbGUgIT0gMCAmJiBBTS5TY2FsZSAhPSAtMSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHdlIGhhdmUgbG93LWxldmVsIHRhcmdldCBpbmZvcm1hdGlvbiwgYXNrIHRoZSB0YXJnZXQgaWYgaXQgY2FuIGZvbGQgYW4KKyAgICAvLyBpbnRlZ2VyIGltbWVkaWF0ZSBvbiBhbiBpY21wLgorICAgIGlmIChBTS5CYXNlT2ZmcyAhPSAwKSB7CisgICAgICBpZiAoVExJKSByZXR1cm4gVExJLT5pc0xlZ2FsSUNtcEltbWVkaWF0ZSgtQU0uQmFzZU9mZnMpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgTFNSVXNlOjpCYXNpYzoKKyAgICAvLyBPbmx5IGhhbmRsZSBzaW5nbGUtcmVnaXN0ZXIgdmFsdWVzLgorICAgIHJldHVybiAhQU0uQmFzZUdWICYmIEFNLlNjYWxlID09IDAgJiYgQU0uQmFzZU9mZnMgPT0gMDsKKworICBjYXNlIExTUlVzZTo6U3BlY2lhbDoKKyAgICAvLyBPbmx5IGhhbmRsZSAtMSBzY2FsZXMsIG9yIG5vIHNjYWxlLgorICAgIHJldHVybiBBTS5TY2FsZSA9PSAwIHx8IEFNLlNjYWxlID09IC0xOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc0xlZ2FsVXNlKFRhcmdldExvd2VyaW5nOjpBZGRyTW9kZSBBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBNaW5PZmZzZXQsIGludDY0X3QgTWF4T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBMU1JVc2U6OktpbmRUeXBlIEtpbmQsIGNvbnN0IFR5cGUgKkFjY2Vzc1R5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAqVExJKSB7CisgIC8vIENoZWNrIGZvciBvdmVyZmxvdy4KKyAgaWYgKCgoaW50NjRfdCkoKHVpbnQ2NF90KUFNLkJhc2VPZmZzICsgTWluT2Zmc2V0KSA+IEFNLkJhc2VPZmZzKSAhPQorICAgICAgKE1pbk9mZnNldCA+IDApKQorICAgIHJldHVybiBmYWxzZTsKKyAgQU0uQmFzZU9mZnMgPSAodWludDY0X3QpQU0uQmFzZU9mZnMgKyBNaW5PZmZzZXQ7CisgIGlmIChpc0xlZ2FsVXNlKEFNLCBLaW5kLCBBY2Nlc3NUeSwgVExJKSkgeworICAgIEFNLkJhc2VPZmZzID0gKHVpbnQ2NF90KUFNLkJhc2VPZmZzIC0gTWluT2Zmc2V0OworICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdy4KKyAgICBpZiAoKChpbnQ2NF90KSgodWludDY0X3QpQU0uQmFzZU9mZnMgKyBNYXhPZmZzZXQpID4gQU0uQmFzZU9mZnMpICE9CisgICAgICAgIChNYXhPZmZzZXQgPiAwKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBBTS5CYXNlT2ZmcyA9ICh1aW50NjRfdClBTS5CYXNlT2ZmcyArIE1heE9mZnNldDsKKyAgICByZXR1cm4gaXNMZWdhbFVzZShBTSwgS2luZCwgQWNjZXNzVHksIFRMSSk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc0Fsd2F5c0ZvbGRhYmxlKGludDY0X3QgQmFzZU9mZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlICpCYXNlR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFNSVXNlOjpLaW5kVHlwZSBLaW5kLCBjb25zdCBUeXBlICpBY2Nlc3NUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSSkgeworICAvLyBGYXN0LXBhdGg6IHplcm8gaXMgYWx3YXlzIGZvbGRhYmxlLgorICBpZiAoQmFzZU9mZnMgPT0gMCAmJiAhQmFzZUdWKSByZXR1cm4gdHJ1ZTsKKworICAvLyBDb25zZXJ2YXRpdmVseSwgY3JlYXRlIGFuIGFkZHJlc3Mgd2l0aCBhbiBpbW1lZGlhdGUgYW5kIGEKKyAgLy8gYmFzZSBhbmQgYSBzY2FsZS4KKyAgVGFyZ2V0TG93ZXJpbmc6OkFkZHJNb2RlIEFNOworICBBTS5CYXNlT2ZmcyA9IEJhc2VPZmZzOworICBBTS5CYXNlR1YgPSBCYXNlR1Y7CisgIEFNLkhhc0Jhc2VSZWcgPSBIYXNCYXNlUmVnOworICBBTS5TY2FsZSA9IEtpbmQgPT0gTFNSVXNlOjpJQ21wWmVybyA/IC0xIDogMTsKKworICAvLyBDYW5vbmljYWxpemUgYSBzY2FsZSBvZiAxIHRvIGEgYmFzZSByZWdpc3RlciBpZiB0aGUgZm9ybXVsYSBkb2Vzbid0CisgIC8vIGFscmVhZHkgaGF2ZSBhIGJhc2UgcmVnaXN0ZXIuCisgIGlmICghQU0uSGFzQmFzZVJlZyAmJiBBTS5TY2FsZSA9PSAxKSB7CisgICAgQU0uU2NhbGUgPSAwOworICAgIEFNLkhhc0Jhc2VSZWcgPSB0cnVlOworICB9CisKKyAgcmV0dXJuIGlzTGVnYWxVc2UoQU0sIEtpbmQsIEFjY2Vzc1R5LCBUTEkpOworfQorCitzdGF0aWMgYm9vbCBpc0Fsd2F5c0ZvbGRhYmxlKGNvbnN0IFNDRVYgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgTWluT2Zmc2V0LCBpbnQ2NF90IE1heE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMU1JVc2U6OktpbmRUeXBlIEtpbmQsIGNvbnN0IFR5cGUgKkFjY2Vzc1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAqVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFKSB7CisgIC8vIEZhc3QtcGF0aDogemVybyBpcyBhbHdheXMgZm9sZGFibGUuCisgIGlmIChTLT5pc1plcm8oKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gQ29uc2VydmF0aXZlbHksIGNyZWF0ZSBhbiBhZGRyZXNzIHdpdGggYW4gaW1tZWRpYXRlIGFuZCBhCisgIC8vIGJhc2UgYW5kIGEgc2NhbGUuCisgIGludDY0X3QgQmFzZU9mZnMgPSBFeHRyYWN0SW1tZWRpYXRlKFMsIFNFKTsKKyAgR2xvYmFsVmFsdWUgKkJhc2VHViA9IEV4dHJhY3RTeW1ib2woUywgU0UpOworCisgIC8vIElmIHRoZXJlJ3MgYW55dGhpbmcgZWxzZSBpbnZvbHZlZCwgaXQncyBub3QgZm9sZGFibGUuCisgIGlmICghUy0+aXNaZXJvKCkpIHJldHVybiBmYWxzZTsKKworICAvLyBGYXN0LXBhdGg6IHplcm8gaXMgYWx3YXlzIGZvbGRhYmxlLgorICBpZiAoQmFzZU9mZnMgPT0gMCAmJiAhQmFzZUdWKSByZXR1cm4gdHJ1ZTsKKworICAvLyBDb25zZXJ2YXRpdmVseSwgY3JlYXRlIGFuIGFkZHJlc3Mgd2l0aCBhbiBpbW1lZGlhdGUgYW5kIGEKKyAgLy8gYmFzZSBhbmQgYSBzY2FsZS4KKyAgVGFyZ2V0TG93ZXJpbmc6OkFkZHJNb2RlIEFNOworICBBTS5CYXNlT2ZmcyA9IEJhc2VPZmZzOworICBBTS5CYXNlR1YgPSBCYXNlR1Y7CisgIEFNLkhhc0Jhc2VSZWcgPSBIYXNCYXNlUmVnOworICBBTS5TY2FsZSA9IEtpbmQgPT0gTFNSVXNlOjpJQ21wWmVybyA/IC0xIDogMTsKKworICByZXR1cm4gaXNMZWdhbFVzZShBTSwgTWluT2Zmc2V0LCBNYXhPZmZzZXQsIEtpbmQsIEFjY2Vzc1R5LCBUTEkpOworfQorCituYW1lc3BhY2UgeworCisvLy8gVXNlTWFwRGVuc2VNYXBJbmZvIC0gQSBEZW5zZU1hcEluZm8gaW1wbGVtZW50YXRpb24gZm9yIGhvbGRpbmcKKy8vLyBEZW5zZU1hcHMgYW5kIERlbnNlU2V0cyBvZiBwYWlycyBvZiBjb25zdCBTQ0VWKiBhbmQgTFNSVXNlOjpLaW5kLgorc3RydWN0IFVzZU1hcERlbnNlTWFwSW5mbyB7CisgIHN0YXRpYyBzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLCBMU1JVc2U6OktpbmRUeXBlPiBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBTQ0VWICo+KC0xKSwgTFNSVXNlOjpCYXNpYyk7CisgIH0KKworICBzdGF0aWMgc3RkOjpwYWlyPGNvbnN0IFNDRVYgKiwgTFNSVXNlOjpLaW5kVHlwZT4gZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihyZWludGVycHJldF9jYXN0PGNvbnN0IFNDRVYgKj4oLTIpLCBMU1JVc2U6OkJhc2ljKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZAorICBnZXRIYXNoVmFsdWUoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IFNDRVYgKiwgTFNSVXNlOjpLaW5kVHlwZT4gJlYpIHsKKyAgICB1bnNpZ25lZCBSZXN1bHQgPSBEZW5zZU1hcEluZm88Y29uc3QgU0NFViAqPjo6Z2V0SGFzaFZhbHVlKFYuZmlyc3QpOworICAgIFJlc3VsdCBePSBEZW5zZU1hcEluZm88dW5zaWduZWQ+OjpnZXRIYXNoVmFsdWUodW5zaWduZWQoVi5zZWNvbmQpKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLCBMU1JVc2U6OktpbmRUeXBlPiAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBTQ0VWICosIExTUlVzZTo6S2luZFR5cGU+ICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8vIEZvcm11bGFTb3J0ZXIgLSBUaGlzIGNsYXNzIGltcGxlbWVudHMgYW4gb3JkZXJpbmcgZm9yIGZvcm11bGFlIHdoaWNoIHNvcnRzCisvLy8gdGhlIGJ5IHRoZWlyIHN0YW5kYWxvbmUgY29zdC4KK2NsYXNzIEZvcm11bGFTb3J0ZXIgeworICAvLy8gVGhlc2UgdHdvIHNldHMgYXJlIGtlcHQgZW1wdHksIHNvIHRoYXQgd2UgY29tcHV0ZSBzdGFuZGFsb25lIGNvc3RzLgorICBEZW5zZVNldDxjb25zdCBTQ0VWICo+IFZpc2l0ZWRSZWdzOworICBTbWFsbFB0clNldDxjb25zdCBTQ0VWICosIDE2PiBSZWdzOworICBMb29wICpMOworICBMU1JVc2UgKkxVOworICBTY2FsYXJFdm9sdXRpb24gJlNFOworICBEb21pbmF0b3JUcmVlICZEVDsKKworcHVibGljOgorICBGb3JtdWxhU29ydGVyKExvb3AgKmwsIExTUlVzZSAmbHUsIFNjYWxhckV2b2x1dGlvbiAmc2UsIERvbWluYXRvclRyZWUgJmR0KQorICAgIDogTChsKSwgTFUoJmx1KSwgU0Uoc2UpLCBEVChkdCkge30KKworICBib29sIG9wZXJhdG9yKCkoY29uc3QgRm9ybXVsYSAmQSwgY29uc3QgRm9ybXVsYSAmQikgeworICAgIENvc3QgQ29zdEE7CisgICAgQ29zdEEuUmF0ZUZvcm11bGEoQSwgUmVncywgVmlzaXRlZFJlZ3MsIEwsIExVLT5PZmZzZXRzLCBTRSwgRFQpOworICAgIFJlZ3MuY2xlYXIoKTsKKyAgICBDb3N0IENvc3RCOworICAgIENvc3RCLlJhdGVGb3JtdWxhKEIsIFJlZ3MsIFZpc2l0ZWRSZWdzLCBMLCBMVS0+T2Zmc2V0cywgU0UsIERUKTsKKyAgICBSZWdzLmNsZWFyKCk7CisgICAgcmV0dXJuIENvc3RBIDwgQ29zdEI7CisgIH0KK307CisKKy8vLyBMU1JJbnN0YW5jZSAtIFRoaXMgY2xhc3MgaG9sZHMgc3RhdGUgZm9yIHRoZSBtYWluIGxvb3Agc3RyZW5ndGggcmVkdWN0aW9uCisvLy8gbG9naWMuCitjbGFzcyBMU1JJbnN0YW5jZSB7CisgIElWVXNlcnMgJklVOworICBTY2FsYXJFdm9sdXRpb24gJlNFOworICBEb21pbmF0b3JUcmVlICZEVDsKKyAgTG9vcEluZm8gJkxJOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAqY29uc3QgVExJOworICBMb29wICpjb25zdCBMOworICBib29sIENoYW5nZWQ7CisKKyAgLy8vIElWSW5jSW5zZXJ0UG9zIC0gVGhpcyBpcyB0aGUgaW5zZXJ0IHBvc2l0aW9uIHRoYXQgdGhlIGN1cnJlbnQgbG9vcCdzCisgIC8vLyBpbmR1Y3Rpb24gdmFyaWFibGUgaW5jcmVtZW50IHNob3VsZCBiZSBwbGFjZWQuIEluIHNpbXBsZSBsb29wcywgdGhpcyBpcworICAvLy8gdGhlIGxhdGNoIGJsb2NrJ3MgdGVybWluYXRvci4gQnV0IGluIG1vcmUgY29tcGxpY2F0ZWQgY2FzZXMsIHRoaXMgaXMgYQorICAvLy8gcG9zaXRpb24gd2hpY2ggd2lsbCBkb21pbmF0ZSBhbGwgdGhlIGluLWxvb3AgcG9zdC1pbmNyZW1lbnQgdXNlcnMuCisgIEluc3RydWN0aW9uICpJVkluY0luc2VydFBvczsKKworICAvLy8gRmFjdG9ycyAtIEludGVyZXN0aW5nIGZhY3RvcnMgYmV0d2VlbiB1c2Ugc3RyaWRlcy4KKyAgU21hbGxTZXRWZWN0b3I8aW50NjRfdCwgOD4gRmFjdG9yczsKKworICAvLy8gVHlwZXMgLSBJbnRlcmVzdGluZyB1c2UgdHlwZXMsIHRvIGZhY2lsaXRhdGUgdHJ1bmNhdGlvbiByZXVzZS4KKyAgU21hbGxTZXRWZWN0b3I8Y29uc3QgVHlwZSAqLCA0PiBUeXBlczsKKworICAvLy8gRml4dXBzIC0gVGhlIGxpc3Qgb2Ygb3BlcmFuZHMgd2hpY2ggYXJlIHRvIGJlIHJlcGxhY2VkLgorICBTbWFsbFZlY3RvcjxMU1JGaXh1cCwgMTY+IEZpeHVwczsKKworICAvLy8gVXNlcyAtIFRoZSBsaXN0IG9mIGludGVyZXN0aW5nIHVzZXMuCisgIFNtYWxsVmVjdG9yPExTUlVzZSwgMTY+IFVzZXM7CisKKyAgLy8vIFJlZ1VzZXMgLSBUcmFjayB3aGljaCB1c2VzIHVzZSB3aGljaCByZWdpc3RlciBjYW5kaWRhdGVzLgorICBSZWdVc2VUcmFja2VyIFJlZ1VzZXM7CisKKyAgdm9pZCBPcHRpbWl6ZVNoYWRvd0lWKCk7CisgIGJvb2wgRmluZElWVXNlckZvckNvbmQoSUNtcEluc3QgKkNvbmQsIElWU3RyaWRlVXNlIComQ29uZFVzZSk7CisgIElDbXBJbnN0ICpPcHRpbWl6ZU1heChJQ21wSW5zdCAqQ29uZCwgSVZTdHJpZGVVc2UqICZDb25kVXNlKTsKKyAgdm9pZCBPcHRpbWl6ZUxvb3BUZXJtQ29uZCgpOworCisgIHZvaWQgQ29sbGVjdEludGVyZXN0aW5nVHlwZXNBbmRGYWN0b3JzKCk7CisgIHZvaWQgQ29sbGVjdEZpeHVwc0FuZEluaXRpYWxGb3JtdWxhZSgpOworCisgIExTUkZpeHVwICZnZXROZXdGaXh1cCgpIHsKKyAgICBGaXh1cHMucHVzaF9iYWNrKExTUkZpeHVwKCkpOworICAgIHJldHVybiBGaXh1cHMuYmFjaygpOworICB9CisKKyAgLy8gU3VwcG9ydCBmb3Igc2hhcmluZyBvZiBMU1JVc2VzIGJldHdlZW4gTFNSRml4dXBzLgorICB0eXBlZGVmIERlbnNlTWFwPHN0ZDo6cGFpcjxjb25zdCBTQ0VWICosIExTUlVzZTo6S2luZFR5cGU+LAorICAgICAgICAgICAgICAgICAgIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICBVc2VNYXBEZW5zZU1hcEluZm8+IFVzZU1hcFR5OworICBVc2VNYXBUeSBVc2VNYXA7CisKKyAgYm9vbCByZWNvbmNpbGVOZXdPZmZzZXQoTFNSVXNlICZMVSwgaW50NjRfdCBOZXdPZmZzZXQsIGJvb2wgSGFzQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFNSVXNlOjpLaW5kVHlwZSBLaW5kLCBjb25zdCBUeXBlICpBY2Nlc3NUeSk7CisKKyAgc3RkOjpwYWlyPHNpemVfdCwgaW50NjRfdD4gZ2V0VXNlKGNvbnN0IFNDRVYgKiZFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFNSVXNlOjpLaW5kVHlwZSBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqQWNjZXNzVHkpOworCisgIHZvaWQgRGVsZXRlVXNlKExTUlVzZSAmTFUpOworCisgIExTUlVzZSAqRmluZFVzZVdpdGhTaW1pbGFyRm9ybXVsYShjb25zdCBGb3JtdWxhICZGLCBjb25zdCBMU1JVc2UgJk9yaWdMVSk7CisKK3B1YmxpYzoKKyAgdm9pZCBJbnNlcnRJbml0aWFsRm9ybXVsYShjb25zdCBTQ0VWICpTLCBMU1JVc2UgJkxVLCBzaXplX3QgTFVJZHgpOworICB2b2lkIEluc2VydFN1cHBsZW1lbnRhbEZvcm11bGEoY29uc3QgU0NFViAqUywgTFNSVXNlICZMVSwgc2l6ZV90IExVSWR4KTsKKyAgdm9pZCBDb3VudFJlZ2lzdGVycyhjb25zdCBGb3JtdWxhICZGLCBzaXplX3QgTFVJZHgpOworICBib29sIEluc2VydEZvcm11bGEoTFNSVXNlICZMVSwgdW5zaWduZWQgTFVJZHgsIGNvbnN0IEZvcm11bGEgJkYpOworCisgIHZvaWQgQ29sbGVjdExvb3BJbnZhcmlhbnRGaXh1cHNBbmRGb3JtdWxhZSgpOworCisgIHZvaWQgR2VuZXJhdGVSZWFzc29jaWF0aW9ucyhMU1JVc2UgJkxVLCB1bnNpZ25lZCBMVUlkeCwgRm9ybXVsYSBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKTsKKyAgdm9pZCBHZW5lcmF0ZUNvbWJpbmF0aW9ucyhMU1JVc2UgJkxVLCB1bnNpZ25lZCBMVUlkeCwgRm9ybXVsYSBCYXNlKTsKKyAgdm9pZCBHZW5lcmF0ZVN5bWJvbGljT2Zmc2V0cyhMU1JVc2UgJkxVLCB1bnNpZ25lZCBMVUlkeCwgRm9ybXVsYSBCYXNlKTsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0YW50T2Zmc2V0cyhMU1JVc2UgJkxVLCB1bnNpZ25lZCBMVUlkeCwgRm9ybXVsYSBCYXNlKTsKKyAgdm9pZCBHZW5lcmF0ZUlDbXBaZXJvU2NhbGVzKExTUlVzZSAmTFUsIHVuc2lnbmVkIExVSWR4LCBGb3JtdWxhIEJhc2UpOworICB2b2lkIEdlbmVyYXRlU2NhbGVzKExTUlVzZSAmTFUsIHVuc2lnbmVkIExVSWR4LCBGb3JtdWxhIEJhc2UpOworICB2b2lkIEdlbmVyYXRlVHJ1bmNhdGVzKExTUlVzZSAmTFUsIHVuc2lnbmVkIExVSWR4LCBGb3JtdWxhIEJhc2UpOworICB2b2lkIEdlbmVyYXRlQ3Jvc3NVc2VDb25zdGFudE9mZnNldHMoKTsKKyAgdm9pZCBHZW5lcmF0ZUFsbFJldXNlRm9ybXVsYWUoKTsKKworICB2b2lkIEZpbHRlck91dFVuZGVzaXJhYmxlRGVkaWNhdGVkUmVnaXN0ZXJzKCk7CisKKyAgc2l6ZV90IEVzdGltYXRlU2VhcmNoU3BhY2VDb21wbGV4aXR5KCkgY29uc3Q7CisgIHZvaWQgTmFycm93U2VhcmNoU3BhY2VVc2luZ0hldXJpc3RpY3MoKTsKKworICB2b2lkIFNvbHZlUmVjdXJzZShTbWFsbFZlY3RvckltcGw8Y29uc3QgRm9ybXVsYSAqPiAmU29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgIENvc3QgJlNvbHV0aW9uQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IEZvcm11bGEgKj4gJldvcmtzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29zdCAmQ3VyQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxQdHJTZXQ8Y29uc3QgU0NFViAqLCAxNj4gJkN1clJlZ3MsCisgICAgICAgICAgICAgICAgICAgIERlbnNlU2V0PGNvbnN0IFNDRVYgKj4gJlZpc2l0ZWRSZWdzKSBjb25zdDsKKyAgdm9pZCBTb2x2ZShTbWFsbFZlY3RvckltcGw8Y29uc3QgRm9ybXVsYSAqPiAmU29sdXRpb24pIGNvbnN0OworCisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yCisgICAgSG9pc3RJbnNlcnRQb3NpdGlvbihCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAmSW5wdXRzKSBjb25zdDsKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQWRqdXN0SW5zZXJ0UG9zaXRpb25Gb3JFeHBhbmQoQmFzaWNCbG9jazo6aXRlcmF0b3IgSVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExTUkZpeHVwICZMRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFNSVXNlICZMVSkgY29uc3Q7CisKKyAgVmFsdWUgKkV4cGFuZChjb25zdCBMU1JGaXh1cCAmTEYsCisgICAgICAgICAgICAgICAgY29uc3QgRm9ybXVsYSAmRiwKKyAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCwKKyAgICAgICAgICAgICAgICBTQ0VWRXhwYW5kZXIgJlJld3JpdGVyLAorICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxXZWFrVkg+ICZEZWFkSW5zdHMpIGNvbnN0OworICB2b2lkIFJld3JpdGVGb3JQSEkoUEhJTm9kZSAqUE4sIGNvbnN0IExTUkZpeHVwICZMRiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm11bGEgJkYsCisgICAgICAgICAgICAgICAgICAgICBTQ0VWRXhwYW5kZXIgJlJld3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFdlYWtWSD4gJkRlYWRJbnN0cywKKyAgICAgICAgICAgICAgICAgICAgIFBhc3MgKlApIGNvbnN0OworICB2b2lkIFJld3JpdGUoY29uc3QgTFNSRml4dXAgJkxGLAorICAgICAgICAgICAgICAgY29uc3QgRm9ybXVsYSAmRiwKKyAgICAgICAgICAgICAgIFNDRVZFeHBhbmRlciAmUmV3cml0ZXIsCisgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8V2Vha1ZIPiAmRGVhZEluc3RzLAorICAgICAgICAgICAgICAgUGFzcyAqUCkgY29uc3Q7CisgIHZvaWQgSW1wbGVtZW50U29sdXRpb24oY29uc3QgU21hbGxWZWN0b3JJbXBsPGNvbnN0IEZvcm11bGEgKj4gJlNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3MgKlApOworCisgIExTUkluc3RhbmNlKGNvbnN0IFRhcmdldExvd2VyaW5nICp0bGksIExvb3AgKmwsIFBhc3MgKlApOworCisgIGJvb2wgZ2V0Q2hhbmdlZCgpIGNvbnN0IHsgcmV0dXJuIENoYW5nZWQ7IH0KKworICB2b2lkIHByaW50X2ZhY3RvcnNfYW5kX3R5cGVzKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgcHJpbnRfZml4dXBzKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgcHJpbnRfdXNlcyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworfQorCisvLy8gT3B0aW1pemVTaGFkb3dJViAtIElmIElWIGlzIHVzZWQgaW4gYSBpbnQtdG8tZmxvYXQgY2FzdAorLy8vIGluc2lkZSB0aGUgbG9vcCB0aGVuIHRyeSB0byBlbGltaW5hdGUgdGhlIGNhc3Qgb3BlcmF0aW9uLgordm9pZCBMU1JJbnN0YW5jZTo6T3B0aW1pemVTaGFkb3dJVigpIHsKKyAgY29uc3QgU0NFViAqQmFja2VkZ2VUYWtlbkNvdW50ID0gU0UuZ2V0QmFja2VkZ2VUYWtlbkNvdW50KEwpOworICBpZiAoaXNhPFNDRVZDb3VsZE5vdENvbXB1dGU+KEJhY2tlZGdlVGFrZW5Db3VudCkpCisgICAgcmV0dXJuOworCisgIGZvciAoSVZVc2Vyczo6Y29uc3RfaXRlcmF0b3IgVUkgPSBJVS5iZWdpbigpLCBFID0gSVUuZW5kKCk7CisgICAgICAgVUkgIT0gRTsgLyogZW1wdHkgKi8pIHsKKyAgICBJVlVzZXJzOjpjb25zdF9pdGVyYXRvciBDYW5kaWRhdGVVSSA9IFVJOworICAgICsrVUk7CisgICAgSW5zdHJ1Y3Rpb24gKlNoYWRvd1VzZSA9IENhbmRpZGF0ZVVJLT5nZXRVc2VyKCk7CisgICAgY29uc3QgVHlwZSAqRGVzdFR5ID0gTlVMTDsKKworICAgIC8qIElmIHNoYWRvdyB1c2UgaXMgYSBpbnQtPmZsb2F0IGNhc3QgdGhlbiBpbnNlcnQgYSBzZWNvbmQgSVYKKyAgICAgICB0byBlbGltaW5hdGUgdGhpcyBjYXN0LgorCisgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAgICAgICBmb28oKGRvdWJsZSlpKTsKKworICAgICAgIGlzIHRyYW5zZm9ybWVkIGludG8KKworICAgICAgICAgZG91YmxlIGQgPSAwLjA7CisgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbjsgKytpLCArK2QpCisgICAgICAgICAgIGZvbyhkKTsKKyAgICAqLworICAgIGlmIChVSVRvRlBJbnN0ICpVQ2FzdCA9IGR5bl9jYXN0PFVJVG9GUEluc3Q+KENhbmRpZGF0ZVVJLT5nZXRVc2VyKCkpKQorICAgICAgRGVzdFR5ID0gVUNhc3QtPmdldERlc3RUeSgpOworICAgIGVsc2UgaWYgKFNJVG9GUEluc3QgKlNDYXN0ID0gZHluX2Nhc3Q8U0lUb0ZQSW5zdD4oQ2FuZGlkYXRlVUktPmdldFVzZXIoKSkpCisgICAgICBEZXN0VHkgPSBTQ2FzdC0+Z2V0RGVzdFR5KCk7CisgICAgaWYgKCFEZXN0VHkpIGNvbnRpbnVlOworCisgICAgaWYgKFRMSSkgeworICAgICAgLy8gSWYgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgRGVzdFR5IG5hdGl2ZWx5IHRoZW4gZG8gbm90IGFwcGx5CisgICAgICAvLyB0aGlzIHRyYW5zZm9ybWF0aW9uLgorICAgICAgRVZUIERWVCA9IFRMSS0+Z2V0VmFsdWVUeXBlKERlc3RUeSk7CisgICAgICBpZiAoIVRMSS0+aXNUeXBlTGVnYWwoRFZUKSkgY29udGludWU7CisgICAgfQorCisgICAgUEhJTm9kZSAqUEggPSBkeW5fY2FzdDxQSElOb2RlPihTaGFkb3dVc2UtPmdldE9wZXJhbmQoMCkpOworICAgIGlmICghUEgpIGNvbnRpbnVlOworICAgIGlmIChQSC0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKSAhPSAyKSBjb250aW51ZTsKKworICAgIGNvbnN0IFR5cGUgKlNyY1R5ID0gUEgtPmdldFR5cGUoKTsKKyAgICBpbnQgTWFudGlzc2EgPSBEZXN0VHktPmdldEZQTWFudGlzc2FXaWR0aCgpOworICAgIGlmIChNYW50aXNzYSA9PSAtMSkgY29udGludWU7CisgICAgaWYgKChpbnQpU0UuZ2V0VHlwZVNpemVJbkJpdHMoU3JjVHkpID4gTWFudGlzc2EpCisgICAgICBjb250aW51ZTsKKworICAgIHVuc2lnbmVkIEVudHJ5LCBMYXRjaDsKKyAgICBpZiAoUEgtPmdldEluY29taW5nQmxvY2soMCkgPT0gTC0+Z2V0TG9vcFByZWhlYWRlcigpKSB7CisgICAgICBFbnRyeSA9IDA7CisgICAgICBMYXRjaCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIEVudHJ5ID0gMTsKKyAgICAgIExhdGNoID0gMDsKKyAgICB9CisKKyAgICBDb25zdGFudEludCAqSW5pdCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihQSC0+Z2V0SW5jb21pbmdWYWx1ZShFbnRyeSkpOworICAgIGlmICghSW5pdCkgY29udGludWU7CisgICAgQ29uc3RhbnQgKk5ld0luaXQgPSBDb25zdGFudEZQOjpnZXQoRGVzdFR5LCBJbml0LT5nZXRaRXh0VmFsdWUoKSk7CisKKyAgICBCaW5hcnlPcGVyYXRvciAqSW5jciA9CisgICAgICBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oUEgtPmdldEluY29taW5nVmFsdWUoTGF0Y2gpKTsKKyAgICBpZiAoIUluY3IpIGNvbnRpbnVlOworICAgIGlmIChJbmNyLT5nZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6QWRkCisgICAgICAgICYmIEluY3ItPmdldE9wY29kZSgpICE9IEluc3RydWN0aW9uOjpTdWIpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIEluaXRpYWxpemUgbmV3IElWLCBkb3VibGUgZCA9IDAuMCBpbiBhYm92ZSBleGFtcGxlLiAqLworICAgIENvbnN0YW50SW50ICpDID0gTlVMTDsKKyAgICBpZiAoSW5jci0+Z2V0T3BlcmFuZCgwKSA9PSBQSCkKKyAgICAgIEMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSW5jci0+Z2V0T3BlcmFuZCgxKSk7CisgICAgZWxzZSBpZiAoSW5jci0+Z2V0T3BlcmFuZCgxKSA9PSBQSCkKKyAgICAgIEMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSW5jci0+Z2V0T3BlcmFuZCgwKSk7CisgICAgZWxzZQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIUMpIGNvbnRpbnVlOworCisgICAgLy8gSWdub3JlIG5lZ2F0aXZlIGNvbnN0YW50cywgYXMgdGhlIGNvZGUgYmVsb3cgZG9lc24ndCBoYW5kbGUgdGhlbQorICAgIC8vIGNvcnJlY3RseS4gVE9ETzogUmVtb3ZlIHRoaXMgcmVzdHJpY3Rpb24uCisgICAgaWYgKCFDLT5nZXRWYWx1ZSgpLmlzU3RyaWN0bHlQb3NpdGl2ZSgpKSBjb250aW51ZTsKKworICAgIC8qIEFkZCBuZXcgUEhJTm9kZS4gKi8KKyAgICBQSElOb2RlICpOZXdQSCA9IFBISU5vZGU6OkNyZWF0ZShEZXN0VHksIFBIKTsKKworICAgIC8qIGNyZWF0ZSBuZXcgaW5jcmVtZW50LiAnKytkJyBpbiBhYm92ZSBleGFtcGxlLiAqLworICAgIENvbnN0YW50ICpDRlAgPSBDb25zdGFudEZQOjpnZXQoRGVzdFR5LCBDLT5nZXRaRXh0VmFsdWUoKSk7CisgICAgQmluYXJ5T3BlcmF0b3IgKk5ld0luY3IgPQorICAgICAgQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShJbmNyLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWRkID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6RkFkZCA6IEluc3RydWN0aW9uOjpGU3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdQSCwgQ0ZQLCBJbmNyKTsKKworICAgIE5ld1BILT5hZGRJbmNvbWluZyhOZXdJbml0LCBQSC0+Z2V0SW5jb21pbmdCbG9jayhFbnRyeSkpOworICAgIE5ld1BILT5hZGRJbmNvbWluZyhOZXdJbmNyLCBQSC0+Z2V0SW5jb21pbmdCbG9jayhMYXRjaCkpOworCisgICAgLyogUmVtb3ZlIGNhc3Qgb3BlcmF0aW9uICovCisgICAgU2hhZG93VXNlLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3UEgpOworICAgIFNoYWRvd1VzZS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgYnJlYWs7CisgIH0KK30KKworLy8vIEZpbmRJVlVzZXJGb3JDb25kIC0gSWYgQ29uZCBoYXMgYW4gb3BlcmFuZCB0aGF0IGlzIGFuIGV4cHJlc3Npb24gb2YgYW4gSVYsCisvLy8gc2V0IHRoZSBJViB1c2VyIGFuZCBzdHJpZGUgaW5mb3JtYXRpb24gYW5kIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuCisvLy8gZmFsc2UuCitib29sIExTUkluc3RhbmNlOjpGaW5kSVZVc2VyRm9yQ29uZChJQ21wSW5zdCAqQ29uZCwgSVZTdHJpZGVVc2UgKiZDb25kVXNlKSB7CisgIGZvciAoSVZVc2Vyczo6aXRlcmF0b3IgVUkgPSBJVS5iZWdpbigpLCBFID0gSVUuZW5kKCk7IFVJICE9IEU7ICsrVUkpCisgICAgaWYgKFVJLT5nZXRVc2VyKCkgPT0gQ29uZCkgeworICAgICAgLy8gTk9URTogd2UgY291bGQgaGFuZGxlIHNldGNjIGluc3RydWN0aW9ucyB3aXRoIG11bHRpcGxlIHVzZXMgaGVyZSwgYnV0CisgICAgICAvLyBJbnN0Q29tYmluZSBkb2VzIGl0IGFzIHdlbGwgZm9yIHNpbXBsZSB1c2VzLCBpdCdzIG5vdCBjbGVhciB0aGF0IGl0CisgICAgICAvLyBvY2N1cnMgZW5vdWdoIGluIHJlYWwgbGlmZSB0byBoYW5kbGUuCisgICAgICBDb25kVXNlID0gVUk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIE9wdGltaXplTWF4IC0gUmV3cml0ZSB0aGUgbG9vcCdzIHRlcm1pbmF0aW5nIGNvbmRpdGlvbiBpZiBpdCB1c2VzCisvLy8gYSBtYXggY29tcHV0YXRpb24uCisvLy8KKy8vLyBUaGlzIGlzIGEgbmFycm93IHNvbHV0aW9uIHRvIGEgc3BlY2lmaWMsIGJ1dCBhY3V0ZSwgcHJvYmxlbS4gRm9yIGxvb3BzCisvLy8gbGlrZSB0aGlzOgorLy8vCisvLy8gICBpID0gMDsKKy8vLyAgIGRvIHsKKy8vLyAgICAgcFtpXSA9IDAuMDsKKy8vLyAgIH0gd2hpbGUgKCsraSA8IG4pOworLy8vCisvLy8gdGhlIHRyaXAgY291bnQgaXNuJ3QganVzdCAnbicsIGJlY2F1c2UgJ24nIG1pZ2h0IG5vdCBiZSBwb3NpdGl2ZS4gQW5kCisvLy8gdW5mb3J0dW5hdGVseSB0aGlzIGNhbiBjb21lIHVwIGV2ZW4gZm9yIGxvb3BzIHdoZXJlIHRoZSB1c2VyIGRpZG4ndCB1c2UKKy8vLyBhIEMgZG8td2hpbGUgbG9vcC4gRm9yIGV4YW1wbGUsIHNlZW1pbmdseSB3ZWxsLWJlaGF2ZWQgdG9wLXRlc3QgbG9vcHMKKy8vLyB3aWxsIGNvbW1vbmx5IGJlIGxvd2VyZWQgbGlrZSB0aGlzOgorLy8KKy8vLyAgIGlmIChuID4gMCkgeworLy8vICAgICBpID0gMDsKKy8vLyAgICAgZG8geworLy8vICAgICAgIHBbaV0gPSAwLjA7CisvLy8gICAgIH0gd2hpbGUgKCsraSA8IG4pOworLy8vICAgfQorLy8vCisvLy8gYW5kIHRoZW4gaXQncyBwb3NzaWJsZSBmb3Igc3Vic2VxdWVudCBvcHRpbWl6YXRpb24gdG8gb2JzY3VyZSB0aGUgaWYKKy8vLyB0ZXN0IGluIHN1Y2ggYSB3YXkgdGhhdCBpbmR2YXJzIGNhbid0IGZpbmQgaXQuCisvLy8KKy8vLyBXaGVuIGluZHZhcnMgY2FuJ3QgZmluZCB0aGUgaWYgdGVzdCBpbiBsb29wcyBsaWtlIHRoaXMsIGl0IGNyZWF0ZXMgYQorLy8vIG1heCBleHByZXNzaW9uLCB3aGljaCBhbGxvd3MgaXQgdG8gZ2l2ZSB0aGUgbG9vcCBhIGNhbm9uaWNhbAorLy8vIGluZHVjdGlvbiB2YXJpYWJsZToKKy8vLworLy8vICAgaSA9IDA7CisvLy8gICBtYXggPSBuIDwgMSA/IDEgOiBuOworLy8vICAgZG8geworLy8vICAgICBwW2ldID0gMC4wOworLy8vICAgfSB3aGlsZSAoKytpICE9IG1heCk7CisvLy8KKy8vLyBDYW5vbmljYWwgaW5kdWN0aW9uIHZhcmlhYmxlcyBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGxvb3AgcGFzc2VzCisvLy8gYXJlIGRlc2lnbmVkIGFyb3VuZCB0aGVtLiBUaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUKKy8vLyBMb29wSW5mbyBhbmFseXNpcywgd2hpY2ggZG9lc24ndCByZW1lbWJlciB0cmlwIGNvdW50IHZhbHVlcy4gSXQKKy8vLyBleHBlY3RzIHRvIGJlIGFibGUgdG8gcmVkaXNjb3ZlciB0aGUgdHJpcCBjb3VudCBlYWNoIHRpbWUgaXQgaXMKKy8vLyBuZWVkZWQsIGFuZCBpdCBkb2VzIHRoaXMgdXNpbmcgYSBzaW1wbGUgYW5hbHlzaXMgdGhhdCBvbmx5IHN1Y2NlZWRzIGlmCisvLy8gdGhlIGxvb3AgaGFzIGEgY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZS4KKy8vLworLy8vIEhvd2V2ZXIsIHdoZW4gaXQgY29tZXMgdGltZSB0byBnZW5lcmF0ZSBjb2RlLCB0aGUgbWF4aW11bSBvcGVyYXRpb24KKy8vLyBjYW4gYmUgcXVpdGUgY29zdGx5LCBlc3BlY2lhbGx5IGlmIGl0J3MgaW5zaWRlIG9mIGFuIG91dGVyIGxvb3AuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIHNvbHZlcyB0aGlzIHByb2JsZW0gYnkgZGV0ZWN0aW5nIHRoaXMgdHlwZSBvZiBsb29wIGFuZAorLy8vIHJld3JpdGluZyB0aGVpciBjb25kaXRpb25zIGZyb20gSUNNUF9ORSBiYWNrIHRvIElDTVBfU0xULCBhbmQgZGVsZXRpbmcKKy8vLyB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgbWF4aW11bSBjb21wdXRhdGlvbi4KKy8vLworSUNtcEluc3QgKkxTUkluc3RhbmNlOjpPcHRpbWl6ZU1heChJQ21wSW5zdCAqQ29uZCwgSVZTdHJpZGVVc2UqICZDb25kVXNlKSB7CisgIC8vIENoZWNrIHRoYXQgdGhlIGxvb3AgbWF0Y2hlcyB0aGUgcGF0dGVybiB3ZSdyZSBsb29raW5nIGZvci4KKyAgaWYgKENvbmQtPmdldFByZWRpY2F0ZSgpICE9IENtcEluc3Q6OklDTVBfRVEgJiYKKyAgICAgIENvbmQtPmdldFByZWRpY2F0ZSgpICE9IENtcEluc3Q6OklDTVBfTkUpCisgICAgcmV0dXJuIENvbmQ7CisKKyAgU2VsZWN0SW5zdCAqU2VsID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oQ29uZC0+Z2V0T3BlcmFuZCgxKSk7CisgIGlmICghU2VsIHx8ICFTZWwtPmhhc09uZVVzZSgpKSByZXR1cm4gQ29uZDsKKworICBjb25zdCBTQ0VWICpCYWNrZWRnZVRha2VuQ291bnQgPSBTRS5nZXRCYWNrZWRnZVRha2VuQ291bnQoTCk7CisgIGlmIChpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oQmFja2VkZ2VUYWtlbkNvdW50KSkKKyAgICByZXR1cm4gQ29uZDsKKyAgY29uc3QgU0NFViAqT25lID0gU0UuZ2V0Q29uc3RhbnQoQmFja2VkZ2VUYWtlbkNvdW50LT5nZXRUeXBlKCksIDEpOworCisgIC8vIEFkZCBvbmUgdG8gdGhlIGJhY2tlZGdlLXRha2VuIGNvdW50IHRvIGdldCB0aGUgdHJpcCBjb3VudC4KKyAgY29uc3QgU0NFViAqSXRlcmF0aW9uQ291bnQgPSBTRS5nZXRBZGRFeHByKEJhY2tlZGdlVGFrZW5Db3VudCwgT25lKTsKKyAgaWYgKEl0ZXJhdGlvbkNvdW50ICE9IFNFLmdldFNDRVYoU2VsKSkgcmV0dXJuIENvbmQ7CisKKyAgLy8gQ2hlY2sgZm9yIGEgbWF4IGNhbGN1bGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybi4gVGhlcmUncyBubyBjaGVjaworICAvLyBmb3IgSUNNUF9VTEUgaGVyZSBiZWNhdXNlIHRoZSBjb21wYXJpc29uIHdvdWxkIGJlIHdpdGggemVybywgd2hpY2gKKyAgLy8gaXNuJ3QgaW50ZXJlc3RpbmcuCisgIENtcEluc3Q6OlByZWRpY2F0ZSBQcmVkID0gSUNtcEluc3Q6OkJBRF9JQ01QX1BSRURJQ0FURTsKKyAgY29uc3QgU0NFVk5BcnlFeHByICpNYXggPSAwOworICBpZiAoY29uc3QgU0NFVlNNYXhFeHByICpTID0gZHluX2Nhc3Q8U0NFVlNNYXhFeHByPihCYWNrZWRnZVRha2VuQ291bnQpKSB7CisgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1NMRTsKKyAgICBNYXggPSBTOworICB9IGVsc2UgaWYgKGNvbnN0IFNDRVZTTWF4RXhwciAqUyA9IGR5bl9jYXN0PFNDRVZTTWF4RXhwcj4oSXRlcmF0aW9uQ291bnQpKSB7CisgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1NMVDsKKyAgICBNYXggPSBTOworICB9IGVsc2UgaWYgKGNvbnN0IFNDRVZVTWF4RXhwciAqVSA9IGR5bl9jYXN0PFNDRVZVTWF4RXhwcj4oSXRlcmF0aW9uQ291bnQpKSB7CisgICAgUHJlZCA9IElDbXBJbnN0OjpJQ01QX1VMVDsKKyAgICBNYXggPSBVOworICB9IGVsc2UgeworICAgIC8vIE5vIG1hdGNoOyBiYWlsLgorICAgIHJldHVybiBDb25kOworICB9CisKKyAgLy8gVG8gaGFuZGxlIGEgbWF4IHdpdGggbW9yZSB0aGFuIHR3byBvcGVyYW5kcywgdGhpcyBvcHRpbWl6YXRpb24gd291bGQKKyAgLy8gcmVxdWlyZSBhZGRpdGlvbmFsIGNoZWNraW5nIGFuZCBzZXR1cC4KKyAgaWYgKE1heC0+Z2V0TnVtT3BlcmFuZHMoKSAhPSAyKQorICAgIHJldHVybiBDb25kOworCisgIGNvbnN0IFNDRVYgKk1heExIUyA9IE1heC0+Z2V0T3BlcmFuZCgwKTsKKyAgY29uc3QgU0NFViAqTWF4UkhTID0gTWF4LT5nZXRPcGVyYW5kKDEpOworCisgIC8vIFNjYWxhckV2b2x1dGlvbiBjYW5vbmljYWxpemVzIGNvbnN0YW50cyB0byB0aGUgbGVmdC4gRm9yIDwgYW5kID4sIGxvb2sKKyAgLy8gZm9yIGEgY29tcGFyaXNvbiB3aXRoIDEuIEZvciA8PSBhbmQgPj0sIGEgY29tcGFyaXNvbiB3aXRoIHplcm8uCisgIGlmICghTWF4TEhTIHx8CisgICAgICAoSUNtcEluc3Q6OmlzVHJ1ZVdoZW5FcXVhbChQcmVkKSA/ICFNYXhMSFMtPmlzWmVybygpIDogKE1heExIUyAhPSBPbmUpKSkKKyAgICByZXR1cm4gQ29uZDsKKworICAvLyBDaGVjayB0aGUgcmVsZXZhbnQgaW5kdWN0aW9uIHZhcmlhYmxlIGZvciBjb25mb3JtYW5jZSB0bworICAvLyB0aGUgcGF0dGVybi4KKyAgY29uc3QgU0NFViAqSVYgPSBTRS5nZXRTQ0VWKENvbmQtPmdldE9wZXJhbmQoMCkpOworICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oSVYpOworICBpZiAoIUFSIHx8ICFBUi0+aXNBZmZpbmUoKSB8fAorICAgICAgQVItPmdldFN0YXJ0KCkgIT0gT25lIHx8CisgICAgICBBUi0+Z2V0U3RlcFJlY3VycmVuY2UoU0UpICE9IE9uZSkKKyAgICByZXR1cm4gQ29uZDsKKworICBhc3NlcnQoQVItPmdldExvb3AoKSA9PSBMICYmCisgICAgICAgICAiTG9vcCBjb25kaXRpb24gb3BlcmFuZCBpcyBhbiBhZGRyZWMgaW4gYSBkaWZmZXJlbnQgbG9vcCEiKTsKKworICAvLyBDaGVjayB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGUgc2VsZWN0LCBhbmQgcmVtZW1iZXIgaXQsIGFzIGl0IHdpbGwKKyAgLy8gYmUgdXNlZCBpbiB0aGUgbmV3IGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24uCisgIFZhbHVlICpOZXdSSFMgPSAwOworICBpZiAoSUNtcEluc3Q6OmlzVHJ1ZVdoZW5FcXVhbChQcmVkKSkgeworICAgIC8vIExvb2sgZm9yIG4rMSwgYW5kIGdyYWIgbi4KKyAgICBpZiAoQWRkT3BlcmF0b3IgKkJPID0gZHluX2Nhc3Q8QWRkT3BlcmF0b3I+KFNlbC0+Z2V0T3BlcmFuZCgxKSkpCisgICAgICBpZiAoaXNhPENvbnN0YW50SW50PihCTy0+Z2V0T3BlcmFuZCgxKSkgJiYKKyAgICAgICAgICBjYXN0PENvbnN0YW50SW50PihCTy0+Z2V0T3BlcmFuZCgxKSktPmlzT25lKCkgJiYKKyAgICAgICAgICBTRS5nZXRTQ0VWKEJPLT5nZXRPcGVyYW5kKDApKSA9PSBNYXhSSFMpCisgICAgICAgIE5ld1JIUyA9IEJPLT5nZXRPcGVyYW5kKDApOworICAgIGlmIChBZGRPcGVyYXRvciAqQk8gPSBkeW5fY2FzdDxBZGRPcGVyYXRvcj4oU2VsLT5nZXRPcGVyYW5kKDIpKSkKKyAgICAgIGlmIChpc2E8Q29uc3RhbnRJbnQ+KEJPLT5nZXRPcGVyYW5kKDEpKSAmJgorICAgICAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KEJPLT5nZXRPcGVyYW5kKDEpKS0+aXNPbmUoKSAmJgorICAgICAgICAgIFNFLmdldFNDRVYoQk8tPmdldE9wZXJhbmQoMCkpID09IE1heFJIUykKKyAgICAgICAgTmV3UkhTID0gQk8tPmdldE9wZXJhbmQoMCk7CisgICAgaWYgKCFOZXdSSFMpCisgICAgICByZXR1cm4gQ29uZDsKKyAgfSBlbHNlIGlmIChTRS5nZXRTQ0VWKFNlbC0+Z2V0T3BlcmFuZCgxKSkgPT0gTWF4UkhTKQorICAgIE5ld1JIUyA9IFNlbC0+Z2V0T3BlcmFuZCgxKTsKKyAgZWxzZSBpZiAoU0UuZ2V0U0NFVihTZWwtPmdldE9wZXJhbmQoMikpID09IE1heFJIUykKKyAgICBOZXdSSFMgPSBTZWwtPmdldE9wZXJhbmQoMik7CisgIGVsc2UgaWYgKGNvbnN0IFNDRVZVbmtub3duICpTVSA9IGR5bl9jYXN0PFNDRVZVbmtub3duPihNYXhSSFMpKQorICAgIE5ld1JIUyA9IFNVLT5nZXRWYWx1ZSgpOworICBlbHNlCisgICAgLy8gTWF4IGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQgcGF0dGVybi4KKyAgICByZXR1cm4gQ29uZDsKKworICAvLyBEZXRlcm1pbmUgdGhlIG5ldyBjb21wYXJpc29uIG9wY29kZS4gSXQgbWF5IGJlIHNpZ25lZCBvciB1bnNpZ25lZCwKKyAgLy8gYW5kIHRoZSBvcmlnaW5hbCBjb21wYXJpc29uIG1heSBiZSBlaXRoZXIgZXF1YWxpdHkgb3IgaW5lcXVhbGl0eS4KKyAgaWYgKENvbmQtPmdldFByZWRpY2F0ZSgpID09IENtcEluc3Q6OklDTVBfRVEpCisgICAgUHJlZCA9IENtcEluc3Q6OmdldEludmVyc2VQcmVkaWNhdGUoUHJlZCk7CisKKyAgLy8gT2ssIGV2ZXJ5dGhpbmcgbG9va3Mgb2sgdG8gY2hhbmdlIHRoZSBjb25kaXRpb24gaW50byBhbiBTTFQgb3IgU0dFIGFuZAorICAvLyBkZWxldGUgdGhlIG1heCBjYWxjdWxhdGlvbi4KKyAgSUNtcEluc3QgKk5ld0NvbmQgPQorICAgIG5ldyBJQ21wSW5zdChDb25kLCBQcmVkLCBDb25kLT5nZXRPcGVyYW5kKDApLCBOZXdSSFMpOworCisgIC8vIERlbGV0ZSB0aGUgbWF4IGNhbGN1bGF0aW9uIGluc3RydWN0aW9ucy4KKyAgQ29uZC0+cmVwbGFjZUFsbFVzZXNXaXRoKE5ld0NvbmQpOworICBDb25kVXNlLT5zZXRVc2VyKE5ld0NvbmQpOworICBJbnN0cnVjdGlvbiAqQ21wID0gY2FzdDxJbnN0cnVjdGlvbj4oU2VsLT5nZXRPcGVyYW5kKDApKTsKKyAgQ29uZC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIFNlbC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIGlmIChDbXAtPnVzZV9lbXB0eSgpKQorICAgIENtcC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIHJldHVybiBOZXdDb25kOworfQorCisvLy8gT3B0aW1pemVMb29wVGVybUNvbmQgLSBDaGFuZ2UgbG9vcCB0ZXJtaW5hdGluZyBjb25kaXRpb24gdG8gdXNlIHRoZQorLy8vIHBvc3RpbmMgaXYgd2hlbiBwb3NzaWJsZS4KK3ZvaWQKK0xTUkluc3RhbmNlOjpPcHRpbWl6ZUxvb3BUZXJtQ29uZCgpIHsKKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24gKiwgND4gUG9zdEluY3M7CisKKyAgQmFzaWNCbG9jayAqTGF0Y2hCbG9jayA9IEwtPmdldExvb3BMYXRjaCgpOworICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgOD4gRXhpdGluZ0Jsb2NrczsKKyAgTC0+Z2V0RXhpdGluZ0Jsb2NrcyhFeGl0aW5nQmxvY2tzKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRXhpdGluZ0Jsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQmFzaWNCbG9jayAqRXhpdGluZ0Jsb2NrID0gRXhpdGluZ0Jsb2Nrc1tpXTsKKworICAgIC8vIEdldCB0aGUgdGVybWluYXRpbmcgY29uZGl0aW9uIGZvciB0aGUgbG9vcCBpZiBwb3NzaWJsZS4gIElmIHdlCisgICAgLy8gY2FuLCB3ZSB3YW50IHRvIGNoYW5nZSBpdCB0byB1c2UgYSBwb3N0LWluY3JlbWVudGVkIHZlcnNpb24gb2YgaXRzCisgICAgLy8gaW5kdWN0aW9uIHZhcmlhYmxlLCB0byBhbGxvdyBjb2FsZXNjaW5nIHRoZSBsaXZlIHJhbmdlcyBmb3IgdGhlIElWIGludG8KKyAgICAvLyBvbmUgcmVnaXN0ZXIgdmFsdWUuCisKKyAgICBCcmFuY2hJbnN0ICpUZXJtQnIgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihFeGl0aW5nQmxvY2stPmdldFRlcm1pbmF0b3IoKSk7CisgICAgaWYgKCFUZXJtQnIpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBGSVhNRTogT3Zlcmx5IGNvbnNlcnZhdGl2ZSwgdGVybWluYXRpb24gY29uZGl0aW9uIGNvdWxkIGJlIGFuICdvcicgZXRjLi4KKyAgICBpZiAoVGVybUJyLT5pc1VuY29uZGl0aW9uYWwoKSB8fCAhaXNhPElDbXBJbnN0PihUZXJtQnItPmdldENvbmRpdGlvbigpKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gU2VhcmNoIElWVXNlc0J5U3RyaWRlIHRvIGZpbmQgQ29uZCdzIElWVXNlIGlmIHRoZXJlIGlzIG9uZS4KKyAgICBJVlN0cmlkZVVzZSAqQ29uZFVzZSA9IDA7CisgICAgSUNtcEluc3QgKkNvbmQgPSBjYXN0PElDbXBJbnN0PihUZXJtQnItPmdldENvbmRpdGlvbigpKTsKKyAgICBpZiAoIUZpbmRJVlVzZXJGb3JDb25kKENvbmQsIENvbmRVc2UpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBJZiB0aGUgdHJpcCBjb3VudCBpcyBjb21wdXRlZCBpbiB0ZXJtcyBvZiBhIG1heCAoZHVlIHRvIFNjYWxhckV2b2x1dGlvbgorICAgIC8vIGJlaW5nIHVuYWJsZSB0byBmaW5kIGEgc3VmZmljaWVudCBndWFyZCwgZm9yIGV4YW1wbGUpLCBjaGFuZ2UgdGhlIGxvb3AKKyAgICAvLyBjb21wYXJpc29uIHRvIHVzZSBTTFQgb3IgVUxUIGluc3RlYWQgb2YgTkUuCisgICAgLy8gT25lIGNvbnNlcXVlbmNlIG9mIGRvaW5nIHRoaXMgbm93IGlzIHRoYXQgaXQgZGlzcnVwdHMgdGhlIGNvdW50LWRvd24KKyAgICAvLyBvcHRpbWl6YXRpb24uIFRoYXQncyBub3QgYWx3YXlzIGEgYmFkIHRoaW5nIHRob3VnaCwgYmVjYXVzZSBpbiBzdWNoCisgICAgLy8gY2FzZXMgaXQgbWF5IHN0aWxsIGJlIHdvcnRod2hpbGUgdG8gYXZvaWQgYSBtYXguCisgICAgQ29uZCA9IE9wdGltaXplTWF4KENvbmQsIENvbmRVc2UpOworCisgICAgLy8gSWYgdGhpcyBleGl0aW5nIGJsb2NrIGRvbWluYXRlcyB0aGUgbGF0Y2ggYmxvY2ssIGl0IG1heSBhbHNvIHVzZQorICAgIC8vIHRoZSBwb3N0LWluYyB2YWx1ZSBpZiBpdCB3b24ndCBiZSBzaGFyZWQgd2l0aCBvdGhlciB1c2VzLgorICAgIC8vIENoZWNrIGZvciBkb21pbmFuY2UuCisgICAgaWYgKCFEVC5kb21pbmF0ZXMoRXhpdGluZ0Jsb2NrLCBMYXRjaEJsb2NrKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gQ29uc2VydmF0aXZlbHkgYXZvaWQgdHJ5aW5nIHRvIHVzZSB0aGUgcG9zdC1pbmMgdmFsdWUgaW4gbm9uLWxhdGNoCisgICAgLy8gZXhpdHMgaWYgdGhlcmUgbWF5IGJlIHByZS1pbmMgdXNlcnMgaW4gaW50ZXJ2ZW5pbmcgYmxvY2tzLgorICAgIGlmIChMYXRjaEJsb2NrICE9IEV4aXRpbmdCbG9jaykKKyAgICAgIGZvciAoSVZVc2Vyczo6Y29uc3RfaXRlcmF0b3IgVUkgPSBJVS5iZWdpbigpLCBFID0gSVUuZW5kKCk7IFVJICE9IEU7ICsrVUkpCisgICAgICAgIC8vIFRlc3QgaWYgdGhlIHVzZSBpcyByZWFjaGFibGUgZnJvbSB0aGUgZXhpdGluZyBibG9jay4gVGhpcyBkb21pbmF0b3IKKyAgICAgICAgLy8gcXVlcnkgaXMgYSBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbiBvZiByZWFjaGFiaWxpdHkuCisgICAgICAgIGlmICgmKlVJICE9IENvbmRVc2UgJiYKKyAgICAgICAgICAgICFEVC5wcm9wZXJseURvbWluYXRlcyhVSS0+Z2V0VXNlcigpLT5nZXRQYXJlbnQoKSwgRXhpdGluZ0Jsb2NrKSkgeworICAgICAgICAgIC8vIENvbnNlcnZhdGl2ZWx5IGFzc3VtZSB0aGVyZSBtYXkgYmUgcmV1c2UgaWYgdGhlIHF1b3RpZW50IG9mIHRoZWlyCisgICAgICAgICAgLy8gc3RyaWRlcyBjb3VsZCBiZSBhIGxlZ2FsIHNjYWxlLgorICAgICAgICAgIGNvbnN0IFNDRVYgKkEgPSBJVS5nZXRTdHJpZGUoKkNvbmRVc2UsIEwpOworICAgICAgICAgIGNvbnN0IFNDRVYgKkIgPSBJVS5nZXRTdHJpZGUoKlVJLCBMKTsKKyAgICAgICAgICBpZiAoIUEgfHwgIUIpIGNvbnRpbnVlOworICAgICAgICAgIGlmIChTRS5nZXRUeXBlU2l6ZUluQml0cyhBLT5nZXRUeXBlKCkpICE9CisgICAgICAgICAgICAgIFNFLmdldFR5cGVTaXplSW5CaXRzKEItPmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIGlmIChTRS5nZXRUeXBlU2l6ZUluQml0cyhBLT5nZXRUeXBlKCkpID4KKyAgICAgICAgICAgICAgICBTRS5nZXRUeXBlU2l6ZUluQml0cyhCLT5nZXRUeXBlKCkpKQorICAgICAgICAgICAgICBCID0gU0UuZ2V0U2lnbkV4dGVuZEV4cHIoQiwgQS0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgQSA9IFNFLmdldFNpZ25FeHRlbmRFeHByKEEsIEItPmdldFR5cGUoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKkQgPQorICAgICAgICAgICAgICAgIGR5bl9jYXN0X29yX251bGw8U0NFVkNvbnN0YW50PihnZXRFeGFjdFNEaXYoQiwgQSwgU0UpKSkgeworICAgICAgICAgICAgY29uc3QgQ29uc3RhbnRJbnQgKkMgPSBELT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgLy8gU3RyaWRlIG9mIG9uZSBvciBuZWdhdGl2ZSBvbmUgY2FuIGhhdmUgcmV1c2Ugd2l0aCBub24tYWRkcmVzc2VzLgorICAgICAgICAgICAgaWYgKEMtPmlzT25lKCkgfHwgQy0+aXNBbGxPbmVzVmFsdWUoKSkKKyAgICAgICAgICAgICAgZ290byBkZWNsaW5lX3Bvc3RfaW5jOworICAgICAgICAgICAgLy8gQXZvaWQgd2VpcmQgc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIGlmIChDLT5nZXRWYWx1ZSgpLmdldE1pblNpZ25lZEJpdHMoKSA+PSA2NCB8fAorICAgICAgICAgICAgICAgIEMtPmdldFZhbHVlKCkuaXNNaW5TaWduZWRWYWx1ZSgpKQorICAgICAgICAgICAgICBnb3RvIGRlY2xpbmVfcG9zdF9pbmM7CisgICAgICAgICAgICAvLyBXaXRob3V0IFRMSSwgYXNzdW1lIHRoYXQgYW55IHN0cmlkZSBtaWdodCBiZSB2YWxpZCwgYW5kIHNvIGFueQorICAgICAgICAgICAgLy8gdXNlIG1pZ2h0IGJlIHNoYXJlZC4KKyAgICAgICAgICAgIGlmICghVExJKQorICAgICAgICAgICAgICBnb3RvIGRlY2xpbmVfcG9zdF9pbmM7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgcG9zc2libGUgc2NhbGVkLWFkZHJlc3MgcmV1c2UuCisgICAgICAgICAgICBjb25zdCBUeXBlICpBY2Nlc3NUeSA9IGdldEFjY2Vzc1R5cGUoVUktPmdldFVzZXIoKSk7CisgICAgICAgICAgICBUYXJnZXRMb3dlcmluZzo6QWRkck1vZGUgQU07CisgICAgICAgICAgICBBTS5TY2FsZSA9IEMtPmdldFNFeHRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKFRMSS0+aXNMZWdhbEFkZHJlc3NpbmdNb2RlKEFNLCBBY2Nlc3NUeSkpCisgICAgICAgICAgICAgIGdvdG8gZGVjbGluZV9wb3N0X2luYzsKKyAgICAgICAgICAgIEFNLlNjYWxlID0gLUFNLlNjYWxlOworICAgICAgICAgICAgaWYgKFRMSS0+aXNMZWdhbEFkZHJlc3NpbmdNb2RlKEFNLCBBY2Nlc3NUeSkpCisgICAgICAgICAgICAgIGdvdG8gZGVjbGluZV9wb3N0X2luYzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBDaGFuZ2UgbG9vcCBleGl0aW5nIGljbXAgdG8gdXNlIHBvc3RpbmMgaXY6ICIKKyAgICAgICAgICAgICAgICAgPDwgKkNvbmQgPDwgJ1xuJyk7CisKKyAgICAvLyBJdCdzIHBvc3NpYmxlIGZvciB0aGUgc2V0Y2MgaW5zdHJ1Y3Rpb24gdG8gYmUgYW55d2hlcmUgaW4gdGhlIGxvb3AsIGFuZAorICAgIC8vIHBvc3NpYmxlIGZvciBpdCB0byBoYXZlIG11bHRpcGxlIHVzZXJzLiAgSWYgaXQgaXMgbm90IGltbWVkaWF0ZWx5IGJlZm9yZQorICAgIC8vIHRoZSBleGl0aW5nIGJsb2NrIGJyYW5jaCwgbW92ZSBpdC4KKyAgICBpZiAoJiorK0Jhc2ljQmxvY2s6Oml0ZXJhdG9yKENvbmQpICE9IFRlcm1CcikgeworICAgICAgaWYgKENvbmQtPmhhc09uZVVzZSgpKSB7CisgICAgICAgIENvbmQtPm1vdmVCZWZvcmUoVGVybUJyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENsb25lIHRoZSB0ZXJtaW5hdGluZyBjb25kaXRpb24gYW5kIGluc2VydCBpbnRvIHRoZSBsb29wZW5kLgorICAgICAgICBJQ21wSW5zdCAqT2xkQ29uZCA9IENvbmQ7CisgICAgICAgIENvbmQgPSBjYXN0PElDbXBJbnN0PihDb25kLT5jbG9uZSgpKTsKKyAgICAgICAgQ29uZC0+c2V0TmFtZShMLT5nZXRIZWFkZXIoKS0+Z2V0TmFtZSgpICsgIi50ZXJtY29uZCIpOworICAgICAgICBFeGl0aW5nQmxvY2stPmdldEluc3RMaXN0KCkuaW5zZXJ0KFRlcm1CciwgQ29uZCk7CisKKyAgICAgICAgLy8gQ2xvbmUgdGhlIElWVXNlLCBhcyB0aGUgb2xkIHVzZSBzdGlsbCBleGlzdHMhCisgICAgICAgIENvbmRVc2UgPSAmSVUuQWRkVXNlcihDb25kLCBDb25kVXNlLT5nZXRPcGVyYW5kVmFsVG9SZXBsYWNlKCkpOworICAgICAgICBUZXJtQnItPnJlcGxhY2VVc2VzT2ZXaXRoKE9sZENvbmQsIENvbmQpOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHdlIGdldCB0byBoZXJlLCB3ZSBrbm93IHRoYXQgd2UgY2FuIHRyYW5zZm9ybSB0aGUgc2V0Y2MgaW5zdHJ1Y3Rpb24gdG8KKyAgICAvLyB1c2UgdGhlIHBvc3QtaW5jcmVtZW50ZWQgdmVyc2lvbiBvZiB0aGUgSVYsIGFsbG93aW5nIHVzIHRvIGNvYWxlc2NlIHRoZQorICAgIC8vIGxpdmUgcmFuZ2VzIGZvciB0aGUgSVYgY29ycmVjdGx5LgorICAgIENvbmRVc2UtPnRyYW5zZm9ybVRvUG9zdEluYyhMKTsKKyAgICBDaGFuZ2VkID0gdHJ1ZTsKKworICAgIFBvc3RJbmNzLmluc2VydChDb25kKTsKKyAgZGVjbGluZV9wb3N0X2luYzo7CisgIH0KKworICAvLyBEZXRlcm1pbmUgYW4gaW5zZXJ0aW9uIHBvaW50IGZvciB0aGUgbG9vcCBpbmR1Y3Rpb24gdmFyaWFibGUgaW5jcmVtZW50LiBJdAorICAvLyBtdXN0IGRvbWluYXRlIGFsbCB0aGUgcG9zdC1pbmMgY29tcGFyaXNvbnMgd2UganVzdCBzZXQgdXAsIGFuZCBpdCBtdXN0CisgIC8vIGRvbWluYXRlIHRoZSBsb29wIGxhdGNoIGVkZ2UuCisgIElWSW5jSW5zZXJ0UG9zID0gTC0+Z2V0TG9vcExhdGNoKCktPmdldFRlcm1pbmF0b3IoKTsKKyAgZm9yIChTbWFsbFB0clNldDxJbnN0cnVjdGlvbiAqLCA0Pjo6Y29uc3RfaXRlcmF0b3IgSSA9IFBvc3RJbmNzLmJlZ2luKCksCisgICAgICAgRSA9IFBvc3RJbmNzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEJhc2ljQmxvY2sgKkJCID0KKyAgICAgIERULmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKElWSW5jSW5zZXJ0UG9zLT5nZXRQYXJlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqSSktPmdldFBhcmVudCgpKTsKKyAgICBpZiAoQkIgPT0gKCpJKS0+Z2V0UGFyZW50KCkpCisgICAgICBJVkluY0luc2VydFBvcyA9ICpJOworICAgIGVsc2UgaWYgKEJCICE9IElWSW5jSW5zZXJ0UG9zLT5nZXRQYXJlbnQoKSkKKyAgICAgIElWSW5jSW5zZXJ0UG9zID0gQkItPmdldFRlcm1pbmF0b3IoKTsKKyAgfQorfQorCisvLy8gcmVjb25jaWxlTmV3T2Zmc2V0IC0gRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiB1c2UgY2FuIGFjY29tb2RhdGUgYSBmaXh1cAorLy8vIGF0IHRoZSBnaXZlbiBvZmZzZXQgYW5kIG90aGVyIGRldGFpbHMuIElmIHNvLCB1cGRhdGUgdGhlIHVzZSBhbmQKKy8vLyByZXR1cm4gdHJ1ZS4KK2Jvb2wKK0xTUkluc3RhbmNlOjpyZWNvbmNpbGVOZXdPZmZzZXQoTFNSVXNlICZMVSwgaW50NjRfdCBOZXdPZmZzZXQsIGJvb2wgSGFzQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFNSVXNlOjpLaW5kVHlwZSBLaW5kLCBjb25zdCBUeXBlICpBY2Nlc3NUeSkgeworICBpbnQ2NF90IE5ld01pbk9mZnNldCA9IExVLk1pbk9mZnNldDsKKyAgaW50NjRfdCBOZXdNYXhPZmZzZXQgPSBMVS5NYXhPZmZzZXQ7CisgIGNvbnN0IFR5cGUgKk5ld0FjY2Vzc1R5ID0gQWNjZXNzVHk7CisKKyAgLy8gQ2hlY2sgZm9yIGEgbWlzbWF0Y2hlZCBraW5kLiBJdCdzIHRlbXB0aW5nIHRvIGNvbGxhcHNlIG1pc21hdGNoZWQga2luZHMgdG8KKyAgLy8gc29tZXRoaW5nIGNvbnNlcnZhdGl2ZSwgaG93ZXZlciB0aGlzIGNhbiBwZXNzaW1pemUgaW4gdGhlIGNhc2UgdGhhdCBvbmUgb2YKKyAgLy8gdGhlIHVzZXMgd2lsbCBoYXZlIGFsbCBpdHMgdXNlcyBvdXRzaWRlIHRoZSBsb29wLCBmb3IgZXhhbXBsZS4KKyAgaWYgKExVLktpbmQgIT0gS2luZCkKKyAgICByZXR1cm4gZmFsc2U7CisgIC8vIENvbnNlcnZhdGl2ZWx5IGFzc3VtZSBIYXNCYXNlUmVnIGlzIHRydWUgZm9yIG5vdy4KKyAgaWYgKE5ld09mZnNldCA8IExVLk1pbk9mZnNldCkgeworICAgIGlmICghaXNBbHdheXNGb2xkYWJsZShMVS5NYXhPZmZzZXQgLSBOZXdPZmZzZXQsIDAsIEhhc0Jhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmQsIEFjY2Vzc1R5LCBUTEkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIE5ld01pbk9mZnNldCA9IE5ld09mZnNldDsKKyAgfSBlbHNlIGlmIChOZXdPZmZzZXQgPiBMVS5NYXhPZmZzZXQpIHsKKyAgICBpZiAoIWlzQWx3YXlzRm9sZGFibGUoTmV3T2Zmc2V0IC0gTFUuTWluT2Zmc2V0LCAwLCBIYXNCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLaW5kLCBBY2Nlc3NUeSwgVExJKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBOZXdNYXhPZmZzZXQgPSBOZXdPZmZzZXQ7CisgIH0KKyAgLy8gQ2hlY2sgZm9yIGEgbWlzbWF0Y2hlZCBhY2Nlc3MgdHlwZSwgYW5kIGZhbGwgYmFjayBjb25zZXJ2YXRpdmVseSBhcyBuZWVkZWQuCisgIC8vIFRPRE86IEJlIGxlc3MgY29uc2VydmF0aXZlIHdoZW4gdGhlIHR5cGUgaXMgc2ltaWxhciBhbmQgY2FuIHVzZSB0aGUgc2FtZQorICAvLyBhZGRyZXNzaW5nIG1vZGVzLgorICBpZiAoS2luZCA9PSBMU1JVc2U6OkFkZHJlc3MgJiYgQWNjZXNzVHkgIT0gTFUuQWNjZXNzVHkpCisgICAgTmV3QWNjZXNzVHkgPSBUeXBlOjpnZXRWb2lkVHkoQWNjZXNzVHktPmdldENvbnRleHQoKSk7CisKKyAgLy8gVXBkYXRlIHRoZSB1c2UuCisgIExVLk1pbk9mZnNldCA9IE5ld01pbk9mZnNldDsKKyAgTFUuTWF4T2Zmc2V0ID0gTmV3TWF4T2Zmc2V0OworICBMVS5BY2Nlc3NUeSA9IE5ld0FjY2Vzc1R5OworICBpZiAoTmV3T2Zmc2V0ICE9IExVLk9mZnNldHMuYmFjaygpKQorICAgIExVLk9mZnNldHMucHVzaF9iYWNrKE5ld09mZnNldCk7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gZ2V0VXNlIC0gUmV0dXJuIGFuIExTUlVzZSBpbmRleCBhbmQgYW4gb2Zmc2V0IHZhbHVlIGZvciBhIGZpeHVwIHdoaWNoCisvLy8gbmVlZHMgdGhlIGdpdmVuIGV4cHJlc3Npb24sIHdpdGggdGhlIGdpdmVuIGtpbmQgYW5kIG9wdGlvbmFsIGFjY2VzcyB0eXBlLgorLy8vIEVpdGhlciByZXVzZSBhbiBleGlzdGluZyB1c2Ugb3IgY3JlYXRlIGEgbmV3IG9uZSwgYXMgbmVlZGVkLgorc3RkOjpwYWlyPHNpemVfdCwgaW50NjRfdD4KK0xTUkluc3RhbmNlOjpnZXRVc2UoY29uc3QgU0NFViAqJkV4cHIsCisgICAgICAgICAgICAgICAgICAgIExTUlVzZTo6S2luZFR5cGUgS2luZCwgY29uc3QgVHlwZSAqQWNjZXNzVHkpIHsKKyAgY29uc3QgU0NFViAqQ29weSA9IEV4cHI7CisgIGludDY0X3QgT2Zmc2V0ID0gRXh0cmFjdEltbWVkaWF0ZShFeHByLCBTRSk7CisKKyAgLy8gQmFzaWMgdXNlcyBjYW4ndCBhY2NlcHQgYW55IG9mZnNldCwgZm9yIGV4YW1wbGUuCisgIGlmICghaXNBbHdheXNGb2xkYWJsZShPZmZzZXQsIDAsIC8qSGFzQmFzZVJlZz0qL3RydWUsIEtpbmQsIEFjY2Vzc1R5LCBUTEkpKSB7CisgICAgRXhwciA9IENvcHk7CisgICAgT2Zmc2V0ID0gMDsKKyAgfQorCisgIHN0ZDo6cGFpcjxVc2VNYXBUeTo6aXRlcmF0b3IsIGJvb2w+IFAgPQorICAgIFVzZU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RkOjptYWtlX3BhaXIoRXhwciwgS2luZCksIDApKTsKKyAgaWYgKCFQLnNlY29uZCkgeworICAgIC8vIEEgdXNlIGFscmVhZHkgZXhpc3RlZCB3aXRoIHRoaXMgYmFzZS4KKyAgICBzaXplX3QgTFVJZHggPSBQLmZpcnN0LT5zZWNvbmQ7CisgICAgTFNSVXNlICZMVSA9IFVzZXNbTFVJZHhdOworICAgIGlmIChyZWNvbmNpbGVOZXdPZmZzZXQoTFUsIE9mZnNldCwgLypIYXNCYXNlUmVnPSovdHJ1ZSwgS2luZCwgQWNjZXNzVHkpKQorICAgICAgLy8gUmV1c2UgdGhpcyB1c2UuCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTFVJZHgsIE9mZnNldCk7CisgIH0KKworICAvLyBDcmVhdGUgYSBuZXcgdXNlLgorICBzaXplX3QgTFVJZHggPSBVc2VzLnNpemUoKTsKKyAgUC5maXJzdC0+c2Vjb25kID0gTFVJZHg7CisgIFVzZXMucHVzaF9iYWNrKExTUlVzZShLaW5kLCBBY2Nlc3NUeSkpOworICBMU1JVc2UgJkxVID0gVXNlc1tMVUlkeF07CisKKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byB0cmFjayByZWR1bmRhbnQgb2Zmc2V0cywgYnV0IHdlIGRvbid0IG5lZWQgdG8gZ28gb3V0CisgIC8vIG9mIG91ciB3YXkgaGVyZSB0byBhdm9pZCB0aGVtLgorICBpZiAoTFUuT2Zmc2V0cy5lbXB0eSgpIHx8IE9mZnNldCAhPSBMVS5PZmZzZXRzLmJhY2soKSkKKyAgICBMVS5PZmZzZXRzLnB1c2hfYmFjayhPZmZzZXQpOworCisgIExVLk1pbk9mZnNldCA9IE9mZnNldDsKKyAgTFUuTWF4T2Zmc2V0ID0gT2Zmc2V0OworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTFVJZHgsIE9mZnNldCk7Cit9CisKKy8vLyBEZWxldGVVc2UgLSBEZWxldGUgdGhlIGdpdmVuIHVzZSBmcm9tIHRoZSBVc2VzIGxpc3QuCit2b2lkIExTUkluc3RhbmNlOjpEZWxldGVVc2UoTFNSVXNlICZMVSkgeworICBpZiAoJkxVICE9ICZVc2VzLmJhY2soKSkKKyAgICBzdGQ6OnN3YXAoTFUsIFVzZXMuYmFjaygpKTsKKyAgVXNlcy5wb3BfYmFjaygpOworfQorCisvLy8gRmluZFVzZVdpdGhGb3JtdWxhIC0gTG9vayBmb3IgYSB1c2UgZGlzdGluY3QgZnJvbSBPcmlnTFUgd2hpY2ggaXMgaGFzCisvLy8gYSBmb3JtdWxhIHRoYXQgaGFzIHRoZSBzYW1lIHJlZ2lzdGVycyBhcyB0aGUgZ2l2ZW4gZm9ybXVsYS4KK0xTUlVzZSAqCitMU1JJbnN0YW5jZTo6RmluZFVzZVdpdGhTaW1pbGFyRm9ybXVsYShjb25zdCBGb3JtdWxhICZPcmlnRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExTUlVzZSAmT3JpZ0xVKSB7CisgIC8vIFNlYXJjaCBhbGwgdXNlcyBmb3IgdGhlIGZvcm11bGEuIFRoaXMgY291bGQgYmUgbW9yZSBjbGV2ZXIuIElnbm9yZQorICAvLyBJQ21wWmVybyB1c2VzIGJlY2F1c2UgdGhleSBtYXkgY29udGFpbiBmb3JtdWxhZSBnZW5lcmF0ZWQgYnkKKyAgLy8gR2VuZXJhdGVJQ21wWmVyb1NjYWxlcywgaW4gd2hpY2ggY2FzZSBhZGRpbmcgZml4dXAgb2Zmc2V0cyBtYXkKKyAgLy8gYmUgaW52YWxpZC4KKyAgZm9yIChzaXplX3QgTFVJZHggPSAwLCBOdW1Vc2VzID0gVXNlcy5zaXplKCk7IExVSWR4ICE9IE51bVVzZXM7ICsrTFVJZHgpIHsKKyAgICBMU1JVc2UgJkxVID0gVXNlc1tMVUlkeF07CisgICAgaWYgKCZMVSAhPSAmT3JpZ0xVICYmCisgICAgICAgIExVLktpbmQgIT0gTFNSVXNlOjpJQ21wWmVybyAmJgorICAgICAgICBMVS5LaW5kID09IE9yaWdMVS5LaW5kICYmIE9yaWdMVS5BY2Nlc3NUeSA9PSBMVS5BY2Nlc3NUeSAmJgorICAgICAgICBMVS5XaWRlc3RGaXh1cFR5cGUgPT0gT3JpZ0xVLldpZGVzdEZpeHVwVHlwZSAmJgorICAgICAgICBMVS5IYXNGb3JtdWxhV2l0aFNhbWVSZWdzKE9yaWdGKSkgeworICAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8Rm9ybXVsYT46OmNvbnN0X2l0ZXJhdG9yIEkgPSBMVS5Gb3JtdWxhZS5iZWdpbigpLAorICAgICAgICAgICBFID0gTFUuRm9ybXVsYWUuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIGNvbnN0IEZvcm11bGEgJkYgPSAqSTsKKyAgICAgICAgaWYgKEYuQmFzZVJlZ3MgPT0gT3JpZ0YuQmFzZVJlZ3MgJiYKKyAgICAgICAgICAgIEYuU2NhbGVkUmVnID09IE9yaWdGLlNjYWxlZFJlZyAmJgorICAgICAgICAgICAgRi5BTS5CYXNlR1YgPT0gT3JpZ0YuQU0uQmFzZUdWICYmCisgICAgICAgICAgICBGLkFNLlNjYWxlID09IE9yaWdGLkFNLlNjYWxlICYmCisgICAgICAgICAgICBMVS5LaW5kKSB7CisgICAgICAgICAgaWYgKEYuQU0uQmFzZU9mZnMgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAmTFU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKwordm9pZCBMU1JJbnN0YW5jZTo6Q29sbGVjdEludGVyZXN0aW5nVHlwZXNBbmRGYWN0b3JzKCkgeworICBTbWFsbFNldFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+IFN0cmlkZXM7CisKKyAgLy8gQ29sbGVjdCBpbnRlcmVzdGluZyB0eXBlcyBhbmQgc3RyaWRlcy4KKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiBXb3JrbGlzdDsKKyAgZm9yIChJVlVzZXJzOjpjb25zdF9pdGVyYXRvciBVSSA9IElVLmJlZ2luKCksIEUgPSBJVS5lbmQoKTsgVUkgIT0gRTsgKytVSSkgeworICAgIGNvbnN0IFNDRVYgKkV4cHIgPSBJVS5nZXRFeHByKCpVSSk7CisKKyAgICAvLyBDb2xsZWN0IGludGVyZXN0aW5nIHR5cGVzLgorICAgIFR5cGVzLmluc2VydChTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShFeHByLT5nZXRUeXBlKCkpKTsKKworICAgIC8vIEFkZCBzdHJpZGVzIGZvciBtZW50aW9uZWQgbG9vcHMuCisgICAgV29ya2xpc3QucHVzaF9iYWNrKEV4cHIpOworICAgIGRvIHsKKyAgICAgIGNvbnN0IFNDRVYgKlMgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUykpIHsKKyAgICAgICAgU3RyaWRlcy5pbnNlcnQoQVItPmdldFN0ZXBSZWN1cnJlbmNlKFNFKSk7CisgICAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhBUi0+Z2V0U3RhcnQoKSk7CisgICAgICB9IGVsc2UgaWYgKGNvbnN0IFNDRVZBZGRFeHByICpBZGQgPSBkeW5fY2FzdDxTQ0VWQWRkRXhwcj4oUykpIHsKKyAgICAgICAgV29ya2xpc3QuYXBwZW5kKEFkZC0+b3BfYmVnaW4oKSwgQWRkLT5vcF9lbmQoKSk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpOworICB9CisKKyAgLy8gQ29tcHV0ZSBpbnRlcmVzdGluZyBmYWN0b3JzIGZyb20gdGhlIHNldCBvZiBpbnRlcmVzdGluZyBzdHJpZGVzLgorICBmb3IgKFNtYWxsU2V0VmVjdG9yPGNvbnN0IFNDRVYgKiwgND46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgSSA9IFN0cmlkZXMuYmVnaW4oKSwgRSA9IFN0cmlkZXMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGZvciAoU21hbGxTZXRWZWN0b3I8Y29uc3QgU0NFViAqLCA0Pjo6Y29uc3RfaXRlcmF0b3IgTmV3U3RyaWRlSXRlciA9CisgICAgICAgICBsbHZtOjpuZXh0KEkpOyBOZXdTdHJpZGVJdGVyICE9IEU7ICsrTmV3U3RyaWRlSXRlcikgeworICAgICAgY29uc3QgU0NFViAqT2xkU3RyaWRlID0gKkk7CisgICAgICBjb25zdCBTQ0VWICpOZXdTdHJpZGUgPSAqTmV3U3RyaWRlSXRlcjsKKworICAgICAgaWYgKFNFLmdldFR5cGVTaXplSW5CaXRzKE9sZFN0cmlkZS0+Z2V0VHlwZSgpKSAhPQorICAgICAgICAgIFNFLmdldFR5cGVTaXplSW5CaXRzKE5ld1N0cmlkZS0+Z2V0VHlwZSgpKSkgeworICAgICAgICBpZiAoU0UuZ2V0VHlwZVNpemVJbkJpdHMoT2xkU3RyaWRlLT5nZXRUeXBlKCkpID4KKyAgICAgICAgICAgIFNFLmdldFR5cGVTaXplSW5CaXRzKE5ld1N0cmlkZS0+Z2V0VHlwZSgpKSkKKyAgICAgICAgICBOZXdTdHJpZGUgPSBTRS5nZXRTaWduRXh0ZW5kRXhwcihOZXdTdHJpZGUsIE9sZFN0cmlkZS0+Z2V0VHlwZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIE9sZFN0cmlkZSA9IFNFLmdldFNpZ25FeHRlbmRFeHByKE9sZFN0cmlkZSwgTmV3U3RyaWRlLT5nZXRUeXBlKCkpOworICAgICAgfQorICAgICAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqRmFjdG9yID0KKyAgICAgICAgICAgIGR5bl9jYXN0X29yX251bGw8U0NFVkNvbnN0YW50PihnZXRFeGFjdFNEaXYoTmV3U3RyaWRlLCBPbGRTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFLCB0cnVlKSkpIHsKKyAgICAgICAgaWYgKEZhY3Rvci0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKS5nZXRNaW5TaWduZWRCaXRzKCkgPD0gNjQpCisgICAgICAgICAgRmFjdG9ycy5pbnNlcnQoRmFjdG9yLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLmdldFNFeHRWYWx1ZSgpKTsKKyAgICAgIH0gZWxzZSBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpGYWN0b3IgPQorICAgICAgICAgICAgICAgICAgIGR5bl9jYXN0X29yX251bGw8U0NFVkNvbnN0YW50PihnZXRFeGFjdFNEaXYoT2xkU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3U3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UsIHRydWUpKSkgeworICAgICAgICBpZiAoRmFjdG9yLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLmdldE1pblNpZ25lZEJpdHMoKSA8PSA2NCkKKyAgICAgICAgICBGYWN0b3JzLmluc2VydChGYWN0b3ItPmdldFZhbHVlKCktPmdldFZhbHVlKCkuZ2V0U0V4dFZhbHVlKCkpOworICAgICAgfQorICAgIH0KKworICAvLyBJZiBhbGwgdXNlcyB1c2UgdGhlIHNhbWUgdHlwZSwgZG9uJ3QgYm90aGVyIGxvb2tpbmcgZm9yIHRydW5jYXRpb24tYmFzZWQKKyAgLy8gcmV1c2UuCisgIGlmIChUeXBlcy5zaXplKCkgPT0gMSkKKyAgICBUeXBlcy5jbGVhcigpOworCisgIERFQlVHKHByaW50X2ZhY3RvcnNfYW5kX3R5cGVzKGRiZ3MoKSkpOworfQorCit2b2lkIExTUkluc3RhbmNlOjpDb2xsZWN0Rml4dXBzQW5kSW5pdGlhbEZvcm11bGFlKCkgeworICBmb3IgKElWVXNlcnM6OmNvbnN0X2l0ZXJhdG9yIFVJID0gSVUuYmVnaW4oKSwgRSA9IElVLmVuZCgpOyBVSSAhPSBFOyArK1VJKSB7CisgICAgLy8gUmVjb3JkIHRoZSB1c2VzLgorICAgIExTUkZpeHVwICZMRiA9IGdldE5ld0ZpeHVwKCk7CisgICAgTEYuVXNlckluc3QgPSBVSS0+Z2V0VXNlcigpOworICAgIExGLk9wZXJhbmRWYWxUb1JlcGxhY2UgPSBVSS0+Z2V0T3BlcmFuZFZhbFRvUmVwbGFjZSgpOworICAgIExGLlBvc3RJbmNMb29wcyA9IFVJLT5nZXRQb3N0SW5jTG9vcHMoKTsKKworICAgIExTUlVzZTo6S2luZFR5cGUgS2luZCA9IExTUlVzZTo6QmFzaWM7CisgICAgY29uc3QgVHlwZSAqQWNjZXNzVHkgPSAwOworICAgIGlmIChpc0FkZHJlc3NVc2UoTEYuVXNlckluc3QsIExGLk9wZXJhbmRWYWxUb1JlcGxhY2UpKSB7CisgICAgICBLaW5kID0gTFNSVXNlOjpBZGRyZXNzOworICAgICAgQWNjZXNzVHkgPSBnZXRBY2Nlc3NUeXBlKExGLlVzZXJJbnN0KTsKKyAgICB9CisKKyAgICBjb25zdCBTQ0VWICpTID0gSVUuZ2V0RXhwcigqVUkpOworCisgICAgLy8gRXF1YWxpdHkgKD09IGFuZCAhPSkgSUNtcHMgYXJlIHNwZWNpYWwuIFdlIGNhbiByZXdyaXRlIChpID09IE4pIGFzCisgICAgLy8gKE4gLSBpID09IDApLCBhbmQgdGhpcyBhbGxvd3MgKE4gLSBpKSB0byBiZSB0aGUgZXhwcmVzc2lvbiB0aGF0IHdlIHdvcmsKKyAgICAvLyB3aXRoIHJhdGhlciB0aGFuIGp1c3QgTiBvciBpLCBzbyB3ZSBjYW4gY29uc2lkZXIgdGhlIHJlZ2lzdGVyCisgICAgLy8gcmVxdWlyZW1lbnRzIGZvciBib3RoIE4gYW5kIGkgYXQgdGhlIHNhbWUgdGltZS4gTGltaXRpbmcgdGhpcyBjb2RlIHRvCisgICAgLy8gZXF1YWxpdHkgaWNtcHMgaXMgbm90IGEgcHJvYmxlbSBiZWNhdXNlIGFsbCBpbnRlcmVzdGluZyBsb29wcyB1c2UKKyAgICAvLyBlcXVhbGl0eSBpY21wcywgdGhhbmtzIHRvIEluZFZhclNpbXBsaWZ5LgorICAgIGlmIChJQ21wSW5zdCAqQ0kgPSBkeW5fY2FzdDxJQ21wSW5zdD4oTEYuVXNlckluc3QpKQorICAgICAgaWYgKENJLT5pc0VxdWFsaXR5KCkpIHsKKyAgICAgICAgLy8gU3dhcCB0aGUgb3BlcmFuZHMgaWYgbmVlZGVkIHRvIHB1dCB0aGUgT3BlcmFuZFZhbFRvUmVwbGFjZSBvbiB0aGUKKyAgICAgICAgLy8gbGVmdCwgZm9yIGNvbnNpc3RlbmN5LgorICAgICAgICBWYWx1ZSAqTlYgPSBDSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICAgICAgaWYgKE5WID09IExGLk9wZXJhbmRWYWxUb1JlcGxhY2UpIHsKKyAgICAgICAgICBDSS0+c2V0T3BlcmFuZCgxLCBDSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICAgICAgQ0ktPnNldE9wZXJhbmQoMCwgTlYpOworICAgICAgICAgIE5WID0gQ0ktPmdldE9wZXJhbmQoMSk7CisgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyB4ID09IHkgIC0tPiAgeCAtIHkgPT0gMAorICAgICAgICBjb25zdCBTQ0VWICpOID0gU0UuZ2V0U0NFVihOVik7CisgICAgICAgIGlmIChOLT5pc0xvb3BJbnZhcmlhbnQoTCkpIHsKKyAgICAgICAgICBLaW5kID0gTFNSVXNlOjpJQ21wWmVybzsKKyAgICAgICAgICBTID0gU0UuZ2V0TWludXNTQ0VWKE4sIFMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gLTEgYW5kIHRoZSBuZWdhdGlvbnMgb2YgYWxsIGludGVyZXN0aW5nIHN0cmlkZXMgKGV4Y2VwdCB0aGUgbmVnYXRpb24KKyAgICAgICAgLy8gb2YgLTEpIGFyZSBub3cgYWxzbyBpbnRlcmVzdGluZy4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBGYWN0b3JzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgaWYgKEZhY3RvcnNbaV0gIT0gLTEpCisgICAgICAgICAgICBGYWN0b3JzLmluc2VydCgtKHVpbnQ2NF90KUZhY3RvcnNbaV0pOworICAgICAgICBGYWN0b3JzLmluc2VydCgtMSk7CisgICAgICB9CisKKyAgICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgZm9ybXVsYSBmb3IgdGhpcyB1c2UuCisgICAgc3RkOjpwYWlyPHNpemVfdCwgaW50NjRfdD4gUCA9IGdldFVzZShTLCBLaW5kLCBBY2Nlc3NUeSk7CisgICAgTEYuTFVJZHggPSBQLmZpcnN0OworICAgIExGLk9mZnNldCA9IFAuc2Vjb25kOworICAgIExTUlVzZSAmTFUgPSBVc2VzW0xGLkxVSWR4XTsKKyAgICBMVS5BbGxGaXh1cHNPdXRzaWRlTG9vcCAmPSBMRi5pc1VzZUZ1bGx5T3V0c2lkZUxvb3AoTCk7CisgICAgaWYgKCFMVS5XaWRlc3RGaXh1cFR5cGUgfHwKKyAgICAgICAgU0UuZ2V0VHlwZVNpemVJbkJpdHMoTFUuV2lkZXN0Rml4dXBUeXBlKSA8CisgICAgICAgIFNFLmdldFR5cGVTaXplSW5CaXRzKExGLk9wZXJhbmRWYWxUb1JlcGxhY2UtPmdldFR5cGUoKSkpCisgICAgICBMVS5XaWRlc3RGaXh1cFR5cGUgPSBMRi5PcGVyYW5kVmFsVG9SZXBsYWNlLT5nZXRUeXBlKCk7CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB1c2Ugb2YgdGhpcyBMU1JVc2UsIGdpdmUgaXQgYSBmb3JtdWxhLgorICAgIGlmIChMVS5Gb3JtdWxhZS5lbXB0eSgpKSB7CisgICAgICBJbnNlcnRJbml0aWFsRm9ybXVsYShTLCBMVSwgTEYuTFVJZHgpOworICAgICAgQ291bnRSZWdpc3RlcnMoTFUuRm9ybXVsYWUuYmFjaygpLCBMRi5MVUlkeCk7CisgICAgfQorICB9CisKKyAgREVCVUcocHJpbnRfZml4dXBzKGRiZ3MoKSkpOworfQorCisvLy8gSW5zZXJ0SW5pdGlhbEZvcm11bGEgLSBJbnNlcnQgYSBmb3JtdWxhIGZvciB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpbnRvCisvLy8gdGhlIGdpdmVuIHVzZSwgc2VwYXJhdGluZyBvdXQgbG9vcC12YXJpYW50IHBvcnRpb25zIGZyb20gbG9vcC1pbnZhcmlhbnQKKy8vLyBhbmQgbG9vcC1jb21wdXRhYmxlIHBvcnRpb25zLgordm9pZAorTFNSSW5zdGFuY2U6Okluc2VydEluaXRpYWxGb3JtdWxhKGNvbnN0IFNDRVYgKlMsIExTUlVzZSAmTFUsIHNpemVfdCBMVUlkeCkgeworICBGb3JtdWxhIEY7CisgIEYuSW5pdGlhbE1hdGNoKFMsIEwsIFNFLCBEVCk7CisgIGJvb2wgSW5zZXJ0ZWQgPSBJbnNlcnRGb3JtdWxhKExVLCBMVUlkeCwgRik7CisgIGFzc2VydChJbnNlcnRlZCAmJiAiSW5pdGlhbCBmb3JtdWxhIGFscmVhZHkgZXhpc3RzISIpOyAodm9pZClJbnNlcnRlZDsKK30KKworLy8vIEluc2VydFN1cHBsZW1lbnRhbEZvcm11bGEgLSBJbnNlcnQgYSBzaW1wbGUgc2luZ2xlLXJlZ2lzdGVyIGZvcm11bGEgZm9yCisvLy8gdGhlIGdpdmVuIGV4cHJlc3Npb24gaW50byB0aGUgZ2l2ZW4gdXNlLgordm9pZAorTFNSSW5zdGFuY2U6Okluc2VydFN1cHBsZW1lbnRhbEZvcm11bGEoY29uc3QgU0NFViAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExTUlVzZSAmTFUsIHNpemVfdCBMVUlkeCkgeworICBGb3JtdWxhIEY7CisgIEYuQmFzZVJlZ3MucHVzaF9iYWNrKFMpOworICBGLkFNLkhhc0Jhc2VSZWcgPSB0cnVlOworICBib29sIEluc2VydGVkID0gSW5zZXJ0Rm9ybXVsYShMVSwgTFVJZHgsIEYpOworICBhc3NlcnQoSW5zZXJ0ZWQgJiYgIlN1cHBsZW1lbnRhbCBmb3JtdWxhIGFscmVhZHkgZXhpc3RzISIpOyAodm9pZClJbnNlcnRlZDsKK30KKworLy8vIENvdW50UmVnaXN0ZXJzIC0gTm90ZSB3aGljaCByZWdpc3RlcnMgYXJlIHVzZWQgYnkgdGhlIGdpdmVuIGZvcm11bGEsCisvLy8gdXBkYXRpbmcgUmVnVXNlcy4KK3ZvaWQgTFNSSW5zdGFuY2U6OkNvdW50UmVnaXN0ZXJzKGNvbnN0IEZvcm11bGEgJkYsIHNpemVfdCBMVUlkeCkgeworICBpZiAoRi5TY2FsZWRSZWcpCisgICAgUmVnVXNlcy5Db3VudFJlZ2lzdGVyKEYuU2NhbGVkUmVnLCBMVUlkeCk7CisgIGZvciAoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBGLkJhc2VSZWdzLmJlZ2luKCksCisgICAgICAgRSA9IEYuQmFzZVJlZ3MuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIFJlZ1VzZXMuQ291bnRSZWdpc3RlcigqSSwgTFVJZHgpOworfQorCisvLy8gSW5zZXJ0Rm9ybXVsYSAtIElmIHRoZSBnaXZlbiBmb3JtdWxhIGhhcyBub3QgeWV0IGJlZW4gaW5zZXJ0ZWQsIGFkZCBpdCB0bworLy8vIHRoZSBsaXN0LCBhbmQgcmV0dXJuIHRydWUuIFJldHVybiBmYWxzZSBvdGhlcndpc2UuCitib29sIExTUkluc3RhbmNlOjpJbnNlcnRGb3JtdWxhKExTUlVzZSAmTFUsIHVuc2lnbmVkIExVSWR4LCBjb25zdCBGb3JtdWxhICZGKSB7CisgIGlmICghTFUuSW5zZXJ0Rm9ybXVsYShGKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ291bnRSZWdpc3RlcnMoRiwgTFVJZHgpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIENvbGxlY3RMb29wSW52YXJpYW50Rml4dXBzQW5kRm9ybXVsYWUgLSBDaGVjayBmb3Igb3RoZXIgdXNlcyBvZgorLy8vIGxvb3AtaW52YXJpYW50IHZhbHVlcyB3aGljaCB3ZSdyZSB0cmFja2luZy4gVGhlc2Ugb3RoZXIgdXNlcyB3aWxsIHBpbiB0aGVzZQorLy8vIHZhbHVlcyBpbiByZWdpc3RlcnMsIG1ha2luZyB0aGVtIGxlc3MgcHJvZml0YWJsZSBmb3IgZWxpbWluYXRpb24uCisvLy8gVE9ETzogVGhpcyBjdXJyZW50bHkgbWlzc2VzIG5vbi1jb25zdGFudCBhZGRyZWMgc3RlcCByZWdpc3RlcnMuCisvLy8gVE9ETzogU2hvdWxkIHRoaXMgZ2l2ZSBtb3JlIHdlaWdodCB0byB1c2VycyBpbnNpZGUgdGhlIGxvb3A/Cit2b2lkCitMU1JJbnN0YW5jZTo6Q29sbGVjdExvb3BJbnZhcmlhbnRGaXh1cHNBbmRGb3JtdWxhZSgpIHsKKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBXb3JrbGlzdChSZWdVc2VzLmJlZ2luKCksIFJlZ1VzZXMuZW5kKCkpOworICBTbWFsbFB0clNldDxjb25zdCBTQ0VWICosIDg+IEluc2VydGVkOworCisgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgIGNvbnN0IFNDRVYgKlMgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKworICAgIGlmIChjb25zdCBTQ0VWTkFyeUV4cHIgKk4gPSBkeW5fY2FzdDxTQ0VWTkFyeUV4cHI+KFMpKQorICAgICAgV29ya2xpc3QuYXBwZW5kKE4tPm9wX2JlZ2luKCksIE4tPm9wX2VuZCgpKTsKKyAgICBlbHNlIGlmIChjb25zdCBTQ0VWQ2FzdEV4cHIgKkMgPSBkeW5fY2FzdDxTQ0VWQ2FzdEV4cHI+KFMpKQorICAgICAgV29ya2xpc3QucHVzaF9iYWNrKEMtPmdldE9wZXJhbmQoKSk7CisgICAgZWxzZSBpZiAoY29uc3QgU0NFVlVEaXZFeHByICpEID0gZHluX2Nhc3Q8U0NFVlVEaXZFeHByPihTKSkgeworICAgICAgV29ya2xpc3QucHVzaF9iYWNrKEQtPmdldExIUygpKTsKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhELT5nZXRSSFMoKSk7CisgICAgfSBlbHNlIGlmIChjb25zdCBTQ0VWVW5rbm93biAqVSA9IGR5bl9jYXN0PFNDRVZVbmtub3duPihTKSkgeworICAgICAgaWYgKCFJbnNlcnRlZC5pbnNlcnQoVSkpIGNvbnRpbnVlOworICAgICAgY29uc3QgVmFsdWUgKlYgPSBVLT5nZXRWYWx1ZSgpOworICAgICAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpJbnN0ID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKSB7CisgICAgICAgIC8vIExvb2sgZm9yIGluc3RydWN0aW9ucyBkZWZpbmVkIG91dHNpZGUgdGhlIGxvb3AuCisgICAgICAgIGlmIChMLT5jb250YWlucyhJbnN0KSkgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKGlzYTxVbmRlZlZhbHVlPihWKSkKKyAgICAgICAgLy8gVW5kZWYgZG9lc24ndCBoYXZlIGEgbGl2ZSByYW5nZSwgc28gaXQgZG9lc24ndCBtYXR0ZXIuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgZm9yIChWYWx1ZTo6Y29uc3RfdXNlX2l0ZXJhdG9yIFVJID0gVi0+dXNlX2JlZ2luKCksIFVFID0gVi0+dXNlX2VuZCgpOworICAgICAgICAgICBVSSAhPSBVRTsgKytVSSkgeworICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqVXNlckluc3QgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKyAgICAgICAgLy8gSWdub3JlIG5vbi1pbnN0cnVjdGlvbnMuCisgICAgICAgIGlmICghVXNlckluc3QpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8vIElnbm9yZSBpbnN0cnVjdGlvbnMgaW4gb3RoZXIgZnVuY3Rpb25zIChhcyBjYW4gaGFwcGVuIHdpdGgKKyAgICAgICAgLy8gQ29uc3RhbnRzKS4KKyAgICAgICAgaWYgKFVzZXJJbnN0LT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkgIT0gTC0+Z2V0SGVhZGVyKCktPmdldFBhcmVudCgpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBJZ25vcmUgaW5zdHJ1Y3Rpb25zIG5vdCBkb21pbmF0ZWQgYnkgdGhlIGxvb3AuCisgICAgICAgIGNvbnN0IEJhc2ljQmxvY2sgKlVzZUJCID0gIWlzYTxQSElOb2RlPihVc2VySW5zdCkgPworICAgICAgICAgIFVzZXJJbnN0LT5nZXRQYXJlbnQoKSA6CisgICAgICAgICAgY2FzdDxQSElOb2RlPihVc2VySW5zdCktPmdldEluY29taW5nQmxvY2soCisgICAgICAgICAgICBQSElOb2RlOjpnZXRJbmNvbWluZ1ZhbHVlTnVtRm9yT3BlcmFuZChVSS5nZXRPcGVyYW5kTm8oKSkpOworICAgICAgICBpZiAoIURULmRvbWluYXRlcyhMLT5nZXRIZWFkZXIoKSwgVXNlQkIpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBJZ25vcmUgdXNlcyB3aGljaCBhcmUgcGFydCBvZiBvdGhlciBTQ0VWIGV4cHJlc3Npb25zLCB0byBhdm9pZAorICAgICAgICAvLyBhbmFseXppbmcgdGhlbSBtdWx0aXBsZSB0aW1lcy4KKyAgICAgICAgaWYgKFNFLmlzU0NFVmFibGUoVXNlckluc3QtPmdldFR5cGUoKSkpIHsKKyAgICAgICAgICBjb25zdCBTQ0VWICpVc2VyUyA9IFNFLmdldFNDRVYoY29uc3RfY2FzdDxJbnN0cnVjdGlvbiAqPihVc2VySW5zdCkpOworICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGEgbm8tb3AsIGxvb2sgdGhyb3VnaCB0byBpdHMgdXNlcy4KKyAgICAgICAgICBpZiAoIWlzYTxTQ0VWVW5rbm93bj4oVXNlclMpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgaWYgKFVzZXJTID09IFUpIHsKKyAgICAgICAgICAgIFdvcmtsaXN0LnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgU0UuZ2V0VW5rbm93bihjb25zdF9jYXN0PEluc3RydWN0aW9uICo+KFVzZXJJbnN0KSkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIElnbm9yZSBpY21wIGluc3RydWN0aW9ucyB3aGljaCBhcmUgYWxyZWFkeSBiZWluZyBhbmFseXplZC4KKyAgICAgICAgaWYgKGNvbnN0IElDbXBJbnN0ICpJQ0kgPSBkeW5fY2FzdDxJQ21wSW5zdD4oVXNlckluc3QpKSB7CisgICAgICAgICAgdW5zaWduZWQgT3RoZXJJZHggPSAhVUkuZ2V0T3BlcmFuZE5vKCk7CisgICAgICAgICAgVmFsdWUgKk90aGVyT3AgPSBjb25zdF9jYXN0PFZhbHVlICo+KElDSS0+Z2V0T3BlcmFuZChPdGhlcklkeCkpOworICAgICAgICAgIGlmIChTRS5nZXRTQ0VWKE90aGVyT3ApLT5oYXNDb21wdXRhYmxlTG9vcEV2b2x1dGlvbihMKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgTFNSRml4dXAgJkxGID0gZ2V0TmV3Rml4dXAoKTsKKyAgICAgICAgTEYuVXNlckluc3QgPSBjb25zdF9jYXN0PEluc3RydWN0aW9uICo+KFVzZXJJbnN0KTsKKyAgICAgICAgTEYuT3BlcmFuZFZhbFRvUmVwbGFjZSA9IFVJLmdldFVzZSgpOworICAgICAgICBzdGQ6OnBhaXI8c2l6ZV90LCBpbnQ2NF90PiBQID0gZ2V0VXNlKFMsIExTUlVzZTo6QmFzaWMsIDApOworICAgICAgICBMRi5MVUlkeCA9IFAuZmlyc3Q7CisgICAgICAgIExGLk9mZnNldCA9IFAuc2Vjb25kOworICAgICAgICBMU1JVc2UgJkxVID0gVXNlc1tMRi5MVUlkeF07CisgICAgICAgIExVLkFsbEZpeHVwc091dHNpZGVMb29wICY9IExGLmlzVXNlRnVsbHlPdXRzaWRlTG9vcChMKTsKKyAgICAgICAgaWYgKCFMVS5XaWRlc3RGaXh1cFR5cGUgfHwKKyAgICAgICAgICAgIFNFLmdldFR5cGVTaXplSW5CaXRzKExVLldpZGVzdEZpeHVwVHlwZSkgPAorICAgICAgICAgICAgU0UuZ2V0VHlwZVNpemVJbkJpdHMoTEYuT3BlcmFuZFZhbFRvUmVwbGFjZS0+Z2V0VHlwZSgpKSkKKyAgICAgICAgICBMVS5XaWRlc3RGaXh1cFR5cGUgPSBMRi5PcGVyYW5kVmFsVG9SZXBsYWNlLT5nZXRUeXBlKCk7CisgICAgICAgIEluc2VydFN1cHBsZW1lbnRhbEZvcm11bGEoVSwgTFUsIExGLkxVSWR4KTsKKyAgICAgICAgQ291bnRSZWdpc3RlcnMoTFUuRm9ybXVsYWUuYmFjaygpLCBVc2VzLnNpemUoKSAtIDEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8vIENvbGxlY3RTdWJleHBycyAtIFNwbGl0IFMgaW50byBzdWJleHByZXNzaW9ucyB3aGljaCBjYW4gYmUgcHVsbGVkIG91dCBpbnRvCisvLy8gc2VwYXJhdGUgcmVnaXN0ZXJzLiBJZiBDIGlzIG5vbi1udWxsLCBtdWx0aXBseSBlYWNoIHN1YmV4cHJlc3Npb24gYnkgQy4KK3N0YXRpYyB2b2lkIENvbGxlY3RTdWJleHBycyhjb25zdCBTQ0VWICpTLCBjb25zdCBTQ0VWQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmVW5pbnRlcmVzdGluZ09wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UpIHsKKyAgaWYgKGNvbnN0IFNDRVZBZGRFeHByICpBZGQgPSBkeW5fY2FzdDxTQ0VWQWRkRXhwcj4oUykpIHsKKyAgICAvLyBCcmVhayBvdXQgYWRkIG9wZXJhbmRzLgorICAgIGZvciAoU0NFVkFkZEV4cHI6Om9wX2l0ZXJhdG9yIEkgPSBBZGQtPm9wX2JlZ2luKCksIEUgPSBBZGQtPm9wX2VuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBDb2xsZWN0U3ViZXhwcnMoKkksIEMsIE9wcywgVW5pbnRlcmVzdGluZ09wcywgTCwgU0UpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIgPSBkeW5fY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUykpIHsKKyAgICAvLyBTcGxpdCBhIG5vbi16ZXJvIGJhc2Ugb3V0IG9mIGFuIGFkZHJlYy4KKyAgICBpZiAoIUFSLT5nZXRTdGFydCgpLT5pc1plcm8oKSkgeworICAgICAgQ29sbGVjdFN1YmV4cHJzKFNFLmdldEFkZFJlY0V4cHIoU0UuZ2V0Q29uc3RhbnQoQVItPmdldFR5cGUoKSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUi0+Z2V0U3RlcFJlY3VycmVuY2UoU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVItPmdldExvb3AoKSksCisgICAgICAgICAgICAgICAgICAgICAgQywgT3BzLCBVbmludGVyZXN0aW5nT3BzLCBMLCBTRSk7CisgICAgICBDb2xsZWN0U3ViZXhwcnMoQVItPmdldFN0YXJ0KCksIEMsIE9wcywgVW5pbnRlcmVzdGluZ09wcywgTCwgU0UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSBlbHNlIGlmIChjb25zdCBTQ0VWTXVsRXhwciAqTXVsID0gZHluX2Nhc3Q8U0NFVk11bEV4cHI+KFMpKSB7CisgICAgLy8gQnJlYWsgKEMgKiAoYSArIGIgKyBjKSkgaW50byBDKmEgKyBDKmIgKyBDKmMuCisgICAgaWYgKE11bC0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAyKQorICAgICAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqT3AwID0KKyAgICAgICAgICAgIGR5bl9jYXN0PFNDRVZDb25zdGFudD4oTXVsLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgICBDb2xsZWN0U3ViZXhwcnMoTXVsLT5nZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgQyA/IGNhc3Q8U0NFVkNvbnN0YW50PihTRS5nZXRNdWxFeHByKEMsIE9wMCkpIDogT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCBVbmludGVyZXN0aW5nT3BzLCBMLCBTRSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgfQorCisgIC8vIE90aGVyd2lzZSB1c2UgdGhlIHZhbHVlIGl0c2VsZi4gTG9vcC12YXJpYW50ICJ1bmtub3duIiB2YWx1ZXMgYXJlCisgIC8vIHVuaW50ZXJlc3Rpbmc7IHdlIHdvbid0IGJlIGFibGUgdG8gZG8gYW55dGhpbmcgbWVhbmluZ2Z1bCB3aXRoIHRoZW0uCisgIGlmICghQyAmJiBpc2E8U0NFVlVua25vd24+KFMpICYmICFTLT5pc0xvb3BJbnZhcmlhbnQoTCkpCisgICAgVW5pbnRlcmVzdGluZ09wcy5wdXNoX2JhY2soUyk7CisgIGVsc2UKKyAgICBPcHMucHVzaF9iYWNrKEMgPyBTRS5nZXRNdWxFeHByKEMsIFMpIDogUyk7Cit9CisKKy8vLyBHZW5lcmF0ZVJlYXNzb2NpYXRpb25zIC0gU3BsaXQgb3V0IHN1YmV4cHJlc3Npb25zIGZyb20gYWRkcyBhbmQgdGhlIGJhc2VzIG9mCisvLy8gYWRkcmVjcy4KK3ZvaWQgTFNSSW5zdGFuY2U6OkdlbmVyYXRlUmVhc3NvY2lhdGlvbnMoTFNSVXNlICZMVSwgdW5zaWduZWQgTFVJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm11bGEgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGgpIHsKKyAgLy8gQXJiaXRyYXJpbHkgY2FwIHJlY3Vyc2lvbiB0byBwcm90ZWN0IGNvbXBpbGUgdGltZS4KKyAgaWYgKERlcHRoID49IDMpIHJldHVybjsKKworICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IEJhc2UuQmFzZVJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IFNDRVYgKkJhc2VSZWcgPSBCYXNlLkJhc2VSZWdzW2ldOworCisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBBZGRPcHMsIFVuaW50ZXJlc3RpbmdBZGRPcHM7CisgICAgQ29sbGVjdFN1YmV4cHJzKEJhc2VSZWcsIDAsIEFkZE9wcywgVW5pbnRlcmVzdGluZ0FkZE9wcywgTCwgU0UpOworCisgICAgLy8gQWRkIGFueSB1bmludGVyZXN0aW5nIHZhbHVlcyBhcyBvbmUgcmVnaXN0ZXIsIGFzIHdlIHdvbid0IGJlIGFibGUgdG8KKyAgICAvLyBmb3JtIGFueSBpbnRlcmVzdGluZyByZWFzc29jaWF0aW9uIG9wcG9ydHVuaXRpZXMgd2l0aCB0aGVtLiBUaGV5J2xsCisgICAgLy8ganVzdCBoYXZlIHRvIGJlIGFkZGVkIGluc2lkZSB0aGUgbG9vcCBubyBtYXR0ZXIgd2hhdCB3ZSBkby4KKyAgICBpZiAoIVVuaW50ZXJlc3RpbmdBZGRPcHMuZW1wdHkoKSkKKyAgICAgIEFkZE9wcy5wdXNoX2JhY2soU0UuZ2V0QWRkRXhwcihVbmludGVyZXN0aW5nQWRkT3BzKSk7CisKKyAgICBpZiAoQWRkT3BzLnNpemUoKSA9PSAxKSBjb250aW51ZTsKKworICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj46OmNvbnN0X2l0ZXJhdG9yIEogPSBBZGRPcHMuYmVnaW4oKSwKKyAgICAgICAgIEpFID0gQWRkT3BzLmVuZCgpOyBKICE9IEpFOyArK0opIHsKKyAgICAgIC8vIERvbid0IHB1bGwgYSBjb25zdGFudCBpbnRvIGEgcmVnaXN0ZXIgaWYgdGhlIGNvbnN0YW50IGNvdWxkIGJlIGZvbGRlZAorICAgICAgLy8gaW50byBhbiBpbW1lZGlhdGUgZmllbGQuCisgICAgICBpZiAoaXNBbHdheXNGb2xkYWJsZSgqSiwgTFUuTWluT2Zmc2V0LCBMVS5NYXhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlLmdldE51bVJlZ3MoKSA+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVS5LaW5kLCBMVS5BY2Nlc3NUeSwgVExJLCBTRSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBDb2xsZWN0IGFsbCBvcGVyYW5kcyBleGNlcHQgKkouCisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IElubmVyQWRkT3BzCisgICAgICAgICgoKGNvbnN0IFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgOD4gJilBZGRPcHMpLmJlZ2luKCksIEopOworICAgICAgSW5uZXJBZGRPcHMuYXBwZW5kCisgICAgICAgIChsbHZtOjpuZXh0KEopLCAoKGNvbnN0IFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgOD4gJilBZGRPcHMpLmVuZCgpKTsKKworICAgICAgLy8gRG9uJ3QgbGVhdmUganVzdCBhIGNvbnN0YW50IGJlaGluZCBpbiBhIHJlZ2lzdGVyIGlmIHRoZSBjb25zdGFudCBjb3VsZAorICAgICAgLy8gYmUgZm9sZGVkIGludG8gYW4gaW1tZWRpYXRlIGZpZWxkLgorICAgICAgaWYgKElubmVyQWRkT3BzLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgaXNBbHdheXNGb2xkYWJsZShJbm5lckFkZE9wc1swXSwgTFUuTWluT2Zmc2V0LCBMVS5NYXhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlLmdldE51bVJlZ3MoKSA+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVS5LaW5kLCBMVS5BY2Nlc3NUeSwgVExJLCBTRSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBjb25zdCBTQ0VWICpJbm5lclN1bSA9IFNFLmdldEFkZEV4cHIoSW5uZXJBZGRPcHMpOworICAgICAgaWYgKElubmVyU3VtLT5pc1plcm8oKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBGb3JtdWxhIEYgPSBCYXNlOworICAgICAgRi5CYXNlUmVnc1tpXSA9IElubmVyU3VtOworICAgICAgRi5CYXNlUmVncy5wdXNoX2JhY2soKkopOworICAgICAgaWYgKEluc2VydEZvcm11bGEoTFUsIExVSWR4LCBGKSkKKyAgICAgICAgLy8gSWYgdGhhdCBmb3JtdWxhIGhhZG4ndCBiZWVuIHNlZW4gYmVmb3JlLCByZWN1cnNlIHRvIGZpbmQgbW9yZSBsaWtlCisgICAgICAgIC8vIGl0LgorICAgICAgICBHZW5lcmF0ZVJlYXNzb2NpYXRpb25zKExVLCBMVUlkeCwgTFUuRm9ybXVsYWUuYmFjaygpLCBEZXB0aCsxKTsKKyAgICB9CisgIH0KK30KKworLy8vIEdlbmVyYXRlQ29tYmluYXRpb25zIC0gR2VuZXJhdGUgYSBmb3JtdWxhIGNvbnNpc3Rpbmcgb2YgYWxsIG9mIHRoZQorLy8vIGxvb3AtZG9taW5hdGluZyByZWdpc3RlcnMgYWRkZWQgaW50byBhIHNpbmdsZSByZWdpc3Rlci4KK3ZvaWQgTFNSSW5zdGFuY2U6OkdlbmVyYXRlQ29tYmluYXRpb25zKExTUlVzZSAmTFUsIHVuc2lnbmVkIExVSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXVsYSBCYXNlKSB7CisgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgaW50ZXJlc3Rpbmcgb24gYSBwbHVyYWxpdHkgb2YgcmVnaXN0ZXJzLgorICBpZiAoQmFzZS5CYXNlUmVncy5zaXplKCkgPD0gMSkgcmV0dXJuOworCisgIEZvcm11bGEgRiA9IEJhc2U7CisgIEYuQmFzZVJlZ3MuY2xlYXIoKTsKKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiBPcHM7CisgIGZvciAoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgSSA9IEJhc2UuQmFzZVJlZ3MuYmVnaW4oKSwgRSA9IEJhc2UuQmFzZVJlZ3MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgU0NFViAqQmFzZVJlZyA9ICpJOworICAgIGlmIChCYXNlUmVnLT5wcm9wZXJseURvbWluYXRlcyhMLT5nZXRIZWFkZXIoKSwgJkRUKSAmJgorICAgICAgICAhQmFzZVJlZy0+aGFzQ29tcHV0YWJsZUxvb3BFdm9sdXRpb24oTCkpCisgICAgICBPcHMucHVzaF9iYWNrKEJhc2VSZWcpOworICAgIGVsc2UKKyAgICAgIEYuQmFzZVJlZ3MucHVzaF9iYWNrKEJhc2VSZWcpOworICB9CisgIGlmIChPcHMuc2l6ZSgpID4gMSkgeworICAgIGNvbnN0IFNDRVYgKlN1bSA9IFNFLmdldEFkZEV4cHIoT3BzKTsKKyAgICAvLyBUT0RPOiBJZiBTdW0gaXMgemVybywgaXQgcHJvYmFibHkgbWVhbnMgU2NhbGFyRXZvbHV0aW9uIG1pc3NlZCBhbgorICAgIC8vIG9wcG9ydHVuaXR5IHRvIGZvbGQgc29tZXRoaW5nLiBGb3Igbm93LCBqdXN0IGlnbm9yZSBzdWNoIGNhc2VzCisgICAgLy8gcmF0aGVyIHRoYW4gcHJvY2VlZCB3aXRoIHplcm8gaW4gYSByZWdpc3Rlci4KKyAgICBpZiAoIVN1bS0+aXNaZXJvKCkpIHsKKyAgICAgIEYuQmFzZVJlZ3MucHVzaF9iYWNrKFN1bSk7CisgICAgICAodm9pZClJbnNlcnRGb3JtdWxhKExVLCBMVUlkeCwgRik7CisgICAgfQorICB9Cit9CisKKy8vLyBHZW5lcmF0ZVN5bWJvbGljT2Zmc2V0cyAtIEdlbmVyYXRlIHJldXNlIGZvcm11bGFlIHVzaW5nIHN5bWJvbGljIG9mZnNldHMuCit2b2lkIExTUkluc3RhbmNlOjpHZW5lcmF0ZVN5bWJvbGljT2Zmc2V0cyhMU1JVc2UgJkxVLCB1bnNpZ25lZCBMVUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm11bGEgQmFzZSkgeworICAvLyBXZSBjYW4ndCBhZGQgYSBzeW1ib2xpYyBvZmZzZXQgaWYgdGhlIGFkZHJlc3MgYWxyZWFkeSBjb250YWlucyBvbmUuCisgIGlmIChCYXNlLkFNLkJhc2VHVikgcmV0dXJuOworCisgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gQmFzZS5CYXNlUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgU0NFViAqRyA9IEJhc2UuQmFzZVJlZ3NbaV07CisgICAgR2xvYmFsVmFsdWUgKkdWID0gRXh0cmFjdFN5bWJvbChHLCBTRSk7CisgICAgaWYgKEctPmlzWmVybygpIHx8ICFHVikKKyAgICAgIGNvbnRpbnVlOworICAgIEZvcm11bGEgRiA9IEJhc2U7CisgICAgRi5BTS5CYXNlR1YgPSBHVjsKKyAgICBpZiAoIWlzTGVnYWxVc2UoRi5BTSwgTFUuTWluT2Zmc2V0LCBMVS5NYXhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIExVLktpbmQsIExVLkFjY2Vzc1R5LCBUTEkpKQorICAgICAgY29udGludWU7CisgICAgRi5CYXNlUmVnc1tpXSA9IEc7CisgICAgKHZvaWQpSW5zZXJ0Rm9ybXVsYShMVSwgTFVJZHgsIEYpOworICB9Cit9CisKKy8vLyBHZW5lcmF0ZUNvbnN0YW50T2Zmc2V0cyAtIEdlbmVyYXRlIHJldXNlIGZvcm11bGFlIHVzaW5nIHN5bWJvbGljIG9mZnNldHMuCit2b2lkIExTUkluc3RhbmNlOjpHZW5lcmF0ZUNvbnN0YW50T2Zmc2V0cyhMU1JVc2UgJkxVLCB1bnNpZ25lZCBMVUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm11bGEgQmFzZSkgeworICAvLyBUT0RPOiBGb3Igbm93LCBqdXN0IGFkZCB0aGUgbWluIGFuZCBtYXggb2Zmc2V0LCBiZWNhdXNlIGl0IHVzdWFsbHkgaXNuJ3QKKyAgLy8gd29ydGh3aGlsZSBsb29raW5nIGF0IGV2ZXJ5dGhpbmcgaW5iZXR3ZWVuLgorICBTbWFsbFZlY3RvcjxpbnQ2NF90LCAyPiBXb3JrbGlzdDsKKyAgV29ya2xpc3QucHVzaF9iYWNrKExVLk1pbk9mZnNldCk7CisgIGlmIChMVS5NYXhPZmZzZXQgIT0gTFUuTWluT2Zmc2V0KQorICAgIFdvcmtsaXN0LnB1c2hfYmFjayhMVS5NYXhPZmZzZXQpOworCisgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gQmFzZS5CYXNlUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgU0NFViAqRyA9IEJhc2UuQmFzZVJlZ3NbaV07CisKKyAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxpbnQ2NF90Pjo6Y29uc3RfaXRlcmF0b3IgSSA9IFdvcmtsaXN0LmJlZ2luKCksCisgICAgICAgICBFID0gV29ya2xpc3QuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBGb3JtdWxhIEYgPSBCYXNlOworICAgICAgRi5BTS5CYXNlT2ZmcyA9ICh1aW50NjRfdClCYXNlLkFNLkJhc2VPZmZzIC0gKkk7CisgICAgICBpZiAoaXNMZWdhbFVzZShGLkFNLCBMVS5NaW5PZmZzZXQgLSAqSSwgTFUuTWF4T2Zmc2V0IC0gKkksCisgICAgICAgICAgICAgICAgICAgICBMVS5LaW5kLCBMVS5BY2Nlc3NUeSwgVExJKSkgeworICAgICAgICAvLyBBZGQgdGhlIG9mZnNldCB0byB0aGUgYmFzZSByZWdpc3Rlci4KKyAgICAgICAgY29uc3QgU0NFViAqTmV3RyA9IFNFLmdldEFkZEV4cHIoRywgU0UuZ2V0Q29uc3RhbnQoRy0+Z2V0VHlwZSgpLCAqSSkpOworICAgICAgICAvLyBJZiBpdCBjYW5jZWxsZWQgb3V0LCBkcm9wIHRoZSBiYXNlIHJlZ2lzdGVyLCBvdGhlcndpc2UgdXBkYXRlIGl0LgorICAgICAgICBpZiAoTmV3Ry0+aXNaZXJvKCkpIHsKKyAgICAgICAgICBzdGQ6OnN3YXAoRi5CYXNlUmVnc1tpXSwgRi5CYXNlUmVncy5iYWNrKCkpOworICAgICAgICAgIEYuQmFzZVJlZ3MucG9wX2JhY2soKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgRi5CYXNlUmVnc1tpXSA9IE5ld0c7CisKKyAgICAgICAgKHZvaWQpSW5zZXJ0Rm9ybXVsYShMVSwgTFVJZHgsIEYpOworICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgSW1tID0gRXh0cmFjdEltbWVkaWF0ZShHLCBTRSk7CisgICAgaWYgKEctPmlzWmVybygpIHx8IEltbSA9PSAwKQorICAgICAgY29udGludWU7CisgICAgRm9ybXVsYSBGID0gQmFzZTsKKyAgICBGLkFNLkJhc2VPZmZzID0gKHVpbnQ2NF90KUYuQU0uQmFzZU9mZnMgKyBJbW07CisgICAgaWYgKCFpc0xlZ2FsVXNlKEYuQU0sIExVLk1pbk9mZnNldCwgTFUuTWF4T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBMVS5LaW5kLCBMVS5BY2Nlc3NUeSwgVExJKSkKKyAgICAgIGNvbnRpbnVlOworICAgIEYuQmFzZVJlZ3NbaV0gPSBHOworICAgICh2b2lkKUluc2VydEZvcm11bGEoTFUsIExVSWR4LCBGKTsKKyAgfQorfQorCisvLy8gR2VuZXJhdGVJQ21wWmVyb1NjYWxlcyAtIEZvciBJQ21wWmVybywgY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBzY2FsZSB1cAorLy8vIHRoZSBjb21wYXJpc29uLiBGb3IgZXhhbXBsZSwgeCA9PSB5IC0+IHgqYyA9PSB5KmMuCit2b2lkIExTUkluc3RhbmNlOjpHZW5lcmF0ZUlDbXBaZXJvU2NhbGVzKExTUlVzZSAmTFUsIHVuc2lnbmVkIExVSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtdWxhIEJhc2UpIHsKKyAgaWYgKExVLktpbmQgIT0gTFNSVXNlOjpJQ21wWmVybykgcmV0dXJuOworCisgIC8vIERldGVybWluZSB0aGUgaW50ZWdlciB0eXBlIGZvciB0aGUgYmFzZSBmb3JtdWxhLgorICBjb25zdCBUeXBlICpJbnRUeSA9IEJhc2UuZ2V0VHlwZSgpOworICBpZiAoIUludFR5KSByZXR1cm47CisgIGlmIChTRS5nZXRUeXBlU2l6ZUluQml0cyhJbnRUeSkgPiA2NCkgcmV0dXJuOworCisgIC8vIERvbid0IGRvIHRoaXMgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBvZmZzZXQuCisgIGlmIChMVS5NaW5PZmZzZXQgIT0gTFUuTWF4T2Zmc2V0KSByZXR1cm47CisKKyAgYXNzZXJ0KCFCYXNlLkFNLkJhc2VHViAmJiAiSUNtcFplcm8gdXNlIGlzIG5vdCBsZWdhbCEiKTsKKworICAvLyBDaGVjayBlYWNoIGludGVyZXN0aW5nIHN0cmlkZS4KKyAgZm9yIChTbWFsbFNldFZlY3RvcjxpbnQ2NF90LCA4Pjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICBJID0gRmFjdG9ycy5iZWdpbigpLCBFID0gRmFjdG9ycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpbnQ2NF90IEZhY3RvciA9ICpJOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbXVsdGlwbGljYXRpb24gZG9lc24ndCBvdmVyZmxvdy4KKyAgICBpZiAoQmFzZS5BTS5CYXNlT2ZmcyA9PSBJTlQ2NF9NSU4gJiYgRmFjdG9yID09IC0xKQorICAgICAgY29udGludWU7CisgICAgaW50NjRfdCBOZXdCYXNlT2ZmcyA9ICh1aW50NjRfdClCYXNlLkFNLkJhc2VPZmZzICogRmFjdG9yOworICAgIGlmIChOZXdCYXNlT2ZmcyAvIEZhY3RvciAhPSBCYXNlLkFNLkJhc2VPZmZzKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBDaGVjayB0aGF0IG11bHRpcGx5aW5nIHdpdGggdGhlIHVzZSBvZmZzZXQgZG9lc24ndCBvdmVyZmxvdy4KKyAgICBpbnQ2NF90IE9mZnNldCA9IExVLk1pbk9mZnNldDsKKyAgICBpZiAoT2Zmc2V0ID09IElOVDY0X01JTiAmJiBGYWN0b3IgPT0gLTEpCisgICAgICBjb250aW51ZTsKKyAgICBPZmZzZXQgPSAodWludDY0X3QpT2Zmc2V0ICogRmFjdG9yOworICAgIGlmIChPZmZzZXQgLyBGYWN0b3IgIT0gTFUuTWluT2Zmc2V0KQorICAgICAgY29udGludWU7CisKKyAgICBGb3JtdWxhIEYgPSBCYXNlOworICAgIEYuQU0uQmFzZU9mZnMgPSBOZXdCYXNlT2ZmczsKKworICAgIC8vIENoZWNrIHRoYXQgdGhpcyBzY2FsZSBpcyBsZWdhbC4KKyAgICBpZiAoIWlzTGVnYWxVc2UoRi5BTSwgT2Zmc2V0LCBPZmZzZXQsIExVLktpbmQsIExVLkFjY2Vzc1R5LCBUTEkpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBDb21wZW5zYXRlIGZvciB0aGUgdXNlIGhhdmluZyBNaW5PZmZzZXQgYnVpbHQgaW50byBpdC4KKyAgICBGLkFNLkJhc2VPZmZzID0gKHVpbnQ2NF90KUYuQU0uQmFzZU9mZnMgKyBPZmZzZXQgLSBMVS5NaW5PZmZzZXQ7CisKKyAgICBjb25zdCBTQ0VWICpGYWN0b3JTID0gU0UuZ2V0Q29uc3RhbnQoSW50VHksIEZhY3Rvcik7CisKKyAgICAvLyBDaGVjayB0aGF0IG11bHRpcGx5aW5nIHdpdGggZWFjaCBiYXNlIHJlZ2lzdGVyIGRvZXNuJ3Qgb3ZlcmZsb3cuCisgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBGLkJhc2VSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEYuQmFzZVJlZ3NbaV0gPSBTRS5nZXRNdWxFeHByKEYuQmFzZVJlZ3NbaV0sIEZhY3RvclMpOworICAgICAgaWYgKGdldEV4YWN0U0RpdihGLkJhc2VSZWdzW2ldLCBGYWN0b3JTLCBTRSkgIT0gQmFzZS5CYXNlUmVnc1tpXSkKKyAgICAgICAgZ290byBuZXh0OworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgbXVsdGlwbHlpbmcgd2l0aCB0aGUgc2NhbGVkIHJlZ2lzdGVyIGRvZXNuJ3Qgb3ZlcmZsb3cuCisgICAgaWYgKEYuU2NhbGVkUmVnKSB7CisgICAgICBGLlNjYWxlZFJlZyA9IFNFLmdldE11bEV4cHIoRi5TY2FsZWRSZWcsIEZhY3RvclMpOworICAgICAgaWYgKGdldEV4YWN0U0RpdihGLlNjYWxlZFJlZywgRmFjdG9yUywgU0UpICE9IEJhc2UuU2NhbGVkUmVnKQorICAgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBtYWtlIGl0IGhlcmUgYW5kIGl0J3MgbGVnYWwsIGFkZCBpdC4KKyAgICAodm9pZClJbnNlcnRGb3JtdWxhKExVLCBMVUlkeCwgRik7CisgIG5leHQ6OworICB9Cit9CisKKy8vLyBHZW5lcmF0ZVNjYWxlcyAtIEdlbmVyYXRlIHN0cmlkZSBmYWN0b3IgcmV1c2UgZm9ybXVsYWUgYnkgbWFraW5nIHVzZSBvZgorLy8vIHNjYWxlZC1vZmZzZXQgYWRkcmVzcyBtb2RlcywgZm9yIGV4YW1wbGUuCit2b2lkIExTUkluc3RhbmNlOjpHZW5lcmF0ZVNjYWxlcyhMU1JVc2UgJkxVLCB1bnNpZ25lZCBMVUlkeCwgRm9ybXVsYSBCYXNlKSB7CisgIC8vIERldGVybWluZSB0aGUgaW50ZWdlciB0eXBlIGZvciB0aGUgYmFzZSBmb3JtdWxhLgorICBjb25zdCBUeXBlICpJbnRUeSA9IEJhc2UuZ2V0VHlwZSgpOworICBpZiAoIUludFR5KSByZXR1cm47CisKKyAgLy8gSWYgdGhpcyBGb3JtdWxhIGFscmVhZHkgaGFzIGEgc2NhbGVkIHJlZ2lzdGVyLCB3ZSBjYW4ndCBhZGQgYW5vdGhlciBvbmUuCisgIGlmIChCYXNlLkFNLlNjYWxlICE9IDApIHJldHVybjsKKworICAvLyBDaGVjayBlYWNoIGludGVyZXN0aW5nIHN0cmlkZS4KKyAgZm9yIChTbWFsbFNldFZlY3RvcjxpbnQ2NF90LCA4Pjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICBJID0gRmFjdG9ycy5iZWdpbigpLCBFID0gRmFjdG9ycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpbnQ2NF90IEZhY3RvciA9ICpJOworCisgICAgQmFzZS5BTS5TY2FsZSA9IEZhY3RvcjsKKyAgICBCYXNlLkFNLkhhc0Jhc2VSZWcgPSBCYXNlLkJhc2VSZWdzLnNpemUoKSA+IDE7CisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIHNjYWxlIGlzIGdvaW5nIHRvIGJlIGxlZ2FsLgorICAgIGlmICghaXNMZWdhbFVzZShCYXNlLkFNLCBMVS5NaW5PZmZzZXQsIExVLk1heE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgTFUuS2luZCwgTFUuQWNjZXNzVHksIFRMSSkpIHsKKyAgICAgIC8vIEFzIGEgc3BlY2lhbC1jYXNlLCBoYW5kbGUgc3BlY2lhbCBvdXQtb2YtbG9vcCBCYXNpYyB1c2VycyBzcGVjaWFsbHkuCisgICAgICAvLyBUT0RPOiBSZWNvbnNpZGVyIHRoaXMgc3BlY2lhbCBjYXNlLgorICAgICAgaWYgKExVLktpbmQgPT0gTFNSVXNlOjpCYXNpYyAmJgorICAgICAgICAgIGlzTGVnYWxVc2UoQmFzZS5BTSwgTFUuTWluT2Zmc2V0LCBMVS5NYXhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBMU1JVc2U6OlNwZWNpYWwsIExVLkFjY2Vzc1R5LCBUTEkpICYmCisgICAgICAgICAgTFUuQWxsRml4dXBzT3V0c2lkZUxvb3ApCisgICAgICAgIExVLktpbmQgPSBMU1JVc2U6OlNwZWNpYWw7CisgICAgICBlbHNlCisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBGb3IgYW4gSUNtcFplcm8sIG5lZ2F0aW5nIGEgc29saXRhcnkgYmFzZSByZWdpc3RlciB3b24ndCBsZWFkIHRvCisgICAgLy8gbmV3IHNvbHV0aW9ucy4KKyAgICBpZiAoTFUuS2luZCA9PSBMU1JVc2U6OklDbXBaZXJvICYmCisgICAgICAgICFCYXNlLkFNLkhhc0Jhc2VSZWcgJiYgQmFzZS5BTS5CYXNlT2ZmcyA9PSAwICYmICFCYXNlLkFNLkJhc2VHVikKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIEZvciBlYWNoIGFkZHJlYyBiYXNlIHJlZywgYXBwbHkgdGhlIHNjYWxlLCBpZiBwb3NzaWJsZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IEJhc2UuQmFzZVJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIgPQorICAgICAgICAgICAgZHluX2Nhc3Q8U0NFVkFkZFJlY0V4cHI+KEJhc2UuQmFzZVJlZ3NbaV0pKSB7CisgICAgICAgIGNvbnN0IFNDRVYgKkZhY3RvclMgPSBTRS5nZXRDb25zdGFudChJbnRUeSwgRmFjdG9yKTsKKyAgICAgICAgaWYgKEZhY3RvclMtPmlzWmVybygpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBEaXZpZGUgb3V0IHRoZSBmYWN0b3IsIGlnbm9yaW5nIGhpZ2ggYml0cywgc2luY2Ugd2UnbGwgYmUKKyAgICAgICAgLy8gc2NhbGluZyB0aGUgdmFsdWUgYmFjayB1cCBpbiB0aGUgZW5kLgorICAgICAgICBpZiAoY29uc3QgU0NFViAqUXVvdGllbnQgPSBnZXRFeGFjdFNEaXYoQVIsIEZhY3RvclMsIFNFLCB0cnVlKSkgeworICAgICAgICAgIC8vIFRPRE86IFRoaXMgY291bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGFsbCB0aGUgY29weWluZy4KKyAgICAgICAgICBGb3JtdWxhIEYgPSBCYXNlOworICAgICAgICAgIEYuU2NhbGVkUmVnID0gUXVvdGllbnQ7CisgICAgICAgICAgRi5EZWxldGVCYXNlUmVnKEYuQmFzZVJlZ3NbaV0pOworICAgICAgICAgICh2b2lkKUluc2VydEZvcm11bGEoTFUsIExVSWR4LCBGKTsKKyAgICAgICAgfQorICAgICAgfQorICB9Cit9CisKKy8vLyBHZW5lcmF0ZVRydW5jYXRlcyAtIEdlbmVyYXRlIHJldXNlIGZvcm11bGFlIGZyb20gZGlmZmVyZW50IElWIHR5cGVzLgordm9pZCBMU1JJbnN0YW5jZTo6R2VuZXJhdGVUcnVuY2F0ZXMoTFNSVXNlICZMVSwgdW5zaWduZWQgTFVJZHgsIEZvcm11bGEgQmFzZSkgeworICAvLyBUaGlzIHJlcXVpcmVzIFRhcmdldExvd2VyaW5nIHRvIHRlbGwgdXMgd2hpY2ggdHJ1bmNhdGVzIGFyZSBmcmVlLgorICBpZiAoIVRMSSkgcmV0dXJuOworCisgIC8vIERvbid0IGJvdGhlciB0cnVuY2F0aW5nIHN5bWJvbGljIHZhbHVlcy4KKyAgaWYgKEJhc2UuQU0uQmFzZUdWKSByZXR1cm47CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBpbnRlZ2VyIHR5cGUgZm9yIHRoZSBiYXNlIGZvcm11bGEuCisgIGNvbnN0IFR5cGUgKkRzdFR5ID0gQmFzZS5nZXRUeXBlKCk7CisgIGlmICghRHN0VHkpIHJldHVybjsKKyAgRHN0VHkgPSBTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShEc3RUeSk7CisKKyAgZm9yIChTbWFsbFNldFZlY3Rvcjxjb25zdCBUeXBlICosIDQ+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgIEkgPSBUeXBlcy5iZWdpbigpLCBFID0gVHlwZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgVHlwZSAqU3JjVHkgPSAqSTsKKyAgICBpZiAoU3JjVHkgIT0gRHN0VHkgJiYgVExJLT5pc1RydW5jYXRlRnJlZShTcmNUeSwgRHN0VHkpKSB7CisgICAgICBGb3JtdWxhIEYgPSBCYXNlOworCisgICAgICBpZiAoRi5TY2FsZWRSZWcpIEYuU2NhbGVkUmVnID0gU0UuZ2V0QW55RXh0ZW5kRXhwcihGLlNjYWxlZFJlZywgKkkpOworICAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPjo6aXRlcmF0b3IgSiA9IEYuQmFzZVJlZ3MuYmVnaW4oKSwKKyAgICAgICAgICAgSkUgPSBGLkJhc2VSZWdzLmVuZCgpOyBKICE9IEpFOyArK0opCisgICAgICAgICpKID0gU0UuZ2V0QW55RXh0ZW5kRXhwcigqSiwgU3JjVHkpOworCisgICAgICAvLyBUT0RPOiBUaGlzIGFzc3VtZXMgd2UndmUgZG9uZSBiYXNpYyBwcm9jZXNzaW5nIG9uIGFsbCB1c2VzIGFuZAorICAgICAgLy8gaGF2ZSBhbiBpZGVhIHdoYXQgdGhlIHJlZ2lzdGVyIHVzYWdlIGlzLgorICAgICAgaWYgKCFGLmhhc1JlZ3NVc2VkQnlVc2VzT3RoZXJUaGFuKExVSWR4LCBSZWdVc2VzKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgICh2b2lkKUluc2VydEZvcm11bGEoTFUsIExVSWR4LCBGKTsKKyAgICB9CisgIH0KK30KKworbmFtZXNwYWNlIHsKKworLy8vIFdvcmtJdGVtIC0gSGVscGVyIGNsYXNzIGZvciBHZW5lcmF0ZUNyb3NzVXNlQ29uc3RhbnRPZmZzZXRzLiBJdCdzIHVzZWQgdG8KKy8vLyBkZWZlciBtb2RpZmljYXRpb25zIHNvIHRoYXQgdGhlIHNlYXJjaCBwaGFzZSBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKKy8vLyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIG1vdmluZyB1bmRlcm5lYXRoIGl0Lgorc3RydWN0IFdvcmtJdGVtIHsKKyAgc2l6ZV90IExVSWR4OworICBpbnQ2NF90IEltbTsKKyAgY29uc3QgU0NFViAqT3JpZ1JlZzsKKworICBXb3JrSXRlbShzaXplX3QgTEksIGludDY0X3QgSSwgY29uc3QgU0NFViAqUikKKyAgICA6IExVSWR4KExJKSwgSW1tKEkpLCBPcmlnUmVnKFIpIHt9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK30KKwordm9pZCBXb3JrSXRlbTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIE9TIDw8ICJpbiBmb3JtdWxhZSByZWZlcmVuY2luZyAiIDw8ICpPcmlnUmVnIDw8ICIgaW4gdXNlICIgPDwgTFVJZHgKKyAgICAgPDwgIiAsIGFkZCBvZmZzZXQgIiA8PCBJbW07Cit9CisKK3ZvaWQgV29ya0l0ZW06OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGVycnMoKSk7IGVycnMoKSA8PCAnXG4nOworfQorCisvLy8gR2VuZXJhdGVDcm9zc1VzZUNvbnN0YW50T2Zmc2V0cyAtIExvb2sgZm9yIHJlZ2lzdGVycyB3aGljaCBhcmUgYSBjb25zdGFudAorLy8vIGRpc3RhbmNlIGFwYXJ0IGFuZCB0cnkgdG8gZm9ybSByZXVzZSBvcHBvcnR1bml0aWVzIGJldHdlZW4gdGhlbS4KK3ZvaWQgTFNSSW5zdGFuY2U6OkdlbmVyYXRlQ3Jvc3NVc2VDb25zdGFudE9mZnNldHMoKSB7CisgIC8vIEdyb3VwIHRoZSByZWdpc3RlcnMgYnkgdGhlaXIgdmFsdWUgd2l0aG91dCBhbnkgYWRkZWQgY29uc3RhbnQgb2Zmc2V0LgorICB0eXBlZGVmIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IFNDRVYgKj4gSW1tTWFwVHk7CisgIHR5cGVkZWYgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBJbW1NYXBUeT4gUmVnTWFwVHk7CisgIFJlZ01hcFR5IE1hcDsKKyAgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBTbWFsbEJpdFZlY3Rvcj4gVXNlZEJ5SW5kaWNlc01hcDsKKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBTZXF1ZW5jZTsKKyAgZm9yIChSZWdVc2VUcmFja2VyOjpjb25zdF9pdGVyYXRvciBJID0gUmVnVXNlcy5iZWdpbigpLCBFID0gUmVnVXNlcy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IFNDRVYgKlJlZyA9ICpJOworICAgIGludDY0X3QgSW1tID0gRXh0cmFjdEltbWVkaWF0ZShSZWcsIFNFKTsKKyAgICBzdGQ6OnBhaXI8UmVnTWFwVHk6Oml0ZXJhdG9yLCBib29sPiBQYWlyID0KKyAgICAgIE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUmVnLCBJbW1NYXBUeSgpKSk7CisgICAgaWYgKFBhaXIuc2Vjb25kKQorICAgICAgU2VxdWVuY2UucHVzaF9iYWNrKFJlZyk7CisgICAgUGFpci5maXJzdC0+c2Vjb25kLmluc2VydChzdGQ6Om1ha2VfcGFpcihJbW0sICpJKSk7CisgICAgVXNlZEJ5SW5kaWNlc01hcFtSZWddIHw9IFJlZ1VzZXMuZ2V0VXNlZEJ5SW5kaWNlcygqSSk7CisgIH0KKworICAvLyBOb3cgZXhhbWluZSBlYWNoIHNldCBvZiByZWdpc3RlcnMgd2l0aCB0aGUgc2FtZSBiYXNlIHZhbHVlLiBCdWlsZCB1cAorICAvLyBhIGxpc3Qgb2Ygd29yayB0byBkbyBhbmQgZG8gdGhlIHdvcmsgaW4gYSBzZXBhcmF0ZSBzdGVwIHNvIHRoYXQgd2UncmUKKyAgLy8gbm90IGFkZGluZyBmb3JtdWxhZSBhbmQgcmVnaXN0ZXIgY291bnRzIHdoaWxlIHdlJ3JlIHNlYXJjaGluZy4KKyAgU21hbGxWZWN0b3I8V29ya0l0ZW0sIDMyPiBXb3JrSXRlbXM7CisgIFNtYWxsU2V0PHN0ZDo6cGFpcjxzaXplX3QsIGludDY0X3Q+LCAzMj4gVW5pcXVlSXRlbXM7CisgIGZvciAoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBTZXF1ZW5jZS5iZWdpbigpLAorICAgICAgIEUgPSBTZXF1ZW5jZS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBTQ0VWICpSZWcgPSAqSTsKKyAgICBjb25zdCBJbW1NYXBUeSAmSW1tcyA9IE1hcC5maW5kKFJlZyktPnNlY29uZDsKKworICAgIC8vIEl0J3Mgbm90IHdvcnRod2hpbGUgbG9va2luZyBmb3IgcmV1c2UgaWYgdGhlcmUncyBvbmx5IG9uZSBvZmZzZXQuCisgICAgaWYgKEltbXMuc2l6ZSgpID09IDEpCisgICAgICBjb250aW51ZTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiR2VuZXJhdGluZyBjcm9zcy11c2Ugb2Zmc2V0cyBmb3IgIiA8PCAqUmVnIDw8ICc6JzsKKyAgICAgICAgICBmb3IgKEltbU1hcFR5Ojpjb25zdF9pdGVyYXRvciBKID0gSW1tcy5iZWdpbigpLCBKRSA9IEltbXMuZW5kKCk7CisgICAgICAgICAgICAgICBKICE9IEpFOyArK0opCisgICAgICAgICAgICBkYmdzKCkgPDwgJyAnIDw8IEotPmZpcnN0OworICAgICAgICAgIGRiZ3MoKSA8PCAnXG4nKTsKKworICAgIC8vIEV4YW1pbmUgZWFjaCBvZmZzZXQuCisgICAgZm9yIChJbW1NYXBUeTo6Y29uc3RfaXRlcmF0b3IgSiA9IEltbXMuYmVnaW4oKSwgSkUgPSBJbW1zLmVuZCgpOworICAgICAgICAgSiAhPSBKRTsgKytKKSB7CisgICAgICBjb25zdCBTQ0VWICpPcmlnUmVnID0gSi0+c2Vjb25kOworCisgICAgICBpbnQ2NF90IEpJbW0gPSBKLT5maXJzdDsKKyAgICAgIGNvbnN0IFNtYWxsQml0VmVjdG9yICZVc2VkQnlJbmRpY2VzID0gUmVnVXNlcy5nZXRVc2VkQnlJbmRpY2VzKE9yaWdSZWcpOworCisgICAgICBpZiAoIWlzYTxTQ0VWQ29uc3RhbnQ+KE9yaWdSZWcpICYmCisgICAgICAgICAgVXNlZEJ5SW5kaWNlc01hcFtSZWddLmNvdW50KCkgPT0gMSkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlNraXBwaW5nIGNyb3NzLXVzZSByZXVzZSBmb3IgIiA8PCAqT3JpZ1JlZyA8PCAnXG4nKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIENvbnNlcnZhdGl2ZWx5IGV4YW1pbmUgb2Zmc2V0cyBiZXR3ZWVuIHRoaXMgb3JpZyByZWcgYSBmZXcgc2VsZWN0ZWQKKyAgICAgIC8vIG90aGVyIG9yaWcgcmVncy4KKyAgICAgIEltbU1hcFR5Ojpjb25zdF9pdGVyYXRvciBPdGhlckltbXNbXSA9IHsKKyAgICAgICAgSW1tcy5iZWdpbigpLCBwcmlvcihJbW1zLmVuZCgpKSwKKyAgICAgICAgSW1tcy51cHBlcl9ib3VuZCgoSW1tcy5iZWdpbigpLT5maXJzdCArIHByaW9yKEltbXMuZW5kKCkpLT5maXJzdCkgLyAyKQorICAgICAgfTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gYXJyYXlfbGVuZ3Rob2YoT3RoZXJJbW1zKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgSW1tTWFwVHk6OmNvbnN0X2l0ZXJhdG9yIE0gPSBPdGhlckltbXNbaV07CisgICAgICAgIGlmIChNID09IEogfHwgTSA9PSBKRSkgY29udGludWU7CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28uCisgICAgICAgIGludDY0X3QgSW1tID0gKHVpbnQ2NF90KUpJbW0gLSBNLT5maXJzdDsKKyAgICAgICAgZm9yIChpbnQgTFVJZHggPSBVc2VkQnlJbmRpY2VzLmZpbmRfZmlyc3QoKTsgTFVJZHggIT0gLTE7CisgICAgICAgICAgICAgTFVJZHggPSBVc2VkQnlJbmRpY2VzLmZpbmRfbmV4dChMVUlkeCkpCisgICAgICAgICAgLy8gTWFrZSBhIG1lbW8gb2YgdGhpcyB1c2UsIG9mZnNldCwgYW5kIHJlZ2lzdGVyIHR1cGxlLgorICAgICAgICAgIGlmIChVbmlxdWVJdGVtcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTFVJZHgsIEltbSkpKQorICAgICAgICAgICAgV29ya0l0ZW1zLnB1c2hfYmFjayhXb3JrSXRlbShMVUlkeCwgSW1tLCBPcmlnUmVnKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgTWFwLmNsZWFyKCk7CisgIFNlcXVlbmNlLmNsZWFyKCk7CisgIFVzZWRCeUluZGljZXNNYXAuY2xlYXIoKTsKKyAgVW5pcXVlSXRlbXMuY2xlYXIoKTsKKworICAvLyBOb3cgaXRlcmF0ZSB0aHJvdWdoIHRoZSB3b3JrbGlzdCBhbmQgYWRkIG5ldyBmb3JtdWxhZS4KKyAgZm9yIChTbWFsbFZlY3RvckltcGw8V29ya0l0ZW0+Ojpjb25zdF9pdGVyYXRvciBJID0gV29ya0l0ZW1zLmJlZ2luKCksCisgICAgICAgRSA9IFdvcmtJdGVtcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBXb3JrSXRlbSAmV0kgPSAqSTsKKyAgICBzaXplX3QgTFVJZHggPSBXSS5MVUlkeDsKKyAgICBMU1JVc2UgJkxVID0gVXNlc1tMVUlkeF07CisgICAgaW50NjRfdCBJbW0gPSBXSS5JbW07CisgICAgY29uc3QgU0NFViAqT3JpZ1JlZyA9IFdJLk9yaWdSZWc7CisKKyAgICBjb25zdCBUeXBlICpJbnRUeSA9IFNFLmdldEVmZmVjdGl2ZVNDRVZUeXBlKE9yaWdSZWctPmdldFR5cGUoKSk7CisgICAgY29uc3QgU0NFViAqTmVnSW1tUyA9IFNFLmdldFNDRVYoQ29uc3RhbnRJbnQ6OmdldChJbnRUeSwgLSh1aW50NjRfdClJbW0pKTsKKyAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IFNFLmdldFR5cGVTaXplSW5CaXRzKEludFR5KTsKKworICAgIC8vIFRPRE86IFVzZSBhIG1vcmUgdGFyZ2V0ZWQgZGF0YSBzdHJ1Y3R1cmUuCisgICAgZm9yIChzaXplX3QgTCA9IDAsIExFID0gTFUuRm9ybXVsYWUuc2l6ZSgpOyBMICE9IExFOyArK0wpIHsKKyAgICAgIGNvbnN0IEZvcm11bGEgJkYgPSBMVS5Gb3JtdWxhZVtMXTsKKyAgICAgIC8vIFVzZSB0aGUgaW1tZWRpYXRlIGluIHRoZSBzY2FsZWQgcmVnaXN0ZXIuCisgICAgICBpZiAoRi5TY2FsZWRSZWcgPT0gT3JpZ1JlZykgeworICAgICAgICBpbnQ2NF90IE9mZnMgPSAodWludDY0X3QpRi5BTS5CYXNlT2ZmcyArCisgICAgICAgICAgICAgICAgICAgICAgIEltbSAqICh1aW50NjRfdClGLkFNLlNjYWxlOworICAgICAgICAvLyBEb24ndCBjcmVhdGUgNTAgKyByZWcoLTUwKS4KKyAgICAgICAgaWYgKEYucmVmZXJlbmNlc1JlZyhTRS5nZXRTQ0VWKAorICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoSW50VHksIC0odWludDY0X3QpT2ZmcykpKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgRm9ybXVsYSBOZXdGID0gRjsKKyAgICAgICAgTmV3Ri5BTS5CYXNlT2ZmcyA9IE9mZnM7CisgICAgICAgIGlmICghaXNMZWdhbFVzZShOZXdGLkFNLCBMVS5NaW5PZmZzZXQsIExVLk1heE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExVLktpbmQsIExVLkFjY2Vzc1R5LCBUTEkpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBOZXdGLlNjYWxlZFJlZyA9IFNFLmdldEFkZEV4cHIoTmVnSW1tUywgTmV3Ri5TY2FsZWRSZWcpOworCisgICAgICAgIC8vIElmIHRoZSBuZXcgc2NhbGUgaXMgYSBjb25zdGFudCBpbiBhIHJlZ2lzdGVyLCBhbmQgYWRkaW5nIHRoZSBjb25zdGFudAorICAgICAgICAvLyB2YWx1ZSB0byB0aGUgaW1tZWRpYXRlIHdvdWxkIHByb2R1Y2UgYSB2YWx1ZSBjbG9zZXIgdG8gemVybyB0aGFuIHRoZQorICAgICAgICAvLyBpbW1lZGlhdGUgaXRzZWxmLCB0aGVuIHRoZSBmb3JtdWxhIGlzbid0IHdvcnRod2hpbGUuCisgICAgICAgIGlmIChjb25zdCBTQ0VWQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxTQ0VWQ29uc3RhbnQ+KE5ld0YuU2NhbGVkUmVnKSkKKyAgICAgICAgICBpZiAoQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKS5pc05lZ2F0aXZlKCkgIT0KKyAgICAgICAgICAgICAgICAoTmV3Ri5BTS5CYXNlT2ZmcyA8IDApICYmCisgICAgICAgICAgICAgIChDLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLmFicygpICogQVBJbnQoQml0V2lkdGgsIEYuQU0uU2NhbGUpKQorICAgICAgICAgICAgICAgIC51bGUoYWJzNjQoTmV3Ri5BTS5CYXNlT2ZmcykpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gT0ssIGxvb2tzIGdvb2QuCisgICAgICAgICh2b2lkKUluc2VydEZvcm11bGEoTFUsIExVSWR4LCBOZXdGKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSB0aGUgaW1tZWRpYXRlIGluIGEgYmFzZSByZWdpc3Rlci4KKyAgICAgICAgZm9yIChzaXplX3QgTiA9IDAsIE5FID0gRi5CYXNlUmVncy5zaXplKCk7IE4gIT0gTkU7ICsrTikgeworICAgICAgICAgIGNvbnN0IFNDRVYgKkJhc2VSZWcgPSBGLkJhc2VSZWdzW05dOworICAgICAgICAgIGlmIChCYXNlUmVnICE9IE9yaWdSZWcpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBGb3JtdWxhIE5ld0YgPSBGOworICAgICAgICAgIE5ld0YuQU0uQmFzZU9mZnMgPSAodWludDY0X3QpTmV3Ri5BTS5CYXNlT2ZmcyArIEltbTsKKyAgICAgICAgICBpZiAoIWlzTGVnYWxVc2UoTmV3Ri5BTSwgTFUuTWluT2Zmc2V0LCBMVS5NYXhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExVLktpbmQsIExVLkFjY2Vzc1R5LCBUTEkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgTmV3Ri5CYXNlUmVnc1tOXSA9IFNFLmdldEFkZEV4cHIoTmVnSW1tUywgQmFzZVJlZyk7CisKKyAgICAgICAgICAvLyBJZiB0aGUgbmV3IGZvcm11bGEgaGFzIGEgY29uc3RhbnQgaW4gYSByZWdpc3RlciwgYW5kIGFkZGluZyB0aGUKKyAgICAgICAgICAvLyBjb25zdGFudCB2YWx1ZSB0byB0aGUgaW1tZWRpYXRlIHdvdWxkIHByb2R1Y2UgYSB2YWx1ZSBjbG9zZXIgdG8KKyAgICAgICAgICAvLyB6ZXJvIHRoYW4gdGhlIGltbWVkaWF0ZSBpdHNlbGYsIHRoZW4gdGhlIGZvcm11bGEgaXNuJ3Qgd29ydGh3aGlsZS4KKyAgICAgICAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgSiA9IE5ld0YuQmFzZVJlZ3MuYmVnaW4oKSwgSkUgPSBOZXdGLkJhc2VSZWdzLmVuZCgpOworICAgICAgICAgICAgICAgSiAhPSBKRTsgKytKKQorICAgICAgICAgICAgaWYgKGNvbnN0IFNDRVZDb25zdGFudCAqQyA9IGR5bl9jYXN0PFNDRVZDb25zdGFudD4oKkopKQorICAgICAgICAgICAgICBpZiAoKEMtPmdldFZhbHVlKCktPmdldFZhbHVlKCkgKyBOZXdGLkFNLkJhc2VPZmZzKS5hYnMoKS5zbHQoCisgICAgICAgICAgICAgICAgICAgYWJzNjQoTmV3Ri5BTS5CYXNlT2ZmcykpICYmCisgICAgICAgICAgICAgICAgICAoQy0+Z2V0VmFsdWUoKS0+Z2V0VmFsdWUoKSArCisgICAgICAgICAgICAgICAgICAgTmV3Ri5BTS5CYXNlT2ZmcykuY291bnRUcmFpbGluZ1plcm9zKCkgPj0KKyAgICAgICAgICAgICAgICAgICBDb3VudFRyYWlsaW5nWmVyb3NfNjQoTmV3Ri5BTS5CYXNlT2ZmcykpCisgICAgICAgICAgICAgICAgZ290byBza2lwX2Zvcm11bGE7CisKKyAgICAgICAgICAvLyBPaywgbG9va3MgZ29vZC4KKyAgICAgICAgICAodm9pZClJbnNlcnRGb3JtdWxhKExVLCBMVUlkeCwgTmV3Rik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNraXBfZm9ybXVsYTo7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8vIEdlbmVyYXRlQWxsUmV1c2VGb3JtdWxhZSAtIEdlbmVyYXRlIGZvcm11bGFlIGZvciBlYWNoIHVzZS4KK3ZvaWQKK0xTUkluc3RhbmNlOjpHZW5lcmF0ZUFsbFJldXNlRm9ybXVsYWUoKSB7CisgIC8vIFRoaXMgaXMgc3BsaXQgaW50byBtdWx0aXBsZSBsb29wcyBzbyB0aGF0IGhhc1JlZ3NVc2VkQnlVc2VzT3RoZXJUaGFuCisgIC8vIHF1ZXJpZXMgYXJlIG1vcmUgcHJlY2lzZS4KKyAgZm9yIChzaXplX3QgTFVJZHggPSAwLCBOdW1Vc2VzID0gVXNlcy5zaXplKCk7IExVSWR4ICE9IE51bVVzZXM7ICsrTFVJZHgpIHsKKyAgICBMU1JVc2UgJkxVID0gVXNlc1tMVUlkeF07CisgICAgZm9yIChzaXplX3QgaSA9IDAsIGYgPSBMVS5Gb3JtdWxhZS5zaXplKCk7IGkgIT0gZjsgKytpKQorICAgICAgR2VuZXJhdGVSZWFzc29jaWF0aW9ucyhMVSwgTFVJZHgsIExVLkZvcm11bGFlW2ldKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZiA9IExVLkZvcm11bGFlLnNpemUoKTsgaSAhPSBmOyArK2kpCisgICAgICBHZW5lcmF0ZUNvbWJpbmF0aW9ucyhMVSwgTFVJZHgsIExVLkZvcm11bGFlW2ldKTsKKyAgfQorICBmb3IgKHNpemVfdCBMVUlkeCA9IDAsIE51bVVzZXMgPSBVc2VzLnNpemUoKTsgTFVJZHggIT0gTnVtVXNlczsgKytMVUlkeCkgeworICAgIExTUlVzZSAmTFUgPSBVc2VzW0xVSWR4XTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZiA9IExVLkZvcm11bGFlLnNpemUoKTsgaSAhPSBmOyArK2kpCisgICAgICBHZW5lcmF0ZVN5bWJvbGljT2Zmc2V0cyhMVSwgTFVJZHgsIExVLkZvcm11bGFlW2ldKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZiA9IExVLkZvcm11bGFlLnNpemUoKTsgaSAhPSBmOyArK2kpCisgICAgICBHZW5lcmF0ZUNvbnN0YW50T2Zmc2V0cyhMVSwgTFVJZHgsIExVLkZvcm11bGFlW2ldKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZiA9IExVLkZvcm11bGFlLnNpemUoKTsgaSAhPSBmOyArK2kpCisgICAgICBHZW5lcmF0ZUlDbXBaZXJvU2NhbGVzKExVLCBMVUlkeCwgTFUuRm9ybXVsYWVbaV0pOworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBmID0gTFUuRm9ybXVsYWUuc2l6ZSgpOyBpICE9IGY7ICsraSkKKyAgICAgIEdlbmVyYXRlU2NhbGVzKExVLCBMVUlkeCwgTFUuRm9ybXVsYWVbaV0pOworICB9CisgIGZvciAoc2l6ZV90IExVSWR4ID0gMCwgTnVtVXNlcyA9IFVzZXMuc2l6ZSgpOyBMVUlkeCAhPSBOdW1Vc2VzOyArK0xVSWR4KSB7CisgICAgTFNSVXNlICZMVSA9IFVzZXNbTFVJZHhdOworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBmID0gTFUuRm9ybXVsYWUuc2l6ZSgpOyBpICE9IGY7ICsraSkKKyAgICAgIEdlbmVyYXRlVHJ1bmNhdGVzKExVLCBMVUlkeCwgTFUuRm9ybXVsYWVbaV0pOworICB9CisKKyAgR2VuZXJhdGVDcm9zc1VzZUNvbnN0YW50T2Zmc2V0cygpOworfQorCisvLy8gSWYgdGhlaXIgYXJlIG11bHRpcGxlIGZvcm11bGFlIHdpdGggdGhlIHNhbWUgc2V0IG9mIHJlZ2lzdGVycyB1c2VkCisvLy8gYnkgb3RoZXIgdXNlcywgcGljayB0aGUgYmVzdCBvbmUgYW5kIGRlbGV0ZSB0aGUgb3RoZXJzLgordm9pZCBMU1JJbnN0YW5jZTo6RmlsdGVyT3V0VW5kZXNpcmFibGVEZWRpY2F0ZWRSZWdpc3RlcnMoKSB7CisjaWZuZGVmIE5ERUJVRworICBib29sIENoYW5nZWRGb3JtdWxhZSA9IGZhbHNlOworI2VuZGlmCisKKyAgLy8gQ29sbGVjdCB0aGUgYmVzdCBmb3JtdWxhIGZvciBlYWNoIHVuaXF1ZSBzZXQgb2Ygc2hhcmVkIHJlZ2lzdGVycy4gVGhpcworICAvLyBpcyByZXNldCBmb3IgZWFjaCB1c2UuCisgIHR5cGVkZWYgRGVuc2VNYXA8U21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiwgc2l6ZV90LCBVbmlxdWlmaWVyRGVuc2VNYXBJbmZvPgorICAgIEJlc3RGb3JtdWxhZVR5OworICBCZXN0Rm9ybXVsYWVUeSBCZXN0Rm9ybXVsYWU7CisKKyAgZm9yIChzaXplX3QgTFVJZHggPSAwLCBOdW1Vc2VzID0gVXNlcy5zaXplKCk7IExVSWR4ICE9IE51bVVzZXM7ICsrTFVJZHgpIHsKKyAgICBMU1JVc2UgJkxVID0gVXNlc1tMVUlkeF07CisgICAgRm9ybXVsYVNvcnRlciBTb3J0ZXIoTCwgTFUsIFNFLCBEVCk7CisgICAgREVCVUcoZGJncygpIDw8ICJGaWx0ZXJpbmcgZm9yIHVzZSAiOyBMVS5wcmludChkYmdzKCkpOyBkYmdzKCkgPDwgJ1xuJyk7CisKKyAgICBib29sIEFueSA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IEZJZHggPSAwLCBOdW1Gb3JtcyA9IExVLkZvcm11bGFlLnNpemUoKTsKKyAgICAgICAgIEZJZHggIT0gTnVtRm9ybXM7ICsrRklkeCkgeworICAgICAgRm9ybXVsYSAmRiA9IExVLkZvcm11bGFlW0ZJZHhdOworCisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDI+IEtleTsKKyAgICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj46OmNvbnN0X2l0ZXJhdG9yIEogPSBGLkJhc2VSZWdzLmJlZ2luKCksCisgICAgICAgICAgIEpFID0gRi5CYXNlUmVncy5lbmQoKTsgSiAhPSBKRTsgKytKKSB7CisgICAgICAgIGNvbnN0IFNDRVYgKlJlZyA9ICpKOworICAgICAgICBpZiAoUmVnVXNlcy5pc1JlZ1VzZWRCeVVzZXNPdGhlclRoYW4oUmVnLCBMVUlkeCkpCisgICAgICAgICAgS2V5LnB1c2hfYmFjayhSZWcpOworICAgICAgfQorICAgICAgaWYgKEYuU2NhbGVkUmVnICYmCisgICAgICAgICAgUmVnVXNlcy5pc1JlZ1VzZWRCeVVzZXNPdGhlclRoYW4oRi5TY2FsZWRSZWcsIExVSWR4KSkKKyAgICAgICAgS2V5LnB1c2hfYmFjayhGLlNjYWxlZFJlZyk7CisgICAgICAvLyBVbnN0YWJsZSBzb3J0IGJ5IGhvc3Qgb3JkZXIgb2ssIGJlY2F1c2UgdGhpcyBpcyBvbmx5IHVzZWQgZm9yCisgICAgICAvLyB1bmlxdWlmeWluZy4KKyAgICAgIHN0ZDo6c29ydChLZXkuYmVnaW4oKSwgS2V5LmVuZCgpKTsKKworICAgICAgc3RkOjpwYWlyPEJlc3RGb3JtdWxhZVR5Ojpjb25zdF9pdGVyYXRvciwgYm9vbD4gUCA9CisgICAgICAgIEJlc3RGb3JtdWxhZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoS2V5LCBGSWR4KSk7CisgICAgICBpZiAoIVAuc2Vjb25kKSB7CisgICAgICAgIEZvcm11bGEgJkJlc3QgPSBMVS5Gb3JtdWxhZVtQLmZpcnN0LT5zZWNvbmRdOworICAgICAgICBpZiAoU29ydGVyLm9wZXJhdG9yKCkoRiwgQmVzdCkpCisgICAgICAgICAgc3RkOjpzd2FwKEYsIEJlc3QpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgRmlsdGVyaW5nIG91dCBmb3JtdWxhICI7IEYucHJpbnQoZGJncygpKTsKKyAgICAgICAgICAgICAgZGJncygpIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaW4gZmF2b3Igb2YgZm9ybXVsYSAiOyBCZXN0LnByaW50KGRiZ3MoKSk7CisgICAgICAgICAgICAgIGRiZ3MoKSA8PCAnXG4nKTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIENoYW5nZWRGb3JtdWxhZSA9IHRydWU7CisjZW5kaWYKKyAgICAgICAgTFUuRGVsZXRlRm9ybXVsYShGKTsKKyAgICAgICAgLS1GSWR4OworICAgICAgICAtLU51bUZvcm1zOworICAgICAgICBBbnkgPSB0cnVlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBmaWx0ZXJlZCBvdXQgc29tZSBmb3JtdWxhZSwgcmVjb21wdXRlIHRoZSBSZWdzIHNldC4KKyAgICBpZiAoQW55KQorICAgICAgTFUuUmVjb21wdXRlUmVncyhMVUlkeCwgUmVnVXNlcyk7CisKKyAgICAvLyBSZXNldCB0aGlzIHRvIHByZXBhcmUgZm9yIHRoZSBuZXh0IHVzZS4KKyAgICBCZXN0Rm9ybXVsYWUuY2xlYXIoKTsKKyAgfQorCisgIERFQlVHKGlmIChDaGFuZ2VkRm9ybXVsYWUpIHsKKyAgICAgICAgICBkYmdzKCkgPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAiQWZ0ZXIgZmlsdGVyaW5nIG91dCB1bmRlc2lyYWJsZSBjYW5kaWRhdGVzOlxuIjsKKyAgICAgICAgICBwcmludF91c2VzKGRiZ3MoKSk7CisgICAgICAgIH0pOworfQorCisvLyBUaGlzIGlzIGEgcm91Z2ggZ3Vlc3MgdGhhdCBzZWVtcyB0byB3b3JrIGZhaXJseSB3ZWxsLgorc3RhdGljIGNvbnN0IHNpemVfdCBDb21wbGV4aXR5TGltaXQgPSBVSU5UMTZfTUFYOworCisvLy8gRXN0aW1hdGVTZWFyY2hTcGFjZUNvbXBsZXhpdHkgLSBFc3RpbWF0ZSB0aGUgd29yc3QtY2FzZSBudW1iZXIgb2YKKy8vLyBzb2x1dGlvbnMgdGhlIHNvbHZlciBtaWdodCBoYXZlIHRvIGNvbnNpZGVyLiBJdCBhbG1vc3QgbmV2ZXIgY29uc2lkZXJzCisvLy8gdGhpcyBtYW55IHNvbHV0aW9ucyBiZWNhdXNlIGl0IHBydW5lIHRoZSBzZWFyY2ggc3BhY2UsIGJ1dCB0aGUgcHJ1bmluZworLy8vIGlzbid0IGFsd2F5cyBzdWZmaWNpZW50Lgorc2l6ZV90IExTUkluc3RhbmNlOjpFc3RpbWF0ZVNlYXJjaFNwYWNlQ29tcGxleGl0eSgpIGNvbnN0IHsKKyAgdWludDMyX3QgUG93ZXIgPSAxOworICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxMU1JVc2U+Ojpjb25zdF9pdGVyYXRvciBJID0gVXNlcy5iZWdpbigpLAorICAgICAgIEUgPSBVc2VzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIHNpemVfdCBGU2l6ZSA9IEktPkZvcm11bGFlLnNpemUoKTsKKyAgICBpZiAoRlNpemUgPj0gQ29tcGxleGl0eUxpbWl0KSB7CisgICAgICBQb3dlciA9IENvbXBsZXhpdHlMaW1pdDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBQb3dlciAqPSBGU2l6ZTsKKyAgICBpZiAoUG93ZXIgPj0gQ29tcGxleGl0eUxpbWl0KQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFBvd2VyOworfQorCisvLy8gTmFycm93U2VhcmNoU3BhY2VVc2luZ0hldXJpc3RpY3MgLSBJZiB0aGVyZSBhcmUgYW4gZXh0cmFvcmRpbmFyeSBudW1iZXIgb2YKKy8vLyBmb3JtdWxhZSB0byBjaG9vc2UgZnJvbSwgdXNlIHNvbWUgcm91Z2ggaGV1cmlzdGljcyB0byBwcnVuZSBkb3duIHRoZSBudW1iZXIKKy8vLyBvZiBmb3JtdWxhZS4gVGhpcyBrZWVwcyB0aGUgbWFpbiBzb2x2ZXIgZnJvbSB0YWtpbmcgYW4gZXh0cmFvcmRpbmFyeSBhbW91bnQKKy8vLyBvZiB0aW1lIGluIHNvbWUgd29yc3QtY2FzZSBzY2VuYXJpb3MuCit2b2lkIExTUkluc3RhbmNlOjpOYXJyb3dTZWFyY2hTcGFjZVVzaW5nSGV1cmlzdGljcygpIHsKKyAgaWYgKEVzdGltYXRlU2VhcmNoU3BhY2VDb21wbGV4aXR5KCkgPj0gQ29tcGxleGl0eUxpbWl0KSB7CisgICAgREVCVUcoZGJncygpIDw8ICJUaGUgc2VhcmNoIHNwYWNlIGlzIHRvbyBjb21wbGV4LlxuIik7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIk5hcnJvd2luZyB0aGUgc2VhcmNoIHNwYWNlIGJ5IGVsaW1pbmF0aW5nIGZvcm11bGFlICIKKyAgICAgICAgICAgICAgICAgICAgIndoaWNoIHVzZSBhIHN1cGVyc2V0IG9mIHJlZ2lzdGVycyB1c2VkIGJ5IG90aGVyICIKKyAgICAgICAgICAgICAgICAgICAgImZvcm11bGFlLlxuIik7CisKKyAgICBmb3IgKHNpemVfdCBMVUlkeCA9IDAsIE51bVVzZXMgPSBVc2VzLnNpemUoKTsgTFVJZHggIT0gTnVtVXNlczsgKytMVUlkeCkgeworICAgICAgTFNSVXNlICZMVSA9IFVzZXNbTFVJZHhdOworICAgICAgYm9vbCBBbnkgPSBmYWxzZTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTFUuRm9ybXVsYWUuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBGb3JtdWxhICZGID0gTFUuRm9ybXVsYWVbaV07CisgICAgICAgIC8vIExvb2sgZm9yIGEgZm9ybXVsYSB3aXRoIGEgY29uc3RhbnQgb3IgR1YgaW4gYSByZWdpc3Rlci4gSWYgdGhlIHVzZQorICAgICAgICAvLyBhbHNvIGhhcyBhIGZvcm11bGEgd2l0aCB0aGF0IHNhbWUgdmFsdWUgaW4gYW4gaW1tZWRpYXRlIGZpZWxkLAorICAgICAgICAvLyBkZWxldGUgdGhlIG9uZSB0aGF0IHVzZXMgYSByZWdpc3Rlci4KKyAgICAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICBJID0gRi5CYXNlUmVncy5iZWdpbigpLCBFID0gRi5CYXNlUmVncy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgICBpZiAoY29uc3QgU0NFVkNvbnN0YW50ICpDID0gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PigqSSkpIHsKKyAgICAgICAgICAgIEZvcm11bGEgTmV3RiA9IEY7CisgICAgICAgICAgICBOZXdGLkFNLkJhc2VPZmZzICs9IEMtPmdldFZhbHVlKCktPmdldFNFeHRWYWx1ZSgpOworICAgICAgICAgICAgTmV3Ri5CYXNlUmVncy5lcmFzZShOZXdGLkJhc2VSZWdzLmJlZ2luKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSSAtIEYuQmFzZVJlZ3MuYmVnaW4oKSkpOworICAgICAgICAgICAgaWYgKExVLkhhc0Zvcm11bGFXaXRoU2FtZVJlZ3MoTmV3RikpIHsKKyAgICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIERlbGV0aW5nICI7IEYucHJpbnQoZGJncygpKTsgZGJncygpIDw8ICdcbicpOworICAgICAgICAgICAgICBMVS5EZWxldGVGb3JtdWxhKEYpOworICAgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICAgIC0tZTsKKyAgICAgICAgICAgICAgQW55ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChjb25zdCBTQ0VWVW5rbm93biAqVSA9IGR5bl9jYXN0PFNDRVZVbmtub3duPigqSSkpIHsKKyAgICAgICAgICAgIGlmIChHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oVS0+Z2V0VmFsdWUoKSkpCisgICAgICAgICAgICAgIGlmICghRi5BTS5CYXNlR1YpIHsKKyAgICAgICAgICAgICAgICBGb3JtdWxhIE5ld0YgPSBGOworICAgICAgICAgICAgICAgIE5ld0YuQU0uQmFzZUdWID0gR1Y7CisgICAgICAgICAgICAgICAgTmV3Ri5CYXNlUmVncy5lcmFzZShOZXdGLkJhc2VSZWdzLmJlZ2luKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEkgLSBGLkJhc2VSZWdzLmJlZ2luKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAoTFUuSGFzRm9ybXVsYVdpdGhTYW1lUmVncyhOZXdGKSkgeworICAgICAgICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIERlbGV0aW5nICI7IEYucHJpbnQoZGJncygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCAnXG4nKTsKKyAgICAgICAgICAgICAgICAgIExVLkRlbGV0ZUZvcm11bGEoRik7CisgICAgICAgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICAgICAgICAtLWU7CisgICAgICAgICAgICAgICAgICBBbnkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoQW55KQorICAgICAgICBMVS5SZWNvbXB1dGVSZWdzKExVSWR4LCBSZWdVc2VzKTsKKyAgICB9CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIkFmdGVyIHByZS1zZWxlY3Rpb246XG4iOworICAgICAgICAgIHByaW50X3VzZXMoZGJncygpKSk7CisgIH0KKworICBpZiAoRXN0aW1hdGVTZWFyY2hTcGFjZUNvbXBsZXhpdHkoKSA+PSBDb21wbGV4aXR5TGltaXQpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlRoZSBzZWFyY2ggc3BhY2UgaXMgdG9vIGNvbXBsZXguXG4iKTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiTmFycm93aW5nIHRoZSBzZWFyY2ggc3BhY2UgYnkgYXNzdW1pbmcgdGhhdCB1c2VzICIKKyAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRlZCBieSBhIGNvbnN0YW50IG9mZnNldCB3aWxsIHVzZSB0aGUgc2FtZSAiCisgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcnMuXG4iKTsKKworICAgIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIHVucm9sbGVkIGxvb3BzLgorCisgICAgZm9yIChzaXplX3QgTFVJZHggPSAwLCBOdW1Vc2VzID0gVXNlcy5zaXplKCk7IExVSWR4ICE9IE51bVVzZXM7ICsrTFVJZHgpIHsKKyAgICAgIExTUlVzZSAmTFUgPSBVc2VzW0xVSWR4XTsKKyAgICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPEZvcm11bGE+Ojpjb25zdF9pdGVyYXRvciBJID0gTFUuRm9ybXVsYWUuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IExVLkZvcm11bGFlLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBjb25zdCBGb3JtdWxhICZGID0gKkk7CisgICAgICAgIGlmIChGLkFNLkJhc2VPZmZzICE9IDAgJiYgRi5BTS5TY2FsZSA9PSAwKSB7CisgICAgICAgICAgaWYgKExTUlVzZSAqTFVUaGF0SGFzID0gRmluZFVzZVdpdGhTaW1pbGFyRm9ybXVsYShGLCBMVSkpIHsKKyAgICAgICAgICAgIGlmIChyZWNvbmNpbGVOZXdPZmZzZXQoKkxVVGhhdEhhcywgRi5BTS5CYXNlT2ZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypIYXNCYXNlUmVnPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExVLktpbmQsIExVLkFjY2Vzc1R5KSkgeworICAgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgRGVsZXRpbmcgdXNlICI7IExVLnByaW50KGRiZ3MoKSk7CisgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCAnXG4nKTsKKworICAgICAgICAgICAgICBMVVRoYXRIYXMtPkFsbEZpeHVwc091dHNpZGVMb29wICY9IExVLkFsbEZpeHVwc091dHNpZGVMb29wOworCisgICAgICAgICAgICAgIC8vIERlbGV0ZSBmb3JtdWxhZSBmcm9tIHRoZSBuZXcgdXNlIHdoaWNoIGFyZSBubyBsb25nZXIgbGVnYWwuCisgICAgICAgICAgICAgIGJvb2wgQW55ID0gZmFsc2U7CisgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTFVUaGF0SGFzLT5Gb3JtdWxhZS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgICAgICAgRm9ybXVsYSAmRiA9IExVVGhhdEhhcy0+Rm9ybXVsYWVbaV07CisgICAgICAgICAgICAgICAgaWYgKCFpc0xlZ2FsVXNlKEYuQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExVVGhhdEhhcy0+TWluT2Zmc2V0LCBMVVRoYXRIYXMtPk1heE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFVUaGF0SGFzLT5LaW5kLCBMVVRoYXRIYXMtPkFjY2Vzc1R5LCBUTEkpKSB7CisgICAgICAgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgRGVsZXRpbmcgIjsgRi5wcmludChkYmdzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8ICdcbicpOworICAgICAgICAgICAgICAgICAgTFVUaGF0SGFzLT5EZWxldGVGb3JtdWxhKEYpOworICAgICAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgICAgICAgLS1lOworICAgICAgICAgICAgICAgICAgQW55ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKEFueSkKKyAgICAgICAgICAgICAgICBMVVRoYXRIYXMtPlJlY29tcHV0ZVJlZ3MoTFVUaGF0SGFzIC0gJlVzZXMuZnJvbnQoKSwgUmVnVXNlcyk7CisKKyAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZWxvY3MgdG8gcmVmZXJlbmNlIHRoZSBuZXcgdXNlLgorICAgICAgICAgICAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxMU1JGaXh1cD46Oml0ZXJhdG9yIEkgPSBGaXh1cHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICBFID0gRml4dXBzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICAgICAgICAgIExTUkZpeHVwICZGaXh1cCA9ICpJOworICAgICAgICAgICAgICAgIGlmIChGaXh1cC5MVUlkeCA9PSBMVUlkeCkgeworICAgICAgICAgICAgICAgICAgRml4dXAuTFVJZHggPSBMVVRoYXRIYXMgLSAmVXNlcy5mcm9udCgpOworICAgICAgICAgICAgICAgICAgRml4dXAuT2Zmc2V0ICs9IEYuQU0uQmFzZU9mZnM7CisgICAgICAgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIk5ldyBmaXh1cCBoYXMgb2Zmc2V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBGaXh1cC5PZmZzZXQgPDwgJ1xuJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChGaXh1cC5MVUlkeCA9PSBOdW1Vc2VzLTEpCisgICAgICAgICAgICAgICAgICBGaXh1cC5MVUlkeCA9IExVSWR4OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBvbGQgdXNlLgorICAgICAgICAgICAgICBEZWxldGVVc2UoTFUpOworICAgICAgICAgICAgICAtLUxVSWR4OworICAgICAgICAgICAgICAtLU51bVVzZXM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIERFQlVHKGRiZ3MoKSA8PCAiQWZ0ZXIgcHJlLXNlbGVjdGlvbjpcbiI7CisgICAgICAgICAgcHJpbnRfdXNlcyhkYmdzKCkpKTsKKyAgfQorCisgIC8vIFdpdGggYWxsIG90aGVyIG9wdGlvbnMgZXhoYXVzdGVkLCBsb29wIHVudGlsIHRoZSBzeXN0ZW0gaXMgc2ltcGxlCisgIC8vIGVub3VnaCB0byBoYW5kbGUuCisgIFNtYWxsUHRyU2V0PGNvbnN0IFNDRVYgKiwgND4gVGFrZW47CisgIHdoaWxlIChFc3RpbWF0ZVNlYXJjaFNwYWNlQ29tcGxleGl0eSgpID49IENvbXBsZXhpdHlMaW1pdCkgeworICAgIC8vIE9rLCB3ZSBoYXZlIHRvbyBtYW55IG9mIGZvcm11bGFlIG9uIG91ciBoYW5kcyB0byBjb252ZW5pZW50bHkgaGFuZGxlLgorICAgIC8vIFVzZSBhIHJvdWdoIGhldXJpc3RpYyB0byB0aGluIG91dCB0aGUgbGlzdC4KKyAgICBERUJVRyhkYmdzKCkgPDwgIlRoZSBzZWFyY2ggc3BhY2UgaXMgdG9vIGNvbXBsZXguXG4iKTsKKworICAgIC8vIFBpY2sgdGhlIHJlZ2lzdGVyIHdoaWNoIGlzIHVzZWQgYnkgdGhlIG1vc3QgTFNSVXNlcywgd2hpY2ggaXMgbGlrZWx5CisgICAgLy8gdG8gYmUgYSBnb29kIHJldXNlIHJlZ2lzdGVyIGNhbmRpZGF0ZS4KKyAgICBjb25zdCBTQ0VWICpCZXN0ID0gMDsKKyAgICB1bnNpZ25lZCBCZXN0TnVtID0gMDsKKyAgICBmb3IgKFJlZ1VzZVRyYWNrZXI6OmNvbnN0X2l0ZXJhdG9yIEkgPSBSZWdVc2VzLmJlZ2luKCksIEUgPSBSZWdVc2VzLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGNvbnN0IFNDRVYgKlJlZyA9ICpJOworICAgICAgaWYgKFRha2VuLmNvdW50KFJlZykpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKCFCZXN0KQorICAgICAgICBCZXN0ID0gUmVnOworICAgICAgZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIENvdW50ID0gUmVnVXNlcy5nZXRVc2VkQnlJbmRpY2VzKFJlZykuY291bnQoKTsKKyAgICAgICAgaWYgKENvdW50ID4gQmVzdE51bSkgeworICAgICAgICAgIEJlc3QgPSBSZWc7CisgICAgICAgICAgQmVzdE51bSA9IENvdW50OworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgREVCVUcoZGJncygpIDw8ICJOYXJyb3dpbmcgdGhlIHNlYXJjaCBzcGFjZSBieSBhc3N1bWluZyAiIDw8ICpCZXN0CisgICAgICAgICAgICAgICAgIDw8ICIgd2lsbCB5aWVsZCBwcm9maXRhYmxlIHJldXNlLlxuIik7CisgICAgVGFrZW4uaW5zZXJ0KEJlc3QpOworCisgICAgLy8gSW4gYW55IHVzZSB3aXRoIGZvcm11bGFlIHdoaWNoIHJlZmVyZW5jZXMgdGhpcyByZWdpc3RlciwgZGVsZXRlIGZvcm11bGFlCisgICAgLy8gd2hpY2ggZG9uJ3QgcmVmZXJlbmNlIGl0LgorICAgIGZvciAoc2l6ZV90IExVSWR4ID0gMCwgTnVtVXNlcyA9IFVzZXMuc2l6ZSgpOyBMVUlkeCAhPSBOdW1Vc2VzOyArK0xVSWR4KSB7CisgICAgICBMU1JVc2UgJkxVID0gVXNlc1tMVUlkeF07CisgICAgICBpZiAoIUxVLlJlZ3MuY291bnQoQmVzdCkpIGNvbnRpbnVlOworCisgICAgICBib29sIEFueSA9IGZhbHNlOworICAgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBMVS5Gb3JtdWxhZS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIEZvcm11bGEgJkYgPSBMVS5Gb3JtdWxhZVtpXTsKKyAgICAgICAgaWYgKCFGLnJlZmVyZW5jZXNSZWcoQmVzdCkpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgRGVsZXRpbmcgIjsgRi5wcmludChkYmdzKCkpOyBkYmdzKCkgPDwgJ1xuJyk7CisgICAgICAgICAgTFUuRGVsZXRlRm9ybXVsYShGKTsKKyAgICAgICAgICAtLWU7CisgICAgICAgICAgLS1pOworICAgICAgICAgIEFueSA9IHRydWU7CisgICAgICAgICAgYXNzZXJ0KGUgIT0gMCAmJiAiVXNlIGhhcyBubyBmb3JtdWxhZSBsZWZ0ISBJcyBSZWdzIGluY29uc2lzdGVudD8iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoQW55KQorICAgICAgICBMVS5SZWNvbXB1dGVSZWdzKExVSWR4LCBSZWdVc2VzKTsKKyAgICB9CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIkFmdGVyIHByZS1zZWxlY3Rpb246XG4iOworICAgICAgICAgIHByaW50X3VzZXMoZGJncygpKSk7CisgIH0KK30KKworLy8vIFNvbHZlUmVjdXJzZSAtIFRoaXMgaXMgdGhlIHJlY3Vyc2l2ZSBzb2x2ZXIuCit2b2lkIExTUkluc3RhbmNlOjpTb2x2ZVJlY3Vyc2UoU21hbGxWZWN0b3JJbXBsPGNvbnN0IEZvcm11bGEgKj4gJlNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3QgJlNvbHV0aW9uQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgRm9ybXVsYSAqPiAmV29ya3NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3QgJkN1ckNvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxQdHJTZXQ8Y29uc3QgU0NFViAqLCAxNj4gJkN1clJlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VTZXQ8Y29uc3QgU0NFViAqPiAmVmlzaXRlZFJlZ3MpIGNvbnN0IHsKKyAgLy8gU29tZSBpZGVhczoKKyAgLy8gIC0gcHJ1bmUgbW9yZToKKyAgLy8gICAgLSB1c2UgbW9yZSBhZ2dyZXNzaXZlIGZpbHRlcmluZworICAvLyAgICAtIHNvcnQgdGhlIGZvcm11bGEgc28gdGhhdCB0aGUgbW9zdCBwcm9maXRhYmxlIHNvbHV0aW9ucyBhcmUgZm91bmQgZmlyc3QKKyAgLy8gICAgLSBzb3J0IHRoZSB1c2VzIHRvbworICAvLyAgLSBzZWFyY2ggZmFzdGVyOgorICAvLyAgICAtIGRvbid0IGNvbXB1dGUgYSBjb3N0LCBhbmQgdGhlbiBjb21wYXJlLiBjb21wYXJlIHdoaWxlIGNvbXB1dGluZyBhIGNvc3QKKyAgLy8gICAgICBhbmQgYmFpbCBlYXJseS4KKyAgLy8gICAgLSB0cmFjayByZWdpc3RlciBzZXRzIHdpdGggU21hbGxCaXRWZWN0b3IKKworICBjb25zdCBMU1JVc2UgJkxVID0gVXNlc1tXb3Jrc3BhY2Uuc2l6ZSgpXTsKKworICAvLyBJZiB0aGlzIHVzZSByZWZlcmVuY2VzIGFueSByZWdpc3RlciB0aGF0J3MgYWxyZWFkeSBhIHBhcnQgb2YgdGhlCisgIC8vIGluLXByb2dyZXNzIHNvbHV0aW9uLCBjb25zaWRlciBpdCBhIHJlcXVpcmVtZW50IHRoYXQgYSBmb3JtdWxhIG11c3QKKyAgLy8gcmVmZXJlbmNlIHRoYXQgcmVnaXN0ZXIgaW4gb3JkZXIgdG8gYmUgY29uc2lkZXJlZC4gVGhpcyBwcnVuZXMgb3V0CisgIC8vIHVucHJvZml0YWJsZSBzZWFyY2hpbmcuCisgIFNtYWxsU2V0VmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gUmVxUmVnczsKKyAgZm9yIChTbWFsbFB0clNldDxjb25zdCBTQ0VWICosIDE2Pjo6Y29uc3RfaXRlcmF0b3IgSSA9IEN1clJlZ3MuYmVnaW4oKSwKKyAgICAgICBFID0gQ3VyUmVncy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKExVLlJlZ3MuY291bnQoKkkpKQorICAgICAgUmVxUmVncy5pbnNlcnQoKkkpOworCisgIGJvb2wgQW55U2F0aXNmaWVkUmVxUmVncyA9IGZhbHNlOworICBTbWFsbFB0clNldDxjb25zdCBTQ0VWICosIDE2PiBOZXdSZWdzOworICBDb3N0IE5ld0Nvc3Q7CityZXRyeToKKyAgZm9yIChTbWFsbFZlY3RvckltcGw8Rm9ybXVsYT46OmNvbnN0X2l0ZXJhdG9yIEkgPSBMVS5Gb3JtdWxhZS5iZWdpbigpLAorICAgICAgIEUgPSBMVS5Gb3JtdWxhZS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBGb3JtdWxhICZGID0gKkk7CisKKyAgICAvLyBJZ25vcmUgZm9ybXVsYWUgd2hpY2ggZG8gbm90IHVzZSBhbnkgb2YgdGhlIHJlcXVpcmVkIHJlZ2lzdGVycy4KKyAgICBmb3IgKFNtYWxsU2V0VmVjdG9yPGNvbnN0IFNDRVYgKiwgND46OmNvbnN0X2l0ZXJhdG9yIEogPSBSZXFSZWdzLmJlZ2luKCksCisgICAgICAgICBKRSA9IFJlcVJlZ3MuZW5kKCk7IEogIT0gSkU7ICsrSikgeworICAgICAgY29uc3QgU0NFViAqUmVnID0gKko7CisgICAgICBpZiAoKCFGLlNjYWxlZFJlZyB8fCBGLlNjYWxlZFJlZyAhPSBSZWcpICYmCisgICAgICAgICAgc3RkOjpmaW5kKEYuQmFzZVJlZ3MuYmVnaW4oKSwgRi5CYXNlUmVncy5lbmQoKSwgUmVnKSA9PQorICAgICAgICAgIEYuQmFzZVJlZ3MuZW5kKCkpCisgICAgICAgIGdvdG8gc2tpcDsKKyAgICB9CisgICAgQW55U2F0aXNmaWVkUmVxUmVncyA9IHRydWU7CisKKyAgICAvLyBFdmFsdWF0ZSB0aGUgY29zdCBvZiB0aGUgY3VycmVudCBmb3JtdWxhLiBJZiBpdCdzIGFscmVhZHkgd29yc2UgdGhhbgorICAgIC8vIHRoZSBjdXJyZW50IGJlc3QsIHBydW5lIHRoZSBzZWFyY2ggYXQgdGhhdCBwb2ludC4KKyAgICBOZXdDb3N0ID0gQ3VyQ29zdDsKKyAgICBOZXdSZWdzID0gQ3VyUmVnczsKKyAgICBOZXdDb3N0LlJhdGVGb3JtdWxhKEYsIE5ld1JlZ3MsIFZpc2l0ZWRSZWdzLCBMLCBMVS5PZmZzZXRzLCBTRSwgRFQpOworICAgIGlmIChOZXdDb3N0IDwgU29sdXRpb25Db3N0KSB7CisgICAgICBXb3Jrc3BhY2UucHVzaF9iYWNrKCZGKTsKKyAgICAgIGlmIChXb3Jrc3BhY2Uuc2l6ZSgpICE9IFVzZXMuc2l6ZSgpKSB7CisgICAgICAgIFNvbHZlUmVjdXJzZShTb2x1dGlvbiwgU29sdXRpb25Db3N0LCBXb3Jrc3BhY2UsIE5ld0Nvc3QsCisgICAgICAgICAgICAgICAgICAgICBOZXdSZWdzLCBWaXNpdGVkUmVncyk7CisgICAgICAgIGlmIChGLmdldE51bVJlZ3MoKSA9PSAxICYmIFdvcmtzcGFjZS5zaXplKCkgPT0gMSkKKyAgICAgICAgICBWaXNpdGVkUmVncy5pbnNlcnQoRi5TY2FsZWRSZWcgPyBGLlNjYWxlZFJlZyA6IEYuQmFzZVJlZ3NbMF0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJOZXcgYmVzdCBhdCAiOyBOZXdDb3N0LnByaW50KGRiZ3MoKSk7CisgICAgICAgICAgICAgIGRiZ3MoKSA8PCAiLiBSZWdzOiI7CisgICAgICAgICAgICAgIGZvciAoU21hbGxQdHJTZXQ8Y29uc3QgU0NFViAqLCAxNj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgSSA9IE5ld1JlZ3MuYmVnaW4oKSwgRSA9IE5ld1JlZ3MuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCAnICcgPDwgKipJOworICAgICAgICAgICAgICBkYmdzKCkgPDwgJ1xuJyk7CisKKyAgICAgICAgU29sdXRpb25Db3N0ID0gTmV3Q29zdDsKKyAgICAgICAgU29sdXRpb24gPSBXb3Jrc3BhY2U7CisgICAgICB9CisgICAgICBXb3Jrc3BhY2UucG9wX2JhY2soKTsKKyAgICB9CisgIHNraXA6OworICB9CisKKyAgLy8gSWYgbm9uZSBvZiB0aGUgZm9ybXVsYWUgaGFkIGFsbCBvZiB0aGUgcmVxdWlyZWQgcmVnaXN0ZXJzLCByZWxheCB0aGUKKyAgLy8gY29uc3RyYWludCBzbyB0aGF0IHdlIGRvbid0IGV4Y2x1ZGUgYWxsIGZvcm11bGFlLgorICBpZiAoIUFueVNhdGlzZmllZFJlcVJlZ3MpIHsKKyAgICBhc3NlcnQoIVJlcVJlZ3MuZW1wdHkoKSAmJiAiU29sdmVyIGZhaWxlZCBldmVuIHdpdGhvdXQgcmVxdWlyZWQgcmVnaXN0ZXJzIik7CisgICAgUmVxUmVncy5jbGVhcigpOworICAgIGdvdG8gcmV0cnk7CisgIH0KK30KKworLy8vIFNvbHZlIC0gQ2hvb3NlIG9uZSBmb3JtdWxhIGZyb20gZWFjaCB1c2UuIFJldHVybiB0aGUgcmVzdWx0cyBpbiB0aGUgZ2l2ZW4KKy8vLyBTb2x1dGlvbiB2ZWN0b3IuCit2b2lkIExTUkluc3RhbmNlOjpTb2x2ZShTbWFsbFZlY3RvckltcGw8Y29uc3QgRm9ybXVsYSAqPiAmU29sdXRpb24pIGNvbnN0IHsKKyAgU21hbGxWZWN0b3I8Y29uc3QgRm9ybXVsYSAqLCA4PiBXb3Jrc3BhY2U7CisgIENvc3QgU29sdXRpb25Db3N0OworICBTb2x1dGlvbkNvc3QuTG9vc2UoKTsKKyAgQ29zdCBDdXJDb3N0OworICBTbWFsbFB0clNldDxjb25zdCBTQ0VWICosIDE2PiBDdXJSZWdzOworICBEZW5zZVNldDxjb25zdCBTQ0VWICo+IFZpc2l0ZWRSZWdzOworICBXb3Jrc3BhY2UucmVzZXJ2ZShVc2VzLnNpemUoKSk7CisKKyAgLy8gU29sdmVSZWN1cnNlIGRvZXMgYWxsIHRoZSB3b3JrLgorICBTb2x2ZVJlY3Vyc2UoU29sdXRpb24sIFNvbHV0aW9uQ29zdCwgV29ya3NwYWNlLCBDdXJDb3N0LAorICAgICAgICAgICAgICAgQ3VyUmVncywgVmlzaXRlZFJlZ3MpOworCisgIC8vIE9rLCB3ZSd2ZSBub3cgbWFkZSBhbGwgb3VyIGRlY2lzaW9ucy4KKyAgREVCVUcoZGJncygpIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgICJUaGUgY2hvc2VuIHNvbHV0aW9uIHJlcXVpcmVzICI7IFNvbHV0aW9uQ29zdC5wcmludChkYmdzKCkpOworICAgICAgICBkYmdzKCkgPDwgIjpcbiI7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gVXNlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgZGJncygpIDw8ICIgICI7CisgICAgICAgICAgVXNlc1tpXS5wcmludChkYmdzKCkpOworICAgICAgICAgIGRiZ3MoKSA8PCAiXG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgIjsKKyAgICAgICAgICBTb2x1dGlvbltpXS0+cHJpbnQoZGJncygpKTsKKyAgICAgICAgICBkYmdzKCkgPDwgJ1xuJzsKKyAgICAgICAgfSk7CisKKyAgYXNzZXJ0KFNvbHV0aW9uLnNpemUoKSA9PSBVc2VzLnNpemUoKSAmJiAiTWFsZm9ybWVkIHNvbHV0aW9uISIpOworfQorCisvLy8gSG9pc3RJbnNlcnRQb3NpdGlvbiAtIEhlbHBlciBmb3IgQWRqdXN0SW5zZXJ0UG9zaXRpb25Gb3JFeHBhbmQuIENsaW1iIHVwCisvLy8gdGhlIGRvbWluYXRvciB0cmVlIGZhciBhcyB3ZSBjYW4gZ28gd2hpbGUgc3RpbGwgYmVpbmcgZG9taW5hdGVkIGJ5IHRoZQorLy8vIGlucHV0IHBvc2l0aW9ucy4gVGhpcyBoZWxwcyBjYW5vbmljYWxpemUgdGhlIGluc2VydCBwb3NpdGlvbiwgd2hpY2gKKy8vLyBlbmNvdXJhZ2VzIHNoYXJpbmcuCitCYXNpY0Jsb2NrOjppdGVyYXRvcgorTFNSSW5zdGFuY2U6OkhvaXN0SW5zZXJ0UG9zaXRpb24oQmFzaWNCbG9jazo6aXRlcmF0b3IgSVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJklucHV0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CisgIGZvciAoOzspIHsKKyAgICBjb25zdCBMb29wICpJUExvb3AgPSBMSS5nZXRMb29wRm9yKElQLT5nZXRQYXJlbnQoKSk7CisgICAgdW5zaWduZWQgSVBMb29wRGVwdGggPSBJUExvb3AgPyBJUExvb3AtPmdldExvb3BEZXB0aCgpIDogMDsKKworICAgIEJhc2ljQmxvY2sgKklEb207CisgICAgZm9yIChEb21UcmVlTm9kZSAqUnVuZyA9IERULmdldE5vZGUoSVAtPmdldFBhcmVudCgpKTsgOyApIHsKKyAgICAgIGlmICghUnVuZykgcmV0dXJuIElQOworICAgICAgUnVuZyA9IFJ1bmctPmdldElEb20oKTsKKyAgICAgIGlmICghUnVuZykgcmV0dXJuIElQOworICAgICAgSURvbSA9IFJ1bmctPmdldEJsb2NrKCk7CisKKyAgICAgIC8vIERvbid0IGNsaW1iIGludG8gYSBsb29wIHRob3VnaC4KKyAgICAgIGNvbnN0IExvb3AgKklEb21Mb29wID0gTEkuZ2V0TG9vcEZvcihJRG9tKTsKKyAgICAgIHVuc2lnbmVkIElEb21EZXB0aCA9IElEb21Mb29wID8gSURvbUxvb3AtPmdldExvb3BEZXB0aCgpIDogMDsKKyAgICAgIGlmIChJRG9tRGVwdGggPD0gSVBMb29wRGVwdGggJiYKKyAgICAgICAgICAoSURvbURlcHRoICE9IElQTG9vcERlcHRoIHx8IElEb21Mb29wID09IElQTG9vcCkpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJvb2wgQWxsRG9taW5hdGUgPSB0cnVlOworICAgIEluc3RydWN0aW9uICpCZXR0ZXJQb3MgPSAwOworICAgIEluc3RydWN0aW9uICpUZW50YXRpdmUgPSBJRG9tLT5nZXRUZXJtaW5hdG9yKCk7CisgICAgZm9yIChTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBJbnB1dHMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBJbnB1dHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBJbnN0cnVjdGlvbiAqSW5zdCA9ICpJOworICAgICAgaWYgKEluc3QgPT0gVGVudGF0aXZlIHx8ICFEVC5kb21pbmF0ZXMoSW5zdCwgVGVudGF0aXZlKSkgeworICAgICAgICBBbGxEb21pbmF0ZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIEF0dGVtcHQgdG8gZmluZCBhbiBpbnNlcnQgcG9zaXRpb24gaW4gdGhlIG1pZGRsZSBvZiB0aGUgYmxvY2ssCisgICAgICAvLyBpbnN0ZWFkIG9mIGF0IHRoZSBlbmQsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgZm9yIG90aGVyIGV4cGFuc2lvbnMuCisgICAgICBpZiAoSURvbSA9PSBJbnN0LT5nZXRQYXJlbnQoKSAmJgorICAgICAgICAgICghQmV0dGVyUG9zIHx8IERULmRvbWluYXRlcyhCZXR0ZXJQb3MsIEluc3QpKSkKKyAgICAgICAgQmV0dGVyUG9zID0gbGx2bTo6bmV4dChCYXNpY0Jsb2NrOjppdGVyYXRvcihJbnN0KSk7CisgICAgfQorICAgIGlmICghQWxsRG9taW5hdGUpCisgICAgICBicmVhazsKKyAgICBpZiAoQmV0dGVyUG9zKQorICAgICAgSVAgPSBCZXR0ZXJQb3M7CisgICAgZWxzZQorICAgICAgSVAgPSBUZW50YXRpdmU7CisgIH0KKworICByZXR1cm4gSVA7Cit9CisKKy8vLyBBZGp1c3RJbnNlcnRQb3NpdGlvbkZvckV4cGFuZCAtIERldGVybWluZSBhbiBpbnB1dCBwb3NpdGlvbiB3aGljaCB3aWxsIGJlCisvLy8gZG9taW5hdGVkIGJ5IHRoZSBvcGVyYW5kcyBhbmQgd2hpY2ggd2lsbCBkb21pbmF0ZSB0aGUgcmVzdWx0LgorQmFzaWNCbG9jazo6aXRlcmF0b3IKK0xTUkluc3RhbmNlOjpBZGp1c3RJbnNlcnRQb3NpdGlvbkZvckV4cGFuZChCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMU1JGaXh1cCAmTEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFNSVXNlICZMVSkgY29uc3QgeworICAvLyBDb2xsZWN0IHNvbWUgaW5zdHJ1Y3Rpb25zIHdoaWNoIG11c3QgYmUgZG9taW5hdGVkIGJ5IHRoZQorICAvLyBleHBhbmRpbmcgcmVwbGFjZW1lbnQuIFRoZXNlIG11c3QgYmUgZG9taW5hdGVkIGJ5IGFueSBvcGVyYW5kcyB0aGF0CisgIC8vIHdpbGwgYmUgcmVxdWlyZWQgaW4gdGhlIGV4cGFuc2lvbi4KKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24gKiwgND4gSW5wdXRzOworICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oTEYuT3BlcmFuZFZhbFRvUmVwbGFjZSkpCisgICAgSW5wdXRzLnB1c2hfYmFjayhJKTsKKyAgaWYgKExVLktpbmQgPT0gTFNSVXNlOjpJQ21wWmVybykKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPQorICAgICAgICAgIGR5bl9jYXN0PEluc3RydWN0aW9uPihjYXN0PElDbXBJbnN0PihMRi5Vc2VySW5zdCktPmdldE9wZXJhbmQoMSkpKQorICAgICAgSW5wdXRzLnB1c2hfYmFjayhJKTsKKyAgaWYgKExGLlBvc3RJbmNMb29wcy5jb3VudChMKSkgeworICAgIGlmIChMRi5pc1VzZUZ1bGx5T3V0c2lkZUxvb3AoTCkpCisgICAgICBJbnB1dHMucHVzaF9iYWNrKEwtPmdldExvb3BMYXRjaCgpLT5nZXRUZXJtaW5hdG9yKCkpOworICAgIGVsc2UKKyAgICAgIElucHV0cy5wdXNoX2JhY2soSVZJbmNJbnNlcnRQb3MpOworICB9CisgIC8vIFRoZSBleHBhbnNpb24gbXVzdCBhbHNvIGJlIGRvbWluYXRlZCBieSB0aGUgaW5jcmVtZW50IHBvc2l0aW9ucyBvZiBhbnkKKyAgLy8gbG9vcHMgaXQgZm9yIHdoaWNoIGl0IGlzIHVzaW5nIHBvc3QtaW5jIG1vZGUuCisgIGZvciAoUG9zdEluY0xvb3BTZXQ6OmNvbnN0X2l0ZXJhdG9yIEkgPSBMRi5Qb3N0SW5jTG9vcHMuYmVnaW4oKSwKKyAgICAgICBFID0gTEYuUG9zdEluY0xvb3BzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IExvb3AgKlBJTCA9ICpJOworICAgIGlmIChQSUwgPT0gTCkgY29udGludWU7CisKKyAgICAvLyBCZSBkb21pbmF0ZWQgYnkgdGhlIGxvb3AgZXhpdC4KKyAgICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrICosIDQ+IEV4aXRpbmdCbG9ja3M7CisgICAgUElMLT5nZXRFeGl0aW5nQmxvY2tzKEV4aXRpbmdCbG9ja3MpOworICAgIGlmICghRXhpdGluZ0Jsb2Nrcy5lbXB0eSgpKSB7CisgICAgICBCYXNpY0Jsb2NrICpCQiA9IEV4aXRpbmdCbG9ja3NbMF07CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gRXhpdGluZ0Jsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBCQiA9IERULmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKEJCLCBFeGl0aW5nQmxvY2tzW2ldKTsKKyAgICAgIElucHV0cy5wdXNoX2JhY2soQkItPmdldFRlcm1pbmF0b3IoKSk7CisgICAgfQorICB9CisKKyAgLy8gVGhlbiwgY2xpbWIgdXAgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3IgdHJlZSBhcyBmYXIgYXMgd2UgY2FuIGdvIHdoaWxlCisgIC8vIHN0aWxsIGJlaW5nIGRvbWluYXRlZCBieSB0aGUgaW5wdXQgcG9zaXRpb25zLgorICBJUCA9IEhvaXN0SW5zZXJ0UG9zaXRpb24oSVAsIElucHV0cyk7CisKKyAgLy8gRG9uJ3QgaW5zZXJ0IGluc3RydWN0aW9ucyBiZWZvcmUgUEhJIG5vZGVzLgorICB3aGlsZSAoaXNhPFBISU5vZGU+KElQKSkgKytJUDsKKworICAvLyBJZ25vcmUgZGVidWcgaW50cmluc2ljcy4KKyAgd2hpbGUgKElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJUCkpICsrSVA7CisKKyAgcmV0dXJuIElQOworfQorCisvLy8gRXhwYW5kIC0gRW1pdCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBsZWFkaW5nIGNhbmRpZGF0ZSBleHByZXNzaW9uIGZvciB0aGlzCisvLy8gTFNSVXNlICh0aGlzIGlzIGNhbGxlZCAiZXhwYW5kaW5nIikuCitWYWx1ZSAqTFNSSW5zdGFuY2U6OkV4cGFuZChjb25zdCBMU1JGaXh1cCAmTEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtdWxhICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWRXhwYW5kZXIgJlJld3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFdlYWtWSD4gJkRlYWRJbnN0cykgY29uc3QgeworICBjb25zdCBMU1JVc2UgJkxVID0gVXNlc1tMRi5MVUlkeF07CisKKyAgLy8gRGV0ZXJtaW5lIGFuIGlucHV0IHBvc2l0aW9uIHdoaWNoIHdpbGwgYmUgZG9taW5hdGVkIGJ5IHRoZSBvcGVyYW5kcyBhbmQKKyAgLy8gd2hpY2ggd2lsbCBkb21pbmF0ZSB0aGUgcmVzdWx0LgorICBJUCA9IEFkanVzdEluc2VydFBvc2l0aW9uRm9yRXhwYW5kKElQLCBMRiwgTFUpOworCisgIC8vIEluZm9ybSB0aGUgUmV3cml0ZXIgaWYgd2UgaGF2ZSBhIHBvc3QtaW5jcmVtZW50IHVzZSwgc28gdGhhdCBpdCBjYW4KKyAgLy8gcGVyZm9ybSBhbiBhZHZhbnRhZ2VvdXMgZXhwYW5zaW9uLgorICBSZXdyaXRlci5zZXRQb3N0SW5jKExGLlBvc3RJbmNMb29wcyk7CisKKyAgLy8gVGhpcyBpcyB0aGUgdHlwZSB0aGF0IHRoZSB1c2VyIGFjdHVhbGx5IG5lZWRzLgorICBjb25zdCBUeXBlICpPcFR5ID0gTEYuT3BlcmFuZFZhbFRvUmVwbGFjZS0+Z2V0VHlwZSgpOworICAvLyBUaGlzIHdpbGwgYmUgdGhlIHR5cGUgdGhhdCB3ZSdsbCBpbml0aWFsbHkgZXhwYW5kIHRvLgorICBjb25zdCBUeXBlICpUeSA9IEYuZ2V0VHlwZSgpOworICBpZiAoIVR5KQorICAgIC8vIE5vIHR5cGUga25vd247IGp1c3QgZXhwYW5kIGRpcmVjdGx5IHRvIHRoZSB1bHRpbWF0ZSB0eXBlLgorICAgIFR5ID0gT3BUeTsKKyAgZWxzZSBpZiAoU0UuZ2V0RWZmZWN0aXZlU0NFVlR5cGUoVHkpID09IFNFLmdldEVmZmVjdGl2ZVNDRVZUeXBlKE9wVHkpKQorICAgIC8vIEV4cGFuZCBkaXJlY3RseSB0byB0aGUgdWx0aW1hdGUgdHlwZSBpZiBpdCdzIHRoZSByaWdodCBzaXplLgorICAgIFR5ID0gT3BUeTsKKyAgLy8gVGhpcyBpcyB0aGUgdHlwZSB0byBkbyBpbnRlZ2VyIGFyaXRobWV0aWMgaW4uCisgIGNvbnN0IFR5cGUgKkludFR5ID0gU0UuZ2V0RWZmZWN0aXZlU0NFVlR5cGUoVHkpOworCisgIC8vIEJ1aWxkIHVwIGEgbGlzdCBvZiBvcGVyYW5kcyB0byBhZGQgdG9nZXRoZXIgdG8gZm9ybSB0aGUgZnVsbCBiYXNlLgorICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IE9wczsKKworICAvLyBFeHBhbmQgdGhlIEJhc2VSZWdzIHBvcnRpb24uCisgIGZvciAoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBGLkJhc2VSZWdzLmJlZ2luKCksCisgICAgICAgRSA9IEYuQmFzZVJlZ3MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgU0NFViAqUmVnID0gKkk7CisgICAgYXNzZXJ0KCFSZWctPmlzWmVybygpICYmICJaZXJvIGFsbG9jYXRlZCBpbiBhIGJhc2UgcmVnaXN0ZXIhIik7CisKKyAgICAvLyBJZiB3ZSdyZSBleHBhbmRpbmcgZm9yIGEgcG9zdC1pbmMgdXNlciwgbWFrZSB0aGUgcG9zdC1pbmMgYWRqdXN0bWVudC4KKyAgICBQb3N0SW5jTG9vcFNldCAmTG9vcHMgPSBjb25zdF9jYXN0PFBvc3RJbmNMb29wU2V0ICY+KExGLlBvc3RJbmNMb29wcyk7CisgICAgUmVnID0gVHJhbnNmb3JtRm9yUG9zdEluY1VzZShEZW5vcm1hbGl6ZSwgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEYuVXNlckluc3QsIExGLk9wZXJhbmRWYWxUb1JlcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wcywgU0UsIERUKTsKKworICAgIE9wcy5wdXNoX2JhY2soU0UuZ2V0VW5rbm93bihSZXdyaXRlci5leHBhbmRDb2RlRm9yKFJlZywgMCwgSVApKSk7CisgIH0KKworICAvLyBGbHVzaCB0aGUgb3BlcmFuZCBsaXN0IHRvIHN1cHByZXNzIFNDRVZFeHBhbmRlciBob2lzdGluZy4KKyAgaWYgKCFPcHMuZW1wdHkoKSkgeworICAgIFZhbHVlICpGdWxsViA9IFJld3JpdGVyLmV4cGFuZENvZGVGb3IoU0UuZ2V0QWRkRXhwcihPcHMpLCBUeSwgSVApOworICAgIE9wcy5jbGVhcigpOworICAgIE9wcy5wdXNoX2JhY2soU0UuZ2V0VW5rbm93bihGdWxsVikpOworICB9CisKKyAgLy8gRXhwYW5kIHRoZSBTY2FsZWRSZWcgcG9ydGlvbi4KKyAgVmFsdWUgKklDbXBTY2FsZWRWID0gMDsKKyAgaWYgKEYuQU0uU2NhbGUgIT0gMCkgeworICAgIGNvbnN0IFNDRVYgKlNjYWxlZFMgPSBGLlNjYWxlZFJlZzsKKworICAgIC8vIElmIHdlJ3JlIGV4cGFuZGluZyBmb3IgYSBwb3N0LWluYyB1c2VyLCBtYWtlIHRoZSBwb3N0LWluYyBhZGp1c3RtZW50LgorICAgIFBvc3RJbmNMb29wU2V0ICZMb29wcyA9IGNvbnN0X2Nhc3Q8UG9zdEluY0xvb3BTZXQgJj4oTEYuUG9zdEluY0xvb3BzKTsKKyAgICBTY2FsZWRTID0gVHJhbnNmb3JtRm9yUG9zdEluY1VzZShEZW5vcm1hbGl6ZSwgU2NhbGVkUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRi5Vc2VySW5zdCwgTEYuT3BlcmFuZFZhbFRvUmVwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wcywgU0UsIERUKTsKKworICAgIGlmIChMVS5LaW5kID09IExTUlVzZTo6SUNtcFplcm8pIHsKKyAgICAgIC8vIEFuIGludGVyZXN0aW5nIHdheSBvZiAiZm9sZGluZyIgd2l0aCBhbiBpY21wIGlzIHRvIHVzZSBhIG5lZ2F0ZWQKKyAgICAgIC8vIHNjYWxlLCB3aGljaCB3ZSdsbCBpbXBsZW1lbnQgYnkgaW5zZXJ0aW5nIGl0IGludG8gdGhlIG90aGVyIG9wZXJhbmQKKyAgICAgIC8vIG9mIHRoZSBpY21wLgorICAgICAgYXNzZXJ0KEYuQU0uU2NhbGUgPT0gLTEgJiYKKyAgICAgICAgICAgICAiVGhlIG9ubHkgc2NhbGUgc3VwcG9ydGVkIGJ5IElDbXBaZXJvIHVzZXMgaXMgLTEhIik7CisgICAgICBJQ21wU2NhbGVkViA9IFJld3JpdGVyLmV4cGFuZENvZGVGb3IoU2NhbGVkUywgMCwgSVApOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UganVzdCBleHBhbmQgdGhlIHNjYWxlZCByZWdpc3RlciBhbmQgYW4gZXhwbGljaXQgc2NhbGUsCisgICAgICAvLyB3aGljaCBpcyBleHBlY3RlZCB0byBiZSBtYXRjaGVkIGFzIHBhcnQgb2YgdGhlIGFkZHJlc3MuCisgICAgICBTY2FsZWRTID0gU0UuZ2V0VW5rbm93bihSZXdyaXRlci5leHBhbmRDb2RlRm9yKFNjYWxlZFMsIDAsIElQKSk7CisgICAgICBTY2FsZWRTID0gU0UuZ2V0TXVsRXhwcihTY2FsZWRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UuZ2V0Q29uc3RhbnQoU2NhbGVkUy0+Z2V0VHlwZSgpLCBGLkFNLlNjYWxlKSk7CisgICAgICBPcHMucHVzaF9iYWNrKFNjYWxlZFMpOworCisgICAgICAvLyBGbHVzaCB0aGUgb3BlcmFuZCBsaXN0IHRvIHN1cHByZXNzIFNDRVZFeHBhbmRlciBob2lzdGluZy4KKyAgICAgIFZhbHVlICpGdWxsViA9IFJld3JpdGVyLmV4cGFuZENvZGVGb3IoU0UuZ2V0QWRkRXhwcihPcHMpLCBUeSwgSVApOworICAgICAgT3BzLmNsZWFyKCk7CisgICAgICBPcHMucHVzaF9iYWNrKFNFLmdldFVua25vd24oRnVsbFYpKTsKKyAgICB9CisgIH0KKworICAvLyBFeHBhbmQgdGhlIEdWIHBvcnRpb24uCisgIGlmIChGLkFNLkJhc2VHVikgeworICAgIE9wcy5wdXNoX2JhY2soU0UuZ2V0VW5rbm93bihGLkFNLkJhc2VHVikpOworCisgICAgLy8gRmx1c2ggdGhlIG9wZXJhbmQgbGlzdCB0byBzdXBwcmVzcyBTQ0VWRXhwYW5kZXIgaG9pc3RpbmcuCisgICAgVmFsdWUgKkZ1bGxWID0gUmV3cml0ZXIuZXhwYW5kQ29kZUZvcihTRS5nZXRBZGRFeHByKE9wcyksIFR5LCBJUCk7CisgICAgT3BzLmNsZWFyKCk7CisgICAgT3BzLnB1c2hfYmFjayhTRS5nZXRVbmtub3duKEZ1bGxWKSk7CisgIH0KKworICAvLyBFeHBhbmQgdGhlIGltbWVkaWF0ZSBwb3J0aW9uLgorICBpbnQ2NF90IE9mZnNldCA9ICh1aW50NjRfdClGLkFNLkJhc2VPZmZzICsgTEYuT2Zmc2V0OworICBpZiAoT2Zmc2V0ICE9IDApIHsKKyAgICBpZiAoTFUuS2luZCA9PSBMU1JVc2U6OklDbXBaZXJvKSB7CisgICAgICAvLyBUaGUgb3RoZXIgaW50ZXJlc3Rpbmcgd2F5IG9mICJmb2xkaW5nIiB3aXRoIGFuIElDbXBaZXJvIGlzIHRvIHVzZSBhCisgICAgICAvLyBuZWdhdGVkIGltbWVkaWF0ZS4KKyAgICAgIGlmICghSUNtcFNjYWxlZFYpCisgICAgICAgIElDbXBTY2FsZWRWID0gQ29uc3RhbnRJbnQ6OmdldChJbnRUeSwgLU9mZnNldCk7CisgICAgICBlbHNlIHsKKyAgICAgICAgT3BzLnB1c2hfYmFjayhTRS5nZXRVbmtub3duKElDbXBTY2FsZWRWKSk7CisgICAgICAgIElDbXBTY2FsZWRWID0gQ29uc3RhbnRJbnQ6OmdldChJbnRUeSwgT2Zmc2V0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gSnVzdCBhZGQgdGhlIGltbWVkaWF0ZSB2YWx1ZXMuIFRoZXNlIGFnYWluIGFyZSBleHBlY3RlZCB0byBiZSBtYXRjaGVkCisgICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBhZGRyZXNzLgorICAgICAgT3BzLnB1c2hfYmFjayhTRS5nZXRVbmtub3duKENvbnN0YW50SW50OjpnZXRTaWduZWQoSW50VHksIE9mZnNldCkpKTsKKyAgICB9CisgIH0KKworICAvLyBFbWl0IGluc3RydWN0aW9ucyBzdW1taW5nIGFsbCB0aGUgb3BlcmFuZHMuCisgIGNvbnN0IFNDRVYgKkZ1bGxTID0gT3BzLmVtcHR5KCkgPworICAgICAgICAgICAgICAgICAgICAgIFNFLmdldENvbnN0YW50KEludFR5LCAwKSA6CisgICAgICAgICAgICAgICAgICAgICAgU0UuZ2V0QWRkRXhwcihPcHMpOworICBWYWx1ZSAqRnVsbFYgPSBSZXdyaXRlci5leHBhbmRDb2RlRm9yKEZ1bGxTLCBUeSwgSVApOworCisgIC8vIFdlJ3JlIGRvbmUgZXhwYW5kaW5nIG5vdywgc28gcmVzZXQgdGhlIHJld3JpdGVyLgorICBSZXdyaXRlci5jbGVhclBvc3RJbmMoKTsKKworICAvLyBBbiBJQ21wWmVybyBGb3JtdWxhIHJlcHJlc2VudHMgYW4gSUNtcCB3aGljaCB3ZSdyZSBoYW5kbGluZyBhcyBhCisgIC8vIGNvbXBhcmlzb24gYWdhaW5zdCB6ZXJvLiBOb3cgdGhhdCB3ZSd2ZSBleHBhbmRlZCBhbiBleHByZXNzaW9uIGZvciB0aGF0CisgIC8vIGZvcm0sIHVwZGF0ZSB0aGUgSUNtcCdzIG90aGVyIG9wZXJhbmQuCisgIGlmIChMVS5LaW5kID09IExTUlVzZTo6SUNtcFplcm8pIHsKKyAgICBJQ21wSW5zdCAqQ0kgPSBjYXN0PElDbXBJbnN0PihMRi5Vc2VySW5zdCk7CisgICAgRGVhZEluc3RzLnB1c2hfYmFjayhDSS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgYXNzZXJ0KCFGLkFNLkJhc2VHViAmJiAiSUNtcCBkb2VzIG5vdCBzdXBwb3J0IGZvbGRpbmcgYSBnbG9iYWwgdmFsdWUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIHNjYWxlIGF0IHRoZSBzYW1lIHRpbWUhIik7CisgICAgaWYgKEYuQU0uU2NhbGUgPT0gLTEpIHsKKyAgICAgIGlmIChJQ21wU2NhbGVkVi0+Z2V0VHlwZSgpICE9IE9wVHkpIHsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gKkNhc3QgPQorICAgICAgICAgIENhc3RJbnN0OjpDcmVhdGUoQ2FzdEluc3Q6OmdldENhc3RPcGNvZGUoSUNtcFNjYWxlZFYsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BUeSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcFNjYWxlZFYsIE9wVHksIENJKTsKKyAgICAgICAgSUNtcFNjYWxlZFYgPSBDYXN0OworICAgICAgfQorICAgICAgQ0ktPnNldE9wZXJhbmQoMSwgSUNtcFNjYWxlZFYpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoRi5BTS5TY2FsZSA9PSAwICYmCisgICAgICAgICAgICAgIklDbXAgZG9lcyBub3Qgc3VwcG9ydCBmb2xkaW5nIGEgZ2xvYmFsIHZhbHVlIGFuZCAiCisgICAgICAgICAgICAgImEgc2NhbGUgYXQgdGhlIHNhbWUgdGltZSEiKTsKKyAgICAgIENvbnN0YW50ICpDID0gQ29uc3RhbnRJbnQ6OmdldFNpZ25lZChTRS5nZXRFZmZlY3RpdmVTQ0VWVHlwZShPcFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKHVpbnQ2NF90KU9mZnNldCk7CisgICAgICBpZiAoQy0+Z2V0VHlwZSgpICE9IE9wVHkpCisgICAgICAgIEMgPSBDb25zdGFudEV4cHI6OmdldENhc3QoQ2FzdEluc3Q6OmdldENhc3RPcGNvZGUoQywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BUeSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMsIE9wVHkpOworCisgICAgICBDSS0+c2V0T3BlcmFuZCgxLCBDKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gRnVsbFY7Cit9CisKKy8vLyBSZXdyaXRlRm9yUEhJIC0gSGVscGVyIGZvciBSZXdyaXRlLiBQSEkgbm9kZXMgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGUgdXNlCisvLy8gb2YgdGhlaXIgb3BlcmFuZHMgZWZmZWN0aXZlbHkgaGFwcGVucyBpbiB0aGVpciBwcmVkZWNlc3NvciBibG9ja3MsIHNvIHRoZQorLy8vIGV4cHJlc3Npb24gbWF5IG5lZWQgdG8gYmUgZXhwYW5kZWQgaW4gbXVsdGlwbGUgcGxhY2VzLgordm9pZCBMU1JJbnN0YW5jZTo6UmV3cml0ZUZvclBISShQSElOb2RlICpQTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFNSRml4dXAgJkxGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtdWxhICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWRXhwYW5kZXIgJlJld3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8V2Vha1ZIPiAmRGVhZEluc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzICpQKSBjb25zdCB7CisgIERlbnNlTWFwPEJhc2ljQmxvY2sgKiwgVmFsdWUgKj4gSW5zZXJ0ZWQ7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpID09IExGLk9wZXJhbmRWYWxUb1JlcGxhY2UpIHsKKyAgICAgIEJhc2ljQmxvY2sgKkJCID0gUE4tPmdldEluY29taW5nQmxvY2soaSk7CisKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBjcml0aWNhbCBlZGdlLCBzcGxpdCB0aGUgZWRnZSBzbyB0aGF0IHdlIGRvIG5vdCBpbnNlcnQKKyAgICAgIC8vIHRoZSBjb2RlIG9uIGFsbCBwcmVkZWNlc3Nvci9zdWNjZXNzb3IgcGF0aHMuICBXZSBkbyB0aGlzIHVubGVzcyB0aGlzCisgICAgICAvLyBpcyB0aGUgY2Fub25pY2FsIGJhY2tlZGdlIGZvciB0aGlzIGxvb3AsIHdoaWNoIGNvbXBsaWNhdGVzIHBvc3QtaW5jCisgICAgICAvLyB1c2Vycy4KKyAgICAgIGlmIChlICE9IDEgJiYgQkItPmdldFRlcm1pbmF0b3IoKS0+Z2V0TnVtU3VjY2Vzc29ycygpID4gMSAmJgorICAgICAgICAgICFpc2E8SW5kaXJlY3RCckluc3Q+KEJCLT5nZXRUZXJtaW5hdG9yKCkpICYmCisgICAgICAgICAgKFBOLT5nZXRQYXJlbnQoKSAhPSBMLT5nZXRIZWFkZXIoKSB8fCAhTC0+Y29udGFpbnMoQkIpKSkgeworICAgICAgICAvLyBTcGxpdCB0aGUgY3JpdGljYWwgZWRnZS4KKyAgICAgICAgQmFzaWNCbG9jayAqTmV3QkIgPSBTcGxpdENyaXRpY2FsRWRnZShCQiwgUE4tPmdldFBhcmVudCgpLCBQKTsKKworICAgICAgICAvLyBJZiBQTiBpcyBvdXRzaWRlIG9mIHRoZSBsb29wIGFuZCBCQiBpcyBpbiB0aGUgbG9vcCwgd2Ugd2FudCB0bworICAgICAgICAvLyBtb3ZlIHRoZSBibG9jayB0byBiZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIFBISSBibG9jaywgbm90CisgICAgICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIEJCLgorICAgICAgICBpZiAoTC0+Y29udGFpbnMoQkIpICYmICFMLT5jb250YWlucyhQTikpCisgICAgICAgICAgTmV3QkItPm1vdmVCZWZvcmUoUE4tPmdldFBhcmVudCgpKTsKKworICAgICAgICAvLyBTcGxpdHRpbmcgdGhlIGVkZ2UgY2FuIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFBISSBlbnRyaWVzIHdlIGhhdmUuCisgICAgICAgIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsKKyAgICAgICAgQkIgPSBOZXdCQjsKKyAgICAgICAgaSA9IFBOLT5nZXRCYXNpY0Jsb2NrSW5kZXgoQkIpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8RGVuc2VNYXA8QmFzaWNCbG9jayAqLCBWYWx1ZSAqPjo6aXRlcmF0b3IsIGJvb2w+IFBhaXIgPQorICAgICAgICBJbnNlcnRlZC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoQkIsIHN0YXRpY19jYXN0PFZhbHVlICo+KDApKSk7CisgICAgICBpZiAoIVBhaXIuc2Vjb25kKQorICAgICAgICBQTi0+c2V0SW5jb21pbmdWYWx1ZShpLCBQYWlyLmZpcnN0LT5zZWNvbmQpOworICAgICAgZWxzZSB7CisgICAgICAgIFZhbHVlICpGdWxsViA9IEV4cGFuZChMRiwgRiwgQkItPmdldFRlcm1pbmF0b3IoKSwgUmV3cml0ZXIsIERlYWRJbnN0cyk7CisKKyAgICAgICAgLy8gSWYgdGhpcyBpcyByZXVzZS1ieS1ub29wLWNhc3QsIGluc2VydCB0aGUgbm9vcCBjYXN0LgorICAgICAgICBjb25zdCBUeXBlICpPcFR5ID0gTEYuT3BlcmFuZFZhbFRvUmVwbGFjZS0+Z2V0VHlwZSgpOworICAgICAgICBpZiAoRnVsbFYtPmdldFR5cGUoKSAhPSBPcFR5KQorICAgICAgICAgIEZ1bGxWID0KKyAgICAgICAgICAgIENhc3RJbnN0OjpDcmVhdGUoQ2FzdEluc3Q6OmdldENhc3RPcGNvZGUoRnVsbFYsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcFR5LCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGxWLCBMRi5PcGVyYW5kVmFsVG9SZXBsYWNlLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLT5nZXRUZXJtaW5hdG9yKCkpOworCisgICAgICAgIFBOLT5zZXRJbmNvbWluZ1ZhbHVlKGksIEZ1bGxWKTsKKyAgICAgICAgUGFpci5maXJzdC0+c2Vjb25kID0gRnVsbFY7CisgICAgICB9CisgICAgfQorfQorCisvLy8gUmV3cml0ZSAtIEVtaXQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgbGVhZGluZyBjYW5kaWRhdGUgZXhwcmVzc2lvbiBmb3IgdGhpcworLy8vIExTUlVzZSAodGhpcyBpcyBjYWxsZWQgImV4cGFuZGluZyIpLCBhbmQgdXBkYXRlIHRoZSBVc2VySW5zdCB0byByZWZlcmVuY2UKKy8vLyB0aGUgbmV3bHkgZXhwYW5kZWQgdmFsdWUuCit2b2lkIExTUkluc3RhbmNlOjpSZXdyaXRlKGNvbnN0IExTUkZpeHVwICZMRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybXVsYSAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVkV4cGFuZGVyICZSZXdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFdlYWtWSD4gJkRlYWRJbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzcyAqUCkgY29uc3QgeworICAvLyBGaXJzdCwgZmluZCBhbiBpbnNlcnRpb24gcG9pbnQgdGhhdCBkb21pbmF0ZXMgVXNlckluc3QuIEZvciBQSEkgbm9kZXMsCisgIC8vIGZpbmQgdGhlIG5lYXJlc3QgYmxvY2sgd2hpY2ggZG9taW5hdGVzIGFsbCB0aGUgcmVsZXZhbnQgdXNlcy4KKyAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oTEYuVXNlckluc3QpKSB7CisgICAgUmV3cml0ZUZvclBISShQTiwgTEYsIEYsIFJld3JpdGVyLCBEZWFkSW5zdHMsIFApOworICB9IGVsc2UgeworICAgIFZhbHVlICpGdWxsViA9IEV4cGFuZChMRiwgRiwgTEYuVXNlckluc3QsIFJld3JpdGVyLCBEZWFkSW5zdHMpOworCisgICAgLy8gSWYgdGhpcyBpcyByZXVzZS1ieS1ub29wLWNhc3QsIGluc2VydCB0aGUgbm9vcCBjYXN0LgorICAgIGNvbnN0IFR5cGUgKk9wVHkgPSBMRi5PcGVyYW5kVmFsVG9SZXBsYWNlLT5nZXRUeXBlKCk7CisgICAgaWYgKEZ1bGxWLT5nZXRUeXBlKCkgIT0gT3BUeSkgeworICAgICAgSW5zdHJ1Y3Rpb24gKkNhc3QgPQorICAgICAgICBDYXN0SW5zdDo6Q3JlYXRlKENhc3RJbnN0OjpnZXRDYXN0T3Bjb2RlKEZ1bGxWLCBmYWxzZSwgT3BUeSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGxWLCBPcFR5LCBMRi5Vc2VySW5zdCk7CisgICAgICBGdWxsViA9IENhc3Q7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSB1c2VyLiBJQ21wWmVybyBpcyBoYW5kbGVkIHNwZWNpYWxseSBoZXJlIChmb3Igbm93KSBiZWNhdXNlCisgICAgLy8gRXhwYW5kIG1heSBoYXZlIHVwZGF0ZWQgb25lIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgaWNtcCBhbHJlYWR5LCBhbmQKKyAgICAvLyBpdHMgbmV3IHZhbHVlIG1heSBoYXBwZW4gdG8gYmUgZXF1YWwgdG8gTEYuT3BlcmFuZFZhbFRvUmVwbGFjZSwgaW4KKyAgICAvLyB3aGljaCBjYXNlIGRvaW5nIHJlcGxhY2VVc2VzT2ZXaXRoIGxlYWRzIHRvIHJlcGxhY2luZyBib3RoIG9wZXJhbmRzCisgICAgLy8gd2l0aCB0aGUgc2FtZSB2YWx1ZS4gVE9ETzogUmVvcmdhbml6ZSB0aGlzLgorICAgIGlmIChVc2VzW0xGLkxVSWR4XS5LaW5kID09IExTUlVzZTo6SUNtcFplcm8pCisgICAgICBMRi5Vc2VySW5zdC0+c2V0T3BlcmFuZCgwLCBGdWxsVik7CisgICAgZWxzZQorICAgICAgTEYuVXNlckluc3QtPnJlcGxhY2VVc2VzT2ZXaXRoKExGLk9wZXJhbmRWYWxUb1JlcGxhY2UsIEZ1bGxWKTsKKyAgfQorCisgIERlYWRJbnN0cy5wdXNoX2JhY2soTEYuT3BlcmFuZFZhbFRvUmVwbGFjZSk7Cit9CisKKy8vLyBJbXBsZW1lbnRTb2x1dGlvbiAtIFJld3JpdGUgYWxsIHRoZSBmaXh1cCBsb2NhdGlvbnMgd2l0aCBuZXcgdmFsdWVzLAorLy8vIGZvbGxvd2luZyB0aGUgY2hvc2VuIHNvbHV0aW9uLgordm9pZAorTFNSSW5zdGFuY2U6OkltcGxlbWVudFNvbHV0aW9uKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjb25zdCBGb3JtdWxhICo+ICZTb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzICpQKSB7CisgIC8vIEtlZXAgdHJhY2sgb2YgaW5zdHJ1Y3Rpb25zIHdlIG1heSBoYXZlIG1hZGUgZGVhZCwgc28gdGhhdAorICAvLyB3ZSBjYW4gcmVtb3ZlIHRoZW0gYWZ0ZXIgd2UgYXJlIGRvbmUgd29ya2luZy4KKyAgU21hbGxWZWN0b3I8V2Vha1ZILCAxNj4gRGVhZEluc3RzOworCisgIFNDRVZFeHBhbmRlciBSZXdyaXRlcihTRSk7CisgIFJld3JpdGVyLmRpc2FibGVDYW5vbmljYWxNb2RlKCk7CisgIFJld3JpdGVyLnNldElWSW5jSW5zZXJ0UG9zKEwsIElWSW5jSW5zZXJ0UG9zKTsKKworICAvLyBFeHBhbmQgdGhlIG5ldyB2YWx1ZSBkZWZpbml0aW9ucyBhbmQgdXBkYXRlIHRoZSB1c2Vycy4KKyAgZm9yIChTbWFsbFZlY3RvckltcGw8TFNSRml4dXA+Ojpjb25zdF9pdGVyYXRvciBJID0gRml4dXBzLmJlZ2luKCksCisgICAgICAgRSA9IEZpeHVwcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBMU1JGaXh1cCAmRml4dXAgPSAqSTsKKworICAgIFJld3JpdGUoRml4dXAsICpTb2x1dGlvbltGaXh1cC5MVUlkeF0sIFJld3JpdGVyLCBEZWFkSW5zdHMsIFApOworCisgICAgQ2hhbmdlZCA9IHRydWU7CisgIH0KKworICAvLyBDbGVhbiB1cCBhZnRlciBvdXJzZWx2ZXMuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBkZWxldGluZyBhbnkKKyAgLy8gaW5zdHJ1Y3Rpb25zLgorICBSZXdyaXRlci5jbGVhcigpOworCisgIENoYW5nZWQgfD0gRGVsZXRlVHJpdmlhbGx5RGVhZEluc3RydWN0aW9ucyhEZWFkSW5zdHMpOworfQorCitMU1JJbnN0YW5jZTo6TFNSSW5zdGFuY2UoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKnRsaSwgTG9vcCAqbCwgUGFzcyAqUCkKKyAgOiBJVShQLT5nZXRBbmFseXNpczxJVlVzZXJzPigpKSwKKyAgICBTRShQLT5nZXRBbmFseXNpczxTY2FsYXJFdm9sdXRpb24+KCkpLAorICAgIERUKFAtPmdldEFuYWx5c2lzPERvbWluYXRvclRyZWU+KCkpLAorICAgIExJKFAtPmdldEFuYWx5c2lzPExvb3BJbmZvPigpKSwKKyAgICBUTEkodGxpKSwgTChsKSwgQ2hhbmdlZChmYWxzZSksIElWSW5jSW5zZXJ0UG9zKDApIHsKKworICAvLyBJZiBMb29wU2ltcGxpZnkgZm9ybSBpcyBub3QgYXZhaWxhYmxlLCBzdGF5IG91dCBvZiB0cm91YmxlLgorICBpZiAoIUwtPmlzTG9vcFNpbXBsaWZ5Rm9ybSgpKSByZXR1cm47CisKKyAgLy8gSWYgdGhlcmUncyBubyBpbnRlcmVzdGluZyB3b3JrIHRvIGJlIGRvbmUsIGJhaWwgZWFybHkuCisgIGlmIChJVS5lbXB0eSgpKSByZXR1cm47CisKKyAgREVCVUcoZGJncygpIDw8ICJcbkxTUiBvbiBsb29wICI7CisgICAgICAgIFdyaXRlQXNPcGVyYW5kKGRiZ3MoKSwgTC0+Z2V0SGVhZGVyKCksIC8qUHJpbnRUeXBlPSovZmFsc2UpOworICAgICAgICBkYmdzKCkgPDwgIjpcbiIpOworCisgIC8vIEZpcnN0LCBwZXJmb3JtIHNvbWUgbG93LWxldmVsIGxvb3Agb3B0aW1pemF0aW9ucy4KKyAgT3B0aW1pemVTaGFkb3dJVigpOworICBPcHRpbWl6ZUxvb3BUZXJtQ29uZCgpOworCisgIC8vIFN0YXJ0IGNvbGxlY3RpbmcgZGF0YSBhbmQgcHJlcGFyaW5nIGZvciB0aGUgc29sdmVyLgorICBDb2xsZWN0SW50ZXJlc3RpbmdUeXBlc0FuZEZhY3RvcnMoKTsKKyAgQ29sbGVjdEZpeHVwc0FuZEluaXRpYWxGb3JtdWxhZSgpOworICBDb2xsZWN0TG9vcEludmFyaWFudEZpeHVwc0FuZEZvcm11bGFlKCk7CisKKyAgREVCVUcoZGJncygpIDw8ICJMU1IgZm91bmQgIiA8PCBVc2VzLnNpemUoKSA8PCAiIHVzZXM6XG4iOworICAgICAgICBwcmludF91c2VzKGRiZ3MoKSkpOworCisgIC8vIE5vdyB1c2UgdGhlIHJldXNlIGRhdGEgdG8gZ2VuZXJhdGUgYSBidW5jaCBvZiBpbnRlcmVzdGluZyB3YXlzCisgIC8vIHRvIGZvcm11bGF0ZSB0aGUgdmFsdWVzIG5lZWRlZCBmb3IgdGhlIHVzZXMuCisgIEdlbmVyYXRlQWxsUmV1c2VGb3JtdWxhZSgpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiXG4iCisgICAgICAgICAgICAgICAgICAiQWZ0ZXIgZ2VuZXJhdGluZyByZXVzZSBmb3JtdWxhZTpcbiI7CisgICAgICAgIHByaW50X3VzZXMoZGJncygpKSk7CisKKyAgRmlsdGVyT3V0VW5kZXNpcmFibGVEZWRpY2F0ZWRSZWdpc3RlcnMoKTsKKyAgTmFycm93U2VhcmNoU3BhY2VVc2luZ0hldXJpc3RpY3MoKTsKKworICBTbWFsbFZlY3Rvcjxjb25zdCBGb3JtdWxhICosIDg+IFNvbHV0aW9uOworICBTb2x2ZShTb2x1dGlvbik7CisKKyAgLy8gUmVsZWFzZSBtZW1vcnkgdGhhdCBpcyBubyBsb25nZXIgbmVlZGVkLgorICBGYWN0b3JzLmNsZWFyKCk7CisgIFR5cGVzLmNsZWFyKCk7CisgIFJlZ1VzZXMuY2xlYXIoKTsKKworI2lmbmRlZiBOREVCVUcKKyAgLy8gRm9ybXVsYWUgc2hvdWxkIGJlIGxlZ2FsLgorICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxMU1JVc2U+Ojpjb25zdF9pdGVyYXRvciBJID0gVXNlcy5iZWdpbigpLAorICAgICAgIEUgPSBVc2VzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICBjb25zdCBMU1JVc2UgJkxVID0gKkk7CisgICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPEZvcm11bGE+Ojpjb25zdF9pdGVyYXRvciBKID0gTFUuRm9ybXVsYWUuYmVnaW4oKSwKKyAgICAgICAgICBKRSA9IExVLkZvcm11bGFlLmVuZCgpOyBKICE9IEpFOyArK0opCisgICAgICAgIGFzc2VydChpc0xlZ2FsVXNlKEotPkFNLCBMVS5NaW5PZmZzZXQsIExVLk1heE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFUuS2luZCwgTFUuQWNjZXNzVHksIFRMSSkgJiYKKyAgICAgICAgICAgICAgICJJbGxlZ2FsIGZvcm11bGEgZ2VuZXJhdGVkISIpOworICB9OworI2VuZGlmCisKKyAgLy8gTm93IHRoYXQgd2UndmUgZGVjaWRlZCB3aGF0IHdlIHdhbnQsIG1ha2UgaXQgc28uCisgIEltcGxlbWVudFNvbHV0aW9uKFNvbHV0aW9uLCBQKTsKK30KKwordm9pZCBMU1JJbnN0YW5jZTo6cHJpbnRfZmFjdG9yc19hbmRfdHlwZXMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmIChGYWN0b3JzLmVtcHR5KCkgJiYgVHlwZXMuZW1wdHkoKSkgcmV0dXJuOworCisgIE9TIDw8ICJMU1IgaGFzIGlkZW50aWZpZWQgdGhlIGZvbGxvd2luZyBpbnRlcmVzdGluZyBmYWN0b3JzIGFuZCB0eXBlczogIjsKKyAgYm9vbCBGaXJzdCA9IHRydWU7CisKKyAgZm9yIChTbWFsbFNldFZlY3RvcjxpbnQ2NF90LCA4Pjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICBJID0gRmFjdG9ycy5iZWdpbigpLCBFID0gRmFjdG9ycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoIUZpcnN0KSBPUyA8PCAiLCAiOworICAgIEZpcnN0ID0gZmFsc2U7CisgICAgT1MgPDwgJyonIDw8ICpJOworICB9CisKKyAgZm9yIChTbWFsbFNldFZlY3Rvcjxjb25zdCBUeXBlICosIDQ+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgIEkgPSBUeXBlcy5iZWdpbigpLCBFID0gVHlwZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKCFGaXJzdCkgT1MgPDwgIiwgIjsKKyAgICBGaXJzdCA9IGZhbHNlOworICAgIE9TIDw8ICcoJyA8PCAqKkkgPDwgJyknOworICB9CisgIE9TIDw8ICdcbic7Cit9CisKK3ZvaWQgTFNSSW5zdGFuY2U6OnByaW50X2ZpeHVwcyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIkxTUiBpcyBleGFtaW5pbmcgdGhlIGZvbGxvd2luZyBmaXh1cCBzaXRlczpcbiI7CisgIGZvciAoU21hbGxWZWN0b3JJbXBsPExTUkZpeHVwPjo6Y29uc3RfaXRlcmF0b3IgSSA9IEZpeHVwcy5iZWdpbigpLAorICAgICAgIEUgPSBGaXh1cHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgZGJncygpIDw8ICIgICI7CisgICAgSS0+cHJpbnQoT1MpOworICAgIE9TIDw8ICdcbic7CisgIH0KK30KKwordm9pZCBMU1JJbnN0YW5jZTo6cHJpbnRfdXNlcyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIkxTUiBpcyBleGFtaW5pbmcgdGhlIGZvbGxvd2luZyB1c2VzOlxuIjsKKyAgZm9yIChTbWFsbFZlY3RvckltcGw8TFNSVXNlPjo6Y29uc3RfaXRlcmF0b3IgSSA9IFVzZXMuYmVnaW4oKSwKKyAgICAgICBFID0gVXNlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBMU1JVc2UgJkxVID0gKkk7CisgICAgZGJncygpIDw8ICIgICI7CisgICAgTFUucHJpbnQoT1MpOworICAgIE9TIDw8ICdcbic7CisgICAgZm9yIChTbWFsbFZlY3RvckltcGw8Rm9ybXVsYT46OmNvbnN0X2l0ZXJhdG9yIEogPSBMVS5Gb3JtdWxhZS5iZWdpbigpLAorICAgICAgICAgSkUgPSBMVS5Gb3JtdWxhZS5lbmQoKTsgSiAhPSBKRTsgKytKKSB7CisgICAgICBPUyA8PCAiICAgICI7CisgICAgICBKLT5wcmludChPUyk7CisgICAgICBPUyA8PCAnXG4nOworICAgIH0KKyAgfQorfQorCit2b2lkIExTUkluc3RhbmNlOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgcHJpbnRfZmFjdG9yc19hbmRfdHlwZXMoT1MpOworICBwcmludF9maXh1cHMoT1MpOworICBwcmludF91c2VzKE9TKTsKK30KKwordm9pZCBMU1JJbnN0YW5jZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZXJycygpKTsgZXJycygpIDw8ICdcbic7Cit9CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIExvb3BTdHJlbmd0aFJlZHVjZSA6IHB1YmxpYyBMb29wUGFzcyB7CisgIC8vLyBUTEkgLSBLZWVwIGEgcG9pbnRlciBvZiBhIFRhcmdldExvd2VyaW5nIHRvIGNvbnN1bHQgZm9yIGRldGVybWluaW5nCisgIC8vLyB0cmFuc2Zvcm1hdGlvbiBwcm9maXRhYmlsaXR5LgorICBjb25zdCBUYXJnZXRMb3dlcmluZyAqY29uc3QgVExJOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIElELCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgIGV4cGxpY2l0IExvb3BTdHJlbmd0aFJlZHVjZShjb25zdCBUYXJnZXRMb3dlcmluZyAqdGxpID0gMCk7CisKK3ByaXZhdGU6CisgIGJvb2wgcnVuT25Mb29wKExvb3AgKkwsIExQUGFzc01hbmFnZXIgJkxQTSk7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Q7Cit9OworCit9CisKK2NoYXIgTG9vcFN0cmVuZ3RoUmVkdWNlOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoTG9vcFN0cmVuZ3RoUmVkdWNlLCAibG9vcC1yZWR1Y2UiLAorICAgICAgICAgICAgICAgICJMb29wIFN0cmVuZ3RoIFJlZHVjdGlvbiIsIGZhbHNlLCBmYWxzZSk7CisKK1Bhc3MgKmxsdm06OmNyZWF0ZUxvb3BTdHJlbmd0aFJlZHVjZVBhc3MoY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSSkgeworICByZXR1cm4gbmV3IExvb3BTdHJlbmd0aFJlZHVjZShUTEkpOworfQorCitMb29wU3RyZW5ndGhSZWR1Y2U6Okxvb3BTdHJlbmd0aFJlZHVjZShjb25zdCBUYXJnZXRMb3dlcmluZyAqdGxpKQorICA6IExvb3BQYXNzKElEKSwgVExJKHRsaSkge30KKwordm9pZCBMb29wU3RyZW5ndGhSZWR1Y2U6OmdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgLy8gV2Ugc3BsaXQgY3JpdGljYWwgZWRnZXMsIHNvIHdlIGNoYW5nZSB0aGUgQ0ZHLiAgSG93ZXZlciwgd2UgZG8gdXBkYXRlCisgIC8vIG1hbnkgYW5hbHlzZXMgaWYgdGhleSBhcmUgYXJvdW5kLgorICBBVS5hZGRQcmVzZXJ2ZWRJRChMb29wU2ltcGxpZnlJRCk7CisgIEFVLmFkZFByZXNlcnZlZCgiZG9tZnJvbnRpZXIiKTsKKworICBBVS5hZGRSZXF1aXJlZDxMb29wSW5mbz4oKTsKKyAgQVUuYWRkUHJlc2VydmVkPExvb3BJbmZvPigpOworICBBVS5hZGRSZXF1aXJlZElEKExvb3BTaW1wbGlmeUlEKTsKKyAgQVUuYWRkUmVxdWlyZWQ8RG9taW5hdG9yVHJlZT4oKTsKKyAgQVUuYWRkUHJlc2VydmVkPERvbWluYXRvclRyZWU+KCk7CisgIEFVLmFkZFJlcXVpcmVkPFNjYWxhckV2b2x1dGlvbj4oKTsKKyAgQVUuYWRkUHJlc2VydmVkPFNjYWxhckV2b2x1dGlvbj4oKTsKKyAgQVUuYWRkUmVxdWlyZWQ8SVZVc2Vycz4oKTsKKyAgQVUuYWRkUHJlc2VydmVkPElWVXNlcnM+KCk7Cit9CisKK2Jvb2wgTG9vcFN0cmVuZ3RoUmVkdWNlOjpydW5Pbkxvb3AoTG9vcCAqTCwgTFBQYXNzTWFuYWdlciAmIC8qTFBNKi8pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gUnVuIHRoZSBtYWluIExTUiB0cmFuc2Zvcm1hdGlvbi4KKyAgQ2hhbmdlZCB8PSBMU1JJbnN0YW5jZShUTEksIEwsIHRoaXMpLmdldENoYW5nZWQoKTsKKworICAvLyBBdCB0aGlzIHBvaW50LCBpdCBpcyB3b3J0aCBjaGVja2luZyB0byBzZWUgaWYgYW55IHJlY3VycmVuY2UgUEhJcyBhcmUgYWxzbworICAvLyBkZWFkLCBzbyB0aGF0IHdlIGNhbiByZW1vdmUgdGhlbSBhcyB3ZWxsLgorICBDaGFuZ2VkIHw9IERlbGV0ZURlYWRQSElzKEwtPmdldEhlYWRlcigpKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzQyZmQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMjPT09LSBsaWIvVHJhbnNmb3Jtcy9TY2FsYXIvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTVNjYWxhck9wdHMKK0JVSUxEX0FSQ0hJVkUgPSAxCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9SZWFzc29jaWF0ZS5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvUmVhc3NvY2lhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTI3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvUmVhc3NvY2lhdGUuY3BwCkBAIC0wLDAgKzEsMTA3MSBAQAorLy89PT0tIFJlYXNzb2NpYXRlLmNwcCAtIFJlYXNzb2NpYXRlIGJpbmFyeSBleHByZXNzaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgcmVhc3NvY2lhdGVzIGNvbW11dGF0aXZlIGV4cHJlc3Npb25zIGluIGFuIG9yZGVyIHRoYXQgaXMgZGVzaWduZWQKKy8vIHRvIHByb21vdGUgYmV0dGVyIGNvbnN0YW50IHByb3BhZ2F0aW9uLCBHQ1NFLCBMSUNNLCBQUkUsIGV0Yy4KKy8vCisvLyBGb3IgZXhhbXBsZTogNCArICh4ICsgNSkgLT4geCArICg0ICsgNSkKKy8vCisvLyBJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBhbGdvcml0aG0sIGNvbnN0YW50cyBhcmUgYXNzaWduZWQgcmFuayA9IDAsCisvLyBmdW5jdGlvbiBhcmd1bWVudHMgYXJlIHJhbmsgPSAxLCBhbmQgb3RoZXIgdmFsdWVzIGFyZSBhc3NpZ25lZCByYW5rcworLy8gY29ycmVzcG9uZGluZyB0byB0aGUgcmV2ZXJzZSBwb3N0IG9yZGVyIHRyYXZlcnNhbCBvZiBjdXJyZW50IGZ1bmN0aW9uCisvLyAoc3RhcnRpbmcgYXQgMiksIHdoaWNoIGVmZmVjdGl2ZWx5IGdpdmVzIHZhbHVlcyBpbiBkZWVwIGxvb3BzIGhpZ2hlciByYW5rCisvLyB0aGFuIHZhbHVlcyBub3QgaW4gbG9vcHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJyZWFzc29jaWF0ZSIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUxpbmVhciAsICJOdW1iZXIgb2YgaW5zdHMgbGluZWFyaXplZCIpOworU1RBVElTVElDKE51bUNoYW5nZWQsICJOdW1iZXIgb2YgaW5zdHMgcmVhc3NvY2lhdGVkIik7CitTVEFUSVNUSUMoTnVtQW5uaWhpbCwgIk51bWJlciBvZiBleHByIHRyZWUgYW5uaWhpbGF0ZWQiKTsKK1NUQVRJU1RJQyhOdW1GYWN0b3IgLCAiTnVtYmVyIG9mIG11bHRpcGxpZXMgZmFjdG9yZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IFZhbHVlRW50cnkgeworICAgIHVuc2lnbmVkIFJhbms7CisgICAgVmFsdWUgKk9wOworICAgIFZhbHVlRW50cnkodW5zaWduZWQgUiwgVmFsdWUgKk8pIDogUmFuayhSKSwgT3AoTykge30KKyAgfTsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFZhbHVlRW50cnkgJkxIUywgY29uc3QgVmFsdWVFbnRyeSAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5SYW5rID4gUkhTLlJhbms7ICAgLy8gU29ydCBzbyB0aGF0IGhpZ2hlc3QgcmFuayBnb2VzIHRvIHN0YXJ0LgorICB9Cit9CisKKyNpZm5kZWYgTkRFQlVHCisvLy8gUHJpbnRPcHMgLSBQcmludCBvdXQgdGhlIGV4cHJlc3Npb24gaWRlbnRpZmllZCBpbiB0aGUgT3BzIGxpc3QuCisvLy8KK3N0YXRpYyB2b2lkIFByaW50T3BzKEluc3RydWN0aW9uICpJLCBjb25zdCBTbWFsbFZlY3RvckltcGw8VmFsdWVFbnRyeT4gJk9wcykgeworICBNb2R1bGUgKk0gPSBJLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICBkYmdzKCkgPDwgSW5zdHJ1Y3Rpb246OmdldE9wY29kZU5hbWUoSS0+Z2V0T3Bjb2RlKCkpIDw8ICIgIgorICAgICAgIDw8ICpPcHNbMF0uT3AtPmdldFR5cGUoKSA8PCAnXHQnOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBkYmdzKCkgPDwgIlsgIjsKKyAgICBXcml0ZUFzT3BlcmFuZChkYmdzKCksIE9wc1tpXS5PcCwgZmFsc2UsIE0pOworICAgIGRiZ3MoKSA8PCAiLCAjIiA8PCBPcHNbaV0uUmFuayA8PCAiXSAiOworICB9Cit9CisjZW5kaWYKKyAgCituYW1lc3BhY2UgeworICBjbGFzcyBSZWFzc29jaWF0ZSA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICAgIERlbnNlTWFwPEJhc2ljQmxvY2sqLCB1bnNpZ25lZD4gUmFua01hcDsKKyAgICBEZW5zZU1hcDxBc3NlcnRpbmdWSDw+LCB1bnNpZ25lZD4gVmFsdWVSYW5rTWFwOworICAgIGJvb2wgTWFkZUNoYW5nZTsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgUmVhc3NvY2lhdGUoKSA6IEZ1bmN0aW9uUGFzcyhJRCkge30KKworICAgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQ0ZHKCk7CisgICAgfQorICBwcml2YXRlOgorICAgIHZvaWQgQnVpbGRSYW5rTWFwKEZ1bmN0aW9uICZGKTsKKyAgICB1bnNpZ25lZCBnZXRSYW5rKFZhbHVlICpWKTsKKyAgICBWYWx1ZSAqUmVhc3NvY2lhdGVFeHByZXNzaW9uKEJpbmFyeU9wZXJhdG9yICpJKTsKKyAgICB2b2lkIFJld3JpdGVFeHByVHJlZShCaW5hcnlPcGVyYXRvciAqSSwgU21hbGxWZWN0b3JJbXBsPFZhbHVlRW50cnk+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSWR4ID0gMCk7CisgICAgVmFsdWUgKk9wdGltaXplRXhwcmVzc2lvbihCaW5hcnlPcGVyYXRvciAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxWYWx1ZUVudHJ5PiAmT3BzKTsKKyAgICBWYWx1ZSAqT3B0aW1pemVBZGQoSW5zdHJ1Y3Rpb24gKkksIFNtYWxsVmVjdG9ySW1wbDxWYWx1ZUVudHJ5PiAmT3BzKTsKKyAgICB2b2lkIExpbmVhcml6ZUV4cHJUcmVlKEJpbmFyeU9wZXJhdG9yICpJLCBTbWFsbFZlY3RvckltcGw8VmFsdWVFbnRyeT4gJk9wcyk7CisgICAgdm9pZCBMaW5lYXJpemVFeHByKEJpbmFyeU9wZXJhdG9yICpJKTsKKyAgICBWYWx1ZSAqUmVtb3ZlRmFjdG9yRnJvbUV4cHJlc3Npb24oVmFsdWUgKlYsIFZhbHVlICpGYWN0b3IpOworICAgIHZvaWQgUmVhc3NvY2lhdGVCQihCYXNpY0Jsb2NrICpCQik7CisgICAgCisgICAgdm9pZCBSZW1vdmVEZWFkQmluYXJ5T3AoVmFsdWUgKlYpOworICB9OworfQorCitjaGFyIFJlYXNzb2NpYXRlOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoUmVhc3NvY2lhdGUsICJyZWFzc29jaWF0ZSIsCisgICAgICAgICAgICAgICAgIlJlYXNzb2NpYXRlIGV4cHJlc3Npb25zIiwgZmFsc2UsIGZhbHNlKTsKKworLy8gUHVibGljIGludGVyZmFjZSB0byB0aGUgUmVhc3NvY2lhdGUgcGFzcworRnVuY3Rpb25QYXNzICpsbHZtOjpjcmVhdGVSZWFzc29jaWF0ZVBhc3MoKSB7IHJldHVybiBuZXcgUmVhc3NvY2lhdGUoKTsgfQorCit2b2lkIFJlYXNzb2NpYXRlOjpSZW1vdmVEZWFkQmluYXJ5T3AoVmFsdWUgKlYpIHsKKyAgSW5zdHJ1Y3Rpb24gKk9wID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpOworICBpZiAoIU9wIHx8ICFpc2E8QmluYXJ5T3BlcmF0b3I+KE9wKSB8fCAhT3AtPnVzZV9lbXB0eSgpKQorICAgIHJldHVybjsKKyAgCisgIFZhbHVlICpMSFMgPSBPcC0+Z2V0T3BlcmFuZCgwKSwgKlJIUyA9IE9wLT5nZXRPcGVyYW5kKDEpOworICAKKyAgVmFsdWVSYW5rTWFwLmVyYXNlKE9wKTsKKyAgT3AtPmVyYXNlRnJvbVBhcmVudCgpOworICBSZW1vdmVEZWFkQmluYXJ5T3AoTEhTKTsKKyAgUmVtb3ZlRGVhZEJpbmFyeU9wKFJIUyk7Cit9CisKKworc3RhdGljIGJvb2wgaXNVbm1vdmFibGVJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSkgeworICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlBISSB8fAorICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFsbG9jYSB8fAorICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkxvYWQgfHwKKyAgICAgIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpDYWxsIHx8CisgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6VURpdiB8fCAKKyAgICAgIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTRGl2IHx8CisgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkRpdiB8fAorICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlVSZW0gfHwKKyAgICAgIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTUmVtIHx8CisgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RlJlbSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlYXNzb2NpYXRlOjpCdWlsZFJhbmtNYXAoRnVuY3Rpb24gJkYpIHsKKyAgdW5zaWduZWQgaSA9IDI7CisKKyAgLy8gQXNzaWduIGRpc3RpbmN0IHJhbmtzIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cworICBmb3IgKEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgSSA9IEYuYXJnX2JlZ2luKCksIEUgPSBGLmFyZ19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgVmFsdWVSYW5rTWFwWyYqSV0gPSArK2k7CisKKyAgUmV2ZXJzZVBvc3RPcmRlclRyYXZlcnNhbDxGdW5jdGlvbio+IFJQT1QoJkYpOworICBmb3IgKFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWw8RnVuY3Rpb24qPjo6cnBvX2l0ZXJhdG9yIEkgPSBSUE9ULmJlZ2luKCksCisgICAgICAgICBFID0gUlBPVC5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBCYXNpY0Jsb2NrICpCQiA9ICpJOworICAgIHVuc2lnbmVkIEJCUmFuayA9IFJhbmtNYXBbQkJdID0gKytpIDw8IDE2OworCisgICAgLy8gV2FsayB0aGUgYmFzaWMgYmxvY2ssIGFkZGluZyBwcmVjb21wdXRlZCByYW5rcyBmb3IgYW55IGluc3RydWN0aW9ucyB0aGF0CisgICAgLy8gd2UgY2Fubm90IG1vdmUuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcmFua3MgZm9yIHRoZXNlIGluc3RydWN0aW9ucyBhcmUKKyAgICAvLyBhbGwgZGlmZmVyZW50IGluIHRoZSBibG9jay4KKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoaXNVbm1vdmFibGVJbnN0cnVjdGlvbihJKSkKKyAgICAgICAgVmFsdWVSYW5rTWFwWyYqSV0gPSArK0JCUmFuazsKKyAgfQorfQorCit1bnNpZ25lZCBSZWFzc29jaWF0ZTo6Z2V0UmFuayhWYWx1ZSAqVikgeworICBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKTsKKyAgaWYgKEkgPT0gMCkgeworICAgIGlmIChpc2E8QXJndW1lbnQ+KFYpKSByZXR1cm4gVmFsdWVSYW5rTWFwW1ZdOyAgIC8vIEZ1bmN0aW9uIGFyZ3VtZW50LgorICAgIHJldHVybiAwOyAgLy8gT3RoZXJ3aXNlIGl0J3MgYSBnbG9iYWwgb3IgY29uc3RhbnQsIHJhbmsgMC4KKyAgfQorCisgIGlmICh1bnNpZ25lZCBSYW5rID0gVmFsdWVSYW5rTWFwW0ldKQorICAgIHJldHVybiBSYW5rOyAgICAvLyBSYW5rIGFscmVhZHkga25vd24/CisKKyAgLy8gSWYgdGhpcyBpcyBhbiBleHByZXNzaW9uLCByZXR1cm4gdGhlIDErTUFYKHJhbmsoTEhTKSwgcmFuayhSSFMpKSBzbyB0aGF0CisgIC8vIHdlIGNhbiByZWFzc29jaWF0ZSBleHByZXNzaW9ucyBmb3IgY29kZSBtb3Rpb24hICBTaW5jZSB3ZSBkbyBub3QgcmVjdXJzZQorICAvLyBmb3IgUEhJIG5vZGVzLCB3ZSBjYW5ub3QgaGF2ZSBpbmZpbml0ZSByZWN1cnNpb24gaGVyZSwgYmVjYXVzZSB0aGVyZQorICAvLyBjYW5ub3QgYmUgbG9vcHMgaW4gdGhlIHZhbHVlIGdyYXBoIHRoYXQgZG8gbm90IGdvIHRocm91Z2ggUEhJIG5vZGVzLgorICB1bnNpZ25lZCBSYW5rID0gMCwgTWF4UmFuayA9IFJhbmtNYXBbSS0+Z2V0UGFyZW50KCldOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgICBpICE9IGUgJiYgUmFuayAhPSBNYXhSYW5rOyArK2kpCisgICAgUmFuayA9IHN0ZDo6bWF4KFJhbmssIGdldFJhbmsoSS0+Z2V0T3BlcmFuZChpKSkpOworCisgIC8vIElmIHRoaXMgaXMgYSBub3Qgb3IgbmVnIGluc3RydWN0aW9uLCBkbyBub3QgY291bnQgaXQgZm9yIHJhbmsuICBUaGlzCisgIC8vIGFzc3VyZXMgdXMgdGhhdCBYIGFuZCB+WCB3aWxsIGhhdmUgdGhlIHNhbWUgcmFuay4KKyAgaWYgKCFJLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkgfHwKKyAgICAgICghQmluYXJ5T3BlcmF0b3I6OmlzTm90KEkpICYmICFCaW5hcnlPcGVyYXRvcjo6aXNOZWcoSSkpKQorICAgICsrUmFuazsKKworICAvL0RFQlVHKGRiZ3MoKSA8PCAiQ2FsY3VsYXRlZCBSYW5rWyIgPDwgVi0+Z2V0TmFtZSgpIDw8ICJdID0gIgorICAvLyAgICAgPDwgUmFuayA8PCAiXG4iKTsKKworICByZXR1cm4gVmFsdWVSYW5rTWFwW0ldID0gUmFuazsKK30KKworLy8vIGlzUmVhc3NvY2lhYmxlT3AgLSBSZXR1cm4gdHJ1ZSBpZiBWIGlzIGFuIGluc3RydWN0aW9uIG9mIHRoZSBzcGVjaWZpZWQKKy8vLyBvcGNvZGUgYW5kIGlmIGl0IG9ubHkgaGFzIG9uZSB1c2UuCitzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKmlzUmVhc3NvY2lhYmxlT3AoVmFsdWUgKlYsIHVuc2lnbmVkIE9wY29kZSkgeworICBpZiAoKFYtPmhhc09uZVVzZSgpIHx8IFYtPnVzZV9lbXB0eSgpKSAmJiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmCisgICAgICBjYXN0PEluc3RydWN0aW9uPihWKS0+Z2V0T3Bjb2RlKCkgPT0gT3Bjb2RlKQorICAgIHJldHVybiBjYXN0PEJpbmFyeU9wZXJhdG9yPihWKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBMb3dlck5lZ2F0ZVRvTXVsdGlwbHkgLSBSZXBsYWNlIDAtWCB3aXRoIFgqLTEuCisvLy8KK3N0YXRpYyBJbnN0cnVjdGlvbiAqTG93ZXJOZWdhdGVUb011bHRpcGx5KEluc3RydWN0aW9uICpOZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxBc3NlcnRpbmdWSDw+LCB1bnNpZ25lZD4gJlZhbHVlUmFua01hcCkgeworICBDb25zdGFudCAqQ3N0ID0gQ29uc3RhbnQ6OmdldEFsbE9uZXNWYWx1ZShOZWctPmdldFR5cGUoKSk7CisKKyAgSW5zdHJ1Y3Rpb24gKlJlcyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVNdWwoTmVnLT5nZXRPcGVyYW5kKDEpLCBDc3QsIE5lZyk7CisgIFZhbHVlUmFua01hcC5lcmFzZShOZWcpOworICBSZXMtPnRha2VOYW1lKE5lZyk7CisgIE5lZy0+cmVwbGFjZUFsbFVzZXNXaXRoKFJlcyk7CisgIE5lZy0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIHJldHVybiBSZXM7Cit9CisKKy8vIEdpdmVuIGFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gJyhBK0IpKyhEK0MpJywgdHVybiBpdCBpbnRvICcoKChBK0IpK0MpK0QpJy4KKy8vIE5vdGUgdGhhdCBpZiBEIGlzIGFsc28gcGFydCBvZiB0aGUgZXhwcmVzc2lvbiB0cmVlIHRoYXQgd2UgcmVjdXJzZSB0bworLy8gbGluZWFyaXplIGl0IGFzIHdlbGwuICBCZXNpZGVzIHRoYXQgY2FzZSwgdGhpcyBkb2VzIG5vdCByZWN1cnNlIGludG8gQSxCLCBvcgorLy8gQy4KK3ZvaWQgUmVhc3NvY2lhdGU6OkxpbmVhcml6ZUV4cHIoQmluYXJ5T3BlcmF0b3IgKkkpIHsKKyAgQmluYXJ5T3BlcmF0b3IgKkxIUyA9IGNhc3Q8QmluYXJ5T3BlcmF0b3I+KEktPmdldE9wZXJhbmQoMCkpOworICBCaW5hcnlPcGVyYXRvciAqUkhTID0gY2FzdDxCaW5hcnlPcGVyYXRvcj4oSS0+Z2V0T3BlcmFuZCgxKSk7CisgIGFzc2VydChpc1JlYXNzb2NpYWJsZU9wKExIUywgSS0+Z2V0T3Bjb2RlKCkpICYmCisgICAgICAgICBpc1JlYXNzb2NpYWJsZU9wKFJIUywgSS0+Z2V0T3Bjb2RlKCkpICYmCisgICAgICAgICAiTm90IGFuIGV4cHJlc3Npb24gdGhhdCBuZWVkcyBsaW5lYXJpemF0aW9uPyIpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiTGluZWFyIiA8PCAqTEhTIDw8ICdcbicgPDwgKlJIUyA8PCAnXG4nIDw8ICpJIDw8ICdcbicpOworCisgIC8vIE1vdmUgdGhlIFJIUyBpbnN0cnVjdGlvbiB0byBsaXZlIGltbWVkaWF0ZWx5IGJlZm9yZSBJLCBhdm9pZGluZyBicmVha2luZworICAvLyBkb21pbmF0b3IgcHJvcGVydGllcy4KKyAgUkhTLT5tb3ZlQmVmb3JlKEkpOworCisgIC8vIE1vdmUgb3BlcmFuZHMgYXJvdW5kIHRvIGRvIHRoZSBsaW5lYXJpemF0aW9uLgorICBJLT5zZXRPcGVyYW5kKDEsIFJIUy0+Z2V0T3BlcmFuZCgwKSk7CisgIFJIUy0+c2V0T3BlcmFuZCgwLCBMSFMpOworICBJLT5zZXRPcGVyYW5kKDAsIFJIUyk7CisKKyAgKytOdW1MaW5lYXI7CisgIE1hZGVDaGFuZ2UgPSB0cnVlOworICBERUJVRyhkYmdzKCkgPDwgIkxpbmVhcml6ZWQ6ICIgPDwgKkkgPDwgJ1xuJyk7CisKKyAgLy8gSWYgRCBpcyBwYXJ0IG9mIHRoaXMgZXhwcmVzc2lvbiB0cmVlLCB0YWlsIHJlY3Vyc2UuCisgIGlmIChpc1JlYXNzb2NpYWJsZU9wKEktPmdldE9wZXJhbmQoMSksIEktPmdldE9wY29kZSgpKSkKKyAgICBMaW5lYXJpemVFeHByKEkpOworfQorCisKKy8vLyBMaW5lYXJpemVFeHByVHJlZSAtIEdpdmVuIGFuIGFzc29jaWF0aXZlIGJpbmFyeSBleHByZXNzaW9uIHRyZWUsIHRyYXZlcnNlCisvLy8gYWxsIG9mIHRoZSB1c2VzIHB1dHRpbmcgaXQgaW50byBjYW5vbmljYWwgZm9ybS4gIFRoaXMgZm9yY2VzIGEgbGVmdC1saW5lYXIKKy8vLyBmb3JtIG9mIHRoZSBleHByZXNzaW9uICgoKGErYikrYykrZCksIGFuZCBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKy8vLyByYW5rIG9mIHRoZSBub24tdHJlZSBvcGVyYW5kcy4KKy8vLworLy8vIE5PVEU6IFRoZXNlIGludGVudGlvbmFsbHkgZGVzdHJveXMgdGhlIGV4cHJlc3Npb24gdHJlZSBvcGVyYW5kcyAodHVybmluZworLy8vIHRoZW0gaW50byB1bmRlZiB2YWx1ZXMpIHRvIHJlZHVjZSAjdXNlcyBvZiB0aGUgdmFsdWVzLiAgVGhpcyBtZWFucyB0aGF0IHRoZQorLy8vIGNhbGxlciBNVVNUIHVzZSBzb21ldGhpbmcgbGlrZSBSZXdyaXRlRXhwclRyZWUgdG8gcHV0IHRoZSB2YWx1ZXMgYmFjayBpbi4KKy8vLwordm9pZCBSZWFzc29jaWF0ZTo6TGluZWFyaXplRXhwclRyZWUoQmluYXJ5T3BlcmF0b3IgKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VmFsdWVFbnRyeT4gJk9wcykgeworICBWYWx1ZSAqTEhTID0gSS0+Z2V0T3BlcmFuZCgwKSwgKlJIUyA9IEktPmdldE9wZXJhbmQoMSk7CisgIHVuc2lnbmVkIE9wY29kZSA9IEktPmdldE9wY29kZSgpOworCisgIC8vIEZpcnN0IHN0ZXAsIGxpbmVhcml6ZSB0aGUgZXhwcmVzc2lvbiBpZiBpdCBpcyBpbiAoKEErQikrKEMrRCkpIGZvcm0uCisgIEJpbmFyeU9wZXJhdG9yICpMSFNCTyA9IGlzUmVhc3NvY2lhYmxlT3AoTEhTLCBPcGNvZGUpOworICBCaW5hcnlPcGVyYXRvciAqUkhTQk8gPSBpc1JlYXNzb2NpYWJsZU9wKFJIUywgT3Bjb2RlKTsKKworICAvLyBJZiB0aGlzIGlzIGEgbXVsdGlwbHkgZXhwcmVzc2lvbiB0cmVlIGFuZCBpdCBjb250YWlucyBpbnRlcm5hbCBuZWdhdGlvbnMsCisgIC8vIHRyYW5zZm9ybSB0aGVtIGludG8gbXVsdGlwbGllcyBieSAtMSBzbyB0aGV5IGNhbiBiZSByZWFzc29jaWF0ZWQuCisgIGlmIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TXVsKSB7CisgICAgaWYgKCFMSFNCTyAmJiBMSFMtPmhhc09uZVVzZSgpICYmIEJpbmFyeU9wZXJhdG9yOjppc05lZyhMSFMpKSB7CisgICAgICBMSFMgPSBMb3dlck5lZ2F0ZVRvTXVsdGlwbHkoY2FzdDxJbnN0cnVjdGlvbj4oTEhTKSwgVmFsdWVSYW5rTWFwKTsKKyAgICAgIExIU0JPID0gaXNSZWFzc29jaWFibGVPcChMSFMsIE9wY29kZSk7CisgICAgfQorICAgIGlmICghUkhTQk8gJiYgUkhTLT5oYXNPbmVVc2UoKSAmJiBCaW5hcnlPcGVyYXRvcjo6aXNOZWcoUkhTKSkgeworICAgICAgUkhTID0gTG93ZXJOZWdhdGVUb011bHRpcGx5KGNhc3Q8SW5zdHJ1Y3Rpb24+KFJIUyksIFZhbHVlUmFua01hcCk7CisgICAgICBSSFNCTyA9IGlzUmVhc3NvY2lhYmxlT3AoUkhTLCBPcGNvZGUpOworICAgIH0KKyAgfQorCisgIGlmICghTEhTQk8pIHsKKyAgICBpZiAoIVJIU0JPKSB7CisgICAgICAvLyBOZWl0aGVyIHRoZSBMSFMgb3IgUkhTIGFzIHBhcnQgb2YgdGhlIHRyZWUsIHRodXMgdGhpcyBpcyBhIGxlYWYuICBBcworICAgICAgLy8gc3VjaCwganVzdCByZW1lbWJlciB0aGVzZSBvcGVyYW5kcyBhbmQgdGhlaXIgcmFuay4KKyAgICAgIE9wcy5wdXNoX2JhY2soVmFsdWVFbnRyeShnZXRSYW5rKExIUyksIExIUykpOworICAgICAgT3BzLnB1c2hfYmFjayhWYWx1ZUVudHJ5KGdldFJhbmsoUkhTKSwgUkhTKSk7CisgICAgICAKKyAgICAgIC8vIENsZWFyIHRoZSBsZWF2ZXMgb3V0LgorICAgICAgSS0+c2V0T3BlcmFuZCgwLCBVbmRlZlZhbHVlOjpnZXQoSS0+Z2V0VHlwZSgpKSk7CisgICAgICBJLT5zZXRPcGVyYW5kKDEsIFVuZGVmVmFsdWU6OmdldChJLT5nZXRUeXBlKCkpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgLy8gVHVybiBYKyhZK1opIC0+IChZK1opK1gKKyAgICBzdGQ6OnN3YXAoTEhTQk8sIFJIU0JPKTsKKyAgICBzdGQ6OnN3YXAoTEhTLCBSSFMpOworICAgIGJvb2wgU3VjY2VzcyA9ICFJLT5zd2FwT3BlcmFuZHMoKTsKKyAgICBhc3NlcnQoU3VjY2VzcyAmJiAic3dhcE9wZXJhbmRzIGZhaWxlZCIpOworICAgIFN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChSSFNCTykgeworICAgIC8vIFR1cm4gKEErQikrKEMrRCkgLT4gKCgoQStCKStDKStEKS4gIFRoaXMgZ3VhcmFudGVlcyB0aGUgUkhTIGlzIG5vdAorICAgIC8vIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gdHJlZS4KKyAgICBMaW5lYXJpemVFeHByKEkpOworICAgIExIUyA9IExIU0JPID0gY2FzdDxCaW5hcnlPcGVyYXRvcj4oSS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgUkhTID0gSS0+Z2V0T3BlcmFuZCgxKTsKKyAgICBSSFNCTyA9IDA7CisgIH0KKworICAvLyBPa2F5LCBub3cgd2Uga25vdyB0aGF0IHRoZSBMSFMgaXMgYSBuZXN0ZWQgZXhwcmVzc2lvbiBhbmQgdGhhdCB0aGUgUkhTIGlzCisgIC8vIG5vdC4gIFBlcmZvcm0gcmVhc3NvY2lhdGlvbi4KKyAgYXNzZXJ0KCFpc1JlYXNzb2NpYWJsZU9wKFJIUywgT3Bjb2RlKSAmJiAiTGluZWFyaXplRXhwciBmYWlsZWQhIik7CisKKyAgLy8gTW92ZSBMSFMgcmlnaHQgYmVmb3JlIEkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRyZWUgZXhwcmVzc2lvbiBkb21pbmF0ZXMgYWxsCisgIC8vIHZhbHVlcy4KKyAgTEhTQk8tPm1vdmVCZWZvcmUoSSk7CisKKyAgLy8gTGluZWFyaXplIHRoZSBleHByZXNzaW9uIHRyZWUgb24gdGhlIExIUy4KKyAgTGluZWFyaXplRXhwclRyZWUoTEhTQk8sIE9wcyk7CisKKyAgLy8gUmVtZW1iZXIgdGhlIFJIUyBvcGVyYW5kIGFuZCBpdHMgcmFuay4KKyAgT3BzLnB1c2hfYmFjayhWYWx1ZUVudHJ5KGdldFJhbmsoUkhTKSwgUkhTKSk7CisgIAorICAvLyBDbGVhciB0aGUgUkhTIGxlYWYgb3V0LgorICBJLT5zZXRPcGVyYW5kKDEsIFVuZGVmVmFsdWU6OmdldChJLT5nZXRUeXBlKCkpKTsKK30KKworLy8gUmV3cml0ZUV4cHJUcmVlIC0gTm93IHRoYXQgdGhlIG9wZXJhbmRzIGZvciB0aGlzIGV4cHJlc3Npb24gdHJlZSBhcmUKKy8vIGxpbmVhcml6ZWQgYW5kIG9wdGltaXplZCwgZW1pdCB0aGVtIGluLW9yZGVyLiAgVGhpcyBmdW5jdGlvbiBpcyB3cml0dGVuIHRvIGJlCisvLyB0YWlsIHJlY3Vyc2l2ZS4KK3ZvaWQgUmVhc3NvY2lhdGU6OlJld3JpdGVFeHByVHJlZShCaW5hcnlPcGVyYXRvciAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VmFsdWVFbnRyeT4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpKSB7CisgIGlmIChpKzIgPT0gT3BzLnNpemUoKSkgeworICAgIGlmIChJLT5nZXRPcGVyYW5kKDApICE9IE9wc1tpXS5PcCB8fAorICAgICAgICBJLT5nZXRPcGVyYW5kKDEpICE9IE9wc1tpKzFdLk9wKSB7CisgICAgICBWYWx1ZSAqT2xkTEhTID0gSS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUkE6ICIgPDwgKkkgPDwgJ1xuJyk7CisgICAgICBJLT5zZXRPcGVyYW5kKDAsIE9wc1tpXS5PcCk7CisgICAgICBJLT5zZXRPcGVyYW5kKDEsIE9wc1tpKzFdLk9wKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiVE86ICIgPDwgKkkgPDwgJ1xuJyk7CisgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICsrTnVtQ2hhbmdlZDsKKyAgICAgIAorICAgICAgLy8gSWYgd2UgcmVhc3NvY2lhdGVkIGEgdHJlZSB0byBmZXdlciBvcGVyYW5kcyAoZS5nLiAoMSthKzIpIC0+IChhKzMpCisgICAgICAvLyBkZWxldGUgdGhlIGV4dHJhLCBub3cgZGVhZCwgbm9kZXMuCisgICAgICBSZW1vdmVEZWFkQmluYXJ5T3AoT2xkTEhTKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGFzc2VydChpKzIgPCBPcHMuc2l6ZSgpICYmICJPcHMgaW5kZXggb3V0IG9mIHJhbmdlISIpOworCisgIGlmIChJLT5nZXRPcGVyYW5kKDEpICE9IE9wc1tpXS5PcCkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiUkE6ICIgPDwgKkkgPDwgJ1xuJyk7CisgICAgSS0+c2V0T3BlcmFuZCgxLCBPcHNbaV0uT3ApOworICAgIERFQlVHKGRiZ3MoKSA8PCAiVE86ICIgPDwgKkkgPDwgJ1xuJyk7CisgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgKytOdW1DaGFuZ2VkOworICB9CisgIAorICBCaW5hcnlPcGVyYXRvciAqTEhTID0gY2FzdDxCaW5hcnlPcGVyYXRvcj4oSS0+Z2V0T3BlcmFuZCgwKSk7CisgIGFzc2VydChMSFMtPmdldE9wY29kZSgpID09IEktPmdldE9wY29kZSgpICYmCisgICAgICAgICAiSW1wcm9wZXIgZXhwcmVzc2lvbiB0cmVlISIpOworICAKKyAgLy8gQ29tcGFjdGlmeSB0aGUgdHJlZSBpbnN0cnVjdGlvbnMgdG9nZXRoZXIgd2l0aCBlYWNoIG90aGVyIHRvIGd1YXJhbnRlZQorICAvLyB0aGF0IHRoZSBleHByZXNzaW9uIHRyZWUgaXMgZG9taW5hdGVkIGJ5IGFsbCBvZiBPcHMuCisgIExIUy0+bW92ZUJlZm9yZShJKTsKKyAgUmV3cml0ZUV4cHJUcmVlKExIUywgT3BzLCBpKzEpOworfQorCisKKworLy8gTmVnYXRlVmFsdWUgLSBJbnNlcnQgaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlZCB0byBieSBCSSwKKy8vIHRoYXQgY29tcHV0ZXMgdGhlIG5lZ2F0aXZlIHZlcnNpb24gb2YgdGhlIHZhbHVlIHNwZWNpZmllZC4gIFRoZSBuZWdhdGl2ZQorLy8gdmVyc2lvbiBvZiB0aGUgdmFsdWUgaXMgcmV0dXJuZWQsIGFuZCBCSSBpcyBsZWZ0IHBvaW50aW5nIGF0IHRoZSBpbnN0cnVjdGlvbgorLy8gdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkIG5leHQgYnkgdGhlIHJlYXNzb2NpYXRpb24gcGFzcy4KKy8vCitzdGF0aWMgVmFsdWUgKk5lZ2F0ZVZhbHVlKFZhbHVlICpWLCBJbnN0cnVjdGlvbiAqQkkpIHsKKyAgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE5lZyhDKTsKKyAgCisgIC8vIFdlIGFyZSB0cnlpbmcgdG8gZXhwb3NlIG9wcG9ydHVuaXR5IGZvciByZWFzc29jaWF0aW9uLiAgT25lIG9mIHRoZSB0aGluZ3MKKyAgLy8gdGhhdCB3ZSB3YW50IHRvIGRvIHRvIGFjaGlldmUgdGhpcyBpcyB0byBwdXNoIGEgbmVnYXRpb24gYXMgZGVlcCBpbnRvIGFuCisgIC8vIGV4cHJlc3Npb24gY2hhaW4gYXMgcG9zc2libGUsIHRvIGV4cG9zZSB0aGUgYWRkIGluc3RydWN0aW9ucy4gIEluIHByYWN0aWNlLAorICAvLyB0aGlzIG1lYW5zIHRoYXQgd2UgdHVybiB0aGlzOgorICAvLyAgIFggPSAtKEErMTIrQytEKSAgIGludG8gICAgWCA9IC1BICsgLTEyICsgLUMgKyAtRCA9IC0xMiArIC1BICsgLUMgKyAtRAorICAvLyBzbyB0aGF0IGxhdGVyLCBhOiBZID0gMTIrWCBjb3VsZCBnZXQgcmVhc3NvY2lhdGVkIHdpdGggdGhlIC0xMiB0byBlbGltaW5hdGUKKyAgLy8gdGhlIGNvbnN0YW50cy4gIFdlIGFzc3VtZSB0aGF0IGluc3Rjb21iaW5lIHdpbGwgY2xlYW4gdXAgdGhlIG1lc3MgbGF0ZXIgaWYKKyAgLy8gd2UgaW50cm9kdWNlIHRvbnMgb2YgdW5uZWNlc3NhcnkgbmVnYXRpb24gaW5zdHJ1Y3Rpb25zLgorICAvLworICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpCisgICAgaWYgKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQgJiYgSS0+aGFzT25lVXNlKCkpIHsKKyAgICAgIC8vIFB1c2ggdGhlIG5lZ2F0ZXMgdGhyb3VnaCB0aGUgYWRkLgorICAgICAgSS0+c2V0T3BlcmFuZCgwLCBOZWdhdGVWYWx1ZShJLT5nZXRPcGVyYW5kKDApLCBCSSkpOworICAgICAgSS0+c2V0T3BlcmFuZCgxLCBOZWdhdGVWYWx1ZShJLT5nZXRPcGVyYW5kKDEpLCBCSSkpOworCisgICAgICAvLyBXZSBtdXN0IG1vdmUgdGhlIGFkZCBpbnN0cnVjdGlvbiBoZXJlLCBiZWNhdXNlIHRoZSBuZWcgaW5zdHJ1Y3Rpb25zIGRvCisgICAgICAvLyBub3QgZG9taW5hdGUgdGhlIG9sZCBhZGQgaW5zdHJ1Y3Rpb24gaW4gZ2VuZXJhbC4gIEJ5IG1vdmluZyBpdCwgd2UgYXJlCisgICAgICAvLyBhc3N1cmVkIHRoYXQgdGhlIG5lZyBpbnN0cnVjdGlvbnMgd2UganVzdCBpbnNlcnRlZCBkb21pbmF0ZSB0aGUgCisgICAgICAvLyBpbnN0cnVjdGlvbiB3ZSBhcmUgYWJvdXQgdG8gaW5zZXJ0IGFmdGVyIHRoZW0uCisgICAgICAvLworICAgICAgSS0+bW92ZUJlZm9yZShCSSk7CisgICAgICBJLT5zZXROYW1lKEktPmdldE5hbWUoKSsiLm5lZyIpOworICAgICAgcmV0dXJuIEk7CisgICAgfQorICAKKyAgLy8gT2theSwgd2UgbmVlZCB0byBtYXRlcmlhbGl6ZSBhIG5lZ2F0ZWQgdmVyc2lvbiBvZiBWIHdpdGggYW4gaW5zdHJ1Y3Rpb24uCisgIC8vIFNjYW4gdGhlIHVzZSBsaXN0cyBvZiBWIHRvIHNlZSBpZiB3ZSBoYXZlIG9uZSBhbHJlYWR5LgorICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsgVUkgIT0gRTsrK1VJKXsKKyAgICBVc2VyICpVID0gKlVJOworICAgIGlmICghQmluYXJ5T3BlcmF0b3I6OmlzTmVnKFUpKSBjb250aW51ZTsKKworICAgIC8vIFdlIGZvdW5kIG9uZSEgIE5vdyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWZpbml0aW9uIGRvbWluYXRlcworICAgIC8vIHRoaXMgdXNlLiAgV2UgZG8gdGhpcyBieSBtb3ZpbmcgaXQgdG8gdGhlIGVudHJ5IGJsb2NrIChpZiBpdCBpcyBhCisgICAgLy8gbm9uLWluc3RydWN0aW9uIHZhbHVlKSBvciByaWdodCBhZnRlciB0aGUgZGVmaW5pdGlvbi4gIFRoZXNlIG5lZ2F0ZXMgd2lsbAorICAgIC8vIGJlIHphcHBlZCBieSByZWFzc29jaWF0ZSBsYXRlciwgc28gd2UgZG9uJ3QgbmVlZCBtdWNoIGZpbmVzc2UgaGVyZS4KKyAgICBCaW5hcnlPcGVyYXRvciAqVGhlTmVnID0gY2FzdDxCaW5hcnlPcGVyYXRvcj4oVSk7CisKKyAgICAvLyBWZXJpZnkgdGhhdCB0aGUgbmVnYXRlIGlzIGluIHRoaXMgZnVuY3Rpb24sIFYgbWlnaHQgYmUgYSBjb25zdGFudCBleHByLgorICAgIGlmIChUaGVOZWctPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKSAhPSBCSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQ7CisgICAgaWYgKEluc3RydWN0aW9uICpJbnN0SW5wdXQgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpIHsKKyAgICAgIHsKKyAgICAgICAgSW5zZXJ0UHQgPSBJbnN0SW5wdXQ7CisgICAgICAgICsrSW5zZXJ0UHQ7CisgICAgICB9CisgICAgICB3aGlsZSAoaXNhPFBISU5vZGU+KEluc2VydFB0KSkgKytJbnNlcnRQdDsKKyAgICB9IGVsc2UgeworICAgICAgSW5zZXJ0UHQgPSBUaGVOZWctPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0RW50cnlCbG9jaygpLmJlZ2luKCk7CisgICAgfQorICAgIFRoZU5lZy0+bW92ZUJlZm9yZShJbnNlcnRQdCk7CisgICAgcmV0dXJuIFRoZU5lZzsKKyAgfQorCisgIC8vIEluc2VydCBhICduZWcnIGluc3RydWN0aW9uIHRoYXQgc3VidHJhY3RzIHRoZSB2YWx1ZSBmcm9tIHplcm8gdG8gZ2V0IHRoZQorICAvLyBuZWdhdGlvbi4KKyAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOZWcoViwgQkkpOworfQorCisvLy8gU2hvdWxkQnJlYWtVcFN1YnRyYWN0IC0gUmV0dXJuIHRydWUgaWYgd2Ugc2hvdWxkIGJyZWFrIHVwIHRoaXMgc3VidHJhY3Qgb2YKKy8vLyBYLVkgaW50byAoWCArIC1ZKS4KK3N0YXRpYyBib29sIFNob3VsZEJyZWFrVXBTdWJ0cmFjdChJbnN0cnVjdGlvbiAqU3ViKSB7CisgIC8vIElmIHRoaXMgaXMgYSBuZWdhdGlvbiwgd2UgY2FuJ3Qgc3BsaXQgaXQgdXAhCisgIGlmIChCaW5hcnlPcGVyYXRvcjo6aXNOZWcoU3ViKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICAvLyBEb24ndCBib3RoZXIgdG8gYnJlYWsgdGhpcyB1cCB1bmxlc3MgZWl0aGVyIHRoZSBMSFMgaXMgYW4gYXNzb2NpYWJsZSBhZGQgb3IKKyAgLy8gc3VidHJhY3Qgb3IgaWYgdGhpcyBpcyBvbmx5IHVzZWQgYnkgb25lLgorICBpZiAoaXNSZWFzc29jaWFibGVPcChTdWItPmdldE9wZXJhbmQoMCksIEluc3RydWN0aW9uOjpBZGQpIHx8CisgICAgICBpc1JlYXNzb2NpYWJsZU9wKFN1Yi0+Z2V0T3BlcmFuZCgwKSwgSW5zdHJ1Y3Rpb246OlN1YikpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChpc1JlYXNzb2NpYWJsZU9wKFN1Yi0+Z2V0T3BlcmFuZCgxKSwgSW5zdHJ1Y3Rpb246OkFkZCkgfHwKKyAgICAgIGlzUmVhc3NvY2lhYmxlT3AoU3ViLT5nZXRPcGVyYW5kKDEpLCBJbnN0cnVjdGlvbjo6U3ViKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKFN1Yi0+aGFzT25lVXNlKCkgJiYgCisgICAgICAoaXNSZWFzc29jaWFibGVPcChTdWItPnVzZV9iYWNrKCksIEluc3RydWN0aW9uOjpBZGQpIHx8CisgICAgICAgaXNSZWFzc29jaWFibGVPcChTdWItPnVzZV9iYWNrKCksIEluc3RydWN0aW9uOjpTdWIpKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gQnJlYWtVcFN1YnRyYWN0IC0gSWYgd2UgaGF2ZSAoWC1ZKSwgYW5kIGlmIGVpdGhlciBYIGlzIGFuIGFkZCwgb3IgaWYgdGhpcyBpcworLy8vIG9ubHkgdXNlZCBieSBhbiBhZGQsIHRyYW5zZm9ybSB0aGlzIGludG8gKFgrKDAtWSkpIHRvIHByb21vdGUgYmV0dGVyCisvLy8gcmVhc3NvY2lhdGlvbi4KK3N0YXRpYyBJbnN0cnVjdGlvbiAqQnJlYWtVcFN1YnRyYWN0KEluc3RydWN0aW9uICpTdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxBc3NlcnRpbmdWSDw+LCB1bnNpZ25lZD4gJlZhbHVlUmFua01hcCkgeworICAvLyBDb252ZXJ0IGEgc3VidHJhY3QgaW50byBhbiBhZGQgYW5kIGEgbmVnIGluc3RydWN0aW9uLiBUaGlzIGFsbG93cyBzdWIKKyAgLy8gaW5zdHJ1Y3Rpb25zIHRvIGJlIGNvbW11dGVkIHdpdGggb3RoZXIgYWRkIGluc3RydWN0aW9ucy4KKyAgLy8KKyAgLy8gQ2FsY3VsYXRlIHRoZSBuZWdhdGl2ZSB2YWx1ZSBvZiBPcGVyYW5kIDEgb2YgdGhlIHN1YiBpbnN0cnVjdGlvbiwKKyAgLy8gYW5kIHNldCBpdCBhcyB0aGUgUkhTIG9mIHRoZSBhZGQgaW5zdHJ1Y3Rpb24gd2UganVzdCBtYWRlLgorICAvLworICBWYWx1ZSAqTmVnVmFsID0gTmVnYXRlVmFsdWUoU3ViLT5nZXRPcGVyYW5kKDEpLCBTdWIpOworICBJbnN0cnVjdGlvbiAqTmV3ID0KKyAgICBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKFN1Yi0+Z2V0T3BlcmFuZCgwKSwgTmVnVmFsLCBTdWIpOworICBOZXctPnRha2VOYW1lKFN1Yik7CisKKyAgLy8gRXZlcnlvbmUgbm93IHJlZmVycyB0byB0aGUgYWRkIGluc3RydWN0aW9uLgorICBWYWx1ZVJhbmtNYXAuZXJhc2UoU3ViKTsKKyAgU3ViLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3KTsKKyAgU3ViLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICBERUJVRyhkYmdzKCkgPDwgIk5lZ2F0ZWQ6ICIgPDwgKk5ldyA8PCAnXG4nKTsKKyAgcmV0dXJuIE5ldzsKK30KKworLy8vIENvbnZlcnRTaGlmdFRvTXVsIC0gSWYgdGhpcyBpcyBhIHNoaWZ0IG9mIGEgcmVhc3NvY2lhYmxlIG11bHRpcGx5IG9yIGlzIHVzZWQKKy8vLyBieSBvbmUsIGNoYW5nZSB0aGlzIGludG8gYSBtdWx0aXBseSBieSBhIGNvbnN0YW50IHRvIGFzc2lzdCB3aXRoIGZ1cnRoZXIKKy8vLyByZWFzc29jaWF0aW9uLgorc3RhdGljIEluc3RydWN0aW9uICpDb252ZXJ0U2hpZnRUb011bChJbnN0cnVjdGlvbiAqU2hsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPEFzc2VydGluZ1ZIPD4sIHVuc2lnbmVkPiAmVmFsdWVSYW5rTWFwKSB7CisgIC8vIElmIGFuIG9wZXJhbmQgb2YgdGhpcyBzaGlmdCBpcyBhIHJlYXNzb2NpYWJsZSBtdWx0aXBseSwgb3IgaWYgdGhlIHNoaWZ0CisgIC8vIGlzIHVzZWQgYnkgYSByZWFzc29jaWFibGUgbXVsdGlwbHkgb3IgYWRkLCB0dXJuIGludG8gYSBtdWx0aXBseS4KKyAgaWYgKGlzUmVhc3NvY2lhYmxlT3AoU2hsLT5nZXRPcGVyYW5kKDApLCBJbnN0cnVjdGlvbjo6TXVsKSB8fAorICAgICAgKFNobC0+aGFzT25lVXNlKCkgJiYgCisgICAgICAgKGlzUmVhc3NvY2lhYmxlT3AoU2hsLT51c2VfYmFjaygpLCBJbnN0cnVjdGlvbjo6TXVsKSB8fAorICAgICAgICBpc1JlYXNzb2NpYWJsZU9wKFNobC0+dXNlX2JhY2soKSwgSW5zdHJ1Y3Rpb246OkFkZCkpKSkgeworICAgIENvbnN0YW50ICpNdWxDc3QgPSBDb25zdGFudEludDo6Z2V0KFNobC0+Z2V0VHlwZSgpLCAxKTsKKyAgICBNdWxDc3QgPSBDb25zdGFudEV4cHI6OmdldFNobChNdWxDc3QsIGNhc3Q8Q29uc3RhbnQ+KFNobC0+Z2V0T3BlcmFuZCgxKSkpOworICAgIAorICAgIEluc3RydWN0aW9uICpNdWwgPQorICAgICAgQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU11bChTaGwtPmdldE9wZXJhbmQoMCksIE11bENzdCwgU2hsKTsKKyAgICBWYWx1ZVJhbmtNYXAuZXJhc2UoU2hsKTsKKyAgICBNdWwtPnRha2VOYW1lKFNobCk7CisgICAgU2hsLT5yZXBsYWNlQWxsVXNlc1dpdGgoTXVsKTsKKyAgICBTaGwtPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybiBNdWw7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIFNjYW4gYmFja3dhcmRzIGFuZCBmb3J3YXJkcyBhbW9uZyB2YWx1ZXMgd2l0aCB0aGUgc2FtZSByYW5rIGFzIGVsZW1lbnQgaSB0bworLy8gc2VlIGlmIFggZXhpc3RzLiAgSWYgWCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGkuICBUaGlzIGlzIHVzZWZ1bCB3aGVuCisvLyBzY2FubmluZyBmb3IgJ3gnIHdoZW4gd2Ugc2VlICcteCcgYmVjYXVzZSB0aGV5IGJvdGggZ2V0IHRoZSBzYW1lIHJhbmsuCitzdGF0aWMgdW5zaWduZWQgRmluZEluT3BlcmFuZExpc3QoU21hbGxWZWN0b3JJbXBsPFZhbHVlRW50cnk+ICZPcHMsIHVuc2lnbmVkIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlgpIHsKKyAgdW5zaWduZWQgWFJhbmsgPSBPcHNbaV0uUmFuazsKKyAgdW5zaWduZWQgZSA9IE9wcy5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaiA9IGkrMTsgaiAhPSBlICYmIE9wc1tqXS5SYW5rID09IFhSYW5rOyArK2opCisgICAgaWYgKE9wc1tqXS5PcCA9PSBYKQorICAgICAgcmV0dXJuIGo7CisgIC8vIFNjYW4gYmFja3dhcmRzLgorICBmb3IgKHVuc2lnbmVkIGogPSBpLTE7IGogIT0gfjBVICYmIE9wc1tqXS5SYW5rID09IFhSYW5rOyAtLWopCisgICAgaWYgKE9wc1tqXS5PcCA9PSBYKQorICAgICAgcmV0dXJuIGo7CisgIHJldHVybiBpOworfQorCisvLy8gRW1pdEFkZFRyZWVPZlZhbHVlcyAtIEVtaXQgYSB0cmVlIG9mIGFkZCBpbnN0cnVjdGlvbnMsIHN1bW1pbmcgT3BzIHRvZ2V0aGVyCisvLy8gYW5kIHJldHVybmluZyB0aGUgcmVzdWx0LiAgSW5zZXJ0IHRoZSB0cmVlIGJlZm9yZSBJLgorc3RhdGljIFZhbHVlICpFbWl0QWRkVHJlZU9mVmFsdWVzKEluc3RydWN0aW9uICpJLCBTbWFsbFZlY3RvckltcGw8VmFsdWUqPiAmT3BzKXsKKyAgaWYgKE9wcy5zaXplKCkgPT0gMSkgcmV0dXJuIE9wcy5iYWNrKCk7CisgIAorICBWYWx1ZSAqVjEgPSBPcHMuYmFjaygpOworICBPcHMucG9wX2JhY2soKTsKKyAgVmFsdWUgKlYyID0gRW1pdEFkZFRyZWVPZlZhbHVlcyhJLCBPcHMpOworICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChWMiwgVjEsIEkpOworfQorCisvLy8gUmVtb3ZlRmFjdG9yRnJvbUV4cHJlc3Npb24gLSBJZiBWIGlzIGFuIGV4cHJlc3Npb24gdHJlZSB0aGF0IGlzIGEgCisvLy8gbXVsdGlwbGljYXRpb24gc2VxdWVuY2UsIGFuZCBpZiB0aGlzIHNlcXVlbmNlIGNvbnRhaW5zIGEgbXVsdGlwbHkgYnkgRmFjdG9yLAorLy8vIHJlbW92ZSBGYWN0b3IgZnJvbSB0aGUgdHJlZSBhbmQgcmV0dXJuIHRoZSBuZXcgdHJlZS4KK1ZhbHVlICpSZWFzc29jaWF0ZTo6UmVtb3ZlRmFjdG9yRnJvbUV4cHJlc3Npb24oVmFsdWUgKlYsIFZhbHVlICpGYWN0b3IpIHsKKyAgQmluYXJ5T3BlcmF0b3IgKkJPID0gaXNSZWFzc29jaWFibGVPcChWLCBJbnN0cnVjdGlvbjo6TXVsKTsKKyAgaWYgKCFCTykgcmV0dXJuIDA7CisgIAorICBTbWFsbFZlY3RvcjxWYWx1ZUVudHJ5LCA4PiBGYWN0b3JzOworICBMaW5lYXJpemVFeHByVHJlZShCTywgRmFjdG9ycyk7CisKKyAgYm9vbCBGb3VuZEZhY3RvciA9IGZhbHNlOworICBib29sIE5lZWRzTmVnYXRlID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGYWN0b3JzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoRmFjdG9yc1tpXS5PcCA9PSBGYWN0b3IpIHsKKyAgICAgIEZvdW5kRmFjdG9yID0gdHJ1ZTsKKyAgICAgIEZhY3RvcnMuZXJhc2UoRmFjdG9ycy5iZWdpbigpK2kpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIC8vIElmIHRoaXMgaXMgYSBuZWdhdGl2ZSB2ZXJzaW9uIG9mIHRoaXMgZmFjdG9yLCByZW1vdmUgaXQuCisgICAgaWYgKENvbnN0YW50SW50ICpGQzEgPSBkeW5fY2FzdDxDb25zdGFudEludD4oRmFjdG9yKSkKKyAgICAgIGlmIChDb25zdGFudEludCAqRkMyID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEZhY3RvcnNbaV0uT3ApKQorICAgICAgICBpZiAoRkMxLT5nZXRWYWx1ZSgpID09IC1GQzItPmdldFZhbHVlKCkpIHsKKyAgICAgICAgICBGb3VuZEZhY3RvciA9IE5lZWRzTmVnYXRlID0gdHJ1ZTsKKyAgICAgICAgICBGYWN0b3JzLmVyYXNlKEZhY3RvcnMuYmVnaW4oKStpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICB9CisgIAorICBpZiAoIUZvdW5kRmFjdG9yKSB7CisgICAgLy8gTWFrZSBzdXJlIHRvIHJlc3RvcmUgdGhlIG9wZXJhbmRzIHRvIHRoZSBleHByZXNzaW9uIHRyZWUuCisgICAgUmV3cml0ZUV4cHJUcmVlKEJPLCBGYWN0b3JzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQgPSBCTzsgKytJbnNlcnRQdDsKKyAgCisgIC8vIElmIHRoaXMgd2FzIGp1c3QgYSBzaW5nbGUgbXVsdGlwbHksIHJlbW92ZSB0aGUgbXVsdGlwbHkgYW5kIHJldHVybiB0aGUgb25seQorICAvLyByZW1haW5pbmcgb3BlcmFuZC4KKyAgaWYgKEZhY3RvcnMuc2l6ZSgpID09IDEpIHsKKyAgICBWYWx1ZVJhbmtNYXAuZXJhc2UoQk8pOworICAgIEJPLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBWID0gRmFjdG9yc1swXS5PcDsKKyAgfSBlbHNlIHsKKyAgICBSZXdyaXRlRXhwclRyZWUoQk8sIEZhY3RvcnMpOworICAgIFYgPSBCTzsKKyAgfQorICAKKyAgaWYgKE5lZWRzTmVnYXRlKQorICAgIFYgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTmVnKFYsIEluc2VydFB0KTsKKyAgCisgIHJldHVybiBWOworfQorCisvLy8gRmluZFNpbmdsZVVzZU11bHRpcGx5RmFjdG9ycyAtIElmIFYgaXMgYSBzaW5nbGUtdXNlIG11bHRpcGx5LCByZWN1cnNpdmVseQorLy8vIGFkZCBpdHMgb3BlcmFuZHMgYXMgZmFjdG9ycywgb3RoZXJ3aXNlIGFkZCBWIHRvIHRoZSBsaXN0IG9mIGZhY3RvcnMuCisvLy8KKy8vLyBPcHMgaXMgdGhlIHRvcC1sZXZlbCBsaXN0IG9mIGFkZCBvcGVyYW5kcyB3ZSdyZSB0cnlpbmcgdG8gZmFjdG9yLgorc3RhdGljIHZvaWQgRmluZFNpbmdsZVVzZU11bHRpcGx5RmFjdG9ycyhWYWx1ZSAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFZhbHVlKj4gJkZhY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8VmFsdWVFbnRyeT4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1Jvb3QpIHsKKyAgQmluYXJ5T3BlcmF0b3IgKkJPOworICBpZiAoIShWLT5oYXNPbmVVc2UoKSB8fCBWLT51c2VfZW1wdHkoKSkgfHwgLy8gTW9yZSB0aGFuIG9uZSB1c2UuCisgICAgICAhKEJPID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KFYpKSB8fAorICAgICAgQk8tPmdldE9wY29kZSgpICE9IEluc3RydWN0aW9uOjpNdWwpIHsKKyAgICBGYWN0b3JzLnB1c2hfYmFjayhWKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIElmIHRoaXMgdmFsdWUgaGFzIGEgc2luZ2xlIHVzZSBiZWNhdXNlIGl0IGlzIGFub3RoZXIgaW5wdXQgdG8gdGhlIGFkZAorICAvLyB0cmVlIHdlJ3JlIHJlYXNzb2NpYXRpbmcgYW5kIHdlIGRyb3BwZWQgaXRzIHVzZSwgaXQgYWN0dWFsbHkgaGFzIHR3bworICAvLyB1c2VzIGFuZCB3ZSBjYW4ndCBmYWN0b3IgaXQuCisgIGlmICghSXNSb290KSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKE9wc1tpXS5PcCA9PSBWKSB7CisgICAgICAgIEZhY3RvcnMucHVzaF9iYWNrKFYpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgIH0KKyAgCisgIAorICAvLyBPdGhlcndpc2UsIGFkZCB0aGUgTEhTIGFuZCBSSFMgdG8gdGhlIGxpc3Qgb2YgZmFjdG9ycy4KKyAgRmluZFNpbmdsZVVzZU11bHRpcGx5RmFjdG9ycyhCTy0+Z2V0T3BlcmFuZCgxKSwgRmFjdG9ycywgT3BzLCBmYWxzZSk7CisgIEZpbmRTaW5nbGVVc2VNdWx0aXBseUZhY3RvcnMoQk8tPmdldE9wZXJhbmQoMCksIEZhY3RvcnMsIE9wcywgZmFsc2UpOworfQorCisvLy8gT3B0aW1pemVBbmRPclhvciAtIE9wdGltaXplIGEgc2VyaWVzIG9mIG9wZXJhbmRzIHRvIGFuICdhbmQnLCAnb3InLCBvciAneG9yJworLy8vIGluc3RydWN0aW9uLiAgVGhpcyBvcHRpbWl6ZXMgYmFzZWQgb24gaWRlbnRpdGllcy4gIElmIGl0IGNhbiBiZSByZWR1Y2VkIHRvCisvLy8gYSBzaW5nbGUgVmFsdWUsIGl0IGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIE9wcyBsaXN0IGlzIG11dGF0ZWQgYXMKKy8vLyBuZWNlc3NhcnkuCitzdGF0aWMgVmFsdWUgKk9wdGltaXplQW5kT3JYb3IodW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxWYWx1ZUVudHJ5PiAmT3BzKSB7CisgIC8vIFNjYW4gdGhlIG9wZXJhbmQgbGlzdHMgbG9va2luZyBmb3IgWCBhbmQgflggcGFpcnMsIGFsb25nIHdpdGggWCxYIHBhaXJzLgorICAvLyBJZiB3ZSBmaW5kIGFueSwgd2UgY2FuIHNpbXBsaWZ5IHRoZSBleHByZXNzaW9uLiBYJn5YID09IDAsIFh8flggPT0gLTEuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIC8vIEZpcnN0LCBjaGVjayBmb3IgWCBhbmQgflggaW4gdGhlIG9wZXJhbmQgbGlzdC4KKyAgICBhc3NlcnQoaSA8IE9wcy5zaXplKCkpOworICAgIGlmIChCaW5hcnlPcGVyYXRvcjo6aXNOb3QoT3BzW2ldLk9wKSkgeyAgICAvLyBDYW5ub3Qgb2NjdXIgZm9yIF4uCisgICAgICBWYWx1ZSAqWCA9IEJpbmFyeU9wZXJhdG9yOjpnZXROb3RBcmd1bWVudChPcHNbaV0uT3ApOworICAgICAgdW5zaWduZWQgRm91bmRYID0gRmluZEluT3BlcmFuZExpc3QoT3BzLCBpLCBYKTsKKyAgICAgIGlmIChGb3VuZFggIT0gaSkgeworICAgICAgICBpZiAoT3Bjb2RlID09IEluc3RydWN0aW9uOjpBbmQpICAgLy8gLi4uJlgmflggPSAwCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoWC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246Ok9yKSAgICAvLyAuLi58WHx+WCA9IC0xCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoWC0+Z2V0VHlwZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gTmV4dCwgY2hlY2sgZm9yIGR1cGxpY2F0ZSBwYWlycyBvZiB2YWx1ZXMsIHdoaWNoIHdlIGFzc3VtZSBhcmUgbmV4dCB0bworICAgIC8vIGVhY2ggb3RoZXIsIGR1ZSB0byBvdXIgc29ydGluZyBjcml0ZXJpYS4KKyAgICBhc3NlcnQoaSA8IE9wcy5zaXplKCkpOworICAgIGlmIChpKzEgIT0gT3BzLnNpemUoKSAmJiBPcHNbaSsxXS5PcCA9PSBPcHNbaV0uT3ApIHsKKyAgICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OkFuZCB8fCBPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246Ok9yKSB7CisgICAgICAgIC8vIERyb3AgZHVwbGljYXRlIHZhbHVlcyBmb3IgQW5kIGFuZCBPci4KKyAgICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK2kpOworICAgICAgICAtLWk7IC0tZTsKKyAgICAgICAgKytOdW1Bbm5paGlsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gRHJvcCBwYWlycyBvZiB2YWx1ZXMgZm9yIFhvci4KKyAgICAgIGFzc2VydChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246Olhvcik7CisgICAgICBpZiAoZSA9PSAyKQorICAgICAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShPcHNbMF0uT3AtPmdldFR5cGUoKSk7CisgICAgICAKKyAgICAgIC8vIFkgXiBYXlggLT4gWQorICAgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpK2ksIE9wcy5iZWdpbigpK2krMik7CisgICAgICBpIC09IDE7IGUgLT0gMjsKKyAgICAgICsrTnVtQW5uaWhpbDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBPcHRpbWl6ZUFkZCAtIE9wdGltaXplIGEgc2VyaWVzIG9mIG9wZXJhbmRzIHRvIGFuICdhZGQnIGluc3RydWN0aW9uLiAgVGhpcworLy8vIG9wdGltaXplcyBiYXNlZCBvbiBpZGVudGl0aWVzLiAgSWYgaXQgY2FuIGJlIHJlZHVjZWQgdG8gYSBzaW5nbGUgVmFsdWUsIGl0CisvLy8gaXMgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgT3BzIGxpc3QgaXMgbXV0YXRlZCBhcyBuZWNlc3NhcnkuCitWYWx1ZSAqUmVhc3NvY2lhdGU6Ok9wdGltaXplQWRkKEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VmFsdWVFbnRyeT4gJk9wcykgeworICAvLyBTY2FuIHRoZSBvcGVyYW5kIGxpc3RzIGxvb2tpbmcgZm9yIFggYW5kIC1YIHBhaXJzLiAgSWYgd2UgZmluZCBhbnksIHdlCisgIC8vIGNhbiBzaW1wbGlmeSB0aGUgZXhwcmVzc2lvbi4gWCstWCA9PSAwLiAgV2hpbGUgd2UncmUgYXQgaXQsIHNjYW4gZm9yIGFueQorICAvLyBkdXBsaWNhdGVzLiAgV2Ugd2FudCB0byBjYW5vbmljYWxpemUgWStZK1krWiAtPiAzKlkrWi4KKyAgLy8KKyAgLy8gVE9ETzogV2UgY291bGQgaGFuZGxlICJYICsgflgiIC0+ICItMSIgaWYgd2Ugd2FudGVkLCBzaW5jZSAiLVggPSB+WCsxIi4KKyAgLy8KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgVmFsdWUgKlRoZU9wID0gT3BzW2ldLk9wOworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBzZWVuIHRoaXMgb3BlcmFuZCBiZWZvcmUuICBJZiBzbywgd2UgZmFjdG9yIGFsbAorICAgIC8vIGluc3RhbmNlcyBvZiB0aGUgb3BlcmFuZCB0b2dldGhlci4gIER1ZSB0byBvdXIgc29ydGluZyBjcml0ZXJpYSwgd2Uga25vdworICAgIC8vIHRoYXQgdGhlc2UgbmVlZCB0byBiZSBuZXh0IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHZlY3Rvci4KKyAgICBpZiAoaSsxICE9IE9wcy5zaXplKCkgJiYgT3BzW2krMV0uT3AgPT0gVGhlT3ApIHsKKyAgICAgIC8vIFJlc2NhbiB0aGUgbGlzdCwgcmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgdGhpcyBvcGVyYW5kIGZyb20gdGhlIGV4cHIuCisgICAgICB1bnNpZ25lZCBOdW1Gb3VuZCA9IDA7CisgICAgICBkbyB7CisgICAgICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKStpKTsKKyAgICAgICAgKytOdW1Gb3VuZDsKKyAgICAgIH0gd2hpbGUgKGkgIT0gT3BzLnNpemUoKSAmJiBPcHNbaV0uT3AgPT0gVGhlT3ApOworICAgICAgCisgICAgICBERUJVRyhlcnJzKCkgPDwgIlxuRkFDVE9SSU5HIFsiIDw8IE51bUZvdW5kIDw8ICJdOiAiIDw8ICpUaGVPcCA8PCAnXG4nKTsKKyAgICAgICsrTnVtRmFjdG9yOworICAgICAgCisgICAgICAvLyBJbnNlcnQgYSBuZXcgbXVsdGlwbHkuCisgICAgICBWYWx1ZSAqTXVsID0gQ29uc3RhbnRJbnQ6OmdldChjYXN0PEludGVnZXJUeXBlPihJLT5nZXRUeXBlKCkpLCBOdW1Gb3VuZCk7CisgICAgICBNdWwgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTXVsKFRoZU9wLCBNdWwsIEkpOworICAgICAgCisgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGluc2VydGVkIGEgbXVsdGlwbHksIG9wdGltaXplIGl0LiBUaGlzIGFsbG93cyB1cyB0bworICAgICAgLy8gaGFuZGxlIGNhc2VzIHRoYXQgcmVxdWlyZSBtdWx0aXBsZSBmYWN0b3Jpbmcgc3RlcHMsIHN1Y2ggYXMgdGhpczoKKyAgICAgIC8vIChYKjIpICsgKFgqMikgKyAoWCoyKSAtPiAoWCoyKSozIC0+IFgqNgorICAgICAgTXVsID0gUmVhc3NvY2lhdGVFeHByZXNzaW9uKGNhc3Q8QmluYXJ5T3BlcmF0b3I+KE11bCkpOworICAgICAgCisgICAgICAvLyBJZiBldmVyeSBhZGQgb3BlcmFuZCB3YXMgYSBkdXBsaWNhdGUsIHJldHVybiB0aGUgbXVsdGlwbHkuCisgICAgICBpZiAoT3BzLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBNdWw7CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGFkIHNvbWUgaW5wdXQgdGhhdCBkaWRuJ3QgaGF2ZSB0aGUgZHVwZSwgc3VjaCBhcworICAgICAgLy8gIkEgKyBBICsgQiIgLT4gIkEqMiArIEIiLiAgQWRkIHRoZSBuZXcgbXVsdGlwbHkgdG8gdGhlIGxpc3Qgb2YKKyAgICAgIC8vIHRoaW5ncyBiZWluZyBhZGRlZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAgICAgIE9wcy5pbnNlcnQoT3BzLmJlZ2luKCksIFZhbHVlRW50cnkoZ2V0UmFuayhNdWwpLCBNdWwpKTsKKyAgICAgIAorICAgICAgLS1pOworICAgICAgZSA9IE9wcy5zaXplKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gQ2hlY2sgZm9yIFggYW5kIC1YIGluIHRoZSBvcGVyYW5kIGxpc3QuCisgICAgaWYgKCFCaW5hcnlPcGVyYXRvcjo6aXNOZWcoVGhlT3ApKQorICAgICAgY29udGludWU7CisgICAgCisgICAgVmFsdWUgKlggPSBCaW5hcnlPcGVyYXRvcjo6Z2V0TmVnQXJndW1lbnQoVGhlT3ApOworICAgIHVuc2lnbmVkIEZvdW5kWCA9IEZpbmRJbk9wZXJhbmRMaXN0KE9wcywgaSwgWCk7CisgICAgaWYgKEZvdW5kWCA9PSBpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgLy8gUmVtb3ZlIFggYW5kIC1YIGZyb20gdGhlIG9wZXJhbmQgbGlzdC4KKyAgICBpZiAoT3BzLnNpemUoKSA9PSAyKQorICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoWC0+Z2V0VHlwZSgpKTsKKyAgICAKKyAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkraSk7CisgICAgaWYgKGkgPCBGb3VuZFgpCisgICAgICAtLUZvdW5kWDsKKyAgICBlbHNlCisgICAgICAtLWk7ICAgLy8gTmVlZCB0byBiYWNrIHVwIGFuIGV4dHJhIG9uZS4KKyAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkrRm91bmRYKTsKKyAgICArK051bUFubmloaWw7CisgICAgLS1pOyAgICAgLy8gUmV2aXNpdCBlbGVtZW50LgorICAgIGUgLT0gMjsgIC8vIFJlbW92ZWQgdHdvIGVsZW1lbnRzLgorICB9CisgIAorICAvLyBTY2FuIHRoZSBvcGVyYW5kIGxpc3QsIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGNvbW1vbiBmYWN0b3JzCisgIC8vIGJldHdlZW4gb3BlcmFuZHMuICBDb25zaWRlciBzb21ldGhpbmcgbGlrZSBBKkErQSpCKkMrRC4gIFdlIHdvdWxkIGxpa2UgdG8KKyAgLy8gcmVhc3NvY2lhdGUgdGhpcyB0byBBKihBK0IqQykrRCwgd2hpY2ggcmVkdWNlcyB0aGUgbnVtYmVyIG9mIG11bHRpcGxpZXMuCisgIC8vIFRvIGVmZmljaWVudGx5IGZpbmQgdGhpcywgd2UgY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBhIGZhY3RvciBvY2N1cnMKKyAgLy8gZm9yIGFueSBBREQgb3BlcmFuZHMgdGhhdCBhcmUgTVVMcy4KKyAgRGVuc2VNYXA8VmFsdWUqLCB1bnNpZ25lZD4gRmFjdG9yT2NjdXJyZW5jZXM7CisgIAorICAvLyBLZWVwIHRyYWNrIG9mIGVhY2ggbXVsdGlwbHkgd2Ugc2VlLCB0byBhdm9pZCB0cmlnZ2VyaW5nIG9uIChYKjQpKyhYKjQpCisgIC8vIHdoZXJlIHRoZXkgYXJlIGFjdHVhbGx5IHRoZSBzYW1lIG11bHRpcGx5LgorICB1bnNpZ25lZCBNYXhPY2MgPSAwOworICBWYWx1ZSAqTWF4T2NjVmFsID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPcCA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihPcHNbaV0uT3ApOworICAgIGlmIChCT3AgPT0gMCB8fCBCT3AtPmdldE9wY29kZSgpICE9IEluc3RydWN0aW9uOjpNdWwgfHwgIUJPcC0+dXNlX2VtcHR5KCkpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAvLyBDb21wdXRlIGFsbCBvZiB0aGUgZmFjdG9ycyBvZiB0aGlzIGFkZGVkIHZhbHVlLgorICAgIFNtYWxsVmVjdG9yPFZhbHVlKiwgOD4gRmFjdG9yczsKKyAgICBGaW5kU2luZ2xlVXNlTXVsdGlwbHlGYWN0b3JzKEJPcCwgRmFjdG9ycywgT3BzLCB0cnVlKTsKKyAgICBhc3NlcnQoRmFjdG9ycy5zaXplKCkgPiAxICYmICJCYWQgbGluZWFyaXplISIpOworICAgIAorICAgIC8vIEFkZCBvbmUgdG8gRmFjdG9yT2NjdXJyZW5jZXMgZm9yIGVhY2ggdW5pcXVlIGZhY3RvciBpbiB0aGlzIG9wLgorICAgIFNtYWxsUHRyU2V0PFZhbHVlKiwgOD4gRHVwbGljYXRlczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRmFjdG9ycy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBWYWx1ZSAqRmFjdG9yID0gRmFjdG9yc1tpXTsKKyAgICAgIGlmICghRHVwbGljYXRlcy5pbnNlcnQoRmFjdG9yKSkgY29udGludWU7CisgICAgICAKKyAgICAgIHVuc2lnbmVkIE9jYyA9ICsrRmFjdG9yT2NjdXJyZW5jZXNbRmFjdG9yXTsKKyAgICAgIGlmIChPY2MgPiBNYXhPY2MpIHsgTWF4T2NjID0gT2NjOyBNYXhPY2NWYWwgPSBGYWN0b3I7IH0KKyAgICAgIAorICAgICAgLy8gSWYgRmFjdG9yIGlzIGEgbmVnYXRpdmUgY29uc3RhbnQsIGFkZCB0aGUgbmVnYXRlZCB2YWx1ZSBhcyBhIGZhY3RvcgorICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4gcGVyY29sYXRlIHRoZSBuZWdhdGUgb3V0LiAgV2F0Y2ggZm9yIG1pbmludCwgd2hpY2gKKyAgICAgIC8vIGNhbm5vdCBiZSBwb3NpdGl2aWZpZWQuCisgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEZhY3RvcikpCisgICAgICAgIGlmIChDSS0+Z2V0VmFsdWUoKS5pc05lZ2F0aXZlKCkgJiYgIUNJLT5nZXRWYWx1ZSgpLmlzTWluU2lnbmVkVmFsdWUoKSkgeworICAgICAgICAgIEZhY3RvciA9IENvbnN0YW50SW50OjpnZXQoQ0ktPmdldENvbnRleHQoKSwgLUNJLT5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICBhc3NlcnQoIUR1cGxpY2F0ZXMuY291bnQoRmFjdG9yKSAmJgorICAgICAgICAgICAgICAgICAiU2hvdWxkbid0IGhhdmUgdHdvIGNvbnN0YW50IGZhY3RvcnMsIG1pc3NlZCBhIGNhbm9uaWNhbGl6ZSIpOworICAgICAgICAgIAorICAgICAgICAgIHVuc2lnbmVkIE9jYyA9ICsrRmFjdG9yT2NjdXJyZW5jZXNbRmFjdG9yXTsKKyAgICAgICAgICBpZiAoT2NjID4gTWF4T2NjKSB7IE1heE9jYyA9IE9jYzsgTWF4T2NjVmFsID0gRmFjdG9yOyB9CisgICAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIElmIGFueSBmYWN0b3Igb2NjdXJyZWQgbW9yZSB0aGFuIG9uZSB0aW1lLCB3ZSBjYW4gcHVsbCBpdCBvdXQuCisgIGlmIChNYXhPY2MgPiAxKSB7CisgICAgREVCVUcoZXJycygpIDw8ICJcbkZBQ1RPUklORyBbIiA8PCBNYXhPY2MgPDwgIl06ICIgPDwgKk1heE9jY1ZhbCA8PCAnXG4nKTsKKyAgICArK051bUZhY3RvcjsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0cnVjdGlvbiB0aGF0IHVzZXMgdGhlIE1heE9jY1ZhbCB0d2ljZS4gIElmIHdlIGRvbid0IGRvCisgICAgLy8gdGhpcywgd2UgY291bGQgb3RoZXJ3aXNlIHJ1biBpbnRvIHNpdHVhdGlvbnMgd2hlcmUgcmVtb3ZpbmcgYSBmYWN0b3IKKyAgICAvLyBmcm9tIGFuIGV4cHJlc3Npb24gd2lsbCBkcm9wIGEgdXNlIG9mIG1heG9jYywgYW5kIHRoaXMgY2FuIGNhdXNlIAorICAgIC8vIFJlbW92ZUZhY3RvckZyb21FeHByZXNzaW9uIG9uIHN1Y2Nlc3NpdmUgdmFsdWVzIHRvIGJlaGF2ZSBkaWZmZXJlbnRseS4KKyAgICBJbnN0cnVjdGlvbiAqRHVtbXlJbnN0ID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChNYXhPY2NWYWwsIE1heE9jY1ZhbCk7CisgICAgU21hbGxWZWN0b3I8VmFsdWUqLCA0PiBOZXdNdWxPcHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAvLyBPbmx5IHRyeSB0byByZW1vdmUgZmFjdG9ycyBmcm9tIGV4cHJlc3Npb25zIHdlJ3JlIGFsbG93ZWQgdG8uCisgICAgICBCaW5hcnlPcGVyYXRvciAqQk9wID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KE9wc1tpXS5PcCk7CisgICAgICBpZiAoQk9wID09IDAgfHwgQk9wLT5nZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6TXVsIHx8ICFCT3AtPnVzZV9lbXB0eSgpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgaWYgKFZhbHVlICpWID0gUmVtb3ZlRmFjdG9yRnJvbUV4cHJlc3Npb24oT3BzW2ldLk9wLCBNYXhPY2NWYWwpKSB7CisgICAgICAgIE5ld011bE9wcy5wdXNoX2JhY2soVik7CisgICAgICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKStpKTsKKyAgICAgICAgLS1pOyAtLWU7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIE5vIG5lZWQgZm9yIGV4dHJhIHVzZXMgYW55bW9yZS4KKyAgICBkZWxldGUgRHVtbXlJbnN0OworCisgICAgdW5zaWduZWQgTnVtQWRkZWRWYWx1ZXMgPSBOZXdNdWxPcHMuc2l6ZSgpOworICAgIFZhbHVlICpWID0gRW1pdEFkZFRyZWVPZlZhbHVlcyhJLCBOZXdNdWxPcHMpOworCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBpbnNlcnRlZCB0aGUgYWRkIHRyZWUsIG9wdGltaXplIGl0LiBUaGlzIGFsbG93cyB1cyB0bworICAgIC8vIGhhbmRsZSBjYXNlcyB0aGF0IHJlcXVpcmUgbXVsdGlwbGUgZmFjdG9yaW5nIHN0ZXBzLCBzdWNoIGFzIHRoaXM6CisgICAgLy8gQSpBKkIgKyBBKkEqQyAgIC0tPiAgIEEqKEEqQitBKkMpICAgLS0+ICAgQSooQSooQitDKSkKKyAgICBhc3NlcnQoTnVtQWRkZWRWYWx1ZXMgPiAxICYmICJFYWNoIG9jY3VycmVuY2Ugc2hvdWxkIGNvbnRyaWJ1dGUgYSB2YWx1ZSIpOworICAgICh2b2lkKU51bUFkZGVkVmFsdWVzOworICAgIFYgPSBSZWFzc29jaWF0ZUV4cHJlc3Npb24oY2FzdDxCaW5hcnlPcGVyYXRvcj4oVikpOworCisgICAgLy8gQ3JlYXRlIHRoZSBtdWx0aXBseS4KKyAgICBWYWx1ZSAqVjIgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTXVsKFYsIE1heE9jY1ZhbCwgSSk7CisKKyAgICAvLyBSZXJ1biBhc3NvY2lhdGUgb24gdGhlIG11bHRpcGx5IGluIGNhc2UgdGhlIGlubmVyIGV4cHJlc3Npb24gdHVybmVkIGludG8KKyAgICAvLyBhIG11bHRpcGx5LiAgV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBrZWVwIHRoaW5ncyBpbiBjYW5vbmljYWwgZm9ybS4KKyAgICBWMiA9IFJlYXNzb2NpYXRlRXhwcmVzc2lvbihjYXN0PEJpbmFyeU9wZXJhdG9yPihWMikpOworICAgIAorICAgIC8vIElmIGV2ZXJ5IGFkZCBvcGVyYW5kIGluY2x1ZGVkIHRoZSBmYWN0b3IgKGUuZy4gIkEqQiArIEEqQyIpLCB0aGVuIHRoZQorICAgIC8vIGVudGlyZSByZXN1bHQgZXhwcmVzc2lvbiBpcyBqdXN0IHRoZSBtdWx0aXBseSAiQSooQitDKSIuCisgICAgaWYgKE9wcy5lbXB0eSgpKQorICAgICAgcmV0dXJuIFYyOworICAgIAorICAgIC8vIE90aGVyd2lzZSwgd2UgaGFkIHNvbWUgaW5wdXQgdGhhdCBkaWRuJ3QgaGF2ZSB0aGUgZmFjdG9yLCBzdWNoIGFzCisgICAgLy8gIkEqQiArIEEqQyArIEQiIC0+ICJBKihCK0MpICsgRCIuICBBZGQgdGhlIG5ldyBtdWx0aXBseSB0byB0aGUgbGlzdCBvZgorICAgIC8vIHRoaW5ncyBiZWluZyBhZGRlZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAgICBPcHMuaW5zZXJ0KE9wcy5iZWdpbigpLCBWYWx1ZUVudHJ5KGdldFJhbmsoVjIpLCBWMikpOworICB9CisgIAorICByZXR1cm4gMDsKK30KKworVmFsdWUgKlJlYXNzb2NpYXRlOjpPcHRpbWl6ZUV4cHJlc3Npb24oQmluYXJ5T3BlcmF0b3IgKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VmFsdWVFbnRyeT4gJk9wcykgeworICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBsaW5lYXJpemVkIGV4cHJlc3Npb24gdHJlZSwgdHJ5IHRvIG9wdGltaXplIGl0LgorICAvLyBTdGFydCBieSBmb2xkaW5nIGFueSBjb25zdGFudHMgdGhhdCB3ZSBmb3VuZC4KKyAgYm9vbCBJdGVyYXRlT3B0aW1pemF0aW9uID0gZmFsc2U7CisgIGlmIChPcHMuc2l6ZSgpID09IDEpIHJldHVybiBPcHNbMF0uT3A7CisKKyAgdW5zaWduZWQgT3Bjb2RlID0gSS0+Z2V0T3Bjb2RlKCk7CisgIAorICBpZiAoQ29uc3RhbnQgKlYxID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KE9wc1tPcHMuc2l6ZSgpLTJdLk9wKSkKKyAgICBpZiAoQ29uc3RhbnQgKlYyID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KE9wcy5iYWNrKCkuT3ApKSB7CisgICAgICBPcHMucG9wX2JhY2soKTsKKyAgICAgIE9wcy5iYWNrKCkuT3AgPSBDb25zdGFudEV4cHI6OmdldChPcGNvZGUsIFYxLCBWMik7CisgICAgICByZXR1cm4gT3B0aW1pemVFeHByZXNzaW9uKEksIE9wcyk7CisgICAgfQorCisgIC8vIENoZWNrIGZvciBkZXN0cnVjdGl2ZSBhbm5paGlsYXRpb24gZHVlIHRvIGEgY29uc3RhbnQgYmVpbmcgdXNlZC4KKyAgaWYgKENvbnN0YW50SW50ICpDc3RWYWwgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT3BzLmJhY2soKS5PcCkpCisgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgICBpZiAoQ3N0VmFsLT5pc1plcm8oKSkgICAgICAgICAgICAgICAgICAvLyBYICYgMCAtPiAwCisgICAgICAgIHJldHVybiBDc3RWYWw7CisgICAgICBpZiAoQ3N0VmFsLT5pc0FsbE9uZXNWYWx1ZSgpKSAgICAgICAgICAvLyBYICYgLTEgLT4gWAorICAgICAgICBPcHMucG9wX2JhY2soKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok11bDoKKyAgICAgIGlmIChDc3RWYWwtPmlzWmVybygpKSB7ICAgICAgICAgICAgICAgIC8vIFggKiAwIC0+IDAKKyAgICAgICAgKytOdW1Bbm5paGlsOworICAgICAgICByZXR1cm4gQ3N0VmFsOworICAgICAgfQorICAgICAgICAKKyAgICAgIGlmIChjYXN0PENvbnN0YW50SW50PihDc3RWYWwpLT5pc09uZSgpKQorICAgICAgICBPcHMucG9wX2JhY2soKTsgICAgICAgICAgICAgICAgICAgICAgLy8gWCAqIDEgLT4gWAorICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgICAgICBpZiAoQ3N0VmFsLT5pc0FsbE9uZXNWYWx1ZSgpKSAgICAgICAgICAvLyBYIHwgLTEgLT4gLTEKKyAgICAgICAgcmV0dXJuIENzdFZhbDsKKyAgICAgIC8vIEZBTExUSFJPVUdIIQorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgICAgICBpZiAoQ3N0VmFsLT5pc1plcm8oKSkgICAgICAgICAgICAgICAgICAvLyBYIFt8XitdIDAgLT4gWAorICAgICAgICBPcHMucG9wX2JhY2soKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaWYgKE9wcy5zaXplKCkgPT0gMSkgcmV0dXJuIE9wc1swXS5PcDsKKworICAvLyBIYW5kbGUgZGVzdHJ1Y3RpdmUgYW5uaWhpbGF0aW9uIGR1ZSB0byBpZGVudGl0aWVzIGJldHdlZW4gZWxlbWVudHMgaW4gdGhlCisgIC8vIGFyZ3VtZW50IGxpc3QgaGVyZS4KKyAgc3dpdGNoIChPcGNvZGUpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjogeworICAgIHVuc2lnbmVkIE51bU9wcyA9IE9wcy5zaXplKCk7CisgICAgaWYgKFZhbHVlICpSZXN1bHQgPSBPcHRpbWl6ZUFuZE9yWG9yKE9wY29kZSwgT3BzKSkKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgSXRlcmF0ZU9wdGltaXphdGlvbiB8PSBPcHMuc2l6ZSgpICE9IE51bU9wczsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDogeworICAgIHVuc2lnbmVkIE51bU9wcyA9IE9wcy5zaXplKCk7CisgICAgaWYgKFZhbHVlICpSZXN1bHQgPSBPcHRpbWl6ZUFkZChJLCBPcHMpKQorICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICBJdGVyYXRlT3B0aW1pemF0aW9uIHw9IE9wcy5zaXplKCkgIT0gTnVtT3BzOworICB9CisKKyAgICBicmVhazsKKyAgLy9jYXNlIEluc3RydWN0aW9uOjpNdWw6CisgIH0KKworICBpZiAoSXRlcmF0ZU9wdGltaXphdGlvbikKKyAgICByZXR1cm4gT3B0aW1pemVFeHByZXNzaW9uKEksIE9wcyk7CisgIHJldHVybiAwOworfQorCisKKy8vLyBSZWFzc29jaWF0ZUJCIC0gSW5zcGVjdCBhbGwgb2YgdGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIGJhc2ljIGJsb2NrLAorLy8vIHJlYXNzb2NpYXRpbmcgdGhlbSBhcyB3ZSBnby4KK3ZvaWQgUmVhc3NvY2lhdGU6OlJlYXNzb2NpYXRlQkIoQmFzaWNCbG9jayAqQkIpIHsKKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSBCQi0+YmVnaW4oKTsgQkJJICE9IEJCLT5lbmQoKTsgKSB7CisgICAgSW5zdHJ1Y3Rpb24gKkJJID0gQkJJKys7CisgICAgaWYgKEJJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U2hsICYmCisgICAgICAgIGlzYTxDb25zdGFudEludD4oQkktPmdldE9wZXJhbmQoMSkpKQorICAgICAgaWYgKEluc3RydWN0aW9uICpOSSA9IENvbnZlcnRTaGlmdFRvTXVsKEJJLCBWYWx1ZVJhbmtNYXApKSB7CisgICAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgICAgICBCSSA9IE5JOworICAgICAgfQorCisgICAgLy8gUmVqZWN0IGNhc2VzIHdoZXJlIGl0IGlzIHBvaW50bGVzcyB0byBkbyB0aGlzLgorICAgIGlmICghaXNhPEJpbmFyeU9wZXJhdG9yPihCSSkgfHwgQkktPmdldFR5cGUoKS0+aXNGbG9hdGluZ1BvaW50VHkoKSB8fCAKKyAgICAgICAgQkktPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKQorICAgICAgY29udGludWU7ICAvLyBGbG9hdGluZyBwb2ludCBvcHMgYXJlIG5vdCBhc3NvY2lhdGl2ZS4KKworICAgIC8vIERvIG5vdCByZWFzc29jaWF0ZSBib29sZWFuIChpMSkgZXhwcmVzc2lvbnMuICBXZSB3YW50IHRvIHByZXNlcnZlIHRoZQorICAgIC8vIG9yaWdpbmFsIG9yZGVyIG9mIGV2YWx1YXRpb24gZm9yIHNob3J0LWNpcmN1aXRlZCBjb21wYXJpc29ucyB0aGF0CisgICAgLy8gU2ltcGxpZnlDRkcgaGFzIGZvbGRlZCB0byBBTkQvT1IgZXhwcmVzc2lvbnMuICBJZiB0aGUgZXhwcmVzc2lvbgorICAgIC8vIGlzIG5vdCBmdXJ0aGVyIG9wdGltaXplZCwgaXQgaXMgbGlrZWx5IHRvIGJlIHRyYW5zZm9ybWVkIGJhY2sgdG8gYQorICAgIC8vIHNob3J0LWNpcmN1aXRlZCBmb3JtIGZvciBjb2RlIGdlbiwgYW5kIHRoZSBzb3VyY2Ugb3JkZXIgbWF5IGhhdmUgYmVlbgorICAgIC8vIG9wdGltaXplZCBmb3IgdGhlIG1vc3QgbGlrZWx5IGNvbmRpdGlvbnMuCisgICAgaWYgKEJJLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDEpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBJZiB0aGlzIGlzIGEgc3VidHJhY3QgaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbm90IGFscmVhZHkgaW4gbmVnYXRlIGZvcm0sCisgICAgLy8gc2VlIGlmIHdlIGNhbiBjb252ZXJ0IGl0IHRvIFgrLVkuCisgICAgaWYgKEJJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U3ViKSB7CisgICAgICBpZiAoU2hvdWxkQnJlYWtVcFN1YnRyYWN0KEJJKSkgeworICAgICAgICBCSSA9IEJyZWFrVXBTdWJ0cmFjdChCSSwgVmFsdWVSYW5rTWFwKTsKKyAgICAgICAgLy8gUmVzZXQgdGhlIEJCSSBpdGVyYXRvciBpbiBjYXNlIEJyZWFrVXBTdWJ0cmFjdCBjaGFuZ2VkIHRoZQorICAgICAgICAvLyBpbnN0cnVjdGlvbiBpdCBwb2ludHMgdG8uCisgICAgICAgIEJCSSA9IEJJOworICAgICAgICArK0JCSTsKKyAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKEJpbmFyeU9wZXJhdG9yOjppc05lZyhCSSkpIHsKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgbmVnYXRpb24uICBTZWUgaWYgdGhlIG9wZXJhbmQgaXMgYSBtdWx0aXBseSB0cmVlCisgICAgICAgIC8vIGFuZCBpZiB0aGlzIGlzIG5vdCBhbiBpbm5lciBub2RlIG9mIGEgbXVsdGlwbHkgdHJlZS4KKyAgICAgICAgaWYgKGlzUmVhc3NvY2lhYmxlT3AoQkktPmdldE9wZXJhbmQoMSksIEluc3RydWN0aW9uOjpNdWwpICYmCisgICAgICAgICAgICAoIUJJLT5oYXNPbmVVc2UoKSB8fAorICAgICAgICAgICAgICFpc1JlYXNzb2NpYWJsZU9wKEJJLT51c2VfYmFjaygpLCBJbnN0cnVjdGlvbjo6TXVsKSkpIHsKKyAgICAgICAgICBCSSA9IExvd2VyTmVnYXRlVG9NdWx0aXBseShCSSwgVmFsdWVSYW5rTWFwKTsKKyAgICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBjb21tdXRhdGl2ZSBiaW5hcnkgb3BlcmF0b3IsIHByb2Nlc3MgaXQuCisgICAgaWYgKCFCSS0+aXNBc3NvY2lhdGl2ZSgpKSBjb250aW51ZTsKKyAgICBCaW5hcnlPcGVyYXRvciAqSSA9IGNhc3Q8QmluYXJ5T3BlcmF0b3I+KEJJKTsKKworICAgIC8vIElmIHRoaXMgaXMgYW4gaW50ZXJpb3Igbm9kZSBvZiBhIHJlYXNzb2NpYWJsZSB0cmVlLCBpZ25vcmUgaXQgdW50aWwgd2UKKyAgICAvLyBnZXQgdG8gdGhlIHJvb3Qgb2YgdGhlIHRyZWUsIHRvIGF2b2lkIE5eMiBhbmFseXNpcy4KKyAgICBpZiAoSS0+aGFzT25lVXNlKCkgJiYgaXNSZWFzc29jaWFibGVPcChJLT51c2VfYmFjaygpLCBJLT5nZXRPcGNvZGUoKSkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIElmIHRoaXMgaXMgYW4gYWRkIHRyZWUgdGhhdCBpcyB1c2VkIGJ5IGEgc3ViIGluc3RydWN0aW9uLCBpZ25vcmUgaXQgCisgICAgLy8gdW50aWwgd2UgcHJvY2VzcyB0aGUgc3VidHJhY3QuCisgICAgaWYgKEktPmhhc09uZVVzZSgpICYmIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQgJiYKKyAgICAgICAgY2FzdDxJbnN0cnVjdGlvbj4oSS0+dXNlX2JhY2soKSktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTdWIpCisgICAgICBjb250aW51ZTsKKworICAgIFJlYXNzb2NpYXRlRXhwcmVzc2lvbihJKTsKKyAgfQorfQorCitWYWx1ZSAqUmVhc3NvY2lhdGU6OlJlYXNzb2NpYXRlRXhwcmVzc2lvbihCaW5hcnlPcGVyYXRvciAqSSkgeworICAKKyAgLy8gRmlyc3QsIHdhbGsgdGhlIGV4cHJlc3Npb24gdHJlZSwgbGluZWFyaXppbmcgdGhlIHRyZWUsIGNvbGxlY3RpbmcgdGhlCisgIC8vIG9wZXJhbmQgaW5mb3JtYXRpb24uCisgIFNtYWxsVmVjdG9yPFZhbHVlRW50cnksIDg+IE9wczsKKyAgTGluZWFyaXplRXhwclRyZWUoSSwgT3BzKTsKKyAgCisgIERFQlVHKGRiZ3MoKSA8PCAiUkFJbjpcdCI7IFByaW50T3BzKEksIE9wcyk7IGRiZ3MoKSA8PCAnXG4nKTsKKyAgCisgIC8vIE5vdyB0aGF0IHdlIGhhdmUgbGluZWFyaXplZCB0aGUgdHJlZSB0byBhIGxpc3QgYW5kIGhhdmUgZ2F0aGVyZWQgYWxsIG9mCisgIC8vIHRoZSBvcGVyYW5kcyBhbmQgdGhlaXIgcmFua3MsIHNvcnQgdGhlIG9wZXJhbmRzIGJ5IHRoZWlyIHJhbmsuICBVc2UgYQorICAvLyBzdGFibGVfc29ydCBzbyB0aGF0IHZhbHVlcyB3aXRoIGVxdWFsIHJhbmtzIHdpbGwgaGF2ZSB0aGVpciByZWxhdGl2ZQorICAvLyBwb3NpdGlvbnMgbWFpbnRhaW5lZCAoYW5kIHNvIHRoZSBjb21waWxlciBpcyBkZXRlcm1pbmlzdGljKS4gIE5vdGUgdGhhdAorICAvLyB0aGlzIHNvcnRzIHNvIHRoYXQgdGhlIGhpZ2hlc3QgcmFua2luZyB2YWx1ZXMgZW5kIHVwIGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgLy8gdGhlIHZlY3Rvci4KKyAgc3RkOjpzdGFibGVfc29ydChPcHMuYmVnaW4oKSwgT3BzLmVuZCgpKTsKKyAgCisgIC8vIE9wdGltaXplRXhwcmVzc2lvbiAtIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGV4cHJlc3Npb24gdHJlZSBpbiBhIGNvbnZlbmllbnQKKyAgLy8gc29ydGVkIGZvcm0sIG9wdGltaXplIGl0IGdsb2JhbGx5IGlmIHBvc3NpYmxlLgorICBpZiAoVmFsdWUgKlYgPSBPcHRpbWl6ZUV4cHJlc3Npb24oSSwgT3BzKSkgeworICAgIC8vIFRoaXMgZXhwcmVzc2lvbiB0cmVlIHNpbXBsaWZpZWQgdG8gc29tZXRoaW5nIHRoYXQgaXNuJ3QgYSB0cmVlLAorICAgIC8vIGVsaW1pbmF0ZSBpdC4KKyAgICBERUJVRyhkYmdzKCkgPDwgIlJlYXNzb2MgdG8gc2NhbGFyOiAiIDw8ICpWIDw8ICdcbicpOworICAgIEktPnJlcGxhY2VBbGxVc2VzV2l0aChWKTsKKyAgICBSZW1vdmVEZWFkQmluYXJ5T3AoSSk7CisgICAgKytOdW1Bbm5paGlsOworICAgIHJldHVybiBWOworICB9CisgIAorICAvLyBXZSB3YW50IHRvIHNpbmsgaW1tZWRpYXRlcyBhcyBkZWVwbHkgYXMgcG9zc2libGUgZXhjZXB0IGluIHRoZSBjYXNlIHdoZXJlCisgIC8vIHRoaXMgaXMgYSBtdWx0aXBseSB0cmVlIHVzZWQgb25seSBieSBhbiBhZGQsIGFuZCB0aGUgaW1tZWRpYXRlIGlzIGEgLTEuCisgIC8vIEluIHRoaXMgY2FzZSB3ZSByZWFzc29jaWF0ZSB0byBwdXQgdGhlIG5lZ2F0aW9uIG9uIHRoZSBvdXRzaWRlIHNvIHRoYXQgd2UKKyAgLy8gY2FuIGZvbGQgdGhlIG5lZ2F0aW9uIGludG8gdGhlIGFkZDogKC1YKSpZICsgWiAtPiBaLVgqWQorICBpZiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Ok11bCAmJiBJLT5oYXNPbmVVc2UoKSAmJgorICAgICAgY2FzdDxJbnN0cnVjdGlvbj4oSS0+dXNlX2JhY2soKSktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQgJiYKKyAgICAgIGlzYTxDb25zdGFudEludD4oT3BzLmJhY2soKS5PcCkgJiYKKyAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KE9wcy5iYWNrKCkuT3ApLT5pc0FsbE9uZXNWYWx1ZSgpKSB7CisgICAgVmFsdWVFbnRyeSBUbXAgPSBPcHMucG9wX2JhY2tfdmFsKCk7CisgICAgT3BzLmluc2VydChPcHMuYmVnaW4oKSwgVG1wKTsKKyAgfQorICAKKyAgREVCVUcoZGJncygpIDw8ICJSQU91dDpcdCI7IFByaW50T3BzKEksIE9wcyk7IGRiZ3MoKSA8PCAnXG4nKTsKKyAgCisgIGlmIChPcHMuc2l6ZSgpID09IDEpIHsKKyAgICAvLyBUaGlzIGV4cHJlc3Npb24gdHJlZSBzaW1wbGlmaWVkIHRvIHNvbWV0aGluZyB0aGF0IGlzbid0IGEgdHJlZSwKKyAgICAvLyBlbGltaW5hdGUgaXQuCisgICAgSS0+cmVwbGFjZUFsbFVzZXNXaXRoKE9wc1swXS5PcCk7CisgICAgUmVtb3ZlRGVhZEJpbmFyeU9wKEkpOworICAgIHJldHVybiBPcHNbMF0uT3A7CisgIH0KKyAgCisgIC8vIE5vdyB0aGF0IHdlIG9yZGVyZWQgYW5kIG9wdGltaXplZCB0aGUgZXhwcmVzc2lvbnMsIHNwbGF0IHRoZW0gYmFjayBpbnRvCisgIC8vIHRoZSBleHByZXNzaW9uIHRyZWUsIHJlbW92aW5nIGFueSB1bm5lZWRlZCBub2Rlcy4KKyAgUmV3cml0ZUV4cHJUcmVlKEksIE9wcyk7CisgIHJldHVybiBJOworfQorCisKK2Jvb2wgUmVhc3NvY2lhdGU6OnJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgLy8gUmVjYWxjdWxhdGUgdGhlIHJhbmsgbWFwIGZvciBGCisgIEJ1aWxkUmFua01hcChGKTsKKworICBNYWRlQ2hhbmdlID0gZmFsc2U7CisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEZJID0gRi5iZWdpbigpLCBGRSA9IEYuZW5kKCk7IEZJICE9IEZFOyArK0ZJKQorICAgIFJlYXNzb2NpYXRlQkIoRkkpOworCisgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhlIHJhbmsgbWFwLgorICBSYW5rTWFwLmNsZWFyKCk7CisgIFZhbHVlUmFua01hcC5jbGVhcigpOworICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL1NDQ1AuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL1NDQ1AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NmZiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvU0NDUC5jcHAKQEAgLTAsMCArMSwxOTcyIEBACisvLz09PS0gU0NDUC5jcHAgLSBTcGFyc2UgQ29uZGl0aW9uYWwgQ29uc3RhbnQgUHJvcGFnYXRpb24gLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNwYXJzZSBjb25kaXRpb25hbCBjb25zdGFudCBwcm9wYWdhdGlvbiBhbmQgbWVyZ2luZzoKKy8vCisvLyBTcGVjaWZpY2FsbHksIHRoaXM6CisvLyAgICogQXNzdW1lcyB2YWx1ZXMgYXJlIGNvbnN0YW50IHVubGVzcyBwcm92ZW4gb3RoZXJ3aXNlCisvLyAgICogQXNzdW1lcyBCYXNpY0Jsb2NrcyBhcmUgZGVhZCB1bmxlc3MgcHJvdmVuIG90aGVyd2lzZQorLy8gICAqIFByb3ZlcyB2YWx1ZXMgdG8gYmUgY29uc3RhbnQsIGFuZCByZXBsYWNlcyB0aGVtIHdpdGggY29uc3RhbnRzCisvLyAgICogUHJvdmVzIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRvIGJlIHVuY29uZGl0aW9uYWwKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInNjY3AiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8uaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVmFsdWVUcmFja2luZy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9JbnN0VmlzaXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1JbnN0UmVtb3ZlZCwgIk51bWJlciBvZiBpbnN0cnVjdGlvbnMgcmVtb3ZlZCIpOworU1RBVElTVElDKE51bURlYWRCbG9ja3MgLCAiTnVtYmVyIG9mIGJhc2ljIGJsb2NrcyB1bnJlYWNoYWJsZSIpOworCitTVEFUSVNUSUMoSVBOdW1JbnN0UmVtb3ZlZCwgIk51bWJlciBvZiBpbnN0cnVjdGlvbnMgcmVtb3ZlZCBieSBJUFNDQ1AiKTsKK1NUQVRJU1RJQyhJUE51bUFyZ3NFbGltZWQgLCJOdW1iZXIgb2YgYXJndW1lbnRzIGNvbnN0YW50IHByb3BhZ2F0ZWQgYnkgSVBTQ0NQIik7CitTVEFUSVNUSUMoSVBOdW1HbG9iYWxDb25zdCwgIk51bWJlciBvZiBnbG9iYWxzIGZvdW5kIHRvIGJlIGNvbnN0YW50IGJ5IElQU0NDUCIpOworCituYW1lc3BhY2UgeworLy8vIExhdHRpY2VWYWwgY2xhc3MgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBsYXR0aWNlIHZhbHVlcyB0aGF0CisvLy8gYW4gTExWTSB2YWx1ZSBtYXkgb2NjdXB5LiAgSXQgaXMgYSBzaW1wbGUgY2xhc3Mgd2l0aCB2YWx1ZSBzZW1hbnRpY3MuCisvLy8KK2NsYXNzIExhdHRpY2VWYWwgeworICBlbnVtIExhdHRpY2VWYWx1ZVR5IHsKKyAgICAvLy8gdW5kZWZpbmVkIC0gVGhpcyBMTFZNIFZhbHVlIGhhcyBubyBrbm93biB2YWx1ZSB5ZXQuCisgICAgdW5kZWZpbmVkLAorICAgIAorICAgIC8vLyBjb25zdGFudCAtIFRoaXMgTExWTSBWYWx1ZSBoYXMgYSBzcGVjaWZpYyBjb25zdGFudCB2YWx1ZS4KKyAgICBjb25zdGFudCwKKworICAgIC8vLyBmb3JjZWRjb25zdGFudCAtIFRoaXMgTExWTSBWYWx1ZSB3YXMgdGhvdWdodCB0byBiZSB1bmRlZiB1bnRpbAorICAgIC8vLyBSZXNvbHZlZFVuZGVmc0luLiAgVGhpcyBpcyB0cmVhdGVkIGp1c3QgbGlrZSAnY29uc3RhbnQnLCBidXQgaWYgbWVyZ2VkCisgICAgLy8vIHdpdGggYW5vdGhlciAoZGlmZmVyZW50KSBjb25zdGFudCwgaXQgZ29lcyB0byBvdmVyZGVmaW5lZCwgaW5zdGVhZCBvZgorICAgIC8vLyBhc3NlcnRpbmcuCisgICAgZm9yY2VkY29uc3RhbnQsCisgICAgCisgICAgLy8vIG92ZXJkZWZpbmVkIC0gVGhpcyBpbnN0cnVjdGlvbiBpcyBub3Qga25vd24gdG8gYmUgY29uc3RhbnQsIGFuZCB3ZSBrbm93CisgICAgLy8vIGl0IGhhcyBhIHZhbHVlLgorICAgIG92ZXJkZWZpbmVkCisgIH07CisKKyAgLy8vIFZhbDogVGhpcyBzdG9yZXMgdGhlIGN1cnJlbnQgbGF0dGljZSB2YWx1ZSBhbG9uZyB3aXRoIHRoZSBDb25zdGFudCogZm9yCisgIC8vLyB0aGUgY29uc3RhbnQgaWYgdGhpcyBpcyBhICdjb25zdGFudCcgb3IgJ2ZvcmNlZGNvbnN0YW50JyB2YWx1ZS4KKyAgUG9pbnRlckludFBhaXI8Q29uc3RhbnQgKiwgMiwgTGF0dGljZVZhbHVlVHk+IFZhbDsKKyAgCisgIExhdHRpY2VWYWx1ZVR5IGdldExhdHRpY2VWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsLmdldEludCgpOworICB9CisgIAorcHVibGljOgorICBMYXR0aWNlVmFsKCkgOiBWYWwoMCwgdW5kZWZpbmVkKSB7fQorICAKKyAgYm9vbCBpc1VuZGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuIGdldExhdHRpY2VWYWx1ZSgpID09IHVuZGVmaW5lZDsgfQorICBib29sIGlzQ29uc3RhbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExhdHRpY2VWYWx1ZSgpID09IGNvbnN0YW50IHx8IGdldExhdHRpY2VWYWx1ZSgpID09IGZvcmNlZGNvbnN0YW50OworICB9CisgIGJvb2wgaXNPdmVyZGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuIGdldExhdHRpY2VWYWx1ZSgpID09IG92ZXJkZWZpbmVkOyB9CisgIAorICBDb25zdGFudCAqZ2V0Q29uc3RhbnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29uc3RhbnQoKSAmJiAiQ2Fubm90IGdldCB0aGUgY29uc3RhbnQgb2YgYSBub24tY29uc3RhbnQhIik7CisgICAgcmV0dXJuIFZhbC5nZXRQb2ludGVyKCk7CisgIH0KKyAgCisgIC8vLyBtYXJrT3ZlcmRlZmluZWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgY2hhbmdlIGluIHN0YXR1cy4KKyAgYm9vbCBtYXJrT3ZlcmRlZmluZWQoKSB7CisgICAgaWYgKGlzT3ZlcmRlZmluZWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBWYWwuc2V0SW50KG92ZXJkZWZpbmVkKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBtYXJrQ29uc3RhbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgY2hhbmdlIGluIHN0YXR1cy4KKyAgYm9vbCBtYXJrQ29uc3RhbnQoQ29uc3RhbnQgKlYpIHsKKyAgICBpZiAoZ2V0TGF0dGljZVZhbHVlKCkgPT0gY29uc3RhbnQpIHsgLy8gQ29uc3RhbnQgYnV0IG5vdCBmb3JjZWRjb25zdGFudC4KKyAgICAgIGFzc2VydChnZXRDb25zdGFudCgpID09IFYgJiYgIk1hcmtpbmcgY29uc3RhbnQgd2l0aCBkaWZmZXJlbnQgdmFsdWUiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgaWYgKGlzVW5kZWZpbmVkKCkpIHsKKyAgICAgIFZhbC5zZXRJbnQoY29uc3RhbnQpOworICAgICAgYXNzZXJ0KFYgJiYgIk1hcmtpbmcgY29uc3RhbnQgd2l0aCBOVUxMIik7CisgICAgICBWYWwuc2V0UG9pbnRlcihWKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KGdldExhdHRpY2VWYWx1ZSgpID09IGZvcmNlZGNvbnN0YW50ICYmIAorICAgICAgICAgICAgICJDYW5ub3QgbW92ZSBmcm9tIG92ZXJkZWZpbmVkIHRvIGNvbnN0YW50ISIpOworICAgICAgLy8gU3RheSBhdCBmb3JjZWRjb25zdGFudCBpZiB0aGUgY29uc3RhbnQgaXMgdGhlIHNhbWUuCisgICAgICBpZiAoViA9PSBnZXRDb25zdGFudCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAKKyAgICAgIC8vIE90aGVyd2lzZSwgd2UgZ28gdG8gb3ZlcmRlZmluZWQuICBBc3N1bXB0aW9ucyBtYWRlIGJhc2VkIG9uIHRoZQorICAgICAgLy8gZm9yY2VkIHZhbHVlIGFyZSBwb3NzaWJseSB3cm9uZy4gIEFzc3VtaW5nIHRoaXMgaXMgYW5vdGhlciBjb25zdGFudAorICAgICAgLy8gY291bGQgZXhwb3NlIGEgY29udHJhZGljdGlvbi4KKyAgICAgIFZhbC5zZXRJbnQob3ZlcmRlZmluZWQpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBnZXRDb25zdGFudEludCAtIElmIHRoaXMgaXMgYSBjb25zdGFudCB3aXRoIGEgQ29uc3RhbnRJbnQgdmFsdWUsIHJldHVybiBpdAorICAvLy8gb3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBDb25zdGFudEludCAqZ2V0Q29uc3RhbnRJbnQoKSBjb25zdCB7CisgICAgaWYgKGlzQ29uc3RhbnQoKSkKKyAgICAgIHJldHVybiBkeW5fY2FzdDxDb25zdGFudEludD4oZ2V0Q29uc3RhbnQoKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIHZvaWQgbWFya0ZvcmNlZENvbnN0YW50KENvbnN0YW50ICpWKSB7CisgICAgYXNzZXJ0KGlzVW5kZWZpbmVkKCkgJiYgIkNhbid0IGZvcmNlIGEgZGVmaW5lZCB2YWx1ZSEiKTsKKyAgICBWYWwuc2V0SW50KGZvcmNlZGNvbnN0YW50KTsKKyAgICBWYWwuc2V0UG9pbnRlcihWKTsKKyAgfQorfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKKworbmFtZXNwYWNlIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gU0NDUFNvbHZlciAtIFRoaXMgY2xhc3MgaXMgYSBnZW5lcmFsIHB1cnBvc2Ugc29sdmVyIGZvciBTcGFyc2UgQ29uZGl0aW9uYWwKKy8vLyBDb25zdGFudCBQcm9wYWdhdGlvbi4KKy8vLworY2xhc3MgU0NDUFNvbHZlciA6IHB1YmxpYyBJbnN0VmlzaXRvcjxTQ0NQU29sdmVyPiB7CisgIGNvbnN0IFRhcmdldERhdGEgKlREOworICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgOD4gQkJFeGVjdXRhYmxlOy8vIFRoZSBCQnMgdGhhdCBhcmUgZXhlY3V0YWJsZS4KKyAgRGVuc2VNYXA8VmFsdWUqLCBMYXR0aWNlVmFsPiBWYWx1ZVN0YXRlOyAgLy8gVGhlIHN0YXRlIGVhY2ggdmFsdWUgaXMgaW4uCisKKyAgLy8vIFN0cnVjdFZhbHVlU3RhdGUgLSBUaGlzIG1haW50YWlucyBWYWx1ZVN0YXRlIGZvciB2YWx1ZXMgdGhhdCBoYXZlCisgIC8vLyBTdHJ1Y3RUeXBlLCBmb3IgZXhhbXBsZSBmb3IgZm9ybWFsIGFyZ3VtZW50cywgY2FsbHMsIGluc2VydGVsZW1lbnQsIGV0Yy4KKyAgLy8vCisgIERlbnNlTWFwPHN0ZDo6cGFpcjxWYWx1ZSosIHVuc2lnbmVkPiwgTGF0dGljZVZhbD4gU3RydWN0VmFsdWVTdGF0ZTsKKyAgCisgIC8vLyBHbG9iYWxWYWx1ZSAtIElmIHdlIGFyZSB0cmFja2luZyBhbnkgdmFsdWVzIGZvciB0aGUgY29udGVudHMgb2YgYSBnbG9iYWwKKyAgLy8vIHZhcmlhYmxlLCB3ZSBrZWVwIGEgbWFwcGluZyBmcm9tIHRoZSBjb25zdGFudCBhY2Nlc3NvciB0byB0aGUgZWxlbWVudCBvZgorICAvLy8gdGhlIGdsb2JhbCwgdG8gdGhlIGN1cnJlbnRseSBrbm93biB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBiZWNvbWVzCisgIC8vLyBvdmVyZGVmaW5lZCwgaXQncyBlbnRyeSBpcyBzaW1wbHkgcmVtb3ZlZCBmcm9tIHRoaXMgbWFwLgorICBEZW5zZU1hcDxHbG9iYWxWYXJpYWJsZSosIExhdHRpY2VWYWw+IFRyYWNrZWRHbG9iYWxzOworCisgIC8vLyBUcmFja2VkUmV0VmFscyAtIElmIHdlIGFyZSB0cmFja2luZyBhcmd1bWVudHMgaW50byBhbmQgdGhlIHJldHVybgorICAvLy8gdmFsdWUgb3V0IG9mIGEgZnVuY3Rpb24sIGl0IHdpbGwgaGF2ZSBhbiBlbnRyeSBpbiB0aGlzIG1hcCwgaW5kaWNhdGluZworICAvLy8gd2hhdCB0aGUga25vd24gcmV0dXJuIHZhbHVlIGZvciB0aGUgZnVuY3Rpb24gaXMuCisgIERlbnNlTWFwPEZ1bmN0aW9uKiwgTGF0dGljZVZhbD4gVHJhY2tlZFJldFZhbHM7CisKKyAgLy8vIFRyYWNrZWRNdWx0aXBsZVJldFZhbHMgLSBTYW1lIGFzIFRyYWNrZWRSZXRWYWxzLCBidXQgdXNlZCBmb3IgZnVuY3Rpb25zCisgIC8vLyB0aGF0IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMuCisgIERlbnNlTWFwPHN0ZDo6cGFpcjxGdW5jdGlvbiosIHVuc2lnbmVkPiwgTGF0dGljZVZhbD4gVHJhY2tlZE11bHRpcGxlUmV0VmFsczsKKyAgCisgIC8vLyBNUlZGdW5jdGlvbnNUcmFja2VkIC0gRWFjaCBmdW5jdGlvbiBpbiBUcmFja2VkTXVsdGlwbGVSZXRWYWxzIGlzCisgIC8vLyByZXByZXNlbnRlZCBoZXJlIGZvciBlZmZpY2llbnQgbG9va3VwLgorICBTbWFsbFB0clNldDxGdW5jdGlvbiosIDE2PiBNUlZGdW5jdGlvbnNUcmFja2VkOworCisgIC8vLyBUcmFja2luZ0luY29taW5nQXJndW1lbnRzIC0gVGhpcyBpcyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyBmb3Igd2hvc2UKKyAgLy8vIGFyZ3VtZW50cyB3ZSBtYWtlIG9wdGltaXN0aWMgYXNzdW1wdGlvbnMgYWJvdXQgYW5kIHRyeSB0byBwcm92ZSBhcworICAvLy8gY29uc3RhbnRzLgorICBTbWFsbFB0clNldDxGdW5jdGlvbiosIDE2PiBUcmFja2luZ0luY29taW5nQXJndW1lbnRzOworICAKKyAgLy8vIFRoZSByZWFzb24gZm9yIHR3byB3b3JrbGlzdHMgaXMgdGhhdCBvdmVyZGVmaW5lZCBpcyB0aGUgbG93ZXN0IHN0YXRlCisgIC8vLyBvbiB0aGUgbGF0dGljZSwgYW5kIG1vdmluZyB0aGluZ3MgdG8gb3ZlcmRlZmluZWQgYXMgZmFzdCBhcyBwb3NzaWJsZQorICAvLy8gbWFrZXMgU0NDUCBjb252ZXJnZSBtdWNoIGZhc3Rlci4KKyAgLy8vCisgIC8vLyBCeSBoYXZpbmcgYSBzZXBhcmF0ZSB3b3JrbGlzdCwgd2UgYWNjb21wbGlzaCB0aGlzIGJlY2F1c2UgZXZlcnl0aGluZworICAvLy8gcG9zc2libHkgb3ZlcmRlZmluZWQgd2lsbCBiZWNvbWUgb3ZlcmRlZmluZWQgYXQgdGhlIHNvb25lc3QgcG9zc2libGUKKyAgLy8vIHBvaW50LgorICBTbWFsbFZlY3RvcjxWYWx1ZSosIDY0PiBPdmVyZGVmaW5lZEluc3RXb3JrTGlzdDsKKyAgU21hbGxWZWN0b3I8VmFsdWUqLCA2ND4gSW5zdFdvcmtMaXN0OworCisKKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDY0PiAgQkJXb3JrTGlzdDsgIC8vIFRoZSBCYXNpY0Jsb2NrIHdvcmsgbGlzdAorCisgIC8vLyBVc2Vyc09mT3ZlcmRlZmluZWRQSElzIC0gS2VlcCB0cmFjayBvZiBhbnkgdXNlcnMgb2YgUEhJIG5vZGVzIHRoYXQgYXJlIG5vdAorICAvLy8gb3ZlcmRlZmluZWQsIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGUgUEhJIG5vZGUgaXMgb3ZlcmRlZmluZWQuCisgIHN0ZDo6bXVsdGltYXA8UEhJTm9kZSosIEluc3RydWN0aW9uKj4gVXNlcnNPZk92ZXJkZWZpbmVkUEhJczsKKworICAvLy8gS25vd25GZWFzaWJsZUVkZ2VzIC0gRW50cmllcyBpbiB0aGlzIHNldCBhcmUgZWRnZXMgd2hpY2ggaGF2ZSBhbHJlYWR5IGhhZAorICAvLy8gUEhJIG5vZGVzIHJldHJpZ2dlcmVkLgorICB0eXBlZGVmIHN0ZDo6cGFpcjxCYXNpY0Jsb2NrKiwgQmFzaWNCbG9jayo+IEVkZ2U7CisgIERlbnNlU2V0PEVkZ2U+IEtub3duRmVhc2libGVFZGdlczsKK3B1YmxpYzoKKyAgU0NDUFNvbHZlcihjb25zdCBUYXJnZXREYXRhICp0ZCkgOiBURCh0ZCkge30KKworICAvLy8gTWFya0Jsb2NrRXhlY3V0YWJsZSAtIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gbWFyayBhbGwgb2YKKyAgLy8vIHRoZSBibG9ja3MgdGhhdCBhcmUga25vd24gdG8gYmUgaW50cmluc2ljYWxseSBsaXZlIGluIHRoZSBwcm9jZXNzZWQgdW5pdC4KKyAgLy8vCisgIC8vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgYmxvY2sgd2FzIG5vdCBjb25zaWRlcmVkIGxpdmUgYmVmb3JlLgorICBib29sIE1hcmtCbG9ja0V4ZWN1dGFibGUoQmFzaWNCbG9jayAqQkIpIHsKKyAgICBpZiAoIUJCRXhlY3V0YWJsZS5pbnNlcnQoQkIpKSByZXR1cm4gZmFsc2U7CisgICAgREVCVUcoZGJncygpIDw8ICJNYXJraW5nIEJsb2NrIEV4ZWN1dGFibGU6ICIgPDwgQkItPmdldE5hbWUoKSA8PCAiXG4iKTsKKyAgICBCQldvcmtMaXN0LnB1c2hfYmFjayhCQik7ICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSB3b3JrIGxpc3QhCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gVHJhY2tWYWx1ZU9mR2xvYmFsVmFyaWFibGUgLSBDbGllbnRzIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8KKyAgLy8vIGluZm9ybSB0aGUgU0NDUFNvbHZlciB0aGF0IGl0IHNob3VsZCB0cmFjayBsb2FkcyBhbmQgc3RvcmVzIHRvIHRoZQorICAvLy8gc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZSBpZiBpdCBjYW4uICBUaGlzIGlzIG9ubHkgbGVnYWwgdG8gY2FsbCBpZgorICAvLy8gcGVyZm9ybWluZyBJbnRlcnByb2NlZHVyYWwgU0NDUC4KKyAgdm9pZCBUcmFja1ZhbHVlT2ZHbG9iYWxWYXJpYWJsZShHbG9iYWxWYXJpYWJsZSAqR1YpIHsKKyAgICAvLyBXZSBvbmx5IHRyYWNrIHRoZSBjb250ZW50cyBvZiBzY2FsYXIgZ2xvYmFscy4KKyAgICBpZiAoR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNTaW5nbGVWYWx1ZVR5cGUoKSkgeworICAgICAgTGF0dGljZVZhbCAmSVYgPSBUcmFja2VkR2xvYmFsc1tHVl07CisgICAgICBpZiAoIWlzYTxVbmRlZlZhbHVlPihHVi0+Z2V0SW5pdGlhbGl6ZXIoKSkpCisgICAgICAgIElWLm1hcmtDb25zdGFudChHVi0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgICAgfQorICB9CisKKyAgLy8vIEFkZFRyYWNrZWRGdW5jdGlvbiAtIElmIHRoZSBTQ0NQIHNvbHZlciBpcyBzdXBwb3NlZCB0byB0cmFjayBjYWxscyBpbnRvCisgIC8vLyBhbmQgb3V0IG9mIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gKHdoaWNoIGNhbm5vdCBoYXZlIGl0cyBhZGRyZXNzIHRha2VuKSwKKyAgLy8vIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkLgorICB2b2lkIEFkZFRyYWNrZWRGdW5jdGlvbihGdW5jdGlvbiAqRikgeworICAgIC8vIEFkZCBhbiBlbnRyeSwgRiAtPiB1bmRlZi4KKyAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oRi0+Z2V0UmV0dXJuVHlwZSgpKSkgeworICAgICAgTVJWRnVuY3Rpb25zVHJhY2tlZC5pbnNlcnQoRik7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU1R5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgVHJhY2tlZE11bHRpcGxlUmV0VmFscy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RkOjptYWtlX3BhaXIoRiwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdHRpY2VWYWwoKSkpOworICAgIH0gZWxzZQorICAgICAgVHJhY2tlZFJldFZhbHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEYsIExhdHRpY2VWYWwoKSkpOworICB9CisKKyAgdm9pZCBBZGRBcmd1bWVudFRyYWNrZWRGdW5jdGlvbihGdW5jdGlvbiAqRikgeworICAgIFRyYWNraW5nSW5jb21pbmdBcmd1bWVudHMuaW5zZXJ0KEYpOworICB9CisgIAorICAvLy8gU29sdmUgLSBTb2x2ZSBmb3IgY29uc3RhbnRzIGFuZCBleGVjdXRhYmxlIGJsb2Nrcy4KKyAgLy8vCisgIHZvaWQgU29sdmUoKTsKKworICAvLy8gUmVzb2x2ZWRVbmRlZnNJbiAtIFdoaWxlIHNvbHZpbmcgdGhlIGRhdGFmbG93IGZvciBhIGZ1bmN0aW9uLCB3ZSBhc3N1bWUKKyAgLy8vIHRoYXQgYnJhbmNoZXMgb24gdW5kZWYgdmFsdWVzIGNhbm5vdCByZWFjaCBhbnkgb2YgdGhlaXIgc3VjY2Vzc29ycy4KKyAgLy8vIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGEgc2FmZSBhc3N1bXB0aW9uLiAgQWZ0ZXIgd2Ugc29sdmUgZGF0YWZsb3csIHRoaXMKKyAgLy8vIG1ldGhvZCBzaG91bGQgYmUgdXNlIHRvIGhhbmRsZSB0aGlzLiAgSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZSBzb2x2ZXIKKyAgLy8vIHNob3VsZCBiZSByZXJ1bi4KKyAgYm9vbCBSZXNvbHZlZFVuZGVmc0luKEZ1bmN0aW9uICZGKTsKKworICBib29sIGlzQmxvY2tFeGVjdXRhYmxlKEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIEJCRXhlY3V0YWJsZS5jb3VudChCQik7CisgIH0KKworICBMYXR0aWNlVmFsIGdldExhdHRpY2VWYWx1ZUZvcihWYWx1ZSAqVikgY29uc3QgeworICAgIERlbnNlTWFwPFZhbHVlKiwgTGF0dGljZVZhbD46OmNvbnN0X2l0ZXJhdG9yIEkgPSBWYWx1ZVN0YXRlLmZpbmQoVik7CisgICAgYXNzZXJ0KEkgIT0gVmFsdWVTdGF0ZS5lbmQoKSAmJiAiViBpcyBub3QgaW4gdmFsdWVtYXAhIik7CisgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorICAKKyAgTGF0dGljZVZhbCBnZXRTdHJ1Y3RMYXR0aWNlVmFsdWVGb3IoVmFsdWUgKlYsIHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBEZW5zZU1hcDxzdGQ6OnBhaXI8VmFsdWUqLCB1bnNpZ25lZD4sIExhdHRpY2VWYWw+Ojpjb25zdF9pdGVyYXRvciBJID0gCisgICAgICBTdHJ1Y3RWYWx1ZVN0YXRlLmZpbmQoc3RkOjptYWtlX3BhaXIoViwgaSkpOworICAgIGFzc2VydChJICE9IFN0cnVjdFZhbHVlU3RhdGUuZW5kKCkgJiYgIlYgaXMgbm90IGluIHZhbHVlbWFwISIpOworICAgIHJldHVybiBJLT5zZWNvbmQ7CisgIH0KKworICAvLy8gZ2V0VHJhY2tlZFJldFZhbHMgLSBHZXQgdGhlIGluZmVycmVkIHJldHVybiB2YWx1ZSBtYXAuCisgIC8vLworICBjb25zdCBEZW5zZU1hcDxGdW5jdGlvbiosIExhdHRpY2VWYWw+ICZnZXRUcmFja2VkUmV0VmFscygpIHsKKyAgICByZXR1cm4gVHJhY2tlZFJldFZhbHM7CisgIH0KKworICAvLy8gZ2V0VHJhY2tlZEdsb2JhbHMgLSBHZXQgYW5kIHJldHVybiB0aGUgc2V0IG9mIGluZmVycmVkIGluaXRpYWxpemVycyBmb3IKKyAgLy8vIGdsb2JhbCB2YXJpYWJsZXMuCisgIGNvbnN0IERlbnNlTWFwPEdsb2JhbFZhcmlhYmxlKiwgTGF0dGljZVZhbD4gJmdldFRyYWNrZWRHbG9iYWxzKCkgeworICAgIHJldHVybiBUcmFja2VkR2xvYmFsczsKKyAgfQorCisgIHZvaWQgbWFya092ZXJkZWZpbmVkKFZhbHVlICpWKSB7CisgICAgYXNzZXJ0KCFWLT5nZXRUeXBlKCktPmlzU3RydWN0VHkoKSAmJiAiU2hvdWxkIHVzZSBvdGhlciBtZXRob2QiKTsKKyAgICBtYXJrT3ZlcmRlZmluZWQoVmFsdWVTdGF0ZVtWXSwgVik7CisgIH0KKworICAvLy8gbWFya0FueXRoaW5nT3ZlcmRlZmluZWQgLSBNYXJrIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3ZlcmRlZmluZWQuICBUaGlzCisgIC8vLyB3b3JrcyB3aXRoIGJvdGggc2NhbGFycyBhbmQgc3RydWN0cy4KKyAgdm9pZCBtYXJrQW55dGhpbmdPdmVyZGVmaW5lZChWYWx1ZSAqVikgeworICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihWLT5nZXRUeXBlKCkpKQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNUeS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIG1hcmtPdmVyZGVmaW5lZChnZXRTdHJ1Y3RWYWx1ZVN0YXRlKFYsIGkpLCBWKTsKKyAgICBlbHNlCisgICAgICBtYXJrT3ZlcmRlZmluZWQoVik7CisgIH0KKyAgCitwcml2YXRlOgorICAvLyBtYXJrQ29uc3RhbnQgLSBNYWtlIGEgdmFsdWUgYmUgbWFya2VkIGFzICJjb25zdGFudCIuICBJZiB0aGUgdmFsdWUKKyAgLy8gaXMgbm90IGFscmVhZHkgYSBjb25zdGFudCwgYWRkIGl0IHRvIHRoZSBpbnN0cnVjdGlvbiB3b3JrIGxpc3Qgc28gdGhhdAorICAvLyB0aGUgdXNlcnMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSB1cGRhdGVkIGxhdGVyLgorICAvLworICB2b2lkIG1hcmtDb25zdGFudChMYXR0aWNlVmFsICZJViwgVmFsdWUgKlYsIENvbnN0YW50ICpDKSB7CisgICAgaWYgKCFJVi5tYXJrQ29uc3RhbnQoQykpIHJldHVybjsKKyAgICBERUJVRyhkYmdzKCkgPDwgIm1hcmtDb25zdGFudDogIiA8PCAqQyA8PCAiOiAiIDw8ICpWIDw8ICdcbicpOworICAgIGlmIChJVi5pc092ZXJkZWZpbmVkKCkpCisgICAgICBPdmVyZGVmaW5lZEluc3RXb3JrTGlzdC5wdXNoX2JhY2soVik7CisgICAgZWxzZQorICAgICAgSW5zdFdvcmtMaXN0LnB1c2hfYmFjayhWKTsKKyAgfQorICAKKyAgdm9pZCBtYXJrQ29uc3RhbnQoVmFsdWUgKlYsIENvbnN0YW50ICpDKSB7CisgICAgYXNzZXJ0KCFWLT5nZXRUeXBlKCktPmlzU3RydWN0VHkoKSAmJiAiU2hvdWxkIHVzZSBvdGhlciBtZXRob2QiKTsKKyAgICBtYXJrQ29uc3RhbnQoVmFsdWVTdGF0ZVtWXSwgViwgQyk7CisgIH0KKworICB2b2lkIG1hcmtGb3JjZWRDb25zdGFudChWYWx1ZSAqViwgQ29uc3RhbnQgKkMpIHsKKyAgICBhc3NlcnQoIVYtPmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpICYmICJTaG91bGQgdXNlIG90aGVyIG1ldGhvZCIpOworICAgIExhdHRpY2VWYWwgJklWID0gVmFsdWVTdGF0ZVtWXTsKKyAgICBJVi5tYXJrRm9yY2VkQ29uc3RhbnQoQyk7CisgICAgREVCVUcoZGJncygpIDw8ICJtYXJrRm9yY2VkQ29uc3RhbnQ6ICIgPDwgKkMgPDwgIjogIiA8PCAqViA8PCAnXG4nKTsKKyAgICBpZiAoSVYuaXNPdmVyZGVmaW5lZCgpKQorICAgICAgT3ZlcmRlZmluZWRJbnN0V29ya0xpc3QucHVzaF9iYWNrKFYpOworICAgIGVsc2UKKyAgICAgIEluc3RXb3JrTGlzdC5wdXNoX2JhY2soVik7CisgIH0KKyAgCisgIAorICAvLyBtYXJrT3ZlcmRlZmluZWQgLSBNYWtlIGEgdmFsdWUgYmUgbWFya2VkIGFzICJvdmVyZGVmaW5lZCIuIElmIHRoZQorICAvLyB2YWx1ZSBpcyBub3QgYWxyZWFkeSBvdmVyZGVmaW5lZCwgYWRkIGl0IHRvIHRoZSBvdmVyZGVmaW5lZCBpbnN0cnVjdGlvbgorICAvLyB3b3JrIGxpc3Qgc28gdGhhdCB0aGUgdXNlcnMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSB1cGRhdGVkIGxhdGVyLgorICB2b2lkIG1hcmtPdmVyZGVmaW5lZChMYXR0aWNlVmFsICZJViwgVmFsdWUgKlYpIHsKKyAgICBpZiAoIUlWLm1hcmtPdmVyZGVmaW5lZCgpKSByZXR1cm47CisgICAgCisgICAgREVCVUcoZGJncygpIDw8ICJtYXJrT3ZlcmRlZmluZWQ6ICI7CisgICAgICAgICAgaWYgKEZ1bmN0aW9uICpGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KFYpKQorICAgICAgICAgICAgZGJncygpIDw8ICJGdW5jdGlvbiAnIiA8PCBGLT5nZXROYW1lKCkgPDwgIidcbiI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZGJncygpIDw8ICpWIDw8ICdcbicpOworICAgIC8vIE9ubHkgaW5zdHJ1Y3Rpb25zIGdvIG9uIHRoZSB3b3JrIGxpc3QKKyAgICBPdmVyZGVmaW5lZEluc3RXb3JrTGlzdC5wdXNoX2JhY2soVik7CisgIH0KKworICB2b2lkIG1lcmdlSW5WYWx1ZShMYXR0aWNlVmFsICZJViwgVmFsdWUgKlYsIExhdHRpY2VWYWwgTWVyZ2VXaXRoVikgeworICAgIGlmIChJVi5pc092ZXJkZWZpbmVkKCkgfHwgTWVyZ2VXaXRoVi5pc1VuZGVmaW5lZCgpKQorICAgICAgcmV0dXJuOyAgLy8gTm9vcC4KKyAgICBpZiAoTWVyZ2VXaXRoVi5pc092ZXJkZWZpbmVkKCkpCisgICAgICBtYXJrT3ZlcmRlZmluZWQoSVYsIFYpOworICAgIGVsc2UgaWYgKElWLmlzVW5kZWZpbmVkKCkpCisgICAgICBtYXJrQ29uc3RhbnQoSVYsIFYsIE1lcmdlV2l0aFYuZ2V0Q29uc3RhbnQoKSk7CisgICAgZWxzZSBpZiAoSVYuZ2V0Q29uc3RhbnQoKSAhPSBNZXJnZVdpdGhWLmdldENvbnN0YW50KCkpCisgICAgICBtYXJrT3ZlcmRlZmluZWQoSVYsIFYpOworICB9CisgIAorICB2b2lkIG1lcmdlSW5WYWx1ZShWYWx1ZSAqViwgTGF0dGljZVZhbCBNZXJnZVdpdGhWKSB7CisgICAgYXNzZXJ0KCFWLT5nZXRUeXBlKCktPmlzU3RydWN0VHkoKSAmJiAiU2hvdWxkIHVzZSBvdGhlciBtZXRob2QiKTsKKyAgICBtZXJnZUluVmFsdWUoVmFsdWVTdGF0ZVtWXSwgViwgTWVyZ2VXaXRoVik7CisgIH0KKworCisgIC8vLyBnZXRWYWx1ZVN0YXRlIC0gUmV0dXJuIHRoZSBMYXR0aWNlVmFsIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQorICAvLy8gdmFsdWUuICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiB0aGUgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiB5ZXQKKyAgLy8vIGJ5IHByb3Blcmx5IHNlZWRpbmcgY29uc3RhbnRzIGV0Yy4KKyAgTGF0dGljZVZhbCAmZ2V0VmFsdWVTdGF0ZShWYWx1ZSAqVikgeworICAgIGFzc2VydCghVi0+Z2V0VHlwZSgpLT5pc1N0cnVjdFR5KCkgJiYgIlNob3VsZCB1c2UgZ2V0U3RydWN0VmFsdWVTdGF0ZSIpOworCisgICAgc3RkOjpwYWlyPERlbnNlTWFwPFZhbHVlKiwgTGF0dGljZVZhbD46Oml0ZXJhdG9yLCBib29sPiBJID0KKyAgICAgIFZhbHVlU3RhdGUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFYsIExhdHRpY2VWYWwoKSkpOworICAgIExhdHRpY2VWYWwgJkxWID0gSS5maXJzdC0+c2Vjb25kOworCisgICAgaWYgKCFJLnNlY29uZCkKKyAgICAgIHJldHVybiBMVjsgIC8vIENvbW1vbiBjYXNlLCBhbHJlYWR5IGluIHRoZSBtYXAuCisKKyAgICBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpIHsKKyAgICAgIC8vIFVuZGVmIHZhbHVlcyByZW1haW4gdW5kZWZpbmVkLgorICAgICAgaWYgKCFpc2E8VW5kZWZWYWx1ZT4oVikpCisgICAgICAgIExWLm1hcmtDb25zdGFudChDKTsgICAgICAgICAgLy8gQ29uc3RhbnRzIGFyZSBjb25zdGFudAorICAgIH0KKyAgICAKKyAgICAvLyBBbGwgb3RoZXJzIGFyZSB1bmRlcmRlZmluZWQgYnkgZGVmYXVsdC4KKyAgICByZXR1cm4gTFY7CisgIH0KKworICAvLy8gZ2V0U3RydWN0VmFsdWVTdGF0ZSAtIFJldHVybiB0aGUgTGF0dGljZVZhbCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKKyAgLy8vIHZhbHVlL2ZpZWxkIHBhaXIuICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiB0aGUgdmFsdWUgaGFzbid0CisgIC8vLyBiZWVuIHNlZW4geWV0IGJ5IHByb3Blcmx5IHNlZWRpbmcgY29uc3RhbnRzIGV0Yy4KKyAgTGF0dGljZVZhbCAmZ2V0U3RydWN0VmFsdWVTdGF0ZShWYWx1ZSAqViwgdW5zaWduZWQgaSkgeworICAgIGFzc2VydChWLT5nZXRUeXBlKCktPmlzU3RydWN0VHkoKSAmJiAiU2hvdWxkIHVzZSBnZXRWYWx1ZVN0YXRlIik7CisgICAgYXNzZXJ0KGkgPCBjYXN0PFN0cnVjdFR5cGU+KFYtPmdldFR5cGUoKSktPmdldE51bUVsZW1lbnRzKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgZWxlbWVudCAjIik7CisKKyAgICBzdGQ6OnBhaXI8RGVuc2VNYXA8c3RkOjpwYWlyPFZhbHVlKiwgdW5zaWduZWQ+LCBMYXR0aWNlVmFsPjo6aXRlcmF0b3IsCisgICAgICAgICAgICAgIGJvb2w+IEkgPSBTdHJ1Y3RWYWx1ZVN0YXRlLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bWFrZV9wYWlyKFYsIGkpLCBMYXR0aWNlVmFsKCkpKTsKKyAgICBMYXR0aWNlVmFsICZMViA9IEkuZmlyc3QtPnNlY29uZDsKKworICAgIGlmICghSS5zZWNvbmQpCisgICAgICByZXR1cm4gTFY7ICAvLyBDb21tb24gY2FzZSwgYWxyZWFkeSBpbiB0aGUgbWFwLgorCisgICAgaWYgKENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKSB7CisgICAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KEMpKQorICAgICAgICA7IC8vIFVuZGVmIHZhbHVlcyByZW1haW4gdW5kZWZpbmVkLgorICAgICAgZWxzZSBpZiAoQ29uc3RhbnRTdHJ1Y3QgKkNTID0gZHluX2Nhc3Q8Q29uc3RhbnRTdHJ1Y3Q+KEMpKQorICAgICAgICBMVi5tYXJrQ29uc3RhbnQoQ1MtPmdldE9wZXJhbmQoaSkpOyAgICAgIC8vIENvbnN0YW50cyBhcmUgY29uc3RhbnQuCisgICAgICBlbHNlIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihDKSkgeworICAgICAgICBjb25zdCBUeXBlICpGaWVsZFR5ID0gY2FzdDxTdHJ1Y3RUeXBlPihWLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZShpKTsKKyAgICAgICAgTFYubWFya0NvbnN0YW50KENvbnN0YW50OjpnZXROdWxsVmFsdWUoRmllbGRUeSkpOworICAgICAgfSBlbHNlCisgICAgICAgIExWLm1hcmtPdmVyZGVmaW5lZCgpOyAgICAgIC8vIFVua25vd24gc29ydCBvZiBjb25zdGFudC4KKyAgICB9CisgICAgCisgICAgLy8gQWxsIG90aGVycyBhcmUgdW5kZXJkZWZpbmVkIGJ5IGRlZmF1bHQuCisgICAgcmV0dXJuIExWOworICB9CisgIAorCisgIC8vLyBtYXJrRWRnZUV4ZWN1dGFibGUgLSBNYXJrIGEgYmFzaWMgYmxvY2sgYXMgZXhlY3V0YWJsZSwgYWRkaW5nIGl0IHRvIHRoZSBCQgorICAvLy8gd29yayBsaXN0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IGV4ZWN1dGFibGUuCisgIHZvaWQgbWFya0VkZ2VFeGVjdXRhYmxlKEJhc2ljQmxvY2sgKlNvdXJjZSwgQmFzaWNCbG9jayAqRGVzdCkgeworICAgIGlmICghS25vd25GZWFzaWJsZUVkZ2VzLmluc2VydChFZGdlKFNvdXJjZSwgRGVzdCkpLnNlY29uZCkKKyAgICAgIHJldHVybjsgIC8vIFRoaXMgZWRnZSBpcyBhbHJlYWR5IGtub3duIHRvIGJlIGV4ZWN1dGFibGUhCisKKyAgICBpZiAoIU1hcmtCbG9ja0V4ZWN1dGFibGUoRGVzdCkpIHsKKyAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IGV4ZWN1dGFibGUsIHdlIGp1c3QgbWFkZSBhbiAqZWRnZSoKKyAgICAgIC8vIGZlYXNpYmxlIHRoYXQgd2Fzbid0IGJlZm9yZS4gIFJldmlzaXQgdGhlIFBISSBub2RlcyBpbiB0aGUgYmxvY2sKKyAgICAgIC8vIGJlY2F1c2UgdGhleSBoYXZlIHBvdGVudGlhbGx5IG5ldyBvcGVyYW5kcy4KKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiTWFya2luZyBFZGdlIEV4ZWN1dGFibGU6ICIgPDwgU291cmNlLT5nZXROYW1lKCkKKyAgICAgICAgICAgIDw8ICIgLT4gIiA8PCBEZXN0LT5nZXROYW1lKCkgPDwgIlxuIik7CisKKyAgICAgIFBISU5vZGUgKlBOOworICAgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gRGVzdC0+YmVnaW4oKTsKKyAgICAgICAgICAgKFBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSSkpOyArK0kpCisgICAgICAgIHZpc2l0UEhJTm9kZSgqUE4pOworICAgIH0KKyAgfQorCisgIC8vIGdldEZlYXNpYmxlU3VjY2Vzc29ycyAtIFJldHVybiBhIHZlY3RvciBvZiBib29sZWFucyB0byBpbmRpY2F0ZSB3aGljaAorICAvLyBzdWNjZXNzb3JzIGFyZSByZWFjaGFibGUgZnJvbSBhIGdpdmVuIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24uCisgIC8vCisgIHZvaWQgZ2V0RmVhc2libGVTdWNjZXNzb3JzKFRlcm1pbmF0b3JJbnN0ICZUSSwgU21hbGxWZWN0b3I8Ym9vbCwgMTY+ICZTdWNjcyk7CisKKyAgLy8gaXNFZGdlRmVhc2libGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29udHJvbCBmbG93IGVkZ2UgZnJvbSB0aGUgJ0Zyb20nIGJhc2ljCisgIC8vIGJsb2NrIHRvIHRoZSAnVG8nIGJhc2ljIGJsb2NrIGlzIGN1cnJlbnRseSBmZWFzaWJsZS4KKyAgLy8KKyAgYm9vbCBpc0VkZ2VGZWFzaWJsZShCYXNpY0Jsb2NrICpGcm9tLCBCYXNpY0Jsb2NrICpUbyk7CisKKyAgLy8gT3BlcmFuZENoYW5nZWRTdGF0ZSAtIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgb24gYWxsIG9mIHRoZSB1c2VycyBvZiBhbgorICAvLyBpbnN0cnVjdGlvbiB0aGF0IHdhcyBqdXN0IGNoYW5nZWQgc3RhdGUgc29tZWhvdy4gIEJhc2VkIG9uIHRoaXMKKyAgLy8gaW5mb3JtYXRpb24sIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzcGVjaWZpZWQgdXNlciBvZiB0aGlzIGluc3RydWN0aW9uLgorICAvLworICB2b2lkIE9wZXJhbmRDaGFuZ2VkU3RhdGUoSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBpZiAoQkJFeGVjdXRhYmxlLmNvdW50KEktPmdldFBhcmVudCgpKSkgICAvLyBJbnN0IGlzIGV4ZWN1dGFibGU/CisgICAgICB2aXNpdCgqSSk7CisgIH0KKyAgCisgIC8vLyBSZW1vdmVGcm9tT3ZlcmRlZmluZWRQSElzIC0gSWYgSSBoYXMgYW55IGVudHJpZXMgaW4gdGhlCisgIC8vLyBVc2Vyc09mT3ZlcmRlZmluZWRQSElzIG1hcCBmb3IgUE4sIHJlbW92ZSB0aGVtIG5vdy4KKyAgdm9pZCBSZW1vdmVGcm9tT3ZlcmRlZmluZWRQSElzKEluc3RydWN0aW9uICpJLCBQSElOb2RlICpQTikgeworICAgIGlmIChVc2Vyc09mT3ZlcmRlZmluZWRQSElzLmVtcHR5KCkpIHJldHVybjsKKyAgICBzdGQ6Om11bHRpbWFwPFBISU5vZGUqLCBJbnN0cnVjdGlvbio+OjppdGVyYXRvciBJdCwgRTsKKyAgICB0aWUoSXQsIEUpID0gVXNlcnNPZk92ZXJkZWZpbmVkUEhJcy5lcXVhbF9yYW5nZShQTik7CisgICAgd2hpbGUgKEl0ICE9IEUpIHsKKyAgICAgIGlmIChJdC0+c2Vjb25kID09IEkpCisgICAgICAgIFVzZXJzT2ZPdmVyZGVmaW5lZFBISXMuZXJhc2UoSXQrKyk7CisgICAgICBlbHNlCisgICAgICAgICsrSXQ7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBJbnN0VmlzaXRvcjxTQ0NQU29sdmVyPjsKKworICAvLyB2aXNpdCBpbXBsZW1lbnRhdGlvbnMgLSBTb21ldGhpbmcgY2hhbmdlZCBpbiB0aGlzIGluc3RydWN0aW9uLiAgRWl0aGVyIGFuCisgIC8vIG9wZXJhbmQgbWFkZSBhIHRyYW5zaXRpb24sIG9yIHRoZSBpbnN0cnVjdGlvbiBpcyBuZXdseSBleGVjdXRhYmxlLiAgQ2hhbmdlCisgIC8vIHRoZSB2YWx1ZSB0eXBlIG9mIEkgdG8gcmVmbGVjdCB0aGVzZSBjaGFuZ2VzIGlmIGFwcHJvcHJpYXRlLgorICB2b2lkIHZpc2l0UEhJTm9kZShQSElOb2RlICZJKTsKKworICAvLyBUZXJtaW5hdG9ycworICB2b2lkIHZpc2l0UmV0dXJuSW5zdChSZXR1cm5JbnN0ICZJKTsKKyAgdm9pZCB2aXNpdFRlcm1pbmF0b3JJbnN0KFRlcm1pbmF0b3JJbnN0ICZUSSk7CisKKyAgdm9pZCB2aXNpdENhc3RJbnN0KENhc3RJbnN0ICZJKTsKKyAgdm9pZCB2aXNpdFNlbGVjdEluc3QoU2VsZWN0SW5zdCAmSSk7CisgIHZvaWQgdmlzaXRCaW5hcnlPcGVyYXRvcihJbnN0cnVjdGlvbiAmSSk7CisgIHZvaWQgdmlzaXRDbXBJbnN0KENtcEluc3QgJkkpOworICB2b2lkIHZpc2l0RXh0cmFjdEVsZW1lbnRJbnN0KEV4dHJhY3RFbGVtZW50SW5zdCAmSSk7CisgIHZvaWQgdmlzaXRJbnNlcnRFbGVtZW50SW5zdChJbnNlcnRFbGVtZW50SW5zdCAmSSk7CisgIHZvaWQgdmlzaXRTaHVmZmxlVmVjdG9ySW5zdChTaHVmZmxlVmVjdG9ySW5zdCAmSSk7CisgIHZvaWQgdmlzaXRFeHRyYWN0VmFsdWVJbnN0KEV4dHJhY3RWYWx1ZUluc3QgJkVWSSk7CisgIHZvaWQgdmlzaXRJbnNlcnRWYWx1ZUluc3QoSW5zZXJ0VmFsdWVJbnN0ICZJVkkpOworCisgIC8vIEluc3RydWN0aW9ucyB0aGF0IGNhbm5vdCBiZSBmb2xkZWQgYXdheS4KKyAgdm9pZCB2aXNpdFN0b3JlSW5zdCAgICAgKFN0b3JlSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRMb2FkSW5zdCAgICAgIChMb2FkSW5zdCAmSSk7CisgIHZvaWQgdmlzaXRHZXRFbGVtZW50UHRySW5zdChHZXRFbGVtZW50UHRySW5zdCAmSSk7CisgIHZvaWQgdmlzaXRDYWxsSW5zdCAgICAgIChDYWxsSW5zdCAmSSkgeworICAgIHZpc2l0Q2FsbFNpdGUoJkkpOworICB9CisgIHZvaWQgdmlzaXRDYWxsU2l0ZSAgICAgIChDYWxsU2l0ZSBDUyk7CisgIHZvaWQgdmlzaXRVbnJlYWNoYWJsZUluc3QoVGVybWluYXRvckluc3QgJkkpIHsgLypyZXR1cm5zIHZvaWQqLyB9CisgIHZvaWQgdmlzaXRBbGxvY2FJbnN0ICAgIChJbnN0cnVjdGlvbiAmSSkgeyBtYXJrT3ZlcmRlZmluZWQoJkkpOyB9CisgIHZvaWQgdmlzaXRWQU5leHRJbnN0ICAgIChJbnN0cnVjdGlvbiAmSSkgeyBtYXJrT3ZlcmRlZmluZWQoJkkpOyB9CisgIHZvaWQgdmlzaXRWQUFyZ0luc3QgICAgIChJbnN0cnVjdGlvbiAmSSkgeyBtYXJrQW55dGhpbmdPdmVyZGVmaW5lZCgmSSk7IH0KKworICB2b2lkIHZpc2l0SW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgICAvLyBJZiBhIG5ldyBpbnN0cnVjdGlvbiBpcyBhZGRlZCB0byBMTFZNIHRoYXQgd2UgZG9uJ3QgaGFuZGxlLgorICAgIGRiZ3MoKSA8PCAiU0NDUDogRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlOiAiIDw8IEk7CisgICAgbWFya0FueXRoaW5nT3ZlcmRlZmluZWQoJkkpOyAgIC8vIEp1c3QgaW4gY2FzZQorICB9Cit9OworCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKworLy8gZ2V0RmVhc2libGVTdWNjZXNzb3JzIC0gUmV0dXJuIGEgdmVjdG9yIG9mIGJvb2xlYW5zIHRvIGluZGljYXRlIHdoaWNoCisvLyBzdWNjZXNzb3JzIGFyZSByZWFjaGFibGUgZnJvbSBhIGdpdmVuIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24uCisvLwordm9pZCBTQ0NQU29sdmVyOjpnZXRGZWFzaWJsZVN1Y2Nlc3NvcnMoVGVybWluYXRvckluc3QgJlRJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8Ym9vbCwgMTY+ICZTdWNjcykgeworICBTdWNjcy5yZXNpemUoVEkuZ2V0TnVtU3VjY2Vzc29ycygpKTsKKyAgaWYgKEJyYW5jaEluc3QgKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oJlRJKSkgeworICAgIGlmIChCSS0+aXNVbmNvbmRpdGlvbmFsKCkpIHsKKyAgICAgIFN1Y2NzWzBdID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgTGF0dGljZVZhbCBCQ1ZhbHVlID0gZ2V0VmFsdWVTdGF0ZShCSS0+Z2V0Q29uZGl0aW9uKCkpOworICAgIENvbnN0YW50SW50ICpDSSA9IEJDVmFsdWUuZ2V0Q29uc3RhbnRJbnQoKTsKKyAgICBpZiAoQ0kgPT0gMCkgeworICAgICAgLy8gT3ZlcmRlZmluZWQgY29uZGl0aW9uIHZhcmlhYmxlcywgYW5kIGJyYW5jaGVzIG9uIHVuZm9sZGFibGUgY29uc3RhbnQKKyAgICAgIC8vIGNvbmRpdGlvbnMsIG1lYW4gdGhlIGJyYW5jaCBjb3VsZCBnbyBlaXRoZXIgd2F5LgorICAgICAgaWYgKCFCQ1ZhbHVlLmlzVW5kZWZpbmVkKCkpCisgICAgICAgIFN1Y2NzWzBdID0gU3VjY3NbMV0gPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBDb25zdGFudCBjb25kaXRpb24gdmFyaWFibGVzIG1lYW4gdGhlIGJyYW5jaCBjYW4gb25seSBnbyBhIHNpbmdsZSB3YXkuCisgICAgU3VjY3NbQ0ktPmlzWmVybygpXSA9IHRydWU7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZiAoU3dpdGNoSW5zdCAqU0kgPSBkeW5fY2FzdDxTd2l0Y2hJbnN0PigmVEkpKSB7CisgICAgTGF0dGljZVZhbCBTQ1ZhbHVlID0gZ2V0VmFsdWVTdGF0ZShTSS0+Z2V0Q29uZGl0aW9uKCkpOworICAgIENvbnN0YW50SW50ICpDSSA9IFNDVmFsdWUuZ2V0Q29uc3RhbnRJbnQoKTsKKyAgICAKKyAgICBpZiAoQ0kgPT0gMCkgeyAgIC8vIE92ZXJkZWZpbmVkIG9yIHVuZGVmaW5lZCBjb25kaXRpb24/CisgICAgICAvLyBBbGwgZGVzdGluYXRpb25zIGFyZSBleGVjdXRhYmxlIQorICAgICAgaWYgKCFTQ1ZhbHVlLmlzVW5kZWZpbmVkKCkpCisgICAgICAgIFN1Y2NzLmFzc2lnbihUSS5nZXROdW1TdWNjZXNzb3JzKCksIHRydWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgIAorICAgIFN1Y2NzW1NJLT5maW5kQ2FzZVZhbHVlKENJKV0gPSB0cnVlOworICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBpZiB0aGUgb3BlcmFuZCBpcyBhIFtjYXN0IG9mIGFdIEJsb2NrQWRkcmVzcy4KKyAgaWYgKGlzYTxJbmRpcmVjdEJySW5zdD4oJlRJKSkgeworICAgIC8vIEp1c3QgbWFyayBhbGwgZGVzdGluYXRpb25zIGV4ZWN1dGFibGUhCisgICAgU3VjY3MuYXNzaWduKFRJLmdldE51bVN1Y2Nlc3NvcnMoKSwgdHJ1ZSk7CisgICAgcmV0dXJuOworICB9CisgIAorI2lmbmRlZiBOREVCVUcKKyAgZGJncygpIDw8ICJVbmtub3duIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb246ICIgPDwgVEkgPDwgJ1xuJzsKKyNlbmRpZgorICBsbHZtX3VucmVhY2hhYmxlKCJTQ0NQOiBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcyB0ZXJtaW5hdG9yISIpOworfQorCisKKy8vIGlzRWRnZUZlYXNpYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnRyb2wgZmxvdyBlZGdlIGZyb20gdGhlICdGcm9tJyBiYXNpYworLy8gYmxvY2sgdG8gdGhlICdUbycgYmFzaWMgYmxvY2sgaXMgY3VycmVudGx5IGZlYXNpYmxlLgorLy8KK2Jvb2wgU0NDUFNvbHZlcjo6aXNFZGdlRmVhc2libGUoQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8pIHsKKyAgYXNzZXJ0KEJCRXhlY3V0YWJsZS5jb3VudChUbykgJiYgIkRlc3Qgc2hvdWxkIGFsd2F5cyBiZSBhbGl2ZSEiKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIHNvdXJjZSBiYXNpYyBibG9jayBpcyBleGVjdXRhYmxlISEKKyAgaWYgKCFCQkV4ZWN1dGFibGUuY291bnQoRnJvbSkpIHJldHVybiBmYWxzZTsKKworICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhpcyBlZGdlIGl0c2VsZiBpcyBhY3R1YWxseSBmZWFzaWJsZSBub3cuCisgIFRlcm1pbmF0b3JJbnN0ICpUSSA9IEZyb20tPmdldFRlcm1pbmF0b3IoKTsKKyAgaWYgKEJyYW5jaEluc3QgKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oVEkpKSB7CisgICAgaWYgKEJJLT5pc1VuY29uZGl0aW9uYWwoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIExhdHRpY2VWYWwgQkNWYWx1ZSA9IGdldFZhbHVlU3RhdGUoQkktPmdldENvbmRpdGlvbigpKTsKKworICAgIC8vIE92ZXJkZWZpbmVkIGNvbmRpdGlvbiB2YXJpYWJsZXMgbWVhbiB0aGUgYnJhbmNoIGNvdWxkIGdvIGVpdGhlciB3YXksCisgICAgLy8gdW5kZWYgY29uZGl0aW9ucyBtZWFuIHRoYXQgbmVpdGhlciBlZGdlIGlzIGZlYXNpYmxlIHlldC4KKyAgICBDb25zdGFudEludCAqQ0kgPSBCQ1ZhbHVlLmdldENvbnN0YW50SW50KCk7CisgICAgaWYgKENJID09IDApCisgICAgICByZXR1cm4gIUJDVmFsdWUuaXNVbmRlZmluZWQoKTsKKyAgICAKKyAgICAvLyBDb25zdGFudCBjb25kaXRpb24gdmFyaWFibGVzIG1lYW4gdGhlIGJyYW5jaCBjYW4gb25seSBnbyBhIHNpbmdsZSB3YXkuCisgICAgcmV0dXJuIEJJLT5nZXRTdWNjZXNzb3IoQ0ktPmlzWmVybygpKSA9PSBUbzsKKyAgfQorICAKKyAgaWYgKFN3aXRjaEluc3QgKlNJID0gZHluX2Nhc3Q8U3dpdGNoSW5zdD4oVEkpKSB7CisgICAgTGF0dGljZVZhbCBTQ1ZhbHVlID0gZ2V0VmFsdWVTdGF0ZShTSS0+Z2V0Q29uZGl0aW9uKCkpOworICAgIENvbnN0YW50SW50ICpDSSA9IFNDVmFsdWUuZ2V0Q29uc3RhbnRJbnQoKTsKKyAgICAKKyAgICBpZiAoQ0kgPT0gMCkKKyAgICAgIHJldHVybiAhU0NWYWx1ZS5pc1VuZGVmaW5lZCgpOworCisgICAgLy8gTWFrZSBzdXJlIHRvIHNraXAgdGhlICJkZWZhdWx0IHZhbHVlIiB3aGljaCBpc24ndCBhIHZhbHVlCisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgRSA9IFNJLT5nZXROdW1TdWNjZXNzb3JzKCk7IGkgIT0gRTsgKytpKQorICAgICAgaWYgKFNJLT5nZXRTdWNjZXNzb3JWYWx1ZShpKSA9PSBDSSkgLy8gRm91bmQgdGhlIHRha2VuIGJyYW5jaC4KKyAgICAgICAgcmV0dXJuIFNJLT5nZXRTdWNjZXNzb3IoaSkgPT0gVG87CisKKyAgICAvLyBJZiB0aGUgY29uc3RhbnQgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGFueSBvZiB0aGUgYnJhbmNoZXMsIHdlIG11c3QKKyAgICAvLyBleGVjdXRlIGRlZmF1bHQgYnJhbmNoLgorICAgIHJldHVybiBTSS0+Z2V0RGVmYXVsdERlc3QoKSA9PSBUbzsKKyAgfQorICAKKyAgLy8gSnVzdCBtYXJrIGFsbCBkZXN0aW5hdGlvbnMgZXhlY3V0YWJsZSEKKyAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBpZiB0aGUgb3BlcmFuZCBpcyBhIFtjYXN0IG9mIGFdIEJsb2NrQWRkcmVzcy4KKyAgaWYgKGlzYTxJbmRpcmVjdEJySW5zdD4oJlRJKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgCisjaWZuZGVmIE5ERUJVRworICBkYmdzKCkgPDwgIlVua25vd24gdGVybWluYXRvciBpbnN0cnVjdGlvbjogIiA8PCAqVEkgPDwgJ1xuJzsKKyNlbmRpZgorICBsbHZtX3VucmVhY2hhYmxlKDApOworfQorCisvLyB2aXNpdCBJbXBsZW1lbnRhdGlvbnMgLSBTb21ldGhpbmcgY2hhbmdlZCBpbiB0aGlzIGluc3RydWN0aW9uLCBlaXRoZXIgYW4KKy8vIG9wZXJhbmQgbWFkZSBhIHRyYW5zaXRpb24sIG9yIHRoZSBpbnN0cnVjdGlvbiBpcyBuZXdseSBleGVjdXRhYmxlLiAgQ2hhbmdlCisvLyB0aGUgdmFsdWUgdHlwZSBvZiBJIHRvIHJlZmxlY3QgdGhlc2UgY2hhbmdlcyBpZiBhcHByb3ByaWF0ZS4gIFRoaXMgbWV0aG9kCisvLyBtYWtlcyBzdXJlIHRvIGRvIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKy8vCisvLyAxLiBJZiBhIHBoaSBub2RlIG1lcmdlcyB0d28gY29uc3RhbnRzIGluLCBhbmQgaGFzIGNvbmZsaWN0aW5nIHZhbHVlIGNvbWluZworLy8gICAgZnJvbSBkaWZmZXJlbnQgYnJhbmNoZXMsIG9yIGlmIHRoZSBQSEkgbm9kZSBtZXJnZXMgaW4gYW4gb3ZlcmRlZmluZWQKKy8vICAgIHZhbHVlLCB0aGVuIHRoZSBQSEkgbm9kZSBiZWNvbWVzIG92ZXJkZWZpbmVkLgorLy8gMi4gSWYgYSBwaGkgbm9kZSBtZXJnZXMgb25seSBjb25zdGFudHMgaW4sIGFuZCB0aGV5IGFsbCBhZ3JlZSBvbiB2YWx1ZSwgdGhlCisvLyAgICBQSEkgbm9kZSBiZWNvbWVzIGEgY29uc3RhbnQgdmFsdWUgZXF1YWwgdG8gdGhhdC4KKy8vIDMuIElmIFYgPC0geCAob3ApIHkgJiYgaXNDb25zdGFudCh4KSAmJiBpc0NvbnN0YW50KHkpIFYgPSBDb25zdGFudAorLy8gNC4gSWYgViA8LSB4IChvcCkgeSAmJiAoaXNPdmVyZGVmaW5lZCh4KSB8fCBpc092ZXJkZWZpbmVkKHkpKSBWID0gT3ZlcmRlZmluZWQKKy8vIDUuIElmIFYgPC0gTUVNIG9yIFYgPC0gQ0FMTCBvciBWIDwtICh1bmtub3duKSB0aGVuIFYgPSBPdmVyZGVmaW5lZAorLy8gNi4gSWYgYSBjb25kaXRpb25hbCBicmFuY2ggaGFzIGEgdmFsdWUgdGhhdCBpcyBjb25zdGFudCwgbWFrZSB0aGUgc2VsZWN0ZWQKKy8vICAgIGRlc3RpbmF0aW9uIGV4ZWN1dGFibGUKKy8vIDcuIElmIGEgY29uZGl0aW9uYWwgYnJhbmNoIGhhcyBhIHZhbHVlIHRoYXQgaXMgb3ZlcmRlZmluZWQsIG1ha2UgYWxsCisvLyAgICBzdWNjZXNzb3JzIGV4ZWN1dGFibGUuCisvLwordm9pZCBTQ0NQU29sdmVyOjp2aXNpdFBISU5vZGUoUEhJTm9kZSAmUE4pIHsKKyAgLy8gSWYgdGhpcyBQTiByZXR1cm5zIGEgc3RydWN0LCBqdXN0IG1hcmsgdGhlIHJlc3VsdCBvdmVyZGVmaW5lZC4KKyAgLy8gVE9ETzogV2UgY291bGQgZG8gYSBsb3QgYmV0dGVyIHRoYW4gdGhpcyBpZiBjb2RlIGFjdHVhbGx5IHVzZXMgdGhpcy4KKyAgaWYgKFBOLmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpKQorICAgIHJldHVybiBtYXJrQW55dGhpbmdPdmVyZGVmaW5lZCgmUE4pOworICAKKyAgaWYgKGdldFZhbHVlU3RhdGUoJlBOKS5pc092ZXJkZWZpbmVkKCkpIHsKKyAgICAvLyBUaGVyZSBtYXkgYmUgaW5zdHJ1Y3Rpb25zIHVzaW5nIHRoaXMgUEhJIG5vZGUgdGhhdCBhcmUgbm90IG92ZXJkZWZpbmVkCisgICAgLy8gdGhlbXNlbHZlcy4gIElmIHNvLCBtYWtlIHN1cmUgdGhhdCB0aGV5IGtub3cgdGhhdCB0aGUgUEhJIG5vZGUgb3BlcmFuZAorICAgIC8vIGNoYW5nZWQuCisgICAgc3RkOjptdWx0aW1hcDxQSElOb2RlKiwgSW5zdHJ1Y3Rpb24qPjo6aXRlcmF0b3IgSSwgRTsKKyAgICB0aWUoSSwgRSkgPSBVc2Vyc09mT3ZlcmRlZmluZWRQSElzLmVxdWFsX3JhbmdlKCZQTik7CisgICAgaWYgKEkgPT0gRSkKKyAgICAgIHJldHVybjsKKyAgICAKKyAgICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiosIDE2PiBVc2VyczsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpCisgICAgICBVc2Vycy5wdXNoX2JhY2soSS0+c2Vjb25kKTsKKyAgICB3aGlsZSAoIVVzZXJzLmVtcHR5KCkpCisgICAgICB2aXNpdChVc2Vycy5wb3BfYmFja192YWwoKSk7CisgICAgcmV0dXJuOyAgLy8gUXVpY2sgZXhpdAorICB9CisKKyAgLy8gU3VwZXItZXh0cmEtaGlnaC1kZWdyZWUgUEhJIG5vZGVzIGFyZSB1bmxpa2VseSB0byBldmVyIGJlIG1hcmtlZCBjb25zdGFudCwKKyAgLy8gYW5kIHNsb3cgdXMgZG93biBhIGxvdC4gIEp1c3QgbWFyayB0aGVtIG92ZXJkZWZpbmVkLgorICBpZiAoUE4uZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKSA+IDY0KQorICAgIHJldHVybiBtYXJrT3ZlcmRlZmluZWQoJlBOKTsKKyAgCisgIC8vIExvb2sgYXQgYWxsIG9mIHRoZSBleGVjdXRhYmxlIG9wZXJhbmRzIG9mIHRoZSBQSEkgbm9kZS4gIElmIGFueSBvZiB0aGVtCisgIC8vIGFyZSBvdmVyZGVmaW5lZCwgdGhlIFBISSBiZWNvbWVzIG92ZXJkZWZpbmVkIGFzIHdlbGwuICBJZiB0aGV5IGFyZSBhbGwKKyAgLy8gY29uc3RhbnQsIGFuZCB0aGV5IGFncmVlIHdpdGggZWFjaCBvdGhlciwgdGhlIFBISSBiZWNvbWVzIHRoZSBpZGVudGljYWwKKyAgLy8gY29uc3RhbnQuICBJZiB0aGV5IGFyZSBjb25zdGFudCBhbmQgZG9uJ3QgYWdyZWUsIHRoZSBQSEkgaXMgb3ZlcmRlZmluZWQuCisgIC8vIElmIHRoZXJlIGFyZSBubyBleGVjdXRhYmxlIG9wZXJhbmRzLCB0aGUgUEhJIHJlbWFpbnMgdW5kZWZpbmVkLgorICAvLworICBDb25zdGFudCAqT3BlcmFuZFZhbCA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgIExhdHRpY2VWYWwgSVYgPSBnZXRWYWx1ZVN0YXRlKFBOLmdldEluY29taW5nVmFsdWUoaSkpOworICAgIGlmIChJVi5pc1VuZGVmaW5lZCgpKSBjb250aW51ZTsgIC8vIERvZXNuJ3QgaW5mbHVlbmNlIFBISSBub2RlLgorCisgICAgaWYgKCFpc0VkZ2VGZWFzaWJsZShQTi5nZXRJbmNvbWluZ0Jsb2NrKGkpLCBQTi5nZXRQYXJlbnQoKSkpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICBpZiAoSVYuaXNPdmVyZGVmaW5lZCgpKSAgICAvLyBQSEkgbm9kZSBiZWNvbWVzIG92ZXJkZWZpbmVkIQorICAgICAgcmV0dXJuIG1hcmtPdmVyZGVmaW5lZCgmUE4pOworCisgICAgaWYgKE9wZXJhbmRWYWwgPT0gMCkgeyAgIC8vIEdyYWIgdGhlIGZpcnN0IHZhbHVlLgorICAgICAgT3BlcmFuZFZhbCA9IElWLmdldENvbnN0YW50KCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gVGhlcmUgaXMgYWxyZWFkeSBhIHJlYWNoYWJsZSBvcGVyYW5kLiAgSWYgd2UgY29uZmxpY3Qgd2l0aCBpdCwKKyAgICAvLyB0aGVuIHRoZSBQSEkgbm9kZSBiZWNvbWVzIG92ZXJkZWZpbmVkLiAgSWYgd2UgYWdyZWUgd2l0aCBpdCwgd2UKKyAgICAvLyBjYW4gY29udGludWUgb24uCisgICAgCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGNvbnN0YW50cyBtZXJnaW5nLCBpZiBzbywgdGhlIFBISQorICAgIC8vIG5vZGUgaXMgb3ZlcmRlZmluZWQuCisgICAgaWYgKElWLmdldENvbnN0YW50KCkgIT0gT3BlcmFuZFZhbCkKKyAgICAgIHJldHVybiBtYXJrT3ZlcmRlZmluZWQoJlBOKTsKKyAgfQorCisgIC8vIElmIHdlIGV4aXRlZCB0aGUgbG9vcCwgdGhpcyBtZWFucyB0aGF0IHRoZSBQSEkgbm9kZSBvbmx5IGhhcyBjb25zdGFudAorICAvLyBhcmd1bWVudHMgdGhhdCBhZ3JlZSB3aXRoIGVhY2ggb3RoZXIoYW5kIE9wZXJhbmRWYWwgaXMgdGhlIGNvbnN0YW50KSBvcgorICAvLyBPcGVyYW5kVmFsIGlzIG51bGwgYmVjYXVzZSB0aGVyZSBhcmUgbm8gZGVmaW5lZCBpbmNvbWluZyBhcmd1bWVudHMuICBJZgorICAvLyB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgUEhJIHJlbWFpbnMgdW5kZWZpbmVkLgorICAvLworICBpZiAoT3BlcmFuZFZhbCkKKyAgICBtYXJrQ29uc3RhbnQoJlBOLCBPcGVyYW5kVmFsKTsgICAgICAvLyBBY3F1aXJlIG9wZXJhbmQgdmFsdWUKK30KKworCisKKwordm9pZCBTQ0NQU29sdmVyOjp2aXNpdFJldHVybkluc3QoUmV0dXJuSW5zdCAmSSkgeworICBpZiAoSS5nZXROdW1PcGVyYW5kcygpID09IDApIHJldHVybjsgIC8vIHJldCB2b2lkCisKKyAgRnVuY3Rpb24gKkYgPSBJLmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgVmFsdWUgKlJlc3VsdE9wID0gSS5nZXRPcGVyYW5kKDApOworICAKKyAgLy8gSWYgd2UgYXJlIHRyYWNraW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiwgbWVyZ2UgaXQgaW4uCisgIGlmICghVHJhY2tlZFJldFZhbHMuZW1wdHkoKSAmJiAhUmVzdWx0T3AtPmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpKSB7CisgICAgRGVuc2VNYXA8RnVuY3Rpb24qLCBMYXR0aWNlVmFsPjo6aXRlcmF0b3IgVEZSVkkgPQorICAgICAgVHJhY2tlZFJldFZhbHMuZmluZChGKTsKKyAgICBpZiAoVEZSVkkgIT0gVHJhY2tlZFJldFZhbHMuZW5kKCkpIHsKKyAgICAgIG1lcmdlSW5WYWx1ZShURlJWSS0+c2Vjb25kLCBGLCBnZXRWYWx1ZVN0YXRlKFJlc3VsdE9wKSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIAorICAvLyBIYW5kbGUgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG11bHRpcGxlIHZhbHVlcy4KKyAgaWYgKCFUcmFja2VkTXVsdGlwbGVSZXRWYWxzLmVtcHR5KCkpIHsKKyAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oUmVzdWx0T3AtPmdldFR5cGUoKSkpCisgICAgICBpZiAoTVJWRnVuY3Rpb25zVHJhY2tlZC5jb3VudChGKSkKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNUeS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgbWVyZ2VJblZhbHVlKFRyYWNrZWRNdWx0aXBsZVJldFZhbHNbc3RkOjptYWtlX3BhaXIoRiwgaSldLCBGLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJ1Y3RWYWx1ZVN0YXRlKFJlc3VsdE9wLCBpKSk7CisgICAgCisgIH0KK30KKwordm9pZCBTQ0NQU29sdmVyOjp2aXNpdFRlcm1pbmF0b3JJbnN0KFRlcm1pbmF0b3JJbnN0ICZUSSkgeworICBTbWFsbFZlY3Rvcjxib29sLCAxNj4gU3VjY0ZlYXNpYmxlOworICBnZXRGZWFzaWJsZVN1Y2Nlc3NvcnMoVEksIFN1Y2NGZWFzaWJsZSk7CisKKyAgQmFzaWNCbG9jayAqQkIgPSBUSS5nZXRQYXJlbnQoKTsKKworICAvLyBNYXJrIGFsbCBmZWFzaWJsZSBzdWNjZXNzb3JzIGV4ZWN1dGFibGUuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdWNjRmVhc2libGUuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoU3VjY0ZlYXNpYmxlW2ldKQorICAgICAgbWFya0VkZ2VFeGVjdXRhYmxlKEJCLCBUSS5nZXRTdWNjZXNzb3IoaSkpOworfQorCit2b2lkIFNDQ1BTb2x2ZXI6OnZpc2l0Q2FzdEluc3QoQ2FzdEluc3QgJkkpIHsKKyAgTGF0dGljZVZhbCBPcFN0ID0gZ2V0VmFsdWVTdGF0ZShJLmdldE9wZXJhbmQoMCkpOworICBpZiAoT3BTdC5pc092ZXJkZWZpbmVkKCkpICAgICAgICAgIC8vIEluaGVyaXQgb3ZlcmRlZmluZWRuZXNzIG9mIG9wZXJhbmQKKyAgICBtYXJrT3ZlcmRlZmluZWQoJkkpOworICBlbHNlIGlmIChPcFN0LmlzQ29uc3RhbnQoKSkgICAgICAgIC8vIFByb3BhZ2F0ZSBjb25zdGFudCB2YWx1ZQorICAgIG1hcmtDb25zdGFudCgmSSwgQ29uc3RhbnRFeHByOjpnZXRDYXN0KEkuZ2V0T3Bjb2RlKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wU3QuZ2V0Q29uc3RhbnQoKSwgSS5nZXRUeXBlKCkpKTsKK30KKworCit2b2lkIFNDQ1BTb2x2ZXI6OnZpc2l0RXh0cmFjdFZhbHVlSW5zdChFeHRyYWN0VmFsdWVJbnN0ICZFVkkpIHsKKyAgLy8gSWYgdGhpcyByZXR1cm5zIGEgc3RydWN0LCBtYXJrIGFsbCBlbGVtZW50cyBvdmVyIGRlZmluZWQsIHdlIGRvbid0IHRyYWNrCisgIC8vIHN0cnVjdHMgaW4gc3RydWN0cy4KKyAgaWYgKEVWSS5nZXRUeXBlKCktPmlzU3RydWN0VHkoKSkKKyAgICByZXR1cm4gbWFya0FueXRoaW5nT3ZlcmRlZmluZWQoJkVWSSk7CisgICAgCisgIC8vIElmIHRoaXMgaXMgZXh0cmFjdGluZyBmcm9tIG1vcmUgdGhhbiBvbmUgbGV2ZWwgb2Ygc3RydWN0LCB3ZSBkb24ndCBrbm93LgorICBpZiAoRVZJLmdldE51bUluZGljZXMoKSAhPSAxKQorICAgIHJldHVybiBtYXJrT3ZlcmRlZmluZWQoJkVWSSk7CisKKyAgVmFsdWUgKkFnZ1ZhbCA9IEVWSS5nZXRBZ2dyZWdhdGVPcGVyYW5kKCk7CisgIGlmIChBZ2dWYWwtPmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpKSB7CisgICAgdW5zaWduZWQgaSA9ICpFVkkuaWR4X2JlZ2luKCk7CisgICAgTGF0dGljZVZhbCBFbHRWYWwgPSBnZXRTdHJ1Y3RWYWx1ZVN0YXRlKEFnZ1ZhbCwgaSk7CisgICAgbWVyZ2VJblZhbHVlKGdldFZhbHVlU3RhdGUoJkVWSSksICZFVkksIEVsdFZhbCk7CisgIH0gZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlLCBtdXN0IGJlIGV4dHJhY3RpbmcgZnJvbSBhbiBhcnJheS4KKyAgICByZXR1cm4gbWFya092ZXJkZWZpbmVkKCZFVkkpOworICB9Cit9CisKK3ZvaWQgU0NDUFNvbHZlcjo6dmlzaXRJbnNlcnRWYWx1ZUluc3QoSW5zZXJ0VmFsdWVJbnN0ICZJVkkpIHsKKyAgY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oSVZJLmdldFR5cGUoKSk7CisgIGlmIChTVHkgPT0gMCkKKyAgICByZXR1cm4gbWFya092ZXJkZWZpbmVkKCZJVkkpOworICAKKyAgLy8gSWYgdGhpcyBoYXMgbW9yZSB0aGFuIG9uZSBpbmRleCwgd2UgY2FuJ3QgaGFuZGxlIGl0LCBkcml2ZSBhbGwgcmVzdWx0cyB0bworICAvLyB1bmRlZi4KKyAgaWYgKElWSS5nZXROdW1JbmRpY2VzKCkgIT0gMSkKKyAgICByZXR1cm4gbWFya0FueXRoaW5nT3ZlcmRlZmluZWQoJklWSSk7CisgIAorICBWYWx1ZSAqQWdnciA9IElWSS5nZXRBZ2dyZWdhdGVPcGVyYW5kKCk7CisgIHVuc2lnbmVkIElkeCA9ICpJVkkuaWR4X2JlZ2luKCk7CisgIAorICAvLyBDb21wdXRlIHRoZSByZXN1bHQgYmFzZWQgb24gd2hhdCB3ZSdyZSBpbnNlcnRpbmcuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gVGhpcyBwYXNzZXMgdGhyb3VnaCBhbGwgdmFsdWVzIHRoYXQgYXJlbid0IHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICAgIGlmIChpICE9IElkeCkgeworICAgICAgTGF0dGljZVZhbCBFbHRWYWwgPSBnZXRTdHJ1Y3RWYWx1ZVN0YXRlKEFnZ3IsIGkpOworICAgICAgbWVyZ2VJblZhbHVlKGdldFN0cnVjdFZhbHVlU3RhdGUoJklWSSwgaSksICZJVkksIEVsdFZhbCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgVmFsdWUgKlZhbCA9IElWSS5nZXRJbnNlcnRlZFZhbHVlT3BlcmFuZCgpOworICAgIGlmIChWYWwtPmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpKQorICAgICAgLy8gV2UgZG9uJ3QgdHJhY2sgc3RydWN0cyBpbiBzdHJ1Y3RzLgorICAgICAgbWFya092ZXJkZWZpbmVkKGdldFN0cnVjdFZhbHVlU3RhdGUoJklWSSwgaSksICZJVkkpOworICAgIGVsc2UgeworICAgICAgTGF0dGljZVZhbCBJblZhbCA9IGdldFZhbHVlU3RhdGUoVmFsKTsKKyAgICAgIG1lcmdlSW5WYWx1ZShnZXRTdHJ1Y3RWYWx1ZVN0YXRlKCZJVkksIGkpLCAmSVZJLCBJblZhbCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU0NDUFNvbHZlcjo6dmlzaXRTZWxlY3RJbnN0KFNlbGVjdEluc3QgJkkpIHsKKyAgLy8gSWYgdGhpcyBzZWxlY3QgcmV0dXJucyBhIHN0cnVjdCwganVzdCBtYXJrIHRoZSByZXN1bHQgb3ZlcmRlZmluZWQuCisgIC8vIFRPRE86IFdlIGNvdWxkIGRvIGEgbG90IGJldHRlciB0aGFuIHRoaXMgaWYgY29kZSBhY3R1YWxseSB1c2VzIHRoaXMuCisgIGlmIChJLmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpKQorICAgIHJldHVybiBtYXJrQW55dGhpbmdPdmVyZGVmaW5lZCgmSSk7CisgIAorICBMYXR0aWNlVmFsIENvbmRWYWx1ZSA9IGdldFZhbHVlU3RhdGUoSS5nZXRDb25kaXRpb24oKSk7CisgIGlmIChDb25kVmFsdWUuaXNVbmRlZmluZWQoKSkKKyAgICByZXR1cm47CisgIAorICBpZiAoQ29uc3RhbnRJbnQgKkNvbmRDQiA9IENvbmRWYWx1ZS5nZXRDb25zdGFudEludCgpKSB7CisgICAgVmFsdWUgKk9wVmFsID0gQ29uZENCLT5pc1plcm8oKSA/IEkuZ2V0RmFsc2VWYWx1ZSgpIDogSS5nZXRUcnVlVmFsdWUoKTsKKyAgICBtZXJnZUluVmFsdWUoJkksIGdldFZhbHVlU3RhdGUoT3BWYWwpKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIE90aGVyd2lzZSwgdGhlIGNvbmRpdGlvbiBpcyBvdmVyZGVmaW5lZCBvciBhIGNvbnN0YW50IHdlIGNhbid0IGV2YWx1YXRlLgorICAvLyBTZWUgaWYgd2UgY2FuIHByb2R1Y2Ugc29tZXRoaW5nIGJldHRlciB0aGFuIG92ZXJkZWZpbmVkIGJhc2VkIG9uIHRoZSBUL0YKKyAgLy8gdmFsdWUuCisgIExhdHRpY2VWYWwgVFZhbCA9IGdldFZhbHVlU3RhdGUoSS5nZXRUcnVlVmFsdWUoKSk7CisgIExhdHRpY2VWYWwgRlZhbCA9IGdldFZhbHVlU3RhdGUoSS5nZXRGYWxzZVZhbHVlKCkpOworICAKKyAgLy8gc2VsZWN0ID8sIEMsIEMgLT4gQy4KKyAgaWYgKFRWYWwuaXNDb25zdGFudCgpICYmIEZWYWwuaXNDb25zdGFudCgpICYmIAorICAgICAgVFZhbC5nZXRDb25zdGFudCgpID09IEZWYWwuZ2V0Q29uc3RhbnQoKSkKKyAgICByZXR1cm4gbWFya0NvbnN0YW50KCZJLCBGVmFsLmdldENvbnN0YW50KCkpOworCisgIGlmIChUVmFsLmlzVW5kZWZpbmVkKCkpICAgLy8gc2VsZWN0ID8sIHVuZGVmLCBYIC0+IFguCisgICAgcmV0dXJuIG1lcmdlSW5WYWx1ZSgmSSwgRlZhbCk7CisgIGlmIChGVmFsLmlzVW5kZWZpbmVkKCkpICAgLy8gc2VsZWN0ID8sIFgsIHVuZGVmIC0+IFguCisgICAgcmV0dXJuIG1lcmdlSW5WYWx1ZSgmSSwgVFZhbCk7CisgIG1hcmtPdmVyZGVmaW5lZCgmSSk7Cit9CisKKy8vIEhhbmRsZSBCaW5hcnkgT3BlcmF0b3JzLgordm9pZCBTQ0NQU29sdmVyOjp2aXNpdEJpbmFyeU9wZXJhdG9yKEluc3RydWN0aW9uICZJKSB7CisgIExhdHRpY2VWYWwgVjFTdGF0ZSA9IGdldFZhbHVlU3RhdGUoSS5nZXRPcGVyYW5kKDApKTsKKyAgTGF0dGljZVZhbCBWMlN0YXRlID0gZ2V0VmFsdWVTdGF0ZShJLmdldE9wZXJhbmQoMSkpOworICAKKyAgTGF0dGljZVZhbCAmSVYgPSBWYWx1ZVN0YXRlWyZJXTsKKyAgaWYgKElWLmlzT3ZlcmRlZmluZWQoKSkgcmV0dXJuOworCisgIGlmIChWMVN0YXRlLmlzQ29uc3RhbnQoKSAmJiBWMlN0YXRlLmlzQ29uc3RhbnQoKSkKKyAgICByZXR1cm4gbWFya0NvbnN0YW50KElWLCAmSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0KEkuZ2V0T3Bjb2RlKCksIFYxU3RhdGUuZ2V0Q29uc3RhbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYyU3RhdGUuZ2V0Q29uc3RhbnQoKSkpOworICAKKyAgLy8gSWYgc29tZXRoaW5nIGlzIHVuZGVmLCB3YWl0IGZvciBpdCB0byByZXNvbHZlLgorICBpZiAoIVYxU3RhdGUuaXNPdmVyZGVmaW5lZCgpICYmICFWMlN0YXRlLmlzT3ZlcmRlZmluZWQoKSkKKyAgICByZXR1cm47CisgIAorICAvLyBPdGhlcndpc2UsIG9uZSBvZiBvdXIgb3BlcmFuZHMgaXMgb3ZlcmRlZmluZWQuICBUcnkgdG8gcHJvZHVjZSBzb21ldGhpbmcKKyAgLy8gYmV0dGVyIHRoYW4gb3ZlcmRlZmluZWQgd2l0aCBzb21lIHRyaWNrcy4KKyAgCisgIC8vIElmIHRoaXMgaXMgYW4gQU5EIG9yIE9SIHdpdGggMCBvciAtMSwgaXQgZG9lc24ndCBtYXR0ZXIgdGhhdCB0aGUgb3RoZXIKKyAgLy8gb3BlcmFuZCBpcyBvdmVyZGVmaW5lZC4KKyAgaWYgKEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFuZCB8fCBJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpPcikgeworICAgIExhdHRpY2VWYWwgKk5vbk92ZXJkZWZWYWwgPSAwOworICAgIGlmICghVjFTdGF0ZS5pc092ZXJkZWZpbmVkKCkpCisgICAgICBOb25PdmVyZGVmVmFsID0gJlYxU3RhdGU7CisgICAgZWxzZSBpZiAoIVYyU3RhdGUuaXNPdmVyZGVmaW5lZCgpKQorICAgICAgTm9uT3ZlcmRlZlZhbCA9ICZWMlN0YXRlOworCisgICAgaWYgKE5vbk92ZXJkZWZWYWwpIHsKKyAgICAgIGlmIChOb25PdmVyZGVmVmFsLT5pc1VuZGVmaW5lZCgpKSB7CisgICAgICAgIC8vIENvdWxkIGFubmloaWxhdGUgdmFsdWUuCisgICAgICAgIGlmIChJLmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBbmQpCisgICAgICAgICAgbWFya0NvbnN0YW50KElWLCAmSSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJLmdldFR5cGUoKSkpOworICAgICAgICBlbHNlIGlmIChjb25zdCBWZWN0b3JUeXBlICpQVCA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KEkuZ2V0VHlwZSgpKSkKKyAgICAgICAgICBtYXJrQ29uc3RhbnQoSVYsICZJLCBDb25zdGFudDo6Z2V0QWxsT25lc1ZhbHVlKFBUKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtYXJrQ29uc3RhbnQoSVYsICZJLAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0QWxsT25lc1ZhbHVlKEkuZ2V0VHlwZSgpKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKEkuZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFuZCkgeworICAgICAgICAvLyBYIGFuZCAwID0gMAorICAgICAgICBpZiAoTm9uT3ZlcmRlZlZhbC0+Z2V0Q29uc3RhbnQoKS0+aXNOdWxsVmFsdWUoKSkKKyAgICAgICAgICByZXR1cm4gbWFya0NvbnN0YW50KElWLCAmSSwgTm9uT3ZlcmRlZlZhbC0+Z2V0Q29uc3RhbnQoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gTm9uT3ZlcmRlZlZhbC0+Z2V0Q29uc3RhbnRJbnQoKSkKKyAgICAgICAgICBpZiAoQ0ktPmlzQWxsT25lc1ZhbHVlKCkpICAgICAvLyBYIG9yIC0xID0gLTEKKyAgICAgICAgICAgIHJldHVybiBtYXJrQ29uc3RhbnQoSVYsICZJLCBOb25PdmVyZGVmVmFsLT5nZXRDb25zdGFudCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIC8vIElmIGJvdGggb3BlcmFuZHMgYXJlIFBISSBub2RlcywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIGluc3RydWN0aW9uIGhhcworICAvLyBhIGNvbnN0YW50IHZhbHVlLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIFBISSBub2RlIGRvZXNuJ3QuICBDaGVjayBmb3IKKyAgLy8gdGhpcyBjb25kaXRpb24gbm93LgorICBpZiAoUEhJTm9kZSAqUE4xID0gZHluX2Nhc3Q8UEhJTm9kZT4oSS5nZXRPcGVyYW5kKDApKSkKKyAgICBpZiAoUEhJTm9kZSAqUE4yID0gZHluX2Nhc3Q8UEhJTm9kZT4oSS5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIGlmIChQTjEtPmdldFBhcmVudCgpID09IFBOMi0+Z2V0UGFyZW50KCkpIHsKKyAgICAgICAgLy8gU2luY2UgdGhlIHR3byBQSEkgbm9kZXMgYXJlIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrLCB0aGV5IG11c3QgaGF2ZQorICAgICAgICAvLyBlbnRyaWVzIGZvciB0aGUgc2FtZSBwcmVkZWNlc3NvcnMuICBXYWxrIHRoZSBwcmVkZWNlc3NvciBsaXN0LCBhbmQKKyAgICAgICAgLy8gaWYgYWxsIG9mIHRoZSBpbmNvbWluZyB2YWx1ZXMgYXJlIGNvbnN0YW50cywgYW5kIHRoZSByZXN1bHQgb2YKKyAgICAgICAgLy8gZXZhbHVhdGluZyB0aGlzIGV4cHJlc3Npb24gd2l0aCBhbGwgaW5jb21pbmcgdmFsdWUgcGFpcnMgaXMgdGhlCisgICAgICAgIC8vIHNhbWUsIHRoZW4gdGhpcyBleHByZXNzaW9uIGlzIGEgY29uc3RhbnQgZXZlbiB0aG91Z2ggdGhlIFBISSBub2RlCisgICAgICAgIC8vIGlzIG5vdCBhIGNvbnN0YW50IQorICAgICAgICBMYXR0aWNlVmFsIFJlc3VsdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOMS0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBMYXR0aWNlVmFsIEluMSA9IGdldFZhbHVlU3RhdGUoUE4xLT5nZXRJbmNvbWluZ1ZhbHVlKGkpKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrICpJbkJsb2NrID0gUE4xLT5nZXRJbmNvbWluZ0Jsb2NrKGkpOworICAgICAgICAgIExhdHRpY2VWYWwgSW4yID1nZXRWYWx1ZVN0YXRlKFBOMi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKEluQmxvY2spKTsKKworICAgICAgICAgIGlmIChJbjEuaXNPdmVyZGVmaW5lZCgpIHx8IEluMi5pc092ZXJkZWZpbmVkKCkpIHsKKyAgICAgICAgICAgIFJlc3VsdC5tYXJrT3ZlcmRlZmluZWQoKTsKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gQ2Fubm90IGZvbGQgdGhpcyBvcGVyYXRpb24gb3ZlciB0aGUgUEhJIG5vZGVzIQorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoSW4xLmlzQ29uc3RhbnQoKSAmJiBJbjIuaXNDb25zdGFudCgpKSB7CisgICAgICAgICAgICBDb25zdGFudCAqViA9IENvbnN0YW50RXhwcjo6Z2V0KEkuZ2V0T3Bjb2RlKCksIEluMS5nZXRDb25zdGFudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbjIuZ2V0Q29uc3RhbnQoKSk7CisgICAgICAgICAgICBpZiAoUmVzdWx0LmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgIFJlc3VsdC5tYXJrQ29uc3RhbnQoVik7CisgICAgICAgICAgICBlbHNlIGlmIChSZXN1bHQuaXNDb25zdGFudCgpICYmIFJlc3VsdC5nZXRDb25zdGFudCgpICE9IFYpIHsKKyAgICAgICAgICAgICAgUmVzdWx0Lm1hcmtPdmVyZGVmaW5lZCgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIGNvbnN0YW50IHZhbHVlIGhlcmUsIHRoZW4gd2Uga25vdyB0aGUgaW5zdHJ1Y3Rpb24gaXMKKyAgICAgICAgLy8gY29uc3RhbnQgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoZSBQSEkgbm9kZXMgYXJlIG92ZXJkZWZpbmVkLgorICAgICAgICBpZiAoUmVzdWx0LmlzQ29uc3RhbnQoKSkgeworICAgICAgICAgIG1hcmtDb25zdGFudChJViwgJkksIFJlc3VsdC5nZXRDb25zdGFudCgpKTsKKyAgICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgdmlydHVhbGx5IHVzaW5nIHRoZSBQSEkgbm9kZQorICAgICAgICAgIC8vIG9wZXJhbmRzLgorICAgICAgICAgIFVzZXJzT2ZPdmVyZGVmaW5lZFBISXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFBOMSwgJkkpKTsKKyAgICAgICAgICBVc2Vyc09mT3ZlcmRlZmluZWRQSElzLmluc2VydChzdGQ6Om1ha2VfcGFpcihQTjIsICZJKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoUmVzdWx0LmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIE9rYXksIHRoaXMgcmVhbGx5IGlzIG92ZXJkZWZpbmVkIG5vdy4gIFNpbmNlIHdlIG1pZ2h0IGhhdmUKKyAgICAgICAgLy8gc3BlY3VsYXRpdmVseSB0aG91Z2h0IHRoYXQgdGhpcyB3YXMgbm90IG92ZXJkZWZpbmVkIGJlZm9yZSwgYW5kCisgICAgICAgIC8vIGFkZGVkIG91cnNlbHZlcyB0byB0aGUgVXNlcnNPZk92ZXJkZWZpbmVkUEhJcyBsaXN0IGZvciB0aGUgUEhJcywKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGNsZWFuIG91dCBhbnkgZW50cmllcyB0aGF0IHdlIHB1dCB0aGVyZSwgZm9yCisgICAgICAgIC8vIGVmZmljaWVuY3kuCisgICAgICAgIFJlbW92ZUZyb21PdmVyZGVmaW5lZFBISXMoJkksIFBOMSk7CisgICAgICAgIFJlbW92ZUZyb21PdmVyZGVmaW5lZFBISXMoJkksIFBOMik7CisgICAgICB9CisKKyAgbWFya092ZXJkZWZpbmVkKCZJKTsKK30KKworLy8gSGFuZGxlIElDbXBJbnN0IGluc3RydWN0aW9uLgordm9pZCBTQ0NQU29sdmVyOjp2aXNpdENtcEluc3QoQ21wSW5zdCAmSSkgeworICBMYXR0aWNlVmFsIFYxU3RhdGUgPSBnZXRWYWx1ZVN0YXRlKEkuZ2V0T3BlcmFuZCgwKSk7CisgIExhdHRpY2VWYWwgVjJTdGF0ZSA9IGdldFZhbHVlU3RhdGUoSS5nZXRPcGVyYW5kKDEpKTsKKworICBMYXR0aWNlVmFsICZJViA9IFZhbHVlU3RhdGVbJkldOworICBpZiAoSVYuaXNPdmVyZGVmaW5lZCgpKSByZXR1cm47CisKKyAgaWYgKFYxU3RhdGUuaXNDb25zdGFudCgpICYmIFYyU3RhdGUuaXNDb25zdGFudCgpKQorICAgIHJldHVybiBtYXJrQ29uc3RhbnQoSVYsICZJLCBDb25zdGFudEV4cHI6OmdldENvbXBhcmUoSS5nZXRQcmVkaWNhdGUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVN0YXRlLmdldENvbnN0YW50KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMlN0YXRlLmdldENvbnN0YW50KCkpKTsKKyAgCisgIC8vIElmIG9wZXJhbmRzIGFyZSBzdGlsbCB1bmRlZmluZWQsIHdhaXQgZm9yIGl0IHRvIHJlc29sdmUuCisgIGlmICghVjFTdGF0ZS5pc092ZXJkZWZpbmVkKCkgJiYgIVYyU3RhdGUuaXNPdmVyZGVmaW5lZCgpKQorICAgIHJldHVybjsKKyAgCisgIC8vIElmIHNvbWV0aGluZyBpcyBvdmVyZGVmaW5lZCwgdXNlIHNvbWUgdHJpY2tzIHRvIGF2b2lkIGVuZGluZyB1cCBhbmQgb3ZlcgorICAvLyBkZWZpbmVkIGlmIHdlIGNhbi4KKyAgCisgIC8vIElmIGJvdGggb3BlcmFuZHMgYXJlIFBISSBub2RlcywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIGluc3RydWN0aW9uIGhhcworICAvLyBhIGNvbnN0YW50IHZhbHVlLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIFBISSBub2RlIGRvZXNuJ3QuICBDaGVjayBmb3IKKyAgLy8gdGhpcyBjb25kaXRpb24gbm93LgorICBpZiAoUEhJTm9kZSAqUE4xID0gZHluX2Nhc3Q8UEhJTm9kZT4oSS5nZXRPcGVyYW5kKDApKSkKKyAgICBpZiAoUEhJTm9kZSAqUE4yID0gZHluX2Nhc3Q8UEhJTm9kZT4oSS5nZXRPcGVyYW5kKDEpKSkKKyAgICAgIGlmIChQTjEtPmdldFBhcmVudCgpID09IFBOMi0+Z2V0UGFyZW50KCkpIHsKKyAgICAgICAgLy8gU2luY2UgdGhlIHR3byBQSEkgbm9kZXMgYXJlIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrLCB0aGV5IG11c3QgaGF2ZQorICAgICAgICAvLyBlbnRyaWVzIGZvciB0aGUgc2FtZSBwcmVkZWNlc3NvcnMuICBXYWxrIHRoZSBwcmVkZWNlc3NvciBsaXN0LCBhbmQKKyAgICAgICAgLy8gaWYgYWxsIG9mIHRoZSBpbmNvbWluZyB2YWx1ZXMgYXJlIGNvbnN0YW50cywgYW5kIHRoZSByZXN1bHQgb2YKKyAgICAgICAgLy8gZXZhbHVhdGluZyB0aGlzIGV4cHJlc3Npb24gd2l0aCBhbGwgaW5jb21pbmcgdmFsdWUgcGFpcnMgaXMgdGhlCisgICAgICAgIC8vIHNhbWUsIHRoZW4gdGhpcyBleHByZXNzaW9uIGlzIGEgY29uc3RhbnQgZXZlbiB0aG91Z2ggdGhlIFBISSBub2RlCisgICAgICAgIC8vIGlzIG5vdCBhIGNvbnN0YW50IQorICAgICAgICBMYXR0aWNlVmFsIFJlc3VsdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOMS0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBMYXR0aWNlVmFsIEluMSA9IGdldFZhbHVlU3RhdGUoUE4xLT5nZXRJbmNvbWluZ1ZhbHVlKGkpKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrICpJbkJsb2NrID0gUE4xLT5nZXRJbmNvbWluZ0Jsb2NrKGkpOworICAgICAgICAgIExhdHRpY2VWYWwgSW4yID1nZXRWYWx1ZVN0YXRlKFBOMi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKEluQmxvY2spKTsKKworICAgICAgICAgIGlmIChJbjEuaXNPdmVyZGVmaW5lZCgpIHx8IEluMi5pc092ZXJkZWZpbmVkKCkpIHsKKyAgICAgICAgICAgIFJlc3VsdC5tYXJrT3ZlcmRlZmluZWQoKTsKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gQ2Fubm90IGZvbGQgdGhpcyBvcGVyYXRpb24gb3ZlciB0aGUgUEhJIG5vZGVzIQorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoSW4xLmlzQ29uc3RhbnQoKSAmJiBJbjIuaXNDb25zdGFudCgpKSB7CisgICAgICAgICAgICBDb25zdGFudCAqViA9IENvbnN0YW50RXhwcjo6Z2V0Q29tcGFyZShJLmdldFByZWRpY2F0ZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluMS5nZXRDb25zdGFudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluMi5nZXRDb25zdGFudCgpKTsKKyAgICAgICAgICAgIGlmIChSZXN1bHQuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgUmVzdWx0Lm1hcmtDb25zdGFudChWKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKFJlc3VsdC5pc0NvbnN0YW50KCkgJiYgUmVzdWx0LmdldENvbnN0YW50KCkgIT0gVikgeworICAgICAgICAgICAgICBSZXN1bHQubWFya092ZXJkZWZpbmVkKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgY29uc3RhbnQgdmFsdWUgaGVyZSwgdGhlbiB3ZSBrbm93IHRoZSBpbnN0cnVjdGlvbiBpcworICAgICAgICAvLyBjb25zdGFudCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIFBISSBub2RlcyBhcmUgb3ZlcmRlZmluZWQuCisgICAgICAgIGlmIChSZXN1bHQuaXNDb25zdGFudCgpKSB7CisgICAgICAgICAgbWFya0NvbnN0YW50KCZJLCBSZXN1bHQuZ2V0Q29uc3RhbnQoKSk7CisgICAgICAgICAgLy8gUmVtZW1iZXIgdGhhdCB0aGlzIGluc3RydWN0aW9uIGlzIHZpcnR1YWxseSB1c2luZyB0aGUgUEhJIG5vZGUKKyAgICAgICAgICAvLyBvcGVyYW5kcy4KKyAgICAgICAgICBVc2Vyc09mT3ZlcmRlZmluZWRQSElzLmluc2VydChzdGQ6Om1ha2VfcGFpcihQTjEsICZJKSk7CisgICAgICAgICAgVXNlcnNPZk92ZXJkZWZpbmVkUEhJcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUE4yLCAmSSkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKFJlc3VsdC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBPa2F5LCB0aGlzIHJlYWxseSBpcyBvdmVyZGVmaW5lZCBub3cuICBTaW5jZSB3ZSBtaWdodCBoYXZlCisgICAgICAgIC8vIHNwZWN1bGF0aXZlbHkgdGhvdWdodCB0aGF0IHRoaXMgd2FzIG5vdCBvdmVyZGVmaW5lZCBiZWZvcmUsIGFuZAorICAgICAgICAvLyBhZGRlZCBvdXJzZWx2ZXMgdG8gdGhlIFVzZXJzT2ZPdmVyZGVmaW5lZFBISXMgbGlzdCBmb3IgdGhlIFBISXMsCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBjbGVhbiBvdXQgYW55IGVudHJpZXMgdGhhdCB3ZSBwdXQgdGhlcmUsIGZvcgorICAgICAgICAvLyBlZmZpY2llbmN5LgorICAgICAgICBSZW1vdmVGcm9tT3ZlcmRlZmluZWRQSElzKCZJLCBQTjEpOworICAgICAgICBSZW1vdmVGcm9tT3ZlcmRlZmluZWRQSElzKCZJLCBQTjIpOworICAgICAgfQorCisgIG1hcmtPdmVyZGVmaW5lZCgmSSk7Cit9CisKK3ZvaWQgU0NDUFNvbHZlcjo6dmlzaXRFeHRyYWN0RWxlbWVudEluc3QoRXh0cmFjdEVsZW1lbnRJbnN0ICZJKSB7CisgIC8vIFRPRE8gOiBTQ0NQIGRvZXMgbm90IGhhbmRsZSB2ZWN0b3JzIHByb3Blcmx5LgorICByZXR1cm4gbWFya092ZXJkZWZpbmVkKCZJKTsKKworI2lmIDAKKyAgTGF0dGljZVZhbCAmVmFsU3RhdGUgPSBnZXRWYWx1ZVN0YXRlKEkuZ2V0T3BlcmFuZCgwKSk7CisgIExhdHRpY2VWYWwgJklkeFN0YXRlID0gZ2V0VmFsdWVTdGF0ZShJLmdldE9wZXJhbmQoMSkpOworCisgIGlmIChWYWxTdGF0ZS5pc092ZXJkZWZpbmVkKCkgfHwgSWR4U3RhdGUuaXNPdmVyZGVmaW5lZCgpKQorICAgIG1hcmtPdmVyZGVmaW5lZCgmSSk7CisgIGVsc2UgaWYoVmFsU3RhdGUuaXNDb25zdGFudCgpICYmIElkeFN0YXRlLmlzQ29uc3RhbnQoKSkKKyAgICBtYXJrQ29uc3RhbnQoJkksIENvbnN0YW50RXhwcjo6Z2V0RXh0cmFjdEVsZW1lbnQoVmFsU3RhdGUuZ2V0Q29uc3RhbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4U3RhdGUuZ2V0Q29uc3RhbnQoKSkpOworI2VuZGlmCit9CisKK3ZvaWQgU0NDUFNvbHZlcjo6dmlzaXRJbnNlcnRFbGVtZW50SW5zdChJbnNlcnRFbGVtZW50SW5zdCAmSSkgeworICAvLyBUT0RPIDogU0NDUCBkb2VzIG5vdCBoYW5kbGUgdmVjdG9ycyBwcm9wZXJseS4KKyAgcmV0dXJuIG1hcmtPdmVyZGVmaW5lZCgmSSk7CisjaWYgMAorICBMYXR0aWNlVmFsICZWYWxTdGF0ZSA9IGdldFZhbHVlU3RhdGUoSS5nZXRPcGVyYW5kKDApKTsKKyAgTGF0dGljZVZhbCAmRWx0U3RhdGUgPSBnZXRWYWx1ZVN0YXRlKEkuZ2V0T3BlcmFuZCgxKSk7CisgIExhdHRpY2VWYWwgJklkeFN0YXRlID0gZ2V0VmFsdWVTdGF0ZShJLmdldE9wZXJhbmQoMikpOworCisgIGlmIChWYWxTdGF0ZS5pc092ZXJkZWZpbmVkKCkgfHwgRWx0U3RhdGUuaXNPdmVyZGVmaW5lZCgpIHx8CisgICAgICBJZHhTdGF0ZS5pc092ZXJkZWZpbmVkKCkpCisgICAgbWFya092ZXJkZWZpbmVkKCZJKTsKKyAgZWxzZSBpZihWYWxTdGF0ZS5pc0NvbnN0YW50KCkgJiYgRWx0U3RhdGUuaXNDb25zdGFudCgpICYmCisgICAgICAgICAgSWR4U3RhdGUuaXNDb25zdGFudCgpKQorICAgIG1hcmtDb25zdGFudCgmSSwgQ29uc3RhbnRFeHByOjpnZXRJbnNlcnRFbGVtZW50KFZhbFN0YXRlLmdldENvbnN0YW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWx0U3RhdGUuZ2V0Q29uc3RhbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZHhTdGF0ZS5nZXRDb25zdGFudCgpKSk7CisgIGVsc2UgaWYgKFZhbFN0YXRlLmlzVW5kZWZpbmVkKCkgJiYgRWx0U3RhdGUuaXNDb25zdGFudCgpICYmCisgICAgICAgICAgIElkeFN0YXRlLmlzQ29uc3RhbnQoKSkgCisgICAgbWFya0NvbnN0YW50KCZJLENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0RWxlbWVudChVbmRlZlZhbHVlOjpnZXQoSS5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWx0U3RhdGUuZ2V0Q29uc3RhbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkeFN0YXRlLmdldENvbnN0YW50KCkpKTsKKyNlbmRpZgorfQorCit2b2lkIFNDQ1BTb2x2ZXI6OnZpc2l0U2h1ZmZsZVZlY3Rvckluc3QoU2h1ZmZsZVZlY3Rvckluc3QgJkkpIHsKKyAgLy8gVE9ETyA6IFNDQ1AgZG9lcyBub3QgaGFuZGxlIHZlY3RvcnMgcHJvcGVybHkuCisgIHJldHVybiBtYXJrT3ZlcmRlZmluZWQoJkkpOworI2lmIDAKKyAgTGF0dGljZVZhbCAmVjFTdGF0ZSAgID0gZ2V0VmFsdWVTdGF0ZShJLmdldE9wZXJhbmQoMCkpOworICBMYXR0aWNlVmFsICZWMlN0YXRlICAgPSBnZXRWYWx1ZVN0YXRlKEkuZ2V0T3BlcmFuZCgxKSk7CisgIExhdHRpY2VWYWwgJk1hc2tTdGF0ZSA9IGdldFZhbHVlU3RhdGUoSS5nZXRPcGVyYW5kKDIpKTsKKworICBpZiAoTWFza1N0YXRlLmlzVW5kZWZpbmVkKCkgfHwKKyAgICAgIChWMVN0YXRlLmlzVW5kZWZpbmVkKCkgJiYgVjJTdGF0ZS5pc1VuZGVmaW5lZCgpKSkKKyAgICByZXR1cm47ICAvLyBVbmRlZmluZWQgb3V0cHV0IGlmIG1hc2sgb3IgYm90aCBpbnB1dHMgdW5kZWZpbmVkLgorICAKKyAgaWYgKFYxU3RhdGUuaXNPdmVyZGVmaW5lZCgpIHx8IFYyU3RhdGUuaXNPdmVyZGVmaW5lZCgpIHx8CisgICAgICBNYXNrU3RhdGUuaXNPdmVyZGVmaW5lZCgpKSB7CisgICAgbWFya092ZXJkZWZpbmVkKCZJKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBBIG1peCBvZiBjb25zdGFudC91bmRlZiBpbnB1dHMuCisgICAgQ29uc3RhbnQgKlYxID0gVjFTdGF0ZS5pc0NvbnN0YW50KCkgPyAKKyAgICAgICAgVjFTdGF0ZS5nZXRDb25zdGFudCgpIDogVW5kZWZWYWx1ZTo6Z2V0KEkuZ2V0VHlwZSgpKTsKKyAgICBDb25zdGFudCAqVjIgPSBWMlN0YXRlLmlzQ29uc3RhbnQoKSA/IAorICAgICAgICBWMlN0YXRlLmdldENvbnN0YW50KCkgOiBVbmRlZlZhbHVlOjpnZXQoSS5nZXRUeXBlKCkpOworICAgIENvbnN0YW50ICpNYXNrID0gTWFza1N0YXRlLmlzQ29uc3RhbnQoKSA/IAorICAgICAgTWFza1N0YXRlLmdldENvbnN0YW50KCkgOiBVbmRlZlZhbHVlOjpnZXQoSS5nZXRPcGVyYW5kKDIpLT5nZXRUeXBlKCkpOworICAgIG1hcmtDb25zdGFudCgmSSwgQ29uc3RhbnRFeHByOjpnZXRTaHVmZmxlVmVjdG9yKFYxLCBWMiwgTWFzaykpOworICB9CisjZW5kaWYKK30KKworLy8gSGFuZGxlIGdldGVsZW1lbnRwdHIgaW5zdHJ1Y3Rpb25zLiAgSWYgYWxsIG9wZXJhbmRzIGFyZSBjb25zdGFudHMgdGhlbiB3ZQorLy8gY2FuIHR1cm4gdGhpcyBpbnRvIGEgZ2V0ZWxlbWVudHB0ciBDb25zdGFudEV4cHIuCisvLwordm9pZCBTQ0NQU29sdmVyOjp2aXNpdEdldEVsZW1lbnRQdHJJbnN0KEdldEVsZW1lbnRQdHJJbnN0ICZJKSB7CisgIGlmIChWYWx1ZVN0YXRlWyZJXS5pc092ZXJkZWZpbmVkKCkpIHJldHVybjsKKworICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDg+IE9wZXJhbmRzOworICBPcGVyYW5kcy5yZXNlcnZlKEkuZ2V0TnVtT3BlcmFuZHMoKSk7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBMYXR0aWNlVmFsIFN0YXRlID0gZ2V0VmFsdWVTdGF0ZShJLmdldE9wZXJhbmQoaSkpOworICAgIGlmIChTdGF0ZS5pc1VuZGVmaW5lZCgpKQorICAgICAgcmV0dXJuOyAgLy8gT3BlcmFuZHMgYXJlIG5vdCByZXNvbHZlZCB5ZXQuCisgICAgCisgICAgaWYgKFN0YXRlLmlzT3ZlcmRlZmluZWQoKSkKKyAgICAgIHJldHVybiBtYXJrT3ZlcmRlZmluZWQoJkkpOworCisgICAgYXNzZXJ0KFN0YXRlLmlzQ29uc3RhbnQoKSAmJiAiVW5rbm93biBzdGF0ZSEiKTsKKyAgICBPcGVyYW5kcy5wdXNoX2JhY2soU3RhdGUuZ2V0Q29uc3RhbnQoKSk7CisgIH0KKworICBDb25zdGFudCAqUHRyID0gT3BlcmFuZHNbMF07CisgIG1hcmtDb25zdGFudCgmSSwgQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKFB0ciwgJk9wZXJhbmRzWzBdKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRzLnNpemUoKS0xKSk7Cit9CisKK3ZvaWQgU0NDUFNvbHZlcjo6dmlzaXRTdG9yZUluc3QoU3RvcmVJbnN0ICZTSSkgeworICAvLyBJZiB0aGlzIHN0b3JlIGlzIG9mIGEgc3RydWN0LCBpZ25vcmUgaXQuCisgIGlmIChTSS5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmlzU3RydWN0VHkoKSkKKyAgICByZXR1cm47CisgIAorICBpZiAoVHJhY2tlZEdsb2JhbHMuZW1wdHkoKSB8fCAhaXNhPEdsb2JhbFZhcmlhYmxlPihTSS5nZXRPcGVyYW5kKDEpKSkKKyAgICByZXR1cm47CisgIAorICBHbG9iYWxWYXJpYWJsZSAqR1YgPSBjYXN0PEdsb2JhbFZhcmlhYmxlPihTSS5nZXRPcGVyYW5kKDEpKTsKKyAgRGVuc2VNYXA8R2xvYmFsVmFyaWFibGUqLCBMYXR0aWNlVmFsPjo6aXRlcmF0b3IgSSA9IFRyYWNrZWRHbG9iYWxzLmZpbmQoR1YpOworICBpZiAoSSA9PSBUcmFja2VkR2xvYmFscy5lbmQoKSB8fCBJLT5zZWNvbmQuaXNPdmVyZGVmaW5lZCgpKSByZXR1cm47CisKKyAgLy8gR2V0IHRoZSB2YWx1ZSB3ZSBhcmUgc3RvcmluZyBpbnRvIHRoZSBnbG9iYWwsIHRoZW4gbWVyZ2UgaXQuCisgIG1lcmdlSW5WYWx1ZShJLT5zZWNvbmQsIEdWLCBnZXRWYWx1ZVN0YXRlKFNJLmdldE9wZXJhbmQoMCkpKTsKKyAgaWYgKEktPnNlY29uZC5pc092ZXJkZWZpbmVkKCkpCisgICAgVHJhY2tlZEdsb2JhbHMuZXJhc2UoSSk7ICAgICAgLy8gTm8gbmVlZCB0byBrZWVwIHRyYWNraW5nIHRoaXMhCit9CisKKworLy8gSGFuZGxlIGxvYWQgaW5zdHJ1Y3Rpb25zLiAgSWYgdGhlIG9wZXJhbmQgaXMgYSBjb25zdGFudCBwb2ludGVyIHRvIGEgY29uc3RhbnQKKy8vIGdsb2JhbCwgd2UgY2FuIHJlcGxhY2UgdGhlIGxvYWQgd2l0aCB0aGUgbG9hZGVkIGNvbnN0YW50IHZhbHVlIQordm9pZCBTQ0NQU29sdmVyOjp2aXNpdExvYWRJbnN0KExvYWRJbnN0ICZJKSB7CisgIC8vIElmIHRoaXMgbG9hZCBpcyBvZiBhIHN0cnVjdCwganVzdCBtYXJrIHRoZSByZXN1bHQgb3ZlcmRlZmluZWQuCisgIGlmIChJLmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpKQorICAgIHJldHVybiBtYXJrQW55dGhpbmdPdmVyZGVmaW5lZCgmSSk7CisgIAorICBMYXR0aWNlVmFsIFB0clZhbCA9IGdldFZhbHVlU3RhdGUoSS5nZXRPcGVyYW5kKDApKTsKKyAgaWYgKFB0clZhbC5pc1VuZGVmaW5lZCgpKSByZXR1cm47ICAgLy8gVGhlIHBvaW50ZXIgaXMgbm90IHJlc29sdmVkIHlldCEKKyAgCisgIExhdHRpY2VWYWwgJklWID0gVmFsdWVTdGF0ZVsmSV07CisgIGlmIChJVi5pc092ZXJkZWZpbmVkKCkpIHJldHVybjsKKworICBpZiAoIVB0clZhbC5pc0NvbnN0YW50KCkgfHwgSS5pc1ZvbGF0aWxlKCkpCisgICAgcmV0dXJuIG1hcmtPdmVyZGVmaW5lZChJViwgJkkpOworICAgIAorICBDb25zdGFudCAqUHRyID0gUHRyVmFsLmdldENvbnN0YW50KCk7CisKKyAgLy8gbG9hZCBudWxsIC0+IG51bGwKKyAgaWYgKGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihQdHIpICYmIEkuZ2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpID09IDApCisgICAgcmV0dXJuIG1hcmtDb25zdGFudChJViwgJkksIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSS5nZXRUeXBlKCkpKTsKKyAgCisgIC8vIFRyYW5zZm9ybSBsb2FkIChjb25zdGFudCBnbG9iYWwpIGludG8gdGhlIHZhbHVlIGxvYWRlZC4KKyAgaWYgKEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihQdHIpKSB7CisgICAgaWYgKCFUcmFja2VkR2xvYmFscy5lbXB0eSgpKSB7CisgICAgICAvLyBJZiB3ZSBhcmUgdHJhY2tpbmcgdGhpcyBnbG9iYWwsIG1lcmdlIGluIHRoZSBrbm93biB2YWx1ZSBmb3IgaXQuCisgICAgICBEZW5zZU1hcDxHbG9iYWxWYXJpYWJsZSosIExhdHRpY2VWYWw+OjppdGVyYXRvciBJdCA9CisgICAgICAgIFRyYWNrZWRHbG9iYWxzLmZpbmQoR1YpOworICAgICAgaWYgKEl0ICE9IFRyYWNrZWRHbG9iYWxzLmVuZCgpKSB7CisgICAgICAgIG1lcmdlSW5WYWx1ZShJViwgJkksIEl0LT5zZWNvbmQpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVHJhbnNmb3JtIGxvYWQgZnJvbSBhIGNvbnN0YW50IGludG8gYSBjb25zdGFudCBpZiBwb3NzaWJsZS4KKyAgaWYgKENvbnN0YW50ICpDID0gQ29uc3RhbnRGb2xkTG9hZEZyb21Db25zdFB0cihQdHIsIFREKSkKKyAgICByZXR1cm4gbWFya0NvbnN0YW50KElWLCAmSSwgQyk7CisKKyAgLy8gT3RoZXJ3aXNlIHdlIGNhbm5vdCBzYXkgZm9yIGNlcnRhaW4gd2hhdCB2YWx1ZSB0aGlzIGxvYWQgd2lsbCBwcm9kdWNlLgorICAvLyBCYWlsIG91dC4KKyAgbWFya092ZXJkZWZpbmVkKElWLCAmSSk7Cit9CisKK3ZvaWQgU0NDUFNvbHZlcjo6dmlzaXRDYWxsU2l0ZShDYWxsU2l0ZSBDUykgeworICBGdW5jdGlvbiAqRiA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCk7CisgIEluc3RydWN0aW9uICpJID0gQ1MuZ2V0SW5zdHJ1Y3Rpb24oKTsKKyAgCisgIC8vIFRoZSBjb21tb24gY2FzZSBpcyB0aGF0IHdlIGFyZW4ndCB0cmFja2luZyB0aGUgY2FsbGVlLCBlaXRoZXIgYmVjYXVzZSB3ZQorICAvLyBhcmUgbm90IGRvaW5nIGludGVycHJvY2VkdXJhbCBhbmFseXNpcyBvciB0aGUgY2FsbGVlIGlzIGluZGlyZWN0LCBvciBpcworICAvLyBleHRlcm5hbC4gIEhhbmRsZSB0aGVzZSBjYXNlcyBmaXJzdC4KKyAgaWYgKEYgPT0gMCB8fCBGLT5pc0RlY2xhcmF0aW9uKCkpIHsKK0NhbGxPdmVyZGVmaW5lZDoKKyAgICAvLyBWb2lkIHJldHVybiBhbmQgbm90IHRyYWNraW5nIGNhbGxlZSwganVzdCBiYWlsLgorICAgIGlmIChJLT5nZXRUeXBlKCktPmlzVm9pZFR5KCkpIHJldHVybjsKKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIGlmIHdlIGhhdmUgYSBzaW5nbGUgcmV0dXJuIHZhbHVlIGNhc2UsIGFuZCBpZiB0aGUgZnVuY3Rpb24gaXMKKyAgICAvLyBhIGRlY2xhcmF0aW9uLCBtYXliZSB3ZSBjYW4gY29uc3RhbnQgZm9sZCBpdC4KKyAgICBpZiAoRiAmJiBGLT5pc0RlY2xhcmF0aW9uKCkgJiYgIUktPmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpICYmCisgICAgICAgIGNhbkNvbnN0YW50Rm9sZENhbGxUbyhGKSkgeworICAgICAgCisgICAgICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDg+IE9wZXJhbmRzOworICAgICAgZm9yIChDYWxsU2l0ZTo6YXJnX2l0ZXJhdG9yIEFJID0gQ1MuYXJnX2JlZ2luKCksIEUgPSBDUy5hcmdfZW5kKCk7CisgICAgICAgICAgIEFJICE9IEU7ICsrQUkpIHsKKyAgICAgICAgTGF0dGljZVZhbCBTdGF0ZSA9IGdldFZhbHVlU3RhdGUoKkFJKTsKKyAgICAgICAgCisgICAgICAgIGlmIChTdGF0ZS5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgIHJldHVybjsgIC8vIE9wZXJhbmRzIGFyZSBub3QgcmVzb2x2ZWQgeWV0LgorICAgICAgICBpZiAoU3RhdGUuaXNPdmVyZGVmaW5lZCgpKQorICAgICAgICAgIHJldHVybiBtYXJrT3ZlcmRlZmluZWQoSSk7CisgICAgICAgIGFzc2VydChTdGF0ZS5pc0NvbnN0YW50KCkgJiYgIlVua25vd24gc3RhdGUhIik7CisgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhTdGF0ZS5nZXRDb25zdGFudCgpKTsKKyAgICAgIH0KKyAgICAgCisgICAgICAvLyBJZiB3ZSBjYW4gY29uc3RhbnQgZm9sZCB0aGlzLCBtYXJrIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgYXMgYQorICAgICAgLy8gY29uc3RhbnQuCisgICAgICBpZiAoQ29uc3RhbnQgKkMgPSBDb25zdGFudEZvbGRDYWxsKEYsIE9wZXJhbmRzLmRhdGEoKSwgT3BlcmFuZHMuc2l6ZSgpKSkKKyAgICAgICAgcmV0dXJuIG1hcmtDb25zdGFudChJLCBDKTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhpcyBjYWxsLCBtYXJrIGl0IG92ZXJkZWZpbmVkLgorICAgIHJldHVybiBtYXJrQW55dGhpbmdPdmVyZGVmaW5lZChJKTsKKyAgfQorCisgIC8vIElmIHRoaXMgaXMgYSBsb2NhbCBmdW5jdGlvbiB0aGF0IGRvZXNuJ3QgaGF2ZSBpdHMgYWRkcmVzcyB0YWtlbiwgbWFyayBpdHMKKyAgLy8gZW50cnkgYmxvY2sgZXhlY3V0YWJsZSBhbmQgbWVyZ2UgaW4gdGhlIGFjdHVhbCBhcmd1bWVudHMgdG8gdGhlIGNhbGwgaW50bworICAvLyB0aGUgZm9ybWFsIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24uCisgIGlmICghVHJhY2tpbmdJbmNvbWluZ0FyZ3VtZW50cy5lbXB0eSgpICYmIFRyYWNraW5nSW5jb21pbmdBcmd1bWVudHMuY291bnQoRikpeworICAgIE1hcmtCbG9ja0V4ZWN1dGFibGUoRi0+YmVnaW4oKSk7CisgICAgCisgICAgLy8gUHJvcGFnYXRlIGluZm9ybWF0aW9uIGZyb20gdGhpcyBjYWxsIHNpdGUgaW50byB0aGUgY2FsbGVlLgorICAgIENhbGxTaXRlOjphcmdfaXRlcmF0b3IgQ0FJID0gQ1MuYXJnX2JlZ2luKCk7CisgICAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEFJID0gRi0+YXJnX2JlZ2luKCksIEUgPSBGLT5hcmdfZW5kKCk7CisgICAgICAgICBBSSAhPSBFOyArK0FJLCArK0NBSSkgeworICAgICAgLy8gSWYgdGhpcyBhcmd1bWVudCBpcyBieXZhbCwgYW5kIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgcmVhZG9ubHksIHRoZXJlCisgICAgICAvLyB3aWxsIGJlIGFuIGltcGxpY2l0IGNvcHkgZm9ybWVkIG9mIHRoZSBpbnB1dCBhZ2dyZWdhdGUuCisgICAgICBpZiAoQUktPmhhc0J5VmFsQXR0cigpICYmICFGLT5vbmx5UmVhZHNNZW1vcnkoKSkgeworICAgICAgICBtYXJrT3ZlcmRlZmluZWQoQUkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KEFJLT5nZXRUeXBlKCkpKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgTGF0dGljZVZhbCBDYWxsQXJnID0gZ2V0U3RydWN0VmFsdWVTdGF0ZSgqQ0FJLCBpKTsKKyAgICAgICAgICBtZXJnZUluVmFsdWUoZ2V0U3RydWN0VmFsdWVTdGF0ZShBSSwgaSksIEFJLCBDYWxsQXJnKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVyZ2VJblZhbHVlKEFJLCBnZXRWYWx1ZVN0YXRlKCpDQUkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIElmIHRoaXMgaXMgYSBzaW5nbGUvemVybyByZXR2YWwgY2FzZSwgc2VlIGlmIHdlJ3JlIHRyYWNraW5nIHRoZSBmdW5jdGlvbi4KKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KEYtPmdldFJldHVyblR5cGUoKSkpIHsKKyAgICBpZiAoIU1SVkZ1bmN0aW9uc1RyYWNrZWQuY291bnQoRikpCisgICAgICBnb3RvIENhbGxPdmVyZGVmaW5lZDsgIC8vIE5vdCB0cmFja2luZyB0aGlzIGNhbGxlZS4KKyAgICAKKyAgICAvLyBJZiB3ZSBhcmUgdHJhY2tpbmcgdGhpcyBjYWxsZWUsIHByb3BhZ2F0ZSB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbgorICAgIC8vIGludG8gdGhpcyBjYWxsIHNpdGUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNUeS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBtZXJnZUluVmFsdWUoZ2V0U3RydWN0VmFsdWVTdGF0ZShJLCBpKSwgSSwgCisgICAgICAgICAgICAgICAgICAgVHJhY2tlZE11bHRpcGxlUmV0VmFsc1tzdGQ6Om1ha2VfcGFpcihGLCBpKV0pOworICB9IGVsc2UgeworICAgIERlbnNlTWFwPEZ1bmN0aW9uKiwgTGF0dGljZVZhbD46Oml0ZXJhdG9yIFRGUlZJID0gVHJhY2tlZFJldFZhbHMuZmluZChGKTsKKyAgICBpZiAoVEZSVkkgPT0gVHJhY2tlZFJldFZhbHMuZW5kKCkpCisgICAgICBnb3RvIENhbGxPdmVyZGVmaW5lZDsgIC8vIE5vdCB0cmFja2luZyB0aGlzIGNhbGxlZS4KKyAgICAgIAorICAgIC8vIElmIHNvLCBwcm9wYWdhdGUgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGVlIGludG8gdGhpcyBjYWxsIHJlc3VsdC4KKyAgICBtZXJnZUluVmFsdWUoSSwgVEZSVkktPnNlY29uZCk7CisgIH0KK30KKwordm9pZCBTQ0NQU29sdmVyOjpTb2x2ZSgpIHsKKyAgLy8gUHJvY2VzcyB0aGUgd29yayBsaXN0cyB1bnRpbCB0aGV5IGFyZSBlbXB0eSEKKyAgd2hpbGUgKCFCQldvcmtMaXN0LmVtcHR5KCkgfHwgIUluc3RXb3JrTGlzdC5lbXB0eSgpIHx8CisgICAgICAgICAhT3ZlcmRlZmluZWRJbnN0V29ya0xpc3QuZW1wdHkoKSkgeworICAgIC8vIFByb2Nlc3MgdGhlIG92ZXJkZWZpbmVkIGluc3RydWN0aW9uJ3Mgd29yayBsaXN0IGZpcnN0LCB3aGljaCBkcml2ZXMgb3RoZXIKKyAgICAvLyB0aGluZ3MgdG8gb3ZlcmRlZmluZWQgbW9yZSBxdWlja2x5LgorICAgIHdoaWxlICghT3ZlcmRlZmluZWRJbnN0V29ya0xpc3QuZW1wdHkoKSkgeworICAgICAgVmFsdWUgKkkgPSBPdmVyZGVmaW5lZEluc3RXb3JrTGlzdC5wb3BfYmFja192YWwoKTsKKworICAgICAgREVCVUcoZGJncygpIDw8ICJcblBvcHBlZCBvZmYgT0ktV0w6ICIgPDwgKkkgPDwgJ1xuJyk7CisKKyAgICAgIC8vICJJIiBnb3QgaW50byB0aGUgd29yayBsaXN0IGJlY2F1c2UgaXQgZWl0aGVyIG1hZGUgdGhlIHRyYW5zaXRpb24gZnJvbQorICAgICAgLy8gYm90dG9tIHRvIGNvbnN0YW50CisgICAgICAvLworICAgICAgLy8gQW55dGhpbmcgb24gdGhpcyB3b3JrbGlzdCB0aGF0IGlzIG92ZXJkZWZpbmVkIG5lZWQgbm90IGJlIHZpc2l0ZWQKKyAgICAgIC8vIHNpbmNlIGFsbCBvZiBpdHMgdXNlcnMgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBtYXJrZWQgYXMgb3ZlcmRlZmluZWQKKyAgICAgIC8vIFVwZGF0ZSBhbGwgb2YgdGhlIHVzZXJzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24ncyB2YWx1ZS4KKyAgICAgIC8vCisgICAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBJLT51c2VfYmVnaW4oKSwgRSA9IEktPnVzZV9lbmQoKTsKKyAgICAgICAgICAgVUkgIT0gRTsgKytVSSkKKyAgICAgICAgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSkpCisgICAgICAgICAgT3BlcmFuZENoYW5nZWRTdGF0ZShJKTsKKyAgICB9CisgICAgCisgICAgLy8gUHJvY2VzcyB0aGUgaW5zdHJ1Y3Rpb24gd29yayBsaXN0LgorICAgIHdoaWxlICghSW5zdFdvcmtMaXN0LmVtcHR5KCkpIHsKKyAgICAgIFZhbHVlICpJID0gSW5zdFdvcmtMaXN0LnBvcF9iYWNrX3ZhbCgpOworCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlxuUG9wcGVkIG9mZiBJLVdMOiAiIDw8ICpJIDw8ICdcbicpOworCisgICAgICAvLyAiSSIgZ290IGludG8gdGhlIHdvcmsgbGlzdCBiZWNhdXNlIGl0IG1hZGUgdGhlIHRyYW5zaXRpb24gZnJvbSB1bmRlZiB0bworICAgICAgLy8gY29uc3RhbnQuCisgICAgICAvLworICAgICAgLy8gQW55dGhpbmcgb24gdGhpcyB3b3JrbGlzdCB0aGF0IGlzIG92ZXJkZWZpbmVkIG5lZWQgbm90IGJlIHZpc2l0ZWQKKyAgICAgIC8vIHNpbmNlIGFsbCBvZiBpdHMgdXNlcnMgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBtYXJrZWQgYXMgb3ZlcmRlZmluZWQuCisgICAgICAvLyBVcGRhdGUgYWxsIG9mIHRoZSB1c2VycyBvZiB0aGlzIGluc3RydWN0aW9uJ3MgdmFsdWUuCisgICAgICAvLworICAgICAgaWYgKEktPmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpIHx8ICFnZXRWYWx1ZVN0YXRlKEkpLmlzT3ZlcmRlZmluZWQoKSkKKyAgICAgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gSS0+dXNlX2JlZ2luKCksIEUgPSBJLT51c2VfZW5kKCk7CisgICAgICAgICAgICAgVUkgIT0gRTsgKytVSSkKKyAgICAgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oKlVJKSkKKyAgICAgICAgICAgIE9wZXJhbmRDaGFuZ2VkU3RhdGUoSSk7CisgICAgfQorCisgICAgLy8gUHJvY2VzcyB0aGUgYmFzaWMgYmxvY2sgd29yayBsaXN0LgorICAgIHdoaWxlICghQkJXb3JrTGlzdC5lbXB0eSgpKSB7CisgICAgICBCYXNpY0Jsb2NrICpCQiA9IEJCV29ya0xpc3QuYmFjaygpOworICAgICAgQkJXb3JrTGlzdC5wb3BfYmFjaygpOworCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlxuUG9wcGVkIG9mZiBCQldMOiAiIDw8ICpCQiA8PCAnXG4nKTsKKworICAgICAgLy8gTm90aWZ5IGFsbCBpbnN0cnVjdGlvbnMgaW4gdGhpcyBiYXNpYyBibG9jayB0aGF0IHRoZXkgYXJlIG5ld2x5CisgICAgICAvLyBleGVjdXRhYmxlLgorICAgICAgdmlzaXQoQkIpOworICAgIH0KKyAgfQorfQorCisvLy8gUmVzb2x2ZWRVbmRlZnNJbiAtIFdoaWxlIHNvbHZpbmcgdGhlIGRhdGFmbG93IGZvciBhIGZ1bmN0aW9uLCB3ZSBhc3N1bWUKKy8vLyB0aGF0IGJyYW5jaGVzIG9uIHVuZGVmIHZhbHVlcyBjYW5ub3QgcmVhY2ggYW55IG9mIHRoZWlyIHN1Y2Nlc3NvcnMuCisvLy8gSG93ZXZlciwgdGhpcyBpcyBub3QgYSBzYWZlIGFzc3VtcHRpb24uICBBZnRlciB3ZSBzb2x2ZSBkYXRhZmxvdywgdGhpcworLy8vIG1ldGhvZCBzaG91bGQgYmUgdXNlIHRvIGhhbmRsZSB0aGlzLiAgSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZSBzb2x2ZXIKKy8vLyBzaG91bGQgYmUgcmVydW4uCisvLy8KKy8vLyBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoaXMgYnkgZmluZGluZyBhbiB1bnJlc29sdmVkIGJyYW5jaCBhbmQgbWFya2luZyBpdCBvbmUKKy8vLyBvZiB0aGUgZWRnZXMgZnJvbSB0aGUgYmxvY2sgYXMgYmVpbmcgZmVhc2libGUsIGV2ZW4gdGhvdWdoIHRoZSBjb25kaXRpb24KKy8vLyBkb2Vzbid0IHNheSBpdCB3b3VsZCBvdGhlcndpc2UgYmUuICBUaGlzIGFsbG93cyBTQ0NQIHRvIGZpbmQgdGhlIHJlc3Qgb2YgdGhlCisvLy8gQ0ZHIGFuZCBvbmx5IHNsaWdodGx5IHBlc3NpbWl6ZXMgdGhlIGFuYWx5c2lzIHJlc3VsdHMgKGJ5IG1hcmtpbmcgb25lLAorLy8vIHBvdGVudGlhbGx5IGluZmVhc2libGUsIGVkZ2UgZmVhc2libGUpLiAgVGhpcyBjYW5ub3QgdXNlZnVsbHkgbW9kaWZ5IHRoZQorLy8vIGNvbnN0cmFpbnRzIG9uIHRoZSBjb25kaXRpb24gb2YgdGhlIGJyYW5jaCwgYXMgdGhhdCB3b3VsZCBpbXBhY3Qgb3RoZXIgdXNlcnMKKy8vLyBvZiB0aGUgdmFsdWUuCisvLy8KKy8vLyBUaGlzIHNjYW4gYWxzbyBjaGVja3MgZm9yIHZhbHVlcyB0aGF0IHVzZSB1bmRlZnMsIHdob3NlIHJlc3VsdHMgYXJlIGFjdHVhbGx5CisvLy8gZGVmaW5lZC4gIEZvciBleGFtcGxlLCAnemV4dCBpOCB1bmRlZiB0byBpMzInIHNob3VsZCBwcm9kdWNlIGFsbCB6ZXJvcworLy8vIGNvbnNlcnZhdGl2ZWx5LCBhcyAiKHpleHQgaTggWCAtPiBpMzIpICYgMHhGRjAwIiBtdXN0IGFsd2F5cyByZXR1cm4gemVybywKKy8vLyBldmVuIGlmIFggaXNuJ3QgZGVmaW5lZC4KK2Jvb2wgU0NDUFNvbHZlcjo6UmVzb2x2ZWRVbmRlZnNJbihGdW5jdGlvbiAmRikgeworICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCQiA9IEYuYmVnaW4oKSwgRSA9IEYuZW5kKCk7IEJCICE9IEU7ICsrQkIpIHsKKyAgICBpZiAoIUJCRXhlY3V0YWJsZS5jb3VudChCQikpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIC8vIExvb2sgZm9yIGluc3RydWN0aW9ucyB3aGljaCBwcm9kdWNlIHVuZGVmIHZhbHVlcy4KKyAgICAgIGlmIChJLT5nZXRUeXBlKCktPmlzVm9pZFR5KCkpIGNvbnRpbnVlOworICAgICAgCisgICAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oSS0+Z2V0VHlwZSgpKSkgeworICAgICAgICAvLyBPbmx5IGEgZmV3IHRoaW5ncyB0aGF0IGNhbiBiZSBzdHJ1Y3RzIG1hdHRlciBmb3IgdW5kZWYuICBKdXN0IHNlbmQKKyAgICAgICAgLy8gYWxsIHRoZWlyIHJlc3VsdHMgdG8gb3ZlcmRlZmluZWQuICBXZSBjb3VsZCBiZSBtb3JlIHByZWNpc2UgdGhhbiB0aGlzCisgICAgICAgIC8vIGJ1dCBpdCBpc24ndCB3b3J0aCBib3RoZXJpbmcuCisgICAgICAgIGlmIChpc2E8Q2FsbEluc3Q+KEkpIHx8IGlzYTxTZWxlY3RJbnN0PihJKSkgeworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgICBMYXR0aWNlVmFsICZMViA9IGdldFN0cnVjdFZhbHVlU3RhdGUoSSwgaSk7CisgICAgICAgICAgICBpZiAoTFYuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgbWFya092ZXJkZWZpbmVkKExWLCBJKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIExhdHRpY2VWYWwgJkxWID0gZ2V0VmFsdWVTdGF0ZShJKTsKKyAgICAgIGlmICghTFYuaXNVbmRlZmluZWQoKSkgY29udGludWU7CisKKyAgICAgIC8vIE5vIGluc3RydWN0aW9ucyB1c2luZyBzdHJ1Y3RzIG5lZWQgZGlzYW1iaWd1YXRpb24uCisgICAgICBpZiAoSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc1N0cnVjdFR5KCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBHZXQgdGhlIGxhdHRpY2UgdmFsdWVzIG9mIHRoZSBmaXJzdCB0d28gb3BlcmFuZHMgZm9yIHVzZSBiZWxvdy4KKyAgICAgIExhdHRpY2VWYWwgT3AwTFYgPSBnZXRWYWx1ZVN0YXRlKEktPmdldE9wZXJhbmQoMCkpOworICAgICAgTGF0dGljZVZhbCBPcDFMVjsKKyAgICAgIGlmIChJLT5nZXROdW1PcGVyYW5kcygpID09IDIpIHsKKyAgICAgICAgLy8gTm8gaW5zdHJ1Y3Rpb25zIHVzaW5nIHN0cnVjdHMgbmVlZCBkaXNhbWJpZ3VhdGlvbi4KKyAgICAgICAgaWYgKEktPmdldE9wZXJhbmQoMSktPmdldFR5cGUoKS0+aXNTdHJ1Y3RUeSgpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHR3by1vcGVyYW5kIGluc3RydWN0aW9uLCBhbmQgaWYgYm90aCBvcGVyYW5kcyBhcmUKKyAgICAgICAgLy8gdW5kZWZzLCB0aGUgcmVzdWx0IHN0YXlzIHVuZGVmLgorICAgICAgICBPcDFMViA9IGdldFZhbHVlU3RhdGUoSS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICAgIGlmIChPcDBMVi5pc1VuZGVmaW5lZCgpICYmIE9wMUxWLmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIElmIHRoaXMgaXMgYW4gaW5zdHJ1Y3Rpb25zIHdob3NlIHJlc3VsdCBpcyBkZWZpbmVkIGV2ZW4gaWYgdGhlIGlucHV0IGlzCisgICAgICAvLyBub3QgZnVsbHkgZGVmaW5lZCwgcHJvcGFnYXRlIHRoZSBpbmZvcm1hdGlvbi4KKyAgICAgIGNvbnN0IFR5cGUgKklUeSA9IEktPmdldFR5cGUoKTsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOyAgICAgICAgICAvLyBMZWF2ZSB0aGUgaW5zdHJ1Y3Rpb24gYXMgYW4gdW5kZWYuCisgICAgICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICAgICAgICAvLyBBZnRlciBhIHplcm8gZXh0ZW5kLCB3ZSBrbm93IHRoZSB0b3AgcGFydCBpcyB6ZXJvLiAgU0V4dCBkb2Vzbid0IGhhdmUKKyAgICAgICAgLy8gdG8gYmUgaGFuZGxlZCBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgdG9wIHBhcnQgaXMgMSdzCisgICAgICAgIC8vIG9yIDAncy4KKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNJVG9GUDogIC8vIHNvbWUgRlAgdmFsdWVzIGFyZSBub3QgcG9zc2libGUsIGp1c3QgdXNlIDAuCisgICAgICBjYXNlIEluc3RydWN0aW9uOjpVSVRvRlA6ICAvLyBzb21lIEZQIHZhbHVlcyBhcmUgbm90IHBvc3NpYmxlLCBqdXN0IHVzZSAwLgorICAgICAgICBtYXJrRm9yY2VkQ29uc3RhbnQoSSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJVHkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgICAgIC8vIHVuZGVmICogWCAtPiAwLiAgIFggY291bGQgYmUgemVyby4KKyAgICAgICAgLy8gdW5kZWYgJiBYIC0+IDAuICAgWCBjb3VsZCBiZSB6ZXJvLgorICAgICAgICBtYXJrRm9yY2VkQ29uc3RhbnQoSSwgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJVHkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICAgICAgICAvLyB1bmRlZiB8IFggLT4gLTEuICAgWCBjb3VsZCBiZSAtMS4KKyAgICAgICAgbWFya0ZvcmNlZENvbnN0YW50KEksIENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoSVR5KSk7CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNSZW06CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOgorICAgICAgICAvLyBYIC8gdW5kZWYgLT4gdW5kZWYuICBObyBjaGFuZ2UuCisgICAgICAgIC8vIFggJSB1bmRlZiAtPiB1bmRlZi4gIE5vIGNoYW5nZS4KKyAgICAgICAgaWYgKE9wMUxWLmlzVW5kZWZpbmVkKCkpIGJyZWFrOworICAgICAgICAKKyAgICAgICAgLy8gdW5kZWYgLyBYIC0+IDAuICAgWCBjb3VsZCBiZSBtYXhpbnQuCisgICAgICAgIC8vIHVuZGVmICUgWCAtPiAwLiAgIFggY291bGQgYmUgMS4KKyAgICAgICAgbWFya0ZvcmNlZENvbnN0YW50KEksIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSVR5KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6CisgICAgICAgIC8vIHVuZGVmID4+cyBYIC0+IHVuZGVmLiAgTm8gY2hhbmdlLgorICAgICAgICBpZiAoT3AwTFYuaXNVbmRlZmluZWQoKSkgYnJlYWs7CisgICAgICAgIAorICAgICAgICAvLyBYID4+cyB1bmRlZiAtPiBYLiAgWCBjb3VsZCBiZSAwLCBYIGNvdWxkIGhhdmUgdGhlIGhpZ2gtYml0IGtub3duIHNldC4KKyAgICAgICAgaWYgKE9wMExWLmlzQ29uc3RhbnQoKSkKKyAgICAgICAgICBtYXJrRm9yY2VkQ29uc3RhbnQoSSwgT3AwTFYuZ2V0Q29uc3RhbnQoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtYXJrT3ZlcmRlZmluZWQoSSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDoKKyAgICAgICAgLy8gdW5kZWYgPj4gWCAtPiB1bmRlZi4gIE5vIGNoYW5nZS4KKyAgICAgICAgLy8gdW5kZWYgPDwgWCAtPiB1bmRlZi4gIE5vIGNoYW5nZS4KKyAgICAgICAgaWYgKE9wMExWLmlzVW5kZWZpbmVkKCkpIGJyZWFrOworICAgICAgICAKKyAgICAgICAgLy8gWCA+PiB1bmRlZiAtPiAwLiAgWCBjb3VsZCBiZSAwLgorICAgICAgICAvLyBYIDw8IHVuZGVmIC0+IDAuICBYIGNvdWxkIGJlIDAuCisgICAgICAgIG1hcmtGb3JjZWRDb25zdGFudChJLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKElUeSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNlbGVjdDoKKyAgICAgICAgLy8gdW5kZWYgPyBYIDogWSAgLT4gWCBvciBZLiAgVGhlcmUgY291bGQgYmUgY29tbW9uYWxpdHkgYmV0d2VlbiBYL1kuCisgICAgICAgIGlmIChPcDBMVi5pc1VuZGVmaW5lZCgpKSB7CisgICAgICAgICAgaWYgKCFPcDFMVi5pc0NvbnN0YW50KCkpICAvLyBQaWNrIHRoZSBjb25zdGFudCBvbmUgaWYgdGhlcmUgaXMgYW55LgorICAgICAgICAgICAgT3AxTFYgPSBnZXRWYWx1ZVN0YXRlKEktPmdldE9wZXJhbmQoMikpOworICAgICAgICB9IGVsc2UgaWYgKE9wMUxWLmlzVW5kZWZpbmVkKCkpIHsKKyAgICAgICAgICAvLyBjID8gdW5kZWYgOiB1bmRlZiAtPiB1bmRlZi4gIE5vIGNoYW5nZS4KKyAgICAgICAgICBPcDFMViA9IGdldFZhbHVlU3RhdGUoSS0+Z2V0T3BlcmFuZCgyKSk7CisgICAgICAgICAgaWYgKE9wMUxWLmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAvLyBPdGhlcndpc2UsIGMgPyB1bmRlZiA6IHggLT4geC4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBMZWF2ZSBPcDFMViBhcyBPcGVyYW5kKDEpJ3MgTGF0dGljZVZhbHVlLgorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoT3AxTFYuaXNDb25zdGFudCgpKQorICAgICAgICAgIG1hcmtGb3JjZWRDb25zdGFudChJLCBPcDFMVi5nZXRDb25zdGFudCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1hcmtPdmVyZGVmaW5lZChJKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpDYWxsOgorICAgICAgICAvLyBJZiBhIGNhbGwgaGFzIGFuIHVuZGVmIHJlc3VsdCwgaXQgaXMgYmVjYXVzZSBpdCBpcyBjb25zdGFudCBmb2xkYWJsZQorICAgICAgICAvLyBidXQgb25lIG9mIHRoZSBpbnB1dHMgd2FzIHVuZGVmLiAgSnVzdCBmb3JjZSB0aGUgcmVzdWx0IHRvCisgICAgICAgIC8vIG92ZXJkZWZpbmVkLgorICAgICAgICBtYXJrT3ZlcmRlZmluZWQoSSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBicmFuY2ggb3Igc3dpdGNoIG9uIGFuIHVuZGVmaW5lZCB2YWx1ZS4gIElmIHNvCisgICAgLy8gd2UgZm9yY2UgdGhlIGJyYW5jaCB0byBnbyBvbmUgd2F5IG9yIHRoZSBvdGhlciB0byBtYWtlIHRoZSBzdWNjZXNzb3IKKyAgICAvLyB2YWx1ZXMgbGl2ZS4gIEl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGljaCB3YXkgd2UgZm9yY2UgaXQuCisgICAgVGVybWluYXRvckluc3QgKlRJID0gQkItPmdldFRlcm1pbmF0b3IoKTsKKyAgICBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihUSSkpIHsKKyAgICAgIGlmICghQkktPmlzQ29uZGl0aW9uYWwoKSkgY29udGludWU7CisgICAgICBpZiAoIWdldFZhbHVlU3RhdGUoQkktPmdldENvbmRpdGlvbigpKS5pc1VuZGVmaW5lZCgpKQorICAgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAgIC8vIElmIHRoZSBpbnB1dCB0byBTQ0NQIGlzIGFjdHVhbGx5IGJyYW5jaCBvbiB1bmRlZiwgZml4IHRoZSB1bmRlZiB0bworICAgICAgLy8gZmFsc2UuCisgICAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KEJJLT5nZXRDb25kaXRpb24oKSkpIHsKKyAgICAgICAgQkktPnNldENvbmRpdGlvbihDb25zdGFudEludDo6Z2V0RmFsc2UoQkktPmdldENvbnRleHQoKSkpOworICAgICAgICBtYXJrRWRnZUV4ZWN1dGFibGUoQkIsIFRJLT5nZXRTdWNjZXNzb3IoMSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhIGJyYW5jaCBvbiBhIHN5bWJvbGljIHZhbHVlIHdoaWNoIGlzIGN1cnJlbnRseQorICAgICAgLy8gY29uc2lkZXJlZCB0byBiZSB1bmRlZi4gIEhhbmRsZSB0aGlzIGJ5IGZvcmNpbmcgdGhlIGlucHV0IHZhbHVlIHRvIHRoZQorICAgICAgLy8gYnJhbmNoIHRvIGZhbHNlLgorICAgICAgbWFya0ZvcmNlZENvbnN0YW50KEJJLT5nZXRDb25kaXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0RmFsc2UoVEktPmdldENvbnRleHQoKSkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGlmIChTd2l0Y2hJbnN0ICpTSSA9IGR5bl9jYXN0PFN3aXRjaEluc3Q+KFRJKSkgeworICAgICAgaWYgKFNJLT5nZXROdW1TdWNjZXNzb3JzKCkgPCAyKSAgIC8vIG5vIGNhc2VzCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKCFnZXRWYWx1ZVN0YXRlKFNJLT5nZXRDb25kaXRpb24oKSkuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIC8vIElmIHRoZSBpbnB1dCB0byBTQ0NQIGlzIGFjdHVhbGx5IHN3aXRjaCBvbiB1bmRlZiwgZml4IHRoZSB1bmRlZiB0bworICAgICAgLy8gdGhlIGZpcnN0IGNvbnN0YW50LgorICAgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihTSS0+Z2V0Q29uZGl0aW9uKCkpKSB7CisgICAgICAgIFNJLT5zZXRDb25kaXRpb24oU0ktPmdldENhc2VWYWx1ZSgxKSk7CisgICAgICAgIG1hcmtFZGdlRXhlY3V0YWJsZShCQiwgVEktPmdldFN1Y2Nlc3NvcigxKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgCisgICAgICBtYXJrRm9yY2VkQ29uc3RhbnQoU0ktPmdldENvbmRpdGlvbigpLCBTSS0+Z2V0Q2FzZVZhbHVlKDEpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworCituYW1lc3BhY2UgeworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8vIFNDQ1AgQ2xhc3MgLSBUaGlzIGNsYXNzIHVzZXMgdGhlIFNDQ1BTb2x2ZXIgdG8gaW1wbGVtZW50IGEgcGVyLWZ1bmN0aW9uCisgIC8vLyBTcGFyc2UgQ29uZGl0aW9uYWwgQ29uc3RhbnQgUHJvcGFnYXRvci4KKyAgLy8vCisgIHN0cnVjdCBTQ0NQIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgICAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgICBTQ0NQKCkgOiBGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICAvLyBydW5PbkZ1bmN0aW9uIC0gUnVuIHRoZSBTcGFyc2UgQ29uZGl0aW9uYWwgQ29uc3RhbnQgUHJvcGFnYXRpb24KKyAgICAvLyBhbGdvcml0aG0sIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gd2FzIG1vZGlmaWVkLgorICAgIC8vCisgICAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICB9CisgIH07Cit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2NoYXIgU0NDUDo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKFNDQ1AsICJzY2NwIiwKKyAgICAgICAgICAgICAgICAiU3BhcnNlIENvbmRpdGlvbmFsIENvbnN0YW50IFByb3BhZ2F0aW9uIiwgZmFsc2UsIGZhbHNlKTsKKworLy8gY3JlYXRlU0NDUFBhc3MgLSBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoaXMgZmlsZS4KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlU0NDUFBhc3MoKSB7CisgIHJldHVybiBuZXcgU0NDUCgpOworfQorCitzdGF0aWMgdm9pZCBEZWxldGVJbnN0cnVjdGlvbkluQmxvY2soQmFzaWNCbG9jayAqQkIpIHsKKyAgREVCVUcoZGJncygpIDw8ICIgIEJhc2ljQmxvY2sgRGVhZDoiIDw8ICpCQik7CisgICsrTnVtRGVhZEJsb2NrczsKKyAgCisgIC8vIERlbGV0ZSB0aGUgaW5zdHJ1Y3Rpb25zIGJhY2t3YXJkcywgYXMgaXQgaGFzIGEgcmVkdWNlZCBsaWtlbGlob29kIG9mCisgIC8vIGhhdmluZyB0byB1cGRhdGUgYXMgbWFueSBkZWYtdXNlIGFuZCB1c2UtZGVmIGNoYWlucy4KKyAgd2hpbGUgKCFpc2E8VGVybWluYXRvckluc3Q+KEJCLT5iZWdpbigpKSkgeworICAgIEluc3RydWN0aW9uICpJID0gLS1CYXNpY0Jsb2NrOjppdGVyYXRvcihCQi0+Z2V0VGVybWluYXRvcigpKTsKKyAgICAKKyAgICBpZiAoIUktPnVzZV9lbXB0eSgpKQorICAgICAgSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChJLT5nZXRUeXBlKCkpKTsKKyAgICBCQi0+Z2V0SW5zdExpc3QoKS5lcmFzZShJKTsKKyAgICArK051bUluc3RSZW1vdmVkOworICB9Cit9CisKKy8vIHJ1bk9uRnVuY3Rpb24oKSAtIFJ1biB0aGUgU3BhcnNlIENvbmRpdGlvbmFsIENvbnN0YW50IFByb3BhZ2F0aW9uIGFsZ29yaXRobSwKKy8vIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gd2FzIG1vZGlmaWVkLgorLy8KK2Jvb2wgU0NDUDo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICBERUJVRyhkYmdzKCkgPDwgIlNDQ1Agb24gZnVuY3Rpb24gJyIgPDwgRi5nZXROYW1lKCkgPDwgIidcbiIpOworICBTQ0NQU29sdmVyIFNvbHZlcihnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFRhcmdldERhdGE+KCkpOworCisgIC8vIE1hcmsgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmdW5jdGlvbiBhcyBiZWluZyBleGVjdXRhYmxlLgorICBTb2x2ZXIuTWFya0Jsb2NrRXhlY3V0YWJsZShGLmJlZ2luKCkpOworCisgIC8vIE1hcmsgYWxsIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24gYXMgYmVpbmcgb3ZlcmRlZmluZWQuCisgIGZvciAoRnVuY3Rpb246OmFyZ19pdGVyYXRvciBBSSA9IEYuYXJnX2JlZ2luKCksIEUgPSBGLmFyZ19lbmQoKTsgQUkgIT0gRTsrK0FJKQorICAgIFNvbHZlci5tYXJrQW55dGhpbmdPdmVyZGVmaW5lZChBSSk7CisKKyAgLy8gU29sdmUgZm9yIGNvbnN0YW50cy4KKyAgYm9vbCBSZXNvbHZlZFVuZGVmcyA9IHRydWU7CisgIHdoaWxlIChSZXNvbHZlZFVuZGVmcykgeworICAgIFNvbHZlci5Tb2x2ZSgpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiUkVTT0xWSU5HIFVOREVGc1xuIik7CisgICAgUmVzb2x2ZWRVbmRlZnMgPSBTb2x2ZXIuUmVzb2x2ZWRVbmRlZnNJbihGKTsKKyAgfQorCisgIGJvb2wgTWFkZUNoYW5nZXMgPSBmYWxzZTsKKworICAvLyBJZiB3ZSBkZWNpZGVkIHRoYXQgdGhlcmUgYXJlIGJhc2ljIGJsb2NrcyB0aGF0IGFyZSBkZWFkIGluIHRoaXMgZnVuY3Rpb24sCisgIC8vIGRlbGV0ZSB0aGVpciBjb250ZW50cyBub3cuICBOb3RlIHRoYXQgd2UgY2Fubm90IGFjdHVhbGx5IGRlbGV0ZSB0aGUgYmxvY2tzLAorICAvLyBhcyB3ZSBjYW5ub3QgbW9kaWZ5IHRoZSBDRkcgb2YgdGhlIGZ1bmN0aW9uLgorCisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEJCID0gRi5iZWdpbigpLCBFID0gRi5lbmQoKTsgQkIgIT0gRTsgKytCQikgeworICAgIGlmICghU29sdmVyLmlzQmxvY2tFeGVjdXRhYmxlKEJCKSkgeworICAgICAgRGVsZXRlSW5zdHJ1Y3Rpb25JbkJsb2NrKEJCKTsKKyAgICAgIE1hZGVDaGFuZ2VzID0gdHJ1ZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgCisgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIGEgZnVuY3Rpb24sIHJlcGxhY2luZyB0aGVtIHdpdGgKKyAgICAvLyBjb25zdGFudHMgaWYgd2UgaGF2ZSBmb3VuZCB0aGVtIHRvIGJlIG9mIGNvbnN0YW50IHZhbHVlcy4KKyAgICAvLworICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgQkkgPSBCQi0+YmVnaW4oKSwgRSA9IEJCLT5lbmQoKTsgQkkgIT0gRTsgKSB7CisgICAgICBJbnN0cnVjdGlvbiAqSW5zdCA9IEJJKys7CisgICAgICBpZiAoSW5zdC0+Z2V0VHlwZSgpLT5pc1ZvaWRUeSgpIHx8IGlzYTxUZXJtaW5hdG9ySW5zdD4oSW5zdCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBUT0RPOiBSZWNvbnN0cnVjdCBzdHJ1Y3RzIGZyb20gdGhlaXIgZWxlbWVudHMuCisgICAgICBpZiAoSW5zdC0+Z2V0VHlwZSgpLT5pc1N0cnVjdFR5KCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICBMYXR0aWNlVmFsIElWID0gU29sdmVyLmdldExhdHRpY2VWYWx1ZUZvcihJbnN0KTsKKyAgICAgIGlmIChJVi5pc092ZXJkZWZpbmVkKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICBDb25zdGFudCAqQ29uc3QgPSBJVi5pc0NvbnN0YW50KCkKKyAgICAgICAgPyBJVi5nZXRDb25zdGFudCgpIDogVW5kZWZWYWx1ZTo6Z2V0KEluc3QtPmdldFR5cGUoKSk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgQ29uc3RhbnQ6ICIgPDwgKkNvbnN0IDw8ICIgPSAiIDw8ICpJbnN0KTsKKworICAgICAgLy8gUmVwbGFjZXMgYWxsIG9mIHRoZSB1c2VzIG9mIGEgdmFyaWFibGUgd2l0aCB1c2VzIG9mIHRoZSBjb25zdGFudC4KKyAgICAgIEluc3QtPnJlcGxhY2VBbGxVc2VzV2l0aChDb25zdCk7CisgICAgICAKKyAgICAgIC8vIERlbGV0ZSB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgICBJbnN0LT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIAorICAgICAgLy8gSGV5LCB3ZSBqdXN0IGNoYW5nZWQgc29tZXRoaW5nIQorICAgICAgTWFkZUNoYW5nZXMgPSB0cnVlOworICAgICAgKytOdW1JbnN0UmVtb3ZlZDsKKyAgICB9CisgIH0KKworICByZXR1cm4gTWFkZUNoYW5nZXM7Cit9CisKK25hbWVzcGFjZSB7CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLy8gSVBTQ0NQIENsYXNzIC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGludGVycHJvY2VkdXJhbCBTcGFyc2UgQ29uZGl0aW9uYWwKKyAgLy8vIENvbnN0YW50IFByb3BhZ2F0aW9uLgorICAvLy8KKyAgc3RydWN0IElQU0NDUCA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsKKyAgICBJUFNDQ1AoKSA6IE1vZHVsZVBhc3MoSUQpIHt9CisgICAgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pOworICB9OworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCitjaGFyIElQU0NDUDo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKElQU0NDUCwgImlwc2NjcCIsCisgICAgICAgICAgICAgICAgIkludGVycHJvY2VkdXJhbCBTcGFyc2UgQ29uZGl0aW9uYWwgQ29uc3RhbnQgUHJvcGFnYXRpb24iLAorICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisKKy8vIGNyZWF0ZUlQU0NDUFBhc3MgLSBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoaXMgZmlsZS4KK01vZHVsZVBhc3MgKmxsdm06OmNyZWF0ZUlQU0NDUFBhc3MoKSB7CisgIHJldHVybiBuZXcgSVBTQ0NQKCk7Cit9CisKKworc3RhdGljIGJvb2wgQWRkcmVzc0lzVGFrZW4oY29uc3QgR2xvYmFsVmFsdWUgKkdWKSB7CisgIC8vIERlbGV0ZSBhbnkgZGVhZCBjb25zdGFudGV4cHIga2xpbmdvbnMuCisgIEdWLT5yZW1vdmVEZWFkQ29uc3RhbnRVc2VycygpOworCisgIGZvciAoVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvciBVSSA9IEdWLT51c2VfYmVnaW4oKSwgRSA9IEdWLT51c2VfZW5kKCk7CisgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgIGNvbnN0IFVzZXIgKlUgPSAqVUk7CisgICAgaWYgKGNvbnN0IFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFUpKSB7CisgICAgICBpZiAoU0ktPmdldE9wZXJhbmQoMCkgPT0gR1YgfHwgU0ktPmlzVm9sYXRpbGUoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBTdG9yaW5nIGFkZHIgb2YgR1YuCisgICAgfSBlbHNlIGlmIChpc2E8Q2FsbEluc3Q+KFUpKSB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBub3QgcGFzc2luZyB0aGUgYWRkcmVzcy4KKyAgICAgIEltbXV0YWJsZUNhbGxTaXRlIENTKGNhc3Q8SW5zdHJ1Y3Rpb24+KFUpKTsKKyAgICAgIGlmICghQ1MuaXNDYWxsZWUoVUkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0IExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihVKSkgeworICAgICAgaWYgKExJLT5pc1ZvbGF0aWxlKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXNhPEJsb2NrQWRkcmVzcz4oVSkpIHsKKyAgICAgIC8vIGJsb2NrYWRkcmVzcyBkb2Vzbid0IHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLCBpdCB0YWtlcyBhZGRyCisgICAgICAvLyBvZiBsYWJlbC4KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJUFNDQ1A6OnJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICBTQ0NQU29sdmVyIFNvbHZlcihnZXRBbmFseXNpc0lmQXZhaWxhYmxlPFRhcmdldERhdGE+KCkpOworCisgIC8vIExvb3Agb3ZlciBhbGwgZnVuY3Rpb25zLCBtYXJraW5nIGFyZ3VtZW50cyB0byB0aG9zZSB3aXRoIHRoZWlyIGFkZHJlc3NlcworICAvLyB0YWtlbiBvciB0aGF0IGFyZSBleHRlcm5hbCBhcyBvdmVyZGVmaW5lZC4KKyAgLy8KKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEYgPSBNLmJlZ2luKCksIEUgPSBNLmVuZCgpOyBGICE9IEU7ICsrRikgeworICAgIGlmIChGLT5pc0RlY2xhcmF0aW9uKCkpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGEgc3Ryb25nIG9yIE9EUiBkZWZpbml0aW9uIG9mIHRoaXMgZnVuY3Rpb24sIHRoZW4gd2UgY2FuCisgICAgLy8gcHJvcGFnYXRlIGluZm9ybWF0aW9uIGFib3V0IGl0cyByZXN1bHQgaW50byBjYWxsc2l0ZXMgb2YgaXQuCisgICAgaWYgKCFGLT5tYXlCZU92ZXJyaWRkZW4oKSkKKyAgICAgIFNvbHZlci5BZGRUcmFja2VkRnVuY3Rpb24oRik7CisgICAgCisgICAgLy8gSWYgdGhpcyBmdW5jdGlvbiBvbmx5IGhhcyBkaXJlY3QgY2FsbHMgdGhhdCB3ZSBjYW4gc2VlLCB3ZSBjYW4gdHJhY2sgaXRzCisgICAgLy8gYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUgYWdncmVzc2l2ZWx5LCBhbmQgY2FuIGFzc3VtZSBpdCBpcyBub3QgY2FsbGVkCisgICAgLy8gdW5sZXNzIHdlIHNlZSBldmlkZW5jZSB0byB0aGUgY29udHJhcnkuCisgICAgaWYgKEYtPmhhc0xvY2FsTGlua2FnZSgpICYmICFBZGRyZXNzSXNUYWtlbihGKSkgeworICAgICAgU29sdmVyLkFkZEFyZ3VtZW50VHJhY2tlZEZ1bmN0aW9uKEYpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gQXNzdW1lIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCisgICAgU29sdmVyLk1hcmtCbG9ja0V4ZWN1dGFibGUoRi0+YmVnaW4oKSk7CisgICAgCisgICAgLy8gQXNzdW1lIG5vdGhpbmcgYWJvdXQgdGhlIGluY29taW5nIGFyZ3VtZW50cy4KKyAgICBmb3IgKEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgQUkgPSBGLT5hcmdfYmVnaW4oKSwgRSA9IEYtPmFyZ19lbmQoKTsKKyAgICAgICAgIEFJICE9IEU7ICsrQUkpCisgICAgICBTb2x2ZXIubWFya0FueXRoaW5nT3ZlcmRlZmluZWQoQUkpOworICB9CisKKyAgLy8gTG9vcCBvdmVyIGdsb2JhbCB2YXJpYWJsZXMuICBXZSBpbmZvcm0gdGhlIHNvbHZlciBhYm91dCBhbnkgaW50ZXJuYWwgZ2xvYmFsCisgIC8vIHZhcmlhYmxlcyB0aGF0IGRvIG5vdCBoYXZlIHRoZWlyICdhZGRyZXNzZXMgdGFrZW4nLiAgSWYgdGhleSBkb24ndCBoYXZlCisgIC8vIHRoZWlyIGFkZHJlc3NlcyB0YWtlbiwgd2UgY2FuIHByb3BhZ2F0ZSBjb25zdGFudHMgdGhyb3VnaCB0aGVtLgorICBmb3IgKE1vZHVsZTo6Z2xvYmFsX2l0ZXJhdG9yIEcgPSBNLmdsb2JhbF9iZWdpbigpLCBFID0gTS5nbG9iYWxfZW5kKCk7CisgICAgICAgRyAhPSBFOyArK0cpCisgICAgaWYgKCFHLT5pc0NvbnN0YW50KCkgJiYgRy0+aGFzTG9jYWxMaW5rYWdlKCkgJiYgIUFkZHJlc3NJc1Rha2VuKEcpKQorICAgICAgU29sdmVyLlRyYWNrVmFsdWVPZkdsb2JhbFZhcmlhYmxlKEcpOworCisgIC8vIFNvbHZlIGZvciBjb25zdGFudHMuCisgIGJvb2wgUmVzb2x2ZWRVbmRlZnMgPSB0cnVlOworICB3aGlsZSAoUmVzb2x2ZWRVbmRlZnMpIHsKKyAgICBTb2x2ZXIuU29sdmUoKTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiUkVTT0xWSU5HIFVOREVGU1xuIik7CisgICAgUmVzb2x2ZWRVbmRlZnMgPSBmYWxzZTsKKyAgICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgRiA9IE0uYmVnaW4oKSwgRSA9IE0uZW5kKCk7IEYgIT0gRTsgKytGKQorICAgICAgUmVzb2x2ZWRVbmRlZnMgfD0gU29sdmVyLlJlc29sdmVkVW5kZWZzSW4oKkYpOworICB9CisKKyAgYm9vbCBNYWRlQ2hhbmdlcyA9IGZhbHNlOworCisgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgbW9kdWxlLCByZXBsYWNpbmcgdGhlbSB3aXRoCisgIC8vIGNvbnN0YW50cyBpZiB3ZSBoYXZlIGZvdW5kIHRoZW0gdG8gYmUgb2YgY29uc3RhbnQgdmFsdWVzLgorICAvLworICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgNTEyPiBCbG9ja3NUb0VyYXNlOworCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBGID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgRiAhPSBFOyArK0YpIHsKKyAgICBpZiAoU29sdmVyLmlzQmxvY2tFeGVjdXRhYmxlKEYtPmJlZ2luKCkpKSB7CisgICAgICBmb3IgKEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgQUkgPSBGLT5hcmdfYmVnaW4oKSwgRSA9IEYtPmFyZ19lbmQoKTsKKyAgICAgICAgICAgQUkgIT0gRTsgKytBSSkgeworICAgICAgICBpZiAoQUktPnVzZV9lbXB0eSgpIHx8IEFJLT5nZXRUeXBlKCktPmlzU3RydWN0VHkoKSkgY29udGludWU7CisgICAgICAgIAorICAgICAgICAvLyBUT0RPOiBDb3VsZCB1c2UgZ2V0U3RydWN0TGF0dGljZVZhbHVlRm9yIHRvIGZpbmQgb3V0IGlmIHRoZSBlbnRpcmUKKyAgICAgICAgLy8gcmVzdWx0IGlzIGEgY29uc3RhbnQgYW5kIHJlcGxhY2UgaXQgZW50aXJlbHkgaWYgc28uCisKKyAgICAgICAgTGF0dGljZVZhbCBJViA9IFNvbHZlci5nZXRMYXR0aWNlVmFsdWVGb3IoQUkpOworICAgICAgICBpZiAoSVYuaXNPdmVyZGVmaW5lZCgpKSBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIENvbnN0YW50ICpDU1QgPSBJVi5pc0NvbnN0YW50KCkgPworICAgICAgICBJVi5nZXRDb25zdGFudCgpIDogVW5kZWZWYWx1ZTo6Z2V0KEFJLT5nZXRUeXBlKCkpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIioqKiAgQXJnICIgPDwgKkFJIDw8ICIgPSAiIDw8ICpDU1QgPDwiXG4iKTsKKyAgICAgICAgCisgICAgICAgIC8vIFJlcGxhY2VzIGFsbCBvZiB0aGUgdXNlcyBvZiBhIHZhcmlhYmxlIHdpdGggdXNlcyBvZiB0aGUKKyAgICAgICAgLy8gY29uc3RhbnQuCisgICAgICAgIEFJLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ1NUKTsKKyAgICAgICAgKytJUE51bUFyZ3NFbGltZWQ7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpIHsKKyAgICAgIGlmICghU29sdmVyLmlzQmxvY2tFeGVjdXRhYmxlKEJCKSkgeworICAgICAgICBEZWxldGVJbnN0cnVjdGlvbkluQmxvY2soQkIpOworICAgICAgICBNYWRlQ2hhbmdlcyA9IHRydWU7CisKKyAgICAgICAgVGVybWluYXRvckluc3QgKlRJID0gQkItPmdldFRlcm1pbmF0b3IoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRJLT5nZXROdW1TdWNjZXNzb3JzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQmFzaWNCbG9jayAqU3VjYyA9IFRJLT5nZXRTdWNjZXNzb3IoaSk7CisgICAgICAgICAgaWYgKCFTdWNjLT5lbXB0eSgpICYmIGlzYTxQSElOb2RlPihTdWNjLT5iZWdpbigpKSkKKyAgICAgICAgICAgIFRJLT5nZXRTdWNjZXNzb3IoaSktPnJlbW92ZVByZWRlY2Vzc29yKEJCKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVRJLT51c2VfZW1wdHkoKSkKKyAgICAgICAgICBUSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChUSS0+Z2V0VHlwZSgpKSk7CisgICAgICAgIFRJLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICAgICAgICBpZiAoJipCQiAhPSAmRi0+ZnJvbnQoKSkKKyAgICAgICAgICBCbG9ja3NUb0VyYXNlLnB1c2hfYmFjayhCQik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBuZXcgVW5yZWFjaGFibGVJbnN0KE0uZ2V0Q29udGV4dCgpLCBCQik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7IEJJICE9IEU7ICkgeworICAgICAgICBJbnN0cnVjdGlvbiAqSW5zdCA9IEJJKys7CisgICAgICAgIGlmIChJbnN0LT5nZXRUeXBlKCktPmlzVm9pZFR5KCkgfHwgSW5zdC0+Z2V0VHlwZSgpLT5pc1N0cnVjdFR5KCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorICAgICAgICAvLyBUT0RPOiBDb3VsZCB1c2UgZ2V0U3RydWN0TGF0dGljZVZhbHVlRm9yIHRvIGZpbmQgb3V0IGlmIHRoZSBlbnRpcmUKKyAgICAgICAgLy8gcmVzdWx0IGlzIGEgY29uc3RhbnQgYW5kIHJlcGxhY2UgaXQgZW50aXJlbHkgaWYgc28uCisgICAgICAgIAorICAgICAgICBMYXR0aWNlVmFsIElWID0gU29sdmVyLmdldExhdHRpY2VWYWx1ZUZvcihJbnN0KTsKKyAgICAgICAgaWYgKElWLmlzT3ZlcmRlZmluZWQoKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIENvbnN0YW50ICpDb25zdCA9IElWLmlzQ29uc3RhbnQoKQorICAgICAgICAgID8gSVYuZ2V0Q29uc3RhbnQoKSA6IFVuZGVmVmFsdWU6OmdldChJbnN0LT5nZXRUeXBlKCkpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgQ29uc3RhbnQ6ICIgPDwgKkNvbnN0IDw8ICIgPSAiIDw8ICpJbnN0KTsKKworICAgICAgICAvLyBSZXBsYWNlcyBhbGwgb2YgdGhlIHVzZXMgb2YgYSB2YXJpYWJsZSB3aXRoIHVzZXMgb2YgdGhlCisgICAgICAgIC8vIGNvbnN0YW50LgorICAgICAgICBJbnN0LT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3QpOworICAgICAgICAKKyAgICAgICAgLy8gRGVsZXRlIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgICAgaWYgKCFpc2E8Q2FsbEluc3Q+KEluc3QpICYmICFpc2E8VGVybWluYXRvckluc3Q+KEluc3QpKQorICAgICAgICAgIEluc3QtPmVyYXNlRnJvbVBhcmVudCgpOworCisgICAgICAgIC8vIEhleSwgd2UganVzdCBjaGFuZ2VkIHNvbWV0aGluZyEKKyAgICAgICAgTWFkZUNoYW5nZXMgPSB0cnVlOworICAgICAgICArK0lQTnVtSW5zdFJlbW92ZWQ7CisgICAgICB9CisgICAgfQorCisgICAgLy8gTm93IHRoYXQgYWxsIGluc3RydWN0aW9ucyBpbiB0aGUgZnVuY3Rpb24gYXJlIGNvbnN0YW50IGZvbGRlZCwgZXJhc2UgZGVhZAorICAgIC8vIGJsb2NrcywgYmVjYXVzZSB3ZSBjYW4gbm93IHVzZSBDb25zdGFudEZvbGRUZXJtaW5hdG9yIHRvIGdldCByaWQgb2YKKyAgICAvLyBpbi1lZGdlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQmxvY2tzVG9FcmFzZS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IFBISSBub2RlcyBpbiB0aGlzIHN1Y2Nlc3NvciwgZHJvcCBlbnRyaWVzIGZvciBCQiBub3cuCisgICAgICBCYXNpY0Jsb2NrICpEZWFkQkIgPSBCbG9ja3NUb0VyYXNlW2ldOworICAgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gRGVhZEJCLT51c2VfYmVnaW4oKSwgVUUgPSBEZWFkQkItPnVzZV9lbmQoKTsKKyAgICAgICAgICAgVUkgIT0gVUU7ICkgeworICAgICAgICAvLyBHcmFiIHRoZSB1c2VyIGFuZCB0aGVuIGluY3JlbWVudCB0aGUgaXRlcmF0b3IgZWFybHksIGFzIHRoZSB1c2VyCisgICAgICAgIC8vIHdpbGwgYmUgZGVsZXRlZC4gU3RlcCBwYXN0IGFsbCBhZGphY2VudCB1c2VzIGZyb20gdGhlIHNhbWUgdXNlci4KKyAgICAgICAgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKyAgICAgICAgZG8geyArK1VJOyB9IHdoaWxlIChVSSAhPSBVRSAmJiAqVUkgPT0gSSk7CisKKyAgICAgICAgLy8gSWdub3JlIGJsb2NrYWRkcmVzcyB1c2VyczsgQmFzaWNCbG9jaydzIGR0b3Igd2lsbCBoYW5kbGUgdGhlbS4KKyAgICAgICAgaWYgKCFJKSBjb250aW51ZTsKKworICAgICAgICBib29sIEZvbGRlZCA9IENvbnN0YW50Rm9sZFRlcm1pbmF0b3IoSS0+Z2V0UGFyZW50KCkpOworICAgICAgICBpZiAoIUZvbGRlZCkgeworICAgICAgICAgIC8vIFRoZSBjb25zdGFudCBmb2xkZXIgbWF5IG5vdCBoYXZlIGJlZW4gYWJsZSB0byBmb2xkIHRoZSB0ZXJtaW5hdG9yCisgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGJyYW5jaCBvciBzd2l0Y2ggb24gdW5kZWYuICBGb2xkIGl0IG1hbnVhbGx5IGFzIGEKKyAgICAgICAgICAvLyBicmFuY2ggdG8gdGhlIGZpcnN0IHN1Y2Nlc3Nvci4KKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgaWYgKEJyYW5jaEluc3QgKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oSSkpIHsKKyAgICAgICAgICAgIGFzc2VydChCSS0+aXNDb25kaXRpb25hbCgpICYmIGlzYTxVbmRlZlZhbHVlPihCSS0+Z2V0Q29uZGl0aW9uKCkpICYmCisgICAgICAgICAgICAgICAgICAgIkJyYW5jaCBzaG91bGQgYmUgZm9sZGFibGUhIik7CisgICAgICAgICAgfSBlbHNlIGlmIChTd2l0Y2hJbnN0ICpTSSA9IGR5bl9jYXN0PFN3aXRjaEluc3Q+KEkpKSB7CisgICAgICAgICAgICBhc3NlcnQoaXNhPFVuZGVmVmFsdWU+KFNJLT5nZXRDb25kaXRpb24oKSkgJiYgIlN3aXRjaCBzaG91bGQgZm9sZCIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJEaWRuJ3QgZm9sZCBhd2F5IHJlZmVyZW5jZSB0byBibG9jayEiKTsKKyAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBNYWtlIHRoaXMgYW4gdW5jb25kIGJyYW5jaCB0byB0aGUgZmlyc3Qgc3VjY2Vzc29yLgorICAgICAgICAgIFRlcm1pbmF0b3JJbnN0ICpUSSA9IEktPmdldFBhcmVudCgpLT5nZXRUZXJtaW5hdG9yKCk7CisgICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKFRJLT5nZXRTdWNjZXNzb3IoMCksIFRJKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBSZW1vdmUgZW50cmllcyBpbiBzdWNjZXNzb3IgcGhpIG5vZGVzIHRvIHJlbW92ZSBlZGdlcy4KKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gVEktPmdldE51bVN1Y2Nlc3NvcnMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgICBUSS0+Z2V0U3VjY2Vzc29yKGkpLT5yZW1vdmVQcmVkZWNlc3NvcihUSS0+Z2V0UGFyZW50KCkpOworICAgICAgICAgIAorICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIHRlcm1pbmF0b3IuCisgICAgICAgICAgVEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEZpbmFsbHksIGRlbGV0ZSB0aGUgYmFzaWMgYmxvY2suCisgICAgICBGLT5nZXRCYXNpY0Jsb2NrTGlzdCgpLmVyYXNlKERlYWRCQik7CisgICAgfQorICAgIEJsb2Nrc1RvRXJhc2UuY2xlYXIoKTsKKyAgfQorCisgIC8vIElmIHdlIGluZmVycmVkIGNvbnN0YW50IG9yIHVuZGVmIHJldHVybiB2YWx1ZXMgZm9yIGEgZnVuY3Rpb24sIHdlIHJlcGxhY2VkCisgIC8vIGFsbCBjYWxsIHVzZXMgd2l0aCB0aGUgaW5mZXJyZWQgdmFsdWUuICBUaGlzIG1lYW5zIHdlIGRvbid0IG5lZWQgdG8gYm90aGVyCisgIC8vIGFjdHVhbGx5IHJldHVybmluZyBhbnl0aGluZyBmcm9tIHRoZSBmdW5jdGlvbi4gIFJlcGxhY2UgYWxsIHJldHVybgorICAvLyBpbnN0cnVjdGlvbnMgd2l0aCByZXR1cm4gdW5kZWYuCisgIC8vCisgIC8vIERvIHRoaXMgaW4gdHdvIHN0YWdlczogZmlyc3QgaWRlbnRpZnkgdGhlIGZ1bmN0aW9ucyB3ZSBzaG91bGQgcHJvY2VzcywgdGhlbgorICAvLyBhY3R1YWxseSB6YXAgdGhlaXIgcmV0dXJucy4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2Ugd2UgY2FuIG9ubHkgZG8gdGhpcworICAvLyBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gaXNuJ3QgdGFrZW4uICBJbiBjYXNlcyB3aGVyZSBhIHJldHVybiBpcyB0aGUKKyAgLy8gbGFzdCB1c2Ugb2YgYSBmdW5jdGlvbiwgdGhlIG9yZGVyIG9mIHByb2Nlc3NpbmcgZnVuY3Rpb25zIHdvdWxkIGFmZmVjdAorICAvLyB3aGV0aGVyIG90aGVyIGZ1bmN0aW9ucyBhcmUgb3B0aW1pemFibGUuCisgIFNtYWxsVmVjdG9yPFJldHVybkluc3QqLCA4PiBSZXR1cm5zVG9aYXA7CisgIAorICAvLyBUT0RPOiBQcm9jZXNzIG11bHRpcGxlIHZhbHVlIHJldCBpbnN0cnVjdGlvbnMgYWxzby4KKyAgY29uc3QgRGVuc2VNYXA8RnVuY3Rpb24qLCBMYXR0aWNlVmFsPiAmUlYgPSBTb2x2ZXIuZ2V0VHJhY2tlZFJldFZhbHMoKTsKKyAgZm9yIChEZW5zZU1hcDxGdW5jdGlvbiosIExhdHRpY2VWYWw+Ojpjb25zdF9pdGVyYXRvciBJID0gUlYuYmVnaW4oKSwKKyAgICAgICBFID0gUlYuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgRnVuY3Rpb24gKkYgPSBJLT5maXJzdDsKKyAgICBpZiAoSS0+c2Vjb25kLmlzT3ZlcmRlZmluZWQoKSB8fCBGLT5nZXRSZXR1cm5UeXBlKCktPmlzVm9pZFR5KCkpCisgICAgICBjb250aW51ZTsKKyAgCisgICAgLy8gV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB3ZSBrbm93IHRoYXQgbm90aGluZyBlbHNlIGNhbiBjYWxsIHRoZSBmdW5jdGlvbi4KKyAgICBpZiAoIUYtPmhhc0xvY2FsTGlua2FnZSgpIHx8IEFkZHJlc3NJc1Rha2VuKEYpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkIgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpCisgICAgICBpZiAoUmV0dXJuSW5zdCAqUkkgPSBkeW5fY2FzdDxSZXR1cm5JbnN0PihCQi0+Z2V0VGVybWluYXRvcigpKSkKKyAgICAgICAgaWYgKCFpc2E8VW5kZWZWYWx1ZT4oUkktPmdldE9wZXJhbmQoMCkpKQorICAgICAgICAgIFJldHVybnNUb1phcC5wdXNoX2JhY2soUkkpOworICB9CisKKyAgLy8gWmFwIGFsbCByZXR1cm5zIHdoaWNoIHdlJ3ZlIGlkZW50aWZpZWQgYXMgemFwIHRvIGNoYW5nZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJldHVybnNUb1phcC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgRnVuY3Rpb24gKkYgPSBSZXR1cm5zVG9aYXBbaV0tPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICBSZXR1cm5zVG9aYXBbaV0tPnNldE9wZXJhbmQoMCwgVW5kZWZWYWx1ZTo6Z2V0KEYtPmdldFJldHVyblR5cGUoKSkpOworICB9CisgICAgCisgIC8vIElmIHdlIGluZmVyZWQgY29uc3RhbnQgb3IgdW5kZWYgdmFsdWVzIGZvciBnbG9iYWxzIHZhcmlhYmxlcywgd2UgY2FuIGRlbGV0ZQorICAvLyB0aGUgZ2xvYmFsIGFuZCBhbnkgc3RvcmVzIHRoYXQgcmVtYWluIHRvIGl0LgorICBjb25zdCBEZW5zZU1hcDxHbG9iYWxWYXJpYWJsZSosIExhdHRpY2VWYWw+ICZURyA9IFNvbHZlci5nZXRUcmFja2VkR2xvYmFscygpOworICBmb3IgKERlbnNlTWFwPEdsb2JhbFZhcmlhYmxlKiwgTGF0dGljZVZhbD46OmNvbnN0X2l0ZXJhdG9yIEkgPSBURy5iZWdpbigpLAorICAgICAgICAgRSA9IFRHLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEdsb2JhbFZhcmlhYmxlICpHViA9IEktPmZpcnN0OworICAgIGFzc2VydCghSS0+c2Vjb25kLmlzT3ZlcmRlZmluZWQoKSAmJgorICAgICAgICAgICAiT3ZlcmRlZmluZWQgdmFsdWVzIHNob3VsZCBoYXZlIGJlZW4gdGFrZW4gb3V0IG9mIHRoZSBtYXAhIik7CisgICAgREVCVUcoZGJncygpIDw8ICJGb3VuZCB0aGF0IEdWICciIDw8IEdWLT5nZXROYW1lKCkgPDwgIicgaXMgY29uc3RhbnQhXG4iKTsKKyAgICB3aGlsZSAoIUdWLT51c2VfZW1wdHkoKSkgeworICAgICAgU3RvcmVJbnN0ICpTSSA9IGNhc3Q8U3RvcmVJbnN0PihHVi0+dXNlX2JhY2soKSk7CisgICAgICBTSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgfQorICAgIE0uZ2V0R2xvYmFsTGlzdCgpLmVyYXNlKEdWKTsKKyAgICArK0lQTnVtR2xvYmFsQ29uc3Q7CisgIH0KKworICByZXR1cm4gTWFkZUNoYW5nZXM7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvU2NhbGFyUmVwbEFnZ3JlZ2F0ZXMuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL1NjYWxhclJlcGxBZ2dyZWdhdGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQxYjgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvU2NhbGFyL1NjYWxhclJlcGxBZ2dyZWdhdGVzLmNwcApAQCAtMCwwICsxLDE4MDcgQEAKKy8vPT09LSBTY2FsYXJSZXBsQWdncmVnYXRlcy5jcHAgLSBTY2FsYXIgUmVwbGFjZW1lbnQgb2YgQWdncmVnYXRlcyAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0cmFuc2Zvcm1hdGlvbiBpbXBsZW1lbnRzIHRoZSB3ZWxsIGtub3duIHNjYWxhciByZXBsYWNlbWVudCBvZgorLy8gYWdncmVnYXRlcyB0cmFuc2Zvcm1hdGlvbi4gIFRoaXMgeGZvcm0gYnJlYWtzIHVwIGFsbG9jYSBpbnN0cnVjdGlvbnMgb2YKKy8vIGFnZ3JlZ2F0ZSB0eXBlIChzdHJ1Y3R1cmUgb3IgYXJyYXkpIGludG8gaW5kaXZpZHVhbCBhbGxvY2EgaW5zdHJ1Y3Rpb25zIGZvcgorLy8gZWFjaCBtZW1iZXIgKGlmIHBvc3NpYmxlKS4gIFRoZW4sIGlmIHBvc3NpYmxlLCBpdCB0cmFuc2Zvcm1zIHRoZSBpbmRpdmlkdWFsCisvLyBhbGxvY2EgaW5zdHJ1Y3Rpb25zIGludG8gbmljZSBjbGVhbiBzY2FsYXIgU1NBIGZvcm0uCisvLworLy8gVGhpcyBjb21iaW5lcyBhIHNpbXBsZSBTUm9BIGFsZ29yaXRobSB3aXRoIHRoZSBNZW0yUmVnIGFsZ29yaXRobSBiZWNhdXNlCisvLyBvZnRlbiBpbnRlcmFjdCwgZXNwZWNpYWxseSBmb3IgQysrIHByb2dyYW1zLiAgQXMgc3VjaCwgaXRlcmF0aW5nIGJldHdlZW4KKy8vIFNSb0EsIHRoZW4gTWVtMlJlZyB1bnRpbCB3ZSBydW4gb3V0IG9mIHRoaW5ncyB0byBwcm9tb3RlIHdvcmtzIHdlbGwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzY2FsYXJyZXBsIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Byb21vdGVNZW1Ub1JlZy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSVJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1NUQVRJU1RJQyhOdW1SZXBsYWNlZCwgICJOdW1iZXIgb2YgYWxsb2NhcyBicm9rZW4gdXAiKTsKK1NUQVRJU1RJQyhOdW1Qcm9tb3RlZCwgICJOdW1iZXIgb2YgYWxsb2NhcyBwcm9tb3RlZCIpOworU1RBVElTVElDKE51bUNvbnZlcnRlZCwgIk51bWJlciBvZiBhZ2dyZWdhdGVzIGNvbnZlcnRlZCB0byBzY2FsYXIiKTsKK1NUQVRJU1RJQyhOdW1HbG9iYWxzLCAgICJOdW1iZXIgb2YgYWxsb2NhcyBjb3BpZWQgZnJvbSBjb25zdGFudCBnbG9iYWwiKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IFNST0EgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIGV4cGxpY2l0IFNST0Eoc2lnbmVkIFQgPSAtMSkgOiBGdW5jdGlvblBhc3MoSUQpIHsKKyAgICAgIGlmIChUID09IC0xKQorICAgICAgICBTUlRocmVzaG9sZCA9IDEyODsKKyAgICAgIGVsc2UKKyAgICAgICAgU1JUaHJlc2hvbGQgPSBUOworICAgIH0KKworICAgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7CisKKyAgICBib29sIHBlcmZvcm1TY2FsYXJSZXBsKEZ1bmN0aW9uICZGKTsKKyAgICBib29sIHBlcmZvcm1Qcm9tb3Rpb24oRnVuY3Rpb24gJkYpOworCisgICAgLy8gZ2V0QW5hbHlzaXNVc2FnZSAtIFRoaXMgcGFzcyBkb2VzIG5vdCByZXF1aXJlIGFueSBwYXNzZXMsIGJ1dCB3ZSBrbm93IGl0CisgICAgLy8gd2lsbCBub3QgYWx0ZXIgdGhlIENGRywgc28gc2F5IHNvLgorICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5hZGRSZXF1aXJlZDxEb21pbmF0b3JUcmVlPigpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8RG9taW5hbmNlRnJvbnRpZXI+KCk7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBUYXJnZXREYXRhICpURDsKKyAgICAKKyAgICAvLy8gRGVhZEluc3RzIC0gS2VlcCB0cmFjayBvZiBpbnN0cnVjdGlvbnMgd2UgaGF2ZSBtYWRlIGRlYWQsIHNvIHRoYXQKKyAgICAvLy8gd2UgY2FuIHJlbW92ZSB0aGVtIGFmdGVyIHdlIGFyZSBkb25lIHdvcmtpbmcuCisgICAgU21hbGxWZWN0b3I8VmFsdWUqLCAzMj4gRGVhZEluc3RzOworCisgICAgLy8vIEFsbG9jYUluZm8gLSBXaGVuIGFuYWx5emluZyB1c2VzIG9mIGFuIGFsbG9jYSBpbnN0cnVjdGlvbiwgdGhpcyBjYXB0dXJlcworICAgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlcy4gIEFsbCB0aGVzZSBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHRvIGZhbHNlCisgICAgLy8vIGFuZCBzZXQgdG8gdHJ1ZSB3aGVuIHNvbWV0aGluZyBpcyBsZWFybmVkLgorICAgIHN0cnVjdCBBbGxvY2FJbmZvIHsKKyAgICAgIC8vLyBpc1Vuc2FmZSAtIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgdGhlIGFsbG9jYSBjYW5ub3QgYmUgU1JPQSdkLgorICAgICAgYm9vbCBpc1Vuc2FmZSA6IDE7CisgICAgICAKKyAgICAgIC8vLyBpc01lbUNweVNyYyAtIFRoaXMgaXMgdHJ1ZSBpZiB0aGlzIGFnZ3JlZ2F0ZSBpcyBtZW1jcHknZCBmcm9tLgorICAgICAgYm9vbCBpc01lbUNweVNyYyA6IDE7CisKKyAgICAgIC8vLyBpc01lbUNweURzdCAtIFRoaXMgaXMgdHJ1ZSBpZiB0aGlzIGFnZ3JlZ2F0ZSBpcyBtZW1jcHknZCBpbnRvLgorICAgICAgYm9vbCBpc01lbUNweURzdCA6IDE7CisKKyAgICAgIEFsbG9jYUluZm8oKQorICAgICAgICA6IGlzVW5zYWZlKGZhbHNlKSwgaXNNZW1DcHlTcmMoZmFsc2UpLCBpc01lbUNweURzdChmYWxzZSkge30KKyAgICB9OworICAgIAorICAgIHVuc2lnbmVkIFNSVGhyZXNob2xkOworCisgICAgdm9pZCBNYXJrVW5zYWZlKEFsbG9jYUluZm8gJkkpIHsgSS5pc1Vuc2FmZSA9IHRydWU7IH0KKworICAgIGJvb2wgaXNTYWZlQWxsb2NhVG9TY2FsYXJSZXBsKEFsbG9jYUluc3QgKkFJKTsKKworICAgIHZvaWQgaXNTYWZlRm9yU2NhbGFyUmVwbChJbnN0cnVjdGlvbiAqSSwgQWxsb2NhSW5zdCAqQUksIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhSW5mbyAmSW5mbyk7CisgICAgdm9pZCBpc1NhZmVHRVAoR2V0RWxlbWVudFB0ckluc3QgKkdFUEksIEFsbG9jYUluc3QgKkFJLCB1aW50NjRfdCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIEFsbG9jYUluZm8gJkluZm8pOworICAgIHZvaWQgaXNTYWZlTWVtQWNjZXNzKEFsbG9jYUluc3QgKkFJLCB1aW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IE1lbVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqTWVtT3BUeXBlLCBib29sIGlzU3RvcmUsIEFsbG9jYUluZm8gJkluZm8pOworICAgIGJvb2wgVHlwZUhhc0NvbXBvbmVudChjb25zdCBUeXBlICpULCB1aW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IFNpemUpOworICAgIHVpbnQ2NF90IEZpbmRFbGVtZW50QW5kT2Zmc2V0KGNvbnN0IFR5cGUgKiZULCB1aW50NjRfdCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKiZJZHhUeSk7CisgICAgCisgICAgdm9pZCBEb1NjYWxhclJlcGxhY2VtZW50KEFsbG9jYUluc3QgKkFJLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QWxsb2NhSW5zdCo+ICZXb3JrTGlzdCk7CisgICAgdm9pZCBEZWxldGVEZWFkSW5zdHJ1Y3Rpb25zKCk7CisgICAgQWxsb2NhSW5zdCAqQWRkTmV3QWxsb2NhKEZ1bmN0aW9uICZGLCBjb25zdCBUeXBlICpUeSwgQWxsb2NhSW5zdCAqQmFzZSk7CisgICAgCisgICAgdm9pZCBSZXdyaXRlRm9yU2NhbGFyUmVwbChJbnN0cnVjdGlvbiAqSSwgQWxsb2NhSW5zdCAqQUksIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPEFsbG9jYUluc3QqLCAzMj4gJk5ld0VsdHMpOworICAgIHZvaWQgUmV3cml0ZUJpdENhc3QoQml0Q2FzdEluc3QgKkJDLCBBbGxvY2FJbnN0ICpBSSwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8QWxsb2NhSW5zdCosIDMyPiAmTmV3RWx0cyk7CisgICAgdm9pZCBSZXdyaXRlR0VQKEdldEVsZW1lbnRQdHJJbnN0ICpHRVBJLCBBbGxvY2FJbnN0ICpBSSwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxBbGxvY2FJbnN0KiwgMzI+ICZOZXdFbHRzKTsKKyAgICB2b2lkIFJld3JpdGVNZW1JbnRyaW5Vc2VyT2ZBbGxvY2EoTWVtSW50cmluc2ljICpNSSwgSW5zdHJ1Y3Rpb24gKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYUluc3QgKkFJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxBbGxvY2FJbnN0KiwgMzI+ICZOZXdFbHRzKTsKKyAgICB2b2lkIFJld3JpdGVTdG9yZVVzZXJPZldob2xlQWxsb2NhKFN0b3JlSW5zdCAqU0ksIEFsbG9jYUluc3QgKkFJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8QWxsb2NhSW5zdCosIDMyPiAmTmV3RWx0cyk7CisgICAgdm9pZCBSZXdyaXRlTG9hZFVzZXJPZldob2xlQWxsb2NhKExvYWRJbnN0ICpMSSwgQWxsb2NhSW5zdCAqQUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPEFsbG9jYUluc3QqLCAzMj4gJk5ld0VsdHMpOworICAgIAorICAgIHN0YXRpYyBNZW1UcmFuc2Zlckluc3QgKmlzT25seUNvcGllZEZyb21Db25zdGFudEdsb2JhbChBbGxvY2FJbnN0ICpBSSk7CisgIH07Cit9CisKK2NoYXIgU1JPQTo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKFNST0EsICJzY2FsYXJyZXBsIiwKKyAgICAgICAgICAgICAgICAiU2NhbGFyIFJlcGxhY2VtZW50IG9mIEFnZ3JlZ2F0ZXMiLCBmYWxzZSwgZmFsc2UpOworCisvLyBQdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBTY2FsYXJSZXBsQWdncmVnYXRlcyBwYXNzCitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZVNjYWxhclJlcGxBZ2dyZWdhdGVzUGFzcyhzaWduZWQgaW50IFRocmVzaG9sZCkgeyAKKyAgcmV0dXJuIG5ldyBTUk9BKFRocmVzaG9sZCk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbnZlcnQgVG8gU2NhbGFyIE9wdGltaXphdGlvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSB7CisvLy8gQ29udmVydFRvU2NhbGFySW5mbyAtIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgIkNvbnZlcnQgVG8gU2NhbGFyIgorLy8vIG9wdGltaXphdGlvbiwgd2hpY2ggc2NhbnMgdGhlIHVzZXMgb2YgYW4gYWxsb2NhIGFuZCBkZXRlcm1pbmVzIGlmIGl0IGNhbgorLy8vIHJld3JpdGUgaXQgaW4gdGVybXMgb2YgYSBzaW5nbGUgbmV3IGFsbG9jYSB0aGF0IGNhbiBiZSBtZW0ycmVnJ2QuCitjbGFzcyBDb252ZXJ0VG9TY2FsYXJJbmZvIHsKKyAgLy8vIEFsbG9jYVNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgYWxsb2NhIGJlaW5nIGNvbnNpZGVyZWQuCisgIHVuc2lnbmVkIEFsbG9jYVNpemU7CisgIGNvbnN0IFRhcmdldERhdGEgJlREOworIAorICAvLy8gSXNOb3RUcml2aWFsIC0gVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGVyZSBpcyBzb21lIGFjY2VzcyB0byB0aGUgb2JqZWN0CisgIC8vLyB3aGljaCBtZWFucyB0aGF0IG1lbTJyZWcgY2FuJ3QgcHJvbW90ZSBpdC4KKyAgYm9vbCBJc05vdFRyaXZpYWw7CisgIAorICAvLy8gVmVjdG9yVHkgLSBUaGlzIHRyYWNrcyB0aGUgdHlwZSB0aGF0IHdlIHNob3VsZCBwcm9tb3RlIHRoZSB2ZWN0b3IgdG8gaWYKKyAgLy8vIGl0IGlzIHBvc3NpYmxlIHRvIHR1cm4gaXQgaW50byBhIHZlY3Rvci4gIFRoaXMgc3RhcnRzIG91dCBudWxsLCBhbmQgaWYgaXQKKyAgLy8vIGlzbid0IHBvc3NpYmxlIHRvIHR1cm4gaW50byBhIHZlY3RvciB0eXBlLCBpdCBnZXRzIHNldCB0byBWb2lkVHkuCisgIGNvbnN0IFR5cGUgKlZlY3RvclR5OworICAKKyAgLy8vIEhhZEFWZWN0b3IgLSBUcnVlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB2ZWN0b3IgYWNjZXNzIHRvIHRoZSBhbGxvY2EuCisgIC8vLyBXZSBkb24ndCB3YW50IHRvIHR1cm4gcmFuZG9tIGFycmF5cyBpbnRvIHZlY3RvcnMgYW5kIHVzZSB2ZWN0b3IgZWxlbWVudAorICAvLy8gaW5zZXJ0L2V4dHJhY3QsIGJ1dCBpZiB0aGVyZSBhcmUgZWxlbWVudCBhY2Nlc3NlcyB0byBzb21ldGhpbmcgdGhhdCBpcworICAvLy8gYWxzbyBkZWNsYXJlZCBhcyBhIHZlY3Rvciwgd2UgZG8gd2FudCB0byBwcm9tb3RlIHRvIGEgdmVjdG9yLgorICBib29sIEhhZEFWZWN0b3I7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ29udmVydFRvU2NhbGFySW5mbyh1bnNpZ25lZCBTaXplLCBjb25zdCBUYXJnZXREYXRhICZ0ZCkKKyAgICA6IEFsbG9jYVNpemUoU2l6ZSksIFREKHRkKSB7CisgICAgSXNOb3RUcml2aWFsID0gZmFsc2U7CisgICAgVmVjdG9yVHkgPSAwOworICAgIEhhZEFWZWN0b3IgPSBmYWxzZTsKKyAgfQorICAKKyAgQWxsb2NhSW5zdCAqVHJ5Q29udmVydChBbGxvY2FJbnN0ICpBSSk7CisgIAorcHJpdmF0ZToKKyAgYm9vbCBDYW5Db252ZXJ0VG9TY2FsYXIoVmFsdWUgKlYsIHVpbnQ2NF90IE9mZnNldCk7CisgIHZvaWQgTWVyZ2VJblR5cGUoY29uc3QgVHlwZSAqSW4sIHVpbnQ2NF90IE9mZnNldCk7CisgIHZvaWQgQ29udmVydFVzZXNUb1NjYWxhcihWYWx1ZSAqUHRyLCBBbGxvY2FJbnN0ICpOZXdBSSwgdWludDY0X3QgT2Zmc2V0KTsKKyAgCisgIFZhbHVlICpDb252ZXJ0U2NhbGFyX0V4dHJhY3RWYWx1ZShWYWx1ZSAqTlYsIGNvbnN0IFR5cGUgKlRvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwgSVJCdWlsZGVyPD4gJkJ1aWxkZXIpOworICBWYWx1ZSAqQ29udmVydFNjYWxhcl9JbnNlcnRWYWx1ZShWYWx1ZSAqU3RvcmVkVmFsLCBWYWx1ZSAqRXhpc3RpbmdWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwgSVJCdWlsZGVyPD4gJkJ1aWxkZXIpOworfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKKy8vLyBUcnlDb252ZXJ0IC0gQW5hbHl6ZSB0aGUgc3BlY2lmaWVkIGFsbG9jYSwgYW5kIGlmIGl0IGlzIHNhZmUgdG8gZG8gc28sCisvLy8gcmV3cml0ZSBpdCB0byBiZSBhIG5ldyBhbGxvY2Egd2hpY2ggaXMgbWVtMnJlZydhYmxlLiAgVGhpcyByZXR1cm5zIHRoZSBuZXcKKy8vLyBhbGxvY2EgaWYgcG9zc2libGUgb3IgbnVsbCBpZiBub3QuCitBbGxvY2FJbnN0ICpDb252ZXJ0VG9TY2FsYXJJbmZvOjpUcnlDb252ZXJ0KEFsbG9jYUluc3QgKkFJKSB7CisgIC8vIElmIHdlIGNhbid0IGNvbnZlcnQgdGhpcyBzY2FsYXIsIG9yIGlmIG1lbTJyZWcgY2FuIHRyaXZpYWxseSBkbyBpdCwgYmFpbAorICAvLyBvdXQuCisgIGlmICghQ2FuQ29udmVydFRvU2NhbGFyKEFJLCAwKSB8fCAhSXNOb3RUcml2aWFsKQorICAgIHJldHVybiAwOworICAKKyAgLy8gSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYSB2ZWN0b3IgdHlwZSB0aGF0IGNhbiBoYW5kbGUgdGhpcyB3aXRoCisgIC8vIGluc2VydC9leHRyYWN0IGVsZW1lbnRzLCBhbmQgaWYgdGhlcmUgd2FzIGF0IGxlYXN0IG9uZSB1c2UgdGhhdCBoYWQKKyAgLy8gYSB2ZWN0b3IgdHlwZSwgcHJvbW90ZSB0aGlzIHRvIGEgdmVjdG9yLiAgV2UgZG9uJ3Qgd2FudCB0byBwcm9tb3RlCisgIC8vIHJhbmRvbSBzdHVmZiB0aGF0IGRvZXNuJ3QgdXNlIHZlY3RvcnMgKGUuZy4gPDkgeCBkb3VibGU+KSBiZWNhdXNlIHRoZW4KKyAgLy8gd2UganVzdCBnZXQgYSBsb3Qgb2YgaW5zZXJ0L2V4dHJhY3RzLiAgSWYgYXQgbGVhc3Qgb25lIHZlY3RvciBpcworICAvLyBpbnZvbHZlZCwgdGhlbiB3ZSBwcm9iYWJseSByZWFsbHkgZG8gaGF2ZSBhIHVuaW9uIG9mIHZlY3Rvci9hcnJheS4KKyAgY29uc3QgVHlwZSAqTmV3VHk7CisgIGlmIChWZWN0b3JUeSAmJiBWZWN0b3JUeS0+aXNWZWN0b3JUeSgpICYmIEhhZEFWZWN0b3IpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkNPTlZFUlQgVE8gVkVDVE9SOiAiIDw8ICpBSSA8PCAiXG4gIFRZUEUgPSAiCisgICAgICAgICAgPDwgKlZlY3RvclR5IDw8ICdcbicpOworICAgIE5ld1R5ID0gVmVjdG9yVHk7ICAvLyBVc2UgdGhlIHZlY3RvciB0eXBlLgorICB9IGVsc2UgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiQ09OVkVSVCBUTyBTQ0FMQVIgSU5URUdFUjogIiA8PCAqQUkgPDwgIlxuIik7CisgICAgLy8gQ3JlYXRlIGFuZCBpbnNlcnQgdGhlIGludGVnZXIgYWxsb2NhLgorICAgIE5ld1R5ID0gSW50ZWdlclR5cGU6OmdldChBSS0+Z2V0Q29udGV4dCgpLCBBbGxvY2FTaXplKjgpOworICB9CisgIEFsbG9jYUluc3QgKk5ld0FJID0gbmV3IEFsbG9jYUluc3QoTmV3VHksIDAsIEFJLT5nZXRQYXJlbnQoKS0+YmVnaW4oKSk7CisgIENvbnZlcnRVc2VzVG9TY2FsYXIoQUksIE5ld0FJLCAwKTsKKyAgcmV0dXJuIE5ld0FJOworfQorCisvLy8gTWVyZ2VJblR5cGUgLSBBZGQgdGhlICdJbicgdHlwZSB0byB0aGUgYWNjdW11bGF0ZWQgdmVjdG9yIHR5cGUgKFZlY3RvclR5KQorLy8vIHNvIGZhciBhdCB0aGUgb2Zmc2V0IHNwZWNpZmllZCBieSBPZmZzZXQgKHdoaWNoIGlzIHNwZWNpZmllZCBpbiBieXRlcykuCisvLy8KKy8vLyBUaGVyZSBhcmUgdHdvIGNhc2VzIHdlIGhhbmRsZSBoZXJlOgorLy8vICAgMSkgQSB1bmlvbiBvZiB2ZWN0b3IgdHlwZXMgb2YgdGhlIHNhbWUgc2l6ZSBhbmQgcG90ZW50aWFsbHkgaXRzIGVsZW1lbnRzLgorLy8vICAgICAgSGVyZSB3ZSB0dXJuIGVsZW1lbnQgYWNjZXNzZXMgaW50byBpbnNlcnQvZXh0cmFjdCBlbGVtZW50IG9wZXJhdGlvbnMuCisvLy8gICAgICBUaGlzIHByb21vdGVzIGEgPDQgeCBmbG9hdD4gd2l0aCBhIHN0b3JlIG9mIGZsb2F0IHRvIHRoZSB0aGlyZCBlbGVtZW50CisvLy8gICAgICBpbnRvIGEgPDQgeCBmbG9hdD4gdGhhdCB1c2VzIGluc2VydCBlbGVtZW50LgorLy8vICAgMikgQSBmdWxseSBnZW5lcmFsIGJsb2Igb2YgbWVtb3J5LCB3aGljaCB3ZSB0dXJuIGludG8gc29tZSAocG90ZW50aWFsbHkKKy8vLyAgICAgIGxhcmdlKSBpbnRlZ2VyIHR5cGUgd2l0aCBleHRyYWN0IGFuZCBpbnNlcnQgb3BlcmF0aW9ucyB3aGVyZSB0aGUgbG9hZHMKKy8vLyAgICAgIGFuZCBzdG9yZXMgd291bGQgbXV0YXRlIHRoZSBtZW1vcnkuICBXZSBtYXJrIHRoaXMgYnkgc2V0dGluZyBWZWN0b3JUeQorLy8vICAgICAgdG8gVm9pZFR5Lgordm9pZCBDb252ZXJ0VG9TY2FsYXJJbmZvOjpNZXJnZUluVHlwZShjb25zdCBUeXBlICpJbiwgdWludDY0X3QgT2Zmc2V0KSB7CisgIC8vIElmIHdlIGFscmVhZHkgZGVjaWRlZCB0byB0dXJuIHRoaXMgaW50byBhIGJsb2Igb2YgaW50ZWdlciBtZW1vcnksIHRoZXJlIGlzCisgIC8vIG5vdGhpbmcgdG8gYmUgZG9uZS4KKyAgaWYgKFZlY3RvclR5ICYmIFZlY3RvclR5LT5pc1ZvaWRUeSgpKQorICAgIHJldHVybjsKKyAgCisgIC8vIElmIHRoaXMgY291bGQgYmUgY29udHJpYnV0aW5nIHRvIGEgdmVjdG9yLCBhbmFseXplIGl0LgorCisgIC8vIElmIHRoZSBJbiB0eXBlIGlzIGEgdmVjdG9yIHRoYXQgaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgYWxsb2NhLCBzZWUgaWYgaXQKKyAgLy8gbWF0Y2hlcyB0aGUgZXhpc3RpbmcgVmVjVHkuCisgIGlmIChjb25zdCBWZWN0b3JUeXBlICpWSW5UeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KEluKSkgeworICAgIC8vIFJlbWVtYmVyIGlmIHdlIHNhdyBhIHZlY3RvciB0eXBlLgorICAgIEhhZEFWZWN0b3IgPSB0cnVlOworICAgIAorICAgIGlmIChWSW5UeS0+Z2V0Qml0V2lkdGgoKS84ID09IEFsbG9jYVNpemUgJiYgT2Zmc2V0ID09IDApIHsKKyAgICAgIC8vIElmIHdlJ3JlIHN0b3JpbmcvbG9hZGluZyBhIHZlY3RvciBvZiB0aGUgcmlnaHQgc2l6ZSwgYWxsb3cgaXQgYXMgYQorICAgICAgLy8gdmVjdG9yLiAgSWYgdGhpcyB0aGUgZmlyc3QgdmVjdG9yIHdlIHNlZSwgcmVtZW1iZXIgdGhlIHR5cGUgc28gdGhhdAorICAgICAgLy8gd2Uga25vdyB0aGUgZWxlbWVudCBzaXplLiAgSWYgdGhpcyBpcyBhIHN1YnNlcXVlbnQgYWNjZXNzLCBpZ25vcmUgaXQKKyAgICAgIC8vIGV2ZW4gaWYgaXQgaXMgYSBkaWZmZXJpbmcgdHlwZSBidXQgdGhlIHNhbWUgc2l6ZS4gIFdvcnN0IGNhc2Ugd2UgY2FuCisgICAgICAvLyBiaXRjYXN0IHRoZSByZXN1bHRhbnQgdmVjdG9ycy4KKyAgICAgIGlmIChWZWN0b3JUeSA9PSAwKQorICAgICAgICBWZWN0b3JUeSA9IFZJblR5OworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSBlbHNlIGlmIChJbi0+aXNGbG9hdFR5KCkgfHwgSW4tPmlzRG91YmxlVHkoKSB8fAorICAgICAgICAgICAgIChJbi0+aXNJbnRlZ2VyVHkoKSAmJiBJbi0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpID49IDggJiYKKyAgICAgICAgICAgICAgaXNQb3dlck9mMl8zMihJbi0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpKSkpIHsKKyAgICAvLyBJZiB3ZSdyZSBhY2Nlc3Npbmcgc29tZXRoaW5nIHRoYXQgY291bGQgYmUgYW4gZWxlbWVudCBvZiBhIHZlY3Rvciwgc2VlCisgICAgLy8gaWYgdGhlIGltcGxpZWQgdmVjdG9yIGFncmVlcyB3aXRoIHdoYXQgd2UgYWxyZWFkeSBoYXZlIGFuZCBpZiBPZmZzZXQgaXMKKyAgICAvLyBjb21wYXRpYmxlIHdpdGggaXQuCisgICAgdW5zaWduZWQgRWx0U2l6ZSA9IEluLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkvODsKKyAgICBpZiAoT2Zmc2V0ICUgRWx0U2l6ZSA9PSAwICYmIEFsbG9jYVNpemUgJSBFbHRTaXplID09IDAgJiYKKyAgICAgICAgKFZlY3RvclR5ID09IDAgfHwgCisgICAgICAgICBjYXN0PFZlY3RvclR5cGU+KFZlY3RvclR5KS0+Z2V0RWxlbWVudFR5cGUoKQorICAgICAgICAgICAgICAgLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkvOCA9PSBFbHRTaXplKSkgeworICAgICAgaWYgKFZlY3RvclR5ID09IDApCisgICAgICAgIFZlY3RvclR5ID0gVmVjdG9yVHlwZTo6Z2V0KEluLCBBbGxvY2FTaXplL0VsdFNpemUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgY2FzZSB0aGF0IHdlIGNhbid0IGhhbmRsZSB3aXRoIGFuIG9wdGltaXplZCB2ZWN0b3IKKyAgLy8gZm9ybS4gIFdlIGNhbiBzdGlsbCB0dXJuIHRoaXMgaW50byBhIGxhcmdlIGludGVnZXIuCisgIFZlY3RvclR5ID0gVHlwZTo6Z2V0Vm9pZFR5KEluLT5nZXRDb250ZXh0KCkpOworfQorCisvLy8gQ2FuQ29udmVydFRvU2NhbGFyIC0gViBpcyBhIHBvaW50ZXIuICBJZiB3ZSBjYW4gY29udmVydCB0aGUgcG9pbnRlZSBhbmQgYWxsCisvLy8gaXRzIGFjY2Vzc2VzIHRvIGEgc2luZ2xlIHZlY3RvciB0eXBlLCByZXR1cm4gdHJ1ZSBhbmQgc2V0IFZlY1R5IHRvCisvLy8gdGhlIG5ldyB0eXBlLiAgSWYgd2UgY291bGQgY29udmVydCB0aGUgYWxsb2NhIGludG8gYSBzaW5nbGUgcHJvbW90YWJsZQorLy8vIGludGVnZXIsIHJldHVybiB0cnVlIGJ1dCBzZXQgVmVjVHkgdG8gVm9pZFR5LiAgRnVydGhlciwgaWYgdGhlIHVzZSBpcyBub3QgYQorLy8vIGNvbXBsZXRlbHkgdHJpdmlhbCB1c2UgdGhhdCBtZW0ycmVnIGNvdWxkIHByb21vdGUsIHNldCBJc05vdFRyaXZpYWwuICBPZmZzZXQKKy8vLyBpcyB0aGUgY3VycmVudCBvZmZzZXQgZnJvbSB0aGUgYmFzZSBvZiB0aGUgYWxsb2NhIGJlaW5nIGFuYWx5emVkLgorLy8vCisvLy8gSWYgd2Ugc2VlIGF0IGxlYXN0IG9uZSBhY2Nlc3MgdG8gdGhlIHZhbHVlIHRoYXQgaXMgYXMgYSB2ZWN0b3IgdHlwZSwgc2V0IHRoZQorLy8vIFNhd1ZlYyBmbGFnLgorYm9vbCBDb252ZXJ0VG9TY2FsYXJJbmZvOjpDYW5Db252ZXJ0VG9TY2FsYXIoVmFsdWUgKlYsIHVpbnQ2NF90IE9mZnNldCkgeworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsgVUkhPUU7ICsrVUkpIHsKKyAgICBJbnN0cnVjdGlvbiAqVXNlciA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSk7CisgICAgCisgICAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihVc2VyKSkgeworICAgICAgLy8gRG9uJ3QgYnJlYWsgdm9sYXRpbGUgbG9hZHMuCisgICAgICBpZiAoTEktPmlzVm9sYXRpbGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgTWVyZ2VJblR5cGUoTEktPmdldFR5cGUoKSwgT2Zmc2V0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oVXNlcikpIHsKKyAgICAgIC8vIFN0b3JpbmcgdGhlIHBvaW50ZXIsIG5vdCBpbnRvIHRoZSB2YWx1ZT8KKyAgICAgIGlmIChTSS0+Z2V0T3BlcmFuZCgwKSA9PSBWIHx8IFNJLT5pc1ZvbGF0aWxlKCkpIHJldHVybiBmYWxzZTsKKyAgICAgIE1lcmdlSW5UeXBlKFNJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCksIE9mZnNldCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgaWYgKEJpdENhc3RJbnN0ICpCQ0kgPSBkeW5fY2FzdDxCaXRDYXN0SW5zdD4oVXNlcikpIHsKKyAgICAgIElzTm90VHJpdmlhbCA9IHRydWU7ICAvLyBDYW4ndCBiZSBtZW0ycmVnJ2QuCisgICAgICBpZiAoIUNhbkNvbnZlcnRUb1NjYWxhcihCQ0ksIE9mZnNldCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChHZXRFbGVtZW50UHRySW5zdCAqR0VQID0gZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KFVzZXIpKSB7CisgICAgICAvLyBJZiB0aGlzIGlzIGEgR0VQIHdpdGggYSB2YXJpYWJsZSBpbmRpY2VzLCB3ZSBjYW4ndCBoYW5kbGUgaXQuCisgICAgICBpZiAoIUdFUC0+aGFzQWxsQ29uc3RhbnRJbmRpY2VzKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIAorICAgICAgLy8gQ29tcHV0ZSB0aGUgb2Zmc2V0IHRoYXQgdGhpcyBHRVAgYWRkcyB0byB0aGUgcG9pbnRlci4KKyAgICAgIFNtYWxsVmVjdG9yPFZhbHVlKiwgOD4gSW5kaWNlcyhHRVAtPm9wX2JlZ2luKCkrMSwgR0VQLT5vcF9lbmQoKSk7CisgICAgICB1aW50NjRfdCBHRVBPZmZzZXQgPSBURC5nZXRJbmRleGVkT2Zmc2V0KEdFUC0+Z2V0UG9pbnRlck9wZXJhbmRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbmRpY2VzWzBdLCBJbmRpY2VzLnNpemUoKSk7CisgICAgICAvLyBTZWUgaWYgYWxsIHVzZXMgY2FuIGJlIGNvbnZlcnRlZC4KKyAgICAgIGlmICghQ2FuQ29udmVydFRvU2NhbGFyKEdFUCwgT2Zmc2V0K0dFUE9mZnNldCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIElzTm90VHJpdmlhbCA9IHRydWU7ICAvLyBDYW4ndCBiZSBtZW0ycmVnJ2QuCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGlzIGEgY29uc3RhbnQgc2l6ZWQgbWVtc2V0IG9mIGEgY29uc3RhbnQgdmFsdWUgKGUuZy4gMCkgd2UgY2FuCisgICAgLy8gaGFuZGxlIGl0LgorICAgIGlmIChNZW1TZXRJbnN0ICpNU0kgPSBkeW5fY2FzdDxNZW1TZXRJbnN0PihVc2VyKSkgeworICAgICAgLy8gU3RvcmUgb2YgY29uc3RhbnQgdmFsdWUgYW5kIGNvbnN0YW50IHNpemUuCisgICAgICBpZiAoIWlzYTxDb25zdGFudEludD4oTVNJLT5nZXRWYWx1ZSgpKSB8fAorICAgICAgICAgICFpc2E8Q29uc3RhbnRJbnQ+KE1TSS0+Z2V0TGVuZ3RoKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBJc05vdFRyaXZpYWwgPSB0cnVlOyAgLy8gQ2FuJ3QgYmUgbWVtMnJlZydkLgorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBpcyBhIG1lbWNweSBvciBtZW1tb3ZlIGludG8gb3Igb3V0IG9mIHRoZSB3aG9sZSBhbGxvY2F0aW9uLCB3ZQorICAgIC8vIGNhbiBoYW5kbGUgaXQgbGlrZSBhIGxvYWQgb3Igc3RvcmUgb2YgdGhlIHNjYWxhciB0eXBlLgorICAgIGlmIChNZW1UcmFuc2Zlckluc3QgKk1USSA9IGR5bl9jYXN0PE1lbVRyYW5zZmVySW5zdD4oVXNlcikpIHsKKyAgICAgIENvbnN0YW50SW50ICpMZW4gPSBkeW5fY2FzdDxDb25zdGFudEludD4oTVRJLT5nZXRMZW5ndGgoKSk7CisgICAgICBpZiAoTGVuID09IDAgfHwgTGVuLT5nZXRaRXh0VmFsdWUoKSAhPSBBbGxvY2FTaXplIHx8IE9mZnNldCAhPSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAKKyAgICAgIElzTm90VHJpdmlhbCA9IHRydWU7ICAvLyBDYW4ndCBiZSBtZW0ycmVnJ2QuCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMhCisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIENvbnZlcnRVc2VzVG9TY2FsYXIgLSBDb252ZXJ0IGFsbCBvZiB0aGUgdXNlcnMgb2YgUHRyIHRvIHVzZSB0aGUgbmV3IGFsbG9jYQorLy8vIGRpcmVjdGx5LiAgVGhpcyBoYXBwZW5zIHdoZW4gd2UgYXJlIGNvbnZlcnRpbmcgYW4gImludGVnZXIgdW5pb24iIHRvIGEKKy8vLyBzaW5nbGUgaW50ZWdlciBzY2FsYXIsIG9yIHdoZW4gd2UgYXJlIGNvbnZlcnRpbmcgYSAidmVjdG9yIHVuaW9uIiB0byBhCisvLy8gdmVjdG9yIHdpdGggaW5zZXJ0L2V4dHJhY3RlbGVtZW50IGluc3RydWN0aW9ucy4KKy8vLworLy8vIE9mZnNldCBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgb3JpZ2luYWwgYWxsb2NhLCBpbiBiaXRzIHRoYXQgbmVlZCB0byBiZQorLy8vIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0LiAgQnkgdGhlIGVuZCBvZiB0aGlzLCB0aGVyZSBzaG91bGQgYmUgbm8gdXNlcyBvZiBQdHIuCit2b2lkIENvbnZlcnRUb1NjYWxhckluZm86OkNvbnZlcnRVc2VzVG9TY2FsYXIoVmFsdWUgKlB0ciwgQWxsb2NhSW5zdCAqTmV3QUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0KSB7CisgIHdoaWxlICghUHRyLT51c2VfZW1wdHkoKSkgeworICAgIEluc3RydWN0aW9uICpVc2VyID0gY2FzdDxJbnN0cnVjdGlvbj4oUHRyLT51c2VfYmFjaygpKTsKKworICAgIGlmIChCaXRDYXN0SW5zdCAqQ0kgPSBkeW5fY2FzdDxCaXRDYXN0SW5zdD4oVXNlcikpIHsKKyAgICAgIENvbnZlcnRVc2VzVG9TY2FsYXIoQ0ksIE5ld0FJLCBPZmZzZXQpOworICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVXNlcikpIHsKKyAgICAgIC8vIENvbXB1dGUgdGhlIG9mZnNldCB0aGF0IHRoaXMgR0VQIGFkZHMgdG8gdGhlIHBvaW50ZXIuCisgICAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IEluZGljZXMoR0VQLT5vcF9iZWdpbigpKzEsIEdFUC0+b3BfZW5kKCkpOworICAgICAgdWludDY0X3QgR0VQT2Zmc2V0ID0gVEQuZ2V0SW5kZXhlZE9mZnNldChHRVAtPmdldFBvaW50ZXJPcGVyYW5kVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5kaWNlc1swXSwgSW5kaWNlcy5zaXplKCkpOworICAgICAgQ29udmVydFVzZXNUb1NjYWxhcihHRVAsIE5ld0FJLCBPZmZzZXQrR0VQT2Zmc2V0KjgpOworICAgICAgR0VQLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBJUkJ1aWxkZXI8PiBCdWlsZGVyKFVzZXItPmdldFBhcmVudCgpLCBVc2VyKTsKKyAgICAKKyAgICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFVzZXIpKSB7CisgICAgICAvLyBUaGUgbG9hZCBpcyBhIGJpdCBleHRyYWN0IGZyb20gTmV3QUkgc2hpZnRlZCByaWdodCBieSBPZmZzZXQgYml0cy4KKyAgICAgIFZhbHVlICpMb2FkZWRWYWwgPSBCdWlsZGVyLkNyZWF0ZUxvYWQoTmV3QUkpOworICAgICAgVmFsdWUgKk5ld0xvYWRWYWwKKyAgICAgICAgPSBDb252ZXJ0U2NhbGFyX0V4dHJhY3RWYWx1ZShMb2FkZWRWYWwsIExJLT5nZXRUeXBlKCksIE9mZnNldCwgQnVpbGRlcik7CisgICAgICBMSS0+cmVwbGFjZUFsbFVzZXNXaXRoKE5ld0xvYWRWYWwpOworICAgICAgTEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIGlmIChTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihVc2VyKSkgeworICAgICAgYXNzZXJ0KFNJLT5nZXRPcGVyYW5kKDApICE9IFB0ciAmJiAiQ29uc2lzdGVuY3kgZXJyb3IhIik7CisgICAgICBJbnN0cnVjdGlvbiAqT2xkID0gQnVpbGRlci5DcmVhdGVMb2FkKE5ld0FJKTsKKyAgICAgIFZhbHVlICpOZXcgPSBDb252ZXJ0U2NhbGFyX0luc2VydFZhbHVlKFNJLT5nZXRPcGVyYW5kKDApLCBPbGQsIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIpOworICAgICAgQnVpbGRlci5DcmVhdGVTdG9yZShOZXcsIE5ld0FJKTsKKyAgICAgIFNJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIGxvYWQgd2UganVzdCBpbnNlcnRlZCBpcyBub3cgZGVhZCwgdGhlbiB0aGUgaW5zZXJ0ZWQgc3RvcmUKKyAgICAgIC8vIG92ZXJ3cm90ZSB0aGUgZW50aXJlIHRoaW5nLgorICAgICAgaWYgKE9sZC0+dXNlX2VtcHR5KCkpCisgICAgICAgIE9sZC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gSWYgdGhpcyBpcyBhIGNvbnN0YW50IHNpemVkIG1lbXNldCBvZiBhIGNvbnN0YW50IHZhbHVlIChlLmcuIDApIHdlIGNhbgorICAgIC8vIHRyYW5zZm9ybSBpdCBpbnRvIGEgc3RvcmUgb2YgdGhlIGV4cGFuZGVkIGNvbnN0YW50IHZhbHVlLgorICAgIGlmIChNZW1TZXRJbnN0ICpNU0kgPSBkeW5fY2FzdDxNZW1TZXRJbnN0PihVc2VyKSkgeworICAgICAgYXNzZXJ0KE1TSS0+Z2V0UmF3RGVzdCgpID09IFB0ciAmJiAiQ29uc2lzdGVuY3kgZXJyb3IhIik7CisgICAgICB1bnNpZ25lZCBOdW1CeXRlcyA9IGNhc3Q8Q29uc3RhbnRJbnQ+KE1TSS0+Z2V0TGVuZ3RoKCkpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIGlmIChOdW1CeXRlcyAhPSAwKSB7CisgICAgICAgIHVuc2lnbmVkIFZhbCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KE1TSS0+Z2V0VmFsdWUoKSktPmdldFpFeHRWYWx1ZSgpOworICAgICAgICAKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgdmFsdWUgcmVwbGljYXRlZCB0aGUgcmlnaHQgbnVtYmVyIG9mIHRpbWVzLgorICAgICAgICBBUEludCBBUFZhbChOdW1CeXRlcyo4LCBWYWwpOworCisgICAgICAgIC8vIFNwbGF0IHRoZSB2YWx1ZSBpZiBub24temVyby4KKyAgICAgICAgaWYgKFZhbCkKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IE51bUJ5dGVzOyArK2kpCisgICAgICAgICAgICBBUFZhbCB8PSBBUFZhbCA8PCA4OworICAgICAgICAKKyAgICAgICAgSW5zdHJ1Y3Rpb24gKk9sZCA9IEJ1aWxkZXIuQ3JlYXRlTG9hZChOZXdBSSk7CisgICAgICAgIFZhbHVlICpOZXcgPSBDb252ZXJ0U2NhbGFyX0luc2VydFZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChVc2VyLT5nZXRDb250ZXh0KCksIEFQVmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkLCBPZmZzZXQsIEJ1aWxkZXIpOworICAgICAgICBCdWlsZGVyLkNyZWF0ZVN0b3JlKE5ldywgTmV3QUkpOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIGxvYWQgd2UganVzdCBpbnNlcnRlZCBpcyBub3cgZGVhZCwgdGhlbiB0aGUgbWVtc2V0IG92ZXJ3cm90ZQorICAgICAgICAvLyB0aGUgZW50aXJlIHRoaW5nLgorICAgICAgICBpZiAoT2xkLT51c2VfZW1wdHkoKSkKKyAgICAgICAgICBPbGQtPmVyYXNlRnJvbVBhcmVudCgpOyAgICAgICAgCisgICAgICB9CisgICAgICBNU0ktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBpcyBhIG1lbWNweSBvciBtZW1tb3ZlIGludG8gb3Igb3V0IG9mIHRoZSB3aG9sZSBhbGxvY2F0aW9uLCB3ZQorICAgIC8vIGNhbiBoYW5kbGUgaXQgbGlrZSBhIGxvYWQgb3Igc3RvcmUgb2YgdGhlIHNjYWxhciB0eXBlLgorICAgIGlmIChNZW1UcmFuc2Zlckluc3QgKk1USSA9IGR5bl9jYXN0PE1lbVRyYW5zZmVySW5zdD4oVXNlcikpIHsKKyAgICAgIGFzc2VydChPZmZzZXQgPT0gMCAmJiAibXVzdCBiZSBzdG9yZSB0byBzdGFydCBvZiBhbGxvY2EiKTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGJvdGggdG8gdGhlIHNhbWUgYWxsb2NhLCB0aGVuIHRoaXMgaXMKKyAgICAgIC8vIGEgbm9vcCBjb3B5LXRvLXNlbGYsIGp1c3QgZGVsZXRlIGl0LiAgT3RoZXJ3aXNlLCBlbWl0IGEgbG9hZCBhbmQgc3RvcmUKKyAgICAgIC8vIGFzIGFwcHJvcHJpYXRlLgorICAgICAgQWxsb2NhSW5zdCAqT3JpZ0FJID0gY2FzdDxBbGxvY2FJbnN0PihQdHItPmdldFVuZGVybHlpbmdPYmplY3QoMCkpOworICAgICAgCisgICAgICBpZiAoTVRJLT5nZXRTb3VyY2UoKS0+Z2V0VW5kZXJseWluZ09iamVjdCgwKSAhPSBPcmlnQUkpIHsKKyAgICAgICAgLy8gRGVzdCBtdXN0IGJlIE9yaWdBSSwgY2hhbmdlIHRoaXMgdG8gYmUgYSBsb2FkIGZyb20gdGhlIG9yaWdpbmFsCisgICAgICAgIC8vIHBvaW50ZXIgKGJpdGNhc3RlZCksIHRoZW4gYSBzdG9yZSB0byBvdXIgbmV3IGFsbG9jYS4KKyAgICAgICAgYXNzZXJ0KE1USS0+Z2V0UmF3RGVzdCgpID09IFB0ciAmJiAiTmVpdGhlciB1c2UgaXMgb2YgcG9pbnRlcj8iKTsKKyAgICAgICAgVmFsdWUgKlNyY1B0ciA9IE1USS0+Z2V0U291cmNlKCk7CisgICAgICAgIFNyY1B0ciA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChTcmNQdHIsIE5ld0FJLT5nZXRUeXBlKCkpOworICAgICAgICAKKyAgICAgICAgTG9hZEluc3QgKlNyY1ZhbCA9IEJ1aWxkZXIuQ3JlYXRlTG9hZChTcmNQdHIsICJzcmN2YWwiKTsKKyAgICAgICAgU3JjVmFsLT5zZXRBbGlnbm1lbnQoTVRJLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgICAgIEJ1aWxkZXIuQ3JlYXRlU3RvcmUoU3JjVmFsLCBOZXdBSSk7CisgICAgICB9IGVsc2UgaWYgKE1USS0+Z2V0RGVzdCgpLT5nZXRVbmRlcmx5aW5nT2JqZWN0KDApICE9IE9yaWdBSSkgeworICAgICAgICAvLyBTcmMgbXVzdCBiZSBPcmlnQUksIGNoYW5nZSB0aGlzIHRvIGJlIGEgbG9hZCBmcm9tIE5ld0FJIHRoZW4gYSBzdG9yZQorICAgICAgICAvLyB0aHJvdWdoIHRoZSBvcmlnaW5hbCBkZXN0IHBvaW50ZXIgKGJpdGNhc3RlZCkuCisgICAgICAgIGFzc2VydChNVEktPmdldFJhd1NvdXJjZSgpID09IFB0ciAmJiAiTmVpdGhlciB1c2UgaXMgb2YgcG9pbnRlcj8iKTsKKyAgICAgICAgTG9hZEluc3QgKlNyY1ZhbCA9IEJ1aWxkZXIuQ3JlYXRlTG9hZChOZXdBSSwgInNyY3ZhbCIpOworCisgICAgICAgIFZhbHVlICpEc3RQdHIgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoTVRJLT5nZXREZXN0KCksIE5ld0FJLT5nZXRUeXBlKCkpOworICAgICAgICBTdG9yZUluc3QgKk5ld1N0b3JlID0gQnVpbGRlci5DcmVhdGVTdG9yZShTcmNWYWwsIERzdFB0cik7CisgICAgICAgIE5ld1N0b3JlLT5zZXRBbGlnbm1lbnQoTVRJLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBOb29wIHRyYW5zZmVyLiBTcmMgPT0gRHN0CisgICAgICB9CisKKyAgICAgIE1USS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uISIpOworICB9Cit9CisKKy8vLyBDb252ZXJ0U2NhbGFyX0V4dHJhY3RWYWx1ZSAtIEV4dHJhY3QgYSB2YWx1ZSBvZiB0eXBlIFRvVHlwZSBmcm9tIGFuIGludGVnZXIKKy8vLyBvciB2ZWN0b3IgdmFsdWUgRnJvbVZhbCwgZXh0cmFjdGluZyB0aGUgYml0cyBmcm9tIHRoZSBvZmZzZXQgc3BlY2lmaWVkIGJ5CisvLy8gT2Zmc2V0LiAgVGhpcyByZXR1cm5zIHRoZSB2YWx1ZSwgd2hpY2ggaXMgb2YgdHlwZSBUb1R5cGUuCisvLy8KKy8vLyBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBhcmUgY29udmVydGluZyBhbiAiaW50ZWdlciB1bmlvbiIgdG8gYSBzaW5nbGUKKy8vLyBpbnRlZ2VyIHNjYWxhciwgb3Igd2hlbiB3ZSBhcmUgY29udmVydGluZyBhICJ2ZWN0b3IgdW5pb24iIHRvIGEgdmVjdG9yIHdpdGgKKy8vLyBpbnNlcnQvZXh0cmFjdGVsZW1lbnQgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gT2Zmc2V0IGlzIGFuIG9mZnNldCBmcm9tIHRoZSBvcmlnaW5hbCBhbGxvY2EsIGluIGJpdHMgdGhhdCBuZWVkIHRvIGJlCisvLy8gc2hpZnRlZCB0byB0aGUgcmlnaHQuCitWYWx1ZSAqQ29udmVydFRvU2NhbGFySW5mbzo6CitDb252ZXJ0U2NhbGFyX0V4dHJhY3RWYWx1ZShWYWx1ZSAqRnJvbVZhbCwgY29uc3QgVHlwZSAqVG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LCBJUkJ1aWxkZXI8PiAmQnVpbGRlcikgeworICAvLyBJZiB0aGUgbG9hZCBpcyBvZiB0aGUgd2hvbGUgbmV3IGFsbG9jYSwgbm8gY29udmVyc2lvbiBpcyBuZWVkZWQuCisgIGlmIChGcm9tVmFsLT5nZXRUeXBlKCkgPT0gVG9UeXBlICYmIE9mZnNldCA9PSAwKQorICAgIHJldHVybiBGcm9tVmFsOworCisgIC8vIElmIHRoZSByZXN1bHQgYWxsb2NhIGlzIGEgdmVjdG9yIHR5cGUsIHRoaXMgaXMgZWl0aGVyIGFuIGVsZW1lbnQKKyAgLy8gYWNjZXNzIG9yIGEgYml0Y2FzdCB0byBhbm90aGVyIHZlY3RvciB0eXBlIG9mIHRoZSBzYW1lIHNpemUuCisgIGlmIChjb25zdCBWZWN0b3JUeXBlICpWVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihGcm9tVmFsLT5nZXRUeXBlKCkpKSB7CisgICAgaWYgKFRvVHlwZS0+aXNWZWN0b3JUeSgpKQorICAgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChGcm9tVmFsLCBUb1R5cGUpOworCisgICAgLy8gT3RoZXJ3aXNlIGl0IG11c3QgYmUgYW4gZWxlbWVudCBhY2Nlc3MuCisgICAgdW5zaWduZWQgRWx0ID0gMDsKKyAgICBpZiAoT2Zmc2V0KSB7CisgICAgICB1bnNpZ25lZCBFbHRTaXplID0gVEQuZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyhWVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgRWx0ID0gT2Zmc2V0L0VsdFNpemU7CisgICAgICBhc3NlcnQoRWx0U2l6ZSpFbHQgPT0gT2Zmc2V0ICYmICJJbnZhbGlkIG1vZHVsdXMgaW4gdmFsaWRpdHkgY2hlY2tpbmciKTsKKyAgICB9CisgICAgLy8gUmV0dXJuIHRoZSBlbGVtZW50IGV4dHJhY3RlZCBvdXQgb2YgaXQuCisgICAgVmFsdWUgKlYgPSBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KEZyb21WYWwsIENvbnN0YW50SW50OjpnZXQoCisgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDMyVHkoRnJvbVZhbC0+Z2V0Q29udGV4dCgpKSwgRWx0KSk7CisgICAgaWYgKFYtPmdldFR5cGUoKSAhPSBUb1R5cGUpCisgICAgICBWID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KFYsIFRvVHlwZSk7CisgICAgcmV0dXJuIFY7CisgIH0KKyAgCisgIC8vIElmIFRvVHlwZSBpcyBhIGZpcnN0IGNsYXNzIGFnZ3JlZ2F0ZSwgZXh0cmFjdCBvdXQgZWFjaCBvZiB0aGUgcGllY2VzIGFuZAorICAvLyB1c2UgaW5zZXJ0dmFsdWUncyB0byBmb3JtIHRoZSBGQ0EuCisgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVCA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFRvVHlwZSkpIHsKKyAgICBjb25zdCBTdHJ1Y3RMYXlvdXQgJkxheW91dCA9ICpURC5nZXRTdHJ1Y3RMYXlvdXQoU1QpOworICAgIFZhbHVlICpSZXMgPSBVbmRlZlZhbHVlOjpnZXQoU1QpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVC0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFZhbHVlICpFbHQgPSBDb252ZXJ0U2NhbGFyX0V4dHJhY3RWYWx1ZShGcm9tVmFsLCBTVC0+Z2V0RWxlbWVudFR5cGUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0K0xheW91dC5nZXRFbGVtZW50T2Zmc2V0SW5CaXRzKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIpOworICAgICAgUmVzID0gQnVpbGRlci5DcmVhdGVJbnNlcnRWYWx1ZShSZXMsIEVsdCwgaSk7CisgICAgfQorICAgIHJldHVybiBSZXM7CisgIH0KKyAgCisgIGlmIChjb25zdCBBcnJheVR5cGUgKkFUID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihUb1R5cGUpKSB7CisgICAgdWludDY0X3QgRWx0U2l6ZSA9IFRELmdldFR5cGVBbGxvY1NpemVJbkJpdHMoQVQtPmdldEVsZW1lbnRUeXBlKCkpOworICAgIFZhbHVlICpSZXMgPSBVbmRlZlZhbHVlOjpnZXQoQVQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBVC0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFZhbHVlICpFbHQgPSBDb252ZXJ0U2NhbGFyX0V4dHJhY3RWYWx1ZShGcm9tVmFsLCBBVC0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQraSpFbHRTaXplLCBCdWlsZGVyKTsKKyAgICAgIFJlcyA9IEJ1aWxkZXIuQ3JlYXRlSW5zZXJ0VmFsdWUoUmVzLCBFbHQsIGkpOworICAgIH0KKyAgICByZXR1cm4gUmVzOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIG11c3QgYmUgYSB1bmlvbiB0aGF0IHdhcyBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciB2YWx1ZS4KKyAgY29uc3QgSW50ZWdlclR5cGUgKk5UeSA9IGNhc3Q8SW50ZWdlclR5cGU+KEZyb21WYWwtPmdldFR5cGUoKSk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIGJpZy1lbmRpYW4gc3lzdGVtIGFuZCB0aGUgbG9hZCBpcyBuYXJyb3dlciB0aGFuIHRoZQorICAvLyBmdWxsIGFsbG9jYSB0eXBlLCB3ZSBuZWVkIHRvIGRvIGEgc2hpZnQgdG8gZ2V0IHRoZSByaWdodCBiaXRzLgorICBpbnQgU2hBbXQgPSAwOworICBpZiAoVEQuaXNCaWdFbmRpYW4oKSkgeworICAgIC8vIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHRoZSBsb3dlc3QgYml0IGlzIHN0b3JlZCBhdCB0aGUgYml0IG9mZnNldAorICAgIC8vIGZyb20gdGhlIHBvaW50ZXIgZ2l2ZW4gYnkgZ2V0VHlwZVN0b3JlU2l6ZUluQml0cy4gIFRoaXMgbWF0dGVycyBmb3IKKyAgICAvLyBpbnRlZ2VycyB3aXRoIGEgYml0d2lkdGggdGhhdCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgorICAgIFNoQW10ID0gVEQuZ2V0VHlwZVN0b3JlU2l6ZUluQml0cyhOVHkpIC0KKyAgICAgICAgICAgIFRELmdldFR5cGVTdG9yZVNpemVJbkJpdHMoVG9UeXBlKSAtIE9mZnNldDsKKyAgfSBlbHNlIHsKKyAgICBTaEFtdCA9IE9mZnNldDsKKyAgfQorCisgIC8vIE5vdGU6IHdlIHN1cHBvcnQgbmVnYXRpdmUgYml0d2lkdGhzICh3aXRoIHNobCkgd2hpY2ggYXJlIG5vdCBkZWZpbmVkLgorICAvLyBXZSBkbyB0aGlzIHRvIHN1cHBvcnQgKGYuZS4pIGxvYWRzIG9mZiB0aGUgZW5kIG9mIGEgc3RydWN0dXJlIHdoZXJlCisgIC8vIG9ubHkgc29tZSBiaXRzIGFyZSB1c2VkLgorICBpZiAoU2hBbXQgPiAwICYmICh1bnNpZ25lZClTaEFtdCA8IE5UeS0+Z2V0Qml0V2lkdGgoKSkKKyAgICBGcm9tVmFsID0gQnVpbGRlci5DcmVhdGVMU2hyKEZyb21WYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEZyb21WYWwtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hBbXQpKTsKKyAgZWxzZSBpZiAoU2hBbXQgPCAwICYmICh1bnNpZ25lZCktU2hBbXQgPCBOVHktPmdldEJpdFdpZHRoKCkpCisgICAgRnJvbVZhbCA9IEJ1aWxkZXIuQ3JlYXRlU2hsKEZyb21WYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEZyb21WYWwtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtU2hBbXQpKTsKKworICAvLyBGaW5hbGx5LCB1bmNvbmRpdGlvbmFsbHkgdHJ1bmNhdGUgdGhlIGludGVnZXIgdG8gdGhlIHJpZ2h0IHdpZHRoLgorICB1bnNpZ25lZCBMSUJpdFdpZHRoID0gVEQuZ2V0VHlwZVNpemVJbkJpdHMoVG9UeXBlKTsKKyAgaWYgKExJQml0V2lkdGggPCBOVHktPmdldEJpdFdpZHRoKCkpCisgICAgRnJvbVZhbCA9CisgICAgICBCdWlsZGVyLkNyZWF0ZVRydW5jKEZyb21WYWwsIEludGVnZXJUeXBlOjpnZXQoRnJvbVZhbC0+Z2V0Q29udGV4dCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJpdFdpZHRoKSk7CisgIGVsc2UgaWYgKExJQml0V2lkdGggPiBOVHktPmdldEJpdFdpZHRoKCkpCisgICAgRnJvbVZhbCA9CisgICAgICAgQnVpbGRlci5DcmVhdGVaRXh0KEZyb21WYWwsIEludGVnZXJUeXBlOjpnZXQoRnJvbVZhbC0+Z2V0Q29udGV4dCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJpdFdpZHRoKSk7CisKKyAgLy8gSWYgdGhlIHJlc3VsdCBpcyBhbiBpbnRlZ2VyLCB0aGlzIGlzIGEgdHJ1bmMgb3IgYml0Y2FzdC4KKyAgaWYgKFRvVHlwZS0+aXNJbnRlZ2VyVHkoKSkgeworICAgIC8vIFNob3VsZCBiZSBkb25lLgorICB9IGVsc2UgaWYgKFRvVHlwZS0+aXNGbG9hdGluZ1BvaW50VHkoKSB8fCBUb1R5cGUtPmlzVmVjdG9yVHkoKSkgeworICAgIC8vIEp1c3QgZG8gYSBiaXRjYXN0LCB3ZSBrbm93IHRoZSBzaXplcyBtYXRjaCB1cC4KKyAgICBGcm9tVmFsID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KEZyb21WYWwsIFRvVHlwZSk7CisgIH0gZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlIG11c3QgYmUgYSBwb2ludGVyLgorICAgIEZyb21WYWwgPSBCdWlsZGVyLkNyZWF0ZUludFRvUHRyKEZyb21WYWwsIFRvVHlwZSk7CisgIH0KKyAgYXNzZXJ0KEZyb21WYWwtPmdldFR5cGUoKSA9PSBUb1R5cGUgJiYgIkRpZG4ndCBjb252ZXJ0IHJpZ2h0PyIpOworICByZXR1cm4gRnJvbVZhbDsKK30KKworLy8vIENvbnZlcnRTY2FsYXJfSW5zZXJ0VmFsdWUgLSBJbnNlcnQgdGhlIHZhbHVlICJTViIgaW50byB0aGUgZXhpc3RpbmcgaW50ZWdlcgorLy8vIG9yIHZlY3RvciB2YWx1ZSAiT2xkIiBhdCB0aGUgb2Zmc2V0IHNwZWNpZmllZCBieSBPZmZzZXQuCisvLy8KKy8vLyBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBhcmUgY29udmVydGluZyBhbiAiaW50ZWdlciB1bmlvbiIgdG8gYQorLy8vIHNpbmdsZSBpbnRlZ2VyIHNjYWxhciwgb3Igd2hlbiB3ZSBhcmUgY29udmVydGluZyBhICJ2ZWN0b3IgdW5pb24iIHRvIGEKKy8vLyB2ZWN0b3Igd2l0aCBpbnNlcnQvZXh0cmFjdGVsZW1lbnQgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gT2Zmc2V0IGlzIGFuIG9mZnNldCBmcm9tIHRoZSBvcmlnaW5hbCBhbGxvY2EsIGluIGJpdHMgdGhhdCBuZWVkIHRvIGJlCisvLy8gc2hpZnRlZCB0byB0aGUgcmlnaHQuCitWYWx1ZSAqQ29udmVydFRvU2NhbGFySW5mbzo6CitDb252ZXJ0U2NhbGFyX0luc2VydFZhbHVlKFZhbHVlICpTViwgVmFsdWUgKk9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LCBJUkJ1aWxkZXI8PiAmQnVpbGRlcikgeworICAvLyBDb252ZXJ0IHRoZSBzdG9yZWQgdHlwZSB0byB0aGUgYWN0dWFsIHR5cGUsIHNoaWZ0IGl0IGxlZnQgdG8gaW5zZXJ0CisgIC8vIHRoZW4gJ29yJyBpbnRvIHBsYWNlLgorICBjb25zdCBUeXBlICpBbGxvY2FUeXBlID0gT2xkLT5nZXRUeXBlKCk7CisgIExMVk1Db250ZXh0ICZDb250ZXh0ID0gT2xkLT5nZXRDb250ZXh0KCk7CisKKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KEFsbG9jYVR5cGUpKSB7CisgICAgdWludDY0X3QgVmVjU2l6ZSA9IFRELmdldFR5cGVBbGxvY1NpemVJbkJpdHMoVlR5KTsKKyAgICB1aW50NjRfdCBWYWxTaXplID0gVEQuZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyhTVi0+Z2V0VHlwZSgpKTsKKyAgICAKKyAgICAvLyBDaGFuZ2luZyB0aGUgd2hvbGUgdmVjdG9yIHdpdGggbWVtc2V0IG9yIHdpdGggYW4gYWNjZXNzIG9mIGEgZGlmZmVyZW50CisgICAgLy8gdmVjdG9yIHR5cGU/CisgICAgaWYgKFZhbFNpemUgPT0gVmVjU2l6ZSkKKyAgICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoU1YsIEFsbG9jYVR5cGUpOworCisgICAgdWludDY0X3QgRWx0U2l6ZSA9IFRELmdldFR5cGVBbGxvY1NpemVJbkJpdHMoVlR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKworICAgIC8vIE11c3QgYmUgYW4gZWxlbWVudCBpbnNlcnRpb24uCisgICAgdW5zaWduZWQgRWx0ID0gT2Zmc2V0L0VsdFNpemU7CisgICAgCisgICAgaWYgKFNWLT5nZXRUeXBlKCkgIT0gVlR5LT5nZXRFbGVtZW50VHlwZSgpKQorICAgICAgU1YgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoU1YsIFZUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgCisgICAgU1YgPSBCdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoT2xkLCBTViwgCisgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoU1YtPmdldENvbnRleHQoKSksIEVsdCkpOworICAgIHJldHVybiBTVjsKKyAgfQorICAKKyAgLy8gSWYgU1YgaXMgYSBmaXJzdC1jbGFzcyBhZ2dyZWdhdGUgdmFsdWUsIGluc2VydCBlYWNoIHZhbHVlIHJlY3Vyc2l2ZWx5LgorICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1QgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihTVi0+Z2V0VHlwZSgpKSkgeworICAgIGNvbnN0IFN0cnVjdExheW91dCAmTGF5b3V0ID0gKlRELmdldFN0cnVjdExheW91dChTVCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNULT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgVmFsdWUgKkVsdCA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKFNWLCBpKTsKKyAgICAgIE9sZCA9IENvbnZlcnRTY2FsYXJfSW5zZXJ0VmFsdWUoRWx0LCBPbGQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQrTGF5b3V0LmdldEVsZW1lbnRPZmZzZXRJbkJpdHMoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIpOworICAgIH0KKyAgICByZXR1cm4gT2xkOworICB9CisgIAorICBpZiAoY29uc3QgQXJyYXlUeXBlICpBVCA9IGR5bl9jYXN0PEFycmF5VHlwZT4oU1YtPmdldFR5cGUoKSkpIHsKKyAgICB1aW50NjRfdCBFbHRTaXplID0gVEQuZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyhBVC0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFULT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgVmFsdWUgKkVsdCA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKFNWLCBpKTsKKyAgICAgIE9sZCA9IENvbnZlcnRTY2FsYXJfSW5zZXJ0VmFsdWUoRWx0LCBPbGQsIE9mZnNldCtpKkVsdFNpemUsIEJ1aWxkZXIpOworICAgIH0KKyAgICByZXR1cm4gT2xkOworICB9CisKKyAgLy8gSWYgU1YgaXMgYSBmbG9hdCwgY29udmVydCBpdCB0byB0aGUgYXBwcm9wcmlhdGUgaW50ZWdlciB0eXBlLgorICAvLyBJZiBpdCBpcyBhIHBvaW50ZXIsIGRvIHRoZSBzYW1lLgorICB1bnNpZ25lZCBTcmNXaWR0aCA9IFRELmdldFR5cGVTaXplSW5CaXRzKFNWLT5nZXRUeXBlKCkpOworICB1bnNpZ25lZCBEZXN0V2lkdGggPSBURC5nZXRUeXBlU2l6ZUluQml0cyhBbGxvY2FUeXBlKTsKKyAgdW5zaWduZWQgU3JjU3RvcmVXaWR0aCA9IFRELmdldFR5cGVTdG9yZVNpemVJbkJpdHMoU1YtPmdldFR5cGUoKSk7CisgIHVuc2lnbmVkIERlc3RTdG9yZVdpZHRoID0gVEQuZ2V0VHlwZVN0b3JlU2l6ZUluQml0cyhBbGxvY2FUeXBlKTsKKyAgaWYgKFNWLT5nZXRUeXBlKCktPmlzRmxvYXRpbmdQb2ludFR5KCkgfHwgU1YtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKQorICAgIFNWID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KFNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXJUeXBlOjpnZXQoU1YtPmdldENvbnRleHQoKSxTcmNXaWR0aCkpOworICBlbHNlIGlmIChTVi0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgIFNWID0gQnVpbGRlci5DcmVhdGVQdHJUb0ludChTViwgVEQuZ2V0SW50UHRyVHlwZShTVi0+Z2V0Q29udGV4dCgpKSk7CisKKyAgLy8gWmVybyBleHRlbmQgb3IgdHJ1bmNhdGUgdGhlIHZhbHVlIGlmIG5lZWRlZC4KKyAgaWYgKFNWLT5nZXRUeXBlKCkgIT0gQWxsb2NhVHlwZSkgeworICAgIGlmIChTVi0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkgPAorICAgICAgICAgICAgIEFsbG9jYVR5cGUtPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSkKKyAgICAgIFNWID0gQnVpbGRlci5DcmVhdGVaRXh0KFNWLCBBbGxvY2FUeXBlKTsKKyAgICBlbHNlIHsKKyAgICAgIC8vIFRydW5jYXRpb24gbWF5IGJlIG5lZWRlZCBpZiBzdG9yaW5nIG1vcmUgdGhhbiB0aGUgYWxsb2NhIGNhbiBob2xkCisgICAgICAvLyAodW5kZWZpbmVkIGJlaGF2aW9yKS4KKyAgICAgIFNWID0gQnVpbGRlci5DcmVhdGVUcnVuYyhTViwgQWxsb2NhVHlwZSk7CisgICAgICBTcmNXaWR0aCA9IERlc3RXaWR0aDsKKyAgICAgIFNyY1N0b3JlV2lkdGggPSBEZXN0U3RvcmVXaWR0aDsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGlzIGlzIGEgYmlnLWVuZGlhbiBzeXN0ZW0gYW5kIHRoZSBzdG9yZSBpcyBuYXJyb3dlciB0aGFuIHRoZQorICAvLyBmdWxsIGFsbG9jYSB0eXBlLCB3ZSBuZWVkIHRvIGRvIGEgc2hpZnQgdG8gZ2V0IHRoZSByaWdodCBiaXRzLgorICBpbnQgU2hBbXQgPSAwOworICBpZiAoVEQuaXNCaWdFbmRpYW4oKSkgeworICAgIC8vIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHRoZSBsb3dlc3QgYml0IGlzIHN0b3JlZCBhdCB0aGUgYml0IG9mZnNldAorICAgIC8vIGZyb20gdGhlIHBvaW50ZXIgZ2l2ZW4gYnkgZ2V0VHlwZVN0b3JlU2l6ZUluQml0cy4gIFRoaXMgbWF0dGVycyBmb3IKKyAgICAvLyBpbnRlZ2VycyB3aXRoIGEgYml0d2lkdGggdGhhdCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgorICAgIFNoQW10ID0gRGVzdFN0b3JlV2lkdGggLSBTcmNTdG9yZVdpZHRoIC0gT2Zmc2V0OworICB9IGVsc2UgeworICAgIFNoQW10ID0gT2Zmc2V0OworICB9CisKKyAgLy8gTm90ZTogd2Ugc3VwcG9ydCBuZWdhdGl2ZSBiaXR3aWR0aHMgKHdpdGggc2hyKSB3aGljaCBhcmUgbm90IGRlZmluZWQuCisgIC8vIFdlIGRvIHRoaXMgdG8gc3VwcG9ydCAoZi5lLikgc3RvcmVzIG9mZiB0aGUgZW5kIG9mIGEgc3RydWN0dXJlIHdoZXJlCisgIC8vIG9ubHkgc29tZSBiaXRzIGluIHRoZSBzdHJ1Y3R1cmUgYXJlIHNldC4KKyAgQVBJbnQgTWFzayhBUEludDo6Z2V0TG93Qml0c1NldChEZXN0V2lkdGgsIFNyY1dpZHRoKSk7CisgIGlmIChTaEFtdCA+IDAgJiYgKHVuc2lnbmVkKVNoQW10IDwgRGVzdFdpZHRoKSB7CisgICAgU1YgPSBCdWlsZGVyLkNyZWF0ZVNobChTViwgQ29uc3RhbnRJbnQ6OmdldChTVi0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hBbXQpKTsKKyAgICBNYXNrIDw8PSBTaEFtdDsKKyAgfSBlbHNlIGlmIChTaEFtdCA8IDAgJiYgKHVuc2lnbmVkKS1TaEFtdCA8IERlc3RXaWR0aCkgeworICAgIFNWID0gQnVpbGRlci5DcmVhdGVMU2hyKFNWLCBDb25zdGFudEludDo6Z2V0KFNWLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVNoQW10KSk7CisgICAgTWFzayA9IE1hc2subHNocigtU2hBbXQpOworICB9CisKKyAgLy8gTWFzayBvdXQgdGhlIGJpdHMgd2UgYXJlIGFib3V0IHRvIGluc2VydCBmcm9tIHRoZSBvbGQgdmFsdWUsIGFuZCBvcgorICAvLyBpbiB0aGUgbmV3IGJpdHMuCisgIGlmIChTcmNXaWR0aCAhPSBEZXN0V2lkdGgpIHsKKyAgICBhc3NlcnQoRGVzdFdpZHRoID4gU3JjV2lkdGgpOworICAgIE9sZCA9IEJ1aWxkZXIuQ3JlYXRlQW5kKE9sZCwgQ29uc3RhbnRJbnQ6OmdldChDb250ZXh0LCB+TWFzaykpOworICAgIFNWID0gQnVpbGRlci5DcmVhdGVPcihPbGQsIFNWKTsKKyAgfQorICByZXR1cm4gU1Y7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNSb0EgRHJpdmVyCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKK2Jvb2wgU1JPQTo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICBURCA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8VGFyZ2V0RGF0YT4oKTsKKworICBib29sIENoYW5nZWQgPSBwZXJmb3JtUHJvbW90aW9uKEYpOworCisgIC8vIEZJWE1FOiBTY2FsYXJSZXBsIGN1cnJlbnRseSBkZXBlbmRzIG9uIFRhcmdldERhdGEgbW9yZSB0aGFuIGl0CisgIC8vIHRoZW9yZXRpY2FsbHkgbmVlZHMgdG8uIEl0IHNob3VsZCBiZSByZWZhY3RvcmVkIGluIG9yZGVyIHRvIHN1cHBvcnQKKyAgLy8gdGFyZ2V0LWluZGVwZW5kZW50IElSLiBVbnRpbCB0aGlzIGlzIGRvbmUsIGp1c3Qgc2tpcCB0aGUgYWN0dWFsCisgIC8vIHNjYWxhci1yZXBsYWNlbWVudCBwb3J0aW9uIG9mIHRoaXMgcGFzcy4KKyAgaWYgKCFURCkgcmV0dXJuIENoYW5nZWQ7CisKKyAgd2hpbGUgKDEpIHsKKyAgICBib29sIExvY2FsQ2hhbmdlID0gcGVyZm9ybVNjYWxhclJlcGwoRik7CisgICAgaWYgKCFMb2NhbENoYW5nZSkgYnJlYWs7ICAgLy8gTm8gbmVlZCB0byByZXByb21vdGUgaWYgbm8gc2NhbGFycmVwbAorICAgIENoYW5nZWQgPSB0cnVlOworICAgIExvY2FsQ2hhbmdlID0gcGVyZm9ybVByb21vdGlvbihGKTsKKyAgICBpZiAoIUxvY2FsQ2hhbmdlKSBicmVhazsgICAvLyBObyBuZWVkIHRvIHJlLXNjYWxhcnJlcGwgaWYgbm8gcHJvbW90aW9uCisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworCitib29sIFNST0E6OnBlcmZvcm1Qcm9tb3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgc3RkOjp2ZWN0b3I8QWxsb2NhSW5zdCo+IEFsbG9jYXM7CisgIERvbWluYXRvclRyZWUgICAgICAgICAmRFQgPSBnZXRBbmFseXNpczxEb21pbmF0b3JUcmVlPigpOworICBEb21pbmFuY2VGcm9udGllciAmREYgPSBnZXRBbmFseXNpczxEb21pbmFuY2VGcm9udGllcj4oKTsKKworICBCYXNpY0Jsb2NrICZCQiA9IEYuZ2V0RW50cnlCbG9jaygpOyAgLy8gR2V0IHRoZSBlbnRyeSBub2RlIGZvciB0aGUgZnVuY3Rpb24KKworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICB3aGlsZSAoMSkgeworICAgIEFsbG9jYXMuY2xlYXIoKTsKKworICAgIC8vIEZpbmQgYWxsb2NhcyB0aGF0IGFyZSBzYWZlIHRvIHByb21vdGUsIGJ5IGxvb2tpbmcgYXQgYWxsIGluc3RydWN0aW9ucyBpbgorICAgIC8vIHRoZSBlbnRyeSBub2RlCisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQkIuYmVnaW4oKSwgRSA9IC0tQkIuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKEFsbG9jYUluc3QgKkFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oSSkpICAgICAgIC8vIElzIGl0IGFuIGFsbG9jYT8KKyAgICAgICAgaWYgKGlzQWxsb2NhUHJvbW90YWJsZShBSSkpCisgICAgICAgICAgQWxsb2Nhcy5wdXNoX2JhY2soQUkpOworCisgICAgaWYgKEFsbG9jYXMuZW1wdHkoKSkgYnJlYWs7CisKKyAgICBQcm9tb3RlTWVtVG9SZWcoQWxsb2NhcywgRFQsIERGKTsKKyAgICBOdW1Qcm9tb3RlZCArPSBBbGxvY2FzLnNpemUoKTsKKyAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBDaGFuZ2VkOworfQorCisKKy8vLyBTaG91bGRBdHRlbXB0U2NhbGFyUmVwbCAtIERlY2lkZSBpZiBhbiBhbGxvY2EgaXMgYSBnb29kIGNhbmRpZGF0ZSBmb3IKKy8vLyBTUk9BLiAgSXQgbXVzdCBiZSBhIHN0cnVjdCBvciBhcnJheSB0eXBlIHdpdGggYSBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMuCitzdGF0aWMgYm9vbCBTaG91bGRBdHRlbXB0U2NhbGFyUmVwbChBbGxvY2FJbnN0ICpBSSkgeworICBjb25zdCBUeXBlICpUID0gQUktPmdldEFsbG9jYXRlZFR5cGUoKTsKKyAgLy8gRG8gbm90IHByb21vdGUgYW55IHN0cnVjdCBpbnRvIG1vcmUgdGhhbiAzMiBzZXBhcmF0ZSB2YXJzLgorICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1QgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihUKSkKKyAgICByZXR1cm4gU1QtPmdldE51bUVsZW1lbnRzKCkgPD0gMzI7CisgIC8vIEFycmF5cyBhcmUgbXVjaCBsZXNzIGxpa2VseSB0byBiZSBzYWZlIGZvciBTUk9BOyBvbmx5IGNvbnNpZGVyCisgIC8vIHRoZW0gaWYgdGhleSBhcmUgdmVyeSBzbWFsbC4KKyAgaWYgKGNvbnN0IEFycmF5VHlwZSAqQVQgPSBkeW5fY2FzdDxBcnJheVR5cGU+KFQpKQorICAgIHJldHVybiBBVC0+Z2V0TnVtRWxlbWVudHMoKSA8PSA4OworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8gcGVyZm9ybVNjYWxhclJlcGwgLSBUaGlzIGFsZ29yaXRobSBpcyBhIHNpbXBsZSB3b3JrbGlzdCBkcml2ZW4gYWxnb3JpdGhtLAorLy8gd2hpY2ggcnVucyBvbiBhbGwgb2YgdGhlIG1hbGxvYy9hbGxvY2EgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmdW5jdGlvbiwgcmVtb3ZpbmcKKy8vIHRoZW0gaWYgdGhleSBhcmUgb25seSB1c2VkIGJ5IGdldGVsZW1lbnRwdHIgaW5zdHJ1Y3Rpb25zLgorLy8KK2Jvb2wgU1JPQTo6cGVyZm9ybVNjYWxhclJlcGwoRnVuY3Rpb24gJkYpIHsKKyAgc3RkOjp2ZWN0b3I8QWxsb2NhSW5zdCo+IFdvcmtMaXN0OworCisgIC8vIFNjYW4gdGhlIGVudHJ5IGJhc2ljIGJsb2NrLCBhZGRpbmcgYWxsb2NhcyB0byB0aGUgd29ya2xpc3QuCisgIEJhc2ljQmxvY2sgJkJCID0gRi5nZXRFbnRyeUJsb2NrKCk7CisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLmJlZ2luKCksIEUgPSBCQi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKEFsbG9jYUluc3QgKkEgPSBkeW5fY2FzdDxBbGxvY2FJbnN0PihJKSkKKyAgICAgIFdvcmtMaXN0LnB1c2hfYmFjayhBKTsKKworICAvLyBQcm9jZXNzIHRoZSB3b3JrbGlzdAorICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgd2hpbGUgKCFXb3JrTGlzdC5lbXB0eSgpKSB7CisgICAgQWxsb2NhSW5zdCAqQUkgPSBXb3JrTGlzdC5iYWNrKCk7CisgICAgV29ya0xpc3QucG9wX2JhY2soKTsKKyAgICAKKyAgICAvLyBIYW5kbGUgZGVhZCBhbGxvY2FzIHRyaXZpYWxseS4gIFRoZXNlIGNhbiBiZSBmb3JtZWQgYnkgU1JPQSdpbmcgYXJyYXlzCisgICAgLy8gd2l0aCB1bnVzZWQgZWxlbWVudHMuCisgICAgaWYgKEFJLT51c2VfZW1wdHkoKSkgeworICAgICAgQUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGFsbG9jYSBpcyBpbXBvc3NpYmxlIGZvciB1cyB0byBwcm9tb3RlLCByZWplY3QgaXQgZWFybHkuCisgICAgaWYgKEFJLT5pc0FycmF5QWxsb2NhdGlvbigpIHx8ICFBSS0+Z2V0QWxsb2NhdGVkVHlwZSgpLT5pc1NpemVkKCkpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBhbGxvY2F0aW9uIGlzIG9ubHkgbW9kaWZpZWQgYnkgYSBtZW1jcHkvbWVtbW92ZSBmcm9tCisgICAgLy8gYSBjb25zdGFudCBnbG9iYWwuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSBjYW4gY2hhbmdlIGFsbCB1c2VycyB0byB1c2UKKyAgICAvLyB0aGUgY29uc3RhbnQgZ2xvYmFsIGluc3RlYWQuICBUaGlzIGlzIGNvbW1vbmx5IHByb2R1Y2VkIGJ5IHRoZSBDRkUgYnkKKyAgICAvLyBjb25zdHJ1Y3RzIGxpa2UgInZvaWQgZm9vKCkgeyBpbnQgQVtdID0gezEsMiwzLDQsNSw2LDcsOCw5Li4ufTsgfSIgaWYgJ0EnCisgICAgLy8gaXMgb25seSBzdWJzZXF1ZW50bHkgcmVhZC4KKyAgICBpZiAoTWVtVHJhbnNmZXJJbnN0ICpUaGVDb3B5ID0gaXNPbmx5Q29waWVkRnJvbUNvbnN0YW50R2xvYmFsKEFJKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJGb3VuZCBhbGxvY2EgZXF1YWwgdG8gZ2xvYmFsOiAiIDw8ICpBSSA8PCAnXG4nKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICBtZW1jcHkgPSAiIDw8ICpUaGVDb3B5IDw8ICdcbicpOworICAgICAgQ29uc3RhbnQgKlRoZVNyYyA9IGNhc3Q8Q29uc3RhbnQ+KFRoZUNvcHktPmdldFNvdXJjZSgpKTsKKyAgICAgIEFJLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KFRoZVNyYywgQUktPmdldFR5cGUoKSkpOworICAgICAgVGhlQ29weS0+ZXJhc2VGcm9tUGFyZW50KCk7ICAvLyBEb24ndCBtdXRhdGUgdGhlIGdsb2JhbC4KKyAgICAgIEFJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICsrTnVtR2xvYmFsczsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gcGVyZm9ybSB0aGUgY29yZSBTUk9BIHRyYW5zZm9ybWF0aW9uLiAgV2UgY2Fubm90CisgICAgLy8gdHJhbnNmb3JtIHRoZSBhbGxvY2F0aW9uIGluc3RydWN0aW9uIGlmIGl0IGlzIGFuIGFycmF5IGFsbG9jYXRpb24KKyAgICAvLyAoYWxsb2NhdGlvbnMgT0YgYXJyYXlzIGFyZSBvayB0aG91Z2gpLCBhbmQgYW4gYWxsb2NhdGlvbiBvZiBhIHNjYWxhcgorICAgIC8vIHZhbHVlIGNhbm5vdCBiZSBkZWNvbXBvc2VkIGF0IGFsbC4KKyAgICB1aW50NjRfdCBBbGxvY2FTaXplID0gVEQtPmdldFR5cGVBbGxvY1NpemUoQUktPmdldEFsbG9jYXRlZFR5cGUoKSk7CisKKyAgICAvLyBEbyBub3QgcHJvbW90ZSBbMCB4ICVzdHJ1Y3RdLgorICAgIGlmIChBbGxvY2FTaXplID09IDApIGNvbnRpbnVlOworICAgIAorICAgIC8vIERvIG5vdCBwcm9tb3RlIGFueSBzdHJ1Y3Qgd2hvc2Ugc2l6ZSBpcyB0b28gYmlnLgorICAgIGlmIChBbGxvY2FTaXplID4gU1JUaHJlc2hvbGQpIGNvbnRpbnVlOworICAgIAorICAgIC8vIElmIHRoZSBhbGxvY2EgbG9va3MgbGlrZSBhIGdvb2QgY2FuZGlkYXRlIGZvciBzY2FsYXIgcmVwbGFjZW1lbnQsIGFuZCBpZgorICAgIC8vIGFsbCBpdHMgdXNlcnMgY2FuIGJlIHRyYW5zZm9ybWVkLCB0aGVuIHNwbGl0IHVwIHRoZSBhZ2dyZWdhdGUgaW50byBpdHMKKyAgICAvLyBzZXBhcmF0ZSBlbGVtZW50cy4KKyAgICBpZiAoU2hvdWxkQXR0ZW1wdFNjYWxhclJlcGwoQUkpICYmIGlzU2FmZUFsbG9jYVRvU2NhbGFyUmVwbChBSSkpIHsKKyAgICAgIERvU2NhbGFyUmVwbGFjZW1lbnQoQUksIFdvcmtMaXN0KTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgd2UgY2FuIHR1cm4gdGhpcyBhZ2dyZWdhdGUgdmFsdWUgKHBvdGVudGlhbGx5IHdpdGggY2FzdHMpIGludG8gYQorICAgIC8vIHNpbXBsZSBzY2FsYXIgdmFsdWUgdGhhdCBjYW4gYmUgbWVtMnJlZydkIGludG8gYSByZWdpc3RlciB2YWx1ZS4KKyAgICAvLyBJc05vdFRyaXZpYWwgdHJhY2tzIHdoZXRoZXIgdGhpcyBpcyBzb21ldGhpbmcgdGhhdCBtZW0ycmVnIGNvdWxkIGhhdmUKKyAgICAvLyBwcm9tb3RlZCBpdHNlbGYuICBJZiBzbywgd2UgZG9uJ3Qgd2FudCB0byB0cmFuc2Zvcm0gaXQgbmVlZGxlc3NseS4gIE5vdGUKKyAgICAvLyB0aGF0IHdlIGNhbid0IGp1c3QgY2hlY2sgYmFzZWQgb24gdGhlIHR5cGU6IHRoZSBhbGxvY2EgbWF5IGJlIG9mIGFuIGkzMgorICAgIC8vIGJ1dCB0aGF0IGhhcyBwb2ludGVyIGFyaXRobWV0aWMgdG8gc2V0IGJ5dGUgMyBvZiBpdCBvciBzb21ldGhpbmcuCisgICAgaWYgKEFsbG9jYUluc3QgKk5ld0FJID0KKyAgICAgICAgICBDb252ZXJ0VG9TY2FsYXJJbmZvKCh1bnNpZ25lZClBbGxvY2FTaXplLCAqVEQpLlRyeUNvbnZlcnQoQUkpKSB7CisgICAgICBOZXdBSS0+dGFrZU5hbWUoQUkpOworICAgICAgQUktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgKytOdW1Db252ZXJ0ZWQ7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gICAgICAKKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIGNvdWxkbid0IHByb2Nlc3MgdGhpcyBhbGxvY2EuCisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIERvU2NhbGFyUmVwbGFjZW1lbnQgLSBUaGlzIGFsbG9jYSBzYXRpc2ZpZWQgdGhlIGlzU2FmZUFsbG9jYVRvU2NhbGFyUmVwbAorLy8vIHByZWRpY2F0ZSwgZG8gU1JPQSBub3cuCit2b2lkIFNST0E6OkRvU2NhbGFyUmVwbGFjZW1lbnQoQWxsb2NhSW5zdCAqQUksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFsbG9jYUluc3QqPiAmV29ya0xpc3QpIHsKKyAgREVCVUcoZGJncygpIDw8ICJGb3VuZCBpbnN0IHRvIFNST0E6ICIgPDwgKkFJIDw8ICdcbicpOworICBTbWFsbFZlY3RvcjxBbGxvY2FJbnN0KiwgMzI+IEVsZW1lbnRBbGxvY2FzOworICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1QgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihBSS0+Z2V0QWxsb2NhdGVkVHlwZSgpKSkgeworICAgIEVsZW1lbnRBbGxvY2FzLnJlc2VydmUoU1QtPmdldE51bUNvbnRhaW5lZFR5cGVzKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVC0+Z2V0TnVtQ29udGFpbmVkVHlwZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEFsbG9jYUluc3QgKk5BID0gbmV3IEFsbG9jYUluc3QoU1QtPmdldENvbnRhaW5lZFR5cGUoaSksIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSS0+Z2V0QWxpZ25tZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFJKTsKKyAgICAgIEVsZW1lbnRBbGxvY2FzLnB1c2hfYmFjayhOQSk7CisgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soTkEpOyAgLy8gQWRkIHRvIHdvcmtsaXN0IGZvciByZWN1cnNpdmUgcHJvY2Vzc2luZworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBBcnJheVR5cGUgKkFUID0gY2FzdDxBcnJheVR5cGU+KEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCkpOworICAgIEVsZW1lbnRBbGxvY2FzLnJlc2VydmUoQVQtPmdldE51bUVsZW1lbnRzKCkpOworICAgIGNvbnN0IFR5cGUgKkVsVHkgPSBBVC0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQVQtPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBBbGxvY2FJbnN0ICpOQSA9IG5ldyBBbGxvY2FJbnN0KEVsVHksIDAsIEFJLT5nZXRBbGlnbm1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUkpOworICAgICAgRWxlbWVudEFsbG9jYXMucHVzaF9iYWNrKE5BKTsKKyAgICAgIFdvcmtMaXN0LnB1c2hfYmFjayhOQSk7ICAvLyBBZGQgdG8gd29ya2xpc3QgZm9yIHJlY3Vyc2l2ZSBwcm9jZXNzaW5nCisgICAgfQorICB9CisKKyAgLy8gTm93IHRoYXQgd2UgaGF2ZSBjcmVhdGVkIHRoZSBuZXcgYWxsb2NhIGluc3RydWN0aW9ucywgcmV3cml0ZSBhbGwgdGhlCisgIC8vIHVzZXMgb2YgdGhlIG9sZCBhbGxvY2EuCisgIFJld3JpdGVGb3JTY2FsYXJSZXBsKEFJLCBBSSwgMCwgRWxlbWVudEFsbG9jYXMpOworCisgIC8vIE5vdyBlcmFzZSBhbnkgaW5zdHJ1Y3Rpb25zIHRoYXQgd2VyZSBtYWRlIGRlYWQgd2hpbGUgcmV3cml0aW5nIHRoZSBhbGxvY2EuCisgIERlbGV0ZURlYWRJbnN0cnVjdGlvbnMoKTsKKyAgQUktPmVyYXNlRnJvbVBhcmVudCgpOworCisgICsrTnVtUmVwbGFjZWQ7Cit9CisKKy8vLyBEZWxldGVEZWFkSW5zdHJ1Y3Rpb25zIC0gRXJhc2UgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBEZWFkSW5zdHJzIGxpc3QsCisvLy8gcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGFsbCB0aGVpciBvcGVyYW5kcyB0aGF0IGJlY29tZSB0cml2aWFsbHkgZGVhZC4KK3ZvaWQgU1JPQTo6RGVsZXRlRGVhZEluc3RydWN0aW9ucygpIHsKKyAgd2hpbGUgKCFEZWFkSW5zdHMuZW1wdHkoKSkgeworICAgIEluc3RydWN0aW9uICpJID0gY2FzdDxJbnN0cnVjdGlvbj4oRGVhZEluc3RzLnBvcF9iYWNrX3ZhbCgpKTsKKworICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgT0kgPSBJLT5vcF9iZWdpbigpLCBFID0gSS0+b3BfZW5kKCk7IE9JICE9IEU7ICsrT0kpCisgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKlUgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oKk9JKSkgeworICAgICAgICAvLyBaZXJvIG91dCB0aGUgb3BlcmFuZCBhbmQgc2VlIGlmIGl0IGJlY29tZXMgdHJpdmlhbGx5IGRlYWQuCisgICAgICAgIC8vIChCdXQsIGRvbid0IGFkZCBhbGxvY2FzIHRvIHRoZSBkZWFkIGluc3RydWN0aW9uIGxpc3QgLS0gdGhleSBhcmUKKyAgICAgICAgLy8gYWxyZWFkeSBvbiB0aGUgd29ya2xpc3QgYW5kIHdpbGwgYmUgZGVsZXRlZCBzZXBhcmF0ZWx5LikKKyAgICAgICAgKk9JID0gMDsKKyAgICAgICAgaWYgKGlzSW5zdHJ1Y3Rpb25Ucml2aWFsbHlEZWFkKFUpICYmICFpc2E8QWxsb2NhSW5zdD4oVSkpCisgICAgICAgICAgRGVhZEluc3RzLnB1c2hfYmFjayhVKTsKKyAgICAgIH0KKworICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICB9Cit9CisgICAgCisvLy8gaXNTYWZlRm9yU2NhbGFyUmVwbCAtIENoZWNrIGlmIGluc3RydWN0aW9uIEkgaXMgYSBzYWZlIHVzZSB3aXRoIHJlZ2FyZCB0bworLy8vIHBlcmZvcm1pbmcgc2NhbGFyIHJlcGxhY2VtZW50IG9mIGFsbG9jYSBBSS4gIFRoZSByZXN1bHRzIGFyZSBmbGFnZ2VkIGluCisvLy8gdGhlIEluZm8gcGFyYW1ldGVyLiAgT2Zmc2V0IGluZGljYXRlcyB0aGUgcG9zaXRpb24gd2l0aGluIEFJIHRoYXQgaXMKKy8vLyByZWZlcmVuY2VkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24uCit2b2lkIFNST0E6OmlzU2FmZUZvclNjYWxhclJlcGwoSW5zdHJ1Y3Rpb24gKkksIEFsbG9jYUluc3QgKkFJLCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhSW5mbyAmSW5mbykgeworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBJLT51c2VfYmVnaW4oKSwgRSA9IEktPnVzZV9lbmQoKTsgVUkhPUU7ICsrVUkpIHsKKyAgICBJbnN0cnVjdGlvbiAqVXNlciA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSk7CisKKyAgICBpZiAoQml0Q2FzdEluc3QgKkJDID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KFVzZXIpKSB7CisgICAgICBpc1NhZmVGb3JTY2FsYXJSZXBsKEJDLCBBSSwgT2Zmc2V0LCBJbmZvKTsKKyAgICB9IGVsc2UgaWYgKEdldEVsZW1lbnRQdHJJbnN0ICpHRVBJID0gZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KFVzZXIpKSB7CisgICAgICB1aW50NjRfdCBHRVBPZmZzZXQgPSBPZmZzZXQ7CisgICAgICBpc1NhZmVHRVAoR0VQSSwgQUksIEdFUE9mZnNldCwgSW5mbyk7CisgICAgICBpZiAoIUluZm8uaXNVbnNhZmUpCisgICAgICAgIGlzU2FmZUZvclNjYWxhclJlcGwoR0VQSSwgQUksIEdFUE9mZnNldCwgSW5mbyk7CisgICAgfSBlbHNlIGlmIChNZW1JbnRyaW5zaWMgKk1JID0gZHluX2Nhc3Q8TWVtSW50cmluc2ljPihVc2VyKSkgeworICAgICAgQ29uc3RhbnRJbnQgKkxlbmd0aCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihNSS0+Z2V0TGVuZ3RoKCkpOworICAgICAgaWYgKExlbmd0aCkKKyAgICAgICAgaXNTYWZlTWVtQWNjZXNzKEFJLCBPZmZzZXQsIExlbmd0aC0+Z2V0WkV4dFZhbHVlKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBVSS5nZXRPcGVyYW5kTm8oKSA9PSAwLCBJbmZvKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTWFya1Vuc2FmZShJbmZvKTsKKyAgICB9IGVsc2UgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihVc2VyKSkgeworICAgICAgaWYgKCFMSS0+aXNWb2xhdGlsZSgpKSB7CisgICAgICAgIGNvbnN0IFR5cGUgKkxJVHlwZSA9IExJLT5nZXRUeXBlKCk7CisgICAgICAgIGlzU2FmZU1lbUFjY2VzcyhBSSwgT2Zmc2V0LCBURC0+Z2V0VHlwZUFsbG9jU2l6ZShMSVR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgTElUeXBlLCBmYWxzZSwgSW5mbyk7CisgICAgICB9IGVsc2UKKyAgICAgICAgTWFya1Vuc2FmZShJbmZvKTsKKyAgICB9IGVsc2UgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFVzZXIpKSB7CisgICAgICAvLyBTdG9yZSBpcyBvayBpZiBzdG9yaW5nIElOVE8gdGhlIHBvaW50ZXIsIG5vdCBzdG9yaW5nIHRoZSBwb2ludGVyCisgICAgICBpZiAoIVNJLT5pc1ZvbGF0aWxlKCkgJiYgU0ktPmdldE9wZXJhbmQoMCkgIT0gSSkgeworICAgICAgICBjb25zdCBUeXBlICpTSVR5cGUgPSBTSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpOworICAgICAgICBpc1NhZmVNZW1BY2Nlc3MoQUksIE9mZnNldCwgVEQtPmdldFR5cGVBbGxvY1NpemUoU0lUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNJVHlwZSwgdHJ1ZSwgSW5mbyk7CisgICAgICB9IGVsc2UKKyAgICAgICAgTWFya1Vuc2FmZShJbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgREVCVUcoZXJycygpIDw8ICIgIFRyYW5zZm9ybWF0aW9uIHByZXZlbnRpbmcgaW5zdDogIiA8PCAqVXNlciA8PCAnXG4nKTsKKyAgICAgIE1hcmtVbnNhZmUoSW5mbyk7CisgICAgfQorICAgIGlmIChJbmZvLmlzVW5zYWZlKSByZXR1cm47CisgIH0KK30KKworLy8vIGlzU2FmZUdFUCAtIENoZWNrIGlmIGEgR0VQIGluc3RydWN0aW9uIGNhbiBiZSBoYW5kbGVkIGZvciBzY2FsYXIKKy8vLyByZXBsYWNlbWVudC4gIEl0IGlzIHNhZmUgd2hlbiBhbGwgdGhlIGluZGljZXMgYXJlIGNvbnN0YW50LCBpbi1ib3VuZHMKKy8vLyByZWZlcmVuY2VzLCBhbmQgd2hlbiB0aGUgcmVzdWx0aW5nIG9mZnNldCBjb3JyZXNwb25kcyB0byBhbiBlbGVtZW50IHdpdGhpbgorLy8vIHRoZSBhbGxvY2EgdHlwZS4gIFRoZSByZXN1bHRzIGFyZSBmbGFnZ2VkIGluIHRoZSBJbmZvIHBhcmFtZXRlci4gIFVwb24KKy8vLyByZXR1cm4sIE9mZnNldCBpcyBhZGp1c3RlZCBhcyBzcGVjaWZpZWQgYnkgdGhlIEdFUCBpbmRpY2VzLgordm9pZCBTUk9BOjppc1NhZmVHRVAoR2V0RWxlbWVudFB0ckluc3QgKkdFUEksIEFsbG9jYUluc3QgKkFJLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJk9mZnNldCwgQWxsb2NhSW5mbyAmSW5mbykgeworICBnZXBfdHlwZV9pdGVyYXRvciBHRVBJdCA9IGdlcF90eXBlX2JlZ2luKEdFUEkpLCBFID0gZ2VwX3R5cGVfZW5kKEdFUEkpOworICBpZiAoR0VQSXQgPT0gRSkKKyAgICByZXR1cm47CisKKyAgLy8gV2FsayB0aHJvdWdoIHRoZSBHRVAgdHlwZSBpbmRpY2VzLCBjaGVja2luZyB0aGUgdHlwZXMgdGhhdCB0aGlzIGluZGV4ZXMKKyAgLy8gaW50by4KKyAgZm9yICg7IEdFUEl0ICE9IEU7ICsrR0VQSXQpIHsKKyAgICAvLyBJZ25vcmUgc3RydWN0IGVsZW1lbnRzLCBubyBleHRyYSBjaGVja2luZyBuZWVkZWQgZm9yIHRoZXNlLgorICAgIGlmICgoKkdFUEl0KS0+aXNTdHJ1Y3RUeSgpKQorICAgICAgY29udGludWU7CisKKyAgICBDb25zdGFudEludCAqSWR4VmFsID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEdFUEl0LmdldE9wZXJhbmQoKSk7CisgICAgaWYgKCFJZHhWYWwpCisgICAgICByZXR1cm4gTWFya1Vuc2FmZShJbmZvKTsKKyAgfQorCisgIC8vIENvbXB1dGUgdGhlIG9mZnNldCBkdWUgdG8gdGhpcyBHRVAgYW5kIGNoZWNrIGlmIHRoZSBhbGxvY2EgaGFzIGEKKyAgLy8gY29tcG9uZW50IGVsZW1lbnQgYXQgdGhhdCBvZmZzZXQuCisgIFNtYWxsVmVjdG9yPFZhbHVlKiwgOD4gSW5kaWNlcyhHRVBJLT5vcF9iZWdpbigpICsgMSwgR0VQSS0+b3BfZW5kKCkpOworICBPZmZzZXQgKz0gVEQtPmdldEluZGV4ZWRPZmZzZXQoR0VQSS0+Z2V0UG9pbnRlck9wZXJhbmRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5kaWNlc1swXSwgSW5kaWNlcy5zaXplKCkpOworICBpZiAoIVR5cGVIYXNDb21wb25lbnQoQUktPmdldEFsbG9jYXRlZFR5cGUoKSwgT2Zmc2V0LCAwKSkKKyAgICBNYXJrVW5zYWZlKEluZm8pOworfQorCisvLy8gaXNTYWZlTWVtQWNjZXNzIC0gQ2hlY2sgaWYgYSBsb2FkL3N0b3JlL21lbWNweSBvcGVyYXRlcyBvbiB0aGUgZW50aXJlIEFJCisvLy8gYWxsb2NhIG9yIGhhcyBhbiBvZmZzZXQgYW5kIHNpemUgdGhhdCBjb3JyZXNwb25kcyB0byBhIGNvbXBvbmVudCBlbGVtZW50CisvLy8gd2l0aGluIGl0LiAgVGhlIG9mZnNldCBjaGVja2VkIGhlcmUgbWF5IGhhdmUgYmVlbiBmb3JtZWQgZnJvbSBhIEdFUCB3aXRoIGEKKy8vLyBwb2ludGVyIGJpdGNhc3RlZCB0byBhIGRpZmZlcmVudCB0eXBlLgordm9pZCBTUk9BOjppc1NhZmVNZW1BY2Nlc3MoQWxsb2NhSW5zdCAqQUksIHVpbnQ2NF90IE9mZnNldCwgdWludDY0X3QgTWVtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKk1lbU9wVHlwZSwgYm9vbCBpc1N0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhSW5mbyAmSW5mbykgeworICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbG9hZC9zdG9yZSBvZiB0aGUgZW50aXJlIGFsbG9jYS4KKyAgaWYgKE9mZnNldCA9PSAwICYmIE1lbVNpemUgPT0gVEQtPmdldFR5cGVBbGxvY1NpemUoQUktPmdldEFsbG9jYXRlZFR5cGUoKSkpIHsKKyAgICBib29sIFVzZXNBZ2dyZWdhdGVUeXBlID0gKE1lbU9wVHlwZSA9PSBBSS0+Z2V0QWxsb2NhdGVkVHlwZSgpKTsKKyAgICAvLyBUaGlzIGlzIHNhZmUgZm9yIE1lbUludHJpbnNpY3MgKHdoZXJlIE1lbU9wVHlwZSBpcyAwKSwgaW50ZWdlciB0eXBlcworICAgIC8vICh3aGljaCBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIE1lbUludHJpbnNpY3MsIGVzcGVjaWFsbHkgd2l0aAorICAgIC8vIHJlZ2FyZCB0byBjb3B5aW5nIHBhZGRpbmcgYmV0d2VlbiBlbGVtZW50cyksIG9yIHJlZmVyZW5jZXMgdXNpbmcgdGhlCisgICAgLy8gYWdncmVnYXRlIHR5cGUgb2YgdGhlIGFsbG9jYS4KKyAgICBpZiAoIU1lbU9wVHlwZSB8fCBNZW1PcFR5cGUtPmlzSW50ZWdlclR5KCkgfHwgVXNlc0FnZ3JlZ2F0ZVR5cGUpIHsKKyAgICAgIGlmICghVXNlc0FnZ3JlZ2F0ZVR5cGUpIHsKKyAgICAgICAgaWYgKGlzU3RvcmUpCisgICAgICAgICAgSW5mby5pc01lbUNweURzdCA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBJbmZvLmlzTWVtQ3B5U3JjID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgLy8gQ2hlY2sgaWYgdGhlIG9mZnNldC9zaXplIGNvcnJlc3BvbmQgdG8gYSBjb21wb25lbnQgd2l0aGluIHRoZSBhbGxvY2EgdHlwZS4KKyAgY29uc3QgVHlwZSAqVCA9IEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCk7CisgIGlmIChUeXBlSGFzQ29tcG9uZW50KFQsIE9mZnNldCwgTWVtU2l6ZSkpCisgICAgcmV0dXJuOworCisgIHJldHVybiBNYXJrVW5zYWZlKEluZm8pOworfQorCisvLy8gVHlwZUhhc0NvbXBvbmVudCAtIFJldHVybiB0cnVlIGlmIFQgaGFzIGEgY29tcG9uZW50IHR5cGUgd2l0aCB0aGUKKy8vLyBzcGVjaWZpZWQgb2Zmc2V0IGFuZCBzaXplLiAgSWYgU2l6ZSBpcyB6ZXJvLCBkbyBub3QgY2hlY2sgdGhlIHNpemUuCitib29sIFNST0E6OlR5cGVIYXNDb21wb25lbnQoY29uc3QgVHlwZSAqVCwgdWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBTaXplKSB7CisgIGNvbnN0IFR5cGUgKkVsdFR5OworICB1aW50NjRfdCBFbHRTaXplOworICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1QgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihUKSkgeworICAgIGNvbnN0IFN0cnVjdExheW91dCAqTGF5b3V0ID0gVEQtPmdldFN0cnVjdExheW91dChTVCk7CisgICAgdW5zaWduZWQgRWx0SWR4ID0gTGF5b3V0LT5nZXRFbGVtZW50Q29udGFpbmluZ09mZnNldChPZmZzZXQpOworICAgIEVsdFR5ID0gU1QtPmdldENvbnRhaW5lZFR5cGUoRWx0SWR4KTsKKyAgICBFbHRTaXplID0gVEQtPmdldFR5cGVBbGxvY1NpemUoRWx0VHkpOworICAgIE9mZnNldCAtPSBMYXlvdXQtPmdldEVsZW1lbnRPZmZzZXQoRWx0SWR4KTsKKyAgfSBlbHNlIGlmIChjb25zdCBBcnJheVR5cGUgKkFUID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihUKSkgeworICAgIEVsdFR5ID0gQVQtPmdldEVsZW1lbnRUeXBlKCk7CisgICAgRWx0U2l6ZSA9IFRELT5nZXRUeXBlQWxsb2NTaXplKEVsdFR5KTsKKyAgICBpZiAoT2Zmc2V0ID49IEFULT5nZXROdW1FbGVtZW50cygpICogRWx0U2l6ZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBPZmZzZXQgJT0gRWx0U2l6ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKE9mZnNldCA9PSAwICYmIChTaXplID09IDAgfHwgRWx0U2l6ZSA9PSBTaXplKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgLy8gQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBzcGFucyBtdWx0aXBsZSBlbGVtZW50cy4KKyAgaWYgKE9mZnNldCArIFNpemUgPiBFbHRTaXplKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIFR5cGVIYXNDb21wb25lbnQoRWx0VHksIE9mZnNldCwgU2l6ZSk7Cit9CisKKy8vLyBSZXdyaXRlRm9yU2NhbGFyUmVwbCAtIEFsbG9jYSBBSSBpcyBiZWluZyBzcGxpdCBpbnRvIE5ld0VsdHMsIHNvIHJld3JpdGUKKy8vLyB0aGUgaW5zdHJ1Y3Rpb24gSSwgd2hpY2ggcmVmZXJlbmNlcyBpdCwgdG8gdXNlIHRoZSBzZXBhcmF0ZSBlbGVtZW50cy4KKy8vLyBPZmZzZXQgaW5kaWNhdGVzIHRoZSBwb3NpdGlvbiB3aXRoaW4gQUkgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IHRoaXMKKy8vLyBpbnN0cnVjdGlvbi4KK3ZvaWQgU1JPQTo6UmV3cml0ZUZvclNjYWxhclJlcGwoSW5zdHJ1Y3Rpb24gKkksIEFsbG9jYUluc3QgKkFJLCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPEFsbG9jYUluc3QqLCAzMj4gJk5ld0VsdHMpIHsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gSS0+dXNlX2JlZ2luKCksIEUgPSBJLT51c2VfZW5kKCk7IFVJIT1FOyArK1VJKSB7CisgICAgSW5zdHJ1Y3Rpb24gKlVzZXIgPSBjYXN0PEluc3RydWN0aW9uPigqVUkpOworCisgICAgaWYgKEJpdENhc3RJbnN0ICpCQyA9IGR5bl9jYXN0PEJpdENhc3RJbnN0PihVc2VyKSkgeworICAgICAgUmV3cml0ZUJpdENhc3QoQkMsIEFJLCBPZmZzZXQsIE5ld0VsdHMpOworICAgIH0gZWxzZSBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUEkgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVXNlcikpIHsKKyAgICAgIFJld3JpdGVHRVAoR0VQSSwgQUksIE9mZnNldCwgTmV3RWx0cyk7CisgICAgfSBlbHNlIGlmIChNZW1JbnRyaW5zaWMgKk1JID0gZHluX2Nhc3Q8TWVtSW50cmluc2ljPihVc2VyKSkgeworICAgICAgQ29uc3RhbnRJbnQgKkxlbmd0aCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihNSS0+Z2V0TGVuZ3RoKCkpOworICAgICAgdWludDY0X3QgTWVtU2l6ZSA9IExlbmd0aC0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBpZiAoT2Zmc2V0ID09IDAgJiYKKyAgICAgICAgICBNZW1TaXplID09IFRELT5nZXRUeXBlQWxsb2NTaXplKEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCkpKQorICAgICAgICBSZXdyaXRlTWVtSW50cmluVXNlck9mQWxsb2NhKE1JLCBJLCBBSSwgTmV3RWx0cyk7CisgICAgICAvLyBPdGhlcndpc2UgdGhlIGludHJpbnNpYyBjYW4gb25seSB0b3VjaCBhIHNpbmdsZSBlbGVtZW50IGFuZCB0aGUKKyAgICAgIC8vIGFkZHJlc3Mgb3BlcmFuZCB3aWxsIGJlIHVwZGF0ZWQsIHNvIG5vdGhpbmcgZWxzZSBuZWVkcyB0byBiZSBkb25lLgorICAgIH0gZWxzZSBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFVzZXIpKSB7CisgICAgICBjb25zdCBUeXBlICpMSVR5cGUgPSBMSS0+Z2V0VHlwZSgpOworICAgICAgaWYgKExJVHlwZSA9PSBBSS0+Z2V0QWxsb2NhdGVkVHlwZSgpKSB7CisgICAgICAgIC8vIFJlcGxhY2U6CisgICAgICAgIC8vICAgJXJlcyA9IGxvYWQgeyBpMzIsIGkzMiB9KiAlYWxsb2MKKyAgICAgICAgLy8gd2l0aDoKKyAgICAgICAgLy8gICAlbG9hZC4wID0gbG9hZCBpMzIqICVhbGxvYy4wCisgICAgICAgIC8vICAgJWluc2VydC4wIGluc2VydHZhbHVlIHsgaTMyLCBpMzIgfSB6ZXJvaW5pdGlhbGl6ZXIsIGkzMiAlbG9hZC4wLCAwCisgICAgICAgIC8vICAgJWxvYWQuMSA9IGxvYWQgaTMyKiAlYWxsb2MuMQorICAgICAgICAvLyAgICVpbnNlcnQgPSBpbnNlcnR2YWx1ZSB7IGkzMiwgaTMyIH0gJWluc2VydC4wLCBpMzIgJWxvYWQuMSwgMQorICAgICAgICAvLyAoQWxzbyB3b3JrcyBmb3IgYXJyYXlzIGluc3RlYWQgb2Ygc3RydWN0cykKKyAgICAgICAgVmFsdWUgKkluc2VydCA9IFVuZGVmVmFsdWU6OmdldChMSVR5cGUpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3RWx0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgVmFsdWUgKkxvYWQgPSBuZXcgTG9hZEluc3QoTmV3RWx0c1tpXSwgTEkpOworICAgICAgICAgIEluc2VydCA9IEluc2VydFZhbHVlSW5zdDo6Q3JlYXRlKEluc2VydCwgTG9hZCwgaSwgTEkpOworICAgICAgICB9CisgICAgICAgIExJLT5yZXBsYWNlQWxsVXNlc1dpdGgoSW5zZXJ0KTsKKyAgICAgICAgRGVhZEluc3RzLnB1c2hfYmFjayhMSSk7CisgICAgICB9IGVsc2UgaWYgKExJVHlwZS0+aXNJbnRlZ2VyVHkoKSAmJgorICAgICAgICAgICAgICAgICBURC0+Z2V0VHlwZUFsbG9jU2l6ZShMSVR5cGUpID09CisgICAgICAgICAgICAgICAgIFRELT5nZXRUeXBlQWxsb2NTaXplKEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCkpKSB7CisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBsb2FkIG9mIHRoZSBlbnRpcmUgYWxsb2NhIHRvIGFuIGludGVnZXIsIHJld3JpdGUgaXQuCisgICAgICAgIFJld3JpdGVMb2FkVXNlck9mV2hvbGVBbGxvY2EoTEksIEFJLCBOZXdFbHRzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFVzZXIpKSB7CisgICAgICBWYWx1ZSAqVmFsID0gU0ktPmdldE9wZXJhbmQoMCk7CisgICAgICBjb25zdCBUeXBlICpTSVR5cGUgPSBWYWwtPmdldFR5cGUoKTsKKyAgICAgIGlmIChTSVR5cGUgPT0gQUktPmdldEFsbG9jYXRlZFR5cGUoKSkgeworICAgICAgICAvLyBSZXBsYWNlOgorICAgICAgICAvLyAgIHN0b3JlIHsgaTMyLCBpMzIgfSAldmFsLCB7IGkzMiwgaTMyIH0qICVhbGxvYworICAgICAgICAvLyB3aXRoOgorICAgICAgICAvLyAgICV2YWwuMCA9IGV4dHJhY3R2YWx1ZSB7IGkzMiwgaTMyIH0gJXZhbCwgMAorICAgICAgICAvLyAgIHN0b3JlIGkzMiAldmFsLjAsIGkzMiogJWFsbG9jLjAKKyAgICAgICAgLy8gICAldmFsLjEgPSBleHRyYWN0dmFsdWUgeyBpMzIsIGkzMiB9ICV2YWwsIDEKKyAgICAgICAgLy8gICBzdG9yZSBpMzIgJXZhbC4xLCBpMzIqICVhbGxvYy4xCisgICAgICAgIC8vIChBbHNvIHdvcmtzIGZvciBhcnJheXMgaW5zdGVhZCBvZiBzdHJ1Y3RzKQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3RWx0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgVmFsdWUgKkV4dHJhY3QgPSBFeHRyYWN0VmFsdWVJbnN0OjpDcmVhdGUoVmFsLCBpLCBTSSk7CisgICAgICAgICAgbmV3IFN0b3JlSW5zdChFeHRyYWN0LCBOZXdFbHRzW2ldLCBTSSk7CisgICAgICAgIH0KKyAgICAgICAgRGVhZEluc3RzLnB1c2hfYmFjayhTSSk7CisgICAgICB9IGVsc2UgaWYgKFNJVHlwZS0+aXNJbnRlZ2VyVHkoKSAmJgorICAgICAgICAgICAgICAgICBURC0+Z2V0VHlwZUFsbG9jU2l6ZShTSVR5cGUpID09CisgICAgICAgICAgICAgICAgIFRELT5nZXRUeXBlQWxsb2NTaXplKEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCkpKSB7CisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdG9yZSBvZiB0aGUgZW50aXJlIGFsbG9jYSBmcm9tIGFuIGludGVnZXIsIHJld3JpdGUgaXQuCisgICAgICAgIFJld3JpdGVTdG9yZVVzZXJPZldob2xlQWxsb2NhKFNJLCBBSSwgTmV3RWx0cyk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLyBSZXdyaXRlQml0Q2FzdCAtIFVwZGF0ZSBhIGJpdGNhc3QgcmVmZXJlbmNlIHRvIHRoZSBhbGxvY2EgYmVpbmcgcmVwbGFjZWQKKy8vLyBhbmQgcmVjdXJzaXZlbHkgY29udGludWUgdXBkYXRpbmcgYWxsIG9mIGl0cyB1c2VzLgordm9pZCBTUk9BOjpSZXdyaXRlQml0Q2FzdChCaXRDYXN0SW5zdCAqQkMsIEFsbG9jYUluc3QgKkFJLCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPEFsbG9jYUluc3QqLCAzMj4gJk5ld0VsdHMpIHsKKyAgUmV3cml0ZUZvclNjYWxhclJlcGwoQkMsIEFJLCBPZmZzZXQsIE5ld0VsdHMpOworICBpZiAoQkMtPmdldE9wZXJhbmQoMCkgIT0gQUkpCisgICAgcmV0dXJuOworCisgIC8vIFRoZSBiaXRjYXN0IHJlZmVyZW5jZXMgdGhlIG9yaWdpbmFsIGFsbG9jYS4gIFJlcGxhY2UgaXRzIHVzZXMgd2l0aAorICAvLyByZWZlcmVuY2VzIHRvIHRoZSBmaXJzdCBuZXcgZWxlbWVudCBhbGxvY2EuCisgIEluc3RydWN0aW9uICpWYWwgPSBOZXdFbHRzWzBdOworICBpZiAoVmFsLT5nZXRUeXBlKCkgIT0gQkMtPmdldERlc3RUeSgpKSB7CisgICAgVmFsID0gbmV3IEJpdENhc3RJbnN0KFZhbCwgQkMtPmdldERlc3RUeSgpLCBCQyk7CisgICAgVmFsLT50YWtlTmFtZShCQyk7CisgIH0KKyAgQkMtPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOworICBEZWFkSW5zdHMucHVzaF9iYWNrKEJDKTsKK30KKworLy8vIEZpbmRFbGVtZW50QW5kT2Zmc2V0IC0gUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBjb250YWluaW5nIE9mZnNldAorLy8vIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHR5cGUsIHdoaWNoIG11c3QgYmUgZWl0aGVyIGEgc3RydWN0IG9yIGFuIGFycmF5LgorLy8vIFNldHMgVCB0byB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCBhbmQgT2Zmc2V0IHRvIHRoZSBvZmZzZXQgd2l0aGluIHRoYXQKKy8vLyBlbGVtZW50LiAgSWR4VHkgaXMgc2V0IHRvIHRoZSB0eXBlIG9mIHRoZSBpbmRleCByZXN1bHQgdG8gYmUgdXNlZCBpbiBhCisvLy8gR0VQIGluc3RydWN0aW9uLgordWludDY0X3QgU1JPQTo6RmluZEVsZW1lbnRBbmRPZmZzZXQoY29uc3QgVHlwZSAqJlQsIHVpbnQ2NF90ICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlIComSWR4VHkpIHsKKyAgdWludDY0X3QgSWR4ID0gMDsKKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oVCkpIHsKKyAgICBjb25zdCBTdHJ1Y3RMYXlvdXQgKkxheW91dCA9IFRELT5nZXRTdHJ1Y3RMYXlvdXQoU1QpOworICAgIElkeCA9IExheW91dC0+Z2V0RWxlbWVudENvbnRhaW5pbmdPZmZzZXQoT2Zmc2V0KTsKKyAgICBUID0gU1QtPmdldENvbnRhaW5lZFR5cGUoSWR4KTsKKyAgICBPZmZzZXQgLT0gTGF5b3V0LT5nZXRFbGVtZW50T2Zmc2V0KElkeCk7CisgICAgSWR4VHkgPSBUeXBlOjpnZXRJbnQzMlR5KFQtPmdldENvbnRleHQoKSk7CisgICAgcmV0dXJuIElkeDsKKyAgfQorICBjb25zdCBBcnJheVR5cGUgKkFUID0gY2FzdDxBcnJheVR5cGU+KFQpOworICBUID0gQVQtPmdldEVsZW1lbnRUeXBlKCk7CisgIHVpbnQ2NF90IEVsdFNpemUgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShUKTsKKyAgSWR4ID0gT2Zmc2V0IC8gRWx0U2l6ZTsKKyAgT2Zmc2V0IC09IElkeCAqIEVsdFNpemU7CisgIElkeFR5ID0gVHlwZTo6Z2V0SW50NjRUeShULT5nZXRDb250ZXh0KCkpOworICByZXR1cm4gSWR4OworfQorCisvLy8gUmV3cml0ZUdFUCAtIENoZWNrIGlmIHRoaXMgR0VQIGluc3RydWN0aW9uIG1vdmVzIHRoZSBwb2ludGVyIGFjcm9zcworLy8vIGVsZW1lbnRzIG9mIHRoZSBhbGxvY2EgdGhhdCBhcmUgYmVpbmcgc3BsaXQgYXBhcnQsIGFuZCBpZiBzbywgcmV3cml0ZQorLy8vIHRoZSBHRVAgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIG5ldyBlbGVtZW50Lgordm9pZCBTUk9BOjpSZXdyaXRlR0VQKEdldEVsZW1lbnRQdHJJbnN0ICpHRVBJLCBBbGxvY2FJbnN0ICpBSSwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPEFsbG9jYUluc3QqLCAzMj4gJk5ld0VsdHMpIHsKKyAgdWludDY0X3QgT2xkT2Zmc2V0ID0gT2Zmc2V0OworICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IEluZGljZXMoR0VQSS0+b3BfYmVnaW4oKSArIDEsIEdFUEktPm9wX2VuZCgpKTsKKyAgT2Zmc2V0ICs9IFRELT5nZXRJbmRleGVkT2Zmc2V0KEdFUEktPmdldFBvaW50ZXJPcGVyYW5kVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluZGljZXNbMF0sIEluZGljZXMuc2l6ZSgpKTsKKworICBSZXdyaXRlRm9yU2NhbGFyUmVwbChHRVBJLCBBSSwgT2Zmc2V0LCBOZXdFbHRzKTsKKworICBjb25zdCBUeXBlICpUID0gQUktPmdldEFsbG9jYXRlZFR5cGUoKTsKKyAgY29uc3QgVHlwZSAqSWR4VHk7CisgIHVpbnQ2NF90IE9sZElkeCA9IEZpbmRFbGVtZW50QW5kT2Zmc2V0KFQsIE9sZE9mZnNldCwgSWR4VHkpOworICBpZiAoR0VQSS0+Z2V0T3BlcmFuZCgwKSA9PSBBSSkKKyAgICBPbGRJZHggPSB+MFVMTDsgLy8gRm9yY2UgdGhlIEdFUCB0byBiZSByZXdyaXR0ZW4uCisKKyAgVCA9IEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCk7CisgIHVpbnQ2NF90IEVsdE9mZnNldCA9IE9mZnNldDsKKyAgdWludDY0X3QgSWR4ID0gRmluZEVsZW1lbnRBbmRPZmZzZXQoVCwgRWx0T2Zmc2V0LCBJZHhUeSk7CisKKyAgLy8gSWYgdGhpcyBHRVAgZG9lcyBub3QgbW92ZSB0aGUgcG9pbnRlciBhY3Jvc3MgZWxlbWVudHMgb2YgdGhlIGFsbG9jYQorICAvLyBiZWluZyBzcGxpdCwgdGhlbiBpdCBkb2VzIG5vdCBuZWVkcyB0byBiZSByZXdyaXR0ZW4uCisgIGlmIChJZHggPT0gT2xkSWR4KQorICAgIHJldHVybjsKKworICBjb25zdCBUeXBlICppMzJUeSA9IFR5cGU6OmdldEludDMyVHkoQUktPmdldENvbnRleHQoKSk7CisgIFNtYWxsVmVjdG9yPFZhbHVlKiwgOD4gTmV3QXJnczsKKyAgTmV3QXJncy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShpMzJUeSkpOworICB3aGlsZSAoRWx0T2Zmc2V0ICE9IDApIHsKKyAgICB1aW50NjRfdCBFbHRJZHggPSBGaW5kRWxlbWVudEFuZE9mZnNldChULCBFbHRPZmZzZXQsIElkeFR5KTsKKyAgICBOZXdBcmdzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KElkeFR5LCBFbHRJZHgpKTsKKyAgfQorICBJbnN0cnVjdGlvbiAqVmFsID0gTmV3RWx0c1tJZHhdOworICBpZiAoTmV3QXJncy5zaXplKCkgPiAxKSB7CisgICAgVmFsID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZUluQm91bmRzKFZhbCwgTmV3QXJncy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdBcmdzLmVuZCgpLCBHRVBJKTsKKyAgICBWYWwtPnRha2VOYW1lKEdFUEkpOworICB9CisgIGlmIChWYWwtPmdldFR5cGUoKSAhPSBHRVBJLT5nZXRUeXBlKCkpCisgICAgVmFsID0gbmV3IEJpdENhc3RJbnN0KFZhbCwgR0VQSS0+Z2V0VHlwZSgpLCBHRVBJKTsKKyAgR0VQSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFZhbCk7CisgIERlYWRJbnN0cy5wdXNoX2JhY2soR0VQSSk7Cit9CisKKy8vLyBSZXdyaXRlTWVtSW50cmluVXNlck9mQWxsb2NhIC0gTUkgaXMgYSBtZW1jcHkvbWVtc2V0L21lbW1vdmUgZnJvbSBvciB0byBBSS4KKy8vLyBSZXdyaXRlIGl0IHRvIGNvcHkgb3Igc2V0IHRoZSBlbGVtZW50cyBvZiB0aGUgc2NhbGFyaXplZCBtZW1vcnkuCit2b2lkIFNST0E6OlJld3JpdGVNZW1JbnRyaW5Vc2VyT2ZBbGxvY2EoTWVtSW50cmluc2ljICpNSSwgSW5zdHJ1Y3Rpb24gKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhSW5zdCAqQUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8QWxsb2NhSW5zdCosIDMyPiAmTmV3RWx0cykgeworICAvLyBJZiB0aGlzIGlzIGEgbWVtY3B5L21lbW1vdmUsIGNvbnN0cnVjdCB0aGUgb3RoZXIgcG9pbnRlciBhcyB0aGUKKyAgLy8gYXBwcm9wcmlhdGUgdHlwZS4gIFRoZSAiT3RoZXIiIHBvaW50ZXIgaXMgdGhlIHBvaW50ZXIgdGhhdCBnb2VzIHRvIG1lbW9yeQorICAvLyB0aGF0IGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoZSBhbGxvY2EgdGhhdCB3ZSBhcmUgcHJvbW90aW5nLiBGb3IKKyAgLy8gbWVtc2V0LCB0aGlzIFZhbHVlKiBzdGF5cyBudWxsLgorICBWYWx1ZSAqT3RoZXJQdHIgPSAwOworICB1bnNpZ25lZCBNZW1BbGlnbm1lbnQgPSBNSS0+Z2V0QWxpZ25tZW50KCk7CisgIGlmIChNZW1UcmFuc2Zlckluc3QgKk1USSA9IGR5bl9jYXN0PE1lbVRyYW5zZmVySW5zdD4oTUkpKSB7IC8vIG1lbW1vdmUvbWVtY29weQorICAgIGlmIChJbnN0ID09IE1USS0+Z2V0UmF3RGVzdCgpKQorICAgICAgT3RoZXJQdHIgPSBNVEktPmdldFJhd1NvdXJjZSgpOworICAgIGVsc2UgeworICAgICAgYXNzZXJ0KEluc3QgPT0gTVRJLT5nZXRSYXdTb3VyY2UoKSk7CisgICAgICBPdGhlclB0ciA9IE1USS0+Z2V0UmF3RGVzdCgpOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZXJlIGlzIGFuIG90aGVyIHBvaW50ZXIsIHdlIHdhbnQgdG8gY29udmVydCBpdCB0byB0aGUgc2FtZSBwb2ludGVyCisgIC8vIHR5cGUgYXMgQUkgaGFzLCBzbyB3ZSBjYW4gR0VQIHRocm91Z2ggaXQgc2FmZWx5LgorICBpZiAoT3RoZXJQdHIpIHsKKyAgICB1bnNpZ25lZCBBZGRyU3BhY2UgPQorICAgICAgY2FzdDxQb2ludGVyVHlwZT4oT3RoZXJQdHItPmdldFR5cGUoKSktPmdldEFkZHJlc3NTcGFjZSgpOworCisgICAgLy8gUmVtb3ZlIGJpdGNhc3RzIGFuZCBhbGwtemVybyBHRVBzIGZyb20gT3RoZXJQdHIuICBUaGlzIGlzIGFuCisgICAgLy8gb3B0aW1pemF0aW9uLCBidXQgaXQncyBhbHNvIHJlcXVpcmVkIHRvIGRldGVjdCB0aGUgY29ybmVyIGNhc2Ugd2hlcmUKKyAgICAvLyBib3RoIHBvaW50ZXIgb3BlcmFuZHMgYXJlIHJlZmVyZW5jaW5nIHRoZSBzYW1lIG1lbW9yeSwgYW5kIHdoZXJlCisgICAgLy8gT3RoZXJQdHIgbWF5IGJlIGEgYml0Y2FzdCBvciBHRVAgdGhhdCBjdXJyZW50bHkgYmVpbmcgcmV3cml0dGVuLiAgKFRoaXMKKyAgICAvLyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmb3IgbWVtIGludHJpbnNpY3MgdGhhdCBhY2Nlc3MgdGhlIHdob2xlCisgICAgLy8gYWdncmVnYXRlLCBzbyBub24temVybyBHRVBzIGFyZSBub3QgYW4gaXNzdWUgaGVyZS4pCisgICAgT3RoZXJQdHIgPSBPdGhlclB0ci0+c3RyaXBQb2ludGVyQ2FzdHMoKTsKKyAgICAKKyAgICAvLyBDb3B5aW5nIHRoZSBhbGxvY2EgdG8gaXRzZWxmIGlzIGEgbm8tb3A6IGp1c3QgZGVsZXRlIGl0LgorICAgIGlmIChPdGhlclB0ciA9PSBBSSB8fCBPdGhlclB0ciA9PSBOZXdFbHRzWzBdKSB7CisgICAgICAvLyBUaGlzIGNvZGUgd2lsbCBydW4gdHdpY2UgZm9yIGEgbm8tb3AgbWVtY3B5IC0tIG9uY2UgZm9yIGVhY2ggb3BlcmFuZC4KKyAgICAgIC8vIFB1dCBvbmx5IG9uZSByZWZlcmVuY2UgdG8gTUkgb24gdGhlIERlYWRJbnN0cyBsaXN0LgorICAgICAgZm9yIChTbWFsbFZlY3RvcjxWYWx1ZSosIDMyPjo6Y29uc3RfaXRlcmF0b3IgSSA9IERlYWRJbnN0cy5iZWdpbigpLAorICAgICAgICAgICAgIEUgPSBEZWFkSW5zdHMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICBpZiAoKkkgPT0gTUkpIHJldHVybjsKKyAgICAgIERlYWRJbnN0cy5wdXNoX2JhY2soTUkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGUgcG9pbnRlciBpcyBub3QgdGhlIHJpZ2h0IHR5cGUsIGluc2VydCBhIGJpdGNhc3QgdG8gdGhlIHJpZ2h0CisgICAgLy8gdHlwZS4KKyAgICBjb25zdCBUeXBlICpOZXdUeSA9CisgICAgICBQb2ludGVyVHlwZTo6Z2V0KEFJLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCksIEFkZHJTcGFjZSk7CisgICAgCisgICAgaWYgKE90aGVyUHRyLT5nZXRUeXBlKCkgIT0gTmV3VHkpCisgICAgICBPdGhlclB0ciA9IG5ldyBCaXRDYXN0SW5zdChPdGhlclB0ciwgTmV3VHksIE1JKTsKKyAgfQorICAKKyAgLy8gUHJvY2VzcyBlYWNoIGVsZW1lbnQgb2YgdGhlIGFnZ3JlZ2F0ZS4KKyAgVmFsdWUgKlRoZUZuID0gTUktPmdldENhbGxlZFZhbHVlKCk7CisgIGNvbnN0IFR5cGUgKkJ5dGVQdHJUeSA9IE1JLT5nZXRSYXdEZXN0KCktPmdldFR5cGUoKTsKKyAgYm9vbCBTUk9BRGVzdCA9IE1JLT5nZXRSYXdEZXN0KCkgPT0gSW5zdDsKKyAgCisgIENvbnN0YW50ICpaZXJvID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KE1JLT5nZXRDb250ZXh0KCkpKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3RWx0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhIG1lbWNweS9tZW1tb3ZlLCBlbWl0IGEgR0VQIG9mIHRoZSBvdGhlciBlbGVtZW50IGFkZHJlc3MuCisgICAgVmFsdWUgKk90aGVyRWx0ID0gMDsKKyAgICB1bnNpZ25lZCBPdGhlckVsdEFsaWduID0gTWVtQWxpZ25tZW50OworICAgIAorICAgIGlmIChPdGhlclB0cikgeworICAgICAgVmFsdWUgKklkeFsyXSA9IHsgWmVybywKKyAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoTUktPmdldENvbnRleHQoKSksIGkpIH07CisgICAgICBPdGhlckVsdCA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhPdGhlclB0ciwgSWR4LCBJZHggKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUkpOworICAgICAgdWludDY0X3QgRWx0T2Zmc2V0OworICAgICAgY29uc3QgUG9pbnRlclR5cGUgKk90aGVyUHRyVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihPdGhlclB0ci0+Z2V0VHlwZSgpKTsKKyAgICAgIGNvbnN0IFR5cGUgKk90aGVyVHkgPSBPdGhlclB0clR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oT3RoZXJUeSkpIHsKKyAgICAgICAgRWx0T2Zmc2V0ID0gVEQtPmdldFN0cnVjdExheW91dChTVCktPmdldEVsZW1lbnRPZmZzZXQoaSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBUeXBlICpFbHRUeSA9IGNhc3Q8U2VxdWVudGlhbFR5cGU+KE90aGVyVHkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICBFbHRPZmZzZXQgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZShFbHRUeSkqaTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gVGhlIGFsaWdubWVudCBvZiB0aGUgb3RoZXIgcG9pbnRlciBpcyB0aGUgZ3VhcmFudGVlZCBhbGlnbm1lbnQgb2YgdGhlCisgICAgICAvLyBlbGVtZW50LCB3aGljaCBpcyBhZmZlY3RlZCBieSBib3RoIHRoZSBrbm93biBhbGlnbm1lbnQgb2YgdGhlIHdob2xlCisgICAgICAvLyBtZW0gaW50cmluc2ljIGFuZCB0aGUgYWxpZ25tZW50IG9mIHRoZSBlbGVtZW50LiAgSWYgdGhlIGFsaWdubWVudCBvZgorICAgICAgLy8gdGhlIG1lbWNweSAoZi5lLikgaXMgMzIgYnV0IHRoZSBlbGVtZW50IGlzIGF0IGEgNC1ieXRlIG9mZnNldCwgdGhlbiB0aGUKKyAgICAgIC8vIGtub3duIGFsaWdubWVudCBpcyBqdXN0IDQgYnl0ZXMuCisgICAgICBPdGhlckVsdEFsaWduID0gKHVuc2lnbmVkKU1pbkFsaWduKE90aGVyRWx0QWxpZ24sIEVsdE9mZnNldCk7CisgICAgfQorICAgIAorICAgIFZhbHVlICpFbHRQdHIgPSBOZXdFbHRzW2ldOworICAgIGNvbnN0IFR5cGUgKkVsdFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oRWx0UHRyLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgIAorICAgIC8vIElmIHdlIGdvdCBkb3duIHRvIGEgc2NhbGFyLCBpbnNlcnQgYSBsb2FkIG9yIHN0b3JlIGFzIGFwcHJvcHJpYXRlLgorICAgIGlmIChFbHRUeS0+aXNTaW5nbGVWYWx1ZVR5cGUoKSkgeworICAgICAgaWYgKGlzYTxNZW1UcmFuc2Zlckluc3Q+KE1JKSkgeworICAgICAgICBpZiAoU1JPQURlc3QpIHsKKyAgICAgICAgICAvLyBGcm9tIE90aGVyIHRvIEFsbG9jYS4KKyAgICAgICAgICBWYWx1ZSAqRWx0ID0gbmV3IExvYWRJbnN0KE90aGVyRWx0LCBmYWxzZSwgT3RoZXJFbHRBbGlnbiwgTUkpOworICAgICAgICAgIG5ldyBTdG9yZUluc3QoRWx0LCBFbHRQdHIsIE1JKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGcm9tIEFsbG9jYSB0byBPdGhlci4KKyAgICAgICAgICBWYWx1ZSAqRWx0ID0gbmV3IExvYWRJbnN0KEVsdFB0ciwgTUkpOworICAgICAgICAgIG5ldyBTdG9yZUluc3QoRWx0LCBPdGhlckVsdCwgZmFsc2UsIE90aGVyRWx0QWxpZ24sIE1JKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGFzc2VydChpc2E8TWVtU2V0SW5zdD4oTUkpKTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIHN0b3JlZCBlbGVtZW50IGlzIHplcm8gKGNvbW1vbiBjYXNlKSwganVzdCBzdG9yZSBhIG51bGwKKyAgICAgIC8vIGNvbnN0YW50LgorICAgICAgQ29uc3RhbnQgKlN0b3JlVmFsOworICAgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihNSS0+Z2V0QXJnT3BlcmFuZCgxKSkpIHsKKyAgICAgICAgaWYgKENJLT5pc1plcm8oKSkgeworICAgICAgICAgIFN0b3JlVmFsID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7ICAvLyAwLjAsIG51bGwsIDAsIDwwLDA+CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gSWYgRWx0VHkgaXMgYSB2ZWN0b3IgdHlwZSwgZ2V0IHRoZSBlbGVtZW50IHR5cGUuCisgICAgICAgICAgY29uc3QgVHlwZSAqVmFsVHkgPSBFbHRUeS0+Z2V0U2NhbGFyVHlwZSgpOworCisgICAgICAgICAgLy8gQ29uc3RydWN0IGFuIGludGVnZXIgd2l0aCB0aGUgcmlnaHQgdmFsdWUuCisgICAgICAgICAgdW5zaWduZWQgRWx0U2l6ZSA9IFRELT5nZXRUeXBlU2l6ZUluQml0cyhWYWxUeSk7CisgICAgICAgICAgQVBJbnQgT25lVmFsKEVsdFNpemUsIENJLT5nZXRaRXh0VmFsdWUoKSk7CisgICAgICAgICAgQVBJbnQgVG90YWxWYWwoT25lVmFsKTsKKyAgICAgICAgICAvLyBTZXQgZWFjaCBieXRlLgorICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IDgqaSA8IEVsdFNpemU7ICsraSkgeworICAgICAgICAgICAgVG90YWxWYWwgPSBUb3RhbFZhbC5zaGwoOCk7CisgICAgICAgICAgICBUb3RhbFZhbCB8PSBPbmVWYWw7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIC8vIENvbnZlcnQgdGhlIGludGVnZXIgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUuCisgICAgICAgICAgU3RvcmVWYWwgPSBDb25zdGFudEludDo6Z2V0KENJLT5nZXRDb250ZXh0KCksIFRvdGFsVmFsKTsKKyAgICAgICAgICBpZiAoVmFsVHktPmlzUG9pbnRlclR5KCkpCisgICAgICAgICAgICBTdG9yZVZhbCA9IENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoU3RvcmVWYWwsIFZhbFR5KTsKKyAgICAgICAgICBlbHNlIGlmIChWYWxUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSkKKyAgICAgICAgICAgIFN0b3JlVmFsID0gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KFN0b3JlVmFsLCBWYWxUeSk7CisgICAgICAgICAgYXNzZXJ0KFN0b3JlVmFsLT5nZXRUeXBlKCkgPT0gVmFsVHkgJiYgIlR5cGUgbWlzbWF0Y2ghIik7CisgICAgICAgICAgCisgICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3RlZCB2YWx1ZSB3YXMgYSB2ZWN0b3IgY29uc3RhbnQsIGNyZWF0ZSBpdC4KKyAgICAgICAgICBpZiAoRWx0VHkgIT0gVmFsVHkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIE51bUVsdHMgPSBjYXN0PFZlY3RvclR5cGU+KFZhbFR5KS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAgICAgICAgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgMTY+IEVsdHMoTnVtRWx0cywgU3RvcmVWYWwpOworICAgICAgICAgICAgU3RvcmVWYWwgPSBDb25zdGFudFZlY3Rvcjo6Z2V0KCZFbHRzWzBdLCBOdW1FbHRzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbmV3IFN0b3JlSW5zdChTdG9yZVZhbCwgRWx0UHRyLCBNSSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gT3RoZXJ3aXNlLCBpZiB3ZSdyZSBzdG9yaW5nIGEgYnl0ZSB2YXJpYWJsZSwgdXNlIGEgbWVtc2V0IGNhbGwgZm9yCisgICAgICAvLyB0aGlzIGVsZW1lbnQuCisgICAgfQorICAgIAorICAgIC8vIENhc3QgdGhlIGVsZW1lbnQgcG9pbnRlciB0byBCeXRlUHRyVHkuCisgICAgaWYgKEVsdFB0ci0+Z2V0VHlwZSgpICE9IEJ5dGVQdHJUeSkKKyAgICAgIEVsdFB0ciA9IG5ldyBCaXRDYXN0SW5zdChFbHRQdHIsIEJ5dGVQdHJUeSwgTUkpOworICAgIAorICAgIC8vIENhc3QgdGhlIG90aGVyIHBvaW50ZXIgKGlmIHdlIGhhdmUgb25lKSB0byBCeXRlUHRyVHkuIAorICAgIGlmIChPdGhlckVsdCAmJiBPdGhlckVsdC0+Z2V0VHlwZSgpICE9IEJ5dGVQdHJUeSkgeworICAgICAgLy8gUHJlc2VydmUgYWRkcmVzcyBzcGFjZSBvZiBPdGhlckVsdAorICAgICAgY29uc3QgUG9pbnRlclR5cGUqIE90aGVyUFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oT3RoZXJFbHQtPmdldFR5cGUoKSk7CisgICAgICBjb25zdCBQb2ludGVyVHlwZSogUFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oQnl0ZVB0clR5KTsKKyAgICAgIGlmIChPdGhlclBUeS0+Z2V0RWxlbWVudFR5cGUoKSAhPSBQVHktPmdldEVsZW1lbnRUeXBlKCkpIHsKKyAgICAgICAgVHlwZSAqTmV3T3RoZXJQVHkgPSBQb2ludGVyVHlwZTo6Z2V0KFBUeS0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyUFR5LT5nZXRBZGRyZXNzU3BhY2UoKSk7CisgICAgICAgIE90aGVyRWx0ID0gbmV3IEJpdENhc3RJbnN0KE90aGVyRWx0LCBOZXdPdGhlclBUeSwgTUkpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBFbHRTaXplID0gVEQtPmdldFR5cGVBbGxvY1NpemUoRWx0VHkpOworICAgIAorICAgIC8vIEZpbmFsbHksIGluc2VydCB0aGUgbWVtaW5zdCBmb3IgdGhpcyBlbGVtZW50LgorICAgIGlmIChpc2E8TWVtVHJhbnNmZXJJbnN0PihNSSkpIHsKKyAgICAgIFZhbHVlICpPcHNbXSA9IHsKKyAgICAgICAgU1JPQURlc3QgPyBFbHRQdHIgOiBPdGhlckVsdCwgIC8vIERlc3QgcHRyCisgICAgICAgIFNST0FEZXN0ID8gT3RoZXJFbHQgOiBFbHRQdHIsICAvLyBTcmMgcHRyCisgICAgICAgIENvbnN0YW50SW50OjpnZXQoTUktPmdldEFyZ09wZXJhbmQoMiktPmdldFR5cGUoKSwgRWx0U2l6ZSksIC8vIFNpemUKKyAgICAgICAgLy8gQWxpZ24KKyAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KE1JLT5nZXRDb250ZXh0KCkpLCBPdGhlckVsdEFsaWduKSwKKyAgICAgICAgTUktPmdldFZvbGF0aWxlQ3N0KCkKKyAgICAgIH07CisgICAgICAvLyBJbiBjYXNlIHdlIGZvbGQgdGhlIGFkZHJlc3Mgc3BhY2Ugb3ZlcmxvYWRlZCBtZW1jcHkgb2YgQSB0byBCCisgICAgICAvLyB3aXRoIG1lbWNweSBvZiBCIHRvIEMsIGNoYW5nZSB0aGUgZnVuY3Rpb24gdG8gYmUgYSBtZW1jcHkgb2YgQSB0byBDLgorICAgICAgY29uc3QgVHlwZSAqVHlzW10gPSB7IE9wc1swXS0+Z2V0VHlwZSgpLCBPcHNbMV0tPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHNbMl0tPmdldFR5cGUoKSB9OworICAgICAgTW9kdWxlICpNID0gTUktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgICAgICBUaGVGbiA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24oTSwgTUktPmdldEludHJpbnNpY0lEKCksIFR5cywgMyk7CisgICAgICBDYWxsSW5zdDo6Q3JlYXRlKFRoZUZuLCBPcHMsIE9wcyArIDUsICIiLCBNSSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChpc2E8TWVtU2V0SW5zdD4oTUkpKTsKKyAgICAgIFZhbHVlICpPcHNbXSA9IHsKKyAgICAgICAgRWx0UHRyLCBNSS0+Z2V0QXJnT3BlcmFuZCgxKSwgIC8vIERlc3QsIFZhbHVlLAorICAgICAgICBDb25zdGFudEludDo6Z2V0KE1JLT5nZXRBcmdPcGVyYW5kKDIpLT5nZXRUeXBlKCksIEVsdFNpemUpLCAvLyBTaXplCisgICAgICAgIFplcm8sICAvLyBBbGlnbgorICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDFUeShNSS0+Z2V0Q29udGV4dCgpKSwgMCkgLy8gaXNWb2xhdGlsZQorICAgICAgfTsKKyAgICAgIGNvbnN0IFR5cGUgKlR5c1tdID0geyBPcHNbMF0tPmdldFR5cGUoKSwgT3BzWzJdLT5nZXRUeXBlKCkgfTsKKyAgICAgIE1vZHVsZSAqTSA9IE1JLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICAgICAgVGhlRm4gPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKE0sIEludHJpbnNpYzo6bWVtc2V0LCBUeXMsIDIpOworICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShUaGVGbiwgT3BzLCBPcHMgKyA1LCAiIiwgTUkpOworICAgIH0KKyAgfQorICBEZWFkSW5zdHMucHVzaF9iYWNrKE1JKTsKK30KKworLy8vIFJld3JpdGVTdG9yZVVzZXJPZldob2xlQWxsb2NhIC0gV2UgZm91bmQgYSBzdG9yZSBvZiBhbiBpbnRlZ2VyIHRoYXQKKy8vLyBvdmVyd3JpdGVzIHRoZSBlbnRpcmUgYWxsb2NhdGlvbi4gIEV4dHJhY3Qgb3V0IHRoZSBwaWVjZXMgb2YgdGhlIHN0b3JlZAorLy8vIGludGVnZXIgYW5kIHN0b3JlIHRoZW0gaW5kaXZpZHVhbGx5Lgordm9pZCBTUk9BOjpSZXdyaXRlU3RvcmVVc2VyT2ZXaG9sZUFsbG9jYShTdG9yZUluc3QgKlNJLCBBbGxvY2FJbnN0ICpBSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8QWxsb2NhSW5zdCosIDMyPiAmTmV3RWx0cyl7CisgIC8vIEV4dHJhY3QgZWFjaCBlbGVtZW50IG91dCBvZiB0aGUgaW50ZWdlciBhY2NvcmRpbmcgdG8gaXRzIHN0cnVjdHVyZSBvZmZzZXQKKyAgLy8gYW5kIHN0b3JlIHRoZSBlbGVtZW50IHZhbHVlIHRvIHRoZSBpbmRpdmlkdWFsIGFsbG9jYS4KKyAgVmFsdWUgKlNyY1ZhbCA9IFNJLT5nZXRPcGVyYW5kKDApOworICBjb25zdCBUeXBlICpBbGxvY2FFbHRUeSA9IEFJLT5nZXRBbGxvY2F0ZWRUeXBlKCk7CisgIHVpbnQ2NF90IEFsbG9jYVNpemVCaXRzID0gVEQtPmdldFR5cGVBbGxvY1NpemVJbkJpdHMoQWxsb2NhRWx0VHkpOworICAKKyAgLy8gSGFuZGxlIHRhaWwgcGFkZGluZyBieSBleHRlbmRpbmcgdGhlIG9wZXJhbmQKKyAgaWYgKFRELT5nZXRUeXBlU2l6ZUluQml0cyhTcmNWYWwtPmdldFR5cGUoKSkgIT0gQWxsb2NhU2l6ZUJpdHMpCisgICAgU3JjVmFsID0gbmV3IFpFeHRJbnN0KFNyY1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlclR5cGU6OmdldChTSS0+Z2V0Q29udGV4dCgpLCBBbGxvY2FTaXplQml0cyksIAorICAgICAgICAgICAgICAgICAgICAgICAgICBTSSk7CisKKyAgREVCVUcoZGJncygpIDw8ICJQUk9NT1RJTkcgU1RPUkUgVE8gV0hPTEUgQUxMT0NBOiAiIDw8ICpBSSA8PCAnXG4nIDw8ICpTSQorICAgICAgICAgICAgICAgPDwgJ1xuJyk7CisKKyAgLy8gVGhlcmUgYXJlIHR3byBmb3JtcyBoZXJlOiBBSSBjb3VsZCBiZSBhbiBhcnJheSBvciBzdHJ1Y3QuICBCb3RoIGNhc2VzCisgIC8vIGhhdmUgZGlmZmVyZW50IHdheXMgdG8gY29tcHV0ZSB0aGUgZWxlbWVudCBvZmZzZXQuCisgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpFbHRTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihBbGxvY2FFbHRUeSkpIHsKKyAgICBjb25zdCBTdHJ1Y3RMYXlvdXQgKkxheW91dCA9IFRELT5nZXRTdHJ1Y3RMYXlvdXQoRWx0U1R5KTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3RWx0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IFNyY1ZhbCB0byBnZXQgdGhlIHZhbHVlLgorICAgICAgY29uc3QgVHlwZSAqRmllbGRUeSA9IEVsdFNUeS0+Z2V0RWxlbWVudFR5cGUoaSk7CisgICAgICB1aW50NjRfdCBTaGlmdCA9IExheW91dC0+Z2V0RWxlbWVudE9mZnNldEluQml0cyhpKTsKKyAgICAgIAorICAgICAgaWYgKFRELT5pc0JpZ0VuZGlhbigpKQorICAgICAgICBTaGlmdCA9IEFsbG9jYVNpemVCaXRzLVNoaWZ0LVRELT5nZXRUeXBlQWxsb2NTaXplSW5CaXRzKEZpZWxkVHkpOworICAgICAgCisgICAgICBWYWx1ZSAqRWx0VmFsID0gU3JjVmFsOworICAgICAgaWYgKFNoaWZ0KSB7CisgICAgICAgIFZhbHVlICpTaGlmdFZhbCA9IENvbnN0YW50SW50OjpnZXQoRWx0VmFsLT5nZXRUeXBlKCksIFNoaWZ0KTsKKyAgICAgICAgRWx0VmFsID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUxTaHIoRWx0VmFsLCBTaGlmdFZhbCwgU0kpOworICAgICAgfQorICAgICAgCisgICAgICAvLyBUcnVuY2F0ZSBkb3duIHRvIGFuIGludGVnZXIgb2YgdGhlIHJpZ2h0IHNpemUuCisgICAgICB1aW50NjRfdCBGaWVsZFNpemVCaXRzID0gVEQtPmdldFR5cGVTaXplSW5CaXRzKEZpZWxkVHkpOworICAgICAgCisgICAgICAvLyBJZ25vcmUgemVybyBzaXplZCBmaWVsZHMgbGlrZSB7fSwgdGhleSBvYnZpb3VzbHkgY29udGFpbiBubyBkYXRhLgorICAgICAgaWYgKEZpZWxkU2l6ZUJpdHMgPT0gMCkgY29udGludWU7CisgICAgICAKKyAgICAgIGlmIChGaWVsZFNpemVCaXRzICE9IEFsbG9jYVNpemVCaXRzKQorICAgICAgICBFbHRWYWwgPSBuZXcgVHJ1bmNJbnN0KEVsdFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlclR5cGU6OmdldChTSS0+Z2V0Q29udGV4dCgpLCBGaWVsZFNpemVCaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJKTsKKyAgICAgIFZhbHVlICpEZXN0RmllbGQgPSBOZXdFbHRzW2ldOworICAgICAgaWYgKEVsdFZhbC0+Z2V0VHlwZSgpID09IEZpZWxkVHkpIHsKKyAgICAgICAgLy8gU3RvcmluZyB0byBhbiBpbnRlZ2VyIGZpZWxkIG9mIHRoaXMgc2l6ZSwganVzdCBkbyBpdC4KKyAgICAgIH0gZWxzZSBpZiAoRmllbGRUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSB8fCBGaWVsZFR5LT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgICAgLy8gQml0Y2FzdCB0byB0aGUgcmlnaHQgZWxlbWVudCB0eXBlIChmb3IgZnAvdmVjdG9yIHZhbHVlcykuCisgICAgICAgIEVsdFZhbCA9IG5ldyBCaXRDYXN0SW5zdChFbHRWYWwsIEZpZWxkVHksIFNJKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE90aGVyd2lzZSwgYml0Y2FzdCB0aGUgZGVzdCBwb2ludGVyIChmb3IgYWdncmVnYXRlcykuCisgICAgICAgIERlc3RGaWVsZCA9IG5ldyBCaXRDYXN0SW5zdChEZXN0RmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEVsdFZhbC0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJKTsKKyAgICAgIH0KKyAgICAgIG5ldyBTdG9yZUluc3QoRWx0VmFsLCBEZXN0RmllbGQsIFNJKTsKKyAgICB9CisgICAgCisgIH0gZWxzZSB7CisgICAgY29uc3QgQXJyYXlUeXBlICpBVHkgPSBjYXN0PEFycmF5VHlwZT4oQWxsb2NhRWx0VHkpOworICAgIGNvbnN0IFR5cGUgKkFycmF5RWx0VHkgPSBBVHktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgdWludDY0X3QgRWxlbWVudE9mZnNldCA9IFRELT5nZXRUeXBlQWxsb2NTaXplSW5CaXRzKEFycmF5RWx0VHkpOworICAgIHVpbnQ2NF90IEVsZW1lbnRTaXplQml0cyA9IFRELT5nZXRUeXBlU2l6ZUluQml0cyhBcnJheUVsdFR5KTsKKworICAgIHVpbnQ2NF90IFNoaWZ0OworICAgIAorICAgIGlmIChURC0+aXNCaWdFbmRpYW4oKSkKKyAgICAgIFNoaWZ0ID0gQWxsb2NhU2l6ZUJpdHMtRWxlbWVudE9mZnNldDsKKyAgICBlbHNlIAorICAgICAgU2hpZnQgPSAwOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOZXdFbHRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIC8vIElnbm9yZSB6ZXJvIHNpemVkIGZpZWxkcyBsaWtlIHt9LCB0aGV5IG9idmlvdXNseSBjb250YWluIG5vIGRhdGEuCisgICAgICBpZiAoRWxlbWVudFNpemVCaXRzID09IDApIGNvbnRpbnVlOworICAgICAgCisgICAgICBWYWx1ZSAqRWx0VmFsID0gU3JjVmFsOworICAgICAgaWYgKFNoaWZ0KSB7CisgICAgICAgIFZhbHVlICpTaGlmdFZhbCA9IENvbnN0YW50SW50OjpnZXQoRWx0VmFsLT5nZXRUeXBlKCksIFNoaWZ0KTsKKyAgICAgICAgRWx0VmFsID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUxTaHIoRWx0VmFsLCBTaGlmdFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0kpOworICAgICAgfQorICAgICAgCisgICAgICAvLyBUcnVuY2F0ZSBkb3duIHRvIGFuIGludGVnZXIgb2YgdGhlIHJpZ2h0IHNpemUuCisgICAgICBpZiAoRWxlbWVudFNpemVCaXRzICE9IEFsbG9jYVNpemVCaXRzKQorICAgICAgICBFbHRWYWwgPSBuZXcgVHJ1bmNJbnN0KEVsdFZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlclR5cGU6OmdldChTSS0+Z2V0Q29udGV4dCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRTaXplQml0cyksIFNJKTsKKyAgICAgIFZhbHVlICpEZXN0RmllbGQgPSBOZXdFbHRzW2ldOworICAgICAgaWYgKEVsdFZhbC0+Z2V0VHlwZSgpID09IEFycmF5RWx0VHkpIHsKKyAgICAgICAgLy8gU3RvcmluZyB0byBhbiBpbnRlZ2VyIGZpZWxkIG9mIHRoaXMgc2l6ZSwganVzdCBkbyBpdC4KKyAgICAgIH0gZWxzZSBpZiAoQXJyYXlFbHRUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSB8fAorICAgICAgICAgICAgICAgICBBcnJheUVsdFR5LT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgICAgLy8gQml0Y2FzdCB0byB0aGUgcmlnaHQgZWxlbWVudCB0eXBlIChmb3IgZnAvdmVjdG9yIHZhbHVlcykuCisgICAgICAgIEVsdFZhbCA9IG5ldyBCaXRDYXN0SW5zdChFbHRWYWwsIEFycmF5RWx0VHksIFNJKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE90aGVyd2lzZSwgYml0Y2FzdCB0aGUgZGVzdCBwb2ludGVyIChmb3IgYWdncmVnYXRlcykuCisgICAgICAgIERlc3RGaWVsZCA9IG5ldyBCaXRDYXN0SW5zdChEZXN0RmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEVsdFZhbC0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJKTsKKyAgICAgIH0KKyAgICAgIG5ldyBTdG9yZUluc3QoRWx0VmFsLCBEZXN0RmllbGQsIFNJKTsKKyAgICAgIAorICAgICAgaWYgKFRELT5pc0JpZ0VuZGlhbigpKQorICAgICAgICBTaGlmdCAtPSBFbGVtZW50T2Zmc2V0OworICAgICAgZWxzZSAKKyAgICAgICAgU2hpZnQgKz0gRWxlbWVudE9mZnNldDsKKyAgICB9CisgIH0KKyAgCisgIERlYWRJbnN0cy5wdXNoX2JhY2soU0kpOworfQorCisvLy8gUmV3cml0ZUxvYWRVc2VyT2ZXaG9sZUFsbG9jYSAtIFdlIGZvdW5kIGEgbG9hZCBvZiB0aGUgZW50aXJlIGFsbG9jYXRpb24gdG8KKy8vLyBhbiBpbnRlZ2VyLiAgTG9hZCB0aGUgaW5kaXZpZHVhbCBwaWVjZXMgdG8gZm9ybSB0aGUgYWdncmVnYXRlIHZhbHVlLgordm9pZCBTUk9BOjpSZXdyaXRlTG9hZFVzZXJPZldob2xlQWxsb2NhKExvYWRJbnN0ICpMSSwgQWxsb2NhSW5zdCAqQUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8QWxsb2NhSW5zdCosIDMyPiAmTmV3RWx0cykgeworICAvLyBFeHRyYWN0IGVhY2ggZWxlbWVudCBvdXQgb2YgdGhlIE5ld0VsdHMgYWNjb3JkaW5nIHRvIGl0cyBzdHJ1Y3R1cmUgb2Zmc2V0CisgIC8vIGFuZCBmb3JtIHRoZSByZXN1bHQgdmFsdWUuCisgIGNvbnN0IFR5cGUgKkFsbG9jYUVsdFR5ID0gQUktPmdldEFsbG9jYXRlZFR5cGUoKTsKKyAgdWludDY0X3QgQWxsb2NhU2l6ZUJpdHMgPSBURC0+Z2V0VHlwZUFsbG9jU2l6ZUluQml0cyhBbGxvY2FFbHRUeSk7CisgIAorICBERUJVRyhkYmdzKCkgPDwgIlBST01PVElORyBMT0FEIE9GIFdIT0xFIEFMTE9DQTogIiA8PCAqQUkgPDwgJ1xuJyA8PCAqTEkKKyAgICAgICAgICAgICAgIDw8ICdcbicpOworICAKKyAgLy8gVGhlcmUgYXJlIHR3byBmb3JtcyBoZXJlOiBBSSBjb3VsZCBiZSBhbiBhcnJheSBvciBzdHJ1Y3QuICBCb3RoIGNhc2VzCisgIC8vIGhhdmUgZGlmZmVyZW50IHdheXMgdG8gY29tcHV0ZSB0aGUgZWxlbWVudCBvZmZzZXQuCisgIGNvbnN0IFN0cnVjdExheW91dCAqTGF5b3V0ID0gMDsKKyAgdWludDY0X3QgQXJyYXlFbHRCaXRPZmZzZXQgPSAwOworICBpZiAoY29uc3QgU3RydWN0VHlwZSAqRWx0U1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oQWxsb2NhRWx0VHkpKSB7CisgICAgTGF5b3V0ID0gVEQtPmdldFN0cnVjdExheW91dChFbHRTVHkpOworICB9IGVsc2UgeworICAgIGNvbnN0IFR5cGUgKkFycmF5RWx0VHkgPSBjYXN0PEFycmF5VHlwZT4oQWxsb2NhRWx0VHkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgIEFycmF5RWx0Qml0T2Zmc2V0ID0gVEQtPmdldFR5cGVBbGxvY1NpemVJbkJpdHMoQXJyYXlFbHRUeSk7CisgIH0gICAgCisgIAorICBWYWx1ZSAqUmVzdWx0VmFsID0gCisgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJbnRlZ2VyVHlwZTo6Z2V0KExJLT5nZXRDb250ZXh0KCksIEFsbG9jYVNpemVCaXRzKSk7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3RWx0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gTG9hZCB0aGUgdmFsdWUgZnJvbSB0aGUgYWxsb2NhLiAgSWYgdGhlIE5ld0VsdCBpcyBhbiBhZ2dyZWdhdGUsIGNhc3QKKyAgICAvLyB0aGUgcG9pbnRlciB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzYW1lIHNpemUgYmVmb3JlIGRvaW5nIHRoZSBsb2FkLgorICAgIFZhbHVlICpTcmNGaWVsZCA9IE5ld0VsdHNbaV07CisgICAgY29uc3QgVHlwZSAqRmllbGRUeSA9CisgICAgICBjYXN0PFBvaW50ZXJUeXBlPihTcmNGaWVsZC0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICB1aW50NjRfdCBGaWVsZFNpemVCaXRzID0gVEQtPmdldFR5cGVTaXplSW5CaXRzKEZpZWxkVHkpOworICAgIAorICAgIC8vIElnbm9yZSB6ZXJvIHNpemVkIGZpZWxkcyBsaWtlIHt9LCB0aGV5IG9idmlvdXNseSBjb250YWluIG5vIGRhdGEuCisgICAgaWYgKEZpZWxkU2l6ZUJpdHMgPT0gMCkgY29udGludWU7CisgICAgCisgICAgY29uc3QgSW50ZWdlclR5cGUgKkZpZWxkSW50VHkgPSBJbnRlZ2VyVHlwZTo6Z2V0KExJLT5nZXRDb250ZXh0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNpemVCaXRzKTsKKyAgICBpZiAoIUZpZWxkVHktPmlzSW50ZWdlclR5KCkgJiYgIUZpZWxkVHktPmlzRmxvYXRpbmdQb2ludFR5KCkgJiYKKyAgICAgICAgIUZpZWxkVHktPmlzVmVjdG9yVHkoKSkKKyAgICAgIFNyY0ZpZWxkID0gbmV3IEJpdENhc3RJbnN0KFNyY0ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChGaWVsZEludFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJKTsKKyAgICBTcmNGaWVsZCA9IG5ldyBMb2FkSW5zdChTcmNGaWVsZCwgTEkpOworCisgICAgLy8gSWYgU3JjRmllbGQgaXMgYSBmcCBvciB2ZWN0b3Igb2YgdGhlIHJpZ2h0IHNpemUgYnV0IHRoYXQgaXNuJ3QgYW4KKyAgICAvLyBpbnRlZ2VyIHR5cGUsIGJpdGNhc3QgdG8gYW4gaW50ZWdlciBzbyB3ZSBjYW4gc2hpZnQgaXQuCisgICAgaWYgKFNyY0ZpZWxkLT5nZXRUeXBlKCkgIT0gRmllbGRJbnRUeSkKKyAgICAgIFNyY0ZpZWxkID0gbmV3IEJpdENhc3RJbnN0KFNyY0ZpZWxkLCBGaWVsZEludFR5LCBMSSk7CisKKyAgICAvLyBaZXJvIGV4dGVuZCB0aGUgZmllbGQgdG8gYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZmluYWwgYWxsb2NhIHNvIHRoYXQKKyAgICAvLyB3ZSBjYW4gc2hpZnQgYW5kIGluc2VydCBpdC4KKyAgICBpZiAoU3JjRmllbGQtPmdldFR5cGUoKSAhPSBSZXN1bHRWYWwtPmdldFR5cGUoKSkKKyAgICAgIFNyY0ZpZWxkID0gbmV3IFpFeHRJbnN0KFNyY0ZpZWxkLCBSZXN1bHRWYWwtPmdldFR5cGUoKSwgTEkpOworICAgIAorICAgIC8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgU3JjRmllbGQuCisgICAgdWludDY0X3QgU2hpZnQ7CisgICAgaWYgKExheW91dCkgLy8gU3RydWN0IGNhc2UuCisgICAgICBTaGlmdCA9IExheW91dC0+Z2V0RWxlbWVudE9mZnNldEluQml0cyhpKTsKKyAgICBlbHNlICAvLyBBcnJheSBjYXNlLgorICAgICAgU2hpZnQgPSBpKkFycmF5RWx0Qml0T2Zmc2V0OworICAgIAorICAgIGlmIChURC0+aXNCaWdFbmRpYW4oKSkKKyAgICAgIFNoaWZ0ID0gQWxsb2NhU2l6ZUJpdHMtU2hpZnQtRmllbGRJbnRUeS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAKKyAgICBpZiAoU2hpZnQpIHsKKyAgICAgIFZhbHVlICpTaGlmdFZhbCA9IENvbnN0YW50SW50OjpnZXQoU3JjRmllbGQtPmdldFR5cGUoKSwgU2hpZnQpOworICAgICAgU3JjRmllbGQgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKFNyY0ZpZWxkLCBTaGlmdFZhbCwgTEkpOworICAgIH0KKworICAgIC8vIERvbid0IGNyZWF0ZSBhbiAnb3IgeCwgMCcgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbi4KKyAgICBpZiAoIWlzYTxDb25zdGFudD4oUmVzdWx0VmFsKSB8fAorICAgICAgICAhY2FzdDxDb25zdGFudD4oUmVzdWx0VmFsKS0+aXNOdWxsVmFsdWUoKSkKKyAgICAgIFJlc3VsdFZhbCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihTcmNGaWVsZCwgUmVzdWx0VmFsLCBMSSk7CisgICAgZWxzZQorICAgICAgUmVzdWx0VmFsID0gU3JjRmllbGQ7CisgIH0KKworICAvLyBIYW5kbGUgdGFpbCBwYWRkaW5nIGJ5IHRydW5jYXRpbmcgdGhlIHJlc3VsdAorICBpZiAoVEQtPmdldFR5cGVTaXplSW5CaXRzKExJLT5nZXRUeXBlKCkpICE9IEFsbG9jYVNpemVCaXRzKQorICAgIFJlc3VsdFZhbCA9IG5ldyBUcnVuY0luc3QoUmVzdWx0VmFsLCBMSS0+Z2V0VHlwZSgpLCBMSSk7CisKKyAgTEktPnJlcGxhY2VBbGxVc2VzV2l0aChSZXN1bHRWYWwpOworICBEZWFkSW5zdHMucHVzaF9iYWNrKExJKTsKK30KKworLy8vIEhhc1BhZGRpbmcgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaGFzIGFueSBzdHJ1Y3R1cmUgb3IKKy8vLyBhbGlnbm1lbnQgcGFkZGluZywgZmFsc2Ugb3RoZXJ3aXNlLgorc3RhdGljIGJvb2wgSGFzUGFkZGluZyhjb25zdCBUeXBlICpUeSwgY29uc3QgVGFyZ2V0RGF0YSAmVEQpIHsKKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkgeworICAgIGNvbnN0IFN0cnVjdExheW91dCAqU0wgPSBURC5nZXRTdHJ1Y3RMYXlvdXQoU1R5KTsKKyAgICB1bnNpZ25lZCBQcmV2RmllbGRCaXRPZmZzZXQgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBGaWVsZEJpdE9mZnNldCA9IFNMLT5nZXRFbGVtZW50T2Zmc2V0SW5CaXRzKGkpOworCisgICAgICAvLyBQYWRkaW5nIGluIHN1Yi1lbGVtZW50cz8KKyAgICAgIGlmIChIYXNQYWRkaW5nKFNUeS0+Z2V0RWxlbWVudFR5cGUoaSksIFREKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnkgcGFkZGluZyBiZXR3ZWVuIHRoaXMgZWxlbWVudCBhbmQgdGhlCisgICAgICAvLyBwcmV2aW91cyBvbmUuCisgICAgICBpZiAoaSkgeworICAgICAgICB1bnNpZ25lZCBQcmV2RmllbGRFbmQgPQorICAgICAgICBQcmV2RmllbGRCaXRPZmZzZXQrVEQuZ2V0VHlwZVNpemVJbkJpdHMoU1R5LT5nZXRFbGVtZW50VHlwZShpLTEpKTsKKyAgICAgICAgaWYgKFByZXZGaWVsZEVuZCA8IEZpZWxkQml0T2Zmc2V0KQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBQcmV2RmllbGRCaXRPZmZzZXQgPSBGaWVsZEJpdE9mZnNldDsKKyAgICB9CisKKyAgICAvLyAgQ2hlY2sgZm9yIHRhaWwgcGFkZGluZy4KKyAgICBpZiAodW5zaWduZWQgRWx0Q291bnQgPSBTVHktPmdldE51bUVsZW1lbnRzKCkpIHsKKyAgICAgIHVuc2lnbmVkIFByZXZGaWVsZEVuZCA9IFByZXZGaWVsZEJpdE9mZnNldCArCisgICAgICAgICAgICAgICAgICAgVEQuZ2V0VHlwZVNpemVJbkJpdHMoU1R5LT5nZXRFbGVtZW50VHlwZShFbHRDb3VudC0xKSk7CisgICAgICBpZiAoUHJldkZpZWxkRW5kIDwgU0wtPmdldFNpemVJbkJpdHMoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIH0gZWxzZSBpZiAoY29uc3QgQXJyYXlUeXBlICpBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KFR5KSkgeworICAgIHJldHVybiBIYXNQYWRkaW5nKEFUeS0+Z2V0RWxlbWVudFR5cGUoKSwgVEQpOworICB9IGVsc2UgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KFR5KSkgeworICAgIHJldHVybiBIYXNQYWRkaW5nKFZUeS0+Z2V0RWxlbWVudFR5cGUoKSwgVEQpOworICB9CisgIHJldHVybiBURC5nZXRUeXBlU2l6ZUluQml0cyhUeSkgIT0gVEQuZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyhUeSk7Cit9CisKKy8vLyBpc1NhZmVTdHJ1Y3RBbGxvY2FUb1NjYWxhclJlcGwgLSBDaGVjayB0byBzZWUgaWYgdGhlIHNwZWNpZmllZCBhbGxvY2F0aW9uIG9mCisvLy8gYW4gYWdncmVnYXRlIGNhbiBiZSBicm9rZW4gZG93biBpbnRvIGVsZW1lbnRzLiAgUmV0dXJuIDAgaWYgbm90LCAzIGlmIHNhZmUsCisvLy8gb3IgMSBpZiBzYWZlIGFmdGVyIGNhbm9uaWNhbGl6YXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkLgorYm9vbCBTUk9BOjppc1NhZmVBbGxvY2FUb1NjYWxhclJlcGwoQWxsb2NhSW5zdCAqQUkpIHsKKyAgLy8gTG9vcCBvdmVyIHRoZSB1c2UgbGlzdCBvZiB0aGUgYWxsb2NhLiAgV2UgY2FuIG9ubHkgdHJhbnNmb3JtIGl0IGlmIGFsbCBvZgorICAvLyB0aGUgdXNlcnMgYXJlIHNhZmUgdG8gdHJhbnNmb3JtLgorICBBbGxvY2FJbmZvIEluZm87CisgIAorICBpc1NhZmVGb3JTY2FsYXJSZXBsKEFJLCBBSSwgMCwgSW5mbyk7CisgIGlmIChJbmZvLmlzVW5zYWZlKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJDYW5ub3QgdHJhbnNmb3JtOiAiIDw8ICpBSSA8PCAnXG4nKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIC8vIE9rYXksIHdlIGtub3cgYWxsIHRoZSB1c2VycyBhcmUgcHJvbW90YWJsZS4gIElmIHRoZSBhZ2dyZWdhdGUgaXMgYSBtZW1jcHkKKyAgLy8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiwgd2UgaGF2ZSB0byBiZSBjYXJlZnVsLiAgSW4gcGFydGljdWxhciwgdGhlIG1lbWNweQorICAvLyBjb3VsZCBiZSBtb3ZpbmcgYXJvdW5kIGVsZW1lbnRzIHRoYXQgbGl2ZSBpbiBzdHJ1Y3R1cmUgcGFkZGluZyBvZiB0aGUgTExWTQorICAvLyB0eXBlcywgYnV0IG1heSBhY3R1YWxseSBiZSB1c2VkLiAgSW4gdGhlc2UgY2FzZXMsIHdlIHJlZnVzZSB0byBwcm9tb3RlIHRoZQorICAvLyBzdHJ1Y3QuCisgIGlmIChJbmZvLmlzTWVtQ3B5U3JjICYmIEluZm8uaXNNZW1DcHlEc3QgJiYKKyAgICAgIEhhc1BhZGRpbmcoQUktPmdldEFsbG9jYXRlZFR5cGUoKSwgKlREKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworCisvLy8gUG9pbnRzVG9Db25zdGFudEdsb2JhbCAtIFJldHVybiB0cnVlIGlmIFYgKHBvc3NpYmx5IGluZGlyZWN0bHkpIHBvaW50cyB0bworLy8vIHNvbWUgcGFydCBvZiBhIGNvbnN0YW50IGdsb2JhbCB2YXJpYWJsZS4gIFRoaXMgaW50ZW50aW9uYWxseSBvbmx5IGFjY2VwdHMKKy8vLyBjb25zdGFudCBleHByZXNzaW9ucyBiZWNhdXNlIHdlIGRvbid0IGNhbid0IHJld3JpdGUgYXJiaXRyYXJ5IGluc3RydWN0aW9ucy4KK3N0YXRpYyBib29sIFBvaW50c1RvQ29uc3RhbnRHbG9iYWwoVmFsdWUgKlYpIHsKKyAgaWYgKEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihWKSkKKyAgICByZXR1cm4gR1YtPmlzQ29uc3RhbnQoKTsKKyAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKQorICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QgfHwgCisgICAgICAgIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cikKKyAgICAgIHJldHVybiBQb2ludHNUb0NvbnN0YW50R2xvYmFsKENFLT5nZXRPcGVyYW5kKDApKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gaXNPbmx5Q29waWVkRnJvbUNvbnN0YW50R2xvYmFsIC0gUmVjdXJzaXZlbHkgd2FsayB0aGUgdXNlcyBvZiBhIChkZXJpdmVkKQorLy8vIHBvaW50ZXIgdG8gYW4gYWxsb2NhLiAgSWdub3JlIGFueSByZWFkcyBvZiB0aGUgcG9pbnRlciwgcmV0dXJuIGZhbHNlIGlmIHdlCisvLy8gc2VlIGFueSBzdG9yZXMgb3Igb3RoZXIgdW5rbm93biB1c2VzLiAgSWYgd2Ugc2VlIHBvaW50ZXIgYXJpdGhtZXRpYywga2VlcAorLy8vIHRyYWNrIG9mIHdoZXRoZXIgaXQgbW92ZXMgdGhlIHBvaW50ZXIgKHdpdGggaXNPZmZzZXQpIGJ1dCBvdGhlcndpc2UgdHJhdmVyc2UKKy8vLyB0aGUgdXNlcy4gIElmIHdlIHNlZSBhIG1lbWNweS9tZW1tb3ZlIHRoYXQgdGFyZ2V0cyBhbiB1bm9mZnNldGVkIHBvaW50ZXIgdG8KKy8vLyB0aGUgYWxsb2NhLCBhbmQgaWYgdGhlIHNvdXJjZSBwb2ludGVyIGlzIGEgcG9pbnRlciB0byBhIGNvbnN0YW50ICBnbG9iYWwsIHdlCisvLy8gY2FuIG9wdGltaXplIHRoaXMuCitzdGF0aWMgYm9vbCBpc09ubHlDb3BpZWRGcm9tQ29uc3RhbnRHbG9iYWwoVmFsdWUgKlYsIE1lbVRyYW5zZmVySW5zdCAqJlRoZUNvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc09mZnNldCkgeworICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBWLT51c2VfYmVnaW4oKSwgRSA9IFYtPnVzZV9lbmQoKTsgVUkhPUU7ICsrVUkpIHsKKyAgICBVc2VyICpVID0gY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKworICAgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oVSkpCisgICAgICAvLyBJZ25vcmUgbm9uLXZvbGF0aWxlIGxvYWRzLCB0aGV5IGFyZSBhbHdheXMgb2suCisgICAgICBpZiAoIUxJLT5pc1ZvbGF0aWxlKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgIAorICAgIGlmIChCaXRDYXN0SW5zdCAqQkNJID0gZHluX2Nhc3Q8Qml0Q2FzdEluc3Q+KFUpKSB7CisgICAgICAvLyBJZiB1c2VzIG9mIHRoZSBiaXRjYXN0IGFyZSBvaywgd2UgYXJlIG9rLgorICAgICAgaWYgKCFpc09ubHlDb3BpZWRGcm9tQ29uc3RhbnRHbG9iYWwoQkNJLCBUaGVDb3B5LCBpc09mZnNldCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoR2V0RWxlbWVudFB0ckluc3QgKkdFUCA9IGR5bl9jYXN0PEdldEVsZW1lbnRQdHJJbnN0PihVKSkgeworICAgICAgLy8gSWYgdGhlIEdFUCBoYXMgYWxsIHplcm8gaW5kaWNlcywgaXQgZG9lc24ndCBvZmZzZXQgdGhlIHBvaW50ZXIuICBJZiBpdAorICAgICAgLy8gZG9lc24ndCwgaXQgZG9lcy4KKyAgICAgIGlmICghaXNPbmx5Q29waWVkRnJvbUNvbnN0YW50R2xvYmFsKEdFUCwgVGhlQ29weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPZmZzZXQgfHwgIUdFUC0+aGFzQWxsWmVyb0luZGljZXMoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGlzbid0IG91ciBtZW1jcHkvbWVtbW92ZSwgcmVqZWN0IGl0IGFzIHNvbWV0aGluZyB3ZSBjYW4ndAorICAgIC8vIGhhbmRsZS4KKyAgICBNZW1UcmFuc2Zlckluc3QgKk1JID0gZHluX2Nhc3Q8TWVtVHJhbnNmZXJJbnN0PihVKTsKKyAgICBpZiAoTUkgPT0gMCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBzZWVuIGEgY29weSwgcmVqZWN0IHRoZSBzZWNvbmQgb25lLgorICAgIGlmIChUaGVDb3B5KSByZXR1cm4gZmFsc2U7CisgICAgCisgICAgLy8gSWYgdGhlIHBvaW50ZXIgaGFzIGJlZW4gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBhbGxvY2EsIHdlIGNhbid0CisgICAgLy8gc2FmZWx5IGhhbmRsZSB0aGlzLgorICAgIGlmIChpc09mZnNldCkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhlIG1lbWludHJpbnNpYyBpc24ndCB1c2luZyB0aGUgYWxsb2NhIGFzIHRoZSBkZXN0LCByZWplY3QgaXQuCisgICAgaWYgKFVJLmdldE9wZXJhbmRObygpICE9IDApIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAvLyBJZiB0aGUgc291cmNlIG9mIHRoZSBtZW1jcHkvbW92ZSBpcyBub3QgYSBjb25zdGFudCBnbG9iYWwsIHJlamVjdCBpdC4KKyAgICBpZiAoIVBvaW50c1RvQ29uc3RhbnRHbG9iYWwoTUktPmdldFNvdXJjZSgpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIHRoZSB0cmFuc2Zvcm0gaXMgc2FmZS4gIFJlbWVtYmVyIHRoZSBjb3B5IGluc3RydWN0aW9uLgorICAgIFRoZUNvcHkgPSBNSTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzT25seUNvcGllZEZyb21Db25zdGFudEdsb2JhbCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYWxsb2NhIGlzIG9ubHkKKy8vLyBtb2RpZmllZCBieSBhIGNvcHkgZnJvbSBhIGNvbnN0YW50IGdsb2JhbC4gIElmIHdlIGNhbiBwcm92ZSB0aGlzLCB3ZSBjYW4KKy8vLyByZXBsYWNlIGFueSB1c2VzIG9mIHRoZSBhbGxvY2Egd2l0aCB1c2VzIG9mIHRoZSBnbG9iYWwgZGlyZWN0bHkuCitNZW1UcmFuc2Zlckluc3QgKlNST0E6OmlzT25seUNvcGllZEZyb21Db25zdGFudEdsb2JhbChBbGxvY2FJbnN0ICpBSSkgeworICBNZW1UcmFuc2Zlckluc3QgKlRoZUNvcHkgPSAwOworICBpZiAoOjppc09ubHlDb3BpZWRGcm9tQ29uc3RhbnRHbG9iYWwoQUksIFRoZUNvcHksIGZhbHNlKSkKKyAgICByZXR1cm4gVGhlQ29weTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvU2ltcGxpZnlDRkdQYXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1NjYWxhci9TaW1wbGlmeUNGR1Bhc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjhmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9TY2FsYXIvU2ltcGxpZnlDRkdQYXNzLmNwcApAQCAtMCwwICsxLDMwMiBAQAorLy89PT0tIFNpbXBsaWZ5Q0ZHUGFzcy5jcHAgLSBDRkcgU2ltcGxpZmljYXRpb24gUGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBkZWFkIGNvZGUgZWxpbWluYXRpb24gYW5kIGJhc2ljIGJsb2NrIG1lcmdpbmcsIGFsb25nCisvLyB3aXRoIGEgY29sbGVjdGlvbiBvZiBvdGhlciBwZWVwaG9sZSBjb250cm9sIGZsb3cgb3B0aW1pemF0aW9ucy4gIEZvciBleGFtcGxlOgorLy8KKy8vICAgKiBSZW1vdmVzIGJhc2ljIGJsb2NrcyB3aXRoIG5vIHByZWRlY2Vzc29ycy4KKy8vICAgKiBNZXJnZXMgYSBiYXNpYyBibG9jayBpbnRvIGl0cyBwcmVkZWNlc3NvciBpZiB0aGVyZSBpcyBvbmx5IG9uZSBhbmQgdGhlCisvLyAgICAgcHJlZGVjZXNzb3Igb25seSBoYXMgb25lIHN1Y2Nlc3Nvci4KKy8vICAgKiBFbGltaW5hdGVzIFBISSBub2RlcyBmb3IgYmFzaWMgYmxvY2tzIHdpdGggYSBzaW5nbGUgcHJlZGVjZXNzb3IuCisvLyAgICogRWxpbWluYXRlcyBhIGJhc2ljIGJsb2NrIHRoYXQgb25seSBjb250YWlucyBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KKy8vICAgKiBDaGFuZ2VzIGludm9rZSBpbnN0cnVjdGlvbnMgdG8gbm91bndpbmQgZnVuY3Rpb25zIHRvIGJlIGNhbGxzLgorLy8gICAqIENoYW5nZSB0aGluZ3MgbGlrZSAiaWYgKHgpIGlmICh5KSIgaW50byAiaWYgKHgmeSkiLgorLy8gICAqIGV0Yy4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJzaW1wbGlmeWNmZyIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bVNpbXBsLCAiTnVtYmVyIG9mIGJsb2NrcyBzaW1wbGlmaWVkIik7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBDRkdTaW1wbGlmeVBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIENGR1NpbXBsaWZ5UGFzcygpIDogRnVuY3Rpb25QYXNzKElEKSB7fQorCisgICAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworICB9OworfQorCitjaGFyIENGR1NpbXBsaWZ5UGFzczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKENGR1NpbXBsaWZ5UGFzcywgInNpbXBsaWZ5Y2ZnIiwKKyAgICAgICAgICAgICAgICAiU2ltcGxpZnkgdGhlIENGRyIsIGZhbHNlLCBmYWxzZSk7CisKKy8vIFB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIENGR1NpbXBsaWZpY2F0aW9uIHBhc3MKK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkgeworICByZXR1cm4gbmV3IENGR1NpbXBsaWZ5UGFzcygpOworfQorCisvLy8gQ2hhbmdlVG9VbnJlYWNoYWJsZSAtIEluc2VydCBhbiB1bnJlYWNoYWJsZSBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIHNwZWNpZmllZAorLy8vIGluc3RydWN0aW9uLCBtYWtpbmcgaXQgYW5kIHRoZSByZXN0IG9mIHRoZSBjb2RlIGluIHRoZSBibG9jayBkZWFkLgorc3RhdGljIHZvaWQgQ2hhbmdlVG9VbnJlYWNoYWJsZShJbnN0cnVjdGlvbiAqSSwgYm9vbCBVc2VMTFZNVHJhcCkgeworICBCYXNpY0Jsb2NrICpCQiA9IEktPmdldFBhcmVudCgpOworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBzdWNjZXNzb3JzLCByZW1vdmluZyBCQidzIGVudHJ5IGZyb20gYW55IFBISQorICAvLyBub2Rlcy4KKyAgZm9yIChzdWNjX2l0ZXJhdG9yIFNJID0gc3VjY19iZWdpbihCQiksIFNFID0gc3VjY19lbmQoQkIpOyBTSSAhPSBTRTsgKytTSSkKKyAgICAoKlNJKS0+cmVtb3ZlUHJlZGVjZXNzb3IoQkIpOworICAKKyAgLy8gSW5zZXJ0IGEgY2FsbCB0byBsbHZtLnRyYXAgcmlnaHQgYmVmb3JlIHRoaXMuICBUaGlzIHR1cm5zIHRoZSB1bmRlZmluZWQKKyAgLy8gYmVoYXZpb3IgaW50byBhIGhhcmQgZmFpbCBpbnN0ZWFkIG9mIGZhbGxpbmcgdGhyb3VnaCBpbnRvIHJhbmRvbSBjb2RlLgorICBpZiAoVXNlTExWTVRyYXApIHsKKyAgICBGdW5jdGlvbiAqVHJhcEZuID0KKyAgICAgIEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24oQkItPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKSwgSW50cmluc2ljOjp0cmFwKTsKKyAgICBDYWxsSW5zdDo6Q3JlYXRlKFRyYXBGbiwgIiIsIEkpOworICB9CisgIG5ldyBVbnJlYWNoYWJsZUluc3QoSS0+Z2V0Q29udGV4dCgpLCBJKTsKKyAgCisgIC8vIEFsbCBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhpcyBhcmUgZGVhZC4KKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gSSwgQkJFID0gQkItPmVuZCgpOworICB3aGlsZSAoQkJJICE9IEJCRSkgeworICAgIGlmICghQkJJLT51c2VfZW1wdHkoKSkKKyAgICAgIEJCSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChCQkktPmdldFR5cGUoKSkpOworICAgIEJCLT5nZXRJbnN0TGlzdCgpLmVyYXNlKEJCSSsrKTsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBNYXJrQWxpdmVCbG9ja3MoQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8QmFzaWNCbG9jayosIDEyOD4gJlJlYWNoYWJsZSkgeworICAKKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDEyOD4gV29ya2xpc3Q7CisgIFdvcmtsaXN0LnB1c2hfYmFjayhCQik7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBkbyB7CisgICAgQkIgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAKKyAgICBpZiAoIVJlYWNoYWJsZS5pbnNlcnQoQkIpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBEbyBhIHF1aWNrIHNjYW4gb2YgdGhlIGJhc2ljIGJsb2NrLCB0dXJuaW5nIGFueSBvYnZpb3VzbHkgdW5yZWFjaGFibGUKKyAgICAvLyBpbnN0cnVjdGlvbnMgaW50byBMTFZNIHVucmVhY2hhYmxlIGluc3RzLiAgVGhlIGluc3RydWN0aW9uIGNvbWJpbmluZyBwYXNzCisgICAgLy8gY2Fub25pY2FsaXplcyB1bnJlYWNoYWJsZSBpbnN0cyBpbnRvIHN0b3JlcyB0byBudWxsIG9yIHVuZGVmLgorICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7IEJCSSAhPSBFOysrQkJJKXsKKyAgICAgIGlmIChDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oQkJJKSkgeworICAgICAgICBpZiAoQ0ktPmRvZXNOb3RSZXR1cm4oKSkgeworICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgY2FsbCB0byBhIG5vLXJldHVybiBmdW5jdGlvbiwgaW5zZXJ0IGFuIHVucmVhY2hhYmxlCisgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gYWZ0ZXIgaXQuICBNYWtlIHN1cmUgdGhlcmUgaXNuJ3QgKmFscmVhZHkqIG9uZSB0aGVyZQorICAgICAgICAgIC8vIHRob3VnaC4KKyAgICAgICAgICArK0JCSTsKKyAgICAgICAgICBpZiAoIWlzYTxVbnJlYWNoYWJsZUluc3Q+KEJCSSkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGluc2VydCBhIGNhbGwgdG8gbGx2bS50cmFwIHJpZ2h0IGJlZm9yZSB0aGUgdW5yZWFjaGFibGUuCisgICAgICAgICAgICBDaGFuZ2VUb1VucmVhY2hhYmxlKEJCSSwgZmFsc2UpOworICAgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFN0b3JlIHRvIHVuZGVmIGFuZCBzdG9yZSB0byBudWxsIGFyZSB1bmRlZmluZWQgYW5kIHVzZWQgdG8gc2lnbmFsIHRoYXQKKyAgICAgIC8vIHRoZXkgc2hvdWxkIGJlIGNoYW5nZWQgdG8gdW5yZWFjaGFibGUgYnkgcGFzc2VzIHRoYXQgY2FuJ3QgbW9kaWZ5IHRoZQorICAgICAgLy8gQ0ZHLgorICAgICAgaWYgKFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KEJCSSkpIHsKKyAgICAgICAgLy8gRG9uJ3QgdG91Y2ggdm9sYXRpbGUgc3RvcmVzLgorICAgICAgICBpZiAoU0ktPmlzVm9sYXRpbGUoKSkgY29udGludWU7CisKKyAgICAgICAgVmFsdWUgKlB0ciA9IFNJLT5nZXRPcGVyYW5kKDEpOworICAgICAgICAKKyAgICAgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihQdHIpIHx8CisgICAgICAgICAgICAoaXNhPENvbnN0YW50UG9pbnRlck51bGw+KFB0cikgJiYKKyAgICAgICAgICAgICBTSS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpID09IDApKSB7CisgICAgICAgICAgQ2hhbmdlVG9VbnJlYWNoYWJsZShTSSwgdHJ1ZSk7CisgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBDaGFuZ2VkIHw9IENvbnN0YW50Rm9sZFRlcm1pbmF0b3IoQkIpOworICAgIGZvciAoc3VjY19pdGVyYXRvciBTSSA9IHN1Y2NfYmVnaW4oQkIpLCBTRSA9IHN1Y2NfZW5kKEJCKTsgU0kgIT0gU0U7ICsrU0kpCisgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soKlNJKTsKKyAgfSB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpOworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIFJlbW92ZVVucmVhY2hhYmxlQmxvY2tzRnJvbUZuIC0gUmVtb3ZlIGJsb2NrcyB0aGF0IGFyZSBub3QgcmVhY2hhYmxlLCBldmVuIAorLy8vIGlmIHRoZXkgYXJlIGluIGEgZGVhZCBjeWNsZS4gIFJldHVybiB0cnVlIGlmIGEgY2hhbmdlIHdhcyBtYWRlLCBmYWxzZSAKKy8vLyBvdGhlcndpc2UuCitzdGF0aWMgYm9vbCBSZW1vdmVVbnJlYWNoYWJsZUJsb2Nrc0Zyb21GbihGdW5jdGlvbiAmRikgeworICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgMTI4PiBSZWFjaGFibGU7CisgIGJvb2wgQ2hhbmdlZCA9IE1hcmtBbGl2ZUJsb2NrcyhGLmJlZ2luKCksIFJlYWNoYWJsZSk7CisgIAorICAvLyBJZiB0aGVyZSBhcmUgdW5yZWFjaGFibGUgYmxvY2tzIGluIHRoZSBDRkcuLi4KKyAgaWYgKFJlYWNoYWJsZS5zaXplKCkgPT0gRi5zaXplKCkpCisgICAgcmV0dXJuIENoYW5nZWQ7CisgIAorICBhc3NlcnQoUmVhY2hhYmxlLnNpemUoKSA8IEYuc2l6ZSgpKTsKKyAgTnVtU2ltcGwgKz0gRi5zaXplKCktUmVhY2hhYmxlLnNpemUoKTsKKyAgCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIGJhc2ljIGJsb2NrcyB0aGF0IGFyZSBub3QgcmVhY2hhYmxlLCBkcm9wcGluZyBhbGwgb2YKKyAgLy8gdGhlaXIgaW50ZXJuYWwgcmVmZXJlbmNlcy4uLgorICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCQiA9ICsrRi5iZWdpbigpLCBFID0gRi5lbmQoKTsgQkIgIT0gRTsgKytCQikgeworICAgIGlmIChSZWFjaGFibGUuY291bnQoQkIpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgZm9yIChzdWNjX2l0ZXJhdG9yIFNJID0gc3VjY19iZWdpbihCQiksIFNFID0gc3VjY19lbmQoQkIpOyBTSSAhPSBTRTsgKytTSSkKKyAgICAgIGlmIChSZWFjaGFibGUuY291bnQoKlNJKSkKKyAgICAgICAgKCpTSSktPnJlbW92ZVByZWRlY2Vzc29yKEJCKTsKKyAgICBCQi0+ZHJvcEFsbFJlZmVyZW5jZXMoKTsKKyAgfQorICAKKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgSSA9ICsrRi5iZWdpbigpOyBJICE9IEYuZW5kKCk7KQorICAgIGlmICghUmVhY2hhYmxlLmNvdW50KEkpKQorICAgICAgSSA9IEYuZ2V0QmFzaWNCbG9ja0xpc3QoKS5lcmFzZShJKTsKKyAgICBlbHNlCisgICAgICArK0k7CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIE1lcmdlRW1wdHlSZXR1cm5CbG9ja3MgLSBJZiB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgZW1wdHkgKG90aGVyIHRoYW4gcGhpCisvLy8gbm9kZSkgcmV0dXJuIGJsb2NrcywgbWVyZ2UgdGhlbSB0b2dldGhlciB0byBwcm9tb3RlIHJlY3Vyc2l2ZSBibG9jayBtZXJnaW5nLgorc3RhdGljIGJvb2wgTWVyZ2VFbXB0eVJldHVybkJsb2NrcyhGdW5jdGlvbiAmRikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgCisgIEJhc2ljQmxvY2sgKlJldEJsb2NrID0gMDsKKyAgCisgIC8vIFNjYW4gYWxsIHRoZSBibG9ja3MgaW4gdGhlIGZ1bmN0aW9uLCBsb29raW5nIGZvciBlbXB0eSByZXR1cm4gYmxvY2tzLgorICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCQkkgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBCQkkgIT0gRTsgKSB7CisgICAgQmFzaWNCbG9jayAmQkIgPSAqQkJJKys7CisgICAgCisgICAgLy8gT25seSBsb29rIGF0IHJldHVybiBibG9ja3MuCisgICAgUmV0dXJuSW5zdCAqUmV0ID0gZHluX2Nhc3Q8UmV0dXJuSW5zdD4oQkIuZ2V0VGVybWluYXRvcigpKTsKKyAgICBpZiAoUmV0ID09IDApIGNvbnRpbnVlOworICAgIAorICAgIC8vIE9ubHkgbG9vayBhdCB0aGUgYmxvY2sgaWYgaXQgaXMgZW1wdHkgb3IgdGhlIG9ubHkgb3RoZXIgdGhpbmcgaW4gaXQgaXMgYQorICAgIC8vIHNpbmdsZSBQSEkgbm9kZSB0aGF0IGlzIHRoZSBvcGVyYW5kIHRvIHRoZSByZXR1cm4uCisgICAgaWYgKFJldCAhPSAmQkIuZnJvbnQoKSkgeworICAgICAgLy8gQ2hlY2sgZm9yIHNvbWV0aGluZyBlbHNlIGluIHRoZSBibG9jay4KKyAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBSZXQ7CisgICAgICAtLUk7CisgICAgICAvLyBTa2lwIG92ZXIgZGVidWcgaW5mby4KKyAgICAgIHdoaWxlIChJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoSSkgJiYgSSAhPSBCQi5iZWdpbigpKQorICAgICAgICAtLUk7CisgICAgICBpZiAoIUlTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJKSAmJgorICAgICAgICAgICghaXNhPFBISU5vZGU+KEkpIHx8IEkgIT0gQkIuYmVnaW4oKSB8fAorICAgICAgICAgICBSZXQtPmdldE51bU9wZXJhbmRzKCkgPT0gMCB8fAorICAgICAgICAgICBSZXQtPmdldE9wZXJhbmQoMCkgIT0gSSkpCisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHJldHVybmluZyBibG9jaywgcmVtZW1iZXIgaXQgYW5kIGtlZXAgZ29pbmcuCisgICAgaWYgKFJldEJsb2NrID09IDApIHsKKyAgICAgIFJldEJsb2NrID0gJkJCOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8vIE90aGVyd2lzZSwgd2UgZm91bmQgYSBkdXBsaWNhdGUgcmV0dXJuIGJsb2NrLiAgTWVyZ2UgdGhlIHR3by4KKyAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAKKyAgICAvLyBDYXNlIHdoZW4gdGhlcmUgaXMgbm8gaW5wdXQgdG8gdGhlIHJldHVybiBvciB3aGVuIHRoZSByZXR1cm5lZCB2YWx1ZXMKKyAgICAvLyBhZ3JlZSBpcyB0cml2aWFsLiAgTm90ZSB0aGF0IHRoZXkgY2FuJ3QgYWdyZWUgaWYgdGhlcmUgYXJlIHBoaXMgaW4gdGhlCisgICAgLy8gYmxvY2tzLgorICAgIGlmIChSZXQtPmdldE51bU9wZXJhbmRzKCkgPT0gMCB8fAorICAgICAgICBSZXQtPmdldE9wZXJhbmQoMCkgPT0gCisgICAgICAgICAgY2FzdDxSZXR1cm5JbnN0PihSZXRCbG9jay0+Z2V0VGVybWluYXRvcigpKS0+Z2V0T3BlcmFuZCgwKSkgeworICAgICAgQkIucmVwbGFjZUFsbFVzZXNXaXRoKFJldEJsb2NrKTsKKyAgICAgIEJCLmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8vIElmIHRoZSBjYW5vbmljYWwgcmV0dXJuIGJsb2NrIGhhcyBubyBQSEkgbm9kZSwgY3JlYXRlIG9uZSBub3cuCisgICAgUEhJTm9kZSAqUmV0QmxvY2tQSEkgPSBkeW5fY2FzdDxQSElOb2RlPihSZXRCbG9jay0+YmVnaW4oKSk7CisgICAgaWYgKFJldEJsb2NrUEhJID09IDApIHsKKyAgICAgIFZhbHVlICpJblZhbCA9IGNhc3Q8UmV0dXJuSW5zdD4oUmV0QmxvY2stPmdldFRlcm1pbmF0b3IoKSktPmdldE9wZXJhbmQoMCk7CisgICAgICBSZXRCbG9ja1BISSA9IFBISU5vZGU6OkNyZWF0ZShSZXQtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSZXRCbG9jay0+ZnJvbnQoKSk7CisgICAgICAKKyAgICAgIGZvciAocHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oUmV0QmxvY2spLCBFID0gcHJlZF9lbmQoUmV0QmxvY2spOworICAgICAgICAgICBQSSAhPSBFOyArK1BJKQorICAgICAgICBSZXRCbG9ja1BISS0+YWRkSW5jb21pbmcoSW5WYWwsICpQSSk7CisgICAgICBSZXRCbG9jay0+Z2V0VGVybWluYXRvcigpLT5zZXRPcGVyYW5kKDAsIFJldEJsb2NrUEhJKTsKKyAgICB9CisgICAgCisgICAgLy8gVHVybiBCQiBpbnRvIGEgYmxvY2sgdGhhdCBqdXN0IHVuY29uZGl0aW9uYWxseSBicmFuY2hlcyB0byB0aGUgcmV0dXJuCisgICAgLy8gYmxvY2suICBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiB0aGUgdHdvIHJldHVybiBibG9ja3MgaGF2ZSBhIGNvbW1vbgorICAgIC8vIHByZWRlY2Vzc29yIGJ1dCB0aGF0IHJldHVybiBkaWZmZXJlbnQgdGhpbmdzLgorICAgIFJldEJsb2NrUEhJLT5hZGRJbmNvbWluZyhSZXQtPmdldE9wZXJhbmQoMCksICZCQik7CisgICAgQkIuZ2V0VGVybWluYXRvcigpLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBCcmFuY2hJbnN0OjpDcmVhdGUoUmV0QmxvY2ssICZCQik7CisgIH0KKyAgCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gSXRlcmF0aXZlU2ltcGxpZnlDRkcgLSBDYWxsIFNpbXBsaWZ5Q0ZHIG9uIGFsbCB0aGUgYmxvY2tzIGluIHRoZSBmdW5jdGlvbiwKKy8vLyBpdGVyYXRpbmcgdW50aWwgbm8gbW9yZSBjaGFuZ2VzIGFyZSBtYWRlLgorc3RhdGljIGJvb2wgSXRlcmF0aXZlU2ltcGxpZnlDRkcoRnVuY3Rpb24gJkYsIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBib29sIExvY2FsQ2hhbmdlID0gdHJ1ZTsKKyAgd2hpbGUgKExvY2FsQ2hhbmdlKSB7CisgICAgTG9jYWxDaGFuZ2UgPSBmYWxzZTsKKyAgICAKKyAgICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBiYXNpYyBibG9ja3MgKGV4Y2VwdCB0aGUgZmlyc3Qgb25lKSBhbmQgcmVtb3ZlIHRoZW0KKyAgICAvLyBpZiB0aGV5IGFyZSB1bm5lZWRlZC4uLgorICAgIC8vCisgICAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkJJdCA9ICsrRi5iZWdpbigpOyBCQkl0ICE9IEYuZW5kKCk7ICkgeworICAgICAgaWYgKFNpbXBsaWZ5Q0ZHKEJCSXQrKywgVEQpKSB7CisgICAgICAgIExvY2FsQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgKytOdW1TaW1wbDsKKyAgICAgIH0KKyAgICB9CisgICAgQ2hhbmdlZCB8PSBMb2NhbENoYW5nZTsKKyAgfQorICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8gSXQgaXMgcG9zc2libGUgdGhhdCB3ZSBtYXkgcmVxdWlyZSBtdWx0aXBsZSBwYXNzZXMgb3ZlciB0aGUgY29kZSB0byBmdWxseQorLy8gc2ltcGxpZnkgdGhlIENGRy4KKy8vCitib29sIENGR1NpbXBsaWZ5UGFzczo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICBjb25zdCBUYXJnZXREYXRhICpURCA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8VGFyZ2V0RGF0YT4oKTsKKyAgYm9vbCBFdmVyQ2hhbmdlZCA9IFJlbW92ZVVucmVhY2hhYmxlQmxvY2tzRnJvbUZuKEYpOworICBFdmVyQ2hhbmdlZCB8PSBNZXJnZUVtcHR5UmV0dXJuQmxvY2tzKEYpOworICBFdmVyQ2hhbmdlZCB8PSBJdGVyYXRpdmVTaW1wbGlmeUNGRyhGLCBURCk7CisKKyAgLy8gSWYgbmVpdGhlciBwYXNzIGNoYW5nZWQgYW55dGhpbmcsIHdlJ3JlIGRvbmUuCisgIGlmICghRXZlckNoYW5nZWQpIHJldHVybiBmYWxzZTsKKworICAvLyBJdGVyYXRpdmVTaW1wbGlmeUNGRyBjYW4gKHJhcmVseSkgbWFrZSBzb21lIGxvb3BzIGRlYWQuICBJZiB0aGlzIGhhcHBlbnMsCisgIC8vIFJlbW92ZVVucmVhY2hhYmxlQmxvY2tzRnJvbUZuIGlzIG5lZWRlZCB0byBudWtlIHRoZW0sIHdoaWNoIG1lYW5zIHdlIHNob3VsZAorICAvLyBpdGVyYXRlIGJldHdlZW4gdGhlIHR3byBvcHRpbWl6YXRpb25zLiAgV2Ugc3RydWN0dXJlIHRoZSBjb2RlIGxpa2UgdGhpcyB0bworICAvLyBhdm9pZCByZXJ1bmluZyBJdGVyYXRpdmVTaW1wbGlmeUNGRyBpZiB0aGUgc2Vjb25kIHBhc3Mgb2YgCisgIC8vIFJlbW92ZVVucmVhY2hhYmxlQmxvY2tzRnJvbUZuIGRvZXNuJ3QgZG8gYW55dGhpbmcuCisgIGlmICghUmVtb3ZlVW5yZWFjaGFibGVCbG9ja3NGcm9tRm4oRikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZG8geworICAgIEV2ZXJDaGFuZ2VkID0gSXRlcmF0aXZlU2ltcGxpZnlDRkcoRiwgVEQpOworICAgIEV2ZXJDaGFuZ2VkIHw9IFJlbW92ZVVucmVhY2hhYmxlQmxvY2tzRnJvbUZuKEYpOworICB9IHdoaWxlIChFdmVyQ2hhbmdlZCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9BZGRyTW9kZU1hdGNoZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvQWRkck1vZGVNYXRjaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY0Yzg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvQWRkck1vZGVNYXRjaGVyLmNwcApAQCAtMCwwICsxLDU5OCBAQAorLy89PT0tIEFkZHJNb2RlTWF0Y2hlci5jcHAgLSBBZGRyZXNzaW5nIG1vZGUgbWF0Y2hpbmcgZmFjaWxpdHkgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0YXJnZXQgYWRkcmVzc2luZyBtb2RlIG1hdGNoZXIgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9BZGRyTW9kZU1hdGNoZXIuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0dGVybk1hdGNoLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIGxsdm06OlBhdHRlcm5NYXRjaDsKKwordm9pZCBFeHRBZGRyTW9kZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGJvb2wgTmVlZFBsdXMgPSBmYWxzZTsKKyAgT1MgPDwgIlsiOworICBpZiAoQmFzZUdWKSB7CisgICAgT1MgPDwgKE5lZWRQbHVzID8gIiArICIgOiAiIikKKyAgICAgICA8PCAiR1Y6IjsKKyAgICBXcml0ZUFzT3BlcmFuZChPUywgQmFzZUdWLCAvKlByaW50VHlwZT0qL2ZhbHNlKTsKKyAgICBOZWVkUGx1cyA9IHRydWU7CisgIH0KKworICBpZiAoQmFzZU9mZnMpCisgICAgT1MgPDwgKE5lZWRQbHVzID8gIiArICIgOiAiIikgPDwgQmFzZU9mZnMsIE5lZWRQbHVzID0gdHJ1ZTsKKworICBpZiAoQmFzZVJlZykgeworICAgIE9TIDw8IChOZWVkUGx1cyA/ICIgKyAiIDogIiIpCisgICAgICAgPDwgIkJhc2U6IjsKKyAgICBXcml0ZUFzT3BlcmFuZChPUywgQmFzZVJlZywgLypQcmludFR5cGU9Ki9mYWxzZSk7CisgICAgTmVlZFBsdXMgPSB0cnVlOworICB9CisgIGlmIChTY2FsZSkgeworICAgIE9TIDw8IChOZWVkUGx1cyA/ICIgKyAiIDogIiIpCisgICAgICAgPDwgU2NhbGUgPDwgIioiOworICAgIFdyaXRlQXNPcGVyYW5kKE9TLCBTY2FsZWRSZWcsIC8qUHJpbnRUeXBlPSovZmFsc2UpOworICAgIE5lZWRQbHVzID0gdHJ1ZTsKKyAgfQorCisgIE9TIDw8ICddJzsKK30KKwordm9pZCBFeHRBZGRyTW9kZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsKKyAgZGJncygpIDw8ICdcbic7Cit9CisKKworLy8vIE1hdGNoU2NhbGVkVmFsdWUgLSBUcnkgYWRkaW5nIFNjYWxlUmVnKlNjYWxlIHRvIHRoZSBjdXJyZW50IGFkZHJlc3NpbmcgbW9kZS4KKy8vLyBSZXR1cm4gdHJ1ZSBhbmQgdXBkYXRlIEFkZHJNb2RlIGlmIHRoaXMgYWRkciBtb2RlIGlzIGxlZ2FsIGZvciB0aGUgdGFyZ2V0LAorLy8vIGZhbHNlIGlmIG5vdC4KK2Jvb2wgQWRkcmVzc2luZ01vZGVNYXRjaGVyOjpNYXRjaFNjYWxlZFZhbHVlKFZhbHVlICpTY2FsZVJlZywgaW50NjRfdCBTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoKSB7CisgIC8vIElmIFNjYWxlIGlzIDEsIHRoZW4gdGhpcyBpcyB0aGUgc2FtZSBhcyBhZGRpbmcgU2NhbGVSZWcgdG8gdGhlIGFkZHJlc3NpbmcKKyAgLy8gbW9kZS4gIEp1c3QgcHJvY2VzcyB0aGF0IGRpcmVjdGx5LgorICBpZiAoU2NhbGUgPT0gMSkKKyAgICByZXR1cm4gTWF0Y2hBZGRyKFNjYWxlUmVnLCBEZXB0aCk7CisgIAorICAvLyBJZiB0aGUgc2NhbGUgaXMgMCwgaXQgdGFrZXMgbm90aGluZyB0byBhZGQgdGhpcy4KKyAgaWYgKFNjYWxlID09IDApCisgICAgcmV0dXJuIHRydWU7CisgIAorICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBzY2FsZSBvZiB0aGlzIHZhbHVlLCB3ZSBjYW4gYWRkIHRvIGl0LCBvdGhlcndpc2UsIHdlCisgIC8vIG5lZWQgYW4gYXZhaWxhYmxlIHNjYWxlIGZpZWxkLgorICBpZiAoQWRkck1vZGUuU2NhbGUgIT0gMCAmJiBBZGRyTW9kZS5TY2FsZWRSZWcgIT0gU2NhbGVSZWcpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEV4dEFkZHJNb2RlIFRlc3RBZGRyTW9kZSA9IEFkZHJNb2RlOworCisgIC8vIEFkZCBzY2FsZSB0byB0dXJuIFgqNCtYKjMgLT4gWCo3LiAgVGhpcyBjb3VsZCBhbHNvIGRvIHRoaW5ncyBsaWtlCisgIC8vIFtBK0IgKyBBKjddIC0+IFtCK0EqOF0uCisgIFRlc3RBZGRyTW9kZS5TY2FsZSArPSBTY2FsZTsKKyAgVGVzdEFkZHJNb2RlLlNjYWxlZFJlZyA9IFNjYWxlUmVnOworCisgIC8vIElmIHRoZSBuZXcgYWRkcmVzcyBpc24ndCBsZWdhbCwgYmFpbCBvdXQuCisgIGlmICghVExJLmlzTGVnYWxBZGRyZXNzaW5nTW9kZShUZXN0QWRkck1vZGUsIEFjY2Vzc1R5KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSXQgd2FzIGxlZ2FsLCBzbyBjb21taXQgaXQuCisgIEFkZHJNb2RlID0gVGVzdEFkZHJNb2RlOworICAKKyAgLy8gT2theSwgd2UgZGVjaWRlZCB0aGF0IHdlIGNhbiBhZGQgU2NhbGVSZWcrU2NhbGUgdG8gQWRkck1vZGUuICBDaGVjayBub3cKKyAgLy8gdG8gc2VlIGlmIFNjYWxlUmVnIGlzIGFjdHVhbGx5IFgrQy4gIElmIHNvLCB3ZSBjYW4gdHVybiB0aGlzIGludG8gYWRkaW5nCisgIC8vIFgqU2NhbGUgKyBDKlNjYWxlIHRvIGFkZHIgbW9kZS4KKyAgQ29uc3RhbnRJbnQgKkNJID0gMDsgVmFsdWUgKkFkZExIUyA9IDA7CisgIGlmIChpc2E8SW5zdHJ1Y3Rpb24+KFNjYWxlUmVnKSAmJiAgLy8gbm90IGEgY29uc3RhbnQgZXhwci4KKyAgICAgIG1hdGNoKFNjYWxlUmVnLCBtX0FkZChtX1ZhbHVlKEFkZExIUyksIG1fQ29uc3RhbnRJbnQoQ0kpKSkpIHsKKyAgICBUZXN0QWRkck1vZGUuU2NhbGVkUmVnID0gQWRkTEhTOworICAgIFRlc3RBZGRyTW9kZS5CYXNlT2ZmcyArPSBDSS0+Z2V0U0V4dFZhbHVlKCkqVGVzdEFkZHJNb2RlLlNjYWxlOworICAgICAgCisgICAgLy8gSWYgdGhpcyBhZGRyZXNzaW5nIG1vZGUgaXMgbGVnYWwsIGNvbW1pdCBpdCBhbmQgcmVtZW1iZXIgdGhhdCB3ZSBmb2xkZWQKKyAgICAvLyB0aGlzIGluc3RydWN0aW9uLgorICAgIGlmIChUTEkuaXNMZWdhbEFkZHJlc3NpbmdNb2RlKFRlc3RBZGRyTW9kZSwgQWNjZXNzVHkpKSB7CisgICAgICBBZGRyTW9kZUluc3RzLnB1c2hfYmFjayhjYXN0PEluc3RydWN0aW9uPihTY2FsZVJlZykpOworICAgICAgQWRkck1vZGUgPSBUZXN0QWRkck1vZGU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBPdGhlcndpc2UsIG5vdCAoeCtjKSpzY2FsZSwganVzdCByZXR1cm4gd2hhdCB3ZSBoYXZlLgorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIE1pZ2h0QmVGb2xkYWJsZUluc3QgLSBUaGlzIGlzIGEgbGl0dGxlIGZpbHRlciwgd2hpY2ggcmV0dXJucyB0cnVlIGlmIGFuCisvLy8gYWRkcmVzc2luZyBjb21wdXRhdGlvbiBpbnZvbHZpbmcgSSBtaWdodCBiZSBmb2xkZWQgaW50byBhIGxvYWQvc3RvcmUKKy8vLyBhY2Nlc3NpbmcgaXQuICBUaGlzIGRvZXNuJ3QgbmVlZCB0byBiZSBwZXJmZWN0LCBidXQgbmVlZHMgdG8gYWNjZXB0IGF0IGxlYXN0CisvLy8gdGhlIHNldCBvZiBpbnN0cnVjdGlvbnMgdGhhdCBNYXRjaE9wZXJhdGlvbkFkZHIgY2FuLgorc3RhdGljIGJvb2wgTWlnaHRCZUZvbGRhYmxlSW5zdChJbnN0cnVjdGlvbiAqSSkgeworICBzd2l0Y2ggKEktPmdldE9wY29kZSgpKSB7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6CisgICAgLy8gRG9uJ3QgdG91Y2ggaWRlbnRpdHkgYml0Y2FzdHMuCisgICAgaWYgKEktPmdldFR5cGUoKSA9PSBJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSB8fCBJLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OgorICAgIC8vIFB0clRvSW50IGlzIGFsd2F5cyBhIG5vb3AsIGFzIHdlIGtub3cgdGhhdCB0aGUgaW50IHR5cGUgaXMgcG9pbnRlciBzaXplZC4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6SW50VG9QdHI6CisgICAgLy8gV2Uga25vdyB0aGUgaW5wdXQgaXMgaW50cHRyX3QsIHNvIHRoaXMgaXMgZm9sZGFibGUuCisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICBjYXNlIEluc3RydWN0aW9uOjpTaGw6CisgICAgLy8gQ2FuIG9ubHkgaGFuZGxlIFgqQyBhbmQgWCA8PCBDLgorICAgIHJldHVybiBpc2E8Q29uc3RhbnRJbnQ+KEktPmdldE9wZXJhbmQoMSkpOworICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOgorICAgIHJldHVybiB0cnVlOworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisKKy8vLyBNYXRjaE9wZXJhdGlvbkFkZHIgLSBHaXZlbiBhbiBpbnN0cnVjdGlvbiBvciBjb25zdGFudCBleHByLCBzZWUgaWYgd2UgY2FuCisvLy8gZm9sZCB0aGUgb3BlcmF0aW9uIGludG8gdGhlIGFkZHJlc3NpbmcgbW9kZS4gIElmIHNvLCB1cGRhdGUgdGhlIGFkZHJlc3NpbmcKKy8vLyBtb2RlIGFuZCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZSB3aXRob3V0IG1vZGlmeWluZyBBZGRyTW9kZS4KK2Jvb2wgQWRkcmVzc2luZ01vZGVNYXRjaGVyOjpNYXRjaE9wZXJhdGlvbkFkZHIoVXNlciAqQWRkckluc3QsIHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGgpIHsKKyAgLy8gQXZvaWQgZXhwb25lbnRpYWwgYmVoYXZpb3Igb24gZXh0cmVtZWx5IGRlZXAgZXhwcmVzc2lvbiB0cmVlcy4KKyAgaWYgKERlcHRoID49IDUpIHJldHVybiBmYWxzZTsKKyAgCisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OgorICAgIC8vIFB0clRvSW50IGlzIGFsd2F5cyBhIG5vb3AsIGFzIHdlIGtub3cgdGhhdCB0aGUgaW50IHR5cGUgaXMgcG9pbnRlciBzaXplZC4KKyAgICByZXR1cm4gTWF0Y2hBZGRyKEFkZHJJbnN0LT5nZXRPcGVyYW5kKDApLCBEZXB0aCk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOgorICAgIC8vIFRoaXMgaW50dG9wdHIgaXMgYSBuby1vcCBpZiB0aGUgaW50ZWdlciB0eXBlIGlzIHBvaW50ZXIgc2l6ZWQuCisgICAgaWYgKFRMSS5nZXRWYWx1ZVR5cGUoQWRkckluc3QtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSkgPT0KKyAgICAgICAgVExJLmdldFBvaW50ZXJUeSgpKQorICAgICAgcmV0dXJuIE1hdGNoQWRkcihBZGRySW5zdC0+Z2V0T3BlcmFuZCgwKSwgRGVwdGgpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICAvLyBCaXRDYXN0IGlzIGFsd2F5cyBhIG5vb3AsIGFuZCB3ZSBjYW4gaGFuZGxlIGl0IGFzIGxvbmcgYXMgaXQgaXMKKyAgICAvLyBpbnQtPmludCBvciBwb2ludGVyLT5wb2ludGVyICh3ZSBkb24ndCB3YW50IGludDwtPmZwIG9yIHNvbWV0aGluZykuCisgICAgaWYgKChBZGRySW5zdC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpIHx8CisgICAgICAgICBBZGRySW5zdC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpKSAmJgorICAgICAgICAvLyBEb24ndCB0b3VjaCBpZGVudGl0eSBiaXRjYXN0cy4gIFRoZXNlIHdlcmUgcHJvYmFibHkgcHV0IGhlcmUgYnkgTFNSLAorICAgICAgICAvLyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBtZXNzIGFyb3VuZCB3aXRoIHRoZW0uICBBc3N1bWUgaXQga25vd3Mgd2hhdCBpdAorICAgICAgICAvLyBpcyBkb2luZy4KKyAgICAgICAgQWRkckluc3QtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSAhPSBBZGRySW5zdC0+Z2V0VHlwZSgpKQorICAgICAgcmV0dXJuIE1hdGNoQWRkcihBZGRySW5zdC0+Z2V0T3BlcmFuZCgwKSwgRGVwdGgpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOiB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBtZXJnZSBpbiB0aGUgUkhTIHRoZW4gdGhlIExIUy4gIElmIHNvLCB3ZSB3aW4uCisgICAgRXh0QWRkck1vZGUgQmFja3VwQWRkck1vZGUgPSBBZGRyTW9kZTsKKyAgICB1bnNpZ25lZCBPbGRTaXplID0gQWRkck1vZGVJbnN0cy5zaXplKCk7CisgICAgaWYgKE1hdGNoQWRkcihBZGRySW5zdC0+Z2V0T3BlcmFuZCgxKSwgRGVwdGgrMSkgJiYKKyAgICAgICAgTWF0Y2hBZGRyKEFkZHJJbnN0LT5nZXRPcGVyYW5kKDApLCBEZXB0aCsxKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZGRyIG1vZGUgaW5mby4KKyAgICBBZGRyTW9kZSA9IEJhY2t1cEFkZHJNb2RlOworICAgIEFkZHJNb2RlSW5zdHMucmVzaXplKE9sZFNpemUpOworICAgIAorICAgIC8vIE90aGVyd2lzZSB0aGlzIHdhcyBvdmVyLWFnZ3Jlc3NpdmUuICBUcnkgbWVyZ2luZyBpbiB0aGUgTEhTIHRoZW4gdGhlIFJIUy4KKyAgICBpZiAoTWF0Y2hBZGRyKEFkZHJJbnN0LT5nZXRPcGVyYW5kKDApLCBEZXB0aCsxKSAmJgorICAgICAgICBNYXRjaEFkZHIoQWRkckluc3QtPmdldE9wZXJhbmQoMSksIERlcHRoKzEpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgLy8gT3RoZXJ3aXNlIHdlIGRlZmluaXRlbHkgY2FuJ3QgbWVyZ2UgdGhlIEFERCBpbi4KKyAgICBBZGRyTW9kZSA9IEJhY2t1cEFkZHJNb2RlOworICAgIEFkZHJNb2RlSW5zdHMucmVzaXplKE9sZFNpemUpOworICAgIGJyZWFrOworICB9CisgIC8vY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgIC8vIFRPRE86IFdlIGNhbiBoYW5kbGUgIk9yIFZhbCwgSW1tIiBpZmYgdGhpcyBPUiBpcyBlcXVpdmFsZW50IHRvIGFuIEFERC4KKyAgLy9icmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICBjYXNlIEluc3RydWN0aW9uOjpTaGw6IHsKKyAgICAvLyBDYW4gb25seSBoYW5kbGUgWCpDIGFuZCBYIDw8IEMuCisgICAgQ29uc3RhbnRJbnQgKlJIUyA9IGR5bl9jYXN0PENvbnN0YW50SW50PihBZGRySW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKCFSSFMpIHJldHVybiBmYWxzZTsKKyAgICBpbnQ2NF90IFNjYWxlID0gUkhTLT5nZXRTRXh0VmFsdWUoKTsKKyAgICBpZiAoT3Bjb2RlID09IEluc3RydWN0aW9uOjpTaGwpCisgICAgICBTY2FsZSA9IDFMTCA8PCBTY2FsZTsKKyAgICAKKyAgICByZXR1cm4gTWF0Y2hTY2FsZWRWYWx1ZShBZGRySW5zdC0+Z2V0T3BlcmFuZCgwKSwgU2NhbGUsIERlcHRoKTsKKyAgfQorICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOiB7CisgICAgLy8gU2NhbiB0aGUgR0VQLiAgV2UgY2hlY2sgaXQgaWYgaXQgY29udGFpbnMgY29uc3RhbnQgb2Zmc2V0cyBhbmQgYXQgbW9zdAorICAgIC8vIG9uZSB2YXJpYWJsZSBvZmZzZXQuCisgICAgaW50IFZhcmlhYmxlT3BlcmFuZCA9IC0xOworICAgIHVuc2lnbmVkIFZhcmlhYmxlU2NhbGUgPSAwOworICAgIAorICAgIGludDY0X3QgQ29uc3RhbnRPZmZzZXQgPSAwOworICAgIGNvbnN0IFRhcmdldERhdGEgKlREID0gVExJLmdldFRhcmdldERhdGEoKTsKKyAgICBnZXBfdHlwZV9pdGVyYXRvciBHVEkgPSBnZXBfdHlwZV9iZWdpbihBZGRySW5zdCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IEFkZHJJbnN0LT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSwgKytHVEkpIHsKKyAgICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlICpTVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPigqR1RJKSkgeworICAgICAgICBjb25zdCBTdHJ1Y3RMYXlvdXQgKlNMID0gVEQtPmdldFN0cnVjdExheW91dChTVHkpOworICAgICAgICB1bnNpZ25lZCBJZHggPQorICAgICAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KEFkZHJJbnN0LT5nZXRPcGVyYW5kKGkpKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgIENvbnN0YW50T2Zmc2V0ICs9IFNMLT5nZXRFbGVtZW50T2Zmc2V0KElkeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB1aW50NjRfdCBUeXBlU2l6ZSA9IFRELT5nZXRUeXBlQWxsb2NTaXplKEdUSS5nZXRJbmRleGVkVHlwZSgpKTsKKyAgICAgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihBZGRySW5zdC0+Z2V0T3BlcmFuZChpKSkpIHsKKyAgICAgICAgICBDb25zdGFudE9mZnNldCArPSBDSS0+Z2V0U0V4dFZhbHVlKCkqVHlwZVNpemU7CisgICAgICAgIH0gZWxzZSBpZiAoVHlwZVNpemUpIHsgIC8vIFNjYWxlcyBvZiB6ZXJvIGRvbid0IGRvIGFueXRoaW5nLgorICAgICAgICAgIC8vIFdlIG9ubHkgYWxsb3cgb25lIHZhcmlhYmxlIGluZGV4IGF0IHRoZSBtb21lbnQuCisgICAgICAgICAgaWYgKFZhcmlhYmxlT3BlcmFuZCAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgdmFyaWFibGUgaW5kZXguCisgICAgICAgICAgVmFyaWFibGVPcGVyYW5kID0gaTsKKyAgICAgICAgICBWYXJpYWJsZVNjYWxlID0gVHlwZVNpemU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gQSBjb21tb24gY2FzZSBpcyBmb3IgdGhlIEdFUCB0byBvbmx5IGRvIGEgY29uc3RhbnQgb2Zmc2V0LiAgSW4gdGhpcyBjYXNlLAorICAgIC8vIGp1c3QgYWRkIGl0IHRvIHRoZSBkaXNwIGZpZWxkIGFuZCBjaGVjayB2YWxpZGl0eS4KKyAgICBpZiAoVmFyaWFibGVPcGVyYW5kID09IC0xKSB7CisgICAgICBBZGRyTW9kZS5CYXNlT2ZmcyArPSBDb25zdGFudE9mZnNldDsKKyAgICAgIGlmIChDb25zdGFudE9mZnNldCA9PSAwIHx8IFRMSS5pc0xlZ2FsQWRkcmVzc2luZ01vZGUoQWRkck1vZGUsIEFjY2Vzc1R5KSl7CisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZm9sZCB0aGUgYmFzZSBwb2ludGVyIGluIHRvby4KKyAgICAgICAgaWYgKE1hdGNoQWRkcihBZGRySW5zdC0+Z2V0T3BlcmFuZCgwKSwgRGVwdGgrMSkpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBBZGRyTW9kZS5CYXNlT2ZmcyAtPSBDb25zdGFudE9mZnNldDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTYXZlIHRoZSB2YWxpZCBhZGRyZXNzaW5nIG1vZGUgaW4gY2FzZSB3ZSBjYW4ndCBtYXRjaC4KKyAgICBFeHRBZGRyTW9kZSBCYWNrdXBBZGRyTW9kZSA9IEFkZHJNb2RlOworICAgIHVuc2lnbmVkIE9sZFNpemUgPSBBZGRyTW9kZUluc3RzLnNpemUoKTsKKworICAgIC8vIFNlZSBpZiB0aGUgc2NhbGUgYW5kIG9mZnNldCBhbW91bnQgaXMgdmFsaWQgZm9yIHRoaXMgdGFyZ2V0LgorICAgIEFkZHJNb2RlLkJhc2VPZmZzICs9IENvbnN0YW50T2Zmc2V0OworCisgICAgLy8gTWF0Y2ggdGhlIGJhc2Ugb3BlcmFuZCBvZiB0aGUgR0VQLgorICAgIGlmICghTWF0Y2hBZGRyKEFkZHJJbnN0LT5nZXRPcGVyYW5kKDApLCBEZXB0aCsxKSkgeworICAgICAgLy8gSWYgaXQgY291bGRuJ3QgYmUgbWF0Y2hlZCwganVzdCBzdHVmZiB0aGUgdmFsdWUgaW4gYSByZWdpc3Rlci4KKyAgICAgIGlmIChBZGRyTW9kZS5IYXNCYXNlUmVnKSB7CisgICAgICAgIEFkZHJNb2RlID0gQmFja3VwQWRkck1vZGU7CisgICAgICAgIEFkZHJNb2RlSW5zdHMucmVzaXplKE9sZFNpemUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBBZGRyTW9kZS5IYXNCYXNlUmVnID0gdHJ1ZTsKKyAgICAgIEFkZHJNb2RlLkJhc2VSZWcgPSBBZGRySW5zdC0+Z2V0T3BlcmFuZCgwKTsKKyAgICB9CisKKyAgICAvLyBNYXRjaCB0aGUgcmVtYWluaW5nIHZhcmlhYmxlIHBvcnRpb24gb2YgdGhlIEdFUC4KKyAgICBpZiAoIU1hdGNoU2NhbGVkVmFsdWUoQWRkckluc3QtPmdldE9wZXJhbmQoVmFyaWFibGVPcGVyYW5kKSwgVmFyaWFibGVTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwdGgpKSB7CisgICAgICAvLyBJZiBpdCBjb3VsZG4ndCBiZSBtYXRjaGVkLCB0cnkgc3R1ZmZpbmcgdGhlIGJhc2UgaW50byBhIHJlZ2lzdGVyCisgICAgICAvLyBpbnN0ZWFkIG9mIG1hdGNoaW5nIGl0LCBhbmQgcmV0cnlpbmcgdGhlIG1hdGNoIG9mIHRoZSBzY2FsZS4KKyAgICAgIEFkZHJNb2RlID0gQmFja3VwQWRkck1vZGU7CisgICAgICBBZGRyTW9kZUluc3RzLnJlc2l6ZShPbGRTaXplKTsKKyAgICAgIGlmIChBZGRyTW9kZS5IYXNCYXNlUmVnKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBBZGRyTW9kZS5IYXNCYXNlUmVnID0gdHJ1ZTsKKyAgICAgIEFkZHJNb2RlLkJhc2VSZWcgPSBBZGRySW5zdC0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIEFkZHJNb2RlLkJhc2VPZmZzICs9IENvbnN0YW50T2Zmc2V0OworICAgICAgaWYgKCFNYXRjaFNjYWxlZFZhbHVlKEFkZHJJbnN0LT5nZXRPcGVyYW5kKFZhcmlhYmxlT3BlcmFuZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTY2FsZSwgRGVwdGgpKSB7CisgICAgICAgIC8vIElmIGV2ZW4gdGhhdCBkaWRuJ3Qgd29yaywgYmFpbC4KKyAgICAgICAgQWRkck1vZGUgPSBCYWNrdXBBZGRyTW9kZTsKKyAgICAgICAgQWRkck1vZGVJbnN0cy5yZXNpemUoT2xkU2l6ZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIE1hdGNoQWRkciAtIElmIHdlIGNhbiwgdHJ5IHRvIGFkZCB0aGUgdmFsdWUgb2YgJ0FkZHInIGludG8gdGhlIGN1cnJlbnQKKy8vLyBhZGRyZXNzaW5nIG1vZGUuICBJZiBBZGRyIGNhbid0IGJlIGFkZGVkIHRvIEFkZHJNb2RlIHRoaXMgcmV0dXJucyBmYWxzZSBhbmQKKy8vLyBsZWF2ZXMgQWRkck1vZGUgdW5tb2RpZmllZC4gIFRoaXMgYXNzdW1lcyB0aGF0IEFkZHIgaXMgZWl0aGVyIGEgcG9pbnRlciB0eXBlCisvLy8gb3IgaW50cHRyX3QgZm9yIHRoZSB0YXJnZXQuCisvLy8KK2Jvb2wgQWRkcmVzc2luZ01vZGVNYXRjaGVyOjpNYXRjaEFkZHIoVmFsdWUgKkFkZHIsIHVuc2lnbmVkIERlcHRoKSB7CisgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQWRkcikpIHsKKyAgICAvLyBGb2xkIGluIGltbWVkaWF0ZXMgaWYgbGVnYWwgZm9yIHRoZSB0YXJnZXQuCisgICAgQWRkck1vZGUuQmFzZU9mZnMgKz0gQ0ktPmdldFNFeHRWYWx1ZSgpOworICAgIGlmIChUTEkuaXNMZWdhbEFkZHJlc3NpbmdNb2RlKEFkZHJNb2RlLCBBY2Nlc3NUeSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBBZGRyTW9kZS5CYXNlT2ZmcyAtPSBDSS0+Z2V0U0V4dFZhbHVlKCk7CisgIH0gZWxzZSBpZiAoR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KEFkZHIpKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhIGdsb2JhbCB2YXJpYWJsZSwgdHJ5IHRvIGZvbGQgaXQgaW50byB0aGUgYWRkcmVzc2luZyBtb2RlLgorICAgIGlmIChBZGRyTW9kZS5CYXNlR1YgPT0gMCkgeworICAgICAgQWRkck1vZGUuQmFzZUdWID0gR1Y7CisgICAgICBpZiAoVExJLmlzTGVnYWxBZGRyZXNzaW5nTW9kZShBZGRyTW9kZSwgQWNjZXNzVHkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIEFkZHJNb2RlLkJhc2VHViA9IDA7CisgICAgfQorICB9IGVsc2UgaWYgKEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KEFkZHIpKSB7CisgICAgRXh0QWRkck1vZGUgQmFja3VwQWRkck1vZGUgPSBBZGRyTW9kZTsKKyAgICB1bnNpZ25lZCBPbGRTaXplID0gQWRkck1vZGVJbnN0cy5zaXplKCk7CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQgaXMgcG9zc2libGUgdG8gZm9sZCB0aGlzIG9wZXJhdGlvbi4KKyAgICBpZiAoTWF0Y2hPcGVyYXRpb25BZGRyKEksIEktPmdldE9wY29kZSgpLCBEZXB0aCkpIHsKKyAgICAgIC8vIE9rYXksIGl0J3MgcG9zc2libGUgdG8gZm9sZCB0aGlzLiAgQ2hlY2sgdG8gc2VlIGlmIGl0IGlzIGFjdHVhbGx5CisgICAgICAvLyAqcHJvZml0YWJsZSogdG8gZG8gc28uICBXZSB1c2UgYSBzaW1wbGUgY29zdCBtb2RlbCB0byBhdm9pZCBpbmNyZWFzaW5nCisgICAgICAvLyByZWdpc3RlciBwcmVzc3VyZSB0b28gbXVjaC4KKyAgICAgIGlmIChJLT5oYXNPbmVVc2UoKSB8fAorICAgICAgICAgIElzUHJvZml0YWJsZVRvRm9sZEludG9BZGRyZXNzaW5nTW9kZShJLCBCYWNrdXBBZGRyTW9kZSwgQWRkck1vZGUpKSB7CisgICAgICAgIEFkZHJNb2RlSW5zdHMucHVzaF9iYWNrKEkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gSXQgaXNuJ3QgcHJvZml0YWJsZSB0byBkbyB0aGlzLCByb2xsIGJhY2suCisgICAgICAvL2NlcnIgPDwgIk5PVCBGT0xESU5HOiAiIDw8ICpJOworICAgICAgQWRkck1vZGUgPSBCYWNrdXBBZGRyTW9kZTsKKyAgICAgIEFkZHJNb2RlSW5zdHMucmVzaXplKE9sZFNpemUpOworICAgIH0KKyAgfSBlbHNlIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihBZGRyKSkgeworICAgIGlmIChNYXRjaE9wZXJhdGlvbkFkZHIoQ0UsIENFLT5nZXRPcGNvZGUoKSwgRGVwdGgpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoaXNhPENvbnN0YW50UG9pbnRlck51bGw+KEFkZHIpKSB7CisgICAgLy8gTnVsbCBwb2ludGVyIGdldHMgZm9sZGVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBhZGRyZXNzaW5nIG1vZGUuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBXb3JzZSBjYXNlLCB0aGUgdGFyZ2V0IHNob3VsZCBzdXBwb3J0IFtyZWddIGFkZHJlc3NpbmcgbW9kZXMuIDopCisgIGlmICghQWRkck1vZGUuSGFzQmFzZVJlZykgeworICAgIEFkZHJNb2RlLkhhc0Jhc2VSZWcgPSB0cnVlOworICAgIEFkZHJNb2RlLkJhc2VSZWcgPSBBZGRyOworICAgIC8vIFN0aWxsIGNoZWNrIGZvciBsZWdhbGl0eSBpbiBjYXNlIHRoZSB0YXJnZXQgc3VwcG9ydHMgW2ltbV0gYnV0IG5vdCBbaStyXS4KKyAgICBpZiAoVExJLmlzTGVnYWxBZGRyZXNzaW5nTW9kZShBZGRyTW9kZSwgQWNjZXNzVHkpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgQWRkck1vZGUuSGFzQmFzZVJlZyA9IGZhbHNlOworICAgIEFkZHJNb2RlLkJhc2VSZWcgPSAwOworICB9CisKKyAgLy8gSWYgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgYWxyZWFkeSB0YWtlbiwgc2VlIGlmIHdlIGNhbiBkbyBbcityXS4KKyAgaWYgKEFkZHJNb2RlLlNjYWxlID09IDApIHsKKyAgICBBZGRyTW9kZS5TY2FsZSA9IDE7CisgICAgQWRkck1vZGUuU2NhbGVkUmVnID0gQWRkcjsKKyAgICBpZiAoVExJLmlzTGVnYWxBZGRyZXNzaW5nTW9kZShBZGRyTW9kZSwgQWNjZXNzVHkpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgQWRkck1vZGUuU2NhbGUgPSAwOworICAgIEFkZHJNb2RlLlNjYWxlZFJlZyA9IDA7CisgIH0KKyAgLy8gQ291bGRuJ3QgbWF0Y2guCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gSXNPcGVyYW5kQU1lbW9yeU9wZXJhbmQgLSBDaGVjayB0byBzZWUgaWYgYWxsIHVzZXMgb2YgT3BWYWwgYnkgdGhlIHNwZWNpZmllZAorLy8vIGlubGluZSBhc20gY2FsbCBhcmUgZHVlIHRvIG1lbW9yeSBvcGVyYW5kcy4gIElmIHNvLCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlCisvLy8gcmV0dXJuIGZhbHNlLgorc3RhdGljIGJvb2wgSXNPcGVyYW5kQU1lbW9yeU9wZXJhbmQoQ2FsbEluc3QgKkNJLCBJbmxpbmVBc20gKklBLCBWYWx1ZSAqT3BWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJKSB7CisgIHN0ZDo6dmVjdG9yPElubGluZUFzbTo6Q29uc3RyYWludEluZm8+CisgIENvbnN0cmFpbnRzID0gSUEtPlBhcnNlQ29uc3RyYWludHMoKTsKKworICB1bnNpZ25lZCBBcmdObyA9IDA7ICAgLy8gVGhlIGFyZ3VtZW50IG9mIHRoZSBDYWxsSW5zdC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvbnN0cmFpbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBUYXJnZXRMb3dlcmluZzo6QXNtT3BlcmFuZEluZm8gT3BJbmZvKENvbnN0cmFpbnRzW2ldKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHZhbHVlIHR5cGUgZm9yIGVhY2ggb3BlcmFuZC4KKyAgICBzd2l0Y2ggKE9wSW5mby5UeXBlKSB7CisgICAgICBjYXNlIElubGluZUFzbTo6aXNPdXRwdXQ6CisgICAgICAgIGlmIChPcEluZm8uaXNJbmRpcmVjdCkKKyAgICAgICAgICBPcEluZm8uQ2FsbE9wZXJhbmRWYWwgPSBDSS0+Z2V0QXJnT3BlcmFuZChBcmdObysrKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElubGluZUFzbTo6aXNJbnB1dDoKKyAgICAgICAgT3BJbmZvLkNhbGxPcGVyYW5kVmFsID0gQ0ktPmdldEFyZ09wZXJhbmQoQXJnTm8rKyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJbmxpbmVBc206OmlzQ2xvYmJlcjoKKyAgICAgICAgLy8gTm90aGluZyB0byBkby4KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSB0aGUgY29uc3RyYWludCBjb2RlIGFuZCBDb25zdHJhaW50VHlwZSB0byB1c2UuCisgICAgVExJLkNvbXB1dGVDb25zdHJhaW50VG9Vc2UoT3BJbmZvLCBTRFZhbHVlKCkpOworCisgICAgLy8gSWYgdGhpcyBhc20gb3BlcmFuZCBpcyBvdXIgVmFsdWUqLCBhbmQgaWYgaXQgaXNuJ3QgYW4gaW5kaXJlY3QgbWVtb3J5CisgICAgLy8gb3BlcmFuZCwgd2UgY2FuJ3QgZm9sZCBpdCEKKyAgICBpZiAoT3BJbmZvLkNhbGxPcGVyYW5kVmFsID09IE9wVmFsICYmCisgICAgICAgIChPcEluZm8uQ29uc3RyYWludFR5cGUgIT0gVGFyZ2V0TG93ZXJpbmc6OkNfTWVtb3J5IHx8CisgICAgICAgICAhT3BJbmZvLmlzSW5kaXJlY3QpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vIEZpbmRBbGxNZW1vcnlVc2VzIC0gUmVjdXJzaXZlbHkgd2FsayBhbGwgdGhlIHVzZXMgb2YgSSB1bnRpbCB3ZSBmaW5kIGEKKy8vLyBtZW1vcnkgdXNlLiAgSWYgd2UgZmluZCBhbiBvYnZpb3VzbHkgbm9uLWZvbGRhYmxlIGluc3RydWN0aW9uLCByZXR1cm4gdHJ1ZS4KKy8vLyBBZGQgdGhlIHVsdGltYXRlbHkgZm91bmQgbWVtb3J5IGluc3RydWN0aW9ucyB0byBNZW1vcnlVc2VzLgorc3RhdGljIGJvb2wgRmluZEFsbE1lbW9yeVVzZXMoSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxJbnN0cnVjdGlvbiosdW5zaWduZWQ+ID4gJk1lbW9yeVVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxJbnN0cnVjdGlvbiosIDE2PiAmQ29uc2lkZXJlZEluc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSkgeworICAvLyBJZiB3ZSBhbHJlYWR5IGNvbnNpZGVyZWQgdGhpcyBpbnN0cnVjdGlvbiwgd2UncmUgZG9uZS4KKyAgaWYgKCFDb25zaWRlcmVkSW5zdHMuaW5zZXJ0KEkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIElmIHRoaXMgaXMgYW4gb2J2aW91c2x5IHVuZm9sZGFibGUgaW5zdHJ1Y3Rpb24sIGJhaWwgb3V0LgorICBpZiAoIU1pZ2h0QmVGb2xkYWJsZUluc3QoSSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgdXNlcywgcmVjdXJzaXZlbHkgcHJvY2Vzc2luZyB0aGVtLgorICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBJLT51c2VfYmVnaW4oKSwgRSA9IEktPnVzZV9lbmQoKTsKKyAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgVXNlciAqVSA9ICpVSTsKKworICAgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oVSkpIHsKKyAgICAgIE1lbW9yeVVzZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKExJLCBVSS5nZXRPcGVyYW5kTm8oKSkpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIGlmIChTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihVKSkgeworICAgICAgdW5zaWduZWQgb3BObyA9IFVJLmdldE9wZXJhbmRObygpOworICAgICAgaWYgKG9wTm8gPT0gMCkgcmV0dXJuIHRydWU7IC8vIFN0b3JpbmcgYWRkciwgbm90IGludG8gYWRkci4KKyAgICAgIE1lbW9yeVVzZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFNJLCBvcE5vKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgaWYgKENhbGxJbnN0ICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PihVKSkgeworICAgICAgSW5saW5lQXNtICpJQSA9IGR5bl9jYXN0PElubGluZUFzbT4oQ0ktPmdldENhbGxlZFZhbHVlKCkpOworICAgICAgaWYgKCFJQSkgcmV0dXJuIHRydWU7CisgICAgICAKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBtZW1vcnkgb3BlcmFuZCwgd2UncmUgY29vbCwgb3RoZXJ3aXNlIGJhaWwgb3V0LgorICAgICAgaWYgKCFJc09wZXJhbmRBTWVtb3J5T3BlcmFuZChDSSwgSUEsIEksIFRMSSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIGlmIChGaW5kQWxsTWVtb3J5VXNlcyhjYXN0PEluc3RydWN0aW9uPihVKSwgTWVtb3J5VXNlcywgQ29uc2lkZXJlZEluc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUTEkpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIFZhbHVlQWxyZWFkeUxpdmVBdEluc3QgLSBSZXRybiB0cnVlIGlmIFZhbCBpcyBhbHJlYWR5IGtub3duIHRvIGJlIGxpdmUgYXQKKy8vLyB0aGUgdXNlIHNpdGUgdGhhdCB3ZSdyZSBmb2xkaW5nIGl0IGludG8uICBJZiBzbywgdGhlcmUgaXMgbm8gY29zdCB0bworLy8vIGluY2x1ZGUgaXQgaW4gdGhlIGFkZHJlc3NpbmcgbW9kZS4gIEtub3duTGl2ZTEgYW5kIEtub3duTGl2ZTIgYXJlIHR3byB2YWx1ZXMKKy8vLyB0aGF0IHdlIGtub3cgYXJlIGxpdmUgYXQgdGhlIGluc3RydWN0aW9uIGFscmVhZHkuCitib29sIEFkZHJlc3NpbmdNb2RlTWF0Y2hlcjo6VmFsdWVBbHJlYWR5TGl2ZUF0SW5zdChWYWx1ZSAqVmFsLFZhbHVlICpLbm93bkxpdmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKktub3duTGl2ZTIpIHsKKyAgLy8gSWYgVmFsIGlzIGVpdGhlciBvZiB0aGUga25vd24tbGl2ZSB2YWx1ZXMsIHdlIGtub3cgaXQgaXMgbGl2ZSEKKyAgaWYgKFZhbCA9PSAwIHx8IFZhbCA9PSBLbm93bkxpdmUxIHx8IFZhbCA9PSBLbm93bkxpdmUyKQorICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gQWxsIHZhbHVlcyBvdGhlciB0aGFuIGluc3RydWN0aW9ucyBhbmQgYXJndW1lbnRzIChlLmcuIGNvbnN0YW50cykgYXJlIGxpdmUuCisgIGlmICghaXNhPEluc3RydWN0aW9uPihWYWwpICYmICFpc2E8QXJndW1lbnQ+KFZhbCkpIHJldHVybiB0cnVlOworICAKKyAgLy8gSWYgVmFsIGlzIGEgY29uc3RhbnQgc2l6ZWQgYWxsb2NhIGluIHRoZSBlbnRyeSBibG9jaywgaXQgaXMgbGl2ZSwgdGhpcyBpcworICAvLyB0cnVlIGJlY2F1c2UgaXQgaXMganVzdCBhIHJlZmVyZW5jZSB0byB0aGUgc3RhY2svZnJhbWUgcG9pbnRlciwgd2hpY2ggaXMKKyAgLy8gbGl2ZSBmb3IgdGhlIHdob2xlIGZ1bmN0aW9uLgorICBpZiAoQWxsb2NhSW5zdCAqQUkgPSBkeW5fY2FzdDxBbGxvY2FJbnN0PihWYWwpKQorICAgIGlmIChBSS0+aXNTdGF0aWNBbGxvY2EoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgdmFsdWUgaXMgYWxyZWFkeSB1c2VkIGluIHRoZSBtZW1vcnkgaW5zdHJ1Y3Rpb24ncworICAvLyBibG9jay4gIElmIHNvLCBpdCdzIGFscmVhZHkgbGl2ZSBpbnRvIHRoZSBibG9jayBhdCB0aGUgdmVyeSBsZWFzdCwgc28gd2UKKyAgLy8gY2FuIHJlYXNvbmFibHkgZm9sZCBpdC4KKyAgQmFzaWNCbG9jayAqTWVtQkIgPSBNZW1vcnlJbnN0LT5nZXRQYXJlbnQoKTsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gVmFsLT51c2VfYmVnaW4oKSwgRSA9IFZhbC0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IEU7ICsrVUkpCisgICAgLy8gV2Uga25vdyB0aGF0IHVzZXMgb2YgYXJndW1lbnRzIGFuZCBpbnN0cnVjdGlvbnMgaGF2ZSB0byBiZSBpbnN0cnVjdGlvbnMuCisgICAgaWYgKGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSktPmdldFBhcmVudCgpID09IE1lbUJCKQorICAgICAgcmV0dXJuIHRydWU7CisgIAorICByZXR1cm4gZmFsc2U7Cit9CisKKworCisvLy8gSXNQcm9maXRhYmxlVG9Gb2xkSW50b0FkZHJlc3NpbmdNb2RlIC0gSXQgaXMgcG9zc2libGUgZm9yIHRoZSBhZGRyZXNzaW5nCisvLy8gbW9kZSBvZiB0aGUgbWFjaGluZSB0byBmb2xkIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaW50byBhIGxvYWQgb3Igc3RvcmUKKy8vLyB0aGF0IHVsdGltYXRlbHkgdXNlcyBpdC4gIEhvd2V2ZXIsIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaGFzIG11bHRpcGxlCisvLy8gdXNlcy4gIEdpdmVuIHRoaXMsIGl0IG1heSBhY3R1YWxseSBpbmNyZWFzZSByZWdpc3RlciBwcmVzc3VyZSB0byBmb2xkIGl0CisvLy8gaW50byB0aGUgbG9hZC4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIGNvZGU6CisvLy8KKy8vLyAgICAgWCA9IC4uLgorLy8vICAgICBZID0gWCsxCisvLy8gICAgIHVzZShZKSAgIC0+IG5vbmxvYWQvc3RvcmUKKy8vLyAgICAgWiA9IFkrMQorLy8vICAgICBsb2FkIFoKKy8vLworLy8vIEluIHRoaXMgY2FzZSwgWSBoYXMgbXVsdGlwbGUgdXNlcywgYW5kIGNhbiBiZSBmb2xkZWQgaW50byB0aGUgbG9hZCBvZiBaCisvLy8gKHlpZWxkaW5nIGxvYWQgW1grMl0pLiAgSG93ZXZlciwgZG9pbmcgdGhpcyB3aWxsIGNhdXNlIGJvdGggIlgiIGFuZCAiWCsxIiB0bworLy8vIGJlIGxpdmUgYXQgdGhlIHVzZShZKSBsaW5lLiAgSWYgd2UgZG9uJ3QgZm9sZCBZIGludG8gbG9hZCBaLCB3ZSB1c2Ugb25lCisvLy8gZmV3ZXIgcmVnaXN0ZXIuICBTaW5jZSBZIGNhbid0IGJlIGZvbGRlZCBpbnRvICJ1c2UoWSkiIHdlIGRvbid0IGluY3JlYXNlIHRoZQorLy8vIG51bWJlciBvZiBjb21wdXRhdGlvbnMgZWl0aGVyLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgKGxpa2UgbW9zdCBvZiBDb2RlR2VuUHJlcGFyZSkgaXMganVzdCBhIHJvdWdoIGhldXJpc3RpYy4gIElmCisvLy8gWCB3YXMgbGl2ZSBhY3Jvc3MgJ2xvYWQgWicgZm9yIG90aGVyIHJlYXNvbnMsIHdlIGFjdHVhbGx5ICp3b3VsZCogd2FudCB0bworLy8vIGZvbGQgdGhlIGFkZHJlc3NpbmcgbW9kZSBpbiB0aGUgWiBjYXNlLiAgVGhpcyB3b3VsZCBtYWtlIFkgZGllIGVhcmxpZXIuCitib29sIEFkZHJlc3NpbmdNb2RlTWF0Y2hlcjo6CitJc1Byb2ZpdGFibGVUb0ZvbGRJbnRvQWRkcmVzc2luZ01vZGUoSW5zdHJ1Y3Rpb24gKkksIEV4dEFkZHJNb2RlICZBTUJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRBZGRyTW9kZSAmQU1BZnRlcikgeworICBpZiAoSWdub3JlUHJvZml0YWJpbGl0eSkgcmV0dXJuIHRydWU7CisgIAorICAvLyBBTUJlZm9yZSBpcyB0aGUgYWRkcmVzc2luZyBtb2RlIGJlZm9yZSB0aGlzIGluc3RydWN0aW9uIHdhcyBmb2xkZWQgaW50byBpdCwKKyAgLy8gYW5kIEFNQWZ0ZXIgaXMgdGhlIGFkZHJlc3NpbmcgbW9kZSBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gd2FzIGZvbGRlZC4gIEdldAorICAvLyB0aGUgc2V0IG9mIHJlZ2lzdGVycyByZWZlcmVuY2VkIGJ5IEFNQWZ0ZXIgYW5kIHN1YnRyYWN0IG91dCB0aG9zZQorICAvLyByZWZlcmVuY2VkIGJ5IEFNQmVmb3JlOiB0aGlzIGlzIHRoZSBzZXQgb2YgdmFsdWVzIHdoaWNoIGZvbGRpbmcgaW4gdGhpcworICAvLyBhZGRyZXNzIGV4dGVuZHMgdGhlIGxpZmV0aW1lIG9mLgorICAvLworICAvLyBOb3RlIHRoYXQgdGhlcmUgYXJlIG9ubHkgdHdvIHBvdGVudGlhbCB2YWx1ZXMgYmVpbmcgcmVmZXJlbmNlZCBoZXJlLAorICAvLyBCYXNlUmVnIGFuZCBTY2FsZVJlZyAoZ2xvYmFsIGFkZHJlc3NlcyBhcmUgYWx3YXlzIGF2YWlsYWJsZSwgYXMgYXJlIGFueQorICAvLyBmb2xkZWQgaW1tZWRpYXRlcykuCisgIFZhbHVlICpCYXNlUmVnID0gQU1BZnRlci5CYXNlUmVnLCAqU2NhbGVkUmVnID0gQU1BZnRlci5TY2FsZWRSZWc7CisgIAorICAvLyBJZiB0aGUgQmFzZVJlZyBvciBTY2FsZWRSZWcgd2FzIHJlZmVyZW5jZWQgYnkgdGhlIHByZXZpb3VzIGFkZHJtb2RlLCB0aGVpcgorICAvLyBsaWZldGltZSB3YXNuJ3QgZXh0ZW5kZWQgYnkgYWRkaW5nIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIGlmIChWYWx1ZUFscmVhZHlMaXZlQXRJbnN0KEJhc2VSZWcsIEFNQmVmb3JlLkJhc2VSZWcsIEFNQmVmb3JlLlNjYWxlZFJlZykpCisgICAgQmFzZVJlZyA9IDA7CisgIGlmIChWYWx1ZUFscmVhZHlMaXZlQXRJbnN0KFNjYWxlZFJlZywgQU1CZWZvcmUuQmFzZVJlZywgQU1CZWZvcmUuU2NhbGVkUmVnKSkKKyAgICBTY2FsZWRSZWcgPSAwOworCisgIC8vIElmIGZvbGRpbmcgdGhpcyBpbnN0cnVjdGlvbiAoYW5kIGl0J3Mgc3ViZXhwcnMpIGRpZG4ndCBleHRlbmQgYW55IGxpdmUKKyAgLy8gcmFuZ2VzLCB3ZSdyZSBvayB3aXRoIGl0LgorICBpZiAoQmFzZVJlZyA9PSAwICYmIFNjYWxlZFJlZyA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIElmIGFsbCB1c2VzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gYXJlIHVsdGltYXRlbHkgbG9hZC9zdG9yZS9pbmxpbmVhc20ncywKKyAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZWlyIGFkZHJlc3NpbmcgbW9kZXMgd2lsbCBpbmNsdWRlIHRoaXMgaW5zdHJ1Y3Rpb24uICBJZgorICAvLyBzbywgd2UgY2FuIGZvbGQgaXQgaW50byBhbGwgdXNlcywgc28gaXQgZG9lc24ndCBtYXR0ZXIgaWYgaXQgaGFzIG11bHRpcGxlCisgIC8vIHVzZXMuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxJbnN0cnVjdGlvbiosdW5zaWduZWQ+LCAxNj4gTWVtb3J5VXNlczsKKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24qLCAxNj4gQ29uc2lkZXJlZEluc3RzOworICBpZiAoRmluZEFsbE1lbW9yeVVzZXMoSSwgTWVtb3J5VXNlcywgQ29uc2lkZXJlZEluc3RzLCBUTEkpKQorICAgIHJldHVybiBmYWxzZTsgIC8vIEhhcyBhIG5vbi1tZW1vcnksIG5vbi1mb2xkYWJsZSB1c2UhCisgIAorICAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoYXQgYWxsIHVzZXMgb2YgdGhpcyBpbnN0cnVjdGlvbiBhcmUgcGFydCBvZiBhIGNoYWluIG9mCisgIC8vIGNvbXB1dGF0aW9uIGludm9sdmluZyBvbmx5IG9wZXJhdGlvbnMgdGhhdCBjb3VsZCB0aGVvcmV0aWNhbGx5IGJlIGZvbGRlZAorICAvLyBpbnRvIGEgbWVtb3J5IHVzZSwgbG9vcCBvdmVyIGVhY2ggb2YgdGhlc2UgdXNlcyBhbmQgc2VlIGlmIHRoZXkgY291bGQKKyAgLy8gKmFjdHVhbGx5KiBmb2xkIHRoZSBpbnN0cnVjdGlvbi4KKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24qLCAzMj4gTWF0Y2hlZEFkZHJNb2RlSW5zdHM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNZW1vcnlVc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBJbnN0cnVjdGlvbiAqVXNlciA9IE1lbW9yeVVzZXNbaV0uZmlyc3Q7CisgICAgdW5zaWduZWQgT3BObyA9IE1lbW9yeVVzZXNbaV0uc2Vjb25kOworICAgIAorICAgIC8vIEdldCB0aGUgYWNjZXNzIHR5cGUgb2YgdGhpcyB1c2UuICBJZiB0aGUgdXNlIGlzbid0IGEgcG9pbnRlciwgd2UgZG9uJ3QKKyAgICAvLyBrbm93IHdoYXQgaXQgYWNjZXNzZXMuCisgICAgVmFsdWUgKkFkZHJlc3MgPSBVc2VyLT5nZXRPcGVyYW5kKE9wTm8pOworICAgIGlmICghQWRkcmVzcy0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IFR5cGUgKkFkZHJlc3NBY2Nlc3NUeSA9CisgICAgICBjYXN0PFBvaW50ZXJUeXBlPihBZGRyZXNzLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgIAorICAgIC8vIERvIGEgbWF0Y2ggYWdhaW5zdCB0aGUgcm9vdCBvZiB0aGlzIGFkZHJlc3MsIGlnbm9yaW5nIHByb2ZpdGFiaWxpdHkuIFRoaXMKKyAgICAvLyB3aWxsIHRlbGwgdXMgaWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBmb3IgdGhlIG1lbW9yeSBvcGVyYXRpb24gd2lsbAorICAgIC8vICphY3R1YWxseSogY292ZXIgdGhlIHNoYXJlZCBpbnN0cnVjdGlvbi4KKyAgICBFeHRBZGRyTW9kZSBSZXN1bHQ7CisgICAgQWRkcmVzc2luZ01vZGVNYXRjaGVyIE1hdGNoZXIoTWF0Y2hlZEFkZHJNb2RlSW5zdHMsIFRMSSwgQWRkcmVzc0FjY2Vzc1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeUluc3QsIFJlc3VsdCk7CisgICAgTWF0Y2hlci5JZ25vcmVQcm9maXRhYmlsaXR5ID0gdHJ1ZTsKKyAgICBib29sIFN1Y2Nlc3MgPSBNYXRjaGVyLk1hdGNoQWRkcihBZGRyZXNzLCAwKTsKKyAgICBTdWNjZXNzID0gU3VjY2VzczsgYXNzZXJ0KFN1Y2Nlc3MgJiYgIkNvdWxkbid0IHNlbGVjdCAqYW55dGhpbmcqPyIpOworCisgICAgLy8gSWYgdGhlIG1hdGNoIGRpZG4ndCBjb3ZlciBJLCB0aGVuIGl0IHdvbid0IGJlIHNoYXJlZCBieSBpdC4KKyAgICBpZiAoc3RkOjpmaW5kKE1hdGNoZWRBZGRyTW9kZUluc3RzLmJlZ2luKCksIE1hdGNoZWRBZGRyTW9kZUluc3RzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgSSkgPT0gTWF0Y2hlZEFkZHJNb2RlSW5zdHMuZW5kKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgTWF0Y2hlZEFkZHJNb2RlSW5zdHMuY2xlYXIoKTsKKyAgfQorICAKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9CYXNpY0Jsb2NrVXRpbHMuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvQmFzaWNCbG9ja1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWJhYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvQmFzaWNCbG9ja1V0aWxzLmNwcApAQCAtMCwwICsxLDU1OCBAQAorLy89PT0tLSBCYXNpY0Jsb2NrVXRpbHMuY3BwIC0gQmFzaWNCbG9jayBVdGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZhbWlseSBvZiBmdW5jdGlvbnMgcGVyZm9ybSBtYW5pcHVsYXRpb25zIG9uIGJhc2ljIGJsb2NrcywgYW5kCisvLyBpbnN0cnVjdGlvbnMgY29udGFpbmVkIHdpdGhpbiBiYXNpYyBibG9ja3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9CYXNpY0Jsb2NrVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50LmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9jYWwuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIERlbGV0ZURlYWRCbG9jayAtIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGJsb2NrLCB3aGljaCBtdXN0IGhhdmUgbm8KKy8vLyBwcmVkZWNlc3NvcnMuCit2b2lkIGxsdm06OkRlbGV0ZURlYWRCbG9jayhCYXNpY0Jsb2NrICpCQikgeworICBhc3NlcnQoKHByZWRfYmVnaW4oQkIpID09IHByZWRfZW5kKEJCKSB8fAorICAgICAgICAgLy8gQ2FuIGRlbGV0ZSBzZWxmIGxvb3AuCisgICAgICAgICBCQi0+Z2V0U2luZ2xlUHJlZGVjZXNzb3IoKSA9PSBCQikgJiYgIkJsb2NrIGlzIG5vdCBkZWFkISIpOworICBUZXJtaW5hdG9ySW5zdCAqQkJUZXJtID0gQkItPmdldFRlcm1pbmF0b3IoKTsKKyAgCisgIC8vIExvb3AgdGhyb3VnaCBhbGwgb2Ygb3VyIHN1Y2Nlc3NvcnMgYW5kIG1ha2Ugc3VyZSB0aGV5IGtub3cgdGhhdCBvbmUKKyAgLy8gb2YgdGhlaXIgcHJlZGVjZXNzb3JzIGlzIGdvaW5nIGF3YXkuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCQlRlcm0tPmdldE51bVN1Y2Nlc3NvcnMoKTsgaSAhPSBlOyArK2kpCisgICAgQkJUZXJtLT5nZXRTdWNjZXNzb3IoaSktPnJlbW92ZVByZWRlY2Vzc29yKEJCKTsKKyAgCisgIC8vIFphcCBhbGwgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgYmxvY2suCisgIHdoaWxlICghQkItPmVtcHR5KCkpIHsKKyAgICBJbnN0cnVjdGlvbiAmSSA9IEJCLT5iYWNrKCk7CisgICAgLy8gSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyB1c2VkLCByZXBsYWNlIHVzZXMgd2l0aCBhbiBhcmJpdHJhcnkgdmFsdWUuCisgICAgLy8gQmVjYXVzZSBjb250cm9sIGZsb3cgY2FuJ3QgZ2V0IGhlcmUsIHdlIGRvbid0IGNhcmUgd2hhdCB3ZSByZXBsYWNlIHRoZQorICAgIC8vIHZhbHVlIHdpdGguICBOb3RlIHRoYXQgc2luY2UgdGhpcyBibG9jayBpcyB1bnJlYWNoYWJsZSwgYW5kIGFsbCB2YWx1ZXMKKyAgICAvLyBjb250YWluZWQgd2l0aGluIGl0IG11c3QgZG9taW5hdGUgdGhlaXIgdXNlcywgdGhhdCBhbGwgdXNlcyB3aWxsCisgICAgLy8gZXZlbnR1YWxseSBiZSByZW1vdmVkICh0aGV5IGFyZSB0aGVtc2VsdmVzIGRlYWQpLgorICAgIGlmICghSS51c2VfZW1wdHkoKSkKKyAgICAgIEkucmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChJLmdldFR5cGUoKSkpOworICAgIEJCLT5nZXRJbnN0TGlzdCgpLnBvcF9iYWNrKCk7CisgIH0KKyAgCisgIC8vIFphcCB0aGUgYmxvY2shCisgIEJCLT5lcmFzZUZyb21QYXJlbnQoKTsKK30KKworLy8vIEZvbGRTaW5nbGVFbnRyeVBISU5vZGVzIC0gV2Uga25vdyB0aGF0IEJCIGhhcyBvbmUgcHJlZGVjZXNzb3IuICBJZiB0aGVyZSBhcmUKKy8vLyBhbnkgc2luZ2xlLWVudHJ5IFBISSBub2RlcyBpbiBpdCwgZm9sZCB0aGVtIGF3YXkuICBUaGlzIGhhbmRsZXMgdGhlIGNhc2UKKy8vLyB3aGVuIGFsbCBlbnRyaWVzIHRvIHRoZSBQSEkgbm9kZXMgaW4gYSBibG9jayBhcmUgZ3VhcmFudGVlZCBlcXVhbCwgc3VjaCBhcworLy8vIHdoZW4gdGhlIGJsb2NrIGhhcyBleGFjdGx5IG9uZSBwcmVkZWNlc3Nvci4KK3ZvaWQgbGx2bTo6Rm9sZFNpbmdsZUVudHJ5UEhJTm9kZXMoQmFzaWNCbG9jayAqQkIpIHsKKyAgd2hpbGUgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oQkItPmJlZ2luKCkpKSB7CisgICAgaWYgKFBOLT5nZXRJbmNvbWluZ1ZhbHVlKDApICE9IFBOKQorICAgICAgUE4tPnJlcGxhY2VBbGxVc2VzV2l0aChQTi0+Z2V0SW5jb21pbmdWYWx1ZSgwKSk7CisgICAgZWxzZQorICAgICAgUE4tPnJlcGxhY2VBbGxVc2VzV2l0aChVbmRlZlZhbHVlOjpnZXQoUE4tPmdldFR5cGUoKSkpOworICAgIFBOLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorfQorCisKKy8vLyBEZWxldGVEZWFkUEhJcyAtIEV4YW1pbmUgZWFjaCBQSEkgaW4gdGhlIGdpdmVuIGJsb2NrIGFuZCBkZWxldGUgaXQgaWYgaXQKKy8vLyBpcyBkZWFkLiBBbHNvIHJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbnkgb3BlcmFuZHMgdGhhdCBiZWNvbWUgZGVhZCBhcworLy8vIGEgcmVzdWx0LiBUaGlzIGluY2x1ZGVzIHRyYWNpbmcgdGhlIGRlZi11c2UgbGlzdCBmcm9tIHRoZSBQSEkgdG8gc2VlIGlmCisvLy8gaXQgaXMgdWx0aW1hdGVseSB1bnVzZWQgb3IgaWYgaXQgcmVhY2hlcyBhbiB1bnVzZWQgY3ljbGUuCitib29sIGxsdm06OkRlbGV0ZURlYWRQSElzKEJhc2ljQmxvY2sgKkJCKSB7CisgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0aW5nIGEgUEhJIG1heSBjYXVzZSBtdWx0aXBsZSBQSElzIHRvIGJlIGRlbGV0ZWQKKyAgLy8gb3IgUkFVVydkIHVuZGVmLCBzbyB1c2UgYW4gYXJyYXkgb2YgV2Vha1ZIIGZvciB0aGUgUEhJcyB0byBkZWxldGUuCisgIFNtYWxsVmVjdG9yPFdlYWtWSCwgOD4gUEhJczsKKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQkItPmJlZ2luKCk7CisgICAgICAgUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJKTsgKytJKQorICAgIFBISXMucHVzaF9iYWNrKFBOKTsKKworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBISXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdF9vcl9udWxsPFBISU5vZGU+KFBISXNbaV0ub3BlcmF0b3IgVmFsdWUqKCkpKQorICAgICAgQ2hhbmdlZCB8PSBSZWN1cnNpdmVseURlbGV0ZURlYWRQSElOb2RlKFBOKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIE1lcmdlQmxvY2tJbnRvUHJlZGVjZXNzb3IgLSBBdHRlbXB0cyB0byBtZXJnZSBhIGJsb2NrIGludG8gaXRzIHByZWRlY2Vzc29yLAorLy8vIGlmIHBvc3NpYmxlLiAgVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlLgorYm9vbCBsbHZtOjpNZXJnZUJsb2NrSW50b1ByZWRlY2Vzc29yKEJhc2ljQmxvY2sgKkJCLCBQYXNzICpQKSB7CisgIHByZWRfaXRlcmF0b3IgUEkocHJlZF9iZWdpbihCQikpLCBQRShwcmVkX2VuZChCQikpOworICAvLyBDYW4ndCBtZXJnZSB0aGUgZW50cnkgYmxvY2suICBEb24ndCBtZXJnZSBhd2F5IGJsb2NrcyB3aG8gaGF2ZSB0aGVpcgorICAvLyBhZGRyZXNzIHRha2VuOiB0aGlzIGlzIGEgYnVnIGlmIHRoZSBwcmVkZWNlc3NvciBibG9jayBpcyB0aGUgZW50cnkgbm9kZQorICAvLyAoYmVjYXVzZSB3ZSdkIGVuZCB1cCB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5KSBhbmQgdW5kZXNpcmFibGUgaW4KKyAgLy8gYW55IGNhc2UuCisgIGlmIChwcmVkX2JlZ2luKEJCKSA9PSBwcmVkX2VuZChCQikgfHwKKyAgICAgIEJCLT5oYXNBZGRyZXNzVGFrZW4oKSkgcmV0dXJuIGZhbHNlOworICAKKyAgQmFzaWNCbG9jayAqUHJlZEJCID0gKlBJKys7CisgIGZvciAoOyBQSSAhPSBQRTsgKytQSSkgIC8vIFNlYXJjaCBhbGwgcHJlZGVjZXNzb3JzLCBzZWUgaWYgdGhleSBhcmUgYWxsIHNhbWUKKyAgICBpZiAoKlBJICE9IFByZWRCQikgeworICAgICAgUHJlZEJCID0gMDsgICAgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIGRpZmZlcmVudCBwcmVkZWNlc3NvcnMuLi4KKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIC8vIENhbid0IG1lcmdlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBwcmVkZWNlc3NvcnMuCisgIGlmICghUHJlZEJCKSByZXR1cm4gZmFsc2U7CisgIC8vIERvbid0IGJyZWFrIHNlbGYtbG9vcHMuCisgIGlmIChQcmVkQkIgPT0gQkIpIHJldHVybiBmYWxzZTsKKyAgLy8gRG9uJ3QgYnJlYWsgaW52b2tlcy4KKyAgaWYgKElTQV9JTlZPS0VfSU5TVChQcmVkQkItPmdldFRlcm1pbmF0b3IoKSkpIHJldHVybiBmYWxzZTsKKyAgCisgIHN1Y2NfaXRlcmF0b3IgU0koc3VjY19iZWdpbihQcmVkQkIpKSwgU0Uoc3VjY19lbmQoUHJlZEJCKSk7CisgIEJhc2ljQmxvY2sqIE9ubHlTdWNjID0gQkI7CisgIGZvciAoOyBTSSAhPSBTRTsgKytTSSkKKyAgICBpZiAoKlNJICE9IE9ubHlTdWNjKSB7CisgICAgICBPbmx5U3VjYyA9IDA7ICAgICAvLyBUaGVyZSBhcmUgbXVsdGlwbGUgZGlzdGluY3Qgc3VjY2Vzc29ycyEKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIC8vIENhbid0IG1lcmdlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdWNjZXNzb3JzLgorICBpZiAoIU9ubHlTdWNjKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2FuJ3QgbWVyZ2UgaWYgdGhlcmUgaXMgUEhJIGxvb3AuCisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgQkkgPSBCQi0+YmVnaW4oKSwgQkUgPSBCQi0+ZW5kKCk7IEJJICE9IEJFOyArK0JJKSB7CisgICAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oQkkpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoUE4tPmdldEluY29taW5nVmFsdWUoaSkgPT0gUE4pCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZQorICAgICAgYnJlYWs7CisgIH0KKworICAvLyBCZWdpbiBieSBnZXR0aW5nIHJpZCBvZiB1bm5lZWRlZCBQSElzLgorICB3aGlsZSAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPigmQkItPmZyb250KCkpKSB7CisgICAgUE4tPnJlcGxhY2VBbGxVc2VzV2l0aChQTi0+Z2V0SW5jb21pbmdWYWx1ZSgwKSk7CisgICAgQkItPmdldEluc3RMaXN0KCkucG9wX2Zyb250KCk7ICAvLyBEZWxldGUgdGhlIHBoaSBub2RlLi4uCisgIH0KKyAgCisgIC8vIERlbGV0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggZnJvbSB0aGUgcHJlZGVjZXNzb3IuLi4KKyAgUHJlZEJCLT5nZXRJbnN0TGlzdCgpLnBvcF9iYWNrKCk7CisgIAorICAvLyBNb3ZlIGFsbCBkZWZpbml0aW9ucyBpbiB0aGUgc3VjY2Vzc29yIHRvIHRoZSBwcmVkZWNlc3Nvci4uLgorICBQcmVkQkItPmdldEluc3RMaXN0KCkuc3BsaWNlKFByZWRCQi0+ZW5kKCksIEJCLT5nZXRJbnN0TGlzdCgpKTsKKyAgCisgIC8vIE1ha2UgYWxsIFBISSBub2RlcyB0aGF0IHJlZmVycmVkIHRvIEJCIG5vdyByZWZlciB0byBQcmVkIGFzIHRoZWlyCisgIC8vIHNvdXJjZS4uLgorICBCQi0+cmVwbGFjZUFsbFVzZXNXaXRoKFByZWRCQik7CisgIAorICAvLyBJbmhlcml0IHByZWRlY2Vzc29ycyBuYW1lIGlmIGl0IGV4aXN0cy4KKyAgaWYgKCFQcmVkQkItPmhhc05hbWUoKSkKKyAgICBQcmVkQkItPnRha2VOYW1lKEJCKTsKKyAgCisgIC8vIEZpbmFsbHksIGVyYXNlIHRoZSBvbGQgYmxvY2sgYW5kIHVwZGF0ZSBkb21pbmF0b3IgaW5mby4KKyAgaWYgKFApIHsKKyAgICBpZiAoRG9taW5hdG9yVHJlZSogRFQgPSBQLT5nZXRBbmFseXNpc0lmQXZhaWxhYmxlPERvbWluYXRvclRyZWU+KCkpIHsKKyAgICAgIERvbVRyZWVOb2RlKiBEVE4gPSBEVC0+Z2V0Tm9kZShCQik7CisgICAgICBEb21UcmVlTm9kZSogUHJlZERUTiA9IERULT5nZXROb2RlKFByZWRCQik7CisgIAorICAgICAgaWYgKERUTikgeworICAgICAgICBTbWFsbFB0clNldDxEb21UcmVlTm9kZSosIDg+IENoaWxkcmVuKERUTi0+YmVnaW4oKSwgRFROLT5lbmQoKSk7CisgICAgICAgIGZvciAoU21hbGxQdHJTZXQ8RG9tVHJlZU5vZGUqLCA4Pjo6aXRlcmF0b3IgREkgPSBDaGlsZHJlbi5iZWdpbigpLAorICAgICAgICAgICAgIERFID0gQ2hpbGRyZW4uZW5kKCk7IERJICE9IERFOyArK0RJKQorICAgICAgICAgIERULT5jaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoKkRJLCBQcmVkRFROKTsKKworICAgICAgICBEVC0+ZXJhc2VOb2RlKEJCKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIEJCLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgCisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFJlcGxhY2VJbnN0V2l0aFZhbHVlIC0gUmVwbGFjZSBhbGwgdXNlcyBvZiBhbiBpbnN0cnVjdGlvbiAoc3BlY2lmaWVkIGJ5IEJJKQorLy8vIHdpdGggYSB2YWx1ZSwgdGhlbiByZW1vdmUgYW5kIGRlbGV0ZSB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24uCisvLy8KK3ZvaWQgbGx2bTo6UmVwbGFjZUluc3RXaXRoVmFsdWUoQmFzaWNCbG9jazo6SW5zdExpc3RUeXBlICZCSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yICZCSSwgVmFsdWUgKlYpIHsKKyAgSW5zdHJ1Y3Rpb24gJkkgPSAqQkk7CisgIC8vIFJlcGxhY2VzIGFsbCBvZiB0aGUgdXNlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2l0aCB1c2VzIG9mIHRoZSB2YWx1ZQorICBJLnJlcGxhY2VBbGxVc2VzV2l0aChWKTsKKworICAvLyBNYWtlIHN1cmUgdG8gcHJvcGFnYXRlIGEgbmFtZSBpZiB0aGVyZSBpcyBvbmUgYWxyZWFkeS4KKyAgaWYgKEkuaGFzTmFtZSgpICYmICFWLT5oYXNOYW1lKCkpCisgICAgVi0+dGFrZU5hbWUoJkkpOworCisgIC8vIERlbGV0ZSB0aGUgdW5uZWNlc3NhcnkgaW5zdHJ1Y3Rpb24gbm93Li4uCisgIEJJID0gQklMLmVyYXNlKEJJKTsKK30KKworCisvLy8gUmVwbGFjZUluc3RXaXRoSW5zdCAtIFJlcGxhY2UgdGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCBieSBCSSB3aXRoIHRoZQorLy8vIGluc3RydWN0aW9uIHNwZWNpZmllZCBieSBJLiAgVGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIGlzIGRlbGV0ZWQgYW5kIEJJIGlzCisvLy8gdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV3IGluc3RydWN0aW9uLgorLy8vCit2b2lkIGxsdm06OlJlcGxhY2VJbnN0V2l0aEluc3QoQmFzaWNCbG9jazo6SW5zdExpc3RUeXBlICZCSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgJkJJLCBJbnN0cnVjdGlvbiAqSSkgeworICBhc3NlcnQoSS0+Z2V0UGFyZW50KCkgPT0gMCAmJgorICAgICAgICAgIlJlcGxhY2VJbnN0V2l0aEluc3Q6IEluc3RydWN0aW9uIGFscmVhZHkgaW5zZXJ0ZWQgaW50byBiYXNpYyBibG9jayEiKTsKKworICAvLyBJbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbiBpbnRvIHRoZSBiYXNpYyBibG9jay4uLgorICBCYXNpY0Jsb2NrOjppdGVyYXRvciBOZXcgPSBCSUwuaW5zZXJ0KEJJLCBJKTsKKworICAvLyBSZXBsYWNlIGFsbCB1c2VzIG9mIHRoZSBvbGQgaW5zdHJ1Y3Rpb24sIGFuZCBkZWxldGUgaXQuCisgIFJlcGxhY2VJbnN0V2l0aFZhbHVlKEJJTCwgQkksIEkpOworCisgIC8vIE1vdmUgQkkgYmFjayB0byBwb2ludCB0byB0aGUgbmV3bHkgaW5zZXJ0ZWQgaW5zdHJ1Y3Rpb24KKyAgQkkgPSBOZXc7Cit9CisKKy8vLyBSZXBsYWNlSW5zdFdpdGhJbnN0IC0gUmVwbGFjZSB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGJ5IEZyb20gd2l0aCB0aGUKKy8vLyBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgYnkgVG8uCisvLy8KK3ZvaWQgbGx2bTo6UmVwbGFjZUluc3RXaXRoSW5zdChJbnN0cnVjdGlvbiAqRnJvbSwgSW5zdHJ1Y3Rpb24gKlRvKSB7CisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJJKEZyb20pOworICBSZXBsYWNlSW5zdFdpdGhJbnN0KEZyb20tPmdldFBhcmVudCgpLT5nZXRJbnN0TGlzdCgpLCBCSSwgVG8pOworfQorCisvLy8gUmVtb3ZlU3VjY2Vzc29yIC0gQ2hhbmdlIHRoZSBzcGVjaWZpZWQgdGVybWluYXRvciBpbnN0cnVjdGlvbiBzdWNoIHRoYXQgaXRzCisvLy8gc3VjY2Vzc29yIFN1Y2NOdW0gbm8gbG9uZ2VyIGV4aXN0cy4gIEJlY2F1c2UgdGhpcyByZWR1Y2VzIHRoZSBvdXRnb2luZworLy8vIGRlZ3JlZSBvZiB0aGUgY3VycmVudCBiYXNpYyBibG9jaywgdGhlIGFjdHVhbCB0ZXJtaW5hdG9yIGluc3RydWN0aW9uIGl0c2VsZgorLy8vIG1heSBoYXZlIHRvIGJlIGNoYW5nZWQuICBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgbGFzdCBzdWNjZXNzb3Igb2YgdGhlIGJsb2NrIAorLy8vIGlzIGRlbGV0ZWQsIGEgcmV0dXJuIGluc3RydWN0aW9uIGlzIGluc2VydGVkIGluIGl0cyBwbGFjZSB3aGljaCBjYW4gY2F1c2UgYQorLy8vIHN1cnByaXNpbmcgY2hhbmdlIGluIHByb2dyYW0gYmVoYXZpb3IgaWYgaXQgaXMgbm90IGV4cGVjdGVkLgorLy8vCit2b2lkIGxsdm06OlJlbW92ZVN1Y2Nlc3NvcihUZXJtaW5hdG9ySW5zdCAqVEksIHVuc2lnbmVkIFN1Y2NOdW0pIHsKKyAgYXNzZXJ0KFN1Y2NOdW0gPCBUSS0+Z2V0TnVtU3VjY2Vzc29ycygpICYmCisgICAgICAgICAiVHJ5aW5nIHRvIHJlbW92ZSBhIG5vbmV4aXN0YW50IHN1Y2Nlc3NvciEiKTsKKworICAvLyBJZiBvdXIgb2xkIHN1Y2Nlc3NvciBibG9jayBjb250YWlucyBhbnkgUEhJIG5vZGVzLCByZW1vdmUgdGhlIGVudHJ5IGluIHRoZQorICAvLyBQSEkgbm9kZXMgdGhhdCBjb21lcyBmcm9tIHRoaXMgYnJhbmNoLi4uCisgIC8vCisgIEJhc2ljQmxvY2sgKkJCID0gVEktPmdldFBhcmVudCgpOworICBUSS0+Z2V0U3VjY2Vzc29yKFN1Y2NOdW0pLT5yZW1vdmVQcmVkZWNlc3NvcihCQik7CisKKyAgVGVybWluYXRvckluc3QgKk5ld1RJID0gMDsKKyAgc3dpdGNoIChUSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QnI6CisgICAgLy8gSWYgdGhpcyBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaC4uLiBjb252ZXJ0IHRvIHVuY29uZGl0aW9uYWwgYnJhbmNoLgorICAgIGlmIChUSS0+Z2V0TnVtU3VjY2Vzc29ycygpID09IDIpIHsKKyAgICAgIGNhc3Q8QnJhbmNoSW5zdD4oVEkpLT5zZXRVbmNvbmRpdGlvbmFsRGVzdChUSS0+Z2V0U3VjY2Vzc29yKDEtU3VjY051bSkpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgY29udmVydCB0byBhIHJldHVybiBpbnN0cnVjdGlvbi4uLgorICAgICAgVmFsdWUgKlJldFZhbCA9IDA7CisKKyAgICAgIC8vIENyZWF0ZSBhIHZhbHVlIHRvIHJldHVybi4uLiBpZiB0aGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gbnVsbC4uLgorICAgICAgaWYgKCFCQi0+Z2V0UGFyZW50KCktPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHkoKSkKKyAgICAgICAgUmV0VmFsID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShCQi0+Z2V0UGFyZW50KCktPmdldFJldHVyblR5cGUoKSk7CisKKyAgICAgIC8vIENyZWF0ZSB0aGUgcmV0dXJuLi4uCisgICAgICBOZXdUSSA9IFJldHVybkluc3Q6OkNyZWF0ZShUSS0+Z2V0Q29udGV4dCgpLCBSZXRWYWwpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3dpdGNoOiAgICAvLyBTaG91bGQgcmVtb3ZlIGVudHJ5CisgIGRlZmF1bHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlJldDogICAgICAgLy8gQ2Fubm90IGhhcHBlbiwgaGFzIG5vIHN1Y2Nlc3NvcnMhCisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24gdHlwZSBpbiBSZW1vdmVTdWNjZXNzb3IhIik7CisgIH0KKworICBpZiAoTmV3VEkpICAgLy8gSWYgaXQncyBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbiwgcmVwbGFjZS4KKyAgICBSZXBsYWNlSW5zdFdpdGhJbnN0KFRJLCBOZXdUSSk7Cit9CisKKy8vLyBHZXRTdWNjZXNzb3JOdW1iZXIgLSBTZWFyY2ggZm9yIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yIG9mIGJhc2ljIGJsb2NrIEJCCisvLy8gYW5kIHJldHVybiBpdHMgcG9zaXRpb24gaW4gdGhlIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24ncyBsaXN0IG9mCisvLy8gc3VjY2Vzc29ycy4gIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB3aXRoIGEgYmxvY2sgdGhhdCBpcyBub3QgYQorLy8vIHN1Y2Nlc3Nvci4KK3Vuc2lnbmVkIGxsdm06OkdldFN1Y2Nlc3Nvck51bWJlcihCYXNpY0Jsb2NrICpCQiwgQmFzaWNCbG9jayAqU3VjYykgeworICBUZXJtaW5hdG9ySW5zdCAqVGVybSA9IEJCLT5nZXRUZXJtaW5hdG9yKCk7CisjaWZuZGVmIE5ERUJVRworICB1bnNpZ25lZCBlID0gVGVybS0+Z2V0TnVtU3VjY2Vzc29ycygpOworI2VuZGlmCisgIGZvciAodW5zaWduZWQgaSA9IDA7IDsgKytpKSB7CisgICAgYXNzZXJ0KGkgIT0gZSAmJiAiRGlkbid0IGZpbmQgZWRnZT8iKTsKKyAgICBpZiAoVGVybS0+Z2V0U3VjY2Vzc29yKGkpID09IFN1Y2MpCisgICAgICByZXR1cm4gaTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vIFNwbGl0RWRnZSAtICBTcGxpdCB0aGUgZWRnZSBjb25uZWN0aW5nIHNwZWNpZmllZCBibG9jay4gUGFzcyBQIG11c3QgCisvLy8gbm90IGJlIE5VTEwuIAorQmFzaWNCbG9jayAqbGx2bTo6U3BsaXRFZGdlKEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrICpTdWNjLCBQYXNzICpQKSB7CisgIHVuc2lnbmVkIFN1Y2NOdW0gPSBHZXRTdWNjZXNzb3JOdW1iZXIoQkIsIFN1Y2MpOworICAKKyAgLy8gSWYgdGhpcyBpcyBhIGNyaXRpY2FsIGVkZ2UsIGxldCBTcGxpdENyaXRpY2FsRWRnZSBkbyBpdC4KKyAgVGVybWluYXRvckluc3QgKkxhdGNoVGVybSA9IEJCLT5nZXRUZXJtaW5hdG9yKCk7CisgIGlmIChTcGxpdENyaXRpY2FsRWRnZShMYXRjaFRlcm0sIFN1Y2NOdW0sIFApKQorICAgIHJldHVybiBMYXRjaFRlcm0tPmdldFN1Y2Nlc3NvcihTdWNjTnVtKTsKKworICAvLyBJZiB0aGUgZWRnZSBpc24ndCBjcml0aWNhbCwgdGhlbiBCQiBoYXMgYSBzaW5nbGUgc3VjY2Vzc29yIG9yIFN1Y2MgaGFzIGEKKyAgLy8gc2luZ2xlIHByZWQuICBTcGxpdCB0aGUgYmxvY2suCisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIFNwbGl0UG9pbnQ7CisgIGlmIChCYXNpY0Jsb2NrICpTUCA9IFN1Y2MtPmdldFNpbmdsZVByZWRlY2Vzc29yKCkpIHsKKyAgICAvLyBJZiB0aGUgc3VjY2Vzc29yIG9ubHkgaGFzIGEgc2luZ2xlIHByZWQsIHNwbGl0IHRoZSB0b3Agb2YgdGhlIHN1Y2Nlc3NvcgorICAgIC8vIGJsb2NrLgorICAgIGFzc2VydChTUCA9PSBCQiAmJiAiQ0ZHIGJyb2tlbiIpOworICAgIFNQID0gTlVMTDsKKyAgICByZXR1cm4gU3BsaXRCbG9jayhTdWNjLCBTdWNjLT5iZWdpbigpLCBQKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPdGhlcndpc2UsIGlmIEJCIGhhcyBhIHNpbmdsZSBzdWNjZXNzb3IsIHNwbGl0IGl0IGF0IHRoZSBib3R0b20gb2YgdGhlCisgICAgLy8gYmxvY2suCisgICAgYXNzZXJ0KEJCLT5nZXRUZXJtaW5hdG9yKCktPmdldE51bVN1Y2Nlc3NvcnMoKSA9PSAxICYmCisgICAgICAgICAgICJTaG91bGQgaGF2ZSBhIHNpbmdsZSBzdWNjISIpOyAKKyAgICByZXR1cm4gU3BsaXRCbG9jayhCQiwgQkItPmdldFRlcm1pbmF0b3IoKSwgUCk7CisgIH0KK30KKworLy8vIFNwbGl0QmxvY2sgLSBTcGxpdCB0aGUgc3BlY2lmaWVkIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gLSBldmVyeQorLy8vIHRoaW5nIGJlZm9yZSBTcGxpdFB0IHN0YXlzIGluIE9sZCBhbmQgZXZlcnl0aGluZyBzdGFydGluZyB3aXRoIFNwbGl0UHQgbW92ZXMKKy8vLyB0byBhIG5ldyBibG9jay4gIFRoZSB0d28gYmxvY2tzIGFyZSBqb2luZWQgYnkgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggYW5kCisvLy8gdGhlIGxvb3AgaW5mbyBpcyB1cGRhdGVkLgorLy8vCitCYXNpY0Jsb2NrICpsbHZtOjpTcGxpdEJsb2NrKEJhc2ljQmxvY2sgKk9sZCwgSW5zdHJ1Y3Rpb24gKlNwbGl0UHQsIFBhc3MgKlApIHsKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgU3BsaXRJdCA9IFNwbGl0UHQ7CisgIHdoaWxlIChpc2E8UEhJTm9kZT4oU3BsaXRJdCkpCisgICAgKytTcGxpdEl0OworICBCYXNpY0Jsb2NrICpOZXcgPSBPbGQtPnNwbGl0QmFzaWNCbG9jayhTcGxpdEl0KTsKKworICAvLyBUaGUgbmV3IGJsb2NrIGxpdmVzIGluIHdoaWNoZXZlciBsb29wIHRoZSBvbGQgb25lIGRpZC4gVGhpcyBwcmVzZXJ2ZXMKKyAgLy8gTENTU0EgYXMgd2VsbCwgYmVjYXVzZSB3ZSBmb3JjZSB0aGUgc3BsaXQgcG9pbnQgdG8gYmUgYWZ0ZXIgYW55IFBISSBub2Rlcy4KKyAgaWYgKExvb3BJbmZvKiBMSSA9IFAtPmdldEFuYWx5c2lzSWZBdmFpbGFibGU8TG9vcEluZm8+KCkpCisgICAgaWYgKExvb3AgKkwgPSBMSS0+Z2V0TG9vcEZvcihPbGQpKQorICAgICAgTC0+YWRkQmFzaWNCbG9ja1RvTG9vcChOZXcsIExJLT5nZXRCYXNlKCkpOworCisgIGlmIChEb21pbmF0b3JUcmVlICpEVCA9IFAtPmdldEFuYWx5c2lzSWZBdmFpbGFibGU8RG9taW5hdG9yVHJlZT4oKSkgeworICAgIC8vIE9sZCBkb21pbmF0ZXMgTmV3LiBOZXcgbm9kZSBkb21pYW50ZXMgYWxsIG90aGVyIG5vZGVzIGRvbWluYXRlZCBieSBPbGQuCisgICAgRG9tVHJlZU5vZGUgKk9sZE5vZGUgPSBEVC0+Z2V0Tm9kZShPbGQpOworICAgIHN0ZDo6dmVjdG9yPERvbVRyZWVOb2RlICo+IENoaWxkcmVuOworICAgIGZvciAoRG9tVHJlZU5vZGU6Oml0ZXJhdG9yIEkgPSBPbGROb2RlLT5iZWdpbigpLCBFID0gT2xkTm9kZS0+ZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgCisgICAgICBDaGlsZHJlbi5wdXNoX2JhY2soKkkpOworCisgICAgICBEb21UcmVlTm9kZSAqTmV3Tm9kZSA9IERULT5hZGROZXdCbG9jayhOZXcsT2xkKTsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8RG9tVHJlZU5vZGUgKj46Oml0ZXJhdG9yIEkgPSBDaGlsZHJlbi5iZWdpbigpLAorICAgICAgICAgICAgIEUgPSBDaGlsZHJlbi5lbmQoKTsgSSAhPSBFOyArK0kpIAorICAgICAgICBEVC0+Y2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKCpJLCBOZXdOb2RlKTsKKyAgfQorCisgIGlmIChEb21pbmFuY2VGcm9udGllciAqREYgPSBQLT5nZXRBbmFseXNpc0lmQXZhaWxhYmxlPERvbWluYW5jZUZyb250aWVyPigpKQorICAgIERGLT5zcGxpdEJsb2NrKE9sZCk7CisgICAgCisgIHJldHVybiBOZXc7Cit9CisKKworLy8vIFNwbGl0QmxvY2tQcmVkZWNlc3NvcnMgLSBUaGlzIG1ldGhvZCB0cmFuc2Zvcm1zIEJCIGJ5IGludHJvZHVjaW5nIGEgbmV3CisvLy8gYmFzaWMgYmxvY2sgaW50byB0aGUgZnVuY3Rpb24sIGFuZCBtb3Zpbmcgc29tZSBvZiB0aGUgcHJlZGVjZXNzb3JzIG9mIEJCIHRvCisvLy8gYmUgcHJlZGVjZXNzb3JzIG9mIHRoZSBuZXcgYmxvY2suICBUaGUgbmV3IHByZWRlY2Vzc29ycyBhcmUgaW5kaWNhdGVkIGJ5IHRoZQorLy8vIFByZWRzIGFycmF5LCB3aGljaCBoYXMgTnVtUHJlZHMgZWxlbWVudHMgaW4gaXQuICBUaGUgbmV3IGJsb2NrIGlzIGdpdmVuIGEKKy8vLyBzdWZmaXggb2YgJ1N1ZmZpeCcuCisvLy8KKy8vLyBUaGlzIGN1cnJlbnRseSB1cGRhdGVzIHRoZSBMTFZNIElSLCBBbGlhc0FuYWx5c2lzLCBEb21pbmF0b3JUcmVlLAorLy8vIERvbWluYW5jZUZyb250aWVyLCBMb29wSW5mbywgYW5kIExDQ1NBIGJ1dCBubyBvdGhlciBhbmFseXNlcy4KKy8vLyBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBwcmVzZXJ2ZSBMb29wU2ltcGxpZnkgKGJlY2F1c2UgaXQncworLy8vIGNvbXBsaWNhdGVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBvbmUgb2YgdGhlIGVkZ2VzIGJlaW5nIHNwbGl0CisvLy8gaXMgYW4gZXhpdCBvZiBhIGxvb3Agd2l0aCBvdGhlciBleGl0cykuCisvLy8KK0Jhc2ljQmxvY2sgKmxsdm06OlNwbGl0QmxvY2tQcmVkZWNlc3NvcnMoQmFzaWNCbG9jayAqQkIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpjb25zdCAqUHJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVByZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzICpQKSB7CisgIC8vIENyZWF0ZSBuZXcgYmFzaWMgYmxvY2ssIGluc2VydCByaWdodCBiZWZvcmUgdGhlIG9yaWdpbmFsIGJsb2NrLgorICBCYXNpY0Jsb2NrICpOZXdCQiA9IEJhc2ljQmxvY2s6OkNyZWF0ZShCQi0+Z2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQi0+Z2V0UGFyZW50KCksIEJCKTsKKyAgCisgIC8vIFRoZSBuZXcgYmxvY2sgdW5jb25kaXRpb25hbGx5IGJyYW5jaGVzIHRvIHRoZSBvbGQgYmxvY2suCisgIEJyYW5jaEluc3QgKkJJID0gQnJhbmNoSW5zdDo6Q3JlYXRlKEJCLCBOZXdCQik7CisgIAorICBMb29wSW5mbyAqTEkgPSBQID8gUC0+Z2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxMb29wSW5mbz4oKSA6IDA7CisgIExvb3AgKkwgPSBMSSA/IExJLT5nZXRMb29wRm9yKEJCKSA6IDA7CisgIGJvb2wgUHJlc2VydmVMQ1NTQSA9IFAtPm11c3RQcmVzZXJ2ZUFuYWx5c2lzSUQoTENTU0FJRCk7CisKKyAgLy8gTW92ZSB0aGUgZWRnZXMgZnJvbSBQcmVkcyB0byBwb2ludCB0byBOZXdCQiBpbnN0ZWFkIG9mIEJCLgorICAvLyBXaGlsZSBoZXJlLCBpZiB3ZSBuZWVkIHRvIHByZXNlcnZlIGxvb3AgYW5hbHlzZXMsIGNvbGxlY3QKKyAgLy8gc29tZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhpcyBzcGxpdCB3aWxsIGFmZmVjdCBsb29wcy4KKyAgYm9vbCBIYXNMb29wRXhpdCA9IGZhbHNlOworICBib29sIElzTG9vcEVudHJ5ID0gISFMOworICBib29sIFNwbGl0TWFrZXNOZXdMb29wSGVhZGVyID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUHJlZHM7ICsraSkgeworICAgIC8vIFRoaXMgaXMgc2xpZ2h0bHkgbW9yZSBzdHJpY3QgdGhhbiBuZWNlc3Nhcnk7IHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50CisgICAgLy8gaXMgdGhhdCB0aGVyZSBiZSBubyBtb3JlIHRoYW4gb25lIGluZGlyZWN0YnIgYnJhbmNoaW5nIHRvIEJCLiBBbmQKKyAgICAvLyBhbGwgQmxvY2tBZGRyZXNzIHVzZXMgd291bGQgbmVlZCB0byBiZSB1cGRhdGVkLgorICAgIGFzc2VydCghaXNhPEluZGlyZWN0QnJJbnN0PihQcmVkc1tpXS0+Z2V0VGVybWluYXRvcigpKSAmJgorICAgICAgICAgICAiQ2Fubm90IHNwbGl0IGFuIGVkZ2UgZnJvbSBhbiBJbmRpcmVjdEJySW5zdCIpOworCisgICAgUHJlZHNbaV0tPmdldFRlcm1pbmF0b3IoKS0+cmVwbGFjZVVzZXNPZldpdGgoQkIsIE5ld0JCKTsKKworICAgIGlmIChMSSkgeworICAgICAgLy8gSWYgd2UgbmVlZCB0byBwcmVzZXJ2ZSBMQ1NTQSwgZGV0ZXJtaW5lIGlmIGFueSBvZgorICAgICAgLy8gdGhlIHByZWRzIGlzIGEgbG9vcCBleGl0LgorICAgICAgaWYgKFByZXNlcnZlTENTU0EpCisgICAgICAgIGlmIChMb29wICpQTCA9IExJLT5nZXRMb29wRm9yKFByZWRzW2ldKSkKKyAgICAgICAgICBpZiAoIVBMLT5jb250YWlucyhCQikpCisgICAgICAgICAgICBIYXNMb29wRXhpdCA9IHRydWU7CisgICAgICAvLyBJZiB3ZSBuZWVkIHRvIHByZXNlcnZlIExvb3BJbmZvLCBub3RlIHdoZXRoZXIgYW55IG9mIHRoZQorICAgICAgLy8gcHJlZHMgY3Jvc3NlcyBhbiBpbnRlcmVzdGluZyBsb29wIGJvdW5kYXJ5LgorICAgICAgaWYgKEwpIHsKKyAgICAgICAgaWYgKEwtPmNvbnRhaW5zKFByZWRzW2ldKSkKKyAgICAgICAgICBJc0xvb3BFbnRyeSA9IGZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgU3BsaXRNYWtlc05ld0xvb3BIZWFkZXIgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFVwZGF0ZSBkb21pbmF0b3IgdHJlZSBhbmQgZG9taW5hdG9yIGZyb250aWVyIGlmIGF2YWlsYWJsZS4KKyAgRG9taW5hdG9yVHJlZSAqRFQgPSBQID8gUC0+Z2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxEb21pbmF0b3JUcmVlPigpIDogMDsKKyAgaWYgKERUKQorICAgIERULT5zcGxpdEJsb2NrKE5ld0JCKTsKKyAgaWYgKERvbWluYW5jZUZyb250aWVyICpERiA9IFAgPyBQLT5nZXRBbmFseXNpc0lmQXZhaWxhYmxlPERvbWluYW5jZUZyb250aWVyPigpOjApCisgICAgREYtPnNwbGl0QmxvY2soTmV3QkIpOworCisgIC8vIEluc2VydCBhIG5ldyBQSEkgbm9kZSBpbnRvIE5ld0JCIGZvciBldmVyeSBQSEkgbm9kZSBpbiBCQiBhbmQgdGhhdCBuZXcgUEhJCisgIC8vIG5vZGUgYmVjb21lcyBhbiBpbmNvbWluZyB2YWx1ZSBmb3IgQkIncyBwaGkgbm9kZS4gIEhvd2V2ZXIsIGlmIHRoZSBQcmVkcworICAvLyBsaXN0IGlzIGVtcHR5LCB3ZSBuZWVkIHRvIGluc2VydCBkdW1teSBlbnRyaWVzIGludG8gdGhlIFBISSBub2RlcyBpbiBCQiB0bworICAvLyBhY2NvdW50IGZvciB0aGUgbmV3bHkgY3JlYXRlZCBwcmVkZWNlc3Nvci4KKyAgaWYgKE51bVByZWRzID09IDApIHsKKyAgICAvLyBJbnNlcnQgZHVtbXkgdmFsdWVzIGFzIHRoZSBpbmNvbWluZyB2YWx1ZS4KKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCQi0+YmVnaW4oKTsgaXNhPFBISU5vZGU+KEkpOyArK0kpCisgICAgICBjYXN0PFBISU5vZGU+KEkpLT5hZGRJbmNvbWluZyhVbmRlZlZhbHVlOjpnZXQoSS0+Z2V0VHlwZSgpKSwgTmV3QkIpOworICAgIHJldHVybiBOZXdCQjsKKyAgfQorCisgIEFsaWFzQW5hbHlzaXMgKkFBID0gUCA/IFAtPmdldEFuYWx5c2lzSWZBdmFpbGFibGU8QWxpYXNBbmFseXNpcz4oKSA6IDA7CisKKyAgaWYgKEwpIHsKKyAgICBpZiAoSXNMb29wRW50cnkpIHsKKyAgICAgIC8vIEFkZCB0aGUgbmV3IGJsb2NrIHRvIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBsb29wIChhbmQgbm90IGFuCisgICAgICAvLyBhZGphY2VudCBsb29wKS4gVG8gZmluZCB0aGlzLCBleGFtaW5lIGVhY2ggb2YgdGhlIHByZWRlY2Vzc29ycyBhbmQKKyAgICAgIC8vIGRldGVybWluZSB3aGljaCBsb29wcyBlbmNsb3NlIHRoZW0sIGFuZCBzZWxlY3QgdGhlIG1vc3QtbmVzdGVkIGxvb3AKKyAgICAgIC8vIHdoaWNoIGNvbnRhaW5zIHRoZSBsb29wIGNvbnRhaW5pbmcgdGhlIGJsb2NrIGJlaW5nIHNwbGl0LgorICAgICAgTG9vcCAqSW5uZXJtb3N0UHJlZExvb3AgPSAwOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1QcmVkczsgKytpKQorICAgICAgICBpZiAoTG9vcCAqUHJlZExvb3AgPSBMSS0+Z2V0TG9vcEZvcihQcmVkc1tpXSkpIHsKKyAgICAgICAgICAvLyBTZWVrIGEgbG9vcCB3aGljaCBhY3R1YWxseSBjb250YWlucyB0aGUgYmxvY2sgYmVpbmcgc3BsaXQgKHRvCisgICAgICAgICAgLy8gYXZvaWQgYWRqYWNlbnQgbG9vcHMpLgorICAgICAgICAgIHdoaWxlIChQcmVkTG9vcCAmJiAhUHJlZExvb3AtPmNvbnRhaW5zKEJCKSkKKyAgICAgICAgICAgIFByZWRMb29wID0gUHJlZExvb3AtPmdldFBhcmVudExvb3AoKTsKKyAgICAgICAgICAvLyBTZWxlY3QgdGhlIG1vc3QtbmVzdGVkIG9mIHRoZXNlIGxvb3BzIHdoaWNoIGNvbnRhaW5zIHRoZSBibG9jay4KKyAgICAgICAgICBpZiAoUHJlZExvb3AgJiYKKyAgICAgICAgICAgICAgUHJlZExvb3AtPmNvbnRhaW5zKEJCKSAmJgorICAgICAgICAgICAgICAoIUlubmVybW9zdFByZWRMb29wIHx8CisgICAgICAgICAgICAgICBJbm5lcm1vc3RQcmVkTG9vcC0+Z2V0TG9vcERlcHRoKCkgPCBQcmVkTG9vcC0+Z2V0TG9vcERlcHRoKCkpKQorICAgICAgICAgICAgSW5uZXJtb3N0UHJlZExvb3AgPSBQcmVkTG9vcDsKKyAgICAgICAgfQorICAgICAgaWYgKElubmVybW9zdFByZWRMb29wKQorICAgICAgICBJbm5lcm1vc3RQcmVkTG9vcC0+YWRkQmFzaWNCbG9ja1RvTG9vcChOZXdCQiwgTEktPmdldEJhc2UoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEwtPmFkZEJhc2ljQmxvY2tUb0xvb3AoTmV3QkIsIExJLT5nZXRCYXNlKCkpOworICAgICAgaWYgKFNwbGl0TWFrZXNOZXdMb29wSGVhZGVyKQorICAgICAgICBMLT5tb3ZlVG9IZWFkZXIoTmV3QkIpOworICAgIH0KKyAgfQorICAKKyAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgUEhJIG5vZGUgaW4gTmV3QkIgZm9yIGVhY2ggUEhJIG5vZGUgaW4gQkIuCisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpOyBpc2E8UEhJTm9kZT4oSSk7ICkgeworICAgIFBISU5vZGUgKlBOID0gY2FzdDxQSElOb2RlPihJKyspOworICAgIAorICAgIC8vIENoZWNrIHRvIHNlZSBpZiBhbGwgb2YgdGhlIHZhbHVlcyBjb21pbmcgaW4gYXJlIHRoZSBzYW1lLiAgSWYgc28sIHdlCisgICAgLy8gZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSBuZXcgUEhJIG5vZGUsIHVubGVzcyBpdCdzIG5lZWRlZCBmb3IgTENTU0EuCisgICAgVmFsdWUgKkluVmFsID0gMDsKKyAgICBpZiAoIUhhc0xvb3BFeGl0KSB7CisgICAgICBJblZhbCA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soUHJlZHNbMF0pOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBOdW1QcmVkczsgKytpKQorICAgICAgICBpZiAoSW5WYWwgIT0gUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhQcmVkc1tpXSkpIHsKKyAgICAgICAgICBJblZhbCA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoSW5WYWwpIHsKKyAgICAgIC8vIElmIGFsbCBpbmNvbWluZyB2YWx1ZXMgZm9yIHRoZSBuZXcgUEhJIHdvdWxkIGJlIHRoZSBzYW1lLCBqdXN0IGRvbid0CisgICAgICAvLyBtYWtlIGEgbmV3IFBISS4gIEluc3RlYWQsIGp1c3QgcmVtb3ZlIHRoZSBpbmNvbWluZyB2YWx1ZXMgZnJvbSB0aGUgb2xkCisgICAgICAvLyBQSEkuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVByZWRzOyArK2kpCisgICAgICAgIFBOLT5yZW1vdmVJbmNvbWluZ1ZhbHVlKFByZWRzW2ldLCBmYWxzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIElmIHRoZSB2YWx1ZXMgY29taW5nIGludG8gdGhlIGJsb2NrIGFyZSBub3QgdGhlIHNhbWUsIHdlIG5lZWQgYSBQSEkuCisgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBQSEkgbm9kZSwgaW5zZXJ0IGl0IGludG8gTmV3QkIgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2sKKyAgICAgIFBISU5vZGUgKk5ld1BISSA9CisgICAgICAgIFBISU5vZGU6OkNyZWF0ZShQTi0+Z2V0VHlwZSgpLCBCSSk7CisgICAgICBpZiAoQUEpIEFBLT5jb3B5VmFsdWUoUE4sIE5ld1BISSk7CisgICAgICAKKyAgICAgIC8vIE1vdmUgYWxsIG9mIHRoZSBQSEkgdmFsdWVzIGZvciAnUHJlZHMnIHRvIHRoZSBuZXcgUEhJLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1QcmVkczsgKytpKSB7CisgICAgICAgIFZhbHVlICpWID0gUE4tPnJlbW92ZUluY29taW5nVmFsdWUoUHJlZHNbaV0sIGZhbHNlKTsKKyAgICAgICAgTmV3UEhJLT5hZGRJbmNvbWluZyhWLCBQcmVkc1tpXSk7CisgICAgICB9CisgICAgICBJblZhbCA9IE5ld1BISTsKKyAgICB9CisgICAgCisgICAgLy8gQWRkIGFuIGluY29taW5nIHZhbHVlIHRvIHRoZSBQSEkgbm9kZSBpbiB0aGUgbG9vcCBmb3IgdGhlIHByZWhlYWRlcgorICAgIC8vIGVkZ2UuCisgICAgUE4tPmFkZEluY29taW5nKEluVmFsLCBOZXdCQik7CisgIH0KKyAgCisgIHJldHVybiBOZXdCQjsKK30KKworLy8vIEZpbmRGdW5jdGlvbkJhY2tlZGdlcyAtIEFuYWx5emUgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0byBmaW5kIGFsbCBvZiB0aGUKKy8vLyBsb29wIGJhY2tlZGdlcyBpbiB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiB0aGVtLiAgVGhpcyBpcyBhIHJlbGF0aXZlbHkgY2hlYXAKKy8vLyAoY29tcGFyZWQgdG8gY29tcHV0aW5nIGRvbWluYXRvcnMgYW5kIGxvb3AgaW5mbykgYW5hbHlzaXMuCisvLy8KKy8vLyBUaGUgb3V0cHV0IGlzIGFkZGVkIHRvIFJlc3VsdCwgYXMgcGFpcnMgb2YgPGZyb20sdG8+IGVkZ2UgaW5mby4KK3ZvaWQgbGx2bTo6RmluZEZ1bmN0aW9uQmFja2VkZ2VzKGNvbnN0IEZ1bmN0aW9uICZGLAorICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGNvbnN0IEJhc2ljQmxvY2sqLGNvbnN0IEJhc2ljQmxvY2sqPiA+ICZSZXN1bHQpIHsKKyAgY29uc3QgQmFzaWNCbG9jayAqQkIgPSAmRi5nZXRFbnRyeUJsb2NrKCk7CisgIGlmIChzdWNjX2JlZ2luKEJCKSA9PSBzdWNjX2VuZChCQikpCisgICAgcmV0dXJuOworICAKKyAgU21hbGxQdHJTZXQ8Y29uc3QgQmFzaWNCbG9jayosIDg+IFZpc2l0ZWQ7CisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBCYXNpY0Jsb2NrKiwgc3VjY19jb25zdF9pdGVyYXRvcj4sIDg+IFZpc2l0U3RhY2s7CisgIFNtYWxsUHRyU2V0PGNvbnN0IEJhc2ljQmxvY2sqLCA4PiBJblN0YWNrOworICAKKyAgVmlzaXRlZC5pbnNlcnQoQkIpOworICBWaXNpdFN0YWNrLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihCQiwgc3VjY19iZWdpbihCQikpKTsKKyAgSW5TdGFjay5pbnNlcnQoQkIpOworICBkbyB7CisgICAgc3RkOjpwYWlyPGNvbnN0IEJhc2ljQmxvY2sqLCBzdWNjX2NvbnN0X2l0ZXJhdG9yPiAmVG9wID0gVmlzaXRTdGFjay5iYWNrKCk7CisgICAgY29uc3QgQmFzaWNCbG9jayAqUGFyZW50QkIgPSBUb3AuZmlyc3Q7CisgICAgc3VjY19jb25zdF9pdGVyYXRvciAmSSA9IFRvcC5zZWNvbmQ7CisgICAgCisgICAgYm9vbCBGb3VuZE5ldyA9IGZhbHNlOworICAgIHdoaWxlIChJICE9IHN1Y2NfZW5kKFBhcmVudEJCKSkgeworICAgICAgQkIgPSAqSSsrOworICAgICAgaWYgKFZpc2l0ZWQuaW5zZXJ0KEJCKSkgeworICAgICAgICBGb3VuZE5ldyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gU3VjY2Vzc29yIGlzIGluIFZpc2l0U3RhY2ssIGl0J3MgYSBiYWNrIGVkZ2UuCisgICAgICBpZiAoSW5TdGFjay5jb3VudChCQikpCisgICAgICAgIFJlc3VsdC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUGFyZW50QkIsIEJCKSk7CisgICAgfQorICAgIAorICAgIGlmIChGb3VuZE5ldykgeworICAgICAgLy8gR28gZG93biBvbmUgbGV2ZWwgaWYgdGhlcmUgaXMgYSB1bnZpc2l0ZWQgc3VjY2Vzc29yLgorICAgICAgSW5TdGFjay5pbnNlcnQoQkIpOworICAgICAgVmlzaXRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQkIsIHN1Y2NfYmVnaW4oQkIpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEdvIHVwIG9uZSBsZXZlbC4KKyAgICAgIEluU3RhY2suZXJhc2UoVmlzaXRTdGFjay5wb3BfYmFja192YWwoKS5maXJzdCk7CisgICAgfQorICB9IHdoaWxlICghVmlzaXRTdGFjay5lbXB0eSgpKTsKKyAgCisgIAorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvQnJlYWtDcml0aWNhbEVkZ2VzLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0JyZWFrQ3JpdGljYWxFZGdlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlNjM5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0JyZWFrQ3JpdGljYWxFZGdlcy5jcHAKQEAgLTAsMCArMSw0NDIgQEAKKy8vPT09LSBCcmVha0NyaXRpY2FsRWRnZXMuY3BwIC0gQ3JpdGljYWwgRWRnZSBFbGltaW5hdGlvbiBQYXNzIC0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQnJlYWtDcml0aWNhbEVkZ2VzIHBhc3MgLSBCcmVhayBhbGwgb2YgdGhlIGNyaXRpY2FsIGVkZ2VzIGluIHRoZSBDRkcgYnkKKy8vIGluc2VydGluZyBhIGR1bW15IGJhc2ljIGJsb2NrLiAgVGhpcyBwYXNzIG1heSBiZSAicmVxdWlyZWQiIGJ5IHBhc3NlcyB0aGF0CisvLyBjYW5ub3QgZGVhbCB3aXRoIGNyaXRpY2FsIGVkZ2VzLiAgRm9yIHRoaXMgdXNhZ2UsIHRoZSBzdHJ1Y3R1cmUgdHlwZSBpcworLy8gZm9yd2FyZCBkZWNsYXJlZC4gIFRoaXMgcGFzcyBvYnZpb3VzbHkgaW52YWxpZGF0ZXMgdGhlIENGRywgYnV0IGNhbiB1cGRhdGUKKy8vIGZvcndhcmQgZG9taW5hdG9yIChzZXQsIGltbWVkaWF0ZSBkb21pbmF0b3JzLCB0cmVlLCBhbmQgZnJvbnRpZXIpCisvLyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImJyZWFrLWNyaXQtZWRnZXMiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9CYXNpY0Jsb2NrVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Qcm9maWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUJyb2tlbiwgIk51bWJlciBvZiBibG9ja3MgaW5zZXJ0ZWQiKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEJyZWFrQ3JpdGljYWxFZGdlcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgQnJlYWtDcml0aWNhbEVkZ2VzKCkgOiBGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuYWRkUHJlc2VydmVkPERvbWluYXRvclRyZWU+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8RG9taW5hbmNlRnJvbnRpZXI+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8TG9vcEluZm8+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8UHJvZmlsZUluZm8+KCk7CisKKyAgICAgIC8vIE5vIGxvb3AgY2Fub25pY2FsaXphdGlvbiBndWFyYW50ZWVzIGFyZSBicm9rZW4gYnkgdGhpcyBwYXNzLgorICAgICAgQVUuYWRkUHJlc2VydmVkSUQoTG9vcFNpbXBsaWZ5SUQpOworICAgIH0KKyAgfTsKK30KKworY2hhciBCcmVha0NyaXRpY2FsRWRnZXM6OklEID0gMDsKK3N0YXRpYyBSZWdpc3RlclBhc3M8QnJlYWtDcml0aWNhbEVkZ2VzPgorWCgiYnJlYWstY3JpdC1lZGdlcyIsICJCcmVhayBjcml0aWNhbCBlZGdlcyBpbiBDRkciKTsKKworLy8gUHVibGljYWxseSBleHBvc2VkIGludGVyZmFjZSB0byBwYXNzLi4uCitjaGFyICZsbHZtOjpCcmVha0NyaXRpY2FsRWRnZXNJRCA9IEJyZWFrQ3JpdGljYWxFZGdlczo6SUQ7CitGdW5jdGlvblBhc3MgKmxsdm06OmNyZWF0ZUJyZWFrQ3JpdGljYWxFZGdlc1Bhc3MoKSB7CisgIHJldHVybiBuZXcgQnJlYWtDcml0aWNhbEVkZ2VzKCk7Cit9CisKKy8vIHJ1bk9uRnVuY3Rpb24gLSBMb29wIG92ZXIgYWxsIG9mIHRoZSBlZGdlcyBpbiB0aGUgQ0ZHLCBicmVha2luZyBjcml0aWNhbAorLy8gZWRnZXMgYXMgdGhleSBhcmUgZm91bmQuCisvLworYm9vbCBCcmVha0NyaXRpY2FsRWRnZXM6OnJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIFRlcm1pbmF0b3JJbnN0ICpUSSA9IEktPmdldFRlcm1pbmF0b3IoKTsKKyAgICBpZiAoVEktPmdldE51bVN1Y2Nlc3NvcnMoKSA+IDEgJiYgIWlzYTxJbmRpcmVjdEJySW5zdD4oVEkpKQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRJLT5nZXROdW1TdWNjZXNzb3JzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoU3BsaXRDcml0aWNhbEVkZ2UoVEksIGksIHRoaXMpKSB7CisgICAgICAgICAgKytOdW1Ccm9rZW47CisgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgfQorCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIGNyaXRpY2FsIGVkZ2UgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gaXNDcml0aWNhbEVkZ2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGVkZ2UgaXMgYSBjcml0aWNhbCBlZGdlLgorLy8gQ3JpdGljYWwgZWRnZXMgYXJlIGVkZ2VzIGZyb20gYSBibG9jayB3aXRoIG11bHRpcGxlIHN1Y2Nlc3NvcnMgdG8gYSBibG9jaworLy8gd2l0aCBtdWx0aXBsZSBwcmVkZWNlc3NvcnMuCisvLworYm9vbCBsbHZtOjppc0NyaXRpY2FsRWRnZShjb25zdCBUZXJtaW5hdG9ySW5zdCAqVEksIHVuc2lnbmVkIFN1Y2NOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dJZGVudGljYWxFZGdlcykgeworICBhc3NlcnQoU3VjY051bSA8IFRJLT5nZXROdW1TdWNjZXNzb3JzKCkgJiYgIklsbGVnYWwgZWRnZSBzcGVjaWZpY2F0aW9uISIpOworICBpZiAoVEktPmdldE51bVN1Y2Nlc3NvcnMoKSA9PSAxKSByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgQmFzaWNCbG9jayAqRGVzdCA9IFRJLT5nZXRTdWNjZXNzb3IoU3VjY051bSk7CisgIGNvbnN0X3ByZWRfaXRlcmF0b3IgSSA9IHByZWRfYmVnaW4oRGVzdCksIEUgPSBwcmVkX2VuZChEZXN0KTsKKworICAvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHByZWRlY2Vzc29yLCB0aGlzIGlzIGEgY3JpdGljYWwgZWRnZS4uLgorICBhc3NlcnQoSSAhPSBFICYmICJObyBwcmVkcywgYnV0IHdlIGhhdmUgYW4gZWRnZSB0byB0aGUgYmxvY2s/Iik7CisgIGNvbnN0IEJhc2ljQmxvY2sgKkZpcnN0UHJlZCA9ICpJOworICArK0k7ICAgICAgICAvLyBTa2lwIG9uZSBlZGdlIGR1ZSB0byB0aGUgaW5jb21pbmcgYXJjIGZyb20gVEkuCisgIGlmICghQWxsb3dJZGVudGljYWxFZGdlcykKKyAgICByZXR1cm4gSSAhPSBFOworICAKKyAgLy8gSWYgQWxsb3dJZGVudGljYWxFZGdlcyBpcyB0cnVlLCB0aGVuIHdlIGFsbG93IHRoaXMgZWRnZSB0byBiZSBjb25zaWRlcmVkCisgIC8vIG5vbi1jcml0aWNhbCBpZmYgYWxsIHByZWRzIGNvbWUgZnJvbSBUSSdzIGJsb2NrLgorICB3aGlsZSAoSSAhPSBFKSB7CisgICAgY29uc3QgQmFzaWNCbG9jayAqUCA9ICpJOworICAgIGlmIChQICE9IEZpcnN0UHJlZCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIC8vIE5vdGU6IGxlYXZlIHRoaXMgYXMgaXMgdW50aWwgbm8gb25lIGV2ZXIgY29tcGlsZXMgd2l0aCBlaXRoZXIgZ2NjIDQuMC4xCisgICAgLy8gb3IgWGNvZGUgMi4gVGhpcyBzZWVtcyB0byB3b3JrIGFyb3VuZCB0aGUgcHJlZF9pdGVyYXRvciBhc3NlcnQgaW4gUFIgMjIwNworICAgIEUgPSBwcmVkX2VuZChQKTsKKyAgICArK0k7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gQ3JlYXRlUEhJc0ZvclNwbGl0TG9vcEV4aXQgLSBXaGVuIGEgbG9vcCBleGl0IGVkZ2UgaXMgc3BsaXQsIExDU1NBIGZvcm0KKy8vLyBtYXkgcmVxdWlyZSBuZXcgUEhJcyBpbiB0aGUgbmV3IGV4aXQgYmxvY2suIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyB0aGUKKy8vLyBuZXcgUEhJcywgYXMgbmVlZGVkLiAgUHJlZHMgaXMgYSBsaXN0IG9mIHByZWRzIGluc2lkZSB0aGUgbG9vcCwgU3BsaXRCQgorLy8vIGlzIHRoZSBuZXcgbG9vcCBleGl0IGJsb2NrLCBhbmQgRGVzdEJCIGlzIHRoZSBvbGQgbG9vcCBleGl0LCBub3cgdGhlCisvLy8gc3VjY2Vzc29yIG9mIFNwbGl0QkIuCitzdGF0aWMgdm9pZCBDcmVhdGVQSElzRm9yU3BsaXRMb29wRXhpdChTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayAqPiAmUHJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpTcGxpdEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqRGVzdEJCKSB7CisgIC8vIFNwbGl0QkIgc2hvdWxkbid0IGhhdmUgYW55dGhpbmcgbm9uLXRyaXZpYWwgaW4gaXQgeWV0LgorICBhc3NlcnQoU3BsaXRCQi0+Z2V0Rmlyc3ROb25QSEkoKSA9PSBTcGxpdEJCLT5nZXRUZXJtaW5hdG9yKCkgJiYKKyAgICAgICAgICJTcGxpdEJCIGhhcyBub24tUEhJIG5vZGVzISIpOworCisgIC8vIEZvciBlYWNoIFBISSBpbiB0aGUgZGVzdGluYXRpb24gYmxvY2suLi4KKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gRGVzdEJCLT5iZWdpbigpOworICAgICAgIFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSSk7ICsrSSkgeworICAgIHVuc2lnbmVkIElkeCA9IFBOLT5nZXRCYXNpY0Jsb2NrSW5kZXgoU3BsaXRCQik7CisgICAgVmFsdWUgKlYgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZShJZHgpOworICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIFBISSB3aGljaCBhbHJlYWR5IHNhdGlzZmllcyBMQ1NTQSwgZG9uJ3QgY3JlYXRlCisgICAgLy8gYSBuZXcgb25lLgorICAgIGlmIChjb25zdCBQSElOb2RlICpWUCA9IGR5bl9jYXN0PFBISU5vZGU+KFYpKQorICAgICAgaWYgKFZQLT5nZXRQYXJlbnQoKSA9PSBTcGxpdEJCKQorICAgICAgICBjb250aW51ZTsKKyAgICAvLyBPdGhlcndpc2UgYSBuZXcgUEhJIGlzIG5lZWRlZC4gQ3JlYXRlIG9uZSBhbmQgcG9wdWxhdGUgaXQuCisgICAgUEhJTm9kZSAqTmV3UE4gPSBQSElOb2RlOjpDcmVhdGUoUE4tPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxpdEJCLT5nZXRUZXJtaW5hdG9yKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcmVkcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgTmV3UE4tPmFkZEluY29taW5nKFYsIFByZWRzW2ldKTsKKyAgICAvLyBVcGRhdGUgdGhlIG9yaWdpbmFsIFBISS4KKyAgICBQTi0+c2V0SW5jb21pbmdWYWx1ZShJZHgsIE5ld1BOKTsKKyAgfQorfQorCisvLy8gU3BsaXRDcml0aWNhbEVkZ2UgLSBJZiB0aGlzIGVkZ2UgaXMgYSBjcml0aWNhbCBlZGdlLCBpbnNlcnQgYSBuZXcgbm9kZSB0bworLy8vIHNwbGl0IHRoZSBjcml0aWNhbCBlZGdlLiAgVGhpcyB3aWxsIHVwZGF0ZSBEb21pbmF0b3JUcmVlIGFuZAorLy8vIERvbWluYXRvckZyb250aWVyIGluZm9ybWF0aW9uIGlmIGl0IGlzIGF2YWlsYWJsZSwgdGh1cyBjYWxsaW5nIHRoaXMgcGFzcworLy8vIHdpbGwgbm90IGludmFsaWRhdGUgZWl0aGVyIG9mIHRoZW0uIFRoaXMgcmV0dXJucyB0aGUgbmV3IGJsb2NrIGlmIHRoZSBlZGdlCisvLy8gd2FzIHNwbGl0LCBudWxsIG90aGVyd2lzZS4KKy8vLworLy8vIElmIE1lcmdlSWRlbnRpY2FsRWRnZXMgaXMgdHJ1ZSAobm90IHRoZSBkZWZhdWx0KSwgKmFsbCogZWRnZXMgZnJvbSBUSSB0byB0aGUKKy8vLyBzcGVjaWZpZWQgc3VjY2Vzc29yIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIHNhbWUgY3JpdGljYWwgZWRnZSBibG9jay4gIAorLy8vIFRoaXMgaXMgbW9zdCBjb21tb25seSBpbnRlcmVzdGluZyB3aXRoIHN3aXRjaCBpbnN0cnVjdGlvbnMsIHdoaWNoIG1heSAKKy8vLyBoYXZlIG1hbnkgZWRnZXMgdG8gYW55IG9uZSBkZXN0aW5hdGlvbi4gIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBlZGdlcyB0byB0aGF0CisvLy8gZGVzdCBnbyB0byBvbmUgYmxvY2sgaW5zdGVhZCBvZiBlYWNoIGdvaW5nIHRvIGEgZGlmZmVyZW50IGJsb2NrLCBidXQgaXNuJ3QgCisvLy8gdGhlIHN0YW5kYXJkIGRlZmluaXRpb24gb2YgYSAiY3JpdGljYWwgZWRnZSIuCisvLy8KKy8vLyBJdCBpcyBpbnZhbGlkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbiBhIGNyaXRpY2FsIGVkZ2UgdGhhdCBzdGFydHMgYXQgYW4KKy8vLyBJbmRpcmVjdEJySW5zdC4gIFNwbGl0dGluZyB0aGVzZSBlZGdlcyB3aWxsIGFsbW9zdCBhbHdheXMgY3JlYXRlIGFuIGludmFsaWQKKy8vLyBwcm9ncmFtIGJlY2F1c2UgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldyBibG9jayB3b24ndCBiZSB0aGUgb25lIHRoYXQgaXMganVtcGVkCisvLy8gdG8uCisvLy8KK0Jhc2ljQmxvY2sgKmxsdm06OlNwbGl0Q3JpdGljYWxFZGdlKFRlcm1pbmF0b3JJbnN0ICpUSSwgdW5zaWduZWQgU3VjY051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3MgKlAsIGJvb2wgTWVyZ2VJZGVudGljYWxFZGdlcykgeworICBpZiAoIWlzQ3JpdGljYWxFZGdlKFRJLCBTdWNjTnVtLCBNZXJnZUlkZW50aWNhbEVkZ2VzKSkgcmV0dXJuIDA7CisgIAorICBhc3NlcnQoIWlzYTxJbmRpcmVjdEJySW5zdD4oVEkpICYmCisgICAgICAgICAiQ2Fubm90IHNwbGl0IGNyaXRpY2FsIGVkZ2UgZnJvbSBJbmRpcmVjdEJySW5zdCIpOworICAKKyAgQmFzaWNCbG9jayAqVElCQiA9IFRJLT5nZXRQYXJlbnQoKTsKKyAgQmFzaWNCbG9jayAqRGVzdEJCID0gVEktPmdldFN1Y2Nlc3NvcihTdWNjTnVtKTsKKworICAvLyBDcmVhdGUgYSBuZXcgYmFzaWMgYmxvY2ssIGxpbmtpbmcgaXQgaW50byB0aGUgQ0ZHLgorICBCYXNpY0Jsb2NrICpOZXdCQiA9IEJhc2ljQmxvY2s6OkNyZWF0ZShUSS0+Z2V0Q29udGV4dCgpKTsKKyAgLy8gQ3JlYXRlIG91ciB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KKyAgQnJhbmNoSW5zdDo6Q3JlYXRlKERlc3RCQiwgTmV3QkIpOworCisgIC8vIEJyYW5jaCB0byB0aGUgbmV3IGJsb2NrLCBicmVha2luZyB0aGUgZWRnZS4KKyAgVEktPnNldFN1Y2Nlc3NvcihTdWNjTnVtLCBOZXdCQik7CisKKyAgLy8gSW5zZXJ0IHRoZSBibG9jayBpbnRvIHRoZSBmdW5jdGlvbi4uLiByaWdodCBhZnRlciB0aGUgYmxvY2sgVEkgbGl2ZXMgaW4uCisgIEZ1bmN0aW9uICZGID0gKlRJQkItPmdldFBhcmVudCgpOworICBGdW5jdGlvbjo6aXRlcmF0b3IgRkJCSSA9IFRJQkI7CisgIEYuZ2V0QmFzaWNCbG9ja0xpc3QoKS5pbnNlcnQoKytGQkJJLCBOZXdCQik7CisgIAorICAvLyBJZiB0aGVyZSBhcmUgYW55IFBISSBub2RlcyBpbiBEZXN0QkIsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZW0gc28gdGhhdCB0aGV5CisgIC8vIG1lcmdlIGluY29taW5nIHZhbHVlcyBmcm9tIE5ld0JCIGluc3RlYWQgb2YgZnJvbSBUSUJCLgorICBpZiAoUEhJTm9kZSAqQVBISSA9IGR5bl9jYXN0PFBISU5vZGU+KERlc3RCQi0+YmVnaW4oKSkpIHsKKyAgICAvLyBUaGlzIGNvbmNlcHR1YWxseSBkb2VzOgorICAgIC8vICBmb3JlYWNoIChQSElOb2RlICpQTiBpbiBEZXN0QkIpCisgICAgLy8gICAgUE4tPnNldEluY29taW5nQmxvY2soUE4tPmdldEluY29taW5nQmxvY2soVElCQiksIE5ld0JCKTsKKyAgICAvLyBidXQgaXMgb3B0aW1pemVkIGZvciB0d28gY2FzZXMuCisgICAgCisgICAgaWYgKEFQSEktPmdldE51bUluY29taW5nVmFsdWVzKCkgPD0gOCkgeyAgLy8gU21hbGwgIyBwcmVkcyBjYXNlLgorICAgICAgdW5zaWduZWQgQkJJZHggPSAwOworICAgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gRGVzdEJCLT5iZWdpbigpOyBpc2E8UEhJTm9kZT4oSSk7ICsrSSkgeworICAgICAgICAvLyBXZSBubyBsb25nZXIgZW50ZXIgdGhyb3VnaCBUSUJCLCBub3cgd2UgY29tZSBpbiB0aHJvdWdoIE5ld0JCLgorICAgICAgICAvLyBSZXZlY3RvciBleGFjdGx5IG9uZSBlbnRyeSBpbiB0aGUgUEhJIG5vZGUgdGhhdCB1c2VkIHRvIGNvbWUgZnJvbQorICAgICAgICAvLyBUSUJCIHRvIGNvbWUgZnJvbSBOZXdCQi4KKyAgICAgICAgUEhJTm9kZSAqUE4gPSBjYXN0PFBISU5vZGU+KEkpOworICAgICAgICAKKyAgICAgICAgLy8gUmV1c2UgdGhlIHByZXZpb3VzIHZhbHVlIG9mIEJCSWR4IGlmIGl0IGxpbmVzIHVwLiAgSW4gY2FzZXMgd2hlcmUgd2UKKyAgICAgICAgLy8gaGF2ZSBtdWx0aXBsZSBwaGkgbm9kZXMgd2l0aCAqbG90cyogb2YgcHJlZGVjZXNzb3JzLCB0aGlzIGlzIGEgc3BlZWQKKyAgICAgICAgLy8gd2luIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0byBzY2FuIHRoZSBQSEkgbG9va2luZyBmb3IgVElCQi4gIFRoaXMKKyAgICAgICAgLy8gaGFwcGVucyBiZWNhdXNlIHRoZSBCQiBsaXN0IG9mIFBISSBub2RlcyBhcmUgdXN1YWxseSBpbiB0aGUgc2FtZQorICAgICAgICAvLyBvcmRlci4KKyAgICAgICAgaWYgKFBOLT5nZXRJbmNvbWluZ0Jsb2NrKEJCSWR4KSAhPSBUSUJCKQorICAgICAgICAgIEJCSWR4ID0gUE4tPmdldEJhc2ljQmxvY2tJbmRleChUSUJCKTsKKyAgICAgICAgUE4tPnNldEluY29taW5nQmxvY2soQkJJZHgsIE5ld0JCKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gSG93ZXZlciwgdGhlIGZvcmVhY2ggbG9vcCBpcyBzbG93IGZvciBibG9ja3Mgd2l0aCBsb3RzIG9mIHByZWRlY2Vzc29ycworICAgICAgLy8gYmVjYXVzZSBQSElOb2RlOjpnZXRJbmNvbWluZ0Jsb2NrIGlzIE8obikgaW4gIyBwcmVkcy4gIEluc3RlYWQsIHdhbGsKKyAgICAgIC8vIHRoZSB1c2VyIGxpc3Qgb2YgVElCQiB0byBmaW5kIHRoZSBQSEkgbm9kZXMuCisgICAgICBTbWFsbFB0clNldDxQSElOb2RlKiwgMTY+IFVwZGF0ZWRQSElzOworICAgIAorICAgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gVElCQi0+dXNlX2JlZ2luKCksIEUgPSBUSUJCLT51c2VfZW5kKCk7CisgICAgICAgICAgIFVJICE9IEU7ICkgeworICAgICAgICBWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVzZSA9IFVJKys7CisgICAgICAgIGlmIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KCpVc2UpKSB7CisgICAgICAgICAgLy8gUmVtb3ZlIG9uZSBlbnRyeSBmcm9tIGVhY2ggUEhJLgorICAgICAgICAgIGlmIChQTi0+Z2V0UGFyZW50KCkgPT0gRGVzdEJCICYmIFVwZGF0ZWRQSElzLmluc2VydChQTikpCisgICAgICAgICAgICBQTi0+c2V0T3BlcmFuZChVc2UuZ2V0T3BlcmFuZE5vKCksIE5ld0JCKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAgCisgIC8vIElmIHRoZXJlIGFyZSBhbnkgb3RoZXIgZWRnZXMgZnJvbSBUSUJCIHRvIERlc3RCQiwgdXBkYXRlIHRob3NlIHRvIGdvCisgIC8vIHRocm91Z2ggdGhlIHNwbGl0IGJsb2NrLCBtYWtpbmcgdGhvc2UgZWRnZXMgbm9uLWNyaXRpY2FsIGFzIHdlbGwgKGFuZAorICAvLyByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHBoaSBlbnRyaWVzIGluIHRoZSBEZXN0QkIgaWYgcmVsZXZhbnQpLgorICBpZiAoTWVyZ2VJZGVudGljYWxFZGdlcykgeworICAgIGZvciAodW5zaWduZWQgaSA9IFN1Y2NOdW0rMSwgZSA9IFRJLT5nZXROdW1TdWNjZXNzb3JzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoVEktPmdldFN1Y2Nlc3NvcihpKSAhPSBEZXN0QkIpIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyBSZW1vdmUgYW4gZW50cnkgZm9yIFRJQkIgZnJvbSBEZXN0QkIgcGhpIG5vZGVzLgorICAgICAgRGVzdEJCLT5yZW1vdmVQcmVkZWNlc3NvcihUSUJCKTsKKyAgICAgIAorICAgICAgLy8gV2UgZm91bmQgYW5vdGhlciBlZGdlIHRvIERlc3RCQiwgZ28gdG8gTmV3QkIgaW5zdGVhZC4KKyAgICAgIFRJLT5zZXRTdWNjZXNzb3IoaSwgTmV3QkIpOworICAgIH0KKyAgfQorICAKKyAgCisKKyAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHBhc3Mgb2JqZWN0LCB3ZSBjYW4ndCB1cGRhdGUgYW55dGhpbmcuLi4KKyAgaWYgKFAgPT0gMCkgcmV0dXJuIE5ld0JCOworICAKKyAgRG9taW5hdG9yVHJlZSAqRFQgPSBQLT5nZXRBbmFseXNpc0lmQXZhaWxhYmxlPERvbWluYXRvclRyZWU+KCk7CisgIERvbWluYW5jZUZyb250aWVyICpERiA9IFAtPmdldEFuYWx5c2lzSWZBdmFpbGFibGU8RG9taW5hbmNlRnJvbnRpZXI+KCk7CisgIExvb3BJbmZvICpMSSA9IFAtPmdldEFuYWx5c2lzSWZBdmFpbGFibGU8TG9vcEluZm8+KCk7CisgIFByb2ZpbGVJbmZvICpQSSA9IFAtPmdldEFuYWx5c2lzSWZBdmFpbGFibGU8UHJvZmlsZUluZm8+KCk7CisgIAorICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgdG8gdXBkYXRlLCBqdXN0IHJldHVybi4KKyAgaWYgKERUID09IDAgJiYgREYgPT0gMCAmJiBMSSA9PSAwICYmIFBJID09IDApCisgICAgcmV0dXJuIE5ld0JCOworCisgIC8vIE5vdyB1cGRhdGUgYW5hbHlzaXMgaW5mb3JtYXRpb24uICBTaW5jZSB0aGUgb25seSBwcmVkZWNlc3NvciBvZiBOZXdCQiBpcworICAvLyB0aGUgVElCQiwgVElCQiBjbGVhcmx5IGRvbWluYXRlcyBOZXdCQi4gIFRJQkIgdXN1YWxseSBkb2Vzbid0IGRvbWluYXRlCisgIC8vIGFueXRoaW5nLCBhcyB0aGVyZSBhcmUgb3RoZXIgc3VjY2Vzc29ycyBvZiBEZXN0QkIuICBIb3dldmVyLCBpZiBhbGwgb3RoZXIKKyAgLy8gcHJlZGVjZXNzb3JzIG9mIERlc3RCQiBhcmUgYWxyZWFkeSBkb21pbmF0ZWQgYnkgRGVzdEJCIChlLmcuIERlc3RCQiBpcyBhCisgIC8vIGxvb3AgaGVhZGVyKSB0aGVuIE5ld0JCIGRvbWluYXRlcyBEZXN0QkIuCisgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCA4PiBPdGhlclByZWRzOworCisgIC8vIElmIHRoZXJlIGlzIGEgUEhJIGluIHRoZSBibG9jaywgbG9vcCBvdmVyIHByZWRlY2Vzc29ycyB3aXRoIGl0LCB3aGljaCBpcworICAvLyBmYXN0ZXIgdGhhbiBpdGVyYXRpbmcgcHJlZF9iZWdpbi9lbmQuCisgIGlmIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KERlc3RCQi0+YmVnaW4oKSkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpICE9IE5ld0JCKQorICAgICAgICBPdGhlclByZWRzLnB1c2hfYmFjayhQTi0+Z2V0SW5jb21pbmdCbG9jayhpKSk7CisgIH0gZWxzZSB7CisgICAgZm9yIChwcmVkX2l0ZXJhdG9yIEkgPSBwcmVkX2JlZ2luKERlc3RCQiksIEUgPSBwcmVkX2VuZChEZXN0QkIpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIEJhc2ljQmxvY2sgKlAgPSAqSTsKKyAgICAgIGlmIChQICE9IE5ld0JCKQorICAgICAgICAgIE90aGVyUHJlZHMucHVzaF9iYWNrKFApOworICAgIH0KKyAgfQorCisgIGJvb2wgTmV3QkJEb21pbmF0ZXNEZXN0QkIgPSB0cnVlOworICAKKyAgLy8gU2hvdWxkIHdlIHVwZGF0ZSBEb21pbmF0b3JUcmVlIGluZm9ybWF0aW9uPworICBpZiAoRFQpIHsKKyAgICBEb21UcmVlTm9kZSAqVElOb2RlID0gRFQtPmdldE5vZGUoVElCQik7CisKKyAgICAvLyBUaGUgbmV3IGJsb2NrIGlzIG5vdCB0aGUgaW1tZWRpYXRlIGRvbWluYXRvciBmb3IgYW55IG90aGVyIG5vZGVzLCBidXQKKyAgICAvLyBUSU5vZGUgaXMgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3IgZm9yIHRoZSBuZXcgbm9kZS4KKyAgICAvLworICAgIGlmIChUSU5vZGUpIHsgICAgICAgLy8gRG9uJ3QgYnJlYWsgdW5yZWFjaGFibGUgY29kZSEKKyAgICAgIERvbVRyZWVOb2RlICpOZXdCQk5vZGUgPSBEVC0+YWRkTmV3QmxvY2soTmV3QkIsIFRJQkIpOworICAgICAgRG9tVHJlZU5vZGUgKkRlc3RCQk5vZGUgPSAwOworICAgICAKKyAgICAgIC8vIElmIE5ld0JCRG9taW5hdGVzRGVzdEJCIGhhc24ndCBiZWVuIGNvbXB1dGVkIHlldCwgZG8gc28gd2l0aCBEVC4KKyAgICAgIGlmICghT3RoZXJQcmVkcy5lbXB0eSgpKSB7CisgICAgICAgIERlc3RCQk5vZGUgPSBEVC0+Z2V0Tm9kZShEZXN0QkIpOworICAgICAgICB3aGlsZSAoIU90aGVyUHJlZHMuZW1wdHkoKSAmJiBOZXdCQkRvbWluYXRlc0Rlc3RCQikgeworICAgICAgICAgIGlmIChEb21UcmVlTm9kZSAqT1BOb2RlID0gRFQtPmdldE5vZGUoT3RoZXJQcmVkcy5iYWNrKCkpKQorICAgICAgICAgICAgTmV3QkJEb21pbmF0ZXNEZXN0QkIgPSBEVC0+ZG9taW5hdGVzKERlc3RCQk5vZGUsIE9QTm9kZSk7CisgICAgICAgICAgT3RoZXJQcmVkcy5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIE90aGVyUHJlZHMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gSWYgTmV3QkJEb21pbmF0ZXNEZXN0QkIsIHRoZW4gTmV3QkIgZG9taW5hdGVzIERlc3RCQiwgb3RoZXJ3aXNlIGl0CisgICAgICAvLyBkb2Vzbid0IGRvbWluYXRlIGFueXRoaW5nLgorICAgICAgaWYgKE5ld0JCRG9taW5hdGVzRGVzdEJCKSB7CisgICAgICAgIGlmICghRGVzdEJCTm9kZSkgRGVzdEJCTm9kZSA9IERULT5nZXROb2RlKERlc3RCQik7CisgICAgICAgIERULT5jaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoRGVzdEJCTm9kZSwgTmV3QkJOb2RlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBTaG91bGQgd2UgdXBkYXRlIERvbWluYW5jZUZyb250aWVyIGluZm9ybWF0aW9uPworICBpZiAoREYpIHsKKyAgICAvLyBJZiBOZXdCQkRvbWluYXRlc0Rlc3RCQiBoYXNuJ3QgYmVlbiBjb21wdXRlZCB5ZXQsIGRvIHNvIHdpdGggREYuCisgICAgaWYgKCFPdGhlclByZWRzLmVtcHR5KCkpIHsKKyAgICAgIC8vIEZJWE1FOiBJTVBMRU1FTlQgVEhJUyEKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlJlcXVpcmluZyBkb21mcm9udGllcnMgYnV0IG5vdCBpZG9tL2RvbXRyZWUvZG9tc2V0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOworICAgIH0KKyAgICAKKyAgICAvLyBTaW5jZSB0aGUgbmV3IGJsb2NrIGlzIGRvbWluYXRlZCBieSBpdHMgb25seSBwcmVkZWNlc3NvciBUSUJCLAorICAgIC8vIGl0IGNhbm5vdCBiZSBpbiBhbnkgYmxvY2sncyBkb21pbmFuY2UgZnJvbnRpZXIuICBJZiBOZXdCQiBkb21pbmF0ZXMKKyAgICAvLyBEZXN0QkIsIGl0cyBkb21pbmFuY2UgZnJvbnRpZXIgaXMgdGhlIHNhbWUgYXMgRGVzdEJCJ3MsIG90aGVyd2lzZSBpdCBpcworICAgIC8vIGp1c3Qge0Rlc3RCQn0uCisgICAgRG9taW5hbmNlRnJvbnRpZXI6OkRvbVNldFR5cGUgTmV3REZTZXQ7CisgICAgaWYgKE5ld0JCRG9taW5hdGVzRGVzdEJCKSB7CisgICAgICBEb21pbmFuY2VGcm9udGllcjo6aXRlcmF0b3IgSSA9IERGLT5maW5kKERlc3RCQik7CisgICAgICBpZiAoSSAhPSBERi0+ZW5kKCkpIHsKKyAgICAgICAgREYtPmFkZEJhc2ljQmxvY2soTmV3QkIsIEktPnNlY29uZCk7CisgICAgICAgIAorICAgICAgICBpZiAoSS0+c2Vjb25kLmNvdW50KERlc3RCQikpIHsKKyAgICAgICAgICAvLyBIb3dldmVyIE5ld0JCJ3MgZnJvbnRpZXIgZG9lcyBub3QgaW5jbHVkZSBEZXN0QkIuCisgICAgICAgICAgRG9taW5hbmNlRnJvbnRpZXI6Oml0ZXJhdG9yIE5GID0gREYtPmZpbmQoTmV3QkIpOworICAgICAgICAgIERGLT5yZW1vdmVGcm9tRnJvbnRpZXIoTkYsIERlc3RCQik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgREYtPmFkZEJhc2ljQmxvY2soTmV3QkIsIERvbWluYW5jZUZyb250aWVyOjpEb21TZXRUeXBlKCkpOworICAgIH0gZWxzZSB7CisgICAgICBEb21pbmFuY2VGcm9udGllcjo6RG9tU2V0VHlwZSBOZXdERlNldDsKKyAgICAgIE5ld0RGU2V0Lmluc2VydChEZXN0QkIpOworICAgICAgREYtPmFkZEJhc2ljQmxvY2soTmV3QkIsIE5ld0RGU2V0KTsKKyAgICB9CisgIH0KKyAgCisgIC8vIFVwZGF0ZSBMb29wSW5mbyBpZiBpdCBpcyBhcm91bmQuCisgIGlmIChMSSkgeworICAgIGlmIChMb29wICpUSUwgPSBMSS0+Z2V0TG9vcEZvcihUSUJCKSkgeworICAgICAgLy8gSWYgb25lIG9yIHRoZSBvdGhlciBibG9ja3Mgd2VyZSBub3QgaW4gYSBsb29wLCB0aGUgbmV3IGJsb2NrIGlzIG5vdAorICAgICAgLy8gZWl0aGVyLCBhbmQgdGh1cyBMSSBkb2Vzbid0IG5lZWQgdG8gYmUgdXBkYXRlZC4KKyAgICAgIGlmIChMb29wICpEZXN0TG9vcCA9IExJLT5nZXRMb29wRm9yKERlc3RCQikpIHsKKyAgICAgICAgaWYgKFRJTCA9PSBEZXN0TG9vcCkgeworICAgICAgICAgIC8vIEJvdGggaW4gdGhlIHNhbWUgbG9vcCwgdGhlIE5ld0JCIGpvaW5zIGxvb3AuCisgICAgICAgICAgRGVzdExvb3AtPmFkZEJhc2ljQmxvY2tUb0xvb3AoTmV3QkIsIExJLT5nZXRCYXNlKCkpOworICAgICAgICB9IGVsc2UgaWYgKFRJTC0+Y29udGFpbnMoRGVzdExvb3ApKSB7CisgICAgICAgICAgLy8gRWRnZSBmcm9tIGFuIG91dGVyIGxvb3AgdG8gYW4gaW5uZXIgbG9vcC4gIEFkZCB0byB0aGUgb3V0ZXIgbG9vcC4KKyAgICAgICAgICBUSUwtPmFkZEJhc2ljQmxvY2tUb0xvb3AoTmV3QkIsIExJLT5nZXRCYXNlKCkpOworICAgICAgICB9IGVsc2UgaWYgKERlc3RMb29wLT5jb250YWlucyhUSUwpKSB7CisgICAgICAgICAgLy8gRWRnZSBmcm9tIGFuIGlubmVyIGxvb3AgdG8gYW4gb3V0ZXIgbG9vcC4gIEFkZCB0byB0aGUgb3V0ZXIgbG9vcC4KKyAgICAgICAgICBEZXN0TG9vcC0+YWRkQmFzaWNCbG9ja1RvTG9vcChOZXdCQiwgTEktPmdldEJhc2UoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRWRnZSBmcm9tIHR3byBsb29wcyB3aXRoIG5vIGNvbnRhaW5tZW50IHJlbGF0aW9uLiAgQmVjYXVzZSB0aGVzZQorICAgICAgICAgIC8vIGFyZSBuYXR1cmFsIGxvb3BzLCB3ZSBrbm93IHRoYXQgdGhlIGRlc3RpbmF0aW9uIGJsb2NrIG11c3QgYmUgdGhlCisgICAgICAgICAgLy8gaGVhZGVyIG9mIGl0cyBsb29wIChhZGRpbmcgYSBicmFuY2ggaW50byBhIGxvb3AgZWxzZXdoZXJlIHdvdWxkCisgICAgICAgICAgLy8gY3JlYXRlIGFuIGlycmVkdWNpYmxlIGxvb3ApLgorICAgICAgICAgIGFzc2VydChEZXN0TG9vcC0+Z2V0SGVhZGVyKCkgPT0gRGVzdEJCICYmCisgICAgICAgICAgICAgICAgICJTaG91bGQgbm90IGNyZWF0ZSBpcnJlZHVjaWJsZSBsb29wcyEiKTsKKyAgICAgICAgICBpZiAoTG9vcCAqUCA9IERlc3RMb29wLT5nZXRQYXJlbnRMb29wKCkpCisgICAgICAgICAgICBQLT5hZGRCYXNpY0Jsb2NrVG9Mb29wKE5ld0JCLCBMSS0+Z2V0QmFzZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gSWYgVElCQiBpcyBpbiBhIGxvb3AgYW5kIERlc3RCQiBpcyBvdXRzaWRlIG9mIHRoYXQgbG9vcCwgc3BsaXQgdGhlCisgICAgICAvLyBvdGhlciBleGl0IGJsb2NrcyBvZiB0aGUgbG9vcCB0aGF0IGFsc28gaGF2ZSBwcmVkZWNlc3NvcnMgb3V0c2lkZQorICAgICAgLy8gdGhlIGxvb3AsIHRvIG1haW50YWluIGEgTG9vcFNpbXBsaWZ5IGd1YXJhbnRlZS4KKyAgICAgIGlmICghVElMLT5jb250YWlucyhEZXN0QkIpICYmCisgICAgICAgICAgUC0+bXVzdFByZXNlcnZlQW5hbHlzaXNJRChMb29wU2ltcGxpZnlJRCkpIHsKKyAgICAgICAgYXNzZXJ0KCFUSUwtPmNvbnRhaW5zKE5ld0JCKSAmJgorICAgICAgICAgICAgICAgIlNwbGl0IHBvaW50IGZvciBsb29wIGV4aXQgaXMgY29udGFpbmVkIGluIGxvb3AhIik7CisKKyAgICAgICAgLy8gVXBkYXRlIExDU1NBIGZvcm0gaW4gdGhlIG5ld2x5IGNyZWF0ZWQgZXhpdCBibG9jay4KKyAgICAgICAgaWYgKFAtPm11c3RQcmVzZXJ2ZUFuYWx5c2lzSUQoTENTU0FJRCkpIHsKKyAgICAgICAgICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrICosIDE+IE9yaWdQcmVkOworICAgICAgICAgIE9yaWdQcmVkLnB1c2hfYmFjayhUSUJCKTsKKyAgICAgICAgICBDcmVhdGVQSElzRm9yU3BsaXRMb29wRXhpdChPcmlnUHJlZCwgTmV3QkIsIERlc3RCQik7CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3IgZWFjaCB1bmlxdWUgZXhpdCBibG9jay4uLgorICAgICAgICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrICosIDQ+IEV4aXRCbG9ja3M7CisgICAgICAgIFRJTC0+Z2V0RXhpdEJsb2NrcyhFeGl0QmxvY2tzKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEV4aXRCbG9ja3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIC8vIENvbGxlY3QgYWxsIHRoZSBwcmVkcyB0aGF0IGFyZSBpbnNpZGUgdGhlIGxvb3AsIGFuZCBub3RlCisgICAgICAgICAgLy8gd2hldGhlciB0aGVyZSBhcmUgYW55IHByZWRzIG91dHNpZGUgdGhlIGxvb3AuCisgICAgICAgICAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayAqLCA0PiBQcmVkczsKKyAgICAgICAgICBib29sIEhhc1ByZWRPdXRzaWRlT2ZMb29wID0gZmFsc2U7CisgICAgICAgICAgQmFzaWNCbG9jayAqRXhpdCA9IEV4aXRCbG9ja3NbaV07CisgICAgICAgICAgZm9yIChwcmVkX2l0ZXJhdG9yIEkgPSBwcmVkX2JlZ2luKEV4aXQpLCBFID0gcHJlZF9lbmQoRXhpdCk7CisgICAgICAgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgICAgICAgQmFzaWNCbG9jayAqUCA9ICpJOworICAgICAgICAgICAgaWYgKFRJTC0+Y29udGFpbnMoUCkpCisgICAgICAgICAgICAgIFByZWRzLnB1c2hfYmFjayhQKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgSGFzUHJlZE91dHNpZGVPZkxvb3AgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IHByZWRzIG5vdCBpbiB0aGUgbG9vcCwgd2UnbGwgbmVlZCB0byBzcGxpdAorICAgICAgICAgIC8vIHRoZSBlZGdlcy4gVGhlIFByZWRzLmVtcHR5KCkgY2hlY2sgaXMgbmVlZGVkIGJlY2F1c2UgYSBibG9jaworICAgICAgICAgIC8vIG1heSBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIGxpc3QuIFdlIGNhbid0IHVzZQorICAgICAgICAgIC8vIGdldFVuaXF1ZUV4aXRCbG9ja3MgYWJvdmUgYmVjYXVzZSB0aGF0IGRlcGVuZHMgb24gTG9vcFNpbXBsaWZ5CisgICAgICAgICAgLy8gZm9ybSwgd2hpY2ggd2UncmUgaW4gdGhlIHByb2Nlc3Mgb2YgcmVzdG9yaW5nIQorICAgICAgICAgIGlmICghUHJlZHMuZW1wdHkoKSAmJiBIYXNQcmVkT3V0c2lkZU9mTG9vcCkgeworICAgICAgICAgICAgQmFzaWNCbG9jayAqTmV3RXhpdEJCID0KKyAgICAgICAgICAgICAgU3BsaXRCbG9ja1ByZWRlY2Vzc29ycyhFeGl0LCBQcmVkcy5kYXRhKCksIFByZWRzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQKTsKKyAgICAgICAgICAgIGlmIChQLT5tdXN0UHJlc2VydmVBbmFseXNpc0lEKExDU1NBSUQpKQorICAgICAgICAgICAgICBDcmVhdGVQSElzRm9yU3BsaXRMb29wRXhpdChQcmVkcywgTmV3RXhpdEJCLCBFeGl0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIExDU1NBIGZvcm0gd2FzIHVwZGF0ZWQgYWJvdmUgZm9yIHRoZSBjYXNlIHdoZXJlIExvb3BTaW1wbGlmeSBpcworICAgICAgLy8gYXZhaWxhYmxlLCB3aGljaCBtZWFucyB0aGF0IGFsbCBwcmVkZWNlc3NvcnMgb2YgbG9vcCBleGl0IGJsb2NrcworICAgICAgLy8gYXJlIHdpdGhpbiB0aGUgbG9vcC4gV2l0aG91dCBMb29wU2ltcGxpZnkgZm9ybSwgaXQgd291bGQgYmUKKyAgICAgIC8vIG5lY2Vzc2FyeSB0byBpbnNlcnQgYSBuZXcgcGhpLgorICAgICAgYXNzZXJ0KCghUC0+bXVzdFByZXNlcnZlQW5hbHlzaXNJRChMQ1NTQUlEKSB8fAorICAgICAgICAgICAgICBQLT5tdXN0UHJlc2VydmVBbmFseXNpc0lEKExvb3BTaW1wbGlmeUlEKSkgJiYKKyAgICAgICAgICAgICAiU3BsaXRDcml0aWNhbEVkZ2UgZG9lc24ndCBrbm93IGhvdyB0byB1cGRhdGUgTENDU0EgZm9ybSAiCisgICAgICAgICAgICAgIndpdGhvdXQgTG9vcFNpbXBsaWZ5ISIpOworICAgIH0KKyAgfQorCisgIC8vIFVwZGF0ZSBQcm9maWxlSW5mbyBpZiBpdCBpcyBhcm91bmQuCisgIGlmIChQSSkKKyAgICBQSS0+c3BsaXRFZGdlKFRJQkIsIERlc3RCQiwgTmV3QkIsIE1lcmdlSWRlbnRpY2FsRWRnZXMpOworCisgIHJldHVybiBOZXdCQjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjMjI3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjkgQEAKK2FkZF9sbHZtX2xpYnJhcnkoTExWTVRyYW5zZm9ybVV0aWxzCisgIEFkZHJNb2RlTWF0Y2hlci5jcHAKKyAgQmFzaWNCbG9ja1V0aWxzLmNwcAorICBCYXNpY0lubGluZXIuY3BwCisgIEJyZWFrQ3JpdGljYWxFZGdlcy5jcHAKKyAgQnVpbGRMaWJDYWxscy5jcHAKKyAgQ2xvbmVGdW5jdGlvbi5jcHAKKyAgQ2xvbmVMb29wLmNwcAorICBDbG9uZU1vZHVsZS5jcHAKKyAgQ29kZUV4dHJhY3Rvci5jcHAKKyAgRGVtb3RlUmVnVG9TdGFjay5jcHAKKyAgSW5saW5lRnVuY3Rpb24uY3BwCisgIEluc3RydWN0aW9uTmFtZXIuY3BwCisgIExDU1NBLmNwcAorICBMb2NhbC5jcHAKKyAgTG9vcFNpbXBsaWZ5LmNwcAorICBMb29wVW5yb2xsLmNwcAorICBMb3dlckludm9rZS5jcHAKKyAgTG93ZXJTd2l0Y2guY3BwCisgIE1lbTJSZWcuY3BwCisgIFByb21vdGVNZW1vcnlUb1JlZ2lzdGVyLmNwcAorICBTU0FVcGRhdGVyLmNwcAorICBTU0kuY3BwCisgIFNpbXBsaWZ5Q0ZHLmNwcAorICBVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmNwcAorICBWYWx1ZU1hcHBlci5jcHAKKyAgKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMgKExMVk1UcmFuc2Zvcm1VdGlscyBMTFZNU3VwcG9ydCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0RlbW90ZVJlZ1RvU3RhY2suY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvRGVtb3RlUmVnVG9TdGFjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhMjc3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0RlbW90ZVJlZ1RvU3RhY2suY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvLz09PS0gRGVtb3RlUmVnVG9TdGFjay5jcHAgLSBNb3ZlIGEgdmlydHVhbCByZWdpc3RlciB0byB0aGUgc3RhY2sgLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlIHRoZSBmdW5jdGlvbiBEZW1vdGVSZWdUb1N0YWNrKCkuICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEKKy8vIHZpcnR1YWwgcmVnaXN0ZXIgY29tcHV0ZWQgYnkgYW4gSW5zdHJ1Y3Rpb24gYW5kIHJlcGxhY2VzIGl0IHdpdGggYSBzbG90IGluCisvLyB0aGUgc3RhY2sgZnJhbWUsIGFsbG9jYXRlZCB2aWEgYWxsb2NhLiBJdCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZQorLy8gQWxsb2NhSW5zdCBpbnNlcnRlZC4gIEFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGFuIGluc3RydWN0aW9uLCB3ZSBhcmUKKy8vIGd1YXJhbnRlZWQgdGhhdCB0aGUgb25seSB1c2VyIG9mIHRoZSBpbnN0cnVjdGlvbiBpcyBhIHN0b3JlIHRoYXQgaXMKKy8vIGltbWVkaWF0ZWx5IGFmdGVyIGl0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9jYWwuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKyNpbmNsdWRlIDxtYXA+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIERlbW90ZVJlZ1RvU3RhY2sgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgdmlydHVhbCByZWdpc3RlciBjb21wdXRlZCBieSBhbgorLy8vIEluc3RydWN0aW9uIGFuZCByZXBsYWNlcyBpdCB3aXRoIGEgc2xvdCBpbiB0aGUgc3RhY2sgZnJhbWUsIGFsbG9jYXRlZCB2aWEKKy8vLyBhbGxvY2EuICBUaGlzIGFsbG93cyB0aGUgQ0ZHIHRvIGJlIGNoYW5nZWQgYXJvdW5kIHdpdGhvdXQgZmVhciBvZgorLy8vIGludmFsaWRhdGluZyB0aGUgU1NBIGluZm9ybWF0aW9uIGZvciB0aGUgdmFsdWUuICBJdCByZXR1cm5zIHRoZSBwb2ludGVyIHRvCisvLy8gdGhlIGFsbG9jYSBpbnNlcnRlZCB0byBjcmVhdGUgYSBzdGFjayBzbG90IGZvciBJLgorLy8vCitBbGxvY2FJbnN0KiBsbHZtOjpEZW1vdGVSZWdUb1N0YWNrKEluc3RydWN0aW9uICZJLCBib29sIFZvbGF0aWxlTG9hZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpBbGxvY2FQb2ludCkgeworICBpZiAoSS51c2VfZW1wdHkoKSkgeworICAgIEkuZXJhc2VGcm9tUGFyZW50KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBDcmVhdGUgYSBzdGFjayBzbG90IHRvIGhvbGQgdGhlIHZhbHVlLgorICBBbGxvY2FJbnN0ICpTbG90OworICBpZiAoQWxsb2NhUG9pbnQpIHsKKyAgICBTbG90ID0gbmV3IEFsbG9jYUluc3QoSS5nZXRUeXBlKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYVBvaW50KTsKKyAgfSBlbHNlIHsKKyAgICBGdW5jdGlvbiAqRiA9IEkuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICAgIFNsb3QgPSBuZXcgQWxsb2NhSW5zdChJLmdldFR5cGUoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRi0+Z2V0RW50cnlCbG9jaygpLmJlZ2luKCkpOworICB9CisKKyAgLy8gQ2hhbmdlIGFsbCBvZiB0aGUgdXNlcnMgb2YgdGhlIGluc3RydWN0aW9uIHRvIHJlYWQgZnJvbSB0aGUgc3RhY2sgc2xvdAorICAvLyBpbnN0ZWFkLgorICB3aGlsZSAoIUkudXNlX2VtcHR5KCkpIHsKKyAgICBJbnN0cnVjdGlvbiAqVSA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KEkudXNlX2JhY2soKSk7CisgICAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVSkpIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBQSEkgbm9kZSwgd2UgY2FuJ3QgaW5zZXJ0IGEgbG9hZCBvZiB0aGUgdmFsdWUgYmVmb3JlIHRoZQorICAgICAgLy8gdXNlLiAgSW5zdGVhZCwgaW5zZXJ0IHRoZSBsb2FkIGluIHRoZSBwcmVkZWNlc3NvciBibG9jayBjb3JyZXNwb25kaW5nCisgICAgICAvLyB0byB0aGUgaW5jb21pbmcgdmFsdWUuCisgICAgICAvLworICAgICAgLy8gTm90ZSB0aGF0IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBlZGdlcyBmcm9tIGEgYmFzaWMgYmxvY2sgdG8gdGhpcyBQSEkKKyAgICAgIC8vIG5vZGUgdGhhdCB3ZSBjYW5ub3QgbXVsdGlwbGUgbG9hZHMuICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSByZXN1bHRhbnQKKyAgICAgIC8vIFBISSBub2RlIHdpbGwgaGF2ZSBtdWx0aXBsZSB2YWx1ZXMgKGZyb20gZWFjaCBsb2FkKSBjb21pbmcgaW4gZnJvbSB0aGUKKyAgICAgIC8vIHNhbWUgYmxvY2ssIHdoaWNoIGlzIGlsbGVnYWwgU1NBIGZvcm0uICBGb3IgdGhpcyByZWFzb24sIHdlIGtlZXAgdHJhY2sKKyAgICAgIC8vIGFuZCByZXVzZSBsb2FkcyB3ZSBpbnNlcnQuCisgICAgICBzdGQ6Om1hcDxCYXNpY0Jsb2NrKiwgVmFsdWUqPiBMb2FkczsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChQTi0+Z2V0SW5jb21pbmdWYWx1ZShpKSA9PSAmSSkgeworICAgICAgICAgIFZhbHVlIComViA9IExvYWRzW1BOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpXTsKKyAgICAgICAgICBpZiAoViA9PSAwKSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIGxvYWQgaW50byB0aGUgcHJlZGVjZXNzb3IgYmxvY2sKKyAgICAgICAgICAgIFYgPSBuZXcgTG9hZEluc3QoU2xvdCwgVm9sYXRpbGVMb2FkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE4tPmdldEluY29taW5nQmxvY2soaSktPmdldFRlcm1pbmF0b3IoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIFBOLT5zZXRJbmNvbWluZ1ZhbHVlKGksIFYpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgdGhpcyBpcyBhIG5vcm1hbCBpbnN0cnVjdGlvbiwganVzdCBpbnNlcnQgYSBsb2FkLgorICAgICAgVmFsdWUgKlYgPSBuZXcgTG9hZEluc3QoU2xvdCwgVm9sYXRpbGVMb2FkcywgVSk7CisgICAgICBVLT5yZXBsYWNlVXNlc09mV2l0aCgmSSwgVik7CisgICAgfQorICB9CisKKworICAvLyBJbnNlcnQgc3RvcmVzIG9mIHRoZSBjb21wdXRlZCB2YWx1ZSBpbnRvIHRoZSBzdGFjayBzbG90LgorICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdCA9ICZJOworICArK0luc2VydFB0OworCisgIGZvciAoOyBpc2E8UEhJTm9kZT4oSW5zZXJ0UHQpOyArK0luc2VydFB0KQorICAvKiBlbXB0eSAqLzsgICAvLyBEb24ndCBpbnNlcnQgYmVmb3JlIGFueSBQSEkgbm9kZXMuCisgIG5ldyBTdG9yZUluc3QoJkksIFNsb3QsIEluc2VydFB0KTsKKworICByZXR1cm4gU2xvdDsKK30KKworCisvLy8gRGVtb3RlUEhJVG9TdGFjayAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSB2aXJ0dWFsIHJlZ2lzdGVyIGNvbXB1dGVkIGJ5IGEgcGhpCisvLy8gbm9kZSBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhIHNsb3QgaW4gdGhlIHN0YWNrIGZyYW1lLCBhbGxvY2F0ZWQgdmlhIGFsbG9jYS4KKy8vLyBUaGUgcGhpIG5vZGUgaXMgZGVsZXRlZCBhbmQgaXQgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgYWxsb2NhIGluc2VydGVkLgorQWxsb2NhSW5zdCogbGx2bTo6RGVtb3RlUEhJVG9TdGFjayhQSElOb2RlICpQLCBJbnN0cnVjdGlvbiAqQWxsb2NhUG9pbnQpIHsKKyAgaWYgKFAtPnVzZV9lbXB0eSgpKSB7CisgICAgUC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBDcmVhdGUgYSBzdGFjayBzbG90IHRvIGhvbGQgdGhlIHZhbHVlLgorICBBbGxvY2FJbnN0ICpTbG90OworICBpZiAoQWxsb2NhUG9pbnQpIHsKKyAgICBTbG90ID0gbmV3IEFsbG9jYUluc3QoUC0+Z2V0VHlwZSgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYVBvaW50KTsKKyAgfSBlbHNlIHsKKyAgICBGdW5jdGlvbiAqRiA9IFAtPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICBTbG90ID0gbmV3IEFsbG9jYUluc3QoUC0+Z2V0VHlwZSgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGLT5nZXRFbnRyeUJsb2NrKCkuYmVnaW4oKSk7CisgIH0KKworICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBvcGVyYW5kLCBpbnNlcnQgc3RvcmUgaW4gZWFjaCBwcmVkZWNlc3Nvci4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFAtPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgPCBlOyArK2kpIHsKKyAgICBuZXcgU3RvcmVJbnN0KFAtPmdldEluY29taW5nVmFsdWUoaSksIFNsb3QsCisgICAgICAgICAgICAgICAgICBQLT5nZXRJbmNvbWluZ0Jsb2NrKGkpLT5nZXRUZXJtaW5hdG9yKCkpOworICB9CisKKyAgLy8gSW5zZXJ0IGxvYWQgaW4gcGxhY2Ugb2YgdGhlIHBoaSBhbmQgcmVwbGFjZSBhbGwgdXNlcy4KKyAgVmFsdWUgKlYgPSBuZXcgTG9hZEluc3QoU2xvdCwgUCk7CisgIFAtPnJlcGxhY2VBbGxVc2VzV2l0aChWKTsKKworICAvLyBEZWxldGUgcGhpLgorICBQLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICByZXR1cm4gU2xvdDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0xDU1NBLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0xDU1NBLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODdmZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvTENTU0EuY3BwCkBAIC0wLDAgKzEsMjY0IEBACisvLz09PS0tIExDU1NBLmNwcCAtIENvbnZlcnQgbG9vcHMgaW50byBsb29wLWNsb3NlZCBTU0EgZm9ybSAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyB0cmFuc2Zvcm1zIGxvb3BzIGJ5IHBsYWNpbmcgcGhpIG5vZGVzIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3BzIGZvcgorLy8gYWxsIHZhbHVlcyB0aGF0IGFyZSBsaXZlIGFjcm9zcyB0aGUgbG9vcCBib3VuZGFyeS4gIEZvciBleGFtcGxlLCBpdCB0dXJucworLy8gdGhlIGxlZnQgaW50byB0aGUgcmlnaHQgY29kZToKKy8vIAorLy8gZm9yICguLi4pICAgICAgICAgICAgICAgIGZvciAoLi4uKQorLy8gICBpZiAoYykgICAgICAgICAgICAgICAgICAgaWYgKGMpCisvLyAgICAgWDEgPSAuLi4gICAgICAgICAgICAgICAgIFgxID0gLi4uCisvLyAgIGVsc2UgICAgICAgICAgICAgICAgICAgICBlbHNlCisvLyAgICAgWDIgPSAuLi4gICAgICAgICAgICAgICAgIFgyID0gLi4uCisvLyAgIFgzID0gcGhpKFgxLCBYMikgICAgICAgICBYMyA9IHBoaShYMSwgWDIpCisvLyAuLi4gPSBYMyArIDQgICAgICAgICAgICAgWDQgPSBwaGkoWDMpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uID0gWDQgKyA0CisvLworLy8gVGhpcyBpcyBzdGlsbCB2YWxpZCBMTFZNOyB0aGUgZXh0cmEgcGhpIG5vZGVzIGFyZSBwdXJlbHkgcmVkdW5kYW50LCBhbmQgd2lsbAorLy8gYmUgdHJpdmlhbGx5IGVsaW1pbmF0ZWQgYnkgSW5zdENvbWJpbmUuICBUaGUgbWFqb3IgYmVuZWZpdCBvZiB0aGlzIAorLy8gdHJhbnNmb3JtYXRpb24gaXMgdGhhdCBpdCBtYWtlcyBtYW55IG90aGVyIGxvb3Agb3B0aW1pemF0aW9ucywgc3VjaCBhcyAKKy8vIExvb3BVbnN3aXRjaGluZywgc2ltcGxlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImxjc3NhIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9TU0FVcGRhdGVyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ByZWRJdGVyYXRvckNhY2hlLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUxDU1NBLCAiTnVtYmVyIG9mIGxpdmUgb3V0IG9mIGEgbG9vcCB2YXJpYWJsZXMiKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IExDU1NBIDogcHVibGljIExvb3BQYXNzIHsKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICAgIExDU1NBKCkgOiBMb29wUGFzcyhJRCkge30KKworICAgIC8vIENhY2hlZCBhbmFseXNpcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgICAgRG9taW5hdG9yVHJlZSAqRFQ7CisgICAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+IExvb3BCbG9ja3M7CisgICAgUHJlZEl0ZXJhdG9yQ2FjaGUgUHJlZENhY2hlOworICAgIExvb3AgKkw7CisgICAgCisgICAgdmlydHVhbCBib29sIHJ1bk9uTG9vcChMb29wICpMLCBMUFBhc3NNYW5hZ2VyICZMUE0pOworCisgICAgLy8vIFRoaXMgdHJhbnNmb3JtYXRpb24gcmVxdWlyZXMgbmF0dXJhbCBsb29wIGluZm9ybWF0aW9uICYgcmVxdWlyZXMgdGhhdAorICAgIC8vLyBsb29wIHByZWhlYWRlcnMgYmUgaW5zZXJ0ZWQgaW50byB0aGUgQ0ZHLiAgSXQgbWFpbnRhaW5zIGJvdGggb2YgdGhlc2UsCisgICAgLy8vIGFzIHdlbGwgYXMgdGhlIENGRy4gIEl0IGFsc28gcmVxdWlyZXMgZG9taW5hdG9yIGluZm9ybWF0aW9uLgorICAgIC8vLworICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNDRkcoKTsKKworICAgICAgQVUuYWRkUmVxdWlyZWQ8RG9taW5hdG9yVHJlZT4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxEb21pbmF0b3JUcmVlPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPERvbWluYW5jZUZyb250aWVyPigpOworICAgICAgQVUuYWRkUmVxdWlyZWQ8TG9vcEluZm8+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8TG9vcEluZm8+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWRJRChMb29wU2ltcGxpZnlJRCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8U2NhbGFyRXZvbHV0aW9uPigpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBib29sIFByb2Nlc3NJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayo+ICZFeGl0QmxvY2tzKTsKKyAgICAKKyAgICAvLy8gdmVyaWZ5QW5hbHlzaXMoKSAtIFZlcmlmeSBsb29wIG5lc3QuCisgICAgdmlydHVhbCB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3QgeworICAgICAgLy8gQ2hlY2sgdGhlIHNwZWNpYWwgZ3VhcmFudGVlcyB0aGF0IExDU1NBIG1ha2VzLgorICAgICAgYXNzZXJ0KEwtPmlzTENTU0FGb3JtKCpEVCkgJiYgIkxDU1NBIGZvcm0gbm90IHByZXNlcnZlZCEiKTsKKyAgICB9CisKKyAgICAvLy8gaW5Mb29wIC0gcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBibG9jayBpcyB3aXRoaW4gdGhlIGN1cnJlbnQgbG9vcAorICAgIGJvb2wgaW5Mb29wKEJhc2ljQmxvY2sgKkIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OmJpbmFyeV9zZWFyY2goTG9vcEJsb2Nrcy5iZWdpbigpLCBMb29wQmxvY2tzLmVuZCgpLCBCKTsKKyAgICB9CisgIH07Cit9CisgIAorY2hhciBMQ1NTQTo6SUQgPSAwOworc3RhdGljIFJlZ2lzdGVyUGFzczxMQ1NTQT4gWCgibGNzc2EiLCAiTG9vcC1DbG9zZWQgU1NBIEZvcm0gUGFzcyIpOworCitQYXNzICpsbHZtOjpjcmVhdGVMQ1NTQVBhc3MoKSB7IHJldHVybiBuZXcgTENTU0EoKTsgfQorY2hhciAmbGx2bTo6TENTU0FJRCA9IExDU1NBOjpJRDsKKworCisvLy8gQmxvY2tEb21pbmF0ZXNBbkV4aXQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGJsb2NrIGRvbWluYXRlcyBhdCBsZWFzdAorLy8vIG9uZSBvZiB0aGUgYmxvY2tzIGluIHRoZSBzcGVjaWZpZWQgbGlzdC4KK3N0YXRpYyBib29sIEJsb2NrRG9taW5hdGVzQW5FeGl0KEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sqPiAmRXhpdEJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUKSB7CisgIERvbVRyZWVOb2RlICpEb21Ob2RlID0gRFQtPmdldE5vZGUoQkIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRXhpdEJsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChEVC0+ZG9taW5hdGVzKERvbU5vZGUsIERULT5nZXROb2RlKEV4aXRCbG9ja3NbaV0pKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gcnVuT25GdW5jdGlvbiAtIFByb2Nlc3MgYWxsIGxvb3BzIGluIHRoZSBmdW5jdGlvbiwgaW5uZXItbW9zdCBvdXQuCitib29sIExDU1NBOjpydW5Pbkxvb3AoTG9vcCAqVGhlTG9vcCwgTFBQYXNzTWFuYWdlciAmTFBNKSB7CisgIEwgPSBUaGVMb29wOworICAKKyAgRFQgPSAmZ2V0QW5hbHlzaXM8RG9taW5hdG9yVHJlZT4oKTsKKworICAvLyBHZXQgdGhlIHNldCBvZiBleGl0aW5nIGJsb2Nrcy4KKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDg+IEV4aXRCbG9ja3M7CisgIEwtPmdldEV4aXRCbG9ja3MoRXhpdEJsb2Nrcyk7CisgIAorICBpZiAoRXhpdEJsb2Nrcy5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIFNwZWVkIHVwIHF1ZXJpZXMgYnkgY3JlYXRpbmcgYSBzb3J0ZWQgdmVjdG9yIG9mIGJsb2Nrcy4KKyAgTG9vcEJsb2Nrcy5jbGVhcigpOworICBMb29wQmxvY2tzLmluc2VydChMb29wQmxvY2tzLmVuZCgpLCBMLT5ibG9ja19iZWdpbigpLCBMLT5ibG9ja19lbmQoKSk7CisgIGFycmF5X3BvZF9zb3J0KExvb3BCbG9ja3MuYmVnaW4oKSwgTG9vcEJsb2Nrcy5lbmQoKSk7CisgIAorICAvLyBMb29rIGF0IGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBsb29wLCBjaGVja2luZyB0byBzZWUgaWYgdGhleSBoYXZlIHVzZXMKKyAgLy8gb3V0c2lkZSB0aGUgbG9vcC4gIElmIHNvLCByZXdyaXRlIHRob3NlIHVzZXMuCisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICAKKyAgZm9yIChMb29wOjpibG9ja19pdGVyYXRvciBCQkkgPSBMLT5ibG9ja19iZWdpbigpLCBFID0gTC0+YmxvY2tfZW5kKCk7CisgICAgICAgQkJJICE9IEU7ICsrQkJJKSB7CisgICAgQmFzaWNCbG9jayAqQkIgPSAqQkJJOworICAgIAorICAgIC8vIEZvciBsYXJnZSBsb29wcywgYXZvaWQgdXNlLXNjYW5uaW5nIGJ5IHVzaW5nIGRvbWluYW5jZSBpbmZvcm1hdGlvbjogIEluCisgICAgLy8gcGFydGljdWxhciwgaWYgYSBibG9jayBkb2VzIG5vdCBkb21pbmF0ZSBhbnkgb2YgdGhlIGxvb3AgZXhpdHMsIHRoZW4gbm9uZQorICAgIC8vIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgYmxvY2sgY291bGQgYmUgdXNlZCBvdXRzaWRlIHRoZSBsb29wLgorICAgIGlmICghQmxvY2tEb21pbmF0ZXNBbkV4aXQoQkIsIEV4aXRCbG9ja3MsIERUKSkKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIC8vIFJlamVjdCB0d28gY29tbW9uIGNhc2VzIGZhc3Q6IGluc3RydWN0aW9ucyB3aXRoIG5vIHVzZXMgKGxpa2Ugc3RvcmVzKQorICAgICAgLy8gYW5kIGluc3RydWN0aW9ucyB3aXRoIG9uZSB1c2UgdGhhdCBpcyBpbiB0aGUgc2FtZSBibG9jayBhcyB0aGlzLgorICAgICAgaWYgKEktPnVzZV9lbXB0eSgpIHx8CisgICAgICAgICAgKEktPmhhc09uZVVzZSgpICYmIEktPnVzZV9iYWNrKCktPmdldFBhcmVudCgpID09IEJCICYmCisgICAgICAgICAgICFpc2E8UEhJTm9kZT4oSS0+dXNlX2JhY2soKSkpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgTWFkZUNoYW5nZSB8PSBQcm9jZXNzSW5zdHJ1Y3Rpb24oSSwgRXhpdEJsb2Nrcyk7CisgICAgfQorICB9CisgIAorICBhc3NlcnQoTC0+aXNMQ1NTQUZvcm0oKkRUKSk7CisgIFByZWRDYWNoZS5jbGVhcigpOworCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisvLy8gaXNFeGl0QmxvY2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGJsb2NrIGlzIGluIHRoZSBsaXN0Lgorc3RhdGljIGJvb2wgaXNFeGl0QmxvY2soQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayo+ICZFeGl0QmxvY2tzKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBFeGl0QmxvY2tzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKEV4aXRCbG9ja3NbaV0gPT0gQkIpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUHJvY2Vzc0luc3RydWN0aW9uIC0gR2l2ZW4gYW4gaW5zdHJ1Y3Rpb24gaW4gdGhlIGxvb3AsIGNoZWNrIHRvIHNlZSBpZiBpdAorLy8vIGhhcyBhbnkgdXNlcyB0aGF0IGFyZSBvdXRzaWRlIHRoZSBjdXJyZW50IGxvb3AuICBJZiBzbywgaW5zZXJ0IExDU1NBIFBISQorLy8vIG5vZGVzIGFuZCByZXdyaXRlIHRoZSB1c2VzLgorYm9vbCBMQ1NTQTo6UHJvY2Vzc0luc3RydWN0aW9uKEluc3RydWN0aW9uICpJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrKj4gJkV4aXRCbG9ja3MpIHsKKyAgU21hbGxWZWN0b3I8VXNlKiwgMTY+IFVzZXNUb1Jld3JpdGU7CisgIAorICBCYXNpY0Jsb2NrICpJbnN0QkIgPSBJbnN0LT5nZXRQYXJlbnQoKTsKKyAgCisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEluc3QtPnVzZV9iZWdpbigpLCBFID0gSW5zdC0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IEU7ICsrVUkpIHsKKyAgICBVc2VyICpVID0gKlVJOworICAgIEJhc2ljQmxvY2sgKlVzZXJCQiA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KFUpLT5nZXRQYXJlbnQoKTsKKyAgICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihVKSkKKyAgICAgIFVzZXJCQiA9IFBOLT5nZXRJbmNvbWluZ0Jsb2NrKFVJKTsKKyAgICAKKyAgICBpZiAoSW5zdEJCICE9IFVzZXJCQiAmJiAhaW5Mb29wKFVzZXJCQikpCisgICAgICBVc2VzVG9SZXdyaXRlLnB1c2hfYmFjaygmVUkuZ2V0VXNlKCkpOworICB9CisKKyAgLy8gSWYgdGhlcmUgYXJlIG5vIHVzZXMgb3V0c2lkZSB0aGUgbG9vcCwgZXhpdCB3aXRoIG5vIGNoYW5nZS4KKyAgaWYgKFVzZXNUb1Jld3JpdGUuZW1wdHkoKSkgcmV0dXJuIGZhbHNlOworICAKKyAgKytOdW1MQ1NTQTsgLy8gV2UgYXJlIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbgorCisgIC8vIEludm9rZSBpbnN0cnVjdGlvbnMgYXJlIHNwZWNpYWwgaW4gdGhhdCB0aGVpciByZXN1bHQgdmFsdWUgaXMgbm90IGF2YWlsYWJsZQorICAvLyBhbG9uZyB0aGVpciB1bndpbmQgZWRnZS4gVGhlIGNvZGUgYmVsb3cgdGVzdHMgdG8gc2VlIHdoZXRoZXIgRG9tQkIgZG9taW5hdGVzCisgIC8vIHRoZSB2YWx1ZSwgc28gYWRqdXN0IERvbUJCIHRvIHRoZSBub3JtYWwgZGVzdGluYXRpb24gYmxvY2ssIHdoaWNoIGlzCisgIC8vIGVmZmVjdGl2ZWx5IHdoZXJlIHRoZSB2YWx1ZSBpcyBmaXJzdCB1c2FibGUuCisgIEJhc2ljQmxvY2sgKkRvbUJCID0gSW5zdC0+Z2V0UGFyZW50KCk7CisKKyAgRG9tVHJlZU5vZGUgKkRvbU5vZGUgPSBEVC0+Z2V0Tm9kZShEb21CQik7CisKKyAgU1NBVXBkYXRlciBTU0FVcGRhdGU7CisgIFNTQVVwZGF0ZS5Jbml0aWFsaXplKEluc3QpOworICAKKyAgLy8gSW5zZXJ0IHRoZSBMQ1NTQSBwaGkncyBpbnRvIGFsbCBvZiB0aGUgZXhpdCBibG9ja3MgZG9taW5hdGVkIGJ5IHRoZQorICAvLyB2YWx1ZSwgYW5kIGFkZCB0aGVtIHRvIHRoZSBQaGkncyBtYXAuCisgIGZvciAoU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sqPjo6Y29uc3RfaXRlcmF0b3IgQkJJID0gRXhpdEJsb2Nrcy5iZWdpbigpLAorICAgICAgQkJFID0gRXhpdEJsb2Nrcy5lbmQoKTsgQkJJICE9IEJCRTsgKytCQkkpIHsKKyAgICBCYXNpY0Jsb2NrICpFeGl0QkIgPSAqQkJJOworICAgIGlmICghRFQtPmRvbWluYXRlcyhEb21Ob2RlLCBEVC0+Z2V0Tm9kZShFeGl0QkIpKSkgY29udGludWU7CisgICAgCisgICAgLy8gSWYgd2UgYWxyZWFkeSBpbnNlcnRlZCBzb21ldGhpbmcgZm9yIHRoaXMgQkIsIGRvbid0IHJlcHJvY2VzcyBpdC4KKyAgICBpZiAoU1NBVXBkYXRlLkhhc1ZhbHVlRm9yQmxvY2soRXhpdEJCKSkgY29udGludWU7CisgICAgCisgICAgUEhJTm9kZSAqUE4gPSBQSElOb2RlOjpDcmVhdGUoSW5zdC0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXRCQi0+YmVnaW4oKSk7CisgICAgUE4tPnJlc2VydmVPcGVyYW5kU3BhY2UoUHJlZENhY2hlLkdldE51bVByZWRzKEV4aXRCQikpOworCisgICAgLy8gQWRkIGlucHV0cyBmcm9tIGluc2lkZSB0aGUgbG9vcCBmb3IgdGhpcyBQSEkuCisgICAgZm9yIChCYXNpY0Jsb2NrICoqUEkgPSBQcmVkQ2FjaGUuR2V0UHJlZHMoRXhpdEJCKTsgKlBJOyArK1BJKSB7CisgICAgICBQTi0+YWRkSW5jb21pbmcoSW5zdCwgKlBJKTsKKworICAgICAgLy8gSWYgdGhlIGV4aXQgYmxvY2sgaGFzIGEgcHJlZGVjZXNzb3Igbm90IHdpdGhpbiB0aGUgbG9vcCwgYXJyYW5nZSBmb3IKKyAgICAgIC8vIHRoZSBpbmNvbWluZyB2YWx1ZSB1c2UgY29ycmVzcG9uZGluZyB0byB0aGF0IHByZWRlY2Vzc29yIHRvIGJlCisgICAgICAvLyByZXdyaXR0ZW4gaW4gdGVybXMgb2YgYSBkaWZmZXJlbnQgTENTU0EgUEhJLgorICAgICAgaWYgKCFpbkxvb3AoKlBJKSkKKyAgICAgICAgVXNlc1RvUmV3cml0ZS5wdXNoX2JhY2soCisgICAgICAgICAgJlBOLT5nZXRPcGVyYW5kVXNlKAorICAgICAgICAgICAgUE4tPmdldE9wZXJhbmROdW1Gb3JJbmNvbWluZ1ZhbHVlKFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpLTEpKSk7CisgICAgfQorICAgIAorICAgIC8vIFJlbWVtYmVyIHRoYXQgdGhpcyBwaGkgbWFrZXMgdGhlIHZhbHVlIGFsaXZlIGluIHRoaXMgYmxvY2suCisgICAgU1NBVXBkYXRlLkFkZEF2YWlsYWJsZVZhbHVlKEV4aXRCQiwgUE4pOworICB9CisgIAorICAvLyBSZXdyaXRlIGFsbCB1c2VzIG91dHNpZGUgdGhlIGxvb3AgaW4gdGVybXMgb2YgdGhlIG5ldyBQSElzIHdlIGp1c3QKKyAgLy8gaW5zZXJ0ZWQuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVc2VzVG9SZXdyaXRlLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAvLyBJZiB0aGlzIHVzZSBpcyBpbiBhbiBleGl0IGJsb2NrLCByZXdyaXRlIHRvIHVzZSB0aGUgbmV3bHkgaW5zZXJ0ZWQgUEhJLgorICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzIGJlY2F1c2UgU1NBVXBkYXRlIGRvZXNuJ3QgaGFuZGxlIHVzZXMgaW4KKyAgICAvLyB0aGUgc2FtZSBibG9jay4gIEl0IGFzc3VtZXMgdGhlIFBISSB3ZSBpbnNlcnRlZCBpcyBhdCB0aGUgZW5kIG9mIHRoZQorICAgIC8vIGJsb2NrLgorICAgIEluc3RydWN0aW9uICpVc2VyID0gY2FzdDxJbnN0cnVjdGlvbj4oVXNlc1RvUmV3cml0ZVtpXS0+Z2V0VXNlcigpKTsKKyAgICBCYXNpY0Jsb2NrICpVc2VyQkIgPSBVc2VyLT5nZXRQYXJlbnQoKTsKKyAgICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihVc2VyKSkKKyAgICAgIFVzZXJCQiA9IFBOLT5nZXRJbmNvbWluZ0Jsb2NrKCpVc2VzVG9SZXdyaXRlW2ldKTsKKworICAgIGlmIChpc2E8UEhJTm9kZT4oVXNlckJCLT5iZWdpbigpKSAmJgorICAgICAgICBpc0V4aXRCbG9jayhVc2VyQkIsIEV4aXRCbG9ja3MpKSB7CisgICAgICBVc2VzVG9SZXdyaXRlW2ldLT5zZXQoVXNlckJCLT5iZWdpbigpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIGRvIGZ1bGwgUEhJIGluc2VydGlvbi4KKyAgICBTU0FVcGRhdGUuUmV3cml0ZVVzZSgqVXNlc1RvUmV3cml0ZVtpXSk7CisgIH0KKyAgCisgIHJldHVybiB0cnVlOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmNGZjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmNwcApAQCAtMCwwICsxLDY0NCBAQAorLy89PT0tLSBMb2NhbC5jcHAgLSBGdW5jdGlvbnMgdG8gcGVyZm9ybSBsb2NhbCB0cmFuc2Zvcm1hdGlvbnMgLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZhbWlseSBvZiBmdW5jdGlvbnMgcGVyZm9ybSB2YXJpb3VzIGxvY2FsIHRyYW5zZm9ybWF0aW9ucyB0byB0aGUKKy8vIHByb2dyYW0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxBbGlhcy5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Qcm9maWxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTG9jYWwgY29uc3RhbnQgcHJvcGFnYXRpb24uCisvLworCisvLyBDb25zdGFudEZvbGRUZXJtaW5hdG9yIC0gSWYgYSB0ZXJtaW5hdG9yIGluc3RydWN0aW9uIGlzIHByZWRpY2F0ZWQgb24gYQorLy8gY29uc3RhbnQgdmFsdWUsIGNvbnZlcnQgaXQgaW50byBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byB0aGUgY29uc3RhbnQKKy8vIGRlc3RpbmF0aW9uLgorLy8KK2Jvb2wgbGx2bTo6Q29uc3RhbnRGb2xkVGVybWluYXRvcihCYXNpY0Jsb2NrICpCQikgeworICBUZXJtaW5hdG9ySW5zdCAqVCA9IEJCLT5nZXRUZXJtaW5hdG9yKCk7CisKKyAgLy8gQnJhbmNoIC0gU2VlIGlmIHdlIGFyZSBjb25kaXRpb25hbCBqdW1waW5nIG9uIGNvbnN0YW50CisgIGlmIChCcmFuY2hJbnN0ICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KFQpKSB7CisgICAgaWYgKEJJLT5pc1VuY29uZGl0aW9uYWwoKSkgcmV0dXJuIGZhbHNlOyAgLy8gQ2FuJ3Qgb3B0aW1pemUgdW5jb25kIGJyYW5jaAorICAgIEJhc2ljQmxvY2sgKkRlc3QxID0gQkktPmdldFN1Y2Nlc3NvcigwKTsKKyAgICBCYXNpY0Jsb2NrICpEZXN0MiA9IEJJLT5nZXRTdWNjZXNzb3IoMSk7CisKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNvbmQgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQkktPmdldENvbmRpdGlvbigpKSkgeworICAgICAgLy8gQXJlIHdlIGJyYW5jaGluZyBvbiBjb25zdGFudD8KKyAgICAgIC8vIFlFUy4gIENoYW5nZSB0byB1bmNvbmRpdGlvbmFsIGJyYW5jaC4uLgorICAgICAgQmFzaWNCbG9jayAqRGVzdGluYXRpb24gPSBDb25kLT5nZXRaRXh0VmFsdWUoKSA/IERlc3QxIDogRGVzdDI7CisgICAgICBCYXNpY0Jsb2NrICpPbGREZXN0ICAgICA9IENvbmQtPmdldFpFeHRWYWx1ZSgpID8gRGVzdDIgOiBEZXN0MTsKKworICAgICAgLy9jZXJyIDw8ICJGdW5jdGlvbjogIiA8PCBULT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkKKyAgICAgIC8vICAgICA8PCAiXG5SZW1vdmluZyBicmFuY2ggZnJvbSAiIDw8IFQtPmdldFBhcmVudCgpCisgICAgICAvLyAgICAgPDwgIlxuXG5UbzogIiA8PCBPbGREZXN0IDw8IGVuZGw7CisKKyAgICAgIC8vIExldCB0aGUgYmFzaWMgYmxvY2sga25vdyB0aGF0IHdlIGFyZSBsZXR0aW5nIGdvIG9mIGl0LiAgQmFzZWQgb24gdGhpcywKKyAgICAgIC8vIGl0IHdpbGwgYWRqdXN0IGl0J3MgUEhJIG5vZGVzLgorICAgICAgYXNzZXJ0KEJJLT5nZXRQYXJlbnQoKSAmJiAiVGVybWluYXRvciBub3QgaW5zZXJ0ZWQgaW4gYmxvY2shIik7CisgICAgICBPbGREZXN0LT5yZW1vdmVQcmVkZWNlc3NvcihCSS0+Z2V0UGFyZW50KCkpOworCisgICAgICAvLyBTZXQgdGhlIHVuY29uZGl0aW9uYWwgZGVzdGluYXRpb24sIGFuZCBjaGFuZ2UgdGhlIGluc24gdG8gYmUgYW4KKyAgICAgIC8vIHVuY29uZGl0aW9uYWwgYnJhbmNoLgorICAgICAgQkktPnNldFVuY29uZGl0aW9uYWxEZXN0KERlc3RpbmF0aW9uKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBpZiAoRGVzdDIgPT0gRGVzdDEpIHsgICAgICAgLy8gQ29uZGl0aW9uYWwgYnJhbmNoIHRvIHNhbWUgbG9jYXRpb24/CisgICAgICAvLyBUaGlzIGJyYW5jaCBtYXRjaGVzIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgICAgICAvLyAgICAgYnIgYm9vbCAlY29uZCwgbGFiZWwgJURlc3QsIGxhYmVsICVEZXN0CisgICAgICAvLyBhbmQgY2hhbmdlcyBpdCBpbnRvOiAgYnIgbGFiZWwgJURlc3QKKworICAgICAgLy8gTGV0IHRoZSBiYXNpYyBibG9jayBrbm93IHRoYXQgd2UgYXJlIGxldHRpbmcgZ28gb2Ygb25lIGNvcHkgb2YgaXQuCisgICAgICBhc3NlcnQoQkktPmdldFBhcmVudCgpICYmICJUZXJtaW5hdG9yIG5vdCBpbnNlcnRlZCBpbiBibG9jayEiKTsKKyAgICAgIERlc3QxLT5yZW1vdmVQcmVkZWNlc3NvcihCSS0+Z2V0UGFyZW50KCkpOworCisgICAgICAvLyBDaGFuZ2UgYSBjb25kaXRpb25hbCBicmFuY2ggdG8gdW5jb25kaXRpb25hbC4KKyAgICAgIEJJLT5zZXRVbmNvbmRpdGlvbmFsRGVzdChEZXN0MSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICBpZiAoU3dpdGNoSW5zdCAqU0kgPSBkeW5fY2FzdDxTd2l0Y2hJbnN0PihUKSkgeworICAgIC8vIElmIHdlIGFyZSBzd2l0Y2hpbmcgb24gYSBjb25zdGFudCwgd2UgY2FuIGNvbnZlcnQgdGhlIHN3aXRjaCBpbnRvIGEKKyAgICAvLyBzaW5nbGUgYnJhbmNoIGluc3RydWN0aW9uIQorICAgIENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihTSS0+Z2V0Q29uZGl0aW9uKCkpOworICAgIEJhc2ljQmxvY2sgKlRoZU9ubHlEZXN0ID0gU0ktPmdldFN1Y2Nlc3NvcigwKTsgIC8vIFRoZSBkZWZhdWx0IGRlc3QKKyAgICBCYXNpY0Jsb2NrICpEZWZhdWx0RGVzdCA9IFRoZU9ubHlEZXN0OworICAgIGFzc2VydChUaGVPbmx5RGVzdCA9PSBTSS0+Z2V0RGVmYXVsdERlc3QoKSAmJgorICAgICAgICAgICAiRGVmYXVsdCBkZXN0aW5hdGlvbiBpcyBub3Qgc3VjY2Vzc29yICMwPyIpOworCisgICAgLy8gRmlndXJlIG91dCB3aGljaCBjYXNlIGl0IGdvZXMgdG8uCisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFNJLT5nZXROdW1TdWNjZXNzb3JzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAvLyBGb3VuZCBjYXNlIG1hdGNoaW5nIGEgY29uc3RhbnQgb3BlcmFuZD8KKyAgICAgIGlmIChTSS0+Z2V0U3VjY2Vzc29yVmFsdWUoaSkgPT0gQ0kpIHsKKyAgICAgICAgVGhlT25seURlc3QgPSBTSS0+Z2V0U3VjY2Vzc29yKGkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgYnJhbmNoIGlzIGdvaW5nIHRvIHRoZSBzYW1lIHBsYWNlIGFzIHRoZSBkZWZhdWx0CisgICAgICAvLyBkZXN0LiAgSWYgc28sIGVsaW1pbmF0ZSBpdCBhcyBhbiBleHBsaWNpdCBjb21wYXJlLgorICAgICAgaWYgKFNJLT5nZXRTdWNjZXNzb3IoaSkgPT0gRGVmYXVsdERlc3QpIHsKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgZW50cnkuCisgICAgICAgIERlZmF1bHREZXN0LT5yZW1vdmVQcmVkZWNlc3NvcihTSS0+Z2V0UGFyZW50KCkpOworICAgICAgICBTSS0+cmVtb3ZlQ2FzZShpKTsKKyAgICAgICAgLS1pOyAtLWU7ICAvLyBEb24ndCBza2lwIGFuIGVudHJ5Li4uCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBPdGhlcndpc2UsIGNoZWNrIHRvIHNlZSBpZiB0aGUgc3dpdGNoIG9ubHkgYnJhbmNoZXMgdG8gb25lIGRlc3RpbmF0aW9uLgorICAgICAgLy8gV2UgZG8gdGhpcyBieSByZXNldGluZyAiVGhlT25seURlc3QiIHRvIG51bGwgd2hlbiB3ZSBmaW5kIHR3byBub24tZXF1YWwKKyAgICAgIC8vIGRlc3RpbmF0aW9ucy4KKyAgICAgIGlmIChTSS0+Z2V0U3VjY2Vzc29yKGkpICE9IFRoZU9ubHlEZXN0KSBUaGVPbmx5RGVzdCA9IDA7CisgICAgfQorCisgICAgaWYgKENJICYmICFUaGVPbmx5RGVzdCkgeworICAgICAgLy8gQnJhbmNoaW5nIG9uIGEgY29uc3RhbnQsIGJ1dCBub3QgYW55IG9mIHRoZSBjYXNlcywgZ28gdG8gdGhlIGRlZmF1bHQKKyAgICAgIC8vIHN1Y2Nlc3Nvci4KKyAgICAgIFRoZU9ubHlEZXN0ID0gU0ktPmdldERlZmF1bHREZXN0KCk7CisgICAgfQorCisgICAgLy8gSWYgd2UgZm91bmQgYSBzaW5nbGUgZGVzdGluYXRpb24gdGhhdCB3ZSBjYW4gZm9sZCB0aGUgc3dpdGNoIGludG8sIGRvIHNvCisgICAgLy8gbm93LgorICAgIGlmIChUaGVPbmx5RGVzdCkgeworICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgYnJhbmNoLgorICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKFRoZU9ubHlEZXN0LCBTSSk7CisgICAgICBCYXNpY0Jsb2NrICpCQiA9IFNJLT5nZXRQYXJlbnQoKTsKKworICAgICAgLy8gUmVtb3ZlIGVudHJpZXMgZnJvbSBQSEkgbm9kZXMgd2hpY2ggd2Ugbm8gbG9uZ2VyIGJyYW5jaCB0by4uLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNJLT5nZXROdW1TdWNjZXNzb3JzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIC8vIEZvdW5kIGNhc2UgbWF0Y2hpbmcgYSBjb25zdGFudCBvcGVyYW5kPworICAgICAgICBCYXNpY0Jsb2NrICpTdWNjID0gU0ktPmdldFN1Y2Nlc3NvcihpKTsKKyAgICAgICAgaWYgKFN1Y2MgPT0gVGhlT25seURlc3QpCisgICAgICAgICAgVGhlT25seURlc3QgPSAwOyAgLy8gRG9uJ3QgbW9kaWZ5IHRoZSBmaXJzdCBicmFuY2ggdG8gVGhlT25seURlc3QKKyAgICAgICAgZWxzZQorICAgICAgICAgIFN1Y2MtPnJlbW92ZVByZWRlY2Vzc29yKEJCKTsKKyAgICAgIH0KKworICAgICAgLy8gRGVsZXRlIHRoZSBvbGQgc3dpdGNoLgorICAgICAgQkItPmdldEluc3RMaXN0KCkuZXJhc2UoU0kpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGlmIChTSS0+Z2V0TnVtU3VjY2Vzc29ycygpID09IDIpIHsKKyAgICAgIC8vIE90aGVyd2lzZSwgd2UgY2FuIGZvbGQgdGhpcyBzd2l0Y2ggaW50byBhIGNvbmRpdGlvbmFsIGJyYW5jaAorICAgICAgLy8gaW5zdHJ1Y3Rpb24gaWYgaXQgaGFzIG9ubHkgb25lIG5vbi1kZWZhdWx0IGRlc3RpbmF0aW9uLgorICAgICAgVmFsdWUgKkNvbmQgPSBuZXcgSUNtcEluc3QoU0ksIElDbXBJbnN0OjpJQ01QX0VRLCBTSS0+Z2V0Q29uZGl0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSS0+Z2V0U3VjY2Vzc29yVmFsdWUoMSkpOworICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgYnJhbmNoLgorICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKFNJLT5nZXRTdWNjZXNzb3IoMSksIFNJLT5nZXRTdWNjZXNzb3IoMCksIENvbmQsIFNJKTsKKworICAgICAgLy8gRGVsZXRlIHRoZSBvbGQgc3dpdGNoLgorICAgICAgU0ktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChJbmRpcmVjdEJySW5zdCAqSUJJID0gZHluX2Nhc3Q8SW5kaXJlY3RCckluc3Q+KFQpKSB7CisgICAgLy8gaW5kaXJlY3RiciBibG9ja2FkZHJlc3MoQEYsIEBCQikgLT4gYnIgbGFiZWwgQEJCCisgICAgaWYgKEJsb2NrQWRkcmVzcyAqQkEgPQorICAgICAgICAgIGR5bl9jYXN0PEJsb2NrQWRkcmVzcz4oSUJJLT5nZXRBZGRyZXNzKCktPnN0cmlwUG9pbnRlckNhc3RzKCkpKSB7CisgICAgICBCYXNpY0Jsb2NrICpUaGVPbmx5RGVzdCA9IEJBLT5nZXRCYXNpY0Jsb2NrKCk7CisgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBicmFuY2guCisgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoVGhlT25seURlc3QsIElCSSk7CisgICAgICAKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJQkktPmdldE51bURlc3RpbmF0aW9ucygpOyBpICE9IGU7ICsraSkgeworICAgICAgICBpZiAoSUJJLT5nZXREZXN0aW5hdGlvbihpKSA9PSBUaGVPbmx5RGVzdCkKKyAgICAgICAgICBUaGVPbmx5RGVzdCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBJQkktPmdldERlc3RpbmF0aW9uKGkpLT5yZW1vdmVQcmVkZWNlc3NvcihJQkktPmdldFBhcmVudCgpKTsKKyAgICAgIH0KKyAgICAgIElCSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAKKyAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIG91ciBkZXN0aW5hdGlvbiBpbiB0aGUgSUJJIHN1Y2Nlc3NvciBsaXN0LCB0aGVuIHdlCisgICAgICAvLyBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvci4gIFJlcGxhY2UgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoIHdpdGggYW4KKyAgICAgIC8vICd1bnJlYWNoYWJsZScgaW5zdHJ1Y3Rpb24uCisgICAgICBpZiAoVGhlT25seURlc3QpIHsKKyAgICAgICAgQkItPmdldFRlcm1pbmF0b3IoKS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIG5ldyBVbnJlYWNoYWJsZUluc3QoQkItPmdldENvbnRleHQoKSwgQkIpOworICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIExvY2FsIGRlYWQgY29kZSBlbGltaW5hdGlvbi4KKy8vCisKKy8vLyBpc0luc3RydWN0aW9uVHJpdmlhbGx5RGVhZCAtIFJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQgcHJvZHVjZWQgYnkgdGhlCisvLy8gaW5zdHJ1Y3Rpb24gaXMgbm90IHVzZWQsIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIHNpZGUgZWZmZWN0cy4KKy8vLworYm9vbCBsbHZtOjppc0luc3RydWN0aW9uVHJpdmlhbGx5RGVhZChJbnN0cnVjdGlvbiAqSSkgeworICBpZiAoIUktPnVzZV9lbXB0eSgpIHx8IGlzYTxUZXJtaW5hdG9ySW5zdD4oSSkpIHJldHVybiBmYWxzZTsKKworICAvLyBXZSBkb24ndCB3YW50IGRlYnVnIGluZm8gcmVtb3ZlZCBieSBhbnl0aGluZyB0aGlzIGdlbmVyYWwuCisgIGlmIChJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoSSkpIHJldHVybiBmYWxzZTsKKworICAvLyBMaWtld2lzZSBmb3IgbWVtb3J5IHVzZSBtYXJrZXJzLgorICBpZiAoaXNhPE1lbW9yeVVzZUludHJpbnNpYz4oSSkpIHJldHVybiBmYWxzZTsKKworICBpZiAoIUktPm1heUhhdmVTaWRlRWZmZWN0cygpKSByZXR1cm4gdHJ1ZTsKKworICAvLyBTcGVjaWFsIGNhc2UgaW50cmluc2ljcyB0aGF0ICJtYXkgaGF2ZSBzaWRlIGVmZmVjdHMiIGJ1dCBjYW4gYmUgZGVsZXRlZAorICAvLyB3aGVuIGRlYWQuCisgIGlmIChJbnRyaW5zaWNJbnN0ICpJSSA9IGR5bl9jYXN0PEludHJpbnNpY0luc3Q+KEkpKQorICAgIC8vIFNhZmUgdG8gZGVsZXRlIGxsdm0uc3RhY2tzYXZlIGlmIGRlYWQuCisgICAgaWYgKElJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6c3RhY2tzYXZlKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFJlY3Vyc2l2ZWx5RGVsZXRlVHJpdmlhbGx5RGVhZEluc3RydWN0aW9ucyAtIElmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYQorLy8vIHRyaXZpYWxseSBkZWFkIGluc3RydWN0aW9uLCBkZWxldGUgaXQuICBJZiB0aGF0IG1ha2VzIGFueSBvZiBpdHMgb3BlcmFuZHMKKy8vLyB0cml2aWFsbHkgZGVhZCwgZGVsZXRlIHRoZW0gdG9vLCByZWN1cnNpdmVseS4gIFJldHVybiB0cnVlIGlmIGFueQorLy8vIGluc3RydWN0aW9ucyB3ZXJlIGRlbGV0ZWQuCitib29sIGxsdm06OlJlY3Vyc2l2ZWx5RGVsZXRlVHJpdmlhbGx5RGVhZEluc3RydWN0aW9ucyhWYWx1ZSAqVikgeworICBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKTsKKyAgaWYgKCFJIHx8ICFJLT51c2VfZW1wdHkoKSB8fCAhaXNJbnN0cnVjdGlvblRyaXZpYWxseURlYWQoSSkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24qLCAxNj4gRGVhZEluc3RzOworICBEZWFkSW5zdHMucHVzaF9iYWNrKEkpOworICAKKyAgZG8geworICAgIEkgPSBEZWFkSW5zdHMucG9wX2JhY2tfdmFsKCk7CisKKyAgICAvLyBOdWxsIG91dCBhbGwgb2YgdGhlIGluc3RydWN0aW9uJ3Mgb3BlcmFuZHMgdG8gc2VlIGlmIGFueSBvcGVyYW5kIGJlY29tZXMKKyAgICAvLyBkZWFkIGFzIHdlIGdvLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgVmFsdWUgKk9wViA9IEktPmdldE9wZXJhbmQoaSk7CisgICAgICBJLT5zZXRPcGVyYW5kKGksIDApOworICAgICAgCisgICAgICBpZiAoIU9wVi0+dXNlX2VtcHR5KCkpIGNvbnRpbnVlOworICAgIAorICAgICAgLy8gSWYgdGhlIG9wZXJhbmQgaXMgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBiZWNhbWUgZGVhZCBhcyB3ZSBudWxsZWQgb3V0IHRoZQorICAgICAgLy8gb3BlcmFuZCwgYW5kIGlmIGl0IGlzICd0cml2aWFsbHknIGRlYWQsIGRlbGV0ZSBpdCBpbiBhIGZ1dHVyZSBsb29wCisgICAgICAvLyBpdGVyYXRpb24uCisgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKk9wSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihPcFYpKQorICAgICAgICBpZiAoaXNJbnN0cnVjdGlvblRyaXZpYWxseURlYWQoT3BJKSkKKyAgICAgICAgICBEZWFkSW5zdHMucHVzaF9iYWNrKE9wSSk7CisgICAgfQorICAgIAorICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICB9IHdoaWxlICghRGVhZEluc3RzLmVtcHR5KCkpOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gUmVjdXJzaXZlbHlEZWxldGVEZWFkUEhJTm9kZSAtIElmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gZWZmZWN0aXZlbHkKKy8vLyBkZWFkIFBISSBub2RlLCBkdWUgdG8gYmVpbmcgYSBkZWYtdXNlIGNoYWluIG9mIHNpbmdsZS11c2Ugbm9kZXMgdGhhdAorLy8vIGVpdGhlciBmb3JtcyBhIGN5Y2xlIG9yIGlzIHRlcm1pbmF0ZWQgYnkgYSB0cml2aWFsbHkgZGVhZCBpbnN0cnVjdGlvbiwKKy8vLyBkZWxldGUgaXQuICBJZiB0aGF0IG1ha2VzIGFueSBvZiBpdHMgb3BlcmFuZHMgdHJpdmlhbGx5IGRlYWQsIGRlbGV0ZSB0aGVtCisvLy8gdG9vLCByZWN1cnNpdmVseS4gIFJldHVybiB0cnVlIGlmIHRoZSBQSEkgbm9kZSBpcyBhY3R1YWxseSBkZWxldGVkLgorYm9vbAorbGx2bTo6UmVjdXJzaXZlbHlEZWxldGVEZWFkUEhJTm9kZShQSElOb2RlICpQTikgeworICAvLyBXZSBjYW4gcmVtb3ZlIGEgUEhJIGlmIGl0IGlzIG9uIGEgY3ljbGUgaW4gdGhlIGRlZi11c2UgZ3JhcGgKKyAgLy8gd2hlcmUgZWFjaCBub2RlIGluIHRoZSBjeWNsZSBoYXMgZGVncmVlIG9uZSwgaS5lLiBvbmx5IG9uZSB1c2UsCisgIC8vIGFuZCBpcyBhbiBpbnN0cnVjdGlvbiB3aXRoIG5vIHNpZGUgZWZmZWN0cy4KKyAgaWYgKCFQTi0+aGFzT25lVXNlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBTbWFsbFB0clNldDxQSElOb2RlICosIDQ+IFBISXM7CisgIFBISXMuaW5zZXJ0KFBOKTsKKyAgZm9yIChJbnN0cnVjdGlvbiAqSiA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpQTi0+dXNlX2JlZ2luKCkpOworICAgICAgIEotPmhhc09uZVVzZSgpICYmICFKLT5tYXlIYXZlU2lkZUVmZmVjdHMoKTsKKyAgICAgICBKID0gY2FzdDxJbnN0cnVjdGlvbj4oKkotPnVzZV9iZWdpbigpKSkKKyAgICAvLyBJZiB3ZSBmaW5kIGEgUEhJIG1vcmUgdGhhbiBvbmNlLCB3ZSdyZSBvbiBhIGN5Y2xlIHRoYXQKKyAgICAvLyB3b24ndCBwcm92ZSBmcnVpdGZ1bC4KKyAgICBpZiAoUEhJTm9kZSAqSlAgPSBkeW5fY2FzdDxQSElOb2RlPihKKSkKKyAgICAgIGlmICghUEhJcy5pbnNlcnQoY2FzdDxQSElOb2RlPihKUCkpKSB7CisgICAgICAgIC8vIEJyZWFrIHRoZSBjeWNsZSBhbmQgZGVsZXRlIHRoZSBQSEkgYW5kIGl0cyBvcGVyYW5kcy4KKyAgICAgICAgSlAtPnJlcGxhY2VBbGxVc2VzV2l0aChVbmRlZlZhbHVlOjpnZXQoSlAtPmdldFR5cGUoKSkpOworICAgICAgICAodm9pZClSZWN1cnNpdmVseURlbGV0ZVRyaXZpYWxseURlYWRJbnN0cnVjdGlvbnMoSlApOworICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gU2ltcGxpZnlJbnN0cnVjdGlvbnNJbkJsb2NrIC0gU2NhbiB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrIGFuZCB0cnkgdG8KKy8vLyBzaW1wbGlmeSBhbnkgaW5zdHJ1Y3Rpb25zIGluIGl0IGFuZCByZWN1cnNpdmVseSBkZWxldGUgZGVhZCBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBjaGFuZ2VkIHRoZSBjb2RlLCBub3RlIHRoYXQgaXQgY2FuIGRlbGV0ZQorLy8vIGluc3RydWN0aW9ucyBpbiBvdGhlciBibG9ja3MgYXMgd2VsbCBpbiB0aGlzIGJsb2NrLgorYm9vbCBsbHZtOjpTaW1wbGlmeUluc3RydWN0aW9uc0luQmxvY2soQmFzaWNCbG9jayAqQkIsIGNvbnN0IFRhcmdldERhdGEgKlREKSB7CisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7IEJJICE9IEU7ICkgeworICAgIEluc3RydWN0aW9uICpJbnN0ID0gQkkrKzsKKyAgICAKKyAgICBpZiAoVmFsdWUgKlYgPSBTaW1wbGlmeUluc3RydWN0aW9uKEluc3QsIFREKSkgeworICAgICAgV2Vha1ZIIEJJSGFuZGxlKEJJKTsKKyAgICAgIFJlcGxhY2VBbmRTaW1wbGlmeUFsbFVzZXMoSW5zdCwgViwgVEQpOworICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICBpZiAoQklIYW5kbGUgIT0gQkkpCisgICAgICAgIEJJID0gQkItPmJlZ2luKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgTWFkZUNoYW5nZSB8PSBSZWN1cnNpdmVseURlbGV0ZVRyaXZpYWxseURlYWRJbnN0cnVjdGlvbnMoSW5zdCk7CisgIH0KKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgQ29udHJvbCBGbG93IEdyYXBoIFJlc3RydWN0dXJpbmcuCisvLworCisKKy8vLyBSZW1vdmVQcmVkZWNlc3NvckFuZFNpbXBsaWZ5IC0gTGlrZSBCYXNpY0Jsb2NrOjpyZW1vdmVQcmVkZWNlc3NvciwgdGhpcworLy8vIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB3ZSdyZSBhYm91dCB0byBkZWxldGUgUHJlZCBhcyBhIHByZWRlY2Vzc29yIG9mIEJCLiAgSWYKKy8vLyBCQiBjb250YWlucyBhbnkgUEhJIG5vZGVzLCB0aGlzIGRyb3BzIHRoZSBlbnRyaWVzIGluIHRoZSBQSEkgbm9kZXMgZm9yIFByZWQuCisvLy8KKy8vLyBVbmxpa2UgdGhlIHJlbW92ZVByZWRlY2Vzc29yIG1ldGhvZCwgdGhpcyBhdHRlbXB0cyB0byBzaW1wbGlmeSB1c2VzIG9mIFBISQorLy8vIG5vZGVzIHRoYXQgY29sbGFwc2UgaW50byBpZGVudGl0eSB2YWx1ZXMuICBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZToKKy8vLyAgIHggPSBwaGkoMSwgMCwgMCwgMCkKKy8vLyAgIHkgPSBhbmQgeCwgegorLy8vCisvLy8gLi4gYW5kIGRlbGV0ZSB0aGUgcHJlZGVjZXNzb3IgY29ycmVzcG9uZGluZyB0byB0aGUgJzEnLCB0aGlzIHdpbGwgYXR0ZW1wdCB0bworLy8vIHJlY3Vyc2l2ZWx5IGZvbGQgdGhlIGFuZCB0byAwLgordm9pZCBsbHZtOjpSZW1vdmVQcmVkZWNlc3NvckFuZFNpbXBsaWZ5KEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldERhdGEgKlREKSB7CisgIC8vIFRoaXMgb25seSBhZGp1c3RzIGJsb2NrcyB3aXRoIFBISSBub2Rlcy4KKyAgaWYgKCFpc2E8UEhJTm9kZT4oQkItPmJlZ2luKCkpKQorICAgIHJldHVybjsKKyAgCisgIC8vIFJlbW92ZSB0aGUgZW50cmllcyBmb3IgUHJlZCBmcm9tIHRoZSBQSEkgbm9kZXMgaW4gQkIsIGJ1dCBkbyBub3Qgc2ltcGxpZnkKKyAgLy8gdGhlbSBkb3duLiAgVGhpcyB3aWxsIGxlYXZlIHVzIHdpdGggc2luZ2xlIGVudHJ5IHBoaSBub2RlcyBhbmQgb3RoZXIgcGhpcworICAvLyB0aGF0IGNhbiBiZSByZW1vdmVkLgorICBCQi0+cmVtb3ZlUHJlZGVjZXNzb3IoUHJlZCwgdHJ1ZSk7CisgIAorICBXZWFrVkggUGhpSXQgPSAmQkItPmZyb250KCk7CisgIHdoaWxlIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KFBoaUl0KSkgeworICAgIFBoaUl0ID0gJiorK0Jhc2ljQmxvY2s6Oml0ZXJhdG9yKGNhc3Q8SW5zdHJ1Y3Rpb24+KFBoaUl0KSk7CisgICAgCisgICAgVmFsdWUgKlBOViA9IFBOLT5oYXNDb25zdGFudFZhbHVlKCk7CisgICAgaWYgKFBOViA9PSAwKSBjb250aW51ZTsKKyAgICAKKyAgICAvLyBJZiB3ZSdyZSBhYmxlIHRvIHNpbXBsaWZ5IHRoZSBwaGkgdG8gYSBzaW5nbGUgdmFsdWUsIHN1YnN0aXR1dGUgdGhlIG5ldworICAgIC8vIHZhbHVlIGludG8gYWxsIG9mIGl0cyB1c2VzLgorICAgIGFzc2VydChQTlYgIT0gUE4gJiYgImhhc0NvbnN0YW50VmFsdWUgYnJva2VuIik7CisgICAgCisgICAgVmFsdWUgKk9sZFBoaUl0ID0gUGhpSXQ7CisgICAgUmVwbGFjZUFuZFNpbXBsaWZ5QWxsVXNlcyhQTiwgUE5WLCBURCk7CisgICAgCisgICAgLy8gSWYgcmVjdXJzaXZlIHNpbXBsaWZpY2F0aW9uIGVuZGVkIHVwIGRlbGV0aW5nIHRoZSBuZXh0IFBISSBub2RlIHdlIHdvdWxkCisgICAgLy8gaXRlcmF0ZSB0bywgdGhlbiBvdXIgaXRlcmF0b3IgaXMgaW52YWxpZCwgcmVzdGFydCBzY2FubmluZyBmcm9tIHRoZSB0b3AKKyAgICAvLyBvZiB0aGUgYmxvY2suCisgICAgaWYgKFBoaUl0ICE9IE9sZFBoaUl0KSBQaGlJdCA9ICZCQi0+ZnJvbnQoKTsKKyAgfQorfQorCisKKy8vLyBNZXJnZUJhc2ljQmxvY2tJbnRvT25seVByZWQgLSBEZXN0QkIgaXMgYSBibG9jayB3aXRoIG9uZSBwcmVkZWNlc3NvciBhbmQgaXRzCisvLy8gcHJlZGVjZXNzb3IgaXMga25vd24gdG8gaGF2ZSBvbmUgc3VjY2Vzc29yIChEZXN0QkIhKS4gIEVsaW1pbmF0ZSB0aGUgZWRnZQorLy8vIGJldHdlZW4gdGhlbSwgbW92aW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHByZWRlY2Vzc29yIGludG8gRGVzdEJCIGFuZAorLy8vIGRlbGV0aW5nIHRoZSBwcmVkZWNlc3NvciBibG9jay4KKy8vLwordm9pZCBsbHZtOjpNZXJnZUJhc2ljQmxvY2tJbnRvT25seVByZWQoQmFzaWNCbG9jayAqRGVzdEJCLCBQYXNzICpQKSB7CisgIC8vIElmIEJCIGhhcyBzaW5nbGUtZW50cnkgUEhJIG5vZGVzLCBmb2xkIHRoZW0uCisgIHdoaWxlIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KERlc3RCQi0+YmVnaW4oKSkpIHsKKyAgICBWYWx1ZSAqTmV3VmFsID0gUE4tPmdldEluY29taW5nVmFsdWUoMCk7CisgICAgLy8gUmVwbGFjZSBzZWxmIHJlZmVyZW5jaW5nIFBISSB3aXRoIHVuZGVmLCBpdCBtdXN0IGJlIGRlYWQuCisgICAgaWYgKE5ld1ZhbCA9PSBQTikgTmV3VmFsID0gVW5kZWZWYWx1ZTo6Z2V0KFBOLT5nZXRUeXBlKCkpOworICAgIFBOLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3VmFsKTsKKyAgICBQTi0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KKyAgCisgIEJhc2ljQmxvY2sgKlByZWRCQiA9IERlc3RCQi0+Z2V0U2luZ2xlUHJlZGVjZXNzb3IoKTsKKyAgYXNzZXJ0KFByZWRCQiAmJiAiQmxvY2sgZG9lc24ndCBoYXZlIGEgc2luZ2xlIHByZWRlY2Vzc29yISIpOworICAKKyAgLy8gU3BsaWNlIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIGZyb20gUHJlZEJCIHRvIERlc3RCQi4KKyAgUHJlZEJCLT5nZXRUZXJtaW5hdG9yKCktPmVyYXNlRnJvbVBhcmVudCgpOworICBEZXN0QkItPmdldEluc3RMaXN0KCkuc3BsaWNlKERlc3RCQi0+YmVnaW4oKSwgUHJlZEJCLT5nZXRJbnN0TGlzdCgpKTsKKworICAvLyBaYXAgYW55dGhpbmcgdGhhdCB0b29rIHRoZSBhZGRyZXNzIG9mIERlc3RCQi4gIE5vdCBkb2luZyB0aGlzIHdpbGwgZ2l2ZSB0aGUKKyAgLy8gYWRkcmVzcyBhbiBpbnZhbGlkIHZhbHVlLgorICBpZiAoRGVzdEJCLT5oYXNBZGRyZXNzVGFrZW4oKSkgeworICAgIEJsb2NrQWRkcmVzcyAqQkEgPSBCbG9ja0FkZHJlc3M6OmdldChEZXN0QkIpOworICAgIENvbnN0YW50ICpSZXBsYWNlbWVudCA9CisgICAgICBDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OmdldEludDMyVHkoQkEtPmdldENvbnRleHQoKSksIDEpOworICAgIEJBLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cihSZXBsYWNlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkEtPmdldFR5cGUoKSkpOworICAgIEJBLT5kZXN0cm95Q29uc3RhbnQoKTsKKyAgfQorICAKKyAgLy8gQW55dGhpbmcgdGhhdCBicmFuY2hlZCB0byBQcmVkQkIgbm93IGJyYW5jaGVzIHRvIERlc3RCQi4KKyAgUHJlZEJCLT5yZXBsYWNlQWxsVXNlc1dpdGgoRGVzdEJCKTsKKyAgCisgIGlmIChQKSB7CisgICAgUHJvZmlsZUluZm8gKlBJID0gUC0+Z2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxQcm9maWxlSW5mbz4oKTsKKyAgICBpZiAoUEkpIHsKKyAgICAgIFBJLT5yZXBsYWNlQWxsVXNlcyhQcmVkQkIsIERlc3RCQik7CisgICAgICBQSS0+cmVtb3ZlRWRnZShQcm9maWxlSW5mbzo6Z2V0RWRnZShQcmVkQkIsIERlc3RCQikpOworICAgIH0KKyAgfQorICAvLyBOdWtlIEJCLgorICBQcmVkQkItPmVyYXNlRnJvbVBhcmVudCgpOworfQorCisvLy8gQ2FuUHJvcGFnYXRlUHJlZGVjZXNzb3JzRm9yUEhJcyAtIFJldHVybiB0cnVlIGlmIHdlIGNhbiBmb2xkIEJCLCBhbgorLy8vIGFsbW9zdC1lbXB0eSBCQiBlbmRpbmcgaW4gYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gU3VjYywgaW50byBzdWNjLgorLy8vCisvLy8gQXNzdW1wdGlvbjogU3VjYyBpcyB0aGUgc2luZ2xlIHN1Y2Nlc3NvciBmb3IgQkIuCisvLy8KK3N0YXRpYyBib29sIENhblByb3BhZ2F0ZVByZWRlY2Vzc29yc0ZvclBISXMoQmFzaWNCbG9jayAqQkIsIEJhc2ljQmxvY2sgKlN1Y2MpIHsKKyAgYXNzZXJ0KCpzdWNjX2JlZ2luKEJCKSA9PSBTdWNjICYmICJTdWNjIGlzIG5vdCBzdWNjZXNzb3Igb2YgQkIhIik7CisKKyAgREVCVUcoZGJncygpIDw8ICJMb29raW5nIHRvIGZvbGQgIiA8PCBCQi0+Z2V0TmFtZSgpIDw8ICIgaW50byAiIAorICAgICAgICA8PCBTdWNjLT5nZXROYW1lKCkgPDwgIlxuIik7CisgIC8vIFNob3J0Y3V0LCBpZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHByZWRlY2Vzc29yIGl0IG11c3QgYmUgQkIgYW5kIG1lcmdpbmcKKyAgLy8gaXMgYWx3YXlzIHNhZmUKKyAgaWYgKFN1Y2MtPmdldFNpbmdsZVByZWRlY2Vzc29yKCkpIHJldHVybiB0cnVlOworCisgIC8vIE1ha2UgYSBsaXN0IG9mIHRoZSBwcmVkZWNlc3NvcnMgb2YgQkIKKyAgdHlwZWRlZiBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgMTY+IEJsb2NrU2V0OworICBCbG9ja1NldCBCQlByZWRzKHByZWRfYmVnaW4oQkIpLCBwcmVkX2VuZChCQikpOworCisgIC8vIFVzZSB0aGF0IGxpc3QgdG8gbWFrZSBhbm90aGVyIGxpc3Qgb2YgY29tbW9uIHByZWRlY2Vzc29ycyBvZiBCQiBhbmQgU3VjYworICBCbG9ja1NldCBDb21tb25QcmVkczsKKyAgZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihTdWNjKSwgUEUgPSBwcmVkX2VuZChTdWNjKTsKKyAgICAgICBQSSAhPSBQRTsgKytQSSkgeworICAgIEJhc2ljQmxvY2sgKlAgPSAqUEk7CisgICAgaWYgKEJCUHJlZHMuY291bnQoUCkpCisgICAgICBDb21tb25QcmVkcy5pbnNlcnQoUCk7CisgIH0KKworICAvLyBTaG9ydGN1dCwgaWYgdGhlcmUgYXJlIG5vIGNvbW1vbiBwcmVkZWNlc3NvcnMsIG1lcmdpbmcgaXMgYWx3YXlzIHNhZmUKKyAgaWYgKENvbW1vblByZWRzLmVtcHR5KCkpCisgICAgcmV0dXJuIHRydWU7CisgIAorICAvLyBMb29rIGF0IGFsbCB0aGUgcGhpIG5vZGVzIGluIFN1Y2MsIHRvIHNlZSBpZiB0aGV5IHByZXNlbnQgYSBjb25mbGljdCB3aGVuCisgIC8vIG1lcmdpbmcgdGhlc2UgYmxvY2tzCisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IFN1Y2MtPmJlZ2luKCk7IGlzYTxQSElOb2RlPihJKTsgKytJKSB7CisgICAgUEhJTm9kZSAqUE4gPSBjYXN0PFBISU5vZGU+KEkpOworCisgICAgLy8gSWYgdGhlIGluY29taW5nIHZhbHVlIGZyb20gQkIgaXMgYWdhaW4gYSBQSElOb2RlIGluCisgICAgLy8gQkIgd2hpY2ggaGFzIHRoZSBzYW1lIGluY29taW5nIHZhbHVlIGZvciAqUEkgYXMgUE4gZG9lcywgd2UgY2FuCisgICAgLy8gbWVyZ2UgdGhlIHBoaSBub2RlcyBhbmQgdGhlbiB0aGUgYmxvY2tzIGNhbiBzdGlsbCBiZSBtZXJnZWQKKyAgICBQSElOb2RlICpCQlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhCQikpOworICAgIGlmIChCQlBOICYmIEJCUE4tPmdldFBhcmVudCgpID09IEJCKSB7CisgICAgICBmb3IgKEJsb2NrU2V0OjppdGVyYXRvciBQSSA9IENvbW1vblByZWRzLmJlZ2luKCksIFBFID0gQ29tbW9uUHJlZHMuZW5kKCk7CisgICAgICAgICAgICBQSSAhPSBQRTsgUEkrKykgeworICAgICAgICBpZiAoQkJQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKCpQSSkgCisgICAgICAgICAgICAgICE9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soKlBJKSkgeworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQ2FuJ3QgZm9sZCwgcGhpIG5vZGUgIiA8PCBQTi0+Z2V0TmFtZSgpIDw8ICIgaW4gIiAKKyAgICAgICAgICAgICAgICA8PCBTdWNjLT5nZXROYW1lKCkgPDwgIiBpcyBjb25mbGljdGluZyB3aXRoICIgCisgICAgICAgICAgICAgICAgPDwgQkJQTi0+Z2V0TmFtZSgpIDw8ICIgd2l0aCByZWdhcmQgdG8gY29tbW9uIHByZWRlY2Vzc29yICIKKyAgICAgICAgICAgICAgICA8PCAoKlBJKS0+Z2V0TmFtZSgpIDw8ICJcbiIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBWYWx1ZSogVmFsID0gUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhCQik7CisgICAgICBmb3IgKEJsb2NrU2V0OjppdGVyYXRvciBQSSA9IENvbW1vblByZWRzLmJlZ2luKCksIFBFID0gQ29tbW9uUHJlZHMuZW5kKCk7CisgICAgICAgICAgICBQSSAhPSBQRTsgUEkrKykgeworICAgICAgICAvLyBTZWUgaWYgdGhlIGluY29taW5nIHZhbHVlIGZvciB0aGUgY29tbW9uIHByZWRlY2Vzc29yIGlzIGVxdWFsIHRvIHRoZQorICAgICAgICAvLyBvbmUgZm9yIEJCLCBpbiB3aGljaCBjYXNlIHRoaXMgcGhpIG5vZGUgd2lsbCBub3QgcHJldmVudCB0aGUgbWVyZ2luZworICAgICAgICAvLyBvZiB0aGUgYmxvY2suCisgICAgICAgIGlmIChWYWwgIT0gUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jaygqUEkpKSB7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJDYW4ndCBmb2xkLCBwaGkgbm9kZSAiIDw8IFBOLT5nZXROYW1lKCkgPDwgIiBpbiAiIAorICAgICAgICAgICAgICAgIDw8IFN1Y2MtPmdldE5hbWUoKSA8PCAiIGlzIGNvbmZsaWN0aW5nIHdpdGggcmVnYXJkIHRvIGNvbW1vbiAiCisgICAgICAgICAgICAgICAgPDwgInByZWRlY2Vzc29yICIgPDwgKCpQSSktPmdldE5hbWUoKSA8PCAiXG4iKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFRyeVRvU2ltcGxpZnlVbmNvbmRCcmFuY2hGcm9tRW1wdHlCbG9jayAtIEJCIGlzIGtub3duIHRvIGNvbnRhaW4gYW4KKy8vLyB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIGNvbnRhaW5zIG5vIGluc3RydWN0aW9ucyBvdGhlciB0aGFuIFBISSBub2RlcywKKy8vLyBwb3RlbnRpYWwgZGVidWcgaW50cmluc2ljcyBhbmQgdGhlIGJyYW5jaC4gIElmIHBvc3NpYmxlLCBlbGltaW5hdGUgQkIgYnkKKy8vLyByZXdyaXRpbmcgYWxsIHRoZSBwcmVkZWNlc3NvcnMgdG8gYnJhbmNoIHRvIHRoZSBzdWNjZXNzb3IgYmxvY2sgYW5kIHJldHVybgorLy8vIHRydWUuICBJZiB3ZSBjYW4ndCB0cmFuc2Zvcm0sIHJldHVybiBmYWxzZS4KK2Jvb2wgbGx2bTo6VHJ5VG9TaW1wbGlmeVVuY29uZEJyYW5jaEZyb21FbXB0eUJsb2NrKEJhc2ljQmxvY2sgKkJCKSB7CisgIC8vIFdlIGNhbid0IGVsaW1pbmF0ZSBpbmZpbml0ZSBsb29wcy4KKyAgQmFzaWNCbG9jayAqU3VjYyA9IGNhc3Q8QnJhbmNoSW5zdD4oQkItPmdldFRlcm1pbmF0b3IoKSktPmdldFN1Y2Nlc3NvcigwKTsKKyAgaWYgKEJCID09IFN1Y2MpIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIENoZWNrIHRvIHNlZSBpZiBtZXJnaW5nIHRoZXNlIGJsb2NrcyB3b3VsZCBjYXVzZSBjb25mbGljdHMgZm9yIGFueSBvZiB0aGUKKyAgLy8gcGhpIG5vZGVzIGluIEJCIG9yIFN1Y2MuIElmIG5vdCwgd2UgY2FuIHNhZmVseSBtZXJnZS4KKyAgaWYgKCFDYW5Qcm9wYWdhdGVQcmVkZWNlc3NvcnNGb3JQSElzKEJCLCBTdWNjKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSBTdWNjIGhhcyBtdWx0aXBsZSBwcmVkZWNlc3NvcnMgYW5kIGEgUEhJIG5vZGUgaW4gQkIKKyAgLy8gaGFzIHVzZXMgd2hpY2ggd2lsbCBub3QgZGlzYXBwZWFyIHdoZW4gdGhlIFBISSBub2RlcyBhcmUgbWVyZ2VkLiAgSXQgaXMKKyAgLy8gcG9zc2libGUgdG8gaGFuZGxlIHN1Y2ggY2FzZXMsIGJ1dCBkaWZmaWN1bHQ6IGl0IHJlcXVpcmVzIGNoZWNraW5nIHdoZXRoZXIKKyAgLy8gQkIgZG9taW5hdGVzIFN1Y2MsIHdoaWNoIGlzIG5vbi10cml2aWFsIHRvIGNhbGN1bGF0ZSBpbiB0aGUgY2FzZSB3aGVyZQorICAvLyBTdWNjIGhhcyBtdWx0aXBsZSBwcmVkZWNlc3NvcnMuICBBbHNvLCBpdCByZXF1aXJlcyBjaGVja2luZyB3aGV0aGVyCisgIC8vIGNvbnN0cnVjdGluZyB0aGUgbmVjZXNzYXJ5IHNlbGYtcmVmZXJlbnRpYWwgUEhJIG5vZGUgZG9lc24ndCBpbnRvZHVjZSBhbnkKKyAgLy8gY29uZmxpY3RzOyB0aGlzIGlzbid0IHRvbyBkaWZmaWN1bHQsIGJ1dCB0aGUgcHJldmlvdXMgY29kZSBmb3IgZG9pbmcgdGhpcworICAvLyB3YXMgaW5jb3JyZWN0LgorICAvLworICAvLyBOb3RlIHRoYXQgaWYgdGhpcyBjaGVjayBmaW5kcyBhIGxpdmUgdXNlLCBCQiBkb21pbmF0ZXMgU3VjYywgc28gQkIgaXMKKyAgLy8gc29tZXRoaW5nIGxpa2UgYSBsb29wIHByZS1oZWFkZXIgKG9yIHJhcmVseSwgYSBwYXJ0IG9mIGFuIGlycmVkdWNpYmxlIENGRyk7CisgIC8vIGZvbGRpbmcgdGhlIGJyYW5jaCBpc24ndCBwcm9maXRhYmxlIGluIHRoYXQgY2FzZSBhbnl3YXkuCisgIGlmICghU3VjYy0+Z2V0U2luZ2xlUHJlZGVjZXNzb3IoKSkgeworICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9IEJCLT5iZWdpbigpOworICAgIHdoaWxlIChpc2E8UEhJTm9kZT4oKkJCSSkpIHsKKyAgICAgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEJCSS0+dXNlX2JlZ2luKCksIEUgPSBCQkktPnVzZV9lbmQoKTsKKyAgICAgICAgICAgVUkgIT0gRTsgKytVSSkgeworICAgICAgICBpZiAoUEhJTm9kZSogUE4gPSBkeW5fY2FzdDxQSElOb2RlPigqVUkpKSB7CisgICAgICAgICAgaWYgKFBOLT5nZXRJbmNvbWluZ0Jsb2NrKFVJKSAhPSBCQikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICsrQkJJOworICAgIH0KKyAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiS2lsbGluZyBUcml2aWFsIEJCOiBcbiIgPDwgKkJCKTsKKyAgCisgIGlmIChpc2E8UEhJTm9kZT4oU3VjYy0+YmVnaW4oKSkpIHsKKyAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHByZWQgb2Ygc3VjYywgYW5kIHRoZXJlIGFyZSBQSEkgbm9kZXMgaW4KKyAgICAvLyB0aGUgc3VjY2Vzc29yLCB0aGVuIHdlIG5lZWQgdG8gYWRkIGluY29taW5nIGVkZ2VzIGZvciB0aGUgUEhJIG5vZGVzCisgICAgLy8KKyAgICBjb25zdCBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgMTY+IEJCUHJlZHMocHJlZF9iZWdpbihCQiksIHByZWRfZW5kKEJCKSk7CisgICAgCisgICAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgUEhJIG5vZGVzIGluIHRoZSBzdWNjZXNzb3Igb2YgQkIuCisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gU3VjYy0+YmVnaW4oKTsgaXNhPFBISU5vZGU+KEkpOyArK0kpIHsKKyAgICAgIFBISU5vZGUgKlBOID0gY2FzdDxQSElOb2RlPihJKTsKKyAgICAgIFZhbHVlICpPbGRWYWwgPSBQTi0+cmVtb3ZlSW5jb21pbmdWYWx1ZShCQiwgZmFsc2UpOworICAgICAgYXNzZXJ0KE9sZFZhbCAmJiAiTm8gZW50cnkgaW4gUEhJIGZvciBQcmVkIEJCISIpOworICAgICAgCisgICAgICAvLyBJZiB0aGlzIGluY29taW5nIHZhbHVlIGlzIG9uZSBvZiB0aGUgUEhJIG5vZGVzIGluIEJCLCB0aGUgbmV3IGVudHJpZXMKKyAgICAgIC8vIGluIHRoZSBQSEkgbm9kZSBhcmUgdGhlIGVudHJpZXMgZnJvbSB0aGUgb2xkIFBISS4KKyAgICAgIGlmIChpc2E8UEhJTm9kZT4oT2xkVmFsKSAmJiBjYXN0PFBISU5vZGU+KE9sZFZhbCktPmdldFBhcmVudCgpID09IEJCKSB7CisgICAgICAgIFBISU5vZGUgKk9sZFZhbFBOID0gY2FzdDxQSElOb2RlPihPbGRWYWwpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT2xkVmFsUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIC8vIE5vdGUgdGhhdCwgc2luY2Ugd2UgYXJlIG1lcmdpbmcgcGhpIG5vZGVzIGFuZCBCQiBhbmQgU3VjYyBtaWdodAorICAgICAgICAgIC8vIGhhdmUgY29tbW9uIHByZWRlY2Vzc29ycywgd2UgY291bGQgZW5kIHVwIHdpdGggYSBwaGkgbm9kZSB3aXRoCisgICAgICAgICAgLy8gaWRlbnRpY2FsIGluY29taW5nIGJyYW5jaGVzLiBUaGlzIHdpbGwgYmUgY2xlYW5lZCB1cCBsYXRlciAoYW5kCisgICAgICAgICAgLy8gd2lsbCB0cmlnZ2VyIGFzc2VydHMgaWYgd2UgdHJ5IHRvIGNsZWFuIGl0IHVwIG5vdywgd2l0aG91dCBhbHNvCisgICAgICAgICAgLy8gc2ltcGxpZnlpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uYWwgYnJhbmNoKS4KKyAgICAgICAgICBQTi0+YWRkSW5jb21pbmcoT2xkVmFsUE4tPmdldEluY29taW5nVmFsdWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZFZhbFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFkZCBhbiBpbmNvbWluZyB2YWx1ZSBmb3IgZWFjaCBvZiB0aGUgbmV3IGluY29taW5nIHZhbHVlcy4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEJCUHJlZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBQTi0+YWRkSW5jb21pbmcoT2xkVmFsLCBCQlByZWRzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHdoaWxlIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KCZCQi0+ZnJvbnQoKSkpIHsKKyAgICBpZiAoU3VjYy0+Z2V0U2luZ2xlUHJlZGVjZXNzb3IoKSkgeworICAgICAgLy8gQkIgaXMgdGhlIG9ubHkgcHJlZGVjZXNzb3Igb2YgU3VjYywgc28gU3VjYyB3aWxsIGVuZCB1cCB3aXRoIGV4YWN0bHkKKyAgICAgIC8vIHRoZSBzYW1lIHByZWRlY2Vzc29ycyBCQiBoYWQuCisgICAgICBTdWNjLT5nZXRJbnN0TGlzdCgpLnNwbGljZShTdWNjLT5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkItPmdldEluc3RMaXN0KCksIEJCLT5iZWdpbigpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgZXhwbGljaXRseSBjaGVjayBmb3Igc3VjaCB1c2VzIGluIENhblByb3BhZ2F0ZVByZWRlY2Vzc29yc0ZvclBISXMuCisgICAgICBhc3NlcnQoUE4tPnVzZV9lbXB0eSgpICYmICJUaGVyZSBzaG91bGRuJ3QgYmUgYW55IHVzZXMgaGVyZSEiKTsKKyAgICAgIFBOLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICB9CisgIH0KKyAgICAKKyAgLy8gRXZlcnl0aGluZyB0aGF0IGp1bXBlZCB0byBCQiBub3cgZ29lcyB0byBTdWNjLgorICBCQi0+cmVwbGFjZUFsbFVzZXNXaXRoKFN1Y2MpOworICBpZiAoIVN1Y2MtPmhhc05hbWUoKSkgU3VjYy0+dGFrZU5hbWUoQkIpOworICBCQi0+ZXJhc2VGcm9tUGFyZW50KCk7ICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIG9sZCBiYXNpYyBibG9jay4KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBFbGltaW5hdGVEdXBsaWNhdGVQSElOb2RlcyAtIENoZWNrIGZvciBhbmQgZWxpbWluYXRlIGR1cGxpY2F0ZSBQSEkKKy8vLyBub2RlcyBpbiB0aGlzIGJsb2NrLiBUaGlzIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlciBhYm91dCBQSEkgbm9kZXMKKy8vLyB3aGljaCBkaWZmZXIgb25seSBpbiB0aGUgb3JkZXIgb2YgdGhlIGluY29taW5nIHZhbHVlcywgYnV0IGluc3Rjb21iaW5lCisvLy8gb3JkZXJzIHRoZW0gc28gaXQgdXN1YWxseSB3b24ndCBtYXR0ZXIuCisvLy8KK2Jvb2wgbGx2bTo6RWxpbWluYXRlRHVwbGljYXRlUEhJTm9kZXMoQmFzaWNCbG9jayAqQkIpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGN1cnJlbnRseSBjb25zaWRlciB1bmRlZiBvcGVyYW5kcworICAvLyBzcGVjaWFsbHkuIFRoZXJvZXRpY2FsbHksIHR3byBwaGlzIHdoaWNoIGFyZSBpZGVudGljYWwgZXhjZXB0IGZvcgorICAvLyBvbmUgaGF2aW5nIGFuIHVuZGVmIHdoZXJlIHRoZSBvdGhlciBkb2Vzbid0IGNvdWxkIGJlIGNvbGxhcHNlZC4KKworICAvLyBNYXAgZnJvbSBQSEkgaGFzaCB2YWx1ZXMgdG8gUEhJIG5vZGVzLiBJZiBtdWx0aXBsZSBQSElzIGhhdmUKKyAgLy8gdGhlIHNhbWUgaGFzaCB2YWx1ZSwgdGhlIGVsZW1lbnQgaXMgdGhlIGZpcnN0IFBISSBpbiB0aGUKKyAgLy8gbGlua2VkIGxpc3QgaW4gQ29sbGlzaW9uTWFwLgorICBEZW5zZU1hcDx1aW50cHRyX3QsIFBISU5vZGUgKj4gSGFzaE1hcDsKKworICAvLyBNYWludGFpbiBsaW5rZWQgbGlzdHMgb2YgUEhJIG5vZGVzIHdpdGggY29tbW9uIGhhc2ggdmFsdWVzLgorICBEZW5zZU1hcDxQSElOb2RlICosIFBISU5vZGUgKj4gQ29sbGlzaW9uTWFwOworCisgIC8vIEV4YW1pbmUgZWFjaCBQSEkuCisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpOworICAgICAgIFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSSsrKTsgKSB7CisgICAgLy8gQ29tcHV0ZSBhIGhhc2ggdmFsdWUgb24gdGhlIG9wZXJhbmRzLiBJbnN0Y29tYmluZSB3aWxsIGxpa2VseSBoYXZlIHNvcnRlZAorICAgIC8vIHRoZW0sIHdoaWNoIGhlbHBzIGV4cG9zZSBkdXBsaWNhdGVzLCBidXQgd2UgaGF2ZSB0byBjaGVjayBhbGwgdGhlCisgICAgLy8gb3BlcmFuZHMgdG8gYmUgc2FmZSBpbiBjYXNlIGluc3Rjb21iaW5lIGhhc24ndCBydW4uCisgICAgdWludHB0cl90IEhhc2ggPSAwOworICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgSSA9IFBOLT5vcF9iZWdpbigpLCBFID0gUE4tPm9wX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgLy8gVGhpcyBoYXNoIGFsZ29yaXRobSBpcyBxdWl0ZSB3ZWFrIGFzIGhhc2ggZnVuY3Rpb25zIGdvLCBidXQgaXQgc2VlbXMKKyAgICAgIC8vIHRvIGRvIGEgZ29vZCBlbm91Z2ggam9iIGZvciB0aGlzIHBhcnRpY3VsYXIgcHVycG9zZSwgYW5kIGlzIHZlcnkgcXVpY2suCisgICAgICBIYXNoIF49IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihzdGF0aWNfY2FzdDxWYWx1ZSAqPigqSSkpOworICAgICAgSGFzaCA9IChIYXNoIDw8IDcpIHwgKEhhc2ggPj4gKHNpemVvZih1aW50cHRyX3QpICogQ0hBUl9CSVQgLSA3KSk7CisgICAgfQorICAgIC8vIElmIHdlJ3ZlIG5ldmVyIHNlZW4gdGhpcyBoYXNoIHZhbHVlIGJlZm9yZSwgaXQncyBhIHVuaXF1ZSBQSEkuCisgICAgc3RkOjpwYWlyPERlbnNlTWFwPHVpbnRwdHJfdCwgUEhJTm9kZSAqPjo6aXRlcmF0b3IsIGJvb2w+IFBhaXIgPQorICAgICAgSGFzaE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSGFzaCwgUE4pKTsKKyAgICBpZiAoUGFpci5zZWNvbmQpIGNvbnRpbnVlOworICAgIC8vIE90aGVyd2lzZSBpdCdzIGVpdGhlciBhIGR1cGxpY2F0ZSBvciBhIGhhc2ggY29sbGlzaW9uLgorICAgIGZvciAoUEhJTm9kZSAqT3RoZXJQTiA9IFBhaXIuZmlyc3QtPnNlY29uZDsgOyApIHsKKyAgICAgIGlmIChPdGhlclBOLT5pc0lkZW50aWNhbFRvKFBOKSkgeworICAgICAgICAvLyBBIGR1cGxpY2F0ZS4gUmVwbGFjZSB0aGlzIFBISSB3aXRoIGl0cyBkdXBsaWNhdGUuCisgICAgICAgIFBOLT5yZXBsYWNlQWxsVXNlc1dpdGgoT3RoZXJQTik7CisgICAgICAgIFBOLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gQSBub24tZHVwbGljYXRlIGhhc2ggY29sbGlzaW9uLgorICAgICAgRGVuc2VNYXA8UEhJTm9kZSAqLCBQSElOb2RlICo+OjppdGVyYXRvciBJID0gQ29sbGlzaW9uTWFwLmZpbmQoT3RoZXJQTik7CisgICAgICBpZiAoSSA9PSBDb2xsaXNpb25NYXAuZW5kKCkpIHsKKyAgICAgICAgLy8gU2V0IHRoaXMgUEhJIHRvIGJlIHRoZSBoZWFkIG9mIHRoZSBsaW5rZWQgbGlzdCBvZiBjb2xsaWRpbmcgUEhJcy4KKyAgICAgICAgUEhJTm9kZSAqT2xkID0gUGFpci5maXJzdC0+c2Vjb25kOworICAgICAgICBQYWlyLmZpcnN0LT5zZWNvbmQgPSBQTjsKKyAgICAgICAgQ29sbGlzaW9uTWFwW1BOXSA9IE9sZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBQcm9jZWRlIHRvIHRoZSBuZXh0IFBISSBpbiB0aGUgbGlzdC4KKyAgICAgIE90aGVyUE4gPSBJLT5zZWNvbmQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9Mb29wU2ltcGxpZnkuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFNpbXBsaWZ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Q3MTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFNpbXBsaWZ5LmNwcApAQCAtMCwwICsxLDc0OSBAQAorLy89PT0tIExvb3BTaW1wbGlmeS5jcHAgLSBMb29wIENhbm9uaWNhbGl6YXRpb24gUGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgcGVyZm9ybXMgc2V2ZXJhbCB0cmFuc2Zvcm1hdGlvbnMgdG8gdHJhbnNmb3JtIG5hdHVyYWwgbG9vcHMgaW50byBhCisvLyBzaW1wbGVyIGZvcm0sIHdoaWNoIG1ha2VzIHN1YnNlcXVlbnQgYW5hbHlzZXMgYW5kIHRyYW5zZm9ybWF0aW9ucyBzaW1wbGVyIGFuZAorLy8gbW9yZSBlZmZlY3RpdmUuCisvLworLy8gTG9vcCBwcmUtaGVhZGVyIGluc2VydGlvbiBndWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUsIG5vbi1jcml0aWNhbAorLy8gZW50cnkgZWRnZSBmcm9tIG91dHNpZGUgb2YgdGhlIGxvb3AgdG8gdGhlIGxvb3AgaGVhZGVyLiAgVGhpcyBzaW1wbGlmaWVzIGEKKy8vIG51bWJlciBvZiBhbmFseXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLCBzdWNoIGFzIExJQ00uCisvLworLy8gTG9vcCBleGl0LWJsb2NrIGluc2VydGlvbiBndWFyYW50ZWVzIHRoYXQgYWxsIGV4aXQgYmxvY2tzIGZyb20gdGhlIGxvb3AKKy8vIChibG9ja3Mgd2hpY2ggYXJlIG91dHNpZGUgb2YgdGhlIGxvb3AgdGhhdCBoYXZlIHByZWRlY2Vzc29ycyBpbnNpZGUgb2YgdGhlCisvLyBsb29wKSBvbmx5IGhhdmUgcHJlZGVjZXNzb3JzIGZyb20gaW5zaWRlIG9mIHRoZSBsb29wIChhbmQgYXJlIHRodXMgZG9taW5hdGVkCisvLyBieSB0aGUgbG9vcCBoZWFkZXIpLiAgVGhpcyBzaW1wbGlmaWVzIHRyYW5zZm9ybWF0aW9ucyBzdWNoIGFzIHN0b3JlLXNpbmtpbmcKKy8vIHRoYXQgYXJlIGJ1aWx0IGludG8gTElDTS4KKy8vCisvLyBUaGlzIHBhc3MgYWxzbyBndWFyYW50ZWVzIHRoYXQgbG9vcHMgd2lsbCBoYXZlIGV4YWN0bHkgb25lIGJhY2tlZGdlLgorLy8KKy8vIEluZGlyZWN0YnIgaW5zdHJ1Y3Rpb25zIGludHJvZHVjZSBzZXZlcmFsIGNvbXBsaWNhdGlvbnMuIElmIHRoZSBsb29wCisvLyBjb250YWlucyBvciBpcyBlbnRlcmVkIGJ5IGFuIGluZGlyZWN0YnIgaW5zdHJ1Y3Rpb24sIGl0IG1heSBub3QgYmUgcG9zc2libGUKKy8vIHRvIHRyYW5zZm9ybSB0aGUgbG9vcCBhbmQgbWFrZSB0aGVzZSBndWFyYW50ZWVzLiBDbGllbnQgY29kZSBzaG91bGQgY2hlY2sKKy8vIHRoYXQgdGhlc2UgY29uZGl0aW9ucyBhcmUgdHJ1ZSBiZWZvcmUgcmVseWluZyBvbiB0aGVtLgorLy8KKy8vIE5vdGUgdGhhdCB0aGUgc2ltcGxpZnljZmcgcGFzcyB3aWxsIGNsZWFuIHVwIGJsb2NrcyB3aGljaCBhcmUgc3BsaXQgb3V0IGJ1dAorLy8gZW5kIHVwIGJlaW5nIHVubmVjZXNzYXJ5LCBzbyB1c2FnZSBvZiB0aGlzIHBhc3Mgc2hvdWxkIG5vdCBwZXNzaW1pemUKKy8vIGdlbmVyYXRlZCBjb2RlLgorLy8KKy8vIFRoaXMgcGFzcyBvYnZpb3VzbHkgbW9kaWZpZXMgdGhlIENGRywgYnV0IHVwZGF0ZXMgbG9vcCBpbmZvcm1hdGlvbiBhbmQKKy8vIGRvbWluYXRvciBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImxvb3BzaW1wbGlmeSIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Jhc2ljQmxvY2tVdGlscy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRPcGVyYXRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworU1RBVElTVElDKE51bUluc2VydGVkLCAiTnVtYmVyIG9mIHByZS1oZWFkZXIgb3IgZXhpdCBibG9ja3MgaW5zZXJ0ZWQiKTsKK1NUQVRJU1RJQyhOdW1OZXN0ZWQgICwgIk51bWJlciBvZiBuZXN0ZWQgbG9vcHMgc3BsaXQgb3V0Iik7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBMb29wU2ltcGxpZnkgOiBwdWJsaWMgTG9vcFBhc3MgeworICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgTG9vcFNpbXBsaWZ5KCkgOiBMb29wUGFzcyhJRCkge30KKworICAgIC8vIEFBIC0gSWYgd2UgaGF2ZSBhbiBhbGlhcyBhbmFseXNpcyBvYmplY3QgdG8gdXBkYXRlLCB0aGlzIGlzIGl0LCBvdGhlcndpc2UKKyAgICAvLyB0aGlzIGlzIG51bGwuCisgICAgQWxpYXNBbmFseXNpcyAqQUE7CisgICAgTG9vcEluZm8gKkxJOworICAgIERvbWluYXRvclRyZWUgKkRUOworICAgIExvb3AgKkw7CisgICAgdmlydHVhbCBib29sIHJ1bk9uTG9vcChMb29wICpMLCBMUFBhc3NNYW5hZ2VyICZMUE0pOworCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG5lZWQgbG9vcCBpbmZvcm1hdGlvbiB0byBpZGVudGlmeSB0aGUgbG9vcHMuLi4KKyAgICAgIEFVLmFkZFJlcXVpcmVkPERvbWluYXRvclRyZWU+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8RG9taW5hdG9yVHJlZT4oKTsKKworICAgICAgQVUuYWRkUmVxdWlyZWQ8TG9vcEluZm8+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQ8TG9vcEluZm8+KCk7CisKKyAgICAgIEFVLmFkZFByZXNlcnZlZDxBbGlhc0FuYWx5c2lzPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkPFNjYWxhckV2b2x1dGlvbj4oKTsKKyAgICAgIEFVLmFkZFByZXNlcnZlZElEKEJyZWFrQ3JpdGljYWxFZGdlc0lEKTsgIC8vIE5vIGNyaXRpY2FsIGVkZ2VzIGFkZGVkLgorICAgICAgQVUuYWRkUHJlc2VydmVkPERvbWluYW5jZUZyb250aWVyPigpOworICAgICAgQVUuYWRkUHJlc2VydmVkSUQoTENTU0FJRCk7CisgICAgfQorCisgICAgLy8vIHZlcmlmeUFuYWx5c2lzKCkgLSBWZXJpZnkgTG9vcFNpbXBsaWZ5Rm9ybSdzIGd1YXJhbnRlZXMuCisgICAgdm9pZCB2ZXJpZnlBbmFseXNpcygpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgYm9vbCBQcm9jZXNzTG9vcChMb29wICpMLCBMUFBhc3NNYW5hZ2VyICZMUE0pOworICAgIEJhc2ljQmxvY2sgKlJld3JpdGVMb29wRXhpdEJsb2NrKExvb3AgKkwsIEJhc2ljQmxvY2sgKkV4aXQpOworICAgIEJhc2ljQmxvY2sgKkluc2VydFByZWhlYWRlckZvckxvb3AoTG9vcCAqTCk7CisgICAgTG9vcCAqU2VwYXJhdGVOZXN0ZWRMb29wKExvb3AgKkwsIExQUGFzc01hbmFnZXIgJkxQTSk7CisgICAgQmFzaWNCbG9jayAqSW5zZXJ0VW5pcXVlQmFja2VkZ2VCbG9jayhMb29wICpMLCBCYXNpY0Jsb2NrICpQcmVoZWFkZXIpOworICAgIHZvaWQgUGxhY2VTcGxpdEJsb2NrQ2FyZWZ1bGx5KEJhc2ljQmxvY2sgKk5ld0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrKj4gJlNwbGl0UHJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcCAqTCk7CisgIH07Cit9CisKK2NoYXIgTG9vcFNpbXBsaWZ5OjpJRCA9IDA7CitzdGF0aWMgUmVnaXN0ZXJQYXNzPExvb3BTaW1wbGlmeT4KK1goImxvb3BzaW1wbGlmeSIsICJDYW5vbmljYWxpemUgbmF0dXJhbCBsb29wcyIsIHRydWUpOworCisvLyBQdWJsaWNhbGx5IGV4cG9zZWQgaW50ZXJmYWNlIHRvIHBhc3MuLi4KK2NoYXIgJmxsdm06Okxvb3BTaW1wbGlmeUlEID0gTG9vcFNpbXBsaWZ5OjpJRDsKK1Bhc3MgKmxsdm06OmNyZWF0ZUxvb3BTaW1wbGlmeVBhc3MoKSB7IHJldHVybiBuZXcgTG9vcFNpbXBsaWZ5KCk7IH0KKworLy8vIHJ1bk9uTG9vcCAtIFJ1biBkb3duIGFsbCBsb29wcyBpbiB0aGUgQ0ZHIChyZWN1cnNpdmVseSwgYnV0IHdlIGNvdWxkIGRvCisvLy8gaXQgaW4gYW55IGNvbnZlbmllbnQgb3JkZXIpIGluc2VydGluZyBwcmVoZWFkZXJzLi4uCisvLy8KK2Jvb2wgTG9vcFNpbXBsaWZ5OjpydW5Pbkxvb3AoTG9vcCAqbCwgTFBQYXNzTWFuYWdlciAmTFBNKSB7CisgIEwgPSBsOworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgTEkgPSAmZ2V0QW5hbHlzaXM8TG9vcEluZm8+KCk7CisgIEFBID0gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxBbGlhc0FuYWx5c2lzPigpOworICBEVCA9ICZnZXRBbmFseXNpczxEb21pbmF0b3JUcmVlPigpOworCisgIENoYW5nZWQgfD0gUHJvY2Vzc0xvb3AoTCwgTFBNKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIFByb2Nlc3NMb29wIC0gV2FsayB0aGUgbG9vcCBzdHJ1Y3R1cmUgaW4gZGVwdGggZmlyc3Qgb3JkZXIsIGVuc3VyaW5nIHRoYXQKKy8vLyBhbGwgbG9vcHMgaGF2ZSBwcmVoZWFkZXJzLgorLy8vCitib29sIExvb3BTaW1wbGlmeTo6UHJvY2Vzc0xvb3AoTG9vcCAqTCwgTFBQYXNzTWFuYWdlciAmTFBNKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworUmVwcm9jZXNzTG9vcDoKKworICAvLyBDaGVjayB0byBzZWUgdGhhdCBubyBibG9ja3MgKG90aGVyIHRoYW4gdGhlIGhlYWRlcikgaW4gdGhpcyBsb29wIGhhdmUKKyAgLy8gcHJlZGVjZXNzb3JzIHRoYXQgYXJlIG5vdCBpbiB0aGUgbG9vcC4gIFRoaXMgaXMgbm90IHZhbGlkIGZvciBuYXR1cmFsCisgIC8vIGxvb3BzLCBidXQgY2FuIG9jY3VyIGlmIHRoZSBibG9ja3MgYXJlIHVucmVhY2hhYmxlLiAgU2luY2UgdGhleSBhcmUKKyAgLy8gdW5yZWFjaGFibGUgd2UgY2FuIGp1c3Qgc2hhbWVsZXNzbHkgZGVsZXRlIHRob3NlIENGRyBlZGdlcyEKKyAgZm9yIChMb29wOjpibG9ja19pdGVyYXRvciBCQiA9IEwtPmJsb2NrX2JlZ2luKCksIEUgPSBMLT5ibG9ja19lbmQoKTsKKyAgICAgICBCQiAhPSBFOyArK0JCKSB7CisgICAgaWYgKCpCQiA9PSBMLT5nZXRIZWFkZXIoKSkgY29udGludWU7CisKKyAgICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgND4gQmFkUHJlZHM7CisgICAgZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbigqQkIpLAorICAgICAgICAgUEUgPSBwcmVkX2VuZCgqQkIpOyBQSSAhPSBQRTsgKytQSSkgeworICAgICAgQmFzaWNCbG9jayAqUCA9ICpQSTsKKyAgICAgIGlmICghTC0+Y29udGFpbnMoUCkpCisgICAgICAgIEJhZFByZWRzLmluc2VydChQKTsKKyAgICB9CisKKyAgICAvLyBEZWxldGUgZWFjaCB1bmlxdWUgb3V0LW9mLWxvb3AgKGFuZCB0aHVzIGRlYWQpIHByZWRlY2Vzc29yLgorICAgIGZvciAoU21hbGxQdHJTZXQ8QmFzaWNCbG9jayosIDQ+OjppdGVyYXRvciBJID0gQmFkUHJlZHMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBCYWRQcmVkcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKworICAgICAgREVCVUcoZGJncygpIDw8ICJMb29wU2ltcGxpZnk6IERlbGV0aW5nIGVkZ2UgZnJvbSBkZWFkIHByZWRlY2Vzc29yICI7CisgICAgICAgICAgICBXcml0ZUFzT3BlcmFuZChkYmdzKCksICpJLCBmYWxzZSk7CisgICAgICAgICAgICBkYmdzKCkgPDwgIlxuIik7CisKKyAgICAgIC8vIEluZm9ybSBlYWNoIHN1Y2Nlc3NvciBvZiBlYWNoIGRlYWQgcHJlZC4KKyAgICAgIGZvciAoc3VjY19pdGVyYXRvciBTSSA9IHN1Y2NfYmVnaW4oKkkpLCBTRSA9IHN1Y2NfZW5kKCpJKTsgU0kgIT0gU0U7ICsrU0kpCisgICAgICAgICgqU0kpLT5yZW1vdmVQcmVkZWNlc3NvcigqSSk7CisgICAgICAvLyBaYXAgdGhlIGRlYWQgcHJlZCdzIHRlcm1pbmF0b3IgYW5kIHJlcGxhY2UgaXQgd2l0aCB1bnJlYWNoYWJsZS4KKyAgICAgIFRlcm1pbmF0b3JJbnN0ICpUSSA9ICgqSSktPmdldFRlcm1pbmF0b3IoKTsKKyAgICAgICBUSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChUSS0+Z2V0VHlwZSgpKSk7CisgICAgICAoKkkpLT5nZXRUZXJtaW5hdG9yKCktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgbmV3IFVucmVhY2hhYmxlSW5zdCgoKkkpLT5nZXRDb250ZXh0KCksICpJKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZXJlIGFyZSBleGl0aW5nIGJsb2NrcyB3aXRoIGJyYW5jaGVzIG9uIHVuZGVmLCByZXNvbHZlIHRoZSB1bmRlZiBpbgorICAvLyB0aGUgZGlyZWN0aW9uIHdoaWNoIHdpbGwgZXhpdCB0aGUgbG9vcC4gVGhpcyB3aWxsIGhlbHAgc2ltcGxpZnkgbG9vcAorICAvLyB0cmlwIGNvdW50IGNvbXB1dGF0aW9ucy4KKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDg+IEV4aXRpbmdCbG9ja3M7CisgIEwtPmdldEV4aXRpbmdCbG9ja3MoRXhpdGluZ0Jsb2Nrcyk7CisgIGZvciAoU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sgKj46Oml0ZXJhdG9yIEkgPSBFeGl0aW5nQmxvY2tzLmJlZ2luKCksCisgICAgICAgRSA9IEV4aXRpbmdCbG9ja3MuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChCcmFuY2hJbnN0ICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KCgqSSktPmdldFRlcm1pbmF0b3IoKSkpCisgICAgICBpZiAoQkktPmlzQ29uZGl0aW9uYWwoKSkgeworICAgICAgICBpZiAoVW5kZWZWYWx1ZSAqQ29uZCA9IGR5bl9jYXN0PFVuZGVmVmFsdWU+KEJJLT5nZXRDb25kaXRpb24oKSkpIHsKKworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiTG9vcFNpbXBsaWZ5OiBSZXNvbHZpbmcgXCJiciBpMSB1bmRlZlwiIHRvIGV4aXQgaW4gIjsKKyAgICAgICAgICAgICAgICBXcml0ZUFzT3BlcmFuZChkYmdzKCksICpJLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgZGJncygpIDw8ICJcbiIpOworCisgICAgICAgICAgQkktPnNldENvbmRpdGlvbihDb25zdGFudEludDo6Z2V0KENvbmQtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUwtPmNvbnRhaW5zKEJJLT5nZXRTdWNjZXNzb3IoMCkpKSk7CisgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAvLyBEb2VzIHRoZSBsb29wIGFscmVhZHkgaGF2ZSBhIHByZWhlYWRlcj8gIElmIHNvLCBkb24ndCBpbnNlcnQgb25lLgorICBCYXNpY0Jsb2NrICpQcmVoZWFkZXIgPSBMLT5nZXRMb29wUHJlaGVhZGVyKCk7CisgIGlmICghUHJlaGVhZGVyKSB7CisgICAgUHJlaGVhZGVyID0gSW5zZXJ0UHJlaGVhZGVyRm9yTG9vcChMKTsKKyAgICBpZiAoUHJlaGVhZGVyKSB7CisgICAgICArK051bUluc2VydGVkOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8gTmV4dCwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIGV4aXQgbm9kZXMgb2YgdGhlIGxvb3Agb25seSBoYXZlCisgIC8vIHByZWRlY2Vzc29ycyB0aGF0IGFyZSBpbnNpZGUgb2YgdGhlIGxvb3AuICBUaGlzIGNoZWNrIGd1YXJhbnRlZXMgdGhhdCB0aGUKKyAgLy8gbG9vcCBwcmVoZWFkZXIvaGVhZGVyIHdpbGwgZG9taW5hdGUgdGhlIGV4aXQgYmxvY2tzLiAgSWYgdGhlIGV4aXQgYmxvY2sgaGFzCisgIC8vIHByZWRlY2Vzc29ycyBmcm9tIG91dHNpZGUgb2YgdGhlIGxvb3AsIHNwbGl0IHRoZSBlZGdlIG5vdy4KKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDg+IEV4aXRCbG9ja3M7CisgIEwtPmdldEV4aXRCbG9ja3MoRXhpdEJsb2Nrcyk7CisgICAgCisgIFNtYWxsU2V0VmVjdG9yPEJhc2ljQmxvY2sgKiwgOD4gRXhpdEJsb2NrU2V0KEV4aXRCbG9ja3MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpdEJsb2Nrcy5lbmQoKSk7CisgIGZvciAoU21hbGxTZXRWZWN0b3I8QmFzaWNCbG9jayAqLCA4Pjo6aXRlcmF0b3IgSSA9IEV4aXRCbG9ja1NldC5iZWdpbigpLAorICAgICAgICAgRSA9IEV4aXRCbG9ja1NldC5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBCYXNpY0Jsb2NrICpFeGl0QmxvY2sgPSAqSTsKKyAgICBmb3IgKHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEV4aXRCbG9jayksIFBFID0gcHJlZF9lbmQoRXhpdEJsb2NrKTsKKyAgICAgICAgIFBJICE9IFBFOyArK1BJKQorICAgICAgLy8gTXVzdCBiZSBleGFjdGx5IHRoaXMgbG9vcDogbm8gc3VibG9vcHMsIHBhcmVudCBsb29wcywgb3Igbm9uLWxvb3AgcHJlZHMKKyAgICAgIC8vIGFsbG93ZWQuCisgICAgICBpZiAoIUwtPmNvbnRhaW5zKCpQSSkpIHsKKyAgICAgICAgaWYgKFJld3JpdGVMb29wRXhpdEJsb2NrKEwsIEV4aXRCbG9jaykpIHsKKyAgICAgICAgICArK051bUluc2VydGVkOworICAgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGhlYWRlciBoYXMgbW9yZSB0aGFuIHR3byBwcmVkZWNlc3NvcnMgYXQgdGhpcyBwb2ludCAoZnJvbSB0aGUKKyAgLy8gcHJlaGVhZGVyIGFuZCBmcm9tIG11bHRpcGxlIGJhY2tlZGdlcyksIHdlIG11c3QgYWRqdXN0IHRoZSBsb29wLgorICBCYXNpY0Jsb2NrICpMb29wTGF0Y2ggPSBMLT5nZXRMb29wTGF0Y2goKTsKKyAgaWYgKCFMb29wTGF0Y2gpIHsKKyAgICAvLyBJZiB0aGlzIGlzIHJlYWxseSBhIG5lc3RlZCBsb29wLCByaXAgaXQgb3V0IGludG8gYSBjaGlsZCBsb29wLiAgRG9uJ3QgZG8KKyAgICAvLyB0aGlzIGZvciBsb29wcyB3aXRoIGEgZ2lhbnQgbnVtYmVyIG9mIGJhY2tlZGdlcywganVzdCBmYWN0b3IgdGhlbSBpbnRvIGEKKyAgICAvLyBjb21tb24gYmFja2VkZ2UgaW5zdGVhZC4KKyAgICBpZiAoTC0+Z2V0TnVtQmFja0VkZ2VzKCkgPCA4KSB7CisgICAgICBpZiAoU2VwYXJhdGVOZXN0ZWRMb29wKEwsIExQTSkpIHsKKyAgICAgICAgKytOdW1OZXN0ZWQ7CisgICAgICAgIC8vIFRoaXMgaXMgYSBiaWcgcmVzdHJ1Y3R1cmluZyBjaGFuZ2UsIHJlcHJvY2VzcyB0aGUgd2hvbGUgbG9vcC4KKyAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIC8vIEdDQyBkb2Vzbid0IHRhaWwgcmVjdXJzaW9uIGVsaW1pbmF0ZSB0aGlzLgorICAgICAgICBnb3RvIFJlcHJvY2Vzc0xvb3A7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgd2UgZWl0aGVyIGNvdWxkbid0LCBvciBkaWRuJ3Qgd2FudCB0bywgaWRlbnRpZnkgbmVzdGluZyBvZiB0aGUgbG9vcHMsCisgICAgLy8gaW5zZXJ0IGEgbmV3IGJsb2NrIHRoYXQgYWxsIGJhY2tlZGdlcyB0YXJnZXQsIHRoZW4gbWFrZSBpdCBqdW1wIHRvIHRoZQorICAgIC8vIGxvb3AgaGVhZGVyLgorICAgIExvb3BMYXRjaCA9IEluc2VydFVuaXF1ZUJhY2tlZGdlQmxvY2soTCwgUHJlaGVhZGVyKTsKKyAgICBpZiAoTG9vcExhdGNoKSB7CisgICAgICArK051bUluc2VydGVkOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8gU2NhbiBvdmVyIHRoZSBQSEkgbm9kZXMgaW4gdGhlIGxvb3AgaGVhZGVyLiAgU2luY2UgdGhleSBub3cgaGF2ZSBvbmx5IHR3bworICAvLyBpbmNvbWluZyB2YWx1ZXMgKHRoZSBsb29wIGlzIGNhbm9uaWNhbGl6ZWQpLCB3ZSBtYXkgaGF2ZSBzaW1wbGlmaWVkIHRoZSBQSEkKKyAgLy8gZG93biB0byAnWCA9IHBoaSBbWCwgWV0nLCB3aGljaCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCAnWScuCisgIFBISU5vZGUgKlBOOworICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBMLT5nZXRIZWFkZXIoKS0+YmVnaW4oKTsKKyAgICAgICAoUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJKyspKTsgKQorICAgIGlmIChWYWx1ZSAqViA9IFBOLT5oYXNDb25zdGFudFZhbHVlKERUKSkgeworICAgICAgaWYgKEFBKSBBQS0+ZGVsZXRlVmFsdWUoUE4pOworICAgICAgUE4tPnJlcGxhY2VBbGxVc2VzV2l0aChWKTsKKyAgICAgIFBOLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICB9CisKKyAgLy8gSWYgdGhpcyBsb29wIGhhcyBtdWx0aXBsZSBleGl0cyBhbmQgdGhlIGV4aXRzIGFsbCBnbyB0byB0aGUgc2FtZQorICAvLyBibG9jaywgYXR0ZW1wdCB0byBtZXJnZSB0aGUgZXhpdHMuIFRoaXMgaGVscHMgc2V2ZXJhbCBwYXNzZXMsIHN1Y2gKKyAgLy8gYXMgTG9vcFJvdGF0aW9uLCB3aGljaCBkbyBub3Qgc3VwcG9ydCBsb29wcyB3aXRoIG11bHRpcGxlIGV4aXRzLgorICAvLyBTaW1wbGlmeUNGRyBhbHNvIGRvZXMgdGhpcyAoYW5kIHRoaXMgY29kZSB1c2VzIHRoZSBzYW1lIHV0aWxpdHkKKyAgLy8gZnVuY3Rpb24pLCBob3dldmVyIHRoaXMgY29kZSBpcyBsb29wLWF3YXJlLCB3aGVyZSBTaW1wbGlmeUNGRyBpcworICAvLyBub3QuIFRoYXQgZ2l2ZXMgaXQgdGhlIGFkdmFudGFnZSBvZiBiZWluZyBhYmxlIHRvIGhvaXN0CisgIC8vIGxvb3AtaW52YXJpYW50IGluc3RydWN0aW9ucyBvdXQgb2YgdGhlIHdheSB0byBvcGVuIHVwIG1vcmUKKyAgLy8gb3Bwb3J0dW5pdGllcywgYW5kIHRoZSBkaXNhZHZhbnRhZ2Ugb2YgaGF2aW5nIHRoZSByZXNwb25zaWJpbGl0eQorICAvLyB0byBwcmVzZXJ2ZSBkb21pbmF0b3IgaW5mb3JtYXRpb24uCisgIGJvb2wgVW5pcXVlRXhpdCA9IHRydWU7CisgIGlmICghRXhpdEJsb2Nrcy5lbXB0eSgpKQorICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBFeGl0QmxvY2tzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoRXhpdEJsb2Nrc1tpXSAhPSBFeGl0QmxvY2tzWzBdKSB7CisgICAgICAgIFVuaXF1ZUV4aXQgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgIGlmIChVbmlxdWVFeGl0KSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEV4aXRpbmdCbG9ja3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgQmFzaWNCbG9jayAqRXhpdGluZ0Jsb2NrID0gRXhpdGluZ0Jsb2Nrc1tpXTsKKyAgICAgIGlmICghRXhpdGluZ0Jsb2NrLT5nZXRTaW5nbGVQcmVkZWNlc3NvcigpKSBjb250aW51ZTsKKyAgICAgIEJyYW5jaEluc3QgKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oRXhpdGluZ0Jsb2NrLT5nZXRUZXJtaW5hdG9yKCkpOworICAgICAgaWYgKCFCSSB8fCAhQkktPmlzQ29uZGl0aW9uYWwoKSkgY29udGludWU7CisgICAgICBDbXBJbnN0ICpDSSA9IGR5bl9jYXN0PENtcEluc3Q+KEJJLT5nZXRDb25kaXRpb24oKSk7CisgICAgICBpZiAoIUNJIHx8IENJLT5nZXRQYXJlbnQoKSAhPSBFeGl0aW5nQmxvY2spIGNvbnRpbnVlOworCisgICAgICAvLyBBdHRlbXB0IHRvIGhvaXN0IG91dCBhbGwgaW5zdHJ1Y3Rpb25zIGV4Y2VwdCBmb3IgdGhlCisgICAgICAvLyBjb21wYXJpc29uIGFuZCB0aGUgYnJhbmNoLgorICAgICAgYm9vbCBBbGxJbnZhcmlhbnQgPSB0cnVlOworICAgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gRXhpdGluZ0Jsb2NrLT5iZWdpbigpOyAmKkkgIT0gQkk7ICkgeworICAgICAgICBJbnN0cnVjdGlvbiAqSW5zdCA9IEkrKzsKKyAgICAgICAgLy8gU2tpcCBkZWJ1ZyBpbmZvIGludHJpbnNpY3MuCisgICAgICAgIGlmIChJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoSW5zdCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChJbnN0ID09IENJKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIUwtPm1ha2VMb29wSW52YXJpYW50KEluc3QsIENoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlaGVhZGVyID8gUHJlaGVhZGVyLT5nZXRUZXJtaW5hdG9yKCkgOiAwKSkgeworICAgICAgICAgIEFsbEludmFyaWFudCA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIUFsbEludmFyaWFudCkgY29udGludWU7CisKKyAgICAgIC8vIFRoZSBibG9jayBoYXMgbm93IGJlZW4gY2xlYXJlZCBvZiBhbGwgaW5zdHJ1Y3Rpb25zIGV4Y2VwdCBmb3IKKyAgICAgIC8vIGEgY29tcGFyaXNvbiBhbmQgYSBjb25kaXRpb25hbCBicmFuY2guIFNpbXBsaWZ5Q0ZHIG1heSBiZSBhYmxlCisgICAgICAvLyB0byBmb2xkIGl0IG5vdy4KKyAgICAgIGlmICghRm9sZEJyYW5jaFRvQ29tbW9uRGVzdChCSSkpIGNvbnRpbnVlOworCisgICAgICAvLyBTdWNjZXNzLiBUaGUgYmxvY2sgaXMgbm93IGRlYWQsIHNvIHJlbW92ZSBpdCBmcm9tIHRoZSBsb29wLAorICAgICAgLy8gdXBkYXRlIHRoZSBkb21pbmF0b3IgdHJlZSBhbmQgZG9taW5hbmNlIGZyb250aWVyLCBhbmQgZGVsZXRlIGl0LgorCisgICAgICBERUJVRyhkYmdzKCkgPDwgIkxvb3BTaW1wbGlmeTogRWxpbWluYXRpbmcgZXhpdGluZyBibG9jayAiOworICAgICAgICAgICAgV3JpdGVBc09wZXJhbmQoZGJncygpLCBFeGl0aW5nQmxvY2ssIGZhbHNlKTsKKyAgICAgICAgICAgIGRiZ3MoKSA8PCAiXG4iKTsKKworICAgICAgYXNzZXJ0KHByZWRfYmVnaW4oRXhpdGluZ0Jsb2NrKSA9PSBwcmVkX2VuZChFeGl0aW5nQmxvY2spKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgTEktPnJlbW92ZUJsb2NrKEV4aXRpbmdCbG9jayk7CisKKyAgICAgIERvbWluYW5jZUZyb250aWVyICpERiA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8RG9taW5hbmNlRnJvbnRpZXI+KCk7CisgICAgICBEb21UcmVlTm9kZSAqTm9kZSA9IERULT5nZXROb2RlKEV4aXRpbmdCbG9jayk7CisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxEb21UcmVlTm9kZUJhc2U8QmFzaWNCbG9jaz4gKj4gJkNoaWxkcmVuID0KKyAgICAgICAgTm9kZS0+Z2V0Q2hpbGRyZW4oKTsKKyAgICAgIHdoaWxlICghQ2hpbGRyZW4uZW1wdHkoKSkgeworICAgICAgICBEb21UcmVlTm9kZSAqQ2hpbGQgPSBDaGlsZHJlbi5mcm9udCgpOworICAgICAgICBEVC0+Y2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKENoaWxkLCBOb2RlLT5nZXRJRG9tKCkpOworICAgICAgICBpZiAoREYpIERGLT5jaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoQ2hpbGQtPmdldEJsb2NrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLT5nZXRJRG9tKCktPmdldEJsb2NrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVCk7CisgICAgICB9CisgICAgICBEVC0+ZXJhc2VOb2RlKEV4aXRpbmdCbG9jayk7CisgICAgICBpZiAoREYpIERGLT5yZW1vdmVCbG9jayhFeGl0aW5nQmxvY2spOworCisgICAgICBCSS0+Z2V0U3VjY2Vzc29yKDApLT5yZW1vdmVQcmVkZWNlc3NvcihFeGl0aW5nQmxvY2spOworICAgICAgQkktPmdldFN1Y2Nlc3NvcigxKS0+cmVtb3ZlUHJlZGVjZXNzb3IoRXhpdGluZ0Jsb2NrKTsKKyAgICAgIEV4aXRpbmdCbG9jay0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBJbnNlcnRQcmVoZWFkZXJGb3JMb29wIC0gT25jZSB3ZSBkaXNjb3ZlciB0aGF0IGEgbG9vcCBkb2Vzbid0IGhhdmUgYQorLy8vIHByZWhlYWRlciwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGluc2VydCBvbmUuICBUaGlzIG1ldGhvZCBoYXMgdHdvIHBoYXNlczoKKy8vLyBwcmVoZWFkZXIgaW5zZXJ0aW9uIGFuZCBhbmFseXNpcyB1cGRhdGluZy4KKy8vLworQmFzaWNCbG9jayAqTG9vcFNpbXBsaWZ5OjpJbnNlcnRQcmVoZWFkZXJGb3JMb29wKExvb3AgKkwpIHsKKyAgQmFzaWNCbG9jayAqSGVhZGVyID0gTC0+Z2V0SGVhZGVyKCk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgc2V0IG9mIHByZWRlY2Vzc29ycyBvZiB0aGUgbG9vcCB0aGF0IGFyZSBub3QgaW4gdGhlIGxvb3AuCisgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCA4PiBPdXRzaWRlQmxvY2tzOworICBmb3IgKHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEhlYWRlciksIFBFID0gcHJlZF9lbmQoSGVhZGVyKTsKKyAgICAgICBQSSAhPSBQRTsgKytQSSkgeworICAgIEJhc2ljQmxvY2sgKlAgPSAqUEk7CisgICAgaWYgKCFMLT5jb250YWlucyhQKSkgeyAgICAgICAgIC8vIENvbWluZyBpbiBmcm9tIG91dHNpZGUgdGhlIGxvb3A/CisgICAgICAvLyBJZiB0aGUgbG9vcCBpcyBicmFuY2hlZCB0byBmcm9tIGFuIGluZGlyZWN0IGJyYW5jaCwgd2Ugd29uJ3QKKyAgICAgIC8vIGJlIGFibGUgdG8gZnVsbHkgdHJhbnNmb3JtIHRoZSBsb29wLCBiZWNhdXNlIGl0IHByb2hpYml0cworICAgICAgLy8gZWRnZSBzcGxpdHRpbmcuCisgICAgICBpZiAoaXNhPEluZGlyZWN0QnJJbnN0PihQLT5nZXRUZXJtaW5hdG9yKCkpKSByZXR1cm4gMDsKKworICAgICAgLy8gS2VlcCB0cmFjayBvZiBpdC4KKyAgICAgIE91dHNpZGVCbG9ja3MucHVzaF9iYWNrKFApOworICAgIH0KKyAgfQorCisgIC8vIFNwbGl0IG91dCB0aGUgbG9vcCBwcmUtaGVhZGVyLgorICBCYXNpY0Jsb2NrICpOZXdCQiA9CisgICAgU3BsaXRCbG9ja1ByZWRlY2Vzc29ycyhIZWFkZXIsICZPdXRzaWRlQmxvY2tzWzBdLCBPdXRzaWRlQmxvY2tzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworCisgIERFQlVHKGRiZ3MoKSA8PCAiTG9vcFNpbXBsaWZ5OiBDcmVhdGluZyBwcmUtaGVhZGVyICI7CisgICAgICAgIFdyaXRlQXNPcGVyYW5kKGRiZ3MoKSwgTmV3QkIsIGZhbHNlKTsKKyAgICAgICAgZGJncygpIDw8ICJcbiIpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IE5ld0JCIGlzIHB1dCBzb21lcGxhY2UgaW50ZWxsaWdlbnQsIHdoaWNoIGRvZXNuJ3QgbWVzcyB1cAorICAvLyBjb2RlIGxheW91dCB0b28gaG9ycmlibHkuCisgIFBsYWNlU3BsaXRCbG9ja0NhcmVmdWxseShOZXdCQiwgT3V0c2lkZUJsb2NrcywgTCk7CisKKyAgcmV0dXJuIE5ld0JCOworfQorCisvLy8gUmV3cml0ZUxvb3BFeGl0QmxvY2sgLSBFbnN1cmUgdGhhdCB0aGUgbG9vcCBwcmVoZWFkZXIgZG9taW5hdGVzIGFsbCBleGl0CisvLy8gYmxvY2tzLiAgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzcGxpdCBleGl0IGJsb2NrcyB0aGF0IGhhdmUgcHJlZGVjZXNzb3JzCisvLy8gb3V0c2lkZSBvZiB0aGUgbG9vcC4KK0Jhc2ljQmxvY2sgKkxvb3BTaW1wbGlmeTo6UmV3cml0ZUxvb3BFeGl0QmxvY2soTG9vcCAqTCwgQmFzaWNCbG9jayAqRXhpdCkgeworICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgOD4gTG9vcEJsb2NrczsKKyAgZm9yIChwcmVkX2l0ZXJhdG9yIEkgPSBwcmVkX2JlZ2luKEV4aXQpLCBFID0gcHJlZF9lbmQoRXhpdCk7IEkgIT0gRTsgKytJKSB7CisgICAgQmFzaWNCbG9jayAqUCA9ICpJOworICAgIGlmIChMLT5jb250YWlucyhQKSkgeworICAgICAgLy8gRG9uJ3QgZG8gdGhpcyBpZiB0aGUgbG9vcCBpcyBleGl0ZWQgdmlhIGFuIGluZGlyZWN0IGJyYW5jaC4KKyAgICAgIGlmIChpc2E8SW5kaXJlY3RCckluc3Q+KFAtPmdldFRlcm1pbmF0b3IoKSkpIHJldHVybiAwOworCisgICAgICBMb29wQmxvY2tzLnB1c2hfYmFjayhQKTsKKyAgICB9CisgIH0KKworICBhc3NlcnQoIUxvb3BCbG9ja3MuZW1wdHkoKSAmJiAiTm8gZWRnZXMgY29taW5nIGluIGZyb20gb3V0c2lkZSB0aGUgbG9vcD8iKTsKKyAgQmFzaWNCbG9jayAqTmV3QkIgPSBTcGxpdEJsb2NrUHJlZGVjZXNzb3JzKEV4aXQsICZMb29wQmxvY2tzWzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BCbG9ja3Muc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisKKyAgREVCVUcoZGJncygpIDw8ICJMb29wU2ltcGxpZnk6IENyZWF0aW5nIGRlZGljYXRlZCBleGl0IGJsb2NrICI7CisgICAgICAgIFdyaXRlQXNPcGVyYW5kKGRiZ3MoKSwgTmV3QkIsIGZhbHNlKTsKKyAgICAgICAgZGJncygpIDw8ICJcbiIpOworCisgIHJldHVybiBOZXdCQjsKK30KKworLy8vIEFkZEJsb2NrQW5kUHJlZHNUb1NldCAtIEFkZCB0aGUgc3BlY2lmaWVkIGJsb2NrLCBhbmQgYWxsIG9mIGl0cworLy8vIHByZWRlY2Vzc29ycywgdG8gdGhlIHNwZWNpZmllZCBzZXQsIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gdGhlcmUuICBTdG9wCisvLy8gcHJlZGVjZXNzb3IgdHJhdmVyc2FsIHdoZW4gd2UgcmVhY2ggU3RvcEJsb2NrLgorc3RhdGljIHZvaWQgQWRkQmxvY2tBbmRQcmVkc1RvU2V0KEJhc2ljQmxvY2sgKklucHV0QkIsIEJhc2ljQmxvY2sgKlN0b3BCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxCYXNpY0Jsb2NrKj4gJkJsb2NrcykgeworICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrICo+IFdvcmtMaXN0OworICBXb3JrTGlzdC5wdXNoX2JhY2soSW5wdXRCQik7CisgIGRvIHsKKyAgICBCYXNpY0Jsb2NrICpCQiA9IFdvcmtMaXN0LmJhY2soKTsgV29ya0xpc3QucG9wX2JhY2soKTsKKyAgICBpZiAoQmxvY2tzLmluc2VydChCQikuc2Vjb25kICYmIEJCICE9IFN0b3BCbG9jaykKKyAgICAgIC8vIElmIEJCIGlzIG5vdCBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgaXQgaXMgbm90IGEgc3RvcCBibG9jayB0aGVuCisgICAgICAvLyBpbnNlcnQgaXRzIHByZWRlY2Vzc29yIGluIHRoZSB3b3JrIGxpc3QKKyAgICAgIGZvciAocHJlZF9pdGVyYXRvciBJID0gcHJlZF9iZWdpbihCQiksIEUgPSBwcmVkX2VuZChCQik7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIEJhc2ljQmxvY2sgKldCQiA9ICpJOworICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soV0JCKTsKKyAgICAgIH0KKyAgfSB3aGlsZSghV29ya0xpc3QuZW1wdHkoKSk7Cit9CisKKy8vLyBGaW5kUEhJVG9QYXJ0aXRpb25Mb29wcyAtIFRoZSBmaXJzdCBwYXJ0IG9mIGxvb3AtbmVzdGlmaWNhdGlvbiBpcyB0byBmaW5kIGEKKy8vLyBQSEkgbm9kZSB0aGF0IHRlbGxzIHVzIGhvdyB0byBwYXJ0aXRpb24gdGhlIGxvb3BzLgorc3RhdGljIFBISU5vZGUgKkZpbmRQSElUb1BhcnRpdGlvbkxvb3BzKExvb3AgKkwsIERvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBKSB7CisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEwtPmdldEhlYWRlcigpLT5iZWdpbigpOyBpc2E8UEhJTm9kZT4oSSk7ICkgeworICAgIFBISU5vZGUgKlBOID0gY2FzdDxQSElOb2RlPihJKTsKKyAgICArK0k7CisgICAgaWYgKFZhbHVlICpWID0gUE4tPmhhc0NvbnN0YW50VmFsdWUoRFQpKSB7CisgICAgICAvLyBUaGlzIGlzIGEgZGVnZW5lcmF0ZSBQSEkgYWxyZWFkeSwgZG9uJ3QgbW9kaWZ5IGl0IQorICAgICAgUE4tPnJlcGxhY2VBbGxVc2VzV2l0aChWKTsKKyAgICAgIGlmIChBQSkgQUEtPmRlbGV0ZVZhbHVlKFBOKTsKKyAgICAgIFBOLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIFNjYW4gdGhpcyBQSEkgbm9kZSBsb29raW5nIGZvciBhIHVzZSBvZiB0aGUgUEhJIG5vZGUgYnkgaXRzZWxmLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoUE4tPmdldEluY29taW5nVmFsdWUoaSkgPT0gUE4gJiYKKyAgICAgICAgICBMLT5jb250YWlucyhQTi0+Z2V0SW5jb21pbmdCbG9jayhpKSkpCisgICAgICAgIC8vIFdlIGZvdW5kIHNvbWV0aGluZyB0YXN0eSB0byByZW1vdmUuCisgICAgICAgIHJldHVybiBQTjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gUGxhY2VTcGxpdEJsb2NrQ2FyZWZ1bGx5IC0gSWYgdGhlIGJsb2NrIGlzbid0IGFscmVhZHksIG1vdmUgdGhlIG5ldyBibG9jayB0bworLy8gcmlnaHQgYWZ0ZXIgc29tZSAnb3V0c2lkZSBibG9jaycgYmxvY2suICBUaGlzIHByZXZlbnRzIHRoZSBwcmVoZWFkZXIgZnJvbQorLy8gYmVpbmcgcGxhY2VkIGluc2lkZSB0aGUgbG9vcCBib2R5LCBlLmcuIHdoZW4gdGhlIGxvb3AgaGFzbid0IGJlZW4gcm90YXRlZC4KK3ZvaWQgTG9vcFNpbXBsaWZ5OjpQbGFjZVNwbGl0QmxvY2tDYXJlZnVsbHkoQmFzaWNCbG9jayAqTmV3QkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayo+ICZTcGxpdFByZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wICpMKSB7CisgIC8vIENoZWNrIHRvIHNlZSBpZiBOZXdCQiBpcyBhbHJlYWR5IHdlbGwgcGxhY2VkLgorICBGdW5jdGlvbjo6aXRlcmF0b3IgQkJJID0gTmV3QkI7IC0tQkJJOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3BsaXRQcmVkcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKCYqQkJJID09IFNwbGl0UHJlZHNbaV0pCisgICAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIElmIGl0IGlzbid0IGFscmVhZHkgYWZ0ZXIgYW4gb3V0c2lkZSBibG9jaywgbW92ZSBpdCBhZnRlciBvbmUuICBUaGlzIGlzCisgIC8vIGFsd2F5cyBnb29kIGFzIGl0IG1ha2VzIHRoZSB1bmNvbmQgYnJhbmNoIGZyb20gdGhlIG91dHNpZGUgYmxvY2sgaW50byBhCisgIC8vIGZhbGwtdGhyb3VnaC4KKyAgCisgIC8vIEZpZ3VyZSBvdXQgKndoaWNoKiBvdXRzaWRlIGJsb2NrIHRvIHB1dCB0aGlzIGFmdGVyLiAgUHJlZmVyIGFuIG91dHNpZGUKKyAgLy8gYmxvY2sgdGhhdCBuZWlnaGJvcnMgYSBCQiBhY3R1YWxseSBpbiB0aGUgbG9vcC4KKyAgQmFzaWNCbG9jayAqRm91bmRCQiA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTcGxpdFByZWRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBGdW5jdGlvbjo6aXRlcmF0b3IgQkJJID0gU3BsaXRQcmVkc1tpXTsKKyAgICBpZiAoKytCQkkgIT0gTmV3QkItPmdldFBhcmVudCgpLT5lbmQoKSAmJiAKKyAgICAgICAgTC0+Y29udGFpbnMoQkJJKSkgeworICAgICAgRm91bmRCQiA9IFNwbGl0UHJlZHNbaV07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgCisgIC8vIElmIG91ciBoZXVyaXN0aWMgZm9yIGEgKmdvb2QqIGJiIHRvIHBsYWNlIHRoaXMgYWZ0ZXIgZG9lc24ndCBmaW5kCisgIC8vIGFueXRoaW5nLCBqdXN0IHBpY2sgc29tZXRoaW5nLiAgSXQncyBsaWtlbHkgYmV0dGVyIHRoYW4gbGVhdmluZyBpdCB3aXRoaW4KKyAgLy8gdGhlIGxvb3AuCisgIGlmICghRm91bmRCQikKKyAgICBGb3VuZEJCID0gU3BsaXRQcmVkc1swXTsKKyAgTmV3QkItPm1vdmVBZnRlcihGb3VuZEJCKTsKK30KKworCisvLy8gU2VwYXJhdGVOZXN0ZWRMb29wIC0gSWYgdGhpcyBsb29wIGhhcyBtdWx0aXBsZSBiYWNrZWRnZXMsIHRyeSB0byBwdWxsIG9uZSBvZgorLy8vIHRoZW0gb3V0IGludG8gYSBuZXN0ZWQgbG9vcC4gIFRoaXMgaXMgaW1wb3J0YW50IGZvciBjb2RlIHRoYXQgbG9va3MgbGlrZQorLy8vIHRoaXM6CisvLy8KKy8vLyAgTG9vcDoKKy8vLyAgICAgLi4uCisvLy8gICAgIGJyIGNvbmQsIExvb3AsIE5leHQKKy8vLyAgICAgLi4uCisvLy8gICAgIGJyIGNvbmQyLCBMb29wLCBPdXQKKy8vLworLy8vIFRvIGlkZW50aWZ5IHRoaXMgY29tbW9uIGNhc2UsIHdlIGxvb2sgYXQgdGhlIFBISSBub2RlcyBpbiB0aGUgaGVhZGVyIG9mIHRoZQorLy8vIGxvb3AuICBQSEkgbm9kZXMgd2l0aCB1bmNoYW5naW5nIHZhbHVlcyBvbiBvbmUgYmFja2VkZ2UgY29ycmVzcG9uZCB0byB2YWx1ZXMKKy8vLyB0aGF0IGNoYW5nZSBpbiB0aGUgIm91dGVyIiBsb29wLCBidXQgbm90IGluIHRoZSAiaW5uZXIiIGxvb3AuCisvLy8KKy8vLyBJZiB3ZSBhcmUgYWJsZSB0byBzZXBhcmF0ZSBvdXQgYSBsb29wLCByZXR1cm4gdGhlIG5ldyBvdXRlciBsb29wIHRoYXQgd2FzCisvLy8gY3JlYXRlZC4KKy8vLworTG9vcCAqTG9vcFNpbXBsaWZ5OjpTZXBhcmF0ZU5lc3RlZExvb3AoTG9vcCAqTCwgTFBQYXNzTWFuYWdlciAmTFBNKSB7CisgIFBISU5vZGUgKlBOID0gRmluZFBISVRvUGFydGl0aW9uTG9vcHMoTCwgRFQsIEFBKTsKKyAgaWYgKFBOID09IDApIHJldHVybiAwOyAgLy8gTm8ga25vd24gd2F5IHRvIHBhcnRpdGlvbi4KKworICAvLyBQdWxsIG91dCBhbGwgcHJlZGVjZXNzb3JzIHRoYXQgaGF2ZSB2YXJ5aW5nIHZhbHVlcyBpbiB0aGUgbG9vcC4gIFRoaXMKKyAgLy8gaGFuZGxlcyB0aGUgY2FzZSB3aGVuIGEgUEhJIG5vZGUgaGFzIG11bHRpcGxlIGluc3RhbmNlcyBvZiBpdHNlbGYgYXMKKyAgLy8gYXJndW1lbnRzLgorICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgOD4gT3V0ZXJMb29wUHJlZHM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpICE9IFBOIHx8CisgICAgICAgICFMLT5jb250YWlucyhQTi0+Z2V0SW5jb21pbmdCbG9jayhpKSkpIHsKKyAgICAgIC8vIFdlIGNhbid0IHNwbGl0IGluZGlyZWN0YnIgZWRnZXMuCisgICAgICBpZiAoaXNhPEluZGlyZWN0QnJJbnN0PihQTi0+Z2V0SW5jb21pbmdCbG9jayhpKS0+Z2V0VGVybWluYXRvcigpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIE91dGVyTG9vcFByZWRzLnB1c2hfYmFjayhQTi0+Z2V0SW5jb21pbmdCbG9jayhpKSk7CisgICAgfQorCisgIERFQlVHKGRiZ3MoKSA8PCAiTG9vcFNpbXBsaWZ5OiBTcGxpdHRpbmcgb3V0IGEgbmV3IG91dGVyIGxvb3BcbiIpOworCisgIEJhc2ljQmxvY2sgKkhlYWRlciA9IEwtPmdldEhlYWRlcigpOworICBCYXNpY0Jsb2NrICpOZXdCQiA9IFNwbGl0QmxvY2tQcmVkZWNlc3NvcnMoSGVhZGVyLCAmT3V0ZXJMb29wUHJlZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRlckxvb3BQcmVkcy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKworICAvLyBNYWtlIHN1cmUgdGhhdCBOZXdCQiBpcyBwdXQgc29tZXBsYWNlIGludGVsbGlnZW50LCB3aGljaCBkb2Vzbid0IG1lc3MgdXAKKyAgLy8gY29kZSBsYXlvdXQgdG9vIGhvcnJpYmx5LgorICBQbGFjZVNwbGl0QmxvY2tDYXJlZnVsbHkoTmV3QkIsIE91dGVyTG9vcFByZWRzLCBMKTsKKyAgCisgIC8vIENyZWF0ZSB0aGUgbmV3IG91dGVyIGxvb3AuCisgIExvb3AgKk5ld091dGVyID0gbmV3IExvb3AoKTsKKworICAvLyBDaGFuZ2UgdGhlIHBhcmVudCBsb29wIHRvIHVzZSB0aGUgb3V0ZXIgbG9vcCBhcyBpdHMgY2hpbGQgbm93LgorICBpZiAoTG9vcCAqUGFyZW50ID0gTC0+Z2V0UGFyZW50TG9vcCgpKQorICAgIFBhcmVudC0+cmVwbGFjZUNoaWxkTG9vcFdpdGgoTCwgTmV3T3V0ZXIpOworICBlbHNlCisgICAgTEktPmNoYW5nZVRvcExldmVsTG9vcChMLCBOZXdPdXRlcik7CisKKyAgLy8gTCBpcyBub3cgYSBzdWJsb29wIG9mIG91ciBvdXRlciBsb29wLgorICBOZXdPdXRlci0+YWRkQ2hpbGRMb29wKEwpOworCisgIC8vIEFkZCB0aGUgbmV3IGxvb3AgdG8gdGhlIHBhc3MgbWFuYWdlciBxdWV1ZS4KKyAgTFBNLmluc2VydExvb3BJbnRvUXVldWUoTmV3T3V0ZXIpOworCisgIGZvciAoTG9vcDo6YmxvY2tfaXRlcmF0b3IgSSA9IEwtPmJsb2NrX2JlZ2luKCksIEUgPSBMLT5ibG9ja19lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBOZXdPdXRlci0+YWRkQmxvY2tFbnRyeSgqSSk7CisKKyAgLy8gTm93IHJlc2V0IHRoZSBoZWFkZXIgaW4gTCwgd2hpY2ggaGFkIGJlZW4gbW92ZWQgYnkKKyAgLy8gU3BsaXRCbG9ja1ByZWRlY2Vzc29ycyBmb3IgdGhlIG91dGVyIGxvb3AuCisgIEwtPm1vdmVUb0hlYWRlcihIZWFkZXIpOworCisgIC8vIERldGVybWluZSB3aGljaCBibG9ja3Mgc2hvdWxkIHN0YXkgaW4gTCBhbmQgd2hpY2ggc2hvdWxkIGJlIG1vdmVkIG91dCB0bworICAvLyB0aGUgT3V0ZXIgbG9vcCBub3cuCisgIHN0ZDo6c2V0PEJhc2ljQmxvY2sqPiBCbG9ja3NJbkw7CisgIGZvciAocHJlZF9pdGVyYXRvciBQST1wcmVkX2JlZ2luKEhlYWRlciksIEUgPSBwcmVkX2VuZChIZWFkZXIpOyBQSSE9RTsgKytQSSkgeworICAgIEJhc2ljQmxvY2sgKlAgPSAqUEk7CisgICAgaWYgKERULT5kb21pbmF0ZXMoSGVhZGVyLCBQKSkKKyAgICAgIEFkZEJsb2NrQW5kUHJlZHNUb1NldChQLCBIZWFkZXIsIEJsb2Nrc0luTCk7CisgIH0KKworICAvLyBTY2FuIGFsbCBvZiB0aGUgbG9vcCBjaGlsZHJlbiBvZiBMLCBtb3ZpbmcgdGhlbSB0byBPdXRlckxvb3AgaWYgdGhleSBhcmUKKyAgLy8gbm90IHBhcnQgb2YgdGhlIGlubmVyIGxvb3AuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPExvb3AqPiAmU3ViTG9vcHMgPSBMLT5nZXRTdWJMb29wcygpOworICBmb3IgKHNpemVfdCBJID0gMDsgSSAhPSBTdWJMb29wcy5zaXplKCk7ICkKKyAgICBpZiAoQmxvY2tzSW5MLmNvdW50KFN1Ykxvb3BzW0ldLT5nZXRIZWFkZXIoKSkpCisgICAgICArK0k7ICAgLy8gTG9vcCByZW1haW5zIGluIEwKKyAgICBlbHNlCisgICAgICBOZXdPdXRlci0+YWRkQ2hpbGRMb29wKEwtPnJlbW92ZUNoaWxkTG9vcChTdWJMb29wcy5iZWdpbigpICsgSSkpOworCisgIC8vIE5vdyB0aGF0IHdlIGtub3cgd2hpY2ggYmxvY2tzIGFyZSBpbiBMIGFuZCB3aGljaCBuZWVkIHRvIGJlIG1vdmVkIHRvCisgIC8vIE91dGVyTG9vcCwgbW92ZSBhbnkgYmxvY2tzIHRoYXQgbmVlZCBpdC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBMLT5nZXRCbG9ja3MoKS5zaXplKCk7ICsraSkgeworICAgIEJhc2ljQmxvY2sgKkJCID0gTC0+Z2V0QmxvY2tzKClbaV07CisgICAgaWYgKCFCbG9ja3NJbkwuY291bnQoQkIpKSB7CisgICAgICAvLyBNb3ZlIHRoaXMgYmxvY2sgdG8gdGhlIHBhcmVudCwgdXBkYXRpbmcgdGhlIGV4aXQgYmxvY2tzIHNldHMKKyAgICAgIEwtPnJlbW92ZUJsb2NrRnJvbUxvb3AoQkIpOworICAgICAgaWYgKCgqTEkpW0JCXSA9PSBMKQorICAgICAgICBMSS0+Y2hhbmdlTG9vcEZvcihCQiwgTmV3T3V0ZXIpOworICAgICAgLS1pOworICAgIH0KKyAgfQorCisgIHJldHVybiBOZXdPdXRlcjsKK30KKworCisKKy8vLyBJbnNlcnRVbmlxdWVCYWNrZWRnZUJsb2NrIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHNwZWNpZmllZCBsb29wCisvLy8gaGFzIG1vcmUgdGhhbiBvbmUgYmFja2VkZ2UgaW4gaXQuICBJZiB0aGlzIG9jY3VycywgcmV2ZWN0b3IgYWxsIG9mIHRoZXNlCisvLy8gYmFja2VkZ2VzIHRvIHRhcmdldCBhIG5ldyBiYXNpYyBibG9jayBhbmQgaGF2ZSB0aGF0IGJsb2NrIGJyYW5jaCB0byB0aGUgbG9vcAorLy8vIGhlYWRlci4gIFRoaXMgZW5zdXJlcyB0aGF0IGxvb3BzIGhhdmUgZXhhY3RseSBvbmUgYmFja2VkZ2UuCisvLy8KK0Jhc2ljQmxvY2sgKgorTG9vcFNpbXBsaWZ5OjpJbnNlcnRVbmlxdWVCYWNrZWRnZUJsb2NrKExvb3AgKkwsIEJhc2ljQmxvY2sgKlByZWhlYWRlcikgeworICBhc3NlcnQoTC0+Z2V0TnVtQmFja0VkZ2VzKCkgPiAxICYmICJNdXN0IGhhdmUgPiAxIGJhY2tlZGdlISIpOworCisgIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9vcAorICBCYXNpY0Jsb2NrICpIZWFkZXIgPSBMLT5nZXRIZWFkZXIoKTsKKyAgRnVuY3Rpb24gKkYgPSBIZWFkZXItPmdldFBhcmVudCgpOworCisgIC8vIFVuaXF1ZSBiYWNrZWRnZSBpbnNlcnRpb24gY3VycmVudGx5IGRlcGVuZHMgb24gaGF2aW5nIGEgcHJlaGVhZGVyLgorICBpZiAoIVByZWhlYWRlcikKKyAgICByZXR1cm4gMDsKKworICAvLyBGaWd1cmUgb3V0IHdoaWNoIGJhc2ljIGJsb2NrcyBjb250YWluIGJhY2stZWRnZXMgdG8gdGhlIGxvb3AgaGVhZGVyLgorICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gQmFja2VkZ2VCbG9ja3M7CisgIGZvciAocHJlZF9pdGVyYXRvciBJID0gcHJlZF9iZWdpbihIZWFkZXIpLCBFID0gcHJlZF9lbmQoSGVhZGVyKTsgSSAhPSBFOyArK0kpeworICAgIEJhc2ljQmxvY2sgKlAgPSAqSTsKKyAgICBpZiAoUCAhPSBQcmVoZWFkZXIpIEJhY2tlZGdlQmxvY2tzLnB1c2hfYmFjayhQKTsKKyAgfQorCisgIC8vIENyZWF0ZSBhbmQgaW5zZXJ0IHRoZSBuZXcgYmFja2VkZ2UgYmxvY2suLi4KKyAgQmFzaWNCbG9jayAqQkVCbG9jayA9IEJhc2ljQmxvY2s6OkNyZWF0ZShIZWFkZXItPmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKTsKKyAgQnJhbmNoSW5zdCAqQkVUZXJtaW5hdG9yID0gQnJhbmNoSW5zdDo6Q3JlYXRlKEhlYWRlciwgQkVCbG9jayk7CisKKyAgREVCVUcoZGJncygpIDw8ICJMb29wU2ltcGxpZnk6IEluc2VydGluZyB1bmlxdWUgYmFja2VkZ2UgYmxvY2sgIjsKKyAgICAgICAgV3JpdGVBc09wZXJhbmQoZGJncygpLCBCRUJsb2NrLCBmYWxzZSk7CisgICAgICAgIGRiZ3MoKSA8PCAiXG4iKTsKKworICAvLyBNb3ZlIHRoZSBuZXcgYmFja2VkZ2UgYmxvY2sgdG8gcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgYmFja2VkZ2UgYmxvY2suCisgIEZ1bmN0aW9uOjppdGVyYXRvciBJbnNlcnRQb3MgPSBCYWNrZWRnZUJsb2Nrcy5iYWNrKCk7ICsrSW5zZXJ0UG9zOworICBGLT5nZXRCYXNpY0Jsb2NrTGlzdCgpLnNwbGljZShJbnNlcnRQb3MsIEYtPmdldEJhc2ljQmxvY2tMaXN0KCksIEJFQmxvY2spOworCisgIC8vIE5vdyB0aGF0IHRoZSBibG9jayBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBmdW5jdGlvbiwgY3JlYXRlIFBISSBub2RlcyBpbgorICAvLyB0aGUgYmFja2VkZ2UgYmxvY2sgd2hpY2ggY29ycmVzcG9uZCB0byBhbnkgUEhJIG5vZGVzIGluIHRoZSBoZWFkZXIgYmxvY2suCisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEhlYWRlci0+YmVnaW4oKTsgaXNhPFBISU5vZGU+KEkpOyArK0kpIHsKKyAgICBQSElOb2RlICpQTiA9IGNhc3Q8UEhJTm9kZT4oSSk7CisgICAgUEhJTm9kZSAqTmV3UE4gPSBQSElOb2RlOjpDcmVhdGUoUE4tPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRlcm1pbmF0b3IpOworICAgIE5ld1BOLT5yZXNlcnZlT3BlcmFuZFNwYWNlKEJhY2tlZGdlQmxvY2tzLnNpemUoKSk7CisgICAgaWYgKEFBKSBBQS0+Y29weVZhbHVlKFBOLCBOZXdQTik7CisKKyAgICAvLyBMb29wIG92ZXIgdGhlIFBISSBub2RlLCBtb3ZpbmcgYWxsIGVudHJpZXMgZXhjZXB0IHRoZSBvbmUgZm9yIHRoZQorICAgIC8vIHByZWhlYWRlciBvdmVyIHRvIHRoZSBuZXcgUEhJIG5vZGUuCisgICAgdW5zaWduZWQgUHJlaGVhZGVySWR4ID0gfjBVOworICAgIGJvb2wgSGFzVW5pcXVlSW5jb21pbmdWYWx1ZSA9IHRydWU7CisgICAgVmFsdWUgKlVuaXF1ZVZhbHVlID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBCYXNpY0Jsb2NrICpJQkIgPSBQTi0+Z2V0SW5jb21pbmdCbG9jayhpKTsKKyAgICAgIFZhbHVlICpJViA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlKGkpOworICAgICAgaWYgKElCQiA9PSBQcmVoZWFkZXIpIHsKKyAgICAgICAgUHJlaGVhZGVySWR4ID0gaTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE5ld1BOLT5hZGRJbmNvbWluZyhJViwgSUJCKTsKKyAgICAgICAgaWYgKEhhc1VuaXF1ZUluY29taW5nVmFsdWUpIHsKKyAgICAgICAgICBpZiAoVW5pcXVlVmFsdWUgPT0gMCkKKyAgICAgICAgICAgIFVuaXF1ZVZhbHVlID0gSVY7CisgICAgICAgICAgZWxzZSBpZiAoVW5pcXVlVmFsdWUgIT0gSVYpCisgICAgICAgICAgICBIYXNVbmlxdWVJbmNvbWluZ1ZhbHVlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEZWxldGUgYWxsIG9mIHRoZSBpbmNvbWluZyB2YWx1ZXMgZnJvbSB0aGUgb2xkIFBOIGV4Y2VwdCB0aGUgcHJlaGVhZGVyJ3MKKyAgICBhc3NlcnQoUHJlaGVhZGVySWR4ICE9IH4wVSAmJiAiUEhJIGhhcyBubyBwcmVoZWFkZXIgZW50cnk/PyIpOworICAgIGlmIChQcmVoZWFkZXJJZHggIT0gMCkgeworICAgICAgUE4tPnNldEluY29taW5nVmFsdWUoMCwgUE4tPmdldEluY29taW5nVmFsdWUoUHJlaGVhZGVySWR4KSk7CisgICAgICBQTi0+c2V0SW5jb21pbmdCbG9jaygwLCBQTi0+Z2V0SW5jb21pbmdCbG9jayhQcmVoZWFkZXJJZHgpKTsKKyAgICB9CisgICAgLy8gTnVrZSBhbGwgZW50cmllcyBleGNlcHQgdGhlIHplcm8ndGguCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpLTE7IGkgIT0gZTsgKytpKQorICAgICAgUE4tPnJlbW92ZUluY29taW5nVmFsdWUoZS1pLCBmYWxzZSk7CisKKyAgICAvLyBGaW5hbGx5LCBhZGQgdGhlIG5ld2x5IGNvbnN0cnVjdGVkIFBISSBub2RlIGFzIHRoZSBlbnRyeSBmb3IgdGhlIEJFQmxvY2suCisgICAgUE4tPmFkZEluY29taW5nKE5ld1BOLCBCRUJsb2NrKTsKKworICAgIC8vIEFzIGFuIG9wdGltaXphdGlvbiwgaWYgYWxsIGluY29taW5nIHZhbHVlcyBpbiB0aGUgbmV3IFBoaU5vZGUgKHdoaWNoIGlzIGEKKyAgICAvLyBzdWJzZXQgb2YgdGhlIGluY29taW5nIHZhbHVlcyBvZiB0aGUgb2xkIFBISSBub2RlKSBoYXZlIHRoZSBzYW1lIHZhbHVlLAorICAgIC8vIGVsaW1pbmF0ZSB0aGUgUEhJIE5vZGUuCisgICAgaWYgKEhhc1VuaXF1ZUluY29taW5nVmFsdWUpIHsKKyAgICAgIE5ld1BOLT5yZXBsYWNlQWxsVXNlc1dpdGgoVW5pcXVlVmFsdWUpOworICAgICAgaWYgKEFBKSBBQS0+ZGVsZXRlVmFsdWUoTmV3UE4pOworICAgICAgQkVCbG9jay0+Z2V0SW5zdExpc3QoKS5lcmFzZShOZXdQTik7CisgICAgfQorICB9CisKKyAgLy8gTm93IHRoYXQgYWxsIG9mIHRoZSBQSEkgbm9kZXMgaGF2ZSBiZWVuIGluc2VydGVkIGFuZCBhZGp1c3RlZCwgbW9kaWZ5IHRoZQorICAvLyBiYWNrZWRnZSBibG9ja3MgdG8ganVzdCB0byB0aGUgQkVCbG9jayBpbnN0ZWFkIG9mIHRoZSBoZWFkZXIuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCYWNrZWRnZUJsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgVGVybWluYXRvckluc3QgKlRJID0gQmFja2VkZ2VCbG9ja3NbaV0tPmdldFRlcm1pbmF0b3IoKTsKKyAgICBmb3IgKHVuc2lnbmVkIE9wID0gMCwgZSA9IFRJLT5nZXROdW1TdWNjZXNzb3JzKCk7IE9wICE9IGU7ICsrT3ApCisgICAgICBpZiAoVEktPmdldFN1Y2Nlc3NvcihPcCkgPT0gSGVhZGVyKQorICAgICAgICBUSS0+c2V0U3VjY2Vzc29yKE9wLCBCRUJsb2NrKTsKKyAgfQorCisgIC8vPT09LS0tIFVwZGF0ZSBhbGwgYW5hbHlzZXMgd2hpY2ggd2UgbXVzdCBwcmVzZXJ2ZSBub3cgLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vIFVwZGF0ZSBMb29wIEluZm9ybWF0aW9uIC0gd2Uga25vdyB0aGF0IHRoaXMgYmxvY2sgaXMgbm93IGluIHRoZSBjdXJyZW50CisgIC8vIGxvb3AgYW5kIGFsbCBwYXJlbnQgbG9vcHMuCisgIEwtPmFkZEJhc2ljQmxvY2tUb0xvb3AoQkVCbG9jaywgTEktPmdldEJhc2UoKSk7CisKKyAgLy8gVXBkYXRlIGRvbWluYXRvciBpbmZvcm1hdGlvbgorICBEVC0+c3BsaXRCbG9jayhCRUJsb2NrKTsKKyAgaWYgKERvbWluYW5jZUZyb250aWVyICpERiA9IGdldEFuYWx5c2lzSWZBdmFpbGFibGU8RG9taW5hbmNlRnJvbnRpZXI+KCkpCisgICAgREYtPnNwbGl0QmxvY2soQkVCbG9jayk7CisKKyAgcmV0dXJuIEJFQmxvY2s7Cit9CisKK3ZvaWQgTG9vcFNpbXBsaWZ5Ojp2ZXJpZnlBbmFseXNpcygpIGNvbnN0IHsKKyAgLy8gSXQgdXNlZCB0byBiZSBwb3NzaWJsZSB0byBqdXN0IGFzc2VydCBMLT5pc0xvb3BTaW1wbGlmeUZvcm0oKSwgaG93ZXZlcgorICAvLyB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgaW5kaXJlY3RiciwgdGhlcmUgYXJlIG5vdyBjYXNlcyB3aGVyZSBpdCdzCisgIC8vIG5vdCBwb3NzaWJsZSB0byB0cmFuc2Zvcm0gYSBsb29wIGFzIG5lY2Vzc2FyeS4gV2UgY2FuIGF0IGxlYXN0IGNoZWNrCisgIC8vIHRoYXQgdGhlcmUgaXMgYW4gaW5kaXJlY3RiciBuZWFyIGFueSB0aW1lIHRoZXJlJ3MgdHJvdWJsZS4KKworICAvLyBJbmRpcmVjdGJyIGNhbiBpbnRlcmZlcmUgd2l0aCBwcmVoZWFkZXIgYW5kIHVuaXF1ZSBiYWNrZWRnZSBpbnNlcnRpb24uCisgIGlmICghTC0+Z2V0TG9vcFByZWhlYWRlcigpIHx8ICFMLT5nZXRMb29wTGF0Y2goKSkgeworICAgIGJvb2wgSGFzSW5kQnJQcmVkID0gZmFsc2U7CisgICAgZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihMLT5nZXRIZWFkZXIoKSksCisgICAgICAgICBQRSA9IHByZWRfZW5kKEwtPmdldEhlYWRlcigpKTsgUEkgIT0gUEU7ICsrUEkpCisgICAgICBpZiAoaXNhPEluZGlyZWN0QnJJbnN0PigoKlBJKS0+Z2V0VGVybWluYXRvcigpKSkgeworICAgICAgICBIYXNJbmRCclByZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBhc3NlcnQoSGFzSW5kQnJQcmVkICYmCisgICAgICAgICAgICJMb29wU2ltcGxpZnkgaGFzIG5vIGV4Y3VzZSBmb3IgbWlzc2luZyBsb29wIGhlYWRlciBpbmZvISIpOworICB9CisKKyAgLy8gSW5kaXJlY3RiciBjYW4gaW50ZXJmZXJlIHdpdGggZXhpdCBibG9jayBjYW5vbmljYWxpemF0aW9uLgorICBpZiAoIUwtPmhhc0RlZGljYXRlZEV4aXRzKCkpIHsKKyAgICBib29sIEhhc0luZEJyRXhpdGluZyA9IGZhbHNlOworICAgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCA4PiBFeGl0aW5nQmxvY2tzOworICAgIEwtPmdldEV4aXRpbmdCbG9ja3MoRXhpdGluZ0Jsb2Nrcyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEV4aXRpbmdCbG9ja3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChpc2E8SW5kaXJlY3RCckluc3Q+KChFeGl0aW5nQmxvY2tzW2ldKS0+Z2V0VGVybWluYXRvcigpKSkgeworICAgICAgICBIYXNJbmRCckV4aXRpbmcgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBhc3NlcnQoSGFzSW5kQnJFeGl0aW5nICYmCisgICAgICAgICAgICJMb29wU2ltcGxpZnkgaGFzIG5vIGV4Y3VzZSBmb3IgbWlzc2luZyBleGl0IGJsb2NrIGluZm8hIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0xvd2VyU3dpdGNoLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL0xvd2VyU3dpdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTFlMjhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvTG93ZXJTd2l0Y2guY3BwCkBAIC0wLDAgKzEsMzE4IEBACisvLz09PS0gTG93ZXJTd2l0Y2guY3BwIC0gRWxpbWluYXRlIFN3aXRjaCBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBMb3dlclN3aXRjaCB0cmFuc2Zvcm1hdGlvbiByZXdyaXRlcyBzd2l0Y2ggaW5zdHJ1Y3Rpb25zIHdpdGggYSBzZXF1ZW5jZQorLy8gb2YgYnJhbmNoZXMsIHdoaWNoIGFsbG93cyB0YXJnZXRzIHRvIGdldCBhd2F5IHdpdGggbm90IGltcGxlbWVudGluZyB0aGUKKy8vIHN3aXRjaCBpbnN0cnVjdGlvbiB1bnRpbCBpdCBpcyBjb252ZW5pZW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1VuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKyAgLy8vIExvd2VyU3dpdGNoIFBhc3MgLSBSZXBsYWNlIGFsbCBTd2l0Y2hJbnN0IGluc3RydWN0aW9ucyB3aXRoIGNoYWluZWQgYnJhbmNoCisgIC8vLyBpbnN0cnVjdGlvbnMuICBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgYmUgYSBCYXNpY0Jsb2NrIHBhc3MgYmVjYXVzZSBpdAorICAvLy8gbW9kaWZpZXMgdGhlIENGRyEKKyAgY2xhc3MgTG93ZXJTd2l0Y2ggOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgICAgTG93ZXJTd2l0Y2goKSA6IEZ1bmN0aW9uUGFzcyhJRCkge30gCisKKyAgICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7CisgICAgCisgICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKKyAgICAgIC8vIFRoaXMgaXMgYSBjbHVzdGVyIG9mIG9ydGhvZ29uYWwgVHJhbnNmb3JtcworICAgICAgQVUuYWRkUHJlc2VydmVkPFVuaWZ5RnVuY3Rpb25FeGl0Tm9kZXM+KCk7CisgICAgICBBVS5hZGRQcmVzZXJ2ZWQoIm1lbTJyZWciKTsKKyAgICAgIC8vQVUuYWRkUHJlc2VydmVkSUQoTG93ZXJJbnZva2VQYXNzSUQpOworICAgIH0KKworICAgIHN0cnVjdCBDYXNlUmFuZ2UgeworICAgICAgQ29uc3RhbnQqIExvdzsKKyAgICAgIENvbnN0YW50KiBIaWdoOworICAgICAgQmFzaWNCbG9jayogQkI7CisKKyAgICAgIENhc2VSYW5nZSgpIDogTG93KDApLCBIaWdoKDApLCBCQigwKSB7IH0KKyAgICAgIENhc2VSYW5nZShDb25zdGFudCogbG93LCBDb25zdGFudCogaGlnaCwgQmFzaWNCbG9jayogYmIpIDoKKyAgICAgICAgTG93KGxvdyksIEhpZ2goaGlnaCksIEJCKGJiKSB7IH0KKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDYXNlUmFuZ2U+ICAgICAgICAgICBDYXNlVmVjdG9yOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Q2FzZVJhbmdlPjo6aXRlcmF0b3IgQ2FzZUl0cjsKKyAgcHJpdmF0ZToKKyAgICB2b2lkIHByb2Nlc3NTd2l0Y2hJbnN0KFN3aXRjaEluc3QgKlNJKTsKKworICAgIEJhc2ljQmxvY2sqIHN3aXRjaENvbnZlcnQoQ2FzZUl0ciBCZWdpbiwgQ2FzZUl0ciBFbmQsIFZhbHVlKiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBPcmlnQmxvY2ssIEJhc2ljQmxvY2sqIERlZmF1bHQpOworICAgIEJhc2ljQmxvY2sqIG5ld0xlYWZCbG9jayhDYXNlUmFuZ2UmIExlYWYsIFZhbHVlKiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqIE9yaWdCbG9jaywgQmFzaWNCbG9jayogRGVmYXVsdCk7CisgICAgdW5zaWduZWQgQ2x1c3RlcmlmeShDYXNlVmVjdG9yJiBDYXNlcywgU3dpdGNoSW5zdCAqU0kpOworICB9OworCisgIC8vLyBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyB0aGUgc3dpdGNoIGNhc2UgdmFsdWVzIGluIHRoZSB2ZWN0b3IuCisgIC8vLyBXQVJOSU5HOiBDYXNlIHJhbmdlcyBzaG91bGQgYmUgZGlzam9pbnQhCisgIHN0cnVjdCBDYXNlQ21wIHsKKyAgICBib29sIG9wZXJhdG9yICgpIChjb25zdCBMb3dlclN3aXRjaDo6Q2FzZVJhbmdlJiBDMSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb3dlclN3aXRjaDo6Q2FzZVJhbmdlJiBDMikgeworCisgICAgICBjb25zdCBDb25zdGFudEludCogQ0kxID0gY2FzdDxjb25zdCBDb25zdGFudEludD4oQzEuTG93KTsKKyAgICAgIGNvbnN0IENvbnN0YW50SW50KiBDSTIgPSBjYXN0PGNvbnN0IENvbnN0YW50SW50PihDMi5IaWdoKTsKKyAgICAgIHJldHVybiBDSTEtPmdldFZhbHVlKCkuc2x0KENJMi0+Z2V0VmFsdWUoKSk7CisgICAgfQorICB9OworfQorCitjaGFyIExvd2VyU3dpdGNoOjpJRCA9IDA7CitzdGF0aWMgUmVnaXN0ZXJQYXNzPExvd2VyU3dpdGNoPgorWCgibG93ZXJzd2l0Y2giLCAiTG93ZXIgU3dpdGNoSW5zdCdzIHRvIGJyYW5jaGVzIik7CisKKy8vIFB1YmxpY2FsbHkgZXhwb3NlZCBpbnRlcmZhY2UgdG8gcGFzcy4uLgorY2hhciAmbGx2bTo6TG93ZXJTd2l0Y2hJRCA9IExvd2VyU3dpdGNoOjpJRDsKKy8vIGNyZWF0ZUxvd2VyU3dpdGNoUGFzcyAtIEludGVyZmFjZSB0byB0aGlzIGZpbGUuLi4KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlTG93ZXJTd2l0Y2hQYXNzKCkgeworICByZXR1cm4gbmV3IExvd2VyU3dpdGNoKCk7Cit9CisKK2Jvb2wgTG93ZXJTd2l0Y2g6OnJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IEYuYmVnaW4oKSwgRSA9IEYuZW5kKCk7IEkgIT0gRTsgKSB7CisgICAgQmFzaWNCbG9jayAqQ3VyID0gSSsrOyAvLyBBZHZhbmNlIG92ZXIgYmxvY2sgc28gd2UgZG9uJ3QgdHJhdmVyc2UgbmV3IGJsb2NrcworCisgICAgaWYgKFN3aXRjaEluc3QgKlNJID0gZHluX2Nhc3Q8U3dpdGNoSW5zdD4oQ3VyLT5nZXRUZXJtaW5hdG9yKCkpKSB7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIHByb2Nlc3NTd2l0Y2hJbnN0KFNJKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8gb3BlcmF0b3I8PCAtIFVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKy8vCitzdGF0aWMgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG93ZXJTd2l0Y2g6OkNhc2VWZWN0b3IgJkMpIEFUVFJJQlVURV9VU0VEOworc3RhdGljIHJhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvd2VyU3dpdGNoOjpDYXNlVmVjdG9yICZDKSB7CisgIE8gPDwgIlsiOworCisgIGZvciAoTG93ZXJTd2l0Y2g6OkNhc2VWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIgPSBDLmJlZ2luKCksCisgICAgICAgICBFID0gQy5lbmQoKTsgQiAhPSBFOyApIHsKKyAgICBPIDw8ICpCLT5Mb3cgPDwgIiAtIiA8PCAqQi0+SGlnaDsKKyAgICBpZiAoKytCICE9IEUpIE8gPDwgIiwgIjsKKyAgfQorCisgIHJldHVybiBPIDw8ICJdIjsKK30KKworLy8gc3dpdGNoQ29udmVydCAtIENvbnZlcnQgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgaW50byBhIGJpbmFyeSBsb29rdXAgb2YKKy8vIHRoZSBjYXNlIHZhbHVlcy4gVGhlIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IGJ1aWxkcyB0aGlzIHRyZWUuCisvLworQmFzaWNCbG9jayogTG93ZXJTd2l0Y2g6OnN3aXRjaENvbnZlcnQoQ2FzZUl0ciBCZWdpbiwgQ2FzZUl0ciBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSogVmFsLCBCYXNpY0Jsb2NrKiBPcmlnQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBEZWZhdWx0KQoreworICB1bnNpZ25lZCBTaXplID0gRW5kIC0gQmVnaW47CisKKyAgaWYgKFNpemUgPT0gMSkKKyAgICByZXR1cm4gbmV3TGVhZkJsb2NrKCpCZWdpbiwgVmFsLCBPcmlnQmxvY2ssIERlZmF1bHQpOworCisgIHVuc2lnbmVkIE1pZCA9IFNpemUgLyAyOworICBzdGQ6OnZlY3RvcjxDYXNlUmFuZ2U+IExIUyhCZWdpbiwgQmVnaW4gKyBNaWQpOworICBERUJVRyhkYmdzKCkgPDwgIkxIUzogIiA8PCBMSFMgPDwgIlxuIik7CisgIHN0ZDo6dmVjdG9yPENhc2VSYW5nZT4gUkhTKEJlZ2luICsgTWlkLCBFbmQpOworICBERUJVRyhkYmdzKCkgPDwgIlJIUzogIiA8PCBSSFMgPDwgIlxuIik7CisKKyAgQ2FzZVJhbmdlJiBQaXZvdCA9ICooQmVnaW4gKyBNaWQpOworICBERUJVRyhkYmdzKCkgPDwgIlBpdm90ID09PiAiIAorICAgICAgICAgICAgICAgPDwgY2FzdDxDb25zdGFudEludD4oUGl2b3QuTG93KS0+Z2V0VmFsdWUoKSA8PCAiIC0iCisgICAgICAgICAgICAgICA8PCBjYXN0PENvbnN0YW50SW50PihQaXZvdC5IaWdoKS0+Z2V0VmFsdWUoKSA8PCAiXG4iKTsKKworICBCYXNpY0Jsb2NrKiBMQnJhbmNoID0gc3dpdGNoQ29udmVydChMSFMuYmVnaW4oKSwgTEhTLmVuZCgpLCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdCbG9jaywgRGVmYXVsdCk7CisgIEJhc2ljQmxvY2sqIFJCcmFuY2ggPSBzd2l0Y2hDb252ZXJ0KFJIUy5iZWdpbigpLCBSSFMuZW5kKCksIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZ0Jsb2NrLCBEZWZhdWx0KTsKKworICAvLyBDcmVhdGUgYSBuZXcgbm9kZSB0aGF0IGNoZWNrcyBpZiB0aGUgdmFsdWUgaXMgPCBwaXZvdC4gR28gdG8gdGhlCisgIC8vIGxlZnQgYnJhbmNoIGlmIGl0IGlzIGFuZCByaWdodCBicmFuY2ggaWYgbm90LgorICBGdW5jdGlvbiogRiA9IE9yaWdCbG9jay0+Z2V0UGFyZW50KCk7CisgIEJhc2ljQmxvY2sqIE5ld05vZGUgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoVmFsLT5nZXRDb250ZXh0KCkpOworICBGdW5jdGlvbjo6aXRlcmF0b3IgRkkgPSBPcmlnQmxvY2s7CisgIEYtPmdldEJhc2ljQmxvY2tMaXN0KCkuaW5zZXJ0KCsrRkksIE5ld05vZGUpOworCisgIElDbXBJbnN0KiBDb21wID0gbmV3IElDbXBJbnN0KElDbXBJbnN0OjpJQ01QX1NMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsLCBQaXZvdC5Mb3cpOworICBOZXdOb2RlLT5nZXRJbnN0TGlzdCgpLnB1c2hfYmFjayhDb21wKTsKKyAgQnJhbmNoSW5zdDo6Q3JlYXRlKExCcmFuY2gsIFJCcmFuY2gsIENvbXAsIE5ld05vZGUpOworICByZXR1cm4gTmV3Tm9kZTsKK30KKworLy8gbmV3TGVhZkJsb2NrIC0gQ3JlYXRlIGEgbmV3IGxlYWYgYmxvY2sgZm9yIHRoZSBiaW5hcnkgbG9va3VwIHRyZWUuIEl0CisvLyBjaGVja3MgaWYgdGhlIHN3aXRjaCdzIHZhbHVlID09IHRoZSBjYXNlJ3MgdmFsdWUuIElmIG5vdCwgdGhlbiBpdAorLy8ganVtcHMgdG8gdGhlIGRlZmF1bHQgYnJhbmNoLiBBdCB0aGlzIHBvaW50IGluIHRoZSB0cmVlLCB0aGUgdmFsdWUKKy8vIGNhbid0IGJlIGFub3RoZXIgdmFsaWQgY2FzZSB2YWx1ZSwgc28gdGhlIGp1bXAgdG8gdGhlICJkZWZhdWx0IiBicmFuY2gKKy8vIGlzIHdhcnJhbnRlZC4KKy8vCitCYXNpY0Jsb2NrKiBMb3dlclN3aXRjaDo6bmV3TGVhZkJsb2NrKENhc2VSYW5nZSYgTGVhZiwgVmFsdWUqIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayogT3JpZ0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBEZWZhdWx0KQoreworICBGdW5jdGlvbiogRiA9IE9yaWdCbG9jay0+Z2V0UGFyZW50KCk7CisgIEJhc2ljQmxvY2sqIE5ld0xlYWYgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoVmFsLT5nZXRDb250ZXh0KCkpOworICBGdW5jdGlvbjo6aXRlcmF0b3IgRkkgPSBPcmlnQmxvY2s7CisgIEYtPmdldEJhc2ljQmxvY2tMaXN0KCkuaW5zZXJ0KCsrRkksIE5ld0xlYWYpOworCisgIC8vIEVtaXQgY29tcGFyaXNvbgorICBJQ21wSW5zdCogQ29tcCA9IE5VTEw7CisgIGlmIChMZWFmLkxvdyA9PSBMZWFmLkhpZ2gpIHsKKyAgICAvLyBNYWtlIHRoZSBzZXRlcSBpbnN0cnVjdGlvbi4uLgorICAgIENvbXAgPSBuZXcgSUNtcEluc3QoKk5ld0xlYWYsIElDbXBJbnN0OjpJQ01QX0VRLCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBMZWFmLkxvdyk7CisgIH0gZWxzZSB7CisgICAgLy8gTWFrZSByYW5nZSBjb21wYXJpc29uCisgICAgaWYgKGNhc3Q8Q29uc3RhbnRJbnQ+KExlYWYuTG93KS0+aXNNaW5WYWx1ZSh0cnVlIC8qaXNTaWduZWQqLykpIHsKKyAgICAgIC8vIFZhbCA+PSBNaW4gJiYgVmFsIDw9IEhpIC0tPiBWYWwgPD0gSGkKKyAgICAgIENvbXAgPSBuZXcgSUNtcEluc3QoKk5ld0xlYWYsIElDbXBJbnN0OjpJQ01QX1NMRSwgVmFsLCBMZWFmLkhpZ2gpOworICAgIH0gZWxzZSBpZiAoY2FzdDxDb25zdGFudEludD4oTGVhZi5Mb3cpLT5pc1plcm8oKSkgeworICAgICAgLy8gVmFsID49IDAgJiYgVmFsIDw9IEhpIC0tPiBWYWwgPD11IEhpCisgICAgICBDb21wID0gbmV3IElDbXBJbnN0KCpOZXdMZWFmLCBJQ21wSW5zdDo6SUNNUF9VTEUsIFZhbCwgTGVhZi5IaWdoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRW1pdCBWLUxvIDw9dSBIaS1MbworICAgICAgQ29uc3RhbnQqIE5lZ0xvID0gQ29uc3RhbnRFeHByOjpnZXROZWcoTGVhZi5Mb3cpOworICAgICAgSW5zdHJ1Y3Rpb24qIEFkZCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoVmFsLCBOZWdMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0xlYWYpOworICAgICAgQ29uc3RhbnQgKlVwcGVyQm91bmQgPSBDb25zdGFudEV4cHI6OmdldEFkZChOZWdMbywgTGVhZi5IaWdoKTsKKyAgICAgIENvbXAgPSBuZXcgSUNtcEluc3QoKk5ld0xlYWYsIElDbXBJbnN0OjpJQ01QX1VMRSwgQWRkLCBVcHBlckJvdW5kKTsKKyAgICB9CisgIH0KKworICAvLyBNYWtlIHRoZSBjb25kaXRpb25hbCBicmFuY2guLi4KKyAgQmFzaWNCbG9jayogU3VjYyA9IExlYWYuQkI7CisgIEJyYW5jaEluc3Q6OkNyZWF0ZShTdWNjLCBEZWZhdWx0LCBDb21wLCBOZXdMZWFmKTsKKworICAvLyBJZiB0aGVyZSB3ZXJlIGFueSBQSEkgbm9kZXMgaW4gdGhpcyBzdWNjZXNzb3IsIHJld3JpdGUgb25lIGVudHJ5CisgIC8vIGZyb20gT3JpZ0Jsb2NrIHRvIGNvbWUgZnJvbSBOZXdMZWFmLgorICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBTdWNjLT5iZWdpbigpOyBpc2E8UEhJTm9kZT4oSSk7ICsrSSkgeworICAgIFBISU5vZGUqIFBOID0gY2FzdDxQSElOb2RlPihJKTsKKyAgICAvLyBSZW1vdmUgYWxsIGJ1dCBvbmUgaW5jb21pbmcgZW50cmllcyBmcm9tIHRoZSBjbHVzdGVyCisgICAgdWludDY0X3QgUmFuZ2UgPSBjYXN0PENvbnN0YW50SW50PihMZWFmLkhpZ2gpLT5nZXRTRXh0VmFsdWUoKSAtCisgICAgICAgICAgICAgICAgICAgICBjYXN0PENvbnN0YW50SW50PihMZWFmLkxvdyktPmdldFNFeHRWYWx1ZSgpOyAgICAKKyAgICBmb3IgKHVpbnQ2NF90IGogPSAwOyBqIDwgUmFuZ2U7ICsraikgeworICAgICAgUE4tPnJlbW92ZUluY29taW5nVmFsdWUoT3JpZ0Jsb2NrKTsKKyAgICB9CisgICAgCisgICAgaW50IEJsb2NrSWR4ID0gUE4tPmdldEJhc2ljQmxvY2tJbmRleChPcmlnQmxvY2spOworICAgIGFzc2VydChCbG9ja0lkeCAhPSAtMSAmJiAiU3dpdGNoIGRpZG4ndCBnbyB0byB0aGlzIHN1Y2Nlc3Nvcj8/Iik7CisgICAgUE4tPnNldEluY29taW5nQmxvY2soKHVuc2lnbmVkKUJsb2NrSWR4LCBOZXdMZWFmKTsKKyAgfQorCisgIHJldHVybiBOZXdMZWFmOworfQorCisvLyBDbHVzdGVyaWZ5IC0gVHJhbnNmb3JtIHNpbXBsZSBsaXN0IG9mIENhc2VzIGludG8gbGlzdCBvZiBDYXNlUmFuZ2UncwordW5zaWduZWQgTG93ZXJTd2l0Y2g6OkNsdXN0ZXJpZnkoQ2FzZVZlY3RvciYgQ2FzZXMsIFN3aXRjaEluc3QgKlNJKSB7CisgIHVuc2lnbmVkIG51bUNtcHMgPSAwOworCisgIC8vIFN0YXJ0IHdpdGggInNpbXBsZSIgY2FzZXMKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IFNJLT5nZXROdW1TdWNjZXNzb3JzKCk7ICsraSkKKyAgICBDYXNlcy5wdXNoX2JhY2soQ2FzZVJhbmdlKFNJLT5nZXRTdWNjZXNzb3JWYWx1ZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJLT5nZXRTdWNjZXNzb3JWYWx1ZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJLT5nZXRTdWNjZXNzb3IoaSkpKTsKKyAgc3RkOjpzb3J0KENhc2VzLmJlZ2luKCksIENhc2VzLmVuZCgpLCBDYXNlQ21wKCkpOworCisgIC8vIE1lcmdlIGNhc2UgaW50byBjbHVzdGVycworICBpZiAoQ2FzZXMuc2l6ZSgpPj0yKQorICAgIGZvciAoQ2FzZUl0ciBJPUNhc2VzLmJlZ2luKCksIEo9bGx2bTo6bmV4dChDYXNlcy5iZWdpbigpKTsgSiE9Q2FzZXMuZW5kKCk7ICkgeworICAgICAgaW50NjRfdCBuZXh0VmFsdWUgPSBjYXN0PENvbnN0YW50SW50PihKLT5Mb3cpLT5nZXRTRXh0VmFsdWUoKTsKKyAgICAgIGludDY0X3QgY3VycmVudFZhbHVlID0gY2FzdDxDb25zdGFudEludD4oSS0+SGlnaCktPmdldFNFeHRWYWx1ZSgpOworICAgICAgQmFzaWNCbG9jayogbmV4dEJCID0gSi0+QkI7CisgICAgICBCYXNpY0Jsb2NrKiBjdXJyZW50QkIgPSBJLT5CQjsKKworICAgICAgLy8gSWYgdGhlIHR3byBuZWlnaGJvcmluZyBjYXNlcyBnbyB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiwgbWVyZ2UgdGhlbQorICAgICAgLy8gaW50byBhIHNpbmdsZSBjYXNlLgorICAgICAgaWYgKChuZXh0VmFsdWUtY3VycmVudFZhbHVlPT0xKSAmJiAoY3VycmVudEJCID09IG5leHRCQikpIHsKKyAgICAgICAgSS0+SGlnaCA9IEotPkhpZ2g7CisgICAgICAgIEogPSBDYXNlcy5lcmFzZShKKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEkgPSBKKys7CisgICAgICB9CisgICAgfQorCisgIGZvciAoQ2FzZUl0ciBJPUNhc2VzLmJlZ2luKCksIEU9Q2FzZXMuZW5kKCk7IEkhPUU7ICsrSSwgKytudW1DbXBzKSB7CisgICAgaWYgKEktPkxvdyAhPSBJLT5IaWdoKQorICAgICAgLy8gQSByYW5nZSBjb3VudHMgZG91YmxlLCBzaW5jZSBpdCByZXF1aXJlcyB0d28gY29tcGFyZXMuCisgICAgICArK251bUNtcHM7CisgIH0KKworICByZXR1cm4gbnVtQ21wczsKK30KKworLy8gcHJvY2Vzc1N3aXRjaEluc3QgLSBSZXBsYWNlIHRoZSBzcGVjaWZpZWQgc3dpdGNoIGluc3RydWN0aW9uIHdpdGggYSBzZXF1ZW5jZQorLy8gb2YgY2hhaW5lZCBpZi10aGVuIGluc3RzIGluIGEgYmFsYW5jZWQgYmluYXJ5IHNlYXJjaC4KKy8vCit2b2lkIExvd2VyU3dpdGNoOjpwcm9jZXNzU3dpdGNoSW5zdChTd2l0Y2hJbnN0ICpTSSkgeworICBCYXNpY0Jsb2NrICpDdXJCbG9jayA9IFNJLT5nZXRQYXJlbnQoKTsKKyAgQmFzaWNCbG9jayAqT3JpZ0Jsb2NrID0gQ3VyQmxvY2s7CisgIEZ1bmN0aW9uICpGID0gQ3VyQmxvY2stPmdldFBhcmVudCgpOworICBWYWx1ZSAqVmFsID0gU0ktPmdldE9wZXJhbmQoMCk7ICAvLyBUaGUgdmFsdWUgd2UgYXJlIHN3aXRjaGluZyBvbi4uLgorICBCYXNpY0Jsb2NrKiBEZWZhdWx0ID0gU0ktPmdldERlZmF1bHREZXN0KCk7CisKKyAgLy8gSWYgdGhlcmUgaXMgb25seSB0aGUgZGVmYXVsdCBkZXN0aW5hdGlvbiwgZG9uJ3QgYm90aGVyIHdpdGggdGhlIGNvZGUgYmVsb3cuCisgIGlmIChTSS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAyKSB7CisgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKFNJLT5nZXREZWZhdWx0RGVzdCgpLCBDdXJCbG9jayk7CisgICAgQ3VyQmxvY2stPmdldEluc3RMaXN0KCkuZXJhc2UoU0kpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIENyZWF0ZSBhIG5ldywgZW1wdHkgZGVmYXVsdCBibG9jayBzbyB0aGF0IHRoZSBuZXcgaGllcmFyY2h5IG9mCisgIC8vIGlmLXRoZW4gc3RhdGVtZW50cyBnbyB0byB0aGlzIGFuZCB0aGUgUEhJIG5vZGVzIGFyZSBoYXBweS4KKyAgQmFzaWNCbG9jayogTmV3RGVmYXVsdCA9IEJhc2ljQmxvY2s6OkNyZWF0ZShTSS0+Z2V0Q29udGV4dCgpKTsKKyAgRi0+Z2V0QmFzaWNCbG9ja0xpc3QoKS5pbnNlcnQoRGVmYXVsdCwgTmV3RGVmYXVsdCk7CisKKyAgQnJhbmNoSW5zdDo6Q3JlYXRlKERlZmF1bHQsIE5ld0RlZmF1bHQpOworCisgIC8vIElmIHRoZXJlIGlzIGFuIGVudHJ5IGluIGFueSBQSEkgbm9kZXMgZm9yIHRoZSBkZWZhdWx0IGVkZ2UsIG1ha2Ugc3VyZQorICAvLyB0byB1cGRhdGUgdGhlbSBhcyB3ZWxsLgorICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBEZWZhdWx0LT5iZWdpbigpOyBpc2E8UEhJTm9kZT4oSSk7ICsrSSkgeworICAgIFBISU5vZGUgKlBOID0gY2FzdDxQSElOb2RlPihJKTsKKyAgICBpbnQgQmxvY2tJZHggPSBQTi0+Z2V0QmFzaWNCbG9ja0luZGV4KE9yaWdCbG9jayk7CisgICAgYXNzZXJ0KEJsb2NrSWR4ICE9IC0xICYmICJTd2l0Y2ggZGlkbid0IGdvIHRvIHRoaXMgc3VjY2Vzc29yPz8iKTsKKyAgICBQTi0+c2V0SW5jb21pbmdCbG9jaygodW5zaWduZWQpQmxvY2tJZHgsIE5ld0RlZmF1bHQpOworICB9CisKKyAgLy8gUHJlcGFyZSBjYXNlcyB2ZWN0b3IuCisgIENhc2VWZWN0b3IgQ2FzZXM7CisgIHVuc2lnbmVkIG51bUNtcHMgPSBDbHVzdGVyaWZ5KENhc2VzLCBTSSk7CisKKyAgREVCVUcoZGJncygpIDw8ICJDbHVzdGVyaWZ5IGZpbmlzaGVkLiBUb3RhbCBjbHVzdGVyczogIiA8PCBDYXNlcy5zaXplKCkKKyAgICAgICAgICAgICAgIDw8ICIuIFRvdGFsIGNvbXBhcmVzOiAiIDw8IG51bUNtcHMgPDwgIlxuIik7CisgIERFQlVHKGRiZ3MoKSA8PCAiQ2FzZXM6ICIgPDwgQ2FzZXMgPDwgIlxuIik7CisgICh2b2lkKW51bUNtcHM7CisgIAorICBCYXNpY0Jsb2NrKiBTd2l0Y2hCbG9jayA9IHN3aXRjaENvbnZlcnQoQ2FzZXMuYmVnaW4oKSwgQ2FzZXMuZW5kKCksIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdCbG9jaywgTmV3RGVmYXVsdCk7CisKKyAgLy8gQnJhbmNoIHRvIG91ciBzaGlueSBuZXcgaWYtdGhlbiBzdHVmZi4uLgorICBCcmFuY2hJbnN0OjpDcmVhdGUoU3dpdGNoQmxvY2ssIE9yaWdCbG9jayk7CisKKyAgLy8gV2UgYXJlIG5vdyBkb25lIHdpdGggdGhlIHN3aXRjaCBpbnN0cnVjdGlvbiwgZGVsZXRlIGl0LgorICBDdXJCbG9jay0+Z2V0SW5zdExpc3QoKS5lcmFzZShTSSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTkzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIz09PS0gbGliL1RyYW5zZm9ybXMvVXRpbHMvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uCitMSUJSQVJZTkFNRSA9IExMVk1UcmFuc2Zvcm1VdGlscworQlVJTERfQVJDSElWRSA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvUHJvbW90ZU1lbW9yeVRvUmVnaXN0ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvUHJvbW90ZU1lbW9yeVRvUmVnaXN0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZjA2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9Qcm9tb3RlTWVtb3J5VG9SZWdpc3Rlci5jcHAKQEAgLTAsMCArMSw5OTAgQEAKKy8vPT09LSBQcm9tb3RlTWVtb3J5VG9SZWdpc3Rlci5jcHAgLSBDb252ZXJ0IGFsbG9jYXMgdG8gcmVnaXN0ZXJzIC0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb21vdGVzIG1lbW9yeSByZWZlcmVuY2VzIHRvIGJlIHJlZ2lzdGVyIHJlZmVyZW5jZXMuICBJdCBwcm9tb3RlcworLy8gYWxsb2NhIGluc3RydWN0aW9ucyB3aGljaCBvbmx5IGhhdmUgbG9hZHMgYW5kIHN0b3JlcyBhcyB1c2VzLiAgQW4gYWxsb2NhIGlzCisvLyB0cmFuc2Zvcm1lZCBieSB1c2luZyBkb21pbmF0b3IgZnJvbnRpZXJzIHRvIHBsYWNlIFBISSBub2RlcywgdGhlbiB0cmF2ZXJzaW5nCisvLyB0aGUgZnVuY3Rpb24gaW4gZGVwdGgtZmlyc3Qgb3JkZXIgdG8gcmV3cml0ZSBsb2FkcyBhbmQgc3RvcmVzIGFzIGFwcHJvcHJpYXRlLgorLy8gVGhpcyBpcyBqdXN0IHRoZSBzdGFuZGFyZCBTU0EgY29uc3RydWN0aW9uIGFsZ29yaXRobSB0byBjb25zdHJ1Y3QgInBydW5lZCIKKy8vIFNTQSBmb3JtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAibWVtMnJlZyIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvUHJvbW90ZU1lbVRvUmVnLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RlYnVnSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtTG9jYWxQcm9tb3RlZCwgIk51bWJlciBvZiBhbGxvY2EncyBwcm9tb3RlZCB3aXRoaW4gb25lIGJsb2NrIik7CitTVEFUSVNUSUMoTnVtU2luZ2xlU3RvcmUsICAgIk51bWJlciBvZiBhbGxvY2EncyBwcm9tb3RlZCB3aXRoIGEgc2luZ2xlIHN0b3JlIik7CitTVEFUSVNUSUMoTnVtRGVhZEFsbG9jYSwgICAgIk51bWJlciBvZiBkZWFkIGFsbG9jYSdzIHJlbW92ZWQiKTsKK1NUQVRJU1RJQyhOdW1QSElJbnNlcnQsICAgICAiTnVtYmVyIG9mIFBISSBub2RlcyBpbnNlcnRlZCIpOworCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvPHN0ZDo6cGFpcjxCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+ID4geworICB0eXBlZGVmIHN0ZDo6cGFpcjxCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+IEVsdFR5OworICBzdGF0aWMgaW5saW5lIEVsdFR5IGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBFbHRUeShyZWludGVycHJldF9jYXN0PEJhc2ljQmxvY2sqPigtMSksIH4wVSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBFbHRUeSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIEVsdFR5KHJlaW50ZXJwcmV0X2Nhc3Q8QmFzaWNCbG9jayo+KC0yKSwgMFUpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3Qgc3RkOjpwYWlyPEJhc2ljQmxvY2sqLCB1bnNpZ25lZD4gJlZhbCkgeworICAgIHJldHVybiBEZW5zZU1hcEluZm88dm9pZCo+OjpnZXRIYXNoVmFsdWUoVmFsLmZpcnN0KSArIFZhbC5zZWNvbmQqMjsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IEVsdFR5ICZMSFMsIGNvbnN0IEVsdFR5ICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKK30KKworLy8vIGlzQWxsb2NhUHJvbW90YWJsZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgYWxsb2NhIGlzIGxlZ2FsIGZvciBwcm9tb3Rpb24uCisvLy8gVGhpcyBpcyB0cnVlIGlmIHRoZXJlIGFyZSBvbmx5IGxvYWRzIGFuZCBzdG9yZXMgdG8gdGhlIGFsbG9jYS4KKy8vLworYm9vbCBsbHZtOjppc0FsbG9jYVByb21vdGFibGUoY29uc3QgQWxsb2NhSW5zdCAqQUkpIHsKKyAgLy8gRklYTUU6IElmIHRoZSBtZW1vcnkgdW5pdCBpcyBvZiBwb2ludGVyIG9yIGludGVnZXIgdHlwZSwgd2UgY2FuIHBlcm1pdAorICAvLyBhc3NpZ25tZW50cyB0byBzdWJzZWN0aW9ucyBvZiB0aGUgbWVtb3J5IHVuaXQuCisKKyAgLy8gT25seSBhbGxvdyBkaXJlY3QgYW5kIG5vbi12b2xhdGlsZSBsb2FkcyBhbmQgc3RvcmVzLi4uCisgIGZvciAoVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvciBVSSA9IEFJLT51c2VfYmVnaW4oKSwgVUUgPSBBSS0+dXNlX2VuZCgpOworICAgICAgIFVJICE9IFVFOyArK1VJKSB7ICAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdXNlcyBvZiB0aGUgYWxsb2NhCisgICAgY29uc3QgVXNlciAqVSA9ICpVSTsKKyAgICBpZiAoY29uc3QgTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFUpKSB7CisgICAgICBpZiAoTEktPmlzVm9sYXRpbGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoY29uc3QgU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oVSkpIHsKKyAgICAgIGlmIChTSS0+Z2V0T3BlcmFuZCgwKSA9PSBBSSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIERvbid0IGFsbG93IGEgc3RvcmUgT0YgdGhlIEFJLCBvbmx5IElOVE8gdGhlIEFJLgorICAgICAgaWYgKFNJLT5pc1ZvbGF0aWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgQWxsb2NhSW5mbzsKKworICAvLyBEYXRhIHBhY2thZ2UgdXNlZCBieSBSZW5hbWVQYXNzKCkKKyAgY2xhc3MgUmVuYW1lUGFzc0RhdGEgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxWYWx1ZSAqPiBWYWxWZWN0b3I7CisgICAgCisgICAgUmVuYW1lUGFzc0RhdGEoKSA6IEJCKE5VTEwpLCBQcmVkKE5VTEwpLCBWYWx1ZXMoKSB7fQorICAgIFJlbmFtZVBhc3NEYXRhKEJhc2ljQmxvY2sgKkIsIEJhc2ljQmxvY2sgKlAsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsVmVjdG9yICZWKSA6IEJCKEIpLCBQcmVkKFApLCBWYWx1ZXMoVikge30KKyAgICBCYXNpY0Jsb2NrICpCQjsKKyAgICBCYXNpY0Jsb2NrICpQcmVkOworICAgIFZhbFZlY3RvciBWYWx1ZXM7CisgICAgCisgICAgdm9pZCBzd2FwKFJlbmFtZVBhc3NEYXRhICZSSFMpIHsKKyAgICAgIHN0ZDo6c3dhcChCQiwgUkhTLkJCKTsKKyAgICAgIHN0ZDo6c3dhcChQcmVkLCBSSFMuUHJlZCk7CisgICAgICBWYWx1ZXMuc3dhcChSSFMuVmFsdWVzKTsKKyAgICB9CisgIH07CisgIAorICAvLy8gTGFyZ2VCbG9ja0luZm8gLSBUaGlzIGFzc2lnbnMgYW5kIGtlZXBzIGEgcGVyLWJiIHJlbGF0aXZlIG9yZGVyaW5nIG9mCisgIC8vLyBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyBpbiB0aGUgYmxvY2sgdGhhdCBkaXJlY3RseSBsb2FkIG9yIHN0b3JlIGFuIGFsbG9jYS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgaW1wb3J0YW50IGJlY2F1c2UgaXQgYXZvaWRzIHNjYW5uaW5nIGxhcmdlIGJhc2ljCisgIC8vLyBibG9ja3MgbXVsdGlwbGUgdGltZXMgd2hlbiBwcm9tb3RpbmcgbWFueSBhbGxvY2FzIGluIHRoZSBzYW1lIGJsb2NrLgorICBjbGFzcyBMYXJnZUJsb2NrSW5mbyB7CisgICAgLy8vIEluc3ROdW1iZXJzIC0gRm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdGhhdCB3ZSB0cmFjaywga2VlcCB0aGUgaW5kZXggb2YgdGhlCisgICAgLy8vIGluc3RydWN0aW9uLiAgVGhlIGluZGV4IHN0YXJ0cyBvdXQgYXMgdGhlIG51bWJlciBvZiB0aGUgaW5zdHJ1Y3Rpb24gZnJvbQorICAgIC8vLyB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrLgorICAgIERlbnNlTWFwPGNvbnN0IEluc3RydWN0aW9uICosIHVuc2lnbmVkPiBJbnN0TnVtYmVyczsKKyAgcHVibGljOgorICAgIAorICAgIC8vLyBpc0ludGVyZXN0aW5nSW5zdHJ1Y3Rpb24gLSBUaGlzIGNvZGUgb25seSBsb29rcyBhdCBhY2Nlc3NlcyB0byBhbGxvY2FzLgorICAgIHN0YXRpYyBib29sIGlzSW50ZXJlc3RpbmdJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgICAgcmV0dXJuIChpc2E8TG9hZEluc3Q+KEkpICYmIGlzYTxBbGxvY2FJbnN0PihJLT5nZXRPcGVyYW5kKDApKSkgfHwKKyAgICAgICAgICAgICAoaXNhPFN0b3JlSW5zdD4oSSkgJiYgaXNhPEFsbG9jYUluc3Q+KEktPmdldE9wZXJhbmQoMSkpKTsKKyAgICB9CisgICAgCisgICAgLy8vIGdldEluc3RydWN0aW9uSW5kZXggLSBHZXQgb3IgY2FsY3VsYXRlIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkCisgICAgLy8vIGluc3RydWN0aW9uLgorICAgIHVuc2lnbmVkIGdldEluc3RydWN0aW9uSW5kZXgoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICAgIGFzc2VydChpc0ludGVyZXN0aW5nSW5zdHJ1Y3Rpb24oSSkgJiYKKyAgICAgICAgICAgICAiTm90IGEgbG9hZC9zdG9yZSB0by9mcm9tIGFuIGFsbG9jYT8iKTsKKyAgICAgIAorICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgaW5zdHJ1Y3Rpb24gbnVtYmVyLCByZXR1cm4gaXQuCisgICAgICBEZW5zZU1hcDxjb25zdCBJbnN0cnVjdGlvbiAqLCB1bnNpZ25lZD46Oml0ZXJhdG9yIEl0ID0gSW5zdE51bWJlcnMuZmluZChJKTsKKyAgICAgIGlmIChJdCAhPSBJbnN0TnVtYmVycy5lbmQoKSkgcmV0dXJuIEl0LT5zZWNvbmQ7CisgICAgICAKKyAgICAgIC8vIFNjYW4gdGhlIHdob2xlIGJsb2NrIHRvIGdldCB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGFjY3VtdWxhdGVzCisgICAgICAvLyBpbmZvcm1hdGlvbiBmb3IgZXZlcnkgaW50ZXJlc3RpbmcgaW5zdHJ1Y3Rpb24gaW4gdGhlIGJsb2NrLCBpbiBvcmRlciB0bworICAgICAgLy8gYXZvaWQgZ3JhdHVpdHVzIHJlc2NhbnMuCisgICAgICBjb25zdCBCYXNpY0Jsb2NrICpCQiA9IEktPmdldFBhcmVudCgpOworICAgICAgdW5zaWduZWQgSW5zdE5vID0gMDsKKyAgICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgQkJJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7CisgICAgICAgICAgIEJCSSAhPSBFOyArK0JCSSkKKyAgICAgICAgaWYgKGlzSW50ZXJlc3RpbmdJbnN0cnVjdGlvbihCQkkpKQorICAgICAgICAgIEluc3ROdW1iZXJzW0JCSV0gPSBJbnN0Tm8rKzsKKyAgICAgIEl0ID0gSW5zdE51bWJlcnMuZmluZChJKTsKKyAgICAgIAorICAgICAgYXNzZXJ0KEl0ICE9IEluc3ROdW1iZXJzLmVuZCgpICYmICJEaWRuJ3QgaW5zZXJ0IGluc3RydWN0aW9uPyIpOworICAgICAgcmV0dXJuIEl0LT5zZWNvbmQ7CisgICAgfQorICAgIAorICAgIHZvaWQgZGVsZXRlVmFsdWUoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICAgIEluc3ROdW1iZXJzLmVyYXNlKEkpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgSW5zdE51bWJlcnMuY2xlYXIoKTsKKyAgICB9CisgIH07CisKKyAgc3RydWN0IFByb21vdGVNZW0yUmVnIHsKKyAgICAvLy8gQWxsb2NhcyAtIFRoZSBhbGxvY2EgaW5zdHJ1Y3Rpb25zIGJlaW5nIHByb21vdGVkLgorICAgIC8vLworICAgIHN0ZDo6dmVjdG9yPEFsbG9jYUluc3QqPiBBbGxvY2FzOworICAgIERvbWluYXRvclRyZWUgJkRUOworICAgIERvbWluYW5jZUZyb250aWVyICZERjsKKyAgICBESUZhY3RvcnkgKkRJRjsKKworICAgIC8vLyBBU1QgLSBBbiBBbGlhc1NldFRyYWNrZXIgb2JqZWN0IHRvIHVwZGF0ZS4gIElmIG51bGwsIGRvbid0IHVwZGF0ZSBpdC4KKyAgICAvLy8KKyAgICBBbGlhc1NldFRyYWNrZXIgKkFTVDsKKyAgICAKKyAgICAvLy8gQWxsb2NhTG9va3VwIC0gUmV2ZXJzZSBtYXBwaW5nIG9mIEFsbG9jYXMuCisgICAgLy8vCisgICAgc3RkOjptYXA8QWxsb2NhSW5zdCosIHVuc2lnbmVkPiAgQWxsb2NhTG9va3VwOworCisgICAgLy8vIE5ld1BoaU5vZGVzIC0gVGhlIFBoaU5vZGVzIHdlJ3JlIGFkZGluZy4KKyAgICAvLy8KKyAgICBEZW5zZU1hcDxzdGQ6OnBhaXI8QmFzaWNCbG9jayosIHVuc2lnbmVkPiwgUEhJTm9kZSo+IE5ld1BoaU5vZGVzOworICAgIAorICAgIC8vLyBQaGlUb0FsbG9jYU1hcCAtIEZvciBlYWNoIFBISSBub2RlLCBrZWVwIHRyYWNrIG9mIHdoaWNoIGVudHJ5IGluIEFsbG9jYXMKKyAgICAvLy8gaXQgY29ycmVzcG9uZHMgdG8uCisgICAgRGVuc2VNYXA8UEhJTm9kZSosIHVuc2lnbmVkPiBQaGlUb0FsbG9jYU1hcDsKKyAgICAKKyAgICAvLy8gUG9pbnRlckFsbG9jYVZhbHVlcyAtIElmIHdlIGFyZSB1cGRhdGluZyBhbiBBbGlhc1NldFRyYWNrZXIsIHRoZW4gZm9yCisgICAgLy8vIGVhY2ggYWxsb2NhIHRoYXQgaXMgb2YgcG9pbnRlciB0eXBlLCB3ZSBrZWVwIHRyYWNrIG9mIHdoYXQgdG8gY29weVZhbHVlCisgICAgLy8vIHRvIHRoZSBpbnNlcnRlZCBQSEkgbm9kZXMgaGVyZS4KKyAgICAvLy8KKyAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IFBvaW50ZXJBbGxvY2FWYWx1ZXM7CisKKyAgICAvLy8gVmlzaXRlZCAtIFRoZSBzZXQgb2YgYmFzaWMgYmxvY2tzIHRoZSByZW5hbWVyIGhhcyBhbHJlYWR5IHZpc2l0ZWQuCisgICAgLy8vCisgICAgU21hbGxQdHJTZXQ8QmFzaWNCbG9jayosIDE2PiBWaXNpdGVkOworCisgICAgLy8vIEJCTnVtYmVycyAtIENvbnRhaW5zIGEgc3RhYmxlIG51bWJlcmluZyBvZiBiYXNpYyBibG9ja3MgdG8gYXZvaWQKKyAgICAvLy8gbm9uLWRldGVybWluc3RpYyBiZWhhdmlvci4KKyAgICBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+IEJCTnVtYmVyczsKKworICAgIC8vLyBCQk51bVByZWRzIC0gTGF6aWx5IGNvbXB1dGUgdGhlIG51bWJlciBvZiBwcmVkZWNlc3NvcnMgYSBibG9jayBoYXMuCisgICAgRGVuc2VNYXA8Y29uc3QgQmFzaWNCbG9jayosIHVuc2lnbmVkPiBCQk51bVByZWRzOworICBwdWJsaWM6CisgICAgUHJvbW90ZU1lbTJSZWcoY29uc3Qgc3RkOjp2ZWN0b3I8QWxsb2NhSW5zdCo+ICZBLCBEb21pbmF0b3JUcmVlICZkdCwKKyAgICAgICAgICAgICAgICAgICBEb21pbmFuY2VGcm9udGllciAmZGYsIEFsaWFzU2V0VHJhY2tlciAqYXN0KQorICAgICAgOiBBbGxvY2FzKEEpLCBEVChkdCksIERGKGRmKSwgRElGKDApLCBBU1QoYXN0KSB7fQorICAgIH5Qcm9tb3RlTWVtMlJlZygpIHsKKyAgICAgIGRlbGV0ZSBESUY7CisgICAgfQorCisgICAgdm9pZCBydW4oKTsKKworICAgIC8vLyBwcm9wZXJseURvbWluYXRlcyAtIFJldHVybiB0cnVlIGlmIEkxIHByb3Blcmx5IGRvbWluYXRlcyBJMi4KKyAgICAvLy8KKyAgICBib29sIHByb3Blcmx5RG9taW5hdGVzKEluc3RydWN0aW9uICpJMSwgSW5zdHJ1Y3Rpb24gKkkyKSBjb25zdCB7CisgICAgICByZXR1cm4gRFQucHJvcGVybHlEb21pbmF0ZXMoSTEtPmdldFBhcmVudCgpLCBJMi0+Z2V0UGFyZW50KCkpOworICAgIH0KKyAgICAKKyAgICAvLy8gZG9taW5hdGVzIC0gUmV0dXJuIHRydWUgaWYgQkIxIGRvbWluYXRlcyBCQjIgdXNpbmcgdGhlIERvbWluYXRvclRyZWUuCisgICAgLy8vCisgICAgYm9vbCBkb21pbmF0ZXMoQmFzaWNCbG9jayAqQkIxLCBCYXNpY0Jsb2NrICpCQjIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBEVC5kb21pbmF0ZXMoQkIxLCBCQjIpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgUmVtb3ZlRnJvbUFsbG9jYXNMaXN0KHVuc2lnbmVkICZBbGxvY2FJZHgpIHsKKyAgICAgIEFsbG9jYXNbQWxsb2NhSWR4XSA9IEFsbG9jYXMuYmFjaygpOworICAgICAgQWxsb2Nhcy5wb3BfYmFjaygpOworICAgICAgLS1BbGxvY2FJZHg7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0TnVtUHJlZHMoY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgICAgIHVuc2lnbmVkICZOUCA9IEJCTnVtUHJlZHNbQkJdOworICAgICAgaWYgKE5QID09IDApCisgICAgICAgIE5QID0gc3RkOjpkaXN0YW5jZShwcmVkX2JlZ2luKEJCKSwgcHJlZF9lbmQoQkIpKSsxOworICAgICAgcmV0dXJuIE5QLTE7CisgICAgfQorCisgICAgdm9pZCBEZXRlcm1pbmVJbnNlcnRpb25Qb2ludChBbGxvY2FJbnN0ICpBSSwgdW5zaWduZWQgQWxsb2NhTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhSW5mbyAmSW5mbyk7CisgICAgdm9pZCBDb21wdXRlTGl2ZUluQmxvY2tzKEFsbG9jYUluc3QgKkFJLCBBbGxvY2FJbmZvICZJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxQdHJTZXQ8QmFzaWNCbG9jayosIDMyPiAmRGVmQmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgMzI+ICZMaXZlSW5CbG9ja3MpOworICAgIAorICAgIHZvaWQgUmV3cml0ZVNpbmdsZVN0b3JlQWxsb2NhKEFsbG9jYUluc3QgKkFJLCBBbGxvY2FJbmZvICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhcmdlQmxvY2tJbmZvICZMQkkpOworICAgIHZvaWQgUHJvbW90ZVNpbmdsZUJsb2NrQWxsb2NhKEFsbG9jYUluc3QgKkFJLCBBbGxvY2FJbmZvICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhcmdlQmxvY2tJbmZvICZMQkkpOworCisgICAgdm9pZCBSZW5hbWVQYXNzKEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrICpQcmVkLAorICAgICAgICAgICAgICAgICAgICBSZW5hbWVQYXNzRGF0YTo6VmFsVmVjdG9yICZJbmNWYWxzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxSZW5hbWVQYXNzRGF0YT4gJldvcmtsaXN0KTsKKyAgICBib29sIFF1ZXVlUGhpTm9kZShCYXNpY0Jsb2NrICpCQiwgdW5zaWduZWQgQWxsb2NhSWR4LCB1bnNpZ25lZCAmVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldDxQSElOb2RlKiwgMTY+ICZJbnNlcnRlZFBISU5vZGVzKTsKKyAgfTsKKyAgCisgIHN0cnVjdCBBbGxvY2FJbmZvIHsKKyAgICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gRGVmaW5pbmdCbG9ja3M7CisgICAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+IFVzaW5nQmxvY2tzOworICAgIAorICAgIFN0b3JlSW5zdCAgKk9ubHlTdG9yZTsKKyAgICBCYXNpY0Jsb2NrICpPbmx5QmxvY2s7CisgICAgYm9vbCBPbmx5VXNlZEluT25lQmxvY2s7CisgICAgCisgICAgVmFsdWUgKkFsbG9jYVBvaW50ZXJWYWw7CisgICAgCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIERlZmluaW5nQmxvY2tzLmNsZWFyKCk7CisgICAgICBVc2luZ0Jsb2Nrcy5jbGVhcigpOworICAgICAgT25seVN0b3JlID0gMDsKKyAgICAgIE9ubHlCbG9jayA9IDA7CisgICAgICBPbmx5VXNlZEluT25lQmxvY2sgPSB0cnVlOworICAgICAgQWxsb2NhUG9pbnRlclZhbCA9IDA7CisgICAgfQorICAgIAorICAgIC8vLyBBbmFseXplQWxsb2NhIC0gU2NhbiB0aGUgdXNlcyBvZiB0aGUgc3BlY2lmaWVkIGFsbG9jYSwgZmlsbGluZyBpbiBvdXIKKyAgICAvLy8gaXZhcnMuCisgICAgdm9pZCBBbmFseXplQWxsb2NhKEFsbG9jYUluc3QgKkFJKSB7CisgICAgICBjbGVhcigpOworCisgICAgICAvLyBBcyB3ZSBzY2FuIHRoZSB1c2VzIG9mIHRoZSBhbGxvY2EgaW5zdHJ1Y3Rpb24sIGtlZXAgdHJhY2sgb2Ygc3RvcmVzLAorICAgICAgLy8gYW5kIGRlY2lkZSB3aGV0aGVyIGFsbCBvZiB0aGUgbG9hZHMgYW5kIHN0b3JlcyB0byB0aGUgYWxsb2NhIGFyZSB3aXRoaW4KKyAgICAgIC8vIHRoZSBzYW1lIGJhc2ljIGJsb2NrLgorICAgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gQUktPnVzZV9iZWdpbigpLCBFID0gQUktPnVzZV9lbmQoKTsKKyAgICAgICAgICAgVUkgIT0gRTspICB7CisgICAgICAgIEluc3RydWN0aW9uICpVc2VyID0gY2FzdDxJbnN0cnVjdGlvbj4oKlVJKyspOworCisgICAgICAgIGlmIChTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihVc2VyKSkgeworICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBiYXNpYyBibG9ja3Mgd2hpY2ggZGVmaW5lIG5ldyB2YWx1ZXMgZm9yIHRoZSBhbGxvY2EKKyAgICAgICAgICBEZWZpbmluZ0Jsb2Nrcy5wdXNoX2JhY2soU0ktPmdldFBhcmVudCgpKTsKKyAgICAgICAgICBBbGxvY2FQb2ludGVyVmFsID0gU0ktPmdldE9wZXJhbmQoMCk7CisgICAgICAgICAgT25seVN0b3JlID0gU0k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTG9hZEluc3QgKkxJID0gY2FzdDxMb2FkSW5zdD4oVXNlcik7CisgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0IG11c3QgYmUgYSBsb2FkIGluc3RydWN0aW9uLCBrZWVwIHRyYWNrIG9mIHZhcmlhYmxlCisgICAgICAgICAgLy8gcmVhZHMuCisgICAgICAgICAgVXNpbmdCbG9ja3MucHVzaF9iYWNrKExJLT5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgQWxsb2NhUG9pbnRlclZhbCA9IExJOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoT25seVVzZWRJbk9uZUJsb2NrKSB7CisgICAgICAgICAgaWYgKE9ubHlCbG9jayA9PSAwKQorICAgICAgICAgICAgT25seUJsb2NrID0gVXNlci0+Z2V0UGFyZW50KCk7CisgICAgICAgICAgZWxzZSBpZiAoT25seUJsb2NrICE9IFVzZXItPmdldFBhcmVudCgpKQorICAgICAgICAgICAgT25seVVzZWRJbk9uZUJsb2NrID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07Cit9ICAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisKK3ZvaWQgUHJvbW90ZU1lbTJSZWc6OnJ1bigpIHsKKyAgRnVuY3Rpb24gJkYgPSAqREYuZ2V0Um9vdCgpLT5nZXRQYXJlbnQoKTsKKworICBpZiAoQVNUKSBQb2ludGVyQWxsb2NhVmFsdWVzLnJlc2l6ZShBbGxvY2FzLnNpemUoKSk7CisKKyAgQWxsb2NhSW5mbyBJbmZvOworICBMYXJnZUJsb2NrSW5mbyBMQkk7CisKKyAgZm9yICh1bnNpZ25lZCBBbGxvY2FOdW0gPSAwOyBBbGxvY2FOdW0gIT0gQWxsb2Nhcy5zaXplKCk7ICsrQWxsb2NhTnVtKSB7CisgICAgQWxsb2NhSW5zdCAqQUkgPSBBbGxvY2FzW0FsbG9jYU51bV07CisKKyAgICBhc3NlcnQoaXNBbGxvY2FQcm9tb3RhYmxlKEFJKSAmJgorICAgICAgICAgICAiQ2Fubm90IHByb21vdGUgbm9uLXByb21vdGFibGUgYWxsb2NhISIpOworICAgIGFzc2VydChBSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpID09ICZGICYmCisgICAgICAgICAgICJBbGwgYWxsb2NhcyBzaG91bGQgYmUgaW4gdGhlIHNhbWUgZnVuY3Rpb24sIHdoaWNoIGlzIHNhbWUgYXMgREYhIik7CisKKyAgICBpZiAoQUktPnVzZV9lbXB0eSgpKSB7CisgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gdXNlcyBvZiB0aGUgYWxsb2NhLCBqdXN0IGRlbGV0ZSBpdCBub3cuCisgICAgICBpZiAoQVNUKSBBU1QtPmRlbGV0ZVZhbHVlKEFJKTsKKyAgICAgIEFJLT5lcmFzZUZyb21QYXJlbnQoKTsKKworICAgICAgLy8gUmVtb3ZlIHRoZSBhbGxvY2EgZnJvbSB0aGUgQWxsb2NhcyBsaXN0LCBzaW5jZSBpdCBoYXMgYmVlbiBwcm9jZXNzZWQKKyAgICAgIFJlbW92ZUZyb21BbGxvY2FzTGlzdChBbGxvY2FOdW0pOworICAgICAgKytOdW1EZWFkQWxsb2NhOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8vIENhbGN1bGF0ZSB0aGUgc2V0IG9mIHJlYWQgYW5kIHdyaXRlLWxvY2F0aW9ucyBmb3IgZWFjaCBhbGxvY2EuICBUaGlzIGlzCisgICAgLy8gYW5hbG9nb3VzIHRvIGZpbmRpbmcgdGhlICd1c2VzJyBhbmQgJ2RlZmluaXRpb25zJyBvZiBlYWNoIHZhcmlhYmxlLgorICAgIEluZm8uQW5hbHl6ZUFsbG9jYShBSSk7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHN0b3JlIHRvIHRoaXMgdmFsdWUsIHJlcGxhY2UgYW55IGxvYWRzIG9mCisgICAgLy8gaXQgdGhhdCBhcmUgZGlyZWN0bHkgZG9taW5hdGVkIGJ5IHRoZSBkZWZpbml0aW9uIHdpdGggdGhlIHZhbHVlIHN0b3JlZC4KKyAgICBpZiAoSW5mby5EZWZpbmluZ0Jsb2Nrcy5zaXplKCkgPT0gMSkgeworICAgICAgUmV3cml0ZVNpbmdsZVN0b3JlQWxsb2NhKEFJLCBJbmZvLCBMQkkpOworCisgICAgICAvLyBGaW5hbGx5LCBhZnRlciB0aGUgc2NhbiwgY2hlY2sgdG8gc2VlIGlmIHRoZSBzdG9yZSBpcyBhbGwgdGhhdCBpcyBsZWZ0LgorICAgICAgaWYgKEluZm8uVXNpbmdCbG9ja3MuZW1wdHkoKSkgeworICAgICAgICAvLyBSZW1vdmUgdGhlIChub3cgZGVhZCkgc3RvcmUgYW5kIGFsbG9jYS4KKyAgICAgICAgSW5mby5Pbmx5U3RvcmUtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICBMQkkuZGVsZXRlVmFsdWUoSW5mby5Pbmx5U3RvcmUpOworCisgICAgICAgIGlmIChBU1QpIEFTVC0+ZGVsZXRlVmFsdWUoQUkpOworICAgICAgICBBSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIExCSS5kZWxldGVWYWx1ZShBSSk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUgYWxsb2NhIGhhcyBiZWVuIHByb2Nlc3NlZCwgbW92ZSBvbi4KKyAgICAgICAgUmVtb3ZlRnJvbUFsbG9jYXNMaXN0KEFsbG9jYU51bSk7CisgICAgICAgIAorICAgICAgICArK051bVNpbmdsZVN0b3JlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gSWYgdGhlIGFsbG9jYSBpcyBvbmx5IHJlYWQgYW5kIHdyaXR0ZW4gaW4gb25lIGJhc2ljIGJsb2NrLCBqdXN0IHBlcmZvcm0gYQorICAgIC8vIGxpbmVhciBzd2VlcCBvdmVyIHRoZSBibG9jayB0byBlbGltaW5hdGUgaXQuCisgICAgaWYgKEluZm8uT25seVVzZWRJbk9uZUJsb2NrKSB7CisgICAgICBQcm9tb3RlU2luZ2xlQmxvY2tBbGxvY2EoQUksIEluZm8sIExCSSk7CisgICAgICAKKyAgICAgIC8vIEZpbmFsbHksIGFmdGVyIHRoZSBzY2FuLCBjaGVjayB0byBzZWUgaWYgdGhlIHN0b3JlcyBhcmUgYWxsIHRoYXQgaXMKKyAgICAgIC8vIGxlZnQuCisgICAgICBpZiAoSW5mby5Vc2luZ0Jsb2Nrcy5lbXB0eSgpKSB7CisgICAgICAgIAorICAgICAgICAvLyBSZW1vdmUgdGhlIChub3cgZGVhZCkgc3RvcmVzIGFuZCBhbGxvY2EuCisgICAgICAgIHdoaWxlICghQUktPnVzZV9lbXB0eSgpKSB7CisgICAgICAgICAgU3RvcmVJbnN0ICpTSSA9IGNhc3Q8U3RvcmVJbnN0PihBSS0+dXNlX2JhY2soKSk7CisgICAgICAgICAgU0ktPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICAgIExCSS5kZWxldGVWYWx1ZShTSSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChBU1QpIEFTVC0+ZGVsZXRlVmFsdWUoQUkpOworICAgICAgICBBSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICAgIExCSS5kZWxldGVWYWx1ZShBSSk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUgYWxsb2NhIGhhcyBiZWVuIHByb2Nlc3NlZCwgbW92ZSBvbi4KKyAgICAgICAgUmVtb3ZlRnJvbUFsbG9jYXNMaXN0KEFsbG9jYU51bSk7CisKKyAgICAgICAgKytOdW1Mb2NhbFByb21vdGVkOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gSWYgd2UgaGF2ZW4ndCBjb21wdXRlZCBhIG51bWJlcmluZyBmb3IgdGhlIEJCJ3MgaW4gdGhlIGZ1bmN0aW9uLCBkbyBzbworICAgIC8vIG5vdy4KKyAgICBpZiAoQkJOdW1iZXJzLmVtcHR5KCkpIHsKKyAgICAgIHVuc2lnbmVkIElEID0gMDsKKyAgICAgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgQkJOdW1iZXJzW0ldID0gSUQrKzsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBoYXZlIGFuIEFTVCB0byBrZWVwIHVwZGF0ZWQsIHJlbWVtYmVyIHNvbWUgcG9pbnRlciB2YWx1ZSB0aGF0IGlzCisgICAgLy8gc3RvcmVkIGludG8gdGhlIGFsbG9jYS4KKyAgICBpZiAoQVNUKQorICAgICAgUG9pbnRlckFsbG9jYVZhbHVlc1tBbGxvY2FOdW1dID0gSW5mby5BbGxvY2FQb2ludGVyVmFsOworICAgIAorICAgIC8vIEtlZXAgdGhlIHJldmVyc2UgbWFwcGluZyBvZiB0aGUgJ0FsbG9jYXMnIGFycmF5IGZvciB0aGUgcmVuYW1lIHBhc3MuCisgICAgQWxsb2NhTG9va3VwW0FsbG9jYXNbQWxsb2NhTnVtXV0gPSBBbGxvY2FOdW07CisKKyAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSdyZSBjb21taXR0ZWQgdG8gcHJvbW90aW5nIHRoZSBhbGxvY2EgdXNpbmcgSURGJ3MsIGFuZAorICAgIC8vIHRoZSBzdGFuZGFyZCBTU0EgY29uc3RydWN0aW9uIGFsZ29yaXRobS4gIERldGVybWluZSB3aGljaCBibG9ja3MgbmVlZCBQSEkKKyAgICAvLyBub2RlcyBhbmQgc2VlIGlmIHdlIGNhbiBvcHRpbWl6ZSBvdXQgc29tZSB3b3JrIGJ5IGF2b2lkaW5nIGluc2VydGlvbiBvZgorICAgIC8vIGRlYWQgcGhpIG5vZGVzLgorICAgIERldGVybWluZUluc2VydGlvblBvaW50KEFJLCBBbGxvY2FOdW0sIEluZm8pOworICB9CisKKyAgaWYgKEFsbG9jYXMuZW1wdHkoKSkKKyAgICByZXR1cm47IC8vIEFsbCBvZiB0aGUgYWxsb2NhcyBtdXN0IGhhdmUgYmVlbiB0cml2aWFsIQorCisgIExCSS5jbGVhcigpOworICAKKyAgCisgIC8vIFNldCB0aGUgaW5jb21pbmcgdmFsdWVzIGZvciB0aGUgYmFzaWMgYmxvY2sgdG8gYmUgbnVsbCB2YWx1ZXMgZm9yIGFsbCBvZgorICAvLyB0aGUgYWxsb2NhJ3MuICBXZSBkbyB0aGlzIGluIGNhc2UgdGhlcmUgaXMgYSBsb2FkIG9mIGEgdmFsdWUgdGhhdCBoYXMgbm90CisgIC8vIGJlZW4gc3RvcmVkIHlldC4gIEluIHRoaXMgY2FzZSwgaXQgd2lsbCBnZXQgdGhpcyBudWxsIHZhbHVlLgorICAvLworICBSZW5hbWVQYXNzRGF0YTo6VmFsVmVjdG9yIFZhbHVlcyhBbGxvY2FzLnNpemUoKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBbGxvY2FzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgVmFsdWVzW2ldID0gVW5kZWZWYWx1ZTo6Z2V0KEFsbG9jYXNbaV0tPmdldEFsbG9jYXRlZFR5cGUoKSk7CisKKyAgLy8gV2Fsa3MgYWxsIGJhc2ljIGJsb2NrcyBpbiB0aGUgZnVuY3Rpb24gcGVyZm9ybWluZyB0aGUgU1NBIHJlbmFtZSBhbGdvcml0aG0KKyAgLy8gYW5kIGluc2VydGluZyB0aGUgcGhpIG5vZGVzIHdlIG1hcmtlZCBhcyBuZWNlc3NhcnkKKyAgLy8KKyAgc3RkOjp2ZWN0b3I8UmVuYW1lUGFzc0RhdGE+IFJlbmFtZVBhc3NXb3JrTGlzdDsKKyAgUmVuYW1lUGFzc1dvcmtMaXN0LnB1c2hfYmFjayhSZW5hbWVQYXNzRGF0YShGLmJlZ2luKCksIDAsIFZhbHVlcykpOworICBkbyB7CisgICAgUmVuYW1lUGFzc0RhdGEgUlBEOworICAgIFJQRC5zd2FwKFJlbmFtZVBhc3NXb3JrTGlzdC5iYWNrKCkpOworICAgIFJlbmFtZVBhc3NXb3JrTGlzdC5wb3BfYmFjaygpOworICAgIC8vIFJlbmFtZVBhc3MgbWF5IGFkZCBuZXcgd29ya2xpc3QgZW50cmllcy4KKyAgICBSZW5hbWVQYXNzKFJQRC5CQiwgUlBELlByZWQsIFJQRC5WYWx1ZXMsIFJlbmFtZVBhc3NXb3JrTGlzdCk7CisgIH0gd2hpbGUgKCFSZW5hbWVQYXNzV29ya0xpc3QuZW1wdHkoKSk7CisgIAorICAvLyBUaGUgcmVuYW1lciB1c2VzIHRoZSBWaXNpdGVkIHNldCB0byBhdm9pZCBpbmZpbml0ZSBsb29wcy4gIENsZWFyIGl0IG5vdy4KKyAgVmlzaXRlZC5jbGVhcigpOworCisgIC8vIFJlbW92ZSB0aGUgYWxsb2NhcyB0aGVtc2VsdmVzIGZyb20gdGhlIGZ1bmN0aW9uLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQWxsb2Nhcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgSW5zdHJ1Y3Rpb24gKkEgPSBBbGxvY2FzW2ldOworCisgICAgLy8gSWYgdGhlcmUgYXJlIGFueSB1c2VzIG9mIHRoZSBhbGxvY2EgaW5zdHJ1Y3Rpb25zIGxlZnQsIHRoZXkgbXVzdCBiZSBpbgorICAgIC8vIHNlY3Rpb25zIG9mIGRlYWQgY29kZSB0aGF0IHdlcmUgbm90IHByb2Nlc3NlZCBvbiB0aGUgZG9taW5hbmNlIGZyb250aWVyLgorICAgIC8vIEp1c3QgZGVsZXRlIHRoZSB1c2VycyBub3cuCisgICAgLy8KKyAgICBpZiAoIUEtPnVzZV9lbXB0eSgpKQorICAgICAgQS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChBLT5nZXRUeXBlKCkpKTsKKyAgICBpZiAoQVNUKSBBU1QtPmRlbGV0ZVZhbHVlKEEpOworICAgIEEtPmVyYXNlRnJvbVBhcmVudCgpOworICB9CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgUEhJIG5vZGVzIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueSB0aGF0IHdlIGNhbiBnZXQKKyAgLy8gcmlkIG9mIGJlY2F1c2UgdGhleSBtZXJnZSBhbGwgb2YgdGhlIHNhbWUgaW5jb21pbmcgdmFsdWVzLiAgVGhpcyBjYW4KKyAgLy8gaGFwcGVuIGR1ZSB0byB1bmRlZiB2YWx1ZXMgY29taW5nIGludG8gdGhlIFBISSBub2Rlcy4gIFRoaXMgcHJvY2VzcyBpcworICAvLyBpdGVyYXRpdmUsIGJlY2F1c2UgZWxpbWluYXRpbmcgb25lIFBISSBub2RlIGNhbiBjYXVzZSBvdGhlcnMgdG8gYmUgcmVtb3ZlZC4KKyAgYm9vbCBFbGltaW5hdGVkQVBISSA9IHRydWU7CisgIHdoaWxlIChFbGltaW5hdGVkQVBISSkgeworICAgIEVsaW1pbmF0ZWRBUEhJID0gZmFsc2U7CisgICAgCisgICAgZm9yIChEZW5zZU1hcDxzdGQ6OnBhaXI8QmFzaWNCbG9jayosIHVuc2lnbmVkPiwgUEhJTm9kZSo+OjppdGVyYXRvciBJID0KKyAgICAgICAgICAgTmV3UGhpTm9kZXMuYmVnaW4oKSwgRSA9IE5ld1BoaU5vZGVzLmVuZCgpOyBJICE9IEU7KSB7CisgICAgICBQSElOb2RlICpQTiA9IEktPnNlY29uZDsKKyAgICAgIAorICAgICAgLy8gSWYgdGhpcyBQSEkgbm9kZSBtZXJnZXMgb25lIHZhbHVlIGFuZC9vciB1bmRlZnMsIGdldCB0aGUgdmFsdWUuCisgICAgICBpZiAoVmFsdWUgKlYgPSBQTi0+aGFzQ29uc3RhbnRWYWx1ZSgmRFQpKSB7CisgICAgICAgIGlmIChBU1QgJiYgUE4tPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgICAgICBBU1QtPmRlbGV0ZVZhbHVlKFBOKTsKKyAgICAgICAgUE4tPnJlcGxhY2VBbGxVc2VzV2l0aChWKTsKKyAgICAgICAgUE4tPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgICBOZXdQaGlOb2Rlcy5lcmFzZShJKyspOworICAgICAgICBFbGltaW5hdGVkQVBISSA9IHRydWU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgKytJOworICAgIH0KKyAgfQorICAKKyAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJlbmFtZXIgaGFzIGFkZGVkIGVudHJpZXMgdG8gUEhJIG5vZGVzIGZvciBhbGwgcmVhY2hhYmxlCisgIC8vIGNvZGUuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBtYXkgYmUgdW5yZWFjaGFibGUgYmxvY2tzIHdoaWNoIHRoZSByZW5hbWVyCisgIC8vIGhhc24ndCB0cmF2ZXJzZWQuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgUEhJIG5vZGVzIG1heSBub3QKKyAgLy8gaGF2ZSBpbmNvbWluZyB2YWx1ZXMgZm9yIGFsbCBwcmVkZWNlc3NvcnMuICBMb29wIG92ZXIgYWxsIFBISSBub2RlcyB3ZSBoYXZlCisgIC8vIGNyZWF0ZWQsIGluc2VydGluZyB1bmRlZiB2YWx1ZXMgaWYgdGhleSBhcmUgbWlzc2luZyBhbnkgaW5jb21pbmcgdmFsdWVzLgorICAvLworICBmb3IgKERlbnNlTWFwPHN0ZDo6cGFpcjxCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+LCBQSElOb2RlKj46Oml0ZXJhdG9yIEkgPQorICAgICAgICAgTmV3UGhpTm9kZXMuYmVnaW4oKSwgRSA9IE5ld1BoaU5vZGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIC8vIFdlIHdhbnQgdG8gZG8gdGhpcyBvbmNlIHBlciBiYXNpYyBibG9jay4gIEFzIHN1Y2gsIG9ubHkgcHJvY2VzcyBhIGJsb2NrCisgICAgLy8gd2hlbiB3ZSBmaW5kIHRoZSBQSEkgdGhhdCBpcyB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGJsb2NrLgorICAgIFBISU5vZGUgKlNvbWVQSEkgPSBJLT5zZWNvbmQ7CisgICAgQmFzaWNCbG9jayAqQkIgPSBTb21lUEhJLT5nZXRQYXJlbnQoKTsKKyAgICBpZiAoJkJCLT5mcm9udCgpICE9IFNvbWVQSEkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIE9ubHkgZG8gd29yayBoZXJlIGlmIHRoZXJlIHRoZSBQSEkgbm9kZXMgYXJlIG1pc3NpbmcgaW5jb21pbmcgdmFsdWVzLiAgV2UKKyAgICAvLyBrbm93IHRoYXQgYWxsIFBISSBub2RlcyB0aGF0IHdlcmUgaW5zZXJ0ZWQgaW4gYSBibG9jayB3aWxsIGhhdmUgdGhlIHNhbWUKKyAgICAvLyBudW1iZXIgb2YgaW5jb21pbmcgdmFsdWVzLCBzbyB3ZSBjYW4ganVzdCBjaGVjayBhbnkgb2YgdGhlbS4KKyAgICBpZiAoU29tZVBISS0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKSA9PSBnZXROdW1QcmVkcyhCQikpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEdldCB0aGUgcHJlZHMgZm9yIEJCLgorICAgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCAxNj4gUHJlZHMocHJlZF9iZWdpbihCQiksIHByZWRfZW5kKEJCKSk7CisgICAgCisgICAgLy8gT2ssIG5vdyB3ZSBrbm93IHRoYXQgYWxsIG9mIHRoZSBQSEkgbm9kZXMgYXJlIG1pc3NpbmcgZW50cmllcyBmb3Igc29tZQorICAgIC8vIGJhc2ljIGJsb2Nrcy4gIFN0YXJ0IGJ5IHNvcnRpbmcgdGhlIGluY29taW5nIHByZWRlY2Vzc29ycyBmb3IgZWZmaWNpZW50CisgICAgLy8gYWNjZXNzLgorICAgIHN0ZDo6c29ydChQcmVkcy5iZWdpbigpLCBQcmVkcy5lbmQoKSk7CisgICAgCisgICAgLy8gTm93IHdlIGxvb3AgdGhyb3VnaCBhbGwgQkIncyB3aGljaCBoYXZlIGVudHJpZXMgaW4gU29tZVBISSBhbmQgcmVtb3ZlCisgICAgLy8gdGhlbSBmcm9tIHRoZSBQcmVkcyBsaXN0LgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTb21lUEhJLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgICAgLy8gRG8gYSBsb2cobikgc2VhcmNoIG9mIHRoZSBQcmVkcyBsaXN0IGZvciB0aGUgZW50cnkgd2Ugd2FudC4KKyAgICAgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCAxNj46Oml0ZXJhdG9yIEVudEl0ID0KKyAgICAgICAgc3RkOjpsb3dlcl9ib3VuZChQcmVkcy5iZWdpbigpLCBQcmVkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb21lUEhJLT5nZXRJbmNvbWluZ0Jsb2NrKGkpKTsKKyAgICAgIGFzc2VydChFbnRJdCAhPSBQcmVkcy5lbmQoKSAmJiAqRW50SXQgPT0gU29tZVBISS0+Z2V0SW5jb21pbmdCbG9jayhpKSYmCisgICAgICAgICAgICAgIlBISSBub2RlIGhhcyBlbnRyeSBmb3IgYSBibG9jayB3aGljaCBpcyBub3QgYSBwcmVkZWNlc3NvciEiKTsKKworICAgICAgLy8gUmVtb3ZlIHRoZSBlbnRyeQorICAgICAgUHJlZHMuZXJhc2UoRW50SXQpOworICAgIH0KKworICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBibG9ja3MgbGVmdCBpbiB0aGUgcHJlZHMgbGlzdCBtdXN0IGhhdmUgZHVtbXkKKyAgICAvLyBlbnRyaWVzIGluc2VydGVkIGludG8gZXZlcnkgUEhJIG5vZGVzIGZvciB0aGUgYmxvY2suICBVcGRhdGUgYWxsIHRoZSBwaGkKKyAgICAvLyBub2RlcyBpbiB0aGlzIGJsb2NrIHRoYXQgd2UgYXJlIGluc2VydGluZyAodGhlcmUgY291bGQgYmUgcGhpcyBiZWZvcmUKKyAgICAvLyBtZW0ycmVnIHJ1bnMpLgorICAgIHVuc2lnbmVkIE51bUJhZFByZWRzID0gU29tZVBISS0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsKKyAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSBCQi0+YmVnaW4oKTsKKyAgICB3aGlsZSAoKFNvbWVQSEkgPSBkeW5fY2FzdDxQSElOb2RlPihCQkkrKykpICYmCisgICAgICAgICAgIFNvbWVQSEktPmdldE51bUluY29taW5nVmFsdWVzKCkgPT0gTnVtQmFkUHJlZHMpIHsKKyAgICAgIFZhbHVlICpVbmRlZlZhbCA9IFVuZGVmVmFsdWU6OmdldChTb21lUEhJLT5nZXRUeXBlKCkpOworICAgICAgZm9yICh1bnNpZ25lZCBwcmVkID0gMCwgZSA9IFByZWRzLnNpemUoKTsgcHJlZCAhPSBlOyArK3ByZWQpCisgICAgICAgIFNvbWVQSEktPmFkZEluY29taW5nKFVuZGVmVmFsLCBQcmVkc1twcmVkXSk7CisgICAgfQorICB9CisgICAgICAgIAorICBOZXdQaGlOb2Rlcy5jbGVhcigpOworfQorCisKKy8vLyBDb21wdXRlTGl2ZUluQmxvY2tzIC0gRGV0ZXJtaW5lIHdoaWNoIGJsb2NrcyB0aGUgdmFsdWUgaXMgbGl2ZSBpbi4gIFRoZXNlCisvLy8gYXJlIGJsb2NrcyB3aGljaCBsZWFkIHRvIHVzZXMuICBLbm93aW5nIHRoaXMgYWxsb3dzIHVzIHRvIGF2b2lkIGluc2VydGluZworLy8vIFBISSBub2RlcyBpbnRvIGJsb2NrcyB3aGljaCBkb24ndCBsZWFkIHRvIHVzZXMgKHRodXMsIHRoZSBpbnNlcnRlZCBwaGkgbm9kZXMKKy8vLyB3b3VsZCBiZSBkZWFkKS4KK3ZvaWQgUHJvbW90ZU1lbTJSZWc6OgorQ29tcHV0ZUxpdmVJbkJsb2NrcyhBbGxvY2FJbnN0ICpBSSwgQWxsb2NhSW5mbyAmSW5mbywgCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sqLCAzMj4gJkRlZkJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8QmFzaWNCbG9jayosIDMyPiAmTGl2ZUluQmxvY2tzKSB7CisgIAorICAvLyBUbyBkZXRlcm1pbmUgbGl2ZW5lc3MsIHdlIG11c3QgaXRlcmF0ZSB0aHJvdWdoIHRoZSBwcmVkZWNlc3NvcnMgb2YgYmxvY2tzCisgIC8vIHdoZXJlIHRoZSBkZWYgaXMgbGl2ZS4gIEJsb2NrcyBhcmUgYWRkZWQgdG8gdGhlIHdvcmtsaXN0IGlmIHdlIG5lZWQgdG8KKyAgLy8gY2hlY2sgdGhlaXIgcHJlZGVjZXNzb3JzLiAgU3RhcnQgd2l0aCBhbGwgdGhlIHVzaW5nIGJsb2Nrcy4KKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDY0PiBMaXZlSW5CbG9ja1dvcmtsaXN0KEluZm8uVXNpbmdCbG9ja3MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8uVXNpbmdCbG9ja3MuZW5kKCkpOworICAKKyAgLy8gSWYgYW55IG9mIHRoZSB1c2luZyBibG9ja3MgaXMgYWxzbyBhIGRlZmluaXRpb24gYmxvY2ssIGNoZWNrIHRvIHNlZSBpZiB0aGUKKyAgLy8gZGVmaW5pdGlvbiBvY2N1cnMgYmVmb3JlIG9yIGFmdGVyIHRoZSB1c2UuICBJZiBpdCBoYXBwZW5zIGJlZm9yZSB0aGUgdXNlLAorICAvLyB0aGUgdmFsdWUgaXNuJ3QgcmVhbGx5IGxpdmUtaW4uCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMaXZlSW5CbG9ja1dvcmtsaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBCYXNpY0Jsb2NrICpCQiA9IExpdmVJbkJsb2NrV29ya2xpc3RbaV07CisgICAgaWYgKCFEZWZCbG9ja3MuY291bnQoQkIpKSBjb250aW51ZTsKKyAgICAKKyAgICAvLyBPa2F5LCB0aGlzIGlzIGEgYmxvY2sgdGhhdCBib3RoIHVzZXMgYW5kIGRlZmluZXMgdGhlIHZhbHVlLiAgSWYgdGhlIGZpcnN0CisgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSBhbGxvY2EgaXMgYSBkZWYgKHN0b3JlKSwgdGhlbiB3ZSBrbm93IGl0IGlzbid0IGxpdmUtaW4uCisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQkItPmJlZ2luKCk7IDsgKytJKSB7CisgICAgICBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oSSkpIHsKKyAgICAgICAgaWYgKFNJLT5nZXRPcGVyYW5kKDEpICE9IEFJKSBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFdlIGZvdW5kIGEgc3RvcmUgdG8gdGhlIGFsbG9jYSBiZWZvcmUgYSBsb2FkLiAgVGhlIGFsbG9jYSBpcyBub3QKKyAgICAgICAgLy8gYWN0dWFsbHkgbGl2ZS1pbiBoZXJlLgorICAgICAgICBMaXZlSW5CbG9ja1dvcmtsaXN0W2ldID0gTGl2ZUluQmxvY2tXb3JrbGlzdC5iYWNrKCk7CisgICAgICAgIExpdmVJbkJsb2NrV29ya2xpc3QucG9wX2JhY2soKTsKKyAgICAgICAgLS1pLCAtLWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KEkpKSB7CisgICAgICAgIGlmIChMSS0+Z2V0T3BlcmFuZCgwKSAhPSBBSSkgY29udGludWU7CisgICAgICAgIAorICAgICAgICAvLyBPa2F5LCB3ZSBmb3VuZCBhIGxvYWQgYmVmb3JlIGEgc3RvcmUgdG8gdGhlIGFsbG9jYS4gIEl0IGlzIGFjdHVhbGx5CisgICAgICAgIC8vIGxpdmUgaW50byB0aGlzIGJsb2NrLgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBzZXQgb2YgYmxvY2tzIHdoZXJlIHRoZSBwaGkgaXMgbGl2ZS1pbiwgcmVjdXJzaXZlbHkgYWRkCisgIC8vIHRoZWlyIHByZWRlY2Vzc29ycyB1bnRpbCB3ZSBmaW5kIHRoZSBmdWxsIHJlZ2lvbiB0aGUgdmFsdWUgaXMgbGl2ZS4KKyAgd2hpbGUgKCFMaXZlSW5CbG9ja1dvcmtsaXN0LmVtcHR5KCkpIHsKKyAgICBCYXNpY0Jsb2NrICpCQiA9IExpdmVJbkJsb2NrV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgCisgICAgLy8gVGhlIGJsb2NrIHJlYWxseSBpcyBsaXZlIGluIGhlcmUsIGluc2VydCBpdCBpbnRvIHRoZSBzZXQuICBJZiBhbHJlYWR5IGluCisgICAgLy8gdGhlIHNldCwgdGhlbiBpdCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4KKyAgICBpZiAoIUxpdmVJbkJsb2Nrcy5pbnNlcnQoQkIpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgLy8gU2luY2UgdGhlIHZhbHVlIGlzIGxpdmUgaW50byBCQiwgaXQgaXMgZWl0aGVyIGRlZmluZWQgaW4gYSBwcmVkZWNlc3NvciBvcgorICAgIC8vIGxpdmUgaW50byBpdCB0by4gIEFkZCB0aGUgcHJlZHMgdG8gdGhlIHdvcmtsaXN0IHVubGVzcyB0aGV5IGFyZSBhCisgICAgLy8gZGVmaW5pbmcgYmxvY2suCisgICAgZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihCQiksIEUgPSBwcmVkX2VuZChCQik7IFBJICE9IEU7ICsrUEkpIHsKKyAgICAgIEJhc2ljQmxvY2sgKlAgPSAqUEk7CisgICAgICAKKyAgICAgIC8vIFRoZSB2YWx1ZSBpcyBub3QgbGl2ZSBpbnRvIGEgcHJlZGVjZXNzb3IgaWYgaXQgZGVmaW5lcyB0aGUgdmFsdWUuCisgICAgICBpZiAoRGVmQmxvY2tzLmNvdW50KFApKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgLy8gT3RoZXJ3aXNlIGl0IGlzLCBhZGQgdG8gdGhlIHdvcmtsaXN0LgorICAgICAgTGl2ZUluQmxvY2tXb3JrbGlzdC5wdXNoX2JhY2soUCk7CisgICAgfQorICB9Cit9CisKKy8vLyBEZXRlcm1pbmVJbnNlcnRpb25Qb2ludCAtIEF0IHRoaXMgcG9pbnQsIHdlJ3JlIGNvbW1pdHRlZCB0byBwcm9tb3RpbmcgdGhlCisvLy8gYWxsb2NhIHVzaW5nIElERidzLCBhbmQgdGhlIHN0YW5kYXJkIFNTQSBjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLiAgRGV0ZXJtaW5lCisvLy8gd2hpY2ggYmxvY2tzIG5lZWQgcGhpIG5vZGVzIGFuZCBzZWUgaWYgd2UgY2FuIG9wdGltaXplIG91dCBzb21lIHdvcmsgYnkKKy8vLyBhdm9pZGluZyBpbnNlcnRpb24gb2YgZGVhZCBwaGkgbm9kZXMuCit2b2lkIFByb21vdGVNZW0yUmVnOjpEZXRlcm1pbmVJbnNlcnRpb25Qb2ludChBbGxvY2FJbnN0ICpBSSwgdW5zaWduZWQgQWxsb2NhTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhSW5mbyAmSW5mbykgeworCisgIC8vIFVuaXF1ZSB0aGUgc2V0IG9mIGRlZmluaW5nIGJsb2NrcyBmb3IgZWZmaWNpZW50IGxvb2t1cC4KKyAgU21hbGxQdHJTZXQ8QmFzaWNCbG9jayosIDMyPiBEZWZCbG9ja3M7CisgIERlZkJsb2Nrcy5pbnNlcnQoSW5mby5EZWZpbmluZ0Jsb2Nrcy5iZWdpbigpLCBJbmZvLkRlZmluaW5nQmxvY2tzLmVuZCgpKTsKKworICAvLyBEZXRlcm1pbmUgd2hpY2ggYmxvY2tzIHRoZSB2YWx1ZSBpcyBsaXZlIGluLiAgVGhlc2UgYXJlIGJsb2NrcyB3aGljaCBsZWFkCisgIC8vIHRvIHVzZXMuCisgIFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sqLCAzMj4gTGl2ZUluQmxvY2tzOworICBDb21wdXRlTGl2ZUluQmxvY2tzKEFJLCBJbmZvLCBEZWZCbG9ja3MsIExpdmVJbkJsb2Nrcyk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgbG9jYXRpb25zIHdoZXJlIFBoaU5vZGVzIG5lZWQgdG8gYmUgaW5zZXJ0ZWQuICBMb29rIGF0IHRoZQorICAvLyBkb21pbmFuY2UgZnJvbnRpZXIgb2YgRUFDSCBiYXNpYy1ibG9jayB3ZSBoYXZlIGEgd3JpdGUgaW4uCisgIHVuc2lnbmVkIEN1cnJlbnRWZXJzaW9uID0gMDsKKyAgU21hbGxQdHJTZXQ8UEhJTm9kZSosIDE2PiBJbnNlcnRlZFBISU5vZGVzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIEJhc2ljQmxvY2sqPiA+IERGQmxvY2tzOworICB3aGlsZSAoIUluZm8uRGVmaW5pbmdCbG9ja3MuZW1wdHkoKSkgeworICAgIEJhc2ljQmxvY2sgKkJCID0gSW5mby5EZWZpbmluZ0Jsb2Nrcy5iYWNrKCk7CisgICAgSW5mby5EZWZpbmluZ0Jsb2Nrcy5wb3BfYmFjaygpOworICAgIAorICAgIC8vIExvb2sgdXAgdGhlIERGIGZvciB0aGlzIHdyaXRlLCBhZGQgaXQgdG8gZGVmaW5pbmcgYmxvY2tzLgorICAgIERvbWluYW5jZUZyb250aWVyOjpjb25zdF9pdGVyYXRvciBpdCA9IERGLmZpbmQoQkIpOworICAgIGlmIChpdCA9PSBERi5lbmQoKSkgY29udGludWU7CisgICAgCisgICAgY29uc3QgRG9taW5hbmNlRnJvbnRpZXI6OkRvbVNldFR5cGUgJlMgPSBpdC0+c2Vjb25kOworICAgIAorICAgIC8vIEluIHRoZW9yeSB3ZSBkb24ndCBuZWVkIHRoZSBpbmRpcmVjdGlvbiB0aHJvdWdoIHRoZSBERkJsb2NrcyB2ZWN0b3IuCisgICAgLy8gSW4gcHJhY3RpY2UsIHRoZSBvcmRlciBvZiBjYWxsaW5nIFF1ZXVlUGhpTm9kZSB3b3VsZCBkZXBlbmQgb24gdGhlCisgICAgLy8gKHVuc3BlY2lmaWVkKSBvcmRlcmluZyBvZiBiYXNpYyBibG9ja3MgaW4gdGhlIGRvbWluYW5jZSBmcm9udGllciwKKyAgICAvLyB3aGljaCB3b3VsZCBnaXZlIFBISSBub2RlcyBub24tZGV0ZXJtaW5zdGljIHN1YnNjcmlwdHMuICBGaXggdGhpcyBieQorICAgIC8vIHByb2Nlc3NpbmcgYmxvY2tzIGluIG9yZGVyIG9mIHRoZSBvY2N1cmFuY2UgaW4gdGhlIGZ1bmN0aW9uLgorICAgIGZvciAoRG9taW5hbmNlRnJvbnRpZXI6OkRvbVNldFR5cGU6OmNvbnN0X2l0ZXJhdG9yIFAgPSBTLmJlZ2luKCksCisgICAgICAgICBQRSA9IFMuZW5kKCk7IFAgIT0gUEU7ICsrUCkgeworICAgICAgLy8gSWYgdGhlIGZyb250aWVyIGJsb2NrIGlzIG5vdCBpbiB0aGUgbGl2ZS1pbiBzZXQgZm9yIHRoZSBhbGxvY2EsIGRvbid0CisgICAgICAvLyBib3RoZXIgcHJvY2Vzc2luZyBpdC4KKyAgICAgIGlmICghTGl2ZUluQmxvY2tzLmNvdW50KCpQKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIERGQmxvY2tzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihCQk51bWJlcnNbKlBdLCAqUCkpOworICAgIH0KKyAgICAKKyAgICAvLyBTb3J0IGJ5IHdoaWNoIHRoZSBibG9jayBvcmRlcmluZyBpbiB0aGUgZnVuY3Rpb24uCisgICAgaWYgKERGQmxvY2tzLnNpemUoKSA+IDEpCisgICAgICBzdGQ6OnNvcnQoREZCbG9ja3MuYmVnaW4oKSwgREZCbG9ja3MuZW5kKCkpOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBERkJsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBCYXNpY0Jsb2NrICpCQiA9IERGQmxvY2tzW2ldLnNlY29uZDsKKyAgICAgIGlmIChRdWV1ZVBoaU5vZGUoQkIsIEFsbG9jYU51bSwgQ3VycmVudFZlcnNpb24sIEluc2VydGVkUEhJTm9kZXMpKQorICAgICAgICBJbmZvLkRlZmluaW5nQmxvY2tzLnB1c2hfYmFjayhCQik7CisgICAgfQorICAgIERGQmxvY2tzLmNsZWFyKCk7CisgIH0KK30KKworLy8vIFJld3JpdGVTaW5nbGVTdG9yZUFsbG9jYSAtIElmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc3RvcmUgdG8gdGhpcyB2YWx1ZSwKKy8vLyByZXBsYWNlIGFueSBsb2FkcyBvZiBpdCB0aGF0IGFyZSBkaXJlY3RseSBkb21pbmF0ZWQgYnkgdGhlIGRlZmluaXRpb24gd2l0aAorLy8vIHRoZSB2YWx1ZSBzdG9yZWQuCit2b2lkIFByb21vdGVNZW0yUmVnOjpSZXdyaXRlU2luZ2xlU3RvcmVBbGxvY2EoQWxsb2NhSW5zdCAqQUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhSW5mbyAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXJnZUJsb2NrSW5mbyAmTEJJKSB7CisgIFN0b3JlSW5zdCAqT25seVN0b3JlID0gSW5mby5Pbmx5U3RvcmU7CisgIGJvb2wgU3RvcmluZ0dsb2JhbFZhbCA9ICFpc2E8SW5zdHJ1Y3Rpb24+KE9ubHlTdG9yZS0+Z2V0T3BlcmFuZCgwKSk7CisgIEJhc2ljQmxvY2sgKlN0b3JlQkIgPSBPbmx5U3RvcmUtPmdldFBhcmVudCgpOworICBpbnQgU3RvcmVJbmRleCA9IC0xOworCisgIC8vIENsZWFyIG91dCBVc2luZ0Jsb2Nrcy4gIFdlIHdpbGwgcmVjb25zdHJ1Y3QgaXQgaGVyZSBpZiBuZWVkZWQuCisgIEluZm8uVXNpbmdCbG9ja3MuY2xlYXIoKTsKKyAgCisgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEFJLT51c2VfYmVnaW4oKSwgRSA9IEFJLT51c2VfZW5kKCk7IFVJICE9IEU7ICkgeworICAgIEluc3RydWN0aW9uICpVc2VySW5zdCA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSsrKTsKKyAgICBpZiAoIWlzYTxMb2FkSW5zdD4oVXNlckluc3QpKSB7CisgICAgICBhc3NlcnQoVXNlckluc3QgPT0gT25seVN0b3JlICYmICJTaG91bGQgb25seSBoYXZlIGxvYWQvc3RvcmVzIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgTG9hZEluc3QgKkxJID0gY2FzdDxMb2FkSW5zdD4oVXNlckluc3QpOworICAgIAorICAgIC8vIE9rYXksIGlmIHdlIGhhdmUgYSBsb2FkIGZyb20gdGhlIGFsbG9jYSwgd2Ugd2FudCB0byByZXBsYWNlIGl0IHdpdGggdGhlCisgICAgLy8gb25seSB2YWx1ZSBzdG9yZWQgdG8gdGhlIGFsbG9jYS4gIFdlIGNhbiBkbyB0aGlzIGlmIHRoZSB2YWx1ZSBpcworICAgIC8vIGRvbWluYXRlZCBieSB0aGUgc3RvcmUuICBJZiBub3QsIHdlIHVzZSB0aGUgcmVzdCBvZiB0aGUgbWVtMnJlZyBtYWNoaW5lcnkKKyAgICAvLyB0byBpbnNlcnQgdGhlIHBoaSBub2RlcyBhcyBuZWVkZWQuCisgICAgaWYgKCFTdG9yaW5nR2xvYmFsVmFsKSB7ICAvLyBOb24taW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgZG9taW5hdGVkLgorICAgICAgaWYgKExJLT5nZXRQYXJlbnQoKSA9PSBTdG9yZUJCKSB7CisgICAgICAgIC8vIElmIHdlIGhhdmUgYSB1c2UgdGhhdCBpcyBpbiB0aGUgc2FtZSBibG9jayBhcyB0aGUgc3RvcmUsIGNvbXBhcmUgdGhlCisgICAgICAgIC8vIGluZGljZXMgb2YgdGhlIHR3byBpbnN0cnVjdGlvbnMgdG8gc2VlIHdoaWNoIG9uZSBjYW1lIGZpcnN0LiAgSWYgdGhlCisgICAgICAgIC8vIGxvYWQgY2FtZSBiZWZvcmUgdGhlIHN0b3JlLCB3ZSBjYW4ndCBoYW5kbGUgaXQuCisgICAgICAgIGlmIChTdG9yZUluZGV4ID09IC0xKQorICAgICAgICAgIFN0b3JlSW5kZXggPSBMQkkuZ2V0SW5zdHJ1Y3Rpb25JbmRleChPbmx5U3RvcmUpOworCisgICAgICAgIGlmICh1bnNpZ25lZChTdG9yZUluZGV4KSA+IExCSS5nZXRJbnN0cnVjdGlvbkluZGV4KExJKSkgeworICAgICAgICAgIC8vIENhbid0IGhhbmRsZSB0aGlzIGxvYWQsIGJhaWwgb3V0LgorICAgICAgICAgIEluZm8uVXNpbmdCbG9ja3MucHVzaF9iYWNrKFN0b3JlQkIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgfSBlbHNlIGlmIChMSS0+Z2V0UGFyZW50KCkgIT0gU3RvcmVCQiAmJgorICAgICAgICAgICAgICAgICAhZG9taW5hdGVzKFN0b3JlQkIsIExJLT5nZXRQYXJlbnQoKSkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGxvYWQgYW5kIHN0b3JlIGFyZSBpbiBkaWZmZXJlbnQgYmxvY2tzLCB1c2UgQkIgZG9taW5hbmNlIHRvCisgICAgICAgIC8vIGNoZWNrIHRoZWlyIHJlbGF0aW9uc2hpcHMuICBJZiB0aGUgc3RvcmUgZG9lc24ndCBkb20gdGhlIHVzZSwgYmFpbAorICAgICAgICAvLyBvdXQuCisgICAgICAgIEluZm8uVXNpbmdCbG9ja3MucHVzaF9iYWNrKExJLT5nZXRQYXJlbnQoKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIHdlICpjYW4qIHNhZmVseSByZXdyaXRlIHRoaXMgbG9hZC4KKyAgICBWYWx1ZSAqUmVwbFZhbCA9IE9ubHlTdG9yZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAvLyBJZiB0aGUgcmVwbGFjZW1lbnQgdmFsdWUgaXMgdGhlIGxvYWQsIHRoaXMgbXVzdCBvY2N1ciBpbiB1bnJlYWNoYWJsZQorICAgIC8vIGNvZGUuCisgICAgaWYgKFJlcGxWYWwgPT0gTEkpCisgICAgICBSZXBsVmFsID0gVW5kZWZWYWx1ZTo6Z2V0KExJLT5nZXRUeXBlKCkpOworICAgIExJLT5yZXBsYWNlQWxsVXNlc1dpdGgoUmVwbFZhbCk7CisgICAgaWYgKEFTVCAmJiBMSS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgQVNULT5kZWxldGVWYWx1ZShMSSk7CisgICAgTEktPmVyYXNlRnJvbVBhcmVudCgpOworICAgIExCSS5kZWxldGVWYWx1ZShMSSk7CisgIH0KK30KKworbmFtZXNwYWNlIHsKKworLy8vIFN0b3JlSW5kZXhTZWFyY2hQcmVkaWNhdGUgLSBUaGlzIGlzIGEgaGVscGVyIHByZWRpY2F0ZSB1c2VkIHRvIHNlYXJjaCBieSB0aGUKKy8vLyBmaXJzdCBlbGVtZW50IG9mIGEgcGFpci4KK3N0cnVjdCBTdG9yZUluZGV4U2VhcmNoUHJlZGljYXRlIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6cGFpcjx1bnNpZ25lZCwgU3RvcmVJbnN0Kj4gJkxIUywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6cGFpcjx1bnNpZ25lZCwgU3RvcmVJbnN0Kj4gJlJIUykgeworICAgIHJldHVybiBMSFMuZmlyc3QgPCBSSFMuZmlyc3Q7CisgIH0KK307CisKK30KKworLy8vIFByb21vdGVTaW5nbGVCbG9ja0FsbG9jYSAtIE1hbnkgYWxsb2NhcyBhcmUgb25seSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBiYXNpYworLy8vIGJsb2NrLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgYXZvaWQgdHJhdmVyc2luZyB0aGUgQ0ZHIGFuZCBpbnNlcnRpbmcgYSBsb3Qgb2YKKy8vLyBwb3RlbnRpYWxseSB1c2VsZXNzIFBISSBub2RlcyBieSBqdXN0IHBlcmZvcm1pbmcgYSBzaW5nbGUgbGluZWFyIHBhc3Mgb3ZlcgorLy8vIHRoZSBiYXNpYyBibG9jayB1c2luZyB0aGUgQWxsb2NhLgorLy8vCisvLy8gSWYgd2UgY2Fubm90IHByb21vdGUgdGhpcyBhbGxvY2EgKGJlY2F1c2UgaXQgaXMgcmVhZCBiZWZvcmUgaXQgaXMgd3JpdHRlbiksCisvLy8gcmV0dXJuIHRydWUuICBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBjYXNlcyB3aGVyZSwgZHVlIHRvIGNvbnRyb2wgZmxvdywgdGhlCisvLy8gYWxsb2NhIGlzIHBvdGVudGlhbGx5IHVuZGVmaW5lZCBvbiBzb21lIGNvbnRyb2wgZmxvdyBwYXRocy4gIGUuZy4gY29kZSBsaWtlCisvLy8gdGhpcyBpcyBwb3RlbnRpYWxseSBjb3JyZWN0OgorLy8vCisvLy8gICBmb3IgKC4uLikgeyBpZiAoYykgeyBBID0gdW5kZWY7IHVuZGVmID0gQjsgfSB9CisvLy8KKy8vLyAuLi4gc28gbG9uZyBhcyBBIGlzIG5vdCB1c2VkIGJlZm9yZSB1bmRlZiBpcyBzZXQuCisvLy8KK3ZvaWQgUHJvbW90ZU1lbTJSZWc6OlByb21vdGVTaW5nbGVCbG9ja0FsbG9jYShBbGxvY2FJbnN0ICpBSSwgQWxsb2NhSW5mbyAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXJnZUJsb2NrSW5mbyAmTEJJKSB7CisgIC8vIFRoZSB0cmlja2llc3QgY2FzZSB0byBoYW5kbGUgaXMgd2hlbiB3ZSBoYXZlIGxhcmdlIGJsb2Nrcy4gQmVjYXVzZSBvZiB0aGlzLAorICAvLyB0aGlzIGNvZGUgaXMgb3B0aW1pemVkIGFzc3VtaW5nIHRoYXQgbGFyZ2UgYmxvY2tzIGhhcHBlbi4gIFRoaXMgZG9lcyBub3QKKyAgLy8gc2lnbmlmaWNhbnRseSBwZXNzaW1pemUgdGhlIHNtYWxsIGJsb2NrIGNhc2UuICBUaGlzIHVzZXMgTGFyZ2VCbG9ja0luZm8gdG8KKyAgLy8gbWFrZSBpdCBlZmZpY2llbnQgdG8gZ2V0IHRoZSBpbmRleCBvZiB2YXJpb3VzIG9wZXJhdGlvbnMgaW4gdGhlIGJsb2NrLgorICAKKyAgLy8gQ2xlYXIgb3V0IFVzaW5nQmxvY2tzLiAgV2Ugd2lsbCByZWNvbnN0cnVjdCBpdCBoZXJlIGlmIG5lZWRlZC4KKyAgSW5mby5Vc2luZ0Jsb2Nrcy5jbGVhcigpOworICAKKyAgLy8gV2FsayB0aGUgdXNlLWRlZiBsaXN0IG9mIHRoZSBhbGxvY2EsIGdldHRpbmcgdGhlIGxvY2F0aW9ucyBvZiBhbGwgc3RvcmVzLgorICB0eXBlZGVmIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgU3RvcmVJbnN0Kj4sIDY0PiBTdG9yZXNCeUluZGV4VHk7CisgIFN0b3Jlc0J5SW5kZXhUeSBTdG9yZXNCeUluZGV4OworICAKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gQUktPnVzZV9iZWdpbigpLCBFID0gQUktPnVzZV9lbmQoKTsKKyAgICAgICBVSSAhPSBFOyArK1VJKSAKKyAgICBpZiAoU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oKlVJKSkKKyAgICAgIFN0b3Jlc0J5SW5kZXgucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKExCSS5nZXRJbnN0cnVjdGlvbkluZGV4KFNJKSwgU0kpKTsKKworICAvLyBJZiB0aGVyZSBhcmUgbm8gc3RvcmVzIHRvIHRoZSBhbGxvY2EsIGp1c3QgcmVwbGFjZSBhbnkgbG9hZHMgd2l0aCB1bmRlZi4KKyAgaWYgKFN0b3Jlc0J5SW5kZXguZW1wdHkoKSkgeworICAgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEFJLT51c2VfYmVnaW4oKSwgRSA9IEFJLT51c2VfZW5kKCk7IFVJICE9IEU7KSAKKyAgICAgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oKlVJKyspKSB7CisgICAgICAgIExJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVW5kZWZWYWx1ZTo6Z2V0KExJLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgaWYgKEFTVCAmJiBMSS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgICAgIEFTVC0+ZGVsZXRlVmFsdWUoTEkpOworICAgICAgICBMQkkuZGVsZXRlVmFsdWUoTEkpOworICAgICAgICBMSS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICB9CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBTb3J0IHRoZSBzdG9yZXMgYnkgdGhlaXIgaW5kZXgsIG1ha2luZyBpdCBlZmZpY2llbnQgdG8gZG8gYSBsb29rdXAgd2l0aCBhCisgIC8vIGJpbmFyeSBzZWFyY2guCisgIHN0ZDo6c29ydChTdG9yZXNCeUluZGV4LmJlZ2luKCksIFN0b3Jlc0J5SW5kZXguZW5kKCkpOworICAKKyAgLy8gV2FsayBhbGwgb2YgdGhlIGxvYWRzIGZyb20gdGhpcyBhbGxvY2EsIHJlcGxhY2luZyB0aGVtIHdpdGggdGhlIG5lYXJlc3QKKyAgLy8gc3RvcmUgYWJvdmUgdGhlbSwgaWYgYW55LgorICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBBSS0+dXNlX2JlZ2luKCksIEUgPSBBSS0+dXNlX2VuZCgpOyBVSSAhPSBFOykgeworICAgIExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PigqVUkrKyk7CisgICAgaWYgKCFMSSkgY29udGludWU7CisgICAgCisgICAgdW5zaWduZWQgTG9hZElkeCA9IExCSS5nZXRJbnN0cnVjdGlvbkluZGV4KExJKTsKKyAgICAKKyAgICAvLyBGaW5kIHRoZSBuZWFyZXN0IHN0b3JlIHRoYXQgaGFzIGEgbG93ZXIgdGhhbiB0aGlzIGxvYWQuIAorICAgIFN0b3Jlc0J5SW5kZXhUeTo6aXRlcmF0b3IgSSA9IAorICAgICAgc3RkOjpsb3dlcl9ib3VuZChTdG9yZXNCeUluZGV4LmJlZ2luKCksIFN0b3Jlc0J5SW5kZXguZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgU3RvcmVJbnN0Kj4oTG9hZElkeCwgc3RhdGljX2Nhc3Q8U3RvcmVJbnN0Kj4oMCkpLAorICAgICAgICAgICAgICAgICAgICAgICBTdG9yZUluZGV4U2VhcmNoUHJlZGljYXRlKCkpOworICAgIAorICAgIC8vIElmIHRoZXJlIGlzIG5vIHN0b3JlIGJlZm9yZSB0aGlzIGxvYWQsIHRoZW4gd2UgY2FuJ3QgcHJvbW90ZSB0aGlzIGxvYWQuCisgICAgaWYgKEkgPT0gU3RvcmVzQnlJbmRleC5iZWdpbigpKSB7CisgICAgICAvLyBDYW4ndCBoYW5kbGUgdGhpcyBsb2FkLCBiYWlsIG91dC4KKyAgICAgIEluZm8uVXNpbmdCbG9ja3MucHVzaF9iYWNrKExJLT5nZXRQYXJlbnQoKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgICAKKyAgICAvLyBPdGhlcndpc2UsIHRoZXJlIHdhcyBhIHN0b3JlIGJlZm9yZSB0aGlzIGxvYWQsIHRoZSBsb2FkIHRha2VzIGl0cyB2YWx1ZS4KKyAgICAtLUk7CisgICAgTEktPnJlcGxhY2VBbGxVc2VzV2l0aChJLT5zZWNvbmQtPmdldE9wZXJhbmQoMCkpOworICAgIGlmIChBU1QgJiYgTEktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgIEFTVC0+ZGVsZXRlVmFsdWUoTEkpOworICAgIExJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICBMQkkuZGVsZXRlVmFsdWUoTEkpOworICB9Cit9CisKKy8vIFF1ZXVlUGhpTm9kZSAtIHF1ZXVlcyBhIHBoaS1ub2RlIHRvIGJlIGFkZGVkIHRvIGEgYmFzaWMtYmxvY2sgZm9yIGEgc3BlY2lmaWMKKy8vIEFsbG9jYSByZXR1cm5zIHRydWUgaWYgdGhlcmUgd2Fzbid0IGFscmVhZHkgYSBwaGktbm9kZSBmb3IgdGhhdCB2YXJpYWJsZQorLy8KK2Jvb2wgUHJvbW90ZU1lbTJSZWc6OlF1ZXVlUGhpTm9kZShCYXNpY0Jsb2NrICpCQiwgdW5zaWduZWQgQWxsb2NhTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8UEhJTm9kZSosIDE2PiAmSW5zZXJ0ZWRQSElOb2RlcykgeworICAvLyBMb29rIHVwIHRoZSBiYXNpYy1ibG9jayBpbiBxdWVzdGlvbi4KKyAgUEhJTm9kZSAqJlBOID0gTmV3UGhpTm9kZXNbc3RkOjptYWtlX3BhaXIoQkIsIEFsbG9jYU5vKV07CisKKyAgLy8gSWYgdGhlIEJCIGFscmVhZHkgaGFzIGEgcGhpIG5vZGUgYWRkZWQgZm9yIHRoZSBpJ3RoIGFsbG9jYSB0aGVuIHdlJ3JlIGRvbmUhCisgIGlmIChQTikgcmV0dXJuIGZhbHNlOworCisgIC8vIENyZWF0ZSBhIFBoaU5vZGUgdXNpbmcgdGhlIGRlcmVmZXJlbmNlZCB0eXBlLi4uIGFuZCBhZGQgdGhlIHBoaS1ub2RlIHRvIHRoZQorICAvLyBCYXNpY0Jsb2NrLgorICBQTiA9IFBISU5vZGU6OkNyZWF0ZShBbGxvY2FzW0FsbG9jYU5vXS0+Z2V0QWxsb2NhdGVkVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBCQi0+YmVnaW4oKSk7CisgICsrTnVtUEhJSW5zZXJ0OworICBQaGlUb0FsbG9jYU1hcFtQTl0gPSBBbGxvY2FObzsKKyAgUE4tPnJlc2VydmVPcGVyYW5kU3BhY2UoZ2V0TnVtUHJlZHMoQkIpKTsKKyAgCisgIEluc2VydGVkUEhJTm9kZXMuaW5zZXJ0KFBOKTsKKworICBpZiAoQVNUICYmIFBOLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgQVNULT5jb3B5VmFsdWUoUG9pbnRlckFsbG9jYVZhbHVlc1tBbGxvY2FOb10sIFBOKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmVuYW1lUGFzcyAtIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBDRkcgb2YgdGhlIGZ1bmN0aW9uLCByZW5hbWluZyBsb2FkcyBhbmQKKy8vIHN0b3JlcyB0byB0aGUgYWxsb2NhcyB3aGljaCB3ZSBhcmUgcHJvbW90aW5nLiAgSW5jb21pbmdWYWxzIGluZGljYXRlcyB3aGF0CisvLyB2YWx1ZSBlYWNoIEFsbG9jYSBjb250YWlucyBvbiBleGl0IGZyb20gdGhlIHByZWRlY2Vzc29yIGJsb2NrIFByZWQuCisvLwordm9pZCBQcm9tb3RlTWVtMlJlZzo6UmVuYW1lUGFzcyhCYXNpY0Jsb2NrICpCQiwgQmFzaWNCbG9jayAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuYW1lUGFzc0RhdGE6OlZhbFZlY3RvciAmSW5jb21pbmdWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxSZW5hbWVQYXNzRGF0YT4gJldvcmtsaXN0KSB7CitOZXh0SXRlcmF0aW9uOgorICAvLyBJZiB3ZSBhcmUgaW5zZXJ0aW5nIGFueSBwaGkgbm9kZXMgaW50byB0aGlzIEJCLCB0aGV5IHdpbGwgYWxyZWFkeSBiZSBpbiB0aGUKKyAgLy8gYmxvY2suCisgIGlmIChQSElOb2RlICpBUE4gPSBkeW5fY2FzdDxQSElOb2RlPihCQi0+YmVnaW4oKSkpIHsKKyAgICAvLyBJZiB3ZSBoYXZlIFBISSBub2RlcyB0byB1cGRhdGUsIGNvbXB1dGUgdGhlIG51bWJlciBvZiBlZGdlcyBmcm9tIFByZWQgdG8KKyAgICAvLyBCQi4KKyAgICBpZiAoUGhpVG9BbGxvY2FNYXAuY291bnQoQVBOKSkgeworICAgICAgLy8gV2Ugd2FudCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUEhJIG5vZGVzIGJlaW5nIGluc2VydGVkIGJ5CisgICAgICAvLyB0aGlzIGludm9jYXRpb24gb2YgbWVtMnJlZyBmcm9tIHRob3NlIHBoaSBub2RlcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBpbgorICAgICAgLy8gdGhlIElSIGJlZm9yZSBtZW0ycmVnIHdhcyBydW4uICBXZSBkZXRlcm1pbmUgdGhhdCBBUE4gaXMgYmVpbmcgaW5zZXJ0ZWQKKyAgICAgIC8vIGJlY2F1c2UgaXQgaXMgbWlzc2luZyBpbmNvbWluZyBlZGdlcy4gIEFsbCBvdGhlciBQSEkgbm9kZXMgYmVpbmcKKyAgICAgIC8vIGluc2VydGVkIGJ5IHRoaXMgcGFzcyBvZiBtZW0ycmVnIHdpbGwgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgaW5jb21pbmcKKyAgICAgIC8vIG9wZXJhbmRzIHNvIGZhci4gIFJlbWVtYmVyIHRoaXMgY291bnQuCisgICAgICB1bnNpZ25lZCBOZXdQSElOdW1PcGVyYW5kcyA9IEFQTi0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgICAgIAorICAgICAgdW5zaWduZWQgTnVtRWRnZXMgPSAwOworICAgICAgZm9yIChzdWNjX2l0ZXJhdG9yIEkgPSBzdWNjX2JlZ2luKFByZWQpLCBFID0gc3VjY19lbmQoUHJlZCk7IEkgIT0gRTsgKytJKQorICAgICAgICBpZiAoKkkgPT0gQkIpCisgICAgICAgICAgKytOdW1FZGdlczsKKyAgICAgIGFzc2VydChOdW1FZGdlcyAmJiAiTXVzdCBiZSBhdCBsZWFzdCBvbmUgZWRnZSBmcm9tIFByZWQgdG8gQkIhIik7CisgICAgICAKKyAgICAgIC8vIEFkZCBlbnRyaWVzIGZvciBhbGwgdGhlIHBoaXMuCisgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBQTkkgPSBCQi0+YmVnaW4oKTsKKyAgICAgIGRvIHsKKyAgICAgICAgdW5zaWduZWQgQWxsb2NhTm8gPSBQaGlUb0FsbG9jYU1hcFtBUE5dOworICAgICAgICAKKyAgICAgICAgLy8gQWRkIE4gaW5jb21pbmcgdmFsdWVzIHRvIHRoZSBQSEkgbm9kZS4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FZGdlczsgKytpKQorICAgICAgICAgIEFQTi0+YWRkSW5jb21pbmcoSW5jb21pbmdWYWxzW0FsbG9jYU5vXSwgUHJlZCk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUgY3VycmVudGx5IGFjdGl2ZSB2YXJpYWJsZSBmb3IgdGhpcyBibG9jayBpcyBub3cgdGhlIFBISS4KKyAgICAgICAgSW5jb21pbmdWYWxzW0FsbG9jYU5vXSA9IEFQTjsKKyAgICAgICAgCisgICAgICAgIC8vIEdldCB0aGUgbmV4dCBwaGkgbm9kZS4KKyAgICAgICAgKytQTkk7CisgICAgICAgIEFQTiA9IGR5bl9jYXN0PFBISU5vZGU+KFBOSSk7CisgICAgICAgIGlmIChBUE4gPT0gMCkgYnJlYWs7CisgICAgICAgIAorICAgICAgICAvLyBWZXJpZnkgdGhhdCBpdCBpcyBtaXNzaW5nIGVudHJpZXMuICBJZiBub3QsIGl0IGlzIG5vdCBiZWluZyBpbnNlcnRlZAorICAgICAgICAvLyBieSB0aGlzIG1lbTJyZWcgaW52b2NhdGlvbiBzbyB3ZSB3YW50IHRvIGlnbm9yZSBpdC4KKyAgICAgIH0gd2hpbGUgKEFQTi0+Z2V0TnVtT3BlcmFuZHMoKSA9PSBOZXdQSElOdW1PcGVyYW5kcyk7CisgICAgfQorICB9CisgIAorICAvLyBEb24ndCByZXZpc2l0IGJsb2Nrcy4KKyAgaWYgKCFWaXNpdGVkLmluc2VydChCQikpIHJldHVybjsKKworICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gQkItPmJlZ2luKCk7ICFpc2E8VGVybWluYXRvckluc3Q+KElJKTsgKSB7CisgICAgSW5zdHJ1Y3Rpb24gKkkgPSBJSSsrOyAvLyBnZXQgdGhlIGluc3RydWN0aW9uLCBpbmNyZW1lbnQgaXRlcmF0b3IKKworICAgIGlmIChMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oSSkpIHsKKyAgICAgIEFsbG9jYUluc3QgKlNyYyA9IGR5bl9jYXN0PEFsbG9jYUluc3Q+KExJLT5nZXRQb2ludGVyT3BlcmFuZCgpKTsKKyAgICAgIGlmICghU3JjKSBjb250aW51ZTsKKyAgCisgICAgICBzdGQ6Om1hcDxBbGxvY2FJbnN0KiwgdW5zaWduZWQ+OjppdGVyYXRvciBBSSA9IEFsbG9jYUxvb2t1cC5maW5kKFNyYyk7CisgICAgICBpZiAoQUkgPT0gQWxsb2NhTG9va3VwLmVuZCgpKSBjb250aW51ZTsKKworICAgICAgVmFsdWUgKlYgPSBJbmNvbWluZ1ZhbHNbQUktPnNlY29uZF07CisKKyAgICAgIC8vIEFueXRoaW5nIHVzaW5nIHRoZSBsb2FkIG5vdyB1c2VzIHRoZSBjdXJyZW50IHZhbHVlLgorICAgICAgTEktPnJlcGxhY2VBbGxVc2VzV2l0aChWKTsKKyAgICAgIGlmIChBU1QgJiYgTEktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICAgICAgQVNULT5kZWxldGVWYWx1ZShMSSk7CisgICAgICBCQi0+Z2V0SW5zdExpc3QoKS5lcmFzZShMSSk7CisgICAgfSBlbHNlIGlmIChTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihJKSkgeworICAgICAgLy8gRGVsZXRlIHRoaXMgaW5zdHJ1Y3Rpb24gYW5kIG1hcmsgdGhlIG5hbWUgYXMgdGhlIGN1cnJlbnQgaG9sZGVyIG9mIHRoZQorICAgICAgLy8gdmFsdWUKKyAgICAgIEFsbG9jYUluc3QgKkRlc3QgPSBkeW5fY2FzdDxBbGxvY2FJbnN0PihTSS0+Z2V0UG9pbnRlck9wZXJhbmQoKSk7CisgICAgICBpZiAoIURlc3QpIGNvbnRpbnVlOworICAgICAgCisgICAgICBzdGQ6Om1hcDxBbGxvY2FJbnN0ICosIHVuc2lnbmVkPjo6aXRlcmF0b3IgYWkgPSBBbGxvY2FMb29rdXAuZmluZChEZXN0KTsKKyAgICAgIGlmIChhaSA9PSBBbGxvY2FMb29rdXAuZW5kKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgCisgICAgICAvLyB3aGF0IHZhbHVlIHdlcmUgd2Ugd3JpdGluZz8KKyAgICAgIEluY29taW5nVmFsc1thaS0+c2Vjb25kXSA9IFNJLT5nZXRPcGVyYW5kKDApOworIAorICAgICAgQkItPmdldEluc3RMaXN0KCkuZXJhc2UoU0kpOworICAgIH0KKyAgfQorCisgIC8vICdSZWN1cnNlJyB0byBvdXIgc3VjY2Vzc29ycy4KKyAgc3VjY19pdGVyYXRvciBJID0gc3VjY19iZWdpbihCQiksIEUgPSBzdWNjX2VuZChCQik7CisgIGlmIChJID09IEUpIHJldHVybjsKKworICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzdWNjZXNzb3JzIHNvIHdlIGRvbid0IHZpc2l0IHRoZSBzYW1lIHN1Y2Nlc3NvciB0d2ljZQorICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrKiwgOD4gVmlzaXRlZFN1Y2NzOworCisgIC8vIEhhbmRsZSB0aGUgZmlyc3Qgc3VjY2Vzc29yIHdpdGhvdXQgdXNpbmcgdGhlIHdvcmtsaXN0LgorICBWaXNpdGVkU3VjY3MuaW5zZXJ0KCpJKTsKKyAgUHJlZCA9IEJCOworICBCQiA9ICpJOworICArK0k7CisKKyAgZm9yICg7IEkgIT0gRTsgKytJKQorICAgIGlmIChWaXNpdGVkU3VjY3MuaW5zZXJ0KCpJKSkKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhSZW5hbWVQYXNzRGF0YSgqSSwgUHJlZCwgSW5jb21pbmdWYWxzKSk7CisKKyAgZ290byBOZXh0SXRlcmF0aW9uOworfQorCisvLy8gUHJvbW90ZU1lbVRvUmVnIC0gUHJvbW90ZSB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgYWxsb2NhIGluc3RydWN0aW9ucyBpbnRvCisvLy8gc2NhbGFyIHJlZ2lzdGVycywgaW5zZXJ0aW5nIFBISSBub2RlcyBhcyBhcHByb3ByaWF0ZS4gIFRoaXMgZnVuY3Rpb24gbWFrZXMKKy8vLyB1c2Ugb2YgRG9taW5hbmNlRnJvbnRpZXIgaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSB0aGUgQ0ZHCisvLy8gb2YgdGhlIGZ1bmN0aW9uIGF0IGFsbC4gIEFsbCBhbGxvY2FzIG11c3QgYmUgZnJvbSB0aGUgc2FtZSBmdW5jdGlvbi4KKy8vLworLy8vIElmIEFTVCBpcyBzcGVjaWZpZWQsIHRoZSBzcGVjaWZpZWQgdHJhY2tlciBpcyB1cGRhdGVkIHRvIHJlZmxlY3QgY2hhbmdlcworLy8vIG1hZGUgdG8gdGhlIElSLgorLy8vCit2b2lkIGxsdm06OlByb21vdGVNZW1Ub1JlZyhjb25zdCBzdGQ6OnZlY3RvcjxBbGxvY2FJbnN0Kj4gJkFsbG9jYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICZEVCwgRG9taW5hbmNlRnJvbnRpZXIgJkRGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNTZXRUcmFja2VyICpBU1QpIHsKKyAgLy8gSWYgdGhlcmUgaXMgbm90aGluZyB0byBkbywgYmFpbCBvdXQuLi4KKyAgaWYgKEFsbG9jYXMuZW1wdHkoKSkgcmV0dXJuOworCisgIFByb21vdGVNZW0yUmVnKEFsbG9jYXMsIERULCBERiwgQVNUKS5ydW4oKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXIuY3BwIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvU1NBVXBkYXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4MjM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXIuY3BwCkBAIC0wLDAgKzEsMzI4IEBACisvLz09PS0gU1NBVXBkYXRlci5jcHAgLSBVbnN0cnVjdHVyZWQgU1NBIFVwZGF0ZSBUb29sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTU0FVcGRhdGVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAic3NhdXBkYXRlciIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9TU0FVcGRhdGVyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXJJbXBsLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKwordHlwZWRlZiBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgVmFsdWUqPiBBdmFpbGFibGVWYWxzVHk7CitzdGF0aWMgQXZhaWxhYmxlVmFsc1R5ICZnZXRBdmFpbGFibGVWYWxzKHZvaWQgKkFWKSB7CisgIHJldHVybiAqc3RhdGljX2Nhc3Q8QXZhaWxhYmxlVmFsc1R5Kj4oQVYpOworfQorCitTU0FVcGRhdGVyOjpTU0FVcGRhdGVyKFNtYWxsVmVjdG9ySW1wbDxQSElOb2RlKj4gKk5ld1BISSkKKyAgOiBBVigwKSwgUHJvdG90eXBlVmFsdWUoMCksIEluc2VydGVkUEhJcyhOZXdQSEkpIHt9CisKK1NTQVVwZGF0ZXI6On5TU0FVcGRhdGVyKCkgeworICBkZWxldGUgJmdldEF2YWlsYWJsZVZhbHMoQVYpOworfQorCisvLy8gSW5pdGlhbGl6ZSAtIFJlc2V0IHRoaXMgb2JqZWN0IHRvIGdldCByZWFkeSBmb3IgYSBuZXcgc2V0IG9mIFNTQQorLy8vIHVwZGF0ZXMuICBQcm90b1ZhbHVlIGlzIHRoZSB2YWx1ZSB1c2VkIHRvIG5hbWUgUEhJIG5vZGVzLgordm9pZCBTU0FVcGRhdGVyOjpJbml0aWFsaXplKFZhbHVlICpQcm90b1ZhbHVlKSB7CisgIGlmIChBViA9PSAwKQorICAgIEFWID0gbmV3IEF2YWlsYWJsZVZhbHNUeSgpOworICBlbHNlCisgICAgZ2V0QXZhaWxhYmxlVmFscyhBVikuY2xlYXIoKTsKKyAgUHJvdG90eXBlVmFsdWUgPSBQcm90b1ZhbHVlOworfQorCisvLy8gSGFzVmFsdWVGb3JCbG9jayAtIFJldHVybiB0cnVlIGlmIHRoZSBTU0FVcGRhdGVyIGFscmVhZHkgaGFzIGEgdmFsdWUgZm9yCisvLy8gdGhlIHNwZWNpZmllZCBibG9jay4KK2Jvb2wgU1NBVXBkYXRlcjo6SGFzVmFsdWVGb3JCbG9jayhCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICByZXR1cm4gZ2V0QXZhaWxhYmxlVmFscyhBVikuY291bnQoQkIpOworfQorCisvLy8gQWRkQXZhaWxhYmxlVmFsdWUgLSBJbmRpY2F0ZSB0aGF0IGEgcmV3cml0dGVuIHZhbHVlIGlzIGF2YWlsYWJsZSBpbiB0aGUKKy8vLyBzcGVjaWZpZWQgYmxvY2sgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgordm9pZCBTU0FVcGRhdGVyOjpBZGRBdmFpbGFibGVWYWx1ZShCYXNpY0Jsb2NrICpCQiwgVmFsdWUgKlYpIHsKKyAgYXNzZXJ0KFByb3RvdHlwZVZhbHVlICE9IDAgJiYgIk5lZWQgdG8gaW5pdGlhbGl6ZSBTU0FVcGRhdGVyIik7CisgIGFzc2VydChQcm90b3R5cGVWYWx1ZS0+Z2V0VHlwZSgpID09IFYtPmdldFR5cGUoKSAmJgorICAgICAgICAgIkFsbCByZXdyaXR0ZW4gdmFsdWVzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIik7CisgIGdldEF2YWlsYWJsZVZhbHMoQVYpW0JCXSA9IFY7Cit9CisKKy8vLyBJc0VxdWl2YWxlbnRQSEkgLSBDaGVjayBpZiBQSEkgaGFzIHRoZSBzYW1lIGluY29taW5nIHZhbHVlIGFzIHNwZWNpZmllZAorLy8vIGluIFZhbHVlTWFwcGluZyBmb3IgZWFjaCBwcmVkZWNlc3NvciBibG9jay4KK3N0YXRpYyBib29sIElzRXF1aXZhbGVudFBISShQSElOb2RlICpQSEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8QmFzaWNCbG9jayosIFZhbHVlKj4gJlZhbHVlTWFwcGluZykgeworICB1bnNpZ25lZCBQSElOdW1WYWx1ZXMgPSBQSEktPmdldE51bUluY29taW5nVmFsdWVzKCk7CisgIGlmIChQSElOdW1WYWx1ZXMgIT0gVmFsdWVNYXBwaW5nLnNpemUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2NhbiB0aGUgcGhpIHRvIHNlZSBpZiBpdCBtYXRjaGVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUEhJTnVtVmFsdWVzOyBpICE9IGU7ICsraSkKKyAgICBpZiAoVmFsdWVNYXBwaW5nW1BISS0+Z2V0SW5jb21pbmdCbG9jayhpKV0gIT0KKyAgICAgICAgUEhJLT5nZXRJbmNvbWluZ1ZhbHVlKGkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLy8gR2V0VmFsdWVBdEVuZE9mQmxvY2sgLSBDb25zdHJ1Y3QgU1NBIGZvcm0sIG1hdGVyaWFsaXppbmcgYSB2YWx1ZSB0aGF0IGlzCisvLy8gbGl2ZSBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suCitWYWx1ZSAqU1NBVXBkYXRlcjo6R2V0VmFsdWVBdEVuZE9mQmxvY2soQmFzaWNCbG9jayAqQkIpIHsKKyAgVmFsdWUgKlJlcyA9IEdldFZhbHVlQXRFbmRPZkJsb2NrSW50ZXJuYWwoQkIpOworICByZXR1cm4gUmVzOworfQorCisvLy8gR2V0VmFsdWVJbk1pZGRsZU9mQmxvY2sgLSBDb25zdHJ1Y3QgU1NBIGZvcm0sIG1hdGVyaWFsaXppbmcgYSB2YWx1ZSB0aGF0CisvLy8gaXMgbGl2ZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suCisvLy8KKy8vLyBHZXRWYWx1ZUluTWlkZGxlT2ZCbG9jayBpcyB0aGUgc2FtZSBhcyBHZXRWYWx1ZUF0RW5kT2ZCbG9jayBleGNlcHQgaW4gb25lCisvLy8gaW1wb3J0YW50IGNhc2U6IGlmIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBvZiB0aGUgcmV3cml0dGVuIHZhbHVlIGFmdGVyIHRoZQorLy8vICd1c2UnIGluIEJCLiAgQ29uc2lkZXIgY29kZSBsaWtlIHRoaXM6CisvLy8KKy8vLyAgICAgIFgxID0gLi4uCisvLy8gICBTb21lQkI6CisvLy8gICAgICB1c2UoWCkKKy8vLyAgICAgIFgyID0gLi4uCisvLy8gICAgICBiciBDb25kLCBTb21lQkIsIE91dEJCCisvLy8KKy8vLyBJbiB0aGlzIGNhc2UsIHRoZXJlIGFyZSB0d28gdmFsdWVzIChYMSBhbmQgWDIpIGFkZGVkIHRvIHRoZSBBdmFpbGFibGVWYWxzCisvLy8gc2V0IGJ5IHRoZSBjbGllbnQgb2YgdGhlIHJld3JpdGVyLCBhbmQgdGhvc2UgdmFsdWVzIGFyZSBib3RoIGxpdmUgb3V0IG9mCisvLy8gdGhlaXIgcmVzcGVjdGl2ZSBibG9ja3MuICBIb3dldmVyLCB0aGUgdXNlIG9mIFggaGFwcGVucyBpbiB0aGUgKm1pZGRsZSogb2YKKy8vLyBhIGJsb2NrLiAgQmVjYXVzZSBvZiB0aGlzLCB3ZSBuZWVkIHRvIGluc2VydCBhIG5ldyBQSEkgbm9kZSBpbiBTb21lQkIgdG8KKy8vLyBtZXJnZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLCBhbmQgdGhpcyB2YWx1ZSBpc24ndCBsaXZlIG91dCBvZiB0aGUgYmxvY2suCisvLy8KK1ZhbHVlICpTU0FVcGRhdGVyOjpHZXRWYWx1ZUluTWlkZGxlT2ZCbG9jayhCYXNpY0Jsb2NrICpCQikgeworICAvLyBJZiB0aGVyZSBpcyBubyBkZWZpbml0aW9uIG9mIHRoZSByZW5hbWVkIHZhcmlhYmxlIGluIHRoaXMgYmxvY2ssIGp1c3QgdXNlCisgIC8vIEdldFZhbHVlQXRFbmRPZkJsb2NrIHRvIGRvIG91ciB3b3JrLgorICBpZiAoIUhhc1ZhbHVlRm9yQmxvY2soQkIpKQorICAgIHJldHVybiBHZXRWYWx1ZUF0RW5kT2ZCbG9jayhCQik7CisKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRoZSBoYXJkIGNhc2UuICBHZXQgdGhlIGxpdmUtaW4gdmFsdWVzIGZvciBlYWNoCisgIC8vIHByZWRlY2Vzc29yLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8QmFzaWNCbG9jayosIFZhbHVlKj4sIDg+IFByZWRWYWx1ZXM7CisgIFZhbHVlICpTaW5ndWxhclZhbHVlID0gMDsKKworICAvLyBXZSBjYW4gZ2V0IG91ciBwcmVkZWNlc3NvciBpbmZvIGJ5IHdhbGtpbmcgdGhlIHByZWRfaXRlcmF0b3IgbGlzdCwgYnV0IGl0CisgIC8vIGlzIHJlbGF0aXZlbHkgc2xvdy4gIElmIHdlIGFscmVhZHkgaGF2ZSBQSEkgbm9kZXMgaW4gdGhpcyBibG9jaywgd2FsayBvbmUKKyAgLy8gb2YgdGhlbSB0byBnZXQgdGhlIHByZWRlY2Vzc29yIGxpc3QgaW5zdGVhZC4KKyAgaWYgKFBISU5vZGUgKlNvbWVQaGkgPSBkeW5fY2FzdDxQSElOb2RlPihCQi0+YmVnaW4oKSkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU29tZVBoaS0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEJhc2ljQmxvY2sgKlByZWRCQiA9IFNvbWVQaGktPmdldEluY29taW5nQmxvY2soaSk7CisgICAgICBWYWx1ZSAqUHJlZFZhbCA9IEdldFZhbHVlQXRFbmRPZkJsb2NrKFByZWRCQik7CisgICAgICBQcmVkVmFsdWVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihQcmVkQkIsIFByZWRWYWwpKTsKKworICAgICAgLy8gQ29tcHV0ZSBTaW5ndWxhclZhbHVlLgorICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgU2luZ3VsYXJWYWx1ZSA9IFByZWRWYWw7CisgICAgICBlbHNlIGlmIChQcmVkVmFsICE9IFNpbmd1bGFyVmFsdWUpCisgICAgICAgIFNpbmd1bGFyVmFsdWUgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBib29sIGlzRmlyc3RQcmVkID0gdHJ1ZTsKKyAgICBmb3IgKHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEJCKSwgRSA9IHByZWRfZW5kKEJCKTsgUEkgIT0gRTsgKytQSSkgeworICAgICAgQmFzaWNCbG9jayAqUHJlZEJCID0gKlBJOworICAgICAgVmFsdWUgKlByZWRWYWwgPSBHZXRWYWx1ZUF0RW5kT2ZCbG9jayhQcmVkQkIpOworICAgICAgUHJlZFZhbHVlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUHJlZEJCLCBQcmVkVmFsKSk7CisKKyAgICAgIC8vIENvbXB1dGUgU2luZ3VsYXJWYWx1ZS4KKyAgICAgIGlmIChpc0ZpcnN0UHJlZCkgeworICAgICAgICBTaW5ndWxhclZhbHVlID0gUHJlZFZhbDsKKyAgICAgICAgaXNGaXJzdFByZWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoUHJlZFZhbCAhPSBTaW5ndWxhclZhbHVlKQorICAgICAgICBTaW5ndWxhclZhbHVlID0gMDsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGVyZSBhcmUgbm8gcHJlZGVjZXNzb3JzLCBqdXN0IHJldHVybiB1bmRlZi4KKyAgaWYgKFByZWRWYWx1ZXMuZW1wdHkoKSkKKyAgICByZXR1cm4gVW5kZWZWYWx1ZTo6Z2V0KFByb3RvdHlwZVZhbHVlLT5nZXRUeXBlKCkpOworCisgIC8vIE90aGVyd2lzZSwgaWYgYWxsIHRoZSBtZXJnZWQgdmFsdWVzIGFyZSB0aGUgc2FtZSwganVzdCB1c2UgaXQuCisgIGlmIChTaW5ndWxhclZhbHVlICE9IDApCisgICAgcmV0dXJuIFNpbmd1bGFyVmFsdWU7CisKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBkbyBuZWVkIGEgUEhJOiBjaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIG9uZSBhdmFpbGFibGUKKyAgLy8gaW4gdGhpcyBibG9jayB0aGF0IHByb2R1Y2VzIHRoZSByaWdodCB2YWx1ZS4KKyAgaWYgKGlzYTxQSElOb2RlPihCQi0+YmVnaW4oKSkpIHsKKyAgICBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgVmFsdWUqPiBWYWx1ZU1hcHBpbmcoUHJlZFZhbHVlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkVmFsdWVzLmVuZCgpKTsKKyAgICBQSElOb2RlICpTb21lUEhJOworICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSXQgPSBCQi0+YmVnaW4oKTsKKyAgICAgICAgIChTb21lUEhJID0gZHluX2Nhc3Q8UEhJTm9kZT4oSXQpKTsgKytJdCkgeworICAgICAgaWYgKElzRXF1aXZhbGVudFBISShTb21lUEhJLCBWYWx1ZU1hcHBpbmcpKQorICAgICAgICByZXR1cm4gU29tZVBISTsKKyAgICB9CisgIH0KKworICAvLyBPaywgd2UgaGF2ZSBubyB3YXkgb3V0LCBpbnNlcnQgYSBuZXcgb25lIG5vdy4KKyAgUEhJTm9kZSAqSW5zZXJ0ZWRQSEkgPSBQSElOb2RlOjpDcmVhdGUoUHJvdG90eXBlVmFsdWUtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJCLT5mcm9udCgpKTsKKyAgSW5zZXJ0ZWRQSEktPnJlc2VydmVPcGVyYW5kU3BhY2UoUHJlZFZhbHVlcy5zaXplKCkpOworCisgIC8vIEZpbGwgaW4gYWxsIHRoZSBwcmVkZWNlc3NvcnMgb2YgdGhlIFBISS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFByZWRWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBJbnNlcnRlZFBISS0+YWRkSW5jb21pbmcoUHJlZFZhbHVlc1tpXS5zZWNvbmQsIFByZWRWYWx1ZXNbaV0uZmlyc3QpOworCisgIC8vIFNlZSBpZiB0aGUgUEhJIG5vZGUgY2FuIGJlIG1lcmdlZCB0byBhIHNpbmdsZSB2YWx1ZS4gIFRoaXMgY2FuIGhhcHBlbiBpbgorICAvLyBsb29wIGNhc2VzIHdoZW4gd2UgZ2V0IGEgUEhJIG9mIGl0c2VsZiBhbmQgb25lIG90aGVyIHZhbHVlLgorICBpZiAoVmFsdWUgKkNvbnN0VmFsID0gSW5zZXJ0ZWRQSEktPmhhc0NvbnN0YW50VmFsdWUoKSkgeworICAgIEluc2VydGVkUEhJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICByZXR1cm4gQ29uc3RWYWw7CisgIH0KKworICAvLyBJZiB0aGUgY2xpZW50IHdhbnRzIHRvIGtub3cgYWJvdXQgYWxsIG5ldyBpbnN0cnVjdGlvbnMsIHRlbGwgaXQuCisgIGlmIChJbnNlcnRlZFBISXMpIEluc2VydGVkUEhJcy0+cHVzaF9iYWNrKEluc2VydGVkUEhJKTsKKworICBERUJVRyhkYmdzKCkgPDwgIiAgSW5zZXJ0ZWQgUEhJOiAiIDw8ICpJbnNlcnRlZFBISSA8PCAiXG4iKTsKKyAgcmV0dXJuIEluc2VydGVkUEhJOworfQorCisvLy8gUmV3cml0ZVVzZSAtIFJld3JpdGUgYSB1c2Ugb2YgdGhlIHN5bWJvbGljIHZhbHVlLiAgVGhpcyBoYW5kbGVzIFBISSBub2RlcywKKy8vLyB3aGljaCB1c2UgdGhlaXIgdmFsdWUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGVjZXNzb3IuCit2b2lkIFNTQVVwZGF0ZXI6OlJld3JpdGVVc2UoVXNlICZVKSB7CisgIEluc3RydWN0aW9uICpVc2VyID0gY2FzdDxJbnN0cnVjdGlvbj4oVS5nZXRVc2VyKCkpOworCisgIFZhbHVlICpWOworICBpZiAoUEhJTm9kZSAqVXNlclBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oVXNlcikpCisgICAgViA9IEdldFZhbHVlQXRFbmRPZkJsb2NrKFVzZXJQTi0+Z2V0SW5jb21pbmdCbG9jayhVKSk7CisgIGVsc2UKKyAgICBWID0gR2V0VmFsdWVJbk1pZGRsZU9mQmxvY2soVXNlci0+Z2V0UGFyZW50KCkpOworCisgIFUuc2V0KFYpOworfQorCisvLy8gUEhJaXRlciAtIEl0ZXJhdG9yIGZvciBQSEkgb3BlcmFuZHMuICBUaGlzIGlzIHVzZWQgZm9yIHRoZSBQSElfaXRlcmF0b3IKKy8vLyBpbiB0aGUgU1NBVXBkYXRlckltcGwgdGVtcGxhdGUuCituYW1lc3BhY2UgeworICBjbGFzcyBQSElpdGVyIHsKKyAgcHJpdmF0ZToKKyAgICBQSElOb2RlICpQSEk7CisgICAgdW5zaWduZWQgaWR4OworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBQSElpdGVyKFBISU5vZGUgKlApIC8vIGJlZ2luIGl0ZXJhdG9yCisgICAgICA6IFBISShQKSwgaWR4KDApIHt9CisgICAgUEhJaXRlcihQSElOb2RlICpQLCBib29sKSAvLyBlbmQgaXRlcmF0b3IKKyAgICAgIDogUEhJKFApLCBpZHgoUEhJLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpKSB7fQorCisgICAgUEhJaXRlciAmb3BlcmF0b3IrKygpIHsgKytpZHg7IHJldHVybiAqdGhpczsgfSAKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUEhJaXRlciYgeCkgY29uc3QgeyByZXR1cm4gaWR4ID09IHguaWR4OyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBISWl0ZXImIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisgICAgVmFsdWUgKmdldEluY29taW5nVmFsdWUoKSB7IHJldHVybiBQSEktPmdldEluY29taW5nVmFsdWUoaWR4KTsgfQorICAgIEJhc2ljQmxvY2sgKmdldEluY29taW5nQmxvY2soKSB7IHJldHVybiBQSEktPmdldEluY29taW5nQmxvY2soaWR4KTsgfQorICB9OworfQorCisvLy8gU1NBVXBkYXRlclRyYWl0czxTU0FVcGRhdGVyPiAtIFRyYWl0cyBmb3IgdGhlIFNTQVVwZGF0ZXJJbXBsIHRlbXBsYXRlLAorLy8vIHNwZWNpYWxpemVkIGZvciBTU0FVcGRhdGVyLgorbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGU8PgorY2xhc3MgU1NBVXBkYXRlclRyYWl0czxTU0FVcGRhdGVyPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgQmFzaWNCbG9jayBCbGtUOworICB0eXBlZGVmIFZhbHVlICpWYWxUOworICB0eXBlZGVmIFBISU5vZGUgUGhpVDsKKworICB0eXBlZGVmIHN1Y2NfaXRlcmF0b3IgQmxrU3VjY19pdGVyYXRvcjsKKyAgc3RhdGljIEJsa1N1Y2NfaXRlcmF0b3IgQmxrU3VjY19iZWdpbihCbGtUICpCQikgeyByZXR1cm4gc3VjY19iZWdpbihCQik7IH0KKyAgc3RhdGljIEJsa1N1Y2NfaXRlcmF0b3IgQmxrU3VjY19lbmQoQmxrVCAqQkIpIHsgcmV0dXJuIHN1Y2NfZW5kKEJCKTsgfQorCisgIHR5cGVkZWYgUEhJaXRlciBQSElfaXRlcmF0b3I7CisgIHN0YXRpYyBpbmxpbmUgUEhJX2l0ZXJhdG9yIFBISV9iZWdpbihQaGlUICpQSEkpIHsgcmV0dXJuIFBISV9pdGVyYXRvcihQSEkpOyB9CisgIHN0YXRpYyBpbmxpbmUgUEhJX2l0ZXJhdG9yIFBISV9lbmQoUGhpVCAqUEhJKSB7CisgICAgcmV0dXJuIFBISV9pdGVyYXRvcihQSEksIHRydWUpOworICB9CisKKyAgLy8vIEZpbmRQcmVkZWNlc3NvckJsb2NrcyAtIFB1dCB0aGUgcHJlZGVjZXNzb3JzIG9mIEluZm8tPkJCIGludG8gdGhlIFByZWRzCisgIC8vLyB2ZWN0b3IsIHNldCBJbmZvLT5OdW1QcmVkcywgYW5kIGFsbG9jYXRlIHNwYWNlIGluIEluZm8tPlByZWRzLgorICBzdGF0aWMgdm9pZCBGaW5kUHJlZGVjZXNzb3JCbG9ja3MoQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayo+ICpQcmVkcykgeworICAgIC8vIFdlIGNhbiBnZXQgb3VyIHByZWRlY2Vzc29yIGluZm8gYnkgd2Fsa2luZyB0aGUgcHJlZF9pdGVyYXRvciBsaXN0LAorICAgIC8vIGJ1dCBpdCBpcyByZWxhdGl2ZWx5IHNsb3cuICBJZiB3ZSBhbHJlYWR5IGhhdmUgUEhJIG5vZGVzIGluIHRoaXMKKyAgICAvLyBibG9jaywgd2FsayBvbmUgb2YgdGhlbSB0byBnZXQgdGhlIHByZWRlY2Vzc29yIGxpc3QgaW5zdGVhZC4KKyAgICBpZiAoUEhJTm9kZSAqU29tZVBoaSA9IGR5bl9jYXN0PFBISU5vZGU+KEJCLT5iZWdpbigpKSkgeworICAgICAgZm9yICh1bnNpZ25lZCBQSSA9IDAsIEUgPSBTb21lUGhpLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBQSSAhPSBFOyArK1BJKQorICAgICAgICBQcmVkcy0+cHVzaF9iYWNrKFNvbWVQaGktPmdldEluY29taW5nQmxvY2soUEkpKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihCQiksIEUgPSBwcmVkX2VuZChCQik7IFBJICE9IEU7ICsrUEkpCisgICAgICAgIFByZWRzLT5wdXNoX2JhY2soKlBJKTsKKyAgICB9CisgIH0KKworICAvLy8gR2V0VW5kZWZWYWwgLSBHZXQgYW4gdW5kZWZpbmVkIHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHZhbHVlCisgIC8vLyBiZWluZyBoYW5kbGVkLgorICBzdGF0aWMgVmFsdWUgKkdldFVuZGVmVmFsKEJhc2ljQmxvY2sgKkJCLCBTU0FVcGRhdGVyICpVcGRhdGVyKSB7CisgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChVcGRhdGVyLT5Qcm90b3R5cGVWYWx1ZS0+Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBDcmVhdGVFbXB0eVBISSAtIENyZWF0ZSBhIG5ldyBQSEkgaW5zdHJ1Y3Rpb24gaW4gdGhlIHNwZWNpZmllZCBibG9jay4KKyAgLy8vIFJlc2VydmUgc3BhY2UgZm9yIHRoZSBvcGVyYW5kcyBidXQgZG8gbm90IGZpbGwgdGhlbSBpbiB5ZXQuCisgIHN0YXRpYyBWYWx1ZSAqQ3JlYXRlRW1wdHlQSEkoQmFzaWNCbG9jayAqQkIsIHVuc2lnbmVkIE51bVByZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTQVVwZGF0ZXIgKlVwZGF0ZXIpIHsKKyAgICBQSElOb2RlICpQSEkgPSBQSElOb2RlOjpDcmVhdGUoVXBkYXRlci0+UHJvdG90eXBlVmFsdWUtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJCLT5mcm9udCgpKTsKKyAgICBQSEktPnJlc2VydmVPcGVyYW5kU3BhY2UoTnVtUHJlZHMpOworICAgIHJldHVybiBQSEk7CisgIH0KKworICAvLy8gQWRkUEhJT3BlcmFuZCAtIEFkZCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFzIGFuIG9wZXJhbmQgb2YgdGhlIFBISSBmb3IKKyAgLy8vIHRoZSBzcGVjaWZpZWQgcHJlZGVjZXNzb3IgYmxvY2suCisgIHN0YXRpYyB2b2lkIEFkZFBISU9wZXJhbmQoUEhJTm9kZSAqUEhJLCBWYWx1ZSAqVmFsLCBCYXNpY0Jsb2NrICpQcmVkKSB7CisgICAgUEhJLT5hZGRJbmNvbWluZyhWYWwsIFByZWQpOworICB9CisKKyAgLy8vIEluc3RySXNQSEkgLSBDaGVjayBpZiBhbiBpbnN0cnVjdGlvbiBpcyBhIFBISS4KKyAgLy8vCisgIHN0YXRpYyBQSElOb2RlICpJbnN0cklzUEhJKEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIGR5bl9jYXN0PFBISU5vZGU+KEkpOworICB9CisKKyAgLy8vIFZhbHVlSXNQSEkgLSBDaGVjayBpZiBhIHZhbHVlIGlzIGEgUEhJLgorICAvLy8KKyAgc3RhdGljIFBISU5vZGUgKlZhbHVlSXNQSEkoVmFsdWUgKlZhbCwgU1NBVXBkYXRlciAqVXBkYXRlcikgeworICAgIHJldHVybiBkeW5fY2FzdDxQSElOb2RlPihWYWwpOworICB9CisKKyAgLy8vIFZhbHVlSXNOZXdQSEkgLSBMaWtlIFZhbHVlSXNQSEkgYnV0IGFsc28gY2hlY2sgaWYgdGhlIFBISSBoYXMgbm8gc291cmNlCisgIC8vLyBvcGVyYW5kcywgaS5lLiwgaXQgd2FzIGp1c3QgYWRkZWQuCisgIHN0YXRpYyBQSElOb2RlICpWYWx1ZUlzTmV3UEhJKFZhbHVlICpWYWwsIFNTQVVwZGF0ZXIgKlVwZGF0ZXIpIHsKKyAgICBQSElOb2RlICpQSEkgPSBWYWx1ZUlzUEhJKFZhbCwgVXBkYXRlcik7CisgICAgaWYgKFBISSAmJiBQSEktPmdldE51bUluY29taW5nVmFsdWVzKCkgPT0gMCkKKyAgICAgIHJldHVybiBQSEk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gR2V0UEhJVmFsdWUgLSBGb3IgdGhlIHNwZWNpZmllZCBQSEkgaW5zdHJ1Y3Rpb24sIHJldHVybiB0aGUgdmFsdWUKKyAgLy8vIHRoYXQgaXQgZGVmaW5lcy4KKyAgc3RhdGljIFZhbHVlICpHZXRQSElWYWx1ZShQSElOb2RlICpQSEkpIHsKKyAgICByZXR1cm4gUEhJOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisvLy8gR2V0VmFsdWVBdEVuZE9mQmxvY2tJbnRlcm5hbCAtIENoZWNrIHRvIHNlZSBpZiBBdmFpbGFibGVWYWxzIGhhcyBhbiBlbnRyeQorLy8vIGZvciB0aGUgc3BlY2lmaWVkIEJCIGFuZCBpZiBzbywgcmV0dXJuIGl0LiAgSWYgbm90LCBjb25zdHJ1Y3QgU1NBIGZvcm0gYnkKKy8vLyBmaXJzdCBjYWxjdWxhdGluZyB0aGUgcmVxdWlyZWQgcGxhY2VtZW50IG9mIFBISXMgYW5kIHRoZW4gaW5zZXJ0aW5nIG5ldworLy8vIFBISXMgd2hlcmUgbmVlZGVkLgorVmFsdWUgKlNTQVVwZGF0ZXI6OkdldFZhbHVlQXRFbmRPZkJsb2NrSW50ZXJuYWwoQmFzaWNCbG9jayAqQkIpIHsKKyAgQXZhaWxhYmxlVmFsc1R5ICZBdmFpbGFibGVWYWxzID0gZ2V0QXZhaWxhYmxlVmFscyhBVik7CisgIGlmIChWYWx1ZSAqViA9IEF2YWlsYWJsZVZhbHNbQkJdKQorICAgIHJldHVybiBWOworCisgIFNTQVVwZGF0ZXJJbXBsPFNTQVVwZGF0ZXI+IEltcGwodGhpcywgJkF2YWlsYWJsZVZhbHMsIEluc2VydGVkUEhJcyk7CisgIHJldHVybiBJbXBsLkdldFZhbHVlKEJCKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL1NpbXBsaWZ5Q0ZHLmNwcCBiL3NyYy9MTFZNL2xpYi9UcmFuc2Zvcm1zL1V0aWxzL1NpbXBsaWZ5Q0ZHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTc3ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvU2ltcGxpZnlDRkcuY3BwCkBAIC0wLDAgKzEsMjExNiBAQAorLy89PT0tIFNpbXBsaWZ5Q0ZHLmNwcCAtIENvZGUgdG8gcGVyZm9ybSBDRkcgc2ltcGxpZmljYXRpb24gLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQZWVwaG9sZSBvcHRpbWl6ZSB0aGUgQ0ZHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAic2ltcGxpZnljZmciCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvQmFzaWNCbG9ja1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitTVEFUSVNUSUMoTnVtU3BlY3VsYXRpb25zLCAiTnVtYmVyIG9mIHNwZWN1bGF0aXZlIGV4ZWN1dGVkIGluc3RydWN0aW9ucyIpOworCituYW1lc3BhY2UgeworY2xhc3MgU2ltcGxpZnlDRkdPcHQgeworICBjb25zdCBUYXJnZXREYXRhICpjb25zdCBURDsKKworICBDb25zdGFudEludCAqR2V0Q29uc3RhbnRJbnQoVmFsdWUgKlYpOworICBWYWx1ZSAqR2F0aGVyQ29uc3RhbnRTZXRFUXMoVmFsdWUgKlYsIHN0ZDo6dmVjdG9yPENvbnN0YW50SW50Kj4gJlZhbHVlcyk7CisgIFZhbHVlICpHYXRoZXJDb25zdGFudFNldE5FcyhWYWx1ZSAqViwgc3RkOjp2ZWN0b3I8Q29uc3RhbnRJbnQqPiAmVmFsdWVzKTsKKyAgYm9vbCBHYXRoZXJWYWx1ZUNvbXBhcmlzb25zKEluc3RydWN0aW9uICpDb25kLCBWYWx1ZSAqJkNvbXBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudEludCo+ICZWYWx1ZXMpOworICBWYWx1ZSAqaXNWYWx1ZUVxdWFsaXR5Q29tcGFyaXNvbihUZXJtaW5hdG9ySW5zdCAqVEkpOworICBCYXNpY0Jsb2NrICpHZXRWYWx1ZUVxdWFsaXR5Q29tcGFyaXNvbkNhc2VzKFRlcm1pbmF0b3JJbnN0ICpUSSwKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q29uc3RhbnRJbnQqLCBCYXNpY0Jsb2NrKj4gPiAmQ2FzZXMpOworICBib29sIFNpbXBsaWZ5RXF1YWxpdHlDb21wYXJpc29uV2l0aE9ubHlQcmVkZWNlc3NvcihUZXJtaW5hdG9ySW5zdCAqVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlByZWQpOworICBib29sIEZvbGRWYWx1ZUNvbXBhcmlzb25JbnRvUHJlZGVjZXNzb3JzKFRlcm1pbmF0b3JJbnN0ICpUSSk7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU2ltcGxpZnlDRkdPcHQoY29uc3QgVGFyZ2V0RGF0YSAqdGQpIDogVEQodGQpIHt9CisgIGJvb2wgcnVuKEJhc2ljQmxvY2sgKkJCKTsKK307Cit9CisKKy8vLyBTYWZlVG9NZXJnZVRlcm1pbmF0b3JzIC0gUmV0dXJuIHRydWUgaWYgaXQgaXMgc2FmZSB0byBtZXJnZSB0aGVzZSB0d28KKy8vLyB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucyB0b2dldGhlci4KKy8vLworc3RhdGljIGJvb2wgU2FmZVRvTWVyZ2VUZXJtaW5hdG9ycyhUZXJtaW5hdG9ySW5zdCAqU0kxLCBUZXJtaW5hdG9ySW5zdCAqU0kyKSB7CisgIGlmIChTSTEgPT0gU0kyKSByZXR1cm4gZmFsc2U7ICAvLyBDYW4ndCBtZXJnZSB3aXRoIHNlbGYhCisgIAorICAvLyBJdCBpcyBub3Qgc2FmZSB0byBtZXJnZSB0aGVzZSB0d28gc3dpdGNoIGluc3RydWN0aW9ucyBpZiB0aGV5IGhhdmUgYSBjb21tb24KKyAgLy8gc3VjY2Vzc29yLCBhbmQgaWYgdGhhdCBzdWNjZXNzb3IgaGFzIGEgUEhJIG5vZGUsIGFuZCBpZiAqdGhhdCogUEhJIG5vZGUgaGFzCisgIC8vIGNvbmZsaWN0aW5nIGluY29taW5nIHZhbHVlcyBmcm9tIHRoZSB0d28gc3dpdGNoIGJsb2Nrcy4KKyAgQmFzaWNCbG9jayAqU0kxQkIgPSBTSTEtPmdldFBhcmVudCgpOworICBCYXNpY0Jsb2NrICpTSTJCQiA9IFNJMi0+Z2V0UGFyZW50KCk7CisgIFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sqLCAxNj4gU0kxU3VjY3Moc3VjY19iZWdpbihTSTFCQiksIHN1Y2NfZW5kKFNJMUJCKSk7CisgIAorICBmb3IgKHN1Y2NfaXRlcmF0b3IgSSA9IHN1Y2NfYmVnaW4oU0kyQkIpLCBFID0gc3VjY19lbmQoU0kyQkIpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoU0kxU3VjY3MuY291bnQoKkkpKQorICAgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSAoKkkpLT5iZWdpbigpOworICAgICAgICAgICBpc2E8UEhJTm9kZT4oQkJJKTsgKytCQkkpIHsKKyAgICAgICAgUEhJTm9kZSAqUE4gPSBjYXN0PFBISU5vZGU+KEJCSSk7CisgICAgICAgIGlmIChQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKFNJMUJCKSAhPQorICAgICAgICAgICAgUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhTSTJCQikpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgICAKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBBZGRQcmVkZWNlc3NvclRvQmxvY2sgLSBVcGRhdGUgUEhJIG5vZGVzIGluIFN1Y2MgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSB3aWxsCisvLy8gbm93IGJlIGVudHJpZXMgaW4gaXQgZnJvbSB0aGUgJ05ld1ByZWQnIGJsb2NrLiAgVGhlIHZhbHVlcyB0aGF0IHdpbGwgYmUKKy8vLyBmbG93aW5nIGludG8gdGhlIFBISSBub2RlcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRob3NlIGNvbWluZyBpbiBmcm9tCisvLy8gRXhpc3RQcmVkLCBhbiBleGlzdGluZyBwcmVkZWNlc3NvciBvZiBTdWNjLgorc3RhdGljIHZvaWQgQWRkUHJlZGVjZXNzb3JUb0Jsb2NrKEJhc2ljQmxvY2sgKlN1Y2MsIEJhc2ljQmxvY2sgKk5ld1ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqRXhpc3RQcmVkKSB7CisgIGFzc2VydChzdGQ6OmZpbmQoc3VjY19iZWdpbihFeGlzdFByZWQpLCBzdWNjX2VuZChFeGlzdFByZWQpLCBTdWNjKSAhPQorICAgICAgICAgc3VjY19lbmQoRXhpc3RQcmVkKSAmJiAiRXhpc3RQcmVkIGlzIG5vdCBhIHByZWRlY2Vzc29yIG9mIFN1Y2MhIik7CisgIGlmICghaXNhPFBISU5vZGU+KFN1Y2MtPmJlZ2luKCkpKSByZXR1cm47IC8vIFF1aWNrIGV4aXQgaWYgbm90aGluZyB0byBkbworICAKKyAgUEhJTm9kZSAqUE47CisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IFN1Y2MtPmJlZ2luKCk7CisgICAgICAgKFBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSSkpOyArK0kpCisgICAgUE4tPmFkZEluY29taW5nKFBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soRXhpc3RQcmVkKSwgTmV3UHJlZCk7Cit9CisKKworLy8vIEdldElmQ29uZGl0aW9uIC0gR2l2ZW4gYSBiYXNpYyBibG9jayAoQkIpIHdpdGggdHdvIHByZWRlY2Vzc29ycyAoYW5kCisvLy8gcHJlc3VtYWJseSBQSEkgbm9kZXMgaW4gaXQpLCBjaGVjayB0byBzZWUgaWYgdGhlIG1lcmdlIGF0IHRoaXMgYmxvY2sgaXMgZHVlCisvLy8gdG8gYW4gImlmIGNvbmRpdGlvbiIuICBJZiBzbywgcmV0dXJuIHRoZSBib29sZWFuIGNvbmRpdGlvbiB0aGF0IGRldGVybWluZXMKKy8vLyB3aGljaCBlbnRyeSBpbnRvIEJCIHdpbGwgYmUgdGFrZW4uICBBbHNvLCByZXR1cm4gYnkgcmVmZXJlbmNlcyB0aGUgYmxvY2sKKy8vLyB0aGF0IHdpbGwgYmUgZW50ZXJlZCBmcm9tIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgYW5kIHRoZSBibG9jayB0aGF0IHdpbGwKKy8vLyBiZSBlbnRlcmVkIGlmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuCisvLy8KKy8vLworc3RhdGljIFZhbHVlICpHZXRJZkNvbmRpdGlvbihCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqJklmVHJ1ZSwgQmFzaWNCbG9jayAqJklmRmFsc2UpIHsKKyAgYXNzZXJ0KHN0ZDo6ZGlzdGFuY2UocHJlZF9iZWdpbihCQiksIHByZWRfZW5kKEJCKSkgPT0gMiAmJgorICAgICAgICAgIkZ1bmN0aW9uIGNhbiBvbmx5IGhhbmRsZSBibG9ja3Mgd2l0aCAyIHByZWRlY2Vzc29ycyEiKTsKKyAgQmFzaWNCbG9jayAqUHJlZDEgPSAqcHJlZF9iZWdpbihCQik7CisgIEJhc2ljQmxvY2sgKlByZWQyID0gKisrcHJlZF9iZWdpbihCQik7CisKKyAgLy8gV2UgY2FuIG9ubHkgaGFuZGxlIGJyYW5jaGVzLiAgT3RoZXIgY29udHJvbCBmbG93IHdpbGwgYmUgbG93ZXJlZCB0bworICAvLyBicmFuY2hlcyBpZiBwb3NzaWJsZSBhbnl3YXkuCisgIGlmICghaXNhPEJyYW5jaEluc3Q+KFByZWQxLT5nZXRUZXJtaW5hdG9yKCkpIHx8CisgICAgICAhaXNhPEJyYW5jaEluc3Q+KFByZWQyLT5nZXRUZXJtaW5hdG9yKCkpKQorICAgIHJldHVybiAwOworICBCcmFuY2hJbnN0ICpQcmVkMUJyID0gY2FzdDxCcmFuY2hJbnN0PihQcmVkMS0+Z2V0VGVybWluYXRvcigpKTsKKyAgQnJhbmNoSW5zdCAqUHJlZDJCciA9IGNhc3Q8QnJhbmNoSW5zdD4oUHJlZDItPmdldFRlcm1pbmF0b3IoKSk7CisKKyAgLy8gRWxpbWluYXRlIGNvZGUgZHVwbGljYXRpb24gYnkgZW5zdXJpbmcgdGhhdCBQcmVkMUJyIGlzIGNvbmRpdGlvbmFsIGlmCisgIC8vIGVpdGhlciBhcmUuCisgIGlmIChQcmVkMkJyLT5pc0NvbmRpdGlvbmFsKCkpIHsKKyAgICAvLyBJZiBib3RoIGJyYW5jaGVzIGFyZSBjb25kaXRpb25hbCwgd2UgZG9uJ3QgaGF2ZSBhbiAiaWYgc3RhdGVtZW50Ii4gIEluCisgICAgLy8gcmVhbGl0eSwgd2UgY291bGQgdHJhbnNmb3JtIHRoaXMgY2FzZSwgYnV0IHNpbmNlIHRoZSBjb25kaXRpb24gd2lsbCBiZQorICAgIC8vIHJlcXVpcmVkIGFueXdheSwgd2Ugc3RhbmQgbm8gY2hhbmNlIG9mIGVsaW1pbmF0aW5nIGl0LCBzbyB0aGUgeGZvcm0gaXMKKyAgICAvLyBwcm9iYWJseSBub3QgcHJvZml0YWJsZS4KKyAgICBpZiAoUHJlZDFCci0+aXNDb25kaXRpb25hbCgpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGQ6OnN3YXAoUHJlZDEsIFByZWQyKTsKKyAgICBzdGQ6OnN3YXAoUHJlZDFCciwgUHJlZDJCcik7CisgIH0KKworICBpZiAoUHJlZDFCci0+aXNDb25kaXRpb25hbCgpKSB7CisgICAgLy8gSWYgd2UgZm91bmQgYSBjb25kaXRpb25hbCBicmFuY2ggcHJlZGVjZXNzb3IsIG1ha2Ugc3VyZSB0aGF0IGl0IGJyYW5jaGVzCisgICAgLy8gdG8gQkIgYW5kIFByZWQyQnIuICBJZiBpdCBkb2Vzbid0LCB0aGlzIGlzbid0IGFuICJpZiBzdGF0ZW1lbnQiLgorICAgIGlmIChQcmVkMUJyLT5nZXRTdWNjZXNzb3IoMCkgPT0gQkIgJiYKKyAgICAgICAgUHJlZDFCci0+Z2V0U3VjY2Vzc29yKDEpID09IFByZWQyKSB7CisgICAgICBJZlRydWUgPSBQcmVkMTsKKyAgICAgIElmRmFsc2UgPSBQcmVkMjsKKyAgICB9IGVsc2UgaWYgKFByZWQxQnItPmdldFN1Y2Nlc3NvcigwKSA9PSBQcmVkMiAmJgorICAgICAgICAgICAgICAgUHJlZDFCci0+Z2V0U3VjY2Vzc29yKDEpID09IEJCKSB7CisgICAgICBJZlRydWUgPSBQcmVkMjsKKyAgICAgIElmRmFsc2UgPSBQcmVkMTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2Uga25vdyB0aGF0IG9uZSBhcm0gb2YgdGhlIGNvbmRpdGlvbmFsIGdvZXMgdG8gQkIsIHNvIHRoZSBvdGhlciBtdXN0CisgICAgICAvLyBnbyBzb21ld2hlcmUgdW5yZWxhdGVkLCBhbmQgdGhpcyBtdXN0IG5vdCBiZSBhbiAiaWYgc3RhdGVtZW50Ii4KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFRoZSBvbmx5IHRoaW5nIHdlIGhhdmUgdG8gd2F0Y2ggb3V0IGZvciBoZXJlIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IFByZWQyCisgICAgLy8gZG9lc24ndCBoYXZlIGluY29taW5nIGVkZ2VzIGZyb20gb3RoZXIgYmxvY2tzLiAgSWYgaXQgZG9lcywgdGhlIGNvbmRpdGlvbgorICAgIC8vIGRvZXNuJ3QgZG9taW5hdGUgQkIuCisgICAgaWYgKCsrcHJlZF9iZWdpbihQcmVkMikgIT0gcHJlZF9lbmQoUHJlZDIpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gUHJlZDFCci0+Z2V0Q29uZGl0aW9uKCk7CisgIH0KKworICAvLyBPaywgaWYgd2UgZ290IGhlcmUsIGJvdGggcHJlZGVjZXNzb3JzIGVuZCB3aXRoIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHRvCisgIC8vIEJCLiAgRG9uJ3QgcGFuaWMhICBJZiBib3RoIGJsb2NrcyBvbmx5IGhhdmUgYSBzaW5nbGUgKGlkZW50aWNhbCkKKyAgLy8gcHJlZGVjZXNzb3IsIGFuZCBUSEFUIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoLCB0aGVuIHdlJ3JlIGFsbCBvayEKKyAgaWYgKHByZWRfYmVnaW4oUHJlZDEpID09IHByZWRfZW5kKFByZWQxKSB8fAorICAgICAgKytwcmVkX2JlZ2luKFByZWQxKSAhPSBwcmVkX2VuZChQcmVkMSkgfHwKKyAgICAgIHByZWRfYmVnaW4oUHJlZDIpID09IHByZWRfZW5kKFByZWQyKSB8fAorICAgICAgKytwcmVkX2JlZ2luKFByZWQyKSAhPSBwcmVkX2VuZChQcmVkMikgfHwKKyAgICAgICpwcmVkX2JlZ2luKFByZWQxKSAhPSAqcHJlZF9iZWdpbihQcmVkMikpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gT3RoZXJ3aXNlLCBpZiB0aGlzIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoLCB0aGVuIHdlIGNhbiB1c2UgaXQhCisgIEJhc2ljQmxvY2sgKkNvbW1vblByZWQgPSAqcHJlZF9iZWdpbihQcmVkMSk7CisgIGlmIChCcmFuY2hJbnN0ICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KENvbW1vblByZWQtPmdldFRlcm1pbmF0b3IoKSkpIHsKKyAgICBhc3NlcnQoQkktPmlzQ29uZGl0aW9uYWwoKSAmJiAiVHdvIHN1Y2Nlc3NvcnMgYnV0IG5vdCBjb25kaXRpb25hbD8iKTsKKyAgICBpZiAoQkktPmdldFN1Y2Nlc3NvcigwKSA9PSBQcmVkMSkgeworICAgICAgSWZUcnVlID0gUHJlZDE7CisgICAgICBJZkZhbHNlID0gUHJlZDI7CisgICAgfSBlbHNlIHsKKyAgICAgIElmVHJ1ZSA9IFByZWQyOworICAgICAgSWZGYWxzZSA9IFByZWQxOworICAgIH0KKyAgICByZXR1cm4gQkktPmdldENvbmRpdGlvbigpOworICB9CisgIHJldHVybiAwOworfQorCisvLy8gRG9taW5hdGVzTWVyZ2VQb2ludCAtIElmIHdlIGhhdmUgYSBtZXJnZSBwb2ludCBvZiBhbiAiaWYgY29uZGl0aW9uIiBhcworLy8vIGFjY2VwdGVkIGFib3ZlLCByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGRvbWluYXRlcyB0aGUgYmxvY2suICBXZQorLy8vIGRvbid0IGhhbmRsZSB0aGUgdHJ1ZSBnZW5lcmFsaXR5IG9mIGRvbWluYXRpb24gaGVyZSwganVzdCBhIHNwZWNpYWwgY2FzZQorLy8vIHdoaWNoIHdvcmtzIHdlbGwgZW5vdWdoIGZvciB1cy4KKy8vLworLy8vIElmIEFnZ3Jlc3NpdmVJbnN0cyBpcyBub24tbnVsbCwgYW5kIGlmIFYgZG9lcyBub3QgZG9taW5hdGUgQkIsIHdlIGNoZWNrIHRvCisvLy8gc2VlIGlmIFYgKHdoaWNoIG11c3QgYmUgYW4gaW5zdHJ1Y3Rpb24pIGlzIGNoZWFwIHRvIGNvbXB1dGUgYW5kIGlzCisvLy8gbm9uLXRyYXBwaW5nLiAgSWYgYm90aCBhcmUgdHJ1ZSwgdGhlIGluc3RydWN0aW9uIGlzIGluc2VydGVkIGludG8gdGhlIHNldAorLy8vIGFuZCB0cnVlIGlzIHJldHVybmVkLgorc3RhdGljIGJvb2wgRG9taW5hdGVzTWVyZ2VQb2ludChWYWx1ZSAqViwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PEluc3RydWN0aW9uKj4gKkFnZ3Jlc3NpdmVJbnN0cykgeworICBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKTsKKyAgaWYgKCFJKSB7CisgICAgLy8gTm9uLWluc3RydWN0aW9ucyBhbGwgZG9taW5hdGUgaW5zdHJ1Y3Rpb25zLCBidXQgbm90IGFsbCBjb25zdGFudGV4cHJzCisgICAgLy8gY2FuIGJlIGV4ZWN1dGVkIHVuY29uZGl0aW9uYWxseS4KKyAgICBpZiAoQ29uc3RhbnRFeHByICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihWKSkKKyAgICAgIGlmIChDLT5jYW5UcmFwKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBCYXNpY0Jsb2NrICpQQkIgPSBJLT5nZXRQYXJlbnQoKTsKKworICAvLyBXZSBkb24ndCB3YW50IHRvIGFsbG93IHdlaXJkIGxvb3BzIHRoYXQgbWlnaHQgaGF2ZSB0aGUgImlmIGNvbmRpdGlvbiIgaW4KKyAgLy8gdGhlIGJvdHRvbSBvZiB0aGlzIGJsb2NrLgorICBpZiAoUEJCID09IEJCKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBkZWZpbmVkIGluIGEgYmxvY2sgdGhhdCBjb250YWlucyBhbiB1bmNvbmRpdGlvbmFsCisgIC8vIGJyYW5jaCB0byBCQiwgdGhlbiBpdCBtdXN0IGJlIGluIHRoZSAnY29uZGl0aW9uYWwnIHBhcnQgb2YgdGhlICJpZgorICAvLyBzdGF0ZW1lbnQiLgorICBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihQQkItPmdldFRlcm1pbmF0b3IoKSkpCisgICAgaWYgKEJJLT5pc1VuY29uZGl0aW9uYWwoKSAmJiBCSS0+Z2V0U3VjY2Vzc29yKDApID09IEJCKSB7CisgICAgICBpZiAoIUFnZ3Jlc3NpdmVJbnN0cykgcmV0dXJuIGZhbHNlOworICAgICAgLy8gT2theSwgaXQgbG9va3MgbGlrZSB0aGUgaW5zdHJ1Y3Rpb24gSVMgaW4gdGhlICJjb25kaXRpb24iLiAgQ2hlY2sgdG8KKyAgICAgIC8vIHNlZSBpZiBpdCdzIGEgY2hlYXAgaW5zdHJ1Y3Rpb24gdG8gdW5jb25kaXRpb25hbGx5IGNvbXB1dGUsIGFuZCBpZiBpdAorICAgICAgLy8gb25seSB1c2VzIHN0dWZmIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgY29uZGl0aW9uLiAgSWYgc28sIGhvaXN0IGl0IG91dC4KKyAgICAgIGlmICghSS0+aXNTYWZlVG9TcGVjdWxhdGl2ZWx5RXhlY3V0ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsgIC8vIENhbm5vdCBob2lzdCB0aGlzIG91dCBzYWZlbHkuCisgICAgICBjYXNlIEluc3RydWN0aW9uOjpMb2FkOiB7CisgICAgICAgIC8vIFdlIGhhdmUgdG8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBpbnN0cnVjdGlvbnMgYmVmb3JlIHRoZQorICAgICAgICAvLyBsb2FkIGluIGl0cyBiYXNpYyBibG9jaywgYXMgd2UgYXJlIGdvaW5nIHRvIGhvaXN0IHRoZSBsb29wIG91dCB0bworICAgICAgICAvLyBpdHMgcHJlZGVjZXNzb3IuCisgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElQID0gUEJCLT5iZWdpbigpOworICAgICAgICBpZiAoSVAgIT0gQmFzaWNCbG9jazo6aXRlcmF0b3IoSSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpJQ21wOgorICAgICAgICBicmVhazsgICAvLyBUaGVzZSBhcmUgYWxsIGNoZWFwIGFuZCBub24tdHJhcHBpbmcgaW5zdHJ1Y3Rpb25zLgorICAgICAgfQorCisgICAgICAvLyBPa2F5LCB3ZSBjYW4gb25seSByZWFsbHkgaG9pc3QgdGhlc2Ugb3V0IGlmIHRoZWlyIG9wZXJhbmRzIGFyZSBub3QKKyAgICAgIC8vIGRlZmluZWQgaW4gdGhlIGNvbmRpdGlvbmFsIHJlZ2lvbi4KKyAgICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgaSA9IEktPm9wX2JlZ2luKCksIGUgPSBJLT5vcF9lbmQoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmICghRG9taW5hdGVzTWVyZ2VQb2ludCgqaSwgQkIsIDApKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIC8vIE9rYXksIGl0J3Mgc2FmZSB0byBkbyB0aGlzISAgUmVtZW1iZXIgdGhpcyBpbnN0cnVjdGlvbi4KKyAgICAgIEFnZ3Jlc3NpdmVJbnN0cy0+aW5zZXJ0KEkpOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIEdldENvbnN0YW50SW50IC0gRXh0cmFjdCBDb25zdGFudEludCBmcm9tIHZhbHVlLCBsb29raW5nIHRocm91Z2ggSW50VG9QdHIKKy8vLyBhbmQgUG9pbnRlck51bGxWYWx1ZS4gUmV0dXJuIE5VTEwgaWYgdmFsdWUgaXMgbm90IGEgY29uc3RhbnQgaW50LgorQ29uc3RhbnRJbnQgKlNpbXBsaWZ5Q0ZHT3B0OjpHZXRDb25zdGFudEludChWYWx1ZSAqVikgeworICAvLyBOb3JtYWwgY29uc3RhbnQgaW50LgorICBDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVik7CisgIGlmIChDSSB8fCAhVEQgfHwgIWlzYTxDb25zdGFudD4oVikgfHwgIVYtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkKKyAgICByZXR1cm4gQ0k7CisKKyAgLy8gVGhpcyBpcyBzb21lIGtpbmQgb2YgcG9pbnRlciBjb25zdGFudC4gVHVybiBpdCBpbnRvIGEgcG9pbnRlci1zaXplZAorICAvLyBDb25zdGFudEludCBpZiBwb3NzaWJsZS4KKyAgY29uc3QgSW50ZWdlclR5cGUgKlB0clR5ID0gVEQtPmdldEludFB0clR5cGUoVi0+Z2V0Q29udGV4dCgpKTsKKworICAvLyBOdWxsIHBvaW50ZXIgbWVhbnMgMCwgc2VlIFNlbGVjdGlvbkRBR0J1aWxkZXI6OmdldFZhbHVlKGNvbnN0IFZhbHVlKikuCisgIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oVikpCisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoUHRyVHksIDApOworCisgIC8vIEludFRvUHRyIGNvbnN0IGludC4KKyAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKQorICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkludFRvUHRyKQorICAgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDRS0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgLy8gVGhlIGNvbnN0YW50IGlzIHZlcnkgbGlrZWx5IHRvIGhhdmUgdGhlIHJpZ2h0IHR5cGUgYWxyZWFkeS4KKyAgICAgICAgaWYgKENJLT5nZXRUeXBlKCkgPT0gUHRyVHkpCisgICAgICAgICAgcmV0dXJuIENJOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+CisgICAgICAgICAgICAoQ29uc3RhbnRFeHByOjpnZXRJbnRlZ2VyQ2FzdChDSSwgUHRyVHksIC8qaXNTaWduZWQ9Ki9mYWxzZSkpOworICAgICAgfQorICByZXR1cm4gMDsKK30KKworLy8vIEdhdGhlckNvbnN0YW50U2V0RVFzIC0gR2l2ZW4gYSBwb3RlbnRpYWxseSAnb3InZCB0b2dldGhlciBjb2xsZWN0aW9uIG9mCisvLy8gaWNtcF9lcSBpbnN0cnVjdGlvbnMgdGhhdCBjb21wYXJlIGEgdmFsdWUgYWdhaW5zdCBhIGNvbnN0YW50LCByZXR1cm4gdGhlCisvLy8gdmFsdWUgYmVpbmcgY29tcGFyZWQsIGFuZCBzdGljayB0aGUgY29uc3RhbnQgaW50byB0aGUgVmFsdWVzIHZlY3Rvci4KK1ZhbHVlICpTaW1wbGlmeUNGR09wdDo6CitHYXRoZXJDb25zdGFudFNldEVRcyhWYWx1ZSAqViwgc3RkOjp2ZWN0b3I8Q29uc3RhbnRJbnQqPiAmVmFsdWVzKSB7CisgIGlmIChJbnN0cnVjdGlvbiAqSW5zdCA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkgeworICAgIGlmIChJbnN0LT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SUNtcCAmJgorICAgICAgICBjYXN0PElDbXBJbnN0PihJbnN0KS0+Z2V0UHJlZGljYXRlKCkgPT0gSUNtcEluc3Q6OklDTVBfRVEpIHsKKyAgICAgIGlmIChDb25zdGFudEludCAqQyA9IEdldENvbnN0YW50SW50KEluc3QtPmdldE9wZXJhbmQoMSkpKSB7CisgICAgICAgIFZhbHVlcy5wdXNoX2JhY2soQyk7CisgICAgICAgIHJldHVybiBJbnN0LT5nZXRPcGVyYW5kKDApOworICAgICAgfSBlbHNlIGlmIChDb25zdGFudEludCAqQyA9IEdldENvbnN0YW50SW50KEluc3QtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgIFZhbHVlcy5wdXNoX2JhY2soQyk7CisgICAgICAgIHJldHVybiBJbnN0LT5nZXRPcGVyYW5kKDEpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoSW5zdC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Ok9yKSB7CisgICAgICBpZiAoVmFsdWUgKkxIUyA9IEdhdGhlckNvbnN0YW50U2V0RVFzKEluc3QtPmdldE9wZXJhbmQoMCksIFZhbHVlcykpCisgICAgICAgIGlmIChWYWx1ZSAqUkhTID0gR2F0aGVyQ29uc3RhbnRTZXRFUXMoSW5zdC0+Z2V0T3BlcmFuZCgxKSwgVmFsdWVzKSkKKyAgICAgICAgICBpZiAoTEhTID09IFJIUykKKyAgICAgICAgICAgIHJldHVybiBMSFM7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLy8gR2F0aGVyQ29uc3RhbnRTZXRORXMgLSBHaXZlbiBhIHBvdGVudGlhbGx5ICdhbmQnZCB0b2dldGhlciBjb2xsZWN0aW9uIG9mCisvLy8gc2V0bmUgaW5zdHJ1Y3Rpb25zIHRoYXQgY29tcGFyZSBhIHZhbHVlIGFnYWluc3QgYSBjb25zdGFudCwgcmV0dXJuIHRoZSB2YWx1ZQorLy8vIGJlaW5nIGNvbXBhcmVkLCBhbmQgc3RpY2sgdGhlIGNvbnN0YW50IGludG8gdGhlIFZhbHVlcyB2ZWN0b3IuCitWYWx1ZSAqU2ltcGxpZnlDRkdPcHQ6OgorR2F0aGVyQ29uc3RhbnRTZXRORXMoVmFsdWUgKlYsIHN0ZDo6dmVjdG9yPENvbnN0YW50SW50Kj4gJlZhbHVlcykgeworICBpZiAoSW5zdHJ1Y3Rpb24gKkluc3QgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpIHsKKyAgICBpZiAoSW5zdC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OklDbXAgJiYKKyAgICAgICAgICAgICAgIGNhc3Q8SUNtcEluc3Q+KEluc3QpLT5nZXRQcmVkaWNhdGUoKSA9PSBJQ21wSW5zdDo6SUNNUF9ORSkgeworICAgICAgaWYgKENvbnN0YW50SW50ICpDID0gR2V0Q29uc3RhbnRJbnQoSW5zdC0+Z2V0T3BlcmFuZCgxKSkpIHsKKyAgICAgICAgVmFsdWVzLnB1c2hfYmFjayhDKTsKKyAgICAgICAgcmV0dXJuIEluc3QtPmdldE9wZXJhbmQoMCk7CisgICAgICB9IGVsc2UgaWYgKENvbnN0YW50SW50ICpDID0gR2V0Q29uc3RhbnRJbnQoSW5zdC0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgVmFsdWVzLnB1c2hfYmFjayhDKTsKKyAgICAgICAgcmV0dXJuIEluc3QtPmdldE9wZXJhbmQoMSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChJbnN0LT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QW5kKSB7CisgICAgICBpZiAoVmFsdWUgKkxIUyA9IEdhdGhlckNvbnN0YW50U2V0TkVzKEluc3QtPmdldE9wZXJhbmQoMCksIFZhbHVlcykpCisgICAgICAgIGlmIChWYWx1ZSAqUkhTID0gR2F0aGVyQ29uc3RhbnRTZXRORXMoSW5zdC0+Z2V0T3BlcmFuZCgxKSwgVmFsdWVzKSkKKyAgICAgICAgICBpZiAoTEhTID09IFJIUykKKyAgICAgICAgICAgIHJldHVybiBMSFM7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLy8gR2F0aGVyVmFsdWVDb21wYXJpc29ucyAtIElmIHRoZSBzcGVjaWZpZWQgQ29uZCBpcyBhbiAnYW5kJyBvciAnb3InIG9mIGEKKy8vLyBidW5jaCBvZiBjb21wYXJpc29ucyBvZiBvbmUgdmFsdWUgYWdhaW5zdCBjb25zdGFudHMsIHJldHVybiB0aGUgdmFsdWUgYW5kCisvLy8gdGhlIGNvbnN0YW50cyBiZWluZyBjb21wYXJlZC4KK2Jvb2wgU2ltcGxpZnlDRkdPcHQ6OkdhdGhlclZhbHVlQ29tcGFyaXNvbnMoSW5zdHJ1Y3Rpb24gKkNvbmQsIFZhbHVlIComQ29tcFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnRJbnQqPiAmVmFsdWVzKSB7CisgIGlmIChDb25kLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6T3IpIHsKKyAgICBDb21wVmFsID0gR2F0aGVyQ29uc3RhbnRTZXRFUXMoQ29uZCwgVmFsdWVzKTsKKworICAgIC8vIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIGlmIHRoZSBDb21wVmFsIGlzCisgICAgLy8gZXF1YWwgdG8gb25lIG9mIHRoZSBjb25zdGFudHMuCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoQ29uZC0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFuZCkgeworICAgIENvbXBWYWwgPSBHYXRoZXJDb25zdGFudFNldE5FcyhDb25kLCBWYWx1ZXMpOworCisgICAgLy8gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSBpZiB0aGUgQ29tcFZhbCBpcworICAgIC8vIGVxdWFsIHRvIG9uZSBvZiB0aGUgY29uc3RhbnRzLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIEVyYXNlVGVybWluYXRvckluc3RBbmREQ0VDb25kKFRlcm1pbmF0b3JJbnN0ICpUSSkgeworICBJbnN0cnVjdGlvbiogQ29uZCA9IDA7CisgIGlmIChTd2l0Y2hJbnN0ICpTSSA9IGR5bl9jYXN0PFN3aXRjaEluc3Q+KFRJKSkgeworICAgIENvbmQgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oU0ktPmdldENvbmRpdGlvbigpKTsKKyAgfSBlbHNlIGlmIChCcmFuY2hJbnN0ICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KFRJKSkgeworICAgIGlmIChCSS0+aXNDb25kaXRpb25hbCgpKQorICAgICAgQ29uZCA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihCSS0+Z2V0Q29uZGl0aW9uKCkpOworICB9CisKKyAgVEktPmVyYXNlRnJvbVBhcmVudCgpOworICBpZiAoQ29uZCkgUmVjdXJzaXZlbHlEZWxldGVUcml2aWFsbHlEZWFkSW5zdHJ1Y3Rpb25zKENvbmQpOworfQorCisvLy8gaXNWYWx1ZUVxdWFsaXR5Q29tcGFyaXNvbiAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdGVybWluYXRvciBjaGVja3MKKy8vLyB0byBzZWUgaWYgYSB2YWx1ZSBpcyBlcXVhbCB0byBjb25zdGFudCBpbnRlZ2VyIHZhbHVlLgorVmFsdWUgKlNpbXBsaWZ5Q0ZHT3B0Ojppc1ZhbHVlRXF1YWxpdHlDb21wYXJpc29uKFRlcm1pbmF0b3JJbnN0ICpUSSkgeworICBWYWx1ZSAqQ1YgPSAwOworICBpZiAoU3dpdGNoSW5zdCAqU0kgPSBkeW5fY2FzdDxTd2l0Y2hJbnN0PihUSSkpIHsKKyAgICAvLyBEbyBub3QgcGVybWl0IG1lcmdpbmcgb2YgbGFyZ2Ugc3dpdGNoIGluc3RydWN0aW9ucyBpbnRvIHRoZWlyCisgICAgLy8gcHJlZGVjZXNzb3JzIHVubGVzcyB0aGVyZSBpcyBvbmx5IG9uZSBwcmVkZWNlc3Nvci4KKyAgICBpZiAoU0ktPmdldE51bVN1Y2Nlc3NvcnMoKSpzdGQ6OmRpc3RhbmNlKHByZWRfYmVnaW4oU0ktPmdldFBhcmVudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfZW5kKFNJLT5nZXRQYXJlbnQoKSkpIDw9IDEyOCkKKyAgICAgIENWID0gU0ktPmdldENvbmRpdGlvbigpOworICB9IGVsc2UgaWYgKEJyYW5jaEluc3QgKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oVEkpKQorICAgIGlmIChCSS0+aXNDb25kaXRpb25hbCgpICYmIEJJLT5nZXRDb25kaXRpb24oKS0+aGFzT25lVXNlKCkpCisgICAgICBpZiAoSUNtcEluc3QgKklDSSA9IGR5bl9jYXN0PElDbXBJbnN0PihCSS0+Z2V0Q29uZGl0aW9uKCkpKQorICAgICAgICBpZiAoKElDSS0+Z2V0UHJlZGljYXRlKCkgPT0gSUNtcEluc3Q6OklDTVBfRVEgfHwKKyAgICAgICAgICAgICBJQ0ktPmdldFByZWRpY2F0ZSgpID09IElDbXBJbnN0OjpJQ01QX05FKSAmJgorICAgICAgICAgICAgR2V0Q29uc3RhbnRJbnQoSUNJLT5nZXRPcGVyYW5kKDEpKSkKKyAgICAgICAgICBDViA9IElDSS0+Z2V0T3BlcmFuZCgwKTsKKworICAvLyBVbndyYXAgYW55IGxvc3NsZXNzIHB0cnRvaW50IGNhc3QuCisgIGlmIChURCAmJiBDViAmJiBDVi0+Z2V0VHlwZSgpID09IFRELT5nZXRJbnRQdHJUeXBlKENWLT5nZXRDb250ZXh0KCkpKQorICAgIGlmIChQdHJUb0ludEluc3QgKlBUSUkgPSBkeW5fY2FzdDxQdHJUb0ludEluc3Q+KENWKSkKKyAgICAgIENWID0gUFRJSS0+Z2V0T3BlcmFuZCgwKTsKKyAgcmV0dXJuIENWOworfQorCisvLy8gR2V0VmFsdWVFcXVhbGl0eUNvbXBhcmlzb25DYXNlcyAtIEdpdmVuIGEgdmFsdWUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbiwKKy8vLyBkZWNvZGUgYWxsIG9mIHRoZSAnY2FzZXMnIHRoYXQgaXQgcmVwcmVzZW50cyBhbmQgcmV0dXJuIHRoZSAnZGVmYXVsdCcgYmxvY2suCitCYXNpY0Jsb2NrICpTaW1wbGlmeUNGR09wdDo6CitHZXRWYWx1ZUVxdWFsaXR5Q29tcGFyaXNvbkNhc2VzKFRlcm1pbmF0b3JJbnN0ICpUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENvbnN0YW50SW50KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqPiA+ICZDYXNlcykgeworICBpZiAoU3dpdGNoSW5zdCAqU0kgPSBkeW5fY2FzdDxTd2l0Y2hJbnN0PihUSSkpIHsKKyAgICBDYXNlcy5yZXNlcnZlKFNJLT5nZXROdW1DYXNlcygpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gU0ktPmdldE51bUNhc2VzKCk7IGkgIT0gZTsgKytpKQorICAgICAgQ2FzZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFNJLT5nZXRDYXNlVmFsdWUoaSksIFNJLT5nZXRTdWNjZXNzb3IoaSkpKTsKKyAgICByZXR1cm4gU0ktPmdldERlZmF1bHREZXN0KCk7CisgIH0KKworICBCcmFuY2hJbnN0ICpCSSA9IGNhc3Q8QnJhbmNoSW5zdD4oVEkpOworICBJQ21wSW5zdCAqSUNJID0gY2FzdDxJQ21wSW5zdD4oQkktPmdldENvbmRpdGlvbigpKTsKKyAgQ2FzZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEdldENvbnN0YW50SW50KElDSS0+Z2V0T3BlcmFuZCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSS0+Z2V0U3VjY2Vzc29yKElDSS0+Z2V0UHJlZGljYXRlKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OklDTVBfTkUpKSk7CisgIHJldHVybiBCSS0+Z2V0U3VjY2Vzc29yKElDSS0+Z2V0UHJlZGljYXRlKCkgPT0gSUNtcEluc3Q6OklDTVBfRVEpOworfQorCisKKy8vLyBFbGltaW5hdGVCbG9ja0Nhc2VzIC0gR2l2ZW4gYSB2ZWN0b3Igb2YgYmIvdmFsdWUgcGFpcnMsIHJlbW92ZSBhbnkgZW50cmllcworLy8vIGluIHRoZSBsaXN0IHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBibG9jay4KK3N0YXRpYyB2b2lkIEVsaW1pbmF0ZUJsb2NrQ2FzZXMoQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q29uc3RhbnRJbnQqLCBCYXNpY0Jsb2NrKj4gPiAmQ2FzZXMpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENhc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKENhc2VzW2ldLnNlY29uZCA9PSBCQikgeworICAgICAgQ2FzZXMuZXJhc2UoQ2FzZXMuYmVnaW4oKStpKTsKKyAgICAgIC0taTsgLS1lOworICAgIH0KK30KKworLy8vIFZhbHVlc092ZXJsYXAgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGtleXMgaW4gQzEgdGhhdCBleGlzdCBpbiBDMiBhcworLy8vIHdlbGwuCitzdGF0aWMgYm9vbAorVmFsdWVzT3ZlcmxhcChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q29uc3RhbnRJbnQqLCBCYXNpY0Jsb2NrKj4gPiAmQzEsCisgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDb25zdGFudEludCosIEJhc2ljQmxvY2sqPiA+ICZDMikgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q29uc3RhbnRJbnQqLCBCYXNpY0Jsb2NrKj4gPiAqVjEgPSAmQzEsICpWMiA9ICZDMjsKKworICAvLyBNYWtlIFYxIGJlIHNtYWxsZXIgdGhhbiBWMi4KKyAgaWYgKFYxLT5zaXplKCkgPiBWMi0+c2l6ZSgpKQorICAgIHN0ZDo6c3dhcChWMSwgVjIpOworCisgIGlmIChWMS0+c2l6ZSgpID09IDApIHJldHVybiBmYWxzZTsKKyAgaWYgKFYxLT5zaXplKCkgPT0gMSkgeworICAgIC8vIEp1c3Qgc2NhbiBWMi4KKyAgICBDb25zdGFudEludCAqVGhlVmFsID0gKCpWMSlbMF0uZmlyc3Q7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFYyLT5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFRoZVZhbCA9PSAoKlYyKVtpXS5maXJzdCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBPdGhlcndpc2UsIGp1c3Qgc29ydCBib3RoIGxpc3RzIGFuZCBjb21wYXJlIGVsZW1lbnQgYnkgZWxlbWVudC4KKyAgc3RkOjpzb3J0KFYxLT5iZWdpbigpLCBWMS0+ZW5kKCkpOworICBzdGQ6OnNvcnQoVjItPmJlZ2luKCksIFYyLT5lbmQoKSk7CisgIHVuc2lnbmVkIGkxID0gMCwgaTIgPSAwLCBlMSA9IFYxLT5zaXplKCksIGUyID0gVjItPnNpemUoKTsKKyAgd2hpbGUgKGkxICE9IGUxICYmIGkyICE9IGUyKSB7CisgICAgaWYgKCgqVjEpW2kxXS5maXJzdCA9PSAoKlYyKVtpMl0uZmlyc3QpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoKCpWMSlbaTFdLmZpcnN0IDwgKCpWMilbaTJdLmZpcnN0KQorICAgICAgKytpMTsKKyAgICBlbHNlCisgICAgICArK2kyOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFNpbXBsaWZ5RXF1YWxpdHlDb21wYXJpc29uV2l0aE9ubHlQcmVkZWNlc3NvciAtIElmIFRJIGlzIGtub3duIHRvIGJlIGEKKy8vLyB0ZXJtaW5hdG9yIGluc3RydWN0aW9uIGFuZCBpdHMgYmxvY2sgaXMga25vd24gdG8gb25seSBoYXZlIGEgc2luZ2xlCisvLy8gcHJlZGVjZXNzb3IgYmxvY2ssIGNoZWNrIHRvIHNlZSBpZiB0aGF0IHByZWRlY2Vzc29yIGlzIGFsc28gYSB2YWx1ZQorLy8vIGNvbXBhcmlzb24gd2l0aCB0aGUgc2FtZSB2YWx1ZSwgYW5kIGlmIHRoYXQgY29tcGFyaXNvbiBkZXRlcm1pbmVzIHRoZQorLy8vIG91dGNvbWUgb2YgdGhpcyBjb21wYXJpc29uLiAgSWYgc28sIHNpbXBsaWZ5IFRJLiAgVGhpcyBkb2VzIGEgdmVyeSBsaW1pdGVkCisvLy8gZm9ybSBvZiBqdW1wIHRocmVhZGluZy4KK2Jvb2wgU2ltcGxpZnlDRkdPcHQ6OgorU2ltcGxpZnlFcXVhbGl0eUNvbXBhcmlzb25XaXRoT25seVByZWRlY2Vzc29yKFRlcm1pbmF0b3JJbnN0ICpUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpQcmVkKSB7CisgIFZhbHVlICpQcmVkVmFsID0gaXNWYWx1ZUVxdWFsaXR5Q29tcGFyaXNvbihQcmVkLT5nZXRUZXJtaW5hdG9yKCkpOworICBpZiAoIVByZWRWYWwpIHJldHVybiBmYWxzZTsgIC8vIE5vdCBhIHZhbHVlIGNvbXBhcmlzb24gaW4gcHJlZGVjZXNzb3IuCisKKyAgVmFsdWUgKlRoaXNWYWwgPSBpc1ZhbHVlRXF1YWxpdHlDb21wYXJpc29uKFRJKTsKKyAgYXNzZXJ0KFRoaXNWYWwgJiYgIlRoaXMgaXNuJ3QgYSB2YWx1ZSBjb21wYXJpc29uISEiKTsKKyAgaWYgKFRoaXNWYWwgIT0gUHJlZFZhbCkgcmV0dXJuIGZhbHNlOyAgLy8gRGlmZmVyZW50IHByZWRpY2F0ZXMuCisKKyAgLy8gRmluZCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgd2hlbiBjb250cm9sIHdpbGwgbW92ZSBmcm9tIFByZWQgdG8gVEkncyBibG9jay4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENvbnN0YW50SW50KiwgQmFzaWNCbG9jayo+ID4gUHJlZENhc2VzOworICBCYXNpY0Jsb2NrICpQcmVkRGVmID0gR2V0VmFsdWVFcXVhbGl0eUNvbXBhcmlzb25DYXNlcyhQcmVkLT5nZXRUZXJtaW5hdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWRDYXNlcyk7CisgIEVsaW1pbmF0ZUJsb2NrQ2FzZXMoUHJlZERlZiwgUHJlZENhc2VzKTsgIC8vIFJlbW92ZSBkZWZhdWx0IGZyb20gY2FzZXMuCisKKyAgLy8gRmluZCBpbmZvcm1hdGlvbiBhYm91dCBob3cgY29udHJvbCBsZWF2ZXMgdGhpcyBibG9jay4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENvbnN0YW50SW50KiwgQmFzaWNCbG9jayo+ID4gVGhpc0Nhc2VzOworICBCYXNpY0Jsb2NrICpUaGlzRGVmID0gR2V0VmFsdWVFcXVhbGl0eUNvbXBhcmlzb25DYXNlcyhUSSwgVGhpc0Nhc2VzKTsKKyAgRWxpbWluYXRlQmxvY2tDYXNlcyhUaGlzRGVmLCBUaGlzQ2FzZXMpOyAgLy8gUmVtb3ZlIGRlZmF1bHQgZnJvbSBjYXNlcy4KKworICAvLyBJZiBUSSdzIGJsb2NrIGlzIHRoZSBkZWZhdWx0IGJsb2NrIGZyb20gUHJlZCdzIGNvbXBhcmlzb24sIHBvdGVudGlhbGx5CisgIC8vIHNpbXBsaWZ5IFRJIGJhc2VkIG9uIHRoaXMga25vd2xlZGdlLgorICBpZiAoUHJlZERlZiA9PSBUSS0+Z2V0UGFyZW50KCkpIHsKKyAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgd2Uga25vdyB0aGF0IHRoZSB2YWx1ZSBpcyBub25lIG9mIHRob3NlIGNhc2VzIGxpc3RlZCBpbgorICAgIC8vIFByZWRDYXNlcy4gIElmIHRoZXJlIGFyZSBhbnkgY2FzZXMgaW4gVGhpc0Nhc2VzIHRoYXQgYXJlIGluIFByZWRDYXNlcywgd2UKKyAgICAvLyBjYW4gc2ltcGxpZnkgVEkuCisgICAgaWYgKFZhbHVlc092ZXJsYXAoUHJlZENhc2VzLCBUaGlzQ2FzZXMpKSB7CisgICAgICBpZiAoaXNhPEJyYW5jaEluc3Q+KFRJKSkgeworICAgICAgICAvLyBPa2F5LCBvbmUgb2YgdGhlIHN1Y2Nlc3NvcnMgb2YgdGhpcyBjb25kYnIgaXMgZGVhZC4gIENvbnZlcnQgaXQgdG8gYQorICAgICAgICAvLyB1bmNvbmQgYnIuCisgICAgICAgIGFzc2VydChUaGlzQ2FzZXMuc2l6ZSgpID09IDEgJiYgIkJyYW5jaCBjYW4gb25seSBoYXZlIG9uZSBjYXNlISIpOworICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBicmFuY2guCisgICAgICAgIEluc3RydWN0aW9uICpOSSA9IEJyYW5jaEluc3Q6OkNyZWF0ZShUaGlzRGVmLCBUSSk7CisgICAgICAgICh2b2lkKSBOSTsKKworICAgICAgICAvLyBSZW1vdmUgUEhJIG5vZGUgZW50cmllcyBmb3IgdGhlIGRlYWQgZWRnZS4KKyAgICAgICAgVGhpc0Nhc2VzWzBdLnNlY29uZC0+cmVtb3ZlUHJlZGVjZXNzb3IoVEktPmdldFBhcmVudCgpKTsKKworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlRocmVhZGluZyBwcmVkIGluc3RyOiAiIDw8ICpQcmVkLT5nZXRUZXJtaW5hdG9yKCkKKyAgICAgICAgICAgICA8PCAiVGhyb3VnaCBzdWNjZXNzb3IgVEk6ICIgPDwgKlRJIDw8ICJMZWF2aW5nOiAiIDw8ICpOSSA8PCAiXG4iKTsKKworICAgICAgICBFcmFzZVRlcm1pbmF0b3JJbnN0QW5kRENFQ29uZChUSSk7CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICB9IGVsc2UgeworICAgICAgICBTd2l0Y2hJbnN0ICpTSSA9IGNhc3Q8U3dpdGNoSW5zdD4oVEkpOworICAgICAgICAvLyBPa2F5LCBUSSBoYXMgY2FzZXMgdGhhdCBhcmUgc3RhdGljYWxseSBkZWFkLCBwcnVuZSB0aGVtIGF3YXkuCisgICAgICAgIFNtYWxsUHRyU2V0PENvbnN0YW50KiwgMTY+IERlYWRDYXNlczsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFByZWRDYXNlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIERlYWRDYXNlcy5pbnNlcnQoUHJlZENhc2VzW2ldLmZpcnN0KTsKKworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlRocmVhZGluZyBwcmVkIGluc3RyOiAiIDw8ICpQcmVkLT5nZXRUZXJtaW5hdG9yKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJUaHJvdWdoIHN1Y2Nlc3NvciBUSTogIiA8PCAqVEkpOworCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IFNJLT5nZXROdW1DYXNlcygpLTE7IGkgIT0gMDsgLS1pKQorICAgICAgICAgIGlmIChEZWFkQ2FzZXMuY291bnQoU0ktPmdldENhc2VWYWx1ZShpKSkpIHsKKyAgICAgICAgICAgIFNJLT5nZXRTdWNjZXNzb3IoaSktPnJlbW92ZVByZWRlY2Vzc29yKFRJLT5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICBTSS0+cmVtb3ZlQ2FzZShpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJMZWF2aW5nOiAiIDw8ICpUSSA8PCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlLCBUSSdzIGJsb2NrIG11c3QgY29ycmVzcG9uZCB0byBzb21lIG1hdGNoZWQgdmFsdWUuICBGaW5kIG91dAorICAgIC8vIHdoaWNoIHZhbHVlIChvciBzZXQgb2YgdmFsdWVzKSB0aGlzIGlzLgorICAgIENvbnN0YW50SW50ICpUSVYgPSAwOworICAgIEJhc2ljQmxvY2sgKlRJQkIgPSBUSS0+Z2V0UGFyZW50KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFByZWRDYXNlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFByZWRDYXNlc1tpXS5zZWNvbmQgPT0gVElCQikgeworICAgICAgICBpZiAoVElWID09IDApCisgICAgICAgICAgVElWID0gUHJlZENhc2VzW2ldLmZpcnN0OworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gQ2Fubm90IGhhbmRsZSBtdWx0aXBsZSB2YWx1ZXMgY29taW5nIHRvIHRoaXMgYmxvY2suCisgICAgICB9CisgICAgYXNzZXJ0KFRJViAmJiAiTm8gZWRnZSBmcm9tIHByZWQgdG8gc3VjYz8iKTsKKworICAgIC8vIE9rYXksIHdlIGZvdW5kIHRoZSBvbmUgY29uc3RhbnQgdGhhdCBvdXIgdmFsdWUgY2FuIGJlIGlmIHdlIGdldCBpbnRvIFRJJ3MKKyAgICAvLyBCQi4gIEZpbmQgb3V0IHdoaWNoIHN1Y2Nlc3NvciB3aWxsIHVuY29uZGl0aW9uYWxseSBiZSBicmFuY2hlZCB0by4KKyAgICBCYXNpY0Jsb2NrICpUaGVSZWFsRGVzdCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRoaXNDYXNlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFRoaXNDYXNlc1tpXS5maXJzdCA9PSBUSVYpIHsKKyAgICAgICAgVGhlUmVhbERlc3QgPSBUaGlzQ2FzZXNbaV0uc2Vjb25kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIC8vIElmIG5vdCBoYW5kbGVkIGJ5IGFueSBleHBsaWNpdCBjYXNlcywgaXQgaXMgaGFuZGxlZCBieSB0aGUgZGVmYXVsdCBjYXNlLgorICAgIGlmIChUaGVSZWFsRGVzdCA9PSAwKSBUaGVSZWFsRGVzdCA9IFRoaXNEZWY7CisKKyAgICAvLyBSZW1vdmUgUEhJIG5vZGUgZW50cmllcyBmb3IgZGVhZCBlZGdlcy4KKyAgICBCYXNpY0Jsb2NrICpDaGVja0VkZ2UgPSBUaGVSZWFsRGVzdDsKKyAgICBmb3IgKHN1Y2NfaXRlcmF0b3IgU0kgPSBzdWNjX2JlZ2luKFRJQkIpLCBlID0gc3VjY19lbmQoVElCQik7IFNJICE9IGU7ICsrU0kpCisgICAgICBpZiAoKlNJICE9IENoZWNrRWRnZSkKKyAgICAgICAgKCpTSSktPnJlbW92ZVByZWRlY2Vzc29yKFRJQkIpOworICAgICAgZWxzZQorICAgICAgICBDaGVja0VkZ2UgPSAwOworCisgICAgLy8gSW5zZXJ0IHRoZSBuZXcgYnJhbmNoLgorICAgIEluc3RydWN0aW9uICpOSSA9IEJyYW5jaEluc3Q6OkNyZWF0ZShUaGVSZWFsRGVzdCwgVEkpOworICAgICh2b2lkKSBOSTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiVGhyZWFkaW5nIHByZWQgaW5zdHI6ICIgPDwgKlByZWQtPmdldFRlcm1pbmF0b3IoKQorICAgICAgICAgICAgICA8PCAiVGhyb3VnaCBzdWNjZXNzb3IgVEk6ICIgPDwgKlRJIDw8ICJMZWF2aW5nOiAiIDw8ICpOSSA8PCAiXG4iKTsKKworICAgIEVyYXNlVGVybWluYXRvckluc3RBbmREQ0VDb25kKFRJKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK25hbWVzcGFjZSB7CisgIC8vLyBDb25zdGFudEludE9yZGVyaW5nIC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc3RhYmxlIG9yZGVyaW5nIG9mIGNvbnN0YW50CisgIC8vLyBpbnRlZ2VycyB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiB0aGVpciBhZGRyZXNzLiAgVGhpcyBpcyBpbXBvcnRhbnQgZm9yCisgIC8vLyBhcHBsaWNhdGlvbnMgdGhhdCBzb3J0IENvbnN0YW50SW50J3MgdG8gZW5zdXJlIHVuaXF1ZW5lc3MuCisgIHN0cnVjdCBDb25zdGFudEludE9yZGVyaW5nIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgQ29uc3RhbnRJbnQgKkxIUywgY29uc3QgQ29uc3RhbnRJbnQgKlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIExIUy0+Z2V0VmFsdWUoKS51bHQoUkhTLT5nZXRWYWx1ZSgpKTsKKyAgICB9CisgIH07Cit9CisKKy8vLyBGb2xkVmFsdWVDb21wYXJpc29uSW50b1ByZWRlY2Vzc29ycyAtIFRoZSBzcGVjaWZpZWQgdGVybWluYXRvciBpcyBhIHZhbHVlCisvLy8gZXF1YWxpdHkgY29tcGFyaXNvbiBpbnN0cnVjdGlvbiAoZWl0aGVyIGEgc3dpdGNoIG9yIGEgYnJhbmNoIG9uICJYID09IGMiKS4KKy8vLyBTZWUgaWYgYW55IG9mIHRoZSBwcmVkZWNlc3NvcnMgb2YgdGhlIHRlcm1pbmF0b3IgYmxvY2sgYXJlIHZhbHVlIGNvbXBhcmlzb25zCisvLy8gb24gdGhlIHNhbWUgdmFsdWUuICBJZiBzbywgYW5kIGlmIHNhZmUgdG8gZG8gc28sIGZvbGQgdGhlbSB0b2dldGhlci4KK2Jvb2wgU2ltcGxpZnlDRkdPcHQ6OkZvbGRWYWx1ZUNvbXBhcmlzb25JbnRvUHJlZGVjZXNzb3JzKFRlcm1pbmF0b3JJbnN0ICpUSSkgeworICBCYXNpY0Jsb2NrICpCQiA9IFRJLT5nZXRQYXJlbnQoKTsKKyAgVmFsdWUgKkNWID0gaXNWYWx1ZUVxdWFsaXR5Q29tcGFyaXNvbihUSSk7ICAvLyBDb25kVmFsCisgIGFzc2VydChDViAmJiAiTm90IGEgY29tcGFyaXNvbj8iKTsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayosIDE2PiBQcmVkcyhwcmVkX2JlZ2luKEJCKSwgcHJlZF9lbmQoQkIpKTsKKyAgd2hpbGUgKCFQcmVkcy5lbXB0eSgpKSB7CisgICAgQmFzaWNCbG9jayAqUHJlZCA9IFByZWRzLnBvcF9iYWNrX3ZhbCgpOworCisgICAgLy8gU2VlIGlmIHRoZSBwcmVkZWNlc3NvciBpcyBhIGNvbXBhcmlzb24gd2l0aCB0aGUgc2FtZSB2YWx1ZS4KKyAgICBUZXJtaW5hdG9ySW5zdCAqUFRJID0gUHJlZC0+Z2V0VGVybWluYXRvcigpOworICAgIFZhbHVlICpQQ1YgPSBpc1ZhbHVlRXF1YWxpdHlDb21wYXJpc29uKFBUSSk7ICAvLyBQcmVkQ29uZFZhbAorCisgICAgaWYgKFBDViA9PSBDViAmJiBTYWZlVG9NZXJnZVRlcm1pbmF0b3JzKFRJLCBQVEkpKSB7CisgICAgICAvLyBGaWd1cmUgb3V0IHdoaWNoICdjYXNlcycgdG8gY29weSBmcm9tIFNJIHRvIFBTSS4KKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDb25zdGFudEludCosIEJhc2ljQmxvY2sqPiA+IEJCQ2FzZXM7CisgICAgICBCYXNpY0Jsb2NrICpCQkRlZmF1bHQgPSBHZXRWYWx1ZUVxdWFsaXR5Q29tcGFyaXNvbkNhc2VzKFRJLCBCQkNhc2VzKTsKKworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENvbnN0YW50SW50KiwgQmFzaWNCbG9jayo+ID4gUHJlZENhc2VzOworICAgICAgQmFzaWNCbG9jayAqUHJlZERlZmF1bHQgPSBHZXRWYWx1ZUVxdWFsaXR5Q29tcGFyaXNvbkNhc2VzKFBUSSwgUHJlZENhc2VzKTsKKworICAgICAgLy8gQmFzZWQgb24gd2hldGhlciB0aGUgZGVmYXVsdCBlZGdlIGZyb20gUFRJIGdvZXMgdG8gQkIgb3Igbm90LCBmaWxsIGluCisgICAgICAvLyBQcmVkQ2FzZXMgYW5kIFByZWREZWZhdWx0IHdpdGggdGhlIG5ldyBzd2l0Y2ggY2FzZXMgd2Ugd291bGQgbGlrZSB0bworICAgICAgLy8gYnVpbGQuCisgICAgICBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrKiwgOD4gTmV3U3VjY2Vzc29yczsKKworICAgICAgaWYgKFByZWREZWZhdWx0ID09IEJCKSB7CisgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGRlZmF1bHQgZGVzdGluYXRpb24gZnJvbSBQVEksIG9ubHkgdGhlIGVkZ2VzIGluIFRJCisgICAgICAgIC8vIHRoYXQgZG9uJ3Qgb2NjdXIgaW4gUFRJLCBvciB0aGF0IGJyYW5jaCB0byBCQiB3aWxsIGJlIGFjdGl2YXRlZC4KKyAgICAgICAgc3RkOjpzZXQ8Q29uc3RhbnRJbnQqLCBDb25zdGFudEludE9yZGVyaW5nPiBQVElIYW5kbGVkOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUHJlZENhc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgaWYgKFByZWRDYXNlc1tpXS5zZWNvbmQgIT0gQkIpCisgICAgICAgICAgICBQVElIYW5kbGVkLmluc2VydChQcmVkQ2FzZXNbaV0uZmlyc3QpOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gaXMgQkIsIHdlIGRvbid0IG5lZWQgZXhwbGljaXQgdGFyZ2V0cy4KKyAgICAgICAgICAgIHN0ZDo6c3dhcChQcmVkQ2FzZXNbaV0sIFByZWRDYXNlcy5iYWNrKCkpOworICAgICAgICAgICAgUHJlZENhc2VzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICAtLWk7IC0tZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIG5ldyBzd2l0Y2ggc3RhdGVtZW50IHdlIHdpbGwgYmUgYnVpbGRpbmcuCisgICAgICAgIGlmIChQcmVkRGVmYXVsdCAhPSBCQkRlZmF1bHQpIHsKKyAgICAgICAgICBQcmVkRGVmYXVsdC0+cmVtb3ZlUHJlZGVjZXNzb3IoUHJlZCk7CisgICAgICAgICAgUHJlZERlZmF1bHQgPSBCQkRlZmF1bHQ7CisgICAgICAgICAgTmV3U3VjY2Vzc29ycy5wdXNoX2JhY2soQkJEZWZhdWx0KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQkJDYXNlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIGlmICghUFRJSGFuZGxlZC5jb3VudChCQkNhc2VzW2ldLmZpcnN0KSAmJgorICAgICAgICAgICAgICBCQkNhc2VzW2ldLnNlY29uZCAhPSBCQkRlZmF1bHQpIHsKKyAgICAgICAgICAgIFByZWRDYXNlcy5wdXNoX2JhY2soQkJDYXNlc1tpXSk7CisgICAgICAgICAgICBOZXdTdWNjZXNzb3JzLnB1c2hfYmFjayhCQkNhc2VzW2ldLnNlY29uZCk7CisgICAgICAgICAgfQorCisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgZGVmYXVsdCBkZXN0aW5hdGlvbiBmcm9tIFBTSSwgb25seSB0aGUgZWRnZXMKKyAgICAgICAgLy8gaW4gU0kgdGhhdCBvY2N1ciBpbiBQU0kgd2l0aCBhIGRlc3RpbmF0aW9uIG9mIEJCIHdpbGwgYmUKKyAgICAgICAgLy8gYWN0aXZhdGVkLgorICAgICAgICBzdGQ6OnNldDxDb25zdGFudEludCosIENvbnN0YW50SW50T3JkZXJpbmc+IFBUSUhhbmRsZWQ7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcmVkQ2FzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBpZiAoUHJlZENhc2VzW2ldLnNlY29uZCA9PSBCQikgeworICAgICAgICAgICAgUFRJSGFuZGxlZC5pbnNlcnQoUHJlZENhc2VzW2ldLmZpcnN0KTsKKyAgICAgICAgICAgIHN0ZDo6c3dhcChQcmVkQ2FzZXNbaV0sIFByZWRDYXNlcy5iYWNrKCkpOworICAgICAgICAgICAgUHJlZENhc2VzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICAtLWk7IC0tZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgLy8gT2theSwgbm93IHdlIGtub3cgd2hpY2ggY29uc3RhbnRzIHdlcmUgc2VudCB0byBCQiBmcm9tIHRoZQorICAgICAgICAvLyBwcmVkZWNlc3Nvci4gIEZpZ3VyZSBvdXQgd2hlcmUgdGhleSB3aWxsIGFsbCBnbyBub3cuCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCQkNhc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgaWYgKFBUSUhhbmRsZWQuY291bnQoQkJDYXNlc1tpXS5maXJzdCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgb25lIHdlIGFyZSBjYXBhYmxlIG9mIGdldHRpbmcuLi4KKyAgICAgICAgICAgIFByZWRDYXNlcy5wdXNoX2JhY2soQkJDYXNlc1tpXSk7CisgICAgICAgICAgICBOZXdTdWNjZXNzb3JzLnB1c2hfYmFjayhCQkNhc2VzW2ldLnNlY29uZCk7CisgICAgICAgICAgICBQVElIYW5kbGVkLmVyYXNlKEJCQ2FzZXNbaV0uZmlyc3QpOy8vIFRoaXMgY29uc3RhbnQgaXMgdGFrZW4gY2FyZSBvZgorICAgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGNvbnN0YW50cyB2ZWN0b3JlZCB0byBCQiB0aGF0IFRJIGRvZXNuJ3QgaGFuZGxlLAorICAgICAgICAvLyB0aGV5IG11c3QgZ28gdG8gdGhlIGRlZmF1bHQgZGVzdGluYXRpb24gb2YgVEkuCisgICAgICAgIGZvciAoc3RkOjpzZXQ8Q29uc3RhbnRJbnQqLCBDb25zdGFudEludE9yZGVyaW5nPjo6aXRlcmF0b3IgSSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRJSGFuZGxlZC5iZWdpbigpLAorICAgICAgICAgICAgICAgRSA9IFBUSUhhbmRsZWQuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgICAgUHJlZENhc2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigqSSwgQkJEZWZhdWx0KSk7CisgICAgICAgICAgTmV3U3VjY2Vzc29ycy5wdXNoX2JhY2soQkJEZWZhdWx0KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBPa2F5LCBhdCB0aGlzIHBvaW50LCB3ZSBrbm93IHdoaWNoIG5ldyBzdWNjZXNzb3IgUHJlZCB3aWxsIGdldC4gIE1ha2UKKyAgICAgIC8vIHN1cmUgd2UgdXBkYXRlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgUEhJIG5vZGVzIGZvciB0aGVzZQorICAgICAgLy8gc3VjY2Vzc29ycy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOZXdTdWNjZXNzb3JzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIEFkZFByZWRlY2Vzc29yVG9CbG9jayhOZXdTdWNjZXNzb3JzW2ldLCBQcmVkLCBCQik7CisKKyAgICAgIC8vIENvbnZlcnQgcG9pbnRlciB0byBpbnQgYmVmb3JlIHdlIHN3aXRjaC4KKyAgICAgIGlmIChDVi0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSB7CisgICAgICAgIGFzc2VydChURCAmJiAiQ2Fubm90IHN3aXRjaCBvbiBwb2ludGVyIHdpdGhvdXQgVGFyZ2V0RGF0YSIpOworICAgICAgICBDViA9IG5ldyBQdHJUb0ludEluc3QoQ1YsIFRELT5nZXRJbnRQdHJUeXBlKENWLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRJKTsKKyAgICAgIH0KKworICAgICAgLy8gTm93IHRoYXQgdGhlIHN1Y2Nlc3NvcnMgYXJlIHVwZGF0ZWQsIGNyZWF0ZSB0aGUgbmV3IFN3aXRjaCBpbnN0cnVjdGlvbi4KKyAgICAgIFN3aXRjaEluc3QgKk5ld1NJID0gU3dpdGNoSW5zdDo6Q3JlYXRlKENWLCBQcmVkRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWRDYXNlcy5zaXplKCksIFBUSSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUHJlZENhc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIE5ld1NJLT5hZGRDYXNlKFByZWRDYXNlc1tpXS5maXJzdCwgUHJlZENhc2VzW2ldLnNlY29uZCk7CisKKyAgICAgIEVyYXNlVGVybWluYXRvckluc3RBbmREQ0VDb25kKFBUSSk7CisKKyAgICAgIC8vIE9rYXksIGxhc3QgY2hlY2suICBJZiBCQiBpcyBzdGlsbCBhIHN1Y2Nlc3NvciBvZiBQU0ksIHRoZW4gd2UgbXVzdAorICAgICAgLy8gaGF2ZSBhbiBpbmZpbml0ZSBsb29wIGNhc2UuICBJZiBzbywgYWRkIGFuIGluZmluaXRlbHkgbG9vcGluZyBibG9jaworICAgICAgLy8gdG8gaGFuZGxlIHRoZSBjYXNlIHRvIHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiB0aGUgY29kZS4KKyAgICAgIEJhc2ljQmxvY2sgKkluZkxvb3BCbG9jayA9IDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3U0ktPmdldE51bVN1Y2Nlc3NvcnMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChOZXdTSS0+Z2V0U3VjY2Vzc29yKGkpID09IEJCKSB7CisgICAgICAgICAgaWYgKEluZkxvb3BCbG9jayA9PSAwKSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIGJlY2F1c2UgaXQncyBlaXRoZXIgY29kZSwKKyAgICAgICAgICAgIC8vIG9yIGl0IHdvbid0IG1hdHRlciBpZiBpdCdzIGhvdC4gOikKKyAgICAgICAgICAgIEluZkxvb3BCbG9jayA9IEJhc2ljQmxvY2s6OkNyZWF0ZShCQi0+Z2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLT5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoSW5mTG9vcEJsb2NrLCBJbmZMb29wQmxvY2spOworICAgICAgICAgIH0KKyAgICAgICAgICBOZXdTSS0+c2V0U3VjY2Vzc29yKGksIEluZkxvb3BCbG9jayk7CisgICAgICAgIH0KKworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLyBpc1NhZmVUb0hvaXN0SW52b2tlIC0gSWYgd2Ugd291bGQgbmVlZCB0byBpbnNlcnQgYSBzZWxlY3QgdGhhdCB1c2VzIHRoZQorLy8gdmFsdWUgb2YgdGhpcyBpbnZva2UgKGNvbW1lbnRzIGluIEhvaXN0VGhlbkVsc2VDb2RlVG9JZiBleHBsYWluIHdoeSB3ZQorLy8gd291bGQgbmVlZCB0byBkbyB0aGlzKSwgd2UgY2FuJ3QgaG9pc3QgdGhlIGludm9rZSwgYXMgdGhlcmUgaXMgbm93aGVyZQorLy8gdG8gcHV0IHRoZSBzZWxlY3QgaW4gdGhpcyBjYXNlLgorc3RhdGljIGJvb2wgaXNTYWZlVG9Ib2lzdEludm9rZShCYXNpY0Jsb2NrICpCQjEsIEJhc2ljQmxvY2sgKkJCMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkkxLCBJbnN0cnVjdGlvbiAqSTIpIHsKKyAgZm9yIChzdWNjX2l0ZXJhdG9yIFNJID0gc3VjY19iZWdpbihCQjEpLCBFID0gc3VjY19lbmQoQkIxKTsgU0kgIT0gRTsgKytTSSkgeworICAgIFBISU5vZGUgKlBOOworICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gU0ktPmJlZ2luKCk7CisgICAgICAgICAoUE4gPSBkeW5fY2FzdDxQSElOb2RlPihCQkkpKTsgKytCQkkpIHsKKyAgICAgIFZhbHVlICpCQjFWID0gUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhCQjEpOworICAgICAgVmFsdWUgKkJCMlYgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKEJCMik7CisgICAgICBpZiAoQkIxViAhPSBCQjJWICYmIChCQjFWPT1JMSB8fCBCQjJWPT1JMikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIEhvaXN0VGhlbkVsc2VDb2RlVG9JZiAtIEdpdmVuIGEgY29uZGl0aW9uYWwgYnJhbmNoIHRoYXQgZ29lcyB0byBCQjEgYW5kCisvLy8gQkIyLCBob2lzdCBhbnkgY29tbW9uIGNvZGUgaW4gdGhlIHR3byBibG9ja3MgdXAgaW50byB0aGUgYnJhbmNoIGJsb2NrLiAgVGhlCisvLy8gY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IEJJJ3MgYmxvY2sgZG9taW5hdGVzIEJCMSBhbmQgQkIyLgorc3RhdGljIGJvb2wgSG9pc3RUaGVuRWxzZUNvZGVUb0lmKEJyYW5jaEluc3QgKkJJKSB7CisgIC8vIFRoaXMgZG9lcyB2ZXJ5IHRyaXZpYWwgbWF0Y2hpbmcsIHdpdGggbGltaXRlZCBzY2FubmluZywgdG8gZmluZCBpZGVudGljYWwKKyAgLy8gaW5zdHJ1Y3Rpb25zIGluIHRoZSB0d28gYmxvY2tzLiAgSW4gcGFydGljdWxhciwgd2UgZG9uJ3Qgd2FudCB0byBnZXQgaW50bworICAvLyBPKE0qTikgc2l0dWF0aW9ucyBoZXJlIHdoZXJlIE0gYW5kIE4gYXJlIHRoZSBzaXplcyBvZiBCQjEgYW5kIEJCMi4gIEFzCisgIC8vIHN1Y2gsIHdlIGN1cnJlbnRseSBqdXN0IHNjYW4gZm9yIG9idmlvdXNseSBpZGVudGljYWwgaW5zdHJ1Y3Rpb25zIGluIGFuCisgIC8vIGlkZW50aWNhbCBvcmRlci4KKyAgQmFzaWNCbG9jayAqQkIxID0gQkktPmdldFN1Y2Nlc3NvcigwKTsgIC8vIFRoZSB0cnVlIGRlc3RpbmF0aW9uLgorICBCYXNpY0Jsb2NrICpCQjIgPSBCSS0+Z2V0U3VjY2Vzc29yKDEpOyAgLy8gVGhlIGZhbHNlIGRlc3RpbmF0aW9uCisKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQkIxX0l0ciA9IEJCMS0+YmVnaW4oKTsKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQkIyX0l0ciA9IEJCMi0+YmVnaW4oKTsKKworICBJbnN0cnVjdGlvbiAqSTEgPSBCQjFfSXRyKyssICpJMiA9IEJCMl9JdHIrKzsKKyAgd2hpbGUgKElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJMSkpCisgICAgSTEgPSBCQjFfSXRyKys7CisgIHdoaWxlIChJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoSTIpKQorICAgIEkyID0gQkIyX0l0cisrOworICBpZiAoSTEtPmdldE9wY29kZSgpICE9IEkyLT5nZXRPcGNvZGUoKSB8fCBpc2E8UEhJTm9kZT4oSTEpIHx8CisgICAgICAhSTEtPmlzSWRlbnRpY2FsVG9XaGVuRGVmaW5lZChJMikgfHwKKyAgICAgIChJU0FfSU5WT0tFX0lOU1QoSTEpICYmICFpc1NhZmVUb0hvaXN0SW52b2tlKEJCMSwgQkIyLCBJMSwgSTIpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBob2lzdCBhdCBsZWFzdCBvbmUgaW5zdHJ1Y3Rpb24uCisgIEJhc2ljQmxvY2sgKkJJUGFyZW50ID0gQkktPmdldFBhcmVudCgpOworCisgIGRvIHsKKyAgICAvLyBJZiB3ZSBhcmUgaG9pc3RpbmcgdGhlIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24sIGRvbid0IG1vdmUgb25lIChtYWtpbmcgYQorICAgIC8vIGJyb2tlbiBCQiksIGluc3RlYWQgY2xvbmUgaXQsIGFuZCByZW1vdmUgQkkuCisgICAgaWYgKGlzYTxUZXJtaW5hdG9ySW5zdD4oSTEpKQorICAgICAgZ290byBIb2lzdFRlcm1pbmF0b3I7CisKKyAgICAvLyBGb3IgYSBub3JtYWwgaW5zdHJ1Y3Rpb24sIHdlIGp1c3QgbW92ZSBvbmUgdG8gcmlnaHQgYmVmb3JlIHRoZSBicmFuY2gsCisgICAgLy8gdGhlbiByZXBsYWNlIGFsbCB1c2VzIG9mIHRoZSBvdGhlciB3aXRoIHRoZSBmaXJzdC4gIEZpbmFsbHksIHdlIHJlbW92ZQorICAgIC8vIHRoZSBub3cgcmVkdW5kYW50IHNlY29uZCBpbnN0cnVjdGlvbi4KKyAgICBCSVBhcmVudC0+Z2V0SW5zdExpc3QoKS5zcGxpY2UoQkksIEJCMS0+Z2V0SW5zdExpc3QoKSwgSTEpOworICAgIGlmICghSTItPnVzZV9lbXB0eSgpKQorICAgICAgSTItPnJlcGxhY2VBbGxVc2VzV2l0aChJMSk7CisgICAgSTEtPmludGVyc2VjdE9wdGlvbmFsRGF0YVdpdGgoSTIpOworICAgIEJCMi0+Z2V0SW5zdExpc3QoKS5lcmFzZShJMik7CisKKyAgICBJMSA9IEJCMV9JdHIrKzsKKyAgICB3aGlsZSAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEkxKSkKKyAgICAgIEkxID0gQkIxX0l0cisrOworICAgIEkyID0gQkIyX0l0cisrOworICAgIHdoaWxlIChJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoSTIpKQorICAgICAgSTIgPSBCQjJfSXRyKys7CisgIH0gd2hpbGUgKEkxLT5nZXRPcGNvZGUoKSA9PSBJMi0+Z2V0T3Bjb2RlKCkgJiYKKyAgICAgICAgICAgSTEtPmlzSWRlbnRpY2FsVG9XaGVuRGVmaW5lZChJMikpOworCisgIHJldHVybiB0cnVlOworCitIb2lzdFRlcm1pbmF0b3I6CisgIC8vIEl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gaG9pc3QgYW4gaW52b2tlLgorICBpZiAoSVNBX0lOVk9LRV9JTlNUKEkxKSAmJiAhaXNTYWZlVG9Ib2lzdEludm9rZShCQjEsIEJCMiwgSTEsIEkyKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBPa2F5LCBpdCBpcyBzYWZlIHRvIGhvaXN0IHRoZSB0ZXJtaW5hdG9yLgorICBJbnN0cnVjdGlvbiAqTlQgPSBJMS0+Y2xvbmUoKTsKKyAgQklQYXJlbnQtPmdldEluc3RMaXN0KCkuaW5zZXJ0KEJJLCBOVCk7CisgIGlmICghTlQtPmdldFR5cGUoKS0+aXNWb2lkVHkoKSkgeworICAgIEkxLT5yZXBsYWNlQWxsVXNlc1dpdGgoTlQpOworICAgIEkyLT5yZXBsYWNlQWxsVXNlc1dpdGgoTlQpOworICAgIE5ULT50YWtlTmFtZShJMSk7CisgIH0KKworICAvLyBIb2lzdGluZyBvbmUgb2YgdGhlIHRlcm1pbmF0b3JzIGZyb20gb3VyIHN1Y2Nlc3NvciBpcyBhIGdyZWF0IHRoaW5nLgorICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgc3VjY2Vzc29ycyBvZiB0aGUgaWYvZWxzZSBibG9ja3MgbWF5IGhhdmUgUEhJIG5vZGVzIGluCisgIC8vIHRoZW0uICBJZiB0aGV5IGRvLCBhbGwgUEhJIGVudHJpZXMgZm9yIEJCMS9CQjIgbXVzdCBhZ3JlZSBmb3IgYWxsIFBISQorICAvLyBub2Rlcywgc28gd2UgaW5zZXJ0IHNlbGVjdCBpbnN0cnVjdGlvbiB0byBjb21wdXRlIHRoZSBmaW5hbCByZXN1bHQuCisgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxWYWx1ZSosVmFsdWUqPiwgU2VsZWN0SW5zdCo+IEluc2VydGVkU2VsZWN0czsKKyAgZm9yIChzdWNjX2l0ZXJhdG9yIFNJID0gc3VjY19iZWdpbihCQjEpLCBFID0gc3VjY19lbmQoQkIxKTsgU0kgIT0gRTsgKytTSSkgeworICAgIFBISU5vZGUgKlBOOworICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gU0ktPmJlZ2luKCk7CisgICAgICAgICAoUE4gPSBkeW5fY2FzdDxQSElOb2RlPihCQkkpKTsgKytCQkkpIHsKKyAgICAgIFZhbHVlICpCQjFWID0gUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhCQjEpOworICAgICAgVmFsdWUgKkJCMlYgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKEJCMik7CisgICAgICBpZiAoQkIxViAhPSBCQjJWKSB7CisgICAgICAgIC8vIFRoZXNlIHZhbHVlcyBkbyBub3QgYWdyZWUuICBJbnNlcnQgYSBzZWxlY3QgaW5zdHJ1Y3Rpb24gYmVmb3JlIE5UCisgICAgICAgIC8vIHRoYXQgZGV0ZXJtaW5lcyB0aGUgcmlnaHQgdmFsdWUuCisgICAgICAgIFNlbGVjdEluc3QgKiZTSSA9IEluc2VydGVkU2VsZWN0c1tzdGQ6Om1ha2VfcGFpcihCQjFWLCBCQjJWKV07CisgICAgICAgIGlmIChTSSA9PSAwKQorICAgICAgICAgIFNJID0gU2VsZWN0SW5zdDo6Q3JlYXRlKEJJLT5nZXRDb25kaXRpb24oKSwgQkIxViwgQkIyViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVCk7CisgICAgICAgIC8vIE1ha2UgdGhlIFBISSBub2RlIHVzZSB0aGUgc2VsZWN0IGZvciBhbGwgaW5jb21pbmcgdmFsdWVzIGZvciBCQjEvQkIyCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgaWYgKFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpID09IEJCMSB8fCBQTi0+Z2V0SW5jb21pbmdCbG9jayhpKSA9PSBCQjIpCisgICAgICAgICAgICBQTi0+c2V0SW5jb21pbmdWYWx1ZShpLCBTSSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVXBkYXRlIGFueSBQSEkgbm9kZXMgaW4gb3VyIG5ldyBzdWNjZXNzb3JzLgorICBmb3IgKHN1Y2NfaXRlcmF0b3IgU0kgPSBzdWNjX2JlZ2luKEJCMSksIEUgPSBzdWNjX2VuZChCQjEpOyBTSSAhPSBFOyArK1NJKQorICAgIEFkZFByZWRlY2Vzc29yVG9CbG9jaygqU0ksIEJJUGFyZW50LCBCQjEpOworCisgIEVyYXNlVGVybWluYXRvckluc3RBbmREQ0VDb25kKEJJKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBTcGVjdWxhdGl2ZWx5RXhlY3V0ZUJCIC0gR2l2ZW4gYSBjb25kaXRpb25hbCBicmFuY2ggdGhhdCBnb2VzIHRvIEJCMQorLy8vIGFuZCBhbiBCQjIgYW5kIHRoZSBvbmx5IHN1Y2Nlc3NvciBvZiBCQjEgaXMgQkIyLCBob2lzdCBzaW1wbGUgY29kZQorLy8vIChmb3Igbm93LCByZXN0cmljdGVkIHRvIGEgc2luZ2xlIGluc3RydWN0aW9uIHRoYXQncyBzaWRlIGVmZmVjdCBmcmVlKSBmcm9tCisvLy8gdGhlIEJCMSBpbnRvIHRoZSBicmFuY2ggYmxvY2sgdG8gc3BlY3VsYXRpdmVseSBleGVjdXRlIGl0Lgorc3RhdGljIGJvb2wgU3BlY3VsYXRpdmVseUV4ZWN1dGVCQihCcmFuY2hJbnN0ICpCSSwgQmFzaWNCbG9jayAqQkIxKSB7CisgIC8vIE9ubHkgc3BlY3VsYXRpdmVseSBleGVjdXRpb24gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gKG5vdCBjb3VudGluZyB0aGUKKyAgLy8gdGVybWluYXRvcikgZm9yIG5vdy4KKyAgSW5zdHJ1Y3Rpb24gKkhJbnN0ID0gTlVMTDsKKyAgSW5zdHJ1Y3Rpb24gKlRlcm0gPSBCQjEtPmdldFRlcm1pbmF0b3IoKTsKKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSBCQjEtPmJlZ2luKCksIEJCRSA9IEJCMS0+ZW5kKCk7CisgICAgICAgQkJJICE9IEJCRTsgKytCQkkpIHsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IEJCSTsKKyAgICAvLyBTa2lwIGRlYnVnIGluZm8uCisgICAgaWYgKElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJKSkgICBjb250aW51ZTsKKyAgICBpZiAoSSA9PSBUZXJtKSAgYnJlYWs7CisKKyAgICBpZiAoIUhJbnN0KQorICAgICAgSEluc3QgPSBJOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUhJbnN0KQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBCZSBjb25zZXJ2YXRpdmUgZm9yIG5vdy4gRlAgc2VsZWN0IGluc3RydWN0aW9uIGNhbiBvZnRlbiBiZSBleHBlbnNpdmUuCisgIFZhbHVlICpCckNvbmQgPSBCSS0+Z2V0Q29uZGl0aW9uKCk7CisgIGlmIChpc2E8SW5zdHJ1Y3Rpb24+KEJyQ29uZCkgJiYKKyAgICAgIGNhc3Q8SW5zdHJ1Y3Rpb24+KEJyQ29uZCktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpGQ21wKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiBCQjEgaXMgYWN0dWFsbHkgb24gdGhlIGZhbHNlIGVkZ2Ugb2YgdGhlIGNvbmRpdGlvbmFsIGJyYW5jaCwgcmVtZW1iZXIKKyAgLy8gdG8gc3dhcCB0aGUgc2VsZWN0IG9wZXJhbmRzIGxhdGVyLgorICBib29sIEludmVydCA9IGZhbHNlOworICBpZiAoQkIxICE9IEJJLT5nZXRTdWNjZXNzb3IoMCkpIHsKKyAgICBhc3NlcnQoQkIxID09IEJJLT5nZXRTdWNjZXNzb3IoMSkgJiYgIk5vIGVkZ2UgZnJvbSAnaWYnIGJsb2NrPyIpOworICAgIEludmVydCA9IHRydWU7CisgIH0KKworICAvLyBUdXJuCisgIC8vIEJCOgorICAvLyAgICAgJXQxID0gaWNtcAorICAvLyAgICAgYnIgaTEgJXQxLCBsYWJlbCAlQkIxLCBsYWJlbCAlQkIyCisgIC8vIEJCMToKKyAgLy8gICAgICV0MyA9IGFkZCAldDIsIGMKKyAgLy8gICAgIGJyIGxhYmVsIEJCMgorICAvLyBCQjI6CisgIC8vID0+CisgIC8vIEJCOgorICAvLyAgICAgJXQxID0gaWNtcAorICAvLyAgICAgJXQ0ID0gYWRkICV0MiwgYworICAvLyAgICAgJXQzID0gc2VsZWN0IGkxICV0MSwgJXQyLCAldDMKKyAgc3dpdGNoIChISW5zdC0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOyAgLy8gTm90IHNhZmUgLyBwcm9maXRhYmxlIHRvIGhvaXN0LgorICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgICAvLyBOb3Qgd29ydGggZG9pbmcgZm9yIHZlY3RvciBvcHMuCisgICAgaWYgKEhJbnN0LT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6QW5kOgorICBjYXNlIEluc3RydWN0aW9uOjpPcjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOgorICBjYXNlIEluc3RydWN0aW9uOjpTaGw6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFTaHI6CisgICAgLy8gRG9uJ3QgbWVzcyB3aXRoIHZlY3RvciBvcGVyYXRpb25zLgorICAgIGlmIChISW5zdC0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYnJlYWs7ICAgLy8gVGhlc2UgYXJlIGFsbCBjaGVhcCBhbmQgbm9uLXRyYXBwaW5nIGluc3RydWN0aW9ucy4KKyAgfQorICAKKyAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGlzIG9idmlvdXNseSBkZWFkLCBkb24ndCB0cnkgdG8gcHJlZGljYXRlIGl0LgorICBpZiAoSEluc3QtPnVzZV9lbXB0eSgpKSB7CisgICAgSEluc3QtPmVyYXNlRnJvbVBhcmVudCgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQ2FuIHdlIHNwZWN1bGF0aXZlbHkgZXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24/IEFuZCB3aGF0IGlzIHRoZSB2YWx1ZSAKKyAgLy8gaWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZT8gQ29uc2lkZXIgdGhlIHBoaSB1c2VzLCBpZiB0aGUgaW5jb21pbmcgdmFsdWUKKyAgLy8gZnJvbSB0aGUgImlmIiBibG9jayBhcmUgYWxsIHRoZSBzYW1lIFYsIHRoZW4gViBpcyB0aGUgdmFsdWUgb2YgdGhlCisgIC8vIHNlbGVjdCBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLgorICBCYXNpY0Jsb2NrICpCSVBhcmVudCA9IEJJLT5nZXRQYXJlbnQoKTsKKyAgU21hbGxWZWN0b3I8UEhJTm9kZSosIDQ+IFBISVVzZXM7CisgIFZhbHVlICpGYWxzZVYgPSBOVUxMOworICAKKyAgQmFzaWNCbG9jayAqQkIyID0gQkIxLT5nZXRUZXJtaW5hdG9yKCktPmdldFN1Y2Nlc3NvcigwKTsKKyAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFVJID0gSEluc3QtPnVzZV9iZWdpbigpLCBFID0gSEluc3QtPnVzZV9lbmQoKTsKKyAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgLy8gSWdub3JlIGFueSB1c2VyIHRoYXQgaXMgbm90IGEgUEhJIG5vZGUgaW4gQkIyLiAgVGhlc2UgY2FuIG9ubHkgb2NjdXIgaW4KKyAgICAvLyB1bnJlYWNoYWJsZSBibG9ja3MsIGJlY2F1c2UgdGhleSB3b3VsZCBub3QgYmUgZG9taW5hdGVkIGJ5IHRoZSBpbnN0ci4KKyAgICBQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KCpVSSk7CisgICAgaWYgKCFQTiB8fCBQTi0+Z2V0UGFyZW50KCkgIT0gQkIyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFBISVVzZXMucHVzaF9iYWNrKFBOKTsKKyAgICAKKyAgICBWYWx1ZSAqUEhJViA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soQklQYXJlbnQpOworICAgIGlmICghRmFsc2VWKQorICAgICAgRmFsc2VWID0gUEhJVjsKKyAgICBlbHNlIGlmIChGYWxzZVYgIT0gUEhJVikKKyAgICAgIHJldHVybiBmYWxzZTsgIC8vIEluY29uc2lzdGVudCB2YWx1ZSB3aGVuIGNvbmRpdGlvbiBpcyBmYWxzZS4KKyAgfQorICAKKyAgYXNzZXJ0KEZhbHNlViAmJiAiTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB1c2VyLCBhbmQgaXQgbXVzdCBiZSBhIFBISSIpOworCisgIC8vIERvIG5vdCBob2lzdCB0aGUgaW5zdHJ1Y3Rpb24gaWYgYW55IG9mIGl0cyBvcGVyYW5kcyBhcmUgZGVmaW5lZCBidXQgbm90CisgIC8vIHVzZWQgaW4gdGhpcyBCQi4gVGhlIHRyYW5zZm9ybWF0aW9uIHdpbGwgcHJldmVudCB0aGUgb3BlcmFuZCBmcm9tCisgIC8vIGJlaW5nIHN1bmsgaW50byB0aGUgdXNlIGJsb2NrLgorICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIGkgPSBISW5zdC0+b3BfYmVnaW4oKSwgZSA9IEhJbnN0LT5vcF9lbmQoKTsgCisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBJbnN0cnVjdGlvbiAqT3BJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KCppKTsKKyAgICBpZiAoT3BJICYmIE9wSS0+Z2V0UGFyZW50KCkgPT0gQklQYXJlbnQgJiYKKyAgICAgICAgIU9wSS0+aXNVc2VkSW5CYXNpY0Jsb2NrKEJJUGFyZW50KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElmIHdlIGdldCBoZXJlLCB3ZSBjYW4gaG9pc3QgdGhlIGluc3RydWN0aW9uLiBUcnkgdG8gcGxhY2UgaXQKKyAgLy8gYmVmb3JlIHRoZSBpY21wIGluc3RydWN0aW9uIHByZWNlZGluZyB0aGUgY29uZGl0aW9uYWwgYnJhbmNoLgorICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQb3MgPSBCSTsKKyAgaWYgKEluc2VydFBvcyAhPSBCSVBhcmVudC0+YmVnaW4oKSkKKyAgICAtLUluc2VydFBvczsKKyAgLy8gU2tpcCBkZWJ1ZyBpbmZvIGJldHdlZW4gY29uZGl0aW9uIGFuZCBicmFuY2guCisgIHdoaWxlIChJbnNlcnRQb3MgIT0gQklQYXJlbnQtPmJlZ2luKCkgJiYgSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEluc2VydFBvcykpCisgICAgLS1JbnNlcnRQb3M7CisgIGlmIChJbnNlcnRQb3MgPT0gQnJDb25kICYmICFpc2E8UEhJTm9kZT4oQnJDb25kKSkgeworICAgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uICosIDQ+IEJCMUluc25zOworICAgIGZvcihCYXNpY0Jsb2NrOjppdGVyYXRvciBCQjFJID0gQkIxLT5iZWdpbigpLCBCQjFFID0gQkIxLT5lbmQoKTsgCisgICAgICAgIEJCMUkgIT0gQkIxRTsgKytCQjFJKSAKKyAgICAgIEJCMUluc25zLmluc2VydChCQjFJKTsKKyAgICBmb3IoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEJyQ29uZC0+dXNlX2JlZ2luKCksIFVFID0gQnJDb25kLT51c2VfZW5kKCk7CisgICAgICAgIFVJICE9IFVFOyArK1VJKSB7CisgICAgICBJbnN0cnVjdGlvbiAqVXNlID0gY2FzdDxJbnN0cnVjdGlvbj4oKlVJKTsKKyAgICAgIGlmIChCQjFJbnNucy5jb3VudChVc2UpKSB7CisgICAgICAgIC8vIElmIEJyQ29uZCB1c2VzIHRoZSBpbnN0cnVjdGlvbiB0aGF0IHBsYWNlIGl0IGp1c3QgYmVmb3JlCisgICAgICAgIC8vIGJyYW5jaCBpbnN0cnVjdGlvbi4KKyAgICAgICAgSW5zZXJ0UG9zID0gQkk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlCisgICAgSW5zZXJ0UG9zID0gQkk7CisgIEJJUGFyZW50LT5nZXRJbnN0TGlzdCgpLnNwbGljZShJbnNlcnRQb3MsIEJCMS0+Z2V0SW5zdExpc3QoKSwgSEluc3QpOworCisgIC8vIENyZWF0ZSBhIHNlbGVjdCB3aG9zZSB0cnVlIHZhbHVlIGlzIHRoZSBzcGVjdWxhdGl2ZWx5IGV4ZWN1dGVkIHZhbHVlIGFuZAorICAvLyBmYWxzZSB2YWx1ZSBpcyB0aGUgcHJldmlvdXNseSBkZXRlcm1pbmVkIEZhbHNlVi4KKyAgU2VsZWN0SW5zdCAqU0k7CisgIGlmIChJbnZlcnQpCisgICAgU0kgPSBTZWxlY3RJbnN0OjpDcmVhdGUoQnJDb25kLCBGYWxzZVYsIEhJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJKTsKKyAgZWxzZQorICAgIFNJID0gU2VsZWN0SW5zdDo6Q3JlYXRlKEJyQ29uZCwgSEluc3QsIEZhbHNlViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSSk7CisKKyAgLy8gTWFrZSB0aGUgUEhJIG5vZGUgdXNlIHRoZSBzZWxlY3QgZm9yIGFsbCBpbmNvbWluZyB2YWx1ZXMgZm9yICJ0aGVuIiBhbmQKKyAgLy8gImlmIiBibG9ja3MuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQSElVc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBQSElOb2RlICpQTiA9IFBISVVzZXNbaV07CisgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZWUgPSBQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaiAhPSBlZTsgKytqKQorICAgICAgaWYgKFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGopID09IEJCMSB8fAorICAgICAgICAgIFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGopID09IEJJUGFyZW50KQorICAgICAgICBQTi0+c2V0SW5jb21pbmdWYWx1ZShqLCBTSSk7CisgIH0KKworICArK051bVNwZWN1bGF0aW9uczsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBCbG9ja0lzU2ltcGxlRW5vdWdoVG9UaHJlYWRUaHJvdWdoIC0gUmV0dXJuIHRydWUgaWYgd2UgY2FuIHRocmVhZCBhIGJyYW5jaAorLy8vIGFjcm9zcyB0aGlzIGJsb2NrLgorc3RhdGljIGJvb2wgQmxvY2tJc1NpbXBsZUVub3VnaFRvVGhyZWFkVGhyb3VnaChCYXNpY0Jsb2NrICpCQikgeworICBCcmFuY2hJbnN0ICpCSSA9IGNhc3Q8QnJhbmNoSW5zdD4oQkItPmdldFRlcm1pbmF0b3IoKSk7CisgIHVuc2lnbmVkIFNpemUgPSAwOworICAKKyAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSBCQi0+YmVnaW4oKTsgJipCQkkgIT0gQkk7ICsrQkJJKSB7CisgICAgaWYgKElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhCQkkpKQorICAgICAgY29udGludWU7CisgICAgaWYgKFNpemUgPiAxMCkgcmV0dXJuIGZhbHNlOyAgLy8gRG9uJ3QgY2xvbmUgbGFyZ2UgQkIncy4KKyAgICArK1NpemU7CisgICAgCisgICAgLy8gV2UgY2FuIG9ubHkgc3VwcG9ydCBpbnN0cnVjdGlvbnMgdGhhdCBkbyBub3QgZGVmaW5lIHZhbHVlcyB0aGF0IGFyZQorICAgIC8vIGxpdmUgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBiYXNpYyBibG9jay4KKyAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBCQkktPnVzZV9iZWdpbigpLCBFID0gQkJJLT51c2VfZW5kKCk7CisgICAgICAgICBVSSAhPSBFOyArK1VJKSB7CisgICAgICBJbnN0cnVjdGlvbiAqVSA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KCpVSSk7CisgICAgICBpZiAoVS0+Z2V0UGFyZW50KCkgIT0gQkIgfHwgaXNhPFBISU5vZGU+KFUpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8vIExvb2tzIG9rLCBjb250aW51ZSBjaGVja2luZy4KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLy8gRm9sZENvbmRCcmFuY2hPblBISSAtIElmIHdlIGhhdmUgYSBjb25kaXRpb25hbCBicmFuY2ggb24gYSBQSEkgbm9kZSB2YWx1ZQorLy8vIHRoYXQgaXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBibG9jayBhcyB0aGUgYnJhbmNoIGFuZCBpZiBhbnkgUEhJIGVudHJpZXMgYXJlCisvLy8gY29uc3RhbnRzLCB0aHJlYWQgZWRnZXMgY29ycmVzcG9uZGluZyB0byB0aGF0IGVudHJ5IHRvIGJlIGJyYW5jaGVzIHRvIHRoZWlyCisvLy8gdWx0aW1hdGUgZGVzdGluYXRpb24uCitzdGF0aWMgYm9vbCBGb2xkQ29uZEJyYW5jaE9uUEhJKEJyYW5jaEluc3QgKkJJKSB7CisgIEJhc2ljQmxvY2sgKkJCID0gQkktPmdldFBhcmVudCgpOworICBQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEJJLT5nZXRDb25kaXRpb24oKSk7CisgIC8vIE5PVEU6IHdlIGN1cnJlbnRseSBjYW5ub3QgdHJhbnNmb3JtIHRoaXMgY2FzZSBpZiB0aGUgUEhJIG5vZGUgaXMgdXNlZAorICAvLyBvdXRzaWRlIG9mIHRoZSBibG9jay4KKyAgaWYgKCFQTiB8fCBQTi0+Z2V0UGFyZW50KCkgIT0gQkIgfHwgIVBOLT5oYXNPbmVVc2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICAvLyBEZWdlbmVyYXRlIGNhc2Ugb2YgYSBzaW5nbGUgZW50cnkgUEhJLgorICBpZiAoUE4tPmdldE51bUluY29taW5nVmFsdWVzKCkgPT0gMSkgeworICAgIEZvbGRTaW5nbGVFbnRyeVBISU5vZGVzKFBOLT5nZXRQYXJlbnQoKSk7CisgICAgcmV0dXJuIHRydWU7ICAgIAorICB9CisKKyAgLy8gTm93IHdlIGtub3cgdGhhdCB0aGlzIGJsb2NrIGhhcyBtdWx0aXBsZSBwcmVkcyBhbmQgdHdvIHN1Y2NzLgorICBpZiAoIUJsb2NrSXNTaW1wbGVFbm91Z2hUb1RocmVhZFRocm91Z2goQkIpKSByZXR1cm4gZmFsc2U7CisgIAorICAvLyBPa2F5LCB0aGlzIGlzIGEgc2ltcGxlIGVub3VnaCBiYXNpYyBibG9jay4gIFNlZSBpZiBhbnkgcGhpIHZhbHVlcyBhcmUKKyAgLy8gY29uc3RhbnRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUE4tPmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgQ29uc3RhbnRJbnQgKkNCOworICAgIGlmICgoQ0IgPSBkeW5fY2FzdDxDb25zdGFudEludD4oUE4tPmdldEluY29taW5nVmFsdWUoaSkpKSAmJgorICAgICAgICBDQi0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgxKSkgeworICAgICAgLy8gT2theSwgd2Ugbm93IGtub3cgdGhhdCBhbGwgZWRnZXMgZnJvbSBQcmVkQkIgc2hvdWxkIGJlIHJldmVjdG9yZWQgdG8KKyAgICAgIC8vIGJyYW5jaCB0byBSZWFsRGVzdC4KKyAgICAgIEJhc2ljQmxvY2sgKlByZWRCQiA9IFBOLT5nZXRJbmNvbWluZ0Jsb2NrKGkpOworICAgICAgQmFzaWNCbG9jayAqUmVhbERlc3QgPSBCSS0+Z2V0U3VjY2Vzc29yKCFDQi0+Z2V0WkV4dFZhbHVlKCkpOworICAgICAgCisgICAgICBpZiAoUmVhbERlc3QgPT0gQkIpIGNvbnRpbnVlOyAgLy8gU2tpcCBzZWxmIGxvb3BzLgorICAgICAgCisgICAgICAvLyBUaGUgZGVzdCBibG9jayBtaWdodCBoYXZlIFBISSBub2Rlcywgb3RoZXIgcHJlZGVjZXNzb3JzIGFuZCBvdGhlcgorICAgICAgLy8gZGlmZmljdWx0IGNhc2VzLiAgSW5zdGVhZCBvZiBiZWluZyBzbWFydCBhYm91dCB0aGlzLCBqdXN0IGluc2VydCBhIG5ldworICAgICAgLy8gYmxvY2sgdGhhdCBqdW1wcyB0byB0aGUgZGVzdGluYXRpb24gYmxvY2ssIGVmZmVjdGl2ZWx5IHNwbGl0dGluZworICAgICAgLy8gdGhlIGVkZ2Ugd2UgYXJlIGFib3V0IHRvIGNyZWF0ZS4KKyAgICAgIEJhc2ljQmxvY2sgKkVkZ2VCQiA9IEJhc2ljQmxvY2s6OkNyZWF0ZShCQi0+Z2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxEZXN0LT5nZXRQYXJlbnQoKSwgUmVhbERlc3QpOworICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKFJlYWxEZXN0LCBFZGdlQkIpOworICAgICAgUEhJTm9kZSAqUE47CisgICAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9IFJlYWxEZXN0LT5iZWdpbigpOworICAgICAgICAgICAoUE4gPSBkeW5fY2FzdDxQSElOb2RlPihCQkkpKTsgKytCQkkpIHsKKyAgICAgICAgVmFsdWUgKlYgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKEJCKTsKKyAgICAgICAgUE4tPmFkZEluY29taW5nKFYsIEVkZ2VCQik7CisgICAgICB9CisKKyAgICAgIC8vIEJCIG1heSBoYXZlIGluc3RydWN0aW9ucyB0aGF0IGFyZSBiZWluZyB0aHJlYWRlZCBvdmVyLiAgQ2xvbmUgdGhlc2UKKyAgICAgIC8vIGluc3RydWN0aW9ucyBpbnRvIEVkZ2VCQi4gIFdlIGtub3cgdGhhdCB0aGVyZSB3aWxsIGJlIG5vIHVzZXMgb2YgdGhlCisgICAgICAvLyBjbG9uZWQgaW5zdHJ1Y3Rpb25zIG91dHNpZGUgb2YgRWRnZUJCLgorICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQgPSBFZGdlQkItPmJlZ2luKCk7CisgICAgICBzdGQ6Om1hcDxWYWx1ZSosIFZhbHVlKj4gVHJhbnNsYXRlTWFwOyAgLy8gVHJhY2sgdHJhbnNsYXRlZCB2YWx1ZXMuCisgICAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9IEJCLT5iZWdpbigpOyAmKkJCSSAhPSBCSTsgKytCQkkpIHsKKyAgICAgICAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oQkJJKSkgeworICAgICAgICAgIFRyYW5zbGF0ZU1hcFtQTl0gPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKFByZWRCQik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQ2xvbmUgdGhlIGluc3RydWN0aW9uLgorICAgICAgICAgIEluc3RydWN0aW9uICpOID0gQkJJLT5jbG9uZSgpOworICAgICAgICAgIGlmIChCQkktPmhhc05hbWUoKSkgTi0+c2V0TmFtZShCQkktPmdldE5hbWUoKSsiLmMiKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBVcGRhdGUgb3BlcmFuZHMgZHVlIHRvIHRyYW5zbGF0aW9uLgorICAgICAgICAgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgaSA9IE4tPm9wX2JlZ2luKCksIGUgPSBOLT5vcF9lbmQoKTsKKyAgICAgICAgICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6Om1hcDxWYWx1ZSosIFZhbHVlKj46Oml0ZXJhdG9yIFBJID0KKyAgICAgICAgICAgICAgVHJhbnNsYXRlTWFwLmZpbmQoKmkpOworICAgICAgICAgICAgaWYgKFBJICE9IFRyYW5zbGF0ZU1hcC5lbmQoKSkKKyAgICAgICAgICAgICAgKmkgPSBQSS0+c2Vjb25kOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvLyBDaGVjayBmb3IgdHJpdmlhbCBzaW1wbGlmaWNhdGlvbi4KKyAgICAgICAgICBpZiAoQ29uc3RhbnQgKkMgPSBDb25zdGFudEZvbGRJbnN0cnVjdGlvbihOKSkgeworICAgICAgICAgICAgVHJhbnNsYXRlTWFwW0JCSV0gPSBDOworICAgICAgICAgICAgZGVsZXRlIE47ICAgLy8gQ29uc3RhbnQgZm9sZGVkIGF3YXksIGRvbid0IG5lZWQgYWN0dWFsIGluc3QKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24gaW50byBpdHMgbmV3IGhvbWUuCisgICAgICAgICAgICBFZGdlQkItPmdldEluc3RMaXN0KCkuaW5zZXJ0KEluc2VydFB0LCBOKTsKKyAgICAgICAgICAgIGlmICghQkJJLT51c2VfZW1wdHkoKSkKKyAgICAgICAgICAgICAgVHJhbnNsYXRlTWFwW0JCSV0gPSBOOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBlZGdlcyBmcm9tIFByZWRCQiB0byBCQiwgY2hhbmdpbmcgdGhlbSB0byBicmFuY2gKKyAgICAgIC8vIHRvIEVkZ2VCQiBpbnN0ZWFkLgorICAgICAgVGVybWluYXRvckluc3QgKlByZWRCQlRJID0gUHJlZEJCLT5nZXRUZXJtaW5hdG9yKCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUHJlZEJCVEktPmdldE51bVN1Y2Nlc3NvcnMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChQcmVkQkJUSS0+Z2V0U3VjY2Vzc29yKGkpID09IEJCKSB7CisgICAgICAgICAgQkItPnJlbW92ZVByZWRlY2Vzc29yKFByZWRCQik7CisgICAgICAgICAgUHJlZEJCVEktPnNldFN1Y2Nlc3NvcihpLCBFZGdlQkIpOworICAgICAgICB9CisgICAgICAKKyAgICAgIC8vIFJlY3Vyc2UsIHNpbXBsaWZ5aW5nIGFueSBvdGhlciBjb25zdGFudHMuCisgICAgICByZXR1cm4gRm9sZENvbmRCcmFuY2hPblBISShCSSkgfCB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEZvbGRUd29FbnRyeVBISU5vZGUgLSBHaXZlbiBhIEJCIHRoYXQgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCB0d28tZW50cnkKKy8vLyBQSEkgbm9kZSwgc2VlIGlmIHdlIGNhbiBlbGltaW5hdGUgaXQuCitzdGF0aWMgYm9vbCBGb2xkVHdvRW50cnlQSElOb2RlKFBISU5vZGUgKlBOKSB7CisgIC8vIE9rLCB0aGlzIGlzIGEgdHdvIGVudHJ5IFBISSBub2RlLiAgQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBzaW1wbGUgImlmCisgIC8vIHN0YXRlbWVudCIsIHdoaWNoIGhhcyBhIHZlcnkgc2ltcGxlIGRvbWluYW5jZSBzdHJ1Y3R1cmUuICBCYXNpY2FsbHksIHdlCisgIC8vIGFyZSB0cnlpbmcgdG8gZmluZCB0aGUgY29uZGl0aW9uIHRoYXQgaXMgYmVpbmcgYnJhbmNoZWQgb24sIHdoaWNoCisgIC8vIHN1YnNlcXVlbnRseSBjYXVzZXMgdGhpcyBtZXJnZSB0byBoYXBwZW4uICBXZSByZWFsbHkgd2FudCBjb250cm9sCisgIC8vIGRlcGVuZGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgY2hlY2ssIGJ1dCBzaW1wbGlmeWNmZyBjYW4ndCBrZWVwIGl0IHVwCisgIC8vIHRvIGRhdGUsIGFuZCB0aGlzIGNhdGNoZXMgbW9zdCBvZiB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCBhbnl3YXkuCisgIC8vCisgIEJhc2ljQmxvY2sgKkJCID0gUE4tPmdldFBhcmVudCgpOworICBCYXNpY0Jsb2NrICpJZlRydWUsICpJZkZhbHNlOworICBWYWx1ZSAqSWZDb25kID0gR2V0SWZDb25kaXRpb24oQkIsIElmVHJ1ZSwgSWZGYWxzZSk7CisgIGlmICghSWZDb25kKSByZXR1cm4gZmFsc2U7CisgIAorICAvLyBPa2F5LCB3ZSBmb3VuZCB0aGF0IHdlIGNhbiBtZXJnZSB0aGlzIHR3by1lbnRyeSBwaGkgbm9kZSBpbnRvIGEgc2VsZWN0LgorICAvLyBEb2luZyBzbyB3b3VsZCByZXF1aXJlIHVzIHRvIGZvbGQgKmFsbCogdHdvIGVudHJ5IHBoaSBub2RlcyBpbiB0aGlzIGJsb2NrLgorICAvLyBBdCBzb21lIHBvaW50IHRoaXMgYmVjb21lcyBub24tcHJvZml0YWJsZSAocGFydGljdWxhcmx5IGlmIHRoZSB0YXJnZXQKKyAgLy8gZG9lc24ndCBzdXBwb3J0IGNtb3YncykuICBPbmx5IGRvIHRoaXMgdHJhbnNmb3JtYXRpb24gaWYgdGhlcmUgYXJlIHR3byBvcgorICAvLyBmZXdlciBQSEkgbm9kZXMgaW4gdGhpcyBibG9jay4KKyAgdW5zaWduZWQgTnVtUGhpcyA9IDA7CisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpOyBpc2E8UEhJTm9kZT4oSSk7ICsrTnVtUGhpcywgKytJKQorICAgIGlmIChOdW1QaGlzID4gMikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgCisgIERFQlVHKGRiZ3MoKSA8PCAiRk9VTkQgSUYgQ09ORElUSU9OISAgIiA8PCAqSWZDb25kIDw8ICIgIFQ6ICIKKyAgICAgICAgPDwgSWZUcnVlLT5nZXROYW1lKCkgPDwgIiAgRjogIiA8PCBJZkZhbHNlLT5nZXROYW1lKCkgPDwgIlxuIik7CisgIAorICAvLyBMb29wIG92ZXIgdGhlIFBISSdzIHNlZWluZyBpZiB3ZSBjYW4gcHJvbW90ZSB0aGVtIGFsbCB0byBzZWxlY3QKKyAgLy8gaW5zdHJ1Y3Rpb25zLiAgV2hpbGUgd2UgYXJlIGF0IGl0LCBrZWVwIHRyYWNrIG9mIHRoZSBpbnN0cnVjdGlvbnMKKyAgLy8gdGhhdCBuZWVkIHRvIGJlIG1vdmVkIHRvIHRoZSBkb21pbmF0aW5nIGJsb2NrLgorICBzdGQ6OnNldDxJbnN0cnVjdGlvbio+IEFnZ3Jlc3NpdmVJbnN0czsKKyAgCisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEFmdGVyUEhJSXQgPSBCQi0+YmVnaW4oKTsKKyAgd2hpbGUgKGlzYTxQSElOb2RlPihBZnRlclBISUl0KSkgeworICAgIFBISU5vZGUgKlBOID0gY2FzdDxQSElOb2RlPihBZnRlclBISUl0KyspOworICAgIGlmIChQTi0+Z2V0SW5jb21pbmdWYWx1ZSgwKSA9PSBQTi0+Z2V0SW5jb21pbmdWYWx1ZSgxKSkgeworICAgICAgaWYgKFBOLT5nZXRJbmNvbWluZ1ZhbHVlKDApICE9IFBOKQorICAgICAgICBQTi0+cmVwbGFjZUFsbFVzZXNXaXRoKFBOLT5nZXRJbmNvbWluZ1ZhbHVlKDApKTsKKyAgICAgIGVsc2UKKyAgICAgICAgUE4tPnJlcGxhY2VBbGxVc2VzV2l0aChVbmRlZlZhbHVlOjpnZXQoUE4tPmdldFR5cGUoKSkpOworICAgIH0gZWxzZSBpZiAoIURvbWluYXRlc01lcmdlUG9pbnQoUE4tPmdldEluY29taW5nVmFsdWUoMCksIEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFnZ3Jlc3NpdmVJbnN0cykgfHwKKyAgICAgICAgICAgICAgICFEb21pbmF0ZXNNZXJnZVBvaW50KFBOLT5nZXRJbmNvbWluZ1ZhbHVlKDEpLCBCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZ2dyZXNzaXZlSW5zdHMpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIAorICAvLyBJZiB3ZSBhbGwgUEhJIG5vZGVzIGFyZSBwcm9tb3RhYmxlLCBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBhbGwKKyAgLy8gaW5zdHJ1Y3Rpb25zIGluIHRoZSBwcmVkZWNlc3NvciBibG9ja3MgY2FuIGJlIHByb21vdGVkIGFzIHdlbGwuICBJZgorICAvLyBub3QsIHdlIHdvbid0IGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGUgY29udHJvbCBmbG93LCBzbyBpdCdzIG5vdAorICAvLyB3b3J0aCBwcm9tb3RpbmcgdG8gc2VsZWN0IGluc3RydWN0aW9ucy4KKyAgQmFzaWNCbG9jayAqRG9tQmxvY2sgPSAwLCAqSWZCbG9jazEgPSAwLCAqSWZCbG9jazIgPSAwOworICBQTiA9IGNhc3Q8UEhJTm9kZT4oQkItPmJlZ2luKCkpOworICBCYXNpY0Jsb2NrICpQcmVkID0gUE4tPmdldEluY29taW5nQmxvY2soMCk7CisgIGlmIChjYXN0PEJyYW5jaEluc3Q+KFByZWQtPmdldFRlcm1pbmF0b3IoKSktPmlzVW5jb25kaXRpb25hbCgpKSB7CisgICAgSWZCbG9jazEgPSBQcmVkOworICAgIERvbUJsb2NrID0gKnByZWRfYmVnaW4oUHJlZCk7CisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gUHJlZC0+YmVnaW4oKTsKKyAgICAgICAgICFpc2E8VGVybWluYXRvckluc3Q+KEkpOyArK0kpCisgICAgICBpZiAoIUFnZ3Jlc3NpdmVJbnN0cy5jb3VudChJKSAmJiAhSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEkpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGFuIGFnZ3Jlc3NpdmUgaW5zdHJ1Y3Rpb24gdGhhdCB3ZSBjYW4gcHJvbW90ZS4KKyAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGlzLCB3ZSB3b24ndCBiZSBhYmxlIHRvIGdldCByaWQgb2YgdGhlIGNvbnRyb2wKKyAgICAgICAgLy8gZmxvdywgc28gdGhlIHhmb3JtIGlzIG5vdCB3b3J0aCBpdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICB9CisgICAgCisgIFByZWQgPSBQTi0+Z2V0SW5jb21pbmdCbG9jaygxKTsKKyAgaWYgKGNhc3Q8QnJhbmNoSW5zdD4oUHJlZC0+Z2V0VGVybWluYXRvcigpKS0+aXNVbmNvbmRpdGlvbmFsKCkpIHsKKyAgICBJZkJsb2NrMiA9IFByZWQ7CisgICAgRG9tQmxvY2sgPSAqcHJlZF9iZWdpbihQcmVkKTsKKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBQcmVkLT5iZWdpbigpOworICAgICAgICAgIWlzYTxUZXJtaW5hdG9ySW5zdD4oSSk7ICsrSSkKKyAgICAgIGlmICghQWdncmVzc2l2ZUluc3RzLmNvdW50KEkpICYmICFJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoSSkpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYW4gYWdncmVzc2l2ZSBpbnN0cnVjdGlvbiB0aGF0IHdlIGNhbiBwcm9tb3RlLgorICAgICAgICAvLyBCZWNhdXNlIG9mIHRoaXMsIHdlIHdvbid0IGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGUgY29udHJvbAorICAgICAgICAvLyBmbG93LCBzbyB0aGUgeGZvcm0gaXMgbm90IHdvcnRoIGl0LgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgIH0KKyAgICAgIAorICAvLyBJZiB3ZSBjYW4gc3RpbGwgcHJvbW90ZSB0aGUgUEhJIG5vZGVzIGFmdGVyIHRoaXMgZ2F1bnRsZXQgb2YgdGVzdHMsCisgIC8vIGRvIGFsbCBvZiB0aGUgUEhJJ3Mgbm93LgorCisgIC8vIE1vdmUgYWxsICdhZ2dyZXNzaXZlJyBpbnN0cnVjdGlvbnMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZQorICAvLyBjb25kaXRpb25hbCBwYXJ0cyBvZiB0aGUgaWYncyB1cCB0byB0aGUgZG9taW5hdGluZyBibG9jay4KKyAgaWYgKElmQmxvY2sxKSB7CisgICAgRG9tQmxvY2stPmdldEluc3RMaXN0KCkuc3BsaWNlKERvbUJsb2NrLT5nZXRUZXJtaW5hdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmQmxvY2sxLT5nZXRJbnN0TGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZkJsb2NrMS0+YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWZCbG9jazEtPmdldFRlcm1pbmF0b3IoKSk7CisgIH0KKyAgaWYgKElmQmxvY2syKSB7CisgICAgRG9tQmxvY2stPmdldEluc3RMaXN0KCkuc3BsaWNlKERvbUJsb2NrLT5nZXRUZXJtaW5hdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmQmxvY2syLT5nZXRJbnN0TGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZkJsb2NrMi0+YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWZCbG9jazItPmdldFRlcm1pbmF0b3IoKSk7CisgIH0KKyAgCisgIHdoaWxlIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEJCLT5iZWdpbigpKSkgeworICAgIC8vIENoYW5nZSB0aGUgUEhJIG5vZGUgaW50byBhIHNlbGVjdCBpbnN0cnVjdGlvbi4KKyAgICBWYWx1ZSAqVHJ1ZVZhbCA9CisgICAgICBQTi0+Z2V0SW5jb21pbmdWYWx1ZShQTi0+Z2V0SW5jb21pbmdCbG9jaygwKSA9PSBJZkZhbHNlKTsKKyAgICBWYWx1ZSAqRmFsc2VWYWwgPQorICAgICAgUE4tPmdldEluY29taW5nVmFsdWUoUE4tPmdldEluY29taW5nQmxvY2soMCkgPT0gSWZUcnVlKTsKKyAgICAKKyAgICBWYWx1ZSAqTlYgPSBTZWxlY3RJbnN0OjpDcmVhdGUoSWZDb25kLCBUcnVlVmFsLCBGYWxzZVZhbCwgQWZ0ZXJQSElJdCk7CisgICAgUE4tPnJlcGxhY2VBbGxVc2VzV2l0aChOVik7CisgICAgTlYtPnRha2VOYW1lKFBOKTsKKyAgICAKKyAgICBCQi0+Z2V0SW5zdExpc3QoKS5lcmFzZShQTik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1Rlcm1pbmF0b3JGaXJzdFJlbGV2YW50SW5zbiAtIFJldHVybiB0cnVlIGlmIFRlcm0gaXMgdmVyeSBmaXJzdCAKKy8vLyBpbnN0cnVjdGlvbiBpZ25vcmluZyBQaGkgbm9kZXMgYW5kIGRiZyBpbnRyaW5zaWNzLgorc3RhdGljIGJvb2wgaXNUZXJtaW5hdG9yRmlyc3RSZWxldmFudEluc24oQmFzaWNCbG9jayAqQkIsIEluc3RydWN0aW9uICpUZXJtKSB7CisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9IFRlcm07CisgIHdoaWxlIChCQkkgIT0gQkItPmJlZ2luKCkpIHsKKyAgICAtLUJCSTsKKyAgICBpZiAoIUlTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhCQkkpKQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoaXNhPFBISU5vZGU+KEJCSSkgfHwgJipCQkkgPT0gVGVybSB8fCBJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoQkJJKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gU2ltcGxpZnlDb25kQnJhbmNoVG9Ud29SZXR1cm5zIC0gSWYgd2UgZm91bmQgYSBjb25kaXRpb25hbCBicmFuY2ggdGhhdCBnb2VzCisvLy8gdG8gdHdvIHJldHVybmluZyBibG9ja3MsIHRyeSB0byBtZXJnZSB0aGVtIHRvZ2V0aGVyIGludG8gb25lIHJldHVybiwKKy8vLyBpbnRyb2R1Y2luZyBhIHNlbGVjdCBpZiB0aGUgcmV0dXJuIHZhbHVlcyBkaXNhZ3JlZS4KK3N0YXRpYyBib29sIFNpbXBsaWZ5Q29uZEJyYW5jaFRvVHdvUmV0dXJucyhCcmFuY2hJbnN0ICpCSSkgeworICBhc3NlcnQoQkktPmlzQ29uZGl0aW9uYWwoKSAmJiAiTXVzdCBiZSBhIGNvbmRpdGlvbmFsIGJyYW5jaCIpOworICBCYXNpY0Jsb2NrICpUcnVlU3VjYyA9IEJJLT5nZXRTdWNjZXNzb3IoMCk7CisgIEJhc2ljQmxvY2sgKkZhbHNlU3VjYyA9IEJJLT5nZXRTdWNjZXNzb3IoMSk7CisgIFJldHVybkluc3QgKlRydWVSZXQgPSBjYXN0PFJldHVybkluc3Q+KFRydWVTdWNjLT5nZXRUZXJtaW5hdG9yKCkpOworICBSZXR1cm5JbnN0ICpGYWxzZVJldCA9IGNhc3Q8UmV0dXJuSW5zdD4oRmFsc2VTdWNjLT5nZXRUZXJtaW5hdG9yKCkpOworICAKKyAgLy8gQ2hlY2sgdG8gZW5zdXJlIGJvdGggYmxvY2tzIGFyZSBlbXB0eSAoanVzdCBhIHJldHVybikgb3Igb3B0aW9uYWxseSBlbXB0eQorICAvLyB3aXRoIFBISSBub2Rlcy4gIElmIHRoZXJlIGFyZSBvdGhlciBpbnN0cnVjdGlvbnMsIG1lcmdpbmcgd291bGQgY2F1c2UgZXh0cmEKKyAgLy8gY29tcHV0YXRpb24gb24gb25lIHBhdGggb3IgdGhlIG90aGVyLgorICBpZiAoIWlzVGVybWluYXRvckZpcnN0UmVsZXZhbnRJbnNuKFRydWVTdWNjLCBUcnVlUmV0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghaXNUZXJtaW5hdG9yRmlyc3RSZWxldmFudEluc24oRmFsc2VTdWNjLCBGYWxzZVJldCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE9rYXksIHdlIGZvdW5kIGEgYnJhbmNoIHRoYXQgaXMgZ29pbmcgdG8gdHdvIHJldHVybiBub2Rlcy4gIElmCisgIC8vIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSBmb3IgdGhpcyBmdW5jdGlvbiwganVzdCBjaGFuZ2UgdGhlCisgIC8vIGJyYW5jaCBpbnRvIGEgcmV0dXJuLgorICBpZiAoRmFsc2VSZXQtPmdldE51bU9wZXJhbmRzKCkgPT0gMCkgeworICAgIFRydWVTdWNjLT5yZW1vdmVQcmVkZWNlc3NvcihCSS0+Z2V0UGFyZW50KCkpOworICAgIEZhbHNlU3VjYy0+cmVtb3ZlUHJlZGVjZXNzb3IoQkktPmdldFBhcmVudCgpKTsKKyAgICBSZXR1cm5JbnN0OjpDcmVhdGUoQkktPmdldENvbnRleHQoKSwgMCwgQkkpOworICAgIEVyYXNlVGVybWluYXRvckluc3RBbmREQ0VDb25kKEJJKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAgIAorICAvLyBPdGhlcndpc2UsIGZpZ3VyZSBvdXQgd2hhdCB0aGUgdHJ1ZSBhbmQgZmFsc2UgcmV0dXJuIHZhbHVlcyBhcmUKKyAgLy8gc28gd2UgY2FuIGluc2VydCBhIG5ldyBzZWxlY3QgaW5zdHJ1Y3Rpb24uCisgIFZhbHVlICpUcnVlVmFsdWUgPSBUcnVlUmV0LT5nZXRSZXR1cm5WYWx1ZSgpOworICBWYWx1ZSAqRmFsc2VWYWx1ZSA9IEZhbHNlUmV0LT5nZXRSZXR1cm5WYWx1ZSgpOworICAKKyAgLy8gVW53cmFwIGFueSBQSEkgbm9kZXMgaW4gdGhlIHJldHVybiBibG9ja3MuCisgIGlmIChQSElOb2RlICpUVlBOID0gZHluX2Nhc3Rfb3JfbnVsbDxQSElOb2RlPihUcnVlVmFsdWUpKQorICAgIGlmIChUVlBOLT5nZXRQYXJlbnQoKSA9PSBUcnVlU3VjYykKKyAgICAgIFRydWVWYWx1ZSA9IFRWUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhCSS0+Z2V0UGFyZW50KCkpOworICBpZiAoUEhJTm9kZSAqRlZQTiA9IGR5bl9jYXN0X29yX251bGw8UEhJTm9kZT4oRmFsc2VWYWx1ZSkpCisgICAgaWYgKEZWUE4tPmdldFBhcmVudCgpID09IEZhbHNlU3VjYykKKyAgICAgIEZhbHNlVmFsdWUgPSBGVlBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soQkktPmdldFBhcmVudCgpKTsKKyAgCisgIC8vIEluIG9yZGVyIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uIHRvIGJlIHNhZmUsIHdlIG11c3QgYmUgYWJsZSB0bworICAvLyB1bmNvbmRpdGlvbmFsbHkgZXhlY3V0ZSBib3RoIG9wZXJhbmRzIHRvIHRoZSByZXR1cm4uICBUaGlzIGlzCisgIC8vIG5vcm1hbGx5IHRoZSBjYXNlLCBidXQgd2UgY291bGQgaGF2ZSBhIHBvdGVudGlhbGx5LXRyYXBwaW5nCisgIC8vIGNvbnN0YW50IGV4cHJlc3Npb24gdGhhdCBwcmV2ZW50cyB0aGlzIHRyYW5zZm9ybWF0aW9uIGZyb20gYmVpbmcKKyAgLy8gc2FmZS4KKyAgaWYgKENvbnN0YW50RXhwciAqVENWID0gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudEV4cHI+KFRydWVWYWx1ZSkpCisgICAgaWYgKFRDVi0+Y2FuVHJhcCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICBpZiAoQ29uc3RhbnRFeHByICpGQ1YgPSBkeW5fY2FzdF9vcl9udWxsPENvbnN0YW50RXhwcj4oRmFsc2VWYWx1ZSkpCisgICAgaWYgKEZDVi0+Y2FuVHJhcCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gT2theSwgd2UgY29sbGVjdGVkIGFsbCB0aGUgbWFwcGVkIHZhbHVlcyBhbmQgY2hlY2tlZCB0aGVtIGZvciBzYW5pdHksIGFuZAorICAvLyBkZWZpbmVkIHRvIHJlYWxseSBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uLiAgRmlyc3QsIHVwZGF0ZSB0aGUgQ0ZHLgorICBUcnVlU3VjYy0+cmVtb3ZlUHJlZGVjZXNzb3IoQkktPmdldFBhcmVudCgpKTsKKyAgRmFsc2VTdWNjLT5yZW1vdmVQcmVkZWNlc3NvcihCSS0+Z2V0UGFyZW50KCkpOworICAKKyAgLy8gSW5zZXJ0IHNlbGVjdCBpbnN0cnVjdGlvbnMgd2hlcmUgbmVlZGVkLgorICBWYWx1ZSAqQnJDb25kID0gQkktPmdldENvbmRpdGlvbigpOworICBpZiAoVHJ1ZVZhbHVlKSB7CisgICAgLy8gSW5zZXJ0IGEgc2VsZWN0IGlmIHRoZSByZXN1bHRzIGRpZmZlci4KKyAgICBpZiAoVHJ1ZVZhbHVlID09IEZhbHNlVmFsdWUgfHwgaXNhPFVuZGVmVmFsdWU+KEZhbHNlVmFsdWUpKSB7CisgICAgfSBlbHNlIGlmIChpc2E8VW5kZWZWYWx1ZT4oVHJ1ZVZhbHVlKSkgeworICAgICAgVHJ1ZVZhbHVlID0gRmFsc2VWYWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgVHJ1ZVZhbHVlID0gU2VsZWN0SW5zdDo6Q3JlYXRlKEJyQ29uZCwgVHJ1ZVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlVmFsdWUsIEJJKTsKKyAgICB9CisgIH0KKworICBWYWx1ZSAqUkkgPSAhVHJ1ZVZhbHVlID8KKyAgICAgICAgICAgICAgUmV0dXJuSW5zdDo6Q3JlYXRlKEJJLT5nZXRDb250ZXh0KCksIEJJKSA6CisgICAgICAgICAgICAgIFJldHVybkluc3Q6OkNyZWF0ZShCSS0+Z2V0Q29udGV4dCgpLCBUcnVlVmFsdWUsIEJJKTsKKyAgKHZvaWQpIFJJOworICAgICAgCisgIERFQlVHKGRiZ3MoKSA8PCAiXG5DSEFOR0lORyBCUkFOQ0ggVE8gVFdPIFJFVFVSTlMgSU5UTyBTRUxFQ1Q6IgorICAgICAgICAgICAgICAgPDwgIlxuICAiIDw8ICpCSSA8PCAiTmV3UmV0ID0gIiA8PCAqUkkKKyAgICAgICAgICAgICAgIDw8ICJUUlVFQkxPQ0s6ICIgPDwgKlRydWVTdWNjIDw8ICJGQUxTRUJMT0NLOiAiPDwgKkZhbHNlU3VjYyk7CisgICAgICAKKyAgRXJhc2VUZXJtaW5hdG9ySW5zdEFuZERDRUNvbmQoQkkpOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gRm9sZEJyYW5jaFRvQ29tbW9uRGVzdCAtIElmIHRoaXMgYmFzaWMgYmxvY2sgaXMgT05MWSBhIHNldGNjIGFuZCBhIGJyYW5jaCwKKy8vLyBhbmQgaWYgYSBwcmVkZWNlc3NvciBicmFuY2hlcyB0byB1cyBhbmQgb25lIG9mIG91ciBzdWNjZXNzb3JzLCBmb2xkIHRoZQorLy8vIHNldGNjIGludG8gdGhlIHByZWRlY2Vzc29yIGFuZCB1c2UgbG9naWNhbCBvcGVyYXRpb25zIHRvIHBpY2sgdGhlIHJpZ2h0CisvLy8gZGVzdGluYXRpb24uCitib29sIGxsdm06OkZvbGRCcmFuY2hUb0NvbW1vbkRlc3QoQnJhbmNoSW5zdCAqQkkpIHsKKyAgQmFzaWNCbG9jayAqQkIgPSBCSS0+Z2V0UGFyZW50KCk7CisgIEluc3RydWN0aW9uICpDb25kID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KEJJLT5nZXRDb25kaXRpb24oKSk7CisgIGlmIChDb25kID09IDAgfHwgKCFpc2E8Q21wSW5zdD4oQ29uZCkgJiYgIWlzYTxCaW5hcnlPcGVyYXRvcj4oQ29uZCkpIHx8CisgICAgQ29uZC0+Z2V0UGFyZW50KCkgIT0gQkIgfHwgIUNvbmQtPmhhc09uZVVzZSgpKQorICByZXR1cm4gZmFsc2U7CisgIAorICAvLyBPbmx5IGFsbG93IHRoaXMgaWYgdGhlIGNvbmRpdGlvbiBpcyBhIHNpbXBsZSBpbnN0cnVjdGlvbiB0aGF0IGNhbiBiZQorICAvLyBleGVjdXRlZCB1bmNvbmRpdGlvbmFsbHkuICBJdCBtdXN0IGJlIGluIHRoZSBzYW1lIGJsb2NrIGFzIHRoZSBicmFuY2gsIGFuZAorICAvLyBtdXN0IGJlIGF0IHRoZSBmcm9udCBvZiB0aGUgYmxvY2suCisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEZyb250SXQgPSBCQi0+ZnJvbnQoKTsKKyAgLy8gSWdub3JlIGRiZyBpbnRyaW5zaWNzLgorICB3aGlsZShJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoRnJvbnRJdCkpCisgICAgKytGcm9udEl0OworICAgIAorICAvLyBBbGxvdyBhIHNpbmdsZSBpbnN0cnVjdGlvbiB0byBiZSBob2lzdGVkIGluIGFkZGl0aW9uIHRvIHRoZSBjb21wYXJlCisgIC8vIHRoYXQgZmVlZHMgdGhlIGJyYW5jaC4gIFdlIGxhdGVyIGVuc3VyZSB0aGF0IGFueSB2YWx1ZXMgdGhhdCBfaXRfIHVzZXMKKyAgLy8gd2VyZSBhbHNvIGxpdmUgaW4gdGhlIHByZWRlY2Vzc29yLCBzbyB0aGF0IHdlIGRvbid0IHVubmVjZXNzYXJpbHkgY3JlYXRlCisgIC8vIHJlZ2lzdGVyIHByZXNzdXJlIG9yIGluaGliaXQgb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbi4KKyAgSW5zdHJ1Y3Rpb24gKkJvbnVzSW5zdCA9IDA7CisgIGlmICgmKkZyb250SXQgIT0gQ29uZCAmJgorICAgICAgRnJvbnRJdC0+aGFzT25lVXNlKCkgJiYgKkZyb250SXQtPnVzZV9iZWdpbigpID09IENvbmQgJiYKKyAgICAgIEZyb250SXQtPmlzU2FmZVRvU3BlY3VsYXRpdmVseUV4ZWN1dGUoKSkgeworICAgIEJvbnVzSW5zdCA9ICYqRnJvbnRJdDsKKyAgICArK0Zyb250SXQ7CisgIH0KKyAgCisgIC8vIE9ubHkgYSBzaW5nbGUgYm9udXMgaW5zdCBpcyBhbGxvd2VkLgorICBpZiAoJipGcm9udEl0ICE9IENvbmQpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gTWFrZSBzdXJlIHRoZSBpbnN0cnVjdGlvbiBhZnRlciB0aGUgY29uZGl0aW9uIGlzIHRoZSBjb25kIGJyYW5jaC4KKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQ29uZEl0ID0gQ29uZDsgKytDb25kSXQ7CisgIC8vIEluZ29yZSBkYmcgaW50cmluc2ljcy4KKyAgd2hpbGUoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKENvbmRJdCkpCisgICAgKytDb25kSXQ7CisgIGlmICgmKkNvbmRJdCAhPSBCSSkgeworICAgIGFzc2VydCAoIUlTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhDb25kSXQpICYmICJIZXkgZG8gbm90IGZvcmdldCBkZWJ1ZyBpbmZvISIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIENvbmQgaXMga25vd24gdG8gYmUgYSBjb21wYXJlIG9yIGJpbmFyeSBvcGVyYXRvci4gIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0CisgIC8vIG5laXRoZXIgb3BlcmFuZCBpcyBhIHBvdGVudGlhbGx5LXRyYXBwaW5nIGNvbnN0YW50IGV4cHJlc3Npb24uCisgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDb25kLT5nZXRPcGVyYW5kKDApKSkKKyAgICBpZiAoQ0UtPmNhblRyYXAoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KENvbmQtPmdldE9wZXJhbmQoMSkpKQorICAgIGlmIChDRS0+Y2FuVHJhcCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAKKyAgCisgIC8vIEZpbmFsbHksIGRvbid0IGluZmluaXRlbHkgdW5yb2xsIGNvbmRpdGlvbmFsIGxvb3BzLgorICBCYXNpY0Jsb2NrICpUcnVlRGVzdCAgPSBCSS0+Z2V0U3VjY2Vzc29yKDApOworICBCYXNpY0Jsb2NrICpGYWxzZURlc3QgPSBCSS0+Z2V0U3VjY2Vzc29yKDEpOworICBpZiAoVHJ1ZURlc3QgPT0gQkIgfHwgRmFsc2VEZXN0ID09IEJCKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGZvciAocHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oQkIpLCBFID0gcHJlZF9lbmQoQkIpOyBQSSAhPSBFOyArK1BJKSB7CisgICAgQmFzaWNCbG9jayAqUHJlZEJsb2NrID0gKlBJOworICAgIEJyYW5jaEluc3QgKlBCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KFByZWRCbG9jay0+Z2V0VGVybWluYXRvcigpKTsKKyAgICAKKyAgICAvLyBDaGVjayB0aGF0IHdlIGhhdmUgdHdvIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgSWYgdGhlcmUgaXMgYSBQSEkgbm9kZSBpbgorICAgIC8vIHRoZSBjb21tb24gc3VjY2Vzc29yLCB2ZXJpZnkgdGhhdCB0aGUgc2FtZSB2YWx1ZSBmbG93cyBpbiBmcm9tIGJvdGgKKyAgICAvLyBibG9ja3MuCisgICAgaWYgKFBCSSA9PSAwIHx8IFBCSS0+aXNVbmNvbmRpdGlvbmFsKCkgfHwKKyAgICAgICAgIVNhZmVUb01lcmdlVGVybWluYXRvcnMoQkksIFBCSSkpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAvLyBFbnN1cmUgdGhhdCBhbnkgdmFsdWVzIHVzZWQgaW4gdGhlIGJvbnVzIGluc3RydWN0aW9uIGFyZSBhbHNvIHVzZWQKKyAgICAvLyBieSB0aGUgdGVybWluYXRvciBvZiB0aGUgcHJlZGVjZXNzb3IuICBUaGlzIG1lYW5zIHRoYXQgdGhvc2UgdmFsdWVzCisgICAgLy8gbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiByZXNvbHZlZCwgc28gd2Ugd29uJ3QgYmUgaW5oaWJpdGluZyB0aGUgCisgICAgLy8gb3V0LW9mLW9yZGVyIGNvcmUgYnkgc3BlY3VsYXRpbmcgdGhlbSBlYXJsaWVyLgorICAgIGlmIChCb251c0luc3QpIHsKKyAgICAgIC8vIENvbGxlY3QgdGhlIHZhbHVlcyB1c2VkIGJ5IHRoZSBib251cyBpbnN0CisgICAgICBTbWFsbFB0clNldDxWYWx1ZSosIDQ+IFVzZWRWYWx1ZXM7CisgICAgICBmb3IgKEluc3RydWN0aW9uOjpvcF9pdGVyYXRvciBPSSA9IEJvbnVzSW5zdC0+b3BfYmVnaW4oKSwKKyAgICAgICAgICAgT0UgPSBCb251c0luc3QtPm9wX2VuZCgpOyBPSSAhPSBPRTsgKytPSSkgeworICAgICAgICBWYWx1ZSogViA9ICpPSTsKKyAgICAgICAgaWYgKCFpc2E8Q29uc3RhbnQ+KFYpKQorICAgICAgICAgIFVzZWRWYWx1ZXMuaW5zZXJ0KFYpOworICAgICAgfQorCisgICAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8VmFsdWUqLCB1bnNpZ25lZD4sIDQ+IFdvcmtsaXN0OworICAgICAgV29ya2xpc3QucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFBCSS0+Z2V0T3BlcmFuZCgwKSwgMCkpOworICAgICAgCisgICAgICAvLyBXYWxrIHVwIHRvIGZvdXIgbGV2ZWxzIGJhY2sgdXAgdGhlIHVzZS1kZWYgY2hhaW4gb2YgdGhlIHByZWRlY2Vzc29yJ3MKKyAgICAgIC8vIHRlcm1pbmF0b3IgdG8gc2VlIGlmIGFsbCB0aG9zZSB2YWx1ZXMgd2VyZSB1c2VkLiAgVGhlIGNob2ljZSBvZiBmb3VyCisgICAgICAvLyBsZXZlbHMgaXMgYXJiaXRyYXJ5LCB0byBwcm92aWRlIGEgY29tcGlsZS10aW1lLWNvc3QgYm91bmQuCisgICAgICB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgc3RkOjpwYWlyPFZhbHVlKiwgdW5zaWduZWQ+IFBhaXIgPSBXb3JrbGlzdC5iYWNrKCk7CisgICAgICAgIFdvcmtsaXN0LnBvcF9iYWNrKCk7CisgICAgICAgIAorICAgICAgICBpZiAoUGFpci5zZWNvbmQgPj0gNCkgY29udGludWU7CisgICAgICAgIFVzZWRWYWx1ZXMuZXJhc2UoUGFpci5maXJzdCk7CisgICAgICAgIGlmIChVc2VkVmFsdWVzLmVtcHR5KCkpIGJyZWFrOworICAgICAgICAKKyAgICAgICAgaWYgKEluc3RydWN0aW9uKiBJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFBhaXIuZmlyc3QpKSB7CisgICAgICAgICAgZm9yIChJbnN0cnVjdGlvbjo6b3BfaXRlcmF0b3IgT0kgPSBJLT5vcF9iZWdpbigpLCBPRSA9IEktPm9wX2VuZCgpOworICAgICAgICAgICAgICAgT0kgIT0gT0U7ICsrT0kpCisgICAgICAgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoT0ktPmdldCgpLCBQYWlyLnNlY29uZCsxKSk7CisgICAgICAgIH0gICAgICAgCisgICAgICB9CisgICAgICAKKyAgICAgIGlmICghVXNlZFZhbHVlcy5lbXB0eSgpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIEluc3RydWN0aW9uOjpCaW5hcnlPcHMgT3BjOworICAgIGJvb2wgSW52ZXJ0UHJlZENvbmQgPSBmYWxzZTsKKworICAgIGlmIChQQkktPmdldFN1Y2Nlc3NvcigwKSA9PSBUcnVlRGVzdCkKKyAgICAgIE9wYyA9IEluc3RydWN0aW9uOjpPcjsKKyAgICBlbHNlIGlmIChQQkktPmdldFN1Y2Nlc3NvcigxKSA9PSBGYWxzZURlc3QpCisgICAgICBPcGMgPSBJbnN0cnVjdGlvbjo6QW5kOworICAgIGVsc2UgaWYgKFBCSS0+Z2V0U3VjY2Vzc29yKDApID09IEZhbHNlRGVzdCkKKyAgICAgIE9wYyA9IEluc3RydWN0aW9uOjpBbmQsIEludmVydFByZWRDb25kID0gdHJ1ZTsKKyAgICBlbHNlIGlmIChQQkktPmdldFN1Y2Nlc3NvcigxKSA9PSBUcnVlRGVzdCkKKyAgICAgIE9wYyA9IEluc3RydWN0aW9uOjpPciwgSW52ZXJ0UHJlZENvbmQgPSB0cnVlOworICAgIGVsc2UKKyAgICAgIGNvbnRpbnVlOworCisgICAgREVCVUcoZGJncygpIDw8ICJGT0xESU5HIEJSQU5DSCBUTyBDT01NT04gREVTVDpcbiIgPDwgKlBCSSA8PCAqQkIpOworICAgIAorICAgIC8vIElmIHdlIG5lZWQgdG8gaW52ZXJ0IHRoZSBjb25kaXRpb24gaW4gdGhlIHByZWQgYmxvY2sgdG8gbWF0Y2gsIGRvIHNvIG5vdy4KKyAgICBpZiAoSW52ZXJ0UHJlZENvbmQpIHsKKyAgICAgIFZhbHVlICpOZXdDb25kID0KKyAgICAgICAgQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5vdChQQkktPmdldENvbmRpdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBCSSk7CisgICAgICBQQkktPnNldENvbmRpdGlvbihOZXdDb25kKTsKKyAgICAgIEJhc2ljQmxvY2sgKk9sZFRydWUgPSBQQkktPmdldFN1Y2Nlc3NvcigwKTsKKyAgICAgIEJhc2ljQmxvY2sgKk9sZEZhbHNlID0gUEJJLT5nZXRTdWNjZXNzb3IoMSk7CisgICAgICBQQkktPnNldFN1Y2Nlc3NvcigwLCBPbGRGYWxzZSk7CisgICAgICBQQkktPnNldFN1Y2Nlc3NvcigxLCBPbGRUcnVlKTsKKyAgICB9CisgICAgCisgICAgLy8gSWYgd2UgaGF2ZSBhIGJvbnVzIGluc3QsIGNsb25lIGl0IGludG8gdGhlIHByZWRlY2Vzc29yIGJsb2NrLgorICAgIEluc3RydWN0aW9uICpOZXdCb251cyA9IDA7CisgICAgaWYgKEJvbnVzSW5zdCkgeworICAgICAgTmV3Qm9udXMgPSBCb251c0luc3QtPmNsb25lKCk7CisgICAgICBQcmVkQmxvY2stPmdldEluc3RMaXN0KCkuaW5zZXJ0KFBCSSwgTmV3Qm9udXMpOworICAgICAgTmV3Qm9udXMtPnRha2VOYW1lKEJvbnVzSW5zdCk7CisgICAgICBCb251c0luc3QtPnNldE5hbWUoQm9udXNJbnN0LT5nZXROYW1lKCkrIi5vbGQiKTsKKyAgICB9CisgICAgCisgICAgLy8gQ2xvbmUgQ29uZCBpbnRvIHRoZSBwcmVkZWNlc3NvciBiYXNpYyBibG9jaywgYW5kIG9yL2FuZCB0aGUKKyAgICAvLyB0d28gY29uZGl0aW9ucyB0b2dldGhlci4KKyAgICBJbnN0cnVjdGlvbiAqTmV3ID0gQ29uZC0+Y2xvbmUoKTsKKyAgICBpZiAoQm9udXNJbnN0KSBOZXctPnJlcGxhY2VVc2VzT2ZXaXRoKEJvbnVzSW5zdCwgTmV3Qm9udXMpOworICAgIFByZWRCbG9jay0+Z2V0SW5zdExpc3QoKS5pbnNlcnQoUEJJLCBOZXcpOworICAgIE5ldy0+dGFrZU5hbWUoQ29uZCk7CisgICAgQ29uZC0+c2V0TmFtZShOZXctPmdldE5hbWUoKSsiLm9sZCIpOworICAgIAorICAgIFZhbHVlICpOZXdDb25kID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShPcGMsIFBCSS0+Z2V0Q29uZGl0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldywgUEJJKTsKKyAgICBQQkktPnNldENvbmRpdGlvbihOZXdDb25kKTsKKyAgICBpZiAoUEJJLT5nZXRTdWNjZXNzb3IoMCkgPT0gQkIpIHsKKyAgICAgIEFkZFByZWRlY2Vzc29yVG9CbG9jayhUcnVlRGVzdCwgUHJlZEJsb2NrLCBCQik7CisgICAgICBQQkktPnNldFN1Y2Nlc3NvcigwLCBUcnVlRGVzdCk7CisgICAgfQorICAgIGlmIChQQkktPmdldFN1Y2Nlc3NvcigxKSA9PSBCQikgeworICAgICAgQWRkUHJlZGVjZXNzb3JUb0Jsb2NrKEZhbHNlRGVzdCwgUHJlZEJsb2NrLCBCQik7CisgICAgICBQQkktPnNldFN1Y2Nlc3NvcigxLCBGYWxzZURlc3QpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBTaW1wbGlmeUNvbmRCcmFuY2hUb0NvbmRCcmFuY2ggLSBJZiB3ZSBoYXZlIGEgY29uZGl0aW9uYWwgYnJhbmNoIGFzIGEKKy8vLyBwcmVkZWNlc3NvciBvZiBhbm90aGVyIGJsb2NrLCB0aGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHNpbXBsaWZ5IGl0LiAgV2Uga25vdworLy8vIHRoYXQgUEJJIGFuZCBCSSBhcmUgYm90aCBjb25kaXRpb25hbCBicmFuY2hlcywgYW5kIEJJIGlzIGluIG9uZSBvZiB0aGUKKy8vLyBzdWNjZXNzb3IgYmxvY2tzIG9mIFBCSSAtIFBCSSBicmFuY2hlcyB0byBCSS4KK3N0YXRpYyBib29sIFNpbXBsaWZ5Q29uZEJyYW5jaFRvQ29uZEJyYW5jaChCcmFuY2hJbnN0ICpQQkksIEJyYW5jaEluc3QgKkJJKSB7CisgIGFzc2VydChQQkktPmlzQ29uZGl0aW9uYWwoKSAmJiBCSS0+aXNDb25kaXRpb25hbCgpKTsKKyAgQmFzaWNCbG9jayAqQkIgPSBCSS0+Z2V0UGFyZW50KCk7CisKKyAgLy8gSWYgdGhpcyBibG9jayBlbmRzIHdpdGggYSBicmFuY2ggaW5zdHJ1Y3Rpb24sIGFuZCBpZiB0aGVyZSBpcyBhCisgIC8vIHByZWRlY2Vzc29yIHRoYXQgZW5kcyBvbiBhIGJyYW5jaCBvZiB0aGUgc2FtZSBjb25kaXRpb24sIG1ha2UgCisgIC8vIHRoaXMgY29uZGl0aW9uYWwgYnJhbmNoIHJlZHVuZGFudC4KKyAgaWYgKFBCSS0+Z2V0Q29uZGl0aW9uKCkgPT0gQkktPmdldENvbmRpdGlvbigpICYmCisgICAgICBQQkktPmdldFN1Y2Nlc3NvcigwKSAhPSBQQkktPmdldFN1Y2Nlc3NvcigxKSkgeworICAgIC8vIE9rYXksIHRoZSBvdXRjb21lIG9mIHRoaXMgY29uZGl0aW9uYWwgYnJhbmNoIGlzIHN0YXRpY2FsbHkKKyAgICAvLyBrbm93YWJsZS4gIElmIHRoaXMgYmxvY2sgaGFkIGEgc2luZ2xlIHByZWQsIGhhbmRsZSBzcGVjaWFsbHkuCisgICAgaWYgKEJCLT5nZXRTaW5nbGVQcmVkZWNlc3NvcigpKSB7CisgICAgICAvLyBUdXJuIHRoaXMgaW50byBhIGJyYW5jaCBvbiBjb25zdGFudC4KKyAgICAgIGJvb2wgQ29uZElzVHJ1ZSA9IFBCSS0+Z2V0U3VjY2Vzc29yKDApID09IEJCOworICAgICAgQkktPnNldENvbmRpdGlvbihDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDFUeShCQi0+Z2V0Q29udGV4dCgpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZElzVHJ1ZSkpOworICAgICAgcmV0dXJuIHRydWU7ICAvLyBOdWtlIHRoZSBicmFuY2ggb24gY29uc3RhbnQuCisgICAgfQorICAgIAorICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHByZWRlY2Vzc29ycywgaW5zZXJ0IGEgUEhJIHRoYXQgbWVyZ2VzCisgICAgLy8gaW4gdGhlIGNvbnN0YW50IGFuZCBzaW1wbGlmeSB0aGUgYmxvY2sgcmVzdWx0LiAgU3Vic2VxdWVudCBwYXNzZXMgb2YKKyAgICAvLyBzaW1wbGlmeWNmZyB3aWxsIHRocmVhZCB0aGUgYmxvY2suCisgICAgaWYgKEJsb2NrSXNTaW1wbGVFbm91Z2hUb1RocmVhZFRocm91Z2goQkIpKSB7CisgICAgICBQSElOb2RlICpOZXdQTiA9IFBISU5vZGU6OkNyZWF0ZShUeXBlOjpnZXRJbnQxVHkoQkItPmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQi0+YmVnaW4oKSk7CisgICAgICAvLyBPa2F5LCB3ZSdyZSBnb2luZyB0byBpbnNlcnQgdGhlIFBISSBub2RlLiAgU2luY2UgUEJJIGlzIG5vdCB0aGUgb25seQorICAgICAgLy8gcHJlZGVjZXNzb3IsIGNvbXB1dGUgdGhlIFBISSdkIGNvbmRpdGlvbmFsIHZhbHVlIGZvciBhbGwgb2YgdGhlIHByZWRzLgorICAgICAgLy8gQW55IHByZWRlY2Vzc29yIHdoZXJlIHRoZSBjb25kaXRpb24gaXMgbm90IGNvbXB1dGFibGUgd2Uga2VlcCBzeW1ib2xpYy4KKyAgICAgIGZvciAocHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oQkIpLCBFID0gcHJlZF9lbmQoQkIpOyBQSSAhPSBFOyArK1BJKSB7CisgICAgICAgIEJhc2ljQmxvY2sgKlAgPSAqUEk7CisgICAgICAgIGlmICgoUEJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oUC0+Z2V0VGVybWluYXRvcigpKSkgJiYKKyAgICAgICAgICAgIFBCSSAhPSBCSSAmJiBQQkktPmlzQ29uZGl0aW9uYWwoKSAmJgorICAgICAgICAgICAgUEJJLT5nZXRDb25kaXRpb24oKSA9PSBCSS0+Z2V0Q29uZGl0aW9uKCkgJiYKKyAgICAgICAgICAgIFBCSS0+Z2V0U3VjY2Vzc29yKDApICE9IFBCSS0+Z2V0U3VjY2Vzc29yKDEpKSB7CisgICAgICAgICAgYm9vbCBDb25kSXNUcnVlID0gUEJJLT5nZXRTdWNjZXNzb3IoMCkgPT0gQkI7CisgICAgICAgICAgTmV3UE4tPmFkZEluY29taW5nKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KEJCLT5nZXRDb250ZXh0KCkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kSXNUcnVlKSwgUCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTmV3UE4tPmFkZEluY29taW5nKEJJLT5nZXRDb25kaXRpb24oKSwgUCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgQkktPnNldENvbmRpdGlvbihOZXdQTik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgCisgIC8vIElmIHRoaXMgaXMgYSBjb25kaXRpb25hbCBicmFuY2ggaW4gYW4gZW1wdHkgYmxvY2ssIGFuZCBpZiBhbnkKKyAgLy8gcHJlZGVjZXNzb3JzIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoIHRvIG9uZSBvZiBvdXIgZGVzdGluYXRpb25zLAorICAvLyBmb2xkIHRoZSBjb25kaXRpb25zIGludG8gbG9naWNhbCBvcHMgYW5kIG9uZSBjb25kIGJyLgorICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCQkkgPSBCQi0+YmVnaW4oKTsKKyAgLy8gSWdub3JlIGRiZyBpbnRyaW5zaWNzLgorICB3aGlsZSAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEJCSSkpCisgICAgKytCQkk7CisgIGlmICgmKkJCSSAhPSBCSSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgCisgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihCSS0+Z2V0Q29uZGl0aW9uKCkpKQorICAgIGlmIChDRS0+Y2FuVHJhcCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAKKyAgaW50IFBCSU9wLCBCSU9wOworICBpZiAoUEJJLT5nZXRTdWNjZXNzb3IoMCkgPT0gQkktPmdldFN1Y2Nlc3NvcigwKSkKKyAgICBQQklPcCA9IEJJT3AgPSAwOworICBlbHNlIGlmIChQQkktPmdldFN1Y2Nlc3NvcigwKSA9PSBCSS0+Z2V0U3VjY2Vzc29yKDEpKQorICAgIFBCSU9wID0gMCwgQklPcCA9IDE7CisgIGVsc2UgaWYgKFBCSS0+Z2V0U3VjY2Vzc29yKDEpID09IEJJLT5nZXRTdWNjZXNzb3IoMCkpCisgICAgUEJJT3AgPSAxLCBCSU9wID0gMDsKKyAgZWxzZSBpZiAoUEJJLT5nZXRTdWNjZXNzb3IoMSkgPT0gQkktPmdldFN1Y2Nlc3NvcigxKSkKKyAgICBQQklPcCA9IEJJT3AgPSAxOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3RoZXIgZGVzdGluYXRpb24gb2YgdGhpcyBicmFuY2gKKyAgLy8gaXNuJ3QgQkIgaXRzZWxmLiAgSWYgc28sIHRoaXMgaXMgYW4gaW5maW5pdGUgbG9vcCB0aGF0IHdpbGwKKyAgLy8ga2VlcCBnZXR0aW5nIHVud291bmQuCisgIGlmIChQQkktPmdldFN1Y2Nlc3NvcihQQklPcCkgPT0gQkIpCisgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAvLyBEbyBub3QgcGVyZm9ybSB0aGlzIHRyYW5zZm9ybWF0aW9uIGlmIGl0IHdvdWxkIHJlcXVpcmUgCisgIC8vIGluc2VydGlvbiBvZiBhIGxhcmdlIG51bWJlciBvZiBzZWxlY3QgaW5zdHJ1Y3Rpb25zLiBGb3IgdGFyZ2V0cworICAvLyB3aXRob3V0IHByZWRpY2F0aW9uL2Ntb3ZzLCB0aGlzIGlzIGEgYmlnIHBlc3NpbWl6YXRpb24uCisgIEJhc2ljQmxvY2sgKkNvbW1vbkRlc3QgPSBQQkktPmdldFN1Y2Nlc3NvcihQQklPcCk7CisgICAgICAKKyAgdW5zaWduZWQgTnVtUGhpcyA9IDA7CisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSUkgPSBDb21tb25EZXN0LT5iZWdpbigpOworICAgICAgIGlzYTxQSElOb2RlPihJSSk7ICsrSUksICsrTnVtUGhpcykKKyAgICBpZiAoTnVtUGhpcyA+IDIpIC8vIERpc2FibGUgdGhpcyB4Zm9ybS4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgLy8gRmluYWxseSwgaWYgZXZlcnl0aGluZyBpcyBvaywgZm9sZCB0aGUgYnJhbmNoZXMgdG8gbG9naWNhbCBvcHMuCisgIEJhc2ljQmxvY2sgKk90aGVyRGVzdCAgPSBCSS0+Z2V0U3VjY2Vzc29yKEJJT3AgXiAxKTsKKyAgCisgIERFQlVHKGRiZ3MoKSA8PCAiRk9MRElORyBCUnM6IiA8PCAqUEJJLT5nZXRQYXJlbnQoKQorICAgICAgICAgICAgICAgPDwgIkFORDogIiA8PCAqQkktPmdldFBhcmVudCgpKTsKKyAgCisgIAorICAvLyBJZiBPdGhlckRlc3QgKmlzKiBCQiwgdGhlbiBCQiBpcyBhIGJhc2ljIGJsb2NrIHdpdGggYSBzaW5nbGUgY29uZGl0aW9uYWwKKyAgLy8gYnJhbmNoIGluIGl0LCB3aGVyZSBvbmUgZWRnZSAoT3RoZXJEZXN0KSBnb2VzIGJhY2sgdG8gaXRzZWxmIGJ1dCB0aGUgb3RoZXIKKyAgLy8gZXhpdHMuICBXZSBkb24ndCAqa25vdyogdGhhdCB0aGUgcHJvZ3JhbSBhdm9pZHMgdGhlIGluZmluaXRlIGxvb3AKKyAgLy8gKGV2ZW4gdGhvdWdoIHRoYXQgc2VlbXMgbGlrZWx5KS4gIElmIHdlIGRvIHRoaXMgeGZvcm0gbmFpdmVseSwgd2UnbGwgZW5kIHVwCisgIC8vIHJlY3Vyc2l2ZWx5IHVucGVlbGluZyB0aGUgbG9vcC4gIFNpbmNlIHdlIGtub3cgdGhhdCAoYWZ0ZXIgdGhlIHhmb3JtIGlzCisgIC8vIGRvbmUpIHRoYXQgdGhlIGJsb2NrICppcyogaW5maW5pdGUgaWYgcmVhY2hlZCwgd2UganVzdCBtYWtlIGl0IGFuIG9idmlvdXNseQorICAvLyBpbmZpbml0ZSBsb29wIHdpdGggbm8gY29uZCBicmFuY2guCisgIGlmIChPdGhlckRlc3QgPT0gQkIpIHsKKyAgICAvLyBJbnNlcnQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIGJlY2F1c2UgaXQncyBlaXRoZXIgY29kZSwKKyAgICAvLyBvciBpdCB3b24ndCBtYXR0ZXIgaWYgaXQncyBob3QuIDopCisgICAgQmFzaWNCbG9jayAqSW5mTG9vcEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKEJCLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLT5nZXRQYXJlbnQoKSk7CisgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKEluZkxvb3BCbG9jaywgSW5mTG9vcEJsb2NrKTsKKyAgICBPdGhlckRlc3QgPSBJbmZMb29wQmxvY2s7CisgIH0gIAorICAKKyAgREVCVUcoZGJncygpIDw8ICpQQkktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKSk7CisgIAorICAvLyBCSSBtYXkgaGF2ZSBvdGhlciBwcmVkZWNlc3NvcnMuICBCZWNhdXNlIG9mIHRoaXMsIHdlIGxlYXZlCisgIC8vIGl0IGFsb25lLCBidXQgbW9kaWZ5IFBCSS4KKyAgCisgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgdG8gQ29tbW9uRGVzdCBvbiBUcnVlJlRydWUgZGlyZWN0aW9ucy4KKyAgVmFsdWUgKlBCSUNvbmQgPSBQQkktPmdldENvbmRpdGlvbigpOworICBpZiAoUEJJT3ApCisgICAgUEJJQ29uZCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOb3QoUEJJQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQkkpOworICBWYWx1ZSAqQklDb25kID0gQkktPmdldENvbmRpdGlvbigpOworICBpZiAoQklPcCkKKyAgICBCSUNvbmQgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTm90KEJJQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBCSSk7CisgIC8vIE1lcmdlIHRoZSBjb25kaXRpb25zLgorICBWYWx1ZSAqQ29uZCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihQQklDb25kLCBCSUNvbmQsIFBCSSk7CisgIAorICAvLyBNb2RpZnkgUEJJIHRvIGJyYW5jaCBvbiB0aGUgbmV3IGNvbmRpdGlvbiB0byB0aGUgbmV3IGRlc3RzLgorICBQQkktPnNldENvbmRpdGlvbihDb25kKTsKKyAgUEJJLT5zZXRTdWNjZXNzb3IoMCwgQ29tbW9uRGVzdCk7CisgIFBCSS0+c2V0U3VjY2Vzc29yKDEsIE90aGVyRGVzdCk7CisgIAorICAvLyBPdGhlckRlc3QgbWF5IGhhdmUgcGhpIG5vZGVzLiAgSWYgc28sIGFkZCBhbiBlbnRyeSBmcm9tIFBCSSdzCisgIC8vIGJsb2NrIHRoYXQgYXJlIGlkZW50aWNhbCB0byB0aGUgZW50cmllcyBmb3IgQkkncyBibG9jay4KKyAgUEhJTm9kZSAqUE47CisgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSUkgPSBPdGhlckRlc3QtPmJlZ2luKCk7CisgICAgICAgKFBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSUkpKTsgKytJSSkgeworICAgIFZhbHVlICpWID0gUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhCQik7CisgICAgUE4tPmFkZEluY29taW5nKFYsIFBCSS0+Z2V0UGFyZW50KCkpOworICB9CisgIAorICAvLyBXZSBrbm93IHRoYXQgdGhlIENvbW1vbkRlc3QgYWxyZWFkeSBoYWQgYW4gZWRnZSBmcm9tIFBCSSB0bworICAvLyBpdC4gIElmIGl0IGhhcyBQSElzIHRob3VnaCwgdGhlIFBISXMgbWF5IGhhdmUgZGlmZmVyZW50CisgIC8vIGVudHJpZXMgZm9yIEJCIGFuZCBQQkkncyBCQi4gIElmIHNvLCBpbnNlcnQgYSBzZWxlY3QgdG8gbWFrZQorICAvLyB0aGVtIGFncmVlLgorICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gQ29tbW9uRGVzdC0+YmVnaW4oKTsKKyAgICAgICAoUE4gPSBkeW5fY2FzdDxQSElOb2RlPihJSSkpOyArK0lJKSB7CisgICAgVmFsdWUgKkJJViA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soQkIpOworICAgIHVuc2lnbmVkIFBCQklkeCA9IFBOLT5nZXRCYXNpY0Jsb2NrSW5kZXgoUEJJLT5nZXRQYXJlbnQoKSk7CisgICAgVmFsdWUgKlBCSVYgPSBQTi0+Z2V0SW5jb21pbmdWYWx1ZShQQkJJZHgpOworICAgIGlmIChCSVYgIT0gUEJJVikgeworICAgICAgLy8gSW5zZXJ0IGEgc2VsZWN0IGluIFBCSSB0byBwaWNrIHRoZSByaWdodCB2YWx1ZS4KKyAgICAgIFZhbHVlICpOViA9IFNlbGVjdEluc3Q6OkNyZWF0ZShQQklDb25kLCBQQklWLCBCSVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEJJKTsKKyAgICAgIFBOLT5zZXRJbmNvbWluZ1ZhbHVlKFBCQklkeCwgTlYpOworICAgIH0KKyAgfQorICAKKyAgREVCVUcoZGJncygpIDw8ICJJTlRPOiAiIDw8ICpQQkktPmdldFBhcmVudCgpKTsKKyAgREVCVUcoZGJncygpIDw8ICpQQkktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKSk7CisgIAorICAvLyBUaGlzIGJhc2ljIGJsb2NrIGlzIHByb2JhYmx5IGRlYWQuICBXZSBrbm93IGl0IGhhcyBhdCBsZWFzdAorICAvLyBvbmUgZmV3ZXIgcHJlZGVjZXNzb3IuCisgIHJldHVybiB0cnVlOworfQorCitib29sIFNpbXBsaWZ5Q0ZHT3B0OjpydW4oQmFzaWNCbG9jayAqQkIpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIEZ1bmN0aW9uICpNID0gQkItPmdldFBhcmVudCgpOworCisgIGFzc2VydChCQiAmJiBCQi0+Z2V0UGFyZW50KCkgJiYgIkJsb2NrIG5vdCBlbWJlZGRlZCBpbiBmdW5jdGlvbiEiKTsKKyAgYXNzZXJ0KEJCLT5nZXRUZXJtaW5hdG9yKCkgJiYgIkRlZ2VuZXJhdGUgYmFzaWMgYmxvY2sgZW5jb3VudGVyZWQhIik7CisgIGFzc2VydCgmQkItPmdldFBhcmVudCgpLT5nZXRFbnRyeUJsb2NrKCkgIT0gQkIgJiYKKyAgICAgICAgICJDYW4ndCBTaW1wbGlmeSBlbnRyeSBibG9jayEiKTsKKworICAvLyBSZW1vdmUgYmFzaWMgYmxvY2tzIHRoYXQgaGF2ZSBubyBwcmVkZWNlc3NvcnMuLi4gb3IgdGhhdCBqdXN0IGhhdmUgdGhlbXNlbGYKKyAgLy8gYXMgYSBwcmVkZWNlc3Nvci4gIFRoZXNlIGFyZSB1bnJlYWNoYWJsZS4KKyAgaWYgKHByZWRfYmVnaW4oQkIpID09IHByZWRfZW5kKEJCKSB8fCBCQi0+Z2V0U2luZ2xlUHJlZGVjZXNzb3IoKSA9PSBCQikgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiUmVtb3ZpbmcgQkI6IFxuIiA8PCAqQkIpOworICAgIERlbGV0ZURlYWRCbG9jayhCQik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGNvbnN0YW50IHByb3BhZ2F0ZSB0aGlzIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24KKyAgLy8gYXdheS4uLgorICBDaGFuZ2VkIHw9IENvbnN0YW50Rm9sZFRlcm1pbmF0b3IoQkIpOworCisgIC8vIENoZWNrIGZvciBhbmQgZWxpbWluYXRlIGR1cGxpY2F0ZSBQSEkgbm9kZXMgaW4gdGhpcyBibG9jay4KKyAgQ2hhbmdlZCB8PSBFbGltaW5hdGVEdXBsaWNhdGVQSElOb2RlcyhCQik7CisKKyAgLy8gSWYgdGhlcmUgaXMgYSB0cml2aWFsIHR3by1lbnRyeSBQSEkgbm9kZSBpbiB0aGlzIGJhc2ljIGJsb2NrLCBhbmQgd2UgY2FuCisgIC8vIGVsaW1pbmF0ZSBpdCwgZG8gc28gbm93LgorICBpZiAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihCQi0+YmVnaW4oKSkpCisgICAgaWYgKFBOLT5nZXROdW1JbmNvbWluZ1ZhbHVlcygpID09IDIpCisgICAgICBDaGFuZ2VkIHw9IEZvbGRUd29FbnRyeVBISU5vZGUoUE4pOyAKKworICAvLyBJZiB0aGlzIGlzIGEgcmV0dXJuaW5nIGJsb2NrIHdpdGggb25seSBQSEkgbm9kZXMgaW4gaXQsIGZvbGQgdGhlIHJldHVybgorICAvLyBpbnN0cnVjdGlvbiBpbnRvIGFueSB1bmNvbmRpdGlvbmFsIGJyYW5jaCBwcmVkZWNlc3NvcnMuCisgIC8vCisgIC8vIElmIGFueSBwcmVkZWNlc3NvciBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCB0aGF0IGp1c3Qgc2VsZWN0cyBhbW9uZworICAvLyBkaWZmZXJlbnQgcmV0dXJuIHZhbHVlcywgZm9sZCB0aGUgcmVwbGFjZSB0aGUgYnJhbmNoL3JldHVybiB3aXRoIGEgc2VsZWN0CisgIC8vIGFuZCByZXR1cm4uCisgIGlmIChSZXR1cm5JbnN0ICpSSSA9IGR5bl9jYXN0PFJldHVybkluc3Q+KEJCLT5nZXRUZXJtaW5hdG9yKCkpKSB7CisgICAgaWYgKGlzVGVybWluYXRvckZpcnN0UmVsZXZhbnRJbnNuKEJCLCBCQi0+Z2V0VGVybWluYXRvcigpKSkgeworICAgICAgLy8gRmluZCBwcmVkZWNlc3NvcnMgdGhhdCBlbmQgd2l0aCBicmFuY2hlcy4KKyAgICAgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCA4PiBVbmNvbmRCcmFuY2hQcmVkczsKKyAgICAgIFNtYWxsVmVjdG9yPEJyYW5jaEluc3QqLCA4PiBDb25kQnJhbmNoUHJlZHM7CisgICAgICBmb3IgKHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEJCKSwgRSA9IHByZWRfZW5kKEJCKTsgUEkgIT0gRTsgKytQSSkgeworICAgICAgICBCYXNpY0Jsb2NrICpQID0gKlBJOworICAgICAgICBUZXJtaW5hdG9ySW5zdCAqUFRJID0gUC0+Z2V0VGVybWluYXRvcigpOworICAgICAgICBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihQVEkpKSB7CisgICAgICAgICAgaWYgKEJJLT5pc1VuY29uZGl0aW9uYWwoKSkKKyAgICAgICAgICAgIFVuY29uZEJyYW5jaFByZWRzLnB1c2hfYmFjayhQKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBDb25kQnJhbmNoUHJlZHMucHVzaF9iYWNrKEJJKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBmb3VuZCBzb21lLCBkbyB0aGUgdHJhbnNmb3JtYXRpb24hCisgICAgICBpZiAoIVVuY29uZEJyYW5jaFByZWRzLmVtcHR5KCkpIHsKKyAgICAgICAgd2hpbGUgKCFVbmNvbmRCcmFuY2hQcmVkcy5lbXB0eSgpKSB7CisgICAgICAgICAgQmFzaWNCbG9jayAqUHJlZCA9IFVuY29uZEJyYW5jaFByZWRzLnBvcF9iYWNrX3ZhbCgpOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRk9MRElORzogIiA8PCAqQkIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIklOVE8gVU5DT05EIEJSQU5DSCBQUkVEOiAiIDw8ICpQcmVkKTsKKyAgICAgICAgICBJbnN0cnVjdGlvbiAqVW5jb25kQnJhbmNoID0gUHJlZC0+Z2V0VGVybWluYXRvcigpOworICAgICAgICAgIC8vIENsb25lIHRoZSByZXR1cm4gYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBwcmVkZWNlc3Nvci4KKyAgICAgICAgICBJbnN0cnVjdGlvbiAqTmV3UmV0ID0gUkktPmNsb25lKCk7CisgICAgICAgICAgUHJlZC0+Z2V0SW5zdExpc3QoKS5wdXNoX2JhY2soTmV3UmV0KTsKKworICAgICAgICAgIC8vIElmIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24gcmV0dXJucyBhIHZhbHVlLCBhbmQgaWYgdGhlIHZhbHVlIHdhcyBhCisgICAgICAgICAgLy8gUEhJIG5vZGUgaW4gIkJCIiwgcHJvcGFnYXRlIHRoZSByaWdodCB2YWx1ZSBpbnRvIHRoZSByZXR1cm4uCisgICAgICAgICAgZm9yIChVc2VyOjpvcF9pdGVyYXRvciBpID0gTmV3UmV0LT5vcF9iZWdpbigpLCBlID0gTmV3UmV0LT5vcF9lbmQoKTsKKyAgICAgICAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgICAgICAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oKmkpKQorICAgICAgICAgICAgICBpZiAoUE4tPmdldFBhcmVudCgpID09IEJCKQorICAgICAgICAgICAgICAgICppID0gUE4tPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhQcmVkKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBVcGRhdGUgYW55IFBISSBub2RlcyBpbiB0aGUgcmV0dXJuaW5nIGJsb2NrIHRvIHJlYWxpemUgdGhhdCB3ZSBubworICAgICAgICAgIC8vIGxvbmdlciBicmFuY2ggdG8gdGhlbS4KKyAgICAgICAgICBCQi0+cmVtb3ZlUHJlZGVjZXNzb3IoUHJlZCk7CisgICAgICAgICAgUHJlZC0+Z2V0SW5zdExpc3QoKS5lcmFzZShVbmNvbmRCcmFuY2gpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgZWxpbWluYXRlZCBhbGwgcHJlZGVjZXNzb3JzIG9mIHRoZSBibG9jaywgZGVsZXRlIHRoZSBibG9jayBub3cuCisgICAgICAgIGlmIChwcmVkX2JlZ2luKEJCKSA9PSBwcmVkX2VuZChCQikpCisgICAgICAgICAgLy8gV2Uga25vdyB0aGVyZSBhcmUgbm8gc3VjY2Vzc29ycywgc28ganVzdCBudWtlIHRoZSBibG9jay4KKyAgICAgICAgICBNLT5nZXRCYXNpY0Jsb2NrTGlzdCgpLmVyYXNlKEJCKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgb3V0IGFsbCBvZiB0aGUgY29uZGl0aW9uYWwgYnJhbmNoZXMgZ29pbmcgdG8gdGhpcyByZXR1cm4KKyAgICAgIC8vIGluc3RydWN0aW9uLiAgSWYgYW55IG9mIHRoZW0ganVzdCBzZWxlY3QgYmV0d2VlbiByZXR1cm5zLCBjaGFuZ2UgdGhlCisgICAgICAvLyBicmFuY2ggaXRzZWxmIGludG8gYSBzZWxlY3QvcmV0dXJuIHBhaXIuCisgICAgICB3aGlsZSAoIUNvbmRCcmFuY2hQcmVkcy5lbXB0eSgpKSB7CisgICAgICAgIEJyYW5jaEluc3QgKkJJID0gQ29uZEJyYW5jaFByZWRzLnBvcF9iYWNrX3ZhbCgpOworCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbm9uLUJCIHN1Y2Nlc3NvciBpcyBhbHNvIGEgcmV0dXJuIGJsb2NrLgorICAgICAgICBpZiAoaXNhPFJldHVybkluc3Q+KEJJLT5nZXRTdWNjZXNzb3IoMCktPmdldFRlcm1pbmF0b3IoKSkgJiYKKyAgICAgICAgICAgIGlzYTxSZXR1cm5JbnN0PihCSS0+Z2V0U3VjY2Vzc29yKDEpLT5nZXRUZXJtaW5hdG9yKCkpICYmCisgICAgICAgICAgICBTaW1wbGlmeUNvbmRCcmFuY2hUb1R3b1JldHVybnMoQkkpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChTd2l0Y2hJbnN0ICpTSSA9IGR5bl9jYXN0PFN3aXRjaEluc3Q+KEJCLT5nZXRUZXJtaW5hdG9yKCkpKSB7CisgICAgaWYgKGlzVmFsdWVFcXVhbGl0eUNvbXBhcmlzb24oU0kpKSB7CisgICAgICAvLyBJZiB3ZSBvbmx5IGhhdmUgb25lIHByZWRlY2Vzc29yLCBhbmQgaWYgaXQgaXMgYSBicmFuY2ggb24gdGhpcyB2YWx1ZSwKKyAgICAgIC8vIHNlZSBpZiB0aGF0IHByZWRlY2Vzc29yIHRvdGFsbHkgZGV0ZXJtaW5lcyB0aGUgb3V0Y29tZSBvZiB0aGlzIHN3aXRjaC4KKyAgICAgIGlmIChCYXNpY0Jsb2NrICpPbmx5UHJlZCA9IEJCLT5nZXRTaW5nbGVQcmVkZWNlc3NvcigpKQorICAgICAgICBpZiAoU2ltcGxpZnlFcXVhbGl0eUNvbXBhcmlzb25XaXRoT25seVByZWRlY2Vzc29yKFNJLCBPbmx5UHJlZCkpCisgICAgICAgICAgcmV0dXJuIFNpbXBsaWZ5Q0ZHKEJCKSB8fCAxOworCisgICAgICAvLyBJZiB0aGUgYmxvY2sgb25seSBjb250YWlucyB0aGUgc3dpdGNoLCBzZWUgaWYgd2UgY2FuIGZvbGQgdGhlIGJsb2NrCisgICAgICAvLyBhd2F5IGludG8gYW55IHByZWRzLgorICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gQkItPmJlZ2luKCk7CisgICAgICAvLyBJZ25vcmUgZGJnIGludHJpbnNpY3MuCisgICAgICB3aGlsZSAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEJCSSkpCisgICAgICAgICsrQkJJOworICAgICAgaWYgKFNJID09ICYqQkJJKQorICAgICAgICBpZiAoRm9sZFZhbHVlQ29tcGFyaXNvbkludG9QcmVkZWNlc3NvcnMoU0kpKQorICAgICAgICAgIHJldHVybiBTaW1wbGlmeUNGRyhCQikgfHwgMTsKKyAgICB9CisgIH0gZWxzZSBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihCQi0+Z2V0VGVybWluYXRvcigpKSkgeworICAgIGlmIChCSS0+aXNVbmNvbmRpdGlvbmFsKCkpIHsKKyAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJCSSA9IEJCLT5nZXRGaXJzdE5vblBISSgpOworCisgICAgICAvLyBJZ25vcmUgZGJnIGludHJpbnNpY3MuCisgICAgICB3aGlsZSAoSVNBX0RFQlVHX0lORk9fSU5UUklOU0lDKEJCSSkpCisgICAgICAgICsrQkJJOworICAgICAgaWYgKEJCSS0+aXNUZXJtaW5hdG9yKCkpIC8vIFRlcm1pbmF0b3IgaXMgdGhlIG9ubHkgbm9uLXBoaSBpbnN0cnVjdGlvbiEKKyAgICAgICAgaWYgKFRyeVRvU2ltcGxpZnlVbmNvbmRCcmFuY2hGcm9tRW1wdHlCbG9jayhCQikpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAKKyAgICB9IGVsc2UgeyAgLy8gQ29uZGl0aW9uYWwgYnJhbmNoCisgICAgICBpZiAoaXNWYWx1ZUVxdWFsaXR5Q29tcGFyaXNvbihCSSkpIHsKKyAgICAgICAgLy8gSWYgd2Ugb25seSBoYXZlIG9uZSBwcmVkZWNlc3NvciwgYW5kIGlmIGl0IGlzIGEgYnJhbmNoIG9uIHRoaXMgdmFsdWUsCisgICAgICAgIC8vIHNlZSBpZiB0aGF0IHByZWRlY2Vzc29yIHRvdGFsbHkgZGV0ZXJtaW5lcyB0aGUgb3V0Y29tZSBvZiB0aGlzCisgICAgICAgIC8vIHN3aXRjaC4KKyAgICAgICAgaWYgKEJhc2ljQmxvY2sgKk9ubHlQcmVkID0gQkItPmdldFNpbmdsZVByZWRlY2Vzc29yKCkpCisgICAgICAgICAgaWYgKFNpbXBsaWZ5RXF1YWxpdHlDb21wYXJpc29uV2l0aE9ubHlQcmVkZWNlc3NvcihCSSwgT25seVByZWQpKQorICAgICAgICAgICAgcmV0dXJuIFNpbXBsaWZ5Q0ZHKEJCKSB8IHRydWU7CisKKyAgICAgICAgLy8gVGhpcyBibG9jayBtdXN0IGJlIGVtcHR5LCBleGNlcHQgZm9yIHRoZSBzZXRjb25kIGluc3QsIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgLy8gSWdub3JlIGRiZyBpbnRyaW5zaWNzLgorICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQkItPmJlZ2luKCk7CisgICAgICAgIC8vIElnbm9yZSBkYmcgaW50cmluc2ljcy4KKyAgICAgICAgd2hpbGUgKElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJKSkKKyAgICAgICAgICArK0k7CisgICAgICAgIGlmICgmKkkgPT0gQkkpIHsKKyAgICAgICAgICBpZiAoRm9sZFZhbHVlQ29tcGFyaXNvbkludG9QcmVkZWNlc3NvcnMoQkkpKQorICAgICAgICAgICAgcmV0dXJuIFNpbXBsaWZ5Q0ZHKEJCKSB8IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoJipJID09IGNhc3Q8SW5zdHJ1Y3Rpb24+KEJJLT5nZXRDb25kaXRpb24oKSkpeworICAgICAgICAgICsrSTsKKyAgICAgICAgICAvLyBJZ25vcmUgZGJnIGludHJpbnNpY3MuCisgICAgICAgICAgd2hpbGUgKElTQV9ERUJVR19JTkZPX0lOVFJJTlNJQyhJKSkKKyAgICAgICAgICAgICsrSTsKKyAgICAgICAgICBpZigmKkkgPT0gQkkpIHsKKyAgICAgICAgICAgIGlmIChGb2xkVmFsdWVDb21wYXJpc29uSW50b1ByZWRlY2Vzc29ycyhCSSkpCisgICAgICAgICAgICAgIHJldHVybiBTaW1wbGlmeUNGRyhCQikgfCB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBJZiB0aGlzIGlzIGEgYnJhbmNoIG9uIGEgcGhpIG5vZGUgaW4gdGhlIGN1cnJlbnQgYmxvY2ssIHRocmVhZCBjb250cm9sCisgICAgICAvLyB0aHJvdWdoIHRoaXMgYmxvY2sgaWYgYW55IFBISSBub2RlIGVudHJpZXMgYXJlIGNvbnN0YW50cy4KKyAgICAgIGlmIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KEJJLT5nZXRDb25kaXRpb24oKSkpCisgICAgICAgIGlmIChQTi0+Z2V0UGFyZW50KCkgPT0gQkktPmdldFBhcmVudCgpKQorICAgICAgICAgIGlmIChGb2xkQ29uZEJyYW5jaE9uUEhJKEJJKSkKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGlmeUNGRyhCQikgfCB0cnVlOworCisgICAgICAvLyBJZiB0aGlzIGJhc2ljIGJsb2NrIGlzIE9OTFkgYSBzZXRjYyBhbmQgYSBicmFuY2gsIGFuZCBpZiBhIHByZWRlY2Vzc29yCisgICAgICAvLyBicmFuY2hlcyB0byB1cyBhbmQgb25lIG9mIG91ciBzdWNjZXNzb3JzLCBmb2xkIHRoZSBzZXRjYyBpbnRvIHRoZQorICAgICAgLy8gcHJlZGVjZXNzb3IgYW5kIHVzZSBsb2dpY2FsIG9wZXJhdGlvbnMgdG8gcGljayB0aGUgcmlnaHQgZGVzdGluYXRpb24uCisgICAgICBpZiAoRm9sZEJyYW5jaFRvQ29tbW9uRGVzdChCSSkpCisgICAgICAgIHJldHVybiBTaW1wbGlmeUNGRyhCQikgfCB0cnVlOworCisKKyAgICAgIC8vIFNjYW4gcHJlZGVjZXNzb3IgYmxvY2tzIGZvciBjb25kaXRpb25hbCBicmFuY2hlcy4KKyAgICAgIGZvciAocHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oQkIpLCBFID0gcHJlZF9lbmQoQkIpOyBQSSAhPSBFOyArK1BJKQorICAgICAgICBpZiAoQnJhbmNoSW5zdCAqUEJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oKCpQSSktPmdldFRlcm1pbmF0b3IoKSkpCisgICAgICAgICAgaWYgKFBCSSAhPSBCSSAmJiBQQkktPmlzQ29uZGl0aW9uYWwoKSkKKyAgICAgICAgICAgIGlmIChTaW1wbGlmeUNvbmRCcmFuY2hUb0NvbmRCcmFuY2goUEJJLCBCSSkpCisgICAgICAgICAgICAgIHJldHVybiBTaW1wbGlmeUNGRyhCQikgfCB0cnVlOworICAgIH0KKyAgfSBlbHNlIGlmIChpc2E8VW5yZWFjaGFibGVJbnN0PihCQi0+Z2V0VGVybWluYXRvcigpKSkgeworICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgaW5zdHJ1Y3Rpb25zIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgdW5yZWFjaGFibGUgdGhhdCBjYW4KKyAgICAvLyBiZSByZW1vdmVkLCBkbyBzby4KKyAgICBJbnN0cnVjdGlvbiAqVW5yZWFjaGFibGUgPSBCQi0+Z2V0VGVybWluYXRvcigpOworICAgIHdoaWxlIChVbnJlYWNoYWJsZSAhPSBCQi0+YmVnaW4oKSkgeworICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gVW5yZWFjaGFibGU7CisgICAgICAtLUJCSTsKKyAgICAgIC8vIERvIG5vdCBkZWxldGUgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgc2lkZSBlZmZlY3RzLCBsaWtlIGNhbGxzCisgICAgICAvLyAod2hpY2ggbWF5IG5ldmVyIHJldHVybikgYW5kIHZvbGF0aWxlIGxvYWRzIGFuZCBzdG9yZXMuCisgICAgICBpZiAoaXNhPENhbGxJbnN0PihCQkkpICYmICFJU0FfREVCVUdfSU5GT19JTlRSSU5TSUMoQkJJKSkgYnJlYWs7CisKKyAgICAgIGlmIChTdG9yZUluc3QgKlNJID0gZHluX2Nhc3Q8U3RvcmVJbnN0PihCQkkpKQorICAgICAgICBpZiAoU0ktPmlzVm9sYXRpbGUoKSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgaWYgKExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihCQkkpKQorICAgICAgICBpZiAoTEktPmlzVm9sYXRpbGUoKSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgLy8gRGVsZXRlIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgICAgIEJCLT5nZXRJbnN0TGlzdCgpLmVyYXNlKEJCSSk7CisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgdW5yZWFjaGFibGUgaW5zdHJ1Y3Rpb24gaXMgdGhlIGZpcnN0IGluIHRoZSBibG9jaywgdGFrZSBhIGdhbmRlcgorICAgIC8vIGF0IGFsbCBvZiB0aGUgcHJlZGVjZXNzb3JzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24sIGFuZCBzaW1wbGlmeSB0aGVtLgorICAgIGlmICgmQkItPmZyb250KCkgPT0gVW5yZWFjaGFibGUpIHsKKyAgICAgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sqLCA4PiBQcmVkcyhwcmVkX2JlZ2luKEJCKSwgcHJlZF9lbmQoQkIpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcmVkcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFRlcm1pbmF0b3JJbnN0ICpUSSA9IFByZWRzW2ldLT5nZXRUZXJtaW5hdG9yKCk7CisKKyAgICAgICAgaWYgKEJyYW5jaEluc3QgKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oVEkpKSB7CisgICAgICAgICAgaWYgKEJJLT5pc1VuY29uZGl0aW9uYWwoKSkgeworICAgICAgICAgICAgaWYgKEJJLT5nZXRTdWNjZXNzb3IoMCkgPT0gQkIpIHsKKyAgICAgICAgICAgICAgbmV3IFVucmVhY2hhYmxlSW5zdChUSS0+Z2V0Q29udGV4dCgpLCBUSSk7CisgICAgICAgICAgICAgIFRJLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChCSS0+Z2V0U3VjY2Vzc29yKDApID09IEJCKSB7CisgICAgICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShCSS0+Z2V0U3VjY2Vzc29yKDEpLCBCSSk7CisgICAgICAgICAgICAgIEVyYXNlVGVybWluYXRvckluc3RBbmREQ0VDb25kKEJJKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQkktPmdldFN1Y2Nlc3NvcigxKSA9PSBCQikgeworICAgICAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoQkktPmdldFN1Y2Nlc3NvcigwKSwgQkkpOworICAgICAgICAgICAgICBFcmFzZVRlcm1pbmF0b3JJbnN0QW5kRENFQ29uZChCSSk7CisgICAgICAgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChTd2l0Y2hJbnN0ICpTSSA9IGR5bl9jYXN0PFN3aXRjaEluc3Q+KFRJKSkgeworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBTSS0+Z2V0TnVtQ2FzZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgICBpZiAoU0ktPmdldFN1Y2Nlc3NvcihpKSA9PSBCQikgeworICAgICAgICAgICAgICBCQi0+cmVtb3ZlUHJlZGVjZXNzb3IoU0ktPmdldFBhcmVudCgpKTsKKyAgICAgICAgICAgICAgU0ktPnJlbW92ZUNhc2UoaSk7CisgICAgICAgICAgICAgIC0taTsgLS1lOworICAgICAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBJZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1bnJlYWNoYWJsZSwgZmlndXJlIG91dCB0aGUgbW9zdCBwb3B1bGFyCisgICAgICAgICAgLy8gZGVzdGluYXRpb24gYW5kIG1ha2UgaXQgdGhlIGRlZmF1bHQuCisgICAgICAgICAgaWYgKFNJLT5nZXRTdWNjZXNzb3IoMCkgPT0gQkIpIHsKKyAgICAgICAgICAgIHN0ZDo6bWFwPEJhc2ljQmxvY2sqLCB1bnNpZ25lZD4gUG9wdWxhcml0eTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBTSS0+Z2V0TnVtQ2FzZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgICAgIFBvcHVsYXJpdHlbU0ktPmdldFN1Y2Nlc3NvcihpKV0rKzsKKworICAgICAgICAgICAgLy8gRmluZCB0aGUgbW9zdCBwb3B1bGFyIGJsb2NrLgorICAgICAgICAgICAgdW5zaWduZWQgTWF4UG9wID0gMDsKKyAgICAgICAgICAgIEJhc2ljQmxvY2sgKk1heEJsb2NrID0gMDsKKyAgICAgICAgICAgIGZvciAoc3RkOjptYXA8QmFzaWNCbG9jayosIHVuc2lnbmVkPjo6aXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICBJID0gUG9wdWxhcml0eS5iZWdpbigpLCBFID0gUG9wdWxhcml0eS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgICAgICAgaWYgKEktPnNlY29uZCA+IE1heFBvcCkgeworICAgICAgICAgICAgICAgIE1heFBvcCA9IEktPnNlY29uZDsKKyAgICAgICAgICAgICAgICBNYXhCbG9jayA9IEktPmZpcnN0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTWF4QmxvY2spIHsKKyAgICAgICAgICAgICAgLy8gTWFrZSB0aGlzIHRoZSBuZXcgZGVmYXVsdCwgYWxsb3dpbmcgdXMgdG8gZGVsZXRlIGFueSBleHBsaWNpdAorICAgICAgICAgICAgICAvLyBlZGdlcyB0byBpdC4KKyAgICAgICAgICAgICAgU0ktPnNldFN1Y2Nlc3NvcigwLCBNYXhCbG9jayk7CisgICAgICAgICAgICAgIENoYW5nZWQgPSB0cnVlOworCisgICAgICAgICAgICAgIC8vIElmIE1heEJsb2NrIGhhcyBwaGlub2RlcyBpbiBpdCwgcmVtb3ZlIE1heFBvcC0xIGVudHJpZXMgZnJvbQorICAgICAgICAgICAgICAvLyBpdC4KKyAgICAgICAgICAgICAgaWYgKGlzYTxQSElOb2RlPihNYXhCbG9jay0+YmVnaW4oKSkpCisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNYXhQb3AtMTsgKytpKQorICAgICAgICAgICAgICAgICAgTWF4QmxvY2stPnJlbW92ZVByZWRlY2Vzc29yKFNJLT5nZXRQYXJlbnQoKSk7CisKKyAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFNJLT5nZXROdW1DYXNlcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICAgICAgICBpZiAoU0ktPmdldFN1Y2Nlc3NvcihpKSA9PSBNYXhCbG9jaykgeworICAgICAgICAgICAgICAgICAgU0ktPnJlbW92ZUNhc2UoaSk7CisgICAgICAgICAgICAgICAgICAtLWk7IC0tZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoaXMgYmxvY2sgaXMgbm93IGRlYWQsIHJlbW92ZSBpdC4KKyAgICAgIGlmIChwcmVkX2JlZ2luKEJCKSA9PSBwcmVkX2VuZChCQikpIHsKKyAgICAgICAgLy8gV2Uga25vdyB0aGVyZSBhcmUgbm8gc3VjY2Vzc29ycywgc28ganVzdCBudWtlIHRoZSBibG9jay4KKyAgICAgICAgTS0+Z2V0QmFzaWNCbG9ja0xpc3QoKS5lcmFzZShCQik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE1lcmdlIGJhc2ljIGJsb2NrcyBpbnRvIHRoZWlyIHByZWRlY2Vzc29yIGlmIHRoZXJlIGlzIG9ubHkgb25lIGRpc3RpbmN0CisgIC8vIHByZWQsIGFuZCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBkaXN0aW5jdCBzdWNjZXNzb3Igb2YgdGhlIHByZWRlY2Vzc29yLCBhbmQKKyAgLy8gaWYgdGhlcmUgYXJlIG5vIFBISSBub2Rlcy4KKyAgLy8KKyAgaWYgKE1lcmdlQmxvY2tJbnRvUHJlZGVjZXNzb3IoQkIpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIE90aGVyd2lzZSwgaWYgdGhpcyBibG9jayBvbmx5IGhhcyBhIHNpbmdsZSBwcmVkZWNlc3NvciwgYW5kIGlmIHRoYXQgYmxvY2sKKyAgLy8gaXMgYSBjb25kaXRpb25hbCBicmFuY2gsIHNlZSBpZiB3ZSBjYW4gaG9pc3QgYW55IGNvZGUgZnJvbSB0aGlzIGJsb2NrIHVwCisgIC8vIGludG8gb3VyIHByZWRlY2Vzc29yLgorICBwcmVkX2l0ZXJhdG9yIFBJKHByZWRfYmVnaW4oQkIpKSwgUEUocHJlZF9lbmQoQkIpKTsKKyAgQmFzaWNCbG9jayAqT25seVByZWQgPSAqUEkrKzsKKyAgZm9yICg7IFBJICE9IFBFOyArK1BJKSAgLy8gU2VhcmNoIGFsbCBwcmVkZWNlc3NvcnMsIHNlZSBpZiB0aGV5IGFyZSBhbGwgc2FtZQorICAgIGlmICgqUEkgIT0gT25seVByZWQpIHsKKyAgICAgIE9ubHlQcmVkID0gMDsgICAgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIGRpZmZlcmVudCBwcmVkZWNlc3NvcnMuLi4KKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIGlmIChPbmx5UHJlZCkKKyAgICBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihPbmx5UHJlZC0+Z2V0VGVybWluYXRvcigpKSkKKyAgICAgIGlmIChCSS0+aXNDb25kaXRpb25hbCgpKSB7CisgICAgICAgIC8vIEdldCB0aGUgb3RoZXIgYmxvY2suCisgICAgICAgIEJhc2ljQmxvY2sgKk90aGVyQkIgPSBCSS0+Z2V0U3VjY2Vzc29yKEJJLT5nZXRTdWNjZXNzb3IoMCkgPT0gQkIpOworICAgICAgICBQSSA9IHByZWRfYmVnaW4oT3RoZXJCQik7CisgICAgICAgICsrUEk7CisgICAgICAgIAorICAgICAgICBpZiAoUEkgPT0gcHJlZF9lbmQoT3RoZXJCQikpIHsKKyAgICAgICAgICAvLyBXZSBoYXZlIGEgY29uZGl0aW9uYWwgYnJhbmNoIHRvIHR3byBibG9ja3MgdGhhdCBhcmUgb25seSByZWFjaGFibGUKKyAgICAgICAgICAvLyBmcm9tIHRoZSBjb25kYnIuICBXZSBrbm93IHRoYXQgdGhlIGNvbmRiciBkb21pbmF0ZXMgdGhlIHR3byBibG9ja3MsCisgICAgICAgICAgLy8gc28gc2VlIGlmIHRoZXJlIGlzIGFueSBpZGVudGljYWwgY29kZSBpbiB0aGUgInRoZW4iIGFuZCAiZWxzZSIKKyAgICAgICAgICAvLyBibG9ja3MuICBJZiBzbywgd2UgY2FuIGhvaXN0IGl0IHVwIHRvIHRoZSBicmFuY2hpbmcgYmxvY2suCisgICAgICAgICAgQ2hhbmdlZCB8PSBIb2lzdFRoZW5FbHNlQ29kZVRvSWYoQkkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEJhc2ljQmxvY2sqIE9ubHlTdWNjID0gTlVMTDsKKyAgICAgICAgICBmb3IgKHN1Y2NfaXRlcmF0b3IgU0kgPSBzdWNjX2JlZ2luKEJCKSwgU0UgPSBzdWNjX2VuZChCQik7CisgICAgICAgICAgICAgICBTSSAhPSBTRTsgKytTSSkgeworICAgICAgICAgICAgaWYgKCFPbmx5U3VjYykKKyAgICAgICAgICAgICAgT25seVN1Y2MgPSAqU0k7CisgICAgICAgICAgICBlbHNlIGlmICgqU0kgIT0gT25seVN1Y2MpIHsKKyAgICAgICAgICAgICAgT25seVN1Y2MgPSAwOyAgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIGRpc3RpbmN0IHN1Y2Nlc3NvcnMhCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChPbmx5U3VjYyA9PSBPdGhlckJCKSB7CisgICAgICAgICAgICAvLyBJZiBCQidzIG9ubHkgc3VjY2Vzc29yIGlzIHRoZSBvdGhlciBzdWNjZXNzb3Igb2YgdGhlIHByZWRlY2Vzc29yLAorICAgICAgICAgICAgLy8gaS5lLiBhIHRyaWFuZ2xlLCBzZWUgaWYgd2UgY2FuIGhvaXN0IGFueSBjb2RlIGZyb20gdGhpcyBibG9jayB1cAorICAgICAgICAgICAgLy8gdG8gdGhlICJpZiIgYmxvY2suCisgICAgICAgICAgICBDaGFuZ2VkIHw9IFNwZWN1bGF0aXZlbHlFeGVjdXRlQkIoQkksIEJCKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICBmb3IgKHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEJCKSwgRSA9IHByZWRfZW5kKEJCKTsgUEkgIT0gRTsgKytQSSkKKyAgICBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PigoKlBJKS0+Z2V0VGVybWluYXRvcigpKSkKKyAgICAgIC8vIENoYW5nZSBiciAoWCA9PSAwIHwgWCA9PSAxKSwgVCwgRiBpbnRvIGEgc3dpdGNoIGluc3RydWN0aW9uLgorICAgICAgaWYgKEJJLT5pc0NvbmRpdGlvbmFsKCkgJiYgaXNhPEluc3RydWN0aW9uPihCSS0+Z2V0Q29uZGl0aW9uKCkpKSB7CisgICAgICAgIEluc3RydWN0aW9uICpDb25kID0gY2FzdDxJbnN0cnVjdGlvbj4oQkktPmdldENvbmRpdGlvbigpKTsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGJ1bmNoIG9mIHNldGVxJ3Mgb3InZCB0b2dldGhlciwgb3IgaWYgaXQncyBhIGJ1bmNoIG9mCisgICAgICAgIC8vICdzZXRuZSdzIGFuZCdlZCB0b2dldGhlciwgY29sbGVjdCB0aGVtLgorICAgICAgICBWYWx1ZSAqQ29tcFZhbCA9IDA7CisgICAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50SW50Kj4gVmFsdWVzOworICAgICAgICBib29sIFRydWVXaGVuRXF1YWwgPSBHYXRoZXJWYWx1ZUNvbXBhcmlzb25zKENvbmQsIENvbXBWYWwsIFZhbHVlcyk7CisgICAgICAgIGlmIChDb21wVmFsKSB7CisgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgZHVwbGljYXRlIGNvbnN0YW50cyBpbiB0aGUgbGlzdCwgd2hpY2ggdGhlIHN3aXRjaAorICAgICAgICAgIC8vIGluc3RydWN0aW9uIGNhbid0IGhhbmRsZSwgcmVtb3ZlIHRoZW0gbm93LgorICAgICAgICAgIHN0ZDo6c29ydChWYWx1ZXMuYmVnaW4oKSwgVmFsdWVzLmVuZCgpLCBDb25zdGFudEludE9yZGVyaW5nKCkpOworICAgICAgICAgIFZhbHVlcy5lcmFzZShzdGQ6OnVuaXF1ZShWYWx1ZXMuYmVnaW4oKSwgVmFsdWVzLmVuZCgpKSwgVmFsdWVzLmVuZCgpKTsKKworICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggYmxvY2sgaXMgd2hpY2ggZGVzdGluYXRpb24uCisgICAgICAgICAgQmFzaWNCbG9jayAqRGVmYXVsdEJCID0gQkktPmdldFN1Y2Nlc3NvcigxKTsKKyAgICAgICAgICBCYXNpY0Jsb2NrICpFZGdlQkIgICAgPSBCSS0+Z2V0U3VjY2Vzc29yKDApOworICAgICAgICAgIGlmICghVHJ1ZVdoZW5FcXVhbCkgc3RkOjpzd2FwKERlZmF1bHRCQiwgRWRnZUJCKTsKKworICAgICAgICAgIC8vIENvbnZlcnQgcG9pbnRlciB0byBpbnQgYmVmb3JlIHdlIHN3aXRjaC4KKyAgICAgICAgICBpZiAoQ29tcFZhbC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSB7CisgICAgICAgICAgICBhc3NlcnQoVEQgJiYgIkNhbm5vdCBzd2l0Y2ggb24gcG9pbnRlciB3aXRob3V0IFRhcmdldERhdGEiKTsKKyAgICAgICAgICAgIENvbXBWYWwgPSBuZXcgUHRyVG9JbnRJbnN0KENvbXBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURC0+Z2V0SW50UHRyVHlwZShDb21wVmFsLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkkpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IHN3aXRjaCBpbnN0cnVjdGlvbiBub3cuCisgICAgICAgICAgU3dpdGNoSW5zdCAqTmV3ID0gU3dpdGNoSW5zdDo6Q3JlYXRlKENvbXBWYWwsIERlZmF1bHRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzLnNpemUoKSwgQkkpOworCisgICAgICAgICAgLy8gQWRkIGFsbCBvZiB0aGUgJ2Nhc2VzJyB0byB0aGUgc3dpdGNoIGluc3RydWN0aW9uLgorICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICAgIE5ldy0+YWRkQ2FzZShWYWx1ZXNbaV0sIEVkZ2VCQik7CisKKyAgICAgICAgICAvLyBXZSBhZGRlZCBlZGdlcyBmcm9tIFBJIHRvIHRoZSBFZGdlQkIuICBBcyBzdWNoLCBpZiB0aGVyZSB3ZXJlIGFueQorICAgICAgICAgIC8vIFBISSBub2RlcyBpbiBFZGdlQkIsIHRoZXkgbmVlZCBlbnRyaWVzIHRvIGJlIGFkZGVkIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGVkZ2VzIGFkZGVkLgorICAgICAgICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgQkJJID0gRWRnZUJCLT5iZWdpbigpOworICAgICAgICAgICAgICAgaXNhPFBISU5vZGU+KEJCSSk7ICsrQkJJKSB7CisgICAgICAgICAgICBQSElOb2RlICpQTiA9IGNhc3Q8UEhJTm9kZT4oQkJJKTsKKyAgICAgICAgICAgIFZhbHVlICpJblZhbCA9IFBOLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soKlBJKTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYWx1ZXMuc2l6ZSgpLTE7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgICBQTi0+YWRkSW5jb21pbmcoSW5WYWwsICpQSSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gRXJhc2UgdGhlIG9sZCBicmFuY2ggaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgRXJhc2VUZXJtaW5hdG9ySW5zdEFuZERDRUNvbmQoQkkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKy8vLyBTaW1wbGlmeUNGRyAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkbyBzaW1wbGlmaWNhdGlvbiBvZiBhIENGRy4gIEZvcgorLy8vIGV4YW1wbGUsIGl0IGFkanVzdHMgYnJhbmNoZXMgdG8gYnJhbmNoZXMgdG8gZWxpbWluYXRlIHRoZSBleHRyYSBob3AsIGl0CisvLy8gZWxpbWluYXRlcyB1bnJlYWNoYWJsZSBiYXNpYyBibG9ja3MsIGFuZCBkb2VzIG90aGVyICJwZWVwaG9sZSIgb3B0aW1pemF0aW9uCisvLy8gb2YgdGhlIENGRy4gIEl0IHJldHVybnMgdHJ1ZSBpZiBhIG1vZGlmaWNhdGlvbiB3YXMgbWFkZS4KKy8vLworLy8vIFdBUk5JTkc6ICBUaGUgZW50cnkgbm9kZSBvZiBhIGZ1bmN0aW9uIG1heSBub3QgYmUgc2ltcGxpZmllZC4KKy8vLworYm9vbCBsbHZtOjpTaW1wbGlmeUNGRyhCYXNpY0Jsb2NrICpCQiwgY29uc3QgVGFyZ2V0RGF0YSAqVEQpIHsKKyAgcmV0dXJuIFNpbXBsaWZ5Q0ZHT3B0KFREKS5ydW4oQkIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvVW5pZnlGdW5jdGlvbkV4aXROb2Rlcy5jcHAgYi9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9VbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTY5MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvVW5pZnlGdW5jdGlvbkV4aXROb2Rlcy5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8vPT09LSBVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmNwcCAtIE1ha2UgYWxsIGZ1bmN0aW9ucyBoYXZlIGEgc2luZ2xlIGV4aXQgLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgZnVuY3Rpb25zIGhhdmUgYXQgbW9zdCBvbmUgcmV0dXJuCisvLyBpbnN0cnVjdGlvbiBpbiB0aGVtLiAgQWRkaXRpb25hbGx5LCBpdCBrZWVwcyB0cmFjayBvZiB3aGljaCBub2RlIGlzIHRoZSBuZXcKKy8vIGV4aXQgbm9kZSBvZiB0aGUgQ0ZHLiAgSWYgdGhlcmUgYXJlIG5vIGV4aXQgbm9kZXMgaW4gdGhlIENGRywgdGhlIGdldEV4aXROb2RlCisvLyBtZXRob2Qgd2lsbCByZXR1cm4gYSBudWxsIHBvaW50ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9VbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIgorI2luY2x1ZGUgImxsdm0vQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK2NoYXIgVW5pZnlGdW5jdGlvbkV4aXROb2Rlczo6SUQgPSAwOworSU5JVElBTElaRV9QQVNTKFVuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMsICJtZXJnZXJldHVybiIsCisgICAgICAgICAgICAgICAgIlVuaWZ5IGZ1bmN0aW9uIGV4aXQgbm9kZXMiLCBmYWxzZSwgZmFsc2UpOworCitQYXNzICpsbHZtOjpjcmVhdGVVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzUGFzcygpIHsKKyAgcmV0dXJuIG5ldyBVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzKCk7Cit9CisKK3ZvaWQgVW5pZnlGdW5jdGlvbkV4aXROb2Rlczo6Z2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3R7CisgIC8vIFdlIHByZXNlcnZlIHRoZSBub24tY3JpdGljYWwtZWRnZW5lc3MgcHJvcGVydHkKKyAgQVUuYWRkUHJlc2VydmVkSUQoQnJlYWtDcml0aWNhbEVkZ2VzSUQpOworICAvLyBUaGlzIGlzIGEgY2x1c3RlciBvZiBvcnRob2dvbmFsIFRyYW5zZm9ybXMKKyAgQVUuYWRkUHJlc2VydmVkKCJtZW0ycmVnIik7CisgIEFVLmFkZFByZXNlcnZlZElEKExvd2VyU3dpdGNoSUQpOworfQorCisvLyBVbmlmeUFsbEV4aXROb2RlcyAtIFVuaWZ5IGFsbCBleGl0IG5vZGVzIG9mIHRoZSBDRkcgYnkgY3JlYXRpbmcgYSBuZXcKKy8vIEJhc2ljQmxvY2ssIGFuZCBjb252ZXJ0aW5nIGFsbCByZXR1cm5zIHRvIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgdG8gdGhpcworLy8gbmV3IGJhc2ljIGJsb2NrLiAgVGhlIHNpbmd1bGFyIGV4aXQgbm9kZSBpcyByZXR1cm5lZC4KKy8vCisvLyBJZiB0aGVyZSBhcmUgbm8gcmV0dXJuIHN0bXRzIGluIHRoZSBGdW5jdGlvbiwgYSBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisvLworYm9vbCBVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIGJsb2NrcyBpbiBhIGZ1bmN0aW9uLCB0cmFja2luZyBhbGwgb2YgdGhlIGJsb2NrcyB0aGF0CisgIC8vIHJldHVybi4KKyAgLy8KKyAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+IFJldHVybmluZ0Jsb2NrczsKKyAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+IFVucmVhY2hhYmxlQmxvY2tzOworICBmb3IoRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoaXNhPFJldHVybkluc3Q+KEktPmdldFRlcm1pbmF0b3IoKSkpCisgICAgICBSZXR1cm5pbmdCbG9ja3MucHVzaF9iYWNrKEkpOworICAgIGVsc2UgaWYgKGlzYTxVbnJlYWNoYWJsZUluc3Q+KEktPmdldFRlcm1pbmF0b3IoKSkpCisgICAgICBVbnJlYWNoYWJsZUJsb2Nrcy5wdXNoX2JhY2soSSk7CisKKyAgLy8gVGhlbiB1bnJlYWNoYWJsZSBibG9ja3MuCisgIGlmIChVbnJlYWNoYWJsZUJsb2Nrcy5lbXB0eSgpKSB7CisgICAgVW5yZWFjaGFibGVCbG9jayA9IDA7CisgIH0gZWxzZSBpZiAoVW5yZWFjaGFibGVCbG9ja3Muc2l6ZSgpID09IDEpIHsKKyAgICBVbnJlYWNoYWJsZUJsb2NrID0gVW5yZWFjaGFibGVCbG9ja3MuZnJvbnQoKTsKKyAgfSBlbHNlIHsKKyAgICBVbnJlYWNoYWJsZUJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKEYuZ2V0Q29udGV4dCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZGKTsKKyAgICBuZXcgVW5yZWFjaGFibGVJbnN0KEYuZ2V0Q29udGV4dCgpLCBVbnJlYWNoYWJsZUJsb2NrKTsKKworICAgIGZvciAoc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+OjppdGVyYXRvciBJID0gVW5yZWFjaGFibGVCbG9ja3MuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IFVucmVhY2hhYmxlQmxvY2tzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgQmFzaWNCbG9jayAqQkIgPSAqSTsKKyAgICAgIEJCLT5nZXRJbnN0TGlzdCgpLnBvcF9iYWNrKCk7ICAvLyBSZW1vdmUgdGhlIHVucmVhY2hhYmxlIGluc3QuCisgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoVW5yZWFjaGFibGVCbG9jaywgQkIpOworICAgIH0KKyAgfQorCisgIC8vIE5vdyBoYW5kbGUgcmV0dXJuIGJsb2Nrcy4KKyAgaWYgKFJldHVybmluZ0Jsb2Nrcy5lbXB0eSgpKSB7CisgICAgUmV0dXJuQmxvY2sgPSAwOworICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGJsb2NrcyByZXR1cm4KKyAgfSBlbHNlIGlmIChSZXR1cm5pbmdCbG9ja3Muc2l6ZSgpID09IDEpIHsKKyAgICBSZXR1cm5CbG9jayA9IFJldHVybmluZ0Jsb2Nrcy5mcm9udCgpOyAvLyBBbHJlYWR5IGhhcyBhIHNpbmdsZSByZXR1cm4gYmxvY2sKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gaW5zZXJ0IGEgbmV3IGJhc2ljIGJsb2NrIGludG8gdGhlIGZ1bmN0aW9uLCBhZGQgYSBQSEkKKyAgLy8gbm9kZXMgKGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHZhbHVlcyksIGFuZCBjb252ZXJ0IGFsbCBvZiB0aGUgcmV0dXJuCisgIC8vIGluc3RydWN0aW9ucyBpbnRvIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMuCisgIC8vCisgIEJhc2ljQmxvY2sgKk5ld1JldEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKEYuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRik7CisKKyAgUEhJTm9kZSAqUE4gPSAwOworICBpZiAoRi5nZXRSZXR1cm5UeXBlKCktPmlzVm9pZFR5KCkpIHsKKyAgICBSZXR1cm5JbnN0OjpDcmVhdGUoRi5nZXRDb250ZXh0KCksIE5VTEwsIE5ld1JldEJsb2NrKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBJZiB0aGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gdm9pZC4uLiBhZGQgYSBQSEkgbm9kZSB0byB0aGUgYmxvY2suLi4KKyAgICBQTiA9IFBISU5vZGU6OkNyZWF0ZShGLmdldFJldHVyblR5cGUoKSk7CisgICAgTmV3UmV0QmxvY2stPmdldEluc3RMaXN0KCkucHVzaF9iYWNrKFBOKTsKKyAgICBSZXR1cm5JbnN0OjpDcmVhdGUoRi5nZXRDb250ZXh0KCksIFBOLCBOZXdSZXRCbG9jayk7CisgIH0KKworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBibG9ja3MsIHJlcGxhY2luZyB0aGUgcmV0dXJuIGluc3RydWN0aW9uIHdpdGggYW4KKyAgLy8gdW5jb25kaXRpb25hbCBicmFuY2guCisgIC8vCisgIGZvciAoc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+OjppdGVyYXRvciBJID0gUmV0dXJuaW5nQmxvY2tzLmJlZ2luKCksCisgICAgICAgICBFID0gUmV0dXJuaW5nQmxvY2tzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEJhc2ljQmxvY2sgKkJCID0gKkk7CisKKyAgICAvLyBBZGQgYW4gaW5jb21pbmcgZWxlbWVudCB0byB0aGUgUEhJIG5vZGUgZm9yIGV2ZXJ5IHJldHVybiBpbnN0cnVjdGlvbiB0aGF0CisgICAgLy8gaXMgbWVyZ2luZyBpbnRvIHRoaXMgbmV3IGJsb2NrLi4uCisgICAgaWYgKFBOKQorICAgICAgUE4tPmFkZEluY29taW5nKEJCLT5nZXRUZXJtaW5hdG9yKCktPmdldE9wZXJhbmQoMCksIEJCKTsKKworICAgIEJCLT5nZXRJbnN0TGlzdCgpLnBvcF9iYWNrKCk7ICAvLyBSZW1vdmUgdGhlIHJldHVybiBpbnNuCisgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKE5ld1JldEJsb2NrLCBCQik7CisgIH0KKyAgUmV0dXJuQmxvY2sgPSBOZXdSZXRCbG9jazsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVHJhbnNmb3Jtcy9VdGlscy9WYWx1ZU1hcHBlci5oIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvVmFsdWVNYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGZmNjQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1RyYW5zZm9ybXMvVXRpbHMvVmFsdWVNYXBwZXIuaApAQCAtMCwwICsxLDI5IEBACisvLz09PS0gVmFsdWVNYXBwZXIuaCAtIEludGVyZmFjZSBzaGFyZWQgYnkgbGliL1RyYW5zZm9ybXMvVXRpbHMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYXBWYWx1ZSBpbnRlcmZhY2Ugd2hpY2ggaXMgdXNlZCBieSB2YXJpb3VzIHBhcnRzIG9mCisvLyB0aGUgVHJhbnNmb3Jtcy9VdGlscyBsaWJyYXJ5IHRvIGltcGxlbWVudCBjbG9uaW5nIGFuZCBsaW5raW5nIGZhY2lsaXRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBWQUxVRU1BUFBFUl9ICisjZGVmaW5lIFZBTFVFTUFQUEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1ZhbHVlTWFwLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgVmFsdWU7CisgIGNsYXNzIEluc3RydWN0aW9uOworICB0eXBlZGVmIFZhbHVlTWFwPGNvbnN0IFZhbHVlICosIFZhbHVlICo+IFZhbHVlVG9WYWx1ZU1hcFR5OworCisgIFZhbHVlICpNYXBWYWx1ZShjb25zdCBWYWx1ZSAqViwgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNKTsKKyAgdm9pZCBSZW1hcEluc3RydWN0aW9uKEluc3RydWN0aW9uICpJLCBWYWx1ZVRvVmFsdWVNYXBUeSAmVk0pOworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0FzbVdyaXRlci5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0FzbVdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2Yjg0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvQXNtV3JpdGVyLmNwcApAQCAtMCwwICsxLDIxMjYgQEAKKy8vPT09LS0gQXNtV3JpdGVyLmNwcCAtIFByaW50aW5nIExMVk0gYXMgYW4gYXNzZW1ibHkgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBsaWJyYXJ5IGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uYWxpdHkgZGVmaW5lZCBpbiBsbHZtL0Fzc2VtYmx5L1dyaXRlci5oCisvLworLy8gTm90ZSB0aGF0IHRoZXNlIHJvdXRpbmVzIG11c3QgYmUgZXh0cmVtZWx5IHRvbGVyYW50IG9mIHZhcmlvdXMgZXJyb3JzIGluIHRoZQorLy8gTExWTSBjb2RlLCBiZWNhdXNlIGl0IGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgdHJhbnNmb3JtYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1dyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvUHJpbnRNb2R1bGVQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Bc21Bbm5vdGF0aW9uV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL09wZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1ZhbHVlU3ltYm9sVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGVTeW1ib2xUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPG1hcD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBNYWtlIHZpcnR1YWwgdGFibGUgYXBwZWFyIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4KK0Fzc2VtYmx5QW5ub3RhdGlvbldyaXRlcjo6fkFzc2VtYmx5QW5ub3RhdGlvbldyaXRlcigpIHt9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBIZWxwZXIgRnVuY3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitzdGF0aWMgY29uc3QgTW9kdWxlICpnZXRNb2R1bGVGcm9tVmFsKGNvbnN0IFZhbHVlICpWKSB7CisgIGlmIChjb25zdCBBcmd1bWVudCAqTUEgPSBkeW5fY2FzdDxBcmd1bWVudD4oVikpCisgICAgcmV0dXJuIE1BLT5nZXRQYXJlbnQoKSA/IE1BLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkgOiAwOworCisgIGlmIChjb25zdCBCYXNpY0Jsb2NrICpCQiA9IGR5bl9jYXN0PEJhc2ljQmxvY2s+KFYpKQorICAgIHJldHVybiBCQi0+Z2V0UGFyZW50KCkgPyBCQi0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpIDogMDsKKworICBpZiAoY29uc3QgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpIHsKKyAgICBjb25zdCBGdW5jdGlvbiAqTSA9IEktPmdldFBhcmVudCgpID8gSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpIDogMDsKKyAgICByZXR1cm4gTSA/IE0tPmdldFBhcmVudCgpIDogMDsKKyAgfQorICAKKyAgaWYgKGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhbHVlPihWKSkKKyAgICByZXR1cm4gR1YtPmdldFBhcmVudCgpOworICByZXR1cm4gMDsKK30KKworLy8gUHJpbnRFc2NhcGVkU3RyaW5nIC0gUHJpbnQgZWFjaCBjaGFyYWN0ZXIgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcsIGVzY2FwaW5nCisvLyBpdCBpZiBpdCBpcyBub3QgcHJpbnRhYmxlIG9yIGlmIGl0IGlzIGFuIGVzY2FwZSBjaGFyLgorc3RhdGljIHZvaWQgUHJpbnRFc2NhcGVkU3RyaW5nKFN0cmluZ1JlZiBOYW1lLCByYXdfb3N0cmVhbSAmT3V0KSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOYW1lLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBjaGFyIEMgPSBOYW1lW2ldOworICAgIGlmIChpc3ByaW50KEMpICYmIEMgIT0gJ1xcJyAmJiBDICE9ICciJykKKyAgICAgIE91dCA8PCBDOworICAgIGVsc2UKKyAgICAgIE91dCA8PCAnXFwnIDw8IGhleGRpZ2l0KEMgPj4gNCkgPDwgaGV4ZGlnaXQoQyAmIDB4MEYpOworICB9Cit9CisKK2VudW0gUHJlZml4VHlwZSB7CisgIEdsb2JhbFByZWZpeCwKKyAgTGFiZWxQcmVmaXgsCisgIExvY2FsUHJlZml4LAorICBOb1ByZWZpeAorfTsKKworLy8vIFByaW50TExWTU5hbWUgLSBUdXJuIHRoZSBzcGVjaWZpZWQgbmFtZSBpbnRvIGFuICdMTFZNIG5hbWUnLCB3aGljaCBpcyBlaXRoZXIKKy8vLyBwcmVmaXhlZCB3aXRoICUgKGlmIHRoZSBzdHJpbmcgb25seSBjb250YWlucyBzaW1wbGUgY2hhcmFjdGVycykgb3IgaXMKKy8vLyBzdXJyb3VuZGVkIHdpdGggIiIncyAoaWYgaXQgaGFzIHNwZWNpYWwgY2hhcnMgaW4gaXQpLiAgUHJpbnQgaXQgb3V0Lgorc3RhdGljIHZvaWQgUHJpbnRMTFZNTmFtZShyYXdfb3N0cmVhbSAmT1MsIFN0cmluZ1JlZiBOYW1lLCBQcmVmaXhUeXBlIFByZWZpeCkgeworICBhc3NlcnQoTmFtZS5kYXRhKCkgJiYgIkNhbm5vdCBnZXQgZW1wdHkgbmFtZSEiKTsKKyAgc3dpdGNoIChQcmVmaXgpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiQmFkIHByZWZpeCEiKTsKKyAgY2FzZSBOb1ByZWZpeDogYnJlYWs7CisgIGNhc2UgR2xvYmFsUHJlZml4OiBPUyA8PCAnQCc7IGJyZWFrOworICBjYXNlIExhYmVsUHJlZml4OiAgYnJlYWs7CisgIGNhc2UgTG9jYWxQcmVmaXg6ICBPUyA8PCAnJSc7IGJyZWFrOworICB9CisKKyAgLy8gU2NhbiB0aGUgbmFtZSB0byBzZWUgaWYgaXQgbmVlZHMgcXVvdGVzIGZpcnN0LgorICBib29sIE5lZWRzUXVvdGVzID0gaXNkaWdpdChOYW1lWzBdKTsKKyAgaWYgKCFOZWVkc1F1b3RlcykgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOYW1lLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNoYXIgQyA9IE5hbWVbaV07CisgICAgICBpZiAoIWlzYWxudW0oQykgJiYgQyAhPSAnLScgJiYgQyAhPSAnLicgJiYgQyAhPSAnXycpIHsKKyAgICAgICAgTmVlZHNRdW90ZXMgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBJZiB3ZSBkaWRuJ3QgbmVlZCBhbnkgcXVvdGVzLCBqdXN0IHdyaXRlIG91dCB0aGUgbmFtZSBpbiBvbmUgYmxhc3QuCisgIGlmICghTmVlZHNRdW90ZXMpIHsKKyAgICBPUyA8PCBOYW1lOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE9rYXksIHdlIG5lZWQgcXVvdGVzLiAgT3V0cHV0IHRoZSBxdW90ZXMgYW5kIGVzY2FwZSBhbnkgc2NhcnkgY2hhcmFjdGVycyBhcworICAvLyBuZWVkZWQuCisgIE9TIDw8ICciJzsKKyAgUHJpbnRFc2NhcGVkU3RyaW5nKE5hbWUsIE9TKTsKKyAgT1MgPDwgJyInOworfQorCisvLy8gUHJpbnRMTFZNTmFtZSAtIFR1cm4gdGhlIHNwZWNpZmllZCBuYW1lIGludG8gYW4gJ0xMVk0gbmFtZScsIHdoaWNoIGlzIGVpdGhlcgorLy8vIHByZWZpeGVkIHdpdGggJSAoaWYgdGhlIHN0cmluZyBvbmx5IGNvbnRhaW5zIHNpbXBsZSBjaGFyYWN0ZXJzKSBvciBpcworLy8vIHN1cnJvdW5kZWQgd2l0aCAiIidzIChpZiBpdCBoYXMgc3BlY2lhbCBjaGFycyBpbiBpdCkuICBQcmludCBpdCBvdXQuCitzdGF0aWMgdm9pZCBQcmludExMVk1OYW1lKHJhd19vc3RyZWFtICZPUywgY29uc3QgVmFsdWUgKlYpIHsKKyAgUHJpbnRMTFZNTmFtZShPUywgVi0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGlzYTxHbG9iYWxWYWx1ZT4oVikgPyBHbG9iYWxQcmVmaXggOiBMb2NhbFByZWZpeCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUeXBlUHJpbnRpbmcgQ2xhc3M6IFR5cGUgcHJpbnRpbmcgbWFjaGluZXJ5CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitzdGF0aWMgRGVuc2VNYXA8Y29uc3QgVHlwZSAqLCBzdGQ6OnN0cmluZz4gJmdldFR5cGVOYW1lc01hcCh2b2lkICpNKSB7CisgIHJldHVybiAqc3RhdGljX2Nhc3Q8RGVuc2VNYXA8Y29uc3QgVHlwZSAqLCBzdGQ6OnN0cmluZz4qPihNKTsKK30KKwordm9pZCBUeXBlUHJpbnRpbmc6OmNsZWFyKCkgeworICBnZXRUeXBlTmFtZXNNYXAoVHlwZU5hbWVzKS5jbGVhcigpOworfQorCitib29sIFR5cGVQcmludGluZzo6aGFzVHlwZU5hbWUoY29uc3QgVHlwZSAqVHkpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFR5cGVOYW1lc01hcChUeXBlTmFtZXMpLmNvdW50KFR5KTsKK30KKwordm9pZCBUeXBlUHJpbnRpbmc6OmFkZFR5cGVOYW1lKGNvbnN0IFR5cGUgKlR5LCBjb25zdCBzdGQ6OnN0cmluZyAmTikgeworICBnZXRUeXBlTmFtZXNNYXAoVHlwZU5hbWVzKS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoVHksIE4pKTsKK30KKworCitUeXBlUHJpbnRpbmc6OlR5cGVQcmludGluZygpIHsKKyAgVHlwZU5hbWVzID0gbmV3IERlbnNlTWFwPGNvbnN0IFR5cGUgKiwgc3RkOjpzdHJpbmc+KCk7Cit9CisKK1R5cGVQcmludGluZzo6flR5cGVQcmludGluZygpIHsKKyAgZGVsZXRlICZnZXRUeXBlTmFtZXNNYXAoVHlwZU5hbWVzKTsKK30KKworLy8vIENhbGNUeXBlTmFtZSAtIFdyaXRlIHRoZSBzcGVjaWZpZWQgdHlwZSB0byB0aGUgc3BlY2lmaWVkIHJhd19vc3RyZWFtLCBtYWtpbmcKKy8vLyB1c2Ugb2YgdHlwZSBuYW1lcyBvciB1cCByZWZlcmVuY2VzIHRvIHNob3J0ZW4gdGhlIHR5cGUgbmFtZSB3aGVyZSBwb3NzaWJsZS4KK3ZvaWQgVHlwZVByaW50aW5nOjpDYWxjVHlwZU5hbWUoY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBUeXBlICo+ICZUeXBlU3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUywgYm9vbCBJZ25vcmVUb3BMZXZlbE5hbWUpIHsKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB0eXBlIGlzIG5hbWVkLgorICBpZiAoIUlnbm9yZVRvcExldmVsTmFtZSkgeworICAgIERlbnNlTWFwPGNvbnN0IFR5cGUgKiwgc3RkOjpzdHJpbmc+ICZUTSA9IGdldFR5cGVOYW1lc01hcChUeXBlTmFtZXMpOworICAgIERlbnNlTWFwPGNvbnN0IFR5cGUgKiwgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBJID0gVE0uZmluZChUeSk7CisgICAgaWYgKEkgIT0gVE0uZW5kKCkpIHsKKyAgICAgIE9TIDw8IEktPnNlY29uZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIFR5cGUgaXMgYWxyZWFkeSBvbiB0aGUgc3RhY2suLi4KKyAgdW5zaWduZWQgU2xvdCA9IDAsIEN1clNpemUgPSBUeXBlU3RhY2suc2l6ZSgpOworICB3aGlsZSAoU2xvdCA8IEN1clNpemUgJiYgVHlwZVN0YWNrW1Nsb3RdICE9IFR5KSArK1Nsb3Q7IC8vIFNjYW4gZm9yIHR5cGUKKworICAvLyBUaGlzIGlzIGFub3RoZXIgYmFzZSBjYXNlIGZvciB0aGUgcmVjdXJzaW9uLiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93CisgIC8vIHRoYXQgd2UgaGF2ZSBsb29wZWQgYmFjayB0byBhIHR5cGUgdGhhdCB3ZSBoYXZlIHByZXZpb3VzbHkgdmlzaXRlZC4KKyAgLy8gR2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIHVwcmVmZXJlbmNlIHRvIGhhbmRsZSB0aGlzLgorICBpZiAoU2xvdCA8IEN1clNpemUpIHsKKyAgICBPUyA8PCAnXFwnIDw8IHVuc2lnbmVkKEN1clNpemUtU2xvdCk7ICAgICAvLyBIZXJlJ3MgdGhlIHVwcmVmZXJlbmNlCisgICAgcmV0dXJuOworICB9CisKKyAgVHlwZVN0YWNrLnB1c2hfYmFjayhUeSk7ICAgIC8vIFJlY3Vyc2l2ZSBjYXNlOiBBZGQgdXMgdG8gdGhlIHN0YWNrLi4KKworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICBjYXNlIFR5cGU6OlZvaWRUeUlEOiAgICAgIE9TIDw8ICJ2b2lkIjsgYnJlYWs7CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOiAgICAgT1MgPDwgImZsb2F0IjsgYnJlYWs7CisgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDogICAgT1MgPDwgImRvdWJsZSI7IGJyZWFrOworICBjYXNlIFR5cGU6Olg4Nl9GUDgwVHlJRDogIE9TIDw8ICJ4ODZfZnA4MCI7IGJyZWFrOworICBjYXNlIFR5cGU6OkZQMTI4VHlJRDogICAgIE9TIDw8ICJmcDEyOCI7IGJyZWFrOworICBjYXNlIFR5cGU6OlBQQ19GUDEyOFR5SUQ6IE9TIDw8ICJwcGNfZnAxMjgiOyBicmVhazsKKyAgY2FzZSBUeXBlOjpMYWJlbFR5SUQ6ICAgICBPUyA8PCAibGFiZWwiOyBicmVhazsKKyAgY2FzZSBUeXBlOjpNZXRhZGF0YVR5SUQ6ICBPUyA8PCAibWV0YWRhdGEiOyBicmVhazsKKyAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgICBPUyA8PCAnaScgPDwgY2FzdDxJbnRlZ2VyVHlwZT4oVHkpLT5nZXRCaXRXaWR0aCgpOworICAgIGJyZWFrOworCisgIGNhc2UgVHlwZTo6RnVuY3Rpb25UeUlEOiB7CisgICAgY29uc3QgRnVuY3Rpb25UeXBlICpGVHkgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oVHkpOworICAgIENhbGNUeXBlTmFtZShGVHktPmdldFJldHVyblR5cGUoKSwgVHlwZVN0YWNrLCBPUyk7CisgICAgT1MgPDwgIiAoIjsKKyAgICBmb3IgKEZ1bmN0aW9uVHlwZTo6cGFyYW1faXRlcmF0b3IgSSA9IEZUeS0+cGFyYW1fYmVnaW4oKSwKKyAgICAgICAgIEUgPSBGVHktPnBhcmFtX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKEkgIT0gRlR5LT5wYXJhbV9iZWdpbigpKQorICAgICAgICBPUyA8PCAiLCAiOworICAgICAgQ2FsY1R5cGVOYW1lKCpJLCBUeXBlU3RhY2ssIE9TKTsKKyAgICB9CisgICAgaWYgKEZUeS0+aXNWYXJBcmcoKSkgeworICAgICAgaWYgKEZUeS0+Z2V0TnVtUGFyYW1zKCkpIE9TIDw8ICIsICI7CisgICAgICBPUyA8PCAiLi4uIjsKKyAgICB9CisgICAgT1MgPDwgJyknOworICAgIGJyZWFrOworICB9CisgIGNhc2UgVHlwZTo6U3RydWN0VHlJRDogeworICAgIGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGNhc3Q8U3RydWN0VHlwZT4oVHkpOworICAgIGlmIChTVHktPmlzUGFja2VkKCkpCisgICAgICBPUyA8PCAnPCc7CisgICAgT1MgPDwgJ3snOworICAgIGZvciAoU3RydWN0VHlwZTo6ZWxlbWVudF9pdGVyYXRvciBJID0gU1R5LT5lbGVtZW50X2JlZ2luKCksCisgICAgICAgICBFID0gU1R5LT5lbGVtZW50X2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgT1MgPDwgJyAnOworICAgICAgQ2FsY1R5cGVOYW1lKCpJLCBUeXBlU3RhY2ssIE9TKTsKKyAgICAgIGlmIChsbHZtOjpuZXh0KEkpID09IFNUeS0+ZWxlbWVudF9lbmQoKSkKKyAgICAgICAgT1MgPDwgJyAnOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAnLCc7CisgICAgfQorICAgIE9TIDw8ICd9JzsKKyAgICBpZiAoU1R5LT5pc1BhY2tlZCgpKQorICAgICAgT1MgPDwgJz4nOworICAgIGJyZWFrOworICB9CisgIGNhc2UgVHlwZTo6VW5pb25UeUlEOiB7CisgICAgY29uc3QgVW5pb25UeXBlICpVVHkgPSBjYXN0PFVuaW9uVHlwZT4oVHkpOworICAgIE9TIDw8ICJ1bmlvbiB7IjsKKyAgICBmb3IgKFN0cnVjdFR5cGU6OmVsZW1lbnRfaXRlcmF0b3IgSSA9IFVUeS0+ZWxlbWVudF9iZWdpbigpLAorICAgICAgICAgRSA9IFVUeS0+ZWxlbWVudF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIE9TIDw8ICcgJzsKKyAgICAgIENhbGNUeXBlTmFtZSgqSSwgVHlwZVN0YWNrLCBPUyk7CisgICAgICBpZiAobGx2bTo6bmV4dChJKSA9PSBVVHktPmVsZW1lbnRfZW5kKCkpCisgICAgICAgIE9TIDw8ICcgJzsKKyAgICAgIGVsc2UKKyAgICAgICAgT1MgPDwgJywnOworICAgIH0KKyAgICBPUyA8PCAnfSc7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDogeworICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihUeSk7CisgICAgQ2FsY1R5cGVOYW1lKFBUeS0+Z2V0RWxlbWVudFR5cGUoKSwgVHlwZVN0YWNrLCBPUyk7CisgICAgaWYgKHVuc2lnbmVkIEFkZHJlc3NTcGFjZSA9IFBUeS0+Z2V0QWRkcmVzc1NwYWNlKCkpCisgICAgICBPUyA8PCAiIGFkZHJzcGFjZSgiIDw8IEFkZHJlc3NTcGFjZSA8PCAnKSc7CisgICAgT1MgPDwgJyonOworICAgIGJyZWFrOworICB9CisgIGNhc2UgVHlwZTo6QXJyYXlUeUlEOiB7CisgICAgY29uc3QgQXJyYXlUeXBlICpBVHkgPSBjYXN0PEFycmF5VHlwZT4oVHkpOworICAgIE9TIDw8ICdbJyA8PCBBVHktPmdldE51bUVsZW1lbnRzKCkgPDwgIiB4ICI7CisgICAgQ2FsY1R5cGVOYW1lKEFUeS0+Z2V0RWxlbWVudFR5cGUoKSwgVHlwZVN0YWNrLCBPUyk7CisgICAgT1MgPDwgJ10nOworICAgIGJyZWFrOworICB9CisgIGNhc2UgVHlwZTo6VmVjdG9yVHlJRDogeworICAgIGNvbnN0IFZlY3RvclR5cGUgKlBUeSA9IGNhc3Q8VmVjdG9yVHlwZT4oVHkpOworICAgIE9TIDw8ICI8IiA8PCBQVHktPmdldE51bUVsZW1lbnRzKCkgPDwgIiB4ICI7CisgICAgQ2FsY1R5cGVOYW1lKFBUeS0+Z2V0RWxlbWVudFR5cGUoKSwgVHlwZVN0YWNrLCBPUyk7CisgICAgT1MgPDwgJz4nOworICAgIGJyZWFrOworICB9CisgIGNhc2UgVHlwZTo6T3BhcXVlVHlJRDoKKyAgICBPUyA8PCAib3BhcXVlIjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBPUyA8PCAiPHVucmVjb2duaXplZC10eXBlPiI7CisgICAgYnJlYWs7CisgIH0KKworICBUeXBlU3RhY2sucG9wX2JhY2soKTsgICAgICAgLy8gUmVtb3ZlIHNlbGYgZnJvbSBzdGFjay4KK30KKworLy8vIHByaW50VHlwZUludCAtIFRoZSBpbnRlcm5hbCBndXRzIG9mIHByaW50aW5nIG91dCBhIHR5cGUgdGhhdCBoYXMgYQorLy8vIHBvdGVudGlhbGx5IG5hbWVkIHBvcnRpb24uCisvLy8KK3ZvaWQgVHlwZVByaW50aW5nOjpwcmludChjb25zdCBUeXBlICpUeSwgcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSWdub3JlVG9wTGV2ZWxOYW1lKSB7CisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdHlwZSBpcyBuYW1lZC4KKyAgRGVuc2VNYXA8Y29uc3QgVHlwZSosIHN0ZDo6c3RyaW5nPiAmVE0gPSBnZXRUeXBlTmFtZXNNYXAoVHlwZU5hbWVzKTsKKyAgaWYgKCFJZ25vcmVUb3BMZXZlbE5hbWUpIHsKKyAgICBEZW5zZU1hcDxjb25zdCBUeXBlKiwgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBJID0gVE0uZmluZChUeSk7CisgICAgaWYgKEkgIT0gVE0uZW5kKCkpIHsKKyAgICAgIE9TIDw8IEktPnNlY29uZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBPdGhlcndpc2Ugd2UgaGF2ZSBhIHR5cGUgdGhhdCBoYXMgbm90IGJlZW4gbmFtZWQgYnV0IGlzIGEgZGVyaXZlZCB0eXBlLgorICAvLyBDYXJlZnVsbHkgcmVjdXJzZSB0aGUgdHlwZSBoaWVyYXJjaHkgdG8gcHJpbnQgb3V0IGFueSBjb250YWluZWQgc3ltYm9saWMKKyAgLy8gbmFtZXMuCisgIFNtYWxsVmVjdG9yPGNvbnN0IFR5cGUgKiwgMTY+IFR5cGVTdGFjazsKKyAgc3RkOjpzdHJpbmcgVHlwZU5hbWU7CisKKyAgcmF3X3N0cmluZ19vc3RyZWFtIFR5cGVPUyhUeXBlTmFtZSk7CisgIENhbGNUeXBlTmFtZShUeSwgVHlwZVN0YWNrLCBUeXBlT1MsIElnbm9yZVRvcExldmVsTmFtZSk7CisgIE9TIDw8IFR5cGVPUy5zdHIoKTsKKworICAvLyBDYWNoZSB0eXBlIG5hbWUgZm9yIGxhdGVyIHVzZS4KKyAgaWYgKCFJZ25vcmVUb3BMZXZlbE5hbWUpCisgICAgVE0uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFR5LCBUeXBlT1Muc3RyKCkpKTsKK30KKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgVHlwZUZpbmRlciB7CisgICAgLy8gVG8gYXZvaWQgd2Fsa2luZyBjb25zdGFudCBleHByZXNzaW9ucyBtdWx0aXBsZSB0aW1lcyBhbmQgb3RoZXIgSVIKKyAgICAvLyBvYmplY3RzLCB3ZSBrZWVwIHNldmVyYWwgaGVscGVyIG1hcHMuCisgICAgRGVuc2VTZXQ8Y29uc3QgVmFsdWUqPiBWaXNpdGVkQ29uc3RhbnRzOworICAgIERlbnNlU2V0PGNvbnN0IFR5cGUqPiBWaXNpdGVkVHlwZXM7CisKKyAgICBUeXBlUHJpbnRpbmcgJlRQOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiAmTnVtYmVyZWRUeXBlczsKKyAgcHVibGljOgorICAgIFR5cGVGaW5kZXIoVHlwZVByaW50aW5nICZ0cCwgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+ICZudW1iZXJlZFR5cGVzKQorICAgICAgOiBUUCh0cCksIE51bWJlcmVkVHlwZXMobnVtYmVyZWRUeXBlcykge30KKworICAgIHZvaWQgUnVuKGNvbnN0IE1vZHVsZSAmTSkgeworICAgICAgLy8gR2V0IHR5cGVzIGZyb20gdGhlIHR5cGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBnZXRzIG9wYXF1ZSB0eXBlcyByZWZlcmVuZWQKKyAgICAgIC8vIG9ubHkgdGhyb3VnaCBkZXJpdmVkIG5hbWVkIHR5cGVzLgorICAgICAgY29uc3QgVHlwZVN5bWJvbFRhYmxlICZTVCA9IE0uZ2V0VHlwZVN5bWJvbFRhYmxlKCk7CisgICAgICBmb3IgKFR5cGVTeW1ib2xUYWJsZTo6Y29uc3RfaXRlcmF0b3IgVEkgPSBTVC5iZWdpbigpLCBFID0gU1QuZW5kKCk7CisgICAgICAgICAgIFRJICE9IEU7ICsrVEkpCisgICAgICAgIEluY29ycG9yYXRlVHlwZShUSS0+c2Vjb25kKTsKKworICAgICAgLy8gR2V0IHR5cGVzIGZyb20gZ2xvYmFsIHZhcmlhYmxlcy4KKyAgICAgIGZvciAoTW9kdWxlOjpjb25zdF9nbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksCisgICAgICAgICAgIEUgPSBNLmdsb2JhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgSW5jb3Jwb3JhdGVUeXBlKEktPmdldFR5cGUoKSk7CisgICAgICAgIGlmIChJLT5oYXNJbml0aWFsaXplcigpKQorICAgICAgICAgIEluY29ycG9yYXRlVmFsdWUoSS0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgICAgICB9CisKKyAgICAgIC8vIEdldCB0eXBlcyBmcm9tIGFsaWFzZXMuCisgICAgICBmb3IgKE1vZHVsZTo6Y29uc3RfYWxpYXNfaXRlcmF0b3IgSSA9IE0uYWxpYXNfYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE0uYWxpYXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIEluY29ycG9yYXRlVHlwZShJLT5nZXRUeXBlKCkpOworICAgICAgICBJbmNvcnBvcmF0ZVZhbHVlKEktPmdldEFsaWFzZWUoKSk7CisgICAgICB9CisKKyAgICAgIC8vIEdldCB0eXBlcyBmcm9tIGZ1bmN0aW9ucy4KKyAgICAgIGZvciAoTW9kdWxlOjpjb25zdF9pdGVyYXRvciBGSSA9IE0uYmVnaW4oKSwgRSA9IE0uZW5kKCk7IEZJICE9IEU7ICsrRkkpIHsKKyAgICAgICAgSW5jb3Jwb3JhdGVUeXBlKEZJLT5nZXRUeXBlKCkpOworCisgICAgICAgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEJCID0gRkktPmJlZ2luKCksIEUgPSBGSS0+ZW5kKCk7CisgICAgICAgICAgICAgQkIgIT0gRTsrK0JCKQorICAgICAgICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSUkgPSBCQi0+YmVnaW4oKSwKKyAgICAgICAgICAgICAgIEUgPSBCQi0+ZW5kKCk7IElJICE9IEU7ICsrSUkpIHsKKyAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICZJID0gKklJOworICAgICAgICAgICAgLy8gSW5jb3Jwb3JhdGUgdGhlIHR5cGUgb2YgdGhlIGluc3RydWN0aW9uIGFuZCBhbGwgaXRzIG9wZXJhbmRzLgorICAgICAgICAgICAgSW5jb3Jwb3JhdGVUeXBlKEkuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIGZvciAoVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3IgT0kgPSBJLm9wX2JlZ2luKCksIE9FID0gSS5vcF9lbmQoKTsKKyAgICAgICAgICAgICAgICAgT0kgIT0gT0U7ICsrT0kpCisgICAgICAgICAgICAgIEluY29ycG9yYXRlVmFsdWUoKk9JKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBJbmNvcnBvcmF0ZVR5cGUoY29uc3QgVHlwZSAqVHkpIHsKKyAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBhbHJlYWR5IHZpc2l0ZWQgdGhpcyB0eXBlLgorICAgICAgaWYgKCFWaXNpdGVkVHlwZXMuaW5zZXJ0KFR5KS5zZWNvbmQpCisgICAgICAgIHJldHVybjsKKworICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0cnVjdHVyZSBvciBvcGFxdWUgdHlwZSwgYWRkIGEgbmFtZSBmb3IgdGhlIHR5cGUuCisgICAgICBpZiAoKChUeS0+aXNTdHJ1Y3RUeSgpICYmIGNhc3Q8U3RydWN0VHlwZT4oVHkpLT5nZXROdW1FbGVtZW50cygpKQorICAgICAgICAgICAgfHwgVHktPmlzT3BhcXVlVHkoKSkgJiYgIVRQLmhhc1R5cGVOYW1lKFR5KSkgeworICAgICAgICBUUC5hZGRUeXBlTmFtZShUeSwgIiUiK3V0b3N0cih1bnNpZ25lZChOdW1iZXJlZFR5cGVzLnNpemUoKSkpKTsKKyAgICAgICAgTnVtYmVyZWRUeXBlcy5wdXNoX2JhY2soVHkpOworICAgICAgfQorCisgICAgICAvLyBSZWN1cnNpdmVseSB3YWxrIGFsbCBjb250YWluZWQgdHlwZXMuCisgICAgICBmb3IgKFR5cGU6OnN1YnR5cGVfaXRlcmF0b3IgSSA9IFR5LT5zdWJ0eXBlX2JlZ2luKCksCisgICAgICAgICAgIEUgPSBUeS0+c3VidHlwZV9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgIEluY29ycG9yYXRlVHlwZSgqSSk7CisgICAgfQorCisgICAgLy8vIEluY29ycG9yYXRlVmFsdWUgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHdhbGsgb3BlcmFuZCBsaXN0cyBmaW5kaW5nCisgICAgLy8vIHR5cGVzIGhpZGluZyBpbiBjb25zdGFudCBleHByZXNzaW9ucyBhbmQgb3RoZXIgb3BlcmFuZHMgdGhhdCB3b24ndCBiZQorICAgIC8vLyB3YWxrZWQgaW4gb3RoZXIgd2F5cy4gIEdsb2JhbFZhbHVlcywgYmFzaWMgYmxvY2tzLCBpbnN0cnVjdGlvbnMsIGFuZAorICAgIC8vLyBpbnN0IG9wZXJhbmRzIGFyZSBhbGwgZXhwbGljaXRseSBlbnVtZXJhdGVkLgorICAgIHZvaWQgSW5jb3Jwb3JhdGVWYWx1ZShjb25zdCBWYWx1ZSAqVikgeworICAgICAgaWYgKFYgPT0gMCB8fCAhaXNhPENvbnN0YW50PihWKSB8fCBpc2E8R2xvYmFsVmFsdWU+KFYpKSByZXR1cm47CisKKyAgICAgIC8vIEFscmVhZHkgdmlzaXRlZD8KKyAgICAgIGlmICghVmlzaXRlZENvbnN0YW50cy5pbnNlcnQoVikuc2Vjb25kKQorICAgICAgICByZXR1cm47CisKKyAgICAgIC8vIENoZWNrIHRoaXMgdHlwZS4KKyAgICAgIEluY29ycG9yYXRlVHlwZShWLT5nZXRUeXBlKCkpOworCisgICAgICAvLyBMb29rIGluIG9wZXJhbmRzIGZvciB0eXBlcy4KKyAgICAgIGNvbnN0IENvbnN0YW50ICpDID0gY2FzdDxDb25zdGFudD4oVik7CisgICAgICBmb3IgKENvbnN0YW50Ojpjb25zdF9vcF9pdGVyYXRvciBJID0gQy0+b3BfYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IEMtPm9wX2VuZCgpOyBJICE9IEU7KytJKQorICAgICAgICBJbmNvcnBvcmF0ZVZhbHVlKCpJKTsKKyAgICB9CisgIH07Cit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKworLy8vIEFkZE1vZHVsZVR5cGVzVG9QcmludGVyIC0gQWRkIGFsbCBvZiB0aGUgc3ltYm9saWMgdHlwZSBuYW1lcyBmb3IgdHlwZXMgaW4KKy8vLyB0aGUgc3BlY2lmaWVkIG1vZHVsZSB0byB0aGUgVHlwZVByaW50ZXIgYW5kIGFsbCBudW1iZXJlZCB0eXBlcyB0byBpdCBhbmQgdGhlCisvLy8gTnVtYmVyZWRUeXBlcyB0YWJsZS4KK3N0YXRpYyB2b2lkIEFkZE1vZHVsZVR5cGVzVG9QcmludGVyKFR5cGVQcmludGluZyAmVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gJk51bWJlcmVkVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKk0pIHsKKyAgaWYgKE0gPT0gMCkgcmV0dXJuOworCisgIC8vIElmIHRoZSBtb2R1bGUgaGFzIGEgc3ltYm9sIHRhYmxlLCB0YWtlIGFsbCBnbG9iYWwgdHlwZXMgYW5kIHN0dWZmIHRoZWlyCisgIC8vIG5hbWVzIGludG8gdGhlIFR5cGVOYW1lcyBtYXAuCisgIGNvbnN0IFR5cGVTeW1ib2xUYWJsZSAmU1QgPSBNLT5nZXRUeXBlU3ltYm9sVGFibGUoKTsKKyAgZm9yIChUeXBlU3ltYm9sVGFibGU6OmNvbnN0X2l0ZXJhdG9yIFRJID0gU1QuYmVnaW4oKSwgRSA9IFNULmVuZCgpOworICAgICAgIFRJICE9IEU7ICsrVEkpIHsKKyAgICBjb25zdCBUeXBlICpUeSA9IGNhc3Q8VHlwZT4oVEktPnNlY29uZCk7CisKKyAgICAvLyBBcyBhIGhldXJpc3RpYywgZG9uJ3QgaW5zZXJ0IHBvaW50ZXIgdG8gcHJpbWl0aXZlIHR5cGVzLCBiZWNhdXNlCisgICAgLy8gdGhleSBhcmUgdXNlZCB0b28gb2Z0ZW4gdG8gaGF2ZSBhIHNpbmdsZSB1c2VmdWwgbmFtZS4KKyAgICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlBUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihUeSkpIHsKKyAgICAgIGNvbnN0IFR5cGUgKlBFVHkgPSBQVHktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICBpZiAoKFBFVHktPmlzUHJpbWl0aXZlVHlwZSgpIHx8IFBFVHktPmlzSW50ZWdlclR5KCkpICYmCisgICAgICAgICAgIVBFVHktPmlzT3BhcXVlVHkoKSkKKyAgICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gTGlrZXdpc2UgZG9uJ3QgaW5zZXJ0IHByaW1pdGl2ZXMgZWl0aGVyLgorICAgIGlmIChUeS0+aXNJbnRlZ2VyVHkoKSB8fCBUeS0+aXNQcmltaXRpdmVUeXBlKCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEdldCB0aGUgbmFtZSBhcyBhIHN0cmluZyBhbmQgaW5zZXJ0IGl0IGludG8gVHlwZU5hbWVzLgorICAgIHN0ZDo6c3RyaW5nIE5hbWVTdHI7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIE5hbWVST1MoTmFtZVN0cik7CisgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIE5hbWVPUyhOYW1lUk9TKTsKKyAgICBQcmludExMVk1OYW1lKE5hbWVPUywgVEktPmZpcnN0LCBMb2NhbFByZWZpeCk7CisgICAgTmFtZU9TLmZsdXNoKCk7CisgICAgVFAuYWRkVHlwZU5hbWUoVHksIE5hbWVTdHIpOworICB9CisKKyAgLy8gV2FsayB0aGUgZW50aXJlIG1vZHVsZSB0byBmaW5kIHJlZmVyZW5jZXMgdG8gdW5uYW1lZCBzdHJ1Y3R1cmUgYW5kIG9wYXF1ZQorICAvLyB0eXBlcy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzIGJ5IG9wYXF1ZSB0eXBlcyAoYmVjYXVzZSBtdWx0aXBsZQorICAvLyB1c2VzIG9mIGFuIHVubmFtZWQgb3BhcXVlIHR5cGUgbmVlZHMgdG8gYmUgcmVmZXJyZWQgdG8gYnkgdGhlIHNhbWUgSUQpIGFuZAorICAvLyBpdCBzaHJpbmtzIGNvbXBsZXggcmVjdXJzaXZlIHN0cnVjdHVyZSB0eXBlcyBzdWJzdGFudGlhbGx5IGluIHNvbWUgY2FzZXMuCisgIFR5cGVGaW5kZXIoVFAsIE51bWJlcmVkVHlwZXMpLlJ1bigqTSk7Cit9CisKKworLy8vIFdyaXRlVHlwZVN5bWJvbGljIC0gVGhpcyBhdHRlbXB0cyB0byB3cml0ZSB0aGUgc3BlY2lmaWVkIHR5cGUgYXMgYSBzeW1ib2xpYworLy8vIHR5cGUsIGlmZiB0aGVyZSBpcyBhbiBlbnRyeSBpbiB0aGUgbW9kdWxlcyBzeW1ib2wgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQKKy8vLyB0eXBlIG9yIG9uZSBvZiBpdCdzIGNvbXBvbmVudCB0eXBlcy4KKy8vLwordm9pZCBsbHZtOjpXcml0ZVR5cGVTeW1ib2xpYyhyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFR5cGUgKlR5LCBjb25zdCBNb2R1bGUgKk0pIHsKKyAgVHlwZVByaW50aW5nIFByaW50ZXI7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBOdW1iZXJlZFR5cGVzOworICBBZGRNb2R1bGVUeXBlc1RvUHJpbnRlcihQcmludGVyLCBOdW1iZXJlZFR5cGVzLCBNKTsKKyAgUHJpbnRlci5wcmludChUeSwgT1MpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2xvdFRyYWNrZXIgQ2xhc3M6IEVudW1lcmF0ZSBzbG90IG51bWJlcnMgZm9yIHVubmFtZWQgdmFsdWVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgeworCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBjb21wdXRhdGlvbiBvZiBzbG90IG51bWJlcnMgZm9yIExMVk0gQXNzZW1ibHkgd3JpdGluZy4KKy8vLworY2xhc3MgU2xvdFRyYWNrZXIgeworcHVibGljOgorICAvLy8gVmFsdWVNYXAgLSBBIG1hcHBpbmcgb2YgVmFsdWVzIHRvIHNsb3QgbnVtYmVycy4KKyAgdHlwZWRlZiBEZW5zZU1hcDxjb25zdCBWYWx1ZSosIHVuc2lnbmVkPiBWYWx1ZU1hcDsKKworcHJpdmF0ZToKKyAgLy8vIFRoZU1vZHVsZSAtIFRoZSBtb2R1bGUgZm9yIHdoaWNoIHdlIGFyZSBob2xkaW5nIHNsb3QgbnVtYmVycy4KKyAgY29uc3QgTW9kdWxlKiBUaGVNb2R1bGU7CisKKyAgLy8vIFRoZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIGZvciB3aGljaCB3ZSBhcmUgaG9sZGluZyBzbG90IG51bWJlcnMuCisgIGNvbnN0IEZ1bmN0aW9uKiBUaGVGdW5jdGlvbjsKKyAgYm9vbCBGdW5jdGlvblByb2Nlc3NlZDsKKworICAvLy8gbU1hcCAtIFRoZSBUeXBlUGxhbmVzIG1hcCBmb3IgdGhlIG1vZHVsZSBsZXZlbCBkYXRhLgorICBWYWx1ZU1hcCBtTWFwOworICB1bnNpZ25lZCBtTmV4dDsKKworICAvLy8gZk1hcCAtIFRoZSBUeXBlUGxhbmVzIG1hcCBmb3IgdGhlIGZ1bmN0aW9uIGxldmVsIGRhdGEuCisgIFZhbHVlTWFwIGZNYXA7CisgIHVuc2lnbmVkIGZOZXh0OworCisgIC8vLyBtZG5NYXAgLSBNYXAgZm9yIE1ETm9kZXMuCisgIERlbnNlTWFwPGNvbnN0IE1ETm9kZSosIHVuc2lnbmVkPiBtZG5NYXA7CisgIHVuc2lnbmVkIG1kbk5leHQ7CitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIG1vZHVsZQorICBleHBsaWNpdCBTbG90VHJhY2tlcihjb25zdCBNb2R1bGUgKk0pOworICAvLy8gQ29uc3RydWN0IGZyb20gYSBmdW5jdGlvbiwgc3RhcnRpbmcgb3V0IGluIGluY29ycCBzdGF0ZS4KKyAgZXhwbGljaXQgU2xvdFRyYWNrZXIoY29uc3QgRnVuY3Rpb24gKkYpOworCisgIC8vLyBSZXR1cm4gdGhlIHNsb3QgbnVtYmVyIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gaXQncyB0eXBlCisgIC8vLyBwbGFuZS4gIElmIHNvbWV0aGluZyBpcyBub3QgaW4gdGhlIFNsb3RUcmFja2VyLCByZXR1cm4gLTEuCisgIGludCBnZXRMb2NhbFNsb3QoY29uc3QgVmFsdWUgKlYpOworICBpbnQgZ2V0R2xvYmFsU2xvdChjb25zdCBHbG9iYWxWYWx1ZSAqVik7CisgIGludCBnZXRNZXRhZGF0YVNsb3QoY29uc3QgTUROb2RlICpOKTsKKworICAvLy8gSWYgeW91J2QgbGlrZSB0byBkZWFsIHdpdGggYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGp1c3QgYSBtb2R1bGUsIHVzZQorICAvLy8gdGhpcyBtZXRob2QgdG8gZ2V0IGl0cyBkYXRhIGludG8gdGhlIFNsb3RUcmFja2VyLgorICB2b2lkIGluY29ycG9yYXRlRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICBUaGVGdW5jdGlvbiA9IEY7CisgICAgRnVuY3Rpb25Qcm9jZXNzZWQgPSBmYWxzZTsKKyAgfQorCisgIC8vLyBBZnRlciBjYWxsaW5nIGluY29ycG9yYXRlRnVuY3Rpb24sIHVzZSB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlCisgIC8vLyBtb3N0IHJlY2VudGx5IGluY29ycG9yYXRlZCBmdW5jdGlvbiBmcm9tIHRoZSBTbG90VHJhY2tlci4gVGhpcworICAvLy8gd2lsbCByZXNldCB0aGUgc3RhdGUgb2YgdGhlIG1hY2hpbmUgYmFjayB0byBqdXN0IHRoZSBtb2R1bGUgY29udGVudHMuCisgIHZvaWQgcHVyZ2VGdW5jdGlvbigpOworCisgIC8vLyBNRE5vZGUgbWFwIGl0ZXJhdG9ycy4KKyAgdHlwZWRlZiBEZW5zZU1hcDxjb25zdCBNRE5vZGUqLCB1bnNpZ25lZD46Oml0ZXJhdG9yIG1kbl9pdGVyYXRvcjsKKyAgbWRuX2l0ZXJhdG9yIG1kbl9iZWdpbigpIHsgcmV0dXJuIG1kbk1hcC5iZWdpbigpOyB9CisgIG1kbl9pdGVyYXRvciBtZG5fZW5kKCkgeyByZXR1cm4gbWRuTWFwLmVuZCgpOyB9CisgIHVuc2lnbmVkIG1kbl9zaXplKCkgY29uc3QgeyByZXR1cm4gbWRuTWFwLnNpemUoKTsgfQorICBib29sIG1kbl9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1kbk1hcC5lbXB0eSgpOyB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgYWN0dWFsIGluaXRpYWxpemF0aW9uLgorICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCk7CisKKyAgLy8gSW1wbGVtZW50YXRpb24gRGV0YWlscworcHJpdmF0ZToKKyAgLy8vIENyZWF0ZU1vZHVsZVNsb3QgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBHbG9iYWxWYWx1ZSogaW50byB0aGUgc2xvdCB0YWJsZS4KKyAgdm9pZCBDcmVhdGVNb2R1bGVTbG90KGNvbnN0IEdsb2JhbFZhbHVlICpWKTsKKworICAvLy8gQ3JlYXRlTWV0YWRhdGFTbG90IC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgTUROb2RlKiBpbnRvIHRoZSBzbG90IHRhYmxlLgorICB2b2lkIENyZWF0ZU1ldGFkYXRhU2xvdChjb25zdCBNRE5vZGUgKk4pOworCisgIC8vLyBDcmVhdGVGdW5jdGlvblNsb3QgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBWYWx1ZSogaW50byB0aGUgc2xvdCB0YWJsZS4KKyAgdm9pZCBDcmVhdGVGdW5jdGlvblNsb3QoY29uc3QgVmFsdWUgKlYpOworCisgIC8vLyBBZGQgYWxsIG9mIHRoZSBtb2R1bGUgbGV2ZWwgZ2xvYmFsIHZhcmlhYmxlcyAoYW5kIHRoZWlyIGluaXRpYWxpemVycykKKyAgLy8vIGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGJ1dCBub3QgdGhlIGNvbnRlbnRzIG9mIHRob3NlIGZ1bmN0aW9ucy4KKyAgdm9pZCBwcm9jZXNzTW9kdWxlKCk7CisKKyAgLy8vIEFkZCBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBhcmd1bWVudHMsIGJhc2ljIGJsb2NrcywgYW5kIGluc3RydWN0aW9ucy4KKyAgdm9pZCBwcm9jZXNzRnVuY3Rpb24oKTsKKworICBTbG90VHJhY2tlcihjb25zdCBTbG90VHJhY2tlciAmKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU2xvdFRyYWNrZXIgJik7ICAvLyBETyBOT1QgSU1QTEVNRU5UCit9OworCit9ICAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCisKK3N0YXRpYyBTbG90VHJhY2tlciAqY3JlYXRlU2xvdFRyYWNrZXIoY29uc3QgVmFsdWUgKlYpIHsKKyAgaWYgKGNvbnN0IEFyZ3VtZW50ICpGQSA9IGR5bl9jYXN0PEFyZ3VtZW50PihWKSkKKyAgICByZXR1cm4gbmV3IFNsb3RUcmFja2VyKEZBLT5nZXRQYXJlbnQoKSk7CisKKyAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKQorICAgIHJldHVybiBuZXcgU2xvdFRyYWNrZXIoSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpKTsKKworICBpZiAoY29uc3QgQmFzaWNCbG9jayAqQkIgPSBkeW5fY2FzdDxCYXNpY0Jsb2NrPihWKSkKKyAgICByZXR1cm4gbmV3IFNsb3RUcmFja2VyKEJCLT5nZXRQYXJlbnQoKSk7CisKKyAgaWYgKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihWKSkKKyAgICByZXR1cm4gbmV3IFNsb3RUcmFja2VyKEdWLT5nZXRQYXJlbnQoKSk7CisKKyAgaWYgKGNvbnN0IEdsb2JhbEFsaWFzICpHQSA9IGR5bl9jYXN0PEdsb2JhbEFsaWFzPihWKSkKKyAgICByZXR1cm4gbmV3IFNsb3RUcmFja2VyKEdBLT5nZXRQYXJlbnQoKSk7CisKKyAgaWYgKGNvbnN0IEZ1bmN0aW9uICpGdW5jID0gZHluX2Nhc3Q8RnVuY3Rpb24+KFYpKQorICAgIHJldHVybiBuZXcgU2xvdFRyYWNrZXIoRnVuYyk7CisKKyAgaWYgKGNvbnN0IE1ETm9kZSAqTUQgPSBkeW5fY2FzdDxNRE5vZGU+KFYpKSB7CisgICAgaWYgKCFNRC0+aXNGdW5jdGlvbkxvY2FsKCkpCisgICAgICByZXR1cm4gbmV3IFNsb3RUcmFja2VyKE1ELT5nZXRGdW5jdGlvbigpKTsKKworICAgIHJldHVybiBuZXcgU2xvdFRyYWNrZXIoKEZ1bmN0aW9uICopMCk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworI2lmIDAKKyNkZWZpbmUgU1RfREVCVUcoWCkgZGJncygpIDw8IFgKKyNlbHNlCisjZGVmaW5lIFNUX0RFQlVHKFgpCisjZW5kaWYKKworLy8gTW9kdWxlIGxldmVsIGNvbnN0cnVjdG9yLiBDYXVzZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBNb2R1bGUgKHNhbnMgZnVuY3Rpb25zKQorLy8gdG8gYmUgYWRkZWQgdG8gdGhlIHNsb3QgdGFibGUuCitTbG90VHJhY2tlcjo6U2xvdFRyYWNrZXIoY29uc3QgTW9kdWxlICpNKQorICA6IFRoZU1vZHVsZShNKSwgVGhlRnVuY3Rpb24oMCksIEZ1bmN0aW9uUHJvY2Vzc2VkKGZhbHNlKSwgCisgICAgbU5leHQoMCksIGZOZXh0KDApLCAgbWRuTmV4dCgwKSB7Cit9CisKKy8vIEZ1bmN0aW9uIGxldmVsIGNvbnN0cnVjdG9yLiBDYXVzZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBNb2R1bGUgYW5kIHRoZSBvbmUKKy8vIGZ1bmN0aW9uIHByb3ZpZGVkIHRvIGJlIGFkZGVkIHRvIHRoZSBzbG90IHRhYmxlLgorU2xvdFRyYWNrZXI6OlNsb3RUcmFja2VyKGNvbnN0IEZ1bmN0aW9uICpGKQorICA6IFRoZU1vZHVsZShGID8gRi0+Z2V0UGFyZW50KCkgOiAwKSwgVGhlRnVuY3Rpb24oRiksIEZ1bmN0aW9uUHJvY2Vzc2VkKGZhbHNlKSwKKyAgICBtTmV4dCgwKSwgZk5leHQoMCksIG1kbk5leHQoMCkgeworfQorCitpbmxpbmUgdm9pZCBTbG90VHJhY2tlcjo6aW5pdGlhbGl6ZSgpIHsKKyAgaWYgKFRoZU1vZHVsZSkgeworICAgIHByb2Nlc3NNb2R1bGUoKTsKKyAgICBUaGVNb2R1bGUgPSAwOyAvLy88IFByZXZlbnQgcmUtcHJvY2Vzc2luZyBuZXh0IHRpbWUgd2UncmUgY2FsbGVkLgorICB9CisKKyAgaWYgKFRoZUZ1bmN0aW9uICYmICFGdW5jdGlvblByb2Nlc3NlZCkKKyAgICBwcm9jZXNzRnVuY3Rpb24oKTsKK30KKworLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcywgZnVuY3Rpb25zLCBhbmQgZ2xvYmFsCisvLyB2YXJpYWJsZSBpbml0aWFsaXplcnMgYW5kIGNyZWF0ZSBzbG90cyBmb3IgdGhlbS4KK3ZvaWQgU2xvdFRyYWNrZXI6OnByb2Nlc3NNb2R1bGUoKSB7CisgIFNUX0RFQlVHKCJiZWdpbiBwcm9jZXNzTW9kdWxlIVxuIik7CisKKyAgLy8gQWRkIGFsbCBvZiB0aGUgdW5uYW1lZCBnbG9iYWwgdmFyaWFibGVzIHRvIHRoZSB2YWx1ZSB0YWJsZS4KKyAgZm9yIChNb2R1bGU6OmNvbnN0X2dsb2JhbF9pdGVyYXRvciBJID0gVGhlTW9kdWxlLT5nbG9iYWxfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBUaGVNb2R1bGUtPmdsb2JhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoIUktPmhhc05hbWUoKSkKKyAgICAgIENyZWF0ZU1vZHVsZVNsb3QoSSk7CisgIH0KKworICAvLyBBZGQgbWV0YWRhdGEgdXNlZCBieSBuYW1lZCBtZXRhZGF0YS4KKyAgZm9yIChNb2R1bGU6OmNvbnN0X25hbWVkX21ldGFkYXRhX2l0ZXJhdG9yCisgICAgICAgICBJID0gVGhlTW9kdWxlLT5uYW1lZF9tZXRhZGF0YV9iZWdpbigpLAorICAgICAgICAgRSA9IFRoZU1vZHVsZS0+bmFtZWRfbWV0YWRhdGFfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgTmFtZWRNRE5vZGUgKk5NRCA9IEk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5NRC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBDcmVhdGVNZXRhZGF0YVNsb3QoTk1ELT5nZXRPcGVyYW5kKGkpKTsKKyAgfQorCisgIC8vIEFkZCBhbGwgdGhlIHVubmFtZWQgZnVuY3Rpb25zIHRvIHRoZSB0YWJsZS4KKyAgZm9yIChNb2R1bGU6OmNvbnN0X2l0ZXJhdG9yIEkgPSBUaGVNb2R1bGUtPmJlZ2luKCksIEUgPSBUaGVNb2R1bGUtPmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmICghSS0+aGFzTmFtZSgpKQorICAgICAgQ3JlYXRlTW9kdWxlU2xvdChJKTsKKworICBTVF9ERUJVRygiZW5kIHByb2Nlc3NNb2R1bGUhXG4iKTsKK30KKworLy8gUHJvY2VzcyB0aGUgYXJndW1lbnRzLCBiYXNpYyBibG9ja3MsIGFuZCBpbnN0cnVjdGlvbnMgIG9mIGEgZnVuY3Rpb24uCit2b2lkIFNsb3RUcmFja2VyOjpwcm9jZXNzRnVuY3Rpb24oKSB7CisgIFNUX0RFQlVHKCJiZWdpbiBwcm9jZXNzRnVuY3Rpb24hXG4iKTsKKyAgZk5leHQgPSAwOworCisgIC8vIEFkZCBhbGwgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyB3aXRoIG5vIG5hbWVzLgorICBmb3IoRnVuY3Rpb246OmNvbnN0X2FyZ19pdGVyYXRvciBBSSA9IFRoZUZ1bmN0aW9uLT5hcmdfYmVnaW4oKSwKKyAgICAgIEFFID0gVGhlRnVuY3Rpb24tPmFyZ19lbmQoKTsgQUkgIT0gQUU7ICsrQUkpCisgICAgaWYgKCFBSS0+aGFzTmFtZSgpKQorICAgICAgQ3JlYXRlRnVuY3Rpb25TbG90KEFJKTsKKworICBTVF9ERUJVRygiSW5zZXJ0aW5nIEluc3RydWN0aW9uczpcbiIpOworCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTUROb2RlKj4sIDQ+IE1ERm9ySW5zdDsKKworICAvLyBBZGQgYWxsIG9mIHRoZSBiYXNpYyBibG9ja3MgYW5kIGluc3RydWN0aW9ucyB3aXRoIG5vIG5hbWVzLgorICBmb3IgKEZ1bmN0aW9uOjpjb25zdF9pdGVyYXRvciBCQiA9IFRoZUZ1bmN0aW9uLT5iZWdpbigpLAorICAgICAgIEUgPSBUaGVGdW5jdGlvbi0+ZW5kKCk7IEJCICE9IEU7ICsrQkIpIHsKKyAgICBpZiAoIUJCLT5oYXNOYW1lKCkpCisgICAgICBDcmVhdGVGdW5jdGlvblNsb3QoQkIpOworICAgIAorICAgIGZvciAoQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCLT5iZWdpbigpLCBFID0gQkItPmVuZCgpOyBJICE9IEU7CisgICAgICAgICArK0kpIHsKKyAgICAgIGlmICghSS0+Z2V0VHlwZSgpLT5pc1ZvaWRUeSgpICYmICFJLT5oYXNOYW1lKCkpCisgICAgICAgIENyZWF0ZUZ1bmN0aW9uU2xvdChJKTsKKyAgICAgIAorICAgICAgLy8gSW50cmluc2ljcyBjYW4gZGlyZWN0bHkgdXNlIG1ldGFkYXRhLiAgV2UgYWxsb3cgZGlyZWN0IGNhbGxzIHRvIGFueQorICAgICAgLy8gbGx2bS5mb28gZnVuY3Rpb24gaGVyZSwgYmVjYXVzZSB0aGUgdGFyZ2V0IG1heSBub3QgYmUgbGlua2VkIGludG8gdGhlCisgICAgICAvLyBvcHRpbWl6ZXIuCisgICAgICBpZiAoY29uc3QgQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KEkpKSB7CisgICAgICAgIGlmIChGdW5jdGlvbiAqRiA9IENJLT5nZXRDYWxsZWRGdW5jdGlvbigpKQorICAgICAgICAgIGlmIChGLT5nZXROYW1lKCkuc3RhcnRzd2l0aCgibGx2bS4iKSkKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICAgICAgaWYgKE1ETm9kZSAqTiA9IGR5bl9jYXN0X29yX251bGw8TUROb2RlPihJLT5nZXRPcGVyYW5kKGkpKSkKKyAgICAgICAgICAgICAgICBDcmVhdGVNZXRhZGF0YVNsb3QoTik7CisgICAgICB9CisKKyAgICAgIC8vIFByb2Nlc3MgbWV0YWRhdGEgYXR0YWNoZWQgd2l0aCB0aGlzIGluc3RydWN0aW9uLgorICAgICAgSS0+Z2V0QWxsTWV0YWRhdGEoTURGb3JJbnN0KTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNREZvckluc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgQ3JlYXRlTWV0YWRhdGFTbG90KE1ERm9ySW5zdFtpXS5zZWNvbmQpOworICAgICAgTURGb3JJbnN0LmNsZWFyKCk7CisgICAgfQorICB9CisKKyAgRnVuY3Rpb25Qcm9jZXNzZWQgPSB0cnVlOworCisgIFNUX0RFQlVHKCJlbmQgcHJvY2Vzc0Z1bmN0aW9uIVxuIik7Cit9CisKKy8vLyBDbGVhbiB1cCBhZnRlciBpbmNvcnBvcmF0aW5nIGEgZnVuY3Rpb24uIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGdldCBvdXQgb2YKKy8vLyB0aGUgZnVuY3Rpb24gaW5jb3Jwb3JhdGlvbiBzdGF0ZSB0aGF0IGFmZmVjdHMgZ2V0KlNsb3QvQ3JlYXRlKlNsb3QuIEZ1bmN0aW9uCisvLy8gaW5jb3Jwb3JhdGlvbiBzdGF0ZSBpcyBpbmRpY2F0ZWQgYnkgVGhlRnVuY3Rpb24gIT0gMC4KK3ZvaWQgU2xvdFRyYWNrZXI6OnB1cmdlRnVuY3Rpb24oKSB7CisgIFNUX0RFQlVHKCJiZWdpbiBwdXJnZUZ1bmN0aW9uIVxuIik7CisgIGZNYXAuY2xlYXIoKTsgLy8gU2ltcGx5IGRpc2NhcmQgdGhlIGZ1bmN0aW9uIGxldmVsIG1hcAorICBUaGVGdW5jdGlvbiA9IDA7CisgIEZ1bmN0aW9uUHJvY2Vzc2VkID0gZmFsc2U7CisgIFNUX0RFQlVHKCJlbmQgcHVyZ2VGdW5jdGlvbiFcbiIpOworfQorCisvLy8gZ2V0R2xvYmFsU2xvdCAtIEdldCB0aGUgc2xvdCBudW1iZXIgb2YgYSBnbG9iYWwgdmFsdWUuCitpbnQgU2xvdFRyYWNrZXI6OmdldEdsb2JhbFNsb3QoY29uc3QgR2xvYmFsVmFsdWUgKlYpIHsKKyAgLy8gQ2hlY2sgZm9yIHVuaW5pdGlhbGl6ZWQgc3RhdGUgYW5kIGRvIGxhenkgaW5pdGlhbGl6YXRpb24uCisgIGluaXRpYWxpemUoKTsKKworICAvLyBGaW5kIHRoZSB0eXBlIHBsYW5lIGluIHRoZSBtb2R1bGUgbWFwCisgIFZhbHVlTWFwOjppdGVyYXRvciBNSSA9IG1NYXAuZmluZChWKTsKKyAgcmV0dXJuIE1JID09IG1NYXAuZW5kKCkgPyAtMSA6IChpbnQpTUktPnNlY29uZDsKK30KKworLy8vIGdldE1ldGFkYXRhU2xvdCAtIEdldCB0aGUgc2xvdCBudW1iZXIgb2YgYSBNRE5vZGUuCitpbnQgU2xvdFRyYWNrZXI6OmdldE1ldGFkYXRhU2xvdChjb25zdCBNRE5vZGUgKk4pIHsKKyAgLy8gQ2hlY2sgZm9yIHVuaW5pdGlhbGl6ZWQgc3RhdGUgYW5kIGRvIGxhenkgaW5pdGlhbGl6YXRpb24uCisgIGluaXRpYWxpemUoKTsKKworICAvLyBGaW5kIHRoZSB0eXBlIHBsYW5lIGluIHRoZSBtb2R1bGUgbWFwCisgIG1kbl9pdGVyYXRvciBNSSA9IG1kbk1hcC5maW5kKE4pOworICByZXR1cm4gTUkgPT0gbWRuTWFwLmVuZCgpID8gLTEgOiAoaW50KU1JLT5zZWNvbmQ7Cit9CisKKworLy8vIGdldExvY2FsU2xvdCAtIEdldCB0aGUgc2xvdCBudW1iZXIgZm9yIGEgdmFsdWUgdGhhdCBpcyBsb2NhbCB0byBhIGZ1bmN0aW9uLgoraW50IFNsb3RUcmFja2VyOjpnZXRMb2NhbFNsb3QoY29uc3QgVmFsdWUgKlYpIHsKKyAgYXNzZXJ0KCFpc2E8Q29uc3RhbnQ+KFYpICYmICJDYW4ndCBnZXQgYSBjb25zdGFudCBvciBnbG9iYWwgc2xvdCB3aXRoIHRoaXMhIik7CisKKyAgLy8gQ2hlY2sgZm9yIHVuaW5pdGlhbGl6ZWQgc3RhdGUgYW5kIGRvIGxhenkgaW5pdGlhbGl6YXRpb24uCisgIGluaXRpYWxpemUoKTsKKworICBWYWx1ZU1hcDo6aXRlcmF0b3IgRkkgPSBmTWFwLmZpbmQoVik7CisgIHJldHVybiBGSSA9PSBmTWFwLmVuZCgpID8gLTEgOiAoaW50KUZJLT5zZWNvbmQ7Cit9CisKKworLy8vIENyZWF0ZU1vZHVsZVNsb3QgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBHbG9iYWxWYWx1ZSogaW50byB0aGUgc2xvdCB0YWJsZS4KK3ZvaWQgU2xvdFRyYWNrZXI6OkNyZWF0ZU1vZHVsZVNsb3QoY29uc3QgR2xvYmFsVmFsdWUgKlYpIHsKKyAgYXNzZXJ0KFYgJiYgIkNhbid0IGluc2VydCBhIG51bGwgVmFsdWUgaW50byBTbG90VHJhY2tlciEiKTsKKyAgYXNzZXJ0KCFWLT5nZXRUeXBlKCktPmlzVm9pZFR5KCkgJiYgIkRvZXNuJ3QgbmVlZCBhIHNsb3QhIik7CisgIGFzc2VydCghVi0+aGFzTmFtZSgpICYmICJEb2Vzbid0IG5lZWQgYSBzbG90ISIpOworCisgIHVuc2lnbmVkIERlc3RTbG90ID0gbU5leHQrKzsKKyAgbU1hcFtWXSA9IERlc3RTbG90OworCisgIFNUX0RFQlVHKCIgIEluc2VydGluZyB2YWx1ZSBbIiA8PCBWLT5nZXRUeXBlKCkgPDwgIl0gPSAiIDw8IFYgPDwgIiBzbG90PSIgPDwKKyAgICAgICAgICAgRGVzdFNsb3QgPDwgIiBbIik7CisgIC8vIEcgPSBHbG9iYWwsIEYgPSBGdW5jdGlvbiwgQSA9IEFsaWFzLCBvID0gb3RoZXIKKyAgU1RfREVCVUcoKGlzYTxHbG9iYWxWYXJpYWJsZT4oVikgPyAnRycgOgorICAgICAgICAgICAgKGlzYTxGdW5jdGlvbj4oVikgPyAnRicgOgorICAgICAgICAgICAgIChpc2E8R2xvYmFsQWxpYXM+KFYpID8gJ0EnIDogJ28nKSkpIDw8ICJdXG4iKTsKK30KKworLy8vIENyZWF0ZVNsb3QgLSBDcmVhdGUgYSBuZXcgc2xvdCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSBpZiBpdCBoYXMgbm8gbmFtZS4KK3ZvaWQgU2xvdFRyYWNrZXI6OkNyZWF0ZUZ1bmN0aW9uU2xvdChjb25zdCBWYWx1ZSAqVikgeworICBhc3NlcnQoIVYtPmdldFR5cGUoKS0+aXNWb2lkVHkoKSAmJiAhVi0+aGFzTmFtZSgpICYmICJEb2Vzbid0IG5lZWQgYSBzbG90ISIpOworCisgIHVuc2lnbmVkIERlc3RTbG90ID0gZk5leHQrKzsKKyAgZk1hcFtWXSA9IERlc3RTbG90OworCisgIC8vIEcgPSBHbG9iYWwsIEYgPSBGdW5jdGlvbiwgbyA9IG90aGVyCisgIFNUX0RFQlVHKCIgIEluc2VydGluZyB2YWx1ZSBbIiA8PCBWLT5nZXRUeXBlKCkgPDwgIl0gPSAiIDw8IFYgPDwgIiBzbG90PSIgPDwKKyAgICAgICAgICAgRGVzdFNsb3QgPDwgIiBbb11cbiIpOworfQorCisvLy8gQ3JlYXRlTW9kdWxlU2xvdCAtIEluc2VydCB0aGUgc3BlY2lmaWVkIE1ETm9kZSogaW50byB0aGUgc2xvdCB0YWJsZS4KK3ZvaWQgU2xvdFRyYWNrZXI6OkNyZWF0ZU1ldGFkYXRhU2xvdChjb25zdCBNRE5vZGUgKk4pIHsKKyAgYXNzZXJ0KE4gJiYgIkNhbid0IGluc2VydCBhIG51bGwgVmFsdWUgaW50byBTbG90VHJhY2tlciEiKTsKKworICAvLyBEb24ndCBpbnNlcnQgaWYgTiBpcyBhIGZ1bmN0aW9uLWxvY2FsIG1ldGFkYXRhLCB0aGVzZSBhcmUgYWx3YXlzIHByaW50ZWQKKyAgLy8gaW5saW5lLgorICBpZiAoIU4tPmlzRnVuY3Rpb25Mb2NhbCgpKSB7CisgICAgbWRuX2l0ZXJhdG9yIEkgPSBtZG5NYXAuZmluZChOKTsKKyAgICBpZiAoSSAhPSBtZG5NYXAuZW5kKCkpCisgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBEZXN0U2xvdCA9IG1kbk5leHQrKzsKKyAgICBtZG5NYXBbTl0gPSBEZXN0U2xvdDsKKyAgfQorCisgIC8vIFJlY3Vyc2l2ZWx5IGFkZCBhbnkgTUROb2RlcyByZWZlcmVuY2VkIGJ5IG9wZXJhbmRzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKGNvbnN0IE1ETm9kZSAqT3AgPSBkeW5fY2FzdF9vcl9udWxsPE1ETm9kZT4oTi0+Z2V0T3BlcmFuZChpKSkpCisgICAgICBDcmVhdGVNZXRhZGF0YVNsb3QoT3ApOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQXNtV3JpdGVyIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitzdGF0aWMgdm9pZCBXcml0ZUFzT3BlcmFuZEludGVybmFsKHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUHJpbnRpbmcgKlR5cGVQcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90VHJhY2tlciAqTWFjaGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlICpDb250ZXh0KTsKKworCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRQcmVkaWNhdGVUZXh0KHVuc2lnbmVkIHByZWRpY2F0ZSkgeworICBjb25zdCBjaGFyICogcHJlZCA9ICJ1bmtub3duIjsKKyAgc3dpdGNoIChwcmVkaWNhdGUpIHsKKyAgY2FzZSBGQ21wSW5zdDo6RkNNUF9GQUxTRTogcHJlZCA9ICJmYWxzZSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09FUTogICBwcmVkID0gIm9lcSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HVDogICBwcmVkID0gIm9ndCI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRTogICBwcmVkID0gIm9nZSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MVDogICBwcmVkID0gIm9sdCI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MRTogICBwcmVkID0gIm9sZSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09ORTogICBwcmVkID0gIm9uZSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX09SRDogICBwcmVkID0gIm9yZCI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VOTzogICBwcmVkID0gInVubyI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VFUTogICBwcmVkID0gInVlcSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHVDogICBwcmVkID0gInVndCI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHRTogICBwcmVkID0gInVnZSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMVDogICBwcmVkID0gInVsdCI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMRTogICBwcmVkID0gInVsZSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VORTogICBwcmVkID0gInVuZSI7IGJyZWFrOworICBjYXNlIEZDbXBJbnN0OjpGQ01QX1RSVUU6ICBwcmVkID0gInRydWUiOyBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogICAgcHJlZCA9ICJlcSI7IGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiAgICBwcmVkID0gIm5lIjsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiAgIHByZWQgPSAic2d0IjsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOiAgIHByZWQgPSAic2dlIjsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiAgIHByZWQgPSAic2x0IjsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xFOiAgIHByZWQgPSAic2xlIjsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiAgIHByZWQgPSAidWd0IjsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOiAgIHByZWQgPSAidWdlIjsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOiAgIHByZWQgPSAidWx0IjsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxFOiAgIHByZWQgPSAidWxlIjsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHByZWQ7Cit9CisKKworc3RhdGljIHZvaWQgV3JpdGVPcHRpbWl6YXRpb25JbmZvKHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IFVzZXIgKlUpIHsKKyAgaWYgKGNvbnN0IE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3IgKk9CTyA9CisgICAgICAgIGR5bl9jYXN0PE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I+KFUpKSB7CisgICAgaWYgKE9CTy0+aGFzTm9VbnNpZ25lZFdyYXAoKSkKKyAgICAgIE91dCA8PCAiIG51dyI7CisgICAgaWYgKE9CTy0+aGFzTm9TaWduZWRXcmFwKCkpCisgICAgICBPdXQgPDwgIiBuc3ciOworICB9IGVsc2UgaWYgKGNvbnN0IFNEaXZPcGVyYXRvciAqRGl2ID0gZHluX2Nhc3Q8U0Rpdk9wZXJhdG9yPihVKSkgeworICAgIGlmIChEaXYtPmlzRXhhY3QoKSkKKyAgICAgIE91dCA8PCAiIGV4YWN0IjsKKyAgfSBlbHNlIGlmIChjb25zdCBHRVBPcGVyYXRvciAqR0VQID0gZHluX2Nhc3Q8R0VQT3BlcmF0b3I+KFUpKSB7CisgICAgaWYgKEdFUC0+aXNJbkJvdW5kcygpKQorICAgICAgT3V0IDw8ICIgaW5ib3VuZHMiOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFdyaXRlQ29uc3RhbnRJbnRlcm5hbChyYXdfb3N0cmVhbSAmT3V0LCBjb25zdCBDb25zdGFudCAqQ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVByaW50aW5nICZUeXBlUHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90VHJhY2tlciAqTWFjaGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkNvbnRleHQpIHsKKyAgaWYgKGNvbnN0IENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDVikpIHsKKyAgICBpZiAoQ0ktPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoMSkpIHsKKyAgICAgIE91dCA8PCAoQ0ktPmdldFpFeHRWYWx1ZSgpID8gInRydWUiIDogImZhbHNlIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIE91dCA8PCBDSS0+Z2V0VmFsdWUoKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY29uc3QgQ29uc3RhbnRGUCAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oQ1YpKSB7CisgICAgaWYgKCZDRlAtPmdldFZhbHVlQVBGKCkuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OklFRUVkb3VibGUgfHwKKyAgICAgICAgJkNGUC0+Z2V0VmFsdWVBUEYoKS5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6SUVFRXNpbmdsZSkgeworICAgICAgLy8gV2Ugd291bGQgbGlrZSB0byBvdXRwdXQgdGhlIEZQIGNvbnN0YW50IHZhbHVlIGluIGV4cG9uZW50aWFsIG5vdGF0aW9uLAorICAgICAgLy8gYnV0IHdlIGNhbm5vdCBkbyB0aGlzIGlmIGRvaW5nIHNvIHdpbGwgbG9zZSBwcmVjaXNpb24uICBDaGVjayBoZXJlIHRvCisgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBvbmx5IG91dHB1dCBpdCBpbiBleHBvbmVudGlhbCBmb3JtYXQgaWYgd2UgY2FuIHBhcnNlCisgICAgICAvLyB0aGUgdmFsdWUgYmFjayBhbmQgZ2V0IHRoZSBzYW1lIHZhbHVlLgorICAgICAgLy8KKyAgICAgIGJvb2wgaWdub3JlZDsKKyAgICAgIGJvb2wgaXNEb3VibGUgPSAmQ0ZQLT5nZXRWYWx1ZUFQRigpLmdldFNlbWFudGljcygpPT0mQVBGbG9hdDo6SUVFRWRvdWJsZTsKKyAgICAgIGRvdWJsZSBWYWwgPSBpc0RvdWJsZSA/IENGUC0+Z2V0VmFsdWVBUEYoKS5jb252ZXJ0VG9Eb3VibGUoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlAtPmdldFZhbHVlQVBGKCkuY29udmVydFRvRmxvYXQoKTsKKyAgICAgIFNtYWxsU3RyaW5nPDEyOD4gU3RyVmFsOworICAgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbShTdHJWYWwpIDw8IFZhbDsKKworICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHN0cmluZ2l6ZWQgbnVtYmVyIGlzIG5vdCBzb21lIHN0cmluZyBsaWtlCisgICAgICAvLyAiSW5mIiBvciBOYU4sIHRoYXQgYXRvZiB3aWxsIGFjY2VwdCwgYnV0IHRoZSBsZXhlciB3aWxsIG5vdC4gIENoZWNrCisgICAgICAvLyB0aGF0IHRoZSBzdHJpbmcgbWF0Y2hlcyB0aGUgIlstK10/WzAtOV0iIHJlZ2V4LgorICAgICAgLy8KKyAgICAgIGlmICgoU3RyVmFsWzBdID49ICcwJyAmJiBTdHJWYWxbMF0gPD0gJzknKSB8fAorICAgICAgICAgICgoU3RyVmFsWzBdID09ICctJyB8fCBTdHJWYWxbMF0gPT0gJysnKSAmJgorICAgICAgICAgICAoU3RyVmFsWzFdID49ICcwJyAmJiBTdHJWYWxbMV0gPD0gJzknKSkpIHsKKyAgICAgICAgLy8gUmVwYXJzZSBzdHJpbmdpemVkIHZlcnNpb24hCisgICAgICAgIGlmIChhdG9mKFN0clZhbC5jX3N0cigpKSA9PSBWYWwpIHsKKyAgICAgICAgICBPdXQgPDwgU3RyVmFsLnN0cigpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gT3RoZXJ3aXNlIHdlIGNvdWxkIG5vdCByZXBhcnNlIGl0IHRvIGV4YWN0bHkgdGhlIHNhbWUgdmFsdWUsIHNvIHdlIG11c3QKKyAgICAgIC8vIG91dHB1dCB0aGUgc3RyaW5nIGluIGhleGFkZWNpbWFsIGZvcm1hdCEgIE5vdGUgdGhhdCBsb2FkaW5nIGFuZCBzdG9yaW5nCisgICAgICAvLyBmbG9hdGluZyBwb2ludCB0eXBlcyBjaGFuZ2VzIHRoZSBiaXRzIG9mIE5hTnMgb24gc29tZSBob3N0cywgbm90YWJseQorICAgICAgLy8geDg2LCBzbyB3ZSBtdXN0IG5vdCB1c2UgdGhlc2UgdHlwZXMuCisgICAgICBhc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSAmJgorICAgICAgICAgICAgICJhc3N1bWluZyB0aGF0IGRvdWJsZSBpcyA2NCBiaXRzISIpOworICAgICAgY2hhciBCdWZmZXJbNDBdOworICAgICAgQVBGbG9hdCBhcGYgPSBDRlAtPmdldFZhbHVlQVBGKCk7CisgICAgICAvLyBGbG9hdHMgYXJlIHJlcHJlc2VudGVkIGluIEFTQ0lJIElSIGFzIGRvdWJsZSwgY29udmVydC4KKyAgICAgIGlmICghaXNEb3VibGUpCisgICAgICAgIGFwZi5jb252ZXJ0KEFQRmxvYXQ6OklFRUVkb3VibGUsIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZ25vcmVkKTsKKyAgICAgIE91dCA8PCAiMHgiIDw8CisgICAgICAgICAgICAgIHV0b2hleF9idWZmZXIodWludDY0X3QoYXBmLmJpdGNhc3RUb0FQSW50KCkuZ2V0WkV4dFZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcis0MCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gU29tZSBmb3JtIG9mIGxvbmcgZG91YmxlLiAgVGhlc2UgYXBwZWFyIGFzIGEgbWFnaWMgbGV0dGVyIGlkZW50aWZ5aW5nCisgICAgLy8gdGhlIHR5cGUsIHRoZW4gYSBmaXhlZCBudW1iZXIgb2YgaGV4IGRpZ2l0cy4KKyAgICBPdXQgPDwgIjB4IjsKKyAgICBpZiAoJkNGUC0+Z2V0VmFsdWVBUEYoKS5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6eDg3RG91YmxlRXh0ZW5kZWQpIHsKKyAgICAgIE91dCA8PCAnSyc7CisgICAgICAvLyBhcGkgbmVlZGVkIHRvIHByZXZlbnQgcHJlbWF0dXJlIGRlc3RydWN0aW9uCisgICAgICBBUEludCBhcGkgPSBDRlAtPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKTsKKyAgICAgIGNvbnN0IHVpbnQ2NF90KiBwID0gYXBpLmdldFJhd0RhdGEoKTsKKyAgICAgIHVpbnQ2NF90IHdvcmQgPSBwWzFdOworICAgICAgaW50IHNoaWZ0Y291bnQ9MTI7CisgICAgICBpbnQgd2lkdGggPSBhcGkuZ2V0Qml0V2lkdGgoKTsKKyAgICAgIGZvciAoaW50IGo9MDsgajx3aWR0aDsgais9NCwgc2hpZnRjb3VudC09NCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgbmliYmxlID0gKHdvcmQ+PnNoaWZ0Y291bnQpICYgMTU7CisgICAgICAgIGlmIChuaWJibGUgPCAxMCkKKyAgICAgICAgICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKG5pYmJsZSArICcwJyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKG5pYmJsZSAtIDEwICsgJ0EnKTsKKyAgICAgICAgaWYgKHNoaWZ0Y291bnQgPT0gMCAmJiBqKzQgPCB3aWR0aCkgeworICAgICAgICAgIHdvcmQgPSAqcDsKKyAgICAgICAgICBzaGlmdGNvdW50ID0gNjQ7CisgICAgICAgICAgaWYgKHdpZHRoLWotNCA8IDY0KQorICAgICAgICAgICAgc2hpZnRjb3VudCA9IHdpZHRoLWotNDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoJkNGUC0+Z2V0VmFsdWVBUEYoKS5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6SUVFRXF1YWQpCisgICAgICBPdXQgPDwgJ0wnOworICAgIGVsc2UgaWYgKCZDRlAtPmdldFZhbHVlQVBGKCkuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OlBQQ0RvdWJsZURvdWJsZSkKKyAgICAgIE91dCA8PCAnTSc7CisgICAgZWxzZQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworICAgIC8vIGFwaSBuZWVkZWQgdG8gcHJldmVudCBwcmVtYXR1cmUgZGVzdHJ1Y3Rpb24KKyAgICBBUEludCBhcGkgPSBDRlAtPmdldFZhbHVlQVBGKCkuYml0Y2FzdFRvQVBJbnQoKTsKKyAgICBjb25zdCB1aW50NjRfdCogcCA9IGFwaS5nZXRSYXdEYXRhKCk7CisgICAgdWludDY0X3Qgd29yZCA9ICpwOworICAgIGludCBzaGlmdGNvdW50PTYwOworICAgIGludCB3aWR0aCA9IGFwaS5nZXRCaXRXaWR0aCgpOworICAgIGZvciAoaW50IGo9MDsgajx3aWR0aDsgais9NCwgc2hpZnRjb3VudC09NCkgeworICAgICAgdW5zaWduZWQgaW50IG5pYmJsZSA9ICh3b3JkPj5zaGlmdGNvdW50KSAmIDE1OworICAgICAgaWYgKG5pYmJsZSA8IDEwKQorICAgICAgICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKG5pYmJsZSArICcwJyk7CisgICAgICBlbHNlCisgICAgICAgIE91dCA8PCAodW5zaWduZWQgY2hhcikobmliYmxlIC0gMTAgKyAnQScpOworICAgICAgaWYgKHNoaWZ0Y291bnQgPT0gMCAmJiBqKzQgPCB3aWR0aCkgeworICAgICAgICB3b3JkID0gKigrK3ApOworICAgICAgICBzaGlmdGNvdW50ID0gNjQ7CisgICAgICAgIGlmICh3aWR0aC1qLTQgPCA2NCkKKyAgICAgICAgICBzaGlmdGNvdW50ID0gd2lkdGgtai00OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oQ1YpKSB7CisgICAgT3V0IDw8ICJ6ZXJvaW5pdGlhbGl6ZXIiOworICAgIHJldHVybjsKKyAgfQorICAKKyAgaWYgKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEgPSBkeW5fY2FzdDxCbG9ja0FkZHJlc3M+KENWKSkgeworICAgIE91dCA8PCAiYmxvY2thZGRyZXNzKCI7CisgICAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIEJBLT5nZXRGdW5jdGlvbigpLCAmVHlwZVByaW50ZXIsIE1hY2hpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KTsKKyAgICBPdXQgPDwgIiwgIjsKKyAgICBXcml0ZUFzT3BlcmFuZEludGVybmFsKE91dCwgQkEtPmdldEJhc2ljQmxvY2soKSwgJlR5cGVQcmludGVyLCBNYWNoaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCk7CisgICAgT3V0IDw8ICIpIjsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY29uc3QgQ29uc3RhbnRBcnJheSAqQ0EgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihDVikpIHsKKyAgICAvLyBBcyBhIHNwZWNpYWwgY2FzZSwgcHJpbnQgdGhlIGFycmF5IGFzIGEgc3RyaW5nIGlmIGl0IGlzIGFuIGFycmF5IG9mCisgICAgLy8gaTggd2l0aCBDb25zdGFudEludCB2YWx1ZXMuCisgICAgLy8KKyAgICBjb25zdCBUeXBlICpFVHkgPSBDQS0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpOworICAgIGlmIChDQS0+aXNTdHJpbmcoKSkgeworICAgICAgT3V0IDw8ICJjXCIiOworICAgICAgUHJpbnRFc2NhcGVkU3RyaW5nKENBLT5nZXRBc1N0cmluZygpLCBPdXQpOworICAgICAgT3V0IDw8ICciJzsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvLyBDYW5ub3Qgb3V0cHV0IGluIHN0cmluZyBmb3JtYXQuLi4KKyAgICAgIE91dCA8PCAnWyc7CisgICAgICBpZiAoQ0EtPmdldE51bU9wZXJhbmRzKCkpIHsKKyAgICAgICAgVHlwZVByaW50ZXIucHJpbnQoRVR5LCBPdXQpOworICAgICAgICBPdXQgPDwgJyAnOworICAgICAgICBXcml0ZUFzT3BlcmFuZEludGVybmFsKE91dCwgQ0EtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlR5cGVQcmludGVyLCBNYWNoaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gQ0EtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgT3V0IDw8ICIsICI7CisgICAgICAgICAgVHlwZVByaW50ZXIucHJpbnQoRVR5LCBPdXQpOworICAgICAgICAgIE91dCA8PCAnICc7CisgICAgICAgICAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIENBLT5nZXRPcGVyYW5kKGkpLCAmVHlwZVByaW50ZXIsIE1hY2hpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgT3V0IDw8ICddJzsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGNvbnN0IENvbnN0YW50U3RydWN0ICpDUyA9IGR5bl9jYXN0PENvbnN0YW50U3RydWN0PihDVikpIHsKKyAgICBpZiAoQ1MtPmdldFR5cGUoKS0+aXNQYWNrZWQoKSkKKyAgICAgIE91dCA8PCAnPCc7CisgICAgT3V0IDw8ICd7JzsKKyAgICB1bnNpZ25lZCBOID0gQ1MtPmdldE51bU9wZXJhbmRzKCk7CisgICAgaWYgKE4pIHsKKyAgICAgIE91dCA8PCAnICc7CisgICAgICBUeXBlUHJpbnRlci5wcmludChDUy0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLCBPdXQpOworICAgICAgT3V0IDw8ICcgJzsKKworICAgICAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIENTLT5nZXRPcGVyYW5kKDApLCAmVHlwZVByaW50ZXIsIE1hY2hpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpOworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgTjsgaSsrKSB7CisgICAgICAgIE91dCA8PCAiLCAiOworICAgICAgICBUeXBlUHJpbnRlci5wcmludChDUy0+Z2V0T3BlcmFuZChpKS0+Z2V0VHlwZSgpLCBPdXQpOworICAgICAgICBPdXQgPDwgJyAnOworCisgICAgICAgIFdyaXRlQXNPcGVyYW5kSW50ZXJuYWwoT3V0LCBDUy0+Z2V0T3BlcmFuZChpKSwgJlR5cGVQcmludGVyLCBNYWNoaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpOworICAgICAgfQorICAgICAgT3V0IDw8ICcgJzsKKyAgICB9CisKKyAgICBPdXQgPDwgJ30nOworICAgIGlmIChDUy0+Z2V0VHlwZSgpLT5pc1BhY2tlZCgpKQorICAgICAgT3V0IDw8ICc+JzsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY29uc3QgQ29uc3RhbnRVbmlvbiAqQ1UgPSBkeW5fY2FzdDxDb25zdGFudFVuaW9uPihDVikpIHsKKyAgICBPdXQgPDwgInsgIjsKKyAgICBUeXBlUHJpbnRlci5wcmludChDVS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLCBPdXQpOworICAgIE91dCA8PCAnICc7CisgICAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIENVLT5nZXRPcGVyYW5kKDApLCAmVHlwZVByaW50ZXIsIE1hY2hpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KTsKKyAgICBPdXQgPDwgIiB9IjsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIGlmIChjb25zdCBDb25zdGFudFZlY3RvciAqQ1AgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oQ1YpKSB7CisgICAgY29uc3QgVHlwZSAqRVR5ID0gQ1AtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICBhc3NlcnQoQ1AtPmdldE51bU9wZXJhbmRzKCkgPiAwICYmCisgICAgICAgICAgICJOdW1iZXIgb2Ygb3BlcmFuZHMgZm9yIGEgUGFja2VkQ29uc3QgbXVzdCBiZSA+IDAiKTsKKyAgICBPdXQgPDwgJzwnOworICAgIFR5cGVQcmludGVyLnByaW50KEVUeSwgT3V0KTsKKyAgICBPdXQgPDwgJyAnOworICAgIFdyaXRlQXNPcGVyYW5kSW50ZXJuYWwoT3V0LCBDUC0+Z2V0T3BlcmFuZCgwKSwgJlR5cGVQcmludGVyLCBNYWNoaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IENQLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgT3V0IDw8ICIsICI7CisgICAgICBUeXBlUHJpbnRlci5wcmludChFVHksIE91dCk7CisgICAgICBPdXQgPDwgJyAnOworICAgICAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIENQLT5nZXRPcGVyYW5kKGkpLCAmVHlwZVByaW50ZXIsIE1hY2hpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpOworICAgIH0KKyAgICBPdXQgPDwgJz4nOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oQ1YpKSB7CisgICAgT3V0IDw8ICJudWxsIjsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoaXNhPFVuZGVmVmFsdWU+KENWKSkgeworICAgIE91dCA8PCAidW5kZWYiOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChjb25zdCBNRE5vZGUgKk5vZGUgPSBkeW5fY2FzdDxNRE5vZGU+KENWKSkgeworICAgIE91dCA8PCAiISIgPDwgTWFjaGluZS0+Z2V0TWV0YWRhdGFTbG90KE5vZGUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDVikpIHsKKyAgICBPdXQgPDwgQ0UtPmdldE9wY29kZU5hbWUoKTsKKyAgICBXcml0ZU9wdGltaXphdGlvbkluZm8oT3V0LCBDRSk7CisgICAgaWYgKENFLT5pc0NvbXBhcmUoKSkKKyAgICAgIE91dCA8PCAnICcgPDwgZ2V0UHJlZGljYXRlVGV4dChDRS0+Z2V0UHJlZGljYXRlKCkpOworICAgIE91dCA8PCAiICgiOworCisgICAgZm9yIChVc2VyOjpjb25zdF9vcF9pdGVyYXRvciBPST1DRS0+b3BfYmVnaW4oKTsgT0kgIT0gQ0UtPm9wX2VuZCgpOyArK09JKSB7CisgICAgICBUeXBlUHJpbnRlci5wcmludCgoKk9JKS0+Z2V0VHlwZSgpLCBPdXQpOworICAgICAgT3V0IDw8ICcgJzsKKyAgICAgIFdyaXRlQXNPcGVyYW5kSW50ZXJuYWwoT3V0LCAqT0ksICZUeXBlUHJpbnRlciwgTWFjaGluZSwgQ29udGV4dCk7CisgICAgICBpZiAoT0krMSAhPSBDRS0+b3BfZW5kKCkpCisgICAgICAgIE91dCA8PCAiLCAiOworICAgIH0KKworICAgIGlmIChDRS0+aGFzSW5kaWNlcygpKSB7CisgICAgICBjb25zdCBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gJkluZGljZXMgPSBDRS0+Z2V0SW5kaWNlcygpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluZGljZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgT3V0IDw8ICIsICIgPDwgSW5kaWNlc1tpXTsKKyAgICB9CisKKyAgICBpZiAoQ0UtPmlzQ2FzdCgpKSB7CisgICAgICBPdXQgPDwgIiB0byAiOworICAgICAgVHlwZVByaW50ZXIucHJpbnQoQ0UtPmdldFR5cGUoKSwgT3V0KTsKKyAgICB9CisKKyAgICBPdXQgPDwgJyknOworICAgIHJldHVybjsKKyAgfQorCisgIE91dCA8PCAiPHBsYWNlaG9sZGVyIG9yIGVycm9uZW91cyBDb25zdGFudD4iOworfQorCitzdGF0aWMgdm9pZCBXcml0ZU1ETm9kZUJvZHlJbnRlcm5hbChyYXdfb3N0cmVhbSAmT3V0LCBjb25zdCBNRE5vZGUgKk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUHJpbnRpbmcgKlR5cGVQcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdFRyYWNrZXIgKk1hY2hpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkNvbnRleHQpIHsKKyAgT3V0IDw8ICIheyI7CisgIGZvciAodW5zaWduZWQgbWkgPSAwLCBtZSA9IE5vZGUtPmdldE51bU9wZXJhbmRzKCk7IG1pICE9IG1lOyArK21pKSB7CisgICAgY29uc3QgVmFsdWUgKlYgPSBOb2RlLT5nZXRPcGVyYW5kKG1pKTsKKyAgICBpZiAoViA9PSAwKQorICAgICAgT3V0IDw8ICJudWxsIjsKKyAgICBlbHNlIHsKKyAgICAgIFR5cGVQcmludGVyLT5wcmludChWLT5nZXRUeXBlKCksIE91dCk7CisgICAgICBPdXQgPDwgJyAnOworICAgICAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIE5vZGUtPmdldE9wZXJhbmQobWkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVByaW50ZXIsIE1hY2hpbmUsIENvbnRleHQpOworICAgIH0KKyAgICBpZiAobWkgKyAxICE9IG1lKQorICAgICAgT3V0IDw8ICIsICI7CisgIH0KKyAgCisgIE91dCA8PCAifSI7Cit9CisKKworLy8vIFdyaXRlQXNPcGVyYW5kIC0gV3JpdGUgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBvdXQgdG8gdGhlIHNwZWNpZmllZAorLy8vIG9zdHJlYW0uICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3UganVzdCB3YW50IHRvIHByaW50IGludCAlcmVnMTI2LCBub3QKKy8vLyB0aGUgd2hvbGUgaW5zdHJ1Y3Rpb24gdGhhdCBnZW5lcmF0ZWQgaXQuCisvLy8KK3N0YXRpYyB2b2lkIFdyaXRlQXNPcGVyYW5kSW50ZXJuYWwocmF3X29zdHJlYW0gJk91dCwgY29uc3QgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVQcmludGluZyAqVHlwZVByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RUcmFja2VyICpNYWNoaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkNvbnRleHQpIHsKKyAgaWYgKFYtPmhhc05hbWUoKSkgeworICAgIFByaW50TExWTU5hbWUoT3V0LCBWKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBDb25zdGFudCAqQ1YgPSBkeW5fY2FzdDxDb25zdGFudD4oVik7CisgIGlmIChDViAmJiAhaXNhPEdsb2JhbFZhbHVlPihDVikpIHsKKyAgICBhc3NlcnQoVHlwZVByaW50ZXIgJiYgIkNvbnN0YW50cyByZXF1aXJlIFR5cGVQcmludGluZyEiKTsKKyAgICBXcml0ZUNvbnN0YW50SW50ZXJuYWwoT3V0LCBDViwgKlR5cGVQcmludGVyLCBNYWNoaW5lLCBDb250ZXh0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY29uc3QgSW5saW5lQXNtICpJQSA9IGR5bl9jYXN0PElubGluZUFzbT4oVikpIHsKKyAgICBPdXQgPDwgImFzbSAiOworICAgIGlmIChJQS0+aGFzU2lkZUVmZmVjdHMoKSkKKyAgICAgIE91dCA8PCAic2lkZWVmZmVjdCAiOworICAgIGlmIChJQS0+aXNBbGlnblN0YWNrKCkpCisgICAgICBPdXQgPDwgImFsaWduc3RhY2sgIjsKKyAgICBPdXQgPDwgJyInOworICAgIFByaW50RXNjYXBlZFN0cmluZyhJQS0+Z2V0QXNtU3RyaW5nKCksIE91dCk7CisgICAgT3V0IDw8ICJcIiwgXCIiOworICAgIFByaW50RXNjYXBlZFN0cmluZyhJQS0+Z2V0Q29uc3RyYWludFN0cmluZygpLCBPdXQpOworICAgIE91dCA8PCAnIic7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGNvbnN0IE1ETm9kZSAqTiA9IGR5bl9jYXN0PE1ETm9kZT4oVikpIHsKKyAgICBpZiAoTi0+aXNGdW5jdGlvbkxvY2FsKCkpIHsKKyAgICAgIC8vIFByaW50IG1ldGFkYXRhIGlubGluZSwgbm90IHZpYSBzbG90IHJlZmVyZW5jZSBudW1iZXIuCisgICAgICBXcml0ZU1ETm9kZUJvZHlJbnRlcm5hbChPdXQsIE4sIFR5cGVQcmludGVyLCBNYWNoaW5lLCBDb250ZXh0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICAgIGlmICghTWFjaGluZSkgeworICAgICAgaWYgKE4tPmlzRnVuY3Rpb25Mb2NhbCgpKQorICAgICAgICBNYWNoaW5lID0gbmV3IFNsb3RUcmFja2VyKE4tPmdldEZ1bmN0aW9uKCkpOworICAgICAgZWxzZQorICAgICAgICBNYWNoaW5lID0gbmV3IFNsb3RUcmFja2VyKENvbnRleHQpOworICAgIH0KKyAgICBPdXQgPDwgJyEnIDw8IE1hY2hpbmUtPmdldE1ldGFkYXRhU2xvdChOKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY29uc3QgTURTdHJpbmcgKk1EUyA9IGR5bl9jYXN0PE1EU3RyaW5nPihWKSkgeworICAgIE91dCA8PCAiIVwiIjsKKyAgICBQcmludEVzY2FwZWRTdHJpbmcoTURTLT5nZXRTdHJpbmcoKSwgT3V0KTsKKyAgICBPdXQgPDwgJyInOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OlBzZXVkb1NvdXJjZVZhbHVlVmFsIHx8CisgICAgICBWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OkZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZVZhbCkgeworICAgIFYtPnByaW50KE91dCk7CisgICAgcmV0dXJuOworICB9CisKKyAgY2hhciBQcmVmaXggPSAnJSc7CisgIGludCBTbG90OworICBpZiAoTWFjaGluZSkgeworICAgIGlmIChjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oVikpIHsKKyAgICAgIFNsb3QgPSBNYWNoaW5lLT5nZXRHbG9iYWxTbG90KEdWKTsKKyAgICAgIFByZWZpeCA9ICdAJzsKKyAgICB9IGVsc2UgeworICAgICAgU2xvdCA9IE1hY2hpbmUtPmdldExvY2FsU2xvdChWKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgTWFjaGluZSA9IGNyZWF0ZVNsb3RUcmFja2VyKFYpOworICAgIGlmIChNYWNoaW5lKSB7CisgICAgICBpZiAoY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KFYpKSB7CisgICAgICAgIFNsb3QgPSBNYWNoaW5lLT5nZXRHbG9iYWxTbG90KEdWKTsKKyAgICAgICAgUHJlZml4ID0gJ0AnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU2xvdCA9IE1hY2hpbmUtPmdldExvY2FsU2xvdChWKTsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBNYWNoaW5lOworICAgIH0gZWxzZSB7CisgICAgICBTbG90ID0gLTE7CisgICAgfQorICB9CisKKyAgaWYgKFNsb3QgIT0gLTEpCisgICAgT3V0IDw8IFByZWZpeCA8PCBTbG90OworICBlbHNlCisgICAgT3V0IDw8ICI8YmFkcmVmPiI7Cit9CisKK3ZvaWQgbGx2bTo6V3JpdGVBc09wZXJhbmQocmF3X29zdHJlYW0gJk91dCwgY29uc3QgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUHJpbnRUeXBlLCBjb25zdCBNb2R1bGUgKkNvbnRleHQpIHsKKworICAvLyBGYXN0IHBhdGg6IERvbid0IGNvbnN0cnVjdCBhbmQgcG9wdWxhdGUgYSBUeXBlUHJpbnRpbmcgb2JqZWN0IGlmIHdlCisgIC8vIHdvbid0IGJlIG5lZWRpbmcgYW55IHR5cGVzIHByaW50ZWQuCisgIGlmICghUHJpbnRUeXBlICYmCisgICAgICAoKCFpc2E8Q29uc3RhbnQ+KFYpICYmICFpc2E8TUROb2RlPihWKSkgfHwKKyAgICAgICBWLT5oYXNOYW1lKCkgfHwgaXNhPEdsb2JhbFZhbHVlPihWKSkpIHsKKyAgICBXcml0ZUFzT3BlcmFuZEludGVybmFsKE91dCwgViwgMCwgMCwgQ29udGV4dCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKENvbnRleHQgPT0gMCkgQ29udGV4dCA9IGdldE1vZHVsZUZyb21WYWwoVik7CisKKyAgVHlwZVByaW50aW5nIFR5cGVQcmludGVyOworICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gTnVtYmVyZWRUeXBlczsKKyAgQWRkTW9kdWxlVHlwZXNUb1ByaW50ZXIoVHlwZVByaW50ZXIsIE51bWJlcmVkVHlwZXMsIENvbnRleHQpOworICBpZiAoUHJpbnRUeXBlKSB7CisgICAgVHlwZVByaW50ZXIucHJpbnQoVi0+Z2V0VHlwZSgpLCBPdXQpOworICAgIE91dCA8PCAnICc7CisgIH0KKworICBXcml0ZUFzT3BlcmFuZEludGVybmFsKE91dCwgViwgJlR5cGVQcmludGVyLCAwLCBDb250ZXh0KTsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgQXNzZW1ibHlXcml0ZXIgeworICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk91dDsKKyAgU2xvdFRyYWNrZXIgJk1hY2hpbmU7CisgIGNvbnN0IE1vZHVsZSAqVGhlTW9kdWxlOworICBUeXBlUHJpbnRpbmcgVHlwZVByaW50ZXI7CisgIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlciAqQW5ub3RhdGlvbldyaXRlcjsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IE51bWJlcmVkVHlwZXM7CisgIAorcHVibGljOgorICBpbmxpbmUgQXNzZW1ibHlXcml0ZXIoZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZvLCBTbG90VHJhY2tlciAmTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyICpBQVcpCisgICAgOiBPdXQobyksIE1hY2hpbmUoTWFjKSwgVGhlTW9kdWxlKE0pLCBBbm5vdGF0aW9uV3JpdGVyKEFBVykgeworICAgIEFkZE1vZHVsZVR5cGVzVG9QcmludGVyKFR5cGVQcmludGVyLCBOdW1iZXJlZFR5cGVzLCBNKTsKKyAgfQorCisgIHZvaWQgcHJpbnRNRE5vZGVCb2R5KGNvbnN0IE1ETm9kZSAqTUQpOworICB2b2lkIHByaW50TmFtZWRNRE5vZGUoY29uc3QgTmFtZWRNRE5vZGUgKk5NRCk7CisgIAorICB2b2lkIHByaW50TW9kdWxlKGNvbnN0IE1vZHVsZSAqTSk7CisKKyAgdm9pZCB3cml0ZU9wZXJhbmQoY29uc3QgVmFsdWUgKk9wLCBib29sIFByaW50VHlwZSk7CisgIHZvaWQgd3JpdGVQYXJhbU9wZXJhbmQoY29uc3QgVmFsdWUgKk9wZXJhbmQsIEF0dHJpYnV0ZXMgQXR0cnMpOworCisgIHZvaWQgd3JpdGVBbGxNRE5vZGVzKCk7CisKKyAgdm9pZCBwcmludFR5cGVTeW1ib2xUYWJsZShjb25zdCBUeXBlU3ltYm9sVGFibGUgJlNUKTsKKyAgdm9pZCBwcmludEdsb2JhbChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpOworICB2b2lkIHByaW50QWxpYXMoY29uc3QgR2xvYmFsQWxpYXMgKkdWKTsKKyAgdm9pZCBwcmludEZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGKTsKKyAgdm9pZCBwcmludEFyZ3VtZW50KGNvbnN0IEFyZ3VtZW50ICpGQSwgQXR0cmlidXRlcyBBdHRycyk7CisgIHZvaWQgcHJpbnRCYXNpY0Jsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKyAgdm9pZCBwcmludEluc3RydWN0aW9uKGNvbnN0IEluc3RydWN0aW9uICZJKTsKKworcHJpdmF0ZToKKyAgLy8gcHJpbnRJbmZvQ29tbWVudCAtIFByaW50IGEgbGl0dGxlIGNvbW1lbnQgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIGluZGljYXRpbmcKKyAgLy8gd2hpY2ggc2xvdCBpdCBvY2N1cGllcy4KKyAgdm9pZCBwcmludEluZm9Db21tZW50KGNvbnN0IFZhbHVlICZWKTsKK307Cit9ICAvLyBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCit2b2lkIEFzc2VtYmx5V3JpdGVyOjp3cml0ZU9wZXJhbmQoY29uc3QgVmFsdWUgKk9wZXJhbmQsIGJvb2wgUHJpbnRUeXBlKSB7CisgIGlmIChPcGVyYW5kID09IDApIHsKKyAgICBPdXQgPDwgIjxudWxsIG9wZXJhbmQhPiI7CisgICAgcmV0dXJuOworICB9CisgIGlmIChQcmludFR5cGUpIHsKKyAgICBUeXBlUHJpbnRlci5wcmludChPcGVyYW5kLT5nZXRUeXBlKCksIE91dCk7CisgICAgT3V0IDw8ICcgJzsKKyAgfQorICBXcml0ZUFzT3BlcmFuZEludGVybmFsKE91dCwgT3BlcmFuZCwgJlR5cGVQcmludGVyLCAmTWFjaGluZSwgVGhlTW9kdWxlKTsKK30KKwordm9pZCBBc3NlbWJseVdyaXRlcjo6d3JpdGVQYXJhbU9wZXJhbmQoY29uc3QgVmFsdWUgKk9wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIEF0dHJzKSB7CisgIGlmIChPcGVyYW5kID09IDApIHsKKyAgICBPdXQgPDwgIjxudWxsIG9wZXJhbmQhPiI7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gUHJpbnQgdGhlIHR5cGUKKyAgVHlwZVByaW50ZXIucHJpbnQoT3BlcmFuZC0+Z2V0VHlwZSgpLCBPdXQpOworICAvLyBQcmludCBwYXJhbWV0ZXIgYXR0cmlidXRlcyBsaXN0CisgIGlmIChBdHRycyAhPSBBdHRyaWJ1dGU6Ok5vbmUpCisgICAgT3V0IDw8ICcgJyA8PCBBdHRyaWJ1dGU6OmdldEFzU3RyaW5nKEF0dHJzKTsKKyAgT3V0IDw8ICcgJzsKKyAgLy8gUHJpbnQgdGhlIG9wZXJhbmQKKyAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIE9wZXJhbmQsICZUeXBlUHJpbnRlciwgJk1hY2hpbmUsIFRoZU1vZHVsZSk7Cit9CisKK3ZvaWQgQXNzZW1ibHlXcml0ZXI6OnByaW50TW9kdWxlKGNvbnN0IE1vZHVsZSAqTSkgeworICBpZiAoIU0tPmdldE1vZHVsZUlkZW50aWZpZXIoKS5lbXB0eSgpICYmCisgICAgICAvLyBEb24ndCBwcmludCB0aGUgSUQgaWYgaXQgd2lsbCBzdGFydCBhIG5ldyBsaW5lICh3aGljaCB3b3VsZAorICAgICAgLy8gcmVxdWlyZSBhIGNvbW1lbnQgY2hhciBiZWZvcmUgaXQpLgorICAgICAgTS0+Z2V0TW9kdWxlSWRlbnRpZmllcigpLmZpbmQoJ1xuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgT3V0IDw8ICI7IE1vZHVsZUlEID0gJyIgPDwgTS0+Z2V0TW9kdWxlSWRlbnRpZmllcigpIDw8ICInXG4iOworCisgIGlmICghTS0+Z2V0RGF0YUxheW91dCgpLmVtcHR5KCkpCisgICAgT3V0IDw8ICJ0YXJnZXQgZGF0YWxheW91dCA9IFwiIiA8PCBNLT5nZXREYXRhTGF5b3V0KCkgPDwgIlwiXG4iOworICBpZiAoIU0tPmdldFRhcmdldFRyaXBsZSgpLmVtcHR5KCkpCisgICAgT3V0IDw8ICJ0YXJnZXQgdHJpcGxlID0gXCIiIDw8IE0tPmdldFRhcmdldFRyaXBsZSgpIDw8ICJcIlxuIjsKKworICBpZiAoIU0tPmdldE1vZHVsZUlubGluZUFzbSgpLmVtcHR5KCkpIHsKKyAgICAvLyBTcGxpdCB0aGUgc3RyaW5nIGludG8gbGluZXMsIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlYWQgdGhlIC5sbCBmaWxlLgorICAgIHN0ZDo6c3RyaW5nIEFzbSA9IE0tPmdldE1vZHVsZUlubGluZUFzbSgpOworICAgIHNpemVfdCBDdXJQb3MgPSAwOworICAgIHNpemVfdCBOZXdMaW5lID0gQXNtLmZpbmRfZmlyc3Rfb2YoJ1xuJywgQ3VyUG9zKTsKKyAgICBPdXQgPDwgJ1xuJzsKKyAgICB3aGlsZSAoTmV3TGluZSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgLy8gV2UgZm91bmQgYSBuZXdsaW5lLCBwcmludCB0aGUgcG9ydGlvbiBvZiB0aGUgYXNtIHN0cmluZyBmcm9tIHRoZQorICAgICAgLy8gbGFzdCBuZXdsaW5lIHVwIHRvIHRoaXMgbmV3bGluZS4KKyAgICAgIE91dCA8PCAibW9kdWxlIGFzbSBcIiI7CisgICAgICBQcmludEVzY2FwZWRTdHJpbmcoc3RkOjpzdHJpbmcoQXNtLmJlZ2luKCkrQ3VyUG9zLCBBc20uYmVnaW4oKStOZXdMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPdXQpOworICAgICAgT3V0IDw8ICJcIlxuIjsKKyAgICAgIEN1clBvcyA9IE5ld0xpbmUrMTsKKyAgICAgIE5ld0xpbmUgPSBBc20uZmluZF9maXJzdF9vZignXG4nLCBDdXJQb3MpOworICAgIH0KKyAgICBPdXQgPDwgIm1vZHVsZSBhc20gXCIiOworICAgIFByaW50RXNjYXBlZFN0cmluZyhzdGQ6OnN0cmluZyhBc20uYmVnaW4oKStDdXJQb3MsIEFzbS5lbmQoKSksIE91dCk7CisgICAgT3V0IDw8ICJcIlxuIjsKKyAgfQorCisgIC8vIExvb3Agb3ZlciB0aGUgZGVwZW5kZW50IGxpYnJhcmllcyBhbmQgZW1pdCB0aGVtLgorICBNb2R1bGU6OmxpYl9pdGVyYXRvciBMSSA9IE0tPmxpYl9iZWdpbigpOworICBNb2R1bGU6OmxpYl9pdGVyYXRvciBMRSA9IE0tPmxpYl9lbmQoKTsKKyAgaWYgKExJICE9IExFKSB7CisgICAgT3V0IDw8ICdcbic7CisgICAgT3V0IDw8ICJkZXBsaWJzID0gWyAiOworICAgIHdoaWxlIChMSSAhPSBMRSkgeworICAgICAgT3V0IDw8ICciJyA8PCAqTEkgPDwgJyInOworICAgICAgKytMSTsKKyAgICAgIGlmIChMSSAhPSBMRSkKKyAgICAgICAgT3V0IDw8ICIsICI7CisgICAgfQorICAgIE91dCA8PCAiIF0iOworICB9CisKKyAgLy8gTG9vcCBvdmVyIHRoZSBzeW1ib2wgdGFibGUsIGVtaXR0aW5nIGFsbCBpZCdkIHR5cGVzLgorICBpZiAoIU0tPmdldFR5cGVTeW1ib2xUYWJsZSgpLmVtcHR5KCkgfHwgIU51bWJlcmVkVHlwZXMuZW1wdHkoKSkgT3V0IDw8ICdcbic7CisgIHByaW50VHlwZVN5bWJvbFRhYmxlKE0tPmdldFR5cGVTeW1ib2xUYWJsZSgpKTsKKworICAvLyBPdXRwdXQgYWxsIGdsb2JhbHMuCisgIGlmICghTS0+Z2xvYmFsX2VtcHR5KCkpIE91dCA8PCAnXG4nOworICBmb3IgKE1vZHVsZTo6Y29uc3RfZ2xvYmFsX2l0ZXJhdG9yIEkgPSBNLT5nbG9iYWxfYmVnaW4oKSwgRSA9IE0tPmdsb2JhbF9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBwcmludEdsb2JhbChJKTsKKworICAvLyBPdXRwdXQgYWxsIGFsaWFzZXMuCisgIGlmICghTS0+YWxpYXNfZW1wdHkoKSkgT3V0IDw8ICJcbiI7CisgIGZvciAoTW9kdWxlOjpjb25zdF9hbGlhc19pdGVyYXRvciBJID0gTS0+YWxpYXNfYmVnaW4oKSwgRSA9IE0tPmFsaWFzX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIHByaW50QWxpYXMoSSk7CisKKyAgLy8gT3V0cHV0IGFsbCBvZiB0aGUgZnVuY3Rpb25zLgorICBmb3IgKE1vZHVsZTo6Y29uc3RfaXRlcmF0b3IgSSA9IE0tPmJlZ2luKCksIEUgPSBNLT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgcHJpbnRGdW5jdGlvbihJKTsKKworICAvLyBPdXRwdXQgbmFtZWQgbWV0YWRhdGEuCisgIGlmICghTS0+bmFtZWRfbWV0YWRhdGFfZW1wdHkoKSkgT3V0IDw8ICdcbic7CisgIAorICBmb3IgKE1vZHVsZTo6Y29uc3RfbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3IgSSA9IE0tPm5hbWVkX21ldGFkYXRhX2JlZ2luKCksCisgICAgICAgRSA9IE0tPm5hbWVkX21ldGFkYXRhX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBwcmludE5hbWVkTUROb2RlKEkpOworCisgIC8vIE91dHB1dCBtZXRhZGF0YS4KKyAgaWYgKCFNYWNoaW5lLm1kbl9lbXB0eSgpKSB7CisgICAgT3V0IDw8ICdcbic7CisgICAgd3JpdGVBbGxNRE5vZGVzKCk7CisgIH0KK30KKwordm9pZCBBc3NlbWJseVdyaXRlcjo6cHJpbnROYW1lZE1ETm9kZShjb25zdCBOYW1lZE1ETm9kZSAqTk1EKSB7CisgIE91dCA8PCAiISIgPDwgTk1ELT5nZXROYW1lKCkgPDwgIiA9ICF7IjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5NRC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoaSkgT3V0IDw8ICIsICI7CisgICAgT3V0IDw8ICchJyA8PCBNYWNoaW5lLmdldE1ldGFkYXRhU2xvdChOTUQtPmdldE9wZXJhbmQoaSkpOworICB9CisgIE91dCA8PCAifVxuIjsKK30KKworCitzdGF0aWMgdm9pZCBQcmludExpbmthZ2UoR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk91dCkgeworICBzd2l0Y2ggKExUKSB7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZTogYnJlYWs7CisgIGNhc2UgR2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlOiAgICAgICBPdXQgPDwgInByaXZhdGUgIjsgICAgICAgIGJyZWFrOworICBjYXNlIEdsb2JhbFZhbHVlOjpMaW5rZXJQcml2YXRlTGlua2FnZTogT3V0IDw8ICJsaW5rZXJfcHJpdmF0ZSAiOyBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua2VyUHJpdmF0ZVdlYWtMaW5rYWdlOgorICAgIE91dCA8PCAibGlua2VyX3ByaXZhdGVfd2VhayAiOworICAgIGJyZWFrOworICBjYXNlIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2U6ICAgICAgT3V0IDw8ICJpbnRlcm5hbCAiOyAgICAgICBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6TGlua09uY2VBbnlMaW5rYWdlOiAgIE91dCA8PCAibGlua29uY2UgIjsgICAgICAgYnJlYWs7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkxpbmtPbmNlT0RSTGlua2FnZTogICBPdXQgPDwgImxpbmtvbmNlX29kciAiOyAgIGJyZWFrOworICBjYXNlIEdsb2JhbFZhbHVlOjpXZWFrQW55TGlua2FnZTogICAgICAgT3V0IDw8ICJ3ZWFrICI7ICAgICAgICAgICBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6V2Vha09EUkxpbmthZ2U6ICAgICAgIE91dCA8PCAid2Vha19vZHIgIjsgICAgICAgYnJlYWs7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkNvbW1vbkxpbmthZ2U6ICAgICAgICBPdXQgPDwgImNvbW1vbiAiOyAgICAgICAgIGJyZWFrOworICBjYXNlIEdsb2JhbFZhbHVlOjpBcHBlbmRpbmdMaW5rYWdlOiAgICAgT3V0IDw8ICJhcHBlbmRpbmcgIjsgICAgICBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6RExMSW1wb3J0TGlua2FnZTogICAgIE91dCA8PCAiZGxsaW1wb3J0ICI7ICAgICAgYnJlYWs7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkRMTEV4cG9ydExpbmthZ2U6ICAgICBPdXQgPDwgImRsbGV4cG9ydCAiOyAgICAgIGJyZWFrOworICBjYXNlIEdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlOiAgT3V0IDw8ICJleHRlcm5fd2VhayAiOyAgICBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6QXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2U6CisgICAgT3V0IDw8ICJhdmFpbGFibGVfZXh0ZXJuYWxseSAiOworICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQgUHJpbnRWaXNpYmlsaXR5KEdsb2JhbFZhbHVlOjpWaXNpYmlsaXR5VHlwZXMgVmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmT3V0KSB7CisgIHN3aXRjaCAoVmlzKSB7CisgIGNhc2UgR2xvYmFsVmFsdWU6OkRlZmF1bHRWaXNpYmlsaXR5OiBicmVhazsKKyAgY2FzZSBHbG9iYWxWYWx1ZTo6SGlkZGVuVmlzaWJpbGl0eTogICAgT3V0IDw8ICJoaWRkZW4gIjsgYnJlYWs7CisgIGNhc2UgR2xvYmFsVmFsdWU6OlByb3RlY3RlZFZpc2liaWxpdHk6IE91dCA8PCAicHJvdGVjdGVkICI7IGJyZWFrOworICB9Cit9CisKK3ZvaWQgQXNzZW1ibHlXcml0ZXI6OnByaW50R2xvYmFsKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgeworICBpZiAoR1YtPmlzTWF0ZXJpYWxpemFibGUoKSkKKyAgICBPdXQgPDwgIjsgTWF0ZXJpYWxpemFibGVcbiI7CisKKyAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIEdWLCAmVHlwZVByaW50ZXIsICZNYWNoaW5lLCBHVi0+Z2V0UGFyZW50KCkpOworICBPdXQgPDwgIiA9ICI7CisKKyAgaWYgKCFHVi0+aGFzSW5pdGlhbGl6ZXIoKSAmJiBHVi0+aGFzRXh0ZXJuYWxMaW5rYWdlKCkpCisgICAgT3V0IDw8ICJleHRlcm5hbCAiOworCisgIFByaW50TGlua2FnZShHVi0+Z2V0TGlua2FnZSgpLCBPdXQpOworICBQcmludFZpc2liaWxpdHkoR1YtPmdldFZpc2liaWxpdHkoKSwgT3V0KTsKKworICBpZiAoR1YtPmlzVGhyZWFkTG9jYWwoKSkgT3V0IDw8ICJ0aHJlYWRfbG9jYWwgIjsKKyAgaWYgKHVuc2lnbmVkIEFkZHJlc3NTcGFjZSA9IEdWLT5nZXRUeXBlKCktPmdldEFkZHJlc3NTcGFjZSgpKQorICAgIE91dCA8PCAiYWRkcnNwYWNlKCIgPDwgQWRkcmVzc1NwYWNlIDw8ICIpICI7CisgIE91dCA8PCAoR1YtPmlzQ29uc3RhbnQoKSA/ICJjb25zdGFudCAiIDogImdsb2JhbCAiKTsKKyAgVHlwZVByaW50ZXIucHJpbnQoR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSwgT3V0KTsKKworICBpZiAoR1YtPmhhc0luaXRpYWxpemVyKCkpIHsKKyAgICBPdXQgPDwgJyAnOworICAgIHdyaXRlT3BlcmFuZChHVi0+Z2V0SW5pdGlhbGl6ZXIoKSwgZmFsc2UpOworICB9CisKKyAgaWYgKEdWLT5oYXNTZWN0aW9uKCkpIHsKKyAgICBPdXQgPDwgIiwgc2VjdGlvbiBcIiI7CisgICAgUHJpbnRFc2NhcGVkU3RyaW5nKEdWLT5nZXRTZWN0aW9uKCksIE91dCk7CisgICAgT3V0IDw8ICciJzsKKyAgfQorICBpZiAoR1YtPmdldEFsaWdubWVudCgpKQorICAgIE91dCA8PCAiLCBhbGlnbiAiIDw8IEdWLT5nZXRBbGlnbm1lbnQoKTsKKworICBwcmludEluZm9Db21tZW50KCpHVik7CisgIE91dCA8PCAnXG4nOworfQorCit2b2lkIEFzc2VtYmx5V3JpdGVyOjpwcmludEFsaWFzKGNvbnN0IEdsb2JhbEFsaWFzICpHQSkgeworICBpZiAoR0EtPmlzTWF0ZXJpYWxpemFibGUoKSkKKyAgICBPdXQgPDwgIjsgTWF0ZXJpYWxpemFibGVcbiI7CisKKyAgLy8gRG9uJ3QgY3Jhc2ggd2hlbiBkdW1waW5nIHBhcnRpYWxseSBidWlsdCBHQQorICBpZiAoIUdBLT5oYXNOYW1lKCkpCisgICAgT3V0IDw8ICI8PG5hbWVsZXNzPj4gPSAiOworICBlbHNlIHsKKyAgICBQcmludExMVk1OYW1lKE91dCwgR0EpOworICAgIE91dCA8PCAiID0gIjsKKyAgfQorICBQcmludFZpc2liaWxpdHkoR0EtPmdldFZpc2liaWxpdHkoKSwgT3V0KTsKKworICBPdXQgPDwgImFsaWFzICI7CisKKyAgUHJpbnRMaW5rYWdlKEdBLT5nZXRMaW5rYWdlKCksIE91dCk7CisKKyAgY29uc3QgQ29uc3RhbnQgKkFsaWFzZWUgPSBHQS0+Z2V0QWxpYXNlZSgpOworCisgIGlmIChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oQWxpYXNlZSkpIHsKKyAgICBUeXBlUHJpbnRlci5wcmludChHVi0+Z2V0VHlwZSgpLCBPdXQpOworICAgIE91dCA8PCAnICc7CisgICAgUHJpbnRMTFZNTmFtZShPdXQsIEdWKTsKKyAgfSBlbHNlIGlmIChjb25zdCBGdW5jdGlvbiAqRiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihBbGlhc2VlKSkgeworICAgIFR5cGVQcmludGVyLnByaW50KEYtPmdldEZ1bmN0aW9uVHlwZSgpLCBPdXQpOworICAgIE91dCA8PCAiKiAiOworCisgICAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIEYsICZUeXBlUHJpbnRlciwgJk1hY2hpbmUsIEYtPmdldFBhcmVudCgpKTsKKyAgfSBlbHNlIGlmIChjb25zdCBHbG9iYWxBbGlhcyAqR0EgPSBkeW5fY2FzdDxHbG9iYWxBbGlhcz4oQWxpYXNlZSkpIHsKKyAgICBUeXBlUHJpbnRlci5wcmludChHQS0+Z2V0VHlwZSgpLCBPdXQpOworICAgIE91dCA8PCAnICc7CisgICAgUHJpbnRMTFZNTmFtZShPdXQsIEdBKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBDb25zdGFudEV4cHIgKkNFID0gY2FzdDxDb25zdGFudEV4cHI+KEFsaWFzZWUpOworICAgIC8vIFRoZSBvbmx5IHZhbGlkIEdFUCBpcyBhbiBhbGwgemVybyBHRVAuCisgICAgYXNzZXJ0KChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QgfHwKKyAgICAgICAgICAgIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cikgJiYKKyAgICAgICAgICAgIlVuc3VwcG9ydGVkIGFsaWFzZWUiKTsKKyAgICB3cml0ZU9wZXJhbmQoQ0UsIGZhbHNlKTsKKyAgfQorCisgIHByaW50SW5mb0NvbW1lbnQoKkdBKTsKKyAgT3V0IDw8ICdcbic7Cit9CisKK3ZvaWQgQXNzZW1ibHlXcml0ZXI6OnByaW50VHlwZVN5bWJvbFRhYmxlKGNvbnN0IFR5cGVTeW1ib2xUYWJsZSAmU1QpIHsKKyAgLy8gRW1pdCBhbGwgbnVtYmVyZWQgdHlwZXMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1iZXJlZFR5cGVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBPdXQgPDwgJyUnIDw8IGkgPDwgIiA9IHR5cGUgIjsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBwcmludCBvdXQgYXQgbGVhc3Qgb25lIGxldmVsIG9mIHRoZSB0eXBlIHN0cnVjdHVyZSwgc28KKyAgICAvLyB0aGF0IHdlIGRvIG5vdCBnZXQgJTIgPSB0eXBlICUyCisgICAgVHlwZVByaW50ZXIucHJpbnRBdExlYXN0T25lTGV2ZWwoTnVtYmVyZWRUeXBlc1tpXSwgT3V0KTsKKyAgICBPdXQgPDwgJ1xuJzsKKyAgfQorCisgIC8vIFByaW50IHRoZSBuYW1lZCB0eXBlcy4KKyAgZm9yIChUeXBlU3ltYm9sVGFibGU6OmNvbnN0X2l0ZXJhdG9yIFRJID0gU1QuYmVnaW4oKSwgVEUgPSBTVC5lbmQoKTsKKyAgICAgICBUSSAhPSBURTsgKytUSSkgeworICAgIFByaW50TExWTU5hbWUoT3V0LCBUSS0+Zmlyc3QsIExvY2FsUHJlZml4KTsKKyAgICBPdXQgPDwgIiA9IHR5cGUgIjsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBwcmludCBvdXQgYXQgbGVhc3Qgb25lIGxldmVsIG9mIHRoZSB0eXBlIHN0cnVjdHVyZSwgc28KKyAgICAvLyB0aGF0IHdlIGRvIG5vdCBnZXQgJUZJTEUgPSB0eXBlICVGSUxFCisgICAgVHlwZVByaW50ZXIucHJpbnRBdExlYXN0T25lTGV2ZWwoVEktPnNlY29uZCwgT3V0KTsKKyAgICBPdXQgPDwgJ1xuJzsKKyAgfQorfQorCisvLy8gcHJpbnRGdW5jdGlvbiAtIFByaW50IGFsbCBhc3BlY3RzIG9mIGEgZnVuY3Rpb24uCisvLy8KK3ZvaWQgQXNzZW1ibHlXcml0ZXI6OnByaW50RnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgLy8gUHJpbnQgb3V0IHRoZSByZXR1cm4gdHlwZSBhbmQgbmFtZS4KKyAgT3V0IDw8ICdcbic7CisKKyAgaWYgKEFubm90YXRpb25Xcml0ZXIpIEFubm90YXRpb25Xcml0ZXItPmVtaXRGdW5jdGlvbkFubm90KEYsIE91dCk7CisKKyAgaWYgKEYtPmlzTWF0ZXJpYWxpemFibGUoKSkKKyAgICBPdXQgPDwgIjsgTWF0ZXJpYWxpemFibGVcbiI7CisKKyAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSkKKyAgICBPdXQgPDwgImRlY2xhcmUgIjsKKyAgZWxzZQorICAgIE91dCA8PCAiZGVmaW5lICI7CisKKyAgUHJpbnRMaW5rYWdlKEYtPmdldExpbmthZ2UoKSwgT3V0KTsKKyAgUHJpbnRWaXNpYmlsaXR5KEYtPmdldFZpc2liaWxpdHkoKSwgT3V0KTsKKworICAvLyBQcmludCB0aGUgY2FsbGluZyBjb252ZW50aW9uLgorICBzd2l0Y2ggKEYtPmdldENhbGxpbmdDb252KCkpIHsKKyAgY2FzZSBDYWxsaW5nQ29udjo6QzogYnJlYWs7ICAgLy8gZGVmYXVsdAorICBjYXNlIENhbGxpbmdDb252OjpGYXN0OiAgICAgICAgIE91dCA8PCAiZmFzdGNjICI7IGJyZWFrOworICBjYXNlIENhbGxpbmdDb252OjpDb2xkOiAgICAgICAgIE91dCA8PCAiY29sZGNjICI7IGJyZWFrOworICBjYXNlIENhbGxpbmdDb252OjpYODZfU3RkQ2FsbDogIE91dCA8PCAieDg2X3N0ZGNhbGxjYyAiOyBicmVhazsKKyAgY2FzZSBDYWxsaW5nQ29udjo6WDg2X0Zhc3RDYWxsOiBPdXQgPDwgIng4Nl9mYXN0Y2FsbGNjICI7IGJyZWFrOworICBjYXNlIENhbGxpbmdDb252OjpYODZfVGhpc0NhbGw6IE91dCA8PCAieDg2X3RoaXNjYWxsY2MgIjsgYnJlYWs7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkFSTV9BUENTOiAgICAgT3V0IDw8ICJhcm1fYXBjc2NjICI7IGJyZWFrOworICBjYXNlIENhbGxpbmdDb252OjpBUk1fQUFQQ1M6ICAgIE91dCA8PCAiYXJtX2FhcGNzY2MgIjsgYnJlYWs7CisgIGNhc2UgQ2FsbGluZ0NvbnY6OkFSTV9BQVBDU19WRlA6T3V0IDw8ICJhcm1fYWFwY3NfdmZwY2MgIjsgYnJlYWs7CisgIGNhc2UgQ2FsbGluZ0NvbnY6Ok1TUDQzMF9JTlRSOiAgT3V0IDw8ICJtc3A0MzBfaW50cmNjICI7IGJyZWFrOworICBkZWZhdWx0OiBPdXQgPDwgImNjIiA8PCBGLT5nZXRDYWxsaW5nQ29udigpIDw8ICIgIjsgYnJlYWs7CisgIH0KKworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUID0gRi0+Z2V0RnVuY3Rpb25UeXBlKCk7CisgIGNvbnN0IEF0dHJMaXN0UHRyICZBdHRycyA9IEYtPmdldEF0dHJpYnV0ZXMoKTsKKyAgQXR0cmlidXRlcyBSZXRBdHRycyA9IEF0dHJzLmdldFJldEF0dHJpYnV0ZXMoKTsKKyAgaWYgKFJldEF0dHJzICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICBPdXQgPDwgIEF0dHJpYnV0ZTo6Z2V0QXNTdHJpbmcoQXR0cnMuZ2V0UmV0QXR0cmlidXRlcygpKSA8PCAnICc7CisgIFR5cGVQcmludGVyLnByaW50KEYtPmdldFJldHVyblR5cGUoKSwgT3V0KTsKKyAgT3V0IDw8ICcgJzsKKyAgV3JpdGVBc09wZXJhbmRJbnRlcm5hbChPdXQsIEYsICZUeXBlUHJpbnRlciwgJk1hY2hpbmUsIEYtPmdldFBhcmVudCgpKTsKKyAgT3V0IDw8ICcoJzsKKyAgTWFjaGluZS5pbmNvcnBvcmF0ZUZ1bmN0aW9uKEYpOworCisgIC8vIExvb3Agb3ZlciB0aGUgYXJndW1lbnRzLCBwcmludGluZyB0aGVtLi4uCisKKyAgdW5zaWduZWQgSWR4ID0gMTsKKyAgaWYgKCFGLT5pc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAvLyBJZiB0aGlzIGlzbid0IGEgZGVjbGFyYXRpb24sIHByaW50IHRoZSBhcmd1bWVudCBuYW1lcyBhcyB3ZWxsLgorICAgIGZvciAoRnVuY3Rpb246OmNvbnN0X2FyZ19pdGVyYXRvciBJID0gRi0+YXJnX2JlZ2luKCksIEUgPSBGLT5hcmdfZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgLy8gSW5zZXJ0IGNvbW1hcyBhcyB3ZSBnby4uLiB0aGUgZmlyc3QgYXJnIGRvZXNuJ3QgZ2V0IGEgY29tbWEKKyAgICAgIGlmIChJICE9IEYtPmFyZ19iZWdpbigpKSBPdXQgPDwgIiwgIjsKKyAgICAgIHByaW50QXJndW1lbnQoSSwgQXR0cnMuZ2V0UGFyYW1BdHRyaWJ1dGVzKElkeCkpOworICAgICAgSWR4Kys7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIE90aGVyd2lzZSwgcHJpbnQgdGhlIHR5cGVzIGZyb20gdGhlIGZ1bmN0aW9uIHR5cGUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIC8vIEluc2VydCBjb21tYXMgYXMgd2UgZ28uLi4gdGhlIGZpcnN0IGFyZyBkb2Vzbid0IGdldCBhIGNvbW1hCisgICAgICBpZiAoaSkgT3V0IDw8ICIsICI7CisKKyAgICAgIC8vIE91dHB1dCB0eXBlLi4uCisgICAgICBUeXBlUHJpbnRlci5wcmludChGVC0+Z2V0UGFyYW1UeXBlKGkpLCBPdXQpOworCisgICAgICBBdHRyaWJ1dGVzIEFyZ0F0dHJzID0gQXR0cnMuZ2V0UGFyYW1BdHRyaWJ1dGVzKGkrMSk7CisgICAgICBpZiAoQXJnQXR0cnMgIT0gQXR0cmlidXRlOjpOb25lKQorICAgICAgICBPdXQgPDwgJyAnIDw8IEF0dHJpYnV0ZTo6Z2V0QXNTdHJpbmcoQXJnQXR0cnMpOworICAgIH0KKyAgfQorCisgIC8vIEZpbmlzaCBwcmludGluZyBhcmd1bWVudHMuLi4KKyAgaWYgKEZULT5pc1ZhckFyZygpKSB7CisgICAgaWYgKEZULT5nZXROdW1QYXJhbXMoKSkgT3V0IDw8ICIsICI7CisgICAgT3V0IDw8ICIuLi4iOyAgLy8gT3V0cHV0IHZhcmFyZ3MgcG9ydGlvbiBvZiBzaWduYXR1cmUhCisgIH0KKyAgT3V0IDw8ICcpJzsKKyAgQXR0cmlidXRlcyBGbkF0dHJzID0gQXR0cnMuZ2V0Rm5BdHRyaWJ1dGVzKCk7CisgIGlmIChGbkF0dHJzICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICBPdXQgPDwgJyAnIDw8IEF0dHJpYnV0ZTo6Z2V0QXNTdHJpbmcoQXR0cnMuZ2V0Rm5BdHRyaWJ1dGVzKCkpOworICBpZiAoRi0+aGFzU2VjdGlvbigpKSB7CisgICAgT3V0IDw8ICIgc2VjdGlvbiBcIiI7CisgICAgUHJpbnRFc2NhcGVkU3RyaW5nKEYtPmdldFNlY3Rpb24oKSwgT3V0KTsKKyAgICBPdXQgPDwgJyInOworICB9CisgIGlmIChGLT5nZXRBbGlnbm1lbnQoKSkKKyAgICBPdXQgPDwgIiBhbGlnbiAiIDw8IEYtPmdldEFsaWdubWVudCgpOworICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpKSB7CisgICAgT3V0IDw8ICJcbiI7CisgIH0gZWxzZSB7CisgICAgT3V0IDw8ICIgeyI7CisKKyAgICAvLyBPdXRwdXQgYWxsIG9mIGl0cyBiYXNpYyBibG9ja3MuLi4gZm9yIHRoZSBmdW5jdGlvbgorICAgIGZvciAoRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yIEkgPSBGLT5iZWdpbigpLCBFID0gRi0+ZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgcHJpbnRCYXNpY0Jsb2NrKEkpOworCisgICAgT3V0IDw8ICJ9XG4iOworICB9CisKKyAgTWFjaGluZS5wdXJnZUZ1bmN0aW9uKCk7Cit9CisKKy8vLyBwcmludEFyZ3VtZW50IC0gVGhpcyBtZW1iZXIgaXMgY2FsbGVkIGZvciBldmVyeSBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCBpbnRvCisvLy8gdGhlIGZ1bmN0aW9uLiAgU2ltcGx5IHByaW50IGl0IG91dAorLy8vCit2b2lkIEFzc2VtYmx5V3JpdGVyOjpwcmludEFyZ3VtZW50KGNvbnN0IEFyZ3VtZW50ICpBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgQXR0cnMpIHsKKyAgLy8gT3V0cHV0IHR5cGUuLi4KKyAgVHlwZVByaW50ZXIucHJpbnQoQXJnLT5nZXRUeXBlKCksIE91dCk7CisKKyAgLy8gT3V0cHV0IHBhcmFtZXRlciBhdHRyaWJ1dGVzIGxpc3QKKyAgaWYgKEF0dHJzICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICBPdXQgPDwgJyAnIDw8IEF0dHJpYnV0ZTo6Z2V0QXNTdHJpbmcoQXR0cnMpOworCisgIC8vIE91dHB1dCBuYW1lLCBpZiBhdmFpbGFibGUuLi4KKyAgaWYgKEFyZy0+aGFzTmFtZSgpKSB7CisgICAgT3V0IDw8ICcgJzsKKyAgICBQcmludExMVk1OYW1lKE91dCwgQXJnKTsKKyAgfQorfQorCisvLy8gcHJpbnRCYXNpY0Jsb2NrIC0gVGhpcyBtZW1iZXIgaXMgY2FsbGVkIGZvciBlYWNoIGJhc2ljIGJsb2NrIGluIGEgbWV0aG9kLgorLy8vCit2b2lkIEFzc2VtYmx5V3JpdGVyOjpwcmludEJhc2ljQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgaWYgKEJCLT5oYXNOYW1lKCkpIHsgICAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgbGFiZWwgaWYgaXQgZXhpc3RzLi4uCisgICAgT3V0IDw8ICJcbiI7CisgICAgUHJpbnRMTFZNTmFtZShPdXQsIEJCLT5nZXROYW1lKCksIExhYmVsUHJlZml4KTsKKyAgICBPdXQgPDwgJzonOworICB9IGVsc2UgaWYgKCFCQi0+dXNlX2VtcHR5KCkpIHsgICAgICAvLyBEb24ndCBwcmludCBibG9jayAjIG9mIG5vIHVzZXMuLi4KKyAgICBPdXQgPDwgIlxuOyA8bGFiZWw+OiI7CisgICAgaW50IFNsb3QgPSBNYWNoaW5lLmdldExvY2FsU2xvdChCQik7CisgICAgaWYgKFNsb3QgIT0gLTEpCisgICAgICBPdXQgPDwgU2xvdDsKKyAgICBlbHNlCisgICAgICBPdXQgPDwgIjxiYWRyZWY+IjsKKyAgfQorCisgIGlmIChCQi0+Z2V0UGFyZW50KCkgPT0gMCkgeworICAgIE91dC5QYWRUb0NvbHVtbig1MCk7CisgICAgT3V0IDw8ICI7IEVycm9yOiBCbG9jayB3aXRob3V0IHBhcmVudCEiOworICB9IGVsc2UgaWYgKEJCICE9ICZCQi0+Z2V0UGFyZW50KCktPmdldEVudHJ5QmxvY2soKSkgeyAgLy8gTm90IHRoZSBlbnRyeSBibG9jaz8KKyAgICAvLyBPdXRwdXQgcHJlZGVjZXNzb3JzIGZvciB0aGUgYmxvY2suLi4KKyAgICBPdXQuUGFkVG9Db2x1bW4oNTApOworICAgIE91dCA8PCAiOyI7CisgICAgY29uc3RfcHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oQkIpLCBQRSA9IHByZWRfZW5kKEJCKTsKKworICAgIGlmIChQSSA9PSBQRSkgeworICAgICAgT3V0IDw8ICIgTm8gcHJlZGVjZXNzb3JzISI7CisgICAgfSBlbHNlIHsKKyAgICAgIE91dCA8PCAiIHByZWRzID0gIjsKKyAgICAgIHdyaXRlT3BlcmFuZCgqUEksIGZhbHNlKTsKKyAgICAgIGZvciAoKytQSTsgUEkgIT0gUEU7ICsrUEkpIHsKKyAgICAgICAgT3V0IDw8ICIsICI7CisgICAgICAgIHdyaXRlT3BlcmFuZCgqUEksIGZhbHNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBPdXQgPDwgIlxuIjsKKworICBpZiAoQW5ub3RhdGlvbldyaXRlcikgQW5ub3RhdGlvbldyaXRlci0+ZW1pdEJhc2ljQmxvY2tTdGFydEFubm90KEJCLCBPdXQpOworCisgIC8vIE91dHB1dCBhbGwgb2YgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgYmFzaWMgYmxvY2suLi4KKyAgZm9yIChCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBJID0gQkItPmJlZ2luKCksIEUgPSBCQi0+ZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgcHJpbnRJbnN0cnVjdGlvbigqSSk7CisgICAgT3V0IDw8ICdcbic7CisgIH0KKworICBpZiAoQW5ub3RhdGlvbldyaXRlcikgQW5ub3RhdGlvbldyaXRlci0+ZW1pdEJhc2ljQmxvY2tFbmRBbm5vdChCQiwgT3V0KTsKK30KKworLy8vIHByaW50SW5mb0NvbW1lbnQgLSBQcmludCBhIGxpdHRsZSBjb21tZW50IGFmdGVyIHRoZSBpbnN0cnVjdGlvbiBpbmRpY2F0aW5nCisvLy8gd2hpY2ggc2xvdCBpdCBvY2N1cGllcy4KKy8vLwordm9pZCBBc3NlbWJseVdyaXRlcjo6cHJpbnRJbmZvQ29tbWVudChjb25zdCBWYWx1ZSAmVikgeworICBpZiAoQW5ub3RhdGlvbldyaXRlcikgeworICAgIEFubm90YXRpb25Xcml0ZXItPnByaW50SW5mb0NvbW1lbnQoViwgT3V0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoVi5nZXRUeXBlKCktPmlzVm9pZFR5KCkpIHJldHVybjsKKyAgCisgIE91dC5QYWRUb0NvbHVtbig1MCk7CisgIE91dCA8PCAiOyA8IjsKKyAgVHlwZVByaW50ZXIucHJpbnQoVi5nZXRUeXBlKCksIE91dCk7CisgIE91dCA8PCAiPiBbI3VzZXM9IiA8PCBWLmdldE51bVVzZXMoKSA8PCAnXSc7ICAvLyBPdXRwdXQgIyB1c2VzCit9CisKKy8vIFRoaXMgbWVtYmVyIGlzIGNhbGxlZCBmb3IgZWFjaCBJbnN0cnVjdGlvbiBpbiBhIGZ1bmN0aW9uLi4KK3ZvaWQgQXNzZW1ibHlXcml0ZXI6OnByaW50SW5zdHJ1Y3Rpb24oY29uc3QgSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgaWYgKEFubm90YXRpb25Xcml0ZXIpIEFubm90YXRpb25Xcml0ZXItPmVtaXRJbnN0cnVjdGlvbkFubm90KCZJLCBPdXQpOworCisgIC8vIFByaW50IG91dCBpbmRlbnRhdGlvbiBmb3IgYW4gaW5zdHJ1Y3Rpb24uCisgIE91dCA8PCAiICAiOworCisgIC8vIFByaW50IG91dCBuYW1lIGlmIGl0IGV4aXN0cy4uLgorICBpZiAoSS5oYXNOYW1lKCkpIHsKKyAgICBQcmludExMVk1OYW1lKE91dCwgJkkpOworICAgIE91dCA8PCAiID0gIjsKKyAgfSBlbHNlIGlmICghSS5nZXRUeXBlKCktPmlzVm9pZFR5KCkpIHsKKyAgICAvLyBQcmludCBvdXQgdGhlIGRlZiBzbG90IHRha2VuLgorICAgIGludCBTbG90TnVtID0gTWFjaGluZS5nZXRMb2NhbFNsb3QoJkkpOworICAgIGlmIChTbG90TnVtID09IC0xKQorICAgICAgT3V0IDw8ICI8YmFkcmVmPiA9ICI7CisgICAgZWxzZQorICAgICAgT3V0IDw8ICclJyA8PCBTbG90TnVtIDw8ICIgPSAiOworICB9CisKKyAgLy8gSWYgdGhpcyBpcyBhIHZvbGF0aWxlIGxvYWQgb3Igc3RvcmUsIHByaW50IG91dCB0aGUgdm9sYXRpbGUgbWFya2VyLgorICBpZiAoKGlzYTxMb2FkSW5zdD4oSSkgICYmIGNhc3Q8TG9hZEluc3Q+KEkpLmlzVm9sYXRpbGUoKSkgfHwKKyAgICAgIChpc2E8U3RvcmVJbnN0PihJKSAmJiBjYXN0PFN0b3JlSW5zdD4oSSkuaXNWb2xhdGlsZSgpKSkgeworICAgICAgT3V0IDw8ICJ2b2xhdGlsZSAiOworICB9IGVsc2UgaWYgKGlzYTxDYWxsSW5zdD4oSSkgJiYgY2FzdDxDYWxsSW5zdD4oSSkuaXNUYWlsQ2FsbCgpKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhIGNhbGwsIGNoZWNrIGlmIGl0J3MgYSB0YWlsIGNhbGwuCisgICAgT3V0IDw8ICJ0YWlsICI7CisgIH0KKworICAvLyBQcmludCBvdXQgdGhlIG9wY29kZS4uLgorICBPdXQgPDwgSS5nZXRPcGNvZGVOYW1lKCk7CisKKyAgLy8gUHJpbnQgb3V0IG9wdGltaXphdGlvbiBpbmZvcm1hdGlvbi4KKyAgV3JpdGVPcHRpbWl6YXRpb25JbmZvKE91dCwgJkkpOworCisgIC8vIFByaW50IG91dCB0aGUgY29tcGFyZSBpbnN0cnVjdGlvbiBwcmVkaWNhdGVzCisgIGlmIChjb25zdCBDbXBJbnN0ICpDSSA9IGR5bl9jYXN0PENtcEluc3Q+KCZJKSkKKyAgICBPdXQgPDwgJyAnIDw8IGdldFByZWRpY2F0ZVRleHQoQ0ktPmdldFByZWRpY2F0ZSgpKTsKKworICAvLyBQcmludCBvdXQgdGhlIHR5cGUgb2YgdGhlIG9wZXJhbmRzLi4uCisgIGNvbnN0IFZhbHVlICpPcGVyYW5kID0gSS5nZXROdW1PcGVyYW5kcygpID8gSS5nZXRPcGVyYW5kKDApIDogMDsKKworICAvLyBTcGVjaWFsIGNhc2UgY29uZGl0aW9uYWwgYnJhbmNoZXMgdG8gc3dpenpsZSB0aGUgY29uZGl0aW9uIG91dCB0byB0aGUgZnJvbnQKKyAgaWYgKGlzYTxCcmFuY2hJbnN0PihJKSAmJiBjYXN0PEJyYW5jaEluc3Q+KEkpLmlzQ29uZGl0aW9uYWwoKSkgeworICAgIEJyYW5jaEluc3QgJkJJKGNhc3Q8QnJhbmNoSW5zdD4oSSkpOworICAgIE91dCA8PCAnICc7CisgICAgd3JpdGVPcGVyYW5kKEJJLmdldENvbmRpdGlvbigpLCB0cnVlKTsKKyAgICBPdXQgPDwgIiwgIjsKKyAgICB3cml0ZU9wZXJhbmQoQkkuZ2V0U3VjY2Vzc29yKDApLCB0cnVlKTsKKyAgICBPdXQgPDwgIiwgIjsKKyAgICB3cml0ZU9wZXJhbmQoQkkuZ2V0U3VjY2Vzc29yKDEpLCB0cnVlKTsKKworICB9IGVsc2UgaWYgKGlzYTxTd2l0Y2hJbnN0PihJKSkgeworICAgIC8vIFNwZWNpYWwgY2FzZSBzd2l0Y2ggaW5zdHJ1Y3Rpb24gdG8gZ2V0IGZvcm1hdHRpbmcgbmljZSBhbmQgY29ycmVjdC4KKyAgICBPdXQgPDwgJyAnOworICAgIHdyaXRlT3BlcmFuZChPcGVyYW5kICAgICAgICAsIHRydWUpOworICAgIE91dCA8PCAiLCAiOworICAgIHdyaXRlT3BlcmFuZChJLmdldE9wZXJhbmQoMSksIHRydWUpOworICAgIE91dCA8PCAiIFsiOworCisgICAgZm9yICh1bnNpZ25lZCBvcCA9IDIsIEVvcCA9IEkuZ2V0TnVtT3BlcmFuZHMoKTsgb3AgPCBFb3A7IG9wICs9IDIpIHsKKyAgICAgIE91dCA8PCAiXG4gICAgIjsKKyAgICAgIHdyaXRlT3BlcmFuZChJLmdldE9wZXJhbmQob3AgICksIHRydWUpOworICAgICAgT3V0IDw8ICIsICI7CisgICAgICB3cml0ZU9wZXJhbmQoSS5nZXRPcGVyYW5kKG9wKzEpLCB0cnVlKTsKKyAgICB9CisgICAgT3V0IDw8ICJcbiAgXSI7CisgIH0gZWxzZSBpZiAoaXNhPEluZGlyZWN0QnJJbnN0PihJKSkgeworICAgIC8vIFNwZWNpYWwgY2FzZSBpbmRpcmVjdGJyIGluc3RydWN0aW9uIHRvIGdldCBmb3JtYXR0aW5nIG5pY2UgYW5kIGNvcnJlY3QuCisgICAgT3V0IDw8ICcgJzsKKyAgICB3cml0ZU9wZXJhbmQoT3BlcmFuZCwgdHJ1ZSk7CisgICAgT3V0IDw8ICIsIFsiOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBJLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoaSAhPSAxKQorICAgICAgICBPdXQgPDwgIiwgIjsKKyAgICAgIHdyaXRlT3BlcmFuZChJLmdldE9wZXJhbmQoaSksIHRydWUpOworICAgIH0KKyAgICBPdXQgPDwgJ10nOworICB9IGVsc2UgaWYgKGlzYTxQSElOb2RlPihJKSkgeworICAgIE91dCA8PCAnICc7CisgICAgVHlwZVByaW50ZXIucHJpbnQoSS5nZXRUeXBlKCksIE91dCk7CisgICAgT3V0IDw8ICcgJzsKKworICAgIGZvciAodW5zaWduZWQgb3AgPSAwLCBFb3AgPSBJLmdldE51bU9wZXJhbmRzKCk7IG9wIDwgRW9wOyBvcCArPSAyKSB7CisgICAgICBpZiAob3ApIE91dCA8PCAiLCAiOworICAgICAgT3V0IDw8ICJbICI7CisgICAgICB3cml0ZU9wZXJhbmQoSS5nZXRPcGVyYW5kKG9wICApLCBmYWxzZSk7IE91dCA8PCAiLCAiOworICAgICAgd3JpdGVPcGVyYW5kKEkuZ2V0T3BlcmFuZChvcCsxKSwgZmFsc2UpOyBPdXQgPDwgIiBdIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoY29uc3QgRXh0cmFjdFZhbHVlSW5zdCAqRVZJID0gZHluX2Nhc3Q8RXh0cmFjdFZhbHVlSW5zdD4oJkkpKSB7CisgICAgT3V0IDw8ICcgJzsKKyAgICB3cml0ZU9wZXJhbmQoSS5nZXRPcGVyYW5kKDApLCB0cnVlKTsKKyAgICBmb3IgKGNvbnN0IHVuc2lnbmVkICppID0gRVZJLT5pZHhfYmVnaW4oKSwgKmUgPSBFVkktPmlkeF9lbmQoKTsgaSAhPSBlOyArK2kpCisgICAgICBPdXQgPDwgIiwgIiA8PCAqaTsKKyAgfSBlbHNlIGlmIChjb25zdCBJbnNlcnRWYWx1ZUluc3QgKklWSSA9IGR5bl9jYXN0PEluc2VydFZhbHVlSW5zdD4oJkkpKSB7CisgICAgT3V0IDw8ICcgJzsKKyAgICB3cml0ZU9wZXJhbmQoSS5nZXRPcGVyYW5kKDApLCB0cnVlKTsgT3V0IDw8ICIsICI7CisgICAgd3JpdGVPcGVyYW5kKEkuZ2V0T3BlcmFuZCgxKSwgdHJ1ZSk7CisgICAgZm9yIChjb25zdCB1bnNpZ25lZCAqaSA9IElWSS0+aWR4X2JlZ2luKCksICplID0gSVZJLT5pZHhfZW5kKCk7IGkgIT0gZTsgKytpKQorICAgICAgT3V0IDw8ICIsICIgPDwgKmk7CisgIH0gZWxzZSBpZiAoaXNhPFJldHVybkluc3Q+KEkpICYmICFPcGVyYW5kKSB7CisgICAgT3V0IDw8ICIgdm9pZCI7CisgIH0gZWxzZSBpZiAoY29uc3QgQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KCZJKSkgeworICAgIC8vIFByaW50IHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gYmVpbmcgdXNlZC4KKyAgICBzd2l0Y2ggKENJLT5nZXRDYWxsaW5nQ29udigpKSB7CisgICAgY2FzZSBDYWxsaW5nQ29udjo6QzogYnJlYWs7ICAgLy8gZGVmYXVsdAorICAgIGNhc2UgQ2FsbGluZ0NvbnY6OkZhc3Q6ICBPdXQgPDwgIiBmYXN0Y2MiOyBicmVhazsKKyAgICBjYXNlIENhbGxpbmdDb252OjpDb2xkOiAgT3V0IDw8ICIgY29sZGNjIjsgYnJlYWs7CisgICAgY2FzZSBDYWxsaW5nQ29udjo6WDg2X1N0ZENhbGw6ICBPdXQgPDwgIiB4ODZfc3RkY2FsbGNjIjsgYnJlYWs7CisgICAgY2FzZSBDYWxsaW5nQ29udjo6WDg2X0Zhc3RDYWxsOiBPdXQgPDwgIiB4ODZfZmFzdGNhbGxjYyI7IGJyZWFrOworICAgIGNhc2UgQ2FsbGluZ0NvbnY6Olg4Nl9UaGlzQ2FsbDogT3V0IDw8ICIgeDg2X3RoaXNjYWxsY2MiOyBicmVhazsKKyAgICBjYXNlIENhbGxpbmdDb252OjpBUk1fQVBDUzogICAgIE91dCA8PCAiIGFybV9hcGNzY2MgIjsgYnJlYWs7CisgICAgY2FzZSBDYWxsaW5nQ29udjo6QVJNX0FBUENTOiAgICBPdXQgPDwgIiBhcm1fYWFwY3NjYyAiOyBicmVhazsKKyAgICBjYXNlIENhbGxpbmdDb252OjpBUk1fQUFQQ1NfVkZQOk91dCA8PCAiIGFybV9hYXBjc192ZnBjYyAiOyBicmVhazsKKyAgICBjYXNlIENhbGxpbmdDb252OjpNU1A0MzBfSU5UUjogIE91dCA8PCAiIG1zcDQzMF9pbnRyY2MgIjsgYnJlYWs7CisgICAgZGVmYXVsdDogT3V0IDw8ICIgY2MiIDw8IENJLT5nZXRDYWxsaW5nQ29udigpOyBicmVhazsKKyAgICB9CisKKyAgICBPcGVyYW5kID0gQ0ktPmdldENhbGxlZFZhbHVlKCk7CisgICAgY29uc3QgUG9pbnRlclR5cGUgICAgKlBUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KE9wZXJhbmQtPmdldFR5cGUoKSk7CisgICAgY29uc3QgRnVuY3Rpb25UeXBlICAgKkZUeSA9IGNhc3Q8RnVuY3Rpb25UeXBlPihQVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIGNvbnN0IFR5cGUgICAgICAgICAqUmV0VHkgPSBGVHktPmdldFJldHVyblR5cGUoKTsKKyAgICBjb25zdCBBdHRyTGlzdFB0ciAmUEFMID0gQ0ktPmdldEF0dHJpYnV0ZXMoKTsKKworICAgIGlmIChQQUwuZ2V0UmV0QXR0cmlidXRlcygpICE9IEF0dHJpYnV0ZTo6Tm9uZSkKKyAgICAgIE91dCA8PCAnICcgPDwgQXR0cmlidXRlOjpnZXRBc1N0cmluZyhQQUwuZ2V0UmV0QXR0cmlidXRlcygpKTsKKworICAgIC8vIElmIHBvc3NpYmxlLCBwcmludCBvdXQgdGhlIHNob3J0IGZvcm0gb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24uICBXZSBjYW4KKyAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBhIG5vbnZhcmFyZyBmdW5jdGlvbiwKKyAgICAvLyBhbmQgaWYgdGhlIHJldHVybiB0eXBlIGlzIG5vdCBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbi4KKyAgICAvLworICAgIE91dCA8PCAnICc7CisgICAgaWYgKCFGVHktPmlzVmFyQXJnKCkgJiYKKyAgICAgICAgKCFSZXRUeS0+aXNQb2ludGVyVHkoKSB8fAorICAgICAgICAgIWNhc3Q8UG9pbnRlclR5cGU+KFJldFR5KS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNGdW5jdGlvblR5KCkpKSB7CisgICAgICBUeXBlUHJpbnRlci5wcmludChSZXRUeSwgT3V0KTsKKyAgICAgIE91dCA8PCAnICc7CisgICAgICB3cml0ZU9wZXJhbmQoT3BlcmFuZCwgZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZU9wZXJhbmQoT3BlcmFuZCwgdHJ1ZSk7CisgICAgfQorICAgIE91dCA8PCAnKCc7CisgICAgZm9yICh1bnNpZ25lZCBvcCA9IDAsIEVvcCA9IENJLT5nZXROdW1BcmdPcGVyYW5kcygpOyBvcCA8IEVvcDsgKytvcCkgeworICAgICAgaWYgKG9wID4gMCkKKyAgICAgICAgT3V0IDw8ICIsICI7CisgICAgICB3cml0ZVBhcmFtT3BlcmFuZChDSS0+Z2V0QXJnT3BlcmFuZChvcCksIFBBTC5nZXRQYXJhbUF0dHJpYnV0ZXMob3AgKyAxKSk7CisgICAgfQorICAgIE91dCA8PCAnKSc7CisgICAgaWYgKFBBTC5nZXRGbkF0dHJpYnV0ZXMoKSAhPSBBdHRyaWJ1dGU6Ok5vbmUpCisgICAgICBPdXQgPDwgJyAnIDw8IEF0dHJpYnV0ZTo6Z2V0QXNTdHJpbmcoUEFMLmdldEZuQXR0cmlidXRlcygpKTsKKyAgfSBlbHNlIGlmIChjb25zdCBBbGxvY2FJbnN0ICpBSSA9IGR5bl9jYXN0PEFsbG9jYUluc3Q+KCZJKSkgeworICAgIE91dCA8PCAnICc7CisgICAgVHlwZVByaW50ZXIucHJpbnQoQUktPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSwgT3V0KTsKKyAgICBpZiAoIUFJLT5nZXRBcnJheVNpemUoKSB8fCBBSS0+aXNBcnJheUFsbG9jYXRpb24oKSkgeworICAgICAgT3V0IDw8ICIsICI7CisgICAgICB3cml0ZU9wZXJhbmQoQUktPmdldEFycmF5U2l6ZSgpLCB0cnVlKTsKKyAgICB9CisgICAgaWYgKEFJLT5nZXRBbGlnbm1lbnQoKSkgeworICAgICAgT3V0IDw8ICIsIGFsaWduICIgPDwgQUktPmdldEFsaWdubWVudCgpOworICAgIH0KKyAgfSBlbHNlIGlmIChpc2E8Q2FzdEluc3Q+KEkpKSB7CisgICAgaWYgKE9wZXJhbmQpIHsKKyAgICAgIE91dCA8PCAnICc7CisgICAgICB3cml0ZU9wZXJhbmQoT3BlcmFuZCwgdHJ1ZSk7ICAgLy8gV29yayB3aXRoIGJyb2tlbiBjb2RlCisgICAgfQorICAgIE91dCA8PCAiIHRvICI7CisgICAgVHlwZVByaW50ZXIucHJpbnQoSS5nZXRUeXBlKCksIE91dCk7CisgIH0gZWxzZSBpZiAoT3BlcmFuZCkgeyAgIC8vIFByaW50IHRoZSBub3JtYWwgd2F5LgorCisgICAgLy8gUHJpbnRBbGxUeXBlcyAtIEluc3RydWN0aW9ucyB3aG8gaGF2ZSBvcGVyYW5kcyBvZiBhbGwgdGhlIHNhbWUgdHlwZQorICAgIC8vIG9taXQgdGhlIHR5cGUgZnJvbSBhbGwgYnV0IHRoZSBmaXJzdCBvcGVyYW5kLiAgSWYgdGhlIGluc3RydWN0aW9uIGhhcworICAgIC8vIGRpZmZlcmVudCB0eXBlIG9wZXJhbmRzIChmb3IgZXhhbXBsZSBiciksIHRoZW4gdGhleSBhcmUgYWxsIHByaW50ZWQuCisgICAgYm9vbCBQcmludEFsbFR5cGVzID0gZmFsc2U7CisgICAgY29uc3QgVHlwZSAqVGhlVHlwZSA9IE9wZXJhbmQtPmdldFR5cGUoKTsKKworICAgIC8vIFNlbGVjdCwgU3RvcmUgYW5kIFNodWZmbGVWZWN0b3IgYWx3YXlzIHByaW50IGFsbCB0eXBlcy4KKyAgICBpZiAoaXNhPFNlbGVjdEluc3Q+KEkpIHx8IGlzYTxTdG9yZUluc3Q+KEkpIHx8IGlzYTxTaHVmZmxlVmVjdG9ySW5zdD4oSSkKKyAgICAgICAgfHwgaXNhPFJldHVybkluc3Q+KEkpKSB7CisgICAgICBQcmludEFsbFR5cGVzID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgRSA9IEkuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBFOyArK2kpIHsKKyAgICAgICAgT3BlcmFuZCA9IEkuZ2V0T3BlcmFuZChpKTsKKyAgICAgICAgLy8gbm90ZSB0aGF0IE9wZXJhbmQgc2hvdWxkbid0IGJlIG51bGwsIGJ1dCB0aGUgdGVzdCBoZWxwcyBtYWtlIGR1bXAoKQorICAgICAgICAvLyBtb3JlIHRvbGVyYW50IG9mIG1hbGZvcm1lZCBJUgorICAgICAgICBpZiAoT3BlcmFuZCAmJiBPcGVyYW5kLT5nZXRUeXBlKCkgIT0gVGhlVHlwZSkgeworICAgICAgICAgIFByaW50QWxsVHlwZXMgPSB0cnVlOyAgICAvLyBXZSBoYXZlIGRpZmZlcmluZyB0eXBlcyEgIFByaW50IHRoZW0gYWxsIQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFQcmludEFsbFR5cGVzKSB7CisgICAgICBPdXQgPDwgJyAnOworICAgICAgVHlwZVByaW50ZXIucHJpbnQoVGhlVHlwZSwgT3V0KTsKKyAgICB9CisKKyAgICBPdXQgPDwgJyAnOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIEUgPSBJLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gRTsgKytpKSB7CisgICAgICBpZiAoaSkgT3V0IDw8ICIsICI7CisgICAgICB3cml0ZU9wZXJhbmQoSS5nZXRPcGVyYW5kKGkpLCBQcmludEFsbFR5cGVzKTsKKyAgICB9CisgIH0KKworICAvLyBQcmludCBwb3N0IG9wZXJhbmQgYWxpZ25tZW50IGZvciBsb2FkL3N0b3JlLgorICBpZiAoaXNhPExvYWRJbnN0PihJKSAmJiBjYXN0PExvYWRJbnN0PihJKS5nZXRBbGlnbm1lbnQoKSkgeworICAgIE91dCA8PCAiLCBhbGlnbiAiIDw8IGNhc3Q8TG9hZEluc3Q+KEkpLmdldEFsaWdubWVudCgpOworICB9IGVsc2UgaWYgKGlzYTxTdG9yZUluc3Q+KEkpICYmIGNhc3Q8U3RvcmVJbnN0PihJKS5nZXRBbGlnbm1lbnQoKSkgeworICAgIE91dCA8PCAiLCBhbGlnbiAiIDw8IGNhc3Q8U3RvcmVJbnN0PihJKS5nZXRBbGlnbm1lbnQoKTsKKyAgfQorCisgIC8vIFByaW50IE1ldGFkYXRhIGluZm8uCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTUROb2RlKj4sIDQ+IEluc3RNRDsKKyAgSS5nZXRBbGxNZXRhZGF0YShJbnN0TUQpOworICBpZiAoIUluc3RNRC5lbXB0eSgpKSB7CisgICAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCA4PiBNRE5hbWVzOworICAgIEkuZ2V0VHlwZSgpLT5nZXRDb250ZXh0KCkuZ2V0TURLaW5kTmFtZXMoTUROYW1lcyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3RNRC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1bnNpZ25lZCBLaW5kID0gSW5zdE1EW2ldLmZpcnN0OworICAgICAgIGlmIChLaW5kIDwgTUROYW1lcy5zaXplKCkpIHsKKyAgICAgICAgIE91dCA8PCAiLCAhIiA8PCBNRE5hbWVzW0tpbmRdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgT3V0IDw8ICIsICE8dW5rbm93biBraW5kICMiIDw8IEtpbmQgPDwgIj4iOworICAgICAgfQorICAgICAgT3V0IDw8ICcgJzsKKyAgICAgIFdyaXRlQXNPcGVyYW5kSW50ZXJuYWwoT3V0LCBJbnN0TURbaV0uc2Vjb25kLCAmVHlwZVByaW50ZXIsICZNYWNoaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVNb2R1bGUpOworICAgIH0KKyAgfQorICBwcmludEluZm9Db21tZW50KEkpOworfQorCitzdGF0aWMgdm9pZCBXcml0ZU1ETm9kZUNvbW1lbnQoY29uc3QgTUROb2RlICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmT3V0KSB7CisgIGlmIChOb2RlLT5nZXROdW1PcGVyYW5kcygpIDwgMSkKKyAgICByZXR1cm47CisgIENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRJbnQ+KE5vZGUtPmdldE9wZXJhbmQoMCkpOworICBpZiAoIUNJKSByZXR1cm47CisgIEFQSW50IFZhbCA9IENJLT5nZXRWYWx1ZSgpOworICBBUEludCBUYWcgPSBWYWwgJiB+QVBJbnQoVmFsLmdldEJpdFdpZHRoKCksIExMVk1EZWJ1Z1ZlcnNpb25NYXNrKTsKKyAgaWYgKFZhbC51bHQoTExWTURlYnVnVmVyc2lvbikpCisgICAgcmV0dXJuOworICAKKyAgT3V0LlBhZFRvQ29sdW1uKDUwKTsKKyAgaWYgKFRhZyA9PSBkd2FyZjo6RFdfVEFHX2F1dG9fdmFyaWFibGUpCisgICAgT3V0IDw8ICI7IFsgRFdfVEFHX2F1dG9fdmFyaWFibGUgXSI7CisgIGVsc2UgaWYgKFRhZyA9PSBkd2FyZjo6RFdfVEFHX2FyZ192YXJpYWJsZSkKKyAgICBPdXQgPDwgIjsgWyBEV19UQUdfYXJnX3ZhcmlhYmxlIF0iOworICBlbHNlIGlmIChUYWcgPT0gZHdhcmY6OkRXX1RBR19yZXR1cm5fdmFyaWFibGUpCisgICAgT3V0IDw8ICI7IFsgRFdfVEFHX3JldHVybl92YXJpYWJsZSBdIjsKKyAgZWxzZSBpZiAoVGFnID09IGR3YXJmOjpEV19UQUdfdmVjdG9yX3R5cGUpCisgICAgT3V0IDw8ICI7IFsgRFdfVEFHX3ZlY3Rvcl90eXBlIF0iOworICBlbHNlIGlmIChUYWcgPT0gZHdhcmY6OkRXX1RBR191c2VyX2Jhc2UpCisgICAgT3V0IDw8ICI7IFsgRFdfVEFHX3VzZXJfYmFzZSBdIjsKKyAgZWxzZSBpZiAoVGFnLmlzSW50TigzMikpIHsKKyAgICBpZiAoY29uc3QgY2hhciAqVGFnTmFtZSA9IGR3YXJmOjpUYWdTdHJpbmcoVGFnLmdldFpFeHRWYWx1ZSgpKSkKKyAgICAgIE91dCA8PCAiOyBbICIgPDwgVGFnTmFtZSA8PCAiIF0iOworICB9Cit9CisKK3ZvaWQgQXNzZW1ibHlXcml0ZXI6OndyaXRlQWxsTUROb2RlcygpIHsKKyAgU21hbGxWZWN0b3I8Y29uc3QgTUROb2RlICosIDE2PiBOb2RlczsKKyAgTm9kZXMucmVzaXplKE1hY2hpbmUubWRuX3NpemUoKSk7CisgIGZvciAoU2xvdFRyYWNrZXI6Om1kbl9pdGVyYXRvciBJID0gTWFjaGluZS5tZG5fYmVnaW4oKSwgRSA9IE1hY2hpbmUubWRuX2VuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIE5vZGVzW0ktPnNlY29uZF0gPSBjYXN0PE1ETm9kZT4oSS0+Zmlyc3QpOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vZGVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBPdXQgPDwgJyEnIDw8IGkgPDwgIiA9IG1ldGFkYXRhICI7CisgICAgcHJpbnRNRE5vZGVCb2R5KE5vZGVzW2ldKTsKKyAgfQorfQorCit2b2lkIEFzc2VtYmx5V3JpdGVyOjpwcmludE1ETm9kZUJvZHkoY29uc3QgTUROb2RlICpOb2RlKSB7CisgIFdyaXRlTUROb2RlQm9keUludGVybmFsKE91dCwgTm9kZSwgJlR5cGVQcmludGVyLCAmTWFjaGluZSwgVGhlTW9kdWxlKTsKKyAgV3JpdGVNRE5vZGVDb21tZW50KE5vZGUsIE91dCk7CisgIE91dCA8PCAiXG4iOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIEludGVyZmFjZSBkZWNsYXJhdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgTW9kdWxlOjpwcmludChyYXdfb3N0cmVhbSAmUk9TLCBBc3NlbWJseUFubm90YXRpb25Xcml0ZXIgKkFBVykgY29uc3QgeworICBTbG90VHJhY2tlciBTbG90VGFibGUodGhpcyk7CisgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSBPUyhST1MpOworICBBc3NlbWJseVdyaXRlciBXKE9TLCBTbG90VGFibGUsIHRoaXMsIEFBVyk7CisgIFcucHJpbnRNb2R1bGUodGhpcyk7Cit9CisKK3ZvaWQgTmFtZWRNRE5vZGU6OnByaW50KHJhd19vc3RyZWFtICZST1MsIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlciAqQUFXKSBjb25zdCB7CisgIFNsb3RUcmFja2VyIFNsb3RUYWJsZShnZXRQYXJlbnQoKSk7CisgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSBPUyhST1MpOworICBBc3NlbWJseVdyaXRlciBXKE9TLCBTbG90VGFibGUsIGdldFBhcmVudCgpLCBBQVcpOworICBXLnByaW50TmFtZWRNRE5vZGUodGhpcyk7Cit9CisKK3ZvaWQgVHlwZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmICh0aGlzID09IDApIHsKKyAgICBPUyA8PCAiPG51bGwgVHlwZT4iOworICAgIHJldHVybjsKKyAgfQorICBUeXBlUHJpbnRpbmcoKS5wcmludCh0aGlzLCBPUyk7Cit9CisKK3ZvaWQgVmFsdWU6OnByaW50KHJhd19vc3RyZWFtICZST1MsIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlciAqQUFXKSBjb25zdCB7CisgIGlmICh0aGlzID09IDApIHsKKyAgICBST1MgPDwgInByaW50aW5nIGEgPG51bGw+IHZhbHVlXG4iOworICAgIHJldHVybjsKKyAgfQorICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gT1MoUk9TKTsKKyAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KHRoaXMpKSB7CisgICAgY29uc3QgRnVuY3Rpb24gKkYgPSBJLT5nZXRQYXJlbnQoKSA/IEktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKSA6IDA7CisgICAgU2xvdFRyYWNrZXIgU2xvdFRhYmxlKEYpOworICAgIEFzc2VtYmx5V3JpdGVyIFcoT1MsIFNsb3RUYWJsZSwgZ2V0TW9kdWxlRnJvbVZhbChJKSwgQUFXKTsKKyAgICBXLnByaW50SW5zdHJ1Y3Rpb24oKkkpOworICB9IGVsc2UgaWYgKGNvbnN0IEJhc2ljQmxvY2sgKkJCID0gZHluX2Nhc3Q8QmFzaWNCbG9jaz4odGhpcykpIHsKKyAgICBTbG90VHJhY2tlciBTbG90VGFibGUoQkItPmdldFBhcmVudCgpKTsKKyAgICBBc3NlbWJseVdyaXRlciBXKE9TLCBTbG90VGFibGUsIGdldE1vZHVsZUZyb21WYWwoQkIpLCBBQVcpOworICAgIFcucHJpbnRCYXNpY0Jsb2NrKEJCKTsKKyAgfSBlbHNlIGlmIChjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4odGhpcykpIHsKKyAgICBTbG90VHJhY2tlciBTbG90VGFibGUoR1YtPmdldFBhcmVudCgpKTsKKyAgICBBc3NlbWJseVdyaXRlciBXKE9TLCBTbG90VGFibGUsIEdWLT5nZXRQYXJlbnQoKSwgQUFXKTsKKyAgICBpZiAoY29uc3QgR2xvYmFsVmFyaWFibGUgKlYgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oR1YpKQorICAgICAgVy5wcmludEdsb2JhbChWKTsKKyAgICBlbHNlIGlmIChjb25zdCBGdW5jdGlvbiAqRiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihHVikpCisgICAgICBXLnByaW50RnVuY3Rpb24oRik7CisgICAgZWxzZQorICAgICAgVy5wcmludEFsaWFzKGNhc3Q8R2xvYmFsQWxpYXM+KEdWKSk7CisgIH0gZWxzZSBpZiAoY29uc3QgTUROb2RlICpOID0gZHluX2Nhc3Q8TUROb2RlPih0aGlzKSkgeworICAgIGNvbnN0IEZ1bmN0aW9uICpGID0gTi0+Z2V0RnVuY3Rpb24oKTsKKyAgICBTbG90VHJhY2tlciBTbG90VGFibGUoRik7CisgICAgQXNzZW1ibHlXcml0ZXIgVyhPUywgU2xvdFRhYmxlLCBGID8gRi0+Z2V0UGFyZW50KCkgOiAwLCBBQVcpOworICAgIFcucHJpbnRNRE5vZGVCb2R5KE4pOworICB9IGVsc2UgaWYgKGNvbnN0IENvbnN0YW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KHRoaXMpKSB7CisgICAgVHlwZVByaW50aW5nIFR5cGVQcmludGVyOworICAgIFR5cGVQcmludGVyLnByaW50KEMtPmdldFR5cGUoKSwgT1MpOworICAgIE9TIDw8ICcgJzsKKyAgICBXcml0ZUNvbnN0YW50SW50ZXJuYWwoT1MsIEMsIFR5cGVQcmludGVyLCAwLCAwKTsKKyAgfSBlbHNlIGlmIChpc2E8TURTdHJpbmc+KHRoaXMpIHx8CisgICAgICAgICAgICAgaXNhPEFyZ3VtZW50Pih0aGlzKSkgeworICAgIFdyaXRlQXNPcGVyYW5kKE9TLCB0aGlzLCB0cnVlLCAwKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPdGhlcndpc2Ugd2UgZG9uJ3Qga25vdyB3aGF0IGl0IGlzLiBDYWxsIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRvCisgICAgLy8gYWxsb3cgYSBzdWJjbGFzcyB0byBwcmludCBpdHNlbGYuCisgICAgcHJpbnRDdXN0b20oT1MpOworICB9Cit9CisKKy8vIFZhbHVlOjpwcmludEN1c3RvbSAtIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gaW1wbGVtZW50IHByaW50aW5nLgordm9pZCBWYWx1ZTo6cHJpbnRDdXN0b20ocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdmFsdWUgdG8gcHJpbnQgb3V0ISIpOworfQorCisvLyBWYWx1ZTo6ZHVtcCAtIGFsbG93IGVhc3kgcHJpbnRpbmcgb2YgVmFsdWVzIGZyb20gdGhlIGRlYnVnZ2VyLgordm9pZCBWYWx1ZTo6ZHVtcCgpIGNvbnN0IHsgcHJpbnQoZGJncygpKTsgZGJncygpIDw8ICdcbic7IH0KKworLy8gVHlwZTo6ZHVtcCAtIGFsbG93IGVhc3kgcHJpbnRpbmcgb2YgVHlwZXMgZnJvbSB0aGUgZGVidWdnZXIuCisvLyBUaGlzIG9uZSB1c2VzIHR5cGUgbmFtZXMgZnJvbSB0aGUgZ2l2ZW4gY29udGV4dCBtb2R1bGUKK3ZvaWQgVHlwZTo6ZHVtcChjb25zdCBNb2R1bGUgKkNvbnRleHQpIGNvbnN0IHsKKyAgV3JpdGVUeXBlU3ltYm9saWMoZGJncygpLCB0aGlzLCBDb250ZXh0KTsKKyAgZGJncygpIDw8ICdcbic7Cit9CisKKy8vIFR5cGU6OmR1bXAgLSBhbGxvdyBlYXN5IHByaW50aW5nIG9mIFR5cGVzIGZyb20gdGhlIGRlYnVnZ2VyLgordm9pZCBUeXBlOjpkdW1wKCkgY29uc3QgeyBkdW1wKDApOyB9CisKKy8vIE1vZHVsZTo6ZHVtcCgpIC0gQWxsb3cgcHJpbnRpbmcgb2YgTW9kdWxlcyBmcm9tIHRoZSBkZWJ1Z2dlci4KK3ZvaWQgTW9kdWxlOjpkdW1wKCkgY29uc3QgeyBwcmludChkYmdzKCksIDApOyB9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0F0dHJpYnV0ZXMuY3BwIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9BdHRyaWJ1dGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGMxMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9BdHRyaWJ1dGVzLmNwcApAQCAtMCwwICsxLDMzMiBAQAorLy89PT0tLSBBdHRyaWJ1dGVzLmNwcCAtIEltcGxlbWVudCBBdHRyaWJ1dGVzTGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQXR0cmlidXRlc0xpc3QgY2xhc3MgYW5kIEF0dHJpYnV0ZSB1dGlsaXRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9BdG9taWMuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9NdXRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEF0dHJpYnV0ZSBGdW5jdGlvbiBEZWZpbml0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RkOjpzdHJpbmcgQXR0cmlidXRlOjpnZXRBc1N0cmluZyhBdHRyaWJ1dGVzIEF0dHJzKSB7CisgIHN0ZDo6c3RyaW5nIFJlc3VsdDsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpaRXh0KQorICAgIFJlc3VsdCArPSAiemVyb2V4dCAiOworICBpZiAoQXR0cnMgJiBBdHRyaWJ1dGU6OlNFeHQpCisgICAgUmVzdWx0ICs9ICJzaWduZXh0ICI7CisgIGlmIChBdHRycyAmIEF0dHJpYnV0ZTo6Tm9SZXR1cm4pCisgICAgUmVzdWx0ICs9ICJub3JldHVybiAiOworICBpZiAoQXR0cnMgJiBBdHRyaWJ1dGU6OkluUmVnKQorICAgIFJlc3VsdCArPSAiaW5yZWcgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpOb0FsaWFzKQorICAgIFJlc3VsdCArPSAibm9hbGlhcyAiOworICBpZiAoQXR0cnMgJiBBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSkKKyAgICBSZXN1bHQgKz0gIm5vY2FwdHVyZSAiOworICBpZiAoQXR0cnMgJiBBdHRyaWJ1dGU6OlN0cnVjdFJldCkKKyAgICBSZXN1bHQgKz0gInNyZXQgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpCeVZhbCkKKyAgICBSZXN1bHQgKz0gImJ5dmFsICI7CisgIGlmIChBdHRycyAmIEF0dHJpYnV0ZTo6TmVzdCkKKyAgICBSZXN1bHQgKz0gIm5lc3QgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpSZWFkTm9uZSkKKyAgICBSZXN1bHQgKz0gInJlYWRub25lICI7CisgIGlmIChBdHRycyAmIEF0dHJpYnV0ZTo6UmVhZE9ubHkpCisgICAgUmVzdWx0ICs9ICJyZWFkb25seSAiOworICBpZiAoQXR0cnMgJiBBdHRyaWJ1dGU6Ok9wdGltaXplRm9yU2l6ZSkKKyAgICBSZXN1bHQgKz0gIm9wdHNpemUgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpOb0lubGluZSkKKyAgICBSZXN1bHQgKz0gIm5vaW5saW5lICI7CisgIGlmIChBdHRycyAmIEF0dHJpYnV0ZTo6SW5saW5lSGludCkKKyAgICBSZXN1bHQgKz0gImlubGluZWhpbnQgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpBbHdheXNJbmxpbmUpCisgICAgUmVzdWx0ICs9ICJhbHdheXNpbmxpbmUgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpTdGFja1Byb3RlY3QpCisgICAgUmVzdWx0ICs9ICJzc3AgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpTdGFja1Byb3RlY3RSZXEpCisgICAgUmVzdWx0ICs9ICJzc3ByZXEgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpOb1JlZFpvbmUpCisgICAgUmVzdWx0ICs9ICJub3JlZHpvbmUgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpOb0ltcGxpY2l0RmxvYXQpCisgICAgUmVzdWx0ICs9ICJub2ltcGxpY2l0ZmxvYXQgIjsKKyAgaWYgKEF0dHJzICYgQXR0cmlidXRlOjpOYWtlZCkKKyAgICBSZXN1bHQgKz0gIm5ha2VkICI7CisgIGlmIChBdHRycyAmIEF0dHJpYnV0ZTo6U3RhY2tBbGlnbm1lbnQpIHsKKyAgICBSZXN1bHQgKz0gImFsaWduc3RhY2soIjsKKyAgICBSZXN1bHQgKz0gdXRvc3RyKEF0dHJpYnV0ZTo6Z2V0U3RhY2tBbGlnbm1lbnRGcm9tQXR0cnMoQXR0cnMpKTsKKyAgICBSZXN1bHQgKz0gIikgIjsKKyAgfQorICBpZiAoQXR0cnMgJiBBdHRyaWJ1dGU6OkFsaWdubWVudCkgeworICAgIFJlc3VsdCArPSAiYWxpZ24gIjsKKyAgICBSZXN1bHQgKz0gdXRvc3RyKEF0dHJpYnV0ZTo6Z2V0QWxpZ25tZW50RnJvbUF0dHJzKEF0dHJzKSk7CisgICAgUmVzdWx0ICs9ICIgIjsKKyAgfQorICAvLyBUcmltIHRoZSB0cmFpbGluZyBzcGFjZS4KKyAgYXNzZXJ0KCFSZXN1bHQuZW1wdHkoKSAmJiAiVW5rbm93biBhdHRyaWJ1dGUhIik7CisgIFJlc3VsdC5lcmFzZShSZXN1bHQuZW5kKCktMSk7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK0F0dHJpYnV0ZXMgQXR0cmlidXRlOjp0eXBlSW5jb21wYXRpYmxlKGNvbnN0IFR5cGUgKlR5KSB7CisgIEF0dHJpYnV0ZXMgSW5jb21wYXRpYmxlID0gTm9uZTsKKyAgCisgIGlmICghVHktPmlzSW50ZWdlclR5KCkpCisgICAgLy8gQXR0cmlidXRlcyB0aGF0IG9ubHkgYXBwbHkgdG8gaW50ZWdlcnMuCisgICAgSW5jb21wYXRpYmxlIHw9IFNFeHQgfCBaRXh0OworICAKKyAgaWYgKCFUeS0+aXNQb2ludGVyVHkoKSkKKyAgICAvLyBBdHRyaWJ1dGVzIHRoYXQgb25seSBhcHBseSB0byBwb2ludGVycy4KKyAgICBJbmNvbXBhdGlibGUgfD0gQnlWYWwgfCBOZXN0IHwgTm9BbGlhcyB8IFN0cnVjdFJldCB8IE5vQ2FwdHVyZTsKKyAgCisgIHJldHVybiBJbmNvbXBhdGlibGU7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBdHRyaWJ1dGVMaXN0SW1wbCBEZWZpbml0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBBdHRyaWJ1dGVMaXN0SW1wbCA6IHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CisgIHN5czo6Y2FzX2ZsYWcgUmVmQ291bnQ7CisgIAorICAvLyBBdHRyaWJ1dGVzTGlzdCBpcyB1bmlxdWVkLCB0aGVzZSBzaG91bGQgbm90IGJlIHB1YmxpY2x5IGF2YWlsYWJsZS4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQXR0cmlidXRlTGlzdEltcGwgJik7IC8vIERvIG5vdCBpbXBsZW1lbnQKKyAgQXR0cmlidXRlTGlzdEltcGwoY29uc3QgQXR0cmlidXRlTGlzdEltcGwgJik7IC8vIERvIG5vdCBpbXBsZW1lbnQKKyAgfkF0dHJpYnV0ZUxpc3RJbXBsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJpdmF0ZSBpbXBsZW1lbnRhdGlvbgorcHVibGljOgorICBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVXaXRoSW5kZXgsIDQ+IEF0dHJzOworICAKKyAgQXR0cmlidXRlTGlzdEltcGwoY29uc3QgQXR0cmlidXRlV2l0aEluZGV4ICpBdHRyLCB1bnNpZ25lZCBOdW1BdHRycykKKyAgICA6IEF0dHJzKEF0dHIsIEF0dHIrTnVtQXR0cnMpIHsKKyAgICBSZWZDb3VudCA9IDA7CisgIH0KKyAgCisgIHZvaWQgQWRkUmVmKCkgeyBzeXM6OkF0b21pY0luY3JlbWVudCgmUmVmQ291bnQpOyB9CisgIHZvaWQgRHJvcFJlZigpIHsKKyAgICBzeXM6OmNhc19mbGFnIG9sZCA9IHN5czo6QXRvbWljRGVjcmVtZW50KCZSZWZDb3VudCk7CisgICAgaWYgKG9sZCA9PSAwKSBkZWxldGUgdGhpczsKKyAgfQorICAKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgUHJvZmlsZShJRCwgQXR0cnMuZGF0YSgpLCBBdHRycy5zaXplKCkpOworICB9CisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IEF0dHJpYnV0ZVdpdGhJbmRleCAqQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1BdHRycykgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtQXR0cnM7ICsraSkKKyAgICAgIElELkFkZEludGVnZXIodWludDY0X3QoQXR0cltpXS5BdHRycykgPDwgMzIgfCB1bnNpZ25lZChBdHRyW2ldLkluZGV4KSk7CisgIH0KK307Cit9CisKK3N0YXRpYyBNYW5hZ2VkU3RhdGljPHN5czo6U21hcnRNdXRleDx0cnVlPiA+IEFMTXV0ZXg7CitzdGF0aWMgTWFuYWdlZFN0YXRpYzxGb2xkaW5nU2V0PEF0dHJpYnV0ZUxpc3RJbXBsPiA+IEF0dHJpYnV0ZXNMaXN0czsKKworQXR0cmlidXRlTGlzdEltcGw6On5BdHRyaWJ1dGVMaXN0SW1wbCgpIHsKKyAgc3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gTG9jaygqQUxNdXRleCk7CisgIEF0dHJpYnV0ZXNMaXN0cy0+UmVtb3ZlTm9kZSh0aGlzKTsKK30KKworCitBdHRyTGlzdFB0ciBBdHRyTGlzdFB0cjo6Z2V0KGNvbnN0IEF0dHJpYnV0ZVdpdGhJbmRleCAqQXR0cnMsIHVuc2lnbmVkIE51bUF0dHJzKSB7CisgIC8vIElmIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzIHRoZW4gcmV0dXJuIGEgbnVsbCBBdHRyaWJ1dGVzTGlzdCBwb2ludGVyLgorICBpZiAoTnVtQXR0cnMgPT0gMCkKKyAgICByZXR1cm4gQXR0ckxpc3RQdHIoKTsKKyAgCisjaWZuZGVmIE5ERUJVRworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUF0dHJzOyArK2kpIHsKKyAgICBhc3NlcnQoQXR0cnNbaV0uQXR0cnMgIT0gQXR0cmlidXRlOjpOb25lICYmIAorICAgICAgICAgICAiUG9pbnRsZXNzIGF0dHJpYnV0ZSEiKTsKKyAgICBhc3NlcnQoKCFpIHx8IEF0dHJzW2ktMV0uSW5kZXggPCBBdHRyc1tpXS5JbmRleCkgJiYKKyAgICAgICAgICAgIk1pc29yZGVyZWQgQXR0cmlidXRlc0xpc3QhIik7CisgIH0KKyNlbmRpZgorICAKKyAgLy8gT3RoZXJ3aXNlLCBidWlsZCBhIGtleSB0byBsb29rIHVwIHRoZSBleGlzdGluZyBhdHRyaWJ1dGVzLgorICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBdHRyaWJ1dGVMaXN0SW1wbDo6UHJvZmlsZShJRCwgQXR0cnMsIE51bUF0dHJzKTsKKyAgdm9pZCAqSW5zZXJ0UG9zOworICAKKyAgc3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gTG9jaygqQUxNdXRleCk7CisgIAorICBBdHRyaWJ1dGVMaXN0SW1wbCAqUEFMID0KKyAgICBBdHRyaWJ1dGVzTGlzdHMtPkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvcyk7CisgIAorICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBvZiB0aGUgc2FtZSBzaGFwZSB0aGVuCisgIC8vIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIGluc2VydCBpdC4KKyAgaWYgKCFQQUwpIHsKKyAgICBQQUwgPSBuZXcgQXR0cmlidXRlTGlzdEltcGwoQXR0cnMsIE51bUF0dHJzKTsKKyAgICBBdHRyaWJ1dGVzTGlzdHMtPkluc2VydE5vZGUoUEFMLCBJbnNlcnRQb3MpOworICB9CisgIAorICAvLyBSZXR1cm4gdGhlIEF0dHJpYnV0ZXNMaXN0IHRoYXQgd2UgZm91bmQgb3IgY3JlYXRlZC4KKyAgcmV0dXJuIEF0dHJMaXN0UHRyKFBBTCk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEF0dHJMaXN0UHRyIE1ldGhvZCBJbXBsZW1lbnRhdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0F0dHJMaXN0UHRyOjpBdHRyTGlzdFB0cihBdHRyaWJ1dGVMaXN0SW1wbCAqTEkpIDogQXR0ckxpc3QoTEkpIHsKKyAgaWYgKExJKSBMSS0+QWRkUmVmKCk7Cit9CisKK0F0dHJMaXN0UHRyOjpBdHRyTGlzdFB0cihjb25zdCBBdHRyTGlzdFB0ciAmUCkgOiBBdHRyTGlzdChQLkF0dHJMaXN0KSB7CisgIGlmIChBdHRyTGlzdCkgQXR0ckxpc3QtPkFkZFJlZigpOyAgCit9CisKK2NvbnN0IEF0dHJMaXN0UHRyICZBdHRyTGlzdFB0cjo6b3BlcmF0b3I9KGNvbnN0IEF0dHJMaXN0UHRyICZSSFMpIHsKKyAgaWYgKEF0dHJMaXN0ID09IFJIUy5BdHRyTGlzdCkgcmV0dXJuICp0aGlzOworICBpZiAoQXR0ckxpc3QpIEF0dHJMaXN0LT5Ecm9wUmVmKCk7CisgIEF0dHJMaXN0ID0gUkhTLkF0dHJMaXN0OworICBpZiAoQXR0ckxpc3QpIEF0dHJMaXN0LT5BZGRSZWYoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitBdHRyTGlzdFB0cjo6fkF0dHJMaXN0UHRyKCkgeworICBpZiAoQXR0ckxpc3QpIEF0dHJMaXN0LT5Ecm9wUmVmKCk7Cit9CisKKy8vLyBnZXROdW1TbG90cyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIHNsb3RzIHVzZWQgaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4gCisvLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IGhhdmUgYW4gYXR0cmlidXRlIHNldCBvbiB0aGVtCisvLy8gKGluY2x1ZGluZyB0aGUgZnVuY3Rpb24gaXRzZWxmKS4KK3Vuc2lnbmVkIEF0dHJMaXN0UHRyOjpnZXROdW1TbG90cygpIGNvbnN0IHsKKyAgcmV0dXJuIEF0dHJMaXN0ID8gQXR0ckxpc3QtPkF0dHJzLnNpemUoKSA6IDA7Cit9CisKKy8vLyBnZXRTbG90IC0gUmV0dXJuIHRoZSBBdHRyaWJ1dGVXaXRoSW5kZXggYXQgdGhlIHNwZWNpZmllZCBzbG90LiAgVGhpcworLy8vIGhvbGRzIGEgbnVtYmVyIHBsdXMgYSBzZXQgb2YgYXR0cmlidXRlcy4KK2NvbnN0IEF0dHJpYnV0ZVdpdGhJbmRleCAmQXR0ckxpc3RQdHI6OmdldFNsb3QodW5zaWduZWQgU2xvdCkgY29uc3QgeworICBhc3NlcnQoQXR0ckxpc3QgJiYgU2xvdCA8IEF0dHJMaXN0LT5BdHRycy5zaXplKCkgJiYgIlNsb3QgIyBvdXQgb2YgcmFuZ2UhIik7CisgIHJldHVybiBBdHRyTGlzdC0+QXR0cnNbU2xvdF07Cit9CisKKworLy8vIGdldEF0dHJpYnV0ZXMgLSBUaGUgYXR0cmlidXRlcyBmb3IgdGhlIHNwZWNpZmllZCBpbmRleCBhcmUKKy8vLyByZXR1cm5lZC4gIEF0dHJpYnV0ZXMgZm9yIHRoZSByZXN1bHQgYXJlIGRlbm90ZWQgd2l0aCBJZHggPSAwLgorLy8vIEZ1bmN0aW9uIG5vdGVzIGFyZSBkZW5vdGVkIHdpdGggaWR4ID0gfjAuCitBdHRyaWJ1dGVzIEF0dHJMaXN0UHRyOjpnZXRBdHRyaWJ1dGVzKHVuc2lnbmVkIElkeCkgY29uc3QgeworICBpZiAoQXR0ckxpc3QgPT0gMCkgcmV0dXJuIEF0dHJpYnV0ZTo6Tm9uZTsKKyAgCisgIGNvbnN0IFNtYWxsVmVjdG9yPEF0dHJpYnV0ZVdpdGhJbmRleCwgND4gJkF0dHJzID0gQXR0ckxpc3QtPkF0dHJzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXR0cnMuc2l6ZSgpOyBpICE9IGUgJiYgQXR0cnNbaV0uSW5kZXggPD0gSWR4OyArK2kpCisgICAgaWYgKEF0dHJzW2ldLkluZGV4ID09IElkeCkKKyAgICAgIHJldHVybiBBdHRyc1tpXS5BdHRyczsKKyAgcmV0dXJuIEF0dHJpYnV0ZTo6Tm9uZTsKK30KKworLy8vIGhhc0F0dHJTb21ld2hlcmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBpcyBzZXQgZm9yIGF0CisvLy8gbGVhc3Qgb25lIHBhcmFtZXRlciBvciBmb3IgdGhlIHJldHVybiB2YWx1ZS4KK2Jvb2wgQXR0ckxpc3RQdHI6Omhhc0F0dHJTb21ld2hlcmUoQXR0cmlidXRlcyBBdHRyKSBjb25zdCB7CisgIGlmIChBdHRyTGlzdCA9PSAwKSByZXR1cm4gZmFsc2U7CisgIAorICBjb25zdCBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVXaXRoSW5kZXgsIDQ+ICZBdHRycyA9IEF0dHJMaXN0LT5BdHRyczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEF0dHJzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKEF0dHJzW2ldLkF0dHJzICYgQXR0cikKKyAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKKworQXR0ckxpc3RQdHIgQXR0ckxpc3RQdHI6OmFkZEF0dHIodW5zaWduZWQgSWR4LCBBdHRyaWJ1dGVzIEF0dHJzKSBjb25zdCB7CisgIEF0dHJpYnV0ZXMgT2xkQXR0cnMgPSBnZXRBdHRyaWJ1dGVzKElkeCk7CisjaWZuZGVmIE5ERUJVRworICAvLyBGSVhNRSBpdCBpcyBub3Qgb2J2aW91cyBob3cgdGhpcyBzaG91bGQgd29yayBmb3IgYWxpZ25tZW50LgorICAvLyBGb3Igbm93LCBzYXkgd2UgY2FuJ3QgY2hhbmdlIGEga25vd24gYWxpZ25tZW50LgorICBBdHRyaWJ1dGVzIE9sZEFsaWduID0gT2xkQXR0cnMgJiBBdHRyaWJ1dGU6OkFsaWdubWVudDsKKyAgQXR0cmlidXRlcyBOZXdBbGlnbiA9IEF0dHJzICYgQXR0cmlidXRlOjpBbGlnbm1lbnQ7CisgIGFzc2VydCgoIU9sZEFsaWduIHx8ICFOZXdBbGlnbiB8fCBPbGRBbGlnbiA9PSBOZXdBbGlnbikgJiYKKyAgICAgICAgICJBdHRlbXB0IHRvIGNoYW5nZSBhbGlnbm1lbnQhIik7CisjZW5kaWYKKyAgCisgIEF0dHJpYnV0ZXMgTmV3QXR0cnMgPSBPbGRBdHRycyB8IEF0dHJzOworICBpZiAoTmV3QXR0cnMgPT0gT2xkQXR0cnMpCisgICAgcmV0dXJuICp0aGlzOworICAKKyAgU21hbGxWZWN0b3I8QXR0cmlidXRlV2l0aEluZGV4LCA4PiBOZXdBdHRyTGlzdDsKKyAgaWYgKEF0dHJMaXN0ID09IDApCisgICAgTmV3QXR0ckxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZVdpdGhJbmRleDo6Z2V0KElkeCwgQXR0cnMpKTsKKyAgZWxzZSB7CisgICAgY29uc3QgU21hbGxWZWN0b3I8QXR0cmlidXRlV2l0aEluZGV4LCA0PiAmT2xkQXR0ckxpc3QgPSBBdHRyTGlzdC0+QXR0cnM7CisgICAgdW5zaWduZWQgaSA9IDAsIGUgPSBPbGRBdHRyTGlzdC5zaXplKCk7CisgICAgLy8gQ29weSBhdHRyaWJ1dGVzIGZvciBhcmd1bWVudHMgYmVmb3JlIHRoaXMgb25lLgorICAgIGZvciAoOyBpICE9IGUgJiYgT2xkQXR0ckxpc3RbaV0uSW5kZXggPCBJZHg7ICsraSkKKyAgICAgIE5ld0F0dHJMaXN0LnB1c2hfYmFjayhPbGRBdHRyTGlzdFtpXSk7CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgYXR0cmlidXRlcyBhbHJlYWR5IGF0IHRoaXMgaW5kZXgsIG1lcmdlIHRoZW0gaW4uCisgICAgaWYgKGkgIT0gZSAmJiBPbGRBdHRyTGlzdFtpXS5JbmRleCA9PSBJZHgpIHsKKyAgICAgIEF0dHJzIHw9IE9sZEF0dHJMaXN0W2ldLkF0dHJzOworICAgICAgKytpOworICAgIH0KKyAgICAKKyAgICBOZXdBdHRyTGlzdC5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoSWR4LCBBdHRycykpOworICAgIAorICAgIC8vIENvcHkgYXR0cmlidXRlcyBmb3IgYXJndW1lbnRzIGFmdGVyIHRoaXMgb25lLgorICAgIE5ld0F0dHJMaXN0Lmluc2VydChOZXdBdHRyTGlzdC5lbmQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgIE9sZEF0dHJMaXN0LmJlZ2luKCkraSwgT2xkQXR0ckxpc3QuZW5kKCkpOworICB9CisgIAorICByZXR1cm4gZ2V0KE5ld0F0dHJMaXN0LmRhdGEoKSwgTmV3QXR0ckxpc3Quc2l6ZSgpKTsKK30KKworQXR0ckxpc3RQdHIgQXR0ckxpc3RQdHI6OnJlbW92ZUF0dHIodW5zaWduZWQgSWR4LCBBdHRyaWJ1dGVzIEF0dHJzKSBjb25zdCB7CisjaWZuZGVmIE5ERUJVRworICAvLyBGSVhNRSBpdCBpcyBub3Qgb2J2aW91cyBob3cgdGhpcyBzaG91bGQgd29yayBmb3IgYWxpZ25tZW50LgorICAvLyBGb3Igbm93LCBzYXkgd2UgY2FuJ3QgcGFzcyBpbiBhbGlnbm1lbnQsIHdoaWNoIG5vIGN1cnJlbnQgdXNlIGRvZXMuCisgIGFzc2VydCghKEF0dHJzICYgQXR0cmlidXRlOjpBbGlnbm1lbnQpICYmICJBdHRlbXB0IHRvIGV4Y2x1ZGUgYWxpZ25tZW50ISIpOworI2VuZGlmCisgIGlmIChBdHRyTGlzdCA9PSAwKSByZXR1cm4gQXR0ckxpc3RQdHIoKTsKKyAgCisgIEF0dHJpYnV0ZXMgT2xkQXR0cnMgPSBnZXRBdHRyaWJ1dGVzKElkeCk7CisgIEF0dHJpYnV0ZXMgTmV3QXR0cnMgPSBPbGRBdHRycyAmIH5BdHRyczsKKyAgaWYgKE5ld0F0dHJzID09IE9sZEF0dHJzKQorICAgIHJldHVybiAqdGhpczsKKworICBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVXaXRoSW5kZXgsIDg+IE5ld0F0dHJMaXN0OworICBjb25zdCBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVXaXRoSW5kZXgsIDQ+ICZPbGRBdHRyTGlzdCA9IEF0dHJMaXN0LT5BdHRyczsKKyAgdW5zaWduZWQgaSA9IDAsIGUgPSBPbGRBdHRyTGlzdC5zaXplKCk7CisgIAorICAvLyBDb3B5IGF0dHJpYnV0ZXMgZm9yIGFyZ3VtZW50cyBiZWZvcmUgdGhpcyBvbmUuCisgIGZvciAoOyBpICE9IGUgJiYgT2xkQXR0ckxpc3RbaV0uSW5kZXggPCBJZHg7ICsraSkKKyAgICBOZXdBdHRyTGlzdC5wdXNoX2JhY2soT2xkQXR0ckxpc3RbaV0pOworICAKKyAgLy8gSWYgdGhlcmUgYXJlIGF0dHJpYnV0ZXMgYWxyZWFkeSBhdCB0aGlzIGluZGV4LCBtZXJnZSB0aGVtIGluLgorICBhc3NlcnQoT2xkQXR0ckxpc3RbaV0uSW5kZXggPT0gSWR4ICYmICJBdHRyaWJ1dGUgaXNuJ3Qgc2V0PyIpOworICBBdHRycyA9IE9sZEF0dHJMaXN0W2ldLkF0dHJzICYgfkF0dHJzOworICArK2k7CisgIGlmIChBdHRycykgIC8vIElmIGFueSBhdHRyaWJ1dGVzIGxlZnQgZm9yIHRoaXMgcGFyYW1ldGVyLCBhZGQgdGhlbS4KKyAgICBOZXdBdHRyTGlzdC5wdXNoX2JhY2soQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoSWR4LCBBdHRycykpOworICAKKyAgLy8gQ29weSBhdHRyaWJ1dGVzIGZvciBhcmd1bWVudHMgYWZ0ZXIgdGhpcyBvbmUuCisgIE5ld0F0dHJMaXN0Lmluc2VydChOZXdBdHRyTGlzdC5lbmQoKSwgCisgICAgICAgICAgICAgICAgICAgICBPbGRBdHRyTGlzdC5iZWdpbigpK2ksIE9sZEF0dHJMaXN0LmVuZCgpKTsKKyAgCisgIHJldHVybiBnZXQoTmV3QXR0ckxpc3QuZGF0YSgpLCBOZXdBdHRyTGlzdC5zaXplKCkpOworfQorCit2b2lkIEF0dHJMaXN0UHRyOjpkdW1wKCkgY29uc3QgeworICBkYmdzKCkgPDwgIlBBTFsgIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGdldE51bVNsb3RzKCk7ICsraSkgeworICAgIGNvbnN0IEF0dHJpYnV0ZVdpdGhJbmRleCAmUEFXSSA9IGdldFNsb3QoaSk7CisgICAgZGJncygpIDw8ICJ7IiA8PCBQQVdJLkluZGV4IDw8ICIsIiA8PCBQQVdJLkF0dHJzIDw8ICJ9ICI7CisgIH0KKyAgCisgIGRiZ3MoKSA8PCAiXVxuIjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9WTUNvcmUvQmFzaWNCbG9jay5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0Jhc2ljQmxvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZWRlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL0Jhc2ljQmxvY2suY3BwCkBAIC0wLDAgKzEsMzA3IEBACisvLz09PS0tIEJhc2ljQmxvY2suY3BwIC0gSW1wbGVtZW50IEJhc2ljQmxvY2sgcmVsYXRlZCBtZXRob2RzIC0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBCYXNpY0Jsb2NrIGNsYXNzIGZvciB0aGUgVk1Db3JlIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9MZWFrRGV0ZWN0b3IuaCIKKyNpbmNsdWRlICJTeW1ib2xUYWJsZUxpc3RUcmFpdHNJbXBsLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK1ZhbHVlU3ltYm9sVGFibGUgKkJhc2ljQmxvY2s6OmdldFZhbHVlU3ltYm9sVGFibGUoKSB7CisgIGlmIChGdW5jdGlvbiAqRiA9IGdldFBhcmVudCgpKQorICAgIHJldHVybiAmRi0+Z2V0VmFsdWVTeW1ib2xUYWJsZSgpOworICByZXR1cm4gMDsKK30KKworTExWTUNvbnRleHQgJkJhc2ljQmxvY2s6OmdldENvbnRleHQoKSBjb25zdCB7CisgIHJldHVybiBnZXRUeXBlKCktPmdldENvbnRleHQoKTsKK30KKworLy8gRXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBTeW1ib2xUYWJsZUxpc3RUcmFpdHMgc2luY2Ugc29tZSBvZiB0aGUgbWV0aG9kcworLy8gYXJlIG5vdCBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlLi4uCit0ZW1wbGF0ZSBjbGFzcyBsbHZtOjpTeW1ib2xUYWJsZUxpc3RUcmFpdHM8SW5zdHJ1Y3Rpb24sIEJhc2ljQmxvY2s+OworCisKK0Jhc2ljQmxvY2s6OkJhc2ljQmxvY2soTExWTUNvbnRleHQgJkMsIEZ1bmN0aW9uICpOZXdQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEJlZm9yZSkKKyAgOiBWYWx1ZShUeXBlOjpnZXRMYWJlbFR5KEMpLCBWYWx1ZTo6QmFzaWNCbG9ja1ZhbCksIFBhcmVudCgwKSB7CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgZ2V0IGFkZGVkIHRvIGEgZnVuY3Rpb24KKyAgTGVha0RldGVjdG9yOjphZGRHYXJiYWdlT2JqZWN0KHRoaXMpOworCisgIGlmIChJbnNlcnRCZWZvcmUpIHsKKyAgICBhc3NlcnQoTmV3UGFyZW50ICYmCisgICAgICAgICAgICJDYW5ub3QgaW5zZXJ0IGJsb2NrIGJlZm9yZSBhbm90aGVyIGJsb2NrIHdpdGggbm8gZnVuY3Rpb24hIik7CisgICAgTmV3UGFyZW50LT5nZXRCYXNpY0Jsb2NrTGlzdCgpLmluc2VydChJbnNlcnRCZWZvcmUsIHRoaXMpOworICB9IGVsc2UgaWYgKE5ld1BhcmVudCkgeworICAgIE5ld1BhcmVudC0+Z2V0QmFzaWNCbG9ja0xpc3QoKS5wdXNoX2JhY2sodGhpcyk7CisgIH0KK30KKworCitCYXNpY0Jsb2NrOjp+QmFzaWNCbG9jaygpIHsKKyAgLy8gSWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGJsb2NrIGlzIHRha2VuIGFuZCBpdCBpcyBiZWluZyBkZWxldGVkIChlLmcuIGJlY2F1c2UKKyAgLy8gaXQgaXMgZGVhZCksIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBlaXRoZXIgYSBkYW5nbGluZyBjb25zdGFudCBleHByCisgIC8vIGhhbmdpbmcgb2ZmIHRoZSBibG9jaywgb3IgYW4gdW5kZWZpbmVkIHVzZSBvZiB0aGUgYmxvY2sgKHNvdXJjZSBjb2RlCisgIC8vIGV4cGVjdGluZyB0aGUgYWRkcmVzcyBvZiBhIGxhYmVsIHRvIGtlZXAgdGhlIGJsb2NrIGFsaXZlIGV2ZW4gdGhvdWdoIHRoZXJlCisgIC8vIGlzIG5vIGluZGlyZWN0IGJyYW5jaCkuICBIYW5kbGUgdGhlc2UgY2FzZXMgYnkgemFwcGluZyB0aGUgQmxvY2tBZGRyZXNzCisgIC8vIG5vZGVzLiAgVGhlcmUgYXJlIG5vIG90aGVyIHBvc3NpYmxlIHVzZXMgYXQgdGhpcyBwb2ludC4KKyAgaWYgKGhhc0FkZHJlc3NUYWtlbigpKSB7CisgICAgYXNzZXJ0KCF1c2VfZW1wdHkoKSAmJiAiVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBibG9ja2FkZHJlc3MhIik7CisgICAgQ29uc3RhbnQgKlJlcGxhY2VtZW50ID0KKyAgICAgIENvbnN0YW50SW50OjpnZXQobGx2bTo6VHlwZTo6Z2V0SW50MzJUeShnZXRDb250ZXh0KCkpLCAxKTsKKyAgICB3aGlsZSAoIXVzZV9lbXB0eSgpKSB7CisgICAgICBCbG9ja0FkZHJlc3MgKkJBID0gY2FzdDxCbG9ja0FkZHJlc3M+KHVzZV9iYWNrKCkpOworICAgICAgQkEtPnJlcGxhY2VBbGxVc2VzV2l0aChDb25zdGFudEV4cHI6OmdldEludFRvUHRyKFJlcGxhY2VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBLT5nZXRUeXBlKCkpKTsKKyAgICAgIEJBLT5kZXN0cm95Q29uc3RhbnQoKTsKKyAgICB9CisgIH0KKyAgCisgIGFzc2VydChnZXRQYXJlbnQoKSA9PSAwICYmICJCYXNpY0Jsb2NrIHN0aWxsIGxpbmtlZCBpbnRvIHRoZSBwcm9ncmFtISIpOworICBkcm9wQWxsUmVmZXJlbmNlcygpOworICBJbnN0TGlzdC5jbGVhcigpOworfQorCit2b2lkIEJhc2ljQmxvY2s6OnNldFBhcmVudChGdW5jdGlvbiAqcGFyZW50KSB7CisgIGlmIChnZXRQYXJlbnQoKSkKKyAgICBMZWFrRGV0ZWN0b3I6OmFkZEdhcmJhZ2VPYmplY3QodGhpcyk7CisKKyAgLy8gU2V0IFBhcmVudD1wYXJlbnQsIHVwZGF0aW5nIGluc3RydWN0aW9uIHN5bXRhYiBlbnRyaWVzIGFzIGFwcHJvcHJpYXRlLgorICBJbnN0TGlzdC5zZXRTeW1UYWJPYmplY3QoJlBhcmVudCwgcGFyZW50KTsKKworICBpZiAoZ2V0UGFyZW50KCkpCisgICAgTGVha0RldGVjdG9yOjpyZW1vdmVHYXJiYWdlT2JqZWN0KHRoaXMpOworfQorCit2b2lkIEJhc2ljQmxvY2s6OnJlbW92ZUZyb21QYXJlbnQoKSB7CisgIGdldFBhcmVudCgpLT5nZXRCYXNpY0Jsb2NrTGlzdCgpLnJlbW92ZSh0aGlzKTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjplcmFzZUZyb21QYXJlbnQoKSB7CisgIGdldFBhcmVudCgpLT5nZXRCYXNpY0Jsb2NrTGlzdCgpLmVyYXNlKHRoaXMpOworfQorCisvLy8gbW92ZUJlZm9yZSAtIFVubGluayB0aGlzIGJhc2ljIGJsb2NrIGZyb20gaXRzIGN1cnJlbnQgZnVuY3Rpb24gYW5kCisvLy8gaW5zZXJ0IGl0IGludG8gdGhlIGZ1bmN0aW9uIHRoYXQgTW92ZVBvcyBsaXZlcyBpbiwgcmlnaHQgYmVmb3JlIE1vdmVQb3MuCit2b2lkIEJhc2ljQmxvY2s6Om1vdmVCZWZvcmUoQmFzaWNCbG9jayAqTW92ZVBvcykgeworICBNb3ZlUG9zLT5nZXRQYXJlbnQoKS0+Z2V0QmFzaWNCbG9ja0xpc3QoKS5zcGxpY2UoTW92ZVBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFyZW50KCktPmdldEJhc2ljQmxvY2tMaXN0KCksIHRoaXMpOworfQorCisvLy8gbW92ZUFmdGVyIC0gVW5saW5rIHRoaXMgYmFzaWMgYmxvY2sgZnJvbSBpdHMgY3VycmVudCBmdW5jdGlvbiBhbmQKKy8vLyBpbnNlcnQgaXQgaW50byB0aGUgZnVuY3Rpb24gdGhhdCBNb3ZlUG9zIGxpdmVzIGluLCByaWdodCBhZnRlciBNb3ZlUG9zLgordm9pZCBCYXNpY0Jsb2NrOjptb3ZlQWZ0ZXIoQmFzaWNCbG9jayAqTW92ZVBvcykgeworICBGdW5jdGlvbjo6aXRlcmF0b3IgSSA9IE1vdmVQb3M7CisgIE1vdmVQb3MtPmdldFBhcmVudCgpLT5nZXRCYXNpY0Jsb2NrTGlzdCgpLnNwbGljZSgrK0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJlbnQoKS0+Z2V0QmFzaWNCbG9ja0xpc3QoKSwgdGhpcyk7Cit9CisKKworVGVybWluYXRvckluc3QgKkJhc2ljQmxvY2s6OmdldFRlcm1pbmF0b3IoKSB7CisgIGlmIChJbnN0TGlzdC5lbXB0eSgpKSByZXR1cm4gMDsKKyAgcmV0dXJuIGR5bl9jYXN0PFRlcm1pbmF0b3JJbnN0PigmSW5zdExpc3QuYmFjaygpKTsKK30KKworY29uc3QgVGVybWluYXRvckluc3QgKkJhc2ljQmxvY2s6OmdldFRlcm1pbmF0b3IoKSBjb25zdCB7CisgIGlmIChJbnN0TGlzdC5lbXB0eSgpKSByZXR1cm4gMDsKKyAgcmV0dXJuIGR5bl9jYXN0PFRlcm1pbmF0b3JJbnN0PigmSW5zdExpc3QuYmFjaygpKTsKK30KKworSW5zdHJ1Y3Rpb24qIEJhc2ljQmxvY2s6OmdldEZpcnN0Tm9uUEhJKCkgeworICBCYXNpY0Jsb2NrOjppdGVyYXRvciBpID0gYmVnaW4oKTsKKyAgLy8gQWxsIHZhbGlkIGJhc2ljIGJsb2NrcyBzaG91bGQgaGF2ZSBhIHRlcm1pbmF0b3IsCisgIC8vIHdoaWNoIGlzIG5vdCBhIFBISU5vZGUuIElmIHdlIGhhdmUgYW4gaW52YWxpZCBiYXNpYworICAvLyBibG9jayB3ZSdsbCBnZXQgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgd2hlbiBkZXJlZmVyZW5jaW5nCisgIC8vIGEgcGFzdC10aGUtZW5kIGl0ZXJhdG9yLgorICB3aGlsZSAoaXNhPFBISU5vZGU+KGkpKSArK2k7CisgIHJldHVybiAmKmk7Cit9CisKK0luc3RydWN0aW9uKiBCYXNpY0Jsb2NrOjpnZXRGaXJzdE5vblBISU9yRGJnKCkgeworICBCYXNpY0Jsb2NrOjppdGVyYXRvciBpID0gYmVnaW4oKTsKKyAgLy8gQWxsIHZhbGlkIGJhc2ljIGJsb2NrcyBzaG91bGQgaGF2ZSBhIHRlcm1pbmF0b3IsCisgIC8vIHdoaWNoIGlzIG5vdCBhIFBISU5vZGUuIElmIHdlIGhhdmUgYW4gaW52YWxpZCBiYXNpYworICAvLyBibG9jayB3ZSdsbCBnZXQgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgd2hlbiBkZXJlZmVyZW5jaW5nCisgIC8vIGEgcGFzdC10aGUtZW5kIGl0ZXJhdG9yLgorICB3aGlsZSAoaXNhPFBISU5vZGU+KGkpKSArK2k7CisgIHJldHVybiAmKmk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHJvcEFsbFJlZmVyZW5jZXMoKSB7CisgIGZvcihpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBJLT5kcm9wQWxsUmVmZXJlbmNlcygpOworfQorCisvLy8gZ2V0U2luZ2xlUHJlZGVjZXNzb3IgLSBJZiB0aGlzIGJhc2ljIGJsb2NrIGhhcyBhIHNpbmdsZSBwcmVkZWNlc3NvciBibG9jaywKKy8vLyByZXR1cm4gdGhlIGJsb2NrLCBvdGhlcndpc2UgcmV0dXJuIGEgbnVsbCBwb2ludGVyLgorQmFzaWNCbG9jayAqQmFzaWNCbG9jazo6Z2V0U2luZ2xlUHJlZGVjZXNzb3IoKSB7CisgIHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKHRoaXMpLCBFID0gcHJlZF9lbmQodGhpcyk7CisgIGlmIChQSSA9PSBFKSByZXR1cm4gMDsgICAgICAgICAvLyBObyBwcmVkcy4KKyAgQmFzaWNCbG9jayAqVGhlUHJlZCA9ICpQSTsKKyAgKytQSTsKKyAgcmV0dXJuIChQSSA9PSBFKSA/IFRoZVByZWQgOiAwIC8qbXVsdGlwbGUgcHJlZHMqLzsKK30KKworLy8vIGdldFVuaXF1ZVByZWRlY2Vzc29yIC0gSWYgdGhpcyBiYXNpYyBibG9jayBoYXMgYSB1bmlxdWUgcHJlZGVjZXNzb3IgYmxvY2ssCisvLy8gcmV0dXJuIHRoZSBibG9jaywgb3RoZXJ3aXNlIHJldHVybiBhIG51bGwgcG9pbnRlci4KKy8vLyBOb3RlIHRoYXQgdW5pcXVlIHByZWRlY2Vzc29yIGRvZXNuJ3QgbWVhbiBzaW5nbGUgZWRnZSwgdGhlcmUgY2FuIGJlIAorLy8vIG11bHRpcGxlIGVkZ2VzIGZyb20gdGhlIHVuaXF1ZSBwcmVkZWNlc3NvciB0byB0aGlzIGJsb2NrIChmb3IgZXhhbXBsZSAKKy8vLyBhIHN3aXRjaCBzdGF0ZW1lbnQgd2l0aCBtdWx0aXBsZSBjYXNlcyBoYXZpbmcgdGhlIHNhbWUgZGVzdGluYXRpb24pLgorQmFzaWNCbG9jayAqQmFzaWNCbG9jazo6Z2V0VW5pcXVlUHJlZGVjZXNzb3IoKSB7CisgIHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKHRoaXMpLCBFID0gcHJlZF9lbmQodGhpcyk7CisgIGlmIChQSSA9PSBFKSByZXR1cm4gMDsgLy8gTm8gcHJlZHMuCisgIEJhc2ljQmxvY2sgKlByZWRCQiA9ICpQSTsKKyAgKytQSTsKKyAgZm9yICg7UEkgIT0gRTsgKytQSSkgeworICAgIGlmICgqUEkgIT0gUHJlZEJCKQorICAgICAgcmV0dXJuIDA7CisgICAgLy8gVGhlIHNhbWUgcHJlZGVjZXNzb3IgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgcHJlZGVjZXNzb3IgbGlzdC4KKyAgICAvLyBUaGlzIGlzIE9LLgorICB9CisgIHJldHVybiBQcmVkQkI7Cit9CisKKy8vLyByZW1vdmVQcmVkZWNlc3NvciAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gbm90aWZ5IGEgQmFzaWNCbG9jayB0aGF0IHRoZQorLy8vIHNwZWNpZmllZCBQcmVkZWNlc3NvciBvZiB0aGUgYmxvY2sgaXMgbm8gbG9uZ2VyIGFibGUgdG8gcmVhY2ggaXQuICBUaGlzIGlzCisvLy8gYWN0dWFsbHkgbm90IHVzZWQgdG8gdXBkYXRlIHRoZSBQcmVkZWNlc3NvciBsaXN0LCBidXQgaXMgYWN0dWFsbHkgdXNlZCB0bworLy8vIHVwZGF0ZSB0aGUgUEhJIG5vZGVzIHRoYXQgcmVzaWRlIGluIHRoZSBibG9jay4gIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBiZQorLy8vIGNhbGxlZCB3aGlsZSB0aGUgcHJlZGVjZXNzb3Igc3RpbGwgcmVmZXJzIHRvIHRoaXMgYmxvY2suCisvLy8KK3ZvaWQgQmFzaWNCbG9jazo6cmVtb3ZlUHJlZGVjZXNzb3IoQmFzaWNCbG9jayAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEb250RGVsZXRlVXNlbGVzc1BISXMpIHsKKyAgYXNzZXJ0KChoYXNOVXNlc09yTW9yZSgxNil8fC8vIFJlZHVjZSBjb3N0IG9mIHRoaXMgYXNzZXJ0aW9uIGZvciBjb21wbGV4IENGR3MuCisgICAgICAgICAgZmluZChwcmVkX2JlZ2luKHRoaXMpLCBwcmVkX2VuZCh0aGlzKSwgUHJlZCkgIT0gcHJlZF9lbmQodGhpcykpICYmCisgICAgICAgICAicmVtb3ZlUHJlZGVjZXNzb3I6IEJCIGlzIG5vdCBhIHByZWRlY2Vzc29yISIpOworCisgIGlmIChJbnN0TGlzdC5lbXB0eSgpKSByZXR1cm47CisgIFBISU5vZGUgKkFQTiA9IGR5bl9jYXN0PFBISU5vZGU+KCZmcm9udCgpKTsKKyAgaWYgKCFBUE4pIHJldHVybjsgICAvLyBRdWljayBleGl0LgorCisgIC8vIElmIHRoZXJlIGFyZSBleGFjdGx5IHR3byBwcmVkZWNlc3NvcnMsIHRoZW4gd2Ugd2FudCB0byBudWtlIHRoZSBQSEkgbm9kZXMKKyAgLy8gYWx0b2dldGhlci4gIEhvd2V2ZXIsIHdlIGNhbm5vdCBkbyB0aGlzLCBpZiB0aGlzIGluIHRoaXMgY2FzZToKKyAgLy8KKyAgLy8gIExvb3A6CisgIC8vICAgICV4ID0gcGhpIFtYLCBMb29wXQorICAvLyAgICAleDIgPSBhZGQgJXgsIDEgICAgICAgICA7OyBUaGlzIHdvdWxkIGJlY29tZSAleDIgPSBhZGQgJXgyLCAxCisgIC8vICAgIGJyIExvb3AgICAgICAgICAgICAgICAgIDs7ICV4MiBkb2VzIG5vdCBkb21pbmF0ZSBhbGwgdXNlcworICAvLworICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIFBISSBub2RlIGlucHV0IGlzIGFjdHVhbGx5IHRha2VuIGZyb20gdGhlIHByZWRlY2Vzc29yCisgIC8vIGJhc2ljIGJsb2NrLiAgVGhlIG9ubHkgY2FzZSB0aGlzIGNhbiBoYXBwZW4gaXMgd2l0aCBhIHNlbGYgbG9vcCwgc28gd2UKKyAgLy8gY2hlY2sgZm9yIHRoaXMgY2FzZSBleHBsaWNpdGx5IG5vdy4KKyAgLy8KKyAgdW5zaWduZWQgbWF4X2lkeCA9IEFQTi0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsKKyAgYXNzZXJ0KG1heF9pZHggIT0gMCAmJiAiUEhJIE5vZGUgaW4gYmxvY2sgd2l0aCAwIHByZWRlY2Vzc29ycyE/IT8hIik7CisgIGlmIChtYXhfaWR4ID09IDIpIHsKKyAgICBCYXNpY0Jsb2NrICpPdGhlciA9IEFQTi0+Z2V0SW5jb21pbmdCbG9jayhBUE4tPmdldEluY29taW5nQmxvY2soMCkgPT0gUHJlZCk7CisKKyAgICAvLyBEaXNhYmxlIFBISSBlbGltaW5hdGlvbiEKKyAgICBpZiAodGhpcyA9PSBPdGhlcikgbWF4X2lkeCA9IDM7CisgIH0KKworICAvLyA8PSBUd28gcHJlZGVjZXNzb3JzIEJFRk9SRSBJIHJlbW92ZSBvbmU/CisgIGlmIChtYXhfaWR4IDw9IDIgJiYgIURvbnREZWxldGVVc2VsZXNzUEhJcykgeworICAgIC8vIFl1cCwgbG9vcCB0aHJvdWdoIGFuZCBudWtlIHRoZSBQSEkgbm9kZXMKKyAgICB3aGlsZSAoUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPigmZnJvbnQoKSkpIHsKKyAgICAgIC8vIFJlbW92ZSB0aGUgcHJlZGVjZXNzb3IgZmlyc3QuCisgICAgICBQTi0+cmVtb3ZlSW5jb21pbmdWYWx1ZShQcmVkLCAhRG9udERlbGV0ZVVzZWxlc3NQSElzKTsKKworICAgICAgLy8gSWYgdGhlIFBISSBfSEFEXyB0d28gdXNlcywgcmVwbGFjZSBQSEkgbm9kZSB3aXRoIGl0cyBub3cgKnNpbmdsZSogdmFsdWUKKyAgICAgIGlmIChtYXhfaWR4ID09IDIpIHsKKyAgICAgICAgaWYgKFBOLT5nZXRPcGVyYW5kKDApICE9IFBOKQorICAgICAgICAgIFBOLT5yZXBsYWNlQWxsVXNlc1dpdGgoUE4tPmdldE9wZXJhbmQoMCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgLy8gV2UgYXJlIGxlZnQgd2l0aCBhbiBpbmZpbml0ZSBsb29wIHdpdGggbm8gZW50cmllczoga2lsbCB0aGUgUEhJLgorICAgICAgICAgIFBOLT5yZXBsYWNlQWxsVXNlc1dpdGgoVW5kZWZWYWx1ZTo6Z2V0KFBOLT5nZXRUeXBlKCkpKTsKKyAgICAgICAgZ2V0SW5zdExpc3QoKS5wb3BfZnJvbnQoKTsgICAgLy8gUmVtb3ZlIHRoZSBQSEkgbm9kZQorICAgICAgfQorCisgICAgICAvLyBJZiB0aGUgUEhJIG5vZGUgYWxyZWFkeSBvbmx5IGhhZCBvbmUgZW50cnksIGl0IGdvdCBkZWxldGVkIGJ5CisgICAgICAvLyByZW1vdmVJbmNvbWluZ1ZhbHVlLgorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBPa2F5LCBub3cgd2Uga25vdyB0aGF0IHdlIG5lZWQgdG8gcmVtb3ZlIHByZWRlY2Vzc29yICNwcmVkX2lkeCBmcm9tIGFsbAorICAgIC8vIFBISSBub2Rlcy4gIEl0ZXJhdGUgb3ZlciBlYWNoIFBISSBub2RlIGZpeGluZyB0aGVtIHVwCisgICAgUEhJTm9kZSAqUE47CisgICAgZm9yIChpdGVyYXRvciBJSSA9IGJlZ2luKCk7IChQTiA9IGR5bl9jYXN0PFBISU5vZGU+KElJKSk7ICkgeworICAgICAgKytJSTsKKyAgICAgIFBOLT5yZW1vdmVJbmNvbWluZ1ZhbHVlKFByZWQsIGZhbHNlKTsKKyAgICAgIC8vIElmIGFsbCBpbmNvbWluZyB2YWx1ZXMgdG8gdGhlIFBoaSBhcmUgdGhlIHNhbWUsIHdlIGNhbiByZXBsYWNlIHRoZSBQaGkKKyAgICAgIC8vIHdpdGggdGhhdCB2YWx1ZS4KKyAgICAgIFZhbHVlKiBQTlYgPSAwOworICAgICAgaWYgKCFEb250RGVsZXRlVXNlbGVzc1BISXMgJiYgKFBOViA9IFBOLT5oYXNDb25zdGFudFZhbHVlKCkpKSB7CisgICAgICAgIFBOLT5yZXBsYWNlQWxsVXNlc1dpdGgoUE5WKTsKKyAgICAgICAgUE4tPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8vLyBzcGxpdEJhc2ljQmxvY2sgLSBUaGlzIHNwbGl0cyBhIGJhc2ljIGJsb2NrIGludG8gdHdvIGF0IHRoZSBzcGVjaWZpZWQKKy8vLyBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIEJFRk9SRSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHN0YXkKKy8vLyBhcyBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBiYXNpYyBibG9jaywgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggaXMgYWRkZWQgdG8KKy8vLyB0aGUgbmV3IEJCLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgQkIgYXJlIG1vdmVkIHRvIHRoZSBuZXcKKy8vLyBCQiwgaW5jbHVkaW5nIHRoZSBvbGQgdGVybWluYXRvci4gIFRoaXMgaW52YWxpZGF0ZXMgdGhlIGl0ZXJhdG9yLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBvbiB3ZWxsIGZvcm1lZCBiYXNpYyBibG9ja3MgKG11c3QgaGF2ZSBhCisvLy8gdGVybWluYXRvciksIGFuZCAnSScgbXVzdCBub3QgYmUgdGhlIGVuZCBvZiBpbnN0cnVjdGlvbiBsaXN0ICh3aGljaCB3b3VsZAorLy8vIGNhdXNlIGEgZGVnZW5lcmF0ZSBiYXNpYyBibG9jayB0byBiZSBmb3JtZWQsIGhhdmluZyBhIHRlcm1pbmF0b3IgaW5zaWRlIG9mCisvLy8gdGhlIGJhc2ljIGJsb2NrKS4KKy8vLworQmFzaWNCbG9jayAqQmFzaWNCbG9jazo6c3BsaXRCYXNpY0Jsb2NrKGl0ZXJhdG9yIEkpIHsKKyAgYXNzZXJ0KGdldFRlcm1pbmF0b3IoKSAmJiAiQ2FuJ3QgdXNlIHNwbGl0QmFzaWNCbG9jayBvbiBkZWdlbmVyYXRlIEJCISIpOworICBhc3NlcnQoSSAhPSBJbnN0TGlzdC5lbmQoKSAmJgorICAgICAgICAgIlRyeWluZyB0byBnZXQgbWUgdG8gY3JlYXRlIGRlZ2VuZXJhdGUgYmFzaWMgYmxvY2shIik7CisKKyAgQmFzaWNCbG9jayAqSW5zZXJ0QmVmb3JlID0gbGx2bTo6bmV4dChGdW5jdGlvbjo6aXRlcmF0b3IodGhpcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5vZGVQdHJVbmNoZWNrZWQoKTsKKyAgQmFzaWNCbG9jayAqTmV3ID0gQmFzaWNCbG9jazo6Q3JlYXRlKGdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhcmVudCgpLCBJbnNlcnRCZWZvcmUpOworCisgIC8vIE1vdmUgYWxsIG9mIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIG9yaWdpbmFsIGJhc2ljIGJsb2NrIGludG8KKyAgLy8gdGhlIG5ldyBiYXNpYyBibG9jay4KKyAgTmV3LT5nZXRJbnN0TGlzdCgpLnNwbGljZShOZXctPmVuZCgpLCB0aGlzLT5nZXRJbnN0TGlzdCgpLCBJLCBlbmQoKSk7CisKKyAgLy8gQWRkIGEgYnJhbmNoIGluc3RydWN0aW9uIHRvIHRoZSBuZXdseSBmb3JtZWQgYmFzaWMgYmxvY2suCisgIEJyYW5jaEluc3Q6OkNyZWF0ZShOZXcsIHRoaXMpOworCisgIC8vIE5vdyB3ZSBtdXN0IGxvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIHN1Y2Nlc3NvcnMgb2YgdGhlIE5ldyBibG9jayAod2hpY2gKKyAgLy8gX3dlcmVfIHRoZSBzdWNjZXNzb3JzIG9mIHRoZSAndGhpcycgYmxvY2spLCBhbmQgdXBkYXRlIGFueSBQSEkgbm9kZXMgaW4KKyAgLy8gc3VjY2Vzc29ycy4gIElmIHRoZXJlIHdlcmUgUEhJIG5vZGVzIGluIHRoZSBzdWNjZXNzb3JzLCB0aGVuIHRoZXkgbmVlZCB0bworICAvLyBrbm93IHRoYXQgaW5jb21pbmcgYnJhbmNoZXMgd2lsbCBiZSBmcm9tIE5ldywgbm90IGZyb20gT2xkLgorICAvLworICBmb3IgKHN1Y2NfaXRlcmF0b3IgSSA9IHN1Y2NfYmVnaW4oTmV3KSwgRSA9IHN1Y2NfZW5kKE5ldyk7IEkgIT0gRTsgKytJKSB7CisgICAgLy8gTG9vcCBvdmVyIGFueSBwaGkgbm9kZXMgaW4gdGhlIGJhc2ljIGJsb2NrLCB1cGRhdGluZyB0aGUgQkIgZmllbGQgb2YKKyAgICAvLyBpbmNvbWluZyB2YWx1ZXMuLi4KKyAgICBCYXNpY0Jsb2NrICpTdWNjZXNzb3IgPSAqSTsKKyAgICBQSElOb2RlICpQTjsKKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gU3VjY2Vzc29yLT5iZWdpbigpOworICAgICAgICAgKFBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oSUkpKTsgKytJSSkgeworICAgICAgaW50IElEWCA9IFBOLT5nZXRCYXNpY0Jsb2NrSW5kZXgodGhpcyk7CisgICAgICB3aGlsZSAoSURYICE9IC0xKSB7CisgICAgICAgIFBOLT5zZXRJbmNvbWluZ0Jsb2NrKCh1bnNpZ25lZClJRFgsIE5ldyk7CisgICAgICAgIElEWCA9IFBOLT5nZXRCYXNpY0Jsb2NrSW5kZXgodGhpcyk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBOZXc7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9WTUNvcmUvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS9saWIvVk1Db3JlL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODhjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzUgQEAKK2FkZF9sbHZtX2xpYnJhcnkoTExWTUNvcmUKKyAgQXNtV3JpdGVyLmNwcAorICBBdHRyaWJ1dGVzLmNwcAorICBBdXRvVXBncmFkZS5jcHAKKyAgQmFzaWNCbG9jay5jcHAKKyAgQ29uc3RhbnRGb2xkLmNwcAorICBDb25zdGFudHMuY3BwCisgIENvcmUuY3BwCisgIERlYnVnTG9jLmNwcAorICBEb21pbmF0b3JzLmNwcAorICBGdW5jdGlvbi5jcHAKKyAgR1ZNYXRlcmlhbGl6ZXIuY3BwCisgIEdsb2JhbHMuY3BwCisgIElSQnVpbGRlci5jcHAKKyAgSW5saW5lQXNtLmNwcAorICBJbnN0cnVjdGlvbi5jcHAKKyAgSW5zdHJ1Y3Rpb25zLmNwcAorICBJbnRyaW5zaWNJbnN0LmNwcAorICBMTFZNQ29udGV4dC5jcHAKKyAgTExWTUNvbnRleHRJbXBsLmNwcAorICBMZWFrRGV0ZWN0b3IuY3BwCisgIE1ldGFkYXRhLmNwcAorICBNb2R1bGUuY3BwCisgIFBhc3MuY3BwCisgIFBhc3NNYW5hZ2VyLmNwcAorICBQYXNzUmVnaXN0cnkuY3BwCisgIFByaW50TW9kdWxlUGFzcy5jcHAKKyAgVHlwZS5jcHAKKyAgVHlwZVN5bWJvbFRhYmxlLmNwcAorICBVc2UuY3BwCisgIFZhbHVlLmNwcAorICBWYWx1ZVN5bWJvbFRhYmxlLmNwcAorICBWYWx1ZVR5cGVzLmNwcAorICBWZXJpZmllci5jcHAKKyAgKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9Db25zdGFudEZvbGQuY3BwIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9Db25zdGFudEZvbGQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjcyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL0NvbnN0YW50Rm9sZC5jcHAKQEAgLTAsMCArMSwyMjk5IEBACisvLz09PS0gQ29uc3RhbnRGb2xkLmNwcCAtIExMVk0gY29uc3RhbnQgZm9sZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZvbGRpbmcgb2YgY29uc3RhbnRzIGZvciBMTFZNLiAgVGhpcyBpbXBsZW1lbnRzIHRoZQorLy8gKGludGVybmFsKSBDb25zdGFudEZvbGQuaCBpbnRlcmZhY2UsIHdoaWNoIGlzIHVzZWQgYnkgdGhlCisvLyBDb25zdGFudEV4cHI6OmdldCogbWV0aG9kcyB0byBhdXRvbWF0aWNhbGx5IGZvbGQgY29uc3RhbnRzIHdoZW4gcG9zc2libGUuCisvLworLy8gVGhlIGN1cnJlbnQgY29uc3RhbnQgZm9sZGluZyBpbXBsZW1lbnRhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0d28gcGllY2VzOiB0aGUKKy8vIHBpZWNlcyB0aGF0IGRvbid0IG5lZWQgVGFyZ2V0RGF0YSwgYW5kIHRoZSBwaWVjZXMgdGhhdCBkby4gVGhpcyBpcyB0byBhdm9pZAorLy8gYSBkZXBlbmRlbmNlIGluIFZNQ29yZSBvbiBUYXJnZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkNvbnN0YW50Rm9sZC5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbEFsaWFzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxsaW1pdHM+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgIENvbnN0YW50Rm9sZCpJbnN0cnVjdGlvbiBJbXBsZW1lbnRhdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBCaXRDYXN0Q29uc3RhbnRWZWN0b3IgLSBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgQ29uc3RhbnRWZWN0b3Igbm9kZSB0byB0aGUKKy8vLyBzcGVjaWZpZWQgdmVjdG9yIHR5cGUuICBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHRoYXQgdGhlIGVsZW1lbnRzIG9mIHRoZQorLy8vIGlucHV0IHZlY3RvciBjb25zdGFudCBhcmUgYWxsIHNpbXBsZSBpbnRlZ2VyIG9yIEZQIHZhbHVlcy4KK3N0YXRpYyBDb25zdGFudCAqQml0Q2FzdENvbnN0YW50VmVjdG9yKENvbnN0YW50VmVjdG9yICpDViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvclR5cGUgKkRzdFR5KSB7CisgIC8vIElmIHRoaXMgY2FzdCBjaGFuZ2VzIGVsZW1lbnQgY291bnQgdGhlbiB3ZSBjYW4ndCBoYW5kbGUgaXQgaGVyZToKKyAgLy8gZG9pbmcgc28gcmVxdWlyZXMgZW5kaWFubmVzcyBpbmZvcm1hdGlvbi4gIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkKKyAgLy8gQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmNwcAorICB1bnNpZ25lZCBOdW1FbHRzID0gRHN0VHktPmdldE51bUVsZW1lbnRzKCk7CisgIGlmIChOdW1FbHRzICE9IENWLT5nZXROdW1PcGVyYW5kcygpKQorICAgIHJldHVybiAwOworCisgIC8vIENoZWNrIHRvIHZlcmlmeSB0aGF0IGFsbCBlbGVtZW50cyBvZiB0aGUgaW5wdXQgYXJlIHNpbXBsZS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbHRzOyArK2kpIHsKKyAgICBpZiAoIWlzYTxDb25zdGFudEludD4oQ1YtPmdldE9wZXJhbmQoaSkpICYmCisgICAgICAgICFpc2E8Q29uc3RhbnRGUD4oQ1YtPmdldE9wZXJhbmQoaSkpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBCaXRjYXN0IGVhY2ggZWxlbWVudCBub3cuCisgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gUmVzdWx0OworICBjb25zdCBUeXBlICpEc3RFbHRUeSA9IERzdFR5LT5nZXRFbGVtZW50VHlwZSgpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUVsdHM7ICsraSkKKyAgICBSZXN1bHQucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChDVi0+Z2V0T3BlcmFuZChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEc3RFbHRUeSkpOworICByZXR1cm4gQ29uc3RhbnRWZWN0b3I6OmdldChSZXN1bHQpOworfQorCisvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHdoaWNoIG9wY29kZSB0byB1c2UgdG8gZm9sZCB0d28gY29uc3RhbnQgY2FzdCAKKy8vLyBleHByZXNzaW9ucyB0b2dldGhlci4gSXQgdXNlcyBDYXN0SW5zdDo6aXNFbGltaW5hYmxlQ2FzdFBhaXIgdG8gZGV0ZXJtaW5lCisvLy8gdGhlIG9wY29kZS4gQ29uc2VxdWVudGx5IGl0cyBqdXN0IGEgd3JhcHBlciBhcm91bmQgdGhhdCBmdW5jdGlvbi4KKy8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIGl0IGlzIHZhbGlkIHRvIGZvbGQgYSBjYXN0IG9mIGEgY2FzdAorc3RhdGljIHVuc2lnbmVkCitmb2xkQ29uc3RhbnRDYXN0UGFpcigKKyAgdW5zaWduZWQgb3BjLCAgICAgICAgICAvLy88IG9wY29kZSBvZiB0aGUgc2Vjb25kIGNhc3QgY29uc3RhbnQgZXhwcmVzc2lvbgorICBDb25zdGFudEV4cHIgKk9wLCAgICAgIC8vLzwgdGhlIGZpcnN0IGNhc3QgY29uc3RhbnQgZXhwcmVzc2lvbgorICBjb25zdCBUeXBlICpEc3RUeSAgICAgIC8vLzwgZGVzaW50YXRpb24gdHlwZSBvZiB0aGUgZmlyc3QgY2FzdAorKSB7CisgIGFzc2VydChPcCAmJiBPcC0+aXNDYXN0KCkgJiYgIkNhbid0IGZvbGQgY2FzdCBvZiBjYXN0IHdpdGhvdXQgYSBjYXN0ISIpOworICBhc3NlcnQoRHN0VHkgJiYgRHN0VHktPmlzRmlyc3RDbGFzc1R5cGUoKSAmJiAiSW52YWxpZCBjYXN0IGRlc3RpbmF0aW9uIHR5cGUiKTsKKyAgYXNzZXJ0KENhc3RJbnN0Ojppc0Nhc3Qob3BjKSAmJiAiSW52YWxpZCBjYXN0IG9wY29kZSIpOworCisgIC8vIFRoZSB0aGUgdHlwZXMgYW5kIG9wY29kZXMgZm9yIHRoZSB0d28gQ2FzdCBjb25zdGFudCBleHByZXNzaW9ucworICBjb25zdCBUeXBlICpTcmNUeSA9IE9wLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgIGNvbnN0IFR5cGUgKk1pZFR5ID0gT3AtPmdldFR5cGUoKTsKKyAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgZmlyc3RPcCA9IEluc3RydWN0aW9uOjpDYXN0T3BzKE9wLT5nZXRPcGNvZGUoKSk7CisgIEluc3RydWN0aW9uOjpDYXN0T3BzIHNlY29uZE9wID0gSW5zdHJ1Y3Rpb246OkNhc3RPcHMob3BjKTsKKworICAvLyBMZXQgQ2FzdEluc3Q6OmlzRWxpbWluYWJsZUNhc3RQYWlyIGRvIHRoZSBoZWF2eSBsaWZ0aW5nLgorICByZXR1cm4gQ2FzdEluc3Q6OmlzRWxpbWluYWJsZUNhc3RQYWlyKGZpcnN0T3AsIHNlY29uZE9wLCBTcmNUeSwgTWlkVHksIERzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDY0VHkoRHN0VHktPmdldENvbnRleHQoKSkpOworfQorCitzdGF0aWMgQ29uc3RhbnQgKkZvbGRCaXRDYXN0KENvbnN0YW50ICpWLCBjb25zdCBUeXBlICpEZXN0VHkpIHsKKyAgY29uc3QgVHlwZSAqU3JjVHkgPSBWLT5nZXRUeXBlKCk7CisgIGlmIChTcmNUeSA9PSBEZXN0VHkpCisgICAgcmV0dXJuIFY7IC8vIG5vLW9wIGNhc3QKKworICAvLyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGNhc3RpbmcgYSBwb2ludGVyIHRvIGFuIGFnZ3JlZ2F0ZSB0byBhIHBvaW50ZXIgdG8KKyAgLy8gdGhlIGZpcnN0IGVsZW1lbnQuICBJZiBzbywgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBHRVAgaW5zdHJ1Y3Rpb24uCisgIGlmIChjb25zdCBQb2ludGVyVHlwZSAqUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFYtPmdldFR5cGUoKSkpCisgICAgaWYgKGNvbnN0IFBvaW50ZXJUeXBlICpEUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KERlc3RUeSkpCisgICAgICBpZiAoUFR5LT5nZXRBZGRyZXNzU3BhY2UoKSA9PSBEUFR5LT5nZXRBZGRyZXNzU3BhY2UoKSkgeworICAgICAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDg+IElkeExpc3Q7CisgICAgICAgIFZhbHVlICpaZXJvID0KKyAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDMyVHkoRFBUeS0+Z2V0Q29udGV4dCgpKSk7CisgICAgICAgIElkeExpc3QucHVzaF9iYWNrKFplcm8pOworICAgICAgICBjb25zdCBUeXBlICpFbFR5ID0gUFR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICB3aGlsZSAoRWxUeSAhPSBEUFR5LT5nZXRFbGVtZW50VHlwZSgpKSB7CisgICAgICAgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KEVsVHkpKSB7CisgICAgICAgICAgICBpZiAoU1R5LT5nZXROdW1FbGVtZW50cygpID09IDApIGJyZWFrOworICAgICAgICAgICAgRWxUeSA9IFNUeS0+Z2V0RWxlbWVudFR5cGUoMCk7CisgICAgICAgICAgICBJZHhMaXN0LnB1c2hfYmFjayhaZXJvKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNvbnN0IFNlcXVlbnRpYWxUeXBlICpTVHkgPSAKKyAgICAgICAgICAgICAgICAgICAgIGR5bl9jYXN0PFNlcXVlbnRpYWxUeXBlPihFbFR5KSkgeworICAgICAgICAgICAgaWYgKEVsVHktPmlzUG9pbnRlclR5KCkpIGJyZWFrOyAgLy8gQ2FuJ3QgaW5kZXggaW50byBwb2ludGVycyEKKyAgICAgICAgICAgIEVsVHkgPSBTVHktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICAgICAgICBJZHhMaXN0LnB1c2hfYmFjayhaZXJvKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKEVsVHkgPT0gRFBUeS0+Z2V0RWxlbWVudFR5cGUoKSkKKyAgICAgICAgICAvLyBUaGlzIEdFUCBpcyBpbmJvdW5kcyBiZWNhdXNlIGFsbCBpbmRpY2VzIGFyZSB6ZXJvLgorICAgICAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihWLCAmSWR4TGlzdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4TGlzdC5zaXplKCkpOworICAgICAgfQorCisgIC8vIEhhbmRsZSBjYXN0cyBmcm9tIG9uZSB2ZWN0b3IgY29uc3RhbnQgdG8gYW5vdGhlci4gIFdlIGtub3cgdGhhdCB0aGUgc3JjIAorICAvLyBhbmQgZGVzdCB0eXBlIGhhdmUgdGhlIHNhbWUgc2l6ZSAob3RoZXJ3aXNlIGl0cyBhbiBpbGxlZ2FsIGNhc3QpLgorICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqRGVzdFBUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KERlc3RUeSkpIHsKKyAgICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqU3JjVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihWLT5nZXRUeXBlKCkpKSB7CisgICAgICBhc3NlcnQoRGVzdFBUeS0+Z2V0Qml0V2lkdGgoKSA9PSBTcmNUeS0+Z2V0Qml0V2lkdGgoKSAmJgorICAgICAgICAgICAgICJOb3QgY2FzdCBiZXR3ZWVuIHNhbWUgc2l6ZWQgdmVjdG9ycyEiKTsKKyAgICAgIFNyY1R5ID0gTlVMTDsKKyAgICAgIC8vIEZpcnN0LCBjaGVjayBmb3IgbnVsbC4gIFVuZGVmIGlzIGFscmVhZHkgaGFuZGxlZC4KKyAgICAgIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihWKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoRGVzdFR5KTsKKworICAgICAgaWYgKENvbnN0YW50VmVjdG9yICpDViA9IGR5bl9jYXN0PENvbnN0YW50VmVjdG9yPihWKSkKKyAgICAgICAgcmV0dXJuIEJpdENhc3RDb25zdGFudFZlY3RvcihDViwgRGVzdFBUeSk7CisgICAgfQorCisgICAgLy8gQ2Fub25pY2FsaXplIHNjYWxhci10by12ZWN0b3IgYml0Y2FzdHMgaW50byB2ZWN0b3ItdG8tdmVjdG9yIGJpdGNhc3RzCisgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG90aGVyIHNpbXBsaWZpY2F0aW9ucyAoYWx0aG91Z2ggc29tZSBvZiB0aGVtCisgICAgLy8gY2FuIG9ubHkgYmUgaGFuZGxlZCBieSBBbmFseXNpcy9Db25zdGFudEZvbGRpbmcuY3BwKS4KKyAgICBpZiAoaXNhPENvbnN0YW50SW50PihWKSB8fCBpc2E8Q29uc3RhbnRGUD4oVikpCisgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KENvbnN0YW50VmVjdG9yOjpnZXQoJlYsIDEpLCBEZXN0UFR5KTsKKyAgfQorCisgIC8vIEZpbmFsbHksIGltcGxlbWVudCBiaXRjYXN0IGZvbGRpbmcgbm93LiAgIFRoZSBjb2RlIGJlbG93IGRvZXNuJ3QgaGFuZGxlCisgIC8vIGJpdGNhc3QgcmlnaHQuCisgIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oVikpICAvLyBwdHItPnB0ciBjYXN0LgorICAgIHJldHVybiBDb25zdGFudFBvaW50ZXJOdWxsOjpnZXQoY2FzdDxQb2ludGVyVHlwZT4oRGVzdFR5KSk7CisKKyAgLy8gSGFuZGxlIGludGVncmFsIGNvbnN0YW50IGlucHV0LgorICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFYpKSB7CisgICAgaWYgKERlc3RUeS0+aXNJbnRlZ2VyVHkoKSkKKyAgICAgIC8vIEludGVncmFsIC0+IEludGVncmFsLiBUaGlzIGlzIGEgbm8tb3AgYmVjYXVzZSB0aGUgYml0IHdpZHRocyBtdXN0CisgICAgICAvLyBiZSB0aGUgc2FtZS4gQ29uc2VxdWVudGx5LCB3ZSBqdXN0IGZvbGQgdG8gVi4KKyAgICAgIHJldHVybiBWOworCisgICAgaWYgKERlc3RUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSkKKyAgICAgIHJldHVybiBDb25zdGFudEZQOjpnZXQoRGVzdFR5LT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQRmxvYXQoQ0ktPmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIURlc3RUeS0+aXNQUENfRlAxMjhUeSgpKSk7CisKKyAgICAvLyBPdGhlcndpc2UsIGNhbid0IGZvbGQgdGhpcyAodmVjdG9yPykKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEhhbmRsZSBDb25zdGFudEZQIGlucHV0OiBGUCAtPiBJbnRlZ3JhbC4KKyAgaWYgKENvbnN0YW50RlAgKkZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oVikpCisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoRlAtPmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUC0+Z2V0VmFsdWVBUEYoKS5iaXRjYXN0VG9BUEludCgpKTsKKworICByZXR1cm4gMDsKK30KKworCisvLy8gRXh0cmFjdENvbnN0YW50Qnl0ZXMgLSBWIGlzIGFuIGludGVnZXIgY29uc3RhbnQgd2hpY2ggb25seSBoYXMgYSBzdWJzZXQgb2YKKy8vLyBpdHMgYnl0ZXMgdXNlZC4gIFRoZSBieXRlcyB1c2VkIGFyZSBpbmRpY2F0ZWQgYnkgQnl0ZVN0YXJ0ICh3aGljaCBpcyB0aGUKKy8vLyBmaXJzdCBieXRlIHVzZWQsIGNvdW50aW5nIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUpIGFuZCBCeXRlU2l6ZSwKKy8vLyB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgdG8gc2VlIGlmIHRoZSBzcGVjaWZpZWQgYnl0ZQorLy8vIHJhbmdlIGNhbiBiZSByZXR1cm5lZCBhcyBhIHNpbXBsaWZpZWQgY29uc3RhbnQuICBJZiBzbywgdGhlIGNvbnN0YW50IGlzCisvLy8gcmV0dXJuZWQsIG90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkLgorLy8vIAorc3RhdGljIENvbnN0YW50ICpFeHRyYWN0Q29uc3RhbnRCeXRlcyhDb25zdGFudCAqQywgdW5zaWduZWQgQnl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlU2l6ZSkgeworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpICYmCisgICAgICAgICAoY2FzdDxJbnRlZ2VyVHlwZT4oQy0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKSAmIDcpID09IDAgJiYKKyAgICAgICAgICJOb24tYnl0ZSBzaXplZCBpbnRlZ2VyIGlucHV0Iik7CisgIHVuc2lnbmVkIENTaXplID0gY2FzdDxJbnRlZ2VyVHlwZT4oQy0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKS84OworICBhc3NlcnQoQnl0ZVNpemUgJiYgIk11c3QgYmUgYWNjZXNzaW5nIHNvbWUgcGllY2UiKTsKKyAgYXNzZXJ0KEJ5dGVTdGFydCtCeXRlU2l6ZSA8PSBDU2l6ZSAmJiAiRXh0cmFjdGluZyBpbnZhbGlkIHBpZWNlIGZyb20gaW5wdXQiKTsKKyAgYXNzZXJ0KEJ5dGVTaXplICE9IENTaXplICYmICJTaG91bGQgbm90IGV4dHJhY3QgZXZlcnl0aGluZyIpOworICAKKyAgLy8gQ29uc3RhbnQgSW50ZWdlcnMgYXJlIHNpbXBsZS4KKyAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDKSkgeworICAgIEFQSW50IFYgPSBDSS0+Z2V0VmFsdWUoKTsKKyAgICBpZiAoQnl0ZVN0YXJ0KQorICAgICAgViA9IFYubHNocihCeXRlU3RhcnQqOCk7CisgICAgVi50cnVuYyhCeXRlU2l6ZSo4KTsKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChDSS0+Z2V0Q29udGV4dCgpLCBWKTsKKyAgfQorICAKKyAgLy8gSW4gdGhlIGlucHV0IGlzIGEgY29uc3RhbnQgZXhwciwgd2UgbWlnaHQgYmUgYWJsZSB0byByZWN1cnNpdmVseSBzaW1wbGlmeS4KKyAgLy8gSWYgbm90LCB3ZSBkZWZpbml0ZWx5IGNhbid0IGRvIGFueXRoaW5nLgorICBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDKTsKKyAgaWYgKENFID09IDApIHJldHVybiAwOworICAKKyAgc3dpdGNoIChDRS0+Z2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogcmV0dXJuIDA7CisgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9yOiB7CisgICAgQ29uc3RhbnQgKlJIUyA9IEV4dHJhY3RDb25zdGFudEJ5dGVzKENFLT5nZXRPcGVyYW5kKDEpLCBCeXRlU3RhcnQsQnl0ZVNpemUpOworICAgIGlmIChSSFMgPT0gMCkKKyAgICAgIHJldHVybiAwOworICAgIAorICAgIC8vIFggfCAtMSAtPiAtMS4KKyAgICBpZiAoQ29uc3RhbnRJbnQgKlJIU0MgPSBkeW5fY2FzdDxDb25zdGFudEludD4oUkhTKSkKKyAgICAgIGlmIChSSFNDLT5pc0FsbE9uZXNWYWx1ZSgpKQorICAgICAgICByZXR1cm4gUkhTQzsKKyAgICAKKyAgICBDb25zdGFudCAqTEhTID0gRXh0cmFjdENvbnN0YW50Qnl0ZXMoQ0UtPmdldE9wZXJhbmQoMCksIEJ5dGVTdGFydCxCeXRlU2l6ZSk7CisgICAgaWYgKExIUyA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0T3IoTEhTLCBSSFMpOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDogeworICAgIENvbnN0YW50ICpSSFMgPSBFeHRyYWN0Q29uc3RhbnRCeXRlcyhDRS0+Z2V0T3BlcmFuZCgxKSwgQnl0ZVN0YXJ0LEJ5dGVTaXplKTsKKyAgICBpZiAoUkhTID09IDApCisgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICAvLyBYICYgMCAtPiAwLgorICAgIGlmIChSSFMtPmlzTnVsbFZhbHVlKCkpCisgICAgICByZXR1cm4gUkhTOworICAgIAorICAgIENvbnN0YW50ICpMSFMgPSBFeHRyYWN0Q29uc3RhbnRCeXRlcyhDRS0+Z2V0T3BlcmFuZCgwKSwgQnl0ZVN0YXJ0LEJ5dGVTaXplKTsKKyAgICBpZiAoTEhTID09IDApCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRBbmQoTEhTLCBSSFMpOworICB9CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6IHsKKyAgICBDb25zdGFudEludCAqQW10ID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENFLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoQW10ID09IDApCisgICAgICByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBTaEFtdCA9IEFtdC0+Z2V0WkV4dFZhbHVlKCk7CisgICAgLy8gQ2Fubm90IGFuYWx5emUgbm9uLWJ5dGUgc2hpZnRzLgorICAgIGlmICgoU2hBbXQgJiA3KSAhPSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgU2hBbXQgPj49IDM7CisgICAgCisgICAgLy8gSWYgdGhlIGV4dHJhY3QgaXMga25vd24gdG8gYmUgYWxsIHplcm9zLCByZXR1cm4gemVyby4KKyAgICBpZiAoQnl0ZVN0YXJ0ID49IENTaXplLVNoQW10KQorICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSW50ZWdlclR5cGU6OmdldChDRS0+Z2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU2l6ZSo4KSk7CisgICAgLy8gSWYgdGhlIGV4dHJhY3QgaXMga25vd24gdG8gYmUgZnVsbHkgaW4gdGhlIGlucHV0LCBleHRyYWN0IGl0LgorICAgIGlmIChCeXRlU3RhcnQrQnl0ZVNpemUrU2hBbXQgPD0gQ1NpemUpCisgICAgICByZXR1cm4gRXh0cmFjdENvbnN0YW50Qnl0ZXMoQ0UtPmdldE9wZXJhbmQoMCksIEJ5dGVTdGFydCtTaEFtdCwgQnl0ZVNpemUpOworICAgIAorICAgIC8vIFRPRE86IEhhbmRsZSB0aGUgJ3BhcnRpYWxseSB6ZXJvJyBjYXNlLgorICAgIHJldHVybiAwOworICB9CisgICAgCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDogeworICAgIENvbnN0YW50SW50ICpBbXQgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQ0UtPmdldE9wZXJhbmQoMSkpOworICAgIGlmIChBbXQgPT0gMCkKKyAgICAgIHJldHVybiAwOworICAgIHVuc2lnbmVkIFNoQW10ID0gQW10LT5nZXRaRXh0VmFsdWUoKTsKKyAgICAvLyBDYW5ub3QgYW5hbHl6ZSBub24tYnl0ZSBzaGlmdHMuCisgICAgaWYgKChTaEFtdCAmIDcpICE9IDApCisgICAgICByZXR1cm4gMDsKKyAgICBTaEFtdCA+Pj0gMzsKKyAgICAKKyAgICAvLyBJZiB0aGUgZXh0cmFjdCBpcyBrbm93biB0byBiZSBhbGwgemVyb3MsIHJldHVybiB6ZXJvLgorICAgIGlmIChCeXRlU3RhcnQrQnl0ZVNpemUgPD0gU2hBbXQpCisgICAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJbnRlZ2VyVHlwZTo6Z2V0KENFLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTaXplKjgpKTsKKyAgICAvLyBJZiB0aGUgZXh0cmFjdCBpcyBrbm93biB0byBiZSBmdWxseSBpbiB0aGUgaW5wdXQsIGV4dHJhY3QgaXQuCisgICAgaWYgKEJ5dGVTdGFydCA+PSBTaEFtdCkKKyAgICAgIHJldHVybiBFeHRyYWN0Q29uc3RhbnRCeXRlcyhDRS0+Z2V0T3BlcmFuZCgwKSwgQnl0ZVN0YXJ0LVNoQW10LCBCeXRlU2l6ZSk7CisgICAgCisgICAgLy8gVE9ETzogSGFuZGxlIHRoZSAncGFydGlhbGx5IHplcm8nIGNhc2UuCisgICAgcmV0dXJuIDA7CisgIH0KKyAgICAgIAorICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OiB7CisgICAgdW5zaWduZWQgU3JjQml0U2l6ZSA9CisgICAgICBjYXN0PEludGVnZXJUeXBlPihDRS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAKKyAgICAvLyBJZiBleHRyYWN0aW5nIHNvbWV0aGluZyB0aGF0IGlzIGNvbXBsZXRlbHkgemVybywgcmV0dXJuIDAuCisgICAgaWYgKEJ5dGVTdGFydCo4ID49IFNyY0JpdFNpemUpCisgICAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJbnRlZ2VyVHlwZTo6Z2V0KENFLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTaXplKjgpKTsKKworICAgIC8vIElmIGV4YWN0bHkgZXh0cmFjdGluZyB0aGUgaW5wdXQsIHJldHVybiBpdC4KKyAgICBpZiAoQnl0ZVN0YXJ0ID09IDAgJiYgQnl0ZVNpemUqOCA9PSBTcmNCaXRTaXplKQorICAgICAgcmV0dXJuIENFLT5nZXRPcGVyYW5kKDApOworICAgIAorICAgIC8vIElmIGV4dHJhY3Rpbmcgc29tZXRoaW5nIGNvbXBsZXRlbHkgaW4gdGhlIGlucHV0LCBpZiBpZiB0aGUgaW5wdXQgaXMgYQorICAgIC8vIG11bHRpcGxlIG9mIDggYml0cywgcmVjdXJzZS4KKyAgICBpZiAoKFNyY0JpdFNpemUmNykgPT0gMCAmJiAoQnl0ZVN0YXJ0K0J5dGVTaXplKSo4IDw9IFNyY0JpdFNpemUpCisgICAgICByZXR1cm4gRXh0cmFjdENvbnN0YW50Qnl0ZXMoQ0UtPmdldE9wZXJhbmQoMCksIEJ5dGVTdGFydCwgQnl0ZVNpemUpOworICAgICAgCisgICAgLy8gT3RoZXJ3aXNlLCBpZiBleHRyYWN0aW5nIGEgc3Vic2V0IG9mIHRoZSBpbnB1dCwgd2hpY2ggaXMgbm90IG11bHRpcGxlIG9mCisgICAgLy8gOCBiaXRzLCBkbyBhIHNoaWZ0IGFuZCB0cnVuYyB0byBnZXQgdGhlIGJpdHMuCisgICAgaWYgKChCeXRlU3RhcnQrQnl0ZVNpemUpKjggPCBTcmNCaXRTaXplKSB7CisgICAgICBhc3NlcnQoKFNyY0JpdFNpemUmNykgJiYgIlNob3VsZG4ndCBnZXQgYnl0ZSBzaXplZCBjYXNlIGhlcmUiKTsKKyAgICAgIENvbnN0YW50ICpSZXMgPSBDRS0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIGlmIChCeXRlU3RhcnQpCisgICAgICAgIFJlcyA9IENvbnN0YW50RXhwcjo6Z2V0TFNocihSZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChSZXMtPmdldFR5cGUoKSwgQnl0ZVN0YXJ0KjgpKTsKKyAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFRydW5jKFJlcywgSW50ZWdlclR5cGU6OmdldChDLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVNpemUqOCkpOworICAgIH0KKyAgICAKKyAgICAvLyBUT0RPOiBIYW5kbGUgdGhlICdwYXJ0aWFsbHkgemVybycgY2FzZS4KKyAgICByZXR1cm4gMDsKKyAgfQorICB9Cit9CisKKy8vLyBnZXRGb2xkZWRTaXplT2YgLSBSZXR1cm4gYSBDb25zdGFudEV4cHIgd2l0aCB0eXBlIERlc3RUeSBmb3Igc2l6ZW9mCisvLy8gb24gVHksIHdpdGggYW55IGtub3duIGZhY3RvcnMgZmFjdG9yZWQgb3V0LiBJZiBGb2xkZWQgaXMgZmFsc2UsCisvLy8gcmV0dXJuIG51bGwgaWYgbm8gZmFjdG9yaW5nIHdhcyBwb3NzaWJsZSwgdG8gYXZvaWQgZW5kbGVzc2x5CisvLy8gYm91bmNpbmcgYW4gdW5mb2xkYWJsZSBleHByZXNzaW9uIGJhY2sgaW50byB0aGUgdG9wLWxldmVsIGZvbGRlci4KKy8vLworc3RhdGljIENvbnN0YW50ICpnZXRGb2xkZWRTaXplT2YoY29uc3QgVHlwZSAqVHksIGNvbnN0IFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9sZGVkKSB7CisgIGlmIChjb25zdCBBcnJheVR5cGUgKkFUeSA9IGR5bl9jYXN0PEFycmF5VHlwZT4oVHkpKSB7CisgICAgQ29uc3RhbnQgKk4gPSBDb25zdGFudEludDo6Z2V0KERlc3RUeSwgQVR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgICBDb25zdGFudCAqRSA9IGdldEZvbGRlZFNpemVPZihBVHktPmdldEVsZW1lbnRUeXBlKCksIERlc3RUeSwgdHJ1ZSk7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TlVXTXVsKEUsIE4pOworICB9CisKKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkKKyAgICBpZiAoIVNUeS0+aXNQYWNrZWQoKSkgeworICAgICAgdW5zaWduZWQgTnVtRWxlbXMgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgICAvLyBBbiBlbXB0eSBzdHJ1Y3QgaGFzIHNpemUgemVyby4KKyAgICAgIGlmIChOdW1FbGVtcyA9PSAwKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXROdWxsVmFsdWUoRGVzdFR5KTsKKyAgICAgIC8vIENoZWNrIGZvciBhIHN0cnVjdCB3aXRoIGFsbCBtZW1iZXJzIGhhdmluZyB0aGUgc2FtZSBzaXplLgorICAgICAgQ29uc3RhbnQgKk1lbWJlclNpemUgPQorICAgICAgICBnZXRGb2xkZWRTaXplT2YoU1R5LT5nZXRFbGVtZW50VHlwZSgwKSwgRGVzdFR5LCB0cnVlKTsKKyAgICAgIGJvb2wgQWxsU2FtZSA9IHRydWU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IE51bUVsZW1zOyArK2kpCisgICAgICAgIGlmIChNZW1iZXJTaXplICE9CisgICAgICAgICAgICBnZXRGb2xkZWRTaXplT2YoU1R5LT5nZXRFbGVtZW50VHlwZShpKSwgRGVzdFR5LCB0cnVlKSkgeworICAgICAgICAgIEFsbFNhbWUgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgaWYgKEFsbFNhbWUpIHsKKyAgICAgICAgQ29uc3RhbnQgKk4gPSBDb25zdGFudEludDo6Z2V0KERlc3RUeSwgTnVtRWxlbXMpOworICAgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXROVVdNdWwoTWVtYmVyU2l6ZSwgTik7CisgICAgICB9CisgICAgfQorCisgIGlmIChjb25zdCBVbmlvblR5cGUgKlVUeSA9IGR5bl9jYXN0PFVuaW9uVHlwZT4oVHkpKSB7CisgICAgdW5zaWduZWQgTnVtRWxlbXMgPSBVVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgLy8gQ2hlY2sgZm9yIGEgdW5pb24gd2l0aCBhbGwgbWVtYmVycyBoYXZpbmcgdGhlIHNhbWUgc2l6ZS4KKyAgICBDb25zdGFudCAqTWVtYmVyU2l6ZSA9CisgICAgICBnZXRGb2xkZWRTaXplT2YoVVR5LT5nZXRFbGVtZW50VHlwZSgwKSwgRGVzdFR5LCB0cnVlKTsKKyAgICBib29sIEFsbFNhbWUgPSB0cnVlOworICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgIT0gTnVtRWxlbXM7ICsraSkKKyAgICAgIGlmIChNZW1iZXJTaXplICE9CisgICAgICAgICAgZ2V0Rm9sZGVkU2l6ZU9mKFVUeS0+Z2V0RWxlbWVudFR5cGUoaSksIERlc3RUeSwgdHJ1ZSkpIHsKKyAgICAgICAgQWxsU2FtZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBpZiAoQWxsU2FtZSkKKyAgICAgIHJldHVybiBNZW1iZXJTaXplOworICB9CisKKyAgLy8gUG9pbnRlciBzaXplIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSBwb2ludGVlIHR5cGUsIHNvIGNhbm9uaWNhbGl6ZSB0aGVtCisgIC8vIHRvIGFuIGFyYml0cmFyeSBwb2ludGVlLgorICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlBUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihUeSkpCisgICAgaWYgKCFQVHktPmdldEVsZW1lbnRUeXBlKCktPmlzSW50ZWdlclR5KDEpKQorICAgICAgcmV0dXJuCisgICAgICAgIGdldEZvbGRlZFNpemVPZihQb2ludGVyVHlwZTo6Z2V0KEludGVnZXJUeXBlOjpnZXQoUFR5LT5nZXRDb250ZXh0KCksIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVHktPmdldEFkZHJlc3NTcGFjZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlc3RUeSwgdHJ1ZSk7CisKKyAgLy8gSWYgdGhlcmUncyBubyBpbnRlcmVzdGluZyBmb2xkaW5nIGhhcHBlbmluZywgYmFpbCBzbyB0aGF0IHdlIGRvbid0IGNyZWF0ZQorICAvLyBhIGNvbnN0YW50IHRoYXQgbG9va3MgbGlrZSBpdCBuZWVkcyBmb2xkaW5nIGJ1dCByZWFsbHkgZG9lc24ndC4KKyAgaWYgKCFGb2xkZWQpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gQmFzZSBjYXNlOiBHZXQgYSByZWd1bGFyIHNpemVvZiBleHByZXNzaW9uLgorICBDb25zdGFudCAqQyA9IENvbnN0YW50RXhwcjo6Z2V0U2l6ZU9mKFR5KTsKKyAgQyA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChDYXN0SW5zdDo6Z2V0Q2FzdE9wY29kZShDLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0VHksIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLCBEZXN0VHkpOworICByZXR1cm4gQzsKK30KKworLy8vIGdldEZvbGRlZEFsaWduT2YgLSBSZXR1cm4gYSBDb25zdGFudEV4cHIgd2l0aCB0eXBlIERlc3RUeSBmb3IgYWxpZ25vZgorLy8vIG9uIFR5LCB3aXRoIGFueSBrbm93biBmYWN0b3JzIGZhY3RvcmVkIG91dC4gSWYgRm9sZGVkIGlzIGZhbHNlLAorLy8vIHJldHVybiBudWxsIGlmIG5vIGZhY3RvcmluZyB3YXMgcG9zc2libGUsIHRvIGF2b2lkIGVuZGxlc3NseQorLy8vIGJvdW5jaW5nIGFuIHVuZm9sZGFibGUgZXhwcmVzc2lvbiBiYWNrIGludG8gdGhlIHRvcC1sZXZlbCBmb2xkZXIuCisvLy8KK3N0YXRpYyBDb25zdGFudCAqZ2V0Rm9sZGVkQWxpZ25PZihjb25zdCBUeXBlICpUeSwgY29uc3QgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9sZGVkKSB7CisgIC8vIFRoZSBhbGlnbm1lbnQgb2YgYW4gYXJyYXkgaXMgZXF1YWwgdG8gdGhlIGFsaWdubWVudCBvZiB0aGUKKyAgLy8gYXJyYXkgZWxlbWVudC4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IGFsd2F5cyB0cnVlIGZvciB2ZWN0b3JzLgorICBpZiAoY29uc3QgQXJyYXlUeXBlICpBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KFR5KSkgeworICAgIENvbnN0YW50ICpDID0gQ29uc3RhbnRFeHByOjpnZXRBbGlnbk9mKEFUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgQyA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChDYXN0SW5zdDo6Z2V0Q2FzdE9wY29kZShDLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMsIERlc3RUeSk7CisgICAgcmV0dXJuIEM7CisgIH0KKworICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oVHkpKSB7CisgICAgLy8gUGFja2VkIHN0cnVjdHMgYWx3YXlzIGhhdmUgYW4gYWxpZ25tZW50IG9mIDEuCisgICAgaWYgKFNUeS0+aXNQYWNrZWQoKSkKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KERlc3RUeSwgMSk7CisKKyAgICAvLyBPdGhlcndpc2UsIHN0cnVjdCBhbGlnbm1lbnQgaXMgdGhlIG1heGltdW0gYWxpZ25tZW50IG9mIGFueSBtZW1iZXIuCisgICAgLy8gV2l0aG91dCB0YXJnZXQgZGF0YSwgd2UgY2FuJ3QgY29tcGFyZSBtdWNoLCBidXQgd2UgY2FuIGNoZWNrIHRvIHNlZQorICAgIC8vIGlmIGFsbCB0aGUgbWVtYmVycyBoYXZlIHRoZSBzYW1lIGFsaWdubWVudC4KKyAgICB1bnNpZ25lZCBOdW1FbGVtcyA9IFNUeS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAvLyBBbiBlbXB0eSBzdHJ1Y3QgaGFzIG1pbmltYWwgYWxpZ25tZW50LgorICAgIGlmIChOdW1FbGVtcyA9PSAwKQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoRGVzdFR5LCAxKTsKKyAgICAvLyBDaGVjayBmb3IgYSBzdHJ1Y3Qgd2l0aCBhbGwgbWVtYmVycyBoYXZpbmcgdGhlIHNhbWUgYWxpZ25tZW50LgorICAgIENvbnN0YW50ICpNZW1iZXJBbGlnbiA9CisgICAgICBnZXRGb2xkZWRBbGlnbk9mKFNUeS0+Z2V0RWxlbWVudFR5cGUoMCksIERlc3RUeSwgdHJ1ZSk7CisgICAgYm9vbCBBbGxTYW1lID0gdHJ1ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpICE9IE51bUVsZW1zOyArK2kpCisgICAgICBpZiAoTWVtYmVyQWxpZ24gIT0gZ2V0Rm9sZGVkQWxpZ25PZihTVHktPmdldEVsZW1lbnRUeXBlKGkpLCBEZXN0VHksIHRydWUpKSB7CisgICAgICAgIEFsbFNhbWUgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgaWYgKEFsbFNhbWUpCisgICAgICByZXR1cm4gTWVtYmVyQWxpZ247CisgIH0KKworICBpZiAoY29uc3QgVW5pb25UeXBlICpVVHkgPSBkeW5fY2FzdDxVbmlvblR5cGU+KFR5KSkgeworICAgIC8vIFVuaW9uIGFsaWdubWVudCBpcyB0aGUgbWF4aW11bSBhbGlnbm1lbnQgb2YgYW55IG1lbWJlci4KKyAgICAvLyBXaXRob3V0IHRhcmdldCBkYXRhLCB3ZSBjYW4ndCBjb21wYXJlIG11Y2gsIGJ1dCB3ZSBjYW4gY2hlY2sgdG8gc2VlCisgICAgLy8gaWYgYWxsIHRoZSBtZW1iZXJzIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50LgorICAgIHVuc2lnbmVkIE51bUVsZW1zID0gVVR5LT5nZXROdW1FbGVtZW50cygpOworICAgIC8vIENoZWNrIGZvciBhIHVuaW9uIHdpdGggYWxsIG1lbWJlcnMgaGF2aW5nIHRoZSBzYW1lIGFsaWdubWVudC4KKyAgICBDb25zdGFudCAqTWVtYmVyQWxpZ24gPQorICAgICAgZ2V0Rm9sZGVkQWxpZ25PZihVVHktPmdldEVsZW1lbnRUeXBlKDApLCBEZXN0VHksIHRydWUpOworICAgIGJvb2wgQWxsU2FtZSA9IHRydWU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBOdW1FbGVtczsgKytpKQorICAgICAgaWYgKE1lbWJlckFsaWduICE9IGdldEZvbGRlZEFsaWduT2YoVVR5LT5nZXRFbGVtZW50VHlwZShpKSwgRGVzdFR5LCB0cnVlKSkgeworICAgICAgICBBbGxTYW1lID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGlmIChBbGxTYW1lKQorICAgICAgcmV0dXJuIE1lbWJlckFsaWduOworICB9CisKKyAgLy8gUG9pbnRlciBhbGlnbm1lbnQgZG9lc24ndCBkZXBlbmQgb24gdGhlIHBvaW50ZWUgdHlwZSwgc28gY2Fub25pY2FsaXplIHRoZW0KKyAgLy8gdG8gYW4gYXJiaXRyYXJ5IHBvaW50ZWUuCisgIGlmIChjb25zdCBQb2ludGVyVHlwZSAqUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFR5KSkKKyAgICBpZiAoIVBUeS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHkoMSkpCisgICAgICByZXR1cm4KKyAgICAgICAgZ2V0Rm9sZGVkQWxpZ25PZihQb2ludGVyVHlwZTo6Z2V0KEludGVnZXJUeXBlOjpnZXQoUFR5LT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFR5LT5nZXRBZGRyZXNzU3BhY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdFR5LCB0cnVlKTsKKworICAvLyBJZiB0aGVyZSdzIG5vIGludGVyZXN0aW5nIGZvbGRpbmcgaGFwcGVuaW5nLCBiYWlsIHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlCisgIC8vIGEgY29uc3RhbnQgdGhhdCBsb29rcyBsaWtlIGl0IG5lZWRzIGZvbGRpbmcgYnV0IHJlYWxseSBkb2Vzbid0LgorICBpZiAoIUZvbGRlZCkKKyAgICByZXR1cm4gMDsKKworICAvLyBCYXNlIGNhc2U6IEdldCBhIHJlZ3VsYXIgYWxpZ25vZiBleHByZXNzaW9uLgorICBDb25zdGFudCAqQyA9IENvbnN0YW50RXhwcjo6Z2V0QWxpZ25PZihUeSk7CisgIEMgPSBDb25zdGFudEV4cHI6OmdldENhc3QoQ2FzdEluc3Q6OmdldENhc3RPcGNvZGUoQywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdFR5LCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQywgRGVzdFR5KTsKKyAgcmV0dXJuIEM7Cit9CisKKy8vLyBnZXRGb2xkZWRPZmZzZXRPZiAtIFJldHVybiBhIENvbnN0YW50RXhwciB3aXRoIHR5cGUgRGVzdFR5IGZvciBvZmZzZXRvZgorLy8vIG9uIFR5IGFuZCBGaWVsZE5vLCB3aXRoIGFueSBrbm93biBmYWN0b3JzIGZhY3RvcmVkIG91dC4gSWYgRm9sZGVkIGlzIGZhbHNlLAorLy8vIHJldHVybiBudWxsIGlmIG5vIGZhY3RvcmluZyB3YXMgcG9zc2libGUsIHRvIGF2b2lkIGVuZGxlc3NseQorLy8vIGJvdW5jaW5nIGFuIHVuZm9sZGFibGUgZXhwcmVzc2lvbiBiYWNrIGludG8gdGhlIHRvcC1sZXZlbCBmb2xkZXIuCisvLy8KK3N0YXRpYyBDb25zdGFudCAqZ2V0Rm9sZGVkT2Zmc2V0T2YoY29uc3QgVHlwZSAqVHksIENvbnN0YW50ICpGaWVsZE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9sZGVkKSB7CisgIGlmIChjb25zdCBBcnJheVR5cGUgKkFUeSA9IGR5bl9jYXN0PEFycmF5VHlwZT4oVHkpKSB7CisgICAgQ29uc3RhbnQgKk4gPSBDb25zdGFudEV4cHI6OmdldENhc3QoQ2FzdEluc3Q6OmdldENhc3RPcGNvZGUoRmllbGRObywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdFR5LCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRObywgRGVzdFR5KTsKKyAgICBDb25zdGFudCAqRSA9IGdldEZvbGRlZFNpemVPZihBVHktPmdldEVsZW1lbnRUeXBlKCksIERlc3RUeSwgdHJ1ZSk7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TlVXTXVsKEUsIE4pOworICB9CisKKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkKKyAgICBpZiAoIVNUeS0+aXNQYWNrZWQoKSkgeworICAgICAgdW5zaWduZWQgTnVtRWxlbXMgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgICAvLyBBbiBlbXB0eSBzdHJ1Y3QgaGFzIG5vIG1lbWJlcnMuCisgICAgICBpZiAoTnVtRWxlbXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAvLyBDaGVjayBmb3IgYSBzdHJ1Y3Qgd2l0aCBhbGwgbWVtYmVycyBoYXZpbmcgdGhlIHNhbWUgc2l6ZS4KKyAgICAgIENvbnN0YW50ICpNZW1iZXJTaXplID0KKyAgICAgICAgZ2V0Rm9sZGVkU2l6ZU9mKFNUeS0+Z2V0RWxlbWVudFR5cGUoMCksIERlc3RUeSwgdHJ1ZSk7CisgICAgICBib29sIEFsbFNhbWUgPSB0cnVlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSAhPSBOdW1FbGVtczsgKytpKQorICAgICAgICBpZiAoTWVtYmVyU2l6ZSAhPQorICAgICAgICAgICAgZ2V0Rm9sZGVkU2l6ZU9mKFNUeS0+Z2V0RWxlbWVudFR5cGUoaSksIERlc3RUeSwgdHJ1ZSkpIHsKKyAgICAgICAgICBBbGxTYW1lID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGlmIChBbGxTYW1lKSB7CisgICAgICAgIENvbnN0YW50ICpOID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KENhc3RJbnN0OjpnZXRDYXN0T3Bjb2RlKEZpZWxkTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRObywgRGVzdFR5KTsKKyAgICAgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TlVXTXVsKE1lbWJlclNpemUsIE4pOworICAgICAgfQorICAgIH0KKworICAvLyBJZiB0aGVyZSdzIG5vIGludGVyZXN0aW5nIGZvbGRpbmcgaGFwcGVuaW5nLCBiYWlsIHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlCisgIC8vIGEgY29uc3RhbnQgdGhhdCBsb29rcyBsaWtlIGl0IG5lZWRzIGZvbGRpbmcgYnV0IHJlYWxseSBkb2Vzbid0LgorICBpZiAoIUZvbGRlZCkKKyAgICByZXR1cm4gMDsKKworICAvLyBCYXNlIGNhc2U6IEdldCBhIHJlZ3VsYXIgb2Zmc2V0b2YgZXhwcmVzc2lvbi4KKyAgQ29uc3RhbnQgKkMgPSBDb25zdGFudEV4cHI6OmdldE9mZnNldE9mKFR5LCBGaWVsZE5vKTsKKyAgQyA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChDYXN0SW5zdDo6Z2V0Q2FzdE9wY29kZShDLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0VHksIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLCBEZXN0VHkpOworICByZXR1cm4gQzsKK30KKworQ29uc3RhbnQgKmxsdm06OkNvbnN0YW50Rm9sZENhc3RJbnN0cnVjdGlvbih1bnNpZ25lZCBvcGMsIENvbnN0YW50ICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpEZXN0VHkpIHsKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihWKSkgeworICAgIC8vIHpleHQodW5kZWYpID0gMCwgYmVjYXVzZSB0aGUgdG9wIGJpdHMgd2lsbCBiZSB6ZXJvLgorICAgIC8vIHNleHQodW5kZWYpID0gMCwgYmVjYXVzZSB0aGUgdG9wIGJpdHMgd2lsbCBhbGwgYmUgdGhlIHNhbWUuCisgICAgLy8gW3VzXWl0b2ZwKHVuZGVmKSA9IDAsIGJlY2F1c2UgdGhlIHJlc3VsdCB2YWx1ZSBpcyBib3VuZGVkLgorICAgIGlmIChvcGMgPT0gSW5zdHJ1Y3Rpb246OlpFeHQgfHwgb3BjID09IEluc3RydWN0aW9uOjpTRXh0IHx8CisgICAgICAgIG9wYyA9PSBJbnN0cnVjdGlvbjo6VUlUb0ZQIHx8IG9wYyA9PSBJbnN0cnVjdGlvbjo6U0lUb0ZQKQorICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoRGVzdFR5KTsKKyAgICByZXR1cm4gVW5kZWZWYWx1ZTo6Z2V0KERlc3RUeSk7CisgIH0KKyAgLy8gTm8gY29tcGlsZS10aW1lIG9wZXJhdGlvbnMgb24gdGhpcyB0eXBlIHlldC4KKyAgaWYgKFYtPmdldFR5cGUoKS0+aXNQUENfRlAxMjhUeSgpIHx8IERlc3RUeS0+aXNQUENfRlAxMjhUeSgpKQorICAgIHJldHVybiAwOworCisgIC8vIElmIHRoZSBjYXN0IG9wZXJhbmQgaXMgYSBjb25zdGFudCBleHByZXNzaW9uLCB0aGVyZSdzIGEgZmV3IHRoaW5ncyB3ZSBjYW4KKyAgLy8gZG8gdG8gdHJ5IHRvIHNpbXBsaWZ5IGl0LgorICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVikpIHsKKyAgICBpZiAoQ0UtPmlzQ2FzdCgpKSB7CisgICAgICAvLyBUcnkgaGFyZCB0byBmb2xkIGNhc3Qgb2YgY2FzdCBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIGVsaW1pbmFibGUuCisgICAgICBpZiAodW5zaWduZWQgbmV3T3BjID0gZm9sZENvbnN0YW50Q2FzdFBhaXIob3BjLCBDRSwgRGVzdFR5KSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Q2FzdChuZXdPcGMsIENFLT5nZXRPcGVyYW5kKDApLCBEZXN0VHkpOworICAgIH0gZWxzZSBpZiAoQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyKSB7CisgICAgICAvLyBJZiBhbGwgb2YgdGhlIGluZGV4ZXMgaW4gdGhlIEdFUCBhcmUgbnVsbCB2YWx1ZXMsIHRoZXJlIGlzIG5vIHBvaW50ZXIKKyAgICAgIC8vIGFkanVzdG1lbnQgZ29pbmcgb24uICBXZSBtaWdodCBhcyB3ZWxsIGNhc3QgdGhlIHNvdXJjZSBwb2ludGVyLgorICAgICAgYm9vbCBpc0FsbE51bGwgPSB0cnVlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IENFLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKCFDRS0+Z2V0T3BlcmFuZChpKS0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICAgIGlzQWxsTnVsbCA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBpZiAoaXNBbGxOdWxsKQorICAgICAgICAvLyBUaGlzIGlzIGNhc3Rpbmcgb25lIHBvaW50ZXIgdHlwZSB0byBhbm90aGVyLCBhbHdheXMgQml0Q2FzdAorICAgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRQb2ludGVyQ2FzdChDRS0+Z2V0T3BlcmFuZCgwKSwgRGVzdFR5KTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgY2FzdCBvcGVyYW5kIGlzIGEgY29uc3RhbnQgdmVjdG9yLCBwZXJmb3JtIHRoZSBjYXN0IGJ5CisgIC8vIG9wZXJhdGluZyBvbiBlYWNoIGVsZW1lbnQuIEluIHRoZSBjYXN0IG9mIGJpdGNhc3RzLCB0aGUgZWxlbWVudAorICAvLyBjb3VudCBtYXkgYmUgbWlzbWF0Y2hlZDsgZG9uJ3QgYXR0ZW1wdCB0byBoYW5kbGUgdGhhdCBoZXJlLgorICBpZiAoQ29uc3RhbnRWZWN0b3IgKkNWID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KFYpKQorICAgIGlmIChEZXN0VHktPmlzVmVjdG9yVHkoKSAmJgorICAgICAgICBjYXN0PFZlY3RvclR5cGU+KERlc3RUeSktPmdldE51bUVsZW1lbnRzKCkgPT0KKyAgICAgICAgQ1YtPmdldFR5cGUoKS0+Z2V0TnVtRWxlbWVudHMoKSkgeworICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiByZXM7CisgICAgICBjb25zdCBWZWN0b3JUeXBlICpEZXN0VmVjVHkgPSBjYXN0PFZlY3RvclR5cGU+KERlc3RUeSk7CisgICAgICBjb25zdCBUeXBlICpEc3RFbHRUeSA9IERlc3RWZWNUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDVi0+Z2V0VHlwZSgpLT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgcmVzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldENhc3Qob3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVi0+Z2V0T3BlcmFuZChpKSwgRHN0RWx0VHkpKTsKKyAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KERlc3RWZWNUeSwgcmVzKTsKKyAgICB9CisKKyAgLy8gV2UgYWN0dWFsbHkgaGF2ZSB0byBkbyBhIGNhc3Qgbm93LiBQZXJmb3JtIHRoZSBjYXN0IGFjY29yZGluZyB0byB0aGUKKyAgLy8gb3Bjb2RlIHNwZWNpZmllZC4KKyAgc3dpdGNoIChvcGMpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJGYWlsZWQgdG8gY2FzdCBjb25zdGFudCBleHByZXNzaW9uIik7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVHJ1bmM6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQRXh0OgorICAgIGlmIChDb25zdGFudEZQICpGUEMgPSBkeW5fY2FzdDxDb25zdGFudEZQPihWKSkgeworICAgICAgYm9vbCBpZ25vcmVkOworICAgICAgQVBGbG9hdCBWYWwgPSBGUEMtPmdldFZhbHVlQVBGKCk7CisgICAgICBWYWwuY29udmVydChEZXN0VHktPmlzRmxvYXRUeSgpID8gQVBGbG9hdDo6SUVFRXNpbmdsZSA6CisgICAgICAgICAgICAgICAgICBEZXN0VHktPmlzRG91YmxlVHkoKSA/IEFQRmxvYXQ6OklFRUVkb3VibGUgOgorICAgICAgICAgICAgICAgICAgRGVzdFR5LT5pc1g4Nl9GUDgwVHkoKSA/IEFQRmxvYXQ6Ong4N0RvdWJsZUV4dGVuZGVkIDoKKyAgICAgICAgICAgICAgICAgIERlc3RUeS0+aXNGUDEyOFR5KCkgPyBBUEZsb2F0OjpJRUVFcXVhZCA6CisgICAgICAgICAgICAgICAgICBBUEZsb2F0OjpCb2d1cywKKyAgICAgICAgICAgICAgICAgIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4sICZpZ25vcmVkKTsKKyAgICAgIHJldHVybiBDb25zdGFudEZQOjpnZXQoVi0+Z2V0Q29udGV4dCgpLCBWYWwpOworICAgIH0KKyAgICByZXR1cm4gMDsgLy8gQ2FuJ3QgZm9sZC4KKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJOiAKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1NJOgorICAgIGlmIChDb25zdGFudEZQICpGUEMgPSBkeW5fY2FzdDxDb25zdGFudEZQPihWKSkgeworICAgICAgY29uc3QgQVBGbG9hdCAmViA9IEZQQy0+Z2V0VmFsdWVBUEYoKTsKKyAgICAgIGJvb2wgaWdub3JlZDsKKyAgICAgIHVpbnQ2NF90IHhbMl07IAorICAgICAgdWludDMyX3QgRGVzdEJpdFdpZHRoID0gY2FzdDxJbnRlZ2VyVHlwZT4oRGVzdFR5KS0+Z2V0Qml0V2lkdGgoKTsKKyAgICAgICh2b2lkKSBWLmNvbnZlcnRUb0ludGVnZXIoeCwgRGVzdEJpdFdpZHRoLCBvcGM9PUluc3RydWN0aW9uOjpGUFRvU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQRmxvYXQ6OnJtVG93YXJkWmVybywgJmlnbm9yZWQpOworICAgICAgQVBJbnQgVmFsKERlc3RCaXRXaWR0aCwgMiwgeCk7CisgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChGUEMtPmdldENvbnRleHQoKSwgVmFsKTsKKyAgICB9CisgICAgcmV0dXJuIDA7IC8vIENhbid0IGZvbGQuCisgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOiAgIC8vYWx3YXlzIHRyZWF0ZWQgYXMgdW5zaWduZWQKKyAgICBpZiAoVi0+aXNOdWxsVmFsdWUoKSkgICAgICAgLy8gSXMgaXQgYW4gaW50ZWdyYWwgbnVsbCB2YWx1ZT8KKyAgICAgIHJldHVybiBDb25zdGFudFBvaW50ZXJOdWxsOjpnZXQoY2FzdDxQb2ludGVyVHlwZT4oRGVzdFR5KSk7CisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIHBvaW50ZXIgdHlwZXMgY2Fubm90IGJlIGNhc3RlZAorICBjYXNlIEluc3RydWN0aW9uOjpQdHJUb0ludDogICAvLyBhbHdheXMgdHJlYXRlZCBhcyB1bnNpZ25lZAorICAgIC8vIElzIGl0IGEgbnVsbCBwb2ludGVyIHZhbHVlPworICAgIGlmIChWLT5pc051bGxWYWx1ZSgpKQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoRGVzdFR5LCAwKTsKKyAgICAvLyBJZiB0aGlzIGlzIGEgc2l6ZW9mLWxpa2UgZXhwcmVzc2lvbiwgcHVsbCBvdXQgbXVsdGlwbGljYXRpb25zIGJ5CisgICAgLy8ga25vd24gZmFjdG9ycyB0byBleHBvc2UgdGhlbSB0byBzdWJzZXF1ZW50IGZvbGRpbmcuIElmIGl0J3MgYW4KKyAgICAvLyBhbGlnbm9mLWxpa2UgZXhwcmVzc2lvbiwgZmFjdG9yIG91dCBrbm93biBmYWN0b3JzLgorICAgIGlmIChDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihWKSkKKyAgICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIgJiYKKyAgICAgICAgICBDRS0+Z2V0T3BlcmFuZCgwKS0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICBjb25zdCBUeXBlICpUeSA9CisgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oQ0UtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICAgIGlmIChDRS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAyKSB7CisgICAgICAgICAgLy8gSGFuZGxlIGEgc2l6ZW9mLWxpa2UgZXhwcmVzc2lvbi4KKyAgICAgICAgICBDb25zdGFudCAqSWR4ID0gQ0UtPmdldE9wZXJhbmQoMSk7CisgICAgICAgICAgYm9vbCBpc09uZSA9IGlzYTxDb25zdGFudEludD4oSWR4KSAmJiBjYXN0PENvbnN0YW50SW50PihJZHgpLT5pc09uZSgpOworICAgICAgICAgIGlmIChDb25zdGFudCAqQyA9IGdldEZvbGRlZFNpemVPZihUeSwgRGVzdFR5LCAhaXNPbmUpKSB7CisgICAgICAgICAgICBJZHggPSBDb25zdGFudEV4cHI6OmdldENhc3QoQ2FzdEluc3Q6OmdldENhc3RPcGNvZGUoSWR4LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RUeSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkeCwgRGVzdFR5KTsKKyAgICAgICAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE11bChDLCBJZHgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChDRS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAzICYmCisgICAgICAgICAgICAgICAgICAgQ0UtPmdldE9wZXJhbmQoMSktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgICAvLyBIYW5kbGUgYW4gYWxpZ25vZi1saWtlIGV4cHJlc3Npb24uCisgICAgICAgICAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkKKyAgICAgICAgICAgIGlmICghU1R5LT5pc1BhY2tlZCgpKSB7CisgICAgICAgICAgICAgIENvbnN0YW50SW50ICpDSSA9IGNhc3Q8Q29uc3RhbnRJbnQ+KENFLT5nZXRPcGVyYW5kKDIpKTsKKyAgICAgICAgICAgICAgaWYgKENJLT5pc09uZSgpICYmCisgICAgICAgICAgICAgICAgICBTVHktPmdldE51bUVsZW1lbnRzKCkgPT0gMiAmJgorICAgICAgICAgICAgICAgICAgU1R5LT5nZXRFbGVtZW50VHlwZSgwKS0+aXNJbnRlZ2VyVHkoMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Rm9sZGVkQWxpZ25PZihTVHktPmdldEVsZW1lbnRUeXBlKDEpLCBEZXN0VHksIGZhbHNlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIC8vIEhhbmRsZSBhbiBvZmZzZXRvZi1saWtlIGV4cHJlc3Npb24uCisgICAgICAgICAgaWYgKFR5LT5pc1N0cnVjdFR5KCkgfHwgVHktPmlzQXJyYXlUeSgpKSB7CisgICAgICAgICAgICBpZiAoQ29uc3RhbnQgKkMgPSBnZXRGb2xkZWRPZmZzZXRPZihUeSwgQ0UtPmdldE9wZXJhbmQoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0VHksIGZhbHNlKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgLy8gT3RoZXIgcG9pbnRlciB0eXBlcyBjYW5ub3QgYmUgY2FzdGVkCisgICAgcmV0dXJuIDA7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpIHsKKyAgICAgIEFQSW50IGFwaSA9IENJLT5nZXRWYWx1ZSgpOworICAgICAgY29uc3QgdWludDY0X3QgemVyb1tdID0gezAsIDB9OworICAgICAgQVBGbG9hdCBhcGYgPSBBUEZsb2F0KEFQSW50KERlc3RUeS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIHplcm8pKTsKKyAgICAgICh2b2lkKWFwZi5jb252ZXJ0RnJvbUFQSW50KGFwaSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGM9PUluc3RydWN0aW9uOjpTSVRvRlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICAgIHJldHVybiBDb25zdGFudEZQOjpnZXQoVi0+Z2V0Q29udGV4dCgpLCBhcGYpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDoKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFYpKSB7CisgICAgICB1aW50MzJfdCBCaXRXaWR0aCA9IGNhc3Q8SW50ZWdlclR5cGU+KERlc3RUeSktPmdldEJpdFdpZHRoKCk7CisgICAgICBBUEludCBSZXN1bHQoQ0ktPmdldFZhbHVlKCkpOworICAgICAgUmVzdWx0LnpleHQoQml0V2lkdGgpOworICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoVi0+Z2V0Q29udGV4dCgpLCBSZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDoKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFYpKSB7CisgICAgICB1aW50MzJfdCBCaXRXaWR0aCA9IGNhc3Q8SW50ZWdlclR5cGU+KERlc3RUeSktPmdldEJpdFdpZHRoKCk7CisgICAgICBBUEludCBSZXN1bHQoQ0ktPmdldFZhbHVlKCkpOworICAgICAgUmVzdWx0LnNleHQoQml0V2lkdGgpOworICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoVi0+Z2V0Q29udGV4dCgpLCBSZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6IHsKKyAgICB1aW50MzJfdCBEZXN0Qml0V2lkdGggPSBjYXN0PEludGVnZXJUeXBlPihEZXN0VHkpLT5nZXRCaXRXaWR0aCgpOworICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpIHsKKyAgICAgIEFQSW50IFJlc3VsdChDSS0+Z2V0VmFsdWUoKSk7CisgICAgICBSZXN1bHQudHJ1bmMoRGVzdEJpdFdpZHRoKTsKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFYtPmdldENvbnRleHQoKSwgUmVzdWx0KTsKKyAgICB9CisgICAgCisgICAgLy8gVGhlIGlucHV0IG11c3QgYmUgYSBjb25zdGFudGV4cHIuICBTZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IHRoaXMgYmFzZWQgb24KKyAgICAvLyB0aGUgYnl0ZXMgd2UgYXJlIGRlbWFuZGluZy4gIE9ubHkgZG8gdGhpcyBpZiB0aGUgc291cmNlIGFuZCBkZXN0IGFyZSBhbgorICAgIC8vIGV2ZW4gbXVsdGlwbGUgb2YgYSBieXRlLgorICAgIGlmICgoRGVzdEJpdFdpZHRoICYgNykgPT0gMCAmJgorICAgICAgICAoY2FzdDxJbnRlZ2VyVHlwZT4oVi0+Z2V0VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKSAmIDcpID09IDApCisgICAgICBpZiAoQ29uc3RhbnQgKlJlcyA9IEV4dHJhY3RDb25zdGFudEJ5dGVzKFYsIDAsIERlc3RCaXRXaWR0aCAvIDgpKQorICAgICAgICByZXR1cm4gUmVzOworICAgICAgCisgICAgcmV0dXJuIDA7CisgIH0KKyAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICByZXR1cm4gRm9sZEJpdENhc3QoViwgRGVzdFR5KTsKKyAgfQorfQorCitDb25zdGFudCAqbGx2bTo6Q29uc3RhbnRGb2xkU2VsZWN0SW5zdHJ1Y3Rpb24oQ29uc3RhbnQgKkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIpIHsKKyAgaWYgKENvbnN0YW50SW50ICpDQiA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDb25kKSkKKyAgICByZXR1cm4gQ0ItPmdldFpFeHRWYWx1ZSgpID8gVjEgOiBWMjsKKworICBpZiAoaXNhPFVuZGVmVmFsdWU+KFYxKSkgcmV0dXJuIFYyOworICBpZiAoaXNhPFVuZGVmVmFsdWU+KFYyKSkgcmV0dXJuIFYxOworICBpZiAoaXNhPFVuZGVmVmFsdWU+KENvbmQpKSByZXR1cm4gVjE7CisgIGlmIChWMSA9PSBWMikgcmV0dXJuIFYxOworICByZXR1cm4gMDsKK30KKworQ29uc3RhbnQgKmxsdm06OkNvbnN0YW50Rm9sZEV4dHJhY3RFbGVtZW50SW5zdHJ1Y3Rpb24oQ29uc3RhbnQgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIHsKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihWYWwpKSAgLy8gZWUodW5kZWYsIHgpIC0+IHVuZGVmCisgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChjYXN0PFZlY3RvclR5cGU+KFZhbC0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIGlmIChWYWwtPmlzTnVsbFZhbHVlKCkpICAvLyBlZSh6ZXJvLCB4KSAtPiB6ZXJvCisgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oVmFsLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKTsKKworICBpZiAoQ29uc3RhbnRWZWN0b3IgKkNWYWwgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oVmFsKSkgeworICAgIGlmIChDb25zdGFudEludCAqQ0lkeCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihJZHgpKSB7CisgICAgICByZXR1cm4gQ1ZhbC0+Z2V0T3BlcmFuZChDSWR4LT5nZXRaRXh0VmFsdWUoKSk7CisgICAgfSBlbHNlIGlmIChpc2E8VW5kZWZWYWx1ZT4oSWR4KSkgeworICAgICAgLy8gZWUoe3cseCx5LHp9LCB1bmRlZikgLT4gdyAoYW4gYXJiaXRyYXJ5IHZhbHVlKS4KKyAgICAgIHJldHVybiBDVmFsLT5nZXRPcGVyYW5kKDApOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworQ29uc3RhbnQgKmxsdm06OkNvbnN0YW50Rm9sZEluc2VydEVsZW1lbnRJbnN0cnVjdGlvbihDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqRWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqSWR4KSB7CisgIENvbnN0YW50SW50ICpDSWR4ID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KElkeCk7CisgIGlmICghQ0lkeCkgcmV0dXJuIDA7CisgIEFQSW50IGlkeFZhbCA9IENJZHgtPmdldFZhbHVlKCk7CisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oVmFsKSkgeyAKKyAgICAvLyBJbnNlcnRpb24gb2Ygc2NhbGFyIGNvbnN0YW50IGludG8gdmVjdG9yIHVuZGVmCisgICAgLy8gT3B0aW1pemUgYXdheSBpbnNlcnRpb24gb2YgdW5kZWYKKyAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KEVsdCkpCisgICAgICByZXR1cm4gVmFsOworICAgIC8vIE90aGVyd2lzZSBicmVhayB0aGUgYWdncmVnYXRlIHVuZGVmIGludG8gbXVsdGlwbGUgdW5kZWZzIGFuZCBkbworICAgIC8vIHRoZSBpbnNlcnRpb24KKyAgICB1bnNpZ25lZCBudW1PcHMgPSAKKyAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oVmFsLT5nZXRUeXBlKCkpLT5nZXROdW1FbGVtZW50cygpOworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gT3BzOyAKKyAgICBPcHMucmVzZXJ2ZShudW1PcHMpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1PcHM7ICsraSkgeworICAgICAgQ29uc3RhbnQgKk9wID0KKyAgICAgICAgKGlkeFZhbCA9PSBpKSA/IEVsdCA6IFVuZGVmVmFsdWU6OmdldChFbHQtPmdldFR5cGUoKSk7CisgICAgICBPcHMucHVzaF9iYWNrKE9wKTsKKyAgICB9CisgICAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoT3BzKTsKKyAgfQorICBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oVmFsKSkgeworICAgIC8vIEluc2VydGlvbiBvZiBzY2FsYXIgY29uc3RhbnQgaW50byB2ZWN0b3IgYWdncmVnYXRlIHplcm8KKyAgICAvLyBPcHRpbWl6ZSBhd2F5IGluc2VydGlvbiBvZiB6ZXJvCisgICAgaWYgKEVsdC0+aXNOdWxsVmFsdWUoKSkKKyAgICAgIHJldHVybiBWYWw7CisgICAgLy8gT3RoZXJ3aXNlIGJyZWFrIHRoZSBhZ2dyZWdhdGUgemVybyBpbnRvIG11bHRpcGxlIHplcm9zIGFuZCBkbworICAgIC8vIHRoZSBpbnNlcnRpb24KKyAgICB1bnNpZ25lZCBudW1PcHMgPSAKKyAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oVmFsLT5nZXRUeXBlKCkpLT5nZXROdW1FbGVtZW50cygpOworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gT3BzOyAKKyAgICBPcHMucmVzZXJ2ZShudW1PcHMpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1PcHM7ICsraSkgeworICAgICAgQ29uc3RhbnQgKk9wID0KKyAgICAgICAgKGlkeFZhbCA9PSBpKSA/IEVsdCA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0LT5nZXRUeXBlKCkpOworICAgICAgT3BzLnB1c2hfYmFjayhPcCk7CisgICAgfQorICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KE9wcyk7CisgIH0KKyAgaWYgKENvbnN0YW50VmVjdG9yICpDVmFsID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KFZhbCkpIHsKKyAgICAvLyBJbnNlcnRpb24gb2Ygc2NhbGFyIGNvbnN0YW50IGludG8gdmVjdG9yIGNvbnN0YW50CisgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBPcHM7IAorICAgIE9wcy5yZXNlcnZlKENWYWwtPmdldE51bU9wZXJhbmRzKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBDVmFsLT5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICAgIENvbnN0YW50ICpPcCA9CisgICAgICAgIChpZHhWYWwgPT0gaSkgPyBFbHQgOiBjYXN0PENvbnN0YW50PihDVmFsLT5nZXRPcGVyYW5kKGkpKTsKKyAgICAgIE9wcy5wdXNoX2JhY2soT3ApOworICAgIH0KKyAgICByZXR1cm4gQ29uc3RhbnRWZWN0b3I6OmdldChPcHMpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBHZXRWZWN0b3JFbGVtZW50IC0gSWYgQyBpcyBhIENvbnN0YW50VmVjdG9yLCBDb25zdGFudEFnZ3JlZ2F0ZVplcm8gb3IgVW5kZWYKKy8vLyByZXR1cm4gdGhlIHNwZWNpZmllZCBlbGVtZW50IHZhbHVlLiAgT3RoZXJ3aXNlIHJldHVybiBudWxsLgorc3RhdGljIENvbnN0YW50ICpHZXRWZWN0b3JFbGVtZW50KENvbnN0YW50ICpDLCB1bnNpZ25lZCBFbHRObykgeworICBpZiAoQ29uc3RhbnRWZWN0b3IgKkNWID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KEMpKQorICAgIHJldHVybiBDVi0+Z2V0T3BlcmFuZChFbHRObyk7CisKKyAgY29uc3QgVHlwZSAqRWx0VHkgPSBjYXN0PFZlY3RvclR5cGU+KEMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihDKSkKKyAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7CisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oQykpCisgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChFbHRUeSk7CisgIHJldHVybiAwOworfQorCitDb25zdGFudCAqbGx2bTo6Q29uc3RhbnRGb2xkU2h1ZmZsZVZlY3Rvckluc3RydWN0aW9uKENvbnN0YW50ICpWMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTWFzaykgeworICAvLyBVbmRlZmluZWQgc2h1ZmZsZSBtYXNrIC0+IHVuZGVmaW5lZCB2YWx1ZS4KKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihNYXNrKSkgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChWMS0+Z2V0VHlwZSgpKTsKKworICB1bnNpZ25lZCBNYXNrTnVtRWx0cyA9IGNhc3Q8VmVjdG9yVHlwZT4oTWFzay0+Z2V0VHlwZSgpKS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgdW5zaWduZWQgU3JjTnVtRWx0cyA9IGNhc3Q8VmVjdG9yVHlwZT4oVjEtPmdldFR5cGUoKSktPmdldE51bUVsZW1lbnRzKCk7CisgIGNvbnN0IFR5cGUgKkVsdFR5ID0gY2FzdDxWZWN0b3JUeXBlPihWMS0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKworICAvLyBMb29wIG92ZXIgdGhlIHNodWZmbGUgbWFzaywgZXZhbHVhdGluZyBlYWNoIGVsZW1lbnQuCisgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgMzI+IFJlc3VsdDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNYXNrTnVtRWx0czsgKytpKSB7CisgICAgQ29uc3RhbnQgKkluRWx0ID0gR2V0VmVjdG9yRWxlbWVudChNYXNrLCBpKTsKKyAgICBpZiAoSW5FbHQgPT0gMCkgcmV0dXJuIDA7CisKKyAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KEluRWx0KSkKKyAgICAgIEluRWx0ID0gVW5kZWZWYWx1ZTo6Z2V0KEVsdFR5KTsKKyAgICBlbHNlIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSW5FbHQpKSB7CisgICAgICB1bnNpZ25lZCBFbHQgPSBDSS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICBpZiAoRWx0ID49IFNyY051bUVsdHMqMikKKyAgICAgICAgSW5FbHQgPSBVbmRlZlZhbHVlOjpnZXQoRWx0VHkpOworICAgICAgZWxzZSBpZiAoRWx0ID49IFNyY051bUVsdHMpCisgICAgICAgIEluRWx0ID0gR2V0VmVjdG9yRWxlbWVudChWMiwgRWx0IC0gU3JjTnVtRWx0cyk7CisgICAgICBlbHNlCisgICAgICAgIEluRWx0ID0gR2V0VmVjdG9yRWxlbWVudChWMSwgRWx0KTsKKyAgICAgIGlmIChJbkVsdCA9PSAwKSByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVW5rbm93biB2YWx1ZS4KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBSZXN1bHQucHVzaF9iYWNrKEluRWx0KTsKKyAgfQorCisgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KCZSZXN1bHRbMF0sIFJlc3VsdC5zaXplKCkpOworfQorCitDb25zdGFudCAqbGx2bTo6Q29uc3RhbnRGb2xkRXh0cmFjdFZhbHVlSW5zdHJ1Y3Rpb24oQ29uc3RhbnQgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIHsKKyAgLy8gQmFzZSBjYXNlOiBubyBpbmRpY2VzLCBzbyByZXR1cm4gdGhlIGVudGlyZSB2YWx1ZS4KKyAgaWYgKE51bUlkeCA9PSAwKQorICAgIHJldHVybiBBZ2c7CisKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihBZ2cpKSAgLy8gZXYodW5kZWYsIHgpIC0+IHVuZGVmCisgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChFeHRyYWN0VmFsdWVJbnN0OjpnZXRJbmRleGVkVHlwZShBZ2ctPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZHhzICsgTnVtSWR4KSk7CisKKyAgaWYgKGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KEFnZykpICAvLyBldigwLCB4KSAtPiAwCisgICAgcmV0dXJuCisgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEV4dHJhY3RWYWx1ZUluc3Q6OmdldEluZGV4ZWRUeXBlKEFnZy0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZHhzICsgTnVtSWR4KSk7CisKKyAgLy8gT3RoZXJ3aXNlIHJlY3Vyc2UuCisgIGlmIChDb25zdGFudFN0cnVjdCAqQ1MgPSBkeW5fY2FzdDxDb25zdGFudFN0cnVjdD4oQWdnKSkKKyAgICByZXR1cm4gQ29uc3RhbnRGb2xkRXh0cmFjdFZhbHVlSW5zdHJ1Y3Rpb24oQ1MtPmdldE9wZXJhbmQoKklkeHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZHhzKzEsIE51bUlkeC0xKTsKKworICBpZiAoQ29uc3RhbnRBcnJheSAqQ0EgPSBkeW5fY2FzdDxDb25zdGFudEFycmF5PihBZ2cpKQorICAgIHJldHVybiBDb25zdGFudEZvbGRFeHRyYWN0VmFsdWVJbnN0cnVjdGlvbihDQS0+Z2V0T3BlcmFuZCgqSWR4cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkeHMrMSwgTnVtSWR4LTEpOworICBDb25zdGFudFZlY3RvciAqQ1YgPSBjYXN0PENvbnN0YW50VmVjdG9yPihBZ2cpOworICByZXR1cm4gQ29uc3RhbnRGb2xkRXh0cmFjdFZhbHVlSW5zdHJ1Y3Rpb24oQ1YtPmdldE9wZXJhbmQoKklkeHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4cysxLCBOdW1JZHgtMSk7Cit9CisKK0NvbnN0YW50ICpsbHZtOjpDb25zdGFudEZvbGRJbnNlcnRWYWx1ZUluc3RydWN0aW9uKENvbnN0YW50ICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKklkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIHsKKyAgLy8gQmFzZSBjYXNlOiBubyBpbmRpY2VzLCBzbyByZXBsYWNlIHRoZSBlbnRpcmUgdmFsdWUuCisgIGlmIChOdW1JZHggPT0gMCkKKyAgICByZXR1cm4gVmFsOworCisgIGlmIChpc2E8VW5kZWZWYWx1ZT4oQWdnKSkgeworICAgIC8vIEluc2VydGlvbiBvZiBjb25zdGFudCBpbnRvIGFnZ3JlZ2F0ZSB1bmRlZgorICAgIC8vIE9wdGltaXplIGF3YXkgaW5zZXJ0aW9uIG9mIHVuZGVmLgorICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oVmFsKSkKKyAgICAgIHJldHVybiBBZ2c7CisgICAgCisgICAgLy8gT3RoZXJ3aXNlIGJyZWFrIHRoZSBhZ2dyZWdhdGUgdW5kZWYgaW50byBtdWx0aXBsZSB1bmRlZnMgYW5kIGRvCisgICAgLy8gdGhlIGluc2VydGlvbi4KKyAgICBjb25zdCBDb21wb3NpdGVUeXBlICpBZ2dUeSA9IGNhc3Q8Q29tcG9zaXRlVHlwZT4oQWdnLT5nZXRUeXBlKCkpOworICAgIHVuc2lnbmVkIG51bU9wczsKKyAgICBpZiAoY29uc3QgQXJyYXlUeXBlICpBUiA9IGR5bl9jYXN0PEFycmF5VHlwZT4oQWdnVHkpKQorICAgICAgbnVtT3BzID0gQVItPmdldE51bUVsZW1lbnRzKCk7CisgICAgZWxzZSBpZiAoQWdnVHktPmlzVW5pb25UeSgpKQorICAgICAgbnVtT3BzID0gMTsKKyAgICBlbHNlCisgICAgICBudW1PcHMgPSBjYXN0PFN0cnVjdFR5cGU+KEFnZ1R5KS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAKKyAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IE9wcyhudW1PcHMpOyAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtT3BzOyArK2kpIHsKKyAgICAgIGNvbnN0IFR5cGUgKk1lbWJlclR5ID0gQWdnVHktPmdldFR5cGVBdEluZGV4KGkpOworICAgICAgQ29uc3RhbnQgKk9wID0KKyAgICAgICAgKCpJZHhzID09IGkpID8KKyAgICAgICAgQ29uc3RhbnRGb2xkSW5zZXJ0VmFsdWVJbnN0cnVjdGlvbihVbmRlZlZhbHVlOjpnZXQoTWVtYmVyVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbCwgSWR4cysxLCBOdW1JZHgtMSkgOgorICAgICAgICBVbmRlZlZhbHVlOjpnZXQoTWVtYmVyVHkpOworICAgICAgT3BzW2ldID0gT3A7CisgICAgfQorICAgIAorICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlKiBTVCA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KEFnZ1R5KSkKKyAgICAgIHJldHVybiBDb25zdGFudFN0cnVjdDo6Z2V0KFNULT5nZXRDb250ZXh0KCksIE9wcywgU1QtPmlzUGFja2VkKCkpOworICAgIGlmIChjb25zdCBVbmlvblR5cGUqIFVUID0gZHluX2Nhc3Q8VW5pb25UeXBlPihBZ2dUeSkpIHsKKyAgICAgIGFzc2VydChPcHMuc2l6ZSgpID09IDEgJiYgIlVuaW9uIGNhbiBvbmx5IGNvbnRhaW4gYSBzaW5nbGUgdmFsdWUhIik7CisgICAgICByZXR1cm4gQ29uc3RhbnRVbmlvbjo6Z2V0KFVULCBPcHNbMF0pOworICAgIH0KKyAgICByZXR1cm4gQ29uc3RhbnRBcnJheTo6Z2V0KGNhc3Q8QXJyYXlUeXBlPihBZ2dUeSksIE9wcyk7CisgIH0KKyAgCisgIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihBZ2cpKSB7CisgICAgLy8gSW5zZXJ0aW9uIG9mIGNvbnN0YW50IGludG8gYWdncmVnYXRlIHplcm8KKyAgICAvLyBPcHRpbWl6ZSBhd2F5IGluc2VydGlvbiBvZiB6ZXJvLgorICAgIGlmIChWYWwtPmlzTnVsbFZhbHVlKCkpCisgICAgICByZXR1cm4gQWdnOworICAgIAorICAgIC8vIE90aGVyd2lzZSBicmVhayB0aGUgYWdncmVnYXRlIHplcm8gaW50byBtdWx0aXBsZSB6ZXJvcyBhbmQgZG8KKyAgICAvLyB0aGUgaW5zZXJ0aW9uLgorICAgIGNvbnN0IENvbXBvc2l0ZVR5cGUgKkFnZ1R5ID0gY2FzdDxDb21wb3NpdGVUeXBlPihBZ2ctPmdldFR5cGUoKSk7CisgICAgdW5zaWduZWQgbnVtT3BzOworICAgIGlmIChjb25zdCBBcnJheVR5cGUgKkFSID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihBZ2dUeSkpCisgICAgICBudW1PcHMgPSBBUi0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICBlbHNlCisgICAgICBudW1PcHMgPSBjYXN0PFN0cnVjdFR5cGU+KEFnZ1R5KS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAKKyAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IE9wcyhudW1PcHMpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1PcHM7ICsraSkgeworICAgICAgY29uc3QgVHlwZSAqTWVtYmVyVHkgPSBBZ2dUeS0+Z2V0VHlwZUF0SW5kZXgoaSk7CisgICAgICBDb25zdGFudCAqT3AgPQorICAgICAgICAoKklkeHMgPT0gaSkgPworICAgICAgICBDb25zdGFudEZvbGRJbnNlcnRWYWx1ZUluc3RydWN0aW9uKENvbnN0YW50OjpnZXROdWxsVmFsdWUoTWVtYmVyVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbCwgSWR4cysxLCBOdW1JZHgtMSkgOgorICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKE1lbWJlclR5KTsKKyAgICAgIE9wc1tpXSA9IE9wOworICAgIH0KKyAgICAKKyAgICBpZiAoY29uc3QgU3RydWN0VHlwZSAqU1QgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihBZ2dUeSkpCisgICAgICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVC0+Z2V0Q29udGV4dCgpLCBPcHMsIFNULT5pc1BhY2tlZCgpKTsKKyAgICByZXR1cm4gQ29uc3RhbnRBcnJheTo6Z2V0KGNhc3Q8QXJyYXlUeXBlPihBZ2dUeSksIE9wcyk7CisgIH0KKyAgCisgIGlmIChpc2E8Q29uc3RhbnRTdHJ1Y3Q+KEFnZykgfHwgaXNhPENvbnN0YW50QXJyYXk+KEFnZykpIHsKKyAgICAvLyBJbnNlcnRpb24gb2YgY29uc3RhbnQgaW50byBhZ2dyZWdhdGUgY29uc3RhbnQuCisgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBPcHMoQWdnLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQWdnLT5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICAgIENvbnN0YW50ICpPcCA9IGNhc3Q8Q29uc3RhbnQ+KEFnZy0+Z2V0T3BlcmFuZChpKSk7CisgICAgICBpZiAoKklkeHMgPT0gaSkKKyAgICAgICAgT3AgPSBDb25zdGFudEZvbGRJbnNlcnRWYWx1ZUluc3RydWN0aW9uKE9wLCBWYWwsIElkeHMrMSwgTnVtSWR4LTEpOworICAgICAgT3BzW2ldID0gT3A7CisgICAgfQorICAgIAorICAgIGlmIChjb25zdCBTdHJ1Y3RUeXBlKiBTVCA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KEFnZy0+Z2V0VHlwZSgpKSkKKyAgICAgIHJldHVybiBDb25zdGFudFN0cnVjdDo6Z2V0KFNULT5nZXRDb250ZXh0KCksIE9wcywgU1QtPmlzUGFja2VkKCkpOworICAgIHJldHVybiBDb25zdGFudEFycmF5OjpnZXQoY2FzdDxBcnJheVR5cGU+KEFnZy0+Z2V0VHlwZSgpKSwgT3BzKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKK0NvbnN0YW50ICpsbHZtOjpDb25zdGFudEZvbGRCaW5hcnlJbnN0cnVjdGlvbih1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpIHsKKyAgLy8gTm8gY29tcGlsZS10aW1lIG9wZXJhdGlvbnMgb24gdGhpcyB0eXBlIHlldC4KKyAgaWYgKEMxLT5nZXRUeXBlKCktPmlzUFBDX0ZQMTI4VHkoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBIYW5kbGUgVW5kZWZWYWx1ZSB1cCBmcm9udC4KKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihDMSkgfHwgaXNhPFVuZGVmVmFsdWU+KEMyKSkgeworICAgIHN3aXRjaCAoT3Bjb2RlKSB7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOgorICAgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihDMSkgJiYgaXNhPFVuZGVmVmFsdWU+KEMyKSkKKyAgICAgICAgLy8gSGFuZGxlIHVuZGVmIF4gdW5kZWYgLT4gMCBzcGVjaWFsIGNhc2UuIFRoaXMgaXMgYSBjb21tb24KKyAgICAgICAgLy8gaWRpb20gKG1pc3VzZSkuCisgICAgICAgIHJldHVybiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEMxLT5nZXRUeXBlKCkpOworICAgICAgLy8gRmFsbHRocm91Z2gKKyAgICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOgorICAgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChDMS0+Z2V0VHlwZSgpKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QW5kOgorICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoQzEtPmdldFR5cGUoKSk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICAgIGlmICghaXNhPFVuZGVmVmFsdWU+KEMyKSkgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmIC8gWCAtPiAwCisgICAgICAgIHJldHVybiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEMxLT5nZXRUeXBlKCkpOworICAgICAgcmV0dXJuIEMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWCAvIHVuZGVmIC0+IHVuZGVmCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYIHwgdW5kZWYgLT4gLTEKKyAgICAgIGlmIChjb25zdCBWZWN0b3JUeXBlICpQVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihDMS0+Z2V0VHlwZSgpKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoUFR5KTsKKyAgICAgIHJldHVybiBDb25zdGFudDo6Z2V0QWxsT25lc1ZhbHVlKEMxLT5nZXRUeXBlKCkpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6CisgICAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KEMyKSAmJiBpc2E8VW5kZWZWYWx1ZT4oQzEpKQorICAgICAgICByZXR1cm4gQzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmIGxzaHIgdW5kZWYgLT4gdW5kZWYKKyAgICAgIHJldHVybiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEMxLT5nZXRUeXBlKCkpOyAvLyBYIGxzaHIgdW5kZWYgLT4gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmIGxzaHIgWCAtPiAwCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICAgIGlmICghaXNhPFVuZGVmVmFsdWU+KEMyKSkKKyAgICAgICAgcmV0dXJuIEMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZiBhc2hyIFggLS0+IHVuZGVmCisgICAgICBlbHNlIGlmIChpc2E8VW5kZWZWYWx1ZT4oQzEpKSAKKyAgICAgICAgcmV0dXJuIEMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZiBhc2hyIHVuZGVmIC0+IHVuZGVmCisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBDMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWCBhc2hyIHVuZGVmIC0tPiBYCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgICAgLy8gdW5kZWYgPDwgWCAtPiAwICAgb3IgICBYIDw8IHVuZGVmIC0+IDAKKyAgICAgIHJldHVybiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEMxLT5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCisgIC8vIEhhbmRsZSBzaW1wbGlmaWNhdGlvbnMgd2hlbiB0aGUgUkhTIGlzIGEgY29uc3RhbnQgaW50LgorICBpZiAoQ29uc3RhbnRJbnQgKkNJMiA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDMikpIHsKKyAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICAgIGlmIChDSTItPmVxdWFsc0ludCgwKSkgcmV0dXJuIEMxOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYICsgMCA9PSBYCisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTdWI6CisgICAgICBpZiAoQ0kyLT5lcXVhbHNJbnQoMCkpIHJldHVybiBDMTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWCAtIDAgPT0gWAorICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICAgICAgaWYgKENJMi0+ZXF1YWxzSW50KDApKSByZXR1cm4gQzI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFggKiAwID09IDAKKyAgICAgIGlmIChDSTItPmVxdWFsc0ludCgxKSkKKyAgICAgICAgcmV0dXJuIEMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYICogMSA9PSBYCisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNEaXY6CisgICAgICBpZiAoQ0kyLT5lcXVhbHNJbnQoMSkpCisgICAgICAgIHJldHVybiBDMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFggLyAxID09IFgKKyAgICAgIGlmIChDSTItPmVxdWFsc0ludCgwKSkKKyAgICAgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChDSTItPmdldFR5cGUoKSk7ICAgICAgICAgICAgICAgLy8gWCAvIDAgPT0gdW5kZWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICAgIGlmIChDSTItPmVxdWFsc0ludCgxKSkKKyAgICAgICAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoQ0kyLT5nZXRUeXBlKCkpOyAgICAgICAgLy8gWCAlIDEgPT0gMAorICAgICAgaWYgKENJMi0+ZXF1YWxzSW50KDApKQorICAgICAgICByZXR1cm4gVW5kZWZWYWx1ZTo6Z2V0KENJMi0+Z2V0VHlwZSgpKTsgICAgICAgICAgICAgICAvLyBYICUgMCA9PSB1bmRlZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QW5kOgorICAgICAgaWYgKENJMi0+aXNaZXJvKCkpIHJldHVybiBDMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYICYgMCA9PSAwCisgICAgICBpZiAoQ0kyLT5pc0FsbE9uZXNWYWx1ZSgpKQorICAgICAgICByZXR1cm4gQzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYICYgLTEgPT0gWAorCisgICAgICBpZiAoQ29uc3RhbnRFeHByICpDRTEgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KEMxKSkgeworICAgICAgICAvLyAoemV4dCBpMzIgdG8gaTY0KSAmIDQyOTQ5NjcyOTUgLT4gKHpleHQgaTMyIHRvIGk2NCkKKyAgICAgICAgaWYgKENFMS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlpFeHQpIHsKKyAgICAgICAgICB1bnNpZ25lZCBEc3RXaWR0aCA9IENJMi0+Z2V0VHlwZSgpLT5nZXRCaXRXaWR0aCgpOworICAgICAgICAgIHVuc2lnbmVkIFNyY1dpZHRoID0KKyAgICAgICAgICAgIENFMS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgICAgICAgICAgQVBJbnQgUG9zc2libHlTZXRCaXRzKEFQSW50OjpnZXRMb3dCaXRzU2V0KERzdFdpZHRoLCBTcmNXaWR0aCkpOworICAgICAgICAgIGlmICgoUG9zc2libHlTZXRCaXRzICYgQ0kyLT5nZXRWYWx1ZSgpKSA9PSBQb3NzaWJseVNldEJpdHMpCisgICAgICAgICAgICByZXR1cm4gQzE7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBhbmQnaW5nIHRoZSBhZGRyZXNzIG9mIGEgZ2xvYmFsIHdpdGggYSBjb25zdGFudCwgZm9sZCBpdC4KKyAgICAgICAgaWYgKENFMS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlB0clRvSW50ICYmIAorICAgICAgICAgICAgaXNhPEdsb2JhbFZhbHVlPihDRTEtPmdldE9wZXJhbmQoMCkpKSB7CisgICAgICAgICAgR2xvYmFsVmFsdWUgKkdWID0gY2FzdDxHbG9iYWxWYWx1ZT4oQ0UxLT5nZXRPcGVyYW5kKDApKTsKKworICAgICAgICAgIC8vIEZ1bmN0aW9ucyBhcmUgYXQgbGVhc3QgNC1ieXRlIGFsaWduZWQuCisgICAgICAgICAgdW5zaWduZWQgR1ZBbGlnbiA9IEdWLT5nZXRBbGlnbm1lbnQoKTsKKyAgICAgICAgICBpZiAoaXNhPEZ1bmN0aW9uPihHVikpCisgICAgICAgICAgICBHVkFsaWduID0gc3RkOjptYXgoR1ZBbGlnbiwgNFUpOworCisgICAgICAgICAgaWYgKEdWQWxpZ24gPiAxKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBEc3RXaWR0aCA9IENJMi0+Z2V0VHlwZSgpLT5nZXRCaXRXaWR0aCgpOworICAgICAgICAgICAgdW5zaWduZWQgU3JjV2lkdGggPSBzdGQ6Om1pbihEc3RXaWR0aCwgTG9nMl8zMihHVkFsaWduKSk7CisgICAgICAgICAgICBBUEludCBCaXRzTm90U2V0KEFQSW50OjpnZXRMb3dCaXRzU2V0KERzdFdpZHRoLCBTcmNXaWR0aCkpOworCisgICAgICAgICAgICAvLyBJZiBjaGVja2luZyBiaXRzIHdlIGtub3cgYXJlIGNsZWFyLCByZXR1cm4gemVyby4KKyAgICAgICAgICAgIGlmICgoQ0kyLT5nZXRWYWx1ZSgpICYgQml0c05vdFNldCkgPT0gQ0kyLT5nZXRWYWx1ZSgpKQorICAgICAgICAgICAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShDSTItPmdldFR5cGUoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpPcjoKKyAgICAgIGlmIChDSTItPmVxdWFsc0ludCgwKSkgcmV0dXJuIEMxOyAgICAvLyBYIHwgMCA9PSBYCisgICAgICBpZiAoQ0kyLT5pc0FsbE9uZXNWYWx1ZSgpKQorICAgICAgICByZXR1cm4gQzI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFggfCAtMSA9PSAtMQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOgorICAgICAgaWYgKENJMi0+ZXF1YWxzSW50KDApKSByZXR1cm4gQzE7ICAgIC8vIFggXiAwID09IFgKKworICAgICAgaWYgKENvbnN0YW50RXhwciAqQ0UxID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDMSkpIHsKKyAgICAgICAgc3dpdGNoIChDRTEtPmdldE9wY29kZSgpKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpJQ21wOgorICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpGQ21wOgorICAgICAgICAgIC8vIGNtcCBwcmVkIF4gdHJ1ZSAtPiBjbXAgIXByZWQKKyAgICAgICAgICBhc3NlcnQoQ0kyLT5lcXVhbHNJbnQoMSkpOworICAgICAgICAgIENtcEluc3Q6OlByZWRpY2F0ZSBwcmVkID0gKENtcEluc3Q6OlByZWRpY2F0ZSlDRTEtPmdldFByZWRpY2F0ZSgpOworICAgICAgICAgIHByZWQgPSBDbXBJbnN0OjpnZXRJbnZlcnNlUHJlZGljYXRlKHByZWQpOworICAgICAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldENvbXBhcmUocHJlZCwgQ0UxLT5nZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0UxLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICAgIC8vIGFzaHIgKHpleHQgQyB0byBUeSksIEMyIC0+IGxzaHIgKHpleHQgQywgQ1NBKSwgQzIKKyAgICAgIGlmIChDb25zdGFudEV4cHIgKkNFMSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oQzEpKQorICAgICAgICBpZiAoQ0UxLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6WkV4dCkgIC8vIFRvcCBiaXRzIGtub3duIHplcm8uCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TFNocihDMSwgQzIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKGlzYTxDb25zdGFudEludD4oQzEpKSB7CisgICAgLy8gSWYgQzEgaXMgYSBDb25zdGFudEludCBhbmQgQzIgaXMgbm90LCBzd2FwIHRoZSBvcGVyYW5kcy4KKyAgICBpZiAoSW5zdHJ1Y3Rpb246OmlzQ29tbXV0YXRpdmUoT3Bjb2RlKSkKKyAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldChPcGNvZGUsIEMyLCBDMSk7CisgIH0KKworICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgbmVpdGhlciBjb25zdGFudCBpcyBhbiBVbmRlZlZhbHVlLgorICBpZiAoQ29uc3RhbnRJbnQgKkNJMSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDMSkpIHsKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJMiA9IGR5bl9jYXN0PENvbnN0YW50SW50PihDMikpIHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBBUEludE9wczsKKyAgICAgIGNvbnN0IEFQSW50ICZDMVYgPSBDSTEtPmdldFZhbHVlKCk7CisgICAgICBjb25zdCBBUEludCAmQzJWID0gQ0kyLT5nZXRWYWx1ZSgpOworICAgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6QWRkOiAgICAgCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENJMS0+Z2V0Q29udGV4dCgpLCBDMVYgKyBDMlYpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U3ViOiAgICAgCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENJMS0+Z2V0Q29udGV4dCgpLCBDMVYgLSBDMlYpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOiAgICAgCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENJMS0+Z2V0Q29udGV4dCgpLCBDMVYgKiBDMlYpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjoKKyAgICAgICAgYXNzZXJ0KCFDSTItPmlzTnVsbFZhbHVlKCkgJiYgIkRpdiBieSB6ZXJvIGhhbmRsZWQgYWJvdmUiKTsKKyAgICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoQ0kxLT5nZXRDb250ZXh0KCksIEMxVi51ZGl2KEMyVikpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0RpdjoKKyAgICAgICAgYXNzZXJ0KCFDSTItPmlzTnVsbFZhbHVlKCkgJiYgIkRpdiBieSB6ZXJvIGhhbmRsZWQgYWJvdmUiKTsKKyAgICAgICAgaWYgKEMyVi5pc0FsbE9uZXNWYWx1ZSgpICYmIEMxVi5pc01pblNpZ25lZFZhbHVlKCkpCisgICAgICAgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChDSTEtPmdldFR5cGUoKSk7ICAgLy8gTUlOX0lOVCAvIC0xIC0+IHVuZGVmCisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENJMS0+Z2V0Q29udGV4dCgpLCBDMVYuc2RpdihDMlYpKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgICAgIGFzc2VydCghQ0kyLT5pc051bGxWYWx1ZSgpICYmICJEaXYgYnkgemVybyBoYW5kbGVkIGFib3ZlIik7CisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENJMS0+Z2V0Q29udGV4dCgpLCBDMVYudXJlbShDMlYpKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNSZW06CisgICAgICAgIGFzc2VydCghQ0kyLT5pc051bGxWYWx1ZSgpICYmICJEaXYgYnkgemVybyBoYW5kbGVkIGFib3ZlIik7CisgICAgICAgIGlmIChDMlYuaXNBbGxPbmVzVmFsdWUoKSAmJiBDMVYuaXNNaW5TaWduZWRWYWx1ZSgpKQorICAgICAgICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoQ0kxLT5nZXRUeXBlKCkpOyAgIC8vIE1JTl9JTlQgJSAtMSAtPiB1bmRlZgorICAgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChDSTEtPmdldENvbnRleHQoKSwgQzFWLnNyZW0oQzJWKSk7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6CisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENJMS0+Z2V0Q29udGV4dCgpLCBDMVYgJiBDMlYpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENJMS0+Z2V0Q29udGV4dCgpLCBDMVYgfCBDMlYpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6WG9yOgorICAgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChDSTEtPmdldENvbnRleHQoKSwgQzFWIF4gQzJWKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNobDogeworICAgICAgICB1aW50MzJfdCBzaGlmdEFtdCA9IEMyVi5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgaWYgKHNoaWZ0QW10IDwgQzFWLmdldEJpdFdpZHRoKCkpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoQ0kxLT5nZXRDb250ZXh0KCksIEMxVi5zaGwoc2hpZnRBbXQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoQzEtPmdldFR5cGUoKSk7IC8vIHRvbyBiaWcgc2hpZnQgaXMgdW5kZWYKKyAgICAgIH0KKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6IHsKKyAgICAgICAgdWludDMyX3Qgc2hpZnRBbXQgPSBDMlYuZ2V0WkV4dFZhbHVlKCk7CisgICAgICAgIGlmIChzaGlmdEFtdCA8IEMxVi5nZXRCaXRXaWR0aCgpKQorICAgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENJMS0+Z2V0Q29udGV4dCgpLCBDMVYubHNocihzaGlmdEFtdCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChDMS0+Z2V0VHlwZSgpKTsgLy8gdG9vIGJpZyBzaGlmdCBpcyB1bmRlZgorICAgICAgfQorICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjogeworICAgICAgICB1aW50MzJfdCBzaGlmdEFtdCA9IEMyVi5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgaWYgKHNoaWZ0QW10IDwgQzFWLmdldEJpdFdpZHRoKCkpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoQ0kxLT5nZXRDb250ZXh0KCksIEMxVi5hc2hyKHNoaWZ0QW10KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gVW5kZWZWYWx1ZTo6Z2V0KEMxLT5nZXRUeXBlKCkpOyAvLyB0b28gYmlnIHNoaWZ0IGlzIHVuZGVmCisgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVEaXY6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QVNocjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTaGw6CisgICAgICBpZiAoQ0kxLT5lcXVhbHNJbnQoMCkpIHJldHVybiBDMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAoQ29uc3RhbnRGUCAqQ0ZQMSA9IGR5bl9jYXN0PENvbnN0YW50RlA+KEMxKSkgeworICAgIGlmIChDb25zdGFudEZQICpDRlAyID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oQzIpKSB7CisgICAgICBBUEZsb2F0IEMxViA9IENGUDEtPmdldFZhbHVlQVBGKCk7CisgICAgICBBUEZsb2F0IEMyViA9IENGUDItPmdldFZhbHVlQVBGKCk7CisgICAgICBBUEZsb2F0IEMzViA9IEMxVjsgIC8vIGNvcHkgZm9yIG1vZGlmaWNhdGlvbgorICAgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6CisgICAgICAgICh2b2lkKUMzVi5hZGQoQzJWLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICAgICAgcmV0dXJuIENvbnN0YW50RlA6OmdldChDMS0+Z2V0Q29udGV4dCgpLCBDM1YpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlN1YjoKKyAgICAgICAgKHZvaWQpQzNWLnN1YnRyYWN0KEMyViwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgICAgIHJldHVybiBDb25zdGFudEZQOjpnZXQoQzEtPmdldENvbnRleHQoKSwgQzNWKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZNdWw6CisgICAgICAgICh2b2lkKUMzVi5tdWx0aXBseShDMlYsIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgICAgICByZXR1cm4gQ29uc3RhbnRGUDo6Z2V0KEMxLT5nZXRDb250ZXh0KCksIEMzVik7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpGRGl2OgorICAgICAgICAodm9pZClDM1YuZGl2aWRlKEMyViwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbik7CisgICAgICAgIHJldHVybiBDb25zdGFudEZQOjpnZXQoQzEtPmdldENvbnRleHQoKSwgQzNWKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZSZW06CisgICAgICAgICh2b2lkKUMzVi5tb2QoQzJWLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICAgICAgcmV0dXJuIENvbnN0YW50RlA6OmdldChDMS0+Z2V0Q29udGV4dCgpLCBDM1YpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChjb25zdCBWZWN0b3JUeXBlICpWVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihDMS0+Z2V0VHlwZSgpKSkgeworICAgIENvbnN0YW50VmVjdG9yICpDUDEgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oQzEpOworICAgIENvbnN0YW50VmVjdG9yICpDUDIgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4oQzIpOworICAgIGlmICgoQ1AxICE9IE5VTEwgfHwgaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oQzEpKSAmJgorICAgICAgICAoQ1AyICE9IE5VTEwgfHwgaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oQzIpKSkgeworICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBSZXM7CisgICAgICBjb25zdCBUeXBlKiBFbHRUeSA9IFZUeS0+Z2V0RWxlbWVudFR5cGUoKTsgIAorICAgICAgQ29uc3RhbnQgKkMxID0gMDsKKyAgICAgIENvbnN0YW50ICpDMiA9IDA7CisgICAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRBZGQoQzEsIEMyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoUmVzKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZBZGQ6CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRGQWRkKEMxLCBDMikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KFJlcyk7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpTdWI6CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRTdWIoQzEsIEMyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoUmVzKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZTdWI6CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRGU3ViKEMxLCBDMikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KFJlcyk7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRNdWwoQzEsIEMyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoUmVzKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZNdWw6CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRGTXVsKEMxLCBDMikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KFJlcyk7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIEMxID0gQ1AxID8gQ1AxLT5nZXRPcGVyYW5kKGkpIDogQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7CisgICAgICAgICAgQzIgPSBDUDIgPyBDUDItPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBSZXMucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0VURpdihDMSwgQzIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29uc3RhbnRWZWN0b3I6OmdldChSZXMpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0RpdjoKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZUeS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBDMSA9IENQMSA/IENQMS0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIEMyID0gQ1AyID8gQ1AyLT5nZXRPcGVyYW5kKGkpIDogQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7CisgICAgICAgICAgUmVzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldFNEaXYoQzEsIEMyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoUmVzKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZEaXY6CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRGRGl2KEMxLCBDMikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KFJlcyk7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIEMxID0gQ1AxID8gQ1AxLT5nZXRPcGVyYW5kKGkpIDogQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7CisgICAgICAgICAgQzIgPSBDUDIgPyBDUDItPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBSZXMucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0VVJlbShDMSwgQzIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29uc3RhbnRWZWN0b3I6OmdldChSZXMpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZUeS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBDMSA9IENQMSA/IENQMS0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIEMyID0gQ1AyID8gQ1AyLT5nZXRPcGVyYW5kKGkpIDogQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7CisgICAgICAgICAgUmVzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldFNSZW0oQzEsIEMyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoUmVzKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZSZW06CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRGUmVtKEMxLCBDMikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KFJlcyk7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpBbmQ6IAorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIEMxID0gQ1AxID8gQ1AxLT5nZXRPcGVyYW5kKGkpIDogQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7CisgICAgICAgICAgQzIgPSBDUDIgPyBDUDItPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBSZXMucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0QW5kKEMxLCBDMikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KFJlcyk7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpPcjoKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZUeS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBDMSA9IENQMSA/IENQMS0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIEMyID0gQ1AyID8gQ1AyLT5nZXRPcGVyYW5kKGkpIDogQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7CisgICAgICAgICAgUmVzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldE9yKEMxLCBDMikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KFJlcyk7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpYb3I6CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRYb3IoQzEsIEMyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoUmVzKTsKKyAgICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkxTaHI6CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgQzEgPSBDUDEgPyBDUDEtPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBDMiA9IENQMiA/IENQMi0+Z2V0T3BlcmFuZChpKSA6IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRWx0VHkpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRMU2hyKEMxLCBDMikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KFJlcyk7CisgICAgICBjYXNlIEluc3RydWN0aW9uOjpBU2hyOgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIEMxID0gQ1AxID8gQ1AxLT5nZXRPcGVyYW5kKGkpIDogQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7CisgICAgICAgICAgQzIgPSBDUDIgPyBDUDItPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBSZXMucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0QVNocihDMSwgQzIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29uc3RhbnRWZWN0b3I6OmdldChSZXMpOworICAgICAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIEMxID0gQ1AxID8gQ1AxLT5nZXRPcGVyYW5kKGkpIDogQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShFbHRUeSk7CisgICAgICAgICAgQzIgPSBDUDIgPyBDUDItPmdldE9wZXJhbmQoaSkgOiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEVsdFR5KTsKKyAgICAgICAgICBSZXMucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0U2hsKEMxLCBDMikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KFJlcyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKENvbnN0YW50RXhwciAqQ0UxID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDMSkpIHsKKyAgICAvLyBUaGVyZSBhcmUgbWFueSBwb3NzaWJsZSBmb2xkaW5ncyB3ZSBjb3VsZCBkbyBoZXJlLiAgV2Ugc2hvdWxkIHByb2JhYmx5CisgICAgLy8gYXQgbGVhc3QgZm9sZCBhZGQgb2YgYSBwb2ludGVyIHdpdGggYW4gaW50ZWdlciBpbnRvIHRoZSBhcHByb3ByaWF0ZQorICAgIC8vIGdldGVsZW1lbnRwdHIuICBUaGlzIHdpbGwgaW1wcm92ZSBhbGlhcyBhbmFseXNpcyBhIGJpdC4KKworICAgIC8vIEdpdmVuICgoYSArIGIpICsgYyksIGlmIChiICsgYykgZm9sZHMgdG8gc29tZXRoaW5nIGludGVyZXN0aW5nLCByZXR1cm4KKyAgICAvLyAoYSArIChiICsgYykpLgorICAgIGlmIChJbnN0cnVjdGlvbjo6aXNBc3NvY2lhdGl2ZShPcGNvZGUsIEMxLT5nZXRUeXBlKCkpICYmCisgICAgICAgIENFMS0+Z2V0T3Bjb2RlKCkgPT0gT3Bjb2RlKSB7CisgICAgICBDb25zdGFudCAqVCA9IENvbnN0YW50RXhwcjo6Z2V0KE9wY29kZSwgQ0UxLT5nZXRPcGVyYW5kKDEpLCBDMik7CisgICAgICBpZiAoIWlzYTxDb25zdGFudEV4cHI+KFQpIHx8IGNhc3Q8Q29uc3RhbnRFeHByPihUKS0+Z2V0T3Bjb2RlKCkgIT0gT3Bjb2RlKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXQoT3Bjb2RlLCBDRTEtPmdldE9wZXJhbmQoMCksIFQpOworICAgIH0KKyAgfSBlbHNlIGlmIChpc2E8Q29uc3RhbnRFeHByPihDMikpIHsKKyAgICAvLyBJZiBDMiBpcyBhIGNvbnN0YW50IGV4cHIgYW5kIEMxIGlzbid0LCBmbG9wIHRoZW0gYXJvdW5kIGFuZCBmb2xkIHRoZQorICAgIC8vIG90aGVyIHdheSBpZiBwb3NzaWJsZS4KKyAgICBpZiAoSW5zdHJ1Y3Rpb246OmlzQ29tbXV0YXRpdmUoT3Bjb2RlKSkKKyAgICAgIHJldHVybiBDb25zdGFudEZvbGRCaW5hcnlJbnN0cnVjdGlvbihPcGNvZGUsIEMyLCBDMSk7CisgIH0KKworICAvLyBpMSBjYW4gYmUgc2ltcGxpZmllZCBpbiBtYW55IGNhc2VzLgorICBpZiAoQzEtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoMSkpIHsKKyAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkFkZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTdWI6CisgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRYb3IoQzEsIEMyKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpNdWw6CisgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRBbmQoQzEsIEMyKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTaGw6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6TFNocjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpBU2hyOgorICAgICAgLy8gV2UgY2FuIGFzc3VtZSB0aGF0IEMyID09IDAuICBJZiBpdCB3ZXJlIG9uZSB0aGUgcmVzdWx0IHdvdWxkIGJlCisgICAgICAvLyB1bmRlZmluZWQgYmVjYXVzZSB0aGUgc2hpZnQgdmFsdWUgaXMgYXMgbGFyZ2UgYXMgdGhlIGJpdHdpZHRoLgorICAgICAgcmV0dXJuIEMxOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNEaXY6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjoKKyAgICAgIC8vIFdlIGNhbiBhc3N1bWUgdGhhdCBDMiA9PSAxLiAgSWYgaXQgd2VyZSB6ZXJvIHRoZSByZXN1bHQgd291bGQgYmUKKyAgICAgIC8vIHVuZGVmaW5lZCB0aHJvdWdoIGRpdmlzaW9uIGJ5IHplcm8uCisgICAgICByZXR1cm4gQzE7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VVJlbToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOgorICAgICAgLy8gV2UgY2FuIGFzc3VtZSB0aGF0IEMyID09IDEuICBJZiBpdCB3ZXJlIHplcm8gdGhlIHJlc3VsdCB3b3VsZCBiZQorICAgICAgLy8gdW5kZWZpbmVkIHRocm91Z2ggZGl2aXNpb24gYnkgemVyby4KKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0RmFsc2UoQzEtPmdldENvbnRleHQoKSk7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIFdlIGRvbid0IGtub3cgaG93IHRvIGZvbGQgdGhpcy4KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBpc1plcm9TaXplZFR5cGUgLSBUaGlzIHR5cGUgaXMgemVybyBzaXplZCBpZiBpdHMgYW4gYXJyYXkgb3Igc3RydWN0dXJlIG9mCisvLy8gemVybyBzaXplZCB0eXBlcy4gIFRoZSBvbmx5IGxlYWYgemVybyBzaXplZCB0eXBlIGlzIGFuIGVtcHR5IHN0cnVjdHVyZS4KK3N0YXRpYyBib29sIGlzTWF5YmVaZXJvU2l6ZWRUeXBlKGNvbnN0IFR5cGUgKlR5KSB7CisgIGlmIChUeS0+aXNPcGFxdWVUeSgpKSByZXR1cm4gdHJ1ZTsgIC8vIENhbid0IHNheS4KKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkgeworCisgICAgLy8gSWYgYWxsIG9mIGVsZW1lbnRzIGhhdmUgemVybyBzaXplLCB0aGlzIGRvZXMgdG9vLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKCFpc01heWJlWmVyb1NpemVkVHlwZShTVHktPmdldEVsZW1lbnRUeXBlKGkpKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworCisgIH0gZWxzZSBpZiAoY29uc3QgQXJyYXlUeXBlICpBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KFR5KSkgeworICAgIHJldHVybiBpc01heWJlWmVyb1NpemVkVHlwZShBVHktPmdldEVsZW1lbnRUeXBlKCkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIElkeENvbXBhcmUgLSBDb21wYXJlIHRoZSB0d28gY29uc3RhbnRzIGFzIHRob3VnaCB0aGV5IHdlcmUgZ2V0ZWxlbWVudHB0cgorLy8vIGluZGljZXMuICBUaGlzIGFsbG93cyBjb2Vyc2lvbiBvZiB0aGUgdHlwZXMgdG8gYmUgdGhlIHNhbWUgdGhpbmcuCisvLy8KKy8vLyBJZiB0aGUgdHdvIGNvbnN0YW50cyBhcmUgdGhlICJzYW1lIiAoYWZ0ZXIgY29lcnNpb24pLCByZXR1cm4gMC4gIElmIHRoZQorLy8vIGZpcnN0IGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kLCByZXR1cm4gLTEsIGlmIHRoZSBzZWNvbmQgaXMgbGVzcyB0aGFuIHRoZQorLy8vIGZpcnN0LCByZXR1cm4gMS4gIElmIHRoZSBjb25zdGFudHMgYXJlIG5vdCBpbnRlZ3JhbCwgcmV0dXJuIC0yLgorLy8vCitzdGF0aWMgaW50IElkeENvbXBhcmUoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIsICBjb25zdCBUeXBlICpFbFR5KSB7CisgIGlmIChDMSA9PSBDMikgcmV0dXJuIDA7CisKKyAgLy8gT2ssIHdlIGZvdW5kIGEgZGlmZmVyZW50IGluZGV4LiAgSWYgdGhleSBhcmUgbm90IENvbnN0YW50SW50LCB3ZSBjYW4ndCBkbworICAvLyBhbnl0aGluZyB3aXRoIHRoZW0uCisgIGlmICghaXNhPENvbnN0YW50SW50PihDMSkgfHwgIWlzYTxDb25zdGFudEludD4oQzIpKQorICAgIHJldHVybiAtMjsgLy8gZG9uJ3Qga25vdyEKKworICAvLyBPaywgd2UgaGF2ZSB0d28gZGlmZmVyaW5nIGludGVnZXIgaW5kaWNlcy4gIFNpZ24gZXh0ZW5kIHRoZW0gdG8gYmUgdGhlIHNhbWUKKyAgLy8gdHlwZS4gIExvbmcgaXMgYWx3YXlzIGJpZyBlbm91Z2gsIHNvIHdlIHVzZSBpdC4KKyAgaWYgKCFDMS0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSg2NCkpCisgICAgQzEgPSBDb25zdGFudEV4cHI6OmdldFNFeHQoQzEsIFR5cGU6OmdldEludDY0VHkoQzEtPmdldENvbnRleHQoKSkpOworCisgIGlmICghQzItPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoNjQpKQorICAgIEMyID0gQ29uc3RhbnRFeHByOjpnZXRTRXh0KEMyLCBUeXBlOjpnZXRJbnQ2NFR5KEMxLT5nZXRDb250ZXh0KCkpKTsKKworICBpZiAoQzEgPT0gQzIpIHJldHVybiAwOyAgLy8gVGhleSBhcmUgZXF1YWwKKworICAvLyBJZiB0aGUgdHlwZSBiZWluZyBpbmRleGVkIG92ZXIgaXMgcmVhbGx5IGp1c3QgYSB6ZXJvIHNpemVkIHR5cGUsIHRoZXJlIGlzCisgIC8vIG5vIHBvaW50ZXIgZGlmZmVyZW5jZSBiZWluZyBtYWRlIGhlcmUuCisgIGlmIChpc01heWJlWmVyb1NpemVkVHlwZShFbFR5KSkKKyAgICByZXR1cm4gLTI7IC8vIGR1bm5vLgorCisgIC8vIElmIHRoZXkgYXJlIHJlYWxseSBkaWZmZXJlbnQsIG5vdyB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lIHR5cGUsIHRoZW4gd2UKKyAgLy8gZm91bmQgYSBkaWZmZXJlbmNlIQorICBpZiAoY2FzdDxDb25zdGFudEludD4oQzEpLT5nZXRTRXh0VmFsdWUoKSA8IAorICAgICAgY2FzdDxDb25zdGFudEludD4oQzIpLT5nZXRTRXh0VmFsdWUoKSkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICByZXR1cm4gMTsKK30KKworLy8vIGV2YWx1YXRlRkNtcFJlbGF0aW9uIC0gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGFueXRoaW5nIHdlIGNhbgorLy8vIGRlY2lkZSBhYm91dCB0aGUgdHdvIGNvbnN0YW50cyBwcm92aWRlZC4gIFRoaXMgZG9lc24ndCBuZWVkIHRvIGhhbmRsZSBzaW1wbGUKKy8vLyB0aGluZ3MgbGlrZSBDb25zdGFudEZQIGNvbXBhcmlzb25zLCBidXQgc2hvdWxkIGluc3RlYWQgaGFuZGxlIENvbnN0YW50RXhwcnMuCisvLy8gSWYgd2UgY2FuIGRldGVybWluZSB0aGF0IHRoZSB0d28gY29uc3RhbnRzIGhhdmUgYSBwYXJ0aWN1bGFyIHJlbGF0aW9uIHRvIAorLy8vIGVhY2ggb3RoZXIsIHdlIHNob3VsZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRkNtcEluc3QgcHJlZGljYXRlLCAKKy8vLyBvdGhlcndpc2UgcmV0dXJuIEZDbXBJbnN0OjpCQURfRkNNUF9QUkVESUNBVEUuIFRoaXMgaXMgdXNlZCBiZWxvdyBpbgorLy8vIENvbnN0YW50Rm9sZENvbXBhcmVJbnN0cnVjdGlvbi4KKy8vLworLy8vIFRvIHNpbXBsaWZ5IHRoaXMgY29kZSB3ZSBjYW5vbmljYWxpemUgdGhlIHJlbGF0aW9uIHNvIHRoYXQgdGhlIGZpcnN0CisvLy8gb3BlcmFuZCBpcyBhbHdheXMgdGhlIG1vc3QgImNvbXBsZXgiIG9mIHRoZSB0d28uICBXZSBjb25zaWRlciBDb25zdGFudEZQCisvLy8gdG8gYmUgdGhlIHNpbXBsZXN0LCBhbmQgQ29uc3RhbnRFeHBycyB0byBiZSB0aGUgbW9zdCBjb21wbGV4Lgorc3RhdGljIEZDbXBJbnN0OjpQcmVkaWNhdGUgZXZhbHVhdGVGQ21wUmVsYXRpb24oQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIpIHsKKyAgYXNzZXJ0KFYxLT5nZXRUeXBlKCkgPT0gVjItPmdldFR5cGUoKSAmJgorICAgICAgICAgIkNhbm5vdCBjb21wYXJlIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMhIik7CisKKyAgLy8gTm8gY29tcGlsZS10aW1lIG9wZXJhdGlvbnMgb24gdGhpcyB0eXBlIHlldC4KKyAgaWYgKFYxLT5nZXRUeXBlKCktPmlzUFBDX0ZQMTI4VHkoKSkKKyAgICByZXR1cm4gRkNtcEluc3Q6OkJBRF9GQ01QX1BSRURJQ0FURTsKKworICAvLyBIYW5kbGUgZGVnZW5lcmF0ZSBjYXNlIHF1aWNrbHkKKyAgaWYgKFYxID09IFYyKSByZXR1cm4gRkNtcEluc3Q6OkZDTVBfT0VROworCisgIGlmICghaXNhPENvbnN0YW50RXhwcj4oVjEpKSB7CisgICAgaWYgKCFpc2E8Q29uc3RhbnRFeHByPihWMikpIHsKKyAgICAgIC8vIFdlIGRpc3RpbGxlZCB0aGlzVXNlIHRoZSBzdGFuZGFyZCBjb25zdGFudCBmb2xkZXIgZm9yIGEgZmV3IGNhc2VzCisgICAgICBDb25zdGFudEludCAqUiA9IDA7CisgICAgICBSID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KAorICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0RkNtcChGQ21wSW5zdDo6RkNNUF9PRVEsIFYxLCBWMikpOworICAgICAgaWYgKFIgJiYgIVItPmlzWmVybygpKSAKKyAgICAgICAgcmV0dXJuIEZDbXBJbnN0OjpGQ01QX09FUTsKKyAgICAgIFIgPSBkeW5fY2FzdDxDb25zdGFudEludD4oCisgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRGQ21wKEZDbXBJbnN0OjpGQ01QX09MVCwgVjEsIFYyKSk7CisgICAgICBpZiAoUiAmJiAhUi0+aXNaZXJvKCkpIAorICAgICAgICByZXR1cm4gRkNtcEluc3Q6OkZDTVBfT0xUOworICAgICAgUiA9IGR5bl9jYXN0PENvbnN0YW50SW50PigKKyAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldEZDbXAoRkNtcEluc3Q6OkZDTVBfT0dULCBWMSwgVjIpKTsKKyAgICAgIGlmIChSICYmICFSLT5pc1plcm8oKSkgCisgICAgICAgIHJldHVybiBGQ21wSW5zdDo6RkNNUF9PR1Q7CisKKyAgICAgIC8vIE5vdGhpbmcgbW9yZSB3ZSBjYW4gZG8KKyAgICAgIHJldHVybiBGQ21wSW5zdDo6QkFEX0ZDTVBfUFJFRElDQVRFOworICAgIH0KKworICAgIC8vIElmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIHNpbXBsZSBhbmQgc2Vjb25kIGlzIENvbnN0YW50RXhwciwgc3dhcCBvcGVyYW5kcy4KKyAgICBGQ21wSW5zdDo6UHJlZGljYXRlIFN3YXBwZWRSZWxhdGlvbiA9IGV2YWx1YXRlRkNtcFJlbGF0aW9uKFYyLCBWMSk7CisgICAgaWYgKFN3YXBwZWRSZWxhdGlvbiAhPSBGQ21wSW5zdDo6QkFEX0ZDTVBfUFJFRElDQVRFKQorICAgICAgcmV0dXJuIEZDbXBJbnN0OjpnZXRTd2FwcGVkUHJlZGljYXRlKFN3YXBwZWRSZWxhdGlvbik7CisgIH0gZWxzZSB7CisgICAgLy8gT2ssIHRoZSBMSFMgaXMga25vd24gdG8gYmUgYSBjb25zdGFudGV4cHIuICBUaGUgUkhTIGNhbiBiZSBhbnkgb2YgYQorICAgIC8vIGNvbnN0YW50ZXhwciBvciBhIHNpbXBsZSBjb25zdGFudC4KKyAgICBDb25zdGFudEV4cHIgKkNFMSA9IGNhc3Q8Q29uc3RhbnRFeHByPihWMSk7CisgICAgc3dpdGNoIChDRTEtPmdldE9wY29kZSgpKSB7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUEV4dDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVSVRvRlA6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICAgICAgLy8gV2UgbWlnaHQgYmUgYWJsZSB0byBkbyBzb21ldGhpbmcgd2l0aCB0aGVzZSBidXQgd2UgZG9uJ3QgcmlnaHQgbm93LgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvLyBUaGVyZSBhcmUgTUFOWSBvdGhlciBmb2xkaW5ncyB0aGF0IHdlIGNvdWxkIHBlcmZvcm0gaGVyZS4gIFRoZXkgd2lsbAorICAvLyBwcm9iYWJseSBiZSBhZGRlZCBvbiBkZW1hbmQsIGFzIHRoZXkgc2VlbSBuZWVkZWQuCisgIHJldHVybiBGQ21wSW5zdDo6QkFEX0ZDTVBfUFJFRElDQVRFOworfQorCisvLy8gZXZhbHVhdGVJQ21wUmVsYXRpb24gLSBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW55dGhpbmcgd2UgY2FuCisvLy8gZGVjaWRlIGFib3V0IHRoZSB0d28gY29uc3RhbnRzIHByb3ZpZGVkLiAgVGhpcyBkb2Vzbid0IG5lZWQgdG8gaGFuZGxlIHNpbXBsZQorLy8vIHRoaW5ncyBsaWtlIGludGVnZXIgY29tcGFyaXNvbnMsIGJ1dCBzaG91bGQgaW5zdGVhZCBoYW5kbGUgQ29uc3RhbnRFeHBycworLy8vIGFuZCBHbG9iYWxWYWx1ZXMuICBJZiB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlIHR3byBjb25zdGFudHMgaGF2ZSBhCisvLy8gcGFydGljdWxhciByZWxhdGlvbiB0byBlYWNoIG90aGVyLCB3ZSBzaG91bGQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIElDbXAKKy8vLyBwcmVkaWNhdGUsIG90aGVyd2lzZSByZXR1cm4gSUNtcEluc3Q6OkJBRF9JQ01QX1BSRURJQ0FURS4KKy8vLworLy8vIFRvIHNpbXBsaWZ5IHRoaXMgY29kZSB3ZSBjYW5vbmljYWxpemUgdGhlIHJlbGF0aW9uIHNvIHRoYXQgdGhlIGZpcnN0CisvLy8gb3BlcmFuZCBpcyBhbHdheXMgdGhlIG1vc3QgImNvbXBsZXgiIG9mIHRoZSB0d28uICBXZSBjb25zaWRlciBzaW1wbGUKKy8vLyBjb25zdGFudHMgKGxpa2UgQ29uc3RhbnRJbnQpIHRvIGJlIHRoZSBzaW1wbGVzdCwgZm9sbG93ZWQgYnkKKy8vLyBHbG9iYWxWYWx1ZXMsIGZvbGxvd2VkIGJ5IENvbnN0YW50RXhwcidzICh0aGUgbW9zdCBjb21wbGV4KS4KKy8vLworc3RhdGljIElDbXBJbnN0OjpQcmVkaWNhdGUgZXZhbHVhdGVJQ21wUmVsYXRpb24oQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSB7CisgIGFzc2VydChWMS0+Z2V0VHlwZSgpID09IFYyLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICJDYW5ub3QgY29tcGFyZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFsdWVzISIpOworICBpZiAoVjEgPT0gVjIpIHJldHVybiBJQ21wSW5zdDo6SUNNUF9FUTsKKworICBpZiAoIWlzYTxDb25zdGFudEV4cHI+KFYxKSAmJiAhaXNhPEdsb2JhbFZhbHVlPihWMSkgJiYKKyAgICAgICFpc2E8QmxvY2tBZGRyZXNzPihWMSkpIHsKKyAgICBpZiAoIWlzYTxHbG9iYWxWYWx1ZT4oVjIpICYmICFpc2E8Q29uc3RhbnRFeHByPihWMikgJiYKKyAgICAgICAgIWlzYTxCbG9ja0FkZHJlc3M+KFYyKSkgeworICAgICAgLy8gV2UgZGlzdGlsbGVkIHRoaXMgZG93biB0byBhIHNpbXBsZSBjYXNlLCB1c2UgdGhlIHN0YW5kYXJkIGNvbnN0YW50CisgICAgICAvLyBmb2xkZXIuCisgICAgICBDb25zdGFudEludCAqUiA9IDA7CisgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIHByZWQgPSBJQ21wSW5zdDo6SUNNUF9FUTsKKyAgICAgIFIgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQ29uc3RhbnRFeHByOjpnZXRJQ21wKHByZWQsIFYxLCBWMikpOworICAgICAgaWYgKFIgJiYgIVItPmlzWmVybygpKSAKKyAgICAgICAgcmV0dXJuIHByZWQ7CisgICAgICBwcmVkID0gaXNTaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9TTFQgOiBJQ21wSW5zdDo6SUNNUF9VTFQ7CisgICAgICBSID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENvbnN0YW50RXhwcjo6Z2V0SUNtcChwcmVkLCBWMSwgVjIpKTsKKyAgICAgIGlmIChSICYmICFSLT5pc1plcm8oKSkKKyAgICAgICAgcmV0dXJuIHByZWQ7CisgICAgICBwcmVkID0gaXNTaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9TR1QgOiBJQ21wSW5zdDo6SUNNUF9VR1Q7CisgICAgICBSID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KENvbnN0YW50RXhwcjo6Z2V0SUNtcChwcmVkLCBWMSwgVjIpKTsKKyAgICAgIGlmIChSICYmICFSLT5pc1plcm8oKSkKKyAgICAgICAgcmV0dXJuIHByZWQ7CisKKyAgICAgIC8vIElmIHdlIGNvdWxkbid0IGZpZ3VyZSBpdCBvdXQsIGJhaWwuCisgICAgICByZXR1cm4gSUNtcEluc3Q6OkJBRF9JQ01QX1BSRURJQ0FURTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgZmlyc3Qgb3BlcmFuZCBpcyBzaW1wbGUsIHN3YXAgb3BlcmFuZHMuCisgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBTd2FwcGVkUmVsYXRpb24gPSAKKyAgICAgIGV2YWx1YXRlSUNtcFJlbGF0aW9uKFYyLCBWMSwgaXNTaWduZWQpOworICAgIGlmIChTd2FwcGVkUmVsYXRpb24gIT0gSUNtcEluc3Q6OkJBRF9JQ01QX1BSRURJQ0FURSkKKyAgICAgIHJldHVybiBJQ21wSW5zdDo6Z2V0U3dhcHBlZFByZWRpY2F0ZShTd2FwcGVkUmVsYXRpb24pOworCisgIH0gZWxzZSBpZiAoY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KFYxKSkgeworICAgIGlmIChpc2E8Q29uc3RhbnRFeHByPihWMikpIHsgIC8vIFN3YXAgYXMgbmVjZXNzYXJ5LgorICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBTd2FwcGVkUmVsYXRpb24gPSAKKyAgICAgICAgZXZhbHVhdGVJQ21wUmVsYXRpb24oVjIsIFYxLCBpc1NpZ25lZCk7CisgICAgICBpZiAoU3dhcHBlZFJlbGF0aW9uICE9IElDbXBJbnN0OjpCQURfSUNNUF9QUkVESUNBVEUpCisgICAgICAgIHJldHVybiBJQ21wSW5zdDo6Z2V0U3dhcHBlZFByZWRpY2F0ZShTd2FwcGVkUmVsYXRpb24pOworICAgICAgcmV0dXJuIElDbXBJbnN0OjpCQURfSUNNUF9QUkVESUNBVEU7CisgICAgfQorCisgICAgLy8gTm93IHdlIGtub3cgdGhhdCB0aGUgUkhTIGlzIGEgR2xvYmFsVmFsdWUsIEJsb2NrQWRkcmVzcyBvciBzaW1wbGUKKyAgICAvLyBjb25zdGFudCAod2hpY2gsIHNpbmNlIHRoZSB0eXBlcyBtdXN0IG1hdGNoLCBtZWFucyB0aGF0IGl0J3MgYQorICAgIC8vIENvbnN0YW50UG9pbnRlck51bGwpLgorICAgIGlmIChjb25zdCBHbG9iYWxWYWx1ZSAqR1YyID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KFYyKSkgeworICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGRlY2lkZSBlcXVhbGl0eSBvZiBhbGlhc2VzLgorICAgICAgaWYgKCFpc2E8R2xvYmFsQWxpYXM+KEdWKSAmJiAhaXNhPEdsb2JhbEFsaWFzPihHVjIpKQorICAgICAgICBpZiAoIUdWLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkgfHwgIUdWMi0+aGFzRXh0ZXJuYWxXZWFrTGlua2FnZSgpKQorICAgICAgICAgIHJldHVybiBJQ21wSW5zdDo6SUNNUF9ORTsKKyAgICB9IGVsc2UgaWYgKGlzYTxCbG9ja0FkZHJlc3M+KFYyKSkgeworICAgICAgcmV0dXJuIElDbXBJbnN0OjpJQ01QX05FOyAvLyBHbG9iYWxzIG5ldmVyIGVxdWFsIGxhYmVscy4KKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihWMikgJiYgIkNhbm9uaWNhbGl6YXRpb24gZ3VhcmFudGVlISIpOworICAgICAgLy8gR2xvYmFsVmFscyBjYW4gbmV2ZXIgYmUgbnVsbCB1bmxlc3MgdGhleSBoYXZlIGV4dGVybmFsIHdlYWsgbGlua2FnZS4KKyAgICAgIC8vIFdlIGRvbid0IHRyeSB0byBldmFsdWF0ZSBhbGlhc2VzIGhlcmUuCisgICAgICBpZiAoIUdWLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkgJiYgIWlzYTxHbG9iYWxBbGlhcz4oR1YpKQorICAgICAgICByZXR1cm4gSUNtcEluc3Q6OklDTVBfTkU7CisgICAgfQorICB9IGVsc2UgaWYgKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEgPSBkeW5fY2FzdDxCbG9ja0FkZHJlc3M+KFYxKSkgeworICAgIGlmIChpc2E8Q29uc3RhbnRFeHByPihWMikpIHsgIC8vIFN3YXAgYXMgbmVjZXNzYXJ5LgorICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBTd2FwcGVkUmVsYXRpb24gPSAKKyAgICAgICAgZXZhbHVhdGVJQ21wUmVsYXRpb24oVjIsIFYxLCBpc1NpZ25lZCk7CisgICAgICBpZiAoU3dhcHBlZFJlbGF0aW9uICE9IElDbXBJbnN0OjpCQURfSUNNUF9QUkVESUNBVEUpCisgICAgICAgIHJldHVybiBJQ21wSW5zdDo6Z2V0U3dhcHBlZFByZWRpY2F0ZShTd2FwcGVkUmVsYXRpb24pOworICAgICAgcmV0dXJuIElDbXBJbnN0OjpCQURfSUNNUF9QUkVESUNBVEU7CisgICAgfQorICAgIAorICAgIC8vIE5vdyB3ZSBrbm93IHRoYXQgdGhlIFJIUyBpcyBhIEdsb2JhbFZhbHVlLCBCbG9ja0FkZHJlc3Mgb3Igc2ltcGxlCisgICAgLy8gY29uc3RhbnQgKHdoaWNoLCBzaW5jZSB0aGUgdHlwZXMgbXVzdCBtYXRjaCwgbWVhbnMgdGhhdCBpdCBpcyBhCisgICAgLy8gQ29uc3RhbnRQb2ludGVyTnVsbCkuCisgICAgaWYgKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEyID0gZHluX2Nhc3Q8QmxvY2tBZGRyZXNzPihWMikpIHsKKyAgICAgIC8vIEJsb2NrIGFkZHJlc3MgaW4gYW5vdGhlciBmdW5jdGlvbiBjYW4ndCBlcXVhbCB0aGlzIG9uZSwgYnV0IGJsb2NrCisgICAgICAvLyBhZGRyZXNzZXMgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24gbWlnaHQgYmUgdGhlIHNhbWUgaWYgYmxvY2tzIGFyZQorICAgICAgLy8gZW1wdHkuCisgICAgICBpZiAoQkEyLT5nZXRGdW5jdGlvbigpICE9IEJBLT5nZXRGdW5jdGlvbigpKQorICAgICAgICByZXR1cm4gSUNtcEluc3Q6OklDTVBfTkU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEJsb2NrIGFkZHJlc3NlcyBhcmVuJ3QgbnVsbCwgZG9uJ3QgZXF1YWwgdGhlIGFkZHJlc3Mgb2YgZ2xvYmFscy4KKyAgICAgIGFzc2VydCgoaXNhPENvbnN0YW50UG9pbnRlck51bGw+KFYyKSB8fCBpc2E8R2xvYmFsVmFsdWU+KFYyKSkgJiYKKyAgICAgICAgICAgICAiQ2Fub25pY2FsaXphdGlvbiBndWFyYW50ZWUhIik7CisgICAgICByZXR1cm4gSUNtcEluc3Q6OklDTVBfTkU7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIE9rLCB0aGUgTEhTIGlzIGtub3duIHRvIGJlIGEgY29uc3RhbnRleHByLiAgVGhlIFJIUyBjYW4gYmUgYW55IG9mIGEKKyAgICAvLyBjb25zdGFudGV4cHIsIGEgZ2xvYmFsLCBibG9jayBhZGRyZXNzLCBvciBhIHNpbXBsZSBjb25zdGFudC4KKyAgICBDb25zdGFudEV4cHIgKkNFMSA9IGNhc3Q8Q29uc3RhbnRFeHByPihWMSk7CisgICAgQ29uc3RhbnQgKkNFMU9wMCA9IENFMS0+Z2V0T3BlcmFuZCgwKTsKKworICAgIHN3aXRjaCAoQ0UxLT5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVHJ1bmM6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSToKKyAgICAgIGJyZWFrOyAvLyBXZSBjYW4ndCBldmFsdWF0ZSBmbG9hdGluZyBwb2ludCBjYXN0cyBvciB0cnVuY2F0aW9ucy4KKworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTSVRvRlA6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6CisgICAgICAvLyBJZiB0aGUgY2FzdCBpcyBub3QgYWN0dWFsbHkgY2hhbmdpbmcgYml0cywgYW5kIHRoZSBzZWNvbmQgb3BlcmFuZCBpcyBhCisgICAgICAvLyBudWxsIHBvaW50ZXIsIGRvIHRoZSBjb21wYXJpc29uIHdpdGggdGhlIHByZS1jYXN0ZWQgdmFsdWUuCisgICAgICBpZiAoVjItPmlzTnVsbFZhbHVlKCkgJiYKKyAgICAgICAgICAoQ0UxLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkgfHwgQ0UxLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkpKSB7CisgICAgICAgIGlmIChDRTEtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpaRXh0KSBpc1NpZ25lZCA9IGZhbHNlOworICAgICAgICBpZiAoQ0UxLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U0V4dCkgaXNTaWduZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gZXZhbHVhdGVJQ21wUmVsYXRpb24oQ0UxT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShDRTFPcDAtPmdldFR5cGUoKSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduZWQpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOgorICAgICAgLy8gT2ssIHNpbmNlIHRoaXMgaXMgYSBnZXRlbGVtZW50cHRyLCB3ZSBrbm93IHRoYXQgdGhlIGNvbnN0YW50IGhhcyBhCisgICAgICAvLyBwb2ludGVyIHR5cGUuICBDaGVjayB0aGUgdmFyaW91cyBjYXNlcy4KKyAgICAgIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oVjIpKSB7CisgICAgICAgIC8vIElmIHdlIGFyZSBjb21wYXJpbmcgYSBHRVAgdG8gYSBudWxsIHBvaW50ZXIsIGNoZWNrIHRvIHNlZSBpZiB0aGUgYmFzZQorICAgICAgICAvLyBvZiB0aGUgR0VQIGVxdWFscyB0aGUgbnVsbCBwb2ludGVyLgorICAgICAgICBpZiAoY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KENFMU9wMCkpIHsKKyAgICAgICAgICBpZiAoR1YtPmhhc0V4dGVybmFsV2Vha0xpbmthZ2UoKSkKKyAgICAgICAgICAgIC8vIFdlYWsgbGlua2FnZSBHVmFscyBjb3VsZCBiZSB6ZXJvIG9yIG5vdC4gV2UncmUgY29tcGFyaW5nIHRoYXQKKyAgICAgICAgICAgIC8vIHRvIG51bGwgcG9pbnRlciBzbyBpdHMgZ3JlYXRlci1vci1lcXVhbAorICAgICAgICAgICAgcmV0dXJuIGlzU2lnbmVkID8gSUNtcEluc3Q6OklDTVBfU0dFIDogSUNtcEluc3Q6OklDTVBfVUdFOworICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAvLyBJZiBpdHMgbm90IHdlYWsgbGlua2FnZSwgdGhlIEdWYWwgbXVzdCBoYXZlIGEgbm9uLXplcm8gYWRkcmVzcworICAgICAgICAgICAgLy8gc28gdGhlIHJlc3VsdCBpcyBncmVhdGVyLXRoYW4KKyAgICAgICAgICAgIHJldHVybiBpc1NpZ25lZCA/IElDbXBJbnN0OjpJQ01QX1NHVCA6IElDbXBJbnN0OjpJQ01QX1VHVDsKKyAgICAgICAgfSBlbHNlIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oQ0UxT3AwKSkgeworICAgICAgICAgIC8vIElmIHdlIGFyZSBpbmRleGluZyBmcm9tIGEgbnVsbCBwb2ludGVyLCBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkKKyAgICAgICAgICAvLyBub24temVybyBpbmRpY2VzLgorICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBDRTEtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgICAgaWYgKCFDRTEtPmdldE9wZXJhbmQoaSktPmlzTnVsbFZhbHVlKCkpCisgICAgICAgICAgICAgIC8vIE9mZnNldHRpbmcgZnJvbSBudWxsLCBtdXN0IG5vdCBiZSBlcXVhbC4KKyAgICAgICAgICAgICAgcmV0dXJuIGlzU2lnbmVkID8gSUNtcEluc3Q6OklDTVBfU0dUIDogSUNtcEluc3Q6OklDTVBfVUdUOworICAgICAgICAgIC8vIE9ubHkgemVybyBpbmRleGVzIGZyb20gbnVsbCwgbXVzdCBzdGlsbCBiZSB6ZXJvLgorICAgICAgICAgIHJldHVybiBJQ21wSW5zdDo6SUNNUF9FUTsKKyAgICAgICAgfQorICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGNhbid0IHJlYWxseSBzYXkgaWYgdGhlIGZpcnN0IG9wZXJhbmQgaXMgbnVsbCBvciBub3QuCisgICAgICB9IGVsc2UgaWYgKGNvbnN0IEdsb2JhbFZhbHVlICpHVjIgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oVjIpKSB7CisgICAgICAgIGlmIChpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oQ0UxT3AwKSkgeworICAgICAgICAgIGlmIChHVjItPmhhc0V4dGVybmFsV2Vha0xpbmthZ2UoKSkKKyAgICAgICAgICAgIC8vIFdlYWsgbGlua2FnZSBHVmFscyBjb3VsZCBiZSB6ZXJvIG9yIG5vdC4gV2UncmUgY29tcGFyaW5nIGl0IHRvCisgICAgICAgICAgICAvLyBhIG51bGwgcG9pbnRlciwgc28gaXRzIGxlc3Mtb3ItZXF1YWwKKyAgICAgICAgICAgIHJldHVybiBpc1NpZ25lZCA/IElDbXBJbnN0OjpJQ01QX1NMRSA6IElDbXBJbnN0OjpJQ01QX1VMRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyBJZiBpdHMgbm90IHdlYWsgbGlua2FnZSwgdGhlIEdWYWwgbXVzdCBoYXZlIGEgbm9uLXplcm8gYWRkcmVzcworICAgICAgICAgICAgLy8gc28gdGhlIHJlc3VsdCBpcyBsZXNzLXRoYW4KKyAgICAgICAgICAgIHJldHVybiBpc1NpZ25lZCA/IElDbXBJbnN0OjpJQ01QX1NMVCA6IElDbXBJbnN0OjpJQ01QX1VMVDsKKyAgICAgICAgfSBlbHNlIGlmIChjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oQ0UxT3AwKSkgeworICAgICAgICAgIGlmIChHViA9PSBHVjIpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBnZXRlbGVtZW50cHRyIG9mIHRoZSBzYW1lIGdsb2JhbCwgdGhlbiBpdCBtdXN0IGJlCisgICAgICAgICAgICAvLyBkaWZmZXJlbnQuICBCZWNhdXNlIHRoZSB0eXBlcyBtdXN0IG1hdGNoLCB0aGUgZ2V0ZWxlbWVudHB0ciBjb3VsZAorICAgICAgICAgICAgLy8gb25seSBoYXZlIGF0IG1vc3Qgb25lIGluZGV4LCBhbmQgYmVjYXVzZSB3ZSBmb2xkIGdldGVsZW1lbnRwdHIncworICAgICAgICAgICAgLy8gd2l0aCBhIHNpbmdsZSB6ZXJvIGluZGV4LCBpdCBtdXN0IGJlIG5vbnplcm8uCisgICAgICAgICAgICBhc3NlcnQoQ0UxLT5nZXROdW1PcGVyYW5kcygpID09IDIgJiYKKyAgICAgICAgICAgICAgICAgICAhQ0UxLT5nZXRPcGVyYW5kKDEpLT5pc051bGxWYWx1ZSgpICYmCisgICAgICAgICAgICAgICAgICAgIlN1cHJpc2luZyBnZXRlbGVtZW50cHRyISIpOworICAgICAgICAgICAgcmV0dXJuIGlzU2lnbmVkID8gSUNtcEluc3Q6OklDTVBfU0dUIDogSUNtcEluc3Q6OklDTVBfVUdUOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGV5IGFyZSBkaWZmZXJlbnQgZ2xvYmFscywgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSB2YWx1ZSBpcywKKyAgICAgICAgICAgIC8vIGJ1dCB0aGV5IGNhbid0IGJlIGVxdWFsLgorICAgICAgICAgICAgcmV0dXJuIElDbXBJbnN0OjpJQ01QX05FOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29uc3RhbnRFeHByICpDRTIgPSBjYXN0PENvbnN0YW50RXhwcj4oVjIpOworICAgICAgICBDb25zdGFudCAqQ0UyT3AwID0gQ0UyLT5nZXRPcGVyYW5kKDApOworCisgICAgICAgIC8vIFRoZXJlIGFyZSBNQU5ZIG90aGVyIGZvbGRpbmdzIHRoYXQgd2UgY291bGQgcGVyZm9ybSBoZXJlLiAgVGhleSB3aWxsCisgICAgICAgIC8vIHByb2JhYmx5IGJlIGFkZGVkIG9uIGRlbWFuZCwgYXMgdGhleSBzZWVtIG5lZWRlZC4KKyAgICAgICAgc3dpdGNoIChDRTItPmdldE9wY29kZSgpKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlIEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOgorICAgICAgICAgIC8vIEJ5IGZhciB0aGUgbW9zdCBjb21tb24gY2FzZSB0byBoYW5kbGUgaXMgd2hlbiB0aGUgYmFzZSBwb2ludGVycyBhcmUKKyAgICAgICAgICAvLyBvYnZpb3VzbHkgdG8gdGhlIHNhbWUgb3IgZGlmZmVyZW50IGdsb2JhbHMuCisgICAgICAgICAgaWYgKGlzYTxHbG9iYWxWYWx1ZT4oQ0UxT3AwKSAmJiBpc2E8R2xvYmFsVmFsdWU+KENFMk9wMCkpIHsKKyAgICAgICAgICAgIGlmIChDRTFPcDAgIT0gQ0UyT3AwKSAvLyBEb24ndCBrbm93IHJlbGF0aXZlIG9yZGVyaW5nLCBidXQgbm90IGVxdWFsCisgICAgICAgICAgICAgIHJldHVybiBJQ21wSW5zdDo6SUNNUF9ORTsKKyAgICAgICAgICAgIC8vIE9rLCB3ZSBrbm93IHRoYXQgYm90aCBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9ucyBhcmUgYmFzZWQgb24gdGhlCisgICAgICAgICAgICAvLyBzYW1lIGdsb2JhbC4gIEZyb20gdGhpcywgd2UgY2FuIHByZWNpc2VseSBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlCisgICAgICAgICAgICAvLyBvcmRlcmluZyBvZiB0aGUgcmVzdWx0YW50IHBvaW50ZXJzLgorICAgICAgICAgICAgdW5zaWduZWQgaSA9IDE7CisKKyAgICAgICAgICAgIC8vIFRoZSBsb2dpYyBiZWxvdyBhc3N1bWVzIHRoYXQgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbgorICAgICAgICAgICAgLy8gY2FuIGJlIGRldGVybWluZWQgYnkgZmluZGluZyB0aGUgZmlyc3QgaW5kZXggdGhhdCBkaWZmZXJzLgorICAgICAgICAgICAgLy8gVGhpcyBkb2Vzbid0IHdvcmsgaWYgdGhlcmUgaXMgb3Zlci1pbmRleGluZyBpbiBhbnkKKyAgICAgICAgICAgIC8vIHN1YnNlcXVlbnQgaW5kaWNlcywgc28gY2hlY2sgZm9yIHRoYXQgY2FzZSBmaXJzdC4KKyAgICAgICAgICAgIGlmICghQ0UxLT5pc0dFUFdpdGhOb05vdGlvbmFsT3ZlckluZGV4aW5nKCkgfHwKKyAgICAgICAgICAgICAgICAhQ0UyLT5pc0dFUFdpdGhOb05vdGlvbmFsT3ZlckluZGV4aW5nKCkpCisgICAgICAgICAgICAgICByZXR1cm4gSUNtcEluc3Q6OkJBRF9JQ01QX1BSRURJQ0FURTsgLy8gTWlnaHQgYmUgZXF1YWwuCisKKyAgICAgICAgICAgIC8vIENvbXBhcmUgYWxsIG9mIHRoZSBvcGVyYW5kcyB0aGUgR0VQJ3MgaGF2ZSBpbiBjb21tb24uCisgICAgICAgICAgICBnZXBfdHlwZV9pdGVyYXRvciBHVEkgPSBnZXBfdHlwZV9iZWdpbihDRTEpOworICAgICAgICAgICAgZm9yICg7aSAhPSBDRTEtPmdldE51bU9wZXJhbmRzKCkgJiYgaSAhPSBDRTItPmdldE51bU9wZXJhbmRzKCk7CisgICAgICAgICAgICAgICAgICsraSwgKytHVEkpCisgICAgICAgICAgICAgIHN3aXRjaCAoSWR4Q29tcGFyZShDRTEtPmdldE9wZXJhbmQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRTItPmdldE9wZXJhbmQoaSksIEdUSS5nZXRJbmRleGVkVHlwZSgpKSkgeworICAgICAgICAgICAgICBjYXNlIC0xOiByZXR1cm4gaXNTaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9TTFQ6SUNtcEluc3Q6OklDTVBfVUxUOworICAgICAgICAgICAgICBjYXNlIDE6ICByZXR1cm4gaXNTaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9TR1Q6SUNtcEluc3Q6OklDTVBfVUdUOworICAgICAgICAgICAgICBjYXNlIC0yOiByZXR1cm4gSUNtcEluc3Q6OkJBRF9JQ01QX1BSRURJQ0FURTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPaywgd2UgcmFuIG91dCBvZiB0aGluZ3MgdGhleSBoYXZlIGluIGNvbW1vbi4gIElmIGFueSBsZWZ0b3ZlcnMKKyAgICAgICAgICAgIC8vIGFyZSBub24temVybyB0aGVuIHdlIGhhdmUgYSBkaWZmZXJlbmNlLCBvdGhlcndpc2Ugd2UgYXJlIGVxdWFsLgorICAgICAgICAgICAgZm9yICg7IGkgPCBDRTEtPmdldE51bU9wZXJhbmRzKCk7ICsraSkKKyAgICAgICAgICAgICAgaWYgKCFDRTEtPmdldE9wZXJhbmQoaSktPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNhPENvbnN0YW50SW50PihDRTEtPmdldE9wZXJhbmQoaSkpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU2lnbmVkID8gSUNtcEluc3Q6OklDTVBfU0dUIDogSUNtcEluc3Q6OklDTVBfVUdUOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHJldHVybiBJQ21wSW5zdDo6QkFEX0lDTVBfUFJFRElDQVRFOyAvLyBNaWdodCBiZSBlcXVhbC4KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKDsgaSA8IENFMi0+Z2V0TnVtT3BlcmFuZHMoKTsgKytpKQorICAgICAgICAgICAgICBpZiAoIUNFMi0+Z2V0T3BlcmFuZChpKS0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICAgICAgICAgIGlmIChpc2E8Q29uc3RhbnRJbnQ+KENFMi0+Z2V0T3BlcmFuZChpKSkpCisgICAgICAgICAgICAgICAgICByZXR1cm4gaXNTaWduZWQgPyBJQ21wSW5zdDo6SUNNUF9TTFQgOiBJQ21wSW5zdDo6SUNNUF9VTFQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcmV0dXJuIElDbXBJbnN0OjpCQURfSUNNUF9QUkVESUNBVEU7IC8vIE1pZ2h0IGJlIGVxdWFsLgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSUNtcEluc3Q6OklDTVBfRVE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBJQ21wSW5zdDo6QkFEX0lDTVBfUFJFRElDQVRFOworfQorCitDb25zdGFudCAqbGx2bTo6Q29uc3RhbnRGb2xkQ29tcGFyZUluc3RydWN0aW9uKHVuc2lnbmVkIHNob3J0IHByZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICBjb25zdCBUeXBlICpSZXN1bHRUeTsKKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oQzEtPmdldFR5cGUoKSkpCisgICAgUmVzdWx0VHkgPSBWZWN0b3JUeXBlOjpnZXQoVHlwZTo6Z2V0SW50MVR5KEMxLT5nZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZULT5nZXROdW1FbGVtZW50cygpKTsKKyAgZWxzZQorICAgIFJlc3VsdFR5ID0gVHlwZTo6Z2V0SW50MVR5KEMxLT5nZXRDb250ZXh0KCkpOworCisgIC8vIEZvbGQgRkNNUF9GQUxTRS9GQ01QX1RSVUUgdW5jb25kaXRpb25hbGx5LgorICBpZiAocHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9GQUxTRSkKKyAgICByZXR1cm4gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShSZXN1bHRUeSk7CisKKyAgaWYgKHByZWQgPT0gRkNtcEluc3Q6OkZDTVBfVFJVRSkKKyAgICByZXR1cm4gQ29uc3RhbnQ6OmdldEFsbE9uZXNWYWx1ZShSZXN1bHRUeSk7CisKKyAgLy8gSGFuZGxlIHNvbWUgZGVnZW5lcmF0ZSBjYXNlcyBmaXJzdAorICBpZiAoaXNhPFVuZGVmVmFsdWU+KEMxKSB8fCBpc2E8VW5kZWZWYWx1ZT4oQzIpKSB7CisgICAgLy8gRm9yIEVRIGFuZCBORSwgd2UgY2FuIGFsd2F5cyBwaWNrIGEgdmFsdWUgZm9yIHRoZSB1bmRlZiB0byBtYWtlIHRoZQorICAgIC8vIHByZWRpY2F0ZSBwYXNzIG9yIGZhaWwsIHNvIHdlIGNhbiByZXR1cm4gdW5kZWYuCisgICAgaWYgKElDbXBJbnN0Ojppc0VxdWFsaXR5KElDbXBJbnN0OjpQcmVkaWNhdGUocHJlZCkpKQorICAgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChSZXN1bHRUeSk7CisgICAgLy8gT3RoZXJ3aXNlLCBwaWNrIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBub24tdW5kZWYgb3BlcmFuZCwgYW5kIGZvbGQKKyAgICAvLyBpdCB0byB0cnVlIG9yIGZhbHNlLgorICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBDbXBJbnN0Ojppc1RydWVXaGVuRXF1YWwocHJlZCkpOworICB9CisKKyAgLy8gTm8gY29tcGlsZS10aW1lIG9wZXJhdGlvbnMgb24gdGhpcyB0eXBlIHlldC4KKyAgaWYgKEMxLT5nZXRUeXBlKCktPmlzUFBDX0ZQMTI4VHkoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBpY21wIGVxL25lKG51bGwsR1YpIC0+IGZhbHNlL3RydWUKKyAgaWYgKEMxLT5pc051bGxWYWx1ZSgpKSB7CisgICAgaWYgKGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhbHVlPihDMikpCisgICAgICAvLyBEb24ndCB0cnkgdG8gZXZhbHVhdGUgYWxpYXNlcy4gIEV4dGVybmFsIHdlYWsgR1YgY2FuIGJlIG51bGwuCisgICAgICBpZiAoIWlzYTxHbG9iYWxBbGlhcz4oR1YpICYmICFHVi0+aGFzRXh0ZXJuYWxXZWFrTGlua2FnZSgpKSB7CisgICAgICAgIGlmIChwcmVkID09IElDbXBJbnN0OjpJQ01QX0VRKQorICAgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0RmFsc2UoQzEtPmdldENvbnRleHQoKSk7CisgICAgICAgIGVsc2UgaWYgKHByZWQgPT0gSUNtcEluc3Q6OklDTVBfTkUpCisgICAgICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXRUcnVlKEMxLT5nZXRDb250ZXh0KCkpOworICAgICAgfQorICAvLyBpY21wIGVxL25lKEdWLG51bGwpIC0+IGZhbHNlL3RydWUKKyAgfSBlbHNlIGlmIChDMi0+aXNOdWxsVmFsdWUoKSkgeworICAgIGlmIChjb25zdCBHbG9iYWxWYWx1ZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oQzEpKQorICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGV2YWx1YXRlIGFsaWFzZXMuICBFeHRlcm5hbCB3ZWFrIEdWIGNhbiBiZSBudWxsLgorICAgICAgaWYgKCFpc2E8R2xvYmFsQWxpYXM+KEdWKSAmJiAhR1YtPmhhc0V4dGVybmFsV2Vha0xpbmthZ2UoKSkgeworICAgICAgICBpZiAocHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9FUSkKKyAgICAgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldEZhbHNlKEMxLT5nZXRDb250ZXh0KCkpOworICAgICAgICBlbHNlIGlmIChwcmVkID09IElDbXBJbnN0OjpJQ01QX05FKQorICAgICAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0VHJ1ZShDMS0+Z2V0Q29udGV4dCgpKTsKKyAgICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSBjb21wYXJpc29uIGlzIGEgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byBpMSdzLCBzaW1wbGlmeSBpdC4KKyAgaWYgKEMxLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDEpKSB7CisgICAgc3dpdGNoKHByZWQpIHsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX0VROgorICAgICAgaWYgKGlzYTxDb25zdGFudEludD4oQzIpKQorICAgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRYb3IoQzEsIENvbnN0YW50RXhwcjo6Z2V0Tm90KEMyKSk7CisgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRYb3IoQ29uc3RhbnRFeHByOjpnZXROb3QoQzEpLCBDMik7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9ORToKKyAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFhvcihDMSwgQzIpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoaXNhPENvbnN0YW50SW50PihDMSkgJiYgaXNhPENvbnN0YW50SW50PihDMikpIHsKKyAgICBBUEludCBWMSA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEMxKS0+Z2V0VmFsdWUoKTsKKyAgICBBUEludCBWMiA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEMyKS0+Z2V0VmFsdWUoKTsKKyAgICBzd2l0Y2ggKHByZWQpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIElDbXAgUHJlZGljYXRlIik7IHJldHVybiAwOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6ICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgVjEgPT0gVjIpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6ICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgVjEgIT0gVjIpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgVjEuc2x0KFYyKSk7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6IHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBWMS5zZ3QoVjIpKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRTogcmV0dXJuIENvbnN0YW50SW50OjpnZXQoUmVzdWx0VHksIFYxLnNsZShWMikpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOiByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgVjEuc2dlKFYyKSk7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6IHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBWMS51bHQoVjIpKTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDogcmV0dXJuIENvbnN0YW50SW50OjpnZXQoUmVzdWx0VHksIFYxLnVndChWMikpOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxFOiByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgVjEudWxlKFYyKSk7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6IHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBWMS51Z2UoVjIpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaXNhPENvbnN0YW50RlA+KEMxKSAmJiBpc2E8Q29uc3RhbnRGUD4oQzIpKSB7CisgICAgQVBGbG9hdCBDMVYgPSBjYXN0PENvbnN0YW50RlA+KEMxKS0+Z2V0VmFsdWVBUEYoKTsKKyAgICBBUEZsb2F0IEMyViA9IGNhc3Q8Q29uc3RhbnRGUD4oQzIpLT5nZXRWYWx1ZUFQRigpOworICAgIEFQRmxvYXQ6OmNtcFJlc3VsdCBSID0gQzFWLmNvbXBhcmUoQzJWKTsKKyAgICBzd2l0Y2ggKHByZWQpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIEZDbXAgUHJlZGljYXRlIik7IHJldHVybiAwOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfRkFMU0U6IHJldHVybiBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFJlc3VsdFR5KTsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1RSVUU6ICByZXR1cm4gQ29uc3RhbnQ6OmdldEFsbE9uZXNWYWx1ZShSZXN1bHRUeSk7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTk86CisgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgUj09QVBGbG9hdDo6Y21wVW5vcmRlcmVkKTsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09SRDoKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBSIT1BUEZsb2F0OjpjbXBVbm9yZGVyZWQpOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUVROgorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoUmVzdWx0VHksIFI9PUFQRmxvYXQ6OmNtcFVub3JkZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFI9PUFQRmxvYXQ6OmNtcEVxdWFsKTsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09FUTogICAKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBSPT1BUEZsb2F0OjpjbXBFcXVhbCk7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTkU6CisgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgUiE9QVBGbG9hdDo6Y21wRXF1YWwpOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT05FOiAgIAorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoUmVzdWx0VHksIFI9PUFQRmxvYXQ6OmNtcExlc3NUaGFuIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUj09QVBGbG9hdDo6Y21wR3JlYXRlclRoYW4pOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxUOiAKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBSPT1BUEZsb2F0OjpjbXBVbm9yZGVyZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSPT1BUEZsb2F0OjpjbXBMZXNzVGhhbik7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTFQ6ICAgCisgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgUj09QVBGbG9hdDo6Y21wTGVzc1RoYW4pOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdUOgorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoUmVzdWx0VHksIFI9PUFQRmxvYXQ6OmNtcFVub3JkZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFI9PUFQRmxvYXQ6OmNtcEdyZWF0ZXJUaGFuKTsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09HVDoKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBSPT1BUEZsb2F0OjpjbXBHcmVhdGVyVGhhbik7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9VTEU6CisgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgUiE9QVBGbG9hdDo6Y21wR3JlYXRlclRoYW4pOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xFOiAKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBSPT1BUEZsb2F0OjpjbXBMZXNzVGhhbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFI9PUFQRmxvYXQ6OmNtcEVxdWFsKTsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VHRToKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFJlc3VsdFR5LCBSIT1BUEZsb2F0OjpjbXBMZXNzVGhhbik7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PR0U6IAorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoUmVzdWx0VHksIFI9PUFQRmxvYXQ6OmNtcEdyZWF0ZXJUaGFuIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUj09QVBGbG9hdDo6Y21wRXF1YWwpOworICAgIH0KKyAgfSBlbHNlIGlmIChDMS0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDE2PiBDMUVsdHMsIEMyRWx0czsKKyAgICBDMS0+Z2V0VmVjdG9yRWxlbWVudHMoQzFFbHRzKTsKKyAgICBDMi0+Z2V0VmVjdG9yRWxlbWVudHMoQzJFbHRzKTsKKyAgICBpZiAoQzFFbHRzLmVtcHR5KCkgfHwgQzJFbHRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIElmIHdlIGNhbiBjb25zdGFudCBmb2xkIHRoZSBjb21wYXJpc29uIG9mIGVhY2ggZWxlbWVudCwgY29uc3RhbnQgZm9sZAorICAgIC8vIHRoZSB3aG9sZSB2ZWN0b3IgY29tcGFyaXNvbi4KKyAgICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDQ+IFJlc0VsdHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEMxRWx0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAvLyBDb21wYXJlIHRoZSBlbGVtZW50cywgcHJvZHVjaW5nIGFuIGkxIHJlc3VsdCBvciBjb25zdGFudCBleHByLgorICAgICAgUmVzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRDb21wYXJlKHByZWQsIEMxRWx0c1tpXSwgQzJFbHRzW2ldKSk7CisgICAgfQorICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KCZSZXNFbHRzWzBdLCBSZXNFbHRzLnNpemUoKSk7CisgIH0KKworICBpZiAoQzEtPmdldFR5cGUoKS0+aXNGbG9hdGluZ1BvaW50VHkoKSkgeworICAgIGludCBSZXN1bHQgPSAtMTsgIC8vIC0xID0gdW5rbm93biwgMCA9IGtub3duIGZhbHNlLCAxID0ga25vd24gdHJ1ZS4KKyAgICBzd2l0Y2ggKGV2YWx1YXRlRkNtcFJlbGF0aW9uKEMxLCBDMikpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHJlbGF0aW9uISIpOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5POgorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT1JEOgorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUVROgorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVU5FOgorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxUOgorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdUOgorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxFOgorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdFOgorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfVFJVRToKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX0ZBTFNFOgorICAgIGNhc2UgRkNtcEluc3Q6OkJBRF9GQ01QX1BSRURJQ0FURToKKyAgICAgIGJyZWFrOyAvLyBDb3VsZG4ndCBkZXRlcm1pbmUgYW55dGhpbmcgYWJvdXQgdGhlc2UgY29uc3RhbnRzLgorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0VROiAvLyBXZSBrbm93IHRoYXQgQzEgPT0gQzIKKyAgICAgIFJlc3VsdCA9IChwcmVkID09IEZDbXBJbnN0OjpGQ01QX1VFUSB8fCBwcmVkID09IEZDbXBJbnN0OjpGQ01QX09FUSB8fAorICAgICAgICAgICAgICAgIHByZWQgPT0gRkNtcEluc3Q6OkZDTVBfVUxFIHx8IHByZWQgPT0gRkNtcEluc3Q6OkZDTVBfT0xFIHx8CisgICAgICAgICAgICAgICAgcHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9VR0UgfHwgcHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9PR0UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PTFQ6IC8vIFdlIGtub3cgdGhhdCBDMSA8IEMyCisgICAgICBSZXN1bHQgPSAocHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9VTkUgfHwgcHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9PTkUgfHwKKyAgICAgICAgICAgICAgICBwcmVkID09IEZDbXBJbnN0OjpGQ01QX1VMVCB8fCBwcmVkID09IEZDbXBJbnN0OjpGQ01QX09MVCB8fAorICAgICAgICAgICAgICAgIHByZWQgPT0gRkNtcEluc3Q6OkZDTVBfVUxFIHx8IHByZWQgPT0gRkNtcEluc3Q6OkZDTVBfT0xFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0dUOiAvLyBXZSBrbm93IHRoYXQgQzEgPiBDMgorICAgICAgUmVzdWx0ID0gKHByZWQgPT0gRkNtcEluc3Q6OkZDTVBfVU5FIHx8IHByZWQgPT0gRkNtcEluc3Q6OkZDTVBfT05FIHx8CisgICAgICAgICAgICAgICAgcHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9VR1QgfHwgcHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9PR1QgfHwKKyAgICAgICAgICAgICAgICBwcmVkID09IEZDbXBJbnN0OjpGQ01QX1VHRSB8fCBwcmVkID09IEZDbXBJbnN0OjpGQ01QX09HRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX09MRTogLy8gV2Uga25vdyB0aGF0IEMxIDw9IEMyCisgICAgICAvLyBXZSBjYW4gb25seSBwYXJ0aWFsbHkgZGVjaWRlIHRoaXMgcmVsYXRpb24uCisgICAgICBpZiAocHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9VR1QgfHwgcHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9PR1QpIAorICAgICAgICBSZXN1bHQgPSAwOworICAgICAgZWxzZSBpZiAocHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9VTFQgfHwgcHJlZCA9PSBGQ21wSW5zdDo6RkNNUF9PTFQpIAorICAgICAgICBSZXN1bHQgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGQ21wSW5zdDo6RkNNUF9PR0U6IC8vIFdlIGtub3duIHRoYXQgQzEgPj0gQzIKKyAgICAgIC8vIFdlIGNhbiBvbmx5IHBhcnRpYWxseSBkZWNpZGUgdGhpcyByZWxhdGlvbi4KKyAgICAgIGlmIChwcmVkID09IEZDbXBJbnN0OjpGQ01QX1VMVCB8fCBwcmVkID09IEZDbXBJbnN0OjpGQ01QX09MVCkgCisgICAgICAgIFJlc3VsdCA9IDA7CisgICAgICBlbHNlIGlmIChwcmVkID09IEZDbXBJbnN0OjpGQ01QX1VHVCB8fCBwcmVkID09IEZDbXBJbnN0OjpGQ01QX09HVCkgCisgICAgICAgIFJlc3VsdCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiAvLyBXZSBrbm93IHRoYXQgQzEgIT0gQzIKKyAgICAgIC8vIFdlIGNhbiBvbmx5IHBhcnRpYWxseSBkZWNpZGUgdGhpcyByZWxhdGlvbi4KKyAgICAgIGlmIChwcmVkID09IEZDbXBJbnN0OjpGQ01QX09FUSB8fCBwcmVkID09IEZDbXBJbnN0OjpGQ01QX1VFUSkgCisgICAgICAgIFJlc3VsdCA9IDA7CisgICAgICBlbHNlIGlmIChwcmVkID09IEZDbXBJbnN0OjpGQ01QX09ORSB8fCBwcmVkID09IEZDbXBJbnN0OjpGQ01QX1VORSkgCisgICAgICAgIFJlc3VsdCA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBldmFsdWF0ZWQgdGhlIHJlc3VsdCwgcmV0dXJuIGl0IG5vdy4KKyAgICBpZiAoUmVzdWx0ICE9IC0xKQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoUmVzdWx0VHksIFJlc3VsdCk7CisKKyAgfSBlbHNlIHsKKyAgICAvLyBFdmFsdWF0ZSB0aGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgdHdvIGNvbnN0YW50cywgcGVyIHRoZSBwcmVkaWNhdGUuCisgICAgaW50IFJlc3VsdCA9IC0xOyAgLy8gLTEgPSB1bmtub3duLCAwID0ga25vd24gZmFsc2UsIDEgPSBrbm93biB0cnVlLgorICAgIHN3aXRjaCAoZXZhbHVhdGVJQ21wUmVsYXRpb24oQzEsIEMyLCBDbXBJbnN0Ojppc1NpZ25lZChwcmVkKSkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHJlbGF0aW9uYWwhIik7CisgICAgY2FzZSBJQ21wSW5zdDo6QkFEX0lDTVBfUFJFRElDQVRFOgorICAgICAgYnJlYWs7ICAvLyBDb3VsZG4ndCBkZXRlcm1pbmUgYW55dGhpbmcgYWJvdXQgdGhlc2UgY29uc3RhbnRzLgorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfRVE6ICAgLy8gV2Uga25vdyB0aGUgY29uc3RhbnRzIGFyZSBlcXVhbCEKKyAgICAgIC8vIElmIHdlIGtub3cgdGhlIGNvbnN0YW50cyBhcmUgZXF1YWwsIHdlIGNhbiBkZWNpZGUgdGhlIHJlc3VsdCBvZiB0aGlzCisgICAgICAvLyBjb21wdXRhdGlvbiBwcmVjaXNlbHkuCisgICAgICBSZXN1bHQgPSBJQ21wSW5zdDo6aXNUcnVlV2hlbkVxdWFsKChJQ21wSW5zdDo6UHJlZGljYXRlKXByZWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTFQ6CisgICAgICBzd2l0Y2ggKHByZWQpIHsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOiBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRToKKyAgICAgICAgUmVzdWx0ID0gMTsgYnJlYWs7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDogY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogY2FzZSBJQ21wSW5zdDo6SUNNUF9VR0U6CisgICAgICAgIFJlc3VsdCA9IDA7IGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTFQ6CisgICAgICBzd2l0Y2ggKHByZWQpIHsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0xUOiBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRToKKyAgICAgICAgUmVzdWx0ID0gMTsgYnJlYWs7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHVDogY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogY2FzZSBJQ21wSW5zdDo6SUNNUF9TR0U6CisgICAgICAgIFJlc3VsdCA9IDA7IGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6CisgICAgICBzd2l0Y2ggKHByZWQpIHsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdUOiBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiBjYXNlIElDbXBJbnN0OjpJQ01QX1VHRToKKyAgICAgICAgUmVzdWx0ID0gMTsgYnJlYWs7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDogY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogY2FzZSBJQ21wSW5zdDo6SUNNUF9VTEU6CisgICAgICAgIFJlc3VsdCA9IDA7IGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR1Q6CisgICAgICBzd2l0Y2ggKHByZWQpIHsKKyAgICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiBjYXNlIElDbXBJbnN0OjpJQ01QX05FOiBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRToKKyAgICAgICAgUmVzdWx0ID0gMTsgYnJlYWs7CisgICAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6CisgICAgICAgIFJlc3VsdCA9IDA7IGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9VTEU6CisgICAgICBpZiAocHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9VR1QpIFJlc3VsdCA9IDA7CisgICAgICBpZiAocHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9VTFQgfHwgcHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9VTEUpIFJlc3VsdCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMRToKKyAgICAgIGlmIChwcmVkID09IElDbXBJbnN0OjpJQ01QX1NHVCkgUmVzdWx0ID0gMDsKKyAgICAgIGlmIChwcmVkID09IElDbXBJbnN0OjpJQ01QX1NMVCB8fCBwcmVkID09IElDbXBJbnN0OjpJQ01QX1NMRSkgUmVzdWx0ID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOgorICAgICAgaWYgKHByZWQgPT0gSUNtcEluc3Q6OklDTVBfVUxUKSBSZXN1bHQgPSAwOworICAgICAgaWYgKHByZWQgPT0gSUNtcEluc3Q6OklDTVBfVUdUIHx8IHByZWQgPT0gSUNtcEluc3Q6OklDTVBfVUdFKSBSZXN1bHQgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TR0U6CisgICAgICBpZiAocHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TTFQpIFJlc3VsdCA9IDA7CisgICAgICBpZiAocHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TR1QgfHwgcHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9TR0UpIFJlc3VsdCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX05FOgorICAgICAgaWYgKHByZWQgPT0gSUNtcEluc3Q6OklDTVBfRVEpIFJlc3VsdCA9IDA7CisgICAgICBpZiAocHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9ORSkgUmVzdWx0ID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIElmIHdlIGV2YWx1YXRlZCB0aGUgcmVzdWx0LCByZXR1cm4gaXQgbm93LgorICAgIGlmIChSZXN1bHQgIT0gLTEpCisgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChSZXN1bHRUeSwgUmVzdWx0KTsKKworICAgIC8vIElmIHRoZSByaWdodCBoYW5kIHNpZGUgaXMgYSBiaXRjYXN0LCB0cnkgdXNpbmcgaXRzIGludmVyc2UgdG8gc2ltcGxpZnkKKyAgICAvLyBpdCBieSBtb3ZpbmcgaXQgdG8gdGhlIGxlZnQgaGFuZCBzaWRlLiAgV2UgY2FuJ3QgZG8gdGhpcyBpZiBpdCB3b3VsZCB0dXJuCisgICAgLy8gYSB2ZWN0b3IgY29tcGFyZSBpbnRvIGEgc2NhbGFyIGNvbXBhcmUgb3IgdmlzYSB2ZXJzYS4KKyAgICBpZiAoQ29uc3RhbnRFeHByICpDRTIgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KEMyKSkgeworICAgICAgQ29uc3RhbnQgKkNFMk9wMCA9IENFMi0+Z2V0T3BlcmFuZCgwKTsKKyAgICAgIGlmIChDRTItPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpCaXRDYXN0ICYmCisgICAgICAgICAgQ0UyLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSA9PSBDRTJPcDAtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICAgIENvbnN0YW50ICpJbnZlcnNlID0gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KEMxLCBDRTJPcDAtPmdldFR5cGUoKSk7CisgICAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldElDbXAocHJlZCwgSW52ZXJzZSwgQ0UyT3AwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgbGVmdCBoYW5kIHNpZGUgaXMgYW4gZXh0ZW5zaW9uLCB0cnkgZWxpbWluYXRpbmcgaXQuCisgICAgaWYgKENvbnN0YW50RXhwciAqQ0UxID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDMSkpIHsKKyAgICAgIGlmICgoQ0UxLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U0V4dCAmJiBJQ21wSW5zdDo6aXNTaWduZWQocHJlZCkpIHx8CisgICAgICAgICAgKENFMS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlpFeHQgJiYgIUlDbXBJbnN0Ojppc1NpZ25lZChwcmVkKSkpeworICAgICAgICBDb25zdGFudCAqQ0UxT3AwID0gQ0UxLT5nZXRPcGVyYW5kKDApOworICAgICAgICBDb25zdGFudCAqQ0UxSW52ZXJzZSA9IENvbnN0YW50RXhwcjo6Z2V0VHJ1bmMoQ0UxLCBDRTFPcDAtPmdldFR5cGUoKSk7CisgICAgICAgIGlmIChDRTFJbnZlcnNlID09IENFMU9wMCkgeworICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgd2UgY2FuIHNhZmVseSB0cnVuY2F0ZSB0aGUgcmlnaHQgaGFuZCBzaWRlLgorICAgICAgICAgIENvbnN0YW50ICpDMkludmVyc2UgPSBDb25zdGFudEV4cHI6OmdldFRydW5jKEMyLCBDRTFPcDAtPmdldFR5cGUoKSk7CisgICAgICAgICAgaWYgKENvbnN0YW50RXhwcjo6Z2V0WkV4dChDMkludmVyc2UsIEMyLT5nZXRUeXBlKCkpID09IEMyKSB7CisgICAgICAgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRJQ21wKHByZWQsIENFMUludmVyc2UsIEMySW52ZXJzZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCghaXNhPENvbnN0YW50RXhwcj4oQzEpICYmIGlzYTxDb25zdGFudEV4cHI+KEMyKSkgfHwKKyAgICAgICAgKEMxLT5pc051bGxWYWx1ZSgpICYmICFDMi0+aXNOdWxsVmFsdWUoKSkpIHsKKyAgICAgIC8vIElmIEMyIGlzIGEgY29uc3RhbnQgZXhwciBhbmQgQzEgaXNuJ3QsIGZsaXAgdGhlbSBhcm91bmQgYW5kIGZvbGQgdGhlCisgICAgICAvLyBvdGhlciB3YXkgaWYgcG9zc2libGUuCisgICAgICAvLyBBbHNvLCBpZiBDMSBpcyBudWxsIGFuZCBDMiBpc24ndCwgZmxpcCB0aGVtIGFyb3VuZC4KKyAgICAgIHByZWQgPSBJQ21wSW5zdDo6Z2V0U3dhcHBlZFByZWRpY2F0ZSgoSUNtcEluc3Q6OlByZWRpY2F0ZSlwcmVkKTsKKyAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldElDbXAocHJlZCwgQzIsIEMxKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBpc0luQm91bmRzSW5kaWNlcyAtIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gc2VxdWVuY2Ugb2YgKm5vcm1hbGl6ZWQqIGluZGljZXMKKy8vLyBpcyAiaW5ib3VuZHMiLgorc3RhdGljIGJvb2wgaXNJbkJvdW5kc0luZGljZXMoQ29uc3RhbnQgKmNvbnN0ICpJZHhzLCBzaXplX3QgTnVtSWR4KSB7CisgIC8vIE5vIGluZGljZXMgbWVhbnMgbm90aGluZyB0aGF0IGNvdWxkIGJlIG91dCBvZiBib3VuZHMuCisgIGlmIChOdW1JZHggPT0gMCkgcmV0dXJuIHRydWU7CisKKyAgLy8gSWYgdGhlIGZpcnN0IGluZGV4IGlzIHplcm8sIGl0J3MgaW4gYm91bmRzLgorICBpZiAoSWR4c1swXS0+aXNOdWxsVmFsdWUoKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gSWYgdGhlIGZpcnN0IGluZGV4IGlzIG9uZSBhbmQgYWxsIHRoZSByZXN0IGFyZSB6ZXJvLCBpdCdzIGluIGJvdW5kcywKKyAgLy8gYnkgdGhlIG9uZS1wYXN0LXRoZS1lbmQgcnVsZS4KKyAgaWYgKCFjYXN0PENvbnN0YW50SW50PihJZHhzWzBdKS0+aXNPbmUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBOdW1JZHg7IGkgIT0gZTsgKytpKQorICAgIGlmICghSWR4c1tpXS0+aXNOdWxsVmFsdWUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0NvbnN0YW50ICpsbHZtOjpDb25zdGFudEZvbGRHZXRFbGVtZW50UHRyKENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50KiBjb25zdCAqSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCkgeworICBpZiAoTnVtSWR4ID09IDAgfHwKKyAgICAgIChOdW1JZHggPT0gMSAmJiBJZHhzWzBdLT5pc051bGxWYWx1ZSgpKSkKKyAgICByZXR1cm4gQzsKKworICBpZiAoaXNhPFVuZGVmVmFsdWU+KEMpKSB7CisgICAgY29uc3QgUG9pbnRlclR5cGUgKlB0ciA9IGNhc3Q8UG9pbnRlclR5cGU+KEMtPmdldFR5cGUoKSk7CisgICAgY29uc3QgVHlwZSAqVHkgPSBHZXRFbGVtZW50UHRySW5zdDo6Z2V0SW5kZXhlZFR5cGUoUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWYWx1ZSAqKilJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWYWx1ZSAqKilJZHhzK051bUlkeCk7CisgICAgYXNzZXJ0KFR5ICE9IDAgJiYgIkludmFsaWQgaW5kaWNlcyBmb3IgR0VQISIpOworICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoUG9pbnRlclR5cGU6OmdldChUeSwgUHRyLT5nZXRBZGRyZXNzU3BhY2UoKSkpOworICB9CisKKyAgQ29uc3RhbnQgKklkeDAgPSBJZHhzWzBdOworICBpZiAoQy0+aXNOdWxsVmFsdWUoKSkgeworICAgIGJvb2wgaXNOdWxsID0gdHJ1ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtSWR4OyBpICE9IGU7ICsraSkKKyAgICAgIGlmICghSWR4c1tpXS0+aXNOdWxsVmFsdWUoKSkgeworICAgICAgICBpc051bGwgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgaWYgKGlzTnVsbCkgeworICAgICAgY29uc3QgUG9pbnRlclR5cGUgKlB0ciA9IGNhc3Q8UG9pbnRlclR5cGU+KEMtPmdldFR5cGUoKSk7CisgICAgICBjb25zdCBUeXBlICpUeSA9IEdldEVsZW1lbnRQdHJJbnN0OjpnZXRJbmRleGVkVHlwZShQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVmFsdWUqKilJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZhbHVlKiopSWR4cytOdW1JZHgpOworICAgICAgYXNzZXJ0KFR5ICE9IDAgJiYgIkludmFsaWQgaW5kaWNlcyBmb3IgR0VQISIpOworICAgICAgcmV0dXJuICBDb25zdGFudFBvaW50ZXJOdWxsOjpnZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclR5cGU6OmdldChUeSxQdHItPmdldEFkZHJlc3NTcGFjZSgpKSk7CisgICAgfQorICB9CisKKyAgaWYgKENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KEMpKSB7CisgICAgLy8gQ29tYmluZSBJbmRpY2VzIC0gSWYgdGhlIHNvdXJjZSBwb2ludGVyIHRvIHRoaXMgZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbgorICAgIC8vIGlzIGEgZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbiwgY29tYmluZSB0aGUgaW5kaWNlcyBvZiB0aGUgdHdvCisgICAgLy8gZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbnMgaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbi4KKyAgICAvLworICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpIHsKKyAgICAgIGNvbnN0IFR5cGUgKkxhc3RUeSA9IDA7CisgICAgICBmb3IgKGdlcF90eXBlX2l0ZXJhdG9yIEkgPSBnZXBfdHlwZV9iZWdpbihDRSksIEUgPSBnZXBfdHlwZV9lbmQoQ0UpOworICAgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgICAgTGFzdFR5ID0gKkk7CisKKyAgICAgIGlmICgoTGFzdFR5ICYmIExhc3RUeS0+aXNBcnJheVR5KCkpIHx8IElkeDAtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8VmFsdWUqLCAxNj4gTmV3SW5kaWNlczsKKyAgICAgICAgTmV3SW5kaWNlcy5yZXNlcnZlKE51bUlkeCArIENFLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IENFLT5nZXROdW1PcGVyYW5kcygpLTE7IGkgIT0gZTsgKytpKQorICAgICAgICAgIE5ld0luZGljZXMucHVzaF9iYWNrKENFLT5nZXRPcGVyYW5kKGkpKTsKKworICAgICAgICAvLyBBZGQgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNvdXJjZSB3aXRoIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgbmV3IEdFUC4KKyAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5IGRpZmZlcmVudCB0eXBlcy4KKyAgICAgICAgQ29uc3RhbnQgKkNvbWJpbmVkID0gQ0UtPmdldE9wZXJhbmQoQ0UtPmdldE51bU9wZXJhbmRzKCktMSk7CisgICAgICAgIC8vIE90aGVyd2lzZSBpdCBtdXN0IGJlIGFuIGFycmF5LgorICAgICAgICBpZiAoIUlkeDAtPmlzTnVsbFZhbHVlKCkpIHsKKyAgICAgICAgICBjb25zdCBUeXBlICpJZHhUeSA9IENvbWJpbmVkLT5nZXRUeXBlKCk7CisgICAgICAgICAgaWYgKElkeFR5ICE9IElkeDAtPmdldFR5cGUoKSkgeworICAgICAgICAgICAgY29uc3QgVHlwZSAqSW50NjRUeSA9IFR5cGU6OmdldEludDY0VHkoSWR4VHktPmdldENvbnRleHQoKSk7CisgICAgICAgICAgICBDb25zdGFudCAqQzEgPSBDb25zdGFudEV4cHI6OmdldFNFeHRPckJpdENhc3QoSWR4MCwgSW50NjRUeSk7CisgICAgICAgICAgICBDb25zdGFudCAqQzIgPSBDb25zdGFudEV4cHI6OmdldFNFeHRPckJpdENhc3QoQ29tYmluZWQsIEludDY0VHkpOworICAgICAgICAgICAgQ29tYmluZWQgPSBDb25zdGFudEV4cHI6OmdldChJbnN0cnVjdGlvbjo6QWRkLCBDMSwgQzIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDb21iaW5lZCA9CisgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0KEluc3RydWN0aW9uOjpBZGQsIElkeDAsIENvbWJpbmVkKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBOZXdJbmRpY2VzLnB1c2hfYmFjayhDb21iaW5lZCk7CisgICAgICAgIE5ld0luZGljZXMuYXBwZW5kKElkeHMrMSwgSWR4cytOdW1JZHgpOworICAgICAgICByZXR1cm4gKGluQm91bmRzICYmIGNhc3Q8R0VQT3BlcmF0b3I+KENFKS0+aXNJbkJvdW5kcygpKSA/CisgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRJbkJvdW5kc0dldEVsZW1lbnRQdHIoQ0UtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0luZGljZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3SW5kaWNlcy5zaXplKCkpIDoKKyAgICAgICAgICBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoQ0UtPmdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZXdJbmRpY2VzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdJbmRpY2VzLnNpemUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50IGZvbGRpbmcgb2Y6CisgICAgLy8gICAgaW50KiBnZXRlbGVtZW50cHRyIChbMiB4IGludF0qIGJpdGNhc3QgKFszIHggaW50XSogJVggdG8gWzIgeCBpbnRdKiksCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBsb25nIDAsIGxvbmcgMCkKKyAgICAvLyBUbzogaW50KiBnZXRlbGVtZW50cHRyIChbMyB4IGludF0qICVYLCBsb25nIDAsIGxvbmcgMCkKKyAgICAvLworICAgIGlmIChDRS0+aXNDYXN0KCkgJiYgTnVtSWR4ID4gMSAmJiBJZHgwLT5pc051bGxWYWx1ZSgpKSB7CisgICAgICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlNQVCA9CisgICAgICAgICAgZHluX2Nhc3Q8UG9pbnRlclR5cGU+KENFLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpKQorICAgICAgICBpZiAoY29uc3QgQXJyYXlUeXBlICpTQVQgPSBkeW5fY2FzdDxBcnJheVR5cGU+KFNQVC0+Z2V0RWxlbWVudFR5cGUoKSkpCisgICAgICAgICAgaWYgKGNvbnN0IEFycmF5VHlwZSAqQ0FUID0KKyAgICAgICAgZHluX2Nhc3Q8QXJyYXlUeXBlPihjYXN0PFBvaW50ZXJUeXBlPihDLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSkKKyAgICAgICAgICAgIGlmIChDQVQtPmdldEVsZW1lbnRUeXBlKCkgPT0gU0FULT5nZXRFbGVtZW50VHlwZSgpKQorICAgICAgICAgICAgICByZXR1cm4gaW5Cb3VuZHMgPworICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKAorICAgICAgICAgICAgICAgICAgICAgIChDb25zdGFudCopQ0UtPmdldE9wZXJhbmQoMCksIElkeHMsIE51bUlkeCkgOgorICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cigKKyAgICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnQqKUNFLT5nZXRPcGVyYW5kKDApLCBJZHhzLCBOdW1JZHgpOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiBhbnkgYXJyYXkgaW5kaWNlcyBhcmUgbm90IHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZworICAvLyBub3Rpb25hbCBhcnJheSBib3VuZHMuIElmIHNvLCB0cnkgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgY2FuIGJlIGZhY3RvcmVkCisgIC8vIG91dCBpbnRvIHByZWNlZGluZyBkaW1lbnNpb25zLgorICBib29sIFVua25vd24gPSBmYWxzZTsKKyAgU21hbGxWZWN0b3I8Q29uc3RhbnQgKiwgOD4gTmV3SWR4czsKKyAgY29uc3QgVHlwZSAqVHkgPSBDLT5nZXRUeXBlKCk7CisgIGNvbnN0IFR5cGUgKlByZXYgPSAwOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUlkeDsKKyAgICAgICBQcmV2ID0gVHksIFR5ID0gY2FzdDxDb21wb3NpdGVUeXBlPihUeSktPmdldFR5cGVBdEluZGV4KElkeHNbaV0pLCArK2kpIHsKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KElkeHNbaV0pKSB7CisgICAgICBpZiAoY29uc3QgQXJyYXlUeXBlICpBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KFR5KSkKKyAgICAgICAgaWYgKEFUeS0+Z2V0TnVtRWxlbWVudHMoKSA8PSBJTlQ2NF9NQVggJiYKKyAgICAgICAgICAgIEFUeS0+Z2V0TnVtRWxlbWVudHMoKSAhPSAwICYmCisgICAgICAgICAgICBDSS0+Z2V0U0V4dFZhbHVlKCkgPj0gKGludDY0X3QpQVR5LT5nZXROdW1FbGVtZW50cygpKSB7CisgICAgICAgICAgaWYgKGlzYTxTZXF1ZW50aWFsVHlwZT4oUHJldikpIHsKKyAgICAgICAgICAgIC8vIEl0J3Mgb3V0IG9mIHJhbmdlLCBidXQgd2UgY2FuIGZhY3RvciBpdCBpbnRvIHRoZSBwcmlvcgorICAgICAgICAgICAgLy8gZGltZW5zaW9uLgorICAgICAgICAgICAgTmV3SWR4cy5yZXNpemUoTnVtSWR4KTsKKyAgICAgICAgICAgIENvbnN0YW50SW50ICpGYWN0b3IgPSBDb25zdGFudEludDo6Z2V0KENJLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVHktPmdldE51bUVsZW1lbnRzKCkpOworICAgICAgICAgICAgTmV3SWR4c1tpXSA9IENvbnN0YW50RXhwcjo6Z2V0U1JlbShDSSwgRmFjdG9yKTsKKworICAgICAgICAgICAgQ29uc3RhbnQgKlByZXZJZHggPSBJZHhzW2ktMV07CisgICAgICAgICAgICBDb25zdGFudCAqRGl2ID0gQ29uc3RhbnRFeHByOjpnZXRTRGl2KENJLCBGYWN0b3IpOworCisgICAgICAgICAgICAvLyBCZWZvcmUgYWRkaW5nLCBleHRlbmQgYm90aCBvcGVyYW5kcyB0byBpNjQgdG8gYXZvaWQKKyAgICAgICAgICAgIC8vIG92ZXJmbG93IHRyb3VibGUuCisgICAgICAgICAgICBpZiAoIVByZXZJZHgtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoNjQpKQorICAgICAgICAgICAgICBQcmV2SWR4ID0gQ29uc3RhbnRFeHByOjpnZXRTRXh0KFByZXZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50NjRUeShEaXYtPmdldENvbnRleHQoKSkpOworICAgICAgICAgICAgaWYgKCFEaXYtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoNjQpKQorICAgICAgICAgICAgICBEaXYgPSBDb25zdGFudEV4cHI6OmdldFNFeHQoRGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50NjRUeShEaXYtPmdldENvbnRleHQoKSkpOworCisgICAgICAgICAgICBOZXdJZHhzW2ktMV0gPSBDb25zdGFudEV4cHI6OmdldEFkZChQcmV2SWR4LCBEaXYpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJdCdzIG91dCBvZiByYW5nZSwgYnV0IHRoZSBwcmlvciBkaW1lbnNpb24gaXMgYSBzdHJ1Y3QKKyAgICAgICAgICAgIC8vIHNvIHdlIGNhbid0IGRvIGFueXRoaW5nIGFib3V0IGl0LgorICAgICAgICAgICAgVW5rbm93biA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIGRvbid0IGtub3cgaWYgaXQncyBpbiByYW5nZSBvciBub3QuCisgICAgICBVbmtub3duID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBJZiB3ZSBkaWQgYW55IGZhY3RvcmluZywgc3RhcnQgb3ZlciB3aXRoIHRoZSBhZGp1c3RlZCBpbmRpY2VzLgorICBpZiAoIU5ld0lkeHMuZW1wdHkoKSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtSWR4OyArK2kpCisgICAgICBpZiAoIU5ld0lkeHNbaV0pIE5ld0lkeHNbaV0gPSBJZHhzW2ldOworICAgIHJldHVybiBpbkJvdW5kcyA/CisgICAgICBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihDLCBOZXdJZHhzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0lkeHMuc2l6ZSgpKSA6CisgICAgICBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoQywgTmV3SWR4cy5kYXRhKCksIE5ld0lkeHMuc2l6ZSgpKTsKKyAgfQorCisgIC8vIElmIGFsbCBpbmRpY2VzIGFyZSBrbm93biBpbnRlZ2VycyBhbmQgbm9ybWFsaXplZCwgd2UgY2FuIGRvIGEgc2ltcGxlCisgIC8vIGNoZWNrIGZvciB0aGUgImluYm91bmRzIiBwcm9wZXJ0eS4KKyAgaWYgKCFVbmtub3duICYmICFpbkJvdW5kcyAmJgorICAgICAgaXNhPEdsb2JhbFZhcmlhYmxlPihDKSAmJiBpc0luQm91bmRzSW5kaWNlcyhJZHhzLCBOdW1JZHgpKQorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihDLCBJZHhzLCBOdW1JZHgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9Db25zdGFudEZvbGQuaCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvQ29uc3RhbnRGb2xkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkYmJkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvQ29uc3RhbnRGb2xkLmgKQEAgLTAsMCArMSw1NCBAQAorLy89PT0tLSBDb25zdGFudEZvbGRpbmcuaCAtIEludGVybmFsIENvbnN0YW50IEZvbGRpbmcgSW50ZXJmYWNlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgKGludGVybmFsKSBjb25zdGFudCBmb2xkaW5nIGludGVyZmFjZXMgZm9yIExMVk0uICBUaGVzZQorLy8gaW50ZXJmYWNlcyBhcmUgdXNlZCBieSB0aGUgQ29uc3RhbnRFeHByOjpnZXQqIG1ldGhvZHMgdG8gYXV0b21hdGljYWxseSBmb2xkCisvLyBjb25zdGFudHMgd2hlbiBwb3NzaWJsZS4KKy8vCisvLyBUaGVzZSBvcGVyYXRvcnMgbWF5IHJldHVybiBhIG51bGwgb2JqZWN0IGlmIHRoZXkgZG9uJ3Qga25vdyBob3cgdG8gcGVyZm9ybQorLy8gdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gb24gdGhlIHNwZWNpZmllZCBjb25zdGFudCB0eXBlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENPTlNUQU5URk9MRElOR19ICisjZGVmaW5lIENPTlNUQU5URk9MRElOR19ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgVmFsdWU7CisgIGNsYXNzIENvbnN0YW50OworICBjbGFzcyBUeXBlOworCisgIC8vIENvbnN0YW50IGZvbGQgdmFyaW91cyB0eXBlcyBvZiBpbnN0cnVjdGlvbi4uLgorICBDb25zdGFudCAqQ29uc3RhbnRGb2xkQ2FzdEluc3RydWN0aW9uKAorICAgIHVuc2lnbmVkIG9wY29kZSwgICAgIC8vLzwgVGhlIG9wY29kZSBvZiB0aGUgY2FzdAorICAgIENvbnN0YW50ICpWLCAgICAgICAgIC8vLzwgVGhlIHNvdXJjZSBjb25zdGFudAorICAgIGNvbnN0IFR5cGUgKkRlc3RUeSAgIC8vLzwgVGhlIGRlc3RpbmF0aW9uIHR5cGUKKyAgKTsKKyAgQ29uc3RhbnQgKkNvbnN0YW50Rm9sZFNlbGVjdEluc3RydWN0aW9uKENvbnN0YW50ICpDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIpOworICBDb25zdGFudCAqQ29uc3RhbnRGb2xkRXh0cmFjdEVsZW1lbnRJbnN0cnVjdGlvbihDb25zdGFudCAqVmFsLCBDb25zdGFudCAqSWR4KTsKKyAgQ29uc3RhbnQgKkNvbnN0YW50Rm9sZEluc2VydEVsZW1lbnRJbnN0cnVjdGlvbihDb25zdGFudCAqVmFsLCBDb25zdGFudCAqRWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpOworICBDb25zdGFudCAqQ29uc3RhbnRGb2xkU2h1ZmZsZVZlY3Rvckluc3RydWN0aW9uKENvbnN0YW50ICpWMSwgQ29uc3RhbnQgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpNYXNrKTsKKyAgQ29uc3RhbnQgKkNvbnN0YW50Rm9sZEV4dHJhY3RWYWx1ZUluc3RydWN0aW9uKENvbnN0YW50ICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCk7CisgIENvbnN0YW50ICpDb25zdGFudEZvbGRJbnNlcnRWYWx1ZUluc3RydWN0aW9uKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpOworICBDb25zdGFudCAqQ29uc3RhbnRGb2xkQmluYXJ5SW5zdHJ1Y3Rpb24odW5zaWduZWQgT3Bjb2RlLCBDb25zdGFudCAqVjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqVjIpOworICBDb25zdGFudCAqQ29uc3RhbnRGb2xkQ29tcGFyZUluc3RydWN0aW9uKHVuc2lnbmVkIHNob3J0IHByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBDb25zdGFudCAqQ29uc3RhbnRGb2xkR2V0RWxlbWVudFB0cihDb25zdGFudCAqQywgYm9vbCBpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQqIGNvbnN0ICpJZHhzLCB1bnNpZ25lZCBOdW1JZHgpOworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0NvbnN0YW50cy5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0NvbnN0YW50cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmYTkyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvQ29uc3RhbnRzLmNwcApAQCAtMCwwICsxLDIyODggQEAKKy8vPT09LS0gQ29uc3RhbnRzLmNwcCAtIEltcGxlbWVudCBDb25zdGFudCBub2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIENvbnN0YW50KiBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgIkxMVk1Db250ZXh0SW1wbC5oIgorI2luY2x1ZGUgIkNvbnN0YW50Rm9sZC5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL09wZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtYXA+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhICcwJyBjb25zdGFudCBvZiBhcmJpdHJhcnkgdHlwZS4uLgorc3RhdGljIGNvbnN0IHVpbnQ2NF90IHplcm9bMl0gPSB7MCwgMH07CitDb25zdGFudCAqQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShjb25zdCBUeXBlICpUeSkgeworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOgorICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFR5LCAwKTsKKyAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6CisgICAgcmV0dXJuIENvbnN0YW50RlA6OmdldChUeS0+Z2V0Q29udGV4dCgpLCBBUEZsb2F0KEFQSW50KDMyLCAwKSkpOworICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6CisgICAgcmV0dXJuIENvbnN0YW50RlA6OmdldChUeS0+Z2V0Q29udGV4dCgpLCBBUEZsb2F0KEFQSW50KDY0LCAwKSkpOworICBjYXNlIFR5cGU6Olg4Nl9GUDgwVHlJRDoKKyAgICByZXR1cm4gQ29uc3RhbnRGUDo6Z2V0KFR5LT5nZXRDb250ZXh0KCksIEFQRmxvYXQoQVBJbnQoODAsIDIsIHplcm8pKSk7CisgIGNhc2UgVHlwZTo6RlAxMjhUeUlEOgorICAgIHJldHVybiBDb25zdGFudEZQOjpnZXQoVHktPmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQRmxvYXQoQVBJbnQoMTI4LCAyLCB6ZXJvKSwgdHJ1ZSkpOworICBjYXNlIFR5cGU6OlBQQ19GUDEyOFR5SUQ6CisgICAgcmV0dXJuIENvbnN0YW50RlA6OmdldChUeS0+Z2V0Q29udGV4dCgpLCBBUEZsb2F0KEFQSW50KDEyOCwgMiwgemVybykpKTsKKyAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICByZXR1cm4gQ29uc3RhbnRQb2ludGVyTnVsbDo6Z2V0KGNhc3Q8UG9pbnRlclR5cGU+KFR5KSk7CisgIGNhc2UgVHlwZTo6U3RydWN0VHlJRDoKKyAgY2FzZSBUeXBlOjpVbmlvblR5SUQ6CisgIGNhc2UgVHlwZTo6QXJyYXlUeUlEOgorICBjYXNlIFR5cGU6OlZlY3RvclR5SUQ6CisgICAgcmV0dXJuIENvbnN0YW50QWdncmVnYXRlWmVybzo6Z2V0KFR5KTsKKyAgZGVmYXVsdDoKKyAgICAvLyBGdW5jdGlvbiwgTGFiZWwsIG9yIE9wYXF1ZSB0eXBlPworICAgIGFzc2VydCghIkNhbm5vdCBjcmVhdGUgYSBudWxsIGNvbnN0YW50IG9mIHRoYXQgdHlwZSEiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitDb25zdGFudCogQ29uc3RhbnQ6OmdldEludGVnZXJWYWx1ZShjb25zdCBUeXBlICpUeSwgY29uc3QgQVBJbnQgJlYpIHsKKyAgY29uc3QgVHlwZSAqU2NhbGFyVHkgPSBUeS0+Z2V0U2NhbGFyVHlwZSgpOworCisgIC8vIENyZWF0ZSB0aGUgYmFzZSBpbnRlZ2VyIGNvbnN0YW50LgorICBDb25zdGFudCAqQyA9IENvbnN0YW50SW50OjpnZXQoVHktPmdldENvbnRleHQoKSwgVik7CisKKyAgLy8gQ29udmVydCBhbiBpbnRlZ2VyIHRvIGEgcG9pbnRlciwgaWYgbmVjZXNzYXJ5LgorICBpZiAoY29uc3QgUG9pbnRlclR5cGUgKlBUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihTY2FsYXJUeSkpCisgICAgQyA9IENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoQywgUFR5KTsKKworICAvLyBCcm9hZGNhc3QgYSBzY2FsYXIgdG8gYSB2ZWN0b3IsIGlmIG5lY2Vzc2FyeS4KKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KFR5KSkKKyAgICBDID0gQ29uc3RhbnRWZWN0b3I6OmdldChzdGQ6OnZlY3RvcjxDb25zdGFudCAqPihWVHktPmdldE51bUVsZW1lbnRzKCksIEMpKTsKKworICByZXR1cm4gQzsKK30KKworQ29uc3RhbnQqIENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoY29uc3QgVHlwZSAqVHkpIHsKKyAgaWYgKGNvbnN0IEludGVnZXJUeXBlICpJVHkgPSBkeW5fY2FzdDxJbnRlZ2VyVHlwZT4oVHkpKQorICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KFR5LT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShJVHktPmdldEJpdFdpZHRoKCkpKTsKKyAgCisgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gRWx0czsKKyAgY29uc3QgVmVjdG9yVHlwZSAqVlR5ID0gY2FzdDxWZWN0b3JUeXBlPihUeSk7CisgIEVsdHMucmVzaXplKFZUeS0+Z2V0TnVtRWxlbWVudHMoKSwgZ2V0QWxsT25lc1ZhbHVlKFZUeS0+Z2V0RWxlbWVudFR5cGUoKSkpOworICBhc3NlcnQoRWx0c1swXSAmJiAiTm90IGEgdmVjdG9yIGludGVnZXIgdHlwZSEiKTsKKyAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRWZWN0b3I+KENvbnN0YW50VmVjdG9yOjpnZXQoRWx0cykpOworfQorCit2b2lkIENvbnN0YW50OjpkZXN0cm95Q29uc3RhbnRJbXBsKCkgeworICAvLyBXaGVuIGEgQ29uc3RhbnQgaXMgZGVzdHJveWVkLCB0aGVyZSBtYXkgYmUgbGluZ2VyaW5nCisgIC8vIHJlZmVyZW5jZXMgdG8gdGhlIGNvbnN0YW50IGJ5IG90aGVyIGNvbnN0YW50cyBpbiB0aGUgY29uc3RhbnQgcG9vbC4gIFRoZXNlCisgIC8vIGNvbnN0YW50cyBhcmUgaW1wbGljaXRseSBkZXBlbmRlbnQgb24gdGhlIG1vZHVsZSB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQsCisgIC8vIGJ1dCB0aGV5IGRvbid0IGtub3cgdGhhdC4gIEJlY2F1c2Ugd2Ugb25seSBmaW5kIG91dCB3aGVuIHRoZSBDUFYgaXMKKyAgLy8gZGVsZXRlZCwgd2UgbXVzdCBub3cgbm90aWZ5IGFsbCBvZiBvdXIgdXNlcnMgKHRoYXQgc2hvdWxkIG9ubHkgYmUKKyAgLy8gQ29uc3RhbnRzKSB0aGF0IHRoZXkgYXJlLCBpbiBmYWN0LCBpbnZhbGlkIG5vdyBhbmQgc2hvdWxkIGJlIGRlbGV0ZWQuCisgIC8vCisgIHdoaWxlICghdXNlX2VtcHR5KCkpIHsKKyAgICBWYWx1ZSAqViA9IHVzZV9iYWNrKCk7CisjaWZuZGVmIE5ERUJVRyAgICAgIC8vIE9ubHkgaW4gLWcgbW9kZS4uLgorICAgIGlmICghaXNhPENvbnN0YW50PihWKSkgeworICAgICAgZGJncygpIDw8ICJXaGlsZSBkZWxldGluZzogIiA8PCAqdGhpcworICAgICAgICAgICAgIDw8ICJcblxuVXNlIHN0aWxsIHN0dWNrIGFyb3VuZCBhZnRlciBEZWYgaXMgZGVzdHJveWVkOiAiCisgICAgICAgICAgICAgPDwgKlYgPDwgIlxuXG4iOworICAgIH0KKyNlbmRpZgorICAgIGFzc2VydChpc2E8Q29uc3RhbnQ+KFYpICYmICJSZWZlcmVuY2VzIHJlbWFpbiB0byBDb25zdGFudCBiZWluZyBkZXN0cm95ZWQiKTsKKyAgICBDb25zdGFudCAqQ1YgPSBjYXN0PENvbnN0YW50PihWKTsKKyAgICBDVi0+ZGVzdHJveUNvbnN0YW50KCk7CisKKyAgICAvLyBUaGUgY29uc3RhbnQgc2hvdWxkIHJlbW92ZSBpdHNlbGYgZnJvbSBvdXIgdXNlIGxpc3QuLi4KKyAgICBhc3NlcnQoKHVzZV9lbXB0eSgpIHx8IHVzZV9iYWNrKCkgIT0gVikgJiYgIkNvbnN0YW50IG5vdCByZW1vdmVkISIpOworICB9CisKKyAgLy8gVmFsdWUgaGFzIG5vIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgaXQgaXMgc2FmZSB0byBkZWxldGUgaXQgbm93Li4uCisgIGRlbGV0ZSB0aGlzOworfQorCisvLy8gY2FuVHJhcCAtIFJldHVybiB0cnVlIGlmIGV2YWx1YXRpb24gb2YgdGhpcyBjb25zdGFudCBjb3VsZCB0cmFwLiAgVGhpcyBpcworLy8vIHRydWUgZm9yIHRoaW5ncyBsaWtlIGNvbnN0YW50IGV4cHJlc3Npb25zIHRoYXQgY291bGQgZGl2aWRlIGJ5IHplcm8uCitib29sIENvbnN0YW50OjpjYW5UcmFwKCkgY29uc3QgeworICBhc3NlcnQoZ2V0VHlwZSgpLT5pc0ZpcnN0Q2xhc3NUeXBlKCkgJiYgIkNhbm5vdCBldmFsdWF0ZSBhZ2dyZWdhdGUgdmFscyEiKTsKKyAgLy8gVGhlIG9ubHkgdGhpbmcgdGhhdCBjb3VsZCBwb3NzaWJseSB0cmFwIGFyZSBjb25zdGFudCBleHBycy4KKyAgY29uc3QgQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4odGhpcyk7CisgIGlmICghQ0UpIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIENvbnN0YW50RXhwciB0cmFwcyBpZiBhbnkgb3BlcmFuZHMgY2FuIHRyYXAuIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKENFLT5nZXRPcGVyYW5kKGkpLT5jYW5UcmFwKCkpIAorICAgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gT3RoZXJ3aXNlLCBvbmx5IHNwZWNpZmljIG9wZXJhdGlvbnMgY2FuIHRyYXAuCisgIHN3aXRjaCAoQ0UtPmdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICBjYXNlIEluc3RydWN0aW9uOjpGRGl2OgorICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOgorICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOgorICBjYXNlIEluc3RydWN0aW9uOjpGUmVtOgorICAgIC8vIERpdiBhbmQgcmVtIGNhbiB0cmFwIGlmIHRoZSBSSFMgaXMgbm90IGtub3duIHRvIGJlIG5vbi16ZXJvLgorICAgIGlmICghaXNhPENvbnN0YW50SW50PihDRS0+Z2V0T3BlcmFuZCgxKSkgfHxDRS0+Z2V0T3BlcmFuZCgxKS0+aXNOdWxsVmFsdWUoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLy8gaXNDb25zdGFudFVzZWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RhbnQgaGFzIHVzZXJzIG90aGVyIHRoYW4gY29uc3RhbnQKKy8vLyBleHBycyBhbmQgb3RoZXIgZGFuZ2xpbmcgdGhpbmdzLgorYm9vbCBDb25zdGFudDo6aXNDb25zdGFudFVzZWQoKSBjb25zdCB7CisgIGZvciAoY29uc3RfdXNlX2l0ZXJhdG9yIFVJID0gdXNlX2JlZ2luKCksIEUgPSB1c2VfZW5kKCk7IFVJICE9IEU7ICsrVUkpIHsKKyAgICBjb25zdCBDb25zdGFudCAqVUMgPSBkeW5fY2FzdDxDb25zdGFudD4oKlVJKTsKKyAgICBpZiAoVUMgPT0gMCB8fCBpc2E8R2xvYmFsVmFsdWU+KFVDKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIGlmIChVQy0+aXNDb25zdGFudFVzZWQoKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworCisKKy8vLyBnZXRSZWxvY2F0aW9uSW5mbyAtIFRoaXMgbWV0aG9kIGNsYXNzaWZpZXMgdGhlIGVudHJ5IGFjY29yZGluZyB0bworLy8vIHdoZXRoZXIgb3Igbm90IGl0IG1heSBnZW5lcmF0ZSBhIHJlbG9jYXRpb24gZW50cnkuICBUaGlzIG11c3QgYmUKKy8vLyBjb25zZXJ2YXRpdmUsIHNvIGlmIGl0IG1pZ2h0IGNvZGVnZW4gdG8gYSByZWxvY2F0YWJsZSBlbnRyeSwgaXQgc2hvdWxkIHNheQorLy8vIHNvLiAgVGhlIHJldHVybiB2YWx1ZXMgYXJlOgorLy8vIAorLy8vICBOb1JlbG9jYXRpb246IFRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeSBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGhhdmUgYQorLy8vICAgICByZWxvY2F0aW9uIGFwcGxpZWQgdG8gaXQgKGJlY2F1c2UgaXQgaG9sZHMgYSBzaW1wbGUgY29uc3RhbnQgbGlrZQorLy8vICAgICAnNCcpLgorLy8vICBMb2NhbFJlbG9jYXRpb246IFRoaXMgZW50cnkgaGFzIHJlbG9jYXRpb25zLCBidXQgdGhlIGVudHJpZXMgYXJlCisvLy8gICAgIGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2YWJsZSBieSB0aGUgc3RhdGljIGxpbmtlciwgc28gdGhlIGR5bmFtaWMKKy8vLyAgICAgbGlua2VyIHdpbGwgbmV2ZXIgc2VlIHRoZW0uCisvLy8gIEdsb2JhbFJlbG9jYXRpb25zOiBUaGlzIGVudHJ5IG1heSBoYXZlIGFyYml0cmFyeSByZWxvY2F0aW9ucy4KKy8vLworLy8vIEZJWE1FOiBUaGlzIHJlYWxseSBzaG91bGQgbm90IGJlIGluIFZNQ29yZS4KK0NvbnN0YW50OjpQb3NzaWJsZVJlbG9jYXRpb25zVHkgQ29uc3RhbnQ6OmdldFJlbG9jYXRpb25JbmZvKCkgY29uc3QgeworICBpZiAoY29uc3QgR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KHRoaXMpKSB7CisgICAgaWYgKEdWLT5oYXNMb2NhbExpbmthZ2UoKSB8fCBHVi0+aGFzSGlkZGVuVmlzaWJpbGl0eSgpKQorICAgICAgcmV0dXJuIExvY2FsUmVsb2NhdGlvbjsgIC8vIExvY2FsIHRvIHRoaXMgZmlsZS9saWJyYXJ5LgorICAgIHJldHVybiBHbG9iYWxSZWxvY2F0aW9uczsgICAgLy8gR2xvYmFsIHJlZmVyZW5jZS4KKyAgfQorICAKKyAgaWYgKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEgPSBkeW5fY2FzdDxCbG9ja0FkZHJlc3M+KHRoaXMpKQorICAgIHJldHVybiBCQS0+Z2V0RnVuY3Rpb24oKS0+Z2V0UmVsb2NhdGlvbkluZm8oKTsKKyAgCisgIC8vIFdoaWxlIHJhdyB1c2VzIG9mIGJsb2NrYWRkcmVzcyBuZWVkIHRvIGJlIHJlbG9jYXRlZCwgZGlmZmVyZW5jZXMgYmV0d2VlbgorICAvLyB0d28gb2YgdGhlbSBkb24ndCB3aGVuIHRoZXkgYXJlIGZvciBsYWJlbHMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uICBUaGlzIGlzIGEKKyAgLy8gY29tbW9uIGlkaW9tIHdoZW4gY3JlYXRpbmcgYSB0YWJsZSBmb3IgdGhlIGluZGlyZWN0IGdvdG8gZXh0ZW5zaW9uLCBzbyB3ZQorICAvLyBoYW5kbGUgaXQgZWZmaWNpZW50bHkgaGVyZS4KKyAgaWYgKGNvbnN0IENvbnN0YW50RXhwciAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KHRoaXMpKQorICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN1YikgeworICAgICAgQ29uc3RhbnRFeHByICpMSFMgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KENFLT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIENvbnN0YW50RXhwciAqUkhTID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihDRS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICBpZiAoTEhTICYmIFJIUyAmJgorICAgICAgICAgIExIUy0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlB0clRvSW50ICYmCisgICAgICAgICAgUkhTLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQgJiYKKyAgICAgICAgICBpc2E8QmxvY2tBZGRyZXNzPihMSFMtPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgICAgaXNhPEJsb2NrQWRkcmVzcz4oUkhTLT5nZXRPcGVyYW5kKDApKSAmJgorICAgICAgICAgIGNhc3Q8QmxvY2tBZGRyZXNzPihMSFMtPmdldE9wZXJhbmQoMCkpLT5nZXRGdW5jdGlvbigpID09CisgICAgICAgICAgICBjYXN0PEJsb2NrQWRkcmVzcz4oUkhTLT5nZXRPcGVyYW5kKDApKS0+Z2V0RnVuY3Rpb24oKSkKKyAgICAgICAgcmV0dXJuIE5vUmVsb2NhdGlvbjsKKyAgICB9CisgIAorICBQb3NzaWJsZVJlbG9jYXRpb25zVHkgUmVzdWx0ID0gTm9SZWxvY2F0aW9uOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgUmVzdWx0ID0gc3RkOjptYXgoUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnQ+KGdldE9wZXJhbmQoaSkpLT5nZXRSZWxvY2F0aW9uSW5mbygpKTsKKyAgCisgIHJldHVybiBSZXN1bHQ7Cit9CisKKworLy8vIGdldFZlY3RvckVsZW1lbnRzIC0gVGhpcyBtZXRob2QsIHdoaWNoIGlzIG9ubHkgdmFsaWQgb24gY29uc3RhbnQgb2YgdmVjdG9yCisvLy8gdHlwZSwgcmV0dXJucyB0aGUgZWxlbWVudHMgb2YgdGhlIHZlY3RvciBpbiB0aGUgc3BlY2lmaWVkIHNtYWxsdmVjdG9yLgorLy8vIFRoaXMgaGFuZGxlcyBicmVha2luZyBkb3duIGEgdmVjdG9yIHVuZGVmIGludG8gdW5kZWYgZWxlbWVudHMsIGV0Yy4gIEZvcgorLy8vIGNvbnN0YW50IGV4cHJzIGFuZCBvdGhlciBjYXNlcyB3ZSBjYW4ndCBoYW5kbGUsIHdlIHJldHVybiBhbiBlbXB0eSB2ZWN0b3IuCit2b2lkIENvbnN0YW50OjpnZXRWZWN0b3JFbGVtZW50cyhTbWFsbFZlY3RvckltcGw8Q29uc3RhbnQqPiAmRWx0cykgY29uc3QgeworICBhc3NlcnQoZ2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkgJiYgIk5vdCBhIHZlY3RvciBjb25zdGFudCEiKTsKKyAgCisgIGlmIChjb25zdCBDb25zdGFudFZlY3RvciAqQ1YgPSBkeW5fY2FzdDxDb25zdGFudFZlY3Rvcj4odGhpcykpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ1YtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgRWx0cy5wdXNoX2JhY2soQ1YtPmdldE9wZXJhbmQoaSkpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgY29uc3QgVmVjdG9yVHlwZSAqVlQgPSBjYXN0PFZlY3RvclR5cGU+KGdldFR5cGUoKSk7CisgIGlmIChpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPih0aGlzKSkgeworICAgIEVsdHMuYXNzaWduKFZULT5nZXROdW1FbGVtZW50cygpLCAKKyAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFZULT5nZXRFbGVtZW50VHlwZSgpKSk7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZiAoaXNhPFVuZGVmVmFsdWU+KHRoaXMpKSB7CisgICAgRWx0cy5hc3NpZ24oVlQtPmdldE51bUVsZW1lbnRzKCksIFVuZGVmVmFsdWU6OmdldChWVC0+Z2V0RWxlbWVudFR5cGUoKSkpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gVW5rbm93biB0eXBlLCBtdXN0IGJlIGNvbnN0YW50IGV4cHIgZXRjLgorfQorCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQ29uc3RhbnRJbnQ6OkNvbnN0YW50SW50KGNvbnN0IEludGVnZXJUeXBlICpUeSwgY29uc3QgQVBJbnQmIFYpCisgIDogQ29uc3RhbnQoVHksIENvbnN0YW50SW50VmFsLCAwLCAwKSwgVmFsKFYpIHsKKyAgYXNzZXJ0KFYuZ2V0Qml0V2lkdGgoKSA9PSBUeS0+Z2V0Qml0V2lkdGgoKSAmJiAiSW52YWxpZCBjb25zdGFudCBmb3IgdHlwZSIpOworfQorCitDb25zdGFudEludCogQ29uc3RhbnRJbnQ6OmdldFRydWUoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IENvbnRleHQucEltcGw7CisgIGlmIChwSW1wbC0+VGhlVHJ1ZVZhbCkKKyAgICByZXR1cm4gcEltcGwtPlRoZVRydWVWYWw7CisgIGVsc2UKKyAgICByZXR1cm4gKHBJbXBsLT5UaGVUcnVlVmFsID0KKyAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJbnRlZ2VyVHlwZTo6Z2V0KENvbnRleHQsIDEpLCAxKSk7Cit9CisKK0NvbnN0YW50SW50KiBDb25zdGFudEludDo6Z2V0RmFsc2UoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IENvbnRleHQucEltcGw7CisgIGlmIChwSW1wbC0+VGhlRmFsc2VWYWwpCisgICAgcmV0dXJuIHBJbXBsLT5UaGVGYWxzZVZhbDsKKyAgZWxzZQorICAgIHJldHVybiAocEltcGwtPlRoZUZhbHNlVmFsID0KKyAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJbnRlZ2VyVHlwZTo6Z2V0KENvbnRleHQsIDEpLCAwKSk7Cit9CisKKworLy8gR2V0IGEgQ29uc3RhbnRJbnQgZnJvbSBhbiBBUEludC4gTm90ZSB0aGF0IHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIERlbnNlTWFwIAorLy8gYXMgdGhlIGtleSwgaXMgYSBEZW5zZU1hcEFQSW50S2V5SW5mbzo6S2V5VHkgd2hpY2ggaGFzIHByb3ZpZGVkIHRoZQorLy8gb3BlcmF0b3I9PSBhbmQgb3BlcmF0b3IhPSB0byBlbnN1cmUgdGhhdCB0aGUgRGVuc2VNYXAgZG9lc24ndCBhdHRlbXB0IHRvCisvLyBjb21wYXJlIEFQSW50J3Mgb2YgZGlmZmVyZW50IHdpZHRocywgd2hpY2ggd291bGQgdmlvbGF0ZSBhbiBBUEludCBjbGFzcworLy8gaW52YXJpYW50IHdoaWNoIGdlbmVyYXRlcyBhbiBhc3NlcnRpb24uCitDb25zdGFudEludCAqQ29uc3RhbnRJbnQ6OmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgY29uc3QgQVBJbnQmIFYpIHsKKyAgLy8gR2V0IHRoZSBjb3JyZXNwb25kaW5nIGludGVnZXIgdHlwZSBmb3IgdGhlIGJpdCB3aWR0aCBvZiB0aGUgdmFsdWUuCisgIGNvbnN0IEludGVnZXJUeXBlICpJVHkgPSBJbnRlZ2VyVHlwZTo6Z2V0KENvbnRleHQsIFYuZ2V0Qml0V2lkdGgoKSk7CisgIC8vIGdldCBhbiBleGlzdGluZyB2YWx1ZSBvciB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uCisgIERlbnNlTWFwQVBJbnRLZXlJbmZvOjpLZXlUeSBLZXkoViwgSVR5KTsKKyAgQ29uc3RhbnRJbnQgKiZTbG90ID0gQ29udGV4dC5wSW1wbC0+SW50Q29uc3RhbnRzW0tleV07IAorICBpZiAoIVNsb3QpIFNsb3QgPSBuZXcgQ29uc3RhbnRJbnQoSVR5LCBWKTsKKyAgcmV0dXJuIFNsb3Q7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEludDo6Z2V0KGNvbnN0IFR5cGUqIFR5LCB1aW50NjRfdCBWLCBib29sIGlzU2lnbmVkKSB7CisgIENvbnN0YW50ICpDID0gZ2V0KGNhc3Q8SW50ZWdlclR5cGU+KFR5LT5nZXRTY2FsYXJUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYsIGlzU2lnbmVkKTsKKworICAvLyBGb3IgdmVjdG9ycywgYnJvYWRjYXN0IHRoZSB2YWx1ZS4KKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KFR5KSkKKyAgICByZXR1cm4gQ29uc3RhbnRWZWN0b3I6OmdldCgKKyAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50ICo+KFZUeS0+Z2V0TnVtRWxlbWVudHMoKSwgQykpOworCisgIHJldHVybiBDOworfQorCitDb25zdGFudEludCogQ29uc3RhbnRJbnQ6OmdldChjb25zdCBJbnRlZ2VyVHlwZSogVHksIHVpbnQ2NF90IFYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCkgeworICByZXR1cm4gZ2V0KFR5LT5nZXRDb250ZXh0KCksIEFQSW50KFR5LT5nZXRCaXRXaWR0aCgpLCBWLCBpc1NpZ25lZCkpOworfQorCitDb25zdGFudEludCogQ29uc3RhbnRJbnQ6OmdldFNpZ25lZChjb25zdCBJbnRlZ2VyVHlwZSogVHksIGludDY0X3QgVikgeworICByZXR1cm4gZ2V0KFR5LCBWLCB0cnVlKTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50SW50OjpnZXRTaWduZWQoY29uc3QgVHlwZSAqVHksIGludDY0X3QgVikgeworICByZXR1cm4gZ2V0KFR5LCBWLCB0cnVlKTsKK30KKworQ29uc3RhbnQqIENvbnN0YW50SW50OjpnZXQoY29uc3QgVHlwZSogVHksIGNvbnN0IEFQSW50JiBWKSB7CisgIENvbnN0YW50SW50ICpDID0gZ2V0KFR5LT5nZXRDb250ZXh0KCksIFYpOworICBhc3NlcnQoQy0+Z2V0VHlwZSgpID09IFR5LT5nZXRTY2FsYXJUeXBlKCkgJiYKKyAgICAgICAgICJDb25zdGFudEludCB0eXBlIGRvZXNuJ3QgbWF0Y2ggdGhlIHR5cGUgaW1wbGllZCBieSBpdHMgdmFsdWUhIik7CisKKyAgLy8gRm9yIHZlY3RvcnMsIGJyb2FkY2FzdCB0aGUgdmFsdWUuCisgIGlmIChjb25zdCBWZWN0b3JUeXBlICpWVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihUeSkpCisgICAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoCisgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCAqPihWVHktPmdldE51bUVsZW1lbnRzKCksIEMpKTsKKworICByZXR1cm4gQzsKK30KKworQ29uc3RhbnRJbnQqIENvbnN0YW50SW50OjpnZXQoY29uc3QgSW50ZWdlclR5cGUqIFR5LCBTdHJpbmdSZWYgU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByYWRpeCkgeworICByZXR1cm4gZ2V0KFR5LT5nZXRDb250ZXh0KCksIEFQSW50KFR5LT5nZXRCaXRXaWR0aCgpLCBTdHIsIHJhZGl4KSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRGUAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RhdGljIGNvbnN0IGZsdFNlbWFudGljcyAqVHlwZVRvRmxvYXRTZW1hbnRpY3MoY29uc3QgVHlwZSAqVHkpIHsKKyAgaWYgKFR5LT5pc0Zsb2F0VHkoKSkKKyAgICByZXR1cm4gJkFQRmxvYXQ6OklFRUVzaW5nbGU7CisgIGlmIChUeS0+aXNEb3VibGVUeSgpKQorICAgIHJldHVybiAmQVBGbG9hdDo6SUVFRWRvdWJsZTsKKyAgaWYgKFR5LT5pc1g4Nl9GUDgwVHkoKSkKKyAgICByZXR1cm4gJkFQRmxvYXQ6Ong4N0RvdWJsZUV4dGVuZGVkOworICBlbHNlIGlmIChUeS0+aXNGUDEyOFR5KCkpCisgICAgcmV0dXJuICZBUEZsb2F0OjpJRUVFcXVhZDsKKyAgCisgIGFzc2VydChUeS0+aXNQUENfRlAxMjhUeSgpICYmICJVbmtub3duIEZQIGZvcm1hdCIpOworICByZXR1cm4gJkFQRmxvYXQ6OlBQQ0RvdWJsZURvdWJsZTsKK30KKworLy8vIGdldCgpIC0gVGhpcyByZXR1cm5zIGEgY29uc3RhbnQgZnAgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlCisvLy8gc3BlY2lmaWVkIHR5cGUuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHNpbXBsZSBjb25zdGFudCB2YWx1ZXMgbGlrZQorLy8vIDIuMC8xLjAgZXRjLCB0aGF0IGFyZSBrbm93bi12YWxpZCBib3RoIGFzIGRvdWJsZSBhbmQgYXMgdGhlIHRhcmdldCBmb3JtYXQuCitDb25zdGFudCogQ29uc3RhbnRGUDo6Z2V0KGNvbnN0IFR5cGUqIFR5LCBkb3VibGUgVikgeworICBMTFZNQ29udGV4dCAmQ29udGV4dCA9IFR5LT5nZXRDb250ZXh0KCk7CisgIAorICBBUEZsb2F0IEZWKFYpOworICBib29sIGlnbm9yZWQ7CisgIEZWLmNvbnZlcnQoKlR5cGVUb0Zsb2F0U2VtYW50aWNzKFR5LT5nZXRTY2FsYXJUeXBlKCkpLAorICAgICAgICAgICAgIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4sICZpZ25vcmVkKTsKKyAgQ29uc3RhbnQgKkMgPSBnZXQoQ29udGV4dCwgRlYpOworCisgIC8vIEZvciB2ZWN0b3JzLCBicm9hZGNhc3QgdGhlIHZhbHVlLgorICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqVlR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oVHkpKQorICAgIHJldHVybiBDb25zdGFudFZlY3Rvcjo6Z2V0KAorICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQgKj4oVlR5LT5nZXROdW1FbGVtZW50cygpLCBDKSk7CisKKyAgcmV0dXJuIEM7Cit9CisKKworQ29uc3RhbnQqIENvbnN0YW50RlA6OmdldChjb25zdCBUeXBlKiBUeSwgU3RyaW5nUmVmIFN0cikgeworICBMTFZNQ29udGV4dCAmQ29udGV4dCA9IFR5LT5nZXRDb250ZXh0KCk7CisKKyAgQVBGbG9hdCBGVigqVHlwZVRvRmxvYXRTZW1hbnRpY3MoVHktPmdldFNjYWxhclR5cGUoKSksIFN0cik7CisgIENvbnN0YW50ICpDID0gZ2V0KENvbnRleHQsIEZWKTsKKworICAvLyBGb3IgdmVjdG9ycywgYnJvYWRjYXN0IHRoZSB2YWx1ZS4KKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KFR5KSkKKyAgICByZXR1cm4gQ29uc3RhbnRWZWN0b3I6OmdldCgKKyAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50ICo+KFZUeS0+Z2V0TnVtRWxlbWVudHMoKSwgQykpOworCisgIHJldHVybiBDOyAKK30KKworCitDb25zdGFudEZQKiBDb25zdGFudEZQOjpnZXROZWdhdGl2ZVplcm8oY29uc3QgVHlwZSogVHkpIHsKKyAgTExWTUNvbnRleHQgJkNvbnRleHQgPSBUeS0+Z2V0Q29udGV4dCgpOworICBBUEZsb2F0IGFwZiA9IGNhc3QgPENvbnN0YW50RlA+KENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpKS0+Z2V0VmFsdWVBUEYoKTsKKyAgYXBmLmNoYW5nZVNpZ24oKTsKKyAgcmV0dXJuIGdldChDb250ZXh0LCBhcGYpOworfQorCisKK0NvbnN0YW50KiBDb25zdGFudEZQOjpnZXRaZXJvVmFsdWVGb3JOZWdhdGlvbihjb25zdCBUeXBlKiBUeSkgeworICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqUFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oVHkpKQorICAgIGlmIChQVHktPmdldEVsZW1lbnRUeXBlKCktPmlzRmxvYXRpbmdQb2ludFR5KCkpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gemVyb3MoUFR5LT5nZXROdW1FbGVtZW50cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmVnYXRpdmVaZXJvKFBUeS0+Z2V0RWxlbWVudFR5cGUoKSkpOworICAgICAgcmV0dXJuIENvbnN0YW50VmVjdG9yOjpnZXQoUFR5LCB6ZXJvcyk7CisgICAgfQorCisgIGlmIChUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSkgCisgICAgcmV0dXJuIGdldE5lZ2F0aXZlWmVybyhUeSk7CisKKyAgcmV0dXJuIENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpOworfQorCisKKy8vIENvbnN0YW50RlAgYWNjZXNzb3JzLgorQ29uc3RhbnRGUCogQ29uc3RhbnRGUDo6Z2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBjb25zdCBBUEZsb2F0JiBWKSB7CisgIERlbnNlTWFwQVBGbG9hdEtleUluZm86OktleVR5IEtleShWKTsKKyAgCisgIExMVk1Db250ZXh0SW1wbCogcEltcGwgPSBDb250ZXh0LnBJbXBsOworICAKKyAgQ29uc3RhbnRGUCAqJlNsb3QgPSBwSW1wbC0+RlBDb25zdGFudHNbS2V5XTsKKyAgICAKKyAgaWYgKCFTbG90KSB7CisgICAgY29uc3QgVHlwZSAqVHk7CisgICAgaWYgKCZWLmdldFNlbWFudGljcygpID09ICZBUEZsb2F0OjpJRUVFc2luZ2xlKQorICAgICAgVHkgPSBUeXBlOjpnZXRGbG9hdFR5KENvbnRleHQpOworICAgIGVsc2UgaWYgKCZWLmdldFNlbWFudGljcygpID09ICZBUEZsb2F0OjpJRUVFZG91YmxlKQorICAgICAgVHkgPSBUeXBlOjpnZXREb3VibGVUeShDb250ZXh0KTsKKyAgICBlbHNlIGlmICgmVi5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6eDg3RG91YmxlRXh0ZW5kZWQpCisgICAgICBUeSA9IFR5cGU6OmdldFg4Nl9GUDgwVHkoQ29udGV4dCk7CisgICAgZWxzZSBpZiAoJlYuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OklFRUVxdWFkKQorICAgICAgVHkgPSBUeXBlOjpnZXRGUDEyOFR5KENvbnRleHQpOworICAgIGVsc2UgeworICAgICAgYXNzZXJ0KCZWLmdldFNlbWFudGljcygpID09ICZBUEZsb2F0OjpQUENEb3VibGVEb3VibGUgJiYgCisgICAgICAgICAgICAgIlVua25vd24gRlAgZm9ybWF0Iik7CisgICAgICBUeSA9IFR5cGU6OmdldFBQQ19GUDEyOFR5KENvbnRleHQpOworICAgIH0KKyAgICBTbG90ID0gbmV3IENvbnN0YW50RlAoVHksIFYpOworICB9CisgIAorICByZXR1cm4gU2xvdDsKK30KKworQ29uc3RhbnRGUCAqQ29uc3RhbnRGUDo6Z2V0SW5maW5pdHkoY29uc3QgVHlwZSAqVHksIGJvb2wgTmVnYXRpdmUpIHsKKyAgY29uc3QgZmx0U2VtYW50aWNzICZTZW1hbnRpY3MgPSAqVHlwZVRvRmxvYXRTZW1hbnRpY3MoVHkpOworICByZXR1cm4gQ29uc3RhbnRGUDo6Z2V0KFR5LT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQVBGbG9hdDo6Z2V0SW5mKFNlbWFudGljcywgTmVnYXRpdmUpKTsKK30KKworQ29uc3RhbnRGUDo6Q29uc3RhbnRGUChjb25zdCBUeXBlICpUeSwgY29uc3QgQVBGbG9hdCYgVikKKyAgOiBDb25zdGFudChUeSwgQ29uc3RhbnRGUFZhbCwgMCwgMCksIFZhbChWKSB7CisgIGFzc2VydCgmVi5nZXRTZW1hbnRpY3MoKSA9PSBUeXBlVG9GbG9hdFNlbWFudGljcyhUeSkgJiYKKyAgICAgICAgICJGUCB0eXBlIE1pc21hdGNoIik7Cit9CisKK2Jvb2wgQ29uc3RhbnRGUDo6aXNOdWxsVmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBWYWwuaXNaZXJvKCkgJiYgIVZhbC5pc05lZ2F0aXZlKCk7Cit9CisKK2Jvb2wgQ29uc3RhbnRGUDo6aXNFeGFjdGx5VmFsdWUoY29uc3QgQVBGbG9hdCYgVikgY29uc3QgeworICByZXR1cm4gVmFsLmJpdHdpc2VJc0VxdWFsKFYpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRYWFggQ2xhc3NlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCitDb25zdGFudEFycmF5OjpDb25zdGFudEFycmF5KGNvbnN0IEFycmF5VHlwZSAqVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiAmVikKKyAgOiBDb25zdGFudChULCBDb25zdGFudEFycmF5VmFsLAorICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8Q29uc3RhbnRBcnJheT46Om9wX2VuZCh0aGlzKSAtIFYuc2l6ZSgpLAorICAgICAgICAgICAgIFYuc2l6ZSgpKSB7CisgIGFzc2VydChWLnNpemUoKSA9PSBULT5nZXROdW1FbGVtZW50cygpICYmCisgICAgICAgICAiSW52YWxpZCBpbml0aWFsaXplciB2ZWN0b3IgZm9yIGNvbnN0YW50IGFycmF5Iik7CisgIFVzZSAqT0wgPSBPcGVyYW5kTGlzdDsKKyAgZm9yIChzdGQ6OnZlY3RvcjxDb25zdGFudCo+Ojpjb25zdF9pdGVyYXRvciBJID0gVi5iZWdpbigpLCBFID0gVi5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSwgKytPTCkgeworICAgIENvbnN0YW50ICpDID0gKkk7CisgICAgYXNzZXJ0KEMtPmdldFR5cGUoKSA9PSBULT5nZXRFbGVtZW50VHlwZSgpICYmCisgICAgICAgICAgICJJbml0aWFsaXplciBmb3IgYXJyYXkgZWxlbWVudCBkb2Vzbid0IG1hdGNoIGFycmF5IGVsZW1lbnQgdHlwZSEiKTsKKyAgICAqT0wgPSBDOworICB9Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEFycmF5OjpnZXQoY29uc3QgQXJyYXlUeXBlICpUeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJlYpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFYuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGFzc2VydChWW2ldLT5nZXRUeXBlKCkgPT0gVHktPmdldEVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgICAgIldyb25nIHR5cGUgaW4gYXJyYXkgZWxlbWVudCBpbml0aWFsaXplciIpOworICB9CisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBUeS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICAvLyBJZiB0aGlzIGlzIGFuIGFsbC16ZXJvIGFycmF5LCByZXR1cm4gYSBDb25zdGFudEFnZ3JlZ2F0ZVplcm8gb2JqZWN0CisgIGlmICghVi5lbXB0eSgpKSB7CisgICAgQ29uc3RhbnQgKkMgPSBWWzBdOworICAgIGlmICghQy0+aXNOdWxsVmFsdWUoKSkKKyAgICAgIHJldHVybiBwSW1wbC0+QXJyYXlDb25zdGFudHMuZ2V0T3JDcmVhdGUoVHksIFYpOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBWLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVltpXSAhPSBDKQorICAgICAgICByZXR1cm4gcEltcGwtPkFycmF5Q29uc3RhbnRzLmdldE9yQ3JlYXRlKFR5LCBWKTsKKyAgfQorICAKKyAgcmV0dXJuIENvbnN0YW50QWdncmVnYXRlWmVybzo6Z2V0KFR5KTsKK30KKworCitDb25zdGFudCogQ29uc3RhbnRBcnJheTo6Z2V0KGNvbnN0IEFycmF5VHlwZSogVCwgQ29uc3RhbnQqIGNvbnN0KiBWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1WYWxzKSB7CisgIC8vIEZJWE1FOiBtYWtlIHRoaXMgdGhlIHByaW1hcnkgY3RvciBtZXRob2QuCisgIHJldHVybiBnZXQoVCwgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPihWYWxzLCBWYWxzK051bVZhbHMpKTsKK30KKworLy8vIENvbnN0YW50QXJyYXk6OmdldChjb25zdCBzdHJpbmcmKSAtIFJldHVybiBhbiBhcnJheSB0aGF0IGlzIGluaXRpYWxpemVkIHRvCisvLy8gY29udGFpbiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gIElmIGxlbmd0aCBpcyB6ZXJvIHRoZW4gYSBudWxsIHRlcm1pbmF0b3IgaXMgCisvLy8gYWRkZWQgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgc28gdGhhdCBpdCBtYXkgYmUgdXNlZCBpbiBhIG5hdHVyYWwgd2F5LiAKKy8vLyBPdGhlcndpc2UsIHRoZSBsZW5ndGggcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCBvZiB0aGUgc3RyaW5nIHRvIHVzZSAKKy8vLyBhbmQgaXQgd29uJ3QgYmUgbnVsbCB0ZXJtaW5hdGVkLgorLy8vCitDb25zdGFudCogQ29uc3RhbnRBcnJheTo6Z2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFkZE51bGwpIHsKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBFbGVtZW50VmFsczsKKyAgRWxlbWVudFZhbHMucmVzZXJ2ZShTdHIuc2l6ZSgpICsgc2l6ZV90KEFkZE51bGwpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFN0ci5zaXplKCk7ICsraSkKKyAgICBFbGVtZW50VmFscy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ4VHkoQ29udGV4dCksIFN0cltpXSkpOworCisgIC8vIEFkZCBhIG51bGwgdGVybWluYXRvciB0byB0aGUgc3RyaW5nLi4uCisgIGlmIChBZGROdWxsKSB7CisgICAgRWxlbWVudFZhbHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50OFR5KENvbnRleHQpLCAwKSk7CisgIH0KKworICBBcnJheVR5cGUgKkFUeSA9IEFycmF5VHlwZTo6Z2V0KFR5cGU6OmdldEludDhUeShDb250ZXh0KSwgRWxlbWVudFZhbHMuc2l6ZSgpKTsKKyAgcmV0dXJuIGdldChBVHksIEVsZW1lbnRWYWxzKTsKK30KKworCisKK0NvbnN0YW50U3RydWN0OjpDb25zdGFudFN0cnVjdChjb25zdCBTdHJ1Y3RUeXBlICpULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJlYpCisgIDogQ29uc3RhbnQoVCwgQ29uc3RhbnRTdHJ1Y3RWYWwsCisgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxDb25zdGFudFN0cnVjdD46Om9wX2VuZCh0aGlzKSAtIFYuc2l6ZSgpLAorICAgICAgICAgICAgIFYuc2l6ZSgpKSB7CisgIGFzc2VydChWLnNpemUoKSA9PSBULT5nZXROdW1FbGVtZW50cygpICYmCisgICAgICAgICAiSW52YWxpZCBpbml0aWFsaXplciB2ZWN0b3IgZm9yIGNvbnN0YW50IHN0cnVjdHVyZSIpOworICBVc2UgKk9MID0gT3BlcmFuZExpc3Q7CisgIGZvciAoc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IFYuYmVnaW4oKSwgRSA9IFYuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0ksICsrT0wpIHsKKyAgICBDb25zdGFudCAqQyA9ICpJOworICAgIGFzc2VydChDLT5nZXRUeXBlKCkgPT0gVC0+Z2V0RWxlbWVudFR5cGUoSS1WLmJlZ2luKCkpICYmCisgICAgICAgICAgICJJbml0aWFsaXplciBmb3Igc3RydWN0IGVsZW1lbnQgZG9lc24ndCBtYXRjaCBzdHJ1Y3QgZWxlbWVudCB0eXBlISIpOworICAgICpPTCA9IEM7CisgIH0KK30KKworLy8gQ29uc3RhbnRTdHJ1Y3QgYWNjZXNzb3JzLgorQ29uc3RhbnQqIENvbnN0YW50U3RydWN0OjpnZXQoY29uc3QgU3RydWN0VHlwZSogVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4mIFYpIHsKKyAgTExWTUNvbnRleHRJbXBsKiBwSW1wbCA9IFQtPmdldENvbnRleHQoKS5wSW1wbDsKKyAgCisgIC8vIENyZWF0ZSBhIENvbnN0YW50QWdncmVnYXRlWmVybyB2YWx1ZSBpZiBhbGwgZWxlbWVudHMgYXJlIHplcm9zLi4uCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFWW2ldLT5pc051bGxWYWx1ZSgpKQorICAgICAgcmV0dXJuIHBJbXBsLT5TdHJ1Y3RDb25zdGFudHMuZ2V0T3JDcmVhdGUoVCwgVik7CisKKyAgcmV0dXJuIENvbnN0YW50QWdncmVnYXRlWmVybzo6Z2V0KFQpOworfQorCitDb25zdGFudCogQ29uc3RhbnRTdHJ1Y3Q6OmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4mIFYsIGJvb2wgcGFja2VkKSB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBTdHJ1Y3RFbHM7CisgIFN0cnVjdEVscy5yZXNlcnZlKFYuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFYuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBTdHJ1Y3RFbHMucHVzaF9iYWNrKFZbaV0tPmdldFR5cGUoKSk7CisgIHJldHVybiBnZXQoU3RydWN0VHlwZTo6Z2V0KENvbnRleHQsIFN0cnVjdEVscywgcGFja2VkKSwgVik7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudFN0cnVjdDo6Z2V0KExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQqIGNvbnN0ICpWYWxzLCB1bnNpZ25lZCBOdW1WYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQYWNrZWQpIHsKKyAgLy8gRklYTUU6IG1ha2UgdGhpcyB0aGUgcHJpbWFyeSBjdG9yIG1ldGhvZC4KKyAgcmV0dXJuIGdldChDb250ZXh0LCBzdGQ6OnZlY3RvcjxDb25zdGFudCo+KFZhbHMsIFZhbHMrTnVtVmFscyksIFBhY2tlZCk7Cit9CisKK0NvbnN0YW50VW5pb246OkNvbnN0YW50VW5pb24oY29uc3QgVW5pb25UeXBlICpULCBDb25zdGFudCogVikKKyAgOiBDb25zdGFudChULCBDb25zdGFudFVuaW9uVmFsLAorICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8Q29uc3RhbnRVbmlvbj46Om9wX2VuZCh0aGlzKSAtIDEsIDEpIHsKKyAgVXNlICpPTCA9IE9wZXJhbmRMaXN0OworICBhc3NlcnQoVC0+Z2V0RWxlbWVudFR5cGVJbmRleChWLT5nZXRUeXBlKCkpID49IDAgJiYKKyAgICAgICJJbml0aWFsaXplciBmb3IgdW5pb24gZWxlbWVudCBpc24ndCBhIG1lbWJlciBvZiB1bmlvbiB0eXBlISIpOworICAqT0wgPSBWOworfQorCisvLyBDb25zdGFudFVuaW9uIGFjY2Vzc29ycy4KK0NvbnN0YW50KiBDb25zdGFudFVuaW9uOjpnZXQoY29uc3QgVW5pb25UeXBlKiBULCBDb25zdGFudCogVikgeworICBMTFZNQ29udGV4dEltcGwqIHBJbXBsID0gVC0+Z2V0Q29udGV4dCgpLnBJbXBsOworICAKKyAgLy8gQ3JlYXRlIGEgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvIHZhbHVlIGlmIGFsbCBlbGVtZW50cyBhcmUgemVyb3MuLi4KKyAgaWYgKCFWLT5pc051bGxWYWx1ZSgpKQorICAgIHJldHVybiBwSW1wbC0+VW5pb25Db25zdGFudHMuZ2V0T3JDcmVhdGUoVCwgVik7CisKKyAgcmV0dXJuIENvbnN0YW50QWdncmVnYXRlWmVybzo6Z2V0KFQpOworfQorCisKK0NvbnN0YW50VmVjdG9yOjpDb25zdGFudFZlY3Rvcihjb25zdCBWZWN0b3JUeXBlICpULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJlYpCisgIDogQ29uc3RhbnQoVCwgQ29uc3RhbnRWZWN0b3JWYWwsCisgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxDb25zdGFudFZlY3Rvcj46Om9wX2VuZCh0aGlzKSAtIFYuc2l6ZSgpLAorICAgICAgICAgICAgIFYuc2l6ZSgpKSB7CisgIFVzZSAqT0wgPSBPcGVyYW5kTGlzdDsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPENvbnN0YW50Kj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBWLmJlZ2luKCksIEUgPSBWLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0ksICsrT0wpIHsKKyAgICAgIENvbnN0YW50ICpDID0gKkk7CisgICAgICBhc3NlcnQoQy0+Z2V0VHlwZSgpID09IFQtPmdldEVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgICAgIkluaXRpYWxpemVyIGZvciB2ZWN0b3IgZWxlbWVudCBkb2Vzbid0IG1hdGNoIHZlY3RvciBlbGVtZW50IHR5cGUhIik7CisgICAgKk9MID0gQzsKKyAgfQorfQorCisvLyBDb25zdGFudFZlY3RvciBhY2Nlc3NvcnMuCitDb25zdGFudCogQ29uc3RhbnRWZWN0b3I6OmdldChjb25zdCBWZWN0b3JUeXBlKiBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiYgVikgeworICAgYXNzZXJ0KCFWLmVtcHR5KCkgJiYgIlZlY3RvcnMgY2FuJ3QgYmUgZW1wdHkiKTsKKyAgIExMVk1Db250ZXh0ICZDb250ZXh0ID0gVC0+Z2V0Q29udGV4dCgpOworICAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IENvbnRleHQucEltcGw7CisgICAKKyAgLy8gSWYgdGhpcyBpcyBhbiBhbGwtdW5kZWYgb3IgYWxsbC16ZXJvIHZlY3RvciwgcmV0dXJuIGEKKyAgLy8gQ29uc3RhbnRBZ2dyZWdhdGVaZXJvIG9yIFVuZGVmVmFsdWUuCisgIENvbnN0YW50ICpDID0gVlswXTsKKyAgYm9vbCBpc1plcm8gPSBDLT5pc051bGxWYWx1ZSgpOworICBib29sIGlzVW5kZWYgPSBpc2E8VW5kZWZWYWx1ZT4oQyk7CisKKyAgaWYgKGlzWmVybyB8fCBpc1VuZGVmKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFYuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChWW2ldICE9IEMpIHsKKyAgICAgICAgaXNaZXJvID0gaXNVbmRlZiA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfQorICAKKyAgaWYgKGlzWmVybykKKyAgICByZXR1cm4gQ29uc3RhbnRBZ2dyZWdhdGVaZXJvOjpnZXQoVCk7CisgIGlmIChpc1VuZGVmKQorICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoVCk7CisgICAgCisgIHJldHVybiBwSW1wbC0+VmVjdG9yQ29uc3RhbnRzLmdldE9yQ3JlYXRlKFQsIFYpOworfQorCitDb25zdGFudCogQ29uc3RhbnRWZWN0b3I6OmdldChjb25zdCBzdGQ6OnZlY3RvcjxDb25zdGFudCo+JiBWKSB7CisgIGFzc2VydCghVi5lbXB0eSgpICYmICJDYW5ub3QgaW5mZXIgdHlwZSBpZiBWIGlzIGVtcHR5Iik7CisgIHJldHVybiBnZXQoVmVjdG9yVHlwZTo6Z2V0KFYuZnJvbnQoKS0+Z2V0VHlwZSgpLFYuc2l6ZSgpKSwgVik7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudFZlY3Rvcjo6Z2V0KENvbnN0YW50KiBjb25zdCogVmFscywgdW5zaWduZWQgTnVtVmFscykgeworICAvLyBGSVhNRTogbWFrZSB0aGlzIHRoZSBwcmltYXJ5IGN0b3IgbWV0aG9kLgorICByZXR1cm4gZ2V0KHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4oVmFscywgVmFscytOdW1WYWxzKSk7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldE5TV05lZyhDb25zdGFudCogQykgeworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgIkNhbm5vdCBORUcgYSBub25pbnRlZ3JhbCB2YWx1ZSEiKTsKKyAgcmV0dXJuIGdldE5TV1N1YihDb25zdGFudEZQOjpnZXRaZXJvVmFsdWVGb3JOZWdhdGlvbihDLT5nZXRUeXBlKCkpLCBDKTsKK30KKworQ29uc3RhbnQqIENvbnN0YW50RXhwcjo6Z2V0TlVXTmVnKENvbnN0YW50KiBDKSB7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAiQ2Fubm90IE5FRyBhIG5vbmludGVncmFsIHZhbHVlISIpOworICByZXR1cm4gZ2V0TlVXU3ViKENvbnN0YW50RlA6OmdldFplcm9WYWx1ZUZvck5lZ2F0aW9uKEMtPmdldFR5cGUoKSksIEMpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXROU1dBZGQoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldFR5KEMxLT5nZXRUeXBlKCksIEluc3RydWN0aW9uOjpBZGQsIEMxLCBDMiwKKyAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcCk7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldE5VV0FkZChDb25zdGFudCogQzEsIENvbnN0YW50KiBDMikgeworICByZXR1cm4gZ2V0VHkoQzEtPmdldFR5cGUoKSwgSW5zdHJ1Y3Rpb246OkFkZCwgQzEsIEMyLAorICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXApOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXROU1dTdWIoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldFR5KEMxLT5nZXRUeXBlKCksIEluc3RydWN0aW9uOjpTdWIsIEMxLCBDMiwKKyAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcCk7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldE5VV1N1YihDb25zdGFudCogQzEsIENvbnN0YW50KiBDMikgeworICByZXR1cm4gZ2V0VHkoQzEtPmdldFR5cGUoKSwgSW5zdHJ1Y3Rpb246OlN1YiwgQzEsIEMyLAorICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXApOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXROU1dNdWwoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldFR5KEMxLT5nZXRUeXBlKCksIEluc3RydWN0aW9uOjpNdWwsIEMxLCBDMiwKKyAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcCk7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldE5VV011bChDb25zdGFudCogQzEsIENvbnN0YW50KiBDMikgeworICByZXR1cm4gZ2V0VHkoQzEtPmdldFR5cGUoKSwgSW5zdHJ1Y3Rpb246Ok11bCwgQzEsIEMyLAorICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXApOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRFeGFjdFNEaXYoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldFR5KEMxLT5nZXRUeXBlKCksIEluc3RydWN0aW9uOjpTRGl2LCBDMSwgQzIsCisgICAgICAgICAgICAgICBTRGl2T3BlcmF0b3I6OklzRXhhY3QpOworfQorCisvLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyBpZiBhIENvbnN0YW50RXhwciBpcyBhIENhc3RPcCBvciBub3QuIFRoaXMKKy8vIGNhbid0IGJlIGlubGluZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gI2luY2x1ZGUgSW5zdHJ1Y3Rpb24uaCBpbnRvCisvLyBDb25zdGFudC5oCitib29sIENvbnN0YW50RXhwcjo6aXNDYXN0KCkgY29uc3QgeworICByZXR1cm4gSW5zdHJ1Y3Rpb246OmlzQ2FzdChnZXRPcGNvZGUoKSk7Cit9CisKK2Jvb2wgQ29uc3RhbnRFeHByOjppc0NvbXBhcmUoKSBjb25zdCB7CisgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SUNtcCB8fCBnZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkNtcDsKK30KKworYm9vbCBDb25zdGFudEV4cHI6OmlzR0VQV2l0aE5vTm90aW9uYWxPdmVySW5kZXhpbmcoKSBjb25zdCB7CisgIGlmIChnZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cikgcmV0dXJuIGZhbHNlOworCisgIGdlcF90eXBlX2l0ZXJhdG9yIEdFUEkgPSBnZXBfdHlwZV9iZWdpbih0aGlzKSwgRSA9IGdlcF90eXBlX2VuZCh0aGlzKTsKKyAgVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3IgT0kgPSBsbHZtOjpuZXh0KHRoaXMtPm9wX2JlZ2luKCkpOworCisgIC8vIFNraXAgdGhlIGZpcnN0IGluZGV4LCBhcyBpdCBoYXMgbm8gc3RhdGljIGxpbWl0LgorICArK0dFUEk7CisgICsrT0k7CisKKyAgLy8gVGhlIHJlbWFpbmluZyBpbmRpY2VzIG11c3QgYmUgY29tcGlsZS10aW1lIGtub3duIGludGVnZXJzIHdpdGhpbiB0aGUKKyAgLy8gYm91bmRzIG9mIHRoZSBjb3JyZXNwb25kaW5nIG5vdGlvbmFsIHN0YXRpYyBhcnJheSB0eXBlcy4KKyAgZm9yICg7IEdFUEkgIT0gRTsgKytHRVBJLCArK09JKSB7CisgICAgQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KCpPSSk7CisgICAgaWYgKCFDSSkgcmV0dXJuIGZhbHNlOworICAgIGlmIChjb25zdCBBcnJheVR5cGUgKkFUeSA9IGR5bl9jYXN0PEFycmF5VHlwZT4oKkdFUEkpKQorICAgICAgaWYgKENJLT5nZXRWYWx1ZSgpLmdldEFjdGl2ZUJpdHMoKSA+IDY0IHx8CisgICAgICAgICAgQ0ktPmdldFpFeHRWYWx1ZSgpID49IEFUeS0+Z2V0TnVtRWxlbWVudHMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQWxsIHRoZSBpbmRpY2VzIGNoZWNrZWQgb3V0LgorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb25zdGFudEV4cHI6Omhhc0luZGljZXMoKSBjb25zdCB7CisgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RXh0cmFjdFZhbHVlIHx8CisgICAgICAgICBnZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW5zZXJ0VmFsdWU7Cit9CisKK2NvbnN0IFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmQ29uc3RhbnRFeHByOjpnZXRJbmRpY2VzKCkgY29uc3QgeworICBpZiAoY29uc3QgRXh0cmFjdFZhbHVlQ29uc3RhbnRFeHByICpFVkNFID0KKyAgICAgICAgZHluX2Nhc3Q8RXh0cmFjdFZhbHVlQ29uc3RhbnRFeHByPih0aGlzKSkKKyAgICByZXR1cm4gRVZDRS0+SW5kaWNlczsKKworICByZXR1cm4gY2FzdDxJbnNlcnRWYWx1ZUNvbnN0YW50RXhwcj4odGhpcyktPkluZGljZXM7Cit9CisKK3Vuc2lnbmVkIENvbnN0YW50RXhwcjo6Z2V0UHJlZGljYXRlKCkgY29uc3QgeworICBhc3NlcnQoZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZDbXAgfHwgCisgICAgICAgICBnZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SUNtcCk7CisgIHJldHVybiAoKGNvbnN0IENvbXBhcmVDb25zdGFudEV4cHIqKXRoaXMpLT5wcmVkaWNhdGU7Cit9CisKKy8vLyBnZXRXaXRoT3BlcmFuZFJlcGxhY2VkIC0gUmV0dXJuIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpZGVudGljYWwgdG8gdGhpcworLy8vIG9uZSwgYnV0IHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYW5kIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorQ29uc3RhbnQgKgorQ29uc3RhbnRFeHByOjpnZXRXaXRoT3BlcmFuZFJlcGxhY2VkKHVuc2lnbmVkIE9wTm8sIENvbnN0YW50ICpPcCkgY29uc3QgeworICBhc3NlcnQoT3BObyA8IGdldE51bU9wZXJhbmRzKCkgJiYgIk9wZXJhbmQgbnVtIGlzIG91dCBvZiByYW5nZSEiKTsKKyAgYXNzZXJ0KE9wLT5nZXRUeXBlKCkgPT0gZ2V0T3BlcmFuZChPcE5vKS0+Z2V0VHlwZSgpICYmCisgICAgICAgICAiUmVwbGFjaW5nIG9wZXJhbmQgd2l0aCB2YWx1ZSBvZiBkaWZmZXJlbnQgdHlwZSEiKTsKKyAgaWYgKGdldE9wZXJhbmQoT3BObykgPT0gT3ApCisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q29uc3RhbnRFeHByKj4odGhpcyk7CisgIAorICBDb25zdGFudCAqT3AwLCAqT3AxLCAqT3AyOworICBzd2l0Y2ggKGdldE9wY29kZSgpKSB7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OgorICBjYXNlIEluc3RydWN0aW9uOjpGUFRydW5jOgorICBjYXNlIEluc3RydWN0aW9uOjpGUEV4dDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VUlUb0ZQOgorICBjYXNlIEluc3RydWN0aW9uOjpTSVRvRlA6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9VSToKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1NJOgorICBjYXNlIEluc3RydWN0aW9uOjpQdHJUb0ludDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6SW50VG9QdHI6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Q2FzdChnZXRPcGNvZGUoKSwgT3AsIGdldFR5cGUoKSk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNlbGVjdDoKKyAgICBPcDAgPSAoT3BObyA9PSAwKSA/IE9wIDogZ2V0T3BlcmFuZCgwKTsKKyAgICBPcDEgPSAoT3BObyA9PSAxKSA/IE9wIDogZ2V0T3BlcmFuZCgxKTsKKyAgICBPcDIgPSAoT3BObyA9PSAyKSA/IE9wIDogZ2V0T3BlcmFuZCgyKTsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRTZWxlY3QoT3AwLCBPcDEsIE9wMik7CisgIGNhc2UgSW5zdHJ1Y3Rpb246Okluc2VydEVsZW1lbnQ6CisgICAgT3AwID0gKE9wTm8gPT0gMCkgPyBPcCA6IGdldE9wZXJhbmQoMCk7CisgICAgT3AxID0gKE9wTm8gPT0gMSkgPyBPcCA6IGdldE9wZXJhbmQoMSk7CisgICAgT3AyID0gKE9wTm8gPT0gMikgPyBPcCA6IGdldE9wZXJhbmQoMik7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0RWxlbWVudChPcDAsIE9wMSwgT3AyKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RXh0cmFjdEVsZW1lbnQ6CisgICAgT3AwID0gKE9wTm8gPT0gMCkgPyBPcCA6IGdldE9wZXJhbmQoMCk7CisgICAgT3AxID0gKE9wTm8gPT0gMSkgPyBPcCA6IGdldE9wZXJhbmQoMSk7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0RXh0cmFjdEVsZW1lbnQoT3AwLCBPcDEpOworICBjYXNlIEluc3RydWN0aW9uOjpTaHVmZmxlVmVjdG9yOgorICAgIE9wMCA9IChPcE5vID09IDApID8gT3AgOiBnZXRPcGVyYW5kKDApOworICAgIE9wMSA9IChPcE5vID09IDEpID8gT3AgOiBnZXRPcGVyYW5kKDEpOworICAgIE9wMiA9IChPcE5vID09IDIpID8gT3AgOiBnZXRPcGVyYW5kKDIpOworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNodWZmbGVWZWN0b3IoT3AwLCBPcDEsIE9wMik7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHI6IHsKKyAgICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDg+IE9wczsKKyAgICBPcHMucmVzaXplKGdldE51bU9wZXJhbmRzKCktMSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgT3BzW2ktMV0gPSBnZXRPcGVyYW5kKGkpOworICAgIGlmIChPcE5vID09IDApCisgICAgICByZXR1cm4gY2FzdDxHRVBPcGVyYXRvcj4odGhpcyktPmlzSW5Cb3VuZHMoKSA/CisgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKE9wLCAmT3BzWzBdLCBPcHMuc2l6ZSgpKSA6CisgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihPcCwgJk9wc1swXSwgT3BzLnNpemUoKSk7CisgICAgT3BzW09wTm8tMV0gPSBPcDsKKyAgICByZXR1cm4gY2FzdDxHRVBPcGVyYXRvcj4odGhpcyktPmlzSW5Cb3VuZHMoKSA/CisgICAgICBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihnZXRPcGVyYW5kKDApLCAmT3BzWzBdLE9wcy5zaXplKCkpOgorICAgICAgQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKGdldE9wZXJhbmQoMCksICZPcHNbMF0sIE9wcy5zaXplKCkpOworICB9CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KGdldE51bU9wZXJhbmRzKCkgPT0gMiAmJiAiTXVzdCBiZSBiaW5hcnkgb3BlcmF0b3I/Iik7CisgICAgT3AwID0gKE9wTm8gPT0gMCkgPyBPcCA6IGdldE9wZXJhbmQoMCk7CisgICAgT3AxID0gKE9wTm8gPT0gMSkgPyBPcCA6IGdldE9wZXJhbmQoMSk7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0KGdldE9wY29kZSgpLCBPcDAsIE9wMSwgU3ViY2xhc3NPcHRpb25hbERhdGEpOworICB9Cit9CisKKy8vLyBnZXRXaXRoT3BlcmFuZHMgLSBUaGlzIHJldHVybnMgdGhlIGN1cnJlbnQgY29uc3RhbnQgZXhwcmVzc2lvbiB3aXRoIHRoZQorLy8vIG9wZXJhbmRzIHJlcGxhY2VkIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuICBUaGUgc3BlY2lmaWVkIG9wZXJhbmRzIG11c3QKKy8vLyBtYXRjaCBjb3VudCBhbmQgdHlwZSB3aXRoIHRoZSBleGlzdGluZyBvbmVzLgorQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6CitnZXRXaXRoT3BlcmFuZHMoQ29uc3RhbnQqIGNvbnN0ICpPcHMsIHVuc2lnbmVkIE51bU9wcykgY29uc3QgeworICBhc3NlcnQoTnVtT3BzID09IGdldE51bU9wZXJhbmRzKCkgJiYgIk9wZXJhbmQgY291bnQgbWlzbWF0Y2ghIik7CisgIGJvb2wgQW55Q2hhbmdlID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtT3BzOyArK2kpIHsKKyAgICBhc3NlcnQoT3BzW2ldLT5nZXRUeXBlKCkgPT0gZ2V0T3BlcmFuZChpKS0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICJPcGVyYW5kIHR5cGUgbWlzbWF0Y2ghIik7CisgICAgQW55Q2hhbmdlIHw9IE9wc1tpXSAhPSBnZXRPcGVyYW5kKGkpOworICB9CisgIGlmICghQW55Q2hhbmdlKSAgLy8gTm8gb3BlcmFuZHMgY2hhbmdlZCwgcmV0dXJuIHNlbGYuCisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q29uc3RhbnRFeHByKj4odGhpcyk7CisKKyAgc3dpdGNoIChnZXRPcGNvZGUoKSkgeworICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICBjYXNlIEluc3RydWN0aW9uOjpGUFRvVUk6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSToKKyAgY2FzZSBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOgorICBjYXNlIEluc3RydWN0aW9uOjpCaXRDYXN0OgorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldENhc3QoZ2V0T3Bjb2RlKCksIE9wc1swXSwgZ2V0VHlwZSgpKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2VsZWN0OgorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNlbGVjdChPcHNbMF0sIE9wc1sxXSwgT3BzWzJdKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6SW5zZXJ0RWxlbWVudDoKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRJbnNlcnRFbGVtZW50KE9wc1swXSwgT3BzWzFdLCBPcHNbMl0pOworICBjYXNlIEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudDoKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0RWxlbWVudChPcHNbMF0sIE9wc1sxXSk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlNodWZmbGVWZWN0b3I6CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0U2h1ZmZsZVZlY3RvcihPcHNbMF0sIE9wc1sxXSwgT3BzWzJdKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cjoKKyAgICByZXR1cm4gY2FzdDxHRVBPcGVyYXRvcj4odGhpcyktPmlzSW5Cb3VuZHMoKSA/CisgICAgICBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihPcHNbMF0sICZPcHNbMV0sIE51bU9wcy0xKSA6CisgICAgICBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoT3BzWzBdLCAmT3BzWzFdLCBOdW1PcHMtMSk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OklDbXA6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZDbXA6CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Q29tcGFyZShnZXRQcmVkaWNhdGUoKSwgT3BzWzBdLCBPcHNbMV0pOworICBkZWZhdWx0OgorICAgIGFzc2VydChnZXROdW1PcGVyYW5kcygpID09IDIgJiYgIk11c3QgYmUgYmluYXJ5IG9wZXJhdG9yPyIpOworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldChnZXRPcGNvZGUoKSwgT3BzWzBdLCBPcHNbMV0sIFN1YmNsYXNzT3B0aW9uYWxEYXRhKTsKKyAgfQorfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICBpc1ZhbHVlVmFsaWRGb3JUeXBlIGltcGxlbWVudGF0aW9ucworCitib29sIENvbnN0YW50SW50Ojppc1ZhbHVlVmFsaWRGb3JUeXBlKGNvbnN0IFR5cGUgKlR5LCB1aW50NjRfdCBWYWwpIHsKKyAgdW5zaWduZWQgTnVtQml0cyA9IGNhc3Q8SW50ZWdlclR5cGU+KFR5KS0+Z2V0Qml0V2lkdGgoKTsgLy8gYXNzZXJ0IG9rYXkKKyAgaWYgKFR5ID09IFR5cGU6OmdldEludDFUeShUeS0+Z2V0Q29udGV4dCgpKSkKKyAgICByZXR1cm4gVmFsID09IDAgfHwgVmFsID09IDE7CisgIGlmIChOdW1CaXRzID49IDY0KQorICAgIHJldHVybiB0cnVlOyAvLyBhbHdheXMgdHJ1ZSwgaGFzIHRvIGZpdCBpbiBsYXJnZXN0IHR5cGUKKyAgdWludDY0X3QgTWF4ID0gKDFsbCA8PCBOdW1CaXRzKSAtIDE7CisgIHJldHVybiBWYWwgPD0gTWF4OworfQorCitib29sIENvbnN0YW50SW50Ojppc1ZhbHVlVmFsaWRGb3JUeXBlKGNvbnN0IFR5cGUgKlR5LCBpbnQ2NF90IFZhbCkgeworICB1bnNpZ25lZCBOdW1CaXRzID0gY2FzdDxJbnRlZ2VyVHlwZT4oVHkpLT5nZXRCaXRXaWR0aCgpOyAvLyBhc3NlcnQgb2theQorICBpZiAoVHkgPT0gVHlwZTo6Z2V0SW50MVR5KFR5LT5nZXRDb250ZXh0KCkpKQorICAgIHJldHVybiBWYWwgPT0gMCB8fCBWYWwgPT0gMSB8fCBWYWwgPT0gLTE7CisgIGlmIChOdW1CaXRzID49IDY0KQorICAgIHJldHVybiB0cnVlOyAvLyBhbHdheXMgdHJ1ZSwgaGFzIHRvIGZpdCBpbiBsYXJnZXN0IHR5cGUKKyAgaW50NjRfdCBNaW4gPSAtKDFsbCA8PCAoTnVtQml0cy0xKSk7CisgIGludDY0X3QgTWF4ID0gKDFsbCA8PCAoTnVtQml0cy0xKSkgLSAxOworICByZXR1cm4gKFZhbCA+PSBNaW4gJiYgVmFsIDw9IE1heCk7Cit9CisKK2Jvb2wgQ29uc3RhbnRGUDo6aXNWYWx1ZVZhbGlkRm9yVHlwZShjb25zdCBUeXBlICpUeSwgY29uc3QgQVBGbG9hdCYgVmFsKSB7CisgIC8vIGNvbnZlcnQgbW9kaWZpZXMgaW4gcGxhY2UsIHNvIG1ha2UgYSBjb3B5LgorICBBUEZsb2F0IFZhbDIgPSBBUEZsb2F0KFZhbCk7CisgIGJvb2wgbG9zZXNJbmZvOworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsgICAgICAgICAvLyBUaGVzZSBjYW4ndCBiZSByZXByZXNlbnRlZCBhcyBmbG9hdGluZyBwb2ludCEKKworICAvLyBGSVhNRSByb3VuZGluZyBtb2RlIG5lZWRzIHRvIGJlIG1vcmUgZmxleGlibGUKKyAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6IHsKKyAgICBpZiAoJlZhbDIuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OklFRUVzaW5nbGUpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBWYWwyLmNvbnZlcnQoQVBGbG9hdDo6SUVFRXNpbmdsZSwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbiwgJmxvc2VzSW5mbyk7CisgICAgcmV0dXJuICFsb3Nlc0luZm87CisgIH0KKyAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOiB7CisgICAgaWYgKCZWYWwyLmdldFNlbWFudGljcygpID09ICZBUEZsb2F0OjpJRUVFc2luZ2xlIHx8CisgICAgICAgICZWYWwyLmdldFNlbWFudGljcygpID09ICZBUEZsb2F0OjpJRUVFZG91YmxlKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgVmFsMi5jb252ZXJ0KEFQRmxvYXQ6OklFRUVkb3VibGUsIEFQRmxvYXQ6OnJtTmVhcmVzdFRpZXNUb0V2ZW4sICZsb3Nlc0luZm8pOworICAgIHJldHVybiAhbG9zZXNJbmZvOworICB9CisgIGNhc2UgVHlwZTo6WDg2X0ZQODBUeUlEOgorICAgIHJldHVybiAmVmFsMi5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6SUVFRXNpbmdsZSB8fCAKKyAgICAgICAgICAgJlZhbDIuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OklFRUVkb3VibGUgfHwKKyAgICAgICAgICAgJlZhbDIuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6Ong4N0RvdWJsZUV4dGVuZGVkOworICBjYXNlIFR5cGU6OkZQMTI4VHlJRDoKKyAgICByZXR1cm4gJlZhbDIuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OklFRUVzaW5nbGUgfHwgCisgICAgICAgICAgICZWYWwyLmdldFNlbWFudGljcygpID09ICZBUEZsb2F0OjpJRUVFZG91YmxlIHx8CisgICAgICAgICAgICZWYWwyLmdldFNlbWFudGljcygpID09ICZBUEZsb2F0OjpJRUVFcXVhZDsKKyAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOgorICAgIHJldHVybiAmVmFsMi5nZXRTZW1hbnRpY3MoKSA9PSAmQVBGbG9hdDo6SUVFRXNpbmdsZSB8fCAKKyAgICAgICAgICAgJlZhbDIuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OklFRUVkb3VibGUgfHwKKyAgICAgICAgICAgJlZhbDIuZ2V0U2VtYW50aWNzKCkgPT0gJkFQRmxvYXQ6OlBQQ0RvdWJsZURvdWJsZTsKKyAgfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeSBGdW5jdGlvbiBJbXBsZW1lbnRhdGlvbgorCitDb25zdGFudEFnZ3JlZ2F0ZVplcm8qIENvbnN0YW50QWdncmVnYXRlWmVybzo6Z2V0KGNvbnN0IFR5cGUqIFR5KSB7CisgIGFzc2VydCgoVHktPmlzU3RydWN0VHkoKSB8fCBUeS0+aXNVbmlvblR5KCkKKyAgICAgICAgIHx8IFR5LT5pc0FycmF5VHkoKSB8fCBUeS0+aXNWZWN0b3JUeSgpKSAmJgorICAgICAgICAgIkNhbm5vdCBjcmVhdGUgYW4gYWdncmVnYXRlIHplcm8gb2Ygbm9uLWFnZ3JlZ2F0ZSB0eXBlISIpOworICAKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IFR5LT5nZXRDb250ZXh0KCkucEltcGw7CisgIHJldHVybiBwSW1wbC0+QWdnWmVyb0NvbnN0YW50cy5nZXRPckNyZWF0ZShUeSwgMCk7Cit9CisKKy8vLyBkZXN0cm95Q29uc3RhbnQgLSBSZW1vdmUgdGhlIGNvbnN0YW50IGZyb20gdGhlIGNvbnN0YW50IHRhYmxlLi4uCisvLy8KK3ZvaWQgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvOjpkZXN0cm95Q29uc3RhbnQoKSB7CisgIGdldFJhd1R5cGUoKS0+Z2V0Q29udGV4dCgpLnBJbXBsLT5BZ2daZXJvQ29uc3RhbnRzLnJlbW92ZSh0aGlzKTsKKyAgZGVzdHJveUNvbnN0YW50SW1wbCgpOworfQorCisvLy8gZGVzdHJveUNvbnN0YW50IC0gUmVtb3ZlIHRoZSBjb25zdGFudCBmcm9tIHRoZSBjb25zdGFudCB0YWJsZS4uLgorLy8vCit2b2lkIENvbnN0YW50QXJyYXk6OmRlc3Ryb3lDb25zdGFudCgpIHsKKyAgZ2V0UmF3VHlwZSgpLT5nZXRDb250ZXh0KCkucEltcGwtPkFycmF5Q29uc3RhbnRzLnJlbW92ZSh0aGlzKTsKKyAgZGVzdHJveUNvbnN0YW50SW1wbCgpOworfQorCisvLy8gaXNTdHJpbmcgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGFycmF5IGlzIGFuIGFycmF5IG9mIGk4LCBhbmQgCisvLy8gaWYgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBhcmUgYWxsIENvbnN0YW50SW50J3MuCitib29sIENvbnN0YW50QXJyYXk6OmlzU3RyaW5nKCkgY29uc3QgeworICAvLyBDaGVjayB0aGUgZWxlbWVudCB0eXBlIGZvciBpOC4uLgorICBpZiAoIWdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHkoOCkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBDaGVjayB0aGUgZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCBpbnRlZ2Vycywgbm90IGNvbnN0YW50CisgIC8vIGV4cHJlc3Npb25zLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFpc2E8Q29uc3RhbnRJbnQ+KGdldE9wZXJhbmQoaSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzQ1N0cmluZyAtIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJyYXkgaXMgYSBzdHJpbmcgKHNlZQorLy8vIGlzU3RyaW5nKSBhbmQgaXQgZW5kcyBpbiBhIG51bGwgYnl0ZSBcXDAgYW5kIGRvZXMgbm90IGNvbnRhaW5zIGFueSBvdGhlcgorLy8vIG51bGwgYnl0ZXMgZXhjZXB0IGl0cyB0ZXJtaW5hdG9yLgorYm9vbCBDb25zdGFudEFycmF5Ojppc0NTdHJpbmcoKSBjb25zdCB7CisgIC8vIENoZWNrIHRoZSBlbGVtZW50IHR5cGUgZm9yIGk4Li4uCisgIGlmICghZ2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpLT5pc0ludGVnZXJUeSg4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gTGFzdCBlbGVtZW50IG11c3QgYmUgYSBudWxsLgorICBpZiAoIWdldE9wZXJhbmQoZ2V0TnVtT3BlcmFuZHMoKS0xKS0+aXNOdWxsVmFsdWUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIC8vIE90aGVyIGVsZW1lbnRzIG11c3QgYmUgbm9uLW51bGwgaW50ZWdlcnMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpLTE7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKCFpc2E8Q29uc3RhbnRJbnQ+KGdldE9wZXJhbmQoaSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChnZXRPcGVyYW5kKGkpLT5pc051bGxWYWx1ZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisKKy8vLyBnZXRBc1N0cmluZyAtIElmIHRoZSBzdWItZWxlbWVudCB0eXBlIG9mIHRoaXMgYXJyYXkgaXMgaTgKKy8vLyB0aGVuIHRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBhcnJheSB0byBhbiBzdGQ6OnN0cmluZyBhbmQgcmV0dXJucyBpdC4KKy8vLyBPdGhlcndpc2UsIGl0IGFzc2VydHMgb3V0LgorLy8vCitzdGQ6OnN0cmluZyBDb25zdGFudEFycmF5OjpnZXRBc1N0cmluZygpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzU3RyaW5nKCkgJiYgIk5vdCBhIHN0cmluZyEiKTsKKyAgc3RkOjpzdHJpbmcgUmVzdWx0OworICBSZXN1bHQucmVzZXJ2ZShnZXROdW1PcGVyYW5kcygpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgIFJlc3VsdC5wdXNoX2JhY2soKGNoYXIpY2FzdDxDb25zdGFudEludD4oZ2V0T3BlcmFuZChpKSktPmdldFpFeHRWYWx1ZSgpKTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworCisvLy0tLS0gQ29uc3RhbnRTdHJ1Y3Q6OmdldCgpIGltcGxlbWVudGF0aW9uLi4uCisvLworCituYW1lc3BhY2UgbGx2bSB7CisKK30KKworLy8gZGVzdHJveUNvbnN0YW50IC0gUmVtb3ZlIHRoZSBjb25zdGFudCBmcm9tIHRoZSBjb25zdGFudCB0YWJsZS4uLgorLy8KK3ZvaWQgQ29uc3RhbnRTdHJ1Y3Q6OmRlc3Ryb3lDb25zdGFudCgpIHsKKyAgZ2V0UmF3VHlwZSgpLT5nZXRDb250ZXh0KCkucEltcGwtPlN0cnVjdENvbnN0YW50cy5yZW1vdmUodGhpcyk7CisgIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKK30KKworLy8gZGVzdHJveUNvbnN0YW50IC0gUmVtb3ZlIHRoZSBjb25zdGFudCBmcm9tIHRoZSBjb25zdGFudCB0YWJsZS4uLgorLy8KK3ZvaWQgQ29uc3RhbnRVbmlvbjo6ZGVzdHJveUNvbnN0YW50KCkgeworICBnZXRSYXdUeXBlKCktPmdldENvbnRleHQoKS5wSW1wbC0+VW5pb25Db25zdGFudHMucmVtb3ZlKHRoaXMpOworICBkZXN0cm95Q29uc3RhbnRJbXBsKCk7Cit9CisKKy8vIGRlc3Ryb3lDb25zdGFudCAtIFJlbW92ZSB0aGUgY29uc3RhbnQgZnJvbSB0aGUgY29uc3RhbnQgdGFibGUuLi4KKy8vCit2b2lkIENvbnN0YW50VmVjdG9yOjpkZXN0cm95Q29uc3RhbnQoKSB7CisgIGdldFJhd1R5cGUoKS0+Z2V0Q29udGV4dCgpLnBJbXBsLT5WZWN0b3JDb25zdGFudHMucmVtb3ZlKHRoaXMpOworICBkZXN0cm95Q29uc3RhbnRJbXBsKCk7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgaWZmIGV2ZXJ5IGVsZW1lbnQgaW4gdGhpcyB2ZWN0b3IgY29uc3RhbnQKKy8vLyBpcyBzZXQgdG8gYWxsIG9uZXMuCisvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCdzIGVtZW1lbnRzIGFyZSBhbGwgc2V0IHRvIGFsbCBvbmVzLgorLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIGFsbCBvbmVzLgorYm9vbCBDb25zdGFudFZlY3Rvcjo6aXNBbGxPbmVzVmFsdWUoKSBjb25zdCB7CisgIC8vIENoZWNrIG91dCBmaXJzdCBlbGVtZW50LgorICBjb25zdCBDb25zdGFudCAqRWx0ID0gZ2V0T3BlcmFuZCgwKTsKKyAgY29uc3QgQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEVsdCk7CisgIGlmICghQ0kgfHwgIUNJLT5pc0FsbE9uZXNWYWx1ZSgpKSByZXR1cm4gZmFsc2U7CisgIC8vIFRoZW4gbWFrZSBzdXJlIGFsbCByZW1haW5pbmcgZWxlbWVudHMgcG9pbnQgdG8gdGhlIHNhbWUgdmFsdWUuCisgIGZvciAodW5zaWduZWQgSSA9IDEsIEUgPSBnZXROdW1PcGVyYW5kcygpOyBJIDwgRTsgKytJKSB7CisgICAgaWYgKGdldE9wZXJhbmQoSSkgIT0gRWx0KSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBnZXRTcGxhdFZhbHVlIC0gSWYgdGhpcyBpcyBhIHNwbGF0IGNvbnN0YW50LCB3aGVyZSBhbGwgb2YgdGhlCisvLy8gZWxlbWVudHMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSwgcmV0dXJuIHRoYXQgdmFsdWUuIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KK0NvbnN0YW50ICpDb25zdGFudFZlY3Rvcjo6Z2V0U3BsYXRWYWx1ZSgpIHsKKyAgLy8gQ2hlY2sgb3V0IGZpcnN0IGVsZW1lbnQuCisgIENvbnN0YW50ICpFbHQgPSBnZXRPcGVyYW5kKDApOworICAvLyBUaGVuIG1ha2Ugc3VyZSBhbGwgcmVtYWluaW5nIGVsZW1lbnRzIHBvaW50IHRvIHRoZSBzYW1lIHZhbHVlLgorICBmb3IgKHVuc2lnbmVkIEkgPSAxLCBFID0gZ2V0TnVtT3BlcmFuZHMoKTsgSSA8IEU7ICsrSSkKKyAgICBpZiAoZ2V0T3BlcmFuZChJKSAhPSBFbHQpIHJldHVybiAwOworICByZXR1cm4gRWx0OworfQorCisvLy0tLS0gQ29uc3RhbnRQb2ludGVyTnVsbDo6Z2V0KCkgaW1wbGVtZW50YXRpb24uCisvLworCitDb25zdGFudFBvaW50ZXJOdWxsICpDb25zdGFudFBvaW50ZXJOdWxsOjpnZXQoY29uc3QgUG9pbnRlclR5cGUgKlR5KSB7CisgIHJldHVybiBUeS0+Z2V0Q29udGV4dCgpLnBJbXBsLT5OdWxsUHRyQ29uc3RhbnRzLmdldE9yQ3JlYXRlKFR5LCAwKTsKK30KKworLy8gZGVzdHJveUNvbnN0YW50IC0gUmVtb3ZlIHRoZSBjb25zdGFudCBmcm9tIHRoZSBjb25zdGFudCB0YWJsZS4uLgorLy8KK3ZvaWQgQ29uc3RhbnRQb2ludGVyTnVsbDo6ZGVzdHJveUNvbnN0YW50KCkgeworICBnZXRSYXdUeXBlKCktPmdldENvbnRleHQoKS5wSW1wbC0+TnVsbFB0ckNvbnN0YW50cy5yZW1vdmUodGhpcyk7CisgIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKK30KKworCisvLy0tLS0gVW5kZWZWYWx1ZTo6Z2V0KCkgaW1wbGVtZW50YXRpb24uCisvLworCitVbmRlZlZhbHVlICpVbmRlZlZhbHVlOjpnZXQoY29uc3QgVHlwZSAqVHkpIHsKKyAgcmV0dXJuIFR5LT5nZXRDb250ZXh0KCkucEltcGwtPlVuZGVmVmFsdWVDb25zdGFudHMuZ2V0T3JDcmVhdGUoVHksIDApOworfQorCisvLyBkZXN0cm95Q29uc3RhbnQgLSBSZW1vdmUgdGhlIGNvbnN0YW50IGZyb20gdGhlIGNvbnN0YW50IHRhYmxlLgorLy8KK3ZvaWQgVW5kZWZWYWx1ZTo6ZGVzdHJveUNvbnN0YW50KCkgeworICBnZXRSYXdUeXBlKCktPmdldENvbnRleHQoKS5wSW1wbC0+VW5kZWZWYWx1ZUNvbnN0YW50cy5yZW1vdmUodGhpcyk7CisgIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKK30KKworLy8tLS0tIEJsb2NrQWRkcmVzczo6Z2V0KCkgaW1wbGVtZW50YXRpb24uCisvLworCitCbG9ja0FkZHJlc3MgKkJsb2NrQWRkcmVzczo6Z2V0KEJhc2ljQmxvY2sgKkJCKSB7CisgIGFzc2VydChCQi0+Z2V0UGFyZW50KCkgIT0gMCAmJiAiQmxvY2sgbXVzdCBoYXZlIGEgcGFyZW50Iik7CisgIHJldHVybiBnZXQoQkItPmdldFBhcmVudCgpLCBCQik7Cit9CisKK0Jsb2NrQWRkcmVzcyAqQmxvY2tBZGRyZXNzOjpnZXQoRnVuY3Rpb24gKkYsIEJhc2ljQmxvY2sgKkJCKSB7CisgIEJsb2NrQWRkcmVzcyAqJkJBID0KKyAgICBGLT5nZXRDb250ZXh0KCkucEltcGwtPkJsb2NrQWRkcmVzc2VzW3N0ZDo6bWFrZV9wYWlyKEYsIEJCKV07CisgIGlmIChCQSA9PSAwKQorICAgIEJBID0gbmV3IEJsb2NrQWRkcmVzcyhGLCBCQik7CisgIAorICBhc3NlcnQoQkEtPmdldEZ1bmN0aW9uKCkgPT0gRiAmJiAiQmFzaWMgYmxvY2sgbW92ZWQgYmV0d2VlbiBmdW5jdGlvbnMiKTsKKyAgcmV0dXJuIEJBOworfQorCitCbG9ja0FkZHJlc3M6OkJsb2NrQWRkcmVzcyhGdW5jdGlvbiAqRiwgQmFzaWNCbG9jayAqQkIpCis6IENvbnN0YW50KFR5cGU6OmdldEludDhQdHJUeShGLT5nZXRDb250ZXh0KCkpLCBWYWx1ZTo6QmxvY2tBZGRyZXNzVmFsLAorICAgICAgICAgICAmT3A8MD4oKSwgMikgeworICBzZXRPcGVyYW5kKDAsIEYpOworICBzZXRPcGVyYW5kKDEsIEJCKTsKKyAgQkItPkFkanVzdEJsb2NrQWRkcmVzc1JlZkNvdW50KDEpOworfQorCisKKy8vIGRlc3Ryb3lDb25zdGFudCAtIFJlbW92ZSB0aGUgY29uc3RhbnQgZnJvbSB0aGUgY29uc3RhbnQgdGFibGUuCisvLwordm9pZCBCbG9ja0FkZHJlc3M6OmRlc3Ryb3lDb25zdGFudCgpIHsKKyAgZ2V0RnVuY3Rpb24oKS0+Z2V0UmF3VHlwZSgpLT5nZXRDb250ZXh0KCkucEltcGwKKyAgICAtPkJsb2NrQWRkcmVzc2VzLmVyYXNlKHN0ZDo6bWFrZV9wYWlyKGdldEZ1bmN0aW9uKCksIGdldEJhc2ljQmxvY2soKSkpOworICBnZXRCYXNpY0Jsb2NrKCktPkFkanVzdEJsb2NrQWRkcmVzc1JlZkNvdW50KC0xKTsKKyAgZGVzdHJveUNvbnN0YW50SW1wbCgpOworfQorCit2b2lkIEJsb2NrQWRkcmVzczo6cmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50KFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8sIFVzZSAqVSkgeworICAvLyBUaGlzIGNvdWxkIGJlIHJlcGxhY2luZyBlaXRoZXIgdGhlIEJhc2ljIEJsb2NrIG9yIHRoZSBGdW5jdGlvbi4gIEluIGVpdGhlcgorICAvLyBjYXNlLCB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgbWFwIGVudHJ5LgorICBGdW5jdGlvbiAqTmV3RiA9IGdldEZ1bmN0aW9uKCk7CisgIEJhc2ljQmxvY2sgKk5ld0JCID0gZ2V0QmFzaWNCbG9jaygpOworICAKKyAgaWYgKFUgPT0gJk9wPDA+KCkpCisgICAgTmV3RiA9IGNhc3Q8RnVuY3Rpb24+KFRvKTsKKyAgZWxzZQorICAgIE5ld0JCID0gY2FzdDxCYXNpY0Jsb2NrPihUbyk7CisgIAorICAvLyBTZWUgaWYgdGhlICduZXcnIGVudHJ5IGFscmVhZHkgZXhpc3RzLCBpZiBub3QsIGp1c3QgdXBkYXRlIHRoaXMgaW4gcGxhY2UKKyAgLy8gYW5kIHJldHVybiBlYXJseS4KKyAgQmxvY2tBZGRyZXNzIComTmV3QkEgPQorICAgIGdldENvbnRleHQoKS5wSW1wbC0+QmxvY2tBZGRyZXNzZXNbc3RkOjptYWtlX3BhaXIoTmV3RiwgTmV3QkIpXTsKKyAgaWYgKE5ld0JBID09IDApIHsKKyAgICBnZXRCYXNpY0Jsb2NrKCktPkFkanVzdEJsb2NrQWRkcmVzc1JlZkNvdW50KC0xKTsKKyAgICAKKyAgICAvLyBSZW1vdmUgdGhlIG9sZCBlbnRyeSwgdGhpcyBjYW4ndCBjYXVzZSB0aGUgbWFwIHRvIHJlaGFzaCAoanVzdCBhCisgICAgLy8gdG9tYnN0b25lIHdpbGwgZ2V0IGFkZGVkKS4KKyAgICBnZXRDb250ZXh0KCkucEltcGwtPkJsb2NrQWRkcmVzc2VzLmVyYXNlKHN0ZDo6bWFrZV9wYWlyKGdldEZ1bmN0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCYXNpY0Jsb2NrKCkpKTsKKyAgICBOZXdCQSA9IHRoaXM7CisgICAgc2V0T3BlcmFuZCgwLCBOZXdGKTsKKyAgICBzZXRPcGVyYW5kKDEsIE5ld0JCKTsKKyAgICBnZXRCYXNpY0Jsb2NrKCktPkFkanVzdEJsb2NrQWRkcmVzc1JlZkNvdW50KDEpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgSSBkbyBuZWVkIHRvIHJlcGxhY2UgdGhpcyB3aXRoIGFuIGV4aXN0aW5nIHZhbHVlLgorICBhc3NlcnQoTmV3QkEgIT0gdGhpcyAmJiAiSSBkaWRuJ3QgY29udGFpbiBGcm9tISIpOworICAKKyAgLy8gRXZlcnlvbmUgdXNpbmcgdGhpcyBub3cgdXNlcyB0aGUgcmVwbGFjZW1lbnQuCisgIHVuY2hlY2tlZFJlcGxhY2VBbGxVc2VzV2l0aChOZXdCQSk7CisgIAorICBkZXN0cm95Q29uc3RhbnQoKTsKK30KKworLy8tLS0tIENvbnN0YW50RXhwcjo6Z2V0KCkgaW1wbGVtZW50YXRpb25zLgorLy8KKworLy8vIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRvIGhhbmRsZSBmb2xkaW5nIG9mIGNhc3RzIGFuZCBsb29rdXAgb2YgdGhlCisvLy8gY2FzdCBpbiB0aGUgRXhwckNvbnN0YW50cyBtYXAuIEl0IGlzIHVzZWQgYnkgdGhlIHZhcmlvdXMgZ2V0KiBtZXRob2RzIGJlbG93Lgorc3RhdGljIGlubGluZSBDb25zdGFudCAqZ2V0Rm9sZGVkQ2FzdCgKKyAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgb3BjLCBDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpIHsKKyAgYXNzZXJ0KFR5LT5pc0ZpcnN0Q2xhc3NUeXBlKCkgJiYgIkNhbm5vdCBjYXN0IHRvIGFuIGFnZ3JlZ2F0ZSB0eXBlISIpOworICAvLyBGb2xkIGEgZmV3IGNvbW1vbiBjYXNlcworICBpZiAoQ29uc3RhbnQgKkZDID0gQ29uc3RhbnRGb2xkQ2FzdEluc3RydWN0aW9uKG9wYywgQywgVHkpKQorICAgIHJldHVybiBGQzsKKworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gVHktPmdldENvbnRleHQoKS5wSW1wbDsKKworICAvLyBMb29rIHVwIHRoZSBjb25zdGFudCBpbiB0aGUgdGFibGUgZmlyc3QgdG8gZW5zdXJlIHVuaXF1ZW5lc3MKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBhcmdWZWMoMSwgQyk7CisgIEV4cHJNYXBLZXlUeXBlIEtleShvcGMsIGFyZ1ZlYyk7CisgIAorICByZXR1cm4gcEltcGwtPkV4cHJDb25zdGFudHMuZ2V0T3JDcmVhdGUoVHksIEtleSk7Cit9CisgCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRDYXN0KHVuc2lnbmVkIG9jLCBDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpIHsKKyAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgb3BjID0gSW5zdHJ1Y3Rpb246OkNhc3RPcHMob2MpOworICBhc3NlcnQoSW5zdHJ1Y3Rpb246OmlzQ2FzdChvcGMpICYmICJvcGNvZGUgb3V0IG9mIHJhbmdlIik7CisgIGFzc2VydChDICYmIFR5ICYmICJOdWxsIGFyZ3VtZW50cyB0byBnZXRDYXN0Iik7CisgIGFzc2VydChDYXN0SW5zdDo6Y2FzdElzVmFsaWQob3BjLCBDLCBUeSkgJiYgIkludmFsaWQgY29uc3RhbnRleHByIGNhc3QhIik7CisKKyAgc3dpdGNoIChvcGMpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGNhc3Qgb3Bjb2RlIik7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOiAgICByZXR1cm4gZ2V0VHJ1bmMoQywgVHkpOworICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OiAgICAgcmV0dXJuIGdldFpFeHQoQywgVHkpOworICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OiAgICAgcmV0dXJuIGdldFNFeHQoQywgVHkpOworICBjYXNlIEluc3RydWN0aW9uOjpGUFRydW5jOiAgcmV0dXJuIGdldEZQVHJ1bmMoQywgVHkpOworICBjYXNlIEluc3RydWN0aW9uOjpGUEV4dDogICAgcmV0dXJuIGdldEZQRXh0ZW5kKEMsIFR5KTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6VUlUb0ZQOiAgIHJldHVybiBnZXRVSVRvRlAoQywgVHkpOworICBjYXNlIEluc3RydWN0aW9uOjpTSVRvRlA6ICAgcmV0dXJuIGdldFNJVG9GUChDLCBUeSk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9VSTogICByZXR1cm4gZ2V0RlBUb1VJKEMsIFR5KTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1NJOiAgIHJldHVybiBnZXRGUFRvU0koQywgVHkpOworICBjYXNlIEluc3RydWN0aW9uOjpQdHJUb0ludDogcmV0dXJuIGdldFB0clRvSW50KEMsIFR5KTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6SW50VG9QdHI6IHJldHVybiBnZXRJbnRUb1B0cihDLCBUeSk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6ICByZXR1cm4gZ2V0Qml0Q2FzdChDLCBUeSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9IAorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRaRXh0T3JCaXRDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpUeSkgeworICBpZiAoQy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPT0gVHktPmdldFNjYWxhclNpemVJbkJpdHMoKSkKKyAgICByZXR1cm4gZ2V0Qml0Q2FzdChDLCBUeSk7CisgIHJldHVybiBnZXRaRXh0KEMsIFR5KTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0U0V4dE9yQml0Q2FzdChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpIHsKKyAgaWYgKEMtPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpID09IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkpCisgICAgcmV0dXJuIGdldEJpdENhc3QoQywgVHkpOworICByZXR1cm4gZ2V0U0V4dChDLCBUeSk7Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEV4cHI6OmdldFRydW5jT3JCaXRDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpUeSkgeworICBpZiAoQy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPT0gVHktPmdldFNjYWxhclNpemVJbkJpdHMoKSkKKyAgICByZXR1cm4gZ2V0Qml0Q2FzdChDLCBUeSk7CisgIHJldHVybiBnZXRUcnVuYyhDLCBUeSk7Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEV4cHI6OmdldFBvaW50ZXJDYXN0KENvbnN0YW50ICpTLCBjb25zdCBUeXBlICpUeSkgeworICBhc3NlcnQoUy0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICYmICJJbnZhbGlkIGNhc3QiKTsKKyAgYXNzZXJ0KChUeS0+aXNJbnRlZ2VyVHkoKSB8fCBUeS0+aXNQb2ludGVyVHkoKSkgJiYgIkludmFsaWQgY2FzdCIpOworCisgIGlmIChUeS0+aXNJbnRlZ2VyVHkoKSkKKyAgICByZXR1cm4gZ2V0UHRyVG9JbnQoUywgVHkpOworICByZXR1cm4gZ2V0Qml0Q2FzdChTLCBUeSk7Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEV4cHI6OmdldEludGVnZXJDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpUeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSB7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICBUeS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYgIkludmFsaWQgY2FzdCIpOworICB1bnNpZ25lZCBTcmNCaXRzID0gQy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIERzdEJpdHMgPSBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBvcGNvZGUgPQorICAgIChTcmNCaXRzID09IERzdEJpdHMgPyBJbnN0cnVjdGlvbjo6Qml0Q2FzdCA6CisgICAgIChTcmNCaXRzID4gRHN0Qml0cyA/IEluc3RydWN0aW9uOjpUcnVuYyA6CisgICAgICAoaXNTaWduZWQgPyBJbnN0cnVjdGlvbjo6U0V4dCA6IEluc3RydWN0aW9uOjpaRXh0KSkpOworICByZXR1cm4gZ2V0Q2FzdChvcGNvZGUsIEMsIFR5KTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0RlBDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpUeSkgeworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkgJiYgVHktPmlzRlBPckZQVmVjdG9yVHkoKSAmJgorICAgICAgICAgIkludmFsaWQgY2FzdCIpOworICB1bnNpZ25lZCBTcmNCaXRzID0gQy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIERzdEJpdHMgPSBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICBpZiAoU3JjQml0cyA9PSBEc3RCaXRzKQorICAgIHJldHVybiBDOyAvLyBBdm9pZCBhIHVzZWxlc3MgY2FzdAorICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBvcGNvZGUgPQorICAgICAoU3JjQml0cyA+IERzdEJpdHMgPyBJbnN0cnVjdGlvbjo6RlBUcnVuYyA6IEluc3RydWN0aW9uOjpGUEV4dCk7CisgIHJldHVybiBnZXRDYXN0KG9wY29kZSwgQywgVHkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRUcnVuYyhDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpIHsKKyNpZm5kZWYgTkRFQlVHCisgIGJvb2wgZnJvbVZlYyA9IEMtPmdldFR5cGUoKS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6VmVjdG9yVHlJRDsKKyAgYm9vbCB0b1ZlYyA9IFR5LT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpWZWN0b3JUeUlEOworI2VuZGlmCisgIGFzc2VydCgoZnJvbVZlYyA9PSB0b1ZlYykgJiYgIkNhbm5vdCBjb252ZXJ0IGZyb20gc2NhbGFyIHRvL2Zyb20gdmVjdG9yIik7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmICJUcnVuYyBvcGVyYW5kIG11c3QgYmUgaW50ZWdlciIpOworICBhc3NlcnQoVHktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmICJUcnVuYyBwcm9kdWNlcyBvbmx5IGludGVncmFsIik7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKSA+IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkmJgorICAgICAgICAgIlNyY1R5IG11c3QgYmUgbGFyZ2VyIHRoYW4gRGVzdFR5IGZvciBUcnVuYyEiKTsKKworICByZXR1cm4gZ2V0Rm9sZGVkQ2FzdChJbnN0cnVjdGlvbjo6VHJ1bmMsIEMsIFR5KTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0U0V4dChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpIHsKKyNpZm5kZWYgTkRFQlVHCisgIGJvb2wgZnJvbVZlYyA9IEMtPmdldFR5cGUoKS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6VmVjdG9yVHlJRDsKKyAgYm9vbCB0b1ZlYyA9IFR5LT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpWZWN0b3JUeUlEOworI2VuZGlmCisgIGFzc2VydCgoZnJvbVZlYyA9PSB0b1ZlYykgJiYgIkNhbm5vdCBjb252ZXJ0IGZyb20gc2NhbGFyIHRvL2Zyb20gdmVjdG9yIik7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmICJTRXh0IG9wZXJhbmQgbXVzdCBiZSBpbnRlZ3JhbCIpOworICBhc3NlcnQoVHktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmICJTRXh0IHByb2R1Y2VzIG9ubHkgaW50ZWdlciIpOworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPCBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpJiYKKyAgICAgICAgICJTcmNUeSBtdXN0IGJlIHNtYWxsZXIgdGhhbiBEZXN0VHkgZm9yIFNFeHQhIik7CisKKyAgcmV0dXJuIGdldEZvbGRlZENhc3QoSW5zdHJ1Y3Rpb246OlNFeHQsIEMsIFR5KTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0WkV4dChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpIHsKKyNpZm5kZWYgTkRFQlVHCisgIGJvb2wgZnJvbVZlYyA9IEMtPmdldFR5cGUoKS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6VmVjdG9yVHlJRDsKKyAgYm9vbCB0b1ZlYyA9IFR5LT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpWZWN0b3JUeUlEOworI2VuZGlmCisgIGFzc2VydCgoZnJvbVZlYyA9PSB0b1ZlYykgJiYgIkNhbm5vdCBjb252ZXJ0IGZyb20gc2NhbGFyIHRvL2Zyb20gdmVjdG9yIik7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmICJaRVh0IG9wZXJhbmQgbXVzdCBiZSBpbnRlZ3JhbCIpOworICBhc3NlcnQoVHktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmICJaRXh0IHByb2R1Y2VzIG9ubHkgaW50ZWdlciIpOworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPCBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpJiYKKyAgICAgICAgICJTcmNUeSBtdXN0IGJlIHNtYWxsZXIgdGhhbiBEZXN0VHkgZm9yIFpFeHQhIik7CisKKyAgcmV0dXJuIGdldEZvbGRlZENhc3QoSW5zdHJ1Y3Rpb246OlpFeHQsIEMsIFR5KTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0RlBUcnVuYyhDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpIHsKKyNpZm5kZWYgTkRFQlVHCisgIGJvb2wgZnJvbVZlYyA9IEMtPmdldFR5cGUoKS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6VmVjdG9yVHlJRDsKKyAgYm9vbCB0b1ZlYyA9IFR5LT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpWZWN0b3JUeUlEOworI2VuZGlmCisgIGFzc2VydCgoZnJvbVZlYyA9PSB0b1ZlYykgJiYgIkNhbm5vdCBjb252ZXJ0IGZyb20gc2NhbGFyIHRvL2Zyb20gdmVjdG9yIik7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmlzRlBPckZQVmVjdG9yVHkoKSAmJiBUeS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICBDLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKSA+IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkmJgorICAgICAgICAgIlRoaXMgaXMgYW4gaWxsZWdhbCBmbG9hdGluZyBwb2ludCB0cnVuY2F0aW9uISIpOworICByZXR1cm4gZ2V0Rm9sZGVkQ2FzdChJbnN0cnVjdGlvbjo6RlBUcnVuYywgQywgVHkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRGUEV4dGVuZChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqVHkpIHsKKyNpZm5kZWYgTkRFQlVHCisgIGJvb2wgZnJvbVZlYyA9IEMtPmdldFR5cGUoKS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6VmVjdG9yVHlJRDsKKyAgYm9vbCB0b1ZlYyA9IFR5LT5nZXRUeXBlSUQoKSA9PSBUeXBlOjpWZWN0b3JUeUlEOworI2VuZGlmCisgIGFzc2VydCgoZnJvbVZlYyA9PSB0b1ZlYykgJiYgIkNhbm5vdCBjb252ZXJ0IGZyb20gc2NhbGFyIHRvL2Zyb20gdmVjdG9yIik7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmlzRlBPckZQVmVjdG9yVHkoKSAmJiBUeS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICBDLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKSA8IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkmJgorICAgICAgICAgIlRoaXMgaXMgYW4gaWxsZWdhbCBmbG9hdGluZyBwb2ludCBleHRlbnNpb24hIik7CisgIHJldHVybiBnZXRGb2xkZWRDYXN0KEluc3RydWN0aW9uOjpGUEV4dCwgQywgVHkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRVSVRvRlAoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKlR5KSB7CisjaWZuZGVmIE5ERUJVRworICBib29sIGZyb21WZWMgPSBDLT5nZXRUeXBlKCktPmdldFR5cGVJRCgpID09IFR5cGU6OlZlY3RvclR5SUQ7CisgIGJvb2wgdG9WZWMgPSBUeS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6VmVjdG9yVHlJRDsKKyNlbmRpZgorICBhc3NlcnQoKGZyb21WZWMgPT0gdG9WZWMpICYmICJDYW5ub3QgY29udmVydCBmcm9tIHNjYWxhciB0by9mcm9tIHZlY3RvciIpOworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJiBUeS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICAiVGhpcyBpcyBhbiBpbGxlZ2FsIHVpbnQgdG8gZmxvYXRpbmcgcG9pbnQgY2FzdCEiKTsKKyAgcmV0dXJuIGdldEZvbGRlZENhc3QoSW5zdHJ1Y3Rpb246OlVJVG9GUCwgQywgVHkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRTSVRvRlAoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKlR5KSB7CisjaWZuZGVmIE5ERUJVRworICBib29sIGZyb21WZWMgPSBDLT5nZXRUeXBlKCktPmdldFR5cGVJRCgpID09IFR5cGU6OlZlY3RvclR5SUQ7CisgIGJvb2wgdG9WZWMgPSBUeS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6VmVjdG9yVHlJRDsKKyNlbmRpZgorICBhc3NlcnQoKGZyb21WZWMgPT0gdG9WZWMpICYmICJDYW5ub3QgY29udmVydCBmcm9tIHNjYWxhciB0by9mcm9tIHZlY3RvciIpOworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJiBUeS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICAiVGhpcyBpcyBhbiBpbGxlZ2FsIHNpbnQgdG8gZmxvYXRpbmcgcG9pbnQgY2FzdCEiKTsKKyAgcmV0dXJuIGdldEZvbGRlZENhc3QoSW5zdHJ1Y3Rpb246OlNJVG9GUCwgQywgVHkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRGUFRvVUkoQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKlR5KSB7CisjaWZuZGVmIE5ERUJVRworICBib29sIGZyb21WZWMgPSBDLT5nZXRUeXBlKCktPmdldFR5cGVJRCgpID09IFR5cGU6OlZlY3RvclR5SUQ7CisgIGJvb2wgdG9WZWMgPSBUeS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6VmVjdG9yVHlJRDsKKyNlbmRpZgorICBhc3NlcnQoKGZyb21WZWMgPT0gdG9WZWMpICYmICJDYW5ub3QgY29udmVydCBmcm9tIHNjYWxhciB0by9mcm9tIHZlY3RvciIpOworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkgJiYgVHktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAiVGhpcyBpcyBhbiBpbGxlZ2FsIGZsb2F0aW5nIHBvaW50IHRvIHVpbnQgY2FzdCEiKTsKKyAgcmV0dXJuIGdldEZvbGRlZENhc3QoSW5zdHJ1Y3Rpb246OkZQVG9VSSwgQywgVHkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRGUFRvU0koQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKlR5KSB7CisjaWZuZGVmIE5ERUJVRworICBib29sIGZyb21WZWMgPSBDLT5nZXRUeXBlKCktPmdldFR5cGVJRCgpID09IFR5cGU6OlZlY3RvclR5SUQ7CisgIGJvb2wgdG9WZWMgPSBUeS0+Z2V0VHlwZUlEKCkgPT0gVHlwZTo6VmVjdG9yVHlJRDsKKyNlbmRpZgorICBhc3NlcnQoKGZyb21WZWMgPT0gdG9WZWMpICYmICJDYW5ub3QgY29udmVydCBmcm9tIHNjYWxhciB0by9mcm9tIHZlY3RvciIpOworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkgJiYgVHktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAiVGhpcyBpcyBhbiBpbGxlZ2FsIGZsb2F0aW5nIHBvaW50IHRvIHNpbnQgY2FzdCEiKTsKKyAgcmV0dXJuIGdldEZvbGRlZENhc3QoSW5zdHJ1Y3Rpb246OkZQVG9TSSwgQywgVHkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRQdHJUb0ludChDb25zdGFudCAqQywgY29uc3QgVHlwZSAqRHN0VHkpIHsKKyAgYXNzZXJ0KEMtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSAmJiAiUHRyVG9JbnQgc291cmNlIG11c3QgYmUgcG9pbnRlciIpOworICBhc3NlcnQoRHN0VHktPmlzSW50ZWdlclR5KCkgJiYgIlB0clRvSW50IGRlc3RpbmF0aW9uIG11c3QgYmUgaW50ZWdyYWwiKTsKKyAgcmV0dXJuIGdldEZvbGRlZENhc3QoSW5zdHJ1Y3Rpb246OlB0clRvSW50LCBDLCBEc3RUeSk7Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpEc3RUeSkgeworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpICYmICJJbnRUb1B0ciBzb3VyY2UgbXVzdCBiZSBpbnRlZ3JhbCIpOworICBhc3NlcnQoRHN0VHktPmlzUG9pbnRlclR5KCkgJiYgIkludFRvUHRyIGRlc3RpbmF0aW9uIG11c3QgYmUgYSBwb2ludGVyIik7CisgIHJldHVybiBnZXRGb2xkZWRDYXN0KEluc3RydWN0aW9uOjpJbnRUb1B0ciwgQywgRHN0VHkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KENvbnN0YW50ICpDLCBjb25zdCBUeXBlICpEc3RUeSkgeworICBhc3NlcnQoQ2FzdEluc3Q6OmNhc3RJc1ZhbGlkKEluc3RydWN0aW9uOjpCaXRDYXN0LCBDLCBEc3RUeSkgJiYKKyAgICAgICAgICJJbnZhbGlkIGNvbnN0YW50ZXhwciBiaXRjYXN0ISIpOworICAKKyAgLy8gSXQgaXMgY29tbW9uIHRvIGFzayBmb3IgYSBiaXRjYXN0IG9mIGEgdmFsdWUgdG8gaXRzIG93biB0eXBlLCBoYW5kbGUgdGhpcworICAvLyBzcGVlZGlseS4KKyAgaWYgKEMtPmdldFR5cGUoKSA9PSBEc3RUeSkgcmV0dXJuIEM7CisgIAorICByZXR1cm4gZ2V0Rm9sZGVkQ2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgQywgRHN0VHkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRUeShjb25zdCBUeXBlICpSZXFUeSwgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncykgeworICAvLyBDaGVjayB0aGUgb3BlcmFuZHMgZm9yIGNvbnNpc3RlbmN5IGZpcnN0CisgIGFzc2VydChPcGNvZGUgPj0gSW5zdHJ1Y3Rpb246OkJpbmFyeU9wc0JlZ2luICYmCisgICAgICAgICBPcGNvZGUgPCAgSW5zdHJ1Y3Rpb246OkJpbmFyeU9wc0VuZCAgICYmCisgICAgICAgICAiSW52YWxpZCBvcGNvZGUgaW4gYmluYXJ5IGNvbnN0YW50IGV4cHJlc3Npb24iKTsKKyAgYXNzZXJ0KEMxLT5nZXRUeXBlKCkgPT0gQzItPmdldFR5cGUoKSAmJgorICAgICAgICAgIk9wZXJhbmQgdHlwZXMgaW4gYmluYXJ5IGNvbnN0YW50IGV4cHJlc3Npb24gc2hvdWxkIG1hdGNoIik7CisKKyAgaWYgKFJlcVR5ID09IEMxLT5nZXRUeXBlKCkgfHwgUmVxVHkgPT0gVHlwZTo6Z2V0SW50MVR5KFJlcVR5LT5nZXRDb250ZXh0KCkpKQorICAgIGlmIChDb25zdGFudCAqRkMgPSBDb25zdGFudEZvbGRCaW5hcnlJbnN0cnVjdGlvbihPcGNvZGUsIEMxLCBDMikpCisgICAgICByZXR1cm4gRkM7ICAgICAgICAgIC8vIEZvbGQgYSBmZXcgY29tbW9uIGNhc2VzLi4uCisKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBhcmdWZWMoMSwgQzEpOyBhcmdWZWMucHVzaF9iYWNrKEMyKTsKKyAgRXhwck1hcEtleVR5cGUgS2V5KE9wY29kZSwgYXJnVmVjLCAwLCBGbGFncyk7CisgIAorICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gUmVxVHktPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcmV0dXJuIHBJbXBsLT5FeHByQ29uc3RhbnRzLmdldE9yQ3JlYXRlKFJlcVR5LCBLZXkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRDb21wYXJlVHkodW5zaWduZWQgc2hvcnQgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgIHN3aXRjaCAocHJlZGljYXRlKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBDbXBJbnN0IHByZWRpY2F0ZSIpOworICAgIGNhc2UgQ21wSW5zdDo6RkNNUF9GQUxTRTogY2FzZSBDbXBJbnN0OjpGQ01QX09FUTogY2FzZSBDbXBJbnN0OjpGQ01QX09HVDoKKyAgICBjYXNlIENtcEluc3Q6OkZDTVBfT0dFOiAgIGNhc2UgQ21wSW5zdDo6RkNNUF9PTFQ6IGNhc2UgQ21wSW5zdDo6RkNNUF9PTEU6CisgICAgY2FzZSBDbXBJbnN0OjpGQ01QX09ORTogICBjYXNlIENtcEluc3Q6OkZDTVBfT1JEOiBjYXNlIENtcEluc3Q6OkZDTVBfVU5POgorICAgIGNhc2UgQ21wSW5zdDo6RkNNUF9VRVE6ICAgY2FzZSBDbXBJbnN0OjpGQ01QX1VHVDogY2FzZSBDbXBJbnN0OjpGQ01QX1VHRToKKyAgICBjYXNlIENtcEluc3Q6OkZDTVBfVUxUOiAgIGNhc2UgQ21wSW5zdDo6RkNNUF9VTEU6IGNhc2UgQ21wSW5zdDo6RkNNUF9VTkU6CisgICAgY2FzZSBDbXBJbnN0OjpGQ01QX1RSVUU6CisgICAgICByZXR1cm4gZ2V0RkNtcChwcmVkaWNhdGUsIEMxLCBDMik7CisKKyAgICBjYXNlIENtcEluc3Q6OklDTVBfRVE6ICBjYXNlIENtcEluc3Q6OklDTVBfTkU6ICBjYXNlIENtcEluc3Q6OklDTVBfVUdUOgorICAgIGNhc2UgQ21wSW5zdDo6SUNNUF9VR0U6IGNhc2UgQ21wSW5zdDo6SUNNUF9VTFQ6IGNhc2UgQ21wSW5zdDo6SUNNUF9VTEU6CisgICAgY2FzZSBDbXBJbnN0OjpJQ01QX1NHVDogY2FzZSBDbXBJbnN0OjpJQ01QX1NHRTogY2FzZSBDbXBJbnN0OjpJQ01QX1NMVDoKKyAgICBjYXNlIENtcEluc3Q6OklDTVBfU0xFOgorICAgICAgcmV0dXJuIGdldElDbXAocHJlZGljYXRlLCBDMSwgQzIpOworICB9Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEV4cHI6OmdldCh1bnNpZ25lZCBPcGNvZGUsIENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzKSB7CisjaWZuZGVmIE5ERUJVRworICBzd2l0Y2ggKE9wY29kZSkgeworICBjYXNlIEluc3RydWN0aW9uOjpBZGQ6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN1YjoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6TXVsOgorICAgIGFzc2VydChDMS0+Z2V0VHlwZSgpID09IEMyLT5nZXRUeXBlKCkgJiYgIk9wIHR5cGVzIHNob3VsZCBiZSBpZGVudGljYWwhIik7CisgICAgYXNzZXJ0KEMxLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAgICJUcmllZCB0byBjcmVhdGUgYW4gaW50ZWdlciBvcGVyYXRpb24gb24gYSBub24taW50ZWdlciB0eXBlISIpOworICAgIGJyZWFrOworICBjYXNlIEluc3RydWN0aW9uOjpGQWRkOgorICBjYXNlIEluc3RydWN0aW9uOjpGU3ViOgorICBjYXNlIEluc3RydWN0aW9uOjpGTXVsOgorICAgIGFzc2VydChDMS0+Z2V0VHlwZSgpID09IEMyLT5nZXRUeXBlKCkgJiYgIk9wIHR5cGVzIHNob3VsZCBiZSBpZGVudGljYWwhIik7CisgICAgYXNzZXJ0KEMxLT5nZXRUeXBlKCktPmlzRlBPckZQVmVjdG9yVHkoKSAmJgorICAgICAgICAgICAiVHJpZWQgdG8gY3JlYXRlIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIG9uIGEgIgorICAgICAgICAgICAibm9uLWZsb2F0aW5nLXBvaW50IHR5cGUhIik7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVEaXY6IAorICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OiAKKyAgICBhc3NlcnQoQzEtPmdldFR5cGUoKSA9PSBDMi0+Z2V0VHlwZSgpICYmICJPcCB0eXBlcyBzaG91bGQgYmUgaWRlbnRpY2FsISIpOworICAgIGFzc2VydChDMS0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICAiVHJpZWQgdG8gY3JlYXRlIGFuIGFyaXRobWV0aWMgb3BlcmF0aW9uIG9uIGEgbm9uLWFyaXRobWV0aWMgdHlwZSEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RkRpdjoKKyAgICBhc3NlcnQoQzEtPmdldFR5cGUoKSA9PSBDMi0+Z2V0VHlwZSgpICYmICJPcCB0eXBlcyBzaG91bGQgYmUgaWRlbnRpY2FsISIpOworICAgIGFzc2VydChDMS0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgIlRyaWVkIHRvIGNyZWF0ZSBhbiBhcml0aG1ldGljIG9wZXJhdGlvbiBvbiBhIG5vbi1hcml0aG1ldGljIHR5cGUhIik7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06IAorICBjYXNlIEluc3RydWN0aW9uOjpTUmVtOiAKKyAgICBhc3NlcnQoQzEtPmdldFR5cGUoKSA9PSBDMi0+Z2V0VHlwZSgpICYmICJPcCB0eXBlcyBzaG91bGQgYmUgaWRlbnRpY2FsISIpOworICAgIGFzc2VydChDMS0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICAiVHJpZWQgdG8gY3JlYXRlIGFuIGFyaXRobWV0aWMgb3BlcmF0aW9uIG9uIGEgbm9uLWFyaXRobWV0aWMgdHlwZSEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlJlbToKKyAgICBhc3NlcnQoQzEtPmdldFR5cGUoKSA9PSBDMi0+Z2V0VHlwZSgpICYmICJPcCB0eXBlcyBzaG91bGQgYmUgaWRlbnRpY2FsISIpOworICAgIGFzc2VydChDMS0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgIlRyaWVkIHRvIGNyZWF0ZSBhbiBhcml0aG1ldGljIG9wZXJhdGlvbiBvbiBhIG5vbi1hcml0aG1ldGljIHR5cGUhIik7CisgICAgYnJlYWs7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkFuZDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6T3I6CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlhvcjoKKyAgICBhc3NlcnQoQzEtPmdldFR5cGUoKSA9PSBDMi0+Z2V0VHlwZSgpICYmICJPcCB0eXBlcyBzaG91bGQgYmUgaWRlbnRpY2FsISIpOworICAgIGFzc2VydChDMS0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICAiVHJpZWQgdG8gY3JlYXRlIGEgbG9naWNhbCBvcGVyYXRpb24gb24gYSBub24taW50ZWdyYWwgdHlwZSEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U2hsOgorICBjYXNlIEluc3RydWN0aW9uOjpMU2hyOgorICBjYXNlIEluc3RydWN0aW9uOjpBU2hyOgorICAgIGFzc2VydChDMS0+Z2V0VHlwZSgpID09IEMyLT5nZXRUeXBlKCkgJiYgIk9wIHR5cGVzIHNob3VsZCBiZSBpZGVudGljYWwhIik7CisgICAgYXNzZXJ0KEMxLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAgICJUcmllZCB0byBjcmVhdGUgYSBzaGlmdCBvcGVyYXRpb24gb24gYSBub24taW50ZWdlciB0eXBlISIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisjZW5kaWYKKworICByZXR1cm4gZ2V0VHkoQzEtPmdldFR5cGUoKSwgT3Bjb2RlLCBDMSwgQzIsIEZsYWdzKTsKK30KKworQ29uc3RhbnQqIENvbnN0YW50RXhwcjo6Z2V0U2l6ZU9mKGNvbnN0IFR5cGUqIFR5KSB7CisgIC8vIHNpemVvZiBpcyBpbXBsZW1lbnRlZCBhczogKGk2NCkgZ2VwIChUeSopbnVsbCwgMQorICAvLyBOb3RlIHRoYXQgYSBub24taW5ib3VuZHMgZ2VwIGlzIHVzZWQsIGFzIG51bGwgaXNuJ3Qgd2l0aGluIGFueSBvYmplY3QuCisgIENvbnN0YW50ICpHRVBJZHggPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoVHktPmdldENvbnRleHQoKSksIDEpOworICBDb25zdGFudCAqR0VQID0gZ2V0R2V0RWxlbWVudFB0cigKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5KSksICZHRVBJZHgsIDEpOworICByZXR1cm4gZ2V0UHRyVG9JbnQoR0VQLCAKKyAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDY0VHkoVHktPmdldENvbnRleHQoKSkpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRBbGlnbk9mKGNvbnN0IFR5cGUqIFR5KSB7CisgIC8vIGFsaWdub2YgaXMgaW1wbGVtZW50ZWQgYXM6IChpNjQpIGdlcCAoe2kxLFR5fSopbnVsbCwgMCwgMQorICAvLyBOb3RlIHRoYXQgYSBub24taW5ib3VuZHMgZ2VwIGlzIHVzZWQsIGFzIG51bGwgaXNuJ3Qgd2l0aGluIGFueSBvYmplY3QuCisgIGNvbnN0IFR5cGUgKkFsaWduaW5nVHkgPSBTdHJ1Y3RUeXBlOjpnZXQoVHktPmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50MVR5KFR5LT5nZXRDb250ZXh0KCkpLCBUeSwgTlVMTCk7CisgIENvbnN0YW50ICpOdWxsUHRyID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShBbGlnbmluZ1R5LT5nZXRQb2ludGVyVG8oKSk7CisgIENvbnN0YW50ICpaZXJvID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KFR5LT5nZXRDb250ZXh0KCkpLCAwKTsKKyAgQ29uc3RhbnQgKk9uZSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShUeS0+Z2V0Q29udGV4dCgpKSwgMSk7CisgIENvbnN0YW50ICpJbmRpY2VzWzJdID0geyBaZXJvLCBPbmUgfTsKKyAgQ29uc3RhbnQgKkdFUCA9IGdldEdldEVsZW1lbnRQdHIoTnVsbFB0ciwgSW5kaWNlcywgMik7CisgIHJldHVybiBnZXRQdHJUb0ludChHRVAsCisgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQ2NFR5KFR5LT5nZXRDb250ZXh0KCkpKTsKK30KKworQ29uc3RhbnQqIENvbnN0YW50RXhwcjo6Z2V0T2Zmc2V0T2YoY29uc3QgU3RydWN0VHlwZSogU1R5LCB1bnNpZ25lZCBGaWVsZE5vKSB7CisgIHJldHVybiBnZXRPZmZzZXRPZihTVHksIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShTVHktPmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRObykpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRPZmZzZXRPZihjb25zdCBUeXBlKiBUeSwgQ29uc3RhbnQgKkZpZWxkTm8pIHsKKyAgLy8gb2Zmc2V0b2YgaXMgaW1wbGVtZW50ZWQgYXM6IChpNjQpIGdlcCAoVHkqKW51bGwsIDAsIEZpZWxkTm8KKyAgLy8gTm90ZSB0aGF0IGEgbm9uLWluYm91bmRzIGdlcCBpcyB1c2VkLCBhcyBudWxsIGlzbid0IHdpdGhpbiBhbnkgb2JqZWN0LgorICBDb25zdGFudCAqR0VQSWR4W10gPSB7CisgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KFR5LT5nZXRDb250ZXh0KCkpLCAwKSwKKyAgICBGaWVsZE5vCisgIH07CisgIENvbnN0YW50ICpHRVAgPSBnZXRHZXRFbGVtZW50UHRyKAorICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoUG9pbnRlclR5cGU6OmdldFVucXVhbChUeSkpLCBHRVBJZHgsIDIpOworICByZXR1cm4gZ2V0UHRyVG9JbnQoR0VQLAorICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50NjRUeShUeS0+Z2V0Q29udGV4dCgpKSk7Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEV4cHI6OmdldENvbXBhcmUodW5zaWduZWQgc2hvcnQgcHJlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpIHsKKyAgYXNzZXJ0KEMxLT5nZXRUeXBlKCkgPT0gQzItPmdldFR5cGUoKSAmJiAiT3AgdHlwZXMgc2hvdWxkIGJlIGlkZW50aWNhbCEiKTsKKyAgcmV0dXJuIGdldENvbXBhcmVUeShwcmVkLCBDMSwgQzIpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRTZWxlY3RUeShjb25zdCBUeXBlICpSZXFUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqVjEsIENvbnN0YW50ICpWMikgeworICBhc3NlcnQoIVNlbGVjdEluc3Q6OmFyZUludmFsaWRPcGVyYW5kcyhDLCBWMSwgVjIpJiYiSW52YWxpZCBzZWxlY3Qgb3BlcmFuZHMiKTsKKworICBpZiAoUmVxVHkgPT0gVjEtPmdldFR5cGUoKSkKKyAgICBpZiAoQ29uc3RhbnQgKlNDID0gQ29uc3RhbnRGb2xkU2VsZWN0SW5zdHJ1Y3Rpb24oQywgVjEsIFYyKSkKKyAgICAgIHJldHVybiBTQzsgICAgICAgIC8vIEZvbGQgY29tbW9uIGNhc2VzCisKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBhcmdWZWMoMywgQyk7CisgIGFyZ1ZlY1sxXSA9IFYxOworICBhcmdWZWNbMl0gPSBWMjsKKyAgRXhwck1hcEtleVR5cGUgS2V5KEluc3RydWN0aW9uOjpTZWxlY3QsIGFyZ1ZlYyk7CisgIAorICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gUmVxVHktPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcmV0dXJuIHBJbXBsLT5FeHByQ29uc3RhbnRzLmdldE9yQ3JlYXRlKFJlcVR5LCBLZXkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyVHkoY29uc3QgVHlwZSAqUmVxVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBjb25zdCAqSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIHsKKyAgYXNzZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpnZXRJbmRleGVkVHlwZShDLT5nZXRUeXBlKCksIElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4cytOdW1JZHgpID09CisgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihSZXFUeSktPmdldEVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgICJHRVAgaW5kaWNlcyBpbnZhbGlkISIpOworCisgIGlmIChDb25zdGFudCAqRkMgPSBDb25zdGFudEZvbGRHZXRFbGVtZW50UHRyKEMsIC8qaW5Cb3VuZHM9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbnN0YW50KiopSWR4cywgTnVtSWR4KSkKKyAgICByZXR1cm4gRkM7ICAgICAgICAgIC8vIEZvbGQgYSBmZXcgY29tbW9uIGNhc2VzLi4uCisKKyAgYXNzZXJ0KEMtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSAmJgorICAgICAgICAgIk5vbi1wb2ludGVyIHR5cGUgZm9yIGNvbnN0YW50IEdldEVsZW1lbnRQdHIgZXhwcmVzc2lvbiIpOworICAvLyBMb29rIHVwIHRoZSBjb25zdGFudCBpbiB0aGUgdGFibGUgZmlyc3QgdG8gZW5zdXJlIHVuaXF1ZW5lc3MKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBBcmdWZWM7CisgIEFyZ1ZlYy5yZXNlcnZlKE51bUlkeCsxKTsKKyAgQXJnVmVjLnB1c2hfYmFjayhDKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1JZHg7ICsraSkKKyAgICBBcmdWZWMucHVzaF9iYWNrKGNhc3Q8Q29uc3RhbnQ+KElkeHNbaV0pKTsKKyAgY29uc3QgRXhwck1hcEtleVR5cGUgS2V5KEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyLCBBcmdWZWMpOworCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBSZXFUeS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICByZXR1cm4gcEltcGwtPkV4cHJDb25zdGFudHMuZ2V0T3JDcmVhdGUoUmVxVHksIEtleSk7Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0clR5KGNvbnN0IFR5cGUgKlJlcVR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqY29uc3QgKklkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIHsKKyAgYXNzZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpnZXRJbmRleGVkVHlwZShDLT5nZXRUeXBlKCksIElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4cytOdW1JZHgpID09CisgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihSZXFUeSktPmdldEVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgICJHRVAgaW5kaWNlcyBpbnZhbGlkISIpOworCisgIGlmIChDb25zdGFudCAqRkMgPSBDb25zdGFudEZvbGRHZXRFbGVtZW50UHRyKEMsIC8qaW5Cb3VuZHM9Ki90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnQqKilJZHhzLCBOdW1JZHgpKQorICAgIHJldHVybiBGQzsgICAgICAgICAgLy8gRm9sZCBhIGZldyBjb21tb24gY2FzZXMuLi4KKworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICYmCisgICAgICAgICAiTm9uLXBvaW50ZXIgdHlwZSBmb3IgY29uc3RhbnQgR2V0RWxlbWVudFB0ciBleHByZXNzaW9uIik7CisgIC8vIExvb2sgdXAgdGhlIGNvbnN0YW50IGluIHRoZSB0YWJsZSBmaXJzdCB0byBlbnN1cmUgdW5pcXVlbmVzcworICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEFyZ1ZlYzsKKyAgQXJnVmVjLnJlc2VydmUoTnVtSWR4KzEpOworICBBcmdWZWMucHVzaF9iYWNrKEMpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUlkeDsgKytpKQorICAgIEFyZ1ZlYy5wdXNoX2JhY2soY2FzdDxDb25zdGFudD4oSWR4c1tpXSkpOworICBjb25zdCBFeHByTWFwS2V5VHlwZSBLZXkoSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIsIEFyZ1ZlYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFUE9wZXJhdG9yOjpJc0luQm91bmRzKTsKKworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gUmVxVHktPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcmV0dXJuIHBJbXBsLT5FeHByQ29uc3RhbnRzLmdldE9yQ3JlYXRlKFJlcVR5LCBLZXkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKENvbnN0YW50ICpDLCBWYWx1ZSogY29uc3QgKklkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCkgeworICAvLyBHZXQgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZSBnZXRlbGVtZW50cHRyIQorICBjb25zdCBUeXBlICpUeSA9IAorICAgIEdldEVsZW1lbnRQdHJJbnN0OjpnZXRJbmRleGVkVHlwZShDLT5nZXRUeXBlKCksIElkeHMsIElkeHMrTnVtSWR4KTsKKyAgYXNzZXJ0KFR5ICYmICJHRVAgaW5kaWNlcyBpbnZhbGlkISIpOworICB1bnNpZ25lZCBBcyA9IGNhc3Q8UG9pbnRlclR5cGU+KEMtPmdldFR5cGUoKSktPmdldEFkZHJlc3NTcGFjZSgpOworICByZXR1cm4gZ2V0R2V0RWxlbWVudFB0clR5KFBvaW50ZXJUeXBlOjpnZXQoVHksIEFzKSwgQywgSWR4cywgTnVtSWR4KTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBjb25zdCAqSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIHsKKyAgLy8gR2V0IHRoZSByZXN1bHQgdHlwZSBvZiB0aGUgZ2V0ZWxlbWVudHB0ciEKKyAgY29uc3QgVHlwZSAqVHkgPSAKKyAgICBHZXRFbGVtZW50UHRySW5zdDo6Z2V0SW5kZXhlZFR5cGUoQy0+Z2V0VHlwZSgpLCBJZHhzLCBJZHhzK051bUlkeCk7CisgIGFzc2VydChUeSAmJiAiR0VQIGluZGljZXMgaW52YWxpZCEiKTsKKyAgdW5zaWduZWQgQXMgPSBjYXN0PFBvaW50ZXJUeXBlPihDLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgcmV0dXJuIGdldEluQm91bmRzR2V0RWxlbWVudFB0clR5KFBvaW50ZXJUeXBlOjpnZXQoVHksIEFzKSwgQywgSWR4cywgTnVtSWR4KTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihDb25zdGFudCAqQywgQ29uc3RhbnQqIGNvbnN0ICpJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIHsKKyAgcmV0dXJuIGdldEdldEVsZW1lbnRQdHIoQywgKFZhbHVlKiBjb25zdCAqKUlkeHMsIE51bUlkeCk7Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCogY29uc3QgKklkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4KSB7CisgIHJldHVybiBnZXRJbkJvdW5kc0dldEVsZW1lbnRQdHIoQywgKFZhbHVlKiBjb25zdCAqKUlkeHMsIE51bUlkeCk7Cit9CisKK0NvbnN0YW50ICoKK0NvbnN0YW50RXhwcjo6Z2V0SUNtcCh1bnNpZ25lZCBzaG9ydCBwcmVkLCBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSB7CisgIGFzc2VydChMSFMtPmdldFR5cGUoKSA9PSBSSFMtPmdldFR5cGUoKSk7CisgIGFzc2VydChwcmVkID49IElDbXBJbnN0OjpGSVJTVF9JQ01QX1BSRURJQ0FURSAmJiAKKyAgICAgICAgIHByZWQgPD0gSUNtcEluc3Q6OkxBU1RfSUNNUF9QUkVESUNBVEUgJiYgIkludmFsaWQgSUNtcCBQcmVkaWNhdGUiKTsKKworICBpZiAoQ29uc3RhbnQgKkZDID0gQ29uc3RhbnRGb2xkQ29tcGFyZUluc3RydWN0aW9uKHByZWQsIExIUywgUkhTKSkKKyAgICByZXR1cm4gRkM7ICAgICAgICAgIC8vIEZvbGQgYSBmZXcgY29tbW9uIGNhc2VzLi4uCisKKyAgLy8gTG9vayB1cCB0aGUgY29uc3RhbnQgaW4gdGhlIHRhYmxlIGZpcnN0IHRvIGVuc3VyZSB1bmlxdWVuZXNzCisgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gQXJnVmVjOworICBBcmdWZWMucHVzaF9iYWNrKExIUyk7CisgIEFyZ1ZlYy5wdXNoX2JhY2soUkhTKTsKKyAgLy8gR2V0IHRoZSBrZXkgdHlwZSB3aXRoIGJvdGggdGhlIG9wY29kZSBhbmQgcHJlZGljYXRlCisgIGNvbnN0IEV4cHJNYXBLZXlUeXBlIEtleShJbnN0cnVjdGlvbjo6SUNtcCwgQXJnVmVjLCBwcmVkKTsKKworICBjb25zdCBUeXBlICpSZXN1bHRUeSA9IFR5cGU6OmdldEludDFUeShMSFMtPmdldENvbnRleHQoKSk7CisgIGlmIChjb25zdCBWZWN0b3JUeXBlICpWVCA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KExIUy0+Z2V0VHlwZSgpKSkKKyAgICBSZXN1bHRUeSA9IFZlY3RvclR5cGU6OmdldChSZXN1bHRUeSwgVlQtPmdldE51bUVsZW1lbnRzKCkpOworCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBMSFMtPmdldFR5cGUoKS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICByZXR1cm4gcEltcGwtPkV4cHJDb25zdGFudHMuZ2V0T3JDcmVhdGUoUmVzdWx0VHksIEtleSk7Cit9CisKK0NvbnN0YW50ICoKK0NvbnN0YW50RXhwcjo6Z2V0RkNtcCh1bnNpZ25lZCBzaG9ydCBwcmVkLCBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSB7CisgIGFzc2VydChMSFMtPmdldFR5cGUoKSA9PSBSSFMtPmdldFR5cGUoKSk7CisgIGFzc2VydChwcmVkIDw9IEZDbXBJbnN0OjpMQVNUX0ZDTVBfUFJFRElDQVRFICYmICJJbnZhbGlkIEZDbXAgUHJlZGljYXRlIik7CisKKyAgaWYgKENvbnN0YW50ICpGQyA9IENvbnN0YW50Rm9sZENvbXBhcmVJbnN0cnVjdGlvbihwcmVkLCBMSFMsIFJIUykpCisgICAgcmV0dXJuIEZDOyAgICAgICAgICAvLyBGb2xkIGEgZmV3IGNvbW1vbiBjYXNlcy4uLgorCisgIC8vIExvb2sgdXAgdGhlIGNvbnN0YW50IGluIHRoZSB0YWJsZSBmaXJzdCB0byBlbnN1cmUgdW5pcXVlbmVzcworICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEFyZ1ZlYzsKKyAgQXJnVmVjLnB1c2hfYmFjayhMSFMpOworICBBcmdWZWMucHVzaF9iYWNrKFJIUyk7CisgIC8vIEdldCB0aGUga2V5IHR5cGUgd2l0aCBib3RoIHRoZSBvcGNvZGUgYW5kIHByZWRpY2F0ZQorICBjb25zdCBFeHByTWFwS2V5VHlwZSBLZXkoSW5zdHJ1Y3Rpb246OkZDbXAsIEFyZ1ZlYywgcHJlZCk7CisKKyAgY29uc3QgVHlwZSAqUmVzdWx0VHkgPSBUeXBlOjpnZXRJbnQxVHkoTEhTLT5nZXRDb250ZXh0KCkpOworICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqVlQgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihMSFMtPmdldFR5cGUoKSkpCisgICAgUmVzdWx0VHkgPSBWZWN0b3JUeXBlOjpnZXQoUmVzdWx0VHksIFZULT5nZXROdW1FbGVtZW50cygpKTsKKworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gTEhTLT5nZXRUeXBlKCktPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcmV0dXJuIHBJbXBsLT5FeHByQ29uc3RhbnRzLmdldE9yQ3JlYXRlKFJlc3VsdFR5LCBLZXkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0RWxlbWVudFR5KGNvbnN0IFR5cGUgKlJlcVR5LCBDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqSWR4KSB7CisgIGlmIChDb25zdGFudCAqRkMgPSBDb25zdGFudEZvbGRFeHRyYWN0RWxlbWVudEluc3RydWN0aW9uKFZhbCwgSWR4KSkKKyAgICByZXR1cm4gRkM7ICAgICAgICAgIC8vIEZvbGQgYSBmZXcgY29tbW9uIGNhc2VzLgorICAvLyBMb29rIHVwIHRoZSBjb25zdGFudCBpbiB0aGUgdGFibGUgZmlyc3QgdG8gZW5zdXJlIHVuaXF1ZW5lc3MKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBBcmdWZWMoMSwgVmFsKTsKKyAgQXJnVmVjLnB1c2hfYmFjayhJZHgpOworICBjb25zdCBFeHByTWFwS2V5VHlwZSBLZXkoSW5zdHJ1Y3Rpb246OkV4dHJhY3RFbGVtZW50LEFyZ1ZlYyk7CisgIAorICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gUmVxVHktPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcmV0dXJuIHBJbXBsLT5FeHByQ29uc3RhbnRzLmdldE9yQ3JlYXRlKFJlcVR5LCBLZXkpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0RWxlbWVudChDb25zdGFudCAqVmFsLCBDb25zdGFudCAqSWR4KSB7CisgIGFzc2VydChWYWwtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpICYmCisgICAgICAgICAiVHJpZWQgdG8gY3JlYXRlIGV4dHJhY3RlbGVtZW50IG9wZXJhdGlvbiBvbiBub24tdmVjdG9yIHR5cGUhIik7CisgIGFzc2VydChJZHgtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoMzIpICYmCisgICAgICAgICAiRXh0cmFjdGVsZW1lbnQgaW5kZXggbXVzdCBiZSBpMzIgdHlwZSEiKTsKKyAgcmV0dXJuIGdldEV4dHJhY3RFbGVtZW50VHkoY2FzdDxWZWN0b3JUeXBlPihWYWwtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbCwgSWR4KTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0RWxlbWVudFR5KGNvbnN0IFR5cGUgKlJlcVR5LCBDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpFbHQsIENvbnN0YW50ICpJZHgpIHsKKyAgaWYgKENvbnN0YW50ICpGQyA9IENvbnN0YW50Rm9sZEluc2VydEVsZW1lbnRJbnN0cnVjdGlvbihWYWwsIEVsdCwgSWR4KSkKKyAgICByZXR1cm4gRkM7ICAgICAgICAgIC8vIEZvbGQgYSBmZXcgY29tbW9uIGNhc2VzLgorICAvLyBMb29rIHVwIHRoZSBjb25zdGFudCBpbiB0aGUgdGFibGUgZmlyc3QgdG8gZW5zdXJlIHVuaXF1ZW5lc3MKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBBcmdWZWMoMSwgVmFsKTsKKyAgQXJnVmVjLnB1c2hfYmFjayhFbHQpOworICBBcmdWZWMucHVzaF9iYWNrKElkeCk7CisgIGNvbnN0IEV4cHJNYXBLZXlUeXBlIEtleShJbnN0cnVjdGlvbjo6SW5zZXJ0RWxlbWVudCxBcmdWZWMpOworICAKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IFJlcVR5LT5nZXRDb250ZXh0KCkucEltcGw7CisgIHJldHVybiBwSW1wbC0+RXhwckNvbnN0YW50cy5nZXRPckNyZWF0ZShSZXFUeSwgS2V5KTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0RWxlbWVudChDb25zdGFudCAqVmFsLCBDb25zdGFudCAqRWx0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKklkeCkgeworICBhc3NlcnQoVmFsLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSAmJgorICAgICAgICAgIlRyaWVkIHRvIGNyZWF0ZSBpbnNlcnRlbGVtZW50IG9wZXJhdGlvbiBvbiBub24tdmVjdG9yIHR5cGUhIik7CisgIGFzc2VydChFbHQtPmdldFR5cGUoKSA9PSBjYXN0PFZlY3RvclR5cGU+KFZhbC0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKQorICAgICAgICAgJiYgIkluc2VydGVsZW1lbnQgdHlwZXMgbXVzdCBtYXRjaCEiKTsKKyAgYXNzZXJ0KElkeC0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgzMikgJiYKKyAgICAgICAgICJJbnNlcnRlbGVtZW50IGluZGV4IG11c3QgYmUgaTMyIHR5cGUhIik7CisgIHJldHVybiBnZXRJbnNlcnRFbGVtZW50VHkoVmFsLT5nZXRUeXBlKCksIFZhbCwgRWx0LCBJZHgpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRTaHVmZmxlVmVjdG9yVHkoY29uc3QgVHlwZSAqUmVxVHksIENvbnN0YW50ICpWMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqVjIsIENvbnN0YW50ICpNYXNrKSB7CisgIGlmIChDb25zdGFudCAqRkMgPSBDb25zdGFudEZvbGRTaHVmZmxlVmVjdG9ySW5zdHJ1Y3Rpb24oVjEsIFYyLCBNYXNrKSkKKyAgICByZXR1cm4gRkM7ICAgICAgICAgIC8vIEZvbGQgYSBmZXcgY29tbW9uIGNhc2VzLi4uCisgIC8vIExvb2sgdXAgdGhlIGNvbnN0YW50IGluIHRoZSB0YWJsZSBmaXJzdCB0byBlbnN1cmUgdW5pcXVlbmVzcworICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEFyZ1ZlYygxLCBWMSk7CisgIEFyZ1ZlYy5wdXNoX2JhY2soVjIpOworICBBcmdWZWMucHVzaF9iYWNrKE1hc2spOworICBjb25zdCBFeHByTWFwS2V5VHlwZSBLZXkoSW5zdHJ1Y3Rpb246OlNodWZmbGVWZWN0b3IsQXJnVmVjKTsKKyAgCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBSZXFUeS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICByZXR1cm4gcEltcGwtPkV4cHJDb25zdGFudHMuZ2V0T3JDcmVhdGUoUmVxVHksIEtleSk7Cit9CisKK0NvbnN0YW50ICpDb25zdGFudEV4cHI6OmdldFNodWZmbGVWZWN0b3IoQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTWFzaykgeworICBhc3NlcnQoU2h1ZmZsZVZlY3Rvckluc3Q6OmlzVmFsaWRPcGVyYW5kcyhWMSwgVjIsIE1hc2spICYmCisgICAgICAgICAiSW52YWxpZCBzaHVmZmxlIHZlY3RvciBjb25zdGFudCBleHByIG9wZXJhbmRzISIpOworCisgIHVuc2lnbmVkIE5FbHRzID0gY2FzdDxWZWN0b3JUeXBlPihNYXNrLT5nZXRUeXBlKCkpLT5nZXROdW1FbGVtZW50cygpOworICBjb25zdCBUeXBlICpFbHRUeSA9IGNhc3Q8VmVjdG9yVHlwZT4oVjEtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgIGNvbnN0IFR5cGUgKlNodWZUeSA9IFZlY3RvclR5cGU6OmdldChFbHRUeSwgTkVsdHMpOworICByZXR1cm4gZ2V0U2h1ZmZsZVZlY3RvclR5KFNodWZUeSwgVjEsIFYyLCBNYXNrKTsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0VmFsdWVUeShjb25zdCBUeXBlICpSZXFUeSwgQ29uc3RhbnQgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqSWR4cywgdW5zaWduZWQgTnVtSWR4KSB7CisgIGFzc2VydChFeHRyYWN0VmFsdWVJbnN0OjpnZXRJbmRleGVkVHlwZShBZ2ctPmdldFR5cGUoKSwgSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkeHMrTnVtSWR4KSA9PSBWYWwtPmdldFR5cGUoKSAmJgorICAgICAgICAgImluc2VydHZhbHVlIGluZGljZXMgaW52YWxpZCEiKTsKKyAgYXNzZXJ0KEFnZy0+Z2V0VHlwZSgpID09IFJlcVR5ICYmCisgICAgICAgICAiaW5zZXJ0dmFsdWUgdHlwZSBpbnZhbGlkISIpOworICBhc3NlcnQoQWdnLT5nZXRUeXBlKCktPmlzRmlyc3RDbGFzc1R5cGUoKSAmJgorICAgICAgICAgIk5vbi1maXJzdC1jbGFzcyB0eXBlIGZvciBjb25zdGFudCBJbnNlcnRWYWx1ZSBleHByZXNzaW9uIik7CisgIENvbnN0YW50ICpGQyA9IENvbnN0YW50Rm9sZEluc2VydFZhbHVlSW5zdHJ1Y3Rpb24oQWdnLCBWYWwsIElkeHMsIE51bUlkeCk7CisgIGFzc2VydChGQyAmJiAiSW5zZXJ0VmFsdWUgY29uc3RhbnQgZXhwciBjb3VsZG4ndCBiZSBmb2xkZWQhIik7CisgIHJldHVybiBGQzsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0VmFsdWUoQ29uc3RhbnQgKkFnZywgQ29uc3RhbnQgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqSWR4TGlzdCwgdW5zaWduZWQgTnVtSWR4KSB7CisgIGFzc2VydChBZ2ctPmdldFR5cGUoKS0+aXNGaXJzdENsYXNzVHlwZSgpICYmCisgICAgICAgICAiVHJpZWQgdG8gY3JlYXRlIGluc2VydGVsZW1lbnQgb3BlcmF0aW9uIG9uIG5vbi1maXJzdC1jbGFzcyB0eXBlISIpOworCisgIGNvbnN0IFR5cGUgKlJlcVR5ID0gQWdnLT5nZXRUeXBlKCk7CisjaWZuZGVmIE5ERUJVRworICBjb25zdCBUeXBlICpWYWxUeSA9CisgICAgRXh0cmFjdFZhbHVlSW5zdDo6Z2V0SW5kZXhlZFR5cGUoQWdnLT5nZXRUeXBlKCksIElkeExpc3QsIElkeExpc3QrTnVtSWR4KTsKKyNlbmRpZgorICBhc3NlcnQoVmFsVHkgPT0gVmFsLT5nZXRUeXBlKCkgJiYgImluc2VydHZhbHVlIGluZGljZXMgaW52YWxpZCEiKTsKKyAgcmV0dXJuIGdldEluc2VydFZhbHVlVHkoUmVxVHksIEFnZywgVmFsLCBJZHhMaXN0LCBOdW1JZHgpOworfQorCitDb25zdGFudCAqQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0VmFsdWVUeShjb25zdCBUeXBlICpSZXFUeSwgQ29uc3RhbnQgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqSWR4cywgdW5zaWduZWQgTnVtSWR4KSB7CisgIGFzc2VydChFeHRyYWN0VmFsdWVJbnN0OjpnZXRJbmRleGVkVHlwZShBZ2ctPmdldFR5cGUoKSwgSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkeHMrTnVtSWR4KSA9PSBSZXFUeSAmJgorICAgICAgICAgImV4dHJhY3R2YWx1ZSBpbmRpY2VzIGludmFsaWQhIik7CisgIGFzc2VydChBZ2ctPmdldFR5cGUoKS0+aXNGaXJzdENsYXNzVHlwZSgpICYmCisgICAgICAgICAiTm9uLWZpcnN0LWNsYXNzIHR5cGUgZm9yIGNvbnN0YW50IGV4dHJhY3R2YWx1ZSBleHByZXNzaW9uIik7CisgIENvbnN0YW50ICpGQyA9IENvbnN0YW50Rm9sZEV4dHJhY3RWYWx1ZUluc3RydWN0aW9uKEFnZywgSWR4cywgTnVtSWR4KTsKKyAgYXNzZXJ0KEZDICYmICJFeHRyYWN0VmFsdWUgY29uc3RhbnQgZXhwciBjb3VsZG4ndCBiZSBmb2xkZWQhIik7CisgIHJldHVybiBGQzsKK30KKworQ29uc3RhbnQgKkNvbnN0YW50RXhwcjo6Z2V0RXh0cmFjdFZhbHVlKENvbnN0YW50ICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKklkeExpc3QsIHVuc2lnbmVkIE51bUlkeCkgeworICBhc3NlcnQoQWdnLT5nZXRUeXBlKCktPmlzRmlyc3RDbGFzc1R5cGUoKSAmJgorICAgICAgICAgIlRyaWVkIHRvIGNyZWF0ZSBleHRyYWN0ZWxlbWVudCBvcGVyYXRpb24gb24gbm9uLWZpcnN0LWNsYXNzIHR5cGUhIik7CisKKyAgY29uc3QgVHlwZSAqUmVxVHkgPQorICAgIEV4dHJhY3RWYWx1ZUluc3Q6OmdldEluZGV4ZWRUeXBlKEFnZy0+Z2V0VHlwZSgpLCBJZHhMaXN0LCBJZHhMaXN0K051bUlkeCk7CisgIGFzc2VydChSZXFUeSAmJiAiZXh0cmFjdHZhbHVlIGluZGljZXMgaW52YWxpZCEiKTsKKyAgcmV0dXJuIGdldEV4dHJhY3RWYWx1ZVR5KFJlcVR5LCBBZ2csIElkeExpc3QsIE51bUlkeCk7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldE5lZyhDb25zdGFudCogQykgeworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgIkNhbm5vdCBORUcgYSBub25pbnRlZ3JhbCB2YWx1ZSEiKTsKKyAgcmV0dXJuIGdldChJbnN0cnVjdGlvbjo6U3ViLAorICAgICAgICAgICAgIENvbnN0YW50RlA6OmdldFplcm9WYWx1ZUZvck5lZ2F0aW9uKEMtPmdldFR5cGUoKSksCisgICAgICAgICAgICAgQyk7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldEZOZWcoQ29uc3RhbnQqIEMpIHsKKyAgYXNzZXJ0KEMtPmdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICAiQ2Fubm90IEZORUcgYSBub24tZmxvYXRpbmctcG9pbnQgdmFsdWUhIik7CisgIHJldHVybiBnZXQoSW5zdHJ1Y3Rpb246OkZTdWIsCisgICAgICAgICAgICAgQ29uc3RhbnRGUDo6Z2V0WmVyb1ZhbHVlRm9yTmVnYXRpb24oQy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICBDKTsKK30KKworQ29uc3RhbnQqIENvbnN0YW50RXhwcjo6Z2V0Tm90KENvbnN0YW50KiBDKSB7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAiQ2Fubm90IE5PVCBhIG5vbmludGVncmFsIHZhbHVlISIpOworICByZXR1cm4gZ2V0KEluc3RydWN0aW9uOjpYb3IsIEMsIENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoQy0+Z2V0VHlwZSgpKSk7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldEFkZChDb25zdGFudCogQzEsIENvbnN0YW50KiBDMikgeworICByZXR1cm4gZ2V0KEluc3RydWN0aW9uOjpBZGQsIEMxLCBDMik7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldEZBZGQoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldChJbnN0cnVjdGlvbjo6RkFkZCwgQzEsIEMyKTsKK30KKworQ29uc3RhbnQqIENvbnN0YW50RXhwcjo6Z2V0U3ViKENvbnN0YW50KiBDMSwgQ29uc3RhbnQqIEMyKSB7CisgIHJldHVybiBnZXQoSW5zdHJ1Y3Rpb246OlN1YiwgQzEsIEMyKTsKK30KKworQ29uc3RhbnQqIENvbnN0YW50RXhwcjo6Z2V0RlN1YihDb25zdGFudCogQzEsIENvbnN0YW50KiBDMikgeworICByZXR1cm4gZ2V0KEluc3RydWN0aW9uOjpGU3ViLCBDMSwgQzIpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRNdWwoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldChJbnN0cnVjdGlvbjo6TXVsLCBDMSwgQzIpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRGTXVsKENvbnN0YW50KiBDMSwgQ29uc3RhbnQqIEMyKSB7CisgIHJldHVybiBnZXQoSW5zdHJ1Y3Rpb246OkZNdWwsIEMxLCBDMik7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldFVEaXYoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldChJbnN0cnVjdGlvbjo6VURpdiwgQzEsIEMyKTsKK30KKworQ29uc3RhbnQqIENvbnN0YW50RXhwcjo6Z2V0U0RpdihDb25zdGFudCogQzEsIENvbnN0YW50KiBDMikgeworICByZXR1cm4gZ2V0KEluc3RydWN0aW9uOjpTRGl2LCBDMSwgQzIpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRGRGl2KENvbnN0YW50KiBDMSwgQ29uc3RhbnQqIEMyKSB7CisgIHJldHVybiBnZXQoSW5zdHJ1Y3Rpb246OkZEaXYsIEMxLCBDMik7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldFVSZW0oQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldChJbnN0cnVjdGlvbjo6VVJlbSwgQzEsIEMyKTsKK30KKworQ29uc3RhbnQqIENvbnN0YW50RXhwcjo6Z2V0U1JlbShDb25zdGFudCogQzEsIENvbnN0YW50KiBDMikgeworICByZXR1cm4gZ2V0KEluc3RydWN0aW9uOjpTUmVtLCBDMSwgQzIpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRGUmVtKENvbnN0YW50KiBDMSwgQ29uc3RhbnQqIEMyKSB7CisgIHJldHVybiBnZXQoSW5zdHJ1Y3Rpb246OkZSZW0sIEMxLCBDMik7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldEFuZChDb25zdGFudCogQzEsIENvbnN0YW50KiBDMikgeworICByZXR1cm4gZ2V0KEluc3RydWN0aW9uOjpBbmQsIEMxLCBDMik7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldE9yKENvbnN0YW50KiBDMSwgQ29uc3RhbnQqIEMyKSB7CisgIHJldHVybiBnZXQoSW5zdHJ1Y3Rpb246Ok9yLCBDMSwgQzIpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRYb3IoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldChJbnN0cnVjdGlvbjo6WG9yLCBDMSwgQzIpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRTaGwoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldChJbnN0cnVjdGlvbjo6U2hsLCBDMSwgQzIpOworfQorCitDb25zdGFudCogQ29uc3RhbnRFeHByOjpnZXRMU2hyKENvbnN0YW50KiBDMSwgQ29uc3RhbnQqIEMyKSB7CisgIHJldHVybiBnZXQoSW5zdHJ1Y3Rpb246OkxTaHIsIEMxLCBDMik7Cit9CisKK0NvbnN0YW50KiBDb25zdGFudEV4cHI6OmdldEFTaHIoQ29uc3RhbnQqIEMxLCBDb25zdGFudCogQzIpIHsKKyAgcmV0dXJuIGdldChJbnN0cnVjdGlvbjo6QVNociwgQzEsIEMyKTsKK30KKworLy8gZGVzdHJveUNvbnN0YW50IC0gUmVtb3ZlIHRoZSBjb25zdGFudCBmcm9tIHRoZSBjb25zdGFudCB0YWJsZS4uLgorLy8KK3ZvaWQgQ29uc3RhbnRFeHByOjpkZXN0cm95Q29uc3RhbnQoKSB7CisgIGdldFJhd1R5cGUoKS0+Z2V0Q29udGV4dCgpLnBJbXBsLT5FeHByQ29uc3RhbnRzLnJlbW92ZSh0aGlzKTsKKyAgZGVzdHJveUNvbnN0YW50SW1wbCgpOworfQorCitjb25zdCBjaGFyICpDb25zdGFudEV4cHI6OmdldE9wY29kZU5hbWUoKSBjb25zdCB7CisgIHJldHVybiBJbnN0cnVjdGlvbjo6Z2V0T3Bjb2RlTmFtZShnZXRPcGNvZGUoKSk7Cit9CisKKworCitHZXRFbGVtZW50UHRyQ29uc3RhbnRFeHByOjoKK0dldEVsZW1lbnRQdHJDb25zdGFudEV4cHIoQ29uc3RhbnQgKkMsIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJklkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKkRlc3RUeSkKKyAgOiBDb25zdGFudEV4cHIoRGVzdFR5LCBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0ciwKKyAgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxHZXRFbGVtZW50UHRyQ29uc3RhbnRFeHByPjo6b3BfZW5kKHRoaXMpCisgICAgICAgICAgICAgICAgIC0gKElkeExpc3Quc2l6ZSgpKzEpLCBJZHhMaXN0LnNpemUoKSsxKSB7CisgIE9wZXJhbmRMaXN0WzBdID0gQzsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgRSA9IElkeExpc3Quc2l6ZSgpOyBpICE9IEU7ICsraSkKKyAgICBPcGVyYW5kTGlzdFtpKzFdID0gSWR4TGlzdFtpXTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgcmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50IGltcGxlbWVudGF0aW9ucworCisvLy8gcmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50IC0gVXBkYXRlIHRoaXMgY29uc3RhbnQgYXJyYXkgdG8gY2hhbmdlIHVzZXMgb2YKKy8vLyAnRnJvbScgdG8gYmUgdXNlcyBvZiAnVG8nLiAgVGhpcyBtdXN0IHVwZGF0ZSB0aGUgdW5pcXVpbmcgZGF0YSBzdHJ1Y3R1cmVzCisvLy8gZXRjLgorLy8vCisvLy8gTm90ZSB0aGF0IHdlIGludGVudGlvbmFsbHkgcmVwbGFjZSBhbGwgdXNlcyBvZiBGcm9tIHdpdGggVG8gaGVyZS4gIENvbnNpZGVyCisvLy8gYSBsYXJnZSBhcnJheSB0aGF0IHVzZXMgJ0Zyb20nIDEwMDAgdGltZXMuICBCeSBoYW5kbGluZyB0aGlzIGNhc2UgYWxsIGhlcmUsCisvLy8gQ29uc3RhbnRBcnJheTo6cmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50IGlzIG9ubHkgaW52b2tlZCBvbmNlLCBhbmQgdGhhdAorLy8vIHNpbmdsZSBpbnZvY2F0aW9uIGhhbmRsZXMgYWxsIDEwMDAgdXNlcy4gIEhhbmRsaW5nIHRoZW0gb25lIGF0IGEgdGltZSB3b3VsZAorLy8vIHdvcmssIGJ1dCB3b3VsZCBiZSByZWFsbHkgc2xvdyBiZWNhdXNlIGl0IHdvdWxkIGhhdmUgdG8gdW5pcXVlIGVhY2ggdXBkYXRlZAorLy8vIGFycmF5IGluc3RhbmNlLgorLy8vCit2b2lkIENvbnN0YW50QXJyYXk6OnJlcGxhY2VVc2VzT2ZXaXRoT25Db25zdGFudChWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlICpVKSB7CisgIGFzc2VydChpc2E8Q29uc3RhbnQ+KFRvKSAmJiAiQ2Fubm90IG1ha2UgQ29uc3RhbnQgcmVmZXIgdG8gbm9uLWNvbnN0YW50ISIpOworICBDb25zdGFudCAqVG9DID0gY2FzdDxDb25zdGFudD4oVG8pOworCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBnZXRSYXdUeXBlKCktPmdldENvbnRleHQoKS5wSW1wbDsKKworICBzdGQ6OnBhaXI8TExWTUNvbnRleHRJbXBsOjpBcnJheUNvbnN0YW50c1R5OjpNYXBLZXksIENvbnN0YW50QXJyYXkqPiBMb29rdXA7CisgIExvb2t1cC5maXJzdC5maXJzdCA9IGNhc3Q8QXJyYXlUeXBlPihnZXRSYXdUeXBlKCkpOworICBMb29rdXAuc2Vjb25kID0gdGhpczsKKworICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICZWYWx1ZXMgPSBMb29rdXAuZmlyc3Quc2Vjb25kOworICBWYWx1ZXMucmVzZXJ2ZShnZXROdW1PcGVyYW5kcygpKTsgIC8vIEJ1aWxkIHJlcGxhY2VtZW50IGFycmF5LgorCisgIC8vIEZpbGwgdmFsdWVzIHdpdGggdGhlIG1vZGlmaWVkIG9wZXJhbmRzIG9mIHRoZSBjb25zdGFudCBhcnJheS4gIEFsc28sIAorICAvLyBjb21wdXRlIHdoZXRoZXIgdGhpcyB0dXJucyBpbnRvIGFuIGFsbC16ZXJvcyBhcnJheS4KKyAgYm9vbCBpc0FsbFplcm9zID0gZmFsc2U7CisgIHVuc2lnbmVkIE51bVVwZGF0ZWQgPSAwOworICBpZiAoIVRvQy0+aXNOdWxsVmFsdWUoKSkgeworICAgIGZvciAoVXNlICpPID0gT3BlcmFuZExpc3QsICpFID0gT3BlcmFuZExpc3QrZ2V0TnVtT3BlcmFuZHMoKTsgTyAhPSBFOyArK08pIHsKKyAgICAgIENvbnN0YW50ICpWYWwgPSBjYXN0PENvbnN0YW50PihPLT5nZXQoKSk7CisgICAgICBpZiAoVmFsID09IEZyb20pIHsKKyAgICAgICAgVmFsID0gVG9DOworICAgICAgICArK051bVVwZGF0ZWQ7CisgICAgICB9CisgICAgICBWYWx1ZXMucHVzaF9iYWNrKFZhbCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlzQWxsWmVyb3MgPSB0cnVlOworICAgIGZvciAoVXNlICpPID0gT3BlcmFuZExpc3QsICpFID0gT3BlcmFuZExpc3QrZ2V0TnVtT3BlcmFuZHMoKTtPICE9IEU7ICsrTykgeworICAgICAgQ29uc3RhbnQgKlZhbCA9IGNhc3Q8Q29uc3RhbnQ+KE8tPmdldCgpKTsKKyAgICAgIGlmIChWYWwgPT0gRnJvbSkgeworICAgICAgICBWYWwgPSBUb0M7CisgICAgICAgICsrTnVtVXBkYXRlZDsKKyAgICAgIH0KKyAgICAgIFZhbHVlcy5wdXNoX2JhY2soVmFsKTsKKyAgICAgIGlmIChpc0FsbFplcm9zKSBpc0FsbFplcm9zID0gVmFsLT5pc051bGxWYWx1ZSgpOworICAgIH0KKyAgfQorICAKKyAgQ29uc3RhbnQgKlJlcGxhY2VtZW50ID0gMDsKKyAgaWYgKGlzQWxsWmVyb3MpIHsKKyAgICBSZXBsYWNlbWVudCA9IENvbnN0YW50QWdncmVnYXRlWmVybzo6Z2V0KGdldFJhd1R5cGUoKSk7CisgIH0gZWxzZSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgdGhpcyBhcnJheSB0eXBlIGFscmVhZHkuCisgICAgYm9vbCBFeGlzdHM7CisgICAgTExWTUNvbnRleHRJbXBsOjpBcnJheUNvbnN0YW50c1R5OjpNYXBUeTo6aXRlcmF0b3IgSSA9CisgICAgICBwSW1wbC0+QXJyYXlDb25zdGFudHMuSW5zZXJ0T3JHZXRJdGVtKExvb2t1cCwgRXhpc3RzKTsKKyAgICAKKyAgICBpZiAoRXhpc3RzKSB7CisgICAgICBSZXBsYWNlbWVudCA9IEktPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gT2theSwgdGhlIG5ldyBzaGFwZSBkb2Vzbid0IGV4aXN0IGluIHRoZSBzeXN0ZW0geWV0LiAgSW5zdGVhZCBvZgorICAgICAgLy8gY3JlYXRpbmcgYSBuZXcgY29uc3RhbnQgYXJyYXksIGluc2VydGluZyBpdCwgcmVwbGFjZWFsbHVzZXNvZidpbmcgdGhlCisgICAgICAvLyBvbGQgd2l0aCB0aGUgbmV3LCB0aGVuIGRlbGV0aW5nIHRoZSBvbGQuLi4ganVzdCB1cGRhdGUgdGhlIGN1cnJlbnQgb25lCisgICAgICAvLyBpbiBwbGFjZSEKKyAgICAgIHBJbXBsLT5BcnJheUNvbnN0YW50cy5Nb3ZlQ29uc3RhbnRUb05ld1Nsb3QodGhpcywgSSk7CisgICAgICAKKyAgICAgIC8vIFVwZGF0ZSB0byB0aGUgbmV3IHZhbHVlLiAgT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZW4gd2UgaGF2ZSBhIHNpbmdsZQorICAgICAgLy8gb3BlcmFuZCB0aGF0IHdlJ3JlIGNoYW5naW5nLCBidXQgaGFuZGxlIGJ1bGsgdXBkYXRlcyBlZmZpY2llbnRseS4KKyAgICAgIGlmIChOdW1VcGRhdGVkID09IDEpIHsKKyAgICAgICAgdW5zaWduZWQgT3BlcmFuZFRvVXBkYXRlID0gVSAtIE9wZXJhbmRMaXN0OworICAgICAgICBhc3NlcnQoZ2V0T3BlcmFuZChPcGVyYW5kVG9VcGRhdGUpID09IEZyb20gJiYKKyAgICAgICAgICAgICAgICJSZXBsYWNlQWxsVXNlc1dpdGggYnJva2VuISIpOworICAgICAgICBzZXRPcGVyYW5kKE9wZXJhbmRUb1VwZGF0ZSwgVG9DKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBpZiAoZ2V0T3BlcmFuZChpKSA9PSBGcm9tKQorICAgICAgICAgICAgc2V0T3BlcmFuZChpLCBUb0MpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorIAorICAvLyBPdGhlcndpc2UsIEkgZG8gbmVlZCB0byByZXBsYWNlIHRoaXMgd2l0aCBhbiBleGlzdGluZyB2YWx1ZS4KKyAgYXNzZXJ0KFJlcGxhY2VtZW50ICE9IHRoaXMgJiYgIkkgZGlkbid0IGNvbnRhaW4gRnJvbSEiKTsKKyAgCisgIC8vIEV2ZXJ5b25lIHVzaW5nIHRoaXMgbm93IHVzZXMgdGhlIHJlcGxhY2VtZW50LgorICB1bmNoZWNrZWRSZXBsYWNlQWxsVXNlc1dpdGgoUmVwbGFjZW1lbnQpOworICAKKyAgLy8gRGVsZXRlIHRoZSBvbGQgY29uc3RhbnQhCisgIGRlc3Ryb3lDb25zdGFudCgpOworfQorCit2b2lkIENvbnN0YW50U3RydWN0OjpyZXBsYWNlVXNlc09mV2l0aE9uQ29uc3RhbnQoVmFsdWUgKkZyb20sIFZhbHVlICpUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgKlUpIHsKKyAgYXNzZXJ0KGlzYTxDb25zdGFudD4oVG8pICYmICJDYW5ub3QgbWFrZSBDb25zdGFudCByZWZlciB0byBub24tY29uc3RhbnQhIik7CisgIENvbnN0YW50ICpUb0MgPSBjYXN0PENvbnN0YW50PihUbyk7CisKKyAgdW5zaWduZWQgT3BlcmFuZFRvVXBkYXRlID0gVS1PcGVyYW5kTGlzdDsKKyAgYXNzZXJ0KGdldE9wZXJhbmQoT3BlcmFuZFRvVXBkYXRlKSA9PSBGcm9tICYmICJSZXBsYWNlQWxsVXNlc1dpdGggYnJva2VuISIpOworCisgIHN0ZDo6cGFpcjxMTFZNQ29udGV4dEltcGw6OlN0cnVjdENvbnN0YW50c1R5OjpNYXBLZXksIENvbnN0YW50U3RydWN0Kj4gTG9va3VwOworICBMb29rdXAuZmlyc3QuZmlyc3QgPSBjYXN0PFN0cnVjdFR5cGU+KGdldFJhd1R5cGUoKSk7CisgIExvb2t1cC5zZWNvbmQgPSB0aGlzOworICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICZWYWx1ZXMgPSBMb29rdXAuZmlyc3Quc2Vjb25kOworICBWYWx1ZXMucmVzZXJ2ZShnZXROdW1PcGVyYW5kcygpKTsgIC8vIEJ1aWxkIHJlcGxhY2VtZW50IHN0cnVjdC4KKyAgCisgIAorICAvLyBGaWxsIHZhbHVlcyB3aXRoIHRoZSBtb2RpZmllZCBvcGVyYW5kcyBvZiB0aGUgY29uc3RhbnQgc3RydWN0LiAgQWxzbywgCisgIC8vIGNvbXB1dGUgd2hldGhlciB0aGlzIHR1cm5zIGludG8gYW4gYWxsLXplcm9zIHN0cnVjdC4KKyAgYm9vbCBpc0FsbFplcm9zID0gZmFsc2U7CisgIGlmICghVG9DLT5pc051bGxWYWx1ZSgpKSB7CisgICAgZm9yIChVc2UgKk8gPSBPcGVyYW5kTGlzdCwgKkUgPSBPcGVyYW5kTGlzdCArIGdldE51bU9wZXJhbmRzKCk7IE8gIT0gRTsgKytPKQorICAgICAgVmFsdWVzLnB1c2hfYmFjayhjYXN0PENvbnN0YW50PihPLT5nZXQoKSkpOworICB9IGVsc2UgeworICAgIGlzQWxsWmVyb3MgPSB0cnVlOworICAgIGZvciAoVXNlICpPID0gT3BlcmFuZExpc3QsICpFID0gT3BlcmFuZExpc3QrZ2V0TnVtT3BlcmFuZHMoKTsgTyAhPSBFOyArK08pIHsKKyAgICAgIENvbnN0YW50ICpWYWwgPSBjYXN0PENvbnN0YW50PihPLT5nZXQoKSk7CisgICAgICBWYWx1ZXMucHVzaF9iYWNrKFZhbCk7CisgICAgICBpZiAoaXNBbGxaZXJvcykgaXNBbGxaZXJvcyA9IFZhbC0+aXNOdWxsVmFsdWUoKTsKKyAgICB9CisgIH0KKyAgVmFsdWVzW09wZXJhbmRUb1VwZGF0ZV0gPSBUb0M7CisgIAorICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gZ2V0UmF3VHlwZSgpLT5nZXRDb250ZXh0KCkucEltcGw7CisgIAorICBDb25zdGFudCAqUmVwbGFjZW1lbnQgPSAwOworICBpZiAoaXNBbGxaZXJvcykgeworICAgIFJlcGxhY2VtZW50ID0gQ29uc3RhbnRBZ2dyZWdhdGVaZXJvOjpnZXQoZ2V0UmF3VHlwZSgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSB0aGlzIHN0cnVjdCB0eXBlIGFscmVhZHkuCisgICAgYm9vbCBFeGlzdHM7CisgICAgTExWTUNvbnRleHRJbXBsOjpTdHJ1Y3RDb25zdGFudHNUeTo6TWFwVHk6Oml0ZXJhdG9yIEkgPQorICAgICAgcEltcGwtPlN0cnVjdENvbnN0YW50cy5JbnNlcnRPckdldEl0ZW0oTG9va3VwLCBFeGlzdHMpOworICAgIAorICAgIGlmIChFeGlzdHMpIHsKKyAgICAgIFJlcGxhY2VtZW50ID0gSS0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPa2F5LCB0aGUgbmV3IHNoYXBlIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHN5c3RlbSB5ZXQuICBJbnN0ZWFkIG9mCisgICAgICAvLyBjcmVhdGluZyBhIG5ldyBjb25zdGFudCBzdHJ1Y3QsIGluc2VydGluZyBpdCwgcmVwbGFjZWFsbHVzZXNvZidpbmcgdGhlCisgICAgICAvLyBvbGQgd2l0aCB0aGUgbmV3LCB0aGVuIGRlbGV0aW5nIHRoZSBvbGQuLi4ganVzdCB1cGRhdGUgdGhlIGN1cnJlbnQgb25lCisgICAgICAvLyBpbiBwbGFjZSEKKyAgICAgIHBJbXBsLT5TdHJ1Y3RDb25zdGFudHMuTW92ZUNvbnN0YW50VG9OZXdTbG90KHRoaXMsIEkpOworICAgICAgCisgICAgICAvLyBVcGRhdGUgdG8gdGhlIG5ldyB2YWx1ZS4KKyAgICAgIHNldE9wZXJhbmQoT3BlcmFuZFRvVXBkYXRlLCBUb0MpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAKKyAgYXNzZXJ0KFJlcGxhY2VtZW50ICE9IHRoaXMgJiYgIkkgZGlkbid0IGNvbnRhaW4gRnJvbSEiKTsKKyAgCisgIC8vIEV2ZXJ5b25lIHVzaW5nIHRoaXMgbm93IHVzZXMgdGhlIHJlcGxhY2VtZW50LgorICB1bmNoZWNrZWRSZXBsYWNlQWxsVXNlc1dpdGgoUmVwbGFjZW1lbnQpOworICAKKyAgLy8gRGVsZXRlIHRoZSBvbGQgY29uc3RhbnQhCisgIGRlc3Ryb3lDb25zdGFudCgpOworfQorCit2b2lkIENvbnN0YW50VW5pb246OnJlcGxhY2VVc2VzT2ZXaXRoT25Db25zdGFudChWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSAqVSkgeworICBhc3NlcnQoaXNhPENvbnN0YW50PihUbykgJiYgIkNhbm5vdCBtYWtlIENvbnN0YW50IHJlZmVyIHRvIG5vbi1jb25zdGFudCEiKTsKKyAgQ29uc3RhbnQgKlRvQyA9IGNhc3Q8Q29uc3RhbnQ+KFRvKTsKKworICBhc3NlcnQoVSA9PSBPcGVyYW5kTGlzdCAmJiAiVW5pb24gY29uc3RhbnRzIGNhbiBvbmx5IGhhdmUgb25lIHVzZSEiKTsKKyAgYXNzZXJ0KGdldE51bU9wZXJhbmRzKCkgPT0gMSAmJiAiVW5pb24gY29uc3RhbnRzIGNhbiBvbmx5IGhhdmUgb25lIHVzZSEiKTsKKyAgYXNzZXJ0KGdldE9wZXJhbmQoMCkgPT0gRnJvbSAmJiAiUmVwbGFjZUFsbFVzZXNXaXRoIGJyb2tlbiEiKTsKKworICBzdGQ6OnBhaXI8TExWTUNvbnRleHRJbXBsOjpVbmlvbkNvbnN0YW50c1R5OjpNYXBLZXksIENvbnN0YW50VW5pb24qPiBMb29rdXA7CisgIExvb2t1cC5maXJzdC5maXJzdCA9IGNhc3Q8VW5pb25UeXBlPihnZXRSYXdUeXBlKCkpOworICBMb29rdXAuc2Vjb25kID0gdGhpczsKKyAgTG9va3VwLmZpcnN0LnNlY29uZCA9IFRvQzsKKworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gZ2V0UmF3VHlwZSgpLT5nZXRDb250ZXh0KCkucEltcGw7CisKKyAgQ29uc3RhbnQgKlJlcGxhY2VtZW50ID0gMDsKKyAgaWYgKFRvQy0+aXNOdWxsVmFsdWUoKSkgeworICAgIFJlcGxhY2VtZW50ID0gQ29uc3RhbnRBZ2dyZWdhdGVaZXJvOjpnZXQoZ2V0UmF3VHlwZSgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSB0aGlzIHVuaW9uIHR5cGUgYWxyZWFkeS4KKyAgICBib29sIEV4aXN0czsKKyAgICBMTFZNQ29udGV4dEltcGw6OlVuaW9uQ29uc3RhbnRzVHk6Ok1hcFR5OjppdGVyYXRvciBJID0KKyAgICAgIHBJbXBsLT5VbmlvbkNvbnN0YW50cy5JbnNlcnRPckdldEl0ZW0oTG9va3VwLCBFeGlzdHMpOworICAgIAorICAgIGlmIChFeGlzdHMpIHsKKyAgICAgIFJlcGxhY2VtZW50ID0gSS0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPa2F5LCB0aGUgbmV3IHNoYXBlIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHN5c3RlbSB5ZXQuICBJbnN0ZWFkIG9mCisgICAgICAvLyBjcmVhdGluZyBhIG5ldyBjb25zdGFudCB1bmlvbiwgaW5zZXJ0aW5nIGl0LCByZXBsYWNlYWxsdXNlc29mJ2luZyB0aGUKKyAgICAgIC8vIG9sZCB3aXRoIHRoZSBuZXcsIHRoZW4gZGVsZXRpbmcgdGhlIG9sZC4uLiBqdXN0IHVwZGF0ZSB0aGUgY3VycmVudCBvbmUKKyAgICAgIC8vIGluIHBsYWNlIQorICAgICAgcEltcGwtPlVuaW9uQ29uc3RhbnRzLk1vdmVDb25zdGFudFRvTmV3U2xvdCh0aGlzLCBJKTsKKyAgICAgIAorICAgICAgLy8gVXBkYXRlIHRvIHRoZSBuZXcgdmFsdWUuCisgICAgICBzZXRPcGVyYW5kKDAsIFRvQyk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIAorICBhc3NlcnQoUmVwbGFjZW1lbnQgIT0gdGhpcyAmJiAiSSBkaWRuJ3QgY29udGFpbiBGcm9tISIpOworICAKKyAgLy8gRXZlcnlvbmUgdXNpbmcgdGhpcyBub3cgdXNlcyB0aGUgcmVwbGFjZW1lbnQuCisgIHVuY2hlY2tlZFJlcGxhY2VBbGxVc2VzV2l0aChSZXBsYWNlbWVudCk7CisgIAorICAvLyBEZWxldGUgdGhlIG9sZCBjb25zdGFudCEKKyAgZGVzdHJveUNvbnN0YW50KCk7Cit9CisKK3ZvaWQgQ29uc3RhbnRWZWN0b3I6OnJlcGxhY2VVc2VzT2ZXaXRoT25Db25zdGFudChWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSAqVSkgeworICBhc3NlcnQoaXNhPENvbnN0YW50PihUbykgJiYgIkNhbm5vdCBtYWtlIENvbnN0YW50IHJlZmVyIHRvIG5vbi1jb25zdGFudCEiKTsKKyAgCisgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gVmFsdWVzOworICBWYWx1ZXMucmVzZXJ2ZShnZXROdW1PcGVyYW5kcygpKTsgIC8vIEJ1aWxkIHJlcGxhY2VtZW50IGFycmF5Li4uCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIENvbnN0YW50ICpWYWwgPSBnZXRPcGVyYW5kKGkpOworICAgIGlmIChWYWwgPT0gRnJvbSkgVmFsID0gY2FzdDxDb25zdGFudD4oVG8pOworICAgIFZhbHVlcy5wdXNoX2JhY2soVmFsKTsKKyAgfQorICAKKyAgQ29uc3RhbnQgKlJlcGxhY2VtZW50ID0gZ2V0KGNhc3Q8VmVjdG9yVHlwZT4oZ2V0UmF3VHlwZSgpKSwgVmFsdWVzKTsKKyAgYXNzZXJ0KFJlcGxhY2VtZW50ICE9IHRoaXMgJiYgIkkgZGlkbid0IGNvbnRhaW4gRnJvbSEiKTsKKyAgCisgIC8vIEV2ZXJ5b25lIHVzaW5nIHRoaXMgbm93IHVzZXMgdGhlIHJlcGxhY2VtZW50LgorICB1bmNoZWNrZWRSZXBsYWNlQWxsVXNlc1dpdGgoUmVwbGFjZW1lbnQpOworICAKKyAgLy8gRGVsZXRlIHRoZSBvbGQgY29uc3RhbnQhCisgIGRlc3Ryb3lDb25zdGFudCgpOworfQorCit2b2lkIENvbnN0YW50RXhwcjo6cmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50KFZhbHVlICpGcm9tLCBWYWx1ZSAqVG9WLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgKlUpIHsKKyAgYXNzZXJ0KGlzYTxDb25zdGFudD4oVG9WKSAmJiAiQ2Fubm90IG1ha2UgQ29uc3RhbnQgcmVmZXIgdG8gbm9uLWNvbnN0YW50ISIpOworICBDb25zdGFudCAqVG8gPSBjYXN0PENvbnN0YW50PihUb1YpOworICAKKyAgQ29uc3RhbnQgKlJlcGxhY2VtZW50ID0gMDsKKyAgaWYgKGdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyKSB7CisgICAgU21hbGxWZWN0b3I8Q29uc3RhbnQqLCA4PiBJbmRpY2VzOworICAgIENvbnN0YW50ICpQb2ludGVyID0gZ2V0T3BlcmFuZCgwKTsKKyAgICBJbmRpY2VzLnJlc2VydmUoZ2V0TnVtT3BlcmFuZHMoKS0xKTsKKyAgICBpZiAoUG9pbnRlciA9PSBGcm9tKSBQb2ludGVyID0gVG87CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBDb25zdGFudCAqVmFsID0gZ2V0T3BlcmFuZChpKTsKKyAgICAgIGlmIChWYWwgPT0gRnJvbSkgVmFsID0gVG87CisgICAgICBJbmRpY2VzLnB1c2hfYmFjayhWYWwpOworICAgIH0KKyAgICBSZXBsYWNlbWVudCA9IENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihQb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbmRpY2VzWzBdLCBJbmRpY2VzLnNpemUoKSk7CisgIH0gZWxzZSBpZiAoZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkV4dHJhY3RWYWx1ZSkgeworICAgIENvbnN0YW50ICpBZ2cgPSBnZXRPcGVyYW5kKDApOworICAgIGlmIChBZ2cgPT0gRnJvbSkgQWdnID0gVG87CisgICAgCisgICAgY29uc3QgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+ICZJbmRpY2VzID0gZ2V0SW5kaWNlcygpOworICAgIFJlcGxhY2VtZW50ID0gQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0VmFsdWUoQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluZGljZXNbMF0sIEluZGljZXMuc2l6ZSgpKTsKKyAgfSBlbHNlIGlmIChnZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW5zZXJ0VmFsdWUpIHsKKyAgICBDb25zdGFudCAqQWdnID0gZ2V0T3BlcmFuZCgwKTsKKyAgICBDb25zdGFudCAqVmFsID0gZ2V0T3BlcmFuZCgxKTsKKyAgICBpZiAoQWdnID09IEZyb20pIEFnZyA9IFRvOworICAgIGlmIChWYWwgPT0gRnJvbSkgVmFsID0gVG87CisgICAgCisgICAgY29uc3QgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+ICZJbmRpY2VzID0gZ2V0SW5kaWNlcygpOworICAgIFJlcGxhY2VtZW50ID0gQ29uc3RhbnRFeHByOjpnZXRJbnNlcnRWYWx1ZShBZ2csIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluZGljZXNbMF0sIEluZGljZXMuc2l6ZSgpKTsKKyAgfSBlbHNlIGlmIChpc0Nhc3QoKSkgeworICAgIGFzc2VydChnZXRPcGVyYW5kKDApID09IEZyb20gJiYgIkNhc3Qgb25seSBoYXMgb25lIHVzZSEiKTsKKyAgICBSZXBsYWNlbWVudCA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChnZXRPcGNvZGUoKSwgVG8sIGdldFJhd1R5cGUoKSk7CisgIH0gZWxzZSBpZiAoZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNlbGVjdCkgeworICAgIENvbnN0YW50ICpDMSA9IGdldE9wZXJhbmQoMCk7CisgICAgQ29uc3RhbnQgKkMyID0gZ2V0T3BlcmFuZCgxKTsKKyAgICBDb25zdGFudCAqQzMgPSBnZXRPcGVyYW5kKDIpOworICAgIGlmIChDMSA9PSBGcm9tKSBDMSA9IFRvOworICAgIGlmIChDMiA9PSBGcm9tKSBDMiA9IFRvOworICAgIGlmIChDMyA9PSBGcm9tKSBDMyA9IFRvOworICAgIFJlcGxhY2VtZW50ID0gQ29uc3RhbnRFeHByOjpnZXRTZWxlY3QoQzEsIEMyLCBDMyk7CisgIH0gZWxzZSBpZiAoZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkV4dHJhY3RFbGVtZW50KSB7CisgICAgQ29uc3RhbnQgKkMxID0gZ2V0T3BlcmFuZCgwKTsKKyAgICBDb25zdGFudCAqQzIgPSBnZXRPcGVyYW5kKDEpOworICAgIGlmIChDMSA9PSBGcm9tKSBDMSA9IFRvOworICAgIGlmIChDMiA9PSBGcm9tKSBDMiA9IFRvOworICAgIFJlcGxhY2VtZW50ID0gQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0RWxlbWVudChDMSwgQzIpOworICB9IGVsc2UgaWYgKGdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50KSB7CisgICAgQ29uc3RhbnQgKkMxID0gZ2V0T3BlcmFuZCgwKTsKKyAgICBDb25zdGFudCAqQzIgPSBnZXRPcGVyYW5kKDEpOworICAgIENvbnN0YW50ICpDMyA9IGdldE9wZXJhbmQoMSk7CisgICAgaWYgKEMxID09IEZyb20pIEMxID0gVG87CisgICAgaWYgKEMyID09IEZyb20pIEMyID0gVG87CisgICAgaWYgKEMzID09IEZyb20pIEMzID0gVG87CisgICAgUmVwbGFjZW1lbnQgPSBDb25zdGFudEV4cHI6OmdldEluc2VydEVsZW1lbnQoQzEsIEMyLCBDMyk7CisgIH0gZWxzZSBpZiAoZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNodWZmbGVWZWN0b3IpIHsKKyAgICBDb25zdGFudCAqQzEgPSBnZXRPcGVyYW5kKDApOworICAgIENvbnN0YW50ICpDMiA9IGdldE9wZXJhbmQoMSk7CisgICAgQ29uc3RhbnQgKkMzID0gZ2V0T3BlcmFuZCgyKTsKKyAgICBpZiAoQzEgPT0gRnJvbSkgQzEgPSBUbzsKKyAgICBpZiAoQzIgPT0gRnJvbSkgQzIgPSBUbzsKKyAgICBpZiAoQzMgPT0gRnJvbSkgQzMgPSBUbzsKKyAgICBSZXBsYWNlbWVudCA9IENvbnN0YW50RXhwcjo6Z2V0U2h1ZmZsZVZlY3RvcihDMSwgQzIsIEMzKTsKKyAgfSBlbHNlIGlmIChpc0NvbXBhcmUoKSkgeworICAgIENvbnN0YW50ICpDMSA9IGdldE9wZXJhbmQoMCk7CisgICAgQ29uc3RhbnQgKkMyID0gZ2V0T3BlcmFuZCgxKTsKKyAgICBpZiAoQzEgPT0gRnJvbSkgQzEgPSBUbzsKKyAgICBpZiAoQzIgPT0gRnJvbSkgQzIgPSBUbzsKKyAgICBpZiAoZ2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OklDbXApCisgICAgICBSZXBsYWNlbWVudCA9IENvbnN0YW50RXhwcjo6Z2V0SUNtcChnZXRQcmVkaWNhdGUoKSwgQzEsIEMyKTsKKyAgICBlbHNlIHsKKyAgICAgIGFzc2VydChnZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkNtcCk7CisgICAgICBSZXBsYWNlbWVudCA9IENvbnN0YW50RXhwcjo6Z2V0RkNtcChnZXRQcmVkaWNhdGUoKSwgQzEsIEMyKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZ2V0TnVtT3BlcmFuZHMoKSA9PSAyKSB7CisgICAgQ29uc3RhbnQgKkMxID0gZ2V0T3BlcmFuZCgwKTsKKyAgICBDb25zdGFudCAqQzIgPSBnZXRPcGVyYW5kKDEpOworICAgIGlmIChDMSA9PSBGcm9tKSBDMSA9IFRvOworICAgIGlmIChDMiA9PSBGcm9tKSBDMiA9IFRvOworICAgIFJlcGxhY2VtZW50ID0gQ29uc3RhbnRFeHByOjpnZXQoZ2V0T3Bjb2RlKCksIEMxLCBDMiwgU3ViY2xhc3NPcHRpb25hbERhdGEpOworICB9IGVsc2UgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gQ29uc3RhbnRFeHByIHR5cGUhIik7CisgICAgcmV0dXJuOworICB9CisgIAorICBhc3NlcnQoUmVwbGFjZW1lbnQgIT0gdGhpcyAmJiAiSSBkaWRuJ3QgY29udGFpbiBGcm9tISIpOworICAKKyAgLy8gRXZlcnlvbmUgdXNpbmcgdGhpcyBub3cgdXNlcyB0aGUgcmVwbGFjZW1lbnQuCisgIHVuY2hlY2tlZFJlcGxhY2VBbGxVc2VzV2l0aChSZXBsYWNlbWVudCk7CisgIAorICAvLyBEZWxldGUgdGhlIG9sZCBjb25zdGFudCEKKyAgZGVzdHJveUNvbnN0YW50KCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0NvbnN0YW50c0NvbnRleHQuaCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvQ29uc3RhbnRzQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmVhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL0NvbnN0YW50c0NvbnRleHQuaApAQCAtMCwwICsxLDg0MyBAQAorLy89PT0tLSBDb25zdGFudHNDb250ZXh0LmggLSBDb25zdGFudHMtcmVsYXRlZCBDb250ZXh0IEludGVyYWxzIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdmFyaW91cyBoZWxwZXIgbWV0aG9kcyBhbmQgY2xhc3NlcyB1c2VkIGJ5CisvLyBMTFZNQ29udGV4dEltcGwgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBjb25zdGFudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPTlNUQU5UU0NPTlRFWFRfSAorI2RlZmluZSBMTFZNX0NPTlNUQU5UU0NPTlRFWFRfSAorCisjaW5jbHVkZSAibGx2bS9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGU8Y2xhc3MgVmFsVHlwZT4KK3N0cnVjdCBDb25zdGFudFRyYWl0czsKKworLy8vIFVuYXJ5Q29uc3RhbnRFeHByIC0gVGhpcyBjbGFzcyBpcyBwcml2YXRlIHRvIENvbnN0YW50cy5jcHAsIGFuZCBpcyB1c2VkCisvLy8gYmVoaW5kIHRoZSBzY2VuZXMgdG8gaW1wbGVtZW50IHVuYXJ5IGNvbnN0YW50IGV4cHJzLgorY2xhc3MgVW5hcnlDb25zdGFudEV4cHIgOiBwdWJsaWMgQ29uc3RhbnRFeHByIHsKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdW5zaWduZWQpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSBvbmUgb3BlcmFuZAorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDEpOworICB9CisgIFVuYXJ5Q29uc3RhbnRFeHByKHVuc2lnbmVkIE9wY29kZSwgQ29uc3RhbnQgKkMsIGNvbnN0IFR5cGUgKlR5KQorICAgIDogQ29uc3RhbnRFeHByKFR5LCBPcGNvZGUsICZPcDwwPigpLCAxKSB7CisgICAgT3A8MD4oKSA9IEM7CisgIH0KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7Cit9OworCisvLy8gQmluYXJ5Q29uc3RhbnRFeHByIC0gVGhpcyBjbGFzcyBpcyBwcml2YXRlIHRvIENvbnN0YW50cy5jcHAsIGFuZCBpcyB1c2VkCisvLy8gYmVoaW5kIHRoZSBzY2VuZXMgdG8gaW1wbGVtZW50IGJpbmFyeSBjb25zdGFudCBleHBycy4KK2NsYXNzIEJpbmFyeUNvbnN0YW50RXhwciA6IHB1YmxpYyBDb25zdGFudEV4cHIgeworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCB1bnNpZ25lZCk7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwdWJsaWM6CisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHR3byBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDIpOworICB9CisgIEJpbmFyeUNvbnN0YW50RXhwcih1bnNpZ25lZCBPcGNvZGUsIENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MpCisgICAgOiBDb25zdGFudEV4cHIoQzEtPmdldFR5cGUoKSwgT3Bjb2RlLCAmT3A8MD4oKSwgMikgeworICAgIE9wPDA+KCkgPSBDMTsKKyAgICBPcDwxPigpID0gQzI7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPSBGbGFnczsKKyAgfQorICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7Cit9OworCisvLy8gU2VsZWN0Q29uc3RhbnRFeHByIC0gVGhpcyBjbGFzcyBpcyBwcml2YXRlIHRvIENvbnN0YW50cy5jcHAsIGFuZCBpcyB1c2VkCisvLy8gYmVoaW5kIHRoZSBzY2VuZXMgdG8gaW1wbGVtZW50IHNlbGVjdCBjb25zdGFudCBleHBycy4KK2NsYXNzIFNlbGVjdENvbnN0YW50RXhwciA6IHB1YmxpYyBDb25zdGFudEV4cHIgeworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCB1bnNpZ25lZCk7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwdWJsaWM6CisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHRocmVlIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMyk7CisgIH0KKyAgU2VsZWN0Q29uc3RhbnRFeHByKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLCBDb25zdGFudCAqQzMpCisgICAgOiBDb25zdGFudEV4cHIoQzItPmdldFR5cGUoKSwgSW5zdHJ1Y3Rpb246OlNlbGVjdCwgJk9wPDA+KCksIDMpIHsKKyAgICBPcDwwPigpID0gQzE7CisgICAgT3A8MT4oKSA9IEMyOworICAgIE9wPDI+KCkgPSBDMzsKKyAgfQorICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7Cit9OworCisvLy8gRXh0cmFjdEVsZW1lbnRDb25zdGFudEV4cHIgLSBUaGlzIGNsYXNzIGlzIHByaXZhdGUgdG8KKy8vLyBDb25zdGFudHMuY3BwLCBhbmQgaXMgdXNlZCBiZWhpbmQgdGhlIHNjZW5lcyB0byBpbXBsZW1lbnQKKy8vLyBleHRyYWN0ZWxlbWVudCBjb25zdGFudCBleHBycy4KK2NsYXNzIEV4dHJhY3RFbGVtZW50Q29uc3RhbnRFeHByIDogcHVibGljIENvbnN0YW50RXhwciB7CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgdHdvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMik7CisgIH0KKyAgRXh0cmFjdEVsZW1lbnRDb25zdGFudEV4cHIoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpCisgICAgOiBDb25zdGFudEV4cHIoY2FzdDxWZWN0b3JUeXBlPihDMS0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwgCisgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkV4dHJhY3RFbGVtZW50LCAmT3A8MD4oKSwgMikgeworICAgIE9wPDA+KCkgPSBDMTsKKyAgICBPcDwxPigpID0gQzI7CisgIH0KKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworfTsKKworLy8vIEluc2VydEVsZW1lbnRDb25zdGFudEV4cHIgLSBUaGlzIGNsYXNzIGlzIHByaXZhdGUgdG8KKy8vLyBDb25zdGFudHMuY3BwLCBhbmQgaXMgdXNlZCBiZWhpbmQgdGhlIHNjZW5lcyB0byBpbXBsZW1lbnQKKy8vLyBpbnNlcnRlbGVtZW50IGNvbnN0YW50IGV4cHJzLgorY2xhc3MgSW5zZXJ0RWxlbWVudENvbnN0YW50RXhwciA6IHB1YmxpYyBDb25zdGFudEV4cHIgeworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCB1bnNpZ25lZCk7ICAvLyBETyBOT1QgSU1QTEVNRU5UCitwdWJsaWM6CisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHRocmVlIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMyk7CisgIH0KKyAgSW5zZXJ0RWxlbWVudENvbnN0YW50RXhwcihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMiwgQ29uc3RhbnQgKkMzKQorICAgIDogQ29uc3RhbnRFeHByKEMxLT5nZXRUeXBlKCksIEluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50LCAKKyAgICAgICAgICAgICAgICAgICAmT3A8MD4oKSwgMykgeworICAgIE9wPDA+KCkgPSBDMTsKKyAgICBPcDwxPigpID0gQzI7CisgICAgT3A8Mj4oKSA9IEMzOworICB9CisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKK307CisKKy8vLyBTaHVmZmxlVmVjdG9yQ29uc3RhbnRFeHByIC0gVGhpcyBjbGFzcyBpcyBwcml2YXRlIHRvCisvLy8gQ29uc3RhbnRzLmNwcCwgYW5kIGlzIHVzZWQgYmVoaW5kIHRoZSBzY2VuZXMgdG8gaW1wbGVtZW50CisvLy8gc2h1ZmZsZXZlY3RvciBjb25zdGFudCBleHBycy4KK2NsYXNzIFNodWZmbGVWZWN0b3JDb25zdGFudEV4cHIgOiBwdWJsaWMgQ29uc3RhbnRFeHByIHsKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdW5zaWduZWQpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0aHJlZSBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDMpOworICB9CisgIFNodWZmbGVWZWN0b3JDb25zdGFudEV4cHIoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIsIENvbnN0YW50ICpDMykKKyAgOiBDb25zdGFudEV4cHIoVmVjdG9yVHlwZTo6Z2V0KAorICAgICAgICAgICAgICAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oQzEtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgY2FzdDxWZWN0b3JUeXBlPihDMy0+Z2V0VHlwZSgpKS0+Z2V0TnVtRWxlbWVudHMoKSksCisgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpTaHVmZmxlVmVjdG9yLCAKKyAgICAgICAgICAgICAgICAgJk9wPDA+KCksIDMpIHsKKyAgICBPcDwwPigpID0gQzE7CisgICAgT3A8MT4oKSA9IEMyOworICAgIE9wPDI+KCkgPSBDMzsKKyAgfQorICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7Cit9OworCisvLy8gRXh0cmFjdFZhbHVlQ29uc3RhbnRFeHByIC0gVGhpcyBjbGFzcyBpcyBwcml2YXRlIHRvCisvLy8gQ29uc3RhbnRzLmNwcCwgYW5kIGlzIHVzZWQgYmVoaW5kIHRoZSBzY2VuZXMgdG8gaW1wbGVtZW50CisvLy8gZXh0cmFjdHZhbHVlIGNvbnN0YW50IGV4cHJzLgorY2xhc3MgRXh0cmFjdFZhbHVlQ29uc3RhbnRFeHByIDogcHVibGljIENvbnN0YW50RXhwciB7CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgb25lIG9wZXJhbmQKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAxKTsKKyAgfQorICBFeHRyYWN0VmFsdWVDb25zdGFudEV4cHIoQ29uc3RhbnQgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKkRlc3RUeSkKKyAgICA6IENvbnN0YW50RXhwcihEZXN0VHksIEluc3RydWN0aW9uOjpFeHRyYWN0VmFsdWUsICZPcDwwPigpLCAxKSwKKyAgICAgIEluZGljZXMoSWR4TGlzdCkgeworICAgIE9wPDA+KCkgPSBBZ2c7CisgIH0KKworICAvLy8gSW5kaWNlcyAtIFRoZXNlIGlkZW50aWZ5IHdoaWNoIHZhbHVlIHRvIGV4dHJhY3QuCisgIGNvbnN0IFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJbmRpY2VzOworCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKK307CisKKy8vLyBJbnNlcnRWYWx1ZUNvbnN0YW50RXhwciAtIFRoaXMgY2xhc3MgaXMgcHJpdmF0ZSB0bworLy8vIENvbnN0YW50cy5jcHAsIGFuZCBpcyB1c2VkIGJlaGluZCB0aGUgc2NlbmVzIHRvIGltcGxlbWVudAorLy8vIGluc2VydHZhbHVlIGNvbnN0YW50IGV4cHJzLgorY2xhc3MgSW5zZXJ0VmFsdWVDb25zdGFudEV4cHIgOiBwdWJsaWMgQ29uc3RhbnRFeHByIHsKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdW5zaWduZWQpOyAgLy8gRE8gTk9UIElNUExFTUVOVAorcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSBvbmUgb3BlcmFuZAorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDIpOworICB9CisgIEluc2VydFZhbHVlQ29uc3RhbnRFeHByKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiAmSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqRGVzdFR5KQorICAgIDogQ29uc3RhbnRFeHByKERlc3RUeSwgSW5zdHJ1Y3Rpb246Okluc2VydFZhbHVlLCAmT3A8MD4oKSwgMiksCisgICAgICBJbmRpY2VzKElkeExpc3QpIHsKKyAgICBPcDwwPigpID0gQWdnOworICAgIE9wPDE+KCkgPSBWYWw7CisgIH0KKworICAvLy8gSW5kaWNlcyAtIFRoZXNlIGlkZW50aWZ5IHRoZSBwb3NpdGlvbiBmb3IgdGhlIGluc2VydGlvbi4KKyAgY29uc3QgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IEluZGljZXM7CisKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworfTsKKworCisvLy8gR2V0RWxlbWVudFB0ckNvbnN0YW50RXhwciAtIFRoaXMgY2xhc3MgaXMgcHJpdmF0ZSB0byBDb25zdGFudHMuY3BwLCBhbmQgaXMKKy8vLyB1c2VkIGJlaGluZCB0aGUgc2NlbmVzIHRvIGltcGxlbWVudCBnZXRlbGVtZW50cHIgY29uc3RhbnQgZXhwcnMuCitjbGFzcyBHZXRFbGVtZW50UHRyQ29uc3RhbnRFeHByIDogcHVibGljIENvbnN0YW50RXhwciB7CisgIEdldEVsZW1lbnRQdHJDb25zdGFudEV4cHIoQ29uc3RhbnQgKkMsIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJklkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqRGVzdFR5KTsKK3B1YmxpYzoKKyAgc3RhdGljIEdldEVsZW1lbnRQdHJDb25zdGFudEV4cHIgKkNyZWF0ZShDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb25zdGFudCo+JklkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzKSB7CisgICAgR2V0RWxlbWVudFB0ckNvbnN0YW50RXhwciAqUmVzdWx0ID0KKyAgICAgIG5ldyhJZHhMaXN0LnNpemUoKSArIDEpIEdldEVsZW1lbnRQdHJDb25zdGFudEV4cHIoQywgSWR4TGlzdCwgRGVzdFR5KTsKKyAgICBSZXN1bHQtPlN1YmNsYXNzT3B0aW9uYWxEYXRhID0gRmxhZ3M7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7Cit9OworCisvLyBDb21wYXJlQ29uc3RhbnRFeHByIC0gVGhpcyBjbGFzcyBpcyBwcml2YXRlIHRvIENvbnN0YW50cy5jcHAsIGFuZCBpcyB1c2VkCisvLyBiZWhpbmQgdGhlIHNjZW5lcyB0byBpbXBsZW1lbnQgSUNtcCBhbmQgRkNtcCBjb25zdGFudCBleHByZXNzaW9ucy4gVGhpcyBpcworLy8gbmVlZGVkIGluIG9yZGVyIHRvIHN0b3JlIHRoZSBwcmVkaWNhdGUgdmFsdWUgZm9yIHRoZXNlIGluc3RydWN0aW9ucy4KK3N0cnVjdCBDb21wYXJlQ29uc3RhbnRFeHByIDogcHVibGljIENvbnN0YW50RXhwciB7CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKTsgIC8vIERPIE5PVCBJTVBMRU1FTlQKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgdHdvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMik7CisgIH0KKyAgdW5zaWduZWQgc2hvcnQgcHJlZGljYXRlOworICBDb21wYXJlQ29uc3RhbnRFeHByKGNvbnN0IFR5cGUgKnR5LCBJbnN0cnVjdGlvbjo6T3RoZXJPcHMgb3BjLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHByZWQsICBDb25zdGFudCogTEhTLCBDb25zdGFudCogUkhTKQorICAgIDogQ29uc3RhbnRFeHByKHR5LCBvcGMsICZPcDwwPigpLCAyKSwgcHJlZGljYXRlKHByZWQpIHsKKyAgICBPcDwwPigpID0gTEhTOworICAgIE9wPDE+KCkgPSBSSFM7CisgIH0KKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPFVuYXJ5Q29uc3RhbnRFeHByPiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8MT4geworfTsKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhVbmFyeUNvbnN0YW50RXhwciwgVmFsdWUpCisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxCaW5hcnlDb25zdGFudEV4cHI+IDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czwyPiB7Cit9OworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEJpbmFyeUNvbnN0YW50RXhwciwgVmFsdWUpCisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxTZWxlY3RDb25zdGFudEV4cHI+IDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czwzPiB7Cit9OworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFNlbGVjdENvbnN0YW50RXhwciwgVmFsdWUpCisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxFeHRyYWN0RWxlbWVudENvbnN0YW50RXhwcj4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDI+IHsKK307CitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoRXh0cmFjdEVsZW1lbnRDb25zdGFudEV4cHIsIFZhbHVlKQorCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8SW5zZXJ0RWxlbWVudENvbnN0YW50RXhwcj4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDM+IHsKK307CitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoSW5zZXJ0RWxlbWVudENvbnN0YW50RXhwciwgVmFsdWUpCisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxTaHVmZmxlVmVjdG9yQ29uc3RhbnRFeHByPiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8Mz4geworfTsKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhTaHVmZmxlVmVjdG9yQ29uc3RhbnRFeHByLCBWYWx1ZSkKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEV4dHJhY3RWYWx1ZUNvbnN0YW50RXhwcj4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPDE+IHsKK307CitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoRXh0cmFjdFZhbHVlQ29uc3RhbnRFeHByLCBWYWx1ZSkKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEluc2VydFZhbHVlQ29uc3RhbnRFeHByPiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8Mj4geworfTsKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhJbnNlcnRWYWx1ZUNvbnN0YW50RXhwciwgVmFsdWUpCisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxHZXRFbGVtZW50UHRyQ29uc3RhbnRFeHByPiA6IHB1YmxpYyBWYXJpYWRpY09wZXJhbmRUcmFpdHM8MT4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEdldEVsZW1lbnRQdHJDb25zdGFudEV4cHIsIFZhbHVlKQorCisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxDb21wYXJlQ29uc3RhbnRFeHByPiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8Mj4geworfTsKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDb21wYXJlQ29uc3RhbnRFeHByLCBWYWx1ZSkKKworc3RydWN0IEV4cHJNYXBLZXlUeXBlIHsKKyAgdHlwZWRlZiBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gSW5kZXhMaXN0OworCisgIEV4cHJNYXBLZXlUeXBlKHVuc2lnbmVkIG9wYywKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gJm9wcywKKyAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzID0gMCwKKyAgICAgIHVuc2lnbmVkIHNob3J0IG9wdGlvbmFsZmxhZ3MgPSAwLAorICAgICAgY29uc3QgSW5kZXhMaXN0ICZpbmRzID0gSW5kZXhMaXN0KCkpCisgICAgICAgIDogb3Bjb2RlKG9wYyksIHN1YmNsYXNzb3B0aW9uYWxkYXRhKG9wdGlvbmFsZmxhZ3MpLCBzdWJjbGFzc2RhdGEoZmxhZ3MpLAorICAgICAgICBvcGVyYW5kcyhvcHMpLCBpbmRpY2VzKGluZHMpIHt9CisgIHVpbnQ4X3Qgb3Bjb2RlOworICB1aW50OF90IHN1YmNsYXNzb3B0aW9uYWxkYXRhOworICB1aW50MTZfdCBzdWJjbGFzc2RhdGE7CisgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gb3BlcmFuZHM7CisgIEluZGV4TGlzdCBpbmRpY2VzOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRXhwck1hcEtleVR5cGUmIHRoYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+b3Bjb2RlID09IHRoYXQub3Bjb2RlICYmCisgICAgICAgICAgIHRoaXMtPnN1YmNsYXNzZGF0YSA9PSB0aGF0LnN1YmNsYXNzZGF0YSAmJgorICAgICAgICAgICB0aGlzLT5zdWJjbGFzc29wdGlvbmFsZGF0YSA9PSB0aGF0LnN1YmNsYXNzb3B0aW9uYWxkYXRhICYmCisgICAgICAgICAgIHRoaXMtPm9wZXJhbmRzID09IHRoYXQub3BlcmFuZHMgJiYKKyAgICAgICAgICAgdGhpcy0+aW5kaWNlcyA9PSB0aGF0LmluZGljZXM7CisgIH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRXhwck1hcEtleVR5cGUgJiB0aGF0KSBjb25zdCB7CisgICAgaWYgKHRoaXMtPm9wY29kZSAhPSB0aGF0Lm9wY29kZSkgcmV0dXJuIHRoaXMtPm9wY29kZSA8IHRoYXQub3Bjb2RlOworICAgIGlmICh0aGlzLT5vcGVyYW5kcyAhPSB0aGF0Lm9wZXJhbmRzKSByZXR1cm4gdGhpcy0+b3BlcmFuZHMgPCB0aGF0Lm9wZXJhbmRzOworICAgIGlmICh0aGlzLT5zdWJjbGFzc2RhdGEgIT0gdGhhdC5zdWJjbGFzc2RhdGEpCisgICAgICByZXR1cm4gdGhpcy0+c3ViY2xhc3NkYXRhIDwgdGhhdC5zdWJjbGFzc2RhdGE7CisgICAgaWYgKHRoaXMtPnN1YmNsYXNzb3B0aW9uYWxkYXRhICE9IHRoYXQuc3ViY2xhc3NvcHRpb25hbGRhdGEpCisgICAgICByZXR1cm4gdGhpcy0+c3ViY2xhc3NvcHRpb25hbGRhdGEgPCB0aGF0LnN1YmNsYXNzb3B0aW9uYWxkYXRhOworICAgIGlmICh0aGlzLT5pbmRpY2VzICE9IHRoYXQuaW5kaWNlcykgcmV0dXJuIHRoaXMtPmluZGljZXMgPCB0aGF0LmluZGljZXM7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEV4cHJNYXBLZXlUeXBlJiB0aGF0KSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gdGhhdCk7CisgIH0KK307CisKK3N0cnVjdCBJbmxpbmVBc21LZXlUeXBlIHsKKyAgSW5saW5lQXNtS2V5VHlwZShTdHJpbmdSZWYgQXNtU3RyaW5nLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb25zdHJhaW50cywgYm9vbCBoYXNTaWRlRWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICBib29sIGlzQWxpZ25TdGFjaykKKyAgICA6IGFzbV9zdHJpbmcoQXNtU3RyaW5nKSwgY29uc3RyYWludHMoQ29uc3RyYWludHMpLAorICAgICAgaGFzX3NpZGVfZWZmZWN0cyhoYXNTaWRlRWZmZWN0cyksIGlzX2FsaWduX3N0YWNrKGlzQWxpZ25TdGFjaykge30KKyAgc3RkOjpzdHJpbmcgYXNtX3N0cmluZzsKKyAgc3RkOjpzdHJpbmcgY29uc3RyYWludHM7CisgIGJvb2wgaGFzX3NpZGVfZWZmZWN0czsKKyAgYm9vbCBpc19hbGlnbl9zdGFjazsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IElubGluZUFzbUtleVR5cGUmIHRoYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+YXNtX3N0cmluZyA9PSB0aGF0LmFzbV9zdHJpbmcgJiYKKyAgICAgICAgICAgdGhpcy0+Y29uc3RyYWludHMgPT0gdGhhdC5jb25zdHJhaW50cyAmJgorICAgICAgICAgICB0aGlzLT5oYXNfc2lkZV9lZmZlY3RzID09IHRoYXQuaGFzX3NpZGVfZWZmZWN0cyAmJgorICAgICAgICAgICB0aGlzLT5pc19hbGlnbl9zdGFjayA9PSB0aGF0LmlzX2FsaWduX3N0YWNrOworICB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IElubGluZUFzbUtleVR5cGUmIHRoYXQpIGNvbnN0IHsKKyAgICBpZiAodGhpcy0+YXNtX3N0cmluZyAhPSB0aGF0LmFzbV9zdHJpbmcpCisgICAgICByZXR1cm4gdGhpcy0+YXNtX3N0cmluZyA8IHRoYXQuYXNtX3N0cmluZzsKKyAgICBpZiAodGhpcy0+Y29uc3RyYWludHMgIT0gdGhhdC5jb25zdHJhaW50cykKKyAgICAgIHJldHVybiB0aGlzLT5jb25zdHJhaW50cyA8IHRoYXQuY29uc3RyYWludHM7CisgICAgaWYgKHRoaXMtPmhhc19zaWRlX2VmZmVjdHMgIT0gdGhhdC5oYXNfc2lkZV9lZmZlY3RzKQorICAgICAgcmV0dXJuIHRoaXMtPmhhc19zaWRlX2VmZmVjdHMgPCB0aGF0Lmhhc19zaWRlX2VmZmVjdHM7CisgICAgaWYgKHRoaXMtPmlzX2FsaWduX3N0YWNrICE9IHRoYXQuaXNfYWxpZ25fc3RhY2spCisgICAgICByZXR1cm4gdGhpcy0+aXNfYWxpZ25fc3RhY2sgPCB0aGF0LmlzX2FsaWduX3N0YWNrOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbmxpbmVBc21LZXlUeXBlJiB0aGF0KSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gdGhhdCk7CisgIH0KK307CisKKy8vIFRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgZm9yIGVhY2ggQ29uc3RhbnRDcmVhdG9yOjpjcmVhdGUgbWV0aG9kIGlzCisvLyBkZXRlcm1pbmVkIGJ5IHRoZSBDb25zdGFudFRyYWl0cyB0ZW1wbGF0ZS4KKy8vIENvbnN0YW50Q3JlYXRvciAtIEEgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBjb25zdGFudHMgYnkKKy8vIENvbnN0YW50VW5pcXVlTWFwKi4gIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHBhcnRpYWxseSBzcGVjaWFsaXplZCBpZiB0aGVyZSBpcworLy8gc29tZXRoaW5nIHN0cmFuZ2UgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGludGVyZmFjZSB0byB0aGUgY3RvciBmb3IgdGhlCisvLyBjb25zdGFudC4KKy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvYz4KK3N0cnVjdCBDb25zdGFudFRyYWl0czwgc3RkOjp2ZWN0b3I8VCwgQWxsb2M+ID4geworICBzdGF0aWMgdW5zaWduZWQgdXNlcyhjb25zdCBzdGQ6OnZlY3RvcjxULCBBbGxvYz4mIHYpIHsKKyAgICByZXR1cm4gdi5zaXplKCk7CisgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDb25zdGFudFRyYWl0czxDb25zdGFudCAqPiB7CisgIHN0YXRpYyB1bnNpZ25lZCB1c2VzKENvbnN0YW50ICogY29uc3QgJiB2KSB7CisgICAgcmV0dXJuIDE7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIENvbnN0YW50Q2xhc3MsIGNsYXNzIFR5cGVDbGFzcywgY2xhc3MgVmFsVHlwZT4KK3N0cnVjdCBDb25zdGFudENyZWF0b3IgeworICBzdGF0aWMgQ29uc3RhbnRDbGFzcyAqY3JlYXRlKGNvbnN0IFR5cGVDbGFzcyAqVHksIGNvbnN0IFZhbFR5cGUgJlYpIHsKKyAgICByZXR1cm4gbmV3KENvbnN0YW50VHJhaXRzPFZhbFR5cGU+Ojp1c2VzKFYpKSBDb25zdGFudENsYXNzKFR5LCBWKTsKKyAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgQ29uc3RhbnRDbGFzcz4KK3N0cnVjdCBDb25zdGFudEtleURhdGEgeworICB0eXBlZGVmIHZvaWQgVmFsVHlwZTsKKyAgc3RhdGljIFZhbFR5cGUgZ2V0VmFsVHlwZShDb25zdGFudENsYXNzICpDKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBDb25zdGFudCB0eXBlISIpOworICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ29uc3RhbnRDcmVhdG9yPENvbnN0YW50RXhwciwgVHlwZSwgRXhwck1hcEtleVR5cGU+IHsKKyAgc3RhdGljIENvbnN0YW50RXhwciAqY3JlYXRlKGNvbnN0IFR5cGUgKlR5LCBjb25zdCBFeHByTWFwS2V5VHlwZSAmViwKKyAgICAgIHVuc2lnbmVkIHNob3J0IHByZWQgPSAwKSB7CisgICAgaWYgKEluc3RydWN0aW9uOjppc0Nhc3QoVi5vcGNvZGUpKQorICAgICAgcmV0dXJuIG5ldyBVbmFyeUNvbnN0YW50RXhwcihWLm9wY29kZSwgVi5vcGVyYW5kc1swXSwgVHkpOworICAgIGlmICgoVi5vcGNvZGUgPj0gSW5zdHJ1Y3Rpb246OkJpbmFyeU9wc0JlZ2luICYmCisgICAgICAgICBWLm9wY29kZSA8IEluc3RydWN0aW9uOjpCaW5hcnlPcHNFbmQpKQorICAgICAgcmV0dXJuIG5ldyBCaW5hcnlDb25zdGFudEV4cHIoVi5vcGNvZGUsIFYub3BlcmFuZHNbMF0sIFYub3BlcmFuZHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWLnN1YmNsYXNzb3B0aW9uYWxkYXRhKTsKKyAgICBpZiAoVi5vcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OlNlbGVjdCkKKyAgICAgIHJldHVybiBuZXcgU2VsZWN0Q29uc3RhbnRFeHByKFYub3BlcmFuZHNbMF0sIFYub3BlcmFuZHNbMV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVi5vcGVyYW5kc1syXSk7CisgICAgaWYgKFYub3Bjb2RlID09IEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudCkKKyAgICAgIHJldHVybiBuZXcgRXh0cmFjdEVsZW1lbnRDb25zdGFudEV4cHIoVi5vcGVyYW5kc1swXSwgVi5vcGVyYW5kc1sxXSk7CisgICAgaWYgKFYub3Bjb2RlID09IEluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50KQorICAgICAgcmV0dXJuIG5ldyBJbnNlcnRFbGVtZW50Q29uc3RhbnRFeHByKFYub3BlcmFuZHNbMF0sIFYub3BlcmFuZHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVi5vcGVyYW5kc1syXSk7CisgICAgaWYgKFYub3Bjb2RlID09IEluc3RydWN0aW9uOjpTaHVmZmxlVmVjdG9yKQorICAgICAgcmV0dXJuIG5ldyBTaHVmZmxlVmVjdG9yQ29uc3RhbnRFeHByKFYub3BlcmFuZHNbMF0sIFYub3BlcmFuZHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVi5vcGVyYW5kc1syXSk7CisgICAgaWYgKFYub3Bjb2RlID09IEluc3RydWN0aW9uOjpJbnNlcnRWYWx1ZSkKKyAgICAgIHJldHVybiBuZXcgSW5zZXJ0VmFsdWVDb25zdGFudEV4cHIoVi5vcGVyYW5kc1swXSwgVi5vcGVyYW5kc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVi5pbmRpY2VzLCBUeSk7CisgICAgaWYgKFYub3Bjb2RlID09IEluc3RydWN0aW9uOjpFeHRyYWN0VmFsdWUpCisgICAgICByZXR1cm4gbmV3IEV4dHJhY3RWYWx1ZUNvbnN0YW50RXhwcihWLm9wZXJhbmRzWzBdLCBWLmluZGljZXMsIFR5KTsKKyAgICBpZiAoVi5vcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gSWR4TGlzdChWLm9wZXJhbmRzLmJlZ2luKCkrMSwgVi5vcGVyYW5kcy5lbmQoKSk7CisgICAgICByZXR1cm4gR2V0RWxlbWVudFB0ckNvbnN0YW50RXhwcjo6Q3JlYXRlKFYub3BlcmFuZHNbMF0sIElkeExpc3QsIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWLnN1YmNsYXNzb3B0aW9uYWxkYXRhKTsKKyAgICB9CisKKyAgICAvLyBUaGUgY29tcGFyZSBpbnN0cnVjdGlvbnMgYXJlIHdlaXJkLiBXZSBoYXZlIHRvIGVuY29kZSB0aGUgcHJlZGljYXRlCisgICAgLy8gdmFsdWUgYW5kIGl0IGlzIGNvbWJpbmVkIHdpdGggdGhlIGluc3RydWN0aW9uIG9wY29kZSBieSBtdWx0aXBseWluZworICAgIC8vIHRoZSBvcGNvZGUgYnkgb25lIGh1bmRyZWQuIFdlIG11c3QgZGVjb2RlIHRoaXMgdG8gZ2V0IHRoZSBwcmVkaWNhdGUuCisgICAgaWYgKFYub3Bjb2RlID09IEluc3RydWN0aW9uOjpJQ21wKQorICAgICAgcmV0dXJuIG5ldyBDb21wYXJlQ29uc3RhbnRFeHByKFR5LCBJbnN0cnVjdGlvbjo6SUNtcCwgVi5zdWJjbGFzc2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVi5vcGVyYW5kc1swXSwgVi5vcGVyYW5kc1sxXSk7CisgICAgaWYgKFYub3Bjb2RlID09IEluc3RydWN0aW9uOjpGQ21wKSAKKyAgICAgIHJldHVybiBuZXcgQ29tcGFyZUNvbnN0YW50RXhwcihUeSwgSW5zdHJ1Y3Rpb246OkZDbXAsIFYuc3ViY2xhc3NkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYub3BlcmFuZHNbMF0sIFYub3BlcmFuZHNbMV0pOworICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgQ29uc3RhbnRFeHByISIpOworICAgIHJldHVybiAwOworICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ29uc3RhbnRLZXlEYXRhPENvbnN0YW50RXhwcj4geworICB0eXBlZGVmIEV4cHJNYXBLZXlUeXBlIFZhbFR5cGU7CisgIHN0YXRpYyBWYWxUeXBlIGdldFZhbFR5cGUoQ29uc3RhbnRFeHByICpDRSkgeworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gT3BlcmFuZHM7CisgICAgT3BlcmFuZHMucmVzZXJ2ZShDRS0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENFLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhjYXN0PENvbnN0YW50PihDRS0+Z2V0T3BlcmFuZChpKSkpOworICAgIHJldHVybiBFeHByTWFwS2V5VHlwZShDRS0+Z2V0T3Bjb2RlKCksIE9wZXJhbmRzLAorICAgICAgICBDRS0+aXNDb21wYXJlKCkgPyBDRS0+Z2V0UHJlZGljYXRlKCkgOiAwLAorICAgICAgICBDRS0+Z2V0UmF3U3ViY2xhc3NPcHRpb25hbERhdGEoKSwKKyAgICAgICAgQ0UtPmhhc0luZGljZXMoKSA/CisgICAgICAgICAgQ0UtPmdldEluZGljZXMoKSA6IFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PigpKTsKKyAgfQorfTsKKworLy8gQ29uc3RhbnRBZ2dyZWdhdGVaZXJvIGRvZXMgbm90IHRha2UgZXh0cmEgInZhbHVlIiBhcmd1bWVudC4uLgordGVtcGxhdGU8Y2xhc3MgVmFsVHlwZT4KK3N0cnVjdCBDb25zdGFudENyZWF0b3I8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvLCBUeXBlLCBWYWxUeXBlPiB7CisgIHN0YXRpYyBDb25zdGFudEFnZ3JlZ2F0ZVplcm8gKmNyZWF0ZShjb25zdCBUeXBlICpUeSwgY29uc3QgVmFsVHlwZSAmVil7CisgICAgcmV0dXJuIG5ldyBDb25zdGFudEFnZ3JlZ2F0ZVplcm8oVHkpOworICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ29uc3RhbnRLZXlEYXRhPENvbnN0YW50VmVjdG9yPiB7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBWYWxUeXBlOworICBzdGF0aWMgVmFsVHlwZSBnZXRWYWxUeXBlKENvbnN0YW50VmVjdG9yICpDUCkgeworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gRWxlbWVudHM7CisgICAgRWxlbWVudHMucmVzZXJ2ZShDUC0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENQLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIEVsZW1lbnRzLnB1c2hfYmFjayhDUC0+Z2V0T3BlcmFuZChpKSk7CisgICAgcmV0dXJuIEVsZW1lbnRzOworICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ29uc3RhbnRLZXlEYXRhPENvbnN0YW50QWdncmVnYXRlWmVybz4geworICB0eXBlZGVmIGNoYXIgVmFsVHlwZTsKKyAgc3RhdGljIFZhbFR5cGUgZ2V0VmFsVHlwZShDb25zdGFudEFnZ3JlZ2F0ZVplcm8gKkMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IENvbnN0YW50S2V5RGF0YTxDb25zdGFudEFycmF5PiB7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBWYWxUeXBlOworICBzdGF0aWMgVmFsVHlwZSBnZXRWYWxUeXBlKENvbnN0YW50QXJyYXkgKkNBKSB7CisgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBFbGVtZW50czsKKyAgICBFbGVtZW50cy5yZXNlcnZlKENBLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ0EtPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgRWxlbWVudHMucHVzaF9iYWNrKGNhc3Q8Q29uc3RhbnQ+KENBLT5nZXRPcGVyYW5kKGkpKSk7CisgICAgcmV0dXJuIEVsZW1lbnRzOworICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ29uc3RhbnRLZXlEYXRhPENvbnN0YW50U3RydWN0PiB7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBWYWxUeXBlOworICBzdGF0aWMgVmFsVHlwZSBnZXRWYWxUeXBlKENvbnN0YW50U3RydWN0ICpDUykgeworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gRWxlbWVudHM7CisgICAgRWxlbWVudHMucmVzZXJ2ZShDUy0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENTLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIEVsZW1lbnRzLnB1c2hfYmFjayhjYXN0PENvbnN0YW50PihDUy0+Z2V0T3BlcmFuZChpKSkpOworICAgIHJldHVybiBFbGVtZW50czsKKyAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IENvbnN0YW50S2V5RGF0YTxDb25zdGFudFVuaW9uPiB7CisgIHR5cGVkZWYgQ29uc3RhbnQqIFZhbFR5cGU7CisgIHN0YXRpYyBWYWxUeXBlIGdldFZhbFR5cGUoQ29uc3RhbnRVbmlvbiAqQ1UpIHsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudD4oQ1UtPmdldE9wZXJhbmQoMCkpOworICB9Cit9OworCisvLyBDb25zdGFudFBvaW50ZXJOdWxsIGRvZXMgbm90IHRha2UgZXh0cmEgInZhbHVlIiBhcmd1bWVudC4uLgordGVtcGxhdGU8Y2xhc3MgVmFsVHlwZT4KK3N0cnVjdCBDb25zdGFudENyZWF0b3I8Q29uc3RhbnRQb2ludGVyTnVsbCwgUG9pbnRlclR5cGUsIFZhbFR5cGU+IHsKKyAgc3RhdGljIENvbnN0YW50UG9pbnRlck51bGwgKmNyZWF0ZShjb25zdCBQb2ludGVyVHlwZSAqVHksIGNvbnN0IFZhbFR5cGUgJlYpeworICAgIHJldHVybiBuZXcgQ29uc3RhbnRQb2ludGVyTnVsbChUeSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDb25zdGFudEtleURhdGE8Q29uc3RhbnRQb2ludGVyTnVsbD4geworICB0eXBlZGVmIGNoYXIgVmFsVHlwZTsKKyAgc3RhdGljIFZhbFR5cGUgZ2V0VmFsVHlwZShDb25zdGFudFBvaW50ZXJOdWxsICpDKSB7CisgICAgcmV0dXJuIDA7CisgIH0KK307CisKKy8vIFVuZGVmVmFsdWUgZG9lcyBub3QgdGFrZSBleHRyYSAidmFsdWUiIGFyZ3VtZW50Li4uCit0ZW1wbGF0ZTxjbGFzcyBWYWxUeXBlPgorc3RydWN0IENvbnN0YW50Q3JlYXRvcjxVbmRlZlZhbHVlLCBUeXBlLCBWYWxUeXBlPiB7CisgIHN0YXRpYyBVbmRlZlZhbHVlICpjcmVhdGUoY29uc3QgVHlwZSAqVHksIGNvbnN0IFZhbFR5cGUgJlYpIHsKKyAgICByZXR1cm4gbmV3IFVuZGVmVmFsdWUoVHkpOworICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ29uc3RhbnRLZXlEYXRhPFVuZGVmVmFsdWU+IHsKKyAgdHlwZWRlZiBjaGFyIFZhbFR5cGU7CisgIHN0YXRpYyBWYWxUeXBlIGdldFZhbFR5cGUoVW5kZWZWYWx1ZSAqQykgeworICAgIHJldHVybiAwOworICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ29uc3RhbnRDcmVhdG9yPElubGluZUFzbSwgUG9pbnRlclR5cGUsIElubGluZUFzbUtleVR5cGU+IHsKKyAgc3RhdGljIElubGluZUFzbSAqY3JlYXRlKGNvbnN0IFBvaW50ZXJUeXBlICpUeSwgY29uc3QgSW5saW5lQXNtS2V5VHlwZSAmS2V5KSB7CisgICAgcmV0dXJuIG5ldyBJbmxpbmVBc20oVHksIEtleS5hc21fc3RyaW5nLCBLZXkuY29uc3RyYWludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgS2V5Lmhhc19zaWRlX2VmZmVjdHMsIEtleS5pc19hbGlnbl9zdGFjayk7CisgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDb25zdGFudEtleURhdGE8SW5saW5lQXNtPiB7CisgIHR5cGVkZWYgSW5saW5lQXNtS2V5VHlwZSBWYWxUeXBlOworICBzdGF0aWMgVmFsVHlwZSBnZXRWYWxUeXBlKElubGluZUFzbSAqQXNtKSB7CisgICAgcmV0dXJuIElubGluZUFzbUtleVR5cGUoQXNtLT5nZXRBc21TdHJpbmcoKSwgQXNtLT5nZXRDb25zdHJhaW50U3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNtLT5oYXNTaWRlRWZmZWN0cygpLCBBc20tPmlzQWxpZ25TdGFjaygpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgVmFsVHlwZSwgY2xhc3MgVHlwZUNsYXNzLCBjbGFzcyBDb25zdGFudENsYXNzLAorICAgICAgICAgYm9vbCBIYXNMYXJnZUtleSA9IGZhbHNlIC8qdHJ1ZSBmb3IgYXJyYXlzIGFuZCBzdHJ1Y3RzKi8gPgorY2xhc3MgQ29uc3RhbnRVbmlxdWVNYXAgOiBwdWJsaWMgQWJzdHJhY3RUeXBlVXNlciB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IFR5cGVDbGFzcyosIFZhbFR5cGU+IE1hcEtleTsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxNYXBLZXksIENvbnN0YW50Q2xhc3MgKj4gTWFwVHk7CisgIHR5cGVkZWYgc3RkOjptYXA8Q29uc3RhbnRDbGFzcyAqLCB0eXBlbmFtZSBNYXBUeTo6aXRlcmF0b3I+IEludmVyc2VNYXBUeTsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBEZXJpdmVkVHlwZSosIHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvcj4KKyAgICBBYnN0cmFjdFR5cGVNYXBUeTsKK3ByaXZhdGU6CisgIC8vLyBNYXAgLSBUaGlzIGlzIHRoZSBtYWluIG1hcCBmcm9tIHRoZSBlbGVtZW50IGRlc2NyaXB0b3IgdG8gdGhlIENvbnN0YW50cy4KKyAgLy8vIFRoaXMgaXMgdGhlIHByaW1hcnkgd2F5IHdlIGF2b2lkIGNyZWF0aW5nIHR3byBvZiB0aGUgc2FtZSBzaGFwZQorICAvLy8gY29uc3RhbnQuCisgIE1hcFR5IE1hcDsKKyAgICAKKyAgLy8vIEludmVyc2VNYXAgLSBJZiAiSGFzTGFyZ2VLZXkiIGlzIHRydWUsIHRoaXMgY29udGFpbnMgYW4gaW52ZXJzZSBtYXBwaW5nCisgIC8vLyBmcm9tIHRoZSBjb25zdGFudHMgdG8gdGhlaXIgZWxlbWVudCBpbiBNYXAuICBUaGlzIGlzIGltcG9ydGFudCBmb3IKKyAgLy8vIHJlbW92YWwgb2YgY29uc3RhbnRzIGZyb20gdGhlIGFycmF5LCB3aGljaCB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0byBzY2FuCisgIC8vLyB0aHJvdWdoIHRoZSBtYXAgd2l0aCB2ZXJ5IGxhcmdlIGtleXMuCisgIEludmVyc2VNYXBUeSBJbnZlcnNlTWFwOworCisgIC8vLyBBYnN0cmFjdFR5cGVNYXAgLSBNYXAgZm9yIGFic3RyYWN0IHR5cGUgY29uc3RhbnRzLgorICAvLy8KKyAgQWJzdHJhY3RUeXBlTWFwVHkgQWJzdHJhY3RUeXBlTWFwOworICAgIAorcHVibGljOgorICB0eXBlbmFtZSBNYXBUeTo6aXRlcmF0b3IgbWFwX2JlZ2luKCkgeyByZXR1cm4gTWFwLmJlZ2luKCk7IH0KKyAgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yIG1hcF9lbmQoKSB7IHJldHVybiBNYXAuZW5kKCk7IH0KKworICB2b2lkIGZyZWVDb25zdGFudHMoKSB7CisgICAgZm9yICh0eXBlbmFtZSBNYXBUeTo6aXRlcmF0b3IgST1NYXAuYmVnaW4oKSwgRT1NYXAuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgLy8gQXNzZXJ0cyB0aGF0IHVzZV9lbXB0eSgpLgorICAgICAgZGVsZXRlIEktPnNlY29uZDsKKyAgICB9CisgIH0KKyAgICAKKyAgLy8vIEluc2VydE9yR2V0SXRlbSAtIFJldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50LgorICAvLy8gSWYgdGhlIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBtYXAsIHRoZSByZXR1cm5lZCBpdGVyYXRvciBwb2ludHMgdG8gdGhlCisgIC8vLyBlbnRyeSBhbmQgRXhpc3RzPXRydWUuICBJZiBub3QsIHRoZSBpdGVyYXRvciBwb2ludHMgdG8gdGhlIG5ld2x5CisgIC8vLyBpbnNlcnRlZCBlbnRyeSBhbmQgcmV0dXJucyBFeGlzdHM9ZmFsc2UuICBOZXdseSBpbnNlcnRlZCBlbnRyaWVzIGhhdmUKKyAgLy8vIEktPnNlY29uZCA9PSAwLCBhbmQgc2hvdWxkIGJlIGZpbGxlZCBpbi4KKyAgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yIEluc2VydE9yR2V0SXRlbShzdGQ6OnBhaXI8TWFwS2V5LCBDb25zdGFudENsYXNzICo+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zZXJ0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmRXhpc3RzKSB7CisgICAgc3RkOjpwYWlyPHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvciwgYm9vbD4gSVAgPSBNYXAuaW5zZXJ0KEluc2VydFZhbCk7CisgICAgRXhpc3RzID0gIUlQLnNlY29uZDsKKyAgICByZXR1cm4gSVAuZmlyc3Q7CisgIH0KKyAgICAKK3ByaXZhdGU6CisgIHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvciBGaW5kRXhpc3RpbmdFbGVtZW50KENvbnN0YW50Q2xhc3MgKkNQKSB7CisgICAgaWYgKEhhc0xhcmdlS2V5KSB7CisgICAgICB0eXBlbmFtZSBJbnZlcnNlTWFwVHk6Oml0ZXJhdG9yIElNSSA9IEludmVyc2VNYXAuZmluZChDUCk7CisgICAgICBhc3NlcnQoSU1JICE9IEludmVyc2VNYXAuZW5kKCkgJiYgSU1JLT5zZWNvbmQgIT0gTWFwLmVuZCgpICYmCisgICAgICAgICAgICAgSU1JLT5zZWNvbmQtPnNlY29uZCA9PSBDUCAmJgorICAgICAgICAgICAgICJJbnZlcnNlTWFwIGNvcnJ1cHQhIik7CisgICAgICByZXR1cm4gSU1JLT5zZWNvbmQ7CisgICAgfQorICAgICAgCisgICAgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yIEkgPQorICAgICAgTWFwLmZpbmQoTWFwS2V5KHN0YXRpY19jYXN0PGNvbnN0IFR5cGVDbGFzcyo+KENQLT5nZXRSYXdUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50S2V5RGF0YTxDb25zdGFudENsYXNzPjo6Z2V0VmFsVHlwZShDUCkpKTsKKyAgICBpZiAoSSA9PSBNYXAuZW5kKCkgfHwgSS0+c2Vjb25kICE9IENQKSB7CisgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgbm90IHVzZSBhIGxpbmVhciBzY2FuLiAgSWYgdGhpcyBnZXRzIHRvIGJlIGEKKyAgICAgIC8vIHBlcmZvcm1hbmNlIHByb2JsZW0sIHNvbWVvbmUgc2hvdWxkIGxvb2sgYXQgdGhpcy4KKyAgICAgIGZvciAoSSA9IE1hcC5iZWdpbigpOyBJICE9IE1hcC5lbmQoKSAmJiBJLT5zZWNvbmQgIT0gQ1A7ICsrSSkKKyAgICAgICAgLyogZW1wdHkgKi87CisgICAgfQorICAgIHJldHVybiBJOworICB9CisgICAgCisgIHZvaWQgQWRkQWJzdHJhY3RUeXBlVXNlcihjb25zdCBUeXBlICpUeSwgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yIEkpIHsKKyAgICAvLyBJZiB0aGUgdHlwZSBvZiB0aGUgY29uc3RhbnQgaXMgYWJzdHJhY3QsIG1ha2Ugc3VyZSB0aGF0IGFuIGVudHJ5CisgICAgLy8gZXhpc3RzIGZvciBpdCBpbiB0aGUgQWJzdHJhY3RUeXBlTWFwLgorICAgIGlmIChUeS0+aXNBYnN0cmFjdCgpKSB7CisgICAgICBjb25zdCBEZXJpdmVkVHlwZSAqRFR5ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFR5cGUgKj4oVHkpOworICAgICAgdHlwZW5hbWUgQWJzdHJhY3RUeXBlTWFwVHk6Oml0ZXJhdG9yIFRJID0gQWJzdHJhY3RUeXBlTWFwLmZpbmQoRFR5KTsKKworICAgICAgaWYgKFRJID09IEFic3RyYWN0VHlwZU1hcC5lbmQoKSkgeworICAgICAgICAvLyBBZGQgb3Vyc2VsdmVzIHRvIHRoZSBBVFUgbGlzdCBvZiB0aGUgdHlwZS4KKyAgICAgICAgY2FzdDxEZXJpdmVkVHlwZT4oRFR5KS0+YWRkQWJzdHJhY3RUeXBlVXNlcih0aGlzKTsKKworICAgICAgICBBYnN0cmFjdFR5cGVNYXAuaW5zZXJ0KFRJLCBzdGQ6Om1ha2VfcGFpcihEVHksIEkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBDb25zdGFudENsYXNzKiBDcmVhdGUoY29uc3QgVHlwZUNsYXNzICpUeSwgY29uc3QgVmFsVHlwZSAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvciBJKSB7CisgICAgQ29uc3RhbnRDbGFzcyogUmVzdWx0ID0KKyAgICAgIENvbnN0YW50Q3JlYXRvcjxDb25zdGFudENsYXNzLFR5cGVDbGFzcyxWYWxUeXBlPjo6Y3JlYXRlKFR5LCBWKTsKKworICAgIGFzc2VydChSZXN1bHQtPmdldFR5cGUoKSA9PSBUeSAmJiAiVHlwZSBzcGVjaWZpZWQgaXMgbm90IGNvcnJlY3QhIik7CisgICAgSSA9IE1hcC5pbnNlcnQoSSwgc3RkOjptYWtlX3BhaXIoTWFwS2V5KFR5LCBWKSwgUmVzdWx0KSk7CisKKyAgICBpZiAoSGFzTGFyZ2VLZXkpICAvLyBSZW1lbWJlciB0aGUgcmV2ZXJzZSBtYXBwaW5nIGlmIG5lZWRlZC4KKyAgICAgIEludmVyc2VNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFJlc3VsdCwgSSkpOworCisgICAgQWRkQWJzdHJhY3RUeXBlVXNlcihUeSwgSSk7CisgICAgICAKKyAgICByZXR1cm4gUmVzdWx0OworICB9CitwdWJsaWM6CisgICAgCisgIC8vLyBnZXRPckNyZWF0ZSAtIFJldHVybiB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IGZyb20gdGhlIG1hcCwgY3JlYXRpbmcgaXQgaWYKKyAgLy8vIG5lY2Vzc2FyeS4KKyAgQ29uc3RhbnRDbGFzcyAqZ2V0T3JDcmVhdGUoY29uc3QgVHlwZUNsYXNzICpUeSwgY29uc3QgVmFsVHlwZSAmVikgeworICAgIE1hcEtleSBMb29rdXAoVHksIFYpOworICAgIENvbnN0YW50Q2xhc3MqIFJlc3VsdCA9IDA7CisgICAgCisgICAgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yIEkgPSBNYXAuZmluZChMb29rdXApOworICAgIC8vIElzIGl0IGluIHRoZSBtYXA/ICAKKyAgICBpZiAoSSAhPSBNYXAuZW5kKCkpCisgICAgICBSZXN1bHQgPSBJLT5zZWNvbmQ7CisgICAgICAgIAorICAgIGlmICghUmVzdWx0KSB7CisgICAgICAvLyBJZiBubyBwcmVleGlzdGluZyB2YWx1ZSwgY3JlYXRlIG9uZSBub3cuLi4KKyAgICAgIFJlc3VsdCA9IENyZWF0ZShUeSwgViwgSSk7CisgICAgfQorICAgICAgICAKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgdm9pZCBVcGRhdGVBYnN0cmFjdFR5cGVNYXAoY29uc3QgRGVyaXZlZFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXBUeTo6aXRlcmF0b3IgSSkgeworICAgIGFzc2VydChBYnN0cmFjdFR5cGVNYXAuY291bnQoVHkpICYmCisgICAgICAgICAgICJBYnN0cmFjdCB0eXBlIG5vdCBpbiBBYnN0cmFjdFR5cGVNYXA/Iik7CisgICAgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yICZBVE1FbnRyeUl0ID0gQWJzdHJhY3RUeXBlTWFwW1R5XTsKKyAgICBpZiAoQVRNRW50cnlJdCA9PSBJKSB7CisgICAgICAvLyBZZXMsIHdlIGFyZSByZW1vdmluZyB0aGUgcmVwcmVzZW50YXRpdmUgZW50cnkgZm9yIHRoaXMgdHlwZS4KKyAgICAgIC8vIFNlZSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGVudHJpZXMgb2YgdGhlIHNhbWUgdHlwZS4KKyAgICAgIHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvciBUbXBJdCA9IEFUTUVudHJ5SXQ7CisKKyAgICAgIC8vIEZpcnN0IGNoZWNrIHRoZSBlbnRyeSBiZWZvcmUgdGhpcyBvbmUuLi4KKyAgICAgIGlmIChUbXBJdCAhPSBNYXAuYmVnaW4oKSkgeworICAgICAgICAtLVRtcEl0OworICAgICAgICBpZiAoVG1wSXQtPmZpcnN0LmZpcnN0ICE9IFR5KSAvLyBOb3QgdGhlIHNhbWUgdHlwZSwgbW92ZSBiYWNrLi4uCisgICAgICAgICAgKytUbXBJdDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgdGhlIHNhbWUgdHlwZSwgdHJ5IHRvIG1vdmUgZm9yd2FyZC4uLgorICAgICAgaWYgKFRtcEl0ID09IEFUTUVudHJ5SXQpIHsKKyAgICAgICAgKytUbXBJdDsKKyAgICAgICAgaWYgKFRtcEl0ID09IE1hcC5lbmQoKSB8fCBUbXBJdC0+Zmlyc3QuZmlyc3QgIT0gVHkpCisgICAgICAgICAgLS1UbXBJdDsgICAvLyBObyBlbnRyeSBhZnRlcndhcmRzIHdpdGggdGhlIHNhbWUgdHlwZQorICAgICAgfQorCisgICAgICAvLyBJZiB0aGVyZSBpcyBhbm90aGVyIGVudHJ5IGluIHRoZSBtYXAgb2YgdGhlIHNhbWUgYWJzdHJhY3QgdHlwZSwKKyAgICAgIC8vIHVwZGF0ZSB0aGUgQWJzdHJhY3RUeXBlTWFwIGVudHJ5IG5vdy4KKyAgICAgIGlmIChUbXBJdCAhPSBBVE1FbnRyeUl0KSB7CisgICAgICAgIEFUTUVudHJ5SXQgPSBUbXBJdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IGluc3RhbmNlIG9mIHRoaXMgdHlwZQorICAgICAgICAvLyBmcm9tIHRoZSB0YWJsZS4gIFJlbW92ZSBmcm9tIHRoZSBBVE0sIGFuZCBmcm9tIHVzZXIgbGlzdC4KKyAgICAgICAgY2FzdDxEZXJpdmVkVHlwZT4oVHkpLT5yZW1vdmVBYnN0cmFjdFR5cGVVc2VyKHRoaXMpOworICAgICAgICBBYnN0cmFjdFR5cGVNYXAuZXJhc2UoVHkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgcmVtb3ZlKENvbnN0YW50Q2xhc3MgKkNQKSB7CisgICAgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yIEkgPSBGaW5kRXhpc3RpbmdFbGVtZW50KENQKTsKKyAgICBhc3NlcnQoSSAhPSBNYXAuZW5kKCkgJiYgIkNvbnN0YW50IG5vdCBmb3VuZCBpbiBjb25zdGFudCB0YWJsZSEiKTsKKyAgICBhc3NlcnQoSS0+c2Vjb25kID09IENQICYmICJEaWRuJ3QgZmluZCBjb3JyZWN0IGVsZW1lbnQ/Iik7CisKKyAgICBpZiAoSGFzTGFyZ2VLZXkpICAvLyBSZW1lbWJlciB0aGUgcmV2ZXJzZSBtYXBwaW5nIGlmIG5lZWRlZC4KKyAgICAgIEludmVyc2VNYXAuZXJhc2UoQ1ApOworICAgICAgCisgICAgLy8gTm93IHRoYXQgd2UgZm91bmQgdGhlIGVudHJ5LCBtYWtlIHN1cmUgdGhpcyBpc24ndCB0aGUgZW50cnkgdGhhdAorICAgIC8vIHRoZSBBYnN0cmFjdFR5cGVNYXAgcG9pbnRzIHRvLgorICAgIGNvbnN0IFR5cGVDbGFzcyAqVHkgPSBJLT5maXJzdC5maXJzdDsKKyAgICBpZiAoVHktPmlzQWJzdHJhY3QoKSkKKyAgICAgIFVwZGF0ZUFic3RyYWN0VHlwZU1hcChzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVHlwZSAqPihUeSksIEkpOworCisgICAgTWFwLmVyYXNlKEkpOworICB9CisKKyAgLy8vIE1vdmVDb25zdGFudFRvTmV3U2xvdCAtIElmIHdlIGFyZSBhYm91dCB0byBjaGFuZ2UgQyB0byBiZSB0aGUgZWxlbWVudAorICAvLy8gc3BlY2lmaWVkIGJ5IEksIHVwZGF0ZSBvdXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIHJlZmxlY3QgdGhpcworICAvLy8gZmFjdC4KKyAgdm9pZCBNb3ZlQ29uc3RhbnRUb05ld1Nsb3QoQ29uc3RhbnRDbGFzcyAqQywgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yIEkpIHsKKyAgICAvLyBGaXJzdCwgcmVtb3ZlIHRoZSBvbGQgbG9jYXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb25zdGFudCBpbiB0aGUgbWFwLgorICAgIHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvciBPbGRJID0gRmluZEV4aXN0aW5nRWxlbWVudChDKTsKKyAgICBhc3NlcnQoT2xkSSAhPSBNYXAuZW5kKCkgJiYgIkNvbnN0YW50IG5vdCBmb3VuZCBpbiBjb25zdGFudCB0YWJsZSEiKTsKKyAgICBhc3NlcnQoT2xkSS0+c2Vjb25kID09IEMgJiYgIkRpZG4ndCBmaW5kIGNvcnJlY3QgZWxlbWVudD8iKTsKKyAgICAgIAorICAgIC8vIElmIHRoaXMgY29uc3RhbnQgaXMgdGhlIHJlcHJlc2VudGF0aXZlIGVsZW1lbnQgZm9yIGl0cyBhYnN0cmFjdCB0eXBlLAorICAgIC8vIHVwZGF0ZSB0aGUgQWJzdHJhY3RUeXBlTWFwIHNvIHRoYXQgdGhlIHJlcHJlc2VudGF0aXZlIGVsZW1lbnQgaXMgSS4KKyAgICAvLworICAgIC8vIFRoaXMgbXVzdCB1c2UgZ2V0UmF3VHlwZSgpIGJlY2F1c2UgaWYgdGhlIHR5cGUgaXMgdW5kZXIgcmVmaW5lbWVudCwgd2UKKyAgICAvLyB3aWxsIGdldCB0aGUgcmVmaW5lQWJzdHJhY3RUeXBlIGNhbGxiYWNrIGJlbG93LCBhbmQgd2UgZG9uJ3Qgd2FudCB0bworICAgIC8vIGtpY2sgdW5pb24gZmluZCBpbiBvbiB0aGUgY29uc3RhbnQuCisgICAgaWYgKEMtPmdldFJhd1R5cGUoKS0+aXNBYnN0cmFjdCgpKSB7CisgICAgICB0eXBlbmFtZSBBYnN0cmFjdFR5cGVNYXBUeTo6aXRlcmF0b3IgQVRJID0KKyAgICAgICAgICBBYnN0cmFjdFR5cGVNYXAuZmluZChjYXN0PERlcml2ZWRUeXBlPihDLT5nZXRSYXdUeXBlKCkpKTsKKyAgICAgIGFzc2VydChBVEkgIT0gQWJzdHJhY3RUeXBlTWFwLmVuZCgpICYmCisgICAgICAgICAgICAgIkFic3RyYWN0IHR5cGUgbm90IGluIEFic3RyYWN0VHlwZU1hcD8iKTsKKyAgICAgIGlmIChBVEktPnNlY29uZCA9PSBPbGRJKQorICAgICAgICBBVEktPnNlY29uZCA9IEk7CisgICAgfQorICAgICAgCisgICAgLy8gUmVtb3ZlIHRoZSBvbGQgZW50cnkgZnJvbSB0aGUgbWFwLgorICAgIE1hcC5lcmFzZShPbGRJKTsKKyAgICAKKyAgICAvLyBVcGRhdGUgdGhlIGludmVyc2UgbWFwIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgY29uc3RhbnQgaXMgbm93CisgICAgLy8gbG9jYXRlZCBhdCBkZXNjcmlwdG9yIEkuCisgICAgaWYgKEhhc0xhcmdlS2V5KSB7CisgICAgICBhc3NlcnQoSS0+c2Vjb25kID09IEMgJiYgIkJhZCBpbnZlcnNlbWFwIGVudHJ5ISIpOworICAgICAgSW52ZXJzZU1hcFtDXSA9IEk7CisgICAgfQorICB9CisgICAgCisgIHZvaWQgcmVmaW5lQWJzdHJhY3RUeXBlKGNvbnN0IERlcml2ZWRUeXBlICpPbGRUeSwgY29uc3QgVHlwZSAqTmV3VHkpIHsKKyAgICB0eXBlbmFtZSBBYnN0cmFjdFR5cGVNYXBUeTo6aXRlcmF0b3IgSSA9IEFic3RyYWN0VHlwZU1hcC5maW5kKE9sZFR5KTsKKworICAgIGFzc2VydChJICE9IEFic3RyYWN0VHlwZU1hcC5lbmQoKSAmJgorICAgICAgICAgICAiQWJzdHJhY3QgdHlwZSBub3QgaW4gQWJzdHJhY3RUeXBlTWFwPyIpOworCisgICAgLy8gQ29udmVydCBhIGNvbnN0YW50IGF0IGEgdGltZSB1bnRpbCB0aGUgbGFzdCBvbmUgaXMgZ29uZS4gIFRoZSBsYXN0IG9uZQorICAgIC8vIGxlYXZpbmcgd2lsbCByZW1vdmUoKSBpdHNlbGYsIGNhdXNpbmcgdGhlIEFic3RyYWN0VHlwZU1hcEVudHJ5IHRvIGJlCisgICAgLy8gZWxpbWluYXRlZCBldmVudHVhbGx5LgorICAgIGRvIHsKKyAgICAgIENvbnN0YW50Q2xhc3MgKkMgPSBJLT5zZWNvbmQtPnNlY29uZDsKKyAgICAgIE1hcEtleSBLZXkoY2FzdDxUeXBlQ2xhc3M+KE5ld1R5KSwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRLZXlEYXRhPENvbnN0YW50Q2xhc3M+OjpnZXRWYWxUeXBlKEMpKTsKKworICAgICAgc3RkOjpwYWlyPHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvciwgYm9vbD4gSVAgPQorICAgICAgICBNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEtleSwgQykpOworICAgICAgaWYgKElQLnNlY29uZCkgeworICAgICAgICAvLyBUaGUgbWFwIGRpZG4ndCBwcmV2aW91c2x5IGhhdmUgYW4gYXBwcm9wcmlhdGUgY29uc3RhbnQgaW4gdGhlCisgICAgICAgIC8vIG5ldyB0eXBlLgorICAgICAgICAKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBvbGQgZW50cnkuCisgICAgICAgIHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvciBPbGRJID0KKyAgICAgICAgICBNYXAuZmluZChNYXBLZXkoY2FzdDxUeXBlQ2xhc3M+KE9sZFR5KSwgSVAuZmlyc3QtPmZpcnN0LnNlY29uZCkpOworICAgICAgICBhc3NlcnQoT2xkSSAhPSBNYXAuZW5kKCkgJiYgIkNvbnN0YW50IG5vdCBpbiBtYXAhIik7CisgICAgICAgIFVwZGF0ZUFic3RyYWN0VHlwZU1hcChPbGRUeSwgT2xkSSk7CisgICAgICAgIE1hcC5lcmFzZShPbGRJKTsKKworICAgICAgICAvLyBTZXQgdGhlIGNvbnN0YW50J3MgdHlwZS4gVGhpcyBpcyBkb25lIGluIHBsYWNlIQorICAgICAgICBzZXRUeXBlKEMsIE5ld1R5KTsKKworICAgICAgICAvLyBVcGRhdGUgdGhlIGludmVyc2UgbWFwIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgY29uc3RhbnQgaXMgbm93CisgICAgICAgIC8vIGxvY2F0ZWQgYXQgZGVzY3JpcHRvciBJLgorICAgICAgICBpZiAoSGFzTGFyZ2VLZXkpCisgICAgICAgICAgSW52ZXJzZU1hcFtDXSA9IElQLmZpcnN0OworCisgICAgICAgIEFkZEFic3RyYWN0VHlwZVVzZXIoTmV3VHksIElQLmZpcnN0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZSBtYXAgYWxyZWFkeSBoYWQgYW4gYXBwcm9wcmlhdGUgY29uc3RhbnQgaW4gdGhlIG5ldyB0eXBlLCBzbworICAgICAgICAvLyB0aGVyZSdzIG5vIGxvbmdlciBhIG5lZWQgZm9yIHRoZSBvbGQgY29uc3RhbnQuCisgICAgICAgIEMtPnVuY2hlY2tlZFJlcGxhY2VBbGxVc2VzV2l0aChJUC5maXJzdC0+c2Vjb25kKTsKKyAgICAgICAgQy0+ZGVzdHJveUNvbnN0YW50KCk7ICAgIC8vIFRoaXMgY29uc3RhbnQgaXMgbm93IGRlYWQsIGRlc3Ryb3kgaXQuCisgICAgICB9CisgICAgICBJID0gQWJzdHJhY3RUeXBlTWFwLmZpbmQoT2xkVHkpOworICAgIH0gd2hpbGUgKEkgIT0gQWJzdHJhY3RUeXBlTWFwLmVuZCgpKTsKKyAgfQorCisgIC8vIElmIHRoZSB0eXBlIGJlY2FtZSBjb25jcmV0ZSB3aXRob3V0IGJlaW5nIHJlZmluZWQgdG8gYW55IG90aGVyIGV4aXN0aW5nCisgIC8vIHR5cGUsIHdlIGp1c3QgcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBBVFUgbGlzdC4KKyAgdm9pZCB0eXBlQmVjYW1lQ29uY3JldGUoY29uc3QgRGVyaXZlZFR5cGUgKkFic1R5KSB7CisgICAgQWJzVHktPnJlbW92ZUFic3RyYWN0VHlwZVVzZXIodGhpcyk7CisgIH0KKworICB2b2lkIGR1bXAoKSBjb25zdCB7CisgICAgREVCVUcoZGJncygpIDw8ICJDb25zdGFudC5jcHA6IENvbnN0YW50VW5pcXVlTWFwXG4iKTsKKyAgfQorfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9WTUNvcmUvRGVidWdMb2MuY3BwIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9EZWJ1Z0xvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiNDVlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvRGVidWdMb2MuY3BwCkBAIC0wLDAgKzEsMjg4IEBACisvLz09PS0tIERlYnVnTG9jLmNwcCAtIEltcGxlbWVudCBEZWJ1Z0xvYyBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnTG9jLmgiCisjaW5jbHVkZSAiTExWTUNvbnRleHRJbXBsLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERlYnVnTG9jIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitNRE5vZGUgKkRlYnVnTG9jOjpnZXRTY29wZShjb25zdCBMTFZNQ29udGV4dCAmQ3R4KSBjb25zdCB7CisgIGlmIChTY29wZUlkeCA9PSAwKSByZXR1cm4gMDsKKyAgCisgIGlmIChTY29wZUlkeCA+IDApIHsKKyAgICAvLyBQb3NpdGl2ZSBTY29wZUlkeCBpcyBhbiBpbmRleCBpbnRvIFNjb3BlUmVjb3Jkcywgd2hpY2ggaGFzIG5vIGlubGluZWQtYXQKKyAgICAvLyBwb3NpdGlvbiBzcGVjaWZpZWQuCisgICAgYXNzZXJ0KHVuc2lnbmVkKFNjb3BlSWR4KSA8PSBDdHgucEltcGwtPlNjb3BlUmVjb3Jkcy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgU2NvcGVJZHghIik7CisgICAgcmV0dXJuIEN0eC5wSW1wbC0+U2NvcGVSZWNvcmRzW1Njb3BlSWR4LTFdLmdldCgpOworICB9CisgIAorICAvLyBPdGhlcndpc2UsIHRoZSBpbmRleCBpcyBpbiB0aGUgU2NvcGVJbmxpbmVkQXRSZWNvcmRzIGFycmF5LgorICBhc3NlcnQodW5zaWduZWQoLVNjb3BlSWR4KSA8PSBDdHgucEltcGwtPlNjb3BlSW5saW5lZEF0UmVjb3Jkcy5zaXplKCkgJiYKKyAgICAgICAgICJJbnZhbGlkIFNjb3BlSWR4Iik7CisgIHJldHVybiBDdHgucEltcGwtPlNjb3BlSW5saW5lZEF0UmVjb3Jkc1stU2NvcGVJZHgtMV0uZmlyc3QuZ2V0KCk7Cit9CisKK01ETm9kZSAqRGVidWdMb2M6OmdldElubGluZWRBdChjb25zdCBMTFZNQ29udGV4dCAmQ3R4KSBjb25zdCB7CisgIC8vIFBvc2l0aXZlIFNjb3BlSWR4IGlzIGFuIGluZGV4IGludG8gU2NvcGVSZWNvcmRzLCB3aGljaCBoYXMgbm8gaW5saW5lZC1hdAorICAvLyBwb3NpdGlvbiBzcGVjaWZpZWQuICBaZXJvIGlzIGludmFsaWQuCisgIGlmIChTY29wZUlkeCA+PSAwKSByZXR1cm4gMDsKKyAgCisgIC8vIE90aGVyd2lzZSwgdGhlIGluZGV4IGlzIGluIHRoZSBTY29wZUlubGluZWRBdFJlY29yZHMgYXJyYXkuCisgIGFzc2VydCh1bnNpZ25lZCgtU2NvcGVJZHgpIDw9IEN0eC5wSW1wbC0+U2NvcGVJbmxpbmVkQXRSZWNvcmRzLnNpemUoKSAmJgorICAgICAgICAgIkludmFsaWQgU2NvcGVJZHgiKTsKKyAgcmV0dXJuIEN0eC5wSW1wbC0+U2NvcGVJbmxpbmVkQXRSZWNvcmRzWy1TY29wZUlkeC0xXS5zZWNvbmQuZ2V0KCk7Cit9CisKKy8vLyBSZXR1cm4gYm90aCB0aGUgU2NvcGUgYW5kIHRoZSBJbmxpbmVkQXQgdmFsdWVzLgordm9pZCBEZWJ1Z0xvYzo6Z2V0U2NvcGVBbmRJbmxpbmVkQXQoTUROb2RlIComU2NvcGUsIE1ETm9kZSAqJklBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTExWTUNvbnRleHQgJkN0eCkgY29uc3QgeworICBpZiAoU2NvcGVJZHggPT0gMCkgeworICAgIFNjb3BlID0gSUEgPSAwOworICAgIHJldHVybjsKKyAgfQorICAKKyAgaWYgKFNjb3BlSWR4ID4gMCkgeworICAgIC8vIFBvc2l0aXZlIFNjb3BlSWR4IGlzIGFuIGluZGV4IGludG8gU2NvcGVSZWNvcmRzLCB3aGljaCBoYXMgbm8gaW5saW5lZC1hdAorICAgIC8vIHBvc2l0aW9uIHNwZWNpZmllZC4KKyAgICBhc3NlcnQodW5zaWduZWQoU2NvcGVJZHgpIDw9IEN0eC5wSW1wbC0+U2NvcGVSZWNvcmRzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBTY29wZUlkeCEiKTsKKyAgICBTY29wZSA9IEN0eC5wSW1wbC0+U2NvcGVSZWNvcmRzW1Njb3BlSWR4LTFdLmdldCgpOworICAgIElBID0gMDsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIE90aGVyd2lzZSwgdGhlIGluZGV4IGlzIGluIHRoZSBTY29wZUlubGluZWRBdFJlY29yZHMgYXJyYXkuCisgIGFzc2VydCh1bnNpZ25lZCgtU2NvcGVJZHgpIDw9IEN0eC5wSW1wbC0+U2NvcGVJbmxpbmVkQXRSZWNvcmRzLnNpemUoKSAmJgorICAgICAgICAgIkludmFsaWQgU2NvcGVJZHgiKTsKKyAgU2NvcGUgPSBDdHgucEltcGwtPlNjb3BlSW5saW5lZEF0UmVjb3Jkc1stU2NvcGVJZHgtMV0uZmlyc3QuZ2V0KCk7CisgIElBICAgID0gQ3R4LnBJbXBsLT5TY29wZUlubGluZWRBdFJlY29yZHNbLVNjb3BlSWR4LTFdLnNlY29uZC5nZXQoKTsKK30KKworCitEZWJ1Z0xvYyBEZWJ1Z0xvYzo6Z2V0KHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpTY29wZSwgTUROb2RlICpJbmxpbmVkQXQpIHsKKyAgRGVidWdMb2MgUmVzdWx0OworICAKKyAgLy8gSWYgbm8gc2NvcGUgaXMgYXZhaWxhYmxlLCB0aGlzIGlzIGFuIHVua25vd24gbG9jYXRpb24uCisgIGlmIChTY29wZSA9PSAwKSByZXR1cm4gUmVzdWx0OworICAKKyAgLy8gU2F0dXJhdGUgbGluZSBhbmQgY29sIHRvICJ1bmtub3duIi4KKyAgaWYgKENvbCA+IDI1NSkgQ29sID0gMDsKKyAgaWYgKExpbmUgPj0gKDEgPDwgMjQpKSBMaW5lID0gMDsKKyAgUmVzdWx0LkxpbmVDb2wgPSBMaW5lIHwgKENvbCA8PCAyNCk7CisgIAorICBMTFZNQ29udGV4dCAmQ3R4ID0gU2NvcGUtPmdldENvbnRleHQoKTsKKyAgCisgIC8vIElmIHRoZXJlIGlzIG5vIGlubGluZWQtYXQgbG9jYXRpb24sIHVzZSB0aGUgU2NvcGVSZWNvcmRzIGFycmF5LgorICBpZiAoSW5saW5lZEF0ID09IDApCisgICAgUmVzdWx0LlNjb3BlSWR4ID0gQ3R4LnBJbXBsLT5nZXRPckFkZFNjb3BlUmVjb3JkSWR4RW50cnkoU2NvcGUsIDApOworICBlbHNlCisgICAgUmVzdWx0LlNjb3BlSWR4ID0gQ3R4LnBJbXBsLT5nZXRPckFkZFNjb3BlSW5saW5lZEF0SWR4RW50cnkoU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5saW5lZEF0LCAwKTsKKworICByZXR1cm4gUmVzdWx0OworfQorCisvLy8gZ2V0QXNNRE5vZGUgLSBUaGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgY29tcHJlc3NlZCBEZWJ1Z0xvYyBub2RlIGludG8gYQorLy8vIERJTG9jYXRpb24gY29tcGF0aWJsZSBNRE5vZGUuCitNRE5vZGUgKkRlYnVnTG9jOjpnZXRBc01ETm9kZShjb25zdCBMTFZNQ29udGV4dCAmQ3R4KSBjb25zdCB7CisgIGlmIChpc1Vua25vd24oKSkgcmV0dXJuIDA7CisgIAorICBNRE5vZGUgKlNjb3BlLCAqSUE7CisgIGdldFNjb3BlQW5kSW5saW5lZEF0KFNjb3BlLCBJQSwgQ3R4KTsKKyAgYXNzZXJ0KFNjb3BlICYmICJJZiBzY29wZSBpcyBudWxsLCB0aGlzIHNob3VsZCBiZSBpc1Vua25vd24oKSIpOworICAKKyAgTExWTUNvbnRleHQgJkN0eDIgPSBTY29wZS0+Z2V0Q29udGV4dCgpOworICBjb25zdCBUeXBlICpJbnQzMiA9IFR5cGU6OmdldEludDMyVHkoQ3R4Mik7CisgIFZhbHVlICpFbHRzW10gPSB7CisgICAgQ29uc3RhbnRJbnQ6OmdldChJbnQzMiwgZ2V0TGluZSgpKSwgQ29uc3RhbnRJbnQ6OmdldChJbnQzMiwgZ2V0Q29sKCkpLAorICAgIFNjb3BlLCBJQQorICB9OworICByZXR1cm4gTUROb2RlOjpnZXQoQ3R4MiwgJkVsdHNbMF0sIDQpOworfQorCisvLy8gZ2V0RnJvbURJTG9jYXRpb24gLSBUcmFuc2xhdGUgdGhlIERJTG9jYXRpb24gcXVhZCBpbnRvIGEgRGVidWdMb2MuCitEZWJ1Z0xvYyBEZWJ1Z0xvYzo6Z2V0RnJvbURJTG9jYXRpb24oTUROb2RlICpOKSB7CisgIGlmIChOID09IDAgfHwgTi0+Z2V0TnVtT3BlcmFuZHMoKSAhPSA0KSByZXR1cm4gRGVidWdMb2MoKTsKKyAgCisgIE1ETm9kZSAqU2NvcGUgPSBkeW5fY2FzdF9vcl9udWxsPE1ETm9kZT4oTi0+Z2V0T3BlcmFuZCgyKSk7CisgIGlmIChTY29wZSA9PSAwKSByZXR1cm4gRGVidWdMb2MoKTsKKyAgCisgIHVuc2lnbmVkIExpbmVObyA9IDAsIENvbE5vID0gMDsKKyAgaWYgKENvbnN0YW50SW50ICpMaW5lID0gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudEludD4oTi0+Z2V0T3BlcmFuZCgwKSkpCisgICAgTGluZU5vID0gTGluZS0+Z2V0WkV4dFZhbHVlKCk7CisgIGlmIChDb25zdGFudEludCAqQ29sID0gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudEludD4oTi0+Z2V0T3BlcmFuZCgxKSkpCisgICAgQ29sTm8gPSBDb2wtPmdldFpFeHRWYWx1ZSgpOworICAKKyAgcmV0dXJuIGdldChMaW5lTm8sIENvbE5vLCBTY29wZSwgZHluX2Nhc3Rfb3JfbnVsbDxNRE5vZGU+KE4tPmdldE9wZXJhbmQoMykpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIExMVk1Db250ZXh0SW1wbCBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW50IExMVk1Db250ZXh0SW1wbDo6Z2V0T3JBZGRTY29wZVJlY29yZElkeEVudHJ5KE1ETm9kZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEV4aXN0aW5nSWR4KSB7CisgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSBmb3IgdGhpcyBzY29wZSwgcmV0dXJuIGl0LgorICBpbnQgJklkeCA9IFNjb3BlUmVjb3JkSWR4W1Njb3BlXTsKKyAgaWYgKElkeCkgcmV0dXJuIElkeDsKKyAgCisgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gZW50cnksIGJ1dCBFeGlzdGluZ0lkeCBpcyBzcGVjaWZpZWQsIHVzZSBpdC4KKyAgaWYgKEV4aXN0aW5nSWR4KQorICAgIHJldHVybiBJZHggPSBFeGlzdGluZ0lkeDsKKyAgCisgIC8vIE90aGVyd2lzZSBhZGQgYSBuZXcgZW50cnkuCisgIAorICAvLyBTdGFydCBvdXQgU2NvcGVSZWNvcmRzIHdpdGggYSBtaW5pbWFsIHJlYXNvbmFibGUgc2l6ZSB0byBhdm9pZAorICAvLyBleGNlc3NpdmUgcmVhbGxvY2F0aW9uIHN0YXJ0aW5nIG91dC4KKyAgaWYgKFNjb3BlUmVjb3Jkcy5lbXB0eSgpKQorICAgIFNjb3BlUmVjb3Jkcy5yZXNlcnZlKDEyOCk7CisgIAorICAvLyBJbmRleCBpcyBiaWFzZWQgYnkgMSBmb3IgaW5kZXguCisgIElkeCA9IFNjb3BlUmVjb3Jkcy5zaXplKCkrMTsKKyAgU2NvcGVSZWNvcmRzLnB1c2hfYmFjayhEZWJ1Z1JlY1ZIKFNjb3BlLCB0aGlzLCBJZHgpKTsKKyAgcmV0dXJuIElkeDsKK30KKworaW50IExMVk1Db250ZXh0SW1wbDo6Z2V0T3JBZGRTY29wZUlubGluZWRBdElkeEVudHJ5KE1ETm9kZSAqU2NvcGUsIE1ETm9kZSAqSUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEV4aXN0aW5nSWR4KSB7CisgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSwgcmV0dXJuIGl0LgorICBpbnQgJklkeCA9IFNjb3BlSW5saW5lZEF0SWR4W3N0ZDo6bWFrZV9wYWlyKFNjb3BlLCBJQSldOworICBpZiAoSWR4KSByZXR1cm4gSWR4OworICAKKyAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbnRyeSwgYnV0IEV4aXN0aW5nSWR4IGlzIHNwZWNpZmllZCwgdXNlIGl0LgorICBpZiAoRXhpc3RpbmdJZHgpCisgICAgcmV0dXJuIElkeCA9IEV4aXN0aW5nSWR4OworICAKKyAgLy8gU3RhcnQgb3V0IFNjb3BlSW5saW5lZEF0UmVjb3JkcyB3aXRoIGEgbWluaW1hbCByZWFzb25hYmxlIHNpemUgdG8gYXZvaWQKKyAgLy8gZXhjZXNzaXZlIHJlYWxsb2NhdGlvbiBzdGFydGluZyBvdXQuCisgIGlmIChTY29wZUlubGluZWRBdFJlY29yZHMuZW1wdHkoKSkKKyAgICBTY29wZUlubGluZWRBdFJlY29yZHMucmVzZXJ2ZSgxMjgpOworICAgIAorICAvLyBJbmRleCBpcyBiaWFzZWQgYnkgMSBhbmQgbmVnYXRlZC4KKyAgSWR4ID0gLVNjb3BlSW5saW5lZEF0UmVjb3Jkcy5zaXplKCktMTsKKyAgU2NvcGVJbmxpbmVkQXRSZWNvcmRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihEZWJ1Z1JlY1ZIKFNjb3BlLCB0aGlzLCBJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnUmVjVkgoSUEsIHRoaXMsIElkeCkpKTsKKyAgcmV0dXJuIElkeDsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRGVidWdSZWNWSCBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGRlbGV0ZWQgLSBUaGUgTUROb2RlIHRoaXMgaXMgcG9pbnRpbmcgdG8gZ290IGRlbGV0ZWQsIHNvIHRoaXMgcG9pbnRlciBuZWVkcworLy8vIHRvIGRyb3AgdG8gbnVsbCBhbmQgd2UgbmVlZCByZW1vdmUgb3VyIGVudHJ5IGZyb20gdGhlIERlbnNlTWFwLgordm9pZCBEZWJ1Z1JlY1ZIOjpkZWxldGVkKCkgeworICAvLyBJZiB0aGlzIGlzIGEgIG5vbi1jYW5vbmljYWwgcmVmZXJlbmNlLCBqdXN0IGRyb3AgdGhlIHZhbHVlIHRvIG51bGwsIHdlIGtub3cKKyAgLy8gaXQgZG9lc24ndCBoYXZlIGEgbWFwIGVudHJ5LgorICBpZiAoSWR4ID09IDApIHsKKyAgICBzZXRWYWxQdHIoMCk7CisgICAgcmV0dXJuOworICB9CisgICAgCisgIE1ETm9kZSAqQ3VyID0gZ2V0KCk7CisgIAorICAvLyBJZiB0aGUgaW5kZXggaXMgcG9zaXRpdmUsIGl0IGlzIGFuIGVudHJ5IGluIFNjb3BlUmVjb3Jkcy4KKyAgaWYgKElkeCA+IDApIHsKKyAgICBhc3NlcnQoQ3R4LT5TY29wZVJlY29yZElkeFtDdXJdID09IElkeCAmJiAiTWFwcGluZyBvdXQgb2YgZGF0ZSEiKTsKKyAgICBDdHgtPlNjb3BlUmVjb3JkSWR4LmVyYXNlKEN1cik7CisgICAgLy8gUmVzZXQgdGhpcyBWSCB0byBudWxsIGFuZCB3ZSdyZSBkb25lLgorICAgIHNldFZhbFB0cigwKTsKKyAgICBJZHggPSAwOworICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhbiBlbnRyeSBpbiBTY29wZUlubGluZWRBdFJlY29yZHMsIHdlIGRvbid0IGtub3cgaWYgaXQKKyAgLy8gaXMgdGhlIHNjb3BlIG9yIHRoZSBpbmxpbmVkLWF0IHJlY29yZCBlbnRyeS4KKyAgYXNzZXJ0KHVuc2lnbmVkKC1JZHgtMSkgPCBDdHgtPlNjb3BlSW5saW5lZEF0UmVjb3Jkcy5zaXplKCkpOworICBzdGQ6OnBhaXI8RGVidWdSZWNWSCwgRGVidWdSZWNWSD4gJkVudHJ5ID0gQ3R4LT5TY29wZUlubGluZWRBdFJlY29yZHNbLUlkeC0xXTsKKyAgYXNzZXJ0KCh0aGlzID09ICZFbnRyeS5maXJzdCB8fCB0aGlzID09ICZFbnRyeS5zZWNvbmQpICYmCisgICAgICAgICAiTWFwcGluZyBvdXQgb2YgZGF0ZSEiKTsKKyAgCisgIE1ETm9kZSAqT2xkU2NvcGUgPSBFbnRyeS5maXJzdC5nZXQoKTsKKyAgTUROb2RlICpPbGRJbmxpbmVkQXQgPSBFbnRyeS5zZWNvbmQuZ2V0KCk7CisgIGFzc2VydChPbGRTY29wZSAhPSAwICYmIE9sZElubGluZWRBdCAhPSAwICYmCisgICAgICAgICAiRW50cnkgc2hvdWxkIGJlIG5vbi1jYW5vbmljYWwgaWYgZWl0aGVyIHZhbCBkcm9wcGVkIHRvIG51bGwiKTsKKworICAvLyBPdGhlcndpc2UsIHdlIGRvIGhhdmUgYW4gZW50cnkgaW4gaXQsIG51a2UgaXQgYW5kIHdlJ3JlIGRvbmUuCisgIGFzc2VydChDdHgtPlNjb3BlSW5saW5lZEF0SWR4W3N0ZDo6bWFrZV9wYWlyKE9sZFNjb3BlLCBPbGRJbmxpbmVkQXQpXSA9PSBJZHgmJgorICAgICAgICAgIk1hcHBpbmcgb3V0IG9mIGRhdGUiKTsKKyAgQ3R4LT5TY29wZUlubGluZWRBdElkeC5lcmFzZShzdGQ6Om1ha2VfcGFpcihPbGRTY29wZSwgT2xkSW5saW5lZEF0KSk7CisgIAorICAvLyBSZXNldCB0aGlzIFZIIHRvIG51bGwuICBEcm9wIGJvdGggJ0lkeCcgdmFsdWVzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhhdAorICAvLyB3ZSdyZSBpbiBub24tY2Fub25pY2FsIGZvcm0gbm93LgorICBzZXRWYWxQdHIoMCk7CisgIEVudHJ5LmZpcnN0LklkeCA9IEVudHJ5LnNlY29uZC5JZHggPSAwOworfQorCit2b2lkIERlYnVnUmVjVkg6OmFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKk5ld1ZhKSB7CisgIC8vIElmIGJlaW5nIHJlcGxhY2VkIHdpdGggYSBub24tbWRub2RlIHZhbHVlIChlLmcuIHVuZGVmKSBoYW5kbGUgdGhpcyBhcyBpZgorICAvLyB0aGUgbWRub2RlIGdvdCBkZWxldGVkLgorICBNRE5vZGUgKk5ld1ZhbCA9IGR5bl9jYXN0PE1ETm9kZT4oTmV3VmEpOworICBpZiAoTmV3VmFsID09IDApIHJldHVybiBkZWxldGVkKCk7CisgIAorICAvLyBJZiB0aGlzIGlzIGEgbm9uLWNhbm9uaWNhbCByZWZlcmVuY2UsIGp1c3QgY2hhbmdlIGl0LCB3ZSBrbm93IGl0IGFscmVhZHkKKyAgLy8gZG9lc24ndCBoYXZlIGEgbWFwIGVudHJ5LgorICBpZiAoSWR4ID09IDApIHsKKyAgICBzZXRWYWxQdHIoTmV3VmEpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgTUROb2RlICpPbGRWYWwgPSBnZXQoKTsKKyAgYXNzZXJ0KE9sZFZhbCAhPSBOZXdWYSAmJiAiTm9kZSByZXBsYWNlZCB3aXRoIHNlbGY/Iik7CisgIAorICAvLyBJZiB0aGUgaW5kZXggaXMgcG9zaXRpdmUsIGl0IGlzIGFuIGVudHJ5IGluIFNjb3BlUmVjb3Jkcy4KKyAgaWYgKElkeCA+IDApIHsKKyAgICBhc3NlcnQoQ3R4LT5TY29wZVJlY29yZElkeFtPbGRWYWxdID09IElkeCAmJiAiTWFwcGluZyBvdXQgb2YgZGF0ZSEiKTsKKyAgICBDdHgtPlNjb3BlUmVjb3JkSWR4LmVyYXNlKE9sZFZhbCk7CisgICAgc2V0VmFsUHRyKE5ld1ZhbCk7CisKKyAgICBpbnQgTmV3RW50cnkgPSBDdHgtPmdldE9yQWRkU2NvcGVSZWNvcmRJZHhFbnRyeShOZXdWYWwsIElkeCk7CisgICAgCisgICAgLy8gSWYgTmV3VmFsIGFscmVhZHkgaGFzIGFuIGVudHJ5LCB0aGlzIGJlY29tZXMgYSBub24tY2Fub25pY2FsIHJlZmVyZW5jZSwKKyAgICAvLyBqdXN0IGRyb3AgSWR4IHRvIDAgdG8gc2lnbmlmeSB0aGlzLgorICAgIGlmIChOZXdFbnRyeSAhPSBJZHgpCisgICAgICBJZHggPSAwOworICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhbiBlbnRyeSBpbiBTY29wZUlubGluZWRBdFJlY29yZHMsIHdlIGRvbid0IGtub3cgaWYgaXQKKyAgLy8gaXMgdGhlIHNjb3BlIG9yIHRoZSBpbmxpbmVkLWF0IHJlY29yZCBlbnRyeS4KKyAgYXNzZXJ0KHVuc2lnbmVkKC1JZHgtMSkgPCBDdHgtPlNjb3BlSW5saW5lZEF0UmVjb3Jkcy5zaXplKCkpOworICBzdGQ6OnBhaXI8RGVidWdSZWNWSCwgRGVidWdSZWNWSD4gJkVudHJ5ID0gQ3R4LT5TY29wZUlubGluZWRBdFJlY29yZHNbLUlkeC0xXTsKKyAgYXNzZXJ0KCh0aGlzID09ICZFbnRyeS5maXJzdCB8fCB0aGlzID09ICZFbnRyeS5zZWNvbmQpICYmCisgICAgICAgICAiTWFwcGluZyBvdXQgb2YgZGF0ZSEiKTsKKyAgCisgIE1ETm9kZSAqT2xkU2NvcGUgPSBFbnRyeS5maXJzdC5nZXQoKTsKKyAgTUROb2RlICpPbGRJbmxpbmVkQXQgPSBFbnRyeS5zZWNvbmQuZ2V0KCk7CisgIGFzc2VydChPbGRTY29wZSAhPSAwICYmIE9sZElubGluZWRBdCAhPSAwICYmCisgICAgICAgICAiRW50cnkgc2hvdWxkIGJlIG5vbi1jYW5vbmljYWwgaWYgZWl0aGVyIHZhbCBkcm9wcGVkIHRvIG51bGwiKTsKKyAgCisgIC8vIE90aGVyd2lzZSwgd2UgZG8gaGF2ZSBhbiBlbnRyeSBpbiBpdCwgbnVrZSBpdCBhbmQgd2UncmUgZG9uZS4KKyAgYXNzZXJ0KEN0eC0+U2NvcGVJbmxpbmVkQXRJZHhbc3RkOjptYWtlX3BhaXIoT2xkU2NvcGUsIE9sZElubGluZWRBdCldID09IElkeCYmCisgICAgICAgICAiTWFwcGluZyBvdXQgb2YgZGF0ZSIpOworICBDdHgtPlNjb3BlSW5saW5lZEF0SWR4LmVyYXNlKHN0ZDo6bWFrZV9wYWlyKE9sZFNjb3BlLCBPbGRJbmxpbmVkQXQpKTsKKyAgCisgIC8vIFJlc2V0IHRoaXMgVkggdG8gdGhlIG5ldyB2YWx1ZS4KKyAgc2V0VmFsUHRyKE5ld1ZhbCk7CisKKyAgaW50IE5ld0lkeCA9IEN0eC0+Z2V0T3JBZGRTY29wZUlubGluZWRBdElkeEVudHJ5KEVudHJ5LmZpcnN0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkuc2Vjb25kLmdldCgpLCBJZHgpOworICAvLyBJZiBOZXdWYWwgYWxyZWFkeSBoYXMgYW4gZW50cnksIHRoaXMgYmVjb21lcyBhIG5vbi1jYW5vbmljYWwgcmVmZXJlbmNlLAorICAvLyBqdXN0IGRyb3AgSWR4IHRvIDAgdG8gc2lnbmlmeSB0aGlzLgorICBpZiAoTmV3SWR4ICE9IElkeCkgeworICAgIHN0ZDo6cGFpcjxEZWJ1Z1JlY1ZILCBEZWJ1Z1JlY1ZIPiAmRW50cnk9Q3R4LT5TY29wZUlubGluZWRBdFJlY29yZHNbLUlkeC0xXTsKKyAgICBFbnRyeS5maXJzdC5JZHggPSBFbnRyeS5zZWNvbmQuSWR4ID0gMDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9Eb21pbmF0b3JzLmNwcCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvRG9taW5hdG9ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4ZjVkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvRG9taW5hdG9ycy5jcHAKQEAgLTAsMCArMSwzNTUgQEAKKy8vPT09LSBEb21pbmF0b3JzLmNwcCAtIERvbWluYXRvciBDYWxjdWxhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc2ltcGxlIGRvbWluYXRvciBjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtcyBmb3IgZmluZGluZworLy8gZm9yd2FyZCBkb21pbmF0b3JzLiAgUG9zdGRvbWluYXRvcnMgYXJlIGF2YWlsYWJsZSBpbiBsaWJhbmFseXNpcywgYnV0IGFyZSBub3QKKy8vIGluY2x1ZGVkIGluIGxpYnZtY29yZSwgYmVjYXVzZSBpdCdzIG5vdCBuZWVkZWQuICBGb3J3YXJkIGRvbWluYXRvcnMgYXJlCisvLyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgVmVyaWZpZXIgcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NGRy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldE9wZXJhdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JJbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBBbHdheXMgdmVyaWZ5IGRvbWluZm8gaWYgZXhwZW5zaXZlIGNoZWNraW5nIGlzIGVuYWJsZWQuCisjaWZkZWYgWERFQlVHCitzdGF0aWMgYm9vbCBWZXJpZnlEb21JbmZvID0gdHJ1ZTsKKyNlbHNlCitzdGF0aWMgYm9vbCBWZXJpZnlEb21JbmZvID0gZmFsc2U7CisjZW5kaWYKK3N0YXRpYyBjbDo6b3B0PGJvb2wsdHJ1ZT4KK1ZlcmlmeURvbUluZm9YKCJ2ZXJpZnktZG9tLWluZm8iLCBjbDo6bG9jYXRpb24oVmVyaWZ5RG9tSW5mbyksCisgICAgICAgICAgICAgICBjbDo6ZGVzYygiVmVyaWZ5IGRvbWluYXRvciBpbmZvICh0aW1lIGNvbnN1bWluZykiKSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRG9taW5hdG9yVHJlZSBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQcm92aWRlIHB1YmxpYyBhY2Nlc3MgdG8gRG9taW5hdG9yVHJlZSBpbmZvcm1hdGlvbi4gIEltcGxlbWVudGF0aW9uIGRldGFpbHMKKy8vIGNhbiBiZSBmb3VuZCBpbiBEb21pbmF0b3JDYWxjdWxhdGlvbi5oLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgbGx2bTo6RG9tVHJlZU5vZGVCYXNlPEJhc2ljQmxvY2s+KTsKK1RFTVBMQVRFX0lOU1RBTlRJQVRJT04oY2xhc3MgbGx2bTo6RG9taW5hdG9yVHJlZUJhc2U8QmFzaWNCbG9jaz4pOworCitjaGFyIERvbWluYXRvclRyZWU6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhEb21pbmF0b3JUcmVlLCAiZG9tdHJlZSIsCisgICAgICAgICAgICAgICAgIkRvbWluYXRvciBUcmVlIENvbnN0cnVjdGlvbiIsIHRydWUsIHRydWUpOworCitib29sIERvbWluYXRvclRyZWU6OnJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIHsKKyAgRFQtPnJlY2FsY3VsYXRlKEYpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRG9taW5hdG9yVHJlZTo6dmVyaWZ5QW5hbHlzaXMoKSBjb25zdCB7CisgIGlmICghVmVyaWZ5RG9tSW5mbykgcmV0dXJuOworCisgIEZ1bmN0aW9uICZGID0gKmdldFJvb3QoKS0+Z2V0UGFyZW50KCk7CisKKyAgRG9taW5hdG9yVHJlZSBPdGhlckRUOworICBPdGhlckRULmdldEJhc2UoKS5yZWNhbGN1bGF0ZShGKTsKKyAgYXNzZXJ0KCFjb21wYXJlKE90aGVyRFQpICYmICJJbnZhbGlkIERvbWluYXRvclRyZWUgaW5mbyEiKTsKK30KKwordm9pZCBEb21pbmF0b3JUcmVlOjpwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqKSBjb25zdCB7CisgIERULT5wcmludChPUyk7Cit9CisKKy8vIGRvbWluYXRlcyAtIFJldHVybiB0cnVlIGlmIEEgZG9taW5hdGVzIGEgdXNlIGluIEIuIFRoaXMgcGVyZm9ybXMgdGhlCisvLyBzcGVjaWFsIGNoZWNrcyBuZWNlc3NhcnkgaWYgQSBhbmQgQiBhcmUgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2suCitib29sIERvbWluYXRvclRyZWU6OmRvbWluYXRlcyhjb25zdCBJbnN0cnVjdGlvbiAqQSwgY29uc3QgSW5zdHJ1Y3Rpb24gKkIpIGNvbnN0eworICBjb25zdCBCYXNpY0Jsb2NrICpCQkEgPSBBLT5nZXRQYXJlbnQoKSwgKkJCQiA9IEItPmdldFBhcmVudCgpOworICAKKyAgaWYgKEJCQSAhPSBCQkIpIHJldHVybiBkb21pbmF0ZXMoQkJBLCBCQkIpOworICAKKyAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSBkb21pbmFuY2UgYmV0d2VlbiB0d28gUEhJIG5vZGVzIAorICAvLyBiYXNlZCBvbiB0aGVpciBvcmRlcmluZy4KKyAgaWYgKGlzYTxQSElOb2RlPihBKSAmJiBpc2E8UEhJTm9kZT4oQikpIAorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIExvb3AgdGhyb3VnaCB0aGUgYmFzaWMgYmxvY2sgdW50aWwgd2UgZmluZCBBIG9yIEIuCisgIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBCQkEtPmJlZ2luKCk7CisgIGZvciAoOyAmKkkgIT0gQSAmJiAmKkkgIT0gQjsgKytJKQorICAgIC8qZW1wdHkqLzsKKyAgCisgIHJldHVybiAmKkkgPT0gQTsKK30KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRG9taW5hbmNlRnJvbnRpZXIgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NoYXIgRG9taW5hbmNlRnJvbnRpZXI6OklEID0gMDsKK0lOSVRJQUxJWkVfUEFTUyhEb21pbmFuY2VGcm9udGllciwgImRvbWZyb250aWVyIiwKKyAgICAgICAgICAgICAgICAiRG9taW5hbmNlIEZyb250aWVyIENvbnN0cnVjdGlvbiIsIHRydWUsIHRydWUpOworCit2b2lkIERvbWluYW5jZUZyb250aWVyOjp2ZXJpZnlBbmFseXNpcygpIGNvbnN0IHsKKyAgaWYgKCFWZXJpZnlEb21JbmZvKSByZXR1cm47CisKKyAgRG9taW5hdG9yVHJlZSAmRFQgPSBnZXRBbmFseXNpczxEb21pbmF0b3JUcmVlPigpOworCisgIERvbWluYW5jZUZyb250aWVyIE90aGVyREY7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPiAmRFRSb290cyA9IERULmdldFJvb3RzKCk7CisgIE90aGVyREYuY2FsY3VsYXRlKERULCBEVC5nZXROb2RlKERUUm9vdHNbMF0pKTsKKyAgYXNzZXJ0KCFjb21wYXJlKE90aGVyREYpICYmICJJbnZhbGlkIERvbWluYW5jZUZyb250aWVyIGluZm8hIik7Cit9CisKKy8vIE5ld0JCIGlzIHNwbGl0IGFuZCBub3cgaXQgaGFzIG9uZSBzdWNjZXNzb3IuIFVwZGF0ZSBkb21pbmFuY2UgZnJvbnRpZXIgdG8KKy8vIHJlZmxlY3QgdGhpcyBjaGFuZ2UuCit2b2lkIERvbWluYW5jZUZyb250aWVyOjpzcGxpdEJsb2NrKEJhc2ljQmxvY2sgKk5ld0JCKSB7CisgIGFzc2VydChOZXdCQi0+Z2V0VGVybWluYXRvcigpLT5nZXROdW1TdWNjZXNzb3JzKCkgPT0gMSAmJgorICAgICAgICAgIk5ld0JCIHNob3VsZCBoYXZlIGEgc2luZ2xlIHN1Y2Nlc3NvciEiKTsKKyAgQmFzaWNCbG9jayAqTmV3QkJTdWNjID0gTmV3QkItPmdldFRlcm1pbmF0b3IoKS0+Z2V0U3VjY2Vzc29yKDApOworCisgIC8vIE5ld0JCU3VjYyBpbmhlcml0cyBvcmlnaW5hbCBOZXdCQiBmcm9udGllci4KKyAgRG9taW5hbmNlRnJvbnRpZXI6Oml0ZXJhdG9yIE5ld0JCSSA9IGZpbmQoTmV3QkIpOworICBpZiAoTmV3QkJJICE9IGVuZCgpKQorICAgIGFkZEJhc2ljQmxvY2soTmV3QkJTdWNjLCBOZXdCQkktPnNlY29uZCk7CisKKyAgLy8gSWYgTmV3QkIgZG9taW5hdGVzIE5ld0JCU3VjYywgdGhlbiBERihOZXdCQikgaXMgbm93IGdvaW5nIHRvIGJlIHRoZQorICAvLyBERihOZXdCQlN1Y2MpIHdpdGhvdXQgdGhlIHN0dWZmIHRoYXQgdGhlIG5ldyBibG9jayBkb2VzIG5vdCBkb21pbmF0ZQorICAvLyBhIHByZWRlY2Vzc29yIG9mLgorICBEb21pbmF0b3JUcmVlICZEVCA9IGdldEFuYWx5c2lzPERvbWluYXRvclRyZWU+KCk7CisgIERvbVRyZWVOb2RlICpOZXdCQk5vZGUgPSBEVC5nZXROb2RlKE5ld0JCKTsKKyAgRG9tVHJlZU5vZGUgKk5ld0JCU3VjY05vZGUgPSBEVC5nZXROb2RlKE5ld0JCU3VjYyk7CisgIGlmIChEVC5kb21pbmF0ZXMoTmV3QkJOb2RlLCBOZXdCQlN1Y2NOb2RlKSkgeworICAgIERvbWluYW5jZUZyb250aWVyOjppdGVyYXRvciBERkkgPSBmaW5kKE5ld0JCU3VjYyk7CisgICAgaWYgKERGSSAhPSBlbmQoKSkgeworICAgICAgRG9taW5hbmNlRnJvbnRpZXI6OkRvbVNldFR5cGUgU2V0ID0gREZJLT5zZWNvbmQ7CisgICAgICAvLyBGaWx0ZXIgb3V0IHN0dWZmIGluIFNldCB0aGF0IHdlIGRvIG5vdCBkb21pbmF0ZSBhIHByZWRlY2Vzc29yIG9mLgorICAgICAgZm9yIChEb21pbmFuY2VGcm9udGllcjo6RG9tU2V0VHlwZTo6aXRlcmF0b3IgU2V0SSA9IFNldC5iZWdpbigpLAorICAgICAgICAgICAgIEUgPSBTZXQuZW5kKCk7IFNldEkgIT0gRTspIHsKKyAgICAgICAgYm9vbCBEb21pbmF0ZXNQcmVkID0gZmFsc2U7CisgICAgICAgIGZvciAocHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oKlNldEkpLCBFID0gcHJlZF9lbmQoKlNldEkpOworICAgICAgICAgICAgIFBJICE9IEU7ICsrUEkpCisgICAgICAgICAgaWYgKERULmRvbWluYXRlcyhOZXdCQk5vZGUsIERULmdldE5vZGUoKlBJKSkpIHsKKyAgICAgICAgICAgIERvbWluYXRlc1ByZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBpZiAoIURvbWluYXRlc1ByZWQpCisgICAgICAgICAgU2V0LmVyYXNlKFNldEkrKyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICArK1NldEk7CisgICAgICB9CisKKyAgICAgIGlmIChOZXdCQkkgIT0gZW5kKCkpIHsKKyAgICAgICAgZm9yIChEb21pbmFuY2VGcm9udGllcjo6RG9tU2V0VHlwZTo6aXRlcmF0b3IgU2V0SSA9IFNldC5iZWdpbigpLAorICAgICAgICAgICAgICAgRSA9IFNldC5lbmQoKTsgU2V0SSAhPSBFOyArK1NldEkpIHsKKyAgICAgICAgICBCYXNpY0Jsb2NrICpTQiA9ICpTZXRJOworICAgICAgICAgIGFkZFRvRnJvbnRpZXIoTmV3QkJJLCBTQik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSAKKyAgICAgICAgYWRkQmFzaWNCbG9jayhOZXdCQiwgU2V0KTsKKyAgICB9CisgICAgCisgIH0gZWxzZSB7CisgICAgLy8gREYoTmV3QkIpIGlzIHtOZXdCQlN1Y2N9IGJlY2F1c2UgTmV3QkIgZG9lcyBub3Qgc3RyaWN0bHkgZG9taW5hdGUKKyAgICAvLyBOZXdCQlN1Y2MsIGJ1dCBpdCBkb2VzIGRvbWluYXRlIGl0c2VsZiAoYW5kIHRoZXJlIGlzIGFuIGVkZ2UgKE5ld0JCIC0+CisgICAgLy8gTmV3QkJTdWNjKSkuICBOZXdCQlN1Y2MgaXMgdGhlIHNpbmdsZSBzdWNjZXNzb3Igb2YgTmV3QkIuCisgICAgRG9taW5hbmNlRnJvbnRpZXI6OkRvbVNldFR5cGUgTmV3REZTZXQ7CisgICAgTmV3REZTZXQuaW5zZXJ0KE5ld0JCU3VjYyk7CisgICAgYWRkQmFzaWNCbG9jayhOZXdCQiwgTmV3REZTZXQpOworICB9CisKKyAgLy8gTm93IHVwZGF0ZSBkb21pbmFuY2UgZnJvbnRpZXJzIHdoaWNoIGVpdGhlciB1c2VkIHRvIGNvbnRhaW4gTmV3QkJTdWNjCisgIC8vIG9yIHdoaWNoIG5vdyBuZWVkIHRvIGluY2x1ZGUgTmV3QkIuCisKKyAgLy8gQ29sbGVjdCB0aGUgc2V0IG9mIGJsb2NrcyB3aGljaCBkb21pbmF0ZSBhIHByZWRlY2Vzc29yIG9mIE5ld0JCIG9yCisgIC8vIE5ld1N1Y2NCQiBhbmQgd2hpY2ggZG9uJ3QgZG9taW5hdGUgYm90aC4gVGhpcyBpcyBhbiBpbml0aWFsCisgIC8vIGFwcHJveGltYXRpb24gb2YgdGhlIGJsb2NrcyB3aG9zZSBkb21pbmFuY2UgZnJvbnRpZXJzIHdpbGwgbmVlZCB1cGRhdGVzLgorICBTbWFsbFZlY3RvcjxEb21UcmVlTm9kZSAqLCAxNj4gQWxsUHJlZERvbXM7CisKKyAgLy8gQ29tcHV0ZSB0aGUgYmxvY2sgd2hpY2ggZG9taW5hdGVzIGJvdGggTmV3QkJTdWNjIGFuZCBOZXdCQi4gVGhpcyBpcworICAvLyB0aGUgaW1tZWRpYXRlIGRvbWluYXRvciBvZiBOZXdCQlN1Y2MgdW5sZXNzIE5ld0JCIGRvbWluYXRlcyBOZXdCQlN1Y2MuCisgIC8vIFRoZSBjb2RlIGJlbG93IHdoaWNoIGNsaW1icyBkb21pbmF0b3IgdHJlZXMgd2lsbCBzdG9wIGF0IHRoaXMgcG9pbnQsCisgIC8vIGJlY2F1c2UgZnJvbSB0aGlzIHBvaW50IHVwLCBkb21pbmFuY2UgZnJvbnRpZXJzIGFyZSB1bmFmZmVjdGVkLgorICBEb21UcmVlTm9kZSAqRG9taW5hdGVzQm90aCA9IDA7CisgIGlmIChOZXdCQlN1Y2NOb2RlKSB7CisgICAgRG9taW5hdGVzQm90aCA9IE5ld0JCU3VjY05vZGUtPmdldElEb20oKTsKKyAgICBpZiAoRG9taW5hdGVzQm90aCA9PSBOZXdCQk5vZGUpCisgICAgICBEb21pbmF0ZXNCb3RoID0gTmV3QkJOb2RlLT5nZXRJRG9tKCk7CisgIH0KKworICAvLyBDb2xsZWN0IHRoZSBzZXQgb2YgYWxsIGJsb2NrcyB3aGljaCBkb21pbmF0ZSBhIHByZWRlY2Vzc29yIG9mIE5ld0JCLgorICBTbWFsbFB0clNldDxEb21UcmVlTm9kZSAqLCA4PiBOZXdCQlByZWREb21zOworICBmb3IgKHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKE5ld0JCKSwgRSA9IHByZWRfZW5kKE5ld0JCKTsgUEkgIT0gRTsgKytQSSkKKyAgICBmb3IgKERvbVRyZWVOb2RlICpEVE4gPSBEVC5nZXROb2RlKCpQSSk7IERUTjsgRFROID0gRFROLT5nZXRJRG9tKCkpIHsKKyAgICAgIGlmIChEVE4gPT0gRG9taW5hdGVzQm90aCkKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoIU5ld0JCUHJlZERvbXMuaW5zZXJ0KERUTikpCisgICAgICAgIGJyZWFrOworICAgICAgQWxsUHJlZERvbXMucHVzaF9iYWNrKERUTik7CisgICAgfQorCisgIC8vIENvbGxlY3QgdGhlIHNldCBvZiBhbGwgYmxvY2tzIHdoaWNoIGRvbWluYXRlIGEgcHJlZGVjZXNzb3Igb2YgTmV3U3VjY0JCLgorICBTbWFsbFB0clNldDxEb21UcmVlTm9kZSAqLCA4PiBOZXdCQlN1Y2NQcmVkRG9tczsKKyAgZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihOZXdCQlN1Y2MpLAorICAgICAgIEUgPSBwcmVkX2VuZChOZXdCQlN1Y2MpOyBQSSAhPSBFOyArK1BJKQorICAgIGZvciAoRG9tVHJlZU5vZGUgKkRUTiA9IERULmdldE5vZGUoKlBJKTsgRFROOyBEVE4gPSBEVE4tPmdldElEb20oKSkgeworICAgICAgaWYgKERUTiA9PSBEb21pbmF0ZXNCb3RoKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICghTmV3QkJTdWNjUHJlZERvbXMuaW5zZXJ0KERUTikpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKCFOZXdCQlByZWREb21zLmNvdW50KERUTikpCisgICAgICAgIEFsbFByZWREb21zLnB1c2hfYmFjayhEVE4pOworICAgIH0KKworICAvLyBWaXNpdCBhbGwgcmVsZXZhbnQgZG9taW5hbmNlIGZyb250aWVycyBhbmQgbWFrZSBhbnkgbmVlZGVkIHVwZGF0ZXMuCisgIGZvciAoU21hbGxWZWN0b3JJbXBsPERvbVRyZWVOb2RlICo+Ojpjb25zdF9pdGVyYXRvciBJID0gQWxsUHJlZERvbXMuYmVnaW4oKSwKKyAgICAgICBFID0gQWxsUHJlZERvbXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgRG9tVHJlZU5vZGUgKkRUTiA9ICpJOworICAgIGl0ZXJhdG9yIERGSSA9IGZpbmQoKCpJKS0+Z2V0QmxvY2soKSk7CisKKyAgICAvLyBPbmx5IGNvbnNpZGVyIG5vZGVzIHRoYXQgaGF2ZSBOZXdCQlN1Y2MgaW4gdGhlaXIgZG9taW5hdG9yIGZyb250aWVyLgorICAgIGlmIChERkkgPT0gZW5kKCkgfHwgIURGSS0+c2Vjb25kLmNvdW50KE5ld0JCU3VjYykpIGNvbnRpbnVlOworCisgICAgLy8gSWYgdGhlIGJsb2NrIGRvbWluYXRlcyBhIHByZWRlY2Vzc29yIG9mIE5ld0JCIGJ1dCBkb2VzIG5vdCBwcm9wZXJseQorICAgIC8vIGRvbWluYXRlIE5ld0JCIGl0c2VsZiwgYWRkIE5ld0JCIHRvIGl0cyBkb21pbmFuY2UgZnJvbnRpZXIuCisgICAgaWYgKE5ld0JCUHJlZERvbXMuY291bnQoRFROKSAmJgorICAgICAgICAhRFQucHJvcGVybHlEb21pbmF0ZXMoRFROLCBOZXdCQk5vZGUpKQorICAgICAgYWRkVG9Gcm9udGllcihERkksIE5ld0JCKTsKKworICAgIC8vIElmIHRoZSBibG9jayBkb2VzIG5vdCBkb21pbmF0ZSBhIHByZWRlY2Vzc29yIG9mIE5ld0JCU3VjYyBvcgorICAgIC8vIHByb3Blcmx5IGRvbWluYXRlcyBOZXdCQlN1Y2MgaXRzZWxmLCByZW1vdmUgTmV3QkJTdWNjIGZyb20gaXRzCisgICAgLy8gZG9taW5hbmNlIGZyb250aWVyLgorICAgIGlmICghTmV3QkJTdWNjUHJlZERvbXMuY291bnQoRFROKSB8fAorICAgICAgICBEVC5wcm9wZXJseURvbWluYXRlcyhEVE4sIE5ld0JCU3VjY05vZGUpKQorICAgICAgcmVtb3ZlRnJvbUZyb250aWVyKERGSSwgTmV3QkJTdWNjKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworICBjbGFzcyBERkNhbGN1bGF0ZVdvcmtPYmplY3QgeworICBwdWJsaWM6CisgICAgREZDYWxjdWxhdGVXb3JrT2JqZWN0KEJhc2ljQmxvY2sgKkIsIEJhc2ljQmxvY2sgKlAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9tVHJlZU5vZGUgKlBOKQorICAgIDogY3VycmVudEJCKEIpLCBwYXJlbnRCQihQKSwgTm9kZShOKSwgcGFyZW50Tm9kZShQTikge30KKyAgICBCYXNpY0Jsb2NrICpjdXJyZW50QkI7CisgICAgQmFzaWNCbG9jayAqcGFyZW50QkI7CisgICAgY29uc3QgRG9tVHJlZU5vZGUgKk5vZGU7CisgICAgY29uc3QgRG9tVHJlZU5vZGUgKnBhcmVudE5vZGU7CisgIH07Cit9CisKK2NvbnN0IERvbWluYW5jZUZyb250aWVyOjpEb21TZXRUeXBlICYKK0RvbWluYW5jZUZyb250aWVyOjpjYWxjdWxhdGUoY29uc3QgRG9taW5hdG9yVHJlZSAmRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbVRyZWVOb2RlICpOb2RlKSB7CisgIEJhc2ljQmxvY2sgKkJCID0gTm9kZS0+Z2V0QmxvY2soKTsKKyAgRG9tU2V0VHlwZSAqUmVzdWx0ID0gTlVMTDsKKworICBzdGQ6OnZlY3RvcjxERkNhbGN1bGF0ZVdvcmtPYmplY3Q+IHdvcmtMaXN0OworICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrICosIDMyPiB2aXNpdGVkOworCisgIHdvcmtMaXN0LnB1c2hfYmFjayhERkNhbGN1bGF0ZVdvcmtPYmplY3QoQkIsIE5VTEwsIE5vZGUsIE5VTEwpKTsKKyAgZG8geworICAgIERGQ2FsY3VsYXRlV29ya09iamVjdCAqY3VycmVudFcgPSAmd29ya0xpc3QuYmFjaygpOworICAgIGFzc2VydCAoY3VycmVudFcgJiYgIk1pc3Npbmcgd29yayBvYmplY3QuIik7CisKKyAgICBCYXNpY0Jsb2NrICpjdXJyZW50QkIgPSBjdXJyZW50Vy0+Y3VycmVudEJCOworICAgIEJhc2ljQmxvY2sgKnBhcmVudEJCID0gY3VycmVudFctPnBhcmVudEJCOworICAgIGNvbnN0IERvbVRyZWVOb2RlICpjdXJyZW50Tm9kZSA9IGN1cnJlbnRXLT5Ob2RlOworICAgIGNvbnN0IERvbVRyZWVOb2RlICpwYXJlbnROb2RlID0gY3VycmVudFctPnBhcmVudE5vZGU7CisgICAgYXNzZXJ0IChjdXJyZW50QkIgJiYgIkludmFsaWQgd29yayBvYmplY3QuIE1pc3NpbmcgY3VycmVudCBCYXNpYyBCbG9jayIpOworICAgIGFzc2VydCAoY3VycmVudE5vZGUgJiYgIkludmFsaWQgd29yayBvYmplY3QuIE1pc3NpbmcgY3VycmVudCBOb2RlIik7CisgICAgRG9tU2V0VHlwZSAmUyA9IEZyb250aWVyc1tjdXJyZW50QkJdOworCisgICAgLy8gVmlzaXQgZWFjaCBibG9jayBvbmx5IG9uY2UuCisgICAgaWYgKHZpc2l0ZWQuY291bnQoY3VycmVudEJCKSA9PSAwKSB7CisgICAgICB2aXNpdGVkLmluc2VydChjdXJyZW50QkIpOworCisgICAgICAvLyBMb29wIG92ZXIgQ0ZHIHN1Y2Nlc3NvcnMgdG8gY2FsY3VsYXRlIERGbG9jYWxbY3VycmVudE5vZGVdCisgICAgICBmb3IgKHN1Y2NfaXRlcmF0b3IgU0kgPSBzdWNjX2JlZ2luKGN1cnJlbnRCQiksIFNFID0gc3VjY19lbmQoY3VycmVudEJCKTsKKyAgICAgICAgICAgU0kgIT0gU0U7ICsrU0kpIHsKKyAgICAgICAgLy8gRG9lcyBOb2RlIGltbWVkaWF0ZWx5IGRvbWluYXRlIHRoaXMgc3VjY2Vzc29yPworICAgICAgICBpZiAoRFRbKlNJXS0+Z2V0SURvbSgpICE9IGN1cnJlbnROb2RlKQorICAgICAgICAgIFMuaW5zZXJ0KCpTSSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQXQgdGhpcyBwb2ludCwgUyBpcyBERmxvY2FsLiAgTm93IHdlIHVuaW9uIGluIERGdXAncyBvZiBvdXIgY2hpbGRyZW4uLi4KKyAgICAvLyBMb29wIHRocm91Z2ggYW5kIHZpc2l0IHRoZSBub2RlcyB0aGF0IE5vZGUgaW1tZWRpYXRlbHkgZG9taW5hdGVzIChOb2RlJ3MKKyAgICAvLyBjaGlsZHJlbiBpbiB0aGUgSURvbVRyZWUpCisgICAgYm9vbCB2aXNpdENoaWxkID0gZmFsc2U7CisgICAgZm9yIChEb21UcmVlTm9kZTo6Y29uc3RfaXRlcmF0b3IgTkkgPSBjdXJyZW50Tm9kZS0+YmVnaW4oKSwgCisgICAgICAgICAgIE5FID0gY3VycmVudE5vZGUtPmVuZCgpOyBOSSAhPSBORTsgKytOSSkgeworICAgICAgRG9tVHJlZU5vZGUgKklEb21pbmVlID0gKk5JOworICAgICAgQmFzaWNCbG9jayAqY2hpbGRCQiA9IElEb21pbmVlLT5nZXRCbG9jaygpOworICAgICAgaWYgKHZpc2l0ZWQuY291bnQoY2hpbGRCQikgPT0gMCkgeworICAgICAgICB3b3JrTGlzdC5wdXNoX2JhY2soREZDYWxjdWxhdGVXb3JrT2JqZWN0KGNoaWxkQkIsIGN1cnJlbnRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRG9taW5lZSwgY3VycmVudE5vZGUpKTsKKyAgICAgICAgdmlzaXRDaGlsZCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgYWxsIGNoaWxkcmVuIGFyZSB2aXNpdGVkIG9yIHRoZXJlIGlzIGFueSBjaGlsZCB0aGVuIHBvcCB0aGlzIGJsb2NrCisgICAgLy8gZnJvbSB0aGUgd29ya0xpc3QuCisgICAgaWYgKCF2aXNpdENoaWxkKSB7CisKKyAgICAgIGlmICghcGFyZW50QkIpIHsKKyAgICAgICAgUmVzdWx0ID0gJlM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBEb21TZXRUeXBlOjpjb25zdF9pdGVyYXRvciBDREZJID0gUy5iZWdpbigpLCBDREZFID0gUy5lbmQoKTsKKyAgICAgIERvbVNldFR5cGUgJnBhcmVudFNldCA9IEZyb250aWVyc1twYXJlbnRCQl07CisgICAgICBmb3IgKDsgQ0RGSSAhPSBDREZFOyArK0NERkkpIHsKKyAgICAgICAgaWYgKCFEVC5wcm9wZXJseURvbWluYXRlcyhwYXJlbnROb2RlLCBEVFsqQ0RGSV0pKQorICAgICAgICAgIHBhcmVudFNldC5pbnNlcnQoKkNERkkpOworICAgICAgfQorICAgICAgd29ya0xpc3QucG9wX2JhY2soKTsKKyAgICB9CisKKyAgfSB3aGlsZSAoIXdvcmtMaXN0LmVtcHR5KCkpOworCisgIHJldHVybiAqUmVzdWx0OworfQorCit2b2lkIERvbWluYW5jZUZyb250aWVyQmFzZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUqICkgY29uc3QgeworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgT1MgPDwgIiAgRG9tRnJvbnRpZXIgZm9yIEJCICI7CisgICAgaWYgKEktPmZpcnN0KQorICAgICAgV3JpdGVBc09wZXJhbmQoT1MsIEktPmZpcnN0LCBmYWxzZSk7CisgICAgZWxzZQorICAgICAgT1MgPDwgIiA8PGV4aXQgbm9kZT4+IjsKKyAgICBPUyA8PCAiIGlzOlx0IjsKKyAgICAKKyAgICBjb25zdCBzdGQ6OnNldDxCYXNpY0Jsb2NrKj4gJkJCcyA9IEktPnNlY29uZDsKKyAgICAKKyAgICBmb3IgKHN0ZDo6c2V0PEJhc2ljQmxvY2sqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCcy5iZWdpbigpLCBFID0gQkJzLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIE9TIDw8ICcgJzsKKyAgICAgIGlmICgqSSkKKyAgICAgICAgV3JpdGVBc09wZXJhbmQoT1MsICpJLCBmYWxzZSk7CisgICAgICBlbHNlCisgICAgICAgIE9TIDw8ICI8PGV4aXQgbm9kZT4+IjsKKyAgICB9CisgICAgT1MgPDwgIlxuIjsKKyAgfQorfQorCit2b2lkIERvbWluYW5jZUZyb250aWVyQmFzZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9GdW5jdGlvbi5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0Z1bmN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzc0Yzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9GdW5jdGlvbi5jcHAKQEAgLTAsMCArMSwzNjcgQEAKKy8vPT09LS0gRnVuY3Rpb24uY3BwIC0gSW1wbGVtZW50IHRoZSBHbG9iYWwgb2JqZWN0IGNsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEZ1bmN0aW9uIGNsYXNzIGZvciB0aGUgVk1Db3JlIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTGVha0RldGVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU3RyaW5nUG9vbC5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1JXTXV0ZXguaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaHJlYWRpbmcuaCIKKyNpbmNsdWRlICJTeW1ib2xUYWJsZUxpc3RUcmFpdHNJbXBsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisKKy8vIEV4cGxpY2l0IGluc3RhbnRpYXRpb25zIG9mIFN5bWJvbFRhYmxlTGlzdFRyYWl0cyBzaW5jZSBzb21lIG9mIHRoZSBtZXRob2RzCisvLyBhcmUgbm90IGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUuLi4KK3RlbXBsYXRlIGNsYXNzIGxsdm06OlN5bWJvbFRhYmxlTGlzdFRyYWl0czxBcmd1bWVudCwgRnVuY3Rpb24+OwordGVtcGxhdGUgY2xhc3MgbGx2bTo6U3ltYm9sVGFibGVMaXN0VHJhaXRzPEJhc2ljQmxvY2ssIEZ1bmN0aW9uPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFyZ3VtZW50IEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitBcmd1bWVudDo6QXJndW1lbnQoY29uc3QgVHlwZSAqVHksIEZ1bmN0aW9uICpQYXIpCisgIDogVmFsdWUoVHksIFZhbHVlOjpBcmd1bWVudFZhbCkgeworICBQYXJlbnQgPSAwOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGdldCBhZGRlZCB0byBhIGZ1bmN0aW9uCisgIExlYWtEZXRlY3Rvcjo6YWRkR2FyYmFnZU9iamVjdCh0aGlzKTsKKworICBpZiAoUGFyKQorICAgIFBhci0+Z2V0QXJndW1lbnRMaXN0KCkucHVzaF9iYWNrKHRoaXMpOworfQorCit2b2lkIEFyZ3VtZW50OjpzZXRQYXJlbnQoRnVuY3Rpb24gKnBhcmVudCkgeworICBpZiAoZ2V0UGFyZW50KCkpCisgICAgTGVha0RldGVjdG9yOjphZGRHYXJiYWdlT2JqZWN0KHRoaXMpOworICBQYXJlbnQgPSBwYXJlbnQ7CisgIGlmIChnZXRQYXJlbnQoKSkKKyAgICBMZWFrRGV0ZWN0b3I6OnJlbW92ZUdhcmJhZ2VPYmplY3QodGhpcyk7Cit9CisKKy8vLyBnZXRBcmdObyAtIFJldHVybiB0aGUgaW5kZXggb2YgdGhpcyBmb3JtYWwgYXJndW1lbnQgaW4gaXRzIGNvbnRhaW5pbmcKKy8vLyBmdW5jdGlvbi4gIEZvciBleGFtcGxlIGluICJ2b2lkIGZvbyhpbnQgYSwgZmxvYXQgYikiIGEgaXMgMCBhbmQgYiBpcyAxLiAKK3Vuc2lnbmVkIEFyZ3VtZW50OjpnZXRBcmdObygpIGNvbnN0IHsKKyAgY29uc3QgRnVuY3Rpb24gKkYgPSBnZXRQYXJlbnQoKTsKKyAgYXNzZXJ0KEYgJiYgIkFyZ3VtZW50IGlzIG5vdCBpbiBhIGZ1bmN0aW9uIik7CisgIAorICBGdW5jdGlvbjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEFJID0gRi0+YXJnX2JlZ2luKCk7CisgIHVuc2lnbmVkIEFyZ0lkeCA9IDA7CisgIGZvciAoOyAmKkFJICE9IHRoaXM7ICsrQUkpCisgICAgKytBcmdJZHg7CisKKyAgcmV0dXJuIEFyZ0lkeDsKK30KKworLy8vIGhhc0J5VmFsQXR0ciAtIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBieXZhbCBhdHRyaWJ1dGUgb24gaXQKKy8vLyBpbiBpdHMgY29udGFpbmluZyBmdW5jdGlvbi4KK2Jvb2wgQXJndW1lbnQ6Omhhc0J5VmFsQXR0cigpIGNvbnN0IHsKKyAgaWYgKCFnZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIGdldFBhcmVudCgpLT5wYXJhbUhhc0F0dHIoZ2V0QXJnTm8oKSsxLCBBdHRyaWJ1dGU6OkJ5VmFsKTsKK30KKworLy8vIGhhc05lc3RBdHRyIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIG5lc3QgYXR0cmlidXRlIG9uCisvLy8gaXQgaW4gaXRzIGNvbnRhaW5pbmcgZnVuY3Rpb24uCitib29sIEFyZ3VtZW50OjpoYXNOZXN0QXR0cigpIGNvbnN0IHsKKyAgaWYgKCFnZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIGdldFBhcmVudCgpLT5wYXJhbUhhc0F0dHIoZ2V0QXJnTm8oKSsxLCBBdHRyaWJ1dGU6Ok5lc3QpOworfQorCisvLy8gaGFzTm9BbGlhc0F0dHIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgbm9hbGlhcyBhdHRyaWJ1dGUgb24KKy8vLyBpdCBpbiBpdHMgY29udGFpbmluZyBmdW5jdGlvbi4KK2Jvb2wgQXJndW1lbnQ6Omhhc05vQWxpYXNBdHRyKCkgY29uc3QgeworICBpZiAoIWdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gZ2V0UGFyZW50KCktPnBhcmFtSGFzQXR0cihnZXRBcmdObygpKzEsIEF0dHJpYnV0ZTo6Tm9BbGlhcyk7Cit9CisKKy8vLyBoYXNOb0NhcHR1cmVBdHRyIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIG5vY2FwdHVyZSBhdHRyaWJ1dGUKKy8vLyBvbiBpdCBpbiBpdHMgY29udGFpbmluZyBmdW5jdGlvbi4KK2Jvb2wgQXJndW1lbnQ6Omhhc05vQ2FwdHVyZUF0dHIoKSBjb25zdCB7CisgIGlmICghZ2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBnZXRQYXJlbnQoKS0+cGFyYW1IYXNBdHRyKGdldEFyZ05vKCkrMSwgQXR0cmlidXRlOjpOb0NhcHR1cmUpOworfQorCisvLy8gaGFzU1JldEF0dHIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgc3JldCBhdHRyaWJ1dGUgb24KKy8vLyBpdCBpbiBpdHMgY29udGFpbmluZyBmdW5jdGlvbi4KK2Jvb2wgQXJndW1lbnQ6Omhhc1N0cnVjdFJldEF0dHIoKSBjb25zdCB7CisgIGlmICghZ2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKSByZXR1cm4gZmFsc2U7CisgIGlmICh0aGlzICE9IGdldFBhcmVudCgpLT5hcmdfYmVnaW4oKSkKKyAgICByZXR1cm4gZmFsc2U7IC8vIFN0cnVjdFJldCBwYXJhbSBtdXN0IGJlIGZpcnN0IHBhcmFtCisgIHJldHVybiBnZXRQYXJlbnQoKS0+cGFyYW1IYXNBdHRyKDEsIEF0dHJpYnV0ZTo6U3RydWN0UmV0KTsKK30KKworLy8vIGFkZEF0dHIgLSBBZGQgYSBBdHRyaWJ1dGUgdG8gYW4gYXJndW1lbnQKK3ZvaWQgQXJndW1lbnQ6OmFkZEF0dHIoQXR0cmlidXRlcyBhdHRyKSB7CisgIGdldFBhcmVudCgpLT5hZGRBdHRyaWJ1dGUoZ2V0QXJnTm8oKSArIDEsIGF0dHIpOworfQorCisvLy8gcmVtb3ZlQXR0ciAtIFJlbW92ZSBhIEF0dHJpYnV0ZSBmcm9tIGFuIGFyZ3VtZW50Cit2b2lkIEFyZ3VtZW50OjpyZW1vdmVBdHRyKEF0dHJpYnV0ZXMgYXR0cikgeworICBnZXRQYXJlbnQoKS0+cmVtb3ZlQXR0cmlidXRlKGdldEFyZ05vKCkgKyAxLCBhdHRyKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSGVscGVyIE1ldGhvZHMgaW4gRnVuY3Rpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0xMVk1Db250ZXh0ICZGdW5jdGlvbjo6Z2V0Q29udGV4dCgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFR5cGUoKS0+Z2V0Q29udGV4dCgpOworfQorCitjb25zdCBGdW5jdGlvblR5cGUgKkZ1bmN0aW9uOjpnZXRGdW5jdGlvblR5cGUoKSBjb25zdCB7CisgIHJldHVybiBjYXN0PEZ1bmN0aW9uVHlwZT4oZ2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpKTsKK30KKworYm9vbCBGdW5jdGlvbjo6aXNWYXJBcmcoKSBjb25zdCB7CisgIHJldHVybiBnZXRGdW5jdGlvblR5cGUoKS0+aXNWYXJBcmcoKTsKK30KKworY29uc3QgVHlwZSAqRnVuY3Rpb246OmdldFJldHVyblR5cGUoKSBjb25zdCB7CisgIHJldHVybiBnZXRGdW5jdGlvblR5cGUoKS0+Z2V0UmV0dXJuVHlwZSgpOworfQorCit2b2lkIEZ1bmN0aW9uOjpyZW1vdmVGcm9tUGFyZW50KCkgeworICBnZXRQYXJlbnQoKS0+Z2V0RnVuY3Rpb25MaXN0KCkucmVtb3ZlKHRoaXMpOworfQorCit2b2lkIEZ1bmN0aW9uOjplcmFzZUZyb21QYXJlbnQoKSB7CisgIGdldFBhcmVudCgpLT5nZXRGdW5jdGlvbkxpc3QoKS5lcmFzZSh0aGlzKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZ1bmN0aW9uIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitGdW5jdGlvbjo6RnVuY3Rpb24oY29uc3QgRnVuY3Rpb25UeXBlICpUeSwgTGlua2FnZVR5cGVzIExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJm5hbWUsIE1vZHVsZSAqUGFyZW50TW9kdWxlKQorICA6IEdsb2JhbFZhbHVlKFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHkpLCAKKyAgICAgICAgICAgICAgICBWYWx1ZTo6RnVuY3Rpb25WYWwsIDAsIDAsIExpbmthZ2UsIG5hbWUpIHsKKyAgYXNzZXJ0KEZ1bmN0aW9uVHlwZTo6aXNWYWxpZFJldHVyblR5cGUoZ2V0UmV0dXJuVHlwZSgpKSAmJgorICAgICAgICAgIWdldFJldHVyblR5cGUoKS0+aXNPcGFxdWVUeSgpICYmICJpbnZhbGlkIHJldHVybiB0eXBlIik7CisgIFN5bVRhYiA9IG5ldyBWYWx1ZVN5bWJvbFRhYmxlKCk7CisKKyAgLy8gSWYgdGhlIGZ1bmN0aW9uIGhhcyBhcmd1bWVudHMsIG1hcmsgdGhlbSBhcyBsYXppbHkgYnVpbHQuCisgIGlmIChUeS0+Z2V0TnVtUGFyYW1zKCkpCisgICAgc2V0VmFsdWVTdWJjbGFzc0RhdGEoMSk7ICAgLy8gU2V0IHRoZSAiaGFzIGxhenkgYXJndW1lbnRzIiBiaXQuCisgIAorICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBnZXQgYWRkZWQgdG8gYSBmdW5jdGlvbgorICBMZWFrRGV0ZWN0b3I6OmFkZEdhcmJhZ2VPYmplY3QodGhpcyk7CisKKyAgaWYgKFBhcmVudE1vZHVsZSkKKyAgICBQYXJlbnRNb2R1bGUtPmdldEZ1bmN0aW9uTGlzdCgpLnB1c2hfYmFjayh0aGlzKTsKKworICAvLyBFbnN1cmUgaW50cmluc2ljcyBoYXZlIHRoZSByaWdodCBwYXJhbWV0ZXIgYXR0cmlidXRlcy4KKyAgaW50cmluc2ljSUQgPSBpbml0SW50cmluc2ljSUQoKTsKKyAgaWYgKGludHJpbnNpY0lEKQorICAgIHNldEF0dHJpYnV0ZXMoSW50cmluc2ljOjpnZXRBdHRyaWJ1dGVzKEludHJpbnNpYzo6SUQoaW50cmluc2ljSUQpKSk7Cit9CisKK0Z1bmN0aW9uOjp+RnVuY3Rpb24oKSB7CisgIGRyb3BBbGxSZWZlcmVuY2VzKCk7ICAgIC8vIEFmdGVyIHRoaXMgaXQgaXMgc2FmZSB0byBkZWxldGUgaW5zdHJ1Y3Rpb25zLgorCisgIC8vIERlbGV0ZSBhbGwgb2YgdGhlIG1ldGhvZCBhcmd1bWVudHMgYW5kIHVubGluayBmcm9tIHN5bWJvbCB0YWJsZS4uLgorICBBcmd1bWVudExpc3QuY2xlYXIoKTsKKyAgZGVsZXRlIFN5bVRhYjsKK30KKwordm9pZCBGdW5jdGlvbjo6QnVpbGRMYXp5QXJndW1lbnRzKCkgY29uc3QgeworICAvLyBDcmVhdGUgdGhlIGFyZ3VtZW50cyB2ZWN0b3IsIGFsbCBhcmd1bWVudHMgc3RhcnQgb3V0IHVubmFtZWQuCisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPSBnZXRGdW5jdGlvblR5cGUoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBhc3NlcnQoIUZULT5nZXRQYXJhbVR5cGUoaSktPmlzVm9pZFR5KCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBoYXZlIHZvaWQgdHlwZWQgYXJndW1lbnRzISIpOworICAgIEFyZ3VtZW50TGlzdC5wdXNoX2JhY2sobmV3IEFyZ3VtZW50KEZULT5nZXRQYXJhbVR5cGUoaSkpKTsKKyAgfQorICAKKyAgLy8gQ2xlYXIgdGhlIGxhenkgYXJndW1lbnRzIGJpdC4KKyAgdW5zaWduZWQgU0RDID0gZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCk7CisgIGNvbnN0X2Nhc3Q8RnVuY3Rpb24qPih0aGlzKS0+c2V0VmFsdWVTdWJjbGFzc0RhdGEoU0RDICY9IH4xKTsKK30KKworc2l6ZV90IEZ1bmN0aW9uOjphcmdfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldEZ1bmN0aW9uVHlwZSgpLT5nZXROdW1QYXJhbXMoKTsKK30KK2Jvb2wgRnVuY3Rpb246OmFyZ19lbXB0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldEZ1bmN0aW9uVHlwZSgpLT5nZXROdW1QYXJhbXMoKSA9PSAwOworfQorCit2b2lkIEZ1bmN0aW9uOjpzZXRQYXJlbnQoTW9kdWxlICpwYXJlbnQpIHsKKyAgaWYgKGdldFBhcmVudCgpKQorICAgIExlYWtEZXRlY3Rvcjo6YWRkR2FyYmFnZU9iamVjdCh0aGlzKTsKKyAgUGFyZW50ID0gcGFyZW50OworICBpZiAoZ2V0UGFyZW50KCkpCisgICAgTGVha0RldGVjdG9yOjpyZW1vdmVHYXJiYWdlT2JqZWN0KHRoaXMpOworfQorCisvLyBkcm9wQWxsUmVmZXJlbmNlcygpIC0gVGhpcyBmdW5jdGlvbiBjYXVzZXMgYWxsIHRoZSBzdWJpbnN0cnVjdGlvbnMgdG8gImxldAorLy8gZ28iIG9mIGFsbCByZWZlcmVuY2VzIHRoYXQgdGhleSBhcmUgbWFpbnRhaW5pbmcuICBUaGlzIGFsbG93cyBvbmUgdG8KKy8vICdkZWxldGUnIGEgd2hvbGUgY2xhc3MgYXQgYSB0aW1lLCBldmVuIHRob3VnaCB0aGVyZSBtYXkgYmUgY2lyY3VsYXIKKy8vIHJlZmVyZW5jZXMuLi4gZmlyc3QgYWxsIHJlZmVyZW5jZXMgYXJlIGRyb3BwZWQsIGFuZCBhbGwgdXNlIGNvdW50cyBnbyB0bworLy8gemVyby4gIFRoZW4gZXZlcnl0aGluZyBpcyBkZWxldGVkIGZvciByZWFsLiAgTm90ZSB0aGF0IG5vIG9wZXJhdGlvbnMgYXJlCisvLyB2YWxpZCBvbiBhbiBvYmplY3QgdGhhdCBoYXMgImRyb3BwZWQgYWxsIHJlZmVyZW5jZXMiLCBleGNlcHQgb3BlcmF0b3IKKy8vIGRlbGV0ZS4KKy8vCit2b2lkIEZ1bmN0aW9uOjpkcm9wQWxsUmVmZXJlbmNlcygpIHsKKyAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBJLT5kcm9wQWxsUmVmZXJlbmNlcygpOworICAKKyAgLy8gRGVsZXRlIGFsbCBiYXNpYyBibG9ja3MuCisgIHdoaWxlICghQmFzaWNCbG9ja3MuZW1wdHkoKSkgeworICAgIC8vIElmIHRoZXJlIGlzIHN0aWxsIGEgcmVmZXJlbmNlIHRvIHRoZSBibG9jaywgaXQgbXVzdCBiZSBhICdibG9ja2FkZHJlc3MnCisgICAgLy8gY29uc3RhbnQgcG9pbnRpbmcgdG8gaXQuICBKdXN0IHJlcGxhY2UgdGhlIEJsb2NrQWRkcmVzcyB3aXRoIHVuZGVmLgorICAgIEJhc2ljQmxvY2sgKkJCID0gQmFzaWNCbG9ja3MuYmVnaW4oKTsKKyAgICBpZiAoIUJCLT51c2VfZW1wdHkoKSkgeworICAgICAgQmxvY2tBZGRyZXNzICpCQSA9IGNhc3Q8QmxvY2tBZGRyZXNzPihCQi0+dXNlX2JhY2soKSk7CisgICAgICBCQS0+cmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChCQS0+Z2V0VHlwZSgpKSk7CisgICAgICBCQS0+ZGVzdHJveUNvbnN0YW50KCk7CisgICAgfQorICAgIAorICAgIEJCLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorfQorCit2b2lkIEZ1bmN0aW9uOjphZGRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlcyBhdHRyKSB7CisgIEF0dHJMaXN0UHRyIFBBTCA9IGdldEF0dHJpYnV0ZXMoKTsKKyAgUEFMID0gUEFMLmFkZEF0dHIoaSwgYXR0cik7CisgIHNldEF0dHJpYnV0ZXMoUEFMKTsKK30KKwordm9pZCBGdW5jdGlvbjo6cmVtb3ZlQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZXMgYXR0cikgeworICBBdHRyTGlzdFB0ciBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgIFBBTCA9IFBBTC5yZW1vdmVBdHRyKGksIGF0dHIpOworICBzZXRBdHRyaWJ1dGVzKFBBTCk7Cit9CisKKy8vLyBjb3B5QXR0cmlidXRlc0Zyb20gLSBjb3B5IGFsbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKHRob3NlIG5vdCBuZWVkZWQgdG8KKy8vLyBjcmVhdGUgYSBGdW5jdGlvbikgZnJvbSB0aGUgRnVuY3Rpb24gU3JjIHRvIHRoaXMgb25lLgordm9pZCBGdW5jdGlvbjo6Y29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEdsb2JhbFZhbHVlICpTcmMpIHsKKyAgYXNzZXJ0KGlzYTxGdW5jdGlvbj4oU3JjKSAmJiAiRXhwZWN0ZWQgYSBGdW5jdGlvbiEiKTsKKyAgR2xvYmFsVmFsdWU6OmNvcHlBdHRyaWJ1dGVzRnJvbShTcmMpOworICBjb25zdCBGdW5jdGlvbiAqU3JjRiA9IGNhc3Q8RnVuY3Rpb24+KFNyYyk7CisgIHNldENhbGxpbmdDb252KFNyY0YtPmdldENhbGxpbmdDb252KCkpOworICBzZXRBdHRyaWJ1dGVzKFNyY0YtPmdldEF0dHJpYnV0ZXMoKSk7Cit9CisKKy8vLyBpbml0SW50cmluc2ljSUQgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBJRCBudW1iZXIgb2YgdGhlIHNwZWNpZmllZAorLy8vIGZ1bmN0aW9uLCBvciBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWMgaWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBhbgorLy8vIGludHJpbnNpYywgb3IgaWYgdGhlIHBvaW50ZXIgaXMgbnVsbC4gIFRoaXMgdmFsdWUgaXMgYWx3YXlzIGRlZmluZWQgdG8gYmUKKy8vLyB6ZXJvIHRvIGFsbG93IGVhc3kgY2hlY2tpbmcgZm9yIHdoZXRoZXIgYSBmdW5jdGlvbiBpcyBpbnRyaW5zaWMgb3Igbm90LiAgVGhlCisvLy8gcGFydGljdWxhciBpbnRyaW5zaWMgZnVuY3Rpb25zIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhpcyB2YWx1ZSBhcmUgZGVmaW5lZCBpbgorLy8vIGxsdm0vSW50cmluc2ljcy5oLgorLy8vCit1bnNpZ25lZCBGdW5jdGlvbjo6aW5pdEludHJpbnNpY0lEKCkgY29uc3QgeworICBjb25zdCBWYWx1ZU5hbWUgKlZhbE5hbWUgPSB0aGlzLT5nZXRWYWx1ZU5hbWUoKTsKKyAgaWYgKCFWYWxOYW1lKQorICAgIHJldHVybiAwOworICB1bnNpZ25lZCBMZW4gPSBWYWxOYW1lLT5nZXRLZXlMZW5ndGgoKTsKKyAgY29uc3QgY2hhciAqTmFtZSA9IFZhbE5hbWUtPmdldEtleURhdGEoKTsKKyAgCisgIGlmIChMZW4gPCA1IHx8IE5hbWVbNF0gIT0gJy4nIHx8IE5hbWVbMF0gIT0gJ2wnIHx8IE5hbWVbMV0gIT0gJ2wnCisgICAgICB8fCBOYW1lWzJdICE9ICd2JyB8fCBOYW1lWzNdICE9ICdtJykKKyAgICByZXR1cm4gMDsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggJ2xsdm0uJworCisjZGVmaW5lIEdFVF9GVU5DVElPTl9SRUNPR05JWkVSCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmdlbiIKKyN1bmRlZiBHRVRfRlVOQ1RJT05fUkVDT0dOSVpFUgorICByZXR1cm4gMDsKK30KKworc3RkOjpzdHJpbmcgSW50cmluc2ljOjpnZXROYW1lKElEIGlkLCBjb25zdCBUeXBlICoqVHlzLCB1bnNpZ25lZCBudW1UeXMpIHsgCisgIGFzc2VydChpZCA8IG51bV9pbnRyaW5zaWNzICYmICJJbnZhbGlkIGludHJpbnNpYyBJRCEiKTsKKyAgY29uc3QgY2hhciAqIGNvbnN0IFRhYmxlW10gPSB7CisgICAgIm5vdF9pbnRyaW5zaWMiLAorI2RlZmluZSBHRVRfSU5UUklOU0lDX05BTUVfVEFCTEUKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuZ2VuIgorI3VuZGVmIEdFVF9JTlRSSU5TSUNfTkFNRV9UQUJMRQorICB9OworICBpZiAobnVtVHlzID09IDApCisgICAgcmV0dXJuIFRhYmxlW2lkXTsKKyAgc3RkOjpzdHJpbmcgUmVzdWx0KFRhYmxlW2lkXSk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1UeXM7ICsraSkgeworICAgIGlmIChjb25zdCBQb2ludGVyVHlwZSogUFR5cCA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihUeXNbaV0pKSB7CisgICAgICBSZXN1bHQgKz0gIi5wIiArIGxsdm06OnV0b3N0cihQVHlwLT5nZXRBZGRyZXNzU3BhY2UoKSkgKyAKKyAgICAgICAgICAgICAgICBFVlQ6OmdldEVWVChQVHlwLT5nZXRFbGVtZW50VHlwZSgpKS5nZXRFVlRTdHJpbmcoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoVHlzW2ldKQorICAgICAgUmVzdWx0ICs9ICIuIiArIEVWVDo6Z2V0RVZUKFR5c1tpXSkuZ2V0RVZUU3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIFJlc3VsdDsKK30KKworY29uc3QgRnVuY3Rpb25UeXBlICpJbnRyaW5zaWM6OmdldFR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCBpZCwgY29uc3QgVHlwZSAqKlR5cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1UeXMpIHsKKyAgY29uc3QgVHlwZSAqUmVzdWx0VHkgPSBOVUxMOworICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gQXJnVHlzOworICBib29sIElzVmFyQXJnID0gZmFsc2U7CisgIAorI2RlZmluZSBHRVRfSU5UUklOU0lDX0dFTkVSQVRPUgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5nZW4iCisjdW5kZWYgR0VUX0lOVFJJTlNJQ19HRU5FUkFUT1IKKworICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoUmVzdWx0VHksIEFyZ1R5cywgSXNWYXJBcmcpOyAKK30KKworYm9vbCBJbnRyaW5zaWM6OmlzT3ZlcmxvYWRlZChJRCBpZCkgeworICBjb25zdCBib29sIE9UYWJsZVtdID0geworICAgIGZhbHNlLAorI2RlZmluZSBHRVRfSU5UUklOU0lDX09WRVJMT0FEX1RBQkxFCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmdlbiIKKyN1bmRlZiBHRVRfSU5UUklOU0lDX09WRVJMT0FEX1RBQkxFCisgIH07CisgIHJldHVybiBPVGFibGVbaWRdOworfQorCisvLy8gVGhpcyBkZWZpbmVzIHRoZSAiSW50cmluc2ljOjpnZXRBdHRyaWJ1dGVzKElEIGlkKSIgbWV0aG9kLgorI2RlZmluZSBHRVRfSU5UUklOU0lDX0FUVFJJQlVURVMKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuZ2VuIgorI3VuZGVmIEdFVF9JTlRSSU5TSUNfQVRUUklCVVRFUworCitGdW5jdGlvbiAqSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihNb2R1bGUgKk0sIElEIGlkLCBjb25zdCBUeXBlICoqVHlzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bVR5cykgeworICAvLyBUaGVyZSBjYW4gbmV2ZXIgYmUgbXVsdGlwbGUgZ2xvYmFscyB3aXRoIHRoZSBzYW1lIG5hbWUgb2YgZGlmZmVyZW50IHR5cGVzLAorICAvLyBiZWNhdXNlIGludHJpbnNpY3MgbXVzdCBiZSBhIHNwZWNpZmljIHR5cGUuCisgIHJldHVybgorICAgIGNhc3Q8RnVuY3Rpb24+KE0tPmdldE9ySW5zZXJ0RnVuY3Rpb24oZ2V0TmFtZShpZCwgVHlzLCBudW1UeXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZShNLT5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBUeXMsIG51bVR5cykpKTsKK30KKworLy8gVGhpcyBkZWZpbmVzIHRoZSAiSW50cmluc2ljOjpnZXRJbnRyaW5zaWNGb3JHQ0NCdWlsdGluKCkiIG1ldGhvZC4KKyNkZWZpbmUgR0VUX0xMVk1fSU5UUklOU0lDX0ZPUl9HQ0NfQlVJTFRJTgorI2luY2x1ZGUgImxsdm0vSW50cmluc2ljcy5nZW4iCisjdW5kZWYgR0VUX0xMVk1fSU5UUklOU0lDX0ZPUl9HQ0NfQlVJTFRJTgorCisvLy8gaGFzQWRkcmVzc1Rha2VuIC0gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgdXNlcyBvZiB0aGlzIGZ1bmN0aW9uCisvLy8gb3RoZXIgdGhhbiBkaXJlY3QgY2FsbHMgb3IgaW52b2tlcyB0byBpdC4KK2Jvb2wgRnVuY3Rpb246Omhhc0FkZHJlc3NUYWtlbihjb25zdCBVc2VyKiAqUHV0T2ZmZW5kZXIpIGNvbnN0IHsKKyAgZm9yIChWYWx1ZTo6Y29uc3RfdXNlX2l0ZXJhdG9yIEkgPSB1c2VfYmVnaW4oKSwgRSA9IHVzZV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBVc2VyICpVID0gKkk7CisgICAgaWYgKCFpc2E8Q2FsbEluc3Q+KFUpICYmICFJU0FfSU5WT0tFX0lOU1QoVSkpCisgICAgICByZXR1cm4gUHV0T2ZmZW5kZXIgPyAoKlB1dE9mZmVuZGVyID0gVSwgdHJ1ZSkgOiB0cnVlOworICAgIEltbXV0YWJsZUNhbGxTaXRlIENTKGNhc3Q8SW5zdHJ1Y3Rpb24+KFUpKTsKKyAgICBpZiAoIUNTLmlzQ2FsbGVlKEkpKQorICAgICAgcmV0dXJuIFB1dE9mZmVuZGVyID8gKCpQdXRPZmZlbmRlciA9IFUsIHRydWUpIDogdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHZpbTogc3c9MiBhaQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9HVk1hdGVyaWFsaXplci5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0dWTWF0ZXJpYWxpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzdhOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9HVk1hdGVyaWFsaXplci5jcHAKQEAgLTAsMCArMSwxOCBAQAorLy89PT0tLSBHVk1hdGVyaWFsaXplci5jcHAgLSBCYXNlIGltcGxlbWVudGF0aW9uIGZvciBHViBtYXRlcmlhbGl6ZXJzIC0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBNaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIG1hdGVyaWFsaXppbmcKKy8vIEdsb2JhbFZhbHVlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9HVk1hdGVyaWFsaXplci5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK0dWTWF0ZXJpYWxpemVyOjp+R1ZNYXRlcmlhbGl6ZXIoKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9HbG9iYWxzLmNwcCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvR2xvYmFscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3MTZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvR2xvYmFscy5jcHAKQEAgLTAsMCArMSwzMTAgQEAKKy8vPT09LS0gR2xvYmFscy5jcHAgLSBJbXBsZW1lbnQgdGhlIEdsb2JhbFZhbHVlICYgR2xvYmFsVmFyaWFibGUgY2xhc3MgLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEdsb2JhbFZhbHVlICYgR2xvYmFsVmFyaWFibGUgY2xhc3NlcyBmb3IgdGhlIFZNQ29yZQorLy8gbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxBbGlhcy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0xlYWtEZXRlY3Rvci5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZSBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIHJlbW92ZURlYWRVc2Vyc09mQ29uc3RhbnQgLSBJZiB0aGUgc3BlY2lmaWVkIGNvbnN0YW50ZXhwciBpcyBkZWFkLCByZW1vdmUKKy8vLyBpdC4gIFRoaXMgaW52b2x2ZXMgcmVjdXJzaXZlbHkgZWxpbWluYXRpbmcgYW55IGRlYWQgdXNlcnMgb2YgdGhlCisvLy8gY29uc3RhbnRleHByLgorc3RhdGljIGJvb2wgcmVtb3ZlRGVhZFVzZXJzT2ZDb25zdGFudChjb25zdCBDb25zdGFudCAqQykgeworICBpZiAoaXNhPEdsb2JhbFZhbHVlPihDKSkgcmV0dXJuIGZhbHNlOyAvLyBDYW5ub3QgcmVtb3ZlIHRoaXMKKworICB3aGlsZSAoIUMtPnVzZV9lbXB0eSgpKSB7CisgICAgY29uc3QgQ29uc3RhbnQgKlVzZXIgPSBkeW5fY2FzdDxDb25zdGFudD4oQy0+dXNlX2JhY2soKSk7CisgICAgaWYgKCFVc2VyKSByZXR1cm4gZmFsc2U7IC8vIE5vbi1jb25zdGFudCB1c2FnZTsKKyAgICBpZiAoIXJlbW92ZURlYWRVc2Vyc09mQ29uc3RhbnQoVXNlcikpCisgICAgICByZXR1cm4gZmFsc2U7IC8vIENvbnN0YW50IHdhc24ndCBkZWFkCisgIH0KKworICBjb25zdF9jYXN0PENvbnN0YW50Kj4oQyktPmRlc3Ryb3lDb25zdGFudCgpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHbG9iYWxWYWx1ZTo6aXNNYXRlcmlhbGl6YWJsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFBhcmVudCgpICYmIGdldFBhcmVudCgpLT5pc01hdGVyaWFsaXphYmxlKHRoaXMpOworfQorYm9vbCBHbG9iYWxWYWx1ZTo6aXNEZW1hdGVyaWFsaXphYmxlKCkgY29uc3QgeworICByZXR1cm4gZ2V0UGFyZW50KCkgJiYgZ2V0UGFyZW50KCktPmlzRGVtYXRlcmlhbGl6YWJsZSh0aGlzKTsKK30KK2Jvb2wgR2xvYmFsVmFsdWU6Ok1hdGVyaWFsaXplKHN0ZDo6c3RyaW5nICpFcnJJbmZvKSB7CisgIHJldHVybiBnZXRQYXJlbnQoKS0+TWF0ZXJpYWxpemUodGhpcywgRXJySW5mbyk7Cit9Cit2b2lkIEdsb2JhbFZhbHVlOjpEZW1hdGVyaWFsaXplKCkgeworICBnZXRQYXJlbnQoKS0+RGVtYXRlcmlhbGl6ZSh0aGlzKTsKK30KKworLy8vIHJlbW92ZURlYWRDb25zdGFudFVzZXJzIC0gSWYgdGhlcmUgYXJlIGFueSBkZWFkIGNvbnN0YW50IHVzZXJzIGRhbmdsaW5nCisvLy8gb2ZmIG9mIHRoaXMgZ2xvYmFsIHZhbHVlLCByZW1vdmUgdGhlbS4gIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgY2xpZW50cworLy8vIHRoYXQgd2FudCB0byBjaGVjayB0byBzZWUgaWYgYSBnbG9iYWwgaXMgdW51c2VkLCBidXQgZG9uJ3Qgd2FudCB0byBkZWFsCisvLy8gd2l0aCBwb3RlbnRpYWxseSBkZWFkIGNvbnN0YW50cyBoYW5naW5nIG9mZiBvZiB0aGUgZ2xvYmFscy4KK3ZvaWQgR2xvYmFsVmFsdWU6OnJlbW92ZURlYWRDb25zdGFudFVzZXJzKCkgY29uc3QgeworICBWYWx1ZTo6Y29uc3RfdXNlX2l0ZXJhdG9yIEkgPSB1c2VfYmVnaW4oKSwgRSA9IHVzZV9lbmQoKTsKKyAgVmFsdWU6OmNvbnN0X3VzZV9pdGVyYXRvciBMYXN0Tm9uRGVhZFVzZXIgPSBFOworICB3aGlsZSAoSSAhPSBFKSB7CisgICAgaWYgKGNvbnN0IENvbnN0YW50ICpVc2VyID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KCpJKSkgeworICAgICAgaWYgKCFyZW1vdmVEZWFkVXNlcnNPZkNvbnN0YW50KFVzZXIpKSB7CisgICAgICAgIC8vIElmIHRoZSBjb25zdGFudCB3YXNuJ3QgZGVhZCwgcmVtZW1iZXIgdGhhdCB0aGlzIHdhcyB0aGUgbGFzdCBsaXZlIHVzZQorICAgICAgICAvLyBhbmQgbW92ZSBvbiB0byB0aGUgbmV4dCBjb25zdGFudC4KKyAgICAgICAgTGFzdE5vbkRlYWRVc2VyID0gSTsKKyAgICAgICAgKytJOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgdGhlIGNvbnN0YW50IHdhcyBkZWFkLCB0aGVuIHRoZSBpdGVyYXRvciBpcyBpbnZhbGlkYXRlZC4KKyAgICAgICAgaWYgKExhc3ROb25EZWFkVXNlciA9PSBFKSB7CisgICAgICAgICAgSSA9IHVzZV9iZWdpbigpOworICAgICAgICAgIGlmIChJID09IEUpIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEkgPSBMYXN0Tm9uRGVhZFVzZXI7CisgICAgICAgICAgKytJOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIExhc3ROb25EZWFkVXNlciA9IEk7CisgICAgICArK0k7CisgICAgfQorICB9Cit9CisKKworLy8vIE92ZXJyaWRlIGRlc3Ryb3lDb25zdGFudCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBnZXQgY2FsbGVkIG9uCisvLy8gR2xvYmFsVmFsdWUncyBiZWNhdXNlIHRoZXkgc2hvdWxkbid0IGJlIHRyZWF0ZWQgbGlrZSBvdGhlciBjb25zdGFudHMuCit2b2lkIEdsb2JhbFZhbHVlOjpkZXN0cm95Q29uc3RhbnQoKSB7CisgIGxsdm1fdW5yZWFjaGFibGUoIllvdSBjYW4ndCBHVi0+ZGVzdHJveUNvbnN0YW50KCkhIik7Cit9CisKKy8vLyBjb3B5QXR0cmlidXRlc0Zyb20gLSBjb3B5IGFsbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKHRob3NlIG5vdCBuZWVkZWQgdG8KKy8vLyBjcmVhdGUgYSBHbG9iYWxWYWx1ZSkgZnJvbSB0aGUgR2xvYmFsVmFsdWUgU3JjIHRvIHRoaXMgb25lLgordm9pZCBHbG9iYWxWYWx1ZTo6Y29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEdsb2JhbFZhbHVlICpTcmMpIHsKKyAgc2V0QWxpZ25tZW50KFNyYy0+Z2V0QWxpZ25tZW50KCkpOworICBzZXRTZWN0aW9uKFNyYy0+Z2V0U2VjdGlvbigpKTsKKyAgc2V0VmlzaWJpbGl0eShTcmMtPmdldFZpc2liaWxpdHkoKSk7Cit9CisKK3ZvaWQgR2xvYmFsVmFsdWU6OnNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeworICBhc3NlcnQoKEFsaWduICYgKEFsaWduLTEpKSA9PSAwICYmICJBbGlnbm1lbnQgaXMgbm90IGEgcG93ZXIgb2YgMiEiKTsKKyAgYXNzZXJ0KEFsaWduIDw9IE1heGltdW1BbGlnbm1lbnQgJiYKKyAgICAgICAgICJBbGlnbm1lbnQgaXMgZ3JlYXRlciB0aGFuIE1heGltdW1BbGlnbm1lbnQhIik7CisgIEFsaWdubWVudCA9IExvZzJfMzIoQWxpZ24pICsgMTsKKyAgYXNzZXJ0KGdldEFsaWdubWVudCgpID09IEFsaWduICYmICJBbGlnbm1lbnQgcmVwcmVzZW50YXRpb24gZXJyb3IhIik7Cit9CisgIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdsb2JhbFZhcmlhYmxlIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitHbG9iYWxWYXJpYWJsZTo6R2xvYmFsVmFyaWFibGUoY29uc3QgVHlwZSAqVHksIGJvb2wgY29uc3RhbnQsIExpbmthZ2VUeXBlcyBMaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJbml0VmFsLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFRocmVhZExvY2FsLCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UpCisgIDogR2xvYmFsVmFsdWUoUG9pbnRlclR5cGU6OmdldChUeSwgQWRkcmVzc1NwYWNlKSwgCisgICAgICAgICAgICAgICAgVmFsdWU6Okdsb2JhbFZhcmlhYmxlVmFsLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8R2xvYmFsVmFyaWFibGU+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICBJbml0VmFsICE9IDAsIExpbmssIE5hbWUpLAorICAgIGlzQ29uc3RhbnRHbG9iYWwoY29uc3RhbnQpLCBpc1RocmVhZExvY2FsU3ltYm9sKFRocmVhZExvY2FsKSB7CisgIGlmIChJbml0VmFsKSB7CisgICAgYXNzZXJ0KEluaXRWYWwtPmdldFR5cGUoKSA9PSBUeSAmJgorICAgICAgICAgICAiSW5pdGlhbGl6ZXIgc2hvdWxkIGJlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIEdsb2JhbFZhcmlhYmxlISIpOworICAgIE9wPDA+KCkgPSBJbml0VmFsOworICB9CisKKyAgTGVha0RldGVjdG9yOjphZGRHYXJiYWdlT2JqZWN0KHRoaXMpOworfQorCitHbG9iYWxWYXJpYWJsZTo6R2xvYmFsVmFyaWFibGUoTW9kdWxlICZNLCBjb25zdCBUeXBlICpUeSwgYm9vbCBjb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rYWdlVHlwZXMgTGluaywgQ29uc3RhbnQgKkluaXRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFyaWFibGUgKkJlZm9yZSwgYm9vbCBUaHJlYWRMb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UpCisgIDogR2xvYmFsVmFsdWUoUG9pbnRlclR5cGU6OmdldChUeSwgQWRkcmVzc1NwYWNlKSwgCisgICAgICAgICAgICAgICAgVmFsdWU6Okdsb2JhbFZhcmlhYmxlVmFsLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8R2xvYmFsVmFyaWFibGU+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICBJbml0VmFsICE9IDAsIExpbmssIE5hbWUpLAorICAgIGlzQ29uc3RhbnRHbG9iYWwoY29uc3RhbnQpLCBpc1RocmVhZExvY2FsU3ltYm9sKFRocmVhZExvY2FsKSB7CisgIGlmIChJbml0VmFsKSB7CisgICAgYXNzZXJ0KEluaXRWYWwtPmdldFR5cGUoKSA9PSBUeSAmJgorICAgICAgICAgICAiSW5pdGlhbGl6ZXIgc2hvdWxkIGJlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIEdsb2JhbFZhcmlhYmxlISIpOworICAgIE9wPDA+KCkgPSBJbml0VmFsOworICB9CisgIAorICBMZWFrRGV0ZWN0b3I6OmFkZEdhcmJhZ2VPYmplY3QodGhpcyk7CisgIAorICBpZiAoQmVmb3JlKQorICAgIEJlZm9yZS0+Z2V0UGFyZW50KCktPmdldEdsb2JhbExpc3QoKS5pbnNlcnQoQmVmb3JlLCB0aGlzKTsKKyAgZWxzZQorICAgIE0uZ2V0R2xvYmFsTGlzdCgpLnB1c2hfYmFjayh0aGlzKTsKK30KKwordm9pZCBHbG9iYWxWYXJpYWJsZTo6c2V0UGFyZW50KE1vZHVsZSAqcGFyZW50KSB7CisgIGlmIChnZXRQYXJlbnQoKSkKKyAgICBMZWFrRGV0ZWN0b3I6OmFkZEdhcmJhZ2VPYmplY3QodGhpcyk7CisgIFBhcmVudCA9IHBhcmVudDsKKyAgaWYgKGdldFBhcmVudCgpKQorICAgIExlYWtEZXRlY3Rvcjo6cmVtb3ZlR2FyYmFnZU9iamVjdCh0aGlzKTsKK30KKwordm9pZCBHbG9iYWxWYXJpYWJsZTo6cmVtb3ZlRnJvbVBhcmVudCgpIHsKKyAgZ2V0UGFyZW50KCktPmdldEdsb2JhbExpc3QoKS5yZW1vdmUodGhpcyk7Cit9CisKK3ZvaWQgR2xvYmFsVmFyaWFibGU6OmVyYXNlRnJvbVBhcmVudCgpIHsKKyAgZ2V0UGFyZW50KCktPmdldEdsb2JhbExpc3QoKS5lcmFzZSh0aGlzKTsKK30KKwordm9pZCBHbG9iYWxWYXJpYWJsZTo6cmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50KFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlICpVKSB7CisgIC8vIElmIHlvdSBjYWxsIHRoaXMsIHRoZW4geW91IGJldHRlciBrbm93IHRoaXMgR1ZhciBoYXMgYSBjb25zdGFudAorICAvLyBpbml0aWFsaXplciB3b3J0aCByZXBsYWNpbmcuIEVuZm9yY2UgdGhhdCBoZXJlLgorICBhc3NlcnQoZ2V0TnVtT3BlcmFuZHMoKSA9PSAxICYmCisgICAgICAgICAiQXR0ZW1wdCB0byByZXBsYWNlIHVzZXMgb2YgQ29uc3RhbnRzIG9uIGEgR1ZhciB3aXRoIG5vIGluaXRpYWxpemVyIik7CisKKyAgLy8gQW5kLCBzaW5jZSB5b3Uga25vdyBpdCBoYXMgYW4gaW5pdGlhbGl6ZXIsIHRoZSBGcm9tIHZhbHVlIGJldHRlciBiZQorICAvLyB0aGUgaW5pdGlhbGl6ZXIgOikKKyAgYXNzZXJ0KGdldE9wZXJhbmQoMCkgPT0gRnJvbSAmJgorICAgICAgICAgIkF0dGVtcHQgdG8gcmVwbGFjZSB3cm9uZyBjb25zdGFudCBpbml0aWFsaXplciBpbiBHVmFyIik7CisKKyAgLy8gQW5kLCB5b3UgYmV0dGVyIGhhdmUgYSBjb25zdGFudCBmb3IgdGhlIHJlcGxhY2VtZW50IHZhbHVlCisgIGFzc2VydChpc2E8Q29uc3RhbnQ+KFRvKSAmJgorICAgICAgICAgIkF0dGVtcHQgdG8gcmVwbGFjZSBHVmFyIGluaXRpYWxpemVyIHdpdGggbm9uLWNvbnN0YW50Iik7CisKKyAgLy8gT2theSwgcHJlY29uZGl0aW9ucyBvdXQgb2YgdGhlIHdheSwgcmVwbGFjZSB0aGUgY29uc3RhbnQgaW5pdGlhbGl6ZXIuCisgIHRoaXMtPnNldE9wZXJhbmQoMCwgY2FzdDxDb25zdGFudD4oVG8pKTsKK30KKwordm9pZCBHbG9iYWxWYXJpYWJsZTo6c2V0SW5pdGlhbGl6ZXIoQ29uc3RhbnQgKkluaXRWYWwpIHsKKyAgaWYgKEluaXRWYWwgPT0gMCkgeworICAgIGlmIChoYXNJbml0aWFsaXplcigpKSB7CisgICAgICBPcDwwPigpLnNldCgwKTsKKyAgICAgIE51bU9wZXJhbmRzID0gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KEluaXRWYWwtPmdldFR5cGUoKSA9PSBnZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgICAgIkluaXRpYWxpemVyIHR5cGUgbXVzdCBtYXRjaCBHbG9iYWxWYXJpYWJsZSB0eXBlIik7CisgICAgaWYgKCFoYXNJbml0aWFsaXplcigpKQorICAgICAgTnVtT3BlcmFuZHMgPSAxOworICAgIE9wPDA+KCkuc2V0KEluaXRWYWwpOworICB9Cit9CisKKy8vLyBjb3B5QXR0cmlidXRlc0Zyb20gLSBjb3B5IGFsbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKHRob3NlIG5vdCBuZWVkZWQgdG8KKy8vLyBjcmVhdGUgYSBHbG9iYWxWYXJpYWJsZSkgZnJvbSB0aGUgR2xvYmFsVmFyaWFibGUgU3JjIHRvIHRoaXMgb25lLgordm9pZCBHbG9iYWxWYXJpYWJsZTo6Y29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEdsb2JhbFZhbHVlICpTcmMpIHsKKyAgYXNzZXJ0KGlzYTxHbG9iYWxWYXJpYWJsZT4oU3JjKSAmJiAiRXhwZWN0ZWQgYSBHbG9iYWxWYXJpYWJsZSEiKTsKKyAgR2xvYmFsVmFsdWU6OmNvcHlBdHRyaWJ1dGVzRnJvbShTcmMpOworICBjb25zdCBHbG9iYWxWYXJpYWJsZSAqU3JjVmFyID0gY2FzdDxHbG9iYWxWYXJpYWJsZT4oU3JjKTsKKyAgc2V0VGhyZWFkTG9jYWwoU3JjVmFyLT5pc1RocmVhZExvY2FsKCkpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBHbG9iYWxBbGlhcyBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworR2xvYmFsQWxpYXM6Okdsb2JhbEFsaWFzKGNvbnN0IFR5cGUgKlR5LCBMaW5rYWdlVHlwZXMgTGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSwgQ29uc3RhbnQqIGFsaWFzZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICpQYXJlbnRNb2R1bGUpCisgIDogR2xvYmFsVmFsdWUoVHksIFZhbHVlOjpHbG9iYWxBbGlhc1ZhbCwgJk9wPDA+KCksIDEsIExpbmssIE5hbWUpIHsKKyAgTGVha0RldGVjdG9yOjphZGRHYXJiYWdlT2JqZWN0KHRoaXMpOworCisgIGlmIChhbGlhc2VlKQorICAgIGFzc2VydChhbGlhc2VlLT5nZXRUeXBlKCkgPT0gVHkgJiYgIkFsaWFzIGFuZCBhbGlhc2VlIHR5cGVzIHNob3VsZCBtYXRjaCEiKTsKKyAgT3A8MD4oKSA9IGFsaWFzZWU7CisKKyAgaWYgKFBhcmVudE1vZHVsZSkKKyAgICBQYXJlbnRNb2R1bGUtPmdldEFsaWFzTGlzdCgpLnB1c2hfYmFjayh0aGlzKTsKK30KKwordm9pZCBHbG9iYWxBbGlhczo6c2V0UGFyZW50KE1vZHVsZSAqcGFyZW50KSB7CisgIGlmIChnZXRQYXJlbnQoKSkKKyAgICBMZWFrRGV0ZWN0b3I6OmFkZEdhcmJhZ2VPYmplY3QodGhpcyk7CisgIFBhcmVudCA9IHBhcmVudDsKKyAgaWYgKGdldFBhcmVudCgpKQorICAgIExlYWtEZXRlY3Rvcjo6cmVtb3ZlR2FyYmFnZU9iamVjdCh0aGlzKTsKK30KKwordm9pZCBHbG9iYWxBbGlhczo6cmVtb3ZlRnJvbVBhcmVudCgpIHsKKyAgZ2V0UGFyZW50KCktPmdldEFsaWFzTGlzdCgpLnJlbW92ZSh0aGlzKTsKK30KKwordm9pZCBHbG9iYWxBbGlhczo6ZXJhc2VGcm9tUGFyZW50KCkgeworICBnZXRQYXJlbnQoKS0+Z2V0QWxpYXNMaXN0KCkuZXJhc2UodGhpcyk7Cit9CisKK2Jvb2wgR2xvYmFsQWxpYXM6OmlzRGVjbGFyYXRpb24oKSBjb25zdCB7CisgIGNvbnN0IEdsb2JhbFZhbHVlKiBBViA9IGdldEFsaWFzZWRHbG9iYWwoKTsKKyAgaWYgKEFWKQorICAgIHJldHVybiBBVi0+aXNEZWNsYXJhdGlvbigpOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEdsb2JhbEFsaWFzOjpzZXRBbGlhc2VlKENvbnN0YW50ICpBbGlhc2VlKSAKK3sKKyAgaWYgKEFsaWFzZWUpCisgICAgYXNzZXJ0KEFsaWFzZWUtPmdldFR5cGUoKSA9PSBnZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIkFsaWFzIGFuZCBhbGlhc2VlIHR5cGVzIHNob3VsZCBtYXRjaCEiKTsKKyAgCisgIHNldE9wZXJhbmQoMCwgQWxpYXNlZSk7Cit9CisKK2NvbnN0IEdsb2JhbFZhbHVlICpHbG9iYWxBbGlhczo6Z2V0QWxpYXNlZEdsb2JhbCgpIGNvbnN0IHsKKyAgY29uc3QgQ29uc3RhbnQgKkMgPSBnZXRBbGlhc2VlKCk7CisgIGlmIChDKSB7CisgICAgaWYgKGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhbHVlPihDKSkKKyAgICAgIHJldHVybiBHVjsKKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0IENvbnN0YW50RXhwciAqQ0UgPSAwOworICAgICAgaWYgKChDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oQykpICYmCisgICAgICAgICAgKENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCB8fCAKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyKSkKKyAgICAgICAgcmV0dXJuIGR5bl9jYXN0PEdsb2JhbFZhbHVlPihDRS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICBlbHNlCisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIGFsaWFzZWUiKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IEdsb2JhbFZhbHVlICpHbG9iYWxBbGlhczo6cmVzb2x2ZUFsaWFzZWRHbG9iYWwoYm9vbCBzdG9wT25XZWFrKSBjb25zdCB7CisgIFNtYWxsUHRyU2V0PGNvbnN0IEdsb2JhbFZhbHVlKiwgMz4gVmlzaXRlZDsKKworICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHN0b3AgZWFybHkuCisgIGlmIChzdG9wT25XZWFrICYmIG1heUJlT3ZlcnJpZGRlbigpKQorICAgIHJldHVybiB0aGlzOworCisgIGNvbnN0IEdsb2JhbFZhbHVlICpHViA9IGdldEFsaWFzZWRHbG9iYWwoKTsKKyAgVmlzaXRlZC5pbnNlcnQoR1YpOworCisgIC8vIEl0ZXJhdGUgb3ZlciBhbGlhc2luZyBjaGFpbiwgc3RvcHBpbmcgb24gd2VhayBhbGlhcyBpZiBuZWNlc3NhcnkuCisgIHdoaWxlIChjb25zdCBHbG9iYWxBbGlhcyAqR0EgPSBkeW5fY2FzdDxHbG9iYWxBbGlhcz4oR1YpKSB7CisgICAgaWYgKHN0b3BPbldlYWsgJiYgR0EtPm1heUJlT3ZlcnJpZGRlbigpKQorICAgICAgYnJlYWs7CisKKyAgICBHViA9IEdBLT5nZXRBbGlhc2VkR2xvYmFsKCk7CisKKyAgICBpZiAoIVZpc2l0ZWQuaW5zZXJ0KEdWKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIEdWOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9JUkJ1aWxkZXIuY3BwIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9JUkJ1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjc4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL0lSQnVpbGRlci5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy89PT0tLS0tIElSQnVpbGRlci5jcHAgLSBCdWlsZGVyIGZvciBMTFZNIEluc3RycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgSVJCdWlsZGVyIGNsYXNzLCB3aGljaCBpcyB1c2VkIGFzIGEgY29udmVuaWVudCB3YXkKKy8vIHRvIGNyZWF0ZSBMTFZNIGluc3RydWN0aW9ucyB3aXRoIGEgY29uc2lzdGVudCBhbmQgc2ltcGxpZmllZCBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8gQ3JlYXRlR2xvYmFsU3RyaW5nIC0gTWFrZSBhIG5ldyBnbG9iYWwgdmFyaWFibGUgd2l0aCBhbiBpbml0aWFsaXplciB0aGF0CisvLy8gaGFzIGFycmF5IG9mIGk4IHR5cGUgZmlsbGVkIGluIHdpdGggdGhlIG51bCB0ZXJtaW5hdGVkIHN0cmluZyB2YWx1ZQorLy8vIHNwZWNpZmllZC4gIElmIE5hbWUgaXMgc3BlY2lmaWVkLCBpdCBpcyB0aGUgbmFtZSBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlCisvLy8gY3JlYXRlZC4KK1ZhbHVlICpJUkJ1aWxkZXJCYXNlOjpDcmVhdGVHbG9iYWxTdHJpbmcoY29uc3QgY2hhciAqU3RyLCBjb25zdCBUd2luZSAmTmFtZSkgeworICBDb25zdGFudCAqU3RyQ29uc3RhbnQgPSBDb25zdGFudEFycmF5OjpnZXQoQ29udGV4dCwgU3RyLCB0cnVlKTsKKyAgTW9kdWxlICZNID0gKkJCLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7CisgIEdsb2JhbFZhcmlhYmxlICpHViA9IG5ldyBHbG9iYWxWYXJpYWJsZShNLCBTdHJDb25zdGFudC0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ckNvbnN0YW50LCAiIiwgMCwgZmFsc2UpOworICBHVi0+c2V0TmFtZShOYW1lKTsKKyAgcmV0dXJuIEdWOworfQorCitjb25zdCBUeXBlICpJUkJ1aWxkZXJCYXNlOjpnZXRDdXJyZW50RnVuY3Rpb25SZXR1cm5UeXBlKCkgY29uc3QgeworICBhc3NlcnQoQkIgJiYgQkItPmdldFBhcmVudCgpICYmICJObyBjdXJyZW50IGZ1bmN0aW9uISIpOworICByZXR1cm4gQkItPmdldFBhcmVudCgpLT5nZXRSZXR1cm5UeXBlKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0lubGluZUFzbS5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0lubGluZUFzbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmNzEzYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvSW5saW5lQXNtLmNwcApAQCAtMCwwICsxLDIzOCBAQAorLy89PT0tLSBJbmxpbmVBc20uY3BwIC0gSW1wbGVtZW50IHRoZSBJbmxpbmVBc20gY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgSW5saW5lQXNtIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0lubGluZUFzbS5oIgorI2luY2x1ZGUgIkNvbnN0YW50c0NvbnRleHQuaCIKKyNpbmNsdWRlICJMTFZNQ29udGV4dEltcGwuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjY3R5cGU+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gSW1wbGVtZW50IHRoZSBmaXJzdCB2aXJ0dWFsIG1ldGhvZCBpbiB0aGlzIGNsYXNzIGluIHRoaXMgZmlsZSBzbyB0aGUKKy8vIElubGluZUFzbSB2dGFibGUgaXMgZW1pdHRlZCBoZXJlLgorSW5saW5lQXNtOjp+SW5saW5lQXNtKCkgeworfQorCisKK0lubGluZUFzbSAqSW5saW5lQXNtOjpnZXQoY29uc3QgRnVuY3Rpb25UeXBlICpUeSwgU3RyaW5nUmVmIEFzbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvbnN0cmFpbnRzLCBib29sIGhhc1NpZGVFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQWxpZ25TdGFjaykgeworICBJbmxpbmVBc21LZXlUeXBlIEtleShBc21TdHJpbmcsIENvbnN0cmFpbnRzLCBoYXNTaWRlRWZmZWN0cywgaXNBbGlnblN0YWNrKTsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IFR5LT5nZXRDb250ZXh0KCkucEltcGw7CisgIHJldHVybiBwSW1wbC0+SW5saW5lQXNtcy5nZXRPckNyZWF0ZShQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5KSwgS2V5KTsKK30KKworSW5saW5lQXNtOjpJbmxpbmVBc20oY29uc3QgUG9pbnRlclR5cGUgKlR5LCBjb25zdCBzdGQ6OnN0cmluZyAmYXNtU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvbnN0cmFpbnRzLCBib29sIGhhc1NpZGVFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0FsaWduU3RhY2spCisgIDogVmFsdWUoVHksIFZhbHVlOjpJbmxpbmVBc21WYWwpLAorICAgIEFzbVN0cmluZyhhc21TdHJpbmcpLCAKKyAgICBDb25zdHJhaW50cyhjb25zdHJhaW50cyksIEhhc1NpZGVFZmZlY3RzKGhhc1NpZGVFZmZlY3RzKSwgCisgICAgSXNBbGlnblN0YWNrKGlzQWxpZ25TdGFjaykgeworCisgIC8vIERvIHZhcmlvdXMgY2hlY2tzIG9uIHRoZSBjb25zdHJhaW50IHN0cmluZyBhbmQgdHlwZS4KKyAgYXNzZXJ0KFZlcmlmeShnZXRGdW5jdGlvblR5cGUoKSwgY29uc3RyYWludHMpICYmCisgICAgICAgICAiRnVuY3Rpb24gdHlwZSBub3QgbGVnYWwgZm9yIGNvbnN0cmFpbnRzISIpOworfQorCit2b2lkIElubGluZUFzbTo6ZGVzdHJveUNvbnN0YW50KCkgeworICBkZWxldGUgdGhpczsKK30KKworY29uc3QgRnVuY3Rpb25UeXBlICpJbmxpbmVBc206OmdldEZ1bmN0aW9uVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGNhc3Q8RnVuY3Rpb25UeXBlPihnZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkpOworfQorCisvLy8gUGFyc2UgLSBBbmFseXplIHRoZSBzcGVjaWZpZWQgc3RyaW5nIChlLmcuICI9PSZ7ZWF4fSIpIGFuZCBmaWxsIGluIHRoZQorLy8vIGZpZWxkcyBpbiB0aGlzIHN0cnVjdHVyZS4gIElmIHRoZSBjb25zdHJhaW50IHN0cmluZyBpcyBub3QgdW5kZXJzdG9vZCwKKy8vLyByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KK2Jvb2wgSW5saW5lQXNtOjpDb25zdHJhaW50SW5mbzo6UGFyc2UoU3RyaW5nUmVmIFN0ciwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElubGluZUFzbTo6Q29uc3RyYWludEluZm8+ICZDb25zdHJhaW50c1NvRmFyKSB7CisgIFN0cmluZ1JlZjo6aXRlcmF0b3IgSSA9IFN0ci5iZWdpbigpLCBFID0gU3RyLmVuZCgpOworICAKKyAgLy8gSW5pdGlhbGl6ZQorICBUeXBlID0gaXNJbnB1dDsKKyAgaXNFYXJseUNsb2JiZXIgPSBmYWxzZTsKKyAgTWF0Y2hpbmdJbnB1dCA9IC0xOworICBpc0NvbW11dGF0aXZlID0gZmFsc2U7CisgIGlzSW5kaXJlY3QgPSBmYWxzZTsKKyAgCisgIC8vIFBhcnNlIHByZWZpeGVzLgorICBpZiAoKkkgPT0gJ34nKSB7CisgICAgVHlwZSA9IGlzQ2xvYmJlcjsKKyAgICArK0k7CisgIH0gZWxzZSBpZiAoKkkgPT0gJz0nKSB7CisgICAgKytJOworICAgIFR5cGUgPSBpc091dHB1dDsKKyAgfQorICAKKyAgaWYgKCpJID09ICcqJykgeworICAgIGlzSW5kaXJlY3QgPSB0cnVlOworICAgICsrSTsKKyAgfQorICAKKyAgaWYgKEkgPT0gRSkgcmV0dXJuIHRydWU7ICAvLyBKdXN0IGEgcHJlZml4LCBsaWtlICI9PSIgb3IgIn4iLgorICAKKyAgLy8gUGFyc2UgdGhlIG1vZGlmaWVycy4KKyAgYm9vbCBEb25lV2l0aE1vZGlmaWVycyA9IGZhbHNlOworICB3aGlsZSAoIURvbmVXaXRoTW9kaWZpZXJzKSB7CisgICAgc3dpdGNoICgqSSkgeworICAgIGRlZmF1bHQ6CisgICAgICBEb25lV2l0aE1vZGlmaWVycyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzogICAgIC8vIEVhcmx5IGNsb2JiZXIuCisgICAgICBpZiAoVHlwZSAhPSBpc091dHB1dCB8fCAgICAgIC8vIENhbm5vdCBlYXJseSBjbG9iYmVyIGFueXRoaW5nIGJ1dCBvdXRwdXQuCisgICAgICAgICAgaXNFYXJseUNsb2JiZXIpICAgICAgICAgIC8vIFJlamVjdCAmJiYmJiYKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBpc0Vhcmx5Q2xvYmJlciA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICclJzogICAgIC8vIENvbW11dGF0aXZlLgorICAgICAgaWYgKFR5cGUgPT0gaXNDbG9iYmVyIHx8ICAgICAvLyBDYW5ub3QgY29tbXV0ZSBjbG9iYmVycy4KKyAgICAgICAgICBpc0NvbW11dGF0aXZlKSAgICAgICAgICAgLy8gUmVqZWN0ICUlJSUlCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaXNDb21tdXRhdGl2ZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICcjJzogICAgIC8vIENvbW1lbnQuCisgICAgY2FzZSAnKic6ICAgICAvLyBSZWdpc3RlciBwcmVmZXJlbmNpbmcuCisgICAgICByZXR1cm4gdHJ1ZTsgICAgIC8vIE5vdCBzdXBwb3J0ZWQuCisgICAgfQorICAgIAorICAgIGlmICghRG9uZVdpdGhNb2RpZmllcnMpIHsKKyAgICAgICsrSTsKKyAgICAgIGlmIChJID09IEUpIHJldHVybiB0cnVlOyAgIC8vIEp1c3QgcHJlZml4ZXMgYW5kIG1vZGlmaWVycyEKKyAgICB9CisgIH0KKyAgCisgIC8vIFBhcnNlIHRoZSB2YXJpb3VzIGNvbnN0cmFpbnRzLgorICB3aGlsZSAoSSAhPSBFKSB7CisgICAgaWYgKCpJID09ICd7JykgeyAgIC8vIFBoeXNpY2FsIHJlZ2lzdGVyIHJlZmVyZW5jZS4KKyAgICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGUgcmVnaXN0ZXIgbmFtZS4KKyAgICAgIFN0cmluZ1JlZjo6aXRlcmF0b3IgQ29uc3RyYWludEVuZCA9IHN0ZDo6ZmluZChJKzEsIEUsICd9Jyk7CisgICAgICBpZiAoQ29uc3RyYWludEVuZCA9PSBFKSByZXR1cm4gdHJ1ZTsgIC8vICJ7Zm9vIgorICAgICAgQ29kZXMucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKEksIENvbnN0cmFpbnRFbmQrMSkpOworICAgICAgSSA9IENvbnN0cmFpbnRFbmQrMTsKKyAgICB9IGVsc2UgaWYgKGlzZGlnaXQoKkkpKSB7ICAgICAvLyBNYXRjaGluZyBDb25zdHJhaW50CisgICAgICAvLyBNYXhpbWFsIG11bmNoIG51bWJlcnMuCisgICAgICBTdHJpbmdSZWY6Oml0ZXJhdG9yIE51bVN0YXJ0ID0gSTsKKyAgICAgIHdoaWxlIChJICE9IEUgJiYgaXNkaWdpdCgqSSkpCisgICAgICAgICsrSTsKKyAgICAgIENvZGVzLnB1c2hfYmFjayhzdGQ6OnN0cmluZyhOdW1TdGFydCwgSSkpOworICAgICAgdW5zaWduZWQgTiA9IGF0b2koQ29kZXMuYmFjaygpLmNfc3RyKCkpOworICAgICAgLy8gQ2hlY2sgdGhhdCB0aGlzIGlzIGEgdmFsaWQgbWF0Y2hpbmcgY29uc3RyYWludCEKKyAgICAgIGlmIChOID49IENvbnN0cmFpbnRzU29GYXIuc2l6ZSgpIHx8IENvbnN0cmFpbnRzU29GYXJbTl0uVHlwZSAhPSBpc091dHB1dHx8CisgICAgICAgICAgVHlwZSAhPSBpc0lucHV0KQorICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEludmFsaWQgY29uc3RyYWludCBudW1iZXIuCisgICAgICAKKyAgICAgIC8vIElmIE9wZXJhbmQgTiBhbHJlYWR5IGhhcyBhIG1hdGNoaW5nIGlucHV0LCByZWplY3QgdGhpcy4gIEFuIG91dHB1dAorICAgICAgLy8gY2FuJ3QgYmUgY29uc3RyYWluZWQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgbXVsdGlwbGUgaW5wdXRzLgorICAgICAgaWYgKENvbnN0cmFpbnRzU29GYXJbTl0uaGFzTWF0Y2hpbmdJbnB1dCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIAorICAgICAgLy8gTm90ZSB0aGF0IG9wZXJhbmQgI24gaGFzIGEgbWF0Y2hpbmcgaW5wdXQuCisgICAgICBDb25zdHJhaW50c1NvRmFyW05dLk1hdGNoaW5nSW5wdXQgPSBDb25zdHJhaW50c1NvRmFyLnNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU2luZ2xlIGxldHRlciBjb25zdHJhaW50LgorICAgICAgQ29kZXMucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKEksIEkrMSkpOworICAgICAgKytJOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjp2ZWN0b3I8SW5saW5lQXNtOjpDb25zdHJhaW50SW5mbz4KK0lubGluZUFzbTo6UGFyc2VDb25zdHJhaW50cyhTdHJpbmdSZWYgQ29uc3RyYWludHMpIHsKKyAgc3RkOjp2ZWN0b3I8Q29uc3RyYWludEluZm8+IFJlc3VsdDsKKyAgCisgIC8vIFNjYW4gdGhlIGNvbnN0cmFpbnRzIHN0cmluZy4KKyAgZm9yIChTdHJpbmdSZWY6Oml0ZXJhdG9yIEkgPSBDb25zdHJhaW50cy5iZWdpbigpLAorICAgICAgICAgRSA9IENvbnN0cmFpbnRzLmVuZCgpOyBJICE9IEU7ICkgeworICAgIENvbnN0cmFpbnRJbmZvIEluZm87CisKKyAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhpcyBjb25zdHJhaW50LgorICAgIFN0cmluZ1JlZjo6aXRlcmF0b3IgQ29uc3RyYWludEVuZCA9IHN0ZDo6ZmluZChJLCBFLCAnLCcpOworCisgICAgaWYgKENvbnN0cmFpbnRFbmQgPT0gSSB8fCAgLy8gRW1wdHkgY29uc3RyYWludCBsaWtlICIsLCIKKyAgICAgICAgSW5mby5QYXJzZShTdHJpbmdSZWYoSSwgQ29uc3RyYWludEVuZC1JKSwgUmVzdWx0KSkgeworICAgICAgUmVzdWx0LmNsZWFyKCk7ICAgICAgICAgIC8vIEVycm9uZW91cyBjb25zdHJhaW50PworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgUmVzdWx0LnB1c2hfYmFjayhJbmZvKTsKKyAgICAKKyAgICAvLyBDb25zdHJhaW50RW5kIG1heSBiZSBlaXRoZXIgdGhlIG5leHQgY29tbWEgb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgSW4KKyAgICAvLyB0aGUgZm9ybWVyIGNhc2UsIHdlIHNraXAgdGhlIGNvbW1hLgorICAgIEkgPSBDb25zdHJhaW50RW5kOworICAgIGlmIChJICE9IEUpIHsKKyAgICAgICsrSTsKKyAgICAgIGlmIChJID09IEUpIHsgUmVzdWx0LmNsZWFyKCk7IGJyZWFrOyB9ICAgIC8vIGRvbid0IGFsbG93ICJ4eXosIgorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworCisvLy8gVmVyaWZ5IC0gVmVyaWZ5IHRoYXQgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50IHN0cmluZyBpcyByZWFzb25hYmxlIGZvciB0aGUKKy8vLyBzcGVjaWZpZWQgZnVuY3Rpb24gdHlwZSwgYW5kIG90aGVyd2lzZSB2YWxpZGF0ZSB0aGUgY29uc3RyYWludCBzdHJpbmcuCitib29sIElubGluZUFzbTo6VmVyaWZ5KGNvbnN0IEZ1bmN0aW9uVHlwZSAqVHksIFN0cmluZ1JlZiBDb25zdFN0cikgeworICBpZiAoVHktPmlzVmFyQXJnKCkpIHJldHVybiBmYWxzZTsKKyAgCisgIHN0ZDo6dmVjdG9yPENvbnN0cmFpbnRJbmZvPiBDb25zdHJhaW50cyA9IFBhcnNlQ29uc3RyYWludHMoQ29uc3RTdHIpOworICAKKyAgLy8gRXJyb3IgcGFyc2luZyBjb25zdHJhaW50cy4KKyAgaWYgKENvbnN0cmFpbnRzLmVtcHR5KCkgJiYgIUNvbnN0U3RyLmVtcHR5KCkpIHJldHVybiBmYWxzZTsKKyAgCisgIHVuc2lnbmVkIE51bU91dHB1dHMgPSAwLCBOdW1JbnB1dHMgPSAwLCBOdW1DbG9iYmVycyA9IDA7CisgIHVuc2lnbmVkIE51bUluZGlyZWN0ID0gMDsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDb25zdHJhaW50cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgc3dpdGNoIChDb25zdHJhaW50c1tpXS5UeXBlKSB7CisgICAgY2FzZSBJbmxpbmVBc206OmlzT3V0cHV0OgorICAgICAgaWYgKChOdW1JbnB1dHMtTnVtSW5kaXJlY3QpICE9IDAgfHwgTnVtQ2xvYmJlcnMgIT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gb3V0cHV0cyBiZWZvcmUgaW5wdXRzIGFuZCBjbG9iYmVycy4KKyAgICAgIGlmICghQ29uc3RyYWludHNbaV0uaXNJbmRpcmVjdCkgeworICAgICAgICArK051bU91dHB1dHM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytOdW1JbmRpcmVjdDsKKyAgICAgIC8vIEZBTExUSFJPVUdIIGZvciBJbmRpcmVjdCBPdXRwdXRzLgorICAgIGNhc2UgSW5saW5lQXNtOjppc0lucHV0OgorICAgICAgaWYgKE51bUNsb2JiZXJzKSByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgLy8gaW5wdXRzIGJlZm9yZSBjbG9iYmVycy4KKyAgICAgICsrTnVtSW5wdXRzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbmxpbmVBc206OmlzQ2xvYmJlcjoKKyAgICAgICsrTnVtQ2xvYmJlcnM7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgCisgIHN3aXRjaCAoTnVtT3V0cHV0cykgeworICBjYXNlIDA6CisgICAgaWYgKCFUeS0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeSgpKSByZXR1cm4gZmFsc2U7CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICBpZiAoVHktPmdldFJldHVyblR5cGUoKS0+aXNTdHJ1Y3RUeSgpKSByZXR1cm4gZmFsc2U7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgY29uc3QgU3RydWN0VHlwZSAqU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oVHktPmdldFJldHVyblR5cGUoKSk7CisgICAgaWYgKFNUeSA9PSAwIHx8IFNUeS0+Z2V0TnVtRWxlbWVudHMoKSAhPSBOdW1PdXRwdXRzKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGJyZWFrOworICB9ICAgICAgCisgIAorICBpZiAoVHktPmdldE51bVBhcmFtcygpICE9IE51bUlucHV0cykgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9JbnN0cnVjdGlvbi5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0luc3RydWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI2MGU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9JbnN0cnVjdGlvbi5jcHAKQEAgLTAsMCArMSw0MjYgQEAKKy8vPT09LS0gSW5zdHJ1Y3Rpb24uY3BwIC0gSW1wbGVtZW50IHRoZSBJbnN0cnVjdGlvbiBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEluc3RydWN0aW9uIGNsYXNzIGZvciB0aGUgVk1Db3JlIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTGVha0RldGVjdG9yLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworSW5zdHJ1Y3Rpb246Okluc3RydWN0aW9uKGNvbnN0IFR5cGUgKnR5LCB1bnNpZ25lZCBpdCwgVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICA6IFVzZXIodHksIFZhbHVlOjpJbnN0cnVjdGlvblZhbCArIGl0LCBPcHMsIE51bU9wcyksIFBhcmVudCgwKSB7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGdldCBhZGRlZCB0byBhIGJhc2ljYmxvY2sKKyAgTGVha0RldGVjdG9yOjphZGRHYXJiYWdlT2JqZWN0KHRoaXMpOworCisgIC8vIElmIHJlcXVlc3RlZCwgaW5zZXJ0IHRoaXMgaW5zdHJ1Y3Rpb24gaW50byBhIGJhc2ljIGJsb2NrLi4uCisgIGlmIChJbnNlcnRCZWZvcmUpIHsKKyAgICBhc3NlcnQoSW5zZXJ0QmVmb3JlLT5nZXRQYXJlbnQoKSAmJgorICAgICAgICAgICAiSW5zdHJ1Y3Rpb24gdG8gaW5zZXJ0IGJlZm9yZSBpcyBub3QgaW4gYSBiYXNpYyBibG9jayEiKTsKKyAgICBJbnNlcnRCZWZvcmUtPmdldFBhcmVudCgpLT5nZXRJbnN0TGlzdCgpLmluc2VydChJbnNlcnRCZWZvcmUsIHRoaXMpOworICB9Cit9CisKK0luc3RydWN0aW9uOjpJbnN0cnVjdGlvbihjb25zdCBUeXBlICp0eSwgdW5zaWduZWQgaXQsIFVzZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgIDogVXNlcih0eSwgVmFsdWU6Okluc3RydWN0aW9uVmFsICsgaXQsIE9wcywgTnVtT3BzKSwgUGFyZW50KDApIHsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgZ2V0IGFkZGVkIHRvIGEgYmFzaWNibG9jaworICBMZWFrRGV0ZWN0b3I6OmFkZEdhcmJhZ2VPYmplY3QodGhpcyk7CisKKyAgLy8gYXBwZW5kIHRoaXMgaW5zdHJ1Y3Rpb24gaW50byB0aGUgYmFzaWMgYmxvY2sKKyAgYXNzZXJ0KEluc2VydEF0RW5kICYmICJCYXNpYyBibG9jayB0byBhcHBlbmQgdG8gbWF5IG5vdCBiZSBOVUxMISIpOworICBJbnNlcnRBdEVuZC0+Z2V0SW5zdExpc3QoKS5wdXNoX2JhY2sodGhpcyk7Cit9CisKKworLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QsIHNvIHRoZSB2dGFibGUsIGV0YyBoYXMgYSBob21lLgorSW5zdHJ1Y3Rpb246On5JbnN0cnVjdGlvbigpIHsKKyAgYXNzZXJ0KFBhcmVudCA9PSAwICYmICJJbnN0cnVjdGlvbiBzdGlsbCBsaW5rZWQgaW4gdGhlIHByb2dyYW0hIik7CisgIGlmIChoYXNNZXRhZGF0YUhhc2hFbnRyeSgpKQorICAgIGNsZWFyTWV0YWRhdGFIYXNoRW50cmllcygpOworfQorCisKK3ZvaWQgSW5zdHJ1Y3Rpb246OnNldFBhcmVudChCYXNpY0Jsb2NrICpQKSB7CisgIGlmIChnZXRQYXJlbnQoKSkgeworICAgIGlmICghUCkgTGVha0RldGVjdG9yOjphZGRHYXJiYWdlT2JqZWN0KHRoaXMpOworICB9IGVsc2UgeworICAgIGlmIChQKSBMZWFrRGV0ZWN0b3I6OnJlbW92ZUdhcmJhZ2VPYmplY3QodGhpcyk7CisgIH0KKworICBQYXJlbnQgPSBQOworfQorCit2b2lkIEluc3RydWN0aW9uOjpyZW1vdmVGcm9tUGFyZW50KCkgeworICBnZXRQYXJlbnQoKS0+Z2V0SW5zdExpc3QoKS5yZW1vdmUodGhpcyk7Cit9CisKK3ZvaWQgSW5zdHJ1Y3Rpb246OmVyYXNlRnJvbVBhcmVudCgpIHsKKyAgZ2V0UGFyZW50KCktPmdldEluc3RMaXN0KCkuZXJhc2UodGhpcyk7Cit9CisKKy8vLyBpbnNlcnRCZWZvcmUgLSBJbnNlcnQgYW4gdW5saW5rZWQgaW5zdHJ1Y3Rpb25zIGludG8gYSBiYXNpYyBibG9jaworLy8vIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgordm9pZCBJbnN0cnVjdGlvbjo6aW5zZXJ0QmVmb3JlKEluc3RydWN0aW9uICpJbnNlcnRQb3MpIHsKKyAgSW5zZXJ0UG9zLT5nZXRQYXJlbnQoKS0+Z2V0SW5zdExpc3QoKS5pbnNlcnQoSW5zZXJ0UG9zLCB0aGlzKTsKK30KKworLy8vIGluc2VydEFmdGVyIC0gSW5zZXJ0IGFuIHVubGlua2VkIGluc3RydWN0aW9ucyBpbnRvIGEgYmFzaWMgYmxvY2sKKy8vLyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgordm9pZCBJbnN0cnVjdGlvbjo6aW5zZXJ0QWZ0ZXIoSW5zdHJ1Y3Rpb24gKkluc2VydFBvcykgeworICBJbnNlcnRQb3MtPmdldFBhcmVudCgpLT5nZXRJbnN0TGlzdCgpLmluc2VydEFmdGVyKEluc2VydFBvcywgdGhpcyk7Cit9CisKKy8vLyBtb3ZlQmVmb3JlIC0gVW5saW5rIHRoaXMgaW5zdHJ1Y3Rpb24gZnJvbSBpdHMgY3VycmVudCBiYXNpYyBibG9jayBhbmQKKy8vLyBpbnNlcnQgaXQgaW50byB0aGUgYmFzaWMgYmxvY2sgdGhhdCBNb3ZlUG9zIGxpdmVzIGluLCByaWdodCBiZWZvcmUKKy8vLyBNb3ZlUG9zLgordm9pZCBJbnN0cnVjdGlvbjo6bW92ZUJlZm9yZShJbnN0cnVjdGlvbiAqTW92ZVBvcykgeworICBNb3ZlUG9zLT5nZXRQYXJlbnQoKS0+Z2V0SW5zdExpc3QoKS5zcGxpY2UoTW92ZVBvcyxnZXRQYXJlbnQoKS0+Z2V0SW5zdExpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworfQorCisKK2NvbnN0IGNoYXIgKkluc3RydWN0aW9uOjpnZXRPcGNvZGVOYW1lKHVuc2lnbmVkIE9wQ29kZSkgeworICBzd2l0Y2ggKE9wQ29kZSkgeworICAvLyBUZXJtaW5hdG9ycworICBjYXNlIFJldDogICAgcmV0dXJuICJyZXQiOworICBjYXNlIEJyOiAgICAgcmV0dXJuICJiciI7CisgIGNhc2UgU3dpdGNoOiByZXR1cm4gInN3aXRjaCI7CisgIGNhc2UgSW5kaXJlY3RCcjogcmV0dXJuICJpbmRpcmVjdGJyIjsKKyAgY2FzZSBVbnJlYWNoYWJsZTogcmV0dXJuICJ1bnJlYWNoYWJsZSI7CisKKyAgLy8gU3RhbmRhcmQgYmluYXJ5IG9wZXJhdG9ycy4uLgorICBjYXNlIEFkZDogcmV0dXJuICJhZGQiOworICBjYXNlIEZBZGQ6IHJldHVybiAiZmFkZCI7CisgIGNhc2UgU3ViOiByZXR1cm4gInN1YiI7CisgIGNhc2UgRlN1YjogcmV0dXJuICJmc3ViIjsKKyAgY2FzZSBNdWw6IHJldHVybiAibXVsIjsKKyAgY2FzZSBGTXVsOiByZXR1cm4gImZtdWwiOworICBjYXNlIFVEaXY6IHJldHVybiAidWRpdiI7CisgIGNhc2UgU0RpdjogcmV0dXJuICJzZGl2IjsKKyAgY2FzZSBGRGl2OiByZXR1cm4gImZkaXYiOworICBjYXNlIFVSZW06IHJldHVybiAidXJlbSI7CisgIGNhc2UgU1JlbTogcmV0dXJuICJzcmVtIjsKKyAgY2FzZSBGUmVtOiByZXR1cm4gImZyZW0iOworCisgIC8vIExvZ2ljYWwgb3BlcmF0b3JzLi4uCisgIGNhc2UgQW5kOiByZXR1cm4gImFuZCI7CisgIGNhc2UgT3IgOiByZXR1cm4gIm9yIjsKKyAgY2FzZSBYb3I6IHJldHVybiAieG9yIjsKKworICAvLyBNZW1vcnkgaW5zdHJ1Y3Rpb25zLi4uCisgIGNhc2UgQWxsb2NhOiAgICAgICAgcmV0dXJuICJhbGxvY2EiOworICBjYXNlIExvYWQ6ICAgICAgICAgIHJldHVybiAibG9hZCI7CisgIGNhc2UgU3RvcmU6ICAgICAgICAgcmV0dXJuICJzdG9yZSI7CisgIGNhc2UgR2V0RWxlbWVudFB0cjogcmV0dXJuICJnZXRlbGVtZW50cHRyIjsKKworICAvLyBDb252ZXJ0IGluc3RydWN0aW9ucy4uLgorICBjYXNlIFRydW5jOiAgICAgcmV0dXJuICJ0cnVuYyI7CisgIGNhc2UgWkV4dDogICAgICByZXR1cm4gInpleHQiOworICBjYXNlIFNFeHQ6ICAgICAgcmV0dXJuICJzZXh0IjsKKyAgY2FzZSBGUFRydW5jOiAgIHJldHVybiAiZnB0cnVuYyI7CisgIGNhc2UgRlBFeHQ6ICAgICByZXR1cm4gImZwZXh0IjsKKyAgY2FzZSBGUFRvVUk6ICAgIHJldHVybiAiZnB0b3VpIjsKKyAgY2FzZSBGUFRvU0k6ICAgIHJldHVybiAiZnB0b3NpIjsKKyAgY2FzZSBVSVRvRlA6ICAgIHJldHVybiAidWl0b2ZwIjsKKyAgY2FzZSBTSVRvRlA6ICAgIHJldHVybiAic2l0b2ZwIjsKKyAgY2FzZSBJbnRUb1B0cjogIHJldHVybiAiaW50dG9wdHIiOworICBjYXNlIFB0clRvSW50OiAgcmV0dXJuICJwdHJ0b2ludCI7CisgIGNhc2UgQml0Q2FzdDogICByZXR1cm4gImJpdGNhc3QiOworCisgIC8vIE90aGVyIGluc3RydWN0aW9ucy4uLgorICBjYXNlIElDbXA6ICAgICAgICAgICByZXR1cm4gImljbXAiOworICBjYXNlIEZDbXA6ICAgICAgICAgICByZXR1cm4gImZjbXAiOworICBjYXNlIFBISTogICAgICAgICAgICByZXR1cm4gInBoaSI7CisgIGNhc2UgU2VsZWN0OiAgICAgICAgIHJldHVybiAic2VsZWN0IjsKKyAgY2FzZSBDYWxsOiAgICAgICAgICAgcmV0dXJuICJjYWxsIjsKKyAgY2FzZSBTaGw6ICAgICAgICAgICAgcmV0dXJuICJzaGwiOworICBjYXNlIExTaHI6ICAgICAgICAgICByZXR1cm4gImxzaHIiOworICBjYXNlIEFTaHI6ICAgICAgICAgICByZXR1cm4gImFzaHIiOworICBjYXNlIEV4dHJhY3RFbGVtZW50OiByZXR1cm4gImV4dHJhY3RlbGVtZW50IjsKKyAgY2FzZSBJbnNlcnRFbGVtZW50OiAgcmV0dXJuICJpbnNlcnRlbGVtZW50IjsKKyAgY2FzZSBTaHVmZmxlVmVjdG9yOiAgcmV0dXJuICJzaHVmZmxldmVjdG9yIjsKKyAgY2FzZSBFeHRyYWN0VmFsdWU6ICAgcmV0dXJuICJleHRyYWN0dmFsdWUiOworICBjYXNlIEluc2VydFZhbHVlOiAgICByZXR1cm4gImluc2VydHZhbHVlIjsKKworICBkZWZhdWx0OiByZXR1cm4gIjxJbnZhbGlkIG9wZXJhdG9yPiAiOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBpc0lkZW50aWNhbFRvIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBpcyBleGFjdGx5CisvLy8gaWRlbnRpY2FsIHRvIHRoZSBjdXJyZW50IG9uZS4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgb3BlcmFuZHMgbWF0Y2ggYW5kIGFueQorLy8vIGV4dHJhIGluZm9ybWF0aW9uIChlLmcuIGxvYWQgaXMgdm9sYXRpbGUpIGFncmVlLgorYm9vbCBJbnN0cnVjdGlvbjo6aXNJZGVudGljYWxUbyhjb25zdCBJbnN0cnVjdGlvbiAqSSkgY29uc3QgeworICByZXR1cm4gaXNJZGVudGljYWxUb1doZW5EZWZpbmVkKEkpICYmCisgICAgICAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9PSBJLT5TdWJjbGFzc09wdGlvbmFsRGF0YTsKK30KKworLy8vIGlzSWRlbnRpY2FsVG9XaGVuRGVmaW5lZCAtIFRoaXMgaXMgbGlrZSBpc0lkZW50aWNhbFRvLCBleGNlcHQgdGhhdCBpdAorLy8vIGlnbm9yZXMgdGhlIFN1YmNsYXNzT3B0aW9uYWxEYXRhIGZsYWdzLCB3aGljaCBzcGVjaWZ5IGNvbmRpdGlvbnMKKy8vLyB1bmRlciB3aGljaCB0aGUgaW5zdHJ1Y3Rpb24ncyByZXN1bHQgaXMgdW5kZWZpbmVkLgorYm9vbCBJbnN0cnVjdGlvbjo6aXNJZGVudGljYWxUb1doZW5EZWZpbmVkKGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdCB7CisgIGlmIChnZXRPcGNvZGUoKSAhPSBJLT5nZXRPcGNvZGUoKSB8fAorICAgICAgZ2V0TnVtT3BlcmFuZHMoKSAhPSBJLT5nZXROdW1PcGVyYW5kcygpIHx8CisgICAgICBnZXRUeXBlKCkgIT0gSS0+Z2V0VHlwZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBXZSBoYXZlIHR3byBpbnN0cnVjdGlvbnMgb2YgaWRlbnRpY2FsIG9wY29kZSBhbmQgI29wZXJhbmRzLiAgQ2hlY2sgdG8gc2VlCisgIC8vIGlmIGFsbCBvcGVyYW5kcyBhcmUgdGhlIHNhbWUuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoZ2V0T3BlcmFuZChpKSAhPSBJLT5nZXRPcGVyYW5kKGkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIENoZWNrIHNwZWNpYWwgc3RhdGUgdGhhdCBpcyBhIHBhcnQgb2Ygc29tZSBpbnN0cnVjdGlvbnMuCisgIGlmIChjb25zdCBMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4odGhpcykpCisgICAgcmV0dXJuIExJLT5pc1ZvbGF0aWxlKCkgPT0gY2FzdDxMb2FkSW5zdD4oSSktPmlzVm9sYXRpbGUoKSAmJgorICAgICAgICAgICBMSS0+Z2V0QWxpZ25tZW50KCkgPT0gY2FzdDxMb2FkSW5zdD4oSSktPmdldEFsaWdubWVudCgpOworICBpZiAoY29uc3QgU3RvcmVJbnN0ICpTSSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4odGhpcykpCisgICAgcmV0dXJuIFNJLT5pc1ZvbGF0aWxlKCkgPT0gY2FzdDxTdG9yZUluc3Q+KEkpLT5pc1ZvbGF0aWxlKCkgJiYKKyAgICAgICAgICAgU0ktPmdldEFsaWdubWVudCgpID09IGNhc3Q8U3RvcmVJbnN0PihJKS0+Z2V0QWxpZ25tZW50KCk7CisgIGlmIChjb25zdCBDbXBJbnN0ICpDSSA9IGR5bl9jYXN0PENtcEluc3Q+KHRoaXMpKQorICAgIHJldHVybiBDSS0+Z2V0UHJlZGljYXRlKCkgPT0gY2FzdDxDbXBJbnN0PihJKS0+Z2V0UHJlZGljYXRlKCk7CisgIGlmIChjb25zdCBDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4odGhpcykpCisgICAgcmV0dXJuIENJLT5pc1RhaWxDYWxsKCkgPT0gY2FzdDxDYWxsSW5zdD4oSSktPmlzVGFpbENhbGwoKSAmJgorICAgICAgICAgICBDSS0+Z2V0Q2FsbGluZ0NvbnYoKSA9PSBjYXN0PENhbGxJbnN0PihJKS0+Z2V0Q2FsbGluZ0NvbnYoKSAmJgorICAgICAgICAgICBDSS0+Z2V0QXR0cmlidXRlcygpLmdldFJhd1BvaW50ZXIoKSA9PQorICAgICAgICAgICAgIGNhc3Q8Q2FsbEluc3Q+KEkpLT5nZXRBdHRyaWJ1dGVzKCkuZ2V0UmF3UG9pbnRlcigpOworICBpZiAoY29uc3QgSW5zZXJ0VmFsdWVJbnN0ICpJVkkgPSBkeW5fY2FzdDxJbnNlcnRWYWx1ZUluc3Q+KHRoaXMpKSB7CisgICAgaWYgKElWSS0+Z2V0TnVtSW5kaWNlcygpICE9IGNhc3Q8SW5zZXJ0VmFsdWVJbnN0PihJKS0+Z2V0TnVtSW5kaWNlcygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJVkktPmdldE51bUluZGljZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoSVZJLT5pZHhfYmVnaW4oKVtpXSAhPSBjYXN0PEluc2VydFZhbHVlSW5zdD4oSSktPmlkeF9iZWdpbigpW2ldKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKGNvbnN0IEV4dHJhY3RWYWx1ZUluc3QgKkVWSSA9IGR5bl9jYXN0PEV4dHJhY3RWYWx1ZUluc3Q+KHRoaXMpKSB7CisgICAgaWYgKEVWSS0+Z2V0TnVtSW5kaWNlcygpICE9IGNhc3Q8RXh0cmFjdFZhbHVlSW5zdD4oSSktPmdldE51bUluZGljZXMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRVZJLT5nZXROdW1JbmRpY2VzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKEVWSS0+aWR4X2JlZ2luKClbaV0gIT0gY2FzdDxFeHRyYWN0VmFsdWVJbnN0PihJKS0+aWR4X2JlZ2luKClbaV0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBpc1NhbWVPcGVyYXRpb25BcworLy8gVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggaXNFcXVpdmFsZW50T3BlcmF0aW9uIGluCisvLyBsaWIvVHJhbnNmb3Jtcy9JUE8vTWVyZ2VGdW5jdGlvbnMuY3BwLgorYm9vbCBJbnN0cnVjdGlvbjo6aXNTYW1lT3BlcmF0aW9uQXMoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHsKKyAgaWYgKGdldE9wY29kZSgpICE9IEktPmdldE9wY29kZSgpIHx8CisgICAgICBnZXROdW1PcGVyYW5kcygpICE9IEktPmdldE51bU9wZXJhbmRzKCkgfHwKKyAgICAgIGdldFR5cGUoKSAhPSBJLT5nZXRUeXBlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFdlIGhhdmUgdHdvIGluc3RydWN0aW9ucyBvZiBpZGVudGljYWwgb3Bjb2RlIGFuZCAjb3BlcmFuZHMuICBDaGVjayB0byBzZWUKKyAgLy8gaWYgYWxsIG9wZXJhbmRzIGFyZSB0aGUgc2FtZSB0eXBlCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoZ2V0T3BlcmFuZChpKS0+Z2V0VHlwZSgpICE9IEktPmdldE9wZXJhbmQoaSktPmdldFR5cGUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAvLyBDaGVjayBzcGVjaWFsIHN0YXRlIHRoYXQgaXMgYSBwYXJ0IG9mIHNvbWUgaW5zdHJ1Y3Rpb25zLgorICBpZiAoY29uc3QgTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KHRoaXMpKQorICAgIHJldHVybiBMSS0+aXNWb2xhdGlsZSgpID09IGNhc3Q8TG9hZEluc3Q+KEkpLT5pc1ZvbGF0aWxlKCkgJiYKKyAgICAgICAgICAgTEktPmdldEFsaWdubWVudCgpID09IGNhc3Q8TG9hZEluc3Q+KEkpLT5nZXRBbGlnbm1lbnQoKTsKKyAgaWYgKGNvbnN0IFN0b3JlSW5zdCAqU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KHRoaXMpKQorICAgIHJldHVybiBTSS0+aXNWb2xhdGlsZSgpID09IGNhc3Q8U3RvcmVJbnN0PihJKS0+aXNWb2xhdGlsZSgpICYmCisgICAgICAgICAgIFNJLT5nZXRBbGlnbm1lbnQoKSA9PSBjYXN0PFN0b3JlSW5zdD4oSSktPmdldEFsaWdubWVudCgpOworICBpZiAoY29uc3QgQ21wSW5zdCAqQ0kgPSBkeW5fY2FzdDxDbXBJbnN0Pih0aGlzKSkKKyAgICByZXR1cm4gQ0ktPmdldFByZWRpY2F0ZSgpID09IGNhc3Q8Q21wSW5zdD4oSSktPmdldFByZWRpY2F0ZSgpOworICBpZiAoY29uc3QgQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KHRoaXMpKQorICAgIHJldHVybiBDSS0+aXNUYWlsQ2FsbCgpID09IGNhc3Q8Q2FsbEluc3Q+KEkpLT5pc1RhaWxDYWxsKCkgJiYKKyAgICAgICAgICAgQ0ktPmdldENhbGxpbmdDb252KCkgPT0gY2FzdDxDYWxsSW5zdD4oSSktPmdldENhbGxpbmdDb252KCkgJiYKKyAgICAgICAgICAgQ0ktPmdldEF0dHJpYnV0ZXMoKS5nZXRSYXdQb2ludGVyKCkgPT0KKyAgICAgICAgICAgICBjYXN0PENhbGxJbnN0PihJKS0+Z2V0QXR0cmlidXRlcygpLmdldFJhd1BvaW50ZXIoKTsKKyAgaWYgKGNvbnN0IEluc2VydFZhbHVlSW5zdCAqSVZJID0gZHluX2Nhc3Q8SW5zZXJ0VmFsdWVJbnN0Pih0aGlzKSkgeworICAgIGlmIChJVkktPmdldE51bUluZGljZXMoKSAhPSBjYXN0PEluc2VydFZhbHVlSW5zdD4oSSktPmdldE51bUluZGljZXMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSVZJLT5nZXROdW1JbmRpY2VzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKElWSS0+aWR4X2JlZ2luKClbaV0gIT0gY2FzdDxJbnNlcnRWYWx1ZUluc3Q+KEkpLT5pZHhfYmVnaW4oKVtpXSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChjb25zdCBFeHRyYWN0VmFsdWVJbnN0ICpFVkkgPSBkeW5fY2FzdDxFeHRyYWN0VmFsdWVJbnN0Pih0aGlzKSkgeworICAgIGlmIChFVkktPmdldE51bUluZGljZXMoKSAhPSBjYXN0PEV4dHJhY3RWYWx1ZUluc3Q+KEkpLT5nZXROdW1JbmRpY2VzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEVWSS0+Z2V0TnVtSW5kaWNlcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChFVkktPmlkeF9iZWdpbigpW2ldICE9IGNhc3Q8RXh0cmFjdFZhbHVlSW5zdD4oSSktPmlkeF9iZWdpbigpW2ldKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGlzVXNlZE91dHNpZGVPZkJsb2NrIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSB1c2VzIG9mIEkgb3V0c2lkZSBvZiB0aGUKKy8vLyBzcGVjaWZpZWQgYmxvY2suICBOb3RlIHRoYXQgUEhJIG5vZGVzIGFyZSBjb25zaWRlcmVkIHRvIGV2YWx1YXRlIHRoZWlyCisvLy8gb3BlcmFuZHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGVjZXNzb3IgYmxvY2suCitib29sIEluc3RydWN0aW9uOjppc1VzZWRPdXRzaWRlT2ZCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICBmb3IgKGNvbnN0X3VzZV9pdGVyYXRvciBVSSA9IHVzZV9iZWdpbigpLCBFID0gdXNlX2VuZCgpOyBVSSAhPSBFOyArK1VJKSB7CisgICAgLy8gUEhJIG5vZGVzIHVzZXMgdmFsdWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIHByZWRlY2Vzc29yIGJsb2NrLiAgRm9yIG90aGVyCisgICAgLy8gaW5zdHJ1Y3Rpb25zLCBqdXN0IGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBwYXJlbnQgb2YgdGhlIHVzZSBtYXRjaGVzIHVwLgorICAgIGNvbnN0IFVzZXIgKlUgPSAqVUk7CisgICAgY29uc3QgUEhJTm9kZSAqUE4gPSBkeW5fY2FzdDxQSElOb2RlPihVKTsKKyAgICBpZiAoUE4gPT0gMCkgeworICAgICAgaWYgKGNhc3Q8SW5zdHJ1Y3Rpb24+KFUpLT5nZXRQYXJlbnQoKSAhPSBCQikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoUE4tPmdldEluY29taW5nQmxvY2soVUkpICE9IEJCKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gbWF5UmVhZEZyb21NZW1vcnkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIG1heSByZWFkIG1lbW9yeS4KKy8vLworYm9vbCBJbnN0cnVjdGlvbjo6bWF5UmVhZEZyb21NZW1vcnkoKSBjb25zdCB7CisgIHN3aXRjaCAoZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICBjYXNlIEluc3RydWN0aW9uOjpMb2FkOgorICAgIHJldHVybiB0cnVlOworICBjYXNlIEluc3RydWN0aW9uOjpDYWxsOgorICAgIHJldHVybiAhY2FzdDxDYWxsSW5zdD4odGhpcyktPmRvZXNOb3RBY2Nlc3NNZW1vcnkoKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U3RvcmU6CisgICAgcmV0dXJuIGNhc3Q8U3RvcmVJbnN0Pih0aGlzKS0+aXNWb2xhdGlsZSgpOworICB9Cit9CisKKy8vLyBtYXlXcml0ZVRvTWVtb3J5IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBtYXkgbW9kaWZ5IG1lbW9yeS4KKy8vLworYm9vbCBJbnN0cnVjdGlvbjo6bWF5V3JpdGVUb01lbW9yeSgpIGNvbnN0IHsKKyAgc3dpdGNoIChnZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlN0b3JlOgorICAgIHJldHVybiB0cnVlOworICBjYXNlIEluc3RydWN0aW9uOjpDYWxsOgorICAgIHJldHVybiAhY2FzdDxDYWxsSW5zdD4odGhpcyktPm9ubHlSZWFkc01lbW9yeSgpOworICBjYXNlIEluc3RydWN0aW9uOjpMb2FkOgorICAgIHJldHVybiBjYXN0PExvYWRJbnN0Pih0aGlzKS0+aXNWb2xhdGlsZSgpOworICB9Cit9CisKKy8vLyBpc0Fzc29jaWF0aXZlIC0gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGFzc29jaWF0aXZlOgorLy8vCisvLy8gICBBc3NvY2lhdGl2ZSBvcGVyYXRvcnMgc2F0aXNmeTogIHggb3AgKHkgb3AgeikgPT09ICh4IG9wIHkpIG9wIHoKKy8vLworLy8vIEluIExMVk0sIHRoZSBBZGQsIE11bCwgQW5kLCBPciwgYW5kIFhvciBvcGVyYXRvcnMgYXJlIGFzc29jaWF0aXZlLgorLy8vCitib29sIEluc3RydWN0aW9uOjppc0Fzc29jaWF0aXZlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgVHlwZSAqVHkpIHsKKyAgcmV0dXJuIE9wY29kZSA9PSBBbmQgfHwgT3Bjb2RlID09IE9yIHx8IE9wY29kZSA9PSBYb3IgfHwKKyAgICAgICAgIE9wY29kZSA9PSBBZGQgfHwgT3Bjb2RlID09IE11bDsKK30KKworLy8vIGlzQ29tbXV0YXRpdmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgY29tbXV0YXRpdmU6CisvLy8KKy8vLyAgIENvbW11dGF0aXZlIG9wZXJhdG9ycyBzYXRpc2Z5OiAoeCBvcCB5KSA9PT0gKHkgb3AgeCkKKy8vLworLy8vIEluIExMVk0sIHRoZXNlIGFyZSB0aGUgYXNzb2NpYXRpdmUgb3BlcmF0b3JzLCBwbHVzIFNldEVRIGFuZCBTZXRORSwgd2hlbgorLy8vIGFwcGxpZWQgdG8gYW55IHR5cGUuCisvLy8KK2Jvb2wgSW5zdHJ1Y3Rpb246OmlzQ29tbXV0YXRpdmUodW5zaWduZWQgb3ApIHsKKyAgc3dpdGNoIChvcCkgeworICBjYXNlIEFkZDoKKyAgY2FzZSBGQWRkOgorICBjYXNlIE11bDoKKyAgY2FzZSBGTXVsOgorICBjYXNlIEFuZDoKKyAgY2FzZSBPcjoKKyAgY2FzZSBYb3I6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgSW5zdHJ1Y3Rpb246OmlzU2FmZVRvU3BlY3VsYXRpdmVseUV4ZWN1dGUoKSBjb25zdCB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oZ2V0T3BlcmFuZChpKSkpCisgICAgICBpZiAoQy0+Y2FuVHJhcCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChnZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiB0cnVlOworICBjYXNlIFVEaXY6CisgIGNhc2UgVVJlbTogeworICAgIC8vIHggLyB5IGlzIHVuZGVmaW5lZCBpZiB5ID09IDAsIGJ1dCBjYWxjdWF0aW9ucyBsaWtlIHggLyAzIGFyZSBzYWZlLgorICAgIENvbnN0YW50SW50ICpPcCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihnZXRPcGVyYW5kKDEpKTsKKyAgICByZXR1cm4gT3AgJiYgIU9wLT5pc051bGxWYWx1ZSgpOworICB9CisgIGNhc2UgU0RpdjoKKyAgY2FzZSBTUmVtOiB7CisgICAgLy8geCAvIHkgaXMgdW5kZWZpbmVkIGlmIHkgPT0gMCwgYW5kIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB5ID09IC0xLAorICAgIC8vIGJ1dCBjYWxjdWF0aW9ucyBsaWtlIHggLyAzIGFyZSBzYWZlLgorICAgIENvbnN0YW50SW50ICpPcCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihnZXRPcGVyYW5kKDEpKTsKKyAgICByZXR1cm4gT3AgJiYgIU9wLT5pc051bGxWYWx1ZSgpICYmICFPcC0+aXNBbGxPbmVzVmFsdWUoKTsKKyAgfQorICBjYXNlIExvYWQ6IHsKKyAgICBpZiAoY2FzdDxMb2FkSW5zdD4odGhpcyktPmlzVm9sYXRpbGUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBOb3RlIHRoYXQgaXQgaXMgbm90IHNhZmUgdG8gc3BlY3VsYXRlIGludG8gYSBtYWxsb2MnZCByZWdpb24gYmVjYXVzZQorICAgIC8vIG1hbGxvYyBtYXkgcmV0dXJuIG51bGwuCisgICAgLy8gSXQncyBhbHNvIG5vdCBzYWZlIHRvIGZvbGxvdyBhIGJpdGNhc3QsIGZvciBleGFtcGxlOgorICAgIC8vICAgYml0Y2FzdCBpOCogKGFsbG9jYSBpOCkgdG8gaTMyKgorICAgIC8vIHdvdWxkIHJlc3VsdCBpbiBhIDQtYnl0ZSBsb2FkIGZyb20gYSAxLWJ5dGUgYWxsb2NhLgorICAgIFZhbHVlICpPcDAgPSBnZXRPcGVyYW5kKDApOworICAgIGlmIChHRVBPcGVyYXRvciAqR0VQID0gZHluX2Nhc3Q8R0VQT3BlcmF0b3I+KE9wMCkpIHsKKyAgICAgIC8vIFRPRE86IGl0J3Mgc2FmZSB0byBkbyB0aGlzIGZvciBhbnkgR0VQIHdpdGggY29uc3RhbnQgaW5kaWNlcyB0aGF0CisgICAgICAvLyBjb21wdXRlIGluc2lkZSB0aGUgYWxsb2NhdGVkIHR5cGUsIGJ1dCBub3QgZm9yIGFueSBpbmJvdW5kcyBnZXAuCisgICAgICBpZiAoR0VQLT5oYXNBbGxaZXJvSW5kaWNlcygpKQorICAgICAgICBPcDAgPSBHRVAtPmdldFBvaW50ZXJPcGVyYW5kKCk7CisgICAgfQorICAgIGlmIChpc2E8QWxsb2NhSW5zdD4oT3AwKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChHbG9iYWxWYXJpYWJsZSAqR1YgPSBkeW5fY2FzdDxHbG9iYWxWYXJpYWJsZT4oZ2V0T3BlcmFuZCgwKSkpCisgICAgICByZXR1cm4gIUdWLT5oYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNhc2UgQ2FsbDoKKyAgICByZXR1cm4gZmFsc2U7IC8vIFRoZSBjYWxsZWQgZnVuY3Rpb24gY291bGQgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3Igb3IKKyAgICAgICAgICAgICAgICAgIC8vIHNpZGUtZWZmZWN0cy4KKyAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgc3BlY2lhbC1jYXNlIHNvbWUgaW50cmluc2ljcyAoYnN3YXAsCisgICAgICAgICAgICAgICAgICAvLyBvdmVyZmxvdy1jaGVja2luZyBhcml0aG1ldGljLCBldGMuKQorICBjYXNlIEFsbG9jYToKKyAgY2FzZSBQSEk6CisgIGNhc2UgU3RvcmU6CisgIGNhc2UgUmV0OgorICBjYXNlIEJyOgorICBjYXNlIEluZGlyZWN0QnI6CisgIGNhc2UgU3dpdGNoOgorICBjYXNlIFVucmVhY2hhYmxlOgorICAgIHJldHVybiBmYWxzZTsgLy8gTWlzYyBpbnN0cnVjdGlvbnMgd2hpY2ggaGF2ZSBlZmZlY3RzCisgIH0KK30KKworSW5zdHJ1Y3Rpb24gKkluc3RydWN0aW9uOjpjbG9uZSgpIGNvbnN0IHsKKyAgSW5zdHJ1Y3Rpb24gKk5ldyA9IGNsb25lX2ltcGwoKTsKKyAgTmV3LT5TdWJjbGFzc09wdGlvbmFsRGF0YSA9IFN1YmNsYXNzT3B0aW9uYWxEYXRhOworICBpZiAoIWhhc01ldGFkYXRhKCkpCisgICAgcmV0dXJuIE5ldzsKKyAgCisgIC8vIE90aGVyd2lzZSwgZW51bWVyYXRlIGFuZCBjb3B5IG92ZXIgbWV0YWRhdGEgZnJvbSB0aGUgb2xkIGluc3RydWN0aW9uIHRvIHRoZQorICAvLyBuZXcgb25lLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIE1ETm9kZSo+LCA0PiBUaGVNRHM7CisgIGdldEFsbE1ldGFkYXRhKFRoZU1Ecyk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUaGVNRHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBOZXctPnNldE1ldGFkYXRhKFRoZU1Ec1tpXS5maXJzdCwgVGhlTURzW2ldLnNlY29uZCk7CisgIHJldHVybiBOZXc7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0luc3RydWN0aW9ucy5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0luc3RydWN0aW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhMTE2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvSW5zdHJ1Y3Rpb25zLmNwcApAQCAtMCwwICsxLDI5OTUgQEAKKy8vPT09LS0gSW5zdHJ1Y3Rpb25zLmNwcCAtIEltcGxlbWVudCB0aGUgTExWTSBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYWxsIG9mIHRoZSBub24taW5saW5lIG1ldGhvZHMgZm9yIHRoZSBMTFZNIGluc3RydWN0aW9uCisvLyBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJMTFZNQ29udGV4dEltcGwuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL09wZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29uc3RhbnRSYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxTaXRlIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitVc2VyOjpvcF9pdGVyYXRvciBDYWxsU2l0ZTo6Z2V0Q2FsbGVlKCkgY29uc3QgeworICBJbnN0cnVjdGlvbiAqSUkoZ2V0SW5zdHJ1Y3Rpb24oKSk7CisgIHJldHVybiBjYXN0PENhbGxJbnN0PihJSSktPm9wX2VuZCgpIC0gMTsgLy8gU2tpcCBDYWxsZWUKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlcm1pbmF0b3JJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZCwgc28gdGhlIHZ0YWJsZSwgZXRjIGhhcyBhIGhvbWUuCitUZXJtaW5hdG9ySW5zdDo6flRlcm1pbmF0b3JJbnN0KCkgeworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBVbmFyeUluc3RydWN0aW9uIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZCwgc28gdGhlIHZ0YWJsZSwgZXRjIGhhcyBhIGhvbWUuCitVbmFyeUluc3RydWN0aW9uOjp+VW5hcnlJbnN0cnVjdGlvbigpIHsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGFyZUludmFsaWRPcGVyYW5kcyAtIFJldHVybiBhIHN0cmluZyBpZiB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzIGFyZSBpbnZhbGlkCisvLy8gZm9yIGEgc2VsZWN0IG9wZXJhdGlvbiwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgorY29uc3QgY2hhciAqU2VsZWN0SW5zdDo6YXJlSW52YWxpZE9wZXJhbmRzKFZhbHVlICpPcDAsIFZhbHVlICpPcDEsIFZhbHVlICpPcDIpIHsKKyAgaWYgKE9wMS0+Z2V0VHlwZSgpICE9IE9wMi0+Z2V0VHlwZSgpKQorICAgIHJldHVybiAiYm90aCB2YWx1ZXMgdG8gc2VsZWN0IG11c3QgaGF2ZSBzYW1lIHR5cGUiOworICAKKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oT3AwLT5nZXRUeXBlKCkpKSB7CisgICAgLy8gVmVjdG9yIHNlbGVjdC4KKyAgICBpZiAoVlQtPmdldEVsZW1lbnRUeXBlKCkgIT0gVHlwZTo6Z2V0SW50MVR5KE9wMC0+Z2V0Q29udGV4dCgpKSkKKyAgICAgIHJldHVybiAidmVjdG9yIHNlbGVjdCBjb25kaXRpb24gZWxlbWVudCB0eXBlIG11c3QgYmUgaTEiOworICAgIGNvbnN0IFZlY3RvclR5cGUgKkVUID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oT3AxLT5nZXRUeXBlKCkpOworICAgIGlmIChFVCA9PSAwKQorICAgICAgcmV0dXJuICJzZWxlY3RlZCB2YWx1ZXMgZm9yIHZlY3RvciBzZWxlY3QgbXVzdCBiZSB2ZWN0b3JzIjsKKyAgICBpZiAoRVQtPmdldE51bUVsZW1lbnRzKCkgIT0gVlQtPmdldE51bUVsZW1lbnRzKCkpCisgICAgICByZXR1cm4gInZlY3RvciBzZWxlY3QgcmVxdWlyZXMgc2VsZWN0ZWQgdmVjdG9ycyB0byBoYXZlICIKKyAgICAgICAgICAgICAgICAgICAidGhlIHNhbWUgdmVjdG9yIGxlbmd0aCBhcyBzZWxlY3QgY29uZGl0aW9uIjsKKyAgfSBlbHNlIGlmIChPcDAtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRJbnQxVHkoT3AwLT5nZXRDb250ZXh0KCkpKSB7CisgICAgcmV0dXJuICJzZWxlY3QgY29uZGl0aW9uIG11c3QgYmUgaTEgb3IgPG4geCBpMT4iOworICB9CisgIHJldHVybiAwOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSElOb2RlIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitQSElOb2RlOjpQSElOb2RlKGNvbnN0IFBISU5vZGUgJlBOKQorICA6IEluc3RydWN0aW9uKFBOLmdldFR5cGUoKSwgSW5zdHJ1Y3Rpb246OlBISSwKKyAgICAgICAgICAgICAgICBhbGxvY0h1bmdvZmZVc2VzKFBOLmdldE51bU9wZXJhbmRzKCkpLCBQTi5nZXROdW1PcGVyYW5kcygpKSwKKyAgICBSZXNlcnZlZFNwYWNlKFBOLmdldE51bU9wZXJhbmRzKCkpIHsKKyAgVXNlICpPTCA9IE9wZXJhbmRMaXN0OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUE4uZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyBpKz0yKSB7CisgICAgT0xbaV0gPSBQTi5nZXRPcGVyYW5kKGkpOworICAgIE9MW2krMV0gPSBQTi5nZXRPcGVyYW5kKGkrMSk7CisgIH0KKyAgU3ViY2xhc3NPcHRpb25hbERhdGEgPSBQTi5TdWJjbGFzc09wdGlvbmFsRGF0YTsKK30KKworUEhJTm9kZTo6flBISU5vZGUoKSB7CisgIGlmIChPcGVyYW5kTGlzdCkKKyAgICBkcm9wSHVuZ29mZlVzZXMoT3BlcmFuZExpc3QpOworfQorCisvLyByZW1vdmVJbmNvbWluZ1ZhbHVlIC0gUmVtb3ZlIGFuIGluY29taW5nIHZhbHVlLiAgVGhpcyBpcyB1c2VmdWwgaWYgYQorLy8gcHJlZGVjZXNzb3IgYmFzaWMgYmxvY2sgaXMgZGVsZXRlZC4KK1ZhbHVlICpQSElOb2RlOjpyZW1vdmVJbmNvbWluZ1ZhbHVlKHVuc2lnbmVkIElkeCwgYm9vbCBEZWxldGVQSElJZkVtcHR5KSB7CisgIHVuc2lnbmVkIE51bU9wcyA9IGdldE51bU9wZXJhbmRzKCk7CisgIFVzZSAqT0wgPSBPcGVyYW5kTGlzdDsKKyAgYXNzZXJ0KElkeCoyIDwgTnVtT3BzICYmICJCQiBub3QgaW4gUEhJIG5vZGUhIik7CisgIFZhbHVlICpSZW1vdmVkID0gT0xbSWR4KjJdOworCisgIC8vIE1vdmUgZXZlcnl0aGluZyBhZnRlciB0aGlzIG9wZXJhbmQgZG93bi4KKyAgLy8KKyAgLy8gRklYTUU6IHdlIGNvdWxkIGp1c3Qgc3dhcCB3aXRoIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHRoZW4gZXJhc2UuICBIb3dldmVyLAorICAvLyBjbGllbnQgbWlnaHQgbm90IGV4cGVjdCB0aGlzIHRvIGhhcHBlbi4gIFRoZSBjb2RlIGFzIGl0IGlzIHRocmFzaGVzIHRoZQorICAvLyB1c2UvZGVmIGxpc3RzLCB3aGljaCBpcyBraW5kYSBsYW1lLgorICBmb3IgKHVuc2lnbmVkIGkgPSAoSWR4KzEpKjI7IGkgIT0gTnVtT3BzOyBpICs9IDIpIHsKKyAgICBPTFtpLTJdID0gT0xbaV07CisgICAgT0xbaS0yKzFdID0gT0xbaSsxXTsKKyAgfQorCisgIC8vIE51a2UgdGhlIGxhc3QgdmFsdWUuCisgIE9MW051bU9wcy0yXS5zZXQoMCk7CisgIE9MW051bU9wcy0yKzFdLnNldCgwKTsKKyAgTnVtT3BlcmFuZHMgPSBOdW1PcHMtMjsKKworICAvLyBJZiB0aGUgUEhJIG5vZGUgaXMgZGVhZCwgYmVjYXVzZSBpdCBoYXMgemVybyBlbnRyaWVzLCBudWtlIGl0IG5vdy4KKyAgaWYgKE51bU9wcyA9PSAyICYmIERlbGV0ZVBISUlmRW1wdHkpIHsKKyAgICAvLyBJZiBhbnlvbmUgaXMgdXNpbmcgdGhpcyBQSEksIG1ha2UgdGhlbSB1c2UgYSBkdW1teSB2YWx1ZSBpbnN0ZWFkLi4uCisgICAgcmVwbGFjZUFsbFVzZXNXaXRoKFVuZGVmVmFsdWU6OmdldChnZXRUeXBlKCkpKTsKKyAgICBlcmFzZUZyb21QYXJlbnQoKTsKKyAgfQorICByZXR1cm4gUmVtb3ZlZDsKK30KKworLy8vIHJlc2l6ZU9wZXJhbmRzIC0gcmVzaXplIG9wZXJhbmRzIC0gVGhpcyBhZGp1c3RzIHRoZSBsZW5ndGggb2YgdGhlIG9wZXJhbmRzCisvLy8gbGlzdCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBiZWhhdmlvcjoKKy8vLyAgIDEuIElmIE51bU9wcyA9PSAwLCBncm93IHRoZSBvcGVyYW5kIGxpc3QgaW4gcmVzcG9uc2UgdG8gYSBwdXNoX2JhY2sgc3R5bGUKKy8vLyAgICAgIG9mIG9wZXJhdGlvbi4gIFRoaXMgZ3Jvd3MgdGhlIG51bWJlciBvZiBvcHMgYnkgMS41IHRpbWVzLgorLy8vICAgMi4gSWYgTnVtT3BzID4gTnVtT3BlcmFuZHMsIHJlc2VydmUgc3BhY2UgZm9yIE51bU9wcyBvcGVyYW5kcy4KKy8vLyAgIDMuIElmIE51bU9wcyA9PSBOdW1PcGVyYW5kcywgdHJpbSB0aGUgcmVzZXJ2ZWQgc3BhY2UuCisvLy8KK3ZvaWQgUEhJTm9kZTo6cmVzaXplT3BlcmFuZHModW5zaWduZWQgTnVtT3BzKSB7CisgIHVuc2lnbmVkIGUgPSBnZXROdW1PcGVyYW5kcygpOworICBpZiAoTnVtT3BzID09IDApIHsKKyAgICBOdW1PcHMgPSBlKjMvMjsKKyAgICBpZiAoTnVtT3BzIDwgNCkgTnVtT3BzID0gNDsgICAgICAvLyA0IG9wIFBISSBub2RlcyBhcmUgVkVSWSBjb21tb24uCisgIH0gZWxzZSBpZiAoTnVtT3BzKjIgPiBOdW1PcGVyYW5kcykgeworICAgIC8vIE5vIHJlc2l6ZSBuZWVkZWQuCisgICAgaWYgKFJlc2VydmVkU3BhY2UgPj0gTnVtT3BzKSByZXR1cm47CisgIH0gZWxzZSBpZiAoTnVtT3BzID09IE51bU9wZXJhbmRzKSB7CisgICAgaWYgKFJlc2VydmVkU3BhY2UgPT0gTnVtT3BzKSByZXR1cm47CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9CisKKyAgUmVzZXJ2ZWRTcGFjZSA9IE51bU9wczsKKyAgVXNlICpPbGRPcHMgPSBPcGVyYW5kTGlzdDsKKyAgVXNlICpOZXdPcHMgPSBhbGxvY0h1bmdvZmZVc2VzKE51bU9wcyk7CisgIHN0ZDo6Y29weShPbGRPcHMsIE9sZE9wcyArIGUsIE5ld09wcyk7CisgIE9wZXJhbmRMaXN0ID0gTmV3T3BzOworICBpZiAoT2xkT3BzKSBVc2U6OnphcChPbGRPcHMsIE9sZE9wcyArIGUsIHRydWUpOworfQorCisvLy8gaGFzQ29uc3RhbnRWYWx1ZSAtIElmIHRoZSBzcGVjaWZpZWQgUEhJIG5vZGUgYWx3YXlzIG1lcmdlcyB0b2dldGhlciB0aGUgc2FtZQorLy8vIHZhbHVlLCByZXR1cm4gdGhlIHZhbHVlLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisvLy8KKy8vLyBJZiB0aGUgUEhJIGhhcyB1bmRlZiBvcGVyYW5kcywgYnV0IGFsbCB0aGUgcmVzdCBvZiB0aGUgb3BlcmFuZHMgYXJlCisvLy8gc29tZSB1bmlxdWUgdmFsdWUsIHJldHVybiB0aGF0IHZhbHVlIGlmIGl0IGNhbiBiZSBwcm92ZWQgdGhhdCB0aGUKKy8vLyB2YWx1ZSBkb21pbmF0ZXMgdGhlIFBISS4gSWYgRFQgaXMgbnVsbCwgdXNlIGEgY29uc2VydmF0aXZlIGNoZWNrLAorLy8vIG90aGVyd2lzZSB1c2UgRFQgdG8gdGVzdCBmb3IgZG9taW5hbmNlLgorLy8vCitWYWx1ZSAqUEhJTm9kZTo6aGFzQ29uc3RhbnRWYWx1ZShEb21pbmF0b3JUcmVlICpEVCkgY29uc3QgeworICAvLyBJZiB0aGUgUEhJIG5vZGUgb25seSBoYXMgb25lIGluY29taW5nIHZhbHVlLCBlbGltaW5hdGUgdGhlIFBISSBub2RlLgorICBpZiAoZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKSA9PSAxKSB7CisgICAgaWYgKGdldEluY29taW5nVmFsdWUoMCkgIT0gdGhpcykgICAvLyBub3QgIFggPSBwaGkgWAorICAgICAgcmV0dXJuIGdldEluY29taW5nVmFsdWUoMCk7CisgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChnZXRUeXBlKCkpOyAgLy8gU2VsZiBjeWNsZSBpcyBkZWFkLgorICB9CisgICAgICAKKyAgLy8gT3RoZXJ3aXNlIGlmIGFsbCBvZiB0aGUgaW5jb21pbmcgdmFsdWVzIGFyZSB0aGUgc2FtZSBmb3IgdGhlIFBISSwgcmVwbGFjZQorICAvLyB0aGUgUEhJIG5vZGUgd2l0aCB0aGUgaW5jb21pbmcgdmFsdWUuCisgIC8vCisgIFZhbHVlICpJblZhbCA9IDA7CisgIGJvb2wgSGFzVW5kZWZJbnB1dCA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihnZXRJbmNvbWluZ1ZhbHVlKGkpKSkgeworICAgICAgSGFzVW5kZWZJbnB1dCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChnZXRJbmNvbWluZ1ZhbHVlKGkpICE9IHRoaXMpIHsgLy8gTm90IHRoZSBQSEkgbm9kZSBpdHNlbGYuLi4KKyAgICAgIGlmIChJblZhbCAmJiBnZXRJbmNvbWluZ1ZhbHVlKGkpICE9IEluVmFsKQorICAgICAgICByZXR1cm4gMDsgIC8vIE5vdCB0aGUgc2FtZSwgYmFpbCBvdXQuCisgICAgICBJblZhbCA9IGdldEluY29taW5nVmFsdWUoaSk7CisgICAgfQorICAKKyAgLy8gVGhlIG9ubHkgY2FzZSB0aGF0IGNvdWxkIGNhdXNlIEluVmFsIHRvIGJlIG51bGwgaXMgaWYgd2UgaGF2ZSBhIFBISSBub2RlCisgIC8vIHRoYXQgb25seSBoYXMgZW50cmllcyBmb3IgaXRzZWxmLiAgSW4gdGhpcyBjYXNlLCB0aGVyZSBpcyBubyBlbnRyeSBpbnRvIHRoZQorICAvLyBsb29wLCBzbyBraWxsIHRoZSBQSEkuCisgIC8vCisgIGlmIChJblZhbCA9PSAwKSBJblZhbCA9IFVuZGVmVmFsdWU6OmdldChnZXRUeXBlKCkpOworICAKKyAgLy8gSWYgd2UgaGF2ZSBhIFBISSBub2RlIGxpa2UgcGhpKFgsIHVuZGVmLCBYKSwgd2hlcmUgWCBpcyBkZWZpbmVkIGJ5IHNvbWUKKyAgLy8gaW5zdHJ1Y3Rpb24sIHdlIGNhbm5vdCBhbHdheXMgcmV0dXJuIFggYXMgdGhlIHJlc3VsdCBvZiB0aGUgUEhJIG5vZGUuICBPbmx5CisgIC8vIGRvIHRoaXMgaWYgWCBpcyBub3QgYW4gaW5zdHJ1Y3Rpb24gKHRodXMgaXQgbXVzdCBkb21pbmF0ZSB0aGUgUEhJIGJsb2NrKSwKKyAgLy8gb3IgaWYgdGhlIGNsaWVudCBpcyBwcmVwYXJlZCB0byBkZWFsIHdpdGggdGhpcyBwb3NzaWJpbGl0eS4KKyAgaWYgKCFIYXNVbmRlZklucHV0IHx8ICFpc2E8SW5zdHJ1Y3Rpb24+KEluVmFsKSkKKyAgICByZXR1cm4gSW5WYWw7CisgIAorICBJbnN0cnVjdGlvbiAqSVYgPSBjYXN0PEluc3RydWN0aW9uPihJblZhbCk7CisgIGlmIChEVCkgeworICAgIC8vIFdlIGhhdmUgYSBEb21pbmF0b3JUcmVlLiBEbyBhIHByZWNpc2UgdGVzdC4KKyAgICBpZiAoIURULT5kb21pbmF0ZXMoSVYsIHRoaXMpKQorICAgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgLy8gSWYgaXQgaXMgaW4gdGhlIGVudHJ5IGJsb2NrLCBpdCBvYnZpb3VzbHkgZG9taW5hdGVzIGV2ZXJ5dGhpbmcuCisgICAgaWYgKElWLT5nZXRQYXJlbnQoKSAhPSAmSVYtPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0RW50cnlCbG9jaygpIHx8CisgICAgICAgIElTQV9JTlZPS0VfSU5TVChJVikpCisgICAgICByZXR1cm4gMDsgICAvLyBDYW5ub3QgZ3VhcmFudGVlIHRoYXQgSW5WYWwgZG9taW5hdGVzIHRoaXMgUEhJTm9kZS4KKyAgfQorCisgIC8vIEFsbCBvZiB0aGUgaW5jb21pbmcgdmFsdWVzIGFyZSB0aGUgc2FtZSwgcmV0dXJuIHRoZSB2YWx1ZSBub3cuCisgIHJldHVybiBJblZhbDsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICBDYWxsSW5zdCBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQ2FsbEluc3Q6On5DYWxsSW5zdCgpIHsKK30KKwordm9pZCBDYWxsSW5zdDo6aW5pdChWYWx1ZSAqRnVuYywgVmFsdWUqIGNvbnN0ICpQYXJhbXMsIHVuc2lnbmVkIE51bVBhcmFtcykgeworICBhc3NlcnQoTnVtT3BlcmFuZHMgPT0gTnVtUGFyYW1zKzEgJiYgIk51bU9wZXJhbmRzIG5vdCBzZXQgdXA/Iik7CisgIE9wPC0xPigpID0gRnVuYzsKKworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9CisgICAgY2FzdDxGdW5jdGlvblR5cGU+KGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICBGVHkgPSBGVHk7ICAvLyBzaWxlbmNlIHdhcm5pbmcuCisKKyAgYXNzZXJ0KChOdW1QYXJhbXMgPT0gRlR5LT5nZXROdW1QYXJhbXMoKSB8fAorICAgICAgICAgIChGVHktPmlzVmFyQXJnKCkgJiYgTnVtUGFyYW1zID4gRlR5LT5nZXROdW1QYXJhbXMoKSkpICYmCisgICAgICAgICAiQ2FsbGluZyBhIGZ1bmN0aW9uIHdpdGggYmFkIHNpZ25hdHVyZSEiKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1QYXJhbXM7ICsraSkgeworICAgIGFzc2VydCgoaSA+PSBGVHktPmdldE51bVBhcmFtcygpIHx8IAorICAgICAgICAgICAgRlR5LT5nZXRQYXJhbVR5cGUoaSkgPT0gUGFyYW1zW2ldLT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICJDYWxsaW5nIGEgZnVuY3Rpb24gd2l0aCBhIGJhZCBzaWduYXR1cmUhIik7CisgICAgT3BlcmFuZExpc3RbaV0gPSBQYXJhbXNbaV07CisgIH0KK30KKwordm9pZCBDYWxsSW5zdDo6aW5pdChWYWx1ZSAqRnVuYywgVmFsdWUgKkFjdHVhbDEsIFZhbHVlICpBY3R1YWwyKSB7CisgIGFzc2VydChOdW1PcGVyYW5kcyA9PSAzICYmICJOdW1PcGVyYW5kcyBub3Qgc2V0IHVwPyIpOworICBPcDwtMT4oKSA9IEZ1bmM7CisgIE9wPDA+KCkgPSBBY3R1YWwxOworICBPcDwxPigpID0gQWN0dWFsMjsKKworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9CisgICAgY2FzdDxGdW5jdGlvblR5cGU+KGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICBGVHkgPSBGVHk7ICAvLyBzaWxlbmNlIHdhcm5pbmcuCisKKyAgYXNzZXJ0KChGVHktPmdldE51bVBhcmFtcygpID09IDIgfHwKKyAgICAgICAgICAoRlR5LT5pc1ZhckFyZygpICYmIEZUeS0+Z2V0TnVtUGFyYW1zKCkgPCAyKSkgJiYKKyAgICAgICAgICJDYWxsaW5nIGEgZnVuY3Rpb24gd2l0aCBiYWQgc2lnbmF0dXJlIik7CisgIGFzc2VydCgoMCA+PSBGVHktPmdldE51bVBhcmFtcygpIHx8IAorICAgICAgICAgIEZUeS0+Z2V0UGFyYW1UeXBlKDApID09IEFjdHVhbDEtPmdldFR5cGUoKSkgJiYKKyAgICAgICAgICJDYWxsaW5nIGEgZnVuY3Rpb24gd2l0aCBhIGJhZCBzaWduYXR1cmUhIik7CisgIGFzc2VydCgoMSA+PSBGVHktPmdldE51bVBhcmFtcygpIHx8IAorICAgICAgICAgIEZUeS0+Z2V0UGFyYW1UeXBlKDEpID09IEFjdHVhbDItPmdldFR5cGUoKSkgJiYKKyAgICAgICAgICJDYWxsaW5nIGEgZnVuY3Rpb24gd2l0aCBhIGJhZCBzaWduYXR1cmUhIik7Cit9CisKK3ZvaWQgQ2FsbEluc3Q6OmluaXQoVmFsdWUgKkZ1bmMsIFZhbHVlICpBY3R1YWwpIHsKKyAgYXNzZXJ0KE51bU9wZXJhbmRzID09IDIgJiYgIk51bU9wZXJhbmRzIG5vdCBzZXQgdXA/Iik7CisgIE9wPC0xPigpID0gRnVuYzsKKyAgT3A8MD4oKSA9IEFjdHVhbDsKKworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9CisgICAgY2FzdDxGdW5jdGlvblR5cGU+KGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICBGVHkgPSBGVHk7ICAvLyBzaWxlbmNlIHdhcm5pbmcuCisKKyAgYXNzZXJ0KChGVHktPmdldE51bVBhcmFtcygpID09IDEgfHwKKyAgICAgICAgICAoRlR5LT5pc1ZhckFyZygpICYmIEZUeS0+Z2V0TnVtUGFyYW1zKCkgPT0gMCkpICYmCisgICAgICAgICAiQ2FsbGluZyBhIGZ1bmN0aW9uIHdpdGggYmFkIHNpZ25hdHVyZSIpOworICBhc3NlcnQoKDAgPT0gRlR5LT5nZXROdW1QYXJhbXMoKSB8fCAKKyAgICAgICAgICBGVHktPmdldFBhcmFtVHlwZSgwKSA9PSBBY3R1YWwtPmdldFR5cGUoKSkgJiYKKyAgICAgICAgICJDYWxsaW5nIGEgZnVuY3Rpb24gd2l0aCBhIGJhZCBzaWduYXR1cmUhIik7Cit9CisKK3ZvaWQgQ2FsbEluc3Q6OmluaXQoVmFsdWUgKkZ1bmMpIHsKKyAgYXNzZXJ0KE51bU9wZXJhbmRzID09IDEgJiYgIk51bU9wZXJhbmRzIG5vdCBzZXQgdXA/Iik7CisgIE9wPC0xPigpID0gRnVuYzsKKworICBjb25zdCBGdW5jdGlvblR5cGUgKkZUeSA9CisgICAgY2FzdDxGdW5jdGlvblR5cGU+KGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICBGVHkgPSBGVHk7ICAvLyBzaWxlbmNlIHdhcm5pbmcuCisKKyAgYXNzZXJ0KEZUeS0+Z2V0TnVtUGFyYW1zKCkgPT0gMCAmJiAiQ2FsbGluZyBhIGZ1bmN0aW9uIHdpdGggYmFkIHNpZ25hdHVyZSIpOworfQorCitDYWxsSW5zdDo6Q2FsbEluc3QoVmFsdWUgKkZ1bmMsIFZhbHVlKiBBY3R1YWwsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgIDogSW5zdHJ1Y3Rpb24oY2FzdDxGdW5jdGlvblR5cGU+KGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRFbGVtZW50VHlwZSgpKS0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpDYWxsLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8Q2FsbEluc3Q+OjpvcF9lbmQodGhpcykgLSAyLAorICAgICAgICAgICAgICAgIDIsIEluc2VydEJlZm9yZSkgeworICBpbml0KEZ1bmMsIEFjdHVhbCk7CisgIHNldE5hbWUoTmFtZSk7Cit9CisKK0NhbGxJbnN0OjpDYWxsSW5zdChWYWx1ZSAqRnVuYywgVmFsdWUqIEFjdHVhbCwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAgKkluc2VydEF0RW5kKQorICA6IEluc3RydWN0aW9uKGNhc3Q8RnVuY3Rpb25UeXBlPihjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0RWxlbWVudFR5cGUoKSktPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6Q2FsbCwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPENhbGxJbnN0Pjo6b3BfZW5kKHRoaXMpIC0gMiwKKyAgICAgICAgICAgICAgICAyLCBJbnNlcnRBdEVuZCkgeworICBpbml0KEZ1bmMsIEFjdHVhbCk7CisgIHNldE5hbWUoTmFtZSk7Cit9CitDYWxsSW5zdDo6Q2FsbEluc3QoVmFsdWUgKkZ1bmMsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgIDogSW5zdHJ1Y3Rpb24oY2FzdDxGdW5jdGlvblR5cGU+KGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRFbGVtZW50VHlwZSgpKS0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpDYWxsLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8Q2FsbEluc3Q+OjpvcF9lbmQodGhpcykgLSAxLAorICAgICAgICAgICAgICAgIDEsIEluc2VydEJlZm9yZSkgeworICBpbml0KEZ1bmMpOworICBzZXROYW1lKE5hbWUpOworfQorCitDYWxsSW5zdDo6Q2FsbEluc3QoVmFsdWUgKkZ1bmMsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IEluc3RydWN0aW9uKGNhc3Q8RnVuY3Rpb25UeXBlPihjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0RWxlbWVudFR5cGUoKSktPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6Q2FsbCwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPENhbGxJbnN0Pjo6b3BfZW5kKHRoaXMpIC0gMSwKKyAgICAgICAgICAgICAgICAxLCBJbnNlcnRBdEVuZCkgeworICBpbml0KEZ1bmMpOworICBzZXROYW1lKE5hbWUpOworfQorCitDYWxsSW5zdDo6Q2FsbEluc3QoY29uc3QgQ2FsbEluc3QgJkNJKQorICA6IEluc3RydWN0aW9uKENJLmdldFR5cGUoKSwgSW5zdHJ1Y3Rpb246OkNhbGwsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxDYWxsSW5zdD46Om9wX2VuZCh0aGlzKSAtIENJLmdldE51bU9wZXJhbmRzKCksCisgICAgICAgICAgICAgICAgQ0kuZ2V0TnVtT3BlcmFuZHMoKSkgeworICBzZXRBdHRyaWJ1dGVzKENJLmdldEF0dHJpYnV0ZXMoKSk7CisgIHNldFRhaWxDYWxsKENJLmlzVGFpbENhbGwoKSk7CisgIHNldENhbGxpbmdDb252KENJLmdldENhbGxpbmdDb252KCkpOworICAgIAorICBVc2UgKk9MID0gT3BlcmFuZExpc3Q7CisgIFVzZSAqSW5PTCA9IENJLk9wZXJhbmRMaXN0OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ0kuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgT0xbaV0gPSBJbk9MW2ldOworICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9IENJLlN1YmNsYXNzT3B0aW9uYWxEYXRhOworfQorCit2b2lkIENhbGxJbnN0OjphZGRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlcyBhdHRyKSB7CisgIEF0dHJMaXN0UHRyIFBBTCA9IGdldEF0dHJpYnV0ZXMoKTsKKyAgUEFMID0gUEFMLmFkZEF0dHIoaSwgYXR0cik7CisgIHNldEF0dHJpYnV0ZXMoUEFMKTsKK30KKwordm9pZCBDYWxsSW5zdDo6cmVtb3ZlQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZXMgYXR0cikgeworICBBdHRyTGlzdFB0ciBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgIFBBTCA9IFBBTC5yZW1vdmVBdHRyKGksIGF0dHIpOworICBzZXRBdHRyaWJ1dGVzKFBBTCk7Cit9CisKK2Jvb2wgQ2FsbEluc3Q6OnBhcmFtSGFzQXR0cih1bnNpZ25lZCBpLCBBdHRyaWJ1dGVzIGF0dHIpIGNvbnN0IHsKKyAgaWYgKEF0dHJpYnV0ZUxpc3QucGFyYW1IYXNBdHRyKGksIGF0dHIpKQorICAgIHJldHVybiB0cnVlOworICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBnZXRDYWxsZWRGdW5jdGlvbigpKQorICAgIHJldHVybiBGLT5wYXJhbUhhc0F0dHIoaSwgYXR0cik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIElzQ29uc3RhbnRPbmUgLSBSZXR1cm4gdHJ1ZSBvbmx5IGlmIHZhbCBpcyBjb25zdGFudCBpbnQgMQorc3RhdGljIGJvb2wgSXNDb25zdGFudE9uZShWYWx1ZSAqdmFsKSB7CisgIGFzc2VydCh2YWwgJiYgIklzQ29uc3RhbnRPbmUgZG9lcyBub3Qgd29yayB3aXRoIE5VTEwgdmFsIik7CisgIHJldHVybiBpc2E8Q29uc3RhbnRJbnQ+KHZhbCkgJiYgY2FzdDxDb25zdGFudEludD4odmFsKS0+aXNPbmUoKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuSW5zdCBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworUmV0dXJuSW5zdDo6UmV0dXJuSW5zdChjb25zdCBSZXR1cm5JbnN0ICZSSSkKKyAgOiBUZXJtaW5hdG9ySW5zdChUeXBlOjpnZXRWb2lkVHkoUkkuZ2V0Q29udGV4dCgpKSwgSW5zdHJ1Y3Rpb246OlJldCwKKyAgICAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPFJldHVybkluc3Q+OjpvcF9lbmQodGhpcykgLQorICAgICAgICAgICAgICAgICAgICAgUkkuZ2V0TnVtT3BlcmFuZHMoKSwKKyAgICAgICAgICAgICAgICAgICBSSS5nZXROdW1PcGVyYW5kcygpKSB7CisgIGlmIChSSS5nZXROdW1PcGVyYW5kcygpKQorICAgIE9wPDA+KCkgPSBSSS5PcDwwPigpOworICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9IFJJLlN1YmNsYXNzT3B0aW9uYWxEYXRhOworfQorCitSZXR1cm5JbnN0OjpSZXR1cm5JbnN0KExMVk1Db250ZXh0ICZDLCBWYWx1ZSAqcmV0VmFsLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICA6IFRlcm1pbmF0b3JJbnN0KFR5cGU6OmdldFZvaWRUeShDKSwgSW5zdHJ1Y3Rpb246OlJldCwKKyAgICAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPFJldHVybkluc3Q+OjpvcF9lbmQodGhpcykgLSAhIXJldFZhbCwgISFyZXRWYWwsCisgICAgICAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKSB7CisgIGlmIChyZXRWYWwpCisgICAgT3A8MD4oKSA9IHJldFZhbDsKK30KK1JldHVybkluc3Q6OlJldHVybkluc3QoTExWTUNvbnRleHQgJkMsIFZhbHVlICpyZXRWYWwsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IFRlcm1pbmF0b3JJbnN0KFR5cGU6OmdldFZvaWRUeShDKSwgSW5zdHJ1Y3Rpb246OlJldCwKKyAgICAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPFJldHVybkluc3Q+OjpvcF9lbmQodGhpcykgLSAhIXJldFZhbCwgISFyZXRWYWwsCisgICAgICAgICAgICAgICAgICAgSW5zZXJ0QXRFbmQpIHsKKyAgaWYgKHJldFZhbCkKKyAgICBPcDwwPigpID0gcmV0VmFsOworfQorUmV0dXJuSW5zdDo6UmV0dXJuSW5zdChMTFZNQ29udGV4dCAmQ29udGV4dCwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgIDogVGVybWluYXRvckluc3QoVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpLCBJbnN0cnVjdGlvbjo6UmV0LAorICAgICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8UmV0dXJuSW5zdD46Om9wX2VuZCh0aGlzKSwgMCwgSW5zZXJ0QXRFbmQpIHsKK30KKwordW5zaWduZWQgUmV0dXJuSW5zdDo6Z2V0TnVtU3VjY2Vzc29yc1YoKSBjb25zdCB7CisgIHJldHVybiBnZXROdW1TdWNjZXNzb3JzKCk7Cit9CisKKy8vLyBPdXQtb2YtbGluZSBSZXR1cm5JbnN0IG1ldGhvZCwgcHV0IGhlcmUgc28gdGhlIEMrKyBjb21waWxlciBjYW4gY2hvb3NlIHRvCisvLy8gZW1pdCB0aGUgdnRhYmxlIGZvciB0aGUgY2xhc3MgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0Lgordm9pZCBSZXR1cm5JbnN0OjpzZXRTdWNjZXNzb3JWKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqTmV3U3VjYykgeworICBsbHZtX3VucmVhY2hhYmxlKCJSZXR1cm5JbnN0IGhhcyBubyBzdWNjZXNzb3JzISIpOworfQorCitCYXNpY0Jsb2NrICpSZXR1cm5JbnN0OjpnZXRTdWNjZXNzb3JWKHVuc2lnbmVkIGlkeCkgY29uc3QgeworICBsbHZtX3VucmVhY2hhYmxlKCJSZXR1cm5JbnN0IGhhcyBubyBzdWNjZXNzb3JzISIpOworICByZXR1cm4gMDsKK30KKworUmV0dXJuSW5zdDo6flJldHVybkluc3QoKSB7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICBVbnJlYWNoYWJsZUluc3QgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1VucmVhY2hhYmxlSW5zdDo6VW5yZWFjaGFibGVJbnN0KExMVk1Db250ZXh0ICZDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgIDogVGVybWluYXRvckluc3QoVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpLCBJbnN0cnVjdGlvbjo6VW5yZWFjaGFibGUsCisgICAgICAgICAgICAgICAgICAgMCwgMCwgSW5zZXJ0QmVmb3JlKSB7Cit9CitVbnJlYWNoYWJsZUluc3Q6OlVucmVhY2hhYmxlSW5zdChMTFZNQ29udGV4dCAmQ29udGV4dCwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgIDogVGVybWluYXRvckluc3QoVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpLCBJbnN0cnVjdGlvbjo6VW5yZWFjaGFibGUsCisgICAgICAgICAgICAgICAgICAgMCwgMCwgSW5zZXJ0QXRFbmQpIHsKK30KKwordW5zaWduZWQgVW5yZWFjaGFibGVJbnN0OjpnZXROdW1TdWNjZXNzb3JzVigpIGNvbnN0IHsKKyAgcmV0dXJuIGdldE51bVN1Y2Nlc3NvcnMoKTsKK30KKwordm9pZCBVbnJlYWNoYWJsZUluc3Q6OnNldFN1Y2Nlc3NvclYodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpOZXdTdWNjKSB7CisgIGxsdm1fdW5yZWFjaGFibGUoIlVud2luZEluc3QgaGFzIG5vIHN1Y2Nlc3NvcnMhIik7Cit9CisKK0Jhc2ljQmxvY2sgKlVucmVhY2hhYmxlSW5zdDo6Z2V0U3VjY2Vzc29yVih1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiVW53aW5kSW5zdCBoYXMgbm8gc3VjY2Vzc29ycyEiKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaEluc3QgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgQnJhbmNoSW5zdDo6QXNzZXJ0T0soKSB7CisgIGlmIChpc0NvbmRpdGlvbmFsKCkpCisgICAgYXNzZXJ0KGdldENvbmRpdGlvbigpLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDEpICYmCisgICAgICAgICAgICJNYXkgb25seSBicmFuY2ggb24gYm9vbGVhbiBwcmVkaWNhdGVzISIpOworfQorCitCcmFuY2hJbnN0OjpCcmFuY2hJbnN0KEJhc2ljQmxvY2sgKklmVHJ1ZSwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgOiBUZXJtaW5hdG9ySW5zdChUeXBlOjpnZXRWb2lkVHkoSWZUcnVlLT5nZXRDb250ZXh0KCkpLCBJbnN0cnVjdGlvbjo6QnIsCisgICAgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxCcmFuY2hJbnN0Pjo6b3BfZW5kKHRoaXMpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAxLCBJbnNlcnRCZWZvcmUpIHsKKyAgYXNzZXJ0KElmVHJ1ZSAhPSAwICYmICJCcmFuY2ggZGVzdGluYXRpb24gbWF5IG5vdCBiZSBudWxsISIpOworICBPcDwtMT4oKSA9IElmVHJ1ZTsKK30KK0JyYW5jaEluc3Q6OkJyYW5jaEluc3QoQmFzaWNCbG9jayAqSWZUcnVlLCBCYXNpY0Jsb2NrICpJZkZhbHNlLCBWYWx1ZSAqQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgOiBUZXJtaW5hdG9ySW5zdChUeXBlOjpnZXRWb2lkVHkoSWZUcnVlLT5nZXRDb250ZXh0KCkpLCBJbnN0cnVjdGlvbjo6QnIsCisgICAgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxCcmFuY2hJbnN0Pjo6b3BfZW5kKHRoaXMpIC0gMywKKyAgICAgICAgICAgICAgICAgICAzLCBJbnNlcnRCZWZvcmUpIHsKKyAgT3A8LTE+KCkgPSBJZlRydWU7CisgIE9wPC0yPigpID0gSWZGYWxzZTsKKyAgT3A8LTM+KCkgPSBDb25kOworI2lmbmRlZiBOREVCVUcKKyAgQXNzZXJ0T0soKTsKKyNlbmRpZgorfQorCitCcmFuY2hJbnN0OjpCcmFuY2hJbnN0KEJhc2ljQmxvY2sgKklmVHJ1ZSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgIDogVGVybWluYXRvckluc3QoVHlwZTo6Z2V0Vm9pZFR5KElmVHJ1ZS0+Z2V0Q29udGV4dCgpKSwgSW5zdHJ1Y3Rpb246OkJyLAorICAgICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8QnJhbmNoSW5zdD46Om9wX2VuZCh0aGlzKSAtIDEsCisgICAgICAgICAgICAgICAgICAgMSwgSW5zZXJ0QXRFbmQpIHsKKyAgYXNzZXJ0KElmVHJ1ZSAhPSAwICYmICJCcmFuY2ggZGVzdGluYXRpb24gbWF5IG5vdCBiZSBudWxsISIpOworICBPcDwtMT4oKSA9IElmVHJ1ZTsKK30KKworQnJhbmNoSW5zdDo6QnJhbmNoSW5zdChCYXNpY0Jsb2NrICpJZlRydWUsIEJhc2ljQmxvY2sgKklmRmFsc2UsIFZhbHVlICpDb25kLAorICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgOiBUZXJtaW5hdG9ySW5zdChUeXBlOjpnZXRWb2lkVHkoSWZUcnVlLT5nZXRDb250ZXh0KCkpLCBJbnN0cnVjdGlvbjo6QnIsCisgICAgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxCcmFuY2hJbnN0Pjo6b3BfZW5kKHRoaXMpIC0gMywKKyAgICAgICAgICAgICAgICAgICAzLCBJbnNlcnRBdEVuZCkgeworICBPcDwtMT4oKSA9IElmVHJ1ZTsKKyAgT3A8LTI+KCkgPSBJZkZhbHNlOworICBPcDwtMz4oKSA9IENvbmQ7CisjaWZuZGVmIE5ERUJVRworICBBc3NlcnRPSygpOworI2VuZGlmCit9CisKKworQnJhbmNoSW5zdDo6QnJhbmNoSW5zdChjb25zdCBCcmFuY2hJbnN0ICZCSSkgOgorICBUZXJtaW5hdG9ySW5zdChUeXBlOjpnZXRWb2lkVHkoQkkuZ2V0Q29udGV4dCgpKSwgSW5zdHJ1Y3Rpb246OkJyLAorICAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPEJyYW5jaEluc3Q+OjpvcF9lbmQodGhpcykgLSBCSS5nZXROdW1PcGVyYW5kcygpLAorICAgICAgICAgICAgICAgICBCSS5nZXROdW1PcGVyYW5kcygpKSB7CisgIE9wPC0xPigpID0gQkkuT3A8LTE+KCk7CisgIGlmIChCSS5nZXROdW1PcGVyYW5kcygpICE9IDEpIHsKKyAgICBhc3NlcnQoQkkuZ2V0TnVtT3BlcmFuZHMoKSA9PSAzICYmICJCUiBjYW4gaGF2ZSAxIG9yIDMgb3BlcmFuZHMhIik7CisgICAgT3A8LTM+KCkgPSBCSS5PcDwtMz4oKTsKKyAgICBPcDwtMj4oKSA9IEJJLk9wPC0yPigpOworICB9CisgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0gQkkuU3ViY2xhc3NPcHRpb25hbERhdGE7Cit9CisKKworVXNlKiBVc2U6OmdldFByZWZpeCgpIHsKKyAgUG9pbnRlckludFBhaXI8VXNlKiosIDIsIFByZXZQdHJUYWc+ICZQb3RlbnRpYWxQcmVmaXgodGhpc1stMV0uUHJldik7CisgIGlmIChQb3RlbnRpYWxQcmVmaXguZ2V0T3BhcXVlVmFsdWUoKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxVc2UqPigoY2hhciopJlBvdGVudGlhbFByZWZpeCArIDEpOworfQorCitCcmFuY2hJbnN0Ojp+QnJhbmNoSW5zdCgpIHsKKyAgaWYgKE51bU9wZXJhbmRzID09IDEpIHsKKyAgICBpZiAoVXNlICpQcmVmaXggPSBPcGVyYW5kTGlzdC0+Z2V0UHJlZml4KCkpIHsKKyAgICAgIE9wPC0xPigpID0gMDsKKyAgICAgIC8vCisgICAgICAvLyBtYXJrIE9wZXJhbmRMaXN0IHRvIGhhdmUgYSBzcGVjaWFsIHZhbHVlIGZvciBzY3J1dGlueQorICAgICAgLy8gYnkgYmFzZWNsYXNzIGRlc3RydWN0b3JzIGFuZCBvcGVyYXRvciBkZWxldGUKKyAgICAgIE9wZXJhbmRMaXN0ID0gUHJlZml4OworICAgIH0gZWxzZSB7CisgICAgICBOdW1PcGVyYW5kcyA9IDM7CisgICAgICBPcGVyYW5kTGlzdCA9IG9wX2JlZ2luKCk7CisgICAgfQorICB9Cit9CisKKworQmFzaWNCbG9jayAqQnJhbmNoSW5zdDo6Z2V0U3VjY2Vzc29yVih1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN1Y2Nlc3NvcihpZHgpOworfQordW5zaWduZWQgQnJhbmNoSW5zdDo6Z2V0TnVtU3VjY2Vzc29yc1YoKSBjb25zdCB7CisgIHJldHVybiBnZXROdW1TdWNjZXNzb3JzKCk7Cit9Cit2b2lkIEJyYW5jaEluc3Q6OnNldFN1Y2Nlc3NvclYodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpCKSB7CisgIHNldFN1Y2Nlc3NvcihpZHgsIEIpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYUluc3QgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3N0YXRpYyBWYWx1ZSAqZ2V0QUlTaXplKExMVk1Db250ZXh0ICZDb250ZXh0LCBWYWx1ZSAqQW10KSB7CisgIGlmICghQW10KQorICAgIEFtdCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgMSk7CisgIGVsc2UgeworICAgIGFzc2VydCghaXNhPEJhc2ljQmxvY2s+KEFtdCkgJiYKKyAgICAgICAgICAgIlBhc3NlZCBiYXNpYyBibG9jayBpbnRvIGFsbG9jYXRpb24gc2l6ZSBwYXJhbWV0ZXIhIFVzZSBvdGhlciBjdG9yIik7CisgICAgYXNzZXJ0KEFtdC0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpICYmCisgICAgICAgICAgICJBbGxvY2F0aW9uIGFycmF5IHNpemUgaXMgbm90IGFuIGludGVnZXIhIik7CisgIH0KKyAgcmV0dXJuIEFtdDsKK30KKworQWxsb2NhSW5zdDo6QWxsb2NhSW5zdChjb25zdCBUeXBlICpUeSwgVmFsdWUgKkFycmF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgOiBVbmFyeUluc3RydWN0aW9uKFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHkpLCBBbGxvY2EsCisgICAgICAgICAgICAgICAgICAgICBnZXRBSVNpemUoVHktPmdldENvbnRleHQoKSwgQXJyYXlTaXplKSwgSW5zZXJ0QmVmb3JlKSB7CisgIHNldEFsaWdubWVudCgwKTsKKyAgYXNzZXJ0KCFUeS0+aXNWb2lkVHkoKSAmJiAiQ2Fubm90IGFsbG9jYXRlIHZvaWQhIik7Cit9CisKK0FsbG9jYUluc3Q6OkFsbG9jYUluc3QoY29uc3QgVHlwZSAqVHksIFZhbHVlICpBcnJheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oUG9pbnRlclR5cGU6OmdldFVucXVhbChUeSksIEFsbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgIGdldEFJU2l6ZShUeS0+Z2V0Q29udGV4dCgpLCBBcnJheVNpemUpLCBJbnNlcnRBdEVuZCkgeworICBzZXRBbGlnbm1lbnQoMCk7CisgIGFzc2VydCghVHktPmlzVm9pZFR5KCkgJiYgIkNhbm5vdCBhbGxvY2F0ZSB2b2lkISIpOworfQorCitBbGxvY2FJbnN0OjpBbGxvY2FJbnN0KGNvbnN0IFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oUG9pbnRlclR5cGU6OmdldFVucXVhbChUeSksIEFsbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgIGdldEFJU2l6ZShUeS0+Z2V0Q29udGV4dCgpLCAwKSwgSW5zZXJ0QmVmb3JlKSB7CisgIHNldEFsaWdubWVudCgwKTsKKyAgYXNzZXJ0KCFUeS0+aXNWb2lkVHkoKSAmJiAiQ2Fubm90IGFsbG9jYXRlIHZvaWQhIik7Cit9CisKK0FsbG9jYUluc3Q6OkFsbG9jYUluc3QoY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oUG9pbnRlclR5cGU6OmdldFVucXVhbChUeSksIEFsbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgIGdldEFJU2l6ZShUeS0+Z2V0Q29udGV4dCgpLCAwKSwgSW5zZXJ0QXRFbmQpIHsKKyAgc2V0QWxpZ25tZW50KDApOworICBhc3NlcnQoIVR5LT5pc1ZvaWRUeSgpICYmICJDYW5ub3QgYWxsb2NhdGUgdm9pZCEiKTsKK30KKworQWxsb2NhSW5zdDo6QWxsb2NhSW5zdChjb25zdCBUeXBlICpUeSwgVmFsdWUgKkFycmF5U2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgIDogVW5hcnlJbnN0cnVjdGlvbihQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5KSwgQWxsb2NhLAorICAgICAgICAgICAgICAgICAgICAgZ2V0QUlTaXplKFR5LT5nZXRDb250ZXh0KCksIEFycmF5U2l6ZSksIEluc2VydEJlZm9yZSkgeworICBzZXRBbGlnbm1lbnQoQWxpZ24pOworICBhc3NlcnQoIVR5LT5pc1ZvaWRUeSgpICYmICJDYW5ub3QgYWxsb2NhdGUgdm9pZCEiKTsKK30KKworQWxsb2NhSW5zdDo6QWxsb2NhSW5zdChjb25zdCBUeXBlICpUeSwgVmFsdWUgKkFycmF5U2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oUG9pbnRlclR5cGU6OmdldFVucXVhbChUeSksIEFsbG9jYSwKKyAgICAgICAgICAgICAgICAgICAgIGdldEFJU2l6ZShUeS0+Z2V0Q29udGV4dCgpLCBBcnJheVNpemUpLCBJbnNlcnRBdEVuZCkgeworICBzZXRBbGlnbm1lbnQoQWxpZ24pOworICBhc3NlcnQoIVR5LT5pc1ZvaWRUeSgpICYmICJDYW5ub3QgYWxsb2NhdGUgdm9pZCEiKTsKK30KKworLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QsIHNvIHRoZSB2dGFibGUsIGV0YyBoYXMgYSBob21lLgorQWxsb2NhSW5zdDo6fkFsbG9jYUluc3QoKSB7Cit9CisKK3ZvaWQgQWxsb2NhSW5zdDo6c2V0QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgIGFzc2VydCgoQWxpZ24gJiAoQWxpZ24tMSkpID09IDAgJiYgIkFsaWdubWVudCBpcyBub3QgYSBwb3dlciBvZiAyISIpOworICBhc3NlcnQoQWxpZ24gPD0gTWF4aW11bUFsaWdubWVudCAmJgorICAgICAgICAgIkFsaWdubWVudCBpcyBncmVhdGVyIHRoYW4gTWF4aW11bUFsaWdubWVudCEiKTsKKyAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoTG9nMl8zMihBbGlnbikgKyAxKTsKKyAgYXNzZXJ0KGdldEFsaWdubWVudCgpID09IEFsaWduICYmICJBbGlnbm1lbnQgcmVwcmVzZW50YXRpb24gZXJyb3IhIik7Cit9CisKK2Jvb2wgQWxsb2NhSW5zdDo6aXNBcnJheUFsbG9jYXRpb24oKSBjb25zdCB7CisgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oZ2V0T3BlcmFuZCgwKSkpCisgICAgcmV0dXJuIENJLT5nZXRaRXh0VmFsdWUoKSAhPSAxOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgVHlwZSAqQWxsb2NhSW5zdDo6Z2V0QWxsb2NhdGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKTsKK30KKworLy8vIGlzU3RhdGljQWxsb2NhIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBhbGxvY2EgaXMgaW4gdGhlIGVudHJ5IGJsb2NrIG9mIHRoZQorLy8vIGZ1bmN0aW9uIGFuZCBpcyBhIGNvbnN0YW50IHNpemUuICBJZiBzbywgdGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZm9sZCBpdAorLy8vIGludG8gdGhlIHByb2xvZy9lcGlsb2cgY29kZSwgc28gaXQgaXMgYmFzaWNhbGx5IGZyZWUuCitib29sIEFsbG9jYUluc3Q6OmlzU3RhdGljQWxsb2NhKCkgY29uc3QgeworICAvLyBNdXN0IGJlIGNvbnN0YW50IHNpemUuCisgIGlmICghaXNhPENvbnN0YW50SW50PihnZXRBcnJheVNpemUoKSkpIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIE11c3QgYmUgaW4gdGhlIGVudHJ5IGJsb2NrLgorICBjb25zdCBCYXNpY0Jsb2NrICpQYXJlbnQgPSBnZXRQYXJlbnQoKTsKKyAgcmV0dXJuIFBhcmVudCA9PSAmUGFyZW50LT5nZXRQYXJlbnQoKS0+ZnJvbnQoKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEluc3QgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgTG9hZEluc3Q6OkFzc2VydE9LKCkgeworICBhc3NlcnQoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICYmCisgICAgICAgICAiUHRyIG11c3QgaGF2ZSBwb2ludGVyIHR5cGUuIik7Cit9CisKK0xvYWRJbnN0OjpMb2FkSW5zdChWYWx1ZSAqUHRyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmKQorICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgTG9hZCwgUHRyLCBJbnNlcnRCZWYpIHsKKyAgc2V0Vm9sYXRpbGUoZmFsc2UpOworICBzZXRBbGlnbm1lbnQoMCk7CisgIEFzc2VydE9LKCk7Cit9CisKK0xvYWRJbnN0OjpMb2FkSW5zdChWYWx1ZSAqUHRyLCBCYXNpY0Jsb2NrICpJbnNlcnRBRSkKKyAgOiBVbmFyeUluc3RydWN0aW9uKGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIExvYWQsIFB0ciwgSW5zZXJ0QUUpIHsKKyAgc2V0Vm9sYXRpbGUoZmFsc2UpOworICBzZXRBbGlnbm1lbnQoMCk7CisgIEFzc2VydE9LKCk7Cit9CisKK0xvYWRJbnN0OjpMb2FkSW5zdChWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZikKKyAgOiBVbmFyeUluc3RydWN0aW9uKGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIExvYWQsIFB0ciwgSW5zZXJ0QmVmKSB7CisgIHNldFZvbGF0aWxlKGlzVm9sYXRpbGUpOworICBzZXRBbGlnbm1lbnQoMCk7CisgIEFzc2VydE9LKCk7Cit9CisKK0xvYWRJbnN0OjpMb2FkSW5zdChWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsIAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmKQorICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgTG9hZCwgUHRyLCBJbnNlcnRCZWYpIHsKKyAgc2V0Vm9sYXRpbGUoaXNWb2xhdGlsZSk7CisgIHNldEFsaWdubWVudChBbGlnbik7CisgIEFzc2VydE9LKCk7Cit9CisKK0xvYWRJbnN0OjpMb2FkSW5zdChWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsIAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBCYXNpY0Jsb2NrICpJbnNlcnRBRSkKKyAgOiBVbmFyeUluc3RydWN0aW9uKGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIExvYWQsIFB0ciwgSW5zZXJ0QUUpIHsKKyAgc2V0Vm9sYXRpbGUoaXNWb2xhdGlsZSk7CisgIHNldEFsaWdubWVudChBbGlnbik7CisgIEFzc2VydE9LKCk7Cit9CisKK0xvYWRJbnN0OjpMb2FkSW5zdChWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QUUpCisgIDogVW5hcnlJbnN0cnVjdGlvbihjYXN0PFBvaW50ZXJUeXBlPihQdHItPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICBMb2FkLCBQdHIsIEluc2VydEFFKSB7CisgIHNldFZvbGF0aWxlKGlzVm9sYXRpbGUpOworICBzZXRBbGlnbm1lbnQoMCk7CisgIEFzc2VydE9LKCk7Cit9CisKK3ZvaWQgTG9hZEluc3Q6OnNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeworICBhc3NlcnQoKEFsaWduICYgKEFsaWduLTEpKSA9PSAwICYmICJBbGlnbm1lbnQgaXMgbm90IGEgcG93ZXIgb2YgMiEiKTsKKyAgYXNzZXJ0KEFsaWduIDw9IE1heGltdW1BbGlnbm1lbnQgJiYKKyAgICAgICAgICJBbGlnbm1lbnQgaXMgZ3JlYXRlciB0aGFuIE1heGltdW1BbGlnbm1lbnQhIik7CisgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMb2cyXzMyKEFsaWduKSsxKTw8MSkpOworICBhc3NlcnQoZ2V0QWxpZ25tZW50KCkgPT0gQWxpZ24gJiYgIkFsaWdubWVudCByZXByZXNlbnRhdGlvbiBlcnJvciEiKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVJbnN0IEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIFN0b3JlSW5zdDo6QXNzZXJ0T0soKSB7CisgIGFzc2VydChnZXRPcGVyYW5kKDApICYmIGdldE9wZXJhbmQoMSkgJiYgIkJvdGggb3BlcmFuZHMgbXVzdCBiZSBub24tbnVsbCEiKTsKKyAgYXNzZXJ0KGdldE9wZXJhbmQoMSktPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSAmJgorICAgICAgICAgIlB0ciBtdXN0IGhhdmUgcG9pbnRlciB0eXBlISIpOworICBhc3NlcnQoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09CisgICAgICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KGdldE9wZXJhbmQoMSktPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkKKyAgICAgICAgICYmICJQdHIgbXVzdCBiZSBhIHBvaW50ZXIgdG8gVmFsIHR5cGUhIik7Cit9CisKKworU3RvcmVJbnN0OjpTdG9yZUluc3QoVmFsdWUgKnZhbCwgVmFsdWUgKmFkZHIsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgIDogSW5zdHJ1Y3Rpb24oVHlwZTo6Z2V0Vm9pZFR5KHZhbC0+Z2V0Q29udGV4dCgpKSwgU3RvcmUsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxTdG9yZUluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPFN0b3JlSW5zdD46Om9wZXJhbmRzKHRoaXMpLAorICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZSkgeworICBPcDwwPigpID0gdmFsOworICBPcDwxPigpID0gYWRkcjsKKyAgc2V0Vm9sYXRpbGUoZmFsc2UpOworICBzZXRBbGlnbm1lbnQoMCk7CisgIEFzc2VydE9LKCk7Cit9CisKK1N0b3JlSW5zdDo6U3RvcmVJbnN0KFZhbHVlICp2YWwsIFZhbHVlICphZGRyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgOiBJbnN0cnVjdGlvbihUeXBlOjpnZXRWb2lkVHkodmFsLT5nZXRDb250ZXh0KCkpLCBTdG9yZSwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPFN0b3JlSW5zdD46Om9wX2JlZ2luKHRoaXMpLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8U3RvcmVJbnN0Pjo6b3BlcmFuZHModGhpcyksCisgICAgICAgICAgICAgICAgSW5zZXJ0QXRFbmQpIHsKKyAgT3A8MD4oKSA9IHZhbDsKKyAgT3A8MT4oKSA9IGFkZHI7CisgIHNldFZvbGF0aWxlKGZhbHNlKTsKKyAgc2V0QWxpZ25tZW50KDApOworICBBc3NlcnRPSygpOworfQorCitTdG9yZUluc3Q6OlN0b3JlSW5zdChWYWx1ZSAqdmFsLCBWYWx1ZSAqYWRkciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgOiBJbnN0cnVjdGlvbihUeXBlOjpnZXRWb2lkVHkodmFsLT5nZXRDb250ZXh0KCkpLCBTdG9yZSwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPFN0b3JlSW5zdD46Om9wX2JlZ2luKHRoaXMpLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8U3RvcmVJbnN0Pjo6b3BlcmFuZHModGhpcyksCisgICAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKSB7CisgIE9wPDA+KCkgPSB2YWw7CisgIE9wPDE+KCkgPSBhZGRyOworICBzZXRWb2xhdGlsZShpc1ZvbGF0aWxlKTsKKyAgc2V0QWxpZ25tZW50KDApOworICBBc3NlcnRPSygpOworfQorCitTdG9yZUluc3Q6OlN0b3JlSW5zdChWYWx1ZSAqdmFsLCBWYWx1ZSAqYWRkciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgIDogSW5zdHJ1Y3Rpb24oVHlwZTo6Z2V0Vm9pZFR5KHZhbC0+Z2V0Q29udGV4dCgpKSwgU3RvcmUsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxTdG9yZUluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPFN0b3JlSW5zdD46Om9wZXJhbmRzKHRoaXMpLAorICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZSkgeworICBPcDwwPigpID0gdmFsOworICBPcDwxPigpID0gYWRkcjsKKyAgc2V0Vm9sYXRpbGUoaXNWb2xhdGlsZSk7CisgIHNldEFsaWdubWVudChBbGlnbik7CisgIEFzc2VydE9LKCk7Cit9CisKK1N0b3JlSW5zdDo6U3RvcmVJbnN0KFZhbHVlICp2YWwsIFZhbHVlICphZGRyLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgIDogSW5zdHJ1Y3Rpb24oVHlwZTo6Z2V0Vm9pZFR5KHZhbC0+Z2V0Q29udGV4dCgpKSwgU3RvcmUsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxTdG9yZUluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPFN0b3JlSW5zdD46Om9wZXJhbmRzKHRoaXMpLAorICAgICAgICAgICAgICAgIEluc2VydEF0RW5kKSB7CisgIE9wPDA+KCkgPSB2YWw7CisgIE9wPDE+KCkgPSBhZGRyOworICBzZXRWb2xhdGlsZShpc1ZvbGF0aWxlKTsKKyAgc2V0QWxpZ25tZW50KEFsaWduKTsKKyAgQXNzZXJ0T0soKTsKK30KKworU3RvcmVJbnN0OjpTdG9yZUluc3QoVmFsdWUgKnZhbCwgVmFsdWUgKmFkZHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IEluc3RydWN0aW9uKFR5cGU6OmdldFZvaWRUeSh2YWwtPmdldENvbnRleHQoKSksIFN0b3JlLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8U3RvcmVJbnN0Pjo6b3BfYmVnaW4odGhpcyksCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxTdG9yZUluc3Q+OjpvcGVyYW5kcyh0aGlzKSwKKyAgICAgICAgICAgICAgICBJbnNlcnRBdEVuZCkgeworICBPcDwwPigpID0gdmFsOworICBPcDwxPigpID0gYWRkcjsKKyAgc2V0Vm9sYXRpbGUoaXNWb2xhdGlsZSk7CisgIHNldEFsaWdubWVudCgwKTsKKyAgQXNzZXJ0T0soKTsKK30KKwordm9pZCBTdG9yZUluc3Q6OnNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeworICBhc3NlcnQoKEFsaWduICYgKEFsaWduLTEpKSA9PSAwICYmICJBbGlnbm1lbnQgaXMgbm90IGEgcG93ZXIgb2YgMiEiKTsKKyAgYXNzZXJ0KEFsaWduIDw9IE1heGltdW1BbGlnbm1lbnQgJiYKKyAgICAgICAgICJBbGlnbm1lbnQgaXMgZ3JlYXRlciB0aGFuIE1heGltdW1BbGlnbm1lbnQhIik7CisgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMb2cyXzMyKEFsaWduKSsxKSA8PCAxKSk7CisgIGFzc2VydChnZXRBbGlnbm1lbnQoKSA9PSBBbGlnbiAmJiAiQWxpZ25tZW50IHJlcHJlc2VudGF0aW9uIGVycm9yISIpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgIEdldEVsZW1lbnRQdHJJbnN0IEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitzdGF0aWMgdW5zaWduZWQgcmV0cmlldmVBZGRyU3BhY2UoY29uc3QgVmFsdWUgKlZhbCkgeworICByZXR1cm4gY2FzdDxQb2ludGVyVHlwZT4oVmFsLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKK30KKwordm9pZCBHZXRFbGVtZW50UHRySW5zdDo6aW5pdChWYWx1ZSAqUHRyLCBWYWx1ZSogY29uc3QgKklkeCwgdW5zaWduZWQgTnVtSWR4KSB7CisgIGFzc2VydChOdW1PcGVyYW5kcyA9PSAxK051bUlkeCAmJiAiTnVtT3BlcmFuZHMgbm90IGluaXRpYWxpemVkPyIpOworICBVc2UgKk9MID0gT3BlcmFuZExpc3Q7CisgIE9MWzBdID0gUHRyOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtSWR4OyArK2kpCisgICAgT0xbaSsxXSA9IElkeFtpXTsKK30KKwordm9pZCBHZXRFbGVtZW50UHRySW5zdDo6aW5pdChWYWx1ZSAqUHRyLCBWYWx1ZSAqSWR4KSB7CisgIGFzc2VydChOdW1PcGVyYW5kcyA9PSAyICYmICJOdW1PcGVyYW5kcyBub3QgaW5pdGlhbGl6ZWQ/Iik7CisgIFVzZSAqT0wgPSBPcGVyYW5kTGlzdDsKKyAgT0xbMF0gPSBQdHI7CisgIE9MWzFdID0gSWR4OworfQorCitHZXRFbGVtZW50UHRySW5zdDo6R2V0RWxlbWVudFB0ckluc3QoY29uc3QgR2V0RWxlbWVudFB0ckluc3QgJkdFUEkpCisgIDogSW5zdHJ1Y3Rpb24oR0VQSS5nZXRUeXBlKCksIEdldEVsZW1lbnRQdHIsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxHZXRFbGVtZW50UHRySW5zdD46Om9wX2VuZCh0aGlzKQorICAgICAgICAgICAgICAgIC0gR0VQSS5nZXROdW1PcGVyYW5kcygpLAorICAgICAgICAgICAgICAgIEdFUEkuZ2V0TnVtT3BlcmFuZHMoKSkgeworICBVc2UgKk9MID0gT3BlcmFuZExpc3Q7CisgIFVzZSAqR0VQSU9MID0gR0VQSS5PcGVyYW5kTGlzdDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgRSA9IE51bU9wZXJhbmRzOyBpICE9IEU7ICsraSkKKyAgICBPTFtpXSA9IEdFUElPTFtpXTsKKyAgU3ViY2xhc3NPcHRpb25hbERhdGEgPSBHRVBJLlN1YmNsYXNzT3B0aW9uYWxEYXRhOworfQorCitHZXRFbGVtZW50UHRySW5zdDo6R2V0RWxlbWVudFB0ckluc3QoVmFsdWUgKlB0ciwgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbkJlKQorICA6IEluc3RydWN0aW9uKFBvaW50ZXJUeXBlOjpnZXQoCisgICAgICBjaGVja1R5cGUoZ2V0SW5kZXhlZFR5cGUoUHRyLT5nZXRUeXBlKCksSWR4KSksIHJldHJpZXZlQWRkclNwYWNlKFB0cikpLAorICAgICAgICAgICAgICAgIEdldEVsZW1lbnRQdHIsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxHZXRFbGVtZW50UHRySW5zdD46Om9wX2VuZCh0aGlzKSAtIDIsCisgICAgICAgICAgICAgICAgMiwgSW5CZSkgeworICBpbml0KFB0ciwgSWR4KTsKK30KKworR2V0RWxlbWVudFB0ckluc3Q6OkdldEVsZW1lbnRQdHJJbnN0KFZhbHVlICpQdHIsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSUFFKQorICA6IEluc3RydWN0aW9uKFBvaW50ZXJUeXBlOjpnZXQoCisgICAgICAgICAgICBjaGVja1R5cGUoZ2V0SW5kZXhlZFR5cGUoUHRyLT5nZXRUeXBlKCksSWR4KSksICAKKyAgICAgICAgICAgICAgICByZXRyaWV2ZUFkZHJTcGFjZShQdHIpKSwKKyAgICAgICAgICAgICAgICBHZXRFbGVtZW50UHRyLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8R2V0RWxlbWVudFB0ckluc3Q+OjpvcF9lbmQodGhpcykgLSAyLAorICAgICAgICAgICAgICAgIDIsIElBRSkgeworICBpbml0KFB0ciwgSWR4KTsKK30KKworLy8vIGdldEluZGV4ZWRUeXBlIC0gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIGFjY2Vzc2VkIHdpdGgKKy8vLyBhIGdlcCBpbnN0cnVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKy8vLworLy8vIFRoZSBJZHhzIHBvaW50ZXIgc2hvdWxkIHBvaW50IHRvIGEgY29udGludW91cyBwaWVjZSBvZiBtZW1vcnkgY29udGFpbmluZyB0aGUKKy8vLyBpbmRpY2VzLCBlaXRoZXIgYXMgVmFsdWUqIG9yIHVpbnQ2NF90LgorLy8vCisvLy8gQSBudWxsIHR5cGUgaXMgcmV0dXJuZWQgaWYgdGhlIGluZGljZXMgYXJlIGludmFsaWQgZm9yIHRoZSBzcGVjaWZpZWQKKy8vLyBwb2ludGVyIHR5cGUuCisvLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5Pgorc3RhdGljIGNvbnN0IFR5cGUqIGdldEluZGV4ZWRUeXBlSW50ZXJuYWwoY29uc3QgVHlwZSAqUHRyLCBJbmRleFR5IGNvbnN0ICpJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4KSB7CisgIGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oUHRyKTsKKyAgaWYgKCFQVHkpIHJldHVybiAwOyAgIC8vIFR5cGUgaXNuJ3QgYSBwb2ludGVyIHR5cGUhCisgIGNvbnN0IFR5cGUgKkFnZyA9IFBUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKworICAvLyBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgZW1wdHkgc2V0IGluZGV4IHNldCwgd2hpY2ggaXMgYWx3YXlzIHZhbGlkLgorICBpZiAoTnVtSWR4ID09IDApCisgICAgcmV0dXJuIEFnZzsKKyAgCisgIC8vIElmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpbmRleCwgdGhlIHRvcCBsZXZlbCB0eXBlIG11c3QgYmUgc2l6ZWQsIG90aGVyd2lzZQorICAvLyBpdCBjYW5ub3QgYmUgJ3N0ZXBwZWQgb3ZlcicuICBXZSBleHBsaWNpdGx5IGFsbG93IGFic3RyYWN0IHR5cGVzICh0aG9zZQorICAvLyB0aGF0IGNvbnRhaW4gb3BhcXVlIHR5cGVzKSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IHdpbGwgYmUgcmVzb2x2ZWQgdG8KKyAgLy8gYSBzYW5lIHR5cGUgbGF0ZXIuCisgIGlmICghQWdnLT5pc1NpemVkKCkgJiYgIUFnZy0+aXNBYnN0cmFjdCgpKQorICAgIHJldHVybiAwOworCisgIHVuc2lnbmVkIEN1cklkeCA9IDE7CisgIGZvciAoOyBDdXJJZHggIT0gTnVtSWR4OyArK0N1cklkeCkgeworICAgIGNvbnN0IENvbXBvc2l0ZVR5cGUgKkNUID0gZHluX2Nhc3Q8Q29tcG9zaXRlVHlwZT4oQWdnKTsKKyAgICBpZiAoIUNUIHx8IENULT5pc1BvaW50ZXJUeSgpKSByZXR1cm4gMDsKKyAgICBJbmRleFR5IEluZGV4ID0gSWR4c1tDdXJJZHhdOworICAgIGlmICghQ1QtPmluZGV4VmFsaWQoSW5kZXgpKSByZXR1cm4gMDsKKyAgICBBZ2cgPSBDVC0+Z2V0VHlwZUF0SW5kZXgoSW5kZXgpOworCisgICAgLy8gSWYgdGhlIG5ldyB0eXBlIGZvcndhcmRzIHRvIGFub3RoZXIgdHlwZSwgdGhlbiBpdCBpcyBpbiB0aGUgbWlkZGxlCisgICAgLy8gb2YgYmVpbmcgcmVmaW5lZCB0byBhbm90aGVyIHR5cGUgKGFuZCBoZW5jZSwgbWF5IGhhdmUgZHJvcHBlZCBhbGwKKyAgICAvLyByZWZlcmVuY2VzIHRvIHdoYXQgaXQgd2FzIHVzaW5nIGJlZm9yZSkuICBTbywgdXNlIHRoZSBuZXcgZm9yd2FyZGVkCisgICAgLy8gdHlwZS4KKyAgICBpZiAoY29uc3QgVHlwZSAqVHkgPSBBZ2ctPmdldEZvcndhcmRlZFR5cGUoKSkKKyAgICAgIEFnZyA9IFR5OworICB9CisgIHJldHVybiBDdXJJZHggPT0gTnVtSWR4ID8gQWdnIDogMDsKK30KKworY29uc3QgVHlwZSogR2V0RWxlbWVudFB0ckluc3Q6OmdldEluZGV4ZWRUeXBlKGNvbnN0IFR5cGUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSogY29uc3QgKklkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSWR4KSB7CisgIHJldHVybiBnZXRJbmRleGVkVHlwZUludGVybmFsKFB0ciwgSWR4cywgTnVtSWR4KTsKK30KKworY29uc3QgVHlwZSogR2V0RWxlbWVudFB0ckluc3Q6OmdldEluZGV4ZWRUeXBlKGNvbnN0IFR5cGUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb25zdCAqSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpIHsKKyAgcmV0dXJuIGdldEluZGV4ZWRUeXBlSW50ZXJuYWwoUHRyLCBJZHhzLCBOdW1JZHgpOworfQorCitjb25zdCBUeXBlKiBHZXRFbGVtZW50UHRySW5zdDo6Z2V0SW5kZXhlZFR5cGUoY29uc3QgVHlwZSAqUHRyLCBWYWx1ZSAqSWR4KSB7CisgIGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oUHRyKTsKKyAgaWYgKCFQVHkpIHJldHVybiAwOyAgIC8vIFR5cGUgaXNuJ3QgYSBwb2ludGVyIHR5cGUhCisKKyAgLy8gQ2hlY2sgdGhlIHBvaW50ZXIgaW5kZXguCisgIGlmICghUFR5LT5pbmRleFZhbGlkKElkeCkpIHJldHVybiAwOworCisgIHJldHVybiBQVHktPmdldEVsZW1lbnRUeXBlKCk7Cit9CisKKworLy8vIGhhc0FsbFplcm9JbmRpY2VzIC0gUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpY2VzIG9mIHRoaXMgR0VQIGFyZQorLy8vIHplcm9zLiAgSWYgc28sIHRoZSByZXN1bHQgcG9pbnRlciBhbmQgdGhlIGZpcnN0IG9wZXJhbmQgaGF2ZSB0aGUgc2FtZQorLy8vIHZhbHVlLCBqdXN0IHBvdGVudGlhbGx5IGRpZmZlcmVudCB0eXBlcy4KK2Jvb2wgR2V0RWxlbWVudFB0ckluc3Q6Omhhc0FsbFplcm9JbmRpY2VzKCkgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KGdldE9wZXJhbmQoaSkpKSB7CisgICAgICBpZiAoIUNJLT5pc1plcm8oKSkgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvLy8gaGFzQWxsQ29uc3RhbnRJbmRpY2VzIC0gUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpY2VzIG9mIHRoaXMgR0VQIGFyZQorLy8vIGNvbnN0YW50IGludGVnZXJzLiAgSWYgc28sIHRoZSByZXN1bHQgcG9pbnRlciBhbmQgdGhlIGZpcnN0IG9wZXJhbmQgaGF2ZQorLy8vIGEgY29uc3RhbnQgb2Zmc2V0IGJldHdlZW4gdGhlbS4KK2Jvb2wgR2V0RWxlbWVudFB0ckluc3Q6Omhhc0FsbENvbnN0YW50SW5kaWNlcygpIGNvbnN0IHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKCFpc2E8Q29uc3RhbnRJbnQ+KGdldE9wZXJhbmQoaSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdldEVsZW1lbnRQdHJJbnN0OjpzZXRJc0luQm91bmRzKGJvb2wgQikgeworICBjYXN0PEdFUE9wZXJhdG9yPih0aGlzKS0+c2V0SXNJbkJvdW5kcyhCKTsKK30KKworYm9vbCBHZXRFbGVtZW50UHRySW5zdDo6aXNJbkJvdW5kcygpIGNvbnN0IHsKKyAgcmV0dXJuIGNhc3Q8R0VQT3BlcmF0b3I+KHRoaXMpLT5pc0luQm91bmRzKCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RFbGVtZW50SW5zdCBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworRXh0cmFjdEVsZW1lbnRJbnN0OjpFeHRyYWN0RWxlbWVudEluc3QoVmFsdWUgKlZhbCwgVmFsdWUgKkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZikKKyAgOiBJbnN0cnVjdGlvbihjYXN0PFZlY3RvclR5cGU+KFZhbC0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICBFeHRyYWN0RWxlbWVudCwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPEV4dHJhY3RFbGVtZW50SW5zdD46Om9wX2JlZ2luKHRoaXMpLAorICAgICAgICAgICAgICAgIDIsIEluc2VydEJlZikgeworICBhc3NlcnQoaXNWYWxpZE9wZXJhbmRzKFZhbCwgSW5kZXgpICYmCisgICAgICAgICAiSW52YWxpZCBleHRyYWN0ZWxlbWVudCBpbnN0cnVjdGlvbiBvcGVyYW5kcyEiKTsKKyAgT3A8MD4oKSA9IFZhbDsKKyAgT3A8MT4oKSA9IEluZGV4OworfQorCitFeHRyYWN0RWxlbWVudEluc3Q6OkV4dHJhY3RFbGVtZW50SW5zdChWYWx1ZSAqVmFsLCBWYWx1ZSAqSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBRSkKKyAgOiBJbnN0cnVjdGlvbihjYXN0PFZlY3RvclR5cGU+KFZhbC0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICBFeHRyYWN0RWxlbWVudCwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPEV4dHJhY3RFbGVtZW50SW5zdD46Om9wX2JlZ2luKHRoaXMpLAorICAgICAgICAgICAgICAgIDIsIEluc2VydEFFKSB7CisgIGFzc2VydChpc1ZhbGlkT3BlcmFuZHMoVmFsLCBJbmRleCkgJiYKKyAgICAgICAgICJJbnZhbGlkIGV4dHJhY3RlbGVtZW50IGluc3RydWN0aW9uIG9wZXJhbmRzISIpOworCisgIE9wPDA+KCkgPSBWYWw7CisgIE9wPDE+KCkgPSBJbmRleDsKK30KKworCitib29sIEV4dHJhY3RFbGVtZW50SW5zdDo6aXNWYWxpZE9wZXJhbmRzKGNvbnN0IFZhbHVlICpWYWwsIGNvbnN0IFZhbHVlICpJbmRleCkgeworICBpZiAoIVZhbC0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkgfHwgIUluZGV4LT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDMyKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydEVsZW1lbnRJbnN0IEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitJbnNlcnRFbGVtZW50SW5zdDo6SW5zZXJ0RWxlbWVudEluc3QoVmFsdWUgKlZlYywgVmFsdWUgKkVsdCwgVmFsdWUgKkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWYpCisgIDogSW5zdHJ1Y3Rpb24oVmVjLT5nZXRUeXBlKCksIEluc2VydEVsZW1lbnQsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxJbnNlcnRFbGVtZW50SW5zdD46Om9wX2JlZ2luKHRoaXMpLAorICAgICAgICAgICAgICAgIDMsIEluc2VydEJlZikgeworICBhc3NlcnQoaXNWYWxpZE9wZXJhbmRzKFZlYywgRWx0LCBJbmRleCkgJiYKKyAgICAgICAgICJJbnZhbGlkIGluc2VydGVsZW1lbnQgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMhIik7CisgIE9wPDA+KCkgPSBWZWM7CisgIE9wPDE+KCkgPSBFbHQ7CisgIE9wPDI+KCkgPSBJbmRleDsKK30KKworSW5zZXJ0RWxlbWVudEluc3Q6Okluc2VydEVsZW1lbnRJbnN0KFZhbHVlICpWZWMsIFZhbHVlICpFbHQsIFZhbHVlICpJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBRSkKKyAgOiBJbnN0cnVjdGlvbihWZWMtPmdldFR5cGUoKSwgSW5zZXJ0RWxlbWVudCwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPEluc2VydEVsZW1lbnRJbnN0Pjo6b3BfYmVnaW4odGhpcyksCisgICAgICAgICAgICAgICAgMywgSW5zZXJ0QUUpIHsKKyAgYXNzZXJ0KGlzVmFsaWRPcGVyYW5kcyhWZWMsIEVsdCwgSW5kZXgpICYmCisgICAgICAgICAiSW52YWxpZCBpbnNlcnRlbGVtZW50IGluc3RydWN0aW9uIG9wZXJhbmRzISIpOworCisgIE9wPDA+KCkgPSBWZWM7CisgIE9wPDE+KCkgPSBFbHQ7CisgIE9wPDI+KCkgPSBJbmRleDsKK30KKworYm9vbCBJbnNlcnRFbGVtZW50SW5zdDo6aXNWYWxpZE9wZXJhbmRzKGNvbnN0IFZhbHVlICpWZWMsIGNvbnN0IFZhbHVlICpFbHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpJbmRleCkgeworICBpZiAoIVZlYy0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpCisgICAgcmV0dXJuIGZhbHNlOyAgIC8vIEZpcnN0IG9wZXJhbmQgb2YgaW5zZXJ0ZWxlbWVudCBtdXN0IGJlIHZlY3RvciB0eXBlLgorICAKKyAgaWYgKEVsdC0+Z2V0VHlwZSgpICE9IGNhc3Q8VmVjdG9yVHlwZT4oVmVjLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKQorICAgIHJldHVybiBmYWxzZTsvLyBTZWNvbmQgb3BlcmFuZCBvZiBpbnNlcnRlbGVtZW50IG11c3QgYmUgdmVjdG9yIGVsZW1lbnQgdHlwZS4KKyAgICAKKyAgaWYgKCFJbmRleC0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgzMikpCisgICAgcmV0dXJuIGZhbHNlOyAgLy8gVGhpcmQgb3BlcmFuZCBvZiBpbnNlcnRlbGVtZW50IG11c3QgYmUgaTMyLgorICByZXR1cm4gdHJ1ZTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgU2h1ZmZsZVZlY3Rvckluc3QgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1NodWZmbGVWZWN0b3JJbnN0OjpTaHVmZmxlVmVjdG9ySW5zdChWYWx1ZSAqVjEsIFZhbHVlICpWMiwgVmFsdWUgKk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKzogSW5zdHJ1Y3Rpb24oVmVjdG9yVHlwZTo6Z2V0KGNhc3Q8VmVjdG9yVHlwZT4oVjEtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgY2FzdDxWZWN0b3JUeXBlPihNYXNrLT5nZXRUeXBlKCkpLT5nZXROdW1FbGVtZW50cygpKSwKKyAgICAgICAgICAgICAgU2h1ZmZsZVZlY3RvciwKKyAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxTaHVmZmxlVmVjdG9ySW5zdD46Om9wX2JlZ2luKHRoaXMpLAorICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPFNodWZmbGVWZWN0b3JJbnN0Pjo6b3BlcmFuZHModGhpcyksCisgICAgICAgICAgICAgIEluc2VydEJlZm9yZSkgeworICBhc3NlcnQoaXNWYWxpZE9wZXJhbmRzKFYxLCBWMiwgTWFzaykgJiYKKyAgICAgICAgICJJbnZhbGlkIHNodWZmbGUgdmVjdG9yIGluc3RydWN0aW9uIG9wZXJhbmRzISIpOworICBPcDwwPigpID0gVjE7CisgIE9wPDE+KCkgPSBWMjsKKyAgT3A8Mj4oKSA9IE1hc2s7Cit9CisKK1NodWZmbGVWZWN0b3JJbnN0OjpTaHVmZmxlVmVjdG9ySW5zdChWYWx1ZSAqVjEsIFZhbHVlICpWMiwgVmFsdWUgKk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCis6IEluc3RydWN0aW9uKFZlY3RvclR5cGU6OmdldChjYXN0PFZlY3RvclR5cGU+KFYxLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oTWFzay0+Z2V0VHlwZSgpKS0+Z2V0TnVtRWxlbWVudHMoKSksCisgICAgICAgICAgICAgIFNodWZmbGVWZWN0b3IsCisgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8U2h1ZmZsZVZlY3Rvckluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxTaHVmZmxlVmVjdG9ySW5zdD46Om9wZXJhbmRzKHRoaXMpLAorICAgICAgICAgICAgICBJbnNlcnRBdEVuZCkgeworICBhc3NlcnQoaXNWYWxpZE9wZXJhbmRzKFYxLCBWMiwgTWFzaykgJiYKKyAgICAgICAgICJJbnZhbGlkIHNodWZmbGUgdmVjdG9yIGluc3RydWN0aW9uIG9wZXJhbmRzISIpOworCisgIE9wPDA+KCkgPSBWMTsKKyAgT3A8MT4oKSA9IFYyOworICBPcDwyPigpID0gTWFzazsKK30KKworYm9vbCBTaHVmZmxlVmVjdG9ySW5zdDo6aXNWYWxpZE9wZXJhbmRzKGNvbnN0IFZhbHVlICpWMSwgY29uc3QgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpNYXNrKSB7CisgIGlmICghVjEtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpIHx8IFYxLT5nZXRUeXBlKCkgIT0gVjItPmdldFR5cGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBjb25zdCBWZWN0b3JUeXBlICpNYXNrVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihNYXNrLT5nZXRUeXBlKCkpOworICBpZiAoIWlzYTxDb25zdGFudD4oTWFzaykgfHwgTWFza1R5ID09IDAgfHwKKyAgICAgICFNYXNrVHktPmdldEVsZW1lbnRUeXBlKCktPmlzSW50ZWdlclR5KDMyKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gZ2V0TWFza1ZhbHVlIC0gUmV0dXJuIHRoZSBpbmRleCBmcm9tIHRoZSBzaHVmZmxlIG1hc2sgZm9yIHRoZSBzcGVjaWZpZWQKKy8vLyBvdXRwdXQgcmVzdWx0LiAgVGhpcyBpcyBlaXRoZXIgLTEgaWYgdGhlIGVsZW1lbnQgaXMgdW5kZWYgb3IgYSBudW1iZXIgbGVzcworLy8vIHRoYW4gMipudW1lbGVtZW50cy4KK2ludCBTaHVmZmxlVmVjdG9ySW5zdDo6Z2V0TWFza1ZhbHVlKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgY29uc3QgQ29uc3RhbnQgKk1hc2sgPSBjYXN0PENvbnN0YW50PihnZXRPcGVyYW5kKDIpKTsKKyAgaWYgKGlzYTxVbmRlZlZhbHVlPihNYXNrKSkgcmV0dXJuIC0xOworICBpZiAoaXNhPENvbnN0YW50QWdncmVnYXRlWmVybz4oTWFzaykpIHJldHVybiAwOworICBjb25zdCBDb25zdGFudFZlY3RvciAqTWFza0NWID0gY2FzdDxDb25zdGFudFZlY3Rvcj4oTWFzayk7CisgIGFzc2VydChpIDwgTWFza0NWLT5nZXROdW1PcGVyYW5kcygpICYmICJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKKworICBpZiAoaXNhPFVuZGVmVmFsdWU+KE1hc2tDVi0+Z2V0T3BlcmFuZChpKSkpCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oTWFza0NWLT5nZXRPcGVyYW5kKGkpKS0+Z2V0WkV4dFZhbHVlKCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0VmFsdWVJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIEluc2VydFZhbHVlSW5zdDo6aW5pdChWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLCBjb25zdCB1bnNpZ25lZCAqSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCkgeworICBhc3NlcnQoTnVtT3BlcmFuZHMgPT0gMiAmJiAiTnVtT3BlcmFuZHMgbm90IGluaXRpYWxpemVkPyIpOworICBPcDwwPigpID0gQWdnOworICBPcDwxPigpID0gVmFsOworCisgIEluZGljZXMuYXBwZW5kKElkeCwgSWR4ICsgTnVtSWR4KTsKK30KKwordm9pZCBJbnNlcnRWYWx1ZUluc3Q6OmluaXQoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwgdW5zaWduZWQgSWR4KSB7CisgIGFzc2VydChOdW1PcGVyYW5kcyA9PSAyICYmICJOdW1PcGVyYW5kcyBub3QgaW5pdGlhbGl6ZWQ/Iik7CisgIE9wPDA+KCkgPSBBZ2c7CisgIE9wPDE+KCkgPSBWYWw7CisKKyAgSW5kaWNlcy5wdXNoX2JhY2soSWR4KTsKK30KKworSW5zZXJ0VmFsdWVJbnN0OjpJbnNlcnRWYWx1ZUluc3QoY29uc3QgSW5zZXJ0VmFsdWVJbnN0ICZJVkkpCisgIDogSW5zdHJ1Y3Rpb24oSVZJLmdldFR5cGUoKSwgSW5zZXJ0VmFsdWUsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxJbnNlcnRWYWx1ZUluc3Q+OjpvcF9iZWdpbih0aGlzKSwgMiksCisgICAgSW5kaWNlcyhJVkkuSW5kaWNlcykgeworICBPcDwwPigpID0gSVZJLmdldE9wZXJhbmQoMCk7CisgIE9wPDE+KCkgPSBJVkkuZ2V0T3BlcmFuZCgxKTsKKyAgU3ViY2xhc3NPcHRpb25hbERhdGEgPSBJVkkuU3ViY2xhc3NPcHRpb25hbERhdGE7Cit9CisKK0luc2VydFZhbHVlSW5zdDo6SW5zZXJ0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgOiBJbnN0cnVjdGlvbihBZ2ctPmdldFR5cGUoKSwgSW5zZXJ0VmFsdWUsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxJbnNlcnRWYWx1ZUluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICAyLCBJbnNlcnRCZWZvcmUpIHsKKyAgaW5pdChBZ2csIFZhbCwgSWR4KTsKK30KKworSW5zZXJ0VmFsdWVJbnN0OjpJbnNlcnRWYWx1ZUluc3QoVmFsdWUgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgOiBJbnN0cnVjdGlvbihBZ2ctPmdldFR5cGUoKSwgSW5zZXJ0VmFsdWUsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxJbnNlcnRWYWx1ZUluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICAyLCBJbnNlcnRBdEVuZCkgeworICBpbml0KEFnZywgVmFsLCBJZHgpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RWYWx1ZUluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgRXh0cmFjdFZhbHVlSW5zdDo6aW5pdChjb25zdCB1bnNpZ25lZCAqSWR4LCB1bnNpZ25lZCBOdW1JZHgpIHsKKyAgYXNzZXJ0KE51bU9wZXJhbmRzID09IDEgJiYgIk51bU9wZXJhbmRzIG5vdCBpbml0aWFsaXplZD8iKTsKKworICBJbmRpY2VzLmFwcGVuZChJZHgsIElkeCArIE51bUlkeCk7Cit9CisKK3ZvaWQgRXh0cmFjdFZhbHVlSW5zdDo6aW5pdCh1bnNpZ25lZCBJZHgpIHsKKyAgYXNzZXJ0KE51bU9wZXJhbmRzID09IDEgJiYgIk51bU9wZXJhbmRzIG5vdCBpbml0aWFsaXplZD8iKTsKKworICBJbmRpY2VzLnB1c2hfYmFjayhJZHgpOworfQorCitFeHRyYWN0VmFsdWVJbnN0OjpFeHRyYWN0VmFsdWVJbnN0KGNvbnN0IEV4dHJhY3RWYWx1ZUluc3QgJkVWSSkKKyAgOiBVbmFyeUluc3RydWN0aW9uKEVWSS5nZXRUeXBlKCksIEV4dHJhY3RWYWx1ZSwgRVZJLmdldE9wZXJhbmQoMCkpLAorICAgIEluZGljZXMoRVZJLkluZGljZXMpIHsKKyAgU3ViY2xhc3NPcHRpb25hbERhdGEgPSBFVkkuU3ViY2xhc3NPcHRpb25hbERhdGE7Cit9CisKKy8vIGdldEluZGV4ZWRUeXBlIC0gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIGV4dHJhY3RlZAorLy8gd2l0aCBhbiBleHRyYWN0dmFsdWUgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisvLworLy8gQSBudWxsIHR5cGUgaXMgcmV0dXJuZWQgaWYgdGhlIGluZGljZXMgYXJlIGludmFsaWQgZm9yIHRoZSBzcGVjaWZpZWQKKy8vIHBvaW50ZXIgdHlwZS4KKy8vCitjb25zdCBUeXBlKiBFeHRyYWN0VmFsdWVJbnN0OjpnZXRJbmRleGVkVHlwZShjb25zdCBUeXBlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlkeCkgeworICB1bnNpZ25lZCBDdXJJZHggPSAwOworICBmb3IgKDsgQ3VySWR4ICE9IE51bUlkeDsgKytDdXJJZHgpIHsKKyAgICBjb25zdCBDb21wb3NpdGVUeXBlICpDVCA9IGR5bl9jYXN0PENvbXBvc2l0ZVR5cGU+KEFnZyk7CisgICAgaWYgKCFDVCB8fCBDVC0+aXNQb2ludGVyVHkoKSB8fCBDVC0+aXNWZWN0b3JUeSgpKSByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBJbmRleCA9IElkeHNbQ3VySWR4XTsKKyAgICBpZiAoIUNULT5pbmRleFZhbGlkKEluZGV4KSkgcmV0dXJuIDA7CisgICAgQWdnID0gQ1QtPmdldFR5cGVBdEluZGV4KEluZGV4KTsKKworICAgIC8vIElmIHRoZSBuZXcgdHlwZSBmb3J3YXJkcyB0byBhbm90aGVyIHR5cGUsIHRoZW4gaXQgaXMgaW4gdGhlIG1pZGRsZQorICAgIC8vIG9mIGJlaW5nIHJlZmluZWQgdG8gYW5vdGhlciB0eXBlIChhbmQgaGVuY2UsIG1heSBoYXZlIGRyb3BwZWQgYWxsCisgICAgLy8gcmVmZXJlbmNlcyB0byB3aGF0IGl0IHdhcyB1c2luZyBiZWZvcmUpLiAgU28sIHVzZSB0aGUgbmV3IGZvcndhcmRlZAorICAgIC8vIHR5cGUuCisgICAgaWYgKGNvbnN0IFR5cGUgKlR5ID0gQWdnLT5nZXRGb3J3YXJkZWRUeXBlKCkpCisgICAgICBBZ2cgPSBUeTsKKyAgfQorICByZXR1cm4gQ3VySWR4ID09IE51bUlkeCA/IEFnZyA6IDA7Cit9CisKK2NvbnN0IFR5cGUqIEV4dHJhY3RWYWx1ZUluc3Q6OmdldEluZGV4ZWRUeXBlKGNvbnN0IFR5cGUgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElkeCkgeworICByZXR1cm4gZ2V0SW5kZXhlZFR5cGUoQWdnLCAmSWR4LCAxKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvciBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworQmluYXJ5T3BlcmF0b3I6OkJpbmFyeU9wZXJhdG9yKEJpbmFyeU9wcyBpVHlwZSwgVmFsdWUgKlMxLCBWYWx1ZSAqUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgOiBJbnN0cnVjdGlvbihUeSwgaVR5cGUsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxCaW5hcnlPcGVyYXRvcj46Om9wX2JlZ2luKHRoaXMpLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8QmluYXJ5T3BlcmF0b3I+OjpvcGVyYW5kcyh0aGlzKSwKKyAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmUpIHsKKyAgT3A8MD4oKSA9IFMxOworICBPcDwxPigpID0gUzI7CisgIGluaXQoaVR5cGUpOworfQorCitCaW5hcnlPcGVyYXRvcjo6QmluYXJ5T3BlcmF0b3IoQmluYXJ5T3BzIGlUeXBlLCBWYWx1ZSAqUzEsIFZhbHVlICpTMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgIDogSW5zdHJ1Y3Rpb24oVHksIGlUeXBlLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8QmluYXJ5T3BlcmF0b3I+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPEJpbmFyeU9wZXJhdG9yPjo6b3BlcmFuZHModGhpcyksCisgICAgICAgICAgICAgICAgSW5zZXJ0QXRFbmQpIHsKKyAgT3A8MD4oKSA9IFMxOworICBPcDwxPigpID0gUzI7CisgIGluaXQoaVR5cGUpOworfQorCisKK3ZvaWQgQmluYXJ5T3BlcmF0b3I6OmluaXQoQmluYXJ5T3BzIGlUeXBlKSB7CisgIFZhbHVlICpMSFMgPSBnZXRPcGVyYW5kKDApLCAqUkhTID0gZ2V0T3BlcmFuZCgxKTsKKyAgTEhTID0gTEhTOyBSSFMgPSBSSFM7IC8vIFNpbGVuY2Ugd2FybmluZ3MuCisgIGFzc2VydChMSFMtPmdldFR5cGUoKSA9PSBSSFMtPmdldFR5cGUoKSAmJgorICAgICAgICAgIkJpbmFyeSBvcGVyYXRvciBvcGVyYW5kIHR5cGVzIG11c3QgbWF0Y2ghIik7CisjaWZuZGVmIE5ERUJVRworICBzd2l0Y2ggKGlUeXBlKSB7CisgIGNhc2UgQWRkOiBjYXNlIFN1YjoKKyAgY2FzZSBNdWw6CisgICAgYXNzZXJ0KGdldFR5cGUoKSA9PSBMSFMtPmdldFR5cGUoKSAmJgorICAgICAgICAgICAiQXJpdGhtZXRpYyBvcGVyYXRpb24gc2hvdWxkIHJldHVybiBzYW1lIHR5cGUgYXMgb3BlcmFuZHMhIik7CisgICAgYXNzZXJ0KGdldFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgIlRyaWVkIHRvIGNyZWF0ZSBhbiBpbnRlZ2VyIG9wZXJhdGlvbiBvbiBhIG5vbi1pbnRlZ2VyIHR5cGUhIik7CisgICAgYnJlYWs7CisgIGNhc2UgRkFkZDogY2FzZSBGU3ViOgorICBjYXNlIEZNdWw6CisgICAgYXNzZXJ0KGdldFR5cGUoKSA9PSBMSFMtPmdldFR5cGUoKSAmJgorICAgICAgICAgICAiQXJpdGhtZXRpYyBvcGVyYXRpb24gc2hvdWxkIHJldHVybiBzYW1lIHR5cGUgYXMgb3BlcmFuZHMhIik7CisgICAgYXNzZXJ0KGdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICAgICJUcmllZCB0byBjcmVhdGUgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gb24gYSAiCisgICAgICAgICAgICJub24tZmxvYXRpbmctcG9pbnQgdHlwZSEiKTsKKyAgICBicmVhazsKKyAgY2FzZSBVRGl2OiAKKyAgY2FzZSBTRGl2OiAKKyAgICBhc3NlcnQoZ2V0VHlwZSgpID09IExIUy0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICJBcml0aG1ldGljIG9wZXJhdGlvbiBzaG91bGQgcmV0dXJuIHNhbWUgdHlwZSBhcyBvcGVyYW5kcyEiKTsKKyAgICBhc3NlcnQoKGdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSB8fCAoZ2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkgJiYgCisgICAgICAgICAgICBjYXN0PFZlY3RvclR5cGU+KGdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCktPmlzSW50ZWdlclR5KCkpKSAmJgorICAgICAgICAgICAiSW5jb3JyZWN0IG9wZXJhbmQgdHlwZSAobm90IGludGVnZXIpIGZvciBTL1VESVYiKTsKKyAgICBicmVhazsKKyAgY2FzZSBGRGl2OgorICAgIGFzc2VydChnZXRUeXBlKCkgPT0gTEhTLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIkFyaXRobWV0aWMgb3BlcmF0aW9uIHNob3VsZCByZXR1cm4gc2FtZSB0eXBlIGFzIG9wZXJhbmRzISIpOworICAgIGFzc2VydChnZXRUeXBlKCktPmlzRlBPckZQVmVjdG9yVHkoKSAmJgorICAgICAgICAgICAiSW5jb3JyZWN0IG9wZXJhbmQgdHlwZSAobm90IGZsb2F0aW5nIHBvaW50KSBmb3IgRkRJViIpOworICAgIGJyZWFrOworICBjYXNlIFVSZW06IAorICBjYXNlIFNSZW06IAorICAgIGFzc2VydChnZXRUeXBlKCkgPT0gTEhTLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIkFyaXRobWV0aWMgb3BlcmF0aW9uIHNob3VsZCByZXR1cm4gc2FtZSB0eXBlIGFzIG9wZXJhbmRzISIpOworICAgIGFzc2VydCgoZ2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpIHx8IChnZXRUeXBlKCktPmlzVmVjdG9yVHkoKSAmJiAKKyAgICAgICAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oZ2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkpICYmCisgICAgICAgICAgICJJbmNvcnJlY3Qgb3BlcmFuZCB0eXBlIChub3QgaW50ZWdlcikgZm9yIFMvVVJFTSIpOworICAgIGJyZWFrOworICBjYXNlIEZSZW06CisgICAgYXNzZXJ0KGdldFR5cGUoKSA9PSBMSFMtPmdldFR5cGUoKSAmJgorICAgICAgICAgICAiQXJpdGhtZXRpYyBvcGVyYXRpb24gc2hvdWxkIHJldHVybiBzYW1lIHR5cGUgYXMgb3BlcmFuZHMhIik7CisgICAgYXNzZXJ0KGdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICAgICJJbmNvcnJlY3Qgb3BlcmFuZCB0eXBlIChub3QgZmxvYXRpbmcgcG9pbnQpIGZvciBGUkVNIik7CisgICAgYnJlYWs7CisgIGNhc2UgU2hsOgorICBjYXNlIExTaHI6CisgIGNhc2UgQVNocjoKKyAgICBhc3NlcnQoZ2V0VHlwZSgpID09IExIUy0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICJTaGlmdCBvcGVyYXRpb24gc2hvdWxkIHJldHVybiBzYW1lIHR5cGUgYXMgb3BlcmFuZHMhIik7CisgICAgYXNzZXJ0KChnZXRUeXBlKCktPmlzSW50ZWdlclR5KCkgfHwKKyAgICAgICAgICAgIChnZXRUeXBlKCktPmlzVmVjdG9yVHkoKSAmJiAKKyAgICAgICAgICAgICBjYXN0PFZlY3RvclR5cGU+KGdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCktPmlzSW50ZWdlclR5KCkpKSAmJgorICAgICAgICAgICAiVHJpZWQgdG8gY3JlYXRlIGEgc2hpZnQgb3BlcmF0aW9uIG9uIGEgbm9uLWludGVncmFsIHR5cGUhIik7CisgICAgYnJlYWs7CisgIGNhc2UgQW5kOiBjYXNlIE9yOgorICBjYXNlIFhvcjoKKyAgICBhc3NlcnQoZ2V0VHlwZSgpID09IExIUy0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICJMb2dpY2FsIG9wZXJhdGlvbiBzaG91bGQgcmV0dXJuIHNhbWUgdHlwZSBhcyBvcGVyYW5kcyEiKTsKKyAgICBhc3NlcnQoKGdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSB8fAorICAgICAgICAgICAgKGdldFR5cGUoKS0+aXNWZWN0b3JUeSgpICYmIAorICAgICAgICAgICAgIGNhc3Q8VmVjdG9yVHlwZT4oZ2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkpICYmCisgICAgICAgICAgICJUcmllZCB0byBjcmVhdGUgYSBsb2dpY2FsIG9wZXJhdGlvbiBvbiBhIG5vbi1pbnRlZ3JhbCB0eXBlISIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisjZW5kaWYKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoQmluYXJ5T3BzIE9wLCBWYWx1ZSAqUzEsIFZhbHVlICpTMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpIHsKKyAgYXNzZXJ0KFMxLT5nZXRUeXBlKCkgPT0gUzItPmdldFR5cGUoKSAmJgorICAgICAgICAgIkNhbm5vdCBjcmVhdGUgYmluYXJ5IG9wZXJhdG9yIHdpdGggdHdvIG9wZXJhbmRzIG9mIGRpZmZlcmluZyB0eXBlISIpOworICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yKE9wLCBTMSwgUzIsIFMxLT5nZXRUeXBlKCksIEluc2VydEJlZm9yZSk7Cit9CisKK0JpbmFyeU9wZXJhdG9yICpCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEJpbmFyeU9wcyBPcCwgVmFsdWUgKlMxLCBWYWx1ZSAqUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICBCaW5hcnlPcGVyYXRvciAqUmVzID0gQ3JlYXRlKE9wLCBTMSwgUzIpOworICBJbnNlcnRBdEVuZC0+Z2V0SW5zdExpc3QoKS5wdXNoX2JhY2soUmVzKTsKKyAgcmV0dXJuIFJlczsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkgeworICBWYWx1ZSAqemVybyA9IENvbnN0YW50RlA6OmdldFplcm9WYWx1ZUZvck5lZ2F0aW9uKE9wLT5nZXRUeXBlKCkpOworICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yKEluc3RydWN0aW9uOjpTdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybywgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AtPmdldFR5cGUoKSwgSW5zZXJ0QmVmb3JlKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgVmFsdWUgKnplcm8gPSBDb25zdGFudEZQOjpnZXRaZXJvVmFsdWVGb3JOZWdhdGlvbihPcC0+Z2V0VHlwZSgpKTsKKyAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvcihJbnN0cnVjdGlvbjo6U3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8sIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLT5nZXRUeXBlKCksIEluc2VydEF0RW5kKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOU1dOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkgeworICBWYWx1ZSAqemVybyA9IENvbnN0YW50RlA6OmdldFplcm9WYWx1ZUZvck5lZ2F0aW9uKE9wLT5nZXRUeXBlKCkpOworICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5TV1N1Yih6ZXJvLCBPcCwgSW5zZXJ0QmVmb3JlKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOU1dOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgVmFsdWUgKnplcm8gPSBDb25zdGFudEZQOjpnZXRaZXJvVmFsdWVGb3JOZWdhdGlvbihPcC0+Z2V0VHlwZSgpKTsKKyAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOU1dTdWIoemVybywgT3AsIEluc2VydEF0RW5kKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOVVdOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkgeworICBWYWx1ZSAqemVybyA9IENvbnN0YW50RlA6OmdldFplcm9WYWx1ZUZvck5lZ2F0aW9uKE9wLT5nZXRUeXBlKCkpOworICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5VV1N1Yih6ZXJvLCBPcCwgSW5zZXJ0QmVmb3JlKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOVVdOZWcoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgVmFsdWUgKnplcm8gPSBDb25zdGFudEZQOjpnZXRaZXJvVmFsdWVGb3JOZWdhdGlvbihPcC0+Z2V0VHlwZSgpKTsKKyAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOVVdTdWIoemVybywgT3AsIEluc2VydEF0RW5kKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGTmVnKFZhbHVlICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKSB7CisgIFZhbHVlICp6ZXJvID0gQ29uc3RhbnRGUDo6Z2V0WmVyb1ZhbHVlRm9yTmVnYXRpb24oT3AtPmdldFR5cGUoKSk7CisgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3IoSW5zdHJ1Y3Rpb246OkZTdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybywgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AtPmdldFR5cGUoKSwgSW5zZXJ0QmVmb3JlKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGTmVnKFZhbHVlICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICBWYWx1ZSAqemVybyA9IENvbnN0YW50RlA6OmdldFplcm9WYWx1ZUZvck5lZ2F0aW9uKE9wLT5nZXRUeXBlKCkpOworICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yKEluc3RydWN0aW9uOjpGU3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8sIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wLT5nZXRUeXBlKCksIEluc2VydEF0RW5kKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOb3QoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkgeworICBDb25zdGFudCAqQzsKKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlBUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KE9wLT5nZXRUeXBlKCkpKSB7CisgICAgQyA9IENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoUFR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICBDID0gQ29uc3RhbnRWZWN0b3I6OmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4oUFR5LT5nZXROdW1FbGVtZW50cygpLCBDKSk7CisgIH0gZWxzZSB7CisgICAgQyA9IENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoT3AtPmdldFR5cGUoKSk7CisgIH0KKyAgCisgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3IoSW5zdHJ1Y3Rpb246OlhvciwgT3AsIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AtPmdldFR5cGUoKSwgSW5zZXJ0QmVmb3JlKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOb3QoVmFsdWUgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgQ29uc3RhbnQgKkFsbE9uZXM7CisgIGlmIChjb25zdCBWZWN0b3JUeXBlICpQVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihPcC0+Z2V0VHlwZSgpKSkgeworICAgIC8vIENyZWF0ZSBhIHZlY3RvciBvZiBhbGwgb25lcyB2YWx1ZXMuCisgICAgQ29uc3RhbnQgKkVsdCA9IENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoUFR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICBBbGxPbmVzID0gQ29uc3RhbnRWZWN0b3I6OmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+KFBUeS0+Z2V0TnVtRWxlbWVudHMoKSwgRWx0KSk7CisgIH0gZWxzZSB7CisgICAgQWxsT25lcyA9IENvbnN0YW50OjpnZXRBbGxPbmVzVmFsdWUoT3AtPmdldFR5cGUoKSk7CisgIH0KKyAgCisgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3IoSW5zdHJ1Y3Rpb246OlhvciwgT3AsIEFsbE9uZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AtPmdldFR5cGUoKSwgSW5zZXJ0QXRFbmQpOworfQorCisKKy8vIGlzQ29uc3RhbnRBbGxPbmVzIC0gSGVscGVyIGZ1bmN0aW9uIGZvciBzZXZlcmFsIGZ1bmN0aW9ucyBiZWxvdworc3RhdGljIGlubGluZSBib29sIGlzQ29uc3RhbnRBbGxPbmVzKGNvbnN0IFZhbHVlICpWKSB7CisgIGlmIChjb25zdCBDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpCisgICAgcmV0dXJuIENJLT5pc0FsbE9uZXNWYWx1ZSgpOworICBpZiAoY29uc3QgQ29uc3RhbnRWZWN0b3IgKkNWID0gZHluX2Nhc3Q8Q29uc3RhbnRWZWN0b3I+KFYpKQorICAgIHJldHVybiBDVi0+aXNBbGxPbmVzVmFsdWUoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJpbmFyeU9wZXJhdG9yOjppc05lZyhjb25zdCBWYWx1ZSAqVikgeworICBpZiAoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkJvcCA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihWKSkKKyAgICBpZiAoQm9wLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U3ViKQorICAgICAgaWYgKENvbnN0YW50KiBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEJvcC0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICAgIHJldHVybiBDLT5pc05lZ2F0aXZlWmVyb1ZhbHVlKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCaW5hcnlPcGVyYXRvcjo6aXNGTmVnKGNvbnN0IFZhbHVlICpWKSB7CisgIGlmIChjb25zdCBCaW5hcnlPcGVyYXRvciAqQm9wID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KFYpKQorICAgIGlmIChCb3AtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpGU3ViKQorICAgICAgaWYgKENvbnN0YW50KiBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEJvcC0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICAgIHJldHVybiBDLT5pc05lZ2F0aXZlWmVyb1ZhbHVlKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCaW5hcnlPcGVyYXRvcjo6aXNOb3QoY29uc3QgVmFsdWUgKlYpIHsKKyAgaWYgKGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCb3AgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oVikpCisgICAgcmV0dXJuIChCb3AtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpYb3IgJiYKKyAgICAgICAgICAgIChpc0NvbnN0YW50QWxsT25lcyhCb3AtPmdldE9wZXJhbmQoMSkpIHx8CisgICAgICAgICAgICAgaXNDb25zdGFudEFsbE9uZXMoQm9wLT5nZXRPcGVyYW5kKDApKSkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK1ZhbHVlICpCaW5hcnlPcGVyYXRvcjo6Z2V0TmVnQXJndW1lbnQoVmFsdWUgKkJpbk9wKSB7CisgIHJldHVybiBjYXN0PEJpbmFyeU9wZXJhdG9yPihCaW5PcCktPmdldE9wZXJhbmQoMSk7Cit9CisKK2NvbnN0IFZhbHVlICpCaW5hcnlPcGVyYXRvcjo6Z2V0TmVnQXJndW1lbnQoY29uc3QgVmFsdWUgKkJpbk9wKSB7CisgIHJldHVybiBnZXROZWdBcmd1bWVudChjb25zdF9jYXN0PFZhbHVlKj4oQmluT3ApKTsKK30KKworVmFsdWUgKkJpbmFyeU9wZXJhdG9yOjpnZXRGTmVnQXJndW1lbnQoVmFsdWUgKkJpbk9wKSB7CisgIHJldHVybiBjYXN0PEJpbmFyeU9wZXJhdG9yPihCaW5PcCktPmdldE9wZXJhbmQoMSk7Cit9CisKK2NvbnN0IFZhbHVlICpCaW5hcnlPcGVyYXRvcjo6Z2V0Rk5lZ0FyZ3VtZW50KGNvbnN0IFZhbHVlICpCaW5PcCkgeworICByZXR1cm4gZ2V0Rk5lZ0FyZ3VtZW50KGNvbnN0X2Nhc3Q8VmFsdWUqPihCaW5PcCkpOworfQorCitWYWx1ZSAqQmluYXJ5T3BlcmF0b3I6OmdldE5vdEFyZ3VtZW50KFZhbHVlICpCaW5PcCkgeworICBhc3NlcnQoaXNOb3QoQmluT3ApICYmICJnZXROb3RBcmd1bWVudCBvbiBub24tJ25vdCcgaW5zdHJ1Y3Rpb24hIik7CisgIEJpbmFyeU9wZXJhdG9yICpCTyA9IGNhc3Q8QmluYXJ5T3BlcmF0b3I+KEJpbk9wKTsKKyAgVmFsdWUgKk9wMCA9IEJPLT5nZXRPcGVyYW5kKDApOworICBWYWx1ZSAqT3AxID0gQk8tPmdldE9wZXJhbmQoMSk7CisgIGlmIChpc0NvbnN0YW50QWxsT25lcyhPcDApKSByZXR1cm4gT3AxOworCisgIGFzc2VydChpc0NvbnN0YW50QWxsT25lcyhPcDEpKTsKKyAgcmV0dXJuIE9wMDsKK30KKworY29uc3QgVmFsdWUgKkJpbmFyeU9wZXJhdG9yOjpnZXROb3RBcmd1bWVudChjb25zdCBWYWx1ZSAqQmluT3ApIHsKKyAgcmV0dXJuIGdldE5vdEFyZ3VtZW50KGNvbnN0X2Nhc3Q8VmFsdWUqPihCaW5PcCkpOworfQorCisKKy8vIHN3YXBPcGVyYW5kcyAtIEV4Y2hhbmdlIHRoZSB0d28gb3BlcmFuZHMgdG8gdGhpcyBpbnN0cnVjdGlvbi4gIFRoaXMKKy8vIGluc3RydWN0aW9uIGlzIHNhZmUgdG8gdXNlIG9uIGFueSBiaW5hcnkgaW5zdHJ1Y3Rpb24gYW5kIGRvZXMgbm90CisvLyBtb2RpZnkgdGhlIHNlbWFudGljcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMKKy8vIG9yZGVyIGRlcGVuZGVudCAoU2V0TFQgZi5lLikgdGhlIG9wY29kZSBpcyBjaGFuZ2VkLgorLy8KK2Jvb2wgQmluYXJ5T3BlcmF0b3I6OnN3YXBPcGVyYW5kcygpIHsKKyAgaWYgKCFpc0NvbW11dGF0aXZlKCkpCisgICAgcmV0dXJuIHRydWU7IC8vIENhbid0IGNvbW11dGUgb3BlcmFuZHMKKyAgT3A8MD4oKS5zd2FwKE9wPDE+KCkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQmluYXJ5T3BlcmF0b3I6OnNldEhhc05vVW5zaWduZWRXcmFwKGJvb2wgYikgeworICBjYXN0PE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I+KHRoaXMpLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcChiKTsKK30KKwordm9pZCBCaW5hcnlPcGVyYXRvcjo6c2V0SGFzTm9TaWduZWRXcmFwKGJvb2wgYikgeworICBjYXN0PE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I+KHRoaXMpLT5zZXRIYXNOb1NpZ25lZFdyYXAoYik7Cit9CisKK3ZvaWQgQmluYXJ5T3BlcmF0b3I6OnNldElzRXhhY3QoYm9vbCBiKSB7CisgIGNhc3Q8U0Rpdk9wZXJhdG9yPih0aGlzKS0+c2V0SXNFeGFjdChiKTsKK30KKworYm9vbCBCaW5hcnlPcGVyYXRvcjo6aGFzTm9VbnNpZ25lZFdyYXAoKSBjb25zdCB7CisgIHJldHVybiBjYXN0PE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I+KHRoaXMpLT5oYXNOb1Vuc2lnbmVkV3JhcCgpOworfQorCitib29sIEJpbmFyeU9wZXJhdG9yOjpoYXNOb1NpZ25lZFdyYXAoKSBjb25zdCB7CisgIHJldHVybiBjYXN0PE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I+KHRoaXMpLT5oYXNOb1NpZ25lZFdyYXAoKTsKK30KKworYm9vbCBCaW5hcnlPcGVyYXRvcjo6aXNFeGFjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIGNhc3Q8U0Rpdk9wZXJhdG9yPih0aGlzKS0+aXNFeGFjdCgpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBKdXN0IGRldGVybWluZSBpZiB0aGlzIGNhc3Qgb25seSBkZWFscyB3aXRoIGludGVncmFsLT5pbnRlZ3JhbCBjb252ZXJzaW9uLgorYm9vbCBDYXN0SW5zdDo6aXNJbnRlZ2VyQ2FzdCgpIGNvbnN0IHsKKyAgc3dpdGNoIChnZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpCaXRDYXN0OgorICAgICAgcmV0dXJuIGdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSAmJgorICAgICAgICBnZXRUeXBlKCktPmlzSW50ZWdlclR5KCk7CisgIH0KK30KKworYm9vbCBDYXN0SW5zdDo6aXNMb3NzbGVzc0Nhc3QoKSBjb25zdCB7CisgIC8vIE9ubHkgQml0Q2FzdCBjYW4gYmUgbG9zc2xlc3MsIGV4aXQgZmFzdCBpZiB3ZSdyZSBub3QgQml0Q2FzdAorICBpZiAoZ2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElkZW50aXR5IGNhc3QgaXMgYWx3YXlzIGxvc3NsZXNzCisgIGNvbnN0IFR5cGUqIFNyY1R5ID0gZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpOworICBjb25zdCBUeXBlKiBEc3RUeSA9IGdldFR5cGUoKTsKKyAgaWYgKFNyY1R5ID09IERzdFR5KQorICAgIHJldHVybiB0cnVlOworICAKKyAgLy8gUG9pbnRlciB0byBwb2ludGVyIGlzIGFsd2F5cyBsb3NzbGVzcy4KKyAgaWYgKFNyY1R5LT5pc1BvaW50ZXJUeSgpKQorICAgIHJldHVybiBEc3RUeS0+aXNQb2ludGVyVHkoKTsKKyAgcmV0dXJuIGZhbHNlOyAgLy8gT3RoZXIgdHlwZXMgaGF2ZSBubyBpZGVudGl0eSB2YWx1ZXMKK30KKworLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgQ2FzdEluc3QgZG9lcyBub3QgcmVxdWlyZSBhbnkgYml0cyB0byBiZQorLy8vIGNoYW5nZWQgaW4gb3JkZXIgdG8gZWZmZWN0IHRoZSBjYXN0LiBFc3NlbnRpYWxseSwgaXQgaWRlbnRpZmllcyBjYXNlcyB3aGVyZQorLy8vIG5vIGNvZGUgZ2VuIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGNhc3QsIGhlbmNlIHRoZSBuYW1lIG5vLW9wIGNhc3QuICBGb3IgCisvLy8gZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBhcmUgYWxsIG5vLW9wIGNhc3RzOgorLy8vICMgYml0Y2FzdCBpMzIqICV4IHRvIGk4KgorLy8vICMgYml0Y2FzdCA8MiB4IGkzMj4gJXggdG8gPDQgeCBpMTY+IAorLy8vICMgcHRydG9pbnQgaTMyKiAleCB0byBpMzIgICAgIDsgb24gMzItYml0IHBsYWZvcm1zIG9ubHkKKy8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBkZXNjcmliZWQgY2FzdCBpcyBhIG5vLW9wLgorYm9vbCBDYXN0SW5zdDo6aXNOb29wQ2FzdChJbnN0cnVjdGlvbjo6Q2FzdE9wcyBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKlNyY1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKkludFB0clR5KSB7CisgIHN3aXRjaCAoT3Bjb2RlKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIkludmFsaWQgQ2FzdE9wIik7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OiAKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUFRydW5jOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQRXh0OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTSVRvRlA6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1VJOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9TSToKKyAgICAgIHJldHVybiBmYWxzZTsgLy8gVGhlc2UgYWx3YXlzIG1vZGlmeSBiaXRzCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6Qml0Q2FzdDoKKyAgICAgIHJldHVybiB0cnVlOyAgLy8gQml0Q2FzdCBuZXZlciBtb2RpZmllcyBiaXRzLgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OgorICAgICAgcmV0dXJuIEludFB0clR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPT0KKyAgICAgICAgICAgICBEZXN0VHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpJbnRUb1B0cjoKKyAgICAgIHJldHVybiBJbnRQdHJUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpID09CisgICAgICAgICAgICAgU3JjVHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgfQorfQorCisvLy8gQGJyaWVmIERldGVybWluZSBpZiBhIGNhc3QgaXMgYSBuby1vcC4KK2Jvb2wgQ2FzdEluc3Q6OmlzTm9vcENhc3QoY29uc3QgVHlwZSAqSW50UHRyVHkpIGNvbnN0IHsKKyAgcmV0dXJuIGlzTm9vcENhc3QoZ2V0T3Bjb2RlKCksIGdldE9wZXJhbmQoMCktPmdldFR5cGUoKSwgZ2V0VHlwZSgpLCBJbnRQdHJUeSk7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgYSBwYWlyIG9mIGNhc3RzIGNhbiBiZSBlbGltaW5hdGVkIGFuZCB3aGF0IAorLy8vIG9wY29kZSBzaG91bGQgYmUgdXNlZCBpbiB0aGUgZWxpbWluYXRpb24uIFRoaXMgYXNzdW1lcyB0aGF0IHRoZXJlIGFyZSB0d28gCisvLy8gaW5zdHJ1Y3Rpb25zIGxpa2UgdGhpczoKKy8vLyAqICAlRiA9IGZpcnN0T3Bjb2RlIFNyY1R5ICV4IHRvIE1pZFR5CisvLy8gKiAgJVMgPSBzZWNvbmRPcGNvZGUgTWlkVHkgJUYgdG8gRHN0VHkKKy8vLyBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHJlc3VsdE9wY29kZSBzbyB0aGVzZSB0d28gY2FzdHMgY2FuIGJlIHJlcGxhY2VkIHdpdGg6CisvLy8gKiAgJVJlcGxhY2VtZW50ID0gcmVzdWx0T3Bjb2RlICVTcmNUeSAleCB0byBEc3RUeQorLy8vIElmIG5vIHN1Y2ggY2FzdCBpcyBwZXJtaXRlZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KK3Vuc2lnbmVkIENhc3RJbnN0Ojppc0VsaW1pbmFibGVDYXN0UGFpcigKKyAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgZmlyc3RPcCwgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgc2Vjb25kT3AsCisgIGNvbnN0IFR5cGUgKlNyY1R5LCBjb25zdCBUeXBlICpNaWRUeSwgY29uc3QgVHlwZSAqRHN0VHksIGNvbnN0IFR5cGUgKkludFB0clR5KQoreworICAvLyBEZWZpbmUgdGhlIDE0NCBwb3NzaWJpbGl0aWVzIGZvciB0aGVzZSB0d28gY2FzdCBpbnN0cnVjdGlvbnMuIFRoZSB2YWx1ZXMKKyAgLy8gaW4gdGhpcyBtYXRyaXggZGV0ZXJtaW5lIHdoYXQgdG8gZG8gaW4gYSBnaXZlbiBzaXR1YXRpb24gYW5kIHNlbGVjdCB0aGUKKyAgLy8gY2FzZSBpbiB0aGUgc3dpdGNoIGJlbG93LiAgVGhlIHJvd3MgY29ycmVzcG9uZCB0byBmaXJzdE9wLCB0aGUgY29sdW1ucyAKKyAgLy8gY29ycmVzcG9uZCB0byBzZWNvbmRPcC4gIEluIGxvb2tpbmcgYXQgdGhlIHRhYmxlIGJlbG93LCBrZWVwIGluICBtaW5kCisgIC8vIHRoZSBmb2xsb3dpbmcgY2FzdCBwcm9wZXJ0aWVzOgorICAvLworICAvLyAgICAgICAgICBTaXplIENvbXBhcmUgICAgICAgU291cmNlICAgICAgICAgICAgICAgRGVzdGluYXRpb24KKyAgLy8gT3BlcmF0b3IgIFNyYyA/IFNpemUgICBUeXBlICAgICAgIFNpZ24gICAgICAgICBUeXBlICAgICAgIFNpZ24KKyAgLy8gLS0tLS0tLS0gLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVFJVTkMgICAgICAgICA+ICAgICAgIEludGVnZXIgICAgICBBbnkgICAgICAgIEludGVncmFsICAgICBBbnkKKyAgLy8gWkVYVCAgICAgICAgICA8ICAgICAgIEludGVncmFsICAgVW5zaWduZWQgICAgIEludGVnZXIgICAgICBBbnkKKyAgLy8gU0VYVCAgICAgICAgICA8ICAgICAgIEludGVncmFsICAgIFNpZ25lZCAgICAgIEludGVnZXIgICAgICBBbnkKKyAgLy8gRlBUT1VJICAgICAgIG4vYSAgICAgIEZsb2F0UHQgICAgICBuL2EgICAgICAgIEludGVncmFsICAgVW5zaWduZWQKKyAgLy8gRlBUT1NJICAgICAgIG4vYSAgICAgIEZsb2F0UHQgICAgICBuL2EgICAgICAgIEludGVncmFsICAgIFNpZ25lZCAKKyAgLy8gVUlUT0ZQICAgICAgIG4vYSAgICAgIEludGVncmFsICAgVW5zaWduZWQgICAgIEZsb2F0UHQgICAgICBuL2EgICAKKyAgLy8gU0lUT0ZQICAgICAgIG4vYSAgICAgIEludGVncmFsICAgIFNpZ25lZCAgICAgIEZsb2F0UHQgICAgICBuL2EgICAKKyAgLy8gRlBUUlVOQyAgICAgICA+ICAgICAgIEZsb2F0UHQgICAgICBuL2EgICAgICAgIEZsb2F0UHQgICAgICBuL2EgICAKKyAgLy8gRlBFWFQgICAgICAgICA8ICAgICAgIEZsb2F0UHQgICAgICBuL2EgICAgICAgIEZsb2F0UHQgICAgICBuL2EgICAKKyAgLy8gUFRSVE9JTlQgICAgIG4vYSAgICAgIFBvaW50ZXIgICAgICBuL2EgICAgICAgIEludGVncmFsICAgVW5zaWduZWQKKyAgLy8gSU5UVE9QVFIgICAgIG4vYSAgICAgIEludGVncmFsICAgVW5zaWduZWQgICAgIFBvaW50ZXIgICAgICBuL2EKKyAgLy8gQklUQ0FTVCAgICAgICA9ICAgICAgIEZpcnN0Q2xhc3MgICBuL2EgICAgICAgRmlyc3RDbGFzcyAgICBuL2EgICAKKyAgLy8KKyAgLy8gTk9URTogc29tZSB0cmFuc2Zvcm1zIGFyZSBzYWZlLCBidXQgd2UgY29uc2lkZXIgdGhlbSB0byBiZSBub24tcHJvZml0YWJsZS4KKyAgLy8gRm9yIGV4YW1wbGUsIHdlIGNvdWxkIG1lcmdlICJmcHRvdWkgZG91YmxlIHRvIGkzMiIgKyAiemV4dCBpMzIgdG8gaTY0IiwKKyAgLy8gaW50byAiZnB0b3VpIGRvdWJsZSB0byBpNjQiLCBidXQgdGhpcyBsb3NlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmFuZ2UKKyAgLy8gb2YgdGhlIHByb2R1Y2VkIHZhbHVlICh3ZSBubyBsb25nZXIga25vdyB0aGUgdG9wLXBhcnQgaXMgYWxsIHplcm9zKS4gCisgIC8vIEZ1cnRoZXIgdGhpcyBjb252ZXJzaW9uIGlzIG9mdGVuIG11Y2ggbW9yZSBleHBlbnNpdmUgZm9yIHR5cGljYWwgaGFyZHdhcmUsCisgIC8vIGFuZCBjYXVzZXMgaXNzdWVzIHdoZW4gYnVpbGRpbmcgbGliZ2NjLiAgV2UgZGlzYWxsb3cgZnB0b3NpK3NleHQgZm9yIHRoZSAKKyAgLy8gc2FtZSByZWFzb24uCisgIGNvbnN0IHVuc2lnbmVkIG51bUNhc3RPcHMgPSAKKyAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wc0VuZCAtIEluc3RydWN0aW9uOjpDYXN0T3BzQmVnaW47CisgIHN0YXRpYyBjb25zdCB1aW50OF90IENhc3RSZXN1bHRzW251bUNhc3RPcHNdW251bUNhc3RPcHNdID0geworICAgIC8vIFQgICAgICAgIEYgIEYgIFUgIFMgIEYgIEYgIFAgIEkgIEIgICAtKworICAgIC8vIFIgIFogIFMgIFAgIFAgIEkgIEkgIFQgIFAgIDIgIE4gIFQgICAgfAorICAgIC8vIFUgIEUgIEUgIDIgIDIgIDIgIDIgIFIgIEUgIEkgIFQgIEMgICAgKy0gc2Vjb25kT3AKKyAgICAvLyBOICBYICBYICBVICBTICBGICBGICBOICBYICBOICAyICBWICAgIHwKKyAgICAvLyBDICBUICBUICBJICBJICBQICBQICBDICBUICBUICBQICBUICAgLSsKKyAgICB7ICAxLCAwLCAwLDk5LDk5LCAwLCAwLDk5LDk5LDk5LCAwLCAzIH0sIC8vIFRydW5jICAgICAgLSsKKyAgICB7ICA4LCAxLCA5LDk5LDk5LCAyLCAwLDk5LDk5LDk5LCAyLCAzIH0sIC8vIFpFeHQgICAgICAgIHwKKyAgICB7ICA4LCAwLCAxLDk5LDk5LCAwLCAyLDk5LDk5LDk5LCAwLCAzIH0sIC8vIFNFeHQgICAgICAgIHwKKyAgICB7ICAwLCAwLCAwLDk5LDk5LCAwLCAwLDk5LDk5LDk5LCAwLCAzIH0sIC8vIEZQVG9VSSAgICAgIHwKKyAgICB7ICAwLCAwLCAwLDk5LDk5LCAwLCAwLDk5LDk5LDk5LCAwLCAzIH0sIC8vIEZQVG9TSSAgICAgIHwKKyAgICB7IDk5LDk5LDk5LCAwLCAwLDk5LDk5LCAwLCAwLDk5LDk5LCA0IH0sIC8vIFVJVG9GUCAgICAgICstIGZpcnN0T3AKKyAgICB7IDk5LDk5LDk5LCAwLCAwLDk5LDk5LCAwLCAwLDk5LDk5LCA0IH0sIC8vIFNJVG9GUCAgICAgIHwKKyAgICB7IDk5LDk5LDk5LCAwLCAwLDk5LDk5LCAxLCAwLDk5LDk5LCA0IH0sIC8vIEZQVHJ1bmMgICAgIHwKKyAgICB7IDk5LDk5LDk5LCAyLCAyLDk5LDk5LDEwLCAyLDk5LDk5LCA0IH0sIC8vIEZQRXh0ICAgICAgIHwKKyAgICB7ICAxLCAwLCAwLDk5LDk5LCAwLCAwLDk5LDk5LDk5LCA3LCAzIH0sIC8vIFB0clRvSW50ICAgIHwKKyAgICB7IDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDEzLDk5LDEyIH0sIC8vIEludFRvUHRyICAgIHwKKyAgICB7ICA1LCA1LCA1LCA2LCA2LCA1LCA1LCA2LCA2LDExLCA1LCAxIH0sIC8vIEJpdENhc3QgICAgLSsKKyAgfTsKKyAgCisgIC8vIElmIGVpdGhlciBvZiB0aGUgY2FzdHMgYXJlIGEgYml0Y2FzdCBmcm9tIHNjYWxhciB0byB2ZWN0b3IsIGRpc2FsbG93IHRoZQorICAvLyBtZXJnaW5nLgorICBpZiAoKGZpcnN0T3AgPT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QgJiYKKyAgICAgICBpc2E8VmVjdG9yVHlwZT4oU3JjVHkpICE9IGlzYTxWZWN0b3JUeXBlPihNaWRUeSkpIHx8CisgICAgICAoc2Vjb25kT3AgPT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QgJiYKKyAgICAgICBpc2E8VmVjdG9yVHlwZT4oTWlkVHkpICE9IGlzYTxWZWN0b3JUeXBlPihEc3RUeSkpKQorICAgIHJldHVybiAwOyAvLyBEaXNhbGxvd2VkCisKKyAgaW50IEVsaW1DYXNlID0gQ2FzdFJlc3VsdHNbZmlyc3RPcC1JbnN0cnVjdGlvbjo6Q2FzdE9wc0JlZ2luXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWNvbmRPcC1JbnN0cnVjdGlvbjo6Q2FzdE9wc0JlZ2luXTsKKyAgc3dpdGNoIChFbGltQ2FzZSkgeworICAgIGNhc2UgMDogCisgICAgICAvLyBjYXRlZ29yaWNhbGx5IGRpc2FsbG93ZWQKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgMTogCisgICAgICAvLyBhbGxvd2VkLCB1c2UgZmlyc3QgY2FzdCdzIG9wY29kZQorICAgICAgcmV0dXJuIGZpcnN0T3A7CisgICAgY2FzZSAyOiAKKyAgICAgIC8vIGFsbG93ZWQsIHVzZSBzZWNvbmQgY2FzdCdzIG9wY29kZQorICAgICAgcmV0dXJuIHNlY29uZE9wOworICAgIGNhc2UgMzogCisgICAgICAvLyBuby1vcCBjYXN0IGluIHNlY29uZCBvcCBpbXBsaWVzIGZpcnN0T3AgYXMgbG9uZyBhcyB0aGUgRGVzdFR5IAorICAgICAgLy8gaXMgaW50ZWdlciBhbmQgd2UgYXJlIG5vdCBjb252ZXJ0aW5nIGJldHdlZW4gYSB2ZWN0b3IgYW5kIGEKKyAgICAgIC8vIG5vbiB2ZWN0b3IgdHlwZS4KKyAgICAgIGlmICghU3JjVHktPmlzVmVjdG9yVHkoKSAmJiBEc3RUeS0+aXNJbnRlZ2VyVHkoKSkKKyAgICAgICAgcmV0dXJuIGZpcnN0T3A7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIDQ6CisgICAgICAvLyBuby1vcCBjYXN0IGluIHNlY29uZCBvcCBpbXBsaWVzIGZpcnN0T3AgYXMgbG9uZyBhcyB0aGUgRGVzdFR5CisgICAgICAvLyBpcyBmbG9hdGluZyBwb2ludC4KKyAgICAgIGlmIChEc3RUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSkKKyAgICAgICAgcmV0dXJuIGZpcnN0T3A7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIDU6IAorICAgICAgLy8gbm8tb3AgY2FzdCBpbiBmaXJzdCBvcCBpbXBsaWVzIHNlY29uZE9wIGFzIGxvbmcgYXMgdGhlIFNyY1R5CisgICAgICAvLyBpcyBhbiBpbnRlZ2VyLgorICAgICAgaWYgKFNyY1R5LT5pc0ludGVnZXJUeSgpKQorICAgICAgICByZXR1cm4gc2Vjb25kT3A7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIDY6CisgICAgICAvLyBuby1vcCBjYXN0IGluIGZpcnN0IG9wIGltcGxpZXMgc2Vjb25kT3AgYXMgbG9uZyBhcyB0aGUgU3JjVHkKKyAgICAgIC8vIGlzIGEgZmxvYXRpbmcgcG9pbnQuCisgICAgICBpZiAoU3JjVHktPmlzRmxvYXRpbmdQb2ludFR5KCkpCisgICAgICAgIHJldHVybiBzZWNvbmRPcDsKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgNzogeyAKKyAgICAgIC8vIHB0cnRvaW50LCBpbnR0b3B0ciAtPiBiaXRjYXN0IChwdHIgLT4gcHRyKSBpZiBpbnQgc2l6ZSBpcyA+PSBwdHIgc2l6ZQorICAgICAgaWYgKCFJbnRQdHJUeSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB1bnNpZ25lZCBQdHJTaXplID0gSW50UHRyVHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgIHVuc2lnbmVkIE1pZFNpemUgPSBNaWRUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgICAgaWYgKE1pZFNpemUgPj0gUHRyU2l6ZSkKKyAgICAgICAgcmV0dXJuIEluc3RydWN0aW9uOjpCaXRDYXN0OworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNhc2UgODogeworICAgICAgLy8gZXh0LCB0cnVuYyAtPiBiaXRjYXN0LCAgICBpZiB0aGUgU3JjVHkgYW5kIERzdFR5IGFyZSBzYW1lIHNpemUKKyAgICAgIC8vIGV4dCwgdHJ1bmMgLT4gZXh0LCAgICAgICAgaWYgc2l6ZW9mKFNyY1R5KSA8IHNpemVvZihEc3RUeSkKKyAgICAgIC8vIGV4dCwgdHJ1bmMgLT4gdHJ1bmMsICAgICAgaWYgc2l6ZW9mKFNyY1R5KSA+IHNpemVvZihEc3RUeSkKKyAgICAgIHVuc2lnbmVkIFNyY1NpemUgPSBTcmNUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgICAgdW5zaWduZWQgRHN0U2l6ZSA9IERzdFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICBpZiAoU3JjU2l6ZSA9PSBEc3RTaXplKQorICAgICAgICByZXR1cm4gSW5zdHJ1Y3Rpb246OkJpdENhc3Q7CisgICAgICBlbHNlIGlmIChTcmNTaXplIDwgRHN0U2l6ZSkKKyAgICAgICAgcmV0dXJuIGZpcnN0T3A7CisgICAgICByZXR1cm4gc2Vjb25kT3A7CisgICAgfQorICAgIGNhc2UgOTogLy8gemV4dCwgc2V4dCAtPiB6ZXh0LCBiZWNhdXNlIHNleHQgY2FuJ3Qgc2lnbiBleHRlbmQgYWZ0ZXIgemV4dAorICAgICAgcmV0dXJuIEluc3RydWN0aW9uOjpaRXh0OworICAgIGNhc2UgMTA6CisgICAgICAvLyBmcGV4dCBmb2xsb3dlZCBieSBmdHJ1bmMgaXMgYWxsb3dlZCBpZiB0aGUgYml0IHNpemUgcmV0dXJuZWQgdG8gaXMKKyAgICAgIC8vIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCwgaW4gd2hpY2ggY2FzZSBpdHMganVzdCBhIGJpdGNhc3QKKyAgICAgIGlmIChTcmNUeSA9PSBEc3RUeSkKKyAgICAgICAgcmV0dXJuIEluc3RydWN0aW9uOjpCaXRDYXN0OworICAgICAgcmV0dXJuIDA7IC8vIElmIHRoZSB0eXBlcyBhcmUgbm90IHRoZSBzYW1lIHdlIGNhbid0IGVsaW1pbmF0ZSBpdC4KKyAgICBjYXNlIDExOgorICAgICAgLy8gYml0Y2FzdCBmb2xsb3dlZCBieSBwdHJ0b2ludCBpcyBhbGxvd2VkIGFzIGxvbmcgYXMgdGhlIGJpdGNhc3QKKyAgICAgIC8vIGlzIGEgcG9pbnRlciB0byBwb2ludGVyIGNhc3QuCisgICAgICBpZiAoU3JjVHktPmlzUG9pbnRlclR5KCkgJiYgTWlkVHktPmlzUG9pbnRlclR5KCkpCisgICAgICAgIHJldHVybiBzZWNvbmRPcDsKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgMTI6CisgICAgICAvLyBpbnR0b3B0ciwgYml0Y2FzdCAtPiBpbnRwdHIgIGlmIGJpdGNhc3QgaXMgYSBwdHIgdG8gcHRyIGNhc3QKKyAgICAgIGlmIChNaWRUeS0+aXNQb2ludGVyVHkoKSAmJiBEc3RUeS0+aXNQb2ludGVyVHkoKSkKKyAgICAgICAgcmV0dXJuIGZpcnN0T3A7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIDEzOiB7CisgICAgICAvLyBpbnR0b3B0ciwgcHRydG9pbnQgLT4gYml0Y2FzdCBpZiBTcmNTaXplPD1QdHJTaXplIGFuZCBTcmNTaXplPT1Ec3RTaXplCisgICAgICBpZiAoIUludFB0clR5KQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHVuc2lnbmVkIFB0clNpemUgPSBJbnRQdHJUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgICAgdW5zaWduZWQgU3JjU2l6ZSA9IFNyY1R5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICB1bnNpZ25lZCBEc3RTaXplID0gRHN0VHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgIGlmIChTcmNTaXplIDw9IFB0clNpemUgJiYgU3JjU2l6ZSA9PSBEc3RTaXplKQorICAgICAgICByZXR1cm4gSW5zdHJ1Y3Rpb246OkJpdENhc3Q7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY2FzZSA5OTogCisgICAgICAvLyBjYXN0IGNvbWJpbmF0aW9uIGNhbid0IGhhcHBlbiAoZXJyb3IgaW4gaW5wdXQpLiBUaGlzIGlzIGZvciBhbGwgY2FzZXMKKyAgICAgIC8vIHdoZXJlIHRoZSBNaWRUeSBpcyBub3QgdGhlIHNhbWUgZm9yIHRoZSB0d28gY2FzdCBpbnN0cnVjdGlvbnMuCisgICAgICBhc3NlcnQoISJJbnZhbGlkIENhc3QgQ29tYmluYXRpb24iKTsKKyAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJFcnJvciBpbiBDYXN0UmVzdWx0cyB0YWJsZSEhISIpOworICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0Nhc3RJbnN0ICpDYXN0SW5zdDo6Q3JlYXRlKEluc3RydWN0aW9uOjpDYXN0T3BzIG9wLCBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIAorICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKSB7CisgIC8vIENvbnN0cnVjdCBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBDYXN0SW5zdCBzdWJjbGFzcworICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBUcnVuYzogICAgcmV0dXJuIG5ldyBUcnVuY0luc3QgICAgKFMsIFR5LCBJbnNlcnRCZWZvcmUpOworICAgIGNhc2UgWkV4dDogICAgIHJldHVybiBuZXcgWkV4dEluc3QgICAgIChTLCBUeSwgSW5zZXJ0QmVmb3JlKTsKKyAgICBjYXNlIFNFeHQ6ICAgICByZXR1cm4gbmV3IFNFeHRJbnN0ICAgICAoUywgVHksIEluc2VydEJlZm9yZSk7CisgICAgY2FzZSBGUFRydW5jOiAgcmV0dXJuIG5ldyBGUFRydW5jSW5zdCAgKFMsIFR5LCBJbnNlcnRCZWZvcmUpOworICAgIGNhc2UgRlBFeHQ6ICAgIHJldHVybiBuZXcgRlBFeHRJbnN0ICAgIChTLCBUeSwgSW5zZXJ0QmVmb3JlKTsKKyAgICBjYXNlIFVJVG9GUDogICByZXR1cm4gbmV3IFVJVG9GUEluc3QgICAoUywgVHksIEluc2VydEJlZm9yZSk7CisgICAgY2FzZSBTSVRvRlA6ICAgcmV0dXJuIG5ldyBTSVRvRlBJbnN0ICAgKFMsIFR5LCBJbnNlcnRCZWZvcmUpOworICAgIGNhc2UgRlBUb1VJOiAgIHJldHVybiBuZXcgRlBUb1VJSW5zdCAgIChTLCBUeSwgSW5zZXJ0QmVmb3JlKTsKKyAgICBjYXNlIEZQVG9TSTogICByZXR1cm4gbmV3IEZQVG9TSUluc3QgICAoUywgVHksIEluc2VydEJlZm9yZSk7CisgICAgY2FzZSBQdHJUb0ludDogcmV0dXJuIG5ldyBQdHJUb0ludEluc3QgKFMsIFR5LCBJbnNlcnRCZWZvcmUpOworICAgIGNhc2UgSW50VG9QdHI6IHJldHVybiBuZXcgSW50VG9QdHJJbnN0IChTLCBUeSwgSW5zZXJ0QmVmb3JlKTsKKyAgICBjYXNlIEJpdENhc3Q6ICByZXR1cm4gbmV3IEJpdENhc3RJbnN0ICAoUywgVHksIEluc2VydEJlZm9yZSk7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIkludmFsaWQgb3Bjb2RlIHByb3ZpZGVkIik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0Nhc3RJbnN0ICpDYXN0SW5zdDo6Q3JlYXRlKEluc3RydWN0aW9uOjpDYXN0T3BzIG9wLCBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksCisgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgIC8vIENvbnN0cnVjdCBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBDYXN0SW5zdCBzdWJjbGFzcworICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBUcnVuYzogICAgcmV0dXJuIG5ldyBUcnVuY0luc3QgICAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBaRXh0OiAgICAgcmV0dXJuIG5ldyBaRXh0SW5zdCAgICAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBTRXh0OiAgICAgcmV0dXJuIG5ldyBTRXh0SW5zdCAgICAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBGUFRydW5jOiAgcmV0dXJuIG5ldyBGUFRydW5jSW5zdCAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBGUEV4dDogICAgcmV0dXJuIG5ldyBGUEV4dEluc3QgICAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBVSVRvRlA6ICAgcmV0dXJuIG5ldyBVSVRvRlBJbnN0ICAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBTSVRvRlA6ICAgcmV0dXJuIG5ldyBTSVRvRlBJbnN0ICAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBGUFRvVUk6ICAgcmV0dXJuIG5ldyBGUFRvVUlJbnN0ICAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBGUFRvU0k6ICAgcmV0dXJuIG5ldyBGUFRvU0lJbnN0ICAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBQdHJUb0ludDogcmV0dXJuIG5ldyBQdHJUb0ludEluc3QgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBJbnRUb1B0cjogcmV0dXJuIG5ldyBJbnRUb1B0ckluc3QgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgY2FzZSBCaXRDYXN0OiAgcmV0dXJuIG5ldyBCaXRDYXN0SW5zdCAgKFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIkludmFsaWQgb3Bjb2RlIHByb3ZpZGVkIik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0Nhc3RJbnN0ICpDYXN0SW5zdDo6Q3JlYXRlWkV4dE9yQml0Q2FzdChWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpIHsKKyAgaWYgKFMtPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpID09IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkpCisgICAgcmV0dXJuIENyZWF0ZShJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgUywgVHksIEluc2VydEJlZm9yZSk7CisgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246OlpFeHQsIFMsIFR5LCBJbnNlcnRCZWZvcmUpOworfQorCitDYXN0SW5zdCAqQ2FzdEluc3Q6OkNyZWF0ZVpFeHRPckJpdENhc3QoVmFsdWUgKlMsIGNvbnN0IFR5cGUgKlR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICBpZiAoUy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPT0gVHktPmdldFNjYWxhclNpemVJbkJpdHMoKSkKKyAgICByZXR1cm4gQ3JlYXRlKEluc3RydWN0aW9uOjpCaXRDYXN0LCBTLCBUeSwgSW5zZXJ0QXRFbmQpOworICByZXR1cm4gQ3JlYXRlKEluc3RydWN0aW9uOjpaRXh0LCBTLCBUeSwgSW5zZXJ0QXRFbmQpOworfQorCitDYXN0SW5zdCAqQ2FzdEluc3Q6OkNyZWF0ZVNFeHRPckJpdENhc3QoVmFsdWUgKlMsIGNvbnN0IFR5cGUgKlR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKSB7CisgIGlmIChTLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKSA9PSBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpKQorICAgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIFMsIFR5LCBJbnNlcnRCZWZvcmUpOworICByZXR1cm4gQ3JlYXRlKEluc3RydWN0aW9uOjpTRXh0LCBTLCBUeSwgSW5zZXJ0QmVmb3JlKTsKK30KKworQ2FzdEluc3QgKkNhc3RJbnN0OjpDcmVhdGVTRXh0T3JCaXRDYXN0KFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgaWYgKFMtPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpID09IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkpCisgICAgcmV0dXJuIENyZWF0ZShJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgUywgVHksIEluc2VydEF0RW5kKTsKKyAgcmV0dXJuIENyZWF0ZShJbnN0cnVjdGlvbjo6U0V4dCwgUywgVHksIEluc2VydEF0RW5kKTsKK30KKworQ2FzdEluc3QgKkNhc3RJbnN0OjpDcmVhdGVUcnVuY09yQml0Q2FzdChWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpIHsKKyAgaWYgKFMtPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpID09IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkpCisgICAgcmV0dXJuIENyZWF0ZShJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgUywgVHksIEluc2VydEJlZm9yZSk7CisgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246OlRydW5jLCBTLCBUeSwgSW5zZXJ0QmVmb3JlKTsKK30KKworQ2FzdEluc3QgKkNhc3RJbnN0OjpDcmVhdGVUcnVuY09yQml0Q2FzdChWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgIGlmIChTLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKSA9PSBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpKQorICAgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIFMsIFR5LCBJbnNlcnRBdEVuZCk7CisgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246OlRydW5jLCBTLCBUeSwgSW5zZXJ0QXRFbmQpOworfQorCitDYXN0SW5zdCAqQ2FzdEluc3Q6OkNyZWF0ZVBvaW50ZXJDYXN0KFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgYXNzZXJ0KFMtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSAmJiAiSW52YWxpZCBjYXN0Iik7CisgIGFzc2VydCgoVHktPmlzSW50ZWdlclR5KCkgfHwgVHktPmlzUG9pbnRlclR5KCkpICYmCisgICAgICAgICAiSW52YWxpZCBjYXN0Iik7CisKKyAgaWYgKFR5LT5pc0ludGVnZXJUeSgpKQorICAgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246OlB0clRvSW50LCBTLCBUeSwgSW5zZXJ0QXRFbmQpOworICByZXR1cm4gQ3JlYXRlKEluc3RydWN0aW9uOjpCaXRDYXN0LCBTLCBUeSwgSW5zZXJ0QXRFbmQpOworfQorCisvLy8gQGJyaWVmIENyZWF0ZSBhIEJpdENhc3Qgb3IgYSBQdHJUb0ludCBjYXN0IGluc3RydWN0aW9uCitDYXN0SW5zdCAqQ2FzdEluc3Q6OkNyZWF0ZVBvaW50ZXJDYXN0KFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpIHsKKyAgYXNzZXJ0KFMtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSAmJiAiSW52YWxpZCBjYXN0Iik7CisgIGFzc2VydCgoVHktPmlzSW50ZWdlclR5KCkgfHwgVHktPmlzUG9pbnRlclR5KCkpICYmCisgICAgICAgICAiSW52YWxpZCBjYXN0Iik7CisKKyAgaWYgKFR5LT5pc0ludGVnZXJUeSgpKQorICAgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246OlB0clRvSW50LCBTLCBUeSwgSW5zZXJ0QmVmb3JlKTsKKyAgcmV0dXJuIENyZWF0ZShJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgUywgVHksIEluc2VydEJlZm9yZSk7Cit9CisKK0Nhc3RJbnN0ICpDYXN0SW5zdDo6Q3JlYXRlSW50ZWdlckNhc3QoVmFsdWUgKkMsIGNvbnN0IFR5cGUgKlR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkgeworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJiBUeS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYKKyAgICAgICAgICJJbnZhbGlkIGludGVnZXIgY2FzdCIpOworICB1bnNpZ25lZCBTcmNCaXRzID0gQy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIERzdEJpdHMgPSBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBvcGNvZGUgPQorICAgIChTcmNCaXRzID09IERzdEJpdHMgPyBJbnN0cnVjdGlvbjo6Qml0Q2FzdCA6CisgICAgIChTcmNCaXRzID4gRHN0Qml0cyA/IEluc3RydWN0aW9uOjpUcnVuYyA6CisgICAgICAoaXNTaWduZWQgPyBJbnN0cnVjdGlvbjo6U0V4dCA6IEluc3RydWN0aW9uOjpaRXh0KSkpOworICByZXR1cm4gQ3JlYXRlKG9wY29kZSwgQywgVHksIEluc2VydEJlZm9yZSk7Cit9CisKK0Nhc3RJbnN0ICpDYXN0SW5zdDo6Q3JlYXRlSW50ZWdlckNhc3QoVmFsdWUgKkMsIGNvbnN0IFR5cGUgKlR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgYXNzZXJ0KEMtPmdldFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYgVHktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAiSW52YWxpZCBjYXN0Iik7CisgIHVuc2lnbmVkIFNyY0JpdHMgPSBDLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgdW5zaWduZWQgRHN0Qml0cyA9IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgIEluc3RydWN0aW9uOjpDYXN0T3BzIG9wY29kZSA9CisgICAgKFNyY0JpdHMgPT0gRHN0Qml0cyA/IEluc3RydWN0aW9uOjpCaXRDYXN0IDoKKyAgICAgKFNyY0JpdHMgPiBEc3RCaXRzID8gSW5zdHJ1Y3Rpb246OlRydW5jIDoKKyAgICAgIChpc1NpZ25lZCA/IEluc3RydWN0aW9uOjpTRXh0IDogSW5zdHJ1Y3Rpb246OlpFeHQpKSk7CisgIHJldHVybiBDcmVhdGUob3Bjb2RlLCBDLCBUeSwgSW5zZXJ0QXRFbmQpOworfQorCitDYXN0SW5zdCAqQ2FzdEluc3Q6OkNyZWF0ZUZQQ2FzdChWYWx1ZSAqQywgY29uc3QgVHlwZSAqVHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkgeworICBhc3NlcnQoQy0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkgJiYgVHktPmlzRlBPckZQVmVjdG9yVHkoKSAmJgorICAgICAgICAgIkludmFsaWQgY2FzdCIpOworICB1bnNpZ25lZCBTcmNCaXRzID0gQy0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIERzdEJpdHMgPSBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBvcGNvZGUgPQorICAgIChTcmNCaXRzID09IERzdEJpdHMgPyBJbnN0cnVjdGlvbjo6Qml0Q2FzdCA6CisgICAgIChTcmNCaXRzID4gRHN0Qml0cyA/IEluc3RydWN0aW9uOjpGUFRydW5jIDogSW5zdHJ1Y3Rpb246OkZQRXh0KSk7CisgIHJldHVybiBDcmVhdGUob3Bjb2RlLCBDLCBUeSwgSW5zZXJ0QmVmb3JlKTsKK30KKworQ2FzdEluc3QgKkNhc3RJbnN0OjpDcmVhdGVGUENhc3QoVmFsdWUgKkMsIGNvbnN0IFR5cGUgKlR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgIGFzc2VydChDLT5nZXRUeXBlKCktPmlzRlBPckZQVmVjdG9yVHkoKSAmJiBUeS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICAiSW52YWxpZCBjYXN0Iik7CisgIHVuc2lnbmVkIFNyY0JpdHMgPSBDLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgdW5zaWduZWQgRHN0Qml0cyA9IFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgIEluc3RydWN0aW9uOjpDYXN0T3BzIG9wY29kZSA9CisgICAgKFNyY0JpdHMgPT0gRHN0Qml0cyA/IEluc3RydWN0aW9uOjpCaXRDYXN0IDoKKyAgICAgKFNyY0JpdHMgPiBEc3RCaXRzID8gSW5zdHJ1Y3Rpb246OkZQVHJ1bmMgOiBJbnN0cnVjdGlvbjo6RlBFeHQpKTsKKyAgcmV0dXJuIENyZWF0ZShvcGNvZGUsIEMsIFR5LCBJbnNlcnRBdEVuZCk7Cit9CisKKy8vIENoZWNrIHdoZXRoZXIgaXQgaXMgdmFsaWQgdG8gY2FsbCBnZXRDYXN0T3Bjb2RlIGZvciB0aGVzZSB0eXBlcy4KKy8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGdldENhc3RPcGNvZGUuCitib29sIENhc3RJbnN0Ojppc0Nhc3RhYmxlKGNvbnN0IFR5cGUgKlNyY1R5LCBjb25zdCBUeXBlICpEZXN0VHkpIHsKKyAgaWYgKCFTcmNUeS0+aXNGaXJzdENsYXNzVHlwZSgpIHx8ICFEZXN0VHktPmlzRmlyc3RDbGFzc1R5cGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKFNyY1R5ID09IERlc3RUeSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBHZXQgdGhlIGJpdCBzaXplcywgd2UnbGwgbmVlZCB0aGVzZQorICB1bnNpZ25lZCBTcmNCaXRzID0gU3JjVHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsgICAvLyAwIGZvciBwdHIKKyAgdW5zaWduZWQgRGVzdEJpdHMgPSBEZXN0VHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsgLy8gMCBmb3IgcHRyCisKKyAgLy8gUnVuIHRocm91Z2ggdGhlIHBvc3NpYmlsaXRpZXMgLi4uCisgIGlmIChEZXN0VHktPmlzSW50ZWdlclR5KCkpIHsgICAgICAgICAgICAgICAgICAgLy8gQ2FzdGluZyB0byBpbnRlZ3JhbAorICAgIGlmIChTcmNUeS0+aXNJbnRlZ2VyVHkoKSkgeyAgICAgICAgICAgICAgICAgIC8vIENhc3RpbmcgZnJvbSBpbnRlZ3JhbAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKFNyY1R5LT5pc0Zsb2F0aW5nUG9pbnRUeSgpKSB7ICAgICAvLyBDYXN0aW5nIGZyb20gZmxvYXRpbmcgcHQKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoY29uc3QgVmVjdG9yVHlwZSAqUFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oU3JjVHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhc3RpbmcgZnJvbSB2ZWN0b3IKKyAgICAgIHJldHVybiBEZXN0Qml0cyA9PSBQVHktPmdldEJpdFdpZHRoKCk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhc3RpbmcgZnJvbSBzb21ldGhpbmcgZWxzZQorICAgICAgcmV0dXJuIFNyY1R5LT5pc1BvaW50ZXJUeSgpOworICAgIH0KKyAgfSBlbHNlIGlmIChEZXN0VHktPmlzRmxvYXRpbmdQb2ludFR5KCkpIHsgICAgICAvLyBDYXN0aW5nIHRvIGZsb2F0aW5nIHB0CisgICAgaWYgKFNyY1R5LT5pc0ludGVnZXJUeSgpKSB7ICAgICAgICAgICAgICAgICAgLy8gQ2FzdGluZyBmcm9tIGludGVncmFsCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKFNyY1R5LT5pc0Zsb2F0aW5nUG9pbnRUeSgpKSB7ICAgICAvLyBDYXN0aW5nIGZyb20gZmxvYXRpbmcgcHQKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoY29uc3QgVmVjdG9yVHlwZSAqUFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oU3JjVHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhc3RpbmcgZnJvbSB2ZWN0b3IKKyAgICAgIHJldHVybiBEZXN0Qml0cyA9PSBQVHktPmdldEJpdFdpZHRoKCk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhc3RpbmcgZnJvbSBzb21ldGhpbmcgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIGlmIChjb25zdCBWZWN0b3JUeXBlICpEZXN0UFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oRGVzdFR5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FzdGluZyB0byB2ZWN0b3IKKyAgICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqU3JjUFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oU3JjVHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXN0aW5nIGZyb20gdmVjdG9yCisgICAgICByZXR1cm4gRGVzdFBUeS0+Z2V0Qml0V2lkdGgoKSA9PSBTcmNQVHktPmdldEJpdFdpZHRoKCk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXN0aW5nIGZyb20gc29tZXRoaW5nIGVsc2UKKyAgICAgIHJldHVybiBEZXN0UFR5LT5nZXRCaXRXaWR0aCgpID09IFNyY0JpdHM7CisgICAgfQorICB9IGVsc2UgaWYgKERlc3RUeS0+aXNQb2ludGVyVHkoKSkgeyAgICAgICAgLy8gQ2FzdGluZyB0byBwb2ludGVyCisgICAgaWYgKFNyY1R5LT5pc1BvaW50ZXJUeSgpKSB7ICAgICAgICAgICAgICAvLyBDYXN0aW5nIGZyb20gcG9pbnRlcgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChTcmNUeS0+aXNJbnRlZ2VyVHkoKSkgeyAgICAgICAgICAgIC8vIENhc3RpbmcgZnJvbSBpbnRlZ3JhbAorICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXN0aW5nIGZyb20gc29tZXRoaW5nIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXN0aW5nIHRvIHNvbWV0aGluZyBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8vIFByb3ZpZGUgYSB3YXkgdG8gZ2V0IGEgImNhc3QiIHdoZXJlIHRoZSBjYXN0IG9wY29kZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSAKKy8vIHR5cGVzIGFuZCBzaXplIG9mIHRoZSBvcGVyYW5kLiBUaGlzLCBiYXNpY2FsbHksIGlzIGEgcGFyYWxsZWwgb2YgdGhlIAorLy8gbG9naWMgaW4gdGhlIGNhc3RJc1ZhbGlkIGZ1bmN0aW9uIGJlbG93LiAgVGhpcyBheGlvbSBzaG91bGQgaG9sZDoKKy8vICAgY2FzdElzVmFsaWQoIGdldENhc3RPcGNvZGUoVmFsLCBUeSksIFZhbCwgVHkpCisvLyBzaG91bGQgbm90IGFzc2VydCBpbiBjYXN0SXNWYWxpZC4gSW4gb3RoZXIgd29yZHMsIHRoaXMgcHJvZHVjZXMgYSAiY29ycmVjdCIKKy8vIGNhc3Rpbmcgb3Bjb2RlIGZvciB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBpdC4KKy8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGlzQ2FzdGFibGUuCitJbnN0cnVjdGlvbjo6Q2FzdE9wcworQ2FzdEluc3Q6OmdldENhc3RPcGNvZGUoCisgIGNvbnN0IFZhbHVlICpTcmMsIGJvb2wgU3JjSXNTaWduZWQsIGNvbnN0IFR5cGUgKkRlc3RUeSwgYm9vbCBEZXN0SXNTaWduZWQpIHsKKyAgLy8gR2V0IHRoZSBiaXQgc2l6ZXMsIHdlJ2xsIG5lZWQgdGhlc2UKKyAgY29uc3QgVHlwZSAqU3JjVHkgPSBTcmMtPmdldFR5cGUoKTsKKyAgdW5zaWduZWQgU3JjQml0cyA9IFNyY1R5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7ICAgLy8gMCBmb3IgcHRyCisgIHVuc2lnbmVkIERlc3RCaXRzID0gRGVzdFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7IC8vIDAgZm9yIHB0cgorCisgIGFzc2VydChTcmNUeS0+aXNGaXJzdENsYXNzVHlwZSgpICYmIERlc3RUeS0+aXNGaXJzdENsYXNzVHlwZSgpICYmCisgICAgICAgICAiT25seSBmaXJzdCBjbGFzcyB0eXBlcyBhcmUgY2FzdGFibGUhIik7CisKKyAgLy8gUnVuIHRocm91Z2ggdGhlIHBvc3NpYmlsaXRpZXMgLi4uCisgIGlmIChEZXN0VHktPmlzSW50ZWdlclR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FzdGluZyB0byBpbnRlZ3JhbAorICAgIGlmIChTcmNUeS0+aXNJbnRlZ2VyVHkoKSkgeyAgICAgICAgICAgICAgICAgICAgIC8vIENhc3RpbmcgZnJvbSBpbnRlZ3JhbAorICAgICAgaWYgKERlc3RCaXRzIDwgU3JjQml0cykKKyAgICAgICAgcmV0dXJuIFRydW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQgLT4gc21hbGxlciBpbnQKKyAgICAgIGVsc2UgaWYgKERlc3RCaXRzID4gU3JjQml0cykgeyAgICAgICAgICAgICAgICAvLyBpdHMgYW4gZXh0ZW5zaW9uCisgICAgICAgIGlmIChTcmNJc1NpZ25lZCkKKyAgICAgICAgICByZXR1cm4gU0V4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQgLT4gU0VYVAorICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIFpFeHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQgLT4gWkVYVAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJpdENhc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHNpemUsIE5vLW9wIGNhc3QKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFNyY1R5LT5pc0Zsb2F0aW5nUG9pbnRUeSgpKSB7ICAgICAgICAvLyBDYXN0aW5nIGZyb20gZmxvYXRpbmcgcHQKKyAgICAgIGlmIChEZXN0SXNTaWduZWQpIAorICAgICAgICByZXR1cm4gRlBUb1NJOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZQIC0+IHNpbnQKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZQVG9VSTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGUCAtPiB1aW50IAorICAgIH0gZWxzZSBpZiAoY29uc3QgVmVjdG9yVHlwZSAqUFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oU3JjVHkpKSB7CisgICAgICBhc3NlcnQoRGVzdEJpdHMgPT0gUFR5LT5nZXRCaXRXaWR0aCgpICYmCisgICAgICAgICAgICAgICAiQ2FzdGluZyB2ZWN0b3IgdG8gaW50ZWdlciBvZiBkaWZmZXJlbnQgd2lkdGgiKTsKKyAgICAgIFBUeSA9IE5VTEw7CisgICAgICByZXR1cm4gQml0Q2FzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgc2l6ZSwgbm8tb3AgY2FzdAorICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoU3JjVHktPmlzUG9pbnRlclR5KCkgJiYKKyAgICAgICAgICAgICAiQ2FzdGluZyBmcm9tIGEgdmFsdWUgdGhhdCBpcyBub3QgZmlyc3QtY2xhc3MgdHlwZSIpOworICAgICAgcmV0dXJuIFB0clRvSW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB0ciAtPiBpbnQKKyAgICB9CisgIH0gZWxzZSBpZiAoRGVzdFR5LT5pc0Zsb2F0aW5nUG9pbnRUeSgpKSB7ICAgICAgICAgLy8gQ2FzdGluZyB0byBmbG9hdGluZyBwdAorICAgIGlmIChTcmNUeS0+aXNJbnRlZ2VyVHkoKSkgeyAgICAgICAgICAgICAgICAgICAgIC8vIENhc3RpbmcgZnJvbSBpbnRlZ3JhbAorICAgICAgaWYgKFNyY0lzU2lnbmVkKQorICAgICAgICByZXR1cm4gU0lUb0ZQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbnQgLT4gRlAKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFVJVG9GUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1aW50IC0+IEZQCisgICAgfSBlbHNlIGlmIChTcmNUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSkgeyAgICAgICAgLy8gQ2FzdGluZyBmcm9tIGZsb2F0aW5nIHB0CisgICAgICBpZiAoRGVzdEJpdHMgPCBTcmNCaXRzKSB7CisgICAgICAgIHJldHVybiBGUFRydW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRlAgLT4gc21hbGxlciBGUAorICAgICAgfSBlbHNlIGlmIChEZXN0Qml0cyA+IFNyY0JpdHMpIHsKKyAgICAgICAgcmV0dXJuIEZQRXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGUCAtPiBsYXJnZXIgRlAKKyAgICAgIH0gZWxzZSAgeworICAgICAgICByZXR1cm4gQml0Q2FzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgc2l6ZSwgbm8tb3AgY2FzdAorICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29uc3QgVmVjdG9yVHlwZSAqUFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oU3JjVHkpKSB7CisgICAgICBhc3NlcnQoRGVzdEJpdHMgPT0gUFR5LT5nZXRCaXRXaWR0aCgpICYmCisgICAgICAgICAgICAgIkNhc3RpbmcgdmVjdG9yIHRvIGZsb2F0aW5nIHBvaW50IG9mIGRpZmZlcmVudCB3aWR0aCIpOworICAgICAgUFR5ID0gTlVMTDsKKyAgICAgIHJldHVybiBCaXRDYXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSBzaXplLCBuby1vcCBjYXN0CisgICAgfSBlbHNlIHsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkNhc3RpbmcgcG9pbnRlciBvciBub24tZmlyc3QgY2xhc3MgdG8gZmxvYXQiKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoY29uc3QgVmVjdG9yVHlwZSAqRGVzdFBUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KERlc3RUeSkpIHsKKyAgICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqU3JjUFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oU3JjVHkpKSB7CisgICAgICBhc3NlcnQoRGVzdFBUeS0+Z2V0Qml0V2lkdGgoKSA9PSBTcmNQVHktPmdldEJpdFdpZHRoKCkgJiYKKyAgICAgICAgICAgICAiQ2FzdGluZyB2ZWN0b3IgdG8gdmVjdG9yIG9mIGRpZmZlcmVudCB3aWR0aHMiKTsKKyAgICAgIFNyY1BUeSA9IE5VTEw7CisgICAgICByZXR1cm4gQml0Q2FzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlY3RvciAtPiB2ZWN0b3IKKyAgICB9IGVsc2UgaWYgKERlc3RQVHktPmdldEJpdFdpZHRoKCkgPT0gU3JjQml0cykgeworICAgICAgcmV0dXJuIEJpdENhc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0L2ludCAtPiB2ZWN0b3IKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KCEiSWxsZWdhbCBjYXN0IHRvIHZlY3RvciAod3JvbmcgdHlwZSBvciBzaXplKSIpOworICAgIH0KKyAgfSBlbHNlIGlmIChEZXN0VHktPmlzUG9pbnRlclR5KCkpIHsKKyAgICBpZiAoU3JjVHktPmlzUG9pbnRlclR5KCkpIHsKKyAgICAgIHJldHVybiBCaXRDYXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdHIgLT4gcHRyCisgICAgfSBlbHNlIGlmIChTcmNUeS0+aXNJbnRlZ2VyVHkoKSkgeworICAgICAgcmV0dXJuIEludFRvUHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludCAtPiBwdHIKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KCEiQ2FzdGluZyBwb2ludGVyIHRvIG90aGVyIHRoYW4gcG9pbnRlciBvciBpbnQiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KCEiQ2FzdGluZyB0byB0eXBlIHRoYXQgaXMgbm90IGZpcnN0LWNsYXNzIik7CisgIH0KKworICAvLyBJZiB3ZSBmYWxsIHRocm91Z2ggdG8gaGVyZSB3ZSBwcm9iYWJseSBoaXQgYW4gYXNzZXJ0aW9uIGNhc3QgYWJvdmUKKyAgLy8gYW5kIGFzc2VydGlvbnMgYXJlIG5vdCB0dXJuZWQgb24uIEFueXRoaW5nIHdlIHJldHVybiBpcyBhbiBlcnJvciwgc28KKyAgLy8gQml0Q2FzdCBpcyBhcyBnb29kIGEgY2hvaWNlIGFzIGFueS4KKyAgcmV0dXJuIEJpdENhc3Q7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgQ2FzdEluc3QgU3ViQ2xhc3MgQ29uc3RydWN0b3JzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQ2hlY2sgdGhhdCB0aGUgY29uc3RydWN0aW9uIHBhcmFtZXRlcnMgZm9yIGEgQ2FzdEluc3QgYXJlIGNvcnJlY3QuIFRoaXMKKy8vLyBjb3VsZCBiZSBicm9rZW4gb3V0IGludG8gdGhlIHNlcGFyYXRlIGNvbnN0cnVjdG9ycyBidXQgaXQgaXMgdXNlZnVsIHRvIGhhdmUKKy8vLyBpdCBpbiBvbmUgcGxhY2UgYW5kIHRvIGVsaW1pbmF0ZSB0aGUgcmVkdW5kYW50IGNvZGUgZm9yIGdldHRpbmcgdGhlIHNpemVzCisvLy8gb2YgdGhlIHR5cGVzIGludm9sdmVkLgorYm9vbCAKK0Nhc3RJbnN0OjpjYXN0SXNWYWxpZChJbnN0cnVjdGlvbjo6Q2FzdE9wcyBvcCwgVmFsdWUgKlMsIGNvbnN0IFR5cGUgKkRzdFR5KSB7CisKKyAgLy8gQ2hlY2sgZm9yIHR5cGUgc2FuaXR5IG9uIHRoZSBhcmd1bWVudHMKKyAgY29uc3QgVHlwZSAqU3JjVHkgPSBTLT5nZXRUeXBlKCk7CisgIGlmICghU3JjVHktPmlzRmlyc3RDbGFzc1R5cGUoKSB8fCAhRHN0VHktPmlzRmlyc3RDbGFzc1R5cGUoKSB8fAorICAgICAgU3JjVHktPmlzQWdncmVnYXRlVHlwZSgpIHx8IERzdFR5LT5pc0FnZ3JlZ2F0ZVR5cGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gR2V0IHRoZSBzaXplIG9mIHRoZSB0eXBlcyBpbiBiaXRzLCB3ZSdsbCBuZWVkIHRoaXMgbGF0ZXIKKyAgdW5zaWduZWQgU3JjQml0U2l6ZSA9IFNyY1R5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgIHVuc2lnbmVkIERzdEJpdFNpemUgPSBEc3RUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworCisgIC8vIFN3aXRjaCBvbiB0aGUgb3Bjb2RlIHByb3ZpZGVkCisgIHN3aXRjaCAob3ApIHsKKyAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOyAvLyBUaGlzIGlzIGFuIGlucHV0IGVycm9yCisgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICAgIHJldHVybiBTcmNUeS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgRHN0VHktPmlzSW50T3JJbnRWZWN0b3JUeSgpJiYgU3JjQml0U2l6ZSA+IERzdEJpdFNpemU7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlpFeHQ6CisgICAgcmV0dXJuIFNyY1R5LT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICBEc3RUeS0+aXNJbnRPckludFZlY3RvclR5KCkmJiBTcmNCaXRTaXplIDwgRHN0Qml0U2l6ZTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0V4dDogCisgICAgcmV0dXJuIFNyY1R5LT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICBEc3RUeS0+aXNJbnRPckludFZlY3RvclR5KCkmJiBTcmNCaXRTaXplIDwgRHN0Qml0U2l6ZTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUcnVuYzoKKyAgICByZXR1cm4gU3JjVHktPmlzRlBPckZQVmVjdG9yVHkoKSAmJgorICAgICAgICAgICBEc3RUeS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmIAorICAgICAgICAgICBTcmNCaXRTaXplID4gRHN0Qml0U2l6ZTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgICAgcmV0dXJuIFNyY1R5LT5pc0ZQT3JGUFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgRHN0VHktPmlzRlBPckZQVmVjdG9yVHkoKSAmJiAKKyAgICAgICAgICAgU3JjQml0U2l6ZSA8IERzdEJpdFNpemU7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlVJVG9GUDoKKyAgY2FzZSBJbnN0cnVjdGlvbjo6U0lUb0ZQOgorICAgIGlmIChjb25zdCBWZWN0b3JUeXBlICpTVlR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oU3JjVHkpKSB7CisgICAgICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqRFZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KERzdFR5KSkgeworICAgICAgICByZXR1cm4gU1ZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgICAgIERWVHktPmdldEVsZW1lbnRUeXBlKCktPmlzRlBPckZQVmVjdG9yVHkoKSAmJgorICAgICAgICAgICAgICAgU1ZUeS0+Z2V0TnVtRWxlbWVudHMoKSA9PSBEVlR5LT5nZXROdW1FbGVtZW50cygpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3JjVHktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmIERzdFR5LT5pc0ZQT3JGUFZlY3RvclR5KCk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQVG9VSToKKyAgY2FzZSBJbnN0cnVjdGlvbjo6RlBUb1NJOgorICAgIGlmIChjb25zdCBWZWN0b3JUeXBlICpTVlR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oU3JjVHkpKSB7CisgICAgICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqRFZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KERzdFR5KSkgeworICAgICAgICByZXR1cm4gU1ZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICAgICAgICBEVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICAgICAgU1ZUeS0+Z2V0TnVtRWxlbWVudHMoKSA9PSBEVlR5LT5nZXROdW1FbGVtZW50cygpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3JjVHktPmlzRlBPckZQVmVjdG9yVHkoKSAmJiBEc3RUeS0+aXNJbnRPckludFZlY3RvclR5KCk7CisgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OgorICAgIHJldHVybiBTcmNUeS0+aXNQb2ludGVyVHkoKSAmJiBEc3RUeS0+aXNJbnRlZ2VyVHkoKTsKKyAgY2FzZSBJbnN0cnVjdGlvbjo6SW50VG9QdHI6CisgICAgcmV0dXJuIFNyY1R5LT5pc0ludGVnZXJUeSgpICYmIERzdFR5LT5pc1BvaW50ZXJUeSgpOworICBjYXNlIEluc3RydWN0aW9uOjpCaXRDYXN0OgorICAgIC8vIEJpdENhc3QgaW1wbGllcyBhIG5vLW9wIGNhc3Qgb2YgdHlwZSBvbmx5LiBObyBiaXRzIGNoYW5nZS4KKyAgICAvLyBIb3dldmVyLCB5b3UgY2FuJ3QgY2FzdCBwb2ludGVycyB0byBhbnl0aGluZyBidXQgcG9pbnRlcnMuCisgICAgaWYgKFNyY1R5LT5pc1BvaW50ZXJUeSgpICE9IERzdFR5LT5pc1BvaW50ZXJUeSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTm93IHdlIGtub3cgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIHBvaW50ZXIvbm9uLXBvaW50ZXIgbWlzbWF0Y2guIEluIGFsbAorICAgIC8vIHRoZXNlIGNhc2VzLCB0aGUgY2FzdCBpcyBva2F5IGlmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJpdCB3aWR0aHMKKyAgICAvLyBhcmUgaWRlbnRpY2FsLgorICAgIHJldHVybiBTcmNUeS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpID09IERzdFR5LT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgIH0KK30KKworVHJ1bmNJbnN0OjpUcnVuY0luc3QoCisgIFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZQorKSA6IENhc3RJbnN0KFR5LCBUcnVuYywgUywgSW5zZXJ0QmVmb3JlKSB7CisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIFRydW5jIik7Cit9CisKK1RydW5jSW5zdDo6VHJ1bmNJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kCispIDogQ2FzdEluc3QoVHksIFRydW5jLCBTLCBJbnNlcnRBdEVuZCkgeyAKKyAgYXNzZXJ0KGNhc3RJc1ZhbGlkKGdldE9wY29kZSgpLCBTLCBUeSkgJiYgIklsbGVnYWwgVHJ1bmMiKTsKK30KKworWkV4dEluc3Q6OlpFeHRJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUKKykgIDogQ2FzdEluc3QoVHksIFpFeHQsIFMsIEluc2VydEJlZm9yZSkgeyAKKyAgYXNzZXJ0KGNhc3RJc1ZhbGlkKGdldE9wY29kZSgpLCBTLCBUeSkgJiYgIklsbGVnYWwgWkV4dCIpOworfQorCitaRXh0SW5zdDo6WkV4dEluc3QoCisgIFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQKKykgIDogQ2FzdEluc3QoVHksIFpFeHQsIFMsIEluc2VydEF0RW5kKSB7IAorICBhc3NlcnQoY2FzdElzVmFsaWQoZ2V0T3Bjb2RlKCksIFMsIFR5KSAmJiAiSWxsZWdhbCBaRXh0Iik7Cit9CitTRXh0SW5zdDo6U0V4dEluc3QoCisgIFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZQorKSA6IENhc3RJbnN0KFR5LCBTRXh0LCBTLCBJbnNlcnRCZWZvcmUpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIFNFeHQiKTsKK30KKworU0V4dEluc3Q6OlNFeHRJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kCispICA6IENhc3RJbnN0KFR5LCBTRXh0LCBTLCBJbnNlcnRBdEVuZCkgeyAKKyAgYXNzZXJ0KGNhc3RJc1ZhbGlkKGdldE9wY29kZSgpLCBTLCBUeSkgJiYgIklsbGVnYWwgU0V4dCIpOworfQorCitGUFRydW5jSW5zdDo6RlBUcnVuY0luc3QoCisgIFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZQorKSA6IENhc3RJbnN0KFR5LCBGUFRydW5jLCBTLCBJbnNlcnRCZWZvcmUpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIEZQVHJ1bmMiKTsKK30KKworRlBUcnVuY0luc3Q6OkZQVHJ1bmNJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kCispIDogQ2FzdEluc3QoVHksIEZQVHJ1bmMsIFMsIEluc2VydEF0RW5kKSB7IAorICBhc3NlcnQoY2FzdElzVmFsaWQoZ2V0T3Bjb2RlKCksIFMsIFR5KSAmJiAiSWxsZWdhbCBGUFRydW5jIik7Cit9CisKK0ZQRXh0SW5zdDo6RlBFeHRJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUKKykgOiBDYXN0SW5zdChUeSwgRlBFeHQsIFMsIEluc2VydEJlZm9yZSkgeyAKKyAgYXNzZXJ0KGNhc3RJc1ZhbGlkKGdldE9wY29kZSgpLCBTLCBUeSkgJiYgIklsbGVnYWwgRlBFeHQiKTsKK30KKworRlBFeHRJbnN0OjpGUEV4dEluc3QoCisgIFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQKKykgOiBDYXN0SW5zdChUeSwgRlBFeHQsIFMsIEluc2VydEF0RW5kKSB7IAorICBhc3NlcnQoY2FzdElzVmFsaWQoZ2V0T3Bjb2RlKCksIFMsIFR5KSAmJiAiSWxsZWdhbCBGUEV4dCIpOworfQorCitVSVRvRlBJbnN0OjpVSVRvRlBJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUKKykgOiBDYXN0SW5zdChUeSwgVUlUb0ZQLCBTLCBJbnNlcnRCZWZvcmUpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIFVJVG9GUCIpOworfQorCitVSVRvRlBJbnN0OjpVSVRvRlBJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kCispIDogQ2FzdEluc3QoVHksIFVJVG9GUCwgUywgSW5zZXJ0QXRFbmQpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIFVJVG9GUCIpOworfQorCitTSVRvRlBJbnN0OjpTSVRvRlBJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUKKykgOiBDYXN0SW5zdChUeSwgU0lUb0ZQLCBTLCBJbnNlcnRCZWZvcmUpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIFNJVG9GUCIpOworfQorCitTSVRvRlBJbnN0OjpTSVRvRlBJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kCispIDogQ2FzdEluc3QoVHksIFNJVG9GUCwgUywgSW5zZXJ0QXRFbmQpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIFNJVG9GUCIpOworfQorCitGUFRvVUlJbnN0OjpGUFRvVUlJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUKKykgOiBDYXN0SW5zdChUeSwgRlBUb1VJLCBTLCBJbnNlcnRCZWZvcmUpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIEZQVG9VSSIpOworfQorCitGUFRvVUlJbnN0OjpGUFRvVUlJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kCispIDogQ2FzdEluc3QoVHksIEZQVG9VSSwgUywgSW5zZXJ0QXRFbmQpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIEZQVG9VSSIpOworfQorCitGUFRvU0lJbnN0OjpGUFRvU0lJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUKKykgOiBDYXN0SW5zdChUeSwgRlBUb1NJLCBTLCBJbnNlcnRCZWZvcmUpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIEZQVG9TSSIpOworfQorCitGUFRvU0lJbnN0OjpGUFRvU0lJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kCispIDogQ2FzdEluc3QoVHksIEZQVG9TSSwgUywgSW5zZXJ0QXRFbmQpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIEZQVG9TSSIpOworfQorCitQdHJUb0ludEluc3Q6OlB0clRvSW50SW5zdCgKKyAgVmFsdWUgKlMsIGNvbnN0IFR5cGUgKlR5LCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlCispIDogQ2FzdEluc3QoVHksIFB0clRvSW50LCBTLCBJbnNlcnRCZWZvcmUpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIFB0clRvSW50Iik7Cit9CisKK1B0clRvSW50SW5zdDo6UHRyVG9JbnRJbnN0KAorICBWYWx1ZSAqUywgY29uc3QgVHlwZSAqVHksIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kCispIDogQ2FzdEluc3QoVHksIFB0clRvSW50LCBTLCBJbnNlcnRBdEVuZCkgeyAKKyAgYXNzZXJ0KGNhc3RJc1ZhbGlkKGdldE9wY29kZSgpLCBTLCBUeSkgJiYgIklsbGVnYWwgUHRyVG9JbnQiKTsKK30KKworSW50VG9QdHJJbnN0OjpJbnRUb1B0ckluc3QoCisgIFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZQorKSA6IENhc3RJbnN0KFR5LCBJbnRUb1B0ciwgUywgSW5zZXJ0QmVmb3JlKSB7IAorICBhc3NlcnQoY2FzdElzVmFsaWQoZ2V0T3Bjb2RlKCksIFMsIFR5KSAmJiAiSWxsZWdhbCBJbnRUb1B0ciIpOworfQorCitJbnRUb1B0ckluc3Q6OkludFRvUHRySW5zdCgKKyAgVmFsdWUgKlMsIGNvbnN0IFR5cGUgKlR5LCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZAorKSA6IENhc3RJbnN0KFR5LCBJbnRUb1B0ciwgUywgSW5zZXJ0QXRFbmQpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIEludFRvUHRyIik7Cit9CisKK0JpdENhc3RJbnN0OjpCaXRDYXN0SW5zdCgKKyAgVmFsdWUgKlMsIGNvbnN0IFR5cGUgKlR5LCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlCispIDogQ2FzdEluc3QoVHksIEJpdENhc3QsIFMsIEluc2VydEJlZm9yZSkgeyAKKyAgYXNzZXJ0KGNhc3RJc1ZhbGlkKGdldE9wY29kZSgpLCBTLCBUeSkgJiYgIklsbGVnYWwgQml0Q2FzdCIpOworfQorCitCaXRDYXN0SW5zdDo6Qml0Q2FzdEluc3QoCisgIFZhbHVlICpTLCBjb25zdCBUeXBlICpUeSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQKKykgOiBDYXN0SW5zdChUeSwgQml0Q2FzdCwgUywgSW5zZXJ0QXRFbmQpIHsgCisgIGFzc2VydChjYXN0SXNWYWxpZChnZXRPcGNvZGUoKSwgUywgVHkpICYmICJJbGxlZ2FsIEJpdENhc3QiKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3QgQ2xhc3NlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBDbXBJbnN0OjpBbmNob3IoKSBjb25zdCB7fQorCitDbXBJbnN0OjpDbXBJbnN0KGNvbnN0IFR5cGUgKnR5LCBPdGhlck9wcyBvcCwgdW5zaWduZWQgc2hvcnQgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICA6IEluc3RydWN0aW9uKHR5LCBvcCwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPENtcEluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPENtcEluc3Q+OjpvcGVyYW5kcyh0aGlzKSwKKyAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmUpIHsKKyAgICBPcDwwPigpID0gTEhTOworICAgIE9wPDE+KCkgPSBSSFM7CisgIHNldFByZWRpY2F0ZSgoUHJlZGljYXRlKXByZWRpY2F0ZSk7Cit9CisKK0NtcEluc3Q6OkNtcEluc3QoY29uc3QgVHlwZSAqdHksIE90aGVyT3BzIG9wLCB1bnNpZ25lZCBzaG9ydCBwcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IEluc3RydWN0aW9uKHR5LCBvcCwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPENtcEluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPENtcEluc3Q+OjpvcGVyYW5kcyh0aGlzKSwKKyAgICAgICAgICAgICAgICBJbnNlcnRBdEVuZCkgeworICBPcDwwPigpID0gTEhTOworICBPcDwxPigpID0gUkhTOworICBzZXRQcmVkaWNhdGUoKFByZWRpY2F0ZSlwcmVkaWNhdGUpOworfQorCitDbXBJbnN0ICoKK0NtcEluc3Q6OkNyZWF0ZShPdGhlck9wcyBPcCwgdW5zaWduZWQgc2hvcnQgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgIFZhbHVlICpTMSwgVmFsdWUgKlMyLCAKKyAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKSB7CisgIGlmIChPcCA9PSBJbnN0cnVjdGlvbjo6SUNtcCkgeworICAgIGlmIChJbnNlcnRCZWZvcmUpCisgICAgICByZXR1cm4gbmV3IElDbXBJbnN0KEluc2VydEJlZm9yZSwgQ21wSW5zdDo6UHJlZGljYXRlKHByZWRpY2F0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFMxLCBTMik7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChDbXBJbnN0OjpQcmVkaWNhdGUocHJlZGljYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUzEsIFMyKTsKKyAgfQorICAKKyAgaWYgKEluc2VydEJlZm9yZSkKKyAgICByZXR1cm4gbmV3IEZDbXBJbnN0KEluc2VydEJlZm9yZSwgQ21wSW5zdDo6UHJlZGljYXRlKHByZWRpY2F0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBTMSwgUzIpOworICBlbHNlCisgICAgcmV0dXJuIG5ldyBGQ21wSW5zdChDbXBJbnN0OjpQcmVkaWNhdGUocHJlZGljYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFMxLCBTMik7Cit9CisKK0NtcEluc3QgKgorQ21wSW5zdDo6Q3JlYXRlKE90aGVyT3BzIE9wLCB1bnNpZ25lZCBzaG9ydCBwcmVkaWNhdGUsIFZhbHVlICpTMSwgVmFsdWUgKlMyLCAKKyAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICBpZiAoT3AgPT0gSW5zdHJ1Y3Rpb246OklDbXApIHsKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KCpJbnNlcnRBdEVuZCwgQ21wSW5zdDo6UHJlZGljYXRlKHByZWRpY2F0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBTMSwgUzIpOworICB9CisgIHJldHVybiBuZXcgRkNtcEluc3QoKkluc2VydEF0RW5kLCBDbXBJbnN0OjpQcmVkaWNhdGUocHJlZGljYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICBTMSwgUzIpOworfQorCit2b2lkIENtcEluc3Q6OnN3YXBPcGVyYW5kcygpIHsKKyAgaWYgKElDbXBJbnN0ICpJQyA9IGR5bl9jYXN0PElDbXBJbnN0Pih0aGlzKSkKKyAgICBJQy0+c3dhcE9wZXJhbmRzKCk7CisgIGVsc2UKKyAgICBjYXN0PEZDbXBJbnN0Pih0aGlzKS0+c3dhcE9wZXJhbmRzKCk7Cit9CisKK2Jvb2wgQ21wSW5zdDo6aXNDb21tdXRhdGl2ZSgpIHsKKyAgaWYgKElDbXBJbnN0ICpJQyA9IGR5bl9jYXN0PElDbXBJbnN0Pih0aGlzKSkKKyAgICByZXR1cm4gSUMtPmlzQ29tbXV0YXRpdmUoKTsKKyAgcmV0dXJuIGNhc3Q8RkNtcEluc3Q+KHRoaXMpLT5pc0NvbW11dGF0aXZlKCk7Cit9CisKK2Jvb2wgQ21wSW5zdDo6aXNFcXVhbGl0eSgpIHsKKyAgaWYgKElDbXBJbnN0ICpJQyA9IGR5bl9jYXN0PElDbXBJbnN0Pih0aGlzKSkKKyAgICByZXR1cm4gSUMtPmlzRXF1YWxpdHkoKTsKKyAgcmV0dXJuIGNhc3Q8RkNtcEluc3Q+KHRoaXMpLT5pc0VxdWFsaXR5KCk7Cit9CisKKworQ21wSW5zdDo6UHJlZGljYXRlIENtcEluc3Q6OmdldEludmVyc2VQcmVkaWNhdGUoUHJlZGljYXRlIHByZWQpIHsKKyAgc3dpdGNoIChwcmVkKSB7CisgICAgZGVmYXVsdDogYXNzZXJ0KCEiVW5rbm93biBjbXAgcHJlZGljYXRlISIpOworICAgIGNhc2UgSUNNUF9FUTogcmV0dXJuIElDTVBfTkU7CisgICAgY2FzZSBJQ01QX05FOiByZXR1cm4gSUNNUF9FUTsKKyAgICBjYXNlIElDTVBfVUdUOiByZXR1cm4gSUNNUF9VTEU7CisgICAgY2FzZSBJQ01QX1VMVDogcmV0dXJuIElDTVBfVUdFOworICAgIGNhc2UgSUNNUF9VR0U6IHJldHVybiBJQ01QX1VMVDsKKyAgICBjYXNlIElDTVBfVUxFOiByZXR1cm4gSUNNUF9VR1Q7CisgICAgY2FzZSBJQ01QX1NHVDogcmV0dXJuIElDTVBfU0xFOworICAgIGNhc2UgSUNNUF9TTFQ6IHJldHVybiBJQ01QX1NHRTsKKyAgICBjYXNlIElDTVBfU0dFOiByZXR1cm4gSUNNUF9TTFQ7CisgICAgY2FzZSBJQ01QX1NMRTogcmV0dXJuIElDTVBfU0dUOworCisgICAgY2FzZSBGQ01QX09FUTogcmV0dXJuIEZDTVBfVU5FOworICAgIGNhc2UgRkNNUF9PTkU6IHJldHVybiBGQ01QX1VFUTsKKyAgICBjYXNlIEZDTVBfT0dUOiByZXR1cm4gRkNNUF9VTEU7CisgICAgY2FzZSBGQ01QX09MVDogcmV0dXJuIEZDTVBfVUdFOworICAgIGNhc2UgRkNNUF9PR0U6IHJldHVybiBGQ01QX1VMVDsKKyAgICBjYXNlIEZDTVBfT0xFOiByZXR1cm4gRkNNUF9VR1Q7CisgICAgY2FzZSBGQ01QX1VFUTogcmV0dXJuIEZDTVBfT05FOworICAgIGNhc2UgRkNNUF9VTkU6IHJldHVybiBGQ01QX09FUTsKKyAgICBjYXNlIEZDTVBfVUdUOiByZXR1cm4gRkNNUF9PTEU7CisgICAgY2FzZSBGQ01QX1VMVDogcmV0dXJuIEZDTVBfT0dFOworICAgIGNhc2UgRkNNUF9VR0U6IHJldHVybiBGQ01QX09MVDsKKyAgICBjYXNlIEZDTVBfVUxFOiByZXR1cm4gRkNNUF9PR1Q7CisgICAgY2FzZSBGQ01QX09SRDogcmV0dXJuIEZDTVBfVU5POworICAgIGNhc2UgRkNNUF9VTk86IHJldHVybiBGQ01QX09SRDsKKyAgICBjYXNlIEZDTVBfVFJVRTogcmV0dXJuIEZDTVBfRkFMU0U7CisgICAgY2FzZSBGQ01QX0ZBTFNFOiByZXR1cm4gRkNNUF9UUlVFOworICB9Cit9CisKK0lDbXBJbnN0OjpQcmVkaWNhdGUgSUNtcEluc3Q6OmdldFNpZ25lZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCkgeworICBzd2l0Y2ggKHByZWQpIHsKKyAgICBkZWZhdWx0OiBhc3NlcnQoISAiVW5rbm93biBpY21wIHByZWRpY2F0ZSEiKTsKKyAgICBjYXNlIElDTVBfRVE6IGNhc2UgSUNNUF9ORTogCisgICAgY2FzZSBJQ01QX1NHVDogY2FzZSBJQ01QX1NMVDogY2FzZSBJQ01QX1NHRTogY2FzZSBJQ01QX1NMRTogCisgICAgICAgcmV0dXJuIHByZWQ7CisgICAgY2FzZSBJQ01QX1VHVDogcmV0dXJuIElDTVBfU0dUOworICAgIGNhc2UgSUNNUF9VTFQ6IHJldHVybiBJQ01QX1NMVDsKKyAgICBjYXNlIElDTVBfVUdFOiByZXR1cm4gSUNNUF9TR0U7CisgICAgY2FzZSBJQ01QX1VMRTogcmV0dXJuIElDTVBfU0xFOworICB9Cit9CisKK0lDbXBJbnN0OjpQcmVkaWNhdGUgSUNtcEluc3Q6OmdldFVuc2lnbmVkUHJlZGljYXRlKFByZWRpY2F0ZSBwcmVkKSB7CisgIHN3aXRjaCAocHJlZCkgeworICAgIGRlZmF1bHQ6IGFzc2VydCghICJVbmtub3duIGljbXAgcHJlZGljYXRlISIpOworICAgIGNhc2UgSUNNUF9FUTogY2FzZSBJQ01QX05FOiAKKyAgICBjYXNlIElDTVBfVUdUOiBjYXNlIElDTVBfVUxUOiBjYXNlIElDTVBfVUdFOiBjYXNlIElDTVBfVUxFOiAKKyAgICAgICByZXR1cm4gcHJlZDsKKyAgICBjYXNlIElDTVBfU0dUOiByZXR1cm4gSUNNUF9VR1Q7CisgICAgY2FzZSBJQ01QX1NMVDogcmV0dXJuIElDTVBfVUxUOworICAgIGNhc2UgSUNNUF9TR0U6IHJldHVybiBJQ01QX1VHRTsKKyAgICBjYXNlIElDTVBfU0xFOiByZXR1cm4gSUNNUF9VTEU7CisgIH0KK30KKworLy8vIEluaXRpYWxpemUgYSBzZXQgb2YgdmFsdWVzIHRoYXQgYWxsIHNhdGlzZnkgdGhlIGNvbmRpdGlvbiB3aXRoIEMuCisvLy8KK0NvbnN0YW50UmFuZ2UgCitJQ21wSW5zdDo6bWFrZUNvbnN0YW50UmFuZ2UoUHJlZGljYXRlIHByZWQsIGNvbnN0IEFQSW50ICZDKSB7CisgIEFQSW50IExvd2VyKEMpOworICBBUEludCBVcHBlcihDKTsKKyAgdWludDMyX3QgQml0V2lkdGggPSBDLmdldEJpdFdpZHRoKCk7CisgIHN3aXRjaCAocHJlZCkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIElDbXAgb3Bjb2RlIHRvIENvbnN0YW50UmFuZ2UgY3RvciEiKTsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9FUTogVXBwZXIrKzsgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfTkU6IExvd2VyKys7IGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VMVDoKKyAgICBMb3dlciA9IEFQSW50OjpnZXRNaW5WYWx1ZShCaXRXaWR0aCk7CisgICAgLy8gQ2hlY2sgZm9yIGFuIGVtcHR5LXNldCBjb25kaXRpb24uCisgICAgaWYgKExvd2VyID09IFVwcGVyKQorICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoQml0V2lkdGgsIC8qaXNGdWxsU2V0PSovZmFsc2UpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDoKKyAgICBMb3dlciA9IEFQSW50OjpnZXRTaWduZWRNaW5WYWx1ZShCaXRXaWR0aCk7CisgICAgLy8gQ2hlY2sgZm9yIGFuIGVtcHR5LXNldCBjb25kaXRpb24uCisgICAgaWYgKExvd2VyID09IFVwcGVyKQorICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoQml0V2lkdGgsIC8qaXNGdWxsU2V0PSovZmFsc2UpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHVDogCisgICAgTG93ZXIrKzsgVXBwZXIgPSBBUEludDo6Z2V0TWluVmFsdWUoQml0V2lkdGgpOyAgICAgICAgLy8gTWluID0gTmV4dChNYXgpCisgICAgLy8gQ2hlY2sgZm9yIGFuIGVtcHR5LXNldCBjb25kaXRpb24uCisgICAgaWYgKExvd2VyID09IFVwcGVyKQorICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoQml0V2lkdGgsIC8qaXNGdWxsU2V0PSovZmFsc2UpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHVDoKKyAgICBMb3dlcisrOyBVcHBlciA9IEFQSW50OjpnZXRTaWduZWRNaW5WYWx1ZShCaXRXaWR0aCk7ICAvLyBNaW4gPSBOZXh0KE1heCkKKyAgICAvLyBDaGVjayBmb3IgYW4gZW1wdHktc2V0IGNvbmRpdGlvbi4KKyAgICBpZiAoTG93ZXIgPT0gVXBwZXIpCisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShCaXRXaWR0aCwgLyppc0Z1bGxTZXQ9Ki9mYWxzZSk7CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxFOiAKKyAgICBMb3dlciA9IEFQSW50OjpnZXRNaW5WYWx1ZShCaXRXaWR0aCk7IFVwcGVyKys7IAorICAgIC8vIENoZWNrIGZvciBhIGZ1bGwtc2V0IGNvbmRpdGlvbi4KKyAgICBpZiAoTG93ZXIgPT0gVXBwZXIpCisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShCaXRXaWR0aCwgLyppc0Z1bGxTZXQ9Ki90cnVlKTsKKyAgICBicmVhazsKKyAgY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6IAorICAgIExvd2VyID0gQVBJbnQ6OmdldFNpZ25lZE1pblZhbHVlKEJpdFdpZHRoKTsgVXBwZXIrKzsgCisgICAgLy8gQ2hlY2sgZm9yIGEgZnVsbC1zZXQgY29uZGl0aW9uLgorICAgIGlmIChMb3dlciA9PSBVcHBlcikKKyAgICAgIHJldHVybiBDb25zdGFudFJhbmdlKEJpdFdpZHRoLCAvKmlzRnVsbFNldD0qL3RydWUpOworICAgIGJyZWFrOworICBjYXNlIElDbXBJbnN0OjpJQ01QX1VHRToKKyAgICBVcHBlciA9IEFQSW50OjpnZXRNaW5WYWx1ZShCaXRXaWR0aCk7ICAgICAgICAvLyBNaW4gPSBOZXh0KE1heCkKKyAgICAvLyBDaGVjayBmb3IgYSBmdWxsLXNldCBjb25kaXRpb24uCisgICAgaWYgKExvd2VyID09IFVwcGVyKQorICAgICAgcmV0dXJuIENvbnN0YW50UmFuZ2UoQml0V2lkdGgsIC8qaXNGdWxsU2V0PSovdHJ1ZSk7CisgICAgYnJlYWs7CisgIGNhc2UgSUNtcEluc3Q6OklDTVBfU0dFOgorICAgIFVwcGVyID0gQVBJbnQ6OmdldFNpZ25lZE1pblZhbHVlKEJpdFdpZHRoKTsgIC8vIE1pbiA9IE5leHQoTWF4KQorICAgIC8vIENoZWNrIGZvciBhIGZ1bGwtc2V0IGNvbmRpdGlvbi4KKyAgICBpZiAoTG93ZXIgPT0gVXBwZXIpCisgICAgICByZXR1cm4gQ29uc3RhbnRSYW5nZShCaXRXaWR0aCwgLyppc0Z1bGxTZXQ9Ki90cnVlKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gQ29uc3RhbnRSYW5nZShMb3dlciwgVXBwZXIpOworfQorCitDbXBJbnN0OjpQcmVkaWNhdGUgQ21wSW5zdDo6Z2V0U3dhcHBlZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCkgeworICBzd2l0Y2ggKHByZWQpIHsKKyAgICBkZWZhdWx0OiBhc3NlcnQoISJVbmtub3duIGNtcCBwcmVkaWNhdGUhIik7CisgICAgY2FzZSBJQ01QX0VROiBjYXNlIElDTVBfTkU6CisgICAgICByZXR1cm4gcHJlZDsKKyAgICBjYXNlIElDTVBfU0dUOiByZXR1cm4gSUNNUF9TTFQ7CisgICAgY2FzZSBJQ01QX1NMVDogcmV0dXJuIElDTVBfU0dUOworICAgIGNhc2UgSUNNUF9TR0U6IHJldHVybiBJQ01QX1NMRTsKKyAgICBjYXNlIElDTVBfU0xFOiByZXR1cm4gSUNNUF9TR0U7CisgICAgY2FzZSBJQ01QX1VHVDogcmV0dXJuIElDTVBfVUxUOworICAgIGNhc2UgSUNNUF9VTFQ6IHJldHVybiBJQ01QX1VHVDsKKyAgICBjYXNlIElDTVBfVUdFOiByZXR1cm4gSUNNUF9VTEU7CisgICAgY2FzZSBJQ01QX1VMRTogcmV0dXJuIElDTVBfVUdFOworICAKKyAgICBjYXNlIEZDTVBfRkFMU0U6IGNhc2UgRkNNUF9UUlVFOgorICAgIGNhc2UgRkNNUF9PRVE6IGNhc2UgRkNNUF9PTkU6CisgICAgY2FzZSBGQ01QX1VFUTogY2FzZSBGQ01QX1VORToKKyAgICBjYXNlIEZDTVBfT1JEOiBjYXNlIEZDTVBfVU5POgorICAgICAgcmV0dXJuIHByZWQ7CisgICAgY2FzZSBGQ01QX09HVDogcmV0dXJuIEZDTVBfT0xUOworICAgIGNhc2UgRkNNUF9PTFQ6IHJldHVybiBGQ01QX09HVDsKKyAgICBjYXNlIEZDTVBfT0dFOiByZXR1cm4gRkNNUF9PTEU7CisgICAgY2FzZSBGQ01QX09MRTogcmV0dXJuIEZDTVBfT0dFOworICAgIGNhc2UgRkNNUF9VR1Q6IHJldHVybiBGQ01QX1VMVDsKKyAgICBjYXNlIEZDTVBfVUxUOiByZXR1cm4gRkNNUF9VR1Q7CisgICAgY2FzZSBGQ01QX1VHRTogcmV0dXJuIEZDTVBfVUxFOworICAgIGNhc2UgRkNNUF9VTEU6IHJldHVybiBGQ01QX1VHRTsKKyAgfQorfQorCitib29sIENtcEluc3Q6OmlzVW5zaWduZWQodW5zaWduZWQgc2hvcnQgcHJlZGljYXRlKSB7CisgIHN3aXRjaCAocHJlZGljYXRlKSB7CisgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUxUOiBjYXNlIElDbXBJbnN0OjpJQ01QX1VMRTogY2FzZSBJQ21wSW5zdDo6SUNNUF9VR1Q6IAorICAgIGNhc2UgSUNtcEluc3Q6OklDTVBfVUdFOiByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitib29sIENtcEluc3Q6OmlzU2lnbmVkKHVuc2lnbmVkIHNob3J0IHByZWRpY2F0ZSkgeworICBzd2l0Y2ggKHByZWRpY2F0ZSkgeworICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NMVDogY2FzZSBJQ21wSW5zdDo6SUNNUF9TTEU6IGNhc2UgSUNtcEluc3Q6OklDTVBfU0dUOiAKKyAgICBjYXNlIElDbXBJbnN0OjpJQ01QX1NHRTogcmV0dXJuIHRydWU7CisgIH0KK30KKworYm9vbCBDbXBJbnN0Ojppc09yZGVyZWQodW5zaWduZWQgc2hvcnQgcHJlZGljYXRlKSB7CisgIHN3aXRjaCAocHJlZGljYXRlKSB7CisgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0VROiBjYXNlIEZDbXBJbnN0OjpGQ01QX09ORTogY2FzZSBGQ21wSW5zdDo6RkNNUF9PR1Q6IAorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT0xUOiBjYXNlIEZDbXBJbnN0OjpGQ01QX09HRTogY2FzZSBGQ21wSW5zdDo6RkNNUF9PTEU6IAorICAgIGNhc2UgRkNtcEluc3Q6OkZDTVBfT1JEOiByZXR1cm4gdHJ1ZTsKKyAgfQorfQorICAgICAgCitib29sIENtcEluc3Q6OmlzVW5vcmRlcmVkKHVuc2lnbmVkIHNob3J0IHByZWRpY2F0ZSkgeworICBzd2l0Y2ggKHByZWRpY2F0ZSkgeworICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VFUTogY2FzZSBGQ21wSW5zdDo6RkNNUF9VTkU6IGNhc2UgRkNtcEluc3Q6OkZDTVBfVUdUOiAKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VMVDogY2FzZSBGQ21wSW5zdDo6RkNNUF9VR0U6IGNhc2UgRkNtcEluc3Q6OkZDTVBfVUxFOiAKKyAgICBjYXNlIEZDbXBJbnN0OjpGQ01QX1VOTzogcmV0dXJuIHRydWU7CisgIH0KK30KKworYm9vbCBDbXBJbnN0Ojppc1RydWVXaGVuRXF1YWwodW5zaWduZWQgc2hvcnQgcHJlZGljYXRlKSB7CisgIHN3aXRjaChwcmVkaWNhdGUpIHsKKyAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBJQ01QX0VROiAgIGNhc2UgSUNNUF9VR0U6IGNhc2UgSUNNUF9VTEU6IGNhc2UgSUNNUF9TR0U6IGNhc2UgSUNNUF9TTEU6CisgICAgY2FzZSBGQ01QX1RSVUU6IGNhc2UgRkNNUF9VRVE6IGNhc2UgRkNNUF9VR0U6IGNhc2UgRkNNUF9VTEU6IHJldHVybiB0cnVlOworICB9Cit9CisKK2Jvb2wgQ21wSW5zdDo6aXNGYWxzZVdoZW5FcXVhbCh1bnNpZ25lZCBzaG9ydCBwcmVkaWNhdGUpIHsKKyAgc3dpdGNoKHByZWRpY2F0ZSkgeworICBjYXNlIElDTVBfTkU6ICAgIGNhc2UgSUNNUF9VR1Q6IGNhc2UgSUNNUF9VTFQ6IGNhc2UgSUNNUF9TR1Q6IGNhc2UgSUNNUF9TTFQ6CisgIGNhc2UgRkNNUF9GQUxTRTogY2FzZSBGQ01QX09ORTogY2FzZSBGQ01QX09HVDogY2FzZSBGQ01QX09MVDogcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgfQorfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaEluc3QgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgU3dpdGNoSW5zdDo6aW5pdChWYWx1ZSAqVmFsdWUsIEJhc2ljQmxvY2sgKkRlZmF1bHQsIHVuc2lnbmVkIE51bUNhc2VzKSB7CisgIGFzc2VydChWYWx1ZSAmJiBEZWZhdWx0KTsKKyAgUmVzZXJ2ZWRTcGFjZSA9IDIrTnVtQ2FzZXMqMjsKKyAgTnVtT3BlcmFuZHMgPSAyOworICBPcGVyYW5kTGlzdCA9IGFsbG9jSHVuZ29mZlVzZXMoUmVzZXJ2ZWRTcGFjZSk7CisKKyAgT3BlcmFuZExpc3RbMF0gPSBWYWx1ZTsKKyAgT3BlcmFuZExpc3RbMV0gPSBEZWZhdWx0OworfQorCisvLy8gU3dpdGNoSW5zdCBjdG9yIC0gQ3JlYXRlIGEgbmV3IHN3aXRjaCBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhIHZhbHVlIHRvCisvLy8gc3dpdGNoIG9uIGFuZCBhIGRlZmF1bHQgZGVzdGluYXRpb24uICBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY2FzZXMgY2FuCisvLy8gYmUgc3BlY2lmaWVkIGhlcmUgdG8gbWFrZSBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmljaWVudC4gIFRoaXMKKy8vLyBjb25zdHJ1Y3RvciBjYW4gYWxzbyBhdXRvaW5zZXJ0IGJlZm9yZSBhbm90aGVyIGluc3RydWN0aW9uLgorU3dpdGNoSW5zdDo6U3dpdGNoSW5zdChWYWx1ZSAqVmFsdWUsIEJhc2ljQmxvY2sgKkRlZmF1bHQsIHVuc2lnbmVkIE51bUNhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICA6IFRlcm1pbmF0b3JJbnN0KFR5cGU6OmdldFZvaWRUeShWYWx1ZS0+Z2V0Q29udGV4dCgpKSwgSW5zdHJ1Y3Rpb246OlN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAwLCAwLCBJbnNlcnRCZWZvcmUpIHsKKyAgaW5pdChWYWx1ZSwgRGVmYXVsdCwgTnVtQ2FzZXMpOworfQorCisvLy8gU3dpdGNoSW5zdCBjdG9yIC0gQ3JlYXRlIGEgbmV3IHN3aXRjaCBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhIHZhbHVlIHRvCisvLy8gc3dpdGNoIG9uIGFuZCBhIGRlZmF1bHQgZGVzdGluYXRpb24uICBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY2FzZXMgY2FuCisvLy8gYmUgc3BlY2lmaWVkIGhlcmUgdG8gbWFrZSBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmljaWVudC4gIFRoaXMKKy8vLyBjb25zdHJ1Y3RvciBhbHNvIGF1dG9pbnNlcnRzIGF0IHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBCYXNpY0Jsb2NrLgorU3dpdGNoSW5zdDo6U3dpdGNoSW5zdChWYWx1ZSAqVmFsdWUsIEJhc2ljQmxvY2sgKkRlZmF1bHQsIHVuc2lnbmVkIE51bUNhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgOiBUZXJtaW5hdG9ySW5zdChUeXBlOjpnZXRWb2lkVHkoVmFsdWUtPmdldENvbnRleHQoKSksIEluc3RydWN0aW9uOjpTd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgMCwgMCwgSW5zZXJ0QXRFbmQpIHsKKyAgaW5pdChWYWx1ZSwgRGVmYXVsdCwgTnVtQ2FzZXMpOworfQorCitTd2l0Y2hJbnN0OjpTd2l0Y2hJbnN0KGNvbnN0IFN3aXRjaEluc3QgJlNJKQorICA6IFRlcm1pbmF0b3JJbnN0KFR5cGU6OmdldFZvaWRUeShTSS5nZXRDb250ZXh0KCkpLCBJbnN0cnVjdGlvbjo6U3dpdGNoLAorICAgICAgICAgICAgICAgICAgIGFsbG9jSHVuZ29mZlVzZXMoU0kuZ2V0TnVtT3BlcmFuZHMoKSksIFNJLmdldE51bU9wZXJhbmRzKCkpIHsKKyAgVXNlICpPTCA9IE9wZXJhbmRMaXN0LCAqSW5PTCA9IFNJLk9wZXJhbmRMaXN0OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBFID0gU0kuZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBFOyBpKz0yKSB7CisgICAgT0xbaV0gPSBJbk9MW2ldOworICAgIE9MW2krMV0gPSBJbk9MW2krMV07CisgIH0KKyAgU3ViY2xhc3NPcHRpb25hbERhdGEgPSBTSS5TdWJjbGFzc09wdGlvbmFsRGF0YTsKK30KKworU3dpdGNoSW5zdDo6flN3aXRjaEluc3QoKSB7CisgIGRyb3BIdW5nb2ZmVXNlcyhPcGVyYW5kTGlzdCk7Cit9CisKKworLy8vIGFkZENhc2UgLSBBZGQgYW4gZW50cnkgdG8gdGhlIHN3aXRjaCBpbnN0cnVjdGlvbi4uLgorLy8vCit2b2lkIFN3aXRjaEluc3Q6OmFkZENhc2UoQ29uc3RhbnRJbnQgKk9uVmFsLCBCYXNpY0Jsb2NrICpEZXN0KSB7CisgIHVuc2lnbmVkIE9wTm8gPSBOdW1PcGVyYW5kczsKKyAgaWYgKE9wTm8rMiA+IFJlc2VydmVkU3BhY2UpCisgICAgcmVzaXplT3BlcmFuZHMoMCk7ICAvLyBHZXQgbW9yZSBzcGFjZSEKKyAgLy8gSW5pdGlhbGl6ZSBzb21lIG5ldyBvcGVyYW5kcy4KKyAgYXNzZXJ0KE9wTm8rMSA8IFJlc2VydmVkU3BhY2UgJiYgIkdyb3dpbmcgZGlkbid0IHdvcmshIik7CisgIE51bU9wZXJhbmRzID0gT3BObysyOworICBPcGVyYW5kTGlzdFtPcE5vXSA9IE9uVmFsOworICBPcGVyYW5kTGlzdFtPcE5vKzFdID0gRGVzdDsKK30KKworLy8vIHJlbW92ZUNhc2UgLSBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yIGZyb20gdGhlIHN3aXRjaAorLy8vIGluc3RydWN0aW9uLiAgTm90ZSB0aGF0IHRoaXMgY2Fubm90IGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBkZWZhdWx0CisvLy8gZGVzdGluYXRpb24gKHN1Y2Nlc3NvciAjMCkuCisvLy8KK3ZvaWQgU3dpdGNoSW5zdDo6cmVtb3ZlQ2FzZSh1bnNpZ25lZCBpZHgpIHsKKyAgYXNzZXJ0KGlkeCAhPSAwICYmICJDYW5ub3QgcmVtb3ZlIHRoZSBkZWZhdWx0IGNhc2UhIik7CisgIGFzc2VydChpZHgqMiA8IGdldE51bU9wZXJhbmRzKCkgJiYgIlN1Y2Nlc3NvciBpbmRleCBvdXQgb2YgcmFuZ2UhISEiKTsKKworICB1bnNpZ25lZCBOdW1PcHMgPSBnZXROdW1PcGVyYW5kcygpOworICBVc2UgKk9MID0gT3BlcmFuZExpc3Q7CisKKyAgLy8gTW92ZSBldmVyeXRoaW5nIGFmdGVyIHRoaXMgb3BlcmFuZCBkb3duLgorICAvLworICAvLyBGSVhNRTogd2UgY291bGQganVzdCBzd2FwIHdpdGggdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlbiBlcmFzZS4gIEhvd2V2ZXIsCisgIC8vIGNsaWVudCBtaWdodCBub3QgZXhwZWN0IHRoaXMgdG8gaGFwcGVuLiAgVGhlIGNvZGUgYXMgaXQgaXMgdGhyYXNoZXMgdGhlCisgIC8vIHVzZS9kZWYgbGlzdHMsIHdoaWNoIGlzIGtpbmRhIGxhbWUuCisgIGZvciAodW5zaWduZWQgaSA9IChpZHgrMSkqMjsgaSAhPSBOdW1PcHM7IGkgKz0gMikgeworICAgIE9MW2ktMl0gPSBPTFtpXTsKKyAgICBPTFtpLTIrMV0gPSBPTFtpKzFdOworICB9CisKKyAgLy8gTnVrZSB0aGUgbGFzdCB2YWx1ZS4KKyAgT0xbTnVtT3BzLTJdLnNldCgwKTsKKyAgT0xbTnVtT3BzLTIrMV0uc2V0KDApOworICBOdW1PcGVyYW5kcyA9IE51bU9wcy0yOworfQorCisvLy8gcmVzaXplT3BlcmFuZHMgLSByZXNpemUgb3BlcmFuZHMgLSBUaGlzIGFkanVzdHMgdGhlIGxlbmd0aCBvZiB0aGUgb3BlcmFuZHMKKy8vLyBsaXN0IGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGJlaGF2aW9yOgorLy8vICAgMS4gSWYgTnVtT3BzID09IDAsIGdyb3cgdGhlIG9wZXJhbmQgbGlzdCBpbiByZXNwb25zZSB0byBhIHB1c2hfYmFjayBzdHlsZQorLy8vICAgICAgb2Ygb3BlcmF0aW9uLiAgVGhpcyBncm93cyB0aGUgbnVtYmVyIG9mIG9wcyBieSAzIHRpbWVzLgorLy8vICAgMi4gSWYgTnVtT3BzID4gTnVtT3BlcmFuZHMsIHJlc2VydmUgc3BhY2UgZm9yIE51bU9wcyBvcGVyYW5kcy4KKy8vLyAgIDMuIElmIE51bU9wcyA9PSBOdW1PcGVyYW5kcywgdHJpbSB0aGUgcmVzZXJ2ZWQgc3BhY2UuCisvLy8KK3ZvaWQgU3dpdGNoSW5zdDo6cmVzaXplT3BlcmFuZHModW5zaWduZWQgTnVtT3BzKSB7CisgIHVuc2lnbmVkIGUgPSBnZXROdW1PcGVyYW5kcygpOworICBpZiAoTnVtT3BzID09IDApIHsKKyAgICBOdW1PcHMgPSBlKjM7CisgIH0gZWxzZSBpZiAoTnVtT3BzKjIgPiBOdW1PcGVyYW5kcykgeworICAgIC8vIE5vIHJlc2l6ZSBuZWVkZWQuCisgICAgaWYgKFJlc2VydmVkU3BhY2UgPj0gTnVtT3BzKSByZXR1cm47CisgIH0gZWxzZSBpZiAoTnVtT3BzID09IE51bU9wZXJhbmRzKSB7CisgICAgaWYgKFJlc2VydmVkU3BhY2UgPT0gTnVtT3BzKSByZXR1cm47CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9CisKKyAgUmVzZXJ2ZWRTcGFjZSA9IE51bU9wczsKKyAgVXNlICpOZXdPcHMgPSBhbGxvY0h1bmdvZmZVc2VzKE51bU9wcyk7CisgIFVzZSAqT2xkT3BzID0gT3BlcmFuZExpc3Q7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gZTsgKytpKSB7CisgICAgICBOZXdPcHNbaV0gPSBPbGRPcHNbaV07CisgIH0KKyAgT3BlcmFuZExpc3QgPSBOZXdPcHM7CisgIGlmIChPbGRPcHMpIFVzZTo6emFwKE9sZE9wcywgT2xkT3BzICsgZSwgdHJ1ZSk7Cit9CisKKworQmFzaWNCbG9jayAqU3dpdGNoSW5zdDo6Z2V0U3VjY2Vzc29yVih1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN1Y2Nlc3NvcihpZHgpOworfQordW5zaWduZWQgU3dpdGNoSW5zdDo6Z2V0TnVtU3VjY2Vzc29yc1YoKSBjb25zdCB7CisgIHJldHVybiBnZXROdW1TdWNjZXNzb3JzKCk7Cit9Cit2b2lkIFN3aXRjaEluc3Q6OnNldFN1Y2Nlc3NvclYodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpCKSB7CisgIHNldFN1Y2Nlc3NvcihpZHgsIEIpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hJbnN0IEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIEluZGlyZWN0QnJJbnN0Ojppbml0KFZhbHVlICpBZGRyZXNzLCB1bnNpZ25lZCBOdW1EZXN0cykgeworICBhc3NlcnQoQWRkcmVzcyAmJiBBZGRyZXNzLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkgJiYKKyAgICAgICAgICJBZGRyZXNzIG9mIGluZGlyZWN0YnIgbXVzdCBiZSBhIHBvaW50ZXIiKTsKKyAgUmVzZXJ2ZWRTcGFjZSA9IDErTnVtRGVzdHM7CisgIE51bU9wZXJhbmRzID0gMTsKKyAgT3BlcmFuZExpc3QgPSBhbGxvY0h1bmdvZmZVc2VzKFJlc2VydmVkU3BhY2UpOworICAKKyAgT3BlcmFuZExpc3RbMF0gPSBBZGRyZXNzOworfQorCisKKy8vLyByZXNpemVPcGVyYW5kcyAtIHJlc2l6ZSBvcGVyYW5kcyAtIFRoaXMgYWRqdXN0cyB0aGUgbGVuZ3RoIG9mIHRoZSBvcGVyYW5kcworLy8vIGxpc3QgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3I6CisvLy8gICAxLiBJZiBOdW1PcHMgPT0gMCwgZ3JvdyB0aGUgb3BlcmFuZCBsaXN0IGluIHJlc3BvbnNlIHRvIGEgcHVzaF9iYWNrIHN0eWxlCisvLy8gICAgICBvZiBvcGVyYXRpb24uICBUaGlzIGdyb3dzIHRoZSBudW1iZXIgb2Ygb3BzIGJ5IDIgdGltZXMuCisvLy8gICAyLiBJZiBOdW1PcHMgPiBOdW1PcGVyYW5kcywgcmVzZXJ2ZSBzcGFjZSBmb3IgTnVtT3BzIG9wZXJhbmRzLgorLy8vICAgMy4gSWYgTnVtT3BzID09IE51bU9wZXJhbmRzLCB0cmltIHRoZSByZXNlcnZlZCBzcGFjZS4KKy8vLwordm9pZCBJbmRpcmVjdEJySW5zdDo6cmVzaXplT3BlcmFuZHModW5zaWduZWQgTnVtT3BzKSB7CisgIHVuc2lnbmVkIGUgPSBnZXROdW1PcGVyYW5kcygpOworICBpZiAoTnVtT3BzID09IDApIHsKKyAgICBOdW1PcHMgPSBlKjI7CisgIH0gZWxzZSBpZiAoTnVtT3BzKjIgPiBOdW1PcGVyYW5kcykgeworICAgIC8vIE5vIHJlc2l6ZSBuZWVkZWQuCisgICAgaWYgKFJlc2VydmVkU3BhY2UgPj0gTnVtT3BzKSByZXR1cm47CisgIH0gZWxzZSBpZiAoTnVtT3BzID09IE51bU9wZXJhbmRzKSB7CisgICAgaWYgKFJlc2VydmVkU3BhY2UgPT0gTnVtT3BzKSByZXR1cm47CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9CisgIAorICBSZXNlcnZlZFNwYWNlID0gTnVtT3BzOworICBVc2UgKk5ld09wcyA9IGFsbG9jSHVuZ29mZlVzZXMoTnVtT3BzKTsKKyAgVXNlICpPbGRPcHMgPSBPcGVyYW5kTGlzdDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBlOyArK2kpCisgICAgTmV3T3BzW2ldID0gT2xkT3BzW2ldOworICBPcGVyYW5kTGlzdCA9IE5ld09wczsKKyAgaWYgKE9sZE9wcykgVXNlOjp6YXAoT2xkT3BzLCBPbGRPcHMgKyBlLCB0cnVlKTsKK30KKworSW5kaXJlY3RCckluc3Q6OkluZGlyZWN0QnJJbnN0KFZhbHVlICpBZGRyZXNzLCB1bnNpZ25lZCBOdW1DYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorOiBUZXJtaW5hdG9ySW5zdChUeXBlOjpnZXRWb2lkVHkoQWRkcmVzcy0+Z2V0Q29udGV4dCgpKSxJbnN0cnVjdGlvbjo6SW5kaXJlY3RCciwKKyAgICAgICAgICAgICAgICAgMCwgMCwgSW5zZXJ0QmVmb3JlKSB7CisgIGluaXQoQWRkcmVzcywgTnVtQ2FzZXMpOworfQorCitJbmRpcmVjdEJySW5zdDo6SW5kaXJlY3RCckluc3QoVmFsdWUgKkFkZHJlc3MsIHVuc2lnbmVkIE51bUNhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorOiBUZXJtaW5hdG9ySW5zdChUeXBlOjpnZXRWb2lkVHkoQWRkcmVzcy0+Z2V0Q29udGV4dCgpKSxJbnN0cnVjdGlvbjo6SW5kaXJlY3RCciwKKyAgICAgICAgICAgICAgICAgMCwgMCwgSW5zZXJ0QXRFbmQpIHsKKyAgaW5pdChBZGRyZXNzLCBOdW1DYXNlcyk7Cit9CisKK0luZGlyZWN0QnJJbnN0OjpJbmRpcmVjdEJySW5zdChjb25zdCBJbmRpcmVjdEJySW5zdCAmSUJJKQorICA6IFRlcm1pbmF0b3JJbnN0KFR5cGU6OmdldFZvaWRUeShJQkkuZ2V0Q29udGV4dCgpKSwgSW5zdHJ1Y3Rpb246OkluZGlyZWN0QnIsCisgICAgICAgICAgICAgICAgICAgYWxsb2NIdW5nb2ZmVXNlcyhJQkkuZ2V0TnVtT3BlcmFuZHMoKSksCisgICAgICAgICAgICAgICAgICAgSUJJLmdldE51bU9wZXJhbmRzKCkpIHsKKyAgVXNlICpPTCA9IE9wZXJhbmRMaXN0LCAqSW5PTCA9IElCSS5PcGVyYW5kTGlzdDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgRSA9IElCSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IEU7ICsraSkKKyAgICBPTFtpXSA9IEluT0xbaV07CisgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0gSUJJLlN1YmNsYXNzT3B0aW9uYWxEYXRhOworfQorCitJbmRpcmVjdEJySW5zdDo6fkluZGlyZWN0QnJJbnN0KCkgeworICBkcm9wSHVuZ29mZlVzZXMoT3BlcmFuZExpc3QpOworfQorCisvLy8gYWRkRGVzdGluYXRpb24gLSBBZGQgYSBkZXN0aW5hdGlvbi4KKy8vLwordm9pZCBJbmRpcmVjdEJySW5zdDo6YWRkRGVzdGluYXRpb24oQmFzaWNCbG9jayAqRGVzdEJCKSB7CisgIHVuc2lnbmVkIE9wTm8gPSBOdW1PcGVyYW5kczsKKyAgaWYgKE9wTm8rMSA+IFJlc2VydmVkU3BhY2UpCisgICAgcmVzaXplT3BlcmFuZHMoMCk7ICAvLyBHZXQgbW9yZSBzcGFjZSEKKyAgLy8gSW5pdGlhbGl6ZSBzb21lIG5ldyBvcGVyYW5kcy4KKyAgYXNzZXJ0KE9wTm8gPCBSZXNlcnZlZFNwYWNlICYmICJHcm93aW5nIGRpZG4ndCB3b3JrISIpOworICBOdW1PcGVyYW5kcyA9IE9wTm8rMTsKKyAgT3BlcmFuZExpc3RbT3BOb10gPSBEZXN0QkI7Cit9CisKKy8vLyByZW1vdmVEZXN0aW5hdGlvbiAtIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBzdWNjZXNzb3IgZnJvbSB0aGUKKy8vLyBpbmRpcmVjdGJyIGluc3RydWN0aW9uLgordm9pZCBJbmRpcmVjdEJySW5zdDo6cmVtb3ZlRGVzdGluYXRpb24odW5zaWduZWQgaWR4KSB7CisgIGFzc2VydChpZHggPCBnZXROdW1PcGVyYW5kcygpLTEgJiYgIlN1Y2Nlc3NvciBpbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgIAorICB1bnNpZ25lZCBOdW1PcHMgPSBnZXROdW1PcGVyYW5kcygpOworICBVc2UgKk9MID0gT3BlcmFuZExpc3Q7CisKKyAgLy8gUmVwbGFjZSB0aGlzIHZhbHVlIHdpdGggdGhlIGxhc3Qgb25lLgorICBPTFtpZHgrMV0gPSBPTFtOdW1PcHMtMV07CisgIAorICAvLyBOdWtlIHRoZSBsYXN0IHZhbHVlLgorICBPTFtOdW1PcHMtMV0uc2V0KDApOworICBOdW1PcGVyYW5kcyA9IE51bU9wcy0xOworfQorCitCYXNpY0Jsb2NrICpJbmRpcmVjdEJySW5zdDo6Z2V0U3VjY2Vzc29yVih1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN1Y2Nlc3NvcihpZHgpOworfQordW5zaWduZWQgSW5kaXJlY3RCckluc3Q6OmdldE51bVN1Y2Nlc3NvcnNWKCkgY29uc3QgeworICByZXR1cm4gZ2V0TnVtU3VjY2Vzc29ycygpOworfQordm9pZCBJbmRpcmVjdEJySW5zdDo6c2V0U3VjY2Vzc29yVih1bnNpZ25lZCBpZHgsIEJhc2ljQmxvY2sgKkIpIHsKKyAgc2V0U3VjY2Vzc29yKGlkeCwgQik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lX2ltcGwoKSBpbXBsZW1lbnRhdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIERlZmluZSB0aGVzZSBtZXRob2RzIGhlcmUgc28gdnRhYmxlcyBkb24ndCBnZXQgZW1pdHRlZCBpbnRvIGV2ZXJ5IHRyYW5zbGF0aW9uCisvLyB1bml0IHRoYXQgdXNlcyB0aGVzZSBjbGFzc2VzLgorCitHZXRFbGVtZW50UHRySW5zdCAqR2V0RWxlbWVudFB0ckluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcgKGdldE51bU9wZXJhbmRzKCkpIEdldEVsZW1lbnRQdHJJbnN0KCp0aGlzKTsKK30KKworQmluYXJ5T3BlcmF0b3IgKkJpbmFyeU9wZXJhdG9yOjpjbG9uZV9pbXBsKCkgY29uc3QgeworICByZXR1cm4gQ3JlYXRlKGdldE9wY29kZSgpLCBPcDwwPigpLCBPcDwxPigpKTsKK30KKworRkNtcEluc3QqIEZDbXBJbnN0OjpjbG9uZV9pbXBsKCkgY29uc3QgeworICByZXR1cm4gbmV3IEZDbXBJbnN0KGdldFByZWRpY2F0ZSgpLCBPcDwwPigpLCBPcDwxPigpKTsKK30KKworSUNtcEluc3QqIElDbXBJbnN0OjpjbG9uZV9pbXBsKCkgY29uc3QgeworICByZXR1cm4gbmV3IElDbXBJbnN0KGdldFByZWRpY2F0ZSgpLCBPcDwwPigpLCBPcDwxPigpKTsKK30KKworRXh0cmFjdFZhbHVlSW5zdCAqRXh0cmFjdFZhbHVlSW5zdDo6Y2xvbmVfaW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBFeHRyYWN0VmFsdWVJbnN0KCp0aGlzKTsKK30KKworSW5zZXJ0VmFsdWVJbnN0ICpJbnNlcnRWYWx1ZUluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcgSW5zZXJ0VmFsdWVJbnN0KCp0aGlzKTsKK30KKworQWxsb2NhSW5zdCAqQWxsb2NhSW5zdDo6Y2xvbmVfaW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBBbGxvY2FJbnN0KGdldEFsbG9jYXRlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChWYWx1ZSopZ2V0T3BlcmFuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFsaWdubWVudCgpKTsKK30KKworTG9hZEluc3QgKkxvYWRJbnN0OjpjbG9uZV9pbXBsKCkgY29uc3QgeworICByZXR1cm4gbmV3IExvYWRJbnN0KGdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgaXNWb2xhdGlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGdldEFsaWdubWVudCgpKTsKK30KKworU3RvcmVJbnN0ICpTdG9yZUluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcgU3RvcmVJbnN0KGdldE9wZXJhbmQoMCksIGdldE9wZXJhbmQoMSksCisgICAgICAgICAgICAgICAgICAgICAgIGlzVm9sYXRpbGUoKSwgZ2V0QWxpZ25tZW50KCkpOworfQorCitUcnVuY0luc3QgKlRydW5jSW5zdDo6Y2xvbmVfaW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBUcnVuY0luc3QoZ2V0T3BlcmFuZCgwKSwgZ2V0VHlwZSgpKTsKK30KKworWkV4dEluc3QgKlpFeHRJbnN0OjpjbG9uZV9pbXBsKCkgY29uc3QgeworICByZXR1cm4gbmV3IFpFeHRJbnN0KGdldE9wZXJhbmQoMCksIGdldFR5cGUoKSk7Cit9CisKK1NFeHRJbnN0ICpTRXh0SW5zdDo6Y2xvbmVfaW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBTRXh0SW5zdChnZXRPcGVyYW5kKDApLCBnZXRUeXBlKCkpOworfQorCitGUFRydW5jSW5zdCAqRlBUcnVuY0luc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcgRlBUcnVuY0luc3QoZ2V0T3BlcmFuZCgwKSwgZ2V0VHlwZSgpKTsKK30KKworRlBFeHRJbnN0ICpGUEV4dEluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcgRlBFeHRJbnN0KGdldE9wZXJhbmQoMCksIGdldFR5cGUoKSk7Cit9CisKK1VJVG9GUEluc3QgKlVJVG9GUEluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcgVUlUb0ZQSW5zdChnZXRPcGVyYW5kKDApLCBnZXRUeXBlKCkpOworfQorCitTSVRvRlBJbnN0ICpTSVRvRlBJbnN0OjpjbG9uZV9pbXBsKCkgY29uc3QgeworICByZXR1cm4gbmV3IFNJVG9GUEluc3QoZ2V0T3BlcmFuZCgwKSwgZ2V0VHlwZSgpKTsKK30KKworRlBUb1VJSW5zdCAqRlBUb1VJSW5zdDo6Y2xvbmVfaW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBGUFRvVUlJbnN0KGdldE9wZXJhbmQoMCksIGdldFR5cGUoKSk7Cit9CisKK0ZQVG9TSUluc3QgKkZQVG9TSUluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcgRlBUb1NJSW5zdChnZXRPcGVyYW5kKDApLCBnZXRUeXBlKCkpOworfQorCitQdHJUb0ludEluc3QgKlB0clRvSW50SW5zdDo6Y2xvbmVfaW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBQdHJUb0ludEluc3QoZ2V0T3BlcmFuZCgwKSwgZ2V0VHlwZSgpKTsKK30KKworSW50VG9QdHJJbnN0ICpJbnRUb1B0ckluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcgSW50VG9QdHJJbnN0KGdldE9wZXJhbmQoMCksIGdldFR5cGUoKSk7Cit9CisKK0JpdENhc3RJbnN0ICpCaXRDYXN0SW5zdDo6Y2xvbmVfaW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBCaXRDYXN0SW5zdChnZXRPcGVyYW5kKDApLCBnZXRUeXBlKCkpOworfQorCitDYWxsSW5zdCAqQ2FsbEluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiAgbmV3KGdldE51bU9wZXJhbmRzKCkpIENhbGxJbnN0KCp0aGlzKTsKK30KKworU2VsZWN0SW5zdCAqU2VsZWN0SW5zdDo6Y2xvbmVfaW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIFNlbGVjdEluc3Q6OkNyZWF0ZShnZXRPcGVyYW5kKDApLCBnZXRPcGVyYW5kKDEpLCBnZXRPcGVyYW5kKDIpKTsKK30KKworRXh0cmFjdEVsZW1lbnRJbnN0ICpFeHRyYWN0RWxlbWVudEluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBFeHRyYWN0RWxlbWVudEluc3Q6OkNyZWF0ZShnZXRPcGVyYW5kKDApLCBnZXRPcGVyYW5kKDEpKTsKK30KKworSW5zZXJ0RWxlbWVudEluc3QgKkluc2VydEVsZW1lbnRJbnN0OjpjbG9uZV9pbXBsKCkgY29uc3QgeworICByZXR1cm4gSW5zZXJ0RWxlbWVudEluc3Q6OkNyZWF0ZShnZXRPcGVyYW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYW5kKDIpKTsKK30KKworU2h1ZmZsZVZlY3Rvckluc3QgKlNodWZmbGVWZWN0b3JJbnN0OjpjbG9uZV9pbXBsKCkgY29uc3QgeworICByZXR1cm4gbmV3IFNodWZmbGVWZWN0b3JJbnN0KGdldE9wZXJhbmQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYW5kKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3BlcmFuZCgyKSk7Cit9CisKK1BISU5vZGUgKlBISU5vZGU6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcgUEhJTm9kZSgqdGhpcyk7Cit9CisKK1JldHVybkluc3QgKlJldHVybkluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHJldHVybiBuZXcoZ2V0TnVtT3BlcmFuZHMoKSkgUmV0dXJuSW5zdCgqdGhpcyk7Cit9CisKK0JyYW5jaEluc3QgKkJyYW5jaEluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIHVuc2lnbmVkIE9wcyhnZXROdW1PcGVyYW5kcygpKTsKKyAgcmV0dXJuIG5ldyhPcHMsIE9wcyA9PSAxKSBCcmFuY2hJbnN0KCp0aGlzKTsKK30KKworU3dpdGNoSW5zdCAqU3dpdGNoSW5zdDo6Y2xvbmVfaW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBTd2l0Y2hJbnN0KCp0aGlzKTsKK30KKworSW5kaXJlY3RCckluc3QgKkluZGlyZWN0QnJJbnN0OjpjbG9uZV9pbXBsKCkgY29uc3QgeworICByZXR1cm4gbmV3IEluZGlyZWN0QnJJbnN0KCp0aGlzKTsKK30KKworVW5yZWFjaGFibGVJbnN0ICpVbnJlYWNoYWJsZUluc3Q6OmNsb25lX2ltcGwoKSBjb25zdCB7CisgIExMVk1Db250ZXh0ICZDb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICByZXR1cm4gbmV3IFVucmVhY2hhYmxlSW5zdChDb250ZXh0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9WTUNvcmUvSW50cmluc2ljSW5zdC5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0ludHJpbnNpY0luc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YzUwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL0ludHJpbnNpY0luc3QuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LS0gSW5zdHJpbnNpY0luc3QuY3BwIC0gSW50cmluc2ljIEluc3RydWN0aW9uIFdyYXBwZXJzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgbWV0aG9kcyB0aGF0IG1ha2UgaXQgcmVhbGx5IGVhc3kgdG8gZGVhbCB3aXRoIGludHJpbnNpYworLy8gZnVuY3Rpb25zLgorLy8KKy8vIEFsbCBpbnRyaW5zaWMgZnVuY3Rpb24gY2FsbHMgYXJlIGluc3RhbmNlcyBvZiB0aGUgY2FsbCBpbnN0cnVjdGlvbiwgc28gdGhlc2UKKy8vIGFyZSBhbGwgc3ViY2xhc3NlcyBvZiB0aGUgQ2FsbEluc3QgY2xhc3MuICBOb3RlIHRoYXQgbm9uZSBvZiB0aGVzZSBjbGFzc2VzCisvLyBoYXMgc3RhdGUgb3IgdmlydHVhbCBtZXRob2RzLCB3aGljaCBpcyBhbiBpbXBvcnRhbnQgcGFydCBvZiB0aGlzIGdyb3NzL25lYXQKKy8vIGhhY2sgd29ya2luZy4KKy8vIAorLy8gSW4gc29tZSBjYXNlcywgYXJndW1lbnRzIHRvIGludHJpbnNpY3MgbmVlZCB0byBiZSBnZW5lcmljIGFuZCBhcmUgZGVmaW5lZCBhcworLy8gdHlwZSBwb2ludGVyIHRvIGVtcHR5IHN0cnVjdCB7IH0qLiAgVG8gYWNjZXNzIHRoZSByZWFsIGl0ZW0gb2YgaW50ZXJlc3QgdGhlCisvLyBjYXN0IGluc3RydWN0aW9uIG5lZWRzIHRvIGJlIHN0cmlwcGVkIGF3YXkuIAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL01ldGFkYXRhLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIFZhbHVlICpDYXN0T3BlcmFuZChWYWx1ZSAqQykgeworICBpZiAoQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oQykpCisgICAgaWYgKENFLT5pc0Nhc3QoKSkKKyAgICAgIHJldHVybiBDRS0+Z2V0T3BlcmFuZCgwKTsKKyAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0xMVk1Db250ZXh0LmNwcCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvTExWTUNvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2M2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL0xMVk1Db250ZXh0LmNwcApAQCAtMCwwICsxLDEyNyBAQAorLy89PT0tLSBMTFZNQ29udGV4dC5jcHAgLSBJbXBsZW1lbnQgTExWTUNvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgaW1wbGVtZW50cyBMTFZNQ29udGV4dCwgYXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgb3BhcXVlCisvLyAgY2xhc3MgTExWTUNvbnRleHRJbXBsLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgIkxMVk1Db250ZXh0SW1wbC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBNYW5hZ2VkU3RhdGljPExMVk1Db250ZXh0PiBHbG9iYWxDb250ZXh0OworCitMTFZNQ29udGV4dCYgbGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpIHsKKyAgcmV0dXJuICpHbG9iYWxDb250ZXh0OworfQorCitMTFZNQ29udGV4dDo6TExWTUNvbnRleHQoKSA6IHBJbXBsKG5ldyBMTFZNQ29udGV4dEltcGwoKnRoaXMpKSB7CisgIC8vIENyZWF0ZSB0aGUgZmlyc3QgbWV0YWRhdGEga2luZCwgd2hpY2ggaXMgYWx3YXlzICdkYmcnLgorICB1bnNpZ25lZCBEYmdJRCA9IGdldE1ES2luZElEKCJkYmciKTsKKyAgYXNzZXJ0KERiZ0lEID09IE1EX2RiZyAmJiAiZGJnIGtpbmQgaWQgZHJpZnRlZCIpOyAodm9pZClEYmdJRDsKK30KK0xMVk1Db250ZXh0Ojp+TExWTUNvbnRleHQoKSB7IGRlbGV0ZSBwSW1wbDsgfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmVjb3ZlcmFibGUgQmFja2VuZCBFcnJvcnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgTExWTUNvbnRleHQ6OnNldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyKHZvaWQgKkRpYWdIYW5kbGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRpYWdDb250ZXh0KSB7CisgIHBJbXBsLT5JbmxpbmVBc21EaWFnSGFuZGxlciA9IERpYWdIYW5kbGVyOworICBwSW1wbC0+SW5saW5lQXNtRGlhZ0NvbnRleHQgPSBEaWFnQ29udGV4dDsKK30KKworLy8vIGdldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyIC0gUmV0dXJuIHRoZSBkaWFnbm9zdGljIGhhbmRsZXIgc2V0IGJ5CisvLy8gc2V0SW5saW5lQXNtRGlhZ25vc3RpY0hhbmRsZXIuCit2b2lkICpMTFZNQ29udGV4dDo6Z2V0SW5saW5lQXNtRGlhZ25vc3RpY0hhbmRsZXIoKSBjb25zdCB7CisgIHJldHVybiBwSW1wbC0+SW5saW5lQXNtRGlhZ0hhbmRsZXI7Cit9CisKKy8vLyBnZXRJbmxpbmVBc21EaWFnbm9zdGljQ29udGV4dCAtIFJldHVybiB0aGUgZGlhZ25vc3RpYyBjb250ZXh0IHNldCBieQorLy8vIHNldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyLgordm9pZCAqTExWTUNvbnRleHQ6OmdldElubGluZUFzbURpYWdub3N0aWNDb250ZXh0KCkgY29uc3QgeworICByZXR1cm4gcEltcGwtPklubGluZUFzbURpYWdDb250ZXh0OworfQorCit2b2lkIExMVk1Db250ZXh0OjplbWl0RXJyb3IoU3RyaW5nUmVmIEVycm9yU3RyKSB7CisgIGVtaXRFcnJvcigwVSwgRXJyb3JTdHIpOworfQorCit2b2lkIExMVk1Db250ZXh0OjplbWl0RXJyb3IoY29uc3QgSW5zdHJ1Y3Rpb24gKkksIFN0cmluZ1JlZiBFcnJvclN0cikgeworICB1bnNpZ25lZCBMb2NDb29raWUgPSAwOworICBpZiAoY29uc3QgTUROb2RlICpTcmNMb2MgPSBJLT5nZXRNZXRhZGF0YSgic3JjbG9jIikpIHsKKyAgICBpZiAoU3JjTG9jLT5nZXROdW1PcGVyYW5kcygpICE9IDApCisgICAgICBpZiAoY29uc3QgQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFNyY0xvYy0+Z2V0T3BlcmFuZCgwKSkpCisgICAgICAgIExvY0Nvb2tpZSA9IENJLT5nZXRaRXh0VmFsdWUoKTsKKyAgfQorICByZXR1cm4gZW1pdEVycm9yKExvY0Nvb2tpZSwgRXJyb3JTdHIpOworfQorCit2b2lkIExMVk1Db250ZXh0OjplbWl0RXJyb3IodW5zaWduZWQgTG9jQ29va2llLCBTdHJpbmdSZWYgRXJyb3JTdHIpIHsKKyAgLy8gSWYgdGhlcmUgaXMgbm8gZXJyb3IgaGFuZGxlciBpbnN0YWxsZWQsIGp1c3QgcHJpbnQgdGhlIGVycm9yIGFuZCBleGl0LgorICBpZiAocEltcGwtPklubGluZUFzbURpYWdIYW5kbGVyID09IDApIHsKKyAgICBlcnJzKCkgPDwgImVycm9yOiAiIDw8IEVycm9yU3RyIDw8ICJcbiI7CisgICAgZXhpdCgxKTsKKyAgfQorICAKKyAgLy8gSWYgd2UgZG8gaGF2ZSBhbiBlcnJvciBoYW5kbGVyLCB3ZSBjYW4gcmVwb3J0IHRoZSBlcnJvciBhbmQga2VlcCBnb2luZy4KKyAgU01EaWFnbm9zdGljIERpYWcoIiIsICJlcnJvcjogIiArIEVycm9yU3RyLnN0cigpKTsKKyAgCisgICgoU291cmNlTWdyOjpEaWFnSGFuZGxlclR5KShpbnRwdHJfdClwSW1wbC0+SW5saW5lQXNtRGlhZ0hhbmRsZXIpCisgICAgICAoRGlhZywgcEltcGwtPklubGluZUFzbURpYWdDb250ZXh0LCBMb2NDb29raWUpOworICAKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1ldGFkYXRhIEtpbmQgVW5pcXVpbmcKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTkRFQlVHCisvLy8gaXNWYWxpZE5hbWUgLSBSZXR1cm4gdHJ1ZSBpZiBOYW1lIGlzIGEgdmFsaWQgY3VzdG9tIG1ldGFkYXRhIGhhbmRsZXIgbmFtZS4KK3N0YXRpYyBib29sIGlzVmFsaWROYW1lKFN0cmluZ1JlZiBNRE5hbWUpIHsKKyAgaWYgKE1ETmFtZS5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGlmICghaXNhbHBoYShNRE5hbWVbMF0pKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGZvciAoU3RyaW5nUmVmOjppdGVyYXRvciBJID0gTUROYW1lLmJlZ2luKCkgKyAxLCBFID0gTUROYW1lLmVuZCgpOyBJICE9IEU7CisgICAgICAgKytJKSB7CisgICAgaWYgKCFpc2FsbnVtKCpJKSAmJiAqSSAhPSAnXycgJiYgKkkgIT0gJy0nICYmICpJICE9ICcuJykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCisvLy8gZ2V0TURLaW5kSUQgLSBSZXR1cm4gYSB1bmlxdWUgbm9uLXplcm8gSUQgZm9yIHRoZSBzcGVjaWZpZWQgbWV0YWRhdGEga2luZC4KK3Vuc2lnbmVkIExMVk1Db250ZXh0OjpnZXRNREtpbmRJRChTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICBhc3NlcnQoaXNWYWxpZE5hbWUoTmFtZSkgJiYgIkludmFsaWQgTUROb2RlIG5hbWUiKTsKKworICAvLyBJZiB0aGlzIGlzIG5ldywgYXNzaWduIGl0IGl0cyBJRC4KKyAgcmV0dXJuCisgICAgcEltcGwtPkN1c3RvbU1ES2luZE5hbWVzLkdldE9yQ3JlYXRlVmFsdWUoCisgICAgICBOYW1lLCBwSW1wbC0+Q3VzdG9tTURLaW5kTmFtZXMuc2l6ZSgpKS5zZWNvbmQ7Cit9CisKKy8vLyBnZXRIYW5kbGVyTmFtZXMgLSBQb3B1bGF0ZSBjbGllbnQgc3VwcGxpZWQgc21hbGx2ZWN0b3IgdXNpbmcgY3VzdG9tZQorLy8vIG1ldGFkYXRhIG5hbWUgYW5kIElELgordm9pZCBMTFZNQ29udGV4dDo6Z2V0TURLaW5kTmFtZXMoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJk5hbWVzKSBjb25zdCB7CisgIE5hbWVzLnJlc2l6ZShwSW1wbC0+Q3VzdG9tTURLaW5kTmFtZXMuc2l6ZSgpKTsKKyAgZm9yIChTdHJpbmdNYXA8dW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBJID0gcEltcGwtPkN1c3RvbU1ES2luZE5hbWVzLmJlZ2luKCksCisgICAgICAgRSA9IHBJbXBsLT5DdXN0b21NREtpbmROYW1lcy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgTmFtZXNbSS0+c2Vjb25kXSA9IEktPmZpcnN0KCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0xMVk1Db250ZXh0SW1wbC5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0xMVk1Db250ZXh0SW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0MWEwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvTExWTUNvbnRleHRJbXBsLmNwcApAQCAtMCwwICsxLDEwNyBAQAorLy89PT0tLSBMTFZNQ29udGV4dEltcGwuY3BwIC0gSW1wbGVtZW50IExMVk1Db250ZXh0SW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIG9wYXF1ZSBMTFZNQ29udGV4dEltcGwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkxMVk1Db250ZXh0SW1wbC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitMTFZNQ29udGV4dEltcGw6OkxMVk1Db250ZXh0SW1wbChMTFZNQ29udGV4dCAmQykKKyAgOiBUaGVUcnVlVmFsKDApLCBUaGVGYWxzZVZhbCgwKSwKKyAgICBWb2lkVHkoQywgVHlwZTo6Vm9pZFR5SUQpLAorICAgIExhYmVsVHkoQywgVHlwZTo6TGFiZWxUeUlEKSwKKyAgICBGbG9hdFR5KEMsIFR5cGU6OkZsb2F0VHlJRCksCisgICAgRG91YmxlVHkoQywgVHlwZTo6RG91YmxlVHlJRCksCisgICAgTWV0YWRhdGFUeShDLCBUeXBlOjpNZXRhZGF0YVR5SUQpLAorICAgIFg4Nl9GUDgwVHkoQywgVHlwZTo6WDg2X0ZQODBUeUlEKSwKKyAgICBGUDEyOFR5KEMsIFR5cGU6OkZQMTI4VHlJRCksCisgICAgUFBDX0ZQMTI4VHkoQywgVHlwZTo6UFBDX0ZQMTI4VHlJRCksCisgICAgSW50MVR5KEMsIDEpLAorICAgIEludDhUeShDLCA4KSwKKyAgICBJbnQxNlR5KEMsIDE2KSwKKyAgICBJbnQzMlR5KEMsIDMyKSwKKyAgICBJbnQ2NFR5KEMsIDY0KSwKKyAgICBBbHdheXNPcGFxdWVUeShuZXcgT3BhcXVlVHlwZShDKSkgeworICBJbmxpbmVBc21EaWFnSGFuZGxlciA9IDA7CisgIElubGluZUFzbURpYWdDb250ZXh0ID0gMDsKKyAgICAgIAorICAvLyBNYWtlIHN1cmUgdGhlIEFsd2F5c09wYXF1ZVR5IHN0YXlzIGFsaXZlIGFzIGxvbmcgYXMgdGhlIENvbnRleHQuCisgIEFsd2F5c09wYXF1ZVR5LT5hZGRSZWYoKTsKKyAgT3BhcXVlVHlwZXMuaW5zZXJ0KEFsd2F5c09wYXF1ZVR5KTsKK30KKworbmFtZXNwYWNlIHsKK3N0cnVjdCBEcm9wUmVmZXJlbmNlcyB7CisgIC8vIFRha2VzIHRoZSB2YWx1ZV90eXBlIG9mIGEgQ29uc3RhbnRVbmlxdWVNYXAncyBpbnRlcm5hbCBtYXAsIHdob3NlICdzZWNvbmQnCisgIC8vIGlzIGEgQ29uc3RhbnQqLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBQYWlyVD4KKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFBhaXJUICZQKSB7CisgICAgUC5zZWNvbmQtPmRyb3BBbGxSZWZlcmVuY2VzKCk7CisgIH0KK307Cit9CisKK0xMVk1Db250ZXh0SW1wbDo6fkxMVk1Db250ZXh0SW1wbCgpIHsKKyAgc3RkOjpmb3JfZWFjaChFeHByQ29uc3RhbnRzLm1hcF9iZWdpbigpLCBFeHByQ29uc3RhbnRzLm1hcF9lbmQoKSwKKyAgICAgICAgICAgICAgICBEcm9wUmVmZXJlbmNlcygpKTsKKyAgc3RkOjpmb3JfZWFjaChBcnJheUNvbnN0YW50cy5tYXBfYmVnaW4oKSwgQXJyYXlDb25zdGFudHMubWFwX2VuZCgpLAorICAgICAgICAgICAgICAgIERyb3BSZWZlcmVuY2VzKCkpOworICBzdGQ6OmZvcl9lYWNoKFN0cnVjdENvbnN0YW50cy5tYXBfYmVnaW4oKSwgU3RydWN0Q29uc3RhbnRzLm1hcF9lbmQoKSwKKyAgICAgICAgICAgICAgICBEcm9wUmVmZXJlbmNlcygpKTsKKyAgc3RkOjpmb3JfZWFjaChVbmlvbkNvbnN0YW50cy5tYXBfYmVnaW4oKSwgVW5pb25Db25zdGFudHMubWFwX2VuZCgpLAorICAgICAgICAgICAgICAgIERyb3BSZWZlcmVuY2VzKCkpOworICBzdGQ6OmZvcl9lYWNoKFZlY3RvckNvbnN0YW50cy5tYXBfYmVnaW4oKSwgVmVjdG9yQ29uc3RhbnRzLm1hcF9lbmQoKSwKKyAgICAgICAgICAgICAgICBEcm9wUmVmZXJlbmNlcygpKTsKKyAgRXhwckNvbnN0YW50cy5mcmVlQ29uc3RhbnRzKCk7CisgIEFycmF5Q29uc3RhbnRzLmZyZWVDb25zdGFudHMoKTsKKyAgU3RydWN0Q29uc3RhbnRzLmZyZWVDb25zdGFudHMoKTsKKyAgVW5pb25Db25zdGFudHMuZnJlZUNvbnN0YW50cygpOworICBWZWN0b3JDb25zdGFudHMuZnJlZUNvbnN0YW50cygpOworICBBZ2daZXJvQ29uc3RhbnRzLmZyZWVDb25zdGFudHMoKTsKKyAgTnVsbFB0ckNvbnN0YW50cy5mcmVlQ29uc3RhbnRzKCk7CisgIFVuZGVmVmFsdWVDb25zdGFudHMuZnJlZUNvbnN0YW50cygpOworICBJbmxpbmVBc21zLmZyZWVDb25zdGFudHMoKTsKKyAgZm9yIChJbnRNYXBUeTo6aXRlcmF0b3IgSSA9IEludENvbnN0YW50cy5iZWdpbigpLCBFID0gSW50Q29uc3RhbnRzLmVuZCgpOyAKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGRlbGV0ZSBJLT5zZWNvbmQ7CisgIH0KKyAgZm9yIChGUE1hcFR5OjppdGVyYXRvciBJID0gRlBDb25zdGFudHMuYmVnaW4oKSwgRSA9IEZQQ29uc3RhbnRzLmVuZCgpOyAKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGRlbGV0ZSBJLT5zZWNvbmQ7CisgIH0KKyAgQWx3YXlzT3BhcXVlVHktPmRyb3BSZWYoKTsKKyAgZm9yIChPcGFxdWVUeXBlc1R5OjppdGVyYXRvciBJID0gT3BhcXVlVHlwZXMuYmVnaW4oKSwgRSA9IE9wYXF1ZVR5cGVzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgKCpJKS0+QWJzdHJhY3RUeXBlVXNlcnMuY2xlYXIoKTsKKyAgICBkZWxldGUgKkk7CisgIH0KKyAgLy8gRGVzdHJveSBNRE5vZGVzLiAgfk1ETm9kZSBjYW4gbW92ZSBhbmQgcmVtb3ZlIG5vZGVzIGJldHdlZW4gdGhlIE1ETm9kZVNldAorICAvLyBhbmQgdGhlIE5vblVuaXF1ZWRNRE5vZGVzIHNldHMsIHNvIGNvcHkgdGhlIHZhbHVlcyBvdXQgZmlyc3QuCisgIFNtYWxsVmVjdG9yPE1ETm9kZSosIDg+IE1ETm9kZXM7CisgIE1ETm9kZXMucmVzZXJ2ZShNRE5vZGVTZXQuc2l6ZSgpICsgTm9uVW5pcXVlZE1ETm9kZXMuc2l6ZSgpKTsKKyAgZm9yIChGb2xkaW5nU2V0SXRlcmF0b3I8TUROb2RlPiBJID0gTUROb2RlU2V0LmJlZ2luKCksIEUgPSBNRE5vZGVTZXQuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBNRE5vZGVzLnB1c2hfYmFjaygmKkkpOworICB9CisgIE1ETm9kZXMuYXBwZW5kKE5vblVuaXF1ZWRNRE5vZGVzLmJlZ2luKCksIE5vblVuaXF1ZWRNRE5vZGVzLmVuZCgpKTsKKyAgZm9yIChTbWFsbFZlY3RvcjxNRE5vZGUqLCA4Pjo6aXRlcmF0b3IgSSA9IE1ETm9kZXMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBNRE5vZGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICgqSSktPmRlc3Ryb3koKTsKKyAgfQorICBhc3NlcnQoTUROb2RlU2V0LmVtcHR5KCkgJiYgTm9uVW5pcXVlZE1ETm9kZXMuZW1wdHkoKSAmJgorICAgICAgICAgIkRlc3Ryb3lpbmcgYWxsIE1ETm9kZXMgZGlkbid0IGVtcHR5IHRoZSBDb250ZXh0J3Mgc2V0cy4iKTsKKyAgLy8gRGVzdHJveSBNRFN0cmluZ3MuCisgIGZvciAoU3RyaW5nTWFwPE1EU3RyaW5nKj46Oml0ZXJhdG9yIEkgPSBNRFN0cmluZ0NhY2hlLmJlZ2luKCksCisgICAgICAgICBFID0gTURTdHJpbmdDYWNoZS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBkZWxldGUgSS0+c2Vjb25kOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0xMVk1Db250ZXh0SW1wbC5oIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9MTFZNQ29udGV4dEltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODc2ZjVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9MTFZNQ29udGV4dEltcGwuaApAQCAtMCwwICsxLDI0OSBAQAorLy89PT0tLSBMTFZNQ29udGV4dEltcGwuaCAtIFRoZSBMTFZNQ29udGV4dEltcGwgb3BhcXVlIGNsYXNzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlY2xhcmVzIExMVk1Db250ZXh0SW1wbCwgdGhlIG9wYXF1ZSBpbXBsZW1lbnRhdGlvbiAKKy8vICBvZiBMTFZNQ29udGV4dC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTExWTUNPTlRFWFRfSU1QTF9ICisjZGVmaW5lIExMVk1fTExWTUNPTlRFWFRfSU1QTF9ICisKKyNpbmNsdWRlICJDb25zdGFudHNDb250ZXh0LmgiCisjaW5jbHVkZSAiTGVha3NDb250ZXh0LmgiCisjaW5jbHVkZSAiVHlwZXNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb25zdGFudEludDsKK2NsYXNzIENvbnN0YW50RlA7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYWx1ZTsKKworc3RydWN0IERlbnNlTWFwQVBJbnRLZXlJbmZvIHsKKyAgc3RydWN0IEtleVR5IHsKKyAgICBBUEludCB2YWw7CisgICAgY29uc3QgVHlwZSogdHlwZTsKKyAgICBLZXlUeShjb25zdCBBUEludCYgViwgY29uc3QgVHlwZSogVHkpIDogdmFsKFYpLCB0eXBlKFR5KSB7fQorICAgIEtleVR5KGNvbnN0IEtleVR5JiB0aGF0KSA6IHZhbCh0aGF0LnZhbCksIHR5cGUodGhhdC50eXBlKSB7fQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXlUeSYgdGhhdCkgY29uc3QgeworICAgICAgcmV0dXJuIHR5cGUgPT0gdGhhdC50eXBlICYmIHRoaXMtPnZhbCA9PSB0aGF0LnZhbDsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEtleVR5JiB0aGF0KSBjb25zdCB7CisgICAgICByZXR1cm4gIXRoaXMtPm9wZXJhdG9yPT0odGhhdCk7CisgICAgfQorICB9OworICBzdGF0aWMgaW5saW5lIEtleVR5IGdldEVtcHR5S2V5KCkgeyByZXR1cm4gS2V5VHkoQVBJbnQoMSwwKSwgMCk7IH0KKyAgc3RhdGljIGlubGluZSBLZXlUeSBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiBLZXlUeShBUEludCgxLDEpLCAwKTsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEtleVR5ICZLZXkpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPHZvaWQqPjo6Z2V0SGFzaFZhbHVlKEtleS50eXBlKSBeIAorICAgICAgS2V5LnZhbC5nZXRIYXNoVmFsdWUoKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IEtleVR5ICZMSFMsIGNvbnN0IEtleVR5ICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworc3RydWN0IERlbnNlTWFwQVBGbG9hdEtleUluZm8geworICBzdHJ1Y3QgS2V5VHkgeworICAgIEFQRmxvYXQgdmFsOworICAgIEtleVR5KGNvbnN0IEFQRmxvYXQmIFYpIDogdmFsKFYpe30KKyAgICBLZXlUeShjb25zdCBLZXlUeSYgdGhhdCkgOiB2YWwodGhhdC52YWwpIHt9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEtleVR5JiB0aGF0KSBjb25zdCB7CisgICAgICByZXR1cm4gdGhpcy0+dmFsLmJpdHdpc2VJc0VxdWFsKHRoYXQudmFsKTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEtleVR5JiB0aGF0KSBjb25zdCB7CisgICAgICByZXR1cm4gIXRoaXMtPm9wZXJhdG9yPT0odGhhdCk7CisgICAgfQorICB9OworICBzdGF0aWMgaW5saW5lIEtleVR5IGdldEVtcHR5S2V5KCkgeyAKKyAgICByZXR1cm4gS2V5VHkoQVBGbG9hdChBUEZsb2F0OjpCb2d1cywxKSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBLZXlUeSBnZXRUb21ic3RvbmVLZXkoKSB7IAorICAgIHJldHVybiBLZXlUeShBUEZsb2F0KEFQRmxvYXQ6OkJvZ3VzLDIpKTsgCisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBLZXlUeSAmS2V5KSB7CisgICAgcmV0dXJuIEtleS52YWwuZ2V0SGFzaFZhbHVlKCk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBLZXlUeSAmTEhTLCBjb25zdCBLZXlUeSAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vLyBEZWJ1Z1JlY1ZIIC0gVGhpcyBpcyBhIENhbGxiYWNrVkggdXNlZCB0byBrZWVwIHRoZSBTY29wZSAtPiBpbmRleCBtYXBzCisvLy8gdXAgdG8gZGF0ZSBhcyBNRE5vZGVzIG11dGF0ZS4gIFRoaXMgY2xhc3MgaXMgaW1wbGVtZW50ZWQgaW4gRGVidWdMb2MuY3BwLgorY2xhc3MgRGVidWdSZWNWSCA6IHB1YmxpYyBDYWxsYmFja1ZIIHsKKyAgLy8vIEN0eCAtIFRoaXMgaXMgdGhlIExMVk0gQ29udGV4dCBiZWluZyByZWZlcmVuY2VkLgorICBMTFZNQ29udGV4dEltcGwgKkN0eDsKKyAgCisgIC8vLyBJZHggLSBUaGUgaW5kZXggaW50byBlaXRoZXIgU2NvcGVSZWNvcmRJZHggb3IgU2NvcGVJbmxpbmVkQXRSZWNvcmRzIHRoYXQKKyAgLy8vIHRoaXMgcmVmZXJlbmNlIGxpdmVzIGluLiAgSWYgdGhpcyBpcyB6ZXJvLCB0aGVuIGl0IHJlcHJlc2VudHMgYQorICAvLy8gbm9uLWNhbm9uaWNhbCBlbnRyeSB0aGF0IGhhcyBubyBEZW5zZU1hcCB2YWx1ZS4gIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8KKyAgLy8vIFJBVVcuCisgIGludCBJZHg7CitwdWJsaWM6CisgIERlYnVnUmVjVkgoTUROb2RlICpuLCBMTFZNQ29udGV4dEltcGwgKmN0eCwgaW50IGlkeCkKKyAgICA6IENhbGxiYWNrVkgobiksIEN0eChjdHgpLCBJZHgoaWR4KSB7fQorICAKKyAgTUROb2RlICpnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNRE5vZGU+KGdldFZhbFB0cigpKTsKKyAgfQorICAKKyAgdmlydHVhbCB2b2lkIGRlbGV0ZWQoKTsKKyAgdmlydHVhbCB2b2lkIGFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKlZOZXcpOworfTsKKyAgCitjbGFzcyBMTFZNQ29udGV4dEltcGwgeworcHVibGljOgorICB2b2lkICpJbmxpbmVBc21EaWFnSGFuZGxlciwgKklubGluZUFzbURpYWdDb250ZXh0OworICAKKyAgdHlwZWRlZiBEZW5zZU1hcDxEZW5zZU1hcEFQSW50S2V5SW5mbzo6S2V5VHksIENvbnN0YW50SW50KiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXBBUEludEtleUluZm8+IEludE1hcFR5OworICBJbnRNYXBUeSBJbnRDb25zdGFudHM7CisgIAorICB0eXBlZGVmIERlbnNlTWFwPERlbnNlTWFwQVBGbG9hdEtleUluZm86OktleVR5LCBDb25zdGFudEZQKiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXBBUEZsb2F0S2V5SW5mbz4gRlBNYXBUeTsKKyAgRlBNYXBUeSBGUENvbnN0YW50czsKKyAgCisgIFN0cmluZ01hcDxNRFN0cmluZyo+IE1EU3RyaW5nQ2FjaGU7CisgIAorICBGb2xkaW5nU2V0PE1ETm9kZT4gTUROb2RlU2V0OworICAvLyBNRE5vZGVzIG1heSBiZSB1bmlxdWVkIG9yIG5vdCB1bmlxdWVkLiAgV2hlbiB0aGV5J3JlIG5vdCB1bmlxdWVkLCB0aGV5CisgIC8vIGFyZW4ndCBpbiB0aGUgTUROb2RlU2V0LCBidXQgdGhleSdyZSBzdGlsbCBzaGFyZWQgYmV0d2VlbiBvYmplY3RzLCBzbyBubworICAvLyBvbmUgb2JqZWN0IGNhbiBkZXN0cm95IHRoZW0uICBUaGlzIHNldCBhbGxvd3MgdXMgdG8gYXQgbGVhc3QgZGVzdHJveSB0aGVtCisgIC8vIG9uIENvbnRleHQgZGVzdHJ1Y3Rpb24uCisgIFNtYWxsUHRyU2V0PE1ETm9kZSosIDE+IE5vblVuaXF1ZWRNRE5vZGVzOworICAKKyAgQ29uc3RhbnRVbmlxdWVNYXA8Y2hhciwgVHlwZSwgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvPiBBZ2daZXJvQ29uc3RhbnRzOworCisgIHR5cGVkZWYgQ29uc3RhbnRVbmlxdWVNYXA8c3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiwgQXJyYXlUeXBlLAorICAgIENvbnN0YW50QXJyYXksIHRydWUgLypsYXJnZWtleSovPiBBcnJheUNvbnN0YW50c1R5OworICBBcnJheUNvbnN0YW50c1R5IEFycmF5Q29uc3RhbnRzOworICAKKyAgdHlwZWRlZiBDb25zdGFudFVuaXF1ZU1hcDxzdGQ6OnZlY3RvcjxDb25zdGFudCo+LCBTdHJ1Y3RUeXBlLAorICAgIENvbnN0YW50U3RydWN0LCB0cnVlIC8qbGFyZ2VrZXkqLz4gU3RydWN0Q29uc3RhbnRzVHk7CisgIFN0cnVjdENvbnN0YW50c1R5IFN0cnVjdENvbnN0YW50czsKKyAgCisgIHR5cGVkZWYgQ29uc3RhbnRVbmlxdWVNYXA8Q29uc3RhbnQqLCBVbmlvblR5cGUsIENvbnN0YW50VW5pb24+CisgICAgICBVbmlvbkNvbnN0YW50c1R5OworICBVbmlvbkNvbnN0YW50c1R5IFVuaW9uQ29uc3RhbnRzOworICAKKyAgdHlwZWRlZiBDb25zdGFudFVuaXF1ZU1hcDxzdGQ6OnZlY3RvcjxDb25zdGFudCo+LCBWZWN0b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50VmVjdG9yPiBWZWN0b3JDb25zdGFudHNUeTsKKyAgVmVjdG9yQ29uc3RhbnRzVHkgVmVjdG9yQ29uc3RhbnRzOworICAKKyAgQ29uc3RhbnRVbmlxdWVNYXA8Y2hhciwgUG9pbnRlclR5cGUsIENvbnN0YW50UG9pbnRlck51bGw+IE51bGxQdHJDb25zdGFudHM7CisgIENvbnN0YW50VW5pcXVlTWFwPGNoYXIsIFR5cGUsIFVuZGVmVmFsdWU+IFVuZGVmVmFsdWVDb25zdGFudHM7CisgIAorICBEZW5zZU1hcDxzdGQ6OnBhaXI8RnVuY3Rpb24qLCBCYXNpY0Jsb2NrKj4gLCBCbG9ja0FkZHJlc3MqPiBCbG9ja0FkZHJlc3NlczsKKyAgQ29uc3RhbnRVbmlxdWVNYXA8RXhwck1hcEtleVR5cGUsIFR5cGUsIENvbnN0YW50RXhwcj4gRXhwckNvbnN0YW50czsKKworICBDb25zdGFudFVuaXF1ZU1hcDxJbmxpbmVBc21LZXlUeXBlLCBQb2ludGVyVHlwZSwgSW5saW5lQXNtPiBJbmxpbmVBc21zOworICAKKyAgQ29uc3RhbnRJbnQgKlRoZVRydWVWYWw7CisgIENvbnN0YW50SW50ICpUaGVGYWxzZVZhbDsKKyAgCisgIExlYWtEZXRlY3RvckltcGw8VmFsdWU+IExMVk1PYmplY3RzOworICAKKyAgLy8gQmFzaWMgdHlwZSBpbnN0YW5jZXMuCisgIGNvbnN0IFR5cGUgVm9pZFR5OworICBjb25zdCBUeXBlIExhYmVsVHk7CisgIGNvbnN0IFR5cGUgRmxvYXRUeTsKKyAgY29uc3QgVHlwZSBEb3VibGVUeTsKKyAgY29uc3QgVHlwZSBNZXRhZGF0YVR5OworICBjb25zdCBUeXBlIFg4Nl9GUDgwVHk7CisgIGNvbnN0IFR5cGUgRlAxMjhUeTsKKyAgY29uc3QgVHlwZSBQUENfRlAxMjhUeTsKKyAgY29uc3QgSW50ZWdlclR5cGUgSW50MVR5OworICBjb25zdCBJbnRlZ2VyVHlwZSBJbnQ4VHk7CisgIGNvbnN0IEludGVnZXJUeXBlIEludDE2VHk7CisgIGNvbnN0IEludGVnZXJUeXBlIEludDMyVHk7CisgIGNvbnN0IEludGVnZXJUeXBlIEludDY0VHk7CisKKyAgLy8gQ29uY3JldGUvQWJzdHJhY3QgVHlwZURlc2NyaXB0aW9ucyAtIFdlIGxhemlseSBjYWxjdWxhdGUgdHlwZSBkZXNjcmlwdGlvbnMKKyAgLy8gZm9yIHR5cGVzIGFzIHRoZXkgYXJlIG5lZWRlZC4gIEJlY2F1c2UgcmVzb2x1dGlvbiBvZiB0eXBlcyBtdXN0IGludmFsaWRhdGUKKyAgLy8gYWxsIG9mIHRoZSBhYnN0cmFjdCB0eXBlIGRlc2NyaXB0aW9ucywgd2Uga2VlcCB0aGVtIGluIGEgc2VwZXJhdGUgbWFwIHRvIAorICAvLyBtYWtlIHRoaXMgZWFzeS4KKyAgVHlwZVByaW50aW5nIENvbmNyZXRlVHlwZURlc2NyaXB0aW9uczsKKyAgVHlwZVByaW50aW5nIEFic3RyYWN0VHlwZURlc2NyaXB0aW9uczsKKyAgCisgIFR5cGVNYXA8QXJyYXlWYWxUeXBlLCBBcnJheVR5cGU+IEFycmF5VHlwZXM7CisgIFR5cGVNYXA8VmVjdG9yVmFsVHlwZSwgVmVjdG9yVHlwZT4gVmVjdG9yVHlwZXM7CisgIFR5cGVNYXA8UG9pbnRlclZhbFR5cGUsIFBvaW50ZXJUeXBlPiBQb2ludGVyVHlwZXM7CisgIFR5cGVNYXA8RnVuY3Rpb25WYWxUeXBlLCBGdW5jdGlvblR5cGU+IEZ1bmN0aW9uVHlwZXM7CisgIFR5cGVNYXA8U3RydWN0VmFsVHlwZSwgU3RydWN0VHlwZT4gU3RydWN0VHlwZXM7CisgIFR5cGVNYXA8VW5pb25WYWxUeXBlLCBVbmlvblR5cGU+IFVuaW9uVHlwZXM7CisgIFR5cGVNYXA8SW50ZWdlclZhbFR5cGUsIEludGVnZXJUeXBlPiBJbnRlZ2VyVHlwZXM7CisKKyAgLy8gT3BhcXVlIHR5cGVzIGFyZSBub3Qgc3RydWN0dXJhbGx5IHVuaXF1ZWQsIHNvIGRvbid0IHVzZSBUeXBlTWFwLgorICB0eXBlZGVmIFNtYWxsUHRyU2V0PGNvbnN0IE9wYXF1ZVR5cGUqLCA4PiBPcGFxdWVUeXBlc1R5OworICBPcGFxdWVUeXBlc1R5IE9wYXF1ZVR5cGVzOworCisgIC8vLyBVc2VkIGFzIGFuIGFic3RyYWN0IHR5cGUgdGhhdCB3aWxsIG5ldmVyIGJlIHJlc29sdmVkLgorICBPcGFxdWVUeXBlICpjb25zdCBBbHdheXNPcGFxdWVUeTsKKworCisgIC8vLyBWYWx1ZUhhbmRsZXMgLSBUaGlzIG1hcCBrZWVwcyB0cmFjayBvZiBhbGwgb2YgdGhlIHZhbHVlIGhhbmRsZXMgdGhhdCBhcmUKKyAgLy8vIHdhdGNoaW5nIGEgVmFsdWUqLiAgVGhlIFZhbHVlOjpIYXNWYWx1ZUhhbmRsZSBiaXQgaXMgdXNlZCB0byBrbm93CisgIC8vIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaGFzIGFuIGVudHJ5IGluIHRoaXMgbWFwLgorICB0eXBlZGVmIERlbnNlTWFwPFZhbHVlKiwgVmFsdWVIYW5kbGVCYXNlKj4gVmFsdWVIYW5kbGVzVHk7CisgIFZhbHVlSGFuZGxlc1R5IFZhbHVlSGFuZGxlczsKKyAgCisgIC8vLyBDdXN0b21NREtpbmROYW1lcyAtIE1hcCB0byBob2xkIHRoZSBtZXRhZGF0YSBzdHJpbmcgdG8gSUQgbWFwcGluZy4KKyAgU3RyaW5nTWFwPHVuc2lnbmVkPiBDdXN0b21NREtpbmROYW1lczsKKyAgCisgIHR5cGVkZWYgc3RkOjpwYWlyPHVuc2lnbmVkLCBUcmFja2luZ1ZIPE1ETm9kZT4gPiBNRFBhaXJUeTsKKyAgdHlwZWRlZiBTbWFsbFZlY3RvcjxNRFBhaXJUeSwgMj4gTURNYXBUeTsKKworICAvLy8gTWV0YWRhdGFTdG9yZSAtIENvbGxlY3Rpb24gb2YgcGVyLWluc3RydWN0aW9uIG1ldGFkYXRhIHVzZWQgaW4gdGhpcworICAvLy8gY29udGV4dC4KKyAgRGVuc2VNYXA8Y29uc3QgSW5zdHJ1Y3Rpb24gKiwgTURNYXBUeT4gTWV0YWRhdGFTdG9yZTsKKyAgCisgIC8vLyBTY29wZVJlY29yZElkeCAtIFRoaXMgaXMgdGhlIGluZGV4IGluIFNjb3BlUmVjb3JkcyBmb3IgYW4gTUROb2RlIHNjb3BlCisgIC8vLyBlbnRyeSB3aXRoIG5vICJpbmxpbmVkIGF0IiBlbGVtZW50LgorICBEZW5zZU1hcDxNRE5vZGUqLCBpbnQ+IFNjb3BlUmVjb3JkSWR4OworICAKKyAgLy8vIFNjb3BlUmVjb3JkcyAtIFRoZXNlIGFyZSB0aGUgYWN0dWFsIG1kbm9kZXMgKGluIGEgdmFsdWUgaGFuZGxlKSBmb3IgYW4KKyAgLy8vIGluZGV4LiAgVGhlIFZhbHVlSGFuZGxlIGVuc3VyZXMgdGhhdCBTY29wZVJlY29yZElkeCBzdGF5cyB1cCB0byBkYXRlIGlmCisgIC8vLyB0aGUgTUROb2RlIGlzIFJBVVcnZC4KKyAgc3RkOjp2ZWN0b3I8RGVidWdSZWNWSD4gU2NvcGVSZWNvcmRzOworICAKKyAgLy8vIFNjb3BlSW5saW5lZEF0SWR4IC0gVGhpcyBpcyB0aGUgaW5kZXggaW4gU2NvcGVJbmxpbmVkQXRSZWNvcmRzIGZvciBhbgorICAvLy8gc2NvcGUvaW5saW5lZC1hdCBwYWlyLgorICBEZW5zZU1hcDxzdGQ6OnBhaXI8TUROb2RlKiwgTUROb2RlKj4sIGludD4gU2NvcGVJbmxpbmVkQXRJZHg7CisgIAorICAvLy8gU2NvcGVJbmxpbmVkQXRSZWNvcmRzIC0gVGhlc2UgYXJlIHRoZSBhY3R1YWwgbWRub2RlcyAoaW4gdmFsdWUgaGFuZGxlcykKKyAgLy8vIGZvciBhbiBpbmRleC4gIFRoZSBWYWx1ZUhhbmRsZSBlbnN1cmVzIHRoYXQgU2NvcGVJTmxpbmVkQXRJZHggc3RheXMgdXAKKyAgLy8vIHRvIGRhdGUuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxEZWJ1Z1JlY1ZILCBEZWJ1Z1JlY1ZIPiA+IFNjb3BlSW5saW5lZEF0UmVjb3JkczsKKyAgCisgIGludCBnZXRPckFkZFNjb3BlUmVjb3JkSWR4RW50cnkoTUROb2RlICpOLCBpbnQgRXhpc3RpbmdJZHgpOworICBpbnQgZ2V0T3JBZGRTY29wZUlubGluZWRBdElkeEVudHJ5KE1ETm9kZSAqU2NvcGUsIE1ETm9kZSAqSUEsaW50IEV4aXN0aW5nSWR4KTsKKyAgCisgIExMVk1Db250ZXh0SW1wbChMTFZNQ29udGV4dCAmQyk7CisgIH5MTFZNQ29udGV4dEltcGwoKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL0xlYWtEZXRlY3Rvci5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL0xlYWtEZXRlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0ZjYxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvTGVha0RldGVjdG9yLmNwcApAQCAtMCwwICsxLDY5IEBACisvLz09PS0tIExlYWtEZXRlY3Rvci5jcHAgLSBJbXBsZW1lbnQgTGVha0RldGVjdG9yIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBMZWFrRGV0ZWN0b3IgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkxMVk1Db250ZXh0SW1wbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9MZWFrRGV0ZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTXV0ZXguaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaHJlYWRpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1ZhbHVlLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIE1hbmFnZWRTdGF0aWM8c3lzOjpTbWFydE11dGV4PHRydWU+ID4gT2JqZWN0c0xvY2s7CitzdGF0aWMgTWFuYWdlZFN0YXRpYzxMZWFrRGV0ZWN0b3JJbXBsPHZvaWQ+ID4gT2JqZWN0czsKKworc3RhdGljIHZvaWQgY2xlYXJHYXJiYWdlKExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgIE9iamVjdHMtPmNsZWFyKCk7CisgIENvbnRleHQucEltcGwtPkxMVk1PYmplY3RzLmNsZWFyKCk7Cit9CisKK3ZvaWQgTGVha0RldGVjdG9yOjphZGRHYXJiYWdlT2JqZWN0SW1wbCh2b2lkICpPYmplY3QpIHsKKyAgc3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gTG9jaygqT2JqZWN0c0xvY2spOworICBPYmplY3RzLT5hZGRHYXJiYWdlKE9iamVjdCk7Cit9CisKK3ZvaWQgTGVha0RldGVjdG9yOjphZGRHYXJiYWdlT2JqZWN0SW1wbChjb25zdCBWYWx1ZSAqT2JqZWN0KSB7CisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBPYmplY3QtPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcEltcGwtPkxMVk1PYmplY3RzLmFkZEdhcmJhZ2UoT2JqZWN0KTsKK30KKwordm9pZCBMZWFrRGV0ZWN0b3I6OnJlbW92ZUdhcmJhZ2VPYmplY3RJbXBsKHZvaWQgKk9iamVjdCkgeworICBzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBMb2NrKCpPYmplY3RzTG9jayk7CisgIE9iamVjdHMtPnJlbW92ZUdhcmJhZ2UoT2JqZWN0KTsKK30KKwordm9pZCBMZWFrRGV0ZWN0b3I6OnJlbW92ZUdhcmJhZ2VPYmplY3RJbXBsKGNvbnN0IFZhbHVlICpPYmplY3QpIHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IE9iamVjdC0+Z2V0Q29udGV4dCgpLnBJbXBsOworICBwSW1wbC0+TExWTU9iamVjdHMucmVtb3ZlR2FyYmFnZShPYmplY3QpOworfQorCit2b2lkIExlYWtEZXRlY3Rvcjo6Y2hlY2tGb3JHYXJiYWdlSW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTWVzc2FnZSkgeworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gQ29udGV4dC5wSW1wbDsKKyAgc3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gTG9jaygqT2JqZWN0c0xvY2spOworICAKKyAgT2JqZWN0cy0+c2V0TmFtZSgiR0VORVJJQyIpOworICBwSW1wbC0+TExWTU9iamVjdHMuc2V0TmFtZSgiTExWTSIpOworICAKKyAgLy8gdXNlIG5vbi1zaG9ydC1jaXJjdWl0IHZlcnNpb24gc28gdGhhdCBib3RoIGNoZWNrcyBhcmUgcGVyZm9ybWVkCisgIGlmIChPYmplY3RzLT5oYXNHYXJiYWdlKE1lc3NhZ2UpIHwKKyAgICAgIHBJbXBsLT5MTFZNT2JqZWN0cy5oYXNHYXJiYWdlKE1lc3NhZ2UpKQorICAgIGVycnMoKSA8PCAiXG5UaGlzIGlzIHByb2JhYmx5IGJlY2F1c2UgeW91IHJlbW92ZWQgYW4gb2JqZWN0LCBidXQgZGlkbid0ICIKKyAgICAgICAgICAgPDwgImRlbGV0ZSBpdC4gIFBsZWFzZSBjaGVjayB5b3VyIGNvZGUgZm9yIG1lbW9yeSBsZWFrcy5cbiI7CisKKyAgLy8gQ2xlYXIgb3V0IHJlc3VsdHMgc28gd2UgZG9uJ3QgZ2V0IGR1cGxpY2F0ZSB3YXJuaW5ncyBvbgorICAvLyBuZXh0IGNhbGwuLi4KKyAgY2xlYXJHYXJiYWdlKENvbnRleHQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9MZWFrc0NvbnRleHQuaCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvTGVha3NDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllNTlkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvTGVha3NDb250ZXh0LmgKQEAgLTAsMCArMSw5MiBAQAorLy89PT0tIExlYWtzQ29udGV4dC5oIC0gTGVhZERldGVjdG9yIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLSotIEMrKyAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdmFyaW91cyBoZWxwZXIgbWV0aG9kcyBhbmQgY2xhc3NlcyB1c2VkIGJ5CisvLyBMTFZNQ29udGV4dEltcGwgZm9yIGxlYWtzIGRldGVjdG9ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgUHJpbnRlclRyYWl0IHsKKyAgc3RhdGljIHZvaWQgcHJpbnQoY29uc3QgVCogUCkgeyBlcnJzKCkgPDwgUDsgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IFByaW50ZXJUcmFpdDxWYWx1ZT4geworICBzdGF0aWMgdm9pZCBwcmludChjb25zdCBWYWx1ZSogUCkgeyBlcnJzKCkgPDwgKlA7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IExlYWtEZXRlY3RvckltcGwgeworICBleHBsaWNpdCBMZWFrRGV0ZWN0b3JJbXBsKGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSAiIikgOiAKKyAgICBDYWNoZSgwKSwgTmFtZShuYW1lKSB7IH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIENhY2hlID0gMDsKKyAgICBUcy5jbGVhcigpOworICB9CisgICAgCisgIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBuKSB7IAorICAgIE5hbWUgPSBuOworICB9CisgICAgCisgIC8vIEJlY2F1c2UgdGhlIG1vc3QgY29tbW9uIHVzYWdlIHBhdHRlcm4sIGJ5IGZhciwgaXMgdG8gYWRkIGEKKyAgLy8gZ2FyYmFnZSBvYmplY3QsIHRoZW4gcmVtb3ZlIGl0IGltbWVkaWF0ZWx5LCB3ZSBvcHRpbWl6ZSB0aGlzCisgIC8vIGNhc2UuICBXaGVuIGFuIG9iamVjdCBpcyBhZGRlZCwgaXQgaXMgbm90IGFkZGVkIHRvIHRoZSBzZXQKKyAgLy8gaW1tZWRpYXRlbHksIGl0IGlzIGFkZGVkIHRvIHRoZSBDYWNoZWRWYWx1ZSBWYWx1ZS4gIElmIGl0IGlzCisgIC8vIGltbWVkaWF0ZWx5IHJlbW92ZWQsIG5vIHNldCBzZWFyY2ggbmVlZCBiZSBwZXJmb3JtZWQuCisgIHZvaWQgYWRkR2FyYmFnZShjb25zdCBUKiBvKSB7CisgICAgYXNzZXJ0KFRzLmNvdW50KG8pID09IDAgJiYgIk9iamVjdCBhbHJlYWR5IGluIHNldCEiKTsKKyAgICBpZiAoQ2FjaGUpIHsKKyAgICAgIGFzc2VydChDYWNoZSAhPSBvICYmICJPYmplY3QgYWxyZWFkeSBpbiBzZXQhIik7CisgICAgICBUcy5pbnNlcnQoQ2FjaGUpOworICAgIH0KKyAgICBDYWNoZSA9IG87CisgIH0KKworICB2b2lkIHJlbW92ZUdhcmJhZ2UoY29uc3QgVCogbykgeworICAgIGlmIChvID09IENhY2hlKQorICAgICAgQ2FjaGUgPSAwOyAvLyBDYWNoZSBoaXQKKyAgICBlbHNlCisgICAgICBUcy5lcmFzZShvKTsKKyAgfQorCisgIGJvb2wgaGFzR2FyYmFnZShjb25zdCBzdGQ6OnN0cmluZyYgTWVzc2FnZSkgeworICAgIGFkZEdhcmJhZ2UoMCk7IC8vIEZsdXNoIHRoZSBDYWNoZQorCisgICAgYXNzZXJ0KENhY2hlID09IDAgJiYgIk5vIHZhbHVlIHNob3VsZCBiZSBjYWNoZWQgYW55bW9yZSEiKTsKKworICAgIGlmICghVHMuZW1wdHkoKSkgeworICAgICAgZXJycygpIDw8ICJMZWFrZWQgIiA8PCBOYW1lIDw8ICIgb2JqZWN0cyBmb3VuZDogIiA8PCBNZXNzYWdlIDw8ICI6XG4iOworICAgICAgZm9yICh0eXBlbmFtZSBTbWFsbFB0clNldDxjb25zdCBUKiwgOD46Oml0ZXJhdG9yIEkgPSBUcy5iZWdpbigpLAorICAgICAgICAgICBFID0gVHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIGVycnMoKSA8PCAnXHQnOworICAgICAgICBQcmludGVyVHJhaXQ8VD46OnByaW50KCpJKTsKKyAgICAgICAgZXJycygpIDw8ICdcbic7CisgICAgICB9CisgICAgICBlcnJzKCkgPDwgJ1xuJzsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICBTbWFsbFB0clNldDxjb25zdCBUKiwgOD4gVHM7CisgIGNvbnN0IFQqIENhY2hlOworICBjb25zdCBjaGFyKiBOYW1lOworfTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9NYWtlZmlsZSBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhNGZjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvTWFrZWZpbGUKQEAgLTAsMCArMSwzNCBAQAorIyM9PT0tIGxpYi9WTUNvcmUvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK0xFVkVMID0gLi4vLi4KK0xJQlJBUllOQU1FID0gTExWTUNvcmUKK0JVSUxEX0FSQ0hJVkUgPSAxCitSRVFVSVJFU19SVFRJID0gMQorCitCVUlMVF9TT1VSQ0VTID0gJChQUk9KX09CSl9ST09UKS9pbmNsdWRlL2xsdm0vSW50cmluc2ljcy5nZW4KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKworR0VORklMRTo9JChQUk9KX09CSl9ST09UKS9pbmNsdWRlL2xsdm0vSW50cmluc2ljcy5nZW4KKworSU5UUklOU0lDVEQgIDo9ICQoUFJPSl9TUkNfUk9PVCkvaW5jbHVkZS9sbHZtL0ludHJpbnNpY3MudGQKK0lOVFJJTlNJQ1REUyA6PSAkKHdpbGRjYXJkICQoUFJPSl9TUkNfUk9PVCkvaW5jbHVkZS9sbHZtL0ludHJpbnNpY3MqLnRkKQorCiskKE9iakRpcikvSW50cmluc2ljcy5nZW4udG1wOiAkKE9iakRpcikvLmRpciAkKElOVFJJTlNJQ1REUykgJChUQkxHRU4pCisJJChFY2hvKSBCdWlsZGluZyBJbnRyaW5zaWNzLmdlbi50bXAgZnJvbSBJbnRyaW5zaWNzLnRkCisJJChWZXJiKSAkKFRhYmxlR2VuKSAkKGNhbGwgU1lTUEFUSCwgJChJTlRSSU5TSUNURCkpIC1vICQoY2FsbCBTWVNQQVRILCAkQCkgLWdlbi1pbnRyaW5zaWMKKworJChHRU5GSUxFKTogJChPYmpEaXIpL0ludHJpbnNpY3MuZ2VuLnRtcAorCSQoVmVyYikgJChDTVApIC1zICRAICQ8IHx8ICggJChDUCkgJDwgJEAgJiYgXAorCSAgJChFY2hvQ21kKSBVcGRhdGVkIEludHJpbnNpY3MuZ2VuIGJlY2F1c2UgSW50cmluc2ljcy5nZW4udG1wIFwKKwkgICAgY2hhbmdlZCBzaWduaWZpY2FudGx5LiApCisKK2luc3RhbGwtbG9jYWw6OiAkKEdFTkZJTEUpCisJJChFY2hvKSBJbnN0YWxsaW5nICQoREVTVERJUikkKFBST0pfaW5jbHVkZWRpcikvbGx2bS9JbnRyaW5zaWNzLmdlbgorCSQoVmVyYikgJChEYXRhSW5zdGFsbCkgJChHRU5GSUxFKSAkKERFU1RESVIpJChQUk9KX2luY2x1ZGVkaXIpL2xsdm0vSW50cmluc2ljcy5nZW4KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9WTUNvcmUvTWV0YWRhdGEuY3BwIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9NZXRhZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyYjVjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvTWV0YWRhdGEuY3BwCkBAIC0wLDAgKzEsNTE3IEBACisvLz09PS0tIE1ldGFkYXRhLmNwcCAtIEltcGxlbWVudCBNZXRhZGF0YSBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBNZXRhZGF0YSBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL01ldGFkYXRhLmgiCisjaW5jbHVkZSAiTExWTUNvbnRleHRJbXBsLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJTeW1ib2xUYWJsZUxpc3RUcmFpdHNJbXBsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ZhbHVlSGFuZGxlLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1EU3RyaW5nIGltcGxlbWVudGF0aW9uLgorLy8KKworTURTdHJpbmc6Ok1EU3RyaW5nKExMVk1Db250ZXh0ICZDLCBTdHJpbmdSZWYgUykKKyAgOiBWYWx1ZShUeXBlOjpnZXRNZXRhZGF0YVR5KEMpLCBWYWx1ZTo6TURTdHJpbmdWYWwpLCBTdHIoUykge30KKworTURTdHJpbmcgKk1EU3RyaW5nOjpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBTdHIpIHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IENvbnRleHQucEltcGw7CisgIFN0cmluZ01hcEVudHJ5PE1EU3RyaW5nICo+ICZFbnRyeSA9CisgICAgcEltcGwtPk1EU3RyaW5nQ2FjaGUuR2V0T3JDcmVhdGVWYWx1ZShTdHIpOworICBNRFN0cmluZyAqJlMgPSBFbnRyeS5nZXRWYWx1ZSgpOworICBpZiAoIVMpIFMgPSBuZXcgTURTdHJpbmcoQ29udGV4dCwgRW50cnkuZ2V0S2V5KCkpOworICByZXR1cm4gUzsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1ETm9kZU9wZXJhbmQgaW1wbGVtZW50YXRpb24uCisvLworCisvLyBVc2UgQ2FsbGJhY2tWSCB0byBob2xkIE1ETm9kZSBvcGVyYW5kcy4KK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1ETm9kZU9wZXJhbmQgOiBwdWJsaWMgQ2FsbGJhY2tWSCB7CisgIE1ETm9kZSAqUGFyZW50OworcHVibGljOgorICBNRE5vZGVPcGVyYW5kKFZhbHVlICpWLCBNRE5vZGUgKlApIDogQ2FsbGJhY2tWSChWKSwgUGFyZW50KFApIHt9CisgIH5NRE5vZGVPcGVyYW5kKCkge30KKworICB2b2lkIHNldChWYWx1ZSAqVikgeworICAgIHNldFZhbFB0cihWKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBkZWxldGVkKCk7CisgIHZpcnR1YWwgdm9pZCBhbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICpOVik7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0uCisKKwordm9pZCBNRE5vZGVPcGVyYW5kOjpkZWxldGVkKCkgeworICBQYXJlbnQtPnJlcGxhY2VPcGVyYW5kKHRoaXMsIDApOworfQorCit2b2lkIE1ETm9kZU9wZXJhbmQ6OmFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKk5WKSB7CisgIFBhcmVudC0+cmVwbGFjZU9wZXJhbmQodGhpcywgTlYpOworfQorCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1ETm9kZSBpbXBsZW1lbnRhdGlvbi4KKy8vCisKKy8vLyBnZXRPcGVyYW5kUHRyIC0gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgTUROb2RlT3BlcmFuZCdzIGNvYWxsb2NhdGVkIG9uCisvLy8gdGhlIGVuZCBvZiB0aGUgTUROb2RlLgorc3RhdGljIE1ETm9kZU9wZXJhbmQgKmdldE9wZXJhbmRQdHIoTUROb2RlICpOLCB1bnNpZ25lZCBPcCkgeworICAvLyBVc2UgPD0gaW5zdGVhZCBvZiA8IHRvIHBlcm1pdCBhIG9uZS1wYXN0LXRoZS1lbmQgYWRkcmVzcy4KKyAgYXNzZXJ0KE9wIDw9IE4tPmdldE51bU9wZXJhbmRzKCkgJiYgIkludmFsaWQgb3BlcmFuZCBudW1iZXIiKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TUROb2RlT3BlcmFuZCo+KE4rMSkrT3A7Cit9CisKK01ETm9kZTo6TUROb2RlKExMVk1Db250ZXh0ICZDLCBWYWx1ZSAqY29uc3QgKlZhbHMsIHVuc2lnbmVkIE51bVZhbHMsCisgICAgICAgICAgICAgICBib29sIGlzRnVuY3Rpb25Mb2NhbCkKKzogVmFsdWUoVHlwZTo6Z2V0TWV0YWRhdGFUeShDKSwgVmFsdWU6Ok1ETm9kZVZhbCkgeworICBOdW1PcGVyYW5kcyA9IE51bVZhbHM7CisKKyAgaWYgKGlzRnVuY3Rpb25Mb2NhbCkKKyAgICBzZXRWYWx1ZVN1YmNsYXNzRGF0YShnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSB8IEZ1bmN0aW9uTG9jYWxCaXQpOworCisgIC8vIEluaXRpYWxpemUgdGhlIG9wZXJhbmQgbGlzdCwgd2hpY2ggaXMgY28tYWxsb2NhdGVkIG9uIHRoZSBlbmQgb2YgdGhlIG5vZGUuCisgIGZvciAoTUROb2RlT3BlcmFuZCAqT3AgPSBnZXRPcGVyYW5kUHRyKHRoaXMsIDApLCAqRSA9IE9wK051bU9wZXJhbmRzOworICAgICAgIE9wICE9IEU7ICsrT3AsICsrVmFscykKKyAgICBuZXcgKE9wKSBNRE5vZGVPcGVyYW5kKCpWYWxzLCB0aGlzKTsKK30KKworCisvLy8gfk1ETm9kZSAtIERlc3Ryb3kgTUROb2RlLgorTUROb2RlOjp+TUROb2RlKCkgeworICBhc3NlcnQoKGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICYgRGVzdHJveUZsYWcpICE9IDAgJiYKKyAgICAgICAgICJOb3QgYmVpbmcgZGVzdHJveWVkIHRocm91Z2ggZGVzdHJveSgpPyIpOworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gZ2V0VHlwZSgpLT5nZXRDb250ZXh0KCkucEltcGw7CisgIGlmIChpc05vdFVuaXF1ZWQoKSkgeworICAgIHBJbXBsLT5Ob25VbmlxdWVkTUROb2Rlcy5lcmFzZSh0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBwSW1wbC0+TUROb2RlU2V0LlJlbW92ZU5vZGUodGhpcyk7CisgIH0KKworICAvLyBEZXN0cm95IHRoZSBvcGVyYW5kcy4KKyAgZm9yIChNRE5vZGVPcGVyYW5kICpPcCA9IGdldE9wZXJhbmRQdHIodGhpcywgMCksICpFID0gT3ArTnVtT3BlcmFuZHM7CisgICAgICAgT3AgIT0gRTsgKytPcCkKKyAgICBPcC0+fk1ETm9kZU9wZXJhbmQoKTsKK30KKworc3RhdGljIGNvbnN0IEZ1bmN0aW9uICpnZXRGdW5jdGlvbkZvclZhbHVlKFZhbHVlICpWKSB7CisgIGlmICghVikgcmV0dXJuIE5VTEw7CisgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkgeworICAgIEJhc2ljQmxvY2sgKkJCID0gSS0+Z2V0UGFyZW50KCk7CisgICAgcmV0dXJuIEJCID8gQkItPmdldFBhcmVudCgpIDogMDsKKyAgfQorICBpZiAoQXJndW1lbnQgKkEgPSBkeW5fY2FzdDxBcmd1bWVudD4oVikpCisgICAgcmV0dXJuIEEtPmdldFBhcmVudCgpOworICBpZiAoQmFzaWNCbG9jayAqQkIgPSBkeW5fY2FzdDxCYXNpY0Jsb2NrPihWKSkKKyAgICByZXR1cm4gQkItPmdldFBhcmVudCgpOworICBpZiAoTUROb2RlICpNRCA9IGR5bl9jYXN0PE1ETm9kZT4oVikpCisgICAgcmV0dXJuIE1ELT5nZXRGdW5jdGlvbigpOworICByZXR1cm4gTlVMTDsKK30KKworI2lmbmRlZiBOREVCVUcKK3N0YXRpYyBjb25zdCBGdW5jdGlvbiAqYXNzZXJ0TG9jYWxGdW5jdGlvbihjb25zdCBNRE5vZGUgKk4pIHsKKyAgaWYgKCFOLT5pc0Z1bmN0aW9uTG9jYWwoKSkgcmV0dXJuIDA7CisKKyAgLy8gRklYTUU6IFRoaXMgZG9lcyBub3QgaGFuZGxlIGN5Y2xpYyBmdW5jdGlvbiBsb2NhbCBtZXRhZGF0YS4KKyAgY29uc3QgRnVuY3Rpb24gKkYgPSAwLCAqTmV3RiA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChWYWx1ZSAqViA9IE4tPmdldE9wZXJhbmQoaSkpIHsKKyAgICAgIGlmIChNRE5vZGUgKk1EID0gZHluX2Nhc3Q8TUROb2RlPihWKSkKKyAgICAgICAgTmV3RiA9IGFzc2VydExvY2FsRnVuY3Rpb24oTUQpOworICAgICAgZWxzZQorICAgICAgICBOZXdGID0gZ2V0RnVuY3Rpb25Gb3JWYWx1ZShWKTsKKyAgICB9CisgICAgaWYgKEYgPT0gMCkKKyAgICAgIEYgPSBOZXdGOworICAgIGVsc2UgCisgICAgICBhc3NlcnQoKE5ld0YgPT0gMCB8fCBGID09IE5ld0YpICYmImluY29uc2lzdGVudCBmdW5jdGlvbi1sb2NhbCBtZXRhZGF0YSIpOworICB9CisgIHJldHVybiBGOworfQorI2VuZGlmCisKKy8vIGdldEZ1bmN0aW9uIC0gSWYgdGhpcyBtZXRhZGF0YSBpcyBmdW5jdGlvbi1sb2NhbCBhbmQgcmVjdXJzaXZlbHkgaGFzIGEKKy8vIGZ1bmN0aW9uLWxvY2FsIG9wZXJhbmQsIHJldHVybiB0aGUgZmlyc3Qgc3VjaCBvcGVyYW5kJ3MgcGFyZW50IGZ1bmN0aW9uLgorLy8gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4gZ2V0RnVuY3Rpb24oKSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIHBlcmZvcm1hbmNlLQorLy8gY3JpdGljYWwgY29kZSBiZWNhdXNlIGl0IHJlY3Vyc2l2ZWx5IHZpc2l0cyBhbGwgdGhlIE1ETm9kZSdzIG9wZXJhbmRzLiAgCitjb25zdCBGdW5jdGlvbiAqTUROb2RlOjpnZXRGdW5jdGlvbigpIGNvbnN0IHsKKyNpZm5kZWYgTkRFQlVHCisgIHJldHVybiBhc3NlcnRMb2NhbEZ1bmN0aW9uKHRoaXMpOworI2VuZGlmCisgIGlmICghaXNGdW5jdGlvbkxvY2FsKCkpIHJldHVybiBOVUxMOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uICpGID0gZ2V0RnVuY3Rpb25Gb3JWYWx1ZShnZXRPcGVyYW5kKGkpKSkKKyAgICAgIHJldHVybiBGOworICByZXR1cm4gTlVMTDsKK30KKworLy8gZGVzdHJveSAtIERlbGV0ZSB0aGlzIG5vZGUuICBPbmx5IHdoZW4gdGhlcmUgYXJlIG5vIHVzZXMuCit2b2lkIE1ETm9kZTo6ZGVzdHJveSgpIHsKKyAgc2V0VmFsdWVTdWJjbGFzc0RhdGEoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgfCBEZXN0cm95RmxhZyk7CisgIC8vIFBsYWNlbWVudCBkZWxldGUsIHRoZSBmcmVlIHRoZSBtZW1vcnkuCisgIHRoaXMtPn5NRE5vZGUoKTsKKyAgZnJlZSh0aGlzKTsKK30KKworLy8vIGlzRnVuY3Rpb25Mb2NhbFZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHZhbHVlIHRoYXQgd291bGQgcmVxdWlyZSBhCisvLy8gZnVuY3Rpb24tbG9jYWwgTUROb2RlLgorc3RhdGljIGJvb2wgaXNGdW5jdGlvbkxvY2FsVmFsdWUoVmFsdWUgKlYpIHsKKyAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgfHwgaXNhPEFyZ3VtZW50PihWKSB8fCBpc2E8QmFzaWNCbG9jaz4oVikgfHwKKyAgICAgICAgIChpc2E8TUROb2RlPihWKSAmJiBjYXN0PE1ETm9kZT4oViktPmlzRnVuY3Rpb25Mb2NhbCgpKTsKK30KKworTUROb2RlICpNRE5vZGU6OmdldE1ETm9kZShMTFZNQ29udGV4dCAmQ29udGV4dCwgVmFsdWUgKmNvbnN0ICpWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1WYWxzLCBGdW5jdGlvbkxvY2FsbmVzcyBGTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbnNlcnQpIHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IENvbnRleHQucEltcGw7CisgIGJvb2wgaXNGdW5jdGlvbkxvY2FsID0gZmFsc2U7CisgIHN3aXRjaCAoRkwpIHsKKyAgY2FzZSBGTF9Vbmtub3duOgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtVmFsczsgKytpKSB7CisgICAgICBWYWx1ZSAqViA9IFZhbHNbaV07CisgICAgICBpZiAoIVYpIGNvbnRpbnVlOworICAgICAgaWYgKGlzRnVuY3Rpb25Mb2NhbFZhbHVlKFYpKSB7CisgICAgICAgIGlzRnVuY3Rpb25Mb2NhbCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBGTF9ObzoKKyAgICBpc0Z1bmN0aW9uTG9jYWwgPSBmYWxzZTsKKyAgICBicmVhazsKKyAgY2FzZSBGTF9ZZXM6CisgICAgaXNGdW5jdGlvbkxvY2FsID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorCisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtVmFsczsgKytpKQorICAgIElELkFkZFBvaW50ZXIoVmFsc1tpXSk7CisgIElELkFkZEJvb2xlYW4oaXNGdW5jdGlvbkxvY2FsKTsKKworICB2b2lkICpJbnNlcnRQb2ludDsKKyAgTUROb2RlICpOID0gTlVMTDsKKyAgCisgIGlmICgoTiA9IHBJbXBsLT5NRE5vZGVTZXQuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9pbnQpKSkKKyAgICByZXR1cm4gTjsKKyAgICAKKyAgaWYgKCFJbnNlcnQpCisgICAgcmV0dXJuIE5VTEw7CisgICAgCisgIC8vIENvYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBub2RlIGFuZCBPcGVyYW5kcyB0b2dldGhlciwgdGhlbiBwbGFjZW1lbnQgbmV3LgorICB2b2lkICpQdHIgPSBtYWxsb2Moc2l6ZW9mKE1ETm9kZSkrTnVtVmFscypzaXplb2YoTUROb2RlT3BlcmFuZCkpOworICBOID0gbmV3IChQdHIpIE1ETm9kZShDb250ZXh0LCBWYWxzLCBOdW1WYWxzLCBpc0Z1bmN0aW9uTG9jYWwpOworCisgIC8vIEluc2VydFBvaW50IHdpbGwgaGF2ZSBiZWVuIHNldCBieSB0aGUgRmluZE5vZGVPckluc2VydFBvcyBjYWxsLgorICBwSW1wbC0+TUROb2RlU2V0Lkluc2VydE5vZGUoTiwgSW5zZXJ0UG9pbnQpOworCisgIHJldHVybiBOOworfQorCitNRE5vZGUgKk1ETm9kZTo6Z2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBWYWx1ZSpjb25zdCogVmFscywgdW5zaWduZWQgTnVtVmFscykgeworICByZXR1cm4gZ2V0TUROb2RlKENvbnRleHQsIFZhbHMsIE51bVZhbHMsIEZMX1Vua25vd24pOworfQorCitNRE5vZGUgKk1ETm9kZTo6Z2V0V2hlblZhbHNVbnJlc29sdmVkKExMVk1Db250ZXh0ICZDb250ZXh0LCBWYWx1ZSAqY29uc3QgKlZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVZhbHMsIGJvb2wgaXNGdW5jdGlvbkxvY2FsKSB7CisgIHJldHVybiBnZXRNRE5vZGUoQ29udGV4dCwgVmFscywgTnVtVmFscywgaXNGdW5jdGlvbkxvY2FsID8gRkxfWWVzIDogRkxfTm8pOworfQorCitNRE5vZGUgKk1ETm9kZTo6Z2V0SWZFeGlzdHMoTExWTUNvbnRleHQgJkNvbnRleHQsIFZhbHVlICpjb25zdCAqVmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1WYWxzKSB7CisgIHJldHVybiBnZXRNRE5vZGUoQ29udGV4dCwgVmFscywgTnVtVmFscywgRkxfVW5rbm93biwgZmFsc2UpOworfQorCisvLy8gZ2V0T3BlcmFuZCAtIFJldHVybiBzcGVjaWZpZWQgb3BlcmFuZC4KK1ZhbHVlICpNRE5vZGU6OmdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3QgeworICByZXR1cm4gKmdldE9wZXJhbmRQdHIoY29uc3RfY2FzdDxNRE5vZGUqPih0aGlzKSwgaSk7Cit9CisKK3ZvaWQgTUROb2RlOjpQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICBJRC5BZGRQb2ludGVyKGdldE9wZXJhbmQoaSkpOworICBJRC5BZGRCb29sZWFuKGlzRnVuY3Rpb25Mb2NhbCgpKTsKK30KKwordm9pZCBNRE5vZGU6OnNldElzTm90VW5pcXVlZCgpIHsKKyAgc2V0VmFsdWVTdWJjbGFzc0RhdGEoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgfCBOb3RVbmlxdWVkQml0KTsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IGdldFR5cGUoKS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICBwSW1wbC0+Tm9uVW5pcXVlZE1ETm9kZXMuaW5zZXJ0KHRoaXMpOworfQorCisvLyBSZXBsYWNlIHZhbHVlIGZyb20gdGhpcyBub2RlJ3Mgb3BlcmFuZCBsaXN0Lgordm9pZCBNRE5vZGU6OnJlcGxhY2VPcGVyYW5kKE1ETm9kZU9wZXJhbmQgKk9wLCBWYWx1ZSAqVG8pIHsKKyAgVmFsdWUgKkZyb20gPSAqT3A7CisKKyAgLy8gSWYgaXMgcG9zc2libGUgdGhhdCBzb21lb25lIGRpZCBHVi0+UkFVVyhpbnN0KSwgcmVwbGFjaW5nIGEgZ2xvYmFsIHZhcmlhYmxlCisgIC8vIHdpdGggYW4gaW5zdHJ1Y3Rpb24gb3Igc29tZSBvdGhlciBmdW5jdGlvbi1sb2NhbCBvYmplY3QuICBJZiB0aGlzIGlzIGEKKyAgLy8gbm9uLWZ1bmN0aW9uLWxvY2FsIE1ETm9kZSwgaXQgY2FuJ3QgcG9pbnQgdG8gYSBmdW5jdGlvbi1sb2NhbCBvYmplY3QuCisgIC8vIEhhbmRsZSB0aGlzIGNhc2UgYnkgaW1wbGljaXRseSBkcm9wcGluZyB0aGUgTUROb2RlIHJlZmVyZW5jZSB0byBudWxsLgorICAvLyBMaWtld2lzZSBpZiB0aGUgTUROb2RlIGlzIGZ1bmN0aW9uLWxvY2FsIGJ1dCBmb3IgYSBkaWZmZXJlbnQgZnVuY3Rpb24uCisgIGlmIChUbyAmJiBpc0Z1bmN0aW9uTG9jYWxWYWx1ZShUbykpIHsKKyAgICBpZiAoIWlzRnVuY3Rpb25Mb2NhbCgpKQorICAgICAgVG8gPSAwOworICAgIGVsc2UgeworICAgICAgY29uc3QgRnVuY3Rpb24gKkYgPSBnZXRGdW5jdGlvbigpOworICAgICAgY29uc3QgRnVuY3Rpb24gKkZWID0gZ2V0RnVuY3Rpb25Gb3JWYWx1ZShUbyk7CisgICAgICAvLyBNZXRhZGF0YSBjYW4gYmUgZnVuY3Rpb24tbG9jYWwgd2l0aG91dCBoYXZpbmcgYW4gYXNzb2NpYXRlZCBmdW5jdGlvbi4KKyAgICAgIC8vIFNvIG9ubHkgY29uc2lkZXIgZnVuY3Rpb25zIHRvIGhhdmUgY2hhbmdlZCBpZiBub24tbnVsbC4KKyAgICAgIGlmIChGICYmIEZWICYmIEYgIT0gRlYpCisgICAgICAgIFRvID0gMDsKKyAgICB9CisgIH0KKyAgCisgIGlmIChGcm9tID09IFRvKQorICAgIHJldHVybjsKKworICAvLyBVcGRhdGUgdGhlIG9wZXJhbmQuCisgIE9wLT5zZXQoVG8pOworCisgIC8vIElmIHRoaXMgbm9kZSBpcyBhbHJlYWR5IG5vdCBiZWluZyB1bmlxdWVkIChiZWNhdXNlIG9uZSBvZiB0aGUgb3BlcmFuZHMKKyAgLy8gYWxyZWFkeSB3ZW50IHRvIG51bGwpLCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkbyBoZXJlLgorICBpZiAoaXNOb3RVbmlxdWVkKCkpIHJldHVybjsKKworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gZ2V0VHlwZSgpLT5nZXRDb250ZXh0KCkucEltcGw7CisKKyAgLy8gUmVtb3ZlICJ0aGlzIiBmcm9tIHRoZSBjb250ZXh0IG1hcC4gIEZvbGRpbmdTZXQgZG9lc24ndCBoYXZlIHRvIHJlcHJvZmlsZQorICAvLyB0aGlzIG5vZGUgdG8gcmVtb3ZlIGl0LCBzbyB3ZSBkb24ndCBjYXJlIHdoYXQgc3RhdGUgdGhlIG9wZXJhbmRzIGFyZSBpbi4KKyAgcEltcGwtPk1ETm9kZVNldC5SZW1vdmVOb2RlKHRoaXMpOworCisgIC8vIElmIHdlIGFyZSBkcm9wcGluZyBhbiBhcmd1bWVudCB0byBudWxsLCB3ZSBjaG9vc2UgdG8gbm90IHVuaXF1ZSB0aGUgTUROb2RlCisgIC8vIGFueW1vcmUuICBUaGlzIGNvbW1vbmx5IG9jY3VycyBkdXJpbmcgZGVzdHJ1Y3Rpb24sIGFuZCB1bmlxdWluZyB0aGVzZQorICAvLyBicmluZ3MgbGl0dGxlIHJldXNlLgorICBpZiAoVG8gPT0gMCkgeworICAgIHNldElzTm90VW5pcXVlZCgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE5vdyB0aGF0IHRoZSBub2RlIGlzIG91dCBvZiB0aGUgZm9sZGluZyBzZXQsIGdldCByZWFkeSB0byByZWluc2VydCBpdC4KKyAgLy8gRmlyc3QsIGNoZWNrIHRvIHNlZSBpZiBhbm90aGVyIG5vZGUgd2l0aCB0aGUgc2FtZSBvcGVyYW5kcyBhbHJlYWR5IGV4aXN0cworICAvLyBpbiB0aGUgc2V0LiAgSWYgaXQgZG9lc24ndCBleGlzdCwgdGhpcyByZXR1cm5zIHRoZSBwb3NpdGlvbiB0byBpbnNlcnQgaXQuCisgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIFByb2ZpbGUoSUQpOworICB2b2lkICpJbnNlcnRQb2ludDsKKyAgTUROb2RlICpOID0gcEltcGwtPk1ETm9kZVNldC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJbnNlcnRQb2ludCk7CisKKyAgaWYgKE4pIHsKKyAgICBOLT5yZXBsYWNlQWxsVXNlc1dpdGgodGhpcyk7CisgICAgTi0+ZGVzdHJveSgpOworICAgIE4gPSBwSW1wbC0+TUROb2RlU2V0LkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvaW50KTsKKyAgICBhc3NlcnQoTiA9PSAwICYmICJzaG91bGRuJ3QgYmUgaW4gdGhlIG1hcCBub3chIik7ICh2b2lkKU47CisgIH0KKworICAvLyBJbnNlcnRQb2ludCB3aWxsIGhhdmUgYmVlbiBzZXQgYnkgdGhlIEZpbmROb2RlT3JJbnNlcnRQb3MgY2FsbC4KKyAgcEltcGwtPk1ETm9kZVNldC5JbnNlcnROb2RlKHRoaXMsIEluc2VydFBvaW50KTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE5hbWVkTUROb2RlIGltcGxlbWVudGF0aW9uLgorLy8KKworc3RhdGljIFNtYWxsVmVjdG9yPFRyYWNraW5nVkg8TUROb2RlPiwgND4gJmdldE5NRE9wcyh2b2lkICpPcGVyYW5kcykgeworICByZXR1cm4gKihTbWFsbFZlY3RvcjxUcmFja2luZ1ZIPE1ETm9kZT4sIDQ+KilPcGVyYW5kczsKK30KKworTmFtZWRNRE5vZGU6Ok5hbWVkTUROb2RlKGNvbnN0IFR3aW5lICZOKQorICA6IE5hbWUoTi5zdHIoKSksIFBhcmVudCgwKSwKKyAgICBPcGVyYW5kcyhuZXcgU21hbGxWZWN0b3I8VHJhY2tpbmdWSDxNRE5vZGU+LCA0PigpKSB7Cit9CisKK05hbWVkTUROb2RlOjp+TmFtZWRNRE5vZGUoKSB7CisgIGRyb3BBbGxSZWZlcmVuY2VzKCk7CisgIGRlbGV0ZSAmZ2V0Tk1ET3BzKE9wZXJhbmRzKTsKK30KKworLy8vIGdldE51bU9wZXJhbmRzIC0gUmV0dXJuIG51bWJlciBvZiBOYW1lZE1ETm9kZSBvcGVyYW5kcy4KK3Vuc2lnbmVkIE5hbWVkTUROb2RlOjpnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsKKyAgcmV0dXJuICh1bnNpZ25lZClnZXROTURPcHMoT3BlcmFuZHMpLnNpemUoKTsKK30KKworLy8vIGdldE9wZXJhbmQgLSBSZXR1cm4gc3BlY2lmaWVkIG9wZXJhbmQuCitNRE5vZGUgKk5hbWVkTUROb2RlOjpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgYXNzZXJ0KGkgPCBnZXROdW1PcGVyYW5kcygpICYmICJJbnZhbGlkIE9wZXJhbmQgbnVtYmVyISIpOworICByZXR1cm4gZHluX2Nhc3Q8TUROb2RlPigmKmdldE5NRE9wcyhPcGVyYW5kcylbaV0pOworfQorCisvLy8gYWRkT3BlcmFuZCAtIEFkZCBtZXRhZGF0YSBPcGVyYW5kLgordm9pZCBOYW1lZE1ETm9kZTo6YWRkT3BlcmFuZChNRE5vZGUgKk0pIHsKKyAgZ2V0Tk1ET3BzKE9wZXJhbmRzKS5wdXNoX2JhY2soVHJhY2tpbmdWSDxNRE5vZGU+KE0pKTsKK30KKworLy8vIGVyYXNlRnJvbVBhcmVudCAtIERyb3AgYWxsIHJlZmVyZW5jZXMgYW5kIHJlbW92ZSB0aGUgbm9kZSBmcm9tIHBhcmVudAorLy8vIG1vZHVsZS4KK3ZvaWQgTmFtZWRNRE5vZGU6OmVyYXNlRnJvbVBhcmVudCgpIHsKKyAgZ2V0UGFyZW50KCktPmVyYXNlTmFtZWRNZXRhZGF0YSh0aGlzKTsKK30KKworLy8vIGRyb3BBbGxSZWZlcmVuY2VzIC0gUmVtb3ZlIGFsbCB1c2VzIGFuZCBjbGVhciBub2RlIHZlY3Rvci4KK3ZvaWQgTmFtZWRNRE5vZGU6OmRyb3BBbGxSZWZlcmVuY2VzKCkgeworICBnZXROTURPcHMoT3BlcmFuZHMpLmNsZWFyKCk7Cit9CisKKy8vLyBnZXROYW1lIC0gUmV0dXJuIGEgY29uc3RhbnQgcmVmZXJlbmNlIHRvIHRoaXMgbmFtZWQgbWV0YWRhdGEncyBuYW1lLgorU3RyaW5nUmVmIE5hbWVkTUROb2RlOjpnZXROYW1lKCkgY29uc3QgeworICByZXR1cm4gU3RyaW5nUmVmKE5hbWUpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gTWV0YWRhdGEgbWV0aG9kIGltcGxlbWVudGF0aW9ucy4KKy8vCisKK3ZvaWQgSW5zdHJ1Y3Rpb246OnNldE1ldGFkYXRhKGNvbnN0IGNoYXIgKktpbmQsIE1ETm9kZSAqTm9kZSkgeworICBpZiAoTm9kZSA9PSAwICYmICFoYXNNZXRhZGF0YSgpKSByZXR1cm47CisgIHNldE1ldGFkYXRhKGdldENvbnRleHQoKS5nZXRNREtpbmRJRChLaW5kKSwgTm9kZSk7Cit9CisKK01ETm9kZSAqSW5zdHJ1Y3Rpb246OmdldE1ldGFkYXRhSW1wbChjb25zdCBjaGFyICpLaW5kKSBjb25zdCB7CisgIHJldHVybiBnZXRNZXRhZGF0YUltcGwoZ2V0Q29udGV4dCgpLmdldE1ES2luZElEKEtpbmQpKTsKK30KKworLy8vIHNldE1ldGFkYXRhIC0gU2V0IHRoZSBtZXRhZGF0YSBvZiBvZiB0aGUgc3BlY2lmaWVkIGtpbmQgdG8gdGhlIHNwZWNpZmllZAorLy8vIG5vZGUuICBUaGlzIHVwZGF0ZXMvcmVwbGFjZXMgbWV0YWRhdGEgaWYgYWxyZWFkeSBwcmVzZW50LCBvciByZW1vdmVzIGl0IGlmCisvLy8gTm9kZSBpcyBudWxsLgordm9pZCBJbnN0cnVjdGlvbjo6c2V0TWV0YWRhdGEodW5zaWduZWQgS2luZElELCBNRE5vZGUgKk5vZGUpIHsKKyAgaWYgKE5vZGUgPT0gMCAmJiAhaGFzTWV0YWRhdGEoKSkgcmV0dXJuOworCisgIC8vIEhhbmRsZSAnZGJnJyBhcyBhIHNwZWNpYWwgY2FzZSBzaW5jZSBpdCBpcyBub3Qgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlLgorICBpZiAoS2luZElEID09IExMVk1Db250ZXh0OjpNRF9kYmcpIHsKKyAgICBEYmdMb2MgPSBEZWJ1Z0xvYzo6Z2V0RnJvbURJTG9jYXRpb24oTm9kZSk7CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlbiB3ZSdyZSBhZGRpbmcvdXBkYXRpbmcgbWV0YWRhdGEgb24gYW4gaW5zdHJ1Y3Rpb24uCisgIGlmIChOb2RlKSB7CisgICAgTExWTUNvbnRleHRJbXBsOjpNRE1hcFR5ICZJbmZvID0gZ2V0Q29udGV4dCgpLnBJbXBsLT5NZXRhZGF0YVN0b3JlW3RoaXNdOworICAgIGFzc2VydCghSW5mby5lbXB0eSgpID09IGhhc01ldGFkYXRhSGFzaEVudHJ5KCkgJiYKKyAgICAgICAgICAgIkhhc01ldGFkYXRhIGJpdCBpcyB3b25rZWQiKTsKKyAgICBpZiAoSW5mby5lbXB0eSgpKSB7CisgICAgICBzZXRIYXNNZXRhZGF0YUhhc2hFbnRyeSh0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSGFuZGxlIHJlcGxhY2VtZW50IG9mIGFuIGV4aXN0aW5nIHZhbHVlLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluZm8uc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKEluZm9baV0uZmlyc3QgPT0gS2luZElEKSB7CisgICAgICAgICAgSW5mb1tpXS5zZWNvbmQgPSBOb2RlOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vIHJlcGxhY2VtZW50LCBqdXN0IGFkZCBpdCB0byB0aGUgbGlzdC4KKyAgICBJbmZvLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihLaW5kSUQsIE5vZGUpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBPdGhlcndpc2UsIHdlJ3JlIHJlbW92aW5nIG1ldGFkYXRhIGZyb20gYW4gaW5zdHJ1Y3Rpb24uCisgIGFzc2VydChoYXNNZXRhZGF0YUhhc2hFbnRyeSgpICYmCisgICAgICAgICBnZXRDb250ZXh0KCkucEltcGwtPk1ldGFkYXRhU3RvcmUuY291bnQodGhpcykgJiYKKyAgICAgICAgICJIYXNNZXRhZGF0YSBiaXQgb3V0IG9mIGRhdGUhIik7CisgIExMVk1Db250ZXh0SW1wbDo6TURNYXBUeSAmSW5mbyA9IGdldENvbnRleHQoKS5wSW1wbC0+TWV0YWRhdGFTdG9yZVt0aGlzXTsKKworICAvLyBDb21tb24gY2FzZSBpcyByZW1vdmluZyB0aGUgb25seSBlbnRyeS4KKyAgaWYgKEluZm8uc2l6ZSgpID09IDEgJiYgSW5mb1swXS5maXJzdCA9PSBLaW5kSUQpIHsKKyAgICBnZXRDb250ZXh0KCkucEltcGwtPk1ldGFkYXRhU3RvcmUuZXJhc2UodGhpcyk7CisgICAgc2V0SGFzTWV0YWRhdGFIYXNoRW50cnkoZmFsc2UpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEhhbmRsZSByZW1vdmFsIG9mIGFuIGV4aXN0aW5nIHZhbHVlLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5mby5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChJbmZvW2ldLmZpcnN0ID09IEtpbmRJRCkgeworICAgICAgSW5mb1tpXSA9IEluZm8uYmFjaygpOworICAgICAgSW5mby5wb3BfYmFjaygpOworICAgICAgYXNzZXJ0KCFJbmZvLmVtcHR5KCkgJiYgIlJlbW92aW5nIGxhc3QgZW50cnkgc2hvdWxkIGJlIGhhbmRsZWQgYWJvdmUiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIC8vIE90aGVyd2lzZSwgcmVtb3ZpbmcgYW4gZW50cnkgdGhhdCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBpbnN0cnVjdGlvbi4KK30KKworTUROb2RlICpJbnN0cnVjdGlvbjo6Z2V0TWV0YWRhdGFJbXBsKHVuc2lnbmVkIEtpbmRJRCkgY29uc3QgeworICAvLyBIYW5kbGUgJ2RiZycgYXMgYSBzcGVjaWFsIGNhc2Ugc2luY2UgaXQgaXMgbm90IHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZS4KKyAgaWYgKEtpbmRJRCA9PSBMTFZNQ29udGV4dDo6TURfZGJnKQorICAgIHJldHVybiBEYmdMb2MuZ2V0QXNNRE5vZGUoZ2V0Q29udGV4dCgpKTsKKyAgCisgIGlmICghaGFzTWV0YWRhdGFIYXNoRW50cnkoKSkgcmV0dXJuIDA7CisgIAorICBMTFZNQ29udGV4dEltcGw6Ok1ETWFwVHkgJkluZm8gPSBnZXRDb250ZXh0KCkucEltcGwtPk1ldGFkYXRhU3RvcmVbdGhpc107CisgIGFzc2VydCghSW5mby5lbXB0eSgpICYmICJiaXQgb3V0IG9mIHN5bmMgd2l0aCBoYXNoIHRhYmxlIik7CisKKyAgZm9yIChMTFZNQ29udGV4dEltcGw6Ok1ETWFwVHk6Oml0ZXJhdG9yIEkgPSBJbmZvLmJlZ2luKCksIEUgPSBJbmZvLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGlmIChJLT5maXJzdCA9PSBLaW5kSUQpCisgICAgICByZXR1cm4gSS0+c2Vjb25kOworICByZXR1cm4gMDsKK30KKwordm9pZCBJbnN0cnVjdGlvbjo6Z2V0QWxsTWV0YWRhdGFJbXBsKFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8dW5zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUqPiA+ICZSZXN1bHQpIGNvbnN0IHsKKyAgUmVzdWx0LmNsZWFyKCk7CisgIAorICAvLyBIYW5kbGUgJ2RiZycgYXMgYSBzcGVjaWFsIGNhc2Ugc2luY2UgaXQgaXMgbm90IHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZS4KKyAgaWYgKCFEYmdMb2MuaXNVbmtub3duKCkpIHsKKyAgICBSZXN1bHQucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCh1bnNpZ25lZClMTFZNQ29udGV4dDo6TURfZGJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGJnTG9jLmdldEFzTUROb2RlKGdldENvbnRleHQoKSkpKTsKKyAgICBpZiAoIWhhc01ldGFkYXRhSGFzaEVudHJ5KCkpIHJldHVybjsKKyAgfQorICAKKyAgYXNzZXJ0KGhhc01ldGFkYXRhSGFzaEVudHJ5KCkgJiYKKyAgICAgICAgIGdldENvbnRleHQoKS5wSW1wbC0+TWV0YWRhdGFTdG9yZS5jb3VudCh0aGlzKSAmJgorICAgICAgICAgIlNob3VsZG4ndCBoYXZlIGNhbGxlZCB0aGlzIik7CisgIGNvbnN0IExMVk1Db250ZXh0SW1wbDo6TURNYXBUeSAmSW5mbyA9CisgICAgZ2V0Q29udGV4dCgpLnBJbXBsLT5NZXRhZGF0YVN0b3JlLmZpbmQodGhpcyktPnNlY29uZDsKKyAgYXNzZXJ0KCFJbmZvLmVtcHR5KCkgJiYgIlNob3VsZG4ndCBoYXZlIGNhbGxlZCB0aGlzIik7CisKKyAgUmVzdWx0LmFwcGVuZChJbmZvLmJlZ2luKCksIEluZm8uZW5kKCkpOworCisgIC8vIFNvcnQgdGhlIHJlc3VsdGluZyBhcnJheSBzbyBpdCBpcyBzdGFibGUuCisgIGlmIChSZXN1bHQuc2l6ZSgpID4gMSkKKyAgICBhcnJheV9wb2Rfc29ydChSZXN1bHQuYmVnaW4oKSwgUmVzdWx0LmVuZCgpKTsKK30KKwordm9pZCBJbnN0cnVjdGlvbjo6CitnZXRBbGxNZXRhZGF0YU90aGVyVGhhbkRlYnVnTG9jSW1wbChTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPHVuc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlKj4gPiAmUmVzdWx0KSBjb25zdCB7CisgIFJlc3VsdC5jbGVhcigpOworICBhc3NlcnQoaGFzTWV0YWRhdGFIYXNoRW50cnkoKSAmJgorICAgICAgICAgZ2V0Q29udGV4dCgpLnBJbXBsLT5NZXRhZGF0YVN0b3JlLmNvdW50KHRoaXMpICYmCisgICAgICAgICAiU2hvdWxkbid0IGhhdmUgY2FsbGVkIHRoaXMiKTsKKyAgY29uc3QgTExWTUNvbnRleHRJbXBsOjpNRE1hcFR5ICZJbmZvID0KKyAgZ2V0Q29udGV4dCgpLnBJbXBsLT5NZXRhZGF0YVN0b3JlLmZpbmQodGhpcyktPnNlY29uZDsKKyAgYXNzZXJ0KCFJbmZvLmVtcHR5KCkgJiYgIlNob3VsZG4ndCBoYXZlIGNhbGxlZCB0aGlzIik7CisgIAorICBSZXN1bHQuYXBwZW5kKEluZm8uYmVnaW4oKSwgSW5mby5lbmQoKSk7CisgIAorICAvLyBTb3J0IHRoZSByZXN1bHRpbmcgYXJyYXkgc28gaXQgaXMgc3RhYmxlLgorICBpZiAoUmVzdWx0LnNpemUoKSA+IDEpCisgICAgYXJyYXlfcG9kX3NvcnQoUmVzdWx0LmJlZ2luKCksIFJlc3VsdC5lbmQoKSk7Cit9CisKKworLy8vIGNsZWFyTWV0YWRhdGFIYXNoRW50cmllcyAtIENsZWFyIGFsbCBoYXNodGFibGUtYmFzZWQgbWV0YWRhdGEgZnJvbQorLy8vIHRoaXMgaW5zdHJ1Y3Rpb24uCit2b2lkIEluc3RydWN0aW9uOjpjbGVhck1ldGFkYXRhSGFzaEVudHJpZXMoKSB7CisgIGFzc2VydChoYXNNZXRhZGF0YUhhc2hFbnRyeSgpICYmICJDYWxsZXIgc2hvdWxkIGNoZWNrIik7CisgIGdldENvbnRleHQoKS5wSW1wbC0+TWV0YWRhdGFTdG9yZS5lcmFzZSh0aGlzKTsKKyAgc2V0SGFzTWV0YWRhdGFIYXNoRW50cnkoZmFsc2UpOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL01vZHVsZS5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL01vZHVsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkZGY5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvTW9kdWxlLmNwcApAQCAtMCwwICsxLDQ3MSBAQAorLy89PT0tLSBNb2R1bGUuY3BwIC0gSW1wbGVtZW50IHRoZSBNb2R1bGUgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTW9kdWxlIGNsYXNzIGZvciB0aGUgVk1Db3JlIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vR1ZNYXRlcmlhbGl6ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTGVha0RldGVjdG9yLmgiCisjaW5jbHVkZSAiU3ltYm9sVGFibGVMaXN0VHJhaXRzSW1wbC5oIgorI2luY2x1ZGUgImxsdm0vVHlwZVN5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWV0aG9kcyB0byBpbXBsZW1lbnQgdGhlIGdsb2JhbHMgYW5kIGZ1bmN0aW9ucyBsaXN0cy4KKy8vCisKK0dsb2JhbFZhcmlhYmxlICppbGlzdF90cmFpdHM8R2xvYmFsVmFyaWFibGU+OjpjcmVhdGVTZW50aW5lbCgpIHsKKyAgR2xvYmFsVmFyaWFibGUgKlJldCA9IG5ldyBHbG9iYWxWYXJpYWJsZShUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UpOworICAvLyBUaGlzIHNob3VsZCBub3QgYmUgZ2FyYmFnZSBtb25pdG9yZWQuCisgIExlYWtEZXRlY3Rvcjo6cmVtb3ZlR2FyYmFnZU9iamVjdChSZXQpOworICByZXR1cm4gUmV0OworfQorR2xvYmFsQWxpYXMgKmlsaXN0X3RyYWl0czxHbG9iYWxBbGlhcz46OmNyZWF0ZVNlbnRpbmVsKCkgeworICBHbG9iYWxBbGlhcyAqUmV0ID0gbmV3IEdsb2JhbEFsaWFzKFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlKTsKKyAgLy8gVGhpcyBzaG91bGQgbm90IGJlIGdhcmJhZ2UgbW9uaXRvcmVkLgorICBMZWFrRGV0ZWN0b3I6OnJlbW92ZUdhcmJhZ2VPYmplY3QoUmV0KTsKKyAgcmV0dXJuIFJldDsKK30KKworLy8gRXhwbGljaXQgaW5zdGFudGlhdGlvbnMgb2YgU3ltYm9sVGFibGVMaXN0VHJhaXRzIHNpbmNlIHNvbWUgb2YgdGhlIG1ldGhvZHMKKy8vIGFyZSBub3QgaW4gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZS4KK3RlbXBsYXRlIGNsYXNzIGxsdm06OlN5bWJvbFRhYmxlTGlzdFRyYWl0czxHbG9iYWxWYXJpYWJsZSwgTW9kdWxlPjsKK3RlbXBsYXRlIGNsYXNzIGxsdm06OlN5bWJvbFRhYmxlTGlzdFRyYWl0czxGdW5jdGlvbiwgTW9kdWxlPjsKK3RlbXBsYXRlIGNsYXNzIGxsdm06OlN5bWJvbFRhYmxlTGlzdFRyYWl0czxHbG9iYWxBbGlhcywgTW9kdWxlPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByaW1pdGl2ZSBNb2R1bGUgbWV0aG9kcy4KKy8vCisKK01vZHVsZTo6TW9kdWxlKFN0cmluZ1JlZiBNSUQsIExMVk1Db250ZXh0JiBDKQorICA6IENvbnRleHQoQyksIE1hdGVyaWFsaXplcihOVUxMKSwgTW9kdWxlSUQoTUlEKSB7CisgIFZhbFN5bVRhYiA9IG5ldyBWYWx1ZVN5bWJvbFRhYmxlKCk7CisgIFR5cGVTeW1UYWIgPSBuZXcgVHlwZVN5bWJvbFRhYmxlKCk7CisgIE5hbWVkTURTeW1UYWIgPSBuZXcgU3RyaW5nTWFwPE5hbWVkTUROb2RlICo+KCk7Cit9CisKK01vZHVsZTo6fk1vZHVsZSgpIHsKKyAgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKyAgR2xvYmFsTGlzdC5jbGVhcigpOworICBGdW5jdGlvbkxpc3QuY2xlYXIoKTsKKyAgQWxpYXNMaXN0LmNsZWFyKCk7CisgIExpYnJhcnlMaXN0LmNsZWFyKCk7CisgIE5hbWVkTURMaXN0LmNsZWFyKCk7CisgIGRlbGV0ZSBWYWxTeW1UYWI7CisgIGRlbGV0ZSBUeXBlU3ltVGFiOworICBkZWxldGUgc3RhdGljX2Nhc3Q8U3RyaW5nTWFwPE5hbWVkTUROb2RlICo+ICo+KE5hbWVkTURTeW1UYWIpOworfQorCisvLy8gVGFyZ2V0IGVuZGlhbiBpbmZvcm1hdGlvbi4uLgorTW9kdWxlOjpFbmRpYW5uZXNzIE1vZHVsZTo6Z2V0RW5kaWFubmVzcygpIGNvbnN0IHsKKyAgU3RyaW5nUmVmIHRlbXAgPSBEYXRhTGF5b3V0OworICBNb2R1bGU6OkVuZGlhbm5lc3MgcmV0ID0gQW55RW5kaWFubmVzczsKKyAgCisgIHdoaWxlICghdGVtcC5lbXB0eSgpKSB7CisgICAgU3RyaW5nUmVmIHRva2VuID0gRGF0YUxheW91dDsKKyAgICB0aWUodG9rZW4sIHRlbXApID0gZ2V0VG9rZW4odGVtcCwgIi0iKTsKKyAgICAKKyAgICBpZiAodG9rZW5bMF0gPT0gJ2UnKSB7CisgICAgICByZXQgPSBMaXR0bGVFbmRpYW47CisgICAgfSBlbHNlIGlmICh0b2tlblswXSA9PSAnRScpIHsKKyAgICAgIHJldCA9IEJpZ0VuZGlhbjsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiByZXQ7Cit9CisKKy8vLyBUYXJnZXQgUG9pbnRlciBTaXplIGluZm9ybWF0aW9uLi4uCitNb2R1bGU6OlBvaW50ZXJTaXplIE1vZHVsZTo6Z2V0UG9pbnRlclNpemUoKSBjb25zdCB7CisgIFN0cmluZ1JlZiB0ZW1wID0gRGF0YUxheW91dDsKKyAgTW9kdWxlOjpQb2ludGVyU2l6ZSByZXQgPSBBbnlQb2ludGVyU2l6ZTsKKyAgCisgIHdoaWxlICghdGVtcC5lbXB0eSgpKSB7CisgICAgU3RyaW5nUmVmIHRva2VuLCBzaWduYWxUb2tlbjsKKyAgICB0aWUodG9rZW4sIHRlbXApID0gZ2V0VG9rZW4odGVtcCwgIi0iKTsKKyAgICB0aWUoc2lnbmFsVG9rZW4sIHRva2VuKSA9IGdldFRva2VuKHRva2VuLCAiOiIpOworICAgIAorICAgIGlmIChzaWduYWxUb2tlblswXSA9PSAncCcpIHsKKyAgICAgIGludCBzaXplID0gMDsKKyAgICAgIGdldFRva2VuKHRva2VuLCAiOiIpLmZpcnN0LmdldEFzSW50ZWdlcigxMCwgc2l6ZSk7CisgICAgICBpZiAoc2l6ZSA9PSAzMikKKyAgICAgICAgcmV0ID0gUG9pbnRlcjMyOworICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA2NCkKKyAgICAgICAgcmV0ID0gUG9pbnRlcjY0OworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIHJldDsKK30KKworLy8vIGdldE5hbWVkVmFsdWUgLSBSZXR1cm4gdGhlIGZpcnN0IGdsb2JhbCB2YWx1ZSBpbiB0aGUgbW9kdWxlIHdpdGgKKy8vLyB0aGUgc3BlY2lmaWVkIG5hbWUsIG9mIGFyYml0cmFyeSB0eXBlLiAgVGhpcyBtZXRob2QgcmV0dXJucyBudWxsCisvLy8gaWYgYSBnbG9iYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGZvdW5kLgorR2xvYmFsVmFsdWUgKk1vZHVsZTo6Z2V0TmFtZWRWYWx1ZShTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICByZXR1cm4gY2FzdF9vcl9udWxsPEdsb2JhbFZhbHVlPihnZXRWYWx1ZVN5bWJvbFRhYmxlKCkubG9va3VwKE5hbWUpKTsKK30KKworLy8vIGdldE1ES2luZElEIC0gUmV0dXJuIGEgdW5pcXVlIG5vbi16ZXJvIElEIGZvciB0aGUgc3BlY2lmaWVkIG1ldGFkYXRhIGtpbmQuCisvLy8gVGhpcyBJRCBpcyB1bmlxdWVkIGFjcm9zcyBtb2R1bGVzIGluIHRoZSBjdXJyZW50IExMVk1Db250ZXh0LgordW5zaWduZWQgTW9kdWxlOjpnZXRNREtpbmRJRChTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICByZXR1cm4gQ29udGV4dC5nZXRNREtpbmRJRChOYW1lKTsKK30KKworLy8vIGdldE1ES2luZE5hbWVzIC0gUG9wdWxhdGUgY2xpZW50IHN1cHBsaWVkIFNtYWxsVmVjdG9yIHdpdGggdGhlIG5hbWUgZm9yCisvLy8gY3VzdG9tIG1ldGFkYXRhIElEcyByZWdpc3RlcmVkIGluIHRoaXMgTExWTUNvbnRleHQuICAgSUQgIzAgaXMgbm90IHVzZWQsCisvLy8gc28gaXQgaXMgZmlsbGVkIGluIGFzIGFuIGVtcHR5IHN0cmluZy4KK3ZvaWQgTW9kdWxlOjpnZXRNREtpbmROYW1lcyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmUmVzdWx0KSBjb25zdCB7CisgIHJldHVybiBDb250ZXh0LmdldE1ES2luZE5hbWVzKFJlc3VsdCk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1ldGhvZHMgZm9yIGVhc3kgYWNjZXNzIHRvIHRoZSBmdW5jdGlvbnMgaW4gdGhlIG1vZHVsZS4KKy8vCisKKy8vIGdldE9ySW5zZXJ0RnVuY3Rpb24gLSBMb29rIHVwIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaW4gdGhlIG1vZHVsZSBzeW1ib2wKKy8vIHRhYmxlLiAgSWYgaXQgZG9lcyBub3QgZXhpc3QsIGFkZCBhIHByb3RvdHlwZSBmb3IgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4KKy8vIGl0LiAgVGhpcyBpcyBuaWNlIGJlY2F1c2UgaXQgYWxsb3dzIG1vc3QgcGFzc2VzIHRvIGdldCBhd2F5IHdpdGggbm90IGhhbmRsaW5nCisvLyB0aGUgc3ltYm9sIHRhYmxlIGRpcmVjdGx5IGZvciB0aGlzIGNvbW1vbiB0YXNrLgorLy8KK0NvbnN0YW50ICpNb2R1bGU6OmdldE9ySW5zZXJ0RnVuY3Rpb24oU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJMaXN0UHRyIEF0dHJpYnV0ZUxpc3QpIHsKKyAgLy8gU2VlIGlmIHdlIGhhdmUgYSBkZWZpbml0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFscmVhZHkuCisgIEdsb2JhbFZhbHVlICpGID0gZ2V0TmFtZWRWYWx1ZShOYW1lKTsKKyAgaWYgKEYgPT0gMCkgeworICAgIC8vIE5vcGUsIGFkZCBpdAorICAgIEZ1bmN0aW9uICpOZXcgPSBGdW5jdGlvbjo6Q3JlYXRlKFR5LCBHbG9iYWxWYXJpYWJsZTo6RXh0ZXJuYWxMaW5rYWdlLCBOYW1lKTsKKyAgICBpZiAoIU5ldy0+aXNJbnRyaW5zaWMoKSkgICAgICAgLy8gSW50cmluc2ljcyBnZXQgYXR0cnMgc2V0IG9uIGNvbnN0cnVjdGlvbgorICAgICAgTmV3LT5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZUxpc3QpOworICAgIEZ1bmN0aW9uTGlzdC5wdXNoX2JhY2soTmV3KTsKKyAgICByZXR1cm4gTmV3OyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBuZXcgcHJvdG90eXBlLgorICB9CisKKyAgLy8gT2theSwgdGhlIGZ1bmN0aW9uIGV4aXN0cy4gIERvZXMgaXQgaGF2ZSBleHRlcm5hbGx5IHZpc2libGUgbGlua2FnZT8KKyAgaWYgKEYtPmhhc0xvY2FsTGlua2FnZSgpKSB7CisgICAgLy8gQ2xlYXIgdGhlIGZ1bmN0aW9uJ3MgbmFtZS4KKyAgICBGLT5zZXROYW1lKCIiKTsKKyAgICAvLyBSZXRyeSwgbm93IHRoZXJlIHdvbid0IGJlIGEgY29uZmxpY3QuCisgICAgQ29uc3RhbnQgKk5ld0YgPSBnZXRPckluc2VydEZ1bmN0aW9uKE5hbWUsIFR5KTsKKyAgICBGLT5zZXROYW1lKE5hbWUpOworICAgIHJldHVybiBOZXdGOworICB9CisKKyAgLy8gSWYgdGhlIGZ1bmN0aW9uIGV4aXN0cyBidXQgaGFzIHRoZSB3cm9uZyB0eXBlLCByZXR1cm4gYSBiaXRjYXN0IHRvIHRoZQorICAvLyByaWdodCB0eXBlLgorICBpZiAoRi0+Z2V0VHlwZSgpICE9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHkpKQorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoRiwgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeSkpOworICAKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBqdXN0IGZvdW5kIHRoZSBleGlzdGluZyBmdW5jdGlvbiBvciBhIHByb3RvdHlwZS4KKyAgcmV0dXJuIEY7ICAKK30KKworQ29uc3RhbnQgKk1vZHVsZTo6Z2V0T3JJbnNlcnRUYXJnZXRJbnRyaW5zaWMoU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ckxpc3RQdHIgQXR0cmlidXRlTGlzdCkgeworICAvLyBTZWUgaWYgd2UgaGF2ZSBhIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gYWxyZWFkeS4KKyAgR2xvYmFsVmFsdWUgKkYgPSBnZXROYW1lZFZhbHVlKE5hbWUpOworICBpZiAoRiA9PSAwKSB7CisgICAgLy8gTm9wZSwgYWRkIGl0CisgICAgRnVuY3Rpb24gKk5ldyA9IEZ1bmN0aW9uOjpDcmVhdGUoVHksIEdsb2JhbFZhcmlhYmxlOjpFeHRlcm5hbExpbmthZ2UsIE5hbWUpOworICAgIE5ldy0+c2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0KTsKKyAgICBGdW5jdGlvbkxpc3QucHVzaF9iYWNrKE5ldyk7CisgICAgcmV0dXJuIE5ldzsgLy8gUmV0dXJuIHRoZSBuZXcgcHJvdG90eXBlLgorICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBqdXN0IGZvdW5kIHRoZSBleGlzdGluZyBmdW5jdGlvbiBvciBhIHByb3RvdHlwZS4KKyAgcmV0dXJuIEY7ICAKK30KKworQ29uc3RhbnQgKk1vZHVsZTo6Z2V0T3JJbnNlcnRGdW5jdGlvbihTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25UeXBlICpUeSkgeworICBBdHRyTGlzdFB0ciBBdHRyaWJ1dGVMaXN0ID0gQXR0ckxpc3RQdHI6OmdldCgoQXR0cmlidXRlV2l0aEluZGV4ICopMCwgMCk7CisgIHJldHVybiBnZXRPckluc2VydEZ1bmN0aW9uKE5hbWUsIFR5LCBBdHRyaWJ1dGVMaXN0KTsKK30KKworLy8gZ2V0T3JJbnNlcnRGdW5jdGlvbiAtIExvb2sgdXAgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpbiB0aGUgbW9kdWxlIHN5bWJvbAorLy8gdGFibGUuICBJZiBpdCBkb2VzIG5vdCBleGlzdCwgYWRkIGEgcHJvdG90eXBlIGZvciB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdC4KKy8vIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIHRha2VzIGEgbnVsbCB0ZXJtaW5hdGVkIGxpc3Qgb2YgZnVuY3Rpb24KKy8vIGFyZ3VtZW50cywgd2hpY2ggbWFrZXMgaXQgZWFzaWVyIGZvciBjbGllbnRzIHRvIHVzZS4KKy8vCitDb25zdGFudCAqTW9kdWxlOjpnZXRPckluc2VydEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyTGlzdFB0ciBBdHRyaWJ1dGVMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpSZXRUeSwgLi4uKSB7CisgIHZhX2xpc3QgQXJnczsKKyAgdmFfc3RhcnQoQXJncywgUmV0VHkpOworCisgIC8vIEJ1aWxkIHRoZSBsaXN0IG9mIGFyZ3VtZW50IHR5cGVzLi4uCisgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBBcmdUeXM7CisgIHdoaWxlIChjb25zdCBUeXBlICpBcmdUeSA9IHZhX2FyZyhBcmdzLCBjb25zdCBUeXBlKikpCisgICAgQXJnVHlzLnB1c2hfYmFjayhBcmdUeSk7CisKKyAgdmFfZW5kKEFyZ3MpOworCisgIC8vIEJ1aWxkIHRoZSBmdW5jdGlvbiB0eXBlIGFuZCBjaGFpbiB0byB0aGUgb3RoZXIgZ2V0T3JJbnNlcnRGdW5jdGlvbi4uLgorICByZXR1cm4gZ2V0T3JJbnNlcnRGdW5jdGlvbihOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OmdldChSZXRUeSwgQXJnVHlzLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QpOworfQorCitDb25zdGFudCAqTW9kdWxlOjpnZXRPckluc2VydEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpSZXRUeSwgLi4uKSB7CisgIHZhX2xpc3QgQXJnczsKKyAgdmFfc3RhcnQoQXJncywgUmV0VHkpOworCisgIC8vIEJ1aWxkIHRoZSBsaXN0IG9mIGFyZ3VtZW50IHR5cGVzLi4uCisgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBBcmdUeXM7CisgIHdoaWxlIChjb25zdCBUeXBlICpBcmdUeSA9IHZhX2FyZyhBcmdzLCBjb25zdCBUeXBlKikpCisgICAgQXJnVHlzLnB1c2hfYmFjayhBcmdUeSk7CisKKyAgdmFfZW5kKEFyZ3MpOworCisgIC8vIEJ1aWxkIHRoZSBmdW5jdGlvbiB0eXBlIGFuZCBjaGFpbiB0byB0aGUgb3RoZXIgZ2V0T3JJbnNlcnRGdW5jdGlvbi4uLgorICByZXR1cm4gZ2V0T3JJbnNlcnRGdW5jdGlvbihOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlOjpnZXQoUmV0VHksIEFyZ1R5cywgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyTGlzdFB0cjo6Z2V0KChBdHRyaWJ1dGVXaXRoSW5kZXggKikwLCAwKSk7Cit9CisKKy8vIGdldEZ1bmN0aW9uIC0gTG9vayB1cCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGluIHRoZSBtb2R1bGUgc3ltYm9sIHRhYmxlLgorLy8gSWYgaXQgZG9lcyBub3QgZXhpc3QsIHJldHVybiBudWxsLgorLy8KK0Z1bmN0aW9uICpNb2R1bGU6OmdldEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgIHJldHVybiBkeW5fY2FzdF9vcl9udWxsPEZ1bmN0aW9uPihnZXROYW1lZFZhbHVlKE5hbWUpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1ldGhvZHMgZm9yIGVhc3kgYWNjZXNzIHRvIHRoZSBnbG9iYWwgdmFyaWFibGVzIGluIHRoZSBtb2R1bGUuCisvLworCisvLy8gZ2V0R2xvYmFsVmFyaWFibGUgLSBMb29rIHVwIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSBtb2R1bGUKKy8vLyBzeW1ib2wgdGFibGUuICBJZiBpdCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIG51bGwuICBUaGUgdHlwZSBhcmd1bWVudAorLy8vIHNob3VsZCBiZSB0aGUgdW5kZXJseWluZyB0eXBlIG9mIHRoZSBnbG9iYWwsIGkuZS4sIGl0IHNob3VsZCBub3QgaGF2ZQorLy8vIHRoZSB0b3AtbGV2ZWwgUG9pbnRlclR5cGUsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGdsb2JhbC4KKy8vLyBJZiBBbGxvd0xvY2FsIGlzIHNldCB0byB0cnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHR5cGVzIHRoYXQKKy8vLyBoYXZlIGFuIGxvY2FsLiBCeSBkZWZhdWx0LCB0aGVzZSB0eXBlcyBhcmUgbm90IHJldHVybmVkLgorLy8vCitHbG9iYWxWYXJpYWJsZSAqTW9kdWxlOjpnZXRHbG9iYWxWYXJpYWJsZShTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dMb2NhbCkgY29uc3QgeworICBpZiAoR2xvYmFsVmFyaWFibGUgKlJlc3VsdCA9IAorICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxHbG9iYWxWYXJpYWJsZT4oZ2V0TmFtZWRWYWx1ZShOYW1lKSkpCisgICAgaWYgKEFsbG93TG9jYWwgfHwgIVJlc3VsdC0+aGFzTG9jYWxMaW5rYWdlKCkpCisgICAgICByZXR1cm4gUmVzdWx0OworICByZXR1cm4gMDsKK30KKworLy8vIGdldE9ySW5zZXJ0R2xvYmFsIC0gTG9vayB1cCB0aGUgc3BlY2lmaWVkIGdsb2JhbCBpbiB0aGUgbW9kdWxlIHN5bWJvbCB0YWJsZS4KKy8vLyAgIDEuIElmIGl0IGRvZXMgbm90IGV4aXN0LCBhZGQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgZ2xvYmFsIGFuZCByZXR1cm4gaXQuCisvLy8gICAyLiBFbHNlLCB0aGUgZ2xvYmFsIGV4aXN0cyBidXQgaGFzIHRoZSB3cm9uZyB0eXBlOiByZXR1cm4gdGhlIGZ1bmN0aW9uCisvLy8gICAgICB3aXRoIGEgY29uc3RhbnRleHByIGNhc3QgdG8gdGhlIHJpZ2h0IHR5cGUuCisvLy8gICAzLiBGaW5hbGx5LCBpZiB0aGUgZXhpc3RpbmcgZ2xvYmFsIGlzIHRoZSBjb3JyZWN0IGRlbGNsYXJhdGlvbiwgcmV0dXJuIHRoZQorLy8vICAgICAgZXhpc3RpbmcgZ2xvYmFsLgorQ29uc3RhbnQgKk1vZHVsZTo6Z2V0T3JJbnNlcnRHbG9iYWwoU3RyaW5nUmVmIE5hbWUsIGNvbnN0IFR5cGUgKlR5KSB7CisgIC8vIFNlZSBpZiB3ZSBoYXZlIGEgZGVmaW5pdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBnbG9iYWwgYWxyZWFkeS4KKyAgR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Rfb3JfbnVsbDxHbG9iYWxWYXJpYWJsZT4oZ2V0TmFtZWRWYWx1ZShOYW1lKSk7CisgIGlmIChHViA9PSAwKSB7CisgICAgLy8gTm9wZSwgYWRkIGl0CisgICAgR2xvYmFsVmFyaWFibGUgKk5ldyA9CisgICAgICBuZXcgR2xvYmFsVmFyaWFibGUoKnRoaXMsIFR5LCBmYWxzZSwgR2xvYmFsVmFyaWFibGU6OkV4dGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOYW1lKTsKKyAgICAgcmV0dXJuIE5ldzsgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbmV3IGRlY2xhcmF0aW9uLgorICB9CisKKyAgLy8gSWYgdGhlIHZhcmlhYmxlIGV4aXN0cyBidXQgaGFzIHRoZSB3cm9uZyB0eXBlLCByZXR1cm4gYSBiaXRjYXN0IHRvIHRoZQorICAvLyByaWdodCB0eXBlLgorICBpZiAoR1YtPmdldFR5cGUoKSAhPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5KSkKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KEdWLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5KSk7CisgIAorICAvLyBPdGhlcndpc2UsIHdlIGp1c3QgZm91bmQgdGhlIGV4aXN0aW5nIGZ1bmN0aW9uIG9yIGEgcHJvdG90eXBlLgorICByZXR1cm4gR1Y7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNZXRob2RzIGZvciBlYXN5IGFjY2VzcyB0byB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgbW9kdWxlLgorLy8KKworLy8gZ2V0TmFtZWRBbGlhcyAtIExvb2sgdXAgdGhlIHNwZWNpZmllZCBnbG9iYWwgaW4gdGhlIG1vZHVsZSBzeW1ib2wgdGFibGUuCisvLyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIG51bGwuCisvLworR2xvYmFsQWxpYXMgKk1vZHVsZTo6Z2V0TmFtZWRBbGlhcyhTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICByZXR1cm4gZHluX2Nhc3Rfb3JfbnVsbDxHbG9iYWxBbGlhcz4oZ2V0TmFtZWRWYWx1ZShOYW1lKSk7Cit9CisKKy8vLyBnZXROYW1lZE1ldGFkYXRhIC0gUmV0dXJuIHRoZSBmaXJzdCBOYW1lZE1ETm9kZSBpbiB0aGUgbW9kdWxlIHdpdGggdGhlCisvLy8gc3BlY2lmaWVkIG5hbWUuIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiBhIE5hbWVkTUROb2RlIHdpdGggdGhlIAorLy8vIHNwZWNpZmllZCBuYW1lIGlzIG5vdCBmb3VuZC4KK05hbWVkTUROb2RlICpNb2R1bGU6OmdldE5hbWVkTWV0YWRhdGEoY29uc3QgVHdpbmUgJk5hbWUpIGNvbnN0IHsKKyAgU21hbGxTdHJpbmc8MjU2PiBOYW1lRGF0YTsKKyAgU3RyaW5nUmVmIE5hbWVSZWYgPSBOYW1lLnRvU3RyaW5nUmVmKE5hbWVEYXRhKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFN0cmluZ01hcDxOYW1lZE1ETm9kZSo+ICo+KE5hbWVkTURTeW1UYWIpLT5sb29rdXAoTmFtZVJlZik7Cit9CisKKy8vLyBnZXRPckluc2VydE5hbWVkTWV0YWRhdGEgLSBSZXR1cm4gdGhlIGZpcnN0IG5hbWVkIE1ETm9kZSBpbiB0aGUgbW9kdWxlIAorLy8vIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IE5hbWVkTUROb2RlIGlmIGEgCisvLy8gTmFtZWRNRE5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGZvdW5kLgorTmFtZWRNRE5vZGUgKk1vZHVsZTo6Z2V0T3JJbnNlcnROYW1lZE1ldGFkYXRhKFN0cmluZ1JlZiBOYW1lKSB7CisgIE5hbWVkTUROb2RlIComTk1EID0KKyAgICAoKnN0YXRpY19jYXN0PFN0cmluZ01hcDxOYW1lZE1ETm9kZSAqPiAqPihOYW1lZE1EU3ltVGFiKSlbTmFtZV07CisgIGlmICghTk1EKSB7CisgICAgTk1EID0gbmV3IE5hbWVkTUROb2RlKE5hbWUpOworICAgIE5NRC0+c2V0UGFyZW50KHRoaXMpOworICAgIE5hbWVkTURMaXN0LnB1c2hfYmFjayhOTUQpOworICB9CisgIHJldHVybiBOTUQ7Cit9CisKK3ZvaWQgTW9kdWxlOjplcmFzZU5hbWVkTWV0YWRhdGEoTmFtZWRNRE5vZGUgKk5NRCkgeworICBzdGF0aWNfY2FzdDxTdHJpbmdNYXA8TmFtZWRNRE5vZGUgKj4gKj4oTmFtZWRNRFN5bVRhYiktPmVyYXNlKE5NRC0+Z2V0TmFtZSgpKTsKKyAgTmFtZWRNRExpc3QuZXJhc2UoTk1EKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1ldGhvZHMgZm9yIGVhc3kgYWNjZXNzIHRvIHRoZSB0eXBlcyBpbiB0aGUgbW9kdWxlLgorLy8KKworCisvLyBhZGRUeXBlTmFtZSAtIEluc2VydCBhbiBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlIG1hcHBpbmcgU3RyIHRvIFR5cGUuICBJZgorLy8gdGhlcmUgaXMgYWxyZWFkeSBhbiBlbnRyeSBmb3IgdGhpcyBuYW1lLCB0cnVlIGlzIHJldHVybmVkIGFuZCB0aGUgc3ltYm9sCisvLyB0YWJsZSBpcyBub3QgbW9kaWZpZWQuCisvLworYm9vbCBNb2R1bGU6OmFkZFR5cGVOYW1lKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBUeXBlICpUeSkgeworICBUeXBlU3ltYm9sVGFibGUgJlNUID0gZ2V0VHlwZVN5bWJvbFRhYmxlKCk7CisKKyAgaWYgKFNULmxvb2t1cChOYW1lKSkgcmV0dXJuIHRydWU7ICAvLyBBbHJlYWR5IGluIHN5bXRhYi4uLgorCisgIC8vIE5vdCBpbiBzeW1ib2wgdGFibGU/ICBTZXQgdGhlIG5hbWUgd2l0aCB0aGUgU3ltdGFiIGFzIGFuIGFyZ3VtZW50IHNvIHRoZQorICAvLyB0eXBlIGtub3dzIHdoYXQgdG8gdXBkYXRlLi4uCisgIFNULmluc2VydChOYW1lLCBUeSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gZ2V0VHlwZUJ5TmFtZSAtIFJldHVybiB0aGUgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGlzIG1vZHVsZSwgb3IKKy8vLyBudWxsIGlmIHRoZXJlIGlzIG5vbmUgYnkgdGhhdCBuYW1lLgorY29uc3QgVHlwZSAqTW9kdWxlOjpnZXRUeXBlQnlOYW1lKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgIGNvbnN0IFR5cGVTeW1ib2xUYWJsZSAmU1QgPSBnZXRUeXBlU3ltYm9sVGFibGUoKTsKKyAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxUeXBlPihTVC5sb29rdXAoTmFtZSkpOworfQorCisvLyBnZXRUeXBlTmFtZSAtIElmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUKKy8vIHNwZWNpZmllZCB0eXBlLCByZXR1cm4gaXQuCisvLworc3RkOjpzdHJpbmcgTW9kdWxlOjpnZXRUeXBlTmFtZShjb25zdCBUeXBlICpUeSkgY29uc3QgeworICBjb25zdCBUeXBlU3ltYm9sVGFibGUgJlNUID0gZ2V0VHlwZVN5bWJvbFRhYmxlKCk7CisKKyAgVHlwZVN5bWJvbFRhYmxlOjpjb25zdF9pdGVyYXRvciBUSSA9IFNULmJlZ2luKCk7CisgIFR5cGVTeW1ib2xUYWJsZTo6Y29uc3RfaXRlcmF0b3IgVEUgPSBTVC5lbmQoKTsKKyAgaWYgKCBUSSA9PSBURSApIHJldHVybiAiIjsgLy8gTm8gbmFtZXMgZm9yIHR5cGVzCisKKyAgd2hpbGUgKFRJICE9IFRFICYmIFRJLT5zZWNvbmQgIT0gVHkpCisgICAgKytUSTsKKworICBpZiAoVEkgIT0gVEUpICAvLyBNdXN0IGhhdmUgZm91bmQgYW4gZW50cnkhCisgICAgcmV0dXJuIFRJLT5maXJzdDsKKyAgcmV0dXJuICIiOyAgICAgLy8gTXVzdCBub3QgaGF2ZSBmb3VuZCBhbnl0aGluZy4uLgorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWV0aG9kcyB0byBjb250cm9sIHRoZSBtYXRlcmlhbGl6YXRpb24gb2YgR2xvYmFsVmFsdWVzIGluIHRoZSBNb2R1bGUuCisvLwordm9pZCBNb2R1bGU6OnNldE1hdGVyaWFsaXplcihHVk1hdGVyaWFsaXplciAqR1ZNKSB7CisgIGFzc2VydCghTWF0ZXJpYWxpemVyICYmCisgICAgICAgICAiTW9kdWxlIGFscmVhZHkgaGFzIGEgR1ZNYXRlcmlhbGl6ZXIuICBDYWxsIE1hdGVyaWFsaXplQWxsUGVybWFuZW50bHkiCisgICAgICAgICAiIHRvIGNsZWFyIGl0IG91dCBiZWZvcmUgc2V0dGluZyBhbm90aGVyIG9uZS4iKTsKKyAgTWF0ZXJpYWxpemVyLnJlc2V0KEdWTSk7Cit9CisKK2Jvb2wgTW9kdWxlOjppc01hdGVyaWFsaXphYmxlKGNvbnN0IEdsb2JhbFZhbHVlICpHVikgY29uc3QgeworICBpZiAoTWF0ZXJpYWxpemVyKQorICAgIHJldHVybiBNYXRlcmlhbGl6ZXItPmlzTWF0ZXJpYWxpemFibGUoR1YpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTW9kdWxlOjppc0RlbWF0ZXJpYWxpemFibGUoY29uc3QgR2xvYmFsVmFsdWUgKkdWKSBjb25zdCB7CisgIGlmIChNYXRlcmlhbGl6ZXIpCisgICAgcmV0dXJuIE1hdGVyaWFsaXplci0+aXNEZW1hdGVyaWFsaXphYmxlKEdWKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1vZHVsZTo6TWF0ZXJpYWxpemUoR2xvYmFsVmFsdWUgKkdWLCBzdGQ6OnN0cmluZyAqRXJySW5mbykgeworICBpZiAoTWF0ZXJpYWxpemVyKQorICAgIHJldHVybiBNYXRlcmlhbGl6ZXItPk1hdGVyaWFsaXplKEdWLCBFcnJJbmZvKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE1vZHVsZTo6RGVtYXRlcmlhbGl6ZShHbG9iYWxWYWx1ZSAqR1YpIHsKKyAgaWYgKE1hdGVyaWFsaXplcikKKyAgICByZXR1cm4gTWF0ZXJpYWxpemVyLT5EZW1hdGVyaWFsaXplKEdWKTsKK30KKworYm9vbCBNb2R1bGU6Ok1hdGVyaWFsaXplQWxsKHN0ZDo6c3RyaW5nICpFcnJJbmZvKSB7CisgIGlmICghTWF0ZXJpYWxpemVyKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIE1hdGVyaWFsaXplci0+TWF0ZXJpYWxpemVNb2R1bGUodGhpcywgRXJySW5mbyk7Cit9CisKK2Jvb2wgTW9kdWxlOjpNYXRlcmlhbGl6ZUFsbFBlcm1hbmVudGx5KHN0ZDo6c3RyaW5nICpFcnJJbmZvKSB7CisgIGlmIChNYXRlcmlhbGl6ZUFsbChFcnJJbmZvKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgTWF0ZXJpYWxpemVyLnJlc2V0KCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE90aGVyIG1vZHVsZSByZWxhdGVkIHN0dWZmLgorLy8KKworCisvLyBkcm9wQWxsUmVmZXJlbmNlcygpIC0gVGhpcyBmdW5jdGlvbiBjYXVzZXMgYWxsIHRoZSBzdWJlbGVtZW50c3MgdG8gImxldCBnbyIKKy8vIG9mIGFsbCByZWZlcmVuY2VzIHRoYXQgdGhleSBhcmUgbWFpbnRhaW5pbmcuICBUaGlzIGFsbG93cyBvbmUgdG8gJ2RlbGV0ZScgYQorLy8gd2hvbGUgbW9kdWxlIGF0IGEgdGltZSwgZXZlbiB0aG91Z2ggdGhlcmUgbWF5IGJlIGNpcmN1bGFyIHJlZmVyZW5jZXMuLi4gZmlyc3QKKy8vIGFsbCByZWZlcmVuY2VzIGFyZSBkcm9wcGVkLCBhbmQgYWxsIHVzZSBjb3VudHMgZ28gdG8gemVyby4gIFRoZW4gZXZlcnl0aGluZworLy8gaXMgZGVsZXRlZCBmb3IgcmVhbC4gIE5vdGUgdGhhdCBubyBvcGVyYXRpb25zIGFyZSB2YWxpZCBvbiBhbiBvYmplY3QgdGhhdAorLy8gaGFzICJkcm9wcGVkIGFsbCByZWZlcmVuY2VzIiwgZXhjZXB0IG9wZXJhdG9yIGRlbGV0ZS4KKy8vCit2b2lkIE1vZHVsZTo6ZHJvcEFsbFJlZmVyZW5jZXMoKSB7CisgIGZvcihNb2R1bGU6Oml0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIEktPmRyb3BBbGxSZWZlcmVuY2VzKCk7CisKKyAgZm9yKE1vZHVsZTo6Z2xvYmFsX2l0ZXJhdG9yIEkgPSBnbG9iYWxfYmVnaW4oKSwgRSA9IGdsb2JhbF9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgSS0+ZHJvcEFsbFJlZmVyZW5jZXMoKTsKKworICBmb3IoTW9kdWxlOjphbGlhc19pdGVyYXRvciBJID0gYWxpYXNfYmVnaW4oKSwgRSA9IGFsaWFzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBJLT5kcm9wQWxsUmVmZXJlbmNlcygpOworfQorCit2b2lkIE1vZHVsZTo6YWRkTGlicmFyeShTdHJpbmdSZWYgTGliKSB7CisgIGZvciAoTW9kdWxlOjpsaWJfaXRlcmF0b3IgSSA9IGxpYl9iZWdpbigpLCBFID0gbGliX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBpZiAoKkkgPT0gTGliKQorICAgICAgcmV0dXJuOworICBMaWJyYXJ5TGlzdC5wdXNoX2JhY2soTGliKTsKK30KKwordm9pZCBNb2R1bGU6OnJlbW92ZUxpYnJhcnkoU3RyaW5nUmVmIExpYikgeworICBMaWJyYXJ5TGlzdFR5cGU6Oml0ZXJhdG9yIEkgPSBMaWJyYXJ5TGlzdC5iZWdpbigpOworICBMaWJyYXJ5TGlzdFR5cGU6Oml0ZXJhdG9yIEUgPSBMaWJyYXJ5TGlzdC5lbmQoKTsKKyAgZm9yICg7SSAhPSBFOyArK0kpCisgICAgaWYgKCpJID09IExpYikgeworICAgICAgTGlicmFyeUxpc3QuZXJhc2UoSSk7CisgICAgICByZXR1cm47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9QYXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvUGFzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhODdkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvUGFzcy5jcHAKQEAgLTAsMCArMSwzMzQgQEAKKy8vPT09LSBQYXNzLmNwcCAtIExMVk0gUGFzcyBJbmZyYXN0cnVjdHVyZSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExMVk0gUGFzcyBpbmZyYXN0cnVjdHVyZS4gIEl0IGlzIHByaW1hcmlseQorLy8gcmVzcG9uc2libGUgd2l0aCBlbnN1cmluZyB0aGF0IHBhc3NlcyBhcmUgZXhlY3V0ZWQgYW5kIGJhdGNoZWQgdG9nZXRoZXIKKy8vIG9wdGltYWxseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzc1JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1ByaW50TW9kdWxlUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXNzTmFtZVBhcnNlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0F0b21pYy5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL011dGV4LmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vVGhyZWFkaW5nLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhc3MgSW1wbGVtZW50YXRpb24KKy8vCisKK1Bhc3M6OlBhc3MoUGFzc0tpbmQgSywgY2hhciAmcGlkKSA6IFJlc29sdmVyKDApLCBQYXNzSUQoJnBpZCksIEtpbmQoSykgeyB9CisKKy8vIEZvcmNlIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kLgorUGFzczo6flBhc3MoKSB7IAorICBkZWxldGUgUmVzb2x2ZXI7IAorfQorCisvLyBGb3JjZSBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZC4KK01vZHVsZVBhc3M6On5Nb2R1bGVQYXNzKCkgeyB9CisKK1Bhc3MgKk1vZHVsZVBhc3M6OmNyZWF0ZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3QgeworICByZXR1cm4gY3JlYXRlUHJpbnRNb2R1bGVQYXNzKCZPLCBmYWxzZSwgQmFubmVyKTsKK30KKworUGFzc01hbmFnZXJUeXBlIE1vZHVsZVBhc3M6OmdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIFBNVF9Nb2R1bGVQYXNzTWFuYWdlcjsKK30KKworYm9vbCBQYXNzOjptdXN0UHJlc2VydmVBbmFseXNpc0lEKGNoYXIgJkFJRCkgY29uc3QgeworICByZXR1cm4gUmVzb2x2ZXItPmdldEFuYWx5c2lzSWZBdmFpbGFibGUoJkFJRCwgdHJ1ZSkgIT0gMDsKK30KKworLy8gZHVtcFBhc3NTdHJ1Y3R1cmUgLSBJbXBsZW1lbnQgdGhlIC1kZWJ1Zy1wYXNzZXM9U3RydWN0dXJlIG9wdGlvbgordm9pZCBQYXNzOjpkdW1wUGFzc1N0cnVjdHVyZSh1bnNpZ25lZCBPZmZzZXQpIHsKKyAgZGJncygpLmluZGVudChPZmZzZXQqMikgPDwgZ2V0UGFzc05hbWUoKSA8PCAiXG4iOworfQorCisvLy8gZ2V0UGFzc05hbWUgLSBSZXR1cm4gYSBuaWNlIGNsZWFuIG5hbWUgZm9yIGEgcGFzcy4gIFRoaXMgdXN1YWxseQorLy8vIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSBuYW1lIHRoYXQgaXMgcmVnaXN0ZXJlZCBieSBvbmUgb2YgdGhlCisvLy8gUmVnaXN0cmF0aW9uIHRlbXBsYXRlcywgYnV0IGNhbiBiZSBvdmVybG9hZGVkIGRpcmVjdGx5LgorLy8vCitjb25zdCBjaGFyICpQYXNzOjpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgQW5hbHlzaXNJRCBBSUQgPSAgZ2V0UGFzc0lEKCk7CisgIGNvbnN0IFBhc3NJbmZvICpQSSA9IFBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCktPmdldFBhc3NJbmZvKEFJRCk7CisgIGlmIChQSSkKKyAgICByZXR1cm4gUEktPmdldFBhc3NOYW1lKCk7CisgIHJldHVybiAiVW5uYW1lZCBwYXNzOiBpbXBsZW1lbnQgUGFzczo6Z2V0UGFzc05hbWUoKSI7Cit9CisKK3ZvaWQgUGFzczo6cHJlcGFyZVBhc3NNYW5hZ2VyKFBNU3RhY2sgJikgeworICAvLyBCeSBkZWZhdWx0LCBkb24ndCBkbyBhbnl0aGluZy4KK30KKworUGFzc01hbmFnZXJUeXBlIFBhc3M6OmdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IHsKKyAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKyAgcmV0dXJuIFBNVF9Vbmtub3duOyAKK30KKwordm9pZCBQYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJikgY29uc3QgeworICAvLyBCeSBkZWZhdWx0LCBubyBhbmFseXNpcyByZXN1bHRzIGFyZSB1c2VkLCBhbGwgYXJlIGludmFsaWRhdGVkLgorfQorCit2b2lkIFBhc3M6OnJlbGVhc2VNZW1vcnkoKSB7CisgIC8vIEJ5IGRlZmF1bHQsIGRvbid0IGRvIGFueXRoaW5nLgorfQorCit2b2lkIFBhc3M6OnZlcmlmeUFuYWx5c2lzKCkgY29uc3QgeworICAvLyBCeSBkZWZhdWx0LCBkb24ndCBkbyBhbnl0aGluZy4KK30KKwordm9pZCAqUGFzczo6Z2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIoQW5hbHlzaXNJRCBBSUQpIHsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0ltbXV0YWJsZVBhc3MgKlBhc3M6OmdldEFzSW1tdXRhYmxlUGFzcygpIHsKKyAgcmV0dXJuIDA7Cit9CisKK1BNRGF0YU1hbmFnZXIgKlBhc3M6OmdldEFzUE1EYXRhTWFuYWdlcigpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgUGFzczo6c2V0UmVzb2x2ZXIoQW5hbHlzaXNSZXNvbHZlciAqQVIpIHsKKyAgYXNzZXJ0KCFSZXNvbHZlciAmJiAiUmVzb2x2ZXIgaXMgYWxyZWFkeSBzZXQiKTsKKyAgUmVzb2x2ZXIgPSBBUjsKK30KKworLy8gcHJpbnQgLSBQcmludCBvdXQgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBwYXNzLiAgVGhpcyBpcyBjYWxsZWQgYnkgQW5hbHl6ZQorLy8gdG8gcHJpbnQgb3V0IHRoZSBjb250ZW50cyBvZiBhbiBhbmFseXNpcy4gIE90aGVyd2lzZSBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvCisvLyBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCisvLwordm9pZCBQYXNzOjpwcmludChyYXdfb3N0cmVhbSAmTyxjb25zdCBNb2R1bGUqKSBjb25zdCB7CisgIE8gPDwgIlBhc3M6OnByaW50IG5vdCBpbXBsZW1lbnRlZCBmb3IgcGFzczogJyIgPDwgZ2V0UGFzc05hbWUoKSA8PCAiJyFcbiI7Cit9CisKKy8vIGR1bXAgLSBjYWxsIHByaW50KGNlcnIpOwordm9pZCBQYXNzOjpkdW1wKCkgY29uc3QgeworICBwcmludChkYmdzKCksIDApOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW1tdXRhYmxlUGFzcyBJbXBsZW1lbnRhdGlvbgorLy8KKy8vIEZvcmNlIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kLgorSW1tdXRhYmxlUGFzczo6fkltbXV0YWJsZVBhc3MoKSB7IH0KKwordm9pZCBJbW11dGFibGVQYXNzOjppbml0aWFsaXplUGFzcygpIHsKKyAgLy8gQnkgZGVmYXVsdCwgZG9uJ3QgZG8gYW55dGhpbmcuCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGdW5jdGlvblBhc3MgSW1wbGVtZW50YXRpb24KKy8vCisKK1Bhc3MgKkZ1bmN0aW9uUGFzczo6Y3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0IHsKKyAgcmV0dXJuIGNyZWF0ZVByaW50RnVuY3Rpb25QYXNzKEJhbm5lciwgJk8pOworfQorCisvLyBydW4gLSBPbiBhIG1vZHVsZSwgd2UgcnVuIHRoaXMgcGFzcyBieSBpbml0aWFsaXppbmcsIHJ1bk9uRnVuY3Rpb24naW5nIG9uY2UKKy8vIGZvciBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbW9kdWxlLCB0aGVuIGJ5IGZpbmFsaXppbmcuCisvLworYm9vbCBGdW5jdGlvblBhc3M6OnJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICBib29sIENoYW5nZWQgPSBkb0luaXRpYWxpemF0aW9uKE0pOworCisgIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFJLT5pc0RlY2xhcmF0aW9uKCkpICAgICAgLy8gUGFzc2VzIGFyZSBub3QgcnVuIG9uIGV4dGVybmFsIGZ1bmN0aW9ucyEKKyAgICBDaGFuZ2VkIHw9IHJ1bk9uRnVuY3Rpb24oKkkpOworCisgIHJldHVybiBDaGFuZ2VkIHwgZG9GaW5hbGl6YXRpb24oTSk7Cit9CisKKy8vIHJ1biAtIE9uIGEgZnVuY3Rpb24sIHdlIHNpbXBseSBpbml0aWFsaXplLCBydW4gdGhlIGZ1bmN0aW9uLCB0aGVuIGZpbmFsaXplLgorLy8KK2Jvb2wgRnVuY3Rpb25QYXNzOjpydW4oRnVuY3Rpb24gJkYpIHsKKyAgLy8gUGFzc2VzIGFyZSBub3QgcnVuIG9uIGV4dGVybmFsIGZ1bmN0aW9ucyEKKyAgaWYgKEYuaXNEZWNsYXJhdGlvbigpKSByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBDaGFuZ2VkID0gZG9Jbml0aWFsaXphdGlvbigqRi5nZXRQYXJlbnQoKSk7CisgIENoYW5nZWQgfD0gcnVuT25GdW5jdGlvbihGKTsKKyAgcmV0dXJuIENoYW5nZWQgfCBkb0ZpbmFsaXphdGlvbigqRi5nZXRQYXJlbnQoKSk7Cit9CisKK2Jvb2wgRnVuY3Rpb25QYXNzOjpkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmKSB7CisgIC8vIEJ5IGRlZmF1bHQsIGRvbid0IGRvIGFueXRoaW5nLgorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRnVuY3Rpb25QYXNzOjpkb0ZpbmFsaXphdGlvbihNb2R1bGUgJikgeworICAvLyBCeSBkZWZhdWx0LCBkb24ndCBkbyBhbnl0aGluZy4KKyAgcmV0dXJuIGZhbHNlOworfQorCitQYXNzTWFuYWdlclR5cGUgRnVuY3Rpb25QYXNzOjpnZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSBjb25zdCB7CisgIHJldHVybiBQTVRfRnVuY3Rpb25QYXNzTWFuYWdlcjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJhc2ljQmxvY2tQYXNzIEltcGxlbWVudGF0aW9uCisvLworCitQYXNzICpCYXNpY0Jsb2NrUGFzczo6Y3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3QgeworICAKKyAgbGx2bV91bnJlYWNoYWJsZSgiQmFzaWNCbG9ja1Bhc3MgcHJpbnRpbmcgdW5zdXBwb3J0ZWQuIik7CisgIHJldHVybiAwOworfQorCisvLyBUbyBydW4gdGhpcyBwYXNzIG9uIGEgZnVuY3Rpb24sIHdlIHNpbXBseSBjYWxsIHJ1bk9uQmFzaWNCbG9jayBvbmNlIGZvciBlYWNoCisvLyBmdW5jdGlvbi4KKy8vCitib29sIEJhc2ljQmxvY2tQYXNzOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGRvSW5pdGlhbGl6YXRpb24oRik7CisgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEkgPSBGLmJlZ2luKCksIEUgPSBGLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBDaGFuZ2VkIHw9IHJ1bk9uQmFzaWNCbG9jaygqSSk7CisgIHJldHVybiBDaGFuZ2VkIHwgZG9GaW5hbGl6YXRpb24oRik7Cit9CisKK2Jvb2wgQmFzaWNCbG9ja1Bhc3M6OmRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICYpIHsKKyAgLy8gQnkgZGVmYXVsdCwgZG9uJ3QgZG8gYW55dGhpbmcuCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCYXNpY0Jsb2NrUGFzczo6ZG9Jbml0aWFsaXphdGlvbihGdW5jdGlvbiAmKSB7CisgIC8vIEJ5IGRlZmF1bHQsIGRvbid0IGRvIGFueXRoaW5nLgorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQmFzaWNCbG9ja1Bhc3M6OmRvRmluYWxpemF0aW9uKEZ1bmN0aW9uICYpIHsKKyAgLy8gQnkgZGVmYXVsdCwgZG9uJ3QgZG8gYW55dGhpbmcuCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCYXNpY0Jsb2NrUGFzczo6ZG9GaW5hbGl6YXRpb24oTW9kdWxlICYpIHsKKyAgLy8gQnkgZGVmYXVsdCwgZG9uJ3QgZG8gYW55dGhpbmcuCisgIHJldHVybiBmYWxzZTsKK30KKworUGFzc01hbmFnZXJUeXBlIEJhc2ljQmxvY2tQYXNzOjpnZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSBjb25zdCB7CisgIHJldHVybiBQTVRfQmFzaWNCbG9ja1Bhc3NNYW5hZ2VyOyAKK30KKworY29uc3QgUGFzc0luZm8gKlBhc3M6Omxvb2t1cFBhc3NJbmZvKGNvbnN0IHZvaWQgKlRJKSB7CisgIHJldHVybiBQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpLT5nZXRQYXNzSW5mbyhUSSk7Cit9CisKK2NvbnN0IFBhc3NJbmZvICpQYXNzOjpsb29rdXBQYXNzSW5mbyhTdHJpbmdSZWYgQXJnKSB7CisgIHJldHVybiBQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpLT5nZXRQYXNzSW5mbyhBcmcpOworfQorCitQYXNzICpQYXNzSW5mbzo6Y3JlYXRlUGFzcygpIGNvbnN0IHsKKyAgYXNzZXJ0KCghaXNBbmFseXNpc0dyb3VwKCkgfHwgTm9ybWFsQ3RvcikgJiYKKyAgICAgICAgICJObyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvdW5kIGZvciBhbmFseXNpcyBncm91cCEiKTsKKyAgYXNzZXJ0KE5vcm1hbEN0b3IgJiYKKyAgICAgICAgICJDYW5ub3QgY2FsbCBjcmVhdGVQYXNzIG9uIFBhc3NJbmZvIHdpdGhvdXQgZGVmYXVsdCBjdG9yISIpOworICByZXR1cm4gTm9ybWFsQ3RvcigpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICBBbmFseXNpcyBHcm91cCBJbXBsZW1lbnRhdGlvbiBDb2RlCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBSZWdpc3RlckFHQmFzZSBpbXBsZW1lbnRhdGlvbgorLy8KK1JlZ2lzdGVyQUdCYXNlOjpSZWdpc3RlckFHQmFzZShjb25zdCBjaGFyICpOYW1lLCBjb25zdCB2b2lkICpJbnRlcmZhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpQYXNzSUQsIGJvb2wgaXNEZWZhdWx0KQorICAgIDogUGFzc0luZm8oTmFtZSwgSW50ZXJmYWNlSUQpIHsKKyAgUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKS0+cmVnaXN0ZXJBbmFseXNpc0dyb3VwKEludGVyZmFjZUlELCBQYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhpcywgaXNEZWZhdWx0KTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisvLworCisvLyBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgY3RvciAtIEFkZCB0aGUgY3VycmVudCBvYmplY3QgdG8gdGhlIGxpc3Qgb2YKKy8vIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lcnMuLi4KK1Bhc3NSZWdpc3RyYXRpb25MaXN0ZW5lcjo6UGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyKCkgeworICBQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpLT5hZGRSZWdpc3RyYXRpb25MaXN0ZW5lcih0aGlzKTsKK30KKworLy8gZHRvciAtIFJlbW92ZSBvYmplY3QgZnJvbSBsaXN0IG9mIGxpc3RlbmVycy4uLgorUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyOjp+UGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyKCkgeworICBQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpLT5yZW1vdmVSZWdpc3RyYXRpb25MaXN0ZW5lcih0aGlzKTsKK30KKworLy8gZW51bWVyYXRlUGFzc2VzIC0gSXRlcmF0ZSBvdmVyIHRoZSByZWdpc3RlcmVkIHBhc3NlcywgY2FsbGluZyB0aGUKKy8vIHBhc3NFbnVtZXJhdGUgY2FsbGJhY2sgb24gZWFjaCBQYXNzSW5mbyBvYmplY3QuCisvLwordm9pZCBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXI6OmVudW1lcmF0ZVBhc3NlcygpIHsKKyAgUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKS0+ZW51bWVyYXRlV2l0aCh0aGlzKTsKK30KKworUGFzc05hbWVQYXJzZXI6On5QYXNzTmFtZVBhcnNlcigpIHt9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgIEFuYWx5c2lzVXNhZ2UgQ2xhc3MgSW1wbGVtZW50YXRpb24KKy8vCisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBHZXRDRkdPbmx5UGFzc2VzIDogcHVibGljIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciB7CisgICAgdHlwZWRlZiBBbmFseXNpc1VzYWdlOjpWZWN0b3JUeXBlIFZlY3RvclR5cGU7CisgICAgVmVjdG9yVHlwZSAmQ0ZHT25seUxpc3Q7CisgICAgR2V0Q0ZHT25seVBhc3NlcyhWZWN0b3JUeXBlICZMKSA6IENGR09ubHlMaXN0KEwpIHt9CisgICAgCisgICAgdm9pZCBwYXNzRW51bWVyYXRlKGNvbnN0IFBhc3NJbmZvICpQKSB7CisgICAgICBpZiAoUC0+aXNDRkdPbmx5UGFzcygpKQorICAgICAgICBDRkdPbmx5TGlzdC5wdXNoX2JhY2soUC0+Z2V0VHlwZUluZm8oKSk7CisgICAgfQorICB9OworfQorCisvLyBzZXRQcmVzZXJ2ZXNDRkcgLSBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgdG8gYnkgdGhlIHBhc3MsIGlmZiB0aGV5IGRvCisvLyBub3Q6CisvLworLy8gIDEuIEFkZCBvciByZW1vdmUgYmFzaWMgYmxvY2tzIGZyb20gdGhlIGZ1bmN0aW9uCisvLyAgMi4gTW9kaWZ5IHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb25zIGluIGFueSB3YXkuCisvLworLy8gVGhpcyBmdW5jdGlvbiBhbm5vdGF0ZXMgdGhlIEFuYWx5c2lzVXNhZ2UgaW5mbyBvYmplY3QgdG8gc2F5IHRoYXQgYW5hbHlzZXMKKy8vIHRoYXQgb25seSBkZXBlbmQgb24gdGhlIENGRyBhcmUgcHJlc2VydmVkIGJ5IHRoaXMgcGFzcy4KKy8vCit2b2lkIEFuYWx5c2lzVXNhZ2U6OnNldFByZXNlcnZlc0NGRygpIHsKKyAgLy8gU2luY2UgdGhpcyB0cmFuc2Zvcm1hdGlvbiBkb2Vzbid0IG1vZGlmeSB0aGUgQ0ZHLCBpdCBwcmVzZXJ2ZXMgYWxsIGFuYWx5c2VzCisgIC8vIHRoYXQgb25seSBkZXBlbmQgb24gdGhlIENGRyAobGlrZSBkb21pbmF0b3JzLCBsb29wIGluZm8sIGV0Yy4uLikKKyAgR2V0Q0ZHT25seVBhc3NlcyhQcmVzZXJ2ZWQpLmVudW1lcmF0ZVBhc3NlcygpOworfQorCitBbmFseXNpc1VzYWdlICZBbmFseXNpc1VzYWdlOjphZGRQcmVzZXJ2ZWQoU3RyaW5nUmVmIEFyZykgeworICBjb25zdCBQYXNzSW5mbyAqUEkgPSBQYXNzOjpsb29rdXBQYXNzSW5mbyhBcmcpOworICAvLyBJZiB0aGUgcGFzcyBleGlzdHMsIHByZXNlcnZlIGl0LiBPdGhlcndpc2Ugc2lsZW50bHkgZG8gbm90aGluZy4KKyAgaWYgKFBJKSBQcmVzZXJ2ZWQucHVzaF9iYWNrKFBJLT5nZXRUeXBlSW5mbygpKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitBbmFseXNpc1VzYWdlICZBbmFseXNpc1VzYWdlOjphZGRSZXF1aXJlZElEKGNvbnN0IHZvaWQgKklEKSB7CisgIFJlcXVpcmVkLnB1c2hfYmFjayhJRCk7CisgIHJldHVybiAqdGhpczsKK30KKworQW5hbHlzaXNVc2FnZSAmQW5hbHlzaXNVc2FnZTo6YWRkUmVxdWlyZWRJRChjaGFyICZJRCkgeworICBSZXF1aXJlZC5wdXNoX2JhY2soJklEKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitBbmFseXNpc1VzYWdlICZBbmFseXNpc1VzYWdlOjphZGRSZXF1aXJlZFRyYW5zaXRpdmVJRChjaGFyICZJRCkgeworICBSZXF1aXJlZC5wdXNoX2JhY2soJklEKTsKKyAgUmVxdWlyZWRUcmFuc2l0aXZlLnB1c2hfYmFjaygmSUQpOworICByZXR1cm4gKnRoaXM7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL1Bhc3NNYW5hZ2VyLmNwcCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvUGFzc01hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZGVlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL1Bhc3NNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDE4MTYgQEAKKy8vPT09LSBQYXNzTWFuYWdlci5jcHAgLSBMTFZNIFBhc3MgSW5mcmFzdHJ1Y3R1cmUgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExMVk0gUGFzcyBNYW5hZ2VyIGluZnJhc3RydWN0dXJlLiAKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2Vycy5oIgorI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1ByaW50TW9kdWxlUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RpbWVyLmgiCisjaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Bhc3NOYW1lUGFyc2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vTXV0ZXguaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9UaHJlYWRpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPG1hcD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBTZWUgUGFzc01hbmFnZXJzLmggZm9yIFBhc3MgTWFuYWdlciBpbmZyYXN0cnVjdHVyZSBvdmVydmlldy4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFzcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBPZnRlbiBpdCBpcyB1c2VmdWwgdG8gZmluZCBvdXQgd2hhdCBwYXNzIGlzCisvLyBydW5uaW5nIHdoZW4gYSBjcmFzaCBvY2N1cnMgaW4gYSB1dGlsaXR5LiAgV2hlbiB0aGlzIGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aAorLy8gZGVidWdnaW5nIG9uLCBhIGNvbW1hbmQgbGluZSBvcHRpb24gKC0tZGVidWctcGFzcykgaXMgZW5hYmxlZCB0aGF0IGNhdXNlcyB0aGUKKy8vIHBhc3MgbmFtZSB0byBiZSBwcmludGVkIGJlZm9yZSBpdCBleGVjdXRlcy4KKy8vCisKKy8vIERpZmZlcmVudCBkZWJ1ZyBsZXZlbHMgdGhhdCBjYW4gYmUgZW5hYmxlZC4uLgorZW51bSBQYXNzRGVidWdMZXZlbCB7CisgIE5vbmUsIEFyZ3VtZW50cywgU3RydWN0dXJlLCBFeGVjdXRpb25zLCBEZXRhaWxzCit9OworCitzdGF0aWMgY2w6Om9wdDxlbnVtIFBhc3NEZWJ1Z0xldmVsPgorUGFzc0RlYnVnZ2luZygiZGVidWctcGFzcyIsIGNsOjpIaWRkZW4sCisgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiUHJpbnQgUGFzc01hbmFnZXIgZGVidWdnaW5nIGluZm9ybWF0aW9uIiksCisgICAgICAgICAgICAgICAgICBjbDo6dmFsdWVzKAorICBjbEVudW1WYWwoTm9uZSAgICAgICwgImRpc2FibGUgZGVidWcgb3V0cHV0IiksCisgIGNsRW51bVZhbChBcmd1bWVudHMgLCAicHJpbnQgcGFzcyBhcmd1bWVudHMgdG8gcGFzcyB0byAnb3B0JyIpLAorICBjbEVudW1WYWwoU3RydWN0dXJlICwgInByaW50IHBhc3Mgc3RydWN0dXJlIGJlZm9yZSBydW4oKSIpLAorICBjbEVudW1WYWwoRXhlY3V0aW9ucywgInByaW50IHBhc3MgbmFtZSBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQiKSwKKyAgY2xFbnVtVmFsKERldGFpbHMgICAsICJwcmludCBwYXNzIGRldGFpbHMgd2hlbiBpdCBpcyBleGVjdXRlZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxFbmQpKTsKKwordHlwZWRlZiBsbHZtOjpjbDo6bGlzdDxjb25zdCBsbHZtOjpQYXNzSW5mbyAqLCBib29sLCBQYXNzTmFtZVBhcnNlcj4KK1Bhc3NPcHRpb25MaXN0OworCisvLyBQcmludCBJUiBvdXQgYmVmb3JlL2FmdGVyIHNwZWNpZmllZCBwYXNzZXMuCitzdGF0aWMgUGFzc09wdGlvbkxpc3QKK1ByaW50QmVmb3JlKCJwcmludC1iZWZvcmUiLAorICAgICAgICAgICAgbGx2bTo6Y2w6OmRlc2MoIlByaW50IElSIGJlZm9yZSBzcGVjaWZpZWQgcGFzc2VzIikpOworCitzdGF0aWMgUGFzc09wdGlvbkxpc3QKK1ByaW50QWZ0ZXIoInByaW50LWFmdGVyIiwKKyAgICAgICAgICAgbGx2bTo6Y2w6OmRlc2MoIlByaW50IElSIGFmdGVyIHNwZWNpZmllZCBwYXNzZXMiKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitQcmludEJlZm9yZUFsbCgicHJpbnQtYmVmb3JlLWFsbCIsCisgICAgICAgICAgICAgICBsbHZtOjpjbDo6ZGVzYygiUHJpbnQgSVIgYmVmb3JlIGVhY2ggcGFzcyIpLAorICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitQcmludEFmdGVyQWxsKCJwcmludC1hZnRlci1hbGwiLAorICAgICAgICAgICAgICBsbHZtOjpjbDo6ZGVzYygiUHJpbnQgSVIgYWZ0ZXIgZWFjaCBwYXNzIiksCisgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSk7CisKKy8vLyBUaGlzIGlzIGEgaGVscGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHByaW50IElSIGJlZm9yZSBvcgorLy8vIGFmdGVyIGEgcGFzcy4KKworc3RhdGljIGJvb2wgU2hvdWxkUHJpbnRCZWZvcmVPckFmdGVyUGFzcyhjb25zdCB2b2lkICpQYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NPcHRpb25MaXN0ICZQYXNzZXNUb1ByaW50KSB7CisgIGlmIChjb25zdCBsbHZtOjpQYXNzSW5mbyAqUEkgPQorICAgICAgUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKS0+Z2V0UGFzc0luZm8oUGFzc0lEKSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGllID0gUGFzc2VzVG9QcmludC5zaXplKCk7IGkgPCBpZTsgKytpKSB7CisgICAgICBjb25zdCBsbHZtOjpQYXNzSW5mbyAqUGFzc0luZiA9IFBhc3Nlc1RvUHJpbnRbaV07CisgICAgICBpZiAoUGFzc0luZikKKyAgICAgICAgaWYgKFBhc3NJbmYtPmdldFBhc3NBcmd1bWVudCgpID09IFBJLT5nZXRQYXNzQXJndW1lbnQoKSkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKyAgCisKKy8vLyBUaGlzIGlzIGEgdXRpbGl0eSB0byBjaGVjayB3aGV0aGVyIGEgcGFzcyBzaG91bGQgaGF2ZSBJUiBkdW1wZWQKKy8vLyBiZWZvcmUgaXQuCitzdGF0aWMgYm9vbCBTaG91bGRQcmludEJlZm9yZVBhc3MoY29uc3Qgdm9pZCAqUGFzc0lEKSB7CisgIHJldHVybiBQcmludEJlZm9yZUFsbCB8fCBTaG91bGRQcmludEJlZm9yZU9yQWZ0ZXJQYXNzKFBhc3NJRCwgUHJpbnRCZWZvcmUpOworfQorCisvLy8gVGhpcyBpcyBhIHV0aWxpdHkgdG8gY2hlY2sgd2hldGhlciBhIHBhc3Mgc2hvdWxkIGhhdmUgSVIgZHVtcGVkCisvLy8gYWZ0ZXIgaXQuCitzdGF0aWMgYm9vbCBTaG91bGRQcmludEFmdGVyUGFzcyhjb25zdCB2b2lkICpQYXNzSUQpIHsKKyAgcmV0dXJuIFByaW50QWZ0ZXJBbGwgfHwgU2hvdWxkUHJpbnRCZWZvcmVPckFmdGVyUGFzcyhQYXNzSUQsIFByaW50QWZ0ZXIpOworfQorCit9IC8vIEVuZCBvZiBsbHZtIG5hbWVzcGFjZQorCisvLy8gaXNQYXNzRGVidWdnaW5nRXhlY3V0aW9uc09yTW9yZSAtIFJldHVybiB0cnVlIGlmIC1kZWJ1Zy1wYXNzPUV4ZWN1dGlvbnMKKy8vLyBvciBoaWdoZXIgaXMgc3BlY2lmaWVkLgorYm9vbCBQTURhdGFNYW5hZ2VyOjppc1Bhc3NEZWJ1Z2dpbmdFeGVjdXRpb25zT3JNb3JlKCkgY29uc3QgeworICByZXR1cm4gUGFzc0RlYnVnZ2luZyA+PSBFeGVjdXRpb25zOworfQorCisKKworCit2b2lkIFBhc3NNYW5hZ2VyUHJldHR5U3RhY2tFbnRyeTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmIChWID09IDAgJiYgTSA9PSAwKQorICAgIE9TIDw8ICJSZWxlYXNpbmcgcGFzcyAnIjsKKyAgZWxzZQorICAgIE9TIDw8ICJSdW5uaW5nIHBhc3MgJyI7CisgIAorICBPUyA8PCBQLT5nZXRQYXNzTmFtZSgpIDw8ICInIjsKKyAgCisgIGlmIChNKSB7CisgICAgT1MgPDwgIiBvbiBtb2R1bGUgJyIgPDwgTS0+Z2V0TW9kdWxlSWRlbnRpZmllcigpIDw8ICInLlxuIjsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKFYgPT0gMCkgeworICAgIE9TIDw8ICdcbic7CisgICAgcmV0dXJuOworICB9CisKKyAgT1MgPDwgIiBvbiAiOworICBpZiAoaXNhPEZ1bmN0aW9uPihWKSkKKyAgICBPUyA8PCAiZnVuY3Rpb24iOworICBlbHNlIGlmIChpc2E8QmFzaWNCbG9jaz4oVikpCisgICAgT1MgPDwgImJhc2ljIGJsb2NrIjsKKyAgZWxzZQorICAgIE9TIDw8ICJ2YWx1ZSI7CisKKyAgT1MgPDwgIiAnIjsKKyAgV3JpdGVBc09wZXJhbmQoT1MsIFYsIC8qUHJpbnRUeT0qL2ZhbHNlLCBNKTsKKyAgT1MgPDwgIidcbiI7Cit9CisKKworbmFtZXNwYWNlIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJCUGFzc01hbmFnZXIKKy8vCisvLy8gQkJQYXNzTWFuYWdlciBtYW5hZ2VzIEJhc2ljQmxvY2tQYXNzLiBJdCBiYXRjaGVzIGFsbCB0aGUKKy8vLyBwYXNzIHRvZ2V0aGVyIGFuZCBzZXF1ZW5jZSB0aGVtIHRvIHByb2Nlc3Mgb25lIGJhc2ljIGJsb2NrIGJlZm9yZQorLy8vIHByb2Nlc3NpbmcgbmV4dCBiYXNpYyBibG9jay4KK2NsYXNzIEJCUGFzc01hbmFnZXIgOiBwdWJsaWMgUE1EYXRhTWFuYWdlciwgcHVibGljIEZ1bmN0aW9uUGFzcyB7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIGV4cGxpY2l0IEJCUGFzc01hbmFnZXIoaW50IERlcHRoKSAKKyAgICA6IFBNRGF0YU1hbmFnZXIoRGVwdGgpLCBGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgLy8vIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisgIC8vLyB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBmdW5jdGlvbiwgYW5kIGlmIHNvLCByZXR1cm4gdHJ1ZS4KKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKworICAvLy8gUGFzcyBNYW5hZ2VyIGl0c2VsZiBkb2VzIG5vdCBpbnZhbGlkYXRlIGFueSBhbmFseXNpcyBpbmZvLgorICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmSW5mbykgY29uc3QgeworICAgIEluZm8uc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKTsKKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKEZ1bmN0aW9uICZGKTsKKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pOworICBib29sIGRvRmluYWxpemF0aW9uKEZ1bmN0aW9uICZGKTsKKworICB2aXJ0dWFsIFBNRGF0YU1hbmFnZXIgKmdldEFzUE1EYXRhTWFuYWdlcigpIHsgcmV0dXJuIHRoaXM7IH0KKyAgdmlydHVhbCBQYXNzICpnZXRBc1Bhc3MoKSB7IHJldHVybiB0aGlzOyB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRQYXNzTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIkJhc2ljQmxvY2sgUGFzcyBNYW5hZ2VyIjsKKyAgfQorCisgIC8vIFByaW50IHBhc3NlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFuYWdlcgorICB2b2lkIGR1bXBQYXNzU3RydWN0dXJlKHVuc2lnbmVkIE9mZnNldCkgeworICAgIGxsdm06OmRiZ3MoKSA8PCBzdGQ6OnN0cmluZyhPZmZzZXQqMiwgJyAnKSA8PCAiQmFzaWNCbG9ja1Bhc3MgTWFuYWdlclxuIjsKKyAgICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRQYXNzZXMoKTsgKytJbmRleCkgeworICAgICAgQmFzaWNCbG9ja1Bhc3MgKkJQID0gZ2V0Q29udGFpbmVkUGFzcyhJbmRleCk7CisgICAgICBCUC0+ZHVtcFBhc3NTdHJ1Y3R1cmUoT2Zmc2V0ICsgMSk7CisgICAgICBkdW1wTGFzdFVzZXMoQlAsIE9mZnNldCsxKTsKKyAgICB9CisgIH0KKworICBCYXNpY0Jsb2NrUGFzcyAqZ2V0Q29udGFpbmVkUGFzcyh1bnNpZ25lZCBOKSB7CisgICAgYXNzZXJ0KE4gPCBQYXNzVmVjdG9yLnNpemUoKSAmJiAiUGFzcyBudW1iZXIgb3V0IG9mIHJhbmdlISIpOworICAgIEJhc2ljQmxvY2tQYXNzICpCUCA9IHN0YXRpY19jYXN0PEJhc2ljQmxvY2tQYXNzICo+KFBhc3NWZWN0b3JbTl0pOworICAgIHJldHVybiBCUDsKKyAgfQorCisgIHZpcnR1YWwgUGFzc01hbmFnZXJUeXBlIGdldFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IHsgCisgICAgcmV0dXJuIFBNVF9CYXNpY0Jsb2NrUGFzc01hbmFnZXI7IAorICB9Cit9OworCitjaGFyIEJCUGFzc01hbmFnZXI6OklEID0gMDsKK30KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRnVuY3Rpb25QYXNzTWFuYWdlckltcGwKKy8vCisvLy8gRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgbWFuYWdlcyBGUFBhc3NNYW5hZ2VycworY2xhc3MgRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgOiBwdWJsaWMgUGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFBNRGF0YU1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQTVRvcExldmVsTWFuYWdlciB7Citwcml2YXRlOgorICBib29sIHdhc1J1bjsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIGV4cGxpY2l0IEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsKGludCBEZXB0aCkgOiAKKyAgICBQYXNzKFBUX1Bhc3NNYW5hZ2VyLCBJRCksIFBNRGF0YU1hbmFnZXIoRGVwdGgpLCAKKyAgICBQTVRvcExldmVsTWFuYWdlcihUTE1fRnVuY3Rpb24pLCB3YXNSdW4oZmFsc2UpIHsgfQorCisgIC8vLyBhZGQgLSBBZGQgYSBwYXNzIHRvIHRoZSBxdWV1ZSBvZiBwYXNzZXMgdG8gcnVuLiAgVGhpcyBwYXNzZXMgb3duZXJzaGlwIG9mCisgIC8vLyB0aGUgUGFzcyB0byB0aGUgUGFzc01hbmFnZXIuICBXaGVuIHRoZSBQYXNzTWFuYWdlciBpcyBkZXN0cm95ZWQsIHRoZSBwYXNzCisgIC8vLyB3aWxsIGJlIGRlc3Ryb3llZCBhcyB3ZWxsLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGRlbGV0ZSB0aGUgcGFzcy4gIFRoaXMKKyAgLy8vIGltcGxpZXMgdGhhdCBhbGwgcGFzc2VzIE1VU1QgYmUgYWxsb2NhdGVkIHdpdGggJ25ldycuCisgIHZvaWQgYWRkKFBhc3MgKlApIHsKKyAgICBzY2hlZHVsZVBhc3MoUCk7CisgIH0KKyAKKyAgLy8vIGNyZWF0ZVByaW50ZXJQYXNzIC0gR2V0IGEgZnVuY3Rpb24gcHJpbnRlciBwYXNzLiAKKyAgUGFzcyAqY3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk8sIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY3JlYXRlUHJpbnRGdW5jdGlvblBhc3MoQmFubmVyLCAmTyk7CisgIH0KKworICAvLyBQcmVwYXJlIGZvciBydW5uaW5nIGFuIG9uIHRoZSBmbHkgcGFzcywgZnJlZWluZyBtZW1vcnkgaWYgbmVlZGVkCisgIC8vIGZyb20gYSBwcmV2aW91cyBydW4uCisgIHZvaWQgcmVsZWFzZU1lbW9yeU9uVGhlRmx5KCk7CisKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisgIC8vLyB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBtb2R1bGUsIGFuZCBpZiBzbywgcmV0dXJuIHRydWUuCisgIGJvb2wgcnVuKEZ1bmN0aW9uICZGKTsKKworICAvLy8gZG9Jbml0aWFsaXphdGlvbiAtIFJ1biBhbGwgb2YgdGhlIGluaXRpYWxpemVycyBmb3IgdGhlIGZ1bmN0aW9uIHBhc3Nlcy4KKyAgLy8vCisgIGJvb2wgZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJk0pOworICAKKyAgLy8vIGRvRmluYWxpemF0aW9uIC0gUnVuIGFsbCBvZiB0aGUgZmluYWxpemVycyBmb3IgdGhlIGZ1bmN0aW9uIHBhc3Nlcy4KKyAgLy8vCisgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB2aXJ0dWFsIFBNRGF0YU1hbmFnZXIgKmdldEFzUE1EYXRhTWFuYWdlcigpIHsgcmV0dXJuIHRoaXM7IH0KKyAgdmlydHVhbCBQYXNzICpnZXRBc1Bhc3MoKSB7IHJldHVybiB0aGlzOyB9CisKKyAgLy8vIFBhc3MgTWFuYWdlciBpdHNlbGYgZG9lcyBub3QgaW52YWxpZGF0ZSBhbnkgYW5hbHlzaXMgaW5mby4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0IHsKKyAgICBJbmZvLnNldFByZXNlcnZlc0FsbCgpOworICB9CisKKyAgaW5saW5lIHZvaWQgYWRkVG9wTGV2ZWxQYXNzKFBhc3MgKlApIHsKKyAgICBpZiAoSW1tdXRhYmxlUGFzcyAqSVAgPSBQLT5nZXRBc0ltbXV0YWJsZVBhc3MoKSkgeworICAgICAgLy8gUCBpcyBhIGltbXV0YWJsZSBwYXNzIGFuZCBpdCB3aWxsIGJlIG1hbmFnZWQgYnkgdGhpcworICAgICAgLy8gdG9wIGxldmVsIG1hbmFnZXIuIFNldCB1cCBhbmFseXNpcyByZXNvbHZlciB0byBjb25uZWN0IHRoZW0uCisgICAgICBBbmFseXNpc1Jlc29sdmVyICpBUiA9IG5ldyBBbmFseXNpc1Jlc29sdmVyKCp0aGlzKTsKKyAgICAgIFAtPnNldFJlc29sdmVyKEFSKTsKKyAgICAgIGluaXRpYWxpemVBbmFseXNpc0ltcGwoUCk7CisgICAgICBhZGRJbW11dGFibGVQYXNzKElQKTsKKyAgICAgIHJlY29yZEF2YWlsYWJsZUFuYWx5c2lzKElQKTsKKyAgICB9IGVsc2UgeworICAgICAgUC0+YXNzaWduUGFzc01hbmFnZXIoYWN0aXZlU3RhY2ssIFBNVF9GdW5jdGlvblBhc3NNYW5hZ2VyKTsKKyAgICB9CisKKyAgfQorCisgIEZQUGFzc01hbmFnZXIgKmdldENvbnRhaW5lZE1hbmFnZXIodW5zaWduZWQgTikgeworICAgIGFzc2VydChOIDwgUGFzc01hbmFnZXJzLnNpemUoKSAmJiAiUGFzcyBudW1iZXIgb3V0IG9mIHJhbmdlISIpOworICAgIEZQUGFzc01hbmFnZXIgKkZQID0gc3RhdGljX2Nhc3Q8RlBQYXNzTWFuYWdlciAqPihQYXNzTWFuYWdlcnNbTl0pOworICAgIHJldHVybiBGUDsKKyAgfQorfTsKKworY2hhciBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbDo6SUQgPSAwOworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1QUGFzc01hbmFnZXIKKy8vCisvLy8gTVBQYXNzTWFuYWdlciBtYW5hZ2VzIE1vZHVsZVBhc3NlcyBhbmQgZnVuY3Rpb24gcGFzcyBtYW5hZ2Vycy4KKy8vLyBJdCBiYXRjaGVzIGFsbCBNb2R1bGUgcGFzc2VzIGFuZCBmdW5jdGlvbiBwYXNzIG1hbmFnZXJzIHRvZ2V0aGVyIGFuZAorLy8vIHNlcXVlbmNlcyB0aGVtIHRvIHByb2Nlc3Mgb25lIG1vZHVsZS4KK2NsYXNzIE1QUGFzc01hbmFnZXIgOiBwdWJsaWMgUGFzcywgcHVibGljIFBNRGF0YU1hbmFnZXIgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgZXhwbGljaXQgTVBQYXNzTWFuYWdlcihpbnQgRGVwdGgpIDoKKyAgICBQYXNzKFBUX1Bhc3NNYW5hZ2VyLCBJRCksIFBNRGF0YU1hbmFnZXIoRGVwdGgpIHsgfQorCisgIC8vIERlbGV0ZSBvbiB0aGUgZmx5IG1hbmFnZXJzLgorICB2aXJ0dWFsIH5NUFBhc3NNYW5hZ2VyKCkgeworICAgIGZvciAoc3RkOjptYXA8UGFzcyAqLCBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbCAqPjo6aXRlcmF0b3IgCisgICAgICAgICAgIEkgPSBPblRoZUZseU1hbmFnZXJzLmJlZ2luKCksIEUgPSBPblRoZUZseU1hbmFnZXJzLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsICpGUFAgPSBJLT5zZWNvbmQ7CisgICAgICBkZWxldGUgRlBQOworICAgIH0KKyAgfQorCisgIC8vLyBjcmVhdGVQcmludGVyUGFzcyAtIEdldCBhIG1vZHVsZSBwcmludGVyIHBhc3MuIAorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmTywgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3QgeworICAgIHJldHVybiBjcmVhdGVQcmludE1vZHVsZVBhc3MoJk8sIGZhbHNlLCBCYW5uZXIpOworICB9CisKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisgIC8vLyB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBtb2R1bGUsIGFuZCBpZiBzbywgcmV0dXJuIHRydWUuCisgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKTsKKworICAvLy8gUGFzcyBNYW5hZ2VyIGl0c2VsZiBkb2VzIG5vdCBpbnZhbGlkYXRlIGFueSBhbmFseXNpcyBpbmZvLgorICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmSW5mbykgY29uc3QgeworICAgIEluZm8uc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICAvLy8gQWRkIFJlcXVpcmVkUGFzcyBpbnRvIGxpc3Qgb2YgbG93ZXIgbGV2ZWwgcGFzc2VzIHJlcXVpcmVkIGJ5IHBhc3MgUC4KKyAgLy8vIFJlcXVpcmVkUGFzcyBpcyBydW4gb24gdGhlIGZseSBieSBQYXNzIE1hbmFnZXIgd2hlbiBQIHJlcXVlc3RzIGl0CisgIC8vLyB0aHJvdWdoIGdldEFuYWx5c2lzIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIGFkZExvd2VyTGV2ZWxSZXF1aXJlZFBhc3MoUGFzcyAqUCwgUGFzcyAqUmVxdWlyZWRQYXNzKTsKKworICAvLy8gUmV0dXJuIGZ1bmN0aW9uIHBhc3MgY29ycmVzcG9uZGluZyB0byBQYXNzSW5mbyBQSSwgdGhhdCBpcyAKKyAgLy8vIHJlcXVpcmVkIGJ5IG1vZHVsZSBwYXNzIE1QLiBJbnN0YW50aWF0ZSBhbmFseXNpcyBwYXNzLCBieSB1c2luZworICAvLy8gaXRzIHJ1bk9uRnVuY3Rpb24oKSBmb3IgZnVuY3Rpb24gRi4KKyAgdmlydHVhbCBQYXNzKiBnZXRPblRoZUZseVBhc3MoUGFzcyAqTVAsIEFuYWx5c2lzSUQgUEksIEZ1bmN0aW9uICZGKTsKKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFBhc3NOYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiTW9kdWxlIFBhc3MgTWFuYWdlciI7CisgIH0KKworICB2aXJ0dWFsIFBNRGF0YU1hbmFnZXIgKmdldEFzUE1EYXRhTWFuYWdlcigpIHsgcmV0dXJuIHRoaXM7IH0KKyAgdmlydHVhbCBQYXNzICpnZXRBc1Bhc3MoKSB7IHJldHVybiB0aGlzOyB9CisKKyAgLy8gUHJpbnQgcGFzc2VzIG1hbmFnZWQgYnkgdGhpcyBtYW5hZ2VyCisgIHZvaWQgZHVtcFBhc3NTdHJ1Y3R1cmUodW5zaWduZWQgT2Zmc2V0KSB7CisgICAgbGx2bTo6ZGJncygpIDw8IHN0ZDo6c3RyaW5nKE9mZnNldCoyLCAnICcpIDw8ICJNb2R1bGVQYXNzIE1hbmFnZXJcbiI7CisgICAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpIHsKKyAgICAgIE1vZHVsZVBhc3MgKk1QID0gZ2V0Q29udGFpbmVkUGFzcyhJbmRleCk7CisgICAgICBNUC0+ZHVtcFBhc3NTdHJ1Y3R1cmUoT2Zmc2V0ICsgMSk7CisgICAgICBzdGQ6Om1hcDxQYXNzICosIEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsICo+Ojpjb25zdF9pdGVyYXRvciBJID0KKyAgICAgICAgT25UaGVGbHlNYW5hZ2Vycy5maW5kKE1QKTsKKyAgICAgIGlmIChJICE9IE9uVGhlRmx5TWFuYWdlcnMuZW5kKCkpCisgICAgICAgIEktPnNlY29uZC0+ZHVtcFBhc3NTdHJ1Y3R1cmUoT2Zmc2V0ICsgMik7CisgICAgICBkdW1wTGFzdFVzZXMoTVAsIE9mZnNldCsxKTsKKyAgICB9CisgIH0KKworICBNb2R1bGVQYXNzICpnZXRDb250YWluZWRQYXNzKHVuc2lnbmVkIE4pIHsKKyAgICBhc3NlcnQoTiA8IFBhc3NWZWN0b3Iuc2l6ZSgpICYmICJQYXNzIG51bWJlciBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1vZHVsZVBhc3MgKj4oUGFzc1ZlY3RvcltOXSk7CisgIH0KKworICB2aXJ0dWFsIFBhc3NNYW5hZ2VyVHlwZSBnZXRQYXNzTWFuYWdlclR5cGUoKSBjb25zdCB7IAorICAgIHJldHVybiBQTVRfTW9kdWxlUGFzc01hbmFnZXI7IAorICB9CisKKyBwcml2YXRlOgorICAvLy8gQ29sbGVjdGlvbiBvZiBvbiB0aGUgZmx5IEZQUGFzc01hbmFnZXJzLiBUaGVzZSBtYW5hZ2VycyBtYW5hZ2UKKyAgLy8vIGZ1bmN0aW9uIHBhc3NlcyB0aGF0IGFyZSByZXF1aXJlZCBieSBtb2R1bGUgcGFzc2VzLgorICBzdGQ6Om1hcDxQYXNzICosIEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsICo+IE9uVGhlRmx5TWFuYWdlcnM7Cit9OworCitjaGFyIE1QUGFzc01hbmFnZXI6OklEID0gMDsKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXNzTWFuYWdlckltcGwKKy8vCisKKy8vLyBQYXNzTWFuYWdlckltcGwgbWFuYWdlcyBNUFBhc3NNYW5hZ2VycworY2xhc3MgUGFzc01hbmFnZXJJbXBsIDogcHVibGljIFBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUE1EYXRhTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQTVRvcExldmVsTWFuYWdlciB7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIGV4cGxpY2l0IFBhc3NNYW5hZ2VySW1wbChpbnQgRGVwdGgpIDoKKyAgICBQYXNzKFBUX1Bhc3NNYW5hZ2VyLCBJRCksIFBNRGF0YU1hbmFnZXIoRGVwdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNVG9wTGV2ZWxNYW5hZ2VyKFRMTV9QYXNzKSB7IH0KKworICAvLy8gYWRkIC0gQWRkIGEgcGFzcyB0byB0aGUgcXVldWUgb2YgcGFzc2VzIHRvIHJ1bi4gIFRoaXMgcGFzc2VzIG93bmVyc2hpcCBvZgorICAvLy8gdGhlIFBhc3MgdG8gdGhlIFBhc3NNYW5hZ2VyLiAgV2hlbiB0aGUgUGFzc01hbmFnZXIgaXMgZGVzdHJveWVkLCB0aGUgcGFzcworICAvLy8gd2lsbCBiZSBkZXN0cm95ZWQgYXMgd2VsbCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBkZWxldGUgdGhlIHBhc3MuICBUaGlzCisgIC8vLyBpbXBsaWVzIHRoYXQgYWxsIHBhc3NlcyBNVVNUIGJlIGFsbG9jYXRlZCB3aXRoICduZXcnLgorICB2b2lkIGFkZChQYXNzICpQKSB7CisgICAgc2NoZWR1bGVQYXNzKFApOworICB9CisgCisgIC8vLyBjcmVhdGVQcmludGVyUGFzcyAtIEdldCBhIG1vZHVsZSBwcmludGVyIHBhc3MuIAorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmTywgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3QgeworICAgIHJldHVybiBjcmVhdGVQcmludE1vZHVsZVBhc3MoJk8sIGZhbHNlLCBCYW5uZXIpOworICB9CisKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisgIC8vLyB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBtb2R1bGUsIGFuZCBpZiBzbywgcmV0dXJuIHRydWUuCisgIGJvb2wgcnVuKE1vZHVsZSAmTSk7CisKKyAgLy8vIFBhc3MgTWFuYWdlciBpdHNlbGYgZG9lcyBub3QgaW52YWxpZGF0ZSBhbnkgYW5hbHlzaXMgaW5mby4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0IHsKKyAgICBJbmZvLnNldFByZXNlcnZlc0FsbCgpOworICB9CisKKyAgaW5saW5lIHZvaWQgYWRkVG9wTGV2ZWxQYXNzKFBhc3MgKlApIHsKKyAgICBpZiAoSW1tdXRhYmxlUGFzcyAqSVAgPSBQLT5nZXRBc0ltbXV0YWJsZVBhc3MoKSkgeworICAgICAgLy8gUCBpcyBhIGltbXV0YWJsZSBwYXNzIGFuZCBpdCB3aWxsIGJlIG1hbmFnZWQgYnkgdGhpcworICAgICAgLy8gdG9wIGxldmVsIG1hbmFnZXIuIFNldCB1cCBhbmFseXNpcyByZXNvbHZlciB0byBjb25uZWN0IHRoZW0uCisgICAgICBBbmFseXNpc1Jlc29sdmVyICpBUiA9IG5ldyBBbmFseXNpc1Jlc29sdmVyKCp0aGlzKTsKKyAgICAgIFAtPnNldFJlc29sdmVyKEFSKTsKKyAgICAgIGluaXRpYWxpemVBbmFseXNpc0ltcGwoUCk7CisgICAgICBhZGRJbW11dGFibGVQYXNzKElQKTsKKyAgICAgIHJlY29yZEF2YWlsYWJsZUFuYWx5c2lzKElQKTsKKyAgICB9IGVsc2UgeworICAgICAgUC0+YXNzaWduUGFzc01hbmFnZXIoYWN0aXZlU3RhY2ssIFBNVF9Nb2R1bGVQYXNzTWFuYWdlcik7CisgICAgfQorICB9CisKKyAgdmlydHVhbCBQTURhdGFNYW5hZ2VyICpnZXRBc1BNRGF0YU1hbmFnZXIoKSB7IHJldHVybiB0aGlzOyB9CisgIHZpcnR1YWwgUGFzcyAqZ2V0QXNQYXNzKCkgeyByZXR1cm4gdGhpczsgfQorCisgIE1QUGFzc01hbmFnZXIgKmdldENvbnRhaW5lZE1hbmFnZXIodW5zaWduZWQgTikgeworICAgIGFzc2VydChOIDwgUGFzc01hbmFnZXJzLnNpemUoKSAmJiAiUGFzcyBudW1iZXIgb3V0IG9mIHJhbmdlISIpOworICAgIE1QUGFzc01hbmFnZXIgKk1QID0gc3RhdGljX2Nhc3Q8TVBQYXNzTWFuYWdlciAqPihQYXNzTWFuYWdlcnNbTl0pOworICAgIHJldHVybiBNUDsKKyAgfQorfTsKKworY2hhciBQYXNzTWFuYWdlckltcGw6OklEID0gMDsKK30gLy8gRW5kIG9mIGxsdm0gbmFtZXNwYWNlCisKK25hbWVzcGFjZSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVGltaW5nSW5mbyBDbGFzcyAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjYWxjdWxhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisvLy8gYW1vdW50IG9mIHRpbWUgZWFjaCBwYXNzIHRha2VzIHRvIGV4ZWN1dGUuICBUaGlzIG9ubHkgaGFwcGVucyB3aGVuCisvLy8gLXRpbWUtcGFzc2VzIGlzIGVuYWJsZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKy8vLworCitzdGF0aWMgTWFuYWdlZFN0YXRpYzxzeXM6OlNtYXJ0TXV0ZXg8dHJ1ZT4gPiBUaW1pbmdJbmZvTXV0ZXg7CisKK2NsYXNzIFRpbWluZ0luZm8geworICBEZW5zZU1hcDxQYXNzKiwgVGltZXIqPiBUaW1pbmdEYXRhOworICBUaW1lckdyb3VwIFRHOworcHVibGljOgorICAvLyBVc2UgJ2NyZWF0ZScgbWVtYmVyIHRvIGdldCB0aGlzLgorICBUaW1pbmdJbmZvKCkgOiBURygiLi4uIFBhc3MgZXhlY3V0aW9uIHRpbWluZyByZXBvcnQgLi4uIikge30KKyAgCisgIC8vIFRpbWluZ0R0b3IgLSBQcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgdGltaW5nIGluZm9ybWF0aW9uCisgIH5UaW1pbmdJbmZvKCkgeworICAgIC8vIERlbGV0ZSBhbGwgb2YgdGhlIHRpbWVycywgd2hpY2ggYWNjdW11bGF0ZSB0aGVpciBpbmZvIGludG8gdGhlCisgICAgLy8gVGltZXJHcm91cC4KKyAgICBmb3IgKERlbnNlTWFwPFBhc3MqLCBUaW1lcio+OjppdGVyYXRvciBJID0gVGltaW5nRGF0YS5iZWdpbigpLAorICAgICAgICAgRSA9IFRpbWluZ0RhdGEuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgZGVsZXRlIEktPnNlY29uZDsKKyAgICAvLyBUaW1lckdyb3VwIGlzIGRlbGV0ZWQgbmV4dCwgcHJpbnRpbmcgdGhlIHJlcG9ydC4KKyAgfQorCisgIC8vIGNyZWF0ZVRoZVRpbWVJbmZvIC0gVGhpcyBtZXRob2QgZWl0aGVyIGluaXRpYWxpemVzIHRoZSBUaGVUaW1lSW5mbyBwb2ludGVyCisgIC8vIHRvIGEgbm9uIG51bGwgdmFsdWUgKGlmIHRoZSAtdGltZS1wYXNzZXMgb3B0aW9uIGlzIGVuYWJsZWQpIG9yIGl0IGxlYXZlcyBpdAorICAvLyBudWxsLiAgSXQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKyAgc3RhdGljIHZvaWQgY3JlYXRlVGhlVGltZUluZm8oKTsKKworICAvLy8gZ2V0UGFzc1RpbWVyIC0gUmV0dXJuIHRoZSB0aW1lciBmb3IgdGhlIHNwZWNpZmllZCBwYXNzIGlmIGl0IGV4aXN0cy4KKyAgVGltZXIgKmdldFBhc3NUaW1lcihQYXNzICpQKSB7CisgICAgaWYgKFAtPmdldEFzUE1EYXRhTWFuYWdlcigpKSAKKyAgICAgIHJldHVybiAwOworCisgICAgc3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gTG9jaygqVGltaW5nSW5mb011dGV4KTsKKyAgICBUaW1lciAqJlQgPSBUaW1pbmdEYXRhW1BdOworICAgIGlmIChUID09IDApCisgICAgICBUID0gbmV3IFRpbWVyKFAtPmdldFBhc3NOYW1lKCksIFRHKTsKKyAgICByZXR1cm4gVDsKKyAgfQorfTsKKworfSAvLyBFbmQgb2YgYW5vbiBuYW1lc3BhY2UKKworc3RhdGljIFRpbWluZ0luZm8gKlRoZVRpbWVJbmZvOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUE1Ub3BMZXZlbE1hbmFnZXIgaW1wbGVtZW50YXRpb24KKworLy8vIEluaXRpYWxpemUgdG9wIGxldmVsIG1hbmFnZXIuIENyZWF0ZSBmaXJzdCBwYXNzIG1hbmFnZXIuCitQTVRvcExldmVsTWFuYWdlcjo6UE1Ub3BMZXZlbE1hbmFnZXIoZW51bSBUb3BMZXZlbE1hbmFnZXJUeXBlIHQpIHsKKyAgaWYgKHQgPT0gVExNX1Bhc3MpIHsKKyAgICBNUFBhc3NNYW5hZ2VyICpNUFAgPSBuZXcgTVBQYXNzTWFuYWdlcigxKTsKKyAgICBNUFAtPnNldFRvcExldmVsTWFuYWdlcih0aGlzKTsKKyAgICBhZGRQYXNzTWFuYWdlcihNUFApOworICAgIGFjdGl2ZVN0YWNrLnB1c2goTVBQKTsKKyAgfSBlbHNlIGlmICh0ID09IFRMTV9GdW5jdGlvbikgeworICAgIEZQUGFzc01hbmFnZXIgKkZQUCA9IG5ldyBGUFBhc3NNYW5hZ2VyKDEpOworICAgIEZQUC0+c2V0VG9wTGV2ZWxNYW5hZ2VyKHRoaXMpOworICAgIGFkZFBhc3NNYW5hZ2VyKEZQUCk7CisgICAgYWN0aXZlU3RhY2sucHVzaChGUFApOworICB9IAorfQorCisvLy8gU2V0IHBhc3MgUCBhcyB0aGUgbGFzdCB1c2VyIG9mIHRoZSBnaXZlbiBhbmFseXNpcyBwYXNzZXMuCit2b2lkIFBNVG9wTGV2ZWxNYW5hZ2VyOjpzZXRMYXN0VXNlcihTbWFsbFZlY3RvcjxQYXNzICosIDEyPiAmQW5hbHlzaXNQYXNzZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzcyAqUCkgeworICBmb3IgKFNtYWxsVmVjdG9yPFBhc3MgKiwgMTI+OjppdGVyYXRvciBJID0gQW5hbHlzaXNQYXNzZXMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBBbmFseXNpc1Bhc3Nlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBQYXNzICpBUCA9ICpJOworICAgIExhc3RVc2VyW0FQXSA9IFA7CisgICAgCisgICAgaWYgKFAgPT0gQVApCisgICAgICBjb250aW51ZTsKKworICAgIC8vIElmIEFQIGlzIHRoZSBsYXN0IHVzZXIgb2Ygb3RoZXIgcGFzc2VzIHRoZW4gbWFrZSBQIGxhc3QgdXNlciBvZgorICAgIC8vIHN1Y2ggcGFzc2VzLgorICAgIGZvciAoRGVuc2VNYXA8UGFzcyAqLCBQYXNzICo+OjppdGVyYXRvciBMVUkgPSBMYXN0VXNlci5iZWdpbigpLAorICAgICAgICAgICBMVUUgPSBMYXN0VXNlci5lbmQoKTsgTFVJICE9IExVRTsgKytMVUkpIHsKKyAgICAgIGlmIChMVUktPnNlY29uZCA9PSBBUCkKKyAgICAgICAgLy8gRGVuc2VNYXAgaXRlcmF0b3IgaXMgbm90IGludmFsaWRhdGVkIGhlcmUgYmVjYXVzZQorICAgICAgICAvLyB0aGlzIGlzIGp1c3QgdXBkYXRpbmcgZXhpc2l0bmcgZW50cnkuCisgICAgICAgIExhc3RVc2VyW0xVSS0+Zmlyc3RdID0gUDsKKyAgICB9CisgIH0KK30KKworLy8vIENvbGxlY3QgcGFzc2VzIHdob3NlIGxhc3QgdXNlciBpcyBQCit2b2lkIFBNVG9wTGV2ZWxNYW5hZ2VyOjpjb2xsZWN0TGFzdFVzZXMoU21hbGxWZWN0b3I8UGFzcyAqLCAxMj4gJkxhc3RVc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3MgKlApIHsKKyAgRGVuc2VNYXA8UGFzcyAqLCBTbWFsbFB0clNldDxQYXNzICosIDg+ID46Oml0ZXJhdG9yIERNSSA9IAorICAgIEludmVyc2VkTGFzdFVzZXIuZmluZChQKTsKKyAgaWYgKERNSSA9PSBJbnZlcnNlZExhc3RVc2VyLmVuZCgpKQorICAgIHJldHVybjsKKworICBTbWFsbFB0clNldDxQYXNzICosIDg+ICZMVSA9IERNSS0+c2Vjb25kOworICBmb3IgKFNtYWxsUHRyU2V0PFBhc3MgKiwgOD46Oml0ZXJhdG9yIEkgPSBMVS5iZWdpbigpLAorICAgICAgICAgRSA9IExVLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIExhc3RVc2VzLnB1c2hfYmFjaygqSSk7CisgIH0KKworfQorCitBbmFseXNpc1VzYWdlICpQTVRvcExldmVsTWFuYWdlcjo6ZmluZEFuYWx5c2lzVXNhZ2UoUGFzcyAqUCkgeworICBBbmFseXNpc1VzYWdlICpBblVzYWdlID0gTlVMTDsKKyAgRGVuc2VNYXA8UGFzcyAqLCBBbmFseXNpc1VzYWdlICo+OjppdGVyYXRvciBETUkgPSBBblVzYWdlTWFwLmZpbmQoUCk7CisgIGlmIChETUkgIT0gQW5Vc2FnZU1hcC5lbmQoKSkgCisgICAgQW5Vc2FnZSA9IERNSS0+c2Vjb25kOworICBlbHNlIHsKKyAgICBBblVzYWdlID0gbmV3IEFuYWx5c2lzVXNhZ2UoKTsKKyAgICBQLT5nZXRBbmFseXNpc1VzYWdlKCpBblVzYWdlKTsKKyAgICBBblVzYWdlTWFwW1BdID0gQW5Vc2FnZTsKKyAgfQorICByZXR1cm4gQW5Vc2FnZTsKK30KKworLy8vIFNjaGVkdWxlIHBhc3MgUCBmb3IgZXhlY3V0aW9uLiBNYWtlIHN1cmUgdGhhdCBwYXNzZXMgcmVxdWlyZWQgYnkKKy8vLyBQIGFyZSBydW4gYmVmb3JlIFAgaXMgcnVuLiBVcGRhdGUgYW5hbHlzaXMgaW5mbyBtYWludGFpbmVkIGJ5CisvLy8gdGhlIG1hbmFnZXIuIFJlbW92ZSBkZWFkIHBhc3Nlcy4gVGhpcyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbi4KK3ZvaWQgUE1Ub3BMZXZlbE1hbmFnZXI6OnNjaGVkdWxlUGFzcyhQYXNzICpQKSB7CisKKyAgLy8gVE9ETyA6IEFsbG9jYXRlIGZ1bmN0aW9uIG1hbmFnZXIgZm9yIHRoaXMgcGFzcywgb3RoZXIgd2lzZSByZXF1aXJlZCBzZXQKKyAgLy8gbWF5IGJlIGluc2VydGVkIGludG8gcHJldmlvdXMgZnVuY3Rpb24gbWFuYWdlcgorCisgIC8vIEdpdmUgcGFzcyBhIGNoYW5jZSB0byBwcmVwYXJlIHRoZSBzdGFnZS4KKyAgUC0+cHJlcGFyZVBhc3NNYW5hZ2VyKGFjdGl2ZVN0YWNrKTsKKworICAvLyBJZiBQIGlzIGFuIGFuYWx5c2lzIHBhc3MgYW5kIGl0IGlzIGF2YWlsYWJsZSB0aGVuIGRvIG5vdAorICAvLyBnZW5lcmF0ZSB0aGUgYW5hbHlzaXMgYWdhaW4uIFN0YWxlIGFuYWx5c2lzIGluZm8gc2hvdWxkIG5vdCBiZQorICAvLyBhdmFpbGFibGUgYXQgdGhpcyBwb2ludC4KKyAgY29uc3QgUGFzc0luZm8gKlBJID0KKyAgICBQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpLT5nZXRQYXNzSW5mbyhQLT5nZXRQYXNzSUQoKSk7CisgIGlmIChQSSAmJiBQSS0+aXNBbmFseXNpcygpICYmIGZpbmRBbmFseXNpc1Bhc3MoUC0+Z2V0UGFzc0lEKCkpKSB7CisgICAgZGVsZXRlIFA7CisgICAgcmV0dXJuOworICB9CisKKyAgQW5hbHlzaXNVc2FnZSAqQW5Vc2FnZSA9IGZpbmRBbmFseXNpc1VzYWdlKFApOworCisgIGJvb2wgY2hlY2tBbmFseXNpcyA9IHRydWU7CisgIHdoaWxlIChjaGVja0FuYWx5c2lzKSB7CisgICAgY2hlY2tBbmFseXNpcyA9IGZhbHNlOworICAKKyAgICBjb25zdCBBbmFseXNpc1VzYWdlOjpWZWN0b3JUeXBlICZSZXF1aXJlZFNldCA9IEFuVXNhZ2UtPmdldFJlcXVpcmVkU2V0KCk7CisgICAgZm9yIChBbmFseXNpc1VzYWdlOjpWZWN0b3JUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gUmVxdWlyZWRTZXQuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IFJlcXVpcmVkU2V0LmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgCisgICAgICBQYXNzICpBbmFseXNpc1Bhc3MgPSBmaW5kQW5hbHlzaXNQYXNzKCpJKTsKKyAgICAgIGlmICghQW5hbHlzaXNQYXNzKSB7CisgICAgICAgIGNvbnN0IFBhc3NJbmZvICpQSSA9IFBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCktPmdldFBhc3NJbmZvKCpJKTsKKyAgICAgICAgQW5hbHlzaXNQYXNzID0gUEktPmNyZWF0ZVBhc3MoKTsKKyAgICAgICAgaWYgKFAtPmdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSAoKSA9PQorICAgICAgICAgICAgQW5hbHlzaXNQYXNzLT5nZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSkKKyAgICAgICAgICAvLyBTY2hlZHVsZSBhbmFseXNpcyBwYXNzIHRoYXQgaXMgbWFuYWdlZCBieSB0aGUgc2FtZSBwYXNzIG1hbmFnZXIuCisgICAgICAgICAgc2NoZWR1bGVQYXNzKEFuYWx5c2lzUGFzcyk7CisgICAgICAgIGVsc2UgaWYgKFAtPmdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSAoKSA+CisgICAgICAgICAgICAgICAgIEFuYWx5c2lzUGFzcy0+Z2V0UG90ZW50aWFsUGFzc01hbmFnZXJUeXBlKCkpIHsKKyAgICAgICAgICAvLyBTY2hlZHVsZSBhbmFseXNpcyBwYXNzIHRoYXQgaXMgbWFuYWdlZCBieSBhIG5ldyBtYW5hZ2VyLgorICAgICAgICAgIHNjaGVkdWxlUGFzcyhBbmFseXNpc1Bhc3MpOworICAgICAgICAgIC8vIFJlY2hlY2sgYW5hbHlzaXMgcGFzc2VzIHRvIGVuc3VyZSB0aGF0IHJlcXVpcmVkIGFuYWx5c2lzZXMgdGhhdAorICAgICAgICAgIC8vIGFyZSBhbHJlYWR5IGNoZWNrZWQgYXJlIHN0aWxsIGF2YWlsYWJsZS4KKyAgICAgICAgICBjaGVja0FuYWx5c2lzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgLy8gRG8gbm90IHNjaGVkdWxlIHRoaXMgYW5hbHlzaXMuIExvd2VyIGxldmVsIGFuYWxzeWlzIAorICAgICAgICAgIC8vIHBhc3NlcyBhcmUgcnVuIG9uIHRoZSBmbHkuCisgICAgICAgICAgZGVsZXRlIEFuYWx5c2lzUGFzczsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBOb3cgYWxsIHJlcXVpcmVkIHBhc3NlcyBhcmUgYXZhaWxhYmxlLgorICBhZGRUb3BMZXZlbFBhc3MoUCk7Cit9CisKKy8vLyBGaW5kIHRoZSBwYXNzIHRoYXQgaW1wbGVtZW50cyBBbmFseXNpcyBBSUQuIFNlYXJjaCBpbW11dGFibGUKKy8vLyBwYXNzZXMgYW5kIGFsbCBwYXNzIG1hbmFnZXJzLiBJZiBkZXNpcmVkIHBhc3MgaXMgbm90IGZvdW5kCisvLy8gdGhlbiByZXR1cm4gTlVMTC4KK1Bhc3MgKlBNVG9wTGV2ZWxNYW5hZ2VyOjpmaW5kQW5hbHlzaXNQYXNzKEFuYWx5c2lzSUQgQUlEKSB7CisKKyAgUGFzcyAqUCA9IE5VTEw7CisgIC8vIENoZWNrIHBhc3MgbWFuYWdlcnMKKyAgZm9yIChTbWFsbFZlY3RvcjxQTURhdGFNYW5hZ2VyICosIDg+OjppdGVyYXRvciBJID0gUGFzc01hbmFnZXJzLmJlZ2luKCksCisgICAgICAgICBFID0gUGFzc01hbmFnZXJzLmVuZCgpOyBQID09IE5VTEwgJiYgSSAhPSBFOyArK0kpIHsKKyAgICBQTURhdGFNYW5hZ2VyICpQTUQgPSAqSTsKKyAgICBQID0gUE1ELT5maW5kQW5hbHlzaXNQYXNzKEFJRCwgZmFsc2UpOworICB9CisKKyAgLy8gQ2hlY2sgb3RoZXIgcGFzcyBtYW5hZ2VycworICBmb3IgKFNtYWxsVmVjdG9yPFBNRGF0YU1hbmFnZXIgKiwgOD46Oml0ZXJhdG9yCisgICAgICAgICBJID0gSW5kaXJlY3RQYXNzTWFuYWdlcnMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBJbmRpcmVjdFBhc3NNYW5hZ2Vycy5lbmQoKTsgUCA9PSBOVUxMICYmIEkgIT0gRTsgKytJKQorICAgIFAgPSAoKkkpLT5maW5kQW5hbHlzaXNQYXNzKEFJRCwgZmFsc2UpOworCisgIGZvciAoU21hbGxWZWN0b3I8SW1tdXRhYmxlUGFzcyAqLCA4Pjo6aXRlcmF0b3IgSSA9IEltbXV0YWJsZVBhc3Nlcy5iZWdpbigpLAorICAgICAgICAgRSA9IEltbXV0YWJsZVBhc3Nlcy5lbmQoKTsgUCA9PSBOVUxMICYmIEkgIT0gRTsgKytJKSB7CisgICAgQW5hbHlzaXNJRCBQSSA9ICgqSSktPmdldFBhc3NJRCgpOworICAgIGlmIChQSSA9PSBBSUQpCisgICAgICBQID0gKkk7CisKKyAgICAvLyBJZiBQYXNzIG5vdCBmb3VuZCB0aGVuIGNoZWNrIHRoZSBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IEltbXV0YWJsZSBQYXNzCisgICAgaWYgKCFQKSB7CisgICAgICBjb25zdCBQYXNzSW5mbyAqUGFzc0luZiA9CisgICAgICAgIFBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCktPmdldFBhc3NJbmZvKFBJKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IFBhc3NJbmZvKj4gJkltbVBJID0KKyAgICAgICAgUGFzc0luZi0+Z2V0SW50ZXJmYWNlc0ltcGxlbWVudGVkKCk7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPGNvbnN0IFBhc3NJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIElJID0gSW1tUEkuYmVnaW4oKSwKKyAgICAgICAgICAgRUUgPSBJbW1QSS5lbmQoKTsgSUkgIT0gRUU7ICsrSUkpIHsKKyAgICAgICAgaWYgKCgqSUkpLT5nZXRUeXBlSW5mbygpID09IEFJRCkKKyAgICAgICAgICBQID0gKkk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIFA7Cit9CisKKy8vIFByaW50IHBhc3NlcyBtYW5hZ2VkIGJ5IHRoaXMgdG9wIGxldmVsIG1hbmFnZXIuCit2b2lkIFBNVG9wTGV2ZWxNYW5hZ2VyOjpkdW1wUGFzc2VzKCkgY29uc3QgeworCisgIGlmIChQYXNzRGVidWdnaW5nIDwgU3RydWN0dXJlKQorICAgIHJldHVybjsKKworICAvLyBQcmludCBvdXQgdGhlIGltbXV0YWJsZSBwYXNzZXMKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEltbXV0YWJsZVBhc3Nlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgSW1tdXRhYmxlUGFzc2VzW2ldLT5kdW1wUGFzc1N0cnVjdHVyZSgwKTsKKyAgfQorICAKKyAgLy8gRXZlcnkgY2xhc3MgdGhhdCBkZXJpdmVzIGZyb20gUE1EYXRhTWFuYWdlciBhbHNvIGRlcml2ZXMgZnJvbSBQYXNzCisgIC8vIChzb21ldGltZXMgaW5kaXJlY3RseSksIGJ1dCB0aGVyZSdzIG5vIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcAorICAvLyBiZXR3ZWVuIFBNRGF0YU1hbmFnZXIgYW5kIFBhc3MsIHNvIHdlIGhhdmUgdG8gZ2V0QXNQYXNzIHRvIGdldAorICAvLyBmcm9tIGEgUE1EYXRhTWFuYWdlciogdG8gYSBQYXNzKi4KKyAgZm9yIChTbWFsbFZlY3RvcjxQTURhdGFNYW5hZ2VyICosIDg+Ojpjb25zdF9pdGVyYXRvciBJID0gUGFzc01hbmFnZXJzLmJlZ2luKCksCisgICAgICAgICBFID0gUGFzc01hbmFnZXJzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAoKkkpLT5nZXRBc1Bhc3MoKS0+ZHVtcFBhc3NTdHJ1Y3R1cmUoMSk7Cit9CisKK3ZvaWQgUE1Ub3BMZXZlbE1hbmFnZXI6OmR1bXBBcmd1bWVudHMoKSBjb25zdCB7CisKKyAgaWYgKFBhc3NEZWJ1Z2dpbmcgPCBBcmd1bWVudHMpCisgICAgcmV0dXJuOworCisgIGRiZ3MoKSA8PCAiUGFzcyBBcmd1bWVudHM6ICI7CisgIGZvciAoU21hbGxWZWN0b3I8UE1EYXRhTWFuYWdlciAqLCA4Pjo6Y29uc3RfaXRlcmF0b3IgSSA9IFBhc3NNYW5hZ2Vycy5iZWdpbigpLAorICAgICAgICAgRSA9IFBhc3NNYW5hZ2Vycy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgKCpJKS0+ZHVtcFBhc3NBcmd1bWVudHMoKTsKKyAgZGJncygpIDw8ICJcbiI7Cit9CisKK3ZvaWQgUE1Ub3BMZXZlbE1hbmFnZXI6OmluaXRpYWxpemVBbGxBbmFseXNpc0luZm8oKSB7CisgIGZvciAoU21hbGxWZWN0b3I8UE1EYXRhTWFuYWdlciAqLCA4Pjo6aXRlcmF0b3IgSSA9IFBhc3NNYW5hZ2Vycy5iZWdpbigpLAorICAgICAgICAgRSA9IFBhc3NNYW5hZ2Vycy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgKCpJKS0+aW5pdGlhbGl6ZUFuYWx5c2lzSW5mbygpOworICAKKyAgLy8gSW5pdGFpbGl6ZSBvdGhlciBwYXNzIG1hbmFnZXJzCisgIGZvciAoU21hbGxWZWN0b3I8UE1EYXRhTWFuYWdlciAqLCA4Pjo6aXRlcmF0b3IgSSA9IEluZGlyZWN0UGFzc01hbmFnZXJzLmJlZ2luKCksCisgICAgICAgICBFID0gSW5kaXJlY3RQYXNzTWFuYWdlcnMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICgqSSktPmluaXRpYWxpemVBbmFseXNpc0luZm8oKTsKKworICBmb3IgKERlbnNlTWFwPFBhc3MgKiwgUGFzcyAqPjo6aXRlcmF0b3IgRE1JID0gTGFzdFVzZXIuYmVnaW4oKSwKKyAgICAgICAgRE1FID0gTGFzdFVzZXIuZW5kKCk7IERNSSAhPSBETUU7ICsrRE1JKSB7CisgICAgRGVuc2VNYXA8UGFzcyAqLCBTbWFsbFB0clNldDxQYXNzICosIDg+ID46Oml0ZXJhdG9yIEludkRNSSA9IAorICAgICAgSW52ZXJzZWRMYXN0VXNlci5maW5kKERNSS0+c2Vjb25kKTsKKyAgICBpZiAoSW52RE1JICE9IEludmVyc2VkTGFzdFVzZXIuZW5kKCkpIHsKKyAgICAgIFNtYWxsUHRyU2V0PFBhc3MgKiwgOD4gJkwgPSBJbnZETUktPnNlY29uZDsKKyAgICAgIEwuaW5zZXJ0KERNSS0+Zmlyc3QpOworICAgIH0gZWxzZSB7CisgICAgICBTbWFsbFB0clNldDxQYXNzICosIDg+IEw7IEwuaW5zZXJ0KERNSS0+Zmlyc3QpOworICAgICAgSW52ZXJzZWRMYXN0VXNlcltETUktPnNlY29uZF0gPSBMOworICAgIH0KKyAgfQorfQorCisvLy8gRGVzdHJ1Y3RvcgorUE1Ub3BMZXZlbE1hbmFnZXI6On5QTVRvcExldmVsTWFuYWdlcigpIHsKKyAgZm9yIChTbWFsbFZlY3RvcjxQTURhdGFNYW5hZ2VyICosIDg+OjppdGVyYXRvciBJID0gUGFzc01hbmFnZXJzLmJlZ2luKCksCisgICAgICAgICBFID0gUGFzc01hbmFnZXJzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBkZWxldGUgKkk7CisgIAorICBmb3IgKFNtYWxsVmVjdG9yPEltbXV0YWJsZVBhc3MgKiwgOD46Oml0ZXJhdG9yCisgICAgICAgICBJID0gSW1tdXRhYmxlUGFzc2VzLmJlZ2luKCksIEUgPSBJbW11dGFibGVQYXNzZXMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGRlbGV0ZSAqSTsKKworICBmb3IgKERlbnNlTWFwPFBhc3MgKiwgQW5hbHlzaXNVc2FnZSAqPjo6aXRlcmF0b3IgRE1JID0gQW5Vc2FnZU1hcC5iZWdpbigpLAorICAgICAgICAgRE1FID0gQW5Vc2FnZU1hcC5lbmQoKTsgRE1JICE9IERNRTsgKytETUkpCisgICAgZGVsZXRlIERNSS0+c2Vjb25kOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUE1EYXRhTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorCisvLy8gQXVnZW1lbnQgQXZhaWxhYmxlQW5hbHlzaXMgYnkgYWRkaW5nIGFuYWx5c2lzIG1hZGUgYXZhaWxhYmxlIGJ5IHBhc3MgUC4KK3ZvaWQgUE1EYXRhTWFuYWdlcjo6cmVjb3JkQXZhaWxhYmxlQW5hbHlzaXMoUGFzcyAqUCkgeworICBBbmFseXNpc0lEIFBJID0gUC0+Z2V0UGFzc0lEKCk7CisgIAorICBBdmFpbGFibGVBbmFseXNpc1tQSV0gPSBQOworICAKKyAgYXNzZXJ0KEF2YWlsYWJsZUFuYWx5c2lzLnNpemUoKSk7CisKKyAgLy9UaGlzIHBhc3MgaXMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgYWxsIG9mIHRoZSBpbnRlcmZhY2VzIGl0CisgIC8vaW1wbGVtZW50cyBhcyB3ZWxsLgorICBjb25zdCBQYXNzSW5mbyAqUEluZiA9IFBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCktPmdldFBhc3NJbmZvKFBJKTsKKyAgaWYgKFBJbmYgPT0gMCkgcmV0dXJuOworICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBQYXNzSW5mbyo+ICZJSSA9IFBJbmYtPmdldEludGVyZmFjZXNJbXBsZW1lbnRlZCgpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSUkuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBBdmFpbGFibGVBbmFseXNpc1tJSVtpXS0+Z2V0VHlwZUluZm8oKV0gPSBQOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBQIHByZXNlcnZlcyBoaWdoIGxldmVsIGFuYWx5c2lzIHVzZWQgYnkgb3RoZXIKKy8vIHBhc3NlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFuYWdlcgorYm9vbCBQTURhdGFNYW5hZ2VyOjpwcmVzZXJ2ZUhpZ2hlckxldmVsQW5hbHlzaXMoUGFzcyAqUCkgeworICBBbmFseXNpc1VzYWdlICpBblVzYWdlID0gVFBNLT5maW5kQW5hbHlzaXNVc2FnZShQKTsKKyAgaWYgKEFuVXNhZ2UtPmdldFByZXNlcnZlc0FsbCgpKQorICAgIHJldHVybiB0cnVlOworICAKKyAgY29uc3QgQW5hbHlzaXNVc2FnZTo6VmVjdG9yVHlwZSAmUHJlc2VydmVkU2V0ID0gQW5Vc2FnZS0+Z2V0UHJlc2VydmVkU2V0KCk7CisgIGZvciAoU21hbGxWZWN0b3I8UGFzcyAqLCA4Pjo6aXRlcmF0b3IgSSA9IEhpZ2hlckxldmVsQW5hbHlzaXMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBIaWdoZXJMZXZlbEFuYWx5c2lzLmVuZCgpOyBJICAhPSBFOyArK0kpIHsKKyAgICBQYXNzICpQMSA9ICpJOworICAgIGlmIChQMS0+Z2V0QXNJbW11dGFibGVQYXNzKCkgPT0gMCAmJgorICAgICAgICBzdGQ6OmZpbmQoUHJlc2VydmVkU2V0LmJlZ2luKCksIFByZXNlcnZlZFNldC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgIFAxLT5nZXRQYXNzSUQoKSkgPT0gCisgICAgICAgICAgIFByZXNlcnZlZFNldC5lbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyB2ZXJpZnlQcmVzZXJ2ZWRBbmFseXNpcyAtLSBWZXJpZnkgYW5hbHlzaXMgcHJlc2VydmVkIGJ5IHBhc3MgUC4KK3ZvaWQgUE1EYXRhTWFuYWdlcjo6dmVyaWZ5UHJlc2VydmVkQW5hbHlzaXMoUGFzcyAqUCkgeworICAvLyBEb24ndCBkbyB0aGlzIHVubGVzcyBhc3NlcnRpb25zIGFyZSBlbmFibGVkLgorI2lmZGVmIE5ERUJVRworICByZXR1cm47CisjZW5kaWYKKyAgQW5hbHlzaXNVc2FnZSAqQW5Vc2FnZSA9IFRQTS0+ZmluZEFuYWx5c2lzVXNhZ2UoUCk7CisgIGNvbnN0IEFuYWx5c2lzVXNhZ2U6OlZlY3RvclR5cGUgJlByZXNlcnZlZFNldCA9IEFuVXNhZ2UtPmdldFByZXNlcnZlZFNldCgpOworCisgIC8vIFZlcmlmeSBwcmVzZXJ2ZWQgYW5hbHlzaXMKKyAgZm9yIChBbmFseXNpc1VzYWdlOjpWZWN0b3JUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gUHJlc2VydmVkU2V0LmJlZ2luKCksCisgICAgICAgICBFID0gUHJlc2VydmVkU2V0LmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEFuYWx5c2lzSUQgQUlEID0gKkk7CisgICAgaWYgKFBhc3MgKkFQID0gZmluZEFuYWx5c2lzUGFzcyhBSUQsIHRydWUpKSB7CisgICAgICBUaW1lUmVnaW9uIFBhc3NUaW1lcihnZXRQYXNzVGltZXIoQVApKTsKKyAgICAgIEFQLT52ZXJpZnlBbmFseXNpcygpOworICAgIH0KKyAgfQorfQorCisvLy8gUmVtb3ZlIEFuYWx5c2lzIG5vdCBwcmVzZXJ2ZWQgYnkgUGFzcyBQCit2b2lkIFBNRGF0YU1hbmFnZXI6OnJlbW92ZU5vdFByZXNlcnZlZEFuYWx5c2lzKFBhc3MgKlApIHsKKyAgQW5hbHlzaXNVc2FnZSAqQW5Vc2FnZSA9IFRQTS0+ZmluZEFuYWx5c2lzVXNhZ2UoUCk7CisgIGlmIChBblVzYWdlLT5nZXRQcmVzZXJ2ZXNBbGwoKSkKKyAgICByZXR1cm47CisKKyAgY29uc3QgQW5hbHlzaXNVc2FnZTo6VmVjdG9yVHlwZSAmUHJlc2VydmVkU2V0ID0gQW5Vc2FnZS0+Z2V0UHJlc2VydmVkU2V0KCk7CisgIGZvciAoc3RkOjptYXA8QW5hbHlzaXNJRCwgUGFzcyo+OjppdGVyYXRvciBJID0gQXZhaWxhYmxlQW5hbHlzaXMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBBdmFpbGFibGVBbmFseXNpcy5lbmQoKTsgSSAhPSBFOyApIHsKKyAgICBzdGQ6Om1hcDxBbmFseXNpc0lELCBQYXNzKj46Oml0ZXJhdG9yIEluZm8gPSBJKys7CisgICAgaWYgKEluZm8tPnNlY29uZC0+Z2V0QXNJbW11dGFibGVQYXNzKCkgPT0gMCAmJgorICAgICAgICBzdGQ6OmZpbmQoUHJlc2VydmVkU2V0LmJlZ2luKCksIFByZXNlcnZlZFNldC5lbmQoKSwgSW5mby0+Zmlyc3QpID09IAorICAgICAgICBQcmVzZXJ2ZWRTZXQuZW5kKCkpIHsKKyAgICAgIC8vIFJlbW92ZSB0aGlzIGFuYWx5c2lzCisgICAgICBpZiAoUGFzc0RlYnVnZ2luZyA+PSBEZXRhaWxzKSB7CisgICAgICAgIFBhc3MgKlMgPSBJbmZvLT5zZWNvbmQ7CisgICAgICAgIGRiZ3MoKSA8PCAiIC0tICciIDw8ICBQLT5nZXRQYXNzTmFtZSgpIDw8ICInIGlzIG5vdCBwcmVzZXJ2aW5nICciOworICAgICAgICBkYmdzKCkgPDwgUy0+Z2V0UGFzc05hbWUoKSA8PCAiJ1xuIjsKKyAgICAgIH0KKyAgICAgIEF2YWlsYWJsZUFuYWx5c2lzLmVyYXNlKEluZm8pOworICAgIH0KKyAgfQorICAKKyAgLy8gQ2hlY2sgaW5oZXJpdGVkIGFuYWx5c2lzIGFsc28uIElmIFAgaXMgbm90IHByZXNlcnZpbmcgYW5hbHlzaXMKKyAgLy8gcHJvdmlkZWQgYnkgcGFyZW50IG1hbmFnZXIgdGhlbiByZW1vdmUgaXQgaGVyZS4KKyAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgUE1UX0xhc3Q7ICsrSW5kZXgpIHsKKworICAgIGlmICghSW5oZXJpdGVkQW5hbHlzaXNbSW5kZXhdKQorICAgICAgY29udGludWU7CisKKyAgICBmb3IgKHN0ZDo6bWFwPEFuYWx5c2lzSUQsIFBhc3MqPjo6aXRlcmF0b3IgCisgICAgICAgICAgIEkgPSBJbmhlcml0ZWRBbmFseXNpc1tJbmRleF0tPmJlZ2luKCksCisgICAgICAgICAgIEUgPSBJbmhlcml0ZWRBbmFseXNpc1tJbmRleF0tPmVuZCgpOyBJICE9IEU7ICkgeworICAgICAgc3RkOjptYXA8QW5hbHlzaXNJRCwgUGFzcyAqPjo6aXRlcmF0b3IgSW5mbyA9IEkrKzsKKyAgICAgIGlmIChJbmZvLT5zZWNvbmQtPmdldEFzSW1tdXRhYmxlUGFzcygpID09IDAgJiYKKyAgICAgICAgICBzdGQ6OmZpbmQoUHJlc2VydmVkU2V0LmJlZ2luKCksIFByZXNlcnZlZFNldC5lbmQoKSwgSW5mby0+Zmlyc3QpID09IAorICAgICAgICAgICAgIFByZXNlcnZlZFNldC5lbmQoKSkgeworICAgICAgICAvLyBSZW1vdmUgdGhpcyBhbmFseXNpcworICAgICAgICBpZiAoUGFzc0RlYnVnZ2luZyA+PSBEZXRhaWxzKSB7CisgICAgICAgICAgUGFzcyAqUyA9IEluZm8tPnNlY29uZDsKKyAgICAgICAgICBkYmdzKCkgPDwgIiAtLSAnIiA8PCAgUC0+Z2V0UGFzc05hbWUoKSA8PCAiJyBpcyBub3QgcHJlc2VydmluZyAnIjsKKyAgICAgICAgICBkYmdzKCkgPDwgUy0+Z2V0UGFzc05hbWUoKSA8PCAiJ1xuIjsKKyAgICAgICAgfQorICAgICAgICBJbmhlcml0ZWRBbmFseXNpc1tJbmRleF0tPmVyYXNlKEluZm8pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy8gUmVtb3ZlIGFuYWx5c2lzIHBhc3NlcyB0aGF0IGFyZSBub3QgdXNlZCBhbnkgbG9uZ2VyCit2b2lkIFBNRGF0YU1hbmFnZXI6OnJlbW92ZURlYWRQYXNzZXMoUGFzcyAqUCwgU3RyaW5nUmVmIE1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFBhc3NEZWJ1Z2dpbmdTdHJpbmcgREJHX1NUUikgeworCisgIFNtYWxsVmVjdG9yPFBhc3MgKiwgMTI+IERlYWRQYXNzZXM7CisKKyAgLy8gSWYgdGhpcyBpcyBhIG9uIHRoZSBmbHkgbWFuYWdlciB0aGVuIGl0IGRvZXMgbm90IGhhdmUgVFBNLgorICBpZiAoIVRQTSkKKyAgICByZXR1cm47CisKKyAgVFBNLT5jb2xsZWN0TGFzdFVzZXMoRGVhZFBhc3NlcywgUCk7CisKKyAgaWYgKFBhc3NEZWJ1Z2dpbmcgPj0gRGV0YWlscyAmJiAhRGVhZFBhc3Nlcy5lbXB0eSgpKSB7CisgICAgZGJncygpIDw8ICIgLSotICciIDw8ICBQLT5nZXRQYXNzTmFtZSgpOworICAgIGRiZ3MoKSA8PCAiJyBpcyB0aGUgbGFzdCB1c2VyIG9mIGZvbGxvd2luZyBwYXNzIGluc3RhbmNlcy4iOworICAgIGRiZ3MoKSA8PCAiIEZyZWUgdGhlc2UgaW5zdGFuY2VzXG4iOworICB9CisKKyAgZm9yIChTbWFsbFZlY3RvcjxQYXNzICosIDEyPjo6aXRlcmF0b3IgSSA9IERlYWRQYXNzZXMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBEZWFkUGFzc2VzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBmcmVlUGFzcygqSSwgTXNnLCBEQkdfU1RSKTsKK30KKwordm9pZCBQTURhdGFNYW5hZ2VyOjpmcmVlUGFzcyhQYXNzICpQLCBTdHJpbmdSZWYgTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFBhc3NEZWJ1Z2dpbmdTdHJpbmcgREJHX1NUUikgeworICBkdW1wUGFzc0luZm8oUCwgRlJFRUlOR19NU0csIERCR19TVFIsIE1zZyk7CisKKyAgeworICAgIC8vIElmIHRoZSBwYXNzIGNyYXNoZXMgcmVsZWFzaW5nIG1lbW9yeSwgcmVtZW1iZXIgdGhpcy4KKyAgICBQYXNzTWFuYWdlclByZXR0eVN0YWNrRW50cnkgWChQKTsKKyAgICBUaW1lUmVnaW9uIFBhc3NUaW1lcihnZXRQYXNzVGltZXIoUCkpOworCisgICAgUC0+cmVsZWFzZU1lbW9yeSgpOworICB9CisKKyAgQW5hbHlzaXNJRCBQSSA9IFAtPmdldFBhc3NJRCgpOworICBpZiAoY29uc3QgUGFzc0luZm8gKlBJbmYgPSBQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpLT5nZXRQYXNzSW5mbyhQSSkpIHsKKyAgICAvLyBSZW1vdmUgdGhlIHBhc3MgaXRzZWxmIChpZiBpdCBpcyBub3QgYWxyZWFkeSByZW1vdmVkKS4KKyAgICBBdmFpbGFibGVBbmFseXNpcy5lcmFzZShQSSk7CisKKyAgICAvLyBSZW1vdmUgYWxsIGludGVyZmFjZXMgdGhpcyBwYXNzIGltcGxlbWVudHMsIGZvciB3aGljaCBpdCBpcyBhbHNvCisgICAgLy8gbGlzdGVkIGFzIHRoZSBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24uCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgUGFzc0luZm8qPiAmSUkgPSBQSW5mLT5nZXRJbnRlcmZhY2VzSW1wbGVtZW50ZWQoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSUkuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgc3RkOjptYXA8QW5hbHlzaXNJRCwgUGFzcyo+OjppdGVyYXRvciBQb3MgPQorICAgICAgICBBdmFpbGFibGVBbmFseXNpcy5maW5kKElJW2ldLT5nZXRUeXBlSW5mbygpKTsKKyAgICAgIGlmIChQb3MgIT0gQXZhaWxhYmxlQW5hbHlzaXMuZW5kKCkgJiYgUG9zLT5zZWNvbmQgPT0gUCkKKyAgICAgICAgQXZhaWxhYmxlQW5hbHlzaXMuZXJhc2UoUG9zKTsKKyAgICB9CisgIH0KK30KKworLy8vIEFkZCBwYXNzIFAgaW50byB0aGUgUGFzc1ZlY3Rvci4gVXBkYXRlIAorLy8vIEF2YWlsYWJsZUFuYWx5c2lzIGFwcHJvcHJpYXRlbHkgaWYgUHJvY2Vzc0FuYWx5c2lzIGlzIHRydWUuCit2b2lkIFBNRGF0YU1hbmFnZXI6OmFkZChQYXNzICpQLCBib29sIFByb2Nlc3NBbmFseXNpcykgeworICAvLyBUaGlzIG1hbmFnZXIgaXMgZ29pbmcgdG8gbWFuYWdlIHBhc3MgUC4gU2V0IHVwIGFuYWx5c2lzIHJlc29sdmVyCisgIC8vIHRvIGNvbm5lY3QgdGhlbS4KKyAgQW5hbHlzaXNSZXNvbHZlciAqQVIgPSBuZXcgQW5hbHlzaXNSZXNvbHZlcigqdGhpcyk7CisgIFAtPnNldFJlc29sdmVyKEFSKTsKKworICAvLyBJZiBhIEZ1bmN0aW9uUGFzcyBGIGlzIHRoZSBsYXN0IHVzZXIgb2YgTW9kdWxlUGFzcyBpbmZvIE0KKyAgLy8gdGhlbiB0aGUgRidzIG1hbmFnZXIsIG5vdCBGLCByZWNvcmRzIGl0c2VsZiBhcyBhIGxhc3QgdXNlciBvZiBNLgorICBTbWFsbFZlY3RvcjxQYXNzICosIDEyPiBUcmFuc2Zlckxhc3RVc2VzOworCisgIGlmICghUHJvY2Vzc0FuYWx5c2lzKSB7CisgICAgLy8gQWRkIHBhc3MKKyAgICBQYXNzVmVjdG9yLnB1c2hfYmFjayhQKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBBdCB0aGUgbW9tZW50LCB0aGlzIHBhc3MgaXMgdGhlIGxhc3QgdXNlciBvZiBhbGwgcmVxdWlyZWQgcGFzc2VzLgorICBTbWFsbFZlY3RvcjxQYXNzICosIDEyPiBMYXN0VXNlczsKKyAgU21hbGxWZWN0b3I8UGFzcyAqLCA4PiBSZXF1aXJlZFBhc3NlczsKKyAgU21hbGxWZWN0b3I8QW5hbHlzaXNJRCwgOD4gUmVxQW5hbHlzaXNOb3RBdmFpbGFibGU7CisKKyAgdW5zaWduZWQgUERlcHRoID0gdGhpcy0+Z2V0RGVwdGgoKTsKKworICBjb2xsZWN0UmVxdWlyZWRBbmFseXNpcyhSZXF1aXJlZFBhc3NlcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcUFuYWx5c2lzTm90QXZhaWxhYmxlLCBQKTsKKyAgZm9yIChTbWFsbFZlY3RvcjxQYXNzICosIDg+OjppdGVyYXRvciBJID0gUmVxdWlyZWRQYXNzZXMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBSZXF1aXJlZFBhc3Nlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBQYXNzICpQUmVxdWlyZWQgPSAqSTsKKyAgICB1bnNpZ25lZCBSRGVwdGggPSAwOworCisgICAgYXNzZXJ0KFBSZXF1aXJlZC0+Z2V0UmVzb2x2ZXIoKSAmJiAiQW5hbHlzaXMgUmVzb2x2ZXIgaXMgbm90IHNldCIpOworICAgIFBNRGF0YU1hbmFnZXIgJkRNID0gUFJlcXVpcmVkLT5nZXRSZXNvbHZlcigpLT5nZXRQTURhdGFNYW5hZ2VyKCk7CisgICAgUkRlcHRoID0gRE0uZ2V0RGVwdGgoKTsKKworICAgIGlmIChQRGVwdGggPT0gUkRlcHRoKQorICAgICAgTGFzdFVzZXMucHVzaF9iYWNrKFBSZXF1aXJlZCk7CisgICAgZWxzZSBpZiAoUERlcHRoID4gUkRlcHRoKSB7CisgICAgICAvLyBMZXQgdGhlIHBhcmVudCBjbGFpbSByZXNwb25zaWJpbGl0eSBvZiBsYXN0IHVzZQorICAgICAgVHJhbnNmZXJMYXN0VXNlcy5wdXNoX2JhY2soUFJlcXVpcmVkKTsKKyAgICAgIC8vIEtlZXAgdHJhY2sgb2YgaGlnaGVyIGxldmVsIGFuYWx5c2lzIHVzZWQgYnkgdGhpcyBtYW5hZ2VyLgorICAgICAgSGlnaGVyTGV2ZWxBbmFseXNpcy5wdXNoX2JhY2soUFJlcXVpcmVkKTsKKyAgICB9IGVsc2UgCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmFibGUgdG8gYWNjb21vZGF0ZSBSZXF1aXJlZCBQYXNzIik7CisgIH0KKworICAvLyBTZXQgUCBhcyBQJ3MgbGFzdCB1c2VyIHVudGlsIHNvbWVvbmUgc3RhcnRzIHVzaW5nIFAuCisgIC8vIEhvd2V2ZXIsIGlmIFAgaXMgYSBQYXNzIE1hbmFnZXIgdGhlbiBpdCBkb2VzIG5vdCBuZWVkCisgIC8vIHRvIHJlY29yZCBpdHMgbGFzdCB1c2VyLgorICBpZiAoUC0+Z2V0QXNQTURhdGFNYW5hZ2VyKCkgPT0gMCkKKyAgICBMYXN0VXNlcy5wdXNoX2JhY2soUCk7CisgIFRQTS0+c2V0TGFzdFVzZXIoTGFzdFVzZXMsIFApOworCisgIGlmICghVHJhbnNmZXJMYXN0VXNlcy5lbXB0eSgpKSB7CisgICAgUGFzcyAqTXlfUE0gPSBnZXRBc1Bhc3MoKTsKKyAgICBUUE0tPnNldExhc3RVc2VyKFRyYW5zZmVyTGFzdFVzZXMsIE15X1BNKTsKKyAgICBUcmFuc2Zlckxhc3RVc2VzLmNsZWFyKCk7CisgIH0KKworICAvLyBOb3csIHRha2UgY2FyZSBvZiByZXF1aXJlZCBhbmFseXNpc2VzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUuCisgIGZvciAoU21hbGxWZWN0b3I8QW5hbHlzaXNJRCwgOD46Oml0ZXJhdG9yIAorICAgICAgICAgSSA9IFJlcUFuYWx5c2lzTm90QXZhaWxhYmxlLmJlZ2luKCksIAorICAgICAgICAgRSA9IFJlcUFuYWx5c2lzTm90QXZhaWxhYmxlLmVuZCgpIDtJICE9IEU7ICsrSSkgeworICAgIGNvbnN0IFBhc3NJbmZvICpQSSA9IFBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCktPmdldFBhc3NJbmZvKCpJKTsKKyAgICBQYXNzICpBbmFseXNpc1Bhc3MgPSBQSS0+Y3JlYXRlUGFzcygpOworICAgIHRoaXMtPmFkZExvd2VyTGV2ZWxSZXF1aXJlZFBhc3MoUCwgQW5hbHlzaXNQYXNzKTsKKyAgfQorCisgIC8vIFRha2UgYSBub3RlIG9mIGFuYWx5c2lzIHJlcXVpcmVkIGFuZCBtYWRlIGF2YWlsYWJsZSBieSB0aGlzIHBhc3MuCisgIC8vIFJlbW92ZSB0aGUgYW5hbHlzaXMgbm90IHByZXNlcnZlZCBieSB0aGlzIHBhc3MKKyAgcmVtb3ZlTm90UHJlc2VydmVkQW5hbHlzaXMoUCk7CisgIHJlY29yZEF2YWlsYWJsZUFuYWx5c2lzKFApOworCisgIC8vIEFkZCBwYXNzCisgIFBhc3NWZWN0b3IucHVzaF9iYWNrKFApOworfQorCisKKy8vLyBQb3B1bGF0ZSBSUCB3aXRoIGFuYWx5c2lzIHBhc3MgdGhhdCBhcmUgcmVxdWlyZWQgYnkKKy8vLyBwYXNzIFAgYW5kIGFyZSBhdmFpbGFibGUuIFBvcHVsYXRlIFJQX05vdEF2YWlsIHdpdGggYW5hbHlzaXMKKy8vLyBwYXNzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHBhc3MgUCBidXQgYXJlIG5vdCBhdmFpbGFibGUuCit2b2lkIFBNRGF0YU1hbmFnZXI6OmNvbGxlY3RSZXF1aXJlZEFuYWx5c2lzKFNtYWxsVmVjdG9yPFBhc3MgKiwgOD4mUlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxBbmFseXNpc0lELCA4PiAmUlBfTm90QXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3MgKlApIHsKKyAgQW5hbHlzaXNVc2FnZSAqQW5Vc2FnZSA9IFRQTS0+ZmluZEFuYWx5c2lzVXNhZ2UoUCk7CisgIGNvbnN0IEFuYWx5c2lzVXNhZ2U6OlZlY3RvclR5cGUgJlJlcXVpcmVkU2V0ID0gQW5Vc2FnZS0+Z2V0UmVxdWlyZWRTZXQoKTsKKyAgZm9yIChBbmFseXNpc1VzYWdlOjpWZWN0b3JUeXBlOjpjb25zdF9pdGVyYXRvciAKKyAgICAgICAgIEkgPSBSZXF1aXJlZFNldC5iZWdpbigpLCBFID0gUmVxdWlyZWRTZXQuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKFBhc3MgKkFuYWx5c2lzUGFzcyA9IGZpbmRBbmFseXNpc1Bhc3MoKkksIHRydWUpKQorICAgICAgUlAucHVzaF9iYWNrKEFuYWx5c2lzUGFzcyk7ICAgCisgICAgZWxzZQorICAgICAgUlBfTm90QXZhaWwucHVzaF9iYWNrKCpJKTsKKyAgfQorCisgIGNvbnN0IEFuYWx5c2lzVXNhZ2U6OlZlY3RvclR5cGUgJklEcyA9IEFuVXNhZ2UtPmdldFJlcXVpcmVkVHJhbnNpdGl2ZVNldCgpOworICBmb3IgKEFuYWx5c2lzVXNhZ2U6OlZlY3RvclR5cGU6OmNvbnN0X2l0ZXJhdG9yIEkgPSBJRHMuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBJRHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKFBhc3MgKkFuYWx5c2lzUGFzcyA9IGZpbmRBbmFseXNpc1Bhc3MoKkksIHRydWUpKQorICAgICAgUlAucHVzaF9iYWNrKEFuYWx5c2lzUGFzcyk7ICAgCisgICAgZWxzZQorICAgICAgUlBfTm90QXZhaWwucHVzaF9iYWNrKCpJKTsKKyAgfQorfQorCisvLyBBbGwgUmVxdWlyZWQgYW5hbHlzZXMgc2hvdWxkIGJlIGF2YWlsYWJsZSB0byB0aGUgcGFzcyBhcyBpdCBydW5zISAgSGVyZQorLy8gd2UgZmlsbCBpbiB0aGUgQW5hbHlzaXNJbXBscyBtZW1iZXIgb2YgdGhlIHBhc3Mgc28gdGhhdCBpdCBjYW4KKy8vIHN1Y2Nlc3NmdWxseSB1c2UgdGhlIGdldEFuYWx5c2lzKCkgbWV0aG9kIHRvIHJldHJpZXZlIHRoZQorLy8gaW1wbGVtZW50YXRpb25zIGl0IG5lZWRzLgorLy8KK3ZvaWQgUE1EYXRhTWFuYWdlcjo6aW5pdGlhbGl6ZUFuYWx5c2lzSW1wbChQYXNzICpQKSB7CisgIEFuYWx5c2lzVXNhZ2UgKkFuVXNhZ2UgPSBUUE0tPmZpbmRBbmFseXNpc1VzYWdlKFApOworCisgIGZvciAoQW5hbHlzaXNVc2FnZTo6VmVjdG9yVHlwZTo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIEkgPSBBblVzYWdlLT5nZXRSZXF1aXJlZFNldCgpLmJlZ2luKCksCisgICAgICAgICBFID0gQW5Vc2FnZS0+Z2V0UmVxdWlyZWRTZXQoKS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBQYXNzICpJbXBsID0gZmluZEFuYWx5c2lzUGFzcygqSSwgdHJ1ZSk7CisgICAgaWYgKEltcGwgPT0gMCkKKyAgICAgIC8vIFRoaXMgbWF5IGJlIGFuYWx5c2lzIHBhc3MgdGhhdCBpcyBpbml0aWFsaXplZCBvbiB0aGUgZmx5LgorICAgICAgLy8gSWYgdGhhdCBpcyBub3QgdGhlIGNhc2UgdGhlbiBpdCB3aWxsIHJhaXNlIGFuIGFzc2VydCB3aGVuIGl0IGlzIHVzZWQuCisgICAgICBjb250aW51ZTsKKyAgICBBbmFseXNpc1Jlc29sdmVyICpBUiA9IFAtPmdldFJlc29sdmVyKCk7CisgICAgYXNzZXJ0KEFSICYmICJBbmFseXNpcyBSZXNvbHZlciBpcyBub3Qgc2V0Iik7CisgICAgQVItPmFkZEFuYWx5c2lzSW1wbHNQYWlyKCpJLCBJbXBsKTsKKyAgfQorfQorCisvLy8gRmluZCB0aGUgcGFzcyB0aGF0IGltcGxlbWVudHMgQW5hbHlzaXMgQUlELiBJZiBkZXNpcmVkIHBhc3MgaXMgbm90IGZvdW5kCisvLy8gdGhlbiByZXR1cm4gTlVMTC4KK1Bhc3MgKlBNRGF0YU1hbmFnZXI6OmZpbmRBbmFseXNpc1Bhc3MoQW5hbHlzaXNJRCBBSUQsIGJvb2wgU2VhcmNoUGFyZW50KSB7CisKKyAgLy8gQ2hlY2sgaWYgQXZhaWxhYmxlQW5hbHlzaXMgbWFwIGhhcyBvbmUgZW50cnkuCisgIHN0ZDo6bWFwPEFuYWx5c2lzSUQsIFBhc3MqPjo6Y29uc3RfaXRlcmF0b3IgSSA9ICBBdmFpbGFibGVBbmFseXNpcy5maW5kKEFJRCk7CisKKyAgaWYgKEkgIT0gQXZhaWxhYmxlQW5hbHlzaXMuZW5kKCkpCisgICAgcmV0dXJuIEktPnNlY29uZDsKKworICAvLyBTZWFyY2ggUGFyZW50cyB0aHJvdWdoIFRvcExldmVsTWFuYWdlcgorICBpZiAoU2VhcmNoUGFyZW50KQorICAgIHJldHVybiBUUE0tPmZpbmRBbmFseXNpc1Bhc3MoQUlEKTsKKyAgCisgIHJldHVybiBOVUxMOworfQorCisvLyBQcmludCBsaXN0IG9mIHBhc3NlcyB0aGF0IGFyZSBsYXN0IHVzZWQgYnkgUC4KK3ZvaWQgUE1EYXRhTWFuYWdlcjo6ZHVtcExhc3RVc2VzKFBhc3MgKlAsIHVuc2lnbmVkIE9mZnNldCkgY29uc3R7CisKKyAgU21hbGxWZWN0b3I8UGFzcyAqLCAxMj4gTFVzZXM7CisKKyAgLy8gSWYgdGhpcyBpcyBhIG9uIHRoZSBmbHkgbWFuYWdlciB0aGVuIGl0IGRvZXMgbm90IGhhdmUgVFBNLgorICBpZiAoIVRQTSkKKyAgICByZXR1cm47CisKKyAgVFBNLT5jb2xsZWN0TGFzdFVzZXMoTFVzZXMsIFApOworICAKKyAgZm9yIChTbWFsbFZlY3RvcjxQYXNzICosIDEyPjo6aXRlcmF0b3IgSSA9IExVc2VzLmJlZ2luKCksCisgICAgICAgICBFID0gTFVzZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgbGx2bTo6ZGJncygpIDw8ICItLSIgPDwgc3RkOjpzdHJpbmcoT2Zmc2V0KjIsICcgJyk7CisgICAgKCpJKS0+ZHVtcFBhc3NTdHJ1Y3R1cmUoMCk7CisgIH0KK30KKwordm9pZCBQTURhdGFNYW5hZ2VyOjpkdW1wUGFzc0FyZ3VtZW50cygpIGNvbnN0IHsKKyAgZm9yIChTbWFsbFZlY3RvcjxQYXNzICosIDg+Ojpjb25zdF9pdGVyYXRvciBJID0gUGFzc1ZlY3Rvci5iZWdpbigpLAorICAgICAgICBFID0gUGFzc1ZlY3Rvci5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoUE1EYXRhTWFuYWdlciAqUE1EID0gKCpJKS0+Z2V0QXNQTURhdGFNYW5hZ2VyKCkpCisgICAgICBQTUQtPmR1bXBQYXNzQXJndW1lbnRzKCk7CisgICAgZWxzZQorICAgICAgaWYgKGNvbnN0IFBhc3NJbmZvICpQSSA9CisgICAgICAgICAgICBQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpLT5nZXRQYXNzSW5mbygoKkkpLT5nZXRQYXNzSUQoKSkpCisgICAgICAgIGlmICghUEktPmlzQW5hbHlzaXNHcm91cCgpKQorICAgICAgICAgIGRiZ3MoKSA8PCAiIC0iIDw8IFBJLT5nZXRQYXNzQXJndW1lbnQoKTsKKyAgfQorfQorCit2b2lkIFBNRGF0YU1hbmFnZXI6OmR1bXBQYXNzSW5mbyhQYXNzICpQLCBlbnVtIFBhc3NEZWJ1Z2dpbmdTdHJpbmcgUzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFBhc3NEZWJ1Z2dpbmdTdHJpbmcgUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTXNnKSB7CisgIGlmIChQYXNzRGVidWdnaW5nIDwgRXhlY3V0aW9ucykKKyAgICByZXR1cm47CisgIGRiZ3MoKSA8PCAodm9pZCopdGhpcyA8PCBzdGQ6OnN0cmluZyhnZXREZXB0aCgpKjIrMSwgJyAnKTsKKyAgc3dpdGNoIChTMSkgeworICBjYXNlIEVYRUNVVElPTl9NU0c6CisgICAgZGJncygpIDw8ICJFeGVjdXRpbmcgUGFzcyAnIiA8PCBQLT5nZXRQYXNzTmFtZSgpOworICAgIGJyZWFrOworICBjYXNlIE1PRElGSUNBVElPTl9NU0c6CisgICAgZGJncygpIDw8ICJNYWRlIE1vZGlmaWNhdGlvbiAnIiA8PCBQLT5nZXRQYXNzTmFtZSgpOworICAgIGJyZWFrOworICBjYXNlIEZSRUVJTkdfTVNHOgorICAgIGRiZ3MoKSA8PCAiIEZyZWVpbmcgUGFzcyAnIiA8PCBQLT5nZXRQYXNzTmFtZSgpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIHN3aXRjaCAoUzIpIHsKKyAgY2FzZSBPTl9CQVNJQ0JMT0NLX01TRzoKKyAgICBkYmdzKCkgPDwgIicgb24gQmFzaWNCbG9jayAnIiA8PCBNc2cgPDwgIicuLi5cbiI7CisgICAgYnJlYWs7CisgIGNhc2UgT05fRlVOQ1RJT05fTVNHOgorICAgIGRiZ3MoKSA8PCAiJyBvbiBGdW5jdGlvbiAnIiA8PCBNc2cgPDwgIicuLi5cbiI7CisgICAgYnJlYWs7CisgIGNhc2UgT05fTU9EVUxFX01TRzoKKyAgICBkYmdzKCkgPDwgIicgb24gTW9kdWxlICciICA8PCBNc2cgPDwgIicuLi5cbiI7CisgICAgYnJlYWs7CisgIGNhc2UgT05fTE9PUF9NU0c6CisgICAgZGJncygpIDw8ICInIG9uIExvb3AgJyIgPDwgTXNnIDw8ICInLi4uXG4iOworICAgIGJyZWFrOworICBjYXNlIE9OX0NHX01TRzoKKyAgICBkYmdzKCkgPDwgIicgb24gQ2FsbCBHcmFwaCBOb2RlcyAnIiA8PCBNc2cgPDwgIicuLi5cbiI7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBQTURhdGFNYW5hZ2VyOjpkdW1wUmVxdWlyZWRTZXQoY29uc3QgUGFzcyAqUCkgY29uc3QgeworICBpZiAoUGFzc0RlYnVnZ2luZyA8IERldGFpbHMpCisgICAgcmV0dXJuOworICAgIAorICBBbmFseXNpc1VzYWdlIGFuYWx5c2lzVXNhZ2U7CisgIFAtPmdldEFuYWx5c2lzVXNhZ2UoYW5hbHlzaXNVc2FnZSk7CisgIGR1bXBBbmFseXNpc1VzYWdlKCJSZXF1aXJlZCIsIFAsIGFuYWx5c2lzVXNhZ2UuZ2V0UmVxdWlyZWRTZXQoKSk7Cit9CisKK3ZvaWQgUE1EYXRhTWFuYWdlcjo6ZHVtcFByZXNlcnZlZFNldChjb25zdCBQYXNzICpQKSBjb25zdCB7CisgIGlmIChQYXNzRGVidWdnaW5nIDwgRGV0YWlscykKKyAgICByZXR1cm47CisgICAgCisgIEFuYWx5c2lzVXNhZ2UgYW5hbHlzaXNVc2FnZTsKKyAgUC0+Z2V0QW5hbHlzaXNVc2FnZShhbmFseXNpc1VzYWdlKTsKKyAgZHVtcEFuYWx5c2lzVXNhZ2UoIlByZXNlcnZlZCIsIFAsIGFuYWx5c2lzVXNhZ2UuZ2V0UHJlc2VydmVkU2V0KCkpOworfQorCit2b2lkIFBNRGF0YU1hbmFnZXI6OmR1bXBBbmFseXNpc1VzYWdlKFN0cmluZ1JlZiBNc2csIGNvbnN0IFBhc3MgKlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuYWx5c2lzVXNhZ2U6OlZlY3RvclR5cGUgJlNldCkgY29uc3QgeworICBhc3NlcnQoUGFzc0RlYnVnZ2luZyA+PSBEZXRhaWxzKTsKKyAgaWYgKFNldC5lbXB0eSgpKQorICAgIHJldHVybjsKKyAgZGJncygpIDw8ICh2b2lkKilQIDw8IHN0ZDo6c3RyaW5nKGdldERlcHRoKCkqMiszLCAnICcpIDw8IE1zZyA8PCAiIEFuYWx5c2VzOiI7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gU2V0LnNpemUoKTsgKytpKSB7CisgICAgaWYgKGkpIGRiZ3MoKSA8PCAnLCc7CisgICAgY29uc3QgUGFzc0luZm8gKlBJbmYgPSBQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpLT5nZXRQYXNzSW5mbyhTZXRbaV0pOworICAgIGRiZ3MoKSA8PCAnICcgPDwgUEluZi0+Z2V0UGFzc05hbWUoKTsKKyAgfQorICBkYmdzKCkgPDwgJ1xuJzsKK30KKworLy8vIEFkZCBSZXF1aXJlZFBhc3MgaW50byBsaXN0IG9mIGxvd2VyIGxldmVsIHBhc3NlcyByZXF1aXJlZCBieSBwYXNzIFAuCisvLy8gUmVxdWlyZWRQYXNzIGlzIHJ1biBvbiB0aGUgZmx5IGJ5IFBhc3MgTWFuYWdlciB3aGVuIFAgcmVxdWVzdHMgaXQKKy8vLyB0aHJvdWdoIGdldEFuYWx5c2lzIGludGVyZmFjZS4KKy8vLyBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHNwZWNpZmljIHBhc3MgbWFuYWdlci4KK3ZvaWQgUE1EYXRhTWFuYWdlcjo6YWRkTG93ZXJMZXZlbFJlcXVpcmVkUGFzcyhQYXNzICpQLCBQYXNzICpSZXF1aXJlZFBhc3MpIHsKKyAgaWYgKFRQTSkgeworICAgIFRQTS0+ZHVtcEFyZ3VtZW50cygpOworICAgIFRQTS0+ZHVtcFBhc3NlcygpOworICB9CisKKyAgLy8gTW9kdWxlIExldmVsIHBhc3MgbWF5IHJlcXVpcmVkIEZ1bmN0aW9uIExldmVsIGFuYWx5c2lzIGluZm8gCisgIC8vIChlLmcuIGRvbWluYXRvciBpbmZvKS4gUGFzcyBtYW5hZ2VyIHVzZXMgb24gdGhlIGZseSBmdW5jdGlvbiBwYXNzIG1hbmFnZXIgCisgIC8vIHRvIHByb3ZpZGUgdGhpcyBvbiBkZW1hbmQuIEluIHRoYXQgY2FzZSwgaW4gUGFzcyBtYW5hZ2VyIHRlcm1pbm9sb2d5LCAKKyAgLy8gbW9kdWxlIGxldmVsIHBhc3MgaXMgcmVxdWlyaW5nIGxvd2VyIGxldmVsIGFuYWx5c2lzIGluZm8gbWFuYWdlZCBieQorICAvLyBsb3dlciBsZXZlbCBwYXNzIG1hbmFnZXIuCisKKyAgLy8gV2hlbiBQYXNzIG1hbmFnZXIgaXMgbm90IGFibGUgdG8gb3JkZXIgcmVxdWlyZWQgYW5hbHlzaXMgaW5mbywgUGFzcyBtYW5hZ2VyCisgIC8vIGNoZWNrcyB3aGV0aGVyIGFueSBsb3dlciBsZXZlbCBtYW5hZ2VyIHdpbGwgYmUgYWJsZSB0byBwcm92aWRlIHRoaXMgCisgIC8vIGFuYWx5c2lzIGluZm8gb24gZGVtYW5kIG9yIG5vdC4KKyNpZm5kZWYgTkRFQlVHCisgIGRiZ3MoKSA8PCAiVW5hYmxlIHRvIHNjaGVkdWxlICciIDw8IFJlcXVpcmVkUGFzcy0+Z2V0UGFzc05hbWUoKTsKKyAgZGJncygpIDw8ICInIHJlcXVpcmVkIGJ5ICciIDw8IFAtPmdldFBhc3NOYW1lKCkgPDwgIidcbiI7CisjZW5kaWYKKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5hYmxlIHRvIHNjaGVkdWxlIHBhc3MiKTsKK30KKworUGFzcyAqUE1EYXRhTWFuYWdlcjo6Z2V0T25UaGVGbHlQYXNzKFBhc3MgKlAsIEFuYWx5c2lzSUQgUEksIEZ1bmN0aW9uICZGKSB7CisgIGFzc2VydCgwICYmICJVbmFibGUgdG8gZmluZCBvbiB0aGUgZmx5IHBhc3MiKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIERlc3RydWN0b3IKK1BNRGF0YU1hbmFnZXI6On5QTURhdGFNYW5hZ2VyKCkgeworICBmb3IgKFNtYWxsVmVjdG9yPFBhc3MgKiwgOD46Oml0ZXJhdG9yIEkgPSBQYXNzVmVjdG9yLmJlZ2luKCksCisgICAgICAgICBFID0gUGFzc1ZlY3Rvci5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgZGVsZXRlICpJOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTk9URTogSXMgdGhpcyB0aGUgcmlnaHQgcGxhY2UgdG8gZGVmaW5lIHRoaXMgbWV0aG9kID8KKy8vIGdldEFuYWx5c2lzSWZBdmFpbGFibGUgLSBSZXR1cm4gYW5hbHlzaXMgcmVzdWx0IG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC4KK1Bhc3MgKkFuYWx5c2lzUmVzb2x2ZXI6OmdldEFuYWx5c2lzSWZBdmFpbGFibGUoQW5hbHlzaXNJRCBJRCwgYm9vbCBkaXIpIGNvbnN0IHsKKyAgcmV0dXJuIFBNLmZpbmRBbmFseXNpc1Bhc3MoSUQsIGRpcik7Cit9CisKK1Bhc3MgKkFuYWx5c2lzUmVzb2x2ZXI6OmZpbmRJbXBsUGFzcyhQYXNzICpQLCBBbmFseXNpc0lEIEFuYWx5c2lzUEksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICZGKSB7CisgIHJldHVybiBQTS5nZXRPblRoZUZseVBhc3MoUCwgQW5hbHlzaXNQSSwgRik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCQlBhc3NNYW5hZ2VyIGltcGxlbWVudGF0aW9uCisKKy8vLyBFeGVjdXRlIGFsbCBvZiB0aGUgcGFzc2VzIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIGJ5IGludm9raW5nIAorLy8vIHJ1bk9uQmFzaWNCbG9jayBtZXRob2QuICBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgYW55IG9mIHRoZSBwYXNzZXMgbW9kaWZpZXMgCisvLy8gdGhlIGZ1bmN0aW9uLCBhbmQgaWYgc28sIHJldHVybiB0cnVlLgorYm9vbCBCQlBhc3NNYW5hZ2VyOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgIGlmIChGLmlzRGVjbGFyYXRpb24oKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBDaGFuZ2VkID0gZG9Jbml0aWFsaXphdGlvbihGKTsKKworICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBJID0gRi5iZWdpbigpLCBFID0gRi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpIHsKKyAgICAgIEJhc2ljQmxvY2tQYXNzICpCUCA9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgICAgYm9vbCBMb2NhbENoYW5nZWQgPSBmYWxzZTsKKworICAgICAgZHVtcFBhc3NJbmZvKEJQLCBFWEVDVVRJT05fTVNHLCBPTl9CQVNJQ0JMT0NLX01TRywgSS0+Z2V0TmFtZSgpKTsKKyAgICAgIGR1bXBSZXF1aXJlZFNldChCUCk7CisKKyAgICAgIGluaXRpYWxpemVBbmFseXNpc0ltcGwoQlApOworCisgICAgICB7CisgICAgICAgIC8vIElmIHRoZSBwYXNzIGNyYXNoZXMsIHJlbWVtYmVyIHRoaXMuCisgICAgICAgIFBhc3NNYW5hZ2VyUHJldHR5U3RhY2tFbnRyeSBYKEJQLCAqSSk7CisgICAgICAgIFRpbWVSZWdpb24gUGFzc1RpbWVyKGdldFBhc3NUaW1lcihCUCkpOworCisgICAgICAgIExvY2FsQ2hhbmdlZCB8PSBCUC0+cnVuT25CYXNpY0Jsb2NrKCpJKTsKKyAgICAgIH0KKworICAgICAgQ2hhbmdlZCB8PSBMb2NhbENoYW5nZWQ7CisgICAgICBpZiAoTG9jYWxDaGFuZ2VkKSAKKyAgICAgICAgZHVtcFBhc3NJbmZvKEJQLCBNT0RJRklDQVRJT05fTVNHLCBPTl9CQVNJQ0JMT0NLX01TRywKKyAgICAgICAgICAgICAgICAgICAgIEktPmdldE5hbWUoKSk7CisgICAgICBkdW1wUHJlc2VydmVkU2V0KEJQKTsKKworICAgICAgdmVyaWZ5UHJlc2VydmVkQW5hbHlzaXMoQlApOworICAgICAgcmVtb3ZlTm90UHJlc2VydmVkQW5hbHlzaXMoQlApOworICAgICAgcmVjb3JkQXZhaWxhYmxlQW5hbHlzaXMoQlApOworICAgICAgcmVtb3ZlRGVhZFBhc3NlcyhCUCwgSS0+Z2V0TmFtZSgpLCBPTl9CQVNJQ0JMT0NLX01TRyk7CisgICAgfQorCisgIHJldHVybiBkb0ZpbmFsaXphdGlvbihGKSB8fCBDaGFuZ2VkOworfQorCisvLyBJbXBsZW1lbnQgZG9Jbml0aWFsaXphdGlvbiBhbmQgZG9GaW5hbGl6YXRpb24KK2Jvb2wgQkJQYXNzTWFuYWdlcjo6ZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJk0pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpCisgICAgQ2hhbmdlZCB8PSBnZXRDb250YWluZWRQYXNzKEluZGV4KS0+ZG9Jbml0aWFsaXphdGlvbihNKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworYm9vbCBCQlBhc3NNYW5hZ2VyOjpkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpCisgICAgQ2hhbmdlZCB8PSBnZXRDb250YWluZWRQYXNzKEluZGV4KS0+ZG9GaW5hbGl6YXRpb24oTSk7CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2Jvb2wgQkJQYXNzTWFuYWdlcjo6ZG9Jbml0aWFsaXphdGlvbihGdW5jdGlvbiAmRikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRQYXNzZXMoKTsgKytJbmRleCkgeworICAgIEJhc2ljQmxvY2tQYXNzICpCUCA9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgIENoYW5nZWQgfD0gQlAtPmRvSW5pdGlhbGl6YXRpb24oRik7CisgIH0KKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworYm9vbCBCQlBhc3NNYW5hZ2VyOjpkb0ZpbmFsaXphdGlvbihGdW5jdGlvbiAmRikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRQYXNzZXMoKTsgKytJbmRleCkgeworICAgIEJhc2ljQmxvY2tQYXNzICpCUCA9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgIENoYW5nZWQgfD0gQlAtPmRvRmluYWxpemF0aW9uKEYpOworICB9CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZ1bmN0aW9uUGFzc01hbmFnZXIgaW1wbGVtZW50YXRpb24KKworLy8vIENyZWF0ZSBuZXcgRnVuY3Rpb24gcGFzcyBtYW5hZ2VyCitGdW5jdGlvblBhc3NNYW5hZ2VyOjpGdW5jdGlvblBhc3NNYW5hZ2VyKE1vZHVsZSAqbSkgOiBNKG0pIHsKKyAgRlBNID0gbmV3IEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsKDApOworICAvLyBGUE0gaXMgdGhlIHRvcCBsZXZlbCBtYW5hZ2VyLgorICBGUE0tPnNldFRvcExldmVsTWFuYWdlcihGUE0pOworCisgIEFuYWx5c2lzUmVzb2x2ZXIgKkFSID0gbmV3IEFuYWx5c2lzUmVzb2x2ZXIoKkZQTSk7CisgIEZQTS0+c2V0UmVzb2x2ZXIoQVIpOworfQorCitGdW5jdGlvblBhc3NNYW5hZ2VyOjp+RnVuY3Rpb25QYXNzTWFuYWdlcigpIHsKKyAgZGVsZXRlIEZQTTsKK30KKworLy8vIGFkZEltcGwgLSBBZGQgYSBwYXNzIHRvIHRoZSBxdWV1ZSBvZiBwYXNzZXMgdG8gcnVuLCB3aXRob3V0CisvLy8gY2hlY2tpbmcgd2hldGhlciB0byBhZGQgYSBwcmludGVyIHBhc3MuCit2b2lkIEZ1bmN0aW9uUGFzc01hbmFnZXI6OmFkZEltcGwoUGFzcyAqUCkgeworICBGUE0tPmFkZChQKTsKK30KKworLy8vIGFkZCAtIEFkZCBhIHBhc3MgdG8gdGhlIHF1ZXVlIG9mIHBhc3NlcyB0byBydW4uICBUaGlzIHBhc3NlcworLy8vIG93bmVyc2hpcCBvZiB0aGUgUGFzcyB0byB0aGUgUGFzc01hbmFnZXIuICBXaGVuIHRoZQorLy8vIFBhc3NNYW5hZ2VyX1ggaXMgZGVzdHJveWVkLCB0aGUgcGFzcyB3aWxsIGJlIGRlc3Ryb3llZCBhcyB3ZWxsLCBzbworLy8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gZGVsZXRlIHRoZSBwYXNzLiAoVE9ETyBkZWxldGUgcGFzc2VzLikKKy8vLyBUaGlzIGltcGxpZXMgdGhhdCBhbGwgcGFzc2VzIE1VU1QgYmUgYWxsb2NhdGVkIHdpdGggJ25ldycuCit2b2lkIEZ1bmN0aW9uUGFzc01hbmFnZXI6OmFkZChQYXNzICpQKSB7IAorICAvLyBJZiB0aGlzIGlzIGEgbm90IGEgZnVuY3Rpb24gcGFzcywgZG9uJ3QgYWRkIGEgcHJpbnRlciBmb3IgaXQuCisgIGNvbnN0IHZvaWQgKlBhc3NJRCA9IFAtPmdldFBhc3NJRCgpOworICBpZiAoUC0+Z2V0UGFzc0tpbmQoKSA9PSBQVF9GdW5jdGlvbikKKyAgICBpZiAoU2hvdWxkUHJpbnRCZWZvcmVQYXNzKFBhc3NJRCkpCisgICAgICBhZGRJbXBsKFAtPmNyZWF0ZVByaW50ZXJQYXNzKGRiZ3MoKSwgc3RkOjpzdHJpbmcoIioqKiBJUiBEdW1wIEJlZm9yZSAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFAtPmdldFBhc3NOYW1lKCkgKyAiICoqKiIpKTsKKworICBhZGRJbXBsKFApOworCisgIGlmIChQLT5nZXRQYXNzS2luZCgpID09IFBUX0Z1bmN0aW9uKQorICAgIGlmIChTaG91bGRQcmludEFmdGVyUGFzcyhQYXNzSUQpKQorICAgICAgYWRkSW1wbChQLT5jcmVhdGVQcmludGVyUGFzcyhkYmdzKCksIHN0ZDo6c3RyaW5nKCIqKiogSVIgRHVtcCBBZnRlciAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFAtPmdldFBhc3NOYW1lKCkgKyAiICoqKiIpKTsKK30KKworLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwCisvLy8gdHJhY2sgb2Ygd2hldGhlciBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllcyB0aGUgZnVuY3Rpb24sIGFuZCBpZgorLy8vIHNvLCByZXR1cm4gdHJ1ZS4KKy8vLworYm9vbCBGdW5jdGlvblBhc3NNYW5hZ2VyOjpydW4oRnVuY3Rpb24gJkYpIHsKKyAgaWYgKEYuaXNNYXRlcmlhbGl6YWJsZSgpKSB7CisgICAgc3RkOjpzdHJpbmcgZXJyc3RyOworICAgIGlmIChGLk1hdGVyaWFsaXplKCZlcnJzdHIpKQorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJFcnJvciByZWFkaW5nIGJpdGNvZGUgZmlsZTogIiArIFR3aW5lKGVycnN0cikpOworICB9CisgIHJldHVybiBGUE0tPnJ1bihGKTsKK30KKworCisvLy8gZG9Jbml0aWFsaXphdGlvbiAtIFJ1biBhbGwgb2YgdGhlIGluaXRpYWxpemVycyBmb3IgdGhlIGZ1bmN0aW9uIHBhc3Nlcy4KKy8vLworYm9vbCBGdW5jdGlvblBhc3NNYW5hZ2VyOjpkb0luaXRpYWxpemF0aW9uKCkgeworICByZXR1cm4gRlBNLT5kb0luaXRpYWxpemF0aW9uKCpNKTsKK30KKworLy8vIGRvRmluYWxpemF0aW9uIC0gUnVuIGFsbCBvZiB0aGUgZmluYWxpemVycyBmb3IgdGhlIGZ1bmN0aW9uIHBhc3Nlcy4KKy8vLworYm9vbCBGdW5jdGlvblBhc3NNYW5hZ2VyOjpkb0ZpbmFsaXphdGlvbigpIHsKKyAgcmV0dXJuIEZQTS0+ZG9GaW5hbGl6YXRpb24oKk0pOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgaW1wbGVtZW50YXRpb24KKy8vCitib29sIEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsOjpkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBkdW1wQXJndW1lbnRzKCk7CisgIGR1bXBQYXNzZXMoKTsKKworICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRNYW5hZ2VycygpOyArK0luZGV4KQorICAgIENoYW5nZWQgfD0gZ2V0Q29udGFpbmVkTWFuYWdlcihJbmRleCktPmRvSW5pdGlhbGl6YXRpb24oTSk7CisKKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2Jvb2wgRnVuY3Rpb25QYXNzTWFuYWdlckltcGw6OmRvRmluYWxpemF0aW9uKE1vZHVsZSAmTSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRNYW5hZ2VycygpOyArK0luZGV4KQorICAgIENoYW5nZWQgfD0gZ2V0Q29udGFpbmVkTWFuYWdlcihJbmRleCktPmRvRmluYWxpemF0aW9uKE0pOworCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gY2xlYW51cCAtIEFmdGVyIHJ1bm5pbmcgYWxsIHBhc3NlcywgY2xlYW4gdXAgcGFzcyBtYW5hZ2VyIGNhY2hlLgordm9pZCBGUFBhc3NNYW5hZ2VyOjpjbGVhbnVwKCkgeworIGZvciAodW5zaWduZWQgSW5kZXggPSAwOyBJbmRleCA8IGdldE51bUNvbnRhaW5lZFBhc3NlcygpOyArK0luZGV4KSB7CisgICAgRnVuY3Rpb25QYXNzICpGUCA9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgIEFuYWx5c2lzUmVzb2x2ZXIgKkFSID0gRlAtPmdldFJlc29sdmVyKCk7CisgICAgYXNzZXJ0KEFSICYmICJBbmFseXNpcyBSZXNvbHZlciBpcyBub3Qgc2V0Iik7CisgICAgQVItPmNsZWFyQW5hbHlzaXNJbXBscygpOworIH0KK30KKwordm9pZCBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbDo6cmVsZWFzZU1lbW9yeU9uVGhlRmx5KCkgeworICBpZiAoIXdhc1J1bikKKyAgICByZXR1cm47CisgIGZvciAodW5zaWduZWQgSW5kZXggPSAwOyBJbmRleCA8IGdldE51bUNvbnRhaW5lZE1hbmFnZXJzKCk7ICsrSW5kZXgpIHsKKyAgICBGUFBhc3NNYW5hZ2VyICpGUFBNID0gZ2V0Q29udGFpbmVkTWFuYWdlcihJbmRleCk7CisgICAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgRlBQTS0+Z2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpIHsKKyAgICAgIEZQUE0tPmdldENvbnRhaW5lZFBhc3MoSW5kZXgpLT5yZWxlYXNlTWVtb3J5KCk7CisgICAgfQorICB9CisgIHdhc1J1biA9IGZhbHNlOworfQorCisvLyBFeGVjdXRlIGFsbCB0aGUgcGFzc2VzIG1hbmFnZWQgYnkgdGhpcyB0b3AgbGV2ZWwgbWFuYWdlci4KKy8vIFJldHVybiB0cnVlIGlmIGFueSBmdW5jdGlvbiBpcyBtb2RpZmllZCBieSBhIHBhc3MuCitib29sIEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsOjpydW4oRnVuY3Rpb24gJkYpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIFRpbWluZ0luZm86OmNyZWF0ZVRoZVRpbWVJbmZvKCk7CisKKyAgaW5pdGlhbGl6ZUFsbEFuYWx5c2lzSW5mbygpOworICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRNYW5hZ2VycygpOyArK0luZGV4KQorICAgIENoYW5nZWQgfD0gZ2V0Q29udGFpbmVkTWFuYWdlcihJbmRleCktPnJ1bk9uRnVuY3Rpb24oRik7CisKKyAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkTWFuYWdlcnMoKTsgKytJbmRleCkKKyAgICBnZXRDb250YWluZWRNYW5hZ2VyKEluZGV4KS0+Y2xlYW51cCgpOworCisgIHdhc1J1biA9IHRydWU7CisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRlBQYXNzTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorCitjaGFyIEZQUGFzc01hbmFnZXI6OklEID0gMDsKKy8vLyBQcmludCBwYXNzZXMgbWFuYWdlZCBieSB0aGlzIG1hbmFnZXIKK3ZvaWQgRlBQYXNzTWFuYWdlcjo6ZHVtcFBhc3NTdHJ1Y3R1cmUodW5zaWduZWQgT2Zmc2V0KSB7CisgIGxsdm06OmRiZ3MoKSA8PCBzdGQ6OnN0cmluZyhPZmZzZXQqMiwgJyAnKSA8PCAiRnVuY3Rpb25QYXNzIE1hbmFnZXJcbiI7CisgIGZvciAodW5zaWduZWQgSW5kZXggPSAwOyBJbmRleCA8IGdldE51bUNvbnRhaW5lZFBhc3NlcygpOyArK0luZGV4KSB7CisgICAgRnVuY3Rpb25QYXNzICpGUCA9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgIEZQLT5kdW1wUGFzc1N0cnVjdHVyZShPZmZzZXQgKyAxKTsKKyAgICBkdW1wTGFzdFVzZXMoRlAsIE9mZnNldCsxKTsKKyAgfQorfQorCisKKy8vLyBFeGVjdXRlIGFsbCBvZiB0aGUgcGFzc2VzIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIGJ5IGludm9raW5nIAorLy8vIHJ1bk9uRnVuY3Rpb24gbWV0aG9kLiAgS2VlcCB0cmFjayBvZiB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIAorLy8vIHRoZSBmdW5jdGlvbiwgYW5kIGlmIHNvLCByZXR1cm4gdHJ1ZS4KK2Jvb2wgRlBQYXNzTWFuYWdlcjo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgeworICBpZiAoRi5pc0RlY2xhcmF0aW9uKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIC8vIENvbGxlY3QgaW5oZXJpdGVkIGFuYWx5c2lzIGZyb20gTW9kdWxlIGxldmVsIHBhc3MgbWFuYWdlci4KKyAgcG9wdWxhdGVJbmhlcml0ZWRBbmFseXNpcyhUUE0tPmFjdGl2ZVN0YWNrKTsKKworICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRQYXNzZXMoKTsgKytJbmRleCkgeworICAgIEZ1bmN0aW9uUGFzcyAqRlAgPSBnZXRDb250YWluZWRQYXNzKEluZGV4KTsKKyAgICBib29sIExvY2FsQ2hhbmdlZCA9IGZhbHNlOworCisgICAgZHVtcFBhc3NJbmZvKEZQLCBFWEVDVVRJT05fTVNHLCBPTl9GVU5DVElPTl9NU0csIEYuZ2V0TmFtZSgpKTsKKyAgICBkdW1wUmVxdWlyZWRTZXQoRlApOworCisgICAgaW5pdGlhbGl6ZUFuYWx5c2lzSW1wbChGUCk7CisKKyAgICB7CisgICAgICBQYXNzTWFuYWdlclByZXR0eVN0YWNrRW50cnkgWChGUCwgRik7CisgICAgICBUaW1lUmVnaW9uIFBhc3NUaW1lcihnZXRQYXNzVGltZXIoRlApKTsKKworICAgICAgTG9jYWxDaGFuZ2VkIHw9IEZQLT5ydW5PbkZ1bmN0aW9uKEYpOworICAgIH0KKworICAgIENoYW5nZWQgfD0gTG9jYWxDaGFuZ2VkOworICAgIGlmIChMb2NhbENoYW5nZWQpCisgICAgICBkdW1wUGFzc0luZm8oRlAsIE1PRElGSUNBVElPTl9NU0csIE9OX0ZVTkNUSU9OX01TRywgRi5nZXROYW1lKCkpOworICAgIGR1bXBQcmVzZXJ2ZWRTZXQoRlApOworCisgICAgdmVyaWZ5UHJlc2VydmVkQW5hbHlzaXMoRlApOworICAgIHJlbW92ZU5vdFByZXNlcnZlZEFuYWx5c2lzKEZQKTsKKyAgICByZWNvcmRBdmFpbGFibGVBbmFseXNpcyhGUCk7CisgICAgcmVtb3ZlRGVhZFBhc3NlcyhGUCwgRi5nZXROYW1lKCksIE9OX0ZVTkNUSU9OX01TRyk7CisgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK2Jvb2wgRlBQYXNzTWFuYWdlcjo6cnVuT25Nb2R1bGUoTW9kdWxlICZNKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGRvSW5pdGlhbGl6YXRpb24oTSk7CisKKyAgZm9yIChNb2R1bGU6Oml0ZXJhdG9yIEkgPSBNLmJlZ2luKCksIEUgPSBNLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBydW5PbkZ1bmN0aW9uKCpJKTsKKworICByZXR1cm4gZG9GaW5hbGl6YXRpb24oTSkgfHwgQ2hhbmdlZDsKK30KKworYm9vbCBGUFBhc3NNYW5hZ2VyOjpkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRQYXNzZXMoKTsgKytJbmRleCkKKyAgICBDaGFuZ2VkIHw9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpLT5kb0luaXRpYWxpemF0aW9uKE0pOworCisgIHJldHVybiBDaGFuZ2VkOworfQorCitib29sIEZQUGFzc01hbmFnZXI6OmRvRmluYWxpemF0aW9uKE1vZHVsZSAmTSkgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRQYXNzZXMoKTsgKytJbmRleCkKKyAgICBDaGFuZ2VkIHw9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpLT5kb0ZpbmFsaXphdGlvbihNKTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1QUGFzc01hbmFnZXIgaW1wbGVtZW50YXRpb24KKworLy8vIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24gYnkgaW52b2tpbmcgCisvLy8gcnVuT25Nb2R1bGUgbWV0aG9kLiAgS2VlcCB0cmFjayBvZiB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIAorLy8vIHRoZSBtb2R1bGUsIGFuZCBpZiBzbywgcmV0dXJuIHRydWUuCitib29sCitNUFBhc3NNYW5hZ2VyOjpydW5Pbk1vZHVsZShNb2R1bGUgJk0pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgLy8gSW5pdGlhbGl6ZSBvbi10aGUtZmx5IHBhc3NlcworICBmb3IgKHN0ZDo6bWFwPFBhc3MgKiwgRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgKj46Oml0ZXJhdG9yCisgICAgICAgSSA9IE9uVGhlRmx5TWFuYWdlcnMuYmVnaW4oKSwgRSA9IE9uVGhlRmx5TWFuYWdlcnMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbCAqRlBQID0gSS0+c2Vjb25kOworICAgIENoYW5nZWQgfD0gRlBQLT5kb0luaXRpYWxpemF0aW9uKE0pOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBJbmRleCA9IDA7IEluZGV4IDwgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCk7ICsrSW5kZXgpIHsKKyAgICBNb2R1bGVQYXNzICpNUCA9IGdldENvbnRhaW5lZFBhc3MoSW5kZXgpOworICAgIGJvb2wgTG9jYWxDaGFuZ2VkID0gZmFsc2U7CisKKyAgICBkdW1wUGFzc0luZm8oTVAsIEVYRUNVVElPTl9NU0csIE9OX01PRFVMRV9NU0csIE0uZ2V0TW9kdWxlSWRlbnRpZmllcigpKTsKKyAgICBkdW1wUmVxdWlyZWRTZXQoTVApOworCisgICAgaW5pdGlhbGl6ZUFuYWx5c2lzSW1wbChNUCk7CisKKyAgICB7CisgICAgICBQYXNzTWFuYWdlclByZXR0eVN0YWNrRW50cnkgWChNUCwgTSk7CisgICAgICBUaW1lUmVnaW9uIFBhc3NUaW1lcihnZXRQYXNzVGltZXIoTVApKTsKKworICAgICAgTG9jYWxDaGFuZ2VkIHw9IE1QLT5ydW5Pbk1vZHVsZShNKTsKKyAgICB9CisKKyAgICBDaGFuZ2VkIHw9IExvY2FsQ2hhbmdlZDsKKyAgICBpZiAoTG9jYWxDaGFuZ2VkKQorICAgICAgZHVtcFBhc3NJbmZvKE1QLCBNT0RJRklDQVRJT05fTVNHLCBPTl9NT0RVTEVfTVNHLAorICAgICAgICAgICAgICAgICAgIE0uZ2V0TW9kdWxlSWRlbnRpZmllcigpKTsKKyAgICBkdW1wUHJlc2VydmVkU2V0KE1QKTsKKyAgICAKKyAgICB2ZXJpZnlQcmVzZXJ2ZWRBbmFseXNpcyhNUCk7CisgICAgcmVtb3ZlTm90UHJlc2VydmVkQW5hbHlzaXMoTVApOworICAgIHJlY29yZEF2YWlsYWJsZUFuYWx5c2lzKE1QKTsKKyAgICByZW1vdmVEZWFkUGFzc2VzKE1QLCBNLmdldE1vZHVsZUlkZW50aWZpZXIoKSwgT05fTU9EVUxFX01TRyk7CisgIH0KKworICAvLyBGaW5hbGl6ZSBvbi10aGUtZmx5IHBhc3NlcworICBmb3IgKHN0ZDo6bWFwPFBhc3MgKiwgRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgKj46Oml0ZXJhdG9yCisgICAgICAgSSA9IE9uVGhlRmx5TWFuYWdlcnMuYmVnaW4oKSwgRSA9IE9uVGhlRmx5TWFuYWdlcnMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbCAqRlBQID0gSS0+c2Vjb25kOworICAgIC8vIFdlIGRvbid0IGtub3cgd2hlbiBpcyB0aGUgbGFzdCB0aW1lIGFuIG9uLXRoZS1mbHkgcGFzcyBpcyBydW4sCisgICAgLy8gc28gd2UgbmVlZCB0byByZWxlYXNlTWVtb3J5IC8gZmluYWxpemUgaGVyZQorICAgIEZQUC0+cmVsZWFzZU1lbW9yeU9uVGhlRmx5KCk7CisgICAgQ2hhbmdlZCB8PSBGUFAtPmRvRmluYWxpemF0aW9uKE0pOworICB9CisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gQWRkIFJlcXVpcmVkUGFzcyBpbnRvIGxpc3Qgb2YgbG93ZXIgbGV2ZWwgcGFzc2VzIHJlcXVpcmVkIGJ5IHBhc3MgUC4KKy8vLyBSZXF1aXJlZFBhc3MgaXMgcnVuIG9uIHRoZSBmbHkgYnkgUGFzcyBNYW5hZ2VyIHdoZW4gUCByZXF1ZXN0cyBpdAorLy8vIHRocm91Z2ggZ2V0QW5hbHlzaXMgaW50ZXJmYWNlLgordm9pZCBNUFBhc3NNYW5hZ2VyOjphZGRMb3dlckxldmVsUmVxdWlyZWRQYXNzKFBhc3MgKlAsIFBhc3MgKlJlcXVpcmVkUGFzcykgeworICBhc3NlcnQoUC0+Z2V0UG90ZW50aWFsUGFzc01hbmFnZXJUeXBlKCkgPT0gUE1UX01vZHVsZVBhc3NNYW5hZ2VyICYmCisgICAgICAgICAiVW5hYmxlIHRvIGhhbmRsZSBQYXNzIHRoYXQgcmVxdWlyZXMgbG93ZXIgbGV2ZWwgQW5hbHlzaXMgcGFzcyIpOworICBhc3NlcnQoKFAtPmdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIDwgCisgICAgICAgICAgUmVxdWlyZWRQYXNzLT5nZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSkgJiYKKyAgICAgICAgICJVbmFibGUgdG8gaGFuZGxlIFBhc3MgdGhhdCByZXF1aXJlcyBsb3dlciBsZXZlbCBBbmFseXNpcyBwYXNzIik7CisKKyAgRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgKkZQUCA9IE9uVGhlRmx5TWFuYWdlcnNbUF07CisgIGlmICghRlBQKSB7CisgICAgRlBQID0gbmV3IEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsKDApOworICAgIC8vIEZQUCBpcyB0aGUgdG9wIGxldmVsIG1hbmFnZXIuCisgICAgRlBQLT5zZXRUb3BMZXZlbE1hbmFnZXIoRlBQKTsKKworICAgIE9uVGhlRmx5TWFuYWdlcnNbUF0gPSBGUFA7CisgIH0KKyAgRlBQLT5hZGQoUmVxdWlyZWRQYXNzKTsKKworICAvLyBSZWdpc3RlciBQIGFzIHRoZSBsYXN0IHVzZXIgb2YgUmVxdWlyZWRQYXNzLgorICBTbWFsbFZlY3RvcjxQYXNzICosIDEyPiBMVTsKKyAgTFUucHVzaF9iYWNrKFJlcXVpcmVkUGFzcyk7CisgIEZQUC0+c2V0TGFzdFVzZXIoTFUsICBQKTsKK30KKworLy8vIFJldHVybiBmdW5jdGlvbiBwYXNzIGNvcnJlc3BvbmRpbmcgdG8gUGFzc0luZm8gUEksIHRoYXQgaXMgCisvLy8gcmVxdWlyZWQgYnkgbW9kdWxlIHBhc3MgTVAuIEluc3RhbnRpYXRlIGFuYWx5c2lzIHBhc3MsIGJ5IHVzaW5nCisvLy8gaXRzIHJ1bk9uRnVuY3Rpb24oKSBmb3IgZnVuY3Rpb24gRi4KK1Bhc3MqIE1QUGFzc01hbmFnZXI6OmdldE9uVGhlRmx5UGFzcyhQYXNzICpNUCwgQW5hbHlzaXNJRCBQSSwgRnVuY3Rpb24gJkYpeworICBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbCAqRlBQID0gT25UaGVGbHlNYW5hZ2Vyc1tNUF07CisgIGFzc2VydChGUFAgJiYgIlVuYWJsZSB0byBmaW5kIG9uIHRoZSBmbHkgcGFzcyIpOworICAKKyAgRlBQLT5yZWxlYXNlTWVtb3J5T25UaGVGbHkoKTsKKyAgRlBQLT5ydW4oRik7CisgIHJldHVybiAoKFBNVG9wTGV2ZWxNYW5hZ2VyKilGUFApLT5maW5kQW5hbHlzaXNQYXNzKFBJKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFzc01hbmFnZXJJbXBsIGltcGxlbWVudGF0aW9uCisvLworLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisvLy8gd2hldGhlciBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllcyB0aGUgbW9kdWxlLCBhbmQgaWYgc28sIHJldHVybiB0cnVlLgorYm9vbCBQYXNzTWFuYWdlckltcGw6OnJ1bihNb2R1bGUgJk0pIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgIFRpbWluZ0luZm86OmNyZWF0ZVRoZVRpbWVJbmZvKCk7CisKKyAgZHVtcEFyZ3VtZW50cygpOworICBkdW1wUGFzc2VzKCk7CisKKyAgaW5pdGlhbGl6ZUFsbEFuYWx5c2lzSW5mbygpOworICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBnZXROdW1Db250YWluZWRNYW5hZ2VycygpOyArK0luZGV4KQorICAgIENoYW5nZWQgfD0gZ2V0Q29udGFpbmVkTWFuYWdlcihJbmRleCktPnJ1bk9uTW9kdWxlKE0pOworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhc3NNYW5hZ2VyIGltcGxlbWVudGF0aW9uCisKKy8vLyBDcmVhdGUgbmV3IHBhc3MgbWFuYWdlcgorUGFzc01hbmFnZXI6OlBhc3NNYW5hZ2VyKCkgeworICBQTSA9IG5ldyBQYXNzTWFuYWdlckltcGwoMCk7CisgIC8vIFBNIGlzIHRoZSB0b3AgbGV2ZWwgbWFuYWdlcgorICBQTS0+c2V0VG9wTGV2ZWxNYW5hZ2VyKFBNKTsKK30KKworUGFzc01hbmFnZXI6On5QYXNzTWFuYWdlcigpIHsKKyAgZGVsZXRlIFBNOworfQorCisvLy8gYWRkSW1wbCAtIEFkZCBhIHBhc3MgdG8gdGhlIHF1ZXVlIG9mIHBhc3NlcyB0byBydW4sIHdpdGhvdXQKKy8vLyBjaGVja2luZyB3aGV0aGVyIHRvIGFkZCBhIHByaW50ZXIgcGFzcy4KK3ZvaWQgUGFzc01hbmFnZXI6OmFkZEltcGwoUGFzcyAqUCkgeworICBQTS0+YWRkKFApOworfQorCisvLy8gYWRkIC0gQWRkIGEgcGFzcyB0byB0aGUgcXVldWUgb2YgcGFzc2VzIHRvIHJ1bi4gIFRoaXMgcGFzc2VzIG93bmVyc2hpcCBvZgorLy8vIHRoZSBQYXNzIHRvIHRoZSBQYXNzTWFuYWdlci4gIFdoZW4gdGhlIFBhc3NNYW5hZ2VyIGlzIGRlc3Ryb3llZCwgdGhlIHBhc3MKKy8vLyB3aWxsIGJlIGRlc3Ryb3llZCBhcyB3ZWxsLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGRlbGV0ZSB0aGUgcGFzcy4gIFRoaXMKKy8vLyBpbXBsaWVzIHRoYXQgYWxsIHBhc3NlcyBNVVNUIGJlIGFsbG9jYXRlZCB3aXRoICduZXcnLgordm9pZCBQYXNzTWFuYWdlcjo6YWRkKFBhc3MgKlApIHsKKyAgY29uc3Qgdm9pZCogUGFzc0lEID0gUC0+Z2V0UGFzc0lEKCk7CisgIGlmIChTaG91bGRQcmludEJlZm9yZVBhc3MoUGFzc0lEKSkKKyAgICBhZGRJbXBsKFAtPmNyZWF0ZVByaW50ZXJQYXNzKGRiZ3MoKSwgc3RkOjpzdHJpbmcoIioqKiBJUiBEdW1wIEJlZm9yZSAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQLT5nZXRQYXNzTmFtZSgpICsgIiAqKioiKSk7CisKKyAgYWRkSW1wbChQKTsKKworICBpZiAoU2hvdWxkUHJpbnRBZnRlclBhc3MoUGFzc0lEKSkKKyAgICBhZGRJbXBsKFAtPmNyZWF0ZVByaW50ZXJQYXNzKGRiZ3MoKSwgc3RkOjpzdHJpbmcoIioqKiBJUiBEdW1wIEFmdGVyICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFAtPmdldFBhc3NOYW1lKCkgKyAiICoqKiIpKTsKK30KKworLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisvLy8gd2hldGhlciBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllcyB0aGUgbW9kdWxlLCBhbmQgaWYgc28sIHJldHVybiB0cnVlLgorYm9vbCBQYXNzTWFuYWdlcjo6cnVuKE1vZHVsZSAmTSkgeworICByZXR1cm4gUE0tPnJ1bihNKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRpbWluZ0luZm8gQ2xhc3MgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZQorLy8gYW1vdW50IG9mIHRpbWUgZWFjaCBwYXNzIHRha2VzIHRvIGV4ZWN1dGUuICBUaGlzIG9ubHkgaGFwcGVucyB3aXRoCisvLyAtdGltZS1wYXNzZXMgaXMgZW5hYmxlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorLy8KK2Jvb2wgbGx2bTo6VGltZVBhc3Nlc0lzRW5hYmxlZCA9IGZhbHNlOworc3RhdGljIGNsOjpvcHQ8Ym9vbCx0cnVlPgorRW5hYmxlVGltaW5nKCJ0aW1lLXBhc3NlcyIsIGNsOjpsb2NhdGlvbihUaW1lUGFzc2VzSXNFbmFibGVkKSwKKyAgICAgICAgICAgIGNsOjpkZXNjKCJUaW1lIGVhY2ggcGFzcywgcHJpbnRpbmcgZWxhcHNlZCB0aW1lIGZvciBlYWNoIG9uIGV4aXQiKSk7CisKKy8vIGNyZWF0ZVRoZVRpbWVJbmZvIC0gVGhpcyBtZXRob2QgZWl0aGVyIGluaXRpYWxpemVzIHRoZSBUaGVUaW1lSW5mbyBwb2ludGVyIHRvCisvLyBhIG5vbiBudWxsIHZhbHVlIChpZiB0aGUgLXRpbWUtcGFzc2VzIG9wdGlvbiBpcyBlbmFibGVkKSBvciBpdCBsZWF2ZXMgaXQKKy8vIG51bGwuICBJdCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgordm9pZCBUaW1pbmdJbmZvOjpjcmVhdGVUaGVUaW1lSW5mbygpIHsKKyAgaWYgKCFUaW1lUGFzc2VzSXNFbmFibGVkIHx8IFRoZVRpbWVJbmZvKSByZXR1cm47CisKKyAgLy8gQ29uc3RydWN0ZWQgdGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQsIGlmZiAtdGltZS1wYXNzZXMgaXMgZW5hYmxlZC4KKyAgLy8gVGhpcyBndWFyYW50ZWVzIHRoYXQgdGhlIG9iamVjdCB3aWxsIGJlIGNvbnN0cnVjdGVkIGJlZm9yZSBzdGF0aWMgZ2xvYmFscywKKyAgLy8gdGh1cyBpdCB3aWxsIGJlIGRlc3Ryb3llZCBiZWZvcmUgdGhlbS4KKyAgc3RhdGljIE1hbmFnZWRTdGF0aWM8VGltaW5nSW5mbz4gVFRJOworICBUaGVUaW1lSW5mbyA9ICYqVFRJOworfQorCisvLy8gSWYgVGltaW5nSW5mbyBpcyBlbmFibGVkIHRoZW4gc3RhcnQgcGFzcyB0aW1lci4KK1RpbWVyICpsbHZtOjpnZXRQYXNzVGltZXIoUGFzcyAqUCkgeworICBpZiAoVGhlVGltZUluZm8pIAorICAgIHJldHVybiBUaGVUaW1lSW5mby0+Z2V0UGFzc1RpbWVyKFApOworICByZXR1cm4gMDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBNU3RhY2sgaW1wbGVtZW50YXRpb24KKy8vCisKKy8vIFBvcCBQYXNzIE1hbmFnZXIgZnJvbSB0aGUgc3RhY2sgYW5kIGNsZWFyIGl0cyBhbmFseXNpcyBpbmZvLgordm9pZCBQTVN0YWNrOjpwb3AoKSB7CisKKyAgUE1EYXRhTWFuYWdlciAqVG9wID0gdGhpcy0+dG9wKCk7CisgIFRvcC0+aW5pdGlhbGl6ZUFuYWx5c2lzSW5mbygpOworCisgIFMucG9wX2JhY2soKTsKK30KKworLy8gUHVzaCBQTSBvbiB0aGUgc3RhY2sgYW5kIHNldCBpdHMgdG9wIGxldmVsIG1hbmFnZXIuCit2b2lkIFBNU3RhY2s6OnB1c2goUE1EYXRhTWFuYWdlciAqUE0pIHsKKyAgYXNzZXJ0KFBNICYmICJVbmFibGUgdG8gcHVzaC4gUGFzcyBNYW5hZ2VyIGV4cGVjdGVkIik7CisKKyAgaWYgKCF0aGlzLT5lbXB0eSgpKSB7CisgICAgUE1Ub3BMZXZlbE1hbmFnZXIgKlRQTSA9IHRoaXMtPnRvcCgpLT5nZXRUb3BMZXZlbE1hbmFnZXIoKTsKKworICAgIGFzc2VydChUUE0gJiYgIlVuYWJsZSB0byBmaW5kIHRvcCBsZXZlbCBtYW5hZ2VyIik7CisgICAgVFBNLT5hZGRJbmRpcmVjdFBhc3NNYW5hZ2VyKFBNKTsKKyAgICBQTS0+c2V0VG9wTGV2ZWxNYW5hZ2VyKFRQTSk7CisgIH0KKworICBTLnB1c2hfYmFjayhQTSk7Cit9CisKKy8vIER1bXAgY29udGVudCBvZiB0aGUgcGFzcyBtYW5hZ2VyIHN0YWNrLgordm9pZCBQTVN0YWNrOjpkdW1wKCkgY29uc3QgeworICBmb3IgKHN0ZDo6dmVjdG9yPFBNRGF0YU1hbmFnZXIgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBTLmJlZ2luKCksCisgICAgICAgICBFID0gUy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgcHJpbnRmKCIlcyAiLCAoKkkpLT5nZXRBc1Bhc3MoKS0+Z2V0UGFzc05hbWUoKSk7CisKKyAgaWYgKCFTLmVtcHR5KCkpCisgICAgcHJpbnRmKCJcbiIpOworfQorCisvLy8gRmluZCBhcHByb3ByaWF0ZSBNb2R1bGUgUGFzcyBNYW5hZ2VyIGluIHRoZSBQTSBTdGFjayBhbmQKKy8vLyBhZGQgc2VsZiBpbnRvIHRoYXQgbWFuYWdlci4gCit2b2lkIE1vZHVsZVBhc3M6OmFzc2lnblBhc3NNYW5hZ2VyKFBNU3RhY2sgJlBNUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NNYW5hZ2VyVHlwZSBQcmVmZXJyZWRUeXBlKSB7CisgIC8vIEZpbmQgTW9kdWxlIFBhc3MgTWFuYWdlcgorICB3aGlsZSghUE1TLmVtcHR5KCkpIHsKKyAgICBQYXNzTWFuYWdlclR5cGUgVG9wUE1UeXBlID0gUE1TLnRvcCgpLT5nZXRQYXNzTWFuYWdlclR5cGUoKTsKKyAgICBpZiAoVG9wUE1UeXBlID09IFByZWZlcnJlZFR5cGUpCisgICAgICBicmVhazsgLy8gV2UgZm91bmQgZGVzaXJlZCBwYXNzIG1hbmFnZXIKKyAgICBlbHNlIGlmIChUb3BQTVR5cGUgPiBQTVRfTW9kdWxlUGFzc01hbmFnZXIpCisgICAgICBQTVMucG9wKCk7ICAgIC8vIFBvcCBjaGlsZHJlbiBwYXNzIG1hbmFnZXJzCisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgYXNzZXJ0KCFQTVMuZW1wdHkoKSAmJiAiVW5hYmxlIHRvIGZpbmQgYXBwcm9wcmlhdGUgUGFzcyBNYW5hZ2VyIik7CisgIFBNUy50b3AoKS0+YWRkKHRoaXMpOworfQorCisvLy8gRmluZCBhcHByb3ByaWF0ZSBGdW5jdGlvbiBQYXNzIE1hbmFnZXIgb3IgQ2FsbCBHcmFwaCBQYXNzIE1hbmFnZXIKKy8vLyBpbiB0aGUgUE0gU3RhY2sgYW5kIGFkZCBzZWxmIGludG8gdGhhdCBtYW5hZ2VyLiAKK3ZvaWQgRnVuY3Rpb25QYXNzOjphc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc01hbmFnZXJUeXBlIFByZWZlcnJlZFR5cGUpIHsKKworICAvLyBGaW5kIE1vZHVsZSBQYXNzIE1hbmFnZXIKKyAgd2hpbGUgKCFQTVMuZW1wdHkoKSkgeworICAgIGlmIChQTVMudG9wKCktPmdldFBhc3NNYW5hZ2VyVHlwZSgpID4gUE1UX0Z1bmN0aW9uUGFzc01hbmFnZXIpCisgICAgICBQTVMucG9wKCk7CisgICAgZWxzZQorICAgICAgYnJlYWs7IAorICB9CisKKyAgLy8gQ3JlYXRlIG5ldyBGdW5jdGlvbiBQYXNzIE1hbmFnZXIgaWYgbmVlZGVkLgorICBGUFBhc3NNYW5hZ2VyICpGUFA7CisgIGlmIChQTVMudG9wKCktPmdldFBhc3NNYW5hZ2VyVHlwZSgpID09IFBNVF9GdW5jdGlvblBhc3NNYW5hZ2VyKSB7CisgICAgRlBQID0gKEZQUGFzc01hbmFnZXIgKilQTVMudG9wKCk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KCFQTVMuZW1wdHkoKSAmJiAiVW5hYmxlIHRvIGNyZWF0ZSBGdW5jdGlvbiBQYXNzIE1hbmFnZXIiKTsKKyAgICBQTURhdGFNYW5hZ2VyICpQTUQgPSBQTVMudG9wKCk7CisKKyAgICAvLyBbMV0gQ3JlYXRlIG5ldyBGdW5jdGlvbiBQYXNzIE1hbmFnZXIKKyAgICBGUFAgPSBuZXcgRlBQYXNzTWFuYWdlcihQTUQtPmdldERlcHRoKCkgKyAxKTsKKyAgICBGUFAtPnBvcHVsYXRlSW5oZXJpdGVkQW5hbHlzaXMoUE1TKTsKKworICAgIC8vIFsyXSBTZXQgdXAgbmV3IG1hbmFnZXIncyB0b3AgbGV2ZWwgbWFuYWdlcgorICAgIFBNVG9wTGV2ZWxNYW5hZ2VyICpUUE0gPSBQTUQtPmdldFRvcExldmVsTWFuYWdlcigpOworICAgIFRQTS0+YWRkSW5kaXJlY3RQYXNzTWFuYWdlcihGUFApOworCisgICAgLy8gWzNdIEFzc2lnbiBtYW5hZ2VyIHRvIG1hbmFnZSB0aGlzIG5ldyBtYW5hZ2VyLiBUaGlzIG1heSBjcmVhdGUKKyAgICAvLyBhbmQgcHVzaCBuZXcgbWFuYWdlcnMgaW50byBQTVMKKyAgICBGUFAtPmFzc2lnblBhc3NNYW5hZ2VyKFBNUywgUE1ELT5nZXRQYXNzTWFuYWdlclR5cGUoKSk7CisKKyAgICAvLyBbNF0gUHVzaCBuZXcgbWFuYWdlciBpbnRvIFBNUworICAgIFBNUy5wdXNoKEZQUCk7CisgIH0KKworICAvLyBBc3NpZ24gRlBQIGFzIHRoZSBtYW5hZ2VyIG9mIHRoaXMgcGFzcy4KKyAgRlBQLT5hZGQodGhpcyk7Cit9CisKKy8vLyBGaW5kIGFwcHJvcHJpYXRlIEJhc2ljIFBhc3MgTWFuYWdlciBvciBDYWxsIEdyYXBoIFBhc3MgTWFuYWdlcgorLy8vIGluIHRoZSBQTSBTdGFjayBhbmQgYWRkIHNlbGYgaW50byB0aGF0IG1hbmFnZXIuIAordm9pZCBCYXNpY0Jsb2NrUGFzczo6YXNzaWduUGFzc01hbmFnZXIoUE1TdGFjayAmUE1TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc01hbmFnZXJUeXBlIFByZWZlcnJlZFR5cGUpIHsKKyAgQkJQYXNzTWFuYWdlciAqQkJQOworCisgIC8vIEJhc2ljIFBhc3MgTWFuYWdlciBpcyBhIGxlYWYgcGFzcyBtYW5hZ2VyLiBJdCBkb2VzIG5vdCBoYW5kbGUKKyAgLy8gYW55IG90aGVyIHBhc3MgbWFuYWdlci4KKyAgaWYgKCFQTVMuZW1wdHkoKSAmJiAKKyAgICAgIFBNUy50b3AoKS0+Z2V0UGFzc01hbmFnZXJUeXBlKCkgPT0gUE1UX0Jhc2ljQmxvY2tQYXNzTWFuYWdlcikgeworICAgIEJCUCA9IChCQlBhc3NNYW5hZ2VyICopUE1TLnRvcCgpOworICB9IGVsc2UgeworICAgIC8vIElmIGxlYWYgbWFuYWdlciBpcyBub3QgQmFzaWMgQmxvY2sgUGFzcyBtYW5hZ2VyIHRoZW4gY3JlYXRlIG5ldworICAgIC8vIGJhc2ljIEJsb2NrIFBhc3MgbWFuYWdlci4KKyAgICBhc3NlcnQoIVBNUy5lbXB0eSgpICYmICJVbmFibGUgdG8gY3JlYXRlIEJhc2ljQmxvY2sgUGFzcyBNYW5hZ2VyIik7CisgICAgUE1EYXRhTWFuYWdlciAqUE1EID0gUE1TLnRvcCgpOworCisgICAgLy8gWzFdIENyZWF0ZSBuZXcgQmFzaWMgQmxvY2sgTWFuYWdlcgorICAgIEJCUCA9IG5ldyBCQlBhc3NNYW5hZ2VyKFBNRC0+Z2V0RGVwdGgoKSArIDEpOworCisgICAgLy8gWzJdIFNldCB1cCBuZXcgbWFuYWdlcidzIHRvcCBsZXZlbCBtYW5hZ2VyCisgICAgLy8gQmFzaWMgQmxvY2sgUGFzcyBNYW5hZ2VyIGRvZXMgbm90IGxpdmUgYnkgaXRzZWxmCisgICAgUE1Ub3BMZXZlbE1hbmFnZXIgKlRQTSA9IFBNRC0+Z2V0VG9wTGV2ZWxNYW5hZ2VyKCk7CisgICAgVFBNLT5hZGRJbmRpcmVjdFBhc3NNYW5hZ2VyKEJCUCk7CisKKyAgICAvLyBbM10gQXNzaWduIG1hbmFnZXIgdG8gbWFuYWdlIHRoaXMgbmV3IG1hbmFnZXIuIFRoaXMgbWF5IGNyZWF0ZQorICAgIC8vIGFuZCBwdXNoIG5ldyBtYW5hZ2VycyBpbnRvIFBNUworICAgIEJCUC0+YXNzaWduUGFzc01hbmFnZXIoUE1TLCBQcmVmZXJyZWRUeXBlKTsKKworICAgIC8vIFs0XSBQdXNoIG5ldyBtYW5hZ2VyIGludG8gUE1TCisgICAgUE1TLnB1c2goQkJQKTsKKyAgfQorCisgIC8vIEFzc2lnbiBCQlAgYXMgdGhlIG1hbmFnZXIgb2YgdGhpcyBwYXNzLgorICBCQlAtPmFkZCh0aGlzKTsKK30KKworUGFzc01hbmFnZXJCYXNlOjp+UGFzc01hbmFnZXJCYXNlKCkge30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9WTUNvcmUvUGFzc1JlZ2lzdHJ5LmNwcCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvUGFzc1JlZ2lzdHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWRiYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9QYXNzUmVnaXN0cnkuY3BwCkBAIC0wLDAgKzEsMTU5IEBACisvLz09PS0gUGFzc1JlZ2lzdHJ5LmNwcCAtIFBhc3MgUmVnaXN0cmF0aW9uIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBQYXNzUmVnaXN0cnksIHdpdGggd2hpY2ggcGFzc2VzIGFyZSByZWdpc3RlcmVkIG9uCisvLyBpbml0aWFsaXphdGlvbiwgYW5kIHN1cHBvcnRzIHRoZSBQYXNzTWFuYWdlciBpbiBkZXBlbmRlbmN5IHJlc29sdXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vUGFzc1JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9QYXNzU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgUGFzc1JlZ2lzdHJ5ICpQYXNzUmVnaXN0cnlPYmogPSAwOworUGFzc1JlZ2lzdHJ5ICpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpIHsKKyAgLy8gVXNlIGRvdWJsZS1jaGVja2VkIGxvY2tpbmcgdG8gc2FmZWx5IGluaXRpYWxpemUgdGhlIHJlZ2lzdHJhciB3aGVuCisgIC8vIHdlJ3JlIHJ1bm5pbmcgaW4gbXVsdGl0aHJlYWRlZCBtb2RlLgorICBQYXNzUmVnaXN0cnkqIHRtcCA9IFBhc3NSZWdpc3RyeU9iajsKKyAgaWYgKGxsdm1faXNfbXVsdGl0aHJlYWRlZCgpKSB7CisgICAgc3lzOjpNZW1vcnlGZW5jZSgpOworICAgIGlmICghdG1wKSB7CisgICAgICBsbHZtX2FjcXVpcmVfZ2xvYmFsX2xvY2soKTsKKyAgICAgIHRtcCA9IFBhc3NSZWdpc3RyeU9iajsKKyAgICAgIGlmICghdG1wKSB7CisgICAgICAgIHRtcCA9IG5ldyBQYXNzUmVnaXN0cnkoKTsKKyAgICAgICAgc3lzOjpNZW1vcnlGZW5jZSgpOworICAgICAgICBQYXNzUmVnaXN0cnlPYmogPSB0bXA7CisgICAgICB9CisgICAgICBsbHZtX3JlbGVhc2VfZ2xvYmFsX2xvY2soKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoIXRtcCkgeworICAgIFBhc3NSZWdpc3RyeU9iaiA9IG5ldyBQYXNzUmVnaXN0cnkoKTsKKyAgfQorICAKKyAgcmV0dXJuIFBhc3NSZWdpc3RyeU9iajsKK30KKworbmFtZXNwYWNlIHsKKworLy8gRklYTUU6IFdlIHVzZSBNYW5hZ2VkQ2xlYW51cCB0byBlcmFzZSB0aGUgcGFzcyByZWdpc3RyYXIgb24gc2h1dGRvd24uCisvLyBVbmZvcnR1bmF0ZWx5LCBwYXNzZXMgYXJlIHJlZ2lzdGVyZWQgd2l0aCBzdGF0aWMgY3RvcnMsIGFuZCBoYXZpbmcKKy8vIGxsdm1fc2h1dGRvd24gY2xlYXIgdGhpcyBtYXAgcHJldmVudHMgc3VjY2Vzc2Z1bCByZXNzdXJlY3Rpb24gYWZ0ZXIgCisvLyBsbHZtX3NodXRkb3duIGlzIHJ1bi4gIElkZWFsbHkgd2Ugc2hvdWxkIGZpbmQgYSBzb2x1dGlvbiBzbyB0aGF0IHdlIGRvbid0CisvLyBsZWFrIHRoZSBtYXAsIEFORCBjYW4gc3RpbGwgcmVzdXJyZWN0IGFmdGVyIHNodXRkb3duLgordm9pZCBjbGVhbnVwUGFzc1JlZ2lzdHJ5KHZvaWQqKSB7CisgIGlmIChQYXNzUmVnaXN0cnlPYmopIHsKKyAgICBkZWxldGUgUGFzc1JlZ2lzdHJ5T2JqOworICAgIFBhc3NSZWdpc3RyeU9iaiA9IDA7CisgIH0KK30KK01hbmFnZWRDbGVhbnVwPCZjbGVhbnVwUGFzc1JlZ2lzdHJ5PiByZWdpc3RyeUNsZWFudXAgQVRUUklCVVRFX1VTRUQ7CisKK30KKworY29uc3QgUGFzc0luZm8gKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc0luZm8oY29uc3Qgdm9pZCAqVEkpIGNvbnN0IHsKKyAgc3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gR3VhcmQoTG9jayk7CisgIE1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIEkgPSBQYXNzSW5mb01hcC5maW5kKFRJKTsKKyAgcmV0dXJuIEkgIT0gUGFzc0luZm9NYXAuZW5kKCkgPyBJLT5zZWNvbmQgOiAwOworfQorCitjb25zdCBQYXNzSW5mbyAqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzSW5mbyhTdHJpbmdSZWYgQXJnKSBjb25zdCB7CisgIHN5czo6U21hcnRTY29wZWRMb2NrPHRydWU+IEd1YXJkKExvY2spOworICBTdHJpbmdNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gUGFzc0luZm9TdHJpbmdNYXAuZmluZChBcmcpOworICByZXR1cm4gSSAhPSBQYXNzSW5mb1N0cmluZ01hcC5lbmQoKSA/IEktPnNlY29uZCA6IDA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXNzIFJlZ2lzdHJhdGlvbiBtZWNoYW5pc20KKy8vCisKK3ZvaWQgUGFzc1JlZ2lzdHJ5OjpyZWdpc3RlclBhc3MoY29uc3QgUGFzc0luZm8gJlBJKSB7CisgIHN5czo6U21hcnRTY29wZWRMb2NrPHRydWU+IEd1YXJkKExvY2spOworICBib29sIEluc2VydGVkID0KKyAgICBQYXNzSW5mb01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUEkuZ2V0VHlwZUluZm8oKSwmUEkpKS5zZWNvbmQ7CisgIGFzc2VydChJbnNlcnRlZCAmJiAiUGFzcyByZWdpc3RlcmVkIG11bHRpcGxlIHRpbWVzISIpOyBJbnNlcnRlZD1JbnNlcnRlZDsKKyAgUGFzc0luZm9TdHJpbmdNYXBbUEkuZ2V0UGFzc0FyZ3VtZW50KCldID0gJlBJOworICAKKyAgLy8gTm90aWZ5IGFueSBsaXN0ZW5lcnMuCisgIGZvciAoc3RkOjp2ZWN0b3I8UGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyKj46Oml0ZXJhdG9yCisgICAgICAgSSA9IExpc3RlbmVycy5iZWdpbigpLCBFID0gTGlzdGVuZXJzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAoKkkpLT5wYXNzUmVnaXN0ZXJlZCgmUEkpOworfQorCit2b2lkIFBhc3NSZWdpc3RyeTo6dW5yZWdpc3RlclBhc3MoY29uc3QgUGFzc0luZm8gJlBJKSB7CisgIHN5czo6U21hcnRTY29wZWRMb2NrPHRydWU+IEd1YXJkKExvY2spOworICBNYXBUeXBlOjppdGVyYXRvciBJID0gUGFzc0luZm9NYXAuZmluZChQSS5nZXRUeXBlSW5mbygpKTsKKyAgYXNzZXJ0KEkgIT0gUGFzc0luZm9NYXAuZW5kKCkgJiYgIlBhc3MgcmVnaXN0ZXJlZCBidXQgbm90IGluIG1hcCEiKTsKKyAgCisgIC8vIFJlbW92ZSBwYXNzIGZyb20gdGhlIG1hcC4KKyAgUGFzc0luZm9NYXAuZXJhc2UoSSk7CisgIFBhc3NJbmZvU3RyaW5nTWFwLmVyYXNlKFBJLmdldFBhc3NBcmd1bWVudCgpKTsKK30KKwordm9pZCBQYXNzUmVnaXN0cnk6OmVudW1lcmF0ZVdpdGgoUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyICpMKSB7CisgIHN5czo6U21hcnRTY29wZWRMb2NrPHRydWU+IEd1YXJkKExvY2spOworICBmb3IgKE1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIEkgPSBQYXNzSW5mb01hcC5iZWdpbigpLAorICAgICAgIEUgPSBQYXNzSW5mb01hcC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgTC0+cGFzc0VudW1lcmF0ZShJLT5zZWNvbmQpOworfQorCisKKy8vLyBBbmFseXNpcyBHcm91cCBNZWNoYW5pc21zLgordm9pZCBQYXNzUmVnaXN0cnk6OnJlZ2lzdGVyQW5hbHlzaXNHcm91cChjb25zdCB2b2lkICpJbnRlcmZhY2VJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKlBhc3NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc0luZm8mIFJlZ2lzdGVyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZWZhdWx0KSB7CisgIFBhc3NJbmZvICpJbnRlcmZhY2VJbmZvID0gIGNvbnN0X2Nhc3Q8UGFzc0luZm8qPihnZXRQYXNzSW5mbyhJbnRlcmZhY2VJRCkpOworICBpZiAoSW50ZXJmYWNlSW5mbyA9PSAwKSB7CisgICAgLy8gRmlyc3QgcmVmZXJlbmNlIHRvIEludGVyZmFjZSwgcmVnaXN0ZXIgaXQgbm93LgorICAgIHJlZ2lzdGVyUGFzcyhSZWdpc3RlcmVlKTsKKyAgICBJbnRlcmZhY2VJbmZvID0gJlJlZ2lzdGVyZWU7CisgIH0KKyAgYXNzZXJ0KFJlZ2lzdGVyZWUuaXNBbmFseXNpc0dyb3VwKCkgJiYgCisgICAgICAgICAiVHJ5aW5nIHRvIGpvaW4gYW4gYW5hbHlzaXMgZ3JvdXAgdGhhdCBpcyBhIG5vcm1hbCBwYXNzISIpOworCisgIGlmIChQYXNzSUQpIHsKKyAgICBQYXNzSW5mbyAqSW1wbGVtZW50YXRpb25JbmZvID0gY29uc3RfY2FzdDxQYXNzSW5mbyo+KGdldFBhc3NJbmZvKFBhc3NJRCkpOworICAgIGFzc2VydChJbXBsZW1lbnRhdGlvbkluZm8gJiYKKyAgICAgICAgICAgIk11c3QgcmVnaXN0ZXIgcGFzcyBiZWZvcmUgYWRkaW5nIHRvIEFuYWx5c2lzR3JvdXAhIik7CisKKyAgICAvLyBNYWtlIHN1cmUgd2Uga2VlcCB0cmFjayBvZiB0aGUgZmFjdCB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzCisgICAgLy8gdGhlIGludGVyZmFjZS4KKyAgICBJbXBsZW1lbnRhdGlvbkluZm8tPmFkZEludGVyZmFjZUltcGxlbWVudGVkKEludGVyZmFjZUluZm8pOworCisgICAgc3lzOjpTbWFydFNjb3BlZExvY2s8dHJ1ZT4gR3VhcmQoTG9jayk7CisgICAgQW5hbHlzaXNHcm91cEluZm8gJkFHSSA9IEFuYWx5c2lzR3JvdXBJbmZvTWFwW0ludGVyZmFjZUluZm9dOworICAgIGFzc2VydChBR0kuSW1wbGVtZW50YXRpb25zLmNvdW50KEltcGxlbWVudGF0aW9uSW5mbykgPT0gMCAmJgorICAgICAgICAgICAiQ2Fubm90IGFkZCBhIHBhc3MgdG8gdGhlIHNhbWUgYW5hbHlzaXMgZ3JvdXAgbW9yZSB0aGFuIG9uY2UhIik7CisgICAgQUdJLkltcGxlbWVudGF0aW9ucy5pbnNlcnQoSW1wbGVtZW50YXRpb25JbmZvKTsKKyAgICBpZiAoaXNEZWZhdWx0KSB7CisgICAgICBhc3NlcnQoSW50ZXJmYWNlSW5mby0+Z2V0Tm9ybWFsQ3RvcigpID09IDAgJiYKKyAgICAgICAgICAgICAiRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYW5hbHlzaXMgZ3JvdXAgYWxyZWFkeSBzcGVjaWZpZWQhIik7CisgICAgICBhc3NlcnQoSW1wbGVtZW50YXRpb25JbmZvLT5nZXROb3JtYWxDdG9yKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBzcGVjaWZ5IHBhc3MgYXMgZGVmYXVsdCBpZiBpdCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBjdG9yIik7CisgICAgICBJbnRlcmZhY2VJbmZvLT5zZXROb3JtYWxDdG9yKEltcGxlbWVudGF0aW9uSW5mby0+Z2V0Tm9ybWFsQ3RvcigpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBQYXNzUmVnaXN0cnk6OmFkZFJlZ2lzdHJhdGlvbkxpc3RlbmVyKFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciAqTCkgeworICBzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBHdWFyZChMb2NrKTsKKyAgTGlzdGVuZXJzLnB1c2hfYmFjayhMKTsKK30KKwordm9pZCBQYXNzUmVnaXN0cnk6OnJlbW92ZVJlZ2lzdHJhdGlvbkxpc3RlbmVyKFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciAqTCkgeworICBzeXM6OlNtYXJ0U2NvcGVkTG9jazx0cnVlPiBHdWFyZChMb2NrKTsKKyAgc3RkOjp2ZWN0b3I8UGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyKj46Oml0ZXJhdG9yIEkgPQorICAgIHN0ZDo6ZmluZChMaXN0ZW5lcnMuYmVnaW4oKSwgTGlzdGVuZXJzLmVuZCgpLCBMKTsKKyAgYXNzZXJ0KEkgIT0gTGlzdGVuZXJzLmVuZCgpICYmICJQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgbm90IHJlZ2lzdGVyZWQhIik7CisgIExpc3RlbmVycy5lcmFzZShJKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9WTUNvcmUvUHJpbnRNb2R1bGVQYXNzLmNwcCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvUHJpbnRNb2R1bGVQYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTUzMDllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9QcmludE1vZHVsZVBhc3MuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvLz09PS0tLSBWTUNvcmUvUHJpbnRNb2R1bGVQYXNzLmNwcCAtIE1vZHVsZS9GdW5jdGlvbiBQcmludGVyIC0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFByaW50TW9kdWxlUGFzcyBhbmQgUHJpbnRGdW5jdGlvblBhc3MgaW1wbGVtZW50YXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1ByaW50TW9kdWxlUGFzcy5oIgorCisjaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworICBjbGFzcyBQcmludE1vZHVsZVBhc3MgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgICAgc3RkOjpzdHJpbmcgQmFubmVyOworICAgIHJhd19vc3RyZWFtICpPdXQ7ICAgICAgIC8vIHJhd19vc3RyZWFtIHRvIHByaW50IG9uCisgICAgYm9vbCBEZWxldGVTdHJlYW07ICAgICAgLy8gRGVsZXRlIHRoZSBvc3RyZWFtIGluIG91ciBkdG9yPworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisgICAgUHJpbnRNb2R1bGVQYXNzKCkgOiBNb2R1bGVQYXNzKElEKSwgT3V0KCZkYmdzKCkpLCAKKyAgICAgIERlbGV0ZVN0cmVhbShmYWxzZSkge30KKyAgICBQcmludE1vZHVsZVBhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJkIsIHJhd19vc3RyZWFtICpvLCBib29sIERTKQorICAgICAgICA6IE1vZHVsZVBhc3MoSUQpLCBCYW5uZXIoQiksIE91dChvKSwgRGVsZXRlU3RyZWFtKERTKSB7fQorICAgIAorICAgIH5QcmludE1vZHVsZVBhc3MoKSB7CisgICAgICBpZiAoRGVsZXRlU3RyZWFtKSBkZWxldGUgT3V0OworICAgIH0KKyAgICAKKyAgICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgeworICAgICAgKCpPdXQpIDw8IEJhbm5lciA8PCBNOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgeworICAgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgfQorICB9OworICAKKyAgY2xhc3MgUHJpbnRGdW5jdGlvblBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgICBzdGQ6OnN0cmluZyBCYW5uZXI7ICAgICAvLyBTdHJpbmcgdG8gcHJpbnQgYmVmb3JlIGVhY2ggZnVuY3Rpb24KKyAgICByYXdfb3N0cmVhbSAqT3V0OyAgICAgICAvLyByYXdfb3N0cmVhbSB0byBwcmludCBvbgorICAgIGJvb2wgRGVsZXRlU3RyZWFtOyAgICAgIC8vIERlbGV0ZSB0aGUgb3N0cmVhbSBpbiBvdXIgZHRvcj8KKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworICAgIFByaW50RnVuY3Rpb25QYXNzKCkgOiBGdW5jdGlvblBhc3MoSUQpLCBCYW5uZXIoIiIpLCBPdXQoJmRiZ3MoKSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVTdHJlYW0oZmFsc2UpIHt9CisgICAgUHJpbnRGdW5jdGlvblBhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJkIsIHJhd19vc3RyZWFtICpvLCBib29sIERTKQorICAgICAgOiBGdW5jdGlvblBhc3MoSUQpLCBCYW5uZXIoQiksIE91dChvKSwgRGVsZXRlU3RyZWFtKERTKSB7fQorICAgIAorICAgIGlubGluZSB+UHJpbnRGdW5jdGlvblBhc3MoKSB7CisgICAgICBpZiAoRGVsZXRlU3RyZWFtKSBkZWxldGUgT3V0OworICAgIH0KKyAgICAKKyAgICAvLyBydW5PbkZ1bmN0aW9uIC0gVGhpcyBwYXNzIGp1c3QgcHJpbnRzIGEgYmFubmVyIGZvbGxvd2VkIGJ5IHRoZQorICAgIC8vIGZ1bmN0aW9uIGFzIGl0J3MgcHJvY2Vzc2VkLgorICAgIC8vCisgICAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSB7CisgICAgICAoKk91dCkgPDwgQmFubmVyIDw8IHN0YXRpY19jYXN0PFZhbHVlJj4oRik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICB9CisgIH07Cit9CisKK2NoYXIgUHJpbnRNb2R1bGVQYXNzOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoUHJpbnRNb2R1bGVQYXNzLCAicHJpbnQtbW9kdWxlIiwKKyAgICAgICAgICAgICAgICAiUHJpbnQgbW9kdWxlIHRvIHN0ZGVyciIsIGZhbHNlLCBmYWxzZSk7CitjaGFyIFByaW50RnVuY3Rpb25QYXNzOjpJRCA9IDA7CitJTklUSUFMSVpFX1BBU1MoUHJpbnRGdW5jdGlvblBhc3MsICJwcmludC1mdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgIlByaW50IGZ1bmN0aW9uIHRvIHN0ZGVyciIsIGZhbHNlLCBmYWxzZSk7CisKKy8vLyBjcmVhdGVQcmludE1vZHVsZVBhc3MgLSBDcmVhdGUgYW5kIHJldHVybiBhIHBhc3MgdGhhdCB3cml0ZXMgdGhlCisvLy8gbW9kdWxlIHRvIHRoZSBzcGVjaWZpZWQgcmF3X29zdHJlYW0uCitNb2R1bGVQYXNzICpsbHZtOjpjcmVhdGVQcmludE1vZHVsZVBhc3MobGx2bTo6cmF3X29zdHJlYW0gKk9TLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlbGV0ZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSB7CisgIHJldHVybiBuZXcgUHJpbnRNb2R1bGVQYXNzKEJhbm5lciwgT1MsIERlbGV0ZVN0cmVhbSk7Cit9CisKKy8vLyBjcmVhdGVQcmludEZ1bmN0aW9uUGFzcyAtIENyZWF0ZSBhbmQgcmV0dXJuIGEgcGFzcyB0aGF0IHByaW50cworLy8vIGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIHJhd19vc3RyZWFtIGFzIHRoZXkgYXJlIHByb2Nlc3NlZC4KK0Z1bmN0aW9uUGFzcyAqbGx2bTo6Y3JlYXRlUHJpbnRGdW5jdGlvblBhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6cmF3X29zdHJlYW0gKk9TLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxldGVTdHJlYW0pIHsKKyAgcmV0dXJuIG5ldyBQcmludEZ1bmN0aW9uUGFzcyhCYW5uZXIsIE9TLCBEZWxldGVTdHJlYW0pOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL1N5bWJvbFRhYmxlTGlzdFRyYWl0c0ltcGwuaCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvU3ltYm9sVGFibGVMaXN0VHJhaXRzSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNjg3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL1N5bWJvbFRhYmxlTGlzdFRyYWl0c0ltcGwuaApAQCAtMCwwICsxLDExOCBAQAorLy89PT0tLSBsbHZtL1N5bWJvbFRhYmxlTGlzdFRyYWl0c0ltcGwuaCAtIEltcGxlbWVudGF0aW9uIC0tLS0tLSotIEMrKyAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgc3RpY2tpZXIgcGFydHMgb2YgdGhlIFN5bWJvbFRhYmxlTGlzdFRyYWl0cyBjbGFzcywKKy8vIGFuZCBpcyBleHBsaWNpdGx5IGluc3RhbnRpYXRlZCB3aGVyZSBuZWVkZWQgdG8gYXZvaWQgZGVmaW5pbmcgYWxsIHRoaXMgY29kZQorLy8gaW4gYSB3aWRlbHkgdXNlZCBoZWFkZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NZTUJPTFRBQkxFTElTVFRSQUlUU19JTVBMX0gKKyNkZWZpbmUgTExWTV9TWU1CT0xUQUJMRUxJU1RUUkFJVFNfSU1QTF9ICisKKyNpbmNsdWRlICJsbHZtL1N5bWJvbFRhYmxlTGlzdFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vVmFsdWVTeW1ib2xUYWJsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBzZXRTeW1UYWJPYmplY3QgLSBUaGlzIGlzIGNhbGxlZCB3aGVuIChmLmUuKSB0aGUgcGFyZW50IG9mIGEgYmFzaWMgYmxvY2sKKy8vLyBjaGFuZ2VzLiAgVGhpcyByZXF1aXJlcyB1cyB0byByZW1vdmUgYWxsIHRoZSBpbnN0cnVjdGlvbiBzeW10YWIgZW50cmllcyBmcm9tCisvLy8gdGhlIGN1cnJlbnQgZnVuY3Rpb24gYW5kIHJlaW5zZXJ0IHRoZW0gaW50byB0aGUgbmV3IGZ1bmN0aW9uLgordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVTdWJDbGFzcywgdHlwZW5hbWUgSXRlbVBhcmVudENsYXNzPgordGVtcGxhdGU8dHlwZW5hbWUgVFB0cj4KK3ZvaWQgU3ltYm9sVGFibGVMaXN0VHJhaXRzPFZhbHVlU3ViQ2xhc3MsSXRlbVBhcmVudENsYXNzPgorOjpzZXRTeW1UYWJPYmplY3QoVFB0ciAqRGVzdCwgVFB0ciBTcmMpIHsKKyAgLy8gR2V0IHRoZSBvbGQgc3ltdGFiIGFuZCB2YWx1ZSBsaXN0IGJlZm9yZSBkb2luZyB0aGUgYXNzaWdubWVudC4KKyAgVmFsdWVTeW1ib2xUYWJsZSAqT2xkU1QgPSBUcmFpdHNDbGFzczo6Z2V0U3ltVGFiKGdldExpc3RPd25lcigpKTsKKworICAvLyBEbyBpdC4KKyAgKkRlc3QgPSBTcmM7CisgIAorICAvLyBHZXQgdGhlIG5ldyBTeW1UYWIgb2JqZWN0LgorICBWYWx1ZVN5bWJvbFRhYmxlICpOZXdTVCA9IFRyYWl0c0NsYXNzOjpnZXRTeW1UYWIoZ2V0TGlzdE93bmVyKCkpOworICAKKyAgLy8gSWYgdGhlcmUgaXMgbm90aGluZyB0byBkbywgcXVpY2sgZXhpdC4KKyAgaWYgKE9sZFNUID09IE5ld1NUKSByZXR1cm47CisgIAorICAvLyBNb3ZlIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgb2xkIHN5bXRhYiB0byB0aGUgbmV3IG9uZS4KKyAgaXBsaXN0PFZhbHVlU3ViQ2xhc3M+ICZJdGVtTGlzdCA9IFRyYWl0c0NsYXNzOjpnZXRMaXN0KGdldExpc3RPd25lcigpKTsKKyAgaWYgKEl0ZW1MaXN0LmVtcHR5KCkpIHJldHVybjsKKyAgCisgIGlmIChPbGRTVCkgeworICAgIC8vIFJlbW92ZSBhbGwgZW50cmllcyBmcm9tIHRoZSBwcmV2aW91cyBzeW10YWIuCisgICAgZm9yICh0eXBlbmFtZSBpcGxpc3Q8VmFsdWVTdWJDbGFzcz46Oml0ZXJhdG9yIEkgPSBJdGVtTGlzdC5iZWdpbigpOworICAgICAgICAgSSAhPSBJdGVtTGlzdC5lbmQoKTsgKytJKQorICAgICAgaWYgKEktPmhhc05hbWUoKSkKKyAgICAgICAgT2xkU1QtPnJlbW92ZVZhbHVlTmFtZShJLT5nZXRWYWx1ZU5hbWUoKSk7CisgIH0KKworICBpZiAoTmV3U1QpIHsKKyAgICAvLyBBZGQgYWxsIG9mIHRoZSBpdGVtcyB0byB0aGUgbmV3IHN5bXRhYi4KKyAgICBmb3IgKHR5cGVuYW1lIGlwbGlzdDxWYWx1ZVN1YkNsYXNzPjo6aXRlcmF0b3IgSSA9IEl0ZW1MaXN0LmJlZ2luKCk7CisgICAgICAgICBJICE9IEl0ZW1MaXN0LmVuZCgpOyArK0kpCisgICAgICBpZiAoSS0+aGFzTmFtZSgpKQorICAgICAgICBOZXdTVC0+cmVpbnNlcnRWYWx1ZShJKTsKKyAgfQorICAKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVTdWJDbGFzcywgdHlwZW5hbWUgSXRlbVBhcmVudENsYXNzPgordm9pZCBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8VmFsdWVTdWJDbGFzcyxJdGVtUGFyZW50Q2xhc3M+Cis6OmFkZE5vZGVUb0xpc3QoVmFsdWVTdWJDbGFzcyAqVikgeworICBhc3NlcnQoVi0+Z2V0UGFyZW50KCkgPT0gMCAmJiAiVmFsdWUgYWxyZWFkeSBpbiBhIGNvbnRhaW5lciEhIik7CisgIEl0ZW1QYXJlbnRDbGFzcyAqT3duZXIgPSBnZXRMaXN0T3duZXIoKTsKKyAgVi0+c2V0UGFyZW50KE93bmVyKTsKKyAgaWYgKFYtPmhhc05hbWUoKSkKKyAgICBpZiAoVmFsdWVTeW1ib2xUYWJsZSAqU1QgPSBUcmFpdHNDbGFzczo6Z2V0U3ltVGFiKE93bmVyKSkKKyAgICAgIFNULT5yZWluc2VydFZhbHVlKFYpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVN1YkNsYXNzLCB0eXBlbmFtZSBJdGVtUGFyZW50Q2xhc3M+Cit2b2lkIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxWYWx1ZVN1YkNsYXNzLEl0ZW1QYXJlbnRDbGFzcz4KKzo6cmVtb3ZlTm9kZUZyb21MaXN0KFZhbHVlU3ViQ2xhc3MgKlYpIHsKKyAgVi0+c2V0UGFyZW50KDApOworICBpZiAoVi0+aGFzTmFtZSgpKQorICAgIGlmIChWYWx1ZVN5bWJvbFRhYmxlICpTVCA9IFRyYWl0c0NsYXNzOjpnZXRTeW1UYWIoZ2V0TGlzdE93bmVyKCkpKQorICAgICAgU1QtPnJlbW92ZVZhbHVlTmFtZShWLT5nZXRWYWx1ZU5hbWUoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlU3ViQ2xhc3MsIHR5cGVuYW1lIEl0ZW1QYXJlbnRDbGFzcz4KK3ZvaWQgU3ltYm9sVGFibGVMaXN0VHJhaXRzPFZhbHVlU3ViQ2xhc3MsSXRlbVBhcmVudENsYXNzPgorOjp0cmFuc2Zlck5vZGVzRnJvbUxpc3QoaWxpc3RfdHJhaXRzPFZhbHVlU3ViQ2xhc3M+ICZMMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlsaXN0X2l0ZXJhdG9yPFZhbHVlU3ViQ2xhc3M+IGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaWxpc3RfaXRlcmF0b3I8VmFsdWVTdWJDbGFzcz4gbGFzdCkgeworICAvLyBXZSBvbmx5IGhhdmUgdG8gZG8gd29yayBoZXJlIGlmIHRyYW5zZmVycmluZyBpbnN0cnVjdGlvbnMgYmV0d2VlbiBCQnMKKyAgSXRlbVBhcmVudENsYXNzICpOZXdJUCA9IGdldExpc3RPd25lcigpLCAqT2xkSVAgPSBMMi5nZXRMaXN0T3duZXIoKTsKKyAgaWYgKE5ld0lQID09IE9sZElQKSByZXR1cm47ICAvLyBObyB3b3JrIHRvIGRvIGF0IGFsbC4uLgorCisgIC8vIFdlIG9ubHkgaGF2ZSB0byB1cGRhdGUgc3ltYm9sIHRhYmxlIGVudHJpZXMgaWYgd2UgYXJlIHRyYW5zZmVycmluZyB0aGUKKyAgLy8gaW5zdHJ1Y3Rpb25zIHRvIGEgZGlmZmVyZW50IHN5bXRhYiBvYmplY3QuLi4KKyAgVmFsdWVTeW1ib2xUYWJsZSAqTmV3U1QgPSBUcmFpdHNDbGFzczo6Z2V0U3ltVGFiKE5ld0lQKTsKKyAgVmFsdWVTeW1ib2xUYWJsZSAqT2xkU1QgPSBUcmFpdHNDbGFzczo6Z2V0U3ltVGFiKE9sZElQKTsKKyAgaWYgKE5ld1NUICE9IE9sZFNUKSB7CisgICAgZm9yICg7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QpIHsKKyAgICAgIFZhbHVlU3ViQ2xhc3MgJlYgPSAqZmlyc3Q7CisgICAgICBib29sIEhhc05hbWUgPSBWLmhhc05hbWUoKTsKKyAgICAgIGlmIChPbGRTVCAmJiBIYXNOYW1lKQorICAgICAgICBPbGRTVC0+cmVtb3ZlVmFsdWVOYW1lKFYuZ2V0VmFsdWVOYW1lKCkpOworICAgICAgVi5zZXRQYXJlbnQoTmV3SVApOworICAgICAgaWYgKE5ld1NUICYmIEhhc05hbWUpCisgICAgICAgIE5ld1NULT5yZWluc2VydFZhbHVlKCZWKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gSnVzdCB0cmFuc2ZlcnJpbmcgYmV0d2VlbiBibG9ja3MgaW4gdGhlIHNhbWUgZnVuY3Rpb24sIHNpbXBseSB1cGRhdGUgdGhlCisgICAgLy8gcGFyZW50IGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb25zLi4uCisgICAgZm9yICg7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QpCisgICAgICBmaXJzdC0+c2V0UGFyZW50KE5ld0lQKTsKKyAgfQorfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL2xpYi9WTUNvcmUvVHlwZS5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL1R5cGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWIwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL1R5cGUuY3BwCkBAIC0wLDAgKzEsMTMzMSBAQAorLy89PT0tLSBUeXBlLmNwcCAtIEltcGxlbWVudCB0aGUgVHlwZSBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgVHlwZSBjbGFzcyBmb3IgdGhlIFZNQ29yZSBsaWJyYXJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJMTFZNQ29udGV4dEltcGwuaCIKKyNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NDQ0l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vVGhyZWFkaW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRhcmc+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gREVCVUdfTUVSR0VfVFlQRVMgLSBFbmFibGUgdGhpcyAjZGVmaW5lIHRvIHNlZSBob3cgYW5kIHdoZW4gZGVyaXZlZCB0eXBlcyBhcmUKKy8vIGNyZWF0ZWQgYW5kIGxhdGVyIGRlc3Ryb3llZCwgYWxsIGluIGFuIGVmZm9ydCB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5CisvLyBhIHNpbmdsZSBjYW5vbmljYWwgdmVyc2lvbiBvZiBhIHR5cGUuCisvLworLy8gI2RlZmluZSBERUJVR19NRVJHRV9UWVBFUyAxCisKK0Fic3RyYWN0VHlwZVVzZXI6On5BYnN0cmFjdFR5cGVVc2VyKCkge30KKwordm9pZCBBYnN0cmFjdFR5cGVVc2VyOjpzZXRUeXBlKFZhbHVlICpWLCBjb25zdCBUeXBlICpOZXdUeSkgeworICBWLT5WVHkgPSBOZXdUeTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgQ2xhc3MgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBCZWNhdXNlIG9mIHRoZSB3YXkgVHlwZSBzdWJjbGFzc2VzIGFyZSBhbGxvY2F0ZWQsIHRoaXMgZnVuY3Rpb24gaXMgbmVjZXNzYXJ5CisvLy8gdG8gdXNlIHRoZSBjb3JyZWN0IGtpbmQgb2YgImRlbGV0ZSIgb3BlcmF0b3IgdG8gZGVhbGxvY2F0ZSB0aGUgVHlwZSBvYmplY3QuCisvLy8gU29tZSB0eXBlIG9iamVjdHMgKEZ1bmN0aW9uVHksIFN0cnVjdFR5LCBVbmlvblR5KSBhbGxvY2F0ZSBhZGRpdGlvbmFsIHNwYWNlCisvLy8gYWZ0ZXIgdGhlIHNwYWNlIGZvciB0aGVpciBkZXJpdmVkIHR5cGUgdG8gaG9sZCB0aGUgY29udGFpbmVkIHR5cGVzIGFycmF5IG9mCisvLy8gUEFUeXBlSGFuZGxlcy4gVXNpbmcgdGhpcyBhbGxvY2F0aW9uIHNjaGVtZSBtZWFucyBhbGwgdGhlIFBBVHlwZUhhbmRsZXMgYXJlCisvLy8gYWxsb2NhdGVkIHdpdGggdGhlIHR5cGUgb2JqZWN0LCBkZWNyZWFzaW5nIGFsbG9jYXRpb25zIGFuZCBlbGltaW5hdGluZyB0aGUKKy8vLyBuZWVkIGZvciBhIHN0ZDo6dmVjdG9yIHRvIGJlIHVzZWQgaW4gdGhlIFR5cGUgY2xhc3MgaXRzZWxmLiAKKy8vLyBAYnJpZWYgVHlwZSBkZXN0cnVjdGlvbiBmdW5jdGlvbgordm9pZCBUeXBlOjpkZXN0cm95KCkgY29uc3QgeworICAvLyBOb3RoaW5nIGNhbGxzIGdldEZvcndhcmRlZFR5cGUgZnJvbSBoZXJlIG9uLgorICBpZiAoRm9yd2FyZFR5cGUgJiYgRm9yd2FyZFR5cGUtPmlzQWJzdHJhY3QoKSkgeworICAgIEZvcndhcmRUeXBlLT5kcm9wUmVmKCk7CisgICAgRm9yd2FyZFR5cGUgPSBOVUxMOworICB9CisKKyAgLy8gU3RydWN0dXJlcyBhbmQgRnVuY3Rpb25zIGFsbG9jYXRlIHRoZWlyIGNvbnRhaW5lZCB0eXBlcyBwYXN0IHRoZSBlbmQgb2YKKyAgLy8gdGhlIHR5cGUgb2JqZWN0IGl0c2VsZi4gVGhlc2UgbmVlZCB0byBiZSBkZXN0cm95ZWQgZGlmZmVyZW50bHkgdGhhbiB0aGUKKyAgLy8gb3RoZXIgdHlwZXMuCisgIGlmICh0aGlzLT5pc0Z1bmN0aW9uVHkoKSB8fCB0aGlzLT5pc1N0cnVjdFR5KCkgfHwKKyAgICAgIHRoaXMtPmlzVW5pb25UeSgpKSB7CisgICAgLy8gRmlyc3QsIG1ha2Ugc3VyZSB3ZSBkZXN0cnVjdCBhbnkgUEFUeXBlSGFuZGxlcyBhbGxvY2F0ZWQgYnkgdGhlc2UKKyAgICAvLyBzdWJjbGFzc2VzLiAgVGhleSBtdXN0IGJlIG1hbnVhbGx5IGRlc3RydWN0ZWQuIAorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1Db250YWluZWRUeXM7ICsraSkKKyAgICAgIENvbnRhaW5lZFR5c1tpXS5QQVR5cGVIYW5kbGU6On5QQVR5cGVIYW5kbGUoKTsKKworICAgIC8vIE5vdyBjYWxsIHRoZSBkZXN0cnVjdG9yIGZvciB0aGUgc3ViY2xhc3MgZGlyZWN0bHkgYmVjYXVzZSB3ZSdyZSBnb2luZworICAgIC8vIHRvIGRlbGV0ZSB0aGlzIGFzIGFuIGFycmF5IG9mIGNoYXIuCisgICAgaWYgKHRoaXMtPmlzRnVuY3Rpb25UeSgpKQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgRnVuY3Rpb25UeXBlKj4odGhpcyktPkZ1bmN0aW9uVHlwZTo6fkZ1bmN0aW9uVHlwZSgpOworICAgIGVsc2UgaWYgKHRoaXMtPmlzU3RydWN0VHkoKSkKKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFN0cnVjdFR5cGUqPih0aGlzKS0+U3RydWN0VHlwZTo6flN0cnVjdFR5cGUoKTsKKyAgICBlbHNlCisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBVbmlvblR5cGUqPih0aGlzKS0+VW5pb25UeXBlOjp+VW5pb25UeXBlKCk7CisKKyAgICAvLyBGaW5hbGx5LCByZW1vdmUgdGhlIG1lbW9yeSBhcyBhbiBhcnJheSBkZWFsbG9jYXRpb24gb2YgdGhlIGNoYXJzIGl0IHdhcworICAgIC8vIGNvbnN0cnVjdGVkIGZyb20uCisgICAgb3BlcmF0b3IgZGVsZXRlKGNvbnN0X2Nhc3Q8VHlwZSAqPih0aGlzKSk7CisKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoY29uc3QgT3BhcXVlVHlwZSAqb3BhcXVlX3RoaXMgPSBkeW5fY2FzdDxPcGFxdWVUeXBlPih0aGlzKSkgeworICAgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSB0aGlzLT5nZXRDb250ZXh0KCkucEltcGw7CisgICAgcEltcGwtPk9wYXF1ZVR5cGVzLmVyYXNlKG9wYXF1ZV90aGlzKTsKKyAgfQorCisgIC8vIEZvciBhbGwgdGhlIG90aGVyIHR5cGUgc3ViY2xhc3NlcywgdGhlcmUgaXMgZWl0aGVyIG5vIGNvbnRhaW5lZCB0eXBlcyBvciAKKyAgLy8ganVzdCBvbmUgKGFsbCBTZXF1ZW50aWFscykuIEZvciBTZXF1ZW50aWFscywgdGhlIFBBVHlwZUhhbmRsZSBpcyBub3QKKyAgLy8gYWxsb2NhdGVkIHBhc3QgdGhlIHR5cGUgb2JqZWN0LCBpdHMgaW5jbHVkZWQgZGlyZWN0bHkgaW4gdGhlIFNlcXVlbnRpYWxUeXBlCisgIC8vIGNsYXNzLiBUaGlzIG1lYW5zIHdlIGNhbiBzYWZlbHkganVzdCBkbyAibm9ybWFsIiBkZWxldGUgb2YgdGhpcyBvYmplY3QgYW5kCisgIC8vIGFsbCB0aGUgZGVzdHJ1Y3RvcnMgdGhhdCBuZWVkIHRvIHJ1biB3aWxsIGJlIHJ1bi4KKyAgZGVsZXRlIHRoaXM7IAorfQorCitjb25zdCBUeXBlICpUeXBlOjpnZXRQcmltaXRpdmVUeXBlKExMVk1Db250ZXh0ICZDLCBUeXBlSUQgSUROdW1iZXIpIHsKKyAgc3dpdGNoIChJRE51bWJlcikgeworICBjYXNlIFZvaWRUeUlEICAgICAgOiByZXR1cm4gZ2V0Vm9pZFR5KEMpOworICBjYXNlIEZsb2F0VHlJRCAgICAgOiByZXR1cm4gZ2V0RmxvYXRUeShDKTsKKyAgY2FzZSBEb3VibGVUeUlEICAgIDogcmV0dXJuIGdldERvdWJsZVR5KEMpOworICBjYXNlIFg4Nl9GUDgwVHlJRCAgOiByZXR1cm4gZ2V0WDg2X0ZQODBUeShDKTsKKyAgY2FzZSBGUDEyOFR5SUQgICAgIDogcmV0dXJuIGdldEZQMTI4VHkoQyk7CisgIGNhc2UgUFBDX0ZQMTI4VHlJRCA6IHJldHVybiBnZXRQUENfRlAxMjhUeShDKTsKKyAgY2FzZSBMYWJlbFR5SUQgICAgIDogcmV0dXJuIGdldExhYmVsVHkoQyk7CisgIGNhc2UgTWV0YWRhdGFUeUlEICA6IHJldHVybiBnZXRNZXRhZGF0YVR5KEMpOworICBkZWZhdWx0OgorICAgIHJldHVybiAwOworICB9Cit9CisKK2NvbnN0IFR5cGUgKlR5cGU6OmdldFZBQXJnc1Byb21vdGVkVHlwZShMTFZNQ29udGV4dCAmQykgY29uc3QgeworICBpZiAoSUQgPT0gSW50ZWdlclR5SUQgJiYgZ2V0U3ViY2xhc3NEYXRhKCkgPCAzMikKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50MzJUeShDKTsKKyAgZWxzZSBpZiAoSUQgPT0gRmxvYXRUeUlEKQorICAgIHJldHVybiBUeXBlOjpnZXREb3VibGVUeShDKTsKKyAgZWxzZQorICAgIHJldHVybiB0aGlzOworfQorCisvLy8gZ2V0U2NhbGFyVHlwZSAtIElmIHRoaXMgaXMgYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZSBlbGVtZW50IHR5cGUsCisvLy8gb3RoZXJ3aXNlIHJldHVybiB0aGlzLgorY29uc3QgVHlwZSAqVHlwZTo6Z2V0U2NhbGFyVHlwZSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KHRoaXMpKQorICAgIHJldHVybiBWVHktPmdldEVsZW1lbnRUeXBlKCk7CisgIHJldHVybiB0aGlzOworfQorCisvLy8gaXNJbnRlZ2VyVHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIEludGVnZXJUeXBlIG9mIHRoZSBzcGVjaWZpZWQgd2lkdGguCitib29sIFR5cGU6OmlzSW50ZWdlclR5KHVuc2lnbmVkIEJpdHdpZHRoKSBjb25zdCB7CisgIHJldHVybiBpc0ludGVnZXJUeSgpICYmIGNhc3Q8SW50ZWdlclR5cGU+KHRoaXMpLT5nZXRCaXRXaWR0aCgpID09IEJpdHdpZHRoOworfQorCisvLy8gaXNJbnRPckludFZlY3RvclR5IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBpbnRlZ2VyIHR5cGUgb3IgYSB2ZWN0b3Igb2YKKy8vLyBpbnRlZ2VyIHR5cGVzLgorLy8vCitib29sIFR5cGU6OmlzSW50T3JJbnRWZWN0b3JUeSgpIGNvbnN0IHsKKyAgaWYgKGlzSW50ZWdlclR5KCkpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChJRCAhPSBUeXBlOjpWZWN0b3JUeUlEKSByZXR1cm4gZmFsc2U7CisgIAorICByZXR1cm4gY2FzdDxWZWN0b3JUeXBlPih0aGlzKS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHkoKTsKK30KKworLy8vIGlzRlBPckZQVmVjdG9yVHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgRlAgdHlwZSBvciBhIHZlY3RvciBvZiBGUCB0eXBlcy4KKy8vLworYm9vbCBUeXBlOjppc0ZQT3JGUFZlY3RvclR5KCkgY29uc3QgeworICBpZiAoSUQgPT0gVHlwZTo6RmxvYXRUeUlEIHx8IElEID09IFR5cGU6OkRvdWJsZVR5SUQgfHwgCisgICAgICBJRCA9PSBUeXBlOjpGUDEyOFR5SUQgfHwgSUQgPT0gVHlwZTo6WDg2X0ZQODBUeUlEIHx8IAorICAgICAgSUQgPT0gVHlwZTo6UFBDX0ZQMTI4VHlJRCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKElEICE9IFR5cGU6OlZlY3RvclR5SUQpIHJldHVybiBmYWxzZTsKKyAgCisgIHJldHVybiBjYXN0PFZlY3RvclR5cGU+KHRoaXMpLT5nZXRFbGVtZW50VHlwZSgpLT5pc0Zsb2F0aW5nUG9pbnRUeSgpOworfQorCisvLyBjYW5Mb3NzbGVzc2x5Qml0Q2FzdFRvIC0gUmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIGNhbiBiZSBjb252ZXJ0ZWQgdG8KKy8vICdUeScgd2l0aG91dCBhbnkgcmVpbnRlcnByZXRhdGlvbiBvZiBiaXRzLiAgRm9yIGV4YW1wbGUsIGk4KiB0byBpMzIqLgorLy8KK2Jvb2wgVHlwZTo6Y2FuTG9zc2xlc3NseUJpdENhc3RUbyhjb25zdCBUeXBlICpUeSkgY29uc3QgeworICAvLyBJZGVudGl0eSBjYXN0IG1lYW5zIG5vIGNoYW5nZSBzbyByZXR1cm4gdHJ1ZQorICBpZiAodGhpcyA9PSBUeSkgCisgICAgcmV0dXJuIHRydWU7CisgIAorICAvLyBUaGV5IGFyZSBub3QgY29udmVydGlibGUgdW5sZXNzIHRoZXkgYXJlIGF0IGxlYXN0IGZpcnN0IGNsYXNzIHR5cGVzCisgIGlmICghdGhpcy0+aXNGaXJzdENsYXNzVHlwZSgpIHx8ICFUeS0+aXNGaXJzdENsYXNzVHlwZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBWZWN0b3IgLT4gVmVjdG9yIGNvbnZlcnNpb25zIGFyZSBhbHdheXMgbG9zc2xlc3MgaWYgdGhlIHR3byB2ZWN0b3IgdHlwZXMKKyAgLy8gaGF2ZSB0aGUgc2FtZSBzaXplLCBvdGhlcndpc2Ugbm90LgorICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqdGhpc1BUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KHRoaXMpKQorICAgIGlmIChjb25zdCBWZWN0b3JUeXBlICp0aGF0UFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oVHkpKQorICAgICAgcmV0dXJuIHRoaXNQVHktPmdldEJpdFdpZHRoKCkgPT0gdGhhdFBUeS0+Z2V0Qml0V2lkdGgoKTsKKworICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgb25seSB2YXJpb3VzIG1pc21hdGNoZXMgb2YgdGhlIGZpcnN0IGNsYXNzIHR5cGVzCisgIC8vIHJlbWFpbmluZyBhbmQgcHRyLT5wdHIuIEp1c3Qgc2VsZWN0IHRoZSBsb3NzbGVzcyBjb252ZXJzaW9ucy4gRXZlcnl0aGluZworICAvLyBlbHNlIGlzIG5vdCBsb3NzbGVzcy4KKyAgaWYgKHRoaXMtPmlzUG9pbnRlclR5KCkpCisgICAgcmV0dXJuIFR5LT5pc1BvaW50ZXJUeSgpOworICByZXR1cm4gZmFsc2U7ICAvLyBPdGhlciB0eXBlcyBoYXZlIG5vIGlkZW50aXR5IHZhbHVlcworfQorCit1bnNpZ25lZCBUeXBlOjpnZXRQcmltaXRpdmVTaXplSW5CaXRzKCkgY29uc3QgeworICBzd2l0Y2ggKGdldFR5cGVJRCgpKSB7CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOiByZXR1cm4gMzI7CisgIGNhc2UgVHlwZTo6RG91YmxlVHlJRDogcmV0dXJuIDY0OworICBjYXNlIFR5cGU6Olg4Nl9GUDgwVHlJRDogcmV0dXJuIDgwOworICBjYXNlIFR5cGU6OkZQMTI4VHlJRDogcmV0dXJuIDEyODsKKyAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOiByZXR1cm4gMTI4OworICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOiByZXR1cm4gY2FzdDxJbnRlZ2VyVHlwZT4odGhpcyktPmdldEJpdFdpZHRoKCk7CisgIGNhc2UgVHlwZTo6VmVjdG9yVHlJRDogIHJldHVybiBjYXN0PFZlY3RvclR5cGU+KHRoaXMpLT5nZXRCaXRXaWR0aCgpOworICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgfQorfQorCisvLy8gZ2V0U2NhbGFyU2l6ZUluQml0cyAtIElmIHRoaXMgaXMgYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZQorLy8vIGdldFByaW1pdGl2ZVNpemVJbkJpdHMgdmFsdWUgZm9yIHRoZSBlbGVtZW50IHR5cGUuIE90aGVyd2lzZSByZXR1cm4gdGhlCisvLy8gZ2V0UHJpbWl0aXZlU2l6ZUluQml0cyB2YWx1ZSBmb3IgdGhpcyB0eXBlLgordW5zaWduZWQgVHlwZTo6Z2V0U2NhbGFyU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNjYWxhclR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworfQorCisvLy8gZ2V0RlBNYW50aXNzYVdpZHRoIC0gUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgbWFudGlzc2Egb2YgdGhpcyB0eXBlLiAgVGhpcworLy8vIGlzIG9ubHkgdmFsaWQgb24gZmxvYXRpbmcgcG9pbnQgdHlwZXMuICBJZiB0aGUgRlAgdHlwZSBkb2VzIG5vdAorLy8vIGhhdmUgYSBzdGFibGUgbWFudGlzc2EgKGUuZy4gcHBjIGxvbmcgZG91YmxlKSwgdGhpcyBtZXRob2QgcmV0dXJucyAtMS4KK2ludCBUeXBlOjpnZXRGUE1hbnRpc3NhV2lkdGgoKSBjb25zdCB7CisgIGlmIChjb25zdCBWZWN0b3JUeXBlICpWVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPih0aGlzKSkKKyAgICByZXR1cm4gVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5nZXRGUE1hbnRpc3NhV2lkdGgoKTsKKyAgYXNzZXJ0KGlzRmxvYXRpbmdQb2ludFR5KCkgJiYgIk5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUhIik7CisgIGlmIChJRCA9PSBGbG9hdFR5SUQpIHJldHVybiAyNDsKKyAgaWYgKElEID09IERvdWJsZVR5SUQpIHJldHVybiA1MzsKKyAgaWYgKElEID09IFg4Nl9GUDgwVHlJRCkgcmV0dXJuIDY0OworICBpZiAoSUQgPT0gRlAxMjhUeUlEKSByZXR1cm4gMTEzOworICBhc3NlcnQoSUQgPT0gUFBDX0ZQMTI4VHlJRCAmJiAidW5rbm93biBmcCB0eXBlIik7CisgIHJldHVybiAtMTsKK30KKworLy8vIGlzU2l6ZWREZXJpdmVkVHlwZSAtIERlcml2ZWQgdHlwZXMgbGlrZSBzdHJ1Y3R1cmVzIGFuZCBhcnJheXMgYXJlIHNpemVkCisvLy8gaWZmIGFsbCBvZiB0aGUgbWVtYmVycyBvZiB0aGUgdHlwZSBhcmUgc2l6ZWQgYXMgd2VsbC4gIFNpbmNlIGFza2luZyBmb3IKKy8vLyB0aGVpciBzaXplIGlzIHJlbGF0aXZlbHkgdW5jb21tb24sIG1vdmUgdGhpcyBvcGVyYXRpb24gb3V0IG9mIGxpbmUuCitib29sIFR5cGU6OmlzU2l6ZWREZXJpdmVkVHlwZSgpIGNvbnN0IHsKKyAgaWYgKHRoaXMtPmlzSW50ZWdlclR5KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGNvbnN0IEFycmF5VHlwZSAqQVR5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPih0aGlzKSkKKyAgICByZXR1cm4gQVR5LT5nZXRFbGVtZW50VHlwZSgpLT5pc1NpemVkKCk7CisKKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlBUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KHRoaXMpKQorICAgIHJldHVybiBQVHktPmdldEVsZW1lbnRUeXBlKCktPmlzU2l6ZWQoKTsKKworICBpZiAoIXRoaXMtPmlzU3RydWN0VHkoKSAmJiAhdGhpcy0+aXNVbmlvblR5KCkpIAorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBPa2F5LCBvdXIgc3RydWN0IGlzIHNpemVkIGlmIGFsbCBvZiB0aGUgZWxlbWVudHMgYXJlLi4uCisgIGZvciAoc3VidHlwZV9pdGVyYXRvciBJID0gc3VidHlwZV9iZWdpbigpLCBFID0gc3VidHlwZV9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCEoKkkpLT5pc1NpemVkKCkpIAorICAgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8gZ2V0Rm9yd2FyZGVkVHlwZUludGVybmFsIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHVuaW9uLWZpbmQKKy8vLyBhbGdvcml0aG0gZm9yIHdoZW4gYSB0eXBlIGlzIGJlaW5nIGZvcndhcmRlZCB0byBhbm90aGVyIHR5cGUuCitjb25zdCBUeXBlICpUeXBlOjpnZXRGb3J3YXJkZWRUeXBlSW50ZXJuYWwoKSBjb25zdCB7CisgIGFzc2VydChGb3J3YXJkVHlwZSAmJiAiVGhpcyB0eXBlIGlzIG5vdCBiZWluZyBmb3J3YXJkZWQgdG8gYW5vdGhlciB0eXBlISIpOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZm9yd2FyZGVkIHR5cGUgaGFzIGJlZW4gZm9yd2FyZGVkIG9uLiAgSWYgc28sIGNvbGxhcHNlCisgIC8vIHRoZSBmb3J3YXJkaW5nIGxpbmtzLgorICBjb25zdCBUeXBlICpSZWFsRm9yd2FyZGVkVHlwZSA9IEZvcndhcmRUeXBlLT5nZXRGb3J3YXJkZWRUeXBlKCk7CisgIGlmICghUmVhbEZvcndhcmRlZFR5cGUpCisgICAgcmV0dXJuIEZvcndhcmRUeXBlOyAgLy8gTm8gaXQncyBub3QgZm9yd2FyZGVkIGFnYWluCisKKyAgLy8gWWVzLCBpdCBpcyBmb3J3YXJkZWQgYWdhaW4uICBGaXJzdCB0aGluZywgYWRkIHRoZSByZWZlcmVuY2UgdG8gdGhlIG5ldworICAvLyBmb3J3YXJkIHR5cGUuCisgIGlmIChSZWFsRm9yd2FyZGVkVHlwZS0+aXNBYnN0cmFjdCgpKQorICAgIFJlYWxGb3J3YXJkZWRUeXBlLT5hZGRSZWYoKTsKKworICAvLyBOb3cgZHJvcCB0aGUgb2xkIHJlZmVyZW5jZS4gIFRoaXMgY291bGQgY2F1c2UgRm9yd2FyZFR5cGUgdG8gZ2V0IGRlbGV0ZWQuCisgIC8vIEZvcndhcmRUeXBlIG11c3QgYmUgYWJzdHJhY3QgYmVjYXVzZSBvbmx5IGFic3RyYWN0IHR5cGVzIGNhbiBoYXZlIHRoZWlyIG93bgorICAvLyBGb3J3YXJkVHlwZXMuCisgIEZvcndhcmRUeXBlLT5kcm9wUmVmKCk7CisKKyAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIHR5cGUuCisgIEZvcndhcmRUeXBlID0gUmVhbEZvcndhcmRlZFR5cGU7CisgIHJldHVybiBGb3J3YXJkVHlwZTsKK30KKwordm9pZCBUeXBlOjpyZWZpbmVBYnN0cmFjdFR5cGUoY29uc3QgRGVyaXZlZFR5cGUgKk9sZFR5LCBjb25zdCBUeXBlICpOZXdUeSkgeworICBsbHZtX3VucmVhY2hhYmxlKCJBdHRlbXB0aW5nIHRvIHJlZmluZSBhIGRlcml2ZWQgdHlwZSEiKTsKK30KK3ZvaWQgVHlwZTo6dHlwZUJlY2FtZUNvbmNyZXRlKGNvbnN0IERlcml2ZWRUeXBlICpBYnNUeSkgeworICBsbHZtX3VucmVhY2hhYmxlKCJEZXJpdmVkVHlwZSBpcyBhbHJlYWR5IGEgY29uY3JldGUgdHlwZSEiKTsKK30KKworCitzdGQ6OnN0cmluZyBUeXBlOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IGdldENvbnRleHQoKS5wSW1wbDsKKyAgVHlwZVByaW50aW5nICZNYXAgPQorICAgIGlzQWJzdHJhY3QoKSA/CisgICAgICBwSW1wbC0+QWJzdHJhY3RUeXBlRGVzY3JpcHRpb25zIDoKKyAgICAgIHBJbXBsLT5Db25jcmV0ZVR5cGVEZXNjcmlwdGlvbnM7CisgIAorICBzdGQ6OnN0cmluZyBEZXNjU3RyOworICByYXdfc3RyaW5nX29zdHJlYW0gRGVzY09TKERlc2NTdHIpOworICBNYXAucHJpbnQodGhpcywgRGVzY09TKTsKKyAgcmV0dXJuIERlc2NPUy5zdHIoKTsKK30KKworCitib29sIFN0cnVjdFR5cGU6OmluZGV4VmFsaWQoY29uc3QgVmFsdWUgKlYpIGNvbnN0IHsKKyAgLy8gU3RydWN0dXJlIGluZGV4ZXMgcmVxdWlyZSAzMi1iaXQgaW50ZWdlciBjb25zdGFudHMuCisgIGlmIChWLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDMyKSkKKyAgICBpZiAoY29uc3QgQ29uc3RhbnRJbnQgKkNVID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFYpKQorICAgICAgcmV0dXJuIGluZGV4VmFsaWQoQ1UtPmdldFpFeHRWYWx1ZSgpKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFN0cnVjdFR5cGU6OmluZGV4VmFsaWQodW5zaWduZWQgVikgY29uc3QgeworICByZXR1cm4gViA8IE51bUNvbnRhaW5lZFR5czsKK30KKworLy8gZ2V0VHlwZUF0SW5kZXggLSBHaXZlbiBhbiBpbmRleCB2YWx1ZSBpbnRvIHRoZSB0eXBlLCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlCisvLyBlbGVtZW50LiAgRm9yIGEgc3RydWN0dXJlIHR5cGUsIHRoaXMgbXVzdCBiZSBhIGNvbnN0YW50IHZhbHVlLi4uCisvLworY29uc3QgVHlwZSAqU3RydWN0VHlwZTo6Z2V0VHlwZUF0SW5kZXgoY29uc3QgVmFsdWUgKlYpIGNvbnN0IHsKKyAgdW5zaWduZWQgSWR4ID0gKHVuc2lnbmVkKWNhc3Q8Q29uc3RhbnRJbnQ+KFYpLT5nZXRaRXh0VmFsdWUoKTsKKyAgcmV0dXJuIGdldFR5cGVBdEluZGV4KElkeCk7Cit9CisKK2NvbnN0IFR5cGUgKlN0cnVjdFR5cGU6OmdldFR5cGVBdEluZGV4KHVuc2lnbmVkIElkeCkgY29uc3QgeworICBhc3NlcnQoaW5kZXhWYWxpZChJZHgpICYmICJJbnZhbGlkIHN0cnVjdHVyZSBpbmRleCEiKTsKKyAgcmV0dXJuIENvbnRhaW5lZFR5c1tJZHhdOworfQorCisKK2Jvb2wgVW5pb25UeXBlOjppbmRleFZhbGlkKGNvbnN0IFZhbHVlICpWKSBjb25zdCB7CisgIC8vIFVuaW9uIGluZGV4ZXMgcmVxdWlyZSAzMi1iaXQgaW50ZWdlciBjb25zdGFudHMuCisgIGlmIChWLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KDMyKSkKKyAgICBpZiAoY29uc3QgQ29uc3RhbnRJbnQgKkNVID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFYpKQorICAgICAgcmV0dXJuIGluZGV4VmFsaWQoQ1UtPmdldFpFeHRWYWx1ZSgpKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFVuaW9uVHlwZTo6aW5kZXhWYWxpZCh1bnNpZ25lZCBWKSBjb25zdCB7CisgIHJldHVybiBWIDwgTnVtQ29udGFpbmVkVHlzOworfQorCisvLyBnZXRUeXBlQXRJbmRleCAtIEdpdmVuIGFuIGluZGV4IHZhbHVlIGludG8gdGhlIHR5cGUsIHJldHVybiB0aGUgdHlwZSBvZiB0aGUKKy8vIGVsZW1lbnQuICBGb3IgYSBzdHJ1Y3R1cmUgdHlwZSwgdGhpcyBtdXN0IGJlIGEgY29uc3RhbnQgdmFsdWUuLi4KKy8vCitjb25zdCBUeXBlICpVbmlvblR5cGU6OmdldFR5cGVBdEluZGV4KGNvbnN0IFZhbHVlICpWKSBjb25zdCB7CisgIHVuc2lnbmVkIElkeCA9ICh1bnNpZ25lZCljYXN0PENvbnN0YW50SW50PihWKS0+Z2V0WkV4dFZhbHVlKCk7CisgIHJldHVybiBnZXRUeXBlQXRJbmRleChJZHgpOworfQorCitjb25zdCBUeXBlICpVbmlvblR5cGU6OmdldFR5cGVBdEluZGV4KHVuc2lnbmVkIElkeCkgY29uc3QgeworICBhc3NlcnQoaW5kZXhWYWxpZChJZHgpICYmICJJbnZhbGlkIHN0cnVjdHVyZSBpbmRleCEiKTsKKyAgcmV0dXJuIENvbnRhaW5lZFR5c1tJZHhdOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZSAnVHlwZScgZGF0YQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY29uc3QgVHlwZSAqVHlwZTo6Z2V0Vm9pZFR5KExMVk1Db250ZXh0ICZDKSB7CisgIHJldHVybiAmQy5wSW1wbC0+Vm9pZFR5OworfQorCitjb25zdCBUeXBlICpUeXBlOjpnZXRMYWJlbFR5KExMVk1Db250ZXh0ICZDKSB7CisgIHJldHVybiAmQy5wSW1wbC0+TGFiZWxUeTsKK30KKworY29uc3QgVHlwZSAqVHlwZTo6Z2V0RmxvYXRUeShMTFZNQ29udGV4dCAmQykgeworICByZXR1cm4gJkMucEltcGwtPkZsb2F0VHk7Cit9CisKK2NvbnN0IFR5cGUgKlR5cGU6OmdldERvdWJsZVR5KExMVk1Db250ZXh0ICZDKSB7CisgIHJldHVybiAmQy5wSW1wbC0+RG91YmxlVHk7Cit9CisKK2NvbnN0IFR5cGUgKlR5cGU6OmdldE1ldGFkYXRhVHkoTExWTUNvbnRleHQgJkMpIHsKKyAgcmV0dXJuICZDLnBJbXBsLT5NZXRhZGF0YVR5OworfQorCitjb25zdCBUeXBlICpUeXBlOjpnZXRYODZfRlA4MFR5KExMVk1Db250ZXh0ICZDKSB7CisgIHJldHVybiAmQy5wSW1wbC0+WDg2X0ZQODBUeTsKK30KKworY29uc3QgVHlwZSAqVHlwZTo6Z2V0RlAxMjhUeShMTFZNQ29udGV4dCAmQykgeworICByZXR1cm4gJkMucEltcGwtPkZQMTI4VHk7Cit9CisKK2NvbnN0IFR5cGUgKlR5cGU6OmdldFBQQ19GUDEyOFR5KExMVk1Db250ZXh0ICZDKSB7CisgIHJldHVybiAmQy5wSW1wbC0+UFBDX0ZQMTI4VHk7Cit9CisKK2NvbnN0IEludGVnZXJUeXBlICpUeXBlOjpnZXRJbnROVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIE4pIHsKKyAgcmV0dXJuIEludGVnZXJUeXBlOjpnZXQoQywgTik7Cit9CisKK2NvbnN0IEludGVnZXJUeXBlICpUeXBlOjpnZXRJbnQxVHkoTExWTUNvbnRleHQgJkMpIHsKKyAgcmV0dXJuICZDLnBJbXBsLT5JbnQxVHk7Cit9CisKK2NvbnN0IEludGVnZXJUeXBlICpUeXBlOjpnZXRJbnQ4VHkoTExWTUNvbnRleHQgJkMpIHsKKyAgcmV0dXJuICZDLnBJbXBsLT5JbnQ4VHk7Cit9CisKK2NvbnN0IEludGVnZXJUeXBlICpUeXBlOjpnZXRJbnQxNlR5KExMVk1Db250ZXh0ICZDKSB7CisgIHJldHVybiAmQy5wSW1wbC0+SW50MTZUeTsKK30KKworY29uc3QgSW50ZWdlclR5cGUgKlR5cGU6OmdldEludDMyVHkoTExWTUNvbnRleHQgJkMpIHsKKyAgcmV0dXJuICZDLnBJbXBsLT5JbnQzMlR5OworfQorCitjb25zdCBJbnRlZ2VyVHlwZSAqVHlwZTo6Z2V0SW50NjRUeShMTFZNQ29udGV4dCAmQykgeworICByZXR1cm4gJkMucEltcGwtPkludDY0VHk7Cit9CisKK2NvbnN0IFBvaW50ZXJUeXBlICpUeXBlOjpnZXRGbG9hdFB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUykgeworICByZXR1cm4gZ2V0RmxvYXRUeShDKS0+Z2V0UG9pbnRlclRvKEFTKTsKK30KKworY29uc3QgUG9pbnRlclR5cGUgKlR5cGU6OmdldERvdWJsZVB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUykgeworICByZXR1cm4gZ2V0RG91YmxlVHkoQyktPmdldFBvaW50ZXJUbyhBUyk7Cit9CisKK2NvbnN0IFBvaW50ZXJUeXBlICpUeXBlOjpnZXRYODZfRlA4MFB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUykgeworICByZXR1cm4gZ2V0WDg2X0ZQODBUeShDKS0+Z2V0UG9pbnRlclRvKEFTKTsKK30KKworY29uc3QgUG9pbnRlclR5cGUgKlR5cGU6OmdldEZQMTI4UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTKSB7CisgIHJldHVybiBnZXRGUDEyOFR5KEMpLT5nZXRQb2ludGVyVG8oQVMpOworfQorCitjb25zdCBQb2ludGVyVHlwZSAqVHlwZTo6Z2V0UFBDX0ZQMTI4UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTKSB7CisgIHJldHVybiBnZXRQUENfRlAxMjhUeShDKS0+Z2V0UG9pbnRlclRvKEFTKTsKK30KKworY29uc3QgUG9pbnRlclR5cGUgKlR5cGU6OmdldEludE5QdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgTiwgdW5zaWduZWQgQVMpIHsKKyAgcmV0dXJuIGdldEludE5UeShDLCBOKS0+Z2V0UG9pbnRlclRvKEFTKTsKK30KKworY29uc3QgUG9pbnRlclR5cGUgKlR5cGU6OmdldEludDFQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMpIHsKKyAgcmV0dXJuIGdldEludDFUeShDKS0+Z2V0UG9pbnRlclRvKEFTKTsKK30KKworY29uc3QgUG9pbnRlclR5cGUgKlR5cGU6OmdldEludDhQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMpIHsKKyAgcmV0dXJuIGdldEludDhUeShDKS0+Z2V0UG9pbnRlclRvKEFTKTsKK30KKworY29uc3QgUG9pbnRlclR5cGUgKlR5cGU6OmdldEludDE2UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTKSB7CisgIHJldHVybiBnZXRJbnQxNlR5KEMpLT5nZXRQb2ludGVyVG8oQVMpOworfQorCitjb25zdCBQb2ludGVyVHlwZSAqVHlwZTo6Z2V0SW50MzJQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMpIHsKKyAgcmV0dXJuIGdldEludDMyVHkoQyktPmdldFBvaW50ZXJUbyhBUyk7Cit9CisKK2NvbnN0IFBvaW50ZXJUeXBlICpUeXBlOjpnZXRJbnQ2NFB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUykgeworICByZXR1cm4gZ2V0SW50NjRUeShDKS0+Z2V0UG9pbnRlclRvKEFTKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJpdmVkIFR5cGUgQ29uc3RydWN0b3JzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gaXNWYWxpZFJldHVyblR5cGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgdmFsaWQgYXMgYSByZXR1cm4KKy8vLyB0eXBlLgorYm9vbCBGdW5jdGlvblR5cGU6OmlzVmFsaWRSZXR1cm5UeXBlKGNvbnN0IFR5cGUgKlJldFR5KSB7CisgIHJldHVybiAhUmV0VHktPmlzRnVuY3Rpb25UeSgpICYmICFSZXRUeS0+aXNMYWJlbFR5KCkgJiYKKyAgICAgICAgICFSZXRUeS0+aXNNZXRhZGF0YVR5KCk7Cit9CisKKy8vLyBpc1ZhbGlkQXJndW1lbnRUeXBlIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGlzIHZhbGlkIGFzIGFuCisvLy8gYXJndW1lbnQgdHlwZS4KK2Jvb2wgRnVuY3Rpb25UeXBlOjppc1ZhbGlkQXJndW1lbnRUeXBlKGNvbnN0IFR5cGUgKkFyZ1R5KSB7CisgIHJldHVybiBBcmdUeS0+aXNGaXJzdENsYXNzVHlwZSgpIHx8IEFyZ1R5LT5pc09wYXF1ZVR5KCk7Cit9CisKK0Z1bmN0aW9uVHlwZTo6RnVuY3Rpb25UeXBlKGNvbnN0IFR5cGUgKlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiAmUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1ZhckFyZ3MpCisgIDogRGVyaXZlZFR5cGUoUmVzdWx0LT5nZXRDb250ZXh0KCksIEZ1bmN0aW9uVHlJRCksIGlzVmFyQXJncyhJc1ZhckFyZ3MpIHsKKyAgQ29udGFpbmVkVHlzID0gcmVpbnRlcnByZXRfY2FzdDxQQVR5cGVIYW5kbGUqPih0aGlzKzEpOworICBOdW1Db250YWluZWRUeXMgPSBQYXJhbXMuc2l6ZSgpICsgMTsgLy8gKyAxIGZvciByZXN1bHQgdHlwZQorICBhc3NlcnQoaXNWYWxpZFJldHVyblR5cGUoUmVzdWx0KSAmJiAiaW52YWxpZCByZXR1cm4gdHlwZSBmb3IgZnVuY3Rpb24iKTsKKworCisgIGJvb2wgaXNBYnN0cmFjdCA9IFJlc3VsdC0+aXNBYnN0cmFjdCgpOworICBuZXcgKCZDb250YWluZWRUeXNbMF0pIFBBVHlwZUhhbmRsZShSZXN1bHQsIHRoaXMpOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgYXNzZXJ0KGlzVmFsaWRBcmd1bWVudFR5cGUoUGFyYW1zW2ldKSAmJgorICAgICAgICAgICAiTm90IGEgdmFsaWQgdHlwZSBmb3IgZnVuY3Rpb24gYXJndW1lbnQhIik7CisgICAgbmV3ICgmQ29udGFpbmVkVHlzW2krMV0pIFBBVHlwZUhhbmRsZShQYXJhbXNbaV0sIHRoaXMpOworICAgIGlzQWJzdHJhY3QgfD0gUGFyYW1zW2ldLT5pc0Fic3RyYWN0KCk7CisgIH0KKworICAvLyBDYWxjdWxhdGUgd2hldGhlciBvciBub3QgdGhpcyB0eXBlIGlzIGFic3RyYWN0CisgIHNldEFic3RyYWN0KGlzQWJzdHJhY3QpOworfQorCitTdHJ1Y3RUeXBlOjpTdHJ1Y3RUeXBlKExMVk1Db250ZXh0ICZDLCAKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+ICZUeXBlcywgYm9vbCBpc1BhY2tlZCkKKyAgOiBDb21wb3NpdGVUeXBlKEMsIFN0cnVjdFR5SUQpIHsKKyAgQ29udGFpbmVkVHlzID0gcmVpbnRlcnByZXRfY2FzdDxQQVR5cGVIYW5kbGUqPih0aGlzICsgMSk7CisgIE51bUNvbnRhaW5lZFR5cyA9IFR5cGVzLnNpemUoKTsKKyAgc2V0U3ViY2xhc3NEYXRhKGlzUGFja2VkKTsKKyAgYm9vbCBpc0Fic3RyYWN0ID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBUeXBlcy5zaXplKCk7ICsraSkgeworICAgIGFzc2VydChUeXBlc1tpXSAmJiAiPG51bGw+IHR5cGUgZm9yIHN0cnVjdHVyZSBmaWVsZCEiKTsKKyAgICBhc3NlcnQoaXNWYWxpZEVsZW1lbnRUeXBlKFR5cGVzW2ldKSAmJgorICAgICAgICAgICAiSW52YWxpZCB0eXBlIGZvciBzdHJ1Y3R1cmUgZWxlbWVudCEiKTsKKyAgICBuZXcgKCZDb250YWluZWRUeXNbaV0pIFBBVHlwZUhhbmRsZShUeXBlc1tpXSwgdGhpcyk7CisgICAgaXNBYnN0cmFjdCB8PSBUeXBlc1tpXS0+aXNBYnN0cmFjdCgpOworICB9CisKKyAgLy8gQ2FsY3VsYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgdHlwZSBpcyBhYnN0cmFjdAorICBzZXRBYnN0cmFjdChpc0Fic3RyYWN0KTsKK30KKworVW5pb25UeXBlOjpVbmlvblR5cGUoTExWTUNvbnRleHQgJkMsY29uc3QgVHlwZSogY29uc3QqIFR5cGVzLCB1bnNpZ25lZCBOdW1UeXBlcykKKyAgOiBDb21wb3NpdGVUeXBlKEMsIFVuaW9uVHlJRCkgeworICBDb250YWluZWRUeXMgPSByZWludGVycHJldF9jYXN0PFBBVHlwZUhhbmRsZSo+KHRoaXMgKyAxKTsKKyAgTnVtQ29udGFpbmVkVHlzID0gTnVtVHlwZXM7CisgIGJvb2wgaXNBYnN0cmFjdCA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtVHlwZXM7ICsraSkgeworICAgIGFzc2VydChUeXBlc1tpXSAmJiAiPG51bGw+IHR5cGUgZm9yIHVuaW9uIGZpZWxkISIpOworICAgIGFzc2VydChpc1ZhbGlkRWxlbWVudFR5cGUoVHlwZXNbaV0pICYmCisgICAgICAgICAgICJJbnZhbGlkIHR5cGUgZm9yIHVuaW9uIGVsZW1lbnQhIik7CisgICAgbmV3ICgmQ29udGFpbmVkVHlzW2ldKSBQQVR5cGVIYW5kbGUoVHlwZXNbaV0sIHRoaXMpOworICAgIGlzQWJzdHJhY3QgfD0gVHlwZXNbaV0tPmlzQWJzdHJhY3QoKTsKKyAgfQorCisgIC8vIENhbGN1bGF0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHR5cGUgaXMgYWJzdHJhY3QKKyAgc2V0QWJzdHJhY3QoaXNBYnN0cmFjdCk7Cit9CisKK0FycmF5VHlwZTo6QXJyYXlUeXBlKGNvbnN0IFR5cGUgKkVsVHlwZSwgdWludDY0X3QgTnVtRWwpCisgIDogU2VxdWVudGlhbFR5cGUoQXJyYXlUeUlELCBFbFR5cGUpIHsKKyAgTnVtRWxlbWVudHMgPSBOdW1FbDsKKworICAvLyBDYWxjdWxhdGUgd2hldGhlciBvciBub3QgdGhpcyB0eXBlIGlzIGFic3RyYWN0CisgIHNldEFic3RyYWN0KEVsVHlwZS0+aXNBYnN0cmFjdCgpKTsKK30KKworVmVjdG9yVHlwZTo6VmVjdG9yVHlwZShjb25zdCBUeXBlICpFbFR5cGUsIHVuc2lnbmVkIE51bUVsKQorICA6IFNlcXVlbnRpYWxUeXBlKFZlY3RvclR5SUQsIEVsVHlwZSkgeworICBOdW1FbGVtZW50cyA9IE51bUVsOworICBzZXRBYnN0cmFjdChFbFR5cGUtPmlzQWJzdHJhY3QoKSk7CisgIGFzc2VydChOdW1FbCA+IDAgJiYgIk51bUVsIG9mIGEgVmVjdG9yVHlwZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIik7CisgIGFzc2VydChpc1ZhbGlkRWxlbWVudFR5cGUoRWxUeXBlKSAmJgorICAgICAgICAgIkVsZW1lbnRzIG9mIGEgVmVjdG9yVHlwZSBtdXN0IGJlIGEgcHJpbWl0aXZlIHR5cGUiKTsKKworfQorCisKK1BvaW50ZXJUeXBlOjpQb2ludGVyVHlwZShjb25zdCBUeXBlICpFLCB1bnNpZ25lZCBBZGRyU3BhY2UpCisgIDogU2VxdWVudGlhbFR5cGUoUG9pbnRlclR5SUQsIEUpIHsKKyAgQWRkcmVzc1NwYWNlID0gQWRkclNwYWNlOworICAvLyBDYWxjdWxhdGUgd2hldGhlciBvciBub3QgdGhpcyB0eXBlIGlzIGFic3RyYWN0CisgIHNldEFic3RyYWN0KEUtPmlzQWJzdHJhY3QoKSk7Cit9CisKK09wYXF1ZVR5cGU6Ok9wYXF1ZVR5cGUoTExWTUNvbnRleHQgJkMpIDogRGVyaXZlZFR5cGUoQywgT3BhcXVlVHlJRCkgeworICBzZXRBYnN0cmFjdCh0cnVlKTsKKyNpZmRlZiBERUJVR19NRVJHRV9UWVBFUworICBERUJVRyhkYmdzKCkgPDwgIkRlcml2ZWQgbmV3IHR5cGU6ICIgPDwgKnRoaXMgPDwgIlxuIik7CisjZW5kaWYKK30KKwordm9pZCBQQVR5cGVIb2xkZXI6OmRlc3Ryb3koKSB7CisgIFR5ID0gMDsKK30KKworLy8gZHJvcEFsbFR5cGVVc2VzIC0gV2hlbiB0aGlzIChhYnN0cmFjdCkgdHlwZSBpcyByZXNvbHZlZCB0byBiZSBlcXVhbCB0bworLy8gYW5vdGhlciAobW9yZSBjb25jcmV0ZSkgdHlwZSwgd2UgbXVzdCBlbGltaW5hdGUgYWxsIHJlZmVyZW5jZXMgdG8gb3RoZXIKKy8vIHR5cGVzLCB0byBhdm9pZCBzb21lIGNpcmN1bGFyIHJlZmVyZW5jZSBwcm9ibGVtcy4KK3ZvaWQgRGVyaXZlZFR5cGU6OmRyb3BBbGxUeXBlVXNlcygpIHsKKyAgaWYgKE51bUNvbnRhaW5lZFR5cyAhPSAwKSB7CisgICAgLy8gVGhlIHR5cGUgbXVzdCBzdGF5IGFic3RyYWN0LiAgVG8gZG8gdGhpcywgd2UgaW5zZXJ0IGEgcG9pbnRlciB0byBhIHR5cGUKKyAgICAvLyB0aGF0IHdpbGwgbmV2ZXIgZ2V0IHJlc29sdmVkLCB0aHVzIHdpbGwgYWx3YXlzIGJlIGFic3RyYWN0LgorICAgIENvbnRhaW5lZFR5c1swXSA9IGdldENvbnRleHQoKS5wSW1wbC0+QWx3YXlzT3BhcXVlVHk7CisKKyAgICAvLyBDaGFuZ2UgdGhlIHJlc3Qgb2YgdGhlIHR5cGVzIHRvIGJlIEludDMyVHkncy4gIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgd2UKKyAgICAvLyBwaWNrIHNvIGxvbmcgYXMgaXQgZG9lc24ndCBwb2ludCBiYWNrIHRvIHRoaXMgdHlwZS4gIFdlIGNob29zZSBzb21ldGhpbmcKKyAgICAvLyBjb25jcmV0ZSB0byBhdm9pZCBvdmVyaGVhZCBmb3IgYWRkaW5nIHRvIEFic3RyYWN0VHlwZVVzZXIgbGlzdHMgYW5kCisgICAgLy8gc3R1ZmYuCisgICAgY29uc3QgVHlwZSAqQ29uY3JldGVUeSA9IFR5cGU6OmdldEludDMyVHkoZ2V0Q29udGV4dCgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gTnVtQ29udGFpbmVkVHlzOyBpICE9IGU7ICsraSkKKyAgICAgIENvbnRhaW5lZFR5c1tpXSA9IENvbmNyZXRlVHk7CisgIH0KK30KKworCituYW1lc3BhY2UgeworCisvLy8gVHlwZVByb21vdGlvbkdyYXBoIGFuZCBncmFwaCB0cmFpdHMgLSB0aGlzIGlzIGRlc2lnbmVkIHRvIGFsbG93IHVzIHRvIGRvCisvLy8gZWZmaWNpZW50IFNDQyBwcm9jZXNzaW5nIG9mIHR5cGUgZ3JhcGhzLiAgVGhpcyBpcyB0aGUgZXhhY3Qgc2FtZSBhcworLy8vIEdyYXBoVHJhaXRzPFR5cGUqPiwgZXhjZXB0IHRoYXQgd2UgcHJldGVuZCB0aGF0IGNvbmNyZXRlIHR5cGVzIGhhdmUgbm8KKy8vLyBjaGlsZHJlbiB0byBhdm9pZCBwcm9jZXNzaW5nIHRoZW0uCitzdHJ1Y3QgVHlwZVByb21vdGlvbkdyYXBoIHsKKyAgVHlwZSAqVHk7CisgIFR5cGVQcm9tb3Rpb25HcmFwaChUeXBlICpUKSA6IFR5KFQpIHt9Cit9OworCit9CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFR5cGVQcm9tb3Rpb25HcmFwaD4geworICAgIHR5cGVkZWYgVHlwZSBOb2RlVHlwZTsKKyAgICB0eXBlZGVmIFR5cGU6OnN1YnR5cGVfaXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisKKyAgICBzdGF0aWMgaW5saW5lIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoVHlwZVByb21vdGlvbkdyYXBoIEcpIHsgcmV0dXJuIEcuVHk7IH0KKyAgICBzdGF0aWMgaW5saW5lIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVUeXBlICpOKSB7CisgICAgICBpZiAoTi0+aXNBYnN0cmFjdCgpKQorICAgICAgICByZXR1cm4gTi0+c3VidHlwZV9iZWdpbigpOworICAgICAgLy8gTm8gbmVlZCB0byBwcm9jZXNzIGNoaWxkcmVuIG9mIGNvbmNyZXRlIHR5cGVzLgorICAgICAgcmV0dXJuIE4tPnN1YnR5cGVfZW5kKCk7CisgICAgfQorICAgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7CisgICAgICByZXR1cm4gTi0+c3VidHlwZV9lbmQoKTsKKyAgICB9CisgIH07Cit9CisKKworLy8gUHJvbW90ZUFic3RyYWN0VG9Db25jcmV0ZSAtIFRoaXMgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCB3YWxrcyBhIHR5cGUKKy8vIGdyYXBoIGNhbGN1bGF0aW5nIHdoZXRoZXIgb3Igbm90IGEgdHlwZSBpcyBhYnN0cmFjdC4KKy8vCit2b2lkIFR5cGU6OlByb21vdGVBYnN0cmFjdFRvQ29uY3JldGUoKSB7CisgIGlmICghaXNBYnN0cmFjdCgpKSByZXR1cm47CisKKyAgc2NjX2l0ZXJhdG9yPFR5cGVQcm9tb3Rpb25HcmFwaD4gU0kgPSBzY2NfYmVnaW4oVHlwZVByb21vdGlvbkdyYXBoKHRoaXMpKTsKKyAgc2NjX2l0ZXJhdG9yPFR5cGVQcm9tb3Rpb25HcmFwaD4gU0UgPSBzY2NfZW5kICAoVHlwZVByb21vdGlvbkdyYXBoKHRoaXMpKTsKKworICBmb3IgKDsgU0kgIT0gU0U7ICsrU0kpIHsKKyAgICBzdGQ6OnZlY3RvcjxUeXBlKj4gJlNDQyA9ICpTSTsKKworICAgIC8vIENvbmNyZXRlIHR5cGVzIGFyZSBsZWF2ZXMgaW4gdGhlIHRyZWUuICBTaW5jZSBhbiBTQ0Mgd2lsbCBlaXRoZXIgYmUgYWxsCisgICAgLy8gYWJzdHJhY3Qgb3IgYWxsIGNvbmNyZXRlLCB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIHR5cGUuCisgICAgaWYgKCFTQ0NbMF0tPmlzQWJzdHJhY3QoKSkgY29udGludWU7CisgICAgCisgICAgaWYgKFNDQ1swXS0+aXNPcGFxdWVUeSgpKQorICAgICAgcmV0dXJuOyAgICAgLy8gTm90IGdvaW5nIHRvIGJlIGNvbmNyZXRlLCBzb3JyeS4KKworICAgIC8vIElmIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgYWxsIG9mIHRoZSB0eXBlcyBpbiB0aGlzIFNDQyBhcmUgY29uY3JldGUsCisgICAgLy8gdGhlbiB0aGlzIFNDQyBpcyBub3cgY29uY3JldGUgYXMgd2VsbC4gIElmIG5vdCwgbmVpdGhlciB0aGlzIFNDQywgbm9yCisgICAgLy8gYW55IHBhcmVudCBTQ0NzIHdpbGwgYmUgY29uY3JldGUsIHNvIHdlIG1pZ2h0IGFzIHdlbGwganVzdCBleGl0LgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTQ0Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGZvciAoVHlwZTo6c3VidHlwZV9pdGVyYXRvciBDSSA9IFNDQ1tpXS0+c3VidHlwZV9iZWdpbigpLAorICAgICAgICAgICAgIEUgPSBTQ0NbaV0tPnN1YnR5cGVfZW5kKCk7IENJICE9IEU7ICsrQ0kpCisgICAgICAgIGlmICgoKkNJKS0+aXNBYnN0cmFjdCgpKQorICAgICAgICAgIC8vIElmIHRoZSBjaGlsZCB0eXBlIGlzIGluIG91ciBTQ0MsIGl0IGRvZXNuJ3QgbWFrZSB0aGUgZW50aXJlIFNDQworICAgICAgICAgIC8vIGFic3RyYWN0IHVubGVzcyB0aGVyZSBpcyBhIG5vbi1TQ0MgYWJzdHJhY3QgdHlwZS4KKyAgICAgICAgICBpZiAoc3RkOjpmaW5kKFNDQy5iZWdpbigpLCBTQ0MuZW5kKCksICpDSSkgPT0gU0NDLmVuZCgpKQorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgIC8vIE5vdCBnb2luZyB0byBiZSBjb25jcmV0ZSwgc29ycnkuCisKKyAgICAvLyBPa2F5LCB3ZSBqdXN0IGRpc2NvdmVyZWQgdGhpcyB3aG9sZSBTQ0MgaXMgbm93IGNvbmNyZXRlLCBtYXJrIGl0IGFzCisgICAgLy8gc3VjaCEKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU0NDLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGFzc2VydChTQ0NbaV0tPmlzQWJzdHJhY3QoKSAmJiAiV2h5IGFyZSB3ZSBwcm9jZXNzaW5nIGNvbmNyZXRlIHR5cGVzPyIpOworCisgICAgICBTQ0NbaV0tPnNldEFic3RyYWN0KGZhbHNlKTsKKyAgICB9CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU0NDLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGFzc2VydCghU0NDW2ldLT5pc0Fic3RyYWN0KCkgJiYgIkNvbmNyZXRlIHR5cGUgYmVjYW1lIGFic3RyYWN0PyIpOworICAgICAgLy8gVGhlIHR5cGUganVzdCBiZWNhbWUgY29uY3JldGUsIG5vdGlmeSBhbGwgdXNlcnMhCisgICAgICBjYXN0PERlcml2ZWRUeXBlPihTQ0NbaV0pLT5ub3RpZnlVc2VzVGhhdFR5cGVCZWNhbWVDb25jcmV0ZSgpOworICAgIH0KKyAgfQorfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICBUeXBlIFN0cnVjdHVyYWwgRXF1YWxpdHkgVGVzdGluZworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVHlwZXNFcXVhbCAtIFR3byB0eXBlcyBhcmUgY29uc2lkZXJlZCBzdHJ1Y3R1cmFsbHkgZXF1YWwgaWYgdGhleSBoYXZlIHRoZQorLy8gc2FtZSAic2hhcGUiOiBFdmVyeSBsZXZlbCBhbmQgZWxlbWVudCBvZiB0aGUgdHlwZXMgaGF2ZSBpZGVudGljYWwgcHJpbWl0aXZlCisvLyBJRCdzLCBhbmQgdGhlIGdyYXBocyBoYXZlIHRoZSBzYW1lIGVkZ2VzL25vZGVzIGluIHRoZW0uICBOb2RlcyBkbyBub3QgaGF2ZSB0bworLy8gYmUgcG9pbnRlciBlcXVhbHMgdG8gYmUgZXF1aXZhbGVudCB0aG91Z2guICBUaGlzIHVzZXMgYW4gb3B0aW1pc3RpYyBhbGdvcml0aG0KKy8vIHRoYXQgYXNzdW1lcyB0aGF0IHR3byBncmFwaHMgYXJlIHRoZSBzYW1lIHVudGlsIHByb3ZlbiBvdGhlcndpc2UuCisvLworc3RhdGljIGJvb2wgVHlwZXNFcXVhbChjb25zdCBUeXBlICpUeSwgY29uc3QgVHlwZSAqVHkyLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxjb25zdCBUeXBlICosIGNvbnN0IFR5cGUgKj4gJkVxVHlwZXMpIHsKKyAgaWYgKFR5ID09IFR5MikgcmV0dXJuIHRydWU7CisgIGlmIChUeS0+Z2V0VHlwZUlEKCkgIT0gVHkyLT5nZXRUeXBlSUQoKSkgcmV0dXJuIGZhbHNlOworICBpZiAoVHktPmlzT3BhcXVlVHkoKSkKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBUd28gdW5lcXVhbCBvcGFxdWUgdHlwZXMgYXJlIG5ldmVyIGVxdWFsCisKKyAgc3RkOjptYXA8Y29uc3QgVHlwZSosIGNvbnN0IFR5cGUqPjo6aXRlcmF0b3IgSXQgPSBFcVR5cGVzLmZpbmQoVHkpOworICBpZiAoSXQgIT0gRXFUeXBlcy5lbmQoKSkKKyAgICByZXR1cm4gSXQtPnNlY29uZCA9PSBUeTI7ICAgIC8vIExvb3BpbmcgYmFjayBvbiBhIHR5cGUsIGNoZWNrIGZvciBlcXVhbGl0eQorCisgIC8vIE90aGVyd2lzZSwgYWRkIHRoZSBtYXBwaW5nIHRvIHRoZSB0YWJsZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0CisgIC8vIHJlY3Vyc2lvbiBvbiB0aGUgdHlwZXMuLi4KKyAgRXFUeXBlcy5pbnNlcnQoSXQsIHN0ZDo6bWFrZV9wYWlyKFR5LCBUeTIpKTsKKworICAvLyBUd28gcmVhbGx5IGFubm95aW5nIHNwZWNpYWwgY2FzZXMgdGhhdCBicmVha3MgYW4gb3RoZXJ3aXNlIG5pY2Ugc2ltcGxlCisgIC8vIGFsZ29yaXRobSBpcyB0aGUgZmFjdCB0aGF0IGFycmF5dHlwZXMgaGF2ZSBzaXplcyB0aGF0IGRpZmZlcmVudGlhdGVzIHR5cGVzLAorICAvLyBhbmQgdGhhdCBmdW5jdGlvbiB0eXBlcyBjYW4gYmUgdmFyYXJncyBvciBub3QuICBDb25zaWRlciB0aGlzIG5vdy4KKyAgLy8KKyAgaWYgKGNvbnN0IEludGVnZXJUeXBlICpJVHkgPSBkeW5fY2FzdDxJbnRlZ2VyVHlwZT4oVHkpKSB7CisgICAgY29uc3QgSW50ZWdlclR5cGUgKklUeTIgPSBjYXN0PEludGVnZXJUeXBlPihUeTIpOworICAgIHJldHVybiBJVHktPmdldEJpdFdpZHRoKCkgPT0gSVR5Mi0+Z2V0Qml0V2lkdGgoKTsKKyAgfQorICAKKyAgaWYgKGNvbnN0IFBvaW50ZXJUeXBlICpQVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oVHkpKSB7CisgICAgY29uc3QgUG9pbnRlclR5cGUgKlBUeTIgPSBjYXN0PFBvaW50ZXJUeXBlPihUeTIpOworICAgIHJldHVybiBQVHktPmdldEFkZHJlc3NTcGFjZSgpID09IFBUeTItPmdldEFkZHJlc3NTcGFjZSgpICYmCisgICAgICAgICAgIFR5cGVzRXF1YWwoUFR5LT5nZXRFbGVtZW50VHlwZSgpLCBQVHkyLT5nZXRFbGVtZW50VHlwZSgpLCBFcVR5cGVzKTsKKyAgfQorICAKKyAgaWYgKGNvbnN0IFN0cnVjdFR5cGUgKlNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5KSkgeworICAgIGNvbnN0IFN0cnVjdFR5cGUgKlNUeTIgPSBjYXN0PFN0cnVjdFR5cGU+KFR5Mik7CisgICAgaWYgKFNUeS0+Z2V0TnVtRWxlbWVudHMoKSAhPSBTVHkyLT5nZXROdW1FbGVtZW50cygpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKFNUeS0+aXNQYWNrZWQoKSAhPSBTVHkyLT5pc1BhY2tlZCgpKSByZXR1cm4gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNUeTItPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKCFUeXBlc0VxdWFsKFNUeS0+Z2V0RWxlbWVudFR5cGUoaSksIFNUeTItPmdldEVsZW1lbnRUeXBlKGkpLCBFcVR5cGVzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBpZiAoY29uc3QgVW5pb25UeXBlICpVVHkgPSBkeW5fY2FzdDxVbmlvblR5cGU+KFR5KSkgeworICAgIGNvbnN0IFVuaW9uVHlwZSAqVVR5MiA9IGNhc3Q8VW5pb25UeXBlPihUeTIpOworICAgIGlmIChVVHktPmdldE51bUVsZW1lbnRzKCkgIT0gVVR5Mi0+Z2V0TnVtRWxlbWVudHMoKSkgcmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBVVHkyLT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICghVHlwZXNFcXVhbChVVHktPmdldEVsZW1lbnRUeXBlKGkpLCBVVHkyLT5nZXRFbGVtZW50VHlwZShpKSwgRXFUeXBlcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgaWYgKGNvbnN0IEFycmF5VHlwZSAqQVR5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihUeSkpIHsKKyAgICBjb25zdCBBcnJheVR5cGUgKkFUeTIgPSBjYXN0PEFycmF5VHlwZT4oVHkyKTsKKyAgICByZXR1cm4gQVR5LT5nZXROdW1FbGVtZW50cygpID09IEFUeTItPmdldE51bUVsZW1lbnRzKCkgJiYKKyAgICAgICAgICAgVHlwZXNFcXVhbChBVHktPmdldEVsZW1lbnRUeXBlKCksIEFUeTItPmdldEVsZW1lbnRUeXBlKCksIEVxVHlwZXMpOworICB9CisgIAorICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqUFR5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oVHkpKSB7CisgICAgY29uc3QgVmVjdG9yVHlwZSAqUFR5MiA9IGNhc3Q8VmVjdG9yVHlwZT4oVHkyKTsKKyAgICByZXR1cm4gUFR5LT5nZXROdW1FbGVtZW50cygpID09IFBUeTItPmdldE51bUVsZW1lbnRzKCkgJiYKKyAgICAgICAgICAgVHlwZXNFcXVhbChQVHktPmdldEVsZW1lbnRUeXBlKCksIFBUeTItPmdldEVsZW1lbnRUeXBlKCksIEVxVHlwZXMpOworICB9CisgIAorICBpZiAoY29uc3QgRnVuY3Rpb25UeXBlICpGVHkgPSBkeW5fY2FzdDxGdW5jdGlvblR5cGU+KFR5KSkgeworICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlR5MiA9IGNhc3Q8RnVuY3Rpb25UeXBlPihUeTIpOworICAgIGlmIChGVHktPmlzVmFyQXJnKCkgIT0gRlR5Mi0+aXNWYXJBcmcoKSB8fAorICAgICAgICBGVHktPmdldE51bVBhcmFtcygpICE9IEZUeTItPmdldE51bVBhcmFtcygpIHx8CisgICAgICAgICFUeXBlc0VxdWFsKEZUeS0+Z2V0UmV0dXJuVHlwZSgpLCBGVHkyLT5nZXRSZXR1cm5UeXBlKCksIEVxVHlwZXMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVHkyLT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmICghVHlwZXNFcXVhbChGVHktPmdldFBhcmFtVHlwZShpKSwgRlR5Mi0+Z2V0UGFyYW1UeXBlKGkpLCBFcVR5cGVzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBkZXJpdmVkIHR5cGUhIik7CisgIHJldHVybiBmYWxzZTsKK30KKworbmFtZXNwYWNlIGxsdm0geyAvLyBpbiBuYW1lc3BhY2UgbGx2bSBzbyBmaW5kYWJsZSBieSBBREwKK3N0YXRpYyBib29sIFR5cGVzRXF1YWwoY29uc3QgVHlwZSAqVHksIGNvbnN0IFR5cGUgKlR5MikgeworICBzdGQ6Om1hcDxjb25zdCBUeXBlICosIGNvbnN0IFR5cGUgKj4gRXFUeXBlczsKKyAgcmV0dXJuIDo6VHlwZXNFcXVhbChUeSwgVHkyLCBFcVR5cGVzKTsKK30KK30KKworLy8gQWJzdHJhY3RUeXBlSGFzQ3ljbGVUaHJvdWdoIC0gUmV0dXJuIHRydWUgdGhlcmUgaXMgYSBwYXRoIGZyb20gQ3VyVHkgdG8KKy8vIFRhcmdldFR5IGluIHRoZSB0eXBlIGdyYXBoLiAgV2Uga25vdyB0aGF0IFR5IGlzIGFuIGFic3RyYWN0IHR5cGUsIHNvIGlmIHdlCisvLyBldmVyIHJlYWNoIGEgbm9uLWFic3RyYWN0IHR5cGUsIHdlIGtub3cgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHNlYXJjaCB0aGUKKy8vIHN1YmdyYXBoLgorc3RhdGljIGJvb2wgQWJzdHJhY3RUeXBlSGFzQ3ljbGVUaHJvdWdoKGNvbnN0IFR5cGUgKlRhcmdldFR5LCBjb25zdCBUeXBlICpDdXJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgVHlwZSosIDEyOD4gJlZpc2l0ZWRUeXBlcykgeworICBpZiAoVGFyZ2V0VHkgPT0gQ3VyVHkpIHJldHVybiB0cnVlOworICBpZiAoIUN1clR5LT5pc0Fic3RyYWN0KCkpIHJldHVybiBmYWxzZTsKKworICBpZiAoIVZpc2l0ZWRUeXBlcy5pbnNlcnQoQ3VyVHkpKQorICAgIHJldHVybiBmYWxzZTsgIC8vIEFscmVhZHkgYmVlbiBoZXJlLgorCisgIGZvciAoVHlwZTo6c3VidHlwZV9pdGVyYXRvciBJID0gQ3VyVHktPnN1YnR5cGVfYmVnaW4oKSwKKyAgICAgICBFID0gQ3VyVHktPnN1YnR5cGVfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChBYnN0cmFjdFR5cGVIYXNDeWNsZVRocm91Z2goVGFyZ2V0VHksICpJLCBWaXNpdGVkVHlwZXMpKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgQ29uY3JldGVUeXBlSGFzQ3ljbGVUaHJvdWdoKGNvbnN0IFR5cGUgKlRhcmdldFR5LCBjb25zdCBUeXBlICpDdXJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgVHlwZSosIDEyOD4gJlZpc2l0ZWRUeXBlcykgeworICBpZiAoVGFyZ2V0VHkgPT0gQ3VyVHkpIHJldHVybiB0cnVlOworCisgIGlmICghVmlzaXRlZFR5cGVzLmluc2VydChDdXJUeSkpCisgICAgcmV0dXJuIGZhbHNlOyAgLy8gQWxyZWFkeSBiZWVuIGhlcmUuCisKKyAgZm9yIChUeXBlOjpzdWJ0eXBlX2l0ZXJhdG9yIEkgPSBDdXJUeS0+c3VidHlwZV9iZWdpbigpLAorICAgICAgIEUgPSBDdXJUeS0+c3VidHlwZV9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKENvbmNyZXRlVHlwZUhhc0N5Y2xlVGhyb3VnaChUYXJnZXRUeSwgKkksIFZpc2l0ZWRUeXBlcykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gVHlwZUhhc0N5Y2xlVGhyb3VnaEl0c2VsZiAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBoYXMKKy8vLyBhIGN5Y2xlIGJhY2sgdG8gaXRzZWxmLgorCituYW1lc3BhY2UgbGx2bSB7IC8vIGluIG5hbWVzcGFjZSBsbHZtIHNvIGl0J3MgZmluZGFibGUgYnkgQURMCitzdGF0aWMgYm9vbCBUeXBlSGFzQ3ljbGVUaHJvdWdoSXRzZWxmKGNvbnN0IFR5cGUgKlR5KSB7CisgIFNtYWxsUHRyU2V0PGNvbnN0IFR5cGUqLCAxMjg+IFZpc2l0ZWRUeXBlczsKKworICBpZiAoVHktPmlzQWJzdHJhY3QoKSkgeyAgLy8gT3B0aW1pemVkIGNhc2UgZm9yIGFic3RyYWN0IHR5cGVzLgorICAgIGZvciAoVHlwZTo6c3VidHlwZV9pdGVyYXRvciBJID0gVHktPnN1YnR5cGVfYmVnaW4oKSwgRSA9IFR5LT5zdWJ0eXBlX2VuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpCisgICAgICBpZiAoQWJzdHJhY3RUeXBlSGFzQ3ljbGVUaHJvdWdoKFR5LCAqSSwgVmlzaXRlZFR5cGVzKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgZm9yIChUeXBlOjpzdWJ0eXBlX2l0ZXJhdG9yIEkgPSBUeS0+c3VidHlwZV9iZWdpbigpLCBFID0gVHktPnN1YnR5cGVfZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIGlmIChDb25jcmV0ZVR5cGVIYXNDeWNsZVRocm91Z2goVHksICpJLCBWaXNpdGVkVHlwZXMpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGdW5jdGlvbiBUeXBlIEZhY3RvcnkgYW5kIFZhbHVlIENsYXNzLi4uCisvLworY29uc3QgSW50ZWdlclR5cGUgKkludGVnZXJUeXBlOjpnZXQoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIE51bUJpdHMpIHsKKyAgYXNzZXJ0KE51bUJpdHMgPj0gTUlOX0lOVF9CSVRTICYmICJiaXR3aWR0aCB0b28gc21hbGwiKTsKKyAgYXNzZXJ0KE51bUJpdHMgPD0gTUFYX0lOVF9CSVRTICYmICJiaXR3aWR0aCB0b28gbGFyZ2UiKTsKKworICAvLyBDaGVjayBmb3IgdGhlIGJ1aWx0LWluIGludGVnZXIgdHlwZXMKKyAgc3dpdGNoIChOdW1CaXRzKSB7CisgIGNhc2UgIDE6IHJldHVybiBjYXN0PEludGVnZXJUeXBlPihUeXBlOjpnZXRJbnQxVHkoQykpOworICBjYXNlICA4OiByZXR1cm4gY2FzdDxJbnRlZ2VyVHlwZT4oVHlwZTo6Z2V0SW50OFR5KEMpKTsKKyAgY2FzZSAxNjogcmV0dXJuIGNhc3Q8SW50ZWdlclR5cGU+KFR5cGU6OmdldEludDE2VHkoQykpOworICBjYXNlIDMyOiByZXR1cm4gY2FzdDxJbnRlZ2VyVHlwZT4oVHlwZTo6Z2V0SW50MzJUeShDKSk7CisgIGNhc2UgNjQ6IHJldHVybiBjYXN0PEludGVnZXJUeXBlPihUeXBlOjpnZXRJbnQ2NFR5KEMpKTsKKyAgZGVmYXVsdDogCisgICAgYnJlYWs7CisgIH0KKworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gQy5wSW1wbDsKKyAgCisgIEludGVnZXJWYWxUeXBlIElWVChOdW1CaXRzKTsKKyAgSW50ZWdlclR5cGUgKklUeSA9IDA7CisgIAorICAvLyBGaXJzdCwgc2VlIGlmIHRoZSB0eXBlIGlzIGFscmVhZHkgaW4gdGhlIHRhYmxlLCBmb3Igd2hpY2gKKyAgLy8gYSByZWFkZXIgbG9jayBzdWZmaWNlcy4KKyAgSVR5ID0gcEltcGwtPkludGVnZXJUeXBlcy5nZXQoSVZUKTsKKyAgICAKKyAgaWYgKCFJVHkpIHsKKyAgICAvLyBWYWx1ZSBub3QgZm91bmQuICBEZXJpdmUgYSBuZXcgdHlwZSEKKyAgICBJVHkgPSBuZXcgSW50ZWdlclR5cGUoQywgTnVtQml0cyk7CisgICAgcEltcGwtPkludGVnZXJUeXBlcy5hZGQoSVZULCBJVHkpOworICB9CisjaWZkZWYgREVCVUdfTUVSR0VfVFlQRVMKKyAgREVCVUcoZGJncygpIDw8ICJEZXJpdmVkIG5ldyB0eXBlOiAiIDw8ICpJVHkgPDwgIlxuIik7CisjZW5kaWYKKyAgcmV0dXJuIElUeTsKK30KKworYm9vbCBJbnRlZ2VyVHlwZTo6aXNQb3dlck9mMkJ5dGVXaWR0aCgpIGNvbnN0IHsKKyAgdW5zaWduZWQgQml0V2lkdGggPSBnZXRCaXRXaWR0aCgpOworICByZXR1cm4gKEJpdFdpZHRoID4gNykgJiYgaXNQb3dlck9mMl8zMihCaXRXaWR0aCk7Cit9CisKK0FQSW50IEludGVnZXJUeXBlOjpnZXRNYXNrKCkgY29uc3QgeworICByZXR1cm4gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShnZXRCaXRXaWR0aCgpKTsKK30KKworRnVuY3Rpb25WYWxUeXBlIEZ1bmN0aW9uVmFsVHlwZTo6Z2V0KGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQpIHsKKyAgLy8gQnVpbGQgdXAgYSBGdW5jdGlvblZhbFR5cGUKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSAqPiBQYXJhbVR5cGVzOworICBQYXJhbVR5cGVzLnJlc2VydmUoRlQtPmdldE51bVBhcmFtcygpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2kpCisgICAgUGFyYW1UeXBlcy5wdXNoX2JhY2soRlQtPmdldFBhcmFtVHlwZShpKSk7CisgIHJldHVybiBGdW5jdGlvblZhbFR5cGUoRlQtPmdldFJldHVyblR5cGUoKSwgUGFyYW1UeXBlcywgRlQtPmlzVmFyQXJnKCkpOworfQorCisKKy8vIEZ1bmN0aW9uVHlwZTo6Z2V0IC0gVGhlIGZhY3RvcnkgZnVuY3Rpb24gZm9yIHRoZSBGdW5jdGlvblR5cGUgY2xhc3MuLi4KK0Z1bmN0aW9uVHlwZSAqRnVuY3Rpb25UeXBlOjpnZXQoY29uc3QgVHlwZSAqUmV0dXJuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+ICZQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWYXJBcmcpIHsKKyAgRnVuY3Rpb25WYWxUeXBlIFZUKFJldHVyblR5cGUsIFBhcmFtcywgaXNWYXJBcmcpOworICBGdW5jdGlvblR5cGUgKkZUID0gMDsKKyAgCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBSZXR1cm5UeXBlLT5nZXRDb250ZXh0KCkucEltcGw7CisgIAorICBGVCA9IHBJbXBsLT5GdW5jdGlvblR5cGVzLmdldChWVCk7CisgIAorICBpZiAoIUZUKSB7CisgICAgRlQgPSAoRnVuY3Rpb25UeXBlKikgb3BlcmF0b3IgbmV3KHNpemVvZihGdW5jdGlvblR5cGUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQQVR5cGVIYW5kbGUpKihQYXJhbXMuc2l6ZSgpKzEpKTsKKyAgICBuZXcgKEZUKSBGdW5jdGlvblR5cGUoUmV0dXJuVHlwZSwgUGFyYW1zLCBpc1ZhckFyZyk7CisgICAgcEltcGwtPkZ1bmN0aW9uVHlwZXMuYWRkKFZULCBGVCk7CisgIH0KKworI2lmZGVmIERFQlVHX01FUkdFX1RZUEVTCisgIERFQlVHKGRiZ3MoKSA8PCAiRGVyaXZlZCBuZXcgdHlwZTogIiA8PCBGVCA8PCAiXG4iKTsKKyNlbmRpZgorICByZXR1cm4gRlQ7Cit9CisKK0FycmF5VHlwZSAqQXJyYXlUeXBlOjpnZXQoY29uc3QgVHlwZSAqRWxlbWVudFR5cGUsIHVpbnQ2NF90IE51bUVsZW1lbnRzKSB7CisgIGFzc2VydChFbGVtZW50VHlwZSAmJiAiQ2FuJ3QgZ2V0IGFycmF5IG9mIDxudWxsPiB0eXBlcyEiKTsKKyAgYXNzZXJ0KGlzVmFsaWRFbGVtZW50VHlwZShFbGVtZW50VHlwZSkgJiYgIkludmFsaWQgdHlwZSBmb3IgYXJyYXkgZWxlbWVudCEiKTsKKworICBBcnJheVZhbFR5cGUgQVZUKEVsZW1lbnRUeXBlLCBOdW1FbGVtZW50cyk7CisgIEFycmF5VHlwZSAqQVQgPSAwOworCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBFbGVtZW50VHlwZS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICAKKyAgQVQgPSBwSW1wbC0+QXJyYXlUeXBlcy5nZXQoQVZUKTsKKyAgICAgIAorICBpZiAoIUFUKSB7CisgICAgLy8gVmFsdWUgbm90IGZvdW5kLiAgRGVyaXZlIGEgbmV3IHR5cGUhCisgICAgcEltcGwtPkFycmF5VHlwZXMuYWRkKEFWVCwgQVQgPSBuZXcgQXJyYXlUeXBlKEVsZW1lbnRUeXBlLCBOdW1FbGVtZW50cykpOworICB9CisjaWZkZWYgREVCVUdfTUVSR0VfVFlQRVMKKyAgREVCVUcoZGJncygpIDw8ICJEZXJpdmVkIG5ldyB0eXBlOiAiIDw8ICpBVCA8PCAiXG4iKTsKKyNlbmRpZgorICByZXR1cm4gQVQ7Cit9CisKK2Jvb2wgQXJyYXlUeXBlOjppc1ZhbGlkRWxlbWVudFR5cGUoY29uc3QgVHlwZSAqRWxlbVR5KSB7CisgIHJldHVybiAhRWxlbVR5LT5pc1ZvaWRUeSgpICYmICFFbGVtVHktPmlzTGFiZWxUeSgpICYmCisgICAgICAgICAhRWxlbVR5LT5pc01ldGFkYXRhVHkoKSAmJiAhRWxlbVR5LT5pc0Z1bmN0aW9uVHkoKTsKK30KKworVmVjdG9yVHlwZSAqVmVjdG9yVHlwZTo6Z2V0KGNvbnN0IFR5cGUgKkVsZW1lbnRUeXBlLCB1bnNpZ25lZCBOdW1FbGVtZW50cykgeworICBhc3NlcnQoRWxlbWVudFR5cGUgJiYgIkNhbid0IGdldCB2ZWN0b3Igb2YgPG51bGw+IHR5cGVzISIpOworCisgIFZlY3RvclZhbFR5cGUgUFZUKEVsZW1lbnRUeXBlLCBOdW1FbGVtZW50cyk7CisgIFZlY3RvclR5cGUgKlBUID0gMDsKKyAgCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBFbGVtZW50VHlwZS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICAKKyAgUFQgPSBwSW1wbC0+VmVjdG9yVHlwZXMuZ2V0KFBWVCk7CisgICAgCisgIGlmICghUFQpIHsKKyAgICBwSW1wbC0+VmVjdG9yVHlwZXMuYWRkKFBWVCwgUFQgPSBuZXcgVmVjdG9yVHlwZShFbGVtZW50VHlwZSwgTnVtRWxlbWVudHMpKTsKKyAgfQorI2lmZGVmIERFQlVHX01FUkdFX1RZUEVTCisgIERFQlVHKGRiZ3MoKSA8PCAiRGVyaXZlZCBuZXcgdHlwZTogIiA8PCAqUFQgPDwgIlxuIik7CisjZW5kaWYKKyAgcmV0dXJuIFBUOworfQorCitib29sIFZlY3RvclR5cGU6OmlzVmFsaWRFbGVtZW50VHlwZShjb25zdCBUeXBlICpFbGVtVHkpIHsKKyAgcmV0dXJuIEVsZW1UeS0+aXNJbnRlZ2VyVHkoKSB8fCBFbGVtVHktPmlzRmxvYXRpbmdQb2ludFR5KCkgfHwKKyAgICAgICAgIEVsZW1UeS0+aXNPcGFxdWVUeSgpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3RydWN0IFR5cGUgRmFjdG9yeS4uLgorLy8KKworU3RydWN0VHlwZSAqU3RydWN0VHlwZTo6Z2V0KExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiAmRVR5cGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUGFja2VkKSB7CisgIFN0cnVjdFZhbFR5cGUgU1RWKEVUeXBlcywgaXNQYWNrZWQpOworICBTdHJ1Y3RUeXBlICpTVCA9IDA7CisgIAorICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gQ29udGV4dC5wSW1wbDsKKyAgCisgIFNUID0gcEltcGwtPlN0cnVjdFR5cGVzLmdldChTVFYpOworICAgIAorICBpZiAoIVNUKSB7CisgICAgLy8gVmFsdWUgbm90IGZvdW5kLiAgRGVyaXZlIGEgbmV3IHR5cGUhCisgICAgU1QgPSAoU3RydWN0VHlwZSopIG9wZXJhdG9yIG5ldyhzaXplb2YoU3RydWN0VHlwZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBBVHlwZUhhbmRsZSkgKiBFVHlwZXMuc2l6ZSgpKTsKKyAgICBuZXcgKFNUKSBTdHJ1Y3RUeXBlKENvbnRleHQsIEVUeXBlcywgaXNQYWNrZWQpOworICAgIHBJbXBsLT5TdHJ1Y3RUeXBlcy5hZGQoU1RWLCBTVCk7CisgIH0KKyNpZmRlZiBERUJVR19NRVJHRV9UWVBFUworICBERUJVRyhkYmdzKCkgPDwgIkRlcml2ZWQgbmV3IHR5cGU6ICIgPDwgKlNUIDw8ICJcbiIpOworI2VuZGlmCisgIHJldHVybiBTVDsKK30KKworU3RydWN0VHlwZSAqU3RydWN0VHlwZTo6Z2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBjb25zdCBUeXBlICp0eXBlLCAuLi4pIHsKKyAgdmFfbGlzdCBhcDsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgbGx2bTo6VHlwZSo+IFN0cnVjdEZpZWxkczsKKyAgdmFfc3RhcnQoYXAsIHR5cGUpOworICB3aGlsZSAodHlwZSkgeworICAgIFN0cnVjdEZpZWxkcy5wdXNoX2JhY2sodHlwZSk7CisgICAgdHlwZSA9IHZhX2FyZyhhcCwgbGx2bTo6VHlwZSopOworICB9CisgIHJldHVybiBsbHZtOjpTdHJ1Y3RUeXBlOjpnZXQoQ29udGV4dCwgU3RydWN0RmllbGRzKTsKK30KKworYm9vbCBTdHJ1Y3RUeXBlOjppc1ZhbGlkRWxlbWVudFR5cGUoY29uc3QgVHlwZSAqRWxlbVR5KSB7CisgIHJldHVybiAhRWxlbVR5LT5pc1ZvaWRUeSgpICYmICFFbGVtVHktPmlzTGFiZWxUeSgpICYmCisgICAgICAgICAhRWxlbVR5LT5pc01ldGFkYXRhVHkoKSAmJiAhRWxlbVR5LT5pc0Z1bmN0aW9uVHkoKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVW5pb24gVHlwZSBGYWN0b3J5Li4uCisvLworCitVbmlvblR5cGUgKlVuaW9uVHlwZTo6Z2V0KGNvbnN0IFR5cGUqIGNvbnN0KiBUeXBlcywgdW5zaWduZWQgTnVtVHlwZXMpIHsKKyAgYXNzZXJ0KE51bVR5cGVzID4gMCAmJiAidW5pb24gbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtZW1iZXIgdHlwZSEiKTsKKyAgVW5pb25WYWxUeXBlIFVUVihUeXBlcywgTnVtVHlwZXMpOworICBVbmlvblR5cGUgKlVUID0gMDsKKyAgCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBUeXBlc1swXS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICAKKyAgVVQgPSBwSW1wbC0+VW5pb25UeXBlcy5nZXQoVVRWKTsKKyAgICAKKyAgaWYgKCFVVCkgeworICAgIC8vIFZhbHVlIG5vdCBmb3VuZC4gIERlcml2ZSBhIG5ldyB0eXBlIQorICAgIFVUID0gKFVuaW9uVHlwZSopIG9wZXJhdG9yIG5ldyhzaXplb2YoVW5pb25UeXBlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQQVR5cGVIYW5kbGUpICogTnVtVHlwZXMpOworICAgIG5ldyAoVVQpIFVuaW9uVHlwZShUeXBlc1swXS0+Z2V0Q29udGV4dCgpLCBUeXBlcywgTnVtVHlwZXMpOworICAgIHBJbXBsLT5VbmlvblR5cGVzLmFkZChVVFYsIFVUKTsKKyAgfQorI2lmZGVmIERFQlVHX01FUkdFX1RZUEVTCisgIERFQlVHKGRiZ3MoKSA8PCAiRGVyaXZlZCBuZXcgdHlwZTogIiA8PCAqVVQgPDwgIlxuIik7CisjZW5kaWYKKyAgcmV0dXJuIFVUOworfQorCitVbmlvblR5cGUgKlVuaW9uVHlwZTo6Z2V0KGNvbnN0IFR5cGUgKnR5cGUsIC4uLikgeworICB2YV9saXN0IGFwOworICBTbWFsbFZlY3Rvcjxjb25zdCBsbHZtOjpUeXBlKiwgOD4gVW5pb25GaWVsZHM7CisgIHZhX3N0YXJ0KGFwLCB0eXBlKTsKKyAgd2hpbGUgKHR5cGUpIHsKKyAgICBVbmlvbkZpZWxkcy5wdXNoX2JhY2sodHlwZSk7CisgICAgdHlwZSA9IHZhX2FyZyhhcCwgbGx2bTo6VHlwZSopOworICB9CisgIHVuc2lnbmVkIE51bVR5cGVzID0gVW5pb25GaWVsZHMuc2l6ZSgpOworICBhc3NlcnQoTnVtVHlwZXMgPiAwICYmICJ1bmlvbiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1lbWJlciB0eXBlISIpOworICByZXR1cm4gbGx2bTo6VW5pb25UeXBlOjpnZXQoJlVuaW9uRmllbGRzWzBdLCBOdW1UeXBlcyk7Cit9CisKK2Jvb2wgVW5pb25UeXBlOjppc1ZhbGlkRWxlbWVudFR5cGUoY29uc3QgVHlwZSAqRWxlbVR5KSB7CisgIHJldHVybiAhRWxlbVR5LT5pc1ZvaWRUeSgpICYmICFFbGVtVHktPmlzTGFiZWxUeSgpICYmCisgICAgICAgICAhRWxlbVR5LT5pc01ldGFkYXRhVHkoKSAmJiAhRWxlbVR5LT5pc0Z1bmN0aW9uVHkoKTsKK30KKworaW50IFVuaW9uVHlwZTo6Z2V0RWxlbWVudFR5cGVJbmRleChjb25zdCBUeXBlICpFbGVtVHkpIGNvbnN0IHsKKyAgaW50IGluZGV4ID0gMDsKKyAgZm9yIChVbmlvblR5cGU6OmVsZW1lbnRfaXRlcmF0b3IgSSA9IGVsZW1lbnRfYmVnaW4oKSwgRSA9IGVsZW1lbnRfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0ksICsraW5kZXgpIHsKKyAgICAgaWYgKEVsZW1UeSA9PSAqSSkgcmV0dXJuIGluZGV4OworICB9CisgIAorICByZXR1cm4gLTE7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQb2ludGVyIFR5cGUgRmFjdG9yeS4uLgorLy8KKworUG9pbnRlclR5cGUgKlBvaW50ZXJUeXBlOjpnZXQoY29uc3QgVHlwZSAqVmFsdWVUeXBlLCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UpIHsKKyAgYXNzZXJ0KFZhbHVlVHlwZSAmJiAiQ2FuJ3QgZ2V0IGEgcG9pbnRlciB0byA8bnVsbD4gdHlwZSEiKTsKKyAgYXNzZXJ0KFZhbHVlVHlwZS0+Z2V0VHlwZUlEKCkgIT0gVm9pZFR5SUQgJiYKKyAgICAgICAgICJQb2ludGVyIHRvIHZvaWQgaXMgbm90IHZhbGlkLCB1c2UgaTgqIGluc3RlYWQhIik7CisgIGFzc2VydChpc1ZhbGlkRWxlbWVudFR5cGUoVmFsdWVUeXBlKSAmJiAiSW52YWxpZCB0eXBlIGZvciBwb2ludGVyIGVsZW1lbnQhIik7CisgIFBvaW50ZXJWYWxUeXBlIFBWVChWYWx1ZVR5cGUsIEFkZHJlc3NTcGFjZSk7CisKKyAgUG9pbnRlclR5cGUgKlBUID0gMDsKKyAgCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBWYWx1ZVR5cGUtPmdldENvbnRleHQoKS5wSW1wbDsKKyAgCisgIFBUID0gcEltcGwtPlBvaW50ZXJUeXBlcy5nZXQoUFZUKTsKKyAgCisgIGlmICghUFQpIHsKKyAgICAvLyBWYWx1ZSBub3QgZm91bmQuICBEZXJpdmUgYSBuZXcgdHlwZSEKKyAgICBwSW1wbC0+UG9pbnRlclR5cGVzLmFkZChQVlQsIFBUID0gbmV3IFBvaW50ZXJUeXBlKFZhbHVlVHlwZSwgQWRkcmVzc1NwYWNlKSk7CisgIH0KKyNpZmRlZiBERUJVR19NRVJHRV9UWVBFUworICBERUJVRyhkYmdzKCkgPDwgIkRlcml2ZWQgbmV3IHR5cGU6ICIgPDwgKlBUIDw8ICJcbiIpOworI2VuZGlmCisgIHJldHVybiBQVDsKK30KKworY29uc3QgUG9pbnRlclR5cGUgKlR5cGU6OmdldFBvaW50ZXJUbyh1bnNpZ25lZCBhZGRycykgY29uc3QgeworICByZXR1cm4gUG9pbnRlclR5cGU6OmdldCh0aGlzLCBhZGRycyk7Cit9CisKK2Jvb2wgUG9pbnRlclR5cGU6OmlzVmFsaWRFbGVtZW50VHlwZShjb25zdCBUeXBlICpFbGVtVHkpIHsKKyAgcmV0dXJuICFFbGVtVHktPmlzVm9pZFR5KCkgJiYgIUVsZW1UeS0+aXNMYWJlbFR5KCkgJiYKKyAgICAgICAgICFFbGVtVHktPmlzTWV0YWRhdGFUeSgpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPcGFxdWUgVHlwZSBGYWN0b3J5Li4uCisvLworCitPcGFxdWVUeXBlICpPcGFxdWVUeXBlOjpnZXQoTExWTUNvbnRleHQgJkMpIHsKKyAgT3BhcXVlVHlwZSAqT1QgPSBuZXcgT3BhcXVlVHlwZShDKTsgICAgICAgLy8gQWxsIG9wYXF1ZSB0eXBlcyBhcmUgZGlzdGluY3QuCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBDLnBJbXBsOworICBwSW1wbC0+T3BhcXVlVHlwZXMuaW5zZXJ0KE9UKTsKKyAgcmV0dXJuIE9UOworfQorCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgRGVyaXZlZCBUeXBlIFJlZmluZW1lbnQgRnVuY3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBhZGRBYnN0cmFjdFR5cGVVc2VyIC0gTm90aWZ5IGFuIGFic3RyYWN0IHR5cGUgdGhhdCB0aGVyZSBpcyBhIG5ldyB1c2VyIG9mCisvLyBpdC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHByaW1hcmlseSBieSB0aGUgUEFUeXBlSGFuZGxlIGNsYXNzLgordm9pZCBUeXBlOjphZGRBYnN0cmFjdFR5cGVVc2VyKEFic3RyYWN0VHlwZVVzZXIgKlUpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzQWJzdHJhY3QoKSAmJiAiYWRkQWJzdHJhY3RUeXBlVXNlcjogQ3VycmVudCB0eXBlIG5vdCBhYnN0cmFjdCEiKTsKKyAgQWJzdHJhY3RUeXBlVXNlcnMucHVzaF9iYWNrKFUpOworfQorCisKKy8vIHJlbW92ZUFic3RyYWN0VHlwZVVzZXIgLSBOb3RpZnkgYW4gYWJzdHJhY3QgdHlwZSB0aGF0IGEgdXNlciBvZiB0aGUgY2xhc3MKKy8vIG5vIGxvbmdlciBoYXMgYSBoYW5kbGUgdG8gdGhlIHR5cGUuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwcmltYXJpbHkgYnkKKy8vIHRoZSBQQVR5cGVIYW5kbGUgY2xhc3MuICBXaGVuIHRoZXJlIGFyZSBubyB1c2VycyBvZiB0aGUgYWJzdHJhY3QgdHlwZSwgaXQKKy8vIGlzIGFubmloaWxhdGVkLCBiZWNhdXNlIHRoZXJlIGlzIG5vIHdheSB0byBnZXQgYSByZWZlcmVuY2UgdG8gaXQgZXZlciBhZ2Fpbi4KKy8vCit2b2lkIFR5cGU6OnJlbW92ZUFic3RyYWN0VHlwZVVzZXIoQWJzdHJhY3RUeXBlVXNlciAqVSkgY29uc3QgeworICAKKyAgLy8gU2VhcmNoIGZyb20gYmFjayB0byBmcm9udCBiZWNhdXNlIHdlIHdpbGwgbm90aWZ5IHVzZXJzIGZyb20gYmFjayB0bworICAvLyBmcm9udC4gIEFsc28sIGl0IGlzIGxpa2VseSB0aGF0IHRoZXJlIHdpbGwgYmUgYSBzdGFjayBsaWtlIGJlaGF2aW9yIHRvCisgIC8vIHVzZXJzIHRoYXQgcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgdXNlcnMuCisgIC8vCisgIHVuc2lnbmVkIGk7CisgIGZvciAoaSA9IEFic3RyYWN0VHlwZVVzZXJzLnNpemUoKTsgQWJzdHJhY3RUeXBlVXNlcnNbaS0xXSAhPSBVOyAtLWkpCisgICAgYXNzZXJ0KGkgIT0gMCAmJiAiQWJzdHJhY3RUeXBlVXNlciBub3QgaW4gdXNlciBsaXN0ISIpOworCisgIC0taTsgIC8vIENvbnZlcnQgdG8gYmUgaW4gcmFuZ2UgMCA8PSBpIDwgc2l6ZSgpCisgIGFzc2VydChpIDwgQWJzdHJhY3RUeXBlVXNlcnMuc2l6ZSgpICYmICJJbmRleCBvdXQgb2YgcmFuZ2UhIik7ICAvLyBXcmFwYXJvdW5kPworCisgIEFic3RyYWN0VHlwZVVzZXJzLmVyYXNlKEFic3RyYWN0VHlwZVVzZXJzLmJlZ2luKCkraSk7CisKKyNpZmRlZiBERUJVR19NRVJHRV9UWVBFUworICBERUJVRyhkYmdzKCkgPDwgIiAgcmVtQWJzdHJhY3RUeXBlVXNlclsiIDw8ICh2b2lkKil0aGlzIDw8ICIsICIKKyAgICAgICAgICAgICAgIDw8ICp0aGlzIDw8ICJdWyIgPDwgaSA8PCAiXSBVc2VyID0gIiA8PCBVIDw8ICJcbiIpOworI2VuZGlmCisKKyAgaWYgKEFic3RyYWN0VHlwZVVzZXJzLmVtcHR5KCkgJiYgZ2V0UmVmQ291bnQoKSA9PSAwICYmIGlzQWJzdHJhY3QoKSkgeworI2lmZGVmIERFQlVHX01FUkdFX1RZUEVTCisgICAgREVCVUcoZGJncygpIDw8ICJERUxFVEVpbmcgdW51c2VkIGFic3RyYWN0IHR5cGU6IDwiIDw8ICp0aGlzCisgICAgICAgICAgICAgICAgIDw8ICI+WyIgPDwgKHZvaWQqKXRoaXMgPDwgIl0iIDw8ICJcbiIpOworI2VuZGlmCisgIAorICAgIHRoaXMtPmRlc3Ryb3koKTsKKyAgfQorfQorCisvLyByZWZpbmVBYnN0cmFjdFR5cGVUbyAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGl0IGlzIGRpc2NvdmVyZWQKKy8vIHRoYXQgdGhlICd0aGlzJyBhYnN0cmFjdCB0eXBlIGlzIGFjdHVhbGx5IGVxdWl2YWxlbnQgdG8gdGhlIE5ld1R5cGUKKy8vIHNwZWNpZmllZC4gVGhpcyBjYXVzZXMgYWxsIHVzZXJzIG9mICd0aGlzJyB0byBzd2l0Y2ggdG8gcmVmZXJlbmNlIHRoZSBtb3JlIAorLy8gY29uY3JldGUgdHlwZSBOZXdUeXBlIGFuZCBmb3IgJ3RoaXMnIHRvIGJlIGRlbGV0ZWQuICBPbmx5IHVzZWQgZm9yIGludGVybmFsCisvLyBjYWxsZXJzLgorLy8KK3ZvaWQgRGVyaXZlZFR5cGU6OnJlZmluZUFic3RyYWN0VHlwZVRvKGNvbnN0IFR5cGUgKk5ld1R5cGUpIHsKKyAgYXNzZXJ0KGlzQWJzdHJhY3QoKSAmJiAicmVmaW5lQWJzdHJhY3RUeXBlVG86IEN1cnJlbnQgdHlwZSBpcyBub3QgYWJzdHJhY3QhIik7CisgIGFzc2VydCh0aGlzICE9IE5ld1R5cGUgJiYgIkNhbid0IHJlZmluZSB0byBteXNlbGYhIik7CisgIGFzc2VydChGb3J3YXJkVHlwZSA9PSAwICYmICJUaGlzIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWZpbmVkISIpOworCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBnZXRDb250ZXh0KCkucEltcGw7CisKKyAgLy8gVGhlIGRlc2NyaXB0aW9ucyBtYXkgYmUgb3V0IG9mIGRhdGUuICBDb25zZXJ2YXRpdmVseSBjbGVhciB0aGVtIGFsbCEKKyAgcEltcGwtPkFic3RyYWN0VHlwZURlc2NyaXB0aW9ucy5jbGVhcigpOworCisjaWZkZWYgREVCVUdfTUVSR0VfVFlQRVMKKyAgREVCVUcoZGJncygpIDw8ICJSRUZJTklORyBhYnN0cmFjdCB0eXBlIFsiIDw8ICh2b2lkKil0aGlzIDw8ICIgIgorICAgICAgICAgICAgICAgPDwgKnRoaXMgPDwgIl0gdG8gWyIgPDwgKHZvaWQqKU5ld1R5cGUgPDwgIiAiCisgICAgICAgICAgICAgICA8PCAqTmV3VHlwZSA8PCAiXSFcbiIpOworI2VuZGlmCisKKyAgLy8gTWFrZSBzdXJlIHRvIHB1dCB0aGUgdHlwZSB0byBiZSByZWZpbmVkIHRvIGludG8gYSBob2xkZXIgc28gdGhhdCBpZiBJVCBnZXRzCisgIC8vIHJlZmluZWQsIHRoYXQgd2Ugd2lsbCBub3QgY29udGludWUgdXNpbmcgYSBkZWFkIHJlZmVyZW5jZS4uLgorICAvLworICBQQVR5cGVIb2xkZXIgTmV3VHkoTmV3VHlwZSk7CisgIC8vIEFueSBQQVR5cGVIb2xkZXJzIHJlZmVycmluZyB0byB0aGlzIHR5cGUgd2lsbCBub3cgYXV0b21hdGljYWxseSBmb3J3YXJkIHRvCisgIC8vIHRoZSB0eXBlIHdlIGFyZSByZXNvbHZlZCB0by4KKyAgRm9yd2FyZFR5cGUgPSBOZXdUeXBlOworICBpZiAoRm9yd2FyZFR5cGUtPmlzQWJzdHJhY3QoKSkKKyAgICBGb3J3YXJkVHlwZS0+YWRkUmVmKCk7CisKKyAgLy8gQWRkIGEgc2VsZiB1c2Ugb2YgdGhlIGN1cnJlbnQgdHlwZSBzbyB0aGF0IHdlIGRvbid0IGRlbGV0ZSBvdXJzZWxmIHVudGlsCisgIC8vIGFmdGVyIHRoZSBmdW5jdGlvbiBleGl0cy4KKyAgLy8KKyAgUEFUeXBlSG9sZGVyIEN1cnJlbnRUeSh0aGlzKTsKKworICAvLyBUbyBtYWtlIHRoZSBzaXR1YXRpb24gc2ltcGxlciwgd2UgYXNrIHRoZSBzdWJjbGFzcyB0byByZW1vdmUgdGhpcyB0eXBlIGZyb20KKyAgLy8gdGhlIHR5cGUgbWFwLCBhbmQgdG8gcmVwbGFjZSBhbnkgdHlwZSB1c2VzIHdpdGggdXNlcyBvZiBub24tYWJzdHJhY3QgdHlwZXMuCisgIC8vIFRoaXMgZHJhbWF0aWNhbGx5IGxpbWl0cyB0aGUgYW1vdW50IG9mIHJlY3Vyc2l2ZSB0eXBlIHRyb3VibGUgd2UgY2FuIGZpbmQKKyAgLy8gb3Vyc2VsdmVzIGluLgorICBkcm9wQWxsVHlwZVVzZXMoKTsKKworICAvLyBJdGVyYXRlIG92ZXIgYWxsIG9mIHRoZSB1c2VzIG9mIHRoaXMgdHlwZSwgaW52b2tpbmcgY2FsbGJhY2suICBFYWNoIHVzZXIKKyAgLy8gc2hvdWxkIHJlbW92ZSBpdHNlbGYgZnJvbSBvdXIgdXNlIGxpc3QgYXV0b21hdGljYWxseS4gIFdlIGhhdmUgdG8gY2hlY2sgdG8KKyAgLy8gbWFrZSBzdXJlIHRoYXQgTmV3VHkgZG9lc24ndCBfYmVjb21lXyAndGhpcycuICBJZiBpdCBkb2VzLCByZXNvbHZpbmcgdHlwZXMKKyAgLy8gd2lsbCBub3QgY2F1c2UgdXNlcnMgdG8gZHJvcCBvZmYgb2YgdGhlIHVzZSBsaXN0LiAgSWYgd2UgcmVzb2x2ZSB0byBvdXJzZWxmCisgIC8vIHdlIHN1Y2NlZWQhCisgIC8vCisgIHdoaWxlICghQWJzdHJhY3RUeXBlVXNlcnMuZW1wdHkoKSAmJiBOZXdUeSAhPSB0aGlzKSB7CisgICAgQWJzdHJhY3RUeXBlVXNlciAqVXNlciA9IEFic3RyYWN0VHlwZVVzZXJzLmJhY2soKTsKKworICAgIHVuc2lnbmVkIE9sZFNpemUgPSBBYnN0cmFjdFR5cGVVc2Vycy5zaXplKCk7IE9sZFNpemU9T2xkU2l6ZTsKKyNpZmRlZiBERUJVR19NRVJHRV9UWVBFUworICAgIERFQlVHKGRiZ3MoKSA8PCAiIFJFRklOSU5HIHVzZXIgIiA8PCBPbGRTaXplLTEgPDwgIlsiIDw8ICh2b2lkKilVc2VyCisgICAgICAgICAgICAgICAgIDw8ICJdIG9mIGFic3RyYWN0IHR5cGUgWyIgPDwgKHZvaWQqKXRoaXMgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICp0aGlzIDw8ICJdIHRvIFsiIDw8ICh2b2lkKilOZXdUeS5nZXQoKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKk5ld1R5IDw8ICJdIVxuIik7CisjZW5kaWYKKyAgICBVc2VyLT5yZWZpbmVBYnN0cmFjdFR5cGUodGhpcywgTmV3VHkpOworCisgICAgYXNzZXJ0KEFic3RyYWN0VHlwZVVzZXJzLnNpemUoKSAhPSBPbGRTaXplICYmCisgICAgICAgICAgICJBYnNUeVVzZXIgZGlkIG5vdCByZW1vdmUgc2VsZiBmcm9tIHVzZXIgbGlzdCEiKTsKKyAgfQorCisgIC8vIElmIHdlIHdlcmUgc3VjY2Vzc2Z1bCByZW1vdmluZyBhbGwgdXNlcnMgZnJvbSB0aGUgdHlwZSwgJ3RoaXMnIHdpbGwgYmUKKyAgLy8gZGVsZXRlZCB3aGVuIHRoZSBsYXN0IFBBVHlwZUhvbGRlciBpcyBkZXN0cm95ZWQgb3IgdXBkYXRlZCBmcm9tIHRoaXMgdHlwZS4KKyAgLy8gVGhpcyBtYXkgb2NjdXIgb24gZXhpdCBvZiB0aGlzIGZ1bmN0aW9uLCBhcyB0aGUgQ3VycmVudFR5IG9iamVjdCBpcworICAvLyBkZXN0cm95ZWQuCit9CisKKy8vIG5vdGlmeVVzZXNUaGF0VHlwZUJlY2FtZUNvbmNyZXRlIC0gTm90aWZ5IEFic3RyYWN0VHlwZVVzZXJzIG9mIHRoaXMgdHlwZSB0aGF0CisvLyB0aGUgY3VycmVudCB0eXBlIGhhcyB0cmFuc2l0aW9uZWQgZnJvbSBiZWluZyBhYnN0cmFjdCB0byBiZWluZyBjb25jcmV0ZS4KKy8vCit2b2lkIERlcml2ZWRUeXBlOjpub3RpZnlVc2VzVGhhdFR5cGVCZWNhbWVDb25jcmV0ZSgpIHsKKyNpZmRlZiBERUJVR19NRVJHRV9UWVBFUworICBERUJVRyhkYmdzKCkgPDwgInR5cGVJc1JFRklORUQgdHlwZTogIiA8PCAodm9pZCopdGhpcyA8PCAiICIgPDwgKnRoaXMgPDwiXG4iKTsKKyNlbmRpZgorCisgIHVuc2lnbmVkIE9sZFNpemUgPSBBYnN0cmFjdFR5cGVVc2Vycy5zaXplKCk7IE9sZFNpemU9T2xkU2l6ZTsKKyAgd2hpbGUgKCFBYnN0cmFjdFR5cGVVc2Vycy5lbXB0eSgpKSB7CisgICAgQWJzdHJhY3RUeXBlVXNlciAqQVRVID0gQWJzdHJhY3RUeXBlVXNlcnMuYmFjaygpOworICAgIEFUVS0+dHlwZUJlY2FtZUNvbmNyZXRlKHRoaXMpOworCisgICAgYXNzZXJ0KEFic3RyYWN0VHlwZVVzZXJzLnNpemUoKSA8IE9sZFNpemUtLSAmJgorICAgICAgICAgICAiQWJzdHJhY3RUeXBlVXNlciBkaWQgbm90IHJlbW92ZSBpdHNlbGYgZnJvbSB0aGUgdXNlIGxpc3QhIik7CisgIH0KK30KKworLy8gcmVmaW5lQWJzdHJhY3RUeXBlIC0gQ2FsbGVkIHdoZW4gYSBjb250YWluZWQgdHlwZSBpcyBmb3VuZCB0byBiZSBtb3JlCisvLyBjb25jcmV0ZSAtIHRoaXMgY291bGQgcG90ZW50aWFsbHkgY2hhbmdlIHVzIGZyb20gYW4gYWJzdHJhY3QgdHlwZSB0byBhCisvLyBjb25jcmV0ZSB0eXBlLgorLy8KK3ZvaWQgRnVuY3Rpb25UeXBlOjpyZWZpbmVBYnN0cmFjdFR5cGUoY29uc3QgRGVyaXZlZFR5cGUgKk9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKk5ld1R5cGUpIHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IE9sZFR5cGUtPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcEltcGwtPkZ1bmN0aW9uVHlwZXMuUmVmaW5lQWJzdHJhY3RUeXBlKHRoaXMsIE9sZFR5cGUsIE5ld1R5cGUpOworfQorCit2b2lkIEZ1bmN0aW9uVHlwZTo6dHlwZUJlY2FtZUNvbmNyZXRlKGNvbnN0IERlcml2ZWRUeXBlICpBYnNUeSkgeworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gQWJzVHktPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcEltcGwtPkZ1bmN0aW9uVHlwZXMuVHlwZUJlY2FtZUNvbmNyZXRlKHRoaXMsIEFic1R5KTsKK30KKworCisvLyByZWZpbmVBYnN0cmFjdFR5cGUgLSBDYWxsZWQgd2hlbiBhIGNvbnRhaW5lZCB0eXBlIGlzIGZvdW5kIHRvIGJlIG1vcmUKKy8vIGNvbmNyZXRlIC0gdGhpcyBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdXMgZnJvbSBhbiBhYnN0cmFjdCB0eXBlIHRvIGEKKy8vIGNvbmNyZXRlIHR5cGUuCisvLwordm9pZCBBcnJheVR5cGU6OnJlZmluZUFic3RyYWN0VHlwZShjb25zdCBEZXJpdmVkVHlwZSAqT2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqTmV3VHlwZSkgeworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gT2xkVHlwZS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICBwSW1wbC0+QXJyYXlUeXBlcy5SZWZpbmVBYnN0cmFjdFR5cGUodGhpcywgT2xkVHlwZSwgTmV3VHlwZSk7Cit9CisKK3ZvaWQgQXJyYXlUeXBlOjp0eXBlQmVjYW1lQ29uY3JldGUoY29uc3QgRGVyaXZlZFR5cGUgKkFic1R5KSB7CisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBBYnNUeS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICBwSW1wbC0+QXJyYXlUeXBlcy5UeXBlQmVjYW1lQ29uY3JldGUodGhpcywgQWJzVHkpOworfQorCisvLyByZWZpbmVBYnN0cmFjdFR5cGUgLSBDYWxsZWQgd2hlbiBhIGNvbnRhaW5lZCB0eXBlIGlzIGZvdW5kIHRvIGJlIG1vcmUKKy8vIGNvbmNyZXRlIC0gdGhpcyBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdXMgZnJvbSBhbiBhYnN0cmFjdCB0eXBlIHRvIGEKKy8vIGNvbmNyZXRlIHR5cGUuCisvLwordm9pZCBWZWN0b3JUeXBlOjpyZWZpbmVBYnN0cmFjdFR5cGUoY29uc3QgRGVyaXZlZFR5cGUgKk9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKk5ld1R5cGUpIHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IE9sZFR5cGUtPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcEltcGwtPlZlY3RvclR5cGVzLlJlZmluZUFic3RyYWN0VHlwZSh0aGlzLCBPbGRUeXBlLCBOZXdUeXBlKTsKK30KKwordm9pZCBWZWN0b3JUeXBlOjp0eXBlQmVjYW1lQ29uY3JldGUoY29uc3QgRGVyaXZlZFR5cGUgKkFic1R5KSB7CisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBBYnNUeS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICBwSW1wbC0+VmVjdG9yVHlwZXMuVHlwZUJlY2FtZUNvbmNyZXRlKHRoaXMsIEFic1R5KTsKK30KKworLy8gcmVmaW5lQWJzdHJhY3RUeXBlIC0gQ2FsbGVkIHdoZW4gYSBjb250YWluZWQgdHlwZSBpcyBmb3VuZCB0byBiZSBtb3JlCisvLyBjb25jcmV0ZSAtIHRoaXMgY291bGQgcG90ZW50aWFsbHkgY2hhbmdlIHVzIGZyb20gYW4gYWJzdHJhY3QgdHlwZSB0byBhCisvLyBjb25jcmV0ZSB0eXBlLgorLy8KK3ZvaWQgU3RydWN0VHlwZTo6cmVmaW5lQWJzdHJhY3RUeXBlKGNvbnN0IERlcml2ZWRUeXBlICpPbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqTmV3VHlwZSkgeworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gT2xkVHlwZS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICBwSW1wbC0+U3RydWN0VHlwZXMuUmVmaW5lQWJzdHJhY3RUeXBlKHRoaXMsIE9sZFR5cGUsIE5ld1R5cGUpOworfQorCit2b2lkIFN0cnVjdFR5cGU6OnR5cGVCZWNhbWVDb25jcmV0ZShjb25zdCBEZXJpdmVkVHlwZSAqQWJzVHkpIHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IEFic1R5LT5nZXRDb250ZXh0KCkucEltcGw7CisgIHBJbXBsLT5TdHJ1Y3RUeXBlcy5UeXBlQmVjYW1lQ29uY3JldGUodGhpcywgQWJzVHkpOworfQorCisvLyByZWZpbmVBYnN0cmFjdFR5cGUgLSBDYWxsZWQgd2hlbiBhIGNvbnRhaW5lZCB0eXBlIGlzIGZvdW5kIHRvIGJlIG1vcmUKKy8vIGNvbmNyZXRlIC0gdGhpcyBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdXMgZnJvbSBhbiBhYnN0cmFjdCB0eXBlIHRvIGEKKy8vIGNvbmNyZXRlIHR5cGUuCisvLwordm9pZCBVbmlvblR5cGU6OnJlZmluZUFic3RyYWN0VHlwZShjb25zdCBEZXJpdmVkVHlwZSAqT2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKk5ld1R5cGUpIHsKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IE9sZFR5cGUtPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcEltcGwtPlVuaW9uVHlwZXMuUmVmaW5lQWJzdHJhY3RUeXBlKHRoaXMsIE9sZFR5cGUsIE5ld1R5cGUpOworfQorCit2b2lkIFVuaW9uVHlwZTo6dHlwZUJlY2FtZUNvbmNyZXRlKGNvbnN0IERlcml2ZWRUeXBlICpBYnNUeSkgeworICBMTFZNQ29udGV4dEltcGwgKnBJbXBsID0gQWJzVHktPmdldENvbnRleHQoKS5wSW1wbDsKKyAgcEltcGwtPlVuaW9uVHlwZXMuVHlwZUJlY2FtZUNvbmNyZXRlKHRoaXMsIEFic1R5KTsKK30KKworLy8gcmVmaW5lQWJzdHJhY3RUeXBlIC0gQ2FsbGVkIHdoZW4gYSBjb250YWluZWQgdHlwZSBpcyBmb3VuZCB0byBiZSBtb3JlCisvLyBjb25jcmV0ZSAtIHRoaXMgY291bGQgcG90ZW50aWFsbHkgY2hhbmdlIHVzIGZyb20gYW4gYWJzdHJhY3QgdHlwZSB0byBhCisvLyBjb25jcmV0ZSB0eXBlLgorLy8KK3ZvaWQgUG9pbnRlclR5cGU6OnJlZmluZUFic3RyYWN0VHlwZShjb25zdCBEZXJpdmVkVHlwZSAqT2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpOZXdUeXBlKSB7CisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBPbGRUeXBlLT5nZXRDb250ZXh0KCkucEltcGw7CisgIHBJbXBsLT5Qb2ludGVyVHlwZXMuUmVmaW5lQWJzdHJhY3RUeXBlKHRoaXMsIE9sZFR5cGUsIE5ld1R5cGUpOworfQorCit2b2lkIFBvaW50ZXJUeXBlOjp0eXBlQmVjYW1lQ29uY3JldGUoY29uc3QgRGVyaXZlZFR5cGUgKkFic1R5KSB7CisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBBYnNUeS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICBwSW1wbC0+UG9pbnRlclR5cGVzLlR5cGVCZWNhbWVDb25jcmV0ZSh0aGlzLCBBYnNUeSk7Cit9CisKK2Jvb2wgU2VxdWVudGlhbFR5cGU6OmluZGV4VmFsaWQoY29uc3QgVmFsdWUgKlYpIGNvbnN0IHsKKyAgaWYgKFYtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKSkgCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworbmFtZXNwYWNlIGxsdm0geworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBUeXBlICZUKSB7CisgIFQucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL1R5cGVTeW1ib2xUYWJsZS5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL1R5cGVTeW1ib2xUYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4YTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvVHlwZVN5bWJvbFRhYmxlLmNwcApAQCAtMCwwICsxLDE2OSBAQAorLy89PT0tLSBUeXBlU3ltYm9sVGFibGUuY3BwIC0gSW1wbGVtZW50IHRoZSBUeXBlU3ltYm9sVGFibGUgY2xhc3MgLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgVHlwZVN5bWJvbFRhYmxlIGNsYXNzIGZvciB0aGUgVk1Db3JlIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vVHlwZVN5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisjZGVmaW5lIERFQlVHX1NZTUJPTF9UQUJMRSAwCisjZGVmaW5lIERFQlVHX0FCU1RZUEUgMAorCitUeXBlU3ltYm9sVGFibGU6On5UeXBlU3ltYm9sVGFibGUoKSB7CisgIC8vIERyb3AgYWxsIGFic3RyYWN0IHR5cGUgcmVmZXJlbmNlcyBpbiB0aGUgdHlwZSBwbGFuZS4uLgorICBmb3IgKGl0ZXJhdG9yIFRJID0gdG1hcC5iZWdpbigpLCBURSA9IHRtYXAuZW5kKCk7IFRJICE9IFRFOyArK1RJKSB7CisgICAgaWYgKFRJLT5zZWNvbmQtPmlzQWJzdHJhY3QoKSkgICAvLyBJZiBhYnN0cmFjdCwgZHJvcCB0aGUgcmVmZXJlbmNlLi4uCisgICAgICBjYXN0PERlcml2ZWRUeXBlPihUSS0+c2Vjb25kKS0+cmVtb3ZlQWJzdHJhY3RUeXBlVXNlcih0aGlzKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBUeXBlU3ltYm9sVGFibGU6OmdldFVuaXF1ZU5hbWUoU3RyaW5nUmVmIEJhc2VOYW1lKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIFRyeU5hbWUgPSBCYXNlTmFtZTsKKyAgCisgIGNvbnN0X2l0ZXJhdG9yIEVuZCA9IHRtYXAuZW5kKCk7CisKKyAgLy8gU2VlIGlmIHRoZSBuYW1lIGV4aXN0cworICB3aGlsZSAodG1hcC5maW5kKFRyeU5hbWUpICE9IEVuZCkgICAgICAgICAgICAvLyBMb29wIHVudGlsIHdlIGZpbmQgYSBmcmVlCisgICAgVHJ5TmFtZSA9IEJhc2VOYW1lLnN0cigpICsgdXRvc3RyKCsrTGFzdFVuaXF1ZSk7IC8vIG5hbWUgaW4gdGhlIHN5bWJvbCB0YWJsZQorICByZXR1cm4gVHJ5TmFtZTsKK30KKworLy8gbG9va3VwIGEgdHlwZSBieSBuYW1lIC0gcmV0dXJucyBudWxsIG9uIGZhaWx1cmUKK1R5cGUqIFR5cGVTeW1ib2xUYWJsZTo6bG9va3VwKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgIGNvbnN0X2l0ZXJhdG9yIFRJID0gdG1hcC5maW5kKE5hbWUpOworICBUeXBlKiByZXN1bHQgPSAwOworICBpZiAoVEkgIT0gdG1hcC5lbmQoKSkKKyAgICByZXN1bHQgPSBjb25zdF9jYXN0PFR5cGUqPihUSS0+c2Vjb25kKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gcmVtb3ZlIC0gUmVtb3ZlIGEgdHlwZSBmcm9tIHRoZSBzeW1ib2wgdGFibGUuLi4KK1R5cGUqIFR5cGVTeW1ib2xUYWJsZTo6cmVtb3ZlKGl0ZXJhdG9yIEVudHJ5KSB7CisgIGFzc2VydChFbnRyeSAhPSB0bWFwLmVuZCgpICYmICJJbnZhbGlkIGVudHJ5IHRvIHJlbW92ZSEiKTsKKyAgY29uc3QgVHlwZSogUmVzdWx0ID0gRW50cnktPnNlY29uZDsKKworI2lmIERFQlVHX1NZTUJPTF9UQUJMRQorICBkdW1wKCk7CisgIGRiZ3MoKSA8PCAiIFJlbW92aW5nIFZhbHVlOiAiIDw8IFJlc3VsdC0+Z2V0RGVzY3JpcHRpb24oKSA8PCAiXG4iOworI2VuZGlmCisKKyAgdG1hcC5lcmFzZShFbnRyeSk7CisgIAorICAvLyBJZiB3ZSBhcmUgcmVtb3ZpbmcgYW4gYWJzdHJhY3QgdHlwZSwgcmVtb3ZlIHRoZSBzeW1ib2wgdGFibGUgZnJvbSBpdCdzIHVzZQorICAvLyBsaXN0Li4uCisgIGlmIChSZXN1bHQtPmlzQWJzdHJhY3QoKSkgeworI2lmIERFQlVHX0FCU1RZUEUKKyAgICBkYmdzKCkgPDwgIlJlbW92aW5nIGFic3RyYWN0IHR5cGUgZnJvbSBzeW10YWIiCisgICAgICAgICAgIDw8IFJlc3VsdC0+Z2V0RGVzY3JpcHRpb24oKQorICAgICAgICAgICA8PCAiXG4iOworI2VuZGlmCisgICAgY2FzdDxEZXJpdmVkVHlwZT4oUmVzdWx0KS0+cmVtb3ZlQWJzdHJhY3RUeXBlVXNlcih0aGlzKTsKKyAgfQorCisgIHJldHVybiBjb25zdF9jYXN0PFR5cGUqPihSZXN1bHQpOworfQorCisKKy8vIGluc2VydCAtIEluc2VydCBhIHR5cGUgaW50byB0aGUgc3ltYm9sIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLi4uCit2b2lkIFR5cGVTeW1ib2xUYWJsZTo6aW5zZXJ0KFN0cmluZ1JlZiBOYW1lLCBjb25zdCBUeXBlKiBUKSB7CisgIGFzc2VydChUICYmICJDYW4ndCBpbnNlcnQgbnVsbCB0eXBlIGludG8gc3ltYm9sIHRhYmxlISIpOworCisgIGlmICh0bWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihOYW1lLCBUKSkuc2Vjb25kKSB7CisgICAgLy8gVHlwZSBpbnNlcnRlZCBmaW5lIHdpdGggbm8gY29uZmxpY3QuCisgICAgCisjaWYgREVCVUdfU1lNQk9MX1RBQkxFCisgICAgZHVtcCgpOworICAgIGRiZ3MoKSA8PCAiIEluc2VydGVkIHR5cGU6ICIgPDwgTmFtZSA8PCAiOiAiIDw8IFQtPmdldERlc2NyaXB0aW9uKCkgPDwgIlxuIjsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8vIElmIHRoZXJlIGlzIGEgbmFtZSBjb25mbGljdC4uLgorICAgIAorICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5hbWluZyBjb25mbGljdC4gIElmIHNvLCByZW5hbWUgdGhpcyB0eXBlIQorICAgIHN0ZDo6c3RyaW5nIFVuaXF1ZU5hbWUgPSBOYW1lOworICAgIGlmIChsb29rdXAoTmFtZSkpCisgICAgICBVbmlxdWVOYW1lID0gZ2V0VW5pcXVlTmFtZShOYW1lKTsKKyAgICAKKyNpZiBERUJVR19TWU1CT0xfVEFCTEUKKyAgICBkdW1wKCk7CisgICAgZGJncygpIDw8ICIgSW5zZXJ0aW5nIHR5cGU6ICIgPDwgVW5pcXVlTmFtZSA8PCAiOiAiCisgICAgICAgICAgIDw8IFQtPmdldERlc2NyaXB0aW9uKCkgPDwgIlxuIjsKKyNlbmRpZgorCisgICAgLy8gSW5zZXJ0IHRoZSB0bWFwIGVudHJ5CisgICAgdG1hcC5pbnNlcnQobWFrZV9wYWlyKFVuaXF1ZU5hbWUsIFQpKTsKKyAgfQorICAKKyAgLy8gSWYgd2UgYXJlIGFkZGluZyBhbiBhYnN0cmFjdCB0eXBlLCBhZGQgdGhlIHN5bWJvbCB0YWJsZSB0byBpdCdzIHVzZSBsaXN0LgorICBpZiAoVC0+aXNBYnN0cmFjdCgpKSB7CisgICAgY2FzdDxEZXJpdmVkVHlwZT4oVCktPmFkZEFic3RyYWN0VHlwZVVzZXIodGhpcyk7CisjaWYgREVCVUdfQUJTVFlQRQorICAgIGRiZ3MoKSA8PCAiQWRkZWQgYWJzdHJhY3QgdHlwZSB0byBTVDogIiA8PCBULT5nZXREZXNjcmlwdGlvbigpIDw8ICJcbiI7CisjZW5kaWYKKyAgfQorfQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIG9uZSBvZiB0aGUgdHlwZXMgaW4gdGhlIHR5cGUgcGxhbmUgYXJlIHJlZmluZWQKK3ZvaWQgVHlwZVN5bWJvbFRhYmxlOjpyZWZpbmVBYnN0cmFjdFR5cGUoY29uc3QgRGVyaXZlZFR5cGUgKk9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKk5ld1R5cGUpIHsKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdHlwZXMgaW4gdGhlIHN5bWJvbCB0YWJsZSwgcmVwbGFjaW5nIGFueSByZWZlcmVuY2VzCisgIC8vIHRvIE9sZFR5cGUgd2l0aCByZWZlcmVuY2VzIHRvIE5ld1R5cGUuICBOb3RlIHRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlCisgIC8vIG9jY3VycmVuY2VzLCBhbmQgYWx0aG91Z2ggd2Ugb25seSBuZWVkIHRvIHJlbW92ZSBvbmUgYXQgYSB0aW1lLCBpdCdzCisgIC8vIGZhc3RlciB0byByZW1vdmUgdGhlbSBhbGwgaW4gb25lIHBhc3MuCisgIC8vCisgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAvLyBGSVhNRSB3aGVuIFR5cGVzIGFyZW4ndCBjb25zdC4KKyAgICBpZiAoSS0+c2Vjb25kID09IGNvbnN0X2Nhc3Q8RGVyaXZlZFR5cGUgKj4oT2xkVHlwZSkpIHsKKyNpZiBERUJVR19BQlNUWVBFCisgICAgICBkYmdzKCkgPDwgIlJlbW92aW5nIHR5cGUgIiA8PCBPbGRUeXBlLT5nZXREZXNjcmlwdGlvbigpIDw8ICJcbiI7CisjZW5kaWYKKyAgICAgIE9sZFR5cGUtPnJlbW92ZUFic3RyYWN0VHlwZVVzZXIodGhpcyk7CisKKyAgICAgIC8vIFRPRE8gRklYTUUgd2hlbiB0eXBlcyBhcmVuJ3QgY29uc3QKKyAgICAgIEktPnNlY29uZCA9IGNvbnN0X2Nhc3Q8VHlwZSAqPihOZXdUeXBlKTsKKyAgICAgIGlmIChOZXdUeXBlLT5pc0Fic3RyYWN0KCkpIHsKKyNpZiBERUJVR19BQlNUWVBFCisgICAgICAgIGRiZ3MoKSA8PCAiQWRkZWQgdHlwZSAiIDw8IE5ld1R5cGUtPmdldERlc2NyaXB0aW9uKCkgPDwgIlxuIjsKKyNlbmRpZgorICAgICAgICBjYXN0PERlcml2ZWRUeXBlPihOZXdUeXBlKS0+YWRkQWJzdHJhY3RUeXBlVXNlcih0aGlzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvLyBIYW5kbGUgc2l0dWF0aW9uIHdoZXJlIHR5cGUgYmVjb21lcyBDb25jcmVhdGUgZnJvbSBBYnN0cmFjdAordm9pZCBUeXBlU3ltYm9sVGFibGU6OnR5cGVCZWNhbWVDb25jcmV0ZShjb25zdCBEZXJpdmVkVHlwZSAqQWJzVHkpIHsKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdHlwZXMgaW4gdGhlIHN5bWJvbCB0YWJsZSwgZHJvcHBpbmcgYW55IGFic3RyYWN0CisgIC8vIHR5cGUgdXNlciBlbnRyaWVzIGZvciBBYnNUeSB3aGljaCBvY2N1ciBiZWNhdXNlIHRoZXJlIGFyZSBuYW1lcyBmb3IgdGhlCisgIC8vIHR5cGUuCisgIGZvciAoaXRlcmF0b3IgVEkgPSBiZWdpbigpLCBURSA9IGVuZCgpOyBUSSAhPSBURTsgKytUSSkKKyAgICBpZiAoVEktPnNlY29uZCA9PSBjb25zdF9jYXN0PFR5cGUqPihzdGF0aWNfY2FzdDxjb25zdCBUeXBlKj4oQWJzVHkpKSkKKyAgICAgIEFic1R5LT5yZW1vdmVBYnN0cmFjdFR5cGVVc2VyKHRoaXMpOworfQorCitzdGF0aWMgdm9pZCBEdW1wVHlwZXMoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBjb25zdCBUeXBlKj4mIFQgKSB7CisgIGRiZ3MoKSA8PCAiICAnIiA8PCBULmZpcnN0IDw8ICInID0gIjsKKyAgVC5zZWNvbmQtPmR1bXAoKTsKKyAgZGJncygpIDw8ICJcbiI7Cit9CisKK3ZvaWQgVHlwZVN5bWJvbFRhYmxlOjpkdW1wKCkgY29uc3QgeworICBkYmdzKCkgPDwgIlR5cGVTeW1ib2xQbGFuZTogIjsKKyAgZm9yX2VhY2godG1hcC5iZWdpbigpLCB0bWFwLmVuZCgpLCBEdW1wVHlwZXMpOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL1R5cGVzQ29udGV4dC5oIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9UeXBlc0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTliODBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9UeXBlc0NvbnRleHQuaApAQCAtMCwwICsxLDQ1MSBAQAorLy89PT0tLSBUeXBlc0NvbnRleHQuaCAtIFR5cGVzLXJlbGF0ZWQgQ29udGV4dCBJbnRlcm5hbHMgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdmFyaW91cyBoZWxwZXIgbWV0aG9kcyBhbmQgY2xhc3NlcyB1c2VkIGJ5CisvLyBMTFZNQ29udGV4dEltcGwgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyB0eXBlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFlQRVNDT05URVhUX0gKKyNkZWZpbmUgTExWTV9UWVBFU0NPTlRFWFRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8bWFwPgorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgRGVyaXZlZCBUeXBlIEZhY3RvcnkgRnVuY3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworbmFtZXNwYWNlIGxsdm0geworCisvLy8gZ2V0U3ViRWxlbWVudEhhc2ggLSBHZW5lcmF0ZSBhIGhhc2ggdmFsdWUgZm9yIGFsbCBvZiB0aGUgU3ViVHlwZSdzIG9mIHRoaXMKKy8vLyB0eXBlLiAgVGhlIGhhc2ggdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIGlmIGFueSBvZiB0aGUgc3VidHlwZXMgYXJlIAorLy8vIGFuIG9wYXF1ZSB0eXBlLiAgT3RoZXJ3aXNlIHdlIHRyeSB0byBtaXggdGhlbSBpbiBhcyB3ZWxsIGFzIHBvc3NpYmxlLCBidXQgZG8KKy8vLyBub3QgbG9vayBhdCB0aGUgc3VidHlwZSdzIHN1YnR5cGUncy4KK3N0YXRpYyB1bnNpZ25lZCBnZXRTdWJFbGVtZW50SGFzaChjb25zdCBUeXBlICpUeSkgeworICB1bnNpZ25lZCBIYXNoVmFsID0gMDsKKyAgZm9yIChUeXBlOjpzdWJ0eXBlX2l0ZXJhdG9yIEkgPSBUeS0+c3VidHlwZV9iZWdpbigpLCBFID0gVHktPnN1YnR5cGVfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBIYXNoVmFsICo9IDMyOworICAgIGNvbnN0IFR5cGUgKlN1YlR5ID0gSS0+Z2V0KCk7CisgICAgSGFzaFZhbCArPSBTdWJUeS0+Z2V0VHlwZUlEKCk7CisgICAgc3dpdGNoIChTdWJUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIFR5cGU6Ok9wYXF1ZVR5SUQ6IHJldHVybiAwOyAgICAvLyBPcGFxdWUgLT4gaGFzaCA9IDAgbm8gbWF0dGVyIHdoYXQuCisgICAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgICAgIEhhc2hWYWwgXj0gKGNhc3Q8SW50ZWdlclR5cGU+KFN1YlR5KS0+Z2V0Qml0V2lkdGgoKSA8PCAzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZTo6RnVuY3Rpb25UeUlEOgorICAgICAgSGFzaFZhbCBePSBjYXN0PEZ1bmN0aW9uVHlwZT4oU3ViVHkpLT5nZXROdW1QYXJhbXMoKSoyICsgCisgICAgICAgICAgICAgICAgIGNhc3Q8RnVuY3Rpb25UeXBlPihTdWJUeSktPmlzVmFyQXJnKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGU6OkFycmF5VHlJRDoKKyAgICAgIEhhc2hWYWwgXj0gY2FzdDxBcnJheVR5cGU+KFN1YlR5KS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZTo6VmVjdG9yVHlJRDoKKyAgICAgIEhhc2hWYWwgXj0gY2FzdDxWZWN0b3JUeXBlPihTdWJUeSktPmdldE51bUVsZW1lbnRzKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGU6OlN0cnVjdFR5SUQ6CisgICAgICBIYXNoVmFsIF49IGNhc3Q8U3RydWN0VHlwZT4oU3ViVHkpLT5nZXROdW1FbGVtZW50cygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICAgIEhhc2hWYWwgXj0gY2FzdDxQb2ludGVyVHlwZT4oU3ViVHkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gSGFzaFZhbCA/IEhhc2hWYWwgOiAxOyAgLy8gRG8gbm90IHJldHVybiB6ZXJvIHVubGVzcyBvcGFxdWUgc3VidHkuCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnRlZ2VyIFR5cGUgRmFjdG9yeS4uLgorLy8KK2NsYXNzIEludGVnZXJWYWxUeXBlIHsKKyAgdWludDMyX3QgYml0czsKK3B1YmxpYzoKKyAgSW50ZWdlclZhbFR5cGUodWludDMyX3QgbnVtYml0cykgOiBiaXRzKG51bWJpdHMpIHt9CisKKyAgc3RhdGljIEludGVnZXJWYWxUeXBlIGdldChjb25zdCBJbnRlZ2VyVHlwZSAqVHkpIHsKKyAgICByZXR1cm4gSW50ZWdlclZhbFR5cGUoVHktPmdldEJpdFdpZHRoKCkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGhhc2hUeXBlU3RydWN0dXJlKGNvbnN0IEludGVnZXJUeXBlICpUeSkgeworICAgIHJldHVybiAodW5zaWduZWQpVHktPmdldEJpdFdpZHRoKCk7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgSW50ZWdlclZhbFR5cGUgJklWVCkgY29uc3QgeworICAgIHJldHVybiBiaXRzIDwgSVZULmJpdHM7CisgIH0KK307CisKKy8vIFBvaW50ZXJWYWxUeXBlIC0gRGVmaW5lIGEgY2xhc3MgdG8gaG9sZCB0aGUga2V5IHRoYXQgZ29lcyBpbnRvIHRoZSBUeXBlTWFwCisvLworY2xhc3MgUG9pbnRlclZhbFR5cGUgeworICBjb25zdCBUeXBlICpWYWxUeTsKKyAgdW5zaWduZWQgQWRkcmVzc1NwYWNlOworcHVibGljOgorICBQb2ludGVyVmFsVHlwZShjb25zdCBUeXBlICp2YWwsIHVuc2lnbmVkIGFzKSA6IFZhbFR5KHZhbCksIEFkZHJlc3NTcGFjZShhcykge30KKworICBzdGF0aWMgUG9pbnRlclZhbFR5cGUgZ2V0KGNvbnN0IFBvaW50ZXJUeXBlICpQVCkgeworICAgIHJldHVybiBQb2ludGVyVmFsVHlwZShQVC0+Z2V0RWxlbWVudFR5cGUoKSwgUFQtPmdldEFkZHJlc3NTcGFjZSgpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBoYXNoVHlwZVN0cnVjdHVyZShjb25zdCBQb2ludGVyVHlwZSAqUFQpIHsKKyAgICByZXR1cm4gZ2V0U3ViRWxlbWVudEhhc2goUFQpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUG9pbnRlclZhbFR5cGUgJk1UVikgY29uc3QgeworICAgIGlmIChBZGRyZXNzU3BhY2UgPCBNVFYuQWRkcmVzc1NwYWNlKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gQWRkcmVzc1NwYWNlID09IE1UVi5BZGRyZXNzU3BhY2UgJiYgVmFsVHkgPCBNVFYuVmFsVHk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBcnJheSBUeXBlIEZhY3RvcnkuLi4KKy8vCitjbGFzcyBBcnJheVZhbFR5cGUgeworICBjb25zdCBUeXBlICpWYWxUeTsKKyAgdWludDY0X3QgU2l6ZTsKK3B1YmxpYzoKKyAgQXJyYXlWYWxUeXBlKGNvbnN0IFR5cGUgKnZhbCwgdWludDY0X3Qgc3opIDogVmFsVHkodmFsKSwgU2l6ZShzeikge30KKworICBzdGF0aWMgQXJyYXlWYWxUeXBlIGdldChjb25zdCBBcnJheVR5cGUgKkFUKSB7CisgICAgcmV0dXJuIEFycmF5VmFsVHlwZShBVC0+Z2V0RWxlbWVudFR5cGUoKSwgQVQtPmdldE51bUVsZW1lbnRzKCkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGhhc2hUeXBlU3RydWN0dXJlKGNvbnN0IEFycmF5VHlwZSAqQVQpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKUFULT5nZXROdW1FbGVtZW50cygpOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEFycmF5VmFsVHlwZSAmTVRWKSBjb25zdCB7CisgICAgaWYgKFNpemUgPCBNVFYuU2l6ZSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFNpemUgPT0gTVRWLlNpemUgJiYgVmFsVHkgPCBNVFYuVmFsVHk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBWZWN0b3IgVHlwZSBGYWN0b3J5Li4uCisvLworY2xhc3MgVmVjdG9yVmFsVHlwZSB7CisgIGNvbnN0IFR5cGUgKlZhbFR5OworICB1bnNpZ25lZCBTaXplOworcHVibGljOgorICBWZWN0b3JWYWxUeXBlKGNvbnN0IFR5cGUgKnZhbCwgaW50IHN6KSA6IFZhbFR5KHZhbCksIFNpemUoc3opIHt9CisKKyAgc3RhdGljIFZlY3RvclZhbFR5cGUgZ2V0KGNvbnN0IFZlY3RvclR5cGUgKlBUKSB7CisgICAgcmV0dXJuIFZlY3RvclZhbFR5cGUoUFQtPmdldEVsZW1lbnRUeXBlKCksIFBULT5nZXROdW1FbGVtZW50cygpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBoYXNoVHlwZVN0cnVjdHVyZShjb25zdCBWZWN0b3JUeXBlICpQVCkgeworICAgIHJldHVybiBQVC0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBWZWN0b3JWYWxUeXBlICZNVFYpIGNvbnN0IHsKKyAgICBpZiAoU2l6ZSA8IE1UVi5TaXplKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gU2l6ZSA9PSBNVFYuU2l6ZSAmJiBWYWxUeSA8IE1UVi5WYWxUeTsKKyAgfQorfTsKKworLy8gU3RydWN0VmFsVHlwZSAtIERlZmluZSBhIGNsYXNzIHRvIGhvbGQgdGhlIGtleSB0aGF0IGdvZXMgaW50byB0aGUgVHlwZU1hcAorLy8KK2NsYXNzIFN0cnVjdFZhbFR5cGUgeworICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gRWxUeXBlczsKKyAgYm9vbCBwYWNrZWQ7CitwdWJsaWM6CisgIFN0cnVjdFZhbFR5cGUoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+ICZhcmdzLCBib29sIGlzUGFja2VkKQorICAgIDogRWxUeXBlcyhhcmdzKSwgcGFja2VkKGlzUGFja2VkKSB7fQorCisgIHN0YXRpYyBTdHJ1Y3RWYWxUeXBlIGdldChjb25zdCBTdHJ1Y3RUeXBlICpTVCkgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUgKj4gRWxUeXBlczsKKyAgICBFbFR5cGVzLnJlc2VydmUoU1QtPmdldE51bUVsZW1lbnRzKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTVC0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBFbFR5cGVzLnB1c2hfYmFjayhTVC0+Z2V0RWxlbWVudFR5cGUoaSkpOworCisgICAgcmV0dXJuIFN0cnVjdFZhbFR5cGUoRWxUeXBlcywgU1QtPmlzUGFja2VkKCkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGhhc2hUeXBlU3RydWN0dXJlKGNvbnN0IFN0cnVjdFR5cGUgKlNUKSB7CisgICAgcmV0dXJuIFNULT5nZXROdW1FbGVtZW50cygpOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0cnVjdFZhbFR5cGUgJlNUVikgY29uc3QgeworICAgIGlmIChFbFR5cGVzIDwgU1RWLkVsVHlwZXMpIHJldHVybiB0cnVlOworICAgIGVsc2UgaWYgKEVsVHlwZXMgPiBTVFYuRWxUeXBlcykgcmV0dXJuIGZhbHNlOworICAgIGVsc2UgcmV0dXJuIChpbnQpcGFja2VkIDwgKGludClTVFYucGFja2VkOworICB9Cit9OworCisvLyBVbmlvblZhbFR5cGUgLSBEZWZpbmUgYSBjbGFzcyB0byBob2xkIHRoZSBrZXkgdGhhdCBnb2VzIGludG8gdGhlIFR5cGVNYXAKKy8vCitjbGFzcyBVbmlvblZhbFR5cGUgeworICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gRWxUeXBlczsKK3B1YmxpYzoKKyAgVW5pb25WYWxUeXBlKGNvbnN0IFR5cGUqIGNvbnN0KiBUeXBlcywgdW5zaWduZWQgTnVtVHlwZXMpCisgICAgOiBFbFR5cGVzKCZUeXBlc1swXSwgJlR5cGVzW051bVR5cGVzXSkge30KKworICBzdGF0aWMgVW5pb25WYWxUeXBlIGdldChjb25zdCBVbmlvblR5cGUgKlVUKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSAqPiBFbFR5cGVzOworICAgIEVsVHlwZXMucmVzZXJ2ZShVVC0+Z2V0TnVtRWxlbWVudHMoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFVULT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkKKyAgICAgIEVsVHlwZXMucHVzaF9iYWNrKFVULT5nZXRFbGVtZW50VHlwZShpKSk7CisKKyAgICByZXR1cm4gVW5pb25WYWxUeXBlKCZFbFR5cGVzWzBdLCBFbFR5cGVzLnNpemUoKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgaGFzaFR5cGVTdHJ1Y3R1cmUoY29uc3QgVW5pb25UeXBlICpVVCkgeworICAgIHJldHVybiBVVC0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBVbmlvblZhbFR5cGUgJlVUVikgY29uc3QgeworICAgIHJldHVybiAoRWxUeXBlcyA8IFVUVi5FbFR5cGVzKTsKKyAgfQorfTsKKworLy8gRnVuY3Rpb25WYWxUeXBlIC0gRGVmaW5lIGEgY2xhc3MgdG8gaG9sZCB0aGUga2V5IHRoYXQgZ29lcyBpbnRvIHRoZSBUeXBlTWFwCisvLworY2xhc3MgRnVuY3Rpb25WYWxUeXBlIHsKKyAgY29uc3QgVHlwZSAqUmV0VHk7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBBcmdUeXBlczsKKyAgYm9vbCBpc1ZhckFyZzsKK3B1YmxpYzoKKyAgRnVuY3Rpb25WYWxUeXBlKGNvbnN0IFR5cGUgKnJldCwgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+ICZhcmdzLAorICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZBKSA6IFJldFR5KHJldCksIEFyZ1R5cGVzKGFyZ3MpLCBpc1ZhckFyZyhpc1ZBKSB7fQorCisgIHN0YXRpYyBGdW5jdGlvblZhbFR5cGUgZ2V0KGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQpOworCisgIHN0YXRpYyB1bnNpZ25lZCBoYXNoVHlwZVN0cnVjdHVyZShjb25zdCBGdW5jdGlvblR5cGUgKkZUKSB7CisgICAgdW5zaWduZWQgUmVzdWx0ID0gRlQtPmdldE51bVBhcmFtcygpKjIgKyBGVC0+aXNWYXJBcmcoKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZ1bmN0aW9uVmFsVHlwZSAmTVRWKSBjb25zdCB7CisgICAgaWYgKFJldFR5IDwgTVRWLlJldFR5KSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoUmV0VHkgPiBNVFYuUmV0VHkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoaXNWYXJBcmcgPCBNVFYuaXNWYXJBcmcpIHJldHVybiB0cnVlOworICAgIGlmIChpc1ZhckFyZyA+IE1UVi5pc1ZhckFyZykgcmV0dXJuIGZhbHNlOworICAgIGlmIChBcmdUeXBlcyA8IE1UVi5BcmdUeXBlcykgcmV0dXJuIHRydWU7CisgICAgaWYgKEFyZ1R5cGVzID4gTVRWLkFyZ1R5cGVzKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitjbGFzcyBUeXBlTWFwQmFzZSB7Citwcm90ZWN0ZWQ6CisgIC8vLyBUeXBlc0J5SGFzaCAtIEtlZXAgdHJhY2sgb2YgdHlwZXMgYnkgdGhlaXIgc3RydWN0dXJlIGhhc2ggdmFsdWUuICBOb3RlCisgIC8vLyB0aGF0IHdlIG9ubHkga2VlcCB0cmFjayBvZiB0eXBlcyB0aGF0IGhhdmUgY3ljbGVzIHRocm91Z2ggdGhlbXNlbHZlcyBpbgorICAvLy8gdGhpcyBtYXAuCisgIC8vLworICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBQQVR5cGVIb2xkZXI+IFR5cGVzQnlIYXNoOworCisgIH5UeXBlTWFwQmFzZSgpIHsKKyAgICAvLyBQQVR5cGVIb2xkZXIgd29uJ3QgZGVzdHJveSBub24tYWJzdHJhY3QgdHlwZXMuCisgICAgLy8gV2UgY2FuJ3QgZGVzdHJveSB0aGVtIGJ5IHNpbXBseSBpdGVyYXRpbmcsIGJlY2F1c2UKKyAgICAvLyB0aGV5IG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gZWFjaC1vdGhlci4KKyAgICBmb3IgKHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIFBBVHlwZUhvbGRlcj46Oml0ZXJhdG9yIEkKKyAgICAgICAgID0gVHlwZXNCeUhhc2guYmVnaW4oKSwgRSA9IFR5cGVzQnlIYXNoLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgVHlwZSAqVHkgPSBjb25zdF9jYXN0PFR5cGUqPihJLT5zZWNvbmQuVHkpOworICAgICAgSS0+c2Vjb25kLmRlc3Ryb3koKTsKKyAgICAgIC8vIFdlIGNhbid0IGludm9rZSBkZXN0cm95IG9yIGRlbGV0ZSwgYmVjYXVzZSB0aGUgdHlwZSBtYXkKKyAgICAgIC8vIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBhbHJlYWR5IGZyZWVkIHR5cGVzLgorICAgICAgLy8gU28gd2UgaGF2ZSB0byBkZXN0cnVjdCB0aGUgb2JqZWN0IHRoZSB1Z2x5IHdheS4KKyAgICAgIGlmIChUeSkgeworICAgICAgICBUeS0+QWJzdHJhY3RUeXBlVXNlcnMuY2xlYXIoKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSo+KFR5KS0+VHlwZTo6flR5cGUoKTsKKyAgICAgICAgb3BlcmF0b3IgZGVsZXRlKFR5KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHVibGljOgorICB2b2lkIFJlbW92ZUZyb21UeXBlc0J5SGFzaCh1bnNpZ25lZCBIYXNoLCBjb25zdCBUeXBlICpUeSkgeworICAgIHN0ZDo6bXVsdGltYXA8dW5zaWduZWQsIFBBVHlwZUhvbGRlcj46Oml0ZXJhdG9yIEkgPQorICAgICAgVHlwZXNCeUhhc2gubG93ZXJfYm91bmQoSGFzaCk7CisgICAgZm9yICg7IEkgIT0gVHlwZXNCeUhhc2guZW5kKCkgJiYgSS0+Zmlyc3QgPT0gSGFzaDsgKytJKSB7CisgICAgICBpZiAoSS0+c2Vjb25kID09IFR5KSB7CisgICAgICAgIFR5cGVzQnlIYXNoLmVyYXNlKEkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBtdXN0IGJlIGRvIHRvIGFuIG9wYXF1ZSB0eXBlIHRoYXQgd2FzIHJlc29sdmVkLiAgU3dpdGNoIGRvd24gdG8gaGFzaAorICAgIC8vIGNvZGUgb2YgemVyby4KKyAgICBhc3NlcnQoSGFzaCAmJiAiRGlkbid0IGZpbmQgdHlwZSBlbnRyeSEiKTsKKyAgICBSZW1vdmVGcm9tVHlwZXNCeUhhc2goMCwgVHkpOworICB9CisKKyAgLy8vIFR5cGVCZWNhbWVDb25jcmV0ZSAtIFdoZW4gVHkgZ2V0cyBhIG5vdGlmaWNhdGlvbiB0aGF0IFRoZVR5cGUganVzdCBiZWNhbWUKKyAgLy8vIGNvbmNyZXRlLCBkcm9wIHVzZXMgYW5kIG1ha2UgVHkgbm9uLWFic3RyYWN0IGlmIHdlIHNob3VsZC4KKyAgdm9pZCBUeXBlQmVjYW1lQ29uY3JldGUoRGVyaXZlZFR5cGUgKlR5LCBjb25zdCBEZXJpdmVkVHlwZSAqVGhlVHlwZSkgeworICAgIC8vIElmIHRoZSBlbGVtZW50IGp1c3QgYmVjYW1lIGNvbmNyZXRlLCByZW1vdmUgJ3R5JyBmcm9tIHRoZSBhYnN0cmFjdAorICAgIC8vIHR5cGUgdXNlciBsaXN0IGZvciB0aGUgdHlwZS4gIERvIHRoaXMgZm9yIGFzIG1hbnkgdGltZXMgYXMgVHkgdXNlcworICAgIC8vIE9sZFR5cGUuCisgICAgZm9yIChUeXBlOjpzdWJ0eXBlX2l0ZXJhdG9yIEkgPSBUeS0+c3VidHlwZV9iZWdpbigpLCBFID0gVHktPnN1YnR5cGVfZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIGlmIChJLT5nZXQoKSA9PSBUaGVUeXBlKQorICAgICAgICBUaGVUeXBlLT5yZW1vdmVBYnN0cmFjdFR5cGVVc2VyKFR5KTsKKworICAgIC8vIElmIHRoZSB0eXBlIGlzIGN1cnJlbnRseSB0aG91Z2h0IHRvIGJlIGFic3RyYWN0LCByZXNjYW4gYWxsIG9mIG91cgorICAgIC8vIHN1YnR5cGVzIHRvIHNlZSBpZiB0aGUgdHlwZSBoYXMganVzdCBiZWNvbWUgY29uY3JldGUhICBOb3RlIHRoYXQgdGhpcworICAgIC8vIG1heSBzZW5kIG91dCBub3RpZmljYXRpb25zIHRvIEFic3RyYWN0VHlwZVVzZXJzIHRoYXQgdHlwZXMgYmVjb21lCisgICAgLy8gY29uY3JldGUuCisgICAgaWYgKFR5LT5pc0Fic3RyYWN0KCkpCisgICAgICBUeS0+UHJvbW90ZUFic3RyYWN0VG9Db25jcmV0ZSgpOworICB9Cit9OworCisvLyBUeXBlTWFwIC0gTWFrZSBzdXJlIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIHR5cGUgbWF5IGJlCisvLyBjcmVhdGVkIG9uIGFueSBnaXZlbiBydW4gb2YgdGhlIGNvbXBpbGVyLi4uIG5vdGUgdGhhdCB0aGlzIGludm9sdmVzIHVwZGF0aW5nCisvLyBvdXIgbWFwIGlmIGFuIGFic3RyYWN0IHR5cGUgZ2V0cyByZWZpbmVkIHNvbWVob3cuCisvLwordGVtcGxhdGU8Y2xhc3MgVmFsVHlwZSwgY2xhc3MgVHlwZUNsYXNzPgorY2xhc3MgVHlwZU1hcCA6IHB1YmxpYyBUeXBlTWFwQmFzZSB7CisgIHN0ZDo6bWFwPFZhbFR5cGUsIFBBVHlwZUhvbGRlcj4gTWFwOworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFwPFZhbFR5cGUsIFBBVHlwZUhvbGRlcj46Oml0ZXJhdG9yIGl0ZXJhdG9yOworCisgIGlubGluZSBUeXBlQ2xhc3MgKmdldChjb25zdCBWYWxUeXBlICZWKSB7CisgICAgaXRlcmF0b3IgSSA9IE1hcC5maW5kKFYpOworICAgIHJldHVybiBJICE9IE1hcC5lbmQoKSA/IGNhc3Q8VHlwZUNsYXNzPigoVHlwZSopSS0+c2Vjb25kLmdldCgpKSA6IDA7CisgIH0KKworICBpbmxpbmUgdm9pZCBhZGQoY29uc3QgVmFsVHlwZSAmViwgVHlwZUNsYXNzICpUeSkgeworICAgIE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoViwgVHkpKTsKKworICAgIC8vIElmIHRoaXMgdHlwZSBoYXMgYSBjeWNsZSwgcmVtZW1iZXIgaXQuCisgICAgVHlwZXNCeUhhc2guaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFZhbFR5cGU6Omhhc2hUeXBlU3RydWN0dXJlKFR5KSwgVHkpKTsKKyAgICBwcmludCgiYWRkIik7CisgIH0KKyAgCisgIC8vLyBSZWZpbmVBYnN0cmFjdFR5cGUgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgd2UgaGF2ZSBtZXJnZWQgYSB0eXBlCisgIC8vLyB3aXRoIGFub3RoZXIgb25lLiAgV2UgbXVzdCBub3cgZWl0aGVyIG1lcmdlIHRoZSB0eXBlIGF3YXkgd2l0aAorICAvLy8gc29tZSBvdGhlciB0eXBlIG9yIHJlaW5zdGFsbCBpdCBpbiB0aGUgbWFwIHdpdGggaXQncyBuZXcgY29uZmlndXJhdGlvbi4KKyAgdm9pZCBSZWZpbmVBYnN0cmFjdFR5cGUoVHlwZUNsYXNzICpUeSwgY29uc3QgRGVyaXZlZFR5cGUgKk9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICpOZXdUeXBlKSB7CisjaWZkZWYgREVCVUdfTUVSR0VfVFlQRVMKKyAgICBERUJVRyhkYmdzKCkgPDwgIlJlZmluZUFic3RyYWN0VHlwZSgiIDw8ICh2b2lkKilPbGRUeXBlIDw8ICJbIiA8PCAqT2xkVHlwZQorICAgICAgICAgICAgICAgICA8PCAiXSwgIiA8PCAodm9pZCopTmV3VHlwZSA8PCAiIFsiIDw8ICpOZXdUeXBlIDw8ICJdKVxuIik7CisjZW5kaWYKKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIHdlIGFyZSBjaGFuZ2luZyBvbmUgc3ViZWxlbWVudCB0eXBlIGludG8gYW5vdGhlci4gIENsZWFybHkgdGhlCisgICAgLy8gT2xkVHlwZSBtdXN0IGhhdmUgYmVlbiBhYnN0cmFjdCwgbWFraW5nIHVzIGFic3RyYWN0LgorICAgIGFzc2VydChUeS0+aXNBYnN0cmFjdCgpICYmICJSZWZpbmluZyBhIG5vbi1hYnN0cmFjdCB0eXBlISIpOworICAgIGFzc2VydChPbGRUeXBlICE9IE5ld1R5cGUpOworCisgICAgLy8gTWFrZSBhIHRlbXBvcmFyeSB0eXBlIGhvbGRlciBmb3IgdGhlIHR5cGUgc28gdGhhdCBpdCBkb2Vzbid0IGRpc2FwcGVhciBvbgorICAgIC8vIHVzIHdoZW4gd2UgZXJhc2UgdGhlIGVudHJ5IGZyb20gdGhlIG1hcC4KKyAgICBQQVR5cGVIb2xkZXIgVHlIb2xkZXIgPSBUeTsKKworICAgIC8vIFRoZSBvbGQgcmVjb3JkIGlzIG5vdyBvdXQtb2YtZGF0ZSwgYmVjYXVzZSBvbmUgb2YgdGhlIGNoaWxkcmVuIGhhcyBiZWVuCisgICAgLy8gdXBkYXRlZC4gIFJlbW92ZSB0aGUgb2Jzb2xldGUgZW50cnkgZnJvbSB0aGUgbWFwLgorICAgIHVuc2lnbmVkIE51bUVyYXNlZCA9IE1hcC5lcmFzZShWYWxUeXBlOjpnZXQoVHkpKTsKKyAgICBhc3NlcnQoTnVtRXJhc2VkICYmICJFbGVtZW50IG5vdCBmb3VuZCEiKTsgTnVtRXJhc2VkID0gTnVtRXJhc2VkOworCisgICAgLy8gUmVtZW1iZXIgdGhlIHN0cnVjdHVyYWwgaGFzaCBmb3IgdGhlIHR5cGUgYmVmb3JlIHdlIHN0YXJ0IGhhY2tpbmcgb24gaXQsCisgICAgLy8gaW4gY2FzZSB3ZSBuZWVkIGl0IGxhdGVyLgorICAgIHVuc2lnbmVkIE9sZFR5cGVIYXNoID0gVmFsVHlwZTo6aGFzaFR5cGVTdHJ1Y3R1cmUoVHkpOworCisgICAgLy8gRmluZCB0aGUgdHlwZSBlbGVtZW50IHdlIGFyZSByZWZpbmluZy4uLiBhbmQgY2hhbmdlIGl0IG5vdyEKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVHktPmdldE51bUNvbnRhaW5lZFR5cGVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFR5LT5Db250YWluZWRUeXNbaV0gPT0gT2xkVHlwZSkKKyAgICAgICAgVHktPkNvbnRhaW5lZFR5c1tpXSA9IE5ld1R5cGU7CisgICAgdW5zaWduZWQgTmV3VHlwZUhhc2ggPSBWYWxUeXBlOjpoYXNoVHlwZVN0cnVjdHVyZShUeSk7CisgICAgCisgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGN5Y2xlcyBnb2luZyB0aHJvdWdoIHRoaXMgbm9kZSwgd2UgY2FuIGRvIGEgc2ltcGxlLAorICAgIC8vIGVmZmljaWVudCBsb29rdXAgaW4gdGhlIG1hcCwgaW5zdGVhZCBvZiBhbiBpbmVmZmljaWVudCBuYXN0eSBsaW5lYXIKKyAgICAvLyBsb29rdXAuCisgICAgaWYgKCFUeXBlSGFzQ3ljbGVUaHJvdWdoSXRzZWxmKFR5KSkgeworICAgICAgdHlwZW5hbWUgc3RkOjptYXA8VmFsVHlwZSwgUEFUeXBlSG9sZGVyPjo6aXRlcmF0b3IgSTsKKyAgICAgIGJvb2wgSW5zZXJ0ZWQ7CisKKyAgICAgIHRpZShJLCBJbnNlcnRlZCkgPSBNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFZhbFR5cGU6OmdldChUeSksIFR5KSk7CisgICAgICBpZiAoIUluc2VydGVkKSB7CisgICAgICAgIC8vIFJlZmluZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBhbHRvZ2V0aGVyPworICAgICAgICBSZW1vdmVGcm9tVHlwZXNCeUhhc2goT2xkVHlwZUhhc2gsIFR5KTsKKworICAgICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgdGhpcyB0eXBlIGluIHRoZSB0YWJsZS4gIEdldCByaWQgb2YgdGhlIG5ld2x5IHJlZmluZWQKKyAgICAgICAgLy8gdHlwZS4KKyAgICAgICAgVHlwZUNsYXNzICpOZXdUeSA9IGNhc3Q8VHlwZUNsYXNzPigoVHlwZSopSS0+c2Vjb25kLmdldCgpKTsKKyAgICAgICAgVHktPnJlZmluZUFic3RyYWN0VHlwZVRvKE5ld1R5KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBOb3cgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGVudHJ5IGluIHRoZSB0YWJsZSB3aGljaCBpcworICAgICAgLy8gc3RydWN0dXJhbGx5IGlkZW50aWNhbCB0byB0aGUgbmV3bHkgcmVmaW5lZCB0eXBlLiAgSWYgc28sIHRoaXMgdHlwZQorICAgICAgLy8gZ2V0cyByZWZpbmVkIHRvIHRoZSBwcmUtZXhpc3RpbmcgdHlwZS4KKyAgICAgIC8vCisgICAgICBzdGQ6Om11bHRpbWFwPHVuc2lnbmVkLCBQQVR5cGVIb2xkZXI+OjppdGVyYXRvciBJLCBFLCBFbnRyeTsKKyAgICAgIHRpZShJLCBFKSA9IFR5cGVzQnlIYXNoLmVxdWFsX3JhbmdlKE5ld1R5cGVIYXNoKTsKKyAgICAgIEVudHJ5ID0gRTsKKyAgICAgIGZvciAoOyBJICE9IEU7ICsrSSkgeworICAgICAgICBpZiAoSS0+c2Vjb25kID09IFR5KSB7CisgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIHBvc2l0aW9uIG9mIHRoZSBvbGQgdHlwZSBpZiB3ZSBzZWUgaXQgaW4gb3VyIHNjYW4uCisgICAgICAgICAgRW50cnkgPSBJOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIVR5cGVzRXF1YWwoVHksIEktPnNlY29uZCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorICAgICAgICBUeXBlQ2xhc3MgKk5ld1R5ID0gY2FzdDxUeXBlQ2xhc3M+KChUeXBlKilJLT5zZWNvbmQuZ2V0KCkpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIGVudHJ5IGZvcm0gVHlwZXNCeUhhc2guICBJZiB0aGUgaGFzaCB2YWx1ZXMgZGlmZmVyCisgICAgICAgIC8vIG5vdywgcmVtb3ZlIGl0IGZyb20gdGhlIG9sZCBwbGFjZS4gIE90aGVyd2lzZSwgY29udGludWUgc2Nhbm5pbmcKKyAgICAgICAgLy8gd2l0aGluZyB0aGlzIGhhc2hjb2RlIHRvIHJlZHVjZSB3b3JrLgorICAgICAgICBpZiAoTmV3VHlwZUhhc2ggIT0gT2xkVHlwZUhhc2gpIHsKKyAgICAgICAgICBSZW1vdmVGcm9tVHlwZXNCeUhhc2goT2xkVHlwZUhhc2gsIFR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoRW50cnkgPT0gRSkgeworICAgICAgICAgICAgLy8gRmluZCB0aGUgbG9jYXRpb24gb2YgVHkgaW4gdGhlIFR5cGVzQnlIYXNoIHN0cnVjdHVyZSBpZiB3ZQorICAgICAgICAgICAgLy8gaGF2ZW4ndCBzZWVuIGl0IGFscmVhZHkuCisgICAgICAgICAgICB3aGlsZSAoSS0+c2Vjb25kICE9IFR5KSB7CisgICAgICAgICAgICAgICsrSTsKKyAgICAgICAgICAgICAgYXNzZXJ0KEkgIT0gRSAmJiAiU3RydWN0dXJlIGRvZXNuJ3QgY29udGFpbiB0eXBlPz8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVudHJ5ID0gSTsKKyAgICAgICAgICB9CisgICAgICAgICAgVHlwZXNCeUhhc2guZXJhc2UoRW50cnkpOworICAgICAgICB9CisgICAgICAgIFR5LT5yZWZpbmVBYnN0cmFjdFR5cGVUbyhOZXdUeSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXhpc3RpbmcgdHlwZSBvZiB0aGUgc2FtZSBzdHJ1Y3R1cmUsIHdlIHJlaW5zZXJ0IGFuCisgICAgICAvLyB1cGRhdGVkIHJlY29yZCBpbnRvIHRoZSBtYXAuCisgICAgICBNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFZhbFR5cGU6OmdldChUeSksIFR5KSk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGhhc2ggY29kZXMgZGlmZmVyLCB1cGRhdGUgVHlwZXNCeUhhc2gKKyAgICBpZiAoTmV3VHlwZUhhc2ggIT0gT2xkVHlwZUhhc2gpIHsKKyAgICAgIFJlbW92ZUZyb21UeXBlc0J5SGFzaChPbGRUeXBlSGFzaCwgVHkpOworICAgICAgVHlwZXNCeUhhc2guaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE5ld1R5cGVIYXNoLCBUeSkpOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGUgdHlwZSBpcyBjdXJyZW50bHkgdGhvdWdodCB0byBiZSBhYnN0cmFjdCwgcmVzY2FuIGFsbCBvZiBvdXIKKyAgICAvLyBzdWJ0eXBlcyB0byBzZWUgaWYgdGhlIHR5cGUgaGFzIGp1c3QgYmVjb21lIGNvbmNyZXRlISAgTm90ZSB0aGF0IHRoaXMKKyAgICAvLyBtYXkgc2VuZCBvdXQgbm90aWZpY2F0aW9ucyB0byBBYnN0cmFjdFR5cGVVc2VycyB0aGF0IHR5cGVzIGJlY29tZQorICAgIC8vIGNvbmNyZXRlLgorICAgIGlmIChUeS0+aXNBYnN0cmFjdCgpKQorICAgICAgVHktPlByb21vdGVBYnN0cmFjdFRvQ29uY3JldGUoKTsKKyAgfQorCisgIHZvaWQgcHJpbnQoY29uc3QgY2hhciAqQXJnKSBjb25zdCB7CisjaWZkZWYgREVCVUdfTUVSR0VfVFlQRVMKKyAgICBERUJVRyhkYmdzKCkgPDwgIlR5cGVNYXA8Pjo6IiA8PCBBcmcgPDwgIiB0YWJsZSBjb250ZW50czpcbiIpOworICAgIHVuc2lnbmVkIGkgPSAwOworICAgIGZvciAodHlwZW5hbWUgc3RkOjptYXA8VmFsVHlwZSwgUEFUeXBlSG9sZGVyPjo6Y29uc3RfaXRlcmF0b3IgSQorICAgICAgICAgICA9IE1hcC5iZWdpbigpLCBFID0gTWFwLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICIgPDwgKCsraSkgPDwgIi4gIiA8PCAodm9pZCopSS0+c2Vjb25kLmdldCgpIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8ICpJLT5zZWNvbmQuZ2V0KCkgPDwgIlxuIik7CisjZW5kaWYKKyAgfQorCisgIHZvaWQgZHVtcCgpIGNvbnN0IHsgcHJpbnQoImR1bXAgb3V0cHV0Iik7IH0KK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9Vc2UuY3BwIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9Vc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYzcxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS9saWIvVk1Db3JlL1VzZS5jcHAKQEAgLTAsMCArMSwyNDYgQEAKKy8vPT09LS0gVXNlLmNwcCAtIEltcGxlbWVudCB0aGUgVXNlIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGFsZ29yaXRobSBmb3IgZmluZGluZyB0aGUgVXNlciBvZiBhIFVzZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9Vc2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBzd2FwIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIFVzZTo6c3dhcChVc2UgJlJIUykgeworICBWYWx1ZSAqVjEoVmFsKTsKKyAgVmFsdWUgKlYyKFJIUy5WYWwpOworICBpZiAoVjEgIT0gVjIpIHsKKyAgICBpZiAoVjEpIHsKKyAgICAgIHJlbW92ZUZyb21MaXN0KCk7CisgICAgfQorCisgICAgaWYgKFYyKSB7CisgICAgICBSSFMucmVtb3ZlRnJvbUxpc3QoKTsKKyAgICAgIFZhbCA9IFYyOworICAgICAgVjItPmFkZFVzZSgqdGhpcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFZhbCA9IDA7CisgICAgfQorCisgICAgaWYgKFYxKSB7CisgICAgICBSSFMuVmFsID0gVjE7CisgICAgICBWMS0+YWRkVXNlKFJIUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFJIUy5WYWwgPSAwOworICAgIH0KKyAgfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGdldEltcGxpZWRVc2VyIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjb25zdCBVc2UgKlVzZTo6Z2V0SW1wbGllZFVzZXIoKSBjb25zdCB7CisgIGNvbnN0IFVzZSAqQ3VycmVudCA9IHRoaXM7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB1bnNpZ25lZCBUYWcgPSAoQ3VycmVudCsrKS0+UHJldi5nZXRJbnQoKTsKKyAgICBzd2l0Y2ggKFRhZykgeworICAgICAgY2FzZSB6ZXJvRGlnaXRUYWc6CisgICAgICBjYXNlIG9uZURpZ2l0VGFnOgorICAgICAgICBjb250aW51ZTsKKworICAgICAgY2FzZSBzdG9wVGFnOiB7CisgICAgICAgICsrQ3VycmVudDsKKyAgICAgICAgcHRyZGlmZl90IE9mZnNldCA9IDE7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgdW5zaWduZWQgVGFnID0gQ3VycmVudC0+UHJldi5nZXRJbnQoKTsKKyAgICAgICAgICBzd2l0Y2ggKFRhZykgeworICAgICAgICAgICAgY2FzZSB6ZXJvRGlnaXRUYWc6CisgICAgICAgICAgICBjYXNlIG9uZURpZ2l0VGFnOgorICAgICAgICAgICAgICArK0N1cnJlbnQ7CisgICAgICAgICAgICAgIE9mZnNldCA9IChPZmZzZXQgPDwgMSkgKyBUYWc7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0dXJuIEN1cnJlbnQgKyBPZmZzZXQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNhc2UgZnVsbFN0b3BUYWc6CisgICAgICAgIHJldHVybiBDdXJyZW50OworICAgIH0KKyAgfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGluaXRUYWdzIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitVc2UgKlVzZTo6aW5pdFRhZ3MoVXNlICogY29uc3QgU3RhcnQsIFVzZSAqU3RvcCwgcHRyZGlmZl90IERvbmUpIHsKKyAgd2hpbGUgKERvbmUgPCAyMCkgeworICAgIGlmIChTdGFydCA9PSBTdG9wLS0pCisgICAgICByZXR1cm4gU3RhcnQ7CisgICAgc3RhdGljIGNvbnN0IFByZXZQdHJUYWcgdGFnc1syMF0gPSB7IGZ1bGxTdG9wVGFnLCBvbmVEaWdpdFRhZywgc3RvcFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lRGlnaXRUYWcsIG9uZURpZ2l0VGFnLCBzdG9wVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvRGlnaXRUYWcsIG9uZURpZ2l0VGFnLCBvbmVEaWdpdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFRhZywgemVyb0RpZ2l0VGFnLCBvbmVEaWdpdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVyb0RpZ2l0VGFnLCBvbmVEaWdpdFRhZywgc3RvcFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lRGlnaXRUYWcsIG9uZURpZ2l0VGFnLCBvbmVEaWdpdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lRGlnaXRUYWcsIHN0b3BUYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgU3RvcC0+UHJldi5zZXRGcm9tT3BhcXVlVmFsdWUocmVpbnRlcnByZXRfY2FzdDxVc2UqKj4odGFnc1tEb25lKytdKSk7CisgICAgU3RvcC0+VmFsID0gMDsKKyAgfQorCisgIHB0cmRpZmZfdCBDb3VudCA9IERvbmU7CisgIHdoaWxlIChTdGFydCAhPSBTdG9wKSB7CisgICAgLS1TdG9wOworICAgIFN0b3AtPlZhbCA9IDA7CisgICAgaWYgKCFDb3VudCkgeworICAgICAgU3RvcC0+UHJldi5zZXRGcm9tT3BhcXVlVmFsdWUocmVpbnRlcnByZXRfY2FzdDxVc2UqKj4oc3RvcFRhZykpOworICAgICAgKytEb25lOworICAgICAgQ291bnQgPSBEb25lOworICAgIH0gZWxzZSB7CisgICAgICBTdG9wLT5QcmV2LnNldEZyb21PcGFxdWVWYWx1ZShyZWludGVycHJldF9jYXN0PFVzZSoqPihDb3VudCAmIDEpKTsKKyAgICAgIENvdW50ID4+PSAxOworICAgICAgKytEb25lOworICAgIH0KKyAgfQorCisgIHJldHVybiBTdGFydDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB6YXAgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgVXNlOjp6YXAoVXNlICpTdGFydCwgY29uc3QgVXNlICpTdG9wLCBib29sIGRlbCkgeworICBpZiAoZGVsKSB7CisgICAgd2hpbGUgKFN0YXJ0ICE9IFN0b3ApIHsKKyAgICAgICgtLVN0b3ApLT5+VXNlKCk7CisgICAgfQorICAgIDo6b3BlcmF0b3IgZGVsZXRlKFN0YXJ0KTsKKyAgICByZXR1cm47CisgIH0KKworICB3aGlsZSAoU3RhcnQgIT0gU3RvcCkgeworICAgIChTdGFydCsrKS0+c2V0KDApOworICB9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBBdWdtZW50ZWRVc2UgbGF5b3V0IHN0cnVjdAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RydWN0IEF1Z21lbnRlZFVzZSA6IHB1YmxpYyBVc2UgeworICBQb2ludGVySW50UGFpcjxVc2VyKiwgMSwgVGFnPiByZWY7CisgIEF1Z21lbnRlZFVzZSgpOyAvLyBub3QgaW1wbGVtZW50ZWQKK307CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBnZXRVc2VyIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitVc2VyICpVc2U6OmdldFVzZXIoKSBjb25zdCB7CisgIGNvbnN0IFVzZSAqRW5kID0gZ2V0SW1wbGllZFVzZXIoKTsKKyAgY29uc3QgUG9pbnRlckludFBhaXI8VXNlciosIDEsIFRhZz4mIHJlZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXVnbWVudGVkVXNlKj4oRW5kIC0gMSktPnJlZik7CisgIFVzZXIgKlNoZSA9IHJlZi5nZXRQb2ludGVyKCk7CisgIHJldHVybiByZWYuZ2V0SW50KCkKKyAgICA/IFNoZQorICAgIDogKFVzZXIqKUVuZDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgYWxsb2NIdW5nb2ZmVXNlcyBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworVXNlICpVc2VyOjphbGxvY0h1bmdvZmZVc2VzKHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgVXNlICpCZWdpbiA9IHN0YXRpY19jYXN0PFVzZSo+KDo6b3BlcmF0b3IgbmV3KHNpemVvZihVc2UpICogTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoQXVnbWVudGVkVXNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2YoVXNlKSkpOworICBVc2UgKkVuZCA9IEJlZ2luICsgTjsKKyAgUG9pbnRlckludFBhaXI8VXNlciosIDEsIFRhZz4mIHJlZihzdGF0aWNfY2FzdDxBdWdtZW50ZWRVc2UmPihFbmRbLTFdKS5yZWYpOworICByZWYuc2V0UG9pbnRlcihjb25zdF9jYXN0PFVzZXIqPih0aGlzKSk7CisgIHJlZi5zZXRJbnQodGFnT25lKTsKKyAgcmV0dXJuIFVzZTo6aW5pdFRhZ3MoQmVnaW4sIEVuZCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyIG9wZXJhdG9yIG5ldyBJbXBsZW1lbnRhdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgKlVzZXI6Om9wZXJhdG9yIG5ldyhzaXplX3QgcywgdW5zaWduZWQgVXMpIHsKKyAgdm9pZCAqU3RvcmFnZSA9IDo6b3BlcmF0b3IgbmV3KHMgKyBzaXplb2YoVXNlKSAqIFVzKTsKKyAgVXNlICpTdGFydCA9IHN0YXRpY19jYXN0PFVzZSo+KFN0b3JhZ2UpOworICBVc2UgKkVuZCA9IFN0YXJ0ICsgVXM7CisgIFVzZXIgKk9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8VXNlcio+KEVuZCk7CisgIE9iai0+T3BlcmFuZExpc3QgPSBTdGFydDsKKyAgT2JqLT5OdW1PcGVyYW5kcyA9IFVzOworICBVc2U6OmluaXRUYWdzKFN0YXJ0LCBFbmQpOworICByZXR1cm4gT2JqOworfQorCisvLy8gUHJlZml4ZWQgYWxsb2NhdGlvbiAtIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBVc2UsIGFsbG9jYXRlIGEgTlVMTCBwb2ludGVyLgorLy8vIFRoZSBkZXN0cnVjdG9yIGNhbiBkZXRlY3QgaXRzIHByZXNlbmNlIGFuZCByZWFkanVzdCB0aGUgT3BlcmFuZExpc3QKKy8vLyBmb3IgZGVsZXRpdGlvbi4KKy8vLwordm9pZCAqVXNlcjo6b3BlcmF0b3IgbmV3KHNpemVfdCBzLCB1bnNpZ25lZCBVcywgYm9vbCBQcmVmaXgpIHsKKyAgLy8gY3VycmVudGx5IHByZWZpeGVkIGFsbG9jYXRpb24gb25seSBhZG1pc3NpYmxlIGZvcgorICAvLyB1bmNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbnMKKyAgaWYgKCFQcmVmaXgpCisgICAgcmV0dXJuIG9wZXJhdG9yIG5ldyhzLCBVcyk7CisKKyAgYXNzZXJ0KFVzID09IDEgJiYgIk90aGVyIHRoYW4gb25lIFVzZSBhbGxvY2F0ZWQ/Iik7CisgIHR5cGVkZWYgUG9pbnRlckludFBhaXI8dm9pZCosIDIsIFVzZTo6UHJldlB0clRhZz4gVGFnZ2VkUHJlZml4OworICB2b2lkICpSYXcgPSA6Om9wZXJhdG9yIG5ldyhzICsgc2l6ZW9mKFRhZ2dlZFByZWZpeCkgKyBzaXplb2YoVXNlKSAqIFVzKTsKKyAgVGFnZ2VkUHJlZml4ICpQcmUgPSBzdGF0aWNfY2FzdDxUYWdnZWRQcmVmaXgqPihSYXcpOworICBQcmUtPnNldEZyb21PcGFxdWVWYWx1ZSgwKTsKKyAgdm9pZCAqU3RvcmFnZSA9IFByZSArIDE7IC8vIHNraXAgb3ZlciBwcmVmaXgKKyAgVXNlICpTdGFydCA9IHN0YXRpY19jYXN0PFVzZSo+KFN0b3JhZ2UpOworICBVc2UgKkVuZCA9IFN0YXJ0ICsgVXM7CisgIFVzZXIgKk9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8VXNlcio+KEVuZCk7CisgIE9iai0+T3BlcmFuZExpc3QgPSBTdGFydDsKKyAgT2JqLT5OdW1PcGVyYW5kcyA9IFVzOworICBVc2U6OmluaXRUYWdzKFN0YXJ0LCBFbmQpOworICByZXR1cm4gT2JqOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBvcGVyYXRvciBkZWxldGUgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgVXNlcjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKlVzcikgeworICBVc2VyICpTdGFydCA9IHN0YXRpY19jYXN0PFVzZXIqPihVc3IpOworICBVc2UgKlN0b3JhZ2UgPSBzdGF0aWNfY2FzdDxVc2UqPihVc3IpIC0gU3RhcnQtPk51bU9wZXJhbmRzOworICAvLworICAvLyBsb29rIGZvciBhIHZhcmlhZGljIFVzZXIKKyAgaWYgKFN0b3JhZ2UgPT0gU3RhcnQtPk9wZXJhbmRMaXN0KSB7CisgICAgOjpvcGVyYXRvciBkZWxldGUoU3RvcmFnZSk7CisgICAgcmV0dXJuOworICB9CisgIC8vCisgIC8vIGNoZWNrIGZvciB0aGUgZmxhZyB3aGV0aGVyIHRoZSBkZXN0cnVjdG9yIGhhcyBkZXRlY3RlZCBhIHByZWZpeGVkCisgIC8vIGFsbG9jYXRpb24sIGluIHdoaWNoIGNhc2Ugd2UgcmVtb3ZlIHRoZSBmbGFnIGFuZCBkZWxldGUgc3RhcnRpbmcKKyAgLy8gYXQgT3BlcmFuZExpc3QKKyAgaWYgKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KFN0YXJ0LT5PcGVyYW5kTGlzdCkgJiAxKSB7CisgICAgOjpvcGVyYXRvciBkZWxldGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oU3RhcnQtPk9wZXJhbmRMaXN0KSAtIDEpOworICAgIHJldHVybjsKKyAgfQorICAvLworICAvLyBpbiBhbGwgb3RoZXIgY2FzZXMganVzdCBkZWxldGUgdGhlIG51bGxhcnkgVXNlciAoY292ZXJzIGh1bmctb2ZmCisgIC8vIHVzZXMgYWxzbworICA6Om9wZXJhdG9yIGRlbGV0ZShVc3IpOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9WYWx1ZS5jcHAgYi9zcmMvTExWTS9saWIvVk1Db3JlL1ZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWZkNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9WYWx1ZS5jcHAKQEAgLTAsMCArMSw2MjUgQEAKKy8vPT09LS0gVmFsdWUuY3BwIC0gSW1wbGVtZW50IHRoZSBWYWx1ZSBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFZhbHVlLCBWYWx1ZUhhbmRsZSwgYW5kIFVzZXIgY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiTExWTUNvbnRleHRJbXBsLmgiCisjaW5jbHVkZSAibGx2bS9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVmFsdWVTeW1ib2xUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTGVha0RldGVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitzdGF0aWMgaW5saW5lIGNvbnN0IFR5cGUgKmNoZWNrVHlwZShjb25zdCBUeXBlICpUeSkgeworICBhc3NlcnQoVHkgJiYgIlZhbHVlIGRlZmluZWQgd2l0aCBhIG51bGwgdHlwZTogRXJyb3IhIik7CisgIHJldHVybiBUeTsKK30KKworVmFsdWU6OlZhbHVlKGNvbnN0IFR5cGUgKnR5LCB1bnNpZ25lZCBzY2lkKQorICA6IFN1YmNsYXNzSUQoc2NpZCksIEhhc1ZhbHVlSGFuZGxlKDApLAorICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhKDApLCBTdWJjbGFzc0RhdGEoMCksIFZUeShjaGVja1R5cGUodHkpKSwKKyAgICBVc2VMaXN0KDApLCBOYW1lKDApIHsKKyAgaWYgKGlzYTxDYWxsSW5zdD4odGhpcykgfHwgSVNBX0lOVk9LRV9JTlNUKHRoaXMpKQorICAgIGFzc2VydCgoVlR5LT5pc0ZpcnN0Q2xhc3NUeXBlKCkgfHwgVlR5LT5pc1ZvaWRUeSgpIHx8CisgICAgICAgICAgICB0eS0+aXNPcGFxdWVUeSgpIHx8IFZUeS0+aXNTdHJ1Y3RUeSgpKSAmJgorICAgICAgICAgICAiaW52YWxpZCBDYWxsSW5zdCAgdHlwZSEiKTsKKyAgZWxzZSBpZiAoIWlzYTxDb25zdGFudD4odGhpcykgJiYgIWlzYTxCYXNpY0Jsb2NrPih0aGlzKSkKKyAgICBhc3NlcnQoKFZUeS0+aXNGaXJzdENsYXNzVHlwZSgpIHx8IFZUeS0+aXNWb2lkVHkoKSB8fAorICAgICAgICAgICAgdHktPmlzT3BhcXVlVHkoKSkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgbm9uLWZpcnN0LWNsYXNzIHZhbHVlcyBleGNlcHQgZm9yIGNvbnN0YW50cyEiKTsKK30KKworVmFsdWU6On5WYWx1ZSgpIHsKKyAgLy8gTm90aWZ5IGFsbCBWYWx1ZUhhbmRsZXMgKGlmIHByZXNlbnQpIHRoYXQgdGhpcyB2YWx1ZSBpcyBnb2luZyBhd2F5LgorICBpZiAoSGFzVmFsdWVIYW5kbGUpCisgICAgVmFsdWVIYW5kbGVCYXNlOjpWYWx1ZUlzRGVsZXRlZCh0aGlzKTsKKworI2lmbmRlZiBOREVCVUcgICAgICAvLyBPbmx5IGluIC1nIG1vZGUuLi4KKyAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIHVzZXMgb2YgdGhpcyB2YWx1ZSB0aGF0IGFyZSBzdGlsbAorICAvLyBhcm91bmQgd2hlbiB0aGUgdmFsdWUgaXMgZGVzdHJveWVkLiAgSWYgdGhlcmUgYXJlLCB0aGVuIHdlIGhhdmUgYSBkYW5nbGluZworICAvLyByZWZlcmVuY2UgYW5kIHNvbWV0aGluZyBpcyB3cm9uZy4gIFRoaXMgY29kZSBpcyBoZXJlIHRvIHByaW50IG91dCB3aGF0IGlzCisgIC8vIHN0aWxsIGJlaW5nIHJlZmVyZW5jZWQuICBUaGUgdmFsdWUgaW4gcXVlc3Rpb24gc2hvdWxkIGJlIHByaW50ZWQgYXMKKyAgLy8gYSA8YmFkcmVmPgorICAvLworICBpZiAoIXVzZV9lbXB0eSgpKSB7CisgICAgZGJncygpIDw8ICJXaGlsZSBkZWxldGluZzogIiA8PCAqVlR5IDw8ICIgJSIgPDwgZ2V0TmFtZVN0cigpIDw8ICJcbiI7CisgICAgZm9yICh1c2VfaXRlcmF0b3IgSSA9IHVzZV9iZWdpbigpLCBFID0gdXNlX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGRiZ3MoKSA8PCAiVXNlIHN0aWxsIHN0dWNrIGFyb3VuZCBhZnRlciBEZWYgaXMgZGVzdHJveWVkOiIKKyAgICAgICAgICAgPDwgKipJIDw8ICJcbiI7CisgIH0KKyNlbmRpZgorICBhc3NlcnQodXNlX2VtcHR5KCkgJiYgIlVzZXMgcmVtYWluIHdoZW4gYSB2YWx1ZSBpcyBkZXN0cm95ZWQhIik7CisKKyAgLy8gSWYgdGhpcyB2YWx1ZSBpcyBuYW1lZCwgZGVzdHJveSB0aGUgbmFtZS4gIFRoaXMgc2hvdWxkIG5vdCBiZSBpbiBhIHN5bXRhYgorICAvLyBhdCB0aGlzIHBvaW50LgorICBpZiAoTmFtZSkKKyAgICBOYW1lLT5EZXN0cm95KCk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIHVzZXMgb2YgdGhpcyBvYmplY3QgYW55bW9yZSwgcmVtb3ZlIGl0LgorICBMZWFrRGV0ZWN0b3I6OnJlbW92ZUdhcmJhZ2VPYmplY3QodGhpcyk7Cit9CisKKy8vLyBoYXNOVXNlcyAtIFJldHVybiB0cnVlIGlmIHRoaXMgVmFsdWUgaGFzIGV4YWN0bHkgTiB1c2Vycy4KKy8vLworYm9vbCBWYWx1ZTo6aGFzTlVzZXModW5zaWduZWQgTikgY29uc3QgeworICBjb25zdF91c2VfaXRlcmF0b3IgVUkgPSB1c2VfYmVnaW4oKSwgRSA9IHVzZV9lbmQoKTsKKworICBmb3IgKDsgTjsgLS1OLCArK1VJKQorICAgIGlmIChVSSA9PSBFKSByZXR1cm4gZmFsc2U7ICAvLyBUb28gZmV3LgorICByZXR1cm4gVUkgPT0gRTsKK30KKworLy8vIGhhc05Vc2VzT3JNb3JlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyB2YWx1ZSBoYXMgTiB1c2VycyBvciBtb3JlLiAgVGhpcyBpcworLy8vIGxvZ2ljYWxseSBlcXVpdmFsZW50IHRvIGdldE51bVVzZXMoKSA+PSBOLgorLy8vCitib29sIFZhbHVlOjpoYXNOVXNlc09yTW9yZSh1bnNpZ25lZCBOKSBjb25zdCB7CisgIGNvbnN0X3VzZV9pdGVyYXRvciBVSSA9IHVzZV9iZWdpbigpLCBFID0gdXNlX2VuZCgpOworCisgIGZvciAoOyBOOyAtLU4sICsrVUkpCisgICAgaWYgKFVJID09IEUpIHJldHVybiBmYWxzZTsgIC8vIFRvbyBmZXcuCisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBpc1VzZWRJbkJhc2ljQmxvY2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIHVzZWQgaW4gdGhlIHNwZWNpZmllZAorLy8vIGJhc2ljIGJsb2NrLgorYm9vbCBWYWx1ZTo6aXNVc2VkSW5CYXNpY0Jsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgIGZvciAoY29uc3RfdXNlX2l0ZXJhdG9yIEkgPSB1c2VfYmVnaW4oKSwgRSA9IHVzZV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBJbnN0cnVjdGlvbiAqVXNlciA9IGR5bl9jYXN0PEluc3RydWN0aW9uPigqSSk7CisgICAgaWYgKFVzZXIgJiYgVXNlci0+Z2V0UGFyZW50KCkgPT0gQkIpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIGdldE51bVVzZXMgLSBUaGlzIG1ldGhvZCBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgdGhpcyBWYWx1ZS4gIFRoaXMKKy8vLyBpcyBhIGxpbmVhciB0aW1lIG9wZXJhdGlvbi4gIFVzZSBoYXNPbmVVc2Ugb3IgaGFzTlVzZXMgdG8gY2hlY2sgZm9yIHNwZWNpZmljCisvLy8gdmFsdWVzLgordW5zaWduZWQgVmFsdWU6OmdldE51bVVzZXMoKSBjb25zdCB7CisgIHJldHVybiAodW5zaWduZWQpc3RkOjpkaXN0YW5jZSh1c2VfYmVnaW4oKSwgdXNlX2VuZCgpKTsKK30KKworc3RhdGljIGJvb2wgZ2V0U3ltVGFiKFZhbHVlICpWLCBWYWx1ZVN5bWJvbFRhYmxlIComU1QpIHsKKyAgU1QgPSAwOworICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpIHsKKyAgICBpZiAoQmFzaWNCbG9jayAqUCA9IEktPmdldFBhcmVudCgpKQorICAgICAgaWYgKEZ1bmN0aW9uICpQUCA9IFAtPmdldFBhcmVudCgpKQorICAgICAgICBTVCA9ICZQUC0+Z2V0VmFsdWVTeW1ib2xUYWJsZSgpOworICB9IGVsc2UgaWYgKEJhc2ljQmxvY2sgKkJCID0gZHluX2Nhc3Q8QmFzaWNCbG9jaz4oVikpIHsKKyAgICBpZiAoRnVuY3Rpb24gKlAgPSBCQi0+Z2V0UGFyZW50KCkpCisgICAgICBTVCA9ICZQLT5nZXRWYWx1ZVN5bWJvbFRhYmxlKCk7CisgIH0gZWxzZSBpZiAoR2xvYmFsVmFsdWUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KFYpKSB7CisgICAgaWYgKE1vZHVsZSAqUCA9IEdWLT5nZXRQYXJlbnQoKSkKKyAgICAgIFNUID0gJlAtPmdldFZhbHVlU3ltYm9sVGFibGUoKTsKKyAgfSBlbHNlIGlmIChBcmd1bWVudCAqQSA9IGR5bl9jYXN0PEFyZ3VtZW50PihWKSkgeworICAgIGlmIChGdW5jdGlvbiAqUCA9IEEtPmdldFBhcmVudCgpKQorICAgICAgU1QgPSAmUC0+Z2V0VmFsdWVTeW1ib2xUYWJsZSgpOworICB9IGVsc2UgaWYgKGlzYTxNRFN0cmluZz4oVikpCisgICAgcmV0dXJuIHRydWU7CisgIGVsc2UgeworICAgIGFzc2VydChpc2E8Q29uc3RhbnQ+KFYpICYmICJVbmtub3duIHZhbHVlIHR5cGUhIik7CisgICAgcmV0dXJuIHRydWU7ICAvLyBubyBuYW1lIGlzIHNldGFibGUgZm9yIHRoaXMuCisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmdSZWYgVmFsdWU6OmdldE5hbWUoKSBjb25zdCB7CisgIC8vIE1ha2Ugc3VyZSB0aGUgZW1wdHkgc3RyaW5nIGlzIHN0aWxsIGEgQyBzdHJpbmcuIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsCisgIC8vIHNvbWUgY2xpZW50cyB3YW50IHRvIGNhbGwgLmRhdGEoKSBvbiB0aGUgcmVzdWx0IGFuZCBleHBlY3QgaXQgdG8gYmUgbnVsbAorICAvLyB0ZXJtaW5hdGVkLgorICBpZiAoIU5hbWUpIHJldHVybiBTdHJpbmdSZWYoIiIsIDApOworICByZXR1cm4gTmFtZS0+Z2V0S2V5KCk7Cit9CisKK3N0ZDo6c3RyaW5nIFZhbHVlOjpnZXROYW1lU3RyKCkgY29uc3QgeworICByZXR1cm4gZ2V0TmFtZSgpLnN0cigpOworfQorCit2b2lkIFZhbHVlOjpzZXROYW1lKGNvbnN0IFR3aW5lICZOZXdOYW1lKSB7CisgIC8vIEZhc3QgcGF0aCBmb3IgY29tbW9uIElSQnVpbGRlciBjYXNlIG9mIHNldE5hbWUoIiIpIHdoZW4gdGhlcmUgaXMgbm8gbmFtZS4KKyAgaWYgKE5ld05hbWUuaXNUcml2aWFsbHlFbXB0eSgpICYmICFoYXNOYW1lKCkpCisgICAgcmV0dXJuOworCisgIFNtYWxsU3RyaW5nPDI1Nj4gTmFtZURhdGE7CisgIFN0cmluZ1JlZiBOYW1lUmVmID0gTmV3TmFtZS50b1N0cmluZ1JlZihOYW1lRGF0YSk7CisKKyAgLy8gTmFtZSBpc24ndCBjaGFuZ2luZz8KKyAgaWYgKGdldE5hbWUoKSA9PSBOYW1lUmVmKQorICAgIHJldHVybjsKKworICBhc3NlcnQoIWdldFR5cGUoKS0+aXNWb2lkVHkoKSAmJiAiQ2Fubm90IGFzc2lnbiBhIG5hbWUgdG8gdm9pZCB2YWx1ZXMhIik7CisKKyAgLy8gR2V0IHRoZSBzeW1ib2wgdGFibGUgdG8gdXBkYXRlIGZvciB0aGlzIG9iamVjdC4KKyAgVmFsdWVTeW1ib2xUYWJsZSAqU1Q7CisgIGlmIChnZXRTeW1UYWIodGhpcywgU1QpKQorICAgIHJldHVybjsgIC8vIENhbm5vdCBzZXQgYSBuYW1lIG9uIHRoaXMgdmFsdWUgKGUuZy4gY29uc3RhbnQpLgorCisgIGlmICghU1QpIHsgLy8gTm8gc3ltYm9sIHRhYmxlIHRvIHVwZGF0ZT8gIEp1c3QgZG8gdGhlIGNoYW5nZS4KKyAgICBpZiAoTmFtZVJlZi5lbXB0eSgpKSB7CisgICAgICAvLyBGcmVlIHRoZSBuYW1lIGZvciB0aGlzIHZhbHVlLgorICAgICAgTmFtZS0+RGVzdHJveSgpOworICAgICAgTmFtZSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKE5hbWUpCisgICAgICBOYW1lLT5EZXN0cm95KCk7CisKKyAgICAvLyBOT1RFOiBDb3VsZCBvcHRpbWl6ZSBmb3IgdGhlIGNhc2UgdGhlIG5hbWUgaXMgc2hyaW5raW5nIHRvIG5vdCBkZWFsbG9jYXRlCisgICAgLy8gdGhlbiByZWFsbG9jYXRlZC4KKworICAgIC8vIENyZWF0ZSB0aGUgbmV3IG5hbWUuCisgICAgTmFtZSA9IFZhbHVlTmFtZTo6Q3JlYXRlKE5hbWVSZWYuYmVnaW4oKSwgTmFtZVJlZi5lbmQoKSk7CisgICAgTmFtZS0+c2V0VmFsdWUodGhpcyk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gTk9URTogQ291bGQgb3B0aW1pemUgZm9yIHRoZSBjYXNlIHRoZSBuYW1lIGlzIHNocmlua2luZyB0byBub3QgZGVhbGxvY2F0ZQorICAvLyB0aGVuIHJlYWxsb2NhdGVkLgorICBpZiAoaGFzTmFtZSgpKSB7CisgICAgLy8gUmVtb3ZlIG9sZCBuYW1lLgorICAgIFNULT5yZW1vdmVWYWx1ZU5hbWUoTmFtZSk7CisgICAgTmFtZS0+RGVzdHJveSgpOworICAgIE5hbWUgPSAwOworCisgICAgaWYgKE5hbWVSZWYuZW1wdHkoKSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8vIE5hbWUgaXMgY2hhbmdpbmcgdG8gc29tZXRoaW5nIG5ldy4KKyAgTmFtZSA9IFNULT5jcmVhdGVWYWx1ZU5hbWUoTmFtZVJlZiwgdGhpcyk7Cit9CisKKworLy8vIHRha2VOYW1lIC0gdHJhbnNmZXIgdGhlIG5hbWUgZnJvbSBWIHRvIHRoaXMgdmFsdWUsIHNldHRpbmcgVidzIG5hbWUgdG8KKy8vLyBlbXB0eS4gIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgVi0+dGFrZU5hbWUoVikuCit2b2lkIFZhbHVlOjp0YWtlTmFtZShWYWx1ZSAqVikgeworICBWYWx1ZVN5bWJvbFRhYmxlICpTVCA9IDA7CisgIC8vIElmIHRoaXMgdmFsdWUgaGFzIGEgbmFtZSwgZHJvcCBpdC4KKyAgaWYgKGhhc05hbWUoKSkgeworICAgIC8vIEdldCB0aGUgc3ltdGFiIHRoaXMgaXMgaW4uCisgICAgaWYgKGdldFN5bVRhYih0aGlzLCBTVCkpIHsKKyAgICAgIC8vIFdlIGNhbid0IHNldCBhIG5hbWUgb24gdGhpcyB2YWx1ZSwgYnV0IHdlIG5lZWQgdG8gY2xlYXIgVidzIG5hbWUgaWYKKyAgICAgIC8vIGl0IGhhcyBvbmUuCisgICAgICBpZiAoVi0+aGFzTmFtZSgpKSBWLT5zZXROYW1lKCIiKTsKKyAgICAgIHJldHVybjsgIC8vIENhbm5vdCBzZXQgYSBuYW1lIG9uIHRoaXMgdmFsdWUgKGUuZy4gY29uc3RhbnQpLgorICAgIH0KKworICAgIC8vIFJlbW92ZSBvbGQgbmFtZS4KKyAgICBpZiAoU1QpCisgICAgICBTVC0+cmVtb3ZlVmFsdWVOYW1lKE5hbWUpOworICAgIE5hbWUtPkRlc3Ryb3koKTsKKyAgICBOYW1lID0gMDsKKyAgfQorCisgIC8vIE5vdyB3ZSBrbm93IHRoYXQgdGhpcyBoYXMgbm8gbmFtZS4KKworICAvLyBJZiBWIGhhcyBubyBuYW1lIGVpdGhlciwgd2UncmUgZG9uZS4KKyAgaWYgKCFWLT5oYXNOYW1lKCkpIHJldHVybjsKKworICAvLyBHZXQgdGhpcydzIHN5bXRhYiBpZiB3ZSBkaWRuJ3QgYmVmb3JlLgorICBpZiAoIVNUKSB7CisgICAgaWYgKGdldFN5bVRhYih0aGlzLCBTVCkpIHsKKyAgICAgIC8vIENsZWFyIFYncyBuYW1lLgorICAgICAgVi0+c2V0TmFtZSgiIik7CisgICAgICByZXR1cm47ICAvLyBDYW5ub3Qgc2V0IGEgbmFtZSBvbiB0aGlzIHZhbHVlIChlLmcuIGNvbnN0YW50KS4KKyAgICB9CisgIH0KKworICAvLyBHZXQgVidzIFNULCB0aGlzIHNob3VsZCBhbHdheXMgc3VjY2VkLCBiZWNhdXNlIFYgaGFzIGEgbmFtZS4KKyAgVmFsdWVTeW1ib2xUYWJsZSAqVlNUOworICBib29sIEZhaWx1cmUgPSBnZXRTeW1UYWIoViwgVlNUKTsKKyAgYXNzZXJ0KCFGYWlsdXJlICYmICJWIGhhcyBhIG5hbWUsIHNvIGl0IHNob3VsZCBoYXZlIGEgU1QhIik7IEZhaWx1cmU9RmFpbHVyZTsKKworICAvLyBJZiB0aGVzZSB2YWx1ZXMgYXJlIGJvdGggaW4gdGhlIHNhbWUgc3ltdGFiLCB3ZSBjYW4gZG8gdGhpcyB2ZXJ5IGZhc3QuCisgIC8vIFRoaXMgd29ya3MgZXZlbiBpZiBib3RoIHZhbHVlcyBoYXZlIG5vIHN5bXRhYiB5ZXQuCisgIGlmIChTVCA9PSBWU1QpIHsKKyAgICAvLyBUYWtlIHRoZSBuYW1lIQorICAgIE5hbWUgPSBWLT5OYW1lOworICAgIFYtPk5hbWUgPSAwOworICAgIE5hbWUtPnNldFZhbHVlKHRoaXMpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgdGhpbmdzIGFyZSBzbGlnaHRseSBtb3JlIGNvbXBsZXguICBSZW1vdmUgVidzIG5hbWUgZnJvbSBWU1QgYW5kCisgIC8vIHRoZW4gcmVpbnNlcnQgaXQgaW50byBTVC4KKworICBpZiAoVlNUKQorICAgIFZTVC0+cmVtb3ZlVmFsdWVOYW1lKFYtPk5hbWUpOworICBOYW1lID0gVi0+TmFtZTsKKyAgVi0+TmFtZSA9IDA7CisgIE5hbWUtPnNldFZhbHVlKHRoaXMpOworCisgIGlmIChTVCkKKyAgICBTVC0+cmVpbnNlcnRWYWx1ZSh0aGlzKTsKK30KKworCisvLyB1bmNoZWNrZWRSZXBsYWNlQWxsVXNlc1dpdGggLSBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgcmVwbGFjZUFsbFVzZXNXaXRoLAorLy8gZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBoYXZlIGFsbCBvZiB0aGUgYXNzZXJ0cy4gIFRoZSBhc3NlcnRzIGZhaWwgYmVjYXVzZSB3ZQorLy8gYXJlIGhhbGYtd2F5IGRvbmUgcmVzb2x2aW5nIHR5cGVzLCB3aGljaCBjYXVzZXMgc29tZSB0eXBlcyB0byBleGlzdCBhcyB0d28KKy8vIGRpZmZlcmVudCBUeXBlKidzIGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIGlzIGEgc2xlZGdlaGFtbWVyIHRvIHdvcmsgYXJvdW5kCisvLyB0aGlzIHByb2JsZW0uCisvLwordm9pZCBWYWx1ZTo6dW5jaGVja2VkUmVwbGFjZUFsbFVzZXNXaXRoKFZhbHVlICpOZXcpIHsKKyAgLy8gTm90aWZ5IGFsbCBWYWx1ZUhhbmRsZXMgKGlmIHByZXNlbnQpIHRoYXQgdGhpcyB2YWx1ZSBpcyBnb2luZyBhd2F5LgorICBpZiAoSGFzVmFsdWVIYW5kbGUpCisgICAgVmFsdWVIYW5kbGVCYXNlOjpWYWx1ZUlzUkFVV2QodGhpcywgTmV3KTsKKworICB3aGlsZSAoIXVzZV9lbXB0eSgpKSB7CisgICAgVXNlICZVID0gKlVzZUxpc3Q7CisgICAgLy8gTXVzdCBoYW5kbGUgQ29uc3RhbnRzIHNwZWNpYWxseSwgd2UgY2Fubm90IGNhbGwgcmVwbGFjZVVzZXNPZldpdGggb24gYQorICAgIC8vIGNvbnN0YW50IGJlY2F1c2UgdGhleSBhcmUgdW5pcXVlZC4KKyAgICBpZiAoQ29uc3RhbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVS5nZXRVc2VyKCkpKSB7CisgICAgICBpZiAoIWlzYTxHbG9iYWxWYWx1ZT4oQykpIHsKKyAgICAgICAgQy0+cmVwbGFjZVVzZXNPZldpdGhPbkNvbnN0YW50KHRoaXMsIE5ldywgJlUpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBVLnNldChOZXcpOworICB9Cit9CisKK3ZvaWQgVmFsdWU6OnJlcGxhY2VBbGxVc2VzV2l0aChWYWx1ZSAqTmV3KSB7CisgIGFzc2VydChOZXcgJiYgIlZhbHVlOjpyZXBsYWNlQWxsVXNlc1dpdGgoPG51bGw+KSBpcyBpbnZhbGlkISIpOworICBhc3NlcnQoTmV3ICE9IHRoaXMgJiYgInRoaXMtPnJlcGxhY2VBbGxVc2VzV2l0aCh0aGlzKSBpcyBOT1QgdmFsaWQhIik7CisgIGFzc2VydChOZXctPmdldFR5cGUoKSA9PSBnZXRUeXBlKCkgJiYKKyAgICAgICAgICJyZXBsYWNlQWxsVXNlcyBvZiB2YWx1ZSB3aXRoIG5ldyB2YWx1ZSBvZiBkaWZmZXJlbnQgdHlwZSEiKTsKKworICB1bmNoZWNrZWRSZXBsYWNlQWxsVXNlc1dpdGgoTmV3KTsKK30KKworVmFsdWUgKlZhbHVlOjpzdHJpcFBvaW50ZXJDYXN0cygpIHsKKyAgaWYgKCFnZXRUeXBlKCktPmlzUG9pbnRlclR5KCkpCisgICAgcmV0dXJuIHRoaXM7CisKKyAgLy8gRXZlbiB0aG91Z2ggd2UgZG9uJ3QgbG9vayB0aHJvdWdoIFBISSBub2Rlcywgd2UgY291bGQgYmUgY2FsbGVkIG9uIGFuCisgIC8vIGluc3RydWN0aW9uIGluIGFuIHVucmVhY2hhYmxlIGJsb2NrLCB3aGljaCBtYXkgYmUgb24gYSBjeWNsZS4KKyAgU21hbGxQdHJTZXQ8VmFsdWUgKiwgND4gVmlzaXRlZDsKKworICBWYWx1ZSAqViA9IHRoaXM7CisgIFZpc2l0ZWQuaW5zZXJ0KFYpOworICBkbyB7CisgICAgaWYgKEdFUE9wZXJhdG9yICpHRVAgPSBkeW5fY2FzdDxHRVBPcGVyYXRvcj4oVikpIHsKKyAgICAgIGlmICghR0VQLT5oYXNBbGxaZXJvSW5kaWNlcygpKQorICAgICAgICByZXR1cm4gVjsKKyAgICAgIFYgPSBHRVAtPmdldFBvaW50ZXJPcGVyYW5kKCk7CisgICAgfSBlbHNlIGlmIChPcGVyYXRvcjo6Z2V0T3Bjb2RlKFYpID09IEluc3RydWN0aW9uOjpCaXRDYXN0KSB7CisgICAgICBWID0gY2FzdDxPcGVyYXRvcj4oViktPmdldE9wZXJhbmQoMCk7CisgICAgfSBlbHNlIGlmIChHbG9iYWxBbGlhcyAqR0EgPSBkeW5fY2FzdDxHbG9iYWxBbGlhcz4oVikpIHsKKyAgICAgIGlmIChHQS0+bWF5QmVPdmVycmlkZGVuKCkpCisgICAgICAgIHJldHVybiBWOworICAgICAgViA9IEdBLT5nZXRBbGlhc2VlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBWOworICAgIH0KKyAgICBhc3NlcnQoVi0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpICYmICJVbmV4cGVjdGVkIG9wZXJhbmQgdHlwZSEiKTsKKyAgfSB3aGlsZSAoVmlzaXRlZC5pbnNlcnQoVikpOworCisgIHJldHVybiBWOworfQorCitWYWx1ZSAqVmFsdWU6OmdldFVuZGVybHlpbmdPYmplY3QodW5zaWduZWQgTWF4TG9va3VwKSB7CisgIGlmICghZ2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgIHJldHVybiB0aGlzOworICBWYWx1ZSAqViA9IHRoaXM7CisgIGZvciAodW5zaWduZWQgQ291bnQgPSAwOyBNYXhMb29rdXAgPT0gMCB8fCBDb3VudCA8IE1heExvb2t1cDsgKytDb3VudCkgeworICAgIGlmIChHRVBPcGVyYXRvciAqR0VQID0gZHluX2Nhc3Q8R0VQT3BlcmF0b3I+KFYpKSB7CisgICAgICBWID0gR0VQLT5nZXRQb2ludGVyT3BlcmFuZCgpOworICAgIH0gZWxzZSBpZiAoT3BlcmF0b3I6OmdldE9wY29kZShWKSA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCkgeworICAgICAgViA9IGNhc3Q8T3BlcmF0b3I+KFYpLT5nZXRPcGVyYW5kKDApOworICAgIH0gZWxzZSBpZiAoR2xvYmFsQWxpYXMgKkdBID0gZHluX2Nhc3Q8R2xvYmFsQWxpYXM+KFYpKSB7CisgICAgICBpZiAoR0EtPm1heUJlT3ZlcnJpZGRlbigpKQorICAgICAgICByZXR1cm4gVjsKKyAgICAgIFYgPSBHQS0+Z2V0QWxpYXNlZSgpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gVjsKKyAgICB9CisgICAgYXNzZXJ0KFYtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSAmJiAiVW5leHBlY3RlZCBvcGVyYW5kIHR5cGUhIik7CisgIH0KKyAgcmV0dXJuIFY7Cit9CisKKy8vLyBEb1BISVRyYW5zbGF0aW9uIC0gSWYgdGhpcyB2YWx1ZSBpcyBhIFBISSBub2RlIHdpdGggQ3VyQkIgYXMgaXRzIHBhcmVudCwKKy8vLyByZXR1cm4gdGhlIHZhbHVlIGluIHRoZSBQSEkgbm9kZSBjb3JyZXNwb25kaW5nIHRvIFByZWRCQi4gIElmIG5vdCwgcmV0dXJuCisvLy8gb3Vyc2VsZi4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGtub3cgdGhlIHZhbHVlIHNvbWV0aGluZyBoYXMgaW4gYQorLy8vIHByZWRlY2Vzc29yIGJsb2NrLgorVmFsdWUgKlZhbHVlOjpEb1BISVRyYW5zbGF0aW9uKGNvbnN0IEJhc2ljQmxvY2sgKkN1ckJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2ljQmxvY2sgKlByZWRCQikgeworICBQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KHRoaXMpOworICBpZiAoUE4gJiYgUE4tPmdldFBhcmVudCgpID09IEN1ckJCKQorICAgIHJldHVybiBQTi0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKFByZWRCQik7CisgIHJldHVybiB0aGlzOworfQorCitMTFZNQ29udGV4dCAmVmFsdWU6OmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBWVHktPmdldENvbnRleHQoKTsgfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlSGFuZGxlQmFzZSBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEFkZFRvRXhpc3RpbmdVc2VMaXN0IC0gQWRkIHRoaXMgVmFsdWVIYW5kbGUgdG8gdGhlIHVzZSBsaXN0IGZvciBWUCwgd2hlcmUKKy8vLyBMaXN0IGlzIGtub3duIHRvIHBvaW50IGludG8gdGhlIGV4aXN0aW5nIHVzZSBsaXN0Lgordm9pZCBWYWx1ZUhhbmRsZUJhc2U6OkFkZFRvRXhpc3RpbmdVc2VMaXN0KFZhbHVlSGFuZGxlQmFzZSAqKkxpc3QpIHsKKyAgYXNzZXJ0KExpc3QgJiYgIkhhbmRsZSBsaXN0IGlzIG51bGw/Iik7CisKKyAgLy8gU3BsaWNlIG91cnNlbHZlcyBpbnRvIHRoZSBsaXN0LgorICBOZXh0ID0gKkxpc3Q7CisgICpMaXN0ID0gdGhpczsKKyAgc2V0UHJldlB0cihMaXN0KTsKKyAgaWYgKE5leHQpIHsKKyAgICBOZXh0LT5zZXRQcmV2UHRyKCZOZXh0KTsKKyAgICBhc3NlcnQoVlAgPT0gTmV4dC0+VlAgJiYgIkFkZGVkIHRvIHdyb25nIGxpc3Q/Iik7CisgIH0KK30KKwordm9pZCBWYWx1ZUhhbmRsZUJhc2U6OkFkZFRvRXhpc3RpbmdVc2VMaXN0QWZ0ZXIoVmFsdWVIYW5kbGVCYXNlICpMaXN0KSB7CisgIGFzc2VydChMaXN0ICYmICJNdXN0IGluc2VydCBhZnRlciBleGlzdGluZyBub2RlIik7CisKKyAgTmV4dCA9IExpc3QtPk5leHQ7CisgIHNldFByZXZQdHIoJkxpc3QtPk5leHQpOworICBMaXN0LT5OZXh0ID0gdGhpczsKKyAgaWYgKE5leHQpCisgICAgTmV4dC0+c2V0UHJldlB0cigmTmV4dCk7Cit9CisKKy8vLyBBZGRUb1VzZUxpc3QgLSBBZGQgdGhpcyBWYWx1ZUhhbmRsZSB0byB0aGUgdXNlIGxpc3QgZm9yIFZQLgordm9pZCBWYWx1ZUhhbmRsZUJhc2U6OkFkZFRvVXNlTGlzdCgpIHsKKyAgYXNzZXJ0KFZQICYmICJOdWxsIHBvaW50ZXIgZG9lc24ndCBoYXZlIGEgdXNlIGxpc3QhIik7CisKKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IFZQLT5nZXRDb250ZXh0KCkucEltcGw7CisKKyAgaWYgKFZQLT5IYXNWYWx1ZUhhbmRsZSkgeworICAgIC8vIElmIHRoaXMgdmFsdWUgYWxyZWFkeSBoYXMgYSBWYWx1ZUhhbmRsZSwgdGhlbiBpdCBtdXN0IGJlIGluIHRoZQorICAgIC8vIFZhbHVlSGFuZGxlcyBtYXAgYWxyZWFkeS4KKyAgICBWYWx1ZUhhbmRsZUJhc2UgKiZFbnRyeSA9IHBJbXBsLT5WYWx1ZUhhbmRsZXNbVlBdOworICAgIGFzc2VydChFbnRyeSAhPSAwICYmICJWYWx1ZSBkb2Vzbid0IGhhdmUgYW55IGhhbmRsZXM/Iik7CisgICAgQWRkVG9FeGlzdGluZ1VzZUxpc3QoJkVudHJ5KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBPaywgaXQgZG9lc24ndCBoYXZlIGFueSBoYW5kbGVzIHlldCwgc28gd2UgbXVzdCBpbnNlcnQgaXQgaW50byB0aGUKKyAgLy8gRGVuc2VNYXAuICBIb3dldmVyLCBkb2luZyB0aGlzIGluc2VydGlvbiBjb3VsZCBjYXVzZSB0aGUgRGVuc2VNYXAgdG8KKyAgLy8gcmVhbGxvY2F0ZSBpdHNlbGYsIHdoaWNoIHdvdWxkIGludmFsaWRhdGUgYWxsIG9mIHRoZSBQcmV2UCBwb2ludGVycyB0aGF0CisgIC8vIHBvaW50IGludG8gdGhlIG9sZCB0YWJsZS4gIEhhbmRsZSB0aGlzIGJ5IGNoZWNraW5nIGZvciByZWFsbG9jYXRpb24gYW5kCisgIC8vIHVwZGF0aW5nIHRoZSBzdGFsZSBwb2ludGVycyBvbmx5IGlmIG5lZWRlZC4KKyAgRGVuc2VNYXA8VmFsdWUqLCBWYWx1ZUhhbmRsZUJhc2UqPiAmSGFuZGxlcyA9IHBJbXBsLT5WYWx1ZUhhbmRsZXM7CisgIGNvbnN0IHZvaWQgKk9sZEJ1Y2tldFB0ciA9IEhhbmRsZXMuZ2V0UG9pbnRlckludG9CdWNrZXRzQXJyYXkoKTsKKworICBWYWx1ZUhhbmRsZUJhc2UgKiZFbnRyeSA9IEhhbmRsZXNbVlBdOworICBhc3NlcnQoRW50cnkgPT0gMCAmJiAiVmFsdWUgcmVhbGx5IGRpZCBhbHJlYWR5IGhhdmUgaGFuZGxlcz8iKTsKKyAgQWRkVG9FeGlzdGluZ1VzZUxpc3QoJkVudHJ5KTsKKyAgVlAtPkhhc1ZhbHVlSGFuZGxlID0gdHJ1ZTsKKworICAvLyBJZiByZWFsbG9jYXRpb24gZGlkbid0IGhhcHBlbiBvciBpZiB0aGlzIHdhcyB0aGUgZmlyc3QgaW5zZXJ0aW9uLCBkb24ndAorICAvLyB3YWxrIHRoZSB0YWJsZS4KKyAgaWYgKEhhbmRsZXMuaXNQb2ludGVySW50b0J1Y2tldHNBcnJheShPbGRCdWNrZXRQdHIpIHx8CisgICAgICBIYW5kbGVzLnNpemUoKSA9PSAxKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gT2theSwgcmVhbGxvY2F0aW9uIGRpZCBoYXBwZW4uICBGaXggdGhlIFByZXYgUG9pbnRlcnMuCisgIGZvciAoRGVuc2VNYXA8VmFsdWUqLCBWYWx1ZUhhbmRsZUJhc2UqPjo6aXRlcmF0b3IgSSA9IEhhbmRsZXMuYmVnaW4oKSwKKyAgICAgICBFID0gSGFuZGxlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBhc3NlcnQoSS0+c2Vjb25kICYmIEktPmZpcnN0ID09IEktPnNlY29uZC0+VlAgJiYgIkxpc3QgaW52YXJpYW50IGJyb2tlbiEiKTsKKyAgICBJLT5zZWNvbmQtPnNldFByZXZQdHIoJkktPnNlY29uZCk7CisgIH0KK30KKworLy8vIFJlbW92ZUZyb21Vc2VMaXN0IC0gUmVtb3ZlIHRoaXMgVmFsdWVIYW5kbGUgZnJvbSBpdHMgY3VycmVudCB1c2UgbGlzdC4KK3ZvaWQgVmFsdWVIYW5kbGVCYXNlOjpSZW1vdmVGcm9tVXNlTGlzdCgpIHsKKyAgYXNzZXJ0KFZQICYmIFZQLT5IYXNWYWx1ZUhhbmRsZSAmJiAiUG9pbnRlciBkb2Vzbid0IGhhdmUgYSB1c2UgbGlzdCEiKTsKKworICAvLyBVbmxpbmsgdGhpcyBmcm9tIGl0cyB1c2UgbGlzdC4KKyAgVmFsdWVIYW5kbGVCYXNlICoqUHJldlB0ciA9IGdldFByZXZQdHIoKTsKKyAgYXNzZXJ0KCpQcmV2UHRyID09IHRoaXMgJiYgIkxpc3QgaW52YXJpYW50IGJyb2tlbiIpOworCisgICpQcmV2UHRyID0gTmV4dDsKKyAgaWYgKE5leHQpIHsKKyAgICBhc3NlcnQoTmV4dC0+Z2V0UHJldlB0cigpID09ICZOZXh0ICYmICJMaXN0IGludmFyaWFudCBicm9rZW4iKTsKKyAgICBOZXh0LT5zZXRQcmV2UHRyKFByZXZQdHIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmIHRoZSBOZXh0IHBvaW50ZXIgd2FzIG51bGwsIHRoZW4gaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIHdhcyB0aGUgbGFzdAorICAvLyBWYWx1ZUhhbmRsZSB3YXRjaGluZyBWUC4gIElmIHNvLCBkZWxldGUgaXRzIGVudHJ5IGZyb20gdGhlIFZhbHVlSGFuZGxlcworICAvLyBtYXAuCisgIExMVk1Db250ZXh0SW1wbCAqcEltcGwgPSBWUC0+Z2V0Q29udGV4dCgpLnBJbXBsOworICBEZW5zZU1hcDxWYWx1ZSosIFZhbHVlSGFuZGxlQmFzZSo+ICZIYW5kbGVzID0gcEltcGwtPlZhbHVlSGFuZGxlczsKKyAgaWYgKEhhbmRsZXMuaXNQb2ludGVySW50b0J1Y2tldHNBcnJheShQcmV2UHRyKSkgeworICAgIEhhbmRsZXMuZXJhc2UoVlApOworICAgIFZQLT5IYXNWYWx1ZUhhbmRsZSA9IGZhbHNlOworICB9Cit9CisKKwordm9pZCBWYWx1ZUhhbmRsZUJhc2U6OlZhbHVlSXNEZWxldGVkKFZhbHVlICpWKSB7CisgIGFzc2VydChWLT5IYXNWYWx1ZUhhbmRsZSAmJiAiU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIFZhbHVlSGFuZGxlcyBwcmVzZW50Iik7CisKKyAgLy8gR2V0IHRoZSBsaW5rZWQgbGlzdCBiYXNlLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IHNpbmNlIHRoZQorICAvLyBIYXNWYWx1ZUhhbmRsZSBmbGFnIGlzIHNldC4KKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IFYtPmdldENvbnRleHQoKS5wSW1wbDsKKyAgVmFsdWVIYW5kbGVCYXNlICpFbnRyeSA9IHBJbXBsLT5WYWx1ZUhhbmRsZXNbVl07CisgIGFzc2VydChFbnRyeSAmJiAiVmFsdWUgYml0IHNldCBidXQgbm8gZW50cmllcyBleGlzdCIpOworCisgIC8vIFdlIHVzZSBhIGxvY2FsIFZhbHVlSGFuZGxlQmFzZSBhcyBhbiBpdGVyYXRvciBzbyB0aGF0IFZhbHVlSGFuZGxlcyBjYW4gYWRkCisgIC8vIGFuZCByZW1vdmUgdGhlbXNlbHZlcyBmcm9tIHRoZSBsaXN0IHdpdGhvdXQgYnJlYWtpbmcgb3VyIGl0ZXJhdGlvbi4gIFRoaXMKKyAgLy8gaXMgbm90IHJlYWxseSBhbiBBc3NlcnRpbmdWSDsgd2UganVzdCBoYXZlIHRvIGdpdmUgVmFsdWVIYW5kbGVCYXNlIGEga2luZC4KKyAgLy8gTm90ZSB0aGF0IHdlIGRlbGliZXJhdGVseSBkbyBub3QgdGhlIHN1cHBvcnQgdGhlIGNhc2Ugd2hlbiBkcm9wcGluZyBhIHZhbHVlCisgIC8vIGhhbmRsZSByZXN1bHRzIGluIGEgbmV3IHZhbHVlIGhhbmRsZSBiZWluZyBwZXJtYW5lbnRseSBhZGRlZCB0byB0aGUgbGlzdAorICAvLyAoYXMgbWlnaHQgb2NjdXIgaW4gdGhlb3J5IGZvciBDYWxsYmFja1ZIJ3MpOiB0aGUgbmV3IHZhbHVlIGhhbmRsZSB3aWxsIG5vdAorICAvLyBiZSBwcm9jZXNzZWQgYW5kIHRoZSBjaGVja2luZyBjb2RlIHdpbGwgbWV0ZSBvdXQgcmlnaHRlb3VzIHB1bmlzaG1lbnQgaWYKKyAgLy8gdGhlIGhhbmRsZSBpcyBzdGlsbCBwcmVzZW50IG9uY2Ugd2UgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nIGFsbCB0aGUgb3RoZXIKKyAgLy8gdmFsdWUgaGFuZGxlcyAoaXQgaXMgZmluZSB0byBtb21lbnRhcmlseSBhZGQgdGhlbiByZW1vdmUgYSB2YWx1ZSBoYW5kbGUpLgorICBmb3IgKFZhbHVlSGFuZGxlQmFzZSBJdGVyYXRvcihBc3NlcnQsICpFbnRyeSk7IEVudHJ5OyBFbnRyeSA9IEl0ZXJhdG9yLk5leHQpIHsKKyAgICBJdGVyYXRvci5SZW1vdmVGcm9tVXNlTGlzdCgpOworICAgIEl0ZXJhdG9yLkFkZFRvRXhpc3RpbmdVc2VMaXN0QWZ0ZXIoRW50cnkpOworICAgIGFzc2VydChFbnRyeS0+TmV4dCA9PSAmSXRlcmF0b3IgJiYgIkxvb3AgaW52YXJpYW50IGJyb2tlbi4iKTsKKworICAgIHN3aXRjaCAoRW50cnktPmdldEtpbmQoKSkgeworICAgIGNhc2UgQXNzZXJ0OgorICAgICAgYnJlYWs7CisgICAgY2FzZSBUcmFja2luZzoKKyAgICAgIC8vIE1hcmsgdGhhdCB0aGlzIHZhbHVlIGhhcyBiZWVuIGRlbGV0ZWQgYnkgc2V0dGluZyBpdCB0byBhbiBpbnZhbGlkIFZhbHVlCisgICAgICAvLyBwb2ludGVyLgorICAgICAgRW50cnktPm9wZXJhdG9yPShEZW5zZU1hcEluZm88VmFsdWUgKj46OmdldFRvbWJzdG9uZUtleSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2VhazoKKyAgICAgIC8vIFdlYWsganVzdCBnb2VzIHRvIG51bGwsIHdoaWNoIHdpbGwgdW5saW5rIGl0IGZyb20gdGhlIGxpc3QuCisgICAgICBFbnRyeS0+b3BlcmF0b3I9KDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDYWxsYmFjazoKKyAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1YmNsYXNzJ3MgaW1wbGVtZW50YXRpb24uCisgICAgICBzdGF0aWNfY2FzdDxDYWxsYmFja1ZIKj4oRW50cnkpLT5kZWxldGVkKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBBbGwgY2FsbGJhY2tzLCB3ZWFrIHJlZmVyZW5jZXMsIGFuZCBhc3NlcnRpbmdWSHMgc2hvdWxkIGJlIGRyb3BwZWQgYnkgbm93LgorICBpZiAoVi0+SGFzVmFsdWVIYW5kbGUpIHsKKyNpZm5kZWYgTkRFQlVHICAgICAgLy8gT25seSBpbiArQXNzZXJ0cyBtb2RlLi4uCisgICAgZGJncygpIDw8ICJXaGlsZSBkZWxldGluZzogIiA8PCAqVi0+Z2V0VHlwZSgpIDw8ICIgJSIgPDwgVi0+Z2V0TmFtZVN0cigpCisgICAgICAgICAgIDw8ICJcbiI7CisgICAgaWYgKHBJbXBsLT5WYWx1ZUhhbmRsZXNbVl0tPmdldEtpbmQoKSA9PSBBc3NlcnQpCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJBbiBhc3NlcnRpbmcgdmFsdWUgaGFuZGxlIHN0aWxsIHBvaW50ZWQgdG8gdGhpcyIKKyAgICAgICAgICAgICAgICAgICAgICAgIiB2YWx1ZSEiKTsKKworI2VuZGlmCisgICAgbGx2bV91bnJlYWNoYWJsZSgiQWxsIHJlZmVyZW5jZXMgdG8gViB3ZXJlIG5vdCByZW1vdmVkPyIpOworICB9Cit9CisKKwordm9pZCBWYWx1ZUhhbmRsZUJhc2U6OlZhbHVlSXNSQVVXZChWYWx1ZSAqT2xkLCBWYWx1ZSAqTmV3KSB7CisgIGFzc2VydChPbGQtPkhhc1ZhbHVlSGFuZGxlICYmIlNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBWYWx1ZUhhbmRsZXMgcHJlc2VudCIpOworICBhc3NlcnQoT2xkICE9IE5ldyAmJiAiQ2hhbmdpbmcgdmFsdWUgaW50byBpdHNlbGYhIik7CisKKyAgLy8gR2V0IHRoZSBsaW5rZWQgbGlzdCBiYXNlLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IHNpbmNlIHRoZQorICAvLyBIYXNWYWx1ZUhhbmRsZSBmbGFnIGlzIHNldC4KKyAgTExWTUNvbnRleHRJbXBsICpwSW1wbCA9IE9sZC0+Z2V0Q29udGV4dCgpLnBJbXBsOworICBWYWx1ZUhhbmRsZUJhc2UgKkVudHJ5ID0gcEltcGwtPlZhbHVlSGFuZGxlc1tPbGRdOworCisgIGFzc2VydChFbnRyeSAmJiAiVmFsdWUgYml0IHNldCBidXQgbm8gZW50cmllcyBleGlzdCIpOworCisgIC8vIFdlIHVzZSBhIGxvY2FsIFZhbHVlSGFuZGxlQmFzZSBhcyBhbiBpdGVyYXRvciBzbyB0aGF0CisgIC8vIFZhbHVlSGFuZGxlcyBjYW4gYWRkIGFuZCByZW1vdmUgdGhlbXNlbHZlcyBmcm9tIHRoZSBsaXN0IHdpdGhvdXQKKyAgLy8gYnJlYWtpbmcgb3VyIGl0ZXJhdGlvbi4gIFRoaXMgaXMgbm90IHJlYWxseSBhbiBBc3NlcnRpbmdWSDsgd2UKKyAgLy8ganVzdCBoYXZlIHRvIGdpdmUgVmFsdWVIYW5kbGVCYXNlIHNvbWUga2luZC4KKyAgZm9yIChWYWx1ZUhhbmRsZUJhc2UgSXRlcmF0b3IoQXNzZXJ0LCAqRW50cnkpOyBFbnRyeTsgRW50cnkgPSBJdGVyYXRvci5OZXh0KSB7CisgICAgSXRlcmF0b3IuUmVtb3ZlRnJvbVVzZUxpc3QoKTsKKyAgICBJdGVyYXRvci5BZGRUb0V4aXN0aW5nVXNlTGlzdEFmdGVyKEVudHJ5KTsKKyAgICBhc3NlcnQoRW50cnktPk5leHQgPT0gJkl0ZXJhdG9yICYmICJMb29wIGludmFyaWFudCBicm9rZW4uIik7CisKKyAgICBzd2l0Y2ggKEVudHJ5LT5nZXRLaW5kKCkpIHsKKyAgICBjYXNlIEFzc2VydDoKKyAgICAgIC8vIEFzc2VydGluZyBoYW5kbGUgZG9lcyBub3QgZm9sbG93IFJBVVcgaW1wbGljaXRseS4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHJhY2tpbmc6CisgICAgICAvLyBUcmFja2luZyBnb2VzIHRvIG5ldyB2YWx1ZSBsaWtlIGEgV2Vha1ZILiBOb3RlIHRoYXQgdGhpcyBtYXkgbWFrZSBpdAorICAgICAgLy8gc29tZXRoaW5nIGluY29tcGF0aWJsZSB3aXRoIGl0cyB0ZW1wbGF0ZWQgdHlwZS4gV2UgZG9uJ3Qgd2FudCB0byBoYXZlIGEKKyAgICAgIC8vIHZpcnR1YWwgKG9yIGlubGluZSkgaW50ZXJmYWNlIHRvIGhhbmRsZSB0aGlzIHRob3VnaCwgc28gaW5zdGVhZCB3ZSBtYWtlCisgICAgICAvLyB0aGUgVHJhY2tpbmdWSCBhY2Nlc3NvcnMgZ3VhcmFudGVlIHRoYXQgYSBjbGllbnQgbmV2ZXIgc2VlcyB0aGlzIHZhbHVlLgorCisgICAgICAvLyBGQUxMVEhST1VHSAorICAgIGNhc2UgV2VhazoKKyAgICAgIC8vIFdlYWsgZ29lcyB0byB0aGUgbmV3IHZhbHVlLCB3aGljaCB3aWxsIHVubGluayBpdCBmcm9tIE9sZCdzIGxpc3QuCisgICAgICBFbnRyeS0+b3BlcmF0b3I9KE5ldyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENhbGxiYWNrOgorICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3ViY2xhc3MncyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIHN0YXRpY19jYXN0PENhbGxiYWNrVkgqPihFbnRyeSktPmFsbFVzZXNSZXBsYWNlZFdpdGgoTmV3KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisjaWZuZGVmIE5ERUJVRworICAvLyBJZiBhbnkgbmV3IHRyYWNraW5nIG9yIHdlYWsgdmFsdWUgaGFuZGxlcyB3ZXJlIGFkZGVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlCisgIC8vIGxpc3QsIHRoZW4gY29tcGxhaW4gYWJvdXQgaXQgbm93LgorICBpZiAoT2xkLT5IYXNWYWx1ZUhhbmRsZSkKKyAgICBmb3IgKEVudHJ5ID0gcEltcGwtPlZhbHVlSGFuZGxlc1tPbGRdOyBFbnRyeTsgRW50cnkgPSBFbnRyeS0+TmV4dCkKKyAgICAgIHN3aXRjaCAoRW50cnktPmdldEtpbmQoKSkgeworICAgICAgY2FzZSBUcmFja2luZzoKKyAgICAgIGNhc2UgV2VhazoKKyAgICAgICAgZGJncygpIDw8ICJBZnRlciBSQVVXIGZyb20gIiA8PCAqT2xkLT5nZXRUeXBlKCkgPDwgIiAlIgorICAgICAgICAgIDw8IE9sZC0+Z2V0TmFtZVN0cigpIDw8ICIgdG8gIiA8PCAqTmV3LT5nZXRUeXBlKCkgPDwgIiAlIgorICAgICAgICAgIDw8IE5ldy0+Z2V0TmFtZVN0cigpIDw8ICJcbiI7CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkEgdHJhY2tpbmcgb3Igd2VhayB2YWx1ZSBoYW5kbGUgc3RpbGwgcG9pbnRlZCB0byB0aGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBvbGQgdmFsdWUhXG4iKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmCit9CisKKy8vLyB+Q2FsbGJhY2tWSC4gRW1wdHksIGJ1dCBkZWZpbmVkIGhlcmUgdG8gYXZvaWQgZW1pdHRpbmcgdGhlIHZ0YWJsZQorLy8vIG1vcmUgdGhhbiBvbmNlLgorQ2FsbGJhY2tWSDo6fkNhbGxiYWNrVkgoKSB7fQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIHJlcGxhY2VVc2VzT2ZXaXRoIC0gUmVwbGFjZXMgYWxsIHJlZmVyZW5jZXMgdG8gdGhlICJGcm9tIiBkZWZpbml0aW9uIHdpdGgKKy8vIHJlZmVyZW5jZXMgdG8gdGhlICJUbyIgZGVmaW5pdGlvbi4KKy8vCit2b2lkIFVzZXI6OnJlcGxhY2VVc2VzT2ZXaXRoKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pIHsKKyAgaWYgKEZyb20gPT0gVG8pIHJldHVybjsgICAvLyBEdWggd2hhdD8KKworICBhc3NlcnQoKCFpc2E8Q29uc3RhbnQ+KHRoaXMpIHx8IGlzYTxHbG9iYWxWYWx1ZT4odGhpcykpICYmCisgICAgICAgICAiQ2Fubm90IGNhbGwgVXNlcjo6cmVwbGFjZVVzZXNPZldpdGggb24gYSBjb25zdGFudCEiKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBFID0gZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBFOyArK2kpCisgICAgaWYgKGdldE9wZXJhbmQoaSkgPT0gRnJvbSkgeyAgLy8gSXMgVGhpcyBvcGVyYW5kIGlzIHBvaW50aW5nIHRvIG9sZHZhbD8KKyAgICAgIC8vIFRoZSBzaWRlIGVmZmVjdHMgb2YgdGhpcyBzZXRPcGVyYW5kIGNhbGwgaW5jbHVkZSBsaW5raW5nIHRvCisgICAgICAvLyAiVG8iLCBhZGRpbmcgInRoaXMiIHRvIHRoZSB1c2VzIGxpc3Qgb2YgVG8sIGFuZAorICAgICAgLy8gbW9zdCBpbXBvcnRhbnRseSwgcmVtb3ZpbmcgInRoaXMiIGZyb20gdGhlIHVzZSBsaXN0IG9mICJGcm9tIi4KKyAgICAgIHNldE9wZXJhbmQoaSwgVG8pOyAvLyBGaXggaXQgbm93Li4uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vbGliL1ZNQ29yZS9WYWx1ZVN5bWJvbFRhYmxlLmNwcCBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvVmFsdWVTeW1ib2xUYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0YmYwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL2xpYi9WTUNvcmUvVmFsdWVTeW1ib2xUYWJsZS5jcHAKQEAgLTAsMCArMSwxMTcgQEAKKy8vPT09LS0gVmFsdWVTeW1ib2xUYWJsZS5jcHAgLSBJbXBsZW1lbnQgdGhlIFZhbHVlU3ltYm9sVGFibGUgY2xhc3MgLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFZhbHVlU3ltYm9sVGFibGUgY2xhc3MgZm9yIHRoZSBWTUNvcmUgbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgInZhbHVlc3ltdGFiIgorI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL1ZhbHVlU3ltYm9sVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vIENsYXNzIGRlc3RydWN0b3IKK1ZhbHVlU3ltYm9sVGFibGU6On5WYWx1ZVN5bWJvbFRhYmxlKCkgeworI2lmbmRlZiBOREVCVUcgICAvLyBPbmx5IGRvIHRoaXMgaW4gLWcgbW9kZS4uLgorICBmb3IgKGl0ZXJhdG9yIFZJID0gdm1hcC5iZWdpbigpLCBWRSA9IHZtYXAuZW5kKCk7IFZJICE9IFZFOyArK1ZJKQorICAgIGRiZ3MoKSA8PCAiVmFsdWUgc3RpbGwgaW4gc3ltYm9sIHRhYmxlISBUeXBlID0gJyIKKyAgICAgICAgICAgPDwgVkktPmdldFZhbHVlKCktPmdldFR5cGUoKS0+Z2V0RGVzY3JpcHRpb24oKSA8PCAiJyBOYW1lID0gJyIKKyAgICAgICAgICAgPDwgVkktPmdldEtleURhdGEoKSA8PCAiJ1xuIjsKKyAgYXNzZXJ0KHZtYXAuZW1wdHkoKSAmJiAiVmFsdWVzIHJlbWFpbiBpbiBzeW1ib2wgdGFibGUhIik7CisjZW5kaWYKK30KKworLy8gSW5zZXJ0IGEgdmFsdWUgaW50byB0aGUgc3ltYm9sIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLi4uCisvLwordm9pZCBWYWx1ZVN5bWJvbFRhYmxlOjpyZWluc2VydFZhbHVlKFZhbHVlKiBWKSB7CisgIGFzc2VydChWLT5oYXNOYW1lKCkgJiYgIkNhbid0IGluc2VydCBuYW1lbGVzcyBWYWx1ZSBpbnRvIHN5bWJvbCB0YWJsZSIpOworCisgIC8vIFRyeSBpbnNlcnRpbmcgdGhlIG5hbWUsIGFzc3VtaW5nIGl0IHdvbid0IGNvbmZsaWN0LgorICBpZiAodm1hcC5pbnNlcnQoVi0+TmFtZSkpIHsKKyAgICAvL0RFQlVHKGRiZ3MoKSA8PCAiIEluc2VydGVkIHZhbHVlOiAiIDw8IFYtPk5hbWUgPDwgIjogIiA8PCAqViA8PCAiXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIE90aGVyd2lzZSwgdGhlcmUgaXMgYSBuYW1pbmcgY29uZmxpY3QuICBSZW5hbWUgdGhpcyB2YWx1ZS4KKyAgU21hbGxTdHJpbmc8MjU2PiBVbmlxdWVOYW1lKFYtPmdldE5hbWUoKS5iZWdpbigpLCBWLT5nZXROYW1lKCkuZW5kKCkpOworCisgIC8vIFRoZSBuYW1lIGlzIHRvbyBhbHJlYWR5IHVzZWQsIGp1c3QgZnJlZSBpdCBzbyB3ZSBjYW4gYWxsb2NhdGUgYSBuZXcgbmFtZS4KKyAgVi0+TmFtZS0+RGVzdHJveSgpOworICAKKyAgdW5zaWduZWQgQmFzZVNpemUgPSBVbmlxdWVOYW1lLnNpemUoKTsKKyAgd2hpbGUgKDEpIHsKKyAgICAvLyBUcmltIGFueSBzdWZmaXggb2ZmIGFuZCBhcHBlbmQgdGhlIG5leHQgbnVtYmVyLgorICAgIFVuaXF1ZU5hbWUucmVzaXplKEJhc2VTaXplKTsKKyAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtKFVuaXF1ZU5hbWUpIDw8ICsrTGFzdFVuaXF1ZTsKKworICAgIC8vIFRyeSBpbnNlcnQgdGhlIHZtYXAgZW50cnkgd2l0aCB0aGlzIHN1ZmZpeC4KKyAgICBWYWx1ZU5hbWUgJk5ld05hbWUgPSB2bWFwLkdldE9yQ3JlYXRlVmFsdWUoVW5pcXVlTmFtZSk7CisgICAgaWYgKE5ld05hbWUuZ2V0VmFsdWUoKSA9PSAwKSB7CisgICAgICAvLyBOZXdseSBpbnNlcnRlZCBuYW1lLiAgU3VjY2VzcyEKKyAgICAgIE5ld05hbWUuc2V0VmFsdWUoVik7CisgICAgICBWLT5OYW1lID0gJk5ld05hbWU7CisgICAgIC8vREVCVUcoZGJncygpIDw8ICIgSW5zZXJ0ZWQgdmFsdWU6ICIgPDwgVW5pcXVlTmFtZSA8PCAiOiAiIDw8ICpWIDw8ICJcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCit2b2lkIFZhbHVlU3ltYm9sVGFibGU6OnJlbW92ZVZhbHVlTmFtZShWYWx1ZU5hbWUgKlYpIHsKKyAgLy9ERUJVRyhkYmdzKCkgPDwgIiBSZW1vdmluZyBWYWx1ZTogIiA8PCBWLT5nZXRLZXlEYXRhKCkgPDwgIlxuIik7CisgIC8vIFJlbW92ZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3ltYm9sIHRhYmxlLgorICB2bWFwLnJlbW92ZShWKTsKK30KKworLy8vIGNyZWF0ZVZhbHVlTmFtZSAtIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNyZWF0ZSBhIHZhbHVlIG5hbWUgYW5kIGluc2VydAorLy8vIGl0IGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gIElmIGl0IGNvbmZsaWN0cywgaXQKKy8vLyBhdXRvLXJlbmFtZXMgdGhlIG5hbWUgYW5kIHJldHVybnMgdGhhdCBpbnN0ZWFkLgorVmFsdWVOYW1lICpWYWx1ZVN5bWJvbFRhYmxlOjpjcmVhdGVWYWx1ZU5hbWUoU3RyaW5nUmVmIE5hbWUsIFZhbHVlICpWKSB7CisgIC8vIEluIHRoZSBjb21tb24gY2FzZSwgdGhlIG5hbWUgaXMgbm90IGFscmVhZHkgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKyAgVmFsdWVOYW1lICZFbnRyeSA9IHZtYXAuR2V0T3JDcmVhdGVWYWx1ZShOYW1lKTsKKyAgaWYgKEVudHJ5LmdldFZhbHVlKCkgPT0gMCkgeworICAgIEVudHJ5LnNldFZhbHVlKFYpOworICAgIC8vREVCVUcoZGJncygpIDw8ICIgSW5zZXJ0ZWQgdmFsdWU6ICIgPDwgRW50cnkuZ2V0S2V5RGF0YSgpIDw8ICI6ICIKKyAgICAvLyAgICAgICAgICAgPDwgKlYgPDwgIlxuIik7CisgICAgcmV0dXJuICZFbnRyeTsKKyAgfQorICAKKyAgLy8gT3RoZXJ3aXNlLCB0aGVyZSBpcyBhIG5hbWluZyBjb25mbGljdC4gIFJlbmFtZSB0aGlzIHZhbHVlLgorICBTbWFsbFN0cmluZzwyNTY+IFVuaXF1ZU5hbWUoTmFtZS5iZWdpbigpLCBOYW1lLmVuZCgpKTsKKyAgCisgIHdoaWxlICgxKSB7CisgICAgLy8gVHJpbSBhbnkgc3VmZml4IG9mZiBhbmQgYXBwZW5kIHRoZSBuZXh0IG51bWJlci4KKyAgICBVbmlxdWVOYW1lLnJlc2l6ZShOYW1lLnNpemUoKSk7CisgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbShVbmlxdWVOYW1lKSA8PCArK0xhc3RVbmlxdWU7CisgICAgCisgICAgLy8gVHJ5IGluc2VydCB0aGUgdm1hcCBlbnRyeSB3aXRoIHRoaXMgc3VmZml4LgorICAgIFZhbHVlTmFtZSAmTmV3TmFtZSA9IHZtYXAuR2V0T3JDcmVhdGVWYWx1ZShVbmlxdWVOYW1lKTsKKyAgICBpZiAoTmV3TmFtZS5nZXRWYWx1ZSgpID09IDApIHsKKyAgICAgIC8vIE5ld2x5IGluc2VydGVkIG5hbWUuICBTdWNjZXNzIQorICAgICAgTmV3TmFtZS5zZXRWYWx1ZShWKTsKKyAgICAgLy9ERUJVRyhkYmdzKCkgPDwgIiBJbnNlcnRlZCB2YWx1ZTogIiA8PCBVbmlxdWVOYW1lIDw8ICI6ICIgPDwgKlYgPDwgIlxuIik7CisgICAgICByZXR1cm4gJk5ld05hbWU7CisgICAgfQorICB9Cit9CisKKworLy8gZHVtcCAtIHByaW50IG91dCB0aGUgc3ltYm9sIHRhYmxlCisvLwordm9pZCBWYWx1ZVN5bWJvbFRhYmxlOjpkdW1wKCkgY29uc3QgeworICAvL0RFQlVHKGRiZ3MoKSA8PCAiVmFsdWVTeW1ib2xUYWJsZTpcbiIpOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgLy9ERUJVRyhkYmdzKCkgPDwgIiAgJyIgPDwgSS0+Z2V0S2V5RGF0YSgpIDw8ICInID0gIik7CisgICAgSS0+Z2V0VmFsdWUoKS0+ZHVtcCgpOworICAgIC8vREVCVUcoZGJncygpIDw8ICJcbiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS9saWIvVk1Db3JlL1ZhbHVlVHlwZXMuY3BwIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9WYWx1ZVR5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmE4Y2UzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vbGliL1ZNQ29yZS9WYWx1ZVR5cGVzLmNwcApAQCAtMCwwICsxLDIwOCBAQAorLy89PT0tLS0tLS0tLS0tLSBWYWx1ZVR5cGVzLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIEVWVCBtZXRob2RzIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBtZXRob2RzIGluIHRoZSBDb2RlR2VuL1ZhbHVlVHlwZXMuaCBoZWFkZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitFVlQgRVZUOjpnZXRFeHRlbmRlZEludGVnZXJWVChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgQml0V2lkdGgpIHsKKyAgRVZUIFZUOworICBWVC5MTFZNVHkgPSBJbnRlZ2VyVHlwZTo6Z2V0KENvbnRleHQsIEJpdFdpZHRoKTsKKyAgYXNzZXJ0KFZULmlzRXh0ZW5kZWQoKSAmJiAiVHlwZSBpcyBub3QgZXh0ZW5kZWQhIik7CisgIHJldHVybiBWVDsKK30KKworRVZUIEVWVDo6Z2V0RXh0ZW5kZWRWZWN0b3JWVChMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1FbGVtZW50cykgeworICBFVlQgUmVzdWx0VlQ7CisgIFJlc3VsdFZULkxMVk1UeSA9IFZlY3RvclR5cGU6OmdldChWVC5nZXRUeXBlRm9yRVZUKENvbnRleHQpLCBOdW1FbGVtZW50cyk7CisgIGFzc2VydChSZXN1bHRWVC5pc0V4dGVuZGVkKCkgJiYgIlR5cGUgaXMgbm90IGV4dGVuZGVkISIpOworICByZXR1cm4gUmVzdWx0VlQ7Cit9CisKK2Jvb2wgRVZUOjppc0V4dGVuZGVkRmxvYXRpbmdQb2ludCgpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzRXh0ZW5kZWQoKSAmJiAiVHlwZSBpcyBub3QgZXh0ZW5kZWQhIik7CisgIHJldHVybiBMTFZNVHktPmlzRlBPckZQVmVjdG9yVHkoKTsKK30KKworYm9vbCBFVlQ6OmlzRXh0ZW5kZWRJbnRlZ2VyKCkgY29uc3QgeworICBhc3NlcnQoaXNFeHRlbmRlZCgpICYmICJUeXBlIGlzIG5vdCBleHRlbmRlZCEiKTsKKyAgcmV0dXJuIExMVk1UeS0+aXNJbnRPckludFZlY3RvclR5KCk7Cit9CisKK2Jvb2wgRVZUOjppc0V4dGVuZGVkVmVjdG9yKCkgY29uc3QgeworICBhc3NlcnQoaXNFeHRlbmRlZCgpICYmICJUeXBlIGlzIG5vdCBleHRlbmRlZCEiKTsKKyAgcmV0dXJuIExMVk1UeS0+aXNWZWN0b3JUeSgpOworfQorCitib29sIEVWVDo6aXNFeHRlbmRlZDY0Qml0VmVjdG9yKCkgY29uc3QgeworICByZXR1cm4gaXNFeHRlbmRlZFZlY3RvcigpICYmIGdldFNpemVJbkJpdHMoKSA9PSA2NDsKK30KKworYm9vbCBFVlQ6OmlzRXh0ZW5kZWQxMjhCaXRWZWN0b3IoKSBjb25zdCB7CisgIHJldHVybiBpc0V4dGVuZGVkVmVjdG9yKCkgJiYgZ2V0U2l6ZUluQml0cygpID09IDEyODsKK30KKworYm9vbCBFVlQ6OmlzRXh0ZW5kZWQyNTZCaXRWZWN0b3IoKSBjb25zdCB7CisgIHJldHVybiBpc0V4dGVuZGVkVmVjdG9yKCkgJiYgZ2V0U2l6ZUluQml0cygpID09IDI1NjsKK30KKworYm9vbCBFVlQ6OmlzRXh0ZW5kZWQ1MTJCaXRWZWN0b3IoKSBjb25zdCB7CisgIHJldHVybiBpc0V4dGVuZGVkVmVjdG9yKCkgJiYgZ2V0U2l6ZUluQml0cygpID09IDUxMjsKK30KKworRVZUIEVWVDo6Z2V0RXh0ZW5kZWRWZWN0b3JFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzRXh0ZW5kZWQoKSAmJiAiVHlwZSBpcyBub3QgZXh0ZW5kZWQhIik7CisgIHJldHVybiBFVlQ6OmdldEVWVChjYXN0PFZlY3RvclR5cGU+KExMVk1UeSktPmdldEVsZW1lbnRUeXBlKCkpOworfQorCit1bnNpZ25lZCBFVlQ6OmdldEV4dGVuZGVkVmVjdG9yTnVtRWxlbWVudHMoKSBjb25zdCB7CisgIGFzc2VydChpc0V4dGVuZGVkKCkgJiYgIlR5cGUgaXMgbm90IGV4dGVuZGVkISIpOworICByZXR1cm4gY2FzdDxWZWN0b3JUeXBlPihMTFZNVHkpLT5nZXROdW1FbGVtZW50cygpOworfQorCit1bnNpZ25lZCBFVlQ6OmdldEV4dGVuZGVkU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzRXh0ZW5kZWQoKSAmJiAiVHlwZSBpcyBub3QgZXh0ZW5kZWQhIik7CisgIGlmIChjb25zdCBJbnRlZ2VyVHlwZSAqSVR5ID0gZHluX2Nhc3Q8SW50ZWdlclR5cGU+KExMVk1UeSkpCisgICAgcmV0dXJuIElUeS0+Z2V0Qml0V2lkdGgoKTsKKyAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KExMVk1UeSkpCisgICAgcmV0dXJuIFZUeS0+Z2V0Qml0V2lkdGgoKTsKKyAgYXNzZXJ0KGZhbHNlICYmICJVbnJlY29nbml6ZWQgZXh0ZW5kZWQgdHlwZSEiKTsKKyAgcmV0dXJuIDA7IC8vIFN1cHByZXNzIHdhcm5pbmdzLgorfQorCisvLy8gZ2V0RVZUU3RyaW5nIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlIHR5cGUgYXMgYSBzdHJpbmcsIGUuZy4gImkzMiIuCitzdGQ6OnN0cmluZyBFVlQ6OmdldEVWVFN0cmluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChWLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6CisgICAgaWYgKGlzVmVjdG9yKCkpCisgICAgICByZXR1cm4gInYiICsgdXRvc3RyKGdldFZlY3Rvck51bUVsZW1lbnRzKCkpICsKKyAgICAgICAgICAgICBnZXRWZWN0b3JFbGVtZW50VHlwZSgpLmdldEVWVFN0cmluZygpOworICAgIGlmIChpc0ludGVnZXIoKSkKKyAgICAgIHJldHVybiAiaSIgKyB1dG9zdHIoZ2V0U2l6ZUluQml0cygpKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIEVWVCEiKTsKKyAgICByZXR1cm4gIj8iOworICBjYXNlIE1WVDo6aTE6ICAgICAgcmV0dXJuICJpMSI7CisgIGNhc2UgTVZUOjppODogICAgICByZXR1cm4gImk4IjsKKyAgY2FzZSBNVlQ6OmkxNjogICAgIHJldHVybiAiaTE2IjsKKyAgY2FzZSBNVlQ6OmkzMjogICAgIHJldHVybiAiaTMyIjsKKyAgY2FzZSBNVlQ6Omk2NDogICAgIHJldHVybiAiaTY0IjsKKyAgY2FzZSBNVlQ6OmkxMjg6ICAgIHJldHVybiAiaTEyOCI7CisgIGNhc2UgTVZUOjpmMzI6ICAgICByZXR1cm4gImYzMiI7CisgIGNhc2UgTVZUOjpmNjQ6ICAgICByZXR1cm4gImY2NCI7CisgIGNhc2UgTVZUOjpmODA6ICAgICByZXR1cm4gImY4MCI7CisgIGNhc2UgTVZUOjpmMTI4OiAgICByZXR1cm4gImYxMjgiOworICBjYXNlIE1WVDo6cHBjZjEyODogcmV0dXJuICJwcGNmMTI4IjsKKyAgY2FzZSBNVlQ6OmlzVm9pZDogIHJldHVybiAiaXNWb2lkIjsKKyAgY2FzZSBNVlQ6Ok90aGVyOiAgIHJldHVybiAiY2giOworICBjYXNlIE1WVDo6RmxhZzogICAgcmV0dXJuICJmbGFnIjsKKyAgY2FzZSBNVlQ6OnYyaTg6ICAgIHJldHVybiAidjJpOCI7CisgIGNhc2UgTVZUOjp2NGk4OiAgICByZXR1cm4gInY0aTgiOworICBjYXNlIE1WVDo6djhpODogICAgcmV0dXJuICJ2OGk4IjsKKyAgY2FzZSBNVlQ6OnYxNmk4OiAgIHJldHVybiAidjE2aTgiOworICBjYXNlIE1WVDo6djMyaTg6ICAgcmV0dXJuICJ2MzJpOCI7CisgIGNhc2UgTVZUOjp2MmkxNjogICByZXR1cm4gInYyaTE2IjsKKyAgY2FzZSBNVlQ6OnY0aTE2OiAgIHJldHVybiAidjRpMTYiOworICBjYXNlIE1WVDo6djhpMTY6ICAgcmV0dXJuICJ2OGkxNiI7CisgIGNhc2UgTVZUOjp2MTZpMTY6ICByZXR1cm4gInYxNmkxNiI7CisgIGNhc2UgTVZUOjp2MmkzMjogICByZXR1cm4gInYyaTMyIjsKKyAgY2FzZSBNVlQ6OnY0aTMyOiAgIHJldHVybiAidjRpMzIiOworICBjYXNlIE1WVDo6djhpMzI6ICAgcmV0dXJuICJ2OGkzMiI7CisgIGNhc2UgTVZUOjp2MWk2NDogICByZXR1cm4gInYxaTY0IjsKKyAgY2FzZSBNVlQ6OnYyaTY0OiAgIHJldHVybiAidjJpNjQiOworICBjYXNlIE1WVDo6djRpNjQ6ICAgcmV0dXJuICJ2NGk2NCI7CisgIGNhc2UgTVZUOjp2OGk2NDogICByZXR1cm4gInY4aTY0IjsKKyAgY2FzZSBNVlQ6OnYyZjMyOiAgIHJldHVybiAidjJmMzIiOworICBjYXNlIE1WVDo6djRmMzI6ICAgcmV0dXJuICJ2NGYzMiI7CisgIGNhc2UgTVZUOjp2OGYzMjogICByZXR1cm4gInY4ZjMyIjsKKyAgY2FzZSBNVlQ6OnYyZjY0OiAgIHJldHVybiAidjJmNjQiOworICBjYXNlIE1WVDo6djRmNjQ6ICAgcmV0dXJuICJ2NGY2NCI7CisgIGNhc2UgTVZUOjpNZXRhZGF0YTpyZXR1cm4gIk1ldGFkYXRhIjsKKyAgfQorfQorCisvLy8gZ2V0VHlwZUZvckVWVCAtIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gTExWTSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisvLy8gc3BlY2lmaWVkIEVWVC4gIEZvciBpbnRlZ2VyIHR5cGVzLCB0aGlzIHJldHVybnMgYW4gdW5zaWduZWQgdHlwZS4gIE5vdGUKKy8vLyB0aGF0IHRoaXMgd2lsbCBhYm9ydCBmb3IgdHlwZXMgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQuCitjb25zdCBUeXBlICpFVlQ6OmdldFR5cGVGb3JFVlQoTExWTUNvbnRleHQgJkNvbnRleHQpIGNvbnN0IHsKKyAgc3dpdGNoIChWLlNpbXBsZVR5KSB7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KGlzRXh0ZW5kZWQoKSAmJiAiVHlwZSBpcyBub3QgZXh0ZW5kZWQhIik7CisgICAgcmV0dXJuIExMVk1UeTsKKyAgY2FzZSBNVlQ6OmlzVm9pZDogIHJldHVybiBUeXBlOjpnZXRWb2lkVHkoQ29udGV4dCk7CisgIGNhc2UgTVZUOjppMTogICAgICByZXR1cm4gVHlwZTo6Z2V0SW50MVR5KENvbnRleHQpOworICBjYXNlIE1WVDo6aTg6ICAgICAgcmV0dXJuIFR5cGU6OmdldEludDhUeShDb250ZXh0KTsKKyAgY2FzZSBNVlQ6OmkxNjogICAgIHJldHVybiBUeXBlOjpnZXRJbnQxNlR5KENvbnRleHQpOworICBjYXNlIE1WVDo6aTMyOiAgICAgcmV0dXJuIFR5cGU6OmdldEludDMyVHkoQ29udGV4dCk7CisgIGNhc2UgTVZUOjppNjQ6ICAgICByZXR1cm4gVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KTsKKyAgY2FzZSBNVlQ6OmkxMjg6ICAgIHJldHVybiBJbnRlZ2VyVHlwZTo6Z2V0KENvbnRleHQsIDEyOCk7CisgIGNhc2UgTVZUOjpmMzI6ICAgICByZXR1cm4gVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KTsKKyAgY2FzZSBNVlQ6OmY2NDogICAgIHJldHVybiBUeXBlOjpnZXREb3VibGVUeShDb250ZXh0KTsKKyAgY2FzZSBNVlQ6OmY4MDogICAgIHJldHVybiBUeXBlOjpnZXRYODZfRlA4MFR5KENvbnRleHQpOworICBjYXNlIE1WVDo6ZjEyODogICAgcmV0dXJuIFR5cGU6OmdldEZQMTI4VHkoQ29udGV4dCk7CisgIGNhc2UgTVZUOjpwcGNmMTI4OiByZXR1cm4gVHlwZTo6Z2V0UFBDX0ZQMTI4VHkoQ29udGV4dCk7CisgIGNhc2UgTVZUOjp2Mmk4OiAgICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEludDhUeShDb250ZXh0KSwgMik7CisgIGNhc2UgTVZUOjp2NGk4OiAgICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEludDhUeShDb250ZXh0KSwgNCk7CisgIGNhc2UgTVZUOjp2OGk4OiAgICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEludDhUeShDb250ZXh0KSwgOCk7CisgIGNhc2UgTVZUOjp2MTZpODogICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEludDhUeShDb250ZXh0KSwgMTYpOworICBjYXNlIE1WVDo6djMyaTg6ICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChUeXBlOjpnZXRJbnQ4VHkoQ29udGV4dCksIDMyKTsKKyAgY2FzZSBNVlQ6OnYyaTE2OiAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoVHlwZTo6Z2V0SW50MTZUeShDb250ZXh0KSwgMik7CisgIGNhc2UgTVZUOjp2NGkxNjogICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEludDE2VHkoQ29udGV4dCksIDQpOworICBjYXNlIE1WVDo6djhpMTY6ICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChUeXBlOjpnZXRJbnQxNlR5KENvbnRleHQpLCA4KTsKKyAgY2FzZSBNVlQ6OnYxNmkxNjogIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoVHlwZTo6Z2V0SW50MTZUeShDb250ZXh0KSwgMTYpOworICBjYXNlIE1WVDo6djJpMzI6ICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAyKTsKKyAgY2FzZSBNVlQ6OnY0aTMyOiAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgNCk7CisgIGNhc2UgTVZUOjp2OGkzMjogICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIDgpOworICBjYXNlIE1WVDo6djFpNjQ6ICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCAxKTsKKyAgY2FzZSBNVlQ6OnYyaTY0OiAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgMik7CisgIGNhc2UgTVZUOjp2NGk2NDogICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEludDY0VHkoQ29udGV4dCksIDQpOworICBjYXNlIE1WVDo6djhpNjQ6ICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCA4KTsKKyAgY2FzZSBNVlQ6OnYyZjMyOiAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KSwgMik7CisgIGNhc2UgTVZUOjp2NGYzMjogICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEZsb2F0VHkoQ29udGV4dCksIDQpOworICBjYXNlIE1WVDo6djhmMzI6ICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChUeXBlOjpnZXRGbG9hdFR5KENvbnRleHQpLCA4KTsKKyAgY2FzZSBNVlQ6OnYyZjY0OiAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoQ29udGV4dCksIDIpOworICBjYXNlIE1WVDo6djRmNjQ6ICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChUeXBlOjpnZXREb3VibGVUeShDb250ZXh0KSwgNCk7IAorICBjYXNlIE1WVDo6TWV0YWRhdGE6IHJldHVybiBUeXBlOjpnZXRNZXRhZGF0YVR5KENvbnRleHQpOworIH0KK30KKworLy8vIGdldEVWVCAtIFJldHVybiB0aGUgdmFsdWUgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gIFRoaXMKKy8vLyByZXR1cm5zIGFsbCBwb2ludGVycyBhcyBNVlQ6OmlQVFIuICBJZiBIYW5kbGVVbmtub3duIGlzIHRydWUsIHVua25vd24gdHlwZXMKKy8vLyBhcmUgcmV0dXJuZWQgYXMgT3RoZXIsIG90aGVyd2lzZSB0aGV5IGFyZSBpbnZhbGlkLgorRVZUIEVWVDo6Z2V0RVZUKGNvbnN0IFR5cGUgKlR5LCBib29sIEhhbmRsZVVua25vd24peworICBzd2l0Y2ggKFR5LT5nZXRUeXBlSUQoKSkgeworICBkZWZhdWx0OgorICAgIGlmIChIYW5kbGVVbmtub3duKSByZXR1cm4gTVZUKE1WVDo6T3RoZXIpOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdHlwZSEiKTsKKyAgICByZXR1cm4gTVZUOjppc1ZvaWQ7CisgIGNhc2UgVHlwZTo6Vm9pZFR5SUQ6CisgICAgcmV0dXJuIE1WVDo6aXNWb2lkOworICBjYXNlIFR5cGU6OkludGVnZXJUeUlEOgorICAgIHJldHVybiBnZXRJbnRlZ2VyVlQoVHktPmdldENvbnRleHQoKSwgY2FzdDxJbnRlZ2VyVHlwZT4oVHkpLT5nZXRCaXRXaWR0aCgpKTsKKyAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6ICAgICByZXR1cm4gTVZUKE1WVDo6ZjMyKTsKKyAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOiAgICByZXR1cm4gTVZUKE1WVDo6ZjY0KTsKKyAgY2FzZSBUeXBlOjpYODZfRlA4MFR5SUQ6ICByZXR1cm4gTVZUKE1WVDo6ZjgwKTsKKyAgY2FzZSBUeXBlOjpGUDEyOFR5SUQ6ICAgICByZXR1cm4gTVZUKE1WVDo6ZjEyOCk7CisgIGNhc2UgVHlwZTo6UFBDX0ZQMTI4VHlJRDogcmV0dXJuIE1WVChNVlQ6OnBwY2YxMjgpOworICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOiAgIHJldHVybiBNVlQoTVZUOjppUFRSKTsKKyAgY2FzZSBUeXBlOjpWZWN0b3JUeUlEOiB7CisgICAgY29uc3QgVmVjdG9yVHlwZSAqVlR5ID0gY2FzdDxWZWN0b3JUeXBlPihUeSk7CisgICAgcmV0dXJuIGdldFZlY3RvclZUKFR5LT5nZXRDb250ZXh0KCksIGdldEVWVChWVHktPmdldEVsZW1lbnRUeXBlKCksIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9EU0FjbGVhbi5weSBiL3NyYy9MTFZNL3V0aWxzL0RTQWNsZWFuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDMzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9EU0FjbGVhbi5weQpAQCAtMCwwICsxLDMyIEBACisjISAvdXNyL2Jpbi9weXRob24KKworI2NoYW5nZWxvZzogCisjMTAvMTMvMjAwNWI6IHJlcGxhY2VkIHRoZSAjIGluIHRtcCguIyopKiB3aXRoIGFscGhhbnVtZXJpYyBhbmQgXywgdGhpcyB3aWxsIHRoZW4gcmVtb3ZlCisjbm9kZXMgc3VjaCBhcyAldG1wLjEuaSBhbmQgJXRtcC5faS4zCisjMTAvMTMvMjAwNTogZXhudGVuZGVkIHRvIHJlbW92ZSB2YXJpYWJsZXMgb2YgdGhlIGZvcm0gJXRtcCguIykqIHJhdGhlciB0aGFuIGp1c3QgCisjJXRtcC4jLCBpLmUuIGl0IG5vdyB3aWxsIHJlbW92ZSAldG1wLjEyLjMuMTUgZXRjLCBhZGRpdGlvbmFsbHkgZml4ZWQgYSBzcGVsbGluZyBlcnJvciBpbgorI3RoZSBjb21tZW50cworIzEwLzEyLzIwMDU6IG5vdyBpdCBvbmx5IHJlbW92ZXMgbm9kZXMgYW5kIGVkZ2VzIGZvciB3aGljaCB0aGUgbGFiZWwgaXMgJXRtcC4jIHJhdGhlcgorI3RoYW4gcmVtb3ZpbmcgYWxsIGxpbmVzIGZvciB3aGljaCB0aGUgbGFibGUgQ09OVEFJTlMgJXRtcC4jCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2lmKCBsZW4oc3lzLmFyZ3YpIDwgMyApOgorCXByaW50ICd1c2FnZSBpczogLi9EU0FjbGVhbiA8ZG90X2ZpbGVfdG9fYmVfY2xlYW5lZD4gPG91dF9wdXRfZmlsZT4nCisJc3lzLmV4aXQoMSkKKyNnZXQgYSBmaWxlIG9iamVjdAoraW5wdXQgPSBvcGVuKHN5cy5hcmd2WzFdLCAncicpCitvdXRwdXQgPSBvcGVuKHN5cy5hcmd2WzJdLCAndycpCisjd2UnbGwgZ2V0IHRoaXMgb25lIGxpbmUgYXQgYSB0aW1lLi4ud2hpbGUgd2UgY291bGQganVzdCBwdXQgdGhlIHdob2xlIHRoaW5nIGluIGEgc3RyaW5nCisjaXQgd291bGQga2lsbCBvbGQgY29tcHV0ZXJzCitidWZmZXIgPSBpbnB1dC5yZWFkbGluZSgpCit3aGlsZSBidWZmZXIgIT0gJyc6CisJaWYgcmUuY29tcGlsZSgibGFiZWwoXHMqKT0oXHMqKVwiXHMldG1wKC5cdyopKihccyopXCIiKS5zZWFyY2goYnVmZmVyKToKKwkJI3NraXAgbmV4dCBsaW5lLCB3cml0ZSBuZWl0aGVyIHRoaXMgbGluZSBub3IgdGhlIG5leHQKKwkJYnVmZmVyID0gaW5wdXQucmVhZGxpbmUoKQorCWVsc2U6CisJCSN0aGlzIGlzbid0IGEgdG1wIE5vZGUsIHdlIGNhbiB3cml0ZSBpdAorCQlvdXRwdXQud3JpdGUoYnVmZmVyKQorCSNwcmVwYXJlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KKwlidWZmZXIgPSBpbnB1dC5yZWFkbGluZSgpCitpbnB1dC5jbG9zZSgpCitvdXRwdXQuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvRFNBZXh0cmFjdC5weSBiL3NyYy9MTFZNL3V0aWxzL0RTQWV4dHJhY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0ZTk0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL0RTQWV4dHJhY3QucHkKQEAgLTAsMCArMSwxMTEgQEAKKyMhIC91c3IvYmluL3B5dGhvbgorCisjdGhpcyBpcyBhIHNjcmlwdCB0byBleHRyYWN0IGdpdmVuIG5hbWVkIG5vZGVzIGZyb20gYSBkb3QgZmlsZSwgd2l0aAorI3RoZSBhc3NvY2lhdGVkIGVkZ2VzLiAgQW4gZWRnZSBpcyBrZXB0IGlmZiBmb3IgZWRnZSB4IC0+IHkKKyMgeCBhbmQgeSBhcmUgYm90aCBub2RlcyBzcGVjaWZpZWQgdG8gYmUga2VwdC4KKworI2tub3duIGlzc3VlczogaWYgYSBsaW5lIGNvbnRhaW5zICctPicgYW5kIGlzIG5vdCBhbiBlZGdlIGxpbmUKKyNwcm9ibGVtcyB3aWxsIG9jY3VyLiAgSWYgbm9kZSBsYWJlbHMgZG8gbm90IGJlZ2luIHdpdGgKKyNOb2RlIHRoaXMgYWxzbyB3aWxsIG5vdCB3b3JrLiAgU2luY2UgdGhpcyBpcyBkZXNpZ25lZCB0byB3b3JrCisjb24gRFNBIGRvdCBvdXRwdXQgYW5kIG5vdCBnZW5lcmFsIGRvdCBmaWxlcyB0aGlzIGlzIG9rLgorI0lmIHlvdSB3YW50IHRvIHVzZSB0aGlzIG9uIG90aGVyIGZpbGVzIHJlbmFtZSB0aGUgbm9kZSBsYWJlbHMKKyN0byBOb2RlWy4qXSB3aXRoIGEgc2NyaXB0IG9yIHNvbWV0aGluZy4gIFRoaXMgYWxzbyByZWxpZXMgb24KKyN0aGUgbGVuZ3RoIG9mIGEgbm9kZSBuYW1lIGJlaW5nIDEzIGNoYXJhY3RlcnMgKGFzIGl0IGlzIGluIGFsbAorI0RTQSBkb3Qgb3V0cHV0IGZpbGVzKQorCisjTm90ZSB0aGF0IHRoZSBuYW1lIG9mIHRoZSBub2RlIGNhbiBiZSBhbnkgc3Vic3RyaW5nIG9mIHRoZSBhY3R1YWwKKyNuYW1lIGluIHRoZSBkb3QgZmlsZS4gIFRodXMgaWYgeW91IHNheSBzcGVjaWZ5IENPTExBUFNFRAorI2FzIGEgcGFyYW1ldGVyIHRoaXMgc2NyaXB0IHdpbGwgcHVsbCBvdXQgYWxsIENPTExBUFNFRAorI25vZGVzIGluIHRoZSBmaWxlCisKKyNTcGVjaWZ5aW5nIGVzY2FwZSBjaGFyYWN0ZXJzIGluIHRoZSBuYW1lIGxpa2UgXG4gYWxzbyB3aWxsIG5vdCB3b3JrLCAKKyNhcyBQeXRob24KKyN3aWxsIG1ha2UgaXQgXFxuLCBJJ20gbm90IHJlYWxseSBzdXJlIGhvdyB0byBmaXggdGhpcworCisjY3VycmVudGx5IHRoZSBzY3JpcHQgcHJpbnRzIHRoZSBuYW1lcyBpdCBpcyBzZWFyY2hpbmcgZm9yCisjdG8gU1RET1VULCBzbyB5b3UgY2FuIGNoZWNrIHRvIHNlZSBpZiB0aGV5IGFyZSB3aGF0IHlvdSBpbnRlbmQKKworaW1wb3J0IHJlCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgc3lzCisKKworaWYgbGVuKHN5cy5hcmd2KSA8IDM6CisJcHJpbnQgJ3VzYWdlIGlzIC4vRFNBZXh0cmFjdCA8ZG90X2ZpbGVfdG9fbW9kaWZ5PiBcCisJCQk8b3V0cHV0X2ZpbGU+IFtsaXN0IG9mIG5vZGVzIHRvIGV4dHJhY3RdJworCisjb3BlbiB0aGUgaW5wdXQgZmlsZQoraW5wdXQgPSBvcGVuKHN5cy5hcmd2WzFdLCAncicpCisKKyNjb25zdHJ1Y3QgYSBzZXQgb2Ygbm9kZSBuYW1lcworbm9kZV9uYW1lX3NldCA9IHNldCgpCitmb3IgbmFtZSBpbiBzeXMuYXJndlszOl06CisJbm9kZV9uYW1lX3NldCB8PSBzZXQoW25hbWVdKQorCisjY29uc3RydWN0IGEgbGlzdCBvZiBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb25zIGZyb20gdGhlIAorI25vZGVfbmFtZV9zZXQKK3JlZ2V4cF9saXN0ID0gW10KK2ZvciBuYW1lIGluIG5vZGVfbmFtZV9zZXQ6CisJcmVnZXhwX2xpc3QuYXBwZW5kKHJlLmNvbXBpbGUobmFtZSkpCisKKyN1c2VkIHRvIHNlZSB3aGF0IGtpbmQgb2YgbGluZSB3ZSBhcmUgb24KK25vZGVleHAgPSByZS5jb21waWxlKCdOb2RlJykKKyN1c2VkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgY3VycmVudCBsaW5lIGlzIGFuIGVkZ2UgbGluZQorYXJyb3dleHAgPSByZS5jb21waWxlKCctPicpCisKK25vZGVfc2V0ID0gc2V0KCkKKworI3JlYWQgdGhlIGZpbGUgb25lIGxpbmUgYXQgYSB0aW1lCitidWZmZXIgPSBpbnB1dC5yZWFkbGluZSgpCit3aGlsZSBidWZmZXIgIT0gJyc6CisJI2ZpbHRlciBvdXQgdGhlIHVuZWNlc3NhcnkgY2hlY2tzIG9uIGFsbCB0aGUgZWRnZSBsaW5lcworCWlmIG5vdCBhcnJvd2V4cC5zZWFyY2goYnVmZmVyKToKKwkJI2NoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgbm9kZSB3ZSBhcmUgbG9va2luZyBmb3IKKwkJZm9yIHJlZ2V4cCBpbiByZWdleHBfbGlzdDoKKwkJCSNpZiB0aGlzIG5hbWUgaXMgZm9yIHRoZSBjdXJyZW50IG5vZGUsIGFkZCB0aGUgZG90IHZhcmlhYmxlIG5hbWUKKwkJCSNmb3IgdGhlIG5vZGUgKGl0IHdpbGwgYmUgTm9kZShoZXggbnVtYmVyKSkgdG8gb3VyIHNldCBvZiBub2RlcworCQkJaWYgcmVnZXhwLnNlYXJjaChidWZmZXIpOgorCQkJCW5vZGVfc2V0IHw9IHNldChbcmUuc3BsaXQoJ1xzKycsYnVmZmVyLDIpWzFdXSkKKwkJCQlicmVhaworCWJ1ZmZlciA9IGlucHV0LnJlYWRsaW5lKCkKKworCisjdGVzdCBjb2RlCisjcHJpbnQgJ1xuJworCitwcmludCBub2RlX25hbWVfc2V0CisKKyNwcmludCBub2RlX3NldAorCQorCisjb3BlbiB0aGUgb3V0cHV0IGZpbGUKK291dHB1dCA9IG9wZW4oc3lzLmFyZ3ZbMl0sICd3JykKKyNzdGFydCB0aGUgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgZmlsZQoraW5wdXQgPSBvcGVuKHN5cy5hcmd2WzFdLCAncicpCisKK2J1ZmZlciA9IGlucHV0LnJlYWRsaW5lKCkKK3doaWxlIGJ1ZmZlciAhPSAnJzoKKwkjdGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGxpbmVzIHdlIGFyZSBsb29raW5nIGZvcgorCSMxKSBub2RlIGxpbmVzLCAyKSBlZGdlIGxpbmVzIDMpIHN1cHBvcnQgbGluZXMgKGxpa2UgcGFnZSBzaXplLCBldGMpCisJCisJI2lzIHRoaXMgYW4gZWRnZSBsaW5lPworCSNub3RlIHRoYXQgdGhpcyBpcyBubyBjb21wbGV0ZWx5IHJvYnVzdCwgaWYgYSBub25lIGVkZ2UgbGluZQorCSNmb3Igc29tZSByZWFzb24gY29udGFpbnMgLT4gaXQgd2lsbCBiZSBtaXNzaWRlbnRpZmllZAorCSNoYW5kIGVkaXQgdGhlIGZpbGUgaWYgdGhpcyBoYXBwZW5zCisJaWYgYXJyb3dleHAuc2VhcmNoKGJ1ZmZlcik6CisJCSNjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBib3RoIG5vZGVzIGFyZSBpbiB0aGUgbm9kZSBsaXN0CisJCSNpZiB0aGV5IGFyZSBwcmludCB0aGlzIHRvIG91dHB1dAorCQlub2RlcyA9IGFycm93ZXhwLnNwbGl0KGJ1ZmZlcikKKwkJbm9kZXNbMF0gPSBzdHJpbmcuc3RyaXAobm9kZXNbMF0pCisJCW5vZGVzWzFdID0gc3RyaW5nLnN0cmlwKG5vZGVzWzFdKQorCQlpZiBub2Rlc1swXVs6MTNdIGluIG5vZGVfc2V0IGFuZCBcCisJCQkJbm9kZXNbMV1bOjEzXSBpbiBub2RlX3NldDoKKwkJCQkJb3V0cHV0LndyaXRlKGJ1ZmZlcikKKwllbGlmIG5vZGVleHAuc2VhcmNoKGJ1ZmZlcik6ICN0aGlzIGlzIGEgbm9kZSBsaW5lCisJCW5vZGUgPSByZS5zcGxpdCgnXHMrJywgYnVmZmVyLDIpWzFdCisJCWlmIG5vZGUgaW4gbm9kZV9zZXQ6CisJCQlvdXRwdXQud3JpdGUoYnVmZmVyKQorCWVsc2U6ICN0aGlzIGlzIGEgc3VwcG9ydCBsaW5lCisJCW91dHB1dC53cml0ZShidWZmZXIpCisJYnVmZmVyID0gaW5wdXQucmVhZGxpbmUoKQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9GaWxlQ2hlY2svQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS91dGlscy9GaWxlQ2hlY2svQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlZTAzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL0ZpbGVDaGVjay9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDExIEBACithZGRfZXhlY3V0YWJsZShGaWxlQ2hlY2sKKyAgRmlsZUNoZWNrLmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyhGaWxlQ2hlY2sgTExWTVN1cHBvcnQgTExWTVN5c3RlbSkKK2lmKCBNSU5HVyApCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhGaWxlQ2hlY2sgaW1hZ2VobHAgcHNhcGkpCitlbmRpZiggTUlOR1cgKQoraWYoIExMVk1fRU5BQkxFX1RIUkVBRFMgQU5EIEhBVkVfTElCUFRIUkVBRCApCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhGaWxlQ2hlY2sgcHRocmVhZCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL0ZpbGVDaGVjay9GaWxlQ2hlY2suY3BwIGIvc3JjL0xMVk0vdXRpbHMvRmlsZUNoZWNrL0ZpbGVDaGVjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjZDcxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL0ZpbGVDaGVjay9GaWxlQ2hlY2suY3BwCkBAIC0wLDAgKzEsNzMyIEBACisvLz09PS0gRmlsZUNoZWNrLmNwcCAtIENoZWNrIHRoYXQgRmlsZSdzIENvbnRlbnRzIG1hdGNoIHdoYXQgaXMgZXhwZWN0ZWQgLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEZpbGVDaGVjayBkb2VzIGEgbGluZS1ieSBsaW5lIGNoZWNrIG9mIGEgZmlsZSB0aGF0IHZhbGlkYXRlcyB3aGV0aGVyIGl0CisvLyBjb250YWlucyB0aGUgZXhwZWN0ZWQgY29udGVudC4gIFRoaXMgaXMgdXNlZnVsIGZvciByZWdyZXNzaW9uIHRlc3RzIGV0Yy4KKy8vCisvLyBUaGlzIHByb2dyYW0gZXhpdHMgd2l0aCBhbiBlcnJvciBzdGF0dXMgb2YgMiBvbiBlcnJvciwgZXhpdCBzdGF0dXMgb2YgMCBpZgorLy8gdGhlIGZpbGUgbWF0Y2hlZCB0aGUgZXhwZWN0ZWQgY29udGVudHMsIGFuZCBleGl0IHN0YXR1cyBvZiAxIGlmIGl0IGRpZCBub3QKKy8vIGNvbnRhaW4gdGhlIGV4cGVjdGVkIGNvbnRlbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ByZXR0eVN0YWNrVHJhY2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVnZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vU2lnbmFscy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PHN0ZDo6c3RyaW5nPgorQ2hlY2tGaWxlbmFtZShjbDo6UG9zaXRpb25hbCwgY2w6OmRlc2MoIjxjaGVjay1maWxlPiIpLCBjbDo6UmVxdWlyZWQpOworCitzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KK0lucHV0RmlsZW5hbWUoImlucHV0LWZpbGUiLCBjbDo6ZGVzYygiRmlsZSB0byBjaGVjayAoZGVmYXVsdHMgdG8gc3RkaW4pIiksCisgICAgICAgICAgICAgIGNsOjppbml0KCItIiksIGNsOjp2YWx1ZV9kZXNjKCJmaWxlbmFtZSIpKTsKKworc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CitDaGVja1ByZWZpeCgiY2hlY2stcHJlZml4IiwgY2w6OmluaXQoIkNIRUNLIiksCisgICAgICAgICAgICBjbDo6ZGVzYygiUHJlZml4IHRvIHVzZSBmcm9tIGNoZWNrIGZpbGUgKGRlZmF1bHRzIHRvICdDSEVDSycpIikpOworCitzdGF0aWMgY2w6Om9wdDxib29sPgorTm9DYW5vbmljYWxpemVXaGl0ZVNwYWNlKCJzdHJpY3Qtd2hpdGVzcGFjZSIsCisgICAgICAgICAgICAgIGNsOjpkZXNjKCJEbyBub3QgdHJlYXQgYWxsIGhvcml6b250YWwgd2hpdGVzcGFjZSBhcyBlcXVpdmFsZW50IikpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGF0dGVybiBIYW5kbGluZyBDb2RlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgUGF0dGVybiB7CisgIFNNTG9jIFBhdHRlcm5Mb2M7CisgIAorICAvLy8gRml4ZWRTdHIgLSBJZiBub24tZW1wdHksIHRoaXMgcGF0dGVybiBpcyBhIGZpeGVkIHN0cmluZyBtYXRjaCB3aXRoIHRoZQorICAvLy8gc3BlY2lmaWVkIGZpeGVkIHN0cmluZy4KKyAgU3RyaW5nUmVmIEZpeGVkU3RyOworICAKKyAgLy8vIFJlZ0V4IC0gSWYgbm9uLWVtcHR5LCB0aGlzIGlzIGEgcmVnZXggcGF0dGVybi4KKyAgc3RkOjpzdHJpbmcgUmVnRXhTdHI7CisgIAorICAvLy8gVmFyaWFibGVVc2VzIC0gRW50cmllcyBpbiB0aGlzIHZlY3RvciBtYXAgdG8gdXNlcyBvZiBhIHZhcmlhYmxlIGluIHRoZQorICAvLy8gcGF0dGVybiwgZS5nLiAiZm9vW1tiYXJdXWJheiIuICBJbiB0aGlzIGNhc2UsIHRoZSBSZWdFeFN0ciB3aWxsIGNvbnRhaW4KKyAgLy8vICJmb29iYXoiIGFuZCB3ZSdsbCBnZXQgYW4gZW50cnkgaW4gdGhpcyB2ZWN0b3IgdGhhdCB0ZWxscyB1cyB0byBpbnNlcnQgdGhlCisgIC8vLyB2YWx1ZSBvZiBiYXIgYXQgb2Zmc2V0IDMuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTdHJpbmdSZWYsIHVuc2lnbmVkPiA+IFZhcmlhYmxlVXNlczsKKyAgCisgIC8vLyBWYXJpYWJsZURlZnMgLSBFbnRyaWVzIGluIHRoaXMgdmVjdG9yIG1hcCB0byBkZWZpbml0aW9ucyBvZiBhIHZhcmlhYmxlIGluCisgIC8vLyB0aGUgcGF0dGVybiwgZS5nLiAiZm9vW1tiYXI6LipdXWJheiIuICBJbiB0aGlzIGNhc2UsIHRoZSBSZWdFeFN0ciB3aWxsCisgIC8vLyBjb250YWluICJmb28oLiopYmF6IiBhbmQgVmFyaWFibGVEZWZzIHdpbGwgY29udGFpbiB0aGUgcGFpciAiYmFyIiwxLiAgVGhlCisgIC8vLyBpbmRleCBpbmRpY2F0ZXMgd2hhdCBwYXJlbnRoZXNpemVkIHZhbHVlIGNhcHR1cmVzIHRoZSB2YXJpYWJsZSB2YWx1ZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQ+ID4gVmFyaWFibGVEZWZzOworICAKK3B1YmxpYzoKKyAgCisgIFBhdHRlcm4oKSB7IH0KKyAgCisgIGJvb2wgUGFyc2VQYXR0ZXJuKFN0cmluZ1JlZiBQYXR0ZXJuU3RyLCBTb3VyY2VNZ3IgJlNNKTsKKyAgCisgIC8vLyBNYXRjaCAtIE1hdGNoIHRoZSBwYXR0ZXJuIHN0cmluZyBhZ2FpbnN0IHRoZSBpbnB1dCBidWZmZXIgQnVmZmVyLiAgVGhpcworICAvLy8gcmV0dXJucyB0aGUgcG9zaXRpb24gdGhhdCBpcyBtYXRjaGVkIG9yIG5wb3MgaWYgdGhlcmUgaXMgbm8gbWF0Y2guICBJZgorICAvLy8gdGhlcmUgaXMgYSBtYXRjaCwgdGhlIHNpemUgb2YgdGhlIG1hdGNoZWQgc3RyaW5nIGlzIHJldHVybmVkIGluIE1hdGNoTGVuLgorICAvLy8KKyAgLy8vIFRoZSBWYXJpYWJsZVRhYmxlIFN0cmluZ01hcCBwcm92aWRlcyB0aGUgY3VycmVudCB2YWx1ZXMgb2YgZmlsZWNoZWNrCisgIC8vLyB2YXJpYWJsZXMgYW5kIGlzIHVwZGF0ZWQgaWYgdGhpcyBtYXRjaCBkZWZpbmVzIG5ldyB2YWx1ZXMuCisgIHNpemVfdCBNYXRjaChTdHJpbmdSZWYgQnVmZmVyLCBzaXplX3QgJk1hdGNoTGVuLAorICAgICAgICAgICAgICAgU3RyaW5nTWFwPFN0cmluZ1JlZj4gJlZhcmlhYmxlVGFibGUpIGNvbnN0OworCisgIC8vLyBQcmludEZhaWx1cmVJbmZvIC0gUHJpbnQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIGZhaWx1cmUgdG8gbWF0Y2gKKyAgLy8vIGludm9sdmluZyB0aGlzIHBhdHRlcm4uCisgIHZvaWQgUHJpbnRGYWlsdXJlSW5mbyhjb25zdCBTb3VyY2VNZ3IgJlNNLCBTdHJpbmdSZWYgQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nTWFwPFN0cmluZ1JlZj4gJlZhcmlhYmxlVGFibGUpIGNvbnN0OworCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCBBZGRGaXhlZFN0cmluZ1RvUmVnRXgoU3RyaW5nUmVmIEZpeGVkU3RyLCBzdGQ6OnN0cmluZyAmVGhlU3RyKTsKKyAgYm9vbCBBZGRSZWdFeFRvUmVnRXgoU3RyaW5nUmVmIFJlZ0V4U3RyLCB1bnNpZ25lZCAmQ3VyUGFyZW4sIFNvdXJjZU1nciAmU00pOworCisgIC8vLyBDb21wdXRlTWF0Y2hEaXN0YW5jZSAtIENvbXB1dGUgYW4gYXJiaXRyYXJ5IGVzdGltYXRlIGZvciB0aGUgcXVhbGl0eSBvZgorICAvLy8gbWF0Y2hpbmcgdGhpcyBwYXR0ZXJuIGF0IHRoZSBzdGFydCBvZiBcYXJnIEJ1ZmZlcjsgYSBkaXN0YW5jZSBvZiB6ZXJvCisgIC8vLyBzaG91bGQgY29ycmVzcG9uZCB0byBhIHBlcmZlY3QgbWF0Y2guCisgIHVuc2lnbmVkIENvbXB1dGVNYXRjaERpc3RhbmNlKFN0cmluZ1JlZiBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nTWFwPFN0cmluZ1JlZj4gJlZhcmlhYmxlVGFibGUpIGNvbnN0OworfTsKKworCitib29sIFBhdHRlcm46OlBhcnNlUGF0dGVybihTdHJpbmdSZWYgUGF0dGVyblN0ciwgU291cmNlTWdyICZTTSkgeworICBQYXR0ZXJuTG9jID0gU01Mb2M6OmdldEZyb21Qb2ludGVyKFBhdHRlcm5TdHIuZGF0YSgpKTsKKyAgCisgIC8vIElnbm9yZSB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICB3aGlsZSAoIVBhdHRlcm5TdHIuZW1wdHkoKSAmJgorICAgICAgICAgKFBhdHRlcm5TdHIuYmFjaygpID09ICcgJyB8fCBQYXR0ZXJuU3RyLmJhY2soKSA9PSAnXHQnKSkKKyAgICBQYXR0ZXJuU3RyID0gUGF0dGVyblN0ci5zdWJzdHIoMCwgUGF0dGVyblN0ci5zaXplKCktMSk7CisgIAorICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIHNvbWV0aGluZyBvbiB0aGUgbGluZS4KKyAgaWYgKFBhdHRlcm5TdHIuZW1wdHkoKSkgeworICAgIFNNLlByaW50TWVzc2FnZShQYXR0ZXJuTG9jLCAiZm91bmQgZW1wdHkgY2hlY2sgc3RyaW5nIHdpdGggcHJlZml4ICciICsKKyAgICAgICAgICAgICAgICAgICAgQ2hlY2tQcmVmaXgrIjonIiwgImVycm9yIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgZml4ZWQgc3RyaW5nLCBvciBpZiBpdCBoYXMgcmVnZXggcGllY2VzLgorICBpZiAoUGF0dGVyblN0ci5zaXplKCkgPCAyIHx8CisgICAgICAoUGF0dGVyblN0ci5maW5kKCJ7eyIpID09IFN0cmluZ1JlZjo6bnBvcyAmJgorICAgICAgIFBhdHRlcm5TdHIuZmluZCgiW1siKSA9PSBTdHJpbmdSZWY6Om5wb3MpKSB7CisgICAgRml4ZWRTdHIgPSBQYXR0ZXJuU3RyOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgLy8gUGFyZW4gdmFsdWUgIzAgaXMgZm9yIHRoZSBmdWxseSBtYXRjaGVkIHN0cmluZy4gIEFueSBuZXcgcGFyZW50aGVzaXplZAorICAvLyB2YWx1ZXMgYWRkIGZyb20gdGhlaXIuCisgIHVuc2lnbmVkIEN1clBhcmVuID0gMTsKKyAgCisgIC8vIE90aGVyd2lzZSwgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlZ2V4IHBpZWNlLiAgQnVpbGQgdXAgdGhlIHJlZ2V4IHBhdHRlcm4KKyAgLy8gYnkgZXNjYXBpbmcgc2NhcnkgY2hhcmFjdGVycyBpbiBmaXhlZCBzdHJpbmdzLCBidWlsZGluZyB1cCBvbmUgYmlnIHJlZ2V4LgorICB3aGlsZSAoIVBhdHRlcm5TdHIuZW1wdHkoKSkgeworICAgIC8vIFJlZ0V4IG1hdGNoZXMuCisgICAgaWYgKFBhdHRlcm5TdHIuc2l6ZSgpID49IDIgJiYKKyAgICAgICAgUGF0dGVyblN0clswXSA9PSAneycgJiYgUGF0dGVyblN0clsxXSA9PSAneycpIHsKKyAgICAgCisgICAgICAvLyBPdGhlcndpc2UsIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgcmVnZXggbWF0Y2guICBTY2FuIGZvciB0aGUgfX0uCisgICAgICBzaXplX3QgRW5kID0gUGF0dGVyblN0ci5maW5kKCJ9fSIpOworICAgICAgaWYgKEVuZCA9PSBTdHJpbmdSZWY6Om5wb3MpIHsKKyAgICAgICAgU00uUHJpbnRNZXNzYWdlKFNNTG9jOjpnZXRGcm9tUG9pbnRlcihQYXR0ZXJuU3RyLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgc3RhcnQgb2YgcmVnZXggc3RyaW5nIHdpdGggbm8gZW5kICd9fSciLCAiZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChBZGRSZWdFeFRvUmVnRXgoUGF0dGVyblN0ci5zdWJzdHIoMiwgRW5kLTIpLCBDdXJQYXJlbiwgU00pKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIFBhdHRlcm5TdHIgPSBQYXR0ZXJuU3RyLnN1YnN0cihFbmQrMik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gTmFtZWQgUmVnRXggbWF0Y2hlcy4gIFRoZXNlIGFyZSBvZiB0d28gZm9ybXM6IFtbZm9vOi4qXV0gd2hpY2ggbWF0Y2hlcyAuKgorICAgIC8vIChvciBzb21lIG90aGVyIHJlZ2V4KSBhbmQgYXNzaWducyBpdCB0byB0aGUgRmlsZUNoZWNrIHZhcmlhYmxlICdmb28nLiBUaGUKKyAgICAvLyBzZWNvbmQgZm9ybSBpcyBbW2Zvb11dIHdoaWNoIGlzIGEgcmVmZXJlbmNlIHRvIGZvby4gIFRoZSB2YXJpYWJsZSBuYW1lCisgICAgLy8gaXRzZWxmIG11c3QgYmUgb2YgdGhlIGZvcm0gIlthLXpBLVpfXVswLTlhLXpBLVpfXSoiLCBvdGhlcndpc2Ugd2UgcmVqZWN0CisgICAgLy8gaXQuICBUaGlzIGlzIHRvIGNhdGNoIHNvbWUgY29tbW9uIGVycm9ycy4KKyAgICBpZiAoUGF0dGVyblN0ci5zaXplKCkgPj0gMiAmJgorICAgICAgICBQYXR0ZXJuU3RyWzBdID09ICdbJyAmJiBQYXR0ZXJuU3RyWzFdID09ICdbJykgeworICAgICAgLy8gVmVyaWZ5IHRoYXQgaXQgaXMgdGVybWluYXRlZCBwcm9wZXJseS4KKyAgICAgIHNpemVfdCBFbmQgPSBQYXR0ZXJuU3RyLmZpbmQoIl1dIik7CisgICAgICBpZiAoRW5kID09IFN0cmluZ1JlZjo6bnBvcykgeworICAgICAgICBTTS5QcmludE1lc3NhZ2UoU01Mb2M6OmdldEZyb21Qb2ludGVyKFBhdHRlcm5TdHIuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG5hbWVkIHJlZ2V4IHJlZmVyZW5jZSwgbm8gXV0gZm91bmQiLCAiZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAKKyAgICAgIFN0cmluZ1JlZiBNYXRjaFN0ciA9IFBhdHRlcm5TdHIuc3Vic3RyKDIsIEVuZC0yKTsKKyAgICAgIFBhdHRlcm5TdHIgPSBQYXR0ZXJuU3RyLnN1YnN0cihFbmQrMik7CisgICAgICAKKyAgICAgIC8vIEdldCB0aGUgcmVnZXggbmFtZSAoZS5nLiAiZm9vIikuCisgICAgICBzaXplX3QgTmFtZUVuZCA9IE1hdGNoU3RyLmZpbmQoJzonKTsKKyAgICAgIFN0cmluZ1JlZiBOYW1lID0gTWF0Y2hTdHIuc3Vic3RyKDAsIE5hbWVFbmQpOworICAgICAgCisgICAgICBpZiAoTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIFNNLlByaW50TWVzc2FnZShTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoTmFtZS5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbmFtZSBpbiBuYW1lZCByZWdleDogZW1wdHkgbmFtZSIsICJlcnJvciIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5hbWUgaXMgd2VsbCBmb3JtZWQuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmFtZS5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoTmFtZVtpXSAhPSAnXycgJiYKKyAgICAgICAgICAgIChOYW1lW2ldIDwgJ2EnIHx8IE5hbWVbaV0gPiAneicpICYmCisgICAgICAgICAgICAoTmFtZVtpXSA8ICdBJyB8fCBOYW1lW2ldID4gJ1onKSAmJgorICAgICAgICAgICAgKE5hbWVbaV0gPCAnMCcgfHwgTmFtZVtpXSA+ICc5JykpIHsKKyAgICAgICAgICBTTS5QcmludE1lc3NhZ2UoU01Mb2M6OmdldEZyb21Qb2ludGVyKE5hbWUuZGF0YSgpK2kpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBuYW1lIGluIG5hbWVkIHJlZ2V4IiwgImVycm9yIik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLy8gTmFtZSBjYW4ndCBzdGFydCB3aXRoIGEgZGlnaXQuCisgICAgICBpZiAoaXNkaWdpdChOYW1lWzBdKSkgeworICAgICAgICBTTS5QcmludE1lc3NhZ2UoU01Mb2M6OmdldEZyb21Qb2ludGVyKE5hbWUuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG5hbWUgaW4gbmFtZWQgcmVnZXgiLCAiZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIEhhbmRsZSBbW2Zvb11dLgorICAgICAgaWYgKE5hbWVFbmQgPT0gU3RyaW5nUmVmOjpucG9zKSB7CisgICAgICAgIFZhcmlhYmxlVXNlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTmFtZSwgUmVnRXhTdHIuc2l6ZSgpKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICAvLyBIYW5kbGUgW1tmb286LipdXS4KKyAgICAgIFZhcmlhYmxlRGVmcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTmFtZSwgQ3VyUGFyZW4pKTsKKyAgICAgIFJlZ0V4U3RyICs9ICcoJzsKKyAgICAgICsrQ3VyUGFyZW47CisgICAgICAKKyAgICAgIGlmIChBZGRSZWdFeFRvUmVnRXgoTWF0Y2hTdHIuc3Vic3RyKE5hbWVFbmQrMSksIEN1clBhcmVuLCBTTSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBSZWdFeFN0ciArPSAnKSc7CisgICAgfQorICAgIAorICAgIC8vIEhhbmRsZSBmaXhlZCBzdHJpbmcgbWF0Y2hlcy4KKyAgICAvLyBGaW5kIHRoZSBlbmQsIHdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUgbmV4dCByZWdleC4KKyAgICBzaXplX3QgRml4ZWRNYXRjaEVuZCA9IFBhdHRlcm5TdHIuZmluZCgie3siKTsKKyAgICBGaXhlZE1hdGNoRW5kID0gc3RkOjptaW4oRml4ZWRNYXRjaEVuZCwgUGF0dGVyblN0ci5maW5kKCJbWyIpKTsKKyAgICBBZGRGaXhlZFN0cmluZ1RvUmVnRXgoUGF0dGVyblN0ci5zdWJzdHIoMCwgRml4ZWRNYXRjaEVuZCksIFJlZ0V4U3RyKTsKKyAgICBQYXR0ZXJuU3RyID0gUGF0dGVyblN0ci5zdWJzdHIoRml4ZWRNYXRjaEVuZCk7CisgICAgY29udGludWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUGF0dGVybjo6QWRkRml4ZWRTdHJpbmdUb1JlZ0V4KFN0cmluZ1JlZiBGaXhlZFN0ciwgc3RkOjpzdHJpbmcgJlRoZVN0cikgeworICAvLyBBZGQgdGhlIGNoYXJhY3RlcnMgZnJvbSBGaXhlZFN0ciB0byB0aGUgcmVnZXgsIGVzY2FwaW5nIGFzIG5lZWRlZC4gIFRoaXMKKyAgLy8gYXZvaWRzICJsZWFuaW5nIHRvb3RocGlja3MiIGluIGNvbW1vbiBwYXR0ZXJucy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZpeGVkU3RyLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBzd2l0Y2ggKEZpeGVkU3RyW2ldKSB7CisgICAgLy8gVGhlc2UgYXJlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgbWF0Y2hlZCBpbiAicF9lcmVfZXhwIi4KKyAgICBjYXNlICcoJzoKKyAgICBjYXNlICcpJzoKKyAgICBjYXNlICdeJzoKKyAgICBjYXNlICckJzoKKyAgICBjYXNlICd8JzoKKyAgICBjYXNlICcqJzoKKyAgICBjYXNlICcrJzoKKyAgICBjYXNlICc/JzoKKyAgICBjYXNlICcuJzoKKyAgICBjYXNlICdbJzoKKyAgICBjYXNlICdcXCc6CisgICAgY2FzZSAneyc6CisgICAgICBUaGVTdHIgKz0gJ1xcJzsKKyAgICAgIC8vIEZBTEwgVEhST1VHSC4KKyAgICBkZWZhdWx0OgorICAgICAgVGhlU3RyICs9IEZpeGVkU3RyW2ldOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK2Jvb2wgUGF0dGVybjo6QWRkUmVnRXhUb1JlZ0V4KFN0cmluZ1JlZiBSZWdleFN0ciwgdW5zaWduZWQgJkN1clBhcmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTWdyICZTTSkgeworICBSZWdleCBSKFJlZ2V4U3RyKTsKKyAgc3RkOjpzdHJpbmcgRXJyb3I7CisgIGlmICghUi5pc1ZhbGlkKEVycm9yKSkgeworICAgIFNNLlByaW50TWVzc2FnZShTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoUmVnZXhTdHIuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmVnZXg6ICIgKyBFcnJvciwgImVycm9yIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIFJlZ0V4U3RyICs9IFJlZ2V4U3RyLnN0cigpOworICBDdXJQYXJlbiArPSBSLmdldE51bU1hdGNoZXMoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gTWF0Y2ggLSBNYXRjaCB0aGUgcGF0dGVybiBzdHJpbmcgYWdhaW5zdCB0aGUgaW5wdXQgYnVmZmVyIEJ1ZmZlci4gIFRoaXMKKy8vLyByZXR1cm5zIHRoZSBwb3NpdGlvbiB0aGF0IGlzIG1hdGNoZWQgb3IgbnBvcyBpZiB0aGVyZSBpcyBubyBtYXRjaC4gIElmCisvLy8gdGhlcmUgaXMgYSBtYXRjaCwgdGhlIHNpemUgb2YgdGhlIG1hdGNoZWQgc3RyaW5nIGlzIHJldHVybmVkIGluIE1hdGNoTGVuLgorc2l6ZV90IFBhdHRlcm46Ok1hdGNoKFN0cmluZ1JlZiBCdWZmZXIsIHNpemVfdCAmTWF0Y2hMZW4sCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTWFwPFN0cmluZ1JlZj4gJlZhcmlhYmxlVGFibGUpIGNvbnN0IHsKKyAgLy8gSWYgdGhpcyBpcyBhIGZpeGVkIHN0cmluZyBwYXR0ZXJuLCBqdXN0IG1hdGNoIGl0IG5vdy4KKyAgaWYgKCFGaXhlZFN0ci5lbXB0eSgpKSB7CisgICAgTWF0Y2hMZW4gPSBGaXhlZFN0ci5zaXplKCk7CisgICAgcmV0dXJuIEJ1ZmZlci5maW5kKEZpeGVkU3RyKTsKKyAgfQorCisgIC8vIFJlZ2V4IG1hdGNoLgorICAKKyAgLy8gSWYgdGhlcmUgYXJlIHZhcmlhYmxlIHVzZXMsIHdlIG5lZWQgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHN0cmluZyB3aXRoIHRoZQorICAvLyBhY3R1YWwgdmFsdWUuCisgIFN0cmluZ1JlZiBSZWdFeFRvTWF0Y2ggPSBSZWdFeFN0cjsKKyAgc3RkOjpzdHJpbmcgVG1wU3RyOworICBpZiAoIVZhcmlhYmxlVXNlcy5lbXB0eSgpKSB7CisgICAgVG1wU3RyID0gUmVnRXhTdHI7CisgICAgCisgICAgdW5zaWduZWQgSW5zZXJ0T2Zmc2V0ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVmFyaWFibGVVc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFN0cmluZ01hcDxTdHJpbmdSZWY+OjppdGVyYXRvciBpdCA9CisgICAgICAgIFZhcmlhYmxlVGFibGUuZmluZChWYXJpYWJsZVVzZXNbaV0uZmlyc3QpOworICAgICAgLy8gSWYgdGhlIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgcmV0dXJuIGFuIGVycm9yLgorICAgICAgaWYgKGl0ID09IFZhcmlhYmxlVGFibGUuZW5kKCkpCisgICAgICAgIHJldHVybiBTdHJpbmdSZWY6Om5wb3M7CisKKyAgICAgIC8vIExvb2sgdXAgdGhlIHZhbHVlIGFuZCBlc2NhcGUgaXQgc28gdGhhdCB3ZSBjYW4gcGxvcCBpdCBpbnRvIHRoZSByZWdleC4KKyAgICAgIHN0ZDo6c3RyaW5nIFZhbHVlOworICAgICAgQWRkRml4ZWRTdHJpbmdUb1JlZ0V4KGl0LT5zZWNvbmQsIFZhbHVlKTsKKyAgICAgIAorICAgICAgLy8gUGxvcCBpdCBpbnRvIHRoZSByZWdleCBhdCB0aGUgYWRqdXN0ZWQgb2Zmc2V0LgorICAgICAgVG1wU3RyLmluc2VydChUbXBTdHIuYmVnaW4oKStWYXJpYWJsZVVzZXNbaV0uc2Vjb25kK0luc2VydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUuYmVnaW4oKSwgVmFsdWUuZW5kKCkpOworICAgICAgSW5zZXJ0T2Zmc2V0ICs9IFZhbHVlLnNpemUoKTsKKyAgICB9CisgICAgCisgICAgLy8gTWF0Y2ggdGhlIG5ld2x5IGNvbnN0cnVjdGVkIHJlZ2V4LgorICAgIFJlZ0V4VG9NYXRjaCA9IFRtcFN0cjsKKyAgfQorICAKKyAgCisgIFNtYWxsVmVjdG9yPFN0cmluZ1JlZiwgND4gTWF0Y2hJbmZvOworICBpZiAoIVJlZ2V4KFJlZ0V4VG9NYXRjaCwgUmVnZXg6Ok5ld2xpbmUpLm1hdGNoKEJ1ZmZlciwgJk1hdGNoSW5mbykpCisgICAgcmV0dXJuIFN0cmluZ1JlZjo6bnBvczsKKyAgCisgIC8vIFN1Y2Nlc3NmdWwgcmVnZXggbWF0Y2guCisgIGFzc2VydCghTWF0Y2hJbmZvLmVtcHR5KCkgJiYgIkRpZG4ndCBnZXQgYW55IG1hdGNoIik7CisgIFN0cmluZ1JlZiBGdWxsTWF0Y2ggPSBNYXRjaEluZm9bMF07CisgIAorICAvLyBJZiB0aGlzIGRlZmluZXMgYW55IHZhcmlhYmxlcywgcmVtZW1iZXIgdGhlaXIgdmFsdWVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVmFyaWFibGVEZWZzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBhc3NlcnQoVmFyaWFibGVEZWZzW2ldLnNlY29uZCA8IE1hdGNoSW5mby5zaXplKCkgJiYKKyAgICAgICAgICAgIkludGVybmFsIHBhcmVuIGVycm9yIik7CisgICAgVmFyaWFibGVUYWJsZVtWYXJpYWJsZURlZnNbaV0uZmlyc3RdID0gTWF0Y2hJbmZvW1ZhcmlhYmxlRGVmc1tpXS5zZWNvbmRdOworICB9CisgIAorICBNYXRjaExlbiA9IEZ1bGxNYXRjaC5zaXplKCk7CisgIHJldHVybiBGdWxsTWF0Y2guZGF0YSgpLUJ1ZmZlci5kYXRhKCk7Cit9CisKK3Vuc2lnbmVkIFBhdHRlcm46OkNvbXB1dGVNYXRjaERpc3RhbmNlKFN0cmluZ1JlZiBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdNYXA8U3RyaW5nUmVmPiAmVmFyaWFibGVUYWJsZSkgY29uc3QgeworICAvLyBKdXN0IGNvbXB1dGUgdGhlIG51bWJlciBvZiBtYXRjaGluZyBjaGFyYWN0ZXJzLiBGb3IgcmVndWxhciBleHByZXNzaW9ucywgd2UKKyAgLy8ganVzdCBjb21wYXJlIGFnYWluc3QgdGhlIHJlZ2V4IGl0c2VsZiBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisgIC8vCisgIC8vIEZJWE1FOiBPbmUgZWFzeSBpbXByb3ZlbWVudCBoZXJlIGlzIGhhdmUgdGhlIHJlZ2V4IGxpYiBnZW5lcmF0ZSBhIHNpbmdsZQorICAvLyBleGFtcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBtYXRjaGVzLCBhbmQgdXNlIHRoYXQgYXMgdGhlIGV4YW1wbGUKKyAgLy8gc3RyaW5nLgorICBTdHJpbmdSZWYgRXhhbXBsZVN0cmluZyhGaXhlZFN0cik7CisgIGlmIChFeGFtcGxlU3RyaW5nLmVtcHR5KCkpCisgICAgRXhhbXBsZVN0cmluZyA9IFJlZ0V4U3RyOworCisgIC8vIE9ubHkgY29tcGFyZSB1cCB0byB0aGUgZmlyc3QgbGluZSBpbiB0aGUgYnVmZmVyLCBvciB0aGUgc3RyaW5nIHNpemUuCisgIFN0cmluZ1JlZiBCdWZmZXJQcmVmaXggPSBCdWZmZXIuc3Vic3RyKDAsIEV4YW1wbGVTdHJpbmcuc2l6ZSgpKTsKKyAgQnVmZmVyUHJlZml4ID0gQnVmZmVyUHJlZml4LnNwbGl0KCdcbicpLmZpcnN0OworICByZXR1cm4gQnVmZmVyUHJlZml4LmVkaXRfZGlzdGFuY2UoRXhhbXBsZVN0cmluZyk7Cit9CisKK3ZvaWQgUGF0dGVybjo6UHJpbnRGYWlsdXJlSW5mbyhjb25zdCBTb3VyY2VNZ3IgJlNNLCBTdHJpbmdSZWYgQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ01hcDxTdHJpbmdSZWY+ICZWYXJpYWJsZVRhYmxlKSBjb25zdHsKKyAgLy8gSWYgdGhpcyB3YXMgYSByZWd1bGFyIGV4cHJlc3Npb24gdXNpbmcgdmFyaWFibGVzLCBwcmludCB0aGUgY3VycmVudAorICAvLyB2YXJpYWJsZSB2YWx1ZXMuCisgIGlmICghVmFyaWFibGVVc2VzLmVtcHR5KCkpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVmFyaWFibGVVc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFN0cmluZ1JlZiBWYXIgPSBWYXJpYWJsZVVzZXNbaV0uZmlyc3Q7CisgICAgICBTdHJpbmdNYXA8U3RyaW5nUmVmPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBWYXJpYWJsZVRhYmxlLmZpbmQoVmFyKTsKKyAgICAgIFNtYWxsU3RyaW5nPDI1Nj4gTXNnOworICAgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhNc2cpOworCisgICAgICAvLyBDaGVjayBmb3IgdW5kZWZpbmVkIHZhcmlhYmxlIHJlZmVyZW5jZXMuCisgICAgICBpZiAoaXQgPT0gVmFyaWFibGVUYWJsZS5lbmQoKSkgeworICAgICAgICBPUyA8PCAidXNlcyB1bmRlZmluZWQgdmFyaWFibGUgXCIiOworICAgICAgICBPUy53cml0ZV9lc2NhcGVkKFZhcikgPDwgIlwiIjs7CisgICAgICB9IGVsc2UgeworICAgICAgICBPUyA8PCAid2l0aCB2YXJpYWJsZSBcIiI7CisgICAgICAgIE9TLndyaXRlX2VzY2FwZWQoVmFyKSA8PCAiXCIgZXF1YWwgdG8gXCIiOworICAgICAgICBPUy53cml0ZV9lc2NhcGVkKGl0LT5zZWNvbmQpIDw8ICJcIiI7CisgICAgICB9CisKKyAgICAgIFNNLlByaW50TWVzc2FnZShTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoQnVmZmVyLmRhdGEoKSksIE9TLnN0cigpLCAibm90ZSIsCisgICAgICAgICAgICAgICAgICAgICAgLypTaG93TGluZT0qL2ZhbHNlKTsKKyAgICB9CisgIH0KKworICAvLyBBdHRlbXB0IHRvIGZpbmQgdGhlIGNsb3Nlc3QvYmVzdCBmdXp6eSBtYXRjaC4gIFVzdWFsbHkgYW4gZXJyb3IgaGFwcGVucworICAvLyBiZWNhdXNlIHNvbWUgc3RyaW5nIGluIHRoZSBvdXRwdXQgZGlkbid0IGV4YWN0bHkgbWF0Y2guIEluIHRoZXNlIGNhc2VzLCB3ZQorICAvLyB3b3VsZCBsaWtlIHRvIHNob3cgdGhlIHVzZXIgYSBiZXN0IGd1ZXNzIGF0IHdoYXQgInNob3VsZCBoYXZlIiBtYXRjaGVkLCB0bworICAvLyBzYXZlIHRoZW0gaGF2aW5nIHRvIGFjdHVhbGx5IGNoZWNrIHRoZSBpbnB1dCBtYW51YWxseS4KKyAgc2l6ZV90IE51bUxpbmVzRm9yd2FyZCA9IDA7CisgIHNpemVfdCBCZXN0ID0gU3RyaW5nUmVmOjpucG9zOworICBkb3VibGUgQmVzdFF1YWxpdHkgPSAwOworCisgIC8vIFVzZSBhbiBhcmJpdHJhcnkgNGsgbGltaXQgb24gaG93IGZhciB3ZSB3aWxsIHNlYXJjaC4KKyAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBzdGQ6Om1pbihzaXplX3QoNDA5NiksIEJ1ZmZlci5zaXplKCkpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChCdWZmZXJbaV0gPT0gJ1xuJykKKyAgICAgICsrTnVtTGluZXNGb3J3YXJkOworCisgICAgLy8gUGF0dGVybnMgaGF2ZSBsZWFkaW5nIHdoaXRlc3BhY2Ugc3RyaXBwZWQsIHNvIHNraXAgd2hpdGVzcGFjZSB3aGVuCisgICAgLy8gbG9va2luZyBmb3Igc29tZXRoaW5nIHdoaWNoIGxvb2tzIGxpa2UgYSBwYXR0ZXJuLgorICAgIGlmIChCdWZmZXJbaV0gPT0gJyAnIHx8IEJ1ZmZlcltpXSA9PSAnXHQnKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBDb21wdXRlIHRoZSAicXVhbGl0eSIgb2YgdGhpcyBtYXRjaCBhcyBhbiBhcmJpdHJhcnkgY29tYmluYXRpb24gb2YgdGhlCisgICAgLy8gbWF0Y2ggZGlzdGFuY2UgYW5kIHRoZSBudW1iZXIgb2YgbGluZXMgc2tpcHBlZCB0byBnZXQgdG8gdGhpcyBtYXRjaC4KKyAgICB1bnNpZ25lZCBEaXN0YW5jZSA9IENvbXB1dGVNYXRjaERpc3RhbmNlKEJ1ZmZlci5zdWJzdHIoaSksIFZhcmlhYmxlVGFibGUpOworICAgIGRvdWJsZSBRdWFsaXR5ID0gRGlzdGFuY2UgKyAoTnVtTGluZXNGb3J3YXJkIC8gMTAwLik7CisKKyAgICBpZiAoUXVhbGl0eSA8IEJlc3RRdWFsaXR5IHx8IEJlc3QgPT0gU3RyaW5nUmVmOjpucG9zKSB7CisgICAgICBCZXN0ID0gaTsKKyAgICAgIEJlc3RRdWFsaXR5ID0gUXVhbGl0eTsKKyAgICB9CisgIH0KKworICAvLyBQcmludCB0aGUgInBvc3NpYmxlIGludGVuZGVkIG1hdGNoIGhlcmUiIGxpbmUgaWYgd2UgZm91bmQgc29tZXRoaW5nCisgIC8vIHJlYXNvbmFibGUgYW5kIG5vdCBlcXVhbCB0byB3aGF0IHdlIHNob3dlZCBpbiB0aGUgInNjYW5uaW5nIGZyb20gaGVyZSIKKyAgLy8gbGluZS4KKyAgaWYgKEJlc3QgJiYgQmVzdCAhPSBTdHJpbmdSZWY6Om5wb3MgJiYgQmVzdFF1YWxpdHkgPCA1MCkgeworICAgICAgU00uUHJpbnRNZXNzYWdlKFNNTG9jOjpnZXRGcm9tUG9pbnRlcihCdWZmZXIuZGF0YSgpICsgQmVzdCksCisgICAgICAgICAgICAgICAgICAgICAgInBvc3NpYmxlIGludGVuZGVkIG1hdGNoIGhlcmUiLCAibm90ZSIpOworCisgICAgLy8gRklYTUU6IElmIHdlIHdhbnRlZCB0byBiZSByZWFsbHkgZnJpZW5kbHkgd2Ugd291bGQgc2hvdyB3aHkgdGhlIG1hdGNoCisgICAgLy8gZmFpbGVkLCBhcyBpdCBjYW4gYmUgaGFyZCB0byBzcG90IHNpbXBsZSBvbmUgY2hhcmFjdGVyIGRpZmZlcmVuY2VzLgorICB9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDaGVjayBTdHJpbmdzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIENoZWNrU3RyaW5nIC0gVGhpcyBpcyBhIGNoZWNrIHRoYXQgd2UgZm91bmQgaW4gdGhlIGlucHV0IGZpbGUuCitzdHJ1Y3QgQ2hlY2tTdHJpbmcgeworICAvLy8gUGF0IC0gVGhlIHBhdHRlcm4gdG8gbWF0Y2guCisgIFBhdHRlcm4gUGF0OworICAKKyAgLy8vIExvYyAtIFRoZSBsb2NhdGlvbiBpbiB0aGUgbWF0Y2ggZmlsZSB0aGF0IHRoZSBjaGVjayBzdHJpbmcgd2FzIHNwZWNpZmllZC4KKyAgU01Mb2MgTG9jOworICAKKyAgLy8vIElzQ2hlY2tOZXh0IC0gVGhpcyBpcyB0cnVlIGlmIHRoaXMgaXMgYSBDSEVDSy1ORVhUOiBkaXJlY3RpdmUgKGFzIG9wcG9zZWQKKyAgLy8vIHRvIGEgQ0hFQ0s6IGRpcmVjdGl2ZS4KKyAgYm9vbCBJc0NoZWNrTmV4dDsKKyAgCisgIC8vLyBOb3RTdHJpbmdzIC0gVGhlc2UgYXJlIGFsbCBvZiB0aGUgc3RyaW5ncyB0aGF0IGFyZSBkaXNhbGxvd2VkIGZyb20KKyAgLy8vIG9jY3VycmluZyBiZXR3ZWVuIHRoaXMgbWF0Y2ggc3RyaW5nIGFuZCB0aGUgcHJldmlvdXMgb25lIChvciBzdGFydCBvZgorICAvLy8gZmlsZSkuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTTUxvYywgUGF0dGVybj4gPiBOb3RTdHJpbmdzOworICAKKyAgQ2hlY2tTdHJpbmcoY29uc3QgUGF0dGVybiAmUCwgU01Mb2MgTCwgYm9vbCBpc0NoZWNrTmV4dCkKKyAgICA6IFBhdChQKSwgTG9jKEwpLCBJc0NoZWNrTmV4dChpc0NoZWNrTmV4dCkge30KK307CisKKy8vLyBDYW5vbmljYWxpemVJbnB1dEZpbGUgLSBSZW1vdmUgZHVwbGljYXRlIGhvcml6b250YWwgc3BhY2UgZnJvbSB0aGUgc3BlY2lmaWVkCisvLy8gbWVtb3J5IGJ1ZmZlciwgZnJlZSBpdCwgYW5kIHJldHVybiBhIG5ldyBvbmUuCitzdGF0aWMgTWVtb3J5QnVmZmVyICpDYW5vbmljYWxpemVJbnB1dEZpbGUoTWVtb3J5QnVmZmVyICpNQikgeworICBTbWFsbFN0cmluZzwxMjg+IE5ld0ZpbGU7CisgIE5ld0ZpbGUucmVzZXJ2ZShNQi0+Z2V0QnVmZmVyU2l6ZSgpKTsKKyAgCisgIGZvciAoY29uc3QgY2hhciAqUHRyID0gTUItPmdldEJ1ZmZlclN0YXJ0KCksICpFbmQgPSBNQi0+Z2V0QnVmZmVyRW5kKCk7CisgICAgICAgUHRyICE9IEVuZDsgKytQdHIpIHsKKyAgICAvLyBJZiBDIGlzIG5vdCBhIGhvcml6b250YWwgd2hpdGVzcGFjZSwgc2tpcCBpdC4KKyAgICBpZiAoKlB0ciAhPSAnICcgJiYgKlB0ciAhPSAnXHQnKSB7CisgICAgICBOZXdGaWxlLnB1c2hfYmFjaygqUHRyKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIGFkZCBvbmUgc3BhY2UgYW5kIGFkdmFuY2Ugb3ZlciBuZWlnaGJvcmluZyBzcGFjZS4KKyAgICBOZXdGaWxlLnB1c2hfYmFjaygnICcpOworICAgIHdoaWxlIChQdHIrMSAhPSBFbmQgJiYKKyAgICAgICAgICAgKFB0clsxXSA9PSAnICcgfHwgUHRyWzFdID09ICdcdCcpKQorICAgICAgKytQdHI7CisgIH0KKyAgCisgIC8vIEZyZWUgdGhlIG9sZCBidWZmZXIgYW5kIHJldHVybiBhIG5ldyBvbmUuCisgIE1lbW9yeUJ1ZmZlciAqTUIyID0KKyAgICBNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlckNvcHkoTmV3RmlsZS5zdHIoKSwgTUItPmdldEJ1ZmZlcklkZW50aWZpZXIoKSk7CisgIAorICBkZWxldGUgTUI7CisgIHJldHVybiBNQjI7Cit9CisKKworLy8vIFJlYWRDaGVja0ZpbGUgLSBSZWFkIHRoZSBjaGVjayBmaWxlLCB3aGljaCBzcGVjaWZpZXMgdGhlIHNlcXVlbmNlIG9mCisvLy8gZXhwZWN0ZWQgc3RyaW5ncy4gIFRoZSBzdHJpbmdzIGFyZSBhZGRlZCB0byB0aGUgQ2hlY2tTdHJpbmdzIHZlY3Rvci4KK3N0YXRpYyBib29sIFJlYWRDaGVja0ZpbGUoU291cmNlTWdyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2hlY2tTdHJpbmc+ICZDaGVja1N0cmluZ3MpIHsKKyAgLy8gT3BlbiB0aGUgY2hlY2sgZmlsZSwgYW5kIHRlbGwgU291cmNlTWdyIGFib3V0IGl0LgorICBzdGQ6OnN0cmluZyBFcnJvclN0cjsKKyAgTWVtb3J5QnVmZmVyICpGID0KKyAgICBNZW1vcnlCdWZmZXI6OmdldEZpbGVPclNURElOKENoZWNrRmlsZW5hbWUuY19zdHIoKSwgJkVycm9yU3RyKTsKKyAgaWYgKEYgPT0gMCkgeworICAgIGVycnMoKSA8PCAiQ291bGQgbm90IG9wZW4gY2hlY2sgZmlsZSAnIiA8PCBDaGVja0ZpbGVuYW1lIDw8ICInOiAiIAorICAgICAgICAgICA8PCBFcnJvclN0ciA8PCAnXG4nOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICAvLyBJZiB3ZSB3YW50IHRvIGNhbm9uaWNhbGl6ZSB3aGl0ZXNwYWNlLCBzdHJpcCBleGNlc3Mgd2hpdGVzcGFjZSBmcm9tIHRoZQorICAvLyBidWZmZXIgY29udGFpbmluZyB0aGUgQ0hFQ0sgbGluZXMuCisgIGlmICghTm9DYW5vbmljYWxpemVXaGl0ZVNwYWNlKQorICAgIEYgPSBDYW5vbmljYWxpemVJbnB1dEZpbGUoRik7CisgIAorICBTTS5BZGROZXdTb3VyY2VCdWZmZXIoRiwgU01Mb2MoKSk7CisKKyAgLy8gRmluZCBhbGwgaW5zdGFuY2VzIG9mIENoZWNrUHJlZml4IGZvbGxvd2VkIGJ5IDogaW4gdGhlIGZpbGUuCisgIFN0cmluZ1JlZiBCdWZmZXIgPSBGLT5nZXRCdWZmZXIoKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8U01Mb2MsIFBhdHRlcm4+ID4gTm90TWF0Y2hlczsKKyAgCisgIHdoaWxlICgxKSB7CisgICAgLy8gU2VlIGlmIFByZWZpeCBvY2N1cnMgaW4gdGhlIG1lbW9yeSBidWZmZXIuCisgICAgQnVmZmVyID0gQnVmZmVyLnN1YnN0cihCdWZmZXIuZmluZChDaGVja1ByZWZpeCkpOworICAgIAorICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGEgbWF0Y2gsIHdlJ3JlIGRvbmUuCisgICAgaWYgKEJ1ZmZlci5lbXB0eSgpKQorICAgICAgYnJlYWs7CisgICAgCisgICAgY29uc3QgY2hhciAqQ2hlY2tQcmVmaXhTdGFydCA9IEJ1ZmZlci5kYXRhKCk7CisgICAgCisgICAgLy8gV2hlbiB3ZSBmaW5kIGEgY2hlY2sgcHJlZml4LCBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgZmluZCBDSEVDSzogb3IKKyAgICAvLyBDSEVDSy1ORVhUOgorICAgIGJvb2wgSXNDaGVja05leHQgPSBmYWxzZSwgSXNDaGVja05vdCA9IGZhbHNlOworICAgIAorICAgIC8vIFZlcmlmeSB0aGF0IHRoZSA6IGlzIHByZXNlbnQgYWZ0ZXIgdGhlIHByZWZpeC4KKyAgICBpZiAoQnVmZmVyW0NoZWNrUHJlZml4LnNpemUoKV0gPT0gJzonKSB7CisgICAgICBCdWZmZXIgPSBCdWZmZXIuc3Vic3RyKENoZWNrUHJlZml4LnNpemUoKSsxKTsKKyAgICB9IGVsc2UgaWYgKEJ1ZmZlci5zaXplKCkgPiBDaGVja1ByZWZpeC5zaXplKCkrNiAmJgorICAgICAgICAgICAgICAgbWVtY21wKEJ1ZmZlci5kYXRhKCkrQ2hlY2tQcmVmaXguc2l6ZSgpLCAiLU5FWFQ6IiwgNikgPT0gMCkgeworICAgICAgQnVmZmVyID0gQnVmZmVyLnN1YnN0cihDaGVja1ByZWZpeC5zaXplKCkrNyk7CisgICAgICBJc0NoZWNrTmV4dCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChCdWZmZXIuc2l6ZSgpID4gQ2hlY2tQcmVmaXguc2l6ZSgpKzUgJiYKKyAgICAgICAgICAgICAgIG1lbWNtcChCdWZmZXIuZGF0YSgpK0NoZWNrUHJlZml4LnNpemUoKSwgIi1OT1Q6IiwgNSkgPT0gMCkgeworICAgICAgQnVmZmVyID0gQnVmZmVyLnN1YnN0cihDaGVja1ByZWZpeC5zaXplKCkrNik7CisgICAgICBJc0NoZWNrTm90ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgQnVmZmVyID0gQnVmZmVyLnN1YnN0cigxKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvLyBPa2F5LCB3ZSBmb3VuZCB0aGUgcHJlZml4LCB5YXkuICBSZW1lbWJlciB0aGUgcmVzdCBvZiB0aGUgbGluZSwgYnV0CisgICAgLy8gaWdub3JlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgQnVmZmVyID0gQnVmZmVyLnN1YnN0cihCdWZmZXIuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpKTsKKyAgICAKKyAgICAvLyBTY2FuIGFoZWFkIHRvIHRoZSBlbmQgb2YgbGluZS4KKyAgICBzaXplX3QgRU9MID0gQnVmZmVyLmZpbmRfZmlyc3Rfb2YoIlxuXHIiKTsKKworICAgIC8vIFJlbWVtYmVyIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIHBhdHRlcm4sIGZvciBkaWFnbm9zdGljcy4KKyAgICBTTUxvYyBQYXR0ZXJuTG9jID0gU01Mb2M6OmdldEZyb21Qb2ludGVyKEJ1ZmZlci5kYXRhKCkpOworCisgICAgLy8gUGFyc2UgdGhlIHBhdHRlcm4uCisgICAgUGF0dGVybiBQOworICAgIGlmIChQLlBhcnNlUGF0dGVybihCdWZmZXIuc3Vic3RyKDAsIEVPTCksIFNNKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIEJ1ZmZlciA9IEJ1ZmZlci5zdWJzdHIoRU9MKTsKKworICAgIAorICAgIC8vIFZlcmlmeSB0aGF0IENIRUNLLU5FWFQgbGluZXMgaGF2ZSBhdCBsZWFzdCBvbmUgQ0hFQ0sgbGluZSBiZWZvcmUgdGhlbS4KKyAgICBpZiAoSXNDaGVja05leHQgJiYgQ2hlY2tTdHJpbmdzLmVtcHR5KCkpIHsKKyAgICAgIFNNLlByaW50TWVzc2FnZShTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoQ2hlY2tQcmVmaXhTdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgImZvdW5kICciK0NoZWNrUHJlZml4KyItTkVYVDonIHdpdGhvdXQgcHJldmlvdXMgJyIrCisgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQcmVmaXgrICI6IGxpbmUiLCAiZXJyb3IiKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICAvLyBIYW5kbGUgQ0hFQ0stTk9ULgorICAgIGlmIChJc0NoZWNrTm90KSB7CisgICAgICBOb3RNYXRjaGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoQnVmZmVyLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgCisgICAgLy8gT2theSwgYWRkIHRoZSBzdHJpbmcgd2UgY2FwdHVyZWQgdG8gdGhlIG91dHB1dCB2ZWN0b3IgYW5kIG1vdmUgb24uCisgICAgQ2hlY2tTdHJpbmdzLnB1c2hfYmFjayhDaGVja1N0cmluZyhQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzQ2hlY2tOZXh0KSk7CisgICAgc3RkOjpzd2FwKE5vdE1hdGNoZXMsIENoZWNrU3RyaW5ncy5iYWNrKCkuTm90U3RyaW5ncyk7CisgIH0KKyAgCisgIGlmIChDaGVja1N0cmluZ3MuZW1wdHkoKSkgeworICAgIGVycnMoKSA8PCAiZXJyb3I6IG5vIGNoZWNrIHN0cmluZ3MgZm91bmQgd2l0aCBwcmVmaXggJyIgPDwgQ2hlY2tQcmVmaXgKKyAgICAgICAgICAgPDwgIjonXG4iOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBpZiAoIU5vdE1hdGNoZXMuZW1wdHkoKSkgeworICAgIGVycnMoKSA8PCAiZXJyb3I6ICciIDw8IENoZWNrUHJlZml4CisgICAgICAgICAgIDw8ICItTk9UOicgbm90IHN1cHBvcnRlZCBhZnRlciBsYXN0IGNoZWNrIGxpbmUuXG4iOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50Q2hlY2tGYWlsZWQoY29uc3QgU291cmNlTWdyICZTTSwgY29uc3QgQ2hlY2tTdHJpbmcgJkNoZWNrU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdNYXA8U3RyaW5nUmVmPiAmVmFyaWFibGVUYWJsZSkgeworICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgYW4gZXJyb3IsIGVtaXQgYW4gZXJyb3IgbWVzc2FnZS4KKyAgU00uUHJpbnRNZXNzYWdlKENoZWNrU3RyLkxvYywgImV4cGVjdGVkIHN0cmluZyBub3QgZm91bmQgaW4gaW5wdXQiLAorICAgICAgICAgICAgICAgICAgImVycm9yIik7CisgIAorICAvLyBQcmludCB0aGUgInNjYW5uaW5nIGZyb20gaGVyZSIgbGluZS4gIElmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZQorICAvLyBlbmQgb2YgYSBsaW5lLCBhZHZhbmNlIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLgorICBCdWZmZXIgPSBCdWZmZXIuc3Vic3RyKEJ1ZmZlci5maW5kX2ZpcnN0X25vdF9vZigiIFx0XG5cciIpKTsKKyAgCisgIFNNLlByaW50TWVzc2FnZShTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoQnVmZmVyLmRhdGEoKSksICJzY2FubmluZyBmcm9tIGhlcmUiLAorICAgICAgICAgICAgICAgICAgIm5vdGUiKTsKKworICAvLyBBbGxvdyB0aGUgcGF0dGVybiB0byBwcmludCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlmIGRlc2lyZWQuCisgIENoZWNrU3RyLlBhdC5QcmludEZhaWx1cmVJbmZvKFNNLCBCdWZmZXIsIFZhcmlhYmxlVGFibGUpOworfQorCisvLy8gQ291bnROdW1OZXdsaW5lc0JldHdlZW4gLSBDb3VudCB0aGUgbnVtYmVyIG9mIG5ld2xpbmVzIGluIHRoZSBzcGVjaWZpZWQKKy8vLyByYW5nZS4KK3N0YXRpYyB1bnNpZ25lZCBDb3VudE51bU5ld2xpbmVzQmV0d2VlbihTdHJpbmdSZWYgUmFuZ2UpIHsKKyAgdW5zaWduZWQgTnVtTmV3TGluZXMgPSAwOworICB3aGlsZSAoMSkgeworICAgIC8vIFNjYW4gZm9yIG5ld2xpbmUuCisgICAgUmFuZ2UgPSBSYW5nZS5zdWJzdHIoUmFuZ2UuZmluZF9maXJzdF9vZigiXG5cciIpKTsKKyAgICBpZiAoUmFuZ2UuZW1wdHkoKSkgcmV0dXJuIE51bU5ld0xpbmVzOworICAgIAorICAgICsrTnVtTmV3TGluZXM7CisgICAgCisgICAgLy8gSGFuZGxlIFxuXHIgYW5kIFxyXG4gYXMgYSBzaW5nbGUgbmV3bGluZS4KKyAgICBpZiAoUmFuZ2Uuc2l6ZSgpID4gMSAmJgorICAgICAgICAoUmFuZ2VbMV0gPT0gJ1xuJyB8fCBSYW5nZVsxXSA9PSAnXHInKSAmJgorICAgICAgICAoUmFuZ2VbMF0gIT0gUmFuZ2VbMV0pKQorICAgICAgUmFuZ2UgPSBSYW5nZS5zdWJzdHIoMSk7CisgICAgUmFuZ2UgPSBSYW5nZS5zdWJzdHIoMSk7CisgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHN5czo6UHJpbnRTdGFja1RyYWNlT25FcnJvclNpZ25hbCgpOworICBQcmV0dHlTdGFja1RyYWNlUHJvZ3JhbSBYKGFyZ2MsIGFyZ3YpOworICBjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywgYXJndik7CisKKyAgU291cmNlTWdyIFNNOworICAKKyAgLy8gUmVhZCB0aGUgZXhwZWN0ZWQgc3RyaW5ncyBmcm9tIHRoZSBjaGVjayBmaWxlLgorICBzdGQ6OnZlY3RvcjxDaGVja1N0cmluZz4gQ2hlY2tTdHJpbmdzOworICBpZiAoUmVhZENoZWNrRmlsZShTTSwgQ2hlY2tTdHJpbmdzKSkKKyAgICByZXR1cm4gMjsKKworICAvLyBPcGVuIHRoZSBmaWxlIHRvIGNoZWNrIGFuZCBhZGQgaXQgdG8gU291cmNlTWdyLgorICBzdGQ6OnN0cmluZyBFcnJvclN0cjsKKyAgTWVtb3J5QnVmZmVyICpGID0KKyAgICBNZW1vcnlCdWZmZXI6OmdldEZpbGVPclNURElOKElucHV0RmlsZW5hbWUuY19zdHIoKSwgJkVycm9yU3RyKTsKKyAgaWYgKEYgPT0gMCkgeworICAgIGVycnMoKSA8PCAiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSAnIiA8PCBJbnB1dEZpbGVuYW1lIDw8ICInOiAiIAorICAgICAgICAgICA8PCBFcnJvclN0ciA8PCAnXG4nOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICAvLyBSZW1vdmUgZHVwbGljYXRlIHNwYWNlcyBpbiB0aGUgaW5wdXQgZmlsZSBpZiByZXF1ZXN0ZWQuCisgIGlmICghTm9DYW5vbmljYWxpemVXaGl0ZVNwYWNlKQorICAgIEYgPSBDYW5vbmljYWxpemVJbnB1dEZpbGUoRik7CisgIAorICBTTS5BZGROZXdTb3VyY2VCdWZmZXIoRiwgU01Mb2MoKSk7CisgIAorICAvLy8gVmFyaWFibGVUYWJsZSAtIFRoaXMgaG9sZHMgYWxsIHRoZSBjdXJyZW50IGZpbGVjaGVjayB2YXJpYWJsZXMuCisgIFN0cmluZ01hcDxTdHJpbmdSZWY+IFZhcmlhYmxlVGFibGU7CisgIAorICAvLyBDaGVjayB0aGF0IHdlIGhhdmUgYWxsIG9mIHRoZSBleHBlY3RlZCBzdHJpbmdzLCBpbiBvcmRlciwgaW4gdGhlIGlucHV0CisgIC8vIGZpbGUuCisgIFN0cmluZ1JlZiBCdWZmZXIgPSBGLT5nZXRCdWZmZXIoKTsKKyAgCisgIGNvbnN0IGNoYXIgKkxhc3RNYXRjaCA9IEJ1ZmZlci5kYXRhKCk7CisgIAorICBmb3IgKHVuc2lnbmVkIFN0ck5vID0gMCwgZSA9IENoZWNrU3RyaW5ncy5zaXplKCk7IFN0ck5vICE9IGU7ICsrU3RyTm8pIHsKKyAgICBjb25zdCBDaGVja1N0cmluZyAmQ2hlY2tTdHIgPSBDaGVja1N0cmluZ3NbU3RyTm9dOworICAgIAorICAgIFN0cmluZ1JlZiBTZWFyY2hGcm9tID0gQnVmZmVyOworICAgIAorICAgIC8vIEZpbmQgU3RyTm8gaW4gdGhlIGZpbGUuCisgICAgc2l6ZV90IE1hdGNoTGVuID0gMDsKKyAgICBCdWZmZXIgPSBCdWZmZXIuc3Vic3RyKENoZWNrU3RyLlBhdC5NYXRjaChCdWZmZXIsIE1hdGNoTGVuLCBWYXJpYWJsZVRhYmxlKSk7CisgICAgCisgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgcmVqZWN0IHRoZSBpbnB1dC4KKyAgICBpZiAoQnVmZmVyLmVtcHR5KCkpIHsKKyAgICAgIFByaW50Q2hlY2tGYWlsZWQoU00sIENoZWNrU3RyLCBTZWFyY2hGcm9tLCBWYXJpYWJsZVRhYmxlKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIFN0cmluZ1JlZiBTa2lwcGVkUmVnaW9uKExhc3RNYXRjaCwgQnVmZmVyLmRhdGEoKS1MYXN0TWF0Y2gpOworCisgICAgLy8gSWYgdGhpcyBjaGVjayBpcyBhICJDSEVDSy1ORVhUIiwgdmVyaWZ5IHRoYXQgdGhlIHByZXZpb3VzIG1hdGNoIHdhcyBvbgorICAgIC8vIHRoZSBwcmV2aW91cyBsaW5lIChpLmUuIHRoYXQgdGhlcmUgaXMgb25lIG5ld2xpbmUgYmV0d2VlbiB0aGVtKS4KKyAgICBpZiAoQ2hlY2tTdHIuSXNDaGVja05leHQpIHsKKyAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbmV3bGluZXMgYmV0d2VlbiB0aGUgcHJldmlvdXMgbWF0Y2ggYW5kIHRoaXMgb25lLgorICAgICAgYXNzZXJ0KExhc3RNYXRjaCAhPSBGLT5nZXRCdWZmZXJTdGFydCgpICYmCisgICAgICAgICAgICAgIkNIRUNLLU5FWFQgY2FuJ3QgYmUgdGhlIGZpcnN0IGNoZWNrIGluIGEgZmlsZSIpOworCisgICAgICB1bnNpZ25lZCBOdW1OZXdMaW5lcyA9IENvdW50TnVtTmV3bGluZXNCZXR3ZWVuKFNraXBwZWRSZWdpb24pOworICAgICAgaWYgKE51bU5ld0xpbmVzID09IDApIHsKKyAgICAgICAgU00uUHJpbnRNZXNzYWdlKENoZWNrU3RyLkxvYywKKyAgICAgICAgICAgICAgICAgICAgQ2hlY2tQcmVmaXgrIi1ORVhUOiBpcyBvbiB0aGUgc2FtZSBsaW5lIGFzIHByZXZpb3VzIG1hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciIpOworICAgICAgICBTTS5QcmludE1lc3NhZ2UoU01Mb2M6OmdldEZyb21Qb2ludGVyKEJ1ZmZlci5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiduZXh0JyBtYXRjaCB3YXMgaGVyZSIsICJub3RlIik7CisgICAgICAgIFNNLlByaW50TWVzc2FnZShTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoTGFzdE1hdGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwcmV2aW91cyBtYXRjaCB3YXMgaGVyZSIsICJub3RlIik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoTnVtTmV3TGluZXMgIT0gMSkgeworICAgICAgICBTTS5QcmludE1lc3NhZ2UoQ2hlY2tTdHIuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQcmVmaXgrCisgICAgICAgICAgICAgICAgICAgICAgICAiLU5FWFQ6IGlzIG5vdCBvbiB0aGUgbGluZSBhZnRlciB0aGUgcHJldmlvdXMgbWF0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIik7CisgICAgICAgIFNNLlByaW50TWVzc2FnZShTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoQnVmZmVyLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAiJ25leHQnIG1hdGNoIHdhcyBoZXJlIiwgIm5vdGUiKTsKKyAgICAgICAgU00uUHJpbnRNZXNzYWdlKFNNTG9jOjpnZXRGcm9tUG9pbnRlcihMYXN0TWF0Y2gpLAorICAgICAgICAgICAgICAgICAgICAgICAgInByZXZpb3VzIG1hdGNoIHdhcyBoZXJlIiwgIm5vdGUiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIElmIHRoaXMgbWF0Y2ggaGFkICJub3Qgc3RyaW5ncyIsIHZlcmlmeSB0aGF0IHRoZXkgZG9uJ3QgZXhpc3QgaW4gdGhlCisgICAgLy8gc2tpcHBlZCByZWdpb24uCisgICAgZm9yICh1bnNpZ25lZCBDaHVua05vID0gMCwgZSA9IENoZWNrU3RyLk5vdFN0cmluZ3Muc2l6ZSgpOworICAgICAgICAgQ2h1bmtObyAhPSBlOyArK0NodW5rTm8pIHsKKyAgICAgIHNpemVfdCBNYXRjaExlbiA9IDA7CisgICAgICBzaXplX3QgUG9zID0gQ2hlY2tTdHIuTm90U3RyaW5nc1tDaHVua05vXS5zZWNvbmQuTWF0Y2goU2tpcHBlZFJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVRhYmxlKTsKKyAgICAgIGlmIChQb3MgPT0gU3RyaW5nUmVmOjpucG9zKSBjb250aW51ZTsKKyAgICAgCisgICAgICBTTS5QcmludE1lc3NhZ2UoU01Mb2M6OmdldEZyb21Qb2ludGVyKExhc3RNYXRjaCtQb3MpLAorICAgICAgICAgICAgICAgICAgICAgIENoZWNrUHJlZml4KyItTk9UOiBzdHJpbmcgb2NjdXJyZWQhIiwgImVycm9yIik7CisgICAgICBTTS5QcmludE1lc3NhZ2UoQ2hlY2tTdHIuTm90U3RyaW5nc1tDaHVua05vXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICBDaGVja1ByZWZpeCsiLU5PVDogcGF0dGVybiBzcGVjaWZpZWQgaGVyZSIsICJub3RlIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgCisKKyAgICAvLyBPdGhlcndpc2UsIGV2ZXJ5dGhpbmcgaXMgZ29vZC4gIFN0ZXAgb3ZlciB0aGUgbWF0Y2hlZCB0ZXh0IGFuZCByZW1lbWJlcgorICAgIC8vIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgbWF0Y2ggYXMgdGhlIGVuZCBvZiB0aGUgbGFzdCBtYXRjaC4KKyAgICBCdWZmZXIgPSBCdWZmZXIuc3Vic3RyKE1hdGNoTGVuKTsKKyAgICBMYXN0TWF0Y2ggPSBCdWZmZXIuZGF0YSgpOworICB9CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL0ZpbGVDaGVjay9NYWtlZmlsZSBiL3NyYy9MTFZNL3V0aWxzL0ZpbGVDaGVjay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWFmNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvRmlsZUNoZWNrL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMjPT09LSB1dGlscy9GaWxlQ2hlY2svTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjIAorIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjIAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorVE9PTE5BTUUgPSBGaWxlQ2hlY2sKK1VTRURMSUJTID0gTExWTVN1cHBvcnQuYSBMTFZNU3lzdGVtLmEKKworIyBUaGlzIHRvb2wgaGFzIG5vIHBsdWdpbnMsIG9wdGltaXplIHN0YXJ0dXAgdGltZS4KK1RPT0xfTk9fRVhQT1JUUyA9IDEKKworIyBEb24ndCBpbnN0YWxsIHRoaXMgdXRpbGl0eQorTk9fSU5TVEFMTCA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvRmlsZVVwZGF0ZS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9MTFZNL3V0aWxzL0ZpbGVVcGRhdGUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjYmQxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL0ZpbGVVcGRhdGUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMSBAQAorYWRkX2V4ZWN1dGFibGUoRmlsZVVwZGF0ZQorICBGaWxlVXBkYXRlLmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyhGaWxlVXBkYXRlIExMVk1TdXBwb3J0IExMVk1TeXN0ZW0pCitpZiggTUlOR1cgKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoRmlsZVVwZGF0ZSBpbWFnZWhscCBwc2FwaSkKK2VuZGlmKCBNSU5HVyApCitpZiggTExWTV9FTkFCTEVfVEhSRUFEUyBBTkQgSEFWRV9MSUJQVEhSRUFEICkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKEZpbGVVcGRhdGUgcHRocmVhZCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL0ZpbGVVcGRhdGUvRmlsZVVwZGF0ZS5jcHAgYi9zcmMvTExWTS91dGlscy9GaWxlVXBkYXRlL0ZpbGVVcGRhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzIwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9GaWxlVXBkYXRlL0ZpbGVVcGRhdGUuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8vPT09LSBGaWxlVXBkYXRlLmNwcCAtIENvbmRpdGlvbmFsbHkgdXBkYXRlIGEgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRmlsZVVwZGF0ZSBpcyBhIHV0aWxpdHkgZm9yIGNvbmRpdGlvbmFsbHkgdXBkYXRpbmcgYSBmaWxlIGZyb20gaXRzIGlucHV0CisvLyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBpbnB1dCBkaWZmZXJzIGZyb20gdGhlIG91dHB1dC4gSXQgaXMgdXNlZCB0byBhdm9pZAorLy8gdW5uZWNlc3NhcnkgbW9kaWZpY2F0aW9ucyBpbiBhIGJ1aWxkIHN5c3RlbS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vU2lnbmFscy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitRdWlldCgicXVpZXQiLCBjbDo6ZGVzYygiRG9uJ3QgcHJpbnQgdW5uZWNlc3Nhcnkgc3RhdHVzIGluZm9ybWF0aW9uIiksCisgICAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KK0lucHV0RmlsZW5hbWUoImlucHV0LWZpbGUiLCBjbDo6ZGVzYygiSW5wdXQgZmlsZSAoZGVmYXVsdHMgdG8gc3RkaW4pIiksCisgICAgICAgICAgICAgIGNsOjppbml0KCItIiksIGNsOjp2YWx1ZV9kZXNjKCJmaWxlbmFtZSIpKTsKKworc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CitPdXRwdXRGaWxlbmFtZShjbDo6UG9zaXRpb25hbCwgY2w6OmRlc2MoIjxvdXRwdXQtZmlsZT4iKSwgY2w6OlJlcXVpcmVkKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHN5czo6UHJpbnRTdGFja1RyYWNlT25FcnJvclNpZ25hbCgpOworICBQcmV0dHlTdGFja1RyYWNlUHJvZ3JhbSBYKGFyZ2MsIGFyZ3YpOworICBjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywgYXJndik7CisKKyAgLy8gR2V0IHRoZSBpbnB1dCBkYXRhLgorICBzdGQ6OnN0cmluZyBFcnJvclN0cjsKKyAgTWVtb3J5QnVmZmVyICpJbiA9CisgICAgTWVtb3J5QnVmZmVyOjpnZXRGaWxlT3JTVERJTihJbnB1dEZpbGVuYW1lLmNfc3RyKCksICZFcnJvclN0cik7CisgIGlmIChJbiA9PSAwKSB7CisgICAgZXJycygpIDw8IGFyZ3ZbMF0gPDwgIjogZXJyb3I6IFVuYWJsZSB0byBnZXQgaW5wdXQgJyIKKyAgICAgICAgICAgPDwgSW5wdXRGaWxlbmFtZSA8PCAiJzogIiA8PCBFcnJvclN0ciA8PCAnXG4nOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gR2V0IHRoZSBvdXRwdXQgZGF0YS4KKyAgTWVtb3J5QnVmZmVyICpPdXQgPSBNZW1vcnlCdWZmZXI6OmdldEZpbGUoT3V0cHV0RmlsZW5hbWUuY19zdHIoKSwgJkVycm9yU3RyKTsKKworICAvLyBJZiB0aGUgb3V0cHV0IGV4aXN0cyBhbmQgdGhlIGNvbnRlbnRzIG1hdGNoLCB3ZSBhcmUgZG9uZS4KKyAgaWYgKE91dCAmJiBJbi0+Z2V0QnVmZmVyU2l6ZSgpID09IE91dC0+Z2V0QnVmZmVyU2l6ZSgpICYmCisgICAgICBtZW1jbXAoSW4tPmdldEJ1ZmZlclN0YXJ0KCksIE91dC0+Z2V0QnVmZmVyU3RhcnQoKSwKKyAgICAgICAgICAgICBPdXQtPmdldEJ1ZmZlclNpemUoKSkgPT0gMCkgeworICAgIGlmICghUXVpZXQpCisgICAgICBvdXRzKCkgPDwgYXJndlswXSA8PCAiOiBOb3QgdXBkYXRpbmcgJyIgPDwgT3V0cHV0RmlsZW5hbWUKKyAgICAgICAgICAgICA8PCAiJywgY29udGVudHMgbWF0Y2ggaW5wdXQuXG4iOworICAgIHJldHVybiAwOworICB9CisKKyAgZGVsZXRlIE91dDsKKworICAvLyBPdGhlcndpc2UsIG92ZXJ3cml0ZSB0aGUgb3V0cHV0LgorICBpZiAoIVF1aWV0KQorICAgIG91dHMoKSA8PCBhcmd2WzBdIDw8ICI6IFVwZGF0aW5nICciIDw8IE91dHB1dEZpbGVuYW1lCisgICAgICAgICAgIDw8ICInLCBjb250ZW50cyBjaGFuZ2VkLlxuIjsKKyAgcmF3X2ZkX29zdHJlYW0gT3V0U3RyZWFtKE91dHB1dEZpbGVuYW1lLmNfc3RyKCksIEVycm9yU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X2ZkX29zdHJlYW06OkZfQmluYXJ5KTsKKyAgaWYgKCFFcnJvclN0ci5lbXB0eSgpKSB7CisgICAgZXJycygpIDw8IGFyZ3ZbMF0gPDwgIjogVW5hYmxlIHRvIHdyaXRlIG91dHB1dCAnIgorICAgICAgICAgICA8PCBPdXRwdXRGaWxlbmFtZSA8PCAiJzogIiA8PCBFcnJvclN0ciA8PCAnXG4nOworICAgIHJldHVybiAxOworICB9CisKKyAgT3V0U3RyZWFtLndyaXRlKEluLT5nZXRCdWZmZXJTdGFydCgpLCBJbi0+Z2V0QnVmZmVyU2l6ZSgpKTsKKyAgT3V0U3RyZWFtLmNsb3NlKCk7CisKKyAgaWYgKE91dFN0cmVhbS5oYXNfZXJyb3IoKSkgeworICAgIGVycnMoKSA8PCBhcmd2WzBdIDw8ICI6IENvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlICciCisgICAgICAgICAgIDw8IE91dHB1dEZpbGVuYW1lIDw8ICInOiAiIDw8IEVycm9yU3RyIDw8ICdcbic7CisgICAgT3V0U3RyZWFtLmNsZWFyX2Vycm9yKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL0ZpbGVVcGRhdGUvTWFrZWZpbGUgYi9zcmMvTExWTS91dGlscy9GaWxlVXBkYXRlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTQ1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9GaWxlVXBkYXRlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMjPT09LSB1dGlscy9GaWxlVXBkYXRlL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjIAorIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjIAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorVE9PTE5BTUUgPSBGaWxlVXBkYXRlCitVU0VETElCUyA9IExMVk1TdXBwb3J0LmEgTExWTVN5c3RlbS5hCisKKyMgVGhpcyB0b29sIGhhcyBubyBwbHVnaW5zLCBvcHRpbWl6ZSBzdGFydHVwIHRpbWUuCitUT09MX05PX0VYUE9SVFMgPSAxCisKKyMgRG9uJ3QgaW5zdGFsbCB0aGlzIHV0aWxpdHkKK05PX0lOU1RBTEwgPSAxCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL0dlbkxpYkRlcHMucGwgYi9zcmMvTExWTS91dGlscy9HZW5MaWJEZXBzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjdlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9HZW5MaWJEZXBzLnBsCkBAIC0wLDAgKzEsMzg4IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgUHJvZ3JhbTogIEdlbkxpYkRlcHMucGwKKyMKKyMgU3lub3BzaXM6IEdlbmVyYXRlIEhUTUwgb3V0cHV0IHRoYXQgc2hvd3MgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGEgc2V0IG9mCisjICAgICAgICAgICBsaWJyYXJpZXMuIFRoZSBvdXRwdXQgb2YgdGhpcyBzY3JpcHQgc2hvdWxkIHBlcmlvZGljYWxseSByZXBsYWNlIAorIyAgICAgICAgICAgdGhlIHNpbWlsYXIgY29udGVudCBpbiB0aGUgVXNpbmdMaWJyYXJpZXMuaHRtbCBkb2N1bWVudC4KKyMKKyMgU3ludGF4OiAgIEdlbkxpYkRlcHMucGwgWy1mbGF0XSA8ZGlyZWN0b3J5X3dpdGhfbGlicmFyaWVzX2luX2l0PiBbcGF0aF90b19ubV9iaW5hcnldCisjCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworIyBQYXJzZSBhcmd1bWVudHMuLi4gCitteSAkRkxBVCA9IDA7CitteSAkV0hZID0gMDsKK215ICRQRVJPQkogPSAwOworbXkgJFBFUk9CSklOQ0wgPSAwOword2hpbGUgKHNjYWxhcihAQVJHVikgYW5kICgkXyA9ICRBUkdWWzBdLCAvXlstK10vKSkgeworICBzaGlmdDsKKyAgbGFzdCBpZiAvXi0tJC87ICAjIFN0b3AgcHJvY2Vzc2luZyBhcmd1bWVudHMgb24gLS0KKworICAjIExpc3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgaGVyZS4uLgorICBpZiAoL14tZmxhdCQvKSAgICAgeyAkRkxBVCA9IDE7IG5leHQ7IH0KKyAgaWYgKC9eLXdoeS8pICAgICAgIHsgJFdIWSA9IDE7ICRGTEFUID0gMTsgbmV4dDsgfQorICBpZiAoL14tcGVyb2JqJC8pICAgIHsgJFBFUk9CSiA9IDE7IG5leHQ7IH0KKyAgaWYgKC9eLXBlcm9iamluY2wvKSB7ICRQRVJPQkpJTkNMID0gMTsgbmV4dDt9CisgIHByaW50ICJVbmtub3duIG9wdGlvbjogJF8gOiBpZ25vcmluZyFcbiI7Cit9CisKKyMgR2l2ZSBmaXJzdCBvcHRpb24gYSBuYW1lLgorbXkgJERpcmVjdG9yeSA9ICRBUkdWWzBdOworaWYgKCFkZWZpbmVkKCREaXJlY3RvcnkpIHx8ICEgLWQgIiREaXJlY3RvcnkiKSB7CisgIGRpZSAiRmlyc3QgYXJndW1lbnQgbXVzdCBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBMTFZNIGxpYnNcbiI7Cit9CisKK215ICRubVBhdGggPSAkQVJHVlsxXTsKKworIyBGaW5kIHRoZSAiZG90IiBwcm9ncmFtCitteSAkRG90UGF0aD0iIjsKK2lmICghJEZMQVQpIHsKKyAgY2hvbXAoJERvdFBhdGggPSBgd2hpY2ggZG90YCk7CisgIGRpZSAiQ2FuJ3QgZmluZCAnZG90JyIgaWYgKCEgLXggIiREb3RQYXRoIik7Cit9CisKK2lmIChkZWZpbmVkKCRFTlZ7Tk19KSkgeworICBjaG9tcCgkbm1QYXRoPSRFTlZ7Tk19KTsKK30KKworaWYgKCFkZWZpbmVkKCRubVBhdGgpIHx8ICRubVBhdGggZXEgIiIpIHsKKyAgY2hvbXAoJG5tUGF0aD1gd2hpY2ggbm1gKTsKKyAgZGllICJDYW4ndCBmaW5kICdubSciIGlmICghIC14ICIkbm1QYXRoIik7Cit9CisKK215ICRyYW5saWJQYXRoOworaWYgKCRQRVJPQkopIHsKKyAgJHJhbmxpYlBhdGggPSAkQVJHVlsyXTsKKyAgaWYgKGRlZmluZWQoJEVOVntSQU5MSUJ9KSkgeworICAgIGNob21wKCRyYW5saWJQYXRoPSRFTlZ7UkFOTElCfSk7CisgIH0KKworICBpZiAoIWRlZmluZWQoJHJhbmxpYlBhdGgpIHx8ICRyYW5saWJQYXRoIGVxICIiKSB7CisgICAgY2hvbXAoJHJhbmxpYlBhdGg9YHdoaWNoIHJhbmxpYmApOworICAgIGRpZSAiQ2FuJ3QgZmluZCAncmFubGliJyIgaWYgKCEgLXggIiRyYW5saWJQYXRoIik7CisgIH0KK30KKworIyBPcGVuIHRoZSBkaXJlY3RvcnkgYW5kIHJlYWQgaXRzIGNvbnRlbnRzLCBzb3J0aW5nIGJ5IG5hbWUgYW5kIGRpZmZlcmVudGlhdGluZworIyBieSB3aGV0aGVyIGl0cyBhIGxpYnJhcnkgKC5hKSBvciBhbiBvYmplY3QgZmlsZSAoLm8pCitvcGVuZGlyIERJUiwkRGlyZWN0b3J5OworbXkgQGZpbGVzID0gcmVhZGRpciBESVI7CitjbG9zZWRpciBESVI7CitteSBAbGlicyA9IGdyZXAoL2xpYkxMVk0uKlwuKGR5bGlifHNvfGEpJC8sc29ydChAZmlsZXMpKTsKKyMgT21pdCB0aGUgYWxsLW9mLWxsdm0gc2hhcmVkIGxpYnJhcnkuCitAbGlicyA9IGdyZXAoIS9saWJMTFZNLVxkXC5cZChzdm4pP1wuKGR5bGlifHNvKS8sIEBsaWJzKTsKK215IEBvYmpzID0gZ3JlcCgvTExWTS4qXC5vJC8sc29ydChAZmlsZXMpKTsKKworIyBEZWNsYXJlIHRoZSBoYXNoZXMgd2Ugd2lsbCB1c2UgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGlicmFyeSBhbmQgb2JqZWN0IGZpbGUKKyMgc3ltYm9sIGRlZmluaXRpb25zLgorbXkgJWxpYmRlZnM7CitteSAlb2JqZGVmczsKKworbXkgJWxpYm9ianM7CitteSAlb2JqZGVwcz0oKTsKKyMgR2F0aGVyIGxpYnJhcnkgZGVmaW5pdGlvbnMgYXQgb2JqZWN0IGZpbGUgZ3JhbnVsYXJpdHkgKG9wdGlvbmFsKQoraWYgKCRQRVJPQkopIHsKKyAgZm9yZWFjaCBteSAkbGliIChAbGlicyApIHsKKyAgICBgJHJhbmxpYlBhdGggJERpcmVjdG9yeS8kbGliYDsKKyAgICBteSAkbGlicGF0aCA9ICRsaWI7CisgICAgJGxpYnBhdGggPX4gcy9ebGliTExWTSguKilcLmEvJDEvOworICAgICRsaWJwYXRoID1+IHMvKC4rKUNvZGVHZW4kL1RhcmdldFwvJDEvOworICAgICRsaWJwYXRoID1+IHMvKC4rKUFzbVByaW50ZXIkL1RhcmdldFwvJDFcL0FzbVByaW50ZXIvOworICAgICRsaWJwYXRoID1+IHMvKC4rKUFzbVBhcnNlciQvVGFyZ2V0XC8kMVwvQXNtUGFyc2VyLzsKKyAgICAkbGlicGF0aCA9fiBzLyguKylJbmZvJC9UYXJnZXRcLyQxXC9UYXJnZXRJbmZvLzsKKyAgICAkbGlicGF0aCA9fiBzLyguKylEaXNhc3NlbWJsZXIkL1RhcmdldFwvJDFcL0Rpc2Fzc2VtYmxlci87CisgICAgJGxpYnBhdGggPX4gcy9TZWxlY3Rpb25EQUcvQ29kZUdlblwvU2VsZWN0aW9uREFHLzsKKyAgICAkbGlicGF0aCA9fiBzL15Bc21QcmludGVyL0NvZGVHZW5cL0FzbVByaW50ZXIvOworICAgICRsaWJwYXRoID1+IHMvXkJpdFJlYWRlci9CaXRjb2RlXC9SZWFkZXIvOworICAgICRsaWJwYXRoID1+IHMvXkJpdFdyaXRlci9CaXRjb2RlXC9Xcml0ZXIvOworICAgICRsaWJwYXRoID1+IHMvXkNCYWNrZW5kL1RhcmdldFwvQ0JhY2tlbmQvOworICAgICRsaWJwYXRoID1+IHMvXkNwcEJhY2tlbmQvVGFyZ2V0XC9DcHBCYWNrZW5kLzsKKyAgICAkbGlicGF0aCA9fiBzL15NU0lML1RhcmdldFwvTVNJTC87CisgICAgJGxpYnBhdGggPX4gcy9eQ29yZS9WTUNvcmUvOworICAgICRsaWJwYXRoID1+IHMvXkluc3RydW1lbnRhdGlvbi9UcmFuc2Zvcm1zXC9JbnN0cnVtZW50YXRpb24vOworICAgICRsaWJwYXRoID1+IHMvXkludGVycHJldGVyL0V4ZWN1dGlvbkVuZ2luZVwvSW50ZXJwcmV0ZXIvOworICAgICRsaWJwYXRoID1+IHMvXkpJVC9FeGVjdXRpb25FbmdpbmVcL0pJVC87CisgICAgJGxpYnBhdGggPX4gcy9eU2NhbGFyT3B0cy9UcmFuc2Zvcm1zXC9TY2FsYXIvOworICAgICRsaWJwYXRoID1+IHMvXlRyYW5zZm9ybVV0aWxzL1RyYW5zZm9ybXNcL1V0aWxzLzsKKyAgICAkbGlicGF0aCA9fiBzL15pcGEvQW5hbHlzaXNcL0lQQS87CisgICAgJGxpYnBhdGggPX4gcy9eaXBvL1RyYW5zZm9ybXNcL0lQTy87CisgICAgJGxpYnBhdGggPX4gcy9ecGljMTZwYXNzZXMvVGFyZ2V0XC9QSUMxNlwvUElDMTZQYXNzZXMvOworICAgICRsaWJwYXRoID0gImxpYi8iLiRsaWJwYXRoLiIvIjsKKyAgICBvcGVuIERFRlMsICIkbm1QYXRoIC1zZyAkRGlyZWN0b3J5LyRsaWJ8IjsKKyAgICB3aGlsZSAoPERFRlM+KSB7CisgICAgICBjaG9tcDsKKyAgICAgIGlmICgvXihbXiBdKikgaW4gKFteIF0qKS8pIHsKKyAgICAgICAgbXkgJG9iamZpbGUgPSAkbGlicGF0aC4kMjsKKyAgICAgICAgJG9iamRlZnN7JDF9ID0gJG9iamZpbGU7CisgICAgICAgICRvYmpkZXBzeyRvYmpmaWxlfSA9IHt9OworICAgICAgICAkbGlib2Jqc3skbGlifXskb2JqZmlsZX09MTsKKyMgICAgICAgIG15ICRwID0gIi4uL2xsdm0vIi4kb2JqZmlsZTsKKyMgICAgICAgICRwID1+IHMvU3VwcG9ydFwvcmVnKC4qKS5vL1N1cHBvcnRcL3JlZyQxLmMvOworIyAgICAgICAgJHAgPX4gcy8ubyQvLmNwcC87CisjICAgICAgICB1bmxlc3MgKC1lICRwKSB7CisjICAgICAgICAgIGRpZSAiJHBcbiIKKyMgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgY2xvc2UgREVGUyBvciBkaWUgIm5tIGZhaWxlZCI7CisgIH0KKyAgZm9yZWFjaCBteSAkbGliIChAbGlicyApIHsKKyAgICBteSAkbGlicGF0aCA9ICRsaWI7CisgICAgJGxpYnBhdGggPX4gcy9ebGliTExWTSguKilcLmEvJDEvOworICAgICRsaWJwYXRoID1+IHMvKC4rKUNvZGVHZW4kL1RhcmdldFwvJDEvOworICAgICRsaWJwYXRoID1+IHMvKC4rKUFzbVByaW50ZXIkL1RhcmdldFwvJDFcL0FzbVByaW50ZXIvOworICAgICRsaWJwYXRoID1+IHMvKC4rKUFzbVBhcnNlciQvVGFyZ2V0XC8kMVwvQXNtUGFyc2VyLzsKKyAgICAkbGlicGF0aCA9fiBzLyguKylJbmZvJC9UYXJnZXRcLyQxXC9UYXJnZXRJbmZvLzsKKyAgICAkbGlicGF0aCA9fiBzLyguKylEaXNhc3NlbWJsZXIkL1RhcmdldFwvJDFcL0Rpc2Fzc2VtYmxlci87CisgICAgJGxpYnBhdGggPX4gcy9TZWxlY3Rpb25EQUcvQ29kZUdlblwvU2VsZWN0aW9uREFHLzsKKyAgICAkbGlicGF0aCA9fiBzL15Bc21QcmludGVyL0NvZGVHZW5cL0FzbVByaW50ZXIvOworICAgICRsaWJwYXRoID1+IHMvXkJpdFJlYWRlci9CaXRjb2RlXC9SZWFkZXIvOworICAgICRsaWJwYXRoID1+IHMvXkJpdFdyaXRlci9CaXRjb2RlXC9Xcml0ZXIvOworICAgICRsaWJwYXRoID1+IHMvXkNCYWNrZW5kL1RhcmdldFwvQ0JhY2tlbmQvOworICAgICRsaWJwYXRoID1+IHMvXkNwcEJhY2tlbmQvVGFyZ2V0XC9DcHBCYWNrZW5kLzsKKyAgICAkbGlicGF0aCA9fiBzL15NU0lML1RhcmdldFwvTVNJTC87CisgICAgJGxpYnBhdGggPX4gcy9eQ29yZS9WTUNvcmUvOworICAgICRsaWJwYXRoID1+IHMvXkluc3RydW1lbnRhdGlvbi9UcmFuc2Zvcm1zXC9JbnN0cnVtZW50YXRpb24vOworICAgICRsaWJwYXRoID1+IHMvXkludGVycHJldGVyL0V4ZWN1dGlvbkVuZ2luZVwvSW50ZXJwcmV0ZXIvOworICAgICRsaWJwYXRoID1+IHMvXkpJVC9FeGVjdXRpb25FbmdpbmVcL0pJVC87CisgICAgJGxpYnBhdGggPX4gcy9eU2NhbGFyT3B0cy9UcmFuc2Zvcm1zXC9TY2FsYXIvOworICAgICRsaWJwYXRoID1+IHMvXlRyYW5zZm9ybVV0aWxzL1RyYW5zZm9ybXNcL1V0aWxzLzsKKyAgICAkbGlicGF0aCA9fiBzL15pcGEvQW5hbHlzaXNcL0lQQS87CisgICAgJGxpYnBhdGggPX4gcy9eaXBvL1RyYW5zZm9ybXNcL0lQTy87CisgICAgJGxpYnBhdGggPX4gcy9ecGljMTZwYXNzZXMvVGFyZ2V0XC9QSUMxNlwvUElDMTZQYXNzZXMvOworICAgICRsaWJwYXRoID0gImxpYi8iLiRsaWJwYXRoLiIvIjsKKyAgICBvcGVuIFVERUZTLCAiJG5tUGF0aCAtQXVwICREaXJlY3RvcnkvJGxpYnwiOworICAgIHdoaWxlICg8VURFRlM+KSB7CisgICAgICBjaG9tcDsKKyAgICAgIGlmICgvOihbXjpdKyk6LykgeworICAgICAgICBteSAkb2JqID0gJGxpYnBhdGguJDE7CisgICAgICAgIHMvW14gXSs6ICpVIC8vOworICAgICAgICBpZiAoZGVmaW5lZCgkb2JqZGVmc3skX30pKSB7CisgICAgICAgICAgJG9iamRlcHN7JG9ian17JG9iamRlZnN7JF99fT0xOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGNsb3NlIFVERUZTIG9yIGRpZSAibm0gZmFpbGVkIgorICB9Cit9IGVsc2UgeworIyBHYXRoZXIgZGVmaW5pdGlvbnMgZnJvbSB0aGUgbGlicmFyaWVzCitmb3JlYWNoIG15ICRsaWIgKEBsaWJzICkgeworICBvcGVuIERFRlMsICIkbm1QYXRoIC1nICREaXJlY3RvcnkvJGxpYnwiOworICB3aGlsZSAoPERFRlM+KSB7CisgICAgbmV4dCBpZiAoISAvIFtBQkNER1JTVF0gLyk7CisgICAgcy9eW14gXSogW0FCQ0RHUlNUXSAvLzsgICAgCisgICAgcy9cMDE1P1wwMTIvLzsgIyBub3Qgc3VyZSBpZiA8REVGUz4gaXMgaW4gYmlubW9kZSBhbmQgdXNlcyBMRiBvciBDUkxGLgorICAgICAgICAgICAgICAgICAgICMgdGhpcyBzdHJpcHMgYm90aCBMRiBhbmQgQ1JMRi4KKyAgICAkbGliZGVmc3skX30gPSAkbGliOworICB9CisgIGNsb3NlIERFRlMgb3IgZGllICJubSBmYWlsZWQiOworfQorfQorCisjIEdhdGhlciBkZWZpbml0aW9ucyBmcm9tIHRoZSBvYmplY3QgZmlsZXMuCitmb3JlYWNoIG15ICRvYmogKEBvYmpzICkgeworICBvcGVuIERFRlMsICIkbm1QYXRoIC1nICREaXJlY3RvcnkvJG9iaiB8IjsKKyAgd2hpbGUgKDxERUZTPikgeworICAgIG5leHQgaWYgKCEgLyBbQUJDREdSU1RdIC8pOworICAgIHMvXlteIF0qIFtBQkNER1JTVF0gLy87CisgICAgcy9cMDE1P1wwMTIvLzsgIyBub3Qgc3VyZSBpZiA8REVGUz4gaXMgaW4gYmlubW9kZSBhbmQgdXNlcyBMRiBvciBDUkxGLgorICAgICAgICAgICAgICAgICAgICMgdGhpcyBzdHJpcHMgYm90aCBMRiBhbmQgQ1JMRi4gICAgCisgICAgJG9iamRlZnN7JF99ID0gJG9iajsKKyAgfQorICBjbG9zZSBERUZTIG9yIGRpZSAibm0gZmFpbGVkIjsKK30KKworIyBHZW5lcmF0ZSBvbmUgZW50cnkgaW4gdGhlIDxkbD4gbGlzdC4gVGhpcyBnZW5lcmF0ZXMgdGhlIDxkdD4gYW5kIDxkZD4gZWxlbWVudHMKKyMgZm9yIG9uZSBsaWJyYXJ5IG9yIG9iamVjdCBmaWxlLiBUaGUgPGR0PiBwcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvcgorIyBvYmplY3QuIFRoZSA8ZGQ+IHByb3ZpZGVzIGEgbGlzdCBvZiB0aGUgbGlicmFyaWVzL29iamVjdHMgaXQgZGVwZW5kcyBvbi4KK3N1YiBnZW5fb25lX2VudHJ5IHsKKyAgbXkgJGxpYiA9ICRfWzBdOworICBteSAkbGliX25zID0gJGxpYjsKKyAgJGxpYl9ucyA9fiBzLyguKilcLltvYV0vJDEvOworICBpZiAoJEZMQVQpIHsKKyAgICBwcmludCAiJGxpYjoiOworICAgIGlmICgkV0hZKSB7IHByaW50ICJcbiI7IH0KKyAgfSBlbHNlIHsKKyAgICBwcmludCAiICA8ZHQ+PGI+JGxpYjwvYjwvZHQ+PGRkPjx1bD5cbiI7CisgIH0KKyAgb3BlbiBVTkRFRlMsIAorICAgICIkbm1QYXRoIC11ICREaXJlY3RvcnkvJGxpYiB8IHNlZCAtZSAncy9eWyAwXSogVSAvLycgfCBzb3J0IHwgdW5pcSB8IjsKKyAgbXkgJURlcExpYnM7CisgIHdoaWxlICg8VU5ERUZTPikgeworICAgIGNob21wOworICAgIG15ICRsaWJfcHJpbnRlZCA9IDA7CisgICAgaWYgKGRlZmluZWQoJGxpYmRlZnN7JF99KSAmJiAkbGliZGVmc3skX30gbmUgJGxpYikgeworICAgICAgJERlcExpYnN7JGxpYmRlZnN7JF99fSA9IFtdIHVubGVzcyBleGlzdHMgJERlcExpYnN7JGxpYmRlZnN7JF99fTsKKyAgICAgIHB1c2goQHskRGVwTGlic3skbGliZGVmc3skX319fSwgJF8pOworICAgIH0gZWxzaWYgKGRlZmluZWQoJG9iamRlZnN7JF99KSAmJiAkb2JqZGVmc3skX30gbmUgJGxpYikgeworICAgICAgaWYgKCRQRVJPQkogJiYgISRQRVJPQkpJTkNMKSB7CisgICAgICAgICMgLXBlcm9iamluY2wgbWFrZXMgLmEgZmlsZXMgZGVwZW5kIG9uIC5vIGZpbGVzIHRoZXkgY29udGFpbiB0aGVtc2VsdmVzCisgICAgICAgICMgZGVmYXVsdCBpcyBkb24ndCBkZXBlbmQgb24gdGhlc2UuCisgICAgICAgIG5leHQgaWYgZGVmaW5lZCAkbGlib2Jqc3skbGlifXskb2JqZGVmc3skX319OworICAgICAgfQorICAgICAgbXkgJGxpYnJvb3QgPSAkbGliOworICAgICAgJGxpYnJvb3QgPX4gcy9saWIoLiopLmEvJDEvOworICAgICAgaWYgKCRvYmpkZWZzeyRffSBuZSAiJGxpYnJvb3QubyIpIHsKKyAgICAgICAgJERlcExpYnN7JG9iamRlZnN7JF99fSA9IFtdIHVubGVzcyBleGlzdHMgJERlcExpYnN7JG9iamRlZnN7JF99fTsKKyAgICAgICAgcHVzaChAeyREZXBMaWJzeyRvYmpkZWZzeyRffX19LCAkXyk7CisgICAgICB9CisgICAgfQorICB9CisgIGNsb3NlIFVOREVGUyBvciBkaWUgIm5tIGZhaWxlZCI7CisgIHVubGVzcyhrZXlzICVEZXBMaWJzKSB7CisgICAgIyBhYm92ZSBmYWlsZWQKKyAgICBvcGVuIFVOREVGUywgIiRubVBhdGggLXUgJERpcmVjdG9yeS8kbGliIHwiOworICAgIHdoaWxlICg8VU5ERUZTPikgeworICAgICAgIyB0byBieXBhc3Mgbm9uLXdvcmtpbmcgc2VkCisgICAgICBpZiAoJyAgJyBlcSBzdWJzdHIoJF8sMCwyKSBhbmQgaW5kZXgoJF8sJ1UgJykpIHsKKyAgICAgICAgJF8gPSBzdWJzdHIoJF8saW5kZXgoJF8sJ1UgJykrMikKKyAgICAgIH07CisgICAgICAkXyA9IHN1YnN0cigkXyxpbmRleCgkXywnICAqVSAnKSs1KSBpZiAtMSE9aW5kZXgoJF8sJyAgKlUgJyk7CisKKyAgICAgIGNob21wOworICAgICAgbXkgJGxpYl9wcmludGVkID0gMDsKKyAgICAgIGlmIChkZWZpbmVkKCRsaWJkZWZzeyRffSkgJiYgJGxpYmRlZnN7JF99IG5lICRsaWIpIHsKKyAgICAgICAgJERlcExpYnN7JGxpYmRlZnN7JF99fSA9IFtdIHVubGVzcyBleGlzdHMgJERlcExpYnN7JGxpYmRlZnN7JF99fTsKKyAgICAgICAgcHVzaChAeyREZXBMaWJzeyRsaWJkZWZzeyRffX19LCAkXyk7CisgICAgICB9IGVsc2lmIChkZWZpbmVkKCRvYmpkZWZzeyRffSkgJiYgJG9iamRlZnN7JF99IG5lICRsaWIpIHsKKyAgICAgICAgbXkgJGxpYnJvb3QgPSAkbGliOworICAgICAgICAkbGlicm9vdCA9fiBzL2xpYiguKikuYS8kMS87CisgICAgICAgIGlmICgkb2JqZGVmc3skX30gbmUgIiRsaWJyb290Lm8iKSB7CisgICAgICAgICAgJERlcExpYnN7JG9iamRlZnN7JF99fSA9IFtdIHVubGVzcyBleGlzdHMgJERlcExpYnN7JG9iamRlZnN7JF99fTsKKyAgICAgICAgICBwdXNoKEB7JERlcExpYnN7JG9iamRlZnN7JF99fX0sICRfKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBjbG9zZSBVTkRFRlMgb3IgZGllICJubSBmYWlsZWQiOworICB9CisgIGlmICgkUEVST0JKSU5DTCkgeworICAgICAjIGluY2x1ZGUgdGhlIC5hJ3Mgb2JqZWN0cworICAgICBmb3IgbXkgJG9iaiAoa2V5cyAleyRsaWJvYmpzeyRsaWJ9fSkgeworICAgICAgICAkRGVwTGlic3skb2JqfSA9IFsiPC5hIG9iamVjdD4iXSB1bmxlc3MgZXhpc3RzICREZXBMaWJzeyRvYmp9OworICAgICB9CisgICAgIG15ICRtYWRlY2hhbmdlID0gMTsKKyAgICAgd2hpbGUoJG1hZGVjaGFuZ2UpIHsKKyAgICAgICRtYWRlY2hhbmdlID0gMDsKKyAgICAgIG15ICV0ZW1wID0gJURlcExpYnM7CisgICAgICBmb3JlYWNoIG15ICRvYmogKGtleXMgJURlcExpYnMpIHsKKyAgICAgICAgZm9yZWFjaCBteSAkb2JqZGVwcyAoa2V5cyAleyRvYmpkZXBzeyRvYmp9fSkgeworICAgICAgICAgIG5leHQgaWYgZGVmaW5lZCAkdGVtcHskb2JqZGVwc307CisgICAgICAgICAgcHVzaChAeyR0ZW1weyRvYmpkZXBzfX0sICRvYmopOworICAgICAgICAgICRtYWRlY2hhbmdlID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgJURlcExpYnMgPSAldGVtcDsKKyAgICAgfQorICB9CisKKyAgZm9yIG15ICRrZXkgKHNvcnQga2V5cyAlRGVwTGlicykgeworICAgIGlmICgkRkxBVCkgeworICAgICAgcHJpbnQgIiAka2V5IjsKKyAgICAgIGlmICgkV0hZKSB7CisgICAgICAgIHByaW50ICJcbiI7CisgICAgICAgIG15IEBzeW1zID0gQHskRGVwTGlic3ska2V5fX07CisgICAgICAgIGZvcmVhY2ggbXkgJHN5bSAoQHN5bXMpIHsKKyAgICAgICAgICBwcmludCAiICAkc3ltXG4iOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ICIgICAgPGxpPiRrZXk8L2xpPlxuIjsKKyAgICB9CisgICAgbXkgJHN1ZmZpeCA9IHN1YnN0cigka2V5LGxlbmd0aCgka2V5KS0xLDEpOworICAgICRrZXkgPX4gcy8oLiopXC5bb2FdLyQxLzsKKyAgICBpZiAoJHN1ZmZpeCBlcSAiYSIpIHsKKyAgICAgIGlmICghJEZMQVQpIHsgcHJpbnQgRE9UICIkbGliX25zIC0+ICRrZXkgWyB3ZWlnaHQ9MCBdO1xuIiB9OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoISRGTEFUKSB7IHByaW50IERPVCAiJGxpYl9ucyAtPiAka2V5IFsgd2VpZ2h0PTEwXTtcbiIgfTsKKyAgICB9CisgIH0KKyAgaWYgKCRGTEFUKSB7CisgICAgaWYgKCEkV0hZKSB7CisgICAgICBwcmludCAiXG4iOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmludCAiICA8L3VsPjwvZGQ+XG4iOworICB9Cit9CisKKyMgTWFrZSBzdXJlIHdlIGZsdXNoIG9uIHdyaXRlLiBUaGlzIGlzIHNsb3dlciBidXQgY29ycmVjdCBiYXNlZCBvbiB0aGUgd2F5IHdlCisjIHdyaXRlIEkvTyBpbiBnZW5fb25lX2VudHJ5LgorJHwgPSAxOworCisjIFByaW50IHRoZSBkZWZpbml0aW9uIGxpc3QgdGFnCitpZiAoISRGTEFUKSB7CisgICAgcHJpbnQgIjxkbD5cbiI7CisKKyAgb3BlbiBET1QsICJ8ICREb3RQYXRoIC1UZ2lmID4gbGliZGVwcy5naWYiOworCisgIHByaW50IERPVCAiZGlncmFwaCBMaWJEZXBzIHtcbiI7CisgIHByaW50IERPVCAiICBzaXplPVwiNDAsMTVcIjsgXG4iOworICBwcmludCBET1QgIiAgcmF0aW89XCIxLjMzMzMzXCI7IFxuIjsKKyAgcHJpbnQgRE9UICIgIG1hcmdpbj1cIjAuMjVcIjsgXG4iOworICBwcmludCBET1QgIiAgcmFua2Rpcj1cIkxSXCI7IFxuIjsKKyAgcHJpbnQgRE9UICIgIG1jbGltaXQ9XCI1MC4wXCI7IFxuIjsKKyAgcHJpbnQgRE9UICIgIG9yZGVyaW5nPVwib3V0XCI7IFxuIjsKKyAgcHJpbnQgRE9UICIgIGNlbnRlcj1cIjFcIjtcbiI7CisgIHByaW50IERPVCAibm9kZSBbc2hhcGU9XCJib3hcIixcbiI7CisgIHByaW50IERPVCAiICAgICAgY29sb3I9XCIjMDAwMDg4XCIsXG4iOworICBwcmludCBET1QgIiAgICAgIGZpbGxjb2xvcj1cIiNGRkZBQ0RcIixcbiI7CisgIHByaW50IERPVCAiICAgICAgZm9udGNvbG9yPVwiIzMzNTVCQlwiLFxuIjsKKyAgcHJpbnQgRE9UICIgICAgICBzdHlsZT1cImZpbGxlZFwiLFxuIjsKKyAgcHJpbnQgRE9UICIgICAgICBmb250bmFtZT1cInNhbnNcIixcbiI7CisgIHByaW50IERPVCAiICAgICAgZm9udHNpemU9XCIyNFwiXG4iOworICBwcmludCBET1QgIl07XG4iOworICBwcmludCBET1QgImVkZ2UgW2Rpcj1cImZvcndhcmRcIixzdHlsZT1cInNvbGlkXCIsY29sb3I9XCIjMDAwMDg4XCJdO1xuIjsKK30KKworIyBQcmludCBsaWJyYXJpZXMgZmlyc3QKK2ZvcmVhY2ggbXkgJGxpYiAoQGxpYnMpIHsKKyAgZ2VuX29uZV9lbnRyeSgkbGliKTsKK30KKworaWYgKCRQRVJPQkopIHsKKyAgZm9yZWFjaCBteSAkb2JqIChrZXlzICVvYmpkZXBzKSB7CisgICAgIHByaW50ICIkb2JqOiI7CisgICAgIGlmICghJFBFUk9CSklOQ0wpIHsKKyAgICAgIGZvcmVhY2ggbXkgJGRlcCAoa2V5cyAleyRvYmpkZXBzeyRvYmp9fSkgeworICAgICAgICAgIHByaW50ICIgJGRlcCI7CisgICAgICB9CisgICAgfQorICAgICBwcmludCAiXG4iOworICB9Cit9CisKK2lmICghJEZMQVQpIHsKKyAgcHJpbnQgRE9UICJ9XG4iOworICBjbG9zZSBET1Q7CisgIG9wZW4gRE9ULCAifCAkRG90UGF0aCAtVGdpZiA+IG9iamRlcHMuZ2lmIjsKKyAgcHJpbnQgRE9UICJkaWdyYXBoIE9iakRlcHMge1xuIjsKKyAgcHJpbnQgRE9UICIgIHNpemU9XCI4LDEwXCI7XG4iOworICBwcmludCBET1QgIiAgbWFyZ2luPVwiMC4yNVwiO1xuIjsKKyAgcHJpbnQgRE9UICIgIHJhbmtkaXI9XCJMUlwiO1xuIjsKKyAgcHJpbnQgRE9UICIgIG1jbGltaXQ9XCI1MC4wXCI7XG4iOworICBwcmludCBET1QgIiAgb3JkZXJpbmc9XCJvdXRcIjtcbiI7CisgIHByaW50IERPVCAiICBjZW50ZXI9XCIxXCI7XG4iOworICBwcmludCBET1QgIm5vZGUgW3NoYXBlPVwiYm94XCIsXG4iOworICBwcmludCBET1QgIiAgICAgIGNvbG9yPVwiIzAwMDA4OFwiLFxuIjsKKyAgcHJpbnQgRE9UICIgICAgICBmaWxsY29sb3I9XCIjRkZGQUNEXCIsXG4iOworICBwcmludCBET1QgIiAgICAgIGZvbnRjb2xvcj1cIiMzMzU1QkJcIixcbiI7CisgIHByaW50IERPVCAiICAgICAgZm9udG5hbWU9XCJzYW5zXCIsXG4iOworICBwcmludCBET1QgIiAgICAgIHN0eWxlPVwiZmlsbGVkXCIsXG4iOworICBwcmludCBET1QgIiAgICAgIGZvbnRzaXplPVwiMjRcIlxuIjsKKyAgcHJpbnQgRE9UICJdO1xuIjsKKyAgcHJpbnQgRE9UICJlZGdlIFtkaXI9XCJmb3J3YXJkXCIsc3R5bGU9XCJzb2xpZFwiLGNvbG9yPVwiIzAwMDA4OFwiXTtcbiI7Cit9CisKKyMgUHJpbnQgb2JqZWN0cyBzZWNvbmQKK2ZvcmVhY2ggbXkgJG9iaiAoQG9ianMpIHsKKyAgZ2VuX29uZV9lbnRyeSgkb2JqKTsKK30KKworaWYgKCEkRkxBVCkgeworICBwcmludCBET1QgIn1cbiI7CisgIGNsb3NlIERPVDsKKworIyBQcmludCBlbmQgdGFnIG9mIGRlZmluaXRpb24gbGlzdCBlbGVtZW50CisgIHByaW50ICI8L2RsPlxuIjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL0dldFNvdXJjZVZlcnNpb24gYi9zcmMvTExWTS91dGlscy9HZXRTb3VyY2VWZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWYyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9HZXRTb3VyY2VWZXJzaW9uCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9zaAorCit1c2FnZSgpIHsKKyAgIGVjaG8gInVzYWdlOiAkMCA8c291cmNlIHJvb3Q+IgorICAgZWNobyAiICBQcmludHMgdGhlIHNvdXJjZSBjb250cm9sIHJldmlzaW9uIG9mIHRoZSBnaXZlbiBzb3VyY2UgZGlyZWN0b3J5LCIKKyAgIGVjaG8gIiAgdGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgcmV2aXNpb24gc3RyaW5nIGRlcGVuZHMgb24gdGhlIHNvdXJjZSAiCisgICBlY2hvICIgIGNvbnRyb2wgc3lzdGVtLiBJZiB0aGUgc291cmNlIGNvbnRyb2wgc3lzdGVtIGlzbid0IGtub3duLCB0aGUgb3V0cHV0IgorICAgZWNobyAiICBpcyBlbXB0eSBhbmQgdGhlIGV4aXQgY29kZSBpcyAxLiIKKyAgIGV4aXQgMQorfQorCitpZiBbICQjICE9IDEgXSB8fCBbICEgLWQgJDEgXTsgdGhlbgorICB1c2FnZTsKK2ZpCisKK2NkICQxCitpZiBbIC1kIC5zdm4gXTsgdGhlbgorICAgc3ZudmVyc2lvbgorZWxpZiBbIC1kIC5naXQvc3ZuIF07IHRoZW4KKyAgIGdpdCBzdm4gaW5mbyB8IGdyZXAgJ1JldmlzaW9uOicgfCBjdXQgLWQ6IC1mMi0KK2VsaWYgWyAtZCAuZ2l0IF07IHRoZW4KKyAgIGdpdCBsb2cgLTEgLS1wcmV0dHk9Zm9ybWF0OiVICitlbHNlCisgICBleGl0IDE7CitmaQorCitleGl0IDAKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL01ha2VmaWxlIGIvc3JjL0xMVk0vdXRpbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0ZGNjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMjPT09LSB1dGlscy9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjIAorIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjIAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLgorUEFSQUxMRUxfRElSUyA6PSBGaWxlQ2hlY2sgRmlsZVVwZGF0ZSBUYWJsZUdlbiBQZXJmZWN0U2h1ZmZsZSBcCisJICAgICAgY291bnQgZnBjbXAgbGx2bS1saXQgbm90IHVuaXR0ZXN0CisKK0VYVFJBX0RJU1QgOj0gY2dpcGxvdE5MVC5wbCBjaGVjay1lYWNoLWZpbGUgY29kZWdlbi1kaWZmIGNvdW50bG9jLnNoIFwKKyAgICAgICAgICAgICAgRFNBY2xlYW4ucHkgRFNBZXh0cmFjdC5weSBlbWFjcyBmaW5kc3ltLnBsIEdlbkxpYkRlcHMucGwgXAorCSAgICAgIGdldHNyY3Muc2ggaW1wb3J0TkxULnBsIGxsdm1kbyBsbHZtZ3JlcCBsbHZtLW5hdGl2ZS1nY2MgXAorCSAgICAgIGxsdm0tbmF0aXZlLWd4eCBtYWtlbGx2bSBOaWdodGx5VGVzdC5nbnVwbG90IE5pZ2h0bHlUZXN0LnBsIFwKKwkgICAgICBOaWdodGx5VGVzdFRlbXBsYXRlLmh0bWwgTkxULnNjaGVtYSBPbGRlbkRhdGFSZWNvdmVyLnBsIFwKKwkgICAgICBwYXJzZU5MVC5wbCBwbG90TkxULnBsIHByb2ZpbGUucGwgXAorCSAgICAgIHdlYk5MVC5wbCB2aW0KKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL05MVC5zY2hlbWEgYi9zcmMvTExWTS91dGlscy9OTFQuc2NoZW1hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzk4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9OTFQuc2NoZW1hCkBAIC0wLDAgKzEsOCBAQAorQ1JFQVRFIFRBQkxFIGBUZXN0c2AgKA0KKyAgYE5BTUVgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCBkZWZhdWx0ICcnLA0KKyAgYFJVTmAgZGF0ZSBOT1QgTlVMTCBkZWZhdWx0ICcwMDAwLTAwLTAwJywNCisgIGBURVNUYCB2YXJjaGFyKDMyKSBOT1QgTlVMTCBkZWZhdWx0ICcnLA0KKyAgYFZBTFVFYCBkb3VibGUgTk9UIE5VTEwgZGVmYXVsdCAnMCcsDQorICBLRVkgYG5hbWVfaW5kZXhgIChgTkFNRWApDQorKSBFTkdJTkU9TXlJU0FNIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjENCisNCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9OZXdOaWdodGx5VGVzdC5wbCBiL3NyYy9MTFZNL3V0aWxzL05ld05pZ2h0bHlUZXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNDgxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9OZXdOaWdodGx5VGVzdC5wbApAQCAtMCwwICsxLDgzNiBAQAorIyEvdXNyL2Jpbi9wZXJsCit1c2UgUE9TSVggcXcoc3RyZnRpbWUpOwordXNlIEZpbGU6OkNvcHk7Cit1c2UgRmlsZTo6RmluZDsKK3VzZSBTb2NrZXQ7CisKKyMKKyMgUHJvZ3JhbTogIE5ld05pZ2h0bHlUZXN0LnBsCisjCisjIFN5bm9wc2lzOiBQZXJmb3JtIGEgc2VyaWVzIG9mIHRlc3RzIHdoaWNoIGFyZSBkZXNpZ25lZCB0byBiZSBydW4gbmlnaHRseS4KKyMgICAgICAgICAgIFRoaXMgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzdGF0dXMgb2YgdGhlIExMVk0gdHJlZSwgdHJhY2tpbmcKKyMgICAgICAgICAgIHJlZ3Jlc3Npb25zIGFuZCBwZXJmb3JtYW5jZSBjaGFuZ2VzLiBTdWJtaXRzIHRoaXMgaW5mb3JtYXRpb24KKyMgICAgICAgICAgIHRvIGxsdm0ub3JnIHdoZXJlIGl0IGlzIHBsYWNlZCBpbnRvIHRoZSBuaWdodGx5dGVzdHJlc3VsdHMgZGF0YWJhc2UuCisjCisjIFN5bnRheDogICBOaWdodGx5VGVzdC5wbCBbT1BUSU9OU10gW0NWU1JPT1QgQlVJTERESVIgV0VCRElSXQorIyAgIHdoZXJlCisjIE9QVElPTlMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZzoKKyMKKyMgTUFJTiBPUFRJT05TOgorIyAgLWNvbmZpZyBMTFZNUEFUSCBJZiBzcGVjaWZpZWQsIHVzZSBhbiBleGlzdGluZyBMTFZNIGJ1aWxkIGFuZCBvbmx5IHJ1biBhbmQKKyMgICAgICAgICAgICAgICAgICAgcmVwb3J0IHRoZSB0ZXN0IGluZm9ybWF0aW9uLiBUaGUgTExWTUNPTkZJRyBhcmd1bWVudCBzaG91bGQKKyMgICAgICAgICAgICAgICAgICAgYmUgdGhlIHBhdGggdG8gdGhlIGxsdm0tY29uZmlnIGV4ZWN1dGFibGUgaW4gdGhlIExMVk0gYnVpbGQuCisjICAgICAgICAgICAgICAgICAgIFRoaXMgc2hvdWxkIGJlIHRoZSBmaXJzdCBhcmd1bWVudCBpZiBnaXZlbi4gTk9UIFlFVAorIyAgICAgICAgICAgICAgICAgICBJTVBMRU1FTlRFRC4KKyMgIC1uaWNrbmFtZSBOQU1FICAgVGhlIE5BTUUgYXJndW1lbnQgc3BlY2lmaWVkcyB0aGUgbmlja25hbWUgdGhpcyBzY3JpcHQKKyMgICAgICAgICAgICAgICAgICAgd2lsbCBzdWJtaXQgdG8gdGhlIG5pZ2h0bHl0ZXN0IHJlc3VsdHMgcmVwb3NpdG9yeS4KKyMgIC1ub3VuYW1lICAgICAgICAgRG9uJ3QgaW5jbHVkZSB1bmFtZSBkYXRhIChtYWNoaW5lIHdpbGwgYmUgaWRlbnRpZmllZCBieSBuaWNrbmFtZSBvbmx5KS4KKyMgIC1zdWJtaXQtc2VydmVyICAgU3BlY2lmaWVzIGEgc2VydmVyIHRvIHN1Ym1pdCB0aGUgdGVzdCByZXN1bHRzIHRvby4gSWYgdGhpcworIyAgICAgICAgICAgICAgICAgICBvcHRpb24gaXMgbm90IHNwZWNpZmllZCBpdCBkZWZhdWx0cyB0bworIyAgICAgICAgICAgICAgICAgICBsbHZtLm9yZy4gVGhpcyBpcyBiYXNpY2FsbHkganVzdCB0aGUgYWRkcmVzcyBvZiB0aGUKKyMgICAgICAgICAgICAgICAgICAgd2Vic2VydmVyCisjICAtc3VibWl0LXNjcmlwdCAgIFNwZWNpZmllcyB3aGljaCBzY3JpcHQgdG8gY2FsbCBvbiB0aGUgc3VibWl0IHNlcnZlci4gSWYKKyMgICAgICAgICAgICAgICAgICAgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCBpdCBkZWZhdWx0cyB0bworIyAgICAgICAgICAgICAgICAgICAvbmlnaHRseXRlc3QvTmlnaHRseVRlc3RBY2NlcHQucGhwLiBUaGlzIGlzIGJhc2ljYWxseQorIyAgICAgICAgICAgICAgICAgICBldmVyeXRoaW5nIGFmdGVyIHRoZSB3d3cueW91cnNlcnZlci5vcmcuCisjICAtc3VibWl0LWF1eCAgICAgIElmIHNwZWNpZmllZCwgYW4gYXV4aWxpYXJ5IHNjcmlwdCB0byBydW4gaW4gYWRkaXRpb24gdG8gdGhlCisjICAgICAgICAgICAgICAgICAgIG5vcm1hbCBzdWJtaXQgc2NyaXB0LiBUaGUgc2NyaXB0IHdpbGwgYmUgcGFzc2VkIHRoZSBwYXRoIHRvCisjICAgICAgICAgICAgICAgICAgIHRoZSAic2VudGRhdGEudHh0IiBmaWxlIGFzIGl0cyBzb2xlIGFyZ3VtZW50LgorIyAgLW5vc3VibWl0ICAgICAgICBEbyBub3QgcmVwb3J0IHRoZSB0ZXN0IHJlc3VsdHMgYmFjayB0byBhIHN1Ym1pdCBzZXJ2ZXIuCisjCisjCisjIEJVSUxEIE9QVElPTlMgKG5vdCB1c2VkIHdpdGggLWNvbmZpZyk6CisjICAtbm9jaGVja291dCAgICAgIERvIG5vdCBjcmVhdGUsIGNoZWNrb3V0LCB1cGRhdGUsIG9yIGNvbmZpZ3VyZQorIyAgICAgICAgICAgICAgICAgICB0aGUgc291cmNlIHRyZWUuCisjICAtbm9yZW1vdmUgICAgICAgIERvIG5vdCByZW1vdmUgdGhlIEJVSUxERElSIGFmdGVyIGl0IGhhcyBiZWVuIGJ1aWx0LgorIyAgLW5vcmVtb3ZlcmVzdWx0cyBEbyBub3QgcmVtb3ZlIHRoZSBXRUJESVIgYWZ0ZXIgaXQgaGFzIGJlZW4gYnVpbHQuCisjICAtbm9jbGVhbiAgICAgICAgIERvIG5vdCBydW4gJ21ha2UgY2xlYW4nIGJlZm9yZSBidWlsZGluZy4KKyMgIC1ub2J1aWxkICAgICAgICAgRG8gbm90IGJ1aWxkIGxsdm0uIElmIHRlc3RzIGFyZSBlbmFibGVkIHBlcmZvcm0gdGhlbQorIyAgICAgICAgICAgICAgICAgICBvbiB0aGUgbGx2bSBidWlsZCBzcGVjaWZpZWQgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeQorIyAgLXJlbGVhc2UgICAgICAgICBCdWlsZCBhbiBMTFZNIFJlbGVhc2UrQXNzZXJ0cyB2ZXJzaW9uCisjICAtcmVsZWFzZS1hc3NlcnRzIEJ1aWxkIGFuIExMVk0gUmVsZWFzZSB2ZXJzaW9uCisjICAtZGlzYWJsZS1iaW5kaW5ncyAgICAgRGlzYWJsZSBidWlsZGluZyBMTFZNIGJpbmRpbmdzLgorIyAgLXdpdGgtY2xhbmcgICAgICBDaGVja291dCBDbGFuZyBzb3VyY2UgaW50byB0b29scy9jbGFuZy4KKyMgIC1jb21waWxlZmxhZ3MgICAgTmV4dCBhcmd1bWVudCBzcGVjaWZpZXMgZXh0cmEgb3B0aW9ucyBwYXNzZWQgdG8gbWFrZSB3aGVuCisjICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5nIExMVk0uCisjICAtdXNlLWdtYWtlICAgICAgIFVzZSBnbWFrZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG1ha2UgY29tbWFuZCB0byBidWlsZAorIyAgICAgICAgICAgICAgICAgICBsbHZtIGFuZCBydW4gdGVzdHMuCisjICAtbGx2bWdjY2RpciAgICAgIE5leHQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBsbHZtLWdjYyBpbnN0YWxsIHByZWZpeC4KKyMKKyMgVEVTVElORyBPUFRJT05TOgorIyAgLW5vdGVzdCAgICAgICAgICBEbyBub3QgZXZlbiBhdHRlbXB0IHRvIHJ1biB0aGUgdGVzdCBwcm9ncmFtcy4KKyMgIC1ub2RlamFnbnUgICAgICAgRG8gbm90IHJ1biBmZWF0dXJlIG9yIHJlZ3Jlc3Npb24gdGVzdHMKKyMgIC1lbmFibGUtbGxjYmV0YSAgRW5hYmxlIHRlc3Rpbmcgb2YgYmV0YSBmZWF0dXJlcyBpbiBsbGMuCisjICAtZW5hYmxlLWxsaSAgICAgIEVuYWJsZSB0ZXN0aW5nIG9mIGxsaSAoaW50ZXJwcmV0ZXIpIGZlYXR1cmVzLCBkZWZhdWx0IGlzIG9mZgorIyAgLWRpc2FibGUtcGljCSAgICBEaXNhYmxlIGJ1aWxkaW5nIHdpdGggUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZS4KKyMgIC1kaXNhYmxlLWxsYyAgICAgRGlzYWJsZSBMTEMgdGVzdHMgaW4gdGhlIG5pZ2h0bHkgdGVzdGVyLgorIyAgLWRpc2FibGUtaml0ICAgICBEaXNhYmxlIEpJVCB0ZXN0cyBpbiB0aGUgbmlnaHRseSB0ZXN0ZXIuCisjICAtZGlzYWJsZS1jYmUgICAgIERpc2FibGUgQyBiYWNrZW5kIHRlc3RzIGluIHRoZSBuaWdodGx5IHRlc3Rlci4KKyMgIC1kaXNhYmxlLWx0byAgICAgRGlzYWJsZSBsaW5rIHRpbWUgb3B0aW1pemF0aW9uLgorIyAgLXRlc3QtY2ZsYWdzICAgICBOZXh0IGFyZ3VtZW50IHNwZWNpZmllcyB0aGF0IEMgY29tcGlsYXRpb24gb3B0aW9ucyB0aGF0CisjICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHdoZW4gcnVubmluZyB0aGUgdGVzdHN1aXRlLgorIyAgLXRlc3QtY3h4ZmxhZ3MgICBOZXh0IGFyZ3VtZW50IHNwZWNpZmllcyB0aGF0IEMrKyBjb21waWxhdGlvbiBvcHRpb25zIHRoYXQKKyMgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgd2hlbiBydW5uaW5nIHRoZSB0ZXN0c3VpdGUuCisjICAtZXh0cmFmbGFncyAgICAgIE5leHQgYXJndW1lbnQgc3BlY2lmaWVzIGV4dHJhIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvCisjICAgICAgICAgICAgICAgICAgIGNvbXBpbGUgdGhlIHRlc3RzLgorIyAgLW5vZXh0ZXJuYWxzICAgICBEbyBub3QgcnVuIHRoZSBleHRlcm5hbCB0ZXN0cyAoZm9yIGNhc2VzIHdoZXJlIHBvdnJheQorIyAgICAgICAgICAgICAgICAgICBvciBTUEVDIGFyZSBub3QgaW5zdGFsbGVkKQorIyAgLXdpdGgtZXh0ZXJuYWxzICBTcGVjaWZ5IGEgZGlyZWN0b3J5IHdoZXJlIHRoZSBleHRlcm5hbCB0ZXN0cyBhcmUgbG9jYXRlZC4KKyMKKyMgT1RIRVIgT1BUSU9OUzoKKyMgIC1wYXJhbGxlbCAgICAgICAgUnVuIHBhcmFsbGVsIGpvYnMgd2l0aCBHTlUgTWFrZSAoc2VlIC1wYXJhbGxlbC1qb2JzKS4KKyMgIC1wYXJhbGxlbC1qb2JzICAgVGhlIG51bWJlciBvZiBwYXJhbGxlbCBNYWtlIGpvYnMgdG8gdXNlIChkZWZhdWx0IGlzIHR3bykuCisjICAtcGFyYWxsZWwtdGVzdCAgIEFsbG93IHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBsbHZtLXRlc3QKKyMgIC12ZXJib3NlICAgICAgICAgVHVybiBvbiBzb21lIGRlYnVnIG91dHB1dAorIyAgLW5pY2UgICAgICAgICAgICBDaGVja291dC9Db25maWd1cmUvQnVpbGQgd2l0aCAibmljZSIgdG8gcmVkdWNlIGltcGFjdAorIyAgICAgICAgICAgICAgICAgICBvbiBidXN5IHNlcnZlcnMuCisjICAtZjJjICAgICAgICAgICAgIE5leHQgYXJndW1lbnQgc3BlY2lmaWVzIHBhdGggdG8gRjJDIHV0aWxpdHkKKyMgIC1nY2NwYXRoICAgICAgICAgUGF0aCB0byBnY2MvZysrIHVzZWQgdG8gYnVpbGQgTExWTQorIyAgLXRhcmdldCAgICAgICAgICBTcGVjaWZ5IHRoZSB0YXJnZXQgdHJpcGxldAorIyAgLWNmbGFncyAgICAgICAgICBOZXh0IGFyZ3VtZW50IHNwZWNpZmllcyB0aGF0IEMgY29tcGlsYXRpb24gb3B0aW9ucyB0aGF0CisjICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlIHRoZSBkZWZhdWx0LgorIyAgLWN4eGZsYWdzICAgICAgICBOZXh0IGFyZ3VtZW50IHNwZWNpZmllcyB0aGF0IEMrKyBjb21waWxhdGlvbiBvcHRpb25zIHRoYXQKKyMgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCisjICAtbGRmbGFncyAgICAgICAgIE5leHQgYXJndW1lbnQgc3BlY2lmaWVzIHRoYXQgbGlua2VyIG9wdGlvbnMgdGhhdCBvdmVycmlkZQorIyAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdC4KKyMKKyMgQ1ZTUk9PVCBpcyBpZ25vcmVkLCBpdCBpcyBwYXNzZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorIyBCVUlMRERJUiBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHNvdXJjZXMgZm9yIHRoaXMgdGVzdCBydW4gd2lsbCBiZSBjaGVja2VkIG91dAorIyAgQU5EIG9iamVjdHMgZm9yIHRoaXMgdGVzdCBydW4gd2lsbCBiZSBidWlsdC4gVGhpcyBkaXJlY3RvcnkgTVVTVCBOT1QKKyMgIGV4aXN0IGJlZm9yZSB0aGUgc2NyaXB0IGlzIHJ1bjsgaXQgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBzdm4gY2hlY2tvdXQKKyMgIHByb2Nlc3MgYW5kIGVyYXNlZCAodW5sZXNzIC1ub3JlbW92ZSBpcyBzcGVjaWZpZWQ7IHNlZSBhYm92ZS4pCisjIFdFQkRJUiBpcyB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHRlc3QgcmVzdWx0cyB3ZWIgcGFnZSB3aWxsIGJlIHdyaXR0ZW4sCisjICBBTkQgaW4gd2hpY2ggdGhlICJpbmRleC5odG1sIiBpcyBhc3N1bWVkIHRvIGJlIGEgc3ltbGluayB0byB0aGUgbW9zdCByZWNlbnQKKyMgIGNvcHkgb2YgdGhlIHJlc3VsdHMuIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyMgTExWTUdDQ0RJUiBpcyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBMTFZNIEdDQyBGcm9udCBFbmQgaXMgaW5zdGFsbGVkCisjICB0by4gVGhpcyBpcyB0aGUgc2FtZSBhcyB5b3Ugd291bGQgaGF2ZSBmb3IgYSBub3JtYWwgTExWTSBidWlsZC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEdldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworbXkgJEhPTUUgICAgICAgPSAkRU5WeydIT01FJ307CitteSAkU1ZOVVJMICAgICA9ICRFTlZ7IlNWTlVSTCJ9OworJFNWTlVSTCAgICAgICAgPSAnaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3QnIHVubGVzcyAkU1ZOVVJMOworbXkgJFRlc3RTVk5VUkwgPSAkRU5WeyJUZXN0U1ZOVVJMIn07CiskVGVzdFNWTlVSTCAgICA9ICdodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdCcgdW5sZXNzICRUZXN0U1ZOVVJMOworbXkgJEJ1aWxkRGlyICAgPSAkRU5WeydCVUlMRERJUid9OworbXkgJFdlYkRpciAgICAgPSAkRU5WeydXRUJESVInfTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ2FsY3VsYXRlIHRoZSBkYXRlIHByZWZpeC4uLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3VzZSBQT1NJWDsKK0BUSU1FID0gbG9jYWx0aW1lOworbXkgJERBVEUgPSBzdHJmdGltZSgiJVktJW0tJWRfJUgtJU0tJVMiLCBsb2NhbHRpbWUoKSk7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFBhcnNlIGFyZ3VtZW50cy4uLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyRDT05GSUdfUEFUSD0iIjsKKyRDT05GSUdVUkVBUkdTPSIiOworJG5pY2tuYW1lPSIiOworJE5PVEVTVD0wOworJE1BS0VDTUQ9Im1ha2UiOworJFNVQk1JVFNFUlZFUiA9ICJsbHZtLm9yZyI7CiskU1VCTUlUU0NSSVBUID0gIi9uaWdodGx5dGVzdC9OaWdodGx5VGVzdEFjY2VwdC5waHAiOworJFNVQk1JVEFVWD0iIjsKKyRTVUJNSVQgPSAxOworJFBBUkFMTEVMSk9CUyA9ICIyIjsKK215ICRURVNURkxBR1M9IiI7CisKK2lmICgkRU5WeydMTFZNR0NDRElSJ30pIHsKKyAgJENPTkZJR1VSRUFSR1MgLj0gIiAtLXdpdGgtbGx2bWdjY2Rpcj0iIC4gJEVOVnsnTExWTUdDQ0RJUid9OworICAkTExWTUdDQ1BBVEggPSAkRU5WeydMTFZNR0NDRElSJ30gLiAnL2Jpbic7Cit9CitlbHNlIHsKKyAgJExMVk1HQ0NQQVRIID0gIiI7Cit9CisKK3doaWxlIChzY2FsYXIoQEFSR1YpIGFuZCAoJF8gPSAkQVJHVlswXSwgL15bLStdLykpIHsKKyAgc2hpZnQ7CisgIGxhc3QgaWYgL14tLSQvOyAgIyBTdG9wIHByb2Nlc3NpbmcgYXJndW1lbnRzIG9uIC0tCisKKyAgIyBMaXN0IGNvbW1hbmQgbGluZSBvcHRpb25zIGhlcmUuLi4KKyAgaWYgKC9eLWNvbmZpZyQvKSAgICAgICAgIHsgJENPTkZJR19QQVRIID0gIiRBUkdWWzBdIjsgc2hpZnQ7IG5leHQ7IH0KKyAgaWYgKC9eLW5vY2hlY2tvdXQkLykgICAgIHsgJE5PQ0hFQ0tPVVQgPSAxOyBuZXh0OyB9CisgIGlmICgvXi1ub2NsZWFuJC8pICAgICAgICB7ICROT0NMRUFOID0gMTsgbmV4dDsgfQorICBpZiAoL14tbm9yZW1vdmUkLykgICAgICAgeyAkTk9SRU1PVkUgPSAxOyBuZXh0OyB9CisgIGlmICgvXi1ub3JlbW92ZWF0ZW5kJC8pICB7ICROT1JFTU9WRUFURU5EID0gMTsgbmV4dDsgfQorICBpZiAoL14tbm9yZW1vdmVyZXN1bHRzJC8peyAkTk9SRU1PVkVSRVNVTFRTID0gMTsgbmV4dDsgfQorICBpZiAoL14tbm90ZXN0JC8pICAgICAgICAgeyAkTk9URVNUID0gMTsgbmV4dDsgfQorICBpZiAoL14tbm9ydW5uaW5ndGVzdHMkLykgeyBuZXh0OyB9ICMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaWdub3JlZC4KKyAgaWYgKC9eLXBhcmFsbGVsLWpvYnMkLykgIHsgJFBBUkFMTEVMSk9CUyA9ICIkQVJHVlswXSI7IHNoaWZ0OyBuZXh0O30KKyAgaWYgKC9eLXBhcmFsbGVsJC8pICAgICAgIHsgJE1BS0VPUFRTID0gIiRNQUtFT1BUUyAtaiRQQVJBTExFTEpPQlMiOyBuZXh0OyB9CisgIGlmICgvXi1wYXJhbGxlbC10ZXN0JC8pICB7ICRQUk9HVEVTVE9QVFMgLj0gIiBFTkFCTEVfUEFSQUxMRUxfUkVQT1JUPTEiOyBuZXh0OyB9CisgIGlmICgvXi13aXRoLWNsYW5nJC8pICAgICB7ICRXSVRIQ0xBTkcgPSAxOyBuZXh0OyB9CisgIGlmICgvXi1yZWxlYXNlJC8pICAgICAgICB7ICRNQUtFT1BUUyA9ICIkTUFLRU9QVFMgRU5BQkxFX09QVElNSVpFRD0xICIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUFRJTUlaRV9PUFRJT049LU8yIjsgbmV4dDt9CisgIGlmICgvXi1yZWxlYXNlLWFzc2VydHMkLyl7ICRNQUtFT1BUUyA9ICIkTUFLRU9QVFMgRU5BQkxFX09QVElNSVpFRD0xICIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJESVNBQkxFX0FTU0VSVElPTlM9MSAiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BUSU1JWkVfT1BUSU9OPS1PMiI7IG5leHQ7fQorICBpZiAoL14tZW5hYmxlLWxsY2JldGEkLykgeyAkUFJPR1RFU1RPUFRTIC49ICIgRU5BQkxFX0xMQ0JFVEE9MSI7IG5leHQ7IH0KKyAgaWYgKC9eLWRpc2FibGUtcGljJC8pICAgIHsgJENPTkZJR1VSRUFSR1MgLj0gIiAtLWVuYWJsZS1waWM9bm8iOyBuZXh0OyB9CisgIGlmICgvXi1lbmFibGUtbGxpJC8pICAgICB7ICRQUk9HVEVTVE9QVFMgLj0gIiBFTkFCTEVfTExJPTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ09ORklHVVJFQVJHUyAuPSAiIC0tZW5hYmxlLWxsaSI7IG5leHQ7IH0KKyAgaWYgKC9eLWRpc2FibGUtbGxjJC8pICAgIHsgJFBST0dURVNUT1BUUyAuPSAiIERJU0FCTEVfTExDPTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ09ORklHVVJFQVJHUyAuPSAiIC0tZGlzYWJsZS1sbGNfZGlmZnMiOyBuZXh0OyB9CisgIGlmICgvXi1kaXNhYmxlLWppdCQvKSAgICB7ICRQUk9HVEVTVE9QVFMgLj0gIiBESVNBQkxFX0pJVD0xIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENPTkZJR1VSRUFSR1MgLj0gIiAtLWRpc2FibGUtaml0IjsgbmV4dDsgfQorICBpZiAoL14tZGlzYWJsZS1iaW5kaW5ncyQvKSAgICB7ICRDT05GSUdVUkVBUkdTIC49ICIgLS1kaXNhYmxlLWJpbmRpbmdzIjsgbmV4dDsgfQorICBpZiAoL14tZGlzYWJsZS1jYmUkLykgICAgeyAkUFJPR1RFU1RPUFRTIC49ICIgRElTQUJMRV9DQkU9MSI7IG5leHQ7IH0KKyAgaWYgKC9eLWRpc2FibGUtbHRvJC8pICAgIHsgJFBST0dURVNUT1BUUyAuPSAiIERJU0FCTEVfTFRPPTEiOyBuZXh0OyB9CisgIGlmICgvXi10ZXN0LW9wdHMkLykgICAgICB7ICRQUk9HVEVTVE9QVFMgLj0gIiAkQVJHVlswXSI7IHNoaWZ0OyBuZXh0OyB9CisgIGlmICgvXi12ZXJib3NlJC8pICAgICAgICB7ICRWRVJCT1NFID0gMTsgbmV4dDsgfQorICBpZiAoL14tdGVlbG9ncyQvKSAgICAgICAgeyAkVEVFTE9HUyA9IDE7IG5leHQ7IH0KKyAgaWYgKC9eLW5pY2UkLykgICAgICAgICAgIHsgJE5JQ0UgPSAibmljZSAiOyBuZXh0OyB9CisgIGlmICgvXi1mMmMkLykgICAgICAgICAgICB7ICRDT05GSUdVUkVBUkdTIC49ICIgLS13aXRoLWYyYz0kQVJHVlswXSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0OyBuZXh0OyB9CisgIGlmICgvXi13aXRoLWV4dGVybmFscyQvKSB7ICRDT05GSUdVUkVBUkdTIC49ICIgLS13aXRoLWV4dGVybmFscz0kQVJHVlswXSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0OyBuZXh0OyB9CisgIGlmICgvXi1jb25maWd1cmUtYXJncyQvKSB7ICRDT05GSUdVUkVBUkdTIC49ICIgJEFSR1ZbMF0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdDsgbmV4dDsgfQorICBpZiAoL14tc3VibWl0LXNlcnZlci8pICAgeyAkU1VCTUlUU0VSVkVSID0gIiRBUkdWWzBdIjsgc2hpZnQ7IG5leHQ7IH0KKyAgaWYgKC9eLXN1Ym1pdC1zY3JpcHQvKSAgIHsgJFNVQk1JVFNDUklQVCA9ICIkQVJHVlswXSI7IHNoaWZ0OyBuZXh0OyB9CisgIGlmICgvXi1zdWJtaXQtYXV4LykgICAgICB7ICRTVUJNSVRBVVggPSAiJEFSR1ZbMF0iOyBzaGlmdDsgbmV4dDsgfQorICBpZiAoL14tbm9zdWJtaXQkLykgICAgICAgeyAkU1VCTUlUID0gMDsgbmV4dDsgfQorICBpZiAoL14tbmlja25hbWUkLykgICAgICAgeyAkbmlja25hbWUgPSAiJEFSR1ZbMF0iOyBzaGlmdDsgbmV4dDsgfQorICBpZiAoL14tZ2NjcGF0aC8pICAgICAgICAgeyAkQ09ORklHVVJFQVJHUyAuPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENDPSRBUkdWWzBdL2djYyBDWFg9JEFSR1ZbMF0vZysrIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdDQ1BBVEg9JEFSR1ZbMF07IHNoaWZ0OyAgbmV4dDsgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgeyAkR0NDUEFUSD0iIjsgfQorICBpZiAoL14tdGFyZ2V0LykgICAgICAgICAgeyAkQ09ORklHVVJFQVJHUyAuPSAiIC0tdGFyZ2V0PSRBUkdWWzBdIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQ7IG5leHQ7IH0KKyAgaWYgKC9eLWNmbGFncy8pICAgICAgICAgIHsgJE1BS0VPUFRTID0gIiRNQUtFT1BUUyBDLkZsYWdzPVwnJEFSR1ZbMF1cJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0OyBuZXh0OyB9CisgIGlmICgvXi1jeHhmbGFncy8pICAgICAgICB7ICRNQUtFT1BUUyA9ICIkTUFLRU9QVFMgQ1hYLkZsYWdzPVwnJEFSR1ZbMF1cJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0OyBuZXh0OyB9CisgIGlmICgvXi1sZGZsYWdzLykgICAgICAgICB7ICRNQUtFT1BUUyA9ICIkTUFLRU9QVFMgTEQuRmxhZ3M9XCckQVJHVlswXVwnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQ7IG5leHQ7IH0KKyAgaWYgKC9eLXRlc3QtY2ZsYWdzLykgICAgIHsgJFRFU1RGTEFHUyA9ICIkVEVTVEZMQUdTIENGTEFHUz1cJyRBUkdWWzBdXCciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdDsgbmV4dDsgfQorICBpZiAoL14tdGVzdC1jeHhmbGFncy8pICAgeyAkVEVTVEZMQUdTID0gIiRURVNURkxBR1MgQ1hYRkxBR1M9XCckQVJHVlswXVwnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQ7IG5leHQ7IH0KKyAgaWYgKC9eLWNvbXBpbGVmbGFncy8pICAgIHsgJE1BS0VPUFRTID0gIiRNQUtFT1BUUyAkQVJHVlswXSI7IHNoaWZ0OyBuZXh0OyB9CisgIGlmICgvXi1sbHZtZ2NjZGlyLykgICAgICB7ICRDT05GSUdVUkVBUkdTIC49ICIgLS13aXRoLWxsdm1nY2NkaXI9XCckQVJHVlswXVwnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExMVk1HQ0NQQVRIID0gJEFSR1ZbMF0gLiAnL2Jpbic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0OyBuZXh0O30KKyAgaWYgKC9eLW5vZXh0ZXJuYWxzJC8pICAgIHsgJE5PRVhURVJOQUxTID0gMTsgbmV4dDsgfQorICBpZiAoL14tbm91bmFtZSQvKSAgICAgICAgeyAkTk9VTkFNRSA9IDE7IG5leHQ7IH0KKyAgaWYgKC9eLXVzZS1nbWFrZS8pICAgICAgIHsgJE1BS0VDTUQgPSAiZ21ha2UiOyBzaGlmdDsgbmV4dDsgfQorICBpZiAoL14tZXh0cmFmbGFncy8pICAgICAgeyAkQ09ORklHVVJFQVJHUyAuPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC0td2l0aC1leHRyYS1vcHRpb25zPVwnJEFSR1ZbMF1cJyI7IHNoaWZ0OyBuZXh0O30KKyAgaWYgKC9eLW5vZXh0ZXJuYWxzJC8pICAgIHsgJE5PRVhURVJOQUxTID0gMTsgbmV4dDsgfQorICBpZiAoL14tbm9kZWphZ251JC8pICAgICAgeyBuZXh0OyB9CisgIGlmICgvXi1ub2J1aWxkJC8pICAgICAgICB7ICROT0JVSUxEID0gMTsgbmV4dDsgfQorICBwcmludCAiVW5rbm93biBvcHRpb246ICRfIDogaWdub3JpbmchXG4iOworfQorCitpZiAoJENPTkZJR1VSRUFSR1MgIX4gLy0tZGlzYWJsZS1qaXQvKSB7CisgICRDT05GSUdVUkVBUkdTIC49ICIgLS1lbmFibGUtaml0IjsKK30KKworaWYgKEBBUkdWICE9IDAgYW5kIEBBUkdWICE9IDMpIHsKKyAgZGllICJlcnJvcjogbXVzdCBzcGVjaWZ5IDAgb3IgMyBvcHRpb25zISI7Cit9CisKK2lmIChAQVJHViA9PSAzKSB7CisgIGlmICgkQ09ORklHX1BBVEggbmUgIiIpIHsKKyAgICAgIGRpZSAiZXJyb3I6IGFyZ3VtZW50cyBhcmUgdW5zdXBwb3J0ZWQgaW4gLWNvbmZpZyBtb2RlLCI7CisgIH0KKworICAjIEFSR1ZbMF0gdXNlZCB0byBiZSB0aGUgQ1ZTIHJvb3QsIGlnbm9yZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICRCdWlsZERpciAgID0gJEFSR1ZbMV07CisgICRXZWJEaXIgICAgID0gJEFSR1ZbMl07Cit9CisKK2lmICgkQ09ORklHX1BBVEggbmUgIiIpIHsKKyAgJEJ1aWxkRGlyID0gIiI7CisgICRTVk5VUkwgPSAkVGVzdFNWTlVSTCA9ICIiOworICBpZiAoJFdlYkRpciAgICAgZXEgIiIpIHsKKyAgICBkaWUoInBsZWFzZSBzcGVjaWZ5IGEgd2ViIGRpcmVjdG9yeSIpOworICB9Cit9IGVsc2UgeworICBpZiAoJEJ1aWxkRGlyICAgZXEgIiIgb3IKKyAgICAgICRXZWJEaXIgICAgIGVxICIiKSB7CisgICAgZGllKCJwbGVhc2Ugc3BlY2lmeSBhIGJ1aWxkIGRpcmVjdG9yeSwgYW5kIGEgd2ViIGRpcmVjdG9yeSIpOworICB9Cit9CisKK2lmICgkbmlja25hbWUgZXEgIiIpIHsKKyAgZGllICgiUGxlYXNlIGludm9rZSBOZXdOaWdodGx5VGVzdC5wbCB3aXRoIGNvbW1hbmQgbGluZSBvcHRpb24gIiAuCisgICAgICAgIlwiLW5pY2tuYW1lIDxuaWNrbmFtZT5cIiIpOworfQorCitteSAkTExWTVNyY0RpciAgID0gJEVOVnsnTExWTVNSQ0RJUid9OworJExMVk1TcmNEaXIgICAgPSAiJEJ1aWxkRGlyL2xsdm0iIHVubGVzcyAkTExWTVNyY0RpcjsKK215ICRMTFZNT2JqRGlyICAgPSAkRU5WeydMTFZNT0JKRElSJ307CiskTExWTU9iakRpciAgICA9ICIkQnVpbGREaXIvbGx2bSIgdW5sZXNzICRMTFZNT2JqRGlyOworbXkgJExMVk1UZXN0RGlyICAgPSAkRU5WeydMTFZNVEVTVERJUid9OworJExMVk1UZXN0RGlyICAgID0gIiRCdWlsZERpci9sbHZtL3Byb2plY3RzL2xsdm0tdGVzdCIgdW5sZXNzICRMTFZNVGVzdERpcjsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRGVmaW5lIHRoZSBmaWxlIG5hbWVzIHdlJ2xsIHVzZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbXkgJFByZWZpeCA9ICIkV2ViRGlyLyREQVRFIjsKK215ICRTaW5nbGVTb3VyY2VMb2cgPSAiJFByZWZpeC1TaW5nbGVTb3VyY2UtUHJvZ3JhbVRlc3QudHh0Lmd6IjsKK215ICRNdWx0aVNvdXJjZUxvZyA9ICIkUHJlZml4LU11bHRpU291cmNlLVByb2dyYW1UZXN0LnR4dC5neiI7CitteSAkRXh0ZXJuYWxMb2cgPSAiJFByZWZpeC1FeHRlcm5hbC1Qcm9ncmFtVGVzdC50eHQuZ3oiOworCisjIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGluIG5vbi1jb25maWcgbW9kZS4KK215ICRDb25maWd1cmVMb2cgPSAiIiwgJEJ1aWxkTG9nID0gIiIsICRDT0xvZyA9ICIiOworbXkgJERlamFnbnVMb2cgPSAiIiwgJERlamFnbnVTdW0gPSAiIiwgJERlamFnbnVMb2cgPSAiIjsKKworIyBBcmUgd2UgaW4gY29uZmlnIG1vZGU/CitteSAkQ29uZmlnTW9kZSA9IDA7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEhlbHBlciBmdW5jdGlvbnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N1YiBHZXREaXIgeworICBteSAkU3VmZml4ID0gc2hpZnQ7CisgIG9wZW5kaXIgREgsICRXZWJEaXI7CisgIG15IEBSZXN1bHQgPSByZXZlcnNlIHNvcnQgZ3JlcCAhLyREQVRFLywgZ3JlcCAvWy0wLTldKyRTdWZmaXgvLCByZWFkZGlyIERIOworICBjbG9zZWRpciBESDsKKyAgcmV0dXJuIEBSZXN1bHQ7Cit9CisKK3N1YiBSdW5Mb2dnZWRDb21tYW5kIHsKKyAgbXkgJENvbW1hbmQgPSBzaGlmdDsKKyAgbXkgJExvZyA9IHNoaWZ0OworICBteSAkVGl0bGUgPSBzaGlmdDsKKyAgaWYgKCRURUVMT0dTKSB7CisgICAgICBpZiAoJFZFUkJPU0UpIHsKKyAgICAgICAgICBwcmludCAiJFRpdGxlXG4iOworICAgICAgICAgIHByaW50ICIkQ29tbWFuZCAyPiYxIHwgdGVlICRMb2dcbiI7CisgICAgICB9CisgICAgICBzeXN0ZW0gIiRDb21tYW5kIDI+JjEgfCB0ZWUgJExvZyI7CisgIH0gZWxzZSB7CisgICAgICBpZiAoJFZFUkJPU0UpIHsKKyAgICAgICAgICBwcmludCAiJFRpdGxlXG4iOworICAgICAgICAgIHByaW50ICIkQ29tbWFuZCA+ICRMb2cgMj4mMVxuIjsKKyAgICAgIH0KKyAgICAgIHN5c3RlbSAiJENvbW1hbmQgPiAkTG9nIDI+JjEiOworICB9Cit9CisKK3N1YiBSdW5BcHBlbmRpbmdMb2dnZWRDb21tYW5kIHsKKyAgbXkgJENvbW1hbmQgPSBzaGlmdDsKKyAgbXkgJExvZyA9IHNoaWZ0OworICBteSAkVGl0bGUgPSBzaGlmdDsKKyAgaWYgKCRURUVMT0dTKSB7CisgICAgICBpZiAoJFZFUkJPU0UpIHsKKyAgICAgICAgICBwcmludCAiJFRpdGxlXG4iOworICAgICAgICAgIHByaW50ICIkQ29tbWFuZCAyPiYxIHwgdGVlIC1hICRMb2dcbiI7CisgICAgICB9CisgICAgICBzeXN0ZW0gIiRDb21tYW5kIDI+JjEgfCB0ZWUgLWEgJExvZyI7CisgIH0gZWxzZSB7CisgICAgICBpZiAoJFZFUkJPU0UpIHsKKyAgICAgICAgICBwcmludCAiJFRpdGxlXG4iOworICAgICAgICAgIHByaW50ICIkQ29tbWFuZCA+PiAkTG9nIDI+JjFcbiI7CisgICAgICB9CisgICAgICBzeXN0ZW0gIiRDb21tYW5kID4+ICRMb2cgMj4mMSI7CisgIH0KK30KKworc3ViIEdldFJlZ2V4IHsgICAjIChSZWdleCB3aXRoICgpJ3MsIHZhbHVlKQorICBpZiAoJF9bMV0gPX4gLyRfWzBdL20pIHsKKyAgICByZXR1cm4gJDE7CisgIH0KKyAgcmV0dXJuICIwIjsKK30KKworc3ViIENoYW5nZURpciB7ICMgZGlyZWN0b3J5LCBsb2dpY2FsIG5hbWUKKyAgbXkgKCRkaXIsJG5hbWUpID0gQF87CisgIGNob21wKCRkaXIpOworICBpZiAoICRWRVJCT1NFICkgeyBwcmludCAiQ2hhbmdpbmcgVG86ICRuYW1lICgkZGlyKVxuIjsgfQorICAkcmVzdWx0ID0gY2hkaXIoJGRpcik7CisgIGlmICghJHJlc3VsdCkgeworICAgIHByaW50ICJFUlJPUiEhISBDYW5ub3QgY2hhbmdlIGRpcmVjdG9yeSB0bzogJG5hbWUgKCRkaXIpIGJlY2F1c2UgJCFcbiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdWIgUmVhZEZpbGUgeworICBpZiAob3BlbiAoRklMRSwgJF9bMF0pKSB7CisgICAgdW5kZWYgJC87CisgICAgbXkgJFJldCA9IDxGSUxFPjsKKyAgICBjbG9zZSBGSUxFOworICAgICQvID0gJ1xuJzsKKyAgICByZXR1cm4gJFJldDsKKyAgfSBlbHNlIHsKKyAgICBwcmludCAiQ291bGQgbm90IG9wZW4gZmlsZSAnJF9bMF0nIGZvciByZWFkaW5nIVxuIjsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KKworc3ViIFdyaXRlRmlsZSB7ICAjIChmaWxlbmFtZSwgY29udGVudHMpCisgIG9wZW4gKEZJTEUsICI+JF9bMF0iKSBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIGZpbGUgJyRfWzBdJyBmb3Igd3JpdGluZyFcbiI7CisgIHByaW50IEZJTEUgJF9bMV07CisgIGNsb3NlIEZJTEU7Cit9CisKK3N1YiBDb3B5RmlsZSB7ICNmaWxlbmFtZSwgbmV3ZmlsZQorICBteSAoJGZpbGUsICRuZXdmaWxlKSA9IEBfOworICBjaG9tcCgkZmlsZSk7CisgIGlmICgkVkVSQk9TRSkgeyBwcmludCAiQ29weWluZyAkZmlsZSB0byAkbmV3ZmlsZVxuIjsgfQorICBjb3B5KCRmaWxlLCAkbmV3ZmlsZSk7Cit9CisKKyN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisjCisjIFRoaXMgZnVuY3Rpb24gYWN0cyBhcyBhIG1pbmkgd2ViIGJyb3dzd2VyIHN1Ym1pdHRpbmcgZGF0YQorIyB0byBvdXIgY2VudHJhbCBzZXJ2ZXIgdmlhIHRoZSBwb3N0IG1ldGhvZAorIworI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3N1YiBXcml0ZVNlbnREYXRhIHsKKyAgICAkdmFyaWFibGVzID0gJF9bMF07CisKKyAgICAjIFdyaXRlIG91dCB0aGUgIi4uLi1zZW50ZGF0YS50eHQiIGZpbGUuCisKKyAgICBteSAkc2VudGRhdGE9IiI7CisgICAgZm9yZWFjaCAkeCAoa2V5cyAoJSR2YXJpYWJsZXMpKXsKKyAgICAgICAgJHZhbHVlID0gJHZhcmlhYmxlcy0+eyR4fTsKKyAgICAgICAgJHNlbnRkYXRhLj0gIiR4ICA9PiAkdmFsdWVcbiI7CisgICAgfQorICAgIFdyaXRlRmlsZSAiJFByZWZpeC1zZW50ZGF0YS50eHQiLCAkc2VudGRhdGE7Cit9CisKK3N1YiBTZW5kRGF0YSB7CisgICAgJGhvc3QgPSAkX1swXTsKKyAgICAkZmlsZSA9ICRfWzFdOworICAgICR2YXJpYWJsZXMgPSAkX1syXTsKKworICAgIGlmICghKCRTVUJNSVRBVVggZXEgIiIpKSB7CisgICAgICAgIHN5c3RlbSAiJFNVQk1JVEFVWCBcIiRQcmVmaXgtc2VudGRhdGEudHh0XCIiOworICAgIH0KKworICAgIGlmICghJFNVQk1JVCkgeworICAgICAgICByZXR1cm4gIlNraXBwZWQgc3RhbmRhcmQgc3VibWl0LlxuIjsKKyAgICB9CisKKyAgICAjIENyZWF0ZSB0aGUgY29udGVudCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCisKKyAgICBteSAkY29udGVudDsKKyAgICBmb3JlYWNoICRrZXkgKGtleXMgKCUkdmFyaWFibGVzKSl7CisgICAgICAgICR2YWx1ZSA9ICR2YXJpYWJsZXMtPnska2V5fTsKKyAgICAgICAgJHZhbHVlID1+IHMvKFteQS1aYS16MC05XSkvc3ByaW50ZigiJSUlMDJYIiwgb3JkKCQxKSkvc2VnOworICAgICAgICAkY29udGVudCAuPSAiJGtleT0kdmFsdWUmIjsKKyAgICB9CisKKyAgICAjIFNlbmQgdGhlIGRhdGEgdG8gdGhlIHNlcnZlci4KKyAgICAjCisgICAgIyBGSVhNRTogVGhpcyBjb2RlIHNob3VsZCBiZSBtb3JlIHJvYnVzdD8KKworICAgICRwb3J0PTgwOworICAgICRzb2NrZXRhZGRyPSBzb2NrYWRkcl9pbiAkcG9ydCwgaW5ldF9hdG9uICRob3N0IG9yIGRpZSAiQmFkIGhvc3RuYW1lXG4iOworICAgIHNvY2tldCBTT0NLLCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgZ2V0cHJvdG9ieW5hbWUoJ3RjcCcpIG9yCisgICAgICBkaWUgIkJhZCBzb2NrZXRcbiI7CisgICAgY29ubmVjdCBTT0NLLCAkc29ja2V0YWRkciBvciBkaWUgIkJhZCBjb25uZWN0aW9uXG4iOworICAgIHNlbGVjdCgoc2VsZWN0KFNPQ0spLCAkfCA9IDEpWzBdKTsKKworICAgICRsZW5ndGggPSBsZW5ndGgoJGNvbnRlbnQpOworCisgICAgbXkgJHNlbmQ9ICJQT1NUICRmaWxlIEhUVFAvMS4wXG4iOworICAgICRzZW5kLj0gIkhvc3Q6ICRob3N0XG4iOworICAgICRzZW5kLj0gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXG4iOworICAgICRzZW5kLj0gIkNvbnRlbnQtbGVuZ3RoOiAkbGVuZ3RoXG5cbiI7CisgICAgJHNlbmQuPSAiJGNvbnRlbnQiOworCisgICAgcHJpbnQgU09DSyAkc2VuZDsKKyAgICBteSAkcmVzdWx0OworICAgIHdoaWxlKDxTT0NLPil7CisgICAgICAgICRyZXN1bHQgIC49ICRfOworICAgIH0KKyAgICBjbG9zZShTT0NLKTsKKworICAgIHJldHVybiAkcmVzdWx0OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBJbmRpdmlkdWFsIEJ1aWxkICYgVGVzdCBGdW5jdGlvbnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ3JlYXRlIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSBkaXJlY3RvcnkuCitzdWIgQ2hlY2tvdXRTb3VyY2UgeworICBkaWUgIkludmFsaWQgY2FsbCEiIHVubGVzcyAkQ29uZmlnTW9kZSA9PSAwOworICBpZiAoLWQgJEJ1aWxkRGlyKSB7CisgICAgaWYgKCEkTk9SRU1PVkUpIHsKKyAgICAgIGlmICggJFZFUkJPU0UgKSB7CisgICAgICAgIHByaW50ICJCdWlsZCBkaXJlY3RvcnkgZXhpc3RzISBSZW1vdmluZyBpdFxuIjsKKyAgICAgIH0KKyAgICAgIHN5c3RlbSAicm0gLXJmICRCdWlsZERpciI7CisgICAgICBta2RpciAkQnVpbGREaXIgb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIGNoZWNrb3V0IGRpcmVjdG9yeSAkQnVpbGREaXIhIjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCAkVkVSQk9TRSApIHsKKyAgICAgICAgcHJpbnQgIkJ1aWxkIGRpcmVjdG9yeSBleGlzdHMhXG4iOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBta2RpciAkQnVpbGREaXIgb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIGNoZWNrb3V0IGRpcmVjdG9yeSAkQnVpbGREaXIhIjsKKyAgfQorCisgIENoYW5nZURpciggJEJ1aWxkRGlyLCAiY2hlY2tvdXQgZGlyZWN0b3J5IiApOworICBteSAkU1ZOQ01EID0gIiROSUNFIHN2biBjbyAtLW5vbi1pbnRlcmFjdGl2ZSI7CisgIFJ1bkxvZ2dlZENvbW1hbmQoIiggdGltZSAtcCAkU1ZOQ01EICRTVk5VUkwvbGx2bS90cnVuayBsbHZtOyBjZCBsbHZtL3Byb2plY3RzIDsgIiAuCisgICAgICAgICAgICAgICAgICAgIiAgJFNWTkNNRCAkVGVzdFNWTlVSTC90ZXN0LXN1aXRlL3RydW5rIGxsdm0tdGVzdCApIiwgJENPTG9nLAorICAgICAgICAgICAgICAgICAgICJDSEVDS09VVCBMTFZNIik7CisgIGlmICgkV0lUSENMQU5HKSB7CisgICAgICBSdW5Mb2dnZWRDb21tYW5kKCIoIGNkIGxsdm0vdG9vbHMgOyAiIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIiAgJFNWTkNNRCAkU1ZOVVJML2NmZS90cnVuayBjbGFuZyApIiwgJENPTG9nLAorICAgICAgICAgICAgICAgICAgICAgICAiQ0hFQ0tPVVQgQ0xBTkciKTsKKyAgfQorfQorCisjIEJ1aWxkIHRoZSBlbnRpcmUgdHJlZSwgc2F2aW5nIGJ1aWxkIG1lc3NhZ2VzIHRvIHRoZSBidWlsZCBsb2cuIFJldHVybnMgZmFsc2UKKyMgb24gYnVpbGQgZmFpbHVyZS4KK3N1YiBCdWlsZExMVk0geworICBkaWUgIkludmFsaWQgY2FsbCEiIHVubGVzcyAkQ29uZmlnTW9kZSA9PSAwOworICBteSAkRVhUUkFGTEFHUyA9ICItLWVuYWJsZS1zcGVjIC0td2l0aC1vYmpyb290PS4iOworICBSdW5Mb2dnZWRDb21tYW5kKCIodGltZSAtcCAkTklDRSAuL2NvbmZpZ3VyZSAkQ09ORklHVVJFQVJHUyAkRVhUUkFGTEFHUykgIiwKKyAgICAgICAgICAgICAgICAgICAkQ29uZmlndXJlTG9nLCAiQ09ORklHVVJFIik7CisgICMgQnVpbGQgdGhlIGVudGlyZSB0cmVlLCBjYXB0dXJpbmcgdGhlIG91dHB1dCBpbnRvICRCdWlsZExvZworICBpZiAoISROT0NMRUFOKSB7CisgICAgICBSdW5BcHBlbmRpbmdMb2dnZWRDb21tYW5kKCIoJE5JQ0UgJE1BS0VDTUQgJE1BS0VPUFRTIGNsZWFuKSIsICRCdWlsZExvZywgIkJVSUxEIENMRUFOIik7CisgIH0KKyAgUnVuQXBwZW5kaW5nTG9nZ2VkQ29tbWFuZCgiKHRpbWUgLXAgJE5JQ0UgJE1BS0VDTUQgJE1BS0VPUFRTKSIsICRCdWlsZExvZywgIkJVSUxEIik7CisKKyAgaWYgKGBncmVwIC1hICdeJE1BS0VDTURcW146XSo6IC4qRXJyb3InICRCdWlsZExvZyB8IHdjIC1sYCArIDAgfHwKKyAgICAgIGBncmVwIC1hICdeJE1BS0VDTUQ6IFwqXCpcKi4qU3RvcC4nICRCdWlsZExvZyB8IHdjIC1sYCArIDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCisjIFJ1biB0aGUgbmFtZWQgdGVzdHMgKGkuZS4gIlNpbmdsZVNvdXJjZSIgIk11bHRpU291cmNlIiAiRXh0ZXJuYWwiKQorc3ViIFRlc3REaXJlY3RvcnkgeworICBteSAkU3ViRGlyID0gc2hpZnQ7CisgIENoYW5nZURpciggIiRMTFZNVGVzdERpci8kU3ViRGlyIiwKKyAgICAgICAgICAgICAiUHJvZ3JhbXMgVGVzdCBTdWJkaXJlY3RvcnkiICkgfHwgcmV0dXJuICgiIiwgIiIpOworCisgIG15ICRQcm9ncmFtVGVzdExvZyA9ICIkUHJlZml4LSRTdWJEaXItUHJvZ3JhbVRlc3QudHh0IjsKKworICAjIE1ha2Ugc3VyZSB0byBjbGVhbiB0aGUgdGVzdCByZXN1bHRzLgorICBSdW5Mb2dnZWRDb21tYW5kKCIkTUFLRUNNRCAtayAkTUFLRU9QVFMgJFBST0dURVNUT1BUUyBjbGVhbiAkVEVTVEZMQUdTIiwKKyAgICAgICAgICAgICAgICAgICAkUHJvZ3JhbVRlc3RMb2csICJURVNUIERJUkVDVE9SWSAkU3ViRGlyIik7CisKKyAgIyBSdW4gdGhlIHByb2dyYW1zIHRlc3RzLi4uIGNyZWF0aW5nIGEgcmVwb3J0Lm5pZ2h0bHkuY3N2IGZpbGUuCisgIG15ICRMTENCZXRhT3B0cyA9ICIiOworICBSdW5Mb2dnZWRDb21tYW5kKCIkTUFLRUNNRCAtayAkTUFLRU9QVFMgJFBST0dURVNUT1BUUyByZXBvcnQubmlnaHRseS5jc3YgIi4KKyAgICAgICAgICAgICAgICAgICAiJFRFU1RGTEFHUyBURVNUPW5pZ2h0bHkiLAorICAgICAgICAgICAgICAgICAgICRQcm9ncmFtVGVzdExvZywgIlRFU1QgRElSRUNUT1JZICRTdWJEaXIiKTsKKyAgJExMQ0JldGFPcHRzID0gYCRNQUtFQ01EIHByaW50LWxsY2JldGEtb3B0aW9uYDsKKworICBteSAkUHJvZ3JhbXNUYWJsZTsKKyAgaWYgKGBncmVwIC1hICdeJE1BS0VDTURcW146XTogLipFcnJvcicgJFByb2dyYW1UZXN0TG9nIHwgd2MgLWxgICsgMCkgeworICAgICRQcm9ncmFtc1RhYmxlPSJFcnJvciBydW5uaW5nIHRlc3QgJFN1YkRpclxuIjsKKyAgICBwcmludCAiRVJST1IgVEVTVElOR1xuIjsKKyAgfSBlbHNpZiAoYGdyZXAgLWEgJ14kTUFLRUNNRFxbXjpdOiAuKk5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQnICRQcm9ncmFtVGVzdExvZyB8IHdjIC1sYCArIDApIHsKKyAgICAkUHJvZ3JhbXNUYWJsZT0iTWFrZWZpbGUgZXJyb3IgcnVubmluZyB0ZXN0cyAkU3ViRGlyIVxuIjsKKyAgICBwcmludCAiRVJST1IgVEVTVElOR1xuIjsKKyAgfSBlbHNlIHsKKyAgICAjIENyZWF0ZSBhIGxpc3Qgb2YgdGhlIHRlc3RzIHdoaWNoIHdlcmUgcnVuLi4uCisgICAgc3lzdGVtICJlZ3JlcCAtYSAnVEVTVC0oUEFTU3xGQUlMKScgPCAkUHJvZ3JhbVRlc3RMb2cgIi4KKyAgICAgICAgICAgInwgc29ydCA+ICRQcmVmaXgtJFN1YkRpci1UZXN0cy50eHQiOworICB9CisgICRQcm9ncmFtc1RhYmxlID0gUmVhZEZpbGUgInJlcG9ydC5uaWdodGx5LmNzdiI7CisKKyAgQ2hhbmdlRGlyKCAiLi4vLi4vLi4iLCAiUHJvZ3JhbXMgVGVzdCBQYXJlbnQgRGlyZWN0b3J5IiApOworICByZXR1cm4gKCRQcm9ncmFtc1RhYmxlLCAkTExDQmV0YU9wdHMpOworfQorCisjIFJ1biBhbGwgdGhlIG5pZ2h0bHkgdGVzdHMgYW5kIHJldHVybiB0aGUgcHJvZ3JhbSB0YWJsZXMgYW5kIHRoZSBsaXN0IG9mIHRlc3RzLAorIyBwYXNzZXMsIGZhaWxzLCBhbmQgeGZhaWxzLgorc3ViIFJ1bk5pZ2h0bHlUZXN0KCkgeworICAoJFNTUHJvZ3MsICRsbGNiZXRhX29wdGlvbnMpID0gVGVzdERpcmVjdG9yeSgiU2luZ2xlU291cmNlIik7CisgIFdyaXRlRmlsZSAiJFByZWZpeC1TaW5nbGVTb3VyY2UtUGVyZm9ybWFuY2UudHh0IiwgJFNTUHJvZ3M7CisgICgkTVNQcm9ncywgJGxsY2JldGFfb3B0aW9ucykgPSBUZXN0RGlyZWN0b3J5KCJNdWx0aVNvdXJjZSIpOworICBXcml0ZUZpbGUgIiRQcmVmaXgtTXVsdGlTb3VyY2UtUGVyZm9ybWFuY2UudHh0IiwgJE1TUHJvZ3M7CisgIGlmICggISAkTk9FWFRFUk5BTFMgKSB7CisgICAgKCRFeHRQcm9ncywgJGxsY2JldGFfb3B0aW9ucykgPSBUZXN0RGlyZWN0b3J5KCJFeHRlcm5hbCIpOworICAgIFdyaXRlRmlsZSAiJFByZWZpeC1FeHRlcm5hbC1QZXJmb3JtYW5jZS50eHQiLCAkRXh0UHJvZ3M7CisgICAgc3lzdGVtICJjYXQgJFByZWZpeC1TaW5nbGVTb3VyY2UtVGVzdHMudHh0ICIgLgorICAgICAgICAgICAgICAgIiRQcmVmaXgtTXVsdGlTb3VyY2UtVGVzdHMudHh0ICIuCisgICAgICAgICAgICAgICAiJFByZWZpeC1FeHRlcm5hbC1UZXN0cy50eHQgfCBzb3J0ID4gJFByZWZpeC1UZXN0cy50eHQiOworICAgIHN5c3RlbSAiY2F0ICRQcmVmaXgtU2luZ2xlU291cmNlLVBlcmZvcm1hbmNlLnR4dCAiIC4KKyAgICAgICAgICAgICAgICIkUHJlZml4LU11bHRpU291cmNlLVBlcmZvcm1hbmNlLnR4dCAiLgorICAgICAgICAgICAgICAgIiRQcmVmaXgtRXh0ZXJuYWwtUGVyZm9ybWFuY2UudHh0IHwgc29ydCA+ICRQcmVmaXgtUGVyZm9ybWFuY2UudHh0IjsKKyAgfSBlbHNlIHsKKyAgICAkRXh0UHJvZ3MgPSAiRXh0ZXJuYWwgVEVTVCBTVEFHRSBTS0lQUEVEXG4iOworICAgIGlmICggJFZFUkJPU0UgKSB7CisgICAgICBwcmludCAiRXh0ZXJuYWwgVEVTVCBTVEFHRSBTS0lQUEVEXG4iOworICAgIH0KKyAgICBzeXN0ZW0gImNhdCAkUHJlZml4LVNpbmdsZVNvdXJjZS1UZXN0cy50eHQgIiAuCisgICAgICAgICAgICAgICAiJFByZWZpeC1NdWx0aVNvdXJjZS1UZXN0cy50eHQgIi4KKyAgICAgICAgICAgICAgICIgfCBzb3J0ID4gJFByZWZpeC1UZXN0cy50eHQiOworICAgIHN5c3RlbSAiY2F0ICRQcmVmaXgtU2luZ2xlU291cmNlLVBlcmZvcm1hbmNlLnR4dCAiIC4KKyAgICAgICAgICAgICAgICIkUHJlZml4LU11bHRpU291cmNlLVBlcmZvcm1hbmNlLnR4dCAiLgorICAgICAgICAgICAgICAgIiB8IHNvcnQgPiAkUHJlZml4LVBlcmZvcm1hbmNlLnR4dCI7CisgIH0KKworICAjIENvbXBpbGUgcGFzc2VzLCBmYWlscywgeGZhaWxzLgorICBteSAkQWxsID0gKFJlYWRGaWxlICIkUHJlZml4LVRlc3RzLnR4dCIpOworICBteSBAVGVzdFN1aXRlUmVzdWx0TGluZXMgPSBzcGxpdCAiXG4iLCAkQWxsOworICBteSAoJFBhc3NlcywgJEZhaWxzLCAkWEZhaWxzKSA9ICIiOworCisgIGZvciAoJHg9MDsgJHggPCBAVGVzdFN1aXRlUmVzdWx0TGluZXM7ICR4KyspIHsKKyAgICBpZiAoQFRlc3RTdWl0ZVJlc3VsdExpbmVzWyR4XSA9fiBtL15QQVNTOi8pIHsKKyAgICAgICRQYXNzZXMgLj0gIiRUZXN0U3VpdGVSZXN1bHRMaW5lc1skeF1cbiI7CisgICAgfQorICAgIGVsc2lmIChAVGVzdFN1aXRlUmVzdWx0TGluZXNbJHhdID1+IG0vXkZBSUw6LykgeworICAgICAgJEZhaWxzIC49ICIkVGVzdFN1aXRlUmVzdWx0TGluZXNbJHhdXG4iOworICAgIH0KKyAgICBlbHNpZiAoQFRlc3RTdWl0ZVJlc3VsdExpbmVzWyR4XSA9fiBtL15YRkFJTDovKSB7CisgICAgICAkWEZhaWxzIC49ICIkVGVzdFN1aXRlUmVzdWx0TGluZXNbJHhdXG4iOworICAgIH0KKyAgfQorCisgIHJldHVybiAoJFNTUHJvZ3MsICRNU1Byb2dzLCAkRXh0UHJvZ3MsICRBbGwsICRQYXNzZXMsICRGYWlscywgJFhGYWlscyk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEluaXRpYWxpemUgZmlsZW5hbWVzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiAoISAtZCAkV2ViRGlyKSB7CisgIG1rZGlyICRXZWJEaXIsIDA3Nzcgb3IgZGllICJVbmFibGUgdG8gY3JlYXRlIHdlYiBkaXJlY3Rvcnk6ICckV2ViRGlyJy4iOworICBpZigkVkVSQk9TRSl7CisgICAgd2FybiAiJFdlYkRpciBkaWQgbm90IGV4aXN0OyBjcmVhdGluZyBpdC5cbiI7CisgIH0KK30KKworaWYgKCRDT05GSUdfUEFUSCBuZSAiIikgeworICAkQ29uZmlnTW9kZSA9IDE7CisgICRMTFZNU3JjRGlyID0gR2V0UmVnZXggIl4oLiopXFxzKyIsIGAkQ09ORklHX1BBVEggLS1zcmMtcm9vdGA7CisgICRMTFZNT2JqRGlyID0gR2V0UmVnZXggIl4oLiopXFxzKyIsIGAkQ09ORklHX1BBVEggLS1vYmotcm9vdGA7CisgICMgRklYTUU6IEFkZCBsbHZtLWNvbmZpZyBob29rIGZvciB0aGlzPworICAkTExWTVRlc3REaXIgPSAkTExWTU9iakRpciAuICIvcHJvamVjdHMvdGVzdC1zdWl0ZSI7Cit9IGVsc2UgeworICAkQ29uZmlndXJlTG9nID0gIiRQcmVmaXgtQ29uZmlndXJlLUxvZy50eHQiOworICAkQnVpbGRMb2cgPSAiJFByZWZpeC1CdWlsZC1Mb2cudHh0IjsKKyAgJENPTG9nID0gIiRQcmVmaXgtQ1ZTLUxvZy50eHQiOworfQorCitpZiAoJFZFUkJPU0UpIHsKKyAgaWYgKCRDT05GSUdfUEFUSCBuZSAiIikgeworICAgIHByaW50ICJJTklUSUFMSVpFRCAoY29uZmlnIG1vZGUpXG4iOworICAgIHByaW50ICJXZWJEaXIgICAgPSAkV2ViRGlyXG4iOworICAgIHByaW50ICJQcmVmaXggICAgPSAkUHJlZml4XG4iOworICAgIHByaW50ICJMTFZNIFNyYyAgPSAkTExWTVNyY0RpclxuIjsKKyAgICBwcmludCAiTExWTSBPYmogID0gJExMVk1PYmpEaXJcbiI7CisgICAgcHJpbnQgIkxMVk0gVGVzdCA9ICRMTFZNVGVzdERpclxuIjsKKyAgfSBlbHNlIHsKKyAgICBwcmludCAiSU5JVElBTElaRURcbiI7CisgICAgcHJpbnQgIlNWTiBVUkwgID0gJFNWTlVSTFxuIjsKKyAgICBwcmludCAiQ09Mb2cgICAgPSAkQ09Mb2dcbiI7CisgICAgcHJpbnQgIkJ1aWxkRGlyID0gJEJ1aWxkRGlyXG4iOworICAgIHByaW50ICJXZWJEaXIgICA9ICRXZWJEaXJcbiI7CisgICAgcHJpbnQgIlByZWZpeCAgID0gJFByZWZpeFxuIjsKKyAgICBwcmludCAiQnVpbGRMb2cgPSAkQnVpbGRMb2dcbiI7CisgIH0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVGhlIGFjdHVhbCBOZXdOaWdodGx5VGVzdCBsb2dpYy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyRzdGFydHRpbWUgPSBgZGF0ZSAiKzIwJXktJW0tJWQgJUg6JU06JVMiYDsKKworbXkgJEJ1aWxkRXJyb3IgPSAwLCAkQnVpbGRTdGF0dXMgPSAiT0siOworaWYgKCRDb25maWdNb2RlID09IDApIHsKKyAgaWYgKCEkTk9DSEVDS09VVCkgeworICAgIENoZWNrb3V0U291cmNlKCk7CisgIH0KKworICAjIEJ1aWxkIExMVk0uCisgIENoYW5nZURpciggJExMVk1TcmNEaXIgLCAibGx2bSBzb3VyY2UgZGlyZWN0b3J5IikgOworICBpZiAoJE5PQ0hFQ0tPVVQgfHwgJE5PQlVJTEQpIHsKKyAgICAkQnVpbGRTdGF0dXMgPSAiU2tpcHBlZCBieSB1c2VyIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIUJ1aWxkTExWTSgpKSB7CisgICAgICBpZiggJFZFUkJPU0UpIHsgcHJpbnQgICJcbioqKkVSUk9SIEJVSUxESU5HIFRSRUVcblxuIjsgfQorICAgICAgJEJ1aWxkRXJyb3IgPSAxOworICAgICAgJEJ1aWxkU3RhdHVzID0gIkVycm9yOiBjb21waWxhdGlvbiBhYm9ydGVkIjsKKyAgICB9CisgIH0KK30KKworIyBSdW4gdGhlIGxsdm0tdGVzdCB0ZXN0cy4KK215ICgkU2luZ2xlU291cmNlUHJvZ3JhbXNUYWJsZSwgJE11bHRpU291cmNlUHJvZ3JhbXNUYWJsZSwgJEV4dGVybmFsUHJvZ3JhbXNUYWJsZSwKKyAgICAkYWxsX3Rlc3RzLCAkcGFzc2VzLCAkZmFpbHMsICR4ZmFpbHMpID0gIiI7CitpZiAoISROT1RFU1QgJiYgISRCdWlsZEVycm9yKSB7CisgICgkU2luZ2xlU291cmNlUHJvZ3JhbXNUYWJsZSwgJE11bHRpU291cmNlUHJvZ3JhbXNUYWJsZSwgJEV4dGVybmFsUHJvZ3JhbXNUYWJsZSwKKyAgICRhbGxfdGVzdHMsICRwYXNzZXMsICRmYWlscywgJHhmYWlscykgPSBSdW5OaWdodGx5VGVzdCgpOworfQorCiskZW5kdGltZSA9IGBkYXRlICIrMjAleS0lbS0lZCAlSDolTTolUyJgOworCisjIFRoZSBsYXN0IGJpdCBvZiBsb2dpYyBpcyB0byByZW1vdmUgdGhlIGJ1aWxkIGFuZCB3ZWIgZGlycywgYWZ0ZXIgc2VuZGluZyBkYXRhCisjIHRvIHRoZSBzZXJ2ZXIuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEFjY3VtdWxhdGUgdGhlIGluZm9ybWF0aW9uIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmICggJFZFUkJPU0UgKSB7IHByaW50ICJQUkVQQVJJTkcgTE9HUyBUTyBCRSBTRU5UIFRPIFNFUlZFUlxuIjsgfQorCitpZiAoICEgJE5PVU5BTUUgKSB7CisgICAgJG1hY2hpbmVfZGF0YSA9ICJ1bmFtZTogIi5gdW5hbWUgLWFgLgorICAgICAgICAiaGFyZHdhcmU6ICIuYHVuYW1lIC1tYC4KKyAgICAgICAgIm9zOiAiLmB1bmFtZSAtc3JgLgorICAgICAgICAibmFtZTogIi5gdW5hbWUgLW5gLgorICAgICAgICAiZGF0ZTogIi5gZGF0ZSBcIisyMCV5LSVtLSVkXCJgLgorICAgICAgICAidGltZTogIi5gZGF0ZSArXCIlSDolTTolU1wiYDsKK30gZWxzZSB7CisgICAgJG1hY2hpbmVfZGF0YSA9ICJ1bmFtZTogKGV4Y2x1ZGVkKVxuIi4KKyAgICAgICAgImhhcmR3YXJlOiAiLmB1bmFtZSAtbWAuCisgICAgICAgICJvczogIi5gdW5hbWUgLXNyYC4KKyAgICAgICAgIm5hbWU6ICRuaWNrbmFtZVxuIi4KKyAgICAgICAgImRhdGU6ICIuYGRhdGUgXCIrMjAleS0lbS0lZFwiYC4KKyAgICAgICAgInRpbWU6ICIuYGRhdGUgK1wiJUg6JU06JVNcImA7Cit9CisKKyMgR2V0IGdjYyB2ZXJzaW9uLgorbXkgJGdjY192ZXJzaW9uX2xvbmcgPSAiIjsKK2lmICgkR0NDUEFUSCBuZSAiIikgeworICAkZ2NjX3ZlcnNpb25fbG9uZyA9IGAkR0NDUEFUSC9nY2MgLS12ZXJzaW9uYDsKK30gZWxzaWYgKCRFTlZ7IkNDIn0pIHsKKyAgJGdjY192ZXJzaW9uX2xvbmcgPSBgJEVOVnsiQ0MifSAtLXZlcnNpb25gOworfSBlbHNlIHsKKyAgJGdjY192ZXJzaW9uX2xvbmcgPSBgZ2NjIC0tdmVyc2lvbmA7Cit9CitteSAkZ2NjX3ZlcnNpb24gPSAoc3BsaXQgJ1xuJywgJGdjY192ZXJzaW9uX2xvbmcpWzBdOworCisjIEdldCBsbHZtLWdjYyB0YXJnZXQgdHJpcGxlLgorIworIyBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgaGFyZHdpcmVkIHRvIGxsdm0tZ2NjLgorbXkgJGxsdm1nY2NfdmVyc2lvbl9sb25nID0gIiI7CitpZiAoJExMVk1HQ0NQQVRIIG5lICIiKSB7CisgICRsbHZtZ2NjX3ZlcnNpb25fbG9uZyA9IGAkTExWTUdDQ1BBVEgvbGx2bS1nY2MgLXYgMj4mMWA7Cit9IGVsc2UgeworICAkbGx2bWdjY192ZXJzaW9uX2xvbmcgPSBgbGx2bS1nY2MgLXYgMj4mMWA7Cit9Cisoc3BsaXQgJ1xuJywgJGxsdm1nY2NfdmVyc2lvbl9sb25nKVsxXSA9fiAvVGFyZ2V0OiAoLispLzsKK215ICR0YXJnZXRUcmlwbGUgPSAkMTsKKworIyBMb2dzLgorbXkgKCRDb25maWd1cmVMb2dEYXRhLCAkQnVpbGRMb2dEYXRhLCAkQ2hlY2tvdXRMb2dEYXRhKSA9ICIiOworaWYgKCRDb25maWdNb2RlID09IDApIHsKKyAgJENvbmZpZ3VyZUxvZ0RhdGEgPSBSZWFkRmlsZSAkQ29uZmlndXJlTG9nOworICAkQnVpbGRMb2dEYXRhID0gUmVhZEZpbGUgJEJ1aWxkTG9nOworICAkQ2hlY2tvdXRMb2dEYXRhID0gUmVhZEZpbGUgJENPTG9nOworfQorCisjIENoZWNrb3V0IGluZm8uCitteSAkQ2hlY2tvdXRUaW1lX1dhbGwgPSBHZXRSZWdleCAiXnJlYWwgKFswLTkuXSspIiwgJENoZWNrb3V0TG9nRGF0YTsKK215ICRDaGVja291dFRpbWVfVXNlciA9IEdldFJlZ2V4ICJedXNlciAoWzAtOS5dKykiLCAkQ2hlY2tvdXRMb2dEYXRhOworbXkgJENoZWNrb3V0VGltZV9TeXMgPSBHZXRSZWdleCAiXnN5cyAoWzAtOS5dKykiLCAkQ2hlY2tvdXRMb2dEYXRhOworbXkgJENoZWNrb3V0VGltZV9DUFUgPSAkQ1ZTQ2hlY2tvdXRUaW1lX1VzZXIgKyAkQ1ZTQ2hlY2tvdXRUaW1lX1N5czsKKworIyBDb25maWd1cmUgaW5mby4KK215ICRDb25maWdUaW1lVSA9IEdldFJlZ2V4ICJedXNlciAoWzAtOS5dKykiLCAkQ29uZmlndXJlTG9nRGF0YTsKK215ICRDb25maWdUaW1lUyA9IEdldFJlZ2V4ICJec3lzIChbMC05Ll0rKSIsICRDb25maWd1cmVMb2dEYXRhOworbXkgJENvbmZpZ1RpbWUgID0gJENvbmZpZ1RpbWVVKyRDb25maWdUaW1lUzsgICMgQ29uZmlnVGltZSA9IFVzZXIrU3lzdGVtCitteSAkQ29uZmlnV2FsbFRpbWUgPSBHZXRSZWdleCAiXnJlYWwgKFswLTkuXSspIiwkQ29uZmlndXJlTG9nRGF0YTsKKyRDb25maWdUaW1lPS0xIHVubGVzcyAkQ29uZmlnVGltZTsKKyRDb25maWdXYWxsVGltZT0tMSB1bmxlc3MgJENvbmZpZ1dhbGxUaW1lOworCisjIEJ1aWxkIGluZm8uCitteSAkQnVpbGRUaW1lVSA9IEdldFJlZ2V4ICJedXNlciAoWzAtOS5dKykiLCAkQnVpbGRMb2dEYXRhOworbXkgJEJ1aWxkVGltZVMgPSBHZXRSZWdleCAiXnN5cyAoWzAtOS5dKykiLCAkQnVpbGRMb2dEYXRhOworbXkgJEJ1aWxkVGltZSAgPSAkQnVpbGRUaW1lVSskQnVpbGRUaW1lUzsgICMgQnVpbGRUaW1lID0gVXNlcitTeXN0ZW0KK215ICRCdWlsZFdhbGxUaW1lID0gR2V0UmVnZXggIl5yZWFsIChbMC05Ll0rKSIsICRCdWlsZExvZ0RhdGE7CiskQnVpbGRUaW1lPS0xIHVubGVzcyAkQnVpbGRUaW1lOworJEJ1aWxkV2FsbFRpbWU9LTEgdW5sZXNzICRCdWlsZFdhbGxUaW1lOworCitpZiAoICRWRVJCT1NFICkgeyBwcmludCAiU0VORCBUSEUgREFUQSBWSUEgVEhFIFBPU1QgUkVRVUVTVFxuIjsgfQorCitteSAlaGFzaF9vZl9kYXRhID0gKAorICAnbWFjaGluZV9kYXRhJyA9PiAkbWFjaGluZV9kYXRhLAorICAnYnVpbGRfZGF0YScgPT4gJENvbmZpZ3VyZUxvZ0RhdGEgLiAkQnVpbGRMb2dEYXRhLAorICAnZ2NjX3ZlcnNpb24nID0+ICRnY2NfdmVyc2lvbiwKKyAgJ25pY2tuYW1lJyA9PiAkbmlja25hbWUsCisgICdkZWphZ251dGltZV93YWxsJyA9PiAiMC4wIiwKKyAgJ2RlamFnbnV0aW1lX2NwdScgPT4gIjAuMCIsCisgICdjdnNjaGVja291dHRpbWVfd2FsbCcgPT4gJENoZWNrb3V0VGltZV9XYWxsLAorICAnY3ZzY2hlY2tvdXR0aW1lX2NwdScgPT4gJENoZWNrb3V0VGltZV9DUFUsCisgICdjb25maWd0aW1lX3dhbGwnID0+ICRDb25maWdXYWxsVGltZSwKKyAgJ2NvbmZpZ3RpbWVfY3B1Jz0+ICRDb25maWdUaW1lLAorICAnYnVpbGR0aW1lX3dhbGwnID0+ICRCdWlsZFdhbGxUaW1lLAorICAnYnVpbGR0aW1lX2NwdScgPT4gJEJ1aWxkVGltZSwKKyAgJ2J1aWxkc3RhdHVzJyA9PiAkQnVpbGRTdGF0dXMsCisgICdzaW5nbGVzb3VyY2VfcHJvZ3JhbXN0YWJsZScgPT4gJFNpbmdsZVNvdXJjZVByb2dyYW1zVGFibGUsCisgICdtdWx0aXNvdXJjZV9wcm9ncmFtc3RhYmxlJyA9PiAkTXVsdGlTb3VyY2VQcm9ncmFtc1RhYmxlLAorICAnZXh0ZXJuYWxzb3VyY2VfcHJvZ3JhbXN0YWJsZScgPT4gJEV4dGVybmFsUHJvZ3JhbXNUYWJsZSwKKyAgJ2xsY2JldGFfb3B0aW9ucycgPT4gJGxsY2JldGFfb3B0aW9ucywKKyAgJ3Bhc3NpbmdfdGVzdHMnID0+ICRwYXNzZXMsCisgICdleHBmYWlsX3Rlc3RzJyA9PiAkeGZhaWxzLAorICAndW5leHBmYWlsX3Rlc3RzJyA9PiAkZmFpbHMsCisgICdhbGxfdGVzdHMnID0+ICRhbGxfdGVzdHMsCisgICdkZWphZ251dGVzdHNfcmVzdWx0cycgPT4gIkRlamFnbnUgc2tpcHBlZCBieSB1c2VyIGNob2ljZS4iLAorICAnZGVqYWdudXRlc3RzX2xvZycgPT4gIiIsCisgICdzdGFydHRpbWUnID0+ICRzdGFydHRpbWUsCisgICdlbmR0aW1lJyA9PiAkZW5kdGltZSwKKyAgJ3RhcmdldF90cmlwbGUnID0+ICR0YXJnZXRUcmlwbGUsCisKKyAgIyBVbnVzZWQsIGJ1dCBsZWZ0IGFyb3VuZCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkuCisgICd3YXJuaW5ncycgPT4gIiIsCisgICdjdnN1c2VyY29tbWl0bGlzdCcgPT4gIiIsCisgICdjdnN1c2VydXBkYXRlbGlzdCcgPT4gIiIsCisgICdjdnNhZGRlZGZpbGVzJyA9PiAiIiwKKyAgJ2N2c21vZGlmaWVkZmlsZXMnID0+ICIiLAorICAnY3ZzcmVtb3ZlZGZpbGVzJyA9PiAiIiwKKyAgJ2xpbmVzX29mX2NvZGUnID0+ICIiLAorICAnY3ZzX2ZpbGVfY291bnQnID0+IDAsCisgICdjdnNfZGlyX2NvdW50JyA9PiAwLAorICAnd2FybmluZ3NfcmVtb3ZlZCcgPT4gIiIsCisgICd3YXJuaW5nc19hZGRlZCcgPT4gIiIsCisgICduZXdfdGVzdHMnID0+ICIiLAorICAncmVtb3ZlZF90ZXN0cycgPT4gIiIsCisgICdvX2ZpbGVfc2l6ZXMnID0+ICIiLAorICAnYV9maWxlX3NpemVzJyA9PiAiIgorKTsKKworIyBXcml0ZSBvdXQgdGhlICIuLi4tc2VudGRhdGEudHh0IiBmaWxlLgorV3JpdGVTZW50RGF0YSBcJWhhc2hfb2ZfZGF0YTsKKworaWYgKCRTVUJNSVQgfHwgISgkU1VCTUlUQVVYIGVxICIiKSkgeworICBteSAkcmVzcG9uc2UgPSBTZW5kRGF0YSAkU1VCTUlUU0VSVkVSLCRTVUJNSVRTQ1JJUFQsXCVoYXNoX29mX2RhdGE7CisgIGlmKCAkVkVSQk9TRSkgeyBwcmludCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJHJlc3BvbnNlIjsgfQorfSBlbHNlIHsKKyAgcHJpbnQgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7CisgIGZvcmVhY2ggJHgoa2V5cyAlaGFzaF9vZl9kYXRhKXsKKyAgICAgIHByaW50ICIkeCAgPT4gJGhhc2hfb2ZfZGF0YXskeH1cbiI7CisgIH0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUmVtb3ZlIHRoZSBzb3VyY2UgdHJlZS4uLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N5c3RlbSAoICIkTklDRSBybSAtcmYgJEJ1aWxkRGlyIikKKyAgaWYgKCEkTk9DSEVDS09VVCBhbmQgISROT1JFTU9WRSBhbmQgISROT1JFTU9WRUFURU5EKTsKK3N5c3RlbSAoICIkTklDRSBybSAtcmYgJFdlYkRpciIpCisgIGlmICghJE5PQ0hFQ0tPVVQgYW5kICEkTk9SRU1PVkUgYW5kICEkTk9SRU1PVkVSRVNVTFRTKTsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL05pZ2h0bHlUZXN0LmdudXBsb3QgYi9zcmMvTExWTS91dGlscy9OaWdodGx5VGVzdC5nbnVwbG90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YzM5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9OaWdodGx5VGVzdC5nbnVwbG90CkBAIC0wLDAgKzEsMjE0IEBACitzZXQgdGVybWluYWwgcG5nDQorDQorIyMtLS0tLS0tIFBsb3Qgc21hbGwgRGF0ZSB2cyBMT0MgLS0tLQ0KK3NldCBvdXRwdXQgInJ1bm5pbmdfbG9jLnBuZyINCitzZXQgeGxhYmVsICJEYXRlIiANCitzZXQgeWxhYmVsICJMaW5lcyBvZiBDb2RlIg0KK3NldCB4ZGF0YSB0aW1lDQorc2V0IHRpbWVmbXQgIiVZLSVtLSVkLSVIOiVNOiVTOiINCitzZXQgZm9ybWF0IHggIiViICVkLCAlWSINCisNCitzZXQgc2l6ZSAuNzUsLjc1DQorc2V0IHh0aWNzIHJvdGF0ZQ0KK3NldCB4bGFiZWwgMCwtMQ0KK3Bsb3QgInJ1bm5pbmdfbG9jLnR4dCIgdXNpbmcgMToyIHRpdGxlICcnIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX2xvYy50eHQiIHVzaW5nIDE6MiB0aXRsZSAiRGF0ZSB2cy4gTGluZXMgb2YgQ29kZSIgd2l0aCBsaW5lcw0KKw0KKyMjLS0tLS0tLSBQbG90IGxhcmdlIERhdGUgdnMgTE9DIC0tLS0NCitzZXQgc2l6ZSAxLjUsMS41DQorc2V0IHh0aWNzIG5vcm90YXRlDQorc2V0IHhsYWJlbCAwLDANCitzZXQgb3V0cHV0ICJydW5uaW5nX2xvY19sYXJnZS5wbmciDQorcGxvdCAicnVubmluZ19sb2MudHh0IiB1c2luZyAxOjIgdGl0bGUgJycsIFwNCisgICAgICJydW5uaW5nX2xvYy50eHQiIHVzaW5nIDE6MiB0aXRsZSAiRGF0ZSB2cy4gTGluZXMgb2YgQ29kZSIgd2l0aCBsaW5lcw0KKw0KKw0KKyMgRGVsZXRlIGFsbCBsYWJlbHMuLi4NCitzZXQgbm9sYWJlbA0KKw0KKyMjLS0tLS0tLSBPbGRlbiBDQkUgcGVyZm9ybWFuY2UgLS0tLQ0KKw0KK3NldCBzaXplIC43NSwuNzUNCitzZXQgeHRpY3Mgcm90YXRlDQorc2V0IHhsYWJlbCAwLC0xDQorc2V0IG91dHB1dCAicnVubmluZ19PbGRlbl9jYmVfdGltZS5wbmciDQorc2V0IHlsYWJlbCAiQ0JFIGNvbXBpbGVkIGV4ZWN1dGlvbiB0aW1lIChzKSINCitwbG90ICJydW5uaW5nX09sZGVuX2NiZV90aW1lLnR4dCIgdSAxOjIgdCAnJyB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMToyIHQgImJoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMTozIHQgImVtM2QiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2NiZV90aW1lLnR4dCIgdSAxOjQgdCAibXN0IiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMTo1IHQgInBvd2VyIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMTo2IHQgInRzcCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fY2JlX3RpbWUudHh0IiB1IDE6NyB0ICJiaXNvcnQiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2NiZV90aW1lLnR4dCIgdSAxOjggdCAiaGVhbHRoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMTo5IHQgInBlcmltZXRlciIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fY2JlX3RpbWUudHh0IiB1IDE6MTAgdCAidHJlZWFkZCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fY2JlX3RpbWUudHh0IiB1IDE6MTEgdCAidm9yb25vaSIgXA0KKyAgIHdpdGggbGluZXMNCisNCitzZXQgc2l6ZSAxLjUsMS41DQorc2V0IHh0aWNzIG5vcm90YXRlDQorc2V0IHhsYWJlbCAwLDANCitzZXQgb3V0cHV0ICJydW5uaW5nX09sZGVuX2NiZV90aW1lX2xhcmdlLnBuZyINCitwbG90ICJydW5uaW5nX09sZGVuX2NiZV90aW1lLnR4dCIgdSAxOjIgdCAnJyB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMToyIHQgImJoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMTozIHQgImVtM2QiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2NiZV90aW1lLnR4dCIgdSAxOjQgdCAibXN0IiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMTo1IHQgInBvd2VyIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMTo2IHQgInRzcCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fY2JlX3RpbWUudHh0IiB1IDE6NyB0ICJiaXNvcnQiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2NiZV90aW1lLnR4dCIgdSAxOjggdCAiaGVhbHRoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9jYmVfdGltZS50eHQiIHUgMTo5IHQgInBlcmltZXRlciIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fY2JlX3RpbWUudHh0IiB1IDE6MTAgdCAidHJlZWFkZCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fY2JlX3RpbWUudHh0IiB1IDE6MTEgdCAidm9yb25vaSIgXA0KKyAgIHdpdGggbGluZXMNCisNCisjIy0tLS0tLS0gT2xkZW4gSklUIHBlcmZvcm1hbmNlIC0tLS0NCisNCitzZXQgc2l6ZSAuNzUsLjc1DQorc2V0IHh0aWNzIHJvdGF0ZQ0KK3NldCB4bGFiZWwgMCwtMQ0KK3NldCBvdXRwdXQgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUucG5nIg0KK3NldCB5bGFiZWwgIkpJVCBleGVjdXRpb24gdGltZSAocykiDQorcGxvdCAicnVubmluZ19PbGRlbl9qaXRfdGltZS50eHQiIHUgMToyIHQgJycgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6MiB0ICJiaCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6MyB0ICJlbTNkIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9qaXRfdGltZS50eHQiIHUgMTo0IHQgIm1zdCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6NSB0ICJwb3dlciIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6NiB0ICJ0c3AiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2ppdF90aW1lLnR4dCIgdSAxOjcgdCAiYmlzb3J0IiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9qaXRfdGltZS50eHQiIHUgMTo4IHQgImhlYWx0aCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6OSB0ICJwZXJpbWV0ZXIiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2ppdF90aW1lLnR4dCIgdSAxOjEwIHQgInRyZWVhZGQiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2ppdF90aW1lLnR4dCIgdSAxOjExIHQgInZvcm9ub2kiIFwNCisgICB3aXRoIGxpbmVzDQorDQorc2V0IHNpemUgMS41LDEuNQ0KK3NldCB4dGljcyBub3JvdGF0ZQ0KK3NldCB4bGFiZWwgMCwwDQorc2V0IG91dHB1dCAicnVubmluZ19PbGRlbl9qaXRfdGltZV9sYXJnZS5wbmciDQorcGxvdCAicnVubmluZ19PbGRlbl9qaXRfdGltZS50eHQiIHUgMToyIHQgJycgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6MiB0ICJiaCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6MyB0ICJlbTNkIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9qaXRfdGltZS50eHQiIHUgMTo0IHQgIm1zdCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6NSB0ICJwb3dlciIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6NiB0ICJ0c3AiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2ppdF90aW1lLnR4dCIgdSAxOjcgdCAiYmlzb3J0IiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9qaXRfdGltZS50eHQiIHUgMTo4IHQgImhlYWx0aCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5faml0X3RpbWUudHh0IiB1IDE6OSB0ICJwZXJpbWV0ZXIiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2ppdF90aW1lLnR4dCIgdSAxOjEwIHQgInRyZWVhZGQiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2ppdF90aW1lLnR4dCIgdSAxOjExIHQgInZvcm9ub2kiIFwNCisgICB3aXRoIGxpbmVzDQorDQorIyMtLS0tLS0tIE9sZGVuIExMQyBwZXJmb3JtYW5jZSAtLS0tDQorDQorc2V0IHNpemUgLjc1LC43NQ0KK3NldCB4dGljcyByb3RhdGUNCitzZXQgeGxhYmVsIDAsLTENCitzZXQgb3V0cHV0ICJydW5uaW5nX09sZGVuX2xsY190aW1lLnBuZyINCitzZXQgeWxhYmVsICJMTEMgY29tcGlsZWQgZXhlY3V0aW9uIHRpbWUgKHMpIg0KK3Bsb3QgInJ1bm5pbmdfT2xkZW5fbGxjX3RpbWUudHh0IiB1IDE6MiB0ICcnIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjIgdCAiYmgiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjMgdCAiZW0zZCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fbGxjX3RpbWUudHh0IiB1IDE6NCB0ICJtc3QiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjUgdCAicG93ZXIiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjYgdCAidHNwIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9sbGNfdGltZS50eHQiIHUgMTo3IHQgImJpc29ydCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fbGxjX3RpbWUudHh0IiB1IDE6OCB0ICJoZWFsdGgiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjkgdCAicGVyaW1ldGVyIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9sbGNfdGltZS50eHQiIHUgMToxMCB0ICJ0cmVlYWRkIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9sbGNfdGltZS50eHQiIHUgMToxMSB0ICJ2b3Jvbm9pIiBcDQorICAgd2l0aCBsaW5lcw0KKw0KK3NldCBzaXplIDEuNSwxLjUNCitzZXQgeHRpY3Mgbm9yb3RhdGUNCitzZXQgeGxhYmVsIDAsMA0KK3NldCBvdXRwdXQgInJ1bm5pbmdfT2xkZW5fbGxjX3RpbWVfbGFyZ2UucG5nIg0KK3Bsb3QgInJ1bm5pbmdfT2xkZW5fbGxjX3RpbWUudHh0IiB1IDE6MiB0ICcnIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjIgdCAiYmgiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjMgdCAiZW0zZCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fbGxjX3RpbWUudHh0IiB1IDE6NCB0ICJtc3QiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjUgdCAicG93ZXIiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjYgdCAidHNwIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9sbGNfdGltZS50eHQiIHUgMTo3IHQgImJpc29ydCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fbGxjX3RpbWUudHh0IiB1IDE6OCB0ICJoZWFsdGgiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2xsY190aW1lLnR4dCIgdSAxOjkgdCAicGVyaW1ldGVyIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9sbGNfdGltZS50eHQiIHUgMToxMCB0ICJ0cmVlYWRkIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9sbGNfdGltZS50eHQiIHUgMToxMSB0ICJ2b3Jvbm9pIiBcDQorICAgd2l0aCBsaW5lcw0KKw0KKw0KKyMjLS0tLS0tLSBPbGRlbiBvcHRpbWl6ZXIgdGltZSAtLS0tDQorDQorc2V0IHNpemUgLjc1LC43NQ0KK3NldCB4dGljcyByb3RhdGUNCitzZXQgeGxhYmVsIDAsLTENCitzZXQgb3V0cHV0ICJydW5uaW5nX09sZGVuX29wdF90aW1lLnBuZyINCitzZXQgeWxhYmVsICJUaW1lIHRvIHJ1biB0aGUgb3B0aW1pemVyIChzKSINCitwbG90ICJydW5uaW5nX09sZGVuX29wdF90aW1lLnR4dCIgdSAxOjIgdCAnJyB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMToyIHQgImJoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMTozIHQgImVtM2QiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX29wdF90aW1lLnR4dCIgdSAxOjQgdCAibXN0IiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMTo1IHQgInBvd2VyIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMTo2IHQgInRzcCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fb3B0X3RpbWUudHh0IiB1IDE6NyB0ICJiaXNvcnQiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX29wdF90aW1lLnR4dCIgdSAxOjggdCAiaGVhbHRoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMTo5IHQgInBlcmltZXRlciIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fb3B0X3RpbWUudHh0IiB1IDE6MTAgdCAidHJlZWFkZCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fb3B0X3RpbWUudHh0IiB1IDE6MTEgdCAidm9yb25vaSIgXA0KKyAgIHdpdGggbGluZXMNCisNCitzZXQgc2l6ZSAxLjUsMS41DQorc2V0IHh0aWNzIG5vcm90YXRlDQorc2V0IHhsYWJlbCAwLDANCitzZXQgb3V0cHV0ICJydW5uaW5nX09sZGVuX29wdF90aW1lX2xhcmdlLnBuZyINCitwbG90ICJydW5uaW5nX09sZGVuX29wdF90aW1lLnR4dCIgdSAxOjIgdCAnJyB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMToyIHQgImJoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMTozIHQgImVtM2QiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX29wdF90aW1lLnR4dCIgdSAxOjQgdCAibXN0IiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMTo1IHQgInBvd2VyIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMTo2IHQgInRzcCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fb3B0X3RpbWUudHh0IiB1IDE6NyB0ICJiaXNvcnQiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX29wdF90aW1lLnR4dCIgdSAxOjggdCAiaGVhbHRoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9vcHRfdGltZS50eHQiIHUgMTo5IHQgInBlcmltZXRlciIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fb3B0X3RpbWUudHh0IiB1IDE6MTAgdCAidHJlZWFkZCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fb3B0X3RpbWUudHh0IiB1IDE6MTEgdCAidm9yb25vaSIgXA0KKyAgIHdpdGggbGluZXMNCisNCisNCisjIy0tLS0tLS0gQnl0ZWNvZGUgc2l6ZSAtLS0tDQorDQorc2V0IHNpemUgLjc1LC43NQ0KK3NldCB4dGljcyByb3RhdGUNCitzZXQgeGxhYmVsIDAsLTENCitzZXQgb3V0cHV0ICJydW5uaW5nX09sZGVuX2J5dGVjb2RlLnBuZyINCitzZXQgeWxhYmVsICJQcm9ncmFtIGJ5dGVjb2RlIHNpemUgKGJ5dGVzKSINCitwbG90ICJydW5uaW5nX09sZGVuX2J5dGVjb2RlLnR4dCIgdSAxOjIgdCAnJyB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMToyIHQgImJoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMTozIHQgImVtM2QiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2J5dGVjb2RlLnR4dCIgdSAxOjQgdCAibXN0IiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMTo1IHQgInBvd2VyIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMTo2IHQgInRzcCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fYnl0ZWNvZGUudHh0IiB1IDE6NyB0ICJiaXNvcnQiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2J5dGVjb2RlLnR4dCIgdSAxOjggdCAiaGVhbHRoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMTo5IHQgInBlcmltZXRlciIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fYnl0ZWNvZGUudHh0IiB1IDE6MTAgdCAidHJlZWFkZCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fYnl0ZWNvZGUudHh0IiB1IDE6MTEgdCAidm9yb25vaSIgXA0KKyAgIHdpdGggbGluZXMNCisNCitzZXQgc2l6ZSAxLjUsMS41DQorc2V0IHh0aWNzIG5vcm90YXRlDQorc2V0IHhsYWJlbCAwLDANCitzZXQgb3V0cHV0ICJydW5uaW5nX09sZGVuX2J5dGVjb2RlX2xhcmdlLnBuZyINCitwbG90ICJydW5uaW5nX09sZGVuX2J5dGVjb2RlLnR4dCIgdSAxOjIgdCAnJyB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMToyIHQgImJoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMTozIHQgImVtM2QiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2J5dGVjb2RlLnR4dCIgdSAxOjQgdCAibXN0IiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMTo1IHQgInBvd2VyIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMTo2IHQgInRzcCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fYnl0ZWNvZGUudHh0IiB1IDE6NyB0ICJiaXNvcnQiIHdpdGggbGluZXMsIFwNCisgICAgICJydW5uaW5nX09sZGVuX2J5dGVjb2RlLnR4dCIgdSAxOjggdCAiaGVhbHRoIiB3aXRoIGxpbmVzLCBcDQorICAgICAicnVubmluZ19PbGRlbl9ieXRlY29kZS50eHQiIHUgMTo5IHQgInBlcmltZXRlciIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fYnl0ZWNvZGUudHh0IiB1IDE6MTAgdCAidHJlZWFkZCIgd2l0aCBsaW5lcywgXA0KKyAgICAgInJ1bm5pbmdfT2xkZW5fYnl0ZWNvZGUudHh0IiB1IDE6MTEgdCAidm9yb25vaSIgXA0KKyAgIHdpdGggbGluZXMNCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9OaWdodGx5VGVzdFRlbXBsYXRlLmh0bWwgYi9zcmMvTExWTS91dGlscy9OaWdodGx5VGVzdFRlbXBsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4YmIyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL05pZ2h0bHlUZXN0VGVtcGxhdGUuaHRtbApAQCAtMCwwICsxLDI0NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD48aGVhZD48dGl0bGU+TExWTSBUZXN0IFJlc3VsdHMgZm9yICREYXRlU3RyaW5nPC90aXRsZT48L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9d2hpdGU+Cis8Y2VudGVyPjxmb250IHNpemU9KzMgZmFjZT1WZXJkYW5hPjxiPkxMVk0gVGVzdCBSZXN1bHRzIGZvciAkRGF0ZVN0cmluZzwvYj48L2ZvbnQ+PC9jZW50ZXI+Cis8aHIgaGVpZ2h0PTE+CisKKzx0YWJsZSB3aWR0aD0xMDAlPgorPHRyPjx0ZCB2YWxpZ249dG9wIGFsaWduPWNlbnRlcj4KKworPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj48dHI+PHRkIGJnY29sb3I9IiMwMDAwMDAiPiAKKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZCBiZ2NvbG9yPSIjRERBQTc3Ij4KKzxmb250IHNpemU9KzE+PGI+U2VjdGlvbnM6PC9iPjwvZm9udD48YnI+Cis8L3RkPjwvdHI+PHRyPjx0ZCBiZ2NvbG9yPSIjRkZDQzk5IiBhbGlnbj1jZW50ZXI+Cis8YSBocmVmPSIjT3ZlcnZpZXciPk92ZXJ2aWV3PC9hPjxicj4KKzxhIGhyZWY9IiNDaGFuZ2VzIj5DaGFuZ2VzPC9hPjxicj4KKzxhIGhyZWY9IiNEZWphZ251Ij5EZWphZ251IFRlc3RzPC9hPjxicj4KKzxhIGhyZWY9IiNUcmVuZHMiPlRyZW5kczwvYT48YnI+Cis8YSBocmVmPSIjUHJvZ3JhbXMiPlByb2dyYW1zPC9hPjxicj4KKzwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPgorCis8cD4KKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+PHRyPjx0ZCBiZ2NvbG9yPSIjMDAwMDAwIj4gCis8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQgYmdjb2xvcj0iI0REQUE3NyIKKzxmb250IHNpemU9KzE+PGI+UHJldmlvdXM6PC9iPjwvZm9udD48YnI+Cis8L3RkPjwvdHI+PHRyPjx0ZCBiZ2NvbG9yPSIjRkZDQzk5Ij4KKyAgJFByZXZEYXlzTGlzdAorPC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvdGFibGU+Cis8cD4KKworPGZvbnQgc2l6ZT0rMT48Yj5CYWNrIHRvOjwvYj48L2ZvbnQ+PGJyPgorPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3Rlc3RyZXN1bHRzLyI+VGVzdCZuYnNwO1Jlc3VsdHM8L2E+PGJyPgorPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnLyI+TExWTSZuYnNwO1BhZ2U8L2E+PHA+CisKKzwvdGQ+PHRkIHZhbGlnbj10b3A+CisKKzxjZW50ZXI+Cis8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPjx0cj48dGQgYmdjb2xvcj0iIzAwMDAwMCI+IAorPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZCBiZ2NvbG9yPSIjRERBQTc3IgorPGZvbnQgc2l6ZT0rMiBmYWNlPVZlcmRhbmE+PGI+PGEgbmFtZT0iT3ZlcnZpZXciPlRvZGF5J3MgVGVzdCBSZXN1bHRzIE92ZXJ2aWV3PC9mb250PjwvYj4KKzwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPjxwPgorCis8IS0tIFJ1bm5pbmcgTE9DIGdyYXBoIC0tPgorPHRhYmxlIGFsaWduPXJpZ2h0PgorPHRyPjx0ZD4KKzxhIGhyZWY9InJ1bm5pbmdfbG9jX2xhcmdlLnBuZyIKKyAgID48aW1nIGJvcmRlcj0wIHdpZHRoPTQ4MCBoZWlnaHQ9MzYwIHNyYz0icnVubmluZ19sb2MucG5nIj48L2E+Cis8L3RkPjwvdHI+Cis8dHI+PHRkIGFsaWduPWNlbnRlcj5MaW5lcyBPZiBDb2RlIG92ZXIgVGltZTxicj4KKzxmb250IHNpemU9LTE+PGEgaHJlZj0icnVubmluZ19sb2NfbGFyZ2UucG5nIj5DbGljayBmb3IgbGFyZ2VyIHZpZXc8L2E+PC9mb250PgorPC90ZD48L3RyPgorPC90YWJsZT4KKworPGgyPk5pZ2h0bHkgVGVzdCBPdmVydmlldzo8L2gyPgorPHVsPgorICA8bGk+U3RhcnQ6IDxiPiRUZXN0U3RhcnRUaW1lPC9iPjwvbGk+CisgIDxsaT5GaW5pc2g6IDxiPiRUZXN0RmluaXNoVGltZTwvYj48L2xpPgorICA8bGk+UGxhdGZvcm06IDxiPiRUZXN0UGxhdGZvcm08L2I+PC9saT4KKzwvdWw+Cis8aDI+Q1ZTIFRyZWUgT3ZlcnZpZXc6PC9oMj4KKzx1bD4KKzxsaT48YSBocmVmPSIkREFURS1DVlMtTG9nLnR4dCI+Q1ZTIENoZWNrb3V0IExvZzwvYT4KKzx1bD4KKyAgICA8Yj4kTnVtRGlyc0luQ1ZTPC9iPiBkaXJzLCA8Yj4kTnVtRmlsZXNJbkNWUzwvYj4gZmlsZXMsIDxiPiRMT0M8L2I+CisgICAgbGluZXMgb2YgY29kZSwgY2hlY2tlZCBvdXQgaW4gPGI+JENWU0NoZWNrb3V0VGltZTwvYj4gc2Vjb25kczxicj48L3VsPgorPGxpPjxhIGhyZWY9IiREQVRFLUJ1aWxkLUxvZy50eHQiPkNvbXBpbGF0aW9uIExvZzwvYT4KKzx0YWJsZT4KKzx0cj48dGQ+PGI+SXRlbTwvYj48L3RkPjx0ZD48Yj5DUFUgVGltZTwvYj48L3RkPjx0ZD48Yj5XYWxsIENsb2NrPC9iPjwvdGQ+PC90cj4KKzx0cj48dGQ+Q29uZmlndXJlIENWUyBUcmVlPC90ZD48dGQ+JENvbmZpZ1RpbWU8L3RkPjx0ZD4kQ29uZmlnV2FsbFRpbWU8L3RkPjwvdHI+Cis8dHI+PHRkPkJ1aWxkIENWUyBUcmVlPC90ZD48dGQ+JEJ1aWxkVGltZTwvdGQ+PHRkPiRCdWlsZFdhbGxUaW1lPC90ZD48L3RyPgorPHRyPjx0ZD5SdW4gRGVqYWdudSBUZXN0czwvdGQ+PHRkPiREZWphZ251VGltZTwvdGQ+PHRkPiREZWphZ251V2FsbFRpbWU8L3RkPjwvdHI+Cis8L3RhYmxlPjwvbGk+Cis8bGk+TnVtYmVyIG9mIG9iamVjdCBmaWxlcyBjb21waWxlZDogPGI+JE51bU9iamVjdHM8L2I+PC9saT4KKzxsaT5OdW1iZXIgb2YgbGlicmFyaWVzIGxpbmtlZDogPGI+JE51bUxpYnJhcmllczwvYj48L2xpPgorPGxpPk51bWJlciBvZiBleGVjdXRhYmxlcyBsaW5rZWQ6PGI+ICROdW1FeGVjdXRhYmxlczwvYj48L2xpPgorPGxpPkJ1aWxkIFN0YXR1czogJEJ1aWxkU3RhdHVzPC9saT4KKzwvdWw+CisKKzxoMj5XYXJuaW5ncyBkdXJpbmcgdGhlIGJ1aWxkOjwvaDI+CiskV2FybmluZ3NMaXN0CisKKzxicj48YnI+PGNlbnRlcj4KKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+PHRyPjx0ZCBiZ2NvbG9yPSIjMDAwMDAwIj4gCis8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkIGJnY29sb3I9IiNEREFBNzciCis8Zm9udCBzaXplPSsyIGZhY2U9VmVyZGFuYT48Yj48YSBuYW1lPSJDaGFuZ2VzIj5DaGFuZ2VzIGZyb20gWWVzdGVyZGF5PC9mb250PjwvYj4KKzwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPjxwPgorCis8aDI+Q2hhbmdlcyB0byBDVlM6PC9oMj4KKzx1bD4KKzxsaT5Vc2VycyB3aG8gY29tbWl0dGVkIHRvIENWUzogPGI+JFVzZXJDb21taXRMaXN0PC9iPgorPGxpPlVzZXJzIHdobyB1cGRhdGVkIGZyb20gQ1ZTOiA8Yj4kVXNlclVwZGF0ZUxpc3Q8L2I+Cis8bGk+QWRkZWQgRmlsZXM6ICAgICRBZGRlZEZpbGVzTGlzdAorPGxpPk1vZGlmaWVkIEZpbGVzOiAkTW9kaWZpZWRGaWxlc0xpc3QKKzxsaT5SZW1vdmVkIEZpbGVzOiAgJFJlbW92ZWRGaWxlc0xpc3QKKzwvdWw+PHA+CisKKzxoMj5DaGFuZ2VzIHRvIFdhcm5pbmdzOjwvaDI+Cis8cD5XYXJuaW5ncyBBZGRlZDo8L3A+CiskV2FybmluZ3NBZGRlZAorPHA+V2FybmluZ3MgUmVtb3ZlZDo8L3A+CiskV2FybmluZ3NSZW1vdmVkCisKKzxoMj5DaGFuZ2VzIGluIHRoZSB0ZXN0IHN1aXRlOjwvaDI+Cis8dWw+Cis8bGk+TmV3IFRlc3RzOiAkVGVzdHNBZGRlZAorPGxpPlJlbW92ZWQgVGVzdHM6ICRUZXN0c1JlbW92ZWQKKzxsaT5OZXdseSBwYXNzaW5nIHRlc3RzOiAkVGVzdHNGaXhlZAorPGxpPk5ld2x5IGZhaWxpbmcgdGVzdHM6ICRUZXN0c0Jyb2tlbgorPC91bD4KKzwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+CisKKworPGJyLz48YnIvPjxjZW50ZXI+Cis8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPjx0cj48dGQgYmdjb2xvcj0iIzAwMDAwMCI+IAorPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZCBiZ2NvbG9yPSIjRERBQTc3IgorPGZvbnQgc2l6ZT0rMiBmYWNlPVZlcmRhbmE+PGI+PGEgbmFtZT0iRGVqYWdudSI+RGVqYWdudSBUZXN0IFJlc3VsdHM8L2ZvbnQ+PC9iPgorPC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvdGFibGU+PC9jZW50ZXI+Cis8YnIvPgorJERlamFnbnVUZXN0UmVzdWx0cworPHA+QSBjb21wbGV0ZSBsb2cgb2YgdGVzdGluZyA8YSBocmVmPSIkREFURS1EZWphZ251LXRlc3RydW4ubG9nIj5GZWF0dXJlIGFuZCBSZWdyZXNzaW9uPC9hPiBpcyBhdmFpbGFibGUgZm9yIGZ1cnRoZXIgYW5hbHlzaXMuPC9wPgorCis8YnI+PGJyPjxjZW50ZXI+Cis8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPjx0cj48dGQgYmdjb2xvcj0iIzAwMDAwMCI+IAorPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZCBiZ2NvbG9yPSIjRERBQTc3IgorPGZvbnQgc2l6ZT0rMiBmYWNlPVZlcmRhbmE+PGI+PGEgbmFtZT0iVHJlbmRzIj5DaGFuZ2VzIE92ZXIgVGltZTwvZm9udD48L2I+Cis8L3RkPjwvdHI+PC90YWJsZT48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj48cD4KKworCitIZXJlIGFyZSBzb21lIGNoYXJ0cyBzaG93aW5nIGhvdyB0aGUgTExWTSBvcHRpbWl6ZXIgYW5kIGNvZGUgZ2VuZXJhdG9ycyBhcmUKK2NoYW5naW5nIG92ZXIgdGltZS4gIEZvciBub3cgd2UgdXNlIHRoZSBPbGRlbiBiZW5jaG1hcmsgc3VpdGUgdG8gbWVhc3VyZSB0aGlzLAorYnV0IGV2ZW50dWFsbHkgd2Ugd2lsbCBzd2l0Y2ggdG8gdXNpbmcgU1BFQyBDUFUyMDAwLiAgQWxsIHByb2dyYW1zIGFyZSBydW4gd2l0aAorIkxBUkdFX1BST0JMRU1fU0laRSIgZW5hYmxlZC4gIENsaWNrIG9uIGFueSBvZiB0aGUgY2hhcnRzIHRvIGdldCBhIGxhcmdlcgordmVyc2lvbi48cD4KKworPGgyPkNvbXBpbGF0aW9uIE1lYXN1cmVtZW50czo8L2gyPgorCis8dGFibGUgYm9yZGVyPSIwIiBhbGlnbj1jZW50ZXI+Cis8dHI+Cis8dGQgd2lkdGg9NTAlIGFsaWduPWNlbnRlcj4KKzxhIGhyZWY9InJ1bm5pbmdfT2xkZW5fYnl0ZWNvZGVfbGFyZ2UucG5nIj48aW1nIHdpZHRoPTQ4MCBoZWlnaHQ9MzYwIGJvcmRlcj0wIHNyYz0icnVubmluZ19PbGRlbl9ieXRlY29kZS5wbmciPjwvYT48YnI+CitTaXplIG9mIExMVk0gYnl0ZWNvZGUgZmlsZXMKKzwvdGQ+Cis8dGQgd2lkdGg9NTAlIGFsaWduPWNlbnRlcj4KKzxhIGhyZWY9InJ1bm5pbmdfT2xkZW5fb3B0X3RpbWVfbGFyZ2UucG5nIj48aW1nIHdpZHRoPTQ4MCBoZWlnaHQ9MzYwIGJvcmRlcj0wIHNyYz0icnVubmluZ19PbGRlbl9vcHRfdGltZS5wbmciPjwvYT48YnI+CitUaW1lIHRvIHJ1biB0aGUgTExWTSBvcHRpbWl6ZXIgb24gZWFjaCBwcm9ncmFtCis8L3RkPjwvdHI+Cis8L3RhYmxlPgorCis8aDI+UHJvZ3JhbSBFeGVjdXRpb24gTWVhc3VyZW1lbnRzOjwvaDI+CisKKzx0YWJsZSBib3JkZXI9IjAiIGFsaWduPWNlbnRlcj4KKzx0cj4KKzx0ZCB3aWR0aD01MCUgYWxpZ249Y2VudGVyPgorPGEgaHJlZj0icnVubmluZ19PbGRlbl9jYmVfdGltZV9sYXJnZS5wbmciPjxpbWcgd2lkdGg9NDgwIGhlaWdodD0zNjAgYm9yZGVyPTAgc3JjPSJydW5uaW5nX09sZGVuX2NiZV90aW1lLnBuZyI+PC9hPjxicj4KK0V4ZWN1dGlvbiB0aW1lIGZvciBDQkUgZ2VuZXJhdGVkIGV4ZWN1dGFibGUKKzwvdGQ+Cis8dGQgd2lkdGg9NTAlIGFsaWduPWNlbnRlcj4KKzxhIGhyZWY9InJ1bm5pbmdfT2xkZW5fbGxjX3RpbWVfbGFyZ2UucG5nIj48aW1nIHdpZHRoPTQ4MCBoZWlnaHQ9MzYwIGJvcmRlcj0wIHNyYz0icnVubmluZ19PbGRlbl9sbGNfdGltZS5wbmciPjwvYT48YnI+CitFeGVjdXRpb24gdGltZSBmb3IgdGhlIExMQyBnZW5lcmF0ZWQgZXhlY3V0YWJsZQorPC90ZD48L3RyPgorCis8dHI+Cis8dGQgYWxpZ249Y2VudGVyPgorPGEgaHJlZj0icnVubmluZ19PbGRlbl9qaXRfdGltZV9sYXJnZS5wbmciPjxpbWcgd2lkdGg9NDgwIGhlaWdodD0zNjAgYm9yZGVyPTAgc3JjPSJydW5uaW5nX09sZGVuX2ppdF90aW1lLnBuZyI+PC9hPjxicj4KK0V4ZWN1dGlvbiB0aW1lIGZvciBwcm9ncmFtIGluIHRoZSBKSVQKKzwvdGQ+Cis8dGQ+PC90ZD48L3RyPgorPC90YWJsZT4KKworCisKKworPGJyPjxicj48Y2VudGVyPgorPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj48dHI+PHRkIGJnY29sb3I9IiMwMDAwMDAiPiAKKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQgYmdjb2xvcj0iI0REQUE3NyIKKzxmb250IHNpemU9KzIgZmFjZT1WZXJkYW5hPjxiPjxhIG5hbWU9IlByb2dyYW1zIj5Qcm9ncmFtIFRlc3RzPC9mb250PjwvYj4KKzwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPjxwPgorCitUaGlzIHNlY3Rpb24gdGVzdHMgTExWTSBvbiBhIHZhcmlldHkgb2YgcHJvZ3JhbXMgaW4gdGhlIHRlc3Qgc3VpdGUuICBUaGlzCitpbmNsdWRlcyBiZW5jaG1hcmsgc3VpdGVzIGxpa2UgdGhlIE9sZGVuLCBNY0NhdCwgUHRyZGlzdCwgYW5kIFNQRUMgYmVuY2htYXJrcyBhcword2VsbCBhcyBhIGZldyByYW5kb20gcHJvZ3JhbXMgd2l0aCB0ZXN0IGlucHV0cy4gIFRoaXMgc2VjdGlvbiBpcyBtZWFudCB0byB0cmFjaworaG93IHN0YWJsZSBMTFZNIGlzIGFzIGEgd2hvbGUuIEEgZmFpbHVyZSBpbiB0aGUgZXhlY3V0aW9uIG9mIGFueSB0ZXN0IGlzIG1hcmtlZAord2l0aCBhbiBhc3RlcmlzazogYConLiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGVzIGFyZTo8cD4KKworPG9sPgorPGxpPjxhIG5hbWU9IlByb2dyYW0iPlByb2dyYW08L2E+IC0gVGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gZm9yIHRoYXQgcm93LjwvbGk+Cis8bGk+PGEgbmFtZT0iR0NDQVMiPkdDQ0FTPC9hPiAtIFRpbWUgdG8gcnVuIExMVk0gb3B0aW1pemVycyBvbiB0aGUgcHJvZ3JhbS48L2xpPgorPGxpPjxhIG5hbWU9IkJ5dGVjb2RlIj5CeXRlY29kZTwvYT4gLSBUaGUgc2l6ZSBvZiB0aGUgYnl0ZWNvZGUgZm9yIHRoZQorICAgIHByb2dyYW08L2xpPgorPGxpPjxhIG5hbWU9Ikluc3RycyI+SW5zdHJzPC9hPiAtIFRoZSBudW1iZXIgb2YgTExWTSBpbnN0cnVjdGlvbnMgaW4gdGhlCisgICAgY29tcGlsZWQgYnl0ZWNvZGU8L2xpPgorPGxpPjxhIG5hbWU9IkxMQzxicj5jb21waWxlIj5MTEMgY29tcGlsZTwvYT4gLSBUaGUgdGltZSB0YWtlbiBjb21waWxlIHdpdGgKKyAgICBMTEMgKHRoZSBzdGF0aWMgYmFja2VuZCk8L2xpPgorPGxpPjxhIG5hbWU9IkpJVDxicj5jb2RlZ2VuIj5KSVQgY29kZWdlbjwvYT4gLSBUaGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gdGhlCisgICAgSklUIGl0c2VsZiwgaW5zdGVhZCBvZiBleGVjdXRpbmcgdGhlIHByb2dyYW0uPC9saT4KKzxsaT48YSBuYW1lPSJNYWNoaW5lPGJyPmNvZGUiPk1hY2hpbmUgY29kZTwvYT4gLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIG1hY2hpbmUKKyAgICBjb2RlIGdlbmVyYXRlZCBieSB0aGUgSklULjwvbGk+Cis8bGk+PGEgbmFtZT0iR0NDIj5HQ0M8L2E+IC0gVGhlIHRpbWUgdGFrZW4gdG8gZXhlY3V0ZSB0aGUgcHJvZ3JhbSB3aGVuIGNvbXBpbGVkCisgICAgd2l0aCBHQ0MgLU8yLjwvbGk+Cis8bGk+PGEgbmFtZT0iQ0JFIj5DQkU8L2E+IC0gVGhlIHRpbWUgdGFrZW4gdG8gZXhlY3V0ZSB0aGUgcHJvZ3JhbSBhZnRlcgorICAgIGNvbXBpbGF0aW9uIHRocm91Z2ggdGhlIEMgYmFja2VuZCwgY29tcGlsZWQgd2l0aCAtTzIuPC9saT4KKzxsaT48YSBuYW1lPSJMTEMiPkxMQzwvYT4gLSBIb3cgbG9uZyBkb2VzIHRoZSBwcm9ncmFtIGdlbmVyYXRlZCBieSB0aGUgc3RhdGljCisgICAgYmFja2VuZCBMTEMgdGFrZSB0byBleGVjdXRlIDwvbGk+Cis8bGk+PGEgbmFtZT0iSklUIj5KSVQ8L2E+IC0gVGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHJ1bm5pbmcgdGhlCisgICAgcHJvZ3JhbSB3aXRoIHRoZSBKSVQ7IHRoaXMgaW5jbHVkZXMgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwaGFzZSAobGlzdGVkIGFib3ZlKQorICAgIGFuZCBhY3R1YWxseSBydW5uaW5nIHRoZSBwcm9ncmFtLjwvbGk+Cis8bGk+PGEgbmFtZT0iR0NDL0xMQyI+R0NDL0xMQzwvYT4gLSBUaGUgc3BlZWQtdXAgb2YgdGhlIExMQyBvdXRwdXQgdnMgdGhlIG5hdGl2ZSAKKyAgICBHQ0Mgb3V0cHV0OiBncmVhdGVyIHRoYW4gMSBpcyBhIHNwZWVkdXAsIGxlc3MgdGhhbiAxIGlzIGEgc2xvd2Rvd24uPC9saT4KKzxsaT48YSBuYW1lPSJHQ0MvQ0JFIj5HQ0MvQ0JFPC9hPiAtIFRoZSBzcGVlZC11cCBvZiB0aGUgQ0JFIG91dHB1dCB2cyB0aGUgbmF0aXZlIAorICAgIEdDQyBvdXRwdXQ6IGdyZWF0ZXIgdGhhbiAxIGlzIGEgc3BlZWR1cCwgbGVzcyB0aGFuIDEgaXMgYSBzbG93ZG93bi48L2xpPgorPGxpPjxhIG5hbWU9IkxMQy1CRVRBIj5MTEMtQkVUQTwvYT4gLSBIb3cgbG9uZyBkb2VzIHRoZSBwcm9ncmFtIGdlbmVyYXRlZCBieSB0aGUgc3RhdGljCisgICAgYmFja2VuZCBMTEMgdGFrZSB0byBleGVjdXRlIHRoZSBwcm9ncmFtLCB3aGVuIGNvbXBpbGVkIHdpdGggbmV3IGV4cGVyaW1lbnRhbCAKKyAgICBmZWF0dXJlcy4gIFRoaXMgaXMgdGVtcG9yYXJ5LCBmb3IgdHVuaW5nLjwvbGk+Cis8L29sPjxwPgorCitBIGNvbXBsZXRlIGxvZyBvZiB0ZXN0aW5nIAorPGEgaHJlZj0iJERBVEUtU2luZ2xlU291cmNlLVByb2dyYW1UZXN0LnR4dC5neiI+U2luZ2xlU291cmNlPC9hPiwgCis8YSBocmVmPSIkREFURS1NdWx0aVNvdXJjZS1Qcm9ncmFtVGVzdC50eHQuZ3oiPk11bHRpU291cmNlPC9hPiwgYW5kCis8YSBocmVmPSIkREFURS1FeHRlcm5hbC1Qcm9ncmFtVGVzdC50eHQuZ3oiPkV4dGVybmFsPC9hPiBwcm9ncmFtcyBhcmUKK2F2YWlsYWJsZSBmb3IgZnVydGhlciBhbmFseXNpcy4KKworPGgyPlByb2dyYW1zL0V4dGVybmFsPC9oMj4KKworPGNlbnRlcj4KKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+PHRyPjx0ZCBiZ2NvbG9yPSIjMDAwMDAwIj4gCiskRXh0ZXJuYWxQcm9ncmFtc1RhYmxlCis8L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4KKworPGgyPlByb2dyYW1zL011bHRpU291cmNlPC9oMj4KKworPGNlbnRlcj4KKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+PHRyPjx0ZCBiZ2NvbG9yPSIjMDAwMDAwIj4gCiskTXVsdGlTb3VyY2VQcm9ncmFtc1RhYmxlCis8L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4KKworPGgyPlByb2dyYW1zL1NpbmdsZVNvdXJjZTwvaDI+CisKKzxjZW50ZXI+Cis8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPjx0cj48dGQgYmdjb2xvcj0iIzAwMDAwMCI+IAorJFNpbmdsZVNvdXJjZVByb2dyYW1zVGFibGUKKzwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPgorCis8L3RkPjwvdHI+PC9odG1sPgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9PbGRlbkRhdGFSZWNvdmVyLnBsIGIvc3JjL0xMVk0vdXRpbHMvT2xkZW5EYXRhUmVjb3Zlci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc4Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvT2xkZW5EYXRhUmVjb3Zlci5wbApAQCAtMCwwICsxLDM3IEBACisjdGhpcyBzY3JpcHQgaXMgaW50ZW5kZWQgdG8gaGVscCByZWNvdmVyIHRoZSBydW5uaW5nIGdyYXBocyB3aGVuCisjdGhlIG5pZ2h0bHkgdGVzdGVyIGRlY2lkZXMgdG8gZWF0IHRoZW0uCisKKyN6Z3JlcCAtRSAiKD09PT09PT09PSl8KFRFU1QtUkVTVUxULWxsYy10aW1lKSIgKi1PbGRlbi10ZXN0cy50eHQqIHxwZXJsIHRoaXMgPiBmaWxlCisjemdyZXAgLUUgIig9PT09PT09PT0pfChURVNULVJFU1VMVC1jb21waWxlLipiYykiICotT2xkZW4tdGVzdHMudHgqIHxwZXJsIHRoaXMgPmZpbGUKKword2hpbGUgKDw+KSB7CisgIGlmICgvKFxkKi1cZCotXGQqKS0uKj09PT09PT09PS4qXC8oLiopXCcgUHJvZ3JhbS8pIHsKKyMgICAgcHJpbnQgIiQxICQyXG4iOworICAgICRjdXJQID0gJDI7CisgICAgJGN1ckQgPSAkMTsKKyAgICAkZGF0ZXN7JDF9ID0gMTsKKyAgfSBlbHNpZiAoLyhcZCotXGQqLVxkKiktLipURVNULVJFU1VMVC0uKjogcHJvZ3JhbSAoXGQqXC5cZCopLykgeworIyAgICBwcmludCAiJDEgJDJcbiI7CisgICAgaWYgKCRjdXJEIGVxICQxKSB7CisgICAgICAkJGRhdGF7JGN1ckR9eyRjdXJQfSA9ICQyOworICAgIH0KKyAgfSBlbHNpZiAoLyhcZCotXGQqLVxkKiktLipURVNULVJFU1VMVC0uKjogKFxkKikvKSB7CisjICAgIHByaW50ICIkMSAkMlxuIjsKKyAgICBpZiAoJGN1ckQgZXEgJDEpIHsKKyAgICAgICQkZGF0YXskY3VyRH17JGN1clB9ID0gJDI7CisgICAgfQorICB9Cit9CitAcHJvZ3MgPSAoImJoIiwgImVtM2QiLCAibXN0IiwgInBvd2VyIiwgInRzcCIsICJiaXNvcnQiLCAiaGVhbHRoIiwgInBlcmltZXRlciIsICJ0cmVlYWRkIiwgInZvcm9ub2kiKTsKKworZm9yZWFjaCAkZGF0ZSAoc29ydCBrZXlzICVkYXRlcykgeworICBwcmludCAiJGRhdGU6ICI7CisgIGZvcmVhY2ggJHByb2cgKEBwcm9ncykgeworICAgIGlmICgkJGRhdGF7JGRhdGV9eyRwcm9nfSkgeworICAgICAgcHJpbnQgIiAkJGRhdGF7JGRhdGV9eyRwcm9nfSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ICIgMCI7CisgICAgfQorICB9CisgIHByaW50ICJcbiI7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9QZXJmZWN0U2h1ZmZsZS9NYWtlZmlsZSBiL3NyYy9MTFZNL3V0aWxzL1BlcmZlY3RTaHVmZmxlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzA5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9QZXJmZWN0U2h1ZmZsZS9NYWtlZmlsZQpAQCAtMCwwICsxLDE4IEBACisjIz09PS0gdXRpbHMvUGVyZmVjdFNodWZmbGUvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIyAKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIyAKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMID0gLi4vLi4KK1RPT0xOQU1FID0gbGx2bS1QZXJmZWN0U2h1ZmZsZQorTk9fSU5TVEFMTCA9IDEKKworIyBUaGlzIHRvb2wgaGFzIG5vIHBsdWdpbnMsIG9wdGltaXplIHN0YXJ0dXAgdGltZS4KK1RPT0xfTk9fRVhQT1JUUyA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvUGVyZmVjdFNodWZmbGUvUGVyZmVjdFNodWZmbGUuY3BwIGIvc3JjL0xMVk0vdXRpbHMvUGVyZmVjdFNodWZmbGUvUGVyZmVjdFNodWZmbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGE3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9QZXJmZWN0U2h1ZmZsZS9QZXJmZWN0U2h1ZmZsZS5jcHAKQEAgLTAsMCArMSw1NzEgQEAKKy8vPT09LS0gUGVyZmVjdFNodWZmbGUuY3BwIC0gUGVyZmVjdCBTaHVmZmxlIEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbXB1dGVzIGFuIG9wdGltYWwgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIGZvciBkb2luZyBhbGwgc2h1ZmZsZXMKKy8vIG9mIHR3byA0LWVsZW1lbnQgdmVjdG9ycy4gIFdpdGggYSByZWxlYXNlIGJ1aWxkIGFuZCB3aGVuIGNvbmZpZ3VyZWQgdG8gZW1pdAorLy8gYW4gYWx0aXZlYyBpbnN0cnVjdGlvbiB0YWJsZSwgdGhpcyB0YWtlcyBhYm91dCAzMHMgdG8gcnVuIG9uIGEgMi43R2h6CisvLyBQb3dlclBDIEc1LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkbGliPgorc3RydWN0IE9wZXJhdG9yOworCisvLyBNYXNrcyBhcmUgNC1uaWJibGUgaGV4IG51bWJlcnMuICBWYWx1ZXMgMC03IGluIGFueSBuaWJibGUgbWVhbnMgdGhhdCBpdCB0YWtlcworLy8gYW4gZWxlbWVudCBmcm9tIHRoYXQgdmFsdWUgb2YgdGhlIGlucHV0IHZlY3RvcnMuICBBIHZhbHVlIG9mIDggbWVhbnMgdGhlCisvLyBlbnRyeSBpcyB1bmRlZmluZWQuCisKKy8vIE1hc2sgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgTWFrZU1hc2sodW5zaWduZWQgVjAsIHVuc2lnbmVkIFYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWMiwgdW5zaWduZWQgVjMpIHsKKyAgcmV0dXJuIChWMCA8PCAoMyo0KSkgfCAoVjEgPDwgKDIqNCkpIHwgKFYyIDw8ICgxKjQpKSB8IChWMyA8PCAoMCo0KSk7Cit9CisKKy8vLyBnZXRNYXNrRWx0IC0gUmV0dXJuIGVsZW1lbnQgTiBvZiB0aGUgc3BlY2lmaWVkIG1hc2suCitzdGF0aWMgdW5zaWduZWQgZ2V0TWFza0VsdCh1bnNpZ25lZCBNYXNrLCB1bnNpZ25lZCBFbHQpIHsKKyAgcmV0dXJuIChNYXNrID4+ICgoMy1FbHQpKjQpKSAmIDB4RjsKK30KKworc3RhdGljIHVuc2lnbmVkIHNldE1hc2tFbHQodW5zaWduZWQgTWFzaywgdW5zaWduZWQgRWx0LCB1bnNpZ25lZCBOZXdWYWwpIHsKKyAgdW5zaWduZWQgRmllbGRTaGlmdCA9ICgoMy1FbHQpKjQpOworICByZXR1cm4gKE1hc2sgJiB+KDB4RiA8PCBGaWVsZFNoaWZ0KSkgfCAoTmV3VmFsIDw8IEZpZWxkU2hpZnQpOworfQorCisvLyBSZWplY3QgZWxlbWVudHMgd2hlcmUgdGhlIHZhbHVlcyBhcmUgOS0xNS4KK3N0YXRpYyBib29sIGlzVmFsaWRNYXNrKHVuc2lnbmVkIHNob3J0IE1hc2spIHsKKyAgdW5zaWduZWQgc2hvcnQgVW5kZWZCaXRzID0gTWFzayAmIDB4ODg4ODsKKyAgcmV0dXJuIChNYXNrICYgKChVbmRlZkJpdHMgPj4gMSl8KFVuZGVmQml0cz4+Mil8KFVuZGVmQml0cz4+MykpKSA9PSAwOworfQorCisvLy8gaGFzVW5kZWZFbGVtZW50cyAtIFJldHVybiB0cnVlIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIG1hc2sgYXJlIHVuZGVmcworLy8vCitzdGF0aWMgYm9vbCBoYXNVbmRlZkVsZW1lbnRzKHVuc2lnbmVkIHNob3J0IE1hc2spIHsKKyAgcmV0dXJuIChNYXNrICYgMHg4ODg4KSAhPSAwOworfQorCisvLy8gaXNPbmx5TEhTTWFzayAtIFJldHVybiB0cnVlIGlmIHRoaXMgbWFzayBvbmx5IHJlZmVycyB0byBpdHMgTEhTLCBub3QKKy8vLyBpbmNsdWRpbmcgdW5kZWYgdmFsdWVzLi4KK3N0YXRpYyBib29sIGlzT25seUxIU01hc2sodW5zaWduZWQgc2hvcnQgTWFzaykgeworICByZXR1cm4gKE1hc2sgJiAweDQ0NDQpID09IDA7Cit9CisKKy8vLyBnZXRMSFNPbmx5TWFzayAtIEdpdmVuIGEgbWFzayB0aGF0IHJlZmVycyB0byBpdHMgTEhTIGFuZCBSSFMsIG1vZGlmeSBpdCB0bworLy8vIHJlZmVyIHRvIHRoZSBMSFMgb25seSAoZm9yIHdoZW4gb25lIGFyZ3VtZW50IHZhbHVlIGlzIHBhc3NlZCBpbnRvIHRoZSBzYW1lCisvLy8gZnVuY3Rpb24gdHdpY2UpLgorI2lmIDAKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBnZXRMSFNPbmx5TWFzayh1bnNpZ25lZCBzaG9ydCBNYXNrKSB7CisgIHJldHVybiBNYXNrICYgMHhCQkJCOyAgLy8gS2VlcCBvbmx5IExIUyBhbmQgVW5kZWZzLgorfQorI2VuZGlmCisKKy8vLyBnZXRDb21wcmVzc2VkTWFzayAtIFR1cm4gYSAxNi1iaXQgdW5jb21wcmVzc2VkIG1hc2sgKHdoZXJlIGVhY2ggZWx0IHVzZXMgNAorLy8vIGJpdHMpIGludG8gYSBjb21wcmVzc2VkIDEzLWJpdCBtYXNrLCB3aGVyZSBlYWNoIGVsdCBpcyBtdWx0aXBsaWVkIGJ5IDkuCitzdGF0aWMgdW5zaWduZWQgZ2V0Q29tcHJlc3NlZE1hc2sodW5zaWduZWQgc2hvcnQgTWFzaykgeworICByZXR1cm4gZ2V0TWFza0VsdChNYXNrLCAwKSo5KjkqOSArIGdldE1hc2tFbHQoTWFzaywgMSkqOSo5ICsKKyAgICAgICAgIGdldE1hc2tFbHQoTWFzaywgMikqOSAgICAgKyBnZXRNYXNrRWx0KE1hc2ssIDMpOworfQorCitzdGF0aWMgdm9pZCBQcmludE1hc2sodW5zaWduZWQgaSwgc3RkOjpvc3RyZWFtICZPUykgeworICBPUyA8PCAiPCIgPDwgKGNoYXIpKGdldE1hc2tFbHQoaSwgMCkgPT0gOCA/ICd1JyA6ICgnMCcrZ2V0TWFza0VsdChpLCAwKSkpCisgICAgIDw8ICIsIiA8PCAoY2hhcikoZ2V0TWFza0VsdChpLCAxKSA9PSA4ID8gJ3UnIDogKCcwJytnZXRNYXNrRWx0KGksIDEpKSkKKyAgICAgPDwgIiwiIDw8IChjaGFyKShnZXRNYXNrRWx0KGksIDIpID09IDggPyAndScgOiAoJzAnK2dldE1hc2tFbHQoaSwgMikpKQorICAgICA8PCAiLCIgPDwgKGNoYXIpKGdldE1hc2tFbHQoaSwgMykgPT0gOCA/ICd1JyA6ICgnMCcrZ2V0TWFza0VsdChpLCAzKSkpCisgICAgIDw8ICI+IjsKK30KKworLy8vIFNodWZmbGVWYWwgLSBUaGlzIHJlcHJlc2VudHMgYSBzaHVmZmxldmVjdG9yIG9wZXJhdGlvbi4KK3N0cnVjdCBTaHVmZmxlVmFsIHsKKyAgdW5zaWduZWQgQ29zdDsgIC8vIE51bWJlciBvZiBpbnN0cnMgdXNlZCB0byBnZW5lcmF0ZSB0aGlzIHZhbHVlLgorICBPcGVyYXRvciAqT3A7ICAgLy8gVGhlIE9wZXJhdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgdmFsdWUuCisgIHVuc2lnbmVkIHNob3J0IEFyZzAsIEFyZzE7ICAvLyBJbnB1dCBvcGVyYW5kcyBmb3IgdGhpcyB2YWx1ZS4KKworICBTaHVmZmxlVmFsKCkgOiBDb3N0KDEwMDAwMDApIHt9Cit9OworCisKKy8vLyBTaHVmVGFiIC0gVGhpcyBpcyB0aGUgYWN0dWFsIHNodWZmbGUgdGFibGUgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGdlbmVyYXRlLgorLy8vCitzdGF0aWMgU2h1ZmZsZVZhbCBTaHVmVGFiWzY1NTM2XTsKKworLy8vIFRoZU9wZXJhdG9ycyAtIEFsbCBvZiB0aGUgb3BlcmF0b3JzIHRoYXQgdGhpcyB0YXJnZXQgc3VwcG9ydHMuCitzdGF0aWMgc3RkOjp2ZWN0b3I8T3BlcmF0b3IqPiBUaGVPcGVyYXRvcnM7CisKKy8vLyBPcGVyYXRvciAtIFRoaXMgaXMgYSB2ZWN0b3Igb3BlcmF0aW9uIHRoYXQgaXMgYXZhaWxhYmxlIGZvciB1c2UuCitzdHJ1Y3QgT3BlcmF0b3IgeworICB1bnNpZ25lZCBzaG9ydCBTaHVmZmxlTWFzazsKKyAgdW5zaWduZWQgc2hvcnQgT3BOdW07CisgIGNvbnN0IGNoYXIgKk5hbWU7CisgIHVuc2lnbmVkIENvc3Q7CisKKyAgT3BlcmF0b3IodW5zaWduZWQgc2hvcnQgc2h1ZmZsZW1hc2ssIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIG9wbnVtLAorICAgICAgICAgICB1bnNpZ25lZCBjb3N0ID0gMSkKKyAgICA6IFNodWZmbGVNYXNrKHNodWZmbGVtYXNrKSwgT3BOdW0ob3BudW0pLCBOYW1lKG5hbWUpLCBDb3N0KGNvc3QpIHsKKyAgICBUaGVPcGVyYXRvcnMucHVzaF9iYWNrKHRoaXMpOworICB9CisgIH5PcGVyYXRvcigpIHsKKyAgICBhc3NlcnQoVGhlT3BlcmF0b3JzLmJhY2soKSA9PSB0aGlzKTsKKyAgICBUaGVPcGVyYXRvcnMucG9wX2JhY2soKTsKKyAgfQorCisgIGJvb2wgaXNPbmx5TEhTT3BlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzT25seUxIU01hc2soU2h1ZmZsZU1hc2spOworICB9CisKKyAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKyAgdW5zaWduZWQgZ2V0Q29zdCgpIGNvbnN0IHsgcmV0dXJuIENvc3Q7IH0KKworICB1bnNpZ25lZCBzaG9ydCBnZXRUcmFuc2Zvcm1lZE1hc2sodW5zaWduZWQgc2hvcnQgTEhTTWFzaywgdW5zaWduZWQgUkhTTWFzaykgeworICAgIC8vIEV4dHJhY3QgdGhlIGVsZW1lbnRzIGZyb20gTEhTTWFzayBhbmQgUkhTTWFzaywgYXMgYXBwcm9wcmlhdGUuCisgICAgdW5zaWduZWQgUmVzdWx0ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDQ7ICsraSkgeworICAgICAgdW5zaWduZWQgU3JjRWx0ID0gKFNodWZmbGVNYXNrID4+ICg0KmkpKSAmIDB4RjsKKyAgICAgIHVuc2lnbmVkIFJlc0VsdDsKKyAgICAgIGlmIChTcmNFbHQgPCA0KQorICAgICAgICBSZXNFbHQgPSBnZXRNYXNrRWx0KExIU01hc2ssIFNyY0VsdCk7CisgICAgICBlbHNlIGlmIChTcmNFbHQgPCA4KQorICAgICAgICBSZXNFbHQgPSBnZXRNYXNrRWx0KFJIU01hc2ssIFNyY0VsdC00KTsKKyAgICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoU3JjRWx0ID09IDggJiYgIkJhZCBzcmMgZWx0ISIpOworICAgICAgICBSZXNFbHQgPSA4OworICAgICAgfQorICAgICAgUmVzdWx0IHw9IFJlc0VsdCA8PCAoNCppKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldFplcm9Db3N0T3BOYW1lKHVuc2lnbmVkIHNob3J0IE9wKSB7CisgIGlmIChTaHVmVGFiW09wXS5BcmcwID09IDB4MDEyMykKKyAgICByZXR1cm4gIkxIUyI7CisgIGVsc2UgaWYgKFNodWZUYWJbT3BdLkFyZzAgPT0gMHg0NTY3KQorICAgIHJldHVybiAiUkhTIjsKKyAgZWxzZSB7CisgICAgYXNzZXJ0KDAgJiYgImJhZCB6ZXJvIGNvc3Qgb3BlcmF0aW9uIik7CisgICAgYWJvcnQoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBQcmludE9wZXJhdGlvbih1bnNpZ25lZCBWYWxObywgdW5zaWduZWQgc2hvcnQgVmFsc1tdKSB7CisgIHVuc2lnbmVkIHNob3J0IFRoaXNPcCA9IFZhbHNbVmFsTm9dOworICBzdGQ6OmNlcnIgPDwgInQiIDw8IFZhbE5vOworICBQcmludE1hc2soVGhpc09wLCBzdGQ6OmNlcnIpOworICBzdGQ6OmNlcnIgPDwgIiA9ICIgPDwgU2h1ZlRhYltUaGlzT3BdLk9wLT5nZXROYW1lKCkgPDwgIigiOworCisgIGlmIChTaHVmVGFiW1NodWZUYWJbVGhpc09wXS5BcmcwXS5Db3N0ID09IDApIHsKKyAgICBzdGQ6OmNlcnIgPDwgZ2V0WmVyb0Nvc3RPcE5hbWUoU2h1ZlRhYltUaGlzT3BdLkFyZzApOworICAgIFByaW50TWFzayhTaHVmVGFiW1RoaXNPcF0uQXJnMCwgc3RkOjpjZXJyKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBGaWd1cmUgb3V0IHdoYXQgdG1wICMgaXQgaXMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgOyArK2kpCisgICAgICBpZiAoVmFsc1tpXSA9PSBTaHVmVGFiW1RoaXNPcF0uQXJnMCkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInQiIDw8IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisKKyAgaWYgKCFTaHVmVGFiW1ZhbHNbVmFsTm9dXS5PcC0+aXNPbmx5TEhTT3BlcmF0b3IoKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiLCAiOworICAgIGlmIChTaHVmVGFiW1NodWZUYWJbVGhpc09wXS5BcmcxXS5Db3N0ID09IDApIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBnZXRaZXJvQ29zdE9wTmFtZShTaHVmVGFiW1RoaXNPcF0uQXJnMSk7CisgICAgICBQcmludE1hc2soU2h1ZlRhYltUaGlzT3BdLkFyZzEsIHN0ZDo6Y2Vycik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCB0bXAgIyBpdCBpcy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IDsgKytpKQorICAgICAgICBpZiAoVmFsc1tpXSA9PSBTaHVmVGFiW1RoaXNPcF0uQXJnMSkgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAidCIgPDwgaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgfQorICBzdGQ6OmNlcnIgPDwgIikgICI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBnZXROdW1FbnRlcmVkKCkgeworICB1bnNpZ25lZCBDb3VudCA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gNjU1MzY7ICsraSkKKyAgICBDb3VudCArPSBTaHVmVGFiW2ldLkNvc3QgPCAxMDA7CisgIHJldHVybiBDb3VudDsKK30KKworc3RhdGljIHZvaWQgRXZhbHVhdGVPcHModW5zaWduZWQgc2hvcnQgRWx0LCB1bnNpZ25lZCBzaG9ydCBWYWxzW10sCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtVmFscykgeworICBpZiAoU2h1ZlRhYltFbHRdLkNvc3QgPT0gMCkgcmV0dXJuOworCisgIC8vIElmIHRoaXMgdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQsIGl0IGlzIGZyZWUuICBGSVhNRTogbWF0Y2ggdW5kZWZzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtVmFsczsgaSAhPSBlOyArK2kpCisgICAgaWYgKFZhbHNbaV0gPT0gRWx0KSByZXR1cm47CisKKyAgLy8gT3RoZXJ3aXNlLCBnZXQgdGhlIG9wZXJhbmRzIG9mIHRoZSB2YWx1ZSwgdGhlbiBhZGQgaXQuCisgIHVuc2lnbmVkIEFyZzAgPSBTaHVmVGFiW0VsdF0uQXJnMCwgQXJnMSA9IFNodWZUYWJbRWx0XS5BcmcxOworICBpZiAoU2h1ZlRhYltBcmcwXS5Db3N0KQorICAgIEV2YWx1YXRlT3BzKEFyZzAsIFZhbHMsIE51bVZhbHMpOworICBpZiAoQXJnMCAhPSBBcmcxICYmIFNodWZUYWJbQXJnMV0uQ29zdCkKKyAgICBFdmFsdWF0ZU9wcyhBcmcxLCBWYWxzLCBOdW1WYWxzKTsKKworICBWYWxzW051bVZhbHMrK10gPSBFbHQ7Cit9CisKKworaW50IG1haW4oKSB7CisgIC8vIFNlZWQgdGhlIHRhYmxlIHdpdGggYWNjZXNzZXMgdG8gdGhlIExIUyBhbmQgUkhTLgorICBTaHVmVGFiWzB4MDEyM10uQ29zdCA9IDA7CisgIFNodWZUYWJbMHgwMTIzXS5PcCA9IDA7CisgIFNodWZUYWJbMHgwMTIzXS5BcmcwID0gMHgwMTIzOworICBTaHVmVGFiWzB4NDU2N10uQ29zdCA9IDA7CisgIFNodWZUYWJbMHg0NTY3XS5PcCA9IDA7CisgIFNodWZUYWJbMHg0NTY3XS5BcmcwID0gMHg0NTY3OworCisgIC8vIFNlZWQgdGhlIGZpcnN0LWxldmVsIG9mIHNodWZmbGVzLCBzaHVmZmxlcyB3aG9zZSBpbnB1dHMgYXJlIHRoZSBpbnB1dCB0bworICAvLyB0aGUgdmVjdG9yc2h1ZmZsZSBvcGVyYXRpb24uCisgIGJvb2wgTWFkZUNoYW5nZSA9IHRydWU7CisgIHVuc2lnbmVkIE9wQ291bnQgPSAwOworICB3aGlsZSAoTWFkZUNoYW5nZSkgeworICAgIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgICArK09wQ291bnQ7CisgICAgc3RkOjpjZXJyIDw8ICJTdGFydGluZyBpdGVyYXRpb24gIyIgPDwgT3BDb3VudCA8PCAiIHdpdGggIgorICAgICAgICAgICAgICA8PCBnZXROdW1FbnRlcmVkKCkgPDwgIiBlbnRyaWVzIGVzdGFibGlzaGVkLlxuIjsKKworICAgIC8vIFNjYW4gdGhlIHRhYmxlIGZvciB0d28gcmVhc29uczogRmlyc3QsIGNvbXB1dGUgdGhlIG1heGltdW0gY29zdCBvZiBhbnkKKyAgICAvLyBvcGVyYXRpb24gbGVmdCBpbiB0aGUgdGFibGUuICBTZWNvbmQsIG1ha2Ugc3VyZSB0aGF0IHZhbHVlcyB3aXRoIHVuZGVmcworICAgIC8vIGhhdmUgdGhlIGNoZWFwZXN0IGFsdGVybmF0aXZlIHRoYXQgdGhleSBtYXRjaC4KKyAgICB1bnNpZ25lZCBNYXhDb3N0ID0gU2h1ZlRhYlswXS5Db3N0OworICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgIT0gMHg4ODg5OyArK2kpIHsKKyAgICAgIGlmICghaXNWYWxpZE1hc2soaSkpIGNvbnRpbnVlOworICAgICAgaWYgKFNodWZUYWJbaV0uQ29zdCA+IE1heENvc3QpCisgICAgICAgIE1heENvc3QgPSBTaHVmVGFiW2ldLkNvc3Q7CisKKyAgICAgIC8vIElmIHRoaXMgdmFsdWUgaGFzIGFuIHVuZGVmLCBtYWtlIGl0IGJlIGNvbXB1dGVkIHRoZSBjaGVhcGVzdCBwb3NzaWJsZQorICAgICAgLy8gd2F5IG9mIGFueSBvZiB0aGUgdGhpbmdzIHRoYXQgaXQgbWF0Y2hlcy4KKyAgICAgIGlmIChoYXNVbmRlZkVsZW1lbnRzKGkpKSB7CisgICAgICAgIC8vIFRoaXMgY29kZSBpcyBhIGxpdHRsZSBiaXQgdHJpY2t5LCBzbyBoZXJlJ3MgdGhlIGlkZWE6IGNvbnNpZGVyIHNvbWUKKyAgICAgICAgLy8gcGVybXV0YXRpb24sIGxpa2UgN3U0dS4gIFRvIGNvbXB1dGUgdGhlIGxvd2VzdCBjb3N0IGZvciA3dTR1LCB3ZQorICAgICAgICAvLyBuZWVkIHRvIHRha2UgdGhlIG1pbmltdW0gY29zdCBvZiBhbGwgb2YgN1swLThdNFswLThdLCA4MSBlbnRyaWVzLiAgSWYKKyAgICAgICAgLy8gdGhlcmUgYXJlIDMgdW5kZWZzLCB0aGUgbnVtYmVyIHJpc2VzIHRvIDcyOSBlbnRyaWVzIHdlIGhhdmUgdG8gc2NhbiwKKyAgICAgICAgLy8gYW5kIGZvciB0aGUgNCB1bmRlZiBjYXNlLCB3ZSBoYXZlIHRvIHNjYW4gdGhlIHdob2xlIHRhYmxlLgorICAgICAgICAvLworICAgICAgICAvLyBJbnN0ZWFkIG9mIGRvaW5nIHRoaXMgaHVnZSBhbW91bnQgb2Ygc2Nhbm5pbmcsIHdlIHByb2Nlc3MgdGhlIHRhYmxlCisgICAgICAgIC8vIGVudHJpZXMgKmluIG9yZGVyKiwgYW5kIHVzZSB0aGUgZmFjdCB0aGF0ICd1JyBpcyA4LCBsYXJnZXIgdGhhbiBhbnkKKyAgICAgICAgLy8gdmFsaWQgaW5kZXguICBHaXZlbiBhbiBlbnRyeSBsaWtlIDd1NHUgdGhlbiwgd2Ugb25seSBuZWVkIHRvIHNjYW4KKyAgICAgICAgLy8gN1swLTddNHUgLSA4IGVudHJpZXMuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aCB0aGlzLCBiZWNhdXNlIHdlIGFscmVhZHkKKyAgICAgICAgLy8ga25vdyB0aGF0IGVhY2ggb2YgNzA0dSwgNzE0dSwgNzI0dSwgZXRjIGNvbnRhaW4gdGhlIG1pbmltdW0gdmFsdWUgb2YKKyAgICAgICAgLy8gYWxsIG9mIHRoZSA3MDRbMC04XSwgNzE0WzAtOF0gYW5kIDcyNFswLThdIGVudHJpZXMgcmVzcGVjdGl2ZWx5LgorICAgICAgICB1bnNpZ25lZCBVbmRlZklkeDsKKyAgICAgICAgaWYgKGkgJiAweDgwMDApCisgICAgICAgICAgVW5kZWZJZHggPSAwOworICAgICAgICBlbHNlIGlmIChpICYgMHgwODAwKQorICAgICAgICAgIFVuZGVmSWR4ID0gMTsKKyAgICAgICAgZWxzZSBpZiAoaSAmIDB4MDA4MCkKKyAgICAgICAgICBVbmRlZklkeCA9IDI7CisgICAgICAgIGVsc2UgaWYgKGkgJiAweDAwMDgpCisgICAgICAgICAgVW5kZWZJZHggPSAzOworICAgICAgICBlbHNlCisgICAgICAgICAgYWJvcnQoKTsKKworICAgICAgICB1bnNpZ25lZCBNaW5WYWwgID0gaTsKKyAgICAgICAgdW5zaWduZWQgTWluQ29zdCA9IFNodWZUYWJbaV0uQ29zdDsKKworICAgICAgICAvLyBTY2FuIHRoZSA4IGVudHJpZXMuCisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gODsgKytqKSB7CisgICAgICAgICAgdW5zaWduZWQgTmV3RWx0ID0gc2V0TWFza0VsdChpLCBVbmRlZklkeCwgaik7CisgICAgICAgICAgaWYgKFNodWZUYWJbTmV3RWx0XS5Db3N0IDwgTWluQ29zdCkgeworICAgICAgICAgICAgTWluQ29zdCA9IFNodWZUYWJbTmV3RWx0XS5Db3N0OworICAgICAgICAgICAgTWluVmFsID0gTmV3RWx0OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGZvdW5kIHNvbWV0aGluZyBjaGVhcGVyIHRoYW4gd2hhdCB3YXMgaGVyZSBiZWZvcmUsIHVzZSBpdC4KKyAgICAgICAgaWYgKGkgIT0gTWluVmFsKSB7CisgICAgICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgICAgICAgU2h1ZlRhYltpXSA9IFNodWZUYWJbTWluVmFsXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGZvciAodW5zaWduZWQgTEhTID0gMDsgTEhTICE9IDB4ODg4OTsgKytMSFMpIHsKKyAgICAgIGlmICghaXNWYWxpZE1hc2soTEhTKSkgY29udGludWU7CisgICAgICBpZiAoU2h1ZlRhYltMSFNdLkNvc3QgPiAxMDAwKSBjb250aW51ZTsKKworICAgICAgLy8gSWYgbm90aGluZyBpbnZvbHZpbmcgdGhpcyBvcGVyYW5kIGNvdWxkIHBvc3NpYmx5IGJlIGNoZWFwZXIgdGhhbiB3aGF0CisgICAgICAvLyB3ZSBhbHJlYWR5IGhhdmUsIGRvbid0IGNvbnNpZGVyIGl0LgorICAgICAgaWYgKFNodWZUYWJbTEhTXS5Db3N0ICsgMSA+PSBNYXhDb3N0KQorICAgICAgICBjb250aW51ZTsKKworICAgICAgZm9yICh1bnNpZ25lZCBvcG51bSA9IDAsIGUgPSBUaGVPcGVyYXRvcnMuc2l6ZSgpOyBvcG51bSAhPSBlOyArK29wbnVtKSB7CisgICAgICAgIE9wZXJhdG9yICpPcCA9IFRoZU9wZXJhdG9yc1tvcG51bV07CisKKyAgICAgICAgLy8gRXZhbHVhdGUgb3AoTEhTLExIUykKKyAgICAgICAgdW5zaWduZWQgUmVzdWx0TWFzayA9IE9wLT5nZXRUcmFuc2Zvcm1lZE1hc2soTEhTLCBMSFMpOworCisgICAgICAgIHVuc2lnbmVkIENvc3QgPSBTaHVmVGFiW0xIU10uQ29zdCArIE9wLT5nZXRDb3N0KCk7CisgICAgICAgIGlmIChDb3N0IDwgU2h1ZlRhYltSZXN1bHRNYXNrXS5Db3N0KSB7CisgICAgICAgICAgU2h1ZlRhYltSZXN1bHRNYXNrXS5Db3N0ID0gQ29zdDsKKyAgICAgICAgICBTaHVmVGFiW1Jlc3VsdE1hc2tdLk9wID0gT3A7CisgICAgICAgICAgU2h1ZlRhYltSZXN1bHRNYXNrXS5BcmcwID0gTEhTOworICAgICAgICAgIFNodWZUYWJbUmVzdWx0TWFza10uQXJnMSA9IExIUzsKKyAgICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoaXMgaXMgYSB0d28gaW5wdXQgaW5zdHJ1Y3Rpb24sIGluY2x1ZGUgdGhlIG9wKHgseSkgY2FzZXMuICBJZgorICAgICAgICAvLyB0aGlzIGlzIGEgb25lIGlucHV0IGluc3RydWN0aW9uLCBza2lwIHRoaXMuCisgICAgICAgIGlmIChPcC0+aXNPbmx5TEhTT3BlcmF0b3IoKSkgY29udGludWU7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBSSFMgPSAwOyBSSFMgIT0gMHg4ODg5OyArK1JIUykgeworICAgICAgICAgIGlmICghaXNWYWxpZE1hc2soUkhTKSkgY29udGludWU7CisgICAgICAgICAgaWYgKFNodWZUYWJbUkhTXS5Db3N0ID4gMTAwMCkgY29udGludWU7CisKKyAgICAgICAgICAvLyBJZiBub3RoaW5nIGludm9sdmluZyB0aGlzIG9wZXJhbmQgY291bGQgcG9zc2libHkgYmUgY2hlYXBlciB0aGFuCisgICAgICAgICAgLy8gd2hhdCB3ZSBhbHJlYWR5IGhhdmUsIGRvbid0IGNvbnNpZGVyIGl0LgorICAgICAgICAgIGlmIChTaHVmVGFiW1JIU10uQ29zdCArIDEgPj0gTWF4Q29zdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisKKyAgICAgICAgICAvLyBFdmFsdWF0ZSBvcChMSFMsUkhTKQorICAgICAgICAgIHVuc2lnbmVkIFJlc3VsdE1hc2sgPSBPcC0+Z2V0VHJhbnNmb3JtZWRNYXNrKExIUywgUkhTKTsKKworICAgICAgICAgIGlmIChTaHVmVGFiW1Jlc3VsdE1hc2tdLkNvc3QgPD0gT3BDb3VudCB8fAorICAgICAgICAgICAgICBTaHVmVGFiW1Jlc3VsdE1hc2tdLkNvc3QgPD0gU2h1ZlRhYltMSFNdLkNvc3QgfHwKKyAgICAgICAgICAgICAgU2h1ZlRhYltSZXN1bHRNYXNrXS5Db3N0IDw9IFNodWZUYWJbUkhTXS5Db3N0KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBjb3N0IHRvIGV2YWx1YXRlIHRoaXMsIGtub3dpbmcgdGhhdCBDU0UncyBvbmx5IG5lZWQKKyAgICAgICAgICAvLyB0byBiZSBldmFsdWF0ZWQgb25jZS4KKyAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBWYWxzWzMwXTsKKyAgICAgICAgICB1bnNpZ25lZCBOdW1WYWxzID0gMDsKKyAgICAgICAgICBFdmFsdWF0ZU9wcyhMSFMsIFZhbHMsIE51bVZhbHMpOworICAgICAgICAgIEV2YWx1YXRlT3BzKFJIUywgVmFscywgTnVtVmFscyk7CisKKyAgICAgICAgICB1bnNpZ25lZCBDb3N0ID0gTnVtVmFscyArIE9wLT5nZXRDb3N0KCk7CisgICAgICAgICAgaWYgKENvc3QgPCBTaHVmVGFiW1Jlc3VsdE1hc2tdLkNvc3QpIHsKKyAgICAgICAgICAgIFNodWZUYWJbUmVzdWx0TWFza10uQ29zdCA9IENvc3Q7CisgICAgICAgICAgICBTaHVmVGFiW1Jlc3VsdE1hc2tdLk9wID0gT3A7CisgICAgICAgICAgICBTaHVmVGFiW1Jlc3VsdE1hc2tdLkFyZzAgPSBMSFM7CisgICAgICAgICAgICBTaHVmVGFiW1Jlc3VsdE1hc2tdLkFyZzEgPSBSSFM7CisgICAgICAgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGQ6OmNlcnIgPDwgIkZpbmlzaGVkIFRhYmxlIGhhcyAiIDw8IGdldE51bUVudGVyZWQoKQorICAgICAgICAgICAgPDwgIiBlbnRyaWVzIGVzdGFibGlzaGVkLlxuIjsKKworICB1bnNpZ25lZCBDb3N0QXJyYXlbMTBdID0geyAwIH07CisKKyAgLy8gQ29tcHV0ZSBhIGNvc3QgaGlzdG9ncmFtLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDY1NTM2OyArK2kpIHsKKyAgICBpZiAoIWlzVmFsaWRNYXNrKGkpKSBjb250aW51ZTsKKyAgICBpZiAoU2h1ZlRhYltpXS5Db3N0ID4gOSkKKyAgICAgICsrQ29zdEFycmF5WzldOworICAgIGVsc2UKKyAgICAgICsrQ29zdEFycmF5W1NodWZUYWJbaV0uQ29zdF07CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IDk7ICsraSkKKyAgICBpZiAoQ29zdEFycmF5W2ldKQorICAgICAgc3RkOjpjb3V0IDw8ICIvLyAiIDw8IENvc3RBcnJheVtpXSA8PCAiIGVudHJpZXMgaGF2ZSBjb3N0ICIgPDwgaSA8PCAiXG4iOworICBpZiAoQ29zdEFycmF5WzldKQorICAgIHN0ZDo6Y291dCA8PCAiLy8gIiA8PCBDb3N0QXJyYXlbOV0gPDwgIiBlbnRyaWVzIGhhdmUgaGlnaGVyIGNvc3QhXG4iOworCisKKyAgLy8gQnVpbGQgdXAgdGhlIHRhYmxlIHRvIGVtaXQuCisgIHN0ZDo6Y291dCA8PCAiXG4vLyBUaGlzIHRhYmxlIGlzIDY1NjEqNCA9IDI2MjQ0IGJ5dGVzIGluIHNpemUuXG4iOworICBzdGQ6OmNvdXQgPDwgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBQZXJmZWN0U2h1ZmZsZVRhYmxlWzY1NjErMV0gPSB7XG4iOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gMHg4ODg5OyArK2kpIHsKKyAgICBpZiAoIWlzVmFsaWRNYXNrKGkpKSBjb250aW51ZTsKKworICAgIC8vIENvc3RTYXQgLSBUaGUgY29zdCBvZiB0aGlzIG9wZXJhdGlvbiBzYXR1cmF0ZWQgdG8gdHdvIGJpdHMuCisgICAgdW5zaWduZWQgQ29zdFNhdCA9IFNodWZUYWJbaV0uQ29zdDsKKyAgICBpZiAoQ29zdFNhdCA+IDQpIENvc3RTYXQgPSA0OworICAgIGlmIChDb3N0U2F0ID09IDApIENvc3RTYXQgPSAxOworICAgIC0tQ29zdFNhdDsgIC8vIENvc3QgaXMgbm93IGJldHdlZW4gMC0zLgorCisgICAgdW5zaWduZWQgT3BOdW0gPSBTaHVmVGFiW2ldLk9wID8gU2h1ZlRhYltpXS5PcC0+T3BOdW0gOiAwOworICAgIGFzc2VydChPcE51bSA8IDE2ICYmICJUb28gZmV3IGJpdHMgdG8gZW5jb2RlIG9wZXJhdGlvbiEiKTsKKworICAgIHVuc2lnbmVkIExIUyA9IGdldENvbXByZXNzZWRNYXNrKFNodWZUYWJbaV0uQXJnMCk7CisgICAgdW5zaWduZWQgUkhTID0gZ2V0Q29tcHJlc3NlZE1hc2soU2h1ZlRhYltpXS5BcmcxKTsKKworICAgIC8vIEVuY29kZSB0aGlzIGFzIDIgYml0cyBvZiBzYXR1cmF0ZWQgY29zdCwgNCBiaXRzIG9mIG9wY29kZXMsIDEzIGJpdHMgb2YKKyAgICAvLyBMSFMsIGFuZCAxMyBiaXRzIG9mIFJIUyA9IDMyIGJpdHMuCisgICAgdW5zaWduZWQgVmFsID0gKENvc3RTYXQgPDwgMzApIHwgKE9wTnVtIDw8IDI2KSB8IChMSFMgPDwgMTMpIHwgUkhTOworCisgICAgc3RkOjpjb3V0IDw8ICIgICIgPDwgVmFsIDw8ICJVLFx0Ly8gIjsKKyAgICBQcmludE1hc2soaSwgc3RkOjpjb3V0KTsKKyAgICBzdGQ6OmNvdXQgPDwgIjogQ29zdCAiIDw8IFNodWZUYWJbaV0uQ29zdDsKKyAgICBzdGQ6OmNvdXQgPDwgIiAiIDw8IChTaHVmVGFiW2ldLk9wID8gU2h1ZlRhYltpXS5PcC0+Z2V0TmFtZSgpIDogImNvcHkiKTsKKyAgICBzdGQ6OmNvdXQgPDwgIiAiOworICAgIGlmIChTaHVmVGFiW1NodWZUYWJbaV0uQXJnMF0uQ29zdCA9PSAwKSB7CisgICAgICBzdGQ6OmNvdXQgPDwgZ2V0WmVyb0Nvc3RPcE5hbWUoU2h1ZlRhYltpXS5BcmcwKTsKKyAgICB9IGVsc2UgeworICAgICAgUHJpbnRNYXNrKFNodWZUYWJbaV0uQXJnMCwgc3RkOjpjb3V0KTsKKyAgICB9CisKKyAgICBpZiAoU2h1ZlRhYltpXS5PcCAmJiAhU2h1ZlRhYltpXS5PcC0+aXNPbmx5TEhTT3BlcmF0b3IoKSkgeworICAgICAgc3RkOjpjb3V0IDw8ICIsICI7CisgICAgICBpZiAoU2h1ZlRhYltTaHVmVGFiW2ldLkFyZzFdLkNvc3QgPT0gMCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgZ2V0WmVyb0Nvc3RPcE5hbWUoU2h1ZlRhYltpXS5BcmcxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFByaW50TWFzayhTaHVmVGFiW2ldLkFyZzEsIHN0ZDo6Y291dCk7CisgICAgICB9CisgICAgfQorICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICB9CisgIHN0ZDo6Y291dCA8PCAiICAwXG59O1xuIjsKKworICBpZiAoMCkgeworICAgIC8vIFByaW50IG91dCB0aGUgdGFibGUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSAweDg4ODk7ICsraSkgeworICAgICAgaWYgKCFpc1ZhbGlkTWFzayhpKSkgY29udGludWU7CisgICAgICBpZiAoU2h1ZlRhYltpXS5Db3N0IDwgMTAwMCkgeworICAgICAgICBQcmludE1hc2soaSwgc3RkOjpjZXJyKTsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICIgLSBDb3N0ICIgPDwgU2h1ZlRhYltpXS5Db3N0IDw8ICIgLSAiOworCisgICAgICAgIHVuc2lnbmVkIHNob3J0IFZhbHNbMzBdOworICAgICAgICB1bnNpZ25lZCBOdW1WYWxzID0gMDsKKyAgICAgICAgRXZhbHVhdGVPcHMoaSwgVmFscywgTnVtVmFscyk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZSA9IE51bVZhbHM7IGogIT0gZTsgKytqKQorICAgICAgICAgIFByaW50T3BlcmF0aW9uKGosIFZhbHMpOworICAgICAgICBzdGQ6OmNlcnIgPDwgIlxuIjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisjaWZkZWYgR0VORVJBVEVfQUxUSVZFQworCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFRoZSBhbHRpdmVjIGluc3RydWN0aW9uIGRlZmluaXRpb25zLiAgVGhpcyBpcyB0aGUgYWx0aXZlYy1zcGVjaWZpYyBwYXJ0IG9mCisvLy8gdGhpcyBmaWxlLgorLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gTm90ZSB0aGF0IHRoZSBvcGNvZGUgbnVtYmVycyBoZXJlIG11c3QgbWF0Y2ggdGhvc2UgaW4gdGhlIFBQQyBiYWNrZW5kLgorZW51bSB7CisgIE9QX0NPUFkgPSAwLCAgIC8vIENvcHksIHVzZWQgZm9yIHRoaW5ncyBsaWtlIDx1LHUsdSwzPiB0byBzYXkgaXQgaXMgPDAsMSwyLDM+CisgIE9QX1ZNUkdIVywKKyAgT1BfVk1SR0xXLAorICBPUF9WU1BMVElTVzAsCisgIE9QX1ZTUExUSVNXMSwKKyAgT1BfVlNQTFRJU1cyLAorICBPUF9WU1BMVElTVzMsCisgIE9QX1ZTTERPSTQsCisgIE9QX1ZTTERPSTgsCisgIE9QX1ZTTERPSTEyCit9OworCitzdHJ1Y3Qgdm1yZ2h3IDogcHVibGljIE9wZXJhdG9yIHsKKyAgdm1yZ2h3KCkgOiBPcGVyYXRvcigweDA0MTUsICJ2bXJnaHciLCBPUF9WTVJHSFcpIHt9Cit9IHRoZV92bXJnaHc7CisKK3N0cnVjdCB2bXJnbHcgOiBwdWJsaWMgT3BlcmF0b3IgeworICB2bXJnbHcoKSA6IE9wZXJhdG9yKDB4MjYzNywgInZtcmdsdyIsIE9QX1ZNUkdMVykge30KK30gdGhlX3ZtcmdsdzsKKwordGVtcGxhdGU8dW5zaWduZWQgRWx0Pgorc3RydWN0IHZzcGx0aXN3IDogcHVibGljIE9wZXJhdG9yIHsKKyAgdnNwbHRpc3coY29uc3QgY2hhciAqTiwgdW5zaWduZWQgT3BjKQorICAgIDogT3BlcmF0b3IoTWFrZU1hc2soRWx0LCBFbHQsIEVsdCwgRWx0KSwgTiwgT3BjKSB7fQorfTsKKwordnNwbHRpc3c8MD4gdGhlX3ZzcGx0aXN3MCgidnNwbHRpc3cwIiwgT1BfVlNQTFRJU1cwKTsKK3ZzcGx0aXN3PDE+IHRoZV92c3BsdGlzdzEoInZzcGx0aXN3MSIsIE9QX1ZTUExUSVNXMSk7Cit2c3BsdGlzdzwyPiB0aGVfdnNwbHRpc3cyKCJ2c3BsdGlzdzIiLCBPUF9WU1BMVElTVzIpOwordnNwbHRpc3c8Mz4gdGhlX3ZzcGx0aXN3MygidnNwbHRpc3czIiwgT1BfVlNQTFRJU1czKTsKKwordGVtcGxhdGU8dW5zaWduZWQgTj4KK3N0cnVjdCB2c2xkb2kgOiBwdWJsaWMgT3BlcmF0b3IgeworICB2c2xkb2koY29uc3QgY2hhciAqTmFtZSwgdW5zaWduZWQgT3BjKQorICAgIDogT3BlcmF0b3IoTWFrZU1hc2soTiY3LCAoTisxKSY3LCAoTisyKSY3LCAoTiszKSY3KSwgTmFtZSwgT3BjKSB7CisgIH0KK307CisKK3ZzbGRvaTwxPiB0aGVfdnNsZG9pMSgidnNsZG9pNCIgLCBPUF9WU0xET0k0KTsKK3ZzbGRvaTwyPiB0aGVfdnNsZG9pMigidnNsZG9pOCIgLCBPUF9WU0xET0k4KTsKK3ZzbGRvaTwzPiB0aGVfdnNsZG9pMygidnNsZG9pMTIiLCBPUF9WU0xET0kxMik7CisKKyNlbmRpZgorCisjZGVmaW5lIEdFTkVSQVRFX05FT04KKworI2lmZGVmIEdFTkVSQVRFX05FT04KK2VudW0geworICBPUF9DT1BZID0gMCwgICAvLyBDb3B5LCB1c2VkIGZvciB0aGluZ3MgbGlrZSA8dSx1LHUsMz4gdG8gc2F5IGl0IGlzIDwwLDEsMiwzPgorICBPUF9WUkVWLAorICBPUF9WRFVQMCwKKyAgT1BfVkRVUDEsCisgIE9QX1ZEVVAyLAorICBPUF9WRFVQMywKKyAgT1BfVkVYVDEsCisgIE9QX1ZFWFQyLAorICBPUF9WRVhUMywKKyAgT1BfVlVaUEwsIC8vIFZVWlAsIGxlZnQgcmVzdWx0CisgIE9QX1ZVWlBSLCAvLyBWVVpQLCByaWdodCByZXN1bHQKKyAgT1BfVlpJUEwsIC8vIFZaSVAsIGxlZnQgcmVzdWx0CisgIE9QX1ZaSVBSLCAvLyBWWklQLCByaWdodCByZXN1bHQKKyAgT1BfVlRSTkwsIC8vIFZUUk4sIGxlZnQgcmVzdWx0CisgIE9QX1ZUUk5SICAvLyBWVFJOLCByaWdodCByZXN1bHQKK307CisKK3N0cnVjdCB2cmV2IDogcHVibGljIE9wZXJhdG9yIHsKKyAgdnJldigpIDogT3BlcmF0b3IoMHgxMDMyLCAidnJldiIsIE9QX1ZSRVYpIHt9Cit9IHRoZV92cmV2OworCit0ZW1wbGF0ZTx1bnNpZ25lZCBFbHQ+CitzdHJ1Y3QgdmR1cCA6IHB1YmxpYyBPcGVyYXRvciB7CisgIHZkdXAoY29uc3QgY2hhciAqTiwgdW5zaWduZWQgT3BjKQorICAgIDogT3BlcmF0b3IoTWFrZU1hc2soRWx0LCBFbHQsIEVsdCwgRWx0KSwgTiwgT3BjKSB7fQorfTsKKwordmR1cDwwPiB0aGVfdmR1cDAoInZkdXAwIiwgT1BfVkRVUDApOwordmR1cDwxPiB0aGVfdmR1cDEoInZkdXAxIiwgT1BfVkRVUDEpOwordmR1cDwyPiB0aGVfdmR1cDIoInZkdXAyIiwgT1BfVkRVUDIpOwordmR1cDwzPiB0aGVfdmR1cDMoInZkdXAzIiwgT1BfVkRVUDMpOworCit0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorc3RydWN0IHZleHQgOiBwdWJsaWMgT3BlcmF0b3IgeworICB2ZXh0KGNvbnN0IGNoYXIgKk5hbWUsIHVuc2lnbmVkIE9wYykKKyAgICA6IE9wZXJhdG9yKE1ha2VNYXNrKE4mNywgKE4rMSkmNywgKE4rMikmNywgKE4rMykmNyksIE5hbWUsIE9wYykgeworICB9Cit9OworCit2ZXh0PDE+IHRoZV92ZXh0MSgidmV4dDEiLCBPUF9WRVhUMSk7Cit2ZXh0PDI+IHRoZV92ZXh0MigidmV4dDIiLCBPUF9WRVhUMik7Cit2ZXh0PDM+IHRoZV92ZXh0MygidmV4dDMiLCBPUF9WRVhUMyk7CisKK3N0cnVjdCB2dXpwbCA6IHB1YmxpYyBPcGVyYXRvciB7CisgIHZ1enBsKCkgOiBPcGVyYXRvcigweDAyNDYsICJ2dXpwbCIsIE9QX1ZVWlBMLCAyKSB7fQorfSB0aGVfdnV6cGw7CisKK3N0cnVjdCB2dXpwciA6IHB1YmxpYyBPcGVyYXRvciB7CisgIHZ1enByKCkgOiBPcGVyYXRvcigweDEzNTcsICJ2dXpwciIsIE9QX1ZVWlBSLCAyKSB7fQorfSB0aGVfdnV6cHI7CisKK3N0cnVjdCB2emlwbCA6IHB1YmxpYyBPcGVyYXRvciB7CisgIHZ6aXBsKCkgOiBPcGVyYXRvcigweDA0MTUsICJ2emlwbCIsIE9QX1ZaSVBMLCAyKSB7fQorfSB0aGVfdnppcGw7CisKK3N0cnVjdCB2emlwciA6IHB1YmxpYyBPcGVyYXRvciB7CisgIHZ6aXByKCkgOiBPcGVyYXRvcigweDI2MzcsICJ2emlwciIsIE9QX1ZaSVBSLCAyKSB7fQorfSB0aGVfdnppcHI7CisKK3N0cnVjdCB2dHJubCA6IHB1YmxpYyBPcGVyYXRvciB7CisgIHZ0cm5sKCkgOiBPcGVyYXRvcigweDA0MjYsICJ2dHJubCIsIE9QX1ZUUk5MLCAyKSB7fQorfSB0aGVfdnRybmw7CisKK3N0cnVjdCB2dHJuciA6IHB1YmxpYyBPcGVyYXRvciB7CisgIHZ0cm5yKCkgOiBPcGVyYXRvcigweDE1MzcsICJ2dHJuciIsIE9QX1ZUUk5SLCAyKSB7fQorfSB0aGVfdnRybnI7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvUmVncmVzc2lvbkZpbmRlci5wbCBiL3NyYy9MTFZNL3V0aWxzL1JlZ3Jlc3Npb25GaW5kZXIucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiMDc3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1JlZ3Jlc3Npb25GaW5kZXIucGwKQEAgLTAsMCArMSwxODYgQEAKKyMhIC91c3IvYmluL3BlcmwKKyMgU2NyaXB0IHRvIGZpbmQgcmVncmVzc2lvbnMgYnkgYmluYXJ5LXNlYXJjaGluZyBhIHRpbWUgaW50ZXJ2YWwgaW4gdGhlCisjIENWUyB0cmVlLiAgV3JpdHRlbiBieSBCcmlhbiBHYWVrZSBvbiAyLU1hci0yMDA0LgorIworCityZXF1aXJlIDUuNi4wOyAgIyBOT1RFOiBUaGlzIHNjcmlwdCBub3QgdGVzdGVkIHdpdGggZWFybGllciB2ZXJzaW9ucy4KK3VzZSBHZXRvcHQ6OlN0ZDsKK3VzZSBQT1NJWDsKK3VzZSBUaW1lOjpMb2NhbDsKK3VzZSBJTzo6SGFuZGxlOworCitzdWIgdXNhZ2UgeworICAgIHByaW50IFNUREVSUiA8PEVORDsKK2ZpbmRSZWdyZXNzaW9uIFstSV0gLXcgV1RJTUUgLWQgRFRJTUUgLXQgVE9PTFMgLWMgU0NSSVBUCisKK1RoZSAtdywgLWQsIC10LCBhbmQgLWMgb3B0aW9ucyBhcmUgcmVxdWlyZWQuCitSdW4gZmluZFJlZ3Jlc3Npb24gaW4gdGhlIHRvcCBsZXZlbCBvZiBhbiBMTFZNIHRyZWUuCitXVElNRSBpcyBhIHRpbWUgd2hlbiB5b3UgYXJlIHN1cmUgdGhlIHJlZ3Jlc3Npb24gZG9lcyBOT1QgZXhpc3QgKCJXb3JrcyIpLgorRFRJTUUgaXMgYSB0aW1lIHdoZW4geW91IGFyZSBzdXJlIHRoZSByZWdyZXNzaW9uIERPRVMgZXhpc3QgKCJEb2VzbnR3b3JrIikuCitXVElNRSBhbmQgRFRJTUUgYXJlIGJvdGggaW4gdGhlIGZvcm1hdDogIllZWVkvTU0vREQgSEg6TU0iLgorLUkgbWVhbnMgcnVuIGJ1aWxkcyBhdCBXVElNRSBhbmQgRFRJTUUgZmlyc3QgdG8gbWFrZSBzdXJlLgorVE9PTFMgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0b29scyB0byByZWJ1aWxkIGJlZm9yZSBydW5uaW5nIFNDUklQVC4KK1NDUklQVCBleGl0cyAxIGlmIHRoZSByZWdyZXNzaW9uIGlzIHByZXNlbnQgaW4gVE9PTFM7IDAgb3RoZXJ3aXNlLgorRU5ECisgICAgZXhpdCAxOworfQorCitzdWIgdGltZUFzU2Vjb25kcyB7CisgICAgbXkgKCR0aW1lc3RyKSA9IEBfOworCisgICAgaWYgKCAkdGltZXN0ciA9fiAvKFxkXGRcZFxkKVwvKFxkXGQpXC8oXGRcZCkgKFxkXGQpOihcZFxkKS8gKSB7CisgICAgICAgIG15ICggJHllYXIsICRtb24sICRtZGF5LCAkaG91ciwgJG1pbiApID0gKCAkMSwgJDIsICQzLCAkNCwgJDUgKTsKKyAgICAgICAgcmV0dXJuIHRpbWVnbSggMCwgJG1pbiwgJGhvdXIsICRtZGF5LCAkbW9uIC0gMSwgJHllYXIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRpZSAiKiogQ2FuJ3QgcGFyc2UgZGF0ZSArIHRpbWU6ICR0aW1lc3RyXG4iOworICAgIH0KK30KKworc3ViIHRpbWVBc1N0cmluZyB7CisgICAgbXkgKCRzZWNzKSA9IEBfOworICAgIHJldHVybiBzdHJmdGltZSggIiVZLyVtLyVkICVIOiVNIiwgZ210aW1lKCRzZWNzKSApOworfQorCitzdWIgcnVuIHsKKyAgICBteSAoJGNtZGxpbmUpID0gQF87CisgICAgcHJpbnQgTE9HICIqKiBSdW5uaW5nOiAkY21kbGluZVxuIjsKKwlyZXR1cm4gc3lzdGVtKCRjbWRsaW5lKTsKK30KKworc3ViIGJ1aWxkTGlicmFyaWVzQW5kVG9vbHMgeworICAgIHJ1bigic2ggL2hvbWUvdmFkdmUvZ2Fla2Uvc2NyaXB0cy9ydW4tY29uZmlndXJlIik7CisgICAgcnVuKCIkTUFLRSAtQyBsaWIvU3VwcG9ydCIpOworICAgIHJ1bigiJE1BS0UgLUMgdXRpbHMiKTsKKyAgICBydW4oIiRNQUtFIC1DIGxpYiIpOworICAgIGZvcmVhY2ggbXkgJHRvb2wgKEBUT09MUykgeyBydW4oIiRNQUtFIC1DIHRvb2xzLyR0b29sIik7IH0KK30KKworc3ViIGNvbnRhaW5zIHsKKyAgICBteSAoICRmaWxlLCAkcmVnZXggKSA9IEBfOworICAgIGxvY2FsICgqRklMRSk7CisgICAgb3BlbiggRklMRSwgIjwkZmlsZSIgKSBvciBkaWUgIioqIGNhbid0IHJlYWQgJGZpbGU6ICQhXG4iOworICAgIHdoaWxlICg8RklMRT4pIHsKKyAgICAgICAgaWYgKC8kcmVnZXgvKSB7CisgICAgICAgICAgICBjbG9zZSBGSUxFOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2UgRklMRTsKKyAgICByZXR1cm4gMDsKK30KKworc3ViIHVwZGF0ZVNvdXJjZXMgeworICAgIG15ICgkdGltZSkgPSBAXzsKKyAgICBteSAkaW5zdCA9ICJpbmNsdWRlL2xsdm0vSW5zdHJ1Y3Rpb24uaCI7CisgICAgdW5saW5rKCRpbnN0KTsKKyAgICBydW4oICJjdnMgdXBkYXRlIC1EJyIgLiB0aW1lQXNTdHJpbmcoJHRpbWUpIC4gIiciICk7CisgICAgaWYgKCAhY29udGFpbnMoICRpbnN0LCAnY2xhc3MgSW5zdHJ1Y3Rpb24uKkFubm90YWJsZScgKSApIHsKKyAgICAgICAgcnVuKCJwYXRjaCAtRjEwMCAtcDAgPCBtYWtlSW5zdHJ1Y3Rpb25Bbm5vdGFibGUucGF0Y2giKTsKKyAgICB9Cit9CisKK3N1YiByZWdyZXNzaW9uUHJlc2VudEF0IHsKKyAgICBteSAoJHRpbWUpID0gQF87CisKKyAgICB1cGRhdGVTb3VyY2VzKCR0aW1lKTsKKyAgICBidWlsZExpYnJhcmllc0FuZFRvb2xzKCk7CisgICAgbXkgJHJjID0gcnVuKCRTQ1JJUFQpOworICAgIGlmICgkcmMpIHsKKyAgICAgICAgcHJpbnQgTE9HICIqKiBGb3VuZCB0aGF0IHJlZ3Jlc3Npb24gd2FzIFBSRVNFTlQgYXQgIgorICAgICAgICAgIC4gdGltZUFzU3RyaW5nKCR0aW1lKSAuICJcbiI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnQgTE9HICIqKiBGb3VuZCB0aGF0IHJlZ3Jlc3Npb24gd2FzIEFCU0VOVCBhdCAiCisgICAgICAgICAgLiB0aW1lQXNTdHJpbmcoJHRpbWUpIC4gIlxuIjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdWIgcmVncmVzc2lvbkFic2VudEF0IHsKKyAgICBteSAoJHRpbWUpID0gQF87CisgICAgcmV0dXJuICFyZWdyZXNzaW9uUHJlc2VudEF0KCR0aW1lKTsKK30KKworc3ViIGNsb3NlVG8geworICAgIG15ICggJHRpbWUxLCAkdGltZTIgKSA9IEBfOworICAgIHJldHVybiBhYnMoICR0aW1lMSAtICR0aW1lMiApIDwgNjAwOyAgICAjIDEwIG1pbnV0ZXMgc2VlbXMgcmVhc29uYWJsZS4KK30KKworc3ViIGhhbGZXYXlQb2ludCB7CisgICAgbXkgKCAkdGltZTEsICR0aW1lMiApID0gQF87CisgICAgbXkgJGhhbGZTcGFuID0gaW50KCBhYnMoICR0aW1lMSAtICR0aW1lMiApIC8gMiApOworICAgIGlmICggJHRpbWUxIDwgJHRpbWUyICkgeworICAgICAgICByZXR1cm4gJHRpbWUxICsgJGhhbGZTcGFuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICR0aW1lMiArICRoYWxmU3BhbjsKKyAgICB9Cit9CisKK3N1YiBjaGVja0JvdW5kYXJ5Q29uZGl0aW9ucyB7CisgICAgcHJpbnQgTE9HICIqKiBDaGVja2luZyBmb3IgcHJlc2VuY2Ugb2YgcmVncmVzc2lvbiBhdCAiLCB0aW1lQXNTdHJpbmcoJERUSU1FKSwKKyAgICAgICJcbiI7CisgICAgaWYgKCAhcmVncmVzc2lvblByZXNlbnRBdCgkRFRJTUUpICkgeworICAgICAgICBkaWUgKCAiKiogQ2FuJ3QgaGVscCB5b3U7ICRTQ1JJUFQgc2F5cyByZWdyZXNzaW9uIGFic2VudCBhdCBkdGltZTogIgorICAgICAgICAgICAgICAuIHRpbWVBc1N0cmluZygkRFRJTUUpCisgICAgICAgICAgICAgIC4gIlxuIiApOworICAgIH0KKyAgICBwcmludCBMT0cgIioqIENoZWNraW5nIGZvciBhYnNlbmNlIG9mIHJlZ3Jlc3Npb24gYXQgIiwgdGltZUFzU3RyaW5nKCRXVElNRSksCisgICAgICAiXG4iOworICAgIGlmICggIXJlZ3Jlc3Npb25BYnNlbnRBdCgkV1RJTUUpICkgeworICAgICAgICBkaWUgKCAiKiogQ2FuJ3QgaGVscCB5b3U7ICRTQ1JJUFQgc2F5cyByZWdyZXNzaW9uIHByZXNlbnQgYXQgd3RpbWU6ICIKKyAgICAgICAgICAgICAgLiB0aW1lQXNTdHJpbmcoJFdUSU1FKQorICAgICAgICAgICAgICAuICJcbiIgKTsKKyAgICB9Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFNldCB1cCBsb2cgZmlsZXMKK29wZW4gKFNUREVSUiwgIj4mU1RET1VUIikgfHwgZGllICIqKiBDYW4ndCByZWRpcmVjdCBzdGQuZXJyOiAkIVxuIjsKK2F1dG9mbHVzaCBTVERPVVQgMTsKK2F1dG9mbHVzaCBTVERFUlIgMTsKK29wZW4gKExPRywgIj5SZWdGaW5kZXIubG9nIikgfHwgZGllICIqKiBjYW4ndCB3cml0ZSBSZWdGaW5kZXIubG9nOiAkIVxuIjsKK2F1dG9mbHVzaCBMT0cgMTsKKyMgQ2hlY2sgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitnZXRvcHRzKCdJdzpkOnQ6YzonKTsKK2lmICggISggJG9wdF93ICYmICRvcHRfZCAmJiAkb3B0X3QgJiYgJG9wdF9jICkgKSB7CisgICAgdXNhZ2U7Cit9CiskTUFLRSAgPSAkRU5WeydNQUtFJ307CiskTUFLRSAgPSAnZ21ha2UnIHVubGVzcyAkTUFLRTsKKyRXVElNRSA9IHRpbWVBc1NlY29uZHMoJG9wdF93KTsKK3ByaW50IExPRyAiKiogQXNzdW1pbmcgd29ya2VkIGF0ICIsIHRpbWVBc1N0cmluZygkV1RJTUUpLCAiXG4iOworJERUSU1FID0gdGltZUFzU2Vjb25kcygkb3B0X2QpOworcHJpbnQgTE9HICIqKiBBc3N1bWluZyBkaWRuJ3Qgd29yayBhdCAiLCB0aW1lQXNTdHJpbmcoJERUSU1FKSwgIlxuIjsKKyRvcHRfdCA9fiBzL1xzKi8vZzsKKyRTQ1JJUFQgPSAkb3B0X2M7CitkaWUgIioqICRTQ1JJUFQgaXMgbm90IGV4ZWN1dGFibGUgb3Igbm90IGZvdW5kXG4iIHVubGVzcyAteCAkU0NSSVBUOworcHJpbnQgTE9HICIqKiBDaGVja2luZyBmb3IgdGhlIHJlZ3Jlc3Npb24gdXNpbmcgJFNDUklQVFxuIjsKK0BUT09MUyA9IHNwbGl0ICggLywvLCAkb3B0X3QgKTsKK3ByaW50IExPRyAoCisgICAgIioqIEdvaW5nIHRvIHJlYnVpbGQ6ICIsCisgICAgKCBqb2luICIsICIsIEBUT09MUyApLAorICAgICIgYmVmb3JlIGVhY2ggJFNDUklQVCBydW5cbiIKKyk7CitpZiAoJG9wdF9JKSB7IGNoZWNrQm91bmRhcnlDb25kaXRpb25zKCk7IH0KKyMgZG8gdGhlIGRpcnR5IHdvcms6Cit3aGlsZSAoICFjbG9zZVRvKCAkRFRJTUUsICRXVElNRSApICkgeworICAgIG15ICRoYWxmUHQgPSBoYWxmV2F5UG9pbnQoICREVElNRSwgJFdUSU1FICk7CisgICAgcHJpbnQgTE9HICIqKiBDaGVja2luZyB3aGV0aGVyIHJlZ3Jlc3Npb24gaXMgcHJlc2VudCBhdCAiLAorICAgICAgdGltZUFzU3RyaW5nKCRoYWxmUHQpLCAiXG4iOworICAgIGlmICggcmVncmVzc2lvblByZXNlbnRBdCgkaGFsZlB0KSApIHsKKyAgICAgICAgJERUSU1FID0gJGhhbGZQdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRXVElNRSA9ICRoYWxmUHQ7CisgICAgfQorfQorIyBUZWxsIHRoZW0gd2hhdCB3ZSBmb3VuZAorcHJpbnQgTE9HICIqKiBOYXJyb3dlZCBpdCBkb3duIHRvOlxuIjsKK3ByaW50IExPRyAiKiogV29ya2VkIGF0OiAiLCAgICAgICB0aW1lQXNTdHJpbmcoJFdUSU1FKSwgIlxuIjsKK3ByaW50IExPRyAiKiogRGlkIG5vdCB3b3JrIGF0OiAiLCB0aW1lQXNTdHJpbmcoJERUSU1FKSwgIlxuIjsKK2Nsb3NlIExPRzsKK2V4aXQgMDsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FSTURlY29kZXJFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FSTURlY29kZXJFbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDRmNmNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQVJNRGVjb2RlckVtaXR0ZXIuY3BwCkBAIC0wLDAgKzEsMTg3OCBAQAorLy89PT0tLS0tLS0tLS0tLS0gQVJNRGVjb2RlckVtaXR0ZXIuY3BwIC0gRGVjb2RlciBHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQVJNIERpc2Fzc2VtYmxlci4KKy8vIEl0IGNvbnRhaW5zIHRoZSB0YWJsZWdlbiBiYWNrZW5kIHRoYXQgZW1pdHMgdGhlIGRlY29kZXIgZnVuY3Rpb25zIGZvciBBUk0gYW5kCisvLyBUaHVtYi4gIFRoZSBkaXNhc3NlbWJsZXIgY29yZSBpbmNsdWRlcyB0aGUgYXV0by1nZW5lcmF0ZWQgZmlsZSwgaW52b2tlcyB0aGUKKy8vIGRlY29kZXIgZnVuY3Rpb25zLCBhbmQgYnVpbGRzIHVwIHRoZSBNQ0luc3QgYmFzZWQgb24gdGhlIGRlY29kZWQgT3Bjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYXJtLWRlY29kZXItZW1pdHRlciIKKworI2luY2x1ZGUgIkFSTURlY29kZXJFbWl0dGVyLmgiCisjaW5jbHVkZSAiQ29kZUdlblRhcmdldC5oIgorI2luY2x1ZGUgIlJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICBFbnVtcyBhbmQgVXRpbGl0aWVzIGZvciBBUk0gSW5zdHJ1Y3Rpb24gRm9ybWF0IC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBBUk1fRk9STUFUUyAgICAgICAgICAgICAgICAgICBcCisgIEVOVFJZKEFSTV9GT1JNQVRfUFNFVURPLCAgICAgICAgIDApIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9NVUxGUk0sICAgICAgICAgMSkgXAorICBFTlRSWShBUk1fRk9STUFUX0JSRlJNLCAgICAgICAgICAyKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfQlJNSVNDRlJNLCAgICAgIDMpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9EUEZSTSwgICAgICAgICAgNCkgXAorICBFTlRSWShBUk1fRk9STUFUX0RQU09SRUdGUk0sICAgICA1KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTERGUk0sICAgICAgICAgIDYpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9TVEZSTSwgICAgICAgICAgNykgXAorICBFTlRSWShBUk1fRk9STUFUX0xETUlTQ0ZSTSwgICAgICA4KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfU1RNSVNDRlJNLCAgICAgIDkpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9MRFNUTVVMRlJNLCAgICAxMCkgXAorICBFTlRSWShBUk1fRk9STUFUX0xEU1RFWEZSTSwgICAgIDExKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfQVJJVEhNSVNDRlJNLCAgMTIpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9TQVRGUk0sICAgICAgICAxMykgXAorICBFTlRSWShBUk1fRk9STUFUX0VYVEZSTSwgICAgICAgIDE0KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfVkZQVU5BUllGUk0sICAgMTUpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9WRlBCSU5BUllGUk0sICAxNikgXAorICBFTlRSWShBUk1fRk9STUFUX1ZGUENPTlYxRlJNLCAgIDE3KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfVkZQQ09OVjJGUk0sICAgMTgpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9WRlBDT05WM0ZSTSwgICAxOSkgXAorICBFTlRSWShBUk1fRk9STUFUX1ZGUENPTlY0RlJNLCAgIDIwKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfVkZQQ09OVjVGUk0sICAgMjEpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9WRlBMRFNURlJNLCAgICAyMikgXAorICBFTlRSWShBUk1fRk9STUFUX1ZGUExEU1RNVUxGUk0sIDIzKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfVkZQTUlTQ0ZSTSwgICAgMjQpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9USFVNQkZSTSwgICAgICAyNSkgXAorICBFTlRSWShBUk1fRk9STUFUX01JU0NGUk0sICAgICAgIDI2KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTkVPTkdFVExORlJNLCAgMjcpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9ORU9OU0VUTE5GUk0sICAyOCkgXAorICBFTlRSWShBUk1fRk9STUFUX05FT05EVVBGUk0sICAgIDI5KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTkxkU3QsICAgICAgICAgMzApIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9OMVJlZ01vZEltbSwgICAzMSkgXAorICBFTlRSWShBUk1fRk9STUFUX04yUmVnLCAgICAgICAgIDMyKSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTlZDVlQsICAgICAgICAgMzMpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9OVmVjRHVwTG4sICAgICAzNCkgXAorICBFTlRSWShBUk1fRk9STUFUX04yUmVnVmVjU2hMLCAgIDM1KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTjJSZWdWZWNTaFIsICAgMzYpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9OM1JlZywgICAgICAgICAzNykgXAorICBFTlRSWShBUk1fRk9STUFUX04zUmVnVmVjU2gsICAgIDM4KSBcCisgIEVOVFJZKEFSTV9GT1JNQVRfTlZlY0V4dHJhY3QsICAgMzkpIFwKKyAgRU5UUlkoQVJNX0ZPUk1BVF9OVmVjTXVsU2NhbGFyLCA0MCkgXAorICBFTlRSWShBUk1fRk9STUFUX05WVEJMLCAgICAgICAgIDQxKQorCisvLyBBUk0gaW5zdHJ1Y3Rpb24gZm9ybWF0IHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBieSB0aGUgaW5zdHJ1Y3Rpb24uCisjZGVmaW5lIEVOVFJZKG4sIHYpIG4gPSB2LAordHlwZWRlZiBlbnVtIHsKKyAgQVJNX0ZPUk1BVFMKKyAgQVJNX0ZPUk1BVF9OQQorfSBBUk1Gb3JtYXQ7CisjdW5kZWYgRU5UUlkKKworLy8gQ29udmVydHMgZW51bSB0byBjb25zdCBjaGFyKi4KK3N0YXRpYyBjb25zdCBjaGFyICpzdHJpbmdGb3JBUk1Gb3JtYXQoQVJNRm9ybWF0IGZvcm0pIHsKKyNkZWZpbmUgRU5UUlkobiwgdikgY2FzZSBuOiByZXR1cm4gI247CisgIHN3aXRjaChmb3JtKSB7CisgICAgQVJNX0ZPUk1BVFMKKyAgY2FzZSBBUk1fRk9STUFUX05BOgorICBkZWZhdWx0OgorICAgIHJldHVybiAiIjsKKyAgfQorI3VuZGVmIEVOVFJZCit9CisKK2VudW0geworICBJbmRleE1vZGVOb25lID0gMCwKKyAgSW5kZXhNb2RlUHJlICA9IDEsCisgIEluZGV4TW9kZVBvc3QgPSAyLAorICBJbmRleE1vZGVVcGQgID0gMworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAvLworLy8gIFV0aWxpdHkgZnVuY3Rpb25zICAvLworLy8gICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLy8gYnl0ZUZyb21CaXRzSW5pdCAtIFJldHVybiB0aGUgYnl0ZSB2YWx1ZSBmcm9tIGEgQml0c0luaXQuCisvLy8gQ2FsbGVkIGZyb20gZ2V0Qnl0ZUZpZWxkKCkuCitzdGF0aWMgdWludDhfdCBieXRlRnJvbUJpdHNJbml0KEJpdHNJbml0ICZpbml0KSB7CisgIGludCB3aWR0aCA9IGluaXQuZ2V0TnVtQml0cygpOworCisgIGFzc2VydCh3aWR0aCA8PSA4ICYmICJGaWVsZCBpcyB0b28gbGFyZ2UgZm9yIHVpbnQ4X3QhIik7CisKKyAgaW50IGluZGV4OworICB1aW50OF90IG1hc2sgPSAweDAxOworCisgIHVpbnQ4X3QgcmV0ID0gMDsKKworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB3aWR0aDsgaW5kZXgrKykgeworICAgIGlmIChzdGF0aWNfY2FzdDxCaXRJbml0Kj4oaW5pdC5nZXRCaXQoaW5kZXgpKS0+Z2V0VmFsdWUoKSkKKyAgICAgIHJldCB8PSBtYXNrOworCisgICAgbWFzayA8PD0gMTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1aW50OF90IGdldEJ5dGVGaWVsZChjb25zdCBSZWNvcmQgJmRlZiwgY29uc3QgY2hhciAqc3RyKSB7CisgIEJpdHNJbml0ICpiaXRzID0gZGVmLmdldFZhbHVlQXNCaXRzSW5pdChzdHIpOworICByZXR1cm4gYnl0ZUZyb21CaXRzSW5pdCgqYml0cyk7Cit9CisKK3N0YXRpYyBCaXRzSW5pdCAmZ2V0Qml0c0ZpZWxkKGNvbnN0IFJlY29yZCAmZGVmLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgQml0c0luaXQgKmJpdHMgPSBkZWYuZ2V0VmFsdWVBc0JpdHNJbml0KHN0cik7CisgIHJldHVybiAqYml0czsKK30KKworLy8vIHNhbWVTdHJpbmdFeGNlcHRTdWZmaXggLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIHN0cmluZ3MgZGlmZmVyIG9ubHkgaW4gUkhTJ3MKKy8vLyBzdWZmaXguICAoIlZTVDRkOCIsICJWU1Q0ZDhfVVBEIiwgIl9VUEQiKSBhcyBpbnB1dCByZXR1cm5zIHRydWUuCitzdGF0aWMKK2Jvb2wgc2FtZVN0cmluZ0V4Y2VwdFN1ZmZpeChjb25zdCBTdHJpbmdSZWYgTEhTLCBjb25zdCBTdHJpbmdSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1JlZiBTdWZmaXgpIHsKKworICBpZiAoUkhTLnN0YXJ0c3dpdGgoTEhTKSAmJiBSSFMuZW5kc3dpdGgoU3VmZml4KSkKKyAgICByZXR1cm4gUkhTLnNpemUoKSA9PSBMSFMuc2l6ZSgpICsgU3VmZml4LnNpemUoKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyB0aHVtYkluc3RydWN0aW9uIC0gRGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhIFRodW1iIGluc3RydWN0aW9uLgorLy8vIFNlZSBhbHNvIEFSTUluc3RyRm9ybWF0cy50ZC4KK3N0YXRpYyBib29sIHRodW1iSW5zdHJ1Y3Rpb24odWludDhfdCBGb3JtKSB7CisgIHJldHVybiBGb3JtID09IEFSTV9GT1JNQVRfVEhVTUJGUk07Cit9CisKKy8vIFRoZSBzZXQgKEJJVF9UUlVFLCBCSVRfRkFMU0UsIEJJVF9VTlNFVCkgcmVwcmVzZW50cyBhIHRlcm5hcnkgbG9naWMgc3lzdGVtCisvLyBmb3IgYSBiaXQgdmFsdWUuCisvLworLy8gQklUX1VORklMVEVSRUQgaXMgdXNlZCBhcyB0aGUgaW5pdCB2YWx1ZSBmb3IgYSBmaWx0ZXIgcG9zaXRpb24uICBJdCBpcyB1c2VkCisvLyBvbmx5IGZvciBmaWx0ZXIgcHJvY2Vzc2luZ3MuCit0eXBlZGVmIGVudW0geworICBCSVRfVFJVRSwgICAgICAvLyAnMScKKyAgQklUX0ZBTFNFLCAgICAgLy8gJzAnCisgIEJJVF9VTlNFVCwgICAgIC8vICc/JworICBCSVRfVU5GSUxURVJFRCAvLyB1bmZpbHRlcmVkCit9IGJpdF92YWx1ZV90OworCitzdGF0aWMgYm9vbCBWYWx1ZVNldChiaXRfdmFsdWVfdCBWKSB7CisgIHJldHVybiAoViA9PSBCSVRfVFJVRSB8fCBWID09IEJJVF9GQUxTRSk7Cit9CitzdGF0aWMgYm9vbCBWYWx1ZU5vdFNldChiaXRfdmFsdWVfdCBWKSB7CisgIHJldHVybiAoViA9PSBCSVRfVU5TRVQpOworfQorc3RhdGljIGludCBWYWx1ZShiaXRfdmFsdWVfdCBWKSB7CisgIHJldHVybiBWYWx1ZU5vdFNldChWKSA/IC0xIDogKFYgPT0gQklUX0ZBTFNFID8gMCA6IDEpOworfQorc3RhdGljIGJpdF92YWx1ZV90IGJpdEZyb21CaXRzKEJpdHNJbml0ICZiaXRzLCB1bnNpZ25lZCBpbmRleCkgeworICBpZiAoQml0SW5pdCAqYml0ID0gZHluYW1pY19jYXN0PEJpdEluaXQqPihiaXRzLmdldEJpdChpbmRleCkpKQorICAgIHJldHVybiBiaXQtPmdldFZhbHVlKCkgPyBCSVRfVFJVRSA6IEJJVF9GQUxTRTsKKworICAvLyBUaGUgYml0IGlzIHVuaW5pdGlhbGl6ZWQuCisgIHJldHVybiBCSVRfVU5TRVQ7Cit9CisvLyBQcmludHMgdGhlIGJpdCB2YWx1ZSBmb3IgZWFjaCBwb3NpdGlvbi4KK3N0YXRpYyB2b2lkIGR1bXBCaXRzKHJhd19vc3RyZWFtICZvLCBCaXRzSW5pdCAmYml0cykgeworICB1bnNpZ25lZCBpbmRleDsKKworICBmb3IgKGluZGV4ID0gYml0cy5nZXROdW1CaXRzKCk7IGluZGV4ID4gMDsgaW5kZXgtLSkgeworICAgIHN3aXRjaCAoYml0RnJvbUJpdHMoYml0cywgaW5kZXggLSAxKSkgeworICAgIGNhc2UgQklUX1RSVUU6CisgICAgICBvIDw8ICIxIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklUX0ZBTFNFOgorICAgICAgbyA8PCAiMCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJVF9VTlNFVDoKKyAgICAgIG8gPDwgIl8iOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwICYmICJ1bmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGJpdEZyb21CaXRzIik7CisgICAgfQorICB9Cit9CisKKy8vIEVudW1zIGZvciB0aGUgYXZhaWxhYmxlIHRhcmdldCBuYW1lcy4KK3R5cGVkZWYgZW51bSB7CisgIFRBUkdFVF9BUk0gPSAwLAorICBUQVJHRVRfVEhVTUIKK30gVEFSR0VUX05BTUVfdDsKKworLy8gRklYTUU6IFBvc3NpYmx5IGF1dG8tZGV0ZWN0ZWQ/CisjZGVmaW5lIEJJVF9XSURUSCAzMgorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uLgorY2xhc3MgRmlsdGVyQ2hvb3NlcjsKKworLy8gUmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RydWN0aW9uIHRvIHdvcmsgb24uCit0eXBlZGVmIGJpdF92YWx1ZV90IGluc25fdFtCSVRfV0lEVEhdOworCisvLy8gRmlsdGVyIC0gRmlsdGVyIHdvcmtzIHdpdGggRmlsdGVyQ2hvb3NlciB0byBwcm9kdWNlIHRoZSBkZWNvZGluZyB0cmVlIGZvcgorLy8vIHRoZSBJU0EuCisvLy8KKy8vLyBJdCBpcyB1c2VmdWwgdG8gdGhpbmsgb2YgYSBGaWx0ZXIgYXMgZ292ZXJuaW5nIHRoZSBzd2l0Y2ggc3RtdHMgb2YgdGhlCisvLy8gZGVjb2RpbmcgdHJlZSBpbiBhIGNlcnRhaW4gbGV2ZWwuICBFYWNoIGNhc2Ugc3RtdCBkZWxlZ2F0ZXMgdG8gYW4gaW5mZXJpb3IKKy8vLyBGaWx0ZXJDaG9vc2VyIHRvIGRlY2lkZSB3aGF0IGZ1cnRoZXIgZGVjb2RpbmcgbG9naWMgdG8gZW1wbG95LCBvciBpbiBhbm90aGVyCisvLy8gd29yZHMsIHdoYXQgb3RoZXIgcmVtYWluaW5nIGJpdHMgdG8gbG9vayBhdC4gIFRoZSBGaWx0ZXJDaG9vc2VyIGV2ZW50dWFsbHkKKy8vLyBjaG9vc2VzIGEgYmVzdCBGaWx0ZXIgdG8gZG8gaXRzIGpvYi4KKy8vLworLy8vIFRoaXMgcmVjdXJzaXZlIHNjaGVtZSBlbmRzIHdoZW4gdGhlIG51bWJlciBvZiBPcGNvZGVzIGFzc2lnbmVkIHRvIHRoZQorLy8vIEZpbHRlckNob29zZXIgYmVjb21lcyAxIG9yIGlmIHRoZXJlIGlzIGEgY29uZmxpY3QuICBBIGNvbmZsaWN0IGhhcHBlbnMgd2hlbgorLy8vIHRoZSBGaWx0ZXIvRmlsdGVyQ2hvb3NlciBjb21ibyBkb2VzIG5vdCBrbm93IGhvdyB0byBkaXN0aW5ndWlzaCBhbW9uZyB0aGUKKy8vLyBPcGNvZGVzIGFzc2lnbmVkLgorLy8vCisvLy8gQW4gZXhhbXBsZSBvZiBhIGNvbmZsY2l0IGlzIAorLy8vCisvLy8gQ29uZmxpY3Q6CisvLy8gICAgICAgICAgICAgICAgICAgICAxMTExMDEwMDAuMDAuLi4uLi4uLjAwMDEwMDAwLi4uLgorLy8vICAgICAgICAgICAgICAgICAgICAgMTExMTAxMDAwLjAwLi4uLi4uLi4wMDAxLi4uLi4uLi4KKy8vLyAgICAgICAgICAgICAgICAgICAgIDExMTEwMTAuLi4wMC4uLi4uLi4uMDAwMS4uLi4uLi4uCisvLy8gICAgICAgICAgICAgICAgICAgICAxMTExMDEwLi4uMDAuLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8vICAgICAgICAgICAgICAgICAgICAgMTExMTAxMC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vLyAgICAgICAgICAgICAgICAgICAgIDExMTEuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisvLy8gICAgICAgICAgICAgICAgICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8vICAgICBWU1Q0cThhICAgICAgICAgMTExMTAxMDAwXzAwX19fX19fX18wMDAxMDAwMF9fX18KKy8vLyAgICAgVlNUNHE4YiAgICAgICAgIDExMTEwMTAwMF8wMF9fX19fX19fMDAwMTAwMDBfX19fCisvLy8KKy8vLyBUaGUgRGVidWcgb3V0cHV0IHNob3dzIHRoZSBwYXRoIHRoYXQgdGhlIGRlY29kaW5nIHRyZWUgZm9sbG93cyB0byByZWFjaCB0aGUKKy8vLyB0aGUgY29uY2x1c2lvbiB0aGF0IHRoZXJlIGlzIGEgY29uZmxpY3QuICBWU1Q0cThhIGlzIGEgdnN0NCB0byBkb3VibGUtc3BhY2VkCisvLy8gZXZlbiByZWdpc3RlcnMsIHdoaWxlIFZTVDRxOGIgaXMgYSB2c3Q0IHRvIGRvdWJsZS1zcGFjZWQgb2RkIHJlZ3Npc3RlcnMuCisvLy8KKy8vLyBUaGUgZW5jb2RpbmcgaW5mbyBpbiB0aGUgLnRkIGZpbGVzIGRvZXMgbm90IHNwZWNpZnkgdGhpcyBtZXRhIGluZm9ybWF0aW9uLAorLy8vIHdoaWNoIGNvdWxkIGhhdmUgYmVlbiB1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0LiAgVGhlCisvLy8gZGVjb2RlciBjb3VsZCB0cnkgdG8gZGVjb2RlIHRoZSBldmVuL29kZCByZWdpc3RlciBudW1iZXJpbmcgYW5kIGFzc2lnbiB0bworLy8vIFZTVDRxOGEgb3IgVlNUNHE4YiwgYnV0IGZvciB0aGUgdGltZSBiZWluZywgdGhlIGRlY29kZXIgY2hvb3NlcyB0aGUgImEiCisvLy8gdmVyc2lvbiBhbmQgcmV0dXJuIHRoZSBPcGNvZGUgc2luY2UgdGhlIHR3byBoYXZlIHRoZSBzYW1lIEFzbSBmb3JtYXQgc3RyaW5nLgorY2xhc3MgRmlsdGVyIHsKK3Byb3RlY3RlZDoKKyAgRmlsdGVyQ2hvb3NlciAqT3duZXI7IC8vIHBvaW50cyB0byB0aGUgRmlsdGVyQ2hvb3NlciB3aG8gb3ducyB0aGlzIGZpbHRlcgorICB1bnNpZ25lZCBTdGFydEJpdDsgLy8gdGhlIHN0YXJ0aW5nIGJpdCBwb3NpdGlvbgorICB1bnNpZ25lZCBOdW1CaXRzOyAvLyBudW1iZXIgb2YgYml0cyB0byBmaWx0ZXIKKyAgYm9vbCBNaXhlZDsgLy8gYSBtaXhlZCByZWdpb24gY29udGFpbnMgYm90aCBzZXQgYW5kIHVuc2V0IGJpdHMKKworICAvLyBNYXAgb2Ygd2VsbC1rbm93biBzZWdtZW50IHZhbHVlIHRvIHRoZSBzZXQgb2YgdWlkJ3Mgd2l0aCB0aGF0IHZhbHVlLiAKKyAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiA+IEZpbHRlcmVkSW5zdHJ1Y3Rpb25zOworCisgIC8vIFNldCBvZiB1aWQncyB3aXRoIG5vbi1jb25zdGFudCBzZWdtZW50IHZhbHVlcy4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFZhcmlhYmxlSW5zdHJ1Y3Rpb25zOworCisgIC8vIE1hcCBvZiB3ZWxsLWtub3duIHNlZ21lbnQgdmFsdWUgdG8gaXRzIGRlbGVnYXRlLgorICBzdGQ6Om1hcDx1bnNpZ25lZCwgRmlsdGVyQ2hvb3Nlcio+IEZpbHRlckNob29zZXJNYXA7CisKKyAgLy8gTnVtYmVyIG9mIGluc3RydWN0aW9ucyB3aGljaCBmYWxsIHVuZGVyIEZpbHRlcmVkSW5zdHJ1Y3Rpb25zIGNhdGVnb3J5LgorICB1bnNpZ25lZCBOdW1GaWx0ZXJlZDsKKworICAvLyBLZWVwcyB0cmFjayBvZiB0aGUgbGFzdCBvcGNvZGUgaW4gdGhlIGZpbHRlcmVkIGJ1Y2tldC4KKyAgdW5zaWduZWQgTGFzdE9wY0ZpbHRlcmVkOworCisgIC8vIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgd2hpY2ggZmFsbCB1bmRlciBWYXJpYWJsZUluc3RydWN0aW9ucyBjYXRlZ29yeS4KKyAgdW5zaWduZWQgTnVtVmFyaWFibGU7CisKK3B1YmxpYzoKKyAgdW5zaWduZWQgZ2V0TnVtRmlsdGVyZWQoKSB7IHJldHVybiBOdW1GaWx0ZXJlZDsgfQorICB1bnNpZ25lZCBnZXROdW1WYXJpYWJsZSgpIHsgcmV0dXJuIE51bVZhcmlhYmxlOyB9CisgIHVuc2lnbmVkIGdldFNpbmdsZXRvbk9wYygpIHsKKyAgICBhc3NlcnQoTnVtRmlsdGVyZWQgPT0gMSk7CisgICAgcmV0dXJuIExhc3RPcGNGaWx0ZXJlZDsKKyAgfQorICAvLyBSZXR1cm4gdGhlIGZpbHRlciBjaG9vc2VyIGZvciB0aGUgZ3JvdXAgb2YgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgY29uc3RhbnQKKyAgLy8gc2VnbWVudCB2YWx1ZXMuCisgIEZpbHRlckNob29zZXIgJmdldFZhcmlhYmxlRkMoKSB7CisgICAgYXNzZXJ0KE51bUZpbHRlcmVkID09IDEpOworICAgIGFzc2VydChGaWx0ZXJDaG9vc2VyTWFwLnNpemUoKSA9PSAxKTsKKyAgICByZXR1cm4gKihGaWx0ZXJDaG9vc2VyTWFwLmZpbmQoKHVuc2lnbmVkKS0xKS0+c2Vjb25kKTsKKyAgfQorCisgIEZpbHRlcihjb25zdCBGaWx0ZXIgJmYpOworICBGaWx0ZXIoRmlsdGVyQ2hvb3NlciAmb3duZXIsIHVuc2lnbmVkIHN0YXJ0Qml0LCB1bnNpZ25lZCBudW1CaXRzLCBib29sIG1peGVkKTsKKworICB+RmlsdGVyKCk7CisKKyAgLy8gRGl2aWRlcyB0aGUgZGVjb2RpbmcgdGFzayBpbnRvIHN1YiB0YXNrcyBhbmQgZGVsZWdhdGVzIHRoZW0gdG8gdGhlCisgIC8vIGluZmVyaW9yIEZpbHRlckNob29zZXIncy4KKyAgLy8KKyAgLy8gQSBzcGVjaWFsIGNhc2UgYXJpc2VzIHdoZW4gdGhlcmUncyBvbmx5IG9uZSBlbnRyeSBpbiB0aGUgZmlsdGVyZWQKKyAgLy8gaW5zdHJ1Y3Rpb25zLiAgSW4gb3JkZXIgdG8gdW5hbWJpZ3VvdXNseSBkZWNvZGUgdGhlIHNpbmdsZXRvbiwgd2UgbmVlZCB0bworICAvLyBtYXRjaCB0aGUgcmVtYWluaW5nIHVuZGVjb2RlZCBlbmNvZGluZyBiaXRzIGFnYWluc3QgdGhlIHNpbmdsZXRvbi4KKyAgdm9pZCByZWN1cnNlKCk7CisKKyAgLy8gRW1pdCBjb2RlIHRvIGRlY29kZSBpbnN0cnVjdGlvbnMgZ2l2ZW4gYSBzZWdtZW50IG9yIHNlZ21lbnRzIG9mIGJpdHMuCisgIHZvaWQgZW1pdChyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgJkluZGVudGF0aW9uKTsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmFub3V0IHByb2R1Y2VkIGJ5IHRoZSBmaWx0ZXIuICBNb3JlIGZhbm91dCBpbXBsaWVzCisgIC8vIHRoZSBmaWx0ZXIgZGlzdGluZ3Vpc2hlcyBtb3JlIGNhdGVnb3JpZXMgb2YgaW5zdHJ1Y3Rpb25zLgorICB1bnNpZ25lZCB1c2VmdWxuZXNzKCkgY29uc3Q7Cit9OyAvLyBFbmQgb2YgY2xhc3MgRmlsdGVyCisKKy8vIFRoZXNlIGFyZSBzdGF0ZXMgb2Ygb3VyIGZpbml0ZSBzdGF0ZSBtYWNoaW5lcyB1c2VkIGluIEZpbHRlckNob29zZXIncworLy8gZmlsdGVyUHJvY2Vzc29yKCkgd2hpY2ggcHJvZHVjZXMgdGhlIGZpbHRlciBjYW5kaWRhdGVzIHRvIHVzZS4KK3R5cGVkZWYgZW51bSB7CisgIEFUVFJfTk9ORSwKKyAgQVRUUl9GSUxURVJFRCwKKyAgQVRUUl9BTExfU0VULAorICBBVFRSX0FMTF9VTlNFVCwKKyAgQVRUUl9NSVhFRAorfSBiaXRBdHRyX3Q7CisKKy8vLyBGaWx0ZXJDaG9vc2VyIC0gRmlsdGVyQ2hvb3NlciBjaG9vc2VzIHRoZSBiZXN0IGZpbHRlciBhbW9uZyBhIHNldCBvZiBGaWx0ZXJzCisvLy8gaW4gb3JkZXIgdG8gcGVyZm9ybSB0aGUgZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zIGF0IHRoZSBjdXJyZW50IGxldmVsLgorLy8vCisvLy8gRGVjb2RpbmcgcHJvY2VlZHMgZnJvbSB0aGUgdG9wIGRvd24uICBCYXNlZCBvbiB0aGUgd2VsbC1rbm93biBlbmNvZGluZyBiaXRzCisvLy8gb2YgaW5zdHJ1Y3Rpb25zIGF2YWlsYWJsZSwgRmlsdGVyQ2hvb3NlciBidWlsZHMgdXAgdGhlIHBvc3NpYmxlIEZpbHRlcnMgdGhhdAorLy8vIGNhbiBmdXJ0aGVyIHRoZSB0YXNrIG9mIGRlY29kaW5nIGJ5IGRpc3Rpbmd1aXNoaW5nIGFtb25nIHRoZSByZW1haW5pbmcKKy8vLyBjYW5kaWRhdGUgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gT25jZSBhIGZpbHRlciBoYXMgYmVlbiBjaG9zZW4sIGl0IGlzIGNhbGxlZCB1cG9uIHRvIGRpdmlkZSB0aGUgZGVjb2RpbmcgdGFzaworLy8vIGludG8gc3ViLXRhc2tzIGFuZCBkZWxlZ2F0ZXMgdGhlbSB0byBpdHMgaW5mZXJpb3IgRmlsdGVyQ2hvb3NlcnMgZm9yIGZ1cnRoZXIKKy8vLyBwcm9jZXNzaW5ncy4KKy8vLworLy8vIEl0IGlzIHVzZWZ1bCB0byB0aGluayBvZiBhIEZpbHRlciBhcyBnb3Zlcm5pbmcgdGhlIHN3aXRjaCBzdG10cyBvZiB0aGUKKy8vLyBkZWNvZGluZyB0cmVlLiAgQW5kIGVhY2ggY2FzZSBpcyBkZWxlZ2F0ZWQgdG8gYW4gaW5mZXJpb3IgRmlsdGVyQ2hvb3NlciB0bworLy8vIGRlY2lkZSB3aGF0IGZ1cnRoZXIgcmVtYWluaW5nIGJpdHMgdG8gbG9vayBhdC4KK2NsYXNzIEZpbHRlckNob29zZXIgeworICBzdGF0aWMgVEFSR0VUX05BTUVfdCBUYXJnZXROYW1lOworCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBGaWx0ZXI7CisKKyAgLy8gVmVjdG9yIG9mIGNvZGVnZW4gaW5zdHJ1Y3Rpb25zIHRvIGNob29zZSBvdXIgZmlsdGVyLgorICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPiAmQWxsSW5zdHJ1Y3Rpb25zOworCisgIC8vIFZlY3RvciBvZiB1aWQncyBmb3IgdGhpcyBmaWx0ZXIgY2hvb3NlciB0byB3b3JrIG9uLgorICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gT3Bjb2RlczsKKworICAvLyBWZWN0b3Igb2YgY2FuZGlkYXRlIGZpbHRlcnMuCisgIHN0ZDo6dmVjdG9yPEZpbHRlcj4gRmlsdGVyczsKKworICAvLyBBcnJheSBvZiBiaXQgdmFsdWVzIHBhc3NlZCBkb3duIGZyb20gb3VyIHBhcmVudC4KKyAgLy8gU2V0IHRvIGFsbCBCSVRfVU5GSUxURVJFRCdzIGZvciBQYXJlbnQgPT0gTlVMTC4KKyAgYml0X3ZhbHVlX3QgRmlsdGVyQml0VmFsdWVzW0JJVF9XSURUSF07CisKKyAgLy8gTGlua3MgdG8gdGhlIEZpbHRlckNob29zZXIgYWJvdmUgdXMgaW4gdGhlIGRlY29kaW5nIHRyZWUuCisgIEZpbHRlckNob29zZXIgKlBhcmVudDsKKyAgCisgIC8vIEluZGV4IG9mIHRoZSBiZXN0IGZpbHRlciBmcm9tIEZpbHRlcnMuCisgIGludCBCZXN0SW5kZXg7CisKK3B1YmxpYzoKKyAgc3RhdGljIHZvaWQgc2V0VGFyZ2V0TmFtZShUQVJHRVRfTkFNRV90IHRuKSB7IFRhcmdldE5hbWUgPSB0bjsgfQorCisgIEZpbHRlckNob29zZXIoY29uc3QgRmlsdGVyQ2hvb3NlciAmRkMpIDoKKyAgICAgIEFsbEluc3RydWN0aW9ucyhGQy5BbGxJbnN0cnVjdGlvbnMpLCBPcGNvZGVzKEZDLk9wY29kZXMpLAorICAgICAgRmlsdGVycyhGQy5GaWx0ZXJzKSwgUGFyZW50KEZDLlBhcmVudCksIEJlc3RJbmRleChGQy5CZXN0SW5kZXgpIHsKKyAgICBtZW1jcHkoRmlsdGVyQml0VmFsdWVzLCBGQy5GaWx0ZXJCaXRWYWx1ZXMsIHNpemVvZihGaWx0ZXJCaXRWYWx1ZXMpKTsKKyAgfQorCisgIEZpbHRlckNob29zZXIoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQ29kZUdlbkluc3RydWN0aW9uKj4gJkluc3RzLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmSURzKSA6CisgICAgICBBbGxJbnN0cnVjdGlvbnMoSW5zdHMpLCBPcGNvZGVzKElEcyksIEZpbHRlcnMoKSwgUGFyZW50KE5VTEwpLAorICAgICAgQmVzdEluZGV4KC0xKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVF9XSURUSDsgKytpKQorICAgICAgRmlsdGVyQml0VmFsdWVzW2ldID0gQklUX1VORklMVEVSRUQ7CisKKyAgICBkb0ZpbHRlcigpOworICB9CisKKyAgRmlsdGVyQ2hvb3Nlcihjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPiAmSW5zdHMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZJRHMsCisgICAgICAgICAgICAgICAgYml0X3ZhbHVlX3QgKCZQYXJlbnRGaWx0ZXJCaXRWYWx1ZXMpW0JJVF9XSURUSF0sCisgICAgICAgICAgICAgICAgRmlsdGVyQ2hvb3NlciAmcGFyZW50KSA6CisgICAgICBBbGxJbnN0cnVjdGlvbnMoSW5zdHMpLCBPcGNvZGVzKElEcyksIEZpbHRlcnMoKSwgUGFyZW50KCZwYXJlbnQpLAorICAgICAgQmVzdEluZGV4KC0xKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVF9XSURUSDsgKytpKQorICAgICAgRmlsdGVyQml0VmFsdWVzW2ldID0gUGFyZW50RmlsdGVyQml0VmFsdWVzW2ldOworCisgICAgZG9GaWx0ZXIoKTsKKyAgfQorCisgIC8vIFRoZSB0b3AgbGV2ZWwgZmlsdGVyIGNob29zZXIgaGFzIE5VTEwgYXMgaXRzIHBhcmVudC4KKyAgYm9vbCBpc1RvcExldmVsKCkgeyByZXR1cm4gUGFyZW50ID09IE5VTEw7IH0KKworICAvLyBUaGlzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IGZvciB0YXJnZXQgc3BlY2lmaWMgY29kZSBlbWlzc2lvbi4KKyAgdm9pZCBlbWl0VG9wSG9vayhyYXdfb3N0cmVhbSAmbyk7CisKKyAgLy8gRW1pdCB0aGUgdG9wIGxldmVsIHR5cGVkZWYgYW5kIGRlY29kZUluc3RydWN0aW9uKCkgZnVuY3Rpb24uCisgIHZvaWQgZW1pdFRvcChyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgJkluZGVudGF0aW9uKTsKKworICAvLyBUaGlzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IGZvciB0YXJnZXQgc3BlY2lmaWMgY29kZSBlbWlzc2lvbiBhZnRlcgorICAvLyBlbWl0VG9wKCkuCisgIHZvaWQgZW1pdEJvdChyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgJkluZGVudGF0aW9uKTsKKworcHJvdGVjdGVkOgorICAvLyBQb3B1bGF0ZXMgdGhlIGluc24gZ2l2ZW4gdGhlIHVpZC4KKyAgdm9pZCBpbnNuV2l0aElEKGluc25fdCAmSW5zbiwgdW5zaWduZWQgT3Bjb2RlKSBjb25zdCB7CisgICAgQml0c0luaXQgJkJpdHMgPSBnZXRCaXRzRmllbGQoKkFsbEluc3RydWN0aW9uc1tPcGNvZGVdLT5UaGVEZWYsICJJbnN0Iik7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUX1dJRFRIOyArK2kpCisgICAgICBJbnNuW2ldID0gYml0RnJvbUJpdHMoQml0cywgaSk7CisKKyAgICAvLyBTZXQgSW5zdHsyMX0gdG8gMSAod2JhY2spIHdoZW4gSW5kZXhNb2RlQml0cyA9PSBJbmRleE1vZGVVcGQuCisgICAgaWYgKGdldEJ5dGVGaWVsZCgqQWxsSW5zdHJ1Y3Rpb25zW09wY29kZV0tPlRoZURlZiwgIkluZGV4TW9kZUJpdHMiKQorICAgICAgICA9PSBJbmRleE1vZGVVcGQpCisgICAgICBJbnNuWzIxXSA9IEJJVF9UUlVFOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgcmVjb3JkIG5hbWUuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lV2l0aElEKHVuc2lnbmVkIE9wY29kZSkgY29uc3QgeworICAgIHJldHVybiBBbGxJbnN0cnVjdGlvbnNbT3Bjb2RlXS0+VGhlRGVmLT5nZXROYW1lKCk7CisgIH0KKworICAvLyBQb3B1bGF0ZXMgdGhlIGZpZWxkIG9mIHRoZSBpbnNuIGdpdmVuIHRoZSBzdGFydCBwb3NpdGlvbiBhbmQgdGhlIG51bWJlciBvZgorICAvLyBjb25zZWN1dGl2ZSBiaXRzIHRvIHNjYW4gZm9yLgorICAvLworICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGV4aXN0cyBhbnkgdW5pbml0aWFsaXplZCBiaXQgdmFsdWUgaW4gdGhlIHJhbmdlLgorICAvLyBSZXR1cm5zIHRydWUsIG90aGVyd2lzZS4KKyAgYm9vbCBmaWVsZEZyb21JbnNuKHVpbnQ2NF90ICZGaWVsZCwgaW5zbl90ICZJbnNuLCB1bnNpZ25lZCBTdGFydEJpdCwKKyAgICAgIHVuc2lnbmVkIE51bUJpdHMpIGNvbnN0OworCisgIC8vLyBkdW1wRmlsdGVyQXJyYXkgLSBkdW1wRmlsdGVyQXJyYXkgcHJpbnRzIG91dCBkZWJ1Z2dpbmcgaW5mbyBmb3IgdGhlIGdpdmVuCisgIC8vLyBmaWx0ZXIgYXJyYXkgYXMgYSBzZXJpZXMgb2YgY2hhcnMuCisgIHZvaWQgZHVtcEZpbHRlckFycmF5KHJhd19vc3RyZWFtICZvLCBiaXRfdmFsdWVfdCAoJmZpbHRlcilbQklUX1dJRFRIXSk7CisKKyAgLy8vIGR1bXBTdGFjayAtIGR1bXBTdGFjayB0cmF2ZXJzZXMgdGhlIGZpbHRlciBjaG9vc2VyIGNoYWluIGFuZCBjYWxscworICAvLy8gZHVtcEZpbHRlckFycmF5IG9uIGVhY2ggZmlsdGVyIGNob29zZXIgdXAgdG8gdGhlIHRvcCBsZXZlbCBvbmUuCisgIHZvaWQgZHVtcFN0YWNrKHJhd19vc3RyZWFtICZvLCBjb25zdCBjaGFyICpwcmVmaXgpOworCisgIEZpbHRlciAmYmVzdEZpbHRlcigpIHsKKyAgICBhc3NlcnQoQmVzdEluZGV4ICE9IC0xICYmICJCZXN0SW5kZXggbm90IHNldCIpOworICAgIHJldHVybiBGaWx0ZXJzW0Jlc3RJbmRleF07CisgIH0KKworICAvLyBDYWxsZWQgZnJvbSBGaWx0ZXI6OnJlY3Vyc2UoKSB3aGVuIHNpbmdsZXRvbiBleGlzdHMuICBGb3IgZGVidWcgcHVycG9zZS4KKyAgdm9pZCBTaW5nbGV0b25FeGlzdHModW5zaWduZWQgT3BjKTsKKworICBib29sIFBvc2l0aW9uRmlsdGVyZWQodW5zaWduZWQgaSkgeworICAgIHJldHVybiBWYWx1ZVNldChGaWx0ZXJCaXRWYWx1ZXNbaV0pOworICB9CisKKyAgLy8gQ2FsY3VsYXRlcyB0aGUgaXNsYW5kKHMpIG5lZWRlZCB0byBkZWNvZGUgdGhlIGluc3RydWN0aW9uLgorICAvLyBUaGlzIHJldHVybnMgYSBsaXQgb2YgdW5kZWNvZGVkIGJpdHMgb2YgYW4gaW5zdHJ1Y3Rpb25zLCBmb3IgZXhhbXBsZSwKKyAgLy8gSW5zdHsyMH0gPSAxICYmIEluc3R7My0wfSA9PSAwYjExMTEgcmVwcmVzZW50cyB0d28gaXNsYW5kcyBvZiB5ZXQtdG8tYmUKKyAgLy8gZGVjb2RlZCBiaXRzIGluIG9yZGVyIHRvIHZlcmlmeSB0aGF0IHRoZSBpbnN0cnVjdGlvbiBtYXRjaGVzIHRoZSBPcGNvZGUuCisgIHVuc2lnbmVkIGdldElzbGFuZHMoc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZTdGFydEJpdHMsCisgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJkVuZEJpdHMsIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmRmllbGRWYWxzLAorICAgICAgaW5zbl90ICZJbnNuKTsKKworICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGZvciB0aGUgQVBJIGNsaWVudCB0byBkZXRlY3QgcG9zc2libGUKKyAgLy8gTG9hZC9TdG9yZSBDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuICBJZiB0aGUgY29wcm9jZXNzb3IgbnVtYmVyIGlzIG9mCisgIC8vIHRoZSBpbnN0cnVjdGlvbiBpcyBlaXRoZXIgMTAgb3IgMTEsIHRoZSBkZWNvZGVyIHNob3VsZCBub3QgcmVwb3J0IHRoZQorICAvLyBpbnN0cnVjdGlvbiBhcyBMREMvTERDMi9TVEMvU1RDMiwgYnV0IHNob3VsZCBtYXRjaCBhZ2FpbnN0IEFkdmFuY2VkIFNJTUQgb3IKKyAgLy8gVkZQIGluc3RydWN0aW9ucy4KKyAgYm9vbCBMZFN0Q29wRW5jb2RpbmcxKHVuc2lnbmVkIE9wYykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lID0gbmFtZVdpdGhJRChPcGMpOworICAgIGlmIChOYW1lID09ICJMRENfT0ZGU0VUIiB8fCBOYW1lID09ICJMRENfT1BUSU9OIiB8fAorICAgICAgICBOYW1lID09ICJMRENfUE9TVCIgfHwgTmFtZSA9PSAiTERDX1BSRSIgfHwKKyAgICAgICAgTmFtZSA9PSAiTERDTF9PRkZTRVQiIHx8IE5hbWUgPT0gIkxEQ0xfT1BUSU9OIiB8fAorICAgICAgICBOYW1lID09ICJMRENMX1BPU1QiIHx8IE5hbWUgPT0gIkxEQ0xfUFJFIiB8fAorICAgICAgICBOYW1lID09ICJTVENfT0ZGU0VUIiB8fCBOYW1lID09ICJTVENfT1BUSU9OIiB8fAorICAgICAgICBOYW1lID09ICJTVENfUE9TVCIgfHwgTmFtZSA9PSAiU1RDX1BSRSIgfHwKKyAgICAgICAgTmFtZSA9PSAiU1RDTF9PRkZTRVQiIHx8IE5hbWUgPT0gIlNUQ0xfT1BUSU9OIiB8fAorICAgICAgICBOYW1lID09ICJTVENMX1BPU1QiIHx8IE5hbWUgPT0gIlNUQ0xfUFJFIikKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEVtaXRzIGNvZGUgdG8gZGVjb2RlIHRoZSBzaW5nbGV0b24uICBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIG1hdGNoZWQgYWxsIHRoZQorICAvLyB3ZWxsLWtub3duIGJpdHMuCisgIGJvb2wgZW1pdFNpbmdsZXRvbkRlY29kZXIocmF3X29zdHJlYW0gJm8sIHVuc2lnbmVkICZJbmRlbnRhdGlvbix1bnNpZ25lZCBPcGMpOworCisgIC8vIEVtaXRzIGNvZGUgdG8gZGVjb2RlIHRoZSBzaW5nbGV0b24sIGFuZCB0aGVuIHRvIGRlY29kZSB0aGUgcmVzdC4KKyAgdm9pZCBlbWl0U2luZ2xldG9uRGVjb2RlcihyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgJkluZGVudGF0aW9uLEZpbHRlciAmQmVzdCk7CisKKyAgLy8gQXNzaWduIGEgc2luZ2xlIGZpbHRlciBhbmQgcnVuIHdpdGggaXQuCisgIHZvaWQgcnVuU2luZ2xlRmlsdGVyKEZpbHRlckNob29zZXIgJm93bmVyLCB1bnNpZ25lZCBzdGFydEJpdCwgdW5zaWduZWQgbnVtQml0LAorICAgICAgYm9vbCBtaXhlZCk7CisKKyAgLy8gcmVwb3J0UmVnaW9uIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBmaWx0ZXJQcm9jZXNzb3IgdG8gbWFyayBhIHJlZ2lvbiBhcworICAvLyBlbGlnaWJsZSBmb3IgdXNlIGFzIGEgZmlsdGVyIHJlZ2lvbi4KKyAgdm9pZCByZXBvcnRSZWdpb24oYml0QXR0cl90IFJBLCB1bnNpZ25lZCBTdGFydEJpdCwgdW5zaWduZWQgQml0SW5kZXgsCisgICAgICBib29sIEFsbG93TWl4ZWQpOworCisgIC8vIEZpbHRlclByb2Nlc3NvciBzY2FucyB0aGUgd2VsbC1rbm93biBlbmNvZGluZyBiaXRzIG9mIHRoZSBpbnN0cnVjdGlvbnMgYW5kCisgIC8vIGJ1aWxkcyB1cCBhIGxpc3Qgb2YgY2FuZGlkYXRlIGZpbHRlcnMuICBJdCBjaG9vc2VzIHRoZSBiZXN0IGZpbHRlciBhbmQKKyAgLy8gcmVjdXJzaXZlbHkgZGVzY2VuZHMgZG93biB0aGUgZGVjb2RpbmcgdHJlZS4KKyAgYm9vbCBmaWx0ZXJQcm9jZXNzb3IoYm9vbCBBbGxvd01peGVkLCBib29sIEdyZWVkeSA9IHRydWUpOworCisgIC8vIERlY2lkZXMgb24gdGhlIGJlc3QgY29uZmlndXJhdGlvbiBvZiBmaWx0ZXIocykgdG8gdXNlIGluIG9yZGVyIHRvIGRlY29kZQorICAvLyB0aGUgaW5zdHJ1Y3Rpb25zLiAgQSBjb25mbGljdCBvZiBpbnN0cnVjdGlvbnMgbWF5IG9jY3VyLCBpbiB3aGljaCBjYXNlIHdlCisgIC8vIGR1bXAgdGhlIGNvbmZsaWN0IHNldCB0byB0aGUgc3RhbmRhcmQgZXJyb3IuCisgIHZvaWQgZG9GaWx0ZXIoKTsKKworICAvLyBFbWl0cyBjb2RlIHRvIGRlY29kZSBvdXIgc2hhcmUgb2YgaW5zdHJ1Y3Rpb25zLiAgUmV0dXJucyB0cnVlIGlmIHRoZQorICAvLyBlbWl0dGVkIGNvZGUgY2F1c2VzIGEgcmV0dXJuLCB3aGljaCBvY2N1cnMgaWYgd2Uga25vdyBob3cgdG8gZGVjb2RlCisgIC8vIHRoZSBpbnN0cnVjdGlvbiBhdCB0aGlzIGxldmVsIG9yIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgZGVjb2RlYWJsZS4KKyAgYm9vbCBlbWl0KHJhd19vc3RyZWFtICZvLCB1bnNpZ25lZCAmSW5kZW50YXRpb24pOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vIEZpbHRlciBJbXBsbWVuZXRhdGlvbiAvLworLy8gICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRmlsdGVyOjpGaWx0ZXIoY29uc3QgRmlsdGVyICZmKSA6CisgIE93bmVyKGYuT3duZXIpLCBTdGFydEJpdChmLlN0YXJ0Qml0KSwgTnVtQml0cyhmLk51bUJpdHMpLCBNaXhlZChmLk1peGVkKSwKKyAgRmlsdGVyZWRJbnN0cnVjdGlvbnMoZi5GaWx0ZXJlZEluc3RydWN0aW9ucyksCisgIFZhcmlhYmxlSW5zdHJ1Y3Rpb25zKGYuVmFyaWFibGVJbnN0cnVjdGlvbnMpLAorICBGaWx0ZXJDaG9vc2VyTWFwKGYuRmlsdGVyQ2hvb3Nlck1hcCksIE51bUZpbHRlcmVkKGYuTnVtRmlsdGVyZWQpLAorICBMYXN0T3BjRmlsdGVyZWQoZi5MYXN0T3BjRmlsdGVyZWQpLCBOdW1WYXJpYWJsZShmLk51bVZhcmlhYmxlKSB7Cit9CisKK0ZpbHRlcjo6RmlsdGVyKEZpbHRlckNob29zZXIgJm93bmVyLCB1bnNpZ25lZCBzdGFydEJpdCwgdW5zaWduZWQgbnVtQml0cywKKyAgICBib29sIG1peGVkKSA6IE93bmVyKCZvd25lciksIFN0YXJ0Qml0KHN0YXJ0Qml0KSwgTnVtQml0cyhudW1CaXRzKSwKKyAgICAgICAgICAgICAgICAgIE1peGVkKG1peGVkKSB7CisgIGFzc2VydChTdGFydEJpdCArIE51bUJpdHMgLSAxIDwgQklUX1dJRFRIKTsKKworICBOdW1GaWx0ZXJlZCA9IDA7CisgIExhc3RPcGNGaWx0ZXJlZCA9IDA7CisgIE51bVZhcmlhYmxlID0gMDsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3duZXItPk9wY29kZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGluc25fdCBJbnNuOworCisgICAgLy8gUG9wdWxhdGVzIHRoZSBpbnNuIGdpdmVuIHRoZSB1aWQuCisgICAgT3duZXItPmluc25XaXRoSUQoSW5zbiwgT3duZXItPk9wY29kZXNbaV0pOworCisgICAgdWludDY0X3QgRmllbGQ7CisgICAgLy8gU2NhbnMgdGhlIHNlZ21lbnQgZm9yIHBvc3NpYmx5IHdlbGwtc3BlY2lmaWVkIGVuY29kaW5nIGJpdHMuCisgICAgYm9vbCBvayA9IE93bmVyLT5maWVsZEZyb21JbnNuKEZpZWxkLCBJbnNuLCBTdGFydEJpdCwgTnVtQml0cyk7CisKKyAgICBpZiAob2spIHsKKyAgICAgIC8vIFRoZSBlbmNvZGluZyBiaXRzIGFyZSB3ZWxsLWtub3duLiAgTGV0cyBhZGQgdGhlIHVpZCBvZiB0aGUKKyAgICAgIC8vIGluc3RydWN0aW9uIGludG8gdGhlIGJ1Y2tldCBrZXllZCBvZmYgdGhlIGNvbnN0YW50IGZpZWxkIHZhbHVlLgorICAgICAgTGFzdE9wY0ZpbHRlcmVkID0gT3duZXItPk9wY29kZXNbaV07CisgICAgICBGaWx0ZXJlZEluc3RydWN0aW9uc1tGaWVsZF0ucHVzaF9iYWNrKExhc3RPcGNGaWx0ZXJlZCk7CisgICAgICArK051bUZpbHRlcmVkOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTb21lIG9mIHRoZSBlbmNvZGluZyBiaXQocykgYXJlIHVuc3BlY2ZpZWQuICBUaGlzIGNvbnRyaWJ1dGVzIHRvCisgICAgICAvLyBvbmUgYWRkaXRpb25hbCBtZW1iZXIgb2YgIlZhcmlhYmxlIiBpbnN0cnVjdGlvbnMuCisgICAgICBWYXJpYWJsZUluc3RydWN0aW9ucy5wdXNoX2JhY2soT3duZXItPk9wY29kZXNbaV0pOworICAgICAgKytOdW1WYXJpYWJsZTsKKyAgICB9CisgIH0KKworICBhc3NlcnQoKEZpbHRlcmVkSW5zdHJ1Y3Rpb25zLnNpemUoKSArIFZhcmlhYmxlSW5zdHJ1Y3Rpb25zLnNpemUoKSA+IDApCisgICAgICAgICAmJiAiRmlsdGVyIHJldHVybnMgbm8gaW5zdHJ1Y3Rpb24gY2F0ZWdvcmllcyIpOworfQorCitGaWx0ZXI6On5GaWx0ZXIoKSB7CisgIHN0ZDo6bWFwPHVuc2lnbmVkLCBGaWx0ZXJDaG9vc2VyKj46Oml0ZXJhdG9yIGZpbHRlckl0ZXJhdG9yOworICBmb3IgKGZpbHRlckl0ZXJhdG9yID0gRmlsdGVyQ2hvb3Nlck1hcC5iZWdpbigpOworICAgICAgIGZpbHRlckl0ZXJhdG9yICE9IEZpbHRlckNob29zZXJNYXAuZW5kKCk7CisgICAgICAgZmlsdGVySXRlcmF0b3IrKykgeworICAgIGRlbGV0ZSBmaWx0ZXJJdGVyYXRvci0+c2Vjb25kOworICB9Cit9CisKKy8vIERpdmlkZXMgdGhlIGRlY29kaW5nIHRhc2sgaW50byBzdWIgdGFza3MgYW5kIGRlbGVnYXRlcyB0aGVtIHRvIHRoZQorLy8gaW5mZXJpb3IgRmlsdGVyQ2hvb3NlcidzLgorLy8KKy8vIEEgc3BlY2lhbCBjYXNlIGFyaXNlcyB3aGVuIHRoZXJlJ3Mgb25seSBvbmUgZW50cnkgaW4gdGhlIGZpbHRlcmVkCisvLyBpbnN0cnVjdGlvbnMuICBJbiBvcmRlciB0byB1bmFtYmlndW91c2x5IGRlY29kZSB0aGUgc2luZ2xldG9uLCB3ZSBuZWVkIHRvCisvLyBtYXRjaCB0aGUgcmVtYWluaW5nIHVuZGVjb2RlZCBlbmNvZGluZyBiaXRzIGFnYWluc3QgdGhlIHNpbmdsZXRvbi4KK3ZvaWQgRmlsdGVyOjpyZWN1cnNlKCkgeworICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ID46OmNvbnN0X2l0ZXJhdG9yIG1hcEl0ZXJhdG9yOworCisgIGJpdF92YWx1ZV90IEJpdFZhbHVlQXJyYXlbQklUX1dJRFRIXTsKKyAgLy8gU3RhcnRzIGJ5IGluaGVyaXRpbmcgb3VyIHBhcmVudCBmaWx0ZXIgY2hvb3NlcidzIGZpbHRlciBiaXQgdmFsdWVzLgorICBtZW1jcHkoQml0VmFsdWVBcnJheSwgT3duZXItPkZpbHRlckJpdFZhbHVlcywgc2l6ZW9mKEJpdFZhbHVlQXJyYXkpKTsKKworICB1bnNpZ25lZCBiaXRJbmRleDsKKworICBpZiAoVmFyaWFibGVJbnN0cnVjdGlvbnMuc2l6ZSgpKSB7CisgICAgLy8gQ29uc2VydmF0aXZlbHkgbWFya3MgZWFjaCBzZWdtZW50IHBvc2l0aW9uIGFzIEJJVF9VTlNFVC4KKyAgICBmb3IgKGJpdEluZGV4ID0gMDsgYml0SW5kZXggPCBOdW1CaXRzOyBiaXRJbmRleCsrKQorICAgICAgQml0VmFsdWVBcnJheVtTdGFydEJpdCArIGJpdEluZGV4XSA9IEJJVF9VTlNFVDsKKworICAgIC8vIERlbGVnYXRlcyB0byBhbiBpbmZlcmlvciBmaWx0ZXIgY2hvb3NlciBmb3IgZnV0aGVyIHByb2Nlc3Npbmcgb24gdGhpcworICAgIC8vIGdyb3VwIG9mIGluc3RydWN0aW9ucyB3aG9zZSBzZWdtZW50IHZhbHVlcyBhcmUgdmFyaWFibGUuCisgICAgRmlsdGVyQ2hvb3Nlck1hcC5pbnNlcnQoc3RkOjpwYWlyPHVuc2lnbmVkLCBGaWx0ZXJDaG9vc2VyKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyQ2hvb3NlcihPd25lci0+QWxsSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVJbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWYWx1ZUFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKk93bmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisgIH0KKworICAvLyBObyBuZWVkIHRvIHJlY3Vyc2UgZm9yIGEgc2luZ2xldG9uIGZpbHRlcmVkIGluc3RydWN0aW9uLgorICAvLyBTZWUgYWxzbyBGaWx0ZXI6OmVtaXQoKS4KKyAgaWYgKGdldE51bUZpbHRlcmVkKCkgPT0gMSkgeworICAgIC8vT3duZXItPlNpbmdsZXRvbkV4aXN0cyhMYXN0T3BjRmlsdGVyZWQpOworICAgIGFzc2VydChGaWx0ZXJDaG9vc2VyTWFwLnNpemUoKSA9PSAxKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBzdWIgY2hvb3NlcnMuCisgIGZvciAobWFwSXRlcmF0b3IgPSBGaWx0ZXJlZEluc3RydWN0aW9ucy5iZWdpbigpOworICAgICAgIG1hcEl0ZXJhdG9yICE9IEZpbHRlcmVkSW5zdHJ1Y3Rpb25zLmVuZCgpOworICAgICAgIG1hcEl0ZXJhdG9yKyspIHsKKworICAgIC8vIE1hcmtzIGFsbCB0aGUgc2VnbWVudCBwb3NpdGlvbnMgd2l0aCBlaXRoZXIgQklUX1RSVUUgb3IgQklUX0ZBTFNFLgorICAgIGZvciAoYml0SW5kZXggPSAwOyBiaXRJbmRleCA8IE51bUJpdHM7IGJpdEluZGV4KyspIHsKKyAgICAgIGlmIChtYXBJdGVyYXRvci0+Zmlyc3QgJiAoMVVMTCA8PCBiaXRJbmRleCkpCisgICAgICAgIEJpdFZhbHVlQXJyYXlbU3RhcnRCaXQgKyBiaXRJbmRleF0gPSBCSVRfVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgQml0VmFsdWVBcnJheVtTdGFydEJpdCArIGJpdEluZGV4XSA9IEJJVF9GQUxTRTsKKyAgICB9CisKKyAgICAvLyBEZWxlZ2F0ZXMgdG8gYW4gaW5mZXJpb3IgZmlsdGVyIGNob29zZXIgZm9yIGZ1dGhlciBwcm9jZXNzaW5nIG9uIHRoaXMKKyAgICAvLyBjYXRlZ29yeSBvZiBpbnN0cnVjdGlvbnMuCisgICAgRmlsdGVyQ2hvb3Nlck1hcC5pbnNlcnQoc3RkOjpwYWlyPHVuc2lnbmVkLCBGaWx0ZXJDaG9vc2VyKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBJdGVyYXRvci0+Zmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyQ2hvb3NlcihPd25lci0+QWxsSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwSXRlcmF0b3ItPnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZhbHVlQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqT3duZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKKyAgfQorfQorCisvLyBFbWl0IGNvZGUgdG8gZGVjb2RlIGluc3RydWN0aW9ucyBnaXZlbiBhIHNlZ21lbnQgb3Igc2VnbWVudHMgb2YgYml0cy4KK3ZvaWQgRmlsdGVyOjplbWl0KHJhd19vc3RyZWFtICZvLCB1bnNpZ25lZCAmSW5kZW50YXRpb24pIHsKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICIvLyBDaGVjayBJbnN0eyI7CisKKyAgaWYgKE51bUJpdHMgPiAxKQorICAgIG8gPDwgKFN0YXJ0Qml0ICsgTnVtQml0cyAtIDEpIDw8ICctJzsKKworICBvIDw8IFN0YXJ0Qml0IDw8ICJ9IC4uLlxuIjsKKworICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgInN3aXRjaCAoZmllbGRGcm9tSW5zdHJ1Y3Rpb24oaW5zbiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgU3RhcnRCaXQgPDwgIiwgIiA8PCBOdW1CaXRzIDw8ICIpKSB7XG4iOworCisgIHN0ZDo6bWFwPHVuc2lnbmVkLCBGaWx0ZXJDaG9vc2VyKj46Oml0ZXJhdG9yIGZpbHRlckl0ZXJhdG9yOworCisgIGJvb2wgRGVmYXVsdENhc2UgPSBmYWxzZTsKKyAgZm9yIChmaWx0ZXJJdGVyYXRvciA9IEZpbHRlckNob29zZXJNYXAuYmVnaW4oKTsKKyAgICAgICBmaWx0ZXJJdGVyYXRvciAhPSBGaWx0ZXJDaG9vc2VyTWFwLmVuZCgpOworICAgICAgIGZpbHRlckl0ZXJhdG9yKyspIHsKKworICAgIC8vIEZpZWxkIHZhbHVlIC0xIGltcGxpZXMgYSBub24tZW1wdHkgc2V0IG9mIHZhcmlhYmxlIGluc3RydWN0aW9ucy4KKyAgICAvLyBTZWUgYWxzbyByZWN1cnNlKCkuCisgICAgaWYgKGZpbHRlckl0ZXJhdG9yLT5maXJzdCA9PSAodW5zaWduZWQpLTEpIHsKKyAgICAgIERlZmF1bHRDYXNlID0gdHJ1ZTsKKworICAgICAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJkZWZhdWx0OlxuIjsKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAiICBicmVhazsgLy8gZmFsbHRocm91Z2hcbiI7CisKKyAgICAgIC8vIENsb3NpbmcgY3VybHkgYnJhY2UgZm9yIHRoZSBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAgLy8gVGhpcyBpcyB1bmNvbnZlbnRpb25hbCBiZWNhdXNlIHdlIHdhbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZyB0byBiZQorICAgICAgLy8gcGVyZm9ybWVkIGZvciB0aGUgZmFsbHRocm91Z2ggY2FzZXMgYXMgd2VsbCwgaS5lLiwgd2hlbiB0aGUgImNhc2VzIgorICAgICAgLy8gZGlkIG5vdCBwcm92ZSBhIGRlY29kZWQgaW5zdHJ1Y3Rpb24uCisgICAgICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgIn1cbiI7CisKKyAgICB9IGVsc2UKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAiY2FzZSAiIDw8IGZpbHRlckl0ZXJhdG9yLT5maXJzdCA8PCAiOlxuIjsKKworICAgIC8vIFdlIGFycml2ZSBhdCBhIGNhdGVnb3J5IG9mIGluc3RydWN0aW9ucyB3aXRoIHRoZSBzYW1lIHNlZ21lbnQgdmFsdWUuCisgICAgLy8gTm93IGRlbGVnYXRlIHRvIHRoZSBzdWIgZmlsdGVyIGNob29zZXIgZm9yIGZ1cnRoZXIgZGVjb2RpbmdzLgorICAgIC8vIFRoZSBjYXNlIG1heSBmYWxsdGhyb3VnaCwgd2hpY2ggaGFwcGVucyBpZiB0aGUgcmVtYWluaW5nIHdlbGwta25vd24KKyAgICAvLyBlbmNvZGluZyBiaXRzIGRvIG5vdCBtYXRjaCBleGFjdGx5LgorICAgIGlmICghRGVmYXVsdENhc2UpIHsgKytJbmRlbnRhdGlvbjsgKytJbmRlbnRhdGlvbjsgfQorCisgICAgYm9vbCBmaW5pc2hlZCA9IGZpbHRlckl0ZXJhdG9yLT5zZWNvbmQtPmVtaXQobywgSW5kZW50YXRpb24pOworICAgIC8vIEZvciB0b3AgbGV2ZWwgZGVmYXVsdCBjYXNlLCB0aGVyZSdzIG5vIG5lZWQgZm9yIGEgYnJlYWsgc3RhdGVtZW50LgorICAgIGlmIChPd25lci0+aXNUb3BMZXZlbCgpICYmIERlZmF1bHRDYXNlKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFmaW5pc2hlZCkKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAiYnJlYWs7XG4iOworCisgICAgaWYgKCFEZWZhdWx0Q2FzZSkgeyAtLUluZGVudGF0aW9uOyAtLUluZGVudGF0aW9uOyB9CisgIH0KKworICAvLyBJZiB0aGVyZSBpcyBubyBkZWZhdWx0IGNhc2UsIHdlIHN0aWxsIG5lZWQgdG8gc3VwcGx5IGEgY2xvc2luZyBicmFjZS4KKyAgaWYgKCFEZWZhdWx0Q2FzZSkgeworICAgIC8vIENsb3NpbmcgY3VybHkgYnJhY2UgZm9yIHRoZSBzd2l0Y2ggc3RhdGVtZW50LgorICAgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAifVxuIjsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmFub3V0IHByb2R1Y2VkIGJ5IHRoZSBmaWx0ZXIuICBNb3JlIGZhbm91dCBpbXBsaWVzCisvLyB0aGUgZmlsdGVyIGRpc3Rpbmd1aXNoZXMgbW9yZSBjYXRlZ29yaWVzIG9mIGluc3RydWN0aW9ucy4KK3Vuc2lnbmVkIEZpbHRlcjo6dXNlZnVsbmVzcygpIGNvbnN0IHsKKyAgaWYgKFZhcmlhYmxlSW5zdHJ1Y3Rpb25zLnNpemUoKSkKKyAgICByZXR1cm4gRmlsdGVyZWRJbnN0cnVjdGlvbnMuc2l6ZSgpOworICBlbHNlCisgICAgcmV0dXJuIEZpbHRlcmVkSW5zdHJ1Y3Rpb25zLnNpemUoKSArIDE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vIEZpbHRlcmNob29zZXIgSW1wbGVtZW50YXRpb24gLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVmaW5lIHRoZSBzeW1ib2wgaGVyZS4KK1RBUkdFVF9OQU1FX3QgRmlsdGVyQ2hvb3Nlcjo6VGFyZ2V0TmFtZTsKKworLy8gVGhpcyBwcm92aWRlcyBhbiBvcHBvcnR1bml0eSBmb3IgdGFyZ2V0IHNwZWNpZmljIGNvZGUgZW1pc3Npb24uCit2b2lkIEZpbHRlckNob29zZXI6OmVtaXRUb3BIb29rKHJhd19vc3RyZWFtICZvKSB7CisgIGlmIChUYXJnZXROYW1lID09IFRBUkdFVF9BUk0pIHsKKyAgICAvLyBFbWl0IGNvZGUgdGhhdCByZWZlcmVuY2VzIHRoZSBBUk1Gb3JtYXQgZGF0YSB0eXBlLgorICAgIG8gPDwgInN0YXRpYyBjb25zdCBBUk1Gb3JtYXQgQVJNRm9ybWF0c1tdID0ge1xuIjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQWxsSW5zdHJ1Y3Rpb25zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IFJlY29yZCAmRGVmID0gKihBbGxJbnN0cnVjdGlvbnNbaV0tPlRoZURlZik7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSA9IERlZi5nZXROYW1lKCk7CisgICAgICBpZiAoRGVmLmlzU3ViQ2xhc3NPZigiSW5zdEFSTSIpIHx8IERlZi5pc1N1YkNsYXNzT2YoIkluc3RUaHVtYiIpKQorICAgICAgICBvLmluZGVudCgyKSA8PCAKKyAgICAgICAgICBzdHJpbmdGb3JBUk1Gb3JtYXQoKEFSTUZvcm1hdClnZXRCeXRlRmllbGQoRGVmLCAiRm9ybSIpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbyA8PCAiICBBUk1fRk9STUFUX05BIjsKKworICAgICAgbyA8PCAiLFx0Ly8gSW5zdCAjIiA8PCBpIDw8ICIgPSAiIDw8IE5hbWUgPDwgJ1xuJzsKKyAgICB9CisgICAgbyA8PCAiICBBUk1fRk9STUFUX05BXHQvLyBVbnJlYWNoYWJsZS5cbiI7CisgICAgbyA8PCAifTtcblxuIjsKKyAgfQorfQorCisvLyBFbWl0IHRoZSB0b3AgbGV2ZWwgdHlwZWRlZiBhbmQgZGVjb2RlSW5zdHJ1Y3Rpb24oKSBmdW5jdGlvbi4KK3ZvaWQgRmlsdGVyQ2hvb3Nlcjo6ZW1pdFRvcChyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgJkluZGVudGF0aW9uKSB7CisgIC8vIFJ1biB0aGUgdGFyZ2V0IHNwZWNpZmljIGVtaXQgaG9vay4KKyAgZW1pdFRvcEhvb2sobyk7CisKKyAgc3dpdGNoIChCSVRfV0lEVEgpIHsKKyAgY2FzZSA4OgorICAgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAidHlwZWRlZiB1aW50OF90IGZpZWxkX3Q7XG4iOworICAgIGJyZWFrOworICBjYXNlIDE2OgorICAgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAidHlwZWRlZiB1aW50MTZfdCBmaWVsZF90O1xuIjsKKyAgICBicmVhazsKKyAgY2FzZSAzMjoKKyAgICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgInR5cGVkZWYgdWludDMyX3QgZmllbGRfdDtcbiI7CisgICAgYnJlYWs7CisgIGNhc2UgNjQ6CisgICAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJ0eXBlZGVmIHVpbnQ2NF90IGZpZWxkX3Q7XG4iOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGFzc2VydCgwICYmICJVbmV4cGVjdGVkIGluc3RydWN0aW9uIHNpemUhIik7CisgIH0KKworICBvIDw8ICdcbic7CisKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJzdGF0aWMgZmllbGRfdCAiIDw8CisgICAgImZpZWxkRnJvbUluc3RydWN0aW9uKGZpZWxkX3QgaW5zbiwgdW5zaWduZWQgc3RhcnRCaXQsIHVuc2lnbmVkIG51bUJpdHMpXG4iOworCisgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAie1xuIjsKKworICArK0luZGVudGF0aW9uOyArK0luZGVudGF0aW9uOworICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgImFzc2VydChzdGFydEJpdCArIG51bUJpdHMgPD0gIiA8PCBCSVRfV0lEVEgKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgJiYgXCJJbnN0cnVjdGlvbiBmaWVsZCBvdXQgb2YgYm91bmRzIVwiKTtcbiI7CisgIG8gPDwgJ1xuJzsKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJmaWVsZF90IGZpZWxkTWFzaztcbiI7CisgIG8gPDwgJ1xuJzsKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJpZiAobnVtQml0cyA9PSAiIDw8IEJJVF9XSURUSCA8PCAiKVxuIjsKKworICArK0luZGVudGF0aW9uOyArK0luZGVudGF0aW9uOworICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgImZpZWxkTWFzayA9IChmaWVsZF90KS0xO1xuIjsKKyAgLS1JbmRlbnRhdGlvbjsgLS1JbmRlbnRhdGlvbjsKKworICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgImVsc2VcbiI7CisKKyAgKytJbmRlbnRhdGlvbjsgKytJbmRlbnRhdGlvbjsKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJmaWVsZE1hc2sgPSAoKDEgPDwgbnVtQml0cykgLSAxKSA8PCBzdGFydEJpdDtcbiI7CisgIC0tSW5kZW50YXRpb247IC0tSW5kZW50YXRpb247CisKKyAgbyA8PCAnXG4nOworICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgInJldHVybiAoaW5zbiAmIGZpZWxkTWFzaykgPj4gc3RhcnRCaXQ7XG4iOworICAtLUluZGVudGF0aW9uOyAtLUluZGVudGF0aW9uOworCisgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAifVxuIjsKKworICBvIDw8ICdcbic7CisKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJzdGF0aWMgdWludDE2X3QgZGVjb2RlSW5zdHJ1Y3Rpb24oZmllbGRfdCBpbnNuKSB7XG4iOworCisgICsrSW5kZW50YXRpb247ICsrSW5kZW50YXRpb247CisgIC8vIEVtaXRzIGNvZGUgdG8gZGVjb2RlIHRoZSBpbnN0cnVjdGlvbnMuCisgIGVtaXQobywgSW5kZW50YXRpb24pOworCisgIG8gPDwgJ1xuJzsKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJyZXR1cm4gMDtcbiI7CisgIC0tSW5kZW50YXRpb247IC0tSW5kZW50YXRpb247CisKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJ9XG4iOworCisgIG8gPDwgJ1xuJzsKK30KKworLy8gVGhpcyBwcm92aWRlcyBhbiBvcHBvcnR1bml0eSBmb3IgdGFyZ2V0IHNwZWNpZmljIGNvZGUgZW1pc3Npb24gYWZ0ZXIKKy8vIGVtaXRUb3AoKS4KK3ZvaWQgRmlsdGVyQ2hvb3Nlcjo6ZW1pdEJvdChyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgJkluZGVudGF0aW9uKSB7CisgIGlmIChUYXJnZXROYW1lICE9IFRBUkdFVF9USFVNQikgcmV0dXJuOworCisgIC8vIEVtaXQgY29kZSB0aGF0IGRlY29kZXMgdGhlIFRodW1iIElTQS4KKyAgby5pbmRlbnQoSW5kZW50YXRpb24pCisgICAgPDwgInN0YXRpYyB1aW50MTZfdCBkZWNvZGVUaHVtYkluc3RydWN0aW9uKGZpZWxkX3QgaW5zbikge1xuIjsKKworICArK0luZGVudGF0aW9uOyArK0luZGVudGF0aW9uOworCisgIC8vIEVtaXRzIGNvZGUgdG8gZGVjb2RlIHRoZSBpbnN0cnVjdGlvbnMuCisgIGVtaXQobywgSW5kZW50YXRpb24pOworCisgIG8gPDwgJ1xuJzsKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICJyZXR1cm4gMDtcbiI7CisKKyAgLS1JbmRlbnRhdGlvbjsgLS1JbmRlbnRhdGlvbjsKKworICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgIn1cbiI7Cit9CisKKy8vIFBvcHVsYXRlcyB0aGUgZmllbGQgb2YgdGhlIGluc24gZ2l2ZW4gdGhlIHN0YXJ0IHBvc2l0aW9uIGFuZCB0aGUgbnVtYmVyIG9mCisvLyBjb25zZWN1dGl2ZSBiaXRzIHRvIHNjYW4gZm9yLgorLy8KKy8vIFJldHVybnMgZmFsc2UgaWYgYW5kIG9uIHRoZSBmaXJzdCB1bmluaXRpYWxpemVkIGJpdCB2YWx1ZSBlbmNvdW50ZXJlZC4KKy8vIFJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlLgorYm9vbCBGaWx0ZXJDaG9vc2VyOjpmaWVsZEZyb21JbnNuKHVpbnQ2NF90ICZGaWVsZCwgaW5zbl90ICZJbnNuLAorICAgIHVuc2lnbmVkIFN0YXJ0Qml0LCB1bnNpZ25lZCBOdW1CaXRzKSBjb25zdCB7CisgIEZpZWxkID0gMDsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQml0czsgKytpKSB7CisgICAgaWYgKEluc25bU3RhcnRCaXQgKyBpXSA9PSBCSVRfVU5TRVQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoSW5zbltTdGFydEJpdCArIGldID09IEJJVF9UUlVFKQorICAgICAgRmllbGQgPSBGaWVsZCB8ICgxVUxMIDw8IGkpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBkdW1wRmlsdGVyQXJyYXkgLSBkdW1wRmlsdGVyQXJyYXkgcHJpbnRzIG91dCBkZWJ1Z2dpbmcgaW5mbyBmb3IgdGhlIGdpdmVuCisvLy8gZmlsdGVyIGFycmF5IGFzIGEgc2VyaWVzIG9mIGNoYXJzLgordm9pZCBGaWx0ZXJDaG9vc2VyOjpkdW1wRmlsdGVyQXJyYXkocmF3X29zdHJlYW0gJm8sCisgICAgYml0X3ZhbHVlX3QgKCZmaWx0ZXIpW0JJVF9XSURUSF0pIHsKKyAgdW5zaWduZWQgYml0SW5kZXg7CisKKyAgZm9yIChiaXRJbmRleCA9IEJJVF9XSURUSDsgYml0SW5kZXggPiAwOyBiaXRJbmRleC0tKSB7CisgICAgc3dpdGNoIChmaWx0ZXJbYml0SW5kZXggLSAxXSkgeworICAgIGNhc2UgQklUX1VORklMVEVSRUQ6CisgICAgICBvIDw8ICIuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklUX1VOU0VUOgorICAgICAgbyA8PCAiXyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJVF9UUlVFOgorICAgICAgbyA8PCAiMSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJVF9GQUxTRToKKyAgICAgIG8gPDwgIjAiOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8vLyBkdW1wU3RhY2sgLSBkdW1wU3RhY2sgdHJhdmVyc2VzIHRoZSBmaWx0ZXIgY2hvb3NlciBjaGFpbiBhbmQgY2FsbHMKKy8vLyBkdW1wRmlsdGVyQXJyYXkgb24gZWFjaCBmaWx0ZXIgY2hvb3NlciB1cCB0byB0aGUgdG9wIGxldmVsIG9uZS4KK3ZvaWQgRmlsdGVyQ2hvb3Nlcjo6ZHVtcFN0YWNrKHJhd19vc3RyZWFtICZvLCBjb25zdCBjaGFyICpwcmVmaXgpIHsKKyAgRmlsdGVyQ2hvb3NlciAqY3VycmVudCA9IHRoaXM7CisKKyAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICBvIDw8IHByZWZpeDsKKyAgICBkdW1wRmlsdGVyQXJyYXkobywgY3VycmVudC0+RmlsdGVyQml0VmFsdWVzKTsKKyAgICBvIDw8ICdcbic7CisgICAgY3VycmVudCA9IGN1cnJlbnQtPlBhcmVudDsKKyAgfQorfQorCisvLyBDYWxsZWQgZnJvbSBGaWx0ZXI6OnJlY3Vyc2UoKSB3aGVuIHNpbmdsZXRvbiBleGlzdHMuICBGb3IgZGVidWcgcHVycG9zZS4KK3ZvaWQgRmlsdGVyQ2hvb3Nlcjo6U2luZ2xldG9uRXhpc3RzKHVuc2lnbmVkIE9wYykgeworICBpbnNuX3QgSW5zbjA7CisgIGluc25XaXRoSUQoSW5zbjAsIE9wYyk7CisKKyAgZXJycygpIDw8ICJTaW5nbGV0b24gZXhpc3RzOiAiIDw8IG5hbWVXaXRoSUQoT3BjKQorICAgICAgICAgPDwgIiB3aXRoIGl0cyBkZWNvZGluZyBkb21pbmF0aW5nICI7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBPcGNvZGVzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKE9wY29kZXNbaV0gPT0gT3BjKSBjb250aW51ZTsKKyAgICBlcnJzKCkgPDwgbmFtZVdpdGhJRChPcGNvZGVzW2ldKSA8PCAnICc7CisgIH0KKyAgZXJycygpIDw8ICdcbic7CisKKyAgZHVtcFN0YWNrKGVycnMoKSwgIlx0XHQiKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE9wY29kZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSA9IG5hbWVXaXRoSUQoT3Bjb2Rlc1tpXSk7CisKKyAgICBlcnJzKCkgPDwgJ1x0JyA8PCBOYW1lIDw8ICIgIjsKKyAgICBkdW1wQml0cyhlcnJzKCksCisgICAgICAgICAgICAgZ2V0Qml0c0ZpZWxkKCpBbGxJbnN0cnVjdGlvbnNbT3Bjb2Rlc1tpXV0tPlRoZURlZiwgIkluc3QiKSk7CisgICAgZXJycygpIDw8ICdcbic7CisgIH0KK30KKworLy8gQ2FsY3VsYXRlcyB0aGUgaXNsYW5kKHMpIG5lZWRlZCB0byBkZWNvZGUgdGhlIGluc3RydWN0aW9uLgorLy8gVGhpcyByZXR1cm5zIGEgbGlzdCBvZiB1bmRlY29kZWQgYml0cyBvZiBhbiBpbnN0cnVjdGlvbnMsIGZvciBleGFtcGxlLAorLy8gSW5zdHsyMH0gPSAxICYmIEluc3R7My0wfSA9PSAwYjExMTEgcmVwcmVzZW50cyB0d28gaXNsYW5kcyBvZiB5ZXQtdG8tYmUKKy8vIGRlY29kZWQgYml0cyBpbiBvcmRlciB0byB2ZXJpZnkgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gbWF0Y2hlcyB0aGUgT3Bjb2RlLgordW5zaWduZWQgRmlsdGVyQ2hvb3Nlcjo6Z2V0SXNsYW5kcyhzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJlN0YXJ0Qml0cywKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJkVuZEJpdHMsIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmRmllbGRWYWxzLAorICAgIGluc25fdCAmSW5zbikgeworICB1bnNpZ25lZCBOdW0sIEJpdE5vOworICBOdW0gPSBCaXRObyA9IDA7CisKKyAgdWludDY0X3QgRmllbGRWYWwgPSAwOworCisgIC8vIDA6IEluaXQKKyAgLy8gMTogV2F0ZXIgKHRoZSBiaXQgdmFsdWUgZG9lcyBub3QgYWZmZWN0IGRlY29kaW5nKQorICAvLyAyOiBJc2xhbmQgKHdlbGwta25vd24gYml0IHZhbHVlIG5lZWRlZCBmb3IgZGVjb2RpbmcpCisgIGludCBTdGF0ZSA9IDA7CisgIGludCBWYWwgPSAtMTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUX1dJRFRIOyArK2kpIHsKKyAgICBWYWwgPSBWYWx1ZShJbnNuW2ldKTsKKyAgICBib29sIEZpbHRlcmVkID0gUG9zaXRpb25GaWx0ZXJlZChpKTsKKyAgICBzd2l0Y2ggKFN0YXRlKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwICYmICJVbnJlYWNoYWJsZSBjb2RlISIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgIGlmIChGaWx0ZXJlZCB8fCBWYWwgPT0gLTEpCisgICAgICAgIFN0YXRlID0gMTsgLy8gU3RpbGwgaW4gV2F0ZXIKKyAgICAgIGVsc2UgeworICAgICAgICBTdGF0ZSA9IDI7IC8vIEludG8gdGhlIElzbGFuZAorICAgICAgICBCaXRObyA9IDA7CisgICAgICAgIFN0YXJ0Qml0cy5wdXNoX2JhY2soaSk7CisgICAgICAgIEZpZWxkVmFsID0gVmFsOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKEZpbHRlcmVkIHx8IFZhbCA9PSAtMSkgeworICAgICAgICBTdGF0ZSA9IDE7IC8vIEludG8gdGhlIFdhdGVyCisgICAgICAgIEVuZEJpdHMucHVzaF9iYWNrKGkgLSAxKTsKKyAgICAgICAgRmllbGRWYWxzLnB1c2hfYmFjayhGaWVsZFZhbCk7CisgICAgICAgICsrTnVtOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU3RhdGUgPSAyOyAvLyBTdGlsbCBpbiBJc2xhbmQKKyAgICAgICAgKytCaXRObzsKKyAgICAgICAgRmllbGRWYWwgPSBGaWVsZFZhbCB8IFZhbCA8PCBCaXRObzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvLyBJZiB3ZSBhcmUgc3RpbGwgaW4gSXNsYW5kIGFmdGVyIHRoZSBsb29wLCBkbyBzb21lIGhvdXNla2VlcGluZy4KKyAgaWYgKFN0YXRlID09IDIpIHsKKyAgICBFbmRCaXRzLnB1c2hfYmFjayhCSVRfV0lEVEggLSAxKTsKKyAgICBGaWVsZFZhbHMucHVzaF9iYWNrKEZpZWxkVmFsKTsKKyAgICArK051bTsKKyAgfQorCisgIGFzc2VydChTdGFydEJpdHMuc2l6ZSgpID09IE51bSAmJiBFbmRCaXRzLnNpemUoKSA9PSBOdW0gJiYKKyAgICAgICAgIEZpZWxkVmFscy5zaXplKCkgPT0gTnVtKTsKKyAgcmV0dXJuIE51bTsKK30KKworLy8gRW1pdHMgY29kZSB0byBkZWNvZGUgdGhlIHNpbmdsZXRvbi4gIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgbWF0Y2hlZCBhbGwgdGhlCisvLyB3ZWxsLWtub3duIGJpdHMuCitib29sIEZpbHRlckNob29zZXI6OmVtaXRTaW5nbGV0b25EZWNvZGVyKHJhd19vc3RyZWFtICZvLCB1bnNpZ25lZCAmSW5kZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wYykgeworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gU3RhcnRCaXRzOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gRW5kQml0czsKKyAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IEZpZWxkVmFsczsKKyAgaW5zbl90IEluc247CisgIGluc25XaXRoSUQoSW5zbiwgT3BjKTsKKworICAvLyBUaGlzIHByb3ZpZGVzIGEgZ29vZCBvcHBvcnR1bml0eSB0byBjaGVjayBmb3IgcG9zc2libGUgTGQvU3QgQ29wcm9jZXNzb3IKKyAgLy8gT3Bjb2RlIGFuZCBlc2NhcGVzIGlmIHRoZSBjb3Byb2MgIyBpcyBlaXRoZXIgMTAgb3IgMTEuICBJdCBpcyBhIE5FT04vVkZQCisgIC8vIGluc3RydWN0aW9uIGlzIGRpc2d1aXNlLgorICBpZiAoVGFyZ2V0TmFtZSA9PSBUQVJHRVRfQVJNICYmIExkU3RDb3BFbmNvZGluZzEoT3BjKSkgeworICAgIG8uaW5kZW50KEluZGVudGF0aW9uKTsKKyAgICAvLyBBOC42LjUxICYgQTguNi4xODgKKyAgICAvLyBJZiBjb3Byb2MgPSAwYjEwMT8sIGkuZSwgc2xpY2UoaW5zbiwgMTEsIDgpID0gMTAgb3IgMTEsIGVzY2FwZS4KKyAgICBvIDw8ICJpZiAoZmllbGRGcm9tSW5zdHJ1Y3Rpb24oaW5zbiwgOSwgMykgPT0gNSkgYnJlYWs7IC8vIGZhbGx0aHJvdWdoXG4iOworICB9CisKKyAgLy8gTG9vayBmb3IgaXNsYW5kcyBvZiB1bmRlY29kZWQgYml0cyBvZiB0aGUgc2luZ2xldG9uLgorICBnZXRJc2xhbmRzKFN0YXJ0Qml0cywgRW5kQml0cywgRmllbGRWYWxzLCBJbnNuKTsKKworICB1bnNpZ25lZCBTaXplID0gU3RhcnRCaXRzLnNpemUoKTsKKyAgdW5zaWduZWQgSSwgTnVtQml0czsKKworICAvLyBJZiB3ZSBoYXZlIG1hdGNoZWQgYWxsIHRoZSB3ZWxsLWtub3duIGJpdHMsIGp1c3QgaXNzdWUgYSByZXR1cm4uCisgIGlmIChTaXplID09IDApIHsKKyAgICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgInJldHVybiAiIDw8IE9wYyA8PCAiOyAvLyAiIDw8IG5hbWVXaXRoSUQoT3BjKQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAnXG4nOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCB0aGVyZSBhcmUgbW9yZSBkZWNvZGluZ3MgdG8gYmUgZG9uZSEKKworICAvLyBFbWl0IGNvZGUgdG8gbWF0Y2ggdGhlIGlzbGFuZChzKSBmb3IgdGhlIHNpbmdsZXRvbi4KKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICIvLyBDaGVjayAiOworCisgIGZvciAoSSA9IFNpemU7IEkgIT0gMDsgLS1JKSB7CisgICAgbyA8PCAiSW5zdHsiIDw8IEVuZEJpdHNbSS0xXSA8PCAnLScgPDwgU3RhcnRCaXRzW0ktMV0gPDwgIn0gIjsKKyAgICBpZiAoSSA+IDEpCisgICAgICBvIDw8ICImJiAiOworICAgIGVsc2UKKyAgICAgIG8gPDwgImZvciBzaW5nbGV0b24gZGVjb2RpbmcuLi5cbiI7CisgIH0KKworICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgImlmICgiOworCisgIGZvciAoSSA9IFNpemU7IEkgIT0gMDsgLS1JKSB7CisgICAgTnVtQml0cyA9IEVuZEJpdHNbSS0xXSAtIFN0YXJ0Qml0c1tJLTFdICsgMTsKKyAgICBvIDw8ICJmaWVsZEZyb21JbnN0cnVjdGlvbihpbnNuLCAiIDw8IFN0YXJ0Qml0c1tJLTFdIDw8ICIsICIgPDwgTnVtQml0cworICAgICAgPDwgIikgPT0gIiA8PCBGaWVsZFZhbHNbSS0xXTsKKyAgICBpZiAoSSA+IDEpCisgICAgICBvIDw8ICIgJiYgIjsKKyAgICBlbHNlCisgICAgICBvIDw8ICIpXG4iOworICB9CisKKyAgby5pbmRlbnQoSW5kZW50YXRpb24pIDw8ICIgIHJldHVybiAiIDw8IE9wYyA8PCAiOyAvLyAiIDw8IG5hbWVXaXRoSUQoT3BjKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgJ1xuJzsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEVtaXRzIGNvZGUgdG8gZGVjb2RlIHRoZSBzaW5nbGV0b24sIGFuZCB0aGVuIHRvIGRlY29kZSB0aGUgcmVzdC4KK3ZvaWQgRmlsdGVyQ2hvb3Nlcjo6ZW1pdFNpbmdsZXRvbkRlY29kZXIocmF3X29zdHJlYW0gJm8sIHVuc2lnbmVkICZJbmRlbnRhdGlvbiwKKyAgICBGaWx0ZXIgJkJlc3QpIHsKKworICB1bnNpZ25lZCBPcGMgPSBCZXN0LmdldFNpbmdsZXRvbk9wYygpOworCisgIGVtaXRTaW5nbGV0b25EZWNvZGVyKG8sIEluZGVudGF0aW9uLCBPcGMpOworCisgIC8vIEVtaXQgY29kZSBmb3IgdGhlIHJlc3QuCisgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAiZWxzZVxuIjsKKworICBJbmRlbnRhdGlvbiArPSAyOworICBCZXN0LmdldFZhcmlhYmxlRkMoKS5lbWl0KG8sIEluZGVudGF0aW9uKTsKKyAgSW5kZW50YXRpb24gLT0gMjsKK30KKworLy8gQXNzaWduIGEgc2luZ2xlIGZpbHRlciBhbmQgcnVuIHdpdGggaXQuICBUb3AgbGV2ZWwgQVBJIGNsaWVudCBjYW4gaW5pdGlhbGl6ZQorLy8gd2l0aCBhIHNpbmdsZSBmaWx0ZXIgdG8gc3RhcnQgdGhlIGZpbHRlcmluZyBwcm9jZXNzLgordm9pZCBGaWx0ZXJDaG9vc2VyOjpydW5TaW5nbGVGaWx0ZXIoRmlsdGVyQ2hvb3NlciAmb3duZXIsIHVuc2lnbmVkIHN0YXJ0Qml0LAorICAgIHVuc2lnbmVkIG51bUJpdCwgYm9vbCBtaXhlZCkgeworICBGaWx0ZXJzLmNsZWFyKCk7CisgIEZpbHRlciBGKCp0aGlzLCBzdGFydEJpdCwgbnVtQml0LCB0cnVlKTsKKyAgRmlsdGVycy5wdXNoX2JhY2soRik7CisgIEJlc3RJbmRleCA9IDA7IC8vIFNvbGUgRmlsdGVyIGluc3RhbmNlIHRvIGNob29zZSBmcm9tLgorICBiZXN0RmlsdGVyKCkucmVjdXJzZSgpOworfQorCisvLyByZXBvcnRSZWdpb24gaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpbHRlclByb2Nlc3NvciB0byBtYXJrIGEgcmVnaW9uIGFzCisvLyBlbGlnaWJsZSBmb3IgdXNlIGFzIGEgZmlsdGVyIHJlZ2lvbi4KK3ZvaWQgRmlsdGVyQ2hvb3Nlcjo6cmVwb3J0UmVnaW9uKGJpdEF0dHJfdCBSQSwgdW5zaWduZWQgU3RhcnRCaXQsCisgICAgdW5zaWduZWQgQml0SW5kZXgsIGJvb2wgQWxsb3dNaXhlZCkgeworICBpZiAoUkEgPT0gQVRUUl9NSVhFRCAmJiBBbGxvd01peGVkKQorICAgIEZpbHRlcnMucHVzaF9iYWNrKEZpbHRlcigqdGhpcywgU3RhcnRCaXQsIEJpdEluZGV4IC0gU3RhcnRCaXQsIHRydWUpKTsgICAKKyAgZWxzZSBpZiAoUkEgPT0gQVRUUl9BTExfU0VUICYmICFBbGxvd01peGVkKQorICAgIEZpbHRlcnMucHVzaF9iYWNrKEZpbHRlcigqdGhpcywgU3RhcnRCaXQsIEJpdEluZGV4IC0gU3RhcnRCaXQsIGZhbHNlKSk7Cit9CisKKy8vIEZpbHRlclByb2Nlc3NvciBzY2FucyB0aGUgd2VsbC1rbm93biBlbmNvZGluZyBiaXRzIG9mIHRoZSBpbnN0cnVjdGlvbnMgYW5kCisvLyBidWlsZHMgdXAgYSBsaXN0IG9mIGNhbmRpZGF0ZSBmaWx0ZXJzLiAgSXQgY2hvb3NlcyB0aGUgYmVzdCBmaWx0ZXIgYW5kCisvLyByZWN1cnNpdmVseSBkZXNjZW5kcyBkb3duIHRoZSBkZWNvZGluZyB0cmVlLgorYm9vbCBGaWx0ZXJDaG9vc2VyOjpmaWx0ZXJQcm9jZXNzb3IoYm9vbCBBbGxvd01peGVkLCBib29sIEdyZWVkeSkgeworICBGaWx0ZXJzLmNsZWFyKCk7CisgIEJlc3RJbmRleCA9IC0xOworICB1bnNpZ25lZCBudW1JbnN0cnVjdGlvbnMgPSBPcGNvZGVzLnNpemUoKTsKKworICBhc3NlcnQobnVtSW5zdHJ1Y3Rpb25zICYmICJGaWx0ZXIgY3JlYXRlZCB3aXRoIG5vIGluc3RydWN0aW9ucyIpOworCisgIC8vIE5vIGZ1cnRoZXIgZmlsdGVyaW5nIGlzIG5lY2Vzc2FyeS4KKyAgaWYgKG51bUluc3RydWN0aW9ucyA9PSAxKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIEhldXJpc3RpY3MuICBTZWUgYWxzbyBkb0ZpbHRlcigpJ3MgIkhldXJpc3RpY3MiIGNvbW1lbnQgd2hlbiBudW0gb2YKKyAgLy8gaW5zdHJ1Y3Rpb25zIGlzIDMuCisgIGlmIChBbGxvd01peGVkICYmICFHcmVlZHkpIHsKKyAgICBhc3NlcnQobnVtSW5zdHJ1Y3Rpb25zID09IDMpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE9wY29kZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBTdGFydEJpdHM7CisgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gRW5kQml0czsKKyAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBGaWVsZFZhbHM7CisgICAgICBpbnNuX3QgSW5zbjsKKworICAgICAgaW5zbldpdGhJRChJbnNuLCBPcGNvZGVzW2ldKTsKKworICAgICAgLy8gTG9vayBmb3IgaXNsYW5kcyBvZiB1bmRlY29kZWQgYml0cyBvZiBhbnkgaW5zdHJ1Y3Rpb24uCisgICAgICBpZiAoZ2V0SXNsYW5kcyhTdGFydEJpdHMsIEVuZEJpdHMsIEZpZWxkVmFscywgSW5zbikgPiAwKSB7CisgICAgICAgIC8vIEZvdW5kIGFuIGluc3RydWN0aW9uIHdpdGggaXNsYW5kKHMpLiAgTm93IGp1c3QgYXNzaWduIGEgZmlsdGVyLgorICAgICAgICBydW5TaW5nbGVGaWx0ZXIoKnRoaXMsIFN0YXJ0Qml0c1swXSwgRW5kQml0c1swXSAtIFN0YXJ0Qml0c1swXSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdW5zaWduZWQgQml0SW5kZXgsIEluc25JbmRleDsKKworICAvLyBXZSBtYWludGFpbiBCSVRfV0lEVEggY29waWVzIG9mIHRoZSBiaXRBdHRycyBhdXRvbWF0b24uCisgIC8vIFRoZSBhdXRvbWF0b24gY29uc3VtZXMgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGZyb20gZWFjaAorICAvLyBpbnN0cnVjdGlvbi4KKyAgLy8KKyAgLy8gICBJbnB1dCBzeW1ib2xzOiAwLCAxLCBhbmQgXyAodW5zZXQpLgorICAvLyAgIFN0YXRlczogICAgICAgIE5PTkUsIEZJTFRFUkVELCBBTExfU0VULCBBTExfVU5TRVQsIGFuZCBNSVhFRC4KKyAgLy8gICBJbml0aWFsIHN0YXRlOiBOT05FLgorICAvLworICAvLyAoTk9ORSkgLS0tLS0tLSBbMDFdIC0+IChBTExfU0VUKQorICAvLyAoTk9ORSkgLS0tLS0tLSBfIC0tLS0+IChBTExfVU5TRVQpCisgIC8vIChBTExfU0VUKSAtLS0tIFswMV0gLT4gKEFMTF9TRVQpCisgIC8vIChBTExfU0VUKSAtLS0tIF8gLS0tLT4gKE1JWEVEKQorICAvLyAoQUxMX1VOU0VUKSAtLSBbMDFdIC0+IChNSVhFRCkKKyAgLy8gKEFMTF9VTlNFVCkgLS0gXyAtLS0tPiAoQUxMX1VOU0VUKQorICAvLyAoTUlYRUQpIC0tLS0tLSAuIC0tLS0+IChNSVhFRCkKKyAgLy8gKEZJTFRFUkVEKS0tLS0gLiAtLS0tPiAoRklMVEVSRUQpCisKKyAgYml0QXR0cl90IGJpdEF0dHJzW0JJVF9XSURUSF07CisKKyAgLy8gRklMVEVSRUQgYml0IHBvc2l0aW9ucyBwcm92aWRlIG5vIGVudHJvcHkgYW5kIGFyZSBub3Qgd29ydGh5IG9mIHB1cnN1aW5nLgorICAvLyBGaWx0ZXI6OnJlY3Vyc2UoKSBzZXQgZWl0aGVyIEJJVF9UUlVFIG9yIEJJVF9GQUxTRSBmb3IgZWFjaCBwb3NpdGlvbi4KKyAgZm9yIChCaXRJbmRleCA9IDA7IEJpdEluZGV4IDwgQklUX1dJRFRIOyArK0JpdEluZGV4KQorICAgIGlmIChGaWx0ZXJCaXRWYWx1ZXNbQml0SW5kZXhdID09IEJJVF9UUlVFIHx8CisgICAgICAgIEZpbHRlckJpdFZhbHVlc1tCaXRJbmRleF0gPT0gQklUX0ZBTFNFKQorICAgICAgYml0QXR0cnNbQml0SW5kZXhdID0gQVRUUl9GSUxURVJFRDsKKyAgICBlbHNlCisgICAgICBiaXRBdHRyc1tCaXRJbmRleF0gPSBBVFRSX05PTkU7CisKKyAgZm9yIChJbnNuSW5kZXggPSAwOyBJbnNuSW5kZXggPCBudW1JbnN0cnVjdGlvbnM7ICsrSW5zbkluZGV4KSB7CisgICAgaW5zbl90IGluc247CisKKyAgICBpbnNuV2l0aElEKGluc24sIE9wY29kZXNbSW5zbkluZGV4XSk7CisKKyAgICBmb3IgKEJpdEluZGV4ID0gMDsgQml0SW5kZXggPCBCSVRfV0lEVEg7ICsrQml0SW5kZXgpIHsKKyAgICAgIHN3aXRjaCAoYml0QXR0cnNbQml0SW5kZXhdKSB7CisgICAgICBjYXNlIEFUVFJfTk9ORToKKyAgICAgICAgaWYgKGluc25bQml0SW5kZXhdID09IEJJVF9VTlNFVCkKKyAgICAgICAgICBiaXRBdHRyc1tCaXRJbmRleF0gPSBBVFRSX0FMTF9VTlNFVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGJpdEF0dHJzW0JpdEluZGV4XSA9IEFUVFJfQUxMX1NFVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFUVFJfQUxMX1NFVDoKKyAgICAgICAgaWYgKGluc25bQml0SW5kZXhdID09IEJJVF9VTlNFVCkKKyAgICAgICAgICBiaXRBdHRyc1tCaXRJbmRleF0gPSBBVFRSX01JWEVEOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVRUUl9BTExfVU5TRVQ6CisgICAgICAgIGlmIChpbnNuW0JpdEluZGV4XSAhPSBCSVRfVU5TRVQpCisgICAgICAgICAgYml0QXR0cnNbQml0SW5kZXhdID0gQVRUUl9NSVhFRDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFUVFJfTUlYRUQ6CisgICAgICBjYXNlIEFUVFJfRklMVEVSRUQ6CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFRoZSByZWdpb25BdHRyIGF1dG9tYXRvbiBjb25zdW1lcyB0aGUgYml0QXR0cnMgYXV0b21hdG9ucycgc3RhdGUsCisgIC8vIGxvd2VzdC10by1oaWdoZXN0LgorICAvLworICAvLyAgIElucHV0IHN5bWJvbHM6IEYoaWx0ZXJlZCksIChhbGxfKVMoZXQpLCAoYWxsXylVKG5zZXQpLCBNKGl4ZWQpCisgIC8vICAgU3RhdGVzOiAgICAgICAgTk9ORSwgQUxMX1NFVCwgTUlYRUQKKyAgLy8gICBJbml0aWFsIHN0YXRlOiBOT05FCisgIC8vCisgIC8vIChOT05FKSAtLS0tLSBGIC0tPiAoTk9ORSkKKyAgLy8gKE5PTkUpIC0tLS0tIFMgLS0+IChBTExfU0VUKSAgICAgOyBhbmQgc2V0IHJlZ2lvbiBzdGFydAorICAvLyAoTk9ORSkgLS0tLS0gVSAtLT4gKE5PTkUpCisgIC8vIChOT05FKSAtLS0tLSBNIC0tPiAoTUlYRUQpICAgICAgIDsgYW5kIHNldCByZWdpb24gc3RhcnQKKyAgLy8gKEFMTF9TRVQpIC0tIEYgLS0+IChOT05FKSAgICAgICAgOyBhbmQgcmVwb3J0IGFuIEFMTF9TRVQgcmVnaW9uCisgIC8vIChBTExfU0VUKSAtLSBTIC0tPiAoQUxMX1NFVCkKKyAgLy8gKEFMTF9TRVQpIC0tIFUgLS0+IChOT05FKSAgICAgICAgOyBhbmQgcmVwb3J0IGFuIEFMTF9TRVQgcmVnaW9uCisgIC8vIChBTExfU0VUKSAtLSBNIC0tPiAoTUlYRUQpICAgICAgIDsgYW5kIHJlcG9ydCBhbiBBTExfU0VUIHJlZ2lvbgorICAvLyAoTUlYRUQpIC0tLS0gRiAtLT4gKE5PTkUpICAgICAgICA7IGFuZCByZXBvcnQgYSBNSVhFRCByZWdpb24KKyAgLy8gKE1JWEVEKSAtLS0tIFMgLS0+IChBTExfU0VUKSAgICAgOyBhbmQgcmVwb3J0IGEgTUlYRUQgcmVnaW9uCisgIC8vIChNSVhFRCkgLS0tLSBVIC0tPiAoTk9ORSkgICAgICAgIDsgYW5kIHJlcG9ydCBhIE1JWEVEIHJlZ2lvbgorICAvLyAoTUlYRUQpIC0tLS0gTSAtLT4gKE1JWEVEKQorCisgIGJpdEF0dHJfdCBSQSA9IEFUVFJfTk9ORTsKKyAgdW5zaWduZWQgU3RhcnRCaXQgPSAwOworCisgIGZvciAoQml0SW5kZXggPSAwOyBCaXRJbmRleCA8IEJJVF9XSURUSDsgQml0SW5kZXgrKykgeworICAgIGJpdEF0dHJfdCBiaXRBdHRyID0gYml0QXR0cnNbQml0SW5kZXhdOworCisgICAgYXNzZXJ0KGJpdEF0dHIgIT0gQVRUUl9OT05FICYmICJCaXQgd2l0aG91dCBhdHRyaWJ1dGVzIik7CisKKyAgICBzd2l0Y2ggKFJBKSB7CisgICAgY2FzZSBBVFRSX05PTkU6CisgICAgICBzd2l0Y2ggKGJpdEF0dHIpIHsKKyAgICAgIGNhc2UgQVRUUl9GSUxURVJFRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFUVFJfQUxMX1NFVDoKKyAgICAgICAgU3RhcnRCaXQgPSBCaXRJbmRleDsKKyAgICAgICAgUkEgPSBBVFRSX0FMTF9TRVQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBVFRSX0FMTF9VTlNFVDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFUVFJfTUlYRUQ6CisgICAgICAgIFN0YXJ0Qml0ID0gQml0SW5kZXg7CisgICAgICAgIFJBID0gQVRUUl9NSVhFRDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCAmJiAiVW5leHBlY3RlZCBiaXRBdHRyISIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBVFRSX0FMTF9TRVQ6CisgICAgICBzd2l0Y2ggKGJpdEF0dHIpIHsKKyAgICAgIGNhc2UgQVRUUl9GSUxURVJFRDoKKyAgICAgICAgcmVwb3J0UmVnaW9uKFJBLCBTdGFydEJpdCwgQml0SW5kZXgsIEFsbG93TWl4ZWQpOworICAgICAgICBSQSA9IEFUVFJfTk9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFUVFJfQUxMX1NFVDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFUVFJfQUxMX1VOU0VUOgorICAgICAgICByZXBvcnRSZWdpb24oUkEsIFN0YXJ0Qml0LCBCaXRJbmRleCwgQWxsb3dNaXhlZCk7CisgICAgICAgIFJBID0gQVRUUl9OT05FOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVRUUl9NSVhFRDoKKyAgICAgICAgcmVwb3J0UmVnaW9uKFJBLCBTdGFydEJpdCwgQml0SW5kZXgsIEFsbG93TWl4ZWQpOworICAgICAgICBTdGFydEJpdCA9IEJpdEluZGV4OworICAgICAgICBSQSA9IEFUVFJfTUlYRUQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KDAgJiYgIlVuZXhwZWN0ZWQgYml0QXR0ciEiKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVRUUl9NSVhFRDoKKyAgICAgIHN3aXRjaCAoYml0QXR0cikgeworICAgICAgY2FzZSBBVFRSX0ZJTFRFUkVEOgorICAgICAgICByZXBvcnRSZWdpb24oUkEsIFN0YXJ0Qml0LCBCaXRJbmRleCwgQWxsb3dNaXhlZCk7CisgICAgICAgIFN0YXJ0Qml0ID0gQml0SW5kZXg7CisgICAgICAgIFJBID0gQVRUUl9OT05FOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVRUUl9BTExfU0VUOgorICAgICAgICByZXBvcnRSZWdpb24oUkEsIFN0YXJ0Qml0LCBCaXRJbmRleCwgQWxsb3dNaXhlZCk7CisgICAgICAgIFN0YXJ0Qml0ID0gQml0SW5kZXg7CisgICAgICAgIFJBID0gQVRUUl9BTExfU0VUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVRUUl9BTExfVU5TRVQ6CisgICAgICAgIHJlcG9ydFJlZ2lvbihSQSwgU3RhcnRCaXQsIEJpdEluZGV4LCBBbGxvd01peGVkKTsKKyAgICAgICAgUkEgPSBBVFRSX05PTkU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBVFRSX01JWEVEOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCgwICYmICJVbmV4cGVjdGVkIGJpdEF0dHIhIik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFUVFJfQUxMX1VOU0VUOgorICAgICAgYXNzZXJ0KDAgJiYgInJlZ2lvbkF0dHIgc3RhdGUgbWFjaGluZSBoYXMgbm8gQVRUUl9VTlNFVCBzdGF0ZSIpOworICAgIGNhc2UgQVRUUl9GSUxURVJFRDoKKyAgICAgIGFzc2VydCgwICYmICJyZWdpb25BdHRyIHN0YXRlIG1hY2hpbmUgaGFzIG5vIEFUVFJfRklMVEVSRUQgc3RhdGUiKTsKKyAgICB9CisgIH0KKworICAvLyBBdCB0aGUgZW5kLCBpZiB3ZSdyZSBzdGlsbCBpbiBBTExfU0VUIG9yIE1JWEVEIHN0YXRlcywgcmVwb3J0IGEgcmVnaW9uCisgIHN3aXRjaCAoUkEpIHsKKyAgY2FzZSBBVFRSX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgQVRUUl9GSUxURVJFRDoKKyAgICBicmVhazsKKyAgY2FzZSBBVFRSX0FMTF9TRVQ6CisgICAgcmVwb3J0UmVnaW9uKFJBLCBTdGFydEJpdCwgQml0SW5kZXgsIEFsbG93TWl4ZWQpOworICAgIGJyZWFrOworICBjYXNlIEFUVFJfQUxMX1VOU0VUOgorICAgIGJyZWFrOworICBjYXNlIEFUVFJfTUlYRUQ6CisgICAgcmVwb3J0UmVnaW9uKFJBLCBTdGFydEJpdCwgQml0SW5kZXgsIEFsbG93TWl4ZWQpOworICAgIGJyZWFrOworICB9CisKKyAgLy8gV2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoZSBmaWx0ZXIgcHJvY2Vzc2luZ3MuICBOb3cgaXQncyB0aW1lIHRvIGNob29zZQorICAvLyB0aGUgYmVzdCBwZXJmb3JtaW5nIGZpbHRlci4KKyAgQmVzdEluZGV4ID0gMDsKKyAgYm9vbCBBbGxVc2VsZXNzID0gdHJ1ZTsKKyAgdW5zaWduZWQgQmVzdFNjb3JlID0gMDsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRmlsdGVycy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdW5zaWduZWQgVXNlZnVsbmVzcyA9IEZpbHRlcnNbaV0udXNlZnVsbmVzcygpOworCisgICAgaWYgKFVzZWZ1bG5lc3MpCisgICAgICBBbGxVc2VsZXNzID0gZmFsc2U7CisKKyAgICBpZiAoVXNlZnVsbmVzcyA+IEJlc3RTY29yZSkgeworICAgICAgQmVzdEluZGV4ID0gaTsKKyAgICAgIEJlc3RTY29yZSA9IFVzZWZ1bG5lc3M7CisgICAgfQorICB9CisKKyAgaWYgKCFBbGxVc2VsZXNzKQorICAgIGJlc3RGaWx0ZXIoKS5yZWN1cnNlKCk7CisKKyAgcmV0dXJuICFBbGxVc2VsZXNzOworfSAvLyBlbmQgb2YgRmlsdGVyQ2hvb3Nlcjo6ZmlsdGVyUHJvY2Vzc29yKGJvb2wpCisKKy8vIERlY2lkZXMgb24gdGhlIGJlc3QgY29uZmlndXJhdGlvbiBvZiBmaWx0ZXIocykgdG8gdXNlIGluIG9yZGVyIHRvIGRlY29kZQorLy8gdGhlIGluc3RydWN0aW9ucy4gIEEgY29uZmxpY3Qgb2YgaW5zdHJ1Y3Rpb25zIG1heSBvY2N1ciwgaW4gd2hpY2ggY2FzZSB3ZQorLy8gZHVtcCB0aGUgY29uZmxpY3Qgc2V0IHRvIHRoZSBzdGFuZGFyZCBlcnJvci4KK3ZvaWQgRmlsdGVyQ2hvb3Nlcjo6ZG9GaWx0ZXIoKSB7CisgIHVuc2lnbmVkIE51bSA9IE9wY29kZXMuc2l6ZSgpOworICBhc3NlcnQoTnVtICYmICJGaWx0ZXJDaG9vc2VyIGNyZWF0ZWQgd2l0aCBubyBpbnN0cnVjdGlvbnMiKTsKKworICAvLyBIZXVyaXN0aWNzOiBVc2UgSW5zdHszMS0yOH0gYXMgdGhlIHRvcCBsZXZlbCBmaWx0ZXIgZm9yIEFSTSBJU0EuCisgIGlmIChUYXJnZXROYW1lID09IFRBUkdFVF9BUk0gJiYgUGFyZW50ID09IE5VTEwpIHsKKyAgICBydW5TaW5nbGVGaWx0ZXIoKnRoaXMsIDI4LCA0LCBmYWxzZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVHJ5IHJlZ2lvbnMgb2YgY29uc2VjdXRpdmUga25vd24gYml0IHZhbHVlcyBmaXJzdC4gCisgIGlmIChmaWx0ZXJQcm9jZXNzb3IoZmFsc2UpKQorICAgIHJldHVybjsKKworICAvLyBUaGVuIHJlZ2lvbnMgb2YgbWl4ZWQgYml0cyAoYm90aCBrbm93biBhbmQgdW5pdGlhbGl6ZWQgYml0IHZhbHVlcyBhbGxvd2VkKS4KKyAgaWYgKGZpbHRlclByb2Nlc3Nvcih0cnVlKSkKKyAgICByZXR1cm47CisKKyAgLy8gSGV1cmlzdGljcyB0byBjb3BlIHdpdGggY29uZmxpY3Qgc2V0IHt0MkNNUHJzLCB0MlNVQlNyciwgdDJTVUJTcnN9IHdoZXJlCisgIC8vIG5vIHNpbmdsZSBpbnN0cnVjdGlvbiBmb3IgdGhlIG1heGltdW0gQVRUUl9NSVhFRCByZWdpb24gSW5zdHsxNC00fSBoYXMgYQorICAvLyB3ZWxsLWtub3duIGVuY29kaW5nIHBhdHRlcm4uICBJbiBzdWNoIGNhc2UsIHdlIGJhY2t0cmFjayBhbmQgc2NhbiBmb3IgdGhlCisgIC8vIHRoZSB2ZXJ5IGZpcnN0IGNvbnNlY3V0aXZlIEFUVFJfQUxMX1NFVCByZWdpb24gYW5kIGFzc2lnbiBhIGZpbHRlciB0byBpdC4KKyAgaWYgKE51bSA9PSAzICYmIGZpbHRlclByb2Nlc3Nvcih0cnVlLCBmYWxzZSkpCisgICAgcmV0dXJuOworCisgIC8vIElmIHdlIGNvbWUgdG8gaGVyZSwgdGhlIGluc3RydWN0aW9uIGRlY29kaW5nIGhhcyBmYWlsZWQuCisgIC8vIFNldCB0aGUgQmVzdEluZGV4IHRvIC0xIHRvIGluZGljYXRlIHNvLgorICBCZXN0SW5kZXggPSAtMTsKK30KKworLy8gRW1pdHMgY29kZSB0byBkZWNvZGUgb3VyIHNoYXJlIG9mIGluc3RydWN0aW9ucy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUKKy8vIGVtaXR0ZWQgY29kZSBjYXVzZXMgYSByZXR1cm4sIHdoaWNoIG9jY3VycyBpZiB3ZSBrbm93IGhvdyB0byBkZWNvZGUKKy8vIHRoZSBpbnN0cnVjdGlvbiBhdCB0aGlzIGxldmVsIG9yIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgZGVjb2RlYWJsZS4KK2Jvb2wgRmlsdGVyQ2hvb3Nlcjo6ZW1pdChyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgJkluZGVudGF0aW9uKSB7CisgIGlmIChPcGNvZGVzLnNpemUoKSA9PSAxKQorICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIGluc3RydWN0aW9uIGluIHRoZSBzZXQsIHdoaWNoIGlzIGdyZWF0IQorICAgIC8vIENhbGwgZW1pdFNpbmdsZXRvbkRlY29kZXIoKSB0byBzZWUgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbWFpbmluZworICAgIC8vIGVuY29kaW5ncyBiaXRzLgorICAgIHJldHVybiBlbWl0U2luZ2xldG9uRGVjb2RlcihvLCBJbmRlbnRhdGlvbiwgT3Bjb2Rlc1swXSk7CisKKyAgLy8gQ2hvb3NlIHRoZSBiZXN0IGZpbHRlciB0byBkbyB0aGUgZGVjb2RpbmdzIQorICBpZiAoQmVzdEluZGV4ICE9IC0xKSB7CisgICAgRmlsdGVyICZCZXN0ID0gYmVzdEZpbHRlcigpOworICAgIGlmIChCZXN0LmdldE51bUZpbHRlcmVkKCkgPT0gMSkKKyAgICAgIGVtaXRTaW5nbGV0b25EZWNvZGVyKG8sIEluZGVudGF0aW9uLCBCZXN0KTsKKyAgICBlbHNlCisgICAgICBiZXN0RmlsdGVyKCkuZW1pdChvLCBJbmRlbnRhdGlvbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgdGhlcmUgaXMgYSBjb25mbGljdCBpbiBkZWNvZGluZy4gIExldCdzIHJlc29sdmUgdGhlIGtub3duCisgIC8vIGNvbmZsaWN0cyEKKyAgaWYgKChUYXJnZXROYW1lID09IFRBUkdFVF9BUk0gfHwgVGFyZ2V0TmFtZSA9PSBUQVJHRVRfVEhVTUIpICYmCisgICAgICBPcGNvZGVzLnNpemUoKSA9PSAyKSB7CisgICAgLy8gUmVzb2x2ZSB0aGUga25vd24gY29uZmxpY3Qgc2V0czoKKyAgICAvLworICAgIC8vIDEuIHNvdXJjZSByZWdpc3RlcnMgYXJlIGlkZW50aWNhbCA9PiBWTU9WRG5lb247IG90aGVyd2lzZSA9PiBWT1JSZAorICAgIC8vIDIuIHNvdXJjZSByZWdpc3RlcnMgYXJlIGlkZW50aWNhbCA9PiBWTU9WUTsgb3RoZXJ3aXNlID0+IFZPUlJxCisgICAgLy8gMy4gTERSLCBMRFJjcCA9PiByZXR1cm4gTERSIGZvciBub3cuCisgICAgLy8gRklYTUU6IEhvdyBjYW4gd2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiBMRFIgYW5kIExEUmNwPyAgRG8gd2UgbmVlZCB0bz8KKyAgICAvLyA0LiB0TERNLCB0TERNX1VQRCA9PiBSbiA9IEluc3R7MTAtOH0sIHJlZ2xpc3QgPSBJbnN0ezctMH0sCisgICAgLy8gICAgd2JhY2sgPSByZWdpc3RlcnM8Um4+ID0gMAorICAgIC8vIE5PVEU6ICh0TERNLCB0TERNX1VQRCkgcmVzb2x1dGlvbiBtdXN0IGNvbWUgYmVmb3JlIEFkdmFuY2VkIFNJTUQKKyAgICAvLyAgICAgICBhZGRyZXNzaW5nIG1vZGUgcmVzb2x1dGlvbiEhIQorICAgIC8vIDUuIFZMRFsyMzRdTE4qL1ZTVFsyMzRdTE4qIHZzLiBWTERbMjM0XUxOKl9VUEQvVlNUWzIzNF1MTipfVVBEIGNvbmZsaWN0cworICAgIC8vICAgIGFyZSByZXNvbHZlZCByZXR1cm5pbmcgdGhlIG5vbi1VUEQgdmVyc2lvbnMgb2YgdGhlIGluc3RydWN0aW9ucyBpZiB0aGUKKyAgICAvLyAgICBSbSBmaWVsZCwgaS5lLiwgSW5zdHszLTB9IGlzIDBiMTExMS4gIFRoaXMgaXMgc3BlY2lmaWVkIGluIEE3LjcuMQorICAgIC8vICAgIEFkdmFuY2VkIFNJTUQgYWRkcmVzc2luZyBtb2RlLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lMSA9IG5hbWVXaXRoSUQoT3Bjb2Rlc1swXSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUyID0gbmFtZVdpdGhJRChPcGNvZGVzWzFdKTsKKyAgICBpZiAoKG5hbWUxID09ICJWTU9WRG5lb24iICYmIG5hbWUyID09ICJWT1JSZCIpIHx8CisgICAgICAgIChuYW1lMSA9PSAiVk1PVlEiICYmIG5hbWUyID09ICJWT1JScSIpKSB7CisgICAgICAvLyBJbnNlcnRpbmcgdGhlIG9wZW5pbmcgY3VybHkgYnJhY2UgZm9yIHRoaXMgY2FzZSBibG9jay4KKyAgICAgIC0tSW5kZW50YXRpb247IC0tSW5kZW50YXRpb247CisgICAgICBvLmluZGVudChJbmRlbnRhdGlvbikgPDwgIntcbiI7CisgICAgICArK0luZGVudGF0aW9uOyArK0luZGVudGF0aW9uOworCisgICAgICBvLmluZGVudChJbmRlbnRhdGlvbikKKyAgICAgICAgPDwgImZpZWxkX3QgTiA9IGZpZWxkRnJvbUluc3RydWN0aW9uKGluc24sIDcsIDEpLCAiCisgICAgICAgIDw8ICJNID0gZmllbGRGcm9tSW5zdHJ1Y3Rpb24oaW5zbiwgNSwgMSk7XG4iOworICAgICAgby5pbmRlbnQoSW5kZW50YXRpb24pCisgICAgICAgIDw8ICJmaWVsZF90IFZuID0gZmllbGRGcm9tSW5zdHJ1Y3Rpb24oaW5zbiwgMTYsIDQpLCAiCisgICAgICAgIDw8ICJWbSA9IGZpZWxkRnJvbUluc3RydWN0aW9uKGluc24sIDAsIDQpO1xuIjsKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKQorICAgICAgICA8PCAicmV0dXJuIChOID09IE0gJiYgVm4gPT0gVm0pID8gIgorICAgICAgICA8PCBPcGNvZGVzWzBdIDw8ICIgLyogIiA8PCBuYW1lMSA8PCAiICovIDogIgorICAgICAgICA8PCBPcGNvZGVzWzFdIDw8ICIgLyogIiA8PCBuYW1lMiA8PCAiICovIDtcbiI7CisKKyAgICAgIC8vIEluc2VydGluZyB0aGUgY2xvc2luZyBjdXJseSBicmFjZSBmb3IgdGhpcyBjYXNlIGJsb2NrLgorICAgICAgLS1JbmRlbnRhdGlvbjsgLS1JbmRlbnRhdGlvbjsKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAifVxuIjsKKyAgICAgICsrSW5kZW50YXRpb247ICsrSW5kZW50YXRpb247CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAobmFtZTEgPT0gIkxEUiIgJiYgbmFtZTIgPT0gIkxEUmNwIikgeworICAgICAgby5pbmRlbnQoSW5kZW50YXRpb24pCisgICAgICAgIDw8ICJyZXR1cm4gIiA8PCBPcGNvZGVzWzBdCisgICAgICAgIDw8ICI7IC8vIFJldHVybmluZyBMRFIgZm9yIHtMRFIsIExEUmNwfVxuIjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAobmFtZTEgPT0gInRMRE0iICYmIG5hbWUyID09ICJ0TERNX1VQRCIpIHsKKyAgICAgIC8vIEluc2VydGluZyB0aGUgb3BlbmluZyBjdXJseSBicmFjZSBmb3IgdGhpcyBjYXNlIGJsb2NrLgorICAgICAgLS1JbmRlbnRhdGlvbjsgLS1JbmRlbnRhdGlvbjsKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAie1xuIjsKKyAgICAgICsrSW5kZW50YXRpb247ICsrSW5kZW50YXRpb247CisgICAgICAKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKQorICAgICAgICA8PCAidW5zaWduZWQgUm4gPSBmaWVsZEZyb21JbnN0cnVjdGlvbihpbnNuLCA4LCAzKSwgIgorICAgICAgICA8PCAibGlzdCA9IGZpZWxkRnJvbUluc3RydWN0aW9uKGluc24sIDAsIDgpO1xuIjsKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKQorICAgICAgICA8PCAicmV0dXJuICgobGlzdCA+PiBSbikgJiAxKSA9PSAwID8gIgorICAgICAgICA8PCBPcGNvZGVzWzFdIDw8ICIgLyogIiA8PCBuYW1lMiA8PCAiICovIDogIgorICAgICAgICA8PCBPcGNvZGVzWzBdIDw8ICIgLyogIiA8PCBuYW1lMSA8PCAiICovIDtcbiI7CisKKyAgICAgIC8vIEluc2VydGluZyB0aGUgY2xvc2luZyBjdXJseSBicmFjZSBmb3IgdGhpcyBjYXNlIGJsb2NrLgorICAgICAgLS1JbmRlbnRhdGlvbjsgLS1JbmRlbnRhdGlvbjsKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAifVxuIjsKKyAgICAgICsrSW5kZW50YXRpb247ICsrSW5kZW50YXRpb247CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoc2FtZVN0cmluZ0V4Y2VwdFN1ZmZpeChuYW1lMSwgbmFtZTIsICJfVVBEIikpIHsKKyAgICAgIG8uaW5kZW50KEluZGVudGF0aW9uKQorICAgICAgICA8PCAicmV0dXJuIGZpZWxkRnJvbUluc3RydWN0aW9uKGluc24sIDAsIDQpID09IDE1ID8gIiA8PCBPcGNvZGVzWzBdCisgICAgICAgIDw8ICIgLyogIiA8PCBuYW1lMSA8PCAiICovIDogIiA8PCBPcGNvZGVzWzFdIDw8ICIvKiAiIDw8IG5hbWUyCisgICAgICAgIDw8ICIgKi8gOyAvLyBBZHZhbmNlZCBTSU1EIGFkZHJlc3NpbmcgbW9kZVxuIjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgaXQgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBrbm93biBjb25mbGljdCBzZXRzLgorICB9CisKKyAgLy8gV2UgZG9uJ3Qga25vdyBob3cgdG8gZGVjb2RlIHRoZXNlIGluc3RydWN0aW9ucyEgIFJldHVybiAwIGFuZCBkdW1wIHRoZQorICAvLyBjb25mbGljdCBzZXQhCisgIG8uaW5kZW50KEluZGVudGF0aW9uKSA8PCAicmV0dXJuIDA7IiA8PCAiIC8vIENvbmZsaWN0IHNldDogIjsKKyAgZm9yIChpbnQgaSA9IDAsIE4gPSBPcGNvZGVzLnNpemUoKTsgaSA8IE47ICsraSkgeworICAgIG8gPDwgbmFtZVdpdGhJRChPcGNvZGVzW2ldKTsKKyAgICBpZiAoaSA8IChOIC0gMSkpCisgICAgICBvIDw8ICIsICI7CisgICAgZWxzZQorICAgICAgbyA8PCAnXG4nOworICB9CisKKyAgLy8gUHJpbnQgb3V0IHVzZWZ1bCBjb25mbGljdCBpbmZvcm1hdGlvbiBmb3IgcG9zdG1vcnRlbSBhbmFseXNpcy4KKyAgZXJycygpIDw8ICJEZWNvZGluZyBDb25mbGljdDpcbiI7CisKKyAgZHVtcFN0YWNrKGVycnMoKSwgIlx0XHQiKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgT3Bjb2Rlcy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lID0gbmFtZVdpdGhJRChPcGNvZGVzW2ldKTsKKworICAgIGVycnMoKSA8PCAnXHQnIDw8IE5hbWUgPDwgIiAiOworICAgIGR1bXBCaXRzKGVycnMoKSwKKyAgICAgICAgICAgICBnZXRCaXRzRmllbGQoKkFsbEluc3RydWN0aW9uc1tPcGNvZGVzW2ldXS0+VGhlRGVmLCAiSW5zdCIpKTsKKyAgICBlcnJzKCkgPDwgJ1xuJzsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gIEFSTURFQmFja2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAoSGVscGVyIGNsYXNzIGZvciBBUk1EZWNvZGVyRW1pdHRlcikgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgQVJNRGVjb2RlckVtaXR0ZXI6OkFSTURFQmFja2VuZCB7CitwdWJsaWM6CisgIEFSTURFQmFja2VuZChBUk1EZWNvZGVyRW1pdHRlciAmZnJvbnRlbmQpIDoKKyAgICBOdW1iZXJlZEluc3RydWN0aW9ucygpLAorICAgIE9wY29kZXMoKSwKKyAgICBGcm9udGVuZChmcm9udGVuZCksCisgICAgVGFyZ2V0KCksCisgICAgRkMoTlVMTCkKKyAgeworICAgIGlmIChUYXJnZXQuZ2V0TmFtZSgpID09ICJBUk0iKQorICAgICAgVGFyZ2V0TmFtZSA9IFRBUkdFVF9BUk07CisgICAgZWxzZSB7CisgICAgICBlcnJzKCkgPDwgIlRhcmdldCBuYW1lICIgPDwgVGFyZ2V0LmdldE5hbWUoKSA8PCAiIG5vdCByZWNvZ25pemVkXG4iOworICAgICAgYXNzZXJ0KDAgJiYgIlVua25vd24gdGFyZ2V0Iik7CisgICAgfQorCisgICAgLy8gUG9wdWxhdGUgdGhlIGluc3RydWN0aW9ucyBmb3Igb3VyIFRhcmdldE5hbWUuCisgICAgcG9wdWxhdGVJbnN0cnVjdGlvbnMoKTsKKyAgfQorCisgIH5BUk1ERUJhY2tlbmQoKSB7CisgICAgaWYgKEZDKSB7CisgICAgICBkZWxldGUgRkM7CisgICAgICBGQyA9IE5VTEw7CisgICAgfQorICB9CisKKyAgdm9pZCBnZXRJbnN0cnVjdGlvbnNCeUVudW1WYWx1ZShzdGQ6OnZlY3Rvcjxjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk51bWJlcmVkSW5zdHJ1Y3Rpb25zKSB7CisgICAgLy8gV2UgbXVzdCBlbWl0IHRoZSBQSEkgb3Bjb2RlIGZpcnN0Li4uCisgICAgc3RkOjpzdHJpbmcgTmFtZXNwYWNlID0gVGFyZ2V0LmdldEluc3ROYW1lc3BhY2UoKTsKKyAgICBhc3NlcnQoIU5hbWVzcGFjZS5lbXB0eSgpICYmICJObyBpbnN0cnVjdGlvbnMgZGVmaW5lZC4iKTsKKworICAgIE51bWJlcmVkSW5zdHJ1Y3Rpb25zID0gVGFyZ2V0LmdldEluc3RydWN0aW9uc0J5RW51bVZhbHVlKCk7CisgIH0KKworICBib29sIHBvcHVsYXRlSW5zdHJ1Y3Rpb24oY29uc3QgQ29kZUdlbkluc3RydWN0aW9uICZDR0ksIFRBUkdFVF9OQU1FX3QgVE4pOworCisgIHZvaWQgcG9wdWxhdGVJbnN0cnVjdGlvbnMoKTsKKworICAvLyBFbWl0cyBkaXNhc3NlbWJsZXIgY29kZSBmb3IgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcuICBUaGlzIGRlbGVnYXRlcyB0byB0aGUKKyAgLy8gRmlsdGVyQ2hvb3NlciBpbnN0YW5jZSB0byBkbyB0aGUgaGVhdnkgbGlmdGluZy4KKyAgdm9pZCBlbWl0KHJhd19vc3RyZWFtICZvKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnZlY3Rvcjxjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPiBOdW1iZXJlZEluc3RydWN0aW9uczsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IE9wY29kZXM7CisgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIEFSTSBjaGlwLCB3aGljaCBzdXBwb3J0cyBBUk0gYW5kIFRodW1iIElTQXMuCisgIC8vIE9wY29kZXMyIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIFRodW1iIG9wY29kZXMuCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBPcGNvZGVzMjsKKyAgQVJNRGVjb2RlckVtaXR0ZXIgJkZyb250ZW5kOworICBDb2RlR2VuVGFyZ2V0IFRhcmdldDsKKyAgRmlsdGVyQ2hvb3NlciAqRkM7CisKKyAgVEFSR0VUX05BTUVfdCBUYXJnZXROYW1lOworfTsKKworYm9vbCBBUk1EZWNvZGVyRW1pdHRlcjo6QVJNREVCYWNrZW5kOjpwb3B1bGF0ZUluc3RydWN0aW9uKAorICAgIGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmQ0dJLCBUQVJHRVRfTkFNRV90IFROKSB7CisgIGNvbnN0IFJlY29yZCAmRGVmID0gKkNHSS5UaGVEZWY7CisgIGNvbnN0IFN0cmluZ1JlZiBOYW1lID0gRGVmLmdldE5hbWUoKTsKKyAgdWludDhfdCBGb3JtID0gZ2V0Qnl0ZUZpZWxkKERlZiwgIkZvcm0iKTsKKworICBCaXRzSW5pdCAmQml0cyA9IGdldEJpdHNGaWVsZChEZWYsICJJbnN0Iik7CisKKyAgLy8gSWYgYWxsIHRoZSBiaXQgcG9zaXRpb25zIGFyZSBub3Qgc3BlY2lmaWVkOyBkbyBub3QgZGVjb2RlIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIC8vIFdlIGFyZSBib3VuZCB0byBmYWlsISAgRm9yIHByb3BlciBkaXNhc3NlbWJseSwgdGhlIHdlbGwta25vd24gZW5jb2RpbmcgYml0cworICAvLyBvZiB0aGUgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBmdWxseSBzcGVjaWZpZWQuCisgIC8vCisgIC8vIFRoaXMgYWxzbyByZW1vdmVzIHBzZXVkbyBpbnN0cnVjdGlvbnMgZnJvbSBjb25zaWRlcmF0aW9ucyBvZiBkaXNhc3NlbWJseSwKKyAgLy8gd2hpY2ggaXMgYSBiZXR0ZXIgZGVzaWduIGFuZCBsZXNzIGZyYWdpbGUgdGhhbiB0aGUgbmFtZSBtYXRjaGluZ3MuCisgIGlmIChCaXRzLmFsbEluQ29tcGxldGUoKSkgcmV0dXJuIGZhbHNlOworCisgIGlmIChUTiA9PSBUQVJHRVRfQVJNKSB7CisgICAgLy8gRklYTUU6IHdoYXQgYWJvdXQgSW50X01lbUJhcnJpZXJWNiBhbmQgSW50X1N5bmNCYXJyaWVyVjY/CisgICAgaWYgKChOYW1lICE9ICJJbnRfTWVtQmFycmllclY3IiAmJiBOYW1lICE9ICJJbnRfU3luY0JhcnJpZXJWNyIpICYmCisgICAgICAgIEZvcm0gPT0gQVJNX0ZPUk1BVF9QU0VVRE8pCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRodW1iSW5zdHJ1Y3Rpb24oRm9ybSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKE5hbWUuZmluZCgiQ01QeiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zIC8qIHx8CisgICAgICAgIE5hbWUuZmluZCgiQ01OeiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zICovKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWdub3JlIHBzZXVkbyBpbnN0cnVjdGlvbnMuCisgICAgaWYgKE5hbWUgPT0gIkJYcjkiIHx8IE5hbWUgPT0gIkJNT1ZQQ1JYIiB8fCBOYW1lID09ICJCTU9WUENSWHI5IikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRhaWwgY2FsbHMgYXJlIG90aGVyIHBhdHRlcm5zIHRoYXQgZ2VuZXJhdGUgZXhpc3RpbmcgaW5zdHJ1Y3Rpb25zLgorICAgIGlmIChOYW1lID09ICJUQ1JFVFVSTmRpIiB8fCBOYW1lID09ICJUQ1JFVFVSTmRpTkQiIHx8CisgICAgICAgIE5hbWUgPT0gIlRDUkVUVVJOcmkiIHx8IE5hbWUgPT0gIlRDUkVUVVJOcmlORCIgfHwKKyAgICAgICAgTmFtZSA9PSAiVEFJTEpNUGQiICB8fCBOYW1lID09ICJUQUlMSk1QZHQiIHx8CisgICAgICAgIE5hbWUgPT0gIlRBSUxKTVBkTkQiIHx8IE5hbWUgPT0gIlRBSUxKTVBkTkR0IiB8fAorICAgICAgICBOYW1lID09ICJUQUlMSk1QciIgIHx8IE5hbWUgPT0gIlRBSUxKTVByTkQiIHx8CisgICAgICAgIE5hbWUgPT0gIk1PVnJfVEMiKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVkxETVEvVlNUTVEgY2FuIGJlIGhhbmxkZWQgd2l0aCB0aGUgbW9yZSBnZW5lcmljIFZMRE1EL1ZTVE1ELgorICAgIGlmIChOYW1lID09ICJWTERNUSIgfHwgTmFtZSA9PSAiVkxETVFfVVBEIiB8fAorICAgICAgICBOYW1lID09ICJWU1RNUSIgfHwgTmFtZSA9PSAiVlNUTVFfVVBEIikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vCisgICAgLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsIGNhc2VzIGFyZSBmb3IgY29uZmxpY3QgcmVzb2x1dGlvbnMuCisgICAgLy8KKworICAgIC8vIE5FT04gTkxkU3RGcm0gY29uZmxpY3QgcmVzb2x1dGlvbnM6CisgICAgLy8KKyAgICAvLyAxLiBJZ25vcmUgc3VmZml4ICJvZGQiIGFuZCAib2RkX1VQRCIsIHByZWZlciB0aGUgImV2ZW4iIHJlZ2lzdGVyLQorICAgIC8vICAgIG51bWJlcmVkIG9uZXMgd2hpY2ggaGF2ZSB0aGUgc2FtZSBBc20gZm9ybWF0IHN0cmluZy4KKyAgICAvLyAyLiBJZ25vcmUgVlNUMmQ2NF9VUEQsIHdoaWNoIGNvbmZsaWN0cyB3aXRoIFZTVDFxNjRfVVBELgorICAgIC8vIDMuIElnbm9yZSBWTEQyZDY0X1VQRCwgd2hpY2ggY29uZmxpY3RzIHdpdGggVkxEMXE2NF9VUEQuCisgICAgLy8gNC4gSWdub3JlIFZMRDFxW19VUERdLCB3aGljaCBjb25mbGljdHMgd2l0aCBWTEQxcTY0W19VUERdLgorICAgIC8vIDUuIElnbm9yZSBWU1QxcVtfVVBEXSwgd2hpY2ggY29uZmxpY3RzIHdpdGggVlNUMXE2NFtfVVBEXS4KKyAgICBpZiAoTmFtZS5lbmRzd2l0aCgib2RkIikgfHwgTmFtZS5lbmRzd2l0aCgib2RkX1VQRCIpIHx8CisgICAgICAgIE5hbWUgPT0gIlZTVDJkNjRfVVBEIiB8fCBOYW1lID09ICJWTEQyZDY0X1VQRCIgfHwKKyAgICAgICAgTmFtZSA9PSAiVkxEMXEiIHx8IE5hbWUgPT0gIlZMRDFxX1VQRCIgfHwKKyAgICAgICAgTmFtZSA9PSAiVlNUMXEiIHx8IE5hbWUgPT0gIlZTVDFxX1VQRCIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSU0NTcmkgYW5kIFJTQ1NycyBzZXQgdGhlICdzJyBiaXQsIGJ1dCBhcmUgbm90IHByZWRpY2F0ZWQuICBXZSBhcmUKKyAgICAvLyBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBnZW5lcmljIFJTQ3JpIGFuZCBSU0NycyBpbnN0cnVjdGlvbnMuCisgICAgaWYgKE5hbWUgPT0gIlJTQ1NyaSIgfHwgTmFtZSA9PSAiUlNDU3JzIikgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTU9WQ0NyLCBNT1ZDQ3MsIE1PVkNDaSwgRkNZUFNjYywgRkNZUERjYywgRk5FR1NjYywgYW5kIEZORUdEY2MgYXJlIHVzZWQKKyAgICAvLyBpbiB0aGUgY29tcGlsZXIgdG8gaW1wbGVtZW50IGNvbmRpdGlvbmFsIG1vdmVzLiAgV2UgY2FuIGlnbm9yZSB0aGVtIGluCisgICAgLy8gZmF2b3Igb2YgdGhlaXIgbW9yZSBnZW5lcmljIHZlcnNpb25zIG9mIGluc3RydWN0aW9ucy4KKyAgICAvLyBTZWUgYWxzbyBTRE5vZGUgKkFSTURBR1RvREFHSVNlbDo6U2VsZWN0KFNEVmFsdWUgT3ApLgorICAgIGlmIChOYW1lID09ICJNT1ZDQ3IiIHx8IE5hbWUgPT0gIk1PVkNDcyIgfHwgTmFtZSA9PSAiTU9WQ0NpIiB8fAorICAgICAgICBOYW1lID09ICJGQ1BZU2NjIiB8fCBOYW1lID09ICJGQ1BZRGNjIiB8fAorICAgICAgICBOYW1lID09ICJGTkVHU2NjIiB8fCBOYW1lID09ICJGTkVHRGNjIikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIERpdHRvIGZvciBWTU9WRGNjLCBWTU9WU2NjLCBWTkVHRGNjLCBhbmQgVk5FR1NjYy4KKyAgICBpZiAoTmFtZSA9PSAiVk1PVkRjYyIgfHwgTmFtZSA9PSAiVk1PVlNjYyIgfHwgTmFtZSA9PSAiVk5FR0RjYyIgfHwKKyAgICAgICAgTmFtZSA9PSAiVk5FR1NjYyIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZ25vcmUgdGhlICpfc2ZwIGluc3RydWN0aW9ucyB3aGVuIGRlY29kaW5nLiAgVGhleSBhcmUgdXNlZCBieSB0aGUKKyAgICAvLyBjb21waWxlciB0byBpbXBsZW1lbnQgc2NhbGFyIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgdXNpbmcgdmVjdG9yCisgICAgLy8gb3BlcmF0aW9ucyBpbiBvcmRlciB0byB3b3JrIGFyb3VuZCBzb21lIHBlcmZvcm1hbmNlIGlzc3Vlcy4KKyAgICBpZiAoTmFtZS5maW5kKCJfc2ZwIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHJldHVybiBmYWxzZTsKKworICAgIC8vIExETV9SRVQgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgTERNIChMb2FkIE11bHRpcGxlKSB3aGVyZSB0aGUgcmVnaXN0ZXJzCisgICAgLy8gbG9hZGVkIGluY2x1ZGUgdGhlIFBDLCBjYXVzaW5nIGEgYnJhbmNoIHRvIGEgbG9hZGVkIGFkZHJlc3MuICBJZ25vcmUKKyAgICAvLyB0aGUgTERNX1JFVCBpbnN0cnVjdGlvbiB3aGVuIGRlY29kaW5nLgorICAgIGlmIChOYW1lID09ICJMRE1fUkVUIikgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQmNjIGlzIGluIGEgbW9yZSBnZW5lcmljIGZvcm0gdGhhbiBCLiAgSWdub3JlIEIgd2hlbiBkZWNvZGluZy4KKyAgICBpZiAoTmFtZSA9PSAiQiIpIHJldHVybiBmYWxzZTsKKworICAgIC8vIElnbm9yZSB0aGUgbm9uLURhcndpbiBCTCBpbnN0cnVjdGlvbnMgYW5kIHRoZSBUUHNvZnQgKFRMUykgaW5zdHJ1Y3Rpb24uCisgICAgaWYgKE5hbWUgPT0gIkJMIiB8fCBOYW1lID09ICJCTF9wcmVkIiB8fCBOYW1lID09ICJCTFgiIHx8IE5hbWUgPT0gIkJYIiB8fAorICAgICAgICBOYW1lID09ICJUUHNvZnQiKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWdub3JlIFZEVVBmW2R8cV0gaW5zdHJ1Y3Rpb25zIGtub3duIHRvIGNvbmZsaWN0IHdpdGggVkRVUDMyW2QtcV0gZm9yCisgICAgLy8gZGVjb2RpbmcuICBUaGUgaW5zdHJ1Y3Rpb24gZHVwbGljYXRlcyBhbiBlbGVtZW50IGZyb20gYW4gQVJNIGNvcmUKKyAgICAvLyByZWdpc3RlciBpbnRvIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4gIFRoZXJlIGlzIG5vCisgICAgLy8gZGlzdGluY3Rpb24gYmV0d2VlbiBkYXRhIHR5cGVzLgorICAgIGlmIChOYW1lID09ICJWRFVQZmQiIHx8IE5hbWUgPT0gIlZEVVBmcSIpIHJldHVybiBmYWxzZTsKKworICAgIC8vIEE4LTU5ODogVkVYVAorICAgIC8vIFZlY3RvciBFeHRyYWN0IGV4dHJhY3RzIGVsZW1lbnRzIGZyb20gdGhlIGJvdHRvbSBlbmQgb2YgdGhlIHNlY29uZAorICAgIC8vIG9wZXJhbmQgdmVjdG9yIGFuZCB0aGUgdG9wIGVuZCBvZiB0aGUgZmlyc3QsIGNvbmNhdGVuYXRlcyB0aGVtIGFuZAorICAgIC8vIHBsYWNlcyB0aGUgcmVzdWx0IGluIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICBUaGUgZWxlbWVudHMgb2YgdGhlCisgICAgLy8gdmVjdG9ycyBhcmUgdHJlYXRlZCBhcyBiZWluZyA4LWJpdCBiaXRmaWVsZHMuICBUaGVyZSBpcyBubyBkaXN0aW5jdGlvbgorICAgIC8vIGJldHdlZW4gZGF0YSB0eXBlcy4gIFRoZSBzaXplIG9mIHRoZSBvcGVyYXRpb24gY2FuIGJlIHNwZWNpZmllZCBpbgorICAgIC8vIGFzc2VtYmxlciBhcyB2ZXh0LnNpemUuICBJZiB0aGUgdmFsdWUgaXMgMTYsIDMyLCBvciA2NCwgdGhlIHN5bnRheCBpcworICAgIC8vIGEgcHNldWRvLWluc3RydWN0aW9uIGZvciBhIFZFWFQgaW5zdHJ1Y3Rpb24gc3BlY2lmeWluZyB0aGUgZXF1aXZhbGVudAorICAgIC8vIG51bWJlciBvZiBieXRlcy4KKyAgICAvLworICAgIC8vIFZhcmlhbnRzIFZFWFRkMTYsIFZFWFRkMzIsIFZFWFRkOCwgYW5kIFZFWFRkZiBhcmUgcmVkdWNlZCB0byBWRVhUZDg7CisgICAgLy8gdmFyaWFudHMgVkVYVHExNiwgVkVYVHEzMiwgVkVYVHE4LCBhbmQgVkVYVHFmIGFyZSByZWR1Y2VkIHRvIFZFWFRxOC4KKyAgICBpZiAoTmFtZSA9PSAiVkVYVGQxNiIgfHwgTmFtZSA9PSAiVkVYVGQzMiIgfHwgTmFtZSA9PSAiVkVYVGRmIiB8fAorICAgICAgICBOYW1lID09ICJWRVhUcTE2IiB8fCBOYW1lID09ICJWRVhUcTMyIiB8fCBOYW1lID09ICJWRVhUcWYiKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVmVjdG9yIFJldmVyc2UgaXMgc2ltaWxhciB0byBWZWN0b3IgRXh0cmFjdC4gIFRoZXJlIGlzIG5vIGRpc3RpbmN0aW9uCisgICAgLy8gYmV0d2VlbiBkYXRhIHR5cGVzLCBvdGhlciB0aGFuIHNpemUuCisgICAgLy8KKyAgICAvLyBWUkVWNjRkZiBpcyBlcXVpdmFsZW50IHRvIFZSRVY2NGQzMi4KKyAgICAvLyBWUkVWNjRxZiBpcyBlcXVpdmFsZW50IHRvIFZSRVY2NHEzMi4KKyAgICBpZiAoTmFtZSA9PSAiVlJFVjY0ZGYiIHx8IE5hbWUgPT0gIlZSRVY2NHFmIikgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVkRVUExOZmQgaXMgZXF1aXZhbGVudCB0byBWRFVQTE4zMmQ7IFZEVVBmZGYgaXMgc3BlY2lhbGl6ZWQgVkRVUExOMzJkLgorICAgIC8vIFZEVVBMTmZxIGlzIGVxdWl2YWxlbnQgdG8gVkRVUExOMzJxOyBWRFVQZnFmIGlzIHNwZWNpYWxpemVkIFZEVVBMTjMycS4KKyAgICAvLyBWTEQxZGYgaXMgZXF1aXZhbGVudCB0byBWTEQxZDMyLgorICAgIC8vIFZMRDFxZiBpcyBlcXVpdmFsZW50IHRvIFZMRDFxMzIuCisgICAgLy8gVkxEMmQ2NCBpcyBlcXVpdmFsZW50IHRvIFZMRDFxNjQuCisgICAgLy8gVlNUMWRmIGlzIGVxdWl2YWxlbnQgdG8gVlNUMWQzMi4KKyAgICAvLyBWU1QxcWYgaXMgZXF1aXZhbGVudCB0byBWU1QxcTMyLgorICAgIC8vIFZTVDJkNjQgaXMgZXF1aXZhbGVudCB0byBWU1QxcTY0LgorICAgIGlmIChOYW1lID09ICJWRFVQTE5mZCIgfHwgTmFtZSA9PSAiVkRVUGZkZiIgfHwKKyAgICAgICAgTmFtZSA9PSAiVkRVUExOZnEiIHx8IE5hbWUgPT0gIlZEVVBmcWYiIHx8CisgICAgICAgIE5hbWUgPT0gIlZMRDFkZiIgfHwgTmFtZSA9PSAiVkxEMXFmIiB8fCBOYW1lID09ICJWTEQyZDY0IiB8fAorICAgICAgICBOYW1lID09ICJWU1QxZGYiIHx8IE5hbWUgPT0gIlZTVDFxZiIgfHwgTmFtZSA9PSAiVlNUMmQ2NCIpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAoVE4gPT0gVEFSR0VUX1RIVU1CKSB7CisgICAgaWYgKCF0aHVtYkluc3RydWN0aW9uKEZvcm0pKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT24gRGFyd2luIFI5IGlzIGNhbGwtY2xvYmJlcmVkLiAgSWdub3JlIHRoZSBub24tRGFyd2luIGNvdW50ZXJwYXJ0cy4KKyAgICBpZiAoTmFtZSA9PSAidEJMIiB8fCBOYW1lID09ICJ0QkxYaSIgfHwgTmFtZSA9PSAidEJMWHIiKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWdub3JlIHRoZSBUUHNvZnQgKFRMUykgaW5zdHJ1Y3Rpb25zLCB3aGljaCBjb25mbGljdCB3aXRoIHRCTHI5LgorICAgIGlmIChOYW1lID09ICJ0VFBzb2Z0IiB8fCBOYW1lID09ICJ0MlRQc29mdCIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZ25vcmUgdExFQXBjcmVsIGFuZCB0TEVBcGNyZWxKVCwgcHJlZmVyIHRBRERyUENpLgorICAgIGlmIChOYW1lID09ICJ0TEVBcGNyZWwiIHx8IE5hbWUgPT0gInRMRUFwY3JlbEpUIikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElnbm9yZSB0MkxFQXBjcmVsLCBwcmVmZXIgdGhlIGdlbmVyaWMgdDJBREQqIGZvciBkaXNhc3NlbWJseSBwcmludGluZy4KKyAgICBpZiAoTmFtZSA9PSAidDJMRUFwY3JlbCIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZ25vcmUgdEFERHJTUCwgdEFERHNwciwgYW5kIHRQSUNBREQsIHByZWZlciB0aGUgZ2VuZXJpYyB0QUREaGlyci4KKyAgICAvLyBJZ25vcmUgdDJTVUJyU1BzLCBwcmVmZXIgdGhlIHQyU1VCW1NdcltyfHNdLgorICAgIC8vIElnbm9yZSB0MkFERHJTUHMsIHByZWZlciB0aGUgdDJBRERbU11yW3J8c10uCisgICAgLy8gSWdub3JlIHQyQUREclNQaS90MlNVQnJTUGksIHdoaWNoIGhhdmUgbW9yZSBnZW5lcmljIGNvdXRlcnBhcnRzLgorICAgIC8vIElnbm9yZSB0MkFERHJTUGkxMi90MlNVQnJTUGkxMiwgd2hpY2ggaGF2ZSBtb3JlIGdlbmVyaWMgY291dGVycGFydHMKKyAgICBpZiAoTmFtZSA9PSAidEFERHJTUCIgfHwgTmFtZSA9PSAidEFERHNwciIgfHwgTmFtZSA9PSAidFBJQ0FERCIgfHwKKyAgICAgICAgTmFtZSA9PSAidDJTVUJyU1BzIiB8fCBOYW1lID09ICJ0MkFERHJTUHMiIHx8CisgICAgICAgIE5hbWUgPT0gInQyQUREclNQaSIgfHwgTmFtZSA9PSAidDJTVUJyU1BpIiB8fAorICAgICAgICBOYW1lID09ICJ0MkFERHJTUGkxMiIgfHwgTmFtZSA9PSAidDJTVUJyU1BpMTIiKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWdub3JlIHQyTERSRHBjaSwgcHJlZmVyIHRoZSBnZW5lcmljIHQyTERSRGk4LCB0MkxEUkRfUFJFLCB0MkxEUkRfUE9TVC4KKyAgICBpZiAoTmFtZSA9PSAidDJMRFJEcGNpIikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElnbm9yZSB0MlRCQiwgdDJUQkggYW5kIHByZWZlciB0aGUgZ2VuZXJpYyB0MlRCQmdlbiwgdDJUQkhnZW4uCisgICAgaWYgKE5hbWUgPT0gInQyVEJCIiB8fCBOYW1lID09ICJ0MlRCSCIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZXNvbHZlIGNvbmZsaWN0czoKKyAgICAvLworICAgIC8vICAgdEJmYXIgY29uZmxpY3RzIHdpdGggdEJMcjkKKyAgICAvLyAgIHRDTU56IGNvbmZsaWN0cyB3aXRoIHRDTU4gKHdpdGggYXNzZW1ibHkgZm9ybWF0IHN0cmluZ3MgYmVpbmcgZXF1YWwpCisgICAgLy8gICB0UE9QX1JFVC90MkxETV9SRVQgY29uZmxpY3Qgd2l0aCB0UE9QL3QyTERNIChkaXR0bykKKyAgICAvLyAgIHRNT1ZDQ2kgY29uZmxpY3RzIHdpdGggdE1PVmk4CisgICAgLy8gICB0TU9WQ0NyIGNvbmZsaWN0cyB3aXRoIHRNT1ZncHIyZ3ByCisgICAgLy8gICB0QlJfSlRyIGNvbmZsaWN0cyB3aXRoIHRCUklORAorICAgIC8vICAgdFNwaWxsIGNvbmZsaWN0cyB3aXRoIHRTVFJzcGkKKyAgICAvLyAgIHRMRFJjcCBjb25mbGljdHMgd2l0aCB0TERSc3BpCisgICAgLy8gICB0UmVzdG9yZSBjb25mbGljdHMgd2l0aCB0TERSc3BpCisgICAgLy8gICB0MkxFQXBjcmVsSlQgY29uZmxpY3RzIHdpdGggdDJMRUFwY3JlbAorICAgIGlmIChOYW1lID09ICJ0QmZhciIgfHwKKyAgICAgICAgLyogTmFtZSA9PSAidENNTnoiIHx8ICovIE5hbWUgPT0gInRDTVB6aTgiIHx8IE5hbWUgPT0gInRDTVB6ciIgfHwKKyAgICAgICAgTmFtZSA9PSAidENNUHpoaXIiIHx8IC8qIE5hbWUgPT0gInQyQ01OenJyIiB8fCBOYW1lID09ICJ0MkNNTnpycyIgfHwKKyAgICAgICAgTmFtZSA9PSAidDJDTU56cmkiIHx8ICovIE5hbWUgPT0gInQyQ01QenJyIiB8fCBOYW1lID09ICJ0MkNNUHpycyIgfHwKKyAgICAgICAgTmFtZSA9PSAidDJDTVB6cmkiIHx8IE5hbWUgPT0gInRQT1BfUkVUIiB8fCBOYW1lID09ICJ0MkxETV9SRVQiIHx8CisgICAgICAgIE5hbWUgPT0gInRNT1ZDQ2kiIHx8IE5hbWUgPT0gInRNT1ZDQ3IiIHx8IE5hbWUgPT0gInRCUl9KVHIiIHx8CisgICAgICAgIE5hbWUgPT0gInRTcGlsbCIgfHwgTmFtZSA9PSAidExEUmNwIiB8fCBOYW1lID09ICJ0UmVzdG9yZSIgfHwKKyAgICAgICAgTmFtZSA9PSAidDJMRUFwY3JlbEpUIikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIER1bXBzIHRoZSBpbnN0cnVjdGlvbiBlbmNvZGluZyBmb3JtYXQuCisgIHN3aXRjaCAoVGFyZ2V0TmFtZSkgeworICBjYXNlIFRBUkdFVF9BUk06CisgIGNhc2UgVEFSR0VUX1RIVU1COgorICAgIERFQlVHKGVycnMoKSA8PCBOYW1lIDw8ICIgIiA8PCBzdHJpbmdGb3JBUk1Gb3JtYXQoKEFSTUZvcm1hdClGb3JtKSk7CisgICAgYnJlYWs7CisgIH0KKworICBERUJVRyh7CisgICAgICBlcnJzKCkgPDwgIiAiOworCisgICAgICAvLyBEdW1wcyB0aGUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgYml0cy4KKyAgICAgIGR1bXBCaXRzKGVycnMoKSwgQml0cyk7CisKKyAgICAgIGVycnMoKSA8PCAnXG4nOworCisgICAgICAvLyBEdW1wcyB0aGUgbGlzdCBvZiBvcGVyYW5kIGluZm8uCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ0dJLk9wZXJhbmRMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgQ29kZUdlbkluc3RydWN0aW9uOjpPcGVyYW5kSW5mbyBJbmZvID0gQ0dJLk9wZXJhbmRMaXN0W2ldOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmT3BlcmFuZE5hbWUgPSBJbmZvLk5hbWU7CisgICAgICAgIGNvbnN0IFJlY29yZCAmT3BlcmFuZERlZiA9ICpJbmZvLlJlYzsKKworICAgICAgICBlcnJzKCkgPDwgIlx0IiA8PCBPcGVyYW5kTmFtZSA8PCAiICgiIDw8IE9wZXJhbmREZWYuZ2V0TmFtZSgpIDw8ICIpXG4iOworICAgICAgfQorICAgIH0pOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEFSTURlY29kZXJFbWl0dGVyOjpBUk1ERUJhY2tlbmQ6OnBvcHVsYXRlSW5zdHJ1Y3Rpb25zKCkgeworICBnZXRJbnN0cnVjdGlvbnNCeUVudW1WYWx1ZShOdW1iZXJlZEluc3RydWN0aW9ucyk7CisKKyAgdWludDE2X3QgbnVtVUlEcyA9IE51bWJlcmVkSW5zdHJ1Y3Rpb25zLnNpemUoKTsKKyAgdWludDE2X3QgdWlkOworCisgIGNvbnN0IGNoYXIgKmluc3RDbGFzcyA9IE5VTEw7CisKKyAgc3dpdGNoIChUYXJnZXROYW1lKSB7CisgIGNhc2UgVEFSR0VUX0FSTToKKyAgICBpbnN0Q2xhc3MgPSAiSW5zdEFSTSI7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIlVucmVhY2hhYmxlIGNvZGUhIik7CisgIH0KKworICBmb3IgKHVpZCA9IDA7IHVpZCA8IG51bVVJRHM7IHVpZCsrKSB7CisgICAgLy8gZmlsdGVyIG91dCBpbnRyaW5zaWNzCisgICAgaWYgKCFOdW1iZXJlZEluc3RydWN0aW9uc1t1aWRdLT5UaGVEZWYtPmlzU3ViQ2xhc3NPZihpbnN0Q2xhc3MpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAocG9wdWxhdGVJbnN0cnVjdGlvbigqTnVtYmVyZWRJbnN0cnVjdGlvbnNbdWlkXSwgVGFyZ2V0TmFtZSkpCisgICAgICBPcGNvZGVzLnB1c2hfYmFjayh1aWQpOworICB9CisKKyAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIEFSTSBjaGlwLCB3aGljaCBzdXBwb3J0cyB0d28gbW9kZXMgb2YgZXhlY3V0aW9uLgorICAvLyBUaGlzIGJyYW5jaCBoYW5kbGVzIHRoZSBUaHVtYiBvcGNvZGVzLgorICBpZiAoVGFyZ2V0TmFtZSA9PSBUQVJHRVRfQVJNKSB7CisgICAgZm9yICh1aWQgPSAwOyB1aWQgPCBudW1VSURzOyB1aWQrKykgeworICAgICAgLy8gZmlsdGVyIG91dCBpbnRyaW5zaWNzCisgICAgICBpZiAoIU51bWJlcmVkSW5zdHJ1Y3Rpb25zW3VpZF0tPlRoZURlZi0+aXNTdWJDbGFzc09mKCJJbnN0QVJNIikKKyAgICAgICAgICAmJiAhTnVtYmVyZWRJbnN0cnVjdGlvbnNbdWlkXS0+VGhlRGVmLT5pc1N1YkNsYXNzT2YoIkluc3RUaHVtYiIpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKHBvcHVsYXRlSW5zdHJ1Y3Rpb24oKk51bWJlcmVkSW5zdHJ1Y3Rpb25zW3VpZF0sIFRBUkdFVF9USFVNQikpCisgICAgICAgIE9wY29kZXMyLnB1c2hfYmFjayh1aWQpOworICAgIH0KKyAgfQorfQorCisvLyBFbWl0cyBkaXNhc3NlbWJsZXIgY29kZSBmb3IgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcuICBUaGlzIGRlbGVnYXRlcyB0byB0aGUKKy8vIEZpbHRlckNob29zZXIgaW5zdGFuY2UgdG8gZG8gdGhlIGhlYXZ5IGxpZnRpbmcuCit2b2lkIEFSTURlY29kZXJFbWl0dGVyOjpBUk1ERUJhY2tlbmQ6OmVtaXQocmF3X29zdHJlYW0gJm8pIHsKKyAgc3dpdGNoIChUYXJnZXROYW1lKSB7CisgIGNhc2UgVEFSR0VUX0FSTToKKyAgICBGcm9udGVuZC5FbWl0U291cmNlRmlsZUhlYWRlcigiQVJNL1RodW1iIERlY29kZXJzIiwgbyk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgIlVucmVhY2hhYmxlIGNvZGUhIik7CisgIH0KKworICBvIDw8ICIjaW5jbHVkZSBcImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oXCJcbiI7CisgIG8gPDwgIiNpbmNsdWRlIDxhc3NlcnQuaD5cbiI7CisgIG8gPDwgJ1xuJzsKKyAgbyA8PCAibmFtZXNwYWNlIGxsdm0ge1xuXG4iOworCisgIEZpbHRlckNob29zZXI6OnNldFRhcmdldE5hbWUoVGFyZ2V0TmFtZSk7CisKKyAgc3dpdGNoIChUYXJnZXROYW1lKSB7CisgIGNhc2UgVEFSR0VUX0FSTTogeworICAgIC8vIEVtaXQgY29tbW9uIHV0aWxpdHkgYW5kIEFSTSBJU0EgZGVjb2Rlci4KKyAgICBGQyA9IG5ldyBGaWx0ZXJDaG9vc2VyKE51bWJlcmVkSW5zdHJ1Y3Rpb25zLCBPcGNvZGVzKTsKKyAgICAvLyBSZXNldCBpbmRlbnRhdGlvbiBsZXZlbC4KKyAgICB1bnNpZ25lZCBJbmRlbnRhdGlvbiA9IDA7CisgICAgRkMtPmVtaXRUb3AobywgSW5kZW50YXRpb24pOworICAgIGRlbGV0ZSBGQzsKKworICAgIC8vIEVtaXQgVGh1bWIgSVNBIGRlY29kZXIgYXMgd2VsbC4KKyAgICBGaWx0ZXJDaG9vc2VyOjpzZXRUYXJnZXROYW1lKFRBUkdFVF9USFVNQik7CisgICAgRkMgPSBuZXcgRmlsdGVyQ2hvb3NlcihOdW1iZXJlZEluc3RydWN0aW9ucywgT3Bjb2RlczIpOworICAgIC8vIFJlc2V0IGluZGVudGF0aW9uIGxldmVsLgorICAgIEluZGVudGF0aW9uID0gMDsKKyAgICBGQy0+ZW1pdEJvdChvLCBJbmRlbnRhdGlvbik7CisgICAgYnJlYWs7CisgIH0KKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoMCAmJiAiVW5yZWFjaGFibGUgY29kZSEiKTsKKyAgfQorCisgIG8gPDwgIlxufSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UgXG4iOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgQmFja2VuZCBpbnRlcmZhY2UgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQVJNRGVjb2RlckVtaXR0ZXI6OmluaXRCYWNrZW5kKCkKK3sKKyAgICBCYWNrZW5kID0gbmV3IEFSTURFQmFja2VuZCgqdGhpcyk7Cit9CisKK3ZvaWQgQVJNRGVjb2RlckVtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmbykKK3sKKyAgQmFja2VuZC0+ZW1pdChvKTsKK30KKwordm9pZCBBUk1EZWNvZGVyRW1pdHRlcjo6c2h1dGRvd25CYWNrZW5kKCkKK3sKKyAgZGVsZXRlIEJhY2tlbmQ7CisgIEJhY2tlbmQgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQVJNRGVjb2RlckVtaXR0ZXIuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FSTURlY29kZXJFbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxYTk0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FSTURlY29kZXJFbWl0dGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLy89PT0tLS0tLS0tLS0tLS0gQVJNRGVjb2RlckVtaXR0ZXIuaCAtIERlY29kZXIgR2VuZXJhdG9yIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQVJNIERpc2Fzc2VtYmxlci4KKy8vIEl0IGNvbnRhaW5zIHRoZSB0YWJsZWdlbiBiYWNrZW5kIGRlY2xhcmF0aW9uIEFSTURlY29kZXJFbWl0dGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQVJNREVDT0RFUkVNSVRURVJfSAorI2RlZmluZSBBUk1ERUNPREVSRU1JVFRFUl9ICisKKyNpbmNsdWRlICJUYWJsZUdlbkJhY2tlbmQuaCIKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFSTURlY29kZXJFbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKK3B1YmxpYzoKKyAgQVJNRGVjb2RlckVtaXR0ZXIoUmVjb3JkS2VlcGVyICZSKSA6IFJlY29yZHMoUikgeworICAgIGluaXRCYWNrZW5kKCk7CisgIH0KKyAgICAKKyAgfkFSTURlY29kZXJFbWl0dGVyKCkgeworICAgIHNodXRkb3duQmFja2VuZCgpOworICB9CisKKyAgLy8gcnVuIC0gT3V0cHV0IHRoZSBjb2RlIGVtaXR0ZXIKKyAgdm9pZCBydW4ocmF3X29zdHJlYW0gJm8pOworICAgIAorcHJpdmF0ZToKKyAgLy8gSGVscGVyIGNsYXNzIGZvciBBUk1EZWNvZGVyRW1pdHRlci4KKyAgY2xhc3MgQVJNREVCYWNrZW5kOworCisgIEFSTURFQmFja2VuZCAqQmFja2VuZDsKKyAgICAKKyAgdm9pZCBpbml0QmFja2VuZCgpOworICB2b2lkIHNodXRkb3duQmFja2VuZCgpOworfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Bc21NYXRjaGVyRW1pdHRlci5jcHAgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Bc21NYXRjaGVyRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhNDMwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FzbU1hdGNoZXJFbWl0dGVyLmNwcApAQCAtMCwwICsxLDE4MDMgQEAKKy8vPT09LSBBc21NYXRjaGVyRW1pdHRlci5jcHAgLSBHZW5lcmF0ZSBhbiBhc3NlbWJseSBtYXRjaGVyIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGVtaXRzIGEgdGFyZ2V0IHNwZWNpZmllciBtYXRjaGVyIGZvciBjb252ZXJ0aW5nIHBhcnNlZAorLy8gYXNzZW1ibHkgb3BlcmFuZHMgaW4gdGhlIE1DSW5zdCBzdHJ1Y3R1cmVzLgorLy8KKy8vIFRoZSBpbnB1dCB0byB0aGUgdGFyZ2V0IHNwZWNpZmljIG1hdGNoZXIgaXMgYSBsaXN0IG9mIGxpdGVyYWwgdG9rZW5zIGFuZAorLy8gb3BlcmFuZHMuIFRoZSB0YXJnZXQgc3BlY2lmaWMgcGFyc2VyIHNob3VsZCBnZW5lcmFsbHkgZWxpbWluYXRlIGFueSBzeW50YXgKKy8vIHdoaWNoIGlzIG5vdCByZWxldmFudCBmb3IgbWF0Y2hpbmc7IGZvciBleGFtcGxlLCBjb21tYSB0b2tlbnMgc2hvdWxkIGhhdmUKKy8vIGFscmVhZHkgYmVlbiBjb25zdW1lZCBhbmQgZWxpbWluYXRlZCBieSB0aGUgcGFyc2VyLiBNb3N0IGluc3RydWN0aW9ucyB3aWxsCisvLyBlbmQgdXAgd2l0aCBhIHNpbmdsZSBsaXRlcmFsIHRva2VuICh0aGUgaW5zdHJ1Y3Rpb24gbmFtZSkgYW5kIHNvbWUgbnVtYmVyIG9mCisvLyBvcGVyYW5kcy4KKy8vCisvLyBTb21lIGV4YW1wbGUgaW5wdXRzLCBmb3IgWDg2OgorLy8gICAnYWRkbCcgKGltbWVkaWF0ZSAuLi4pIChyZWdpc3RlciAuLi4pCisvLyAgICdhZGQnIChpbW1lZGlhdGUgLi4uKSAobWVtb3J5IC4uLikKKy8vICAgJ2NhbGwnICcqJyAlZXBjIAorLy8KKy8vIFRoZSBhc3NlbWJseSBtYXRjaGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIHRoaXMgaW5wdXQgaW50byBhIHByZWNpc2UKKy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKGkuZS4sIGFuIGluc3RydWN0aW9uIHdpdGggYSB3ZWxsIGRlZmluZWQgZW5jb2RpbmcpLiBUaGlzCisvLyBtYXBwaW5nIGhhcyBzZXZlcmFsIHByb3BlcnRpZXMgd2hpY2ggY29tcGxpY2F0ZSBtYXRjaGluZzoKKy8vCisvLyAgLSBJdCBtYXkgYmUgYW1iaWd1b3VzOyBtYW55IGFyY2hpdGVjdHVyZXMgY2FuIGxlZ2FsbHkgZW5jb2RlIHBhcnRpY3VsYXIKKy8vICAgIHZhcmlhbnRzIG9mIGFuIGluc3RydWN0aW9uIGluIGRpZmZlcmVudCB3YXlzIChmb3IgZXhhbXBsZSwgdXNpbmcgYSBzbWFsbGVyCisvLyAgICBlbmNvZGluZyBmb3Igc21hbGwgaW1tZWRpYXRlcykuIFN1Y2ggYW1iaWd1aXRpZXMgc2hvdWxkIG5ldmVyIGJlCisvLyAgICBhcmJpdHJhcmlseSByZXNvbHZlZCBieSB0aGUgYXNzZW1ibGVyLCB0aGUgYXNzZW1ibGVyIGlzIGFsd2F5cyByZXNwb25zaWJsZQorLy8gICAgZm9yIGNob29zaW5nIHRoZSAiYmVzdCIgYXZhaWxhYmxlIGluc3RydWN0aW9uLgorLy8KKy8vICAtIEl0IG1heSBkZXBlbmQgb24gdGhlIHN1YnRhcmdldCBvciB0aGUgYXNzZW1ibGVyIGNvbnRleHQuIEluc3RydWN0aW9ucworLy8gICAgd2hpY2ggYXJlIGludmFsaWQgZm9yIHRoZSBjdXJyZW50IG1vZGUsIGJ1dCBvdGhlcndpc2UgdW5hbWJpZ3VvdXMgKGUuZy4sCisvLyAgICBhbiBTU0UgaW5zdHJ1Y3Rpb24gaW4gYSBmaWxlIGJlaW5nIGFzc2VtYmxlZCBmb3IgaTQ4Nikgc2hvdWxkIGJlIGFjY2VwdGVkCisvLyAgICBhbmQgcmVqZWN0ZWQgYnkgdGhlIGFzc2VtYmxlciBmcm9udCBlbmQuIEhvd2V2ZXIsIGlmIHRoZSBwcm9wZXIgZW5jb2RpbmcKKy8vICAgIGZvciBhbiBpbnN0cnVjdGlvbiBpcyBkZXBlbmRlbnQgb24gdGhlIGFzc2VtYmxlciBjb250ZXh0IHRoZW4gdGhlIG1hdGNoZXIKKy8vICAgIGlzIHJlc3BvbnNpYmxlIGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlY3QgbWFjaGluZSBpbnN0cnVjdGlvbiBmb3IgdGhlCisvLyAgICBjdXJyZW50IG1vZGUuCisvLworLy8gVGhlIGNvcmUgbWF0Y2hpbmcgYWxnb3JpdGhtIGF0dGVtcHRzIHRvIGV4cGxvaXQgdGhlIHJlZ3VsYXJpdHkgaW4gbW9zdAorLy8gaW5zdHJ1Y3Rpb24gc2V0cyB0byBxdWlja2x5IGRldGVybWluZSB0aGUgc2V0IG9mIHBvc3NpYmx5IG1hdGNoaW5nCisvLyBpbnN0cnVjdGlvbnMsIGFuZCB0aGUgc2ltcGxpZnkgdGhlIGdlbmVyYXRlZCBjb2RlLiBBZGRpdGlvbmFsbHksIHRoaXMgaGVscHMKKy8vIHRvIGVuc3VyZSB0aGF0IHRoZSBhbWJpZ3VpdGllcyBhcmUgaW50ZW50aW9uYWxseSByZXNvbHZlZCBieSB0aGUgdXNlci4KKy8vCisvLyBUaGUgbWF0Y2hpbmcgaXMgZGl2aWRlZCBpbnRvIHR3byBkaXN0aW5jdCBwaGFzZXM6CisvLworLy8gICAxLiBDbGFzc2lmaWNhdGlvbjogRWFjaCBvcGVyYW5kIGlzIG1hcHBlZCB0byB0aGUgdW5pcXVlIHNldCB3aGljaCAoYSkKKy8vICAgICAgY29udGFpbnMgaXQsIGFuZCAoYikgaXMgdGhlIGxhcmdlc3Qgc3VjaCBzdWJzZXQgZm9yIHdoaWNoIGEgc2luZ2xlCisvLyAgICAgIGluc3RydWN0aW9uIGNvdWxkIG1hdGNoIGFsbCBtZW1iZXJzLgorLy8KKy8vICAgICAgRm9yIHJlZ2lzdGVyIGNsYXNzZXMsIHdlIGNhbiBnZW5lcmF0ZSB0aGVzZSBzdWJncm91cHMgYXV0b21hdGljYWxseS4gRm9yCisvLyAgICAgIGFyYml0cmFyeSBvcGVyYW5kcywgd2UgZXhwZWN0IHRoZSB1c2VyIHRvIGRlZmluZSB0aGUgY2xhc3NlcyBhbmQgdGhlaXIKKy8vICAgICAgcmVsYXRpb25zIHRvIG9uZSBhbm90aGVyIChmb3IgZXhhbXBsZSwgOC1iaXQgc2lnbmVkIGltbWVkaWF0ZXMgYXMgYQorLy8gICAgICBzdWJzZXQgb2YgMzItYml0IGltbWVkaWF0ZXMpLgorLy8KKy8vICAgICAgQnkgcGFydGl0aW9uaW5nIHRoZSBvcGVyYW5kcyBpbiB0aGlzIHdheSwgd2UgZ3VhcmFudGVlIHRoYXQgZm9yIGFueQorLy8gICAgICB0dXBsZSBvZiBjbGFzc2VzLCBhbnkgc2luZ2xlIGluc3RydWN0aW9uIG11c3QgbWF0Y2ggZWl0aGVyIGFsbCBvciBub25lCisvLyAgICAgIG9mIHRoZSBzZXRzIG9mIG9wZXJhbmRzIHdoaWNoIGNvdWxkIGNsYXNzaWZ5IHRvIHRoYXQgdHVwbGUuCisvLworLy8gICAgICBJbiBhZGRpdGlvbiwgdGhlIHN1YnNldCByZWxhdGlvbiBhbW9uZ3N0IGNsYXNzZXMgaW5kdWNlcyBhIHBhcnRpYWwgb3JkZXIKKy8vICAgICAgb24gc3VjaCB0dXBsZXMsIHdoaWNoIHdlIHVzZSB0byByZXNvbHZlIGFtYmlndWl0aWVzLgorLy8KKy8vICAgICAgRklYTUU6IFdoYXQgZG8gd2UgZG8gaWYgYSBjcmF6eSBjYXNlIHNob3dzIHVwIHdoZXJlIHRoaXMgaXMgdGhlIHdyb25nCisvLyAgICAgIHJlc29sdXRpb24/CisvLworLy8gICAyLiBUaGUgaW5wdXQgY2FuIG5vdyBiZSB0cmVhdGVkIGFzIGEgdHVwbGUgb2YgY2xhc3NlcyAoc3RhdGljIHRva2VucyBhcmUKKy8vICAgICAgc2ltcGxlIHNpbmdsZXRvbiBzZXRzKS4gRWFjaCBzdWNoIHR1cGxlIHNob3VsZCBnZW5lcmFsbHkgbWFwIHRvIGEgc2luZ2xlCisvLyAgICAgIGluc3RydWN0aW9uICh3ZSBjdXJyZW50bHkgaWdub3JlIGNhc2VzIHdoZXJlIHRoaXMgaXNuJ3QgdHJ1ZSwgd2hlZSEhISksCisvLyAgICAgIHdoaWNoIHdlIGNhbiBlbWl0IGEgc2ltcGxlIG1hdGNoZXIgZm9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJBc21NYXRjaGVyRW1pdHRlci5oIgorI2luY2x1ZGUgIkNvZGVHZW5UYXJnZXQuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KK01hdGNoUHJlZml4KCJtYXRjaC1wcmVmaXgiLCBjbDo6aW5pdCgiIiksCisgICAgICAgICAgICBjbDo6ZGVzYygiT25seSBtYXRjaCBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4IikpOworCisvLy8gRmxhdHRlblZhcmlhbnRzIC0gRmxhdHRlbiBhbiAudGQgZmlsZSBhc3NlbWJseSBzdHJpbmcgYnkgc2VsZWN0aW5nIHRoZQorLy8vIHZhcmlhbnQgYXQgaW5kZXggXGFyZyBOLgorc3RhdGljIHN0ZDo6c3RyaW5nIEZsYXR0ZW5WYXJpYW50cyhjb25zdCBzdGQ6OnN0cmluZyAmQXNtU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOKSB7CisgIFN0cmluZ1JlZiBDdXIgPSBBc21TdHJpbmc7CisgIHN0ZDo6c3RyaW5nIFJlcyA9ICIiOworICAKKyAgZm9yICg7OykgeworICAgIC8vIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHZhcmlhbnQgc3RyaW5nLgorICAgIHNpemVfdCBWYXJpYW50c1N0YXJ0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBlID0gQ3VyLnNpemUoKTsgVmFyaWFudHNTdGFydCAhPSBlOyArK1ZhcmlhbnRzU3RhcnQpCisgICAgICBpZiAoQ3VyW1ZhcmlhbnRzU3RhcnRdID09ICd7JyAmJiAKKyAgICAgICAgICAoVmFyaWFudHNTdGFydCA9PSAwIHx8IChDdXJbVmFyaWFudHNTdGFydC0xXSAhPSAnJCcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJbVmFyaWFudHNTdGFydC0xXSAhPSAnXFwnKSkpCisgICAgICAgIGJyZWFrOworCisgICAgLy8gQWRkIHRoZSBwcmVmaXggdG8gdGhlIHJlc3VsdC4KKyAgICBSZXMgKz0gQ3VyLnNsaWNlKDAsIFZhcmlhbnRzU3RhcnQpOworICAgIGlmIChWYXJpYW50c1N0YXJ0ID09IEN1ci5zaXplKCkpCisgICAgICBicmVhazsKKworICAgICsrVmFyaWFudHNTdGFydDsgLy8gU2tpcCB0aGUgJ3snLgorCisgICAgLy8gU2NhbiB0byB0aGUgZW5kIG9mIHRoZSB2YXJpYW50cyBzdHJpbmcuCisgICAgc2l6ZV90IFZhcmlhbnRzRW5kID0gVmFyaWFudHNTdGFydDsKKyAgICB1bnNpZ25lZCBOZXN0ZWRCcmFjZXMgPSAxOworICAgIGZvciAoc2l6ZV90IGUgPSBDdXIuc2l6ZSgpOyBWYXJpYW50c0VuZCAhPSBlOyArK1ZhcmlhbnRzRW5kKSB7CisgICAgICBpZiAoQ3VyW1ZhcmlhbnRzRW5kXSA9PSAnfScgJiYgQ3VyW1ZhcmlhbnRzRW5kLTFdICE9ICdcXCcpIHsKKyAgICAgICAgaWYgKC0tTmVzdGVkQnJhY2VzID09IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgaWYgKEN1cltWYXJpYW50c0VuZF0gPT0gJ3snKQorICAgICAgICArK05lc3RlZEJyYWNlczsKKyAgICB9CisKKyAgICAvLyBTZWxlY3QgdGhlIE50aCB2YXJpYW50IChvciBlbXB0eSkuCisgICAgU3RyaW5nUmVmIFNlbGVjdGlvbiA9IEN1ci5zbGljZShWYXJpYW50c1N0YXJ0LCBWYXJpYW50c0VuZCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOOyArK2kpCisgICAgICBTZWxlY3Rpb24gPSBTZWxlY3Rpb24uc3BsaXQoJ3wnKS5zZWNvbmQ7CisgICAgUmVzICs9IFNlbGVjdGlvbi5zcGxpdCgnfCcpLmZpcnN0OworCisgICAgYXNzZXJ0KFZhcmlhbnRzRW5kICE9IEN1ci5zaXplKCkgJiYgCisgICAgICAgICAgICJVbnRlcm1pbmF0ZWQgdmFyaWFudHMgaW4gYXNzZW1ibHkgc3RyaW5nISIpOworICAgIEN1ciA9IEN1ci5zdWJzdHIoVmFyaWFudHNFbmQgKyAxKTsKKyAgfSAKKworICByZXR1cm4gUmVzOworfQorCisvLy8gVG9rZW5pemVBc21TdHJpbmcgLSBUb2tlbml6ZSBhIHNpbXBsaWZpZWQgYXNzZW1ibHkgc3RyaW5nLgorc3RhdGljIHZvaWQgVG9rZW5pemVBc21TdHJpbmcoU3RyaW5nUmVmIEFzbVN0cmluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmVG9rZW5zKSB7CisgIHVuc2lnbmVkIFByZXYgPSAwOworICBib29sIEluVG9rID0gdHJ1ZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFzbVN0cmluZy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgc3dpdGNoIChBc21TdHJpbmdbaV0pIHsKKyAgICBjYXNlICdbJzoKKyAgICBjYXNlICddJzoKKyAgICBjYXNlICcqJzoKKyAgICBjYXNlICchJzoKKyAgICBjYXNlICcgJzoKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnLCc6CisgICAgICBpZiAoSW5Ub2spIHsKKyAgICAgICAgVG9rZW5zLnB1c2hfYmFjayhBc21TdHJpbmcuc2xpY2UoUHJldiwgaSkpOworICAgICAgICBJblRvayA9IGZhbHNlOworICAgICAgfQorICAgICAgaWYgKCFpc3NwYWNlKEFzbVN0cmluZ1tpXSkgJiYgQXNtU3RyaW5nW2ldICE9ICcsJykKKyAgICAgICAgVG9rZW5zLnB1c2hfYmFjayhBc21TdHJpbmcuc3Vic3RyKGksIDEpKTsKKyAgICAgIFByZXYgPSBpICsgMTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAnXFwnOgorICAgICAgaWYgKEluVG9rKSB7CisgICAgICAgIFRva2Vucy5wdXNoX2JhY2soQXNtU3RyaW5nLnNsaWNlKFByZXYsIGkpKTsKKyAgICAgICAgSW5Ub2sgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgICsraTsKKyAgICAgIGFzc2VydChpICE9IEFzbVN0cmluZy5zaXplKCkgJiYgIkludmFsaWQgcXVvdGVkIGNoYXJhY3RlciIpOworICAgICAgVG9rZW5zLnB1c2hfYmFjayhBc21TdHJpbmcuc3Vic3RyKGksIDEpKTsKKyAgICAgIFByZXYgPSBpICsgMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnJCc6IHsKKyAgICAgIC8vIElmIHRoaXMgaXNuJ3QgIiR7IiwgdHJlYXQgbGlrZSBhIG5vcm1hbCB0b2tlbi4KKyAgICAgIGlmIChpICsgMSA9PSBBc21TdHJpbmcuc2l6ZSgpIHx8IEFzbVN0cmluZ1tpICsgMV0gIT0gJ3snKSB7CisgICAgICAgIGlmIChJblRvaykgeworICAgICAgICAgIFRva2Vucy5wdXNoX2JhY2soQXNtU3RyaW5nLnNsaWNlKFByZXYsIGkpKTsKKyAgICAgICAgICBJblRvayA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIFByZXYgPSBpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKEluVG9rKSB7CisgICAgICAgIFRva2Vucy5wdXNoX2JhY2soQXNtU3RyaW5nLnNsaWNlKFByZXYsIGkpKTsKKyAgICAgICAgSW5Ub2sgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgU3RyaW5nUmVmOjppdGVyYXRvciBFbmQgPQorICAgICAgICBzdGQ6OmZpbmQoQXNtU3RyaW5nLmJlZ2luKCkgKyBpLCBBc21TdHJpbmcuZW5kKCksICd9Jyk7CisgICAgICBhc3NlcnQoRW5kICE9IEFzbVN0cmluZy5lbmQoKSAmJiAiTWlzc2luZyBicmFjZSBpbiBvcGVyYW5kIHJlZmVyZW5jZSEiKTsKKyAgICAgIHNpemVfdCBFbmRQb3MgPSBFbmQgLSBBc21TdHJpbmcuYmVnaW4oKTsKKyAgICAgIFRva2Vucy5wdXNoX2JhY2soQXNtU3RyaW5nLnNsaWNlKGksIEVuZFBvcysxKSk7CisgICAgICBQcmV2ID0gRW5kUG9zICsgMTsKKyAgICAgIGkgPSBFbmRQb3M7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgSW5Ub2sgPSB0cnVlOworICAgIH0KKyAgfQorICBpZiAoSW5Ub2sgJiYgUHJldiAhPSBBc21TdHJpbmcuc2l6ZSgpKQorICAgIFRva2Vucy5wdXNoX2JhY2soQXNtU3RyaW5nLnN1YnN0cihQcmV2KSk7Cit9CisKK3N0YXRpYyBib29sIElzQXNzZW1ibGVySW5zdHJ1Y3Rpb24oU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmQ0dJLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJlRva2VucykgeworICAvLyBJZ25vcmUgImNvZGVnZW4gb25seSIgaW5zdHJ1Y3Rpb25zLgorICBpZiAoQ0dJLlRoZURlZi0+Z2V0VmFsdWVBc0JpdCgiaXNDb2RlR2VuT25seSIpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZ25vcmUgcHNldWRvIG9wcy4KKyAgLy8KKyAgLy8gRklYTUU6IFRoaXMgaXMgYSBoYWNrOyBjYW4gd2UgY29udmVydCB0aGVzZSBpbnN0cnVjdGlvbnMgdG8gc2V0IHRoZQorICAvLyAiY29kZWdlbiBvbmx5IiBiaXQgaW5zdGVhZD8KKyAgaWYgKGNvbnN0IFJlY29yZFZhbCAqRm9ybSA9IENHSS5UaGVEZWYtPmdldFZhbHVlKCJGb3JtIikpCisgICAgaWYgKEZvcm0tPmdldFZhbHVlKCktPmdldEFzU3RyaW5nKCkgPT0gIlBzZXVkbyIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWdub3JlICJJbnRfKiIgYW5kICIqX0ludCIgaW5zdHJ1Y3Rpb25zLCB3aGljaCBhcmUgaW50ZXJuYWwgYWxpYXNlcy4KKyAgLy8KKyAgLy8gRklYTUU6IFRoaXMgaXMgYSB0b3RhbCBoYWNrLgorICBpZiAoU3RyaW5nUmVmKE5hbWUpLnN0YXJ0c3dpdGgoIkludF8iKSB8fCBTdHJpbmdSZWYoTmFtZSkuZW5kc3dpdGgoIl9JbnQiKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWdub3JlIGluc3RydWN0aW9ucyB3aXRoIG5vIC5zIHN0cmluZy4KKyAgLy8KKyAgLy8gRklYTUU6IFdoYXQgYXJlIHRoZXNlPworICBpZiAoQ0dJLkFzbVN0cmluZy5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBGSVhNRTogSGFjazsgaWdub3JlIGFueSBpbnN0cnVjdGlvbnMgd2l0aCBhIG5ld2xpbmUgaW4gdGhlbS4KKyAgaWYgKHN0ZDo6ZmluZChDR0kuQXNtU3RyaW5nLmJlZ2luKCksIAorICAgICAgICAgICAgICAgIENHSS5Bc21TdHJpbmcuZW5kKCksICdcbicpICE9IENHSS5Bc21TdHJpbmcuZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gSWdub3JlIGluc3RydWN0aW9ucyB3aXRoIGF0dHJpYnV0ZXMsIHRoZXNlIGFyZSBhbHdheXMgZmFrZSBpbnN0cnVjdGlvbnMgZm9yCisgIC8vIHNpbXBsaWZ5aW5nIGNvZGVnZW4uCisgIC8vCisgIC8vIEZJWE1FOiBJcyB0aGlzIHRydWU/CisgIC8vCisgIC8vIEFsc28sIGNoZWNrIGZvciBpbnN0cnVjdGlvbnMgd2hpY2ggcmVmZXJlbmNlIHRoZSBvcGVyYW5kIG11bHRpcGxlIHRpbWVzOworICAvLyB0aGlzIGltcGxpZXMgYSBjb25zdHJhaW50IHdlIHdvdWxkIG5vdCBob25vci4KKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IE9wZXJhbmROYW1lczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IFRva2Vucy5zaXplKCk7IGkgPCBlOyArK2kpIHsKKyAgICBpZiAoVG9rZW5zW2ldWzBdID09ICckJyAmJiAKKyAgICAgICAgc3RkOjpmaW5kKFRva2Vuc1tpXS5iZWdpbigpLCAKKyAgICAgICAgICAgICAgICAgIFRva2Vuc1tpXS5lbmQoKSwgJzonKSAhPSBUb2tlbnNbaV0uZW5kKCkpIHsKKyAgICAgIERFQlVHKHsKKyAgICAgICAgICBlcnJzKCkgPDwgIndhcm5pbmc6ICciIDw8IE5hbWUgPDwgIic6ICIKKyAgICAgICAgICAgICAgICAgPDwgImlnbm9yaW5nIGluc3RydWN0aW9uOyBvcGVyYW5kIHdpdGggYXR0cmlidXRlICciIAorICAgICAgICAgICAgICAgICA8PCBUb2tlbnNbaV0gPDwgIidcbiI7CisgICAgICAgIH0pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChUb2tlbnNbaV1bMF0gPT0gJyQnICYmICFPcGVyYW5kTmFtZXMuaW5zZXJ0KFRva2Vuc1tpXSkuc2Vjb25kKSB7CisgICAgICBzdGQ6OnN0cmluZyBFcnIgPSAiJyIgKyBOYW1lLnN0cigpICsgIic6ICIgKworICAgICAgICAiaW52YWxpZCBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb247IHRpZWQgb3BlcmFuZCAnIiArIFRva2Vuc1tpXS5zdHIoKSArICInIjsKKyAgICAgIHRocm93IFRHRXJyb3IoQ0dJLlRoZURlZi0+Z2V0TG9jKCksIEVycik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBTdWJ0YXJnZXRGZWF0dXJlSW5mbzsKKworLy8vIENsYXNzSW5mbyAtIEhlbHBlciBjbGFzcyBmb3Igc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyCisvLy8gY2xhc3Mgb2Ygb3BlcmFuZHMgd2hpY2ggY2FuIGJlIG1hdGNoZWQuCitzdHJ1Y3QgQ2xhc3NJbmZvIHsKKyAgZW51bSBDbGFzc0luZm9LaW5kIHsKKyAgICAvLy8gSW52YWxpZCBraW5kLCBmb3IgdXNlIGFzIGEgc2VudGluZWwgdmFsdWUuCisgICAgSW52YWxpZCA9IDAsCisKKyAgICAvLy8gVGhlIGNsYXNzIGZvciBhIHBhcnRpY3VsYXIgdG9rZW4uCisgICAgVG9rZW4sCisKKyAgICAvLy8gVGhlIChmaXJzdCkgcmVnaXN0ZXIgY2xhc3MsIHN1YnNlcXVlbnQgcmVnaXN0ZXIgY2xhc3NlcyBhcmUKKyAgICAvLy8gUmVnaXN0ZXJDbGFzczArMSwgYW5kIHNvIG9uLgorICAgIFJlZ2lzdGVyQ2xhc3MwLAorCisgICAgLy8vIFRoZSAoZmlyc3QpIHVzZXIgZGVmaW5lZCBjbGFzcywgc3Vic2VxdWVudCB1c2VyIGRlZmluZWQgY2xhc3NlcyBhcmUKKyAgICAvLy8gVXNlckNsYXNzMCsxLCBhbmQgc28gb24uCisgICAgVXNlckNsYXNzMCA9IDE8PDE2CisgIH07CisKKyAgLy8vIEtpbmQgLSBUaGUgY2xhc3Mga2luZCwgd2hpY2ggaXMgZWl0aGVyIGEgcHJlZGVmaW5lZCBraW5kLCBvciAoVXNlckNsYXNzMCArCisgIC8vLyBOKSBmb3IgdGhlIE50aCB1c2VyIGRlZmluZWQgY2xhc3MuCisgIHVuc2lnbmVkIEtpbmQ7CisKKyAgLy8vIFN1cGVyQ2xhc3NlcyAtIFRoZSBzdXBlciBjbGFzc2VzIG9mIHRoaXMgY2xhc3MuIE5vdGUgdGhhdCBmb3Igc2ltcGxpY2l0aWVzCisgIC8vLyBzYWtlIHVzZXIgb3BlcmFuZHMgb25seSByZWNvcmQgdGhlaXIgaW1tZWRpYXRlIHN1cGVyIGNsYXNzLCB3aGlsZSByZWdpc3RlcgorICAvLy8gb3BlcmFuZHMgaW5jbHVkZSBhbGwgc3VwZXJjbGFzc2VzLgorICBzdGQ6OnZlY3RvcjxDbGFzc0luZm8qPiBTdXBlckNsYXNzZXM7CisKKyAgLy8vIE5hbWUgLSBUaGUgZnVsbCBjbGFzcyBuYW1lLCBzdWl0YWJsZSBmb3IgdXNlIGluIGFuIGVudW0uCisgIHN0ZDo6c3RyaW5nIE5hbWU7CisKKyAgLy8vIENsYXNzTmFtZSAtIFRoZSB1bmFkb3JuZWQgZ2VuZXJpYyBuYW1lIGZvciB0aGlzIGNsYXNzIChlLmcuLCBUb2tlbikuCisgIHN0ZDo6c3RyaW5nIENsYXNzTmFtZTsKKworICAvLy8gVmFsdWVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhbHVlIHRoaXMgY2xhc3MgcmVwcmVzZW50czsgZm9yIGEgdG9rZW4gdGhpcworICAvLy8gaXMgdGhlIGxpdGVyYWwgdG9rZW4gc3RyaW5nLCBmb3IgYW4gb3BlcmFuZCBpdCBpcyB0aGUgVGFibGVHZW4gY2xhc3MgKG9yCisgIC8vLyBlbXB0eSBpZiB0aGlzIGlzIGEgZGVyaXZlZCBjbGFzcykuCisgIHN0ZDo6c3RyaW5nIFZhbHVlTmFtZTsKKworICAvLy8gUHJlZGljYXRlTWV0aG9kIC0gVGhlIG5hbWUgb2YgdGhlIG9wZXJhbmQgbWV0aG9kIHRvIHRlc3Qgd2hldGhlciB0aGUKKyAgLy8vIG9wZXJhbmQgbWF0Y2hlcyB0aGlzIGNsYXNzOyB0aGlzIGlzIG5vdCB2YWxpZCBmb3IgVG9rZW4gb3IgcmVnaXN0ZXIga2luZHMuCisgIHN0ZDo6c3RyaW5nIFByZWRpY2F0ZU1ldGhvZDsKKworICAvLy8gUmVuZGVyTWV0aG9kIC0gVGhlIG5hbWUgb2YgdGhlIG9wZXJhbmQgbWV0aG9kIHRvIGFkZCB0aGlzIG9wZXJhbmQgdG8gYW4KKyAgLy8vIE1DSW5zdDsgdGhpcyBpcyBub3QgdmFsaWQgZm9yIFRva2VuIG9yIHJlZ2lzdGVyIGtpbmRzLgorICBzdGQ6OnN0cmluZyBSZW5kZXJNZXRob2Q7CisKKyAgLy8vIEZvciByZWdpc3RlciBjbGFzc2VzLCB0aGUgcmVjb3JkcyBmb3IgYWxsIHRoZSByZWdpc3RlcnMgaW4gdGhpcyBjbGFzcy4KKyAgc3RkOjpzZXQ8UmVjb3JkKj4gUmVnaXN0ZXJzOworCitwdWJsaWM6CisgIC8vLyBpc1JlZ2lzdGVyQ2xhc3MoKSAtIENoZWNrIGlmIHRoaXMgaXMgYSByZWdpc3RlciBjbGFzcy4KKyAgYm9vbCBpc1JlZ2lzdGVyQ2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEtpbmQgPj0gUmVnaXN0ZXJDbGFzczAgJiYgS2luZCA8IFVzZXJDbGFzczA7CisgIH0KKworICAvLy8gaXNVc2VyQ2xhc3MoKSAtIENoZWNrIGlmIHRoaXMgaXMgYSB1c2VyIGRlZmluZWQgY2xhc3MuCisgIGJvb2wgaXNVc2VyQ2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEtpbmQgPj0gVXNlckNsYXNzMDsKKyAgfQorCisgIC8vLyBpc1JlbGF0ZWRUbyAtIENoZWNrIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyAicmVsYXRlZCIgdG8gXGFyZyBSSFMuIENsYXNzZXMKKyAgLy8vIGFyZSByZWxhdGVkIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGNsYXNzIGhpZXJhcmNoeS4KKyAgYm9vbCBpc1JlbGF0ZWRUbyhjb25zdCBDbGFzc0luZm8gJlJIUykgY29uc3QgeworICAgIC8vIFRva2VucyBhcmUgb25seSByZWxhdGVkIHRvIHRva2Vucy4KKyAgICBpZiAoS2luZCA9PSBUb2tlbiB8fCBSSFMuS2luZCA9PSBUb2tlbikKKyAgICAgIHJldHVybiBLaW5kID09IFRva2VuICYmIFJIUy5LaW5kID09IFRva2VuOworCisgICAgLy8gUmVnaXN0ZXJzIGNsYXNzZXMgYXJlIG9ubHkgcmVsYXRlZCB0byByZWdpc3RlcnMgY2xhc3NlcywgYW5kIG9ubHkgaWYKKyAgICAvLyB0aGVpciBpbnRlcnNlY3Rpb24gaXMgbm9uLWVtcHR5LgorICAgIGlmIChpc1JlZ2lzdGVyQ2xhc3MoKSB8fCBSSFMuaXNSZWdpc3RlckNsYXNzKCkpIHsKKyAgICAgIGlmICghaXNSZWdpc3RlckNsYXNzKCkgfHwgIVJIUy5pc1JlZ2lzdGVyQ2xhc3MoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBzdGQ6OnNldDxSZWNvcmQqPiBUbXA7CisgICAgICBzdGQ6Omluc2VydF9pdGVyYXRvcjwgc3RkOjpzZXQ8UmVjb3JkKj4gPiBJSShUbXAsIFRtcC5iZWdpbigpKTsKKyAgICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihSZWdpc3RlcnMuYmVnaW4oKSwgUmVnaXN0ZXJzLmVuZCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMuUmVnaXN0ZXJzLmJlZ2luKCksIFJIUy5SZWdpc3RlcnMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUkpOworCisgICAgICByZXR1cm4gIVRtcC5lbXB0eSgpOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSB3ZSBoYXZlIHR3byB1c2VycyBvcGVyYW5kczsgdGhleSBhcmUgcmVsYXRlZCBpZiB0aGV5IGFyZSBpbiB0aGUKKyAgICAvLyBzYW1lIGNsYXNzIGhpZXJhcmNoeS4KKyAgICAvLworICAgIC8vIEZJWE1FOiBUaGlzIGlzIGFuIG92ZXJzaW1wbGlmaWNhdGlvbiwgdGhleSBzaG91bGQgb25seSBiZSByZWxhdGVkIGlmIHRoZXkKKyAgICAvLyBpbnRlcnNlY3QsIGhvd2V2ZXIgd2UgZG9uJ3QgaGF2ZSB0aGF0IGluZm9ybWF0aW9uLgorICAgIGFzc2VydChpc1VzZXJDbGFzcygpICYmIFJIUy5pc1VzZXJDbGFzcygpICYmICJVbmV4cGVjdGVkIGNsYXNzISIpOworICAgIGNvbnN0IENsYXNzSW5mbyAqUm9vdCA9IHRoaXM7CisgICAgd2hpbGUgKCFSb290LT5TdXBlckNsYXNzZXMuZW1wdHkoKSkKKyAgICAgIFJvb3QgPSBSb290LT5TdXBlckNsYXNzZXMuZnJvbnQoKTsKKworICAgIGNvbnN0IENsYXNzSW5mbyAqUkhTUm9vdCA9ICZSSFM7CisgICAgd2hpbGUgKCFSSFNSb290LT5TdXBlckNsYXNzZXMuZW1wdHkoKSkKKyAgICAgIFJIU1Jvb3QgPSBSSFNSb290LT5TdXBlckNsYXNzZXMuZnJvbnQoKTsKKyAgICAKKyAgICByZXR1cm4gUm9vdCA9PSBSSFNSb290OworICB9CisKKyAgLy8vIGlzU3Vic2V0T2YgLSBUZXN0IHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBhIHN1YnNldCBvZiBcYXJnIFJIUzsgCisgIGJvb2wgaXNTdWJzZXRPZihjb25zdCBDbGFzc0luZm8gJlJIUykgY29uc3QgeworICAgIC8vIFRoaXMgaXMgYSBzdWJzZXQgb2YgUkhTIGlmIGl0IGlzIHRoZSBzYW1lIGNsYXNzLi4uCisgICAgaWYgKHRoaXMgPT0gJlJIUykKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gLi4uIG9yIGlmIGFueSBvZiBpdHMgc3VwZXIgY2xhc3NlcyBhcmUgYSBzdWJzZXQgb2YgUkhTLgorICAgIGZvciAoc3RkOjp2ZWN0b3I8Q2xhc3NJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gU3VwZXJDbGFzc2VzLmJlZ2luKCksCisgICAgICAgICAgIGllID0gU3VwZXJDbGFzc2VzLmVuZCgpOyBpdCAhPSBpZTsgKytpdCkKKyAgICAgIGlmICgoKml0KS0+aXNTdWJzZXRPZihSSFMpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBvcGVyYXRvcjwgLSBDb21wYXJlIHR3byBjbGFzc2VzLgorICBib29sIG9wZXJhdG9yPChjb25zdCBDbGFzc0luZm8gJlJIUykgY29uc3QgeworICAgIGlmICh0aGlzID09ICZSSFMpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBVbnJlbGF0ZWQgY2xhc3NlcyBjYW4gYmUgb3JkZXJlZCBieSBraW5kLgorICAgIGlmICghaXNSZWxhdGVkVG8oUkhTKSkKKyAgICAgIHJldHVybiBLaW5kIDwgUkhTLktpbmQ7CisKKyAgICBzd2l0Y2ggKEtpbmQpIHsKKyAgICBjYXNlIEludmFsaWQ6CisgICAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBraW5kISIpOworICAgIGNhc2UgVG9rZW46CisgICAgICAvLyBUb2tlbnMgYXJlIGNvbXBhcmFibGUgYnkgdmFsdWUuCisgICAgICAvLworICAgICAgLy8gRklYTUU6IENvbXBhcmUgYnkgZW51bSB2YWx1ZS4KKyAgICAgIHJldHVybiBWYWx1ZU5hbWUgPCBSSFMuVmFsdWVOYW1lOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8vIFRoaXMgY2xhc3MgcHJlY2VlZHMgdGhlIFJIUyBpZiBpdCBpcyBhIHByb3BlciBzdWJzZXQgb2YgdGhlIFJIUy4KKyAgICAgIGlmIChpc1N1YnNldE9mKFJIUykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKFJIUy5pc1N1YnNldE9mKCp0aGlzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBPdGhlcndpc2UsIG9yZGVyIGJ5IG5hbWUgdG8gZW5zdXJlIHdlIGhhdmUgYSB0b3RhbCBvcmRlcmluZy4KKyAgICAgIHJldHVybiBWYWx1ZU5hbWUgPCBSSFMuVmFsdWVOYW1lOworICAgIH0KKyAgfQorfTsKKworLy8vIEluc3RydWN0aW9uSW5mbyAtIEhlbHBlciBjbGFzcyBmb3Igc3RvcmluZyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBhbgorLy8vIGluc3RydWN0aW9uIHdoaWNoIGlzIGNhcGFibGUgb2YgYmVpbmcgbWF0Y2hlZC4KK3N0cnVjdCBJbnN0cnVjdGlvbkluZm8geworICBzdHJ1Y3QgT3BlcmFuZCB7CisgICAgLy8vIFRoZSB1bmlxdWUgY2xhc3MgaW5zdGFuY2UgdGhpcyBvcGVyYW5kIHNob3VsZCBtYXRjaC4KKyAgICBDbGFzc0luZm8gKkNsYXNzOworCisgICAgLy8vIFRoZSBvcmlnaW5hbCBvcGVyYW5kIHRoaXMgY29ycmVzcG9uZHMgdG8sIGlmIGFueS4KKyAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb246Ok9wZXJhbmRJbmZvICpPcGVyYW5kSW5mbzsKKyAgfTsKKworICAvLy8gSW5zdHJOYW1lIC0gVGhlIHRhcmdldCBuYW1lIGZvciB0aGlzIGluc3RydWN0aW9uLgorICBzdGQ6OnN0cmluZyBJbnN0ck5hbWU7CisKKyAgLy8vIEluc3RyIC0gVGhlIGluc3RydWN0aW9uIHRoaXMgbWF0Y2hlcy4KKyAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uICpJbnN0cjsKKworICAvLy8gQXNtU3RyaW5nIC0gVGhlIGFzc2VtYmx5IHN0cmluZyBmb3IgdGhpcyBpbnN0cnVjdGlvbiAod2l0aCB2YXJpYW50cworICAvLy8gcmVtb3ZlZCkuCisgIHN0ZDo6c3RyaW5nIEFzbVN0cmluZzsKKworICAvLy8gVG9rZW5zIC0gVGhlIHRva2VuaXplZCBhc3NlbWJseSBwYXR0ZXJuIHRoYXQgdGhpcyBpbnN0cnVjdGlvbiBtYXRjaGVzLgorICBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDQ+IFRva2VuczsKKworICAvLy8gT3BlcmFuZHMgLSBUaGUgb3BlcmFuZHMgdGhhdCB0aGlzIGluc3RydWN0aW9uIG1hdGNoZXMuCisgIFNtYWxsVmVjdG9yPE9wZXJhbmQsIDQ+IE9wZXJhbmRzOworCisgIC8vLyBQcmVkaWNhdGVzIC0gVGhlIHJlcXVpcmVkIHN1YnRhcmdldCBmZWF0dXJlcyB0byBtYXRjaCB0aGlzIGluc3RydWN0aW9uLgorICBTbWFsbFZlY3RvcjxTdWJ0YXJnZXRGZWF0dXJlSW5mbyosIDQ+IFJlcXVpcmVkRmVhdHVyZXM7CisKKyAgLy8vIENvbnZlcnNpb25GbktpbmQgLSBUaGUgZW51bSB2YWx1ZSB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGdlbmVyYXRlZAorICAvLy8gQ29udmVydFRvTUNJbnN0IHRvIGNvbnZlcnQgcGFyc2VkIG9wZXJhbmRzIGludG8gYW4gTUNJbnN0IGZvciB0aGlzCisgIC8vLyBmdW5jdGlvbi4KKyAgc3RkOjpzdHJpbmcgQ29udmVyc2lvbkZuS2luZDsKKworICAvLy8gb3BlcmF0b3I8IC0gQ29tcGFyZSB0d28gaW5zdHJ1Y3Rpb25zLgorICBib29sIG9wZXJhdG9yPChjb25zdCBJbnN0cnVjdGlvbkluZm8gJlJIUykgY29uc3QgeworICAgIGlmIChPcGVyYW5kcy5zaXplKCkgIT0gUkhTLk9wZXJhbmRzLnNpemUoKSkKKyAgICAgIHJldHVybiBPcGVyYW5kcy5zaXplKCkgPCBSSFMuT3BlcmFuZHMuc2l6ZSgpOworCisgICAgLy8gQ29tcGFyZSBsZXhpY29ncmFwaGljYWxseSBieSBvcGVyYW5kLiBUaGUgbWF0Y2hlciB2YWxpZGF0ZXMgdGhhdCBvdGhlcgorICAgIC8vIG9yZGVyaW5ncyB3b3VsZG4ndCBiZSBhbWJpZ3VvdXMgdXNpbmcgXHNlZSBDb3VsZE1hdGNoQW1pZ3VvdXNseVdpdGgoKS4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKCpPcGVyYW5kc1tpXS5DbGFzcyA8ICpSSFMuT3BlcmFuZHNbaV0uQ2xhc3MpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKCpSSFMuT3BlcmFuZHNbaV0uQ2xhc3MgPCAqT3BlcmFuZHNbaV0uQ2xhc3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gQ291bGRNYXRjaEFtaWd1b3VzbHlXaXRoIC0gQ2hlY2sgd2hldGhlciB0aGlzIGluc3RydWN0aW9uIGNvdWxkCisgIC8vLyBhbWJpZ3VvdXNseSBtYXRjaCB0aGUgc2FtZSBzZXQgb2Ygb3BlcmFuZHMgYXMgXGFyZyBSSFMgKHdpdGhvdXQgYmVpbmcgYQorICAvLy8gc3RyaWN0bHkgc3VwZXJpb3IgbWF0Y2gpLgorICBib29sIENvdWxkTWF0Y2hBbWlndW91c2x5V2l0aChjb25zdCBJbnN0cnVjdGlvbkluZm8gJlJIUykgeworICAgIC8vIFRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgaXMgdW5hbWJpZ3VvdXMuCisgICAgaWYgKE9wZXJhbmRzLnNpemUoKSAhPSBSSFMuT3BlcmFuZHMuc2l6ZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHN1cmUgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28gaW5zdHJ1Y3Rpb25zIGlzIHVuYW1iaWd1b3VzCisgICAgLy8gYnkgY2hlY2tpbmcgdGhhdCBlaXRoZXIgKGEpIGEgdG9rZW4gb3Igb3BlcmFuZCBraW5kIGRpc2NyaW1pbmF0ZXMgdGhlbSwKKyAgICAvLyBvciAoYikgdGhlIG9yZGVyaW5nIGFtb25nIGVxdWl2YWxlbnQga2luZHMgaXMgY29uc2lzdGVudC4KKworICAgIC8vIFRva2VucyBhbmQgb3BlcmFuZCBraW5kcyBhcmUgdW5hbWJpZ3VvdXMgKGFzc3VtaW5nIGEgY29ycmVjdCB0YXJnZXQKKyAgICAvLyBzcGVjaWZpYyBwYXJzZXIpLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKE9wZXJhbmRzW2ldLkNsYXNzLT5LaW5kICE9IFJIUy5PcGVyYW5kc1tpXS5DbGFzcy0+S2luZCB8fAorICAgICAgICAgIE9wZXJhbmRzW2ldLkNsYXNzLT5LaW5kID09IENsYXNzSW5mbzo6VG9rZW4pCisgICAgICAgIGlmICgqT3BlcmFuZHNbaV0uQ2xhc3MgPCAqUkhTLk9wZXJhbmRzW2ldLkNsYXNzIHx8CisgICAgICAgICAgICAqUkhTLk9wZXJhbmRzW2ldLkNsYXNzIDwgKk9wZXJhbmRzW2ldLkNsYXNzKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIHRoaXMgb3BlcmFuZCBjb3VsZCBjb21tdXRlIGlmIGFsbCBvcGVyYW5kcyBhcmUgZXF1aXZhbGVudCwgb3IKKyAgICAvLyB0aGVyZSBpcyBhIHBhaXIgb2Ygb3BlcmFuZHMgdGhhdCBjb21wYXJlIGxlc3MgdGhhbiBhbmQgYSBwYWlyIHRoYXQKKyAgICAvLyBjb21wYXJlIGdyZWF0ZXIgdGhhbi4KKyAgICBib29sIEhhc0xUID0gZmFsc2UsIEhhc0dUID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmICgqT3BlcmFuZHNbaV0uQ2xhc3MgPCAqUkhTLk9wZXJhbmRzW2ldLkNsYXNzKQorICAgICAgICBIYXNMVCA9IHRydWU7CisgICAgICBpZiAoKlJIUy5PcGVyYW5kc1tpXS5DbGFzcyA8ICpPcGVyYW5kc1tpXS5DbGFzcykKKyAgICAgICAgSGFzR1QgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiAhKEhhc0xUIF4gSGFzR1QpOworICB9CisKK3B1YmxpYzoKKyAgdm9pZCBkdW1wKCk7Cit9OworCisvLy8gU3VidGFyZ2V0RmVhdHVyZUluZm8gLSBIZWxwZXIgY2xhc3MgZm9yIHN0b3JpbmcgaW5mb3JtYXRpb24gb24gYSBzdWJ0YXJnZXQKKy8vLyBmZWF0dXJlIHdoaWNoIHBhcnRpY2lwYXRlcyBpbiBpbnN0cnVjdGlvbiBtYXRjaGluZy4KK3N0cnVjdCBTdWJ0YXJnZXRGZWF0dXJlSW5mbyB7CisgIC8vLyBcYnJpZWYgVGhlIHByZWRpY2F0ZSByZWNvcmQgZm9yIHRoaXMgZmVhdHVyZS4KKyAgUmVjb3JkICpUaGVEZWY7CisKKyAgLy8vIFxicmllZiBBbiB1bmlxdWUgaW5kZXggYXNzaWduZWQgdG8gcmVwcmVzZW50IHRoaXMgZmVhdHVyZS4KKyAgdW5zaWduZWQgSW5kZXg7CisKKyAgLy8vIFxicmllZiBUaGUgbmFtZSBvZiB0aGUgZW51bWVyYXRlZCBjb25zdGFudCBpZGVudGlmeWluZyB0aGlzIGZlYXR1cmUuCisgIHN0ZDo6c3RyaW5nIEVudW1OYW1lOworfTsKKworY2xhc3MgQXNtTWF0Y2hlckluZm8geworcHVibGljOgorICAvLy8gVGhlIHRhYmxlZ2VuIEFzbVBhcnNlciByZWNvcmQuCisgIFJlY29yZCAqQXNtUGFyc2VyOworCisgIC8vLyBUaGUgQXNtUGFyc2VyICJDb21tZW50RGVsaW1pdGVyIiB2YWx1ZS4KKyAgc3RkOjpzdHJpbmcgQ29tbWVudERlbGltaXRlcjsKKworICAvLy8gVGhlIEFzbVBhcnNlciAiUmVnaXN0ZXJQcmVmaXgiIHZhbHVlLgorICBzdGQ6OnN0cmluZyBSZWdpc3RlclByZWZpeDsKKworICAvLy8gVGhlIGNsYXNzZXMgd2hpY2ggYXJlIG5lZWRlZCBmb3IgbWF0Y2hpbmcuCisgIHN0ZDo6dmVjdG9yPENsYXNzSW5mbyo+IENsYXNzZXM7CisgIAorICAvLy8gVGhlIGluZm9ybWF0aW9uIG9uIHRoZSBpbnN0cnVjdGlvbiB0byBtYXRjaC4KKyAgc3RkOjp2ZWN0b3I8SW5zdHJ1Y3Rpb25JbmZvKj4gSW5zdHJ1Y3Rpb25zOworCisgIC8vLyBNYXAgb2YgUmVnaXN0ZXIgcmVjb3JkcyB0byB0aGVpciBjbGFzcyBpbmZvcm1hdGlvbi4KKyAgc3RkOjptYXA8UmVjb3JkKiwgQ2xhc3NJbmZvKj4gUmVnaXN0ZXJDbGFzc2VzOworCisgIC8vLyBNYXAgb2YgUHJlZGljYXRlIHJlY29yZHMgdG8gdGhlaXIgc3VidGFyZ2V0IGluZm9ybWF0aW9uLgorICBzdGQ6Om1hcDxSZWNvcmQqLCBTdWJ0YXJnZXRGZWF0dXJlSW5mbyo+IFN1YnRhcmdldEZlYXR1cmVzOworCitwcml2YXRlOgorICAvLy8gTWFwIG9mIHRva2VuIHRvIGNsYXNzIGluZm9ybWF0aW9uIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gY29uc3RydWN0ZWQuCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDbGFzc0luZm8qPiBUb2tlbkNsYXNzZXM7CisKKyAgLy8vIE1hcCBvZiBSZWdpc3RlckNsYXNzIHJlY29yZHMgdG8gdGhlaXIgY2xhc3MgaW5mb3JtYXRpb24uCisgIHN0ZDo6bWFwPFJlY29yZCosIENsYXNzSW5mbyo+IFJlZ2lzdGVyQ2xhc3NDbGFzc2VzOworCisgIC8vLyBNYXAgb2YgQXNtT3BlcmFuZENsYXNzIHJlY29yZHMgdG8gdGhlaXIgY2xhc3MgaW5mb3JtYXRpb24uCisgIHN0ZDo6bWFwPFJlY29yZCosIENsYXNzSW5mbyo+IEFzbU9wZXJhbmRDbGFzc2VzOworCitwcml2YXRlOgorICAvLy8gZ2V0VG9rZW5DbGFzcyAtIExvb2t1cCBvciBjcmVhdGUgdGhlIGNsYXNzIGZvciB0aGUgZ2l2ZW4gdG9rZW4uCisgIENsYXNzSW5mbyAqZ2V0VG9rZW5DbGFzcyhTdHJpbmdSZWYgVG9rZW4pOworCisgIC8vLyBnZXRPcGVyYW5kQ2xhc3MgLSBMb29rdXAgb3IgY3JlYXRlIHRoZSBjbGFzcyBmb3IgdGhlIGdpdmVuIG9wZXJhbmQuCisgIENsYXNzSW5mbyAqZ2V0T3BlcmFuZENsYXNzKFN0cmluZ1JlZiBUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uOjpPcGVyYW5kSW5mbyAmT0kpOworCisgIC8vLyBnZXRTdWJ0YXJnZXRGZWF0dXJlIC0gTG9va3VwIG9yIGNyZWF0ZSB0aGUgc3VidGFyZ2V0IGZlYXR1cmUgaW5mbyBmb3IgdGhlCisgIC8vLyBnaXZlbiBvcGVyYW5kLgorICBTdWJ0YXJnZXRGZWF0dXJlSW5mbyAqZ2V0U3VidGFyZ2V0RmVhdHVyZShSZWNvcmQgKkRlZikgeworICAgIGFzc2VydChEZWYtPmlzU3ViQ2xhc3NPZigiUHJlZGljYXRlIikgJiYgIkludmFsaWQgcHJlZGljYXRlIHR5cGUhIik7CisKKyAgICBTdWJ0YXJnZXRGZWF0dXJlSW5mbyAqJkVudHJ5ID0gU3VidGFyZ2V0RmVhdHVyZXNbRGVmXTsKKyAgICBpZiAoIUVudHJ5KSB7CisgICAgICBFbnRyeSA9IG5ldyBTdWJ0YXJnZXRGZWF0dXJlSW5mbzsKKyAgICAgIEVudHJ5LT5UaGVEZWYgPSBEZWY7CisgICAgICBFbnRyeS0+SW5kZXggPSBTdWJ0YXJnZXRGZWF0dXJlcy5zaXplKCkgLSAxOworICAgICAgRW50cnktPkVudW1OYW1lID0gIkZlYXR1cmVfIiArIERlZi0+Z2V0TmFtZSgpOworICAgICAgYXNzZXJ0KEVudHJ5LT5JbmRleCA8IDMyICYmICJUb28gbWFueSBzdWJ0YXJnZXQgZmVhdHVyZXMhIik7CisgICAgfQorCisgICAgcmV0dXJuIEVudHJ5OworICB9CisKKyAgLy8vIEJ1aWxkUmVnaXN0ZXJDbGFzc2VzIC0gQnVpbGQgdGhlIENsYXNzSW5mbyogaW5zdGFuY2VzIGZvciByZWdpc3RlcgorICAvLy8gY2xhc3Nlcy4KKyAgdm9pZCBCdWlsZFJlZ2lzdGVyQ2xhc3NlcyhDb2RlR2VuVGFyZ2V0ICZUYXJnZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiAmU2luZ2xldG9uUmVnaXN0ZXJOYW1lcyk7CisKKyAgLy8vIEJ1aWxkT3BlcmFuZENsYXNzZXMgLSBCdWlsZCB0aGUgQ2xhc3NJbmZvKiBpbnN0YW5jZXMgZm9yIHVzZXIgZGVmaW5lZAorICAvLy8gb3BlcmFuZCBjbGFzc2VzLgorICB2b2lkIEJ1aWxkT3BlcmFuZENsYXNzZXMoQ29kZUdlblRhcmdldCAmVGFyZ2V0KTsKKworcHVibGljOgorICBBc21NYXRjaGVySW5mbyhSZWNvcmQgKl9Bc21QYXJzZXIpOworCisgIC8vLyBCdWlsZEluZm8gLSBDb25zdHJ1Y3QgdGhlIHZhcmlvdXMgdGFibGVzIHVzZWQgZHVyaW5nIG1hdGNoaW5nLgorICB2b2lkIEJ1aWxkSW5mbyhDb2RlR2VuVGFyZ2V0ICZUYXJnZXQpOworfTsKKworfQorCit2b2lkIEluc3RydWN0aW9uSW5mbzo6ZHVtcCgpIHsKKyAgZXJycygpIDw8IEluc3RyTmFtZSA8PCAiIC0tICIgPDwgImZsYXR0ZW5lZDpcIiIgPDwgQXNtU3RyaW5nIDw8ICdcIicKKyAgICAgICAgIDw8ICIsIHRva2VuczpbIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRva2Vucy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgZXJycygpIDw8IFRva2Vuc1tpXTsKKyAgICBpZiAoaSArIDEgIT0gZSkKKyAgICAgIGVycnMoKSA8PCAiLCAiOworICB9CisgIGVycnMoKSA8PCAiXVxuIjsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE9wZXJhbmQgJk9wID0gT3BlcmFuZHNbaV07CisgICAgZXJycygpIDw8ICIgIG9wWyIgPDwgaSA8PCAiXSA9ICIgPDwgT3AuQ2xhc3MtPkNsYXNzTmFtZSA8PCAiIC0gIjsKKyAgICBpZiAoT3AuQ2xhc3MtPktpbmQgPT0gQ2xhc3NJbmZvOjpUb2tlbikgeworICAgICAgZXJycygpIDw8ICdcIicgPDwgVG9rZW5zW2ldIDw8ICJcIlxuIjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICghT3AuT3BlcmFuZEluZm8pIHsKKyAgICAgIGVycnMoKSA8PCAiKHNpbmdsZXRvbiByZWdpc3RlcilcbiI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb246Ok9wZXJhbmRJbmZvICZPSSA9ICpPcC5PcGVyYW5kSW5mbzsKKyAgICBlcnJzKCkgPDwgT0kuTmFtZSA8PCAiICIgPDwgT0kuUmVjLT5nZXROYW1lKCkKKyAgICAgICAgICAgPDwgIiAoIiA8PCBPSS5NSU9wZXJhbmRObyA8PCAiLCAiIDw8IE9JLk1JTnVtT3BlcmFuZHMgPDwgIilcbiI7CisgIH0KK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGdldEVudW1OYW1lRm9yVG9rZW4oU3RyaW5nUmVmIFN0cikgeworICBzdGQ6OnN0cmluZyBSZXM7CisgIAorICBmb3IgKFN0cmluZ1JlZjo6aXRlcmF0b3IgaXQgPSBTdHIuYmVnaW4oKSwgaWUgPSBTdHIuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgc3dpdGNoICgqaXQpIHsKKyAgICBjYXNlICcqJzogUmVzICs9ICJfU1RBUl8iOyBicmVhazsKKyAgICBjYXNlICclJzogUmVzICs9ICJfUENUXyI7IGJyZWFrOworICAgIGNhc2UgJzonOiBSZXMgKz0gIl9DT0xPTl8iOyBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoaXNhbG51bSgqaXQpKSAgeworICAgICAgICBSZXMgKz0gKml0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzICs9ICJfIiArIHV0b3N0cigodW5zaWduZWQpICppdCkgKyAiXyI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIFJlczsKK30KKworLy8vIGdldFJlZ2lzdGVyUmVjb3JkIC0gR2V0IHRoZSByZWdpc3RlciByZWNvcmQgZm9yIFxhcmcgbmFtZSwgb3IgMC4KK3N0YXRpYyBSZWNvcmQgKmdldFJlZ2lzdGVyUmVjb3JkKENvZGVHZW5UYXJnZXQgJlRhcmdldCwgU3RyaW5nUmVmIE5hbWUpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRhcmdldC5nZXRSZWdpc3RlcnMoKS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgQ29kZUdlblJlZ2lzdGVyICZSZWcgPSBUYXJnZXQuZ2V0UmVnaXN0ZXJzKClbaV07CisgICAgaWYgKE5hbWUgPT0gUmVnLlRoZURlZi0+Z2V0VmFsdWVBc1N0cmluZygiQXNtTmFtZSIpKQorICAgICAgcmV0dXJuIFJlZy5UaGVEZWY7CisgIH0KKworICByZXR1cm4gMDsKK30KKworQ2xhc3NJbmZvICpBc21NYXRjaGVySW5mbzo6Z2V0VG9rZW5DbGFzcyhTdHJpbmdSZWYgVG9rZW4pIHsKKyAgQ2xhc3NJbmZvIComRW50cnkgPSBUb2tlbkNsYXNzZXNbVG9rZW5dOworICAKKyAgaWYgKCFFbnRyeSkgeworICAgIEVudHJ5ID0gbmV3IENsYXNzSW5mbygpOworICAgIEVudHJ5LT5LaW5kID0gQ2xhc3NJbmZvOjpUb2tlbjsKKyAgICBFbnRyeS0+Q2xhc3NOYW1lID0gIlRva2VuIjsKKyAgICBFbnRyeS0+TmFtZSA9ICJNQ0tfIiArIGdldEVudW1OYW1lRm9yVG9rZW4oVG9rZW4pOworICAgIEVudHJ5LT5WYWx1ZU5hbWUgPSBUb2tlbjsKKyAgICBFbnRyeS0+UHJlZGljYXRlTWV0aG9kID0gIjxpbnZhbGlkPiI7CisgICAgRW50cnktPlJlbmRlck1ldGhvZCA9ICI8aW52YWxpZD4iOworICAgIENsYXNzZXMucHVzaF9iYWNrKEVudHJ5KTsKKyAgfQorCisgIHJldHVybiBFbnRyeTsKK30KKworQ2xhc3NJbmZvICoKK0FzbU1hdGNoZXJJbmZvOjpnZXRPcGVyYW5kQ2xhc3MoU3RyaW5nUmVmIFRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb246Ok9wZXJhbmRJbmZvICZPSSkgeworICBpZiAoT0kuUmVjLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyQ2xhc3MiKSkgeworICAgIENsYXNzSW5mbyAqQ0kgPSBSZWdpc3RlckNsYXNzQ2xhc3Nlc1tPSS5SZWNdOworCisgICAgaWYgKCFDSSkgeworICAgICAgUHJpbnRFcnJvcihPSS5SZWMtPmdldExvYygpLCAicmVnaXN0ZXIgY2xhc3MgaGFzIG5vIGNsYXNzIGluZm8hIik7CisgICAgICB0aHJvdyBzdGQ6OnN0cmluZygiRVJST1I6IE1pc3NpbmcgcmVnaXN0ZXIgY2xhc3MhIik7CisgICAgfQorCisgICAgcmV0dXJuIENJOworICB9CisKKyAgYXNzZXJ0KE9JLlJlYy0+aXNTdWJDbGFzc09mKCJPcGVyYW5kIikgJiYgIlVuZXhwZWN0ZWQgb3BlcmFuZCEiKTsKKyAgUmVjb3JkICpNYXRjaENsYXNzID0gT0kuUmVjLT5nZXRWYWx1ZUFzRGVmKCJQYXJzZXJNYXRjaENsYXNzIik7CisgIENsYXNzSW5mbyAqQ0kgPSBBc21PcGVyYW5kQ2xhc3Nlc1tNYXRjaENsYXNzXTsKKworICBpZiAoIUNJKSB7CisgICAgUHJpbnRFcnJvcihPSS5SZWMtPmdldExvYygpLCAib3BlcmFuZCBoYXMgbm8gbWF0Y2ggY2xhc3MhIik7CisgICAgdGhyb3cgc3RkOjpzdHJpbmcoIkVSUk9SOiBNaXNzaW5nIG1hdGNoIGNsYXNzISIpOworICB9CisKKyAgcmV0dXJuIENJOworfQorCit2b2lkIEFzbU1hdGNoZXJJbmZvOjpCdWlsZFJlZ2lzdGVyQ2xhc3NlcyhDb2RlR2VuVGFyZ2V0ICZUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNpbmdsZXRvblJlZ2lzdGVyTmFtZXMpIHsKKyAgc3RkOjp2ZWN0b3I8Q29kZUdlblJlZ2lzdGVyQ2xhc3M+IFJlZ2lzdGVyQ2xhc3NlczsKKyAgc3RkOjp2ZWN0b3I8Q29kZUdlblJlZ2lzdGVyPiBSZWdpc3RlcnM7CisKKyAgUmVnaXN0ZXJDbGFzc2VzID0gVGFyZ2V0LmdldFJlZ2lzdGVyQ2xhc3NlcygpOworICBSZWdpc3RlcnMgPSBUYXJnZXQuZ2V0UmVnaXN0ZXJzKCk7CisKKyAgLy8gVGhlIHJlZ2lzdGVyIHNldHMgdXNlZCBmb3IgbWF0Y2hpbmcuCisgIHN0ZDo6c2V0PCBzdGQ6OnNldDxSZWNvcmQqPiA+IFJlZ2lzdGVyU2V0czsKKworICAvLyBHYXRoZXIgdGhlIGRlZmluZWQgc2V0cy4gIAorICBmb3IgKHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3RlckNsYXNzPjo6aXRlcmF0b3IgaXQgPSBSZWdpc3RlckNsYXNzZXMuYmVnaW4oKSwKKyAgICAgICAgIGllID0gUmVnaXN0ZXJDbGFzc2VzLmVuZCgpOyBpdCAhPSBpZTsgKytpdCkKKyAgICBSZWdpc3RlclNldHMuaW5zZXJ0KHN0ZDo6c2V0PFJlY29yZCo+KGl0LT5FbGVtZW50cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPkVsZW1lbnRzLmVuZCgpKSk7CisKKyAgLy8gQWRkIGFueSByZXF1aXJlZCBzaW5nbGV0b24gc2V0cy4KKyAgZm9yIChzdGQ6OnNldDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gU2luZ2xldG9uUmVnaXN0ZXJOYW1lcy5iZWdpbigpLAorICAgICAgICAgaWUgPSBTaW5nbGV0b25SZWdpc3Rlck5hbWVzLmVuZCgpOyBpdCAhPSBpZTsgKytpdCkKKyAgICBpZiAoUmVjb3JkICpSZWMgPSBnZXRSZWdpc3RlclJlY29yZChUYXJnZXQsICppdCkpCisgICAgICBSZWdpc3RlclNldHMuaW5zZXJ0KHN0ZDo6c2V0PFJlY29yZCo+KCZSZWMsICZSZWMgKyAxKSk7CisgICAgICAgICAKKyAgLy8gSW50cm9kdWNlIGRlcml2ZWQgc2V0cyB3aGVyZSBuZWNlc3NhcnkgKHdoZW4gYSByZWdpc3RlciBkb2VzIG5vdCBkZXRlcm1pbmUKKyAgLy8gYSB1bmlxdWUgcmVnaXN0ZXIgc2V0IGNsYXNzKSwgYW5kIGJ1aWxkIHRoZSBtYXBwaW5nIG9mIHJlZ2lzdGVycyB0byB0aGUgc2V0CisgIC8vIHRoZXkgc2hvdWxkIGNsYXNzaWZ5IHRvLgorICBzdGQ6Om1hcDxSZWNvcmQqLCBzdGQ6OnNldDxSZWNvcmQqPiA+IFJlZ2lzdGVyTWFwOworICBmb3IgKHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3Rlcj46Oml0ZXJhdG9yIGl0ID0gUmVnaXN0ZXJzLmJlZ2luKCksCisgICAgICAgICBpZSA9IFJlZ2lzdGVycy5lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICBDb2RlR2VuUmVnaXN0ZXIgJkNHUiA9ICppdDsKKyAgICAvLyBDb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gb2YgYWxsIHNldHMgY29udGFpbmluZyB0aGlzIHJlZ2lzdGVyLgorICAgIHN0ZDo6c2V0PFJlY29yZCo+IENvbnRhaW5pbmdTZXQ7CisgICAgCisgICAgZm9yIChzdGQ6OnNldDwgc3RkOjpzZXQ8UmVjb3JkKj4gPjo6aXRlcmF0b3IgaXQgPSBSZWdpc3RlclNldHMuYmVnaW4oKSwKKyAgICAgICAgICAgaWUgPSBSZWdpc3RlclNldHMuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgICBpZiAoIWl0LT5jb3VudChDR1IuVGhlRGVmKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChDb250YWluaW5nU2V0LmVtcHR5KCkpIHsKKyAgICAgICAgQ29udGFpbmluZ1NldCA9ICppdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c2V0PFJlY29yZCo+IFRtcDsKKyAgICAgICAgc3RkOjpzd2FwKFRtcCwgQ29udGFpbmluZ1NldCk7CisgICAgICAgIHN0ZDo6aW5zZXJ0X2l0ZXJhdG9yPCBzdGQ6OnNldDxSZWNvcmQqPiA+IElJKENvbnRhaW5pbmdTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5pbmdTZXQuYmVnaW4oKSk7CisgICAgICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihUbXAuYmVnaW4oKSwgVG1wLmVuZCgpLCBpdC0+YmVnaW4oKSwgaXQtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUkpOworICAgICAgfQorICAgIH0KKworICAgIGlmICghQ29udGFpbmluZ1NldC5lbXB0eSgpKSB7CisgICAgICBSZWdpc3RlclNldHMuaW5zZXJ0KENvbnRhaW5pbmdTZXQpOworICAgICAgUmVnaXN0ZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKENHUi5UaGVEZWYsIENvbnRhaW5pbmdTZXQpKTsKKyAgICB9CisgIH0KKworICAvLyBDb25zdHJ1Y3QgdGhlIHJlZ2lzdGVyIGNsYXNzZXMuCisgIHN0ZDo6bWFwPHN0ZDo6c2V0PFJlY29yZCo+LCBDbGFzc0luZm8qPiBSZWdpc3RlclNldENsYXNzZXM7CisgIHVuc2lnbmVkIEluZGV4ID0gMDsKKyAgZm9yIChzdGQ6OnNldDwgc3RkOjpzZXQ8UmVjb3JkKj4gPjo6aXRlcmF0b3IgaXQgPSBSZWdpc3RlclNldHMuYmVnaW4oKSwKKyAgICAgICAgIGllID0gUmVnaXN0ZXJTZXRzLmVuZCgpOyBpdCAhPSBpZTsgKytpdCwgKytJbmRleCkgeworICAgIENsYXNzSW5mbyAqQ0kgPSBuZXcgQ2xhc3NJbmZvKCk7CisgICAgQ0ktPktpbmQgPSBDbGFzc0luZm86OlJlZ2lzdGVyQ2xhc3MwICsgSW5kZXg7CisgICAgQ0ktPkNsYXNzTmFtZSA9ICJSZWciICsgdXRvc3RyKEluZGV4KTsKKyAgICBDSS0+TmFtZSA9ICJNQ0tfUmVnIiArIHV0b3N0cihJbmRleCk7CisgICAgQ0ktPlZhbHVlTmFtZSA9ICIiOworICAgIENJLT5QcmVkaWNhdGVNZXRob2QgPSAiIjsgLy8gdW51c2VkCisgICAgQ0ktPlJlbmRlck1ldGhvZCA9ICJhZGRSZWdPcGVyYW5kcyI7CisgICAgQ0ktPlJlZ2lzdGVycyA9ICppdDsKKyAgICBDbGFzc2VzLnB1c2hfYmFjayhDSSk7CisgICAgUmVnaXN0ZXJTZXRDbGFzc2VzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqaXQsIENJKSk7CisgIH0KKworICAvLyBGaW5kIHRoZSBzdXBlcmNsYXNzZXM7IHdlIGNvdWxkIGNvbXB1dGUgb25seSB0aGUgc3ViZ3JvdXAgbGF0dGljZSBlZGdlcywKKyAgLy8gYnV0IHRoZXJlIGlzbid0IHJlYWxseSBhIHBvaW50LgorICBmb3IgKHN0ZDo6c2V0PCBzdGQ6OnNldDxSZWNvcmQqPiA+OjppdGVyYXRvciBpdCA9IFJlZ2lzdGVyU2V0cy5iZWdpbigpLAorICAgICAgICAgaWUgPSBSZWdpc3RlclNldHMuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgQ2xhc3NJbmZvICpDSSA9IFJlZ2lzdGVyU2V0Q2xhc3Nlc1sqaXRdOworICAgIGZvciAoc3RkOjpzZXQ8IHN0ZDo6c2V0PFJlY29yZCo+ID46Oml0ZXJhdG9yIGl0MiA9IFJlZ2lzdGVyU2V0cy5iZWdpbigpLAorICAgICAgICAgICBpZTIgPSBSZWdpc3RlclNldHMuZW5kKCk7IGl0MiAhPSBpZTI7ICsraXQyKQorICAgICAgaWYgKCppdCAhPSAqaXQyICYmIAorICAgICAgICAgIHN0ZDo6aW5jbHVkZXMoaXQyLT5iZWdpbigpLCBpdDItPmVuZCgpLCBpdC0+YmVnaW4oKSwgaXQtPmVuZCgpKSkKKyAgICAgICAgQ0ktPlN1cGVyQ2xhc3Nlcy5wdXNoX2JhY2soUmVnaXN0ZXJTZXRDbGFzc2VzWyppdDJdKTsKKyAgfQorCisgIC8vIE5hbWUgdGhlIHJlZ2lzdGVyIGNsYXNzZXMgd2hpY2ggY29ycmVzcG9uZCB0byBhIHVzZXIgZGVmaW5lZCBSZWdpc3RlckNsYXNzLgorICBmb3IgKHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3RlckNsYXNzPjo6aXRlcmF0b3IgaXQgPSBSZWdpc3RlckNsYXNzZXMuYmVnaW4oKSwKKyAgICAgICAgIGllID0gUmVnaXN0ZXJDbGFzc2VzLmVuZCgpOyBpdCAhPSBpZTsgKytpdCkgeworICAgIENsYXNzSW5mbyAqQ0kgPSBSZWdpc3RlclNldENsYXNzZXNbc3RkOjpzZXQ8UmVjb3JkKj4oaXQtPkVsZW1lbnRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+RWxlbWVudHMuZW5kKCkpXTsKKyAgICBpZiAoQ0ktPlZhbHVlTmFtZS5lbXB0eSgpKSB7CisgICAgICBDSS0+Q2xhc3NOYW1lID0gaXQtPmdldE5hbWUoKTsKKyAgICAgIENJLT5OYW1lID0gIk1DS18iICsgaXQtPmdldE5hbWUoKTsKKyAgICAgIENJLT5WYWx1ZU5hbWUgPSBpdC0+Z2V0TmFtZSgpOworICAgIH0gZWxzZQorICAgICAgQ0ktPlZhbHVlTmFtZSA9IENJLT5WYWx1ZU5hbWUgKyAiLCIgKyBpdC0+Z2V0TmFtZSgpOworCisgICAgUmVnaXN0ZXJDbGFzc0NsYXNzZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGl0LT5UaGVEZWYsIENJKSk7CisgIH0KKworICAvLyBQb3B1bGF0ZSB0aGUgbWFwIGZvciBpbmRpdmlkdWFsIHJlZ2lzdGVycy4KKyAgZm9yIChzdGQ6Om1hcDxSZWNvcmQqLCBzdGQ6OnNldDxSZWNvcmQqPiA+OjppdGVyYXRvciBpdCA9IFJlZ2lzdGVyTWFwLmJlZ2luKCksCisgICAgICAgICBpZSA9IFJlZ2lzdGVyTWFwLmVuZCgpOyBpdCAhPSBpZTsgKytpdCkKKyAgICB0aGlzLT5SZWdpc3RlckNsYXNzZXNbaXQtPmZpcnN0XSA9IFJlZ2lzdGVyU2V0Q2xhc3Nlc1tpdC0+c2Vjb25kXTsKKworICAvLyBOYW1lIHRoZSByZWdpc3RlciBjbGFzc2VzIHdoaWNoIGNvcnJlc3BvbmQgdG8gc2luZ2xldG9uIHJlZ2lzdGVycy4KKyAgZm9yIChzdGQ6OnNldDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gU2luZ2xldG9uUmVnaXN0ZXJOYW1lcy5iZWdpbigpLAorICAgICAgICAgaWUgPSBTaW5nbGV0b25SZWdpc3Rlck5hbWVzLmVuZCgpOyBpdCAhPSBpZTsgKytpdCkgeworICAgIGlmIChSZWNvcmQgKlJlYyA9IGdldFJlZ2lzdGVyUmVjb3JkKFRhcmdldCwgKml0KSkgeworICAgICAgQ2xhc3NJbmZvICpDSSA9IHRoaXMtPlJlZ2lzdGVyQ2xhc3Nlc1tSZWNdOworICAgICAgYXNzZXJ0KENJICYmICJNaXNzaW5nIHNpbmdsZXRvbiByZWdpc3RlciBjbGFzcyBpbmZvISIpOworCisgICAgICBpZiAoQ0ktPlZhbHVlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIENJLT5DbGFzc05hbWUgPSBSZWMtPmdldE5hbWUoKTsKKyAgICAgICAgQ0ktPk5hbWUgPSAiTUNLXyIgKyBSZWMtPmdldE5hbWUoKTsKKyAgICAgICAgQ0ktPlZhbHVlTmFtZSA9IFJlYy0+Z2V0TmFtZSgpOworICAgICAgfSBlbHNlCisgICAgICAgIENJLT5WYWx1ZU5hbWUgPSBDSS0+VmFsdWVOYW1lICsgIiwiICsgUmVjLT5nZXROYW1lKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQXNtTWF0Y2hlckluZm86OkJ1aWxkT3BlcmFuZENsYXNzZXMoQ29kZUdlblRhcmdldCAmVGFyZ2V0KSB7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEFzbU9wZXJhbmRzOworICBBc21PcGVyYW5kcyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJBc21PcGVyYW5kQ2xhc3MiKTsKKworICAvLyBQcmUtcG9wdWxhdGUgQXNtT3BlcmFuZENsYXNzZXMgbWFwLgorICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBpdCA9IEFzbU9wZXJhbmRzLmJlZ2luKCksIAorICAgICAgICAgaWUgPSBBc21PcGVyYW5kcy5lbmQoKTsgaXQgIT0gaWU7ICsraXQpCisgICAgQXNtT3BlcmFuZENsYXNzZXNbKml0XSA9IG5ldyBDbGFzc0luZm8oKTsKKworICB1bnNpZ25lZCBJbmRleCA9IDA7CisgIGZvciAoc3RkOjp2ZWN0b3I8UmVjb3JkKj46Oml0ZXJhdG9yIGl0ID0gQXNtT3BlcmFuZHMuYmVnaW4oKSwgCisgICAgICAgICBpZSA9IEFzbU9wZXJhbmRzLmVuZCgpOyBpdCAhPSBpZTsgKytpdCwgKytJbmRleCkgeworICAgIENsYXNzSW5mbyAqQ0kgPSBBc21PcGVyYW5kQ2xhc3Nlc1sqaXRdOworICAgIENJLT5LaW5kID0gQ2xhc3NJbmZvOjpVc2VyQ2xhc3MwICsgSW5kZXg7CisKKyAgICBMaXN0SW5pdCAqU3VwZXJzID0gKCppdCktPmdldFZhbHVlQXNMaXN0SW5pdCgiU3VwZXJDbGFzc2VzIik7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN1cGVycy0+Z2V0U2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgRGVmSW5pdCAqREkgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KFN1cGVycy0+Z2V0RWxlbWVudChpKSk7CisgICAgICBpZiAoIURJKSB7CisgICAgICAgIFByaW50RXJyb3IoKCppdCktPmdldExvYygpLCAiSW52YWxpZCBzdXBlciBjbGFzcyByZWZlcmVuY2UhIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBDbGFzc0luZm8gKlNDID0gQXNtT3BlcmFuZENsYXNzZXNbREktPmdldERlZigpXTsKKyAgICAgIGlmICghU0MpCisgICAgICAgIFByaW50RXJyb3IoKCppdCktPmdldExvYygpLCAiSW52YWxpZCBzdXBlciBjbGFzcyByZWZlcmVuY2UhIik7CisgICAgICBlbHNlCisgICAgICAgIENJLT5TdXBlckNsYXNzZXMucHVzaF9iYWNrKFNDKTsKKyAgICB9CisgICAgQ0ktPkNsYXNzTmFtZSA9ICgqaXQpLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIik7CisgICAgQ0ktPk5hbWUgPSAiTUNLXyIgKyBDSS0+Q2xhc3NOYW1lOworICAgIENJLT5WYWx1ZU5hbWUgPSAoKml0KS0+Z2V0TmFtZSgpOworCisgICAgLy8gR2V0IG9yIGNvbnN0cnVjdCB0aGUgcHJlZGljYXRlIG1ldGhvZCBuYW1lLgorICAgIEluaXQgKlBNTmFtZSA9ICgqaXQpLT5nZXRWYWx1ZUluaXQoIlByZWRpY2F0ZU1ldGhvZCIpOworICAgIGlmIChTdHJpbmdJbml0ICpTSSA9IGR5bmFtaWNfY2FzdDxTdHJpbmdJbml0Kj4oUE1OYW1lKSkgeworICAgICAgQ0ktPlByZWRpY2F0ZU1ldGhvZCA9IFNJLT5nZXRWYWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoZHluYW1pY19jYXN0PFVuc2V0SW5pdCo+KFBNTmFtZSkgJiYgCisgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgUHJlZGljYXRlTWV0aG9kIGZpZWxkISIpOworICAgICAgQ0ktPlByZWRpY2F0ZU1ldGhvZCA9ICJpcyIgKyBDSS0+Q2xhc3NOYW1lOworICAgIH0KKworICAgIC8vIEdldCBvciBjb25zdHJ1Y3QgdGhlIHJlbmRlciBtZXRob2QgbmFtZS4KKyAgICBJbml0ICpSTU5hbWUgPSAoKml0KS0+Z2V0VmFsdWVJbml0KCJSZW5kZXJNZXRob2QiKTsKKyAgICBpZiAoU3RyaW5nSW5pdCAqU0kgPSBkeW5hbWljX2Nhc3Q8U3RyaW5nSW5pdCo+KFJNTmFtZSkpIHsKKyAgICAgIENJLT5SZW5kZXJNZXRob2QgPSBTSS0+Z2V0VmFsdWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KGR5bmFtaWNfY2FzdDxVbnNldEluaXQqPihSTU5hbWUpICYmCisgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgUmVuZGVyTWV0aG9kIGZpZWxkISIpOworICAgICAgQ0ktPlJlbmRlck1ldGhvZCA9ICJhZGQiICsgQ0ktPkNsYXNzTmFtZSArICJPcGVyYW5kcyI7CisgICAgfQorCisgICAgQXNtT3BlcmFuZENsYXNzZXNbKml0XSA9IENJOworICAgIENsYXNzZXMucHVzaF9iYWNrKENJKTsKKyAgfQorfQorCitBc21NYXRjaGVySW5mbzo6QXNtTWF0Y2hlckluZm8oUmVjb3JkICpfQXNtUGFyc2VyKSAKKyAgOiBBc21QYXJzZXIoX0FzbVBhcnNlciksCisgICAgQ29tbWVudERlbGltaXRlcihBc21QYXJzZXItPmdldFZhbHVlQXNTdHJpbmcoIkNvbW1lbnREZWxpbWl0ZXIiKSksCisgICAgUmVnaXN0ZXJQcmVmaXgoQXNtUGFyc2VyLT5nZXRWYWx1ZUFzU3RyaW5nKCJSZWdpc3RlclByZWZpeCIpKQoreworfQorCit2b2lkIEFzbU1hdGNoZXJJbmZvOjpCdWlsZEluZm8oQ29kZUdlblRhcmdldCAmVGFyZ2V0KSB7CisgIC8vIFBhcnNlIHRoZSBpbnN0cnVjdGlvbnM7IHdlIG5lZWQgdG8gZG8gdGhpcyBmaXJzdCBzbyB0aGF0IHdlIGNhbiBnYXRoZXIgdGhlCisgIC8vIHNpbmdsZXRvbiByZWdpc3RlciBjbGFzc2VzLgorICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gU2luZ2xldG9uUmVnaXN0ZXJOYW1lczsKKyAgCisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbio+ICZJbnN0ckxpc3QgPQorICAgIFRhcmdldC5nZXRJbnN0cnVjdGlvbnNCeUVudW1WYWx1ZSgpOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3RyTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uICZDR0kgPSAqSW5zdHJMaXN0W2ldOworCisgICAgaWYgKCFTdHJpbmdSZWYoQ0dJLlRoZURlZi0+Z2V0TmFtZSgpKS5zdGFydHN3aXRoKE1hdGNoUHJlZml4KSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgT3duaW5nUHRyPEluc3RydWN0aW9uSW5mbz4gSUkobmV3IEluc3RydWN0aW9uSW5mbygpKTsKKyAgICAKKyAgICBJSS0+SW5zdHJOYW1lID0gQ0dJLlRoZURlZi0+Z2V0TmFtZSgpOworICAgIElJLT5JbnN0ciA9ICZDR0k7CisgICAgSUktPkFzbVN0cmluZyA9IEZsYXR0ZW5WYXJpYW50cyhDR0kuQXNtU3RyaW5nLCAwKTsKKworICAgIC8vIFJlbW92ZSBjb21tZW50cyBmcm9tIHRoZSBhc20gc3RyaW5nLgorICAgIGlmICghQ29tbWVudERlbGltaXRlci5lbXB0eSgpKSB7CisgICAgICBzaXplX3QgSWR4ID0gU3RyaW5nUmVmKElJLT5Bc21TdHJpbmcpLmZpbmQoQ29tbWVudERlbGltaXRlcik7CisgICAgICBpZiAoSWR4ICE9IFN0cmluZ1JlZjo6bnBvcykKKyAgICAgICAgSUktPkFzbVN0cmluZyA9IElJLT5Bc21TdHJpbmcuc3Vic3RyKDAsIElkeCk7CisgICAgfQorCisgICAgVG9rZW5pemVBc21TdHJpbmcoSUktPkFzbVN0cmluZywgSUktPlRva2Vucyk7CisKKyAgICAvLyBJZ25vcmUgaW5zdHJ1Y3Rpb25zIHdoaWNoIHNob3VsZG4ndCBiZSBtYXRjaGVkLgorICAgIGlmICghSXNBc3NlbWJsZXJJbnN0cnVjdGlvbihDR0kuVGhlRGVmLT5nZXROYW1lKCksIENHSSwgSUktPlRva2VucykpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIENvbGxlY3Qgc2luZ2xldG9uIHJlZ2lzdGVycywgaWYgdXNlZC4KKyAgICBpZiAoIVJlZ2lzdGVyUHJlZml4LmVtcHR5KCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJSS0+VG9rZW5zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgaWYgKElJLT5Ub2tlbnNbaV0uc3RhcnRzd2l0aChSZWdpc3RlclByZWZpeCkpIHsKKyAgICAgICAgICBTdHJpbmdSZWYgUmVnTmFtZSA9IElJLT5Ub2tlbnNbaV0uc3Vic3RyKFJlZ2lzdGVyUHJlZml4LnNpemUoKSk7CisgICAgICAgICAgUmVjb3JkICpSZWMgPSBnZXRSZWdpc3RlclJlY29yZChUYXJnZXQsIFJlZ05hbWUpOworICAgICAgICAgIAorICAgICAgICAgIGlmICghUmVjKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBFcnIgPSAidW5hYmxlIHRvIGZpbmQgcmVnaXN0ZXIgZm9yICciICsgUmVnTmFtZS5zdHIoKSArIAorICAgICAgICAgICAgICAiJyAod2hpY2ggbWF0Y2hlcyByZWdpc3RlciBwcmVmaXgpIjsKKyAgICAgICAgICAgIHRocm93IFRHRXJyb3IoQ0dJLlRoZURlZi0+Z2V0TG9jKCksIEVycik7CisgICAgICAgICAgfQorCisgICAgICAgICAgU2luZ2xldG9uUmVnaXN0ZXJOYW1lcy5pbnNlcnQoUmVnTmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb21wdXRlIHRoZSByZXF1aXJlIGZlYXR1cmVzLgorICAgIExpc3RJbml0ICpQcmVkaWNhdGVzID0gQ0dJLlRoZURlZi0+Z2V0VmFsdWVBc0xpc3RJbml0KCJQcmVkaWNhdGVzIik7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFByZWRpY2F0ZXMtPmdldFNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChEZWZJbml0ICpQcmVkID0gZHluYW1pY19jYXN0PERlZkluaXQqPihQcmVkaWNhdGVzLT5nZXRFbGVtZW50KGkpKSkgeworICAgICAgICAvLyBJZ25vcmUgT3B0Rm9yU2l6ZSBhbmQgT3B0Rm9yU3BlZWQsIHRoZXkgYXJlbid0IHJlYWxseSByZXF1aXJlbWVudHMsCisgICAgICAgIC8vIHJhdGhlciB0aGV5IGFyZSBoaW50cyB0byBpc2VsLgorICAgICAgICAvLworICAgICAgICAvLyBGSVhNRTogRmluZCBiZXR0ZXIgd2F5IHRvIG1vZGVsIHRoaXMuCisgICAgICAgIGlmIChQcmVkLT5nZXREZWYoKS0+Z2V0TmFtZSgpID09ICJPcHRGb3JTaXplIiB8fAorICAgICAgICAgICAgUHJlZC0+Z2V0RGVmKCktPmdldE5hbWUoKSA9PSAiT3B0Rm9yU3BlZWQiKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIEZJWE1FOiBUb3RhbCBoYWNrOyBmb3Igbm93LCB3ZSBqdXN0IGxpbWl0IG91cnNlbHZlcyB0byBJbjMyQml0TW9kZQorICAgICAgICAvLyBhbmQgSW42NEJpdE1vZGUsIGJlY2F1c2Ugd2UgYXJlbid0IGdvaW5nIHRvIGhhdmUgdGhlIHJpZ2h0IGZlYXR1cmUKKyAgICAgICAgLy8gbWFza3MgZm9yIFNTRSBhbmQgZnJpZW5kcy4gV2UgbmVlZCB0byBkZWNpZGUgd2hhdCB3ZSBhcmUgZ29pbmcgdG8gZG8KKyAgICAgICAgLy8gYWJvdXQgQ1BVIHN1YnR5cGVzIHRvIGltcGxlbWVudCB0aGlzIHRoZSByaWdodCB3YXkuCisgICAgICAgIGlmIChQcmVkLT5nZXREZWYoKS0+Z2V0TmFtZSgpICE9ICJJbjMyQml0TW9kZSIgJiYKKyAgICAgICAgICAgIFByZWQtPmdldERlZigpLT5nZXROYW1lKCkgIT0gIkluNjRCaXRNb2RlIikKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBJSS0+UmVxdWlyZWRGZWF0dXJlcy5wdXNoX2JhY2soZ2V0U3VidGFyZ2V0RmVhdHVyZShQcmVkLT5nZXREZWYoKSkpOworICAgICAgfQorICAgIH0KKworICAgIEluc3RydWN0aW9ucy5wdXNoX2JhY2soSUkudGFrZSgpKTsKKyAgfQorCisgIC8vIEJ1aWxkIGluZm8gZm9yIHRoZSByZWdpc3RlciBjbGFzc2VzLgorICBCdWlsZFJlZ2lzdGVyQ2xhc3NlcyhUYXJnZXQsIFNpbmdsZXRvblJlZ2lzdGVyTmFtZXMpOworCisgIC8vIEJ1aWxkIGluZm8gZm9yIHRoZSB1c2VyIGRlZmluZWQgYXNzZW1ibHkgb3BlcmFuZCBjbGFzc2VzLgorICBCdWlsZE9wZXJhbmRDbGFzc2VzKFRhcmdldCk7CisKKyAgLy8gQnVpbGQgdGhlIGluc3RydWN0aW9uIGluZm9ybWF0aW9uLgorICBmb3IgKHN0ZDo6dmVjdG9yPEluc3RydWN0aW9uSW5mbyo+OjppdGVyYXRvciBpdCA9IEluc3RydWN0aW9ucy5iZWdpbigpLAorICAgICAgICAgaWUgPSBJbnN0cnVjdGlvbnMuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgSW5zdHJ1Y3Rpb25JbmZvICpJSSA9ICppdDsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJSS0+VG9rZW5zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFN0cmluZ1JlZiBUb2tlbiA9IElJLT5Ub2tlbnNbaV07CisKKyAgICAgIC8vIENoZWNrIGZvciBzaW5nbGV0b24gcmVnaXN0ZXJzLgorICAgICAgaWYgKCFSZWdpc3RlclByZWZpeC5lbXB0eSgpICYmIFRva2VuLnN0YXJ0c3dpdGgoUmVnaXN0ZXJQcmVmaXgpKSB7CisgICAgICAgIFN0cmluZ1JlZiBSZWdOYW1lID0gSUktPlRva2Vuc1tpXS5zdWJzdHIoUmVnaXN0ZXJQcmVmaXguc2l6ZSgpKTsKKyAgICAgICAgSW5zdHJ1Y3Rpb25JbmZvOjpPcGVyYW5kIE9wOworICAgICAgICBPcC5DbGFzcyA9IFJlZ2lzdGVyQ2xhc3Nlc1tnZXRSZWdpc3RlclJlY29yZChUYXJnZXQsIFJlZ05hbWUpXTsKKyAgICAgICAgT3AuT3BlcmFuZEluZm8gPSAwOworICAgICAgICBhc3NlcnQoT3AuQ2xhc3MgJiYgT3AuQ2xhc3MtPlJlZ2lzdGVycy5zaXplKCkgPT0gMSAmJgorICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2xhc3MgZm9yIHNpbmdsZXRvbiByZWdpc3RlciIpOworICAgICAgICBJSS0+T3BlcmFuZHMucHVzaF9iYWNrKE9wKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGZvciBzaW1wbGUgdG9rZW5zLgorICAgICAgaWYgKFRva2VuWzBdICE9ICckJykgeworICAgICAgICBJbnN0cnVjdGlvbkluZm86Ok9wZXJhbmQgT3A7CisgICAgICAgIE9wLkNsYXNzID0gZ2V0VG9rZW5DbGFzcyhUb2tlbik7CisgICAgICAgIE9wLk9wZXJhbmRJbmZvID0gMDsKKyAgICAgICAgSUktPk9wZXJhbmRzLnB1c2hfYmFjayhPcCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBPdGhlcndpc2UgdGhpcyBpcyBhbiBvcGVyYW5kIHJlZmVyZW5jZS4KKyAgICAgIFN0cmluZ1JlZiBPcGVyYW5kTmFtZTsKKyAgICAgIGlmIChUb2tlblsxXSA9PSAneycpCisgICAgICAgIE9wZXJhbmROYW1lID0gVG9rZW4uc3Vic3RyKDIsIFRva2VuLnNpemUoKSAtIDMpOworICAgICAgZWxzZQorICAgICAgICBPcGVyYW5kTmFtZSA9IFRva2VuLnN1YnN0cigxKTsKKworICAgICAgLy8gTWFwIHRoaXMgdG9rZW4gdG8gYW4gb3BlcmFuZC4gRklYTUU6IE1vdmUgZWxzZXdoZXJlLgorICAgICAgdW5zaWduZWQgSWR4OworICAgICAgdHJ5IHsKKyAgICAgICAgSWR4ID0gSUktPkluc3RyLT5nZXRPcGVyYW5kTmFtZWQoT3BlcmFuZE5hbWUpOworICAgICAgfSBjYXRjaCguLi4pIHsKKyAgICAgICAgdGhyb3cgc3RkOjpzdHJpbmcoImVycm9yOiB1bmFibGUgdG8gZmluZCBvcGVyYW5kOiAnIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kTmFtZS5zdHIoKSArICInIik7CisgICAgICB9CisKKyAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGFubm95aW5nLCB0aGUgbmFtZWQgb3BlcmFuZCBtYXkgYmUgdGllZCAoZS5nLiwKKyAgICAgIC8vIFhDSEc4cm0pLiBXaGF0IHdlIHdhbnQgaXMgdGhlIHVudGllZCBvcGVyYW5kLCB3aGljaCB3ZSBub3cgaGF2ZSB0bworICAgICAgLy8gZ3JvdmVsIGZvci4gT25seSB3b3JyeSBhYm91dCB0aGlzIGZvciBzaW5nbGUgZW50cnkgb3BlcmFuZHMsIHdlIGhhdmUgdG8KKyAgICAgIC8vIGNsZWFuIHRoaXMgdXAgYW55d2F5LgorICAgICAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uOjpPcGVyYW5kSW5mbyAqT0kgPSAmSUktPkluc3RyLT5PcGVyYW5kTGlzdFtJZHhdOworICAgICAgaWYgKE9JLT5Db25zdHJhaW50c1swXS5pc1RpZWQoKSkgeworICAgICAgICB1bnNpZ25lZCBUaWVkT3AgPSBPSS0+Q29uc3RyYWludHNbMF0uZ2V0VGllZE9wZXJhbmQoKTsKKworICAgICAgICAvLyBUaGUgdGllZCBvcGVyYW5kIGluZGV4IGlzIGFuIE1JT3BlcmFuZCBpbmRleCwgZmluZCB0aGUgb3BlcmFuZCB0aGF0CisgICAgICAgIC8vIGNvbnRhaW5zIGl0LgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSUktPkluc3RyLT5PcGVyYW5kTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgaWYgKElJLT5JbnN0ci0+T3BlcmFuZExpc3RbaV0uTUlPcGVyYW5kTm8gPT0gVGllZE9wKSB7CisgICAgICAgICAgICBPSSA9ICZJSS0+SW5zdHItPk9wZXJhbmRMaXN0W2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KE9JICYmICJVbmFibGUgdG8gZmluZCB0aWVkIG9wZXJhbmQgdGFyZ2V0ISIpOworICAgICAgfQorCisgICAgICBJbnN0cnVjdGlvbkluZm86Ok9wZXJhbmQgT3A7CisgICAgICBPcC5DbGFzcyA9IGdldE9wZXJhbmRDbGFzcyhUb2tlbiwgKk9JKTsKKyAgICAgIE9wLk9wZXJhbmRJbmZvID0gT0k7CisgICAgICBJSS0+T3BlcmFuZHMucHVzaF9iYWNrKE9wKTsKKyAgICB9CisgIH0KKworICAvLyBSZW9yZGVyIGNsYXNzZXMgc28gdGhhdCBjbGFzc2VzIHByZWNlZWQgc3VwZXIgY2xhc3Nlcy4KKyAgc3RkOjpzb3J0KENsYXNzZXMuYmVnaW4oKSwgQ2xhc3Nlcy5lbmQoKSwgbGVzc19wdHI8Q2xhc3NJbmZvPigpKTsKK30KKworc3RhdGljIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+ICoKK0dldFRpZWRPcGVyYW5kQXRJbmRleChTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gPiAmTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRleCkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChJbmRleCA9PSBMaXN0W2ldLmZpcnN0KQorICAgICAgcmV0dXJuICZMaXN0W2ldOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBFbWl0Q29udmVydFRvTUNJbnN0KENvZGVHZW5UYXJnZXQgJlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SW5zdHJ1Y3Rpb25JbmZvKj4gJkluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gV3JpdGUgdGhlIGNvbnZlcnQgZnVuY3Rpb24gdG8gYSBzZXBhcmF0ZSBzdHJlYW0sIHNvIHdlIGNhbiBkcm9wIGl0IGFmdGVyCisgIC8vIHRoZSBlbnVtLgorICBzdGQ6OnN0cmluZyBDb252ZXJ0Rm5Cb2R5OworICByYXdfc3RyaW5nX29zdHJlYW0gQ3Z0T1MoQ29udmVydEZuQm9keSk7CisKKyAgLy8gRnVuY3Rpb24gd2UgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZC4KKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEdlbmVyYXRlZEZuczsKKworICAvLyBTdGFydCB0aGUgdW5pZmllZCBjb252ZXJzaW9uIGZ1bmN0aW9uLgorCisgIEN2dE9TIDw8ICJzdGF0aWMgdm9pZCBDb252ZXJ0VG9NQ0luc3QoQ29udmVyc2lvbktpbmQgS2luZCwgTUNJbnN0ICZJbnN0LCAiCisgICAgICAgIDw8ICJ1bnNpZ25lZCBPcGNvZGUsXG4iCisgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1DUGFyc2VkQXNtT3BlcmFuZCoiCisgICAgICAgIDw8ICI+ICZPcGVyYW5kcykge1xuIjsKKyAgQ3Z0T1MgPDwgIiAgSW5zdC5zZXRPcGNvZGUoT3Bjb2RlKTtcbiI7CisgIEN2dE9TIDw8ICIgIHN3aXRjaCAoS2luZCkge1xuIjsKKyAgQ3Z0T1MgPDwgIiAgZGVmYXVsdDpcbiI7CisKKyAgLy8gU3RhcnQgdGhlIGVudW0sIHdoaWNoIHdlIHdpbGwgZ2VuZXJhdGUgaW5saW5lLgorCisgIE9TIDw8ICIvLyBVbmlmaWVkIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIG9wZXJhbnRzIHRvIE1DSW5zdCBpbnN0YW5jZXMuXG5cbiI7CisgIE9TIDw8ICJlbnVtIENvbnZlcnNpb25LaW5kIHtcbiI7CisgIAorICAvLyBUYXJnZXRPcGVyYW5kQ2xhc3MgLSBUaGlzIGlzIHRoZSB0YXJnZXQncyBvcGVyYW5kIGNsYXNzLCBsaWtlIFg4Nk9wZXJhbmQuCisgIHN0ZDo6c3RyaW5nIFRhcmdldE9wZXJhbmRDbGFzcyA9IFRhcmdldC5nZXROYW1lKCkgKyAiT3BlcmFuZCI7CisgIAorICBmb3IgKHN0ZDo6dmVjdG9yPEluc3RydWN0aW9uSW5mbyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IEluZm9zLmJlZ2luKCksCisgICAgICAgICBpZSA9IEluZm9zLmVuZCgpOyBpdCAhPSBpZTsgKytpdCkgeworICAgIEluc3RydWN0aW9uSW5mbyAmSUkgPSAqKml0OworCisgICAgLy8gT3JkZXIgdGhlIChjbGFzcykgb3BlcmFuZHMgYnkgdGhlIG9yZGVyIHRvIGNvbnZlcnQgdGhlbSBpbnRvIGFuIE1DSW5zdC4KKyAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiwgND4gTUlPcGVyYW5kTGlzdDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSUkuT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgSW5zdHJ1Y3Rpb25JbmZvOjpPcGVyYW5kICZPcCA9IElJLk9wZXJhbmRzW2ldOworICAgICAgaWYgKE9wLk9wZXJhbmRJbmZvKQorICAgICAgICBNSU9wZXJhbmRMaXN0LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihPcC5PcGVyYW5kSW5mby0+TUlPcGVyYW5kTm8sIGkpKTsKKyAgICB9CisKKyAgICAvLyBGaW5kIGFueSB0aWVkIG9wZXJhbmRzLgorICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+LCA0PiBUaWVkT3BlcmFuZHM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IElJLkluc3RyLT5PcGVyYW5kTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb246Ok9wZXJhbmRJbmZvICZPcEluZm8gPSBJSS5JbnN0ci0+T3BlcmFuZExpc3RbaV07CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gT3BJbmZvLkNvbnN0cmFpbnRzLnNpemUoKTsgaiAhPSBlOyArK2opIHsKKyAgICAgICAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uOjpDb25zdHJhaW50SW5mbyAmQ0kgPSBPcEluZm8uQ29uc3RyYWludHNbal07CisgICAgICAgIGlmIChDSS5pc1RpZWQoKSkKKyAgICAgICAgICBUaWVkT3BlcmFuZHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE9wSW5mby5NSU9wZXJhbmRObyArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSS5nZXRUaWVkT3BlcmFuZCgpKSk7CisgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzb3J0KE1JT3BlcmFuZExpc3QuYmVnaW4oKSwgTUlPcGVyYW5kTGlzdC5lbmQoKSk7CisKKyAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3BlcmFuZHMuCisgICAgdW5zaWduZWQgTnVtTUlPcGVyYW5kcyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IElJLkluc3RyLT5PcGVyYW5kTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb246Ok9wZXJhbmRJbmZvICZPSSA9IElJLkluc3RyLT5PcGVyYW5kTGlzdFtpXTsKKyAgICAgIE51bU1JT3BlcmFuZHMgPSBzdGQ6Om1heChOdW1NSU9wZXJhbmRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSS5NSU9wZXJhbmRObyArIE9JLk1JTnVtT3BlcmFuZHMpOworICAgIH0KKworICAgIC8vIEJ1aWxkIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9uIHNpZ25hdHVyZS4KKyAgICBzdGQ6OnN0cmluZyBTaWduYXR1cmUgPSAiQ29udmVydCI7CisgICAgdW5zaWduZWQgQ3VySW5kZXggPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSU9wZXJhbmRMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEluc3RydWN0aW9uSW5mbzo6T3BlcmFuZCAmT3AgPSBJSS5PcGVyYW5kc1tNSU9wZXJhbmRMaXN0W2ldLnNlY29uZF07CisgICAgICBhc3NlcnQoQ3VySW5kZXggPD0gT3AuT3BlcmFuZEluZm8tPk1JT3BlcmFuZE5vICYmCisgICAgICAgICAgICAgIkR1cGxpY2F0ZSBtYXRjaCBmb3IgaW5zdHJ1Y3Rpb24gb3BlcmFuZCEiKTsKKyAgICAgIAorICAgICAgLy8gU2tpcCBvcGVyYW5kcyB3aGljaCB3ZXJlbid0IG1hdGNoZWQgYnkgYW55dGhpbmcsIHRoaXMgb2NjdXJzIHdoZW4gdGhlCisgICAgICAvLyAudGQgZmlsZSBlbmNvZGVzICJpbXBsaWNpdCIgb3BlcmFuZHMgYXMgZXhwbGljaXQgb25lcy4KKyAgICAgIC8vCisgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBNQ0luc3Qgc3RydWN0dXJlLgorICAgICAgZm9yICg7IEN1ckluZGV4ICE9IE9wLk9wZXJhbmRJbmZvLT5NSU9wZXJhbmRObzsgKytDdXJJbmRleCkgeworICAgICAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiAqVGllID0gR2V0VGllZE9wZXJhbmRBdEluZGV4KFRpZWRPcGVyYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJJbmRleCk7CisgICAgICAgIGlmICghVGllKQorICAgICAgICAgIFNpZ25hdHVyZSArPSAiX19JbXAiOworICAgICAgICBlbHNlCisgICAgICAgICAgU2lnbmF0dXJlICs9ICJfX1RpZSIgKyB1dG9zdHIoVGllLT5zZWNvbmQpOworICAgICAgfQorCisgICAgICBTaWduYXR1cmUgKz0gIl9fIjsKKworICAgICAgLy8gUmVnaXN0ZXJzIGFyZSBhbHdheXMgY29udmVydGVkIHRoZSBzYW1lLCBkb24ndCBkdXBsaWNhdGUgdGhlIGNvbnZlcnNpb24KKyAgICAgIC8vIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZW0uCisgICAgICAvLworICAgICAgLy8gRklYTUU6IFdlIGNvdWxkIGdlbmVyYWxpemUgdGhpcyBiYXNlZCBvbiB0aGUgcmVuZGVyIG1ldGhvZCwgaWYgaXQKKyAgICAgIC8vIG1hdHRlcmVkLgorICAgICAgaWYgKE9wLkNsYXNzLT5pc1JlZ2lzdGVyQ2xhc3MoKSkKKyAgICAgICAgU2lnbmF0dXJlICs9ICJSZWciOworICAgICAgZWxzZQorICAgICAgICBTaWduYXR1cmUgKz0gT3AuQ2xhc3MtPkNsYXNzTmFtZTsKKyAgICAgIFNpZ25hdHVyZSArPSB1dG9zdHIoT3AuT3BlcmFuZEluZm8tPk1JTnVtT3BlcmFuZHMpOworICAgICAgU2lnbmF0dXJlICs9ICJfIiArIHV0b3N0cihNSU9wZXJhbmRMaXN0W2ldLnNlY29uZCk7CisKKyAgICAgIEN1ckluZGV4ICs9IE9wLk9wZXJhbmRJbmZvLT5NSU51bU9wZXJhbmRzOworICAgIH0KKworICAgIC8vIEFkZCBhbnkgdHJhaWxpbmcgaW1wbGljaXQgb3BlcmFuZHMuCisgICAgZm9yICg7IEN1ckluZGV4ICE9IE51bU1JT3BlcmFuZHM7ICsrQ3VySW5kZXgpIHsKKyAgICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+ICpUaWUgPSBHZXRUaWVkT3BlcmFuZEF0SW5kZXgoVGllZE9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJJbmRleCk7CisgICAgICBpZiAoIVRpZSkKKyAgICAgICAgU2lnbmF0dXJlICs9ICJfX0ltcCI7CisgICAgICBlbHNlCisgICAgICAgIFNpZ25hdHVyZSArPSAiX19UaWUiICsgdXRvc3RyKFRpZS0+c2Vjb25kKTsKKyAgICB9CisKKyAgICBJSS5Db252ZXJzaW9uRm5LaW5kID0gU2lnbmF0dXJlOworCisgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZCB0aGlzIHNpZ25hdHVyZS4KKyAgICBpZiAoIUdlbmVyYXRlZEZucy5pbnNlcnQoU2lnbmF0dXJlKS5zZWNvbmQpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIElmIG5vdCwgZW1pdCBpdCBub3cuCisKKyAgICAvLyBBZGQgdG8gdGhlIGVudW0gbGlzdC4KKyAgICBPUyA8PCAiICAiIDw8IFNpZ25hdHVyZSA8PCAiLFxuIjsKKworICAgIC8vIEFuZCB0byB0aGUgY29udmVydCBmdW5jdGlvbi4KKyAgICBDdnRPUyA8PCAiICBjYXNlICIgPDwgU2lnbmF0dXJlIDw8ICI6XG4iOworICAgIEN1ckluZGV4ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUlPcGVyYW5kTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBJbnN0cnVjdGlvbkluZm86Ok9wZXJhbmQgJk9wID0gSUkuT3BlcmFuZHNbTUlPcGVyYW5kTGlzdFtpXS5zZWNvbmRdOworCisgICAgICAvLyBBZGQgdGhlIGltcGxpY2l0IG9wZXJhbmRzLgorICAgICAgZm9yICg7IEN1ckluZGV4ICE9IE9wLk9wZXJhbmRJbmZvLT5NSU9wZXJhbmRObzsgKytDdXJJbmRleCkgeworICAgICAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIHRpZWQgb3BlcmFuZC4KKyAgICAgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gKlRpZSA9IEdldFRpZWRPcGVyYW5kQXRJbmRleChUaWVkT3BlcmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VySW5kZXgpOworCisgICAgICAgIGlmICghVGllKSB7CisgICAgICAgICAgLy8gSWYgbm90LCB0aGlzIGlzIHNvbWUgaW1wbGljaXQgb3BlcmFuZC4gSnVzdCBhc3N1bWUgaXQgaXMgYSByZWdpc3RlcgorICAgICAgICAgIC8vIGZvciBub3cuCisgICAgICAgICAgQ3Z0T1MgPDwgIiAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpDcmVhdGVSZWcoMCkpO1xuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBDb3B5IHRoZSB0aWVkIG9wZXJhbmQuCisgICAgICAgICAgYXNzZXJ0KFRpZS0+Zmlyc3Q+VGllLT5zZWNvbmQgJiYgIlRpZWQgb3BlcmFuZCBwcmVjZWVkcyBpdHMgdGFyZ2V0ISIpOworICAgICAgICAgIEN2dE9TIDw8ICIgICAgSW5zdC5hZGRPcGVyYW5kKEluc3QuZ2V0T3BlcmFuZCgiCisgICAgICAgICAgICAgICAgPDwgVGllLT5zZWNvbmQgPDwgIikpO1xuIjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBDdnRPUyA8PCAiICAgICgoIiA8PCBUYXJnZXRPcGVyYW5kQ2xhc3MgPDwgIiopT3BlcmFuZHNbIgorICAgICAgICAgPDwgTUlPcGVyYW5kTGlzdFtpXS5zZWNvbmQgCisgICAgICAgICA8PCAiXSktPiIgPDwgT3AuQ2xhc3MtPlJlbmRlck1ldGhvZCAKKyAgICAgICAgIDw8ICIoSW5zdCwgIiA8PCBPcC5PcGVyYW5kSW5mby0+TUlOdW1PcGVyYW5kcyA8PCAiKTtcbiI7CisgICAgICBDdXJJbmRleCArPSBPcC5PcGVyYW5kSW5mby0+TUlOdW1PcGVyYW5kczsKKyAgICB9CisgICAgCisgICAgLy8gQW5kIGFkZCB0cmFpbGluZyBpbXBsaWNpdCBvcGVyYW5kcy4KKyAgICBmb3IgKDsgQ3VySW5kZXggIT0gTnVtTUlPcGVyYW5kczsgKytDdXJJbmRleCkgeworICAgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gKlRpZSA9IEdldFRpZWRPcGVyYW5kQXRJbmRleChUaWVkT3BlcmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckluZGV4KTsKKworICAgICAgaWYgKCFUaWUpIHsKKyAgICAgICAgLy8gSWYgbm90LCB0aGlzIGlzIHNvbWUgaW1wbGljaXQgb3BlcmFuZC4gSnVzdCBhc3N1bWUgaXQgaXMgYSByZWdpc3RlcgorICAgICAgICAvLyBmb3Igbm93LgorICAgICAgICBDdnRPUyA8PCAiICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OkNyZWF0ZVJlZygwKSk7XG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ29weSB0aGUgdGllZCBvcGVyYW5kLgorICAgICAgICBhc3NlcnQoVGllLT5maXJzdD5UaWUtPnNlY29uZCAmJiAiVGllZCBvcGVyYW5kIHByZWNlZWRzIGl0cyB0YXJnZXQhIik7CisgICAgICAgIEN2dE9TIDw8ICIgICAgSW5zdC5hZGRPcGVyYW5kKEluc3QuZ2V0T3BlcmFuZCgiCisgICAgICAgICAgICAgIDw8IFRpZS0+c2Vjb25kIDw8ICIpKTtcbiI7CisgICAgICB9CisgICAgfQorCisgICAgQ3Z0T1MgPDwgIiAgICByZXR1cm47XG4iOworICB9CisKKyAgLy8gRmluaXNoIHRoZSBjb252ZXJ0IGZ1bmN0aW9uLgorCisgIEN2dE9TIDw8ICIgIH1cbiI7CisgIEN2dE9TIDw8ICJ9XG5cbiI7CisKKyAgLy8gRmluaXNoIHRoZSBlbnVtLCBhbmQgZHJvcCB0aGUgY29udmVydCBmdW5jdGlvbiBhZnRlciBpdC4KKworICBPUyA8PCAiICBOdW1Db252ZXJzaW9uVmFyaWFudHNcbiI7CisgIE9TIDw8ICJ9O1xuXG4iOworICAKKyAgT1MgPDwgQ3Z0T1Muc3RyKCk7Cit9CisKKy8vLyBFbWl0TWF0Y2hDbGFzc0VudW1lcmF0aW9uIC0gRW1pdCB0aGUgZW51bWVyYXRpb24gZm9yIG1hdGNoIGNsYXNzIGtpbmRzLgorc3RhdGljIHZvaWQgRW1pdE1hdGNoQ2xhc3NFbnVtZXJhdGlvbihDb2RlR2VuVGFyZ2V0ICZUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENsYXNzSW5mbyo+ICZJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICJuYW1lc3BhY2Uge1xuXG4iOworCisgIE9TIDw8ICIvLy8gTWF0Y2hDbGFzc0tpbmQgLSBUaGUga2luZHMgb2YgY2xhc3NlcyB3aGljaCBwYXJ0aWNpcGF0ZSBpblxuIgorICAgICA8PCAiLy8vIGluc3RydWN0aW9uIG1hdGNoaW5nLlxuIjsKKyAgT1MgPDwgImVudW0gTWF0Y2hDbGFzc0tpbmQge1xuIjsKKyAgT1MgPDwgIiAgSW52YWxpZE1hdGNoQ2xhc3MgPSAwLFxuIjsKKyAgZm9yIChzdGQ6OnZlY3RvcjxDbGFzc0luZm8qPjo6aXRlcmF0b3IgaXQgPSBJbmZvcy5iZWdpbigpLCAKKyAgICAgICAgIGllID0gSW5mb3MuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgQ2xhc3NJbmZvICZDSSA9ICoqaXQ7CisgICAgT1MgPDwgIiAgIiA8PCBDSS5OYW1lIDw8ICIsIC8vICI7CisgICAgaWYgKENJLktpbmQgPT0gQ2xhc3NJbmZvOjpUb2tlbikgeworICAgICAgT1MgPDwgIiciIDw8IENJLlZhbHVlTmFtZSA8PCAiJ1xuIjsKKyAgICB9IGVsc2UgaWYgKENJLmlzUmVnaXN0ZXJDbGFzcygpKSB7CisgICAgICBpZiAoIUNJLlZhbHVlTmFtZS5lbXB0eSgpKQorICAgICAgICBPUyA8PCAicmVnaXN0ZXIgY2xhc3MgJyIgPDwgQ0kuVmFsdWVOYW1lIDw8ICInXG4iOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiZGVyaXZlZCByZWdpc3RlciBjbGFzc1xuIjsKKyAgICB9IGVsc2UgeworICAgICAgT1MgPDwgInVzZXIgZGVmaW5lZCBjbGFzcyAnIiA8PCBDSS5WYWx1ZU5hbWUgPDwgIidcbiI7CisgICAgfQorICB9CisgIE9TIDw8ICIgIE51bU1hdGNoQ2xhc3NLaW5kc1xuIjsKKyAgT1MgPDwgIn07XG5cbiI7CisKKyAgT1MgPDwgIn1cblxuIjsKK30KKworLy8vIEVtaXRDbGFzc2lmeU9wZXJhbmQgLSBFbWl0IHRoZSBmdW5jdGlvbiB0byBjbGFzc2lmeSBhbiBvcGVyYW5kLgorc3RhdGljIHZvaWQgRW1pdENsYXNzaWZ5T3BlcmFuZChDb2RlR2VuVGFyZ2V0ICZUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzbU1hdGNoZXJJbmZvICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgInN0YXRpYyBNYXRjaENsYXNzS2luZCBDbGFzc2lmeU9wZXJhbmQoTUNQYXJzZWRBc21PcGVyYW5kICpHT3ApIHtcbiIKKyAgICAgPDwgIiAgIiA8PCBUYXJnZXQuZ2V0TmFtZSgpIDw8ICJPcGVyYW5kICZPcGVyYW5kID0gKigiCisgICAgIDw8IFRhcmdldC5nZXROYW1lKCkgPDwgIk9wZXJhbmQqKUdPcDtcbiI7CisKKyAgLy8gQ2xhc3NpZnkgdG9rZW5zLgorICBPUyA8PCAiICBpZiAoT3BlcmFuZC5pc1Rva2VuKCkpXG4iOworICBPUyA8PCAiICAgIHJldHVybiBNYXRjaFRva2VuU3RyaW5nKE9wZXJhbmQuZ2V0VG9rZW4oKSk7XG5cbiI7CisKKyAgLy8gQ2xhc3NpZnkgcmVnaXN0ZXJzLgorICAvLworICAvLyBGSVhNRTogRG9uJ3QgaGFyZGNvZGUgaXNSZWcsIGdldFJlZy4KKyAgT1MgPDwgIiAgaWYgKE9wZXJhbmQuaXNSZWcoKSkge1xuIjsKKyAgT1MgPDwgIiAgICBzd2l0Y2ggKE9wZXJhbmQuZ2V0UmVnKCkpIHtcbiI7CisgIE9TIDw8ICIgICAgZGVmYXVsdDogcmV0dXJuIEludmFsaWRNYXRjaENsYXNzO1xuIjsKKyAgZm9yIChzdGQ6Om1hcDxSZWNvcmQqLCBDbGFzc0luZm8qPjo6aXRlcmF0b3IgCisgICAgICAgICBpdCA9IEluZm8uUmVnaXN0ZXJDbGFzc2VzLmJlZ2luKCksIGllID0gSW5mby5SZWdpc3RlckNsYXNzZXMuZW5kKCk7CisgICAgICAgaXQgIT0gaWU7ICsraXQpCisgICAgT1MgPDwgIiAgICBjYXNlICIgPDwgVGFyZ2V0LmdldE5hbWUoKSA8PCAiOjoiIAorICAgICAgIDw8IGl0LT5maXJzdC0+Z2V0TmFtZSgpIDw8ICI6IHJldHVybiAiIDw8IGl0LT5zZWNvbmQtPk5hbWUgPDwgIjtcbiI7CisgIE9TIDw8ICIgICAgfVxuIjsKKyAgT1MgPDwgIiAgfVxuXG4iOworCisgIC8vIENsYXNzaWZ5IHVzZXIgZGVmaW5lZCBvcGVyYW5kcy4KKyAgZm9yIChzdGQ6OnZlY3RvcjxDbGFzc0luZm8qPjo6aXRlcmF0b3IgaXQgPSBJbmZvLkNsYXNzZXMuYmVnaW4oKSwgCisgICAgICAgICBpZSA9IEluZm8uQ2xhc3Nlcy5lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKKyAgICBDbGFzc0luZm8gJkNJID0gKippdDsKKworICAgIGlmICghQ0kuaXNVc2VyQ2xhc3MoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgT1MgPDwgIiAgLy8gJyIgPDwgQ0kuQ2xhc3NOYW1lIDw8ICInIGNsYXNzIjsKKyAgICBpZiAoIUNJLlN1cGVyQ2xhc3Nlcy5lbXB0eSgpKSB7CisgICAgICBPUyA8PCAiLCBzdWJjbGFzcyBvZiAiOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENJLlN1cGVyQ2xhc3Nlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIGlmIChpKSBPUyA8PCAiLCAiOworICAgICAgICBPUyA8PCAiJyIgPDwgQ0kuU3VwZXJDbGFzc2VzW2ldLT5DbGFzc05hbWUgPDwgIiciOworICAgICAgICBhc3NlcnQoQ0kgPCAqQ0kuU3VwZXJDbGFzc2VzW2ldICYmICJJbnZhbGlkIGNsYXNzIHJlbGF0aW9uISIpOworICAgICAgfQorICAgIH0KKyAgICBPUyA8PCAiXG4iOworCisgICAgT1MgPDwgIiAgaWYgKE9wZXJhbmQuIiA8PCBDSS5QcmVkaWNhdGVNZXRob2QgPDwgIigpKSB7XG4iOworICAgICAgCisgICAgLy8gVmFsaWRhdGUgc3ViY2xhc3MgcmVsYXRpb25zaGlwcy4KKyAgICBpZiAoIUNJLlN1cGVyQ2xhc3Nlcy5lbXB0eSgpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ0kuU3VwZXJDbGFzc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIE9TIDw8ICIgICAgYXNzZXJ0KE9wZXJhbmQuIiA8PCBDSS5TdXBlckNsYXNzZXNbaV0tPlByZWRpY2F0ZU1ldGhvZAorICAgICAgICAgICA8PCAiKCkgJiYgXCJJbnZhbGlkIGNsYXNzIHJlbGF0aW9uc2hpcCFcIik7XG4iOworICAgIH0KKworICAgIE9TIDw8ICIgICAgcmV0dXJuICIgPDwgQ0kuTmFtZSA8PCAiO1xuIjsKKyAgICBPUyA8PCAiICB9XG5cbiI7CisgIH0KKyAgT1MgPDwgIiAgcmV0dXJuIEludmFsaWRNYXRjaENsYXNzO1xuIjsKKyAgT1MgPDwgIn1cblxuIjsKK30KKworLy8vIEVtaXRJc1N1YmNsYXNzIC0gRW1pdCB0aGUgc3ViY2xhc3MgcHJlZGljYXRlIGZ1bmN0aW9uLgorc3RhdGljIHZvaWQgRW1pdElzU3ViY2xhc3MoQ29kZUdlblRhcmdldCAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhc3NJbmZvKj4gJkluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICIvLy8gSXNTdWJjbGFzcyAtIENvbXB1dGUgd2hldGhlciBcXGFyZyBBIGlzIGEgc3ViY2xhc3Mgb2YgXFxhcmcgQi5cbiI7CisgIE9TIDw8ICJzdGF0aWMgYm9vbCBJc1N1YmNsYXNzKE1hdGNoQ2xhc3NLaW5kIEEsIE1hdGNoQ2xhc3NLaW5kIEIpIHtcbiI7CisgIE9TIDw8ICIgIGlmIChBID09IEIpXG4iOworICBPUyA8PCAiICAgIHJldHVybiB0cnVlO1xuXG4iOworCisgIE9TIDw8ICIgIHN3aXRjaCAoQSkge1xuIjsKKyAgT1MgPDwgIiAgZGVmYXVsdDpcbiI7CisgIE9TIDw8ICIgICAgcmV0dXJuIGZhbHNlO1xuIjsKKyAgZm9yIChzdGQ6OnZlY3RvcjxDbGFzc0luZm8qPjo6aXRlcmF0b3IgaXQgPSBJbmZvcy5iZWdpbigpLCAKKyAgICAgICAgIGllID0gSW5mb3MuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgQ2xhc3NJbmZvICZBID0gKippdDsKKworICAgIGlmIChBLktpbmQgIT0gQ2xhc3NJbmZvOjpUb2tlbikgeworICAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBTdXBlckNsYXNzZXM7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPENsYXNzSW5mbyo+OjppdGVyYXRvciBpdCA9IEluZm9zLmJlZ2luKCksIAorICAgICAgICAgICAgIGllID0gSW5mb3MuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgICAgIENsYXNzSW5mbyAmQiA9ICoqaXQ7CisKKyAgICAgICAgaWYgKCZBICE9ICZCICYmIEEuaXNTdWJzZXRPZihCKSkKKyAgICAgICAgICBTdXBlckNsYXNzZXMucHVzaF9iYWNrKEIuTmFtZSk7CisgICAgICB9CisKKyAgICAgIGlmIChTdXBlckNsYXNzZXMuZW1wdHkoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIE9TIDw8ICJcbiAgY2FzZSAiIDw8IEEuTmFtZSA8PCAiOlxuIjsKKworICAgICAgaWYgKFN1cGVyQ2xhc3Nlcy5zaXplKCkgPT0gMSkgeworICAgICAgICBPUyA8PCAiICAgIHJldHVybiBCID09ICIgPDwgU3VwZXJDbGFzc2VzLmJhY2soKSA8PCAiO1xuIjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIE9TIDw8ICIgICAgc3dpdGNoIChCKSB7XG4iOworICAgICAgT1MgPDwgIiAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4iOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN1cGVyQ2xhc3Nlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBPUyA8PCAiICAgIGNhc2UgIiA8PCBTdXBlckNsYXNzZXNbaV0gPDwgIjogcmV0dXJuIHRydWU7XG4iOworICAgICAgT1MgPDwgIiAgICB9XG4iOworICAgIH0KKyAgfQorICBPUyA8PCAiICB9XG4iOworICBPUyA8PCAifVxuXG4iOworfQorCit0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IFN0cmluZ1BhaXI7CisKKy8vLyBGaW5kRmlyc3ROb25Db21tb25MZXR0ZXIgLSBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGtleXMgb2YgdGhlCisvLy8gc3RyaW5nIHBhaXJzIHRoYXQgaXMgbm90IHNoYXJlZCBhY3Jvc3MgdGhlIHdob2xlIHNldCBvZiBzdHJpbmdzLiAgQWxsCisvLy8gc3RyaW5ncyBhcmUgYXNzdW1lZCB0byBoYXZlIHRoZSBzYW1lIGxlbmd0aC4KK3N0YXRpYyB1bnNpZ25lZCAKK0ZpbmRGaXJzdE5vbkNvbW1vbkxldHRlcihjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBTdHJpbmdQYWlyKj4gJk1hdGNoZXMpIHsKKyAgYXNzZXJ0KCFNYXRjaGVzLmVtcHR5KCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTWF0Y2hlc1swXS0+Zmlyc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIC8vIENoZWNrIHRvIHNlZSBpZiBsZXR0ZXIgaSBpcyB0aGUgc2FtZSBhY3Jvc3MgdGhlIHNldC4KKyAgICBjaGFyIExldHRlciA9IE1hdGNoZXNbMF0tPmZpcnN0W2ldOworICAgIAorICAgIGZvciAodW5zaWduZWQgc3RyID0gMCwgZSA9IE1hdGNoZXMuc2l6ZSgpOyBzdHIgIT0gZTsgKytzdHIpCisgICAgICBpZiAoTWF0Y2hlc1tzdHJdLT5maXJzdFtpXSAhPSBMZXR0ZXIpCisgICAgICAgIHJldHVybiBpOworICB9CisgIAorICByZXR1cm4gTWF0Y2hlc1swXS0+Zmlyc3Quc2l6ZSgpOworfQorCisvLy8gRW1pdFN0cmluZ01hdGNoZXJGb3JDaGFyIC0gR2l2ZW4gYSBzZXQgb2Ygc3RyaW5ncyB0aGF0IGFyZSBrbm93biB0byBiZSB0aGUKKy8vLyBzYW1lIGxlbmd0aCBhbmQgd2hvc2UgY2hhcmFjdGVycyBsZWFkaW5nIHVwIHRvIENoYXJObyBhcmUgdGhlIHNhbWUsIGVtaXQKKy8vLyBjb2RlIHRvIHZlcmlmeSB0aGF0IENoYXJObyBhbmQgbGF0ZXIgYXJlIHRoZSBzYW1lLgorLy8vCisvLy8gXHJldHVybiAtIFRydWUgaWYgY29udHJvbCBjYW4gbGVhdmUgdGhlIGVtaXR0ZWQgY29kZSBmcmFnbWVudC4KK3N0YXRpYyBib29sIEVtaXRTdHJpbmdNYXRjaGVyRm9yQ2hhcihjb25zdCBzdGQ6OnN0cmluZyAmU3RyVmFyaWFibGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IFN0cmluZ1BhaXIqPiAmTWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDaGFyTm8sIHVuc2lnbmVkIEluZGVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgeworICBhc3NlcnQoIU1hdGNoZXMuZW1wdHkoKSAmJiAiTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdHJpbmcgdG8gbWF0Y2ghIik7CisgIHN0ZDo6c3RyaW5nIEluZGVudChJbmRlbnRDb3VudCoyKzQsICcgJyk7CisKKyAgLy8gSWYgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHRoZSBlbnRpcmUgc3RyaW5nIG1hdGNoZXMsIHdlJ3JlIGRvbmU6IG91dHB1dCB0aGUKKyAgLy8gbWF0Y2hpbmcgY29kZS4KKyAgaWYgKENoYXJObyA9PSBNYXRjaGVzWzBdLT5maXJzdC5zaXplKCkpIHsKKyAgICBhc3NlcnQoTWF0Y2hlcy5zaXplKCkgPT0gMSAmJiAiSGFkIGR1cGxpY2F0ZSBrZXlzIHRvIG1hdGNoIG9uIik7CisgICAgCisgICAgLy8gRklYTUU6IElmIE1hdGNoZXNbMF0uZmlyc3QgaGFzIGVtYmVkZWQgXG4sIHRoaXMgd2lsbCBiZSBiYWQuCisgICAgT1MgPDwgSW5kZW50IDw8IE1hdGNoZXNbMF0tPnNlY29uZCA8PCAiXHQgLy8gXCIiIDw8IE1hdGNoZXNbMF0tPmZpcnN0CisgICAgICAgPDwgIlwiXG4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgLy8gQnVja2V0IHRoZSBtYXRjaGVzIGJ5IHRoZSBjaGFyYWN0ZXIgd2UgYXJlIGNvbXBhcmluZy4KKyAgc3RkOjptYXA8Y2hhciwgc3RkOjp2ZWN0b3I8Y29uc3QgU3RyaW5nUGFpcio+ID4gTWF0Y2hlc0J5TGV0dGVyOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1hdGNoZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBNYXRjaGVzQnlMZXR0ZXJbTWF0Y2hlc1tpXS0+Zmlyc3RbQ2hhck5vXV0ucHVzaF9iYWNrKE1hdGNoZXNbaV0pOworICAKKworICAvLyBJZiB3ZSBoYXZlIGV4YWN0bHkgb25lIGJ1Y2tldCB0byBtYXRjaCwgc2VlIGhvdyBtYW55IGNoYXJhY3RlcnMgYXJlIGNvbW1vbgorICAvLyBhY3Jvc3MgdGhlIHdob2xlIHNldCBhbmQgbWF0Y2ggYWxsIG9mIHRoZW0gYXQgb25jZS4KKyAgaWYgKE1hdGNoZXNCeUxldHRlci5zaXplKCkgPT0gMSkgeworICAgIHVuc2lnbmVkIEZpcnN0Tm9uQ29tbW9uTGV0dGVyID0gRmluZEZpcnN0Tm9uQ29tbW9uTGV0dGVyKE1hdGNoZXMpOworICAgIHVuc2lnbmVkIE51bUNoYXJzID0gRmlyc3ROb25Db21tb25MZXR0ZXItQ2hhck5vOworICAgIAorICAgIC8vIEVtaXQgY29kZSB0byBicmVhayBvdXQgaWYgdGhlIHByZWZpeCBkb2Vzbid0IG1hdGNoLgorICAgIGlmIChOdW1DaGFycyA9PSAxKSB7CisgICAgICAvLyBEbyB0aGUgY29tcGFyaXNvbiB3aXRoIGlmIChTdHJbMV0gIT0gJ2YnKQorICAgICAgLy8gRklYTUU6IE5lZWQgdG8gZXNjYXBlIGdlbmVyYWwgY2hhcmFjdGVycy4KKyAgICAgIE9TIDw8IEluZGVudCA8PCAiaWYgKCIgPDwgU3RyVmFyaWFibGVOYW1lIDw8ICJbIiA8PCBDaGFyTm8gPDwgIl0gIT0gJyIKKyAgICAgICAgIDw8IE1hdGNoZXNbMF0tPmZpcnN0W0NoYXJOb10gPDwgIicpXG4iOworICAgICAgT1MgPDwgSW5kZW50IDw8ICIgIGJyZWFrO1xuIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRG8gdGhlIGNvbXBhcmlzb24gd2l0aCBpZiAoU3RyLnN1YnN0cigxLDMpICE9ICJmb28iKS4gICAgCisgICAgICAvLyBGSVhNRTogTmVlZCB0byBlc2NhcGUgZ2VuZXJhbCBzdHJpbmdzLgorICAgICAgT1MgPDwgSW5kZW50IDw8ICJpZiAoIiA8PCBTdHJWYXJpYWJsZU5hbWUgPDwgIi5zdWJzdHIoIiA8PCBDaGFyTm8gPDwgIiwiCisgICAgICAgICA8PCBOdW1DaGFycyA8PCAiKSAhPSBcIiI7CisgICAgICBPUyA8PCBNYXRjaGVzWzBdLT5maXJzdC5zdWJzdHIoQ2hhck5vLCBOdW1DaGFycykgPDwgIlwiKVxuIjsKKyAgICAgIE9TIDw8IEluZGVudCA8PCAiICBicmVhaztcbiI7CisgICAgfQorICAgIAorICAgIHJldHVybiBFbWl0U3RyaW5nTWF0Y2hlckZvckNoYXIoU3RyVmFyaWFibGVOYW1lLCBNYXRjaGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0Tm9uQ29tbW9uTGV0dGVyLCBJbmRlbnRDb3VudCwgT1MpOworICB9CisgIAorICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgbXVsdGlwbGUgcG9zc2libGUgdGhpbmdzLCBlbWl0IGEgc3dpdGNoIG9uIHRoZQorICAvLyBjaGFyYWN0ZXIuCisgIE9TIDw8IEluZGVudCA8PCAic3dpdGNoICgiIDw8IFN0clZhcmlhYmxlTmFtZSA8PCAiWyIgPDwgQ2hhck5vIDw8ICJdKSB7XG4iOworICBPUyA8PCBJbmRlbnQgPDwgImRlZmF1bHQ6IGJyZWFrO1xuIjsKKyAgCisgIGZvciAoc3RkOjptYXA8Y2hhciwgc3RkOjp2ZWN0b3I8Y29uc3QgU3RyaW5nUGFpcio+ID46Oml0ZXJhdG9yIExJID0gCisgICAgICAgTWF0Y2hlc0J5TGV0dGVyLmJlZ2luKCksIEUgPSBNYXRjaGVzQnlMZXR0ZXIuZW5kKCk7IExJICE9IEU7ICsrTEkpIHsKKyAgICAvLyBUT0RPOiBlc2NhcGUgaGFyZCBzdHVmZiAobGlrZSBcbikgaWYgd2UgZXZlciBjYXJlIGFib3V0IGl0LgorICAgIE9TIDw8IEluZGVudCA8PCAiY2FzZSAnIiA8PCBMSS0+Zmlyc3QgPDwgIic6XHQgLy8gIgorICAgICAgIDw8IExJLT5zZWNvbmQuc2l6ZSgpIDw8ICIgc3RyaW5ncyB0byBtYXRjaC5cbiI7CisgICAgaWYgKEVtaXRTdHJpbmdNYXRjaGVyRm9yQ2hhcihTdHJWYXJpYWJsZU5hbWUsIExJLT5zZWNvbmQsIENoYXJObysxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZW50Q291bnQrMSwgT1MpKQorICAgICAgT1MgPDwgSW5kZW50IDw8ICIgIGJyZWFrO1xuIjsKKyAgfQorICAKKyAgT1MgPDwgSW5kZW50IDw8ICJ9XG4iOworICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8gRW1pdFN0cmluZ01hdGNoZXIgLSBHaXZlbiBhIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgY29kZSB0byBleGVjdXRlIHdoZW4gdGhleQorLy8vIG1hdGNoLCBvdXRwdXQgYSBzaW1wbGUgc3dpdGNoIHRyZWUgdG8gY2xhc3NpZnkgdGhlIGlucHV0IHN0cmluZy4KKy8vLyAKKy8vLyBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgY29kZSBpbiBWYWxzW2ldLnNlY29uZCBpcyBleGVjdXRlZDsgY29udHJvbCBtdXN0CisvLy8gbm90IGV4aXQgdGhpcyBjb2RlIGZyYWdtZW50LiAgSWYgbm90aGluZyBtYXRjaGVzLCBleGVjdXRpb24gZmFsbHMgdGhyb3VnaC4KKy8vLworLy8vIFxwYXJhbSBTdHJWYXJpYWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gdGVzdC4KK3N0YXRpYyB2b2lkIEVtaXRTdHJpbmdNYXRjaGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHJWYXJpYWJsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdHJpbmdQYWlyPiAmTWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgeworICAvLyBGaXJzdCBsZXZlbCBjYXRlZ29yaXphdGlvbjogZ3JvdXAgc3RyaW5ncyBieSBsZW5ndGguCisgIHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnZlY3Rvcjxjb25zdCBTdHJpbmdQYWlyKj4gPiBNYXRjaGVzQnlMZW5ndGg7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTWF0Y2hlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE1hdGNoZXNCeUxlbmd0aFtNYXRjaGVzW2ldLmZpcnN0LnNpemUoKV0ucHVzaF9iYWNrKCZNYXRjaGVzW2ldKTsKKyAgCisgIC8vIE91dHB1dCBhIHN3aXRjaCBzdGF0ZW1lbnQgb24gbGVuZ3RoIGFuZCBjYXRlZ29yaXplIHRoZSBlbGVtZW50cyB3aXRoaW4gZWFjaAorICAvLyBiaW4uCisgIE9TIDw8ICIgIHN3aXRjaCAoIiA8PCBTdHJWYXJpYWJsZU5hbWUgPDwgIi5zaXplKCkpIHtcbiI7CisgIE9TIDw8ICIgIGRlZmF1bHQ6IGJyZWFrO1xuIjsKKyAgCisgIGZvciAoc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6dmVjdG9yPGNvbnN0IFN0cmluZ1BhaXIqPiA+OjppdGVyYXRvciBMSSA9CisgICAgICAgTWF0Y2hlc0J5TGVuZ3RoLmJlZ2luKCksIEUgPSBNYXRjaGVzQnlMZW5ndGguZW5kKCk7IExJICE9IEU7ICsrTEkpIHsKKyAgICBPUyA8PCAiICBjYXNlICIgPDwgTEktPmZpcnN0IDw8ICI6XHQgLy8gIiA8PCBMSS0+c2Vjb25kLnNpemUoKQorICAgICAgIDw8ICIgc3RyaW5ncyB0byBtYXRjaC5cbiI7CisgICAgaWYgKEVtaXRTdHJpbmdNYXRjaGVyRm9yQ2hhcihTdHJWYXJpYWJsZU5hbWUsIExJLT5zZWNvbmQsIDAsIDAsIE9TKSkKKyAgICAgIE9TIDw8ICIgICAgYnJlYWs7XG4iOworICB9CisgIAorICBPUyA8PCAiICB9XG4iOworfQorCisKKy8vLyBFbWl0TWF0Y2hUb2tlblN0cmluZyAtIEVtaXQgdGhlIGZ1bmN0aW9uIHRvIG1hdGNoIGEgdG9rZW4gc3RyaW5nIHRvIHRoZQorLy8vIGFwcHJvcHJpYXRlIG1hdGNoIGNsYXNzIHZhbHVlLgorc3RhdGljIHZvaWQgRW1pdE1hdGNoVG9rZW5TdHJpbmcoQ29kZUdlblRhcmdldCAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhc3NJbmZvKj4gJkluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSB7CisgIC8vIENvbnN0cnVjdCB0aGUgbWF0Y2ggbGlzdC4KKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUGFpcj4gTWF0Y2hlczsKKyAgZm9yIChzdGQ6OnZlY3RvcjxDbGFzc0luZm8qPjo6aXRlcmF0b3IgaXQgPSBJbmZvcy5iZWdpbigpLCAKKyAgICAgICAgIGllID0gSW5mb3MuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgQ2xhc3NJbmZvICZDSSA9ICoqaXQ7CisKKyAgICBpZiAoQ0kuS2luZCA9PSBDbGFzc0luZm86OlRva2VuKQorICAgICAgTWF0Y2hlcy5wdXNoX2JhY2soU3RyaW5nUGFpcihDSS5WYWx1ZU5hbWUsICJyZXR1cm4gIiArIENJLk5hbWUgKyAiOyIpKTsKKyAgfQorCisgIE9TIDw8ICJzdGF0aWMgTWF0Y2hDbGFzc0tpbmQgTWF0Y2hUb2tlblN0cmluZyhTdHJpbmdSZWYgTmFtZSkge1xuIjsKKworICBFbWl0U3RyaW5nTWF0Y2hlcigiTmFtZSIsIE1hdGNoZXMsIE9TKTsKKworICBPUyA8PCAiICByZXR1cm4gSW52YWxpZE1hdGNoQ2xhc3M7XG4iOworICBPUyA8PCAifVxuXG4iOworfQorCisvLy8gRW1pdE1hdGNoUmVnaXN0ZXJOYW1lIC0gRW1pdCB0aGUgZnVuY3Rpb24gdG8gbWF0Y2ggYSBzdHJpbmcgdG8gdGhlIHRhcmdldAorLy8vIHNwZWNpZmljIHJlZ2lzdGVyIGVudW0uCitzdGF0aWMgdm9pZCBFbWl0TWF0Y2hSZWdpc3Rlck5hbWUoQ29kZUdlblRhcmdldCAmVGFyZ2V0LCBSZWNvcmQgKkFzbVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gQ29uc3RydWN0IHRoZSBtYXRjaCBsaXN0LgorICBzdGQ6OnZlY3RvcjxTdHJpbmdQYWlyPiBNYXRjaGVzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVGFyZ2V0LmdldFJlZ2lzdGVycygpLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBDb2RlR2VuUmVnaXN0ZXIgJlJlZyA9IFRhcmdldC5nZXRSZWdpc3RlcnMoKVtpXTsKKyAgICBpZiAoUmVnLlRoZURlZi0+Z2V0VmFsdWVBc1N0cmluZygiQXNtTmFtZSIpLmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKworICAgIE1hdGNoZXMucHVzaF9iYWNrKFN0cmluZ1BhaXIoUmVnLlRoZURlZi0+Z2V0VmFsdWVBc1N0cmluZygiQXNtTmFtZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybiAiICsgdXRvc3RyKGkgKyAxKSArICI7IikpOworICB9CisgIAorICBPUyA8PCAic3RhdGljIHVuc2lnbmVkIE1hdGNoUmVnaXN0ZXJOYW1lKFN0cmluZ1JlZiBOYW1lKSB7XG4iOworCisgIEVtaXRTdHJpbmdNYXRjaGVyKCJOYW1lIiwgTWF0Y2hlcywgT1MpOworICAKKyAgT1MgPDwgIiAgcmV0dXJuIDA7XG4iOworICBPUyA8PCAifVxuXG4iOworfQorCisvLy8gRW1pdFN1YnRhcmdldEZlYXR1cmVGbGFnRW51bWVyYXRpb24gLSBFbWl0IHRoZSBzdWJ0YXJnZXQgZmVhdHVyZSBmbGFnCisvLy8gZGVmaW5pdGlvbnMuCitzdGF0aWMgdm9pZCBFbWl0U3VidGFyZ2V0RmVhdHVyZUZsYWdFbnVtZXJhdGlvbihDb2RlR2VuVGFyZ2V0ICZUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc21NYXRjaGVySW5mbyAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgeworICBPUyA8PCAiLy8gRmxhZ3MgZm9yIHN1YnRhcmdldCBmZWF0dXJlcyB0aGF0IHBhcnRpY2lwYXRlIGluICIKKyAgICAgPDwgImluc3RydWN0aW9uIG1hdGNoaW5nLlxuIjsKKyAgT1MgPDwgImVudW0gU3VidGFyZ2V0RmVhdHVyZUZsYWcge1xuIjsKKyAgZm9yIChzdGQ6Om1hcDxSZWNvcmQqLCBTdWJ0YXJnZXRGZWF0dXJlSW5mbyo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgaXQgPSBJbmZvLlN1YnRhcmdldEZlYXR1cmVzLmJlZ2luKCksCisgICAgICAgICBpZSA9IEluZm8uU3VidGFyZ2V0RmVhdHVyZXMuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CisgICAgU3VidGFyZ2V0RmVhdHVyZUluZm8gJlNGSSA9ICppdC0+c2Vjb25kOworICAgIE9TIDw8ICIgICIgPDwgU0ZJLkVudW1OYW1lIDw8ICIgPSAoMSA8PCAiIDw8IFNGSS5JbmRleCA8PCAiKSxcbiI7CisgIH0KKyAgT1MgPDwgIiAgRmVhdHVyZV9Ob25lID0gMFxuIjsKKyAgT1MgPDwgIn07XG5cbiI7Cit9CisKKy8vLyBFbWl0Q29tcHV0ZUF2YWlsYWJsZUZlYXR1cmVzIC0gRW1pdCB0aGUgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgbGlzdCBvZgorLy8vIGF2YWlsYWJsZSBmZWF0dXJlcyBnaXZlbiBhIHN1YnRhcmdldC4KK3N0YXRpYyB2b2lkIEVtaXRDb21wdXRlQXZhaWxhYmxlRmVhdHVyZXMoQ29kZUdlblRhcmdldCAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc21NYXRjaGVySW5mbyAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSB7CisgIHN0ZDo6c3RyaW5nIENsYXNzTmFtZSA9CisgICAgSW5mby5Bc21QYXJzZXItPmdldFZhbHVlQXNTdHJpbmcoIkFzbVBhcnNlckNsYXNzTmFtZSIpOworCisgIE9TIDw8ICJ1bnNpZ25lZCAiIDw8IFRhcmdldC5nZXROYW1lKCkgPDwgQ2xhc3NOYW1lIDw8ICI6OlxuIgorICAgICA8PCAiQ29tcHV0ZUF2YWlsYWJsZUZlYXR1cmVzKGNvbnN0ICIgPDwgVGFyZ2V0LmdldE5hbWUoKQorICAgICA8PCAiU3VidGFyZ2V0ICpTdWJ0YXJnZXQpIGNvbnN0IHtcbiI7CisgIE9TIDw8ICIgIHVuc2lnbmVkIEZlYXR1cmVzID0gMDtcbiI7CisgIGZvciAoc3RkOjptYXA8UmVjb3JkKiwgU3VidGFyZ2V0RmVhdHVyZUluZm8qPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIGl0ID0gSW5mby5TdWJ0YXJnZXRGZWF0dXJlcy5iZWdpbigpLAorICAgICAgICAgaWUgPSBJbmZvLlN1YnRhcmdldEZlYXR1cmVzLmVuZCgpOyBpdCAhPSBpZTsgKytpdCkgeworICAgIFN1YnRhcmdldEZlYXR1cmVJbmZvICZTRkkgPSAqaXQtPnNlY29uZDsKKyAgICBPUyA8PCAiICBpZiAoIiA8PCBTRkkuVGhlRGVmLT5nZXRWYWx1ZUFzU3RyaW5nKCJDb25kU3RyaW5nIikKKyAgICAgICA8PCAiKVxuIjsKKyAgICBPUyA8PCAiICAgIEZlYXR1cmVzIHw9ICIgPDwgU0ZJLkVudW1OYW1lIDw8ICI7XG4iOworICB9CisgIE9TIDw8ICIgIHJldHVybiBGZWF0dXJlcztcbiI7CisgIE9TIDw8ICJ9XG5cbiI7Cit9CisKK3ZvaWQgQXNtTWF0Y2hlckVtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmT1MpIHsKKyAgQ29kZUdlblRhcmdldCBUYXJnZXQ7CisgIFJlY29yZCAqQXNtUGFyc2VyID0gVGFyZ2V0LmdldEFzbVBhcnNlcigpOworICBzdGQ6OnN0cmluZyBDbGFzc05hbWUgPSBBc21QYXJzZXItPmdldFZhbHVlQXNTdHJpbmcoIkFzbVBhcnNlckNsYXNzTmFtZSIpOworCisgIC8vIENvbXB1dGUgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBpbnN0cnVjdGlvbnMgdG8gbWF0Y2guCisgIEFzbU1hdGNoZXJJbmZvIEluZm8oQXNtUGFyc2VyKTsKKyAgSW5mby5CdWlsZEluZm8oVGFyZ2V0KTsKKworICAvLyBTb3J0IHRoZSBpbnN0cnVjdGlvbiB0YWJsZSB1c2luZyB0aGUgcGFydGlhbCBvcmRlciBvbiBjbGFzc2VzLiBXZSB1c2UKKyAgLy8gc3RhYmxlX3NvcnQgdG8gZW5zdXJlIHRoYXQgYW1iaWd1b3VzIGluc3RydWN0aW9ucyBhcmUgc3RpbGwKKyAgLy8gZGV0ZXJtaW5pc3RpY2FsbHkgb3JkZXJlZC4KKyAgc3RkOjpzdGFibGVfc29ydChJbmZvLkluc3RydWN0aW9ucy5iZWdpbigpLCBJbmZvLkluc3RydWN0aW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBsZXNzX3B0cjxJbnN0cnVjdGlvbkluZm8+KCkpOworICAKKyAgREVCVUdfV0lUSF9UWVBFKCJpbnN0cnVjdGlvbl9pbmZvIiwgeworICAgICAgZm9yIChzdGQ6OnZlY3RvcjxJbnN0cnVjdGlvbkluZm8qPjo6aXRlcmF0b3IgCisgICAgICAgICAgICAgaXQgPSBJbmZvLkluc3RydWN0aW9ucy5iZWdpbigpLCBpZSA9IEluZm8uSW5zdHJ1Y3Rpb25zLmVuZCgpOyAKKyAgICAgICAgICAgaXQgIT0gaWU7ICsraXQpCisgICAgICAgICgqaXQpLT5kdW1wKCk7CisgICAgfSk7CisKKyAgLy8gQ2hlY2sgZm9yIGFtYmlndW91cyBpbnN0cnVjdGlvbnMuCisgIHVuc2lnbmVkIE51bUFtYmlndW91cyA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbmZvLkluc3RydWN0aW9ucy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgZm9yICh1bnNpZ25lZCBqID0gaSArIDE7IGogIT0gZTsgKytqKSB7CisgICAgICBJbnN0cnVjdGlvbkluZm8gJkEgPSAqSW5mby5JbnN0cnVjdGlvbnNbaV07CisgICAgICBJbnN0cnVjdGlvbkluZm8gJkIgPSAqSW5mby5JbnN0cnVjdGlvbnNbal07CisgICAgCisgICAgICBpZiAoQS5Db3VsZE1hdGNoQW1pZ3VvdXNseVdpdGgoQikpIHsKKyAgICAgICAgREVCVUdfV0lUSF9UWVBFKCJhbWJpZ3VvdXNfaW5zdHJzIiwgeworICAgICAgICAgICAgZXJycygpIDw8ICJ3YXJuaW5nOiBhbWJpZ3VvdXMgaW5zdHJ1Y3Rpb24gbWF0Y2g6XG4iOworICAgICAgICAgICAgQS5kdW1wKCk7CisgICAgICAgICAgICBlcnJzKCkgPDwgIlxuaXMgaW5jb21wYXJhYmxlIHdpdGg6XG4iOworICAgICAgICAgICAgQi5kdW1wKCk7CisgICAgICAgICAgICBlcnJzKCkgPDwgIlxuXG4iOworICAgICAgICAgIH0pOworICAgICAgICArK051bUFtYmlndW91czsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKE51bUFtYmlndW91cykKKyAgICBERUJVR19XSVRIX1RZUEUoImFtYmlndW91c19pbnN0cnMiLCB7CisgICAgICAgIGVycnMoKSA8PCAid2FybmluZzogIiA8PCBOdW1BbWJpZ3VvdXMgCisgICAgICAgICAgICAgICA8PCAiIGFtYmlndW91cyBpbnN0cnVjdGlvbnMhXG4iOworICAgICAgfSk7CisKKyAgLy8gV3JpdGUgdGhlIG91dHB1dC4KKworICBFbWl0U291cmNlRmlsZUhlYWRlcigiQXNzZW1ibHkgTWF0Y2hlciBTb3VyY2UgRnJhZ21lbnQiLCBPUyk7CisKKyAgLy8gRW1pdCB0aGUgc3VidGFyZ2V0IGZlYXR1cmUgZW51bWVyYXRpb24uCisgIEVtaXRTdWJ0YXJnZXRGZWF0dXJlRmxhZ0VudW1lcmF0aW9uKFRhcmdldCwgSW5mbywgT1MpOworCisgIC8vIEVtaXQgdGhlIGZ1bmN0aW9uIHRvIG1hdGNoIGEgcmVnaXN0ZXIgbmFtZSB0byBudW1iZXIuCisgIEVtaXRNYXRjaFJlZ2lzdGVyTmFtZShUYXJnZXQsIEFzbVBhcnNlciwgT1MpOworICAKKyAgT1MgPDwgIiNpZm5kZWYgUkVHSVNURVJTX09OTFlcblxuIjsKKworICAvLyBHZW5lcmF0ZSB0aGUgdW5pZmllZCBmdW5jdGlvbiB0byBjb252ZXJ0IG9wZXJhbmRzIGludG8gYW4gTUNJbnN0LgorICBFbWl0Q29udmVydFRvTUNJbnN0KFRhcmdldCwgSW5mby5JbnN0cnVjdGlvbnMsIE9TKTsKKworICAvLyBFbWl0IHRoZSBlbnVtZXJhdGlvbiBmb3IgY2xhc3NlcyB3aGljaCBwYXJ0aWNpcGF0ZSBpbiBtYXRjaGluZy4KKyAgRW1pdE1hdGNoQ2xhc3NFbnVtZXJhdGlvbihUYXJnZXQsIEluZm8uQ2xhc3NlcywgT1MpOworCisgIC8vIEVtaXQgdGhlIHJvdXRpbmUgdG8gbWF0Y2ggdG9rZW4gc3RyaW5ncyB0byB0aGVpciBtYXRjaCBjbGFzcy4KKyAgRW1pdE1hdGNoVG9rZW5TdHJpbmcoVGFyZ2V0LCBJbmZvLkNsYXNzZXMsIE9TKTsKKworICAvLyBFbWl0IHRoZSByb3V0aW5lIHRvIGNsYXNzaWZ5IGFuIG9wZXJhbmQuCisgIEVtaXRDbGFzc2lmeU9wZXJhbmQoVGFyZ2V0LCBJbmZvLCBPUyk7CisKKyAgLy8gRW1pdCB0aGUgc3ViY2xhc3MgcHJlZGljYXRlIHJvdXRpbmUuCisgIEVtaXRJc1N1YmNsYXNzKFRhcmdldCwgSW5mby5DbGFzc2VzLCBPUyk7CisKKyAgLy8gRW1pdCB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzIGNvbXB1dGUgZnVuY3Rpb24uCisgIEVtaXRDb21wdXRlQXZhaWxhYmxlRmVhdHVyZXMoVGFyZ2V0LCBJbmZvLCBPUyk7CisKKyAgLy8gRmluYWxseSwgYnVpbGQgdGhlIG1hdGNoIGZ1bmN0aW9uLgorCisgIHNpemVfdCBNYXhOdW1PcGVyYW5kcyA9IDA7CisgIGZvciAoc3RkOjp2ZWN0b3I8SW5zdHJ1Y3Rpb25JbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgIEluZm8uSW5zdHJ1Y3Rpb25zLmJlZ2luKCksIGllID0gSW5mby5JbnN0cnVjdGlvbnMuZW5kKCk7CisgICAgICAgaXQgIT0gaWU7ICsraXQpCisgICAgTWF4TnVtT3BlcmFuZHMgPSBzdGQ6Om1heChNYXhOdW1PcGVyYW5kcywgKCppdCktPk9wZXJhbmRzLnNpemUoKSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJk1hdGNoTmFtZSA9CisgICAgQXNtUGFyc2VyLT5nZXRWYWx1ZUFzU3RyaW5nKCJNYXRjaEluc3RydWN0aW9uTmFtZSIpOworICBPUyA8PCAiYm9vbCAiIDw8IFRhcmdldC5nZXROYW1lKCkgPDwgQ2xhc3NOYW1lIDw8ICI6OlxuIgorICAgICA8PCBNYXRjaE5hbWUKKyAgICAgPDwgIihjb25zdCBTbWFsbFZlY3RvckltcGw8TUNQYXJzZWRBc21PcGVyYW5kKj4gJk9wZXJhbmRzLFxuIjsKKyAgT1MuaW5kZW50KE1hdGNoTmFtZS5zaXplKCkgKyAxKTsKKyAgT1MgPDwgIk1DSW5zdCAmSW5zdCkge1xuIjsKKworICAvLyBFbWl0IHRoZSBzdGF0aWMgbWF0Y2ggdGFibGU7IHVudXNlZCBjbGFzc2VzIGdldCBpbml0YWxpemVkIHRvIDAgd2hpY2ggaXMKKyAgLy8gZ3VhcmFudGVlZCB0byBiZSBJbnZhbGlkTWF0Y2hDbGFzcy4KKyAgLy8KKyAgLy8gRklYTUU6IFdlIGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgdGhpcyB0YWJsZSB2ZXJ5IGVhc2lseS4gRmlyc3QsIHdlIGNoYW5nZQorICAvLyBpdCBzbyB0aGF0IHN0b3JlIHRoZSBraW5kcyBpbiBzZXBhcmF0ZSBiaXQtZmllbGRzIGZvciBlYWNoIGluZGV4LCB3aGljaAorICAvLyBvbmx5IG5lZWRzIHRvIGJlIHRoZSBtYXggd2lkdGggdXNlZCBmb3IgY2xhc3NlcyBhdCB0aGF0IGluZGV4ICh3ZSBhbHNvIG5lZWQKKyAgLy8gdG8gcmVqZWN0IGJhc2VkIG9uIHRoaXMgZHVyaW5nIGNsYXNzaWZpY2F0aW9uKS4gSWYgd2UgdGhlbiBtYWtlIHN1cmUgdG8KKyAgLy8gb3JkZXIgdGhlIG1hdGNoIGtpbmRzIGFwcHJvcHJpYXRlbHkgKHB1dHRpbmcgbW5lbW9uaWNzIGxhc3QpLCB0aGVuIHdlCisgIC8vIHNob3VsZCBvbmx5IGVuZCB1cCB1c2luZyBhIGZldyBiaXRzIGZvciBlYWNoIGNsYXNzLCBlc3BlY2lhbGx5IHRoZSBvbmVzCisgIC8vIGZvbGxvd2luZyB0aGUgbW5lbW9uaWMuCisgIE9TIDw8ICIgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgTWF0Y2hFbnRyeSB7XG4iOworICBPUyA8PCAiICAgIHVuc2lnbmVkIE9wY29kZTtcbiI7CisgIE9TIDw8ICIgICAgQ29udmVyc2lvbktpbmQgQ29udmVydEZuO1xuIjsKKyAgT1MgPDwgIiAgICBNYXRjaENsYXNzS2luZCBDbGFzc2VzWyIgPDwgTWF4TnVtT3BlcmFuZHMgPDwgIl07XG4iOworICBPUyA8PCAiICAgIHVuc2lnbmVkIFJlcXVpcmVkRmVhdHVyZXM7XG4iOworICBPUyA8PCAiICB9IE1hdGNoVGFibGVbIiA8PCBJbmZvLkluc3RydWN0aW9ucy5zaXplKCkgPDwgIl0gPSB7XG4iOworCisgIGZvciAoc3RkOjp2ZWN0b3I8SW5zdHJ1Y3Rpb25JbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgIEluZm8uSW5zdHJ1Y3Rpb25zLmJlZ2luKCksIGllID0gSW5mby5JbnN0cnVjdGlvbnMuZW5kKCk7CisgICAgICAgaXQgIT0gaWU7ICsraXQpIHsKKyAgICBJbnN0cnVjdGlvbkluZm8gJklJID0gKippdDsKKworICAgIE9TIDw8ICIgICAgeyAiIDw8IFRhcmdldC5nZXROYW1lKCkgPDwgIjo6IiA8PCBJSS5JbnN0ck5hbWUKKyAgICAgICA8PCAiLCAiIDw8IElJLkNvbnZlcnNpb25GbktpbmQgPDwgIiwgeyAiOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJSS5PcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBJbnN0cnVjdGlvbkluZm86Ok9wZXJhbmQgJk9wID0gSUkuT3BlcmFuZHNbaV07CisgICAgICAKKyAgICAgIGlmIChpKSBPUyA8PCAiLCAiOworICAgICAgT1MgPDwgT3AuQ2xhc3MtPk5hbWU7CisgICAgfQorICAgIE9TIDw8ICIgfSwgIjsKKworICAgIC8vIFdyaXRlIHRoZSByZXF1aXJlZCBmZWF0dXJlcyBtYXNrLgorICAgIGlmICghSUkuUmVxdWlyZWRGZWF0dXJlcy5lbXB0eSgpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSUkuUmVxdWlyZWRGZWF0dXJlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIGlmIChpKSBPUyA8PCAifCI7CisgICAgICAgIE9TIDw8IElJLlJlcXVpcmVkRmVhdHVyZXNbaV0tPkVudW1OYW1lOworICAgICAgfQorICAgIH0gZWxzZQorICAgICAgT1MgPDwgIjAiOworCisgICAgT1MgPDwgIn0sXG4iOworICB9CisKKyAgT1MgPDwgIiAgfTtcblxuIjsKKworCisgIC8vIEVtaXQgY29kZSB0byBnZXQgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcy4KKyAgT1MgPDwgIiAgLy8gR2V0IHRoZSBjdXJyZW50IGZlYXR1cmUgc2V0LlxuIjsKKyAgT1MgPDwgIiAgdW5zaWduZWQgQXZhaWxhYmxlRmVhdHVyZXMgPSBnZXRBdmFpbGFibGVGZWF0dXJlcygpO1xuXG4iOworCisgIC8vIEVtaXQgY29kZSB0byBjb21wdXRlIHRoZSBjbGFzcyBsaXN0IGZvciB0aGlzIG9wZXJhbmQgdmVjdG9yLgorICBPUyA8PCAiICAvLyBFbGltaW5hdGUgb2J2aW91cyBtaXNtYXRjaGVzLlxuIjsKKyAgT1MgPDwgIiAgaWYgKE9wZXJhbmRzLnNpemUoKSA+ICIgPDwgTWF4TnVtT3BlcmFuZHMgPDwgIilcbiI7CisgIE9TIDw8ICIgICAgcmV0dXJuIHRydWU7XG5cbiI7CisKKyAgT1MgPDwgIiAgLy8gQ29tcHV0ZSB0aGUgY2xhc3MgbGlzdCBmb3IgdGhpcyBvcGVyYW5kIHZlY3Rvci5cbiI7CisgIE9TIDw8ICIgIE1hdGNoQ2xhc3NLaW5kIENsYXNzZXNbIiA8PCBNYXhOdW1PcGVyYW5kcyA8PCAiXTtcbiI7CisgIE9TIDw8ICIgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7XG4iOworICBPUyA8PCAiICAgIENsYXNzZXNbaV0gPSBDbGFzc2lmeU9wZXJhbmQoT3BlcmFuZHNbaV0pO1xuXG4iOworCisgIE9TIDw8ICIgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgb3BlcmFuZHMgYmVmb3JlIG1hdGNoaW5nLlxuIjsKKyAgT1MgPDwgIiAgICBpZiAoQ2xhc3Nlc1tpXSA9PSBJbnZhbGlkTWF0Y2hDbGFzcylcbiI7CisgIE9TIDw8ICIgICAgICByZXR1cm4gdHJ1ZTtcbiI7CisgIE9TIDw8ICIgIH1cblxuIjsKKworICBPUyA8PCAiICAvLyBNYXJrIHVudXNlZCBjbGFzc2VzLlxuIjsKKyAgT1MgPDwgIiAgZm9yICh1bnNpZ25lZCBpID0gT3BlcmFuZHMuc2l6ZSgpLCBlID0gIiA8PCBNYXhOdW1PcGVyYW5kcyA8PCAiOyAiCisgICAgIDw8ICJpICE9IGU7ICsraSlcbiI7CisgIE9TIDw8ICIgICAgQ2xhc3Nlc1tpXSA9IEludmFsaWRNYXRjaENsYXNzO1xuXG4iOworCisgIC8vIEVtaXQgY29kZSB0byBzZWFyY2ggdGhlIHRhYmxlLgorICBPUyA8PCAiICAvLyBTZWFyY2ggdGhlIHRhYmxlLlxuIjsKKyAgT1MgPDwgIiAgZm9yIChjb25zdCBNYXRjaEVudHJ5ICppdCA9IE1hdGNoVGFibGUsICIKKyAgICAgPDwgIippZSA9IE1hdGNoVGFibGUgKyAiIDw8IEluZm8uSW5zdHJ1Y3Rpb25zLnNpemUoKQorICAgICA8PCAiOyBpdCAhPSBpZTsgKytpdCkge1xuIjsKKworICAvLyBFbWl0IGNoZWNrIHRoYXQgdGhlIHJlcXVpcmVkIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUuCisgICAgT1MgPDwgIiAgICBpZiAoKEF2YWlsYWJsZUZlYXR1cmVzICYgaXQtPlJlcXVpcmVkRmVhdHVyZXMpICIKKyAgICAgICA8PCAiIT0gaXQtPlJlcXVpcmVkRmVhdHVyZXMpXG4iOworICAgIE9TIDw8ICIgICAgICBjb250aW51ZTtcbiI7CisKKyAgLy8gRW1pdCBjaGVjayB0aGF0IHRoZSBzdWJjbGFzc2VzIG1hdGNoLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE1heE51bU9wZXJhbmRzOyArK2kpIHsKKyAgICBPUyA8PCAiICAgIGlmICghSXNTdWJjbGFzcyhDbGFzc2VzWyIgCisgICAgICAgPDwgaSA8PCAiXSwgaXQtPkNsYXNzZXNbIiA8PCBpIDw8ICJdKSlcbiI7CisgICAgT1MgPDwgIiAgICAgIGNvbnRpbnVlO1xuIjsKKyAgfQorICBPUyA8PCAiXG4iOworICBPUyA8PCAiICAgIENvbnZlcnRUb01DSW5zdChpdC0+Q29udmVydEZuLCBJbnN0LCBpdC0+T3Bjb2RlLCBPcGVyYW5kcyk7XG4iOworCisgIC8vIENhbGwgdGhlIHBvc3QtcHJvY2Vzc2luZyBmdW5jdGlvbiwgaWYgdXNlZC4KKyAgc3RkOjpzdHJpbmcgSW5zbkNsZWFudXBGbiA9CisgICAgQXNtUGFyc2VyLT5nZXRWYWx1ZUFzU3RyaW5nKCJBc21QYXJzZXJJbnN0Q2xlYW51cCIpOworICBpZiAoIUluc25DbGVhbnVwRm4uZW1wdHkoKSkKKyAgICBPUyA8PCAiICAgICIgPDwgSW5zbkNsZWFudXBGbiA8PCAiKEluc3QpO1xuIjsKKworICBPUyA8PCAiICAgIHJldHVybiBmYWxzZTtcbiI7CisgIE9TIDw8ICIgIH1cblxuIjsKKworICBPUyA8PCAiICByZXR1cm4gdHJ1ZTtcbiI7CisgIE9TIDw8ICJ9XG5cbiI7CisgIAorICBPUyA8PCAiI2VuZGlmIC8vIFJFR0lTVEVSU19PTkxZXG4iOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQXNtTWF0Y2hlckVtaXR0ZXIuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FzbU1hdGNoZXJFbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5YzkzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FzbU1hdGNoZXJFbWl0dGVyLmgKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tIEFzbU1hdGNoZXJFbWl0dGVyLmggLSBHZW5lcmF0ZSBhbiBhc3NlbWJseSBtYXRjaGVyIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgZW1pdHMgYSB0YXJnZXQgc3BlY2lmaWVyIG1hdGNoZXIgZm9yIGNvbnZlcnRpbmcgcGFyc2VkCisvLyBhc3NlbWJseSBvcGVyYW5kcyBpbiB0aGUgTUNJbnN0IHN0cnVjdHVyZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBU01NQVRDSEVSX0VNSVRURVJfSAorI2RlZmluZSBBU01NQVRDSEVSX0VNSVRURVJfSAorCisjaW5jbHVkZSAiVGFibGVHZW5CYWNrZW5kLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEFzbU1hdGNoZXJFbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgICAgUmVjb3JkS2VlcGVyICZSZWNvcmRzOworICBwdWJsaWM6CisgICAgQXNtTWF0Y2hlckVtaXR0ZXIoUmVjb3JkS2VlcGVyICZSKSA6IFJlY29yZHMoUikge30KKworICAgIC8vIHJ1biAtIE91dHB1dCB0aGUgbWF0Y2hlciwgcmV0dXJuaW5nIHRydWUgb24gZmFpbHVyZS4KKyAgICB2b2lkIHJ1bihyYXdfb3N0cmVhbSAmbyk7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FzbVdyaXRlckVtaXR0ZXIuY3BwIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQXNtV3JpdGVyRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmMTNjMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FzbVdyaXRlckVtaXR0ZXIuY3BwCkBAIC0wLDAgKzEsNTQ4IEBACisvLz09PS0gQXNtV3JpdGVyRW1pdHRlci5jcHAgLSBHZW5lcmF0ZSBhbiBhc3NlbWJseSB3cml0ZXIgLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgdGFibGVnZW4gYmFja2VuZCBpcyBlbWl0cyBhbiBhc3NlbWJseSBwcmludGVyIGZvciB0aGUgY3VycmVudCB0YXJnZXQuCisvLyBOb3RlIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgZmFpcmx5IHNrZWxldGFsLCBidXQgd2lsbCBncm93IG92ZXIgdGltZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQXNtV3JpdGVyRW1pdHRlci5oIgorI2luY2x1ZGUgIkFzbVdyaXRlckluc3QuaCIKKyNpbmNsdWRlICJDb2RlR2VuVGFyZ2V0LmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisjaW5jbHVkZSAiU3RyaW5nVG9PZmZzZXRUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyB2b2lkIFByaW50Q2FzZXMoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBc21Xcml0ZXJPcGVyYW5kPiA+ICZPcHNUb1ByaW50LCByYXdfb3N0cmVhbSAmTykgeworICBPIDw8ICIgICAgY2FzZSAiIDw8IE9wc1RvUHJpbnQuYmFjaygpLmZpcnN0IDw8ICI6ICI7CisgIEFzbVdyaXRlck9wZXJhbmQgVGhlT3AgPSBPcHNUb1ByaW50LmJhY2soKS5zZWNvbmQ7CisgIE9wc1RvUHJpbnQucG9wX2JhY2soKTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgYW55IG90aGVyIG9wZXJhbmRzIGFyZSBpZGVudGljYWwgaW4gdGhpcyBsaXN0LCBhbmQgaWYgc28sCisgIC8vIGVtaXQgYSBjYXNlIGxhYmVsIGZvciB0aGVtLgorICBmb3IgKHVuc2lnbmVkIGkgPSBPcHNUb1ByaW50LnNpemUoKTsgaSAhPSAwOyAtLWkpCisgICAgaWYgKE9wc1RvUHJpbnRbaS0xXS5zZWNvbmQgPT0gVGhlT3ApIHsKKyAgICAgIE8gPDwgIlxuICAgIGNhc2UgIiA8PCBPcHNUb1ByaW50W2ktMV0uZmlyc3QgPDwgIjogIjsKKyAgICAgIE9wc1RvUHJpbnQuZXJhc2UoT3BzVG9QcmludC5iZWdpbigpK2ktMSk7CisgICAgfQorCisgIC8vIEZpbmFsbHksIGVtaXQgdGhlIGNvZGUuCisgIE8gPDwgVGhlT3AuZ2V0Q29kZSgpOworICBPIDw8ICJicmVhaztcbiI7Cit9CisKKworLy8vIEVtaXRJbnN0cnVjdGlvbnMgLSBFbWl0IHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSB2ZWN0b3IgYW5kIGFueSBvdGhlcgorLy8vIGluc3RydWN0aW9ucyB0aGF0IGFyZSBzdWl0YWJseSBzaW1pbGFyIHRvIGl0Lgorc3RhdGljIHZvaWQgRW1pdEluc3RydWN0aW9ucyhzdGQ6OnZlY3RvcjxBc21Xcml0ZXJJbnN0PiAmSW5zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPKSB7CisgIEFzbVdyaXRlckluc3QgRmlyc3RJbnN0ID0gSW5zdHMuYmFjaygpOworICBJbnN0cy5wb3BfYmFjaygpOworCisgIHN0ZDo6dmVjdG9yPEFzbVdyaXRlckluc3Q+IFNpbWlsYXJJbnN0czsKKyAgdW5zaWduZWQgRGlmZmVyaW5nT3BlcmFuZCA9IH4wOworICBmb3IgKHVuc2lnbmVkIGkgPSBJbnN0cy5zaXplKCk7IGkgIT0gMDsgLS1pKSB7CisgICAgdW5zaWduZWQgRGlmZk9wID0gSW5zdHNbaS0xXS5NYXRjaGVzQWxsQnV0T25lT3AoRmlyc3RJbnN0KTsKKyAgICBpZiAoRGlmZk9wICE9IH4xVSkgeworICAgICAgaWYgKERpZmZlcmluZ09wZXJhbmQgPT0gfjBVKSAgLy8gRmlyc3QgbWF0Y2ghCisgICAgICAgIERpZmZlcmluZ09wZXJhbmQgPSBEaWZmT3A7CisKKyAgICAgIC8vIElmIHRoaXMgZGlmZmVycyBpbiB0aGUgc2FtZSBvcGVyYW5kIGFzIHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4KKyAgICAgIC8vIHRoaXMgY2xhc3MsIG1vdmUgaXQgdG8gdGhlIFNpbWlsYXJJbnN0cyBsaXN0LgorICAgICAgaWYgKERpZmZlcmluZ09wZXJhbmQgPT0gRGlmZk9wIHx8IERpZmZPcCA9PSB+MFUpIHsKKyAgICAgICAgU2ltaWxhckluc3RzLnB1c2hfYmFjayhJbnN0c1tpLTFdKTsKKyAgICAgICAgSW5zdHMuZXJhc2UoSW5zdHMuYmVnaW4oKStpLTEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIE8gPDwgIiAgY2FzZSAiIDw8IEZpcnN0SW5zdC5DR0ktPk5hbWVzcGFjZSA8PCAiOjoiCisgICAgPDwgRmlyc3RJbnN0LkNHSS0+VGhlRGVmLT5nZXROYW1lKCkgPDwgIjpcbiI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTaW1pbGFySW5zdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBPIDw8ICIgIGNhc2UgIiA8PCBTaW1pbGFySW5zdHNbaV0uQ0dJLT5OYW1lc3BhY2UgPDwgIjo6IgorICAgICAgPDwgU2ltaWxhckluc3RzW2ldLkNHSS0+VGhlRGVmLT5nZXROYW1lKCkgPDwgIjpcbiI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGaXJzdEluc3QuT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChpICE9IERpZmZlcmluZ09wZXJhbmQpIHsKKyAgICAgIC8vIElmIHRoZSBvcGVyYW5kIGlzIHRoZSBzYW1lIGZvciBhbGwgaW5zdHJ1Y3Rpb25zLCBqdXN0IHByaW50IGl0LgorICAgICAgTyA8PCAiICAgICIgPDwgRmlyc3RJbnN0Lk9wZXJhbmRzW2ldLmdldENvZGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgb3BlcmFuZCB0aGF0IHZhcmllcyBiZXR3ZWVuIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zLAorICAgICAgLy8gZW1pdCBhIHN3aXRjaCBmb3IganVzdCB0aGlzIG9wZXJhbmQgbm93LgorICAgICAgTyA8PCAiICAgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7XG4iOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBBc21Xcml0ZXJPcGVyYW5kPiA+IE9wc1RvUHJpbnQ7CisgICAgICBPcHNUb1ByaW50LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihGaXJzdEluc3QuQ0dJLT5OYW1lc3BhY2UgKyAiOjoiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0SW5zdC5DR0ktPlRoZURlZi0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlyc3RJbnN0Lk9wZXJhbmRzW2ldKSk7CisKKyAgICAgIGZvciAodW5zaWduZWQgc2kgPSAwLCBlID0gU2ltaWxhckluc3RzLnNpemUoKTsgc2kgIT0gZTsgKytzaSkgeworICAgICAgICBBc21Xcml0ZXJJbnN0ICZBV0kgPSBTaW1pbGFySW5zdHNbc2ldOworICAgICAgICBPcHNUb1ByaW50LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBV0kuQ0dJLT5OYW1lc3BhY2UrIjo6IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVdJLkNHSS0+VGhlRGVmLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXSS5PcGVyYW5kc1tpXSkpOworICAgICAgfQorICAgICAgc3RkOjpyZXZlcnNlKE9wc1RvUHJpbnQuYmVnaW4oKSwgT3BzVG9QcmludC5lbmQoKSk7CisgICAgICB3aGlsZSAoIU9wc1RvUHJpbnQuZW1wdHkoKSkKKyAgICAgICAgUHJpbnRDYXNlcyhPcHNUb1ByaW50LCBPKTsKKyAgICAgIE8gPDwgIiAgICB9IjsKKyAgICB9CisgICAgTyA8PCAiXG4iOworICB9CisgIE8gPDwgIiAgICBicmVhaztcbiI7Cit9CisKK3ZvaWQgQXNtV3JpdGVyRW1pdHRlcjo6CitGaW5kVW5pcXVlT3BlcmFuZENvbW1hbmRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmVW5pcXVlT3BlcmFuZENvbW1hbmRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZJbnN0SWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZJbnN0T3BzVXNlZCkgY29uc3QgeworICBJbnN0SWR4cy5hc3NpZ24oTnVtYmVyZWRJbnN0cnVjdGlvbnMuc2l6ZSgpLCB+MFUpOworICAKKyAgLy8gVGhpcyB2ZWN0b3IgcGFyYWxsZWxzIFVuaXF1ZU9wZXJhbmRDb21tYW5kcywga2VlcGluZyB0cmFjayBvZiB3aGljaAorICAvLyBpbnN0cnVjdGlvbnMgZWFjaCBjYXNlIGFyZSB1c2VkIGZvci4gIEl0IGlzIGEgY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZgorICAvLyBlbnVtcy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEluc3Ryc0ZvckNhc2U7CisgIEluc3Ryc0ZvckNhc2UucmVzaXplKFVuaXF1ZU9wZXJhbmRDb21tYW5kcy5zaXplKCkpOworICBJbnN0T3BzVXNlZC5hc3NpZ24oVW5pcXVlT3BlcmFuZENvbW1hbmRzLnNpemUoKSwgMCk7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtYmVyZWRJbnN0cnVjdGlvbnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IEFzbVdyaXRlckluc3QgKkluc3QgPSBnZXRBc21Xcml0ZXJJbnN0QnlJRChpKTsKKyAgICBpZiAoSW5zdCA9PSAwKSBjb250aW51ZTsgIC8vIFBISSwgSU5MSU5FQVNNLCBQUk9MT0dfTEFCRUwsIGV0Yy4KKyAgICAKKyAgICBzdGQ6OnN0cmluZyBDb21tYW5kOworICAgIGlmIChJbnN0LT5PcGVyYW5kcy5lbXB0eSgpKQorICAgICAgY29udGludWU7ICAgLy8gSW5zdHJ1Y3Rpb24gYWxyZWFkeSBkb25lLgorCisgICAgQ29tbWFuZCA9ICIgICAgIiArIEluc3QtPk9wZXJhbmRzWzBdLmdldENvZGUoKSArICJcbiI7CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlICdDb21tYW5kJyBpbiBVbmlxdWVPcGVyYW5kQ29tbWFuZHMuCisgICAgLy8gSWYgbm90LCBhZGQgaXQuCisgICAgYm9vbCBGb3VuZEl0ID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpZHggPSAwLCBlID0gVW5pcXVlT3BlcmFuZENvbW1hbmRzLnNpemUoKTsgaWR4ICE9IGU7ICsraWR4KQorICAgICAgaWYgKFVuaXF1ZU9wZXJhbmRDb21tYW5kc1tpZHhdID09IENvbW1hbmQpIHsKKyAgICAgICAgSW5zdElkeHNbaV0gPSBpZHg7CisgICAgICAgIEluc3Ryc0ZvckNhc2VbaWR4XSArPSAiLCAiOworICAgICAgICBJbnN0cnNGb3JDYXNlW2lkeF0gKz0gSW5zdC0+Q0dJLT5UaGVEZWYtPmdldE5hbWUoKTsKKyAgICAgICAgRm91bmRJdCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGlmICghRm91bmRJdCkgeworICAgICAgSW5zdElkeHNbaV0gPSBVbmlxdWVPcGVyYW5kQ29tbWFuZHMuc2l6ZSgpOworICAgICAgVW5pcXVlT3BlcmFuZENvbW1hbmRzLnB1c2hfYmFjayhDb21tYW5kKTsKKyAgICAgIEluc3Ryc0ZvckNhc2UucHVzaF9iYWNrKEluc3QtPkNHSS0+VGhlRGVmLT5nZXROYW1lKCkpOworCisgICAgICAvLyBUaGlzIGNvbW1hbmQgbWF0Y2hlcyBvbmUgb3BlcmFuZCBzbyBmYXIuCisgICAgICBJbnN0T3BzVXNlZC5wdXNoX2JhY2soMSk7CisgICAgfQorICB9CisgIAorICAvLyBGb3IgZWFjaCBlbnRyeSBvZiBVbmlxdWVPcGVyYW5kQ29tbWFuZHMsIHRoZXJlIGlzIGEgc2V0IG9mIGluc3RydWN0aW9ucworICAvLyB0aGF0IHVzZXMgaXQuICBJZiB0aGUgbmV4dCBjb21tYW5kIG9mIGFsbCBpbnN0cnVjdGlvbnMgaW4gdGhlIHNldCBhcmUKKyAgLy8gaWRlbnRpY2FsLCBmb2xkIGl0IGludG8gdGhlIGNvbW1hbmQuCisgIGZvciAodW5zaWduZWQgQ29tbWFuZElkeCA9IDAsIGUgPSBVbmlxdWVPcGVyYW5kQ29tbWFuZHMuc2l6ZSgpOworICAgICAgIENvbW1hbmRJZHggIT0gZTsgKytDb21tYW5kSWR4KSB7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBPcCA9IDE7IDsgKytPcCkgeworICAgICAgLy8gU2NhbiBmb3IgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZSBzZXQuCisgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD46Oml0ZXJhdG9yIE5JVCA9CisgICAgICAgIHN0ZDo6ZmluZChJbnN0SWR4cy5iZWdpbigpLCBJbnN0SWR4cy5lbmQoKSwgQ29tbWFuZElkeCk7CisgICAgICBpZiAoTklUID09IEluc3RJZHhzLmVuZCgpKSBicmVhazsgIC8vIE5vIGNvbW1vbmFsaXR5LgorCisgICAgICAvLyBJZiB0aGlzIGluc3RydWN0aW9uIGhhcyBubyBtb3JlIG9wZXJhbmRzLCB3ZSBpc24ndCBhbnl0aGluZyB0byBtZXJnZQorICAgICAgLy8gaW50byB0aGlzIGNvbW1hbmQuCisgICAgICBjb25zdCBBc21Xcml0ZXJJbnN0ICpGaXJzdEluc3QgPSAKKyAgICAgICAgZ2V0QXNtV3JpdGVySW5zdEJ5SUQoTklULUluc3RJZHhzLmJlZ2luKCkpOworICAgICAgaWYgKCFGaXJzdEluc3QgfHwgRmlyc3RJbnN0LT5PcGVyYW5kcy5zaXplKCkgPT0gT3ApCisgICAgICAgIGJyZWFrOworCisgICAgICAvLyBPdGhlcndpc2UsIHNjYW4gdG8gc2VlIGlmIGFsbCBvZiB0aGUgb3RoZXIgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgY29tbWFuZAorICAgICAgLy8gc2V0IHNoYXJlIHRoZSBvcGVyYW5kLgorICAgICAgYm9vbCBBbGxTYW1lID0gdHJ1ZTsKKyAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIG1heGltdW0sIG51bWJlciBvZiBvcGVyYW5kcyBvciBhbnkKKyAgICAgIC8vIGluc3RydWN0aW9uIHdlIHNlZSBpbiB0aGUgZ3JvdXAuCisgICAgICBzaXplX3QgTWF4U2l6ZSA9IEZpcnN0SW5zdC0+T3BlcmFuZHMuc2l6ZSgpOworCisgICAgICBmb3IgKE5JVCA9IHN0ZDo6ZmluZChOSVQrMSwgSW5zdElkeHMuZW5kKCksIENvbW1hbmRJZHgpOworICAgICAgICAgICBOSVQgIT0gSW5zdElkeHMuZW5kKCk7CisgICAgICAgICAgIE5JVCA9IHN0ZDo6ZmluZChOSVQrMSwgSW5zdElkeHMuZW5kKCksIENvbW1hbmRJZHgpKSB7CisgICAgICAgIC8vIE9rYXksIGZvdW5kIGFub3RoZXIgaW5zdHJ1Y3Rpb24gaW4gdGhpcyBjb21tYW5kIHNldC4gIElmIHRoZSBvcGVyYW5kCisgICAgICAgIC8vIG1hdGNoZXMsIHdlJ3JlIG9rLCBvdGhlcndpc2UgYmFpbCBvdXQuCisgICAgICAgIGNvbnN0IEFzbVdyaXRlckluc3QgKk90aGVySW5zdCA9IAorICAgICAgICAgIGdldEFzbVdyaXRlckluc3RCeUlEKE5JVC1JbnN0SWR4cy5iZWdpbigpKTsKKworICAgICAgICBpZiAoT3RoZXJJbnN0ICYmCisgICAgICAgICAgICBPdGhlckluc3QtPk9wZXJhbmRzLnNpemUoKSA+IEZpcnN0SW5zdC0+T3BlcmFuZHMuc2l6ZSgpKQorICAgICAgICAgIE1heFNpemUgPSBzdGQ6Om1heChNYXhTaXplLCBPdGhlckluc3QtPk9wZXJhbmRzLnNpemUoKSk7CisKKyAgICAgICAgaWYgKCFPdGhlckluc3QgfHwgT3RoZXJJbnN0LT5PcGVyYW5kcy5zaXplKCkgPT0gT3AgfHwKKyAgICAgICAgICAgIE90aGVySW5zdC0+T3BlcmFuZHNbT3BdICE9IEZpcnN0SW5zdC0+T3BlcmFuZHNbT3BdKSB7CisgICAgICAgICAgQWxsU2FtZSA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIUFsbFNhbWUpIGJyZWFrOworICAgICAgCisgICAgICAvLyBPa2F5LCBldmVyeXRoaW5nIGluIHRoaXMgY29tbWFuZCBzZXQgaGFzIHRoZSBzYW1lIG5leHQgb3BlcmFuZC4gIEFkZCBpdAorICAgICAgLy8gdG8gVW5pcXVlT3BlcmFuZENvbW1hbmRzIGFuZCByZW1lbWJlciB0aGF0IGl0IHdhcyBjb25zdW1lZC4KKyAgICAgIHN0ZDo6c3RyaW5nIENvbW1hbmQgPSAiICAgICIgKyBGaXJzdEluc3QtPk9wZXJhbmRzW09wXS5nZXRDb2RlKCkgKyAiXG4iOworICAgICAgCisgICAgICBVbmlxdWVPcGVyYW5kQ29tbWFuZHNbQ29tbWFuZElkeF0gKz0gQ29tbWFuZDsKKyAgICAgIEluc3RPcHNVc2VkW0NvbW1hbmRJZHhdKys7CisgICAgfQorICB9CisgIAorICAvLyBQcmVwZW5kIHNvbWUgb2YgdGhlIGluc3RydWN0aW9ucyBlYWNoIGNhc2UgaXMgdXNlZCBmb3Igb250byB0aGUgY2FzZSB2YWwuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbnN0cnNGb3JDYXNlLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBzdGQ6OnN0cmluZyBJbnN0cnMgPSBJbnN0cnNGb3JDYXNlW2ldOworICAgIGlmIChJbnN0cnMuc2l6ZSgpID4gNzApIHsKKyAgICAgIEluc3Rycy5lcmFzZShJbnN0cnMuYmVnaW4oKSs3MCwgSW5zdHJzLmVuZCgpKTsKKyAgICAgIEluc3RycyArPSAiLi4uIjsKKyAgICB9CisgICAgCisgICAgaWYgKCFJbnN0cnMuZW1wdHkoKSkKKyAgICAgIFVuaXF1ZU9wZXJhbmRDb21tYW5kc1tpXSA9ICIgICAgLy8gIiArIEluc3RycyArICJcbiIgKyAKKyAgICAgICAgVW5pcXVlT3BlcmFuZENvbW1hbmRzW2ldOworICB9Cit9CisKKworc3RhdGljIHZvaWQgVW5lc2NhcGVTdHJpbmcoc3RkOjpzdHJpbmcgJlN0cikgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFN0ci5zaXplKCk7ICsraSkgeworICAgIGlmIChTdHJbaV0gPT0gJ1xcJyAmJiBpICE9IFN0ci5zaXplKCktMSkgeworICAgICAgc3dpdGNoIChTdHJbaSsxXSkgeworICAgICAgZGVmYXVsdDogY29udGludWU7ICAvLyBEb24ndCBleGVjdXRlIHRoZSBjb2RlIGFmdGVyIHRoZSBzd2l0Y2guCisgICAgICBjYXNlICdhJzogU3RyW2ldID0gJ1xhJzsgYnJlYWs7CisgICAgICBjYXNlICdiJzogU3RyW2ldID0gJ1xiJzsgYnJlYWs7CisgICAgICBjYXNlICdlJzogU3RyW2ldID0gMjc7IGJyZWFrOworICAgICAgY2FzZSAnZic6IFN0cltpXSA9ICdcZic7IGJyZWFrOworICAgICAgY2FzZSAnbic6IFN0cltpXSA9ICdcbic7IGJyZWFrOworICAgICAgY2FzZSAncic6IFN0cltpXSA9ICdccic7IGJyZWFrOworICAgICAgY2FzZSAndCc6IFN0cltpXSA9ICdcdCc7IGJyZWFrOworICAgICAgY2FzZSAndic6IFN0cltpXSA9ICdcdic7IGJyZWFrOworICAgICAgY2FzZSAnIic6IFN0cltpXSA9ICdcIic7IGJyZWFrOworICAgICAgY2FzZSAnXCcnOiBTdHJbaV0gPSAnXCcnOyBicmVhazsKKyAgICAgIGNhc2UgJ1xcJzogU3RyW2ldID0gJ1xcJzsgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBOdWtlIHRoZSBzZWNvbmQgY2hhcmFjdGVyLgorICAgICAgU3RyLmVyYXNlKFN0ci5iZWdpbigpK2krMSk7CisgICAgfQorICB9Cit9CisKKy8vLyBFbWl0UHJpbnRJbnN0cnVjdGlvbiAtIEdlbmVyYXRlIHRoZSBjb2RlIGZvciB0aGUgInByaW50SW5zdHJ1Y3Rpb24iIG1ldGhvZAorLy8vIGltcGxlbWVudGF0aW9uLgordm9pZCBBc21Xcml0ZXJFbWl0dGVyOjpFbWl0UHJpbnRJbnN0cnVjdGlvbihyYXdfb3N0cmVhbSAmTykgeworICBDb2RlR2VuVGFyZ2V0IFRhcmdldDsKKyAgUmVjb3JkICpBc21Xcml0ZXIgPSBUYXJnZXQuZ2V0QXNtV3JpdGVyKCk7CisgIHN0ZDo6c3RyaW5nIENsYXNzTmFtZSA9IEFzbVdyaXRlci0+Z2V0VmFsdWVBc1N0cmluZygiQXNtV3JpdGVyQ2xhc3NOYW1lIik7CisgIAorICBPIDw8CisgICIvLy8gcHJpbnRJbnN0cnVjdGlvbiAtIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRhYmxlZ2VuXG4iCisgICIvLy8gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGRlc2NyaXB0aW9uLlxuIgorICAgICJ2b2lkICIgPDwgVGFyZ2V0LmdldE5hbWUoKSA8PCBDbGFzc05hbWUKKyAgICAgICAgICAgIDw8ICI6OnByaW50SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICpNSSwgcmF3X29zdHJlYW0gJk8pIHtcbiI7CisKKyAgc3RkOjp2ZWN0b3I8QXNtV3JpdGVySW5zdD4gSW5zdHJ1Y3Rpb25zOworCisgIGZvciAoQ29kZUdlblRhcmdldDo6aW5zdF9pdGVyYXRvciBJID0gVGFyZ2V0Lmluc3RfYmVnaW4oKSwKKyAgICAgICAgIEUgPSBUYXJnZXQuaW5zdF9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCEoKkkpLT5Bc21TdHJpbmcuZW1wdHkoKSAmJgorICAgICAgICAoKkkpLT5UaGVEZWYtPmdldE5hbWUoKSAhPSAiUEhJIikKKyAgICAgIEluc3RydWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgIEFzbVdyaXRlckluc3QoKipJLCAKKyAgICAgICAgICAgICAgICAgICAgICBBc21Xcml0ZXItPmdldFZhbHVlQXNJbnQoIlZhcmlhbnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICBBc21Xcml0ZXItPmdldFZhbHVlQXNJbnQoIkZpcnN0T3BlcmFuZENvbHVtbiIpLAorICAgICAgICAgICAgICAgICAgICAgIEFzbVdyaXRlci0+Z2V0VmFsdWVBc0ludCgiT3BlcmFuZFNwYWNpbmciKSkpOworCisgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24gbnVtYmVyaW5nLgorICBOdW1iZXJlZEluc3RydWN0aW9ucyA9IFRhcmdldC5nZXRJbnN0cnVjdGlvbnNCeUVudW1WYWx1ZSgpOworICAKKyAgLy8gQ29tcHV0ZSB0aGUgQ29kZUdlbkluc3RydWN0aW9uIC0+IEFzbVdyaXRlckluc3QgbWFwcGluZy4gIE5vdGUgdGhhdCBub3QKKyAgLy8gYWxsIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGFyZSBuZWNlc3NhcmlseSBiZWluZyBwcmludGVkLCBzbyB0aGVyZSBtYXkgYmUKKyAgLy8gdGFyZ2V0IGluc3RydWN0aW9ucyBub3QgaW4gdGhpcyBtYXAuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbnN0cnVjdGlvbnMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBDR0lBV0lNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEluc3RydWN0aW9uc1tpXS5DR0ksICZJbnN0cnVjdGlvbnNbaV0pKTsKKworICAvLyBCdWlsZCBhbiBhZ2dyZWdhdGUgc3RyaW5nLCBhbmQgYnVpbGQgYSB0YWJsZSBvZiBvZmZzZXRzIGludG8gaXQuCisgIFN0cmluZ1RvT2Zmc2V0VGFibGUgU3RyaW5nVGFibGU7CisgIAorICAvLy8gT3Bjb2RlSW5mbyAtIFRoaXMgZW5jb2RlcyB0aGUgaW5kZXggb2YgdGhlIHN0cmluZyB0byB1c2UgZm9yIHRoZSBmaXJzdAorICAvLy8gY2h1bmsgb2YgdGhlIG91dHB1dCBhcyB3ZWxsIGFzIGluZGljZXMgdXNlZCBmb3Igb3BlcmFuZCBwcmludGluZy4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IE9wY29kZUluZm87CisgIAorICB1bnNpZ25lZCBNYXhTdHJpbmdJZHggPSAwOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtYmVyZWRJbnN0cnVjdGlvbnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIEFzbVdyaXRlckluc3QgKkFXSSA9IENHSUFXSU1hcFtOdW1iZXJlZEluc3RydWN0aW9uc1tpXV07CisgICAgdW5zaWduZWQgSWR4OworICAgIGlmIChBV0kgPT0gMCkgeworICAgICAgLy8gU29tZXRoaW5nIG5vdCBoYW5kbGVkIGJ5IHRoZSBhc213cml0ZXIgcHJpbnRlci4KKyAgICAgIElkeCA9IH4wVTsKKyAgICB9IGVsc2UgaWYgKEFXSS0+T3BlcmFuZHNbMF0uT3BlcmFuZFR5cGUgIT0gCisgICAgICAgICAgICAgICAgICAgICAgICBBc21Xcml0ZXJPcGVyYW5kOjppc0xpdGVyYWxUZXh0T3BlcmFuZCB8fAorICAgICAgICAgICAgICAgQVdJLT5PcGVyYW5kc1swXS5TdHIuZW1wdHkoKSkgeworICAgICAgLy8gU29tZXRoaW5nIGhhbmRsZWQgYnkgdGhlIGFzbXdyaXRlciBwcmludGVyLCBidXQgd2l0aCBubyBsZWFkaW5nIHN0cmluZy4KKyAgICAgIElkeCA9IFN0cmluZ1RhYmxlLkdldE9yQWRkU3RyaW5nT2Zmc2V0KCIiKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpzdHJpbmcgU3RyID0gQVdJLT5PcGVyYW5kc1swXS5TdHI7CisgICAgICBVbmVzY2FwZVN0cmluZyhTdHIpOworICAgICAgSWR4ID0gU3RyaW5nVGFibGUuR2V0T3JBZGRTdHJpbmdPZmZzZXQoU3RyKTsKKyAgICAgIE1heFN0cmluZ0lkeCA9IHN0ZDo6bWF4KE1heFN0cmluZ0lkeCwgSWR4KTsKKyAgICAgIAorICAgICAgLy8gTnVrZSB0aGUgc3RyaW5nIGZyb20gdGhlIG9wZXJhbmQgbGlzdC4gIEl0IGlzIG5vdyBoYW5kbGVkIQorICAgICAgQVdJLT5PcGVyYW5kcy5lcmFzZShBV0ktPk9wZXJhbmRzLmJlZ2luKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBCaWFzIG9mZnNldCBieSBvbmUgc2luY2Ugd2Ugd2FudCAwIGFzIGEgc2VudGluZWwuCisgICAgT3Bjb2RlSW5mby5wdXNoX2JhY2soSWR4KzEpOworICB9CisgIAorICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IGJpdHMgd2UgdXNlZCBmb3IgdGhlIHN0cmluZyBpbmRleC4KKyAgdW5zaWduZWQgQXNtU3RyQml0cyA9IExvZzJfMzJfQ2VpbChNYXhTdHJpbmdJZHgrMik7CisgIAorICAvLyBUbyByZWR1Y2UgY29kZSBzaXplLCB3ZSBjb21wYWN0aWZ5IGNvbW1vbiBpbnN0cnVjdGlvbnMgaW50byBhIGZldyBiaXRzCisgIC8vIGluIHRoZSBvcGNvZGUtaW5kZXhlZCB0YWJsZS4KKyAgdW5zaWduZWQgQml0c0xlZnQgPSAzMi1Bc21TdHJCaXRzOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+IFRhYmxlRHJpdmVuT3BlcmFuZFByaW50ZXJzOworICAKKyAgd2hpbGUgKDEpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gVW5pcXVlT3BlcmFuZENvbW1hbmRzOworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBJbnN0SWR4czsKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gTnVtSW5zdE9wc0hhbmRsZWQ7CisgICAgRmluZFVuaXF1ZU9wZXJhbmRDb21tYW5kcyhVbmlxdWVPcGVyYW5kQ29tbWFuZHMsIEluc3RJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtSW5zdE9wc0hhbmRsZWQpOworICAgIAorICAgIC8vIElmIHdlIHJhbiBvdXQgb2Ygb3BlcmFuZHMgdG8gcHJpbnQsIHdlJ3JlIGRvbmUuCisgICAgaWYgKFVuaXF1ZU9wZXJhbmRDb21tYW5kcy5lbXB0eSgpKSBicmVhazsKKyAgICAKKyAgICAvLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYml0cyB3ZSBuZWVkIHRvIHJlcHJlc2VudCB0aGVzZSBjYXNlcywgdGhpcyBpcworICAgIC8vIGNlaWwobG9nMihudW1lbnRyaWVzKSkuCisgICAgdW5zaWduZWQgTnVtQml0cyA9IExvZzJfMzJfQ2VpbChVbmlxdWVPcGVyYW5kQ29tbWFuZHMuc2l6ZSgpKTsKKyAgICAKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBiaXRzIGZvciB0aGlzIG9wZXJhbmQsIGRvbid0IGluY2x1ZGUgaXQuCisgICAgaWYgKE51bUJpdHMgPiBCaXRzTGVmdCkgeworICAgICAgREVCVUcoZXJycygpIDw8ICJOb3QgZW5vdWdoIGJpdHMgdG8gZGVuc2VseSBlbmNvZGUgIiA8PCBOdW1CaXRzCisgICAgICAgICAgICAgICAgICAgPDwgIiBtb3JlIGJpdHNcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIC8vIE90aGVyd2lzZSwgd2UgY2FuIGluY2x1ZGUgdGhpcyBpbiB0aGUgaW5pdGlhbCBsb29rdXAgdGFibGUuICBBZGQgaXQgaW4uCisgICAgQml0c0xlZnQgLT0gTnVtQml0czsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5zdElkeHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChJbnN0SWR4c1tpXSAhPSB+MFUpCisgICAgICAgIE9wY29kZUluZm9baV0gfD0gSW5zdElkeHNbaV0gPDwgKEJpdHNMZWZ0K0FzbVN0ckJpdHMpOworICAgIAorICAgIC8vIFJlbW92ZSB0aGUgaW5mbyBhYm91dCB0aGlzIG9wZXJhbmQuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE51bWJlcmVkSW5zdHJ1Y3Rpb25zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChBc21Xcml0ZXJJbnN0ICpJbnN0ID0gZ2V0QXNtV3JpdGVySW5zdEJ5SUQoaSkpCisgICAgICAgIGlmICghSW5zdC0+T3BlcmFuZHMuZW1wdHkoKSkgeworICAgICAgICAgIHVuc2lnbmVkIE51bU9wcyA9IE51bUluc3RPcHNIYW5kbGVkW0luc3RJZHhzW2ldXTsKKyAgICAgICAgICBhc3NlcnQoTnVtT3BzIDw9IEluc3QtPk9wZXJhbmRzLnNpemUoKSAmJgorICAgICAgICAgICAgICAgICAiQ2FuJ3QgcmVtb3ZlIHRoaXMgbWFueSBvcHMhIik7CisgICAgICAgICAgSW5zdC0+T3BlcmFuZHMuZXJhc2UoSW5zdC0+T3BlcmFuZHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0LT5PcGVyYW5kcy5iZWdpbigpK051bU9wcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gUmVtZW1iZXIgdGhlIGhhbmRsZXJzIGZvciB0aGlzIHNldCBvZiBvcGVyYW5kcy4KKyAgICBUYWJsZURyaXZlbk9wZXJhbmRQcmludGVycy5wdXNoX2JhY2soVW5pcXVlT3BlcmFuZENvbW1hbmRzKTsKKyAgfQorICAKKyAgCisgIAorICBPPDwiICBzdGF0aWMgY29uc3QgdW5zaWduZWQgT3BJbmZvW10gPSB7XG4iOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTnVtYmVyZWRJbnN0cnVjdGlvbnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE8gPDwgIiAgICAiIDw8IE9wY29kZUluZm9baV0gPDwgIlUsXHQvLyAiCisgICAgICA8PCBOdW1iZXJlZEluc3RydWN0aW9uc1tpXS0+VGhlRGVmLT5nZXROYW1lKCkgPDwgIlxuIjsKKyAgfQorICAvLyBBZGQgYSBkdW1teSBlbnRyeSBzbyB0aGUgYXJyYXkgaW5pdCBkb2Vzbid0IGVuZCB3aXRoIGEgY29tbWEuCisgIE8gPDwgIiAgICAwVVxuIjsKKyAgTyA8PCAiICB9O1xuXG4iOworICAKKyAgLy8gRW1pdCB0aGUgc3RyaW5nIGl0c2VsZi4KKyAgTyA8PCAiICBjb25zdCBjaGFyICpBc21TdHJzID0gXG4iOworICBTdHJpbmdUYWJsZS5FbWl0U3RyaW5nKE8pOworICBPIDw8ICI7XG5cbiI7CisKKyAgTyA8PCAiICBPIDw8IFwiXFx0XCI7XG5cbiI7CisKKyAgTyA8PCAiICAvLyBFbWl0IHRoZSBvcGNvZGUgZm9yIHRoZSBpbnN0cnVjdGlvbi5cbiIKKyAgICA8PCAiICB1bnNpZ25lZCBCaXRzID0gT3BJbmZvW01JLT5nZXRPcGNvZGUoKV07XG4iCisgICAgPDwgIiAgYXNzZXJ0KEJpdHMgIT0gMCAmJiBcIkNhbm5vdCBwcmludCB0aGlzIGluc3RydWN0aW9uLlwiKTtcbiIKKyAgICA8PCAiICBPIDw8IEFzbVN0cnMrKEJpdHMgJiAiIDw8ICgxIDw8IEFzbVN0ckJpdHMpLTEgPDwgIiktMTtcblxuIjsKKworICAvLyBPdXRwdXQgdGhlIHRhYmxlIGRyaXZlbiBvcGVyYW5kIGluZm9ybWF0aW9uLgorICBCaXRzTGVmdCA9IDMyLUFzbVN0ckJpdHM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUYWJsZURyaXZlbk9wZXJhbmRQcmludGVycy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZDb21tYW5kcyA9IFRhYmxlRHJpdmVuT3BlcmFuZFByaW50ZXJzW2ldOworCisgICAgLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgd2UgbmVlZCB0byByZXByZXNlbnQgdGhlc2UgY2FzZXMsIHRoaXMgaXMKKyAgICAvLyBjZWlsKGxvZzIobnVtZW50cmllcykpLgorICAgIHVuc2lnbmVkIE51bUJpdHMgPSBMb2cyXzMyX0NlaWwoQ29tbWFuZHMuc2l6ZSgpKTsKKyAgICBhc3NlcnQoTnVtQml0cyA8PSBCaXRzTGVmdCAmJiAiY29uc2lzdGVuY3kgZXJyb3IiKTsKKyAgICAKKyAgICAvLyBFbWl0IGNvZGUgdG8gZXh0cmFjdCB0aGlzIGZpZWxkIGZyb20gQml0cy4KKyAgICBCaXRzTGVmdCAtPSBOdW1CaXRzOworICAgIAorICAgIE8gPDwgIlxuICAvLyBGcmFnbWVudCAiIDw8IGkgPDwgIiBlbmNvZGVkIGludG8gIiA8PCBOdW1CaXRzCisgICAgICA8PCAiIGJpdHMgZm9yICIgPDwgQ29tbWFuZHMuc2l6ZSgpIDw8ICIgdW5pcXVlIGNvbW1hbmRzLlxuIjsKKyAgICAKKyAgICBpZiAoQ29tbWFuZHMuc2l6ZSgpID09IDIpIHsKKyAgICAgIC8vIEVtaXQgdHdvIHBvc3NpYmlsaXR5cyB3aXRoIGlmL2Vsc2UuCisgICAgICBPIDw8ICIgIGlmICgoQml0cyA+PiAiIDw8IChCaXRzTGVmdCtBc21TdHJCaXRzKSA8PCAiKSAmICIKKyAgICAgICAgPDwgKCgxIDw8IE51bUJpdHMpLTEpIDw8ICIpIHtcbiIKKyAgICAgICAgPDwgQ29tbWFuZHNbMV0KKyAgICAgICAgPDwgIiAgfSBlbHNlIHtcbiIKKyAgICAgICAgPDwgQ29tbWFuZHNbMF0KKyAgICAgICAgPDwgIiAgfVxuXG4iOworICAgIH0gZWxzZSB7CisgICAgICBPIDw8ICIgIHN3aXRjaCAoKEJpdHMgPj4gIiA8PCAoQml0c0xlZnQrQXNtU3RyQml0cykgPDwgIikgJiAiCisgICAgICAgIDw8ICgoMSA8PCBOdW1CaXRzKS0xKSA8PCAiKSB7XG4iCisgICAgICAgIDw8ICIgIGRlZmF1bHQ6ICAgLy8gdW5yZWFjaGFibGUuXG4iOworICAgICAgCisgICAgICAvLyBQcmludCBvdXQgYWxsIHRoZSBjYXNlcy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDb21tYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIE8gPDwgIiAgY2FzZSAiIDw8IGkgPDwgIjpcbiI7CisgICAgICAgIE8gPDwgQ29tbWFuZHNbaV07CisgICAgICAgIE8gPDwgIiAgICBicmVhaztcbiI7CisgICAgICB9CisgICAgICBPIDw8ICIgIH1cblxuIjsKKyAgICB9CisgIH0KKyAgCisgIC8vIE9rYXksIGRlbGV0ZSBpbnN0cnVjdGlvbnMgd2l0aCBubyBvcGVyYW5kIGluZm8gbGVmdC4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3RydWN0aW9ucy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gRW50aXJlIGluc3RydWN0aW9uIGhhcyBiZWVuIGVtaXR0ZWQ/CisgICAgQXNtV3JpdGVySW5zdCAmSW5zdCA9IEluc3RydWN0aW9uc1tpXTsKKyAgICBpZiAoSW5zdC5PcGVyYW5kcy5lbXB0eSgpKSB7CisgICAgICBJbnN0cnVjdGlvbnMuZXJhc2UoSW5zdHJ1Y3Rpb25zLmJlZ2luKCkraSk7CisgICAgICAtLWk7IC0tZTsKKyAgICB9CisgIH0KKworICAgIAorICAvLyBCZWNhdXNlIHRoaXMgaXMgYSB2ZWN0b3IsIHdlIHdhbnQgdG8gZW1pdCBmcm9tIHRoZSBlbmQuICBSZXZlcnNlIGFsbCBvZiB0aGUKKyAgLy8gZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgc3RkOjpyZXZlcnNlKEluc3RydWN0aW9ucy5iZWdpbigpLCBJbnN0cnVjdGlvbnMuZW5kKCkpOworICAKKyAgCisgIC8vIE5vdyB0aGF0IHdlJ3ZlIGVtaXR0ZWQgYWxsIG9mIHRoZSBvcGVyYW5kIGluZm8gdGhhdCBmaXQgaW50byAzMiBiaXRzLCBlbWl0CisgIC8vIGluZm9ybWF0aW9uIGZvciB0aG9zZSBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgbGVmdC4gIFRoaXMgaXMgYSBsZXNzIGRlbnNlCisgIC8vIGVuY29kaW5nLCBidXQgd2UgZXhwZWN0IHRoZSBtYWluIDMyLWJpdCB0YWJsZSB0byBoYW5kbGUgdGhlIG1ham9yaXR5IG9mCisgIC8vIGluc3RydWN0aW9ucy4KKyAgaWYgKCFJbnN0cnVjdGlvbnMuZW1wdHkoKSkgeworICAgIC8vIEZpbmQgdGhlIG9wY29kZSAjIG9mIGlubGluZSBhc20uCisgICAgTyA8PCAiICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkge1xuIjsKKyAgICB3aGlsZSAoIUluc3RydWN0aW9ucy5lbXB0eSgpKQorICAgICAgRW1pdEluc3RydWN0aW9ucyhJbnN0cnVjdGlvbnMsIE8pOworCisgICAgTyA8PCAiICB9XG4iOworICAgIE8gPDwgIiAgcmV0dXJuO1xuIjsKKyAgfQorCisgIE8gPDwgIn1cbiI7Cit9CisKKwordm9pZCBBc21Xcml0ZXJFbWl0dGVyOjpFbWl0R2V0UmVnaXN0ZXJOYW1lKHJhd19vc3RyZWFtICZPKSB7CisgIENvZGVHZW5UYXJnZXQgVGFyZ2V0OworICBSZWNvcmQgKkFzbVdyaXRlciA9IFRhcmdldC5nZXRBc21Xcml0ZXIoKTsKKyAgc3RkOjpzdHJpbmcgQ2xhc3NOYW1lID0gQXNtV3JpdGVyLT5nZXRWYWx1ZUFzU3RyaW5nKCJBc21Xcml0ZXJDbGFzc05hbWUiKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlblJlZ2lzdGVyPiAmUmVnaXN0ZXJzID0gVGFyZ2V0LmdldFJlZ2lzdGVycygpOworICAKKyAgU3RyaW5nVG9PZmZzZXRUYWJsZSBTdHJpbmdUYWJsZTsKKyAgTyA8PAorICAiXG5cbi8vLyBnZXRSZWdpc3Rlck5hbWUgLSBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0YmxnZW5cbiIKKyAgIi8vLyBmcm9tIHRoZSByZWdpc3RlciBzZXQgZGVzY3JpcHRpb24uICBUaGlzIHJldHVybnMgdGhlIGFzc2VtYmxlciBuYW1lXG4iCisgICIvLy8gZm9yIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuXG4iCisgICJjb25zdCBjaGFyICoiIDw8IFRhcmdldC5nZXROYW1lKCkgPDwgQ2xhc3NOYW1lCisgIDw8ICI6OmdldFJlZ2lzdGVyTmFtZSh1bnNpZ25lZCBSZWdObykge1xuIgorICA8PCAiICBhc3NlcnQoUmVnTm8gJiYgUmVnTm8gPCAiIDw8IChSZWdpc3RlcnMuc2l6ZSgpKzEpCisgIDw8ICIgJiYgXCJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciFcIik7XG4iCisgIDw8ICJcbiIKKyAgPDwgIiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0FzbU9mZnNldFtdID0geyI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdpc3RlcnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlciAmUmVnID0gUmVnaXN0ZXJzW2ldOworCisgICAgc3RkOjpzdHJpbmcgQXNtTmFtZSA9IFJlZy5UaGVEZWYtPmdldFZhbHVlQXNTdHJpbmcoIkFzbU5hbWUiKTsKKyAgICBpZiAoQXNtTmFtZS5lbXB0eSgpKQorICAgICAgQXNtTmFtZSA9IFJlZy5nZXROYW1lKCk7CisgICAgCisgICAgCisgICAgaWYgKChpICUgMTQpID09IDApCisgICAgICBPIDw8ICJcbiAgICAiOworICAgIAorICAgIE8gPDwgU3RyaW5nVGFibGUuR2V0T3JBZGRTdHJpbmdPZmZzZXQoQXNtTmFtZSkgPDwgIiwgIjsKKyAgfQorICBPIDw8ICIwXG4iCisgICAgPDwgIiAgfTtcbiIKKyAgICA8PCAiXG4iOworICAKKyAgTyA8PCAiICBjb25zdCBjaGFyICpBc21TdHJzID1cbiI7CisgIFN0cmluZ1RhYmxlLkVtaXRTdHJpbmcoTyk7CisgIE8gPDwgIjtcbiI7CisgIAorICBPIDw8ICIgIHJldHVybiBBc21TdHJzK1JlZ0FzbU9mZnNldFtSZWdOby0xXTtcbiIKKyAgICA8PCAifVxuIjsKK30KKwordm9pZCBBc21Xcml0ZXJFbWl0dGVyOjpFbWl0R2V0SW5zdHJ1Y3Rpb25OYW1lKHJhd19vc3RyZWFtICZPKSB7CisgIENvZGVHZW5UYXJnZXQgVGFyZ2V0OworICBSZWNvcmQgKkFzbVdyaXRlciA9IFRhcmdldC5nZXRBc21Xcml0ZXIoKTsKKyAgc3RkOjpzdHJpbmcgQ2xhc3NOYW1lID0gQXNtV3JpdGVyLT5nZXRWYWx1ZUFzU3RyaW5nKCJBc21Xcml0ZXJDbGFzc05hbWUiKTsKKworICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPiAmTnVtYmVyZWRJbnN0cnVjdGlvbnMgPQorICAgIFRhcmdldC5nZXRJbnN0cnVjdGlvbnNCeUVudW1WYWx1ZSgpOworICAKKyAgU3RyaW5nVG9PZmZzZXRUYWJsZSBTdHJpbmdUYWJsZTsKKyAgTyA8PAorIlxuXG4jaWZkZWYgR0VUX0lOU1RSVUNUSU9OX05BTUVcbiIKKyIjdW5kZWYgR0VUX0lOU1RSVUNUSU9OX05BTUVcblxuIgorIi8vLyBnZXRJbnN0cnVjdGlvbk5hbWU6IFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRibGdlblxuIgorIi8vLyBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzZXQgZGVzY3JpcHRpb24uICBUaGlzIHJldHVybnMgdGhlIGVudW0gbmFtZSBvZiB0aGVcbiIKKyIvLy8gc3BlY2lmaWVkIGluc3RydWN0aW9uLlxuIgorICAiY29uc3QgY2hhciAqIiA8PCBUYXJnZXQuZ2V0TmFtZSgpIDw8IENsYXNzTmFtZQorICA8PCAiOjpnZXRJbnN0cnVjdGlvbk5hbWUodW5zaWduZWQgT3Bjb2RlKSB7XG4iCisgIDw8ICIgIGFzc2VydChPcGNvZGUgPCAiIDw8IE51bWJlcmVkSW5zdHJ1Y3Rpb25zLnNpemUoKQorICA8PCAiICYmIFwiSW52YWxpZCBpbnN0cnVjdGlvbiBudW1iZXIhXCIpO1xuIgorICA8PCAiXG4iCisgIDw8ICIgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBJbnN0QXNtT2Zmc2V0W10gPSB7IjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE51bWJlcmVkSW5zdHJ1Y3Rpb25zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24gJkluc3QgPSAqTnVtYmVyZWRJbnN0cnVjdGlvbnNbaV07CisgICAgCisgICAgc3RkOjpzdHJpbmcgQXNtTmFtZSA9IEluc3QuVGhlRGVmLT5nZXROYW1lKCk7CisgICAgaWYgKChpICUgMTQpID09IDApCisgICAgICBPIDw8ICJcbiAgICAiOworICAgIAorICAgIE8gPDwgU3RyaW5nVGFibGUuR2V0T3JBZGRTdHJpbmdPZmZzZXQoQXNtTmFtZSkgPDwgIiwgIjsKKyAgfQorICBPIDw8ICIwXG4iCisgIDw8ICIgIH07XG4iCisgIDw8ICJcbiI7CisgIAorICBPIDw8ICIgIGNvbnN0IGNoYXIgKlN0cnMgPVxuIjsKKyAgU3RyaW5nVGFibGUuRW1pdFN0cmluZyhPKTsKKyAgTyA8PCAiO1xuIjsKKyAgCisgIE8gPDwgIiAgcmV0dXJuIFN0cnMrSW5zdEFzbU9mZnNldFtPcGNvZGVdO1xuIgorICA8PCAifVxuXG4jZW5kaWZcbiI7Cit9CisKKworCit2b2lkIEFzbVdyaXRlckVtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmTykgeworICBFbWl0U291cmNlRmlsZUhlYWRlcigiQXNzZW1ibHkgV3JpdGVyIFNvdXJjZSBGcmFnbWVudCIsIE8pOworICAKKyAgRW1pdFByaW50SW5zdHJ1Y3Rpb24oTyk7CisgIEVtaXRHZXRSZWdpc3Rlck5hbWUoTyk7CisgIEVtaXRHZXRJbnN0cnVjdGlvbk5hbWUoTyk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FzbVdyaXRlckVtaXR0ZXIuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FzbVdyaXRlckVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjdkNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQXNtV3JpdGVyRW1pdHRlci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LSBBc21Xcml0ZXJFbWl0dGVyLmggLSBHZW5lcmF0ZSBhbiBhc3NlbWJseSB3cml0ZXIgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBhbiBhc3NlbWJseSBwcmludGVyIGZvciB0aGUKKy8vIGNvZGUgZ2VuZXJhdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQVNNV1JJVEVSX0VNSVRURVJfSAorI2RlZmluZSBBU01XUklURVJfRU1JVFRFUl9ICisKKyNpbmNsdWRlICJUYWJsZUdlbkJhY2tlbmQuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQXNtV3JpdGVySW5zdDsKKyAgY2xhc3MgQ29kZUdlbkluc3RydWN0aW9uOworICAKKyAgY2xhc3MgQXNtV3JpdGVyRW1pdHRlciA6IHB1YmxpYyBUYWJsZUdlbkJhY2tlbmQgeworICAgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKyAgICBzdGQ6Om1hcDxjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24qLCBBc21Xcml0ZXJJbnN0Kj4gQ0dJQVdJTWFwOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbio+IE51bWJlcmVkSW5zdHJ1Y3Rpb25zOworICBwdWJsaWM6CisgICAgQXNtV3JpdGVyRW1pdHRlcihSZWNvcmRLZWVwZXIgJlIpIDogUmVjb3JkcyhSKSB7fQorCisgICAgLy8gcnVuIC0gT3V0cHV0IHRoZSBhc213cml0ZXIsIHJldHVybmluZyB0cnVlIG9uIGZhaWx1cmUuCisgICAgdm9pZCBydW4ocmF3X29zdHJlYW0gJm8pOworCitwcml2YXRlOgorICAgIHZvaWQgRW1pdFByaW50SW5zdHJ1Y3Rpb24ocmF3X29zdHJlYW0gJm8pOworICAgIHZvaWQgRW1pdEdldFJlZ2lzdGVyTmFtZShyYXdfb3N0cmVhbSAmbyk7CisgICAgdm9pZCBFbWl0R2V0SW5zdHJ1Y3Rpb25OYW1lKHJhd19vc3RyZWFtICZvKTsKKyAgICAKKyAgICBBc21Xcml0ZXJJbnN0ICpnZXRBc21Xcml0ZXJJbnN0QnlJRCh1bnNpZ25lZCBJRCkgY29uc3QgeworICAgICAgYXNzZXJ0KElEIDwgTnVtYmVyZWRJbnN0cnVjdGlvbnMuc2l6ZSgpKTsKKyAgICAgIHN0ZDo6bWFwPGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiosIEFzbVdyaXRlckluc3QqPjo6Y29uc3RfaXRlcmF0b3IgSSA9CisgICAgICAgIENHSUFXSU1hcC5maW5kKE51bWJlcmVkSW5zdHJ1Y3Rpb25zW0lEXSk7CisgICAgICBhc3NlcnQoSSAhPSBDR0lBV0lNYXAuZW5kKCkgJiYgIkRpZG4ndCBmaW5kIGluc3QhIik7CisgICAgICByZXR1cm4gSS0+c2Vjb25kOworICAgIH0KKyAgICB2b2lkIEZpbmRVbmlxdWVPcGVyYW5kQ29tbWFuZHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZVT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmSW5zdElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmSW5zdE9wc1VzZWQpIGNvbnN0OworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Bc21Xcml0ZXJJbnN0LmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FzbVdyaXRlckluc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjI4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Bc21Xcml0ZXJJbnN0LmNwcApAQCAtMCwwICsxLDI2NSBAQAorLy89PT0tIEFzbVdyaXRlckluc3QuaCAtIENsYXNzZXMgZW5jYXBzdWxhdGluZyBhIHByaW50YWJsZSBpbnN0IC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGVzZSBjbGFzc2VzIGltcGxlbWVudCBhIHBhcnNlciBmb3IgYXNzZW1ibHkgc3RyaW5ncy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQXNtV3JpdGVySW5zdC5oIgorI2luY2x1ZGUgIkNvZGVHZW5UYXJnZXQuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBib29sIGlzSWRlbnRDaGFyKGNoYXIgQykgeworICByZXR1cm4gKEMgPj0gJ2EnICYmIEMgPD0gJ3onKSB8fAorICAoQyA+PSAnQScgJiYgQyA8PSAnWicpIHx8CisgIChDID49ICcwJyAmJiBDIDw9ICc5JykgfHwKKyAgQyA9PSAnXyc7Cit9CisKK3N0ZDo6c3RyaW5nIEFzbVdyaXRlck9wZXJhbmQ6OmdldENvZGUoKSBjb25zdCB7CisgIGlmIChPcGVyYW5kVHlwZSA9PSBpc0xpdGVyYWxUZXh0T3BlcmFuZCkgeworICAgIGlmIChTdHIuc2l6ZSgpID09IDEpCisgICAgICByZXR1cm4gIk8gPDwgJyIgKyBTdHIgKyAiJzsgIjsKKyAgICByZXR1cm4gIk8gPDwgXCIiICsgU3RyICsgIlwiOyAiOworICB9CisgIAorICBpZiAoT3BlcmFuZFR5cGUgPT0gaXNMaXRlcmFsU3RhdGVtZW50T3BlcmFuZCkKKyAgICByZXR1cm4gU3RyOworICAKKyAgc3RkOjpzdHJpbmcgUmVzdWx0ID0gU3RyICsgIihNSSI7CisgIGlmIChNSU9wTm8gIT0gfjBVKQorICAgIFJlc3VsdCArPSAiLCAiICsgdXRvc3RyKE1JT3BObyk7CisgIFJlc3VsdCArPSAiLCBPIjsKKyAgaWYgKCFNaU1vZGlmaWVyLmVtcHR5KCkpCisgICAgUmVzdWx0ICs9ICIsIFwiIiArIE1pTW9kaWZpZXIgKyAnIic7CisgIHJldHVybiBSZXN1bHQgKyAiKTsgIjsKK30KKworLy8vIFBhcnNlQXNtU3RyaW5nIC0gUGFyc2UgdGhlIHNwZWNpZmllZCBJbnN0cnVjdGlvbidzIEFzbVN0cmluZyBpbnRvIHRoaXMKKy8vLyBBc21Xcml0ZXJJbnN0LgorLy8vCitBc21Xcml0ZXJJbnN0OjpBc21Xcml0ZXJJbnN0KGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmQ0dJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYXJpYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRmlyc3RPcGVyYW5kQ29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT3BlcmFuZFNwYWNpbmcpIHsKKyAgdGhpcy0+Q0dJID0gJkNHSTsKKyAgCisgIHVuc2lnbmVkIEN1clZhcmlhbnQgPSB+MFU7ICAvLyB+MCBpZiB3ZSBhcmUgb3V0c2lkZSBhIHsufC58Ln0gcmVnaW9uLCBvdGhlciAjLgorICAKKyAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRhYnMgd2UndmUgc2VlbiBpZiB3ZSdyZSBkb2luZyBjb2x1bW5hciBsYXlvdXQuCisgIHVuc2lnbmVkIEN1ckNvbHVtbiA9IDA7CisgIAorICAKKyAgLy8gTk9URTogQW55IGV4dGVuc2lvbnMgdG8gdGhpcyBjb2RlIG5lZWQgdG8gYmUgbWlycm9yZWQgaW4gdGhlIAorICAvLyBBc21QcmludGVyOjpwcmludElubGluZUFzbSBjb2RlIHRoYXQgZXhlY3V0ZXMgYXMgY29tcGlsZSB0aW1lIChhc3N1bWluZworICAvLyB0aGF0IGlubGluZSBhc20gc3RyaW5ncyBzaG91bGQgYWxzbyBnZXQgdGhlIG5ldyBmZWF0dXJlKSEKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJkFzbVN0cmluZyA9IENHSS5Bc21TdHJpbmc7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgTGFzdEVtaXR0ZWQgPSAwOworICB3aGlsZSAoTGFzdEVtaXR0ZWQgIT0gQXNtU3RyaW5nLnNpemUoKSkgeworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgRG9sbGFyUG9zID0KKyAgICBBc21TdHJpbmcuZmluZF9maXJzdF9vZigiJHt8fVxcIiwgTGFzdEVtaXR0ZWQpOworICAgIGlmIChEb2xsYXJQb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIERvbGxhclBvcyA9IEFzbVN0cmluZy5zaXplKCk7CisgICAgCisgICAgLy8gRW1pdCBhIGNvbnN0YW50IHN0cmluZyBmcmFnbWVudC4KKyAgICAKKyAgICBpZiAoRG9sbGFyUG9zICE9IExhc3RFbWl0dGVkKSB7CisgICAgICBpZiAoQ3VyVmFyaWFudCA9PSBWYXJpYW50IHx8IEN1clZhcmlhbnQgPT0gfjBVKSB7CisgICAgICAgIGZvciAoOyBMYXN0RW1pdHRlZCAhPSBEb2xsYXJQb3M7ICsrTGFzdEVtaXR0ZWQpCisgICAgICAgICAgc3dpdGNoIChBc21TdHJpbmdbTGFzdEVtaXR0ZWRdKSB7CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIEFkZExpdGVyYWxTdHJpbmcoIlxcbiIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgLy8gSWYgdGhlIGFzbSB3cml0ZXIgaXMgbm90IHVzaW5nIGEgY29sdW1uYXIgbGF5b3V0LCBcdCBpcyBub3QKKyAgICAgICAgICAgICAgLy8gbWFnaWMuCisgICAgICAgICAgICAgIGlmIChGaXJzdE9wZXJhbmRDb2x1bW4gPT0gLTEgfHwgT3BlcmFuZFNwYWNpbmcgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBBZGRMaXRlcmFsU3RyaW5nKCJcXHQiKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSByZWNvZ25pemUgYSB0YWIgYXMgYW4gb3BlcmFuZCBkZWxpbWV0ZXIuCisgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdENvbHVtbiA9IEZpcnN0T3BlcmFuZENvbHVtbiArIAorICAgICAgICAgICAgICAgIEN1ckNvbHVtbisrICogT3BlcmFuZFNwYWNpbmc7CisgICAgICAgICAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgQXNtV3JpdGVyT3BlcmFuZCgKKyAgICAgICAgICAgICAgICAgICAgIk8uUGFkVG9Db2x1bW4oIiArCisgICAgICAgICAgICAgICAgICAgIHV0b3N0cihEZXN0Q29sdW1uKSArICIpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgQXNtV3JpdGVyT3BlcmFuZDo6aXNMaXRlcmFsU3RhdGVtZW50T3BlcmFuZCkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgIEFkZExpdGVyYWxTdHJpbmcoIlxcXCIiKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIEFkZExpdGVyYWxTdHJpbmcoIlxcXFwiKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBBZGRMaXRlcmFsU3RyaW5nKHN0ZDo6c3RyaW5nKDEsIEFzbVN0cmluZ1tMYXN0RW1pdHRlZF0pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgTGFzdEVtaXR0ZWQgPSBEb2xsYXJQb3M7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChBc21TdHJpbmdbRG9sbGFyUG9zXSA9PSAnXFwnKSB7CisgICAgICBpZiAoRG9sbGFyUG9zKzEgIT0gQXNtU3RyaW5nLnNpemUoKSAmJgorICAgICAgICAgIChDdXJWYXJpYW50ID09IFZhcmlhbnQgfHwgQ3VyVmFyaWFudCA9PSB+MFUpKSB7CisgICAgICAgIGlmIChBc21TdHJpbmdbRG9sbGFyUG9zKzFdID09ICduJykgeworICAgICAgICAgIEFkZExpdGVyYWxTdHJpbmcoIlxcbiIpOworICAgICAgICB9IGVsc2UgaWYgKEFzbVN0cmluZ1tEb2xsYXJQb3MrMV0gPT0gJ3QnKSB7CisgICAgICAgICAgLy8gSWYgdGhlIGFzbSB3cml0ZXIgaXMgbm90IHVzaW5nIGEgY29sdW1uYXIgbGF5b3V0LCBcdCBpcyBub3QKKyAgICAgICAgICAvLyBtYWdpYy4KKyAgICAgICAgICBpZiAoRmlyc3RPcGVyYW5kQ29sdW1uID09IC0xIHx8IE9wZXJhbmRTcGFjaW5nID09IC0xKSB7CisgICAgICAgICAgICBBZGRMaXRlcmFsU3RyaW5nKCJcXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvLyBXZSByZWNvZ25pemUgYSB0YWIgYXMgYW4gb3BlcmFuZCBkZWxpbWV0ZXIuCisgICAgICAgICAgdW5zaWduZWQgRGVzdENvbHVtbiA9IEZpcnN0T3BlcmFuZENvbHVtbiArIAorICAgICAgICAgIEN1ckNvbHVtbisrICogT3BlcmFuZFNwYWNpbmc7CisgICAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKAorICAgICAgICAgICAgQXNtV3JpdGVyT3BlcmFuZCgiTy5QYWRUb0NvbHVtbigiICsgdXRvc3RyKERlc3RDb2x1bW4pICsgIik7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc21Xcml0ZXJPcGVyYW5kOjppc0xpdGVyYWxTdGF0ZW1lbnRPcGVyYW5kKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoc3RkOjpzdHJpbmcoIiR7fH1cXCIpLmZpbmQoQXNtU3RyaW5nW0RvbGxhclBvcysxXSkgCisgICAgICAgICAgICAgICAgICAgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBBZGRMaXRlcmFsU3RyaW5nKHN0ZDo6c3RyaW5nKDEsIEFzbVN0cmluZ1tEb2xsYXJQb3MrMV0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyAiTm9uLXN1cHBvcnRlZCBlc2NhcGVkIGNoYXJhY3RlciBmb3VuZCBpbiBpbnN0cnVjdGlvbiAnIiArCisgICAgICAgICAgQ0dJLlRoZURlZi0+Z2V0TmFtZSgpICsgIichIjsKKyAgICAgICAgfQorICAgICAgICBMYXN0RW1pdHRlZCA9IERvbGxhclBvcysyOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEFzbVN0cmluZ1tEb2xsYXJQb3NdID09ICd7JykgeworICAgICAgaWYgKEN1clZhcmlhbnQgIT0gfjBVKQorICAgICAgICB0aHJvdyAiTmVzdGVkIHZhcmlhbnRzIGZvdW5kIGZvciBpbnN0cnVjdGlvbiAnIiArCisgICAgICAgIENHSS5UaGVEZWYtPmdldE5hbWUoKSArICInISI7CisgICAgICBMYXN0RW1pdHRlZCA9IERvbGxhclBvcysxOworICAgICAgQ3VyVmFyaWFudCA9IDA7ICAgLy8gV2UgYXJlIG5vdyBpbnNpZGUgb2YgdGhlIHZhcmlhbnQhCisgICAgfSBlbHNlIGlmIChBc21TdHJpbmdbRG9sbGFyUG9zXSA9PSAnfCcpIHsKKyAgICAgIGlmIChDdXJWYXJpYW50ID09IH4wVSkKKyAgICAgICAgdGhyb3cgIid8JyBjaGFyYWN0ZXIgZm91bmQgb3V0c2lkZSBvZiBhIHZhcmlhbnQgaW4gaW5zdHJ1Y3Rpb24gJyIKKyAgICAgICAgKyBDR0kuVGhlRGVmLT5nZXROYW1lKCkgKyAiJyEiOworICAgICAgKytDdXJWYXJpYW50OworICAgICAgKytMYXN0RW1pdHRlZDsKKyAgICB9IGVsc2UgaWYgKEFzbVN0cmluZ1tEb2xsYXJQb3NdID09ICd9JykgeworICAgICAgaWYgKEN1clZhcmlhbnQgPT0gfjBVKQorICAgICAgICB0aHJvdyAiJ30nIGNoYXJhY3RlciBmb3VuZCBvdXRzaWRlIG9mIGEgdmFyaWFudCBpbiBpbnN0cnVjdGlvbiAnIgorICAgICAgICArIENHSS5UaGVEZWYtPmdldE5hbWUoKSArICInISI7CisgICAgICArK0xhc3RFbWl0dGVkOworICAgICAgQ3VyVmFyaWFudCA9IH4wVTsKKyAgICB9IGVsc2UgaWYgKERvbGxhclBvcysxICE9IEFzbVN0cmluZy5zaXplKCkgJiYKKyAgICAgICAgICAgICAgIEFzbVN0cmluZ1tEb2xsYXJQb3MrMV0gPT0gJyQnKSB7CisgICAgICBpZiAoQ3VyVmFyaWFudCA9PSBWYXJpYW50IHx8IEN1clZhcmlhbnQgPT0gfjBVKSB7CisgICAgICAgIEFkZExpdGVyYWxTdHJpbmcoIiQiKTsgIC8vICIkJCIgLT4gJAorICAgICAgfQorICAgICAgTGFzdEVtaXR0ZWQgPSBEb2xsYXJQb3MrMjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4KKyAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgVmFyRW5kID0gRG9sbGFyUG9zKzE7CisgICAgICAKKyAgICAgIC8vIGhhbmRsZSAke2Zvb31iYXIgYXMgJGZvbyBieSBkZXRlY3Rpbmcgd2hldGhlciB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZworICAgICAgLy8gdGhlIGRvbGxhciBzaWduIGlzIGEgY3VybHkgYnJhY2UuICBJZiBzbywgYWR2YW5jZSBWYXJFbmQgYW5kIERvbGxhclBvcworICAgICAgLy8gc28gdGhlIHZhcmlhYmxlIG5hbWUgZG9lcyBub3QgY29udGFpbiB0aGUgbGVhZGluZyBjdXJseSBicmFjZS4KKyAgICAgIGJvb2wgaGFzQ3VybHlCcmFjZXMgPSBmYWxzZTsKKyAgICAgIGlmIChWYXJFbmQgPCBBc21TdHJpbmcuc2l6ZSgpICYmICd7JyA9PSBBc21TdHJpbmdbVmFyRW5kXSkgeworICAgICAgICBoYXNDdXJseUJyYWNlcyA9IHRydWU7CisgICAgICAgICsrRG9sbGFyUG9zOworICAgICAgICArK1ZhckVuZDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgd2hpbGUgKFZhckVuZCA8IEFzbVN0cmluZy5zaXplKCkgJiYgaXNJZGVudENoYXIoQXNtU3RyaW5nW1ZhckVuZF0pKQorICAgICAgICArK1ZhckVuZDsKKyAgICAgIHN0ZDo6c3RyaW5nIFZhck5hbWUoQXNtU3RyaW5nLmJlZ2luKCkrRG9sbGFyUG9zKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFzbVN0cmluZy5iZWdpbigpK1ZhckVuZCk7CisgICAgICAKKyAgICAgIC8vIE1vZGlmaWVyIC0gU3VwcG9ydCAke2Zvbzptb2RpZmllcn0gc3ludGF4LCB3aGVyZSAibW9kaWZpZXIiIGlzIHBhc3NlZAorICAgICAgLy8gaW50byBwcmludE9wZXJhbmQuICBBbHNvIHN1cHBvcnQgJHs6ZmVhdHVyZX0sIHdoaWNoIGlzIHBhc3NlZCBpbnRvCisgICAgICAvLyBQcmludFNwZWNpYWwuCisgICAgICBzdGQ6OnN0cmluZyBNb2RpZmllcjsKKyAgICAgIAorICAgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgc3RhcnRpbmcgdGhlIG5leHQgc3RyaW5nIGF0IHRoZSB0ZXJtaW5hdGluZyBjdXJseQorICAgICAgLy8gYnJhY2UsIGFkdmFuY2UgdGhlIGVuZCBwb3NpdGlvbiBwYXN0IGl0IGlmIHdlIGZvdW5kIGFuIG9wZW5pbmcgY3VybHkKKyAgICAgIC8vIGJyYWNlLgorICAgICAgaWYgKGhhc0N1cmx5QnJhY2VzKSB7CisgICAgICAgIGlmIChWYXJFbmQgPj0gQXNtU3RyaW5nLnNpemUoKSkKKyAgICAgICAgICB0aHJvdyAiUmVhY2hlZCBlbmQgb2Ygc3RyaW5nIGJlZm9yZSB0ZXJtaW5hdGluZyBjdXJseSBicmFjZSBpbiAnIgorICAgICAgICAgICsgQ0dJLlRoZURlZi0+Z2V0TmFtZSgpICsgIiciOworICAgICAgICAKKyAgICAgICAgLy8gTG9vayBmb3IgYSBtb2RpZmllciBzdHJpbmcuCisgICAgICAgIGlmIChBc21TdHJpbmdbVmFyRW5kXSA9PSAnOicpIHsKKyAgICAgICAgICArK1ZhckVuZDsKKyAgICAgICAgICBpZiAoVmFyRW5kID49IEFzbVN0cmluZy5zaXplKCkpCisgICAgICAgICAgICB0aHJvdyAiUmVhY2hlZCBlbmQgb2Ygc3RyaW5nIGJlZm9yZSB0ZXJtaW5hdGluZyBjdXJseSBicmFjZSBpbiAnIgorICAgICAgICAgICAgKyBDR0kuVGhlRGVmLT5nZXROYW1lKCkgKyAiJyI7CisgICAgICAgICAgCisgICAgICAgICAgdW5zaWduZWQgTW9kaWZpZXJTdGFydCA9IFZhckVuZDsKKyAgICAgICAgICB3aGlsZSAoVmFyRW5kIDwgQXNtU3RyaW5nLnNpemUoKSAmJiBpc0lkZW50Q2hhcihBc21TdHJpbmdbVmFyRW5kXSkpCisgICAgICAgICAgICArK1ZhckVuZDsKKyAgICAgICAgICBNb2RpZmllciA9IHN0ZDo6c3RyaW5nKEFzbVN0cmluZy5iZWdpbigpK01vZGlmaWVyU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc21TdHJpbmcuYmVnaW4oKStWYXJFbmQpOworICAgICAgICAgIGlmIChNb2RpZmllci5lbXB0eSgpKQorICAgICAgICAgICAgdGhyb3cgIkJhZCBvcGVyYW5kIG1vZGlmaWVyIG5hbWUgaW4gJyIrIENHSS5UaGVEZWYtPmdldE5hbWUoKSArICInIjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKEFzbVN0cmluZ1tWYXJFbmRdICE9ICd9JykKKyAgICAgICAgICB0aHJvdyAiVmFyaWFibGUgbmFtZSBiZWdpbm5pbmcgd2l0aCAneycgZGlkIG5vdCBlbmQgd2l0aCAnfScgaW4gJyIKKyAgICAgICAgICArIENHSS5UaGVEZWYtPmdldE5hbWUoKSArICInIjsKKyAgICAgICAgKytWYXJFbmQ7CisgICAgICB9CisgICAgICBpZiAoVmFyTmFtZS5lbXB0eSgpICYmIE1vZGlmaWVyLmVtcHR5KCkpCisgICAgICAgIHRocm93ICJTdHJheSAnJCcgaW4gJyIgKyBDR0kuVGhlRGVmLT5nZXROYW1lKCkgKworICAgICAgICAiJyBhc20gc3RyaW5nLCBtYXliZSB5b3Ugd2FudCAkJD8iOworICAgICAgCisgICAgICBpZiAoVmFyTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIEp1c3QgYSBtb2RpZmllciwgcGFzcyB0aGlzIGludG8gUHJpbnRTcGVjaWFsLgorICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soQXNtV3JpdGVyT3BlcmFuZCgiUHJpbnRTcGVjaWFsIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4wVSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4wVSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVyKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPdGhlcndpc2UsIG5vcm1hbCBvcGVyYW5kLgorICAgICAgICB1bnNpZ25lZCBPcE5vID0gQ0dJLmdldE9wZXJhbmROYW1lZChWYXJOYW1lKTsKKyAgICAgICAgQ29kZUdlbkluc3RydWN0aW9uOjpPcGVyYW5kSW5mbyBPcEluZm8gPSBDR0kuT3BlcmFuZExpc3RbT3BOb107CisgICAgICAgIAorICAgICAgICBpZiAoQ3VyVmFyaWFudCA9PSBWYXJpYW50IHx8IEN1clZhcmlhbnQgPT0gfjBVKSB7CisgICAgICAgICAgdW5zaWduZWQgTUlPcCA9IE9wSW5mby5NSU9wZXJhbmRObzsKKyAgICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soQXNtV3JpdGVyT3BlcmFuZChPcEluZm8uUHJpbnRlck1ldGhvZE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllcikpOworICAgICAgICB9CisgICAgICB9CisgICAgICBMYXN0RW1pdHRlZCA9IFZhckVuZDsKKyAgICB9CisgIH0KKyAgCisgIE9wZXJhbmRzLnB1c2hfYmFjayhBc21Xcml0ZXJPcGVyYW5kKCJyZXR1cm47IiwKKyAgICBBc21Xcml0ZXJPcGVyYW5kOjppc0xpdGVyYWxTdGF0ZW1lbnRPcGVyYW5kKSk7Cit9CisKKy8vLyBNYXRjaGVzQWxsQnV0T25lT3AgLSBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGV4YWN0bHkgaWRlbnRpY2FsIHRvIHRoZQorLy8vIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBleGNlcHQgZm9yIG9uZSBkaWZmZXJpbmcgb3BlcmFuZCwgcmV0dXJuIHRoZSBkaWZmZXJpbmcKKy8vLyBvcGVyYW5kIG51bWJlci4gIElmIG1vcmUgdGhhbiBvbmUgb3BlcmFuZCBtaXNtYXRjaGVzLCByZXR1cm4gfjEsIG90aGVyd2lzZQorLy8vIGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGlkZW50aWNhbCByZXR1cm4gfjAuCit1bnNpZ25lZCBBc21Xcml0ZXJJbnN0OjpNYXRjaGVzQWxsQnV0T25lT3AoY29uc3QgQXNtV3JpdGVySW5zdCAmT3RoZXIpY29uc3R7CisgIGlmIChPcGVyYW5kcy5zaXplKCkgIT0gT3RoZXIuT3BlcmFuZHMuc2l6ZSgpKSByZXR1cm4gfjE7CisgIAorICB1bnNpZ25lZCBNaXNtYXRjaE9wZXJhbmQgPSB+MFU7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKE9wZXJhbmRzW2ldICE9IE90aGVyLk9wZXJhbmRzW2ldKSB7CisgICAgICBpZiAoTWlzbWF0Y2hPcGVyYW5kICE9IH4wVSkgIC8vIEFscmVhZHkgaGF2ZSBvbmUgbWlzbWF0Y2g/CisgICAgICAgIHJldHVybiB+MVU7CisgICAgICBlbHNlCisgICAgICAgIE1pc21hdGNoT3BlcmFuZCA9IGk7CisgICAgfQorICB9CisgIHJldHVybiBNaXNtYXRjaE9wZXJhbmQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Bc21Xcml0ZXJJbnN0LmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Bc21Xcml0ZXJJbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiODU4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0FzbVdyaXRlckluc3QuaApAQCAtMCwwICsxLDExMyBAQAorLy89PT0tIEFzbVdyaXRlckluc3QuaCAtIENsYXNzZXMgZW5jYXBzdWxhdGluZyBhIHByaW50YWJsZSBpbnN0IC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGVzZSBjbGFzc2VzIGltcGxlbWVudCBhIHBhcnNlciBmb3IgYXNzZW1ibHkgc3RyaW5ncy4gIFRoZSBwYXJzZXIgc3BsaXRzCisvLyB0aGUgc3RyaW5nIGludG8gb3BlcmFuZHMsIHdoaWNoIGNhbiBiZSBsaXRlcmFsIHN0cmluZ3MgKHRoZSBjb25zdGFudCBiaXRzIG9mCisvLyB0aGUgc3RyaW5nKSwgYWN0dWFsIG9wZXJhbmRzIChpLmUuLCBvcGVyYW5kcyBmcm9tIHRoZSBNYWNoaW5lSW5zdHIpLCBhbmQKKy8vIGR5bmFtaWNhbGx5LWdlbmVyYXRlZCB0ZXh0LCBzcGVjaWZpZWQgYnkgcmF3IEMrKyBjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQVNNV1JJVEVSX0lOU1RfSAorI2RlZmluZSBBU01XUklURVJfSU5TVF9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIENvZGVHZW5JbnN0cnVjdGlvbjsKKyAgY2xhc3MgUmVjb3JkOworICAKKyAgc3RydWN0IEFzbVdyaXRlck9wZXJhbmQgeworICAgIGVudW0gT3BUeXBlIHsKKyAgICAgIC8vIE91dHB1dCB0aGlzIHRleHQgc3Vycm91bmRlZCBieSBxdW90ZXMgdG8gdGhlIGFzbS4KKyAgICAgIGlzTGl0ZXJhbFRleHRPcGVyYW5kLCAKKyAgICAgIC8vIFRoaXMgaXMgdGhlIG5hbWUgb2YgYSByb3V0aW5lIHRvIGNhbGwgdG8gcHJpbnQgdGhlIG9wZXJhbmQuCisgICAgICBpc01hY2hpbmVJbnN0ck9wZXJhbmQsCisgICAgICAvLyBPdXRwdXQgdGhpcyB0ZXh0IHZlcmJhdGltIHRvIHRoZSBhc20gd3JpdGVyLiAgSXQgaXMgY29kZSB0aGF0CisgICAgICAvLyB3aWxsIG91dHB1dCBzb21lIHRleHQgdG8gdGhlIGFzbS4KKyAgICAgIGlzTGl0ZXJhbFN0YXRlbWVudE9wZXJhbmQKKyAgICB9IE9wZXJhbmRUeXBlOworICAgIAorICAgIC8vLyBTdHIgLSBGb3IgaXNMaXRlcmFsVGV4dE9wZXJhbmQsIHRoaXMgSVMgdGhlIGxpdGVyYWwgdGV4dC4gIEZvcgorICAgIC8vLyBpc01hY2hpbmVJbnN0ck9wZXJhbmQsIHRoaXMgaXMgdGhlIFByaW50ZXJNZXRob2ROYW1lIGZvciB0aGUgb3BlcmFuZC4uCisgICAgLy8vIEZvciBpc0xpdGVyYWxTdGF0ZW1lbnRPcGVyYW5kLCB0aGlzIGlzIHRoZSBjb2RlIHRvIGluc2VydCB2ZXJiYXRpbSAKKyAgICAvLy8gaW50byB0aGUgYXNtIHdyaXRlci4KKyAgICBzdGQ6OnN0cmluZyBTdHI7CisgICAgCisgICAgLy8vIENHSU9wTm8gLSBGb3IgaXNNYWNoaW5lSW5zdHJPcGVyYW5kLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgb3BlcmFuZCBpbgorICAgIC8vLyB0aGUgQ29kZUdlbkluc3RydWN0aW9uLgorICAgIHVuc2lnbmVkIENHSU9wTm87CisgICAgCisgICAgLy8vIE1pT3BObyAtIEZvciBpc01hY2hpbmVJbnN0ck9wZXJhbmQsIHRoaXMgaXMgdGhlIG9wZXJhbmQgbnVtYmVyIG9mIHRoZQorICAgIC8vLyBtYWNoaW5lIGluc3RydWN0aW9uLgorICAgIHVuc2lnbmVkIE1JT3BObzsKKyAgICAKKyAgICAvLy8gTWlNb2RpZmllciAtIEZvciBpc01hY2hpbmVJbnN0ck9wZXJhbmQsIHRoaXMgaXMgdGhlIG1vZGlmaWVyIHN0cmluZyBmb3IKKyAgICAvLy8gYW4gb3BlcmFuZCwgc3BlY2lmaWVkIHdpdGggc3ludGF4IGxpa2UgJHtvcG5hbWU6bW9kaWZpZXJ9LgorICAgIHN0ZDo6c3RyaW5nIE1pTW9kaWZpZXI7CisgICAgCisgICAgLy8gVG8gbWFrZSBWUyBTVEwgaGFwcHkKKyAgICBBc21Xcml0ZXJPcGVyYW5kKE9wVHlwZSBvcCA9IGlzTGl0ZXJhbFRleHRPcGVyYW5kKTpPcGVyYW5kVHlwZShvcCkge30KKyAgICAKKyAgICBBc21Xcml0ZXJPcGVyYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICZMaXRTdHIsCisgICAgICAgICAgICAgICAgICAgICBPcFR5cGUgb3AgPSBpc0xpdGVyYWxUZXh0T3BlcmFuZCkKKyAgICA6IE9wZXJhbmRUeXBlKG9wKSwgU3RyKExpdFN0cikge30KKyAgICAKKyAgICBBc21Xcml0ZXJPcGVyYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICZQcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX0NHSU9wTm8sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBfTUlPcE5vLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgT3BUeXBlIG9wID0gaXNNYWNoaW5lSW5zdHJPcGVyYW5kKSAKKyAgICA6IE9wZXJhbmRUeXBlKG9wKSwgU3RyKFByaW50ZXIpLCBDR0lPcE5vKF9DR0lPcE5vKSwgTUlPcE5vKF9NSU9wTm8pLAorICAgIE1pTW9kaWZpZXIoTW9kaWZpZXIpIHt9CisgICAgCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFzbVdyaXRlck9wZXJhbmQgJk90aGVyKSBjb25zdCB7CisgICAgICBpZiAoT3BlcmFuZFR5cGUgIT0gT3RoZXIuT3BlcmFuZFR5cGUgfHwgU3RyICE9IE90aGVyLlN0cikgcmV0dXJuIHRydWU7CisgICAgICBpZiAoT3BlcmFuZFR5cGUgPT0gaXNNYWNoaW5lSW5zdHJPcGVyYW5kKQorICAgICAgICByZXR1cm4gTUlPcE5vICE9IE90aGVyLk1JT3BObyB8fCBNaU1vZGlmaWVyICE9IE90aGVyLk1pTW9kaWZpZXI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBc21Xcml0ZXJPcGVyYW5kICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuICFvcGVyYXRvciE9KE90aGVyKTsKKyAgICB9CisgICAgCisgICAgLy8vIGdldENvZGUgLSBSZXR1cm4gdGhlIGNvZGUgdGhhdCBwcmludHMgdGhpcyBvcGVyYW5kLgorICAgIHN0ZDo6c3RyaW5nIGdldENvZGUoKSBjb25zdDsKKyAgfTsKKyAgCisgIGNsYXNzIEFzbVdyaXRlckluc3QgeworICBwdWJsaWM6CisgICAgc3RkOjp2ZWN0b3I8QXNtV3JpdGVyT3BlcmFuZD4gT3BlcmFuZHM7CisgICAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uICpDR0k7CisgICAgCisgICAgQXNtV3JpdGVySW5zdChjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24gJkNHSSwgCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYXJpYW50LAorICAgICAgICAgICAgICAgICAgaW50IEZpcnN0T3BlcmFuZENvbHVtbiwKKyAgICAgICAgICAgICAgICAgIGludCBPcGVyYW5kU3BhY2luZyk7CisgICAgCisgICAgLy8vIE1hdGNoZXNBbGxCdXRPbmVPcCAtIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgZXhhY3RseSBpZGVudGljYWwgdG8gdGhlCisgICAgLy8vIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBleGNlcHQgZm9yIG9uZSBkaWZmZXJpbmcgb3BlcmFuZCwgcmV0dXJuIHRoZQorICAgIC8vLyBkaWZmZXJpbmcgb3BlcmFuZCBudW1iZXIuICBPdGhlcndpc2UgcmV0dXJuIH4wLgorICAgIHVuc2lnbmVkIE1hdGNoZXNBbGxCdXRPbmVPcChjb25zdCBBc21Xcml0ZXJJbnN0ICZPdGhlcikgY29uc3Q7CisgICAgCisgIHByaXZhdGU6CisgICAgdm9pZCBBZGRMaXRlcmFsU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpIHsKKyAgICAgIC8vIElmIHRoZSBsYXN0IG9wZXJhbmQgd2FzIGFscmVhZHkgYSBsaXRlcmFsIHRleHQgc3RyaW5nLCBhcHBlbmQgdGhpcyB0bworICAgICAgLy8gaXQsIG90aGVyd2lzZSBhZGQgYSBuZXcgb3BlcmFuZC4KKyAgICAgIGlmICghT3BlcmFuZHMuZW1wdHkoKSAmJgorICAgICAgICAgIE9wZXJhbmRzLmJhY2soKS5PcGVyYW5kVHlwZSA9PSBBc21Xcml0ZXJPcGVyYW5kOjppc0xpdGVyYWxUZXh0T3BlcmFuZCkKKyAgICAgICAgT3BlcmFuZHMuYmFjaygpLlN0ci5hcHBlbmQoU3RyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKEFzbVdyaXRlck9wZXJhbmQoU3RyKSk7CisgICAgfQorICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NNYWtlTGlzdHMudHh0IGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyOTg5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDYgQEAKK2FkZF9leGVjdXRhYmxlKHRibGdlbgorICBBUk1EZWNvZGVyRW1pdHRlci5jcHAKKyAgQXNtTWF0Y2hlckVtaXR0ZXIuY3BwCisgIEFzbVdyaXRlckVtaXR0ZXIuY3BwCisgIEFzbVdyaXRlckluc3QuY3BwCisgIENhbGxpbmdDb252RW1pdHRlci5jcHAKKyAgQ2xhbmdBU1ROb2Rlc0VtaXR0ZXIuY3BwCisgIENsYW5nQXR0ckVtaXR0ZXIuY3BwCisgIENsYW5nRGlhZ25vc3RpY3NFbWl0dGVyLmNwcAorICBDb2RlRW1pdHRlckdlbi5jcHAKKyAgQ29kZUdlbkRBR1BhdHRlcm5zLmNwcAorICBDb2RlR2VuSW5zdHJ1Y3Rpb24uY3BwCisgIENvZGVHZW5UYXJnZXQuY3BwCisgIERBR0lTZWxFbWl0dGVyLmNwcAorICBEQUdJU2VsTWF0Y2hlckVtaXR0ZXIuY3BwCisgIERBR0lTZWxNYXRjaGVyR2VuLmNwcAorICBEQUdJU2VsTWF0Y2hlck9wdC5jcHAKKyAgREFHSVNlbE1hdGNoZXIuY3BwCisgIERpc2Fzc2VtYmxlckVtaXR0ZXIuY3BwCisgIEVERW1pdHRlci5jcHAKKyAgRmFzdElTZWxFbWl0dGVyLmNwcAorICBJbnN0ckVudW1FbWl0dGVyLmNwcAorICBJbnN0ckluZm9FbWl0dGVyLmNwcAorICBJbnRyaW5zaWNFbWl0dGVyLmNwcAorICBMTFZNQ0NvbmZpZ3VyYXRpb25FbWl0dGVyLmNwcAorICBOZW9uRW1pdHRlci5jcHAKKyAgT3B0UGFyc2VyRW1pdHRlci5jcHAKKyAgUmVjb3JkLmNwcAorICBSZWdpc3RlckluZm9FbWl0dGVyLmNwcAorICBTdWJ0YXJnZXRFbWl0dGVyLmNwcAorICBUR0xleGVyLmNwcAorICBUR1BhcnNlci5jcHAKKyAgVEdWYWx1ZVR5cGVzLmNwcAorICBUYWJsZUdlbi5jcHAKKyAgVGFibGVHZW5CYWNrZW5kLmNwcAorICBYODZEaXNhc3NlbWJsZXJUYWJsZXMuY3BwCisgIFg4NlJlY29nbml6YWJsZUluc3RyLmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0YmxnZW4gTExWTVN1cHBvcnQgTExWTVN5c3RlbSkKK2lmKCBNSU5HVyApCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0YmxnZW4gaW1hZ2VobHAgcHNhcGkpCitlbmRpZiggTUlOR1cgKQoraWYoIExMVk1fRU5BQkxFX1RIUkVBRFMgQU5EIEhBVkVfTElCUFRIUkVBRCBBTkQgTk9UIEJFT1MgKQorICB0YXJnZXRfbGlua19saWJyYXJpZXModGJsZ2VuIHB0aHJlYWQpCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9DYWxsaW5nQ29udkVtaXR0ZXIuY3BwIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2FsbGluZ0NvbnZFbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjQzNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2FsbGluZ0NvbnZFbWl0dGVyLmNwcApAQCAtMCwwICsxLDIxMiBAQAorLy89PT0tIENhbGxpbmdDb252RW1pdHRlci5jcHAgLSBHZW5lcmF0ZSBjYWxsaW5nIGNvbnZlbnRpb25zIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgaXMgcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGRlc2NyaXB0aW9ucyBvZiB0aGUgY2FsbGluZworLy8gY29udmVudGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJDYWxsaW5nQ29udkVtaXR0ZXIuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJDb2RlR2VuVGFyZ2V0LmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKwordm9pZCBDYWxsaW5nQ29udkVtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmTykgeworICBFbWl0U291cmNlRmlsZUhlYWRlcigiQ2FsbGluZyBDb252ZW50aW9uIEltcGxlbWVudGF0aW9uIEZyYWdtZW50IiwgTyk7CisKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gQ0NzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkNhbGxpbmdDb252Iik7CisgIAorICAvLyBFbWl0IHByb3RvdHlwZXMgZm9yIGFsbCBvZiB0aGUgQ0MncyBzbyB0aGF0IHRoZXkgY2FuIGZvcndhcmQgcmVmIGVhY2gKKyAgLy8gb3RoZXIuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDQ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE8gPDwgInN0YXRpYyBib29sICIgPDwgQ0NzW2ldLT5nZXROYW1lKCkKKyAgICAgIDw8ICIodW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCxcbiIKKyAgICAgIDw8IHN0ZDo6c3RyaW5nKENDc1tpXS0+Z2V0TmFtZSgpLnNpemUoKSsxMywgJyAnKQorICAgICAgPDwgIkVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbyxcbiIKKyAgICAgIDw8IHN0ZDo6c3RyaW5nKENDc1tpXS0+Z2V0TmFtZSgpLnNpemUoKSsxMywgJyAnKQorICAgICAgPDwgIklTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpO1xuIjsKKyAgfQorICAKKyAgLy8gRW1pdCBlYWNoIGNhbGxpbmcgY29udmVudGlvbiBkZXNjcmlwdGlvbiBpbiBmdWxsLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ0NzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgRW1pdENhbGxpbmdDb252KENDc1tpXSwgTyk7Cit9CisKKwordm9pZCBDYWxsaW5nQ29udkVtaXR0ZXI6OkVtaXRDYWxsaW5nQ29udihSZWNvcmQgKkNDLCByYXdfb3N0cmVhbSAmTykgeworICBMaXN0SW5pdCAqQ0NBY3Rpb25zID0gQ0MtPmdldFZhbHVlQXNMaXN0SW5pdCgiQWN0aW9ucyIpOworICBDb3VudGVyID0gMDsKKworICBPIDw8ICJcblxuc3RhdGljIGJvb2wgIiA8PCBDQy0+Z2V0TmFtZSgpCisgICAgPDwgIih1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULFxuIgorICAgIDw8IHN0ZDo6c3RyaW5nKENDLT5nZXROYW1lKCkuc2l6ZSgpKzEzLCAnICcpCisgICAgPDwgIkVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbyxcbiIKKyAgICA8PCBzdGQ6OnN0cmluZyhDQy0+Z2V0TmFtZSgpLnNpemUoKSsxMywgJyAnKQorICAgIDw8ICJJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKSB7XG4iOworICAvLyBFbWl0IGFsbCBvZiB0aGUgYWN0aW9ucywgaW4gb3JkZXIuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDQ0FjdGlvbnMtPmdldFNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBPIDw8ICJcbiI7CisgICAgRW1pdEFjdGlvbihDQ0FjdGlvbnMtPmdldEVsZW1lbnRBc1JlY29yZChpKSwgMiwgTyk7CisgIH0KKyAgCisgIE8gPDwgIlxuICByZXR1cm4gdHJ1ZTsgIC8vIENDIGRpZG4ndCBtYXRjaC5cbiI7CisgIE8gPDwgIn1cbiI7Cit9CisKK3ZvaWQgQ2FsbGluZ0NvbnZFbWl0dGVyOjpFbWl0QWN0aW9uKFJlY29yZCAqQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50LCByYXdfb3N0cmVhbSAmTykgeworICBzdGQ6OnN0cmluZyBJbmRlbnRTdHIgPSBzdGQ6OnN0cmluZyhJbmRlbnQsICcgJyk7CisgIAorICBpZiAoQWN0aW9uLT5pc1N1YkNsYXNzT2YoIkNDUHJlZGljYXRlQWN0aW9uIikpIHsKKyAgICBPIDw8IEluZGVudFN0ciA8PCAiaWYgKCI7CisgICAgCisgICAgaWYgKEFjdGlvbi0+aXNTdWJDbGFzc09mKCJDQ0lmVHlwZSIpKSB7CisgICAgICBMaXN0SW5pdCAqVlRzID0gQWN0aW9uLT5nZXRWYWx1ZUFzTGlzdEluaXQoIlZUcyIpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZUcy0+Z2V0U2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBSZWNvcmQgKlZUID0gVlRzLT5nZXRFbGVtZW50QXNSZWNvcmQoaSk7CisgICAgICAgIGlmIChpICE9IDApIE8gPDwgIiB8fFxuICAgICIgPDwgSW5kZW50U3RyOworICAgICAgICBPIDw8ICJMb2NWVCA9PSAiIDw8IGdldEVudW1OYW1lKGdldFZhbHVlVHlwZShWVCkpOworICAgICAgfQorCisgICAgfSBlbHNlIGlmIChBY3Rpb24tPmlzU3ViQ2xhc3NPZigiQ0NJZiIpKSB7CisgICAgICBPIDw8IEFjdGlvbi0+Z2V0VmFsdWVBc1N0cmluZygiUHJlZGljYXRlIik7CisgICAgfSBlbHNlIHsKKyAgICAgIEFjdGlvbi0+ZHVtcCgpOworICAgICAgdGhyb3cgIlVua25vd24gQ0NQcmVkaWNhdGVBY3Rpb24hIjsKKyAgICB9CisgICAgCisgICAgTyA8PCAiKSB7XG4iOworICAgIEVtaXRBY3Rpb24oQWN0aW9uLT5nZXRWYWx1ZUFzRGVmKCJTdWJBY3Rpb24iKSwgSW5kZW50KzIsIE8pOworICAgIE8gPDwgSW5kZW50U3RyIDw8ICJ9XG4iOworICB9IGVsc2UgeworICAgIGlmIChBY3Rpb24tPmlzU3ViQ2xhc3NPZigiQ0NEZWxlZ2F0ZVRvIikpIHsKKyAgICAgIFJlY29yZCAqQ0MgPSBBY3Rpb24tPmdldFZhbHVlQXNEZWYoIkNDIik7CisgICAgICBPIDw8IEluZGVudFN0ciA8PCAiaWYgKCEiIDw8IENDLT5nZXROYW1lKCkKKyAgICAgICAgPDwgIihWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBBcmdGbGFncywgU3RhdGUpKVxuIgorICAgICAgICA8PCBJbmRlbnRTdHIgPDwgIiAgcmV0dXJuIGZhbHNlO1xuIjsKKyAgICB9IGVsc2UgaWYgKEFjdGlvbi0+aXNTdWJDbGFzc09mKCJDQ0Fzc2lnblRvUmVnIikpIHsKKyAgICAgIExpc3RJbml0ICpSZWdMaXN0ID0gQWN0aW9uLT5nZXRWYWx1ZUFzTGlzdEluaXQoIlJlZ0xpc3QiKTsKKyAgICAgIGlmIChSZWdMaXN0LT5nZXRTaXplKCkgPT0gMSkgeworICAgICAgICBPIDw8IEluZGVudFN0ciA8PCAiaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKCI7CisgICAgICAgIE8gPDwgZ2V0UXVhbGlmaWVkTmFtZShSZWdMaXN0LT5nZXRFbGVtZW50QXNSZWNvcmQoMCkpIDw8ICIpKSB7XG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTyA8PCBJbmRlbnRTdHIgPDwgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0IiA8PCArK0NvdW50ZXIKKyAgICAgICAgICA8PCAiW10gPSB7XG4iOworICAgICAgICBPIDw8IEluZGVudFN0ciA8PCAiICAiOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnTGlzdC0+Z2V0U2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIGlmIChpICE9IDApIE8gPDwgIiwgIjsKKyAgICAgICAgICBPIDw8IGdldFF1YWxpZmllZE5hbWUoUmVnTGlzdC0+Z2V0RWxlbWVudEFzUmVjb3JkKGkpKTsKKyAgICAgICAgfQorICAgICAgICBPIDw8ICJcbiIgPDwgSW5kZW50U3RyIDw8ICJ9O1xuIjsKKyAgICAgICAgTyA8PCBJbmRlbnRTdHIgPDwgImlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0IgorICAgICAgICAgIDw8IENvdW50ZXIgPDwgIiwgIiA8PCBSZWdMaXN0LT5nZXRTaXplKCkgPDwgIikpIHtcbiI7CisgICAgICB9CisgICAgICBPIDw8IEluZGVudFN0ciA8PCAiICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsICIKKyAgICAgICAgPDwgIlJlZywgTG9jVlQsIExvY0luZm8pKTtcbiI7CisgICAgICBPIDw8IEluZGVudFN0ciA8PCAiICByZXR1cm4gZmFsc2U7XG4iOworICAgICAgTyA8PCBJbmRlbnRTdHIgPDwgIn1cbiI7CisgICAgfSBlbHNlIGlmIChBY3Rpb24tPmlzU3ViQ2xhc3NPZigiQ0NBc3NpZ25Ub1JlZ1dpdGhTaGFkb3ciKSkgeworICAgICAgTGlzdEluaXQgKlJlZ0xpc3QgPSBBY3Rpb24tPmdldFZhbHVlQXNMaXN0SW5pdCgiUmVnTGlzdCIpOworICAgICAgTGlzdEluaXQgKlNoYWRvd1JlZ0xpc3QgPSBBY3Rpb24tPmdldFZhbHVlQXNMaXN0SW5pdCgiU2hhZG93UmVnTGlzdCIpOworICAgICAgaWYgKFNoYWRvd1JlZ0xpc3QtPmdldFNpemUoKSA+MCAmJgorICAgICAgICAgIFNoYWRvd1JlZ0xpc3QtPmdldFNpemUoKSAhPSBSZWdMaXN0LT5nZXRTaXplKCkpCisgICAgICAgIHRocm93ICJJbnZhbGlkIGxlbmd0aCBvZiBsaXN0IG9mIHNoYWRvd2VkIHJlZ2lzdGVycyI7CisKKyAgICAgIGlmIChSZWdMaXN0LT5nZXRTaXplKCkgPT0gMSkgeworICAgICAgICBPIDw8IEluZGVudFN0ciA8PCAiaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKCI7CisgICAgICAgIE8gPDwgZ2V0UXVhbGlmaWVkTmFtZShSZWdMaXN0LT5nZXRFbGVtZW50QXNSZWNvcmQoMCkpOworICAgICAgICBPIDw8ICIsICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShTaGFkb3dSZWdMaXN0LT5nZXRFbGVtZW50QXNSZWNvcmQoMCkpOworICAgICAgICBPIDw8ICIpKSB7XG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgUmVnTGlzdE51bWJlciA9ICsrQ291bnRlcjsKKyAgICAgICAgdW5zaWduZWQgU2hhZG93UmVnTGlzdE51bWJlciA9ICsrQ291bnRlcjsKKworICAgICAgICBPIDw8IEluZGVudFN0ciA8PCAic3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3QiIDw8IFJlZ0xpc3ROdW1iZXIKKyAgICAgICAgICA8PCAiW10gPSB7XG4iOworICAgICAgICBPIDw8IEluZGVudFN0ciA8PCAiICAiOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnTGlzdC0+Z2V0U2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIGlmIChpICE9IDApIE8gPDwgIiwgIjsKKyAgICAgICAgICBPIDw8IGdldFF1YWxpZmllZE5hbWUoUmVnTGlzdC0+Z2V0RWxlbWVudEFzUmVjb3JkKGkpKTsKKyAgICAgICAgfQorICAgICAgICBPIDw8ICJcbiIgPDwgSW5kZW50U3RyIDw8ICJ9O1xuIjsKKworICAgICAgICBPIDw8IEluZGVudFN0ciA8PCAic3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3QiCisgICAgICAgICAgPDwgU2hhZG93UmVnTGlzdE51bWJlciA8PCAiW10gPSB7XG4iOworICAgICAgICBPIDw8IEluZGVudFN0ciA8PCAiICAiOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU2hhZG93UmVnTGlzdC0+Z2V0U2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIGlmIChpICE9IDApIE8gPDwgIiwgIjsKKyAgICAgICAgICBPIDw8IGdldFF1YWxpZmllZE5hbWUoU2hhZG93UmVnTGlzdC0+Z2V0RWxlbWVudEFzUmVjb3JkKGkpKTsKKyAgICAgICAgfQorICAgICAgICBPIDw8ICJcbiIgPDwgSW5kZW50U3RyIDw8ICJ9O1xuIjsKKworICAgICAgICBPIDw8IEluZGVudFN0ciA8PCAiaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3QiCisgICAgICAgICAgPDwgUmVnTGlzdE51bWJlciA8PCAiLCAiIDw8ICJSZWdMaXN0IiA8PCBTaGFkb3dSZWdMaXN0TnVtYmVyCisgICAgICAgICAgPDwgIiwgIiA8PCBSZWdMaXN0LT5nZXRTaXplKCkgPDwgIikpIHtcbiI7CisgICAgICB9CisgICAgICBPIDw8IEluZGVudFN0ciA8PCAiICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsICIKKyAgICAgICAgPDwgIlJlZywgTG9jVlQsIExvY0luZm8pKTtcbiI7CisgICAgICBPIDw8IEluZGVudFN0ciA8PCAiICByZXR1cm4gZmFsc2U7XG4iOworICAgICAgTyA8PCBJbmRlbnRTdHIgPDwgIn1cbiI7CisgICAgfSBlbHNlIGlmIChBY3Rpb24tPmlzU3ViQ2xhc3NPZigiQ0NBc3NpZ25Ub1N0YWNrIikpIHsKKyAgICAgIGludCBTaXplID0gQWN0aW9uLT5nZXRWYWx1ZUFzSW50KCJTaXplIik7CisgICAgICBpbnQgQWxpZ24gPSBBY3Rpb24tPmdldFZhbHVlQXNJbnQoIkFsaWduIik7CisKKyAgICAgIE8gPDwgSW5kZW50U3RyIDw8ICJ1bnNpZ25lZCBPZmZzZXQiIDw8ICsrQ291bnRlcgorICAgICAgICA8PCAiID0gU3RhdGUuQWxsb2NhdGVTdGFjaygiOworICAgICAgaWYgKFNpemUpCisgICAgICAgIE8gPDwgU2l6ZSA8PCAiLCAiOworICAgICAgZWxzZQorICAgICAgICBPIDw8ICJcbiIgPDwgSW5kZW50U3RyIDw8ICIgIFN0YXRlLmdldFRhcmdldCgpLmdldFRhcmdldERhdGEoKSIKKyAgICAgICAgICAiLT5nZXRUeXBlQWxsb2NTaXplKExvY1ZULmdldFR5cGVGb3JFVlQoU3RhdGUuZ2V0Q29udGV4dCgpKSksICI7CisgICAgICBpZiAoQWxpZ24pCisgICAgICAgIE8gPDwgQWxpZ247CisgICAgICBlbHNlCisgICAgICAgIE8gPDwgIlxuIiA8PCBJbmRlbnRTdHIgPDwgIiAgU3RhdGUuZ2V0VGFyZ2V0KCkuZ2V0VGFyZ2V0RGF0YSgpIgorICAgICAgICAgICItPmdldEFCSVR5cGVBbGlnbm1lbnQoTG9jVlQuZ2V0VHlwZUZvckVWVChTdGF0ZS5nZXRDb250ZXh0KCkpKSI7CisgICAgICBpZiAoQWN0aW9uLT5pc1N1YkNsYXNzT2YoIkNDQXNzaWduVG9TdGFja1dpdGhTaGFkb3ciKSkKKyAgICAgICAgTyA8PCAiLCAiIDw8IGdldFF1YWxpZmllZE5hbWUoQWN0aW9uLT5nZXRWYWx1ZUFzRGVmKCJTaGFkb3dSZWciKSk7CisgICAgICBPIDw8ICIpO1xuIiA8PCBJbmRlbnRTdHIKKyAgICAgICAgPDwgIlN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0TWVtKFZhbE5vLCBWYWxWVCwgT2Zmc2V0IgorICAgICAgICA8PCBDb3VudGVyIDw8ICIsIExvY1ZULCBMb2NJbmZvKSk7XG4iOworICAgICAgTyA8PCBJbmRlbnRTdHIgPDwgInJldHVybiBmYWxzZTtcbiI7CisgICAgfSBlbHNlIGlmIChBY3Rpb24tPmlzU3ViQ2xhc3NPZigiQ0NQcm9tb3RlVG9UeXBlIikpIHsKKyAgICAgIFJlY29yZCAqRGVzdFR5ID0gQWN0aW9uLT5nZXRWYWx1ZUFzRGVmKCJEZXN0VHkiKTsKKyAgICAgIE8gPDwgSW5kZW50U3RyIDw8ICJMb2NWVCA9ICIgPDwgZ2V0RW51bU5hbWUoZ2V0VmFsdWVUeXBlKERlc3RUeSkpIDw8IjtcbiI7CisgICAgICBPIDw8IEluZGVudFN0ciA8PCAiaWYgKEFyZ0ZsYWdzLmlzU0V4dCgpKVxuIgorICAgICAgICA8PCBJbmRlbnRTdHIgPDwgSW5kZW50U3RyIDw8ICJMb2NJbmZvID0gQ0NWYWxBc3NpZ246OlNFeHQ7XG4iCisgICAgICAgIDw8IEluZGVudFN0ciA8PCAiZWxzZSBpZiAoQXJnRmxhZ3MuaXNaRXh0KCkpXG4iCisgICAgICAgIDw8IEluZGVudFN0ciA8PCBJbmRlbnRTdHIgPDwgIkxvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6WkV4dDtcbiIKKyAgICAgICAgPDwgSW5kZW50U3RyIDw8ICJlbHNlXG4iCisgICAgICAgIDw8IEluZGVudFN0ciA8PCBJbmRlbnRTdHIgPDwgIkxvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6QUV4dDtcbiI7CisgICAgfSBlbHNlIGlmIChBY3Rpb24tPmlzU3ViQ2xhc3NPZigiQ0NCaXRDb252ZXJ0VG9UeXBlIikpIHsKKyAgICAgIFJlY29yZCAqRGVzdFR5ID0gQWN0aW9uLT5nZXRWYWx1ZUFzRGVmKCJEZXN0VHkiKTsKKyAgICAgIE8gPDwgSW5kZW50U3RyIDw8ICJMb2NWVCA9ICIgPDwgZ2V0RW51bU5hbWUoZ2V0VmFsdWVUeXBlKERlc3RUeSkpIDw8IjtcbiI7CisgICAgICBPIDw8IEluZGVudFN0ciA8PCAiTG9jSW5mbyA9IENDVmFsQXNzaWduOjpCQ3Z0O1xuIjsKKyAgICB9IGVsc2UgaWYgKEFjdGlvbi0+aXNTdWJDbGFzc09mKCJDQ1Bhc3NJbmRpcmVjdCIpKSB7CisgICAgICBSZWNvcmQgKkRlc3RUeSA9IEFjdGlvbi0+Z2V0VmFsdWVBc0RlZigiRGVzdFR5Iik7CisgICAgICBPIDw8IEluZGVudFN0ciA8PCAiTG9jVlQgPSAiIDw8IGdldEVudW1OYW1lKGdldFZhbHVlVHlwZShEZXN0VHkpKSA8PCI7XG4iOworICAgICAgTyA8PCBJbmRlbnRTdHIgPDwgIkxvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6SW5kaXJlY3Q7XG4iOworICAgIH0gZWxzZSBpZiAoQWN0aW9uLT5pc1N1YkNsYXNzT2YoIkNDUGFzc0J5VmFsIikpIHsKKyAgICAgIGludCBTaXplID0gQWN0aW9uLT5nZXRWYWx1ZUFzSW50KCJTaXplIik7CisgICAgICBpbnQgQWxpZ24gPSBBY3Rpb24tPmdldFZhbHVlQXNJbnQoIkFsaWduIik7CisgICAgICBPIDw8IEluZGVudFN0cgorICAgICAgICA8PCAiU3RhdGUuSGFuZGxlQnlWYWwoVmFsTm8sIFZhbFZULCBMb2NWVCwgTG9jSW5mbywgIgorICAgICAgICA8PCBTaXplIDw8ICIsICIgPDwgQWxpZ24gPDwgIiwgQXJnRmxhZ3MpO1xuIjsKKyAgICAgIE8gPDwgSW5kZW50U3RyIDw8ICJyZXR1cm4gZmFsc2U7XG4iOworICAgIH0gZWxzZSBpZiAoQWN0aW9uLT5pc1N1YkNsYXNzT2YoIkNDQ3VzdG9tIikpIHsKKyAgICAgIE8gPDwgSW5kZW50U3RyCisgICAgICAgIDw8ICJpZiAoIiA8PCBBY3Rpb24tPmdldFZhbHVlQXNTdHJpbmcoIkZ1bmNOYW1lIikgPDwgIihWYWxObywgVmFsVlQsICIKKyAgICAgICAgPDwgIkxvY1ZULCBMb2NJbmZvLCBBcmdGbGFncywgU3RhdGUpKVxuIjsKKyAgICAgIE8gPDwgSW5kZW50U3RyIDw8IEluZGVudFN0ciA8PCAicmV0dXJuIGZhbHNlO1xuIjsKKyAgICB9IGVsc2UgeworICAgICAgQWN0aW9uLT5kdW1wKCk7CisgICAgICB0aHJvdyAiVW5rbm93biBDQ0FjdGlvbiEiOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2FsbGluZ0NvbnZFbWl0dGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9DYWxsaW5nQ29udkVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmMyNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2FsbGluZ0NvbnZFbWl0dGVyLmgKQEAgLTAsMCArMSwzOCBAQAorLy89PT0tIENhbGxpbmdDb252RW1pdHRlci5oIC0gR2VuZXJhdGUgY2FsbGluZyBjb252ZW50aW9ucyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgaXMgcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGRlc2NyaXB0aW9ucyBvZiB0aGUgY2FsbGluZworLy8gY29udmVudGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQ0FMTElOR0NPTlZfRU1JVFRFUl9ICisjZGVmaW5lIENBTExJTkdDT05WX0VNSVRURVJfSAorCisjaW5jbHVkZSAiVGFibGVHZW5CYWNrZW5kLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIENhbGxpbmdDb252RW1pdHRlciA6IHB1YmxpYyBUYWJsZUdlbkJhY2tlbmQgeworICAgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IENhbGxpbmdDb252RW1pdHRlcihSZWNvcmRLZWVwZXIgJlIpIDogUmVjb3JkcyhSKSB7fQorCisgICAgLy8gcnVuIC0gT3V0cHV0IHRoZSBhc213cml0ZXIsIHJldHVybmluZyB0cnVlIG9uIGZhaWx1cmUuCisgICAgdm9pZCBydW4ocmF3X29zdHJlYW0gJm8pOworICAgIAorICBwcml2YXRlOgorICAgIHZvaWQgRW1pdENhbGxpbmdDb252KFJlY29yZCAqQ0MsIHJhd19vc3RyZWFtICZPKTsKKyAgICB2b2lkIEVtaXRBY3Rpb24oUmVjb3JkICpBY3Rpb24sIHVuc2lnbmVkIEluZGVudCwgcmF3X29zdHJlYW0gJk8pOworICAgIHVuc2lnbmVkIENvdW50ZXI7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NsYW5nQVNUTm9kZXNFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NsYW5nQVNUTm9kZXNFbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODdhYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2xhbmdBU1ROb2Rlc0VtaXR0ZXIuY3BwCkBAIC0wLDAgKzEsMTY1IEBACisvLz09PSBDbGFuZ0FTVE5vZGVzRW1pdHRlci5jcHAgLSBHZW5lcmF0ZSBDbGFuZyBBU1Qgbm9kZSB0YWJsZXMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZXNlIHRhYmxlZ2VuIGJhY2tlbmRzIGVtaXQgQ2xhbmcgQVNUIG5vZGUgdGFibGVzCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkNsYW5nQVNUTm9kZXNFbWl0dGVyLmgiCisjaW5jbHVkZSA8c2V0PgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTdGF0ZW1lbnQgTm9kZSBUYWJsZXMgKC5pbmMgZmlsZSkgZ2VuZXJhdGlvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFJldHVybnMgdGhlIGZpcnN0IGFuZCBsYXN0IG5vbi1hYnN0cmFjdCBzdWJyZWNvcmRzCisvLyBDYWxsZWQgcmVjdXJzaXZlbHkgdG8gZW5zdXJlIHRoYXQgbm9kZXMgcmVtYWluIGNvbnRpZ3VvdXMKK3N0ZDo6cGFpcjxSZWNvcmQgKiwgUmVjb3JkICo+IENsYW5nQVNUTm9kZXNFbWl0dGVyOjpFbWl0Tm9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hpbGRNYXAgJlRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkICpCYXNlKSB7CisgIHN0ZDo6c3RyaW5nIEJhc2VOYW1lID0gbWFjcm9OYW1lKEJhc2UtPmdldE5hbWUoKSk7CisKKyAgQ2hpbGRJdGVyYXRvciBpID0gVHJlZS5sb3dlcl9ib3VuZChCYXNlKSwgZSA9IFRyZWUudXBwZXJfYm91bmQoQmFzZSk7CisKKyAgUmVjb3JkICpGaXJzdCA9IDAsICpMYXN0ID0gMDsKKyAgLy8gVGhpcyBtaWdodCBiZSB0aGUgcHNldWRvLW5vZGUgZm9yIFN0bXQ7IGRvbid0IGFzc3VtZSBpdCBoYXMgYW4gQWJzdHJhY3QKKyAgLy8gYml0CisgIGlmIChCYXNlLT5nZXRWYWx1ZSgiQWJzdHJhY3QiKSAmJiAhQmFzZS0+Z2V0VmFsdWVBc0JpdCgiQWJzdHJhY3QiKSkKKyAgICBGaXJzdCA9IExhc3QgPSBCYXNlOworCisgIGZvciAoOyBpICE9IGU7ICsraSkgeworICAgIFJlY29yZCAqUiA9IGktPnNlY29uZDsKKyAgICBib29sIEFic3RyYWN0ID0gUi0+Z2V0VmFsdWVBc0JpdCgiQWJzdHJhY3QiKTsKKyAgICBzdGQ6OnN0cmluZyBOb2RlTmFtZSA9IG1hY3JvTmFtZShSLT5nZXROYW1lKCkpOworCisgICAgT1MgPDwgIiNpZm5kZWYgIiA8PCBOb2RlTmFtZSA8PCAiXG4iOworICAgIE9TIDw8ICIjICBkZWZpbmUgIiA8PCBOb2RlTmFtZSA8PCAiKFR5cGUsIEJhc2UpICIKKyAgICAgICAgPDwgQmFzZU5hbWUgPDwgIihUeXBlLCBCYXNlKVxuIjsKKyAgICBPUyA8PCAiI2VuZGlmXG4iOworCisgICAgaWYgKEFic3RyYWN0KQorICAgICAgT1MgPDwgIkFCU1RSQUNUXyIgPDwgbWFjcm9OYW1lKFJvb3QuZ2V0TmFtZSgpKSA8PCAiKCIgPDwgTm9kZU5hbWUgPDwgIigiCisgICAgICAgICAgPDwgUi0+Z2V0TmFtZSgpIDw8ICIsICIgPDwgYmFzZU5hbWUoKkJhc2UpIDw8ICIpKVxuIjsKKyAgICBlbHNlCisgICAgICBPUyA8PCBOb2RlTmFtZSA8PCAiKCIgPDwgUi0+Z2V0TmFtZSgpIDw8ICIsICIKKyAgICAgICAgICA8PCBiYXNlTmFtZSgqQmFzZSkgPDwgIilcbiI7CisKKyAgICBpZiAoVHJlZS5maW5kKFIpICE9IFRyZWUuZW5kKCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6cGFpcjxSZWNvcmQgKiwgUmVjb3JkICo+ICZSZXN1bHQKKyAgICAgICAgPSBFbWl0Tm9kZShUcmVlLCBPUywgUik7CisgICAgICBpZiAoIUZpcnN0ICYmIFJlc3VsdC5maXJzdCkKKyAgICAgICAgRmlyc3QgPSBSZXN1bHQuZmlyc3Q7CisgICAgICBpZiAoUmVzdWx0LnNlY29uZCkKKyAgICAgICAgTGFzdCA9IFJlc3VsdC5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghQWJzdHJhY3QpIHsKKyAgICAgICAgTGFzdCA9IFI7CisKKyAgICAgICAgaWYgKCFGaXJzdCkKKyAgICAgICAgICBGaXJzdCA9IFI7CisgICAgICB9CisgICAgfQorCisgICAgT1MgPDwgIiN1bmRlZiAiIDw8IE5vZGVOYW1lIDw8ICJcblxuIjsKKyAgfQorCisgIGlmIChGaXJzdCkgeworICAgIGFzc2VydCAoTGFzdCAmJiAiR290IGEgZmlyc3Qgbm9kZSBidXQgbm90IGEgbGFzdCBub2RlIGZvciBhIHJhbmdlISIpOworICAgIGlmIChCYXNlID09ICZSb290KQorICAgICAgT1MgPDwgIkxBU1RfIiA8PCBtYWNyb05hbWUoUm9vdC5nZXROYW1lKCkpIDw8ICJfUkFOR0UoIjsKKyAgICBlbHNlCisgICAgICBPUyA8PCBtYWNyb05hbWUoUm9vdC5nZXROYW1lKCkpIDw8ICJfUkFOR0UoIjsKKyAgICBPUyA8PCBCYXNlLT5nZXROYW1lKCkgPDwgIiwgIiA8PCBGaXJzdC0+Z2V0TmFtZSgpIDw8ICIsICIKKyAgICAgICA8PCBMYXN0LT5nZXROYW1lKCkgPDwgIilcblxuIjsKKyAgfQorCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihGaXJzdCwgTGFzdCk7Cit9CisKK3ZvaWQgQ2xhbmdBU1ROb2Rlc0VtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gV3JpdGUgdGhlIHByZWFtYmxlCisgIE9TIDw8ICIjaWZuZGVmIEFCU1RSQUNUXyIgPDwgbWFjcm9OYW1lKFJvb3QuZ2V0TmFtZSgpKSA8PCAiXG4iOworICBPUyA8PCAiIyAgZGVmaW5lIEFCU1RSQUNUXyIgPDwgbWFjcm9OYW1lKFJvb3QuZ2V0TmFtZSgpKSA8PCAiKFR5cGUpIFR5cGVcbiI7CisgIE9TIDw8ICIjZW5kaWZcbiI7CisKKyAgT1MgPDwgIiNpZm5kZWYgIiA8PCBtYWNyb05hbWUoUm9vdC5nZXROYW1lKCkpIDw8ICJfUkFOR0VcbiI7CisgIE9TIDw8ICIjICBkZWZpbmUgIgorICAgICA8PCBtYWNyb05hbWUoUm9vdC5nZXROYW1lKCkpIDw8ICJfUkFOR0UoQmFzZSwgRmlyc3QsIExhc3QpXG4iOworICBPUyA8PCAiI2VuZGlmXG5cbiI7CisKKyAgT1MgPDwgIiNpZm5kZWYgTEFTVF8iIDw8IG1hY3JvTmFtZShSb290LmdldE5hbWUoKSkgPDwgIl9SQU5HRVxuIjsKKyAgT1MgPDwgIiMgIGRlZmluZSBMQVNUXyIgCisgICAgIDw8IG1hY3JvTmFtZShSb290LmdldE5hbWUoKSkgPDwgIl9SQU5HRShCYXNlLCBGaXJzdCwgTGFzdCkgIiAKKyAgICAgPDwgbWFjcm9OYW1lKFJvb3QuZ2V0TmFtZSgpKSA8PCAiX1JBTkdFKEJhc2UsIEZpcnN0LCBMYXN0KVxuIjsKKyAgT1MgPDwgIiNlbmRpZlxuXG4iOworIAorICAvLyBFbWl0IHN0YXRlbWVudHMKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gU3RtdHMKKyAgICA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKFJvb3QuZ2V0TmFtZSgpKTsKKworICBDaGlsZE1hcCBUcmVlOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdG10cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgUmVjb3JkICpSID0gU3RtdHNbaV07CisKKyAgICBpZiAoUi0+Z2V0VmFsdWUoIkJhc2UiKSkKKyAgICAgIFRyZWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFItPmdldFZhbHVlQXNEZWYoIkJhc2UiKSwgUikpOworICAgIGVsc2UKKyAgICAgIFRyZWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCZSb290LCBSKSk7CisgIH0KKworICBFbWl0Tm9kZShUcmVlLCBPUywgJlJvb3QpOworCisgIE9TIDw8ICIjdW5kZWYgIiA8PCBtYWNyb05hbWUoUm9vdC5nZXROYW1lKCkpIDw8ICJcbiI7CisgIE9TIDw8ICIjdW5kZWYgIiA8PCBtYWNyb05hbWUoUm9vdC5nZXROYW1lKCkpIDw8ICJfUkFOR0VcbiI7CisgIE9TIDw8ICIjdW5kZWYgTEFTVF8iIDw8IG1hY3JvTmFtZShSb290LmdldE5hbWUoKSkgPDwgIl9SQU5HRVxuIjsKKyAgT1MgPDwgIiN1bmRlZiBBQlNUUkFDVF8iIDw8IG1hY3JvTmFtZShSb290LmdldE5hbWUoKSkgPDwgIlxuIjsKK30KKwordm9pZCBDbGFuZ0RlY2xDb250ZXh0RW1pdHRlcjo6cnVuKHJhd19vc3RyZWFtICZPUykgeworICAvLyBGSVhNRTogRmluZCBhIC50ZCBmaWxlIGZvcm1hdCB0byBhbGxvdyBmb3IgdGhpcyB0byBiZSByZXByZXNlbnRlZCBiZXR0ZXIuCisKKyAgT1MgPDwgIiNpZm5kZWYgREVDTF9DT05URVhUXG4iOworICBPUyA8PCAiIyAgZGVmaW5lIERFQ0xfQ09OVEVYVChERUNMKVxuIjsKKyAgT1MgPDwgIiNlbmRpZlxuIjsKKyAgCisgIE9TIDw8ICIjaWZuZGVmIERFQ0xfQ09OVEVYVF9CQVNFXG4iOworICBPUyA8PCAiIyAgZGVmaW5lIERFQ0xfQ09OVEVYVF9CQVNFKERFQ0wpIERFQ0xfQ09OVEVYVChERUNMKVxuIjsKKyAgT1MgPDwgIiNlbmRpZlxuIjsKKyAgCisgIHR5cGVkZWYgc3RkOjpzZXQ8UmVjb3JkKj4gUmVjb3JkU2V0OworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFJlY29yZFZlY3RvcjsKKyAgCisgIFJlY29yZFZlY3RvciBEZWNsQ29udGV4dHNWZWN0b3IKKyAgICA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJEZWNsQ29udGV4dCIpOworICBSZWNvcmRWZWN0b3IgRGVjbHMgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiRGVjbCIpOworICBSZWNvcmRTZXQgRGVjbENvbnRleHRzIChEZWNsQ29udGV4dHNWZWN0b3IuYmVnaW4oKSwgRGVjbENvbnRleHRzVmVjdG9yLmVuZCgpKTsKKyAgIAorICBmb3IgKFJlY29yZFZlY3Rvcjo6aXRlcmF0b3IgaSA9IERlY2xzLmJlZ2luKCksIGUgPSBEZWNscy5lbmQoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQgKlIgPSAqaTsKKworICAgIGlmIChSLT5nZXRWYWx1ZSgiQmFzZSIpKSB7CisgICAgICBSZWNvcmQgKkIgPSBSLT5nZXRWYWx1ZUFzRGVmKCJCYXNlIik7CisgICAgICBpZiAoRGVjbENvbnRleHRzLmZpbmQoQikgIT0gRGVjbENvbnRleHRzLmVuZCgpKSB7CisgICAgICAgIE9TIDw8ICJERUNMX0NPTlRFWFRfQkFTRSgiIDw8IEItPmdldE5hbWUoKSA8PCAiKVxuIjsKKyAgICAgICAgRGVjbENvbnRleHRzLmVyYXNlKEIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoUmVjb3JkU2V0OjppdGVyYXRvciBpID0gRGVjbENvbnRleHRzLmJlZ2luKCksIGUgPSBEZWNsQ29udGV4dHMuZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBPUyA8PCAiREVDTF9DT05URVhUKCIgPDwgKCppKS0+Z2V0TmFtZSgpIDw8ICIpXG4iOworICB9CisKKyAgT1MgPDwgIiN1bmRlZiBERUNMX0NPTlRFWFRcbiI7CisgIE9TIDw8ICIjdW5kZWYgREVDTF9DT05URVhUX0JBU0VcbiI7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9DbGFuZ0FTVE5vZGVzRW1pdHRlci5oIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2xhbmdBU1ROb2Rlc0VtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmY5YzlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2xhbmdBU1ROb2Rlc0VtaXR0ZXIuaApAQCAtMCwwICsxLDg0IEBACisvLz09PS0gQ2xhbmdBU1ROb2Rlc0VtaXR0ZXIuaCAtIEdlbmVyYXRlIENsYW5nIEFTVCBub2RlIHRhYmxlcyAtKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZXNlIHRhYmxlZ2VuIGJhY2tlbmRzIGVtaXQgQ2xhbmcgQVNUIG5vZGUgdGFibGVzCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBDTEFOR0FTVF9FTUlUVEVSX0gKKyNkZWZpbmUgQ0xBTkdBU1RfRU1JVFRFUl9ICisKKyNpbmNsdWRlICJUYWJsZUdlbkJhY2tlbmQuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQ2xhbmdBU1ROb2Rlc0VtaXR0ZXIgLSBUaGUgdG9wLWxldmVsIGNsYXNzIGVtaXRzIC5pbmMgZmlsZXMgY29udGFpbmluZworLy8vICBkZWNsYXJhdGlvbnMgb2YgQ2xhbmcgc3RhdGVtZW50cy4KKy8vLworY2xhc3MgQ2xhbmdBU1ROb2Rlc0VtaXR0ZXIgOiBwdWJsaWMgVGFibGVHZW5CYWNrZW5kIHsKKyAgLy8gQSBtYXAgZnJvbSBhIG5vZGUgdG8gZWFjaCBvZiBpdHMgZGVyaXZlZCBub2Rlcy4KKyAgdHlwZWRlZiBzdGQ6Om11bHRpbWFwPFJlY29yZCosIFJlY29yZCo+IENoaWxkTWFwOworICB0eXBlZGVmIENoaWxkTWFwOjpjb25zdF9pdGVyYXRvciBDaGlsZEl0ZXJhdG9yOworCisgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKyAgUmVjb3JkIFJvb3Q7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYXNlU3VmZml4OworCisgIC8vIENyZWF0ZSBhIG1hY3JvLWl6ZWQgdmVyc2lvbiBvZiBhIG5hbWUKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIG1hY3JvTmFtZShzdGQ6OnN0cmluZyBTKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFMuc2l6ZSgpOyArK2kpCisgICAgICBTW2ldID0gc3RkOjp0b3VwcGVyKFNbaV0pOworCisgICAgcmV0dXJuIFM7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIG5hbWUgdG8gYmUgcHJpbnRlZCBpbiB0aGUgYmFzZSBmaWVsZC4gTm9ybWFsbHkgdGhpcyBpcworICAvLyB0aGUgcmVjb3JkJ3MgbmFtZSBwbHVzIHRoZSBiYXNlIHN1ZmZpeCwgYnV0IGlmIGl0IGlzIHRoZSByb290IG5vZGUgYW5kCisgIC8vIHRoZSBzdWZmaXggaXMgbm9uLWVtcHR5LCBpdCdzIGp1c3QgdGhlIHN1ZmZpeC4KKyAgc3RkOjpzdHJpbmcgYmFzZU5hbWUoUmVjb3JkICZSKSB7CisgICAgaWYgKCZSID09ICZSb290ICYmICFCYXNlU3VmZml4LmVtcHR5KCkpCisgICAgICByZXR1cm4gQmFzZVN1ZmZpeDsKKyAgICAKKyAgICByZXR1cm4gUi5nZXROYW1lKCkgKyBCYXNlU3VmZml4OworICB9CisKKyAgc3RkOjpwYWlyPFJlY29yZCAqLCBSZWNvcmQgKj4gRW1pdE5vZGUgKGNvbnN0IENoaWxkTWFwICZUcmVlLCByYXdfb3N0cmVhbSYgT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmQgKkJhc2UpOworcHVibGljOgorICBleHBsaWNpdCBDbGFuZ0FTVE5vZGVzRW1pdHRlcihSZWNvcmRLZWVwZXIgJlIsIGNvbnN0IHN0ZDo6c3RyaW5nICZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmUykKKyAgICA6IFJlY29yZHMoUiksIFJvb3QoTiwgU01Mb2MoKSksIEJhc2VTdWZmaXgoUykKKyAgICB7fQorCisgIC8vIHJ1biAtIE91dHB1dCB0aGUgLmluYyBmaWxlIGNvbnRlbnRzCisgIHZvaWQgcnVuKHJhd19vc3RyZWFtICZPUyk7Cit9OworCisvLy8gQ2xhbmdEZWNsQ29udGV4dEVtaXR0ZXIgLSBFbWl0cyBhbiBhZGRlbmR1bSB0byBhIC5pbmMgZmlsZSB0byBlbnVtZXJhdGUgdGhlCisvLy8gY2xhbmcgZGVjbGFyYXRpb24gY29udGV4dHMuCisvLy8KK2NsYXNzIENsYW5nRGVjbENvbnRleHRFbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKworcHVibGljOgorICBleHBsaWNpdCBDbGFuZ0RlY2xDb250ZXh0RW1pdHRlcihSZWNvcmRLZWVwZXIgJlIpCisgICAgOiBSZWNvcmRzKFIpCisgIHt9CisKKyAgLy8gcnVuIC0gT3V0cHV0IHRoZSAuaW5jIGZpbGUgY29udGVudHMKKyAgdm9pZCBydW4ocmF3X29zdHJlYW0gJk9TKTsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2xhbmdBdHRyRW1pdHRlci5jcHAgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9DbGFuZ0F0dHJFbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmRkMmE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2xhbmdBdHRyRW1pdHRlci5jcHAKQEAgLTAsMCArMSw4NCBAQAorLy89PT0tIENsYW5nQXR0ckVtaXR0ZXIuY3BwIC0gR2VuZXJhdGUgQ2xhbmcgYXR0cmlidXRlIGhhbmRsaW5nID0tKi0gQysrIC0qLS09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGVzZSB0YWJsZWdlbiBiYWNrZW5kcyBlbWl0IENsYW5nIGF0dHJpYnV0ZSBwcm9jZXNzaW5nIGNvZGUKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQ2xhbmdBdHRyRW1pdHRlci5oIgorI2luY2x1ZGUgIlJlY29yZC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3ZvaWQgQ2xhbmdBdHRyQ2xhc3NFbWl0dGVyOjpydW4ocmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFRhYmxlR2VuLiBEbyBub3QgZWRpdC5cblxuIjsKKyAgT1MgPDwgIiNpZm5kZWYgTExWTV9DTEFOR19BVFRSX0NMQVNTRVNfSU5DXG4iOworICBPUyA8PCAiI2RlZmluZSBMTFZNX0NMQU5HX0FUVFJfQ0xBU1NFU19JTkNcblxuIjsKKworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBdHRycyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJBdHRyIik7CisKKyAgZm9yIChzdGQ6OnZlY3RvcjxSZWNvcmQqPjo6aXRlcmF0b3IgaSA9IEF0dHJzLmJlZ2luKCksIGUgPSBBdHRycy5lbmQoKTsKKyAgICAgICBpICE9IGU7ICsraSkgeworICAgIFJlY29yZCAmUiA9ICoqaTsKKworICAgIGlmIChSLmdldFZhbHVlQXNCaXQoIkRvTm90RW1pdCIpKQorICAgICAgY29udGludWU7CisKKyAgICBPUyA8PCAiY2xhc3MgIiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0ciA6IHB1YmxpYyBBdHRyIHtcbiI7CisKKyAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBcmdzID0gUi5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiQXJncyIpOworCisgICAgLy8gRklYTUU6IEhhbmRsZSBhcmd1bWVudHMKKyAgICBhc3NlcnQoQXJncy5lbXB0eSgpICYmICJDYW4ndCB5ZXQgaGFuZGxlIGFyZ3VtZW50cyIpOworCisgICAgT1MgPDwgIlxuIHB1YmxpYzpcbiI7CisgICAgT1MgPDwgIiAgIiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0cigiOworICAgIAorICAgIC8vIEFyZ3VtZW50cyBnbyBoZXJlCisgICAgCisgICAgT1MgPDwgIilcbiI7CisgICAgT1MgPDwgIiAgICA6IEF0dHIoYXR0cjo6IiA8PCBSLmdldE5hbWUoKSA8PCAiKSI7CisKKyAgICAvLyBBcmd1bWVudHMgZ28gaGVyZQorICAgIAorICAgIE9TIDw8ICIge31cblxuIjsKKworICAgIE9TIDw8ICIgIHZpcnR1YWwgQXR0ciAqY2xvbmUgKEFTVENvbnRleHQgJkMpIGNvbnN0O1xuIjsKKyAgICBPUyA8PCAiICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSAiCisgICAgICAgPDwgImF0dHI6OiIgPDwgUi5nZXROYW1lKCkgPDwgIjsgfVxuIjsKKyAgICBPUyA8PCAiICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0ICIgPDwgUi5nZXROYW1lKCkKKyAgICAgICA8PCAiQXR0ciAqKSB7IHJldHVybiB0cnVlOyB9XG4iOworICAgIE9TIDw8ICJ9O1xuXG4iOworICB9CisKKyAgT1MgPDwgIiNlbmRpZlxuIjsKK30KKwordm9pZCBDbGFuZ0F0dHJMaXN0RW1pdHRlcjo6cnVuKHJhd19vc3RyZWFtICZPUykgeworICBPUyA8PCAiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBUYWJsZUdlbi4gRG8gbm90IGVkaXQuXG5cbiI7CisKKyAgT1MgPDwgIiNpZm5kZWYgTEFTVF9BVFRSXG4iOworICBPUyA8PCAiI2RlZmluZSBMQVNUX0FUVFIoTkFNRSkgQVRUUihOQU1FKVxuIjsKKyAgT1MgPDwgIiNlbmRpZlxuXG4iOworICAgCisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEF0dHJzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkF0dHIiKTsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj46Oml0ZXJhdG9yIGkgPSBBdHRycy5iZWdpbigpLCBlID0gQXR0cnMuZW5kKCk7CisKKyAgaWYgKGkgIT0gZSkgeworICAgIC8vIE1vdmUgdGhlIGVuZCBpdGVyYXRvciBiYWNrIHRvIGVtaXQgdGhlIGxhc3QgYXR0cmlidXRlLgorICAgIGZvcigtLWU7IGkgIT0gZTsgKytpKQorICAgICAgT1MgPDwgIkFUVFIoIiA8PCAoKmkpLT5nZXROYW1lKCkgPDwgIilcbiI7CisgICAgCisgICAgT1MgPDwgIkxBU1RfQVRUUigiIDw8ICgqaSktPmdldE5hbWUoKSA8PCAiKVxuXG4iOworICB9CisKKyAgT1MgPDwgIiN1bmRlZiBMQVNUX0FUVFJcbiI7CisgIE9TIDw8ICIjdW5kZWYgQVRUUlxuIjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NsYW5nQXR0ckVtaXR0ZXIuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NsYW5nQXR0ckVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UxYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ2xhbmdBdHRyRW1pdHRlci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LSBDbGFuZ0F0dHJFbWl0dGVyLmggLSBHZW5lcmF0ZSBDbGFuZyBhdHRyaWJ1dGUgaGFuZGxpbmcgPS0qLSBDKysgLSotLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlc2UgdGFibGVnZW4gYmFja2VuZHMgZW1pdCBDbGFuZyBhdHRyaWJ1dGUgcHJvY2Vzc2luZyBjb2RlCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBDTEFOR0FUVFJfRU1JVFRFUl9ICisjZGVmaW5lIENMQU5HQVRUUl9FTUlUVEVSX0gKKworI2luY2x1ZGUgIlRhYmxlR2VuQmFja2VuZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBDbGFuZ0F0dHJDbGFzc0VtaXR0ZXIgLSBjbGFzcyBlbWl0cyB0aGUgY2xhc3MgZGVmaW50aW9ucyBmb3IgYXR0cmlidXRlcyBmb3IKKy8vLyAgIGNsYW5nLgorY2xhc3MgQ2xhbmdBdHRyQ2xhc3NFbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKyAKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENsYW5nQXR0ckNsYXNzRW1pdHRlcihSZWNvcmRLZWVwZXIgJlIpCisgICAgOiBSZWNvcmRzKFIpCisgICAge30KKworICB2b2lkIHJ1bihyYXdfb3N0cmVhbSAmT1MpOworfTsKKworLy8vIENsYW5nQXR0ckxpc3RFbWl0dGVyIC0gY2xhc3MgZW1pdHMgdGhlIGVudW1lcmF0aW9uIGxpc3QgZm9yIGF0dHJpYnV0ZXMgZm9yCisvLy8gICBjbGFuZy4KK2NsYXNzIENsYW5nQXR0ckxpc3RFbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ2xhbmdBdHRyTGlzdEVtaXR0ZXIoUmVjb3JkS2VlcGVyICZSKQorICAgIDogUmVjb3JkcyhSKQorICAgIHt9CisKKyAgdm9pZCBydW4ocmF3X29zdHJlYW0gJk9TKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9DbGFuZ0RpYWdub3N0aWNzRW1pdHRlci5jcHAgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9DbGFuZ0RpYWdub3N0aWNzRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViNjI1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NsYW5nRGlhZ25vc3RpY3NFbWl0dGVyLmNwcApAQCAtMCwwICsxLDI4NiBAQAorLy89LSBDbGFuZ0RpYWdub3N0aWNzRW1pdHRlci5jcHAgLSBHZW5lcmF0ZSBDbGFuZyBkaWFnbm9zdGljcyB0YWJsZXMgLSotIEMrKyAtKi0KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGVzZSB0YWJsZWdlbiBiYWNrZW5kcyBlbWl0IENsYW5nIGRpYWdub3N0aWNzIHRhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQ2xhbmdEaWFnbm9zdGljc0VtaXR0ZXIuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1ZlY3RvckV4dHJhcy5oIgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERpYWdub3N0aWMgY2F0ZWdvcnkgY29tcHV0YXRpb24gY29kZS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSB7CitjbGFzcyBEaWFnR3JvdXBQYXJlbnRNYXAgeworICBzdGQ6Om1hcDxjb25zdCBSZWNvcmQqLCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiA+IE1hcHBpbmc7CitwdWJsaWM6CisgIERpYWdHcm91cFBhcmVudE1hcCgpIHsKKyAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBEaWFnR3JvdXBzCisgICAgICA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJEaWFnR3JvdXAiKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGlhZ0dyb3Vwcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBTdWJHcm91cHMgPQorICAgICAgICBEaWFnR3JvdXBzW2ldLT5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiU3ViR3JvdXBzIik7CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gU3ViR3JvdXBzLnNpemUoKTsgaiAhPSBlOyArK2opCisgICAgICAgIE1hcHBpbmdbU3ViR3JvdXBzW2pdXS5wdXNoX2JhY2soRGlhZ0dyb3Vwc1tpXSk7CisgICAgfQorICB9CisgIAorICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmZ2V0UGFyZW50cyhjb25zdCBSZWNvcmQgKkdyb3VwKSB7CisgICAgcmV0dXJuIE1hcHBpbmdbR3JvdXBdOworICB9Cit9OworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZS4KKworCitzdGF0aWMgc3RkOjpzdHJpbmcKK2dldENhdGVnb3J5RnJvbURpYWdHcm91cChjb25zdCBSZWNvcmQgKkdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdHcm91cFBhcmVudE1hcCAmRGlhZ0dyb3VwUGFyZW50cykgeworICAvLyBJZiB0aGUgRGlhZ0dyb3VwIGhhcyBhIGNhdGVnb3J5LCByZXR1cm4gaXQuCisgIHN0ZDo6c3RyaW5nIENhdE5hbWUgPSBHcm91cC0+Z2V0VmFsdWVBc1N0cmluZygiQ2F0ZWdvcnlOYW1lIik7CisgIGlmICghQ2F0TmFtZS5lbXB0eSgpKSByZXR1cm4gQ2F0TmFtZTsKKyAgCisgIC8vIFRoZSBkaWFnIGdyb3VwIG1heSB0aGUgc3ViZ3JvdXAgb2Ygb25lIG9yIG1vcmUgb3RoZXIgZGlhZ25vc3RpYyBncm91cHMsCisgIC8vIGNoZWNrIHRoZXNlIGZvciBhIGNhdGVnb3J5IGFzIHdlbGwuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+ICZQYXJlbnRzID0gRGlhZ0dyb3VwUGFyZW50cy5nZXRQYXJlbnRzKEdyb3VwKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBhcmVudHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIENhdE5hbWUgPSBnZXRDYXRlZ29yeUZyb21EaWFnR3JvdXAoUGFyZW50c1tpXSwgRGlhZ0dyb3VwUGFyZW50cyk7CisgICAgaWYgKCFDYXROYW1lLmVtcHR5KCkpIHJldHVybiBDYXROYW1lOworICB9CisgIHJldHVybiAiIjsKK30KKworLy8vIGdldERpYWdub3N0aWNDYXRlZ29yeSAtIFJldHVybiB0aGUgY2F0ZWdvcnkgdGhhdCB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMKKy8vLyBsaXZlcyBpbi4KK3N0YXRpYyBzdGQ6OnN0cmluZyBnZXREaWFnbm9zdGljQ2F0ZWdvcnkoY29uc3QgUmVjb3JkICpSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnR3JvdXBQYXJlbnRNYXAgJkRpYWdHcm91cFBhcmVudHMpIHsKKyAgLy8gSWYgdGhlIGRpYWdub3N0aWMgaXMgaW4gYSBncm91cCwgYW5kIHRoYXQgZ3JvdXAgaGFzIGEgY2F0ZWdvcnksIHVzZSBpdC4KKyAgaWYgKERlZkluaXQgKkdyb3VwID0gZHluYW1pY19jYXN0PERlZkluaXQqPihSLT5nZXRWYWx1ZUluaXQoIkdyb3VwIikpKSB7CisgICAgLy8gQ2hlY2sgdGhlIGRpYWdub3N0aWMncyBkaWFnIGdyb3VwIGZvciBhIGNhdGVnb3J5LgorICAgIHN0ZDo6c3RyaW5nIENhdE5hbWUgPSBnZXRDYXRlZ29yeUZyb21EaWFnR3JvdXAoR3JvdXAtPmdldERlZigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0dyb3VwUGFyZW50cyk7CisgICAgaWYgKCFDYXROYW1lLmVtcHR5KCkpIHJldHVybiBDYXROYW1lOworICB9CisgIAorICAvLyBJZiB0aGUgZGlhZ25vc3RpYyBpdHNlbGYgaGFzIGEgY2F0ZWdvcnksIGdldCBpdC4KKyAgcmV0dXJuIFItPmdldFZhbHVlQXNTdHJpbmcoIkNhdGVnb3J5TmFtZSIpOworfQorCituYW1lc3BhY2UgeworICBjbGFzcyBEaWFnQ2F0ZWdvcnlJRE1hcCB7CisgICAgU3RyaW5nTWFwPHVuc2lnbmVkPiBDYXRlZ29yeUlEczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ2F0ZWdvcnlTdHJpbmdzOworICBwdWJsaWM6CisgICAgRGlhZ0NhdGVnb3J5SURNYXAoKSB7CisgICAgICBEaWFnR3JvdXBQYXJlbnRNYXAgUGFyZW50SW5mbzsKKyAgICAgIAorICAgICAgLy8gVGhlIHplcm8ndGggY2F0ZWdvcnkgaXMgIiIuCisgICAgICBDYXRlZ29yeVN0cmluZ3MucHVzaF9iYWNrKCIiKTsKKyAgICAgIENhdGVnb3J5SURzWyIiXSA9IDA7CisgICAgICAKKyAgICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IERpYWdzID0KKyAgICAgIFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJEaWFnbm9zdGljIik7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGlhZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICBzdGQ6OnN0cmluZyBDYXRlZ29yeSA9IGdldERpYWdub3N0aWNDYXRlZ29yeShEaWFnc1tpXSwgUGFyZW50SW5mbyk7CisgICAgICAgIGlmIChDYXRlZ29yeS5lbXB0eSgpKSBjb250aW51ZTsgIC8vIFNraXAgZGlhZ3Mgd2l0aCBubyBjYXRlZ29yeS4KKyAgICAgICAgCisgICAgICAgIHVuc2lnbmVkICZJRCA9IENhdGVnb3J5SURzW0NhdGVnb3J5XTsKKyAgICAgICAgaWYgKElEICE9IDApIGNvbnRpbnVlOyAgLy8gQWxyZWFkeSBzZWVuLgorICAgICAgICAKKyAgICAgICAgSUQgPSBDYXRlZ29yeVN0cmluZ3Muc2l6ZSgpOworICAgICAgICBDYXRlZ29yeVN0cmluZ3MucHVzaF9iYWNrKENhdGVnb3J5KTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgZ2V0SUQoU3RyaW5nUmVmIENhdGVnb3J5U3RyaW5nKSB7CisgICAgICByZXR1cm4gQ2F0ZWdvcnlJRHNbQ2F0ZWdvcnlTdHJpbmddOworICAgIH0KKyAgICAKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBDYXRlZ29yeVN0cmluZ3MuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIENhdGVnb3J5U3RyaW5ncy5lbmQoKTsgfQorICB9OworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZS4KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBXYXJuaW5nIFRhYmxlcyAoLmluYyBmaWxlKSBnZW5lcmF0aW9uLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBDbGFuZ0RpYWdzRGVmc0VtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gV3JpdGUgdGhlICNpZiBndWFyZAorICBpZiAoIUNvbXBvbmVudC5lbXB0eSgpKSB7CisgICAgc3RkOjpzdHJpbmcgQ29tcG9uZW50TmFtZSA9IFVwcGVyY2FzZVN0cmluZyhDb21wb25lbnQpOworICAgIE9TIDw8ICIjaWZkZWYgIiA8PCBDb21wb25lbnROYW1lIDw8ICJTVEFSVFxuIjsKKyAgICBPUyA8PCAiX18iIDw8IENvbXBvbmVudE5hbWUgPDwgIlNUQVJUID0gRElBR19TVEFSVF8iIDw8IENvbXBvbmVudE5hbWUKKyAgICAgICA8PCAiLFxuIjsKKyAgICBPUyA8PCAiI3VuZGVmICIgPDwgQ29tcG9uZW50TmFtZSA8PCAiU1RBUlRcbiI7CisgICAgT1MgPDwgIiNlbmRpZlxuXG4iOworICB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJkRpYWdzID0KKyAgICBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiRGlhZ25vc3RpYyIpOworICAKKyAgRGlhZ0NhdGVnb3J5SURNYXAgQ2F0ZWdvcnlJRHM7CisgIERpYWdHcm91cFBhcmVudE1hcCBER1BhcmVudE1hcDsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGlhZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IFJlY29yZCAmUiA9ICpEaWFnc1tpXTsKKyAgICAvLyBGaWx0ZXIgYnkgY29tcG9uZW50LgorICAgIGlmICghQ29tcG9uZW50LmVtcHR5KCkgJiYgQ29tcG9uZW50ICE9IFIuZ2V0VmFsdWVBc1N0cmluZygiQ29tcG9uZW50IikpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICBPUyA8PCAiRElBRygiIDw8IFIuZ2V0TmFtZSgpIDw8ICIsICI7CisgICAgT1MgPDwgUi5nZXRWYWx1ZUFzRGVmKCJDbGFzcyIpLT5nZXROYW1lKCk7CisgICAgT1MgPDwgIiwgZGlhZzo6IiA8PCBSLmdldFZhbHVlQXNEZWYoIkRlZmF1bHRNYXBwaW5nIiktPmdldE5hbWUoKTsKKyAgICAKKyAgICAvLyBEZXNjcmlwdGlvbiBzdHJpbmcuCisgICAgT1MgPDwgIiwgXCIiOworICAgIE9TLndyaXRlX2VzY2FwZWQoUi5nZXRWYWx1ZUFzU3RyaW5nKCJUZXh0IikpIDw8ICciJzsKKyAgICAKKyAgICAvLyBXYXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlhZ25vc3RpYy4KKyAgICBpZiAoRGVmSW5pdCAqREkgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KFIuZ2V0VmFsdWVJbml0KCJHcm91cCIpKSkgeworICAgICAgT1MgPDwgIiwgXCIiOworICAgICAgT1Mud3JpdGVfZXNjYXBlZChESS0+Z2V0RGVmKCktPmdldFZhbHVlQXNTdHJpbmcoIkdyb3VwTmFtZSIpKSA8PCAnIic7CisgICAgfSBlbHNlIHsKKyAgICAgIE9TIDw8ICIsIDAiOworICAgIH0KKworICAgIC8vIFNGSU5BRSBiaXQKKyAgICBpZiAoUi5nZXRWYWx1ZUFzQml0KCJTRklOQUUiKSkKKyAgICAgIE9TIDw8ICIsIHRydWUiOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICIsIGZhbHNlIjsKKyAgICAKKyAgICAvLyBDYXRlZ29yeSBudW1iZXIuCisgICAgT1MgPDwgIiwgIiA8PCBDYXRlZ29yeUlEcy5nZXRJRChnZXREaWFnbm9zdGljQ2F0ZWdvcnkoJlIsIERHUGFyZW50TWFwKSk7CisgICAgT1MgPDwgIilcbiI7CisgIH0KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFdhcm5pbmcgR3JvdXAgVGFibGVzIGdlbmVyYXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3N0cnVjdCBHcm91cEluZm8geworICBzdGQ6OnZlY3Rvcjxjb25zdCBSZWNvcmQqPiBEaWFnc0luR3JvdXA7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTdWJHcm91cHM7CisgIHVuc2lnbmVkIElETm87Cit9OworCit2b2lkIENsYW5nRGlhZ0dyb3Vwc0VtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gQ29tcHV0ZSBhIG1hcHBpbmcgZnJvbSBhIERpYWdHcm91cCB0byBhbGwgb2YgaXRzIHBhcmVudHMuCisgIERpYWdHcm91cFBhcmVudE1hcCBER1BhcmVudE1hcDsKKyAgCisgIC8vIEludmVydCB0aGUgMS1bMC8xXSBtYXBwaW5nIG9mIGRpYWdzIHRvIGdyb3VwIGludG8gYSBvbmUgdG8gbWFueSBtYXBwaW5nIG9mCisgIC8vIGdyb3VwcyB0byBkaWFncyBpbiB0aGUgZ3JvdXAuCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBHcm91cEluZm8+IERpYWdzSW5Hcm91cDsKKyAgCisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IERpYWdzID0KKyAgICBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiRGlhZ25vc3RpYyIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGlhZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IFJlY29yZCAqUiA9IERpYWdzW2ldOworICAgIERlZkluaXQgKkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihSLT5nZXRWYWx1ZUluaXQoIkdyb3VwIikpOworICAgIGlmIChESSA9PSAwKSBjb250aW51ZTsKKyAgICBzdGQ6OnN0cmluZyBHcm91cE5hbWUgPSBESS0+Z2V0RGVmKCktPmdldFZhbHVlQXNTdHJpbmcoIkdyb3VwTmFtZSIpOworICAgIERpYWdzSW5Hcm91cFtHcm91cE5hbWVdLkRpYWdzSW5Hcm91cC5wdXNoX2JhY2soUik7CisgIH0KKyAgCisgIC8vIEFkZCBhbGwgRGlhZ0dyb3VwJ3MgdG8gdGhlIERpYWdzSW5Hcm91cCBsaXN0IHRvIG1ha2Ugc3VyZSB3ZSBwaWNrIHVwIGVtcHR5CisgIC8vIGdyb3VwcyAodGhlc2UgYXJlIHdhcm5pbmdzIHRoYXQgR0NDIHN1cHBvcnRzIHRoYXQgY2xhbmcgbmV2ZXIgcHJvZHVjZXMpLgorICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBEaWFnR3JvdXBzCisgICAgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiRGlhZ0dyb3VwIik7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEaWFnR3JvdXBzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQgKkdyb3VwID0gRGlhZ0dyb3Vwc1tpXTsKKyAgICBHcm91cEluZm8gJkdJID0gRGlhZ3NJbkdyb3VwW0dyb3VwLT5nZXRWYWx1ZUFzU3RyaW5nKCJHcm91cE5hbWUiKV07CisgICAgCisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gU3ViR3JvdXBzID0gR3JvdXAtPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJTdWJHcm91cHMiKTsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gU3ViR3JvdXBzLnNpemUoKTsgaiAhPSBlOyArK2opCisgICAgICBHSS5TdWJHcm91cHMucHVzaF9iYWNrKFN1Ykdyb3Vwc1tqXS0+Z2V0VmFsdWVBc1N0cmluZygiR3JvdXBOYW1lIikpOworICB9CisgIAorICAvLyBBc3NpZ24gdW5pcXVlIElEIG51bWJlcnMgdG8gdGhlIGdyb3Vwcy4KKyAgdW5zaWduZWQgSURObyA9IDA7CisgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIEdyb3VwSW5mbz46Oml0ZXJhdG9yCisgICAgICAgSSA9IERpYWdzSW5Hcm91cC5iZWdpbigpLCBFID0gRGlhZ3NJbkdyb3VwLmVuZCgpOyBJICE9IEU7ICsrSSwgKytJRE5vKQorICAgIEktPnNlY29uZC5JRE5vID0gSURObzsKKyAgCisgIC8vIFdhbGsgdGhyb3VnaCB0aGUgZ3JvdXBzIGVtaXR0aW5nIGFuIGFycmF5IGZvciBlYWNoIGRpYWdub3N0aWMgb2YgdGhlIGRpYWdzCisgIC8vIHRoYXQgYXJlIG1hcHBlZCB0by4KKyAgT1MgPDwgIlxuI2lmZGVmIEdFVF9ESUFHX0FSUkFZU1xuIjsKKyAgdW5zaWduZWQgTWF4TGVuID0gMDsKKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgR3JvdXBJbmZvPjo6aXRlcmF0b3IKKyAgICAgICBJID0gRGlhZ3NJbkdyb3VwLmJlZ2luKCksIEUgPSBEaWFnc0luR3JvdXAuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgTWF4TGVuID0gc3RkOjptYXgoTWF4TGVuLCAodW5zaWduZWQpSS0+Zmlyc3Quc2l6ZSgpKTsKKyAgICAKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBSZWNvcmQqPiAmViA9IEktPnNlY29uZC5EaWFnc0luR3JvdXA7CisgICAgaWYgKCFWLmVtcHR5KCkpIHsKKyAgICAgIE9TIDw8ICJzdGF0aWMgY29uc3Qgc2hvcnQgRGlhZ0FycmF5IiA8PCBJLT5zZWNvbmQuSURObyA8PCAiW10gPSB7ICI7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVi5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBPUyA8PCAiZGlhZzo6IiA8PCBWW2ldLT5nZXROYW1lKCkgPDwgIiwgIjsKKyAgICAgIE9TIDw8ICItMSB9O1xuIjsKKyAgICB9CisgICAgCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZTdWJHcm91cHMgPSBJLT5zZWNvbmQuU3ViR3JvdXBzOworICAgIGlmICghU3ViR3JvdXBzLmVtcHR5KCkpIHsKKyAgICAgIE9TIDw8ICJzdGF0aWMgY29uc3Qgc2hvcnQgRGlhZ1N1Ykdyb3VwIiA8PCBJLT5zZWNvbmQuSURObyA8PCAiW10gPSB7ICI7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3ViR3JvdXBzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEdyb3VwSW5mbz46Oml0ZXJhdG9yIFJJID0KKyAgICAgICAgICBEaWFnc0luR3JvdXAuZmluZChTdWJHcm91cHNbaV0pOworICAgICAgICBhc3NlcnQoUkkgIT0gRGlhZ3NJbkdyb3VwLmVuZCgpICYmICJSZWZlcmVuY2VkIHdpdGhvdXQgZXhpc3Rpbmc/Iik7CisgICAgICAgIE9TIDw8IFJJLT5zZWNvbmQuSURObyA8PCAiLCAiOworICAgICAgfQorICAgICAgT1MgPDwgIi0xIH07XG4iOworICAgIH0KKyAgfQorICBPUyA8PCAiI2VuZGlmIC8vIEdFVF9ESUFHX0FSUkFZU1xuXG4iOworICAKKyAgLy8gRW1pdCB0aGUgdGFibGUgbm93LgorICBPUyA8PCAiXG4jaWZkZWYgR0VUX0RJQUdfVEFCTEVcbiI7CisgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIEdyb3VwSW5mbz46Oml0ZXJhdG9yCisgICAgICAgSSA9IERpYWdzSW5Hcm91cC5iZWdpbigpLCBFID0gRGlhZ3NJbkdyb3VwLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIC8vIEdyb3VwIG9wdGlvbiBzdHJpbmcuCisgICAgT1MgPDwgIiAgeyBcIiI7CisgICAgT1Mud3JpdGVfZXNjYXBlZChJLT5maXJzdCkgPDwgIlwiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnN0cmluZyhNYXhMZW4tSS0+Zmlyc3Quc2l6ZSgpKzEsICcgJyk7CisgICAgCisgICAgLy8gRGlhZ25vc3RpY3MgaW4gdGhlIGdyb3VwLgorICAgIGlmIChJLT5zZWNvbmQuRGlhZ3NJbkdyb3VwLmVtcHR5KCkpCisgICAgICBPUyA8PCAiMCwgIjsKKyAgICBlbHNlCisgICAgICBPUyA8PCAiRGlhZ0FycmF5IiA8PCBJLT5zZWNvbmQuSURObyA8PCAiLCAiOworICAgIAorICAgIC8vIFN1Ymdyb3Vwcy4KKyAgICBpZiAoSS0+c2Vjb25kLlN1Ykdyb3Vwcy5lbXB0eSgpKQorICAgICAgT1MgPDwgMDsKKyAgICBlbHNlCisgICAgICBPUyA8PCAiRGlhZ1N1Ykdyb3VwIiA8PCBJLT5zZWNvbmQuSURObzsKKyAgICBPUyA8PCAiIH0sXG4iOworICB9CisgIE9TIDw8ICIjZW5kaWYgLy8gR0VUX0RJQUdfVEFCTEVcblxuIjsKKyAgCisgIC8vIEVtaXQgdGhlIGNhdGVnb3J5IHRhYmxlIG5leHQuCisgIERpYWdDYXRlZ29yeUlETWFwIENhdGVnb3JpZXNCeUlEOworICBPUyA8PCAiXG4jaWZkZWYgR0VUX0NBVEVHT1JZX1RBQkxFXG4iOworICBmb3IgKERpYWdDYXRlZ29yeUlETWFwOjppdGVyYXRvciBJID0gQ2F0ZWdvcmllc0J5SUQuYmVnaW4oKSwKKyAgICAgICBFID0gQ2F0ZWdvcmllc0J5SUQuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIE9TIDw8ICJDQVRFR09SWShcIiIgPDwgKkkgPDwgIlwiKVxuIjsKKyAgT1MgPDwgIiNlbmRpZiAvLyBHRVRfQ0FURUdPUllfVEFCTEVcblxuIjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NsYW5nRGlhZ25vc3RpY3NFbWl0dGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9DbGFuZ0RpYWdub3N0aWNzRW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDA2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9DbGFuZ0RpYWdub3N0aWNzRW1pdHRlci5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vPT09LSBDbGFuZ0RpYWdub3N0aWNzRW1pdHRlci5oIC0gR2VuZXJhdGUgQ2xhbmcgZGlhZ25vc3RpY3MgdGFibGVzIC0qLSBDKysgLSotCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlc2UgdGFibGVnZW4gYmFja2VuZHMgZW1pdCBDbGFuZyBkaWFnbm9zdGljcyB0YWJsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBDTEFOR0RJQUdTX0VNSVRURVJfSAorI2RlZmluZSBDTEFOR0RJQUdTX0VNSVRURVJfSAorCisjaW5jbHVkZSAiVGFibGVHZW5CYWNrZW5kLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIENsYW5nRGlhZ3NEZWZzRW1pdHRlciAtIFRoZSB0b3AtbGV2ZWwgY2xhc3MgZW1pdHMgLmRlZiBmaWxlcyBjb250YWluaW5nCisvLy8gIGRlY2xhcmF0aW9ucyBvZiBDbGFuZyBkaWFnbm9zdGljcy4KKy8vLworY2xhc3MgQ2xhbmdEaWFnc0RlZnNFbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIENvbXBvbmVudDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ2xhbmdEaWFnc0RlZnNFbWl0dGVyKFJlY29yZEtlZXBlciAmUiwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbXBvbmVudCkKKyAgICA6IFJlY29yZHMoUiksIENvbXBvbmVudChjb21wb25lbnQpIHt9CisKKyAgLy8gcnVuIC0gT3V0cHV0IHRoZSAuZGVmIGZpbGUgY29udGVudHMKKyAgdm9pZCBydW4ocmF3X29zdHJlYW0gJk9TKTsKK307CisKK2NsYXNzIENsYW5nRGlhZ0dyb3Vwc0VtaXR0ZXIgOiBwdWJsaWMgVGFibGVHZW5CYWNrZW5kIHsKKyAgICBSZWNvcmRLZWVwZXIgJlJlY29yZHM7CitwdWJsaWM6CisgIGV4cGxpY2l0IENsYW5nRGlhZ0dyb3Vwc0VtaXR0ZXIoUmVjb3JkS2VlcGVyICZSKSA6IFJlY29yZHMoUikge30KKyAgICAKKyAgdm9pZCBydW4ocmF3X29zdHJlYW0gJk9TKTsKK307CisKKyAgCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVFbWl0dGVyR2VuLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVFbWl0dGVyR2VuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzcwMmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ29kZUVtaXR0ZXJHZW4uY3BwCkBAIC0wLDAgKzEsMjI0IEBACisvLz09PS0gQ29kZUVtaXR0ZXJHZW4uY3BwIC0gQ29kZSBFbWl0dGVyIEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvZGVFbWl0dGVyR2VuIHVzZXMgdGhlIGRlc2NyaXB0aW9ucyBvZiBpbnN0cnVjdGlvbnMgYW5kIHRoZWlyIGZpZWxkcyB0bworLy8gY29uc3RydWN0IGFuIGF1dG9tYXRlZCBjb2RlIGVtaXR0ZXI6IGEgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSBNYWNoaW5lSW5zdHIsCisvLyByZXR1cm5zIHRoZSAoY3VycmVudGx5LCAzMi1iaXQgdW5zaWduZWQpIHZhbHVlIG9mIHRoZSBpbnN0cnVjdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQ29kZUVtaXR0ZXJHZW4uaCIKKyNpbmNsdWRlICJDb2RlR2VuVGFyZ2V0LmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKwordm9pZCBDb2RlRW1pdHRlckdlbjo6cmV2ZXJzZUJpdHMoc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJkluc3RzKSB7CisgIGZvciAoc3RkOjp2ZWN0b3I8UmVjb3JkKj46Oml0ZXJhdG9yIEkgPSBJbnN0cy5iZWdpbigpLCBFID0gSW5zdHMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBSZWNvcmQgKlIgPSAqSTsKKyAgICBpZiAoUi0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZXNwYWNlIikgPT0gIlRhcmdldE9wY29kZSIpCisgICAgICBjb250aW51ZTsKKworICAgIEJpdHNJbml0ICpCSSA9IFItPmdldFZhbHVlQXNCaXRzSW5pdCgiSW5zdCIpOworCisgICAgdW5zaWduZWQgbnVtQml0cyA9IEJJLT5nZXROdW1CaXRzKCk7CisgICAgQml0c0luaXQgKk5ld0JJID0gbmV3IEJpdHNJbml0KG51bUJpdHMpOworICAgIGZvciAodW5zaWduZWQgYml0ID0gMCwgZW5kID0gbnVtQml0cyAvIDI7IGJpdCAhPSBlbmQ7ICsrYml0KSB7CisgICAgICB1bnNpZ25lZCBiaXRTd2FwSWR4ID0gbnVtQml0cyAtIGJpdCAtIDE7CisgICAgICBJbml0ICpPcmlnQml0ID0gQkktPmdldEJpdChiaXQpOworICAgICAgSW5pdCAqQml0U3dhcCA9IEJJLT5nZXRCaXQoYml0U3dhcElkeCk7CisgICAgICBOZXdCSS0+c2V0Qml0KGJpdCwgQml0U3dhcCk7CisgICAgICBOZXdCSS0+c2V0Qml0KGJpdFN3YXBJZHgsIE9yaWdCaXQpOworICAgIH0KKyAgICBpZiAobnVtQml0cyAlIDIpIHsKKyAgICAgIHVuc2lnbmVkIG1pZGRsZSA9IChudW1CaXRzICsgMSkgLyAyOworICAgICAgTmV3QkktPnNldEJpdChtaWRkbGUsIEJJLT5nZXRCaXQobWlkZGxlKSk7CisgICAgfQorICAgIAorICAgIC8vIFVwZGF0ZSB0aGUgYml0cyBpbiByZXZlcnNlZCBvcmRlciBzbyB0aGF0IGVtaXRJbnN0ck9wQml0cyB3aWxsIGdldCB0aGUKKyAgICAvLyBjb3JyZWN0IGVuZGlhbm5lc3MuCisgICAgUi0+Z2V0VmFsdWUoIkluc3QiKS0+c2V0VmFsdWUoTmV3QkkpOworICB9Cit9CisKKworLy8gSWYgdGhlIFZhckJpdEluaXQgYXQgcG9zaXRpb24gJ2JpdCcgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHZhcmlhYmxlIHRoZW4KKy8vIHJldHVybiB0aGUgdmFyaWFibGUgYml0IHBvc2l0aW9uLiAgT3RoZXJ3aXNlIHJldHVybiAtMS4KK2ludCBDb2RlRW1pdHRlckdlbjo6Z2V0VmFyaWFibGVCaXQoY29uc3Qgc3RkOjpzdHJpbmcgJlZhck5hbWUsCisgICAgICAgICAgICBCaXRzSW5pdCAqQkksIGludCBiaXQpIHsKKyAgaWYgKFZhckJpdEluaXQgKlZCSSA9IGR5bmFtaWNfY2FzdDxWYXJCaXRJbml0Kj4oQkktPmdldEJpdChiaXQpKSkgeworICAgIFR5cGVkSW5pdCAqVEkgPSBWQkktPmdldFZhcmlhYmxlKCk7CisgICAgCisgICAgaWYgKFZhckluaXQgKlZJID0gZHluYW1pY19jYXN0PFZhckluaXQqPihUSSkpIHsKKyAgICAgIGlmIChWSS0+Z2V0TmFtZSgpID09IFZhck5hbWUpIHJldHVybiBWQkktPmdldEJpdE51bSgpOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIC0xOworfSAKKworCit2b2lkIENvZGVFbWl0dGVyR2VuOjpydW4ocmF3X29zdHJlYW0gJm8pIHsKKyAgQ29kZUdlblRhcmdldCBUYXJnZXQ7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEluc3RzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkluc3RydWN0aW9uIik7CisgIAorICAvLyBGb3IgbGl0dGxlLWVuZGlhbiBpbnN0cnVjdGlvbiBiaXQgZW5jb2RpbmdzLCByZXZlcnNlIHRoZSBiaXQgb3JkZXIKKyAgaWYgKFRhcmdldC5pc0xpdHRsZUVuZGlhbkVuY29kaW5nKCkpIHJldmVyc2VCaXRzKEluc3RzKTsKKworICBFbWl0U291cmNlRmlsZUhlYWRlcigiTWFjaGluZSBDb2RlIEVtaXR0ZXIiLCBvKTsKKyAgc3RkOjpzdHJpbmcgTmFtZXNwYWNlID0gSW5zdHNbMF0tPmdldFZhbHVlQXNTdHJpbmcoIk5hbWVzcGFjZSIpICsgIjo6IjsKKyAgCisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbio+ICZOdW1iZXJlZEluc3RydWN0aW9ucyA9CisgICAgVGFyZ2V0LmdldEluc3RydWN0aW9uc0J5RW51bVZhbHVlKCk7CisKKyAgLy8gRW1pdCBmdW5jdGlvbiBkZWNsYXJhdGlvbgorICBvIDw8ICJ1bnNpZ25lZCAiIDw8IFRhcmdldC5nZXROYW1lKCkgPDwgIkNvZGVFbWl0dGVyOjoiCisgICAgPDwgImdldEJpbmFyeUNvZGVGb3JJbnN0cihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7XG4iOworCisgIC8vIEVtaXQgaW5zdHJ1Y3Rpb24gYmFzZSB2YWx1ZXMKKyAgbyA8PCAiICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW5zdEJpdHNbXSA9IHtcbiI7CisgIGZvciAoc3RkOjp2ZWN0b3I8Y29uc3QgQ29kZUdlbkluc3RydWN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgSU4gPSBOdW1iZXJlZEluc3RydWN0aW9ucy5iZWdpbigpLAorICAgICAgICAgIEVOID0gTnVtYmVyZWRJbnN0cnVjdGlvbnMuZW5kKCk7CisgICAgICAgSU4gIT0gRU47ICsrSU4pIHsKKyAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24gKkNHSSA9ICpJTjsKKyAgICBSZWNvcmQgKlIgPSBDR0ktPlRoZURlZjsKKyAgICAKKyAgICBpZiAoUi0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZXNwYWNlIikgPT0gIlRhcmdldE9wY29kZSIpIHsKKyAgICAgIG8gPDwgIiAgICAwVSxcbiI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgQml0c0luaXQgKkJJID0gUi0+Z2V0VmFsdWVBc0JpdHNJbml0KCJJbnN0Iik7CisKKyAgICAvLyBTdGFydCBieSBmaWxsaW5nIGluIGZpeGVkIHZhbHVlcy4uLgorICAgIHVuc2lnbmVkIFZhbHVlID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQkktPmdldE51bUJpdHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChCaXRJbml0ICpCID0gZHluYW1pY19jYXN0PEJpdEluaXQqPihCSS0+Z2V0Qml0KGUtaS0xKSkpIHsKKyAgICAgICAgVmFsdWUgfD0gQi0+Z2V0VmFsdWUoKSA8PCAoZS1pLTEpOworICAgICAgfQorICAgIH0KKyAgICBvIDw8ICIgICAgIiA8PCBWYWx1ZSA8PCAiVSwiIDw8ICdcdCcgPDwgIi8vICIgPDwgUi0+Z2V0TmFtZSgpIDw8ICJcbiI7CisgIH0KKyAgbyA8PCAiICAgIDBVXG4gIH07XG4iOworICAKKyAgLy8gTWFwIHRvIGFjY3VtdWxhdGUgYWxsIHRoZSBjYXNlcy4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+IENhc2VNYXA7CisgIAorICAvLyBDb25zdHJ1Y3QgYWxsIGNhc2VzIHN0YXRlbWVudCBmb3IgZWFjaCBvcGNvZGUKKyAgZm9yIChzdGQ6OnZlY3RvcjxSZWNvcmQqPjo6aXRlcmF0b3IgSUMgPSBJbnN0cy5iZWdpbigpLCBFQyA9IEluc3RzLmVuZCgpOworICAgICAgICBJQyAhPSBFQzsgKytJQykgeworICAgIFJlY29yZCAqUiA9ICpJQzsKKyAgICBpZiAoUi0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZXNwYWNlIikgPT0gIlRhcmdldE9wY29kZSIpCisgICAgICBjb250aW51ZTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmSW5zdE5hbWUgPSBSLT5nZXROYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgQ2FzZSgiIik7CisKKyAgICBCaXRzSW5pdCAqQkkgPSBSLT5nZXRWYWx1ZUFzQml0c0luaXQoIkluc3QiKTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmRWYWw+ICZWYWxzID0gUi0+Z2V0VmFsdWVzKCk7CisgICAgQ29kZUdlbkluc3RydWN0aW9uICZDR0kgPSBUYXJnZXQuZ2V0SW5zdHJ1Y3Rpb24oUik7CisgICAgCisgICAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbiwgZGV0ZXJtaW5pbmcgd2hpY2ggYXJlIHRoZQorICAgIC8vIG9wZXJhbmRzIHRvIHRoZSBpbnN0cnVjdGlvbi4KKyAgICB1bnNpZ25lZCBvcCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKCFWYWxzW2ldLmdldFByZWZpeCgpICYmICFWYWxzW2ldLmdldFZhbHVlKCktPmlzQ29tcGxldGUoKSkgeworICAgICAgICAvLyBJcyB0aGUgb3BlcmFuZCBjb250aW51b3VzPyBJZiBzbywgd2UgY2FuIGp1c3QgbWFzayBhbmQgT1IgaXQgaW4KKyAgICAgICAgLy8gaW5zdGVhZCBvZiBkb2luZyBpdCBiaXQtYnktYml0LCBzYXZpbmcgYSBsb3QgaW4gcnVudGltZSBjb3N0LgorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVmFyTmFtZSA9IFZhbHNbaV0uZ2V0TmFtZSgpOworICAgICAgICBib29sIGdvdE9wID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBiaXQgPSBCSS0+Z2V0TnVtQml0cygpLTE7IGJpdCA+PSAwOyApIHsKKyAgICAgICAgICBpbnQgdmFyQml0ID0gZ2V0VmFyaWFibGVCaXQoVmFyTmFtZSwgQkksIGJpdCk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHZhckJpdCA9PSAtMSkgeworICAgICAgICAgICAgLS1iaXQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBiZWdpbkluc3RCaXQgPSBiaXQ7CisgICAgICAgICAgICBpbnQgYmVnaW5WYXJCaXQgPSB2YXJCaXQ7CisgICAgICAgICAgICBpbnQgTiA9IDE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoLS1iaXQ7IGJpdCA+PSAwOykgeworICAgICAgICAgICAgICB2YXJCaXQgPSBnZXRWYXJpYWJsZUJpdChWYXJOYW1lLCBCSSwgYml0KTsKKyAgICAgICAgICAgICAgaWYgKHZhckJpdCA9PSAtMSB8fCB2YXJCaXQgIT0gKGJlZ2luVmFyQml0IC0gTikpIGJyZWFrOworICAgICAgICAgICAgICArK047CisgICAgICAgICAgICAgIC0tYml0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWdvdE9wKSB7CisgICAgICAgICAgICAgIC8vLyBJZiB0aGlzIG9wZXJhbmQgaXMgbm90IHN1cHBvc2VkIHRvIGJlIGVtaXR0ZWQgYnkgdGhlIGdlbmVyYXRlZAorICAgICAgICAgICAgICAvLy8gZW1pdHRlciwgc2tpcCBpdC4KKyAgICAgICAgICAgICAgd2hpbGUgKENHSS5pc0ZsYXRPcGVyYW5kTm90RW1pdHRlZChvcCkpCisgICAgICAgICAgICAgICAgKytvcDsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIENhc2UgKz0gIiAgICAgIC8vIG9wOiAiICsgVmFyTmFtZSArICJcbiIKKyAgICAgICAgICAgICAgICAgICArICAiICAgICAgb3AgPSBnZXRNYWNoaW5lT3BWYWx1ZShNSSwgTUkuZ2V0T3BlcmFuZCgiCisgICAgICAgICAgICAgICAgICAgKyAgdXRvc3RyKG9wKyspICsgIikpO1xuIjsKKyAgICAgICAgICAgICAgZ290T3AgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB1bnNpZ25lZCBvcE1hc2sgPSB+MFUgPj4gKDMyLU4pOworICAgICAgICAgICAgaW50IG9wU2hpZnQgPSBiZWdpblZhckJpdCAtIE4gKyAxOworICAgICAgICAgICAgb3BNYXNrIDw8PSBvcFNoaWZ0OworICAgICAgICAgICAgb3BTaGlmdCA9IGJlZ2luSW5zdEJpdCAtIGJlZ2luVmFyQml0OworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAob3BTaGlmdCA+IDApIHsKKyAgICAgICAgICAgICAgQ2FzZSArPSAiICAgICAgVmFsdWUgfD0gKG9wICYgIiArIHV0b3N0cihvcE1hc2spICsgIlUpIDw8ICIKKyAgICAgICAgICAgICAgICAgICArICBpdG9zdHIob3BTaGlmdCkgKyAiO1xuIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3BTaGlmdCA8IDApIHsKKyAgICAgICAgICAgICAgQ2FzZSArPSAiICAgICAgVmFsdWUgfD0gKG9wICYgIiArIHV0b3N0cihvcE1hc2spICsgIlUpID4+ICIKKyAgICAgICAgICAgICAgICAgICArICBpdG9zdHIoLW9wU2hpZnQpICsgIjtcbiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBDYXNlICs9ICIgICAgICBWYWx1ZSB8PSBvcCAmICIgKyB1dG9zdHIob3BNYXNrKSArICJVO1xuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkluc3RMaXN0ID0gQ2FzZU1hcFtDYXNlXTsKKyAgICBJbnN0TGlzdC5wdXNoX2JhY2soSW5zdE5hbWUpOworICB9CisKKworICAvLyBFbWl0IGluaXRpYWwgZnVuY3Rpb24gY29kZQorICBvIDw8ICIgIGNvbnN0IHVuc2lnbmVkIG9wY29kZSA9IE1JLmdldE9wY29kZSgpO1xuIgorICAgIDw8ICIgIHVuc2lnbmVkIFZhbHVlID0gSW5zdEJpdHNbb3Bjb2RlXTtcbiIKKyAgICA8PCAiICB1bnNpZ25lZCBvcCA9IDA7XG4iCisgICAgPDwgIiAgb3AgPSBvcDsgIC8vIHN1cHByZXNzIHdhcm5pbmdcbiIKKyAgICA8PCAiICBzd2l0Y2ggKG9wY29kZSkge1xuIjsKKworICAvLyBFbWl0IGVhY2ggY2FzZSBzdGF0ZW1lbnQKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+OjppdGVyYXRvciBJRSwgRUU7CisgIGZvciAoSUUgPSBDYXNlTWFwLmJlZ2luKCksIEVFID0gQ2FzZU1hcC5lbmQoKTsgSUUgIT0gRUU7ICsrSUUpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmQ2FzZSA9IElFLT5maXJzdDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkluc3RMaXN0ID0gSUUtPnNlY29uZDsKKworICAgIGZvciAoaW50IGkgPSAwLCBOID0gSW5zdExpc3Quc2l6ZSgpOyBpIDwgTjsgaSsrKSB7CisgICAgICBpZiAoaSkgbyA8PCAiXG4iOworICAgICAgbyA8PCAiICAgIGNhc2UgIiA8PCBOYW1lc3BhY2UgPDwgSW5zdExpc3RbaV0gIDw8ICI6IjsKKyAgICB9CisgICAgbyA8PCAiIHtcbiI7CisgICAgbyA8PCBDYXNlOworICAgIG8gPDwgIiAgICAgIGJyZWFrO1xuIgorICAgICAgPDwgIiAgICB9XG4iOworICB9CisKKyAgLy8gRGVmYXVsdCBjYXNlOiB1bmhhbmRsZWQgb3Bjb2RlCisgIG8gPDwgIiAgZGVmYXVsdDpcbiIKKyAgICA8PCAiICAgIHN0ZDo6c3RyaW5nIG1zZztcbiIKKyAgICA8PCAiICAgIHJhd19zdHJpbmdfb3N0cmVhbSBNc2cobXNnKTtcbiIKKyAgICA8PCAiICAgIE1zZyA8PCBcIk5vdCBzdXBwb3J0ZWQgaW5zdHI6IFwiIDw8IE1JO1xuIgorICAgIDw8ICIgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKE1zZy5zdHIoKSk7XG4iCisgICAgPDwgIiAgfVxuIgorICAgIDw8ICIgIHJldHVybiBWYWx1ZTtcbiIKKyAgICA8PCAifVxuXG4iOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ29kZUVtaXR0ZXJHZW4uaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVFbWl0dGVyR2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiMzIyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVFbWl0dGVyR2VuLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tIENvZGVFbWl0dGVyR2VuLmggLSBDb2RlIEVtaXR0ZXIgR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBGSVhNRTogZG9jdW1lbnQKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENPREVNSVRURVJHRU5fSAorI2RlZmluZSBDT0RFTUlUVEVSR0VOX0gKKworI2luY2x1ZGUgIlRhYmxlR2VuQmFja2VuZC5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFJlY29yZFZhbDsKK2NsYXNzIEJpdHNJbml0OworCitjbGFzcyBDb2RlRW1pdHRlckdlbiA6IHB1YmxpYyBUYWJsZUdlbkJhY2tlbmQgeworICBSZWNvcmRLZWVwZXIgJlJlY29yZHM7CitwdWJsaWM6CisgIENvZGVFbWl0dGVyR2VuKFJlY29yZEtlZXBlciAmUikgOiBSZWNvcmRzKFIpIHt9CisKKyAgLy8gcnVuIC0gT3V0cHV0IHRoZSBjb2RlIGVtaXR0ZXIKKyAgdm9pZCBydW4ocmF3X29zdHJlYW0gJm8pOworcHJpdmF0ZToKKyAgdm9pZCBlbWl0TWFjaGluZU9wRW1pdHRlcihyYXdfb3N0cmVhbSAmbywgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWVzcGFjZSk7CisgIHZvaWQgZW1pdEdldFZhbHVlQml0KHJhd19vc3RyZWFtICZvLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZXNwYWNlKTsKKyAgdm9pZCByZXZlcnNlQml0cyhzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmSW5zdHMpOworICBpbnQgZ2V0VmFyaWFibGVCaXQoY29uc3Qgc3RkOjpzdHJpbmcgJlZhck5hbWUsIEJpdHNJbml0ICpCSSwgaW50IGJpdCk7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5EQUdQYXR0ZXJucy5jcHAgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuREFHUGF0dGVybnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwM2FhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuREFHUGF0dGVybnMuY3BwCkBAIC0wLDAgKzEsMzAyMSBAQAorLy89PT0tIENvZGVHZW5EQUdQYXR0ZXJucy5jcHAgLSBSZWFkIERBRyBwYXR0ZXJucyBmcm9tIC50ZCBmaWxlIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQ29kZUdlbkRBR1BhdHRlcm5zIGNsYXNzLCB3aGljaCBpcyB1c2VkIHRvIHJlYWQgYW5kCisvLyByZXByZXNlbnQgdGhlIHBhdHRlcm5zIHByZXNlbnQgaW4gYSAudGQgZmlsZSBmb3IgaW5zdHJ1Y3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJDb2RlR2VuREFHUGF0dGVybnMuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgRUVWVDo6VHlwZVNldCBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RhdGljIGlubGluZSBib29sIGlzSW50ZWdlcihNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCkgeworICByZXR1cm4gRVZUKFZUKS5pc0ludGVnZXIoKTsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0Zsb2F0aW5nUG9pbnQoTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQpIHsKKyAgcmV0dXJuIEVWVChWVCkuaXNGbG9hdGluZ1BvaW50KCk7Cit9CitzdGF0aWMgaW5saW5lIGJvb2wgaXNWZWN0b3IoTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQpIHsKKyAgcmV0dXJuIEVWVChWVCkuaXNWZWN0b3IoKTsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1NjYWxhcihNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCkgeworICByZXR1cm4gIUVWVChWVCkuaXNWZWN0b3IoKTsKK30KKworRUVWVDo6VHlwZVNldDo6VHlwZVNldChNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCwgVHJlZVBhdHRlcm4gJlRQKSB7CisgIGlmIChWVCA9PSBNVlQ6OmlBbnkpCisgICAgRW5mb3JjZUludGVnZXIoVFApOworICBlbHNlIGlmIChWVCA9PSBNVlQ6OmZBbnkpCisgICAgRW5mb3JjZUZsb2F0aW5nUG9pbnQoVFApOworICBlbHNlIGlmIChWVCA9PSBNVlQ6OnZBbnkpCisgICAgRW5mb3JjZVZlY3RvcihUUCk7CisgIGVsc2UgeworICAgIGFzc2VydCgoVlQgPCBNVlQ6OkxBU1RfVkFMVUVUWVBFIHx8IFZUID09IE1WVDo6aVBUUiB8fAorICAgICAgICAgICAgVlQgPT0gTVZUOjppUFRSQW55KSAmJiAiTm90IGEgY29uY3JldGUgdHlwZSEiKTsKKyAgICBUeXBlVmVjLnB1c2hfYmFjayhWVCk7CisgIH0KK30KKworCitFRVZUOjpUeXBlU2V0OjpUeXBlU2V0KGNvbnN0IHN0ZDo6dmVjdG9yPE1WVDo6U2ltcGxlVmFsdWVUeXBlPiAmVlRMaXN0KSB7CisgIGFzc2VydCghVlRMaXN0LmVtcHR5KCkgJiYgImVtcHR5IGxpc3Q/Iik7CisgIFR5cGVWZWMuYXBwZW5kKFZUTGlzdC5iZWdpbigpLCBWVExpc3QuZW5kKCkpOworICAKKyAgaWYgKCFWVExpc3QuZW1wdHkoKSkKKyAgICBhc3NlcnQoVlRMaXN0WzBdICE9IE1WVDo6aUFueSAmJiBWVExpc3RbMF0gIT0gTVZUOjp2QW55ICYmCisgICAgICAgICAgIFZUTGlzdFswXSAhPSBNVlQ6OmZBbnkpOworICAKKyAgLy8gVmVyaWZ5IG5vIGR1cGxpY2F0ZXMuCisgIGFycmF5X3BvZF9zb3J0KFR5cGVWZWMuYmVnaW4oKSwgVHlwZVZlYy5lbmQoKSk7CisgIGFzc2VydChzdGQ6OnVuaXF1ZShUeXBlVmVjLmJlZ2luKCksIFR5cGVWZWMuZW5kKCkpID09IFR5cGVWZWMuZW5kKCkpOworfQorCisvLy8gRmlsbFdpdGhQb3NzaWJsZVR5cGVzIC0gU2V0IHRvIGFsbCBsZWdhbCB0eXBlcyBhbmQgcmV0dXJuIHRydWUsIG9ubHkgdmFsaWQKKy8vLyBvbiBjb21wbGV0ZWx5IHVua25vd24gdHlwZSBzZXRzLgorYm9vbCBFRVZUOjpUeXBlU2V0OjpGaWxsV2l0aFBvc3NpYmxlVHlwZXMoVHJlZVBhdHRlcm4gJlRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAoKlByZWQpKE1WVDo6U2ltcGxlVmFsdWVUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlByZWRpY2F0ZU5hbWUpIHsKKyAgYXNzZXJ0KGlzQ29tcGxldGVseVVua25vd24oKSk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1WVDo6U2ltcGxlVmFsdWVUeXBlPiAmTGVnYWxUeXBlcyA9IAorICAgIFRQLmdldERBR1BhdHRlcm5zKCkuZ2V0VGFyZ2V0SW5mbygpLmdldExlZ2FsVmFsdWVUeXBlcygpOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExlZ2FsVHlwZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoUHJlZCA9PSAwIHx8IFByZWQoTGVnYWxUeXBlc1tpXSkpCisgICAgICBUeXBlVmVjLnB1c2hfYmFjayhMZWdhbFR5cGVzW2ldKTsKKworICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIGJhaWwgb3V0LgorICBpZiAoVHlwZVZlYy5lbXB0eSgpKQorICAgIFRQLmVycm9yKCJUeXBlIGluZmVyZW5jZSBjb250cmFkaWN0aW9uIGZvdW5kLCBubyAiICsKKyAgICAgICAgICAgICBzdGQ6OnN0cmluZyhQcmVkaWNhdGVOYW1lKSArICIgdHlwZXMgZm91bmQiKTsgIAorICAvLyBObyBuZWVkIHRvIHNvcnQgd2l0aCBvbmUgZWxlbWVudC4KKyAgaWYgKFR5cGVWZWMuc2l6ZSgpID09IDEpIHJldHVybiB0cnVlOworCisgIC8vIFJlbW92ZSBkdXBsaWNhdGVzLgorICBhcnJheV9wb2Rfc29ydChUeXBlVmVjLmJlZ2luKCksIFR5cGVWZWMuZW5kKCkpOworICBUeXBlVmVjLmVyYXNlKHN0ZDo6dW5pcXVlKFR5cGVWZWMuYmVnaW4oKSwgVHlwZVZlYy5lbmQoKSksIFR5cGVWZWMuZW5kKCkpOworICAKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBoYXNJbnRlZ2VyVHlwZXMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFR5cGVTZXQgY29udGFpbnMgaUFueSBvciBhbgorLy8vIGludGVnZXIgdmFsdWUgdHlwZS4KK2Jvb2wgRUVWVDo6VHlwZVNldDo6aGFzSW50ZWdlclR5cGVzKCkgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVHlwZVZlYy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChpc0ludGVnZXIoVHlwZVZlY1tpXSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfSAgCisKKy8vLyBoYXNGbG9hdGluZ1BvaW50VHlwZXMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFR5cGVTZXQgY29udGFpbnMgYW4gZkFueSBvcgorLy8vIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdHlwZS4KK2Jvb2wgRUVWVDo6VHlwZVNldDo6aGFzRmxvYXRpbmdQb2ludFR5cGVzKCkgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVHlwZVZlYy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChpc0Zsb2F0aW5nUG9pbnQoVHlwZVZlY1tpXSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfSAgCisKKy8vLyBoYXNWZWN0b3JUeXBlcyAtIFJldHVybiB0cnVlIGlmIHRoaXMgVHlwZVNldCBjb250YWlucyBhIHZBbnkgb3IgYSB2ZWN0b3IKKy8vLyB2YWx1ZSB0eXBlLgorYm9vbCBFRVZUOjpUeXBlU2V0OjpoYXNWZWN0b3JUeXBlcygpIGNvbnN0IHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFR5cGVWZWMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoaXNWZWN0b3IoVHlwZVZlY1tpXSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisKK3N0ZDo6c3RyaW5nIEVFVlQ6OlR5cGVTZXQ6OmdldE5hbWUoKSBjb25zdCB7CisgIGlmIChUeXBlVmVjLmVtcHR5KCkpIHJldHVybiAiPGVtcHR5PiI7CisgIAorICBzdGQ6OnN0cmluZyBSZXN1bHQ7CisgICAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUeXBlVmVjLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBzdGQ6OnN0cmluZyBWVE5hbWUgPSBsbHZtOjpnZXRFbnVtTmFtZShUeXBlVmVjW2ldKTsKKyAgICAvLyBTdHJpcCBvZmYgTVZUOjogcHJlZml4IGlmIHByZXNlbnQuCisgICAgaWYgKFZUTmFtZS5zdWJzdHIoMCw1KSA9PSAiTVZUOjoiKQorICAgICAgVlROYW1lID0gVlROYW1lLnN1YnN0cig1KTsKKyAgICBpZiAoaSkgUmVzdWx0ICs9ICc6JzsKKyAgICBSZXN1bHQgKz0gVlROYW1lOworICB9CisgIAorICBpZiAoVHlwZVZlYy5zaXplKCkgPT0gMSkKKyAgICByZXR1cm4gUmVzdWx0OworICByZXR1cm4gInsiICsgUmVzdWx0ICsgIn0iOworfQorCisvLy8gTWVyZ2VJblR5cGVJbmZvIC0gVGhpcyBtZXJnZXMgaW4gdHlwZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKKy8vLyBhcmd1bWVudC4gIElmICd0aGlzJyBjaGFuZ2VzLCBpdCByZXR1cm5zIHRydWUuICBJZiB0aGUgdHdvIHR5cGVzIGFyZQorLy8vIGNvbnRyYWRpY3RvcnkgKGUuZy4gbWVyZ2UgZjMyIGludG8gaTMyKSB0aGVuIHRoaXMgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KK2Jvb2wgRUVWVDo6VHlwZVNldDo6TWVyZ2VJblR5cGVJbmZvKGNvbnN0IEVFVlQ6OlR5cGVTZXQgJkluVlQsIFRyZWVQYXR0ZXJuICZUUCl7CisgIGlmIChJblZULmlzQ29tcGxldGVseVVua25vd24oKSB8fCAqdGhpcyA9PSBJblZUKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGlmIChpc0NvbXBsZXRlbHlVbmtub3duKCkpIHsKKyAgICAqdGhpcyA9IEluVlQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIGFzc2VydChUeXBlVmVjLnNpemUoKSA+PSAxICYmIEluVlQuVHlwZVZlYy5zaXplKCkgPj0gMSAmJiAiTm8gdW5rbm93bnMiKTsKKyAgCisgIC8vIEhhbmRsZSB0aGUgYWJzdHJhY3QgY2FzZXMsIHNlZWluZyBpZiB3ZSBjYW4gcmVzb2x2ZSB0aGVtIGJldHRlci4KKyAgc3dpdGNoIChUeXBlVmVjWzBdKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIE1WVDo6aVBUUjoKKyAgY2FzZSBNVlQ6OmlQVFJBbnk6CisgICAgaWYgKEluVlQuaGFzSW50ZWdlclR5cGVzKCkpIHsKKyAgICAgIEVFVlQ6OlR5cGVTZXQgSW5Db3B5KEluVlQpOworICAgICAgSW5Db3B5LkVuZm9yY2VJbnRlZ2VyKFRQKTsKKyAgICAgIEluQ29weS5FbmZvcmNlU2NhbGFyKFRQKTsKKyAgICAgIAorICAgICAgaWYgKEluQ29weS5pc0NvbmNyZXRlKCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIFJIUyBoYXMgb25lIGludGVnZXIgdHlwZSwgdXBncmFkZSBpUFRSIHRvIGkzMi4KKyAgICAgICAgVHlwZVZlY1swXSA9IEluVlQuVHlwZVZlY1swXTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIElmIHRoZSBpbnB1dCBoYXMgbXVsdGlwbGUgc2NhbGFyIGludGVnZXJzLCB0aGlzIGRvZXNuJ3QgYWRkIGFueSBpbmZvLgorICAgICAgaWYgKCFJbkNvcHkuaXNDb21wbGV0ZWx5VW5rbm93bigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIAorICAvLyBJZiB0aGUgaW5wdXQgY29uc3RyYWludCBpcyBpQW55L2lQVFIgYW5kIHRoaXMgaXMgYW4gaW50ZWdlciB0eXBlIGxpc3QsCisgIC8vIHJlbW92ZSBub24taW50ZWdlciB0eXBlcyBmcm9tIHRoZSBsaXN0LgorICBpZiAoKEluVlQuVHlwZVZlY1swXSA9PSBNVlQ6OmlQVFIgfHwgSW5WVC5UeXBlVmVjWzBdID09IE1WVDo6aVBUUkFueSkgJiYKKyAgICAgIGhhc0ludGVnZXJUeXBlcygpKSB7CisgICAgYm9vbCBNYWRlQ2hhbmdlID0gRW5mb3JjZUludGVnZXIoVFApOworICAgIAorICAgIC8vIElmIHdlJ3JlIG1lcmdpbmcgaW4gaVBUUi9pUFRSQW55IGFuZCB0aGUgbm9kZSBjdXJyZW50bHkgaGFzIGEgbGlzdCBvZgorICAgIC8vIG11bHRpcGxlIGRpZmZlcmVudCBpbnRlZ2VyIHR5cGVzLCByZXBsYWNlIHRoZW0gd2l0aCBhIHNpbmdsZSBpUFRSLgorICAgIGlmICgoSW5WVC5UeXBlVmVjWzBdID09IE1WVDo6aVBUUiB8fCBJblZULlR5cGVWZWNbMF0gPT0gTVZUOjppUFRSQW55KSAmJgorICAgICAgICBUeXBlVmVjLnNpemUoKSAhPSAxKSB7CisgICAgICBUeXBlVmVjLnJlc2l6ZSgxKTsKKyAgICAgIFR5cGVWZWNbMF0gPSBJblZULlR5cGVWZWNbMF07CisgICAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIE1hZGVDaGFuZ2U7CisgIH0KKyAgCisgIC8vIElmIHRoaXMgaXMgYSB0eXBlIGxpc3QgYW5kIHRoZSBSSFMgaXMgYSB0eXBlbGlzdCBhcyB3ZWxsLCBlbGltaW5hdGUgZW50cmllcworICAvLyBmcm9tIHRoaXMgbGlzdCB0aGF0IGFyZW4ndCBpbiB0aGUgb3RoZXIgb25lLgorICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgVHlwZVNldCBJbnB1dFNldCgqdGhpcyk7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBUeXBlVmVjLnNpemUoKTsgKytpKSB7CisgICAgYm9vbCBJbkluVlQgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gSW5WVC5UeXBlVmVjLnNpemUoKTsgaiAhPSBlOyArK2opCisgICAgICBpZiAoVHlwZVZlY1tpXSA9PSBJblZULlR5cGVWZWNbal0pIHsKKyAgICAgICAgSW5JblZUID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgCisgICAgaWYgKEluSW5WVCkgY29udGludWU7CisgICAgVHlwZVZlYy5lcmFzZShUeXBlVmVjLmJlZ2luKCkraS0tKTsKKyAgICBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgfQorICAKKyAgLy8gSWYgd2UgcmVtb3ZlZCBhbGwgb2Ygb3VyIHR5cGVzLCB3ZSBoYXZlIGEgdHlwZSBjb250cmFkaWN0aW9uLgorICBpZiAoIVR5cGVWZWMuZW1wdHkoKSkKKyAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgCisgIC8vIEZJWE1FOiBSZWFsbHkgd2FudCBhbiBTTUxvYyBoZXJlIQorICBUUC5lcnJvcigiVHlwZSBpbmZlcmVuY2UgY29udHJhZGljdGlvbiBmb3VuZCwgbWVyZ2luZyAnIiArCisgICAgICAgICAgIEluVlQuZ2V0TmFtZSgpICsgIicgaW50byAnIiArIElucHV0U2V0LmdldE5hbWUoKSArICInIik7CisgIHJldHVybiB0cnVlOyAvLyB1bnJlYWNoYWJsZQorfQorCisvLy8gRW5mb3JjZUludGVnZXIgLSBSZW1vdmUgYWxsIG5vbi1pbnRlZ2VyIHR5cGVzIGZyb20gdGhpcyBzZXQuCitib29sIEVFVlQ6OlR5cGVTZXQ6OkVuZm9yY2VJbnRlZ2VyKFRyZWVQYXR0ZXJuICZUUCkgeworICAvLyBJZiB3ZSBrbm93IG5vdGhpbmcsIHRoZW4gZ2V0IHRoZSBmdWxsIHNldC4KKyAgaWYgKFR5cGVWZWMuZW1wdHkoKSkKKyAgICByZXR1cm4gRmlsbFdpdGhQb3NzaWJsZVR5cGVzKFRQLCBpc0ludGVnZXIsICJpbnRlZ2VyIik7CisgIGlmICghaGFzRmxvYXRpbmdQb2ludFR5cGVzKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFR5cGVTZXQgSW5wdXRTZXQoKnRoaXMpOworICAKKyAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGZwIHR5cGVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFR5cGVWZWMuc2l6ZSgpOyArK2kpCisgICAgaWYgKCFpc0ludGVnZXIoVHlwZVZlY1tpXSkpCisgICAgICBUeXBlVmVjLmVyYXNlKFR5cGVWZWMuYmVnaW4oKStpLS0pOworICAKKyAgaWYgKFR5cGVWZWMuZW1wdHkoKSkKKyAgICBUUC5lcnJvcigiVHlwZSBpbmZlcmVuY2UgY29udHJhZGljdGlvbiBmb3VuZCwgJyIgKworICAgICAgICAgICAgIElucHV0U2V0LmdldE5hbWUoKSArICInIG5lZWRzIHRvIGJlIGludGVnZXIiKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBFbmZvcmNlRmxvYXRpbmdQb2ludCAtIFJlbW92ZSBhbGwgaW50ZWdlciB0eXBlcyBmcm9tIHRoaXMgc2V0LgorYm9vbCBFRVZUOjpUeXBlU2V0OjpFbmZvcmNlRmxvYXRpbmdQb2ludChUcmVlUGF0dGVybiAmVFApIHsKKyAgLy8gSWYgd2Uga25vdyBub3RoaW5nLCB0aGVuIGdldCB0aGUgZnVsbCBzZXQuCisgIGlmIChUeXBlVmVjLmVtcHR5KCkpCisgICAgcmV0dXJuIEZpbGxXaXRoUG9zc2libGVUeXBlcyhUUCwgaXNGbG9hdGluZ1BvaW50LCAiZmxvYXRpbmcgcG9pbnQiKTsKKworICBpZiAoIWhhc0ludGVnZXJUeXBlcygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBUeXBlU2V0IElucHV0U2V0KCp0aGlzKTsKKyAgCisgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmcCB0eXBlcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBUeXBlVmVjLnNpemUoKTsgKytpKQorICAgIGlmICghaXNGbG9hdGluZ1BvaW50KFR5cGVWZWNbaV0pKQorICAgICAgVHlwZVZlYy5lcmFzZShUeXBlVmVjLmJlZ2luKCkraS0tKTsKKyAgCisgIGlmIChUeXBlVmVjLmVtcHR5KCkpCisgICAgVFAuZXJyb3IoIlR5cGUgaW5mZXJlbmNlIGNvbnRyYWRpY3Rpb24gZm91bmQsICciICsKKyAgICAgICAgICAgICBJbnB1dFNldC5nZXROYW1lKCkgKyAiJyBuZWVkcyB0byBiZSBmbG9hdGluZyBwb2ludCIpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIEVuZm9yY2VTY2FsYXIgLSBSZW1vdmUgYWxsIHZlY3RvciB0eXBlcyBmcm9tIHRoaXMuCitib29sIEVFVlQ6OlR5cGVTZXQ6OkVuZm9yY2VTY2FsYXIoVHJlZVBhdHRlcm4gJlRQKSB7CisgIC8vIElmIHdlIGtub3cgbm90aGluZywgdGhlbiBnZXQgdGhlIGZ1bGwgc2V0LgorICBpZiAoVHlwZVZlYy5lbXB0eSgpKQorICAgIHJldHVybiBGaWxsV2l0aFBvc3NpYmxlVHlwZXMoVFAsIGlzU2NhbGFyLCAic2NhbGFyIik7CisKKyAgaWYgKCFoYXNWZWN0b3JUeXBlcygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBUeXBlU2V0IElucHV0U2V0KCp0aGlzKTsKKyAgCisgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSB2ZWN0b3IgdHlwZXMuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gVHlwZVZlYy5zaXplKCk7ICsraSkKKyAgICBpZiAoIWlzU2NhbGFyKFR5cGVWZWNbaV0pKQorICAgICAgVHlwZVZlYy5lcmFzZShUeXBlVmVjLmJlZ2luKCkraS0tKTsKKyAgCisgIGlmIChUeXBlVmVjLmVtcHR5KCkpCisgICAgVFAuZXJyb3IoIlR5cGUgaW5mZXJlbmNlIGNvbnRyYWRpY3Rpb24gZm91bmQsICciICsKKyAgICAgICAgICAgICBJbnB1dFNldC5nZXROYW1lKCkgKyAiJyBuZWVkcyB0byBiZSBzY2FsYXIiKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBFbmZvcmNlVmVjdG9yIC0gUmVtb3ZlIGFsbCB2ZWN0b3IgdHlwZXMgZnJvbSB0aGlzLgorYm9vbCBFRVZUOjpUeXBlU2V0OjpFbmZvcmNlVmVjdG9yKFRyZWVQYXR0ZXJuICZUUCkgeworICAvLyBJZiB3ZSBrbm93IG5vdGhpbmcsIHRoZW4gZ2V0IHRoZSBmdWxsIHNldC4KKyAgaWYgKFR5cGVWZWMuZW1wdHkoKSkKKyAgICByZXR1cm4gRmlsbFdpdGhQb3NzaWJsZVR5cGVzKFRQLCBpc1ZlY3RvciwgInZlY3RvciIpOworCisgIFR5cGVTZXQgSW5wdXRTZXQoKnRoaXMpOworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgCisgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBzY2FsYXIgdHlwZXMuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gVHlwZVZlYy5zaXplKCk7ICsraSkKKyAgICBpZiAoIWlzVmVjdG9yKFR5cGVWZWNbaV0pKSB7CisgICAgICBUeXBlVmVjLmVyYXNlKFR5cGVWZWMuYmVnaW4oKStpLS0pOworICAgICAgTWFkZUNoYW5nZSA9IHRydWU7CisgICAgfQorICAKKyAgaWYgKFR5cGVWZWMuZW1wdHkoKSkKKyAgICBUUC5lcnJvcigiVHlwZSBpbmZlcmVuY2UgY29udHJhZGljdGlvbiBmb3VuZCwgJyIgKworICAgICAgICAgICAgIElucHV0U2V0LmdldE5hbWUoKSArICInIG5lZWRzIHRvIGJlIGEgdmVjdG9yIik7CisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisKKworLy8vIEVuZm9yY2VTbWFsbGVyVGhhbiAtICd0aGlzJyBtdXN0IGJlIGEgc21hbGxlciBWVCB0aGFuIE90aGVyLiAgVXBkYXRlCisvLy8gdGhpcyBhbiBvdGhlciBiYXNlZCBvbiB0aGlzIGluZm9ybWF0aW9uLgorYm9vbCBFRVZUOjpUeXBlU2V0OjpFbmZvcmNlU21hbGxlclRoYW4oRUVWVDo6VHlwZVNldCAmT3RoZXIsIFRyZWVQYXR0ZXJuICZUUCkgeworICAvLyBCb3RoIG9wZXJhbmRzIG11c3QgYmUgaW50ZWdlciBvciBGUCwgYnV0IHdlIGRvbid0IGNhcmUgd2hpY2guCisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICAKKyAgaWYgKGlzQ29tcGxldGVseVVua25vd24oKSkKKyAgICBNYWRlQ2hhbmdlID0gRmlsbFdpdGhQb3NzaWJsZVR5cGVzKFRQKTsKKworICBpZiAoT3RoZXIuaXNDb21wbGV0ZWx5VW5rbm93bigpKQorICAgIE1hZGVDaGFuZ2UgPSBPdGhlci5GaWxsV2l0aFBvc3NpYmxlVHlwZXMoVFApOworICAgIAorICAvLyBJZiBvbmUgc2lkZSBpcyBrbm93biB0byBiZSBpbnRlZ2VyIG9yIGtub3duIHRvIGJlIEZQIGJ1dCB0aGUgb3RoZXIgc2lkZSBoYXMKKyAgLy8gbm8gaW5mb3JtYXRpb24sIGdldCBhdCBsZWFzdCB0aGUgdHlwZSBpbnRlZ3JhbGl0eSBpbmZvIGluIHRoZXJlLgorICBpZiAoIWhhc0Zsb2F0aW5nUG9pbnRUeXBlcygpKQorICAgIE1hZGVDaGFuZ2UgfD0gT3RoZXIuRW5mb3JjZUludGVnZXIoVFApOworICBlbHNlIGlmICghaGFzSW50ZWdlclR5cGVzKCkpCisgICAgTWFkZUNoYW5nZSB8PSBPdGhlci5FbmZvcmNlRmxvYXRpbmdQb2ludChUUCk7CisgIGlmICghT3RoZXIuaGFzRmxvYXRpbmdQb2ludFR5cGVzKCkpCisgICAgTWFkZUNoYW5nZSB8PSBFbmZvcmNlSW50ZWdlcihUUCk7CisgIGVsc2UgaWYgKCFPdGhlci5oYXNJbnRlZ2VyVHlwZXMoKSkKKyAgICBNYWRlQ2hhbmdlIHw9IEVuZm9yY2VGbG9hdGluZ1BvaW50KFRQKTsKKyAgCisgIGFzc2VydCghaXNDb21wbGV0ZWx5VW5rbm93bigpICYmICFPdGhlci5pc0NvbXBsZXRlbHlVbmtub3duKCkgJiYKKyAgICAgICAgICJTaG91bGQgaGF2ZSBhIHR5cGUgbGlzdCBub3ciKTsKKyAgCisgIC8vIElmIG9uZSBjb250YWlucyB2ZWN0b3JzIGJ1dCB0aGUgb3RoZXIgZG9lc24ndCBwdWxsIHZlY3RvcnMgb3V0LgorICBpZiAoIWhhc1ZlY3RvclR5cGVzKCkpCisgICAgTWFkZUNoYW5nZSB8PSBPdGhlci5FbmZvcmNlU2NhbGFyKFRQKTsKKyAgaWYgKCFoYXNWZWN0b3JUeXBlcygpKQorICAgIE1hZGVDaGFuZ2UgfD0gRW5mb3JjZVNjYWxhcihUUCk7CisgIAorICAvLyBUaGlzIGNvZGUgZG9lcyBub3QgY3VycmVudGx5IGhhbmRsZSBub2RlcyB3aGljaCBoYXZlIG11bHRpcGxlIHR5cGVzLAorICAvLyB3aGVyZSBzb21lIHR5cGVzIGFyZSBpbnRlZ2VyLCBhbmQgc29tZSBhcmUgZnAuICBBc3NlcnQgdGhhdCB0aGlzIGlzIG5vdAorICAvLyB0aGUgY2FzZS4KKyAgYXNzZXJ0KCEoaGFzSW50ZWdlclR5cGVzKCkgJiYgaGFzRmxvYXRpbmdQb2ludFR5cGVzKCkpICYmCisgICAgICAgICAhKE90aGVyLmhhc0ludGVnZXJUeXBlcygpICYmIE90aGVyLmhhc0Zsb2F0aW5nUG9pbnRUeXBlcygpKSAmJgorICAgICAgICAgIlNEVENpc09wU21hbGxlclRoYW5PcCBkb2VzIG5vdCBoYW5kbGUgbWl4ZWQgaW50L2ZwIHR5cGVzISIpOworICAKKyAgLy8gT2theSwgZmluZCB0aGUgc21hbGxlc3QgdHlwZSBmcm9tIHRoZSBjdXJyZW50IHNldCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlCisgIC8vIGxhcmdlc3Qgc2V0LgorICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBTbWFsbGVzdCA9IFR5cGVWZWNbMF07CisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBUeXBlVmVjLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFR5cGVWZWNbaV0gPCBTbWFsbGVzdCkKKyAgICAgIFNtYWxsZXN0ID0gVHlwZVZlY1tpXTsKKyAgCisgIC8vIElmIHRoaXMgaXMgdGhlIG9ubHkgdHlwZSBpbiB0aGUgbGFyZ2Ugc2V0LCB0aGUgY29uc3RyYWludCBjYW4gbmV2ZXIgYmUKKyAgLy8gc2F0aXNmaWVkLgorICBpZiAoT3RoZXIuVHlwZVZlYy5zaXplKCkgPT0gMSAmJiBPdGhlci5UeXBlVmVjWzBdID09IFNtYWxsZXN0KQorICAgIFRQLmVycm9yKCJUeXBlIGluZmVyZW5jZSBjb250cmFkaWN0aW9uIGZvdW5kLCAnIiArCisgICAgICAgICAgICAgT3RoZXIuZ2V0TmFtZSgpICsgIicgaGFzIG5vdGhpbmcgbGFyZ2VyIHRoYW4gJyIgKyBnZXROYW1lKCkgKyInISIpOworICAKKyAgU21hbGxWZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGUsIDI+OjppdGVyYXRvciBUVkkgPQorICAgIHN0ZDo6ZmluZChPdGhlci5UeXBlVmVjLmJlZ2luKCksIE90aGVyLlR5cGVWZWMuZW5kKCksIFNtYWxsZXN0KTsKKyAgaWYgKFRWSSAhPSBPdGhlci5UeXBlVmVjLmVuZCgpKSB7CisgICAgT3RoZXIuVHlwZVZlYy5lcmFzZShUVkkpOworICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICB9CisgIAorICAvLyBPa2F5LCBmaW5kIHRoZSBsYXJnZXN0IHR5cGUgaW4gdGhlIE90aGVyIHNldCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlCisgIC8vIGN1cnJlbnQgc2V0LgorICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBMYXJnZXN0ID0gT3RoZXIuVHlwZVZlY1swXTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE90aGVyLlR5cGVWZWMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoT3RoZXIuVHlwZVZlY1tpXSA+IExhcmdlc3QpCisgICAgICBMYXJnZXN0ID0gT3RoZXIuVHlwZVZlY1tpXTsKKyAgCisgIC8vIElmIHRoaXMgaXMgdGhlIG9ubHkgdHlwZSBpbiB0aGUgc21hbGwgc2V0LCB0aGUgY29uc3RyYWludCBjYW4gbmV2ZXIgYmUKKyAgLy8gc2F0aXNmaWVkLgorICBpZiAoVHlwZVZlYy5zaXplKCkgPT0gMSAmJiBUeXBlVmVjWzBdID09IExhcmdlc3QpCisgICAgVFAuZXJyb3IoIlR5cGUgaW5mZXJlbmNlIGNvbnRyYWRpY3Rpb24gZm91bmQsICciICsKKyAgICAgICAgICAgICBnZXROYW1lKCkgKyAiJyBoYXMgbm90aGluZyBzbWFsbGVyIHRoYW4gJyIgKyBPdGhlci5nZXROYW1lKCkrIichIik7CisgIAorICBUVkkgPSBzdGQ6OmZpbmQoVHlwZVZlYy5iZWdpbigpLCBUeXBlVmVjLmVuZCgpLCBMYXJnZXN0KTsKKyAgaWYgKFRWSSAhPSBUeXBlVmVjLmVuZCgpKSB7CisgICAgVHlwZVZlYy5lcmFzZShUVkkpOworICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICB9CisgIAorICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworLy8vIEVuZm9yY2VWZWN0b3JFbHRUeXBlSXMgLSAndGhpcycgaXMgbm93IGNvbnN0cmFpbnRlZCB0byBiZSBhIHZlY3RvciB0eXBlCisvLy8gd2hvc2UgZWxlbWVudCBpcyBzcGVjaWZpZWQgYnkgVlRPcGVyYW5kLgorYm9vbCBFRVZUOjpUeXBlU2V0OjpFbmZvcmNlVmVjdG9yRWx0VHlwZUlzKEVFVlQ6OlR5cGVTZXQgJlZUT3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlUGF0dGVybiAmVFApIHsKKyAgLy8gIlRoaXMiIG11c3QgYmUgYSB2ZWN0b3IgYW5kICJWVE9wZXJhbmQiIG11c3QgYmUgYSBzY2FsYXIuCisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICBNYWRlQ2hhbmdlIHw9IEVuZm9yY2VWZWN0b3IoVFApOworICBNYWRlQ2hhbmdlIHw9IFZUT3BlcmFuZC5FbmZvcmNlU2NhbGFyKFRQKTsKKworICAvLyBJZiB3ZSBrbm93IHRoZSB2ZWN0b3IgdHlwZSwgaXQgZm9yY2VzIHRoZSBzY2FsYXIgdG8gYWdyZWUuCisgIGlmIChpc0NvbmNyZXRlKCkpIHsKKyAgICBFVlQgSVZUID0gZ2V0Q29uY3JldGUoKTsKKyAgICBJVlQgPSBJVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICByZXR1cm4gTWFkZUNoYW5nZSB8IAorICAgICAgVlRPcGVyYW5kLk1lcmdlSW5UeXBlSW5mbyhJVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSwgVFApOworICB9CisKKyAgLy8gSWYgdGhlIHNjYWxhciB0eXBlIGlzIGtub3duLCBmaWx0ZXIgb3V0IHZlY3RvciB0eXBlcyB3aG9zZSBlbGVtZW50IHR5cGVzCisgIC8vIGRpc2FncmVlLgorICBpZiAoIVZUT3BlcmFuZC5pc0NvbmNyZXRlKCkpCisgICAgcmV0dXJuIE1hZGVDaGFuZ2U7CisgIAorICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCA9IFZUT3BlcmFuZC5nZXRDb25jcmV0ZSgpOworICAKKyAgVHlwZVNldCBJbnB1dFNldCgqdGhpcyk7CisgIAorICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgdHlwZXMgd2hpY2ggZG9uJ3QgaGF2ZSB0aGUgcmlnaHQgZWxlbWVudCB0eXBlLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFR5cGVWZWMuc2l6ZSgpOyArK2kpIHsKKyAgICBhc3NlcnQoaXNWZWN0b3IoVHlwZVZlY1tpXSkgJiYgIkVuZm9yY2VWZWN0b3IgZGlkbid0IHdvcmsiKTsKKyAgICBpZiAoRVZUKFR5cGVWZWNbaV0pLmdldFZlY3RvckVsZW1lbnRUeXBlKCkuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSAhPSBWVCkgeworICAgICAgVHlwZVZlYy5lcmFzZShUeXBlVmVjLmJlZ2luKCkraS0tKTsKKyAgICAgIE1hZGVDaGFuZ2UgPSB0cnVlOworICAgIH0KKyAgfQorICAKKyAgaWYgKFR5cGVWZWMuZW1wdHkoKSkgIC8vIEZJWE1FOiBSZWFsbHkgd2FudCBhbiBTTUxvYyBoZXJlIQorICAgIFRQLmVycm9yKCJUeXBlIGluZmVyZW5jZSBjb250cmFkaWN0aW9uIGZvdW5kLCBmb3JjaW5nICciICsKKyAgICAgICAgICAgICBJbnB1dFNldC5nZXROYW1lKCkgKyAiJyB0byBoYXZlIGEgdmVjdG9yIGVsZW1lbnQiKTsKKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBIZWxwZXJzIGZvciB3b3JraW5nIHdpdGggZXh0ZW5kZWQgdHlwZXMuCisKK2Jvb2wgUmVjb3JkUHRyQ21wOjpvcGVyYXRvcigpKGNvbnN0IFJlY29yZCAqTEhTLCBjb25zdCBSZWNvcmQgKlJIUykgY29uc3QgeworICByZXR1cm4gTEhTLT5nZXRJRCgpIDwgUkhTLT5nZXRJRCgpOworfQorCisvLy8gRGVwZW5kZW50IHZhcmlhYmxlIG1hcCBmb3IgQ29kZUdlbkRBR1BhdHRlcm4gdmFyaWFudCBnZW5lcmF0aW9uCit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IERlcFZhck1hcDsKKworLy8vIENvbnN0IGl0ZXJhdG9yIHNob3J0aGFuZCBmb3IgRGVwVmFyTWFwCit0eXBlZGVmIERlcFZhck1hcDo6Y29uc3RfaXRlcmF0b3IgRGVwVmFyTWFwX2NpdGVyOworCituYW1lc3BhY2Ugewordm9pZCBGaW5kRGVwVmFyc09mKFRyZWVQYXR0ZXJuTm9kZSAqTiwgRGVwVmFyTWFwICZEZXBNYXApIHsKKyAgaWYgKE4tPmlzTGVhZigpKSB7CisgICAgaWYgKGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oTi0+Z2V0TGVhZlZhbHVlKCkpICE9IE5VTEwpIHsKKyAgICAgIERlcE1hcFtOLT5nZXROYW1lKCldKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTi0+Z2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpCisgICAgICBGaW5kRGVwVmFyc09mKE4tPmdldENoaWxkKGkpLCBEZXBNYXApOworICB9Cit9CisKKy8vISBGaW5kIGRlcGVuZGVudCB2YXJpYWJsZXMgd2l0aGluIGNoaWxkIHBhdHRlcm5zCisvKiEKKyAqLwordm9pZCBGaW5kRGVwVmFycyhUcmVlUGF0dGVybk5vZGUgKk4sIE11bHRpcGxlVXNlVmFyU2V0ICZEZXBWYXJzKSB7CisgIERlcFZhck1hcCBkZXBjb3VudHM7CisgIEZpbmREZXBWYXJzT2YoTiwgZGVwY291bnRzKTsKKyAgZm9yIChEZXBWYXJNYXBfY2l0ZXIgaSA9IGRlcGNvdW50cy5iZWdpbigpOyBpICE9IGRlcGNvdW50cy5lbmQoKTsgKytpKSB7CisgICAgaWYgKGktPnNlY29uZCA+IDEpIHsgICAgICAgICAgICAvLyBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4KKyAgICAgIERlcFZhcnMuaW5zZXJ0KGktPmZpcnN0KTsKKyAgICB9CisgIH0KK30KKworLy8hIER1bXAgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBzZXQ6Cit2b2lkIER1bXBEZXBWYXJzKE11bHRpcGxlVXNlVmFyU2V0ICZEZXBWYXJzKSB7CisgIGlmIChEZXBWYXJzLmVtcHR5KCkpIHsKKyAgICBERUJVRyhlcnJzKCkgPDwgIjxlbXB0eSBzZXQ+Iik7CisgIH0gZWxzZSB7CisgICAgREVCVUcoZXJycygpIDw8ICJbICIpOworICAgIGZvciAoTXVsdGlwbGVVc2VWYXJTZXQ6OmNvbnN0X2l0ZXJhdG9yIGkgPSBEZXBWYXJzLmJlZ2luKCksIGUgPSBEZXBWYXJzLmVuZCgpOworICAgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICAgIERFQlVHKGVycnMoKSA8PCAoKmkpIDw8ICIgIik7CisgICAgfQorICAgIERFQlVHKGVycnMoKSA8PCAiXSIpOworICB9Cit9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXR0ZXJuVG9NYXRjaCBpbXBsZW1lbnRhdGlvbgorLy8KKworCisvLy8gZ2V0UGF0dGVyblNpemUgLSBSZXR1cm4gdGhlICdzaXplJyBvZiB0aGlzIHBhdHRlcm4uICBXZSB3YW50IHRvIG1hdGNoIGxhcmdlCisvLy8gcGF0dGVybnMgYmVmb3JlIHNtYWxsIG9uZXMuICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEKKy8vLyBwYXR0ZXJuLgorc3RhdGljIHVuc2lnbmVkIGdldFBhdHRlcm5TaXplKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNHUCkgeworICB1bnNpZ25lZCBTaXplID0gMzsgIC8vIFRoZSBub2RlIGl0c2VsZi4KKyAgLy8gSWYgdGhlIHJvb3Qgbm9kZSBpcyBhIENvbnN0YW50U0ROb2RlLCBpbmNyZWFzZXMgaXRzIHNpemUuCisgIC8vIGUuZy4gKHNldCBSMzI6JGRzdCwgMCkuCisgIGlmIChQLT5pc0xlYWYoKSAmJiBkeW5hbWljX2Nhc3Q8SW50SW5pdCo+KFAtPmdldExlYWZWYWx1ZSgpKSkKKyAgICBTaXplICs9IDI7CisgIAorICAvLyBGSVhNRTogVGhpcyBpcyBhIGhhY2sgdG8gc3RhdGljYWxseSBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2YgcGF0dGVybnMKKyAgLy8gd2hpY2ggbWFwcyBhIHN1Yi1kYWcgdG8gYSBjb21wbGV4IHBhdHRlcm4uIGUuZy4gZmF2b3JzIExFQSBvdmVyIEFERC4KKyAgLy8gTGF0ZXIgd2UgY2FuIGFsbG93IGNvbXBsZXhpdHkgLyBjb3N0IGZvciBlYWNoIHBhdHRlcm4gdG8gYmUgKG9wdGlvbmFsbHkpCisgIC8vIHNwZWNpZmllZC4gVG8gZ2V0IGJlc3QgcG9zc2libGUgcGF0dGVybiBtYXRjaCB3ZSdsbCBuZWVkIHRvIGR5bmFtaWNhbGx5CisgIC8vIGNhbGN1bGF0ZSB0aGUgY29tcGxleGl0eSBvZiBhbGwgcGF0dGVybnMgYSBkYWcgY2FuIHBvdGVudGlhbGx5IG1hcCB0by4KKyAgY29uc3QgQ29tcGxleFBhdHRlcm4gKkFNID0gUC0+Z2V0Q29tcGxleFBhdHRlcm5JbmZvKENHUCk7CisgIGlmIChBTSkKKyAgICBTaXplICs9IEFNLT5nZXROdW1PcGVyYW5kcygpICogMzsKKyAgCisgIC8vIElmIHRoaXMgbm9kZSBoYXMgc29tZSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCBtdXN0IG1hdGNoLCBpdCBhZGRzIHRvIHRoZQorICAvLyBjb21wbGV4aXR5IG9mIHRoaXMgbm9kZS4KKyAgaWYgKCFQLT5nZXRQcmVkaWNhdGVGbnMoKS5lbXB0eSgpKQorICAgICsrU2l6ZTsKKyAgCisgIC8vIENvdW50IGNoaWxkcmVuIGluIHRoZSBjb3VudCBpZiB0aGV5IGFyZSBhbHNvIG5vZGVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUC0+Z2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpIHsKKyAgICBUcmVlUGF0dGVybk5vZGUgKkNoaWxkID0gUC0+Z2V0Q2hpbGQoaSk7CisgICAgaWYgKCFDaGlsZC0+aXNMZWFmKCkgJiYgQ2hpbGQtPmdldE51bVR5cGVzKCkgJiYKKyAgICAgICAgQ2hpbGQtPmdldFR5cGUoMCkgIT0gTVZUOjpPdGhlcikKKyAgICAgIFNpemUgKz0gZ2V0UGF0dGVyblNpemUoQ2hpbGQsIENHUCk7CisgICAgZWxzZSBpZiAoQ2hpbGQtPmlzTGVhZigpKSB7CisgICAgICBpZiAoZHluYW1pY19jYXN0PEludEluaXQqPihDaGlsZC0+Z2V0TGVhZlZhbHVlKCkpKSAKKyAgICAgICAgU2l6ZSArPSA1OyAgLy8gTWF0Y2hlcyBhIENvbnN0YW50U0ROb2RlICgrMykgYW5kIGEgc3BlY2lmaWMgdmFsdWUgKCsyKS4KKyAgICAgIGVsc2UgaWYgKENoaWxkLT5nZXRDb21wbGV4UGF0dGVybkluZm8oQ0dQKSkKKyAgICAgICAgU2l6ZSArPSBnZXRQYXR0ZXJuU2l6ZShDaGlsZCwgQ0dQKTsKKyAgICAgIGVsc2UgaWYgKCFDaGlsZC0+Z2V0UHJlZGljYXRlRm5zKCkuZW1wdHkoKSkKKyAgICAgICAgKytTaXplOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIFNpemU7Cit9CisKKy8vLyBDb21wdXRlIHRoZSBjb21wbGV4aXR5IG1ldHJpYyBmb3IgdGhlIGlucHV0IHBhdHRlcm4uICBUaGlzIHJvdWdobHkKKy8vLyBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIG5vZGVzIHRoYXQgYXJlIGNvdmVyZWQuCit1bnNpZ25lZCBQYXR0ZXJuVG9NYXRjaDo6CitnZXRQYXR0ZXJuQ29tcGxleGl0eShjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNHUCkgY29uc3QgeworICByZXR1cm4gZ2V0UGF0dGVyblNpemUoZ2V0U3JjUGF0dGVybigpLCBDR1ApICsgZ2V0QWRkZWRDb21wbGV4aXR5KCk7Cit9CisKKworLy8vIGdldFByZWRpY2F0ZUNoZWNrIC0gUmV0dXJuIGEgc2luZ2xlIHN0cmluZyBjb250YWluaW5nIGFsbCBvZiB0aGlzCisvLy8gcGF0dGVybidzIHByZWRpY2F0ZXMgY29uY2F0ZW5hdGVkIHdpdGggIiYmIiBvcGVyYXRvcnMuCisvLy8KK3N0ZDo6c3RyaW5nIFBhdHRlcm5Ub01hdGNoOjpnZXRQcmVkaWNhdGVDaGVjaygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgUHJlZGljYXRlQ2hlY2s7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcmVkaWNhdGVzLT5nZXRTaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKERlZkluaXQgKlByZWQgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KFByZWRpY2F0ZXMtPmdldEVsZW1lbnQoaSkpKSB7CisgICAgICBSZWNvcmQgKkRlZiA9IFByZWQtPmdldERlZigpOworICAgICAgaWYgKCFEZWYtPmlzU3ViQ2xhc3NPZigiUHJlZGljYXRlIikpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIERlZi0+ZHVtcCgpOworI2VuZGlmCisgICAgICAgIGFzc2VydCgwICYmICJVbmtub3duIHByZWRpY2F0ZSB0eXBlISIpOworICAgICAgfQorICAgICAgaWYgKCFQcmVkaWNhdGVDaGVjay5lbXB0eSgpKQorICAgICAgICBQcmVkaWNhdGVDaGVjayArPSAiICYmICI7CisgICAgICBQcmVkaWNhdGVDaGVjayArPSAiKCIgKyBEZWYtPmdldFZhbHVlQXNTdHJpbmcoIkNvbmRTdHJpbmciKSArICIpIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gUHJlZGljYXRlQ2hlY2s7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTRFR5cGVDb25zdHJhaW50IGltcGxlbWVudGF0aW9uCisvLworCitTRFR5cGVDb25zdHJhaW50OjpTRFR5cGVDb25zdHJhaW50KFJlY29yZCAqUikgeworICBPcGVyYW5kTm8gPSBSLT5nZXRWYWx1ZUFzSW50KCJPcGVyYW5kTnVtIik7CisgIAorICBpZiAoUi0+aXNTdWJDbGFzc09mKCJTRFRDaXNWVCIpKSB7CisgICAgQ29uc3RyYWludFR5cGUgPSBTRFRDaXNWVDsKKyAgICB4LlNEVENpc1ZUX0luZm8uVlQgPSBnZXRWYWx1ZVR5cGUoUi0+Z2V0VmFsdWVBc0RlZigiVlQiKSk7CisgICAgaWYgKHguU0RUQ2lzVlRfSW5mby5WVCA9PSBNVlQ6OmlzVm9pZCkKKyAgICAgIHRocm93IFRHRXJyb3IoUi0+Z2V0TG9jKCksICJDYW5ub3QgdXNlICdWb2lkJyBhcyB0eXBlIHRvIFNEVENpc1ZUIik7CisgICAgICAKKyAgfSBlbHNlIGlmIChSLT5pc1N1YkNsYXNzT2YoIlNEVENpc1B0clR5IikpIHsKKyAgICBDb25zdHJhaW50VHlwZSA9IFNEVENpc1B0clR5OworICB9IGVsc2UgaWYgKFItPmlzU3ViQ2xhc3NPZigiU0RUQ2lzSW50IikpIHsKKyAgICBDb25zdHJhaW50VHlwZSA9IFNEVENpc0ludDsKKyAgfSBlbHNlIGlmIChSLT5pc1N1YkNsYXNzT2YoIlNEVENpc0ZQIikpIHsKKyAgICBDb25zdHJhaW50VHlwZSA9IFNEVENpc0ZQOworICB9IGVsc2UgaWYgKFItPmlzU3ViQ2xhc3NPZigiU0RUQ2lzVmVjIikpIHsKKyAgICBDb25zdHJhaW50VHlwZSA9IFNEVENpc1ZlYzsKKyAgfSBlbHNlIGlmIChSLT5pc1N1YkNsYXNzT2YoIlNEVENpc1NhbWVBcyIpKSB7CisgICAgQ29uc3RyYWludFR5cGUgPSBTRFRDaXNTYW1lQXM7CisgICAgeC5TRFRDaXNTYW1lQXNfSW5mby5PdGhlck9wZXJhbmROdW0gPSBSLT5nZXRWYWx1ZUFzSW50KCJPdGhlck9wZXJhbmROdW0iKTsKKyAgfSBlbHNlIGlmIChSLT5pc1N1YkNsYXNzT2YoIlNEVENpc1ZUU21hbGxlclRoYW5PcCIpKSB7CisgICAgQ29uc3RyYWludFR5cGUgPSBTRFRDaXNWVFNtYWxsZXJUaGFuT3A7CisgICAgeC5TRFRDaXNWVFNtYWxsZXJUaGFuT3BfSW5mby5PdGhlck9wZXJhbmROdW0gPSAKKyAgICAgIFItPmdldFZhbHVlQXNJbnQoIk90aGVyT3BlcmFuZE51bSIpOworICB9IGVsc2UgaWYgKFItPmlzU3ViQ2xhc3NPZigiU0RUQ2lzT3BTbWFsbGVyVGhhbk9wIikpIHsKKyAgICBDb25zdHJhaW50VHlwZSA9IFNEVENpc09wU21hbGxlclRoYW5PcDsKKyAgICB4LlNEVENpc09wU21hbGxlclRoYW5PcF9JbmZvLkJpZ09wZXJhbmROdW0gPSAKKyAgICAgIFItPmdldFZhbHVlQXNJbnQoIkJpZ09wZXJhbmROdW0iKTsKKyAgfSBlbHNlIGlmIChSLT5pc1N1YkNsYXNzT2YoIlNEVENpc0VsdE9mVmVjIikpIHsKKyAgICBDb25zdHJhaW50VHlwZSA9IFNEVENpc0VsdE9mVmVjOworICAgIHguU0RUQ2lzRWx0T2ZWZWNfSW5mby5PdGhlck9wZXJhbmROdW0gPSBSLT5nZXRWYWx1ZUFzSW50KCJPdGhlck9wTnVtIik7CisgIH0gZWxzZSB7CisgICAgZXJycygpIDw8ICJVbnJlY29nbml6ZWQgU0RUeXBlQ29uc3RyYWludCAnIiA8PCBSLT5nZXROYW1lKCkgPDwgIichXG4iOworICAgIGV4aXQoMSk7CisgIH0KK30KKworLy8vIGdldE9wZXJhbmROdW0gLSBSZXR1cm4gdGhlIG5vZGUgY29ycmVzcG9uZGluZyB0byBvcGVyYW5kICNPcE5vIGluIHRyZWUKKy8vLyBOLCBhbmQgdGhlIHJlc3VsdCBudW1iZXIgaW4gUmVzTm8uCitzdGF0aWMgVHJlZVBhdHRlcm5Ob2RlICpnZXRPcGVyYW5kTnVtKHVuc2lnbmVkIE9wTm8sIFRyZWVQYXR0ZXJuTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ROb2RlSW5mbyAmTm9kZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZSZXNObykgeworICB1bnNpZ25lZCBOdW1SZXN1bHRzID0gTm9kZUluZm8uZ2V0TnVtUmVzdWx0cygpOworICBpZiAoT3BObyA8IE51bVJlc3VsdHMpIHsKKyAgICBSZXNObyA9IE9wTm87CisgICAgcmV0dXJuIE47CisgIH0KKyAgCisgIE9wTm8gLT0gTnVtUmVzdWx0czsKKyAgCisgIGlmIChPcE5vID49IE4tPmdldE51bUNoaWxkcmVuKCkpIHsKKyAgICBlcnJzKCkgPDwgIkludmFsaWQgb3BlcmFuZCBudW1iZXIgaW4gdHlwZSBjb25zdHJhaW50ICIgCisgICAgICAgICAgIDw8IChPcE5vK051bVJlc3VsdHMpIDw8ICIgIjsKKyAgICBOLT5kdW1wKCk7CisgICAgZXJycygpIDw8ICdcbic7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIHJldHVybiBOLT5nZXRDaGlsZChPcE5vKTsKK30KKworLy8vIEFwcGx5VHlwZUNvbnN0cmFpbnQgLSBHaXZlbiBhIG5vZGUgaW4gYSBwYXR0ZXJuLCBhcHBseSB0aGlzIHR5cGUKKy8vLyBjb25zdHJhaW50IHRvIHRoZSBub2RlcyBvcGVyYW5kcy4gIFRoaXMgcmV0dXJucyB0cnVlIGlmIGl0IG1ha2VzIGEKKy8vLyBjaGFuZ2UsIGZhbHNlIG90aGVyd2lzZS4gIElmIGEgdHlwZSBjb250cmFkaWN0aW9uIGlzIGZvdW5kLCB0aHJvdyBhbgorLy8vIGV4Y2VwdGlvbi4KK2Jvb2wgU0RUeXBlQ29uc3RyYWludDo6QXBwbHlUeXBlQ29uc3RyYWludChUcmVlUGF0dGVybk5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ROb2RlSW5mbyAmTm9kZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVBhdHRlcm4gJlRQKSBjb25zdCB7CisgIHVuc2lnbmVkIFJlc05vID0gMDsgLy8gVGhlIHJlc3VsdCBudW1iZXIgYmVpbmcgcmVmZXJlbmNlZC4KKyAgVHJlZVBhdHRlcm5Ob2RlICpOb2RlVG9BcHBseSA9IGdldE9wZXJhbmROdW0oT3BlcmFuZE5vLCBOLCBOb2RlSW5mbywgUmVzTm8pOworICAKKyAgc3dpdGNoIChDb25zdHJhaW50VHlwZSkgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biBjb25zdHJhaW50IHR5cGUhIik7CisgIGNhc2UgU0RUQ2lzVlQ6CisgICAgLy8gT3BlcmFuZCBtdXN0IGJlIGEgcGFydGljdWxhciB0eXBlLgorICAgIHJldHVybiBOb2RlVG9BcHBseS0+VXBkYXRlTm9kZVR5cGUoUmVzTm8sIHguU0RUQ2lzVlRfSW5mby5WVCwgVFApOworICBjYXNlIFNEVENpc1B0clR5OgorICAgIC8vIE9wZXJhbmQgbXVzdCBiZSBzYW1lIGFzIHRhcmdldCBwb2ludGVyIHR5cGUuCisgICAgcmV0dXJuIE5vZGVUb0FwcGx5LT5VcGRhdGVOb2RlVHlwZShSZXNObywgTVZUOjppUFRSLCBUUCk7CisgIGNhc2UgU0RUQ2lzSW50OgorICAgIC8vIFJlcXVpcmUgaXQgdG8gYmUgb25lIG9mIHRoZSBsZWdhbCBpbnRlZ2VyIFZUcy4KKyAgICByZXR1cm4gTm9kZVRvQXBwbHktPmdldEV4dFR5cGUoUmVzTm8pLkVuZm9yY2VJbnRlZ2VyKFRQKTsKKyAgY2FzZSBTRFRDaXNGUDoKKyAgICAvLyBSZXF1aXJlIGl0IHRvIGJlIG9uZSBvZiB0aGUgbGVnYWwgZnAgVlRzLgorICAgIHJldHVybiBOb2RlVG9BcHBseS0+Z2V0RXh0VHlwZShSZXNObykuRW5mb3JjZUZsb2F0aW5nUG9pbnQoVFApOworICBjYXNlIFNEVENpc1ZlYzoKKyAgICAvLyBSZXF1aXJlIGl0IHRvIGJlIG9uZSBvZiB0aGUgbGVnYWwgdmVjdG9yIFZUcy4KKyAgICByZXR1cm4gTm9kZVRvQXBwbHktPmdldEV4dFR5cGUoUmVzTm8pLkVuZm9yY2VWZWN0b3IoVFApOworICBjYXNlIFNEVENpc1NhbWVBczogeworICAgIHVuc2lnbmVkIE9SZXNObyA9IDA7CisgICAgVHJlZVBhdHRlcm5Ob2RlICpPdGhlck5vZGUgPQorICAgICAgZ2V0T3BlcmFuZE51bSh4LlNEVENpc1NhbWVBc19JbmZvLk90aGVyT3BlcmFuZE51bSwgTiwgTm9kZUluZm8sIE9SZXNObyk7CisgICAgcmV0dXJuIE5vZGVUb0FwcGx5LT5VcGRhdGVOb2RlVHlwZShPUmVzTm8sIE90aGVyTm9kZS0+Z2V0RXh0VHlwZShSZXNObyksVFApfAorICAgICAgICAgICBPdGhlck5vZGUtPlVwZGF0ZU5vZGVUeXBlKFJlc05vLE5vZGVUb0FwcGx5LT5nZXRFeHRUeXBlKE9SZXNObyksVFApOworICB9CisgIGNhc2UgU0RUQ2lzVlRTbWFsbGVyVGhhbk9wOiB7CisgICAgLy8gVGhlIE5vZGVUb0FwcGx5IG11c3QgYmUgYSBsZWFmIG5vZGUgdGhhdCBpcyBhIFZULiAgT3RoZXJPcGVyYW5kTnVtIG11c3QKKyAgICAvLyBoYXZlIGFuIGludGVnZXIgdHlwZSB0aGF0IGlzIHNtYWxsZXIgdGhhbiB0aGUgVlQuCisgICAgaWYgKCFOb2RlVG9BcHBseS0+aXNMZWFmKCkgfHwKKyAgICAgICAgIWR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oTm9kZVRvQXBwbHktPmdldExlYWZWYWx1ZSgpKSB8fAorICAgICAgICAhc3RhdGljX2Nhc3Q8RGVmSW5pdCo+KE5vZGVUb0FwcGx5LT5nZXRMZWFmVmFsdWUoKSktPmdldERlZigpCisgICAgICAgICAgICAgICAtPmlzU3ViQ2xhc3NPZigiVmFsdWVUeXBlIikpCisgICAgICBUUC5lcnJvcihOLT5nZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgKyAiIGV4cGVjdHMgYSBWVCBvcGVyYW5kISIpOworICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUID0KKyAgICAgZ2V0VmFsdWVUeXBlKHN0YXRpY19jYXN0PERlZkluaXQqPihOb2RlVG9BcHBseS0+Z2V0TGVhZlZhbHVlKCkpLT5nZXREZWYoKSk7CisgICAgCisgICAgRUVWVDo6VHlwZVNldCBUeXBlTGlzdFRtcChWVCwgVFApOworICAgIAorICAgIHVuc2lnbmVkIE9SZXNObyA9IDA7CisgICAgVHJlZVBhdHRlcm5Ob2RlICpPdGhlck5vZGUgPQorICAgICAgZ2V0T3BlcmFuZE51bSh4LlNEVENpc1ZUU21hbGxlclRoYW5PcF9JbmZvLk90aGVyT3BlcmFuZE51bSwgTiwgTm9kZUluZm8sCisgICAgICAgICAgICAgICAgICAgIE9SZXNObyk7CisKKyAgICByZXR1cm4gVHlwZUxpc3RUbXAuRW5mb3JjZVNtYWxsZXJUaGFuKE90aGVyTm9kZS0+Z2V0RXh0VHlwZShPUmVzTm8pLCBUUCk7CisgIH0KKyAgY2FzZSBTRFRDaXNPcFNtYWxsZXJUaGFuT3A6IHsKKyAgICB1bnNpZ25lZCBCUmVzTm8gPSAwOworICAgIFRyZWVQYXR0ZXJuTm9kZSAqQmlnT3BlcmFuZCA9CisgICAgICBnZXRPcGVyYW5kTnVtKHguU0RUQ2lzT3BTbWFsbGVyVGhhbk9wX0luZm8uQmlnT3BlcmFuZE51bSwgTiwgTm9kZUluZm8sCisgICAgICAgICAgICAgICAgICAgIEJSZXNObyk7CisgICAgcmV0dXJuIE5vZGVUb0FwcGx5LT5nZXRFeHRUeXBlKFJlc05vKS4KKyAgICAgICAgICAgICAgICAgIEVuZm9yY2VTbWFsbGVyVGhhbihCaWdPcGVyYW5kLT5nZXRFeHRUeXBlKEJSZXNObyksIFRQKTsKKyAgfQorICBjYXNlIFNEVENpc0VsdE9mVmVjOiB7CisgICAgdW5zaWduZWQgVlJlc05vID0gMDsKKyAgICBUcmVlUGF0dGVybk5vZGUgKlZlY09wZXJhbmQgPQorICAgICAgZ2V0T3BlcmFuZE51bSh4LlNEVENpc0VsdE9mVmVjX0luZm8uT3RoZXJPcGVyYW5kTnVtLCBOLCBOb2RlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgVlJlc05vKTsKKyAgICAKKyAgICAvLyBGaWx0ZXIgdmVjdG9yIHR5cGVzIG91dCBvZiBWZWNPcGVyYW5kIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgcmlnaHQgZWxlbWVudAorICAgIC8vIHR5cGUuCisgICAgcmV0dXJuIFZlY09wZXJhbmQtPmdldEV4dFR5cGUoVlJlc05vKS4KKyAgICAgIEVuZm9yY2VWZWN0b3JFbHRUeXBlSXMoTm9kZVRvQXBwbHktPmdldEV4dFR5cGUoUmVzTm8pLCBUUCk7CisgIH0KKyAgfSAgCisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNETm9kZUluZm8gaW1wbGVtZW50YXRpb24KKy8vCitTRE5vZGVJbmZvOjpTRE5vZGVJbmZvKFJlY29yZCAqUikgOiBEZWYoUikgeworICBFbnVtTmFtZSAgICA9IFItPmdldFZhbHVlQXNTdHJpbmcoIk9wY29kZSIpOworICBTRENsYXNzTmFtZSA9IFItPmdldFZhbHVlQXNTdHJpbmcoIlNEQ2xhc3MiKTsKKyAgUmVjb3JkICpUeXBlUHJvZmlsZSA9IFItPmdldFZhbHVlQXNEZWYoIlR5cGVQcm9maWxlIik7CisgIE51bVJlc3VsdHMgPSBUeXBlUHJvZmlsZS0+Z2V0VmFsdWVBc0ludCgiTnVtUmVzdWx0cyIpOworICBOdW1PcGVyYW5kcyA9IFR5cGVQcm9maWxlLT5nZXRWYWx1ZUFzSW50KCJOdW1PcGVyYW5kcyIpOworICAKKyAgLy8gUGFyc2UgdGhlIHByb3BlcnRpZXMuCisgIFByb3BlcnRpZXMgPSAwOworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBQcm9wTGlzdCA9IFItPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJQcm9wZXJ0aWVzIik7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcm9wTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKFByb3BMaXN0W2ldLT5nZXROYW1lKCkgPT0gIlNETlBDb21tdXRhdGl2ZSIpIHsKKyAgICAgIFByb3BlcnRpZXMgfD0gMSA8PCBTRE5QQ29tbXV0YXRpdmU7CisgICAgfSBlbHNlIGlmIChQcm9wTGlzdFtpXS0+Z2V0TmFtZSgpID09ICJTRE5QQXNzb2NpYXRpdmUiKSB7CisgICAgICBQcm9wZXJ0aWVzIHw9IDEgPDwgU0ROUEFzc29jaWF0aXZlOworICAgIH0gZWxzZSBpZiAoUHJvcExpc3RbaV0tPmdldE5hbWUoKSA9PSAiU0ROUEhhc0NoYWluIikgeworICAgICAgUHJvcGVydGllcyB8PSAxIDw8IFNETlBIYXNDaGFpbjsKKyAgICB9IGVsc2UgaWYgKFByb3BMaXN0W2ldLT5nZXROYW1lKCkgPT0gIlNETlBPdXRGbGFnIikgeworICAgICAgUHJvcGVydGllcyB8PSAxIDw8IFNETlBPdXRGbGFnOworICAgIH0gZWxzZSBpZiAoUHJvcExpc3RbaV0tPmdldE5hbWUoKSA9PSAiU0ROUEluRmxhZyIpIHsKKyAgICAgIFByb3BlcnRpZXMgfD0gMSA8PCBTRE5QSW5GbGFnOworICAgIH0gZWxzZSBpZiAoUHJvcExpc3RbaV0tPmdldE5hbWUoKSA9PSAiU0ROUE9wdEluRmxhZyIpIHsKKyAgICAgIFByb3BlcnRpZXMgfD0gMSA8PCBTRE5QT3B0SW5GbGFnOworICAgIH0gZWxzZSBpZiAoUHJvcExpc3RbaV0tPmdldE5hbWUoKSA9PSAiU0ROUE1heVN0b3JlIikgeworICAgICAgUHJvcGVydGllcyB8PSAxIDw8IFNETlBNYXlTdG9yZTsKKyAgICB9IGVsc2UgaWYgKFByb3BMaXN0W2ldLT5nZXROYW1lKCkgPT0gIlNETlBNYXlMb2FkIikgeworICAgICAgUHJvcGVydGllcyB8PSAxIDw8IFNETlBNYXlMb2FkOworICAgIH0gZWxzZSBpZiAoUHJvcExpc3RbaV0tPmdldE5hbWUoKSA9PSAiU0ROUFNpZGVFZmZlY3QiKSB7CisgICAgICBQcm9wZXJ0aWVzIHw9IDEgPDwgU0ROUFNpZGVFZmZlY3Q7CisgICAgfSBlbHNlIGlmIChQcm9wTGlzdFtpXS0+Z2V0TmFtZSgpID09ICJTRE5QTWVtT3BlcmFuZCIpIHsKKyAgICAgIFByb3BlcnRpZXMgfD0gMSA8PCBTRE5QTWVtT3BlcmFuZDsKKyAgICB9IGVsc2UgaWYgKFByb3BMaXN0W2ldLT5nZXROYW1lKCkgPT0gIlNETlBWYXJpYWRpYyIpIHsKKyAgICAgIFByb3BlcnRpZXMgfD0gMSA8PCBTRE5QVmFyaWFkaWM7CisgICAgfSBlbHNlIHsKKyAgICAgIGVycnMoKSA8PCAiVW5rbm93biBTRCBOb2RlIHByb3BlcnR5ICciIDw8IFByb3BMaXN0W2ldLT5nZXROYW1lKCkKKyAgICAgICAgICAgICA8PCAiJyBvbiBub2RlICciIDw8IFItPmdldE5hbWUoKSA8PCAiJyFcbiI7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgfQorICAKKyAgCisgIC8vIFBhcnNlIHRoZSB0eXBlIGNvbnN0cmFpbnRzLgorICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBDb25zdHJhaW50TGlzdCA9CisgICAgVHlwZVByb2ZpbGUtPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJDb25zdHJhaW50cyIpOworICBUeXBlQ29uc3RyYWludHMuYXNzaWduKENvbnN0cmFpbnRMaXN0LmJlZ2luKCksIENvbnN0cmFpbnRMaXN0LmVuZCgpKTsKK30KKworLy8vIGdldEtub3duVHlwZSAtIElmIHRoZSB0eXBlIGNvbnN0cmFpbnRzIG9uIHRoaXMgbm9kZSBpbXBseSBhIGZpeGVkIHR5cGUKKy8vLyAoZS5nLiBhbGwgc3RvcmVzIHJldHVybiB2b2lkLCBldGMpLCB0aGVuIHJldHVybiBpdCBhcyBhbgorLy8vIE1WVDo6U2ltcGxlVmFsdWVUeXBlLiAgT3RoZXJ3aXNlLCByZXR1cm4gRUVWVDo6T3RoZXIuCitNVlQ6OlNpbXBsZVZhbHVlVHlwZSBTRE5vZGVJbmZvOjpnZXRLbm93blR5cGUodW5zaWduZWQgUmVzTm8pIGNvbnN0IHsKKyAgdW5zaWduZWQgTnVtUmVzdWx0cyA9IGdldE51bVJlc3VsdHMoKTsKKyAgYXNzZXJ0KE51bVJlc3VsdHMgPD0gMSAmJgorICAgICAgICAgIldlIG9ubHkgd29yayB3aXRoIG5vZGVzIHdpdGggemVybyBvciBvbmUgcmVzdWx0IHNvIGZhciEiKTsKKyAgYXNzZXJ0KFJlc05vID09IDAgJiYgIk9ubHkgaGFuZGxlcyBzaW5nbGUgcmVzdWx0IG5vZGVzIHNvIGZhciIpOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFR5cGVDb25zdHJhaW50cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhpcyBhcHBsaWVzIHRvIHRoZSBjb3JyZWN0IG5vZGUgcmVzdWx0LgorICAgIGlmIChUeXBlQ29uc3RyYWludHNbaV0uT3BlcmFuZE5vID49IE51bVJlc3VsdHMpICAvLyBGSVhNRTogbmVlZCB2YWx1ZSAjCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICBzd2l0Y2ggKFR5cGVDb25zdHJhaW50c1tpXS5Db25zdHJhaW50VHlwZSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgU0RUeXBlQ29uc3RyYWludDo6U0RUQ2lzVlQ6CisgICAgICByZXR1cm4gVHlwZUNvbnN0cmFpbnRzW2ldLnguU0RUQ2lzVlRfSW5mby5WVDsKKyAgICBjYXNlIFNEVHlwZUNvbnN0cmFpbnQ6OlNEVENpc1B0clR5OgorICAgICAgcmV0dXJuIE1WVDo6aVBUUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE1WVDo6T3RoZXI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUcmVlUGF0dGVybk5vZGUgaW1wbGVtZW50YXRpb24KKy8vCisKK1RyZWVQYXR0ZXJuTm9kZTo6flRyZWVQYXR0ZXJuTm9kZSgpIHsKKyNpZiAwIC8vIEZJWE1FOiBpbXBsZW1lbnQgcmVmY291bnRlZCB0cmVlIG5vZGVzIQorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpCisgICAgZGVsZXRlIGdldENoaWxkKGkpOworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBHZXROdW1Ob2RlUmVzdWx0cyhSZWNvcmQgKk9wZXJhdG9yLCBDb2RlR2VuREFHUGF0dGVybnMgJkNEUCkgeworICBpZiAoT3BlcmF0b3ItPmdldE5hbWUoKSA9PSAic2V0IiB8fAorICAgICAgT3BlcmF0b3ItPmdldE5hbWUoKSA9PSAiaW1wbGljaXQiKQorICAgIHJldHVybiAwOyAgLy8gQWxsIHJldHVybiBub3RoaW5nLgorICAKKyAgaWYgKE9wZXJhdG9yLT5pc1N1YkNsYXNzT2YoIkludHJpbnNpYyIpKQorICAgIHJldHVybiBDRFAuZ2V0SW50cmluc2ljKE9wZXJhdG9yKS5JUy5SZXRWVHMuc2l6ZSgpOworICAKKyAgaWYgKE9wZXJhdG9yLT5pc1N1YkNsYXNzT2YoIlNETm9kZSIpKQorICAgIHJldHVybiBDRFAuZ2V0U0ROb2RlSW5mbyhPcGVyYXRvcikuZ2V0TnVtUmVzdWx0cygpOworICAKKyAgaWYgKE9wZXJhdG9yLT5pc1N1YkNsYXNzT2YoIlBhdEZyYWciKSkgeworICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgcGFyc2VkIHRoaXMgcGF0dGVybiBmcmFnbWVudCwgZ2V0IGl0LiAgT3RoZXJ3aXNlLCBoYW5kbGUKKyAgICAvLyB0aGUgZm9yd2FyZCByZWZlcmVuY2UgY2FzZSB3aGVyZSBvbmUgcGF0dGVybiBmcmFnbWVudCByZWZlcmVuY2VzIGFub3RoZXIKKyAgICAvLyBiZWZvcmUgaXQgaXMgcHJvY2Vzc2VkLgorICAgIGlmIChUcmVlUGF0dGVybiAqUEZSZWMgPSBDRFAuZ2V0UGF0dGVybkZyYWdtZW50SWZSZWFkKE9wZXJhdG9yKSkKKyAgICAgIHJldHVybiBQRlJlYy0+Z2V0T25seVRyZWUoKS0+Z2V0TnVtVHlwZXMoKTsKKyAgICAKKyAgICAvLyBHZXQgdGhlIHJlc3VsdCB0cmVlLgorICAgIERhZ0luaXQgKlRyZWUgPSBPcGVyYXRvci0+Z2V0VmFsdWVBc0RhZygiRnJhZ21lbnQiKTsKKyAgICBSZWNvcmQgKk9wID0gMDsKKyAgICBpZiAoVHJlZSAmJiBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KFRyZWUtPmdldE9wZXJhdG9yKCkpKQorICAgICAgT3AgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KFRyZWUtPmdldE9wZXJhdG9yKCkpLT5nZXREZWYoKTsKKyAgICBhc3NlcnQoT3AgJiYgIkludmFsaWQgRnJhZ21lbnQiKTsKKyAgICByZXR1cm4gR2V0TnVtTm9kZVJlc3VsdHMoT3AsIENEUCk7CisgIH0KKyAgCisgIGlmIChPcGVyYXRvci0+aXNTdWJDbGFzc09mKCJJbnN0cnVjdGlvbiIpKSB7CisgICAgQ29kZUdlbkluc3RydWN0aW9uICZJbnN0SW5mbyA9IENEUC5nZXRUYXJnZXRJbmZvKCkuZ2V0SW5zdHJ1Y3Rpb24oT3BlcmF0b3IpOworCisgICAgLy8gRklYTUU6IFNob3VsZCBhbGxvdyBhY2Nlc3MgdG8gYWxsIHRoZSByZXN1bHRzIGhlcmUuCisgICAgdW5zaWduZWQgTnVtRGVmc1RvQWRkID0gSW5zdEluZm8uTnVtRGVmcyA/IDEgOiAwOworICAgIAorICAgIC8vIEFkZCBvbiBvbmUgaW1wbGljaXQgZGVmIGlmIGl0IGhhcyBhIHJlc29sdmFibGUgdHlwZS4KKyAgICBpZiAoSW5zdEluZm8uSGFzT25lSW1wbGljaXREZWZXaXRoS25vd25WVChDRFAuZ2V0VGFyZ2V0SW5mbygpKSAhPU1WVDo6T3RoZXIpCisgICAgICArK051bURlZnNUb0FkZDsKKyAgICByZXR1cm4gTnVtRGVmc1RvQWRkOworICB9CisgIAorICBpZiAoT3BlcmF0b3ItPmlzU3ViQ2xhc3NPZigiU0ROb2RlWEZvcm0iKSkKKyAgICByZXR1cm4gMTsgIC8vIEZJWE1FOiBHZW5lcmFsaXplIFNETm9kZVhGb3JtCisgIAorICBPcGVyYXRvci0+ZHVtcCgpOworICBlcnJzKCkgPDwgIlVuaGFuZGxlZCBub2RlIGluIEdldE51bU5vZGVSZXN1bHRzXG4iOworICBleGl0KDEpOworfQorCit2b2lkIFRyZWVQYXR0ZXJuTm9kZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmIChpc0xlYWYoKSkKKyAgICBPUyA8PCAqZ2V0TGVhZlZhbHVlKCk7CisgIGVsc2UKKyAgICBPUyA8PCAnKCcgPDwgZ2V0T3BlcmF0b3IoKS0+Z2V0TmFtZSgpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUeXBlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE9TIDw8ICc6JyA8PCBnZXRFeHRUeXBlKGkpLmdldE5hbWUoKTsKKworICBpZiAoIWlzTGVhZigpKSB7CisgICAgaWYgKGdldE51bUNoaWxkcmVuKCkgIT0gMCkgeworICAgICAgT1MgPDwgIiAiOworICAgICAgZ2V0Q2hpbGQoMCktPnByaW50KE9TKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBnZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkgeworICAgICAgICBPUyA8PCAiLCAiOworICAgICAgICBnZXRDaGlsZChpKS0+cHJpbnQoT1MpOworICAgICAgfQorICAgIH0KKyAgICBPUyA8PCAiKSI7CisgIH0KKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcmVkaWNhdGVGbnMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBPUyA8PCAiPDxQOiIgPDwgUHJlZGljYXRlRm5zW2ldIDw8ICI+PiI7CisgIGlmIChUcmFuc2Zvcm1GbikKKyAgICBPUyA8PCAiPDxYOiIgPDwgVHJhbnNmb3JtRm4tPmdldE5hbWUoKSA8PCAiPj4iOworICBpZiAoIWdldE5hbWUoKS5lbXB0eSgpKQorICAgIE9TIDw8ICI6JCIgPDwgZ2V0TmFtZSgpOworCit9Cit2b2lkIFRyZWVQYXR0ZXJuTm9kZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZXJycygpKTsKK30KKworLy8vIGlzSXNvbW9ycGhpY1RvIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGlzIHJlY3Vyc2l2ZWx5CisvLy8gaXNvbW9ycGhpYyB0byB0aGUgc3BlY2lmaWVkIG5vZGUuICBGb3IgdGhpcyBjb21wYXJpc29uLCB0aGUgbm9kZSdzCisvLy8gZW50aXJlIHN0YXRlIGlzIGNvbnNpZGVyZWQuIFRoZSBhc3NpZ25lZCBuYW1lIGlzIGlnbm9yZWQsIHNpbmNlCisvLy8gbm9kZXMgd2l0aCBkaWZmZXJpbmcgbmFtZXMgYXJlIGNvbnNpZGVyZWQgaXNvbW9ycGhpYy4gSG93ZXZlciwgaWYKKy8vLyB0aGUgYXNzaWduZWQgbmFtZSBpcyBwcmVzZW50IGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgc2V0LCB0aGVuCisvLy8gdGhlIGFzc2lnbmVkIG5hbWUgaXMgY29uc2lkZXJlZCBzaWduaWZpY2FudCBhbmQgdGhlIG5vZGUgaXMKKy8vLyBpc29tb3JwaGljIGlmIHRoZSBuYW1lcyBtYXRjaC4KK2Jvb2wgVHJlZVBhdHRlcm5Ob2RlOjppc0lzb21vcnBoaWNUbyhjb25zdCBUcmVlUGF0dGVybk5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlwbGVVc2VWYXJTZXQgJkRlcFZhcnMpIGNvbnN0IHsKKyAgaWYgKE4gPT0gdGhpcykgcmV0dXJuIHRydWU7CisgIGlmIChOLT5pc0xlYWYoKSAhPSBpc0xlYWYoKSB8fCBnZXRFeHRUeXBlcygpICE9IE4tPmdldEV4dFR5cGVzKCkgfHwKKyAgICAgIGdldFByZWRpY2F0ZUZucygpICE9IE4tPmdldFByZWRpY2F0ZUZucygpIHx8CisgICAgICBnZXRUcmFuc2Zvcm1GbigpICE9IE4tPmdldFRyYW5zZm9ybUZuKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChpc0xlYWYoKSkgeworICAgIGlmIChEZWZJbml0ICpESSA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oZ2V0TGVhZlZhbHVlKCkpKSB7CisgICAgICBpZiAoRGVmSW5pdCAqTkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihOLT5nZXRMZWFmVmFsdWUoKSkpIHsKKyAgICAgICAgcmV0dXJuICgoREktPmdldERlZigpID09IE5ESS0+Z2V0RGVmKCkpCisgICAgICAgICAgICAgICAgJiYgKERlcFZhcnMuZmluZChnZXROYW1lKCkpID09IERlcFZhcnMuZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgZ2V0TmFtZSgpID09IE4tPmdldE5hbWUoKSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZ2V0TGVhZlZhbHVlKCkgPT0gTi0+Z2V0TGVhZlZhbHVlKCk7CisgIH0KKyAgCisgIGlmIChOLT5nZXRPcGVyYXRvcigpICE9IGdldE9wZXJhdG9yKCkgfHwKKyAgICAgIE4tPmdldE51bUNoaWxkcmVuKCkgIT0gZ2V0TnVtQ2hpbGRyZW4oKSkgcmV0dXJuIGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFnZXRDaGlsZChpKS0+aXNJc29tb3JwaGljVG8oTi0+Z2V0Q2hpbGQoaSksIERlcFZhcnMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIGNsb25lIC0gTWFrZSBhIGNvcHkgb2YgdGhpcyB0cmVlIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLgorLy8vCitUcmVlUGF0dGVybk5vZGUgKlRyZWVQYXR0ZXJuTm9kZTo6Y2xvbmUoKSBjb25zdCB7CisgIFRyZWVQYXR0ZXJuTm9kZSAqTmV3OworICBpZiAoaXNMZWFmKCkpIHsKKyAgICBOZXcgPSBuZXcgVHJlZVBhdHRlcm5Ob2RlKGdldExlYWZWYWx1ZSgpLCBnZXROdW1UeXBlcygpKTsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxUcmVlUGF0dGVybk5vZGUqPiBDQ2hpbGRyZW47CisgICAgQ0NoaWxkcmVuLnJlc2VydmUoQ2hpbGRyZW4uc2l6ZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpCisgICAgICBDQ2hpbGRyZW4ucHVzaF9iYWNrKGdldENoaWxkKGkpLT5jbG9uZSgpKTsKKyAgICBOZXcgPSBuZXcgVHJlZVBhdHRlcm5Ob2RlKGdldE9wZXJhdG9yKCksIENDaGlsZHJlbiwgZ2V0TnVtVHlwZXMoKSk7CisgIH0KKyAgTmV3LT5zZXROYW1lKGdldE5hbWUoKSk7CisgIE5ldy0+VHlwZXMgPSBUeXBlczsKKyAgTmV3LT5zZXRQcmVkaWNhdGVGbnMoZ2V0UHJlZGljYXRlRm5zKCkpOworICBOZXctPnNldFRyYW5zZm9ybUZuKGdldFRyYW5zZm9ybUZuKCkpOworICByZXR1cm4gTmV3OworfQorCisvLy8gUmVtb3ZlQWxsVHlwZXMgLSBSZWN1cnNpdmVseSBzdHJpcCBhbGwgdGhlIHR5cGVzIG9mIHRoaXMgdHJlZS4KK3ZvaWQgVHJlZVBhdHRlcm5Ob2RlOjpSZW1vdmVBbGxUeXBlcygpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFR5cGVzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgVHlwZXNbaV0gPSBFRVZUOjpUeXBlU2V0KCk7ICAvLyBSZXNldCB0byB1bmtub3duIHR5cGUuCisgIGlmIChpc0xlYWYoKSkgcmV0dXJuOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpCisgICAgZ2V0Q2hpbGQoaSktPlJlbW92ZUFsbFR5cGVzKCk7Cit9CisKKworLy8vIFN1YnN0aXR1dGVGb3JtYWxBcmd1bWVudHMgLSBSZXBsYWNlIHRoZSBmb3JtYWwgYXJndW1lbnRzIGluIHRoaXMgdHJlZQorLy8vIHdpdGggYWN0dWFsIHZhbHVlcyBzcGVjaWZpZWQgYnkgQXJnTWFwLgordm9pZCBUcmVlUGF0dGVybk5vZGU6OgorU3Vic3RpdHV0ZUZvcm1hbEFyZ3VtZW50cyhzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVHJlZVBhdHRlcm5Ob2RlKj4gJkFyZ01hcCkgeworICBpZiAoaXNMZWFmKCkpIHJldHVybjsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkgeworICAgIFRyZWVQYXR0ZXJuTm9kZSAqQ2hpbGQgPSBnZXRDaGlsZChpKTsKKyAgICBpZiAoQ2hpbGQtPmlzTGVhZigpKSB7CisgICAgICBJbml0ICpWYWwgPSBDaGlsZC0+Z2V0TGVhZlZhbHVlKCk7CisgICAgICBpZiAoZHluYW1pY19jYXN0PERlZkluaXQqPihWYWwpICYmCisgICAgICAgICAgc3RhdGljX2Nhc3Q8RGVmSW5pdCo+KFZhbCktPmdldERlZigpLT5nZXROYW1lKCkgPT0gIm5vZGUiKSB7CisgICAgICAgIC8vIFdlIGZvdW5kIGEgdXNlIG9mIGEgZm9ybWFsIGFyZ3VtZW50LCByZXBsYWNlIGl0IHdpdGggaXRzIHZhbHVlLgorICAgICAgICBUcmVlUGF0dGVybk5vZGUgKk5ld0NoaWxkID0gQXJnTWFwW0NoaWxkLT5nZXROYW1lKCldOworICAgICAgICBhc3NlcnQoTmV3Q2hpbGQgJiYgIkNvdWxkbid0IGZpbmQgZm9ybWFsIGFyZ3VtZW50ISIpOworICAgICAgICBhc3NlcnQoKENoaWxkLT5nZXRQcmVkaWNhdGVGbnMoKS5lbXB0eSgpIHx8CisgICAgICAgICAgICAgICAgTmV3Q2hpbGQtPmdldFByZWRpY2F0ZUZucygpID09IENoaWxkLT5nZXRQcmVkaWNhdGVGbnMoKSkgJiYKKyAgICAgICAgICAgICAgICJOb24tZW1wdHkgY2hpbGQgcHJlZGljYXRlIGNsb2JiZXJlZCEiKTsKKyAgICAgICAgc2V0Q2hpbGQoaSwgTmV3Q2hpbGQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnZXRDaGlsZChpKS0+U3Vic3RpdHV0ZUZvcm1hbEFyZ3VtZW50cyhBcmdNYXApOworICAgIH0KKyAgfQorfQorCisKKy8vLyBJbmxpbmVQYXR0ZXJuRnJhZ21lbnRzIC0gSWYgdGhpcyBwYXR0ZXJuIHJlZmVycyB0byBhbnkgcGF0dGVybgorLy8vIGZyYWdtZW50cywgaW5saW5lIHRoZW0gaW50byBwbGFjZSwgZ2l2aW5nIHVzIGEgcGF0dGVybiB3aXRob3V0IGFueQorLy8vIFBhdEZyYWcgcmVmZXJlbmNlcy4KK1RyZWVQYXR0ZXJuTm9kZSAqVHJlZVBhdHRlcm5Ob2RlOjpJbmxpbmVQYXR0ZXJuRnJhZ21lbnRzKFRyZWVQYXR0ZXJuICZUUCkgeworICBpZiAoaXNMZWFmKCkpIHJldHVybiB0aGlzOyAgLy8gbm90aGluZyB0byBkby4KKyAgUmVjb3JkICpPcCA9IGdldE9wZXJhdG9yKCk7CisgIAorICBpZiAoIU9wLT5pc1N1YkNsYXNzT2YoIlBhdEZyYWciKSkgeworICAgIC8vIEp1c3QgcmVjdXJzaXZlbHkgaW5saW5lIGNoaWxkcmVuIG5vZGVzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkgeworICAgICAgVHJlZVBhdHRlcm5Ob2RlICpDaGlsZCA9IGdldENoaWxkKGkpOworICAgICAgVHJlZVBhdHRlcm5Ob2RlICpOZXdDaGlsZCA9IENoaWxkLT5JbmxpbmVQYXR0ZXJuRnJhZ21lbnRzKFRQKTsKKworICAgICAgYXNzZXJ0KChDaGlsZC0+Z2V0UHJlZGljYXRlRm5zKCkuZW1wdHkoKSB8fAorICAgICAgICAgICAgICBOZXdDaGlsZC0+Z2V0UHJlZGljYXRlRm5zKCkgPT0gQ2hpbGQtPmdldFByZWRpY2F0ZUZucygpKSAmJgorICAgICAgICAgICAgICJOb24tZW1wdHkgY2hpbGQgcHJlZGljYXRlIGNsb2JiZXJlZCEiKTsKKworICAgICAgc2V0Q2hpbGQoaSwgTmV3Q2hpbGQpOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgd2UgZm91bmQgYSByZWZlcmVuY2UgdG8gYSBmcmFnbWVudC4gIEZpcnN0LCBsb29rIHVwIGl0cworICAvLyBUcmVlUGF0dGVybiByZWNvcmQuCisgIFRyZWVQYXR0ZXJuICpGcmFnID0gVFAuZ2V0REFHUGF0dGVybnMoKS5nZXRQYXR0ZXJuRnJhZ21lbnQoT3ApOworICAKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgYXJlIHBhc3NpbmcgdGhlIHJpZ2h0IG51bWJlciBvZiBvcGVyYW5kcy4KKyAgaWYgKEZyYWctPmdldE51bUFyZ3MoKSAhPSBDaGlsZHJlbi5zaXplKCkpCisgICAgVFAuZXJyb3IoIiciICsgT3AtPmdldE5hbWUoKSArICInIGZyYWdtZW50IHJlcXVpcmVzICIgKworICAgICAgICAgICAgIHV0b3N0cihGcmFnLT5nZXROdW1BcmdzKCkpICsgIiBvcGVyYW5kcyEiKTsKKworICBUcmVlUGF0dGVybk5vZGUgKkZyYWdUcmVlID0gRnJhZy0+Z2V0T25seVRyZWUoKS0+Y2xvbmUoKTsKKworICBzdGQ6OnN0cmluZyBDb2RlID0gT3AtPmdldFZhbHVlQXNDb2RlKCJQcmVkaWNhdGUiKTsKKyAgaWYgKCFDb2RlLmVtcHR5KCkpCisgICAgRnJhZ1RyZWUtPmFkZFByZWRpY2F0ZUZuKCJQcmVkaWNhdGVfIitPcC0+Z2V0TmFtZSgpKTsKKworICAvLyBSZXNvbHZlIGZvcm1hbCBhcmd1bWVudHMgdG8gdGhlaXIgYWN0dWFsIHZhbHVlLgorICBpZiAoRnJhZy0+Z2V0TnVtQXJncygpKSB7CisgICAgLy8gQ29tcHV0ZSB0aGUgbWFwIG9mIGZvcm1hbCB0byBhY3R1YWwgYXJndW1lbnRzLgorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUcmVlUGF0dGVybk5vZGUqPiBBcmdNYXA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZyYWctPmdldE51bUFyZ3MoKTsgaSAhPSBlOyArK2kpCisgICAgICBBcmdNYXBbRnJhZy0+Z2V0QXJnTmFtZShpKV0gPSBnZXRDaGlsZChpKS0+SW5saW5lUGF0dGVybkZyYWdtZW50cyhUUCk7CisgIAorICAgIEZyYWdUcmVlLT5TdWJzdGl0dXRlRm9ybWFsQXJndW1lbnRzKEFyZ01hcCk7CisgIH0KKyAgCisgIEZyYWdUcmVlLT5zZXROYW1lKGdldE5hbWUoKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUeXBlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIEZyYWdUcmVlLT5VcGRhdGVOb2RlVHlwZShpLCBnZXRFeHRUeXBlKGkpLCBUUCk7CisKKyAgLy8gVHJhbnNmZXIgaW4gdGhlIG9sZCBwcmVkaWNhdGVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0UHJlZGljYXRlRm5zKCkuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBGcmFnVHJlZS0+YWRkUHJlZGljYXRlRm4oZ2V0UHJlZGljYXRlRm5zKClbaV0pOworCisgIC8vIEdldCBhIG5ldyBjb3B5IG9mIHRoaXMgZnJhZ21lbnQgdG8gc3RpdGNoIGludG8gaGVyZS4KKyAgLy9kZWxldGUgdGhpczsgICAgLy8gRklYTUU6IGltcGxlbWVudCByZWZjb3VudGluZyEKKyAgCisgIC8vIFRoZSBmcmFnbWVudCB3ZSBpbmxpbmVkIGNvdWxkIGhhdmUgcmVjdXJzaXZlIGlubGluaW5nIHRoYXQgaXMgbmVlZGVkLiAgU2VlCisgIC8vIGlmIHRoZXJlIGFyZSBhbnkgcGF0dGVybiBmcmFnbWVudHMgaW4gaXQgYW5kIGlubGluZSB0aGVtIGFzIG5lZWRlZC4KKyAgcmV0dXJuIEZyYWdUcmVlLT5JbmxpbmVQYXR0ZXJuRnJhZ21lbnRzKFRQKTsKK30KKworLy8vIGdldEltcGxpY2l0VHlwZSAtIENoZWNrIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWVkIHJlY29yZCBoYXMgYW4gaW1wbGljaXQKKy8vLyB0eXBlIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkIHRvIGl0LiAgVGhpcyB3aWxsIGluZmVyIHRoZSB0eXBlIG9mIHJlZ2lzdGVyCisvLy8gcmVmZXJlbmNlcyBmcm9tIHRoZSByZWdpc3RlciBmaWxlIGluZm9ybWF0aW9uLCBmb3IgZXhhbXBsZS4KKy8vLworc3RhdGljIEVFVlQ6OlR5cGVTZXQgZ2V0SW1wbGljaXRUeXBlKFJlY29yZCAqUiwgdW5zaWduZWQgUmVzTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb3RSZWdpc3RlcnMsIFRyZWVQYXR0ZXJuICZUUCkgeworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIHJlZ2lzdGVyIG9yIGEgcmVnaXN0ZXIgY2xhc3MuCisgIGlmIChSLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyQ2xhc3MiKSkgeworICAgIGFzc2VydChSZXNObyA9PSAwICYmICJSZWdjbGFzcyByZWYgb25seSBoYXMgb25lIHJlc3VsdCEiKTsKKyAgICBpZiAoTm90UmVnaXN0ZXJzKSAKKyAgICAgIHJldHVybiBFRVZUOjpUeXBlU2V0KCk7IC8vIFVua25vd24uCisgICAgY29uc3QgQ29kZUdlblRhcmdldCAmVCA9IFRQLmdldERBR1BhdHRlcm5zKCkuZ2V0VGFyZ2V0SW5mbygpOworICAgIHJldHVybiBFRVZUOjpUeXBlU2V0KFQuZ2V0UmVnaXN0ZXJDbGFzcyhSKS5nZXRWYWx1ZVR5cGVzKCkpOworICB9CisgIAorICBpZiAoUi0+aXNTdWJDbGFzc09mKCJQYXRGcmFnIikpIHsKKyAgICBhc3NlcnQoUmVzTm8gPT0gMCAmJiAiRklYTUU6IFBhdEZyYWcgd2l0aCBtdWx0aXBsZSByZXN1bHRzPyIpOworICAgIC8vIFBhdHRlcm4gZnJhZ21lbnQgdHlwZXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZXkgYXJlIGlubGluZWQuCisgICAgcmV0dXJuIEVFVlQ6OlR5cGVTZXQoKTsgLy8gVW5rbm93bi4KKyAgfQorICAKKyAgaWYgKFItPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXIiKSkgeworICAgIGFzc2VydChSZXNObyA9PSAwICYmICJSZWdpc3RlcnMgb25seSBwcm9kdWNlIG9uZSByZXN1bHQhIik7CisgICAgaWYgKE5vdFJlZ2lzdGVycykgCisgICAgICByZXR1cm4gRUVWVDo6VHlwZVNldCgpOyAvLyBVbmtub3duLgorICAgIGNvbnN0IENvZGVHZW5UYXJnZXQgJlQgPSBUUC5nZXREQUdQYXR0ZXJucygpLmdldFRhcmdldEluZm8oKTsKKyAgICByZXR1cm4gRUVWVDo6VHlwZVNldChULmdldFJlZ2lzdGVyVlRzKFIpKTsKKyAgfQorCisgIGlmIChSLT5pc1N1YkNsYXNzT2YoIlN1YlJlZ0luZGV4IikpIHsKKyAgICBhc3NlcnQoUmVzTm8gPT0gMCAmJiAiU3ViUmVnaXN0ZXJJbmRpY2VzIG9ubHkgcHJvZHVjZSBvbmUgcmVzdWx0ISIpOworICAgIHJldHVybiBFRVZUOjpUeXBlU2V0KCk7CisgIH0KKyAgCisgIGlmIChSLT5pc1N1YkNsYXNzT2YoIlZhbHVlVHlwZSIpIHx8IFItPmlzU3ViQ2xhc3NPZigiQ29uZENvZGUiKSkgeworICAgIGFzc2VydChSZXNObyA9PSAwICYmICJUaGlzIG5vZGUgb25seSBoYXMgb25lIHJlc3VsdCEiKTsKKyAgICAvLyBVc2luZyBhIFZUU0ROb2RlIG9yIENvbmRDb2RlU0ROb2RlLgorICAgIHJldHVybiBFRVZUOjpUeXBlU2V0KE1WVDo6T3RoZXIsIFRQKTsKKyAgfQorICAKKyAgaWYgKFItPmlzU3ViQ2xhc3NPZigiQ29tcGxleFBhdHRlcm4iKSkgeworICAgIGFzc2VydChSZXNObyA9PSAwICYmICJGSVhNRTogQ29tcGxleFBhdHRlcm4gd2l0aCBtdWx0aXBsZSByZXN1bHRzPyIpOworICAgIGlmIChOb3RSZWdpc3RlcnMpIAorICAgICAgcmV0dXJuIEVFVlQ6OlR5cGVTZXQoKTsgLy8gVW5rbm93bi4KKyAgIHJldHVybiBFRVZUOjpUeXBlU2V0KFRQLmdldERBR1BhdHRlcm5zKCkuZ2V0Q29tcGxleFBhdHRlcm4oUikuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgVFApOworICB9CisgIGlmIChSLT5pc1N1YkNsYXNzT2YoIlBvaW50ZXJMaWtlUmVnQ2xhc3MiKSkgeworICAgIGFzc2VydChSZXNObyA9PSAwICYmICJSZWdjbGFzcyBjYW4gb25seSBoYXZlIG9uZSByZXN1bHQhIik7CisgICAgcmV0dXJuIEVFVlQ6OlR5cGVTZXQoTVZUOjppUFRSLCBUUCk7CisgIH0KKyAgCisgIGlmIChSLT5nZXROYW1lKCkgPT0gIm5vZGUiIHx8IFItPmdldE5hbWUoKSA9PSAic3JjdmFsdWUiIHx8CisgICAgICBSLT5nZXROYW1lKCkgPT0gInplcm9fcmVnIikgeworICAgIC8vIFBsYWNlaG9sZGVyLgorICAgIHJldHVybiBFRVZUOjpUeXBlU2V0KCk7IC8vIFVua25vd24uCisgIH0KKyAgCisgIFRQLmVycm9yKCJVbmtub3duIG5vZGUgZmxhdm9yIHVzZWQgaW4gcGF0dGVybjogIiArIFItPmdldE5hbWUoKSk7CisgIHJldHVybiBFRVZUOjpUeXBlU2V0KE1WVDo6T3RoZXIsIFRQKTsKK30KKworCisvLy8gZ2V0SW50cmluc2ljSW5mbyAtIElmIHRoaXMgbm9kZSBjb3JyZXNwb25kcyB0byBhbiBpbnRyaW5zaWMsIHJldHVybiB0aGUKKy8vLyBDb2RlR2VuSW50cmluc2ljIGluZm9ybWF0aW9uIGZvciBpdCwgb3RoZXJ3aXNlIHJldHVybiBhIG51bGwgcG9pbnRlci4KK2NvbnN0IENvZGVHZW5JbnRyaW5zaWMgKlRyZWVQYXR0ZXJuTm9kZTo6CitnZXRJbnRyaW5zaWNJbmZvKGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmQ0RQKSBjb25zdCB7CisgIGlmIChnZXRPcGVyYXRvcigpICE9IENEUC5nZXRfaW50cmluc2ljX3ZvaWRfc2Rub2RlKCkgJiYKKyAgICAgIGdldE9wZXJhdG9yKCkgIT0gQ0RQLmdldF9pbnRyaW5zaWNfd19jaGFpbl9zZG5vZGUoKSAmJgorICAgICAgZ2V0T3BlcmF0b3IoKSAhPSBDRFAuZ2V0X2ludHJpbnNpY193b19jaGFpbl9zZG5vZGUoKSkKKyAgICByZXR1cm4gMDsKKyAgICAKKyAgdW5zaWduZWQgSUlEID0gCisgICAgZHluYW1pY19jYXN0PEludEluaXQqPihnZXRDaGlsZCgwKS0+Z2V0TGVhZlZhbHVlKCkpLT5nZXRWYWx1ZSgpOworICByZXR1cm4gJkNEUC5nZXRJbnRyaW5zaWNJbmZvKElJRCk7Cit9CisKKy8vLyBnZXRDb21wbGV4UGF0dGVybkluZm8gLSBJZiB0aGlzIG5vZGUgY29ycmVzcG9uZHMgdG8gYSBDb21wbGV4UGF0dGVybiwKKy8vLyByZXR1cm4gdGhlIENvbXBsZXhQYXR0ZXJuIGluZm9ybWF0aW9uLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCitjb25zdCBDb21wbGV4UGF0dGVybiAqCitUcmVlUGF0dGVybk5vZGU6OmdldENvbXBsZXhQYXR0ZXJuSW5mbyhjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNHUCkgY29uc3QgeworICBpZiAoIWlzTGVhZigpKSByZXR1cm4gMDsKKyAgCisgIERlZkluaXQgKkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihnZXRMZWFmVmFsdWUoKSk7CisgIGlmIChESSAmJiBESS0+Z2V0RGVmKCktPmlzU3ViQ2xhc3NPZigiQ29tcGxleFBhdHRlcm4iKSkKKyAgICByZXR1cm4gJkNHUC5nZXRDb21wbGV4UGF0dGVybihESS0+Z2V0RGVmKCkpOworICByZXR1cm4gMDsKK30KKworLy8vIE5vZGVIYXNQcm9wZXJ0eSAtIFJldHVybiB0cnVlIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KK2Jvb2wgVHJlZVBhdHRlcm5Ob2RlOjpOb2RlSGFzUHJvcGVydHkoU0ROUCBQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZDR1ApIGNvbnN0IHsKKyAgaWYgKGlzTGVhZigpKSB7CisgICAgaWYgKGNvbnN0IENvbXBsZXhQYXR0ZXJuICpDUCA9IGdldENvbXBsZXhQYXR0ZXJuSW5mbyhDR1ApKQorICAgICAgcmV0dXJuIENQLT5oYXNQcm9wZXJ0eShQcm9wZXJ0eSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICBSZWNvcmQgKk9wZXJhdG9yID0gZ2V0T3BlcmF0b3IoKTsKKyAgaWYgKCFPcGVyYXRvci0+aXNTdWJDbGFzc09mKCJTRE5vZGUiKSkgcmV0dXJuIGZhbHNlOworICAKKyAgcmV0dXJuIENHUC5nZXRTRE5vZGVJbmZvKE9wZXJhdG9yKS5oYXNQcm9wZXJ0eShQcm9wZXJ0eSk7Cit9CisKKworCisKKy8vLyBUcmVlSGFzUHJvcGVydHkgLSBSZXR1cm4gdHJ1ZSBpZiBhbnkgbm9kZSBpbiB0aGlzIHRyZWUgaGFzIHRoZSBzcGVjaWZpZWQKKy8vLyBwcm9wZXJ0eS4KK2Jvb2wgVHJlZVBhdHRlcm5Ob2RlOjpUcmVlSGFzUHJvcGVydHkoU0ROUCBQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZDR1ApIGNvbnN0IHsKKyAgaWYgKE5vZGVIYXNQcm9wZXJ0eShQcm9wZXJ0eSwgQ0dQKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChnZXRDaGlsZChpKS0+VHJlZUhhc1Byb3BlcnR5KFByb3BlcnR5LCBDR1ApKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30gIAorCisvLy8gaXNDb21tdXRhdGl2ZUludHJpbnNpYyAtIFJldHVybiB0cnVlIGlmIHRoZSBub2RlIGNvcnJlc3BvbmRzIHRvIGEKKy8vLyBjb21tdXRhdGl2ZSBpbnRyaW5zaWMuCitib29sCitUcmVlUGF0dGVybk5vZGU6OmlzQ29tbXV0YXRpdmVJbnRyaW5zaWMoY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZDRFApIGNvbnN0IHsKKyAgaWYgKGNvbnN0IENvZGVHZW5JbnRyaW5zaWMgKkludCA9IGdldEludHJpbnNpY0luZm8oQ0RQKSkKKyAgICByZXR1cm4gSW50LT5pc0NvbW11dGF0aXZlOworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIEFwcGx5VHlwZUNvbnN0cmFpbnRzIC0gQXBwbHkgYWxsIG9mIHRoZSB0eXBlIGNvbnN0cmFpbnRzIHJlbGV2YW50IHRvCisvLy8gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4gaW4gdGhlIHRyZWUuICBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBtYWtlcyBhCisvLy8gY2hhbmdlLCBmYWxzZSBvdGhlcndpc2UuICBJZiBhIHR5cGUgY29udHJhZGljdGlvbiBpcyBmb3VuZCwgdGhyb3cgYW4KKy8vLyBleGNlcHRpb24uCitib29sIFRyZWVQYXR0ZXJuTm9kZTo6QXBwbHlUeXBlQ29uc3RyYWludHMoVHJlZVBhdHRlcm4gJlRQLCBib29sIE5vdFJlZ2lzdGVycykgeworICBDb2RlR2VuREFHUGF0dGVybnMgJkNEUCA9IFRQLmdldERBR1BhdHRlcm5zKCk7CisgIGlmIChpc0xlYWYoKSkgeworICAgIGlmIChEZWZJbml0ICpESSA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oZ2V0TGVhZlZhbHVlKCkpKSB7CisgICAgICAvLyBJZiBpdCdzIGEgcmVnY2xhc3Mgb3Igc29tZXRoaW5nIGVsc2Uga25vd24sIGluY2x1ZGUgdGhlIHR5cGUuCisgICAgICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUeXBlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBNYWRlQ2hhbmdlIHw9IFVwZGF0ZU5vZGVUeXBlKGksIGdldEltcGxpY2l0VHlwZShESS0+Z2V0RGVmKCksIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdFJlZ2lzdGVycywgVFApLCBUUCk7CisgICAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgICB9CisgICAgCisgICAgaWYgKEludEluaXQgKklJID0gZHluYW1pY19jYXN0PEludEluaXQqPihnZXRMZWFmVmFsdWUoKSkpIHsKKyAgICAgIGFzc2VydChUeXBlcy5zaXplKCkgPT0gMSAmJiAiSW52YWxpZCBJbnRJbml0Iik7CisgICAgICAKKyAgICAgIC8vIEludCBpbml0cyBhcmUgYWx3YXlzIGludGVnZXJzLiA6KQorICAgICAgYm9vbCBNYWRlQ2hhbmdlID0gVHlwZXNbMF0uRW5mb3JjZUludGVnZXIoVFApOworICAgICAgCisgICAgICBpZiAoIVR5cGVzWzBdLmlzQ29uY3JldGUoKSkKKyAgICAgICAgcmV0dXJuIE1hZGVDaGFuZ2U7CisgICAgICAKKyAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUID0gZ2V0VHlwZSgwKTsKKyAgICAgIGlmIChWVCA9PSBNVlQ6OmlQVFIgfHwgVlQgPT0gTVZUOjppUFRSQW55KQorICAgICAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgICAgIAorICAgICAgdW5zaWduZWQgU2l6ZSA9IEVWVChWVCkuZ2V0U2l6ZUluQml0cygpOworICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlIGlzIHJlcHJlc2VudGFibGUgZm9yIHRoaXMgdHlwZS4KKyAgICAgIGlmIChTaXplID49IDMyKSByZXR1cm4gTWFkZUNoYW5nZTsKKyAgICAgIAorICAgICAgaW50IFZhbCA9IChJSS0+Z2V0VmFsdWUoKSA8PCAoMzItU2l6ZSkpID4+ICgzMi1TaXplKTsKKyAgICAgIGlmIChWYWwgPT0gSUktPmdldFZhbHVlKCkpIHJldHVybiBNYWRlQ2hhbmdlOworICAgICAgCisgICAgICAvLyBJZiBzaWduLWV4dGVuZGVkIGRvZXNuJ3QgZml0LCBkb2VzIGl0IGZpdCBhcyB1bnNpZ25lZD8KKyAgICAgIHVuc2lnbmVkIFZhbHVlTWFzazsKKyAgICAgIHVuc2lnbmVkIFVuc2lnbmVkVmFsOworICAgICAgVmFsdWVNYXNrID0gdW5zaWduZWQofnVpbnQzMl90KDBVTCkgPj4gKDMyLVNpemUpKTsKKyAgICAgIFVuc2lnbmVkVmFsID0gdW5zaWduZWQoSUktPmdldFZhbHVlKCkpOworCisgICAgICBpZiAoKFZhbHVlTWFzayAmIFVuc2lnbmVkVmFsKSA9PSBVbnNpZ25lZFZhbCkKKyAgICAgICAgcmV0dXJuIE1hZGVDaGFuZ2U7CisgICAgICAKKyAgICAgIFRQLmVycm9yKCJJbnRlZ2VyIHZhbHVlICciICsgaXRvc3RyKElJLT5nZXRWYWx1ZSgpKSsKKyAgICAgICAgICAgICAgICInIGlzIG91dCBvZiByYW5nZSBmb3IgdHlwZSAnIiArIGdldEVudW1OYW1lKGdldFR5cGUoMCkpICsgIichIik7CisgICAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBzZXQsIHdoaWNoIGlzbid0IHJlYWxseSBhbiBTRE5vZGUuCisgIGlmIChnZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgPT0gInNldCIpIHsKKyAgICBhc3NlcnQoZ2V0TnVtVHlwZXMoKSA9PSAwICYmICJTZXQgZG9lc24ndCBwcm9kdWNlIGEgdmFsdWUiKTsKKyAgICBhc3NlcnQoZ2V0TnVtQ2hpbGRyZW4oKSA+PSAyICYmICJNaXNzaW5nIFJIUyBvZiBhIHNldD8iKTsKKyAgICB1bnNpZ25lZCBOQyA9IGdldE51bUNoaWxkcmVuKCk7CisgICAgCisgICAgVHJlZVBhdHRlcm5Ob2RlICpTZXRWYWwgPSBnZXRDaGlsZChOQy0xKTsKKyAgICBib29sIE1hZGVDaGFuZ2UgPSBTZXRWYWwtPkFwcGx5VHlwZUNvbnN0cmFpbnRzKFRQLCBOb3RSZWdpc3RlcnMpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE5DLTE7ICsraSkgeworICAgICAgVHJlZVBhdHRlcm5Ob2RlICpDaGlsZCA9IGdldENoaWxkKGkpOworICAgICAgTWFkZUNoYW5nZSB8PSBDaGlsZC0+QXBwbHlUeXBlQ29uc3RyYWludHMoVFAsIE5vdFJlZ2lzdGVycyk7CisgICAgCisgICAgICAvLyBUeXBlcyBvZiBvcGVyYW5kcyBtdXN0IG1hdGNoLgorICAgICAgTWFkZUNoYW5nZSB8PSBDaGlsZC0+VXBkYXRlTm9kZVR5cGUoMCwgU2V0VmFsLT5nZXRFeHRUeXBlKGkpLCBUUCk7CisgICAgICBNYWRlQ2hhbmdlIHw9IFNldFZhbC0+VXBkYXRlTm9kZVR5cGUoaSwgQ2hpbGQtPmdldEV4dFR5cGUoMCksIFRQKTsKKyAgICB9CisgICAgcmV0dXJuIE1hZGVDaGFuZ2U7CisgIH0KKyAgCisgIGlmIChnZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgPT0gImltcGxpY2l0IikgeworICAgIGFzc2VydChnZXROdW1UeXBlcygpID09IDAgJiYgIk5vZGUgZG9lc24ndCBwcm9kdWNlIGEgdmFsdWUiKTsKKworICAgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBnZXROdW1DaGlsZHJlbigpOyArK2kpCisgICAgICBNYWRlQ2hhbmdlID0gZ2V0Q2hpbGQoaSktPkFwcGx5VHlwZUNvbnN0cmFpbnRzKFRQLCBOb3RSZWdpc3RlcnMpOworICAgIHJldHVybiBNYWRlQ2hhbmdlOworICB9CisgIAorICBpZiAoZ2V0T3BlcmF0b3IoKS0+Z2V0TmFtZSgpID09ICJDT1BZX1RPX1JFR0NMQVNTIikgeworICAgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICAgIE1hZGVDaGFuZ2UgfD0gZ2V0Q2hpbGQoMCktPkFwcGx5VHlwZUNvbnN0cmFpbnRzKFRQLCBOb3RSZWdpc3RlcnMpOworICAgIE1hZGVDaGFuZ2UgfD0gZ2V0Q2hpbGQoMSktPkFwcGx5VHlwZUNvbnN0cmFpbnRzKFRQLCBOb3RSZWdpc3RlcnMpOworICAgIAorICAgIGFzc2VydChnZXRDaGlsZCgwKS0+Z2V0TnVtVHlwZXMoKSA9PSAxICYmCisgICAgICAgICAgIGdldENoaWxkKDEpLT5nZXROdW1UeXBlcygpID09IDEgJiYgIlVuaGFuZGxlZCBjYXNlIik7CisgICAgCisgICAgLy8gY2hpbGQgIzEgb2YgQ09QWV9UT19SRUdDTEFTUyBzaG91bGQgYmUgYSByZWdpc3RlciBjbGFzcy4gIFdlIGRvbid0IGNhcmUKKyAgICAvLyB3aGF0IHR5cGUgaXQgZ2V0cywgc28gaWYgaXQgZGlkbid0IGdldCBhIGNvbmNyZXRlIHR5cGUganVzdCBnaXZlIGl0IHRoZQorICAgIC8vIGZpcnN0IHZpYWJsZSB0eXBlIGZyb20gdGhlIHJlZyBjbGFzcy4KKyAgICBpZiAoIWdldENoaWxkKDEpLT5oYXNUeXBlU2V0KDApICYmCisgICAgICAgICFnZXRDaGlsZCgxKS0+Z2V0RXh0VHlwZSgwKS5pc0NvbXBsZXRlbHlVbmtub3duKCkpIHsKKyAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFJDVlQgPSBnZXRDaGlsZCgxKS0+Z2V0RXh0VHlwZSgwKS5nZXRUeXBlTGlzdCgpWzBdOworICAgICAgTWFkZUNoYW5nZSB8PSBnZXRDaGlsZCgxKS0+VXBkYXRlTm9kZVR5cGUoMCwgUkNWVCwgVFApOworICAgIH0KKyAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgfQorICAKKyAgaWYgKGNvbnN0IENvZGVHZW5JbnRyaW5zaWMgKkludCA9IGdldEludHJpbnNpY0luZm8oQ0RQKSkgeworICAgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworCisgICAgLy8gQXBwbHkgdGhlIHJlc3VsdCB0eXBlIHRvIHRoZSBub2RlLgorICAgIHVuc2lnbmVkIE51bVJldFZUcyA9IEludC0+SVMuUmV0VlRzLnNpemUoKTsKKyAgICB1bnNpZ25lZCBOdW1QYXJhbVZUcyA9IEludC0+SVMuUGFyYW1WVHMuc2l6ZSgpOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1SZXRWVHM7IGkgIT0gZTsgKytpKQorICAgICAgTWFkZUNoYW5nZSB8PSBVcGRhdGVOb2RlVHlwZShpLCBJbnQtPklTLlJldFZUc1tpXSwgVFApOworCisgICAgaWYgKGdldE51bUNoaWxkcmVuKCkgIT0gTnVtUGFyYW1WVHMgKyAxKQorICAgICAgVFAuZXJyb3IoIkludHJpbnNpYyAnIiArIEludC0+TmFtZSArICInIGV4cGVjdHMgIiArCisgICAgICAgICAgICAgICB1dG9zdHIoTnVtUGFyYW1WVHMpICsgIiBvcGVyYW5kcywgbm90ICIgKworICAgICAgICAgICAgICAgdXRvc3RyKGdldE51bUNoaWxkcmVuKCkgLSAxKSArICIgb3BlcmFuZHMhIik7CisKKyAgICAvLyBBcHBseSB0eXBlIGluZm8gdG8gdGhlIGludHJpbnNpYyBJRC4KKyAgICBNYWRlQ2hhbmdlIHw9IGdldENoaWxkKDApLT5VcGRhdGVOb2RlVHlwZSgwLCBNVlQ6OmlQVFIsIFRQKTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtQ2hpbGRyZW4oKS0xOyBpICE9IGU7ICsraSkgeworICAgICAgTWFkZUNoYW5nZSB8PSBnZXRDaGlsZChpKzEpLT5BcHBseVR5cGVDb25zdHJhaW50cyhUUCwgTm90UmVnaXN0ZXJzKTsKKyAgICAgIAorICAgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgT3BWVCA9IEludC0+SVMuUGFyYW1WVHNbaV07CisgICAgICBhc3NlcnQoZ2V0Q2hpbGQoaSsxKS0+Z2V0TnVtVHlwZXMoKSA9PSAxICYmICJVbmhhbmRsZWQgY2FzZSIpOworICAgICAgTWFkZUNoYW5nZSB8PSBnZXRDaGlsZChpKzEpLT5VcGRhdGVOb2RlVHlwZSgwLCBPcFZULCBUUCk7CisgICAgfQorICAgIHJldHVybiBNYWRlQ2hhbmdlOworICB9CisgIAorICBpZiAoZ2V0T3BlcmF0b3IoKS0+aXNTdWJDbGFzc09mKCJTRE5vZGUiKSkgeworICAgIGNvbnN0IFNETm9kZUluZm8gJk5JID0gQ0RQLmdldFNETm9kZUluZm8oZ2V0T3BlcmF0b3IoKSk7CisgICAgCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIGlzIHNhbmUuICBOZWdhdGl2ZSBvcGVyYW5kcyAtPiB2YXJhcmdzLgorICAgIGlmIChOSS5nZXROdW1PcGVyYW5kcygpID49IDAgJiYKKyAgICAgICAgZ2V0TnVtQ2hpbGRyZW4oKSAhPSAodW5zaWduZWQpTkkuZ2V0TnVtT3BlcmFuZHMoKSkKKyAgICAgIFRQLmVycm9yKGdldE9wZXJhdG9yKCktPmdldE5hbWUoKSArICIgbm9kZSByZXF1aXJlcyBleGFjdGx5ICIgKworICAgICAgICAgICAgICAgaXRvc3RyKE5JLmdldE51bU9wZXJhbmRzKCkpICsgIiBvcGVyYW5kcyEiKTsKKyAgICAKKyAgICBib29sIE1hZGVDaGFuZ2UgPSBOSS5BcHBseVR5cGVDb25zdHJhaW50cyh0aGlzLCBUUCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKQorICAgICAgTWFkZUNoYW5nZSB8PSBnZXRDaGlsZChpKS0+QXBwbHlUeXBlQ29uc3RyYWludHMoVFAsIE5vdFJlZ2lzdGVycyk7CisgICAgcmV0dXJuIE1hZGVDaGFuZ2U7CisgIH0KKyAgCisgIGlmIChnZXRPcGVyYXRvcigpLT5pc1N1YkNsYXNzT2YoIkluc3RydWN0aW9uIikpIHsKKyAgICBjb25zdCBEQUdJbnN0cnVjdGlvbiAmSW5zdCA9IENEUC5nZXRJbnN0cnVjdGlvbihnZXRPcGVyYXRvcigpKTsKKyAgICBDb2RlR2VuSW5zdHJ1Y3Rpb24gJkluc3RJbmZvID0KKyAgICAgIENEUC5nZXRUYXJnZXRJbmZvKCkuZ2V0SW5zdHJ1Y3Rpb24oZ2V0T3BlcmF0b3IoKSk7CisgICAgCisgICAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CisKKyAgICAvLyBBcHBseSB0aGUgcmVzdWx0IHR5cGVzIHRvIHRoZSBub2RlLCB0aGVzZSBjb21lIGZyb20gdGhlIHRoaW5ncyBpbiB0aGUKKyAgICAvLyAob3V0cykgbGlzdCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgLy8gRklYTUU6IENhcCBhdCBvbmUgcmVzdWx0IHNvIGZhci4KKyAgICB1bnNpZ25lZCBOdW1SZXN1bHRzVG9BZGQgPSBJbnN0SW5mby5OdW1EZWZzID8gMSA6IDA7CisgICAgZm9yICh1bnNpZ25lZCBSZXNObyA9IDA7IFJlc05vICE9IE51bVJlc3VsdHNUb0FkZDsgKytSZXNObykgeworICAgICAgUmVjb3JkICpSZXN1bHROb2RlID0gSW5zdC5nZXRSZXN1bHQoUmVzTm8pOworICAgICAgCisgICAgICBpZiAoUmVzdWx0Tm9kZS0+aXNTdWJDbGFzc09mKCJQb2ludGVyTGlrZVJlZ0NsYXNzIikpIHsKKyAgICAgICAgTWFkZUNoYW5nZSB8PSBVcGRhdGVOb2RlVHlwZShSZXNObywgTVZUOjppUFRSLCBUUCk7CisgICAgICB9IGVsc2UgaWYgKFJlc3VsdE5vZGUtPmdldE5hbWUoKSA9PSAidW5rbm93biIpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkby4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChSZXN1bHROb2RlLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyQ2xhc3MiKSAmJgorICAgICAgICAgICAgICAgIk9wZXJhbmRzIHNob3VsZCBiZSByZWdpc3RlciBjbGFzc2VzISIpOworICAgICAgICBjb25zdCBDb2RlR2VuUmVnaXN0ZXJDbGFzcyAmUkMgPSAKKyAgICAgICAgICBDRFAuZ2V0VGFyZ2V0SW5mbygpLmdldFJlZ2lzdGVyQ2xhc3MoUmVzdWx0Tm9kZSk7CisgICAgICAgIE1hZGVDaGFuZ2UgfD0gVXBkYXRlTm9kZVR5cGUoUmVzTm8sIFJDLmdldFZhbHVlVHlwZXMoKSwgVFApOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGltcGxpY2l0IGRlZnMsIHdlIGFwcGx5IHRoZSBmaXJzdCBvbmUgYXMgYSByZXN1bHQuCisgICAgLy8gRklYTUU6IFRoaXMgc3Vja3MsIGl0IHNob3VsZCBhcHBseSBhbGwgaW1wbGljaXQgZGVmcy4KKyAgICBpZiAoIUluc3RJbmZvLkltcGxpY2l0RGVmcy5lbXB0eSgpKSB7CisgICAgICB1bnNpZ25lZCBSZXNObyA9IE51bVJlc3VsdHNUb0FkZDsKKyAgICAgIAorICAgICAgLy8gRklYTUU6IEdlbmVyYWxpemUgdG8gbXVsdGlwbGUgcG9zc2libGUgdHlwZXMgYW5kIG11bHRpcGxlIHBvc3NpYmxlCisgICAgICAvLyBJbXBsaWNpdERlZnMuCisgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCA9CisgICAgICAgIEluc3RJbmZvLkhhc09uZUltcGxpY2l0RGVmV2l0aEtub3duVlQoQ0RQLmdldFRhcmdldEluZm8oKSk7CisgICAgICAKKyAgICAgIGlmIChWVCAhPSBNVlQ6Ok90aGVyKQorICAgICAgICBNYWRlQ2hhbmdlIHw9IFVwZGF0ZU5vZGVUeXBlKFJlc05vLCBWVCwgVFApOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGFuIElOU0VSVF9TVUJSRUcsIGNvbnN0cmFpbiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBWVHMgdG8KKyAgICAvLyBiZSB0aGUgc2FtZS4KKyAgICBpZiAoZ2V0T3BlcmF0b3IoKS0+Z2V0TmFtZSgpID09ICJJTlNFUlRfU1VCUkVHIikgeworICAgICAgYXNzZXJ0KGdldENoaWxkKDApLT5nZXROdW1UeXBlcygpID09IDEgJiYgIkZJWE1FOiBVbmhhbmRsZWQiKTsKKyAgICAgIE1hZGVDaGFuZ2UgfD0gVXBkYXRlTm9kZVR5cGUoMCwgZ2V0Q2hpbGQoMCktPmdldEV4dFR5cGUoMCksIFRQKTsKKyAgICAgIE1hZGVDaGFuZ2UgfD0gZ2V0Q2hpbGQoMCktPlVwZGF0ZU5vZGVUeXBlKDAsIGdldEV4dFR5cGUoMCksIFRQKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBDaGlsZE5vID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5zdC5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgUmVjb3JkICpPcGVyYW5kTm9kZSA9IEluc3QuZ2V0T3BlcmFuZChpKTsKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGV4cGVjdHMgYSBwcmVkaWNhdGUgb3Igb3B0aW9uYWwgZGVmIG9wZXJhbmQsIHdlCisgICAgICAvLyBjb2RlZ2VuIHRoaXMgYnkgc2V0dGluZyB0aGUgb3BlcmFuZCB0byBpdCdzIGRlZmF1bHQgdmFsdWUgaWYgaXQgaGFzIGEKKyAgICAgIC8vIG5vbi1lbXB0eSBEZWZhdWx0T3BzIGZpZWxkLgorICAgICAgaWYgKChPcGVyYW5kTm9kZS0+aXNTdWJDbGFzc09mKCJQcmVkaWNhdGVPcGVyYW5kIikgfHwKKyAgICAgICAgICAgT3BlcmFuZE5vZGUtPmlzU3ViQ2xhc3NPZigiT3B0aW9uYWxEZWZPcGVyYW5kIikpICYmCisgICAgICAgICAgIUNEUC5nZXREZWZhdWx0T3BlcmFuZChPcGVyYW5kTm9kZSkuRGVmYXVsdE9wcy5lbXB0eSgpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgICAKKyAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGRpZG4ndCBydW4gb3V0IG9mIHByb3ZpZGVkIG9wZXJhbmRzLgorICAgICAgaWYgKENoaWxkTm8gPj0gZ2V0TnVtQ2hpbGRyZW4oKSkKKyAgICAgICAgVFAuZXJyb3IoIkluc3RydWN0aW9uICciICsgZ2V0T3BlcmF0b3IoKS0+Z2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgIicgZXhwZWN0cyBtb3JlIG9wZXJhbmRzIHRoYW4gd2VyZSBwcm92aWRlZC4iKTsKKyAgICAgIAorICAgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQ7CisgICAgICBUcmVlUGF0dGVybk5vZGUgKkNoaWxkID0gZ2V0Q2hpbGQoQ2hpbGRObysrKTsKKyAgICAgIHVuc2lnbmVkIENoaWxkUmVzTm8gPSAwOyAgLy8gSW5zdHJ1Y3Rpb25zIGFsd2F5cyB1c2UgcmVzICMwIG9mIHRoZWlyIG9wLgorICAgICAgCisgICAgICBpZiAoT3BlcmFuZE5vZGUtPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXJDbGFzcyIpKSB7CisgICAgICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICZSQyA9IAorICAgICAgICAgIENEUC5nZXRUYXJnZXRJbmZvKCkuZ2V0UmVnaXN0ZXJDbGFzcyhPcGVyYW5kTm9kZSk7CisgICAgICAgIE1hZGVDaGFuZ2UgfD0gQ2hpbGQtPlVwZGF0ZU5vZGVUeXBlKENoaWxkUmVzTm8sIFJDLmdldFZhbHVlVHlwZXMoKSwgVFApOworICAgICAgfSBlbHNlIGlmIChPcGVyYW5kTm9kZS0+aXNTdWJDbGFzc09mKCJPcGVyYW5kIikpIHsKKyAgICAgICAgVlQgPSBnZXRWYWx1ZVR5cGUoT3BlcmFuZE5vZGUtPmdldFZhbHVlQXNEZWYoIlR5cGUiKSk7CisgICAgICAgIE1hZGVDaGFuZ2UgfD0gQ2hpbGQtPlVwZGF0ZU5vZGVUeXBlKENoaWxkUmVzTm8sIFZULCBUUCk7CisgICAgICB9IGVsc2UgaWYgKE9wZXJhbmROb2RlLT5pc1N1YkNsYXNzT2YoIlBvaW50ZXJMaWtlUmVnQ2xhc3MiKSkgeworICAgICAgICBNYWRlQ2hhbmdlIHw9IENoaWxkLT5VcGRhdGVOb2RlVHlwZShDaGlsZFJlc05vLCBNVlQ6OmlQVFIsIFRQKTsKKyAgICAgIH0gZWxzZSBpZiAoT3BlcmFuZE5vZGUtPmdldE5hbWUoKSA9PSAidW5rbm93biIpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkby4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydCgwICYmICJVbmtub3duIG9wZXJhbmQgdHlwZSEiKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICAgIH0KKyAgICAgIE1hZGVDaGFuZ2UgfD0gQ2hpbGQtPkFwcGx5VHlwZUNvbnN0cmFpbnRzKFRQLCBOb3RSZWdpc3RlcnMpOworICAgIH0KKworICAgIGlmIChDaGlsZE5vICE9IGdldE51bUNoaWxkcmVuKCkpCisgICAgICBUUC5lcnJvcigiSW5zdHJ1Y3Rpb24gJyIgKyBnZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgIicgd2FzIHByb3ZpZGVkIHRvbyBtYW55IG9wZXJhbmRzISIpOworICAgIAorICAgIHJldHVybiBNYWRlQ2hhbmdlOworICB9CisgIAorICBhc3NlcnQoZ2V0T3BlcmF0b3IoKS0+aXNTdWJDbGFzc09mKCJTRE5vZGVYRm9ybSIpICYmICJVbmtub3duIG5vZGUgdHlwZSEiKTsKKyAgCisgIC8vIE5vZGUgdHJhbnNmb3JtcyBhbHdheXMgdGFrZSBvbmUgb3BlcmFuZC4KKyAgaWYgKGdldE51bUNoaWxkcmVuKCkgIT0gMSkKKyAgICBUUC5lcnJvcigiTm9kZSB0cmFuc2Zvcm0gJyIgKyBnZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgKworICAgICAgICAgICAgICInIHJlcXVpcmVzIG9uZSBvcGVyYW5kISIpOworCisgIGJvb2wgTWFkZUNoYW5nZSA9IGdldENoaWxkKDApLT5BcHBseVR5cGVDb25zdHJhaW50cyhUUCwgTm90UmVnaXN0ZXJzKTsKKworICAKKyAgLy8gSWYgZWl0aGVyIHRoZSBvdXRwdXQgb3IgaW5wdXQgb2YgdGhlIHhmb3JtIGRvZXMgbm90IGhhdmUgZXhhY3QKKyAgLy8gdHlwZSBpbmZvLiBXZSBhc3N1bWUgdGhleSBtdXN0IGJlIHRoZSBzYW1lLiBPdGhlcndpc2UsIGl0IGlzIHBlcmZlY3RseQorICAvLyBsZWdhbCB0byB0cmFuc2Zvcm0gZnJvbSBvbmUgdHlwZSB0byBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHR5cGUuCisjaWYgMAorICBpZiAoIWhhc1R5cGVTZXQoKSB8fCAhZ2V0Q2hpbGQoMCktPmhhc1R5cGVTZXQoKSkgeworICAgIGJvb2wgTWFkZUNoYW5nZSA9IFVwZGF0ZU5vZGVUeXBlKGdldENoaWxkKDApLT5nZXRFeHRUeXBlKCksIFRQKTsKKyAgICBNYWRlQ2hhbmdlIHw9IGdldENoaWxkKDApLT5VcGRhdGVOb2RlVHlwZShnZXRFeHRUeXBlKCksIFRQKTsKKyAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisvLy8gT25seU9uUkhTT2ZDb21tdXRhdGl2ZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgdmFsdWUgaXMgb25seSBhbGxvd2VkIG9uIHRoZQorLy8vIFJIUyBvZiBhIGNvbW11dGF0aXZlIG9wZXJhdGlvbiwgbm90IHRoZSBvbiBMSFMuCitzdGF0aWMgYm9vbCBPbmx5T25SSFNPZkNvbW11dGF0aXZlKFRyZWVQYXR0ZXJuTm9kZSAqTikgeworICBpZiAoIU4tPmlzTGVhZigpICYmIE4tPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKSA9PSAiaW1tIikKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKE4tPmlzTGVhZigpICYmIGR5bmFtaWNfY2FzdDxJbnRJbml0Kj4oTi0+Z2V0TGVhZlZhbHVlKCkpKQorICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIGNhblBhdHRlcm5NYXRjaCAtIElmIGl0IGlzIGltcG9zc2libGUgZm9yIHRoaXMgcGF0dGVybiB0byBtYXRjaCBvbiB0aGlzCisvLy8gdGFyZ2V0LCBmaWxsIGluIFJlYXNvbiBhbmQgcmV0dXJuIGZhbHNlLiAgT3RoZXJ3aXNlLCByZXR1cm4gdHJ1ZS4gIFRoaXMgaXMKKy8vLyB1c2VkIGFzIGEgc2FuaXR5IGNoZWNrIGZvciAudGQgZmlsZXMgKHRvIHByZXZlbnQgcGVvcGxlIGZyb20gd3JpdGluZyBzdHVmZgorLy8vIHRoYXQgY2FuIG5ldmVyIHBvc3NpYmx5IHdvcmspLCBhbmQgdG8gcHJldmVudCB0aGUgcGF0dGVybiBwZXJtdXRlciBmcm9tCisvLy8gZ2VuZXJhdGluZyBzdHVmZiB0aGF0IGlzIHVzZWxlc3MuCitib29sIFRyZWVQYXR0ZXJuTm9kZTo6Y2FuUGF0dGVybk1hdGNoKHN0ZDo6c3RyaW5nICZSZWFzb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNEUCkgeworICBpZiAoaXNMZWFmKCkpIHJldHVybiB0cnVlOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoIWdldENoaWxkKGkpLT5jYW5QYXR0ZXJuTWF0Y2goUmVhc29uLCBDRFApKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHRoaXMgaXMgYW4gaW50cmluc2ljLCBoYW5kbGUgY2FzZXMgdGhhdCB3b3VsZCBtYWtlIGl0IG5vdCBtYXRjaC4gIEZvcgorICAvLyBleGFtcGxlLCBpZiBhbiBvcGVyYW5kIGlzIHJlcXVpcmVkIHRvIGJlIGFuIGltbWVkaWF0ZS4KKyAgaWYgKGdldE9wZXJhdG9yKCktPmlzU3ViQ2xhc3NPZigiSW50cmluc2ljIikpIHsKKyAgICAvLyBUT0RPOgorICAgIHJldHVybiB0cnVlOworICB9CisgIAorICAvLyBJZiB0aGlzIG5vZGUgaXMgYSBjb21tdXRhdGl2ZSBvcGVyYXRvciwgY2hlY2sgdGhhdCB0aGUgTEhTIGlzbid0IGFuCisgIC8vIGltbWVkaWF0ZS4KKyAgY29uc3QgU0ROb2RlSW5mbyAmTm9kZUluZm8gPSBDRFAuZ2V0U0ROb2RlSW5mbyhnZXRPcGVyYXRvcigpKTsKKyAgYm9vbCBpc0NvbW1JbnRyaW5zaWMgPSBpc0NvbW11dGF0aXZlSW50cmluc2ljKENEUCk7CisgIGlmIChOb2RlSW5mby5oYXNQcm9wZXJ0eShTRE5QQ29tbXV0YXRpdmUpIHx8IGlzQ29tbUludHJpbnNpYykgeworICAgIC8vIFNjYW4gYWxsIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgbm9kZSBhbmQgbWFrZSBzdXJlIHRoYXQgb25seSB0aGUgbGFzdCBvbmUKKyAgICAvLyBpcyBhIGNvbnN0YW50IG5vZGUsIHVubGVzcyB0aGUgUkhTIGFsc28gaXMuCisgICAgaWYgKCFPbmx5T25SSFNPZkNvbW11dGF0aXZlKGdldENoaWxkKGdldE51bUNoaWxkcmVuKCktMSkpKSB7CisgICAgICBib29sIFNraXAgPSBpc0NvbW1JbnRyaW5zaWMgPyAxIDogMDsgLy8gRmlyc3Qgb3BlcmFuZCBpcyBpbnRyaW5zaWMgaWQuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBTa2lwLCBlID0gZ2V0TnVtQ2hpbGRyZW4oKS0xOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKE9ubHlPblJIU09mQ29tbXV0YXRpdmUoZ2V0Q2hpbGQoaSkpKSB7CisgICAgICAgICAgUmVhc29uPSJJbW1lZGlhdGUgdmFsdWUgbXVzdCBiZSBvbiB0aGUgUkhTIG9mIGNvbW11dGF0aXZlIG9wZXJhdG9ycyEiOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUcmVlUGF0dGVybiBpbXBsZW1lbnRhdGlvbgorLy8KKworVHJlZVBhdHRlcm46OlRyZWVQYXR0ZXJuKFJlY29yZCAqVGhlUmVjLCBMaXN0SW5pdCAqUmF3UGF0LCBib29sIGlzSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkRBR1BhdHRlcm5zICZjZHApIDogVGhlUmVjb3JkKFRoZVJlYyksIENEUChjZHApeworICBpc0lucHV0UGF0dGVybiA9IGlzSW5wdXQ7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSYXdQYXQtPmdldFNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgVHJlZXMucHVzaF9iYWNrKFBhcnNlVHJlZVBhdHRlcm4oUmF3UGF0LT5nZXRFbGVtZW50KGkpLCAiIikpOworfQorCitUcmVlUGF0dGVybjo6VHJlZVBhdHRlcm4oUmVjb3JkICpUaGVSZWMsIERhZ0luaXQgKlBhdCwgYm9vbCBpc0lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5EQUdQYXR0ZXJucyAmY2RwKSA6IFRoZVJlY29yZChUaGVSZWMpLCBDRFAoY2RwKXsKKyAgaXNJbnB1dFBhdHRlcm4gPSBpc0lucHV0OworICBUcmVlcy5wdXNoX2JhY2soUGFyc2VUcmVlUGF0dGVybihQYXQsICIiKSk7Cit9CisKK1RyZWVQYXR0ZXJuOjpUcmVlUGF0dGVybihSZWNvcmQgKlRoZVJlYywgVHJlZVBhdHRlcm5Ob2RlICpQYXQsIGJvb2wgaXNJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuREFHUGF0dGVybnMgJmNkcCkgOiBUaGVSZWNvcmQoVGhlUmVjKSwgQ0RQKGNkcCl7CisgIGlzSW5wdXRQYXR0ZXJuID0gaXNJbnB1dDsKKyAgVHJlZXMucHVzaF9iYWNrKFBhdCk7Cit9CisKK3ZvaWQgVHJlZVBhdHRlcm46OmVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nICZNc2cpIGNvbnN0IHsKKyAgZHVtcCgpOworICB0aHJvdyBUR0Vycm9yKFRoZVJlY29yZC0+Z2V0TG9jKCksICJJbiAiICsgVGhlUmVjb3JkLT5nZXROYW1lKCkgKyAiOiAiICsgTXNnKTsKK30KKwordm9pZCBUcmVlUGF0dGVybjo6Q29tcHV0ZU5hbWVkTm9kZXMoKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUcmVlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIENvbXB1dGVOYW1lZE5vZGVzKFRyZWVzW2ldKTsKK30KKwordm9pZCBUcmVlUGF0dGVybjo6Q29tcHV0ZU5hbWVkTm9kZXMoVHJlZVBhdHRlcm5Ob2RlICpOKSB7CisgIGlmICghTi0+Z2V0TmFtZSgpLmVtcHR5KCkpCisgICAgTmFtZWROb2Rlc1tOLT5nZXROYW1lKCldLnB1c2hfYmFjayhOKTsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOLT5nZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkKKyAgICBDb21wdXRlTmFtZWROb2RlcyhOLT5nZXRDaGlsZChpKSk7Cit9CisKKworVHJlZVBhdHRlcm5Ob2RlICpUcmVlUGF0dGVybjo6UGFyc2VUcmVlUGF0dGVybihJbml0ICpUaGVJbml0LCBTdHJpbmdSZWYgT3BOYW1lKXsKKyAgaWYgKERlZkluaXQgKkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihUaGVJbml0KSkgeworICAgIFJlY29yZCAqUiA9IERJLT5nZXREZWYoKTsKKyAgICAKKyAgICAvLyBEaXJlY3QgcmVmZXJlbmNlIHRvIGEgbGVhZiBEYWdOb2RlIG9yIFBhdEZyYWc/ICBUdXJuIGl0IGludG8gYQorICAgIC8vIFRyZWVQYXR0ZXJuTm9kZSBpZiBpdHMgb3duLiAgRm9yIGV4YW1wbGU6CisgICAgLy8vICAgKGZvbyBHUFIsIGltbSkgLT4gKGZvbyBHUFIsIChpbW0pKQorICAgIGlmIChSLT5pc1N1YkNsYXNzT2YoIlNETm9kZSIpIHx8IFItPmlzU3ViQ2xhc3NPZigiUGF0RnJhZyIpKQorICAgICAgcmV0dXJuIFBhcnNlVHJlZVBhdHRlcm4obmV3IERhZ0luaXQoREksICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8SW5pdCosIHN0ZDo6c3RyaW5nPiA+KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BOYW1lKTsKKyAgICAKKyAgICAvLyBJbnB1dCBhcmd1bWVudD8KKyAgICBUcmVlUGF0dGVybk5vZGUgKlJlcyA9IG5ldyBUcmVlUGF0dGVybk5vZGUoREksIDEpOworICAgIGlmIChSLT5nZXROYW1lKCkgPT0gIm5vZGUiICYmICFPcE5hbWUuZW1wdHkoKSkgeworICAgICAgaWYgKE9wTmFtZS5lbXB0eSgpKQorICAgICAgICBlcnJvcigiJ25vZGUnIGFyZ3VtZW50IHJlcXVpcmVzIGEgbmFtZSB0byBtYXRjaCB3aXRoIG9wZXJhbmQgbGlzdCIpOworICAgICAgQXJncy5wdXNoX2JhY2soT3BOYW1lKTsKKyAgICB9CisKKyAgICBSZXMtPnNldE5hbWUoT3BOYW1lKTsKKyAgICByZXR1cm4gUmVzOworICB9CisgIAorICBpZiAoSW50SW5pdCAqSUkgPSBkeW5hbWljX2Nhc3Q8SW50SW5pdCo+KFRoZUluaXQpKSB7CisgICAgaWYgKCFPcE5hbWUuZW1wdHkoKSkKKyAgICAgIGVycm9yKCJDb25zdGFudCBpbnQgYXJndW1lbnQgc2hvdWxkIG5vdCBoYXZlIGEgbmFtZSEiKTsKKyAgICByZXR1cm4gbmV3IFRyZWVQYXR0ZXJuTm9kZShJSSwgMSk7CisgIH0KKyAgCisgIGlmIChCaXRzSW5pdCAqQkkgPSBkeW5hbWljX2Nhc3Q8Qml0c0luaXQqPihUaGVJbml0KSkgeworICAgIC8vIFR1cm4gdGhpcyBpbnRvIGFuIEludEluaXQuCisgICAgSW5pdCAqSUkgPSBCSS0+Y29udmVydEluaXRpYWxpemVyVG8obmV3IEludFJlY1R5KCkpOworICAgIGlmIChJSSA9PSAwIHx8ICFkeW5hbWljX2Nhc3Q8SW50SW5pdCo+KElJKSkKKyAgICAgIGVycm9yKCJCaXRzIHZhbHVlIG11c3QgYmUgY29uc3RhbnRzISIpOworICAgIHJldHVybiBQYXJzZVRyZWVQYXR0ZXJuKElJLCBPcE5hbWUpOworICB9CisKKyAgRGFnSW5pdCAqRGFnID0gZHluYW1pY19jYXN0PERhZ0luaXQqPihUaGVJbml0KTsKKyAgaWYgKCFEYWcpIHsKKyAgICBUaGVJbml0LT5kdW1wKCk7CisgICAgZXJyb3IoIlBhdHRlcm4gaGFzIHVuZXhwZWN0ZWQgaW5pdCBraW5kISIpOworICB9CisgIERlZkluaXQgKk9wRGVmID0gZHluYW1pY19jYXN0PERlZkluaXQqPihEYWctPmdldE9wZXJhdG9yKCkpOworICBpZiAoIU9wRGVmKSBlcnJvcigiUGF0dGVybiBoYXMgdW5leHBlY3RlZCBvcGVyYXRvciB0eXBlISIpOworICBSZWNvcmQgKk9wZXJhdG9yID0gT3BEZWYtPmdldERlZigpOworICAKKyAgaWYgKE9wZXJhdG9yLT5pc1N1YkNsYXNzT2YoIlZhbHVlVHlwZSIpKSB7CisgICAgLy8gSWYgdGhlIG9wZXJhdG9yIGlzIGEgVmFsdWVUeXBlLCB0aGVuIHRoaXMgbXVzdCBiZSAidHlwZSBjYXN0IiBvZiBhIGxlYWYKKyAgICAvLyBub2RlLgorICAgIGlmIChEYWctPmdldE51bUFyZ3MoKSAhPSAxKQorICAgICAgZXJyb3IoIlR5cGUgY2FzdCBvbmx5IHRha2VzIG9uZSBvcGVyYW5kISIpOworICAgIAorICAgIFRyZWVQYXR0ZXJuTm9kZSAqTmV3ID0gUGFyc2VUcmVlUGF0dGVybihEYWctPmdldEFyZygwKSwgRGFnLT5nZXRBcmdOYW1lKDApKTsKKyAgICAKKyAgICAvLyBBcHBseSB0aGUgdHlwZSBjYXN0LgorICAgIGFzc2VydChOZXctPmdldE51bVR5cGVzKCkgPT0gMSAmJiAiRklYTUU6IFVuaGFuZGxlZCIpOworICAgIE5ldy0+VXBkYXRlTm9kZVR5cGUoMCwgZ2V0VmFsdWVUeXBlKE9wZXJhdG9yKSwgKnRoaXMpOworICAgIAorICAgIGlmICghT3BOYW1lLmVtcHR5KCkpCisgICAgICBlcnJvcigiVmFsdWVUeXBlIGNhc3Qgc2hvdWxkIG5vdCBoYXZlIGEgbmFtZSEiKTsKKyAgICByZXR1cm4gTmV3OworICB9CisgIAorICAvLyBWZXJpZnkgdGhhdCB0aGlzIGlzIHNvbWV0aGluZyB0aGF0IG1ha2VzIHNlbnNlIGZvciBhbiBvcGVyYXRvci4KKyAgaWYgKCFPcGVyYXRvci0+aXNTdWJDbGFzc09mKCJQYXRGcmFnIikgJiYgCisgICAgICAhT3BlcmF0b3ItPmlzU3ViQ2xhc3NPZigiU0ROb2RlIikgJiYKKyAgICAgICFPcGVyYXRvci0+aXNTdWJDbGFzc09mKCJJbnN0cnVjdGlvbiIpICYmIAorICAgICAgIU9wZXJhdG9yLT5pc1N1YkNsYXNzT2YoIlNETm9kZVhGb3JtIikgJiYKKyAgICAgICFPcGVyYXRvci0+aXNTdWJDbGFzc09mKCJJbnRyaW5zaWMiKSAmJgorICAgICAgT3BlcmF0b3ItPmdldE5hbWUoKSAhPSAic2V0IiAmJgorICAgICAgT3BlcmF0b3ItPmdldE5hbWUoKSAhPSAiaW1wbGljaXQiKQorICAgIGVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSAnIiArIE9wZXJhdG9yLT5nZXROYW1lKCkgKyAiJyEiKTsKKyAgCisgIC8vICBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBzb21ldGhpbmcgdGhhdCBpcyBpbGxlZ2FsIGluIGFuIGlucHV0IHBhdHRlcm4uCisgIGlmIChpc0lucHV0UGF0dGVybikgeworICAgIGlmIChPcGVyYXRvci0+aXNTdWJDbGFzc09mKCJJbnN0cnVjdGlvbiIpIHx8CisgICAgICAgIE9wZXJhdG9yLT5pc1N1YkNsYXNzT2YoIlNETm9kZVhGb3JtIikpCisgICAgICBlcnJvcigiQ2Fubm90IHVzZSAnIiArIE9wZXJhdG9yLT5nZXROYW1lKCkgKyAiJyBpbiBhbiBpbnB1dCBwYXR0ZXJuISIpOworICB9IGVsc2UgeworICAgIGlmIChPcGVyYXRvci0+aXNTdWJDbGFzc09mKCJJbnRyaW5zaWMiKSkKKyAgICAgIGVycm9yKCJDYW5ub3QgdXNlICciICsgT3BlcmF0b3ItPmdldE5hbWUoKSArICInIGluIGFuIG91dHB1dCBwYXR0ZXJuISIpOworICAgIAorICAgIGlmIChPcGVyYXRvci0+aXNTdWJDbGFzc09mKCJTRE5vZGUiKSAmJgorICAgICAgICBPcGVyYXRvci0+Z2V0TmFtZSgpICE9ICJpbW0iICYmCisgICAgICAgIE9wZXJhdG9yLT5nZXROYW1lKCkgIT0gImZwaW1tIiAmJgorICAgICAgICBPcGVyYXRvci0+Z2V0TmFtZSgpICE9ICJ0Z2xvYmFsdGxzYWRkciIgJiYKKyAgICAgICAgT3BlcmF0b3ItPmdldE5hbWUoKSAhPSAidGNvbnN0cG9vbCIgJiYKKyAgICAgICAgT3BlcmF0b3ItPmdldE5hbWUoKSAhPSAidGp1bXB0YWJsZSIgJiYKKyAgICAgICAgT3BlcmF0b3ItPmdldE5hbWUoKSAhPSAidGZyYW1laW5kZXgiICYmCisgICAgICAgIE9wZXJhdG9yLT5nZXROYW1lKCkgIT0gInRleHRlcm5hbHN5bSIgJiYKKyAgICAgICAgT3BlcmF0b3ItPmdldE5hbWUoKSAhPSAidGJsb2NrYWRkcmVzcyIgJiYKKyAgICAgICAgT3BlcmF0b3ItPmdldE5hbWUoKSAhPSAidGdsb2JhbGFkZHIiICYmCisgICAgICAgIE9wZXJhdG9yLT5nZXROYW1lKCkgIT0gImJiIiAmJgorICAgICAgICBPcGVyYXRvci0+Z2V0TmFtZSgpICE9ICJ2dCIpCisgICAgICBlcnJvcigiQ2Fubm90IHVzZSAnIiArIE9wZXJhdG9yLT5nZXROYW1lKCkgKyAiJyBpbiBhbiBvdXRwdXQgcGF0dGVybiEiKTsKKyAgfQorICAKKyAgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gQ2hpbGRyZW47CisKKyAgLy8gUGFyc2UgYWxsIHRoZSBvcGVyYW5kcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IERhZy0+Z2V0TnVtQXJncygpOyBpICE9IGU7ICsraSkKKyAgICBDaGlsZHJlbi5wdXNoX2JhY2soUGFyc2VUcmVlUGF0dGVybihEYWctPmdldEFyZyhpKSwgRGFnLT5nZXRBcmdOYW1lKGkpKSk7CisgIAorICAvLyBJZiB0aGUgb3BlcmF0b3IgaXMgYW4gaW50cmluc2ljLCB0aGVuIHRoaXMgaXMganVzdCBzeW50YWN0aWMgc3VnYXIgZm9yIGZvcgorICAvLyAoaW50cmluc2ljXyogPG51bWJlcj4sIC4uY2hpbGRyZW4uLikuICBQaWNrIHRoZSByaWdodCBpbnRyaW5zaWMgbm9kZSwgYW5kIAorICAvLyBjb252ZXJ0IHRoZSBpbnRyaW5zaWMgbmFtZSB0byBhIG51bWJlci4KKyAgaWYgKE9wZXJhdG9yLT5pc1N1YkNsYXNzT2YoIkludHJpbnNpYyIpKSB7CisgICAgY29uc3QgQ29kZUdlbkludHJpbnNpYyAmSW50ID0gZ2V0REFHUGF0dGVybnMoKS5nZXRJbnRyaW5zaWMoT3BlcmF0b3IpOworICAgIHVuc2lnbmVkIElJRCA9IGdldERBR1BhdHRlcm5zKCkuZ2V0SW50cmluc2ljSUQoT3BlcmF0b3IpKzE7CisKKyAgICAvLyBJZiB0aGlzIGludHJpbnNpYyByZXR1cm5zIHZvaWQsIGl0IG11c3QgaGF2ZSBzaWRlLWVmZmVjdHMgYW5kIHRodXMgYQorICAgIC8vIGNoYWluLgorICAgIGlmIChJbnQuSVMuUmV0VlRzLmVtcHR5KCkpCisgICAgICBPcGVyYXRvciA9IGdldERBR1BhdHRlcm5zKCkuZ2V0X2ludHJpbnNpY192b2lkX3Nkbm9kZSgpOworICAgIGVsc2UgaWYgKEludC5Nb2RSZWYgIT0gQ29kZUdlbkludHJpbnNpYzo6Tm9NZW0pCisgICAgICAvLyBIYXMgc2lkZS1lZmZlY3RzLCByZXF1aXJlcyBjaGFpbi4KKyAgICAgIE9wZXJhdG9yID0gZ2V0REFHUGF0dGVybnMoKS5nZXRfaW50cmluc2ljX3dfY2hhaW5fc2Rub2RlKCk7CisgICAgZWxzZSAvLyBPdGhlcndpc2UsIG5vIGNoYWluLgorICAgICAgT3BlcmF0b3IgPSBnZXREQUdQYXR0ZXJucygpLmdldF9pbnRyaW5zaWNfd29fY2hhaW5fc2Rub2RlKCk7CisgICAgCisgICAgVHJlZVBhdHRlcm5Ob2RlICpJSUROb2RlID0gbmV3IFRyZWVQYXR0ZXJuTm9kZShuZXcgSW50SW5pdChJSUQpLCAxKTsKKyAgICBDaGlsZHJlbi5pbnNlcnQoQ2hpbGRyZW4uYmVnaW4oKSwgSUlETm9kZSk7CisgIH0KKyAgCisgIHVuc2lnbmVkIE51bVJlc3VsdHMgPSBHZXROdW1Ob2RlUmVzdWx0cyhPcGVyYXRvciwgQ0RQKTsKKyAgVHJlZVBhdHRlcm5Ob2RlICpSZXN1bHQgPSBuZXcgVHJlZVBhdHRlcm5Ob2RlKE9wZXJhdG9yLCBDaGlsZHJlbiwgTnVtUmVzdWx0cyk7CisgIFJlc3VsdC0+c2V0TmFtZShPcE5hbWUpOworICAKKyAgaWYgKCFEYWctPmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgYXNzZXJ0KFJlc3VsdC0+Z2V0TmFtZSgpLmVtcHR5KCkpOworICAgIFJlc3VsdC0+c2V0TmFtZShEYWctPmdldE5hbWUoKSk7CisgIH0KKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8vIFNpbXBsaWZ5VHJlZSAtIFNlZSBpZiB3ZSBjYW4gc2ltcGxpZnkgdGhpcyB0cmVlIHRvIGVsaW1pbmF0ZSBzb21ldGhpbmcgdGhhdAorLy8vIHdpbGwgbmV2ZXIgbWF0Y2ggaW4gZmF2b3Igb2Ygc29tZXRoaW5nIG9idmlvdXMgdGhhdCB3aWxsLiAgVGhpcyBpcyBoZXJlCisvLy8gc3RyaWN0bHkgYXMgYSBjb252ZW5pZW5jZSB0byB0YXJnZXQgYXV0aG9ycyBiZWNhdXNlIGl0IGFsbG93cyB0aGVtIHRvIHdyaXRlCisvLy8gbW9yZSB0eXBlIGdlbmVyaWMgdGhpbmdzIGFuZCBoYXZlIHVzZWxlc3MgdHlwZSBjYXN0cyBmb2xkIGF3YXkuCisvLy8KKy8vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiBhbnkgY2hhbmdlIGlzIG1hZGUuCitzdGF0aWMgYm9vbCBTaW1wbGlmeVRyZWUoVHJlZVBhdHRlcm5Ob2RlIComTikgeworICBpZiAoTi0+aXNMZWFmKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHdlIGhhdmUgYSBiaXRjb252ZXJ0IHdpdGggYSByZXNvbHZlZCB0eXBlIGFuZCBpZiB0aGUgc291cmNlIGFuZAorICAvLyBkZXN0aW5hdGlvbiB0eXBlcyBhcmUgdGhlIHNhbWUsIHRoZW4gdGhlIGJpdGNvbnZlcnQgaXMgdXNlbGVzcywgcmVtb3ZlIGl0LgorICBpZiAoTi0+Z2V0T3BlcmF0b3IoKS0+Z2V0TmFtZSgpID09ICJiaXRjb252ZXJ0IiAmJgorICAgICAgTi0+Z2V0RXh0VHlwZSgwKS5pc0NvbmNyZXRlKCkgJiYKKyAgICAgIE4tPmdldEV4dFR5cGUoMCkgPT0gTi0+Z2V0Q2hpbGQoMCktPmdldEV4dFR5cGUoMCkgJiYKKyAgICAgIE4tPmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgTiA9IE4tPmdldENoaWxkKDApOworICAgIFNpbXBsaWZ5VHJlZShOKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFdhbGsgYWxsIGNoaWxkcmVuLgorICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKSB7CisgICAgVHJlZVBhdHRlcm5Ob2RlICpDaGlsZCA9IE4tPmdldENoaWxkKGkpOworICAgIE1hZGVDaGFuZ2UgfD0gU2ltcGxpZnlUcmVlKENoaWxkKTsKKyAgICBOLT5zZXRDaGlsZChpLCBDaGlsZCk7CisgIH0KKyAgcmV0dXJuIE1hZGVDaGFuZ2U7Cit9CisKKworCisvLy8gSW5mZXJBbGxUeXBlcyAtIEluZmVyL3Byb3BhZ2F0ZSBhcyBtYW55IHR5cGVzIHRocm91Z2hvdXQgdGhlIGV4cHJlc3Npb24KKy8vLyBwYXR0ZXJucyBhcyBwb3NzaWJsZS4gIFJldHVybiB0cnVlIGlmIGFsbCB0eXBlcyBhcmUgaW5mZXJyZWQsIGZhbHNlCisvLy8gb3RoZXJ3aXNlLiAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgdHlwZSBjb250cmFkaWN0aW9uIGlzIGZvdW5kLgorYm9vbCBUcmVlUGF0dGVybjo6CitJbmZlckFsbFR5cGVzKGNvbnN0IFN0cmluZ01hcDxTbWFsbFZlY3RvcjxUcmVlUGF0dGVybk5vZGUqLDE+ID4gKkluTmFtZWRUeXBlcykgeworICBpZiAoTmFtZWROb2Rlcy5lbXB0eSgpKQorICAgIENvbXB1dGVOYW1lZE5vZGVzKCk7CisKKyAgYm9vbCBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgd2hpbGUgKE1hZGVDaGFuZ2UpIHsKKyAgICBNYWRlQ2hhbmdlID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRyZWVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hZGVDaGFuZ2UgfD0gVHJlZXNbaV0tPkFwcGx5VHlwZUNvbnN0cmFpbnRzKCp0aGlzLCBmYWxzZSk7CisgICAgICBNYWRlQ2hhbmdlIHw9IFNpbXBsaWZ5VHJlZShUcmVlc1tpXSk7CisgICAgfQorCisgICAgLy8gSWYgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIG9uIG91ciBuYW1lZCBub2RlcywgYXBwbHkgdGhlbS4KKyAgICBmb3IgKFN0cmluZ01hcDxTbWFsbFZlY3RvcjxUcmVlUGF0dGVybk5vZGUqLDE+ID46Oml0ZXJhdG9yIAorICAgICAgICAgSSA9IE5hbWVkTm9kZXMuYmVnaW4oKSwgRSA9IE5hbWVkTm9kZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBTbWFsbFZlY3RvckltcGw8VHJlZVBhdHRlcm5Ob2RlKj4gJk5vZGVzID0gSS0+c2Vjb25kOworICAgICAgCisgICAgICAvLyBJZiB3ZSBoYXZlIGlucHV0IG5hbWVkIG5vZGUgdHlwZXMsIHByb3BhZ2F0ZSB0aGVpciB0eXBlcyB0byB0aGUgbmFtZWQKKyAgICAgIC8vIHZhbHVlcyBoZXJlLgorICAgICAgaWYgKEluTmFtZWRUeXBlcykgeworICAgICAgICAvLyBGSVhNRTogU2hvdWxkIGJlIGVycm9yPworICAgICAgICBhc3NlcnQoSW5OYW1lZFR5cGVzLT5jb3VudChJLT5nZXRLZXkoKSkgJiYKKyAgICAgICAgICAgICAgICJOYW1lZCBub2RlIGluIG91dHB1dCBwYXR0ZXJuIGJ1dCBub3QgaW5wdXQgcGF0dGVybj8iKTsKKworICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8VHJlZVBhdHRlcm5Ob2RlKj4gJkluTm9kZXMgPQorICAgICAgICAgIEluTmFtZWRUeXBlcy0+ZmluZChJLT5nZXRLZXkoKSktPnNlY29uZDsKKworICAgICAgICAvLyBUaGUgaW5wdXQgdHlwZXMgc2hvdWxkIGJlIGZ1bGx5IHJlc29sdmVkIGJ5IG5vdy4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vZGVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICAvLyBJZiB0aGlzIG5vZGUgaXMgYSByZWdpc3RlciBjbGFzcywgYW5kIGl0IGlzIHRoZSByb290IG9mIHRoZSBwYXR0ZXJuCisgICAgICAgICAgLy8gdGhlbiB3ZSdyZSBtYXBwaW5nIHNvbWV0aGluZyBvbnRvIGFuIGlucHV0IHJlZ2lzdGVyLiAgV2UgYWxsb3cKKyAgICAgICAgICAvLyBjaGFuZ2luZyB0aGUgdHlwZSBvZiB0aGUgaW5wdXQgcmVnaXN0ZXIgaW4gdGhpcyBjYXNlLiAgVGhpcyBhbGxvd3MKKyAgICAgICAgICAvLyB1cyB0byBtYXRjaCB0aGluZ3MgbGlrZToKKyAgICAgICAgICAvLyAgZGVmIDogUGF0PCh2MWk2NCAoYml0Y29udmVydCh2MmkzMiBEUFI6JHNyYykpKSwgKHYxaTY0IERQUjokc3JjKT47CisgICAgICAgICAgaWYgKE5vZGVzW2ldID09IFRyZWVzWzBdICYmIE5vZGVzW2ldLT5pc0xlYWYoKSkgeworICAgICAgICAgICAgRGVmSW5pdCAqREkgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KE5vZGVzW2ldLT5nZXRMZWFmVmFsdWUoKSk7CisgICAgICAgICAgICBpZiAoREkgJiYgREktPmdldERlZigpLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyQ2xhc3MiKSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGFzc2VydChOb2Rlc1tpXS0+Z2V0TnVtVHlwZXMoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgIEluTm9kZXNbMF0tPmdldE51bVR5cGVzKCkgPT0gMSAmJgorICAgICAgICAgICAgICAgICAiRklYTUU6IGNhbm5vdCBuYW1lIG11bHRpcGxlIHJlc3VsdCBub2RlcyB5ZXQiKTsKKyAgICAgICAgICBNYWRlQ2hhbmdlIHw9IE5vZGVzW2ldLT5VcGRhdGVOb2RlVHlwZSgwLCBJbk5vZGVzWzBdLT5nZXRFeHRUeXBlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aGlzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbm9kZXMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGV5IG11c3QgYWxsIGhhdmUgdGhlCisgICAgICAvLyBzYW1lIHR5cGUuCisgICAgICBpZiAoSS0+c2Vjb25kLnNpemUoKSA+IDEpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vZGVzLnNpemUoKS0xOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIFRyZWVQYXR0ZXJuTm9kZSAqTjEgPSBOb2Rlc1tpXSwgKk4yID0gTm9kZXNbaSsxXTsKKyAgICAgICAgICBhc3NlcnQoTjEtPmdldE51bVR5cGVzKCkgPT0gMSAmJiBOMi0+Z2V0TnVtVHlwZXMoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgICJGSVhNRTogY2Fubm90IG5hbWUgbXVsdGlwbGUgcmVzdWx0IG5vZGVzIHlldCIpOworICAgICAgICAgIAorICAgICAgICAgIE1hZGVDaGFuZ2UgfD0gTjEtPlVwZGF0ZU5vZGVUeXBlKDAsIE4yLT5nZXRFeHRUeXBlKDApLCAqdGhpcyk7CisgICAgICAgICAgTWFkZUNoYW5nZSB8PSBOMi0+VXBkYXRlTm9kZVR5cGUoMCwgTjEtPmdldEV4dFR5cGUoMCksICp0aGlzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgYm9vbCBIYXNVbnJlc29sdmVkVHlwZXMgPSBmYWxzZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRyZWVzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgSGFzVW5yZXNvbHZlZFR5cGVzIHw9IFRyZWVzW2ldLT5Db250YWluc1VucmVzb2x2ZWRUeXBlKCk7CisgIHJldHVybiAhSGFzVW5yZXNvbHZlZFR5cGVzOworfQorCit2b2lkIFRyZWVQYXR0ZXJuOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgZ2V0UmVjb3JkKCktPmdldE5hbWUoKTsKKyAgaWYgKCFBcmdzLmVtcHR5KCkpIHsKKyAgICBPUyA8PCAiKCIgPDwgQXJnc1swXTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgT1MgPDwgIiwgIiA8PCBBcmdzW2ldOworICAgIE9TIDw8ICIpIjsKKyAgfQorICBPUyA8PCAiOiAiOworICAKKyAgaWYgKFRyZWVzLnNpemUoKSA+IDEpCisgICAgT1MgPDwgIltcbiI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUcmVlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgT1MgPDwgIlx0IjsKKyAgICBUcmVlc1tpXS0+cHJpbnQoT1MpOworICAgIE9TIDw8ICJcbiI7CisgIH0KKworICBpZiAoVHJlZXMuc2l6ZSgpID4gMSkKKyAgICBPUyA8PCAiXVxuIjsKK30KKwordm9pZCBUcmVlUGF0dGVybjo6ZHVtcCgpIGNvbnN0IHsgcHJpbnQoZXJycygpKTsgfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29kZUdlbkRBR1BhdHRlcm5zIGltcGxlbWVudGF0aW9uCisvLworCitDb2RlR2VuREFHUGF0dGVybnM6OkNvZGVHZW5EQUdQYXR0ZXJucyhSZWNvcmRLZWVwZXIgJlIpIDogUmVjb3JkcyhSKSB7CisgIEludHJpbnNpY3MgPSBMb2FkSW50cmluc2ljcyhSZWNvcmRzLCBmYWxzZSk7CisgIFRndEludHJpbnNpY3MgPSBMb2FkSW50cmluc2ljcyhSZWNvcmRzLCB0cnVlKTsKKyAgUGFyc2VOb2RlSW5mbygpOworICBQYXJzZU5vZGVUcmFuc2Zvcm1zKCk7CisgIFBhcnNlQ29tcGxleFBhdHRlcm5zKCk7CisgIFBhcnNlUGF0dGVybkZyYWdtZW50cygpOworICBQYXJzZURlZmF1bHRPcGVyYW5kcygpOworICBQYXJzZUluc3RydWN0aW9ucygpOworICBQYXJzZVBhdHRlcm5zKCk7CisgIAorICAvLyBHZW5lcmF0ZSB2YXJpYW50cy4gIEZvciBleGFtcGxlLCBjb21tdXRhdGl2ZSBwYXR0ZXJucyBjYW4gbWF0Y2gKKyAgLy8gbXVsdGlwbGUgd2F5cy4gIEFkZCB0aGVtIHRvIFBhdHRlcm5zVG9NYXRjaCBhcyB3ZWxsLgorICBHZW5lcmF0ZVZhcmlhbnRzKCk7CisKKyAgLy8gSW5mZXIgaW5zdHJ1Y3Rpb24gZmxhZ3MuICBGb3IgZXhhbXBsZSwgd2UgY2FuIGRldGVjdCBsb2FkcywKKyAgLy8gc3RvcmVzLCBhbmQgc2lkZSBlZmZlY3RzIGluIG1hbnkgY2FzZXMgYnkgZXhhbWluaW5nIGFuCisgIC8vIGluc3RydWN0aW9uJ3MgcGF0dGVybi4KKyAgSW5mZXJJbnN0cnVjdGlvbkZsYWdzKCk7Cit9CisKK0NvZGVHZW5EQUdQYXR0ZXJuczo6fkNvZGVHZW5EQUdQYXR0ZXJucygpIHsKKyAgZm9yIChwZl9pdGVyYXRvciBJID0gUGF0dGVybkZyYWdtZW50cy5iZWdpbigpLAorICAgICAgIEUgPSBQYXR0ZXJuRnJhZ21lbnRzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBkZWxldGUgSS0+c2Vjb25kOworfQorCisKK1JlY29yZCAqQ29kZUdlbkRBR1BhdHRlcm5zOjpnZXRTRE5vZGVOYW1lZChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgY29uc3QgeworICBSZWNvcmQgKk4gPSBSZWNvcmRzLmdldERlZihOYW1lKTsKKyAgaWYgKCFOIHx8ICFOLT5pc1N1YkNsYXNzT2YoIlNETm9kZSIpKSB7CisgICAgZXJycygpIDw8ICJFcnJvciBnZXR0aW5nIFNETm9kZSAnIiA8PCBOYW1lIDw8ICInIVxuIjsKKyAgICBleGl0KDEpOworICB9CisgIHJldHVybiBOOworfQorCisvLyBQYXJzZSBhbGwgb2YgdGhlIFNETm9kZSBkZWZpbml0aW9ucyBmb3IgdGhlIHRhcmdldCwgcG9wdWxhdGluZyBTRE5vZGVzLgordm9pZCBDb2RlR2VuREFHUGF0dGVybnM6OlBhcnNlTm9kZUluZm8oKSB7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IE5vZGVzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIlNETm9kZSIpOworICB3aGlsZSAoIU5vZGVzLmVtcHR5KCkpIHsKKyAgICBTRE5vZGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihOb2Rlcy5iYWNrKCksIE5vZGVzLmJhY2soKSkpOworICAgIE5vZGVzLnBvcF9iYWNrKCk7CisgIH0KKworICAvLyBHZXQgdGhlIGJ1aWx0aW4gaW50cmluc2ljIG5vZGVzLgorICBpbnRyaW5zaWNfdm9pZF9zZG5vZGUgICAgID0gZ2V0U0ROb2RlTmFtZWQoImludHJpbnNpY192b2lkIik7CisgIGludHJpbnNpY193X2NoYWluX3Nkbm9kZSAgPSBnZXRTRE5vZGVOYW1lZCgiaW50cmluc2ljX3dfY2hhaW4iKTsKKyAgaW50cmluc2ljX3dvX2NoYWluX3Nkbm9kZSA9IGdldFNETm9kZU5hbWVkKCJpbnRyaW5zaWNfd29fY2hhaW4iKTsKK30KKworLy8vIFBhcnNlTm9kZVRyYW5zZm9ybXMgLSBQYXJzZSBhbGwgU0ROb2RlWEZvcm0gaW5zdGFuY2VzIGludG8gdGhlIFNETm9kZVhGb3JtcworLy8vIG1hcCwgYW5kIGVtaXQgdGhlbSB0byB0aGUgZmlsZSBhcyBmdW5jdGlvbnMuCit2b2lkIENvZGVHZW5EQUdQYXR0ZXJuczo6UGFyc2VOb2RlVHJhbnNmb3JtcygpIHsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gWGZvcm1zID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIlNETm9kZVhGb3JtIik7CisgIHdoaWxlICghWGZvcm1zLmVtcHR5KCkpIHsKKyAgICBSZWNvcmQgKlhGb3JtTm9kZSA9IFhmb3Jtcy5iYWNrKCk7CisgICAgUmVjb3JkICpTRE5vZGUgPSBYRm9ybU5vZGUtPmdldFZhbHVlQXNEZWYoIk9wY29kZSIpOworICAgIHN0ZDo6c3RyaW5nIENvZGUgPSBYRm9ybU5vZGUtPmdldFZhbHVlQXNDb2RlKCJYRm9ybUZ1bmN0aW9uIik7CisgICAgU0ROb2RlWEZvcm1zLmluc2VydChzdGQ6Om1ha2VfcGFpcihYRm9ybU5vZGUsIE5vZGVYRm9ybShTRE5vZGUsIENvZGUpKSk7CisKKyAgICBYZm9ybXMucG9wX2JhY2soKTsKKyAgfQorfQorCit2b2lkIENvZGVHZW5EQUdQYXR0ZXJuczo6UGFyc2VDb21wbGV4UGF0dGVybnMoKSB7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEFNcyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJDb21wbGV4UGF0dGVybiIpOworICB3aGlsZSAoIUFNcy5lbXB0eSgpKSB7CisgICAgQ29tcGxleFBhdHRlcm5zLmluc2VydChzdGQ6Om1ha2VfcGFpcihBTXMuYmFjaygpLCBBTXMuYmFjaygpKSk7CisgICAgQU1zLnBvcF9iYWNrKCk7CisgIH0KK30KKworCisvLy8gUGFyc2VQYXR0ZXJuRnJhZ21lbnRzIC0gUGFyc2UgYWxsIG9mIHRoZSBQYXRGcmFnIGRlZmluaXRpb25zIGluIHRoZSAudGQKKy8vLyBmaWxlLCBidWlsZGluZyB1cCB0aGUgUGF0dGVybkZyYWdtZW50cyBtYXAuICBBZnRlciB3ZSd2ZSBjb2xsZWN0ZWQgdGhlbSBhbGwsCisvLy8gaW5saW5lIGZyYWdtZW50cyB0b2dldGhlciBhcyBuZWNlc3NhcnksIHNvIHRoYXQgdGhlcmUgYXJlIG5vIHJlZmVyZW5jZXMgbGVmdAorLy8vIGluc2lkZSBhIHBhdHRlcm4gZnJhZ21lbnQgdG8gYSBwYXR0ZXJuIGZyYWdtZW50LgorLy8vCit2b2lkIENvZGVHZW5EQUdQYXR0ZXJuczo6UGFyc2VQYXR0ZXJuRnJhZ21lbnRzKCkgeworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBGcmFnbWVudHMgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiUGF0RnJhZyIpOworICAKKyAgLy8gRmlyc3Qgc3RlcCwgcGFyc2UgYWxsIG9mIHRoZSBmcmFnbWVudHMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGcmFnbWVudHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIERhZ0luaXQgKlRyZWUgPSBGcmFnbWVudHNbaV0tPmdldFZhbHVlQXNEYWcoIkZyYWdtZW50Iik7CisgICAgVHJlZVBhdHRlcm4gKlAgPSBuZXcgVHJlZVBhdHRlcm4oRnJhZ21lbnRzW2ldLCBUcmVlLCB0cnVlLCAqdGhpcyk7CisgICAgUGF0dGVybkZyYWdtZW50c1tGcmFnbWVudHNbaV1dID0gUDsKKyAgICAKKyAgICAvLyBWYWxpZGF0ZSB0aGUgYXJndW1lbnQgbGlzdCwgY29udmVydGluZyBpdCB0byBzZXQsIHRvIGRpc2NhcmQgZHVwbGljYXRlcy4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkFyZ3MgPSBQLT5nZXRBcmdMaXN0KCk7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IE9wZXJhbmRzU2V0KEFyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKSk7CisgICAgCisgICAgaWYgKE9wZXJhbmRzU2V0LmNvdW50KCIiKSkKKyAgICAgIFAtPmVycm9yKCJDYW5ub3QgaGF2ZSB1bm5hbWVkICdub2RlJyB2YWx1ZXMgaW4gcGF0dGVybiBmcmFnbWVudCEiKTsKKyAgICAKKyAgICAvLyBQYXJzZSB0aGUgb3BlcmFuZHMgbGlzdC4KKyAgICBEYWdJbml0ICpPcHNMaXN0ID0gRnJhZ21lbnRzW2ldLT5nZXRWYWx1ZUFzRGFnKCJPcGVyYW5kcyIpOworICAgIERlZkluaXQgKk9wc09wID0gZHluYW1pY19jYXN0PERlZkluaXQqPihPcHNMaXN0LT5nZXRPcGVyYXRvcigpKTsKKyAgICAvLyBTcGVjaWFsIGNhc2VzOiBvcHMgPT0gb3V0cyA9PSBpbnMuIERpZmZlcmVudCBuYW1lcyBhcmUgdXNlZCB0bworICAgIC8vIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgaWYgKCFPcHNPcCB8fAorICAgICAgICAoT3BzT3AtPmdldERlZigpLT5nZXROYW1lKCkgIT0gIm9wcyIgJiYKKyAgICAgICAgIE9wc09wLT5nZXREZWYoKS0+Z2V0TmFtZSgpICE9ICJvdXRzIiAmJgorICAgICAgICAgT3BzT3AtPmdldERlZigpLT5nZXROYW1lKCkgIT0gImlucyIpKQorICAgICAgUC0+ZXJyb3IoIk9wZXJhbmRzIGxpc3Qgc2hvdWxkIHN0YXJ0IHdpdGggJyhvcHMgLi4uICchIik7CisgICAgCisgICAgLy8gQ29weSBvdmVyIHRoZSBhcmd1bWVudHMuICAgICAgIAorICAgIEFyZ3MuY2xlYXIoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gT3BzTGlzdC0+Z2V0TnVtQXJncygpOyBqICE9IGU7ICsraikgeworICAgICAgaWYgKCFkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KE9wc0xpc3QtPmdldEFyZyhqKSkgfHwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxEZWZJbml0Kj4oT3BzTGlzdC0+Z2V0QXJnKGopKS0+CisgICAgICAgICAgZ2V0RGVmKCktPmdldE5hbWUoKSAhPSAibm9kZSIpCisgICAgICAgIFAtPmVycm9yKCJPcGVyYW5kcyBsaXN0IHNob3VsZCBhbGwgYmUgJ25vZGUnIHZhbHVlcy4iKTsKKyAgICAgIGlmIChPcHNMaXN0LT5nZXRBcmdOYW1lKGopLmVtcHR5KCkpCisgICAgICAgIFAtPmVycm9yKCJPcGVyYW5kcyBsaXN0IHNob3VsZCBoYXZlIG5hbWVzIGZvciBlYWNoIG9wZXJhbmQhIik7CisgICAgICBpZiAoIU9wZXJhbmRzU2V0LmNvdW50KE9wc0xpc3QtPmdldEFyZ05hbWUoaikpKQorICAgICAgICBQLT5lcnJvcigiJyIgKyBPcHNMaXN0LT5nZXRBcmdOYW1lKGopICsKKyAgICAgICAgICAgICAgICAgIicgZG9lcyBub3Qgb2NjdXIgaW4gcGF0dGVybiBvciB3YXMgbXVsdGlwbHkgc3BlY2lmaWVkISIpOworICAgICAgT3BlcmFuZHNTZXQuZXJhc2UoT3BzTGlzdC0+Z2V0QXJnTmFtZShqKSk7CisgICAgICBBcmdzLnB1c2hfYmFjayhPcHNMaXN0LT5nZXRBcmdOYW1lKGopKTsKKyAgICB9CisgICAgCisgICAgaWYgKCFPcGVyYW5kc1NldC5lbXB0eSgpKQorICAgICAgUC0+ZXJyb3IoIk9wZXJhbmRzIGxpc3QgZG9lcyBub3QgY29udGFpbiBhbiBlbnRyeSBmb3Igb3BlcmFuZCAnIiArCisgICAgICAgICAgICAgICAqT3BlcmFuZHNTZXQuYmVnaW4oKSArICInISIpOworCisgICAgLy8gSWYgdGhlcmUgaXMgYSBjb2RlIGluaXQgZm9yIHRoaXMgZnJhZ21lbnQsIGtlZXAgdHJhY2sgb2YgdGhlIGZhY3QgdGhhdAorICAgIC8vIHRoaXMgZnJhZ21lbnQgdXNlcyBpdC4KKyAgICBzdGQ6OnN0cmluZyBDb2RlID0gRnJhZ21lbnRzW2ldLT5nZXRWYWx1ZUFzQ29kZSgiUHJlZGljYXRlIik7CisgICAgaWYgKCFDb2RlLmVtcHR5KCkpCisgICAgICBQLT5nZXRPbmx5VHJlZSgpLT5hZGRQcmVkaWNhdGVGbigiUHJlZGljYXRlXyIrRnJhZ21lbnRzW2ldLT5nZXROYW1lKCkpOworICAgIAorICAgIC8vIElmIHRoZXJlIGlzIGEgbm9kZSB0cmFuc2Zvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMsIGtlZXAgdHJhY2sgb2YKKyAgICAvLyBpdC4KKyAgICBSZWNvcmQgKlRyYW5zZm9ybSA9IEZyYWdtZW50c1tpXS0+Z2V0VmFsdWVBc0RlZigiT3BlcmFuZFRyYW5zZm9ybSIpOworICAgIGlmICghZ2V0U0ROb2RlVHJhbnNmb3JtKFRyYW5zZm9ybSkuc2Vjb25kLmVtcHR5KCkpICAgIC8vIG5vdCBub29wIHhmb3JtPworICAgICAgUC0+Z2V0T25seVRyZWUoKS0+c2V0VHJhbnNmb3JtRm4oVHJhbnNmb3JtKTsKKyAgfQorICAKKyAgLy8gTm93IHRoYXQgd2UndmUgcGFyc2VkIGFsbCBvZiB0aGUgdHJlZSBmcmFnbWVudHMsIGRvIGEgY2xvc3VyZSBvbiB0aGVtIHNvCisgIC8vIHRoYXQgdGhlcmUgYXJlIG5vdCByZWZlcmVuY2VzIHRvIFBhdEZyYWdzIGxlZnQgaW5zaWRlIG9mIHRoZW0uCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGcmFnbWVudHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIFRyZWVQYXR0ZXJuICpUaGVQYXQgPSBQYXR0ZXJuRnJhZ21lbnRzW0ZyYWdtZW50c1tpXV07CisgICAgVGhlUGF0LT5JbmxpbmVQYXR0ZXJuRnJhZ21lbnRzKCk7CisgICAgICAgIAorICAgIC8vIEluZmVyIGFzIG1hbnkgdHlwZXMgYXMgcG9zc2libGUuICBEb24ndCB3b3JyeSBhYm91dCBpdCBpZiB3ZSBkb24ndCBpbmZlcgorICAgIC8vIGFsbCBvZiB0aGVtLCBzb21lIG1heSBkZXBlbmQgb24gdGhlIGlucHV0cyBvZiB0aGUgcGF0dGVybi4KKyAgICB0cnkgeworICAgICAgVGhlUGF0LT5JbmZlckFsbFR5cGVzKCk7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAvLyBJZiB0aGlzIHBhdHRlcm4gZnJhZ21lbnQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHRhcmdldCAobm8gdHlwZXMgY2FuCisgICAgICAvLyBzYXRpc2Z5IGl0cyBjb25zdHJhaW50cyksIGp1c3QgaWdub3JlIGl0LiAgSWYgdGhlIGJvZ3VzIHBhdHRlcm4gaXMKKyAgICAgIC8vIGFjdHVhbGx5IHVzZWQgYnkgaW5zdHJ1Y3Rpb25zLCB0aGUgdHlwZSBjb25zaXN0ZW5jeSBlcnJvciB3aWxsIGJlCisgICAgICAvLyByZXBvcnRlZCB0aGVyZS4KKyAgICB9CisgICAgCisgICAgLy8gSWYgZGVidWdnaW5nLCBwcmludCBvdXQgdGhlIHBhdHRlcm4gZnJhZ21lbnQgcmVzdWx0LgorICAgIERFQlVHKFRoZVBhdC0+ZHVtcCgpKTsKKyAgfQorfQorCit2b2lkIENvZGVHZW5EQUdQYXR0ZXJuczo6UGFyc2VEZWZhdWx0T3BlcmFuZHMoKSB7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IERlZmF1bHRPcHNbMl07CisgIERlZmF1bHRPcHNbMF0gPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiUHJlZGljYXRlT3BlcmFuZCIpOworICBEZWZhdWx0T3BzWzFdID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIk9wdGlvbmFsRGVmT3BlcmFuZCIpOworCisgIC8vIEZpbmQgc29tZSBTRE5vZGUuCisgIGFzc2VydCghU0ROb2Rlcy5lbXB0eSgpICYmICJObyBTRE5vZGVzIHBhcnNlZD8iKTsKKyAgSW5pdCAqU29tZVNETm9kZSA9IG5ldyBEZWZJbml0KFNETm9kZXMuYmVnaW4oKS0+Zmlyc3QpOworICAKKyAgZm9yICh1bnNpZ25lZCBpdGVyID0gMDsgaXRlciAhPSAyOyArK2l0ZXIpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVmYXVsdE9wc1tpdGVyXS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBEYWdJbml0ICpEZWZhdWx0SW5mbyA9IERlZmF1bHRPcHNbaXRlcl1baV0tPmdldFZhbHVlQXNEYWcoIkRlZmF1bHRPcHMiKTsKKyAgICAKKyAgICAgIC8vIENsb25lIHRoZSBEZWZhdWx0SW5mbyBkYWcgbm9kZSwgY2hhbmdpbmcgdGhlIG9wZXJhdG9yIGZyb20gJ29wcycgdG8KKyAgICAgIC8vIFNvbWVTRG5vZGUgc28gdGhhdCB3ZSBjYW4gcGFyc2UgdGhpcy4KKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxJbml0Kiwgc3RkOjpzdHJpbmc+ID4gT3BzOworICAgICAgZm9yICh1bnNpZ25lZCBvcCA9IDAsIGUgPSBEZWZhdWx0SW5mby0+Z2V0TnVtQXJncygpOyBvcCAhPSBlOyArK29wKQorICAgICAgICBPcHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKERlZmF1bHRJbmZvLT5nZXRBcmcob3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRJbmZvLT5nZXRBcmdOYW1lKG9wKSkpOworICAgICAgRGFnSW5pdCAqREkgPSBuZXcgRGFnSW5pdChTb21lU0ROb2RlLCAiIiwgT3BzKTsKKyAgICAKKyAgICAgIC8vIENyZWF0ZSBhIFRyZWVQYXR0ZXJuIHRvIHBhcnNlIHRoaXMuCisgICAgICBUcmVlUGF0dGVybiBQKERlZmF1bHRPcHNbaXRlcl1baV0sIERJLCBmYWxzZSwgKnRoaXMpOworICAgICAgYXNzZXJ0KFAuZ2V0TnVtVHJlZXMoKSA9PSAxICYmICJUaGlzIGN0b3IgY2FuIG9ubHkgcHJvZHVjZSBvbmUgdHJlZSEiKTsKKworICAgICAgLy8gQ29weSB0aGUgb3BlcmFuZHMgb3ZlciBpbnRvIGEgREFHRGVmYXVsdE9wZXJhbmQuCisgICAgICBEQUdEZWZhdWx0T3BlcmFuZCBEZWZhdWx0T3BJbmZvOworICAgIAorICAgICAgVHJlZVBhdHRlcm5Ob2RlICpUID0gUC5nZXRUcmVlKDApOworICAgICAgZm9yICh1bnNpZ25lZCBvcCA9IDAsIGUgPSBULT5nZXROdW1DaGlsZHJlbigpOyBvcCAhPSBlOyArK29wKSB7CisgICAgICAgIFRyZWVQYXR0ZXJuTm9kZSAqVFBOID0gVC0+Z2V0Q2hpbGQob3ApOworICAgICAgICB3aGlsZSAoVFBOLT5BcHBseVR5cGVDb25zdHJhaW50cyhQLCBmYWxzZSkpCisgICAgICAgICAgLyogUmVzb2x2ZSBhbGwgdHlwZXMgKi87CisgICAgICAKKyAgICAgICAgaWYgKFRQTi0+Q29udGFpbnNVbnJlc29sdmVkVHlwZSgpKSB7CisgICAgICAgICAgaWYgKGl0ZXIgPT0gMCkKKyAgICAgICAgICAgIHRocm93ICJWYWx1ZSAjIiArIHV0b3N0cihpKSArICIgb2YgUHJlZGljYXRlT3BlcmFuZCAnIiArCisgICAgICAgICAgICAgIERlZmF1bHRPcHNbaXRlcl1baV0tPmdldE5hbWUoKSArIicgZG9lc24ndCBoYXZlIGEgY29uY3JldGUgdHlwZSEiOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93ICJWYWx1ZSAjIiArIHV0b3N0cihpKSArICIgb2YgT3B0aW9uYWxEZWZPcGVyYW5kICciICsKKyAgICAgICAgICAgICAgRGVmYXVsdE9wc1tpdGVyXVtpXS0+Z2V0TmFtZSgpICsiJyBkb2Vzbid0IGhhdmUgYSBjb25jcmV0ZSB0eXBlISI7CisgICAgICAgIH0KKyAgICAgICAgRGVmYXVsdE9wSW5mby5EZWZhdWx0T3BzLnB1c2hfYmFjayhUUE4pOworICAgICAgfQorCisgICAgICAvLyBJbnNlcnQgaXQgaW50byB0aGUgRGVmYXVsdE9wZXJhbmRzIG1hcCBzbyB3ZSBjYW4gZmluZCBpdCBsYXRlci4KKyAgICAgIERlZmF1bHRPcGVyYW5kc1tEZWZhdWx0T3BzW2l0ZXJdW2ldXSA9IERlZmF1bHRPcEluZm87CisgICAgfQorICB9Cit9CisKKy8vLyBIYW5kbGVVc2UgLSBHaXZlbiAiUGF0IiBhIGxlYWYgaW4gdGhlIHBhdHRlcm4sIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhbgorLy8vIGluc3RydWN0aW9uIGlucHV0LiAgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHJlYWwgdXNlLgorc3RhdGljIGJvb2wgSGFuZGxlVXNlKFRyZWVQYXR0ZXJuICpJLCBUcmVlUGF0dGVybk5vZGUgKlBhdCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVHJlZVBhdHRlcm5Ob2RlKj4gJkluc3RJbnB1dHMpIHsKKyAgLy8gTm8gbmFtZSAtPiBub3QgaW50ZXJlc3RpbmcuCisgIGlmIChQYXQtPmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgaWYgKFBhdC0+aXNMZWFmKCkpIHsKKyAgICAgIERlZkluaXQgKkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihQYXQtPmdldExlYWZWYWx1ZSgpKTsKKyAgICAgIGlmIChESSAmJiBESS0+Z2V0RGVmKCktPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXJDbGFzcyIpKQorICAgICAgICBJLT5lcnJvcigiSW5wdXQgIiArIERJLT5nZXREZWYoKS0+Z2V0TmFtZSgpICsgIiBtdXN0IGJlIG5hbWVkISIpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBSZWNvcmQgKlJlYzsKKyAgaWYgKFBhdC0+aXNMZWFmKCkpIHsKKyAgICBEZWZJbml0ICpESSA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oUGF0LT5nZXRMZWFmVmFsdWUoKSk7CisgICAgaWYgKCFESSkgSS0+ZXJyb3IoIklucHV0ICQiICsgUGF0LT5nZXROYW1lKCkgKyAiIG11c3QgYmUgYW4gaWRlbnRpZmllciEiKTsKKyAgICBSZWMgPSBESS0+Z2V0RGVmKCk7CisgIH0gZWxzZSB7CisgICAgUmVjID0gUGF0LT5nZXRPcGVyYXRvcigpOworICB9CisKKyAgLy8gU1JDVkFMVUUgbm9kZXMgYXJlIGlnbm9yZWQuCisgIGlmIChSZWMtPmdldE5hbWUoKSA9PSAic3JjdmFsdWUiKQorICAgIHJldHVybiBmYWxzZTsKKworICBUcmVlUGF0dGVybk5vZGUgKiZTbG90ID0gSW5zdElucHV0c1tQYXQtPmdldE5hbWUoKV07CisgIGlmICghU2xvdCkgeworICAgIFNsb3QgPSBQYXQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgUmVjb3JkICpTbG90UmVjOworICBpZiAoU2xvdC0+aXNMZWFmKCkpIHsKKyAgICBTbG90UmVjID0gZHluYW1pY19jYXN0PERlZkluaXQqPihTbG90LT5nZXRMZWFmVmFsdWUoKSktPmdldERlZigpOworICB9IGVsc2UgeworICAgIGFzc2VydChTbG90LT5nZXROdW1DaGlsZHJlbigpID09IDAgJiYgImNhbid0IGJlIGEgdXNlIHdpdGggY2hpbGRyZW4hIik7CisgICAgU2xvdFJlYyA9IFNsb3QtPmdldE9wZXJhdG9yKCk7CisgIH0KKyAgCisgIC8vIEVuc3VyZSB0aGF0IHRoZSBpbnB1dHMgYWdyZWUgaWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgaW5wdXQuCisgIGlmIChSZWMgIT0gU2xvdFJlYykKKyAgICBJLT5lcnJvcigiQWxsICQiICsgUGF0LT5nZXROYW1lKCkgKyAiIGlucHV0cyBtdXN0IGFncmVlIHdpdGggZWFjaCBvdGhlciIpOworICBpZiAoU2xvdC0+Z2V0RXh0VHlwZXMoKSAhPSBQYXQtPmdldEV4dFR5cGVzKCkpCisgICAgSS0+ZXJyb3IoIkFsbCAkIiArIFBhdC0+Z2V0TmFtZSgpICsgIiBpbnB1dHMgbXVzdCBhZ3JlZSB3aXRoIGVhY2ggb3RoZXIiKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLyBGaW5kUGF0dGVybklucHV0c0FuZE91dHB1dHMgLSBTY2FuIHRoZSBzcGVjaWZpZWQgVHJlZVBhdHRlcm5Ob2RlICh3aGljaCBpcworLy8vIHBhcnQgb2YgIkkiLCB0aGUgaW5zdHJ1Y3Rpb24pLCBjb21wdXRpbmcgdGhlIHNldCBvZiBpbnB1dHMgYW5kIG91dHB1dHMgb2YKKy8vLyB0aGUgcGF0dGVybi4gIFJlcG9ydCBlcnJvcnMgaWYgd2Ugc2VlIGFueXRoaW5nIG5hdWdodHkuCit2b2lkIENvZGVHZW5EQUdQYXR0ZXJuczo6CitGaW5kUGF0dGVybklucHV0c0FuZE91dHB1dHMoVHJlZVBhdHRlcm4gKkksIFRyZWVQYXR0ZXJuTm9kZSAqUGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUcmVlUGF0dGVybk5vZGUqPiAmSW5zdElucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVHJlZVBhdHRlcm5Ob2RlKj4mSW5zdFJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJkluc3RJbXBSZXN1bHRzKSB7CisgIGlmIChQYXQtPmlzTGVhZigpKSB7CisgICAgYm9vbCBpc1VzZSA9IEhhbmRsZVVzZShJLCBQYXQsIEluc3RJbnB1dHMpOworICAgIGlmICghaXNVc2UgJiYgUGF0LT5nZXRUcmFuc2Zvcm1GbigpKQorICAgICAgSS0+ZXJyb3IoIkNhbm5vdCBzcGVjaWZ5IGEgdHJhbnNmb3JtIGZ1bmN0aW9uIGZvciBhIG5vbi1pbnB1dCB2YWx1ZSEiKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIGlmIChQYXQtPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKSA9PSAiaW1wbGljaXQiKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBhdC0+Z2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFRyZWVQYXR0ZXJuTm9kZSAqRGVzdCA9IFBhdC0+Z2V0Q2hpbGQoaSk7CisgICAgICBpZiAoIURlc3QtPmlzTGVhZigpKQorICAgICAgICBJLT5lcnJvcigiaW1wbGljaXRseSBkZWZpbmVkIHZhbHVlIHNob3VsZCBiZSBhIHJlZ2lzdGVyISIpOworICAgIAorICAgICAgRGVmSW5pdCAqVmFsID0gZHluYW1pY19jYXN0PERlZkluaXQqPihEZXN0LT5nZXRMZWFmVmFsdWUoKSk7CisgICAgICBpZiAoIVZhbCB8fCAhVmFsLT5nZXREZWYoKS0+aXNTdWJDbGFzc09mKCJSZWdpc3RlciIpKQorICAgICAgICBJLT5lcnJvcigiaW1wbGljaXRseSBkZWZpbmVkIHZhbHVlIHNob3VsZCBiZSBhIHJlZ2lzdGVyISIpOworICAgICAgSW5zdEltcFJlc3VsdHMucHVzaF9iYWNrKFZhbC0+Z2V0RGVmKCkpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgCisgIGlmIChQYXQtPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKSAhPSAic2V0IikgeworICAgIC8vIElmIHRoaXMgaXMgbm90IGEgc2V0LCB2ZXJpZnkgdGhhdCB0aGUgY2hpbGRyZW4gbm9kZXMgYXJlIG5vdCB2b2lkIHR5cGVkLAorICAgIC8vIGFuZCByZWN1cnNlLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQYXQtPmdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoUGF0LT5nZXRDaGlsZChpKS0+Z2V0TnVtVHlwZXMoKSA9PSAwKQorICAgICAgICBJLT5lcnJvcigiQ2Fubm90IGhhdmUgdm9pZCBub2RlcyBpbnNpZGUgb2YgcGF0dGVybnMhIik7CisgICAgICBGaW5kUGF0dGVybklucHV0c0FuZE91dHB1dHMoSSwgUGF0LT5nZXRDaGlsZChpKSwgSW5zdElucHV0cywgSW5zdFJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdEltcFJlc3VsdHMpOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGEgbm9uLWxlYWYgbm9kZSB3aXRoIG5vIGNoaWxkcmVuLCB0cmVhdCBpdCBiYXNpY2FsbHkgYXMgaWYKKyAgICAvLyBpdCB3ZXJlIGEgbGVhZi4gIFRoaXMgaGFuZGxlcyBub2RlcyBsaWtlIChpbW0pLgorICAgIGJvb2wgaXNVc2UgPSBIYW5kbGVVc2UoSSwgUGF0LCBJbnN0SW5wdXRzKTsKKyAgICAKKyAgICBpZiAoIWlzVXNlICYmIFBhdC0+Z2V0VHJhbnNmb3JtRm4oKSkKKyAgICAgIEktPmVycm9yKCJDYW5ub3Qgc3BlY2lmeSBhIHRyYW5zZm9ybSBmdW5jdGlvbiBmb3IgYSBub24taW5wdXQgdmFsdWUhIik7CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBPdGhlcndpc2UsIHRoaXMgaXMgYSBzZXQsIHZhbGlkYXRlIGFuZCBjb2xsZWN0IGluc3RydWN0aW9uIHJlc3VsdHMuCisgIGlmIChQYXQtPmdldE51bUNoaWxkcmVuKCkgPT0gMCkKKyAgICBJLT5lcnJvcigic2V0IHJlcXVpcmVzIG9wZXJhbmRzISIpOworICAKKyAgaWYgKFBhdC0+Z2V0VHJhbnNmb3JtRm4oKSkKKyAgICBJLT5lcnJvcigiQ2Fubm90IHNwZWNpZnkgYSB0cmFuc2Zvcm0gZnVuY3Rpb24gb24gYSBzZXQgbm9kZSEiKTsKKyAgCisgIC8vIENoZWNrIHRoZSBzZXQgZGVzdGluYXRpb25zLgorICB1bnNpZ25lZCBOdW1EZXN0cyA9IFBhdC0+Z2V0TnVtQ2hpbGRyZW4oKS0xOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bURlc3RzOyArK2kpIHsKKyAgICBUcmVlUGF0dGVybk5vZGUgKkRlc3QgPSBQYXQtPmdldENoaWxkKGkpOworICAgIGlmICghRGVzdC0+aXNMZWFmKCkpCisgICAgICBJLT5lcnJvcigic2V0IGRlc3RpbmF0aW9uIHNob3VsZCBiZSBhIHJlZ2lzdGVyISIpOworICAgIAorICAgIERlZkluaXQgKlZhbCA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oRGVzdC0+Z2V0TGVhZlZhbHVlKCkpOworICAgIGlmICghVmFsKQorICAgICAgSS0+ZXJyb3IoInNldCBkZXN0aW5hdGlvbiBzaG91bGQgYmUgYSByZWdpc3RlciEiKTsKKworICAgIGlmIChWYWwtPmdldERlZigpLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyQ2xhc3MiKSB8fAorICAgICAgICBWYWwtPmdldERlZigpLT5pc1N1YkNsYXNzT2YoIlBvaW50ZXJMaWtlUmVnQ2xhc3MiKSkgeworICAgICAgaWYgKERlc3QtPmdldE5hbWUoKS5lbXB0eSgpKQorICAgICAgICBJLT5lcnJvcigic2V0IGRlc3RpbmF0aW9uIG11c3QgaGF2ZSBhIG5hbWUhIik7CisgICAgICBpZiAoSW5zdFJlc3VsdHMuY291bnQoRGVzdC0+Z2V0TmFtZSgpKSkKKyAgICAgICAgSS0+ZXJyb3IoImNhbm5vdCBzZXQgJyIgKyBEZXN0LT5nZXROYW1lKCkgKyInIG11bHRpcGxlIHRpbWVzIik7CisgICAgICBJbnN0UmVzdWx0c1tEZXN0LT5nZXROYW1lKCldID0gRGVzdDsKKyAgICB9IGVsc2UgaWYgKFZhbC0+Z2V0RGVmKCktPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXIiKSkgeworICAgICAgSW5zdEltcFJlc3VsdHMucHVzaF9iYWNrKFZhbC0+Z2V0RGVmKCkpOworICAgIH0gZWxzZSB7CisgICAgICBJLT5lcnJvcigic2V0IGRlc3RpbmF0aW9uIHNob3VsZCBiZSBhIHJlZ2lzdGVyISIpOworICAgIH0KKyAgfQorICAgIAorICAvLyBWZXJpZnkgYW5kIGNvbGxlY3QgaW5mbyBmcm9tIHRoZSBjb21wdXRhdGlvbi4KKyAgRmluZFBhdHRlcm5JbnB1dHNBbmRPdXRwdXRzKEksIFBhdC0+Z2V0Q2hpbGQoTnVtRGVzdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdElucHV0cywgSW5zdFJlc3VsdHMsIEluc3RJbXBSZXN1bHRzKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIEFuYWx5c2lzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBJbnN0QW5hbHl6ZXIgeworICBjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNEUDsKKyAgYm9vbCAmbWF5U3RvcmU7CisgIGJvb2wgJm1heUxvYWQ7CisgIGJvb2wgJkhhc1NpZGVFZmZlY3RzOworICBib29sICZJc1ZhcmlhZGljOworcHVibGljOgorICBJbnN0QW5hbHl6ZXIoY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZjZHAsCisgICAgICAgICAgICAgICBib29sICZtYXlzdG9yZSwgYm9vbCAmbWF5bG9hZCwgYm9vbCAmaHNlLCBib29sICZpc3YpCisgICAgOiBDRFAoY2RwKSwgbWF5U3RvcmUobWF5c3RvcmUpLCBtYXlMb2FkKG1heWxvYWQpLCBIYXNTaWRlRWZmZWN0cyhoc2UpLAorICAgICAgSXNWYXJpYWRpYyhpc3YpIHsKKyAgfQorCisgIC8vLyBBbmFseXplIC0gQW5hbHl6ZSB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLCByZXR1cm5pbmcgdHJ1ZSBpZiB0aGUKKyAgLy8vIGluc3RydWN0aW9uIGhhZCBhIHBhdHRlcm4uCisgIGJvb2wgQW5hbHl6ZShSZWNvcmQgKkluc3RSZWNvcmQpIHsKKyAgICBjb25zdCBUcmVlUGF0dGVybiAqUGF0dGVybiA9IENEUC5nZXRJbnN0cnVjdGlvbihJbnN0UmVjb3JkKS5nZXRQYXR0ZXJuKCk7CisgICAgaWYgKFBhdHRlcm4gPT0gMCkgeworICAgICAgSGFzU2lkZUVmZmVjdHMgPSAxOworICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gTm8gcGF0dGVybi4KKyAgICB9CisKKyAgICAvLyBGSVhNRTogQXNzdW1lIG9ubHkgdGhlIGZpcnN0IHRyZWUgaXMgdGhlIHBhdHRlcm4uIFRoZSBvdGhlcnMgYXJlIGNsb2JiZXIKKyAgICAvLyBub2Rlcy4KKyAgICBBbmFseXplTm9kZShQYXR0ZXJuLT5nZXRUcmVlKDApKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIEFuYWx5emVOb2RlKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTikgeworICAgIGlmIChOLT5pc0xlYWYoKSkgeworICAgICAgaWYgKERlZkluaXQgKkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihOLT5nZXRMZWFmVmFsdWUoKSkpIHsKKyAgICAgICAgUmVjb3JkICpMZWFmUmVjID0gREktPmdldERlZigpOworICAgICAgICAvLyBIYW5kbGUgQ29tcGxleFBhdHRlcm4gbGVhdmVzLgorICAgICAgICBpZiAoTGVhZlJlYy0+aXNTdWJDbGFzc09mKCJDb21wbGV4UGF0dGVybiIpKSB7CisgICAgICAgICAgY29uc3QgQ29tcGxleFBhdHRlcm4gJkNQID0gQ0RQLmdldENvbXBsZXhQYXR0ZXJuKExlYWZSZWMpOworICAgICAgICAgIGlmIChDUC5oYXNQcm9wZXJ0eShTRE5QTWF5U3RvcmUpKSBtYXlTdG9yZSA9IHRydWU7CisgICAgICAgICAgaWYgKENQLmhhc1Byb3BlcnR5KFNETlBNYXlMb2FkKSkgbWF5TG9hZCA9IHRydWU7CisgICAgICAgICAgaWYgKENQLmhhc1Byb3BlcnR5KFNETlBTaWRlRWZmZWN0KSkgSGFzU2lkZUVmZmVjdHMgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQW5hbHl6ZSBjaGlsZHJlbi4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpCisgICAgICBBbmFseXplTm9kZShOLT5nZXRDaGlsZChpKSk7CisKKyAgICAvLyBJZ25vcmUgc2V0IG5vZGVzLCB3aGljaCBhcmUgbm90IFNETm9kZXMuCisgICAgaWYgKE4tPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKSA9PSAic2V0IikKKyAgICAgIHJldHVybjsKKworICAgIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU0ROb2RlIGZvciB0aGUgb3BlcmF0b3IuCisgICAgY29uc3QgU0ROb2RlSW5mbyAmT3BJbmZvID0gQ0RQLmdldFNETm9kZUluZm8oTi0+Z2V0T3BlcmF0b3IoKSk7CisKKyAgICAvLyBOb3RpY2UgcHJvcGVydGllcyBvZiB0aGUgbm9kZS4KKyAgICBpZiAoT3BJbmZvLmhhc1Byb3BlcnR5KFNETlBNYXlTdG9yZSkpIG1heVN0b3JlID0gdHJ1ZTsKKyAgICBpZiAoT3BJbmZvLmhhc1Byb3BlcnR5KFNETlBNYXlMb2FkKSkgbWF5TG9hZCA9IHRydWU7CisgICAgaWYgKE9wSW5mby5oYXNQcm9wZXJ0eShTRE5QU2lkZUVmZmVjdCkpIEhhc1NpZGVFZmZlY3RzID0gdHJ1ZTsKKyAgICBpZiAoT3BJbmZvLmhhc1Byb3BlcnR5KFNETlBWYXJpYWRpYykpIElzVmFyaWFkaWMgPSB0cnVlOworCisgICAgaWYgKGNvbnN0IENvZGVHZW5JbnRyaW5zaWMgKkludEluZm8gPSBOLT5nZXRJbnRyaW5zaWNJbmZvKENEUCkpIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgYW4gaW50cmluc2ljLCBhbmFseXplIGl0LgorICAgICAgaWYgKEludEluZm8tPk1vZFJlZiA+PSBDb2RlR2VuSW50cmluc2ljOjpSZWFkQXJnTWVtKQorICAgICAgICBtYXlMb2FkID0gdHJ1ZTsvLyBUaGVzZSBtYXkgbG9hZCBtZW1vcnkuCisKKyAgICAgIGlmIChJbnRJbmZvLT5Nb2RSZWYgPj0gQ29kZUdlbkludHJpbnNpYzo6UmVhZFdyaXRlQXJnTWVtKQorICAgICAgICBtYXlTdG9yZSA9IHRydWU7Ly8gSW50cmluc2ljcyB0aGF0IGNhbiB3cml0ZSB0byBtZW1vcnkgYXJlICdtYXlTdG9yZScuCisKKyAgICAgIGlmIChJbnRJbmZvLT5Nb2RSZWYgPj0gQ29kZUdlbkludHJpbnNpYzo6UmVhZFdyaXRlTWVtKQorICAgICAgICAvLyBXcml0ZU1lbSBpbnRyaW5zaWNzIGNhbiBoYXZlIG90aGVyIHN0cmFuZ2UgZWZmZWN0cy4KKyAgICAgICAgSGFzU2lkZUVmZmVjdHMgPSB0cnVlOworICAgIH0KKyAgfQorCit9OworCitzdGF0aWMgdm9pZCBJbmZlckZyb21QYXR0ZXJuKGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmTWF5U3RvcmUsIGJvb2wgJk1heUxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc1NpZGVFZmZlY3RzLCBib29sICZJc1ZhcmlhZGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNEUCkgeworICBNYXlTdG9yZSA9IE1heUxvYWQgPSBIYXNTaWRlRWZmZWN0cyA9IElzVmFyaWFkaWMgPSBmYWxzZTsKKworICBib29sIEhhZFBhdHRlcm4gPQorICAgIEluc3RBbmFseXplcihDRFAsIE1heVN0b3JlLCBNYXlMb2FkLCBIYXNTaWRlRWZmZWN0cywgSXNWYXJpYWRpYykKKyAgICAuQW5hbHl6ZShJbnN0LlRoZURlZik7CisKKyAgLy8gSW5zdEFuYWx5emVyIG9ubHkgY29ycmVjdGx5IGFuYWx5emVzIG1heVN0b3JlL21heUxvYWQgc28gZmFyLgorICBpZiAoSW5zdC5tYXlTdG9yZSkgeyAgLy8gSWYgdGhlIC50ZCBmaWxlIGV4cGxpY2l0bHkgc2V0cyBtYXlTdG9yZSwgdXNlIGl0LgorICAgIC8vIElmIHdlIGRlY2lkZWQgdGhhdCB0aGlzIGlzIGEgc3RvcmUgZnJvbSB0aGUgcGF0dGVybiwgdGhlbiB0aGUgLnRkIGZpbGUKKyAgICAvLyBlbnRyeSBpcyByZWR1bmRhbnQuCisgICAgaWYgKE1heVN0b3JlKQorICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICJXYXJuaW5nOiBtYXlTdG9yZSBmbGFnIGV4cGxpY2l0bHkgc2V0IG9uIGluc3RydWN0aW9uICclcyciCisgICAgICAgICAgICAgICIgYnV0IGZsYWcgYWxyZWFkeSBpbmZlcnJlZCBmcm9tIHBhdHRlcm4uXG4iLAorICAgICAgICAgICAgICBJbnN0LlRoZURlZi0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgIE1heVN0b3JlID0gdHJ1ZTsKKyAgfQorCisgIGlmIChJbnN0Lm1heUxvYWQpIHsgIC8vIElmIHRoZSAudGQgZmlsZSBleHBsaWNpdGx5IHNldHMgbWF5TG9hZCwgdXNlIGl0LgorICAgIC8vIElmIHdlIGRlY2lkZWQgdGhhdCB0aGlzIGlzIGEgbG9hZCBmcm9tIHRoZSBwYXR0ZXJuLCB0aGVuIHRoZSAudGQgZmlsZQorICAgIC8vIGVudHJ5IGlzIHJlZHVuZGFudC4KKyAgICBpZiAoTWF5TG9hZCkKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiV2FybmluZzogbWF5TG9hZCBmbGFnIGV4cGxpY2l0bHkgc2V0IG9uIGluc3RydWN0aW9uICclcyciCisgICAgICAgICAgICAgICIgYnV0IGZsYWcgYWxyZWFkeSBpbmZlcnJlZCBmcm9tIHBhdHRlcm4uXG4iLAorICAgICAgICAgICAgICBJbnN0LlRoZURlZi0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgIE1heUxvYWQgPSB0cnVlOworICB9CisKKyAgaWYgKEluc3QubmV2ZXJIYXNTaWRlRWZmZWN0cykgeworICAgIGlmIChIYWRQYXR0ZXJuKQorICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBuZXZlckhhc1NpZGVFZmZlY3RzIHNldCBvbiBpbnN0cnVjdGlvbiAnJXMnICIKKyAgICAgICAgICAgICAgIndoaWNoIGFscmVhZHkgaGFzIGEgcGF0dGVyblxuIiwgSW5zdC5UaGVEZWYtPmdldE5hbWUoKS5jX3N0cigpKTsKKyAgICBIYXNTaWRlRWZmZWN0cyA9IGZhbHNlOworICB9CisKKyAgaWYgKEluc3QuaGFzU2lkZUVmZmVjdHMpIHsKKyAgICBpZiAoSGFzU2lkZUVmZmVjdHMpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGhhc1NpZGVFZmZlY3RzIHNldCBvbiBpbnN0cnVjdGlvbiAnJXMnICIKKyAgICAgICAgICAgICAgIndoaWNoIGFscmVhZHkgaW5mZXJyZWQgdGhpcy5cbiIsIEluc3QuVGhlRGVmLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgSGFzU2lkZUVmZmVjdHMgPSB0cnVlOworICB9CisgIAorICBpZiAoSW5zdC5pc1ZhcmlhZGljKQorICAgIElzVmFyaWFkaWMgPSB0cnVlOyAgLy8gQ2FuIHdhcm4gaWYgd2Ugd2FudC4KK30KKworLy8vIFBhcnNlSW5zdHJ1Y3Rpb25zIC0gUGFyc2UgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMsIGlubGluaW5nIGFuZCByZXNvbHZpbmcKKy8vLyBhbnkgZnJhZ21lbnRzIGludm9sdmVkLiAgVGhpcyBwb3B1bGF0ZXMgdGhlIEluc3RydWN0aW9ucyBsaXN0IHdpdGggZnVsbHkKKy8vLyByZXNvbHZlZCBpbnN0cnVjdGlvbnMuCit2b2lkIENvZGVHZW5EQUdQYXR0ZXJuczo6UGFyc2VJbnN0cnVjdGlvbnMoKSB7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEluc3RycyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJJbnN0cnVjdGlvbiIpOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3Rycy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgTGlzdEluaXQgKkxJID0gMDsKKyAgICAKKyAgICBpZiAoZHluYW1pY19jYXN0PExpc3RJbml0Kj4oSW5zdHJzW2ldLT5nZXRWYWx1ZUluaXQoIlBhdHRlcm4iKSkpCisgICAgICBMSSA9IEluc3Ryc1tpXS0+Z2V0VmFsdWVBc0xpc3RJbml0KCJQYXR0ZXJuIik7CisgICAgCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gcGF0dGVybiwgb25seSBjb2xsZWN0IG1pbmltYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgICAgLy8gaW5zdHJ1Y3Rpb24gZm9yIGl0cyBvcGVyYW5kIGxpc3QuICBXZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZXJlIGlzIG9uZQorICAgIC8vIHJlc3VsdCwgYXMgd2UgaGF2ZSBubyBkZXRhaWxlZCBpbmZvLgorICAgIGlmICghTEkgfHwgTEktPmdldFNpemUoKSA9PSAwKSB7CisgICAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBSZXN1bHRzOworICAgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gT3BlcmFuZHM7CisgICAgICAKKyAgICAgIENvZGVHZW5JbnN0cnVjdGlvbiAmSW5zdEluZm8gPSBUYXJnZXQuZ2V0SW5zdHJ1Y3Rpb24oSW5zdHJzW2ldKTsKKworICAgICAgaWYgKEluc3RJbmZvLk9wZXJhbmRMaXN0LnNpemUoKSAhPSAwKSB7CisgICAgICAgIGlmIChJbnN0SW5mby5OdW1EZWZzID09IDApIHsKKyAgICAgICAgICAvLyBUaGVzZSBwcm9kdWNlIG5vIHJlc3VsdHMKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gSW5zdEluZm8uT3BlcmFuZExpc3Quc2l6ZSgpOyBqIDwgZTsgKytqKQorICAgICAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKEluc3RJbmZvLk9wZXJhbmRMaXN0W2pdLlJlYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQXNzdW1lIHRoZSBmaXJzdCBvcGVyYW5kIGlzIHRoZSByZXN1bHQuCisgICAgICAgICAgUmVzdWx0cy5wdXNoX2JhY2soSW5zdEluZm8uT3BlcmFuZExpc3RbMF0uUmVjKTsKKyAgICAgIAorICAgICAgICAgIC8vIFRoZSByZXN0IGFyZSBpbnB1dHMuCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMSwgZSA9IEluc3RJbmZvLk9wZXJhbmRMaXN0LnNpemUoKTsgaiA8IGU7ICsraikKKyAgICAgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhJbnN0SW5mby5PcGVyYW5kTGlzdFtqXS5SZWMpOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIENyZWF0ZSBhbmQgaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEltcFJlc3VsdHM7CisgICAgICBJbnN0cnVjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEluc3Ryc1tpXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIERBR0luc3RydWN0aW9uKDAsIFJlc3VsdHMsIE9wZXJhbmRzLCBJbXBSZXN1bHRzKSkpOworICAgICAgY29udGludWU7ICAvLyBubyBwYXR0ZXJuLgorICAgIH0KKyAgICAKKyAgICAvLyBQYXJzZSB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgVHJlZVBhdHRlcm4gKkkgPSBuZXcgVHJlZVBhdHRlcm4oSW5zdHJzW2ldLCBMSSwgdHJ1ZSwgKnRoaXMpOworICAgIC8vIElubGluZSBwYXR0ZXJuIGZyYWdtZW50cyBpbnRvIGl0LgorICAgIEktPklubGluZVBhdHRlcm5GcmFnbWVudHMoKTsKKyAgICAKKyAgICAvLyBJbmZlciBhcyBtYW55IHR5cGVzIGFzIHBvc3NpYmxlLiAgSWYgd2UgY2Fubm90IGluZmVyIGFsbCBvZiB0aGVtLCB3ZSBjYW4KKyAgICAvLyBuZXZlciBkbyBhbnl0aGluZyB3aXRoIHRoaXMgaW5zdHJ1Y3Rpb24gcGF0dGVybjogcmVwb3J0IGl0IHRvIHRoZSB1c2VyLgorICAgIGlmICghSS0+SW5mZXJBbGxUeXBlcygpKQorICAgICAgSS0+ZXJyb3IoIkNvdWxkIG5vdCBpbmZlciBhbGwgdHlwZXMgaW4gcGF0dGVybiEiKTsKKyAgICAKKyAgICAvLyBJbnN0SW5wdXRzIC0gS2VlcCB0cmFjayBvZiBhbGwgb2YgdGhlIGlucHV0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGFsb25nIAorICAgIC8vIHdpdGggdGhlIHJlY29yZCB0aGV5IGFyZSBkZWNsYXJlZCBhcy4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVHJlZVBhdHRlcm5Ob2RlKj4gSW5zdElucHV0czsKKyAgICAKKyAgICAvLyBJbnN0UmVzdWx0cyAtIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSB2aXJ0dWFsIHJlZ2lzdGVycyB0aGF0IGFyZSAnc2V0JworICAgIC8vIGluIHRoZSBpbnN0cnVjdGlvbiwgaW5jbHVkaW5nIHdoYXQgcmVnIGNsYXNzIHRoZXkgYXJlLgorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUcmVlUGF0dGVybk5vZGUqPiBJbnN0UmVzdWx0czsKKworICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEluc3RJbXBSZXN1bHRzOworICAgIAorICAgIC8vIFZlcmlmeSB0aGF0IHRoZSB0b3AtbGV2ZWwgZm9ybXMgaW4gdGhlIGluc3RydWN0aW9uIGFyZSBvZiB2b2lkIHR5cGUsIGFuZAorICAgIC8vIGZpbGwgaW4gdGhlIEluc3RSZXN1bHRzIG1hcC4KKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gSS0+Z2V0TnVtVHJlZXMoKTsgaiAhPSBlOyArK2opIHsKKyAgICAgIFRyZWVQYXR0ZXJuTm9kZSAqUGF0ID0gSS0+Z2V0VHJlZShqKTsKKyAgICAgIGlmIChQYXQtPmdldE51bVR5cGVzKCkgIT0gMCkKKyAgICAgICAgSS0+ZXJyb3IoIlRvcC1sZXZlbCBmb3JtcyBpbiBpbnN0cnVjdGlvbiBwYXR0ZXJuIHNob3VsZCBoYXZlIgorICAgICAgICAgICAgICAgICAiIHZvaWQgdHlwZXMiKTsKKworICAgICAgLy8gRmluZCBpbnB1dHMgYW5kIG91dHB1dHMsIGFuZCB2ZXJpZnkgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdXNlcy9kZWZzLgorICAgICAgRmluZFBhdHRlcm5JbnB1dHNBbmRPdXRwdXRzKEksIFBhdCwgSW5zdElucHV0cywgSW5zdFJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdEltcFJlc3VsdHMpOworICAgIH0KKworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBwYXR0ZXJuLCBpbnNwZWN0IHRoZSBvcGVyYW5kcworICAgIC8vIGxpc3QgZm9yIHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgZGV0ZXJtaW5lcyB0aGUgb3JkZXIgdGhhdCBvcGVyYW5kcyBhcmUKKyAgICAvLyBhZGRlZCB0byB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbiB0aGUgbm9kZSBjb3JyZXNwb25kcyB0by4KKyAgICB1bnNpZ25lZCBOdW1SZXN1bHRzID0gSW5zdFJlc3VsdHMuc2l6ZSgpOworCisgICAgLy8gUGFyc2UgdGhlIG9wZXJhbmRzIGxpc3QgZnJvbSB0aGUgKG9wcykgbGlzdCwgdmFsaWRhdGluZyBpdC4KKyAgICBhc3NlcnQoSS0+Z2V0QXJnTGlzdCgpLmVtcHR5KCkgJiYgIkFyZ3MgbGlzdCBzaG91bGQgc3RpbGwgYmUgZW1wdHkgaGVyZSEiKTsKKyAgICBDb2RlR2VuSW5zdHJ1Y3Rpb24gJkNHSSA9IFRhcmdldC5nZXRJbnN0cnVjdGlvbihJbnN0cnNbaV0pOworCisgICAgLy8gQ2hlY2sgdGhhdCBhbGwgb2YgdGhlIHJlc3VsdHMgb2NjdXIgZmlyc3QgaW4gdGhlIGxpc3QuCisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gUmVzdWx0czsKKyAgICBUcmVlUGF0dGVybk5vZGUgKlJlczBOb2RlID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVJlc3VsdHM7ICsraSkgeworICAgICAgaWYgKGkgPT0gQ0dJLk9wZXJhbmRMaXN0LnNpemUoKSkKKyAgICAgICAgSS0+ZXJyb3IoIiciICsgSW5zdFJlc3VsdHMuYmVnaW4oKS0+Zmlyc3QgKworICAgICAgICAgICAgICAgICAiJyBzZXQgYnV0IGRvZXMgbm90IGFwcGVhciBpbiBvcGVyYW5kIGxpc3QhIik7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmT3BOYW1lID0gQ0dJLk9wZXJhbmRMaXN0W2ldLk5hbWU7CisgICAgICAKKyAgICAgIC8vIENoZWNrIHRoYXQgaXQgZXhpc3RzIGluIEluc3RSZXN1bHRzLgorICAgICAgVHJlZVBhdHRlcm5Ob2RlICpSTm9kZSA9IEluc3RSZXN1bHRzW09wTmFtZV07CisgICAgICBpZiAoUk5vZGUgPT0gMCkKKyAgICAgICAgSS0+ZXJyb3IoIk9wZXJhbmQgJCIgKyBPcE5hbWUgKyAiIGRvZXMgbm90IGV4aXN0IGluIG9wZXJhbmQgbGlzdCEiKTsKKyAgICAgICAgCisgICAgICBpZiAoaSA9PSAwKQorICAgICAgICBSZXMwTm9kZSA9IFJOb2RlOworICAgICAgUmVjb3JkICpSID0gZHluYW1pY19jYXN0PERlZkluaXQqPihSTm9kZS0+Z2V0TGVhZlZhbHVlKCkpLT5nZXREZWYoKTsKKyAgICAgIGlmIChSID09IDApCisgICAgICAgIEktPmVycm9yKCJPcGVyYW5kICQiICsgT3BOYW1lICsgIiBzaG91bGQgYmUgYSBzZXQgZGVzdGluYXRpb246IGFsbCAiCisgICAgICAgICAgICAgICAgICJvdXRwdXRzIG11c3Qgb2NjdXIgYmVmb3JlIGlucHV0cyBpbiBvcGVyYW5kIGxpc3QhIik7CisgICAgICAKKyAgICAgIGlmIChDR0kuT3BlcmFuZExpc3RbaV0uUmVjICE9IFIpCisgICAgICAgIEktPmVycm9yKCJPcGVyYW5kICQiICsgT3BOYW1lICsgIiBjbGFzcyBtaXNtYXRjaCEiKTsKKyAgICAgIAorICAgICAgLy8gUmVtZW1iZXIgdGhlIHJldHVybiB0eXBlLgorICAgICAgUmVzdWx0cy5wdXNoX2JhY2soQ0dJLk9wZXJhbmRMaXN0W2ldLlJlYyk7CisgICAgICAKKyAgICAgIC8vIE9rYXksIHRoaXMgb25lIGNoZWNrcyBvdXQuCisgICAgICBJbnN0UmVzdWx0cy5lcmFzZShPcE5hbWUpOworICAgIH0KKworICAgIC8vIExvb3Agb3ZlciB0aGUgaW5wdXRzIG5leHQuICBNYWtlIGEgY29weSBvZiBJbnN0SW5wdXRzIHNvIHdlIGNhbiBkZXN0cm95CisgICAgLy8gdGhlIGNvcHkgd2hpbGUgd2UncmUgY2hlY2tpbmcgdGhlIGlucHV0cy4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVHJlZVBhdHRlcm5Ob2RlKj4gSW5zdElucHV0c0NoZWNrKEluc3RJbnB1dHMpOworCisgICAgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gUmVzdWx0Tm9kZU9wZXJhbmRzOworICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IE9wZXJhbmRzOworICAgIGZvciAodW5zaWduZWQgaSA9IE51bVJlc3VsdHMsIGUgPSBDR0kuT3BlcmFuZExpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgQ29kZUdlbkluc3RydWN0aW9uOjpPcGVyYW5kSW5mbyAmT3AgPSBDR0kuT3BlcmFuZExpc3RbaV07CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmT3BOYW1lID0gT3AuTmFtZTsKKyAgICAgIGlmIChPcE5hbWUuZW1wdHkoKSkKKyAgICAgICAgSS0+ZXJyb3IoIk9wZXJhbmQgIyIgKyB1dG9zdHIoaSkgKyAiIGluIG9wZXJhbmRzIGxpc3QgaGFzIG5vIG5hbWUhIik7CisKKyAgICAgIGlmICghSW5zdElucHV0c0NoZWNrLmNvdW50KE9wTmFtZSkpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBwcmVkaWNhdGUgb3BlcmFuZCBvciBvcHRpb25hbCBkZWYgb3BlcmFuZCB3aXRoIGFuCisgICAgICAgIC8vIERlZmF1bHRPcHMgc2V0IGZpbGxlZCBpbiwgd2UgY2FuIGlnbm9yZSB0aGlzLiAgV2hlbiB3ZSBjb2RlZ2VuIGl0LAorICAgICAgICAvLyB3ZSB3aWxsIGRvIHNvIGFzIGFsd2F5cyBleGVjdXRlZC4KKyAgICAgICAgaWYgKE9wLlJlYy0+aXNTdWJDbGFzc09mKCJQcmVkaWNhdGVPcGVyYW5kIikgfHwKKyAgICAgICAgICAgIE9wLlJlYy0+aXNTdWJDbGFzc09mKCJPcHRpb25hbERlZk9wZXJhbmQiKSkgeworICAgICAgICAgIC8vIERvZXMgaXQgaGF2ZSBhIG5vbi1lbXB0eSBEZWZhdWx0T3BzIGZpZWxkPyAgSWYgc28sIGlnbm9yZSB0aGlzCisgICAgICAgICAgLy8gb3BlcmFuZC4KKyAgICAgICAgICBpZiAoIWdldERlZmF1bHRPcGVyYW5kKE9wLlJlYykuRGVmYXVsdE9wcy5lbXB0eSgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgSS0+ZXJyb3IoIk9wZXJhbmQgJCIgKyBPcE5hbWUgKworICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgaW5zdHJ1Y3Rpb24gcGF0dGVybiIpOworICAgICAgfQorICAgICAgVHJlZVBhdHRlcm5Ob2RlICpJblZhbCA9IEluc3RJbnB1dHNDaGVja1tPcE5hbWVdOworICAgICAgSW5zdElucHV0c0NoZWNrLmVyYXNlKE9wTmFtZSk7ICAgLy8gSXQgb2NjdXJyZWQsIHJlbW92ZSBmcm9tIG1hcC4KKyAgICAgIAorICAgICAgaWYgKEluVmFsLT5pc0xlYWYoKSAmJgorICAgICAgICAgIGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oSW5WYWwtPmdldExlYWZWYWx1ZSgpKSkgeworICAgICAgICBSZWNvcmQgKkluUmVjID0gc3RhdGljX2Nhc3Q8RGVmSW5pdCo+KEluVmFsLT5nZXRMZWFmVmFsdWUoKSktPmdldERlZigpOworICAgICAgICBpZiAoT3AuUmVjICE9IEluUmVjICYmICFJblJlYy0+aXNTdWJDbGFzc09mKCJDb21wbGV4UGF0dGVybiIpKQorICAgICAgICAgIEktPmVycm9yKCJPcGVyYW5kICQiICsgT3BOYW1lICsgIidzIHJlZ2lzdGVyIGNsYXNzIGRpc2FncmVlcyIKKyAgICAgICAgICAgICAgICAgICAiIGJldHdlZW4gdGhlIG9wZXJhbmQgYW5kIHBhdHRlcm4iKTsKKyAgICAgIH0KKyAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhPcC5SZWMpOworICAgICAgCisgICAgICAvLyBDb25zdHJ1Y3QgdGhlIHJlc3VsdCBmb3IgdGhlIGRlc3QtcGF0dGVybiBvcGVyYW5kIGxpc3QuCisgICAgICBUcmVlUGF0dGVybk5vZGUgKk9wTm9kZSA9IEluVmFsLT5jbG9uZSgpOworICAgICAgCisgICAgICAvLyBObyBwcmVkaWNhdGUgaXMgdXNlZnVsIG9uIHRoZSByZXN1bHQuCisgICAgICBPcE5vZGUtPmNsZWFyUHJlZGljYXRlRm5zKCk7CisgICAgICAKKyAgICAgIC8vIFByb21vdGUgdGhlIHhmb3JtIGZ1bmN0aW9uIHRvIGJlIGFuIGV4cGxpY2l0IG5vZGUgaWYgc2V0LgorICAgICAgaWYgKFJlY29yZCAqWGZvcm0gPSBPcE5vZGUtPmdldFRyYW5zZm9ybUZuKCkpIHsKKyAgICAgICAgT3BOb2RlLT5zZXRUcmFuc2Zvcm1GbigwKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gQ2hpbGRyZW47CisgICAgICAgIENoaWxkcmVuLnB1c2hfYmFjayhPcE5vZGUpOworICAgICAgICBPcE5vZGUgPSBuZXcgVHJlZVBhdHRlcm5Ob2RlKFhmb3JtLCBDaGlsZHJlbiwgT3BOb2RlLT5nZXROdW1UeXBlcygpKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgUmVzdWx0Tm9kZU9wZXJhbmRzLnB1c2hfYmFjayhPcE5vZGUpOworICAgIH0KKyAgICAKKyAgICBpZiAoIUluc3RJbnB1dHNDaGVjay5lbXB0eSgpKQorICAgICAgSS0+ZXJyb3IoIklucHV0IG9wZXJhbmQgJCIgKyBJbnN0SW5wdXRzQ2hlY2suYmVnaW4oKS0+Zmlyc3QgKworICAgICAgICAgICAgICAgIiBvY2N1cnMgaW4gcGF0dGVybiBidXQgbm90IGluIG9wZXJhbmRzIGxpc3QhIik7CisKKyAgICBUcmVlUGF0dGVybk5vZGUgKlJlc3VsdFBhdHRlcm4gPQorICAgICAgbmV3IFRyZWVQYXR0ZXJuTm9kZShJLT5nZXRSZWNvcmQoKSwgUmVzdWx0Tm9kZU9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXROdW1Ob2RlUmVzdWx0cyhJLT5nZXRSZWNvcmQoKSwgKnRoaXMpKTsKKyAgICAvLyBDb3B5IGZ1bGx5IGluZmVycmVkIG91dHB1dCBub2RlIHR5cGUgdG8gaW5zdHJ1Y3Rpb24gcmVzdWx0IHBhdHRlcm4uCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1SZXN1bHRzOyArK2kpCisgICAgICBSZXN1bHRQYXR0ZXJuLT5zZXRUeXBlKGksIFJlczBOb2RlLT5nZXRFeHRUeXBlKGkpKTsKKworICAgIC8vIENyZWF0ZSBhbmQgaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbi4KKyAgICAvLyBGSVhNRTogSW5zdEltcFJlc3VsdHMgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mIERBR0luc3RydWN0aW9uLgorICAgIERBR0luc3RydWN0aW9uIFRoZUluc3QoSSwgUmVzdWx0cywgT3BlcmFuZHMsIEluc3RJbXBSZXN1bHRzKTsKKyAgICBJbnN0cnVjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEktPmdldFJlY29yZCgpLCBUaGVJbnN0KSk7CisKKyAgICAvLyBVc2UgYSB0ZW1wb3JhcnkgdHJlZSBwYXR0ZXJuIHRvIGluZmVyIGFsbCB0eXBlcyBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlCisgICAgLy8gY29uc3RydWN0ZWQgcmVzdWx0IGlzIGNvcnJlY3QuICBUaGlzIGRlcGVuZHMgb24gdGhlIGluc3RydWN0aW9uIGFscmVhZHkKKyAgICAvLyBiZWluZyBpbnNlcnRlZCBpbnRvIHRoZSBJbnN0cnVjdGlvbnMgbWFwLgorICAgIFRyZWVQYXR0ZXJuIFRlbXAoSS0+Z2V0UmVjb3JkKCksIFJlc3VsdFBhdHRlcm4sIGZhbHNlLCAqdGhpcyk7CisgICAgVGVtcC5JbmZlckFsbFR5cGVzKCZJLT5nZXROYW1lZE5vZGVzTWFwKCkpOworCisgICAgREFHSW5zdHJ1Y3Rpb24gJlRoZUluc2VydGVkSW5zdCA9IEluc3RydWN0aW9ucy5maW5kKEktPmdldFJlY29yZCgpKS0+c2Vjb25kOworICAgIFRoZUluc2VydGVkSW5zdC5zZXRSZXN1bHRQYXR0ZXJuKFRlbXAuZ2V0T25seVRyZWUoKSk7CisgICAgCisgICAgREVCVUcoSS0+ZHVtcCgpKTsKKyAgfQorICAgCisgIC8vIElmIHdlIGNhbiwgY29udmVydCB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhdHRlcm5zIHRoYXQgYXJlIG1hdGNoZWQhCisgIGZvciAoc3RkOjptYXA8UmVjb3JkKiwgREFHSW5zdHJ1Y3Rpb24sIFJlY29yZFB0ckNtcD46Oml0ZXJhdG9yIElJID0KKyAgICAgICAgSW5zdHJ1Y3Rpb25zLmJlZ2luKCksCisgICAgICAgRSA9IEluc3RydWN0aW9ucy5lbmQoKTsgSUkgIT0gRTsgKytJSSkgeworICAgIERBR0luc3RydWN0aW9uICZUaGVJbnN0ID0gSUktPnNlY29uZDsKKyAgICBjb25zdCBUcmVlUGF0dGVybiAqSSA9IFRoZUluc3QuZ2V0UGF0dGVybigpOworICAgIGlmIChJID09IDApIGNvbnRpbnVlOyAgLy8gTm8gcGF0dGVybi4KKworICAgIC8vIEZJWE1FOiBBc3N1bWUgb25seSB0aGUgZmlyc3QgdHJlZSBpcyB0aGUgcGF0dGVybi4gVGhlIG90aGVycyBhcmUgY2xvYmJlcgorICAgIC8vIG5vZGVzLgorICAgIFRyZWVQYXR0ZXJuTm9kZSAqUGF0dGVybiA9IEktPmdldFRyZWUoMCk7CisgICAgVHJlZVBhdHRlcm5Ob2RlICpTcmNQYXR0ZXJuOworICAgIGlmIChQYXR0ZXJuLT5nZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgPT0gInNldCIpIHsKKyAgICAgIFNyY1BhdHRlcm4gPSBQYXR0ZXJuLT5nZXRDaGlsZChQYXR0ZXJuLT5nZXROdW1DaGlsZHJlbigpLTEpLT5jbG9uZSgpOworICAgIH0gZWxzZXsKKyAgICAgIC8vIE5vdCBhIHNldCAoc3RvcmUgb3Igc29tZXRoaW5nPykKKyAgICAgIFNyY1BhdHRlcm4gPSBQYXR0ZXJuOworICAgIH0KKyAgICAKKyAgICBSZWNvcmQgKkluc3RyID0gSUktPmZpcnN0OworICAgIEFkZFBhdHRlcm5Ub01hdGNoKEksCisgICAgICAgICAgICAgICAgICAgICAgUGF0dGVyblRvTWF0Y2goSW5zdHItPmdldFZhbHVlQXNMaXN0SW5pdCgiUHJlZGljYXRlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlSW5zdC5nZXRSZXN1bHRQYXR0ZXJuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlSW5zdC5nZXRJbXBSZXN1bHRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHItPmdldFZhbHVlQXNJbnQoIkFkZGVkQ29tcGxleGl0eSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyLT5nZXRJRCgpKSk7CisgIH0KK30KKworCit0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBUcmVlUGF0dGVybk5vZGUqLCB1bnNpZ25lZD4gTmFtZVJlY29yZDsKKworc3RhdGljIHZvaWQgRmluZE5hbWVzKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqUCwgCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE5hbWVSZWNvcmQ+ICZOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmVlUGF0dGVybiAqUGF0dGVyblRvcCkgeworICBpZiAoIVAtPmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgTmFtZVJlY29yZCAmUmVjID0gTmFtZXNbUC0+Z2V0TmFtZSgpXTsKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbmFtZSwgcmVtZW1iZXIgdGhlIG5vZGUuCisgICAgaWYgKFJlYy5zZWNvbmQrKyA9PSAwKQorICAgICAgUmVjLmZpcnN0ID0gUDsKKyAgICBlbHNlIGlmIChSZWMuZmlyc3QtPmdldEV4dFR5cGVzKCkgIT0gUC0+Z2V0RXh0VHlwZXMoKSkKKyAgICAgIFBhdHRlcm5Ub3AtPmVycm9yKCJyZXBldGl0aW9uIG9mIHZhbHVlOiAkIiArIFAtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIHdoZXJlIGRpZmZlcmVudCB1c2VzIGhhdmUgZGlmZmVyZW50IHR5cGVzISIpOworICB9CisgIAorICBpZiAoIVAtPmlzTGVhZigpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFAtPmdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKQorICAgICAgRmluZE5hbWVzKFAtPmdldENoaWxkKGkpLCBOYW1lcywgUGF0dGVyblRvcCk7CisgIH0KK30KKwordm9pZCBDb2RlR2VuREFHUGF0dGVybnM6OkFkZFBhdHRlcm5Ub01hdGNoKGNvbnN0IFRyZWVQYXR0ZXJuICpQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhdHRlcm5Ub01hdGNoICZQVE0pIHsKKyAgLy8gRG8gc29tZSBzYW5pdHkgY2hlY2tpbmcgb24gdGhlIHBhdHRlcm4gd2UncmUgYWJvdXQgdG8gbWF0Y2guCisgIHN0ZDo6c3RyaW5nIFJlYXNvbjsKKyAgaWYgKCFQVE0uZ2V0U3JjUGF0dGVybigpLT5jYW5QYXR0ZXJuTWF0Y2goUmVhc29uLCAqdGhpcykpCisgICAgUGF0dGVybi0+ZXJyb3IoIlBhdHRlcm4gY2FuIG5ldmVyIG1hdGNoOiAiICsgUmVhc29uKTsKKyAgCisgIC8vIElmIHRoZSBzb3VyY2UgcGF0dGVybidzIHJvb3QgaXMgYSBjb21wbGV4IHBhdHRlcm4sIHRoYXQgY29tcGxleCBwYXR0ZXJuCisgIC8vIG11c3Qgc3BlY2lmeSB0aGUgbm9kZXMgaXQgY2FuIHBvdGVudGlhbGx5IG1hdGNoLgorICBpZiAoY29uc3QgQ29tcGxleFBhdHRlcm4gKkNQID0KKyAgICAgICAgUFRNLmdldFNyY1BhdHRlcm4oKS0+Z2V0Q29tcGxleFBhdHRlcm5JbmZvKCp0aGlzKSkKKyAgICBpZiAoQ1AtPmdldFJvb3ROb2RlcygpLmVtcHR5KCkpCisgICAgICBQYXR0ZXJuLT5lcnJvcigiQ29tcGxleFBhdHRlcm4gYXQgcm9vdCBtdXN0IHNwZWNpZnkgbGlzdCBvZiBvcGNvZGVzIGl0IgorICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZCBtYXRjaCIpOworICAKKyAgCisgIC8vIEZpbmQgYWxsIG9mIHRoZSBuYW1lZCB2YWx1ZXMgaW4gdGhlIGlucHV0IGFuZCBvdXRwdXQsIGVuc3VyZSB0aGV5IGhhdmUgdGhlCisgIC8vIHNhbWUgdHlwZS4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE5hbWVSZWNvcmQ+IFNyY05hbWVzLCBEc3ROYW1lczsKKyAgRmluZE5hbWVzKFBUTS5nZXRTcmNQYXR0ZXJuKCksIFNyY05hbWVzLCBQYXR0ZXJuKTsKKyAgRmluZE5hbWVzKFBUTS5nZXREc3RQYXR0ZXJuKCksIERzdE5hbWVzLCBQYXR0ZXJuKTsKKworICAvLyBTY2FuIGFsbCBvZiB0aGUgbmFtZWQgdmFsdWVzIGluIHRoZSBkZXN0aW5hdGlvbiBwYXR0ZXJuLCByZWplY3RpbmcgdGhlbSBpZgorICAvLyB0aGV5IGRvbid0IGV4aXN0IGluIHRoZSBpbnB1dCBwYXR0ZXJuLgorICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBOYW1lUmVjb3JkPjo6aXRlcmF0b3IKKyAgICAgICBJID0gRHN0TmFtZXMuYmVnaW4oKSwgRSA9IERzdE5hbWVzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGlmIChTcmNOYW1lc1tJLT5maXJzdF0uZmlyc3QgPT0gMCkKKyAgICAgIFBhdHRlcm4tPmVycm9yKCJQYXR0ZXJuIGhhcyBpbnB1dCB3aXRob3V0IG1hdGNoaW5nIG5hbWUgaW4gb3V0cHV0OiAkIiArCisgICAgICAgICAgICAgICAgICAgICBJLT5maXJzdCk7CisgIH0KKyAgCisgIC8vIFNjYW4gYWxsIG9mIHRoZSBuYW1lZCB2YWx1ZXMgaW4gdGhlIHNvdXJjZSBwYXR0ZXJuLCByZWplY3RpbmcgdGhlbSBpZiB0aGUKKyAgLy8gbmFtZSBpc24ndCB1c2VkIGluIHRoZSBkZXN0LCBhbmQgaXNuJ3QgdXNlZCB0byB0aWUgdHdvIHZhbHVlcyB0b2dldGhlci4KKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTmFtZVJlY29yZD46Oml0ZXJhdG9yCisgICAgICAgSSA9IFNyY05hbWVzLmJlZ2luKCksIEUgPSBTcmNOYW1lcy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKERzdE5hbWVzW0ktPmZpcnN0XS5maXJzdCA9PSAwICYmIFNyY05hbWVzW0ktPmZpcnN0XS5zZWNvbmQgPT0gMSkKKyAgICAgIFBhdHRlcm4tPmVycm9yKCJQYXR0ZXJuIGhhcyBkZWFkIG5hbWVkIGlucHV0OiAkIiArIEktPmZpcnN0KTsKKyAgCisgIFBhdHRlcm5zVG9NYXRjaC5wdXNoX2JhY2soUFRNKTsKK30KKworCisKK3ZvaWQgQ29kZUdlbkRBR1BhdHRlcm5zOjpJbmZlckluc3RydWN0aW9uRmxhZ3MoKSB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbio+ICZJbnN0cnVjdGlvbnMgPQorICAgIFRhcmdldC5nZXRJbnN0cnVjdGlvbnNCeUVudW1WYWx1ZSgpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5zdHJ1Y3Rpb25zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBDb2RlR2VuSW5zdHJ1Y3Rpb24gJkluc3RJbmZvID0KKyAgICAgIGNvbnN0X2Nhc3Q8Q29kZUdlbkluc3RydWN0aW9uICY+KCpJbnN0cnVjdGlvbnNbaV0pOworICAgIC8vIERldGVybWluZSBwcm9wZXJ0aWVzIG9mIHRoZSBpbnN0cnVjdGlvbiBmcm9tIGl0cyBwYXR0ZXJuLgorICAgIGJvb2wgTWF5U3RvcmUsIE1heUxvYWQsIEhhc1NpZGVFZmZlY3RzLCBJc1ZhcmlhZGljOworICAgIEluZmVyRnJvbVBhdHRlcm4oSW5zdEluZm8sIE1heVN0b3JlLCBNYXlMb2FkLCBIYXNTaWRlRWZmZWN0cywgSXNWYXJpYWRpYywKKyAgICAgICAgICAgICAgICAgICAgICp0aGlzKTsKKyAgICBJbnN0SW5mby5tYXlTdG9yZSA9IE1heVN0b3JlOworICAgIEluc3RJbmZvLm1heUxvYWQgPSBNYXlMb2FkOworICAgIEluc3RJbmZvLmhhc1NpZGVFZmZlY3RzID0gSGFzU2lkZUVmZmVjdHM7CisgICAgSW5zdEluZm8uaXNWYXJpYWRpYyA9IElzVmFyaWFkaWM7CisgIH0KK30KKworLy8vIEdpdmVuIGEgcGF0dGVybiByZXN1bHQgd2l0aCBhbiB1bnJlc29sdmVkIHR5cGUsIHNlZSBpZiB3ZSBjYW4gZmluZCBvbmUKKy8vLyBpbnN0cnVjdGlvbiB3aXRoIGFuIHVucmVzb2x2ZWQgcmVzdWx0IHR5cGUuICBGb3JjZSB0aGlzIHJlc3VsdCB0eXBlIHRvIGFuCisvLy8gYXJiaXRyYXJ5IGVsZW1lbnQgaWYgaXQncyBwb3NzaWJsZSB0eXBlcyB0byBjb252ZXJnZSByZXN1bHRzLgorc3RhdGljIGJvb2wgRm9yY2VBcmJpdHJhcnlJbnN0UmVzdWx0VHlwZShUcmVlUGF0dGVybk5vZGUgKk4sIFRyZWVQYXR0ZXJuICZUUCkgeworICBpZiAoTi0+aXNMZWFmKCkpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gQW5hbHl6ZSBjaGlsZHJlbi4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChGb3JjZUFyYml0cmFyeUluc3RSZXN1bHRUeXBlKE4tPmdldENoaWxkKGkpLCBUUCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoIU4tPmdldE9wZXJhdG9yKCktPmlzU3ViQ2xhc3NPZigiSW5zdHJ1Y3Rpb24iKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgdGhpcyB0eXBlIGlzIGFscmVhZHkgY29uY3JldGUgb3IgY29tcGxldGVseSB1bmtub3duIHdlIGNhbid0IGRvCisgIC8vIGFueXRoaW5nLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtVHlwZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoTi0+Z2V0RXh0VHlwZShpKS5pc0NvbXBsZXRlbHlVbmtub3duKCkgfHwgTi0+Z2V0RXh0VHlwZShpKS5pc0NvbmNyZXRlKCkpCisgICAgICBjb250aW51ZTsKKyAgCisgICAgLy8gT3RoZXJ3aXNlLCBmb3JjZSBpdHMgdHlwZSB0byB0aGUgZmlyc3QgcG9zc2liaWxpdHkgKGFuIGFyYml0cmFyeSBjaG9pY2UpLgorICAgIGlmIChOLT5nZXRFeHRUeXBlKGkpLk1lcmdlSW5UeXBlSW5mbyhOLT5nZXRFeHRUeXBlKGkpLmdldFR5cGVMaXN0KClbMF0sIFRQKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIAorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ29kZUdlbkRBR1BhdHRlcm5zOjpQYXJzZVBhdHRlcm5zKCkgeworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBQYXR0ZXJucyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJQYXR0ZXJuIik7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBhdHRlcm5zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQgKkN1clBhdHRlcm4gPSBQYXR0ZXJuc1tpXTsKKyAgICBEYWdJbml0ICpUcmVlID0gQ3VyUGF0dGVybi0+Z2V0VmFsdWVBc0RhZygiUGF0dGVyblRvTWF0Y2giKTsKKyAgICBUcmVlUGF0dGVybiAqUGF0dGVybiA9IG5ldyBUcmVlUGF0dGVybihDdXJQYXR0ZXJuLCBUcmVlLCB0cnVlLCAqdGhpcyk7CisKKyAgICAvLyBJbmxpbmUgcGF0dGVybiBmcmFnbWVudHMgaW50byBpdC4KKyAgICBQYXR0ZXJuLT5JbmxpbmVQYXR0ZXJuRnJhZ21lbnRzKCk7CisgICAgCisgICAgTGlzdEluaXQgKkxJID0gQ3VyUGF0dGVybi0+Z2V0VmFsdWVBc0xpc3RJbml0KCJSZXN1bHRJbnN0cnMiKTsKKyAgICBpZiAoTEktPmdldFNpemUoKSA9PSAwKSBjb250aW51ZTsgIC8vIG5vIHBhdHRlcm4uCisgICAgCisgICAgLy8gUGFyc2UgdGhlIGluc3RydWN0aW9uLgorICAgIFRyZWVQYXR0ZXJuICpSZXN1bHQgPSBuZXcgVHJlZVBhdHRlcm4oQ3VyUGF0dGVybiwgTEksIGZhbHNlLCAqdGhpcyk7CisgICAgCisgICAgLy8gSW5saW5lIHBhdHRlcm4gZnJhZ21lbnRzIGludG8gaXQuCisgICAgUmVzdWx0LT5JbmxpbmVQYXR0ZXJuRnJhZ21lbnRzKCk7CisKKyAgICBpZiAoUmVzdWx0LT5nZXROdW1UcmVlcygpICE9IDEpCisgICAgICBSZXN1bHQtPmVycm9yKCJDYW5ub3QgaGFuZGxlIGluc3RydWN0aW9ucyBwcm9kdWNpbmcgaW5zdHJ1Y3Rpb25zICIKKyAgICAgICAgICAgICAgICAgICAgIndpdGggdGVtcG9yYXJpZXMgeWV0ISIpOworICAgIAorICAgIGJvb2wgSXRlcmF0ZUluZmVyZW5jZTsKKyAgICBib29sIEluZmVycmVkQWxsUGF0dGVyblR5cGVzLCBJbmZlcnJlZEFsbFJlc3VsdFR5cGVzOworICAgIGRvIHsKKyAgICAgIC8vIEluZmVyIGFzIG1hbnkgdHlwZXMgYXMgcG9zc2libGUuICBJZiB3ZSBjYW5ub3QgaW5mZXIgYWxsIG9mIHRoZW0sIHdlCisgICAgICAvLyBjYW4gbmV2ZXIgZG8gYW55dGhpbmcgd2l0aCB0aGlzIHBhdHRlcm46IHJlcG9ydCBpdCB0byB0aGUgdXNlci4KKyAgICAgIEluZmVycmVkQWxsUGF0dGVyblR5cGVzID0KKyAgICAgICAgUGF0dGVybi0+SW5mZXJBbGxUeXBlcygmUGF0dGVybi0+Z2V0TmFtZWROb2Rlc01hcCgpKTsKKyAgICAgIAorICAgICAgLy8gSW5mZXIgYXMgbWFueSB0eXBlcyBhcyBwb3NzaWJsZS4gIElmIHdlIGNhbm5vdCBpbmZlciBhbGwgb2YgdGhlbSwgd2UKKyAgICAgIC8vIGNhbiBuZXZlciBkbyBhbnl0aGluZyB3aXRoIHRoaXMgcGF0dGVybjogcmVwb3J0IGl0IHRvIHRoZSB1c2VyLgorICAgICAgSW5mZXJyZWRBbGxSZXN1bHRUeXBlcyA9CisgICAgICAgIFJlc3VsdC0+SW5mZXJBbGxUeXBlcygmUGF0dGVybi0+Z2V0TmFtZWROb2Rlc01hcCgpKTsKKworICAgICAgSXRlcmF0ZUluZmVyZW5jZSA9IGZhbHNlOworICAgICAgCisgICAgICAvLyBBcHBseSB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IHRvIHRoZSBzb3VyY2UgcGF0dGVybi4gIFRoaXMgaGVscHMgdXMKKyAgICAgIC8vIHJlc29sdmUgY2FzZXMgd2hlcmUgdGhlIGlucHV0IHR5cGUgaXMga25vd24gdG8gYmUgYSBwb2ludGVyIHR5cGUgKHdoaWNoCisgICAgICAvLyBpcyBjb25zaWRlcmVkIHJlc29sdmVkKSwgYnV0IHRoZSByZXN1bHQga25vd3MgaXQgbmVlZHMgdG8gYmUgMzItIG9yCisgICAgICAvLyA2NC1iaXRzLiAgSW5mZXIgdGhlIG90aGVyIHdheSBmb3IgZ29vZCBtZWFzdXJlLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHN0ZDo6bWluKFJlc3VsdC0+Z2V0VHJlZSgwKS0+Z2V0TnVtVHlwZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXR0ZXJuLT5nZXRUcmVlKDApLT5nZXROdW1UeXBlcygpKTsKKyAgICAgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgSXRlcmF0ZUluZmVyZW5jZSA9IFBhdHRlcm4tPmdldFRyZWUoMCktPgorICAgICAgICAgIFVwZGF0ZU5vZGVUeXBlKGksIFJlc3VsdC0+Z2V0VHJlZSgwKS0+Z2V0RXh0VHlwZShpKSwgKlJlc3VsdCk7CisgICAgICAgIEl0ZXJhdGVJbmZlcmVuY2UgfD0gUmVzdWx0LT5nZXRUcmVlKDApLT4KKyAgICAgICAgICBVcGRhdGVOb2RlVHlwZShpLCBQYXR0ZXJuLT5nZXRUcmVlKDApLT5nZXRFeHRUeXBlKGkpLCAqUmVzdWx0KTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gSWYgb3VyIGl0ZXJhdGlvbiBoYXMgY29udmVyZ2VkIGFuZCB0aGUgaW5wdXQgcGF0dGVybidzIHR5cGVzIGFyZSBmdWxseQorICAgICAgLy8gcmVzb2x2ZWQgYnV0IHRoZSByZXN1bHQgcGF0dGVybiBpcyBub3QgZnVsbHkgcmVzb2x2ZWQsIHdlIG1heSBoYXZlIGEKKyAgICAgIC8vIHNpdHVhdGlvbiB3aGVyZSB3ZSBoYXZlIHR3byBpbnN0cnVjdGlvbnMgaW4gdGhlIHJlc3VsdCBwYXR0ZXJuIGFuZAorICAgICAgLy8gdGhlIGluc3RydWN0aW9ucyByZXF1aXJlIGEgY29tbW9uIHJlZ2lzdGVyIGNsYXNzLCBidXQgZG9uJ3QgY2FyZSBhYm91dAorICAgICAgLy8gd2hhdCBhY3R1YWwgTVZUIGlzIHVzZWQuICBUaGlzIGlzIGFjdHVhbGx5IGEgYnVnIGluIG91ciBtb2RlbGxpbmc6CisgICAgICAvLyBvdXRwdXQgcGF0dGVybnMgc2hvdWxkIGhhdmUgcmVnaXN0ZXIgY2xhc3Nlcywgbm90IE1WVHMuCisgICAgICAvLworICAgICAgLy8gSW4gYW55IGNhc2UsIHRvIGhhbmRsZSB0aGlzLCB3ZSBqdXN0IGdvIHRocm91Z2ggYW5kIGRpc2FtYmlndWF0ZSBzb21lCisgICAgICAvLyBhcmJpdHJhcnkgdHlwZXMgdG8gdGhlIHJlc3VsdCBwYXR0ZXJuJ3Mgbm9kZXMuCisgICAgICBpZiAoIUl0ZXJhdGVJbmZlcmVuY2UgJiYgSW5mZXJyZWRBbGxQYXR0ZXJuVHlwZXMgJiYKKyAgICAgICAgICAhSW5mZXJyZWRBbGxSZXN1bHRUeXBlcykKKyAgICAgICAgSXRlcmF0ZUluZmVyZW5jZSA9IEZvcmNlQXJiaXRyYXJ5SW5zdFJlc3VsdFR5cGUoUmVzdWx0LT5nZXRUcmVlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUmVzdWx0KTsKKyAgICB9IHdoaWxlIChJdGVyYXRlSW5mZXJlbmNlKTsKKyAgICAKKyAgICAvLyBWZXJpZnkgdGhhdCB3ZSBpbmZlcnJlZCBlbm91Z2ggdHlwZXMgdGhhdCB3ZSBjYW4gZG8gc29tZXRoaW5nIHdpdGggdGhlCisgICAgLy8gcGF0dGVybiBhbmQgcmVzdWx0LiAgSWYgdGhlc2UgZmlyZSB0aGUgdXNlciBoYXMgdG8gYWRkIHR5cGUgY2FzdHMuCisgICAgaWYgKCFJbmZlcnJlZEFsbFBhdHRlcm5UeXBlcykKKyAgICAgIFBhdHRlcm4tPmVycm9yKCJDb3VsZCBub3QgaW5mZXIgYWxsIHR5cGVzIGluIHBhdHRlcm4hIik7CisgICAgaWYgKCFJbmZlcnJlZEFsbFJlc3VsdFR5cGVzKSB7CisgICAgICBQYXR0ZXJuLT5kdW1wKCk7CisgICAgICBSZXN1bHQtPmVycm9yKCJDb3VsZCBub3QgaW5mZXIgYWxsIHR5cGVzIGluIHBhdHRlcm4gcmVzdWx0ISIpOworICAgIH0KKyAgICAKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBpbnB1dCBwYXR0ZXJuIGlzIGNvcnJlY3QuCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRyZWVQYXR0ZXJuTm9kZSo+IEluc3RJbnB1dHM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRyZWVQYXR0ZXJuTm9kZSo+IEluc3RSZXN1bHRzOworICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEluc3RJbXBSZXN1bHRzOworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGVlID0gUGF0dGVybi0+Z2V0TnVtVHJlZXMoKTsgaiAhPSBlZTsgKytqKQorICAgICAgRmluZFBhdHRlcm5JbnB1dHNBbmRPdXRwdXRzKFBhdHRlcm4sIFBhdHRlcm4tPmdldFRyZWUoaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdElucHV0cywgSW5zdFJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdEltcFJlc3VsdHMpOworCisgICAgLy8gUHJvbW90ZSB0aGUgeGZvcm0gZnVuY3Rpb24gdG8gYmUgYW4gZXhwbGljaXQgbm9kZSBpZiBzZXQuCisgICAgVHJlZVBhdHRlcm5Ob2RlICpEc3RQYXR0ZXJuID0gUmVzdWx0LT5nZXRPbmx5VHJlZSgpOworICAgIHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+IFJlc3VsdE5vZGVPcGVyYW5kczsKKyAgICBmb3IgKHVuc2lnbmVkIGlpID0gMCwgZWUgPSBEc3RQYXR0ZXJuLT5nZXROdW1DaGlsZHJlbigpOyBpaSAhPSBlZTsgKytpaSkgeworICAgICAgVHJlZVBhdHRlcm5Ob2RlICpPcE5vZGUgPSBEc3RQYXR0ZXJuLT5nZXRDaGlsZChpaSk7CisgICAgICBpZiAoUmVjb3JkICpYZm9ybSA9IE9wTm9kZS0+Z2V0VHJhbnNmb3JtRm4oKSkgeworICAgICAgICBPcE5vZGUtPnNldFRyYW5zZm9ybUZuKDApOworICAgICAgICBzdGQ6OnZlY3RvcjxUcmVlUGF0dGVybk5vZGUqPiBDaGlsZHJlbjsKKyAgICAgICAgQ2hpbGRyZW4ucHVzaF9iYWNrKE9wTm9kZSk7CisgICAgICAgIE9wTm9kZSA9IG5ldyBUcmVlUGF0dGVybk5vZGUoWGZvcm0sIENoaWxkcmVuLCBPcE5vZGUtPmdldE51bVR5cGVzKCkpOworICAgICAgfQorICAgICAgUmVzdWx0Tm9kZU9wZXJhbmRzLnB1c2hfYmFjayhPcE5vZGUpOworICAgIH0KKyAgICBEc3RQYXR0ZXJuID0gUmVzdWx0LT5nZXRPbmx5VHJlZSgpOworICAgIGlmICghRHN0UGF0dGVybi0+aXNMZWFmKCkpCisgICAgICBEc3RQYXR0ZXJuID0gbmV3IFRyZWVQYXR0ZXJuTm9kZShEc3RQYXR0ZXJuLT5nZXRPcGVyYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0Tm9kZU9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0UGF0dGVybi0+Z2V0TnVtVHlwZXMoKSk7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlc3VsdC0+Z2V0T25seVRyZWUoKS0+Z2V0TnVtVHlwZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBEc3RQYXR0ZXJuLT5zZXRUeXBlKGksIFJlc3VsdC0+Z2V0T25seVRyZWUoKS0+Z2V0RXh0VHlwZShpKSk7CisgICAgCisgICAgVHJlZVBhdHRlcm4gVGVtcChSZXN1bHQtPmdldFJlY29yZCgpLCBEc3RQYXR0ZXJuLCBmYWxzZSwgKnRoaXMpOworICAgIFRlbXAuSW5mZXJBbGxUeXBlcygpOworCisgICAgCisgICAgQWRkUGF0dGVyblRvTWF0Y2goUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgUGF0dGVyblRvTWF0Y2goQ3VyUGF0dGVybi0+Z2V0VmFsdWVBc0xpc3RJbml0KCJQcmVkaWNhdGVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm4tPmdldFRyZWUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXAuZ2V0T25seVRyZWUoKSwgSW5zdEltcFJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1clBhdHRlcm4tPmdldFZhbHVlQXNJbnQoIkFkZGVkQ29tcGxleGl0eSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJQYXR0ZXJuLT5nZXRJRCgpKSk7CisgIH0KK30KKworLy8vIENvbWJpbmVDaGlsZFZhcmlhbnRzIC0gR2l2ZW4gYSBidW5jaCBvZiBwZXJtdXRhdGlvbnMgb2YgZWFjaCBjaGlsZCBvZiB0aGUKKy8vLyAnb3BlcmF0b3InIG5vZGUsIHB1dCB0aGVtIHRvZ2V0aGVyIGluIGFsbCBwb3NzaWJsZSB3YXlzLgorc3RhdGljIHZvaWQgQ29tYmluZUNoaWxkVmFyaWFudHMoVHJlZVBhdHRlcm5Ob2RlICpPcmlnLCAKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+ID4gJkNoaWxkVmFyaWFudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUcmVlUGF0dGVybk5vZGUqPiAmT3V0VmFyaWFudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuREFHUGF0dGVybnMgJkNEUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpcGxlVXNlVmFyU2V0ICZEZXBWYXJzKSB7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IGVhY2ggb3BlcmFuZCBoYXMgYXQgbGVhc3Qgb25lIHZhcmlhbnQgdG8gY2hvb3NlIGZyb20uCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDaGlsZFZhcmlhbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKENoaWxkVmFyaWFudHNbaV0uZW1wdHkoKSkKKyAgICAgIHJldHVybjsKKyAgICAgICAgCisgIC8vIFRoZSBlbmQgcmVzdWx0IGlzIGFuIGFsbC1wYWlycyBjb25zdHJ1Y3Rpb24gb2YgdGhlIHJlc3VsdGFudCBwYXR0ZXJuLgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gSWR4czsKKyAgSWR4cy5yZXNpemUoQ2hpbGRWYXJpYW50cy5zaXplKCkpOworICBib29sIE5vdERvbmU7CisgIGRvIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgREVCVUcoaWYgKCFJZHhzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGVycnMoKSA8PCBPcmlnLT5nZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgPDwgIjogSWR4cyA9IFsgIjsKKyAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IElkeHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBlcnJzKCkgPDwgSWR4c1tpXSA8PCAiICI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJzKCkgPDwgIl1cbiI7CisgICAgICAgICAgfSk7CisjZW5kaWYKKyAgICAvLyBDcmVhdGUgdGhlIHZhcmlhbnQgYW5kIGFkZCBpdCB0byB0aGUgb3V0cHV0IGxpc3QuCisgICAgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gTmV3Q2hpbGRyZW47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENoaWxkVmFyaWFudHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIE5ld0NoaWxkcmVuLnB1c2hfYmFjayhDaGlsZFZhcmlhbnRzW2ldW0lkeHNbaV1dKTsKKyAgICBUcmVlUGF0dGVybk5vZGUgKlIgPSBuZXcgVHJlZVBhdHRlcm5Ob2RlKE9yaWctPmdldE9wZXJhdG9yKCksIE5ld0NoaWxkcmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZy0+Z2V0TnVtVHlwZXMoKSk7CisgICAgCisgICAgLy8gQ29weSBvdmVyIHByb3BlcnRpZXMuCisgICAgUi0+c2V0TmFtZShPcmlnLT5nZXROYW1lKCkpOworICAgIFItPnNldFByZWRpY2F0ZUZucyhPcmlnLT5nZXRQcmVkaWNhdGVGbnMoKSk7CisgICAgUi0+c2V0VHJhbnNmb3JtRm4oT3JpZy0+Z2V0VHJhbnNmb3JtRm4oKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9yaWctPmdldE51bVR5cGVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgUi0+c2V0VHlwZShpLCBPcmlnLT5nZXRFeHRUeXBlKGkpKTsKKyAgICAKKyAgICAvLyBJZiB0aGlzIHBhdHRlcm4gY2Fubm90IG1hdGNoLCBkbyBub3QgaW5jbHVkZSBpdCBhcyBhIHZhcmlhbnQuCisgICAgc3RkOjpzdHJpbmcgRXJyU3RyaW5nOworICAgIGlmICghUi0+Y2FuUGF0dGVybk1hdGNoKEVyclN0cmluZywgQ0RQKSkgeworICAgICAgZGVsZXRlIFI7CisgICAgfSBlbHNlIHsKKyAgICAgIGJvb2wgQWxyZWFkeUV4aXN0cyA9IGZhbHNlOworICAgICAgCisgICAgICAvLyBTY2FuIHRvIHNlZSBpZiB0aGlzIHBhdHRlcm4gaGFzIGFscmVhZHkgYmVlbiBlbWl0dGVkLiAgV2UgY2FuIGdldAorICAgICAgLy8gZHVwbGljYXRpb24gZHVlIHRvIHRoaW5ncyBsaWtlIGNvbW11dGluZzoKKyAgICAgIC8vICAgKGFuZCBHUFJDOiRhLCBHUFJDOiRiKSAtPiAoYW5kIEdQUkM6JGIsIEdQUkM6JGEpCisgICAgICAvLyB3aGljaCBhcmUgdGhlIHNhbWUgcGF0dGVybi4gIElnbm9yZSB0aGUgZHVwcy4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPdXRWYXJpYW50cy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoUi0+aXNJc29tb3JwaGljVG8oT3V0VmFyaWFudHNbaV0sIERlcFZhcnMpKSB7CisgICAgICAgICAgQWxyZWFkeUV4aXN0cyA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKEFscmVhZHlFeGlzdHMpCisgICAgICAgIGRlbGV0ZSBSOworICAgICAgZWxzZQorICAgICAgICBPdXRWYXJpYW50cy5wdXNoX2JhY2soUik7CisgICAgfQorICAgIAorICAgIC8vIEluY3JlbWVudCBpbmRpY2VzIHRvIHRoZSBuZXh0IHBlcm11dGF0aW9uIGJ5IGluY3JlbWVudGluZyB0aGUKKyAgICAvLyBpbmRpY2llcyBmcm9tIGxhc3QgaW5kZXggYmFja3dhcmQsIGUuZy4sIGdlbmVyYXRlIHRoZSBzZXF1ZW5jZQorICAgIC8vIFswLCAwXSwgWzAsIDFdLCBbMSwgMF0sIFsxLCAxXS4KKyAgICBpbnQgSWR4c0lkeDsKKyAgICBmb3IgKElkeHNJZHggPSBJZHhzLnNpemUoKSAtIDE7IElkeHNJZHggPj0gMDsgLS1JZHhzSWR4KSB7CisgICAgICBpZiAoKytJZHhzW0lkeHNJZHhdID09IENoaWxkVmFyaWFudHNbSWR4c0lkeF0uc2l6ZSgpKQorICAgICAgICBJZHhzW0lkeHNJZHhdID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIE5vdERvbmUgPSAoSWR4c0lkeCA+PSAwKTsKKyAgfSB3aGlsZSAoTm90RG9uZSk7Cit9CisKKy8vLyBDb21iaW5lQ2hpbGRWYXJpYW50cyAtIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBiaW5hcnkgb3BlcmF0b3JzLgorLy8vCitzdGF0aWMgdm9pZCBDb21iaW5lQ2hpbGRWYXJpYW50cyhUcmVlUGF0dGVybk5vZGUgKk9yaWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+ICZSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUcmVlUGF0dGVybk5vZGUqPiAmT3V0VmFyaWFudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuREFHUGF0dGVybnMgJkNEUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpcGxlVXNlVmFyU2V0ICZEZXBWYXJzKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+ID4gQ2hpbGRWYXJpYW50czsKKyAgQ2hpbGRWYXJpYW50cy5wdXNoX2JhY2soTEhTKTsKKyAgQ2hpbGRWYXJpYW50cy5wdXNoX2JhY2soUkhTKTsKKyAgQ29tYmluZUNoaWxkVmFyaWFudHMoT3JpZywgQ2hpbGRWYXJpYW50cywgT3V0VmFyaWFudHMsIENEUCwgRGVwVmFycyk7Cit9ICAKKworCitzdGF0aWMgdm9pZCBHYXRoZXJDaGlsZHJlbk9mQXNzb2NpYXRpdmVPcGNvZGUoVHJlZVBhdHRlcm5Ob2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSAqPiAmQ2hpbGRyZW4pIHsKKyAgYXNzZXJ0KE4tPmdldE51bUNoaWxkcmVuKCk9PTIgJiYiQXNzb2NpYXRpdmUgYnV0IGRvZXNuJ3QgaGF2ZSAyIGNoaWxkcmVuISIpOworICBSZWNvcmQgKk9wZXJhdG9yID0gTi0+Z2V0T3BlcmF0b3IoKTsKKyAgCisgIC8vIE9ubHkgcGVybWl0IHJhdyBub2Rlcy4KKyAgaWYgKCFOLT5nZXROYW1lKCkuZW1wdHkoKSB8fCAhTi0+Z2V0UHJlZGljYXRlRm5zKCkuZW1wdHkoKSB8fAorICAgICAgTi0+Z2V0VHJhbnNmb3JtRm4oKSkgeworICAgIENoaWxkcmVuLnB1c2hfYmFjayhOKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoTi0+Z2V0Q2hpbGQoMCktPmlzTGVhZigpIHx8IE4tPmdldENoaWxkKDApLT5nZXRPcGVyYXRvcigpICE9IE9wZXJhdG9yKQorICAgIENoaWxkcmVuLnB1c2hfYmFjayhOLT5nZXRDaGlsZCgwKSk7CisgIGVsc2UKKyAgICBHYXRoZXJDaGlsZHJlbk9mQXNzb2NpYXRpdmVPcGNvZGUoTi0+Z2V0Q2hpbGQoMCksIENoaWxkcmVuKTsKKworICBpZiAoTi0+Z2V0Q2hpbGQoMSktPmlzTGVhZigpIHx8IE4tPmdldENoaWxkKDEpLT5nZXRPcGVyYXRvcigpICE9IE9wZXJhdG9yKQorICAgIENoaWxkcmVuLnB1c2hfYmFjayhOLT5nZXRDaGlsZCgxKSk7CisgIGVsc2UKKyAgICBHYXRoZXJDaGlsZHJlbk9mQXNzb2NpYXRpdmVPcGNvZGUoTi0+Z2V0Q2hpbGQoMSksIENoaWxkcmVuKTsKK30KKworLy8vIEdlbmVyYXRlVmFyaWFudHNPZiAtIEdpdmVuIGEgcGF0dGVybiBOLCBnZW5lcmF0ZSBhbGwgcGVybXV0YXRpb25zIHdlIGNhbiBvZgorLy8vIHRoZSAocG90ZW50aWFsbHkgcmVjdXJzaXZlKSBwYXR0ZXJuIGJ5IHVzaW5nIGFsZ2VicmFpYyBsYXdzLgorLy8vCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVZhcmlhbnRzT2YoVHJlZVBhdHRlcm5Ob2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+ICZPdXRWYXJpYW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuREFHUGF0dGVybnMgJkNEUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aXBsZVVzZVZhclNldCAmRGVwVmFycykgeworICAvLyBXZSBjYW5ub3QgcGVybXV0ZSBsZWF2ZXMuCisgIGlmIChOLT5pc0xlYWYoKSkgeworICAgIE91dFZhcmlhbnRzLnB1c2hfYmFjayhOKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBMb29rIHVwIGludGVyZXN0aW5nIGluZm8gYWJvdXQgdGhlIG5vZGUuCisgIGNvbnN0IFNETm9kZUluZm8gJk5vZGVJbmZvID0gQ0RQLmdldFNETm9kZUluZm8oTi0+Z2V0T3BlcmF0b3IoKSk7CisKKyAgLy8gSWYgdGhpcyBub2RlIGlzIGFzc29jaWF0aXZlLCByZS1hc3NvY2lhdGUuCisgIGlmIChOb2RlSW5mby5oYXNQcm9wZXJ0eShTRE5QQXNzb2NpYXRpdmUpKSB7CisgICAgLy8gUmUtYXNzb2NpYXRlIGJ5IHB1bGxpbmcgdG9nZXRoZXIgYWxsIG9mIHRoZSBsaW5rZWQgb3BlcmF0b3JzIAorICAgIHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+IE1heGltYWxDaGlsZHJlbjsKKyAgICBHYXRoZXJDaGlsZHJlbk9mQXNzb2NpYXRpdmVPcGNvZGUoTiwgTWF4aW1hbENoaWxkcmVuKTsKKworICAgIC8vIE9ubHkgaGFuZGxlIGNoaWxkIHNpemVzIG9mIDMuICBPdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHRyeWluZyB0b28gbWFueQorICAgIC8vIHBlcm11dGF0aW9ucy4KKyAgICBpZiAoTWF4aW1hbENoaWxkcmVuLnNpemUoKSA9PSAzKSB7CisgICAgICAvLyBGaW5kIHRoZSB2YXJpYW50cyBvZiBhbGwgb2Ygb3VyIG1heGltYWwgY2hpbGRyZW4uCisgICAgICBzdGQ6OnZlY3RvcjxUcmVlUGF0dGVybk5vZGUqPiBBVmFyaWFudHMsIEJWYXJpYW50cywgQ1ZhcmlhbnRzOworICAgICAgR2VuZXJhdGVWYXJpYW50c09mKE1heGltYWxDaGlsZHJlblswXSwgQVZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgICAgR2VuZXJhdGVWYXJpYW50c09mKE1heGltYWxDaGlsZHJlblsxXSwgQlZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgICAgR2VuZXJhdGVWYXJpYW50c09mKE1heGltYWxDaGlsZHJlblsyXSwgQ1ZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgICAgCisgICAgICAvLyBUaGVyZSBhcmUgb25seSB0d28gd2F5cyB3ZSBjYW4gcGVybXV0ZSB0aGUgdHJlZToKKyAgICAgIC8vICAgKEEgb3AgQikgb3AgQyAgICBhbmQgICAgQSBvcCAoQiBvcCBDKQorICAgICAgLy8gV2l0aGluIHRoZXNlIGZvcm1zLCB3ZSBjYW4gYWxzbyBwZXJtdXRlIEEvQi9DLgorICAgICAgCisgICAgICAvLyBHZW5lcmF0ZSBsZWdhbCBwYWlyIHBlcm11dGF0aW9ucyBvZiBBL0IvQy4KKyAgICAgIHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+IEFCVmFyaWFudHM7CisgICAgICBzdGQ6OnZlY3RvcjxUcmVlUGF0dGVybk5vZGUqPiBCQVZhcmlhbnRzOworICAgICAgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gQUNWYXJpYW50czsKKyAgICAgIHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+IENBVmFyaWFudHM7CisgICAgICBzdGQ6OnZlY3RvcjxUcmVlUGF0dGVybk5vZGUqPiBCQ1ZhcmlhbnRzOworICAgICAgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gQ0JWYXJpYW50czsKKyAgICAgIENvbWJpbmVDaGlsZFZhcmlhbnRzKE4sIEFWYXJpYW50cywgQlZhcmlhbnRzLCBBQlZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgICAgQ29tYmluZUNoaWxkVmFyaWFudHMoTiwgQlZhcmlhbnRzLCBBVmFyaWFudHMsIEJBVmFyaWFudHMsIENEUCwgRGVwVmFycyk7CisgICAgICBDb21iaW5lQ2hpbGRWYXJpYW50cyhOLCBBVmFyaWFudHMsIENWYXJpYW50cywgQUNWYXJpYW50cywgQ0RQLCBEZXBWYXJzKTsKKyAgICAgIENvbWJpbmVDaGlsZFZhcmlhbnRzKE4sIENWYXJpYW50cywgQVZhcmlhbnRzLCBDQVZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgICAgQ29tYmluZUNoaWxkVmFyaWFudHMoTiwgQlZhcmlhbnRzLCBDVmFyaWFudHMsIEJDVmFyaWFudHMsIENEUCwgRGVwVmFycyk7CisgICAgICBDb21iaW5lQ2hpbGRWYXJpYW50cyhOLCBDVmFyaWFudHMsIEJWYXJpYW50cywgQ0JWYXJpYW50cywgQ0RQLCBEZXBWYXJzKTsKKworICAgICAgLy8gQ29tYmluZSB0aG9zZSBpbnRvIHRoZSByZXN1bHQ6ICh4IG9wIHgpIG9wIHgKKyAgICAgIENvbWJpbmVDaGlsZFZhcmlhbnRzKE4sIEFCVmFyaWFudHMsIENWYXJpYW50cywgT3V0VmFyaWFudHMsIENEUCwgRGVwVmFycyk7CisgICAgICBDb21iaW5lQ2hpbGRWYXJpYW50cyhOLCBCQVZhcmlhbnRzLCBDVmFyaWFudHMsIE91dFZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgICAgQ29tYmluZUNoaWxkVmFyaWFudHMoTiwgQUNWYXJpYW50cywgQlZhcmlhbnRzLCBPdXRWYXJpYW50cywgQ0RQLCBEZXBWYXJzKTsKKyAgICAgIENvbWJpbmVDaGlsZFZhcmlhbnRzKE4sIENBVmFyaWFudHMsIEJWYXJpYW50cywgT3V0VmFyaWFudHMsIENEUCwgRGVwVmFycyk7CisgICAgICBDb21iaW5lQ2hpbGRWYXJpYW50cyhOLCBCQ1ZhcmlhbnRzLCBBVmFyaWFudHMsIE91dFZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgICAgQ29tYmluZUNoaWxkVmFyaWFudHMoTiwgQ0JWYXJpYW50cywgQVZhcmlhbnRzLCBPdXRWYXJpYW50cywgQ0RQLCBEZXBWYXJzKTsKKworICAgICAgLy8gQ29tYmluZSB0aG9zZSBpbnRvIHRoZSByZXN1bHQ6IHggb3AgKHggb3AgeCkKKyAgICAgIENvbWJpbmVDaGlsZFZhcmlhbnRzKE4sIENWYXJpYW50cywgQUJWYXJpYW50cywgT3V0VmFyaWFudHMsIENEUCwgRGVwVmFycyk7CisgICAgICBDb21iaW5lQ2hpbGRWYXJpYW50cyhOLCBDVmFyaWFudHMsIEJBVmFyaWFudHMsIE91dFZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgICAgQ29tYmluZUNoaWxkVmFyaWFudHMoTiwgQlZhcmlhbnRzLCBBQ1ZhcmlhbnRzLCBPdXRWYXJpYW50cywgQ0RQLCBEZXBWYXJzKTsKKyAgICAgIENvbWJpbmVDaGlsZFZhcmlhbnRzKE4sIEJWYXJpYW50cywgQ0FWYXJpYW50cywgT3V0VmFyaWFudHMsIENEUCwgRGVwVmFycyk7CisgICAgICBDb21iaW5lQ2hpbGRWYXJpYW50cyhOLCBBVmFyaWFudHMsIEJDVmFyaWFudHMsIE91dFZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgICAgQ29tYmluZUNoaWxkVmFyaWFudHMoTiwgQVZhcmlhbnRzLCBDQlZhcmlhbnRzLCBPdXRWYXJpYW50cywgQ0RQLCBEZXBWYXJzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgCisgIC8vIENvbXB1dGUgcGVybXV0YXRpb25zIG9mIGFsbCBjaGlsZHJlbi4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gPiBDaGlsZFZhcmlhbnRzOworICBDaGlsZFZhcmlhbnRzLnJlc2l6ZShOLT5nZXROdW1DaGlsZHJlbigpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKQorICAgIEdlbmVyYXRlVmFyaWFudHNPZihOLT5nZXRDaGlsZChpKSwgQ2hpbGRWYXJpYW50c1tpXSwgQ0RQLCBEZXBWYXJzKTsKKworICAvLyBCdWlsZCBhbGwgcGVybXV0YXRpb25zIGJhc2VkIG9uIGhvdyB0aGUgY2hpbGRyZW4gd2VyZSBmb3JtZWQuCisgIENvbWJpbmVDaGlsZFZhcmlhbnRzKE4sIENoaWxkVmFyaWFudHMsIE91dFZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworCisgIC8vIElmIHRoaXMgbm9kZSBpcyBjb21tdXRhdGl2ZSwgY29uc2lkZXIgdGhlIGNvbW11dGVkIG9yZGVyLgorICBib29sIGlzQ29tbUludHJpbnNpYyA9IE4tPmlzQ29tbXV0YXRpdmVJbnRyaW5zaWMoQ0RQKTsKKyAgaWYgKE5vZGVJbmZvLmhhc1Byb3BlcnR5KFNETlBDb21tdXRhdGl2ZSkgfHwgaXNDb21tSW50cmluc2ljKSB7CisgICAgYXNzZXJ0KChOLT5nZXROdW1DaGlsZHJlbigpPT0yIHx8IGlzQ29tbUludHJpbnNpYykgJiYKKyAgICAgICAgICAgIkNvbW11dGF0aXZlIGJ1dCBkb2Vzbid0IGhhdmUgMiBjaGlsZHJlbiEiKTsKKyAgICAvLyBEb24ndCBjb3VudCBjaGlsZHJlbiB3aGljaCBhcmUgYWN0dWFsbHkgcmVnaXN0ZXIgcmVmZXJlbmNlcy4KKyAgICB1bnNpZ25lZCBOQyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE4tPmdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBUcmVlUGF0dGVybk5vZGUgKkNoaWxkID0gTi0+Z2V0Q2hpbGQoaSk7CisgICAgICBpZiAoQ2hpbGQtPmlzTGVhZigpKQorICAgICAgICBpZiAoRGVmSW5pdCAqREkgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KENoaWxkLT5nZXRMZWFmVmFsdWUoKSkpIHsKKyAgICAgICAgICBSZWNvcmQgKlJSID0gREktPmdldERlZigpOworICAgICAgICAgIGlmIChSUi0+aXNTdWJDbGFzc09mKCJSZWdpc3RlciIpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIE5DKys7CisgICAgfQorICAgIC8vIENvbnNpZGVyIHRoZSBjb21tdXRlZCBvcmRlci4KKyAgICBpZiAoaXNDb21tSW50cmluc2ljKSB7CisgICAgICAvLyBDb21tdXRhdGl2ZSBpbnRyaW5zaWMuIEZpcnN0IG9wZXJhbmQgaXMgdGhlIGludHJpbnNpYyBpZCwgMm5kIGFuZCAzcmQKKyAgICAgIC8vIG9wZXJhbmRzIGFyZSB0aGUgY29tbXV0YXRpdmUgb3BlcmFuZHMsIGFuZCB0aGVyZSBtaWdodCBiZSBtb3JlIG9wZXJhbmRzCisgICAgICAvLyBhZnRlciB0aG9zZS4KKyAgICAgIGFzc2VydChOQyA+PSAzICYmCisgICAgICAgICAgICAgIkNvbW11dGF0aXZlIGludHJpbnNpYyBzaG91bGQgaGF2ZSBhdCBsZWFzdCAzIGNoaWxkcmVhbiEiKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+ID4gVmFyaWFudHM7CisgICAgICBWYXJpYW50cy5wdXNoX2JhY2soQ2hpbGRWYXJpYW50c1swXSk7IC8vIEludHJpbnNpYyBpZC4KKyAgICAgIFZhcmlhbnRzLnB1c2hfYmFjayhDaGlsZFZhcmlhbnRzWzJdKTsKKyAgICAgIFZhcmlhbnRzLnB1c2hfYmFjayhDaGlsZFZhcmlhbnRzWzFdKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDM7IGkgIT0gTkM7ICsraSkKKyAgICAgICAgVmFyaWFudHMucHVzaF9iYWNrKENoaWxkVmFyaWFudHNbaV0pOworICAgICAgQ29tYmluZUNoaWxkVmFyaWFudHMoTiwgVmFyaWFudHMsIE91dFZhcmlhbnRzLCBDRFAsIERlcFZhcnMpOworICAgIH0gZWxzZSBpZiAoTkMgPT0gMikKKyAgICAgIENvbWJpbmVDaGlsZFZhcmlhbnRzKE4sIENoaWxkVmFyaWFudHNbMV0sIENoaWxkVmFyaWFudHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRWYXJpYW50cywgQ0RQLCBEZXBWYXJzKTsKKyAgfQorfQorCisKKy8vIEdlbmVyYXRlVmFyaWFudHMgLSBHZW5lcmF0ZSB2YXJpYW50cy4gIEZvciBleGFtcGxlLCBjb21tdXRhdGl2ZSBwYXR0ZXJucyBjYW4KKy8vIG1hdGNoIG11bHRpcGxlIHdheXMuICBBZGQgdGhlbSB0byBQYXR0ZXJuc1RvTWF0Y2ggYXMgd2VsbC4KK3ZvaWQgQ29kZUdlbkRBR1BhdHRlcm5zOjpHZW5lcmF0ZVZhcmlhbnRzKCkgeworICBERUJVRyhlcnJzKCkgPDwgIkdlbmVyYXRpbmcgaW5zdHJ1Y3Rpb24gdmFyaWFudHMuXG4iKTsKKyAgCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIHBhdHRlcm5zIHdlJ3ZlIGNvbGxlY3RlZCwgY2hlY2tpbmcgdG8gc2VlIGlmIHdlIGNhbgorICAvLyBnZW5lcmF0ZSB2YXJpYW50cyBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHRocm91Z2ggdGhlIGV4cGxvaXRhdGlvbiBvZgorICAvLyBpZGVudGl0aWVzLiAgVGhpcyBwZXJtaXRzIHRoZSB0YXJnZXQgdG8gcHJvdmlkZSBhZ2dyZXNzaXZlIG1hdGNoaW5nIHdpdGhvdXQKKyAgLy8gdGhlIC50ZCBmaWxlIGhhdmluZyB0byBjb250YWluIHRvbnMgb2YgdmFyaWFudHMgb2YgaW5zdHJ1Y3Rpb25zLgorICAvLworICAvLyBOb3RlIHRoYXQgdGhpcyBsb29wIGFkZHMgbmV3IHBhdHRlcm5zIHRvIHRoZSBQYXR0ZXJuc1RvTWF0Y2ggbGlzdCwgYnV0IHdlCisgIC8vIGludGVudGlvbmFsbHkgZG8gbm90IHJlY29uc2lkZXIgdGhlc2UuICBBbnkgdmFyaWFudHMgb2YgYWRkZWQgcGF0dGVybnMgaGF2ZQorICAvLyBhbHJlYWR5IGJlZW4gYWRkZWQuCisgIC8vCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQYXR0ZXJuc1RvTWF0Y2guc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE11bHRpcGxlVXNlVmFyU2V0ICAgICAgICAgICAgIERlcFZhcnM7CisgICAgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gVmFyaWFudHM7CisgICAgRmluZERlcFZhcnMoUGF0dGVybnNUb01hdGNoW2ldLmdldFNyY1BhdHRlcm4oKSwgRGVwVmFycyk7CisgICAgREVCVUcoZXJycygpIDw8ICJEZXBlbmRlbnQvbXVsdGlwbHkgdXNlZCB2YXJpYWJsZXM6ICIpOworICAgIERFQlVHKER1bXBEZXBWYXJzKERlcFZhcnMpKTsKKyAgICBERUJVRyhlcnJzKCkgPDwgIlxuIik7CisgICAgR2VuZXJhdGVWYXJpYW50c09mKFBhdHRlcm5zVG9NYXRjaFtpXS5nZXRTcmNQYXR0ZXJuKCksIFZhcmlhbnRzLCAqdGhpcywgRGVwVmFycyk7CisKKyAgICBhc3NlcnQoIVZhcmlhbnRzLmVtcHR5KCkgJiYgIk11c3QgY3JlYXRlIGF0IGxlYXN0IG9yaWdpbmFsIHZhcmlhbnQhIik7CisgICAgVmFyaWFudHMuZXJhc2UoVmFyaWFudHMuYmVnaW4oKSk7ICAvLyBSZW1vdmUgdGhlIG9yaWdpbmFsIHBhdHRlcm4uCisKKyAgICBpZiAoVmFyaWFudHMuZW1wdHkoKSkgIC8vIE5vIHZhcmlhbnRzIGZvciB0aGlzIHBhdHRlcm4uCisgICAgICBjb250aW51ZTsKKworICAgIERFQlVHKGVycnMoKSA8PCAiRk9VTkQgVkFSSUFOVFMgT0Y6ICI7CisgICAgICAgICAgUGF0dGVybnNUb01hdGNoW2ldLmdldFNyY1BhdHRlcm4oKS0+ZHVtcCgpOworICAgICAgICAgIGVycnMoKSA8PCAiXG4iKTsKKworICAgIGZvciAodW5zaWduZWQgdiA9IDAsIGUgPSBWYXJpYW50cy5zaXplKCk7IHYgIT0gZTsgKyt2KSB7CisgICAgICBUcmVlUGF0dGVybk5vZGUgKlZhcmlhbnQgPSBWYXJpYW50c1t2XTsKKworICAgICAgREVCVUcoZXJycygpIDw8ICIgIFZBUiMiIDw8IHYgPDwgICI6ICI7CisgICAgICAgICAgICBWYXJpYW50LT5kdW1wKCk7CisgICAgICAgICAgICBlcnJzKCkgPDwgIlxuIik7CisgICAgICAKKyAgICAgIC8vIFNjYW4gdG8gc2VlIGlmIGFuIGluc3RydWN0aW9uIG9yIGV4cGxpY2l0IHBhdHRlcm4gYWxyZWFkeSBtYXRjaGVzIHRoaXMuCisgICAgICBib29sIEFscmVhZHlFeGlzdHMgPSBmYWxzZTsKKyAgICAgIGZvciAodW5zaWduZWQgcCA9IDAsIGUgPSBQYXR0ZXJuc1RvTWF0Y2guc2l6ZSgpOyBwICE9IGU7ICsrcCkgeworICAgICAgICAvLyBTa2lwIGlmIHRoZSB0b3AgbGV2ZWwgcHJlZGljYXRlcyBkbyBub3QgbWF0Y2guCisgICAgICAgIGlmIChQYXR0ZXJuc1RvTWF0Y2hbaV0uZ2V0UHJlZGljYXRlcygpICE9CisgICAgICAgICAgICBQYXR0ZXJuc1RvTWF0Y2hbcF0uZ2V0UHJlZGljYXRlcygpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyB2YXJpYW50IGFscmVhZHkgZXhpc3RzLgorICAgICAgICBpZiAoVmFyaWFudC0+aXNJc29tb3JwaGljVG8oUGF0dGVybnNUb01hdGNoW3BdLmdldFNyY1BhdHRlcm4oKSwgRGVwVmFycykpIHsKKyAgICAgICAgICBERUJVRyhlcnJzKCkgPDwgIiAgKioqIEFMUkVBRFkgRVhJU1RTLCBpZ25vcmluZyB2YXJpYW50LlxuIik7CisgICAgICAgICAgQWxyZWFkeUV4aXN0cyA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBpdCwgaWdub3JlIHRoZSB2YXJpYW50LgorICAgICAgaWYgKEFscmVhZHlFeGlzdHMpIGNvbnRpbnVlOworCisgICAgICAvLyBPdGhlcndpc2UsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBwYXR0ZXJucyB3ZSBoYXZlLgorICAgICAgUGF0dGVybnNUb01hdGNoLgorICAgICAgICBwdXNoX2JhY2soUGF0dGVyblRvTWF0Y2goUGF0dGVybnNUb01hdGNoW2ldLmdldFByZWRpY2F0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhbnQsIFBhdHRlcm5zVG9NYXRjaFtpXS5nZXREc3RQYXR0ZXJuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXR0ZXJuc1RvTWF0Y2hbaV0uZ2V0RHN0UmVncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybnNUb01hdGNoW2ldLmdldEFkZGVkQ29tcGxleGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkOjpnZXROZXdVSUQoKSkpOworICAgIH0KKworICAgIERFQlVHKGVycnMoKSA8PCAiXG4iKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuREFHUGF0dGVybnMuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5EQUdQYXR0ZXJucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTM2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuREFHUGF0dGVybnMuaApAQCAtMCwwICsxLDc0OCBAQAorLy89PT0tIENvZGVHZW5EQUdQYXR0ZXJucy5oIC0gUmVhZCBEQUcgcGF0dGVybnMgZnJvbSAudGQgZmlsZSAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIENvZGVHZW5EQUdQYXR0ZXJucyBjbGFzcywgd2hpY2ggaXMgdXNlZCB0byByZWFkIGFuZAorLy8gcmVwcmVzZW50IHRoZSBwYXR0ZXJucyBwcmVzZW50IGluIGEgLnRkIGZpbGUgZm9yIGluc3RydWN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENPREVHRU5fREFHUEFUVEVSTlNfSAorI2RlZmluZSBDT0RFR0VOX0RBR1BBVFRFUk5TX0gKKworI2luY2x1ZGUgIkNvZGVHZW5UYXJnZXQuaCIKKyNpbmNsdWRlICJDb2RlR2VuSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFJlY29yZDsKKyAgc3RydWN0IEluaXQ7CisgIGNsYXNzIExpc3RJbml0OworICBjbGFzcyBEYWdJbml0OworICBjbGFzcyBTRE5vZGVJbmZvOworICBjbGFzcyBUcmVlUGF0dGVybjsKKyAgY2xhc3MgVHJlZVBhdHRlcm5Ob2RlOworICBjbGFzcyBDb2RlR2VuREFHUGF0dGVybnM7CisgIGNsYXNzIENvbXBsZXhQYXR0ZXJuOworCisvLy8gRUVWVDo6REFHSVNlbEdlblZhbHVlVHlwZSAtIFRoZXNlIGFyZSBzb21lIGV4dGVuZGVkIGZvcm1zIG9mCisvLy8gTVZUOjpTaW1wbGVWYWx1ZVR5cGUgdGhhdCB3ZSB1c2UgYXMgbGF0dGljZSB2YWx1ZXMgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgorLy8vIFRoZSBleGlzdGluZyBNVlQgaUFueSwgZkFueSBhbmQgdkFueSB0eXBlcyBzdWZmaWNlIHRvIHJlcHJlc2VudAorLy8vIGFyYml0cmFyeSBpbnRlZ2VyLCBmbG9hdGluZy1wb2ludCwgYW5kIHZlY3RvciB0eXBlcywgc28gb25seSBhbiB1bmtub3duCisvLy8gdmFsdWUgaXMgbmVlZGVkLgorbmFtZXNwYWNlIEVFVlQgeworICAvLy8gVHlwZVNldCAtIFRoaXMgaXMgZWl0aGVyIGVtcHR5IGlmIGl0J3MgY29tcGxldGVseSB1bmtub3duLCBvciBob2xkcyBhIHNldAorICAvLy8gb2YgdHlwZXMuICBJdCBpcyB1c2VkIGR1cmluZyB0eXBlIGluZmVyZW5jZSBiZWNhdXNlIHJlZ2lzdGVyIGNsYXNzZXMgY2FuCisgIC8vLyBoYXZlIG11bHRpcGxlIHBvc3NpYmxlIHR5cGVzIGFuZCB3ZSBkb24ndCBrbm93IHdoaWNoIG9uZSB0aGV5IGdldCB1bnRpbAorICAvLy8gdHlwZSBpbmZlcmVuY2UgaXMgY29tcGxldGUuCisgIC8vLworICAvLy8gVHlwZVNldCBjYW4gaGF2ZSB0aHJlZSBzdGF0ZXM6CisgIC8vLyAgICBWZWN0b3IgaXMgZW1wdHk6IFRoZSB0eXBlIGlzIGNvbXBsZXRlbHkgdW5rbm93biwgaXQgY2FuIGJlIGFueSB2YWxpZAorICAvLy8gICAgICAgdGFyZ2V0IHR5cGUuCisgIC8vLyAgICBWZWN0b3IgaGFzIG11bHRpcGxlIGNvbnN0cmFpbmVkIHR5cGVzOiAoZS5nLiB2NGkzMiArIHY0ZjMyKSBpdCBpcyBvbmUKKyAgLy8vICAgICAgIG9mIHRob3NlIHR5cGVzIG9ubHkuCisgIC8vLyAgICBWZWN0b3IgaGFzIG9uZSBjb25jcmV0ZSB0eXBlOiBUaGUgdHlwZSBpcyBjb21wbGV0ZWx5IGtub3duLgorICAvLy8KKyAgY2xhc3MgVHlwZVNldCB7CisgICAgU21hbGxWZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGUsIDQ+IFR5cGVWZWM7CisgIHB1YmxpYzoKKyAgICBUeXBlU2V0KCkge30KKyAgICBUeXBlU2V0KE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZULCBUcmVlUGF0dGVybiAmVFApOworICAgIFR5cGVTZXQoY29uc3Qgc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+ICZWVExpc3QpOyAgICAKKyAgICAKKyAgICBib29sIGlzQ29tcGxldGVseVVua25vd24oKSBjb25zdCB7IHJldHVybiBUeXBlVmVjLmVtcHR5KCk7IH0KKyAgICAKKyAgICBib29sIGlzQ29uY3JldGUoKSBjb25zdCB7CisgICAgICBpZiAoVHlwZVZlYy5zaXplKCkgIT0gMSkgcmV0dXJuIGZhbHNlOworICAgICAgdW5zaWduZWQgY2hhciBUID0gVHlwZVZlY1swXTsgKHZvaWQpVDsKKyAgICAgIGFzc2VydChUIDwgTVZUOjpMQVNUX1ZBTFVFVFlQRSB8fCBUID09IE1WVDo6aVBUUiB8fCBUID09IE1WVDo6aVBUUkFueSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0Q29uY3JldGUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNDb25jcmV0ZSgpICYmICJUeXBlIGlzbid0IGNvbmNyZXRlIHlldCIpOworICAgICAgcmV0dXJuIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSlUeXBlVmVjWzBdOworICAgIH0KKyAgICAKKyAgICBib29sIGlzRHluYW1pY2FsbHlSZXNvbHZlZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRDb25jcmV0ZSgpID09IE1WVDo6aVBUUiB8fCBnZXRDb25jcmV0ZSgpID09IE1WVDo6aVBUUkFueTsKKyAgICB9CisgICAgCisgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1WVDo6U2ltcGxlVmFsdWVUeXBlPiAmZ2V0VHlwZUxpc3QoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIVR5cGVWZWMuZW1wdHkoKSAmJiAiTm90IGEgdHlwZSBsaXN0ISIpOworICAgICAgcmV0dXJuIFR5cGVWZWM7CisgICAgfQorICAgIAorICAgIGJvb2wgaXNWb2lkKCkgY29uc3QgeworICAgICAgcmV0dXJuIFR5cGVWZWMuc2l6ZSgpID09IDEgJiYgVHlwZVZlY1swXSA9PSBNVlQ6OmlzVm9pZDsKKyAgICB9CisgICAgCisgICAgLy8vIGhhc0ludGVnZXJUeXBlcyAtIFJldHVybiB0cnVlIGlmIHRoaXMgVHlwZVNldCBjb250YWlucyBhbnkgaW50ZWdlciB2YWx1ZQorICAgIC8vLyB0eXBlcy4KKyAgICBib29sIGhhc0ludGVnZXJUeXBlcygpIGNvbnN0OworICAgIAorICAgIC8vLyBoYXNGbG9hdGluZ1BvaW50VHlwZXMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFR5cGVTZXQgY29udGFpbnMgYW4gZkFueSBvcgorICAgIC8vLyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIHR5cGUuCisgICAgYm9vbCBoYXNGbG9hdGluZ1BvaW50VHlwZXMoKSBjb25zdDsKKyAgICAKKyAgICAvLy8gaGFzVmVjdG9yVHlwZXMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFR5cGVTZXQgY29udGFpbnMgYSB2ZWN0b3IgdmFsdWUKKyAgICAvLy8gdHlwZS4KKyAgICBib29sIGhhc1ZlY3RvclR5cGVzKCkgY29uc3Q7CisgICAgCisgICAgLy8vIGdldE5hbWUoKSAtIFJldHVybiB0aGlzIFR5cGVTZXQgYXMgYSBzdHJpbmcuCisgICAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0OworICAgIAorICAgIC8vLyBNZXJnZUluVHlwZUluZm8gLSBUaGlzIG1lcmdlcyBpbiB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIHNwZWNpZmllZAorICAgIC8vLyBhcmd1bWVudC4gIElmICd0aGlzJyBjaGFuZ2VzLCBpdCByZXR1cm5zIHRydWUuICBJZiB0aGUgdHdvIHR5cGVzIGFyZQorICAgIC8vLyBjb250cmFkaWN0b3J5IChlLmcuIG1lcmdlIGYzMiBpbnRvIGkzMikgdGhlbiB0aGlzIHRocm93cyBhbiBleGNlcHRpb24uCisgICAgYm9vbCBNZXJnZUluVHlwZUluZm8oY29uc3QgRUVWVDo6VHlwZVNldCAmSW5WVCwgVHJlZVBhdHRlcm4gJlRQKTsKKworICAgIGJvb2wgTWVyZ2VJblR5cGVJbmZvKE1WVDo6U2ltcGxlVmFsdWVUeXBlIEluVlQsIFRyZWVQYXR0ZXJuICZUUCkgeworICAgICAgcmV0dXJuIE1lcmdlSW5UeXBlSW5mbyhFRVZUOjpUeXBlU2V0KEluVlQsIFRQKSwgVFApOworICAgIH0KKworICAgIC8vLyBGb3JjZSB0aGlzIHR5cGUgbGlzdCB0byBvbmx5IGNvbnRhaW4gaW50ZWdlciB0eXBlcy4KKyAgICBib29sIEVuZm9yY2VJbnRlZ2VyKFRyZWVQYXR0ZXJuICZUUCk7CisKKyAgICAvLy8gRm9yY2UgdGhpcyB0eXBlIGxpc3QgdG8gb25seSBjb250YWluIGZsb2F0aW5nIHBvaW50IHR5cGVzLgorICAgIGJvb2wgRW5mb3JjZUZsb2F0aW5nUG9pbnQoVHJlZVBhdHRlcm4gJlRQKTsKKworICAgIC8vLyBFbmZvcmNlU2NhbGFyIC0gUmVtb3ZlIGFsbCB2ZWN0b3IgdHlwZXMgZnJvbSB0aGlzIHR5cGUgbGlzdC4KKyAgICBib29sIEVuZm9yY2VTY2FsYXIoVHJlZVBhdHRlcm4gJlRQKTsKKworICAgIC8vLyBFbmZvcmNlVmVjdG9yIC0gUmVtb3ZlIGFsbCBub24tdmVjdG9yIHR5cGVzIGZyb20gdGhpcyB0eXBlIGxpc3QuCisgICAgYm9vbCBFbmZvcmNlVmVjdG9yKFRyZWVQYXR0ZXJuICZUUCk7CisKKyAgICAvLy8gRW5mb3JjZVNtYWxsZXJUaGFuIC0gJ3RoaXMnIG11c3QgYmUgYSBzbWFsbGVyIFZUIHRoYW4gT3RoZXIuICBVcGRhdGUKKyAgICAvLy8gdGhpcyBhbiBvdGhlciBiYXNlZCBvbiB0aGlzIGluZm9ybWF0aW9uLgorICAgIGJvb2wgRW5mb3JjZVNtYWxsZXJUaGFuKEVFVlQ6OlR5cGVTZXQgJk90aGVyLCBUcmVlUGF0dGVybiAmVFApOworICAgIAorICAgIC8vLyBFbmZvcmNlVmVjdG9yRWx0VHlwZUlzIC0gJ3RoaXMnIGlzIG5vdyBjb25zdHJhaW50ZWQgdG8gYmUgYSB2ZWN0b3IgdHlwZQorICAgIC8vLyB3aG9zZSBlbGVtZW50IGlzIFZULgorICAgIGJvb2wgRW5mb3JjZVZlY3RvckVsdFR5cGVJcyhFRVZUOjpUeXBlU2V0ICZWVCwgVHJlZVBhdHRlcm4gJlRQKTsKKyAgICAKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHlwZVNldCAmUkhTKSBjb25zdCB7IHJldHVybiBUeXBlVmVjICE9IFJIUy5UeXBlVmVjOyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGVTZXQgJlJIUykgY29uc3QgeyByZXR1cm4gVHlwZVZlYyA9PSBSSFMuVHlwZVZlYzsgfQorICAgIAorICBwcml2YXRlOgorICAgIC8vLyBGaWxsV2l0aFBvc3NpYmxlVHlwZXMgLSBTZXQgdG8gYWxsIGxlZ2FsIHR5cGVzIGFuZCByZXR1cm4gdHJ1ZSwgb25seQorICAgIC8vLyB2YWxpZCBvbiBjb21wbGV0ZWx5IHVua25vd24gdHlwZSBzZXRzLiAgSWYgUHJlZCBpcyBub24tbnVsbCwgb25seSBNVlRzCisgICAgLy8vIHRoYXQgcGFzcyB0aGUgcHJlZGljYXRlIGFyZSBhZGRlZC4KKyAgICBib29sIEZpbGxXaXRoUG9zc2libGVUeXBlcyhUcmVlUGF0dGVybiAmVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAoKlByZWQpKE1WVDo6U2ltcGxlVmFsdWVUeXBlKSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqUHJlZGljYXRlTmFtZSA9IDApOworICB9OworfQorCisvLy8gU2V0IHR5cGUgdXNlZCB0byB0cmFjayBtdWx0aXBseSB1c2VkIHZhcmlhYmxlcyBpbiBwYXR0ZXJucwordHlwZWRlZiBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gTXVsdGlwbGVVc2VWYXJTZXQ7CisKKy8vLyBTRFR5cGVDb25zdHJhaW50IC0gVGhpcyBpcyBhIGRpc2NyaW1pbmF0ZWQgdW5pb24gb2YgY29uc3RyYWludHMsCisvLy8gY29ycmVzcG9uZGluZyB0byB0aGUgU0RUeXBlQ29uc3RyYWludCB0YWJsZWdlbiBjbGFzcyBpbiBUYXJnZXQudGQuCitzdHJ1Y3QgU0RUeXBlQ29uc3RyYWludCB7CisgIFNEVHlwZUNvbnN0cmFpbnQoUmVjb3JkICpSKTsKKyAgCisgIHVuc2lnbmVkIE9wZXJhbmRObzsgICAvLyBUaGUgb3BlcmFuZCAjIHRoaXMgY29uc3RyYWludCBhcHBsaWVzIHRvLgorICBlbnVtIHsgCisgICAgU0RUQ2lzVlQsIFNEVENpc1B0clR5LCBTRFRDaXNJbnQsIFNEVENpc0ZQLCBTRFRDaXNWZWMsIFNEVENpc1NhbWVBcywgCisgICAgU0RUQ2lzVlRTbWFsbGVyVGhhbk9wLCBTRFRDaXNPcFNtYWxsZXJUaGFuT3AsIFNEVENpc0VsdE9mVmVjCisgIH0gQ29uc3RyYWludFR5cGU7CisgIAorICB1bmlvbiB7ICAgLy8gVGhlIGRpc2NyaW1pbmF0ZWQgdW5pb24uCisgICAgc3RydWN0IHsKKyAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUOworICAgIH0gU0RUQ2lzVlRfSW5mbzsKKyAgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgT3RoZXJPcGVyYW5kTnVtOworICAgIH0gU0RUQ2lzU2FtZUFzX0luZm87CisgICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIE90aGVyT3BlcmFuZE51bTsKKyAgICB9IFNEVENpc1ZUU21hbGxlclRoYW5PcF9JbmZvOworICAgIHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBCaWdPcGVyYW5kTnVtOworICAgIH0gU0RUQ2lzT3BTbWFsbGVyVGhhbk9wX0luZm87CisgICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIE90aGVyT3BlcmFuZE51bTsKKyAgICB9IFNEVENpc0VsdE9mVmVjX0luZm87CisgIH0geDsKKworICAvLy8gQXBwbHlUeXBlQ29uc3RyYWludCAtIEdpdmVuIGEgbm9kZSBpbiBhIHBhdHRlcm4sIGFwcGx5IHRoaXMgdHlwZQorICAvLy8gY29uc3RyYWludCB0byB0aGUgbm9kZXMgb3BlcmFuZHMuICBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBtYWtlcyBhCisgIC8vLyBjaGFuZ2UsIGZhbHNlIG90aGVyd2lzZS4gIElmIGEgdHlwZSBjb250cmFkaWN0aW9uIGlzIGZvdW5kLCB0aHJvdyBhbgorICAvLy8gZXhjZXB0aW9uLgorICBib29sIEFwcGx5VHlwZUNvbnN0cmFpbnQoVHJlZVBhdHRlcm5Ob2RlICpOLCBjb25zdCBTRE5vZGVJbmZvICZOb2RlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVQYXR0ZXJuICZUUCkgY29uc3Q7Cit9OworCisvLy8gU0ROb2RlSW5mbyAtIE9uZSBvZiB0aGVzZSByZWNvcmRzIGlzIGNyZWF0ZWQgZm9yIGVhY2ggU0ROb2RlIGluc3RhbmNlIGluCisvLy8gdGhlIHRhcmdldCAudGQgZmlsZS4gIFRoaXMgcmVwcmVzZW50cyB0aGUgdmFyaW91cyBkYWcgbm9kZXMgd2Ugd2lsbCBiZQorLy8vIHByb2Nlc3NpbmcuCitjbGFzcyBTRE5vZGVJbmZvIHsKKyAgUmVjb3JkICpEZWY7CisgIHN0ZDo6c3RyaW5nIEVudW1OYW1lOworICBzdGQ6OnN0cmluZyBTRENsYXNzTmFtZTsKKyAgdW5zaWduZWQgUHJvcGVydGllczsKKyAgdW5zaWduZWQgTnVtUmVzdWx0czsKKyAgaW50IE51bU9wZXJhbmRzOworICBzdGQ6OnZlY3RvcjxTRFR5cGVDb25zdHJhaW50PiBUeXBlQ29uc3RyYWludHM7CitwdWJsaWM6CisgIFNETm9kZUluZm8oUmVjb3JkICpSKTsgIC8vIFBhcnNlIHRoZSBzcGVjaWZpZWQgcmVjb3JkLgorICAKKyAgdW5zaWduZWQgZ2V0TnVtUmVzdWx0cygpIGNvbnN0IHsgcmV0dXJuIE51bVJlc3VsdHM7IH0KKyAgCisgIC8vLyBnZXROdW1PcGVyYW5kcyAtIFRoaXMgaXMgdGhlIG51bWJlciBvZiBvcGVyYW5kcyByZXF1aXJlZCBvciAtMSBpZgorICAvLy8gdmFyaWFkaWMuCisgIGludCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wZXJhbmRzOyB9CisgIFJlY29yZCAqZ2V0UmVjb3JkKCkgY29uc3QgeyByZXR1cm4gRGVmOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRFbnVtTmFtZSgpIGNvbnN0IHsgcmV0dXJuIEVudW1OYW1lOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRTRENsYXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFNEQ2xhc3NOYW1lOyB9CisgIAorICBjb25zdCBzdGQ6OnZlY3RvcjxTRFR5cGVDb25zdHJhaW50PiAmZ2V0VHlwZUNvbnN0cmFpbnRzKCkgY29uc3QgeworICAgIHJldHVybiBUeXBlQ29uc3RyYWludHM7CisgIH0KKyAgCisgIC8vLyBnZXRLbm93blR5cGUgLSBJZiB0aGUgdHlwZSBjb25zdHJhaW50cyBvbiB0aGlzIG5vZGUgaW1wbHkgYSBmaXhlZCB0eXBlCisgIC8vLyAoZS5nLiBhbGwgc3RvcmVzIHJldHVybiB2b2lkLCBldGMpLCB0aGVuIHJldHVybiBpdCBhcyBhbgorICAvLy8gTVZUOjpTaW1wbGVWYWx1ZVR5cGUuICBPdGhlcndpc2UsIHJldHVybiBNVlQ6Ok90aGVyLgorICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBnZXRLbm93blR5cGUodW5zaWduZWQgUmVzTm8pIGNvbnN0OworICAKKyAgLy8vIGhhc1Byb3BlcnR5IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGhhcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgorICAvLy8KKyAgYm9vbCBoYXNQcm9wZXJ0eShlbnVtIFNETlAgUHJvcCkgY29uc3QgeyByZXR1cm4gUHJvcGVydGllcyAmICgxIDw8IFByb3ApOyB9CisKKyAgLy8vIEFwcGx5VHlwZUNvbnN0cmFpbnRzIC0gR2l2ZW4gYSBub2RlIGluIGEgcGF0dGVybiwgYXBwbHkgdGhlIHR5cGUKKyAgLy8vIGNvbnN0cmFpbnRzIGZvciB0aGlzIG5vZGUgdG8gdGhlIG9wZXJhbmRzIG9mIHRoZSBub2RlLiAgVGhpcyByZXR1cm5zCisgIC8vLyB0cnVlIGlmIGl0IG1ha2VzIGEgY2hhbmdlLCBmYWxzZSBvdGhlcndpc2UuICBJZiBhIHR5cGUgY29udHJhZGljdGlvbiBpcworICAvLy8gZm91bmQsIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgYm9vbCBBcHBseVR5cGVDb25zdHJhaW50cyhUcmVlUGF0dGVybk5vZGUgKk4sIFRyZWVQYXR0ZXJuICZUUCkgY29uc3QgeworICAgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUeXBlQ29uc3RyYWludHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIE1hZGVDaGFuZ2UgfD0gVHlwZUNvbnN0cmFpbnRzW2ldLkFwcGx5VHlwZUNvbnN0cmFpbnQoTiwgKnRoaXMsIFRQKTsKKyAgICByZXR1cm4gTWFkZUNoYW5nZTsKKyAgfQorfTsKKworLy8vIEZJWE1FOiBUcmVlUGF0dGVybk5vZGUncyBjYW4gYmUgc2hhcmVkIGluIHNvbWUgY2FzZXMgKGR1ZSB0byBkYWctc2hhcGVkCisvLy8gcGF0dGVybnMpLCBhbmQgYXMgc3VjaCBzaG91bGQgYmUgcmVmIGNvdW50ZWQuICBXZSBjdXJyZW50bHkganVzdCBsZWFrIGFsbAorLy8vIFRyZWVQYXR0ZXJuTm9kZSBvYmplY3RzIQorY2xhc3MgVHJlZVBhdHRlcm5Ob2RlIHsKKyAgLy8vIFRoZSB0eXBlIG9mIGVhY2ggbm9kZSByZXN1bHQuICBCZWZvcmUgYW5kIGR1cmluZyB0eXBlIGluZmVyZW5jZSwgZWFjaAorICAvLy8gcmVzdWx0IG1heSBiZSBhIHNldCBvZiBwb3NzaWJsZSB0eXBlcy4gIEFmdGVyIChzdWNjZXNzZnVsKSB0eXBlIGluZmVyZW5jZSwKKyAgLy8vIGVhY2ggaXMgYSBzaW5nbGUgY29uY3JldGUgdHlwZS4KKyAgU21hbGxWZWN0b3I8RUVWVDo6VHlwZVNldCwgMT4gVHlwZXM7CisgIAorICAvLy8gT3BlcmF0b3IgLSBUaGUgUmVjb3JkIGZvciB0aGUgb3BlcmF0b3IgaWYgdGhpcyBpcyBhbiBpbnRlcmlvciBub2RlIChub3QKKyAgLy8vIGEgbGVhZikuCisgIFJlY29yZCAqT3BlcmF0b3I7CisgIAorICAvLy8gVmFsIC0gVGhlIGluaXQgdmFsdWUgKGUuZy4gdGhlICJHUFJDIiByZWNvcmQsIG9yICI3IikgZm9yIGEgbGVhZi4KKyAgLy8vCisgIEluaXQgKlZhbDsKKyAgCisgIC8vLyBOYW1lIC0gVGhlIG5hbWUgZ2l2ZW4gdG8gdGhpcyBub2RlIHdpdGggdGhlIDokZm9vIG5vdGF0aW9uLgorICAvLy8KKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgCisgIC8vLyBQcmVkaWNhdGVGbnMgLSBUaGUgcHJlZGljYXRlIGZ1bmN0aW9ucyB0byBleGVjdXRlIG9uIHRoaXMgbm9kZSB0byBjaGVjaworICAvLy8gZm9yIGEgbWF0Y2guICBJZiB0aGlzIGxpc3QgaXMgZW1wdHksIG5vIHByZWRpY2F0ZSBpcyBpbnZvbHZlZC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFByZWRpY2F0ZUZuczsKKyAgCisgIC8vLyBUcmFuc2Zvcm1GbiAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlIG9uIHRoaXMgbm9kZSBiZWZvcmUKKyAgLy8vIGl0IGNhbiBiZSBzdWJzdGl0dXRlZCBpbnRvIHRoZSByZXN1bHRpbmcgaW5zdHJ1Y3Rpb24gb24gYSBwYXR0ZXJuIG1hdGNoLgorICBSZWNvcmQgKlRyYW5zZm9ybUZuOworICAKKyAgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gQ2hpbGRyZW47CitwdWJsaWM6CisgIFRyZWVQYXR0ZXJuTm9kZShSZWNvcmQgKk9wLCBjb25zdCBzdGQ6OnZlY3RvcjxUcmVlUGF0dGVybk5vZGUqPiAmQ2gsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZXN1bHRzKSAKKyAgICA6IE9wZXJhdG9yKE9wKSwgVmFsKDApLCBUcmFuc2Zvcm1GbigwKSwgQ2hpbGRyZW4oQ2gpIHsKKyAgICBUeXBlcy5yZXNpemUoTnVtUmVzdWx0cyk7CisgIH0KKyAgVHJlZVBhdHRlcm5Ob2RlKEluaXQgKnZhbCwgdW5zaWduZWQgTnVtUmVzdWx0cykgICAgLy8gbGVhZiBjdG9yCisgICAgOiBPcGVyYXRvcigwKSwgVmFsKHZhbCksIFRyYW5zZm9ybUZuKDApIHsKKyAgICBUeXBlcy5yZXNpemUoTnVtUmVzdWx0cyk7CisgIH0KKyAgflRyZWVQYXR0ZXJuTm9kZSgpOworICAKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIHZvaWQgc2V0TmFtZShTdHJpbmdSZWYgTikgeyBOYW1lLmFzc2lnbihOLmJlZ2luKCksIE4uZW5kKCkpOyB9CisgIAorICBib29sIGlzTGVhZigpIGNvbnN0IHsgcmV0dXJuIFZhbCAhPSAwOyB9CisgIAorICAvLyBUeXBlIGFjY2Vzc29ycy4KKyAgdW5zaWduZWQgZ2V0TnVtVHlwZXMoKSBjb25zdCB7IHJldHVybiBUeXBlcy5zaXplKCk7IH0KKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0VHlwZSh1bnNpZ25lZCBSZXNObykgY29uc3QgeworICAgIHJldHVybiBUeXBlc1tSZXNOb10uZ2V0Q29uY3JldGUoKTsKKyAgfQorICBjb25zdCBTbWFsbFZlY3RvckltcGw8RUVWVDo6VHlwZVNldD4gJmdldEV4dFR5cGVzKCkgY29uc3QgeyByZXR1cm4gVHlwZXM7IH0KKyAgY29uc3QgRUVWVDo6VHlwZVNldCAmZ2V0RXh0VHlwZSh1bnNpZ25lZCBSZXNObykgY29uc3QgeyByZXR1cm4gVHlwZXNbUmVzTm9dOyB9CisgIEVFVlQ6OlR5cGVTZXQgJmdldEV4dFR5cGUodW5zaWduZWQgUmVzTm8pIHsgcmV0dXJuIFR5cGVzW1Jlc05vXTsgfQorICB2b2lkIHNldFR5cGUodW5zaWduZWQgUmVzTm8sIGNvbnN0IEVFVlQ6OlR5cGVTZXQgJlQpIHsgVHlwZXNbUmVzTm9dID0gVDsgfQorICAKKyAgYm9vbCBoYXNUeXBlU2V0KHVuc2lnbmVkIFJlc05vKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVzW1Jlc05vXS5pc0NvbmNyZXRlKCk7CisgIH0KKyAgYm9vbCBpc1R5cGVDb21wbGV0ZWx5VW5rbm93bih1bnNpZ25lZCBSZXNObykgY29uc3QgeworICAgIHJldHVybiBUeXBlc1tSZXNOb10uaXNDb21wbGV0ZWx5VW5rbm93bigpOworICB9CisgIGJvb2wgaXNUeXBlRHluYW1pY2FsbHlSZXNvbHZlZCh1bnNpZ25lZCBSZXNObykgY29uc3QgeworICAgIHJldHVybiBUeXBlc1tSZXNOb10uaXNEeW5hbWljYWxseVJlc29sdmVkKCk7CisgIH0KKyAgCisgIEluaXQgKmdldExlYWZWYWx1ZSgpIGNvbnN0IHsgYXNzZXJ0KGlzTGVhZigpKTsgcmV0dXJuIFZhbDsgfQorICBSZWNvcmQgKmdldE9wZXJhdG9yKCkgY29uc3QgeyBhc3NlcnQoIWlzTGVhZigpKTsgcmV0dXJuIE9wZXJhdG9yOyB9CisgIAorICB1bnNpZ25lZCBnZXROdW1DaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuLnNpemUoKTsgfQorICBUcmVlUGF0dGVybk5vZGUgKmdldENoaWxkKHVuc2lnbmVkIE4pIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuW05dOyB9CisgIHZvaWQgc2V0Q2hpbGQodW5zaWduZWQgaSwgVHJlZVBhdHRlcm5Ob2RlICpOKSB7CisgICAgQ2hpbGRyZW5baV0gPSBOOworICB9CisgIAorICAvLy8gaGFzQ2hpbGQgLSBSZXR1cm4gdHJ1ZSBpZiBOIGlzIGFueSBvZiBvdXIgY2hpbGRyZW4uCisgIGJvb2wgaGFzQ2hpbGQoY29uc3QgVHJlZVBhdHRlcm5Ob2RlICpOKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENoaWxkcmVuLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoQ2hpbGRyZW5baV0gPT0gTikgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZnZXRQcmVkaWNhdGVGbnMoKSBjb25zdCB7cmV0dXJuIFByZWRpY2F0ZUZuczt9CisgIHZvaWQgY2xlYXJQcmVkaWNhdGVGbnMoKSB7IFByZWRpY2F0ZUZucy5jbGVhcigpOyB9CisgIHZvaWQgc2V0UHJlZGljYXRlRm5zKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmRm5zKSB7CisgICAgYXNzZXJ0KFByZWRpY2F0ZUZucy5lbXB0eSgpICYmICJPdmVyd3JpdGluZyBub24tZW1wdHkgcHJlZGljYXRlIGxpc3QhIik7CisgICAgUHJlZGljYXRlRm5zID0gRm5zOworICB9CisgIHZvaWQgYWRkUHJlZGljYXRlRm4oY29uc3Qgc3RkOjpzdHJpbmcgJkZuKSB7IAorICAgIGFzc2VydCghRm4uZW1wdHkoKSAmJiAiRW1wdHkgcHJlZGljYXRlIHN0cmluZyEiKTsKKyAgICBpZiAoc3RkOjpmaW5kKFByZWRpY2F0ZUZucy5iZWdpbigpLCBQcmVkaWNhdGVGbnMuZW5kKCksIEZuKSA9PQorICAgICAgICAgIFByZWRpY2F0ZUZucy5lbmQoKSkKKyAgICAgIFByZWRpY2F0ZUZucy5wdXNoX2JhY2soRm4pOworICB9CisKKyAgUmVjb3JkICpnZXRUcmFuc2Zvcm1GbigpIGNvbnN0IHsgcmV0dXJuIFRyYW5zZm9ybUZuOyB9CisgIHZvaWQgc2V0VHJhbnNmb3JtRm4oUmVjb3JkICpGbikgeyBUcmFuc2Zvcm1GbiA9IEZuOyB9CisgIAorICAvLy8gZ2V0SW50cmluc2ljSW5mbyAtIElmIHRoaXMgbm9kZSBjb3JyZXNwb25kcyB0byBhbiBpbnRyaW5zaWMsIHJldHVybiB0aGUKKyAgLy8vIENvZGVHZW5JbnRyaW5zaWMgaW5mb3JtYXRpb24gZm9yIGl0LCBvdGhlcndpc2UgcmV0dXJuIGEgbnVsbCBwb2ludGVyLgorICBjb25zdCBDb2RlR2VuSW50cmluc2ljICpnZXRJbnRyaW5zaWNJbmZvKGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmQ0RQKSBjb25zdDsKKworICAvLy8gZ2V0Q29tcGxleFBhdHRlcm5JbmZvIC0gSWYgdGhpcyBub2RlIGNvcnJlc3BvbmRzIHRvIGEgQ29tcGxleFBhdHRlcm4sCisgIC8vLyByZXR1cm4gdGhlIENvbXBsZXhQYXR0ZXJuIGluZm9ybWF0aW9uLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIGNvbnN0IENvbXBsZXhQYXR0ZXJuICoKKyAgZ2V0Q29tcGxleFBhdHRlcm5JbmZvKGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmQ0dQKSBjb25zdDsKKworICAvLy8gTm9kZUhhc1Byb3BlcnR5IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGhhcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgorICBib29sIE5vZGVIYXNQcm9wZXJ0eShTRE5QIFByb3BlcnR5LCBjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNHUCkgY29uc3Q7CisgIAorICAvLy8gVHJlZUhhc1Byb3BlcnR5IC0gUmV0dXJuIHRydWUgaWYgYW55IG5vZGUgaW4gdGhpcyB0cmVlIGhhcyB0aGUgc3BlY2lmaWVkCisgIC8vLyBwcm9wZXJ0eS4KKyAgYm9vbCBUcmVlSGFzUHJvcGVydHkoU0ROUCBQcm9wZXJ0eSwgY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZDR1ApIGNvbnN0OworICAKKyAgLy8vIGlzQ29tbXV0YXRpdmVJbnRyaW5zaWMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhbiBpbnRyaW5zaWMgd2hpY2ggaXMKKyAgLy8vIG1hcmtlZCBpc0NvbW11dGF0aXZlLgorICBib29sIGlzQ29tbXV0YXRpdmVJbnRyaW5zaWMoY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZDRFApIGNvbnN0OworICAKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgCitwdWJsaWM6ICAgLy8gSGlnaGVyIGxldmVsIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKworICAvLy8gY2xvbmUgLSBSZXR1cm4gYSBuZXcgY29weSBvZiB0aGlzIHRyZWUuCisgIC8vLworICBUcmVlUGF0dGVybk5vZGUgKmNsb25lKCkgY29uc3Q7CisKKyAgLy8vIFJlbW92ZUFsbFR5cGVzIC0gUmVjdXJzaXZlbHkgc3RyaXAgYWxsIHRoZSB0eXBlcyBvZiB0aGlzIHRyZWUuCisgIHZvaWQgUmVtb3ZlQWxsVHlwZXMoKTsKKyAgCisgIC8vLyBpc0lzb21vcnBoaWNUbyAtIFJldHVybiB0cnVlIGlmIHRoaXMgbm9kZSBpcyByZWN1cnNpdmVseSBpc29tb3JwaGljIHRvCisgIC8vLyB0aGUgc3BlY2lmaWVkIG5vZGUuICBGb3IgdGhpcyBjb21wYXJpc29uLCBhbGwgb2YgdGhlIHN0YXRlIG9mIHRoZSBub2RlCisgIC8vLyBpcyBjb25zaWRlcmVkLCBleGNlcHQgZm9yIHRoZSBhc3NpZ25lZCBuYW1lLiAgTm9kZXMgd2l0aCBkaWZmZXJpbmcgbmFtZXMKKyAgLy8vIHRoYXQgYXJlIG90aGVyd2lzZSBpZGVudGljYWwgYXJlIGNvbnNpZGVyZWQgaXNvbW9ycGhpYy4KKyAgYm9vbCBpc0lzb21vcnBoaWNUbyhjb25zdCBUcmVlUGF0dGVybk5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlwbGVVc2VWYXJTZXQgJkRlcFZhcnMpIGNvbnN0OworICAKKyAgLy8vIFN1YnN0aXR1dGVGb3JtYWxBcmd1bWVudHMgLSBSZXBsYWNlIHRoZSBmb3JtYWwgYXJndW1lbnRzIGluIHRoaXMgdHJlZQorICAvLy8gd2l0aCBhY3R1YWwgdmFsdWVzIHNwZWNpZmllZCBieSBBcmdNYXAuCisgIHZvaWQgU3Vic3RpdHV0ZUZvcm1hbEFyZ3VtZW50cyhzdGQ6Om1hcDxzdGQ6OnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVQYXR0ZXJuTm9kZSo+ICZBcmdNYXApOworCisgIC8vLyBJbmxpbmVQYXR0ZXJuRnJhZ21lbnRzIC0gSWYgdGhpcyBwYXR0ZXJuIHJlZmVycyB0byBhbnkgcGF0dGVybgorICAvLy8gZnJhZ21lbnRzLCBpbmxpbmUgdGhlbSBpbnRvIHBsYWNlLCBnaXZpbmcgdXMgYSBwYXR0ZXJuIHdpdGhvdXQgYW55CisgIC8vLyBQYXRGcmFnIHJlZmVyZW5jZXMuCisgIFRyZWVQYXR0ZXJuTm9kZSAqSW5saW5lUGF0dGVybkZyYWdtZW50cyhUcmVlUGF0dGVybiAmVFApOworICAKKyAgLy8vIEFwcGx5VHlwZUNvbnN0cmFpbnRzIC0gQXBwbHkgYWxsIG9mIHRoZSB0eXBlIGNvbnN0cmFpbnRzIHJlbGV2YW50IHRvCisgIC8vLyB0aGlzIG5vZGUgYW5kIGl0cyBjaGlsZHJlbiBpbiB0aGUgdHJlZS4gIFRoaXMgcmV0dXJucyB0cnVlIGlmIGl0IG1ha2VzIGEKKyAgLy8vIGNoYW5nZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgSWYgYSB0eXBlIGNvbnRyYWRpY3Rpb24gaXMgZm91bmQsIHRocm93IGFuCisgIC8vLyBleGNlcHRpb24uCisgIGJvb2wgQXBwbHlUeXBlQ29uc3RyYWludHMoVHJlZVBhdHRlcm4gJlRQLCBib29sIE5vdFJlZ2lzdGVycyk7CisgIAorICAvLy8gVXBkYXRlTm9kZVR5cGUgLSBTZXQgdGhlIG5vZGUgdHlwZSBvZiBOIHRvIFZUIGlmIFZUIGNvbnRhaW5zCisgIC8vLyBpbmZvcm1hdGlvbi4gIElmIE4gYWxyZWFkeSBjb250YWlucyBhIGNvbmZsaWN0aW5nIHR5cGUsIHRoZW4gdGhyb3cgYW4KKyAgLy8vIGV4Y2VwdGlvbi4gIFRoaXMgcmV0dXJucyB0cnVlIGlmIGFueSBpbmZvcm1hdGlvbiB3YXMgdXBkYXRlZC4KKyAgLy8vCisgIGJvb2wgVXBkYXRlTm9kZVR5cGUodW5zaWduZWQgUmVzTm8sIGNvbnN0IEVFVlQ6OlR5cGVTZXQgJkluVHksCisgICAgICAgICAgICAgICAgICAgICAgVHJlZVBhdHRlcm4gJlRQKSB7CisgICAgcmV0dXJuIFR5cGVzW1Jlc05vXS5NZXJnZUluVHlwZUluZm8oSW5UeSwgVFApOworICB9CisKKyAgYm9vbCBVcGRhdGVOb2RlVHlwZSh1bnNpZ25lZCBSZXNObywgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgSW5UeSwKKyAgICAgICAgICAgICAgICAgICAgICBUcmVlUGF0dGVybiAmVFApIHsKKyAgICByZXR1cm4gVHlwZXNbUmVzTm9dLk1lcmdlSW5UeXBlSW5mbyhFRVZUOjpUeXBlU2V0KEluVHksIFRQKSwgVFApOworICB9CisgIAorICAvLy8gQ29udGFpbnNVbnJlc29sdmVkVHlwZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgdHJlZSBjb250YWlucyBhbnkKKyAgLy8vIHVucmVzb2x2ZWQgdHlwZXMuCisgIGJvb2wgQ29udGFpbnNVbnJlc29sdmVkVHlwZSgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVHlwZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICghVHlwZXNbaV0uaXNDb25jcmV0ZSgpKSByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoZ2V0Q2hpbGQoaSktPkNvbnRhaW5zVW5yZXNvbHZlZFR5cGUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLy8gY2FuUGF0dGVybk1hdGNoIC0gSWYgaXQgaXMgaW1wb3NzaWJsZSBmb3IgdGhpcyBwYXR0ZXJuIHRvIG1hdGNoIG9uIHRoaXMKKyAgLy8vIHRhcmdldCwgZmlsbCBpbiBSZWFzb24gYW5kIHJldHVybiBmYWxzZS4gIE90aGVyd2lzZSwgcmV0dXJuIHRydWUuCisgIGJvb2wgY2FuUGF0dGVybk1hdGNoKHN0ZDo6c3RyaW5nICZSZWFzb24sIGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmQ0RQKTsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAmVFBOKSB7CisgIFRQTi5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKyAgCisKKy8vLyBUcmVlUGF0dGVybiAtIFJlcHJlc2VudCBhIHBhdHRlcm4sIHVzZWQgZm9yIGluc3RydWN0aW9ucywgcGF0dGVybgorLy8vIGZyYWdtZW50cywgZXRjLgorLy8vCitjbGFzcyBUcmVlUGF0dGVybiB7CisgIC8vLyBUcmVlcyAtIFRoZSBsaXN0IG9mIHBhdHRlcm4gdHJlZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhpcyBwYXR0ZXJuLgorICAvLy8gTm90ZSB0aGF0IFBhdEZyYWcncyBvbmx5IGhhdmUgYSBzaW5nbGUgdHJlZS4KKyAgLy8vCisgIHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+IFRyZWVzOworICAKKyAgLy8vIE5hbWVkTm9kZXMgLSBUaGlzIGlzIGFsbCBvZiB0aGUgbm9kZXMgdGhhdCBoYXZlIG5hbWVzIGluIHRoZSB0cmVlcyBpbiB0aGlzCisgIC8vLyBwYXR0ZXJuLgorICBTdHJpbmdNYXA8U21hbGxWZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKiwxPiA+IE5hbWVkTm9kZXM7CisgIAorICAvLy8gVGhlUmVjb3JkIC0gVGhlIGFjdHVhbCBUYWJsZUdlbiByZWNvcmQgY29ycmVzcG9uZGluZyB0byB0aGlzIHBhdHRlcm4uCisgIC8vLworICBSZWNvcmQgKlRoZVJlY29yZDsKKyAgICAKKyAgLy8vIEFyZ3MgLSBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGlzIHBhdHRlcm4gKGZvcgorICAvLy8gUGF0RnJhZyBwYXR0ZXJucyksIHdoaWNoIGFyZSB0aGUgJ25vZGUnIG1hcmtlcnMgaW4gdGhpcyBwYXR0ZXJuLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQXJnczsKKyAgCisgIC8vLyBDRFAgLSB0aGUgdG9wLWxldmVsIG9iamVjdCBjb29yZGluYXRpbmcgdGhpcyBtYWRuZXNzLgorICAvLy8KKyAgQ29kZUdlbkRBR1BhdHRlcm5zICZDRFA7CisKKyAgLy8vIGlzSW5wdXRQYXR0ZXJuIC0gVHJ1ZSBpZiB0aGlzIGlzIGFuIGlucHV0IHBhdHRlcm4sIHNvbWV0aGluZyB0byBtYXRjaC4KKyAgLy8vIEZhbHNlIGlmIHRoaXMgaXMgYW4gb3V0cHV0IHBhdHRlcm4sIHNvbWV0aGluZyB0byBlbWl0LgorICBib29sIGlzSW5wdXRQYXR0ZXJuOworcHVibGljOgorICAgIAorICAvLy8gVHJlZVBhdHRlcm4gY29uc3RydWN0b3IgLSBQYXJzZSB0aGUgc3BlY2lmaWVkIERhZ0luaXRzIGludG8gdGhlCisgIC8vLyBjdXJyZW50IHJlY29yZC4KKyAgVHJlZVBhdHRlcm4oUmVjb3JkICpUaGVSZWMsIExpc3RJbml0ICpSYXdQYXQsIGJvb2wgaXNJbnB1dCwKKyAgICAgICAgICAgICAgQ29kZUdlbkRBR1BhdHRlcm5zICZpc2UpOworICBUcmVlUGF0dGVybihSZWNvcmQgKlRoZVJlYywgRGFnSW5pdCAqUGF0LCBib29sIGlzSW5wdXQsCisgICAgICAgICAgICAgIENvZGVHZW5EQUdQYXR0ZXJucyAmaXNlKTsKKyAgVHJlZVBhdHRlcm4oUmVjb3JkICpUaGVSZWMsIFRyZWVQYXR0ZXJuTm9kZSAqUGF0LCBib29sIGlzSW5wdXQsCisgICAgICAgICAgICAgIENvZGVHZW5EQUdQYXR0ZXJucyAmaXNlKTsKKyAgICAgIAorICAvLy8gZ2V0VHJlZXMgLSBSZXR1cm4gdGhlIHRyZWUgcGF0dGVybnMgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhpcyBwYXR0ZXJuLgorICAvLy8KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VHJlZVBhdHRlcm5Ob2RlKj4gJmdldFRyZWVzKCkgY29uc3QgeyByZXR1cm4gVHJlZXM7IH0KKyAgdW5zaWduZWQgZ2V0TnVtVHJlZXMoKSBjb25zdCB7IHJldHVybiBUcmVlcy5zaXplKCk7IH0KKyAgVHJlZVBhdHRlcm5Ob2RlICpnZXRUcmVlKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIFRyZWVzW2ldOyB9CisgIFRyZWVQYXR0ZXJuTm9kZSAqZ2V0T25seVRyZWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KFRyZWVzLnNpemUoKSA9PSAxICYmICJEb2Vzbid0IGhhdmUgZXhhY3RseSBvbmUgcGF0dGVybiEiKTsKKyAgICByZXR1cm4gVHJlZXNbMF07CisgIH0KKyAgCisgIGNvbnN0IFN0cmluZ01hcDxTbWFsbFZlY3RvcjxUcmVlUGF0dGVybk5vZGUqLDE+ID4gJmdldE5hbWVkTm9kZXNNYXAoKSB7CisgICAgaWYgKE5hbWVkTm9kZXMuZW1wdHkoKSkKKyAgICAgIENvbXB1dGVOYW1lZE5vZGVzKCk7CisgICAgcmV0dXJuIE5hbWVkTm9kZXM7CisgIH0KKyAgICAgIAorICAvLy8gZ2V0UmVjb3JkIC0gUmV0dXJuIHRoZSBhY3R1YWwgVGFibGVHZW4gcmVjb3JkIGNvcnJlc3BvbmRpbmcgdG8gdGhpcworICAvLy8gcGF0dGVybi4KKyAgLy8vCisgIFJlY29yZCAqZ2V0UmVjb3JkKCkgY29uc3QgeyByZXR1cm4gVGhlUmVjb3JkOyB9CisgIAorICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gQXJncy5zaXplKCk7IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEFyZ05hbWUodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgQXJncy5zaXplKCkgJiYgIkFyZ3VtZW50IHJlZmVyZW5jZSBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIEFyZ3NbaV07CisgIH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZnZXRBcmdMaXN0KCkgeyByZXR1cm4gQXJnczsgfQorICAKKyAgQ29kZUdlbkRBR1BhdHRlcm5zICZnZXREQUdQYXR0ZXJucygpIGNvbnN0IHsgcmV0dXJuIENEUDsgfQorCisgIC8vLyBJbmxpbmVQYXR0ZXJuRnJhZ21lbnRzIC0gSWYgdGhpcyBwYXR0ZXJuIHJlZmVycyB0byBhbnkgcGF0dGVybgorICAvLy8gZnJhZ21lbnRzLCBpbmxpbmUgdGhlbSBpbnRvIHBsYWNlLCBnaXZpbmcgdXMgYSBwYXR0ZXJuIHdpdGhvdXQgYW55CisgIC8vLyBQYXRGcmFnIHJlZmVyZW5jZXMuCisgIHZvaWQgSW5saW5lUGF0dGVybkZyYWdtZW50cygpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVHJlZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIFRyZWVzW2ldID0gVHJlZXNbaV0tPklubGluZVBhdHRlcm5GcmFnbWVudHMoKnRoaXMpOworICB9CisgIAorICAvLy8gSW5mZXJBbGxUeXBlcyAtIEluZmVyL3Byb3BhZ2F0ZSBhcyBtYW55IHR5cGVzIHRocm91Z2hvdXQgdGhlIGV4cHJlc3Npb24KKyAgLy8vIHBhdHRlcm5zIGFzIHBvc3NpYmxlLiAgUmV0dXJuIHRydWUgaWYgYWxsIHR5cGVzIGFyZSBpbmZlcnJlZCwgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4gIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhIHR5cGUgY29udHJhZGljdGlvbiBpcyBmb3VuZC4KKyAgYm9vbCBJbmZlckFsbFR5cGVzKGNvbnN0IFN0cmluZ01hcDxTbWFsbFZlY3RvcjxUcmVlUGF0dGVybk5vZGUqLDE+ID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKk5hbWVkVHlwZXM9MCk7CisgIAorICAvLy8gZXJyb3IgLSBUaHJvdyBhbiBleGNlcHRpb24sIHByZWZpeGluZyBpdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoaXMKKyAgLy8vIHBhdHRlcm4uCisgIHZvaWQgZXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJk1zZykgY29uc3Q7CisgIAorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworICAKK3ByaXZhdGU6CisgIFRyZWVQYXR0ZXJuTm9kZSAqUGFyc2VUcmVlUGF0dGVybihJbml0ICpESSwgU3RyaW5nUmVmIE9wTmFtZSk7CisgIHZvaWQgQ29tcHV0ZU5hbWVkTm9kZXMoKTsKKyAgdm9pZCBDb21wdXRlTmFtZWROb2RlcyhUcmVlUGF0dGVybk5vZGUgKk4pOworfTsKKworLy8vIERBR0RlZmF1bHRPcGVyYW5kIC0gT25lIG9mIHRoZXNlIGlzIGNyZWF0ZWQgZm9yIGVhY2ggUHJlZGljYXRlT3BlcmFuZAorLy8vIG9yIE9wdGlvbmFsRGVmT3BlcmFuZCB0aGF0IGhhcyBhIHNldCBFeGVjdXRlQWx3YXlzIC8gRGVmYXVsdE9wcyBmaWVsZC4KK3N0cnVjdCBEQUdEZWZhdWx0T3BlcmFuZCB7CisgIHN0ZDo6dmVjdG9yPFRyZWVQYXR0ZXJuTm9kZSo+IERlZmF1bHRPcHM7Cit9OworCitjbGFzcyBEQUdJbnN0cnVjdGlvbiB7CisgIFRyZWVQYXR0ZXJuICpQYXR0ZXJuOworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBSZXN1bHRzOworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBPcGVyYW5kczsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gSW1wUmVzdWx0czsKKyAgVHJlZVBhdHRlcm5Ob2RlICpSZXN1bHRQYXR0ZXJuOworcHVibGljOgorICBEQUdJbnN0cnVjdGlvbihUcmVlUGF0dGVybiAqVFAsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+ICZyZXN1bHRzLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmb3BlcmFuZHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+ICZpbXByZXN1bHRzKQorICAgIDogUGF0dGVybihUUCksIFJlc3VsdHMocmVzdWx0cyksIE9wZXJhbmRzKG9wZXJhbmRzKSwgCisgICAgICBJbXBSZXN1bHRzKGltcHJlc3VsdHMpLCBSZXN1bHRQYXR0ZXJuKDApIHt9CisKKyAgY29uc3QgVHJlZVBhdHRlcm4gKmdldFBhdHRlcm4oKSBjb25zdCB7IHJldHVybiBQYXR0ZXJuOyB9CisgIHVuc2lnbmVkIGdldE51bVJlc3VsdHMoKSBjb25zdCB7IHJldHVybiBSZXN1bHRzLnNpemUoKTsgfQorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRzLnNpemUoKTsgfQorICB1bnNpZ25lZCBnZXROdW1JbXBSZXN1bHRzKCkgY29uc3QgeyByZXR1cm4gSW1wUmVzdWx0cy5zaXplKCk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkKj4mIGdldEltcFJlc3VsdHMoKSBjb25zdCB7IHJldHVybiBJbXBSZXN1bHRzOyB9CisgIAorICB2b2lkIHNldFJlc3VsdFBhdHRlcm4oVHJlZVBhdHRlcm5Ob2RlICpSKSB7IFJlc3VsdFBhdHRlcm4gPSBSOyB9CisgIAorICBSZWNvcmQgKmdldFJlc3VsdCh1bnNpZ25lZCBSTikgY29uc3QgeworICAgIGFzc2VydChSTiA8IFJlc3VsdHMuc2l6ZSgpKTsKKyAgICByZXR1cm4gUmVzdWx0c1tSTl07CisgIH0KKyAgCisgIFJlY29yZCAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBPTikgY29uc3QgeworICAgIGFzc2VydChPTiA8IE9wZXJhbmRzLnNpemUoKSk7CisgICAgcmV0dXJuIE9wZXJhbmRzW09OXTsKKyAgfQorCisgIFJlY29yZCAqZ2V0SW1wUmVzdWx0KHVuc2lnbmVkIFJOKSBjb25zdCB7CisgICAgYXNzZXJ0KFJOIDwgSW1wUmVzdWx0cy5zaXplKCkpOworICAgIHJldHVybiBJbXBSZXN1bHRzW1JOXTsKKyAgfQorICAKKyAgVHJlZVBhdHRlcm5Ob2RlICpnZXRSZXN1bHRQYXR0ZXJuKCkgY29uc3QgeyByZXR1cm4gUmVzdWx0UGF0dGVybjsgfQorfTsKKyAgCisvLy8gUGF0dGVyblRvTWF0Y2ggLSBVc2VkIGJ5IENvZGVHZW5EQUdQYXR0ZXJucyB0byBrZWVwIHRhYiBvZiBwYXR0ZXJucworLy8vIHByb2Nlc3NlZCB0byBwcm9kdWNlIGlzZWwuCitjbGFzcyBQYXR0ZXJuVG9NYXRjaCB7CitwdWJsaWM6CisgIFBhdHRlcm5Ub01hdGNoKExpc3RJbml0ICpwcmVkcywKKyAgICAgICAgICAgICAgICAgVHJlZVBhdHRlcm5Ob2RlICpzcmMsIFRyZWVQYXR0ZXJuTm9kZSAqZHN0LAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmZHN0cmVncywKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29tcGxleGl0eSwgdW5zaWduZWQgdWlkKQorICAgIDogUHJlZGljYXRlcyhwcmVkcyksIFNyY1BhdHRlcm4oc3JjKSwgRHN0UGF0dGVybihkc3QpLAorICAgICAgRHN0cmVncyhkc3RyZWdzKSwgQWRkZWRDb21wbGV4aXR5KGNvbXBsZXhpdHkpLCBJRCh1aWQpIHt9CisKKyAgTGlzdEluaXQgICAgICAgICpQcmVkaWNhdGVzOyAgLy8gVG9wIGxldmVsIHByZWRpY2F0ZSBjb25kaXRpb25zIHRvIG1hdGNoLgorICBUcmVlUGF0dGVybk5vZGUgKlNyY1BhdHRlcm47ICAvLyBTb3VyY2UgcGF0dGVybiB0byBtYXRjaC4KKyAgVHJlZVBhdHRlcm5Ob2RlICpEc3RQYXR0ZXJuOyAgLy8gUmVzdWx0aW5nIHBhdHRlcm4uCisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IERzdHJlZ3M7IC8vIFBoeXNpY2FsIHJlZ2lzdGVyIGRlZnMgYmVpbmcgbWF0Y2hlZC4KKyAgdW5zaWduZWQgICAgICAgICBBZGRlZENvbXBsZXhpdHk7IC8vIEFkZCB0byBtYXRjaGluZyBwYXR0ZXJuIGNvbXBsZXhpdHkuCisgIHVuc2lnbmVkICAgICAgICAgSUQ7ICAgICAgICAgIC8vIFVuaXF1ZSBJRCBmb3IgdGhlIHJlY29yZC4KKworICBMaXN0SW5pdCAgICAgICAgKmdldFByZWRpY2F0ZXMoKSBjb25zdCB7IHJldHVybiBQcmVkaWNhdGVzOyB9CisgIFRyZWVQYXR0ZXJuTm9kZSAqZ2V0U3JjUGF0dGVybigpIGNvbnN0IHsgcmV0dXJuIFNyY1BhdHRlcm47IH0KKyAgVHJlZVBhdHRlcm5Ob2RlICpnZXREc3RQYXR0ZXJuKCkgY29uc3QgeyByZXR1cm4gRHN0UGF0dGVybjsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmZ2V0RHN0UmVncygpIGNvbnN0IHsgcmV0dXJuIERzdHJlZ3M7IH0KKyAgdW5zaWduZWQgICAgICAgICBnZXRBZGRlZENvbXBsZXhpdHkoKSBjb25zdCB7IHJldHVybiBBZGRlZENvbXBsZXhpdHk7IH0KKworICBzdGQ6OnN0cmluZyBnZXRQcmVkaWNhdGVDaGVjaygpIGNvbnN0OworICAKKyAgLy8vIENvbXB1dGUgdGhlIGNvbXBsZXhpdHkgbWV0cmljIGZvciB0aGUgaW5wdXQgcGF0dGVybi4gIFRoaXMgcm91Z2hseQorICAvLy8gY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBub2RlcyB0aGF0IGFyZSBjb3ZlcmVkLgorICB1bnNpZ25lZCBnZXRQYXR0ZXJuQ29tcGxleGl0eShjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNHUCkgY29uc3Q7Cit9OworCisvLyBEZXRlcm1pbmlzdGljIGNvbXBhcmlzb24gb2YgUmVjb3JkKi4KK3N0cnVjdCBSZWNvcmRQdHJDbXAgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmVjb3JkICpMSFMsIGNvbnN0IFJlY29yZCAqUkhTKSBjb25zdDsKK307CisgIAorY2xhc3MgQ29kZUdlbkRBR1BhdHRlcm5zIHsKKyAgUmVjb3JkS2VlcGVyICZSZWNvcmRzOworICBDb2RlR2VuVGFyZ2V0IFRhcmdldDsKKyAgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gSW50cmluc2ljczsKKyAgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gVGd0SW50cmluc2ljczsKKyAgCisgIHN0ZDo6bWFwPFJlY29yZCosIFNETm9kZUluZm8sIFJlY29yZFB0ckNtcD4gU0ROb2RlczsKKyAgc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpwYWlyPFJlY29yZCosIHN0ZDo6c3RyaW5nPiwgUmVjb3JkUHRyQ21wPiBTRE5vZGVYRm9ybXM7CisgIHN0ZDo6bWFwPFJlY29yZCosIENvbXBsZXhQYXR0ZXJuLCBSZWNvcmRQdHJDbXA+IENvbXBsZXhQYXR0ZXJuczsKKyAgc3RkOjptYXA8UmVjb3JkKiwgVHJlZVBhdHRlcm4qLCBSZWNvcmRQdHJDbXA+IFBhdHRlcm5GcmFnbWVudHM7CisgIHN0ZDo6bWFwPFJlY29yZCosIERBR0RlZmF1bHRPcGVyYW5kLCBSZWNvcmRQdHJDbXA+IERlZmF1bHRPcGVyYW5kczsKKyAgc3RkOjptYXA8UmVjb3JkKiwgREFHSW5zdHJ1Y3Rpb24sIFJlY29yZFB0ckNtcD4gSW5zdHJ1Y3Rpb25zOworICAKKyAgLy8gU3BlY2lmaWMgU0ROb2RlIGRlZmluaXRpb25zOgorICBSZWNvcmQgKmludHJpbnNpY192b2lkX3Nkbm9kZTsKKyAgUmVjb3JkICppbnRyaW5zaWNfd19jaGFpbl9zZG5vZGUsICppbnRyaW5zaWNfd29fY2hhaW5fc2Rub2RlOworICAKKyAgLy8vIFBhdHRlcm5zVG9NYXRjaCAtIEFsbCBvZiB0aGUgdGhpbmdzIHdlIGFyZSBtYXRjaGluZyBvbiB0aGUgREFHLiAgVGhlIGZpcnN0CisgIC8vLyB2YWx1ZSBpcyB0aGUgcGF0dGVybiB0byBtYXRjaCwgdGhlIHNlY29uZCBwYXR0ZXJuIGlzIHRoZSByZXN1bHQgdG8KKyAgLy8vIGVtaXQuCisgIHN0ZDo6dmVjdG9yPFBhdHRlcm5Ub01hdGNoPiBQYXR0ZXJuc1RvTWF0Y2g7CitwdWJsaWM6CisgIENvZGVHZW5EQUdQYXR0ZXJucyhSZWNvcmRLZWVwZXIgJlIpOyAKKyAgfkNvZGVHZW5EQUdQYXR0ZXJucygpOworICAKKyAgQ29kZUdlblRhcmdldCAmZ2V0VGFyZ2V0SW5mbygpIHsgcmV0dXJuIFRhcmdldDsgfQorICBjb25zdCBDb2RlR2VuVGFyZ2V0ICZnZXRUYXJnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0OyB9CisgIAorICBSZWNvcmQgKmdldFNETm9kZU5hbWVkKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBjb25zdDsKKyAgCisgIGNvbnN0IFNETm9kZUluZm8gJmdldFNETm9kZUluZm8oUmVjb3JkICpSKSBjb25zdCB7CisgICAgYXNzZXJ0KFNETm9kZXMuY291bnQoUikgJiYgIlVua25vd24gbm9kZSEiKTsKKyAgICByZXR1cm4gU0ROb2Rlcy5maW5kKFIpLT5zZWNvbmQ7CisgIH0KKyAgCisgIC8vIE5vZGUgdHJhbnNmb3JtYXRpb24gbG9va3Vwcy4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8UmVjb3JkKiwgc3RkOjpzdHJpbmc+IE5vZGVYRm9ybTsKKyAgY29uc3QgTm9kZVhGb3JtICZnZXRTRE5vZGVUcmFuc2Zvcm0oUmVjb3JkICpSKSBjb25zdCB7CisgICAgYXNzZXJ0KFNETm9kZVhGb3Jtcy5jb3VudChSKSAmJiAiSW52YWxpZCB0cmFuc2Zvcm0hIik7CisgICAgcmV0dXJuIFNETm9kZVhGb3Jtcy5maW5kKFIpLT5zZWNvbmQ7CisgIH0KKyAgCisgIHR5cGVkZWYgc3RkOjptYXA8UmVjb3JkKiwgTm9kZVhGb3JtLCBSZWNvcmRQdHJDbXA+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgIG54X2l0ZXJhdG9yOworICBueF9pdGVyYXRvciBueF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFNETm9kZVhGb3Jtcy5iZWdpbigpOyB9CisgIG54X2l0ZXJhdG9yIG54X2VuZCgpIGNvbnN0IHsgcmV0dXJuIFNETm9kZVhGb3Jtcy5lbmQoKTsgfQorCisgIAorICBjb25zdCBDb21wbGV4UGF0dGVybiAmZ2V0Q29tcGxleFBhdHRlcm4oUmVjb3JkICpSKSBjb25zdCB7CisgICAgYXNzZXJ0KENvbXBsZXhQYXR0ZXJucy5jb3VudChSKSAmJiAiVW5rbm93biBhZGRyZXNzaW5nIG1vZGUhIik7CisgICAgcmV0dXJuIENvbXBsZXhQYXR0ZXJucy5maW5kKFIpLT5zZWNvbmQ7CisgIH0KKyAgCisgIGNvbnN0IENvZGVHZW5JbnRyaW5zaWMgJmdldEludHJpbnNpYyhSZWNvcmQgKlIpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW50cmluc2ljcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKEludHJpbnNpY3NbaV0uVGhlRGVmID09IFIpIHJldHVybiBJbnRyaW5zaWNzW2ldOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUZ3RJbnRyaW5zaWNzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVGd0SW50cmluc2ljc1tpXS5UaGVEZWYgPT0gUikgcmV0dXJuIFRndEludHJpbnNpY3NbaV07CisgICAgYXNzZXJ0KDAgJiYgIlVua25vd24gaW50cmluc2ljISIpOworICAgIGFib3J0KCk7CisgIH0KKyAgCisgIGNvbnN0IENvZGVHZW5JbnRyaW5zaWMgJmdldEludHJpbnNpY0luZm8odW5zaWduZWQgSUlEKSBjb25zdCB7CisgICAgaWYgKElJRC0xIDwgSW50cmluc2ljcy5zaXplKCkpCisgICAgICByZXR1cm4gSW50cmluc2ljc1tJSUQtMV07CisgICAgaWYgKElJRC1JbnRyaW5zaWNzLnNpemUoKS0xIDwgVGd0SW50cmluc2ljcy5zaXplKCkpCisgICAgICByZXR1cm4gVGd0SW50cmluc2ljc1tJSUQtSW50cmluc2ljcy5zaXplKCktMV07CisgICAgYXNzZXJ0KDAgJiYgIkJhZCBpbnRyaW5zaWMgSUQhIik7CisgICAgYWJvcnQoKTsKKyAgfQorICAKKyAgdW5zaWduZWQgZ2V0SW50cmluc2ljSUQoUmVjb3JkICpSKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEludHJpbnNpY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChJbnRyaW5zaWNzW2ldLlRoZURlZiA9PSBSKSByZXR1cm4gaTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVGd0SW50cmluc2ljcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFRndEludHJpbnNpY3NbaV0uVGhlRGVmID09IFIpIHJldHVybiBpICsgSW50cmluc2ljcy5zaXplKCk7CisgICAgYXNzZXJ0KDAgJiYgIlVua25vd24gaW50cmluc2ljISIpOworICAgIGFib3J0KCk7CisgIH0KKyAgCisgIGNvbnN0IERBR0RlZmF1bHRPcGVyYW5kICZnZXREZWZhdWx0T3BlcmFuZChSZWNvcmQgKlIpIGNvbnN0IHsKKyAgICBhc3NlcnQoRGVmYXVsdE9wZXJhbmRzLmNvdW50KFIpICYmIklzbid0IGFuIGFuYWx5emVkIGRlZmF1bHQgb3BlcmFuZCEiKTsKKyAgICByZXR1cm4gRGVmYXVsdE9wZXJhbmRzLmZpbmQoUiktPnNlY29uZDsKKyAgfQorICAKKyAgLy8gUGF0dGVybiBGcmFnbWVudCBpbmZvcm1hdGlvbi4KKyAgVHJlZVBhdHRlcm4gKmdldFBhdHRlcm5GcmFnbWVudChSZWNvcmQgKlIpIGNvbnN0IHsKKyAgICBhc3NlcnQoUGF0dGVybkZyYWdtZW50cy5jb3VudChSKSAmJiAiSW52YWxpZCBwYXR0ZXJuIGZyYWdtZW50IHJlcXVlc3QhIik7CisgICAgcmV0dXJuIFBhdHRlcm5GcmFnbWVudHMuZmluZChSKS0+c2Vjb25kOworICB9CisgIFRyZWVQYXR0ZXJuICpnZXRQYXR0ZXJuRnJhZ21lbnRJZlJlYWQoUmVjb3JkICpSKSBjb25zdCB7CisgICAgaWYgKCFQYXR0ZXJuRnJhZ21lbnRzLmNvdW50KFIpKSByZXR1cm4gMDsKKyAgICByZXR1cm4gUGF0dGVybkZyYWdtZW50cy5maW5kKFIpLT5zZWNvbmQ7CisgIH0KKyAgCisgIHR5cGVkZWYgc3RkOjptYXA8UmVjb3JkKiwgVHJlZVBhdHRlcm4qLCBSZWNvcmRQdHJDbXA+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgIHBmX2l0ZXJhdG9yOworICBwZl9pdGVyYXRvciBwZl9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFBhdHRlcm5GcmFnbWVudHMuYmVnaW4oKTsgfQorICBwZl9pdGVyYXRvciBwZl9lbmQoKSBjb25zdCB7IHJldHVybiBQYXR0ZXJuRnJhZ21lbnRzLmVuZCgpOyB9CisKKyAgLy8gUGF0dGVybnMgdG8gbWF0Y2ggaW5mb3JtYXRpb24uCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UGF0dGVyblRvTWF0Y2g+Ojpjb25zdF9pdGVyYXRvciBwdG1faXRlcmF0b3I7CisgIHB0bV9pdGVyYXRvciBwdG1fYmVnaW4oKSBjb25zdCB7IHJldHVybiBQYXR0ZXJuc1RvTWF0Y2guYmVnaW4oKTsgfQorICBwdG1faXRlcmF0b3IgcHRtX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFBhdHRlcm5zVG9NYXRjaC5lbmQoKTsgfQorICAKKyAgCisgIAorICBjb25zdCBEQUdJbnN0cnVjdGlvbiAmZ2V0SW5zdHJ1Y3Rpb24oUmVjb3JkICpSKSBjb25zdCB7CisgICAgYXNzZXJ0KEluc3RydWN0aW9ucy5jb3VudChSKSAmJiAiVW5rbm93biBpbnN0cnVjdGlvbiEiKTsKKyAgICByZXR1cm4gSW5zdHJ1Y3Rpb25zLmZpbmQoUiktPnNlY29uZDsKKyAgfQorICAKKyAgUmVjb3JkICpnZXRfaW50cmluc2ljX3ZvaWRfc2Rub2RlKCkgY29uc3QgeworICAgIHJldHVybiBpbnRyaW5zaWNfdm9pZF9zZG5vZGU7CisgIH0KKyAgUmVjb3JkICpnZXRfaW50cmluc2ljX3dfY2hhaW5fc2Rub2RlKCkgY29uc3QgeworICAgIHJldHVybiBpbnRyaW5zaWNfd19jaGFpbl9zZG5vZGU7CisgIH0KKyAgUmVjb3JkICpnZXRfaW50cmluc2ljX3dvX2NoYWluX3Nkbm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50cmluc2ljX3dvX2NoYWluX3Nkbm9kZTsKKyAgfQorICAKKyAgYm9vbCBoYXNUYXJnZXRJbnRyaW5zaWNzKCkgeyByZXR1cm4gIVRndEludHJpbnNpY3MuZW1wdHkoKTsgfQorCitwcml2YXRlOgorICB2b2lkIFBhcnNlTm9kZUluZm8oKTsKKyAgdm9pZCBQYXJzZU5vZGVUcmFuc2Zvcm1zKCk7CisgIHZvaWQgUGFyc2VDb21wbGV4UGF0dGVybnMoKTsKKyAgdm9pZCBQYXJzZVBhdHRlcm5GcmFnbWVudHMoKTsKKyAgdm9pZCBQYXJzZURlZmF1bHRPcGVyYW5kcygpOworICB2b2lkIFBhcnNlSW5zdHJ1Y3Rpb25zKCk7CisgIHZvaWQgUGFyc2VQYXR0ZXJucygpOworICB2b2lkIEluZmVySW5zdHJ1Y3Rpb25GbGFncygpOworICB2b2lkIEdlbmVyYXRlVmFyaWFudHMoKTsKKyAgCisgIHZvaWQgQWRkUGF0dGVyblRvTWF0Y2goY29uc3QgVHJlZVBhdHRlcm4gKlBhdHRlcm4sIGNvbnN0IFBhdHRlcm5Ub01hdGNoICZQVE0pOworICB2b2lkIEZpbmRQYXR0ZXJuSW5wdXRzQW5kT3V0cHV0cyhUcmVlUGF0dGVybiAqSSwgVHJlZVBhdHRlcm5Ob2RlICpQYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlUGF0dGVybk5vZGUqPiAmSW5zdElucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVQYXR0ZXJuTm9kZSo+ICZJbnN0UmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJkluc3RJbXBSZXN1bHRzKTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5JbnN0cnVjdGlvbi5jcHAgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuSW5zdHJ1Y3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTFmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuSW5zdHJ1Y3Rpb24uY3BwCkBAIC0wLDAgKzEsMzA2IEBACisvLz09PS0gQ29kZUdlbkluc3RydWN0aW9uLmNwcCAtIENvZGVHZW4gSW5zdHJ1Y3Rpb24gQ2xhc3MgV3JhcHBlciAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBDb2RlR2VuSW5zdHJ1Y3Rpb24gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkNvZGVHZW5JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgIkNvZGVHZW5UYXJnZXQuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlIDxzZXQ+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIHZvaWQgUGFyc2VDb25zdHJhaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZDU3RyLCBDb2RlR2VuSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgLy8gRUFSTFlfQ0xPQkJFUjogQGVhcmx5ICRyZWcKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSB3cG9zID0gQ1N0ci5maW5kX2ZpcnN0X29mKCIgXHQiKTsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzdGFydCA9IENTdHIuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOworICBzdGQ6OnN0cmluZyBUb2sgPSBDU3RyLnN1YnN0cihzdGFydCwgd3BvcyAtIHN0YXJ0KTsKKyAgaWYgKFRvayA9PSAiQGVhcmx5Y2xvYmJlciIpIHsKKyAgICBzdGQ6OnN0cmluZyBOYW1lID0gQ1N0ci5zdWJzdHIod3BvcysxKTsKKyAgICB3cG9zID0gTmFtZS5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgICAgaWYgKHdwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICB0aHJvdyAiSWxsZWdhbCBmb3JtYXQgZm9yIEBlYXJseWNsb2JiZXIgY29uc3RyYWludDogJyIgKyBDU3RyICsgIiciOworICAgIE5hbWUgPSBOYW1lLnN1YnN0cih3cG9zKTsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+IE9wID0KKyAgICAgIEktPlBhcnNlT3BlcmFuZE5hbWUoTmFtZSwgZmFsc2UpOworCisgICAgLy8gQnVpbGQgdGhlIHN0cmluZyBmb3IgdGhlIG9wZXJhbmQKKyAgICBpZiAoIUktPk9wZXJhbmRMaXN0W09wLmZpcnN0XS5Db25zdHJhaW50c1tPcC5zZWNvbmRdLmlzTm9uZSgpKQorICAgICAgdGhyb3cgIk9wZXJhbmQgJyIgKyBOYW1lICsgIicgY2Fubm90IGhhdmUgbXVsdGlwbGUgY29uc3RyYWludHMhIjsKKyAgICBJLT5PcGVyYW5kTGlzdFtPcC5maXJzdF0uQ29uc3RyYWludHNbT3Auc2Vjb25kXSA9CisgICAgICBDb2RlR2VuSW5zdHJ1Y3Rpb246OkNvbnN0cmFpbnRJbmZvOjpnZXRFYXJseUNsb2JiZXIoKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBPbmx5IG90aGVyIGNvbnN0cmFpbnQgaXMgIlRJRURfVE8iIGZvciBub3cuCisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gQ1N0ci5maW5kX2ZpcnN0X29mKCc9Jyk7CisgIGFzc2VydChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgIlVucmVjb2duaXplZCBjb25zdHJhaW50Iik7CisgIHN0YXJ0ID0gQ1N0ci5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgIHN0ZDo6c3RyaW5nIE5hbWUgPSBDU3RyLnN1YnN0cihzdGFydCwgcG9zIC0gc3RhcnQpOworCisgIC8vIFRJRURfVE86ICRzcmMxID0gJGRzdAorICB3cG9zID0gTmFtZS5maW5kX2ZpcnN0X29mKCIgXHQiKTsKKyAgaWYgKHdwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgdGhyb3cgIklsbGVnYWwgZm9ybWF0IGZvciB0aWVkLXRvIGNvbnN0cmFpbnQ6ICciICsgQ1N0ciArICInIjsKKyAgc3RkOjpzdHJpbmcgRGVzdE9wTmFtZSA9IE5hbWUuc3Vic3RyKDAsIHdwb3MpOworICBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+IERlc3RPcCA9IEktPlBhcnNlT3BlcmFuZE5hbWUoRGVzdE9wTmFtZSwgZmFsc2UpOworCisgIE5hbWUgPSBDU3RyLnN1YnN0cihwb3MrMSk7CisgIHdwb3MgPSBOYW1lLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgaWYgKHdwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgdGhyb3cgIklsbGVnYWwgZm9ybWF0IGZvciB0aWVkLXRvIGNvbnN0cmFpbnQ6ICciICsgQ1N0ciArICInIjsKKworICBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+IFNyY09wID0KKyAgSS0+UGFyc2VPcGVyYW5kTmFtZShOYW1lLnN1YnN0cih3cG9zKSwgZmFsc2UpOworICBpZiAoU3JjT3AgPiBEZXN0T3ApCisgICAgdGhyb3cgIklsbGVnYWwgdGllZC10byBvcGVyYW5kIGNvbnN0cmFpbnQgJyIgKyBDU3RyICsgIiciOworCisKKyAgdW5zaWduZWQgRmxhdE9wTm8gPSBJLT5nZXRGbGF0dGVuZWRPcGVyYW5kTnVtYmVyKFNyY09wKTsKKworICBpZiAoIUktPk9wZXJhbmRMaXN0W0Rlc3RPcC5maXJzdF0uQ29uc3RyYWludHNbRGVzdE9wLnNlY29uZF0uaXNOb25lKCkpCisgICAgdGhyb3cgIk9wZXJhbmQgJyIgKyBEZXN0T3BOYW1lICsgIicgY2Fubm90IGhhdmUgbXVsdGlwbGUgY29uc3RyYWludHMhIjsKKyAgSS0+T3BlcmFuZExpc3RbRGVzdE9wLmZpcnN0XS5Db25zdHJhaW50c1tEZXN0T3Auc2Vjb25kXSA9CisgICAgQ29kZUdlbkluc3RydWN0aW9uOjpDb25zdHJhaW50SW5mbzo6Z2V0VGllZChGbGF0T3BObyk7Cit9CisKK3N0YXRpYyB2b2lkIFBhcnNlQ29uc3RyYWludHMoY29uc3Qgc3RkOjpzdHJpbmcgJkNTdHIsIENvZGVHZW5JbnN0cnVjdGlvbiAqSSkgeworICAvLyBNYWtlIHN1cmUgdGhlIGNvbnN0cmFpbnRzIGxpc3QgZm9yIGVhY2ggb3BlcmFuZCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZAorICAvLyBjb25zdHJhaW50IGluZm8sIGV2ZW4gaWYgbm9uZSBpcyBwcmVzZW50LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+T3BlcmFuZExpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBJLT5PcGVyYW5kTGlzdFtpXS5Db25zdHJhaW50cy5yZXNpemUoSS0+T3BlcmFuZExpc3RbaV0uTUlOdW1PcGVyYW5kcyk7CisKKyAgaWYgKENTdHIuZW1wdHkoKSkgcmV0dXJuOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGRlbGltcygiLCIpOworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGJpZHgsIGVpZHg7CisKKyAgYmlkeCA9IENTdHIuZmluZF9maXJzdF9ub3Rfb2YoZGVsaW1zKTsKKyAgd2hpbGUgKGJpZHggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBlaWR4ID0gQ1N0ci5maW5kX2ZpcnN0X29mKGRlbGltcywgYmlkeCk7CisgICAgaWYgKGVpZHggPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICBlaWR4ID0gQ1N0ci5sZW5ndGgoKTsKKworICAgIFBhcnNlQ29uc3RyYWludChDU3RyLnN1YnN0cihiaWR4LCBlaWR4IC0gYmlkeCksIEkpOworICAgIGJpZHggPSBDU3RyLmZpbmRfZmlyc3Rfbm90X29mKGRlbGltcywgZWlkeCk7CisgIH0KK30KKworQ29kZUdlbkluc3RydWN0aW9uOjpDb2RlR2VuSW5zdHJ1Y3Rpb24oUmVjb3JkICpSLCBjb25zdCBzdGQ6OnN0cmluZyAmQXNtU3RyKQorICA6IFRoZURlZihSKSwgQXNtU3RyaW5nKEFzbVN0cikgeworICBOYW1lc3BhY2UgPSBSLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lc3BhY2UiKTsKKworICBpc1JldHVybiAgICAgPSBSLT5nZXRWYWx1ZUFzQml0KCJpc1JldHVybiIpOworICBpc0JyYW5jaCAgICAgPSBSLT5nZXRWYWx1ZUFzQml0KCJpc0JyYW5jaCIpOworICBpc0luZGlyZWN0QnJhbmNoID0gUi0+Z2V0VmFsdWVBc0JpdCgiaXNJbmRpcmVjdEJyYW5jaCIpOworICBpc0NvbXBhcmUgICAgPSBSLT5nZXRWYWx1ZUFzQml0KCJpc0NvbXBhcmUiKTsKKyAgaXNCYXJyaWVyICAgID0gUi0+Z2V0VmFsdWVBc0JpdCgiaXNCYXJyaWVyIik7CisgIGlzQ2FsbCAgICAgICA9IFItPmdldFZhbHVlQXNCaXQoImlzQ2FsbCIpOworICBjYW5Gb2xkQXNMb2FkID0gUi0+Z2V0VmFsdWVBc0JpdCgiY2FuRm9sZEFzTG9hZCIpOworICBtYXlMb2FkICAgICAgPSBSLT5nZXRWYWx1ZUFzQml0KCJtYXlMb2FkIik7CisgIG1heVN0b3JlICAgICA9IFItPmdldFZhbHVlQXNCaXQoIm1heVN0b3JlIik7CisgIGlzUHJlZGljYWJsZSA9IFItPmdldFZhbHVlQXNCaXQoImlzUHJlZGljYWJsZSIpOworICBpc0NvbnZlcnRpYmxlVG9UaHJlZUFkZHJlc3MgPSBSLT5nZXRWYWx1ZUFzQml0KCJpc0NvbnZlcnRpYmxlVG9UaHJlZUFkZHJlc3MiKTsKKyAgaXNDb21tdXRhYmxlID0gUi0+Z2V0VmFsdWVBc0JpdCgiaXNDb21tdXRhYmxlIik7CisgIGlzVGVybWluYXRvciA9IFItPmdldFZhbHVlQXNCaXQoImlzVGVybWluYXRvciIpOworICBpc1JlTWF0ZXJpYWxpemFibGUgPSBSLT5nZXRWYWx1ZUFzQml0KCJpc1JlTWF0ZXJpYWxpemFibGUiKTsKKyAgaGFzRGVsYXlTbG90ID0gUi0+Z2V0VmFsdWVBc0JpdCgiaGFzRGVsYXlTbG90Iik7CisgIHVzZXNDdXN0b21JbnNlcnRlciA9IFItPmdldFZhbHVlQXNCaXQoInVzZXNDdXN0b21JbnNlcnRlciIpOworICBoYXNDdHJsRGVwICAgPSBSLT5nZXRWYWx1ZUFzQml0KCJoYXNDdHJsRGVwIik7CisgIGlzTm90RHVwbGljYWJsZSA9IFItPmdldFZhbHVlQXNCaXQoImlzTm90RHVwbGljYWJsZSIpOworICBoYXNTaWRlRWZmZWN0cyA9IFItPmdldFZhbHVlQXNCaXQoImhhc1NpZGVFZmZlY3RzIik7CisgIG5ldmVySGFzU2lkZUVmZmVjdHMgPSBSLT5nZXRWYWx1ZUFzQml0KCJuZXZlckhhc1NpZGVFZmZlY3RzIik7CisgIGlzQXNDaGVhcEFzQU1vdmUgPSBSLT5nZXRWYWx1ZUFzQml0KCJpc0FzQ2hlYXBBc0FNb3ZlIik7CisgIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEgPSBSLT5nZXRWYWx1ZUFzQml0KCJoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxIik7CisgIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgPSBSLT5nZXRWYWx1ZUFzQml0KCJoYXNFeHRyYURlZlJlZ0FsbG9jUmVxIik7CisgIGhhc09wdGlvbmFsRGVmID0gZmFsc2U7CisgIGlzVmFyaWFkaWMgPSBmYWxzZTsKKyAgSW1wbGljaXREZWZzID0gUi0+Z2V0VmFsdWVBc0xpc3RPZkRlZnMoIkRlZnMiKTsKKyAgSW1wbGljaXRVc2VzID0gUi0+Z2V0VmFsdWVBc0xpc3RPZkRlZnMoIlVzZXMiKTsKKworICBpZiAobmV2ZXJIYXNTaWRlRWZmZWN0cyArIGhhc1NpZGVFZmZlY3RzID4gMSkKKyAgICB0aHJvdyBSLT5nZXROYW1lKCkgKyAiOiBtdWx0aXBsZSBjb25mbGljdGluZyBzaWRlLWVmZmVjdCBmbGFncyBzZXQhIjsKKworICBEYWdJbml0ICpPdXRESSA9IFItPmdldFZhbHVlQXNEYWcoIk91dE9wZXJhbmRMaXN0Iik7CisKKyAgaWYgKERlZkluaXQgKkluaXQgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KE91dERJLT5nZXRPcGVyYXRvcigpKSkgeworICAgIGlmIChJbml0LT5nZXREZWYoKS0+Z2V0TmFtZSgpICE9ICJvdXRzIikKKyAgICAgIHRocm93IFItPmdldE5hbWUoKSArICI6IGludmFsaWQgZGVmIG5hbWUgZm9yIG91dHB1dCBsaXN0OiB1c2UgJ291dHMnIjsKKyAgfSBlbHNlCisgICAgdGhyb3cgUi0+Z2V0TmFtZSgpICsgIjogaW52YWxpZCBvdXRwdXQgbGlzdDogdXNlICdvdXRzJyI7CisgICAgCisgIE51bURlZnMgPSBPdXRESS0+Z2V0TnVtQXJncygpOworICAgIAorICBEYWdJbml0ICpJbkRJID0gUi0+Z2V0VmFsdWVBc0RhZygiSW5PcGVyYW5kTGlzdCIpOworICBpZiAoRGVmSW5pdCAqSW5pdCA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oSW5ESS0+Z2V0T3BlcmF0b3IoKSkpIHsKKyAgICBpZiAoSW5pdC0+Z2V0RGVmKCktPmdldE5hbWUoKSAhPSAiaW5zIikKKyAgICAgIHRocm93IFItPmdldE5hbWUoKSArICI6IGludmFsaWQgZGVmIG5hbWUgZm9yIGlucHV0IGxpc3Q6IHVzZSAnaW5zJyI7CisgIH0gZWxzZQorICAgIHRocm93IFItPmdldE5hbWUoKSArICI6IGludmFsaWQgaW5wdXQgbGlzdDogdXNlICdpbnMnIjsKKyAgICAKKyAgdW5zaWduZWQgTUlPcGVyYW5kTm8gPSAwOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gT3BlcmFuZE5hbWVzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5ESS0+Z2V0TnVtQXJncygpK091dERJLT5nZXROdW1BcmdzKCk7IGkgIT0gZTsgKytpKXsKKyAgICBJbml0ICpBcmdJbml0OworICAgIHN0ZDo6c3RyaW5nIEFyZ05hbWU7CisgICAgaWYgKGkgPCBOdW1EZWZzKSB7CisgICAgICBBcmdJbml0ID0gT3V0REktPmdldEFyZyhpKTsKKyAgICAgIEFyZ05hbWUgPSBPdXRESS0+Z2V0QXJnTmFtZShpKTsKKyAgICB9IGVsc2UgeworICAgICAgQXJnSW5pdCA9IEluREktPmdldEFyZyhpLU51bURlZnMpOworICAgICAgQXJnTmFtZSA9IEluREktPmdldEFyZ05hbWUoaS1OdW1EZWZzKTsKKyAgICB9CisgICAgCisgICAgRGVmSW5pdCAqQXJnID0gZHluYW1pY19jYXN0PERlZkluaXQqPihBcmdJbml0KTsKKyAgICBpZiAoIUFyZykKKyAgICAgIHRocm93ICJJbGxlZ2FsIG9wZXJhbmQgZm9yIHRoZSAnIiArIFItPmdldE5hbWUoKSArICInIGluc3RydWN0aW9uISI7CisKKyAgICBSZWNvcmQgKlJlYyA9IEFyZy0+Z2V0RGVmKCk7CisgICAgc3RkOjpzdHJpbmcgUHJpbnRNZXRob2QgPSAicHJpbnRPcGVyYW5kIjsKKyAgICB1bnNpZ25lZCBOdW1PcHMgPSAxOworICAgIERhZ0luaXQgKk1JT3BJbmZvID0gMDsKKyAgICBpZiAoUmVjLT5pc1N1YkNsYXNzT2YoIk9wZXJhbmQiKSkgeworICAgICAgUHJpbnRNZXRob2QgPSBSZWMtPmdldFZhbHVlQXNTdHJpbmcoIlByaW50TWV0aG9kIik7CisgICAgICBNSU9wSW5mbyA9IFJlYy0+Z2V0VmFsdWVBc0RhZygiTUlPcGVyYW5kSW5mbyIpOworCisgICAgICAvLyBWZXJpZnkgdGhhdCBNSU9wSW5mbyBoYXMgYW4gJ29wcycgcm9vdCB2YWx1ZS4KKyAgICAgIGlmICghZHluYW1pY19jYXN0PERlZkluaXQqPihNSU9wSW5mby0+Z2V0T3BlcmF0b3IoKSkgfHwKKyAgICAgICAgICBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KE1JT3BJbmZvLT5nZXRPcGVyYXRvcigpKQorICAgICAgICAgICAgICAgLT5nZXREZWYoKS0+Z2V0TmFtZSgpICE9ICJvcHMiKQorICAgICAgICB0aHJvdyAiQmFkIHZhbHVlIGZvciBNSU9wZXJhbmRJbmZvIGluIG9wZXJhbmQgJyIgKyBSZWMtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICInXG4iOworCisgICAgICAvLyBJZiB3ZSBoYXZlIE1JT3BJbmZvLCB0aGVuIHdlIGhhdmUgI29wZXJhbmRzIGVxdWFsIHRvIG51bWJlciBvZiBlbnRyaWVzCisgICAgICAvLyBpbiBNSU9wZXJhbmRJbmZvLgorICAgICAgaWYgKHVuc2lnbmVkIE51bUFyZ3MgPSBNSU9wSW5mby0+Z2V0TnVtQXJncygpKQorICAgICAgICBOdW1PcHMgPSBOdW1BcmdzOworCisgICAgICBpZiAoUmVjLT5pc1N1YkNsYXNzT2YoIlByZWRpY2F0ZU9wZXJhbmQiKSkKKyAgICAgICAgaXNQcmVkaWNhYmxlID0gdHJ1ZTsKKyAgICAgIGVsc2UgaWYgKFJlYy0+aXNTdWJDbGFzc09mKCJPcHRpb25hbERlZk9wZXJhbmQiKSkKKyAgICAgICAgaGFzT3B0aW9uYWxEZWYgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoUmVjLT5nZXROYW1lKCkgPT0gInZhcmlhYmxlX29wcyIpIHsKKyAgICAgIGlzVmFyaWFkaWMgPSB0cnVlOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmICghUmVjLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyQ2xhc3MiKSAmJgorICAgICAgICAgICAgICAgUmVjLT5nZXROYW1lKCkgIT0gInB0cl9yYyIgJiYgUmVjLT5nZXROYW1lKCkgIT0gInVua25vd24iKQorICAgICAgdGhyb3cgIlVua25vd24gb3BlcmFuZCBjbGFzcyAnIiArIFJlYy0+Z2V0TmFtZSgpICsKKyAgICAgICAgICAgICInIGluICciICsgUi0+Z2V0TmFtZSgpICsgIicgaW5zdHJ1Y3Rpb24hIjsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIG9wZXJhbmQgaGFzIGEgbmFtZSBhbmQgdGhhdCBpdCdzIHVuaXF1ZS4KKyAgICBpZiAoQXJnTmFtZS5lbXB0eSgpKQorICAgICAgdGhyb3cgIkluIGluc3RydWN0aW9uICciICsgUi0+Z2V0TmFtZSgpICsgIicsIG9wZXJhbmQgIyIgKyB1dG9zdHIoaSkgKworICAgICAgICAiIGhhcyBubyBuYW1lISI7CisgICAgaWYgKCFPcGVyYW5kTmFtZXMuaW5zZXJ0KEFyZ05hbWUpLnNlY29uZCkKKyAgICAgIHRocm93ICJJbiBpbnN0cnVjdGlvbiAnIiArIFItPmdldE5hbWUoKSArICInLCBvcGVyYW5kICMiICsgdXRvc3RyKGkpICsKKyAgICAgICAgIiBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIHByZXZpb3VzIG9wZXJhbmQhIjsKKworICAgIE9wZXJhbmRMaXN0LnB1c2hfYmFjayhPcGVyYW5kSW5mbyhSZWMsIEFyZ05hbWUsIFByaW50TWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU9wZXJhbmRObywgTnVtT3BzLCBNSU9wSW5mbykpOworICAgIE1JT3BlcmFuZE5vICs9IE51bU9wczsKKyAgfQorCisgIC8vIFBhcnNlIENvbnN0cmFpbnRzLgorICBQYXJzZUNvbnN0cmFpbnRzKFItPmdldFZhbHVlQXNTdHJpbmcoIkNvbnN0cmFpbnRzIiksIHRoaXMpOworCisgIC8vIFBhcnNlIHRoZSBEaXNhYmxlRW5jb2RpbmcgZmllbGQuCisgIHN0ZDo6c3RyaW5nIERpc2FibGVFbmNvZGluZyA9IFItPmdldFZhbHVlQXNTdHJpbmcoIkRpc2FibGVFbmNvZGluZyIpOworICB3aGlsZSAoMSkgeworICAgIHN0ZDo6c3RyaW5nIE9wTmFtZTsKKyAgICB0aWUoT3BOYW1lLCBEaXNhYmxlRW5jb2RpbmcpID0gZ2V0VG9rZW4oRGlzYWJsZUVuY29kaW5nLCAiICxcdCIpOworICAgIGlmIChPcE5hbWUuZW1wdHkoKSkgYnJlYWs7CisKKyAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIG9wZXJhbmQgdGhpcyBpcy4KKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+IE9wID0gUGFyc2VPcGVyYW5kTmFtZShPcE5hbWUsIGZhbHNlKTsKKworICAgIC8vIE1hcmsgdGhlIG9wZXJhbmQgYXMgbm90LXRvLWJlIGVuY29kZWQuCisgICAgaWYgKE9wLnNlY29uZCA+PSBPcGVyYW5kTGlzdFtPcC5maXJzdF0uRG9Ob3RFbmNvZGUuc2l6ZSgpKQorICAgICAgT3BlcmFuZExpc3RbT3AuZmlyc3RdLkRvTm90RW5jb2RlLnJlc2l6ZShPcC5zZWNvbmQrMSk7CisgICAgT3BlcmFuZExpc3RbT3AuZmlyc3RdLkRvTm90RW5jb2RlW09wLnNlY29uZF0gPSB0cnVlOworICB9Cit9CisKKy8vLyBnZXRPcGVyYW5kTmFtZWQgLSBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBvcGVyYW5kIHdpdGggdGhlIHNwZWNpZmllZAorLy8vIG5vbi1lbXB0eSBuYW1lLiAgSWYgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IGhhdmUgYW4gb3BlcmFuZCB3aXRoIHRoZQorLy8vIHNwZWNpZmllZCBuYW1lLCB0aHJvdyBhbiBleGNlcHRpb24uCisvLy8KK3Vuc2lnbmVkIENvZGVHZW5JbnN0cnVjdGlvbjo6Z2V0T3BlcmFuZE5hbWVkKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBjb25zdCB7CisgIGFzc2VydCghTmFtZS5lbXB0eSgpICYmICJDYW5ub3Qgc2VhcmNoIGZvciBvcGVyYW5kIHdpdGggbm8gbmFtZSEiKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wZXJhbmRMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKE9wZXJhbmRMaXN0W2ldLk5hbWUgPT0gTmFtZSkgcmV0dXJuIGk7CisgIHRocm93ICJJbnN0cnVjdGlvbiAnIiArIFRoZURlZi0+Z2V0TmFtZSgpICsKKyAgICAgICAgIicgZG9lcyBub3QgaGF2ZSBhbiBvcGVyYW5kIG5hbWVkICckIiArIE5hbWUgKyAiJyEiOworfQorCitzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+CitDb2RlR2VuSW5zdHJ1Y3Rpb246OlBhcnNlT3BlcmFuZE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dXaG9sZU9wKSB7CisgIGlmIChPcC5lbXB0eSgpIHx8IE9wWzBdICE9ICckJykKKyAgICB0aHJvdyBUaGVEZWYtPmdldE5hbWUoKSArICI6IElsbGVnYWwgb3BlcmFuZCBuYW1lOiAnIiArIE9wICsgIiciOworCisgIHN0ZDo6c3RyaW5nIE9wTmFtZSA9IE9wLnN1YnN0cigxKTsKKyAgc3RkOjpzdHJpbmcgU3ViT3BOYW1lOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzICRmb28uYmFyLgorICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIERvdElkeCA9IE9wTmFtZS5maW5kX2ZpcnN0X29mKCIuIik7CisgIGlmIChEb3RJZHggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBTdWJPcE5hbWUgPSBPcE5hbWUuc3Vic3RyKERvdElkeCsxKTsKKyAgICBpZiAoU3ViT3BOYW1lLmVtcHR5KCkpCisgICAgICB0aHJvdyBUaGVEZWYtPmdldE5hbWUoKSArICI6IGlsbGVnYWwgZW1wdHkgc3Vib3BlcmFuZCBuYW1lIGluICciICtPcCArIiciOworICAgIE9wTmFtZSA9IE9wTmFtZS5zdWJzdHIoMCwgRG90SWR4KTsKKyAgfQorCisgIHVuc2lnbmVkIE9wSWR4ID0gZ2V0T3BlcmFuZE5hbWVkKE9wTmFtZSk7CisKKyAgaWYgKFN1Yk9wTmFtZS5lbXB0eSgpKSB7ICAvLyBJZiBubyBzdWJvcGVyYW5kIG5hbWUgd2FzIHNwZWNpZmllZDoKKyAgICAvLyBJZiBvbmUgd2FzIG5lZWRlZCwgdGhyb3cuCisgICAgaWYgKE9wZXJhbmRMaXN0W09wSWR4XS5NSU51bU9wZXJhbmRzID4gMSAmJiAhQWxsb3dXaG9sZU9wICYmCisgICAgICAgIFN1Yk9wTmFtZS5lbXB0eSgpKQorICAgICAgdGhyb3cgVGhlRGVmLT5nZXROYW1lKCkgKyAiOiBJbGxlZ2FsIHRvIHJlZmVyIHRvIgorICAgICAgICAgICAgIiB3aG9sZSBvcGVyYW5kIHBhcnQgb2YgY29tcGxleCBvcGVyYW5kICciICsgT3AgKyAiJyI7CisKKyAgICAvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgb3BlcmFuZC4KKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoT3BJZHgsIDBVKTsKKyAgfQorCisgIC8vIEZpbmQgdGhlIHN1Ym9wZXJhbmQgbnVtYmVyIGludm9sdmVkLgorICBEYWdJbml0ICpNSU9wSW5mbyA9IE9wZXJhbmRMaXN0W09wSWR4XS5NSU9wZXJhbmRJbmZvOworICBpZiAoTUlPcEluZm8gPT0gMCkKKyAgICB0aHJvdyBUaGVEZWYtPmdldE5hbWUoKSArICI6IHVua25vd24gc3Vib3BlcmFuZCBuYW1lIGluICciICsgT3AgKyAiJyI7CisKKyAgLy8gRmluZCB0aGUgb3BlcmFuZCB3aXRoIHRoZSByaWdodCBuYW1lLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUlPcEluZm8tPmdldE51bUFyZ3MoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKE1JT3BJbmZvLT5nZXRBcmdOYW1lKGkpID09IFN1Yk9wTmFtZSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihPcElkeCwgaSk7CisKKyAgLy8gT3RoZXJ3aXNlLCBkaWRuJ3QgZmluZCBpdCEKKyAgdGhyb3cgVGhlRGVmLT5nZXROYW1lKCkgKyAiOiB1bmtub3duIHN1Ym9wZXJhbmQgbmFtZSBpbiAnIiArIE9wICsgIiciOworfQorCisKKy8vLyBIYXNPbmVJbXBsaWNpdERlZldpdGhLbm93blZUIC0gSWYgdGhlIGluc3RydWN0aW9uIGhhcyBhdCBsZWFzdCBvbmUKKy8vLyBpbXBsaWNpdCBkZWYgYW5kIGl0IGhhcyBhIGtub3duIFZULCByZXR1cm4gdGhlIFZULCBvdGhlcndpc2UgcmV0dXJuCisvLy8gTVZUOjpPdGhlci4KK01WVDo6U2ltcGxlVmFsdWVUeXBlIENvZGVHZW5JbnN0cnVjdGlvbjo6CitIYXNPbmVJbXBsaWNpdERlZldpdGhLbm93blZUKGNvbnN0IENvZGVHZW5UYXJnZXQgJlRhcmdldEluZm8pIGNvbnN0IHsKKyAgaWYgKEltcGxpY2l0RGVmcy5lbXB0eSgpKSByZXR1cm4gTVZUOjpPdGhlcjsKKyAgCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlyc3QgaW1wbGljaXQgZGVmIGhhcyBhIHJlc29sdmFibGUgdHlwZS4KKyAgUmVjb3JkICpGaXJzdEltcGxpY2l0RGVmID0gSW1wbGljaXREZWZzWzBdOworICBhc3NlcnQoRmlyc3RJbXBsaWNpdERlZi0+aXNTdWJDbGFzc09mKCJSZWdpc3RlciIpKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+ICZSZWdWVHMgPSAKKyAgICBUYXJnZXRJbmZvLmdldFJlZ2lzdGVyVlRzKEZpcnN0SW1wbGljaXREZWYpOworICBpZiAoUmVnVlRzLnNpemUoKSA9PSAxKQorICAgIHJldHVybiBSZWdWVHNbMF07CisgIHJldHVybiBNVlQ6Ok90aGVyOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuSW5zdHJ1Y3Rpb24uaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5JbnN0cnVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMmQwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuSW5zdHJ1Y3Rpb24uaApAQCAtMCwwICsxLDE5NyBAQAorLy89PT0tIENvZGVHZW5JbnN0cnVjdGlvbi5oIC0gSW5zdHJ1Y3Rpb24gQ2xhc3MgV3JhcHBlciAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHdyYXBwZXIgY2xhc3MgZm9yIHRoZSAnSW5zdHJ1Y3Rpb24nIFRhYmxlR2VuIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQ09ERUdFTl9JTlNUUlVDVElPTl9ICisjZGVmaW5lIENPREVHRU5fSU5TVFJVQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgUmVjb3JkOworICBjbGFzcyBEYWdJbml0OworICBjbGFzcyBDb2RlR2VuVGFyZ2V0OworCisgIGNsYXNzIENvZGVHZW5JbnN0cnVjdGlvbiB7CisgIHB1YmxpYzoKKyAgICBSZWNvcmQgKlRoZURlZjsgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIHJlY29yZCBkZWZpbmluZyB0aGlzIGluc3RydWN0aW9uLgorICAgIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZTsgICAgIC8vIFRoZSBuYW1lc3BhY2UgdGhlIGluc3RydWN0aW9uIGlzIGluLgorCisgICAgLy8vIEFzbVN0cmluZyAtIFRoZSBmb3JtYXQgc3RyaW5nIHVzZWQgdG8gZW1pdCBhIC5zIGZpbGUgZm9yIHRoZQorICAgIC8vLyBpbnN0cnVjdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBBc21TdHJpbmc7CisgICAgCisgICAgY2xhc3MgQ29uc3RyYWludEluZm8geworICAgICAgZW51bSB7IE5vbmUsIEVhcmx5Q2xvYmJlciwgVGllZCB9IEtpbmQ7CisgICAgICB1bnNpZ25lZCBPdGhlclRpZWRPcGVyYW5kOworICAgIHB1YmxpYzoKKyAgICAgIENvbnN0cmFpbnRJbmZvKCkgOiBLaW5kKE5vbmUpIHt9CisKKyAgICAgIHN0YXRpYyBDb25zdHJhaW50SW5mbyBnZXRFYXJseUNsb2JiZXIoKSB7CisgICAgICAgIENvbnN0cmFpbnRJbmZvIEk7CisgICAgICAgIEkuS2luZCA9IEVhcmx5Q2xvYmJlcjsKKyAgICAgICAgSS5PdGhlclRpZWRPcGVyYW5kID0gMDsKKyAgICAgICAgcmV0dXJuIEk7CisgICAgICB9CisgICAgICAKKyAgICAgIHN0YXRpYyBDb25zdHJhaW50SW5mbyBnZXRUaWVkKHVuc2lnbmVkIE9wKSB7CisgICAgICAgIENvbnN0cmFpbnRJbmZvIEk7CisgICAgICAgIEkuS2luZCA9IFRpZWQ7CisgICAgICAgIEkuT3RoZXJUaWVkT3BlcmFuZCA9IE9wOworICAgICAgICByZXR1cm4gSTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgYm9vbCBpc05vbmUoKSBjb25zdCB7IHJldHVybiBLaW5kID09IE5vbmU7IH0KKyAgICAgIGJvb2wgaXNFYXJseUNsb2JiZXIoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEVhcmx5Q2xvYmJlcjsgfQorICAgICAgYm9vbCBpc1RpZWQoKSBjb25zdCB7IHJldHVybiBLaW5kID09IFRpZWQ7IH0KKyAgICAgIAorICAgICAgdW5zaWduZWQgZ2V0VGllZE9wZXJhbmQoKSBjb25zdCB7CisgICAgICAgIGFzc2VydChpc1RpZWQoKSk7CisgICAgICAgIHJldHVybiBPdGhlclRpZWRPcGVyYW5kOworICAgICAgfQorICAgIH07CisgICAgCisgICAgLy8vIE9wZXJhbmRJbmZvIC0gVGhlIGluZm9ybWF0aW9uIHdlIGtlZXAgdHJhY2sgb2YgZm9yIGVhY2ggb3BlcmFuZCBpbiB0aGUKKyAgICAvLy8gb3BlcmFuZCBsaXN0IGZvciBhIHRhYmxlZ2VuIGluc3RydWN0aW9uLgorICAgIHN0cnVjdCBPcGVyYW5kSW5mbyB7CisgICAgICAvLy8gUmVjIC0gVGhlIGRlZmluaXRpb24gdGhpcyBvcGVyYW5kIGlzIGRlY2xhcmVkIGFzLgorICAgICAgLy8vCisgICAgICBSZWNvcmQgKlJlYzsKKworICAgICAgLy8vIE5hbWUgLSBJZiB0aGlzIG9wZXJhbmQgd2FzIGFzc2lnbmVkIGEgc3ltYm9saWMgbmFtZSwgdGhpcyBpcyBpdCwKKyAgICAgIC8vLyBvdGhlcndpc2UsIGl0J3MgZW1wdHkuCisgICAgICBzdGQ6OnN0cmluZyBOYW1lOworCisgICAgICAvLy8gUHJpbnRlck1ldGhvZE5hbWUgLSBUaGUgbWV0aG9kIHVzZWQgdG8gcHJpbnQgb3BlcmFuZHMgb2YgdGhpcyB0eXBlIGluCisgICAgICAvLy8gdGhlIGFzbXByaW50ZXIuCisgICAgICBzdGQ6OnN0cmluZyBQcmludGVyTWV0aG9kTmFtZTsKKworICAgICAgLy8vIE1JT3BlcmFuZE5vIC0gQ3VycmVudGx5ICh0aGlzIGlzIG1lYW50IHRvIGJlIHBoYXNlZCBvdXQpLCBzb21lIGxvZ2ljYWwKKyAgICAgIC8vLyBvcGVyYW5kcyBjb3JyZXNwb25kIHRvIG11bHRpcGxlIE1hY2hpbmVJbnN0ciBvcGVyYW5kcy4gIEluIHRoZSBYODYKKyAgICAgIC8vLyB0YXJnZXQgZm9yIGV4YW1wbGUsIG9uZSBhZGRyZXNzIG9wZXJhbmQgaXMgcmVwcmVzZW50ZWQgYXMgNAorICAgICAgLy8vIE1hY2hpbmVPcGVyYW5kcy4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlIG9wZXJhbmQgbnVtYmVyIGluIHRoZQorICAgICAgLy8vIE9wZXJhbmRMaXN0IG1heSBub3QgbWF0Y2ggdGhlIE1hY2hpbmVJbnN0ciBvcGVyYW5kIG51bS4gIFVudGlsIGl0CisgICAgICAvLy8gZG9lcywgdGhpcyBjb250YWlucyB0aGUgTUkgb3BlcmFuZCBpbmRleCBvZiB0aGlzIG9wZXJhbmQuCisgICAgICB1bnNpZ25lZCBNSU9wZXJhbmRObzsKKyAgICAgIHVuc2lnbmVkIE1JTnVtT3BlcmFuZHM7ICAgLy8gVGhlIG51bWJlciBvZiBvcGVyYW5kcy4KKworICAgICAgLy8vIERvTm90RW5jb2RlIC0gQm9vbHMgYXJlIHNldCB0byB0cnVlIGluIHRoaXMgdmVjdG9yIGZvciBlYWNoIG9wZXJhbmQgaW4KKyAgICAgIC8vLyB0aGUgRGlzYWJsZUVuY29kaW5nIGxpc3QuICBUaGVzZSBzaG91bGQgbm90IGJlIGVtaXR0ZWQgYnkgdGhlIGNvZGUKKyAgICAgIC8vLyBlbWl0dGVyLgorICAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gRG9Ob3RFbmNvZGU7CisgICAgICAKKyAgICAgIC8vLyBNSU9wZXJhbmRJbmZvIC0gRGVmYXVsdCBNSSBvcGVyYW5kIHR5cGUuIE5vdGUgYW4gb3BlcmFuZCBtYXkgYmUgbWFkZQorICAgICAgLy8vIHVwIG9mIG11bHRpcGxlIE1JIG9wZXJhbmRzLgorICAgICAgRGFnSW5pdCAqTUlPcGVyYW5kSW5mbzsKKyAgICAgIAorICAgICAgLy8vIENvbnN0cmFpbnQgaW5mbyBmb3IgdGhpcyBvcGVyYW5kLiAgVGhpcyBvcGVyYW5kIGNhbiBoYXZlIHBpZWNlcywgc28gd2UKKyAgICAgIC8vLyB0cmFjayBjb25zdHJhaW50IGluZm8gZm9yIGVhY2guCisgICAgICBzdGQ6OnZlY3RvcjxDb25zdHJhaW50SW5mbz4gQ29uc3RyYWludHM7CisKKyAgICAgIE9wZXJhbmRJbmZvKFJlY29yZCAqUiwgY29uc3Qgc3RkOjpzdHJpbmcgJk4sIGNvbnN0IHN0ZDo6c3RyaW5nICZQTU4sIAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTUlPTiwgdW5zaWduZWQgTUlOTywgRGFnSW5pdCAqTUlPSSkKKyAgICAgICAgOiBSZWMoUiksIE5hbWUoTiksIFByaW50ZXJNZXRob2ROYW1lKFBNTiksIE1JT3BlcmFuZE5vKE1JT04pLAorICAgICAgICAgIE1JTnVtT3BlcmFuZHMoTUlOTyksIE1JT3BlcmFuZEluZm8oTUlPSSkge30KKyAgICB9OworCisgICAgLy8vIE51bURlZnMgLSBOdW1iZXIgb2YgZGVmIG9wZXJhbmRzIGRlY2xhcmVkLCB0aGlzIGlzIHRoZSBudW1iZXIgb2YKKyAgICAvLy8gZWxlbWVudHMgaW4gdGhlIGluc3RydWN0aW9uJ3MgKG91dHMpIGxpc3QuCisgICAgLy8vCisgICAgdW5zaWduZWQgTnVtRGVmczsKKworICAgIC8vLyBPcGVyYW5kTGlzdCAtIFRoZSBsaXN0IG9mIGRlY2xhcmVkIG9wZXJhbmRzLCBhbG9uZyB3aXRoIHRoZWlyIGRlY2xhcmVkCisgICAgLy8vIHR5cGUgKHdoaWNoIGlzIGEgcmVjb3JkKS4KKyAgICBzdGQ6OnZlY3RvcjxPcGVyYW5kSW5mbz4gT3BlcmFuZExpc3Q7CisKKyAgICAvLy8gSW1wbGljaXREZWZzL0ltcGxpY2l0VXNlcyAtIFRoZXNlIGFyZSBsaXN0cyBvZiByZWdpc3RlcnMgdGhhdCBhcmUKKyAgICAvLy8gaW1wbGljaXRseSBkZWZpbmVkIGFuZCB1c2VkIGJ5IHRoZSBpbnN0cnVjdGlvbi4KKyAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBJbXBsaWNpdERlZnMsIEltcGxpY2l0VXNlczsKKworICAgIC8vIFZhcmlvdXMgYm9vbGVhbiB2YWx1ZXMgd2UgdHJhY2sgZm9yIHRoZSBpbnN0cnVjdGlvbi4KKyAgICBib29sIGlzUmV0dXJuOworICAgIGJvb2wgaXNCcmFuY2g7CisgICAgYm9vbCBpc0luZGlyZWN0QnJhbmNoOworICAgIGJvb2wgaXNDb21wYXJlOworICAgIGJvb2wgaXNCYXJyaWVyOworICAgIGJvb2wgaXNDYWxsOworICAgIGJvb2wgY2FuRm9sZEFzTG9hZDsKKyAgICBib29sIG1heUxvYWQsIG1heVN0b3JlOworICAgIGJvb2wgaXNQcmVkaWNhYmxlOworICAgIGJvb2wgaXNDb252ZXJ0aWJsZVRvVGhyZWVBZGRyZXNzOworICAgIGJvb2wgaXNDb21tdXRhYmxlOworICAgIGJvb2wgaXNUZXJtaW5hdG9yOworICAgIGJvb2wgaXNSZU1hdGVyaWFsaXphYmxlOworICAgIGJvb2wgaGFzRGVsYXlTbG90OworICAgIGJvb2wgdXNlc0N1c3RvbUluc2VydGVyOworICAgIGJvb2wgaXNWYXJpYWRpYzsKKyAgICBib29sIGhhc0N0cmxEZXA7CisgICAgYm9vbCBpc05vdER1cGxpY2FibGU7CisgICAgYm9vbCBoYXNPcHRpb25hbERlZjsKKyAgICBib29sIGhhc1NpZGVFZmZlY3RzOworICAgIGJvb2wgbmV2ZXJIYXNTaWRlRWZmZWN0czsKKyAgICBib29sIGlzQXNDaGVhcEFzQU1vdmU7CisgICAgYm9vbCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxOworICAgIGJvb2wgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcTsKKyAgICAKKyAgICAvLy8gUGFyc2VPcGVyYW5kTmFtZSAtIFBhcnNlIGFuIG9wZXJhbmQgbmFtZSBsaWtlICIkZm9vIiBvciAiJGZvby5iYXIiLAorICAgIC8vLyB3aGVyZSAkZm9vIGlzIGEgd2hvbGUgb3BlcmFuZCBhbmQgJGZvby5iYXIgcmVmZXJzIHRvIGEgc3Vib3BlcmFuZC4KKyAgICAvLy8gVGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGludmFsaWQuICBJZiBBbGxvd1dob2xlT3AgaXMKKyAgICAvLy8gdHJ1ZSwgcmVmZXJlbmNlcyB0byBvcGVyYW5kcyB3aXRoIHN1Ym9wZXJhbmRzIGFyZSBhbGxvd2VkLCBvdGhlcndpc2UKKyAgICAvLy8gbm90LgorICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4gUGFyc2VPcGVyYW5kTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dXaG9sZU9wID0gdHJ1ZSk7CisgICAgCisgICAgLy8vIGdldEZsYXR0ZW5lZE9wZXJhbmROdW1iZXIgLSBGbGF0dGVuIGEgb3BlcmFuZC9zdWJvcGVyYW5kIHBhaXIgaW50byBhCisgICAgLy8vIGZsYXQgbWFjaGluZWluc3RyIG9wZXJhbmQgIy4KKyAgICB1bnNpZ25lZCBnZXRGbGF0dGVuZWRPcGVyYW5kTnVtYmVyKHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4gT3ApIGNvbnN0IHsKKyAgICAgIHJldHVybiBPcGVyYW5kTGlzdFtPcC5maXJzdF0uTUlPcGVyYW5kTm8gKyBPcC5zZWNvbmQ7CisgICAgfQorICAgIAorICAgIC8vLyBnZXRTdWJPcGVyYW5kTnVtYmVyIC0gVW5mbGF0dGVuIGEgb3BlcmFuZCBudW1iZXIgaW50byBhbgorICAgIC8vLyBvcGVyYW5kL3N1Ym9wZXJhbmQgcGFpci4KKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+IGdldFN1Yk9wZXJhbmROdW1iZXIodW5zaWduZWQgT3ApIGNvbnN0IHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IDsgKytpKSB7CisgICAgICAgIGFzc2VydChpIDwgT3BlcmFuZExpc3Quc2l6ZSgpICYmICJJbnZhbGlkIGZsYXQgb3BlcmFuZCAjIik7CisgICAgICAgIGlmIChPcGVyYW5kTGlzdFtpXS5NSU9wZXJhbmRObytPcGVyYW5kTGlzdFtpXS5NSU51bU9wZXJhbmRzID4gT3ApCisgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGksIE9wLU9wZXJhbmRMaXN0W2ldLk1JT3BlcmFuZE5vKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLy8vIGlzRmxhdE9wZXJhbmROb3RFbWl0dGVkIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBmbGF0IG9wZXJhbmQgIworICAgIC8vLyBzaG91bGQgbm90IGJlIGVtaXR0ZWQgd2l0aCB0aGUgY29kZSBlbWl0dGVyLgorICAgIGJvb2wgaXNGbGF0T3BlcmFuZE5vdEVtaXR0ZWQodW5zaWduZWQgRmxhdE9wTm8pIGNvbnN0IHsKKyAgICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4gT3AgPSBnZXRTdWJPcGVyYW5kTnVtYmVyKEZsYXRPcE5vKTsKKyAgICAgIGlmIChPcGVyYW5kTGlzdFtPcC5maXJzdF0uRG9Ob3RFbmNvZGUuc2l6ZSgpID4gT3Auc2Vjb25kKQorICAgICAgICByZXR1cm4gT3BlcmFuZExpc3RbT3AuZmlyc3RdLkRvTm90RW5jb2RlW09wLnNlY29uZF07CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ29kZUdlbkluc3RydWN0aW9uKFJlY29yZCAqUiwgY29uc3Qgc3RkOjpzdHJpbmcgJkFzbVN0cik7CisKKyAgICAvLy8gZ2V0T3BlcmFuZE5hbWVkIC0gUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgb3BlcmFuZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gbm9uLWVtcHR5IG5hbWUuICBJZiB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhbiBvcGVyYW5kIHdpdGggdGhlCisgICAgLy8vIHNwZWNpZmllZCBuYW1lLCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgdW5zaWduZWQgZ2V0T3BlcmFuZE5hbWVkKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBjb25zdDsKKyAgICAKKyAgICAvLy8gSGFzT25lSW1wbGljaXREZWZXaXRoS25vd25WVCAtIElmIHRoZSBpbnN0cnVjdGlvbiBoYXMgYXQgbGVhc3Qgb25lCisgICAgLy8vIGltcGxpY2l0IGRlZiBhbmQgaXQgaGFzIGEga25vd24gVlQsIHJldHVybiB0aGUgVlQsIG90aGVyd2lzZSByZXR1cm4KKyAgICAvLy8gTVZUOjpPdGhlci4KKyAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSAKKyAgICAgIEhhc09uZUltcGxpY2l0RGVmV2l0aEtub3duVlQoY29uc3QgQ29kZUdlblRhcmdldCAmVGFyZ2V0SW5mbykgY29uc3Q7CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ29kZUdlbkludHJpbnNpY3MuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5JbnRyaW5zaWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwOGMwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5JbnRyaW5zaWNzLmgKQEAgLTAsMCArMSw4NyBAQAorLy89PT0tIENvZGVHZW5JbnRyaW5zaWMuaCAtIEludHJpbnNpYyBDbGFzcyBXcmFwcGVyIC0tLS0tLS0tLS0tLSotIEMrKyAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHdyYXBwZXIgY2xhc3MgZm9yIHRoZSAnSW50cmluc2ljJyBUYWJsZUdlbiBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENPREVHRU5fSU5UUklOU0lDX0gKKyNkZWZpbmUgQ09ERUdFTl9JTlRSSU5TSUNfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFJlY29yZDsKKyAgY2xhc3MgUmVjb3JkS2VlcGVyOworICBjbGFzcyBDb2RlR2VuVGFyZ2V0OworCisgIHN0cnVjdCBDb2RlR2VuSW50cmluc2ljIHsKKyAgICBSZWNvcmQgKlRoZURlZjsgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIHJlY29yZCBkZWZpbmluZyB0aGlzIGludHJpbnNpYy4KKyAgICBzdGQ6OnN0cmluZyBOYW1lOyAgICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgTExWTSBmdW5jdGlvbiAibGx2bS5ic3dhcC5pMzIiCisgICAgc3RkOjpzdHJpbmcgRW51bU5hbWU7ICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIGVudW0gImJzd2FwX2kzMiIKKyAgICBzdGQ6OnN0cmluZyBHQ0NCdWlsdGluTmFtZTsvLyBOYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIEdDQyBidWlsdGluLCBvciAiIi4KKyAgICBzdGQ6OnN0cmluZyBUYXJnZXRQcmVmaXg7ICAvLyBUYXJnZXQgcHJlZml4LCBlLmcuICJwcGMiIGZvciB0LXMgaW50cmluc2ljcy4KKworICAgIC8vLyBJbnRyaW5zaWNTaWduYXR1cmUgLSBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgcmV0dXJuIHZhbHVlcyBhbmQKKyAgICAvLy8gcGFyYW1ldGVyIHZhbHVlcyBvZiBhbiBpbnRyaW5zaWMuIElmIHRoZSBudW1iZXIgb2YgcmV0dXJuIHZhbHVlcyBpcyA+IDEsCisgICAgLy8vIHRoZW4gdGhlIGludHJpbnNpYyBpbXBsaWNpdGx5IHJldHVybnMgYSBmaXJzdC1jbGFzcyBhZ2dyZWdhdGUuIFRoZQorICAgIC8vLyBudW1iZXJpbmcgb2YgdGhlIHR5cGVzIHN0YXJ0cyBhdCAwIHdpdGggdGhlIGZpcnN0IHJldHVybiB2YWx1ZSBhbmQKKyAgICAvLy8gY29udGludWVzIGZyb20gdGhlcmUgdGhyb3VnaCB0aGUgcGFyYW1ldGVyIGxpc3QuIFRoaXMgaXMgdXNlZnVsIGZvcgorICAgIC8vLyAibWF0Y2hpbmciIHR5cGVzLgorICAgIHN0cnVjdCBJbnRyaW5zaWNTaWduYXR1cmUgeworICAgICAgLy8vIFJldFZUcyAtIFRoZSBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBmb3IgZWFjaCByZXR1cm4gdHlwZS4gTm90ZSB0aGF0IHRoaXMKKyAgICAgIC8vLyBsaXN0IGlzIG9ubHkgcG9wdWxhdGVkIHdoZW4gaW4gdGhlIGNvbnRleHQgb2YgYSB0YXJnZXQgLnRkIGZpbGUuIFdoZW4KKyAgICAgIC8vLyBidWlsZGluZyBJbnRyaW5zaWNzLnRkLCB0aGlzIGlzbid0IGF2YWlsYWJsZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93CisgICAgICAvLy8gdGhlIHRhcmdldCBwb2ludGVyIHNpemUuCisgICAgICBzdGQ6OnZlY3RvcjxNVlQ6OlNpbXBsZVZhbHVlVHlwZT4gUmV0VlRzOworCisgICAgICAvLy8gUmV0VHlwZURlZnMgLSBUaGUgcmVjb3JkcyBmb3IgZWFjaCByZXR1cm4gdHlwZS4KKyAgICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFJldFR5cGVEZWZzOworCisgICAgICAvLy8gUGFyYW1WVHMgLSBUaGUgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZm9yIGVhY2ggcGFyYW1ldGVyIHR5cGUuIE5vdGUgdGhhdAorICAgICAgLy8vIHRoaXMgbGlzdCBpcyBvbmx5IHBvcHVsYXRlZCB3aGVuIGluIHRoZSBjb250ZXh0IG9mIGEgdGFyZ2V0IC50ZCBmaWxlLgorICAgICAgLy8vIFdoZW4gYnVpbGRpbmcgSW50cmluc2ljcy50ZCwgdGhpcyBpc24ndCBhdmFpbGFibGUsIGJlY2F1c2Ugd2UgZG9uJ3QKKyAgICAgIC8vLyBrbm93IHRoZSB0YXJnZXQgcG9pbnRlciBzaXplLgorICAgICAgc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+IFBhcmFtVlRzOworCisgICAgICAvLy8gUGFyYW1UeXBlRGVmcyAtIFRoZSByZWNvcmRzIGZvciBlYWNoIHBhcmFtZXRlciB0eXBlLgorICAgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gUGFyYW1UeXBlRGVmczsKKyAgICB9OworCisgICAgSW50cmluc2ljU2lnbmF0dXJlIElTOworCisgICAgLy8gTWVtb3J5IG1vZC9yZWYgYmVoYXZpb3Igb2YgdGhpcyBpbnRyaW5zaWMuCisgICAgZW51bSB7CisgICAgICBOb01lbSwgUmVhZEFyZ01lbSwgUmVhZE1lbSwgUmVhZFdyaXRlQXJnTWVtLCBSZWFkV3JpdGVNZW0KKyAgICB9IE1vZFJlZjsKKworICAgIC8vLyBUaGlzIGlzIHNldCB0byB0cnVlIGlmIHRoZSBpbnRyaW5zaWMgaXMgb3ZlcmxvYWRlZCBieSBpdHMgYXJndW1lbnQKKyAgICAvLy8gdHlwZXMuCisgICAgYm9vbCBpc092ZXJsb2FkZWQ7CisKKyAgICAvLy8gaXNDb21tdXRhdGl2ZSAtIFRydWUgaWYgdGhlIGludHJpbnNpYyBpcyBjb21tdXRhdGl2ZS4KKyAgICBib29sIGlzQ29tbXV0YXRpdmU7CisgICAgCisgICAgZW51bSBBcmdBdHRyaWJ1dGUgeworICAgICAgTm9DYXB0dXJlCisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIEFyZ0F0dHJpYnV0ZT4gPiBBcmd1bWVudEF0dHJpYnV0ZXM7CisKKyAgICBDb2RlR2VuSW50cmluc2ljKFJlY29yZCAqUik7CisgIH07CisKKyAgLy8vIExvYWRJbnRyaW5zaWNzIC0gUmVhZCBhbGwgb2YgdGhlIGludHJpbnNpY3MgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgIC8vLyAudGQgZmlsZS4KKyAgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gTG9hZEludHJpbnNpY3MoY29uc3QgUmVjb3JkS2VlcGVyICZSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBUYXJnZXRPbmx5KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuUmVnaXN0ZXJzLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuUmVnaXN0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0Zjc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5SZWdpc3RlcnMuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0gQ29kZUdlblJlZ2lzdGVycy5oIC0gUmVnaXN0ZXIgYW5kIFJlZ2lzdGVyQ2xhc3MgSW5mbyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHN0cnVjdHVyZXMgdG8gZW5jYXBzdWxhdGUgaW5mb3JtYXRpb24gZ2xlYW5lZCBmcm9tIHRoZQorLy8gdGFyZ2V0IHJlZ2lzdGVyIGFuZCByZWdpc3RlciBjbGFzcyBkZWZpbml0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENPREVHRU5fUkVHSVNURVJTX0gKKyNkZWZpbmUgQ09ERUdFTl9SRUdJU1RFUlNfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBSZWNvcmQ7CisKKyAgLy8vIENvZGVHZW5SZWdpc3RlciAtIFJlcHJlc2VudHMgYSByZWdpc3RlciBkZWZpbml0aW9uLgorICBzdHJ1Y3QgQ29kZUdlblJlZ2lzdGVyIHsKKyAgICBSZWNvcmQgKlRoZURlZjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0OworICAgIHVuc2lnbmVkIERlY2xhcmVkU3BpbGxTaXplLCBEZWNsYXJlZFNwaWxsQWxpZ25tZW50OworICAgIENvZGVHZW5SZWdpc3RlcihSZWNvcmQgKlIpOworICB9OworCisKKyAgc3RydWN0IENvZGVHZW5SZWdpc3RlckNsYXNzIHsKKyAgICBSZWNvcmQgKlRoZURlZjsKKyAgICBzdGQ6OnN0cmluZyBOYW1lc3BhY2U7CisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gRWxlbWVudHM7CisgICAgc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+IFZUczsKKyAgICB1bnNpZ25lZCBTcGlsbFNpemU7CisgICAgdW5zaWduZWQgU3BpbGxBbGlnbm1lbnQ7CisgICAgaW50IENvcHlDb3N0OworICAgIC8vIE1hcCBTdWJSZWdJbmRleCAtPiBSZWdpc3RlckNsYXNzCisgICAgRGVuc2VNYXA8UmVjb3JkKixSZWNvcmQqPiBTdWJSZWdDbGFzc2VzOworICAgIHN0ZDo6c3RyaW5nIE1ldGhvZFByb3RvcywgTWV0aG9kQm9kaWVzOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdDsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxNVlQ6OlNpbXBsZVZhbHVlVHlwZT4gJmdldFZhbHVlVHlwZXMoKSBjb25zdCB7cmV0dXJuIFZUczt9CisgICAgdW5zaWduZWQgZ2V0TnVtVmFsdWVUeXBlcygpIGNvbnN0IHsgcmV0dXJuIFZUcy5zaXplKCk7IH0KKyAgICAKKyAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBnZXRWYWx1ZVR5cGVOdW0odW5zaWduZWQgVlROdW0pIGNvbnN0IHsKKyAgICAgIGlmIChWVE51bSA8IFZUcy5zaXplKCkpCisgICAgICAgIHJldHVybiBWVHNbVlROdW1dOworICAgICAgYXNzZXJ0KDAgJiYgIlZUTnVtIGdyZWF0ZXIgdGhhbiBudW1iZXIgb2YgVmFsdWVUeXBlcyBpbiBSZWdDbGFzcyEiKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorCisgICAgQ29kZUdlblJlZ2lzdGVyQ2xhc3MoUmVjb3JkICpSKTsKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuVGFyZ2V0LmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5UYXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZmUyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9Db2RlR2VuVGFyZ2V0LmNwcApAQCAtMCwwICsxLDU2OCBAQAorLy89PT0tIENvZGVHZW5UYXJnZXQuY3BwIC0gQ29kZUdlbiBUYXJnZXQgQ2xhc3MgV3JhcHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHdyYXBzIHRhcmdldCBkZXNjcmlwdGlvbiBjbGFzc2VzIHVzZWQgYnkgdGhlIHZhcmlvdXMgY29kZQorLy8gZ2VuZXJhdGlvbiBUYWJsZUdlbiBiYWNrZW5kcy4gIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGFjY2VzcyB0aGUgZGF0YSBhbmQKKy8vIHByb3ZpZGVzIGEgc2luZ2xlIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hlY2sgaXQgZm9yIHZhbGlkaXR5LiAgQWxsIG9mIHRoZXNlCisvLyBjbGFzc2VzIHRocm93IGV4Y2VwdGlvbnMgb24gZXJyb3IgY29uZGl0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQ29kZUdlblRhcmdldC5oIgorI2luY2x1ZGUgIkNvZGVHZW5JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PHVuc2lnbmVkPgorQXNtUGFyc2VyTnVtKCJhc21wYXJzZXJudW0iLCBjbDo6aW5pdCgwKSwKKyAgICAgICAgICAgICBjbDo6ZGVzYygiTWFrZSAtZ2VuLWFzbS1wYXJzZXIgZW1pdCBhc3NlbWJseSBwYXJzZXIgI04iKSk7CisKK3N0YXRpYyBjbDo6b3B0PHVuc2lnbmVkPgorQXNtV3JpdGVyTnVtKCJhc213cml0ZXJudW0iLCBjbDo6aW5pdCgwKSwKKyAgICAgICAgICAgICBjbDo6ZGVzYygiTWFrZSAtZ2VuLWFzbS13cml0ZXIgZW1pdCBhc3NlbWJseSB3cml0ZXIgI04iKSk7CisKKy8vLyBnZXRWYWx1ZVR5cGUgLSBSZXR1cm4gdGhlIE1WVDo6U2ltcGxlVmFsdWVUeXBlIHRoYXQgdGhlIHNwZWNpZmllZCBUYWJsZUdlbgorLy8vIHJlY29yZCBjb3JyZXNwb25kcyB0by4KK01WVDo6U2ltcGxlVmFsdWVUeXBlIGxsdm06OmdldFZhbHVlVHlwZShSZWNvcmQgKlJlYykgeworICByZXR1cm4gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKVJlYy0+Z2V0VmFsdWVBc0ludCgiVmFsdWUiKTsKK30KKworc3RkOjpzdHJpbmcgbGx2bTo6Z2V0TmFtZShNVlQ6OlNpbXBsZVZhbHVlVHlwZSBUKSB7CisgIHN3aXRjaCAoVCkgeworICBjYXNlIE1WVDo6T3RoZXI6ICAgcmV0dXJuICJVTktOT1dOIjsKKyAgY2FzZSBNVlQ6OmlQVFI6ICAgIHJldHVybiAiVExJLmdldFBvaW50ZXJUeSgpIjsKKyAgY2FzZSBNVlQ6OmlQVFJBbnk6IHJldHVybiAiVExJLmdldFBvaW50ZXJUeSgpIjsKKyAgZGVmYXVsdDogcmV0dXJuIGdldEVudW1OYW1lKFQpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIGxsdm06OmdldEVudW1OYW1lKE1WVDo6U2ltcGxlVmFsdWVUeXBlIFQpIHsKKyAgc3dpdGNoIChUKSB7CisgIGNhc2UgTVZUOjpPdGhlcjogcmV0dXJuICJNVlQ6Ok90aGVyIjsKKyAgY2FzZSBNVlQ6OmkxOiAgICByZXR1cm4gIk1WVDo6aTEiOworICBjYXNlIE1WVDo6aTg6ICAgIHJldHVybiAiTVZUOjppOCI7CisgIGNhc2UgTVZUOjppMTY6ICAgcmV0dXJuICJNVlQ6OmkxNiI7CisgIGNhc2UgTVZUOjppMzI6ICAgcmV0dXJuICJNVlQ6OmkzMiI7CisgIGNhc2UgTVZUOjppNjQ6ICAgcmV0dXJuICJNVlQ6Omk2NCI7CisgIGNhc2UgTVZUOjppMTI4OiAgcmV0dXJuICJNVlQ6OmkxMjgiOworICBjYXNlIE1WVDo6aUFueTogIHJldHVybiAiTVZUOjppQW55IjsKKyAgY2FzZSBNVlQ6OmZBbnk6ICByZXR1cm4gIk1WVDo6ZkFueSI7CisgIGNhc2UgTVZUOjp2QW55OiAgcmV0dXJuICJNVlQ6OnZBbnkiOworICBjYXNlIE1WVDo6ZjMyOiAgIHJldHVybiAiTVZUOjpmMzIiOworICBjYXNlIE1WVDo6ZjY0OiAgIHJldHVybiAiTVZUOjpmNjQiOworICBjYXNlIE1WVDo6ZjgwOiAgIHJldHVybiAiTVZUOjpmODAiOworICBjYXNlIE1WVDo6ZjEyODogIHJldHVybiAiTVZUOjpmMTI4IjsKKyAgY2FzZSBNVlQ6OnBwY2YxMjg6ICByZXR1cm4gIk1WVDo6cHBjZjEyOCI7CisgIGNhc2UgTVZUOjpGbGFnOiAgcmV0dXJuICJNVlQ6OkZsYWciOworICBjYXNlIE1WVDo6aXNWb2lkOnJldHVybiAiTVZUOjppc1ZvaWQiOworICBjYXNlIE1WVDo6djJpODogIHJldHVybiAiTVZUOjp2Mmk4IjsKKyAgY2FzZSBNVlQ6OnY0aTg6ICByZXR1cm4gIk1WVDo6djRpOCI7CisgIGNhc2UgTVZUOjp2OGk4OiAgcmV0dXJuICJNVlQ6OnY4aTgiOworICBjYXNlIE1WVDo6djE2aTg6IHJldHVybiAiTVZUOjp2MTZpOCI7CisgIGNhc2UgTVZUOjp2MzJpODogcmV0dXJuICJNVlQ6OnYzMmk4IjsKKyAgY2FzZSBNVlQ6OnYyaTE2OiByZXR1cm4gIk1WVDo6djJpMTYiOworICBjYXNlIE1WVDo6djRpMTY6IHJldHVybiAiTVZUOjp2NGkxNiI7CisgIGNhc2UgTVZUOjp2OGkxNjogcmV0dXJuICJNVlQ6OnY4aTE2IjsKKyAgY2FzZSBNVlQ6OnYxNmkxNjogcmV0dXJuICJNVlQ6OnYxNmkxNiI7CisgIGNhc2UgTVZUOjp2MmkzMjogcmV0dXJuICJNVlQ6OnYyaTMyIjsKKyAgY2FzZSBNVlQ6OnY0aTMyOiByZXR1cm4gIk1WVDo6djRpMzIiOworICBjYXNlIE1WVDo6djhpMzI6IHJldHVybiAiTVZUOjp2OGkzMiI7CisgIGNhc2UgTVZUOjp2MWk2NDogcmV0dXJuICJNVlQ6OnYxaTY0IjsKKyAgY2FzZSBNVlQ6OnYyaTY0OiByZXR1cm4gIk1WVDo6djJpNjQiOworICBjYXNlIE1WVDo6djRpNjQ6IHJldHVybiAiTVZUOjp2NGk2NCI7CisgIGNhc2UgTVZUOjp2OGk2NDogcmV0dXJuICJNVlQ6OnY4aTY0IjsKKyAgY2FzZSBNVlQ6OnYyZjMyOiByZXR1cm4gIk1WVDo6djJmMzIiOworICBjYXNlIE1WVDo6djRmMzI6IHJldHVybiAiTVZUOjp2NGYzMiI7CisgIGNhc2UgTVZUOjp2OGYzMjogcmV0dXJuICJNVlQ6OnY4ZjMyIjsKKyAgY2FzZSBNVlQ6OnYyZjY0OiByZXR1cm4gIk1WVDo6djJmNjQiOworICBjYXNlIE1WVDo6djRmNjQ6IHJldHVybiAiTVZUOjp2NGY2NCI7CisgIGNhc2UgTVZUOjpNZXRhZGF0YTogcmV0dXJuICJNVlQ6Ok1ldGFkYXRhIjsKKyAgY2FzZSBNVlQ6OmlQVFI6ICByZXR1cm4gIk1WVDo6aVBUUiI7CisgIGNhc2UgTVZUOjppUFRSQW55OiAgcmV0dXJuICJNVlQ6OmlQVFJBbnkiOworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiSUxMRUdBTCBWQUxVRSBUWVBFISIpOyByZXR1cm4gIiI7CisgIH0KK30KKworLy8vIGdldFF1YWxpZmllZE5hbWUgLSBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCByZWNvcmQsIHdpdGggYQorLy8vIG5hbWVzcGFjZSBxdWFsaWZpZXIgaWYgdGhlIHJlY29yZCBjb250YWlucyBvbmUuCisvLy8KK3N0ZDo6c3RyaW5nIGxsdm06OmdldFF1YWxpZmllZE5hbWUoY29uc3QgUmVjb3JkICpSKSB7CisgIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZSA9IFItPmdldFZhbHVlQXNTdHJpbmcoIk5hbWVzcGFjZSIpOworICBpZiAoTmFtZXNwYWNlLmVtcHR5KCkpIHJldHVybiBSLT5nZXROYW1lKCk7CisgIHJldHVybiBOYW1lc3BhY2UgKyAiOjoiICsgUi0+Z2V0TmFtZSgpOworfQorCisKKworCisvLy8gZ2V0VGFyZ2V0IC0gUmV0dXJuIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBUYXJnZXQgY2xhc3MuCisvLy8KK0NvZGVHZW5UYXJnZXQ6OkNvZGVHZW5UYXJnZXQoKSB7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFRhcmdldHMgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiVGFyZ2V0Iik7CisgIGlmIChUYXJnZXRzLnNpemUoKSA9PSAwKQorICAgIHRocm93IHN0ZDo6c3RyaW5nKCJFUlJPUjogTm8gJ1RhcmdldCcgc3ViY2xhc3NlcyBkZWZpbmVkISIpOworICBpZiAoVGFyZ2V0cy5zaXplKCkgIT0gMSkKKyAgICB0aHJvdyBzdGQ6OnN0cmluZygiRVJST1I6IE11bHRpcGxlIHN1YmNsYXNzZXMgb2YgVGFyZ2V0IGRlZmluZWQhIik7CisgIFRhcmdldFJlYyA9IFRhcmdldHNbMF07Cit9CisKKworY29uc3Qgc3RkOjpzdHJpbmcgJkNvZGVHZW5UYXJnZXQ6OmdldE5hbWUoKSBjb25zdCB7CisgIHJldHVybiBUYXJnZXRSZWMtPmdldE5hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgQ29kZUdlblRhcmdldDo6Z2V0SW5zdE5hbWVzcGFjZSgpIGNvbnN0IHsKKyAgZm9yIChpbnN0X2l0ZXJhdG9yIGkgPSBpbnN0X2JlZ2luKCksIGUgPSBpbnN0X2VuZCgpOyBpICE9IGU7ICsraSkgeworICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gcGljayB1cCAiVGFyZ2V0T3Bjb2RlIiBieSBhY2NpZGVudGFsbHkgZ2V0dGluZworICAgIC8vIHRoZSBuYW1lc3BhY2Ugb2ZmIHRoZSBQSEkgaW5zdHJ1Y3Rpb24gb3Igc29tZXRoaW5nLgorICAgIGlmICgoKmkpLT5OYW1lc3BhY2UgIT0gIlRhcmdldE9wY29kZSIpCisgICAgICByZXR1cm4gKCppKS0+TmFtZXNwYWNlOworICB9CisKKyAgcmV0dXJuICIiOworfQorCitSZWNvcmQgKkNvZGVHZW5UYXJnZXQ6OmdldEluc3RydWN0aW9uU2V0KCkgY29uc3QgeworICByZXR1cm4gVGFyZ2V0UmVjLT5nZXRWYWx1ZUFzRGVmKCJJbnN0cnVjdGlvblNldCIpOworfQorCisKKy8vLyBnZXRBc21QYXJzZXIgLSBSZXR1cm4gdGhlIEFzc2VtYmx5UGFyc2VyIGRlZmluaXRpb24gZm9yIHRoaXMgdGFyZ2V0LgorLy8vCitSZWNvcmQgKkNvZGVHZW5UYXJnZXQ6OmdldEFzbVBhcnNlcigpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gTEkgPSBUYXJnZXRSZWMtPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJBc3NlbWJseVBhcnNlcnMiKTsKKyAgaWYgKEFzbVBhcnNlck51bSA+PSBMSS5zaXplKCkpCisgICAgdGhyb3cgIlRhcmdldCBkb2VzIG5vdCBoYXZlIGFuIEFzbVBhcnNlciAjIiArIHV0b3N0cihBc21QYXJzZXJOdW0pICsgIiEiOworICByZXR1cm4gTElbQXNtUGFyc2VyTnVtXTsKK30KKworLy8vIGdldEFzbVdyaXRlciAtIFJldHVybiB0aGUgQXNzZW1ibHlXcml0ZXIgZGVmaW5pdGlvbiBmb3IgdGhpcyB0YXJnZXQuCisvLy8KK1JlY29yZCAqQ29kZUdlblRhcmdldDo6Z2V0QXNtV3JpdGVyKCkgY29uc3QgeworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBMSSA9IFRhcmdldFJlYy0+Z2V0VmFsdWVBc0xpc3RPZkRlZnMoIkFzc2VtYmx5V3JpdGVycyIpOworICBpZiAoQXNtV3JpdGVyTnVtID49IExJLnNpemUoKSkKKyAgICB0aHJvdyAiVGFyZ2V0IGRvZXMgbm90IGhhdmUgYW4gQXNtV3JpdGVyICMiICsgdXRvc3RyKEFzbVdyaXRlck51bSkgKyAiISI7CisgIHJldHVybiBMSVtBc21Xcml0ZXJOdW1dOworfQorCit2b2lkIENvZGVHZW5UYXJnZXQ6OlJlYWRSZWdpc3RlcnMoKSBjb25zdCB7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFJlZ3MgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiUmVnaXN0ZXIiKTsKKyAgaWYgKFJlZ3MuZW1wdHkoKSkKKyAgICB0aHJvdyBzdGQ6OnN0cmluZygiTm8gJ1JlZ2lzdGVyJyBzdWJjbGFzc2VzIGRlZmluZWQhIik7CisgIHN0ZDo6c29ydChSZWdzLmJlZ2luKCksIFJlZ3MuZW5kKCksIExlc3NSZWNvcmQoKSk7CisKKyAgUmVnaXN0ZXJzLnJlc2VydmUoUmVncy5zaXplKCkpOworICBSZWdpc3RlcnMuYXNzaWduKFJlZ3MuYmVnaW4oKSwgUmVncy5lbmQoKSk7Cit9CisKK0NvZGVHZW5SZWdpc3Rlcjo6Q29kZUdlblJlZ2lzdGVyKFJlY29yZCAqUikgOiBUaGVEZWYoUikgeworICBEZWNsYXJlZFNwaWxsU2l6ZSA9IFItPmdldFZhbHVlQXNJbnQoIlNwaWxsU2l6ZSIpOworICBEZWNsYXJlZFNwaWxsQWxpZ25tZW50ID0gUi0+Z2V0VmFsdWVBc0ludCgiU3BpbGxBbGlnbm1lbnQiKTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcgJkNvZGVHZW5SZWdpc3Rlcjo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIFRoZURlZi0+Z2V0TmFtZSgpOworfQorCit2b2lkIENvZGVHZW5UYXJnZXQ6OlJlYWRTdWJSZWdJbmRpY2VzKCkgY29uc3QgeworICBTdWJSZWdJbmRpY2VzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIlN1YlJlZ0luZGV4Iik7CisgIHN0ZDo6c29ydChTdWJSZWdJbmRpY2VzLmJlZ2luKCksIFN1YlJlZ0luZGljZXMuZW5kKCksIExlc3NSZWNvcmQoKSk7Cit9CisKK3ZvaWQgQ29kZUdlblRhcmdldDo6UmVhZFJlZ2lzdGVyQ2xhc3NlcygpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gUmVnQ2xhc3NlcyA9CisgICAgUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIlJlZ2lzdGVyQ2xhc3MiKTsKKyAgaWYgKFJlZ0NsYXNzZXMuZW1wdHkoKSkKKyAgICB0aHJvdyBzdGQ6OnN0cmluZygiTm8gJ1JlZ2lzdGVyQ2xhc3MnIHN1YmNsYXNzZXMgZGVmaW5lZCEiKTsKKworICBSZWdpc3RlckNsYXNzZXMucmVzZXJ2ZShSZWdDbGFzc2VzLnNpemUoKSk7CisgIFJlZ2lzdGVyQ2xhc3Nlcy5hc3NpZ24oUmVnQ2xhc3Nlcy5iZWdpbigpLCBSZWdDbGFzc2VzLmVuZCgpKTsKK30KKworc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+IENvZGVHZW5UYXJnZXQ6OgorZ2V0UmVnaXN0ZXJWVHMoUmVjb3JkICpSKSBjb25zdCB7CisgIHN0ZDo6dmVjdG9yPE1WVDo6U2ltcGxlVmFsdWVUeXBlPiBSZXN1bHQ7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3RlckNsYXNzPiAmUkNzID0gZ2V0UmVnaXN0ZXJDbGFzc2VzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSQ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICZSQyA9IFJlZ2lzdGVyQ2xhc3Nlc1tpXTsKKyAgICBmb3IgKHVuc2lnbmVkIGVpID0gMCwgZWUgPSBSQy5FbGVtZW50cy5zaXplKCk7IGVpICE9IGVlOyArK2VpKSB7CisgICAgICBpZiAoUiA9PSBSQy5FbGVtZW50c1tlaV0pIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+ICZJblZUcyA9IFJDLmdldFZhbHVlVHlwZXMoKTsKKyAgICAgICAgUmVzdWx0Lmluc2VydChSZXN1bHQuZW5kKCksIEluVlRzLmJlZ2luKCksIEluVlRzLmVuZCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8vIFJlbW92ZSBkdXBsaWNhdGVzLgorICBhcnJheV9wb2Rfc29ydChSZXN1bHQuYmVnaW4oKSwgUmVzdWx0LmVuZCgpKTsKKyAgUmVzdWx0LmVyYXNlKHN0ZDo6dW5pcXVlKFJlc3VsdC5iZWdpbigpLCBSZXN1bHQuZW5kKCkpLCBSZXN1bHQuZW5kKCkpOworICByZXR1cm4gUmVzdWx0OworfQorCisKK0NvZGVHZW5SZWdpc3RlckNsYXNzOjpDb2RlR2VuUmVnaXN0ZXJDbGFzcyhSZWNvcmQgKlIpIDogVGhlRGVmKFIpIHsKKyAgLy8gUmVuYW1lIGFub255bW91cyByZWdpc3RlciBjbGFzc2VzLgorICBpZiAoUi0+Z2V0TmFtZSgpLnNpemUoKSA+IDkgJiYgUi0+Z2V0TmFtZSgpWzldID09ICcuJykgeworICAgIHN0YXRpYyB1bnNpZ25lZCBBbm9uQ291bnRlciA9IDA7CisgICAgUi0+c2V0TmFtZSgiQW5vblJlZ0NsYXNzXyIrdXRvc3RyKEFub25Db3VudGVyKyspKTsKKyAgfSAKKyAgCisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFR5cGVMaXN0ID0gUi0+Z2V0VmFsdWVBc0xpc3RPZkRlZnMoIlJlZ1R5cGVzIik7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUeXBlTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgUmVjb3JkICpUeXBlID0gVHlwZUxpc3RbaV07CisgICAgaWYgKCFUeXBlLT5pc1N1YkNsYXNzT2YoIlZhbHVlVHlwZSIpKQorICAgICAgdGhyb3cgIlJlZ1R5cGVzIGxpc3QgbWVtYmVyICciICsgVHlwZS0+Z2V0TmFtZSgpICsKKyAgICAgICAgIicgZG9lcyBub3QgZGVyaXZlIGZyb20gdGhlIFZhbHVlVHlwZSBjbGFzcyEiOworICAgIFZUcy5wdXNoX2JhY2soZ2V0VmFsdWVUeXBlKFR5cGUpKTsKKyAgfQorICBhc3NlcnQoIVZUcy5lbXB0eSgpICYmICJSZWdpc3RlckNsYXNzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgVmFsdWVUeXBlISIpOworICAKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gUmVnTGlzdCA9IFItPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJNZW1iZXJMaXN0Iik7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQgKlJlZyA9IFJlZ0xpc3RbaV07CisgICAgaWYgKCFSZWctPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXIiKSkKKyAgICAgIHRocm93ICJSZWdpc3RlciBDbGFzcyBtZW1iZXIgJyIgKyBSZWctPmdldE5hbWUoKSArCisgICAgICAgICAgICAiJyBkb2VzIG5vdCBkZXJpdmUgZnJvbSB0aGUgUmVnaXN0ZXIgY2xhc3MhIjsKKyAgICBFbGVtZW50cy5wdXNoX2JhY2soUmVnKTsKKyAgfQorCisgIC8vIFN1YlJlZ0NsYXNzZXMgaXMgYSBsaXN0PGRhZz4gY29udGFpbmluZyAoUkMsIHN1YnJlZ2luZGV4LCAuLi4pIGRhZ3MuCisgIExpc3RJbml0ICpTUkMgPSBSLT5nZXRWYWx1ZUFzTGlzdEluaXQoIlN1YlJlZ0NsYXNzZXMiKTsKKyAgZm9yIChMaXN0SW5pdDo6Y29uc3RfaXRlcmF0b3IgaSA9IFNSQy0+YmVnaW4oKSwgZSA9IFNSQy0+ZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgRGFnSW5pdCAqREFHID0gZHluYW1pY19jYXN0PERhZ0luaXQqPigqaSk7CisgICAgaWYgKCFEQUcpIHRocm93ICJTdWJSZWdDbGFzc2VzIG11c3QgY29udGFpbiBEQUdzIjsKKyAgICBEZWZJbml0ICpEQUdPcCA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oREFHLT5nZXRPcGVyYXRvcigpKTsKKyAgICBSZWNvcmQgKlJDUmVjOworICAgIGlmICghREFHT3AgfHwgIShSQ1JlYyA9IERBR09wLT5nZXREZWYoKSktPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXJDbGFzcyIpKQorICAgICAgdGhyb3cgIk9wZXJhdG9yICciICsgREFHLT5nZXRPcGVyYXRvcigpLT5nZXRBc1N0cmluZygpICsKKyAgICAgICAgIicgaW4gU3ViUmVnQ2xhc3NlcyBpcyBub3QgYSBSZWdpc3RlckNsYXNzIjsKKyAgICAvLyBJdGVyYXRlIG92ZXIgYXJncywgYWxsIFN1YlJlZ0luZGV4IGluc3RhbmNlcy4KKyAgICBmb3IgKERhZ0luaXQ6OmNvbnN0X2FyZ19pdGVyYXRvciBhaSA9IERBRy0+YXJnX2JlZ2luKCksIGFlID0gREFHLT5hcmdfZW5kKCk7CisgICAgICAgICBhaSAhPSBhZTsgKythaSkgeworICAgICAgRGVmSW5pdCAqSWR4ID0gZHluYW1pY19jYXN0PERlZkluaXQqPigqYWkpOworICAgICAgUmVjb3JkICpJZHhSZWM7CisgICAgICBpZiAoIUlkeCB8fCAhKElkeFJlYyA9IElkeC0+Z2V0RGVmKCkpLT5pc1N1YkNsYXNzT2YoIlN1YlJlZ0luZGV4IikpCisgICAgICAgIHRocm93ICJBcmd1bWVudCAnIiArICgqYWkpLT5nZXRBc1N0cmluZygpICsKKyAgICAgICAgICAiJyBpbiBTdWJSZWdDbGFzc2VzIGlzIG5vdCBhIFN1YlJlZ0luZGV4IjsKKyAgICAgIGlmICghU3ViUmVnQ2xhc3Nlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSWR4UmVjLCBSQ1JlYykpLnNlY29uZCkKKyAgICAgICAgdGhyb3cgIlN1YlJlZ0luZGV4ICciICsgSWR4UmVjLT5nZXROYW1lKCkgKyAiJyBtZW50aW9uZWQgdHdpY2UiOworICAgIH0KKyAgfQorCisgIC8vIEFsbG93IHRhcmdldHMgdG8gb3ZlcnJpZGUgdGhlIHNpemUgaW4gYml0cyBvZiB0aGUgUmVnaXN0ZXJDbGFzcy4KKyAgdW5zaWduZWQgU2l6ZSA9IFItPmdldFZhbHVlQXNJbnQoIlNpemUiKTsKKworICBOYW1lc3BhY2UgPSBSLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lc3BhY2UiKTsKKyAgU3BpbGxTaXplID0gU2l6ZSA/IFNpemUgOiBFVlQoVlRzWzBdKS5nZXRTaXplSW5CaXRzKCk7CisgIFNwaWxsQWxpZ25tZW50ID0gUi0+Z2V0VmFsdWVBc0ludCgiQWxpZ25tZW50Iik7CisgIENvcHlDb3N0ID0gUi0+Z2V0VmFsdWVBc0ludCgiQ29weUNvc3QiKTsKKyAgTWV0aG9kQm9kaWVzID0gUi0+Z2V0VmFsdWVBc0NvZGUoIk1ldGhvZEJvZGllcyIpOworICBNZXRob2RQcm90b3MgPSBSLT5nZXRWYWx1ZUFzQ29kZSgiTWV0aG9kUHJvdG9zIik7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nICZDb2RlR2VuUmVnaXN0ZXJDbGFzczo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIFRoZURlZi0+Z2V0TmFtZSgpOworfQorCit2b2lkIENvZGVHZW5UYXJnZXQ6OlJlYWRMZWdhbFZhbHVlVHlwZXMoKSBjb25zdCB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3RlckNsYXNzPiAmUkNzID0gZ2V0UmVnaXN0ZXJDbGFzc2VzKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSQ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBmb3IgKHVuc2lnbmVkIHJpID0gMCwgcmUgPSBSQ3NbaV0uVlRzLnNpemUoKTsgcmkgIT0gcmU7ICsrcmkpCisgICAgICBMZWdhbFZhbHVlVHlwZXMucHVzaF9iYWNrKFJDc1tpXS5WVHNbcmldKTsKKyAgCisgIC8vIFJlbW92ZSBkdXBsaWNhdGVzLgorICBzdGQ6OnNvcnQoTGVnYWxWYWx1ZVR5cGVzLmJlZ2luKCksIExlZ2FsVmFsdWVUeXBlcy5lbmQoKSk7CisgIExlZ2FsVmFsdWVUeXBlcy5lcmFzZShzdGQ6OnVuaXF1ZShMZWdhbFZhbHVlVHlwZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsVmFsdWVUeXBlcy5lbmQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbFZhbHVlVHlwZXMuZW5kKCkpOworfQorCisKK3ZvaWQgQ29kZUdlblRhcmdldDo6UmVhZEluc3RydWN0aW9ucygpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gSW5zdHMgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiSW5zdHJ1Y3Rpb24iKTsKKyAgaWYgKEluc3RzLnNpemUoKSA8PSAyKQorICAgIHRocm93IHN0ZDo6c3RyaW5nKCJObyAnSW5zdHJ1Y3Rpb24nIHN1YmNsYXNzZXMgZGVmaW5lZCEiKTsKKworICAvLyBQYXJzZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlZmluZWQgaW4gdGhlIC50ZCBmaWxlLgorICBzdGQ6OnN0cmluZyBJbnN0Rm9ybWF0TmFtZSA9CisgICAgZ2V0QXNtV3JpdGVyKCktPmdldFZhbHVlQXNTdHJpbmcoIkluc3RGb3JtYXROYW1lIik7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3RzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBzdGQ6OnN0cmluZyBBc21TdHIgPSBJbnN0c1tpXS0+Z2V0VmFsdWVBc1N0cmluZyhJbnN0Rm9ybWF0TmFtZSk7CisgICAgSW5zdHJ1Y3Rpb25zW0luc3RzW2ldXSA9IG5ldyBDb2RlR2VuSW5zdHJ1Y3Rpb24oSW5zdHNbaV0sIEFzbVN0cik7CisgIH0KK30KKworc3RhdGljIGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAqCitHZXRJbnN0QnlOYW1lKGNvbnN0IGNoYXIgKk5hbWUsCisgICAgICAgICAgICAgIGNvbnN0IERlbnNlTWFwPGNvbnN0IFJlY29yZCosIENvZGVHZW5JbnN0cnVjdGlvbio+ICZJbnN0cykgeworICBjb25zdCBSZWNvcmQgKlJlYyA9IFJlY29yZHMuZ2V0RGVmKE5hbWUpOworICAKKyAgRGVuc2VNYXA8Y29uc3QgUmVjb3JkKiwgQ29kZUdlbkluc3RydWN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgSSA9IEluc3RzLmZpbmQoUmVjKTsKKyAgaWYgKFJlYyA9PSAwIHx8IEkgPT0gSW5zdHMuZW5kKCkpCisgICAgdGhyb3cgc3RkOjpzdHJpbmcoIkNvdWxkIG5vdCBmaW5kICciKSArIE5hbWUgKyAiJyBpbnN0cnVjdGlvbiEiOworICByZXR1cm4gSS0+c2Vjb25kOworfQorCituYW1lc3BhY2UgeworLy8vIFNvcnRJbnN0QnlOYW1lIC0gU29ydGluZyBwcmVkaWNhdGUgdG8gc29ydCBpbnN0cnVjdGlvbnMgYnkgbmFtZS4KKy8vLworc3RydWN0IFNvcnRJbnN0QnlOYW1lIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAqUmVjMSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAqUmVjMikgY29uc3QgeworICAgIHJldHVybiBSZWMxLT5UaGVEZWYtPmdldE5hbWUoKSA8IFJlYzItPlRoZURlZi0+Z2V0TmFtZSgpOworICB9Cit9OworfQorCisvLy8gZ2V0SW5zdHJ1Y3Rpb25zQnlFbnVtVmFsdWUgLSBSZXR1cm4gYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgZGVmaW5lZCBieSB0aGUKKy8vLyB0YXJnZXQsIG9yZGVyZWQgYnkgdGhlaXIgZW51bSB2YWx1ZS4KK3ZvaWQgQ29kZUdlblRhcmdldDo6Q29tcHV0ZUluc3Ryc0J5RW51bSgpIGNvbnN0IHsKKyAgLy8gVGhlIG9yZGVyaW5nIGhlcmUgbXVzdCBtYXRjaCB0aGUgb3JkZXJpbmcgaW4gVGFyZ2V0T3Bjb2Rlcy5oLgorICBjb25zdCBjaGFyICpjb25zdCBGaXhlZEluc3Ryc1tdID0geworICAgICJQSEkiLAorICAgICJJTkxJTkVBU00iLAorICAgICJQUk9MT0dfTEFCRUwiLAorICAgICJFSF9MQUJFTCIsCisgICAgIkdDX0xBQkVMIiwKKyAgICAiS0lMTCIsCisgICAgIkVYVFJBQ1RfU1VCUkVHIiwKKyAgICAiSU5TRVJUX1NVQlJFRyIsCisgICAgIklNUExJQ0lUX0RFRiIsCisgICAgIlNVQlJFR19UT19SRUciLAorICAgICJDT1BZX1RPX1JFR0NMQVNTIiwKKyAgICAiREJHX1ZBTFVFIiwKKyAgICAiUkVHX1NFUVVFTkNFIiwKKyAgICAiQ09QWSIsCisgICAgMAorICB9OworICBjb25zdCBEZW5zZU1hcDxjb25zdCBSZWNvcmQqLCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPiAmSW5zdHMgPSBnZXRJbnN0cnVjdGlvbnMoKTsKKyAgZm9yIChjb25zdCBjaGFyICpjb25zdCAqcCA9IEZpeGVkSW5zdHJzOyAqcDsgKytwKSB7CisgICAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uICpJbnN0ciA9IEdldEluc3RCeU5hbWUoKnAsIEluc3RzKTsKKyAgICBhc3NlcnQoSW5zdHIgJiYgIk1pc3NpbmcgdGFyZ2V0IGluZGVwZW5kZW50IGluc3RydWN0aW9uIik7CisgICAgYXNzZXJ0KEluc3RyLT5OYW1lc3BhY2UgPT0gIlRhcmdldE9wY29kZSIgJiYgIkJhZCBuYW1lc3BhY2UiKTsKKyAgICBJbnN0cnNCeUVudW0ucHVzaF9iYWNrKEluc3RyKTsKKyAgfQorICB1bnNpZ25lZCBFbmRPZlByZWRlZmluZXMgPSBJbnN0cnNCeUVudW0uc2l6ZSgpOworCisgIGZvciAoRGVuc2VNYXA8Y29uc3QgUmVjb3JkKiwgQ29kZUdlbkluc3RydWN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgSSA9IEluc3RzLmJlZ2luKCksIEUgPSBJbnN0cy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24gKkNHSSA9IEktPnNlY29uZDsKKyAgICBpZiAoQ0dJLT5OYW1lc3BhY2UgIT0gIlRhcmdldE9wY29kZSIpCisgICAgICBJbnN0cnNCeUVudW0ucHVzaF9iYWNrKENHSSk7CisgIH0KKworICBhc3NlcnQoSW5zdHJzQnlFbnVtLnNpemUoKSA9PSBJbnN0cy5zaXplKCkgJiYgIk1pc3NpbmcgcHJlZGVmaW5lZCBpbnN0ciIpOworCisgIC8vIEFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBub3cgaW4gcmFuZG9tIG9yZGVyIGJhc2VkIG9uIHRoZSBtYXAgaXRlcmF0aW9uLgorICAvLyBTb3J0IHRoZW0gYnkgbmFtZS4KKyAgc3RkOjpzb3J0KEluc3Ryc0J5RW51bS5iZWdpbigpK0VuZE9mUHJlZGVmaW5lcywgSW5zdHJzQnlFbnVtLmVuZCgpLAorICAgICAgICAgICAgU29ydEluc3RCeU5hbWUoKSk7Cit9CisKKworLy8vIGlzTGl0dGxlRW5kaWFuRW5jb2RpbmcgLSBSZXR1cm4gd2hldGhlciB0aGlzIHRhcmdldCBlbmNvZGVzIGl0cyBpbnN0cnVjdGlvbgorLy8vIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LCBpLmUuIGJpdHMgbGFpZCBvdXQgaW4gdGhlIG9yZGVyIFswLi5uXQorLy8vCitib29sIENvZGVHZW5UYXJnZXQ6OmlzTGl0dGxlRW5kaWFuRW5jb2RpbmcoKSBjb25zdCB7CisgIHJldHVybiBnZXRJbnN0cnVjdGlvblNldCgpLT5nZXRWYWx1ZUFzQml0KCJpc0xpdHRsZUVuZGlhbkVuY29kaW5nIik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDb21wbGV4UGF0dGVybiBpbXBsZW1lbnRhdGlvbgorLy8KK0NvbXBsZXhQYXR0ZXJuOjpDb21wbGV4UGF0dGVybihSZWNvcmQgKlIpIHsKKyAgVHkgICAgICAgICAgPSA6OmdldFZhbHVlVHlwZShSLT5nZXRWYWx1ZUFzRGVmKCJUeSIpKTsKKyAgTnVtT3BlcmFuZHMgPSBSLT5nZXRWYWx1ZUFzSW50KCJOdW1PcGVyYW5kcyIpOworICBTZWxlY3RGdW5jICA9IFItPmdldFZhbHVlQXNTdHJpbmcoIlNlbGVjdEZ1bmMiKTsKKyAgUm9vdE5vZGVzICAgPSBSLT5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiUm9vdE5vZGVzIik7CisKKyAgLy8gUGFyc2UgdGhlIHByb3BlcnRpZXMuCisgIFByb3BlcnRpZXMgPSAwOworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBQcm9wTGlzdCA9IFItPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJQcm9wZXJ0aWVzIik7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQcm9wTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChQcm9wTGlzdFtpXS0+Z2V0TmFtZSgpID09ICJTRE5QSGFzQ2hhaW4iKSB7CisgICAgICBQcm9wZXJ0aWVzIHw9IDEgPDwgU0ROUEhhc0NoYWluOworICAgIH0gZWxzZSBpZiAoUHJvcExpc3RbaV0tPmdldE5hbWUoKSA9PSAiU0ROUE9wdEluRmxhZyIpIHsKKyAgICAgIFByb3BlcnRpZXMgfD0gMSA8PCBTRE5QT3B0SW5GbGFnOworICAgIH0gZWxzZSBpZiAoUHJvcExpc3RbaV0tPmdldE5hbWUoKSA9PSAiU0ROUE1heVN0b3JlIikgeworICAgICAgUHJvcGVydGllcyB8PSAxIDw8IFNETlBNYXlTdG9yZTsKKyAgICB9IGVsc2UgaWYgKFByb3BMaXN0W2ldLT5nZXROYW1lKCkgPT0gIlNETlBNYXlMb2FkIikgeworICAgICAgUHJvcGVydGllcyB8PSAxIDw8IFNETlBNYXlMb2FkOworICAgIH0gZWxzZSBpZiAoUHJvcExpc3RbaV0tPmdldE5hbWUoKSA9PSAiU0ROUFNpZGVFZmZlY3QiKSB7CisgICAgICBQcm9wZXJ0aWVzIHw9IDEgPDwgU0ROUFNpZGVFZmZlY3Q7CisgICAgfSBlbHNlIGlmIChQcm9wTGlzdFtpXS0+Z2V0TmFtZSgpID09ICJTRE5QTWVtT3BlcmFuZCIpIHsKKyAgICAgIFByb3BlcnRpZXMgfD0gMSA8PCBTRE5QTWVtT3BlcmFuZDsKKyAgICB9IGVsc2UgaWYgKFByb3BMaXN0W2ldLT5nZXROYW1lKCkgPT0gIlNETlBWYXJpYWRpYyIpIHsKKyAgICAgIFByb3BlcnRpZXMgfD0gMSA8PCBTRE5QVmFyaWFkaWM7CisgICAgfSBlbHNlIHsKKyAgICAgIGVycnMoKSA8PCAiVW5zdXBwb3J0ZWQgU0QgTm9kZSBwcm9wZXJ0eSAnIiA8PCBQcm9wTGlzdFtpXS0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgPDwgIicgb24gQ29tcGxleFBhdHRlcm4gJyIgPDwgUi0+Z2V0TmFtZSgpIDw8ICInIVxuIjsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29kZUdlbkludHJpbnNpYyBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gbGx2bTo6TG9hZEludHJpbnNpY3MoY29uc3QgUmVjb3JkS2VlcGVyICZSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVGFyZ2V0T25seSkgeworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBJID0gUkMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJJbnRyaW5zaWMiKTsKKyAgCisgIHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+IFJlc3VsdDsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgYm9vbCBpc1RhcmdldCA9IElbaV0tPmdldFZhbHVlQXNCaXQoImlzVGFyZ2V0Iik7CisgICAgaWYgKGlzVGFyZ2V0ID09IFRhcmdldE9ubHkpCisgICAgICBSZXN1bHQucHVzaF9iYWNrKENvZGVHZW5JbnRyaW5zaWMoSVtpXSkpOworICB9CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK0NvZGVHZW5JbnRyaW5zaWM6OkNvZGVHZW5JbnRyaW5zaWMoUmVjb3JkICpSKSB7CisgIFRoZURlZiA9IFI7CisgIHN0ZDo6c3RyaW5nIERlZk5hbWUgPSBSLT5nZXROYW1lKCk7CisgIE1vZFJlZiA9IFJlYWRXcml0ZU1lbTsKKyAgaXNPdmVybG9hZGVkID0gZmFsc2U7CisgIGlzQ29tbXV0YXRpdmUgPSBmYWxzZTsKKyAgCisgIGlmIChEZWZOYW1lLnNpemUoKSA8PSA0IHx8IAorICAgICAgc3RkOjpzdHJpbmcoRGVmTmFtZS5iZWdpbigpLCBEZWZOYW1lLmJlZ2luKCkgKyA0KSAhPSAiaW50XyIpCisgICAgdGhyb3cgIkludHJpbnNpYyAnIiArIERlZk5hbWUgKyAiJyBkb2VzIG5vdCBzdGFydCB3aXRoICdpbnRfJyEiOworCisgIEVudW1OYW1lID0gc3RkOjpzdHJpbmcoRGVmTmFtZS5iZWdpbigpKzQsIERlZk5hbWUuZW5kKCkpOworCisgIGlmIChSLT5nZXRWYWx1ZSgiR0NDQnVpbHRpbk5hbWUiKSkgIC8vIElnbm9yZSBhIG1pc3NpbmcgR0NDQnVpbHRpbk5hbWUgZmllbGQuCisgICAgR0NDQnVpbHRpbk5hbWUgPSBSLT5nZXRWYWx1ZUFzU3RyaW5nKCJHQ0NCdWlsdGluTmFtZSIpOworCisgIFRhcmdldFByZWZpeCA9IFItPmdldFZhbHVlQXNTdHJpbmcoIlRhcmdldFByZWZpeCIpOworICBOYW1lID0gUi0+Z2V0VmFsdWVBc1N0cmluZygiTExWTU5hbWUiKTsKKworICBpZiAoTmFtZSA9PSAiIikgeworICAgIC8vIElmIGFuIGV4cGxpY2l0IG5hbWUgaXNuJ3Qgc3BlY2lmaWVkLCBkZXJpdmUgb25lIGZyb20gdGhlIERlZk5hbWUuCisgICAgTmFtZSA9ICJsbHZtLiI7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRW51bU5hbWUuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIE5hbWUgKz0gKEVudW1OYW1lW2ldID09ICdfJykgPyAnLicgOiBFbnVtTmFtZVtpXTsKKyAgfSBlbHNlIHsKKyAgICAvLyBWZXJpZnkgaXQgc3RhcnRzIHdpdGggImxsdm0uIi4KKyAgICBpZiAoTmFtZS5zaXplKCkgPD0gNSB8fCAKKyAgICAgICAgc3RkOjpzdHJpbmcoTmFtZS5iZWdpbigpLCBOYW1lLmJlZ2luKCkgKyA1KSAhPSAibGx2bS4iKQorICAgICAgdGhyb3cgIkludHJpbnNpYyAnIiArIERlZk5hbWUgKyAiJ3MgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICdsbHZtLichIjsKKyAgfQorICAKKyAgLy8gSWYgVGFyZ2V0UHJlZml4IGlzIHNwZWNpZmllZCwgbWFrZSBzdXJlIHRoYXQgTmFtZSBzdGFydHMgd2l0aAorICAvLyAibGx2bS48dGFyZ2V0cHJlZml4Pi4iLgorICBpZiAoIVRhcmdldFByZWZpeC5lbXB0eSgpKSB7CisgICAgaWYgKE5hbWUuc2l6ZSgpIDwgNitUYXJnZXRQcmVmaXguc2l6ZSgpIHx8CisgICAgICAgIHN0ZDo6c3RyaW5nKE5hbWUuYmVnaW4oKSArIDUsIE5hbWUuYmVnaW4oKSArIDYgKyBUYXJnZXRQcmVmaXguc2l6ZSgpKQorICAgICAgICAhPSAoVGFyZ2V0UHJlZml4ICsgIi4iKSkKKyAgICAgIHRocm93ICJJbnRyaW5zaWMgJyIgKyBEZWZOYW1lICsgIicgZG9lcyBub3Qgc3RhcnQgd2l0aCAnbGx2bS4iICsKKyAgICAgICAgVGFyZ2V0UHJlZml4ICsgIi4nISI7CisgIH0KKyAgCisgIC8vIFBhcnNlIHRoZSBsaXN0IG9mIHJldHVybiB0eXBlcy4KKyAgc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+IE92ZXJsb2FkZWRWVHM7CisgIExpc3RJbml0ICpUeXBlTGlzdCA9IFItPmdldFZhbHVlQXNMaXN0SW5pdCgiUmV0VHlwZXMiKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFR5cGVMaXN0LT5nZXRTaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgUmVjb3JkICpUeUVsID0gVHlwZUxpc3QtPmdldEVsZW1lbnRBc1JlY29yZChpKTsKKyAgICBhc3NlcnQoVHlFbC0+aXNTdWJDbGFzc09mKCJMTFZNVHlwZSIpICYmICJFeHBlY3RlZCBhIHR5cGUhIik7CisgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQ7CisgICAgaWYgKFR5RWwtPmlzU3ViQ2xhc3NPZigiTExWTU1hdGNoVHlwZSIpKSB7CisgICAgICB1bnNpZ25lZCBNYXRjaFR5ID0gVHlFbC0+Z2V0VmFsdWVBc0ludCgiTnVtYmVyIik7CisgICAgICBhc3NlcnQoTWF0Y2hUeSA8IE92ZXJsb2FkZWRWVHMuc2l6ZSgpICYmCisgICAgICAgICAgICAgIkludmFsaWQgbWF0Y2hpbmcgbnVtYmVyISIpOworICAgICAgVlQgPSBPdmVybG9hZGVkVlRzW01hdGNoVHldOworICAgICAgLy8gSXQgb25seSBtYWtlcyBzZW5zZSB0byB1c2UgdGhlIGV4dGVuZGVkIGFuZCB0cnVuY2F0ZWQgdmVjdG9yIGVsZW1lbnQKKyAgICAgIC8vIHZhcmlhbnRzIHdpdGggaUFueSB0eXBlczsgb3RoZXJ3aXNlLCBpZiB0aGUgaW50cmluc2ljIGlzIG5vdAorICAgICAgLy8gb3ZlcmxvYWRlZCwgYWxsIHRoZSB0eXBlcyBjYW4gYmUgc3BlY2lmaWVkIGRpcmVjdGx5LgorICAgICAgYXNzZXJ0KCgoIVR5RWwtPmlzU3ViQ2xhc3NPZigiTExWTUV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUiKSAmJgorICAgICAgICAgICAgICAgIVR5RWwtPmlzU3ViQ2xhc3NPZigiTExWTVRydW5jYXRlZEVsZW1lbnRWZWN0b3JUeXBlIikpIHx8CisgICAgICAgICAgICAgIFZUID09IE1WVDo6aUFueSB8fCBWVCA9PSBNVlQ6OnZBbnkpICYmCisgICAgICAgICAgICAgIkV4cGVjdGVkIGlBbnkgb3IgdkFueSB0eXBlIik7CisgICAgfSBlbHNlIHsKKyAgICAgIFZUID0gZ2V0VmFsdWVUeXBlKFR5RWwtPmdldFZhbHVlQXNEZWYoIlZUIikpOworICAgIH0KKyAgICBpZiAoRVZUKFZUKS5pc092ZXJsb2FkZWQoKSkgeworICAgICAgT3ZlcmxvYWRlZFZUcy5wdXNoX2JhY2soVlQpOworICAgICAgaXNPdmVybG9hZGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBSZWplY3QgaW52YWxpZCB0eXBlcy4KKyAgICBpZiAoVlQgPT0gTVZUOjppc1ZvaWQpCisgICAgICB0aHJvdyAiSW50cmluc2ljICciICsgRGVmTmFtZSArICIgaGFzIHZvaWQgaW4gcmVzdWx0IHR5cGUgbGlzdCEiOworICAgIAorICAgIElTLlJldFZUcy5wdXNoX2JhY2soVlQpOworICAgIElTLlJldFR5cGVEZWZzLnB1c2hfYmFjayhUeUVsKTsKKyAgfQorICAKKyAgLy8gUGFyc2UgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLgorICBUeXBlTGlzdCA9IFItPmdldFZhbHVlQXNMaXN0SW5pdCgiUGFyYW1UeXBlcyIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVHlwZUxpc3QtPmdldFNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQgKlR5RWwgPSBUeXBlTGlzdC0+Z2V0RWxlbWVudEFzUmVjb3JkKGkpOworICAgIGFzc2VydChUeUVsLT5pc1N1YkNsYXNzT2YoIkxMVk1UeXBlIikgJiYgIkV4cGVjdGVkIGEgdHlwZSEiKTsKKyAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVDsKKyAgICBpZiAoVHlFbC0+aXNTdWJDbGFzc09mKCJMTFZNTWF0Y2hUeXBlIikpIHsKKyAgICAgIHVuc2lnbmVkIE1hdGNoVHkgPSBUeUVsLT5nZXRWYWx1ZUFzSW50KCJOdW1iZXIiKTsKKyAgICAgIGFzc2VydChNYXRjaFR5IDwgT3ZlcmxvYWRlZFZUcy5zaXplKCkgJiYKKyAgICAgICAgICAgICAiSW52YWxpZCBtYXRjaGluZyBudW1iZXIhIik7CisgICAgICBWVCA9IE92ZXJsb2FkZWRWVHNbTWF0Y2hUeV07CisgICAgICAvLyBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIHVzZSB0aGUgZXh0ZW5kZWQgYW5kIHRydW5jYXRlZCB2ZWN0b3IgZWxlbWVudAorICAgICAgLy8gdmFyaWFudHMgd2l0aCBpQW55IHR5cGVzOyBvdGhlcndpc2UsIGlmIHRoZSBpbnRyaW5zaWMgaXMgbm90CisgICAgICAvLyBvdmVybG9hZGVkLCBhbGwgdGhlIHR5cGVzIGNhbiBiZSBzcGVjaWZpZWQgZGlyZWN0bHkuCisgICAgICBhc3NlcnQoKCghVHlFbC0+aXNTdWJDbGFzc09mKCJMTFZNRXh0ZW5kZWRFbGVtZW50VmVjdG9yVHlwZSIpICYmCisgICAgICAgICAgICAgICAhVHlFbC0+aXNTdWJDbGFzc09mKCJMTFZNVHJ1bmNhdGVkRWxlbWVudFZlY3RvclR5cGUiKSkgfHwKKyAgICAgICAgICAgICAgVlQgPT0gTVZUOjppQW55IHx8IFZUID09IE1WVDo6dkFueSkgJiYKKyAgICAgICAgICAgICAiRXhwZWN0ZWQgaUFueSBvciB2QW55IHR5cGUiKTsKKyAgICB9IGVsc2UKKyAgICAgIFZUID0gZ2V0VmFsdWVUeXBlKFR5RWwtPmdldFZhbHVlQXNEZWYoIlZUIikpOworICAgIAorICAgIGlmIChFVlQoVlQpLmlzT3ZlcmxvYWRlZCgpKSB7CisgICAgICBPdmVybG9hZGVkVlRzLnB1c2hfYmFjayhWVCk7CisgICAgICBpc092ZXJsb2FkZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvLyBSZWplY3QgaW52YWxpZCB0eXBlcy4KKyAgICBpZiAoVlQgPT0gTVZUOjppc1ZvaWQgJiYgaSAhPSBlLTEgLyp2b2lkIGF0IGVuZCBtZWFucyB2YXJhcmdzKi8pCisgICAgICB0aHJvdyAiSW50cmluc2ljICciICsgRGVmTmFtZSArICIgaGFzIHZvaWQgaW4gcmVzdWx0IHR5cGUgbGlzdCEiOworICAgIAorICAgIElTLlBhcmFtVlRzLnB1c2hfYmFjayhWVCk7CisgICAgSVMuUGFyYW1UeXBlRGVmcy5wdXNoX2JhY2soVHlFbCk7CisgIH0KKworICAvLyBQYXJzZSB0aGUgaW50cmluc2ljIHByb3BlcnRpZXMuCisgIExpc3RJbml0ICpQcm9wTGlzdCA9IFItPmdldFZhbHVlQXNMaXN0SW5pdCgiUHJvcGVydGllcyIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUHJvcExpc3QtPmdldFNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQgKlByb3BlcnR5ID0gUHJvcExpc3QtPmdldEVsZW1lbnRBc1JlY29yZChpKTsKKyAgICBhc3NlcnQoUHJvcGVydHktPmlzU3ViQ2xhc3NPZigiSW50cmluc2ljUHJvcGVydHkiKSAmJgorICAgICAgICAgICAiRXhwZWN0ZWQgYSBwcm9wZXJ0eSEiKTsKKyAgICAKKyAgICBpZiAoUHJvcGVydHktPmdldE5hbWUoKSA9PSAiSW50ck5vTWVtIikKKyAgICAgIE1vZFJlZiA9IE5vTWVtOworICAgIGVsc2UgaWYgKFByb3BlcnR5LT5nZXROYW1lKCkgPT0gIkludHJSZWFkQXJnTWVtIikKKyAgICAgIE1vZFJlZiA9IFJlYWRBcmdNZW07CisgICAgZWxzZSBpZiAoUHJvcGVydHktPmdldE5hbWUoKSA9PSAiSW50clJlYWRNZW0iKQorICAgICAgTW9kUmVmID0gUmVhZE1lbTsKKyAgICBlbHNlIGlmIChQcm9wZXJ0eS0+Z2V0TmFtZSgpID09ICJJbnRyUmVhZFdyaXRlQXJnTWVtIikKKyAgICAgIE1vZFJlZiA9IFJlYWRXcml0ZUFyZ01lbTsKKyAgICBlbHNlIGlmIChQcm9wZXJ0eS0+Z2V0TmFtZSgpID09ICJDb21tdXRhdGl2ZSIpCisgICAgICBpc0NvbW11dGF0aXZlID0gdHJ1ZTsKKyAgICBlbHNlIGlmIChQcm9wZXJ0eS0+aXNTdWJDbGFzc09mKCJOb0NhcHR1cmUiKSkgeworICAgICAgdW5zaWduZWQgQXJnTm8gPSBQcm9wZXJ0eS0+Z2V0VmFsdWVBc0ludCgiQXJnTm8iKTsKKyAgICAgIEFyZ3VtZW50QXR0cmlidXRlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQXJnTm8sIE5vQ2FwdHVyZSkpOworICAgIH0gZWxzZQorICAgICAgYXNzZXJ0KDAgJiYgIlVua25vd24gcHJvcGVydHkhIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5UYXJnZXQuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0NvZGVHZW5UYXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjA2YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vQ29kZUdlblRhcmdldC5oCkBAIC0wLDAgKzEsMjYyIEBACisvLz09PS0gQ29kZUdlblRhcmdldC5oIC0gVGFyZ2V0IENsYXNzIFdyYXBwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHdyYXBwZXJzIGZvciB0aGUgVGFyZ2V0IGNsYXNzIGFuZCByZWxhdGVkIGdsb2JhbAorLy8gZnVuY3Rpb25hbGl0eS4gIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGFjY2VzcyB0aGUgZGF0YSBhbmQgcHJvdmlkZXMgYSBzaW5nbGUKKy8vIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hlY2sgaXQgZm9yIHZhbGlkaXR5LiAgQWxsIG9mIHRoZXNlIGNsYXNzZXMgdGhyb3cKKy8vIGV4Y2VwdGlvbnMgb24gZXJyb3IgY29uZGl0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENPREVHRU5fVEFSR0VUX0gKKyNkZWZpbmUgQ09ERUdFTl9UQVJHRVRfSAorCisjaW5jbHVkZSAiQ29kZUdlblJlZ2lzdGVycy5oIgorI2luY2x1ZGUgIkNvZGVHZW5JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgIlJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgQ29kZUdlblJlZ2lzdGVyOworY2xhc3MgQ29kZUdlblRhcmdldDsKKworLy8gU2VsZWN0aW9uREFHIG5vZGUgcHJvcGVydGllcy4KKy8vICBTRE5QTWVtT3BlcmFuZDogaW5kaWNhdGVzIHRoYXQgYSBub2RlIHRvdWNoZXMgbWVtb3J5IGFuZCB0aGVyZWZvcmUgbXVzdAorLy8gICAgICAgICAgICAgICAgICBoYXZlIGFuIGFzc29jaWF0ZWQgbWVtb3J5IG9wZXJhbmQgdGhhdCBkZXNjcmliZXMgdGhlIGFjY2Vzcy4KK2VudW0gU0ROUCB7CisgIFNETlBDb21tdXRhdGl2ZSwgCisgIFNETlBBc3NvY2lhdGl2ZSwgCisgIFNETlBIYXNDaGFpbiwKKyAgU0ROUE91dEZsYWcsCisgIFNETlBJbkZsYWcsCisgIFNETlBPcHRJbkZsYWcsCisgIFNETlBNYXlMb2FkLAorICBTRE5QTWF5U3RvcmUsCisgIFNETlBTaWRlRWZmZWN0LAorICBTRE5QTWVtT3BlcmFuZCwKKyAgU0ROUFZhcmlhZGljCit9OworCisvLy8gZ2V0VmFsdWVUeXBlIC0gUmV0dXJuIHRoZSBNVlQ6OlNpbXBsZVZhbHVlVHlwZSB0aGF0IHRoZSBzcGVjaWZpZWQgVGFibGVHZW4KKy8vLyByZWNvcmQgY29ycmVzcG9uZHMgdG8uCitNVlQ6OlNpbXBsZVZhbHVlVHlwZSBnZXRWYWx1ZVR5cGUoUmVjb3JkICpSZWMpOworCitzdGQ6OnN0cmluZyBnZXROYW1lKE1WVDo6U2ltcGxlVmFsdWVUeXBlIFQpOworc3RkOjpzdHJpbmcgZ2V0RW51bU5hbWUoTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVCk7CisKKy8vLyBnZXRRdWFsaWZpZWROYW1lIC0gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgcmVjb3JkLCB3aXRoIGEKKy8vLyBuYW1lc3BhY2UgcXVhbGlmaWVyIGlmIHRoZSByZWNvcmQgY29udGFpbnMgb25lLgorc3RkOjpzdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShjb25zdCBSZWNvcmQgKlIpOworICAKKy8vLyBDb2RlR2VuVGFyZ2V0IC0gVGhpcyBjbGFzcyBjb3JyZXNwb25kcyB0byB0aGUgVGFyZ2V0IGNsYXNzIGluIHRoZSAudGQgZmlsZXMuCisvLy8KK2NsYXNzIENvZGVHZW5UYXJnZXQgeworICBSZWNvcmQgKlRhcmdldFJlYzsKKworICBtdXRhYmxlIERlbnNlTWFwPGNvbnN0IFJlY29yZCosIENvZGVHZW5JbnN0cnVjdGlvbio+IEluc3RydWN0aW9uczsKKyAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxDb2RlR2VuUmVnaXN0ZXI+IFJlZ2lzdGVyczsKKyAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBTdWJSZWdJbmRpY2VzOworICBtdXRhYmxlIHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3RlckNsYXNzPiBSZWdpc3RlckNsYXNzZXM7CisgIG11dGFibGUgc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+IExlZ2FsVmFsdWVUeXBlczsKKyAgdm9pZCBSZWFkUmVnaXN0ZXJzKCkgY29uc3Q7CisgIHZvaWQgUmVhZFN1YlJlZ0luZGljZXMoKSBjb25zdDsKKyAgdm9pZCBSZWFkUmVnaXN0ZXJDbGFzc2VzKCkgY29uc3Q7CisgIHZvaWQgUmVhZEluc3RydWN0aW9ucygpIGNvbnN0OworICB2b2lkIFJlYWRMZWdhbFZhbHVlVHlwZXMoKSBjb25zdDsKKyAgCisgIG11dGFibGUgc3RkOjp2ZWN0b3I8Y29uc3QgQ29kZUdlbkluc3RydWN0aW9uKj4gSW5zdHJzQnlFbnVtOworcHVibGljOgorICBDb2RlR2VuVGFyZ2V0KCk7CisKKyAgUmVjb3JkICpnZXRUYXJnZXRSZWNvcmQoKSBjb25zdCB7IHJldHVybiBUYXJnZXRSZWM7IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdDsKKworICAvLy8gZ2V0SW5zdE5hbWVzcGFjZSAtIFJldHVybiB0aGUgdGFyZ2V0LXNwZWNpZmljIGluc3RydWN0aW9uIG5hbWVzcGFjZS4KKyAgLy8vCisgIHN0ZDo6c3RyaW5nIGdldEluc3ROYW1lc3BhY2UoKSBjb25zdDsKKworICAvLy8gZ2V0SW5zdHJ1Y3Rpb25TZXQgLSBSZXR1cm4gdGhlIEluc3RydWN0aW9uU2V0IG9iamVjdC4KKyAgLy8vCisgIFJlY29yZCAqZ2V0SW5zdHJ1Y3Rpb25TZXQoKSBjb25zdDsKKworICAvLy8gZ2V0QXNtUGFyc2VyIC0gUmV0dXJuIHRoZSBBc3NlbWJseVBhcnNlciBkZWZpbml0aW9uIGZvciB0aGlzIHRhcmdldC4KKyAgLy8vCisgIFJlY29yZCAqZ2V0QXNtUGFyc2VyKCkgY29uc3Q7CisKKyAgLy8vIGdldEFzbVdyaXRlciAtIFJldHVybiB0aGUgQXNzZW1ibHlXcml0ZXIgZGVmaW5pdGlvbiBmb3IgdGhpcyB0YXJnZXQuCisgIC8vLworICBSZWNvcmQgKmdldEFzbVdyaXRlcigpIGNvbnN0OworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3Rlcj4gJmdldFJlZ2lzdGVycygpIGNvbnN0IHsKKyAgICBpZiAoUmVnaXN0ZXJzLmVtcHR5KCkpIFJlYWRSZWdpc3RlcnMoKTsKKyAgICByZXR1cm4gUmVnaXN0ZXJzOworICB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJmdldFN1YlJlZ0luZGljZXMoKSBjb25zdCB7CisgICAgaWYgKFN1YlJlZ0luZGljZXMuZW1wdHkoKSkgUmVhZFN1YlJlZ0luZGljZXMoKTsKKyAgICByZXR1cm4gU3ViUmVnSW5kaWNlczsKKyAgfQorCisgIC8vIE1hcCBhIFN1YlJlZ0luZGV4IFJlY29yZCB0byBpdHMgbnVtYmVyLgorICB1bnNpZ25lZCBnZXRTdWJSZWdJbmRleE5vKFJlY29yZCAqaWR4KSBjb25zdCB7CisgICAgaWYgKFN1YlJlZ0luZGljZXMuZW1wdHkoKSkgUmVhZFN1YlJlZ0luZGljZXMoKTsKKyAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPjo6Y29uc3RfaXRlcmF0b3IgaSA9CisgICAgICBzdGQ6OmZpbmQoU3ViUmVnSW5kaWNlcy5iZWdpbigpLCBTdWJSZWdJbmRpY2VzLmVuZCgpLCBpZHgpOworICAgIGFzc2VydChpICE9IFN1YlJlZ0luZGljZXMuZW5kKCkgJiYgIk5vdCBhIFN1YlJlZ0luZGV4Iik7CisgICAgcmV0dXJuIChpIC0gU3ViUmVnSW5kaWNlcy5iZWdpbigpKSArIDE7CisgIH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxDb2RlR2VuUmVnaXN0ZXJDbGFzcz4gJmdldFJlZ2lzdGVyQ2xhc3NlcygpIGNvbnN0IHsKKyAgICBpZiAoUmVnaXN0ZXJDbGFzc2VzLmVtcHR5KCkpIFJlYWRSZWdpc3RlckNsYXNzZXMoKTsKKyAgICByZXR1cm4gUmVnaXN0ZXJDbGFzc2VzOworICB9CisKKyAgY29uc3QgQ29kZUdlblJlZ2lzdGVyQ2xhc3MgJmdldFJlZ2lzdGVyQ2xhc3MoUmVjb3JkICpSKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlblJlZ2lzdGVyQ2xhc3M+ICZSQyA9IGdldFJlZ2lzdGVyQ2xhc3NlcygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSQy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFJDW2ldLlRoZURlZiA9PSBSKQorICAgICAgICByZXR1cm4gUkNbaV07CisgICAgYXNzZXJ0KDAgJiYgIkRpZG4ndCBmaW5kIHRoZSByZWdpc3RlciBjbGFzcyIpOworICAgIGFib3J0KCk7CisgIH0KKyAgCisgIC8vLyBnZXRSZWdpc3RlckNsYXNzRm9yUmVnaXN0ZXIgLSBGaW5kIHRoZSByZWdpc3RlciBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZQorICAvLy8gc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyLiAgSWYgdGhlIHJlZ2lzdGVyIGlzIG5vdCBpbiBhIHJlZ2lzdGVyCisgIC8vLyBjbGFzcywgcmV0dXJuIG51bGwuIElmIHRoZSByZWdpc3RlciBpcyBpbiBtdWx0aXBsZSBjbGFzc2VzLCBhbmQgdGhlCisgIC8vLyBjbGFzc2VzIGhhdmUgYSBzdXBlcnNldC1zdWJzZXQgcmVsYXRpb25zaGlwIGFuZCB0aGUgc2FtZSBzZXQgb2YKKyAgLy8vIHR5cGVzLCByZXR1cm4gdGhlIHN1cGVyY2xhc3MuICBPdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICpnZXRSZWdpc3RlckNsYXNzRm9yUmVnaXN0ZXIoUmVjb3JkICpSKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlblJlZ2lzdGVyQ2xhc3M+ICZSQ3MgPSBnZXRSZWdpc3RlckNsYXNzZXMoKTsKKyAgICBjb25zdCBDb2RlR2VuUmVnaXN0ZXJDbGFzcyAqRm91bmRSQyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJDcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBDb2RlR2VuUmVnaXN0ZXJDbGFzcyAmUkMgPSBSZWdpc3RlckNsYXNzZXNbaV07CisgICAgICBmb3IgKHVuc2lnbmVkIGVpID0gMCwgZWUgPSBSQy5FbGVtZW50cy5zaXplKCk7IGVpICE9IGVlOyArK2VpKSB7CisgICAgICAgIGlmIChSICE9IFJDLkVsZW1lbnRzW2VpXSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBJZiBhIHJlZ2lzdGVyJ3MgY2xhc3NlcyBoYXZlIGRpZmZlcmVudCB0eXBlcywgcmV0dXJuIG51bGwuCisgICAgICAgIGlmIChGb3VuZFJDICYmIFJDLmdldFZhbHVlVHlwZXMoKSAhPSBGb3VuZFJDLT5nZXRWYWx1ZVR5cGVzKCkpCisgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVnaXN0ZXIsCisgICAgICAgIC8vIG1ha2UgYSBub3RlIG9mIGl0IGFuZCBnbyBvbiB0byB0aGUgbmV4dCBjbGFzcy4KKyAgICAgICAgaWYgKCFGb3VuZFJDKSB7CisgICAgICAgICAgRm91bmRSQyA9ICZSQzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFJlY29yZCAqPiBFbGVtZW50cyhSQy5FbGVtZW50cyk7CisgICAgICAgIHN0ZDo6dmVjdG9yPFJlY29yZCAqPiBGb3VuZEVsZW1lbnRzKEZvdW5kUkMtPkVsZW1lbnRzKTsKKyAgICAgICAgc3RkOjpzb3J0KEVsZW1lbnRzLmJlZ2luKCksIEVsZW1lbnRzLmVuZCgpKTsKKyAgICAgICAgc3RkOjpzb3J0KEZvdW5kRWxlbWVudHMuYmVnaW4oKSwgRm91bmRFbGVtZW50cy5lbmQoKSk7CisKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcmV2aW91c2x5IGZvdW5kIGNsYXNzIHRoYXQgY29udGFpbnMKKyAgICAgICAgLy8gdGhlIHJlZ2lzdGVyIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MuIElmIHNvLAorICAgICAgICAvLyBwcmVmZXIgdGhlIHN1cGVyY2xhc3MuCisgICAgICAgIGlmIChzdGQ6OmluY2x1ZGVzKEVsZW1lbnRzLmJlZ2luKCksIEVsZW1lbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGb3VuZEVsZW1lbnRzLmJlZ2luKCksIEZvdW5kRWxlbWVudHMuZW5kKCkpKSB7CisgICAgICAgICAgRm91bmRSQyA9ICZSQzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJldmlvdXNseSBmb3VuZCBjbGFzcyB0aGF0IGNvbnRhaW5zCisgICAgICAgIC8vIHRoZSByZWdpc3RlciBpcyBhIHN1cGVyY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MuIElmIHNvLAorICAgICAgICAvLyBwcmVmZXIgdGhlIHN1cGVyY2xhc3MuCisgICAgICAgIGlmIChzdGQ6OmluY2x1ZGVzKEZvdW5kRWxlbWVudHMuYmVnaW4oKSwgRm91bmRFbGVtZW50cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudHMuYmVnaW4oKSwgRWxlbWVudHMuZW5kKCkpKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIE11bHRpcGxlIGNsYXNzZXMsIGFuZCBuZWl0aGVyIGlzIGEgc3VwZXJjbGFzcyBvZiB0aGUgb3RoZXIuCisgICAgICAgIC8vIFJldHVybiBudWxsLgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZvdW5kUkM7CisgIH0KKworICAvLy8gZ2V0UmVnaXN0ZXJWVHMgLSBGaW5kIHRoZSB1bmlvbiBvZiBhbGwgcG9zc2libGUgU2ltcGxlVmFsdWVUeXBlcyBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgcGh5c2ljYWwgcmVnaXN0ZXIuCisgIHN0ZDo6dmVjdG9yPE1WVDo6U2ltcGxlVmFsdWVUeXBlPiBnZXRSZWdpc3RlclZUcyhSZWNvcmQgKlIpIGNvbnN0OworICAKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+ICZnZXRMZWdhbFZhbHVlVHlwZXMoKSBjb25zdCB7CisgICAgaWYgKExlZ2FsVmFsdWVUeXBlcy5lbXB0eSgpKSBSZWFkTGVnYWxWYWx1ZVR5cGVzKCk7CisgICAgcmV0dXJuIExlZ2FsVmFsdWVUeXBlczsKKyAgfQorICAKKyAgLy8vIGlzTGVnYWxWYWx1ZVR5cGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUgaXMgbmF0aXZlbHkKKyAgLy8vIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0IChpLmUuIHRoZXJlIGFyZSByZWdpc3RlcnMgdGhhdCBkaXJlY3RseSBob2xkIGl0KS4KKyAgYm9vbCBpc0xlZ2FsVmFsdWVUeXBlKE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+ICZMZWdhbFZUcyA9IGdldExlZ2FsVmFsdWVUeXBlcygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMZWdhbFZUcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKExlZ2FsVlRzW2ldID09IFZUKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7ICAgIAorICB9CisKK3ByaXZhdGU6CisgIERlbnNlTWFwPGNvbnN0IFJlY29yZCosIENvZGVHZW5JbnN0cnVjdGlvbio+ICZnZXRJbnN0cnVjdGlvbnMoKSBjb25zdCB7CisgICAgaWYgKEluc3RydWN0aW9ucy5lbXB0eSgpKSBSZWFkSW5zdHJ1Y3Rpb25zKCk7CisgICAgcmV0dXJuIEluc3RydWN0aW9uczsKKyAgfQorcHVibGljOgorICAKKyAgQ29kZUdlbkluc3RydWN0aW9uICZnZXRJbnN0cnVjdGlvbihjb25zdCBSZWNvcmQgKkluc3RSZWMpIGNvbnN0IHsKKyAgICBpZiAoSW5zdHJ1Y3Rpb25zLmVtcHR5KCkpIFJlYWRJbnN0cnVjdGlvbnMoKTsKKyAgICBEZW5zZU1hcDxjb25zdCBSZWNvcmQqLCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPjo6aXRlcmF0b3IgSSA9CisgICAgICBJbnN0cnVjdGlvbnMuZmluZChJbnN0UmVjKTsKKyAgICBhc3NlcnQoSSAhPSBJbnN0cnVjdGlvbnMuZW5kKCkgJiYgIk5vdCBhbiBpbnN0cnVjdGlvbiIpOworICAgIHJldHVybiAqSS0+c2Vjb25kOworICB9CisKKyAgLy8vIGdldEluc3RydWN0aW9uc0J5RW51bVZhbHVlIC0gUmV0dXJuIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGRlZmluZWQgYnkgdGhlCisgIC8vLyB0YXJnZXQsIG9yZGVyZWQgYnkgdGhlaXIgZW51bSB2YWx1ZS4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQ29kZUdlbkluc3RydWN0aW9uKj4gJgorICBnZXRJbnN0cnVjdGlvbnNCeUVudW1WYWx1ZSgpIGNvbnN0IHsKKyAgICBpZiAoSW5zdHJzQnlFbnVtLmVtcHR5KCkpIENvbXB1dGVJbnN0cnNCeUVudW0oKTsKKyAgICByZXR1cm4gSW5zdHJzQnlFbnVtOworICB9CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgaW5zdF9pdGVyYXRvcjsKKyAgaW5zdF9pdGVyYXRvciBpbnN0X2JlZ2luKCkgY29uc3R7cmV0dXJuIGdldEluc3RydWN0aW9uc0J5RW51bVZhbHVlKCkuYmVnaW4oKTt9CisgIGluc3RfaXRlcmF0b3IgaW5zdF9lbmQoKSBjb25zdCB7IHJldHVybiBnZXRJbnN0cnVjdGlvbnNCeUVudW1WYWx1ZSgpLmVuZCgpOyB9CisgIAorICAKKyAgLy8vIGlzTGl0dGxlRW5kaWFuRW5jb2RpbmcgLSBhcmUgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zIGRlZmluZWQgYXMgIFswLi5uXT8KKyAgLy8vCisgIGJvb2wgaXNMaXR0bGVFbmRpYW5FbmNvZGluZygpIGNvbnN0OworICAKK3ByaXZhdGU6CisgIHZvaWQgQ29tcHV0ZUluc3Ryc0J5RW51bSgpIGNvbnN0OworfTsKKworLy8vIENvbXBsZXhQYXR0ZXJuIC0gQ29tcGxleFBhdHRlcm4gaW5mbywgY29ycmVzcG9uZGluZyB0byB0aGUgQ29tcGxleFBhdHRlcm4KKy8vLyB0YWJsZWdlbiBjbGFzcyBpbiBUYXJnZXRTZWxlY3Rpb25EQUcudGQKK2NsYXNzIENvbXBsZXhQYXR0ZXJuIHsKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVHk7CisgIHVuc2lnbmVkIE51bU9wZXJhbmRzOworICBzdGQ6OnN0cmluZyBTZWxlY3RGdW5jOworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBSb290Tm9kZXM7CisgIHVuc2lnbmVkIFByb3BlcnRpZXM7IC8vIE5vZGUgcHJvcGVydGllcworcHVibGljOgorICBDb21wbGV4UGF0dGVybigpIDogTnVtT3BlcmFuZHMoMCkge30KKyAgQ29tcGxleFBhdHRlcm4oUmVjb3JkICpSKTsKKworICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCB7IHJldHVybiBUeTsgfQorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wZXJhbmRzOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRTZWxlY3RGdW5jKCkgY29uc3QgeyByZXR1cm4gU2VsZWN0RnVuYzsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmZ2V0Um9vdE5vZGVzKCkgY29uc3QgeworICAgIHJldHVybiBSb290Tm9kZXM7CisgIH0KKyAgYm9vbCBoYXNQcm9wZXJ0eShlbnVtIFNETlAgUHJvcCkgY29uc3QgeyByZXR1cm4gUHJvcGVydGllcyAmICgxIDw8IFByb3ApOyB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0RBR0lTZWxFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0RBR0lTZWxFbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM3NzEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vREFHSVNlbEVtaXR0ZXIuY3BwCkBAIC0wLDAgKzEsMjAzIEBACisvLz09PS0gREFHSVNlbEVtaXR0ZXIuY3BwIC0gR2VuZXJhdGUgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgdGFibGVnZW4gYmFja2VuZCBlbWl0cyBhIERBRyBpbnN0cnVjdGlvbiBzZWxlY3Rvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiREFHSVNlbEVtaXR0ZXIuaCIKKyNpbmNsdWRlICJEQUdJU2VsTWF0Y2hlci5oIgorI2luY2x1ZGUgIlJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEQUdJU2VsRW1pdHRlciBIZWxwZXIgbWV0aG9kcworLy8KKworLy8vIGdldFJlc3VsdFBhdHRlcm5Db3N0IC0gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBmb3IgdGhpcyBwYXR0ZXJuLgorLy8vIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjay4gIFdlIHNob3VsZCByZWFsbHkgaW5jbHVkZSB0aGUgaW5zdHJ1Y3Rpb24KKy8vLyBsYXRlbmNpZXMgaW4gdGhpcyBjYWxjdWxhdGlvbi4KK3N0YXRpYyB1bnNpZ25lZCBnZXRSZXN1bHRQYXR0ZXJuQ29zdChUcmVlUGF0dGVybk5vZGUgKlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkRBR1BhdHRlcm5zICZDR1ApIHsKKyAgaWYgKFAtPmlzTGVhZigpKSByZXR1cm4gMDsKKyAgCisgIHVuc2lnbmVkIENvc3QgPSAwOworICBSZWNvcmQgKk9wID0gUC0+Z2V0T3BlcmF0b3IoKTsKKyAgaWYgKE9wLT5pc1N1YkNsYXNzT2YoIkluc3RydWN0aW9uIikpIHsKKyAgICBDb3N0Kys7CisgICAgQ29kZUdlbkluc3RydWN0aW9uICZJSSA9IENHUC5nZXRUYXJnZXRJbmZvKCkuZ2V0SW5zdHJ1Y3Rpb24oT3ApOworICAgIGlmIChJSS51c2VzQ3VzdG9tSW5zZXJ0ZXIpCisgICAgICBDb3N0ICs9IDEwOworICB9CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQLT5nZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkKKyAgICBDb3N0ICs9IGdldFJlc3VsdFBhdHRlcm5Db3N0KFAtPmdldENoaWxkKGkpLCBDR1ApOworICByZXR1cm4gQ29zdDsKK30KKworLy8vIGdldFJlc3VsdFBhdHRlcm5Db2RlU2l6ZSAtIENvbXB1dGUgdGhlIGNvZGUgc2l6ZSBvZiBpbnN0cnVjdGlvbnMgZm9yIHRoaXMKKy8vLyBwYXR0ZXJuLgorc3RhdGljIHVuc2lnbmVkIGdldFJlc3VsdFBhdHRlcm5TaXplKFRyZWVQYXR0ZXJuTm9kZSAqUCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkRBR1BhdHRlcm5zICZDR1ApIHsKKyAgaWYgKFAtPmlzTGVhZigpKSByZXR1cm4gMDsKKworICB1bnNpZ25lZCBDb3N0ID0gMDsKKyAgUmVjb3JkICpPcCA9IFAtPmdldE9wZXJhdG9yKCk7CisgIGlmIChPcC0+aXNTdWJDbGFzc09mKCJJbnN0cnVjdGlvbiIpKSB7CisgICAgQ29zdCArPSBPcC0+Z2V0VmFsdWVBc0ludCgiQ29kZVNpemUiKTsKKyAgfQorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUC0+Z2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2kpCisgICAgQ29zdCArPSBnZXRSZXN1bHRQYXR0ZXJuU2l6ZShQLT5nZXRDaGlsZChpKSwgQ0dQKTsKKyAgcmV0dXJuIENvc3Q7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcmVkaWNhdGUgZW1pdHRlciBpbXBsZW1lbnRhdGlvbi4KKy8vCisKK3ZvaWQgREFHSVNlbEVtaXR0ZXI6OkVtaXRQcmVkaWNhdGVGdW5jdGlvbnMocmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICJcbi8vIFByZWRpY2F0ZSBmdW5jdGlvbnMuXG4iOworCisgIC8vIFdhbGsgdGhlIHBhdHRlcm4gZnJhZ21lbnRzLCBhZGRpbmcgdGhlbSB0byBhIG1hcCwgd2hpY2ggc29ydHMgdGhlbSBieQorICAvLyBuYW1lLgorICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnBhaXI8UmVjb3JkKiwgVHJlZVBhdHRlcm4qPiA+IFBGc0J5TmFtZVR5OworICBQRnNCeU5hbWVUeSBQRnNCeU5hbWU7CisKKyAgZm9yIChDb2RlR2VuREFHUGF0dGVybnM6OnBmX2l0ZXJhdG9yIEkgPSBDR1AucGZfYmVnaW4oKSwgRSA9IENHUC5wZl9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBQRnNCeU5hbWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEktPmZpcnN0LT5nZXROYW1lKCksICpJKSk7CisKKyAgCisgIGZvciAoUEZzQnlOYW1lVHk6Oml0ZXJhdG9yIEkgPSBQRnNCeU5hbWUuYmVnaW4oKSwgRSA9IFBGc0J5TmFtZS5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIFJlY29yZCAqUGF0RnJhZ1JlY29yZCA9IEktPnNlY29uZC5maXJzdDsvLyBSZWNvcmQgdGhhdCBkZXJpdmVzIGZyb20gUGF0RnJhZy4KKyAgICBUcmVlUGF0dGVybiAqUCA9IEktPnNlY29uZC5zZWNvbmQ7CisgICAgCisgICAgLy8gSWYgdGhlcmUgaXMgYSBjb2RlIGluaXQgZm9yIHRoaXMgZnJhZ21lbnQsIGVtaXQgdGhlIHByZWRpY2F0ZSBjb2RlLgorICAgIHN0ZDo6c3RyaW5nIENvZGUgPSBQYXRGcmFnUmVjb3JkLT5nZXRWYWx1ZUFzQ29kZSgiUHJlZGljYXRlIik7CisgICAgaWYgKENvZGUuZW1wdHkoKSkgY29udGludWU7CisgICAgCisgICAgaWYgKFAtPmdldE9ubHlUcmVlKCktPmlzTGVhZigpKQorICAgICAgT1MgPDwgImlubGluZSBib29sIFByZWRpY2F0ZV8iIDw8IFBhdEZyYWdSZWNvcmQtPmdldE5hbWUoKQorICAgICAgPDwgIihTRE5vZGUgKk4pIGNvbnN0IHtcbiI7CisgICAgZWxzZSB7CisgICAgICBzdGQ6OnN0cmluZyBDbGFzc05hbWUgPQorICAgICAgICBDR1AuZ2V0U0ROb2RlSW5mbyhQLT5nZXRPbmx5VHJlZSgpLT5nZXRPcGVyYXRvcigpKS5nZXRTRENsYXNzTmFtZSgpOworICAgICAgY29uc3QgY2hhciAqQzIgPSBDbGFzc05hbWUgPT0gIlNETm9kZSIgPyAiTiIgOiAiaW5OIjsKKyAgICAgIAorICAgICAgT1MgPDwgImlubGluZSBib29sIFByZWRpY2F0ZV8iIDw8IFBhdEZyYWdSZWNvcmQtPmdldE5hbWUoKQorICAgICAgICAgPDwgIihTRE5vZGUgKiIgPDwgQzIgPDwgIikgY29uc3Qge1xuIjsKKyAgICAgIGlmIChDbGFzc05hbWUgIT0gIlNETm9kZSIpCisgICAgICAgIE9TIDw8ICIgICIgPDwgQ2xhc3NOYW1lIDw8ICIgKk4gPSBjYXN0PCIgPDwgQ2xhc3NOYW1lIDw8ICI+KGluTik7XG4iOworICAgIH0KKyAgICBPUyA8PCBDb2RlIDw8ICJcbn1cbiI7CisgIH0KKyAgCisgIE9TIDw8ICJcblxuIjsKK30KKworbmFtZXNwYWNlIHsKKy8vIFBhdHRlcm5Tb3J0aW5nUHJlZGljYXRlIC0gcmV0dXJuIHRydWUgaWYgd2UgcHJlZmVyIHRvIG1hdGNoIExIUyBiZWZvcmUgUkhTLgorLy8gSW4gcGFydGljdWxhciwgd2Ugd2FudCB0byBtYXRjaCBtYXhpbWFsIHBhdHRlcm5zIGZpcnN0IGFuZCBsb3dlc3QgY29zdCB3aXRoaW4KKy8vIGEgcGFydGljdWxhciBjb21wbGV4aXR5IGZpcnN0Lgorc3RydWN0IFBhdHRlcm5Tb3J0aW5nUHJlZGljYXRlIHsKKyAgUGF0dGVyblNvcnRpbmdQcmVkaWNhdGUoQ29kZUdlbkRBR1BhdHRlcm5zICZjZ3ApIDogQ0dQKGNncCkge30KKyAgQ29kZUdlbkRBR1BhdHRlcm5zICZDR1A7CisgIAorICBib29sIG9wZXJhdG9yKCkoY29uc3QgUGF0dGVyblRvTWF0Y2ggKkxIUywgY29uc3QgUGF0dGVyblRvTWF0Y2ggKlJIUykgeworICAgIGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTEhTU3JjID0gTEhTLT5nZXRTcmNQYXR0ZXJuKCk7CisgICAgY29uc3QgVHJlZVBhdHRlcm5Ob2RlICpSSFNTcmMgPSBSSFMtPmdldFNyY1BhdHRlcm4oKTsKKyAgICAKKyAgICBpZiAoTEhTU3JjLT5nZXROdW1UeXBlcygpICE9IDAgJiYgUkhTU3JjLT5nZXROdW1UeXBlcygpICE9IDAgJiYKKyAgICAgICAgTEhTU3JjLT5nZXRUeXBlKDApICE9IFJIU1NyYy0+Z2V0VHlwZSgwKSkgeworICAgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVjEgPSBMSFNTcmMtPmdldFR5cGUoMCksIFYyID0gUkhTU3JjLT5nZXRUeXBlKDApOworICAgICAgaWYgKE1WVChWMSkuaXNWZWN0b3IoKSAhPSBNVlQoVjIpLmlzVmVjdG9yKCkpCisgICAgICAgIHJldHVybiBNVlQoVjIpLmlzVmVjdG9yKCk7CisgICAgICAKKyAgICAgIGlmIChNVlQoVjEpLmlzRmxvYXRpbmdQb2ludCgpICE9IE1WVChWMikuaXNGbG9hdGluZ1BvaW50KCkpCisgICAgICAgIHJldHVybiBNVlQoVjIpLmlzRmxvYXRpbmdQb2ludCgpOworICAgIH0KKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBwYXR0ZXJucyBtaWdodCBib3RoIG1hdGNoLCBzb3J0IGJhc2VkIG9uIGNvbXBsZXhpdHksCisgICAgLy8gd2hpY2ggbWVhbnMgdGhhdCB3ZSBwcmVmZXIgdG8gbWF0Y2ggcGF0dGVybnMgdGhhdCBjb3ZlciBtb3JlIG5vZGVzIGluIHRoZQorICAgIC8vIGlucHV0IG92ZXIgbm9kZXMgdGhhdCBjb3ZlciBmZXdlci4KKyAgICB1bnNpZ25lZCBMSFNTaXplID0gTEhTLT5nZXRQYXR0ZXJuQ29tcGxleGl0eShDR1ApOworICAgIHVuc2lnbmVkIFJIU1NpemUgPSBSSFMtPmdldFBhdHRlcm5Db21wbGV4aXR5KENHUCk7CisgICAgaWYgKExIU1NpemUgPiBSSFNTaXplKSByZXR1cm4gdHJ1ZTsgICAvLyBMSFMgLT4gYmlnZ2VyIC0+IGxlc3MgY29zdAorICAgIGlmIChMSFNTaXplIDwgUkhTU2l6ZSkgcmV0dXJuIGZhbHNlOworICAgIAorICAgIC8vIElmIHRoZSBwYXR0ZXJucyBoYXZlIGVxdWFsIGNvbXBsZXhpdHksIGNvbXBhcmUgZ2VuZXJhdGVkIGluc3RydWN0aW9uIGNvc3QKKyAgICB1bnNpZ25lZCBMSFNDb3N0ID0gZ2V0UmVzdWx0UGF0dGVybkNvc3QoTEhTLT5nZXREc3RQYXR0ZXJuKCksIENHUCk7CisgICAgdW5zaWduZWQgUkhTQ29zdCA9IGdldFJlc3VsdFBhdHRlcm5Db3N0KFJIUy0+Z2V0RHN0UGF0dGVybigpLCBDR1ApOworICAgIGlmIChMSFNDb3N0IDwgUkhTQ29zdCkgcmV0dXJuIHRydWU7CisgICAgaWYgKExIU0Nvc3QgPiBSSFNDb3N0KSByZXR1cm4gZmFsc2U7CisgICAgCisgICAgdW5zaWduZWQgTEhTUGF0U2l6ZSA9IGdldFJlc3VsdFBhdHRlcm5TaXplKExIUy0+Z2V0RHN0UGF0dGVybigpLCBDR1ApOworICAgIHVuc2lnbmVkIFJIU1BhdFNpemUgPSBnZXRSZXN1bHRQYXR0ZXJuU2l6ZShSSFMtPmdldERzdFBhdHRlcm4oKSwgQ0dQKTsKKyAgICBpZiAoTEhTUGF0U2l6ZSA8IFJIU1BhdFNpemUpIHJldHVybiB0cnVlOworICAgIGlmIChMSFNQYXRTaXplID4gUkhTUGF0U2l6ZSkgcmV0dXJuIGZhbHNlOworICAgIAorICAgIC8vIFNvcnQgYmFzZWQgb24gdGhlIFVJRCBvZiB0aGUgcGF0dGVybiwgZ2l2aW5nIHVzIGEgZGV0ZXJtaW5pc3RpYyBvcmRlcmluZworICAgIC8vIGlmIGFsbCBvdGhlciBzb3J0aW5nIGNvbmRpdGlvbnMgZmFpbC4KKyAgICBhc3NlcnQoTEhTID09IFJIUyB8fCBMSFMtPklEICE9IFJIUy0+SUQpOworICAgIHJldHVybiBMSFMtPklEIDwgUkhTLT5JRDsKKyAgfQorfTsKK30KKworCit2b2lkIERBR0lTZWxFbWl0dGVyOjpydW4ocmF3X29zdHJlYW0gJk9TKSB7CisgIEVtaXRTb3VyY2VGaWxlSGVhZGVyKCJEQUcgSW5zdHJ1Y3Rpb24gU2VsZWN0b3IgZm9yIHRoZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgQ0dQLmdldFRhcmdldEluZm8oKS5nZXROYW1lKCkgKyAiIHRhcmdldCIsIE9TKTsKKyAgCisgIE9TIDw8ICIvLyAqKiogTk9URTogVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBpbnRvIHRoZSBtaWRkbGUgb2YgdGhlIHRhcmdldFxuIgorICAgICA8PCAiLy8gKioqIGluc3RydWN0aW9uIHNlbGVjdG9yIGNsYXNzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSByZWFsbHkgIgorICAgICA8PCAibWV0aG9kcy5cblxuIjsKKworICBERUJVRyhlcnJzKCkgPDwgIlxuXG5BTEwgUEFUVEVSTlMgVE8gTUFUQ0g6XG5cbiI7CisgICAgICAgIGZvciAoQ29kZUdlbkRBR1BhdHRlcm5zOjpwdG1faXRlcmF0b3IgSSA9IENHUC5wdG1fYmVnaW4oKSwKKyAgICAgICAgICAgICBFID0gQ0dQLnB0bV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgICBlcnJzKCkgPDwgIlBBVFRFUk46ICI7ICAgSS0+Z2V0U3JjUGF0dGVybigpLT5kdW1wKCk7CisgICAgICAgICAgZXJycygpIDw8ICJcblJFU1VMVDogICI7IEktPmdldERzdFBhdHRlcm4oKS0+ZHVtcCgpOworICAgICAgICAgIGVycnMoKSA8PCAiXG4iOworICAgICAgICB9KTsKKworICAvLyBGSVhNRTogVGhlc2UgYXJlIGJlaW5nIHVzZWQgYnkgaGFuZCB3cml0dGVuIGNvZGUsIGdyb3NzLgorICBFbWl0UHJlZGljYXRlRnVuY3Rpb25zKE9TKTsKKworICAvLyBBZGQgYWxsIHRoZSBwYXR0ZXJucyB0byBhIHRlbXBvcmFyeSBsaXN0IHNvIHdlIGNhbiBzb3J0IHRoZW0uCisgIHN0ZDo6dmVjdG9yPGNvbnN0IFBhdHRlcm5Ub01hdGNoKj4gUGF0dGVybnM7CisgIGZvciAoQ29kZUdlbkRBR1BhdHRlcm5zOjpwdG1faXRlcmF0b3IgSSA9IENHUC5wdG1fYmVnaW4oKSwgRSA9IENHUC5wdG1fZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgUGF0dGVybnMucHVzaF9iYWNrKCYqSSk7CisKKyAgLy8gV2Ugd2FudCB0byBwcm9jZXNzIHRoZSBtYXRjaGVzIGluIG9yZGVyIG9mIG1pbmltYWwgY29zdC4gIFNvcnQgdGhlIHBhdHRlcm5zCisgIC8vIHNvIHRoZSBsZWFzdCBjb3N0IG9uZSBpcyBhdCB0aGUgc3RhcnQuCisgIHN0ZDo6c29ydChQYXR0ZXJucy5iZWdpbigpLCBQYXR0ZXJucy5lbmQoKSwgUGF0dGVyblNvcnRpbmdQcmVkaWNhdGUoQ0dQKSk7CisgIAorICAKKyAgLy8gQ29udmVydCBlYWNoIHZhcmlhbnQgb2YgZWFjaCBwYXR0ZXJuIGludG8gYSBNYXRjaGVyLgorICBzdGQ6OnZlY3RvcjxNYXRjaGVyKj4gUGF0dGVybk1hdGNoZXJzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUGF0dGVybnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGZvciAodW5zaWduZWQgVmFyaWFudCA9IDA7IDsgKytWYXJpYW50KSB7CisgICAgICBpZiAoTWF0Y2hlciAqTSA9IENvbnZlcnRQYXR0ZXJuVG9NYXRjaGVyKCpQYXR0ZXJuc1tpXSwgVmFyaWFudCwgQ0dQKSkKKyAgICAgICAgUGF0dGVybk1hdGNoZXJzLnB1c2hfYmFjayhNKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICAgICAgICAgCisgIE1hdGNoZXIgKlRoZU1hdGNoZXIgPSBuZXcgU2NvcGVNYXRjaGVyKCZQYXR0ZXJuTWF0Y2hlcnNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm5NYXRjaGVycy5zaXplKCkpOworCisgIFRoZU1hdGNoZXIgPSBPcHRpbWl6ZU1hdGNoZXIoVGhlTWF0Y2hlciwgQ0dQKTsKKyAgLy9NYXRjaGVyLT5kdW1wKCk7CisgIEVtaXRNYXRjaGVyVGFibGUoVGhlTWF0Y2hlciwgQ0dQLCBPUyk7CisgIGRlbGV0ZSBUaGVNYXRjaGVyOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vREFHSVNlbEVtaXR0ZXIuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0RBR0lTZWxFbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmZGRlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0RBR0lTZWxFbWl0dGVyLmgKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tIERBR0lTZWxFbWl0dGVyLmggLSBHZW5lcmF0ZSBhbiBpbnN0cnVjdGlvbiBzZWxlY3RvciAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgZW1pdHMgYSBEQUcgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBEQUdJU0VMX0VNSVRURVJfSAorI2RlZmluZSBEQUdJU0VMX0VNSVRURVJfSAorCisjaW5jbHVkZSAiVGFibGVHZW5CYWNrZW5kLmgiCisjaW5jbHVkZSAiQ29kZUdlbkRBR1BhdHRlcm5zLmgiCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBEQUdJU2VsRW1pdHRlciAtIFRoZSB0b3AtbGV2ZWwgY2xhc3Mgd2hpY2ggY29vcmRpbmF0ZXMgY29uc3RydWN0aW9uCisvLy8gYW5kIGVtaXNzaW9uIG9mIHRoZSBpbnN0cnVjdGlvbiBzZWxlY3Rvci4KKy8vLworY2xhc3MgREFHSVNlbEVtaXR0ZXIgOiBwdWJsaWMgVGFibGVHZW5CYWNrZW5kIHsKKyAgUmVjb3JkS2VlcGVyICZSZWNvcmRzOworICBDb2RlR2VuREFHUGF0dGVybnMgQ0dQOworcHVibGljOgorICBleHBsaWNpdCBEQUdJU2VsRW1pdHRlcihSZWNvcmRLZWVwZXIgJlIpIDogUmVjb3JkcyhSKSwgQ0dQKFIpIHt9CisKKyAgLy8gcnVuIC0gT3V0cHV0IHRoZSBpc2VsLCByZXR1cm5pbmcgdHJ1ZSBvbiBmYWlsdXJlLgorICB2b2lkIHJ1bihyYXdfb3N0cmVhbSAmT1MpOworcHJpdmF0ZToKKyAgdm9pZCBFbWl0UHJlZGljYXRlRnVuY3Rpb25zKHJhd19vc3RyZWFtICZPUyk7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0RBR0lTZWxNYXRjaGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0RBR0lTZWxNYXRjaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjEyYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vREFHSVNlbE1hdGNoZXIuY3BwCkBAIC0wLDAgKzEsNDAxIEBACisvLz09PS0gREFHSVNlbE1hdGNoZXIuY3BwIC0gUmVwcmVzZW50YXRpb24gb2YgREFHIHBhdHRlcm4gbWF0Y2hlciAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiREFHSVNlbE1hdGNoZXIuaCIKKyNpbmNsdWRlICJDb2RlR2VuREFHUGF0dGVybnMuaCIKKyNpbmNsdWRlICJDb2RlR2VuVGFyZ2V0LmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKwordm9pZCBNYXRjaGVyOjpkdW1wKCkgY29uc3QgeworICBwcmludChlcnJzKCksIDApOworfQorCit2b2lkIE1hdGNoZXI6OnByaW50KHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdCB7CisgIHByaW50SW1wbChPUywgaW5kZW50KTsKKyAgaWYgKE5leHQpCisgICAgcmV0dXJuIE5leHQtPnByaW50KE9TLCBpbmRlbnQpOworfQorCit2b2lkIE1hdGNoZXI6OnByaW50T25lKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBwcmludEltcGwoT1MsIDApOworfQorCisvLy8gdW5saW5rTm9kZSAtIFVubGluayB0aGUgc3BlY2lmaWVkIG5vZGUgZnJvbSB0aGlzIGNoYWluLiAgSWYgT3RoZXIgPT0gdGhpcywKKy8vLyB3ZSB1bmxpbmsgdGhlIG5leHQgcG9pbnRlciBhbmQgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlIHdlIHVubGluayBPdGhlciBmcm9tCisvLy8gdGhlIGxpc3QgYW5kIHJldHVybiB0aGlzLgorTWF0Y2hlciAqTWF0Y2hlcjo6dW5saW5rTm9kZShNYXRjaGVyICpPdGhlcikgeworICBpZiAodGhpcyA9PSBPdGhlcikKKyAgICByZXR1cm4gdGFrZU5leHQoKTsKKyAKKyAgLy8gU2NhbiB1bnRpbCB3ZSBmaW5kIHRoZSBwcmVkZWNlc3NvciBvZiBPdGhlci4KKyAgTWF0Y2hlciAqQ3VyID0gdGhpczsKKyAgZm9yICg7IEN1ciAmJiBDdXItPmdldE5leHQoKSAhPSBPdGhlcjsgQ3VyID0gQ3VyLT5nZXROZXh0KCkpCisgICAgLyplbXB0eSovOworCisgIGlmIChDdXIgPT0gMCkgcmV0dXJuIDA7CisgIEN1ci0+dGFrZU5leHQoKTsKKyAgQ3VyLT5zZXROZXh0KE90aGVyLT50YWtlTmV4dCgpKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKKy8vLyBjYW5Nb3ZlQmVmb3JlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBtYXRjaGVyIGlzIHRoZSBzYW1lIGFzIE90aGVyLCBvciBpZgorLy8vIHdlIGNhbiBtb3ZlIHRoaXMgbWF0Y2hlciBwYXN0IGFsbCBvZiB0aGUgbm9kZXMgaW4tYmV0d2VlbiBPdGhlciBhbmQgdGhpcworLy8vIG5vZGUuICBPdGhlciBtdXN0IGJlIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGlzLgorYm9vbCBNYXRjaGVyOjpjYW5Nb3ZlQmVmb3JlKGNvbnN0IE1hdGNoZXIgKk90aGVyKSBjb25zdCB7CisgIGZvciAoOzsgT3RoZXIgPSBPdGhlci0+Z2V0TmV4dCgpKSB7CisgICAgYXNzZXJ0KE90aGVyICYmICJPdGhlciBkaWRuJ3QgY29tZSBiZWZvcmUgJ3RoaXMnPyIpOworICAgIGlmICh0aGlzID09IE90aGVyKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFdlIGhhdmUgdG8gYmUgYWJsZSB0byBtb3ZlIHRoaXMgbm9kZSBhY3Jvc3MgdGhlIE90aGVyIG5vZGUuCisgICAgaWYgKCFjYW5Nb3ZlQmVmb3JlTm9kZShPdGhlcikpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8vIGNhbk1vdmVCZWZvcmUgLSBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBzYWZlIHRvIG1vdmUgdGhlIGN1cnJlbnQgbWF0Y2hlcgorLy8vIGFjcm9zcyB0aGUgc3BlY2lmaWVkIG9uZS4KK2Jvb2wgTWF0Y2hlcjo6Y2FuTW92ZUJlZm9yZU5vZGUoY29uc3QgTWF0Y2hlciAqT3RoZXIpIGNvbnN0IHsKKyAgLy8gV2UgY2FuIG1vdmUgc2ltcGxlIHByZWRpY2F0ZXMgYmVmb3JlIHJlY29yZCBub2Rlcy4KKyAgaWYgKGlzU2ltcGxlUHJlZGljYXRlTm9kZSgpKQorICAgIHJldHVybiBPdGhlci0+aXNTaW1wbGVQcmVkaWNhdGVPclJlY29yZE5vZGUoKTsKKyAgCisgIC8vIFdlIGNhbiBtb3ZlIHJlY29yZCBub2RlcyBhY3Jvc3Mgc2ltcGxlIHByZWRpY2F0ZXMuCisgIGlmIChpc1NpbXBsZVByZWRpY2F0ZU9yUmVjb3JkTm9kZSgpKQorICAgIHJldHVybiBpc1NpbXBsZVByZWRpY2F0ZU5vZGUoKTsKKyAgCisgIC8vIFdlIGNhbid0IG1vdmUgcmVjb3JkIG5vZGVzIGFjcm9zcyBlYWNoIG90aGVyIGV0Yy4KKyAgcmV0dXJuIGZhbHNlOworfQorCisKK1Njb3BlTWF0Y2hlcjo6flNjb3BlTWF0Y2hlcigpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENoaWxkcmVuLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgZGVsZXRlIENoaWxkcmVuW2ldOworfQorCisKKy8vIHByaW50SW1wbCBtZXRob2RzLgorCit2b2lkIFNjb3BlTWF0Y2hlcjo6cHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdCB7CisgIE9TLmluZGVudChpbmRlbnQpIDw8ICJTY29wZVxuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKGdldENoaWxkKGkpID09IDApCisgICAgICBPUy5pbmRlbnQoaW5kZW50KzEpIDw8ICJOVUxMIFBPSU5URVJcbiI7CisgICAgZWxzZQorICAgICAgZ2V0Q2hpbGQoaSktPnByaW50KE9TLCBpbmRlbnQrMik7CisgIH0KK30KKwordm9pZCBSZWNvcmRNYXRjaGVyOjpwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0IHsKKyAgT1MuaW5kZW50KGluZGVudCkgPDwgIlJlY29yZFxuIjsKK30KKwordm9pZCBSZWNvcmRDaGlsZE1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiUmVjb3JkQ2hpbGQ6ICIgPDwgQ2hpbGRObyA8PCAnXG4nOworfQorCit2b2lkIFJlY29yZE1lbVJlZk1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiUmVjb3JkTWVtUmVmXG4iOworfQorCit2b2lkIENhcHR1cmVGbGFnSW5wdXRNYXRjaGVyOjpwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0eworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiQ2FwdHVyZUZsYWdJbnB1dFxuIjsKK30KKwordm9pZCBNb3ZlQ2hpbGRNYXRjaGVyOjpwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0IHsKKyAgT1MuaW5kZW50KGluZGVudCkgPDwgIk1vdmVDaGlsZCAiIDw8IENoaWxkTm8gPDwgJ1xuJzsKK30KKwordm9pZCBNb3ZlUGFyZW50TWF0Y2hlcjo6cHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdCB7CisgIE9TLmluZGVudChpbmRlbnQpIDw8ICJNb3ZlUGFyZW50XG4iOworfQorCit2b2lkIENoZWNrU2FtZU1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiQ2hlY2tTYW1lICIgPDwgTWF0Y2hOdW1iZXIgPDwgJ1xuJzsKK30KKwordm9pZCBDaGVja1BhdHRlcm5QcmVkaWNhdGVNYXRjaGVyOjoKK3ByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiQ2hlY2tQYXR0ZXJuUHJlZGljYXRlICIgPDwgUHJlZGljYXRlIDw8ICdcbic7Cit9CisKK3ZvaWQgQ2hlY2tQcmVkaWNhdGVNYXRjaGVyOjpwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0IHsKKyAgT1MuaW5kZW50KGluZGVudCkgPDwgIkNoZWNrUHJlZGljYXRlICIgPDwgUHJlZE5hbWUgPDwgJ1xuJzsKK30KKwordm9pZCBDaGVja09wY29kZU1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiQ2hlY2tPcGNvZGUgIiA8PCBPcGNvZGUuZ2V0RW51bU5hbWUoKSA8PCAnXG4nOworfQorCit2b2lkIFN3aXRjaE9wY29kZU1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiU3dpdGNoT3Bjb2RlOiB7XG4iOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ2FzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE9TLmluZGVudChpbmRlbnQpIDw8ICJjYXNlICIgPDwgQ2FzZXNbaV0uZmlyc3QtPmdldEVudW1OYW1lKCkgPDwgIjpcbiI7CisgICAgQ2FzZXNbaV0uc2Vjb25kLT5wcmludChPUywgaW5kZW50KzIpOworICB9CisgIE9TLmluZGVudChpbmRlbnQpIDw8ICJ9XG4iOworfQorCisKK3ZvaWQgQ2hlY2tUeXBlTWF0Y2hlcjo6cHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdCB7CisgIE9TLmluZGVudChpbmRlbnQpIDw8ICJDaGVja1R5cGUgIiA8PCBnZXRFbnVtTmFtZShUeXBlKSA8PCAiLCBSZXNObz0iCisgICAgPDwgUmVzTm8gPDwgJ1xuJzsKK30KKwordm9pZCBTd2l0Y2hUeXBlTWF0Y2hlcjo6cHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdCB7CisgIE9TLmluZGVudChpbmRlbnQpIDw8ICJTd2l0Y2hUeXBlOiB7XG4iOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ2FzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE9TLmluZGVudChpbmRlbnQpIDw8ICJjYXNlICIgPDwgZ2V0RW51bU5hbWUoQ2FzZXNbaV0uZmlyc3QpIDw8ICI6XG4iOworICAgIENhc2VzW2ldLnNlY29uZC0+cHJpbnQoT1MsIGluZGVudCsyKTsKKyAgfQorICBPUy5pbmRlbnQoaW5kZW50KSA8PCAifVxuIjsKK30KKwordm9pZCBDaGVja0NoaWxkVHlwZU1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiQ2hlY2tDaGlsZFR5cGUgIiA8PCBDaGlsZE5vIDw8ICIgIgorICAgIDw8IGdldEVudW1OYW1lKFR5cGUpIDw8ICdcbic7Cit9CisKKwordm9pZCBDaGVja0ludGVnZXJNYXRjaGVyOjpwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0IHsKKyAgT1MuaW5kZW50KGluZGVudCkgPDwgIkNoZWNrSW50ZWdlciAiIDw8IFZhbHVlIDw8ICdcbic7Cit9CisKK3ZvaWQgQ2hlY2tDb25kQ29kZU1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiQ2hlY2tDb25kQ29kZSBJU0Q6OiIgPDwgQ29uZENvZGVOYW1lIDw8ICdcbic7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1ZVR5cGVNYXRjaGVyOjpwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0IHsKKyAgT1MuaW5kZW50KGluZGVudCkgPDwgIkNoZWNrVmFsdWVUeXBlIE1WVDo6IiA8PCBUeXBlTmFtZSA8PCAnXG4nOworfQorCit2b2lkIENoZWNrQ29tcGxleFBhdE1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiQ2hlY2tDb21wbGV4UGF0ICIgPDwgUGF0dGVybi5nZXRTZWxlY3RGdW5jKCkgPDwgJ1xuJzsKK30KKwordm9pZCBDaGVja0FuZEltbU1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiQ2hlY2tBbmRJbW0gIiA8PCBWYWx1ZSA8PCAnXG4nOworfQorCit2b2lkIENoZWNrT3JJbW1NYXRjaGVyOjpwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0IHsKKyAgT1MuaW5kZW50KGluZGVudCkgPDwgIkNoZWNrT3JJbW0gIiA8PCBWYWx1ZSA8PCAnXG4nOworfQorCit2b2lkIENoZWNrRm9sZGFibGVDaGFpbk5vZGVNYXRjaGVyOjpwcmludEltcGwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiQ2hlY2tGb2xkYWJsZUNoYWluTm9kZVxuIjsKK30KKwordm9pZCBFbWl0SW50ZWdlck1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiRW1pdEludGVnZXIgIiA8PCBWYWwgPDwgIiBWVD0iIDw8IFZUIDw8ICdcbic7Cit9CisKK3ZvaWQgRW1pdFN0cmluZ0ludGVnZXJNYXRjaGVyOjoKK3ByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiRW1pdFN0cmluZ0ludGVnZXIgIiA8PCBWYWwgPDwgIiBWVD0iIDw8IFZUIDw8ICdcbic7Cit9CisKK3ZvaWQgRW1pdFJlZ2lzdGVyTWF0Y2hlcjo6cHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdCB7CisgIE9TLmluZGVudChpbmRlbnQpIDw8ICJFbWl0UmVnaXN0ZXIgIjsKKyAgaWYgKFJlZykKKyAgICBPUyA8PCBSZWctPmdldE5hbWUoKTsKKyAgZWxzZQorICAgIE9TIDw8ICJ6ZXJvX3JlZyI7CisgIE9TIDw8ICIgVlQ9IiA8PCBWVCA8PCAnXG4nOworfQorCit2b2lkIEVtaXRDb252ZXJ0VG9UYXJnZXRNYXRjaGVyOjoKK3ByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiRW1pdENvbnZlcnRUb1RhcmdldCAiIDw8IFNsb3QgPDwgJ1xuJzsKK30KKwordm9pZCBFbWl0TWVyZ2VJbnB1dENoYWluc01hdGNoZXI6OgorcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdCB7CisgIE9TLmluZGVudChpbmRlbnQpIDw8ICJFbWl0TWVyZ2VJbnB1dENoYWlucyA8dG9kbzogYXJncz5cbiI7Cit9CisKK3ZvaWQgRW1pdENvcHlUb1JlZ01hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiRW1pdENvcHlUb1JlZyA8dG9kbzogYXJncz5cbiI7Cit9CisKK3ZvaWQgRW1pdE5vZGVYRm9ybU1hdGNoZXI6OnByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgeworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiRW1pdE5vZGVYRm9ybSAiIDw8IE5vZGVYRm9ybS0+Z2V0TmFtZSgpCisgICAgIDw8ICIgU2xvdD0iIDw8IFNsb3QgPDwgJ1xuJzsKK30KKworCit2b2lkIEVtaXROb2RlTWF0Y2hlckNvbW1vbjo6cHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdCB7CisgIE9TLmluZGVudChpbmRlbnQpOworICBPUyA8PCAoaXNhPE1vcnBoTm9kZVRvTWF0Y2hlcj4odGhpcykgPyAiTW9ycGhOb2RlVG86ICIgOiAiRW1pdE5vZGU6ICIpCisgICAgIDw8IE9wY29kZU5hbWUgPDwgIjogPHRvZG8gZmxhZ3M+ICI7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZUcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE9TIDw8ICcgJyA8PCBnZXRFbnVtTmFtZShWVHNbaV0pOworICBPUyA8PCAnKCc7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE9TIDw8IE9wZXJhbmRzW2ldIDw8ICcgJzsKKyAgT1MgPDwgIilcbiI7Cit9CisKK3ZvaWQgTWFya0ZsYWdSZXN1bHRzTWF0Y2hlcjo6cHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdCB7CisgIE9TLmluZGVudChpbmRlbnQpIDw8ICJNYXJrRmxhZ1Jlc3VsdHMgPHRvZG86IGFyZ3M+XG4iOworfQorCit2b2lkIENvbXBsZXRlTWF0Y2hNYXRjaGVyOjpwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0IHsKKyAgT1MuaW5kZW50KGluZGVudCkgPDwgIkNvbXBsZXRlTWF0Y2ggPHRvZG8gYXJncz5cbiI7CisgIE9TLmluZGVudChpbmRlbnQpIDw8ICJTcmMgPSAiIDw8ICpQYXR0ZXJuLmdldFNyY1BhdHRlcm4oKSA8PCAiXG4iOworICBPUy5pbmRlbnQoaW5kZW50KSA8PCAiRHN0ID0gIiA8PCAqUGF0dGVybi5nZXREc3RQYXR0ZXJuKCkgPDwgIlxuIjsKK30KKworLy8gZ2V0SGFzaEltcGwgSW1wbGVtZW50YXRpb24uCisKK3Vuc2lnbmVkIENoZWNrUGF0dGVyblByZWRpY2F0ZU1hdGNoZXI6OmdldEhhc2hJbXBsKCkgY29uc3QgeworICByZXR1cm4gSGFzaFN0cmluZyhQcmVkaWNhdGUpOworfQorCit1bnNpZ25lZCBDaGVja1ByZWRpY2F0ZU1hdGNoZXI6OmdldEhhc2hJbXBsKCkgY29uc3QgeworICByZXR1cm4gSGFzaFN0cmluZyhQcmVkTmFtZSk7Cit9CisKK3Vuc2lnbmVkIENoZWNrT3Bjb2RlTWF0Y2hlcjo6Z2V0SGFzaEltcGwoKSBjb25zdCB7CisgIHJldHVybiBIYXNoU3RyaW5nKE9wY29kZS5nZXRFbnVtTmFtZSgpKTsKK30KKwordW5zaWduZWQgQ2hlY2tDb25kQ29kZU1hdGNoZXI6OmdldEhhc2hJbXBsKCkgY29uc3QgeworICByZXR1cm4gSGFzaFN0cmluZyhDb25kQ29kZU5hbWUpOworfQorCit1bnNpZ25lZCBDaGVja1ZhbHVlVHlwZU1hdGNoZXI6OmdldEhhc2hJbXBsKCkgY29uc3QgeworICByZXR1cm4gSGFzaFN0cmluZyhUeXBlTmFtZSk7Cit9CisKK3Vuc2lnbmVkIEVtaXRTdHJpbmdJbnRlZ2VyTWF0Y2hlcjo6Z2V0SGFzaEltcGwoKSBjb25zdCB7CisgIHJldHVybiBIYXNoU3RyaW5nKFZhbCkgXiBWVDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+CitzdGF0aWMgdW5zaWduZWQgSGFzaFVuc2lnbmVkcyhJdCBJLCBJdCBFKSB7CisgIHVuc2lnbmVkIFJlc3VsdCA9IDA7CisgIGZvciAoOyBJICE9IEU7ICsrSSkKKyAgICBSZXN1bHQgPSAoUmVzdWx0PDwzKSBeICpJOworICByZXR1cm4gUmVzdWx0OworfQorCit1bnNpZ25lZCBFbWl0TWVyZ2VJbnB1dENoYWluc01hdGNoZXI6OmdldEhhc2hJbXBsKCkgY29uc3QgeworICByZXR1cm4gSGFzaFVuc2lnbmVkcyhDaGFpbk5vZGVzLmJlZ2luKCksIENoYWluTm9kZXMuZW5kKCkpOworfQorCitib29sIENoZWNrT3Bjb2RlTWF0Y2hlcjo6aXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeworICAvLyBOb3RlOiBwb2ludGVyIGVxdWFsaXR5IGlzbid0IGVub3VnaCBoZXJlLCB3ZSBoYXZlIHRvIGNoZWNrIHRoZSBlbnVtIG5hbWVzCisgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBub2RlcyBhcmUgZm9yIHRoZSBzYW1lIG9wY29kZS4gCisgIHJldHVybiBjYXN0PENoZWNrT3Bjb2RlTWF0Y2hlcj4oTSktPk9wY29kZS5nZXRFbnVtTmFtZSgpID09CisgICAgICAgICAgT3Bjb2RlLmdldEVudW1OYW1lKCk7Cit9CisKKworYm9vbCBFbWl0Tm9kZU1hdGNoZXJDb21tb246OmlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKm0pIGNvbnN0IHsKKyAgY29uc3QgRW1pdE5vZGVNYXRjaGVyQ29tbW9uICpNID0gY2FzdDxFbWl0Tm9kZU1hdGNoZXJDb21tb24+KG0pOworICByZXR1cm4gTS0+T3Bjb2RlTmFtZSA9PSBPcGNvZGVOYW1lICYmIE0tPlZUcyA9PSBWVHMgJiYKKyAgICAgICAgIE0tPk9wZXJhbmRzID09IE9wZXJhbmRzICYmIE0tPkhhc0NoYWluID09IEhhc0NoYWluICYmCisgICAgICAgICBNLT5IYXNJbkZsYWcgPT0gSGFzSW5GbGFnICYmIE0tPkhhc091dEZsYWcgPT0gSGFzT3V0RmxhZyAmJgorICAgICAgICAgTS0+SGFzTWVtUmVmcyA9PSBIYXNNZW1SZWZzICYmCisgICAgICAgICBNLT5OdW1GaXhlZEFyaXR5T3BlcmFuZHMgPT0gTnVtRml4ZWRBcml0eU9wZXJhbmRzOworfQorCit1bnNpZ25lZCBFbWl0Tm9kZU1hdGNoZXJDb21tb246OmdldEhhc2hJbXBsKCkgY29uc3QgeworICByZXR1cm4gKEhhc2hTdHJpbmcoT3Bjb2RlTmFtZSkgPDwgNCkgfCBPcGVyYW5kcy5zaXplKCk7Cit9CisKKwordW5zaWduZWQgTWFya0ZsYWdSZXN1bHRzTWF0Y2hlcjo6Z2V0SGFzaEltcGwoKSBjb25zdCB7CisgIHJldHVybiBIYXNoVW5zaWduZWRzKEZsYWdSZXN1bHROb2Rlcy5iZWdpbigpLCBGbGFnUmVzdWx0Tm9kZXMuZW5kKCkpOworfQorCit1bnNpZ25lZCBDb21wbGV0ZU1hdGNoTWF0Y2hlcjo6Z2V0SGFzaEltcGwoKSBjb25zdCB7CisgIHJldHVybiBIYXNoVW5zaWduZWRzKFJlc3VsdHMuYmVnaW4oKSwgUmVzdWx0cy5lbmQoKSkgXiAKKyAgICAgICAgICAoKHVuc2lnbmVkKShpbnRwdHJfdCkmUGF0dGVybiA8PCA4KTsKK30KKworLy8gaXNDb250cmFkaWN0b3J5SW1wbCBJbXBsZW1lbnRhdGlvbnMuCisKK3N0YXRpYyBib29sIFR5cGVzQXJlQ29udHJhZGljdG9yeShNVlQ6OlNpbXBsZVZhbHVlVHlwZSBUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBUMikgeworICAvLyBJZiB0aGUgdHdvIHR5cGVzIGFyZSB0aGUgc2FtZSwgdGhlbiB0aGV5IGFyZSB0aGUgc2FtZSwgc28gdGhleSBkb24ndAorICAvLyBjb250cmFkaWN0LgorICBpZiAoVDEgPT0gVDIpIHJldHVybiBmYWxzZTsKKyAgCisgIC8vIElmIGVpdGhlciB0eXBlIGlzIGFib3V0IGlQdHIsIHRoZW4gdGhleSBkb24ndCBjb25mbGljdCB1bmxlc3MgdGhlIG90aGVyCisgIC8vIG9uZSBpcyBub3QgYSBzY2FsYXIgaW50ZWdlciB0eXBlLgorICBpZiAoVDEgPT0gTVZUOjppUFRSKQorICAgIHJldHVybiAhTVZUKFQyKS5pc0ludGVnZXIoKSB8fCBNVlQoVDIpLmlzVmVjdG9yKCk7CisgIAorICBpZiAoVDIgPT0gTVZUOjppUFRSKQorICAgIHJldHVybiAhTVZUKFQxKS5pc0ludGVnZXIoKSB8fCBNVlQoVDEpLmlzVmVjdG9yKCk7CisgIAorICAvLyBPdGhlcndpc2UsIHRoZXkgYXJlIHR3byBkaWZmZXJlbnQgbm9uLWlQVFIgdHlwZXMsIHRoZXkgY29uZmxpY3QuCisgIHJldHVybiB0cnVlOworfQorCitib29sIENoZWNrT3Bjb2RlTWF0Y2hlcjo6aXNDb250cmFkaWN0b3J5SW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgIGlmIChjb25zdCBDaGVja09wY29kZU1hdGNoZXIgKkNPTSA9IGR5bl9jYXN0PENoZWNrT3Bjb2RlTWF0Y2hlcj4oTSkpIHsKKyAgICAvLyBPbmUgbm9kZSBjYW4ndCBoYXZlIHR3byBkaWZmZXJlbnQgb3Bjb2RlcyEKKyAgICAvLyBOb3RlOiBwb2ludGVyIGVxdWFsaXR5IGlzbid0IGVub3VnaCBoZXJlLCB3ZSBoYXZlIHRvIGNoZWNrIHRoZSBlbnVtIG5hbWVzCisgICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIG5vZGVzIGFyZSBmb3IgdGhlIHNhbWUgb3Bjb2RlLiAKKyAgICByZXR1cm4gQ09NLT5nZXRPcGNvZGUoKS5nZXRFbnVtTmFtZSgpICE9IGdldE9wY29kZSgpLmdldEVudW1OYW1lKCk7CisgIH0KKyAgCisgIC8vIElmIHRoZSBub2RlIGhhcyBhIGtub3duIHR5cGUsIGFuZCBpZiB0aGUgdHlwZSB3ZSdyZSBjaGVja2luZyBmb3IgaXMKKyAgLy8gZGlmZmVyZW50LCB0aGVuIHdlIGtub3cgdGhleSBjb250cmFkaWN0LiAgRm9yIGV4YW1wbGUsIGEgY2hlY2sgZm9yCisgIC8vIElTRDo6U1RPUkUgd2lsbCBuZXZlciBiZSB0cnVlIGF0IHRoZSBzYW1lIHRpbWUgYSBjaGVjayBmb3IgVHlwZSBpMzIgaXMuCisgIGlmIChjb25zdCBDaGVja1R5cGVNYXRjaGVyICpDVCA9IGR5bl9jYXN0PENoZWNrVHlwZU1hdGNoZXI+KE0pKSB7CisgICAgLy8gSWYgY2hlY2tpbmcgZm9yIGEgcmVzdWx0IHRoZSBvcGNvZGUgZG9lc24ndCBoYXZlLCBpdCBjYW4ndCBtYXRjaC4KKyAgICBpZiAoQ1QtPmdldFJlc05vKCkgPj0gZ2V0T3Bjb2RlKCkuZ2V0TnVtUmVzdWx0cygpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgTm9kZVR5cGUgPSBnZXRPcGNvZGUoKS5nZXRLbm93blR5cGUoQ1QtPmdldFJlc05vKCkpOworICAgIGlmIChOb2RlVHlwZSAhPSBNVlQ6Ok90aGVyKQorICAgICAgcmV0dXJuIFR5cGVzQXJlQ29udHJhZGljdG9yeShOb2RlVHlwZSwgQ1QtPmdldFR5cGUoKSk7CisgIH0KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDaGVja1R5cGVNYXRjaGVyOjppc0NvbnRyYWRpY3RvcnlJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgaWYgKGNvbnN0IENoZWNrVHlwZU1hdGNoZXIgKkNUID0gZHluX2Nhc3Q8Q2hlY2tUeXBlTWF0Y2hlcj4oTSkpCisgICAgcmV0dXJuIFR5cGVzQXJlQ29udHJhZGljdG9yeShnZXRUeXBlKCksIENULT5nZXRUeXBlKCkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ2hlY2tDaGlsZFR5cGVNYXRjaGVyOjppc0NvbnRyYWRpY3RvcnlJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgaWYgKGNvbnN0IENoZWNrQ2hpbGRUeXBlTWF0Y2hlciAqQ0MgPSBkeW5fY2FzdDxDaGVja0NoaWxkVHlwZU1hdGNoZXI+KE0pKSB7CisgICAgLy8gSWYgdGhlIHR3byBjaGVja3MgYXJlIGFib3V0IGRpZmZlcmVudCBub2Rlcywgd2UgZG9uJ3Qga25vdyBpZiB0aGV5CisgICAgLy8gY29uZmxpY3QhCisgICAgaWYgKENDLT5nZXRDaGlsZE5vKCkgIT0gZ2V0Q2hpbGRObygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIHJldHVybiBUeXBlc0FyZUNvbnRyYWRpY3RvcnkoZ2V0VHlwZSgpLCBDQy0+Z2V0VHlwZSgpKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisgIAorYm9vbCBDaGVja0ludGVnZXJNYXRjaGVyOjppc0NvbnRyYWRpY3RvcnlJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgaWYgKGNvbnN0IENoZWNrSW50ZWdlck1hdGNoZXIgKkNJTSA9IGR5bl9jYXN0PENoZWNrSW50ZWdlck1hdGNoZXI+KE0pKQorICAgIHJldHVybiBDSU0tPmdldFZhbHVlKCkgIT0gZ2V0VmFsdWUoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENoZWNrVmFsdWVUeXBlTWF0Y2hlcjo6aXNDb250cmFkaWN0b3J5SW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgIGlmIChjb25zdCBDaGVja1ZhbHVlVHlwZU1hdGNoZXIgKkNWVCA9IGR5bl9jYXN0PENoZWNrVmFsdWVUeXBlTWF0Y2hlcj4oTSkpCisgICAgcmV0dXJuIENWVC0+Z2V0VHlwZU5hbWUoKSAhPSBnZXRUeXBlTmFtZSgpOworICByZXR1cm4gZmFsc2U7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0RBR0lTZWxNYXRjaGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9EQUdJU2VsTWF0Y2hlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjI1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9EQUdJU2VsTWF0Y2hlci5oCkBAIC0wLDAgKzEsMTExNCBAQAorLy89PT0tIERBR0lTZWxNYXRjaGVyLmggLSBSZXByZXNlbnRhdGlvbiBvZiBEQUcgcGF0dGVybiBtYXRjaGVyIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBUQkxHRU5fREFHSVNFTE1BVENIRVJfSAorI2RlZmluZSBUQkxHRU5fREFHSVNFTE1BVENIRVJfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQ29kZUdlbkRBR1BhdHRlcm5zOworICBjbGFzcyBNYXRjaGVyOworICBjbGFzcyBQYXR0ZXJuVG9NYXRjaDsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisgIGNsYXNzIENvbXBsZXhQYXR0ZXJuOworICBjbGFzcyBSZWNvcmQ7CisgIGNsYXNzIFNETm9kZUluZm87CisKK01hdGNoZXIgKkNvbnZlcnRQYXR0ZXJuVG9NYXRjaGVyKGNvbnN0IFBhdHRlcm5Ub01hdGNoICZQYXR0ZXJuLHVuc2lnbmVkIFZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNHUCk7CitNYXRjaGVyICpPcHRpbWl6ZU1hdGNoZXIoTWF0Y2hlciAqTWF0Y2hlciwgY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZDR1ApOwordm9pZCBFbWl0TWF0Y2hlclRhYmxlKGNvbnN0IE1hdGNoZXIgKk1hdGNoZXIsIGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmQ0dQLAorICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7CisKKyAgCisvLy8gTWF0Y2hlciAtIEJhc2UgY2xhc3MgZm9yIGFsbCB0aGUgdGhlIERBRyBJU2VsIE1hdGNoZXIgcmVwcmVzZW50YXRpb24KKy8vLyBub2Rlcy4KK2NsYXNzIE1hdGNoZXIgeworICAvLyBUaGUgbmV4dCBtYXRjaGVyIG5vZGUgdGhhdCBpcyBleGVjdXRlZCBhZnRlciB0aGlzIG9uZS4gIE51bGwgaWYgdGhpcyBpcyB0aGUKKyAgLy8gbGFzdCBzdGFnZSBvZiBhIG1hdGNoLgorICBPd25pbmdQdHI8TWF0Y2hlcj4gTmV4dDsKK3B1YmxpYzoKKyAgZW51bSBLaW5kVHkgeworICAgIC8vIE1hdGNoZXIgc3RhdGUgbWFuaXB1bGF0aW9uLgorICAgIFNjb3BlLCAgICAgICAgICAgICAgICAvLyBQdXNoIGEgY2hlY2tpbmcgc2NvcGUuCisgICAgUmVjb3JkTm9kZSwgICAgICAgICAgIC8vIFJlY29yZCB0aGUgY3VycmVudCBub2RlLgorICAgIFJlY29yZENoaWxkLCAgICAgICAgICAvLyBSZWNvcmQgYSBjaGlsZCBvZiB0aGUgY3VycmVudCBub2RlLgorICAgIFJlY29yZE1lbVJlZiwgICAgICAgICAvLyBSZWNvcmQgdGhlIG1lbXJlZiBpbiB0aGUgY3VycmVudCBub2RlLgorICAgIENhcHR1cmVGbGFnSW5wdXQsICAgICAvLyBJZiB0aGUgY3VycmVudCBub2RlIGhhcyBhbiBpbnB1dCBmbGFnLCBzYXZlIGl0LgorICAgIE1vdmVDaGlsZCwgICAgICAgICAgICAvLyBNb3ZlIGN1cnJlbnQgbm9kZSB0byBzcGVjaWZpZWQgY2hpbGQuCisgICAgTW92ZVBhcmVudCwgICAgICAgICAgIC8vIE1vdmUgY3VycmVudCBub2RlIHRvIHBhcmVudC4KKyAgICAKKyAgICAvLyBQcmVkaWNhdGUgY2hlY2tpbmcuCisgICAgQ2hlY2tTYW1lLCAgICAgICAgICAgIC8vIEZhaWwgaWYgbm90IHNhbWUgYXMgcHJldiBtYXRjaC4KKyAgICBDaGVja1BhdHRlcm5QcmVkaWNhdGUsCisgICAgQ2hlY2tQcmVkaWNhdGUsICAgICAgIC8vIEZhaWwgaWYgbm9kZSBwcmVkaWNhdGUgZmFpbHMuCisgICAgQ2hlY2tPcGNvZGUsICAgICAgICAgIC8vIEZhaWwgaWYgbm90IG9wY29kZS4KKyAgICBTd2l0Y2hPcGNvZGUsICAgICAgICAgLy8gRGlzcGF0Y2ggYmFzZWQgb24gb3Bjb2RlLgorICAgIENoZWNrVHlwZSwgICAgICAgICAgICAvLyBGYWlsIGlmIG5vdCBjb3JyZWN0IHR5cGUuCisgICAgU3dpdGNoVHlwZSwgICAgICAgICAgIC8vIERpc3BhdGNoIGJhc2VkIG9uIHR5cGUuCisgICAgQ2hlY2tDaGlsZFR5cGUsICAgICAgIC8vIEZhaWwgaWYgY2hpbGQgaGFzIHdyb25nIHR5cGUuCisgICAgQ2hlY2tJbnRlZ2VyLCAgICAgICAgIC8vIEZhaWwgaWYgd3JvbmcgdmFsLgorICAgIENoZWNrQ29uZENvZGUsICAgICAgICAvLyBGYWlsIGlmIG5vdCBjb25kY29kZS4KKyAgICBDaGVja1ZhbHVlVHlwZSwKKyAgICBDaGVja0NvbXBsZXhQYXQsCisgICAgQ2hlY2tBbmRJbW0sCisgICAgQ2hlY2tPckltbSwKKyAgICBDaGVja0ZvbGRhYmxlQ2hhaW5Ob2RlLAorICAgIAorICAgIC8vIE5vZGUgY3JlYXRpb24vZW1pc3NzaW9uLgorICAgIEVtaXRJbnRlZ2VyLCAgICAgICAgICAvLyBDcmVhdGUgYSBUYXJnZXRDb25zdGFudAorICAgIEVtaXRTdHJpbmdJbnRlZ2VyLCAgICAvLyBDcmVhdGUgYSBUYXJnZXRDb25zdGFudCBmcm9tIGEgc3RyaW5nLgorICAgIEVtaXRSZWdpc3RlciwgICAgICAgICAvLyBDcmVhdGUgYSByZWdpc3Rlci4KKyAgICBFbWl0Q29udmVydFRvVGFyZ2V0LCAgLy8gQ29udmVydCBhIGltbS9mcGltbSB0byB0YXJnZXQgaW1tL2ZwaW1tCisgICAgRW1pdE1lcmdlSW5wdXRDaGFpbnMsIC8vIE1lcmdlIHRvZ2V0aGVyIGEgY2hhaW5zIGZvciBhbiBpbnB1dC4KKyAgICBFbWl0Q29weVRvUmVnLCAgICAgICAgLy8gRW1pdCBhIGNvcHl0b3JlZyBpbnRvIGEgcGh5c3JlZy4KKyAgICBFbWl0Tm9kZSwgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgREFHIG5vZGUKKyAgICBFbWl0Tm9kZVhGb3JtLCAgICAgICAgLy8gUnVuIGEgU0ROb2RlWEZvcm0KKyAgICBNYXJrRmxhZ1Jlc3VsdHMsICAgICAgLy8gSW5kaWNhdGUgd2hpY2ggaW50ZXJpb3Igbm9kZXMgaGF2ZSBmbGFnIHJlc3VsdHMuCisgICAgQ29tcGxldGVNYXRjaCwgICAgICAgIC8vIEZpbmlzaCBhIG1hdGNoIGFuZCB1cGRhdGUgdGhlIHJlc3VsdHMuCisgICAgTW9ycGhOb2RlVG8gICAgICAgICAgIC8vIEJ1aWxkIGEgbm9kZSwgZmluaXNoIGEgbWF0Y2ggYW5kIHVwZGF0ZSByZXN1bHRzLgorICB9OworICBjb25zdCBLaW5kVHkgS2luZDsKKworcHJvdGVjdGVkOgorICBNYXRjaGVyKEtpbmRUeSBLKSA6IEtpbmQoSykge30KK3B1YmxpYzoKKyAgdmlydHVhbCB+TWF0Y2hlcigpIHt9CisgIAorICBLaW5kVHkgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICBNYXRjaGVyICpnZXROZXh0KCkgeyByZXR1cm4gTmV4dC5nZXQoKTsgfQorICBjb25zdCBNYXRjaGVyICpnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gTmV4dC5nZXQoKTsgfQorICB2b2lkIHNldE5leHQoTWF0Y2hlciAqQykgeyBOZXh0LnJlc2V0KEMpOyB9CisgIE1hdGNoZXIgKnRha2VOZXh0KCkgeyByZXR1cm4gTmV4dC50YWtlKCk7IH0KKworICBPd25pbmdQdHI8TWF0Y2hlcj4gJmdldE5leHRQdHIoKSB7IHJldHVybiBOZXh0OyB9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICopIHsgcmV0dXJuIHRydWU7IH0KKyAgCisgIGJvb2wgaXNFcXVhbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgICAgaWYgKGdldEtpbmQoKSAhPSBNLT5nZXRLaW5kKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXNFcXVhbEltcGwoTSk7CisgIH0KKyAgCisgIHVuc2lnbmVkIGdldEhhc2goKSBjb25zdCB7CisgICAgLy8gQ2xlYXIgdGhlIGhpZ2ggYml0IHNvIHdlIGRvbid0IGNvbmZsaWN0IHdpdGggdG9tYnN0b25lcyBldGMuCisgICAgcmV0dXJuICgoZ2V0SGFzaEltcGwoKSA8PCA0KSBeIGdldEtpbmQoKSkgJiAofjBVPj4xKTsKKyAgfQorICAKKyAgLy8vIGlzU2FmZVRvUmVvcmRlcldpdGhQYXR0ZXJuUHJlZGljYXRlIC0gUmV0dXJuIHRydWUgaWYgaXQgaXMgc2FmZSB0byBzaW5rIGEKKyAgLy8vIFBhdHRlcm5QcmVkaWNhdGUgbm9kZSBwYXN0IHRoaXMgb25lLgorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLy8gaXNTaW1wbGVQcmVkaWNhdGVOb2RlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHNpbXBsZSBwcmVkaWNhdGUgdGhhdAorICAvLy8gb3BlcmF0ZXMgb24gdGhlIG5vZGUgb3IgaXRzIGNoaWxkcmVuIHdpdGhvdXQgcG90ZW50aWFsIHNpZGUgZWZmZWN0cyBvciBhCisgIC8vLyBjaGFuZ2Ugb2YgdGhlIGN1cnJlbnQgbm9kZS4KKyAgYm9vbCBpc1NpbXBsZVByZWRpY2F0ZU5vZGUoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBDaGVja1NhbWU6CisgICAgY2FzZSBDaGVja1BhdHRlcm5QcmVkaWNhdGU6CisgICAgY2FzZSBDaGVja1ByZWRpY2F0ZToKKyAgICBjYXNlIENoZWNrT3Bjb2RlOgorICAgIGNhc2UgQ2hlY2tUeXBlOgorICAgIGNhc2UgQ2hlY2tDaGlsZFR5cGU6CisgICAgY2FzZSBDaGVja0ludGVnZXI6CisgICAgY2FzZSBDaGVja0NvbmRDb2RlOgorICAgIGNhc2UgQ2hlY2tWYWx1ZVR5cGU6CisgICAgY2FzZSBDaGVja0FuZEltbToKKyAgICBjYXNlIENoZWNrT3JJbW06CisgICAgY2FzZSBDaGVja0ZvbGRhYmxlQ2hhaW5Ob2RlOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIAorICAvLy8gaXNTaW1wbGVQcmVkaWNhdGVPclJlY29yZE5vZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcmVjb3JkIG5vZGUgb3IKKyAgLy8vIGEgc2ltcGxlIHByZWRpY2F0ZS4KKyAgYm9vbCBpc1NpbXBsZVByZWRpY2F0ZU9yUmVjb3JkTm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNTaW1wbGVQcmVkaWNhdGVOb2RlKCkgfHwKKyAgICAgICAgICAgZ2V0S2luZCgpID09IFJlY29yZE5vZGUgfHwgZ2V0S2luZCgpID09IFJlY29yZENoaWxkOworICB9CisgIAorICAvLy8gdW5saW5rTm9kZSAtIFVubGluayB0aGUgc3BlY2lmaWVkIG5vZGUgZnJvbSB0aGlzIGNoYWluLiAgSWYgT3RoZXIgPT0gdGhpcywKKyAgLy8vIHdlIHVubGluayB0aGUgbmV4dCBwb2ludGVyIGFuZCByZXR1cm4gaXQuICBPdGhlcndpc2Ugd2UgdW5saW5rIE90aGVyIGZyb20KKyAgLy8vIHRoZSBsaXN0IGFuZCByZXR1cm4gdGhpcy4KKyAgTWF0Y2hlciAqdW5saW5rTm9kZShNYXRjaGVyICpPdGhlcik7CisgIAorICAvLy8gY2FuTW92ZUJlZm9yZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgbWF0Y2hlciBpcyB0aGUgc2FtZSBhcyBPdGhlciwgb3IgaWYKKyAgLy8vIHdlIGNhbiBtb3ZlIHRoaXMgbWF0Y2hlciBwYXN0IGFsbCBvZiB0aGUgbm9kZXMgaW4tYmV0d2VlbiBPdGhlciBhbmQgdGhpcworICAvLy8gbm9kZS4gIE90aGVyIG11c3QgYmUgZXF1YWwgdG8gb3IgYmVmb3JlIHRoaXMuCisgIGJvb2wgY2FuTW92ZUJlZm9yZShjb25zdCBNYXRjaGVyICpPdGhlcikgY29uc3Q7CisgIAorICAvLy8gY2FuTW92ZUJlZm9yZSAtIFJldHVybiB0cnVlIGlmIGl0IGlzIHNhZmUgdG8gbW92ZSB0aGUgY3VycmVudCBtYXRjaGVyCisgIC8vLyBhY3Jvc3MgdGhlIHNwZWNpZmllZCBvbmUuCisgIGJvb2wgY2FuTW92ZUJlZm9yZU5vZGUoY29uc3QgTWF0Y2hlciAqT3RoZXIpIGNvbnN0OworICAKKyAgLy8vIGlzQ29udHJhZGljdG9yeSAtIFJldHVybiB0cnVlIG9mIHRoZXNlIHR3byBtYXRjaGVycyBjb3VsZCBuZXZlciBtYXRjaCBvbgorICAvLy8gdGhlIHNhbWUgbm9kZS4KKyAgYm9vbCBpc0NvbnRyYWRpY3RvcnkoY29uc3QgTWF0Y2hlciAqT3RoZXIpIGNvbnN0IHsKKyAgICAvLyBTaW5jZSB0aGlzIHByZWRpY2F0ZSBpcyByZWZsZXhpdmUsIHdlIGNhbm9uaWNhbGl6ZSB0aGUgb3JkZXJpbmcgc28gdGhhdAorICAgIC8vIHdlIGFsd2F5cyBtYXRjaCBhIG5vZGUgYWdhaW5zdCBub2RlcyB3aXRoIGtpbmRzIHRoYXQgYXJlIGdyZWF0ZXIgb3IgZXF1YWwKKyAgICAvLyB0byB0aGVtLiAgRm9yIGV4YW1wbGUsIHdlJ2xsIHBhc3MgaW4gYSBDaGVja1R5cGUgbm9kZSBhcyBhbiBhcmd1bWVudCB0bworICAgIC8vIHRoZSBDaGVja09wY29kZSBtZXRob2QsIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAgICBpZiAoZ2V0S2luZCgpIDwgT3RoZXItPmdldEtpbmQoKSkKKyAgICAgIHJldHVybiBpc0NvbnRyYWRpY3RvcnlJbXBsKE90aGVyKTsKKyAgICByZXR1cm4gT3RoZXItPmlzQ29udHJhZGljdG9yeUltcGwodGhpcyk7CisgIH0KKyAgCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQgPSAwKSBjb25zdDsKKyAgdm9pZCBwcmludE9uZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldEhhc2hJbXBsKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNDb250cmFkaWN0b3J5SW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorfTsKKyAgCisvLy8gU2NvcGVNYXRjaGVyIC0gVGhpcyBhdHRlbXB0cyB0byBtYXRjaCBlYWNoIG9mIGl0cyBjaGlsZHJlbiB0byBmaW5kIHRoZSBmaXJzdAorLy8vIG9uZSB0aGF0IHN1Y2Nlc3NmdWxseSBtYXRjaGVzLiAgSWYgb25lIGNoaWxkIGZhaWxzLCBpdCB0cmllcyB0aGUgbmV4dCBjaGlsZC4KKy8vLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBtYXRjaCB0aGVuIHRoaXMgY2hlY2sgZmFpbHMuICBJdCBuZXZlciBoYXMgYSAnbmV4dCcuCitjbGFzcyBTY29wZU1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIFNtYWxsVmVjdG9yPE1hdGNoZXIqLCA0PiBDaGlsZHJlbjsKK3B1YmxpYzoKKyAgU2NvcGVNYXRjaGVyKE1hdGNoZXIgKmNvbnN0ICpjaGlsZHJlbiwgdW5zaWduZWQgbnVtY2hpbGRyZW4pCisgICAgOiBNYXRjaGVyKFNjb3BlKSwgQ2hpbGRyZW4oY2hpbGRyZW4sIGNoaWxkcmVuK251bWNoaWxkcmVuKSB7CisgIH0KKyAgdmlydHVhbCB+U2NvcGVNYXRjaGVyKCk7CisgIAorICB1bnNpZ25lZCBnZXROdW1DaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuLnNpemUoKTsgfQorICAKKyAgTWF0Y2hlciAqZ2V0Q2hpbGQodW5zaWduZWQgaSkgeyByZXR1cm4gQ2hpbGRyZW5baV07IH0KKyAgY29uc3QgTWF0Y2hlciAqZ2V0Q2hpbGQodW5zaWduZWQgaSkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW5baV07IH0KKyAgCisgIHZvaWQgcmVzZXRDaGlsZCh1bnNpZ25lZCBpLCBNYXRjaGVyICpOKSB7CisgICAgZGVsZXRlIENoaWxkcmVuW2ldOworICAgIENoaWxkcmVuW2ldID0gTjsKKyAgfQorCisgIE1hdGNoZXIgKnRha2VDaGlsZCh1bnNpZ25lZCBpKSB7CisgICAgTWF0Y2hlciAqUmVzID0gQ2hpbGRyZW5baV07CisgICAgQ2hpbGRyZW5baV0gPSAwOworICAgIHJldHVybiBSZXM7CisgIH0KKyAgCisgIHZvaWQgc2V0TnVtQ2hpbGRyZW4odW5zaWduZWQgTkMpIHsKKyAgICBpZiAoTkMgPCBDaGlsZHJlbi5zaXplKCkpIHsKKyAgICAgIC8vIGRlbGV0ZSBhbnkgY2hpbGRyZW4gd2UncmUgYWJvdXQgdG8gbG9zZSBwb2ludGVycyB0by4KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IE5DLCBlID0gQ2hpbGRyZW4uc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgZGVsZXRlIENoaWxkcmVuW2ldOworICAgIH0KKyAgICBDaGlsZHJlbi5yZXNpemUoTkMpOworICB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gU2NvcGU7CisgIH0KKyAgCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdCB7IHJldHVybiAxMjMxMjsgfQorfTsKKworLy8vIFJlY29yZE1hdGNoZXIgLSBTYXZlIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIG9wZXJhbmQgbGlzdC4KK2NsYXNzIFJlY29yZE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIC8vLyBXaGF0Rm9yIC0gVGhpcyBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoeSB3ZSdyZSByZWNvcmRpbmcgdGhpcy4gIFRoaXMKKyAgLy8vIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNvbW1lbnQgZ2VuZXJhdGlvbiBub3QgYW55dGhpbmcgc2VtYW50aWMuCisgIHN0ZDo6c3RyaW5nIFdoYXRGb3I7CisgIAorICAvLy8gUmVzdWx0Tm8gLSBUaGUgc2xvdCBudW1iZXIgaW4gdGhlIFJlY29yZGVkTm9kZXMgdmVjdG9yIHRoYXQgdGhpcyB3aWxsIGJlLAorICAvLy8ganVzdCBwcmludGVkIGFzIGEgY29tbWVudC4KKyAgdW5zaWduZWQgUmVzdWx0Tm87CitwdWJsaWM6CisgIFJlY29yZE1hdGNoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJndoYXRmb3IsIHVuc2lnbmVkIHJlc3VsdE5vKQorICAgIDogTWF0Y2hlcihSZWNvcmROb2RlKSwgV2hhdEZvcih3aGF0Zm9yKSwgUmVzdWx0Tm8ocmVzdWx0Tm8pIHt9CisgIAorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0V2hhdEZvcigpIGNvbnN0IHsgcmV0dXJuIFdoYXRGb3I7IH0KKyAgdW5zaWduZWQgZ2V0UmVzdWx0Tm8oKSBjb25zdCB7IHJldHVybiBSZXN1bHRObzsgfQorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gUmVjb3JkTm9kZTsKKyAgfQorICAKKyAgdmlydHVhbCBib29sIGlzU2FmZVRvUmVvcmRlcldpdGhQYXR0ZXJuUHJlZGljYXRlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc0VxdWFsSW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdCB7IHJldHVybiAwOyB9Cit9OworICAKKy8vLyBSZWNvcmRDaGlsZE1hdGNoZXIgLSBTYXZlIGEgbnVtYmVyZWQgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbm9kZSwgb3IgZmFpbAorLy8vIHRoZSBtYXRjaCBpZiBpdCBkb2Vzbid0IGV4aXN0LiAgVGhpcyBpcyBsb2dpY2FsbHkgZXF1aXZhbGVudCB0bzoKKy8vLyAgICBNb3ZlQ2hpbGQgTiArIFJlY29yZE5vZGUgKyBNb3ZlUGFyZW50LgorY2xhc3MgUmVjb3JkQ2hpbGRNYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworICB1bnNpZ25lZCBDaGlsZE5vOworICAKKyAgLy8vIFdoYXRGb3IgLSBUaGlzIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgd2h5IHdlJ3JlIHJlY29yZGluZyB0aGlzLiAgVGhpcworICAvLy8gc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY29tbWVudCBnZW5lcmF0aW9uIG5vdCBhbnl0aGluZyBzZW1hbnRpYy4KKyAgc3RkOjpzdHJpbmcgV2hhdEZvcjsKKyAgCisgIC8vLyBSZXN1bHRObyAtIFRoZSBzbG90IG51bWJlciBpbiB0aGUgUmVjb3JkZWROb2RlcyB2ZWN0b3IgdGhhdCB0aGlzIHdpbGwgYmUsCisgIC8vLyBqdXN0IHByaW50ZWQgYXMgYSBjb21tZW50LgorICB1bnNpZ25lZCBSZXN1bHRObzsKK3B1YmxpYzoKKyAgUmVjb3JkQ2hpbGRNYXRjaGVyKHVuc2lnbmVkIGNoaWxkbm8sIGNvbnN0IHN0ZDo6c3RyaW5nICZ3aGF0Zm9yLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVzdWx0Tm8pCisgIDogTWF0Y2hlcihSZWNvcmRDaGlsZCksIENoaWxkTm8oY2hpbGRubyksIFdoYXRGb3Iod2hhdGZvciksCisgICAgUmVzdWx0Tm8ocmVzdWx0Tm8pIHt9CisgIAorICB1bnNpZ25lZCBnZXRDaGlsZE5vKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRObzsgfQorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0V2hhdEZvcigpIGNvbnN0IHsgcmV0dXJuIFdoYXRGb3I7IH0KKyAgdW5zaWduZWQgZ2V0UmVzdWx0Tm8oKSBjb25zdCB7IHJldHVybiBSZXN1bHRObzsgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1hdGNoZXIgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0S2luZCgpID09IFJlY29yZENoaWxkOworICB9CisgIAorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFJlY29yZENoaWxkTWF0Y2hlcj4oTSktPmdldENoaWxkTm8oKSA9PSBnZXRDaGlsZE5vKCk7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0IHsgcmV0dXJuIGdldENoaWxkTm8oKTsgfQorfTsKKyAgCisvLy8gUmVjb3JkTWVtUmVmTWF0Y2hlciAtIFNhdmUgdGhlIGN1cnJlbnQgbm9kZSdzIG1lbXJlZi4KK2NsYXNzIFJlY29yZE1lbVJlZk1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CitwdWJsaWM6CisgIFJlY29yZE1lbVJlZk1hdGNoZXIoKSA6IE1hdGNoZXIoUmVjb3JkTWVtUmVmKSB7fQorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gUmVjb3JkTWVtUmVmOworICB9CisgIAorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEhhc2hJbXBsKCkgY29uc3QgeyByZXR1cm4gMDsgfQorfTsKKworICAKKy8vLyBDYXB0dXJlRmxhZ0lucHV0TWF0Y2hlciAtIElmIHRoZSBjdXJyZW50IHJlY29yZCBoYXMgYSBmbGFnIGlucHV0LCByZWNvcmQKKy8vLyBpdCBzbyB0aGF0IGl0IGlzIHVzZWQgYXMgYW4gaW5wdXQgdG8gdGhlIGdlbmVyYXRlZCBjb2RlLgorY2xhc3MgQ2FwdHVyZUZsYWdJbnB1dE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CitwdWJsaWM6CisgIENhcHR1cmVGbGFnSW5wdXRNYXRjaGVyKCkgOiBNYXRjaGVyKENhcHR1cmVGbGFnSW5wdXQpIHt9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBDYXB0dXJlRmxhZ0lucHV0OworICB9CisgIAorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEhhc2hJbXBsKCkgY29uc3QgeyByZXR1cm4gMDsgfQorfTsKKyAgCisvLy8gTW92ZUNoaWxkTWF0Y2hlciAtIFRoaXMgdGVsbHMgdGhlIGludGVycHJldGVyIHRvIG1vdmUgaW50byB0aGUKKy8vLyBzcGVjaWZpZWQgY2hpbGQgbm9kZS4KK2NsYXNzIE1vdmVDaGlsZE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIHVuc2lnbmVkIENoaWxkTm87CitwdWJsaWM6CisgIE1vdmVDaGlsZE1hdGNoZXIodW5zaWduZWQgY2hpbGRObykgOiBNYXRjaGVyKE1vdmVDaGlsZCksIENoaWxkTm8oY2hpbGRObykge30KKyAgCisgIHVuc2lnbmVkIGdldENoaWxkTm8oKSBjb25zdCB7IHJldHVybiBDaGlsZE5vOyB9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBNb3ZlQ2hpbGQ7CisgIH0KKyAgCisgIHZpcnR1YWwgYm9vbCBpc1NhZmVUb1Jlb3JkZXJXaXRoUGF0dGVyblByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc0VxdWFsSW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8TW92ZUNoaWxkTWF0Y2hlcj4oTSktPmdldENoaWxkTm8oKSA9PSBnZXRDaGlsZE5vKCk7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0IHsgcmV0dXJuIGdldENoaWxkTm8oKTsgfQorfTsKKyAgCisvLy8gTW92ZVBhcmVudE1hdGNoZXIgLSBUaGlzIHRlbGxzIHRoZSBpbnRlcnByZXRlciB0byBtb3ZlIHRvIHRoZSBwYXJlbnQKKy8vLyBvZiB0aGUgY3VycmVudCBub2RlLgorY2xhc3MgTW92ZVBhcmVudE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CitwdWJsaWM6CisgIE1vdmVQYXJlbnRNYXRjaGVyKCkgOiBNYXRjaGVyKE1vdmVQYXJlbnQpIHt9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBNb3ZlUGFyZW50OworICB9CisgIAorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEhhc2hJbXBsKCkgY29uc3QgeyByZXR1cm4gMDsgfQorfTsKKworLy8vIENoZWNrU2FtZU1hdGNoZXIgLSBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhpcyBub2RlIGlzIGV4YWN0bHkgdGhlIHNhbWUKKy8vLyBub2RlIGFzIHRoZSBzcGVjaWZpZWQgbWF0Y2ggdGhhdCB3YXMgcmVjb3JkZWQgd2l0aCAnUmVjb3JkJy4gIFRoaXMgaXMgdXNlZAorLy8vIHdoZW4gcGF0dGVybnMgaGF2ZSB0aGUgc2FtZSBuYW1lIGluIHRoZW0sIGxpa2UgJyhtdWwgR1BSOiRpbiwgR1BSOiRpbiknLgorY2xhc3MgQ2hlY2tTYW1lTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyIHsKKyAgdW5zaWduZWQgTWF0Y2hOdW1iZXI7CitwdWJsaWM6CisgIENoZWNrU2FtZU1hdGNoZXIodW5zaWduZWQgbWF0Y2hudW1iZXIpCisgICAgOiBNYXRjaGVyKENoZWNrU2FtZSksIE1hdGNoTnVtYmVyKG1hdGNobnVtYmVyKSB7fQorICAKKyAgdW5zaWduZWQgZ2V0TWF0Y2hOdW1iZXIoKSBjb25zdCB7IHJldHVybiBNYXRjaE51bWJlcjsgfQorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gQ2hlY2tTYW1lOworICB9CisgIAorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENoZWNrU2FtZU1hdGNoZXI+KE0pLT5nZXRNYXRjaE51bWJlcigpID09IGdldE1hdGNoTnVtYmVyKCk7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0IHsgcmV0dXJuIGdldE1hdGNoTnVtYmVyKCk7IH0KK307CisgIAorLy8vIENoZWNrUGF0dGVyblByZWRpY2F0ZU1hdGNoZXIgLSBUaGlzIGNoZWNrcyB0aGUgdGFyZ2V0LXNwZWNpZmljIHByZWRpY2F0ZQorLy8vIHRvIHNlZSBpZiB0aGUgZW50aXJlIHBhdHRlcm4gaXMgY2FwYWJsZSBvZiBtYXRjaGluZy4gIFRoaXMgcHJlZGljYXRlIGRvZXMKKy8vLyBub3QgdGFrZSBhIG5vZGUgYXMgaW5wdXQuICBUaGlzIGlzIHVzZWQgZm9yIHN1YnRhcmdldCBmZWF0dXJlIGNoZWNrcyBldGMuCitjbGFzcyBDaGVja1BhdHRlcm5QcmVkaWNhdGVNYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworICBzdGQ6OnN0cmluZyBQcmVkaWNhdGU7CitwdWJsaWM6CisgIENoZWNrUGF0dGVyblByZWRpY2F0ZU1hdGNoZXIoU3RyaW5nUmVmIHByZWRpY2F0ZSkKKyAgICA6IE1hdGNoZXIoQ2hlY2tQYXR0ZXJuUHJlZGljYXRlKSwgUHJlZGljYXRlKHByZWRpY2F0ZSkge30KKyAgCisgIFN0cmluZ1JlZiBnZXRQcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiBQcmVkaWNhdGU7IH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1hdGNoZXIgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0S2luZCgpID09IENoZWNrUGF0dGVyblByZWRpY2F0ZTsKKyAgfQorICAKKyAgdmlydHVhbCBib29sIGlzU2FmZVRvUmVvcmRlcldpdGhQYXR0ZXJuUHJlZGljYXRlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDaGVja1BhdHRlcm5QcmVkaWNhdGVNYXRjaGVyPihNKS0+Z2V0UHJlZGljYXRlKCkgPT0gUHJlZGljYXRlOworICB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdDsKK307CisgIAorLy8vIENoZWNrUHJlZGljYXRlTWF0Y2hlciAtIFRoaXMgY2hlY2tzIHRoZSB0YXJnZXQtc3BlY2lmaWMgcHJlZGljYXRlIHRvCisvLy8gc2VlIGlmIHRoZSBub2RlIGlzIGFjY2VwdGFibGUuCitjbGFzcyBDaGVja1ByZWRpY2F0ZU1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIFN0cmluZ1JlZiBQcmVkTmFtZTsKK3B1YmxpYzoKKyAgQ2hlY2tQcmVkaWNhdGVNYXRjaGVyKFN0cmluZ1JlZiBwcmVkbmFtZSkKKyAgICA6IE1hdGNoZXIoQ2hlY2tQcmVkaWNhdGUpLCBQcmVkTmFtZShwcmVkbmFtZSkge30KKyAgCisgIFN0cmluZ1JlZiBnZXRQcmVkaWNhdGVOYW1lKCkgY29uc3QgeyByZXR1cm4gUHJlZE5hbWU7IH0KKworICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBDaGVja1ByZWRpY2F0ZTsKKyAgfQorICAKKyAgLy8gVE9ETzogT2s/CisgIC8vdmlydHVhbCBib29sIGlzU2FmZVRvUmVvcmRlcldpdGhQYXR0ZXJuUHJlZGljYXRlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDaGVja1ByZWRpY2F0ZU1hdGNoZXI+KE0pLT5QcmVkTmFtZSA9PSBQcmVkTmFtZTsKKyAgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEhhc2hJbXBsKCkgY29uc3Q7Cit9OworICAKKyAgCisvLy8gQ2hlY2tPcGNvZGVNYXRjaGVyIC0gVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIHRoZQorLy8vIHNwZWNpZmllZCBvcGNvZGUsIGlmIG5vdCBpdCBmYWlscyB0byBtYXRjaC4KK2NsYXNzIENoZWNrT3Bjb2RlTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyIHsKKyAgY29uc3QgU0ROb2RlSW5mbyAmT3Bjb2RlOworcHVibGljOgorICBDaGVja09wY29kZU1hdGNoZXIoY29uc3QgU0ROb2RlSW5mbyAmb3Bjb2RlKQorICAgIDogTWF0Y2hlcihDaGVja09wY29kZSksIE9wY29kZShvcGNvZGUpIHt9CisgIAorICBjb25zdCBTRE5vZGVJbmZvICZnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcGNvZGU7IH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1hdGNoZXIgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0S2luZCgpID09IENoZWNrT3Bjb2RlOworICB9CisgIAorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzQ29udHJhZGljdG9yeUltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3Q7Cit9OworCisvLy8gU3dpdGNoT3Bjb2RlTWF0Y2hlciAtIFN3aXRjaCBiYXNlZCBvbiB0aGUgY3VycmVudCBub2RlJ3Mgb3Bjb2RlLCBkaXNwYXRjaGluZworLy8vIHRvIG9uZSBtYXRjaGVyIHBlciBvcGNvZGUuICBJZiB0aGUgb3Bjb2RlIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSBjYXNlcywKKy8vLyB0aGVuIHRoZSBtYXRjaCBmYWlscy4gIFRoaXMgaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gYSBTY29wZSBub2RlIHdoZXJlCisvLy8gZXZlcnkgY2hpbGQgZG9lcyBhIENoZWNrT3Bjb2RlLCBidXQgaXMgbXVjaCBmYXN0ZXIuCitjbGFzcyBTd2l0Y2hPcGNvZGVNYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgU0ROb2RlSW5mbyosIE1hdGNoZXIqPiwgOD4gQ2FzZXM7CitwdWJsaWM6CisgIFN3aXRjaE9wY29kZU1hdGNoZXIoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IFNETm9kZUluZm8qLCBNYXRjaGVyKj4gKmNhc2VzLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bWNhc2VzKQorICAgIDogTWF0Y2hlcihTd2l0Y2hPcGNvZGUpLCBDYXNlcyhjYXNlcywgY2FzZXMrbnVtY2FzZXMpIHt9CisKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gU3dpdGNoT3Bjb2RlOworICB9CisgIAorICB1bnNpZ25lZCBnZXROdW1DYXNlcygpIGNvbnN0IHsgcmV0dXJuIENhc2VzLnNpemUoKTsgfQorICAKKyAgY29uc3QgU0ROb2RlSW5mbyAmZ2V0Q2FzZU9wY29kZSh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiAqQ2FzZXNbaV0uZmlyc3Q7IH0KKyAgTWF0Y2hlciAqZ2V0Q2FzZU1hdGNoZXIodW5zaWduZWQgaSkgeyByZXR1cm4gQ2FzZXNbaV0uc2Vjb25kOyB9CisgIGNvbnN0IE1hdGNoZXIgKmdldENhc2VNYXRjaGVyKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIENhc2VzW2ldLnNlY29uZDsgfQorICAKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0IHsgcmV0dXJuIDQxMjM7IH0KK307CisgIAorLy8vIENoZWNrVHlwZU1hdGNoZXIgLSBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgdGhlCisvLy8gc3BlY2lmaWVkIHR5cGUgYXQgdGhlIHNwZWNpZmllZCByZXN1bHQsIGlmIG5vdCBpdCBmYWlscyB0byBtYXRjaC4KK2NsYXNzIENoZWNrVHlwZU1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFR5cGU7CisgIHVuc2lnbmVkIFJlc05vOworcHVibGljOgorICBDaGVja1R5cGVNYXRjaGVyKE1WVDo6U2ltcGxlVmFsdWVUeXBlIHR5cGUsIHVuc2lnbmVkIHJlc25vKQorICAgIDogTWF0Y2hlcihDaGVja1R5cGUpLCBUeXBlKHR5cGUpLCBSZXNObyhyZXNubykge30KKyAgCisgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisgIHVuc2lnbmVkIGdldFJlc05vKCkgY29uc3QgeyByZXR1cm4gUmVzTm87IH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1hdGNoZXIgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0S2luZCgpID09IENoZWNrVHlwZTsKKyAgfQorICAKKyAgdmlydHVhbCBib29sIGlzU2FmZVRvUmVvcmRlcldpdGhQYXR0ZXJuUHJlZGljYXRlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDaGVja1R5cGVNYXRjaGVyPihNKS0+VHlwZSA9PSBUeXBlOworICB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisgIHZpcnR1YWwgYm9vbCBpc0NvbnRyYWRpY3RvcnlJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0OworfTsKKyAgCisvLy8gU3dpdGNoVHlwZU1hdGNoZXIgLSBTd2l0Y2ggYmFzZWQgb24gdGhlIGN1cnJlbnQgbm9kZSdzIHR5cGUsIGRpc3BhdGNoaW5nCisvLy8gdG8gb25lIG1hdGNoZXIgcGVyIGNhc2UuICBJZiB0aGUgdHlwZSBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgY2FzZXMsCisvLy8gdGhlbiB0aGUgbWF0Y2ggZmFpbHMuICBUaGlzIGlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgU2NvcGUgbm9kZSB3aGVyZQorLy8vIGV2ZXJ5IGNoaWxkIGRvZXMgYSBDaGVja1R5cGUsIGJ1dCBpcyBtdWNoIGZhc3Rlci4KK2NsYXNzIFN3aXRjaFR5cGVNYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8TVZUOjpTaW1wbGVWYWx1ZVR5cGUsIE1hdGNoZXIqPiwgOD4gQ2FzZXM7CitwdWJsaWM6CisgIFN3aXRjaFR5cGVNYXRjaGVyKGNvbnN0IHN0ZDo6cGFpcjxNVlQ6OlNpbXBsZVZhbHVlVHlwZSwgTWF0Y2hlcio+ICpjYXNlcywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtY2FzZXMpCisgIDogTWF0Y2hlcihTd2l0Y2hUeXBlKSwgQ2FzZXMoY2FzZXMsIGNhc2VzK251bWNhc2VzKSB7fQorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gU3dpdGNoVHlwZTsKKyAgfQorICAKKyAgdW5zaWduZWQgZ2V0TnVtQ2FzZXMoKSBjb25zdCB7IHJldHVybiBDYXNlcy5zaXplKCk7IH0KKyAgCisgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIGdldENhc2VUeXBlKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIENhc2VzW2ldLmZpcnN0OyB9CisgIE1hdGNoZXIgKmdldENhc2VNYXRjaGVyKHVuc2lnbmVkIGkpIHsgcmV0dXJuIENhc2VzW2ldLnNlY29uZDsgfQorICBjb25zdCBNYXRjaGVyICpnZXRDYXNlTWF0Y2hlcih1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBDYXNlc1tpXS5zZWNvbmQ7IH0KKyAgCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdCB7IHJldHVybiA0MTIzOyB9Cit9OworICAKKyAgCisvLy8gQ2hlY2tDaGlsZFR5cGVNYXRjaGVyIC0gVGhpcyBjaGVja3MgdG8gc2VlIGlmIGEgY2hpbGQgbm9kZSBoYXMgdGhlCisvLy8gc3BlY2lmaWVkIHR5cGUsIGlmIG5vdCBpdCBmYWlscyB0byBtYXRjaC4KK2NsYXNzIENoZWNrQ2hpbGRUeXBlTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyIHsKKyAgdW5zaWduZWQgQ2hpbGRObzsKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVHlwZTsKK3B1YmxpYzoKKyAgQ2hlY2tDaGlsZFR5cGVNYXRjaGVyKHVuc2lnbmVkIGNoaWxkbm8sIE1WVDo6U2ltcGxlVmFsdWVUeXBlIHR5cGUpCisgICAgOiBNYXRjaGVyKENoZWNrQ2hpbGRUeXBlKSwgQ2hpbGRObyhjaGlsZG5vKSwgVHlwZSh0eXBlKSB7fQorICAKKyAgdW5zaWduZWQgZ2V0Q2hpbGRObygpIGNvbnN0IHsgcmV0dXJuIENoaWxkTm87IH0KKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1hdGNoZXIgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0S2luZCgpID09IENoZWNrQ2hpbGRUeXBlOworICB9CisgIAorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENoZWNrQ2hpbGRUeXBlTWF0Y2hlcj4oTSktPkNoaWxkTm8gPT0gQ2hpbGRObyAmJgorICAgICAgICAgICBjYXN0PENoZWNrQ2hpbGRUeXBlTWF0Y2hlcj4oTSktPlR5cGUgPT0gVHlwZTsKKyAgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEhhc2hJbXBsKCkgY29uc3QgeyByZXR1cm4gKFR5cGUgPDwgMykgfCBDaGlsZE5vOyB9CisgIHZpcnR1YWwgYm9vbCBpc0NvbnRyYWRpY3RvcnlJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0OworfTsKKyAgCisKKy8vLyBDaGVja0ludGVnZXJNYXRjaGVyIC0gVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgYQorLy8vIENvbnN0YW50U0ROb2RlIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLCBpZiBub3QgaXQgZmFpbHMgdG8gbWF0Y2guCitjbGFzcyBDaGVja0ludGVnZXJNYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworICBpbnQ2NF90IFZhbHVlOworcHVibGljOgorICBDaGVja0ludGVnZXJNYXRjaGVyKGludDY0X3QgdmFsdWUpCisgICAgOiBNYXRjaGVyKENoZWNrSW50ZWdlciksIFZhbHVlKHZhbHVlKSB7fQorICAKKyAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBDaGVja0ludGVnZXI7CisgIH0KKyAgCisgIHZpcnR1YWwgYm9vbCBpc1NhZmVUb1Jlb3JkZXJXaXRoUGF0dGVyblByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc0VxdWFsSW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q2hlY2tJbnRlZ2VyTWF0Y2hlcj4oTSktPlZhbHVlID09IFZhbHVlOworICB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNDb250cmFkaWN0b3J5SW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdDsKK307CisgIAorLy8vIENoZWNrQ29uZENvZGVNYXRjaGVyIC0gVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgYQorLy8vIENvbmRDb2RlU0ROb2RlIHdpdGggdGhlIHNwZWNpZmllZCBjb25kaXRpb24sIGlmIG5vdCBpdCBmYWlscyB0byBtYXRjaC4KK2NsYXNzIENoZWNrQ29uZENvZGVNYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworICBTdHJpbmdSZWYgQ29uZENvZGVOYW1lOworcHVibGljOgorICBDaGVja0NvbmRDb2RlTWF0Y2hlcihTdHJpbmdSZWYgY29uZGNvZGVuYW1lKQorICAgIDogTWF0Y2hlcihDaGVja0NvbmRDb2RlKSwgQ29uZENvZGVOYW1lKGNvbmRjb2RlbmFtZSkge30KKyAgCisgIFN0cmluZ1JlZiBnZXRDb25kQ29kZU5hbWUoKSBjb25zdCB7IHJldHVybiBDb25kQ29kZU5hbWU7IH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1hdGNoZXIgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0S2luZCgpID09IENoZWNrQ29uZENvZGU7CisgIH0KKyAgCisgIHZpcnR1YWwgYm9vbCBpc1NhZmVUb1Jlb3JkZXJXaXRoUGF0dGVyblByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc0VxdWFsSW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q2hlY2tDb25kQ29kZU1hdGNoZXI+KE0pLT5Db25kQ29kZU5hbWUgPT0gQ29uZENvZGVOYW1lOworICB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdDsKK307CisgIAorLy8vIENoZWNrVmFsdWVUeXBlTWF0Y2hlciAtIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgY3VycmVudCBub2RlIGlzIGEKKy8vLyBWVFNETm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSwgaWYgbm90IGl0IGZhaWxzIHRvIG1hdGNoLgorY2xhc3MgQ2hlY2tWYWx1ZVR5cGVNYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworICBTdHJpbmdSZWYgVHlwZU5hbWU7CitwdWJsaWM6CisgIENoZWNrVmFsdWVUeXBlTWF0Y2hlcihTdHJpbmdSZWYgdHlwZV9uYW1lKQorICAgIDogTWF0Y2hlcihDaGVja1ZhbHVlVHlwZSksIFR5cGVOYW1lKHR5cGVfbmFtZSkge30KKyAgCisgIFN0cmluZ1JlZiBnZXRUeXBlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGVOYW1lOyB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gQ2hlY2tWYWx1ZVR5cGU7CisgIH0KKyAgCisgIHZpcnR1YWwgYm9vbCBpc1NhZmVUb1Jlb3JkZXJXaXRoUGF0dGVyblByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc0VxdWFsSW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q2hlY2tWYWx1ZVR5cGVNYXRjaGVyPihNKS0+VHlwZU5hbWUgPT0gVHlwZU5hbWU7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0OworICBib29sIGlzQ29udHJhZGljdG9yeUltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3Q7Cit9OworICAKKyAgCisgIAorLy8vIENoZWNrQ29tcGxleFBhdE1hdGNoZXIgLSBUaGlzIG5vZGUgcnVucyB0aGUgc3BlY2lmaWVkIENvbXBsZXhQYXR0ZXJuIG9uCisvLy8gdGhlIGN1cnJlbnQgbm9kZS4KK2NsYXNzIENoZWNrQ29tcGxleFBhdE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIGNvbnN0IENvbXBsZXhQYXR0ZXJuICZQYXR0ZXJuOworICAKKyAgLy8vIE1hdGNoTnVtYmVyIC0gVGhpcyBpcyB0aGUgcmVjb3JkZWQgbm9kZXMgc2xvdCB0aGF0IGNvbnRhaW5zIHRoZSBub2RlIHdlIHdhbnQgdG8KKyAgLy8vIG1hdGNoIGFnYWluc3QuCisgIHVuc2lnbmVkIE1hdGNoTnVtYmVyOworICAKKyAgLy8vIE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbm9kZSB3ZSdyZSBtYXRjaGluZywgZm9yIGNvbW1lbnQgZW1pc3Npb24uCisgIHN0ZDo6c3RyaW5nIE5hbWU7CisgIAorICAvLy8gRmlyc3RSZXN1bHQgLSBUaGlzIGlzIHRoZSBmaXJzdCBzbG90IGluIHRoZSBSZWNvcmRlZE5vZGVzIGxpc3QgdGhhdCB0aGUKKyAgLy8vIHJlc3VsdCBvZiB0aGUgbWF0Y2ggcG9wdWxhdGVzLgorICB1bnNpZ25lZCBGaXJzdFJlc3VsdDsKK3B1YmxpYzoKKyAgQ2hlY2tDb21wbGV4UGF0TWF0Y2hlcihjb25zdCBDb21wbGV4UGF0dGVybiAmcGF0dGVybiwgdW5zaWduZWQgbWF0Y2hudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHVuc2lnbmVkIGZpcnN0cmVzdWx0KQorICAgIDogTWF0Y2hlcihDaGVja0NvbXBsZXhQYXQpLCBQYXR0ZXJuKHBhdHRlcm4pLCBNYXRjaE51bWJlcihtYXRjaG51bWJlciksCisgICAgICBOYW1lKG5hbWUpLCBGaXJzdFJlc3VsdChmaXJzdHJlc3VsdCkge30KKyAgCisgIGNvbnN0IENvbXBsZXhQYXR0ZXJuICZnZXRQYXR0ZXJuKCkgY29uc3QgeyByZXR1cm4gUGF0dGVybjsgfQorICB1bnNpZ25lZCBnZXRNYXRjaE51bWJlcigpIGNvbnN0IHsgcmV0dXJuIE1hdGNoTnVtYmVyOyB9CisgIAorICBjb25zdCBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICB1bnNpZ25lZCBnZXRGaXJzdFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIEZpcnN0UmVzdWx0OyB9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBDaGVja0NvbXBsZXhQYXQ7CisgIH0KKyAgCisgIC8vIE5vdCBzYWZlIHRvIG1vdmUgYSBwYXR0ZXJuIHByZWRpY2F0ZSBwYXN0IGEgY29tcGxleCBwYXR0ZXJuLgorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gJmNhc3Q8Q2hlY2tDb21wbGV4UGF0TWF0Y2hlcj4oTSktPlBhdHRlcm4gPT0gJlBhdHRlcm4gJiYKKyAgICAgICAgICAgY2FzdDxDaGVja0NvbXBsZXhQYXRNYXRjaGVyPihNKS0+TWF0Y2hOdW1iZXIgPT0gTWF0Y2hOdW1iZXI7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKShpbnRwdHJfdCkmUGF0dGVybiBeIE1hdGNoTnVtYmVyOworICB9Cit9OworICAKKy8vLyBDaGVja0FuZEltbU1hdGNoZXIgLSBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBhbiAnYW5kJworLy8vIHdpdGggc29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdGhlIHNwZWNpZmllZCBpbW1lZGlhdGUuCitjbGFzcyBDaGVja0FuZEltbU1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIGludDY0X3QgVmFsdWU7CitwdWJsaWM6CisgIENoZWNrQW5kSW1tTWF0Y2hlcihpbnQ2NF90IHZhbHVlKQorICAgIDogTWF0Y2hlcihDaGVja0FuZEltbSksIFZhbHVlKHZhbHVlKSB7fQorICAKKyAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBDaGVja0FuZEltbTsKKyAgfQorICAKKyAgdmlydHVhbCBib29sIGlzU2FmZVRvUmVvcmRlcldpdGhQYXR0ZXJuUHJlZGljYXRlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDaGVja0FuZEltbU1hdGNoZXI+KE0pLT5WYWx1ZSA9PSBWYWx1ZTsKKyAgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEhhc2hJbXBsKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KK307CisKKy8vLyBDaGVja09ySW1tTWF0Y2hlciAtIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgY3VycmVudCBub2RlIGlzIGFuICdhbmQnCisvLy8gd2l0aCBzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0aGUgc3BlY2lmaWVkIGltbWVkaWF0ZS4KK2NsYXNzIENoZWNrT3JJbW1NYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworICBpbnQ2NF90IFZhbHVlOworcHVibGljOgorICBDaGVja09ySW1tTWF0Y2hlcihpbnQ2NF90IHZhbHVlKQorICAgIDogTWF0Y2hlcihDaGVja09ySW1tKSwgVmFsdWUodmFsdWUpIHt9CisgIAorICBpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBDaGVja09ySW1tOworICB9CisgIAorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENoZWNrT3JJbW1NYXRjaGVyPihNKS0+VmFsdWUgPT0gVmFsdWU7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9Cit9OworCisvLy8gQ2hlY2tGb2xkYWJsZUNoYWluTm9kZU1hdGNoZXIgLSBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIGN1cnJlbnQgbm9kZQorLy8vICh3aGljaCBkZWZpbmVzIGEgY2hhaW4gb3BlcmFuZCkgaXMgc2FmZSB0byBmb2xkIGludG8gYSBsYXJnZXIgcGF0dGVybi4KK2NsYXNzIENoZWNrRm9sZGFibGVDaGFpbk5vZGVNYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworcHVibGljOgorICBDaGVja0ZvbGRhYmxlQ2hhaW5Ob2RlTWF0Y2hlcigpCisgICAgOiBNYXRjaGVyKENoZWNrRm9sZGFibGVDaGFpbk5vZGUpIHt9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBDaGVja0ZvbGRhYmxlQ2hhaW5Ob2RlOworICB9CisgIAorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEhhc2hJbXBsKCkgY29uc3QgeyByZXR1cm4gMDsgfQorfTsKKworLy8vIEVtaXRJbnRlZ2VyTWF0Y2hlciAtIFRoaXMgY3JlYXRlcyBhIG5ldyBUYXJnZXRDb25zdGFudC4KK2NsYXNzIEVtaXRJbnRlZ2VyTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyIHsKKyAgaW50NjRfdCBWYWw7CisgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUOworcHVibGljOgorICBFbWl0SW50ZWdlck1hdGNoZXIoaW50NjRfdCB2YWwsIE1WVDo6U2ltcGxlVmFsdWVUeXBlIHZ0KQorICAgIDogTWF0Y2hlcihFbWl0SW50ZWdlciksIFZhbCh2YWwpLCBWVCh2dCkge30KKyAgCisgIGludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0VlQoKSBjb25zdCB7IHJldHVybiBWVDsgfQorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gRW1pdEludGVnZXI7CisgIH0KKyAgCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFbWl0SW50ZWdlck1hdGNoZXI+KE0pLT5WYWwgPT0gVmFsICYmCisgICAgICAgICAgIGNhc3Q8RW1pdEludGVnZXJNYXRjaGVyPihNKS0+VlQgPT0gVlQ7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0IHsgcmV0dXJuIChWYWwgPDwgNCkgfCBWVDsgfQorfTsKKworLy8vIEVtaXRTdHJpbmdJbnRlZ2VyTWF0Y2hlciAtIEEgdGFyZ2V0IGNvbnN0YW50IHdob3NlIHZhbHVlIGlzIHJlcHJlc2VudGVkCisvLy8gYnkgYSBzdHJpbmcuCitjbGFzcyBFbWl0U3RyaW5nSW50ZWdlck1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIHN0ZDo6c3RyaW5nIFZhbDsKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQ7CitwdWJsaWM6CisgIEVtaXRTdHJpbmdJbnRlZ2VyTWF0Y2hlcihjb25zdCBzdGQ6OnN0cmluZyAmdmFsLCBNVlQ6OlNpbXBsZVZhbHVlVHlwZSB2dCkKKyAgICA6IE1hdGNoZXIoRW1pdFN0cmluZ0ludGVnZXIpLCBWYWwodmFsKSwgVlQodnQpIHt9CisgIAorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0VlQoKSBjb25zdCB7IHJldHVybiBWVDsgfQorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gRW1pdFN0cmluZ0ludGVnZXI7CisgIH0KKyAgCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFbWl0U3RyaW5nSW50ZWdlck1hdGNoZXI+KE0pLT5WYWwgPT0gVmFsICYmCisgICAgICAgICAgIGNhc3Q8RW1pdFN0cmluZ0ludGVnZXJNYXRjaGVyPihNKS0+VlQgPT0gVlQ7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0OworfTsKKyAgCisvLy8gRW1pdFJlZ2lzdGVyTWF0Y2hlciAtIFRoaXMgY3JlYXRlcyBhIG5ldyBUYXJnZXRDb25zdGFudC4KK2NsYXNzIEVtaXRSZWdpc3Rlck1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIC8vLyBSZWcgLSBUaGUgZGVmIGZvciB0aGUgcmVnaXN0ZXIgdGhhdCB3ZSdyZSBlbWl0dGluZy4gIElmIHRoaXMgaXMgbnVsbCwgdGhlbgorICAvLy8gdGhpcyBpcyBhIHJlZmVyZW5jZSB0byB6ZXJvX3JlZy4KKyAgUmVjb3JkICpSZWc7CisgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUOworcHVibGljOgorICBFbWl0UmVnaXN0ZXJNYXRjaGVyKFJlY29yZCAqcmVnLCBNVlQ6OlNpbXBsZVZhbHVlVHlwZSB2dCkKKyAgICA6IE1hdGNoZXIoRW1pdFJlZ2lzdGVyKSwgUmVnKHJlZyksIFZUKHZ0KSB7fQorICAKKyAgUmVjb3JkICpnZXRSZWcoKSBjb25zdCB7IHJldHVybiBSZWc7IH0KKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZ2V0VlQoKSBjb25zdCB7IHJldHVybiBWVDsgfQorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gRW1pdFJlZ2lzdGVyOworICB9CisgIAorcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc0VxdWFsSW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8RW1pdFJlZ2lzdGVyTWF0Y2hlcj4oTSktPlJlZyA9PSBSZWcgJiYKKyAgICAgICAgICAgY2FzdDxFbWl0UmVnaXN0ZXJNYXRjaGVyPihNKS0+VlQgPT0gVlQ7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKCh1bnNpZ25lZCkoaW50cHRyX3QpUmVnKSA8PCA0IHwgVlQ7CisgIH0KK307CisKKy8vLyBFbWl0Q29udmVydFRvVGFyZ2V0TWF0Y2hlciAtIEVtaXQgYW4gb3BlcmF0aW9uIHRoYXQgcmVhZHMgYSBzcGVjaWZpZWQKKy8vLyByZWNvcmRlZCBub2RlIGFuZCBjb252ZXJ0cyBpdCBmcm9tIGJlaW5nIGEgSVNEOjpDb25zdGFudCB0bworLy8vIElTRDo6VGFyZ2V0Q29uc3RhbnQsIGxpa2V3aXNlIGZvciBDb25zdGFudEZQLgorY2xhc3MgRW1pdENvbnZlcnRUb1RhcmdldE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlciB7CisgIHVuc2lnbmVkIFNsb3Q7CitwdWJsaWM6CisgIEVtaXRDb252ZXJ0VG9UYXJnZXRNYXRjaGVyKHVuc2lnbmVkIHNsb3QpCisgICAgOiBNYXRjaGVyKEVtaXRDb252ZXJ0VG9UYXJnZXQpLCBTbG90KHNsb3QpIHt9CisgIAorICB1bnNpZ25lZCBnZXRTbG90KCkgY29uc3QgeyByZXR1cm4gU2xvdDsgfQorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gRW1pdENvbnZlcnRUb1RhcmdldDsKKyAgfQorICAKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEVtaXRDb252ZXJ0VG9UYXJnZXRNYXRjaGVyPihNKS0+U2xvdCA9PSBTbG90OworICB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdCB7IHJldHVybiBTbG90OyB9Cit9OworICAKKy8vLyBFbWl0TWVyZ2VJbnB1dENoYWluc01hdGNoZXIgLSBFbWl0IGEgbm9kZSB0aGF0IG1lcmdlcyBhIGxpc3Qgb2YgaW5wdXQKKy8vLyBjaGFpbnMgdG9nZXRoZXIgd2l0aCBhIHRva2VuIGZhY3Rvci4gIFRoZSBsaXN0IG9mIG5vZGVzIGFyZSB0aGUgbm9kZXMgaW4gdGhlCisvLy8gbWF0Y2hlZCBwYXR0ZXJuIHRoYXQgaGF2ZSBjaGFpbiBpbnB1dC9vdXRwdXRzLiAgVGhpcyBub2RlIGFkZHMgYWxsIGlucHV0CisvLy8gY2hhaW5zIG9mIHRoZXNlIG5vZGVzIGlmIHRoZXkgYXJlIG5vdCB0aGVtc2VsdmVzIGEgbm9kZSBpbiB0aGUgcGF0dGVybi4KK2NsYXNzIEVtaXRNZXJnZUlucHV0Q2hhaW5zTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyIHsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDM+IENoYWluTm9kZXM7CitwdWJsaWM6CisgIEVtaXRNZXJnZUlucHV0Q2hhaW5zTWF0Y2hlcihjb25zdCB1bnNpZ25lZCAqbm9kZXMsIHVuc2lnbmVkIE51bU5vZGVzKQorICAgIDogTWF0Y2hlcihFbWl0TWVyZ2VJbnB1dENoYWlucyksIENoYWluTm9kZXMobm9kZXMsIG5vZGVzK051bU5vZGVzKSB7fQorICAKKyAgdW5zaWduZWQgZ2V0TnVtTm9kZXMoKSBjb25zdCB7IHJldHVybiBDaGFpbk5vZGVzLnNpemUoKTsgfQorICAKKyAgdW5zaWduZWQgZ2V0Tm9kZSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBDaGFpbk5vZGVzLnNpemUoKSk7CisgICAgcmV0dXJuIENoYWluTm9kZXNbaV07CisgIH0gIAorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gRW1pdE1lcmdlSW5wdXRDaGFpbnM7CisgIH0KKyAgCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFbWl0TWVyZ2VJbnB1dENoYWluc01hdGNoZXI+KE0pLT5DaGFpbk5vZGVzID09IENoYWluTm9kZXM7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0OworfTsKKyAgCisvLy8gRW1pdENvcHlUb1JlZ01hdGNoZXIgLSBFbWl0IGEgQ29weVRvUmVnIG5vZGUgZnJvbSBhIHZhbHVlIHRvIGEgcGh5c3JlZywKKy8vLyBwdXNoaW5nIHRoZSBjaGFpbiBhbmQgZmxhZyByZXN1bHRzLgorLy8vCitjbGFzcyBFbWl0Q29weVRvUmVnTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyIHsKKyAgdW5zaWduZWQgU3JjU2xvdDsgLy8gVmFsdWUgdG8gY29weSBpbnRvIHRoZSBwaHlzcmVnLgorICBSZWNvcmQgKkRlc3RQaHlzUmVnOworcHVibGljOgorICBFbWl0Q29weVRvUmVnTWF0Y2hlcih1bnNpZ25lZCBzcmNTbG90LCBSZWNvcmQgKmRlc3RQaHlzUmVnKQorICAgIDogTWF0Y2hlcihFbWl0Q29weVRvUmVnKSwgU3JjU2xvdChzcmNTbG90KSwgRGVzdFBoeXNSZWcoZGVzdFBoeXNSZWcpIHt9CisgIAorICB1bnNpZ25lZCBnZXRTcmNTbG90KCkgY29uc3QgeyByZXR1cm4gU3JjU2xvdDsgfQorICBSZWNvcmQgKmdldERlc3RQaHlzUmVnKCkgY29uc3QgeyByZXR1cm4gRGVzdFBoeXNSZWc7IH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1hdGNoZXIgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0S2luZCgpID09IEVtaXRDb3B5VG9SZWc7CisgIH0KKyAgCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFbWl0Q29weVRvUmVnTWF0Y2hlcj4oTSktPlNyY1Nsb3QgPT0gU3JjU2xvdCAmJgorICAgICAgICAgICBjYXN0PEVtaXRDb3B5VG9SZWdNYXRjaGVyPihNKS0+RGVzdFBoeXNSZWcgPT0gRGVzdFBoeXNSZWc7IAorICB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIFNyY1Nsb3QgXiAoKHVuc2lnbmVkKShpbnRwdHJfdClEZXN0UGh5c1JlZyA8PCA0KTsKKyAgfQorfTsKKyAgCisgICAgCisgIAorLy8vIEVtaXROb2RlWEZvcm1NYXRjaGVyIC0gRW1pdCBhbiBvcGVyYXRpb24gdGhhdCBydW5zIGFuIFNETm9kZVhGb3JtIG9uIGEKKy8vLyByZWNvcmRlZCBub2RlIGFuZCByZWNvcmRzIHRoZSByZXN1bHQuCitjbGFzcyBFbWl0Tm9kZVhGb3JtTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyIHsKKyAgdW5zaWduZWQgU2xvdDsKKyAgUmVjb3JkICpOb2RlWEZvcm07CitwdWJsaWM6CisgIEVtaXROb2RlWEZvcm1NYXRjaGVyKHVuc2lnbmVkIHNsb3QsIFJlY29yZCAqbm9kZVhGb3JtKQorICAgIDogTWF0Y2hlcihFbWl0Tm9kZVhGb3JtKSwgU2xvdChzbG90KSwgTm9kZVhGb3JtKG5vZGVYRm9ybSkge30KKyAgCisgIHVuc2lnbmVkIGdldFNsb3QoKSBjb25zdCB7IHJldHVybiBTbG90OyB9CisgIFJlY29yZCAqZ2V0Tm9kZVhGb3JtKCkgY29uc3QgeyByZXR1cm4gTm9kZVhGb3JtOyB9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBFbWl0Tm9kZVhGb3JtOworICB9CisgIAorcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc0VxdWFsSW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8RW1pdE5vZGVYRm9ybU1hdGNoZXI+KE0pLT5TbG90ID09IFNsb3QgJiYKKyAgICAgICAgICAgY2FzdDxFbWl0Tm9kZVhGb3JtTWF0Y2hlcj4oTSktPk5vZGVYRm9ybSA9PSBOb2RlWEZvcm07IAorICB9CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIFNsb3QgXiAoKHVuc2lnbmVkKShpbnRwdHJfdClOb2RlWEZvcm0gPDwgNCk7CisgIH0KK307CisgIAorLy8vIEVtaXROb2RlTWF0Y2hlckNvbW1vbiAtIENvbW1vbiBjbGFzcyBzaGFyZWQgYmV0d2VlbiBFbWl0Tm9kZSBhbmQKKy8vLyBNb3JwaE5vZGVUby4KK2NsYXNzIEVtaXROb2RlTWF0Y2hlckNvbW1vbiA6IHB1YmxpYyBNYXRjaGVyIHsKKyAgc3RkOjpzdHJpbmcgT3Bjb2RlTmFtZTsKKyAgY29uc3QgU21hbGxWZWN0b3I8TVZUOjpTaW1wbGVWYWx1ZVR5cGUsIDM+IFZUczsKKyAgY29uc3QgU21hbGxWZWN0b3I8dW5zaWduZWQsIDY+IE9wZXJhbmRzOworICBib29sIEhhc0NoYWluLCBIYXNJbkZsYWcsIEhhc091dEZsYWcsIEhhc01lbVJlZnM7CisgIAorICAvLy8gTnVtRml4ZWRBcml0eU9wZXJhbmRzIC0gSWYgdGhpcyBpcyBhIGZpeGVkIGFyaXR5IG5vZGUsIHRoaXMgaXMgc2V0IHRvIC0xLgorICAvLy8gSWYgdGhpcyBpcyBhIHZhcmlkaWMgbm9kZSwgdGhpcyBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBmaXhlZCBhcml0eQorICAvLy8gb3BlcmFuZHMgaW4gdGhlIHJvb3Qgb2YgdGhlIHBhdHRlcm4uICBUaGUgcmVzdCBhcmUgYXBwZW5kZWQgdG8gdGhpcyBub2RlLgorICBpbnQgTnVtRml4ZWRBcml0eU9wZXJhbmRzOworcHVibGljOgorICBFbWl0Tm9kZU1hdGNoZXJDb21tb24oY29uc3Qgc3RkOjpzdHJpbmcgJm9wY29kZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNVlQ6OlNpbXBsZVZhbHVlVHlwZSAqdnRzLCB1bnNpZ25lZCBudW12dHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqb3BlcmFuZHMsIHVuc2lnbmVkIG51bW9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzQ2hhaW4sIGJvb2wgaGFzSW5GbGFnLCBib29sIGhhc091dEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc21lbXJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtZml4ZWRhcml0eW9wZXJhbmRzLCBib29sIGlzTW9ycGhOb2RlVG8pCisgICAgOiBNYXRjaGVyKGlzTW9ycGhOb2RlVG8gPyBNb3JwaE5vZGVUbyA6IEVtaXROb2RlKSwgT3Bjb2RlTmFtZShvcGNvZGVOYW1lKSwKKyAgICAgIFZUcyh2dHMsIHZ0cytudW12dHMpLCBPcGVyYW5kcyhvcGVyYW5kcywgb3BlcmFuZHMrbnVtb3BzKSwKKyAgICAgIEhhc0NoYWluKGhhc0NoYWluKSwgSGFzSW5GbGFnKGhhc0luRmxhZyksIEhhc091dEZsYWcoaGFzT3V0RmxhZyksCisgICAgICBIYXNNZW1SZWZzKGhhc21lbXJlZnMpLCBOdW1GaXhlZEFyaXR5T3BlcmFuZHMobnVtZml4ZWRhcml0eW9wZXJhbmRzKSB7fQorICAKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE9wY29kZU5hbWUoKSBjb25zdCB7IHJldHVybiBPcGNvZGVOYW1lOyB9CisgIAorICB1bnNpZ25lZCBnZXROdW1WVHMoKSBjb25zdCB7IHJldHVybiBWVHMuc2l6ZSgpOyB9CisgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIGdldFZUKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IFZUcy5zaXplKCkpOworICAgIHJldHVybiBWVHNbaV07CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRzLnNpemUoKTsgfQorICB1bnNpZ25lZCBnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE9wZXJhbmRzLnNpemUoKSk7CisgICAgcmV0dXJuIE9wZXJhbmRzW2ldOworICB9CisgIAorICBjb25zdCBTbWFsbFZlY3RvckltcGw8TVZUOjpTaW1wbGVWYWx1ZVR5cGU+ICZnZXRWVExpc3QoKSBjb25zdCB7IHJldHVybiBWVHM7IH0KKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmZ2V0T3BlcmFuZExpc3QoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kczsgfQorCisgIAorICBib29sIGhhc0NoYWluKCkgY29uc3QgeyByZXR1cm4gSGFzQ2hhaW47IH0KKyAgYm9vbCBoYXNJbkZsYWcoKSBjb25zdCB7IHJldHVybiBIYXNJbkZsYWc7IH0KKyAgYm9vbCBoYXNPdXRGbGFnKCkgY29uc3QgeyByZXR1cm4gSGFzT3V0RmxhZzsgfQorICBib29sIGhhc01lbVJlZnMoKSBjb25zdCB7IHJldHVybiBIYXNNZW1SZWZzOyB9CisgIGludCBnZXROdW1GaXhlZEFyaXR5T3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBOdW1GaXhlZEFyaXR5T3BlcmFuZHM7IH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1hdGNoZXIgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0S2luZCgpID09IEVtaXROb2RlIHx8IE4tPmdldEtpbmQoKSA9PSBNb3JwaE5vZGVUbzsKKyAgfQorICAKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBwcmludEltcGwocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgaXNFcXVhbEltcGwoY29uc3QgTWF0Y2hlciAqTSkgY29uc3Q7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SGFzaEltcGwoKSBjb25zdDsKK307CisgIAorLy8vIEVtaXROb2RlTWF0Y2hlciAtIFRoaXMgc2lnbmFscyBhIHN1Y2Nlc3NmdWwgbWF0Y2ggYW5kIGdlbmVyYXRlcyBhIG5vZGUuCitjbGFzcyBFbWl0Tm9kZU1hdGNoZXIgOiBwdWJsaWMgRW1pdE5vZGVNYXRjaGVyQ29tbW9uIHsKKyAgdW5zaWduZWQgRmlyc3RSZXN1bHRTbG90OworcHVibGljOgorICBFbWl0Tm9kZU1hdGNoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJm9wY29kZU5hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBNVlQ6OlNpbXBsZVZhbHVlVHlwZSAqdnRzLCB1bnNpZ25lZCBudW12dHMsCisgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqb3BlcmFuZHMsIHVuc2lnbmVkIG51bW9wcywKKyAgICAgICAgICAgICAgICAgIGJvb2wgaGFzQ2hhaW4sIGJvb2wgaGFzSW5GbGFnLCBib29sIGhhc091dEZsYWcsCisgICAgICAgICAgICAgICAgICBib29sIGhhc21lbXJlZnMsCisgICAgICAgICAgICAgICAgICBpbnQgbnVtZml4ZWRhcml0eW9wZXJhbmRzLCB1bnNpZ25lZCBmaXJzdHJlc3VsdHNsb3QpCisgIDogRW1pdE5vZGVNYXRjaGVyQ29tbW9uKG9wY29kZU5hbWUsIHZ0cywgbnVtdnRzLCBvcGVyYW5kcywgbnVtb3BzLCBoYXNDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW5GbGFnLCBoYXNPdXRGbGFnLCBoYXNtZW1yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudW1maXhlZGFyaXR5b3BlcmFuZHMsIGZhbHNlKSwKKyAgICBGaXJzdFJlc3VsdFNsb3QoZmlyc3RyZXN1bHRzbG90KSB7fQorICAKKyAgdW5zaWduZWQgZ2V0Rmlyc3RSZXN1bHRTbG90KCkgY29uc3QgeyByZXR1cm4gRmlyc3RSZXN1bHRTbG90OyB9CisgIAorICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBNYXRjaGVyICpOKSB7CisgICAgcmV0dXJuIE4tPmdldEtpbmQoKSA9PSBFbWl0Tm9kZTsKKyAgfQorICAKK307CisgIAorY2xhc3MgTW9ycGhOb2RlVG9NYXRjaGVyIDogcHVibGljIEVtaXROb2RlTWF0Y2hlckNvbW1vbiB7CisgIGNvbnN0IFBhdHRlcm5Ub01hdGNoICZQYXR0ZXJuOworcHVibGljOgorICBNb3JwaE5vZGVUb01hdGNoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJm9wY29kZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNVlQ6OlNpbXBsZVZhbHVlVHlwZSAqdnRzLCB1bnNpZ25lZCBudW12dHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqb3BlcmFuZHMsIHVuc2lnbmVkIG51bW9wcywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzQ2hhaW4sIGJvb2wgaGFzSW5GbGFnLCBib29sIGhhc091dEZsYWcsCisgICAgICAgICAgICAgICAgICAgICBib29sIGhhc21lbXJlZnMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtZml4ZWRhcml0eW9wZXJhbmRzLCBjb25zdCBQYXR0ZXJuVG9NYXRjaCAmcGF0dGVybikKKyAgICA6IEVtaXROb2RlTWF0Y2hlckNvbW1vbihvcGNvZGVOYW1lLCB2dHMsIG51bXZ0cywgb3BlcmFuZHMsIG51bW9wcywgaGFzQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW5GbGFnLCBoYXNPdXRGbGFnLCBoYXNtZW1yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWZpeGVkYXJpdHlvcGVyYW5kcywgdHJ1ZSksCisgICAgICBQYXR0ZXJuKHBhdHRlcm4pIHsKKyAgfQorICAKKyAgY29uc3QgUGF0dGVyblRvTWF0Y2ggJmdldFBhdHRlcm4oKSBjb25zdCB7IHJldHVybiBQYXR0ZXJuOyB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gTW9ycGhOb2RlVG87CisgIH0KK307CisgIAorLy8vIE1hcmtGbGFnUmVzdWx0c01hdGNoZXIgLSBUaGlzIG5vZGUgaW5kaWNhdGVzIHdoaWNoIG5vbi1yb290IG5vZGVzIGluIHRoZQorLy8vIHBhdHRlcm4gcHJvZHVjZSBmbGFncy4gIFRoaXMgYWxsb3dzIENvbXBsZXRlTWF0Y2hNYXRjaGVyIHRvIHVwZGF0ZSB0aGVtCisvLy8gd2l0aCB0aGUgb3V0cHV0IGZsYWcgb2YgdGhlIHJlc3VsdGFudCBjb2RlLgorY2xhc3MgTWFya0ZsYWdSZXN1bHRzTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyIHsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDM+IEZsYWdSZXN1bHROb2RlczsKK3B1YmxpYzoKKyAgTWFya0ZsYWdSZXN1bHRzTWF0Y2hlcihjb25zdCB1bnNpZ25lZCAqbm9kZXMsIHVuc2lnbmVkIE51bU5vZGVzKQorICAgIDogTWF0Y2hlcihNYXJrRmxhZ1Jlc3VsdHMpLCBGbGFnUmVzdWx0Tm9kZXMobm9kZXMsIG5vZGVzK051bU5vZGVzKSB7fQorICAKKyAgdW5zaWduZWQgZ2V0TnVtTm9kZXMoKSBjb25zdCB7IHJldHVybiBGbGFnUmVzdWx0Tm9kZXMuc2l6ZSgpOyB9CisgIAorICB1bnNpZ25lZCBnZXROb2RlKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IEZsYWdSZXN1bHROb2Rlcy5zaXplKCkpOworICAgIHJldHVybiBGbGFnUmVzdWx0Tm9kZXNbaV07CisgIH0gIAorICAKKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgTWF0Y2hlciAqTikgeworICAgIHJldHVybiBOLT5nZXRLaW5kKCkgPT0gTWFya0ZsYWdSZXN1bHRzOworICB9CisgIAorcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIGluZGVudCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc0VxdWFsSW1wbChjb25zdCBNYXRjaGVyICpNKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8TWFya0ZsYWdSZXN1bHRzTWF0Y2hlcj4oTSktPkZsYWdSZXN1bHROb2RlcyA9PSBGbGFnUmVzdWx0Tm9kZXM7CisgIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRIYXNoSW1wbCgpIGNvbnN0OworfTsKKworLy8vIENvbXBsZXRlTWF0Y2hNYXRjaGVyIC0gQ29tcGxldGUgYSBtYXRjaCBieSByZXBsYWNpbmcgdGhlIHJlc3VsdHMgb2YgdGhlCisvLy8gcGF0dGVybiB3aXRoIHRoZSBuZXdseSBnZW5lcmF0ZWQgbm9kZXMuICBUaGlzIGFsc28gcHJpbnRzIGEgY29tbWVudAorLy8vIGluZGljYXRpbmcgdGhlIHNvdXJjZSBhbmQgZGVzdCBwYXR0ZXJucy4KK2NsYXNzIENvbXBsZXRlTWF0Y2hNYXRjaGVyIDogcHVibGljIE1hdGNoZXIgeworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMj4gUmVzdWx0czsKKyAgY29uc3QgUGF0dGVyblRvTWF0Y2ggJlBhdHRlcm47CitwdWJsaWM6CisgIENvbXBsZXRlTWF0Y2hNYXRjaGVyKGNvbnN0IHVuc2lnbmVkICpyZXN1bHRzLCB1bnNpZ25lZCBudW1yZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXR0ZXJuVG9NYXRjaCAmcGF0dGVybikKKyAgOiBNYXRjaGVyKENvbXBsZXRlTWF0Y2gpLCBSZXN1bHRzKHJlc3VsdHMsIHJlc3VsdHMrbnVtcmVzdWx0cyksCisgICAgUGF0dGVybihwYXR0ZXJuKSB7fQorCisgIHVuc2lnbmVkIGdldE51bVJlc3VsdHMoKSBjb25zdCB7IHJldHVybiBSZXN1bHRzLnNpemUoKTsgfQorICB1bnNpZ25lZCBnZXRSZXN1bHQodW5zaWduZWQgUikgY29uc3QgeyByZXR1cm4gUmVzdWx0c1tSXTsgfQorICBjb25zdCBQYXR0ZXJuVG9NYXRjaCAmZ2V0UGF0dGVybigpIGNvbnN0IHsgcmV0dXJuIFBhdHRlcm47IH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IE1hdGNoZXIgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0S2luZCgpID09IENvbXBsZXRlTWF0Y2g7CisgIH0KKyAgCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50KSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzRXF1YWxJbXBsKGNvbnN0IE1hdGNoZXIgKk0pIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDb21wbGV0ZU1hdGNoTWF0Y2hlcj4oTSktPlJlc3VsdHMgPT0gUmVzdWx0cyAmJgorICAgICAgICAgICZjYXN0PENvbXBsZXRlTWF0Y2hNYXRjaGVyPihNKS0+UGF0dGVybiA9PSAmUGF0dGVybjsKKyAgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEhhc2hJbXBsKCkgY29uc3Q7Cit9OworIAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9EQUdJU2VsTWF0Y2hlckVtaXR0ZXIuY3BwIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vREFHSVNlbE1hdGNoZXJFbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmJmZTgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vREFHSVNlbE1hdGNoZXJFbWl0dGVyLmNwcApAQCAtMCwwICsxLDc5NSBAQAorLy89PT0tIERBR0lTZWxNYXRjaGVyRW1pdHRlci5jcHAgLSBNYXRjaGVyIEVtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY29kZSB0byBnZW5lcmF0ZSBDKysgY29kZSBmb3IgYSBtYXRjaGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJEQUdJU2VsTWF0Y2hlci5oIgorI2luY2x1ZGUgIkNvZGVHZW5EQUdQYXR0ZXJucy5oIgorI2luY2x1ZGUgIlJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworZW51bSB7CisgIENvbW1lbnRJbmRlbnQgPSAzMAorfTsKKworLy8gVG8gcmVkdWNlIGdlbmVyYXRlZCBzb3VyY2UgY29kZSBzaXplLgorc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK09taXRDb21tZW50cygib21pdC1jb21tZW50cyIsIGNsOjpkZXNjKCJEbyBub3QgZ2VuZXJhdGUgY29tbWVudHMiKSwKKyAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSkpOworCituYW1lc3BhY2UgeworY2xhc3MgTWF0Y2hlclRhYmxlRW1pdHRlciB7CisgIGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmQ0dQOworICBTdHJpbmdNYXA8dW5zaWduZWQ+IE5vZGVQcmVkaWNhdGVNYXAsIFBhdHRlcm5QcmVkaWNhdGVNYXA7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBOb2RlUHJlZGljYXRlcywgUGF0dGVyblByZWRpY2F0ZXM7CisKKyAgRGVuc2VNYXA8Y29uc3QgQ29tcGxleFBhdHRlcm4qLCB1bnNpZ25lZD4gQ29tcGxleFBhdHRlcm5NYXA7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IENvbXBsZXhQYXR0ZXJuKj4gQ29tcGxleFBhdHRlcm5zOworCisKKyAgRGVuc2VNYXA8UmVjb3JkKiwgdW5zaWduZWQ+IE5vZGVYRm9ybU1hcDsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gTm9kZVhGb3JtczsKKworcHVibGljOgorICBNYXRjaGVyVGFibGVFbWl0dGVyKGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmY2dwKSA6IENHUChjZ3ApIHt9CisKKyAgdW5zaWduZWQgRW1pdE1hdGNoZXJMaXN0KGNvbnN0IE1hdGNoZXIgKk4sIHVuc2lnbmVkIEluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN0YXJ0SWR4LCBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk9TKTsKKyAgCisgIHZvaWQgRW1pdFByZWRpY2F0ZUZ1bmN0aW9ucyhmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk9TKTsKKyAgCisgIHZvaWQgRW1pdEhpc3RvZ3JhbShjb25zdCBNYXRjaGVyICpOLCBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk9TKTsKK3ByaXZhdGU6CisgIHVuc2lnbmVkIEVtaXRNYXRjaGVyKGNvbnN0IE1hdGNoZXIgKk4sIHVuc2lnbmVkIEluZGVudCwgdW5zaWduZWQgQ3VycmVudElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZPUyk7CisgIAorICB1bnNpZ25lZCBnZXROb2RlUHJlZGljYXRlKFN0cmluZ1JlZiBQcmVkTmFtZSkgeworICAgIHVuc2lnbmVkICZFbnRyeSA9IE5vZGVQcmVkaWNhdGVNYXBbUHJlZE5hbWVdOworICAgIGlmIChFbnRyeSA9PSAwKSB7CisgICAgICBOb2RlUHJlZGljYXRlcy5wdXNoX2JhY2soUHJlZE5hbWUuc3RyKCkpOworICAgICAgRW50cnkgPSBOb2RlUHJlZGljYXRlcy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBFbnRyeS0xOworICB9CisgIHVuc2lnbmVkIGdldFBhdHRlcm5QcmVkaWNhdGUoU3RyaW5nUmVmIFByZWROYW1lKSB7CisgICAgdW5zaWduZWQgJkVudHJ5ID0gUGF0dGVyblByZWRpY2F0ZU1hcFtQcmVkTmFtZV07CisgICAgaWYgKEVudHJ5ID09IDApIHsKKyAgICAgIFBhdHRlcm5QcmVkaWNhdGVzLnB1c2hfYmFjayhQcmVkTmFtZS5zdHIoKSk7CisgICAgICBFbnRyeSA9IFBhdHRlcm5QcmVkaWNhdGVzLnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIEVudHJ5LTE7CisgIH0KKyAgCisgIHVuc2lnbmVkIGdldENvbXBsZXhQYXQoY29uc3QgQ29tcGxleFBhdHRlcm4gJlApIHsKKyAgICB1bnNpZ25lZCAmRW50cnkgPSBDb21wbGV4UGF0dGVybk1hcFsmUF07CisgICAgaWYgKEVudHJ5ID09IDApIHsKKyAgICAgIENvbXBsZXhQYXR0ZXJucy5wdXNoX2JhY2soJlApOworICAgICAgRW50cnkgPSBDb21wbGV4UGF0dGVybnMuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gRW50cnktMTsKKyAgfQorICAKKyAgdW5zaWduZWQgZ2V0Tm9kZVhGb3JtSUQoUmVjb3JkICpSZWMpIHsKKyAgICB1bnNpZ25lZCAmRW50cnkgPSBOb2RlWEZvcm1NYXBbUmVjXTsKKyAgICBpZiAoRW50cnkgPT0gMCkgeworICAgICAgTm9kZVhGb3Jtcy5wdXNoX2JhY2soUmVjKTsKKyAgICAgIEVudHJ5ID0gTm9kZVhGb3Jtcy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBFbnRyeS0xOworICB9CisgIAorfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKK3N0YXRpYyB1bnNpZ25lZCBHZXRWQlJTaXplKHVuc2lnbmVkIFZhbCkgeworICBpZiAoVmFsIDw9IDEyNykgcmV0dXJuIDE7CisgIAorICB1bnNpZ25lZCBOdW1CeXRlcyA9IDA7CisgIHdoaWxlIChWYWwgPj0gMTI4KSB7CisgICAgVmFsID4+PSA3OworICAgICsrTnVtQnl0ZXM7CisgIH0KKyAgcmV0dXJuIE51bUJ5dGVzKzE7Cit9CisKKy8vLyBFbWl0VkJSVmFsdWUgLSBFbWl0IHRoZSBzcGVjaWZpZWQgdmFsdWUgYXMgYSBWQlIsIHJldHVybmluZyB0aGUgbnVtYmVyIG9mCisvLy8gYnl0ZXMgZW1pdHRlZC4KK3N0YXRpYyB1aW50NjRfdCBFbWl0VkJSVmFsdWUodWludDY0X3QgVmFsLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgaWYgKFZhbCA8PSAxMjcpIHsKKyAgICBPUyA8PCBWYWwgPDwgIiwgIjsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgdWludDY0X3QgSW5WYWwgPSBWYWw7CisgIHVuc2lnbmVkIE51bUJ5dGVzID0gMDsKKyAgd2hpbGUgKFZhbCA+PSAxMjgpIHsKKyAgICBPUyA8PCAoVmFsJjEyNykgPDwgInwxMjgsIjsKKyAgICBWYWwgPj49IDc7CisgICAgKytOdW1CeXRlczsKKyAgfQorICBPUyA8PCBWYWw7CisgIGlmICghT21pdENvbW1lbnRzKQorICAgIE9TIDw8ICIvKiIgPDwgSW5WYWwgPDwgIiovIjsKKyAgT1MgPDwgIiwgIjsKKyAgcmV0dXJuIE51bUJ5dGVzKzE7Cit9CisKKy8vLyBFbWl0TWF0Y2hlck9wY29kZXMgLSBFbWl0IGJ5dGVzIGZvciB0aGUgc3BlY2lmaWVkIG1hdGNoZXIgYW5kIHJldHVybgorLy8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgZW1pdHRlZC4KK3Vuc2lnbmVkIE1hdGNoZXJUYWJsZUVtaXR0ZXI6OgorRW1pdE1hdGNoZXIoY29uc3QgTWF0Y2hlciAqTiwgdW5zaWduZWQgSW5kZW50LCB1bnNpZ25lZCBDdXJyZW50SWR4LAorICAgICAgICAgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZPUykgeworICBPUy5QYWRUb0NvbHVtbihJbmRlbnQqMik7CisgIAorICBzd2l0Y2ggKE4tPmdldEtpbmQoKSkgeworICBjYXNlIE1hdGNoZXI6OlNjb3BlOiB7CisgICAgY29uc3QgU2NvcGVNYXRjaGVyICpTTSA9IGNhc3Q8U2NvcGVNYXRjaGVyPihOKTsKKyAgICBhc3NlcnQoU00tPmdldE5leHQoKSA9PSAwICYmICJTaG91bGRuJ3QgaGF2ZSBuZXh0IGFmdGVyIHNjb3BlIik7CisgICAgCisgICAgdW5zaWduZWQgU3RhcnRJZHggPSBDdXJyZW50SWR4OworICAgIAorICAgIC8vIEVtaXQgYWxsIG9mIHRoZSBjaGlsZHJlbi4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU00tPmdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIE9TIDw8ICJPUENfU2NvcGUsICI7CisgICAgICAgICsrQ3VycmVudElkeDsKKyAgICAgIH0gZWxzZSAgeworICAgICAgICBpZiAoIU9taXRDb21tZW50cykgeworICAgICAgICAgIE9TIDw8ICIvKiIgPDwgQ3VycmVudElkeCA8PCAiKi8iOworICAgICAgICAgIE9TLlBhZFRvQ29sdW1uKEluZGVudCoyKSA8PCAiLypTY29wZSovICI7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIE9TLlBhZFRvQ29sdW1uKEluZGVudCoyKTsKKyAgICAgIH0KKworICAgICAgLy8gV2UgbmVlZCB0byBlbmNvZGUgdGhlIGNoaWxkIGFuZCB0aGUgb2Zmc2V0IG9mIHRoZSBmYWlsdXJlIGNvZGUgYmVmb3JlCisgICAgICAvLyBlbWl0dGluZyBlaXRoZXIgb2YgdGhlbS4gIEhhbmRsZSB0aGlzIGJ5IGJ1ZmZlcmluZyB0aGUgb3V0cHV0IGludG8gYQorICAgICAgLy8gc3RyaW5nIHdoaWxlIHdlIGdldCB0aGUgc2l6ZS4gIFVuZm9ydHVuYXRlbHksIHRoZSBvZmZzZXQgb2YgdGhlCisgICAgICAvLyBjaGlsZHJlbiBkZXBlbmRzIG9uIHRoZSBWQlIgc2l6ZSBvZiB0aGUgY2hpbGQsIHNvIGZvciBsYXJnZSBjaGlsZHJlbiB3ZQorICAgICAgLy8gaGF2ZSB0byBpdGVyYXRlIGEgYml0LgorICAgICAgU21hbGxTdHJpbmc8MTI4PiBUbXBCdWY7CisgICAgICB1bnNpZ25lZCBDaGlsZFNpemUgPSAwOworICAgICAgdW5zaWduZWQgVkJSU2l6ZSA9IDA7CisgICAgICBkbyB7CisgICAgICAgIFZCUlNpemUgPSBHZXRWQlJTaXplKENoaWxkU2l6ZSk7CisgICAgICAgIAorICAgICAgICBUbXBCdWYuY2xlYXIoKTsKKyAgICAgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhUbXBCdWYpOworICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gRk9TKE9TKTsKKyAgICAgICAgQ2hpbGRTaXplID0gRW1pdE1hdGNoZXJMaXN0KFNNLT5nZXRDaGlsZChpKSwgSW5kZW50KzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50SWR4K1ZCUlNpemUsIEZPUyk7CisgICAgICB9IHdoaWxlIChHZXRWQlJTaXplKENoaWxkU2l6ZSkgIT0gVkJSU2l6ZSk7CisgICAgICAKKyAgICAgIGFzc2VydChDaGlsZFNpemUgIT0gMCAmJiAiU2hvdWxkIG5vdCBoYXZlIGEgemVyby1zaXplZCBjaGlsZCEiKTsKKyAgICAKKyAgICAgIEN1cnJlbnRJZHggKz0gRW1pdFZCUlZhbHVlKENoaWxkU2l6ZSwgT1MpOworICAgICAgaWYgKCFPbWl0Q29tbWVudHMpIHsKKyAgICAgICAgT1MgPDwgIi8qLT4iIDw8IEN1cnJlbnRJZHgrQ2hpbGRTaXplIDw8ICIqLyI7CisgICAgICAKKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICBPUy5QYWRUb0NvbHVtbihDb21tZW50SW5kZW50KSA8PCAiLy8gIiA8PCBTTS0+Z2V0TnVtQ2hpbGRyZW4oKQorICAgICAgICAgICAgPDwgIiBjaGlsZHJlbiBpbiBTY29wZSI7CisgICAgICB9CisgICAgICAKKyAgICAgIE9TIDw8ICdcbicgPDwgVG1wQnVmLnN0cigpOworICAgICAgQ3VycmVudElkeCArPSBDaGlsZFNpemU7CisgICAgfQorICAgIAorICAgIC8vIEVtaXQgYSB6ZXJvIGFzIGEgc2VudGluZWwgaW5kaWNhdGluZyBlbmQgb2YgJ1Njb3BlJy4KKyAgICBpZiAoIU9taXRDb21tZW50cykKKyAgICAgIE9TIDw8ICIvKiIgPDwgQ3VycmVudElkeCA8PCAiKi8iOworICAgIE9TLlBhZFRvQ29sdW1uKEluZGVudCoyKSA8PCAiMCwgIjsKKyAgICBpZiAoIU9taXRDb21tZW50cykKKyAgICAgIE9TIDw8ICIvKkVuZCBvZiBTY29wZSovIjsKKyAgICBPUyA8PCAnXG4nOworICAgIHJldHVybiBDdXJyZW50SWR4IC0gU3RhcnRJZHggKyAxOworICB9CisgICAgICAKKyAgY2FzZSBNYXRjaGVyOjpSZWNvcmROb2RlOgorICAgIE9TIDw8ICJPUENfUmVjb3JkTm9kZSwiOworICAgIGlmICghT21pdENvbW1lbnRzKQorICAgICAgT1MuUGFkVG9Db2x1bW4oQ29tbWVudEluZGVudCkgPDwgIi8vICMiCisgICAgICAgIDw8IGNhc3Q8UmVjb3JkTWF0Y2hlcj4oTiktPmdldFJlc3VsdE5vKCkgPDwgIiA9ICIKKyAgICAgICAgPDwgY2FzdDxSZWNvcmRNYXRjaGVyPihOKS0+Z2V0V2hhdEZvcigpOworICAgIE9TIDw8ICdcbic7CisgICAgcmV0dXJuIDE7CisKKyAgY2FzZSBNYXRjaGVyOjpSZWNvcmRDaGlsZDoKKyAgICBPUyA8PCAiT1BDX1JlY29yZENoaWxkIiA8PCBjYXN0PFJlY29yZENoaWxkTWF0Y2hlcj4oTiktPmdldENoaWxkTm8oKQorICAgICAgIDw8ICcsJzsKKyAgICBpZiAoIU9taXRDb21tZW50cykKKyAgICAgIE9TLlBhZFRvQ29sdW1uKENvbW1lbnRJbmRlbnQpIDw8ICIvLyAjIgorICAgICAgICA8PCBjYXN0PFJlY29yZENoaWxkTWF0Y2hlcj4oTiktPmdldFJlc3VsdE5vKCkgPDwgIiA9ICIKKyAgICAgICAgPDwgY2FzdDxSZWNvcmRDaGlsZE1hdGNoZXI+KE4pLT5nZXRXaGF0Rm9yKCk7CisgICAgT1MgPDwgJ1xuJzsKKyAgICByZXR1cm4gMTsKKyAgICAgIAorICBjYXNlIE1hdGNoZXI6OlJlY29yZE1lbVJlZjoKKyAgICBPUyA8PCAiT1BDX1JlY29yZE1lbVJlZixcbiI7CisgICAgcmV0dXJuIDE7CisgICAgICAKKyAgY2FzZSBNYXRjaGVyOjpDYXB0dXJlRmxhZ0lucHV0OgorICAgIE9TIDw8ICJPUENfQ2FwdHVyZUZsYWdJbnB1dCxcbiI7CisgICAgcmV0dXJuIDE7CisgICAgICAKKyAgY2FzZSBNYXRjaGVyOjpNb3ZlQ2hpbGQ6CisgICAgT1MgPDwgIk9QQ19Nb3ZlQ2hpbGQsICIgPDwgY2FzdDxNb3ZlQ2hpbGRNYXRjaGVyPihOKS0+Z2V0Q2hpbGRObygpIDw8ICIsXG4iOworICAgIHJldHVybiAyOworICAgICAgCisgIGNhc2UgTWF0Y2hlcjo6TW92ZVBhcmVudDoKKyAgICBPUyA8PCAiT1BDX01vdmVQYXJlbnQsXG4iOworICAgIHJldHVybiAxOworICAgICAgCisgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tTYW1lOgorICAgIE9TIDw8ICJPUENfQ2hlY2tTYW1lLCAiCisgICAgICAgPDwgY2FzdDxDaGVja1NhbWVNYXRjaGVyPihOKS0+Z2V0TWF0Y2hOdW1iZXIoKSA8PCAiLFxuIjsKKyAgICByZXR1cm4gMjsKKworICBjYXNlIE1hdGNoZXI6OkNoZWNrUGF0dGVyblByZWRpY2F0ZTogeworICAgIFN0cmluZ1JlZiBQcmVkID0gY2FzdDxDaGVja1BhdHRlcm5QcmVkaWNhdGVNYXRjaGVyPihOKS0+Z2V0UHJlZGljYXRlKCk7CisgICAgT1MgPDwgIk9QQ19DaGVja1BhdHRlcm5QcmVkaWNhdGUsICIgPDwgZ2V0UGF0dGVyblByZWRpY2F0ZShQcmVkKSA8PCAnLCc7CisgICAgaWYgKCFPbWl0Q29tbWVudHMpCisgICAgICBPUy5QYWRUb0NvbHVtbihDb21tZW50SW5kZW50KSA8PCAiLy8gIiA8PCBQcmVkOworICAgIE9TIDw8ICdcbic7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgY2FzZSBNYXRjaGVyOjpDaGVja1ByZWRpY2F0ZTogeworICAgIFN0cmluZ1JlZiBQcmVkID0gY2FzdDxDaGVja1ByZWRpY2F0ZU1hdGNoZXI+KE4pLT5nZXRQcmVkaWNhdGVOYW1lKCk7CisgICAgT1MgPDwgIk9QQ19DaGVja1ByZWRpY2F0ZSwgIiA8PCBnZXROb2RlUHJlZGljYXRlKFByZWQpIDw8ICcsJzsKKyAgICBpZiAoIU9taXRDb21tZW50cykKKyAgICAgIE9TLlBhZFRvQ29sdW1uKENvbW1lbnRJbmRlbnQpIDw8ICIvLyAiIDw8IFByZWQ7CisgICAgT1MgPDwgJ1xuJzsKKyAgICByZXR1cm4gMjsKKyAgfQorCisgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tPcGNvZGU6CisgICAgT1MgPDwgIk9QQ19DaGVja09wY29kZSwgVEFSR0VUX09QQ09ERSgiCisgICAgICAgPDwgY2FzdDxDaGVja09wY29kZU1hdGNoZXI+KE4pLT5nZXRPcGNvZGUoKS5nZXRFbnVtTmFtZSgpIDw8ICIpLFxuIjsKKyAgICByZXR1cm4gMzsKKyAgICAgIAorICBjYXNlIE1hdGNoZXI6OlN3aXRjaE9wY29kZToKKyAgY2FzZSBNYXRjaGVyOjpTd2l0Y2hUeXBlOiB7CisgICAgdW5zaWduZWQgU3RhcnRJZHggPSBDdXJyZW50SWR4OworICAgIAorICAgIHVuc2lnbmVkIE51bUNhc2VzOworICAgIGlmIChjb25zdCBTd2l0Y2hPcGNvZGVNYXRjaGVyICpTT00gPSBkeW5fY2FzdDxTd2l0Y2hPcGNvZGVNYXRjaGVyPihOKSkgeworICAgICAgT1MgPDwgIk9QQ19Td2l0Y2hPcGNvZGUgIjsKKyAgICAgIE51bUNhc2VzID0gU09NLT5nZXROdW1DYXNlcygpOworICAgIH0gZWxzZSB7CisgICAgICBPUyA8PCAiT1BDX1N3aXRjaFR5cGUgIjsKKyAgICAgIE51bUNhc2VzID0gY2FzdDxTd2l0Y2hUeXBlTWF0Y2hlcj4oTiktPmdldE51bUNhc2VzKCk7CisgICAgfQorCisgICAgaWYgKCFPbWl0Q29tbWVudHMpCisgICAgICBPUyA8PCAiLyoiIDw8IE51bUNhc2VzIDw8ICIgY2FzZXMgKi8iOworICAgIE9TIDw8ICIsICI7CisgICAgKytDdXJyZW50SWR4OworICAgIAorICAgIC8vIEZvciBlYWNoIGNhc2Ugd2UgZW1pdCB0aGUgc2l6ZSwgdGhlbiB0aGUgb3Bjb2RlLCB0aGVuIHRoZSBtYXRjaGVyLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1DYXNlczsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IE1hdGNoZXIgKkNoaWxkOworICAgICAgdW5zaWduZWQgSWR4U2l6ZTsKKyAgICAgIGlmIChjb25zdCBTd2l0Y2hPcGNvZGVNYXRjaGVyICpTT00gPSBkeW5fY2FzdDxTd2l0Y2hPcGNvZGVNYXRjaGVyPihOKSkgeworICAgICAgICBDaGlsZCA9IFNPTS0+Z2V0Q2FzZU1hdGNoZXIoaSk7CisgICAgICAgIElkeFNpemUgPSAyOyAgLy8gc2l6ZSBvZiBvcGNvZGUgaW4gdGFibGUgaXMgMiBieXRlcy4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENoaWxkID0gY2FzdDxTd2l0Y2hUeXBlTWF0Y2hlcj4oTiktPmdldENhc2VNYXRjaGVyKGkpOworICAgICAgICBJZHhTaXplID0gMTsgIC8vIHNpemUgb2YgdHlwZSBpbiB0YWJsZSBpcyAxIGJ5dGUuCisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFdlIG5lZWQgdG8gZW5jb2RlIHRoZSBvcGNvZGUgYW5kIHRoZSBvZmZzZXQgb2YgdGhlIGNhc2UgY29kZSBiZWZvcmUKKyAgICAgIC8vIGVtaXR0aW5nIHRoZSBjYXNlIGNvZGUuICBIYW5kbGUgdGhpcyBieSBidWZmZXJpbmcgdGhlIG91dHB1dCBpbnRvIGEKKyAgICAgIC8vIHN0cmluZyB3aGlsZSB3ZSBnZXQgdGhlIHNpemUuICBVbmZvcnR1bmF0ZWx5LCB0aGUgb2Zmc2V0IG9mIHRoZQorICAgICAgLy8gY2hpbGRyZW4gZGVwZW5kcyBvbiB0aGUgVkJSIHNpemUgb2YgdGhlIGNoaWxkLCBzbyBmb3IgbGFyZ2UgY2hpbGRyZW4gd2UKKyAgICAgIC8vIGhhdmUgdG8gaXRlcmF0ZSBhIGJpdC4KKyAgICAgIFNtYWxsU3RyaW5nPDEyOD4gVG1wQnVmOworICAgICAgdW5zaWduZWQgQ2hpbGRTaXplID0gMDsKKyAgICAgIHVuc2lnbmVkIFZCUlNpemUgPSAwOworICAgICAgZG8geworICAgICAgICBWQlJTaXplID0gR2V0VkJSU2l6ZShDaGlsZFNpemUpOworICAgICAgICAKKyAgICAgICAgVG1wQnVmLmNsZWFyKCk7CisgICAgICAgIHJhd19zdmVjdG9yX29zdHJlYW0gT1MoVG1wQnVmKTsKKyAgICAgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIEZPUyhPUyk7CisgICAgICAgIENoaWxkU2l6ZSA9IEVtaXRNYXRjaGVyTGlzdChDaGlsZCwgSW5kZW50KzEsIEN1cnJlbnRJZHgrVkJSU2l6ZStJZHhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9TKTsKKyAgICAgIH0gd2hpbGUgKEdldFZCUlNpemUoQ2hpbGRTaXplKSAhPSBWQlJTaXplKTsKKyAgICAgIAorICAgICAgYXNzZXJ0KENoaWxkU2l6ZSAhPSAwICYmICJTaG91bGQgbm90IGhhdmUgYSB6ZXJvLXNpemVkIGNoaWxkISIpOworICAgICAgCisgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIE9TLlBhZFRvQ29sdW1uKEluZGVudCoyKTsKKyAgICAgICAgaWYgKCFPbWl0Q29tbWVudHMpCisgICAgICAgIE9TIDw8IChpc2E8U3dpdGNoT3Bjb2RlTWF0Y2hlcj4oTikgPworICAgICAgICAgICAgICAgICAgICIvKlN3aXRjaE9wY29kZSovICIgOiAiLypTd2l0Y2hUeXBlKi8gIik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIEVtaXQgdGhlIFZCUi4KKyAgICAgIEN1cnJlbnRJZHggKz0gRW1pdFZCUlZhbHVlKENoaWxkU2l6ZSwgT1MpOworICAgICAgCisgICAgICBPUyA8PCAnICc7CisgICAgICBpZiAoY29uc3QgU3dpdGNoT3Bjb2RlTWF0Y2hlciAqU09NID0gZHluX2Nhc3Q8U3dpdGNoT3Bjb2RlTWF0Y2hlcj4oTikpCisgICAgICAgIE9TIDw8ICJUQVJHRVRfT1BDT0RFKCIgPDwgU09NLT5nZXRDYXNlT3Bjb2RlKGkpLmdldEVudW1OYW1lKCkgPDwgIiksIjsKKyAgICAgIGVsc2UKKyAgICAgICAgT1MgPDwgZ2V0RW51bU5hbWUoY2FzdDxTd2l0Y2hUeXBlTWF0Y2hlcj4oTiktPmdldENhc2VUeXBlKGkpKSA8PCAnLCc7CisKKyAgICAgIEN1cnJlbnRJZHggKz0gSWR4U2l6ZTsKKworICAgICAgaWYgKCFPbWl0Q29tbWVudHMpCisgICAgICAgIE9TIDw8ICIvLyAtPiIgPDwgQ3VycmVudElkeCtDaGlsZFNpemU7CisgICAgICBPUyA8PCAnXG4nOworICAgICAgT1MgPDwgVG1wQnVmLnN0cigpOworICAgICAgQ3VycmVudElkeCArPSBDaGlsZFNpemU7CisgICAgfQorCisgICAgLy8gRW1pdCB0aGUgZmluYWwgemVybyB0byB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKyAgICBPUy5QYWRUb0NvbHVtbihJbmRlbnQqMikgPDwgIjAsICI7CisgICAgaWYgKCFPbWl0Q29tbWVudHMpCisgICAgICBPUyA8PCAoaXNhPFN3aXRjaE9wY29kZU1hdGNoZXI+KE4pID8KKyAgICAgICAgICAgICAiLy8gRW5kU3dpdGNoT3Bjb2RlIiA6ICIvLyBFbmRTd2l0Y2hUeXBlIik7CisKKyAgICBPUyA8PCAnXG4nOworICAgICsrQ3VycmVudElkeDsKKyAgICByZXR1cm4gQ3VycmVudElkeC1TdGFydElkeDsKKyAgfQorCisgY2FzZSBNYXRjaGVyOjpDaGVja1R5cGU6CisgICAgYXNzZXJ0KGNhc3Q8Q2hlY2tUeXBlTWF0Y2hlcj4oTiktPmdldFJlc05vKCkgPT0gMCAmJgorICAgICAgICAgICAiRklYTUU6IEFkZCBzdXBwb3J0IGZvciBDaGVja1R5cGUgb2YgcmVzbm8gIT0gMCIpOworICAgIE9TIDw8ICJPUENfQ2hlY2tUeXBlLCAiCisgICAgICAgPDwgZ2V0RW51bU5hbWUoY2FzdDxDaGVja1R5cGVNYXRjaGVyPihOKS0+Z2V0VHlwZSgpKSA8PCAiLFxuIjsKKyAgICByZXR1cm4gMjsKKyAgICAgIAorICBjYXNlIE1hdGNoZXI6OkNoZWNrQ2hpbGRUeXBlOgorICAgIE9TIDw8ICJPUENfQ2hlY2tDaGlsZCIKKyAgICAgICA8PCBjYXN0PENoZWNrQ2hpbGRUeXBlTWF0Y2hlcj4oTiktPmdldENoaWxkTm8oKSA8PCAiVHlwZSwgIgorICAgICAgIDw8IGdldEVudW1OYW1lKGNhc3Q8Q2hlY2tDaGlsZFR5cGVNYXRjaGVyPihOKS0+Z2V0VHlwZSgpKSA8PCAiLFxuIjsKKyAgICByZXR1cm4gMjsKKyAgICAgIAorICBjYXNlIE1hdGNoZXI6OkNoZWNrSW50ZWdlcjogeworICAgIE9TIDw8ICJPUENfQ2hlY2tJbnRlZ2VyLCAiOworICAgIHVuc2lnbmVkIEJ5dGVzPTErRW1pdFZCUlZhbHVlKGNhc3Q8Q2hlY2tJbnRlZ2VyTWF0Y2hlcj4oTiktPmdldFZhbHVlKCksIE9TKTsKKyAgICBPUyA8PCAnXG4nOworICAgIHJldHVybiBCeXRlczsKKyAgfQorICBjYXNlIE1hdGNoZXI6OkNoZWNrQ29uZENvZGU6CisgICAgT1MgPDwgIk9QQ19DaGVja0NvbmRDb2RlLCBJU0Q6OiIKKyAgICAgICA8PCBjYXN0PENoZWNrQ29uZENvZGVNYXRjaGVyPihOKS0+Z2V0Q29uZENvZGVOYW1lKCkgPDwgIixcbiI7CisgICAgcmV0dXJuIDI7CisgICAgICAKKyAgY2FzZSBNYXRjaGVyOjpDaGVja1ZhbHVlVHlwZToKKyAgICBPUyA8PCAiT1BDX0NoZWNrVmFsdWVUeXBlLCBNVlQ6OiIKKyAgICAgICA8PCBjYXN0PENoZWNrVmFsdWVUeXBlTWF0Y2hlcj4oTiktPmdldFR5cGVOYW1lKCkgPDwgIixcbiI7CisgICAgcmV0dXJuIDI7CisKKyAgY2FzZSBNYXRjaGVyOjpDaGVja0NvbXBsZXhQYXQ6IHsKKyAgICBjb25zdCBDaGVja0NvbXBsZXhQYXRNYXRjaGVyICpDQ1BNID0gY2FzdDxDaGVja0NvbXBsZXhQYXRNYXRjaGVyPihOKTsKKyAgICBjb25zdCBDb21wbGV4UGF0dGVybiAmUGF0dGVybiA9IENDUE0tPmdldFBhdHRlcm4oKTsKKyAgICBPUyA8PCAiT1BDX0NoZWNrQ29tcGxleFBhdCwgLypDUCovIiA8PCBnZXRDb21wbGV4UGF0KFBhdHRlcm4pIDw8ICIsIC8qIyovIgorICAgICAgIDw8IENDUE0tPmdldE1hdGNoTnVtYmVyKCkgPDwgJywnOworICAgIAorICAgIGlmICghT21pdENvbW1lbnRzKSB7CisgICAgICBPUy5QYWRUb0NvbHVtbihDb21tZW50SW5kZW50KSA8PCAiLy8gIiA8PCBQYXR0ZXJuLmdldFNlbGVjdEZ1bmMoKTsKKyAgICAgIE9TIDw8ICI6JCIgPDwgQ0NQTS0+Z2V0TmFtZSgpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBhdHRlcm4uZ2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIE9TIDw8ICIgIyIgPDwgQ0NQTS0+Z2V0Rmlyc3RSZXN1bHQoKStpOworICAgICAgICAgICAKKyAgICAgIGlmIChQYXR0ZXJuLmhhc1Byb3BlcnR5KFNETlBIYXNDaGFpbikpCisgICAgICAgIE9TIDw8ICIgKyBjaGFpbiByZXN1bHQiOworICAgIH0KKyAgICBPUyA8PCAnXG4nOworICAgIHJldHVybiAzOworICB9CisgICAgICAKKyAgY2FzZSBNYXRjaGVyOjpDaGVja0FuZEltbTogeworICAgIE9TIDw8ICJPUENfQ2hlY2tBbmRJbW0sICI7CisgICAgdW5zaWduZWQgQnl0ZXM9MStFbWl0VkJSVmFsdWUoY2FzdDxDaGVja0FuZEltbU1hdGNoZXI+KE4pLT5nZXRWYWx1ZSgpLCBPUyk7CisgICAgT1MgPDwgJ1xuJzsKKyAgICByZXR1cm4gQnl0ZXM7CisgIH0KKworICBjYXNlIE1hdGNoZXI6OkNoZWNrT3JJbW06IHsKKyAgICBPUyA8PCAiT1BDX0NoZWNrT3JJbW0sICI7CisgICAgdW5zaWduZWQgQnl0ZXMgPSAxK0VtaXRWQlJWYWx1ZShjYXN0PENoZWNrT3JJbW1NYXRjaGVyPihOKS0+Z2V0VmFsdWUoKSwgT1MpOworICAgIE9TIDw8ICdcbic7CisgICAgcmV0dXJuIEJ5dGVzOworICB9CisgICAgICAKKyAgY2FzZSBNYXRjaGVyOjpDaGVja0ZvbGRhYmxlQ2hhaW5Ob2RlOgorICAgIE9TIDw8ICJPUENfQ2hlY2tGb2xkYWJsZUNoYWluTm9kZSxcbiI7CisgICAgcmV0dXJuIDE7CisgICAgICAKKyAgY2FzZSBNYXRjaGVyOjpFbWl0SW50ZWdlcjogeworICAgIGludDY0X3QgVmFsID0gY2FzdDxFbWl0SW50ZWdlck1hdGNoZXI+KE4pLT5nZXRWYWx1ZSgpOworICAgIE9TIDw8ICJPUENfRW1pdEludGVnZXIsICIKKyAgICAgICA8PCBnZXRFbnVtTmFtZShjYXN0PEVtaXRJbnRlZ2VyTWF0Y2hlcj4oTiktPmdldFZUKCkpIDw8ICIsICI7CisgICAgdW5zaWduZWQgQnl0ZXMgPSAyK0VtaXRWQlJWYWx1ZShWYWwsIE9TKTsKKyAgICBPUyA8PCAnXG4nOworICAgIHJldHVybiBCeXRlczsKKyAgfQorICBjYXNlIE1hdGNoZXI6OkVtaXRTdHJpbmdJbnRlZ2VyOiB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlZhbCA9IGNhc3Q8RW1pdFN0cmluZ0ludGVnZXJNYXRjaGVyPihOKS0+Z2V0VmFsdWUoKTsKKyAgICAvLyBUaGVzZSBzaG91bGQgYWx3YXlzIGZpdCBpbnRvIG9uZSBieXRlLgorICAgIE9TIDw8ICJPUENfRW1pdEludGVnZXIsICIKKyAgICAgIDw8IGdldEVudW1OYW1lKGNhc3Q8RW1pdFN0cmluZ0ludGVnZXJNYXRjaGVyPihOKS0+Z2V0VlQoKSkgPDwgIiwgIgorICAgICAgPDwgVmFsIDw8ICIsXG4iOworICAgIHJldHVybiAzOworICB9CisgICAgICAKKyAgY2FzZSBNYXRjaGVyOjpFbWl0UmVnaXN0ZXI6CisgICAgT1MgPDwgIk9QQ19FbWl0UmVnaXN0ZXIsICIKKyAgICAgICA8PCBnZXRFbnVtTmFtZShjYXN0PEVtaXRSZWdpc3Rlck1hdGNoZXI+KE4pLT5nZXRWVCgpKSA8PCAiLCAiOworICAgIGlmIChSZWNvcmQgKlIgPSBjYXN0PEVtaXRSZWdpc3Rlck1hdGNoZXI+KE4pLT5nZXRSZWcoKSkKKyAgICAgIE9TIDw8IGdldFF1YWxpZmllZE5hbWUoUikgPDwgIixcbiI7CisgICAgZWxzZSB7CisgICAgICBPUyA8PCAiMCAiOworICAgICAgaWYgKCFPbWl0Q29tbWVudHMpCisgICAgICAgIE9TIDw8ICIvKnplcm9fcmVnKi8iOworICAgICAgT1MgPDwgIixcbiI7CisgICAgfQorICAgIHJldHVybiAzOworICAgICAgCisgIGNhc2UgTWF0Y2hlcjo6RW1pdENvbnZlcnRUb1RhcmdldDoKKyAgICBPUyA8PCAiT1BDX0VtaXRDb252ZXJ0VG9UYXJnZXQsICIKKyAgICAgICA8PCBjYXN0PEVtaXRDb252ZXJ0VG9UYXJnZXRNYXRjaGVyPihOKS0+Z2V0U2xvdCgpIDw8ICIsXG4iOworICAgIHJldHVybiAyOworICAgICAgCisgIGNhc2UgTWF0Y2hlcjo6RW1pdE1lcmdlSW5wdXRDaGFpbnM6IHsKKyAgICBjb25zdCBFbWl0TWVyZ2VJbnB1dENoYWluc01hdGNoZXIgKk1OID0KKyAgICAgIGNhc3Q8RW1pdE1lcmdlSW5wdXRDaGFpbnNNYXRjaGVyPihOKTsKKyAgICAKKyAgICAvLyBIYW5kbGUgdGhlIHNwZWNpYWxpemVkIGZvcm1zIE9QQ19FbWl0TWVyZ2VJbnB1dENoYWluczFfMCBhbmQgMV8xLgorICAgIGlmIChNTi0+Z2V0TnVtTm9kZXMoKSA9PSAxICYmIE1OLT5nZXROb2RlKDApIDwgMikgeworICAgICAgT1MgPDwgIk9QQ19FbWl0TWVyZ2VJbnB1dENoYWluczFfIiA8PCBNTi0+Z2V0Tm9kZSgwKSA8PCAiLFxuIjsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAKKyAgICBPUyA8PCAiT1BDX0VtaXRNZXJnZUlucHV0Q2hhaW5zLCAiIDw8IE1OLT5nZXROdW1Ob2RlcygpIDw8ICIsICI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1OLT5nZXROdW1Ob2RlcygpOyBpICE9IGU7ICsraSkKKyAgICAgIE9TIDw8IE1OLT5nZXROb2RlKGkpIDw8ICIsICI7CisgICAgT1MgPDwgJ1xuJzsKKyAgICByZXR1cm4gMitNTi0+Z2V0TnVtTm9kZXMoKTsKKyAgfQorICBjYXNlIE1hdGNoZXI6OkVtaXRDb3B5VG9SZWc6CisgICAgT1MgPDwgIk9QQ19FbWl0Q29weVRvUmVnLCAiCisgICAgICAgPDwgY2FzdDxFbWl0Q29weVRvUmVnTWF0Y2hlcj4oTiktPmdldFNyY1Nsb3QoKSA8PCAiLCAiCisgICAgICAgPDwgZ2V0UXVhbGlmaWVkTmFtZShjYXN0PEVtaXRDb3B5VG9SZWdNYXRjaGVyPihOKS0+Z2V0RGVzdFBoeXNSZWcoKSkKKyAgICAgICA8PCAiLFxuIjsKKyAgICByZXR1cm4gMzsKKyAgY2FzZSBNYXRjaGVyOjpFbWl0Tm9kZVhGb3JtOiB7CisgICAgY29uc3QgRW1pdE5vZGVYRm9ybU1hdGNoZXIgKlhGID0gY2FzdDxFbWl0Tm9kZVhGb3JtTWF0Y2hlcj4oTik7CisgICAgT1MgPDwgIk9QQ19FbWl0Tm9kZVhGb3JtLCAiIDw8IGdldE5vZGVYRm9ybUlEKFhGLT5nZXROb2RlWEZvcm0oKSkgPDwgIiwgIgorICAgICAgIDw8IFhGLT5nZXRTbG90KCkgPDwgJywnOworICAgIGlmICghT21pdENvbW1lbnRzKQorICAgICAgT1MuUGFkVG9Db2x1bW4oQ29tbWVudEluZGVudCkgPDwgIi8vICI8PFhGLT5nZXROb2RlWEZvcm0oKS0+Z2V0TmFtZSgpOworICAgIE9TIDw8J1xuJzsKKyAgICByZXR1cm4gMzsKKyAgfQorICAgICAgCisgIGNhc2UgTWF0Y2hlcjo6RW1pdE5vZGU6CisgIGNhc2UgTWF0Y2hlcjo6TW9ycGhOb2RlVG86IHsKKyAgICBjb25zdCBFbWl0Tm9kZU1hdGNoZXJDb21tb24gKkVOID0gY2FzdDxFbWl0Tm9kZU1hdGNoZXJDb21tb24+KE4pOworICAgIE9TIDw8IChpc2E8RW1pdE5vZGVNYXRjaGVyPihFTikgPyAiT1BDX0VtaXROb2RlIiA6ICJPUENfTW9ycGhOb2RlVG8iKTsKKyAgICBPUyA8PCAiLCBUQVJHRVRfT1BDT0RFKCIgPDwgRU4tPmdldE9wY29kZU5hbWUoKSA8PCAiKSwgMCI7CisgICAgCisgICAgaWYgKEVOLT5oYXNDaGFpbigpKSAgIE9TIDw8ICJ8T1BGTF9DaGFpbiI7CisgICAgaWYgKEVOLT5oYXNJbkZsYWcoKSkgIE9TIDw8ICJ8T1BGTF9GbGFnSW5wdXQiOworICAgIGlmIChFTi0+aGFzT3V0RmxhZygpKSBPUyA8PCAifE9QRkxfRmxhZ091dHB1dCI7CisgICAgaWYgKEVOLT5oYXNNZW1SZWZzKCkpIE9TIDw8ICJ8T1BGTF9NZW1SZWZzIjsKKyAgICBpZiAoRU4tPmdldE51bUZpeGVkQXJpdHlPcGVyYW5kcygpICE9IC0xKQorICAgICAgT1MgPDwgInxPUEZMX1ZhcmlhZGljIiA8PCBFTi0+Z2V0TnVtRml4ZWRBcml0eU9wZXJhbmRzKCk7CisgICAgT1MgPDwgIixcbiI7CisgICAgCisgICAgT1MuUGFkVG9Db2x1bW4oSW5kZW50KjIrNCkgPDwgRU4tPmdldE51bVZUcygpOworICAgIGlmICghT21pdENvbW1lbnRzKQorICAgICAgT1MgPDwgIi8qI1ZUcyovIjsKKyAgICBPUyA8PCAiLCAiOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBFTi0+Z2V0TnVtVlRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgT1MgPDwgZ2V0RW51bU5hbWUoRU4tPmdldFZUKGkpKSA8PCAiLCAiOworCisgICAgT1MgPDwgRU4tPmdldE51bU9wZXJhbmRzKCk7CisgICAgaWYgKCFPbWl0Q29tbWVudHMpCisgICAgICBPUyA8PCAiLyojT3BzKi8iOworICAgIE9TIDw8ICIsICI7CisgICAgdW5zaWduZWQgTnVtT3BlcmFuZEJ5dGVzID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRU4tPmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgTnVtT3BlcmFuZEJ5dGVzICs9IEVtaXRWQlJWYWx1ZShFTi0+Z2V0T3BlcmFuZChpKSwgT1MpOworICAgIAorICAgIGlmICghT21pdENvbW1lbnRzKSB7CisgICAgICAvLyBQcmludCB0aGUgcmVzdWx0ICMncyBmb3IgRW1pdE5vZGUuCisgICAgICBpZiAoY29uc3QgRW1pdE5vZGVNYXRjaGVyICpFID0gZHluX2Nhc3Q8RW1pdE5vZGVNYXRjaGVyPihFTikpIHsKKyAgICAgICAgaWYgKHVuc2lnbmVkIE51bVJlc3VsdHMgPSBFTi0+Z2V0TnVtVlRzKCkpIHsKKyAgICAgICAgICBPUy5QYWRUb0NvbHVtbihDb21tZW50SW5kZW50KSA8PCAiLy8gUmVzdWx0cyA9ICI7CisgICAgICAgICAgdW5zaWduZWQgRmlyc3QgPSBFLT5nZXRGaXJzdFJlc3VsdFNsb3QoKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVJlc3VsdHM7ICsraSkKKyAgICAgICAgICAgIE9TIDw8ICIjIiA8PCBGaXJzdCtpIDw8ICIgIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgT1MgPDwgJ1xuJzsKKworICAgICAgaWYgKGNvbnN0IE1vcnBoTm9kZVRvTWF0Y2hlciAqU05UID0gZHluX2Nhc3Q8TW9ycGhOb2RlVG9NYXRjaGVyPihOKSkgeworICAgICAgICBPUy5QYWRUb0NvbHVtbihJbmRlbnQqMikgPDwgIi8vIFNyYzogIgorICAgICAgICAgIDw8ICpTTlQtPmdldFBhdHRlcm4oKS5nZXRTcmNQYXR0ZXJuKCkgPDwgIiAtIENvbXBsZXhpdHkgPSAiIAorICAgICAgICAgIDw8IFNOVC0+Z2V0UGF0dGVybigpLmdldFBhdHRlcm5Db21wbGV4aXR5KENHUCkgPDwgJ1xuJzsKKyAgICAgICAgT1MuUGFkVG9Db2x1bW4oSW5kZW50KjIpIDw8ICIvLyBEc3Q6ICIKKyAgICAgICAgICA8PCAqU05ULT5nZXRQYXR0ZXJuKCkuZ2V0RHN0UGF0dGVybigpIDw8ICdcbic7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBPUyA8PCAnXG4nOworICAgIAorICAgIHJldHVybiA2K0VOLT5nZXROdW1WVHMoKStOdW1PcGVyYW5kQnl0ZXM7CisgIH0KKyAgY2FzZSBNYXRjaGVyOjpNYXJrRmxhZ1Jlc3VsdHM6IHsKKyAgICBjb25zdCBNYXJrRmxhZ1Jlc3VsdHNNYXRjaGVyICpDRlIgPSBjYXN0PE1hcmtGbGFnUmVzdWx0c01hdGNoZXI+KE4pOworICAgIE9TIDw8ICJPUENfTWFya0ZsYWdSZXN1bHRzLCAiIDw8IENGUi0+Z2V0TnVtTm9kZXMoKSA8PCAiLCAiOworICAgIHVuc2lnbmVkIE51bU9wZXJhbmRCeXRlcyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENGUi0+Z2V0TnVtTm9kZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBOdW1PcGVyYW5kQnl0ZXMgKz0gRW1pdFZCUlZhbHVlKENGUi0+Z2V0Tm9kZShpKSwgT1MpOworICAgIE9TIDw8ICdcbic7CisgICAgcmV0dXJuIDIrTnVtT3BlcmFuZEJ5dGVzOworICB9CisgIGNhc2UgTWF0Y2hlcjo6Q29tcGxldGVNYXRjaDogeworICAgIGNvbnN0IENvbXBsZXRlTWF0Y2hNYXRjaGVyICpDTSA9IGNhc3Q8Q29tcGxldGVNYXRjaE1hdGNoZXI+KE4pOworICAgIE9TIDw8ICJPUENfQ29tcGxldGVNYXRjaCwgIiA8PCBDTS0+Z2V0TnVtUmVzdWx0cygpIDw8ICIsICI7CisgICAgdW5zaWduZWQgTnVtUmVzdWx0Qnl0ZXMgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDTS0+Z2V0TnVtUmVzdWx0cygpOyBpICE9IGU7ICsraSkKKyAgICAgIE51bVJlc3VsdEJ5dGVzICs9IEVtaXRWQlJWYWx1ZShDTS0+Z2V0UmVzdWx0KGkpLCBPUyk7CisgICAgT1MgPDwgJ1xuJzsKKyAgICBpZiAoIU9taXRDb21tZW50cykgeworICAgICAgT1MuUGFkVG9Db2x1bW4oSW5kZW50KjIpIDw8ICIvLyBTcmM6ICIKKyAgICAgICAgPDwgKkNNLT5nZXRQYXR0ZXJuKCkuZ2V0U3JjUGF0dGVybigpIDw8ICIgLSBDb21wbGV4aXR5ID0gIiAKKyAgICAgICAgPDwgQ00tPmdldFBhdHRlcm4oKS5nZXRQYXR0ZXJuQ29tcGxleGl0eShDR1ApIDw8ICdcbic7CisgICAgICBPUy5QYWRUb0NvbHVtbihJbmRlbnQqMikgPDwgIi8vIERzdDogIgorICAgICAgICA8PCAqQ00tPmdldFBhdHRlcm4oKS5nZXREc3RQYXR0ZXJuKCk7CisgICAgfQorICAgIE9TIDw8ICdcbic7CisgICAgcmV0dXJuIDIgKyBOdW1SZXN1bHRCeXRlczsKKyAgfQorICB9CisgIGFzc2VydCgwICYmICJVbnJlYWNoYWJsZSIpOworICByZXR1cm4gMDsKK30KKworLy8vIEVtaXRNYXRjaGVyTGlzdCAtIEVtaXQgdGhlIGJ5dGVzIGZvciB0aGUgc3BlY2lmaWVkIG1hdGNoZXIgc3VidHJlZS4KK3Vuc2lnbmVkIE1hdGNoZXJUYWJsZUVtaXR0ZXI6OgorRW1pdE1hdGNoZXJMaXN0KGNvbnN0IE1hdGNoZXIgKk4sIHVuc2lnbmVkIEluZGVudCwgdW5zaWduZWQgQ3VycmVudElkeCwKKyAgICAgICAgICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk9TKSB7CisgIHVuc2lnbmVkIFNpemUgPSAwOworICB3aGlsZSAoTikgeworICAgIGlmICghT21pdENvbW1lbnRzKQorICAgICAgT1MgPDwgIi8qIiA8PCBDdXJyZW50SWR4IDw8ICIqLyI7CisgICAgdW5zaWduZWQgTWF0Y2hlclNpemUgPSBFbWl0TWF0Y2hlcihOLCBJbmRlbnQsIEN1cnJlbnRJZHgsIE9TKTsKKyAgICBTaXplICs9IE1hdGNoZXJTaXplOworICAgIEN1cnJlbnRJZHggKz0gTWF0Y2hlclNpemU7CisgICAgCisgICAgLy8gSWYgdGhlcmUgYXJlIG90aGVyIG5vZGVzIGluIHRoaXMgbGlzdCwgaXRlcmF0ZSB0byB0aGVtLCBvdGhlcndpc2Ugd2UncmUKKyAgICAvLyBkb25lLgorICAgIE4gPSBOLT5nZXROZXh0KCk7CisgIH0KKyAgcmV0dXJuIFNpemU7Cit9CisKK3ZvaWQgTWF0Y2hlclRhYmxlRW1pdHRlcjo6RW1pdFByZWRpY2F0ZUZ1bmN0aW9ucyhmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk9TKSB7CisgIC8vIEVtaXQgcGF0dGVybiBwcmVkaWNhdGVzLgorICBpZiAoIVBhdHRlcm5QcmVkaWNhdGVzLmVtcHR5KCkpIHsKKyAgICBPUyA8PCAiYm9vbCBDaGVja1BhdHRlcm5QcmVkaWNhdGUodW5zaWduZWQgUHJlZE5vKSBjb25zdCB7XG4iOworICAgIE9TIDw8ICIgIHN3aXRjaCAoUHJlZE5vKSB7XG4iOworICAgIE9TIDw8ICIgIGRlZmF1bHQ6IGFzc2VydCgwICYmIFwiSW52YWxpZCBwcmVkaWNhdGUgaW4gdGFibGU/XCIpO1xuIjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUGF0dGVyblByZWRpY2F0ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIE9TIDw8ICIgIGNhc2UgIiA8PCBpIDw8ICI6IHJldHVybiAiICA8PCBQYXR0ZXJuUHJlZGljYXRlc1tpXSA8PCAiO1xuIjsKKyAgICBPUyA8PCAiICB9XG4iOworICAgIE9TIDw8ICJ9XG5cbiI7CisgIH0KKyAgIAorICAvLyBFbWl0IE5vZGUgcHJlZGljYXRlcy4KKyAgLy8gRklYTUU6IEFubm95aW5nbHksIHRoZXNlIGFyZSBzdG9yZWQgYnkgbmFtZSwgd2hpY2ggd2UgbmV2ZXIgZXZlbiBlbWl0LiBZYXk/CisgIFN0cmluZ01hcDxUcmVlUGF0dGVybio+IFBGc0J5TmFtZTsKKyAgCisgIGZvciAoQ29kZUdlbkRBR1BhdHRlcm5zOjpwZl9pdGVyYXRvciBJID0gQ0dQLnBmX2JlZ2luKCksIEUgPSBDR1AucGZfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgUEZzQnlOYW1lW0ktPmZpcnN0LT5nZXROYW1lKCldID0gSS0+c2Vjb25kOworICAKKyAgaWYgKCFOb2RlUHJlZGljYXRlcy5lbXB0eSgpKSB7CisgICAgT1MgPDwgImJvb2wgQ2hlY2tOb2RlUHJlZGljYXRlKFNETm9kZSAqTm9kZSwgdW5zaWduZWQgUHJlZE5vKSBjb25zdCB7XG4iOworICAgIE9TIDw8ICIgIHN3aXRjaCAoUHJlZE5vKSB7XG4iOworICAgIE9TIDw8ICIgIGRlZmF1bHQ6IGFzc2VydCgwICYmIFwiSW52YWxpZCBwcmVkaWNhdGUgaW4gdGFibGU/XCIpO1xuIjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTm9kZVByZWRpY2F0ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgLy8gRklYTUU6IFN0b3JpbmcgdGhpcyBieSBuYW1lIGlzIGhvcnJpYmxlLgorICAgICAgVHJlZVBhdHRlcm4gKlAgPVBGc0J5TmFtZVtOb2RlUHJlZGljYXRlc1tpXS5zdWJzdHIoc3RybGVuKCJQcmVkaWNhdGVfIikpXTsKKyAgICAgIGFzc2VydChQICYmICJVbmtub3duIG5hbWU/Iik7CisgICAgICAKKyAgICAgIC8vIEVtaXQgdGhlIHByZWRpY2F0ZSBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYXR0ZXJuLgorICAgICAgc3RkOjpzdHJpbmcgQ29kZSA9IFAtPmdldFJlY29yZCgpLT5nZXRWYWx1ZUFzQ29kZSgiUHJlZGljYXRlIik7CisgICAgICBhc3NlcnQoIUNvZGUuZW1wdHkoKSAmJiAiTm8gY29kZSBpbiB0aGlzIHByZWRpY2F0ZSIpOworICAgICAgT1MgPDwgIiAgY2FzZSAiIDw8IGkgPDwgIjogeyAvLyAiIDw8IE5vZGVQcmVkaWNhdGVzW2ldIDw8ICdcbic7CisgICAgICBzdGQ6OnN0cmluZyBDbGFzc05hbWU7CisgICAgICBpZiAoUC0+Z2V0T25seVRyZWUoKS0+aXNMZWFmKCkpCisgICAgICAgIENsYXNzTmFtZSA9ICJTRE5vZGUiOworICAgICAgZWxzZQorICAgICAgICBDbGFzc05hbWUgPQorICAgICAgICAgIENHUC5nZXRTRE5vZGVJbmZvKFAtPmdldE9ubHlUcmVlKCktPmdldE9wZXJhdG9yKCkpLmdldFNEQ2xhc3NOYW1lKCk7CisgICAgICBpZiAoQ2xhc3NOYW1lID09ICJTRE5vZGUiKQorICAgICAgICBPUyA8PCAiICAgIFNETm9kZSAqTiA9IE5vZGU7XG4iOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiICAgICIgPDwgQ2xhc3NOYW1lIDw8ICIqTiA9IGNhc3Q8IiA8PCBDbGFzc05hbWUgPDwgIj4oTm9kZSk7XG4iOworICAgICAgT1MgPDwgQ29kZSA8PCAiXG4gIH1cbiI7CisgICAgfQorICAgIE9TIDw8ICIgIH1cbiI7CisgICAgT1MgPDwgIn1cblxuIjsKKyAgfQorICAKKyAgLy8gRW1pdCBDb21wbGV0ZVBhdHRlcm4gbWF0Y2hlcnMuCisgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjb25zdC4KKyAgaWYgKCFDb21wbGV4UGF0dGVybnMuZW1wdHkoKSkgeworICAgIE9TIDw8ICJib29sIENoZWNrQ29tcGxleFBhdHRlcm4oU0ROb2RlICpSb290LCBTRFZhbHVlIE4sXG4iOworICAgIE9TIDw8ICIgICAgICB1bnNpZ25lZCBQYXR0ZXJuTm8sIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmUmVzdWx0KSB7XG4iOworICAgIE9TIDw8ICIgIHVuc2lnbmVkIE5leHRSZXMgPSBSZXN1bHQuc2l6ZSgpO1xuIjsKKyAgICBPUyA8PCAiICBzd2l0Y2ggKFBhdHRlcm5Obykge1xuIjsKKyAgICBPUyA8PCAiICBkZWZhdWx0OiBhc3NlcnQoMCAmJiBcIkludmFsaWQgcGF0dGVybiAjIGluIHRhYmxlP1wiKTtcbiI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvbXBsZXhQYXR0ZXJucy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBDb21wbGV4UGF0dGVybiAmUCA9ICpDb21wbGV4UGF0dGVybnNbaV07CisgICAgICB1bnNpZ25lZCBOdW1PcHMgPSBQLmdldE51bU9wZXJhbmRzKCk7CisKKyAgICAgIGlmIChQLmhhc1Byb3BlcnR5KFNETlBIYXNDaGFpbikpCisgICAgICAgICsrTnVtT3BzOyAgLy8gR2V0IHRoZSBjaGFpbmVkIG5vZGUgdG9vLgorICAgICAgCisgICAgICBPUyA8PCAiICBjYXNlICIgPDwgaSA8PCAiOlxuIjsKKyAgICAgIE9TIDw8ICIgICAgUmVzdWx0LnJlc2l6ZShOZXh0UmVzKyIgPDwgTnVtT3BzIDw8ICIpO1xuIjsKKyAgICAgIE9TIDw8ICIgICAgcmV0dXJuICIgIDw8IFAuZ2V0U2VsZWN0RnVuYygpOworCisgICAgICBPUyA8PCAiKFJvb3QsIE4iOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1PcHM7ICsraSkKKyAgICAgICAgT1MgPDwgIiwgUmVzdWx0W05leHRSZXMrIiA8PCBpIDw8ICddJzsKKyAgICAgIE9TIDw8ICIpO1xuIjsKKyAgICB9CisgICAgT1MgPDwgIiAgfVxuIjsKKyAgICBPUyA8PCAifVxuXG4iOworICB9CisgIAorICAKKyAgLy8gRW1pdCBTRE5vZGVYRm9ybSBoYW5kbGVycy4KKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGNvbnN0LgorICBpZiAoIU5vZGVYRm9ybXMuZW1wdHkoKSkgeworICAgIE9TIDw8ICJTRFZhbHVlIFJ1blNETm9kZVhGb3JtKFNEVmFsdWUgViwgdW5zaWduZWQgWEZvcm1Obykge1xuIjsKKyAgICBPUyA8PCAiICBzd2l0Y2ggKFhGb3JtTm8pIHtcbiI7CisgICAgT1MgPDwgIiAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgXCJJbnZhbGlkIHhmb3JtICMgaW4gdGFibGU/XCIpO1xuIjsKKyAgICAKKyAgICAvLyBGSVhNRTogVGhlIG5vZGUgeGZvcm0gY291bGQgdGFrZSBTRFZhbHVlJ3MgaW5zdGVhZCBvZiBTRE5vZGUqJ3MuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5vZGVYRm9ybXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zOjpOb2RlWEZvcm0gJkVudHJ5ID0KKyAgICAgICAgQ0dQLmdldFNETm9kZVRyYW5zZm9ybShOb2RlWEZvcm1zW2ldKTsKKyAgICAgIAorICAgICAgUmVjb3JkICpTRE5vZGUgPSBFbnRyeS5maXJzdDsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZDb2RlID0gRW50cnkuc2Vjb25kOworICAgICAgCisgICAgICBPUyA8PCAiICBjYXNlICIgPDwgaSA8PCAiOiB7ICAiOworICAgICAgaWYgKCFPbWl0Q29tbWVudHMpCisgICAgICAgIE9TIDw8ICIvLyAiIDw8IE5vZGVYRm9ybXNbaV0tPmdldE5hbWUoKTsKKyAgICAgIE9TIDw8ICdcbic7CisgICAgICAKKyAgICAgIHN0ZDo6c3RyaW5nIENsYXNzTmFtZSA9IENHUC5nZXRTRE5vZGVJbmZvKFNETm9kZSkuZ2V0U0RDbGFzc05hbWUoKTsKKyAgICAgIGlmIChDbGFzc05hbWUgPT0gIlNETm9kZSIpCisgICAgICAgIE9TIDw8ICIgICAgU0ROb2RlICpOID0gVi5nZXROb2RlKCk7XG4iOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiICAgICIgPDwgQ2xhc3NOYW1lIDw8ICIgKk4gPSBjYXN0PCIgPDwgQ2xhc3NOYW1lCisgICAgICAgICAgIDw8ICI+KFYuZ2V0Tm9kZSgpKTtcbiI7CisgICAgICBPUyA8PCBDb2RlIDw8ICJcbiAgfVxuIjsKKyAgICB9CisgICAgT1MgPDwgIiAgfVxuIjsKKyAgICBPUyA8PCAifVxuXG4iOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEJ1aWxkSGlzdG9ncmFtKGNvbnN0IE1hdGNoZXIgKk0sIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmT3Bjb2RlRnJlcSl7CisgIGZvciAoOyBNICE9IDA7IE0gPSBNLT5nZXROZXh0KCkpIHsKKyAgICAvLyBDb3VudCB0aGlzIG5vZGUuCisgICAgaWYgKHVuc2lnbmVkKE0tPmdldEtpbmQoKSkgPj0gT3Bjb2RlRnJlcS5zaXplKCkpCisgICAgICBPcGNvZGVGcmVxLnJlc2l6ZShNLT5nZXRLaW5kKCkrMSk7CisgICAgT3Bjb2RlRnJlcVtNLT5nZXRLaW5kKCldKys7CisgIAorICAgIC8vIEhhbmRsZSByZWN1cnNpdmUgbm9kZXMuCisgICAgaWYgKGNvbnN0IFNjb3BlTWF0Y2hlciAqU00gPSBkeW5fY2FzdDxTY29wZU1hdGNoZXI+KE0pKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU00tPmdldE51bUNoaWxkcmVuKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBCdWlsZEhpc3RvZ3JhbShTTS0+Z2V0Q2hpbGQoaSksIE9wY29kZUZyZXEpOworICAgIH0gZWxzZSBpZiAoY29uc3QgU3dpdGNoT3Bjb2RlTWF0Y2hlciAqU09NID0gCisgICAgICAgICAgICAgICAgIGR5bl9jYXN0PFN3aXRjaE9wY29kZU1hdGNoZXI+KE0pKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU09NLT5nZXROdW1DYXNlcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgQnVpbGRIaXN0b2dyYW0oU09NLT5nZXRDYXNlTWF0Y2hlcihpKSwgT3Bjb2RlRnJlcSk7CisgICAgfSBlbHNlIGlmIChjb25zdCBTd2l0Y2hUeXBlTWF0Y2hlciAqU1RNID0gZHluX2Nhc3Q8U3dpdGNoVHlwZU1hdGNoZXI+KE0pKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU1RNLT5nZXROdW1DYXNlcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgQnVpbGRIaXN0b2dyYW0oU1RNLT5nZXRDYXNlTWF0Y2hlcihpKSwgT3Bjb2RlRnJlcSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgTWF0Y2hlclRhYmxlRW1pdHRlcjo6RW1pdEhpc3RvZ3JhbShjb25zdCBNYXRjaGVyICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmT1MpIHsKKyAgaWYgKE9taXRDb21tZW50cykKKyAgICByZXR1cm47CisgIAorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gT3Bjb2RlRnJlcTsKKyAgQnVpbGRIaXN0b2dyYW0oTSwgT3Bjb2RlRnJlcSk7CisgIAorICBPUyA8PCAiICAvLyBPcGNvZGUgSGlzdG9ncmFtOlxuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wY29kZUZyZXEuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE9TIDw8ICIgIC8vICMiOworICAgIHN3aXRjaCAoKE1hdGNoZXI6OktpbmRUeSlpKSB7CisgICAgY2FzZSBNYXRjaGVyOjpTY29wZTogT1MgPDwgIk9QQ19TY29wZSI7IGJyZWFrOyAKKyAgICBjYXNlIE1hdGNoZXI6OlJlY29yZE5vZGU6IE9TIDw8ICJPUENfUmVjb3JkTm9kZSI7IGJyZWFrOyAKKyAgICBjYXNlIE1hdGNoZXI6OlJlY29yZENoaWxkOiBPUyA8PCAiT1BDX1JlY29yZENoaWxkIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpSZWNvcmRNZW1SZWY6IE9TIDw8ICJPUENfUmVjb3JkTWVtUmVmIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpDYXB0dXJlRmxhZ0lucHV0OiBPUyA8PCAiT1BDX0NhcHR1cmVGbGFnSW5wdXQiOyBicmVhazsKKyAgICBjYXNlIE1hdGNoZXI6Ok1vdmVDaGlsZDogT1MgPDwgIk9QQ19Nb3ZlQ2hpbGQiOyBicmVhazsKKyAgICBjYXNlIE1hdGNoZXI6Ok1vdmVQYXJlbnQ6IE9TIDw8ICJPUENfTW92ZVBhcmVudCI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tTYW1lOiBPUyA8PCAiT1BDX0NoZWNrU2FtZSI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tQYXR0ZXJuUHJlZGljYXRlOgorICAgICAgT1MgPDwgIk9QQ19DaGVja1BhdHRlcm5QcmVkaWNhdGUiOyBicmVhazsKKyAgICBjYXNlIE1hdGNoZXI6OkNoZWNrUHJlZGljYXRlOiBPUyA8PCAiT1BDX0NoZWNrUHJlZGljYXRlIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpDaGVja09wY29kZTogT1MgPDwgIk9QQ19DaGVja09wY29kZSI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6U3dpdGNoT3Bjb2RlOiBPUyA8PCAiT1BDX1N3aXRjaE9wY29kZSI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tUeXBlOiBPUyA8PCAiT1BDX0NoZWNrVHlwZSI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6U3dpdGNoVHlwZTogT1MgPDwgIk9QQ19Td2l0Y2hUeXBlIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpDaGVja0NoaWxkVHlwZTogT1MgPDwgIk9QQ19DaGVja0NoaWxkVHlwZSI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tJbnRlZ2VyOiBPUyA8PCAiT1BDX0NoZWNrSW50ZWdlciI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tDb25kQ29kZTogT1MgPDwgIk9QQ19DaGVja0NvbmRDb2RlIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpDaGVja1ZhbHVlVHlwZTogT1MgPDwgIk9QQ19DaGVja1ZhbHVlVHlwZSI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tDb21wbGV4UGF0OiBPUyA8PCAiT1BDX0NoZWNrQ29tcGxleFBhdCI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tBbmRJbW06IE9TIDw8ICJPUENfQ2hlY2tBbmRJbW0iOyBicmVhazsKKyAgICBjYXNlIE1hdGNoZXI6OkNoZWNrT3JJbW06IE9TIDw8ICJPUENfQ2hlY2tPckltbSI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6Q2hlY2tGb2xkYWJsZUNoYWluTm9kZToKKyAgICAgIE9TIDw8ICJPUENfQ2hlY2tGb2xkYWJsZUNoYWluTm9kZSI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6RW1pdEludGVnZXI6IE9TIDw8ICJPUENfRW1pdEludGVnZXIiOyBicmVhazsKKyAgICBjYXNlIE1hdGNoZXI6OkVtaXRTdHJpbmdJbnRlZ2VyOiBPUyA8PCAiT1BDX0VtaXRTdHJpbmdJbnRlZ2VyIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpFbWl0UmVnaXN0ZXI6IE9TIDw8ICJPUENfRW1pdFJlZ2lzdGVyIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpFbWl0Q29udmVydFRvVGFyZ2V0OiBPUyA8PCAiT1BDX0VtaXRDb252ZXJ0VG9UYXJnZXQiOyBicmVhazsKKyAgICBjYXNlIE1hdGNoZXI6OkVtaXRNZXJnZUlucHV0Q2hhaW5zOiBPUyA8PCAiT1BDX0VtaXRNZXJnZUlucHV0Q2hhaW5zIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpFbWl0Q29weVRvUmVnOiBPUyA8PCAiT1BDX0VtaXRDb3B5VG9SZWciOyBicmVhazsKKyAgICBjYXNlIE1hdGNoZXI6OkVtaXROb2RlOiBPUyA8PCAiT1BDX0VtaXROb2RlIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpNb3JwaE5vZGVUbzogT1MgPDwgIk9QQ19Nb3JwaE5vZGVUbyI7IGJyZWFrOworICAgIGNhc2UgTWF0Y2hlcjo6RW1pdE5vZGVYRm9ybTogT1MgPDwgIk9QQ19FbWl0Tm9kZVhGb3JtIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpNYXJrRmxhZ1Jlc3VsdHM6IE9TIDw8ICJPUENfTWFya0ZsYWdSZXN1bHRzIjsgYnJlYWs7CisgICAgY2FzZSBNYXRjaGVyOjpDb21wbGV0ZU1hdGNoOiBPUyA8PCAiT1BDX0NvbXBsZXRlTWF0Y2giOyBicmVhazsgICAgCisgICAgfQorICAgIAorICAgIE9TLlBhZFRvQ29sdW1uKDQwKSA8PCAiID0gIiA8PCBPcGNvZGVGcmVxW2ldIDw8ICdcbic7CisgIH0KKyAgT1MgPDwgJ1xuJzsKK30KKworCit2b2lkIGxsdm06OkVtaXRNYXRjaGVyVGFibGUoY29uc3QgTWF0Y2hlciAqVGhlTWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuREFHUGF0dGVybnMgJkNHUCwgcmF3X29zdHJlYW0gJk8pIHsKKyAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIE9TKE8pOworICAKKyAgT1MgPDwgIi8vIFRoZSBtYWluIGluc3RydWN0aW9uIHNlbGVjdG9yIGNvZGUuXG4iOworICBPUyA8PCAiU0ROb2RlICpTZWxlY3RDb2RlKFNETm9kZSAqTikge1xuIjsKKworICBNYXRjaGVyVGFibGVFbWl0dGVyIE1hdGNoZXJFbWl0dGVyKENHUCk7CisKKyAgT1MgPDwgIiAgLy8gT3Bjb2RlcyBhcmUgZW1pdHRlZCBhcyAyIGJ5dGVzLCBUQVJHRVRfT1BDT0RFIGhhbmRsZXMgdGhpcy5cbiI7CisgIE9TIDw8ICIgICNkZWZpbmUgVEFSR0VUX09QQ09ERShYKSBYICYgMjU1LCB1bnNpZ25lZChYKSA+PiA4XG4iOworICBPUyA8PCAiICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBNYXRjaGVyVGFibGVbXSA9IHtcbiI7CisgIHVuc2lnbmVkIFRvdGFsU2l6ZSA9IE1hdGNoZXJFbWl0dGVyLkVtaXRNYXRjaGVyTGlzdChUaGVNYXRjaGVyLCA1LCAwLCBPUyk7CisgIE9TIDw8ICIgICAgMFxuICB9OyAvLyBUb3RhbCBBcnJheSBzaXplIGlzICIgPDwgKFRvdGFsU2l6ZSsxKSA8PCAiIGJ5dGVzXG5cbiI7CisgIAorICBNYXRjaGVyRW1pdHRlci5FbWl0SGlzdG9ncmFtKFRoZU1hdGNoZXIsIE9TKTsKKyAgCisgIE9TIDw8ICIgICN1bmRlZiBUQVJHRVRfT1BDT0RFXG4iOworICBPUyA8PCAiICByZXR1cm4gU2VsZWN0Q29kZUNvbW1vbihOLCBNYXRjaGVyVGFibGUsc2l6ZW9mKE1hdGNoZXJUYWJsZSkpO1xufVxuIjsKKyAgT1MgPDwgJ1xuJzsKKyAgCisgIC8vIE5leHQgdXAsIGVtaXQgdGhlIGZ1bmN0aW9uIGZvciBub2RlIGFuZCBwYXR0ZXJuIHByZWRpY2F0ZXM6CisgIE1hdGNoZXJFbWl0dGVyLkVtaXRQcmVkaWNhdGVGdW5jdGlvbnMoT1MpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vREFHSVNlbE1hdGNoZXJHZW4uY3BwIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vREFHSVNlbE1hdGNoZXJHZW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTY2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9EQUdJU2VsTWF0Y2hlckdlbi5jcHAKQEAgLTAsMCArMSw5MTAgQEAKKy8vPT09LSBEQUdJU2VsTWF0Y2hlckdlbi5jcHAgLSBNYXRjaGVyIGdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJEQUdJU2VsTWF0Y2hlci5oIgorI2luY2x1ZGUgIkNvZGVHZW5EQUdQYXR0ZXJucy5oIgorI2luY2x1ZGUgIlJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisKKy8vLyBnZXRSZWdpc3RlclZhbHVlVHlwZSAtIExvb2sgdXAgYW5kIHJldHVybiB0aGUgVmFsdWVUeXBlIG9mIHRoZSBzcGVjaWZpZWQKKy8vLyByZWdpc3Rlci4gSWYgdGhlIHJlZ2lzdGVyIGlzIGEgbWVtYmVyIG9mIG11bHRpcGxlIHJlZ2lzdGVyIGNsYXNzZXMgd2hpY2gKKy8vLyBoYXZlIGRpZmZlcmVudCBhc3NvY2lhdGVkIHR5cGVzLCByZXR1cm4gTVZUOjpPdGhlci4KK3N0YXRpYyBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBnZXRSZWdpc3RlclZhbHVlVHlwZShSZWNvcmQgKlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlblRhcmdldCAmVCkgeworICBib29sIEZvdW5kUkMgPSBmYWxzZTsKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVlQgPSBNVlQ6Ok90aGVyOworICBjb25zdCBzdGQ6OnZlY3RvcjxDb2RlR2VuUmVnaXN0ZXJDbGFzcz4gJlJDcyA9IFQuZ2V0UmVnaXN0ZXJDbGFzc2VzKCk7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvciBFbGVtZW50OworICAKKyAgZm9yICh1bnNpZ25lZCByYyA9IDAsIGUgPSBSQ3Muc2l6ZSgpOyByYyAhPSBlOyArK3JjKSB7CisgICAgY29uc3QgQ29kZUdlblJlZ2lzdGVyQ2xhc3MgJlJDID0gUkNzW3JjXTsKKyAgICBpZiAoIXN0ZDo6Y291bnQoUkMuRWxlbWVudHMuYmVnaW4oKSwgUkMuRWxlbWVudHMuZW5kKCksIFIpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgaWYgKCFGb3VuZFJDKSB7CisgICAgICBGb3VuZFJDID0gdHJ1ZTsKKyAgICAgIFZUID0gUkMuZ2V0VmFsdWVUeXBlTnVtKDApOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBvY2N1cnMgaW4gbXVsdGlwbGUgcmVnaXN0ZXIgY2xhc3NlcywgdGhleSBhbGwgaGF2ZSB0byBhZ3JlZS4KKyAgICBhc3NlcnQoVlQgPT0gUkMuZ2V0VmFsdWVUeXBlTnVtKDApKTsKKyAgfQorICByZXR1cm4gVlQ7Cit9CisKKworbmFtZXNwYWNlIHsKKyAgY2xhc3MgTWF0Y2hlckdlbiB7CisgICAgY29uc3QgUGF0dGVyblRvTWF0Y2ggJlBhdHRlcm47CisgICAgY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZDR1A7CisgICAgCisgICAgLy8vIFBhdFdpdGhOb1R5cGVzIC0gVGhpcyBpcyBhIGNsb25lIG9mIFBhdHRlcm4uZ2V0U3JjUGF0dGVybigpIHRoYXQgc3RhcnRzCisgICAgLy8vIG91dCB3aXRoIGFsbCBvZiB0aGUgdHlwZXMgcmVtb3ZlZC4gIFRoaXMgYWxsb3dzIHVzIHRvIGluc2VydCB0eXBlIGNoZWNrcworICAgIC8vLyBhcyB3ZSBzY2FuIHRoZSB0cmVlLgorICAgIFRyZWVQYXR0ZXJuTm9kZSAqUGF0V2l0aE5vVHlwZXM7CisgICAgCisgICAgLy8vIFZhcmlhYmxlTWFwIC0gQSBtYXAgZnJvbSB2YXJpYWJsZSBuYW1lcyAoJyRkc3QnKSB0byB0aGUgcmVjb3JkZWQgb3BlcmFuZAorICAgIC8vLyBudW1iZXIgdGhhdCB0aGV5IHdlcmUgY2FwdHVyZWQgYXMuICBUaGVzZSBhcmUgYmlhc2VkIGJ5IDEgdG8gbWFrZQorICAgIC8vLyBpbnNlcnRpb24gZWFzaWVyLgorICAgIFN0cmluZ01hcDx1bnNpZ25lZD4gVmFyaWFibGVNYXA7CisgICAgCisgICAgLy8vIE5leHRSZWNvcmRlZE9wZXJhbmRObyAtIEFzIHdlIGVtaXQgb3Bjb2RlcyB0byByZWNvcmQgbWF0Y2hlZCB2YWx1ZXMgaW4KKyAgICAvLy8gdGhlIFJlY29yZGVkTm9kZXMgYXJyYXksIHRoaXMga2VlcHMgdHJhY2sgb2Ygd2hpY2ggc2xvdCB3aWxsIGJlIG5leHQgdG8KKyAgICAvLy8gcmVjb3JkIGludG8uCisgICAgdW5zaWduZWQgTmV4dFJlY29yZGVkT3BlcmFuZE5vOworICAgIAorICAgIC8vLyBNYXRjaGVkQ2hhaW5Ob2RlcyAtIFRoaXMgbWFpbnRhaW5zIHRoZSBwb3NpdGlvbiBpbiB0aGUgcmVjb3JkZWQgbm9kZXMKKyAgICAvLy8gYXJyYXkgb2YgYWxsIG9mIHRoZSByZWNvcmRlZCBpbnB1dCBub2RlcyB0aGF0IGhhdmUgY2hhaW5zLgorICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiBNYXRjaGVkQ2hhaW5Ob2RlczsKKworICAgIC8vLyBNYXRjaGVkRmxhZ1Jlc3VsdE5vZGVzIC0gVGhpcyBtYWludGFpbnMgdGhlIHBvc2l0aW9uIGluIHRoZSByZWNvcmRlZAorICAgIC8vLyBub2RlcyBhcnJheSBvZiBhbGwgb2YgdGhlIHJlY29yZGVkIGlucHV0IG5vZGVzIHRoYXQgaGF2ZSBmbGFnIHJlc3VsdHMuCisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IE1hdGNoZWRGbGFnUmVzdWx0Tm9kZXM7CisgICAgCisgICAgLy8vIE1hdGNoZWRDb21wbGV4UGF0dGVybnMgLSBUaGlzIG1haW50YWlucyBhIGxpc3Qgb2YgYWxsIG9mIHRoZQorICAgIC8vLyBDb21wbGV4UGF0dGVybnMgdGhhdCB3ZSBuZWVkIHRvIGNoZWNrLiAgVGhlIHBhdHRlcm5zIGFyZSBrbm93biB0byBoYXZlCisgICAgLy8vIG5hbWVzIHdoaWNoIHdlcmUgcmVjb3JkZWQuICBUaGUgc2Vjb25kIGVsZW1lbnQgb2YgZWFjaCBwYWlyIGlzIHRoZSBmaXJzdAorICAgIC8vLyBzbG90IG51bWJlciB0aGF0IHRoZSBPUENfQ2hlY2tDb21wbGV4UGF0IG9wY29kZSBkcm9wcyB0aGUgbWF0Y2hlZAorICAgIC8vLyByZXN1bHRzIGludG8uCisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkPiwgMj4gTWF0Y2hlZENvbXBsZXhQYXR0ZXJuczsKKyAgICAKKyAgICAvLy8gUGh5c1JlZ0lucHV0cyAtIExpc3QgbGlzdCBoYXMgYW4gZW50cnkgZm9yIGVhY2ggZXhwbGljaXRseSBzcGVjaWZpZWQKKyAgICAvLy8gcGh5c3JlZyBpbnB1dCB0byB0aGUgcGF0dGVybi4gIFRoZSBmaXJzdCBlbHQgaXMgdGhlIFJlZ2lzdGVyIG5vZGUsIHRoZQorICAgIC8vLyBzZWNvbmQgaXMgdGhlIHJlY29yZGVkIHNsb3QgbnVtYmVyIHRoZSBpbnB1dCBwYXR0ZXJuIG1hdGNoIHNhdmVkIGl0IGluLgorICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxSZWNvcmQqLCB1bnNpZ25lZD4sIDI+IFBoeXNSZWdJbnB1dHM7CisgICAgCisgICAgLy8vIE1hdGNoZXIgLSBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGdlbmVyYXRlZCBtYXRjaGVyLCB0aGUgcmVzdWx0LgorICAgIE1hdGNoZXIgKlRoZU1hdGNoZXI7CisgICAgCisgICAgLy8vIEN1clByZWRpY2F0ZSAtIEFzIHdlIGVtaXQgbWF0Y2hlciBub2RlcywgdGhpcyBwb2ludHMgdG8gdGhlIGxhdGVzdCBjaGVjaworICAgIC8vLyB3aGljaCBzaG91bGQgaGF2ZSBmdXR1cmUgY2hlY2tzIHN0dWNrIGludG8gaXRzIE5leHQgcG9zaXRpb24uCisgICAgTWF0Y2hlciAqQ3VyUHJlZGljYXRlOworICBwdWJsaWM6CisgICAgTWF0Y2hlckdlbihjb25zdCBQYXR0ZXJuVG9NYXRjaCAmcGF0dGVybiwgY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZjZ3ApOworICAgIAorICAgIH5NYXRjaGVyR2VuKCkgeworICAgICAgZGVsZXRlIFBhdFdpdGhOb1R5cGVzOworICAgIH0KKyAgICAKKyAgICBib29sIEVtaXRNYXRjaGVyQ29kZSh1bnNpZ25lZCBWYXJpYW50KTsKKyAgICB2b2lkIEVtaXRSZXN1bHRDb2RlKCk7CisgICAgCisgICAgTWF0Y2hlciAqR2V0TWF0Y2hlcigpIGNvbnN0IHsgcmV0dXJuIFRoZU1hdGNoZXI7IH0KKyAgICBNYXRjaGVyICpHZXRDdXJQcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiBDdXJQcmVkaWNhdGU7IH0KKyAgcHJpdmF0ZToKKyAgICB2b2lkIEFkZE1hdGNoZXIoTWF0Y2hlciAqTmV3Tm9kZSk7CisgICAgdm9pZCBJbmZlclBvc3NpYmxlVHlwZXMoKTsKKyAgICAKKyAgICAvLyBNYXRjaGVyIEdlbmVyYXRpb24uCisgICAgdm9pZCBFbWl0TWF0Y2hDb2RlKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTiwgVHJlZVBhdHRlcm5Ob2RlICpOb2RlTm9UeXBlcyk7CisgICAgdm9pZCBFbWl0TGVhZk1hdGNoQ29kZShjb25zdCBUcmVlUGF0dGVybk5vZGUgKk4pOworICAgIHZvaWQgRW1pdE9wZXJhdG9yTWF0Y2hDb2RlKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlUGF0dGVybk5vZGUgKk5vZGVOb1R5cGVzKTsKKyAgICAKKyAgICAvLyBSZXN1bHQgQ29kZSBHZW5lcmF0aW9uLgorICAgIHVuc2lnbmVkIGdldE5hbWVkQXJndW1lbnRTbG90KFN0cmluZ1JlZiBOYW1lKSB7CisgICAgICB1bnNpZ25lZCBWYXJNYXBFbnRyeSA9IFZhcmlhYmxlTWFwW05hbWVdOworICAgICAgYXNzZXJ0KFZhck1hcEVudHJ5ICE9IDAgJiYKKyAgICAgICAgICAgICAiVmFyaWFibGUgcmVmZXJlbmNlZCBidXQgbm90IGRlZmluZWQgYW5kIG5vdCBjYXVnaHQgZWFybGllciEiKTsKKyAgICAgIHJldHVybiBWYXJNYXBFbnRyeS0xOworICAgIH0KKworICAgIC8vLyBHZXRJbnN0UGF0dGVybk5vZGUgLSBHZXQgdGhlIHBhdHRlcm4gZm9yIGFuIGluc3RydWN0aW9uLgorICAgIGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqR2V0SW5zdFBhdHRlcm5Ob2RlKGNvbnN0IERBR0luc3RydWN0aW9uICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJlZVBhdHRlcm5Ob2RlICpOKTsKKyAgICAKKyAgICB2b2lkIEVtaXRSZXN1bHRPcGVyYW5kKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJlJlc3VsdE9wcyk7CisgICAgdm9pZCBFbWl0UmVzdWx0T2ZOYW1lZE9wZXJhbmQoY29uc3QgVHJlZVBhdHRlcm5Ob2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJlJlc3VsdE9wcyk7CisgICAgdm9pZCBFbWl0UmVzdWx0TGVhZkFzT3BlcmFuZChjb25zdCBUcmVlUGF0dGVybk5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZSZXN1bHRPcHMpOworICAgIHZvaWQgRW1pdFJlc3VsdEluc3RydWN0aW9uQXNPcGVyYW5kKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZSZXN1bHRPcHMpOworICAgIHZvaWQgRW1pdFJlc3VsdFNETm9kZVhGb3JtQXNPcGVyYW5kKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZSZXN1bHRPcHMpOworICAgIH07CisgIAorfSAvLyBlbmQgYW5vbiBuYW1lc3BhY2UuCisKK01hdGNoZXJHZW46Ok1hdGNoZXJHZW4oY29uc3QgUGF0dGVyblRvTWF0Y2ggJnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmY2dwKQorOiBQYXR0ZXJuKHBhdHRlcm4pLCBDR1AoY2dwKSwgTmV4dFJlY29yZGVkT3BlcmFuZE5vKDApLAorICBUaGVNYXRjaGVyKDApLCBDdXJQcmVkaWNhdGUoMCkgeworICAvLyBXZSBuZWVkIHRvIHByb2R1Y2UgdGhlIG1hdGNoZXIgdHJlZSBmb3IgdGhlIHBhdHRlcm5zIHNvdXJjZSBwYXR0ZXJuLiAgVG8gZG8KKyAgLy8gdGhpcyB3ZSBuZWVkIHRvIG1hdGNoIHRoZSBzdHJ1Y3R1cmUgYXMgd2VsbCBhcyB0aGUgdHlwZXMuICBUbyBkbyB0aGUgdHlwZQorICAvLyBtYXRjaGluZywgd2Ugd2FudCB0byBmaWd1cmUgb3V0IHRoZSBmZXdlc3QgbnVtYmVyIG9mIHR5cGUgY2hlY2tzIHdlIG5lZWQgdG8KKyAgLy8gZW1pdC4gIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBpbnRlZ2VyIHR5cGUgc3VwcG9ydGVkIGJ5IGEKKyAgLy8gdGFyZ2V0LCB0aGVyZSBzaG91bGQgYmUgbm8gdHlwZSBjb21wYXJpc29ucyBhdCBhbGwgZm9yIGludGVnZXIgcGF0dGVybnMhCisgIC8vCisgIC8vIFRvIGZpZ3VyZSBvdXQgdGhlIGZld2VzdCBudW1iZXIgb2YgdHlwZSBjaGVja3MgbmVlZGVkLCBjbG9uZSB0aGUgcGF0dGVybiwKKyAgLy8gcmVtb3ZlIHRoZSB0eXBlcywgdGhlbiBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSBwYXR0ZXJuIGFzIGEgd2hvbGUuCisgIC8vIElmIHRoZXJlIGFyZSB1bnJlc29sdmVkIHR5cGVzLCBlbWl0IGFuIGV4cGxpY2l0IGNoZWNrIGZvciB0aG9zZSB0eXBlcywKKyAgLy8gYXBwbHkgdGhlIHR5cGUgdG8gdGhlIHRyZWUsIHRoZW4gcmVydW4gdHlwZSBpbmZlcmVuY2UuICBJdGVyYXRlIHVudGlsIGFsbAorICAvLyB0eXBlcyBhcmUgcmVzb2x2ZWQuCisgIC8vCisgIFBhdFdpdGhOb1R5cGVzID0gUGF0dGVybi5nZXRTcmNQYXR0ZXJuKCktPmNsb25lKCk7CisgIFBhdFdpdGhOb1R5cGVzLT5SZW1vdmVBbGxUeXBlcygpOworICAgIAorICAvLyBJZiB0aGVyZSBhcmUgdHlwZXMgdGhhdCBhcmUgbWFuaWZlc3RseSBrbm93biwgaW5mZXIgdGhlbS4KKyAgSW5mZXJQb3NzaWJsZVR5cGVzKCk7Cit9CisKKy8vLyBJbmZlclBvc3NpYmxlVHlwZXMgLSBBcyB3ZSBlbWl0IHRoZSBwYXR0ZXJuLCB3ZSBlbmQgdXAgZ2VuZXJhdGluZyB0eXBlCisvLy8gY2hlY2tzIGFuZCBhcHBseWluZyB0aGVtIHRvIHRoZSAnUGF0V2l0aE5vVHlwZXMnIHRyZWUuICBBcyB3ZSBkbyB0aGlzLCB3ZQorLy8vIHdhbnQgdG8gcHJvcGFnYXRlIGltcGxpZWQgdHlwZXMgYXMgZmFyIHRocm91Z2hvdXQgdGhlIHRyZWUgYXMgcG9zc2libGUgc28KKy8vLyB0aGF0IHdlIGF2b2lkIGRvaW5nIHJlZHVuZGFudCB0eXBlIGNoZWNrcy4gIFRoaXMgZG9lcyB0aGUgdHlwZSBwcm9wYWdhdGlvbi4KK3ZvaWQgTWF0Y2hlckdlbjo6SW5mZXJQb3NzaWJsZVR5cGVzKCkgeworICAvLyBUUCAtIEdldCAqU09NRSogdHJlZSBwYXR0ZXJuLCB3ZSBkb24ndCBjYXJlIHdoaWNoLiAgSXQgaXMgb25seSB1c2VkIGZvcgorICAvLyBkaWFnbm9zdGljcywgd2hpY2ggd2Uga25vdyBhcmUgaW1wb3NzaWJsZSBhdCB0aGlzIHBvaW50LgorICBUcmVlUGF0dGVybiAmVFAgPSAqQ0dQLnBmX2JlZ2luKCktPnNlY29uZDsKKyAgCisgIHRyeSB7CisgICAgYm9vbCBNYWRlQ2hhbmdlID0gdHJ1ZTsKKyAgICB3aGlsZSAoTWFkZUNoYW5nZSkKKyAgICAgIE1hZGVDaGFuZ2UgPSBQYXRXaXRoTm9UeXBlcy0+QXBwbHlUeXBlQ29uc3RyYWludHMoVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLypJZ25vcmUgcmVnIGNvbnN0cmFpbnRzKi8pOworICB9IGNhdGNoICguLi4pIHsKKyAgICBlcnJzKCkgPDwgIlR5cGUgY29uc3RyYWludCBhcHBsaWNhdGlvbiBzaG91bGRuJ3QgZmFpbCEiOworICAgIGFib3J0KCk7CisgIH0KK30KKworCisvLy8gQWRkTWF0Y2hlciAtIEFkZCBhIG1hdGNoZXIgbm9kZSB0byB0aGUgY3VycmVudCBncmFwaCB3ZSdyZSBidWlsZGluZy4gCit2b2lkIE1hdGNoZXJHZW46OkFkZE1hdGNoZXIoTWF0Y2hlciAqTmV3Tm9kZSkgeworICBpZiAoQ3VyUHJlZGljYXRlICE9IDApCisgICAgQ3VyUHJlZGljYXRlLT5zZXROZXh0KE5ld05vZGUpOworICBlbHNlCisgICAgVGhlTWF0Y2hlciA9IE5ld05vZGU7CisgIEN1clByZWRpY2F0ZSA9IE5ld05vZGU7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhdHRlcm4gTWF0Y2ggR2VuZXJhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEVtaXRMZWFmTWF0Y2hDb2RlIC0gR2VuZXJhdGUgbWF0Y2hpbmcgY29kZSBmb3IgbGVhZiBub2Rlcy4KK3ZvaWQgTWF0Y2hlckdlbjo6RW1pdExlYWZNYXRjaENvZGUoY29uc3QgVHJlZVBhdHRlcm5Ob2RlICpOKSB7CisgIGFzc2VydChOLT5pc0xlYWYoKSAmJiAiTm90IGEgbGVhZj8iKTsKKyAgCisgIC8vIERpcmVjdCBtYXRjaCBhZ2FpbnN0IGFuIGludGVnZXIgY29uc3RhbnQuCisgIGlmIChJbnRJbml0ICpJSSA9IGR5bmFtaWNfY2FzdDxJbnRJbml0Kj4oTi0+Z2V0TGVhZlZhbHVlKCkpKSB7CisgICAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgZGFnIHdlJ3JlIG1hdGNoaW5nLCB3ZSBlbWl0IGEgcmVkdW5kYW50IG9wY29kZQorICAgIC8vIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoaXMgZ2V0cyBmb2xkZWQgaW50byB0aGUgbm9ybWFsIHRvcC1sZXZlbAorICAgIC8vIE9wY29kZVN3aXRjaC4KKyAgICBpZiAoTiA9PSBQYXR0ZXJuLmdldFNyY1BhdHRlcm4oKSkgeworICAgICAgY29uc3QgU0ROb2RlSW5mbyAmTkkgPSBDR1AuZ2V0U0ROb2RlSW5mbyhDR1AuZ2V0U0ROb2RlTmFtZWQoImltbSIpKTsKKyAgICAgIEFkZE1hdGNoZXIobmV3IENoZWNrT3Bjb2RlTWF0Y2hlcihOSSkpOworICAgIH0KKworICAgIHJldHVybiBBZGRNYXRjaGVyKG5ldyBDaGVja0ludGVnZXJNYXRjaGVyKElJLT5nZXRWYWx1ZSgpKSk7CisgIH0KKyAgCisgIERlZkluaXQgKkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihOLT5nZXRMZWFmVmFsdWUoKSk7CisgIGlmIChESSA9PSAwKSB7CisgICAgZXJycygpIDw8ICJVbmtub3duIGxlYWYga2luZDogIiA8PCAqREkgPDwgIlxuIjsKKyAgICBhYm9ydCgpOworICB9CisgIAorICBSZWNvcmQgKkxlYWZSZWMgPSBESS0+Z2V0RGVmKCk7CisgIGlmICgvLyBIYW5kbGUgcmVnaXN0ZXIgcmVmZXJlbmNlcy4gIE5vdGhpbmcgdG8gZG8gaGVyZSwgdGhleSBhbHdheXMgbWF0Y2guCisgICAgICBMZWFmUmVjLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyQ2xhc3MiKSB8fCAKKyAgICAgIExlYWZSZWMtPmlzU3ViQ2xhc3NPZigiUG9pbnRlckxpa2VSZWdDbGFzcyIpIHx8CisgICAgICBMZWFmUmVjLT5pc1N1YkNsYXNzT2YoIlN1YlJlZ0luZGV4IikgfHwKKyAgICAgIC8vIFBsYWNlIGhvbGRlciBmb3IgU1JDVkFMVUUgbm9kZXMuIE5vdGhpbmcgdG8gZG8gaGVyZS4KKyAgICAgIExlYWZSZWMtPmdldE5hbWUoKSA9PSAic3JjdmFsdWUiKQorICAgIHJldHVybjsKKworICAvLyBJZiB3ZSBoYXZlIGEgcGh5c3JlZyByZWZlcmVuY2UgbGlrZSAobXVsIGdwcjokc3JjLCBFQVgpIHRoZW4gd2UgbmVlZCB0bworICAvLyByZWNvcmQgdGhlIHJlZ2lzdGVyIAorICBpZiAoTGVhZlJlYy0+aXNTdWJDbGFzc09mKCJSZWdpc3RlciIpKSB7CisgICAgQWRkTWF0Y2hlcihuZXcgUmVjb3JkTWF0Y2hlcigicGh5c3JlZyBpbnB1dCAiK0xlYWZSZWMtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRSZWNvcmRlZE9wZXJhbmRObykpOworICAgIFBoeXNSZWdJbnB1dHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKExlYWZSZWMsIE5leHRSZWNvcmRlZE9wZXJhbmRObysrKSk7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZiAoTGVhZlJlYy0+aXNTdWJDbGFzc09mKCJWYWx1ZVR5cGUiKSkKKyAgICByZXR1cm4gQWRkTWF0Y2hlcihuZXcgQ2hlY2tWYWx1ZVR5cGVNYXRjaGVyKExlYWZSZWMtPmdldE5hbWUoKSkpOworICAKKyAgaWYgKExlYWZSZWMtPmlzU3ViQ2xhc3NPZigiQ29uZENvZGUiKSkKKyAgICByZXR1cm4gQWRkTWF0Y2hlcihuZXcgQ2hlY2tDb25kQ29kZU1hdGNoZXIoTGVhZlJlYy0+Z2V0TmFtZSgpKSk7CisgIAorICBpZiAoTGVhZlJlYy0+aXNTdWJDbGFzc09mKCJDb21wbGV4UGF0dGVybiIpKSB7CisgICAgLy8gV2UgY2FuJ3QgbW9kZWwgQ29tcGxleFBhdHRlcm4gdXNlcyB0aGF0IGRvbid0IGhhdmUgdGhlaXIgbmFtZSB0YWtlbiB5ZXQuCisgICAgLy8gVGhlIE9QQ19DaGVja0NvbXBsZXhQYXR0ZXJuIG9wZXJhdGlvbiBpbXBsaWNpdGx5IHJlY29yZHMgdGhlIHJlc3VsdHMuCisgICAgaWYgKE4tPmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgICBlcnJzKCkgPDwgIldlIGV4cGVjdCBjb21wbGV4IHBhdHRlcm4gdXNlcyB0byBoYXZlIG5hbWVzOiAiIDw8ICpOIDw8ICJcbiI7CisgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8vIFJlbWVtYmVyIHRoaXMgQ29tcGxleFBhdHRlcm4gc28gdGhhdCB3ZSBjYW4gZW1pdCBpdCBhZnRlciBhbGwgdGhlIG90aGVyCisgICAgLy8gc3RydWN0dXJhbCBtYXRjaGVzIGFyZSBkb25lLgorICAgIE1hdGNoZWRDb21wbGV4UGF0dGVybnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE4sIDApKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIGVycnMoKSA8PCAiVW5rbm93biBsZWFmIGtpbmQ6ICIgPDwgKk4gPDwgIlxuIjsKKyAgYWJvcnQoKTsKK30KKwordm9pZCBNYXRjaGVyR2VuOjpFbWl0T3BlcmF0b3JNYXRjaENvZGUoY29uc3QgVHJlZVBhdHRlcm5Ob2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVBhdHRlcm5Ob2RlICpOb2RlTm9UeXBlcykgeworICBhc3NlcnQoIU4tPmlzTGVhZigpICYmICJOb3QgYW4gb3BlcmF0b3I/Iik7CisgIGNvbnN0IFNETm9kZUluZm8gJkNJbmZvID0gQ0dQLmdldFNETm9kZUluZm8oTi0+Z2V0T3BlcmF0b3IoKSk7CisgIAorICAvLyBJZiB0aGlzIGlzIGFuICdhbmQgUiwgMTIzNCcgd2hlcmUgdGhlIG9wZXJhdGlvbiBpcyBBTkQvT1IgYW5kIHRoZSBSSFMgaXMKKyAgLy8gYSBjb25zdGFudCB3aXRob3V0IGEgcHJlZGljYXRlIGZuIHRoYXQgaGFzIG1vcmUgdGhhdCBvbmUgYml0IHNldCwgaGFuZGxlCisgIC8vIHRoaXMgYXMgYSBzcGVjaWFsIGNhc2UuICBUaGlzIGlzIHVzdWFsbHkgZm9yIHRhcmdldHMgdGhhdCBoYXZlIHNwZWNpYWwKKyAgLy8gaGFuZGxpbmcgb2YgY2VydGFpbiBsYXJnZSBjb25zdGFudHMgKGUuZy4gYWxwaGEgd2l0aCBpdCdzIDgvMTYvMzItYml0CisgIC8vIGhhbmRsaW5nIHN0dWZmKS4gIFVzaW5nIHRoZXNlIGluc3RydWN0aW9ucyBpcyBvZnRlbiBmYXIgbW9yZSBlZmZpY2llbnQKKyAgLy8gdGhhbiBtYXRlcmlhbGl6aW5nIHRoZSBjb25zdGFudC4gIFVuZm9ydHVuYXRlbHksIGJvdGggdGhlIGluc3Rjb21iaW5lcgorICAvLyBhbmQgdGhlIGRhZyBjb21iaW5lciBjYW4gb2Z0ZW4gaW5mZXIgdGhhdCBiaXRzIGFyZSBkZWFkLCBhbmQgdGh1cyBkcm9wCisgIC8vIHRoZW0gZnJvbSB0aGUgbWFzayBpbiB0aGUgZGFnLiAgRm9yIGV4YW1wbGUsIGl0IG1pZ2h0IHR1cm4gJ0FORCBYLCAyNTUnCisgIC8vIGludG8gJ0FORCBYLCAyNTQnIGlmIGl0IGtub3dzIHRoZSBsb3cgYml0IGlzIHNldC4gIEVtaXQgY29kZSB0aGF0IGNoZWNrcworICAvLyB0byBoYW5kbGUgdGhpcy4KKyAgaWYgKChOLT5nZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgPT0gImFuZCIgfHwgCisgICAgICAgTi0+Z2V0T3BlcmF0b3IoKS0+Z2V0TmFtZSgpID09ICJvciIpICYmCisgICAgICBOLT5nZXRDaGlsZCgxKS0+aXNMZWFmKCkgJiYgTi0+Z2V0Q2hpbGQoMSktPmdldFByZWRpY2F0ZUZucygpLmVtcHR5KCkgJiYKKyAgICAgIE4tPmdldFByZWRpY2F0ZUZucygpLmVtcHR5KCkpIHsKKyAgICBpZiAoSW50SW5pdCAqSUkgPSBkeW5hbWljX2Nhc3Q8SW50SW5pdCo+KE4tPmdldENoaWxkKDEpLT5nZXRMZWFmVmFsdWUoKSkpIHsKKyAgICAgIGlmICghaXNQb3dlck9mMl8zMihJSS0+Z2V0VmFsdWUoKSkpIHsgIC8vIERvbid0IGJvdGhlciB3aXRoIHNpbmdsZSBiaXRzLgorICAgICAgICAvLyBJZiB0aGlzIGlzIGF0IHRoZSByb290IG9mIHRoZSBwYXR0ZXJuLCB3ZSBlbWl0IGEgcmVkdW5kYW50CisgICAgICAgIC8vIENoZWNrT3Bjb2RlIHNvIHRoYXQgdGhlIGZvbGxvd2luZyBjaGVja3MgZ2V0IGZhY3RvcmVkIHByb3Blcmx5IHVuZGVyCisgICAgICAgIC8vIGEgc2luZ2xlIG9wY29kZSBjaGVjay4KKyAgICAgICAgaWYgKE4gPT0gUGF0dGVybi5nZXRTcmNQYXR0ZXJuKCkpCisgICAgICAgICAgQWRkTWF0Y2hlcihuZXcgQ2hlY2tPcGNvZGVNYXRjaGVyKENJbmZvKSk7CisKKyAgICAgICAgLy8gRW1pdCB0aGUgQ2hlY2tBbmRJbW0vQ2hlY2tPckltbSBub2RlLgorICAgICAgICBpZiAoTi0+Z2V0T3BlcmF0b3IoKS0+Z2V0TmFtZSgpID09ICJhbmQiKQorICAgICAgICAgIEFkZE1hdGNoZXIobmV3IENoZWNrQW5kSW1tTWF0Y2hlcihJSS0+Z2V0VmFsdWUoKSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgQWRkTWF0Y2hlcihuZXcgQ2hlY2tPckltbU1hdGNoZXIoSUktPmdldFZhbHVlKCkpKTsKKworICAgICAgICAvLyBNYXRjaCB0aGUgTEhTIG9mIHRoZSBBTkQgYXMgYXBwcm9wcmlhdGUuCisgICAgICAgIEFkZE1hdGNoZXIobmV3IE1vdmVDaGlsZE1hdGNoZXIoMCkpOworICAgICAgICBFbWl0TWF0Y2hDb2RlKE4tPmdldENoaWxkKDApLCBOb2RlTm9UeXBlcy0+Z2V0Q2hpbGQoMCkpOworICAgICAgICBBZGRNYXRjaGVyKG5ldyBNb3ZlUGFyZW50TWF0Y2hlcigpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgY3VycmVudCBvcGNvZGUgbGluZXMgdXAuCisgIEFkZE1hdGNoZXIobmV3IENoZWNrT3Bjb2RlTWF0Y2hlcihDSW5mbykpOworICAKKyAgLy8gSWYgdGhpcyBub2RlIGhhcyBtZW1vcnkgcmVmZXJlbmNlcyAoaS5lLiBpcyBhIGxvYWQgb3Igc3RvcmUpLCB0ZWxsIHRoZQorICAvLyBpbnRlcnByZXRlciB0byBjYXB0dXJlIHRoZW0gaW4gdGhlIG1lbXJlZiBhcnJheS4KKyAgaWYgKE4tPk5vZGVIYXNQcm9wZXJ0eShTRE5QTWVtT3BlcmFuZCwgQ0dQKSkKKyAgICBBZGRNYXRjaGVyKG5ldyBSZWNvcmRNZW1SZWZNYXRjaGVyKCkpOworICAKKyAgLy8gSWYgdGhpcyBub2RlIGhhcyBhIGNoYWluLCB0aGVuIHRoZSBjaGFpbiBpcyBvcGVyYW5kICMwIGlzIHRoZSBTRE5vZGUsIGFuZAorICAvLyB0aGUgY2hpbGQgbnVtYmVycyBvZiB0aGUgbm9kZSBhcmUgYWxsIG9mZnNldCBieSBvbmUuCisgIHVuc2lnbmVkIE9wTm8gPSAwOworICBpZiAoTi0+Tm9kZUhhc1Byb3BlcnR5KFNETlBIYXNDaGFpbiwgQ0dQKSkgeworICAgIC8vIFJlY29yZCB0aGUgbm9kZSBhbmQgcmVtZW1iZXIgaXQgaW4gb3VyIGNoYWluZWQgbm9kZXMgbGlzdC4KKyAgICBBZGRNYXRjaGVyKG5ldyBSZWNvcmRNYXRjaGVyKCInIiArIE4tPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGNoYWluZWQgbm9kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXh0UmVjb3JkZWRPcGVyYW5kTm8pKTsKKyAgICAvLyBSZW1lbWJlciBhbGwgb2YgdGhlIGlucHV0IGNoYWlucyBvdXIgcGF0dGVybiB3aWxsIG1hdGNoLgorICAgIE1hdGNoZWRDaGFpbk5vZGVzLnB1c2hfYmFjayhOZXh0UmVjb3JkZWRPcGVyYW5kTm8rKyk7CisgICAgCisgICAgLy8gRG9uJ3QgbG9vayBhdCB0aGUgaW5wdXQgY2hhaW4gd2hlbiBtYXRjaGluZyB0aGUgdHJlZSBwYXR0ZXJuIHRvIHRoZQorICAgIC8vIFNETm9kZS4KKyAgICBPcE5vID0gMTsKKworICAgIC8vIElmIHRoaXMgbm9kZSBpcyBub3QgdGhlIHJvb3QgYW5kIHRoZSBzdWJ0cmVlIHVuZGVybmVhdGggaXQgcHJvZHVjZXMgYQorICAgIC8vIGNoYWluLCB0aGVuIHRoZSByZXN1bHQgb2YgbWF0Y2hpbmcgdGhlIG5vZGUgaXMgYWxzbyBwcm9kdWNlIGEgY2hhaW4uCisgICAgLy8gQmV5b25kIHRoYXQsIHRoaXMgbWVhbnMgdGhhdCB3ZSdyZSBhbHNvIGZvbGRpbmcgKGF0IGxlYXN0KSB0aGUgcm9vdCBub2RlCisgICAgLy8gaW50byB0aGUgbm9kZSB0aGF0IHByb2R1Y2UgdGhlIGNoYWluIChmb3IgZXhhbXBsZSwgbWF0Y2hpbmcKKyAgICAvLyAiKGFkZCByZWcsIChsb2FkIHB0cikpIiBhcyBhIGFkZF93aXRoX21lbW9yeSBvbiBYODYpLiAgVGhpcyBpcworICAgIC8vIHByb2JsZW1hdGljLCBpZiB0aGUgJ3JlZycgbm9kZSBhbHNvIHVzZXMgdGhlIGxvYWQgKHNheSwgaXRzIGNoYWluKS4KKyAgICAvLyBHcmFwaGljYWxseToKKyAgICAvLworICAgIC8vICAgICAgICAgW0xEXQorICAgIC8vICAgICAgICAgXiAgXgorICAgIC8vICAgICAgICAgfCAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBRydzIGxpa2UgY2hlZXNlLgorICAgIC8vICAgICAgICAvICAgIHwKKyAgICAvLyAgICAgICAvICAgIFtZWV0KKyAgICAvLyAgICAgICB8ICAgICBeCisgICAgLy8gICAgICBbWFhdLS0vCisgICAgLy8KKyAgICAvLyBJdCB3b3VsZCBiZSBpbnZhbGlkIHRvIGZvbGQgWFggYW5kIExELiAgSW4gdGhpcyBjYXNlLCBmb2xkaW5nIHRoZSB0d28KKyAgICAvLyBub2RlcyB0b2dldGhlciB3b3VsZCBpbmR1Y2UgYSBjeWNsZSBpbiB0aGUgREFHLCBtYWtpbmcgaXQgYSAnY3ljbGljIERBRycKKyAgICAvLyBUbyBwcmV2ZW50IHRoaXMsIHdlIGVtaXQgYSBkeW5hbWljIGNoZWNrIGZvciBsZWdhbGl0eSBiZWZvcmUgYWxsb3dpbmcKKyAgICAvLyB0aGlzIHRvIGJlIGZvbGRlZC4KKyAgICAvLworICAgIGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqUm9vdCA9IFBhdHRlcm4uZ2V0U3JjUGF0dGVybigpOworICAgIGlmIChOICE9IFJvb3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCB0aGUgcm9vdCBvZiB0aGUgcGF0dGVybi4KKyAgICAgIC8vIElmIHRoZXJlIGlzIGEgbm9kZSBiZXR3ZWVuIHRoZSByb290IGFuZCB0aGlzIG5vZGUsIHRoZW4gd2UgZGVmaW5pdGVseQorICAgICAgLy8gbmVlZCB0byBlbWl0IHRoZSBjaGVjay4KKyAgICAgIGJvb2wgTmVlZENoZWNrID0gIVJvb3QtPmhhc0NoaWxkKE4pOworICAgICAgCisgICAgICAvLyBJZiBpdCAqaXMqIGFuIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgcm9vdCwgd2UgY2FuIHN0aWxsIG5lZWQgYSBjaGVjayBpZgorICAgICAgLy8gdGhlIHJvb3QgU0ROb2RlIGhhcyBtdWx0aXBsZSBpbnB1dHMuICBGb3IgdXMsIHRoaXMgbWVhbnMgdGhhdCBpdCBpcyBhbgorICAgICAgLy8gaW50cmluc2ljLCBoYXMgbXVsdGlwbGUgb3BlcmFuZHMsIG9yIGhhcyBvdGhlciBpbnB1dHMgbGlrZSBjaGFpbiBvcgorICAgICAgLy8gZmxhZykuCisgICAgICBpZiAoIU5lZWRDaGVjaykgeworICAgICAgICBjb25zdCBTRE5vZGVJbmZvICZQSW5mbyA9IENHUC5nZXRTRE5vZGVJbmZvKFJvb3QtPmdldE9wZXJhdG9yKCkpOworICAgICAgICBOZWVkQ2hlY2sgPQorICAgICAgICAgIFJvb3QtPmdldE9wZXJhdG9yKCkgPT0gQ0dQLmdldF9pbnRyaW5zaWNfdm9pZF9zZG5vZGUoKSB8fAorICAgICAgICAgIFJvb3QtPmdldE9wZXJhdG9yKCkgPT0gQ0dQLmdldF9pbnRyaW5zaWNfd19jaGFpbl9zZG5vZGUoKSB8fAorICAgICAgICAgIFJvb3QtPmdldE9wZXJhdG9yKCkgPT0gQ0dQLmdldF9pbnRyaW5zaWNfd29fY2hhaW5fc2Rub2RlKCkgfHwKKyAgICAgICAgICBQSW5mby5nZXROdW1PcGVyYW5kcygpID4gMSB8fAorICAgICAgICAgIFBJbmZvLmhhc1Byb3BlcnR5KFNETlBIYXNDaGFpbikgfHwKKyAgICAgICAgICBQSW5mby5oYXNQcm9wZXJ0eShTRE5QSW5GbGFnKSB8fAorICAgICAgICAgIFBJbmZvLmhhc1Byb3BlcnR5KFNETlBPcHRJbkZsYWcpOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoTmVlZENoZWNrKQorICAgICAgICBBZGRNYXRjaGVyKG5ldyBDaGVja0ZvbGRhYmxlQ2hhaW5Ob2RlTWF0Y2hlcigpKTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGlzIG5vZGUgaGFzIGFuIG91dHB1dCBmbGFnIGFuZCBpc24ndCB0aGUgcm9vdCwgcmVtZW1iZXIgaXQuCisgIGlmIChOLT5Ob2RlSGFzUHJvcGVydHkoU0ROUE91dEZsYWcsIENHUCkgJiYgCisgICAgICBOICE9IFBhdHRlcm4uZ2V0U3JjUGF0dGVybigpKSB7CisgICAgLy8gVE9ETzogVGhpcyByZWR1bmRhbnRseSByZWNvcmRzIG5vZGVzIHdpdGggYm90aCBmbGFncyBhbmQgY2hhaW5zLgorICAgIAorICAgIC8vIFJlY29yZCB0aGUgbm9kZSBhbmQgcmVtZW1iZXIgaXQgaW4gb3VyIGNoYWluZWQgbm9kZXMgbGlzdC4KKyAgICBBZGRNYXRjaGVyKG5ldyBSZWNvcmRNYXRjaGVyKCInIiArIE4tPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGZsYWcgb3V0cHV0IG5vZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFJlY29yZGVkT3BlcmFuZE5vKSk7CisgICAgLy8gUmVtZW1iZXIgYWxsIG9mIHRoZSBub2RlcyB3aXRoIG91dHB1dCBmbGFncyBvdXIgcGF0dGVybiB3aWxsIG1hdGNoLgorICAgIE1hdGNoZWRGbGFnUmVzdWx0Tm9kZXMucHVzaF9iYWNrKE5leHRSZWNvcmRlZE9wZXJhbmRObysrKTsKKyAgfQorICAKKyAgLy8gSWYgdGhpcyBub2RlIGlzIGtub3duIHRvIGhhdmUgYW4gaW5wdXQgZmxhZyBvciBpZiBpdCAqbWlnaHQqIGhhdmUgYW4gaW5wdXQKKyAgLy8gZmxhZywgY2FwdHVyZSBpdCBhcyB0aGUgZmxhZyBpbnB1dCBvZiB0aGUgcGF0dGVybi4KKyAgaWYgKE4tPk5vZGVIYXNQcm9wZXJ0eShTRE5QT3B0SW5GbGFnLCBDR1ApIHx8CisgICAgICBOLT5Ob2RlSGFzUHJvcGVydHkoU0ROUEluRmxhZywgQ0dQKSkKKyAgICBBZGRNYXRjaGVyKG5ldyBDYXB0dXJlRmxhZ0lucHV0TWF0Y2hlcigpKTsKKyAgICAgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtQ2hpbGRyZW4oKTsgaSAhPSBlOyArK2ksICsrT3BObykgeworICAgIC8vIEdldCB0aGUgY29kZSBzdWl0YWJsZSBmb3IgbWF0Y2hpbmcgdGhpcyBjaGlsZC4gIE1vdmUgdG8gdGhlIGNoaWxkLCBjaGVjaworICAgIC8vIGl0IHRoZW4gbW92ZSBiYWNrIHRvIHRoZSBwYXJlbnQuCisgICAgQWRkTWF0Y2hlcihuZXcgTW92ZUNoaWxkTWF0Y2hlcihPcE5vKSk7CisgICAgRW1pdE1hdGNoQ29kZShOLT5nZXRDaGlsZChpKSwgTm9kZU5vVHlwZXMtPmdldENoaWxkKGkpKTsKKyAgICBBZGRNYXRjaGVyKG5ldyBNb3ZlUGFyZW50TWF0Y2hlcigpKTsKKyAgfQorfQorCisKK3ZvaWQgTWF0Y2hlckdlbjo6RW1pdE1hdGNoQ29kZShjb25zdCBUcmVlUGF0dGVybk5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVBhdHRlcm5Ob2RlICpOb2RlTm9UeXBlcykgeworICAvLyBJZiBOIGFuZCBOb2RlTm9UeXBlcyBkb24ndCBhZ3JlZSBvbiBhIHR5cGUsIHRoZW4gdGhpcyBpcyBhIGNhc2Ugd2hlcmUgd2UKKyAgLy8gbmVlZCB0byBkbyBhIHR5cGUgY2hlY2suICBFbWl0IHRoZSBjaGVjaywgYXBwbHkgdGhlIHR5ZXAgdG8gTm9kZU5vVHlwZXMgYW5kCisgIC8vIHJlaW5mZXIgYW55IGNvcnJlbGF0ZWQgdHlwZXMuCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiBSZXN1bHRzVG9UeXBlQ2hlY2s7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTm9kZU5vVHlwZXMtPmdldE51bVR5cGVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKE5vZGVOb1R5cGVzLT5nZXRFeHRUeXBlKGkpID09IE4tPmdldEV4dFR5cGUoaSkpIGNvbnRpbnVlOworICAgIE5vZGVOb1R5cGVzLT5zZXRUeXBlKGksIE4tPmdldEV4dFR5cGUoaSkpOworICAgIEluZmVyUG9zc2libGVUeXBlcygpOworICAgIFJlc3VsdHNUb1R5cGVDaGVjay5wdXNoX2JhY2soaSk7CisgIH0KKyAgCisgIC8vIElmIHRoaXMgbm9kZSBoYXMgYSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdCwgY2FwdHVyZSBpdCBpbiBWYXJpYWJsZU1hcC4gSWYKKyAgLy8gd2UgYWxyZWFkeSBzYXcgdGhpcyBpbiB0aGUgcGF0dGVybiwgZW1pdCBjb2RlIHRvIHZlcmlmeSBkYWduZXNzLgorICBpZiAoIU4tPmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgdW5zaWduZWQgJlZhck1hcEVudHJ5ID0gVmFyaWFibGVNYXBbTi0+Z2V0TmFtZSgpXTsKKyAgICBpZiAoVmFyTWFwRW50cnkgPT0gMCkgeworICAgICAgLy8gSWYgaXQgaXMgYSBuYW1lZCBub2RlLCB3ZSBtdXN0IGVtaXQgYSAnUmVjb3JkJyBvcGNvZGUuCisgICAgICBBZGRNYXRjaGVyKG5ldyBSZWNvcmRNYXRjaGVyKCIkIiArIE4tPmdldE5hbWUoKSwgTmV4dFJlY29yZGVkT3BlcmFuZE5vKSk7CisgICAgICBWYXJNYXBFbnRyeSA9ICsrTmV4dFJlY29yZGVkT3BlcmFuZE5vOworICAgIH0gZWxzZSB7CisgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgdGhpcyBpcyBhIHNlY29uZCByZWZlcmVuY2UgdG8gYSBzcGVjaWZpYyBuYW1lLiAgU2luY2UKKyAgICAgIC8vIHdlIGFscmVhZHkgaGF2ZSBjaGVja2VkIHRoYXQgdGhlIGZpcnN0IHJlZmVyZW5jZSBpcyB2YWxpZCwgd2UgZG9uJ3QKKyAgICAgIC8vIGhhdmUgdG8gcmVjdXJzaXZlbHkgbWF0Y2ggaXQsIGp1c3QgY2hlY2sgdGhhdCBpdCdzIHRoZSBzYW1lIGFzIHRoZQorICAgICAgLy8gcHJldmlvdXNseSBuYW1lZCB0aGluZy4KKyAgICAgIEFkZE1hdGNoZXIobmV3IENoZWNrU2FtZU1hdGNoZXIoVmFyTWFwRW50cnktMSkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAKKyAgaWYgKE4tPmlzTGVhZigpKQorICAgIEVtaXRMZWFmTWF0Y2hDb2RlKE4pOworICBlbHNlCisgICAgRW1pdE9wZXJhdG9yTWF0Y2hDb2RlKE4sIE5vZGVOb1R5cGVzKTsKKyAgCisgIC8vIElmIHRoZXJlIGFyZSBub2RlIHByZWRpY2F0ZXMgZm9yIHRoaXMgbm9kZSwgZ2VuZXJhdGUgdGhlaXIgY2hlY2tzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0UHJlZGljYXRlRm5zKCkuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBBZGRNYXRjaGVyKG5ldyBDaGVja1ByZWRpY2F0ZU1hdGNoZXIoTi0+Z2V0UHJlZGljYXRlRm5zKClbaV0pKTsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZXN1bHRzVG9UeXBlQ2hlY2suc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBBZGRNYXRjaGVyKG5ldyBDaGVja1R5cGVNYXRjaGVyKE4tPmdldFR5cGUoUmVzdWx0c1RvVHlwZUNoZWNrW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdHNUb1R5cGVDaGVja1tpXSkpOworfQorCisvLy8gRW1pdE1hdGNoZXJDb2RlIC0gR2VuZXJhdGUgdGhlIGNvZGUgdGhhdCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUgb2YgdGhpcworLy8vIHBhdHRlcm4gZm9yIHRoZSBzcGVjaWZpZWQgVmFyaWFudC4gIElmIHRoZSB2YXJpYW50IGlzIGludmFsaWQgdGhpcyByZXR1cm5zCisvLy8gdHJ1ZSBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgY29kZSwgaWYgaXQgaXMgdmFsaWQsIGl0IHJldHVybnMgZmFsc2UuCitib29sIE1hdGNoZXJHZW46OkVtaXRNYXRjaGVyQ29kZSh1bnNpZ25lZCBWYXJpYW50KSB7CisgIC8vIElmIHRoZSByb290IG9mIHRoZSBwYXR0ZXJuIGlzIGEgQ29tcGxleFBhdHRlcm4gYW5kIGlmIGl0IGlzIHNwZWNpZmllZCB0bworICAvLyBtYXRjaCBzb21lIG51bWJlciBvZiByb290IG9wY29kZXMsIHRoZXNlIGFyZSBjb25zaWRlcmVkIHRvIGJlIG91ciB2YXJpYW50cy4KKyAgLy8gRGVwZW5kaW5nIG9uIHdoaWNoIHZhcmlhbnQgd2UncmUgZ2VuZXJhdGluZyBjb2RlIGZvciwgZW1pdCB0aGUgcm9vdCBvcGNvZGUKKyAgLy8gY2hlY2suCisgIGlmIChjb25zdCBDb21wbGV4UGF0dGVybiAqQ1AgPQorICAgICAgICAgICAgICAgICAgIFBhdHRlcm4uZ2V0U3JjUGF0dGVybigpLT5nZXRDb21wbGV4UGF0dGVybkluZm8oQ0dQKSkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+ICZPcE5vZGVzID0gQ1AtPmdldFJvb3ROb2RlcygpOworICAgIGFzc2VydCghT3BOb2Rlcy5lbXB0eSgpICYmIkNvbXBsZXggUGF0dGVybiBtdXN0IHNwZWNpZnkgd2hhdCBpdCBjYW4gbWF0Y2giKTsKKyAgICBpZiAoVmFyaWFudCA+PSBPcE5vZGVzLnNpemUoKSkgcmV0dXJuIHRydWU7CisgICAgCisgICAgQWRkTWF0Y2hlcihuZXcgQ2hlY2tPcGNvZGVNYXRjaGVyKENHUC5nZXRTRE5vZGVJbmZvKE9wTm9kZXNbVmFyaWFudF0pKSk7CisgIH0gZWxzZSB7CisgICAgaWYgKFZhcmlhbnQgIT0gMCkgcmV0dXJuIHRydWU7CisgIH0KKyAgICAKKyAgLy8gRW1pdCB0aGUgbWF0Y2hlciBmb3IgdGhlIHBhdHRlcm4gc3RydWN0dXJlIGFuZCB0eXBlcy4KKyAgRW1pdE1hdGNoQ29kZShQYXR0ZXJuLmdldFNyY1BhdHRlcm4oKSwgUGF0V2l0aE5vVHlwZXMpOworICAKKyAgLy8gSWYgdGhlIHBhdHRlcm4gaGFzIGEgcHJlZGljYXRlIG9uIGl0IChlLmcuIG9ubHkgZW5hYmxlZCB3aGVuIGEgc3VidGFyZ2V0CisgIC8vIGZlYXR1cmUgaXMgYXJvdW5kLCBkbyB0aGUgY2hlY2spLgorICBpZiAoIVBhdHRlcm4uZ2V0UHJlZGljYXRlQ2hlY2soKS5lbXB0eSgpKQorICAgIEFkZE1hdGNoZXIobmV3IENoZWNrUGF0dGVyblByZWRpY2F0ZU1hdGNoZXIoUGF0dGVybi5nZXRQcmVkaWNhdGVDaGVjaygpKSk7CisgIAorICAvLyBOb3cgdGhhdCB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN0cnVjdHVyYWwgdHlwZSBtYXRjaCwgZW1pdCBhbnkgQ29tcGxleFBhdHRlcm4KKyAgLy8gY2hlY2tzIChlLmcuIGFkZHJtb2RlIG1hdGNoZXMpLiAgV2UgZW1pdCB0aGlzIGFmdGVyIHRoZSBzdHJ1Y3R1cmFsIG1hdGNoCisgIC8vIGJlY2F1c2UgdGhleSBhcmUgZ2VuZXJhbGx5IG1vcmUgZXhwZW5zaXZlIHRvIGV2YWx1YXRlIGFuZCBtb3JlIGRpZmZpY3VsdCB0bworICAvLyBmYWN0b3IuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNYXRjaGVkQ29tcGxleFBhdHRlcm5zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBUcmVlUGF0dGVybk5vZGUgKk4gPSBNYXRjaGVkQ29tcGxleFBhdHRlcm5zW2ldLmZpcnN0OworICAgIAorICAgIC8vIFJlbWVtYmVyIHdoZXJlIHRoZSByZXN1bHRzIG9mIHRoaXMgbWF0Y2ggZ2V0IHN0dWNrLgorICAgIE1hdGNoZWRDb21wbGV4UGF0dGVybnNbaV0uc2Vjb25kID0gTmV4dFJlY29yZGVkT3BlcmFuZE5vOworCisgICAgLy8gR2V0IHRoZSBzbG90IHdlIHJlY29yZGVkIHRoZSB2YWx1ZSBpbiBmcm9tIHRoZSBuYW1lIG9uIHRoZSBub2RlLgorICAgIHVuc2lnbmVkIFJlY05vZGVFbnRyeSA9IFZhcmlhYmxlTWFwW04tPmdldE5hbWUoKV07CisgICAgYXNzZXJ0KCFOLT5nZXROYW1lKCkuZW1wdHkoKSAmJiBSZWNOb2RlRW50cnkgJiYKKyAgICAgICAgICAgIkNvbXBsZXggcGF0dGVybiBzaG91bGQgaGF2ZSBhIG5hbWUgYW5kIHNsb3QiKTsKKyAgICAtLVJlY05vZGVFbnRyeTsgIC8vIEVudHJpZXMgaW4gVmFyaWFibGVNYXAgYXJlIGJpYXNlZC4KKyAgICAKKyAgICBjb25zdCBDb21wbGV4UGF0dGVybiAmQ1AgPQorICAgICAgQ0dQLmdldENvbXBsZXhQYXR0ZXJuKCgoRGVmSW5pdCopTi0+Z2V0TGVhZlZhbHVlKCkpLT5nZXREZWYoKSk7CisgICAgCisgICAgLy8gRW1pdCBhIENoZWNrQ29tcGxleFBhdCBvcGVyYXRpb24sIHdoaWNoIGRvZXMgdGhlIG1hdGNoIChhYm9ydGluZyBpZiBpdAorICAgIC8vIGZhaWxzKSBhbmQgcHVzaGVzIHRoZSBtYXRjaGVkIG9wZXJhbmRzIG9udG8gdGhlIHJlY29yZGVkIG5vZGVzIGxpc3QuCisgICAgQWRkTWF0Y2hlcihuZXcgQ2hlY2tDb21wbGV4UGF0TWF0Y2hlcihDUCwgUmVjTm9kZUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0+Z2V0TmFtZSgpLCBOZXh0UmVjb3JkZWRPcGVyYW5kTm8pKTsKKyAgICAKKyAgICAvLyBSZWNvcmQgdGhlIHJpZ2h0IG51bWJlciBvZiBvcGVyYW5kcy4KKyAgICBOZXh0UmVjb3JkZWRPcGVyYW5kTm8gKz0gQ1AuZ2V0TnVtT3BlcmFuZHMoKTsKKyAgICBpZiAoQ1AuaGFzUHJvcGVydHkoU0ROUEhhc0NoYWluKSkgeworICAgICAgLy8gSWYgdGhlIGNvbXBsZXggcGF0dGVybiBoYXMgYSBjaGFpbiwgdGhlbiB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlCisgICAgICAvLyBmYWN0IHRoYXQgd2UganVzdCByZWNvcmRlZCBhIGNoYWluIGlucHV0LiAgVGhlIGNoYWluIGlucHV0IHdpbGwgYmUKKyAgICAgIC8vIG1hdGNoZWQgYXMgdGhlIGxhc3Qgb3BlcmFuZCBvZiB0aGUgcHJlZGljYXRlIGlmIGl0IHdhcyBzdWNjZXNzZnVsLgorICAgICAgKytOZXh0UmVjb3JkZWRPcGVyYW5kTm87IC8vIENoYWluZWQgbm9kZSBvcGVyYW5kLgorICAgIAorICAgICAgLy8gSXQgaXMgdGhlIGxhc3Qgb3BlcmFuZCByZWNvcmRlZC4KKyAgICAgIGFzc2VydChOZXh0UmVjb3JkZWRPcGVyYW5kTm8gPiAxICYmCisgICAgICAgICAgICAgIlNob3VsZCBoYXZlIHJlY29yZGVkIGlucHV0L3Jlc3VsdCBjaGFpbnMgYXQgbGVhc3QhIik7CisgICAgICBNYXRjaGVkQ2hhaW5Ob2Rlcy5wdXNoX2JhY2soTmV4dFJlY29yZGVkT3BlcmFuZE5vLTEpOworICAgIH0KKyAgICAKKyAgICAvLyBUT0RPOiBDb21wbGV4IHBhdHRlcm5zIGNhbid0IGhhdmUgb3V0cHV0IGZsYWdzLCBpZiB0aGV5IGRpZCwgd2UnZCB3YW50CisgICAgLy8gdG8gcmVjb3JkIHRoZW0uCisgIH0KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTm9kZSBSZXN1bHQgR2VuZXJhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordm9pZCBNYXRjaGVyR2VuOjpFbWl0UmVzdWx0T2ZOYW1lZE9wZXJhbmQoY29uc3QgVHJlZVBhdHRlcm5Ob2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmUmVzdWx0T3BzKXsKKyAgYXNzZXJ0KCFOLT5nZXROYW1lKCkuZW1wdHkoKSAmJiAiT3BlcmFuZCBub3QgbmFtZWQhIik7CisgIAorICAvLyBBIHJlZmVyZW5jZSB0byBhIGNvbXBsZXggcGF0dGVybiBnZXRzIGFsbCBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgY29tcGxleAorICAvLyBwYXR0ZXJuJ3MgbWF0Y2guCisgIGlmIChjb25zdCBDb21wbGV4UGF0dGVybiAqQ1AgPSBOLT5nZXRDb21wbGV4UGF0dGVybkluZm8oQ0dQKSkgeworICAgIHVuc2lnbmVkIFNsb3RObyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1hdGNoZWRDb21wbGV4UGF0dGVybnMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChNYXRjaGVkQ29tcGxleFBhdHRlcm5zW2ldLmZpcnN0LT5nZXROYW1lKCkgPT0gTi0+Z2V0TmFtZSgpKSB7CisgICAgICAgIFNsb3RObyA9IE1hdGNoZWRDb21wbGV4UGF0dGVybnNbaV0uc2Vjb25kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBhc3NlcnQoU2xvdE5vICE9IDAgJiYgIkRpZG4ndCBnZXQgYSBzbG90IG51bWJlciBhc3NpZ25lZD8iKTsKKyAgICAKKyAgICAvLyBUaGUgZmlyc3Qgc2xvdCBlbnRyeSBpcyB0aGUgbm9kZSBpdHNlbGYsIHRoZSBzdWJzZXF1ZW50IGVudHJpZXMgYXJlIHRoZQorICAgIC8vIG1hdGNoZWQgdmFsdWVzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDUC0+Z2V0TnVtT3BlcmFuZHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBSZXN1bHRPcHMucHVzaF9iYWNrKFNsb3RObytpKTsKKyAgICByZXR1cm47CisgIH0KKworICB1bnNpZ25lZCBTbG90Tm8gPSBnZXROYW1lZEFyZ3VtZW50U2xvdChOLT5nZXROYW1lKCkpOworCisgIC8vIElmIHRoaXMgaXMgYW4gJ2ltbScgb3IgJ2ZwaW1tJyBub2RlLCBtYWtlIHN1cmUgdG8gY29udmVydCBpdCB0byB0aGUgdGFyZ2V0CisgIC8vIHZlcnNpb24gb2YgdGhlIGltbWVkaWF0ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgZ2V0IHNlbGVjdGVkIGR1ZSB0byBzb21lIG90aGVyCisgIC8vIG5vZGUgdXNlLgorICBpZiAoIU4tPmlzTGVhZigpKSB7CisgICAgU3RyaW5nUmVmIE9wZXJhdG9yTmFtZSA9IE4tPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKTsKKyAgICBpZiAoT3BlcmF0b3JOYW1lID09ICJpbW0iIHx8IE9wZXJhdG9yTmFtZSA9PSAiZnBpbW0iKSB7CisgICAgICBBZGRNYXRjaGVyKG5ldyBFbWl0Q29udmVydFRvVGFyZ2V0TWF0Y2hlcihTbG90Tm8pKTsKKyAgICAgIFJlc3VsdE9wcy5wdXNoX2JhY2soTmV4dFJlY29yZGVkT3BlcmFuZE5vKyspOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAKKyAgUmVzdWx0T3BzLnB1c2hfYmFjayhTbG90Tm8pOworfQorCit2b2lkIE1hdGNoZXJHZW46OkVtaXRSZXN1bHRMZWFmQXNPcGVyYW5kKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmUmVzdWx0T3BzKSB7CisgIGFzc2VydChOLT5pc0xlYWYoKSAmJiAiTXVzdCBiZSBhIGxlYWYiKTsKKyAgCisgIGlmIChJbnRJbml0ICpJSSA9IGR5bmFtaWNfY2FzdDxJbnRJbml0Kj4oTi0+Z2V0TGVhZlZhbHVlKCkpKSB7CisgICAgQWRkTWF0Y2hlcihuZXcgRW1pdEludGVnZXJNYXRjaGVyKElJLT5nZXRWYWx1ZSgpLCBOLT5nZXRUeXBlKDApKSk7CisgICAgUmVzdWx0T3BzLnB1c2hfYmFjayhOZXh0UmVjb3JkZWRPcGVyYW5kTm8rKyk7CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBJZiB0aGlzIGlzIGFuIGV4cGxpY2l0IHJlZ2lzdGVyIHJlZmVyZW5jZSwgaGFuZGxlIGl0LgorICBpZiAoRGVmSW5pdCAqREkgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KE4tPmdldExlYWZWYWx1ZSgpKSkgeworICAgIGlmIChESS0+Z2V0RGVmKCktPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXIiKSkgeworICAgICAgQWRkTWF0Y2hlcihuZXcgRW1pdFJlZ2lzdGVyTWF0Y2hlcihESS0+Z2V0RGVmKCksIE4tPmdldFR5cGUoMCkpKTsKKyAgICAgIFJlc3VsdE9wcy5wdXNoX2JhY2soTmV4dFJlY29yZGVkT3BlcmFuZE5vKyspOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAoREktPmdldERlZigpLT5nZXROYW1lKCkgPT0gInplcm9fcmVnIikgeworICAgICAgQWRkTWF0Y2hlcihuZXcgRW1pdFJlZ2lzdGVyTWF0Y2hlcigwLCBOLT5nZXRUeXBlKDApKSk7CisgICAgICBSZXN1bHRPcHMucHVzaF9iYWNrKE5leHRSZWNvcmRlZE9wZXJhbmRObysrKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgLy8gSGFuZGxlIGEgcmVmZXJlbmNlIHRvIGEgcmVnaXN0ZXIgY2xhc3MuIFRoaXMgaXMgdXNlZAorICAgIC8vIGluIENPUFlfVE9fU1VCUkVHIGluc3RydWN0aW9ucy4KKyAgICBpZiAoREktPmdldERlZigpLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyQ2xhc3MiKSkgeworICAgICAgc3RkOjpzdHJpbmcgVmFsdWUgPSBnZXRRdWFsaWZpZWROYW1lKERJLT5nZXREZWYoKSkgKyAiUmVnQ2xhc3NJRCI7CisgICAgICBBZGRNYXRjaGVyKG5ldyBFbWl0U3RyaW5nSW50ZWdlck1hdGNoZXIoVmFsdWUsIE1WVDo6aTMyKSk7CisgICAgICBSZXN1bHRPcHMucHVzaF9iYWNrKE5leHRSZWNvcmRlZE9wZXJhbmRObysrKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgYSBzdWJyZWdpc3RlciBpbmRleC4gVGhpcyBpcyB1c2VkIGZvciBJTlNFUlRfU1VCUkVHIGV0Yy4KKyAgICBpZiAoREktPmdldERlZigpLT5pc1N1YkNsYXNzT2YoIlN1YlJlZ0luZGV4IikpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIFZhbHVlID0gZ2V0UXVhbGlmaWVkTmFtZShESS0+Z2V0RGVmKCkpOworICAgICAgQWRkTWF0Y2hlcihuZXcgRW1pdFN0cmluZ0ludGVnZXJNYXRjaGVyKFZhbHVlLCBNVlQ6OmkzMikpOworICAgICAgUmVzdWx0T3BzLnB1c2hfYmFjayhOZXh0UmVjb3JkZWRPcGVyYW5kTm8rKyk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIAorICBlcnJzKCkgPDwgInVuaGFuZGxlZCBsZWFmIG5vZGU6IFxuIjsKKyAgTi0+ZHVtcCgpOworfQorCisvLy8gR2V0SW5zdFBhdHRlcm5Ob2RlIC0gR2V0IHRoZSBwYXR0ZXJuIGZvciBhbiBpbnN0cnVjdGlvbi4KKy8vLyAKK2NvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTWF0Y2hlckdlbjo6CitHZXRJbnN0UGF0dGVybk5vZGUoY29uc3QgREFHSW5zdHJ1Y3Rpb24gJkluc3QsIGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTikgeworICBjb25zdCBUcmVlUGF0dGVybiAqSW5zdFBhdCA9IEluc3QuZ2V0UGF0dGVybigpOworICAKKyAgLy8gRklYTUUyPzogQXNzdW1lIGFjdHVhbCBwYXR0ZXJuIGNvbWVzIGJlZm9yZSAiaW1wbGljaXQiLgorICBUcmVlUGF0dGVybk5vZGUgKkluc3RQYXROb2RlOworICBpZiAoSW5zdFBhdCkKKyAgICBJbnN0UGF0Tm9kZSA9IEluc3RQYXQtPmdldFRyZWUoMCk7CisgIGVsc2UgaWYgKC8qaXNSb290Ki8gTiA9PSBQYXR0ZXJuLmdldERzdFBhdHRlcm4oKSkKKyAgICBJbnN0UGF0Tm9kZSA9IFBhdHRlcm4uZ2V0U3JjUGF0dGVybigpOworICBlbHNlCisgICAgcmV0dXJuIDA7CisgIAorICBpZiAoSW5zdFBhdE5vZGUgJiYgIUluc3RQYXROb2RlLT5pc0xlYWYoKSAmJgorICAgICAgSW5zdFBhdE5vZGUtPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKSA9PSAic2V0IikKKyAgICBJbnN0UGF0Tm9kZSA9IEluc3RQYXROb2RlLT5nZXRDaGlsZChJbnN0UGF0Tm9kZS0+Z2V0TnVtQ2hpbGRyZW4oKS0xKTsKKyAgCisgIHJldHVybiBJbnN0UGF0Tm9kZTsKK30KKwordm9pZCBNYXRjaGVyR2VuOjoKK0VtaXRSZXN1bHRJbnN0cnVjdGlvbkFzT3BlcmFuZChjb25zdCBUcmVlUGF0dGVybk5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmT3V0cHV0T3BzKSB7CisgIFJlY29yZCAqT3AgPSBOLT5nZXRPcGVyYXRvcigpOworICBjb25zdCBDb2RlR2VuVGFyZ2V0ICZDR1QgPSBDR1AuZ2V0VGFyZ2V0SW5mbygpOworICBDb2RlR2VuSW5zdHJ1Y3Rpb24gJklJID0gQ0dULmdldEluc3RydWN0aW9uKE9wKTsKKyAgY29uc3QgREFHSW5zdHJ1Y3Rpb24gJkluc3QgPSBDR1AuZ2V0SW5zdHJ1Y3Rpb24oT3ApOworICAKKyAgLy8gSWYgd2UgY2FuLCBnZXQgdGhlIHBhdHRlcm4gZm9yIHRoZSBpbnN0cnVjdGlvbiB3ZSdyZSBnZW5lcmF0aW5nLiAgV2UgZGVyaXZlCisgIC8vIGEgdmFyaWV0eSBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgcGF0dGVybiwgc3VjaCBhcyB3aGV0aGVyIGl0IGhhcyBhIGNoYWluLgorICAvLworICAvLyBGSVhNRTI6IFRoaXMgaXMgZXh0cmVtZWx5IGR1YmlvdXMgZm9yIHNldmVyYWwgcmVhc29ucywgbm90IHRoZSBsZWFzdCBvZgorICAvLyB3aGljaCBpdCBnaXZlcyBzcGVjaWFsIHN0YXR1cyB0byBpbnN0cnVjdGlvbnMgd2l0aCBwYXR0ZXJucyB0aGF0IFBhdDw+CisgIC8vIG5vZGVzIGNhbid0IGR1cGxpY2F0ZS4KKyAgY29uc3QgVHJlZVBhdHRlcm5Ob2RlICpJbnN0UGF0Tm9kZSA9IEdldEluc3RQYXR0ZXJuTm9kZShJbnN0LCBOKTsKKworICAvLyBOb2RlSGFzQ2hhaW4gLSBXaGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBub2RlIHdlJ3JlIGNyZWF0aW5nIHRha2VzIGNoYWlucy4gIAorICBib29sIE5vZGVIYXNDaGFpbiA9IEluc3RQYXROb2RlICYmCisgICAgICAgICAgICAgICAgICAgICAgSW5zdFBhdE5vZGUtPlRyZWVIYXNQcm9wZXJ0eShTRE5QSGFzQ2hhaW4sIENHUCk7CisgIAorICBib29sIGlzUm9vdCA9IE4gPT0gUGF0dGVybi5nZXREc3RQYXR0ZXJuKCk7CisKKyAgLy8gVHJlZUhhc091dEZsYWcgLSBUcnVlIGlmIHRoaXMgdHJlZSBoYXMgYSBmbGFnLgorICBib29sIFRyZWVIYXNJbkZsYWcgPSBmYWxzZSwgVHJlZUhhc091dEZsYWcgPSBmYWxzZTsKKyAgaWYgKGlzUm9vdCkgeworICAgIGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqU3JjUGF0ID0gUGF0dGVybi5nZXRTcmNQYXR0ZXJuKCk7CisgICAgVHJlZUhhc0luRmxhZyA9IFNyY1BhdC0+VHJlZUhhc1Byb3BlcnR5KFNETlBPcHRJbkZsYWcsIENHUCkgfHwKKyAgICAgICAgICAgICAgICAgICAgU3JjUGF0LT5UcmVlSGFzUHJvcGVydHkoU0ROUEluRmxhZywgQ0dQKTsKKyAgCisgICAgLy8gRklYTUUyOiB0aGlzIGlzIGNoZWNraW5nIHRoZSBlbnRpcmUgcGF0dGVybiwgbm90IGp1c3QgdGhlIG5vZGUgaW4KKyAgICAvLyBxdWVzdGlvbiwgZG9pbmcgdGhpcyBqdXN0IGZvciB0aGUgcm9vdCBzZWVtcyBsaWtlIGEgdG90YWwgaGFjay4KKyAgICBUcmVlSGFzT3V0RmxhZyA9IFNyY1BhdC0+VHJlZUhhc1Byb3BlcnR5KFNETlBPdXRGbGFnLCBDR1ApOworICB9CisKKyAgLy8gTnVtUmVzdWx0cyAtIFRoaXMgaXMgdGhlIG51bWJlciBvZiByZXN1bHRzIHByb2R1Y2VkIGJ5IHRoZSBpbnN0cnVjdGlvbiBpbgorICAvLyB0aGUgIm91dHMiIGxpc3QuCisgIHVuc2lnbmVkIE51bVJlc3VsdHMgPSBJbnN0LmdldE51bVJlc3VsdHMoKTsgICAgCisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uIHBhdHRlcm4sIGVtaXR0aW5nIGNvZGUKKyAgLy8gdG8gZmlsbCB0aGVtIGFsbCBpbi4gIFRoZSBub2RlICdOJyB1c3VhbGx5IGhhcyBudW1iZXIgY2hpbGRyZW4gZXF1YWwgdG8KKyAgLy8gdGhlIG51bWJlciBvZiBpbnB1dCBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBIb3dldmVyLCBpbiBjYXNlcworICAvLyB3aGVyZSB0aGVyZSBhcmUgcHJlZGljYXRlIG9wZXJhbmRzIGZvciBhbiBpbnN0cnVjdGlvbiwgd2UgbmVlZCB0byBmaWxsCisgIC8vIGluIHRoZSAnZXhlY3V0ZSBhbHdheXMnIHZhbHVlcy4gIE1hdGNoIHVwIHRoZSBub2RlIG9wZXJhbmRzIHRvIHRoZQorICAvLyBpbnN0cnVjdGlvbiBvcGVyYW5kcyB0byBkbyB0aGlzLgorICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgOD4gSW5zdE9wczsKKyAgZm9yICh1bnNpZ25lZCBDaGlsZE5vID0gMCwgSW5zdE9wTm8gPSBOdW1SZXN1bHRzLCBlID0gSUkuT3BlcmFuZExpc3Quc2l6ZSgpOworICAgICAgIEluc3RPcE5vICE9IGU7ICsrSW5zdE9wTm8pIHsKKyAgICAKKyAgICAvLyBEZXRlcm1pbmUgd2hhdCB0byBlbWl0IGZvciB0aGlzIG9wZXJhbmQuCisgICAgUmVjb3JkICpPcGVyYW5kTm9kZSA9IElJLk9wZXJhbmRMaXN0W0luc3RPcE5vXS5SZWM7CisgICAgaWYgKChPcGVyYW5kTm9kZS0+aXNTdWJDbGFzc09mKCJQcmVkaWNhdGVPcGVyYW5kIikgfHwKKyAgICAgICAgIE9wZXJhbmROb2RlLT5pc1N1YkNsYXNzT2YoIk9wdGlvbmFsRGVmT3BlcmFuZCIpKSAmJgorICAgICAgICAhQ0dQLmdldERlZmF1bHRPcGVyYW5kKE9wZXJhbmROb2RlKS5EZWZhdWx0T3BzLmVtcHR5KCkpIHsKKyAgICAgIC8vIFRoaXMgaXMgYSBwcmVkaWNhdGUgb3Igb3B0aW9uYWwgZGVmIG9wZXJhbmQ7IGVtaXQgdGhlCisgICAgICAvLyAnZGVmYXVsdCBvcHMnIG9wZXJhbmRzLgorICAgICAgY29uc3QgREFHRGVmYXVsdE9wZXJhbmQgJkRlZmF1bHRPcAorCT0gQ0dQLmdldERlZmF1bHRPcGVyYW5kKE9wZXJhbmROb2RlKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBEZWZhdWx0T3AuRGVmYXVsdE9wcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBFbWl0UmVzdWx0T3BlcmFuZChEZWZhdWx0T3AuRGVmYXVsdE9wc1tpXSwgSW5zdE9wcyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgY29uc3QgVHJlZVBhdHRlcm5Ob2RlICpDaGlsZCA9IE4tPmdldENoaWxkKENoaWxkTm8pOworICAgIAorICAgIC8vIE90aGVyd2lzZSB0aGlzIGlzIGEgbm9ybWFsIG9wZXJhbmQgb3IgYSBwcmVkaWNhdGUgb3BlcmFuZCB3aXRob3V0CisgICAgLy8gJ2V4ZWN1dGUgYWx3YXlzJzsgZW1pdCBpdC4KKyAgICB1bnNpZ25lZCBCZWZvcmVBZGRpbmdOdW1PcHMgPSBJbnN0T3BzLnNpemUoKTsKKyAgICBFbWl0UmVzdWx0T3BlcmFuZChDaGlsZCwgSW5zdE9wcyk7CisgICAgYXNzZXJ0KEluc3RPcHMuc2l6ZSgpID4gQmVmb3JlQWRkaW5nTnVtT3BzICYmICJEaWRuJ3QgYWRkIGFueSBvcGVyYW5kcyIpOworICAgIAorICAgIC8vIElmIHRoZSBvcGVyYW5kIGlzIGFuIGluc3RydWN0aW9uIGFuZCBpdCBwcm9kdWNlZCBtdWx0aXBsZSByZXN1bHRzLCBqdXN0CisgICAgLy8gdGFrZSB0aGUgZmlyc3Qgb25lLgorICAgIGlmICghQ2hpbGQtPmlzTGVhZigpICYmIENoaWxkLT5nZXRPcGVyYXRvcigpLT5pc1N1YkNsYXNzT2YoIkluc3RydWN0aW9uIikpCisgICAgICBJbnN0T3BzLnJlc2l6ZShCZWZvcmVBZGRpbmdOdW1PcHMrMSk7CisgICAgCisgICAgKytDaGlsZE5vOworICB9CisgIAorICAvLyBJZiB0aGlzIG5vZGUgaGFzIGFuIGlucHV0IGZsYWcgb3IgZXhwbGljaXRseSBzcGVjaWZpZWQgaW5wdXQgcGh5c3JlZ3MsIHdlCisgIC8vIG5lZWQgdG8gYWRkIGNoYWluZWQgYW5kIGZsYWdnZWQgY29weWZyb21yZWcgbm9kZXMgYW5kIG1hdGVyaWFsaXplIHRoZSBmbGFnCisgIC8vIGlucHV0LgorICBpZiAoaXNSb290ICYmICFQaHlzUmVnSW5wdXRzLmVtcHR5KCkpIHsKKyAgICAvLyBFbWl0IGFsbCBvZiB0aGUgQ29weVRvUmVnIG5vZGVzIGZvciB0aGUgaW5wdXQgcGh5c2ljYWwgcmVnaXN0ZXJzLiAgVGhlc2UKKyAgICAvLyBvY2N1ciBpbiBwYXR0ZXJucyBsaWtlIChtdWw6aTggQUw6aTgsIEdSODppODokc3JjKS4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUGh5c1JlZ0lucHV0cy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgQWRkTWF0Y2hlcihuZXcgRW1pdENvcHlUb1JlZ01hdGNoZXIoUGh5c1JlZ0lucHV0c1tpXS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlzUmVnSW5wdXRzW2ldLmZpcnN0KSk7CisgICAgLy8gRXZlbiBpZiB0aGUgbm9kZSBoYXMgbm8gb3RoZXIgZmxhZyBpbnB1dHMsIHRoZSByZXN1bHRhbnQgbm9kZSBtdXN0IGJlCisgICAgLy8gZmxhZ2dlZCB0byB0aGUgQ29weUZyb21SZWcgbm9kZXMgd2UganVzdCBnZW5lcmF0ZWQuCisgICAgVHJlZUhhc0luRmxhZyA9IHRydWU7CisgIH0KKyAgCisgIC8vIFJlc3VsdCBvcmRlcjogbm9kZSByZXN1bHRzLCBjaGFpbiwgZmxhZ3MKKyAgCisgIC8vIERldGVybWluZSB0aGUgcmVzdWx0IHR5cGVzLgorICBTbWFsbFZlY3RvcjxNVlQ6OlNpbXBsZVZhbHVlVHlwZSwgND4gUmVzdWx0VlRzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTi0+Z2V0TnVtVHlwZXMoKTsgaSAhPSBlOyArK2kpCisgICAgUmVzdWx0VlRzLnB1c2hfYmFjayhOLT5nZXRUeXBlKGkpKTsKKyAgCisgIC8vIElmIHRoaXMgaXMgdGhlIHJvb3QgaW5zdHJ1Y3Rpb24gb2YgYSBwYXR0ZXJuIHRoYXQgaGFzIHBoeXNpY2FsIHJlZ2lzdGVycyBpbgorICAvLyBpdHMgcmVzdWx0IHBhdHRlcm4sIGFkZCBvdXRwdXQgVlRzIGZvciB0aGVtLiAgRm9yIGV4YW1wbGUsIFg4NiBoYXM6CisgIC8vICAgKHNldCBBTCwgKG11bCAuLi4pKQorICAvLyBUaGlzIGFsc28gaGFuZGxlcyBpbXBsaWNpdCByZXN1bHRzIGxpa2U6CisgIC8vICAgKGltcGxpY2l0IEVGTEFHUykKKyAgaWYgKGlzUm9vdCAmJiAhUGF0dGVybi5nZXREc3RSZWdzKCkuZW1wdHkoKSkgeworICAgIC8vIElmIHRoZSByb290IGNhbWUgZnJvbSBhbiBpbXBsaWNpdCBkZWYgaW4gdGhlIGluc3RydWN0aW9uIGhhbmRsaW5nIHN0dWZmLAorICAgIC8vIGRvbid0IHJlLWFkZCBpdC4KKyAgICBSZWNvcmQgKkhhbmRsZWRSZWcgPSAwOworICAgIGlmIChJSS5IYXNPbmVJbXBsaWNpdERlZldpdGhLbm93blZUKENHVCkgIT0gTVZUOjpPdGhlcikKKyAgICAgIEhhbmRsZWRSZWcgPSBJSS5JbXBsaWNpdERlZnNbMF07CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBQYXR0ZXJuLmdldERzdFJlZ3MoKS5zaXplKCk7ICsraSkgeworICAgICAgUmVjb3JkICpSZWcgPSBQYXR0ZXJuLmdldERzdFJlZ3MoKVtpXTsKKyAgICAgIGlmICghUmVnLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyIikgfHwgUmVnID09IEhhbmRsZWRSZWcpIGNvbnRpbnVlOworICAgICAgUmVzdWx0VlRzLnB1c2hfYmFjayhnZXRSZWdpc3RlclZhbHVlVHlwZShSZWcsIENHVCkpOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIHdlJ3JlIG1hdGNoaW5nIGluY2x1ZGVzCisgIC8vIGEgbm9kZSB0aGF0IGlzIHZhcmlhZGljLCBtYXJrIHRoZSBnZW5lcmF0ZWQgbm9kZSBhcyB2YXJpYWRpYyBzbyB0aGF0IGl0CisgIC8vIGdldHMgdGhlIGV4Y2VzcyBvcGVyYW5kcyBmcm9tIHRoZSBpbnB1dCBEQUcuCisgIGludCBOdW1GaXhlZEFyaXR5T3BlcmFuZHMgPSAtMTsKKyAgaWYgKGlzUm9vdCAmJgorICAgICAgKFBhdHRlcm4uZ2V0U3JjUGF0dGVybigpLT5Ob2RlSGFzUHJvcGVydHkoU0ROUFZhcmlhZGljLCBDR1ApKSkKKyAgICBOdW1GaXhlZEFyaXR5T3BlcmFuZHMgPSBQYXR0ZXJuLmdldFNyY1BhdHRlcm4oKS0+Z2V0TnVtQ2hpbGRyZW4oKTsKKyAgCisgIC8vIElmIHRoaXMgaXMgdGhlIHJvb3Qgbm9kZSBhbmQgYW55IG9mIHRoZSBub2RlcyBtYXRjaGVkIG5vZGVzIGluIHRoZSBpbnB1dAorICAvLyBwYXR0ZXJuIGhhdmUgTWVtUmVmcyBpbiB0aGVtLCBoYXZlIHRoZSBpbnRlcnByZXRlciBjb2xsZWN0IHRoZW0gYW5kIHBsb3AKKyAgLy8gdGhlbSBvbnRvIHRoaXMgbm9kZS4KKyAgLy8KKyAgLy8gRklYTUUzOiBUaGlzIGlzIGFjdGl2ZWx5IGluY29ycmVjdCBmb3IgcmVzdWx0IHBhdHRlcm5zIHdoZXJlIHRoZSByb290IG9mCisgIC8vIHRoZSBwYXR0ZXJuIGlzIG5vdCB0aGUgbWVtb3J5IHJlZmVyZW5jZSBhbmQgaXMgYWxzbyBpbmNvcnJlY3Qgd2hlbiB0aGUKKyAgLy8gcmVzdWx0IHBhdHRlcm4gaGFzIG11bHRpcGxlIG1lbW9yeS1yZWZlcmVuY2luZyBpbnN0cnVjdGlvbnMuICBGb3IgZXhhbXBsZSwKKyAgLy8gaW4gdGhlIFg4NiBiYWNrZW5kLCB0aGlzIHBhdHRlcm4gY2F1c2VzIHRoZSBtZW1yZWZzIHRvIGdldCBhdHRhY2hlZCB0byB0aGUKKyAgLy8gQ1ZUU1MyU0RyciBpbnN0ZWFkIG9mIHRoZSBNT1ZTU3JtOgorICAvLworICAvLyAgZGVmIDogUGF0PChleHRsb2FkZjMyIGFkZHI6JHNyYyksCisgIC8vICAgICAgICAgICAgKENWVFNTMlNEcnIgKE1PVlNTcm0gYWRkcjokc3JjKSk+OworICAvLworICBib29sIE5vZGVIYXNNZW1SZWZzID0KKyAgICBpc1Jvb3QgJiYgUGF0dGVybi5nZXRTcmNQYXR0ZXJuKCktPlRyZWVIYXNQcm9wZXJ0eShTRE5QTWVtT3BlcmFuZCwgQ0dQKTsKKworICBhc3NlcnQoKCFSZXN1bHRWVHMuZW1wdHkoKSB8fCBUcmVlSGFzT3V0RmxhZyB8fCBOb2RlSGFzQ2hhaW4pICYmCisgICAgICAgICAiTm9kZSBoYXMgbm8gcmVzdWx0Iik7CisgIAorICBBZGRNYXRjaGVyKG5ldyBFbWl0Tm9kZU1hdGNoZXIoSUkuTmFtZXNwYWNlKyI6OiIrSUkuVGhlRGVmLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRWVHMuZGF0YSgpLCBSZXN1bHRWVHMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdE9wcy5kYXRhKCksIEluc3RPcHMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUhhc0NoYWluLCBUcmVlSGFzSW5GbGFnLCBUcmVlSGFzT3V0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVIYXNNZW1SZWZzLCBOdW1GaXhlZEFyaXR5T3BlcmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXh0UmVjb3JkZWRPcGVyYW5kTm8pKTsKKyAgCisgIC8vIFRoZSBub24tY2hhaW4gYW5kIG5vbi1mbGFnIHJlc3VsdHMgb2YgdGhlIG5ld2x5IGVtaXR0ZWQgbm9kZSBnZXQgcmVjb3JkZWQuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZXN1bHRWVHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChSZXN1bHRWVHNbaV0gPT0gTVZUOjpPdGhlciB8fCBSZXN1bHRWVHNbaV0gPT0gTVZUOjpGbGFnKSBicmVhazsKKyAgICBPdXRwdXRPcHMucHVzaF9iYWNrKE5leHRSZWNvcmRlZE9wZXJhbmRObysrKTsKKyAgfQorfQorCit2b2lkIE1hdGNoZXJHZW46OgorRW1pdFJlc3VsdFNETm9kZVhGb3JtQXNPcGVyYW5kKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZSZXN1bHRPcHMpIHsKKyAgYXNzZXJ0KE4tPmdldE9wZXJhdG9yKCktPmlzU3ViQ2xhc3NPZigiU0ROb2RlWEZvcm0iKSAmJiAiTm90IFNETm9kZVhGb3JtPyIpOworCisgIC8vIEVtaXQgdGhlIG9wZXJhbmQuCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA4PiBJbnB1dE9wczsKKyAgCisgIC8vIEZJWE1FMjogQ291bGQgZWFzaWx5IGdlbmVyYWxpemUgdGhpcyB0byBzdXBwb3J0IG11bHRpcGxlIGlucHV0cyBhbmQgb3V0cHV0cworICAvLyB0byB0aGUgU0ROb2RlWEZvcm0uICBGb3Igbm93IHdlIGp1c3Qgc3VwcG9ydCBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgbGlrZQorICAvLyB0aGUgb2xkIGluc3RydWN0aW9uIHNlbGVjdG9yLgorICBhc3NlcnQoTi0+Z2V0TnVtQ2hpbGRyZW4oKSA9PSAxKTsKKyAgRW1pdFJlc3VsdE9wZXJhbmQoTi0+Z2V0Q2hpbGQoMCksIElucHV0T3BzKTsKKworICAvLyBUaGUgaW5wdXQgY3VycmVudGx5IG11c3QgaGF2ZSBwcm9kdWNlZCBleGFjdGx5IG9uZSByZXN1bHQuCisgIGFzc2VydChJbnB1dE9wcy5zaXplKCkgPT0gMSAmJiAiVW5leHBlY3RlZCBpbnB1dCB0byBTRE5vZGVYRm9ybSIpOworCisgIEFkZE1hdGNoZXIobmV3IEVtaXROb2RlWEZvcm1NYXRjaGVyKElucHV0T3BzWzBdLCBOLT5nZXRPcGVyYXRvcigpKSk7CisgIFJlc3VsdE9wcy5wdXNoX2JhY2soTmV4dFJlY29yZGVkT3BlcmFuZE5vKyspOworfQorCit2b2lkIE1hdGNoZXJHZW46OkVtaXRSZXN1bHRPcGVyYW5kKGNvbnN0IFRyZWVQYXR0ZXJuTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmUmVzdWx0T3BzKSB7CisgIC8vIFRoaXMgaXMgc29tZXRoaW5nIHNlbGVjdGVkIGZyb20gdGhlIHBhdHRlcm4gd2UgbWF0Y2hlZC4KKyAgaWYgKCFOLT5nZXROYW1lKCkuZW1wdHkoKSkKKyAgICByZXR1cm4gRW1pdFJlc3VsdE9mTmFtZWRPcGVyYW5kKE4sIFJlc3VsdE9wcyk7CisKKyAgaWYgKE4tPmlzTGVhZigpKQorICAgIHJldHVybiBFbWl0UmVzdWx0TGVhZkFzT3BlcmFuZChOLCBSZXN1bHRPcHMpOworCisgIFJlY29yZCAqT3BSZWMgPSBOLT5nZXRPcGVyYXRvcigpOworICBpZiAoT3BSZWMtPmlzU3ViQ2xhc3NPZigiSW5zdHJ1Y3Rpb24iKSkKKyAgICByZXR1cm4gRW1pdFJlc3VsdEluc3RydWN0aW9uQXNPcGVyYW5kKE4sIFJlc3VsdE9wcyk7CisgIGlmIChPcFJlYy0+aXNTdWJDbGFzc09mKCJTRE5vZGVYRm9ybSIpKQorICAgIHJldHVybiBFbWl0UmVzdWx0U0ROb2RlWEZvcm1Bc09wZXJhbmQoTiwgUmVzdWx0T3BzKTsKKyAgZXJycygpIDw8ICJVbmtub3duIHJlc3VsdCBub2RlIHRvIGVtaXQgY29kZSBmb3I6ICIgPDwgKk4gPDwgJ1xuJzsKKyAgdGhyb3cgc3RkOjpzdHJpbmcoIlVua25vd24gbm9kZSBpbiByZXN1bHQgcGF0dGVybiEiKTsKK30KKwordm9pZCBNYXRjaGVyR2VuOjpFbWl0UmVzdWx0Q29kZSgpIHsKKyAgLy8gUGF0dGVybnMgdGhhdCBtYXRjaCBub2RlcyB3aXRoIChwb3RlbnRpYWxseSBtdWx0aXBsZSkgY2hhaW4gaW5wdXRzIGhhdmUgdG8KKyAgLy8gbWVyZ2UgdGhlbSB0b2dldGhlciBpbnRvIGEgdG9rZW4gZmFjdG9yLiAgVGhpcyBpbmZvcm1zIHRoZSBnZW5lcmF0ZWQgY29kZQorICAvLyB3aGF0IGFsbCB0aGUgY2hhaW5lZCBub2RlcyBhcmUuCisgIGlmICghTWF0Y2hlZENoYWluTm9kZXMuZW1wdHkoKSkKKyAgICBBZGRNYXRjaGVyKG5ldyBFbWl0TWVyZ2VJbnB1dENoYWluc01hdGNoZXIKKyAgICAgICAgICAgICAgIChNYXRjaGVkQ2hhaW5Ob2Rlcy5kYXRhKCksIE1hdGNoZWRDaGFpbk5vZGVzLnNpemUoKSkpOworICAKKyAgLy8gQ29kZWdlbiB0aGUgcm9vdCBvZiB0aGUgcmVzdWx0IHBhdHRlcm4sIGNhcHR1cmluZyB0aGUgcmVzdWx0aW5nIHZhbHVlcy4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IE9wczsKKyAgRW1pdFJlc3VsdE9wZXJhbmQoUGF0dGVybi5nZXREc3RQYXR0ZXJuKCksIE9wcyk7CisKKyAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBob3dldmVyIG1hbnkgdmFsdWVzIHRoZSByZXN1bHQgcGF0dGVybiBwcm9kdWNlcy4KKyAgLy8gSG93ZXZlciwgdGhlIGlucHV0IHBhdHRlcm4gbWlnaHQgbm90IG5lZWQgYWxsIG9mIHRoZXNlLiAgSWYgdGhlcmUgYXJlCisgIC8vIGV4Y2VzcyB2YWx1ZXMgYXQgdGhlIGVuZCAoc3VjaCBhcyBpbXBsaWNpdCBkZWZzIG9mIGNvbmRpdGlvbiBjb2RlcyBldGMpCisgIC8vIGp1c3QgbG9wIHRoZW0gb2ZmLiAgVGhpcyBkb2Vzbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgZmxhZ3Mgb3IgY2hhaW5zLCBqdXN0CisgIC8vIGV4cGxpY2l0IHJlc3VsdHMuCisgIC8vCisgIHVuc2lnbmVkIE51bVNyY1Jlc3VsdHMgPSBQYXR0ZXJuLmdldFNyY1BhdHRlcm4oKS0+Z2V0TnVtVHlwZXMoKTsKKyAgCisgIC8vIElmIHRoZSBwYXR0ZXJuIGFsc28gaGFzIChpbXBsaWNpdCkgcmVzdWx0cywgY291bnQgdGhlbSBhcyB3ZWxsLgorICBpZiAoIVBhdHRlcm4uZ2V0RHN0UmVncygpLmVtcHR5KCkpIHsKKyAgICAvLyBJZiB0aGUgcm9vdCBjYW1lIGZyb20gYW4gaW1wbGljaXQgZGVmIGluIHRoZSBpbnN0cnVjdGlvbiBoYW5kbGluZyBzdHVmZiwKKyAgICAvLyBkb24ndCByZS1hZGQgaXQuCisgICAgUmVjb3JkICpIYW5kbGVkUmVnID0gMDsKKyAgICBjb25zdCBUcmVlUGF0dGVybk5vZGUgKkRzdFBhdCA9IFBhdHRlcm4uZ2V0RHN0UGF0dGVybigpOworICAgIGlmICghRHN0UGF0LT5pc0xlYWYoKSAmJkRzdFBhdC0+Z2V0T3BlcmF0b3IoKS0+aXNTdWJDbGFzc09mKCJJbnN0cnVjdGlvbiIpKXsKKyAgICAgIGNvbnN0IENvZGVHZW5UYXJnZXQgJkNHVCA9IENHUC5nZXRUYXJnZXRJbmZvKCk7CisgICAgICBDb2RlR2VuSW5zdHJ1Y3Rpb24gJklJID0gQ0dULmdldEluc3RydWN0aW9uKERzdFBhdC0+Z2V0T3BlcmF0b3IoKSk7CisKKyAgICAgIGlmIChJSS5IYXNPbmVJbXBsaWNpdERlZldpdGhLbm93blZUKENHVCkgIT0gTVZUOjpPdGhlcikKKyAgICAgICAgSGFuZGxlZFJlZyA9IElJLkltcGxpY2l0RGVmc1swXTsKKyAgICB9CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBQYXR0ZXJuLmdldERzdFJlZ3MoKS5zaXplKCk7ICsraSkgeworICAgICAgUmVjb3JkICpSZWcgPSBQYXR0ZXJuLmdldERzdFJlZ3MoKVtpXTsKKyAgICAgIGlmICghUmVnLT5pc1N1YkNsYXNzT2YoIlJlZ2lzdGVyIikgfHwgUmVnID09IEhhbmRsZWRSZWcpIGNvbnRpbnVlOworICAgICAgKytOdW1TcmNSZXN1bHRzOworICAgIH0KKyAgfSAgICAKKyAgCisgIGFzc2VydChPcHMuc2l6ZSgpID49IE51bVNyY1Jlc3VsdHMgJiYgIkRpZG4ndCBwcm92aWRlIGVub3VnaCByZXN1bHRzIik7CisgIE9wcy5yZXNpemUoTnVtU3JjUmVzdWx0cyk7CisKKyAgLy8gSWYgdGhlIG1hdGNoZWQgcGF0dGVybiBjb3ZlcnMgbm9kZXMgd2hpY2ggZGVmaW5lIGEgZmxhZyByZXN1bHQsIGVtaXQgYSBub2RlCisgIC8vIHRoYXQgdGVsbHMgdGhlIG1hdGNoZXIgYWJvdXQgdGhlbSBzbyB0aGF0IGl0IGNhbiB1cGRhdGUgdGhlaXIgcmVzdWx0cy4KKyAgaWYgKCFNYXRjaGVkRmxhZ1Jlc3VsdE5vZGVzLmVtcHR5KCkpCisgICAgQWRkTWF0Y2hlcihuZXcgTWFya0ZsYWdSZXN1bHRzTWF0Y2hlcihNYXRjaGVkRmxhZ1Jlc3VsdE5vZGVzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZWRGbGFnUmVzdWx0Tm9kZXMuc2l6ZSgpKSk7CisgIAorICBBZGRNYXRjaGVyKG5ldyBDb21wbGV0ZU1hdGNoTWF0Y2hlcihPcHMuZGF0YSgpLCBPcHMuc2l6ZSgpLCBQYXR0ZXJuKSk7Cit9CisKKworLy8vIENvbnZlcnRQYXR0ZXJuVG9NYXRjaGVyIC0gQ3JlYXRlIHRoZSBtYXRjaGVyIGZvciB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gd2l0aAorLy8vIHRoZSBzcGVjaWZpZWQgdmFyaWFudC4gIElmIHRoZSB2YXJpYW50IG51bWJlciBpcyBpbnZhbGlkLCB0aGlzIHJldHVybnMgbnVsbC4KK01hdGNoZXIgKmxsdm06OkNvbnZlcnRQYXR0ZXJuVG9NYXRjaGVyKGNvbnN0IFBhdHRlcm5Ub01hdGNoICZQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmQ0dQKSB7CisgIE1hdGNoZXJHZW4gR2VuKFBhdHRlcm4sIENHUCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNvZGUgZm9yIHRoZSBtYXRjaGVyLgorICBpZiAoR2VuLkVtaXRNYXRjaGVyQ29kZShWYXJpYW50KSkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIEZJWE1FMjogS2lsbCBleHRyYSBNb3ZlUGFyZW50IGNvbW1hbmRzIGF0IHRoZSBlbmQgb2YgdGhlIG1hdGNoZXIgc2VxdWVuY2UuCisgIC8vIEZJWE1FMjogU3BsaXQgcmVzdWx0IGNvZGUgb3V0IHRvIGFub3RoZXIgdGFibGUsIGFuZCBtYWtlIHRoZSBtYXRjaGVyIGVuZAorICAvLyB3aXRoIGFuICJFbWl0IDxpbmRleD4iIGNvbW1hbmQuICBUaGlzIGFsbG93cyByZXN1bHQgZ2VuZXJhdGlvbiBzdHVmZiB0byBiZQorICAvLyBzaGFyZWQgYW5kIGZhY3RvcmVkPworICAKKyAgLy8gSWYgdGhlIG1hdGNoIHN1Y2NlZWRzLCB0aGVuIHdlIGdlbmVyYXRlIFBhdHRlcm4uCisgIEdlbi5FbWl0UmVzdWx0Q29kZSgpOworCisgIC8vIFVuY29uZGl0aW9uYWwgbWF0Y2guCisgIHJldHVybiBHZW4uR2V0TWF0Y2hlcigpOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vREFHSVNlbE1hdGNoZXJPcHQuY3BwIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vREFHSVNlbE1hdGNoZXJPcHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3M2JkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9EQUdJU2VsTWF0Y2hlck9wdC5jcHAKQEAgLTAsMCArMSw1MTQgQEAKKy8vPT09LSBEQUdJU2VsTWF0Y2hlck9wdC5jcHAgLSBPcHRpbWl6ZSBhIERBRyBNYXRjaGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIERBRyBNYXRjaGVyIG9wdGltaXplci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZGVmaW5lIERFQlVHX1RZUEUgImlzZWwtb3B0IgorI2luY2x1ZGUgIkRBR0lTZWxNYXRjaGVyLmgiCisjaW5jbHVkZSAiQ29kZUdlbkRBR1BhdHRlcm5zLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDx2ZWN0b3I+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIENvbnRyYWN0Tm9kZXMgLSBUdXJuIG11bHRpcGxlIG1hdGNoZXIgbm9kZSBwYXR0ZXJucyBsaWtlICdNb3ZlQ2hpbGQrUmVjb3JkJworLy8vIGludG8gc2luZ2xlIGNvbXBvdW5kIG5vZGVzIGxpa2UgUmVjb3JkQ2hpbGQuCitzdGF0aWMgdm9pZCBDb250cmFjdE5vZGVzKE93bmluZ1B0cjxNYXRjaGVyPiAmTWF0Y2hlclB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbkRBR1BhdHRlcm5zICZDR1ApIHsKKyAgLy8gSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjaGFpbiwgd2UncmUgZG9uZS4KKyAgTWF0Y2hlciAqTiA9IE1hdGNoZXJQdHIuZ2V0KCk7CisgIGlmIChOID09IDApIHJldHVybjsKKyAgCisgIC8vIElmIHdlIGhhdmUgYSBzY29wZSBub2RlLCB3YWxrIGRvd24gYWxsIG9mIHRoZSBjaGlsZHJlbi4KKyAgaWYgKFNjb3BlTWF0Y2hlciAqU2NvcGUgPSBkeW5fY2FzdDxTY29wZU1hdGNoZXI+KE4pKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNjb3BlLT5nZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkgeworICAgICAgT3duaW5nUHRyPE1hdGNoZXI+IENoaWxkKFNjb3BlLT50YWtlQ2hpbGQoaSkpOworICAgICAgQ29udHJhY3ROb2RlcyhDaGlsZCwgQ0dQKTsKKyAgICAgIFNjb3BlLT5yZXNldENoaWxkKGksIENoaWxkLnRha2UoKSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gSWYgd2UgZm91bmQgYSBtb3ZlY2hpbGQgbm9kZSB3aXRoIGEgbm9kZSB0aGF0IGNvbWVzIGluIGEgJ2Zvb2NoaWxkJyBmb3JtLAorICAvLyB0cmFuc2Zvcm0gaXQuCisgIGlmIChNb3ZlQ2hpbGRNYXRjaGVyICpNQyA9IGR5bl9jYXN0PE1vdmVDaGlsZE1hdGNoZXI+KE4pKSB7CisgICAgTWF0Y2hlciAqTmV3ID0gMDsKKyAgICBpZiAoUmVjb3JkTWF0Y2hlciAqUk0gPSBkeW5fY2FzdDxSZWNvcmRNYXRjaGVyPihNQy0+Z2V0TmV4dCgpKSkKKyAgICAgIGlmIChNQy0+Z2V0Q2hpbGRObygpIDwgOCkgIC8vIE9ubHkgaGF2ZSBSZWNvcmRDaGlsZDAuLi43CisgICAgICAgIE5ldyA9IG5ldyBSZWNvcmRDaGlsZE1hdGNoZXIoTUMtPmdldENoaWxkTm8oKSwgUk0tPmdldFdoYXRGb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSTS0+Z2V0UmVzdWx0Tm8oKSk7CisgICAgCisgICAgaWYgKENoZWNrVHlwZU1hdGNoZXIgKkNUID0gZHluX2Nhc3Q8Q2hlY2tUeXBlTWF0Y2hlcj4oTUMtPmdldE5leHQoKSkpCisgICAgICBpZiAoTUMtPmdldENoaWxkTm8oKSA8IDggJiYgIC8vIE9ubHkgaGF2ZSBDaGVja0NoaWxkVHlwZTAuLi43CisgICAgICAgICAgQ1QtPmdldFJlc05vKCkgPT0gMCkgICAgIC8vIENoZWNrQ2hpbGRUeXBlIGNoZWNrcyByZXMgIzAKKyAgICAgICAgTmV3ID0gbmV3IENoZWNrQ2hpbGRUeXBlTWF0Y2hlcihNQy0+Z2V0Q2hpbGRObygpLCBDVC0+Z2V0VHlwZSgpKTsKKyAgICAKKyAgICBpZiAoTmV3KSB7CisgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBub2RlLgorICAgICAgTmV3LT5zZXROZXh0KE1hdGNoZXJQdHIudGFrZSgpKTsKKyAgICAgIE1hdGNoZXJQdHIucmVzZXQoTmV3KTsKKyAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIG9uZS4KKyAgICAgIE1DLT5zZXROZXh0KE1DLT5nZXROZXh0KCktPnRha2VOZXh0KCkpOworICAgICAgcmV0dXJuIENvbnRyYWN0Tm9kZXMoTWF0Y2hlclB0ciwgQ0dQKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIFphcCBtb3ZlY2hpbGQgLT4gbW92ZXBhcmVudC4KKyAgaWYgKE1vdmVDaGlsZE1hdGNoZXIgKk1DID0gZHluX2Nhc3Q8TW92ZUNoaWxkTWF0Y2hlcj4oTikpCisgICAgaWYgKE1vdmVQYXJlbnRNYXRjaGVyICpNUCA9IAorICAgICAgICAgIGR5bl9jYXN0PE1vdmVQYXJlbnRNYXRjaGVyPihNQy0+Z2V0TmV4dCgpKSkgeworICAgICAgTWF0Y2hlclB0ci5yZXNldChNUC0+dGFrZU5leHQoKSk7CisgICAgICByZXR1cm4gQ29udHJhY3ROb2RlcyhNYXRjaGVyUHRyLCBDR1ApOworICAgIH0KKworICAvLyBUdXJuIEVtaXROb2RlLT5NYXJrRmxhZ1Jlc3VsdHMtPkNvbXBsZXRlTWF0Y2ggaW50bworICAvLyBNYXJrRmxhZ1Jlc3VsdHMtPkVtaXROb2RlLT5Db21wbGV0ZU1hdGNoIHdoZW4gd2UgY2FuIHRvIGVuY291cmFnZQorICAvLyBNb3JwaE5vZGVUbyBmb3JtYXRpb24uICBUaGlzIGlzIHNhZmUgYmVjYXVzZSBNYXJrRmxhZ1Jlc3VsdHMgbmV2ZXIgcmVmZXJzCisgIC8vIHRvIHRoZSByb290IG9mIHRoZSBwYXR0ZXJuLgorICBpZiAoaXNhPEVtaXROb2RlTWF0Y2hlcj4oTikgJiYgaXNhPE1hcmtGbGFnUmVzdWx0c01hdGNoZXI+KE4tPmdldE5leHQoKSkgJiYKKyAgICAgIGlzYTxDb21wbGV0ZU1hdGNoTWF0Y2hlcj4oTi0+Z2V0TmV4dCgpLT5nZXROZXh0KCkpKSB7CisgICAgLy8gVW5saW5rIHRoZSB0d28gbm9kZXMgZnJvbSB0aGUgbGlzdC4KKyAgICBNYXRjaGVyICpFbWl0Tm9kZSA9IE1hdGNoZXJQdHIudGFrZSgpOworICAgIE1hdGNoZXIgKk1GUiA9IEVtaXROb2RlLT50YWtlTmV4dCgpOworICAgIE1hdGNoZXIgKlRhaWwgPSBNRlItPnRha2VOZXh0KCk7CisgICAgICAgIAorICAgIC8vIFJlbGluayB0aGVtLgorICAgIE1hdGNoZXJQdHIucmVzZXQoTUZSKTsKKyAgICBNRlItPnNldE5leHQoRW1pdE5vZGUpOworICAgIEVtaXROb2RlLT5zZXROZXh0KFRhaWwpOworICAgIHJldHVybiBDb250cmFjdE5vZGVzKE1hdGNoZXJQdHIsIENHUCk7CisgIH0KKworICAvLyBUdXJuIEVtaXROb2RlLT5Db21wbGV0ZU1hdGNoIGludG8gTW9ycGhOb2RlVG8gaWYgd2UgY2FuLgorICBpZiAoRW1pdE5vZGVNYXRjaGVyICpFTiA9IGR5bl9jYXN0PEVtaXROb2RlTWF0Y2hlcj4oTikpCisgICAgaWYgKENvbXBsZXRlTWF0Y2hNYXRjaGVyICpDTSA9CisgICAgICAgICAgZHluX2Nhc3Q8Q29tcGxldGVNYXRjaE1hdGNoZXI+KEVOLT5nZXROZXh0KCkpKSB7CisgICAgICAvLyBXZSBjYW4gb25seSB1c2UgTW9ycGhOb2RlVG8gaWYgdGhlIHJlc3VsdCB2YWx1ZXMgbWF0Y2ggdXAuCisgICAgICB1bnNpZ25lZCBSb290UmVzdWx0Rmlyc3QgPSBFTi0+Z2V0Rmlyc3RSZXN1bHRTbG90KCk7CisgICAgICBib29sIFJlc3VsdHNNYXRjaCA9IHRydWU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ00tPmdldE51bVJlc3VsdHMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmIChDTS0+Z2V0UmVzdWx0KGkpICE9IFJvb3RSZXN1bHRGaXJzdCtpKQorICAgICAgICAgIFJlc3VsdHNNYXRjaCA9IGZhbHNlOworICAgICAgCisgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgbm9kZSBkZWZpbmVzIGEgc3Vic2V0IG9mIHRoZSBmbGFnL2NoYWluIHJlc3VsdHMsIHdlCisgICAgICAvLyBjYW4ndCB1c2UgTW9ycGhOb2RlVG8uICBGb3IgZXhhbXBsZSwgd2UgY2FuJ3QgdXNlIE1vcnBoTm9kZVRvIGlmIHRoZQorICAgICAgLy8gbWF0Y2hlZCBwYXR0ZXJuIGhhcyBhIGNoYWluIGJ1dCB0aGUgcm9vdCBub2RlIGRvZXNuJ3QuCisgICAgICBjb25zdCBQYXR0ZXJuVG9NYXRjaCAmUGF0dGVybiA9IENNLT5nZXRQYXR0ZXJuKCk7CisgICAgICAKKyAgICAgIGlmICghRU4tPmhhc0NoYWluKCkgJiYKKyAgICAgICAgICBQYXR0ZXJuLmdldFNyY1BhdHRlcm4oKS0+Tm9kZUhhc1Byb3BlcnR5KFNETlBIYXNDaGFpbiwgQ0dQKSkKKyAgICAgICAgUmVzdWx0c01hdGNoID0gZmFsc2U7CisKKyAgICAgIC8vIElmIHRoZSBtYXRjaGVkIG5vZGUgaGFzIGEgZmxhZyBhbmQgdGhlIG91dHB1dCByb290IGRvZXNuJ3QsIHdlIGNhbid0CisgICAgICAvLyB1c2UgTW9ycGhOb2RlVG8uCisgICAgICAvLworICAgICAgLy8gTk9URTogU3RyaWN0bHkgc3BlYWtpbmcsIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgZm9yIHRoZSBmbGFnIGhlcmUKKyAgICAgIC8vIGJlY2F1c2UgdGhlIGNvZGUgaW4gdGhlIHBhdHRlcm4gZ2VuZXJhdG9yIGRvZXNuJ3QgaGFuZGxlIGl0IHJpZ2h0LiAgV2UKKyAgICAgIC8vIGRvIGl0IGFueXdheSBmb3IgdGhvcm91Z2huZXNzLgorICAgICAgaWYgKCFFTi0+aGFzT3V0RmxhZygpICYmCisgICAgICAgICAgUGF0dGVybi5nZXRTcmNQYXR0ZXJuKCktPk5vZGVIYXNQcm9wZXJ0eShTRE5QT3V0RmxhZywgQ0dQKSkKKyAgICAgICAgUmVzdWx0c01hdGNoID0gZmFsc2U7CisgICAgICAKKyAgICAgIAorICAgICAgLy8gSWYgdGhlIHJvb3QgcmVzdWx0IG5vZGUgZGVmaW5lcyBtb3JlIHJlc3VsdHMgdGhhbiB0aGUgc291cmNlIHJvb3Qgbm9kZQorICAgICAgLy8gKmFuZCogaGFzIGEgY2hhaW4gb3IgZmxhZyBpbnB1dCwgdGhlbiB3ZSBjYW4ndCBtYXRjaCBpdCBiZWNhdXNlIGl0CisgICAgICAvLyB3b3VsZCBlbmQgdXAgcmVwbGFjaW5nIHRoZSBleHRyYSByZXN1bHQgd2l0aCB0aGUgY2hhaW4vZmxhZy4KKyNpZiAwCisgICAgICBpZiAoKEVOLT5oYXNGbGFnKCkgfHwgRU4tPmhhc0NoYWluKCkpICYmCisgICAgICAgICAgRU4tPmdldE51bU5vbkNoYWluRmxhZ1ZUcygpID4gLi4uIG5lZWQgdG8gZ2V0IG5vIHJlc3VsdHMgcmVsaWFibHkgLi4uKQorICAgICAgICBSZXN1bHRNYXRjaCA9IGZhbHNlOworI2VuZGlmCisgICAgICAgICAgCisgICAgICBpZiAoUmVzdWx0c01hdGNoKSB7CisgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNVlQ6OlNpbXBsZVZhbHVlVHlwZT4gJlZUcyA9IEVOLT5nZXRWVExpc3QoKTsKKyAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmT3BlcmFuZHMgPSBFTi0+Z2V0T3BlcmFuZExpc3QoKTsKKyAgICAgICAgTWF0Y2hlclB0ci5yZXNldChuZXcgTW9ycGhOb2RlVG9NYXRjaGVyKEVOLT5nZXRPcGNvZGVOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVHMuZGF0YSgpLCBWVHMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZHMuZGF0YSgpLE9wZXJhbmRzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOLT5oYXNDaGFpbigpLCBFTi0+aGFzSW5GbGFnKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTi0+aGFzT3V0RmxhZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU4tPmhhc01lbVJlZnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOLT5nZXROdW1GaXhlZEFyaXR5T3BlcmFuZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm4pKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBGSVhNRTI6IEtpbGwgb2ZmIGFsbCB0aGUgU2VsZWN0aW9uREFHOjpTZWxlY3ROb2RlVG8gYW5kIGdldE1hY2hpbmVOb2RlCisgICAgICAvLyB2YXJpYW50cy4KKyAgICB9CisgIAorICBDb250cmFjdE5vZGVzKE4tPmdldE5leHRQdHIoKSwgQ0dQKTsKKyAgCisgIAorICAvLyBJZiB3ZSBoYXZlIGEgQ2hlY2tUeXBlL0NoZWNrQ2hpbGRUeXBlL1JlY29yZCBub2RlIGZvbGxvd2VkIGJ5IGEKKyAgLy8gQ2hlY2tPcGNvZGUsIGludmVydCB0aGUgdHdvIG5vZGVzLiAgV2UgcHJlZmVyIHRvIGRvIHN0cnVjdHVyYWwgY2hlY2tzCisgIC8vIGJlZm9yZSB0eXBlIGNoZWNrcywgYXMgdGhpcyBvcGVucyBvcHBvcnR1bml0aWVzIGZvciBmYWN0b3Jpbmcgb24gdGFyZ2V0cworICAvLyBsaWtlIFg4NiB3aGVyZSBtYW55IG9wZXJhdGlvbnMgYXJlIHZhbGlkIG9uIG11bHRpcGxlIHR5cGVzLgorICBpZiAoKGlzYTxDaGVja1R5cGVNYXRjaGVyPihOKSB8fCBpc2E8Q2hlY2tDaGlsZFR5cGVNYXRjaGVyPihOKSB8fAorICAgICAgIGlzYTxSZWNvcmRNYXRjaGVyPihOKSkgJiYKKyAgICAgIGlzYTxDaGVja09wY29kZU1hdGNoZXI+KE4tPmdldE5leHQoKSkpIHsKKyAgICAvLyBVbmxpbmsgdGhlIHR3byBub2RlcyBmcm9tIHRoZSBsaXN0LgorICAgIE1hdGNoZXIgKkNoZWNrVHlwZSA9IE1hdGNoZXJQdHIudGFrZSgpOworICAgIE1hdGNoZXIgKkNoZWNrT3Bjb2RlID0gQ2hlY2tUeXBlLT50YWtlTmV4dCgpOworICAgIE1hdGNoZXIgKlRhaWwgPSBDaGVja09wY29kZS0+dGFrZU5leHQoKTsKKyAgICAKKyAgICAvLyBSZWxpbmsgdGhlbS4KKyAgICBNYXRjaGVyUHRyLnJlc2V0KENoZWNrT3Bjb2RlKTsKKyAgICBDaGVja09wY29kZS0+c2V0TmV4dChDaGVja1R5cGUpOworICAgIENoZWNrVHlwZS0+c2V0TmV4dChUYWlsKTsKKyAgICByZXR1cm4gQ29udHJhY3ROb2RlcyhNYXRjaGVyUHRyLCBDR1ApOworICB9Cit9CisKKy8vLyBTaW5rUGF0dGVyblByZWRpY2F0ZXMgLSBQYXR0ZXJuIHByZWRpY2F0ZXMgY2FuIGJlIGNoZWNrZWQgYXQgYW55IGxldmVsIG9mCisvLy8gdGhlIG1hdGNoaW5nIHRyZWUuICBUaGUgZ2VuZXJhdG9yIGR1bXBzIHRoZW0gYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgcGF0dGVybgorLy8vIHRob3VnaCwgd2hpY2ggcHJldmVudHMgZmFjdG9yaW5nIGZyb20gYmVpbmcgYWJsZSB0byBzZWUgcGFzdCB0aGVtLiAgVGhpcworLy8vIG9wdGltaXphdGlvbiBzaW5rcyB0aGVtIGFzIGZhciBkb3duIGludG8gdGhlIHBhdHRlcm4gYXMgcG9zc2libGUuCisvLy8KKy8vLyBDb25jZXB0dWFsbHksIHdlJ2QgbGlrZSB0byBzaW5rIHRoZXNlIHByZWRpY2F0ZXMgYWxsIHRoZSB3YXkgdG8gdGhlIGxhc3QKKy8vLyBtYXRjaGVyIHByZWRpY2F0ZSBpbiB0aGUgc2VyaWVzLiAgSG93ZXZlciwgaXQgdHVybnMgb3V0IHRoYXQgc29tZQorLy8vIENvbXBsZXhQYXR0ZXJucyBoYXZlIHNpZGUgZWZmZWN0cyBvbiB0aGUgZ3JhcGgsIHNvIHdlIHJlYWxseSBkb24ndCB3YW50IHRvCisvLy8gcnVuIGEgdGhlIGNvbXBsZXggcGF0dGVybiBpZiB0aGUgcGF0dGVybiBwcmVkaWNhdGUgd2lsbCBmYWlsLiAgRm9yIHRoaXMKKy8vLyByZWFzb24sIHdlIHJlZnVzZSB0byBzaW5rIHRoZSBwYXR0ZXJuIHByZWRpY2F0ZSBwYXN0IGEgQ29tcGxleFBhdHRlcm4uCisvLy8KK3N0YXRpYyB2b2lkIFNpbmtQYXR0ZXJuUHJlZGljYXRlcyhPd25pbmdQdHI8TWF0Y2hlcj4gJk1hdGNoZXJQdHIpIHsKKyAgLy8gUmVjdXJzaXZlbHkgc2NhbiBmb3IgYSBQYXR0ZXJuUHJlZGljYXRlLgorICAvLyBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGNoYWluLCB3ZSdyZSBkb25lLgorICBNYXRjaGVyICpOID0gTWF0Y2hlclB0ci5nZXQoKTsKKyAgaWYgKE4gPT0gMCkgcmV0dXJuOworICAKKyAgLy8gV2FsayBkb3duIGFsbCBtZW1iZXJzIG9mIGEgc2NvcGUgbm9kZS4KKyAgaWYgKFNjb3BlTWF0Y2hlciAqU2NvcGUgPSBkeW5fY2FzdDxTY29wZU1hdGNoZXI+KE4pKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNjb3BlLT5nZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkgeworICAgICAgT3duaW5nUHRyPE1hdGNoZXI+IENoaWxkKFNjb3BlLT50YWtlQ2hpbGQoaSkpOworICAgICAgU2lua1BhdHRlcm5QcmVkaWNhdGVzKENoaWxkKTsKKyAgICAgIFNjb3BlLT5yZXNldENoaWxkKGksIENoaWxkLnRha2UoKSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gSWYgdGhpcyBub2RlIGlzbid0IGEgQ2hlY2tQYXR0ZXJuUHJlZGljYXRlTWF0Y2hlciB3ZSBrZWVwIHNjYW5uaW5nIHVudGlsCisgIC8vIHdlIGZpbmQgb25lLgorICBDaGVja1BhdHRlcm5QcmVkaWNhdGVNYXRjaGVyICpDUFBNID1keW5fY2FzdDxDaGVja1BhdHRlcm5QcmVkaWNhdGVNYXRjaGVyPihOKTsKKyAgaWYgKENQUE0gPT0gMCkKKyAgICByZXR1cm4gU2lua1BhdHRlcm5QcmVkaWNhdGVzKE4tPmdldE5leHRQdHIoKSk7CisgIAorICAvLyBPaywgd2UgZm91bmQgb25lLCBsZXRzIHRyeSB0byBzaW5rIGl0LiBDaGVjayBpZiB3ZSBjYW4gc2luayBpdCBwYXN0IHRoZQorICAvLyBuZXh0IG5vZGUgaW4gdGhlIGNoYWluLiAgSWYgbm90LCB3ZSB3b24ndCBiZSBhYmxlIHRvIGNoYW5nZSBhbnl0aGluZyBhbmQKKyAgLy8gbWlnaHQgYXMgd2VsbCBiYWlsLgorICBpZiAoIUNQUE0tPmdldE5leHQoKS0+aXNTYWZlVG9SZW9yZGVyV2l0aFBhdHRlcm5QcmVkaWNhdGUoKSkKKyAgICByZXR1cm47CisgIAorICAvLyBPa2F5LCB3ZSBrbm93IHdlIGNhbiBzaW5rIGl0IHBhc3QgYXQgbGVhc3Qgb25lIG5vZGUuICBVbmxpbmsgaXQgZnJvbSB0aGUKKyAgLy8gY2hhaW4gYW5kIHNjYW4gZm9yIHRoZSBuZXcgaW5zZXJ0aW9uIHBvaW50LgorICBNYXRjaGVyUHRyLnRha2UoKTsgIC8vIERvbid0IGRlbGV0ZSBDUFBNLgorICBNYXRjaGVyUHRyLnJlc2V0KENQUE0tPnRha2VOZXh0KCkpOworICAKKyAgTiA9IE1hdGNoZXJQdHIuZ2V0KCk7CisgIHdoaWxlIChOLT5nZXROZXh0KCktPmlzU2FmZVRvUmVvcmRlcldpdGhQYXR0ZXJuUHJlZGljYXRlKCkpCisgICAgTiA9IE4tPmdldE5leHQoKTsKKyAgCisgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIHdhbnQgdG8gaW5zZXJ0IENQUE0gYWZ0ZXIgTi4KKyAgQ1BQTS0+c2V0TmV4dChOLT50YWtlTmV4dCgpKTsKKyAgTi0+c2V0TmV4dChDUFBNKTsKK30KKworLy8vIEZpbmROb2RlV2l0aEtpbmQgLSBTY2FuIGEgc2VyaWVzIG9mIG1hdGNoZXJzIGxvb2tpbmcgZm9yIGEgbWF0Y2hlciB3aXRoIGEKKy8vLyBzcGVjaWZpZWQga2luZC4gIFJldHVybiBudWxsIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBvdGhlcndpc2UgcmV0dXJuIHRoZQorLy8vIG1hdGNoZXIuCitzdGF0aWMgTWF0Y2hlciAqRmluZE5vZGVXaXRoS2luZChNYXRjaGVyICpNLCBNYXRjaGVyOjpLaW5kVHkgS2luZCkgeworICBmb3IgKDsgTTsgTSA9IE0tPmdldE5leHQoKSkKKyAgICBpZiAoTS0+Z2V0S2luZCgpID09IEtpbmQpCisgICAgICByZXR1cm4gTTsKKyAgcmV0dXJuIDA7Cit9CisKKworLy8vIEZhY3Rvck5vZGVzIC0gVHVybiBtYXRjaGVzIGxpa2UgdGhpczoKKy8vLyAgIFNjb3BlCisvLy8gICAgIE9QQ19DaGVja1R5cGUgaTMyCisvLy8gICAgICAgQUJDCisvLy8gICAgIE9QQ19DaGVja1R5cGUgaTMyCisvLy8gICAgICAgWFlaCisvLy8gaW50bzoKKy8vLyAgIE9QQ19DaGVja1R5cGUgaTMyCisvLy8gICAgIFNjb3BlCisvLy8gICAgICAgQUJDCisvLy8gICAgICAgWFlaCisvLy8KK3N0YXRpYyB2b2lkIEZhY3Rvck5vZGVzKE93bmluZ1B0cjxNYXRjaGVyPiAmTWF0Y2hlclB0cikgeworICAvLyBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGNoYWluLCB3ZSdyZSBkb25lLgorICBNYXRjaGVyICpOID0gTWF0Y2hlclB0ci5nZXQoKTsKKyAgaWYgKE4gPT0gMCkgcmV0dXJuOworICAKKyAgLy8gSWYgdGhpcyBpcyBub3QgYSBwdXNoIG5vZGUsIGp1c3Qgc2NhbiBmb3Igb25lLgorICBTY29wZU1hdGNoZXIgKlNjb3BlID0gZHluX2Nhc3Q8U2NvcGVNYXRjaGVyPihOKTsKKyAgaWYgKFNjb3BlID09IDApCisgICAgcmV0dXJuIEZhY3Rvck5vZGVzKE4tPmdldE5leHRQdHIoKSk7CisgIAorICAvLyBPa2F5LCBwdWxsIHRvZ2V0aGVyIHRoZSBjaGlsZHJlbiBvZiB0aGUgc2NvcGUgbm9kZSBpbnRvIGEgdmVjdG9yIHNvIHdlIGNhbgorICAvLyBpbnNwZWN0IGl0IG1vcmUgZWFzaWx5LiAgV2hpbGUgd2UncmUgYXQgaXQsIGJ1Y2tldCB0aGVtIHVwIGJ5IHRoZSBoYXNoCisgIC8vIGNvZGUgb2YgdGhlaXIgZmlyc3QgcHJlZGljYXRlLgorICBTbWFsbFZlY3RvcjxNYXRjaGVyKiwgMzI+IE9wdGlvbnNUb01hdGNoOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNjb3BlLT5nZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkgeworICAgIC8vIEZhY3RvciB0aGUgc3ViZXhwcmVzc2lvbi4KKyAgICBPd25pbmdQdHI8TWF0Y2hlcj4gQ2hpbGQoU2NvcGUtPnRha2VDaGlsZChpKSk7CisgICAgRmFjdG9yTm9kZXMoQ2hpbGQpOworICAgIAorICAgIGlmIChNYXRjaGVyICpOID0gQ2hpbGQudGFrZSgpKQorICAgICAgT3B0aW9uc1RvTWF0Y2gucHVzaF9iYWNrKE4pOworICB9CisgIAorICBTbWFsbFZlY3RvcjxNYXRjaGVyKiwgMzI+IE5ld09wdGlvbnNUb01hdGNoOworICAKKyAgLy8gTG9vcCBvdmVyIG9wdGlvbnMgdG8gbWF0Y2gsIG1lcmdpbmcgbmVpZ2hib3JpbmcgcGF0dGVybnMgd2l0aCBpZGVudGljYWwKKyAgLy8gc3RhcnRpbmcgbm9kZXMgaW50byBhIHNoYXJlZCBtYXRjaGVyLgorICBmb3IgKHVuc2lnbmVkIE9wdGlvbklkeCA9IDAsIGUgPSBPcHRpb25zVG9NYXRjaC5zaXplKCk7IE9wdGlvbklkeCAhPSBlOykgeworICAgIC8vIEZpbmQgdGhlIHNldCBvZiBtYXRjaGVycyB0aGF0IHN0YXJ0IHdpdGggdGhpcyBub2RlLgorICAgIE1hdGNoZXIgKk9wdG4gPSBPcHRpb25zVG9NYXRjaFtPcHRpb25JZHgrK107CisKKyAgICBpZiAoT3B0aW9uSWR4ID09IGUpIHsKKyAgICAgIE5ld09wdGlvbnNUb01hdGNoLnB1c2hfYmFjayhPcHRuKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvLyBTZWUgaWYgdGhlIG5leHQgb3B0aW9uIHN0YXJ0cyB3aXRoIHRoZSBzYW1lIG1hdGNoZXIuICBJZiB0aGUgdHdvCisgICAgLy8gbmVpZ2hib3JzICpkbyogc3RhcnQgd2l0aCB0aGUgc2FtZSBtYXRjaGVyLCB3ZSBjYW4gZmFjdG9yIHRoZSBtYXRjaGVyIG91dAorICAgIC8vIG9mIGF0IGxlYXN0IHRoZXNlIHR3byBwYXR0ZXJucy4gIFNlZSB3aGF0IHRoZSBtYXhpbWFsIHNldCB3ZSBjYW4gbWVyZ2UKKyAgICAvLyB0b2dldGhlciBpcy4KKyAgICBTbWFsbFZlY3RvcjxNYXRjaGVyKiwgOD4gRXF1YWxNYXRjaGVyczsKKyAgICBFcXVhbE1hdGNoZXJzLnB1c2hfYmFjayhPcHRuKTsKKyAgICAKKyAgICAvLyBGYWN0b3IgYWxsIG9mIHRoZSBrbm93bi1lcXVhbCBtYXRjaGVycyBhZnRlciB0aGlzIG9uZSBpbnRvIHRoZSBzYW1lCisgICAgLy8gZ3JvdXAuCisgICAgd2hpbGUgKE9wdGlvbklkeCAhPSBlICYmIE9wdGlvbnNUb01hdGNoW09wdGlvbklkeF0tPmlzRXF1YWwoT3B0bikpCisgICAgICBFcXVhbE1hdGNoZXJzLnB1c2hfYmFjayhPcHRpb25zVG9NYXRjaFtPcHRpb25JZHgrK10pOworCisgICAgLy8gSWYgd2UgZm91bmQgYSBub24tZXF1YWwgbWF0Y2hlciwgc2VlIGlmIGl0IGlzIGNvbnRyYWRpY3Rvcnkgd2l0aCB0aGUKKyAgICAvLyBjdXJyZW50IG5vZGUuICBJZiBzbywgd2Uga25vdyB0aGF0IHRoZSBvcmRlcmluZyByZWxhdGlvbiBiZXR3ZWVuIHRoZQorICAgIC8vIGN1cnJlbnQgc2V0cyBvZiBub2RlcyBhbmQgdGhpcyBub2RlIGRvbid0IG1hdHRlci4gIExvb2sgcGFzdCBpdCB0byBzZWUgaWYKKyAgICAvLyB3ZSBjYW4gbWVyZ2UgYW55dGhpbmcgZWxzZSBpbnRvIHRoaXMgbWF0Y2hpbmcgZ3JvdXAuCisgICAgdW5zaWduZWQgU2NhbiA9IE9wdGlvbklkeDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgLy8gSWYgd2UgcmFuIG91dCBvZiBzdHVmZiB0byBzY2FuLCB3ZSdyZSBkb25lLgorICAgICAgaWYgKFNjYW4gPT0gZSkgYnJlYWs7CisgICAgICAKKyAgICAgIE1hdGNoZXIgKlNjYW5NYXRjaGVyID0gT3B0aW9uc1RvTWF0Y2hbU2Nhbl07CisgICAgICAKKyAgICAgIC8vIElmIHdlIGZvdW5kIGFuIGVudHJ5IHRoYXQgbWF0Y2hlcyBvdXQgbWF0Y2hlciwgbWVyZ2UgaXQgaW50byB0aGUgc2V0IHRvCisgICAgICAvLyBoYW5kbGUuCisgICAgICBpZiAoT3B0bi0+aXNFcXVhbChTY2FuTWF0Y2hlcikpIHsKKyAgICAgICAgLy8gSWYgaXMgZXF1YWwgYWZ0ZXIgYWxsLCBhZGQgdGhlIG9wdGlvbiB0byBFcXVhbE1hdGNoZXJzIGFuZCByZW1vdmUgaXQKKyAgICAgICAgLy8gZnJvbSBPcHRpb25zVG9NYXRjaC4KKyAgICAgICAgRXF1YWxNYXRjaGVycy5wdXNoX2JhY2soU2Nhbk1hdGNoZXIpOworICAgICAgICBPcHRpb25zVG9NYXRjaC5lcmFzZShPcHRpb25zVG9NYXRjaC5iZWdpbigpK1NjYW4pOworICAgICAgICAtLWU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiB0aGUgb3B0aW9uIHdlJ3JlIGNoZWNraW5nIGZvciBjb250cmFkaWN0cyB0aGUgc3RhcnQgb2YgdGhlIGxpc3QsCisgICAgICAvLyBza2lwIG92ZXIgaXQuCisgICAgICBpZiAoT3B0bi0+aXNDb250cmFkaWN0b3J5KFNjYW5NYXRjaGVyKSkgeworICAgICAgICArK1NjYW47CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBJZiB3ZSdyZSBzY2FubmluZyBmb3IgYSBzaW1wbGUgbm9kZSwgc2VlIGlmIGl0IG9jY3VycyBsYXRlciBpbiB0aGUKKyAgICAgIC8vIHNlcXVlbmNlLiAgSWYgc28sIGFuZCBpZiB3ZSBjYW4gbW92ZSBpdCB1cCwgaXQgbWlnaHQgYmUgY29udHJhZGljdG9yeQorICAgICAgLy8gb3IgdGhlIHNhbWUgYXMgd2hhdCB3ZSdyZSBsb29raW5nIGZvci4gIElmIHNvLCByZW9yZGVyIGl0LgorICAgICAgaWYgKE9wdG4tPmlzU2ltcGxlUHJlZGljYXRlT3JSZWNvcmROb2RlKCkpIHsKKyAgICAgICAgTWF0Y2hlciAqTTIgPSBGaW5kTm9kZVdpdGhLaW5kKFNjYW5NYXRjaGVyLCBPcHRuLT5nZXRLaW5kKCkpOworICAgICAgICBpZiAoTTIgIT0gMCAmJiBNMiAhPSBTY2FuTWF0Y2hlciAmJgorICAgICAgICAgICAgTTItPmNhbk1vdmVCZWZvcmUoU2Nhbk1hdGNoZXIpICYmCisgICAgICAgICAgICAoTTItPmlzRXF1YWwoT3B0bikgfHwgTTItPmlzQ29udHJhZGljdG9yeShPcHRuKSkpIHsKKyAgICAgICAgICBNYXRjaGVyICpNYXRjaGVyV2l0aG91dE0yID0gU2Nhbk1hdGNoZXItPnVubGlua05vZGUoTTIpOworICAgICAgICAgIE0yLT5zZXROZXh0KE1hdGNoZXJXaXRob3V0TTIpOworICAgICAgICAgIE9wdGlvbnNUb01hdGNoW1NjYW5dID0gTTI7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcyBlbnRyeSwgd2UgaGF2ZSB0byBiYWlsLgorICAgICAgYnJlYWs7CisgICAgfQorICAgICAgCisgICAgaWYgKFNjYW4gIT0gZSAmJgorICAgICAgICAvLyBEb24ndCBwcmludCBpdCdzIG9idmlvdXMgbm90aGluZyBleHRyYSBjb3VsZCBiZSBtZXJnZWQgYW55d2F5LgorICAgICAgICBTY2FuKzEgIT0gZSkgeworICAgICAgREVCVUcoZXJycygpIDw8ICJDb3VsZG4ndCBtZXJnZSB0aGlzOlxuIjsKKyAgICAgICAgICAgIE9wdG4tPnByaW50KGVycnMoKSwgNCk7CisgICAgICAgICAgICBlcnJzKCkgPDwgImludG8gdGhpczpcbiI7CisgICAgICAgICAgICBPcHRpb25zVG9NYXRjaFtTY2FuXS0+cHJpbnQoZXJycygpLCA0KTsKKyAgICAgICAgICAgIGlmIChTY2FuKzEgIT0gZSkKKyAgICAgICAgICAgICAgT3B0aW9uc1RvTWF0Y2hbU2NhbisxXS0+cHJpbnRPbmUoZXJycygpKTsKKyAgICAgICAgICAgIGlmIChTY2FuKzIgPCBlKQorICAgICAgICAgICAgICBPcHRpb25zVG9NYXRjaFtTY2FuKzJdLT5wcmludE9uZShlcnJzKCkpOworICAgICAgICAgICAgZXJycygpIDw8ICJcbiIpOworICAgIH0KKyAgICAKKyAgICAvLyBJZiB3ZSBvbmx5IGZvdW5kIG9uZSBvcHRpb24gc3RhcnRpbmcgd2l0aCB0aGlzIG1hdGNoZXIsIG5vIGZhY3RvcmluZyBpcworICAgIC8vIHBvc3NpYmxlLgorICAgIGlmIChFcXVhbE1hdGNoZXJzLnNpemUoKSA9PSAxKSB7CisgICAgICBOZXdPcHRpb25zVG9NYXRjaC5wdXNoX2JhY2soRXF1YWxNYXRjaGVyc1swXSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLy8gRmFjdG9yIHRoZXNlIGNoZWNrcyBieSBwdWxsaW5nIHRoZSBmaXJzdCBub2RlIG9mZiBlYWNoIGVudHJ5IGFuZAorICAgIC8vIGRpc2NhcmRpbmcgaXQuICBUYWtlIHRoZSBmaXJzdCBvbmUgb2ZmIHRoZSBmaXJzdCBlbnRyeSB0byByZXVzZS4KKyAgICBNYXRjaGVyICpTaGFyZWQgPSBPcHRuOworICAgIE9wdG4gPSBPcHRuLT50YWtlTmV4dCgpOworICAgIEVxdWFsTWF0Y2hlcnNbMF0gPSBPcHRuOworCisgICAgLy8gUmVtb3ZlIGFuZCBkZWxldGUgdGhlIGZpcnN0IG5vZGUgZnJvbSB0aGUgb3RoZXIgbWF0Y2hlcnMgd2UncmUgZmFjdG9yaW5nLgorICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBFcXVhbE1hdGNoZXJzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE1hdGNoZXIgKlRtcCA9IEVxdWFsTWF0Y2hlcnNbaV0tPnRha2VOZXh0KCk7CisgICAgICBkZWxldGUgRXF1YWxNYXRjaGVyc1tpXTsKKyAgICAgIEVxdWFsTWF0Y2hlcnNbaV0gPSBUbXA7CisgICAgfQorICAgIAorICAgIFNoYXJlZC0+c2V0TmV4dChuZXcgU2NvcGVNYXRjaGVyKCZFcXVhbE1hdGNoZXJzWzBdLCBFcXVhbE1hdGNoZXJzLnNpemUoKSkpOworCisgICAgLy8gUmVjdXJzaXZlbHkgZmFjdG9yIHRoZSBuZXdseSBjcmVhdGVkIG5vZGUuCisgICAgRmFjdG9yTm9kZXMoU2hhcmVkLT5nZXROZXh0UHRyKCkpOworICAgIAorICAgIE5ld09wdGlvbnNUb01hdGNoLnB1c2hfYmFjayhTaGFyZWQpOworICB9CisgIAorICAvLyBJZiB3ZSdyZSBkb3duIHRvIGEgc2luZ2xlIHBhdHRlcm4gdG8gbWF0Y2gsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0aGlzIHNjb3BlCisgIC8vIGFueW1vcmUuCisgIGlmIChOZXdPcHRpb25zVG9NYXRjaC5zaXplKCkgPT0gMSkgeworICAgIE1hdGNoZXJQdHIucmVzZXQoTmV3T3B0aW9uc1RvTWF0Y2hbMF0pOworICAgIHJldHVybjsKKyAgfQorICAKKyAgaWYgKE5ld09wdGlvbnNUb01hdGNoLmVtcHR5KCkpIHsKKyAgICBNYXRjaGVyUHRyLnJlc2V0KDApOworICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gSWYgb3VyIGZhY3RvcmluZyBmYWlsZWQgKGRpZG4ndCBhY2hpZXZlIGFueXRoaW5nKSBzZWUgaWYgd2UgY2FuIHNpbXBsaWZ5IGluCisgIC8vIG90aGVyIHdheXMuCisgIAorICAvLyBDaGVjayB0byBzZWUgaWYgYWxsIG9mIHRoZSBsZWFkaW5nIGVudHJpZXMgYXJlIG5vdyBvcGNvZGUgY2hlY2tzLiAgSWYgc28sCisgIC8vIHdlIGNhbiBjb252ZXJ0IHRoaXMgU2NvcGUgdG8gYmUgYSBPcGNvZGVTd2l0Y2ggaW5zdGVhZC4KKyAgYm9vbCBBbGxPcGNvZGVDaGVja3MgPSB0cnVlLCBBbGxUeXBlQ2hlY2tzID0gdHJ1ZTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5ld09wdGlvbnNUb01hdGNoLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBicmVha3MgYSBzZXJpZXMgb2YgQ2hlY2tPcGNvZGVNYXRjaGVycy4KKyAgICBpZiAoQWxsT3Bjb2RlQ2hlY2tzICYmCisgICAgICAgICFpc2E8Q2hlY2tPcGNvZGVNYXRjaGVyPihOZXdPcHRpb25zVG9NYXRjaFtpXSkpIHsKKyNpZiAwCisgICAgICBpZiAoaSA+IDMpIHsKKyAgICAgICAgZXJycygpIDw8ICJGQUlMSU5HIE9QQyAjIiA8PCBpIDw8ICJcbiI7CisgICAgICAgIE5ld09wdGlvbnNUb01hdGNoW2ldLT5kdW1wKCk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIEFsbE9wY29kZUNoZWNrcyA9IGZhbHNlOworICAgIH0KKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGJyZWFrcyBhIHNlcmllcyBvZiBDaGVja1R5cGVNYXRjaGVyJ3MuCisgICAgaWYgKEFsbFR5cGVDaGVja3MpIHsKKyAgICAgIENoZWNrVHlwZU1hdGNoZXIgKkNUTSA9CisgICAgICAgIGNhc3Rfb3JfbnVsbDxDaGVja1R5cGVNYXRjaGVyPihGaW5kTm9kZVdpdGhLaW5kKE5ld09wdGlvbnNUb01hdGNoW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyOjpDaGVja1R5cGUpKTsKKyAgICAgIGlmIChDVE0gPT0gMCB8fAorICAgICAgICAgIC8vIGlQVFIgY2hlY2tzIGNvdWxkIGFsaWFzIGFueSBvdGhlciBjYXNlIHdpdGhvdXQgdXMga25vd2luZywgZG9uJ3QKKyAgICAgICAgICAvLyBib3RoZXIgd2l0aCB0aGVtLgorICAgICAgICAgIENUTS0+Z2V0VHlwZSgpID09IE1WVDo6aVBUUiB8fAorICAgICAgICAgIC8vIFN3aXRjaFR5cGUgb25seSB3b3JrcyBmb3IgcmVzdWx0ICMwLgorICAgICAgICAgIENUTS0+Z2V0UmVzTm8oKSAhPSAwIHx8CisgICAgICAgICAgLy8gSWYgdGhlIENoZWNrVHlwZSBpc24ndCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpc3QsIHNlZSBpZiB3ZSBjYW4gbW92ZQorICAgICAgICAgIC8vIGl0IHRoZXJlLgorICAgICAgICAgICFDVE0tPmNhbk1vdmVCZWZvcmUoTmV3T3B0aW9uc1RvTWF0Y2hbaV0pKSB7CisjaWYgMAorICAgICAgICBpZiAoaSA+IDMgJiYgQWxsVHlwZUNoZWNrcykgeworICAgICAgICAgIGVycnMoKSA8PCAiRkFJTElORyBUWVBFICMiIDw8IGkgPDwgIlxuIjsKKyAgICAgICAgICBOZXdPcHRpb25zVG9NYXRjaFtpXS0+ZHVtcCgpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgQWxsVHlwZUNoZWNrcyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLy8gSWYgYWxsIHRoZSBvcHRpb25zIGFyZSBDaGVja09wY29kZSdzLCB3ZSBjYW4gZm9ybSB0aGUgU3dpdGNoT3Bjb2RlLCB3b290LgorICBpZiAoQWxsT3Bjb2RlQ2hlY2tzKSB7CisgICAgU3RyaW5nU2V0PD4gT3Bjb2RlczsKKyAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgU0ROb2RlSW5mbyosIE1hdGNoZXIqPiwgOD4gQ2FzZXM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5ld09wdGlvbnNUb01hdGNoLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIENoZWNrT3Bjb2RlTWF0Y2hlciAqQ09NID0gY2FzdDxDaGVja09wY29kZU1hdGNoZXI+KE5ld09wdGlvbnNUb01hdGNoW2ldKTsKKyAgICAgIGFzc2VydChPcGNvZGVzLmluc2VydChDT00tPmdldE9wY29kZSgpLmdldEVudW1OYW1lKCkpICYmCisgICAgICAgICAgICAgIkR1cGxpY2F0ZSBvcGNvZGVzIG5vdCBmYWN0b3JlZD8iKTsKKyAgICAgIENhc2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigmQ09NLT5nZXRPcGNvZGUoKSwgQ09NLT5nZXROZXh0KCkpKTsKKyAgICB9CisgICAgCisgICAgTWF0Y2hlclB0ci5yZXNldChuZXcgU3dpdGNoT3Bjb2RlTWF0Y2hlcigmQ2FzZXNbMF0sIENhc2VzLnNpemUoKSkpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgLy8gSWYgYWxsIHRoZSBvcHRpb25zIGFyZSBDaGVja1R5cGUncywgd2UgY2FuIGZvcm0gdGhlIFN3aXRjaFR5cGUsIHdvb3QuCisgIGlmIChBbGxUeXBlQ2hlY2tzKSB7CisgICAgRGVuc2VNYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBUeXBlRW50cnk7CisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPE1WVDo6U2ltcGxlVmFsdWVUeXBlLCBNYXRjaGVyKj4sIDg+IENhc2VzOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOZXdPcHRpb25zVG9NYXRjaC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBDaGVja1R5cGVNYXRjaGVyICpDVE0gPQorICAgICAgICBjYXN0X29yX251bGw8Q2hlY2tUeXBlTWF0Y2hlcj4oRmluZE5vZGVXaXRoS2luZChOZXdPcHRpb25zVG9NYXRjaFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcjo6Q2hlY2tUeXBlKSk7CisgICAgICBNYXRjaGVyICpNYXRjaGVyV2l0aG91dENUTSA9IE5ld09wdGlvbnNUb01hdGNoW2ldLT51bmxpbmtOb2RlKENUTSk7CisgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBDVE1UeSA9IENUTS0+Z2V0VHlwZSgpOworICAgICAgZGVsZXRlIENUTTsKKyAgICAgIAorICAgICAgdW5zaWduZWQgJkVudHJ5ID0gVHlwZUVudHJ5W0NUTVR5XTsKKyAgICAgIGlmIChFbnRyeSAhPSAwKSB7CisgICAgICAgIC8vIElmIHdlIGhhdmUgdW5mYWN0b3JlZCBkdXBsaWNhdGUgdHlwZXMsIHRoZW4gd2Ugc2hvdWxkIGZhY3RvciB0aGVtLgorICAgICAgICBNYXRjaGVyICpQcmV2TWF0Y2hlciA9IENhc2VzW0VudHJ5LTFdLnNlY29uZDsKKyAgICAgICAgaWYgKFNjb3BlTWF0Y2hlciAqU00gPSBkeW5fY2FzdDxTY29wZU1hdGNoZXI+KFByZXZNYXRjaGVyKSkgeworICAgICAgICAgIFNNLT5zZXROdW1DaGlsZHJlbihTTS0+Z2V0TnVtQ2hpbGRyZW4oKSsxKTsKKyAgICAgICAgICBTTS0+cmVzZXRDaGlsZChTTS0+Z2V0TnVtQ2hpbGRyZW4oKS0xLCBNYXRjaGVyV2l0aG91dENUTSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE1hdGNoZXIgKkVudHJpZXNbMl0gPSB7IFByZXZNYXRjaGVyLCBNYXRjaGVyV2l0aG91dENUTSB9OworICAgICAgICBDYXNlc1tFbnRyeS0xXS5zZWNvbmQgPSBuZXcgU2NvcGVNYXRjaGVyKEVudHJpZXMsIDIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgRW50cnkgPSBDYXNlcy5zaXplKCkrMTsKKyAgICAgIENhc2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihDVE1UeSwgTWF0Y2hlcldpdGhvdXRDVE0pKTsKKyAgICB9CisgICAgCisgICAgaWYgKENhc2VzLnNpemUoKSAhPSAxKSB7CisgICAgICBNYXRjaGVyUHRyLnJlc2V0KG5ldyBTd2l0Y2hUeXBlTWF0Y2hlcigmQ2FzZXNbMF0sIENhc2VzLnNpemUoKSkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBJZiB3ZSBmYWN0b3JlZCBhbmQgZW5kZWQgdXAgd2l0aCBvbmUgY2FzZSwgY3JlYXRlIGl0IG5vdy4KKyAgICAgIE1hdGNoZXJQdHIucmVzZXQobmV3IENoZWNrVHlwZU1hdGNoZXIoQ2FzZXNbMF0uZmlyc3QsIDApKTsKKyAgICAgIE1hdGNoZXJQdHItPnNldE5leHQoQ2FzZXNbMF0uc2Vjb25kKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIAorCisgIC8vIFJlYXNzZW1ibGUgdGhlIFNjb3BlIG5vZGUgd2l0aCB0aGUgYWRqdXN0ZWQgY2hpbGRyZW4uCisgIFNjb3BlLT5zZXROdW1DaGlsZHJlbihOZXdPcHRpb25zVG9NYXRjaC5zaXplKCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3T3B0aW9uc1RvTWF0Y2guc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBTY29wZS0+cmVzZXRDaGlsZChpLCBOZXdPcHRpb25zVG9NYXRjaFtpXSk7Cit9CisKK01hdGNoZXIgKmxsdm06Ok9wdGltaXplTWF0Y2hlcihNYXRjaGVyICpUaGVNYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW5EQUdQYXR0ZXJucyAmQ0dQKSB7CisgIE93bmluZ1B0cjxNYXRjaGVyPiBNYXRjaGVyUHRyKFRoZU1hdGNoZXIpOworICBDb250cmFjdE5vZGVzKE1hdGNoZXJQdHIsIENHUCk7CisgIFNpbmtQYXR0ZXJuUHJlZGljYXRlcyhNYXRjaGVyUHRyKTsKKyAgRmFjdG9yTm9kZXMoTWF0Y2hlclB0cik7CisgIHJldHVybiBNYXRjaGVyUHRyLnRha2UoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0Rpc2Fzc2VtYmxlckVtaXR0ZXIuY3BwIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vRGlzYXNzZW1ibGVyRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4NDM2NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0Rpc2Fzc2VtYmxlckVtaXR0ZXIuY3BwCkBAIC0wLDAgKzEsMTM3IEBACisvLz09PS0gRGlzYXNzZW1ibGVyRW1pdHRlci5jcHAgLSBHZW5lcmF0ZSBhIGRpc2Fzc2VtYmxlciAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiRGlzYXNzZW1ibGVyRW1pdHRlci5oIgorI2luY2x1ZGUgIkNvZGVHZW5UYXJnZXQuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJYODZEaXNhc3NlbWJsZXJUYWJsZXMuaCIKKyNpbmNsdWRlICJYODZSZWNvZ25pemFibGVJbnN0ci5oIgorI2luY2x1ZGUgIkFSTURlY29kZXJFbWl0dGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOwordXNpbmcgbmFtZXNwYWNlIGxsdm06Olg4NkRpc2Fzc2VtYmxlcjsKKworLy8vIERpc2Fzc2VtYmxlckVtaXR0ZXIgLSBDb250YWlucyBkaXNhc3NlbWJsZXIgdGFibGUgZW1pdHRlcnMgZm9yIHZhcmlvdXMKKy8vLyBhcmNoaXRlY3R1cmVzLgorCisvLy8gWDg2IERpc2Fzc2VtYmxlciBFbWl0dGVyCisvLy8KKy8vLyAqKiogSUYgWU9VJ1JFIEhFUkUgVE8gUkVTT0xWRSBBICJQcmltYXJ5IGRlY29kZSBjb25mbGljdCIsIExPT0sgRE9XTiBORUFSCisvLy8gICAgIFRIRSBFTkQgT0YgVEhJUyBDT01NRU5UIQorLy8vCisvLy8gVGhlIFg4NiBkaXNhc3NlbWJsZXIgZW1pdHRlciBpcyBwYXJ0IG9mIHRoZSBYODYgRGlzYXNzZW1ibGVyLCB3aGljaCBpcworLy8vIGRvY3VtZW50ZWQgaW4gbGliL1RhcmdldC9YODYvWDg2RGlzYXNzZW1ibGVyLmguCisvLy8KKy8vLyBUaGUgZW1pdHRlciBwcm9kdWNlcyB0aGUgdGFibGVzIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB1c2VzIHRvIHRyYW5zbGF0ZQorLy8vIGluc3RydWN0aW9ucy4gIFRoZSBlbWl0dGVyIGdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIHRhYmxlczoKKy8vLworLy8vIC0gT25lIHRhYmxlIChDT05URVhUU19TWU0pIHRoYXQgY29udGFpbnMgYSBtYXBwaW5nIG9mIGF0dHJpYnV0ZSBtYXNrcyB0bworLy8vICAgaW5zdHJ1Y3Rpb24gY29udGV4dHMuICBBbHRob3VnaCBmb3IgZWFjaCBhdHRyaWJ1dGUgdGhlcmUgYXJlIGNhc2VzIHdoZXJlCisvLy8gICB0aGF0IGF0dHJpYnV0ZSBkZXRlcm1pbmVzIGRlY29kaW5nLCBpbiB0aGUgbWFqb3JpdHkgb2YgY2FzZXMgZGVjb2RpbmcgaXMKKy8vLyAgIHRoZSBzYW1lIHdoZXRoZXIgb3Igbm90IGFuIGF0dHJpYnV0ZSBpcyBwcmVzZW50LiAgRm9yIGV4YW1wbGUsIGEgNjQtYml0CisvLy8gICBpbnN0cnVjdGlvbiB3aXRoIGFuIE9QU0laRSBwcmVmaXggYW5kIGFuIFhTIHByZWZpeCBkZWNvZGVzIHRoZSBzYW1lIHdheSBpbgorLy8vICAgYWxsIGNhc2VzIGFzIGEgNjQtYml0IGluc3RydWN0aW9uIHdpdGggb25seSBPUFNJWkUgc2V0LiAgKFRoZSBYUyBwcmVmaXgKKy8vLyAgIG1heSBoYXZlIGVmZmVjdHMgb24gaXRzIGV4ZWN1dGlvbiwgYnV0IGRvZXMgbm90IGNoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24KKy8vLyAgIHJldHVybmVkLikgIFRoaXMgYWxsb3dzIGNvbnNpZGVyYWJsZSBzcGFjZSBzYXZpbmdzIGluIG90aGVyIHRhYmxlcy4KKy8vLyAtIEZvdXIgdGFibGVzIChPTkVCWVRFX1NZTSwgVFdPQllURV9TWU0sIFRIUkVFQllURTM4X1NZTSwgYW5kCisvLy8gICBUSFJFRUJZVEUzQV9TWU0pIGNvbnRhaW4gdGhlIGhpZXJhcmNoeSB0aGF0IHRoZSBkZWNvZGVyIHRyYXZlcnNlcyB3aGlsZQorLy8vICAgZGVjb2RpbmcgYW4gaW5zdHJ1Y3Rpb24uICBBdCB0aGUgbG93ZXN0IGxldmVsIG9mIHRoaXMgaGllcmFyY2h5IGFyZQorLy8vICAgaW5zdHJ1Y3Rpb24gVUlEcywgMTYtYml0IGludGVnZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkKKy8vLyAgIHRoZSBpbnN0cnVjdGlvbiBhbmQgY29ycmVzcG9uZCBleGFjdGx5IHRvIGl0cyBwb3NpdGlvbiBpbiB0aGUgbGlzdCBvZgorLy8vICAgQ29kZUdlbkluc3RydWN0aW9ucyBmb3IgdGhlIHRhcmdldC4KKy8vLyAtIE9uZSB0YWJsZSAoSU5TVFJVQ1RJT05TX1NZTSkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhbmRzIG9mCisvLy8gICBlYWNoIGluc3RydWN0aW9uIGFuZCBob3cgdG8gZGVjb2RlIHRoZW0uCisvLy8KKy8vLyBEdXJpbmcgdGFibGUgZ2VuZXJhdGlvbiwgdGhlcmUgbWF5IGJlIGNvbmZsaWN0cyBiZXR3ZWVuIGluc3RydWN0aW9ucyB0aGF0CisvLy8gb2NjdXB5IHRoZSBzYW1lIHNwYWNlIGluIHRoZSBkZWNvZGUgdGFibGVzLiAgVGhlc2UgY29uZmxpY3RzIGFyZSByZXNvbHZlZCBhcworLy8vIGZvbGxvd3MgaW4gc2V0VGFibGVGaWVsZHMoKSAoWDg2RGlzYXNzZW1ibGVyVGFibGVzLmNwcCkKKy8vLworLy8vIC0gSWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyB0aGUgbmF0aXZlIGNvbnRleHQgZm9yIG9uZSBvZiB0aGUgaW5zdHJ1Y3Rpb25zCisvLy8gICAodGhhdCBpcywgdGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGZvciBpdCBpbiB0aGUgTExWTSB0YWJsZXMgc3BlY2lmeQorLy8vICAgcHJlY2lzZWx5IHRoZSBjdXJyZW50IGNvbnRleHQpLCB0aGVuIGl0IGhhcyBwcmlvcml0eS4KKy8vLyAtIElmIHRoZSBjdXJyZW50IGNvbnRleHQgaXNuJ3QgbmF0aXZlIGZvciBlaXRoZXIgb2YgdGhlIGluc3RydWN0aW9ucywgdGhlbgorLy8vICAgdGhlIGhpZ2hlci1wcmlvcml0eSBjb250ZXh0IHdpbnMgKHRoYXQgaXMsIHRoZSBvbmUgdGhhdCBpcyBtb3JlIHNwZWNpZmljKS4KKy8vLyAgIFRoYXQgaGllcmFyY2h5IGlzIGRldGVybWluZWQgYnkgb3V0cmFua3MoKSAoWDg2RGlzYXNzZW1ibGVyVGFibGVzLmNwcCkKKy8vLyAtIElmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgbmF0aXZlIGZvciBib3RoIGluc3RydWN0aW9ucywgdGhlbiB0aGUgdGFibGUKKy8vLyAgIGVtaXR0ZXIgcmVwb3J0cyBhIGNvbmZsaWN0IGFuZCBkaWVzLgorLy8vCisvLy8gKioqIFJFU09MVVRJT04gRk9SICJQcmltYXJ5IGRlY29kZSBjb25mbGljdCJTCisvLy8KKy8vLyBJZiB0d28gaW5zdHJ1Y3Rpb25zIGNvbGxpZGUsIHR5cGljYWxseSB0aGUgc29sdXRpb24gaXMgKGluIG9yZGVyIG9mCisvLy8gbGlrZWxpaG9vZCk6CisvLy8KKy8vLyAoMSkgdG8gZmlsdGVyIG91dCBvbmUgb2YgdGhlIGluc3RydWN0aW9ucyBieSBlZGl0aW5nIGZpbHRlcigpCisvLy8gICAgIChYODZSZWNvZ25pemFibGVJbnN0ci5jcHApLiAgVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gcmVzb2x1dGlvbiwgYnV0CisvLy8gICAgIGNoZWNrIHRoZSBJbnRlbCBtYW51YWxzIGZpcnN0IHRvIG1ha2Ugc3VyZSB0aGF0ICgyKSBhbmQgKDMpIGFyZSBub3QgdGhlCisvLy8gICAgIHByb2JsZW0uCisvLy8gKDIpIHRvIGZpeCB0aGUgdGFibGVzIChYODYudGQgYW5kIGl0cyBzdWJzaWRpYXJpZXMpIHNvIHRoZSBvcGNvZGVzIGFyZQorLy8vICAgICBhY2N1cmF0ZS4gIFNvbWV0aW1lcyB0aGV5IGFyZSBub3QuCisvLy8gKDMpIHRvIGZpeCB0aGUgdGFibGVzIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBjb250ZXh0IChmb3IgZXhhbXBsZSwgcmVxdWlyZWQKKy8vLyAgICAgcHJlZml4ZXMpLCBhbmQgcG9zc2libHkgdG8gYWRkIGEgbmV3IGNvbnRleHQgYnkgZWRpdGluZworLy8vICAgICBsaWIvVGFyZ2V0L1g4Ni9YODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmguICBUaGlzIGlzIHVubGlrZWx5IHRvIGJlCisvLy8gICAgIHRoZSBjYXVzZS4KKy8vLworLy8vIERpc2Fzc2VtYmxlckVtaXR0ZXIuY3BwIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGVtaXR0ZXIsCisvLy8gICB3aGljaCBzaW1wbHkgcHVsbHMgb3V0IGluc3RydWN0aW9ucyBmcm9tIHRoZSBDb2RlR2VuVGFyZ2V0IGFuZCBwdXNoZXMgdGhlbQorLy8vICAgaW50byBYODZEaXNhc3NlbWJsZXJUYWJsZXMuCisvLy8gWDg2RGlzYXNzZW1ibGVyVGFibGVzLmggY29udGFpbnMgdGhlIGludGVyZmFjZSBmb3IgdGhlIGluc3RydWN0aW9uIHRhYmxlcywKKy8vLyAgIHdoaWNoIG1hbmFnZSBhbmQgZW1pdCB0aGUgc3RydWN0dXJlcyBkaXNjdXNzZWQgYWJvdmUuCisvLy8gWDg2RGlzYXNzZW1ibGVyVGFibGVzLmNwcCBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBpbnN0cnVjdGlvbgorLy8vICAgdGFibGVzLgorLy8vIFg4Nk1vZFJNRmlsdGVycy5oIGNvbnRhaW5zIGZpbHRlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2gKKy8vLyAgIE1vZFIvTSB2YWx1ZXMgYXJlIHZhbGlkIGZvciBhIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24uICBUaGVzZSBhcmUgdXNlZCB0bworLy8vICAgcG9wdWxhdGUgTW9kUk1EZWNpc2lvbnMuCisvLy8gWDg2UmVjb2duaXphYmxlSW5zdHIuaCBjb250YWlucyB0aGUgaW50ZXJmYWNlIGZvciBhIHNpbmdsZSBpbnN0cnVjdGlvbiwKKy8vLyAgIHdoaWNoIGtub3dzIGhvdyB0byB0cmFuc2xhdGUgaXRzZWxmIGZyb20gYSBDb2RlR2VuSW5zdHJ1Y3Rpb24gYW5kIHByb3ZpZGUKKy8vLyAgIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGludGVncmF0aW9uIGludG8gdGhlIHRhYmxlcy4KKy8vLyBYODZSZWNvZ25pemFibGVJbnN0ci5jcHAgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBhIHNpbmdsZQorLy8vICAgaW5zdHJ1Y3Rpb24uCisKK3ZvaWQgRGlzYXNzZW1ibGVyRW1pdHRlcjo6cnVuKHJhd19vc3RyZWFtICZPUykgeworICBDb2RlR2VuVGFyZ2V0IFRhcmdldDsKKworICBPUyA8PCAiLyo9PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlICIKKyAgICAgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMgLSotPT09KlxuIgorICAgICA8PCAiICpcbiIKKyAgICAgPDwgIiAqICIgPDwgVGFyZ2V0LmdldE5hbWUoKSA8PCAiIERpc2Fzc2VtYmxlclxuIgorICAgICA8PCAiICpcbiIKKyAgICAgPDwgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0IVxuIgorICAgICA8PCAiICpcbiIKKyAgICAgPDwgIiAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICA8PCAiLS0tLS0tLT09PSovXG4iOworCisgIC8vIFg4NiB1c2VzIGEgY3VzdG9tIGRpc2Fzc2VtYmxlci4KKyAgaWYgKFRhcmdldC5nZXROYW1lKCkgPT0gIlg4NiIpIHsKKyAgICBEaXNhc3NlbWJsZXJUYWJsZXMgVGFibGVzOworICAKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPiAmbnVtYmVyZWRJbnN0cnVjdGlvbnMgPQorICAgICAgVGFyZ2V0LmdldEluc3RydWN0aW9uc0J5RW51bVZhbHVlKCk7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IG51bWJlcmVkSW5zdHJ1Y3Rpb25zLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBSZWNvZ25pemFibGVJbnN0cjo6cHJvY2Vzc0luc3RyKFRhYmxlcywgKm51bWJlcmVkSW5zdHJ1Y3Rpb25zW2ldLCBpKTsKKworICAgIC8vIEZJWE1FOiBBcyBsb25nIGFzIHdlIGFyZSB1c2luZyBleGNlcHRpb25zLCBtaWdodCBhcyB3ZWxsIGRyb3AgdGhpcyB0byB0aGUKKyAgICAvLyBhY3R1YWwgY29uZmxpY3Qgc2l0ZS4KKyAgICBpZiAoVGFibGVzLmhhc0NvbmZsaWN0cygpKQorICAgICAgdGhyb3cgVEdFcnJvcihUYXJnZXQuZ2V0VGFyZ2V0UmVjb3JkKCktPmdldExvYygpLAorICAgICAgICAgICAgICAgICAgICAiUHJpbWFyeSBkZWNvZGUgY29uZmxpY3QiKTsKKworICAgIFRhYmxlcy5lbWl0KE9TKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBGaXhlZC1pbnN0cnVjdGlvbi1sZW5ndGggdGFyZ2V0cyB1c2UgYSBjb21tb24gZGlzYXNzZW1ibGVyLgorICBpZiAoVGFyZ2V0LmdldE5hbWUoKSA9PSAiQVJNIikgeworICAgIEFSTURlY29kZXJFbWl0dGVyKFJlY29yZHMpLnJ1bihPUyk7CisgICAgcmV0dXJuOworICB9ICAKKworICB0aHJvdyBUR0Vycm9yKFRhcmdldC5nZXRUYXJnZXRSZWNvcmQoKS0+Z2V0TG9jKCksCisgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZW5lcmF0ZSBkaXNhc3NlbWJsZXIgZm9yIHRoaXMgdGFyZ2V0Iik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9EaXNhc3NlbWJsZXJFbWl0dGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9EaXNhc3NlbWJsZXJFbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyOWQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0Rpc2Fzc2VtYmxlckVtaXR0ZXIuaApAQCAtMCwwICsxLDI4IEBACisvLz09PS0gRGlzYXNzZW1ibGVyRW1pdHRlci5oIC0gRGlzYXNzZW1ibGVyIEdlbmVyYXRvciAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIERJU0FTU0VNQkxFUkVNSVRURVJfSAorI2RlZmluZSBESVNBU1NFTUJMRVJFTUlUVEVSX0gKKworI2luY2x1ZGUgIlRhYmxlR2VuQmFja2VuZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgRGlzYXNzZW1ibGVyRW1pdHRlciA6IHB1YmxpYyBUYWJsZUdlbkJhY2tlbmQgeworICAgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKyAgcHVibGljOgorICAgIERpc2Fzc2VtYmxlckVtaXR0ZXIoUmVjb3JkS2VlcGVyICZSKSA6IFJlY29yZHMoUikge30KKworICAgIC8vLyBydW4gLSBPdXRwdXQgdGhlIGRpc2Fzc2VtYmxlci4KKyAgICB2b2lkIHJ1bihyYXdfb3N0cmVhbSAmbyk7CisgIH07CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vRURFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0VERW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmZjllYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0VERW1pdHRlci5jcHAKQEAgLTAsMCArMSw4OTkgQEAKKy8vPT09LSBFREVtaXR0ZXIuY3BwIC0gR2VuZXJhdGUgaW5zdHJ1Y3Rpb24gZGVzY3JpcHRpb25zIGZvciBFRCAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBhIGRlc2NyaXB0aW9uIG9mIGVhY2gKKy8vIGluc3RydWN0aW9uIGluIGEgZm9ybWF0IHRoYXQgdGhlIGVuaGFuY2VkIGRpc2Fzc2VtYmxlciBjYW4gdXNlIHRvIHRva2VuaXplCisvLyBhbmQgcGFyc2UgaW5zdHJ1Y3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJFREVtaXR0ZXIuaCIKKworI2luY2x1ZGUgIkFzbVdyaXRlckluc3QuaCIKKyNpbmNsdWRlICJDb2RlR2VuVGFyZ2V0LmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisKKyNpbmNsdWRlICJsbHZtL01DL0VESW5zdEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN1cHBvcnQgY2xhc3NlcyBmb3IgZW1pdHRpbmcgbmVzdGVkIEMgZGF0YSBzdHJ1Y3R1cmVzIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgeworICAKKyAgY2xhc3MgRW51bUVtaXR0ZXIgeworICBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEVudHJpZXM7CisgIHB1YmxpYzoKKyAgICBFbnVtRW1pdHRlcihjb25zdCBjaGFyICpOKSA6IE5hbWUoTikgeyAKKyAgICB9CisgICAgaW50IGFkZEVudHJ5KGNvbnN0IGNoYXIgKmUpIHsgCisgICAgICBFbnRyaWVzLnB1c2hfYmFjayhzdGQ6OnN0cmluZyhlKSk7CisgICAgICByZXR1cm4gRW50cmllcy5zaXplKCkgLSAxOyAKKyAgICB9CisgICAgdm9pZCBlbWl0KHJhd19vc3RyZWFtICZvLCB1bnNpZ25lZCBpbnQgJmkpIHsKKyAgICAgIG8uaW5kZW50KGkpIDw8ICJlbnVtICIgPDwgTmFtZS5jX3N0cigpIDw8ICIgeyIgPDwgIlxuIjsKKyAgICAgIGkgKz0gMjsKKyAgICAgIAorICAgICAgdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKyAgICAgIHVuc2lnbmVkIGludCBudW1FbnRyaWVzID0gRW50cmllcy5zaXplKCk7CisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1FbnRyaWVzOyArK2luZGV4KSB7CisgICAgICAgIG8uaW5kZW50KGkpIDw8IEVudHJpZXNbaW5kZXhdOworICAgICAgICBpZiAoaW5kZXggPCAobnVtRW50cmllcyAtIDEpKQorICAgICAgICAgIG8gPDwgIiwiOworICAgICAgICBvIDw8ICJcbiI7CisgICAgICB9CisgICAgICAKKyAgICAgIGkgLT0gMjsKKyAgICAgIG8uaW5kZW50KGkpIDw8ICJ9OyIgPDwgIlxuIjsKKyAgICB9CisgICAgCisgICAgdm9pZCBlbWl0QXNGbGFncyhyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgaW50ICZpKSB7CisgICAgICBvLmluZGVudChpKSA8PCAiZW51bSAiIDw8IE5hbWUuY19zdHIoKSA8PCAiIHsiIDw8ICJcbiI7CisgICAgICBpICs9IDI7CisgICAgICAKKyAgICAgIHVuc2lnbmVkIGludCBpbmRleCA9IDA7CisgICAgICB1bnNpZ25lZCBpbnQgbnVtRW50cmllcyA9IEVudHJpZXMuc2l6ZSgpOworICAgICAgdW5zaWduZWQgaW50IGZsYWcgPSAxOworICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtRW50cmllczsgKytpbmRleCkgeworICAgICAgICBvLmluZGVudChpKSA8PCBFbnRyaWVzW2luZGV4XSA8PCAiID0gIiA8PCBmb3JtYXQoIjB4JXgiLCBmbGFnKTsKKyAgICAgICAgaWYgKGluZGV4IDwgKG51bUVudHJpZXMgLSAxKSkKKyAgICAgICAgICBvIDw8ICIsIjsKKyAgICAgICAgbyA8PCAiXG4iOworICAgICAgICBmbGFnIDw8PSAxOworICAgICAgfQorICAgICAgCisgICAgICBpIC09IDI7CisgICAgICBvLmluZGVudChpKSA8PCAifTsiIDw8ICJcbiI7CisgICAgfQorICB9OworCisgIGNsYXNzIFN0cnVjdEVtaXR0ZXIgeworICBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgY2hhciosIGNvbnN0IGNoYXIqPiBtZW1iZXI7CisgICAgc3RkOjp2ZWN0b3I8IG1lbWJlciA+IE1lbWJlcnM7CisgIHB1YmxpYzoKKyAgICBTdHJ1Y3RFbWl0dGVyKGNvbnN0IGNoYXIgKk4pIDogTmFtZShOKSB7CisgICAgfQorICAgIHZvaWQgYWRkTWVtYmVyKGNvbnN0IGNoYXIgKnQsIGNvbnN0IGNoYXIgKm4pIHsKKyAgICAgIG1lbWJlciBtKHQsIG4pOworICAgICAgTWVtYmVycy5wdXNoX2JhY2sobSk7CisgICAgfQorICAgIHZvaWQgZW1pdChyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgaW50ICZpKSB7CisgICAgICBvLmluZGVudChpKSA8PCAic3RydWN0ICIgPDwgTmFtZS5jX3N0cigpIDw8ICIgeyIgPDwgIlxuIjsKKyAgICAgIGkgKz0gMjsKKyAgICAgIAorICAgICAgdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKyAgICAgIHVuc2lnbmVkIGludCBudW1NZW1iZXJzID0gTWVtYmVycy5zaXplKCk7CisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1NZW1iZXJzOyArK2luZGV4KSB7CisgICAgICAgIG8uaW5kZW50KGkpIDw8IE1lbWJlcnNbaW5kZXhdLmZpcnN0IDw8ICIgIjsKKyAgICAgICAgby5pbmRlbnQoaSkgPDwgTWVtYmVyc1tpbmRleF0uc2Vjb25kIDw8ICI7IiA8PCAiXG4iOworICAgICAgfQorICAgICAgCisgICAgICBpIC09IDI7CisgICAgICBvLmluZGVudChpKSA8PCAifTsiIDw8ICJcbiI7CisgICAgfQorICB9OworICAKKyAgY2xhc3MgQ29uc3RhbnRFbWl0dGVyIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfkNvbnN0YW50RW1pdHRlcigpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBlbWl0KHJhd19vc3RyZWFtICZvLCB1bnNpZ25lZCBpbnQgJmkpID0gMDsKKyAgfTsKKyAgCisgIGNsYXNzIExpdGVyYWxDb25zdGFudEVtaXR0ZXIgOiBwdWJsaWMgQ29uc3RhbnRFbWl0dGVyIHsKKyAgcHJpdmF0ZToKKyAgICBib29sIElzTnVtYmVyOworICAgIHVuaW9uIHsKKyAgICAgIGludCBOdW1iZXI7CisgICAgICBjb25zdCBjaGFyKiBTdHJpbmc7CisgICAgfTsKKyAgcHVibGljOgorICAgIExpdGVyYWxDb25zdGFudEVtaXR0ZXIoY29uc3QgY2hhciAqc3RyaW5nKSA6IAorICAgICAgSXNOdW1iZXIoZmFsc2UpLAorICAgICAgU3RyaW5nKHN0cmluZykgeworICAgIH0KKyAgICBMaXRlcmFsQ29uc3RhbnRFbWl0dGVyKGludCBudW1iZXIgPSAwKSA6IAorICAgICAgSXNOdW1iZXIodHJ1ZSksCisgICAgICBOdW1iZXIobnVtYmVyKSB7CisgICAgfQorICAgIHZvaWQgc2V0KGNvbnN0IGNoYXIgKnN0cmluZykgeworICAgICAgSXNOdW1iZXIgPSBmYWxzZTsKKyAgICAgIE51bWJlciA9IDA7CisgICAgICBTdHJpbmcgPSBzdHJpbmc7CisgICAgfQorICAgIHZvaWQgc2V0KGludCBudW1iZXIpIHsKKyAgICAgIElzTnVtYmVyID0gdHJ1ZTsKKyAgICAgIFN0cmluZyA9IE5VTEw7CisgICAgICBOdW1iZXIgPSBudW1iZXI7CisgICAgfQorICAgIGJvb2wgaXMoY29uc3QgY2hhciAqc3RyaW5nKSB7CisgICAgICByZXR1cm4gIXN0cmNtcChTdHJpbmcsIHN0cmluZyk7CisgICAgfQorICAgIHZvaWQgZW1pdChyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgaW50ICZpKSB7CisgICAgICBpZiAoSXNOdW1iZXIpCisgICAgICAgIG8gPDwgTnVtYmVyOworICAgICAgZWxzZQorICAgICAgICBvIDw8IFN0cmluZzsKKyAgICB9CisgIH07CisgIAorICBjbGFzcyBDb21wb3VuZENvbnN0YW50RW1pdHRlciA6IHB1YmxpYyBDb25zdGFudEVtaXR0ZXIgeworICBwcml2YXRlOgorICAgIHVuc2lnbmVkIGludCBQYWRkaW5nOworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50RW1pdHRlciAqPiBFbnRyaWVzOworICBwdWJsaWM6CisgICAgQ29tcG91bmRDb25zdGFudEVtaXR0ZXIodW5zaWduZWQgaW50IHBhZGRpbmcgPSAwKSA6IFBhZGRpbmcocGFkZGluZykgeworICAgIH0KKyAgICBDb21wb3VuZENvbnN0YW50RW1pdHRlciAmYWRkRW50cnkoQ29uc3RhbnRFbWl0dGVyICplKSB7CisgICAgICBFbnRyaWVzLnB1c2hfYmFjayhlKTsKKyAgICAgIAorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICB+Q29tcG91bmRDb25zdGFudEVtaXR0ZXIoKSB7CisgICAgICB3aGlsZSAoRW50cmllcy5zaXplKCkpIHsKKyAgICAgICAgQ29uc3RhbnRFbWl0dGVyICplbnRyeSA9IEVudHJpZXMuYmFjaygpOworICAgICAgICBFbnRyaWVzLnBvcF9iYWNrKCk7CisgICAgICAgIGRlbGV0ZSBlbnRyeTsKKyAgICAgIH0KKyAgICB9CisgICAgdm9pZCBlbWl0KHJhd19vc3RyZWFtICZvLCB1bnNpZ25lZCBpbnQgJmkpIHsKKyAgICAgIG8gPDwgInsiIDw8ICJcbiI7CisgICAgICBpICs9IDI7CisgIAorICAgICAgdW5zaWduZWQgaW50IGluZGV4OworICAgICAgdW5zaWduZWQgaW50IG51bUVudHJpZXMgPSBFbnRyaWVzLnNpemUoKTsKKyAgICAgIAorICAgICAgdW5zaWduZWQgaW50IG51bVRvUHJpbnQ7CisgICAgICAKKyAgICAgIGlmIChQYWRkaW5nKSB7CisgICAgICAgIGlmIChudW1FbnRyaWVzID4gUGFkZGluZykgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXUgZW50cmllcyBidXQgJXUgcGFkZGluZ1xuIiwgbnVtRW50cmllcywgUGFkZGluZyk7CisgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiTW9yZSBlbnRyaWVzIHRoYW4gcGFkZGluZyIpOworICAgICAgICB9CisgICAgICAgIG51bVRvUHJpbnQgPSBQYWRkaW5nOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtVG9QcmludCA9IG51bUVudHJpZXM7CisgICAgICB9CisgICAgICAgICAgCisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1Ub1ByaW50OyArK2luZGV4KSB7CisgICAgICAgIG8uaW5kZW50KGkpOworICAgICAgICBpZiAoaW5kZXggPCBudW1FbnRyaWVzKQorICAgICAgICAgIEVudHJpZXNbaW5kZXhdLT5lbWl0KG8sIGkpOworICAgICAgICBlbHNlCisgICAgICAgICAgbyA8PCAiLTEiOworICAgICAgICAKKyAgICAgICAgaWYgKGluZGV4IDwgKG51bVRvUHJpbnQgLSAxKSkKKyAgICAgICAgICBvIDw8ICIsIjsKKyAgICAgICAgbyA8PCAiXG4iOworICAgICAgfQorICAgICAgCisgICAgICBpIC09IDI7CisgICAgICBvLmluZGVudChpKSA8PCAifSI7CisgICAgfQorICB9OworICAKKyAgY2xhc3MgRmxhZ3NDb25zdGFudEVtaXR0ZXIgOiBwdWJsaWMgQ29uc3RhbnRFbWl0dGVyIHsKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRmxhZ3M7CisgIHB1YmxpYzoKKyAgICBGbGFnc0NvbnN0YW50RW1pdHRlcigpIHsKKyAgICB9CisgICAgRmxhZ3NDb25zdGFudEVtaXR0ZXIgJmFkZEVudHJ5KGNvbnN0IGNoYXIgKmYpIHsKKyAgICAgIEZsYWdzLnB1c2hfYmFjayhzdGQ6OnN0cmluZyhmKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHZvaWQgZW1pdChyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgaW50ICZpKSB7CisgICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgICAgICB1bnNpZ25lZCBpbnQgbnVtRmxhZ3MgPSBGbGFncy5zaXplKCk7CisgICAgICBpZiAobnVtRmxhZ3MgPT0gMCkKKyAgICAgICAgbyA8PCAiMCI7CisgICAgICAKKyAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bUZsYWdzOyArK2luZGV4KSB7CisgICAgICAgIG8gPDwgRmxhZ3NbaW5kZXhdLmNfc3RyKCk7CisgICAgICAgIGlmIChpbmRleCA8IChudW1GbGFncyAtIDEpKQorICAgICAgICAgIG8gPDwgIiB8ICI7CisgICAgICB9CisgICAgfQorICB9OworfQorCitFREVtaXR0ZXI6OkVERW1pdHRlcihSZWNvcmRLZWVwZXIgJlIpIDogUmVjb3JkcyhSKSB7Cit9CisKKy8vLyBwb3B1bGF0ZU9wZXJhbmRPcmRlciAtIEFjY2VwdHMgYSBDb2RlR2VuSW5zdHJ1Y3Rpb24gYW5kIGdlbmVyYXRlcyBpdHMKKy8vLyAgIEFzbVdyaXRlckluc3QgZm9yIHRoZSBkZXNpcmVkIGFzc2VtYmx5IHN5bnRheCwgZ2l2aW5nIGFuIG9yZGVyZWQgbGlzdCBvZgorLy8vICAgb3BlcmFuZHMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBwcmludGVkIGluc3RydWN0aW9uLiAgVGhlbiwgZm9yCisvLy8gICBlYWNoIGVudHJ5IGluIHRoYXQgbGlzdCwgZGV0ZXJtaW5lcyB0aGUgaW5kZXggb2YgdGhlIHNhbWUgb3BlcmFuZCBpbiB0aGUKKy8vLyAgIENvZGVHZW5JbnN0cnVjdGlvbiwgYW5kIGVtaXRzIHRoZSByZXN1bHRpbmcgbWFwcGluZyBpbnRvIGFuIGFycmF5LCBmaWxsaW5nCisvLy8gICBpbiB1bnVzZWQgc2xvdHMgd2l0aCAtMS4KKy8vLworLy8vIEBhcmcgb3BlcmFuZE9yZGVyIC0gVGhlIGFycmF5IHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgb3BlcmFuZAorLy8vICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy4gIEVhY2ggZW50cnkgd2lsbCBjb250YWluIC0xIChpbnZhbGlkIGluZGV4CisvLy8gICAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBvcGVyYW5kcyBwcmVzZW50IGluIHRoZSBBc21TdHJpbmcpIG9yIGEgbnVtYmVyCisvLy8gICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRpbmcgYW4gaW5kZXggaW4gdGhlIG9wZXJhbmQgZGVzY3JpcHRvciBhcnJheS4KKy8vLyBAYXJnIGluc3QgICAgICAgICAtIFRoZSBpbnN0cnVjdGlvbiB0byB1c2Ugd2hlbiBsb29raW5nIHVwIHRoZSBvcGVyYW5kcworLy8vIEBhcmcgc3ludGF4ICAgICAgIC0gVGhlIHN5bnRheCB0byB1c2UsIGFjY29yZGluZyB0byBMTFZNJ3MgZW51bWVyYXRpb24KK3ZvaWQgcG9wdWxhdGVPcGVyYW5kT3JkZXIoQ29tcG91bmRDb25zdGFudEVtaXR0ZXIgKm9wZXJhbmRPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uICZpbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzeW50YXgpIHsKKyAgdW5zaWduZWQgaW50IG51bUFyZ3MgPSAwOworICAKKyAgQXNtV3JpdGVySW5zdCBhd0luc3QoaW5zdCwgc3ludGF4LCAtMSwgLTEpOworICAKKyAgc3RkOjp2ZWN0b3I8QXNtV3JpdGVyT3BlcmFuZD46Oml0ZXJhdG9yIG9wZXJhbmRJdGVyYXRvcjsKKyAgCisgIGZvciAob3BlcmFuZEl0ZXJhdG9yID0gYXdJbnN0Lk9wZXJhbmRzLmJlZ2luKCk7CisgICAgICAgb3BlcmFuZEl0ZXJhdG9yICE9IGF3SW5zdC5PcGVyYW5kcy5lbmQoKTsKKyAgICAgICArK29wZXJhbmRJdGVyYXRvcikgeworICAgIGlmIChvcGVyYW5kSXRlcmF0b3ItPk9wZXJhbmRUeXBlID09IAorICAgICAgICBBc21Xcml0ZXJPcGVyYW5kOjppc01hY2hpbmVJbnN0ck9wZXJhbmQpIHsKKyAgICAgIG9wZXJhbmRPcmRlci0+YWRkRW50cnkoCisgICAgICAgIG5ldyBMaXRlcmFsQ29uc3RhbnRFbWl0dGVyKG9wZXJhbmRJdGVyYXRvci0+Q0dJT3BObykpOworICAgICAgbnVtQXJncysrOworICAgIH0KKyAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3VwcG9ydCBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIFg4NiBpbnN0cnVjdGlvbnMgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgU0VUKGZsYWcpIHsgdHlwZS0+c2V0KGZsYWcpOyByZXR1cm4gMDsgfQorCisjZGVmaW5lIFJFRyhzdHIpIGlmIChuYW1lID09IHN0cikgU0VUKCJrT3BlcmFuZFR5cGVSZWdpc3RlciIpOworI2RlZmluZSBNRU0oc3RyKSBpZiAobmFtZSA9PSBzdHIpIFNFVCgia09wZXJhbmRUeXBlWDg2TWVtb3J5Iik7CisjZGVmaW5lIExFQShzdHIpIGlmIChuYW1lID09IHN0cikgU0VUKCJrT3BlcmFuZFR5cGVYODZFZmZlY3RpdmVBZGRyZXNzIik7CisjZGVmaW5lIElNTShzdHIpIGlmIChuYW1lID09IHN0cikgU0VUKCJrT3BlcmFuZFR5cGVJbW1lZGlhdGUiKTsKKyNkZWZpbmUgUENSKHN0cikgaWYgKG5hbWUgPT0gc3RyKSBTRVQoImtPcGVyYW5kVHlwZVg4NlBDUmVsYXRpdmUiKTsKKworLy8vIFg4NlR5cGVGcm9tT3BOYW1lIC0gUHJvY2Vzc2VzIHRoZSBuYW1lIG9mIGEgc2luZ2xlIFg4NiBvcGVyYW5kICh3aGljaCBpcworLy8vICAgYWN0dWFsbHkgaXRzIHR5cGUpIGFuZCB0cmFuc2xhdGVzIGl0IGludG8gYW4gb3BlcmFuZCB0eXBlCisvLy8KKy8vLyBAYXJnIGZsYWdzICAgIC0gVGhlIHR5cGUgb2JqZWN0IHRvIHNldAorLy8vIEBhcmcgbmFtZSAgICAgLSBUaGUgbmFtZSBvZiB0aGUgb3BlcmFuZAorc3RhdGljIGludCBYODZUeXBlRnJvbU9wTmFtZShMaXRlcmFsQ29uc3RhbnRFbWl0dGVyICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICBSRUcoIkdSOCIpOworICBSRUcoIkdSOF9OT1JFWCIpOworICBSRUcoIkdSMTYiKTsKKyAgUkVHKCJHUjMyIik7CisgIFJFRygiR1IzMl9OT1JFWCIpOworICBSRUcoIkdSMzJfVEMiKTsKKyAgUkVHKCJGUjMyIik7CisgIFJFRygiUkZQMzIiKTsKKyAgUkVHKCJHUjY0Iik7CisgIFJFRygiR1I2NF9UQyIpOworICBSRUcoIkZSNjQiKTsKKyAgUkVHKCJWUjY0Iik7CisgIFJFRygiUkZQNjQiKTsKKyAgUkVHKCJSRlA4MCIpOworICBSRUcoIlZSMTI4Iik7CisgIFJFRygiVlIyNTYiKTsKKyAgUkVHKCJSU1QiKTsKKyAgUkVHKCJTRUdNRU5UX1JFRyIpOworICBSRUcoIkRFQlVHX1JFRyIpOworICBSRUcoIkNPTlRST0xfUkVHIik7CisgIAorICBJTU0oImk4aW1tIik7CisgIElNTSgiaTE2aW1tIik7CisgIElNTSgiaTE2aThpbW0iKTsKKyAgSU1NKCJpMzJpbW0iKTsKKyAgSU1NKCJpMzJpOGltbSIpOworICBJTU0oImk2NGltbSIpOworICBJTU0oImk2NGk4aW1tIik7CisgIElNTSgiaTY0aTMyaW1tIik7CisgIElNTSgiU1NFQ0MiKTsKKyAgCisgIC8vIGFsbCBSLCBJLCBSLCBJLCBSCisgIE1FTSgiaThtZW0iKTsKKyAgTUVNKCJpOG1lbV9OT1JFWCIpOworICBNRU0oImkxNm1lbSIpOworICBNRU0oImkzMm1lbSIpOworICBNRU0oImkzMm1lbV9UQyIpOworICBNRU0oImYzMm1lbSIpOworICBNRU0oInNzbWVtIik7CisgIE1FTSgib3BhcXVlMzJtZW0iKTsKKyAgTUVNKCJvcGFxdWU0OG1lbSIpOworICBNRU0oImk2NG1lbSIpOworICBNRU0oImk2NG1lbV9UQyIpOworICBNRU0oImY2NG1lbSIpOworICBNRU0oInNkbWVtIik7CisgIE1FTSgiZjgwbWVtIik7CisgIE1FTSgib3BhcXVlODBtZW0iKTsKKyAgTUVNKCJpMTI4bWVtIik7CisgIE1FTSgiaTI1Nm1lbSIpOworICBNRU0oImYxMjhtZW0iKTsKKyAgTUVNKCJmMjU2bWVtIik7CisgIE1FTSgib3BhcXVlNTEybWVtIik7CisgIAorICAvLyBhbGwgUiwgSSwgUiwgSQorICBMRUEoImxlYTMybWVtIik7CisgIExFQSgibGVhNjRfMzJtZW0iKTsKKyAgTEVBKCJsZWE2NG1lbSIpOworICAKKyAgLy8gYWxsIEkKKyAgUENSKCJpMTZpbW1fcGNyZWwiKTsKKyAgUENSKCJpMzJpbW1fcGNyZWwiKTsKKyAgUENSKCJpNjRpMzJpbW1fcGNyZWwiKTsKKyAgUENSKCJicnRhcmdldDgiKTsKKyAgUENSKCJvZmZzZXQ4Iik7CisgIFBDUigib2Zmc2V0MTYiKTsKKyAgUENSKCJvZmZzZXQzMiIpOworICBQQ1IoIm9mZnNldDY0Iik7CisgIFBDUigiYnJ0YXJnZXQiKTsKKyAgCisgIHJldHVybiAxOworfQorCisjdW5kZWYgUkVHCisjdW5kZWYgTUVNCisjdW5kZWYgTEVBCisjdW5kZWYgSU1NCisjdW5kZWYgUENSCisKKyN1bmRlZiBTRVQKKworLy8vIFg4NlBvcHVsYXRlT3BlcmFuZHMgLSBIYW5kbGVzIGFsbCB0aGUgb3BlcmFuZHMgaW4gYW4gWDg2IGluc3RydWN0aW9uLCBhZGRpbmcKKy8vLyAgIHRoZSBhcHByb3ByaWF0ZSBmbGFncyB0byB0aGVpciBkZXNjcmlwdG9ycworLy8vCisvLy8gQG9wZXJhbmRGbGFncyAtIEEgcmVmZXJlbmNlIHRoZSBhcnJheSBvZiBvcGVyYW5kIGZsYWcgb2JqZWN0cworLy8vIEBpbnN0ICAgICAgICAgLSBUaGUgaW5zdHJ1Y3Rpb24gdG8gdXNlIGFzIGEgc291cmNlIG9mIGluZm9ybWF0aW9uCitzdGF0aWMgdm9pZCBYODZQb3B1bGF0ZU9wZXJhbmRzKAorICBMaXRlcmFsQ29uc3RhbnRFbWl0dGVyICooJm9wZXJhbmRUeXBlcylbRURJU19NQVhfT1BFUkFORFNdLAorICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24gJmluc3QpIHsKKyAgaWYgKCFpbnN0LlRoZURlZi0+aXNTdWJDbGFzc09mKCJYODZJbnN0IikpCisgICAgcmV0dXJuOworICAKKyAgdW5zaWduZWQgaW50IGluZGV4OworICB1bnNpZ25lZCBpbnQgbnVtT3BlcmFuZHMgPSBpbnN0Lk9wZXJhbmRMaXN0LnNpemUoKTsKKyAgCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bU9wZXJhbmRzOyArK2luZGV4KSB7CisgICAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uOjpPcGVyYW5kSW5mbyAmb3BlcmFuZEluZm8gPSAKKyAgICAgIGluc3QuT3BlcmFuZExpc3RbaW5kZXhdOworICAgIFJlY29yZCAmcmVjID0gKm9wZXJhbmRJbmZvLlJlYzsKKyAgICAKKyAgICBpZiAoWDg2VHlwZUZyb21PcE5hbWUob3BlcmFuZFR5cGVzW2luZGV4XSwgcmVjLmdldE5hbWUoKSkpIHsKKyAgICAgIGVycnMoKSA8PCAiT3BlcmFuZCB0eXBlOiAiIDw8IHJlYy5nZXROYW1lKCkuY19zdHIoKSA8PCAiXG4iOworICAgICAgZXJycygpIDw8ICJPcGVyYW5kIG5hbWU6ICIgPDwgb3BlcmFuZEluZm8uTmFtZS5jX3N0cigpIDw8ICJcbiI7CisgICAgICBlcnJzKCkgPDwgIkluc3RydWN0aW9uIG1hbWU6ICIgPDwgaW5zdC5UaGVEZWYtPmdldE5hbWUoKS5jX3N0cigpIDw8ICJcbiI7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgdHlwZSIpOworICAgIH0KKyAgfQorfQorCisvLy8gZGVjb3JhdGUxIC0gRGVjb3JhdGVzIGEgbmFtZWQgb3BlcmFuZCB3aXRoIGEgbmV3IGZsYWcKKy8vLworLy8vIEBvcGVyYW5kRmxhZ3MgLSBUaGUgYXJyYXkgb2Ygb3BlcmFuZCBmbGFnIG9iamVjdHMsIHdoaWNoIGRvbid0IGhhdmUgbmFtZXMKKy8vLyBAaW5zdCAgICAgICAgIC0gVGhlIENvZGVHZW5JbnN0cnVjdGlvbiwgd2hpY2ggcHJvdmlkZXMgYSB3YXkgdG8gdHJhbnNsYXRlCisvLy8gICAgICAgICAgICAgICAgIGJldHdlZW4gbmFtZXMgYW5kIG9wZXJhbmQgaW5kaWNlcworLy8vIEBvcE5hbWUgICAgICAgLSBUaGUgbmFtZSBvZiB0aGUgb3BlcmFuZAorLy8vIEBmbGFnICAgICAgICAgLSBUaGUgbmFtZSBvZiB0aGUgZmxhZyB0byBhZGQKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNvcmF0ZTEoCisgIEZsYWdzQ29uc3RhbnRFbWl0dGVyICooJm9wZXJhbmRGbGFncylbRURJU19NQVhfT1BFUkFORFNdLAorICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24gJmluc3QsCisgIGNvbnN0IGNoYXIgKm9wTmFtZSwKKyAgY29uc3QgY2hhciAqb3BGbGFnKSB7CisgIHVuc2lnbmVkIG9wSW5kZXg7CisgIAorICBvcEluZGV4ID0gaW5zdC5nZXRPcGVyYW5kTmFtZWQoc3RkOjpzdHJpbmcob3BOYW1lKSk7CisgIAorICBvcGVyYW5kRmxhZ3Nbb3BJbmRleF0tPmFkZEVudHJ5KG9wRmxhZyk7Cit9CisKKyNkZWZpbmUgREVDT1JBVEUxKG9wTmFtZSwgb3BGbGFnKSBkZWNvcmF0ZTEob3BlcmFuZEZsYWdzLCBpbnN0LCBvcE5hbWUsIG9wRmxhZykKKworI2RlZmluZSBNT1Yoc291cmNlLCB0YXJnZXQpIHsgICAgICAgICAgICAgICBcCisgIGluc3RUeXBlLnNldCgia0luc3RydWN0aW9uVHlwZU1vdmUiKTsgICAgIFwKKyAgREVDT1JBVEUxKHNvdXJjZSwgImtPcGVyYW5kRmxhZ1NvdXJjZSIpOyAgXAorICBERUNPUkFURTEodGFyZ2V0LCAia09wZXJhbmRGbGFnVGFyZ2V0Iik7ICBcCit9CisKKyNkZWZpbmUgQlJBTkNIKHRhcmdldCkgeyAgICAgICAgICAgICAgICAgICAgXAorICBpbnN0VHlwZS5zZXQoImtJbnN0cnVjdGlvblR5cGVCcmFuY2giKTsgICBcCisgIERFQ09SQVRFMSh0YXJnZXQsICJrT3BlcmFuZEZsYWdUYXJnZXQiKTsgIFwKK30KKworI2RlZmluZSBQVVNIKHNvdXJjZSkgeyAgICAgICAgICAgICAgICAgICAgICBcCisgIGluc3RUeXBlLnNldCgia0luc3RydWN0aW9uVHlwZVB1c2giKTsgICAgIFwKKyAgREVDT1JBVEUxKHNvdXJjZSwgImtPcGVyYW5kRmxhZ1NvdXJjZSIpOyAgXAorfQorCisjZGVmaW5lIFBPUCh0YXJnZXQpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5zdFR5cGUuc2V0KCJrSW5zdHJ1Y3Rpb25UeXBlUG9wIik7ICAgICAgXAorICBERUNPUkFURTEodGFyZ2V0LCAia09wZXJhbmRGbGFnVGFyZ2V0Iik7ICBcCit9CisKKyNkZWZpbmUgQ0FMTCh0YXJnZXQpIHsgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnN0VHlwZS5zZXQoImtJbnN0cnVjdGlvblR5cGVDYWxsIik7ICAgICBcCisgIERFQ09SQVRFMSh0YXJnZXQsICJrT3BlcmFuZEZsYWdUYXJnZXQiKTsgIFwKK30KKworI2RlZmluZSBSRVRVUk4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluc3RUeXBlLnNldCgia0luc3RydWN0aW9uVHlwZVJldHVybiIpOyAgIFwKK30KKworLy8vIFg4NkV4dHJhY3RTZW1hbnRpY3MgLSBQZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyBvbiB0aGUgbmFtZSBvZiBhbiBYODYKKy8vLyAgIGluc3RydWN0aW9uIHRvIGRldGVybWluZSB3aGF0IHNvcnQgb2YgYW4gaW5zdHJ1Y3Rpb24gaXQgaXMgYW5kIHRoZW4gYWRkcyAKKy8vLyAgIHRoZSBhcHByb3ByaWF0ZSBmbGFncyB0byB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGl0cyBvcGVyYW5kcworLy8vCisvLy8gQGFyZyBpbnN0VHlwZSAgICAgLSBBIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBmb3IgdGhlIGluc3RydWN0aW9uIGFzIGEgd2hvbGUKKy8vLyBAYXJnIG9wZXJhbmRGbGFncyAtIEEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBvZiBvcGVyYW5kIGZsYWcgb2JqZWN0IHBvaW50ZXJzCisvLy8gQGFyZyBpbnN0ICAgICAgICAgLSBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24KK3N0YXRpYyB2b2lkIFg4NkV4dHJhY3RTZW1hbnRpY3MoCisgIExpdGVyYWxDb25zdGFudEVtaXR0ZXIgJmluc3RUeXBlLAorICBGbGFnc0NvbnN0YW50RW1pdHRlciAqKCZvcGVyYW5kRmxhZ3MpW0VESVNfTUFYX09QRVJBTkRTXSwKKyAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uICZpbnN0KSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lID0gaW5zdC5UaGVEZWYtPmdldE5hbWUoKTsKKyAgICAKKyAgaWYgKG5hbWUuZmluZCgiTU9WIikgIT0gbmFtZS5ucG9zKSB7CisgICAgaWYgKG5hbWUuZmluZCgiTU9WX1YiKSAhPSBuYW1lLm5wb3MpIHsKKyAgICAgIC8vIGlnbm9yZSAodGhpcyBpcyBhIHBzZXVkb2luc3RydWN0aW9uKQorICAgIH0gZWxzZSBpZiAobmFtZS5maW5kKCJNQVNLIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICAvLyBpZ25vcmUgKHRoaXMgaXMgYSBtYXNraW5nIG1vdmUpCisgICAgfSBlbHNlIGlmIChuYW1lLmZpbmQoInIwIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICAvLyBpZ25vcmUgKHRoaXMgaXMgYSBwc2V1ZG9pbnN0cnVjdGlvbikKKyAgICB9IGVsc2UgaWYgKG5hbWUuZmluZCgiUFMiKSAhPSBuYW1lLm5wb3MgfHwKKyAgICAgICAgICAgICBuYW1lLmZpbmQoIlBEIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICAvLyBpZ25vcmUgKHRoaXMgaXMgYSBzaHVmZmxpbmcgbW92ZSkKKyAgICB9IGVsc2UgaWYgKG5hbWUuZmluZCgiTU9WUyIpICE9IG5hbWUubnBvcykgeworICAgICAgLy8gaWdub3JlICh0aGlzIGlzIGEgc3RyaW5nIG1vdmUpCisgICAgfSBlbHNlIGlmIChuYW1lLmZpbmQoIl9GIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICAvLyBUT0RPIGhhbmRsZSBfRiBtb3ZlcyB0byBTVCgwKQorICAgIH0gZWxzZSBpZiAobmFtZS5maW5kKCJhIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICAvLyBUT0RPIGhhbmRsZSBtb3ZlcyB0by9mcm9tICVheAorICAgIH0gZWxzZSBpZiAobmFtZS5maW5kKCJDTU9WIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICBNT1YoInNyYzIiLCAiZHN0Iik7CisgICAgfSBlbHNlIGlmIChuYW1lLmZpbmQoIlBDIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICBNT1YoImxhYmVsIiwgInJlZyIpCisgICAgfSBlbHNlIHsKKyAgICAgIE1PVigic3JjIiwgImRzdCIpOworICAgIH0KKyAgfQorICAKKyAgaWYgKG5hbWUuZmluZCgiSk1QIikgIT0gbmFtZS5ucG9zIHx8CisgICAgICBuYW1lLmZpbmQoIkoiKSA9PSAwKSB7CisgICAgaWYgKG5hbWUuZmluZCgiRkFSIikgIT0gbmFtZS5ucG9zICYmIG5hbWUuZmluZCgiaSIpICE9IG5hbWUubnBvcykgeworICAgICAgQlJBTkNIKCJvZmYiKTsKKyAgICB9IGVsc2UgeworICAgICAgQlJBTkNIKCJkc3QiKTsKKyAgICB9CisgIH0KKyAgCisgIGlmIChuYW1lLmZpbmQoIlBVU0giKSAhPSBuYW1lLm5wb3MpIHsKKyAgICBpZiAobmFtZS5maW5kKCJGUyIpICE9IG5hbWUubnBvcyB8fAorICAgICAgICBuYW1lLmZpbmQoIkdTIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICBpbnN0VHlwZS5zZXQoImtJbnN0cnVjdGlvblR5cGVQdXNoIik7CisgICAgICAvLyBUT0RPIGFkZCBzdXBwb3J0IGZvciBmaXhlZCBvcGVyYW5kcworICAgIH0gZWxzZSBpZiAobmFtZS5maW5kKCJGIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICAvLyBpZ25vcmUgKHRoaXMgcHVzaGVzIG9udG8gdGhlIEZQIHN0YWNrKQorICAgIH0gZWxzZSBpZiAobmFtZS5maW5kKCJBIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICAvLyBpZ25vcmUgKHB1c2hlcyBhbGwgR1AgcmVnaXN0b2VycyBvbnRvIHRoZSBzdGFjaykKKyAgICB9IGVsc2UgaWYgKG5hbWVbbmFtZS5sZW5ndGgoKSAtIDFdID09ICdtJykgeworICAgICAgUFVTSCgic3JjIik7CisgICAgfSBlbHNlIGlmIChuYW1lLmZpbmQoImkiKSAhPSBuYW1lLm5wb3MpIHsKKyAgICAgIFBVU0goImltbSIpOworICAgIH0gZWxzZSB7CisgICAgICBQVVNIKCJyZWciKTsKKyAgICB9CisgIH0KKyAgCisgIGlmIChuYW1lLmZpbmQoIlBPUCIpICE9IG5hbWUubnBvcykgeworICAgIGlmIChuYW1lLmZpbmQoIlBPUENOVCIpICE9IG5hbWUubnBvcykgeworICAgICAgLy8gaWdub3JlIChub3QgYSByZWFsIHBvcCkKKyAgICB9IGVsc2UgaWYgKG5hbWUuZmluZCgiRlMiKSAhPSBuYW1lLm5wb3MgfHwKKyAgICAgICAgICAgICBuYW1lLmZpbmQoIkdTIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICBpbnN0VHlwZS5zZXQoImtJbnN0cnVjdGlvblR5cGVQb3AiKTsKKyAgICAgIC8vIFRPRE8gYWRkIHN1cHBvcnQgZm9yIGZpeGVkIG9wZXJhbmRzCisgICAgfSBlbHNlIGlmIChuYW1lLmZpbmQoIkYiKSAhPSBuYW1lLm5wb3MpIHsKKyAgICAgIC8vIGlnbm9yZSAodGhpcyBwb3BzIGZyb20gdGhlIEZQIHN0YWNrKQorICAgIH0gZWxzZSBpZiAobmFtZS5maW5kKCJBIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICAvLyBpZ25vcmUgKHB1c2hlcyBhbGwgR1AgcmVnaXN0b2VycyBvbnRvIHRoZSBzdGFjaykKKyAgICB9IGVsc2UgaWYgKG5hbWVbbmFtZS5sZW5ndGgoKSAtIDFdID09ICdtJykgeworICAgICAgUE9QKCJkc3QiKTsKKyAgICB9IGVsc2UgeworICAgICAgUE9QKCJyZWciKTsKKyAgICB9CisgIH0KKyAgCisgIGlmIChuYW1lLmZpbmQoIkNBTEwiKSAhPSBuYW1lLm5wb3MpIHsKKyAgICBpZiAobmFtZS5maW5kKCJBREoiKSAhPSBuYW1lLm5wb3MpIHsKKyAgICAgIC8vIGlnbm9yZSAobm90IGEgY2FsbCkKKyAgICB9IGVsc2UgaWYgKG5hbWUuZmluZCgiU1lTQ0FMTCIpICE9IG5hbWUubnBvcykgeworICAgICAgLy8gaWdub3JlIChkb2Vzbid0IGdvIGFueXdoZXJlIHdlIGtub3cgYWJvdXQpCisgICAgfSBlbHNlIGlmIChuYW1lLmZpbmQoIlZNQ0FMTCIpICE9IG5hbWUubnBvcykgeworICAgICAgLy8gaWdub3JlIChyYXRoZXIgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIGEgcmVndWxhciBjYWxsKQorICAgIH0gZWxzZSBpZiAobmFtZS5maW5kKCJGQVIiKSAhPSBuYW1lLm5wb3MgJiYgbmFtZS5maW5kKCJpIikgIT0gbmFtZS5ucG9zKSB7CisgICAgICBDQUxMKCJvZmYiKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0FMTCgiZHN0Iik7CisgICAgfQorICB9CisgIAorICBpZiAobmFtZS5maW5kKCJSRVQiKSAhPSBuYW1lLm5wb3MpIHsKKyAgICBSRVRVUk4oKTsKKyAgfQorfQorCisjdW5kZWYgTU9WCisjdW5kZWYgQlJBTkNICisjdW5kZWYgUFVTSAorI3VuZGVmIFBPUAorI3VuZGVmIENBTEwKKyN1bmRlZiBSRVRVUk4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBBUk0gaW5zdHJ1Y3Rpb25zIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFNFVChmbGFnKSB7IHR5cGUtPnNldChmbGFnKTsgcmV0dXJuIDA7IH0KKworI2RlZmluZSBSRUcoc3RyKSAgICBpZiAobmFtZSA9PSBzdHIpIFNFVCgia09wZXJhbmRUeXBlUmVnaXN0ZXIiKTsKKyNkZWZpbmUgSU1NKHN0cikgICAgaWYgKG5hbWUgPT0gc3RyKSBTRVQoImtPcGVyYW5kVHlwZUltbWVkaWF0ZSIpOworCisjZGVmaW5lIE1JU0Moc3RyLCB0eXBlKSAgIGlmIChuYW1lID09IHN0cikgU0VUKHR5cGUpOworCisvLy8gQVJNRmxhZ0Zyb21PcE5hbWUgLSBQcm9jZXNzZXMgdGhlIG5hbWUgb2YgYSBzaW5nbGUgQVJNIG9wZXJhbmQgKHdoaWNoIGlzCisvLy8gICBhY3R1YWxseSBpdHMgdHlwZSkgYW5kIHRyYW5zbGF0ZXMgaXQgaW50byBhbiBvcGVyYW5kIHR5cGUKKy8vLworLy8vIEBhcmcgdHlwZSAgICAgLSBUaGUgdHlwZSBvYmplY3QgdG8gc2V0CisvLy8gQGFyZyBuYW1lICAgICAtIFRoZSBuYW1lIG9mIHRoZSBvcGVyYW5kCitzdGF0aWMgaW50IEFSTUZsYWdGcm9tT3BOYW1lKExpdGVyYWxDb25zdGFudEVtaXR0ZXIgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CisgIFJFRygiR1BSIik7CisgIFJFRygickdQUiIpOworICBSRUcoInRjR1BSIik7CisgIFJFRygiY2Nfb3V0Iik7CisgIFJFRygic19jY19vdXQiKTsKKyAgUkVHKCJ0R1BSIik7CisgIFJFRygiRFBSIik7CisgIFJFRygiRFBSX1ZGUDIiKTsKKyAgUkVHKCJEUFJfOCIpOworICBSRUcoIlNQUiIpOworICBSRUcoIlFQUiIpOworICBSRUcoIlFRUFIiKTsKKyAgUkVHKCJRUVFRUFIiKTsKKyAgCisgIElNTSgiaTMyaW1tIik7CisgIElNTSgiYmZfaW52X21hc2tfaW1tIik7CisgIElNTSgianRibG9ja19vcGVyYW5kIik7CisgIElNTSgibm9oYXNoX2ltbSIpOworICBJTU0oImNwaW5zdF9vcGVyYW5kIik7CisgIElNTSgiY3BzX29wdCIpOworICBJTU0oInZmcF9mNjRpbW0iKTsKKyAgSU1NKCJ2ZnBfZjMyaW1tIik7CisgIElNTSgibXNyX21hc2siKTsKKyAgSU1NKCJuZWdfemVybyIpOworICBJTU0oImltbTBfMzEiKTsKKyAgSU1NKCJuTW9kSW1tIik7CisgIElNTSgiaW1tMF80MDk1Iik7CisgIElNTSgianQyYmxvY2tfb3BlcmFuZCIpOworICBJTU0oInRfaW1tX3M0Iik7CisgIElNTSgicGNsYWJlbCIpOworICAKKyAgTUlTQygiYnJ0YXJnZXQiLCAia09wZXJhbmRUeXBlQVJNQnJhbmNoVGFyZ2V0Iik7ICAgICAgICAgICAgICAgIC8vID8KKyAgTUlTQygic29fcmVnIiwgImtPcGVyYW5kVHlwZUFSTVNvUmVnIik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFIsIFIsIEkKKyAgTUlTQygidDJfc29fcmVnIiwgImtPcGVyYW5kVHlwZVRodW1iMlNvUmVnIik7ICAgICAgICAgICAgICAgICAgIC8vIFIsIEkKKyAgTUlTQygic29faW1tIiwgImtPcGVyYW5kVHlwZUFSTVNvSW1tIik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEkKKyAgTUlTQygidDJfc29faW1tIiwgImtPcGVyYW5kVHlwZVRodW1iMlNvSW1tIik7ICAgICAgICAgICAgICAgICAgIC8vIEkKKyAgTUlTQygic29faW1tMnBhcnQiLCAia09wZXJhbmRUeXBlQVJNU29JbW0yUGFydCIpOyAgICAgICAgICAgICAgIC8vIEkKKyAgTUlTQygicHJlZCIsICJrT3BlcmFuZFR5cGVBUk1QcmVkaWNhdGUiKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIEksIFIKKyAgTUlTQygiaXRfcHJlZCIsICJrT3BlcmFuZFR5cGVBUk1QcmVkaWNhdGUiKTsgICAgICAgICAgICAgICAgICAgIC8vIEkKKyAgTUlTQygiYWRkcm1vZGUyIiwgImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMiIpOyAgICAgICAgICAgICAgICAgIC8vIFIsIFIsIEkKKyAgTUlTQygiYW0yb2Zmc2V0IiwgImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMk9mZnNldCIpOyAgICAgICAgICAgIC8vIFIsIEkKKyAgTUlTQygiYWRkcm1vZGUzIiwgImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMyIpOyAgICAgICAgICAgICAgICAgIC8vIFIsIFIsIEkKKyAgTUlTQygiYW0zb2Zmc2V0IiwgImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlM09mZnNldCIpOyAgICAgICAgICAgIC8vIFIsIEkKKyAgTUlTQygiYWRkcm1vZGU0IiwgImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNCIpOyAgICAgICAgICAgICAgICAgIC8vIFIsIEkKKyAgTUlTQygiYWRkcm1vZGU1IiwgImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNSIpOyAgICAgICAgICAgICAgICAgIC8vIFIsIEkKKyAgTUlTQygiYWRkcm1vZGU2IiwgImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNiIpOyAgICAgICAgICAgICAgICAgIC8vIFIsIFIsIEksIEkKKyAgTUlTQygiYW02b2Zmc2V0IiwgImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNk9mZnNldCIpOyAgICAgICAgICAgIC8vIFIsIEksIEkKKyAgTUlTQygiYWRkcm1vZGVwYyIsICJrT3BlcmFuZFR5cGVBUk1BZGRyTW9kZVBDIik7ICAgICAgICAgICAgICAgIC8vIFIsIEkKKyAgTUlTQygicmVnbGlzdCIsICJrT3BlcmFuZFR5cGVBUk1SZWdpc3Rlckxpc3QiKTsgICAgICAgICAgICAgICAgIC8vIEksIFIsIC4uLgorICBNSVNDKCJpdF9tYXNrIiwgImtPcGVyYW5kVHlwZVRodW1iSVRNYXNrIik7ICAgICAgICAgICAgICAgICAgICAgLy8gSQorICBNSVNDKCJ0MmFkZHJtb2RlX2ltbTgiLCAia09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW04Iik7ICAgICAgLy8gUiwgSQorICBNSVNDKCJ0MmFtX2ltbThfb2Zmc2V0IiwgImtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlSW1tOE9mZnNldCIpOy8vSQorICBNSVNDKCJ0MmFkZHJtb2RlX2ltbTEyIiwgImtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlSW1tMTIiKTsgICAgLy8gUiwgSQorICBNSVNDKCJ0MmFkZHJtb2RlX3NvX3JlZyIsICJrT3BlcmFuZFR5cGVUaHVtYjJBZGRyTW9kZVNvUmVnIik7ICAgLy8gUiwgUiwgSQorICBNSVNDKCJ0MmFkZHJtb2RlX2ltbThzNCIsICJrT3BlcmFuZFR5cGVUaHVtYjJBZGRyTW9kZUltbThzNCIpOyAgLy8gUiwgSQorICBNSVNDKCJ0MmFtX2ltbThzNF9vZmZzZXQiLCAia09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW04czRPZmZzZXQiKTsgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUiwgSQorICBNSVNDKCJ0Yl9hZGRybW9kZSIsICJrT3BlcmFuZFR5cGVBUk1UQkFkZHJNb2RlIik7ICAgICAgICAgICAgICAgLy8gSQorICBNSVNDKCJ0X2FkZHJtb2RlX3MxIiwgImtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVTMSIpOyAgICAgICAgICAgLy8gUiwgSSwgUgorICBNSVNDKCJ0X2FkZHJtb2RlX3MyIiwgImtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVTMiIpOyAgICAgICAgICAgLy8gUiwgSSwgUgorICBNSVNDKCJ0X2FkZHJtb2RlX3M0IiwgImtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVTNCIpOyAgICAgICAgICAgLy8gUiwgSSwgUgorICBNSVNDKCJ0X2FkZHJtb2RlX3JyIiwgImtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVSUiIpOyAgICAgICAgICAgLy8gUiwgUgorICBNSVNDKCJ0X2FkZHJtb2RlX3NwIiwgImtPcGVyYW5kVHlwZVRodW1iQWRkck1vZGVTUCIpOyAgICAgICAgICAgLy8gUiwgSQorICAKKyAgcmV0dXJuIDE7Cit9CisKKyN1bmRlZiBTT1JFRworI3VuZGVmIFNPSU1NCisjdW5kZWYgUFJFRAorI3VuZGVmIFJFRworI3VuZGVmIE1FTQorI3VuZGVmIExFQQorI3VuZGVmIElNTQorI3VuZGVmIFBDUgorCisjdW5kZWYgU0VUCisKKy8vLyBBUk1Qb3B1bGF0ZU9wZXJhbmRzIC0gSGFuZGxlcyBhbGwgdGhlIG9wZXJhbmRzIGluIGFuIEFSTSBpbnN0cnVjdGlvbiwgYWRkaW5nCisvLy8gICB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgdG8gdGhlaXIgZGVzY3JpcHRvcnMKKy8vLworLy8vIEBvcGVyYW5kRmxhZ3MgLSBBIHJlZmVyZW5jZSB0aGUgYXJyYXkgb2Ygb3BlcmFuZCBmbGFnIG9iamVjdHMKKy8vLyBAaW5zdCAgICAgICAgIC0gVGhlIGluc3RydWN0aW9uIHRvIHVzZSBhcyBhIHNvdXJjZSBvZiBpbmZvcm1hdGlvbgorc3RhdGljIHZvaWQgQVJNUG9wdWxhdGVPcGVyYW5kcygKKyAgTGl0ZXJhbENvbnN0YW50RW1pdHRlciAqKCZvcGVyYW5kVHlwZXMpW0VESVNfTUFYX09QRVJBTkRTXSwKKyAgY29uc3QgQ29kZUdlbkluc3RydWN0aW9uICZpbnN0KSB7CisgIGlmICghaW5zdC5UaGVEZWYtPmlzU3ViQ2xhc3NPZigiSW5zdEFSTSIpICYmCisgICAgICAhaW5zdC5UaGVEZWYtPmlzU3ViQ2xhc3NPZigiSW5zdFRodW1iIikpCisgICAgcmV0dXJuOworICAKKyAgdW5zaWduZWQgaW50IGluZGV4OworICB1bnNpZ25lZCBpbnQgbnVtT3BlcmFuZHMgPSBpbnN0Lk9wZXJhbmRMaXN0LnNpemUoKTsKKyAgCisgIGlmIChudW1PcGVyYW5kcyA+IEVESVNfTUFYX09QRVJBTkRTKSB7CisgICAgZXJycygpIDw8ICJudW1PcGVyYW5kcyA9PSAiIDw8IG51bU9wZXJhbmRzIDw8ICIgPiAiIDw8IAorICAgICAgRURJU19NQVhfT1BFUkFORFMgPDwgJ1xuJzsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUb28gbWFueSBvcGVyYW5kcyIpOworICB9CisgIAorICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1PcGVyYW5kczsgKytpbmRleCkgeworICAgIGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbjo6T3BlcmFuZEluZm8gJm9wZXJhbmRJbmZvID0gCisgICAgaW5zdC5PcGVyYW5kTGlzdFtpbmRleF07CisgICAgUmVjb3JkICZyZWMgPSAqb3BlcmFuZEluZm8uUmVjOworICAgIAorICAgIGlmIChBUk1GbGFnRnJvbU9wTmFtZShvcGVyYW5kVHlwZXNbaW5kZXhdLCByZWMuZ2V0TmFtZSgpKSkgeworICAgICAgZXJycygpIDw8ICJPcGVyYW5kIHR5cGU6ICIgPDwgcmVjLmdldE5hbWUoKSA8PCAnXG4nOworICAgICAgZXJycygpIDw8ICJPcGVyYW5kIG5hbWU6ICIgPDwgb3BlcmFuZEluZm8uTmFtZSA8PCAnXG4nOworICAgICAgZXJycygpIDw8ICJJbnN0cnVjdGlvbiBtYW1lOiAiIDw8IGluc3QuVGhlRGVmLT5nZXROYW1lKCkgPDwgJ1xuJzsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCB0eXBlIik7CisgICAgfQorICB9Cit9CisKKyNkZWZpbmUgQlJBTkNIKHRhcmdldCkgeyAgICAgICAgICAgICAgICAgICAgXAorICBpbnN0VHlwZS5zZXQoImtJbnN0cnVjdGlvblR5cGVCcmFuY2giKTsgICBcCisgIERFQ09SQVRFMSh0YXJnZXQsICJrT3BlcmFuZEZsYWdUYXJnZXQiKTsgIFwKK30KKworLy8vIEFSTUV4dHJhY3RTZW1hbnRpY3MgLSBQZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyBvbiB0aGUgbmFtZSBvZiBhbiBBUk0KKy8vLyAgIGluc3RydWN0aW9uIHRvIGRldGVybWluZSB3aGF0IHNvcnQgb2YgYW4gaW5zdHJ1Y3Rpb24gaXQgaXMgYW5kIHRoZW4gYWRkcyAKKy8vLyAgIHRoZSBhcHByb3ByaWF0ZSBmbGFncyB0byB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGl0cyBvcGVyYW5kcworLy8vCisvLy8gQGFyZyBpbnN0VHlwZSAgICAgLSBBIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBmb3IgdGhlIGluc3RydWN0aW9uIGFzIGEgd2hvbGUKKy8vLyBAYXJnIG9wZXJhbmRUeXBlcyAtIEEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBvZiBvcGVyYW5kIHR5cGUgb2JqZWN0IHBvaW50ZXJzCisvLy8gQGFyZyBvcGVyYW5kRmxhZ3MgLSBBIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgb2Ygb3BlcmFuZCBmbGFnIG9iamVjdCBwb2ludGVycworLy8vIEBhcmcgaW5zdCAgICAgICAgIC0gQSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uCitzdGF0aWMgdm9pZCBBUk1FeHRyYWN0U2VtYW50aWNzKAorICBMaXRlcmFsQ29uc3RhbnRFbWl0dGVyICZpbnN0VHlwZSwKKyAgTGl0ZXJhbENvbnN0YW50RW1pdHRlciAqKCZvcGVyYW5kVHlwZXMpW0VESVNfTUFYX09QRVJBTkRTXSwKKyAgRmxhZ3NDb25zdGFudEVtaXR0ZXIgKigmb3BlcmFuZEZsYWdzKVtFRElTX01BWF9PUEVSQU5EU10sCisgIGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmaW5zdCkgeworICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA9IGluc3QuVGhlRGVmLT5nZXROYW1lKCk7CisgIAorICBpZiAobmFtZSA9PSAidEJjYyIgICB8fAorICAgICAgbmFtZSA9PSAidEIiICAgICB8fAorICAgICAgbmFtZSA9PSAidDJCY2MiICB8fAorICAgICAgbmFtZSA9PSAiQmNjIiAgICB8fAorICAgICAgbmFtZSA9PSAidENCWiIgICB8fAorICAgICAgbmFtZSA9PSAidENCTloiKSB7CisgICAgQlJBTkNIKCJ0YXJnZXQiKTsKKyAgfQorICAKKyAgaWYgKG5hbWUgPT0gInRCTHI5IiAgICAgIHx8CisgICAgICBuYW1lID09ICJCTHI5X3ByZWQiICB8fAorICAgICAgbmFtZSA9PSAidEJMWGlfcjkiICAgfHwKKyAgICAgIG5hbWUgPT0gInRCTFhyX3I5IiAgIHx8CisgICAgICBuYW1lID09ICJCTFhyOSIgICAgICB8fAorICAgICAgbmFtZSA9PSAidDJCWEoiICAgICAgfHwKKyAgICAgIG5hbWUgPT0gIkJYSiIpIHsKKyAgICBCUkFOQ0goImZ1bmMiKTsKKyAgICAKKyAgICB1bnNpZ25lZCBvcEluZGV4OworICAgIG9wSW5kZXggPSBpbnN0LmdldE9wZXJhbmROYW1lZCgiZnVuYyIpOworICAgIGlmIChvcGVyYW5kVHlwZXNbb3BJbmRleF0tPmlzKCJrT3BlcmFuZFR5cGVJbW1lZGlhdGUiKSkKKyAgICAgIG9wZXJhbmRUeXBlc1tvcEluZGV4XS0+c2V0KCJrT3BlcmFuZFR5cGVBUk1CcmFuY2hUYXJnZXQiKTsKKyAgfQorfQorCisjdW5kZWYgQlJBTkNICisKKy8vLyBwb3B1bGF0ZUluc3RJbmZvIC0gRmlsbHMgYW4gYXJyYXkgb2YgSW5zdEluZm9zIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgZWFjaCAKKy8vLyAgIGluc3RydWN0aW9uIGluIGEgdGFyZ2V0CisvLy8KKy8vLyBAYXJnIGluZm9BcnJheSAgLSBUaGUgYXJyYXkgb2YgSW5zdEluZm8gb2JqZWN0cyB0byBwb3B1bGF0ZQorLy8vIEBhcmcgdGFyZ2V0ICAgICAtIFRoZSBDb2RlR2VuVGFyZ2V0IHRvIHVzZSBhcyBhIHNvdXJjZSBvZiBpbnN0cnVjdGlvbnMKK3N0YXRpYyB2b2lkIHBvcHVsYXRlSW5zdEluZm8oQ29tcG91bmRDb25zdGFudEVtaXR0ZXIgJmluZm9BcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlblRhcmdldCAmdGFyZ2V0KSB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbio+ICZudW1iZXJlZEluc3RydWN0aW9ucyA9CisgICAgdGFyZ2V0LmdldEluc3RydWN0aW9uc0J5RW51bVZhbHVlKCk7CisgIAorICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgIHVuc2lnbmVkIGludCBudW1JbnN0cnVjdGlvbnMgPSBudW1iZXJlZEluc3RydWN0aW9ucy5zaXplKCk7CisgIAorICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1JbnN0cnVjdGlvbnM7ICsraW5kZXgpIHsKKyAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24mIGluc3QgPSAqbnVtYmVyZWRJbnN0cnVjdGlvbnNbaW5kZXhdOworICAgIAorICAgIENvbXBvdW5kQ29uc3RhbnRFbWl0dGVyICppbmZvU3RydWN0ID0gbmV3IENvbXBvdW5kQ29uc3RhbnRFbWl0dGVyOworICAgIGluZm9BcnJheS5hZGRFbnRyeShpbmZvU3RydWN0KTsKKyAgICAKKyAgICBMaXRlcmFsQ29uc3RhbnRFbWl0dGVyICppbnN0VHlwZSA9IG5ldyBMaXRlcmFsQ29uc3RhbnRFbWl0dGVyOworICAgIGluZm9TdHJ1Y3QtPmFkZEVudHJ5KGluc3RUeXBlKTsKKyAgICAKKyAgICBMaXRlcmFsQ29uc3RhbnRFbWl0dGVyICpudW1PcGVyYW5kc0VtaXR0ZXIgPSAKKyAgICAgIG5ldyBMaXRlcmFsQ29uc3RhbnRFbWl0dGVyKGluc3QuT3BlcmFuZExpc3Quc2l6ZSgpKTsKKyAgICBpbmZvU3RydWN0LT5hZGRFbnRyeShudW1PcGVyYW5kc0VtaXR0ZXIpOworICAgIAorICAgIENvbXBvdW5kQ29uc3RhbnRFbWl0dGVyICpvcGVyYW5kVHlwZUFycmF5ID0gbmV3IENvbXBvdW5kQ29uc3RhbnRFbWl0dGVyOworICAgIGluZm9TdHJ1Y3QtPmFkZEVudHJ5KG9wZXJhbmRUeXBlQXJyYXkpOworICAgIAorICAgIExpdGVyYWxDb25zdGFudEVtaXR0ZXIgKm9wZXJhbmRUeXBlc1tFRElTX01BWF9PUEVSQU5EU107CisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgQ29tcG91bmRDb25zdGFudEVtaXR0ZXIgKm9wZXJhbmRGbGFnQXJyYXkgPSBuZXcgQ29tcG91bmRDb25zdGFudEVtaXR0ZXI7CisgICAgaW5mb1N0cnVjdC0+YWRkRW50cnkob3BlcmFuZEZsYWdBcnJheSk7CisgICAgICAgIAorICAgIEZsYWdzQ29uc3RhbnRFbWl0dGVyICpvcGVyYW5kRmxhZ3NbRURJU19NQVhfT1BFUkFORFNdOworICAgIAorICAgIGZvciAodW5zaWduZWQgb3BlcmFuZEluZGV4ID0gMDsgCisgICAgICAgICBvcGVyYW5kSW5kZXggPCBFRElTX01BWF9PUEVSQU5EUzsgCisgICAgICAgICArK29wZXJhbmRJbmRleCkgeworICAgICAgb3BlcmFuZFR5cGVzW29wZXJhbmRJbmRleF0gPSBuZXcgTGl0ZXJhbENvbnN0YW50RW1pdHRlcjsKKyAgICAgIG9wZXJhbmRUeXBlQXJyYXktPmFkZEVudHJ5KG9wZXJhbmRUeXBlc1tvcGVyYW5kSW5kZXhdKTsKKyAgICAgIAorICAgICAgb3BlcmFuZEZsYWdzW29wZXJhbmRJbmRleF0gPSBuZXcgRmxhZ3NDb25zdGFudEVtaXR0ZXI7CisgICAgICBvcGVyYW5kRmxhZ0FycmF5LT5hZGRFbnRyeShvcGVyYW5kRmxhZ3Nbb3BlcmFuZEluZGV4XSk7CisgICAgfQorIAorICAgIHVuc2lnbmVkIG51bVN5bnRheGVzID0gMDsKKyAgICAKKyAgICBpZiAodGFyZ2V0LmdldE5hbWUoKSA9PSAiWDg2IikgeworICAgICAgWDg2UG9wdWxhdGVPcGVyYW5kcyhvcGVyYW5kVHlwZXMsIGluc3QpOworICAgICAgWDg2RXh0cmFjdFNlbWFudGljcygqaW5zdFR5cGUsIG9wZXJhbmRGbGFncywgaW5zdCk7CisgICAgICBudW1TeW50YXhlcyA9IDI7CisgICAgfQorICAgIGVsc2UgaWYgKHRhcmdldC5nZXROYW1lKCkgPT0gIkFSTSIpIHsKKyAgICAgIEFSTVBvcHVsYXRlT3BlcmFuZHMob3BlcmFuZFR5cGVzLCBpbnN0KTsKKyAgICAgIEFSTUV4dHJhY3RTZW1hbnRpY3MoKmluc3RUeXBlLCBvcGVyYW5kVHlwZXMsIG9wZXJhbmRGbGFncywgaW5zdCk7CisgICAgICBudW1TeW50YXhlcyA9IDE7CisgICAgfQorICAgIAorICAgIENvbXBvdW5kQ29uc3RhbnRFbWl0dGVyICpvcGVyYW5kT3JkZXJBcnJheSA9IG5ldyBDb21wb3VuZENvbnN0YW50RW1pdHRlcjsgICAgCisgICAgCisgICAgaW5mb1N0cnVjdC0+YWRkRW50cnkob3BlcmFuZE9yZGVyQXJyYXkpOworICAgIAorICAgIGZvciAodW5zaWduZWQgc3ludGF4SW5kZXggPSAwOyAKKyAgICAgICAgIHN5bnRheEluZGV4IDwgRURJU19NQVhfU1lOVEFYRVM7IAorICAgICAgICAgKytzeW50YXhJbmRleCkgeworICAgICAgQ29tcG91bmRDb25zdGFudEVtaXR0ZXIgKm9wZXJhbmRPcmRlciA9IAorICAgICAgICBuZXcgQ29tcG91bmRDb25zdGFudEVtaXR0ZXIoRURJU19NQVhfT1BFUkFORFMpOworICAgICAgCisgICAgICBvcGVyYW5kT3JkZXJBcnJheS0+YWRkRW50cnkob3BlcmFuZE9yZGVyKTsKKyAgICAgIAorICAgICAgaWYgKHN5bnRheEluZGV4IDwgbnVtU3ludGF4ZXMpIHsKKyAgICAgICAgcG9wdWxhdGVPcGVyYW5kT3JkZXIob3BlcmFuZE9yZGVyLCBpbnN0LCBzeW50YXhJbmRleCk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIGluZm9TdHJ1Y3QgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRDb21tb25FbnVtcyhyYXdfb3N0cmVhbSAmbywgdW5zaWduZWQgaW50ICZpKSB7CisgIEVudW1FbWl0dGVyIG9wZXJhbmRUeXBlcygiT3BlcmFuZFR5cGVzIik7CisgIG9wZXJhbmRUeXBlcy5hZGRFbnRyeSgia09wZXJhbmRUeXBlTm9uZSIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUltbWVkaWF0ZSIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZVJlZ2lzdGVyIik7CisgIG9wZXJhbmRUeXBlcy5hZGRFbnRyeSgia09wZXJhbmRUeXBlWDg2TWVtb3J5Iik7CisgIG9wZXJhbmRUeXBlcy5hZGRFbnRyeSgia09wZXJhbmRUeXBlWDg2RWZmZWN0aXZlQWRkcmVzcyIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZVg4NlBDUmVsYXRpdmUiKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVBUk1CcmFuY2hUYXJnZXQiKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVBUk1Tb1JlZyIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTVNvSW1tIik7CisgIG9wZXJhbmRUeXBlcy5hZGRFbnRyeSgia09wZXJhbmRUeXBlQVJNU29JbW0yUGFydCIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTVByZWRpY2F0ZSIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMiIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMk9mZnNldCIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlMyIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlM09mZnNldCIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNCIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNSIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNiIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlNk9mZnNldCIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZUFSTUFkZHJNb2RlUEMiKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVBUk1SZWdpc3Rlckxpc3QiKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVBUk1UQkFkZHJNb2RlIik7CisgIG9wZXJhbmRUeXBlcy5hZGRFbnRyeSgia09wZXJhbmRUeXBlVGh1bWJJVE1hc2siKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUzEiKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUzIiKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUzQiKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlUlIiKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVUaHVtYkFkZHJNb2RlU1AiKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVUaHVtYjJTb1JlZyIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZVRodW1iMlNvSW1tIik7CisgIG9wZXJhbmRUeXBlcy5hZGRFbnRyeSgia09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW04Iik7CisgIG9wZXJhbmRUeXBlcy5hZGRFbnRyeSgia09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW04T2Zmc2V0Iik7CisgIG9wZXJhbmRUeXBlcy5hZGRFbnRyeSgia09wZXJhbmRUeXBlVGh1bWIyQWRkck1vZGVJbW0xMiIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlU29SZWciKTsKKyAgb3BlcmFuZFR5cGVzLmFkZEVudHJ5KCJrT3BlcmFuZFR5cGVUaHVtYjJBZGRyTW9kZUltbThzNCIpOworICBvcGVyYW5kVHlwZXMuYWRkRW50cnkoImtPcGVyYW5kVHlwZVRodW1iMkFkZHJNb2RlSW1tOHM0T2Zmc2V0Iik7CisgIG9wZXJhbmRUeXBlcy5lbWl0KG8sIGkpOworICAKKyAgbyA8PCAiXG4iOworICAKKyAgRW51bUVtaXR0ZXIgb3BlcmFuZEZsYWdzKCJPcGVyYW5kRmxhZ3MiKTsKKyAgb3BlcmFuZEZsYWdzLmFkZEVudHJ5KCJrT3BlcmFuZEZsYWdTb3VyY2UiKTsKKyAgb3BlcmFuZEZsYWdzLmFkZEVudHJ5KCJrT3BlcmFuZEZsYWdUYXJnZXQiKTsKKyAgb3BlcmFuZEZsYWdzLmVtaXRBc0ZsYWdzKG8sIGkpOworICAKKyAgbyA8PCAiXG4iOworICAKKyAgRW51bUVtaXR0ZXIgaW5zdHJ1Y3Rpb25UeXBlcygiSW5zdHJ1Y3Rpb25UeXBlcyIpOworICBpbnN0cnVjdGlvblR5cGVzLmFkZEVudHJ5KCJrSW5zdHJ1Y3Rpb25UeXBlTm9uZSIpOworICBpbnN0cnVjdGlvblR5cGVzLmFkZEVudHJ5KCJrSW5zdHJ1Y3Rpb25UeXBlTW92ZSIpOworICBpbnN0cnVjdGlvblR5cGVzLmFkZEVudHJ5KCJrSW5zdHJ1Y3Rpb25UeXBlQnJhbmNoIik7CisgIGluc3RydWN0aW9uVHlwZXMuYWRkRW50cnkoImtJbnN0cnVjdGlvblR5cGVQdXNoIik7CisgIGluc3RydWN0aW9uVHlwZXMuYWRkRW50cnkoImtJbnN0cnVjdGlvblR5cGVQb3AiKTsKKyAgaW5zdHJ1Y3Rpb25UeXBlcy5hZGRFbnRyeSgia0luc3RydWN0aW9uVHlwZUNhbGwiKTsKKyAgaW5zdHJ1Y3Rpb25UeXBlcy5hZGRFbnRyeSgia0luc3RydWN0aW9uVHlwZVJldHVybiIpOworICBpbnN0cnVjdGlvblR5cGVzLmVtaXQobywgaSk7CisgIAorICBvIDw8ICJcbiI7Cit9CisKK3ZvaWQgRURFbWl0dGVyOjpydW4ocmF3X29zdHJlYW0gJm8pIHsKKyAgdW5zaWduZWQgaW50IGkgPSAwOworICAKKyAgQ29tcG91bmRDb25zdGFudEVtaXR0ZXIgaW5mb0FycmF5OworICBDb2RlR2VuVGFyZ2V0IHRhcmdldDsKKyAgCisgIHBvcHVsYXRlSW5zdEluZm8oaW5mb0FycmF5LCB0YXJnZXQpOworICAKKyAgZW1pdENvbW1vbkVudW1zKG8sIGkpOworICAKKyAgbyA8PCAibmFtZXNwYWNlIHtcbiI7CisgIAorICBvIDw8ICJsbHZtOjpFREluc3RJbmZvIGluc3RJbmZvIiA8PCB0YXJnZXQuZ2V0TmFtZSgpLmNfc3RyKCkgPDwgIltdID0gIjsKKyAgaW5mb0FycmF5LmVtaXQobywgaSk7CisgIG8gPDwgIjsiIDw8ICJcbiI7CisgIAorICBvIDw8ICJ9XG4iOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vRURFbWl0dGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9FREVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzAzNzNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vRURFbWl0dGVyLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIEVERW1pdHRlci5oIC0gR2VuZXJhdGUgaW5zdHJ1Y3Rpb24gZGVzY3JpcHRpb25zIGZvciBFRCAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgaXMgcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGEgZGVzY3JpcHRpb24gb2YgZWFjaAorLy8gaW5zdHJ1Y3Rpb24gaW4gYSBmb3JtYXQgdGhhdCB0aGUgc2VtYW50aWMgZGlzYXNzZW1ibGVyIGNhbiB1c2UgdG8gdG9rZW5pemUKKy8vIGFuZCBwYXJzZSBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTRU1BTlRJQ19JTkZPX0VNSVRURVJfSAorI2RlZmluZSBTRU1BTlRJQ19JTkZPX0VNSVRURVJfSAorCisjaW5jbHVkZSAiVGFibGVHZW5CYWNrZW5kLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgCisgIGNsYXNzIEVERW1pdHRlciA6IHB1YmxpYyBUYWJsZUdlbkJhY2tlbmQgeworICAgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKyAgcHVibGljOgorICAgIEVERW1pdHRlcihSZWNvcmRLZWVwZXIgJlIpOworICAgIAorICAgIC8vIHJ1biAtIE91dHB1dCB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUuCisgICAgdm9pZCBydW4ocmF3X29zdHJlYW0gJm8pOworICB9OworICAKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vRmFzdElTZWxFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0Zhc3RJU2VsRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0NDhhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0Zhc3RJU2VsRW1pdHRlci5jcHAKQEAgLTAsMCArMSw2NTkgQEAKKy8vPT09LSBGYXN0SVNlbEVtaXR0ZXIuY3BwIC0gR2VuZXJhdGUgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGVtaXRzIGNvZGUgZm9yIHVzZSBieSB0aGUgImZhc3QiIGluc3RydWN0aW9uCisvLyBzZWxlY3Rpb24gYWxnb3JpdGhtLiBTZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YKKy8vIGxpYi9Db2RlR2VuL1NlbGVjdGlvbkRBRy9GYXN0SVNlbC5jcHAgZm9yIGJhY2tncm91bmQuCisvLworLy8gVGhpcyBmaWxlIHNjYW5zIHRocm91Z2ggdGhlIHRhcmdldCdzIHRhYmxlZ2VuIGluc3RydWN0aW9uLWluZm8gZmlsZXMKKy8vIGFuZCBleHRyYWN0cyBpbnN0cnVjdGlvbnMgd2l0aCBvYnZpb3VzLWxvb2tpbmcgcGF0dGVybnMsIGFuZCBpdCBlbWl0cworLy8gY29kZSB0byBsb29rIHVwIHRoZXNlIGluc3RydWN0aW9ucyBieSB0eXBlIGFuZCBvcGVyYXRvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiRmFzdElTZWxFbWl0dGVyLmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVmVjdG9yRXh0cmFzLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworLy8vIEluc3RydWN0aW9uTWVtbyAtIFRoaXMgY2xhc3MgaG9sZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhbgorLy8vIGluc3RydWN0aW9uIG5lZWRlZCB0byBlbWl0IGNvZGUgZm9yIGl0LgorLy8vCitzdHJ1Y3QgSW5zdHJ1Y3Rpb25NZW1vIHsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgY29uc3QgQ29kZUdlblJlZ2lzdGVyQ2xhc3MgKlJDOworICBzdGQ6OnN0cmluZyBTdWJSZWdObzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBQaHlzUmVnczsKK307CisKKy8vLyBPcGVyYW5kc1NpZ25hdHVyZSAtIFRoaXMgY2xhc3MgaG9sZHMgYSBkZXNjcmlwdGlvbiBvZiBhIGxpc3Qgb2Ygb3BlcmFuZAorLy8vIHR5cGVzLiBJdCBoYXMgdXRpbGl0eSBtZXRob2RzIGZvciBlbWl0dGluZyB0ZXh0IGJhc2VkIG9uIHRoZSBvcGVyYW5kcy4KKy8vLworc3RydWN0IE9wZXJhbmRzU2lnbmF0dXJlIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE9wZXJhbmRzOworCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE9wZXJhbmRzU2lnbmF0dXJlICZPKSBjb25zdCB7CisgICAgcmV0dXJuIE9wZXJhbmRzIDwgTy5PcGVyYW5kczsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kcy5lbXB0eSgpOyB9CisKKyAgLy8vIGluaXRpYWxpemUgLSBFeGFtaW5lIHRoZSBnaXZlbiBwYXR0ZXJuIGFuZCBpbml0aWFsaXplIHRoZSBjb250ZW50cworICAvLy8gb2YgdGhlIE9wZXJhbmRzIGFycmF5IGFjY29yZGluZ2x5LiBSZXR1cm4gdHJ1ZSBpZiBhbGwgdGhlIG9wZXJhbmRzCisgIC8vLyBhcmUgc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCisgIC8vLworICBib29sIGluaXRpYWxpemUoVHJlZVBhdHRlcm5Ob2RlICpJbnN0UGF0Tm9kZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW5UYXJnZXQgJlRhcmdldCwKKyAgICAgICAgICAgICAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUKSB7CisKKyAgICBpZiAoIUluc3RQYXROb2RlLT5pc0xlYWYoKSkgeworICAgICAgaWYgKEluc3RQYXROb2RlLT5nZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgPT0gImltbSIpIHsKKyAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKCJpIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKEluc3RQYXROb2RlLT5nZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgPT0gImZwaW1tIikgeworICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soImYiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIAorICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICpEc3RSQyA9IDA7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3RQYXROb2RlLT5nZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkgeworICAgICAgVHJlZVBhdHRlcm5Ob2RlICpPcCA9IEluc3RQYXROb2RlLT5nZXRDaGlsZChpKTsKKyAgICAgIAorICAgICAgLy8gRm9yIG5vdywgZmlsdGVyIG91dCBhbnkgb3BlcmFuZCB3aXRoIGEgcHJlZGljYXRlLgorICAgICAgLy8gRm9yIG5vdywgZmlsdGVyIG91dCBhbnkgb3BlcmFuZCB3aXRoIG11bHRpcGxlIHZhbHVlcy4KKyAgICAgIGlmICghT3AtPmdldFByZWRpY2F0ZUZucygpLmVtcHR5KCkgfHwKKyAgICAgICAgICBPcC0+Z2V0TnVtVHlwZXMoKSAhPSAxKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAKKyAgICAgIGFzc2VydChPcC0+aGFzVHlwZVNldCgwKSAmJiAiVHlwZSBpbmZlcmVyZW5jZSBub3QgZG9uZT8iKTsKKyAgICAgIC8vIEZvciBub3csIGFsbCB0aGUgb3BlcmFuZHMgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUuCisgICAgICBpZiAoT3AtPmdldFR5cGUoMCkgIT0gVlQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIAorICAgICAgaWYgKCFPcC0+aXNMZWFmKCkpIHsKKyAgICAgICAgaWYgKE9wLT5nZXRPcGVyYXRvcigpLT5nZXROYW1lKCkgPT0gImltbSIpIHsKKyAgICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soImkiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoT3AtPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKSA9PSAiZnBpbW0iKSB7CisgICAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKCJmIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gRm9yIG5vdywgaWdub3JlIG90aGVyIG5vbi1sZWFmIG5vZGVzLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBEZWZJbml0ICpPcERJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihPcC0+Z2V0TGVhZlZhbHVlKCkpOworICAgICAgaWYgKCFPcERJKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBSZWNvcmQgKk9wTGVhZlJlYyA9IE9wREktPmdldERlZigpOworICAgICAgLy8gRm9yIG5vdywgdGhlIG9ubHkgb3RoZXIgdGhpbmcgd2UgYWNjZXB0IGlzIHJlZ2lzdGVyIG9wZXJhbmRzLgorCisgICAgICBjb25zdCBDb2RlR2VuUmVnaXN0ZXJDbGFzcyAqUkMgPSAwOworICAgICAgaWYgKE9wTGVhZlJlYy0+aXNTdWJDbGFzc09mKCJSZWdpc3RlckNsYXNzIikpCisgICAgICAgIFJDID0gJlRhcmdldC5nZXRSZWdpc3RlckNsYXNzKE9wTGVhZlJlYyk7CisgICAgICBlbHNlIGlmIChPcExlYWZSZWMtPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXIiKSkKKyAgICAgICAgUkMgPSBUYXJnZXQuZ2V0UmVnaXN0ZXJDbGFzc0ZvclJlZ2lzdGVyKE9wTGVhZlJlYyk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAvLyBGb3Igbm93LCByZXF1aXJlIHRoZSByZWdpc3RlciBvcGVyYW5kcycgcmVnaXN0ZXIgY2xhc3NlcyB0byBhbGwKKyAgICAgIC8vIGJlIHRoZSBzYW1lLgorICAgICAgaWYgKCFSQykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgLy8gRm9yIG5vdywgYWxsIHRoZSBvcGVyYW5kcyBtdXN0IGhhdmUgdGhlIHNhbWUgcmVnaXN0ZXIgY2xhc3MuCisgICAgICBpZiAoRHN0UkMpIHsKKyAgICAgICAgaWYgKERzdFJDICE9IFJDKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZQorICAgICAgICBEc3RSQyA9IFJDOworICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKCJyIik7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCBQcmludFBhcmFtZXRlcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChPcGVyYW5kc1tpXSA9PSAiciIpIHsKKyAgICAgICAgT1MgPDwgInVuc2lnbmVkIE9wIiA8PCBpIDw8ICIsIGJvb2wgT3AiIDw8IGkgPDwgIklzS2lsbCI7CisgICAgICB9IGVsc2UgaWYgKE9wZXJhbmRzW2ldID09ICJpIikgeworICAgICAgICBPUyA8PCAidWludDY0X3QgaW1tIiA8PCBpOworICAgICAgfSBlbHNlIGlmIChPcGVyYW5kc1tpXSA9PSAiZiIpIHsKKyAgICAgICAgT1MgPDwgIkNvbnN0YW50RlAgKmYiIDw8IGk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoIlVua25vd24gb3BlcmFuZCBraW5kISIpOworICAgICAgICBhYm9ydCgpOworICAgICAgfQorICAgICAgaWYgKGkgKyAxICE9IGUpCisgICAgICAgIE9TIDw8ICIsICI7CisgICAgfQorICB9CisKKyAgdm9pZCBQcmludEFyZ3VtZW50cyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBQUikgY29uc3QgeworICAgIGFzc2VydChQUi5zaXplKCkgPT0gT3BlcmFuZHMuc2l6ZSgpKTsKKyAgICBib29sIFByaW50ZWRBcmcgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKFBSW2ldICE9ICIiKQorICAgICAgICAvLyBJbXBsaWNpdCBwaHlzaWNhbCByZWdpc3RlciBvcGVyYW5kLgorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKFByaW50ZWRBcmcpCisgICAgICAgIE9TIDw8ICIsICI7CisgICAgICBpZiAoT3BlcmFuZHNbaV0gPT0gInIiKSB7CisgICAgICAgIE9TIDw8ICJPcCIgPDwgaSA8PCAiLCBPcCIgPDwgaSA8PCAiSXNLaWxsIjsKKyAgICAgICAgUHJpbnRlZEFyZyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKE9wZXJhbmRzW2ldID09ICJpIikgeworICAgICAgICBPUyA8PCAiaW1tIiA8PCBpOworICAgICAgICBQcmludGVkQXJnID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoT3BlcmFuZHNbaV0gPT0gImYiKSB7CisgICAgICAgIE9TIDw8ICJmIiA8PCBpOworICAgICAgICBQcmludGVkQXJnID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydCgiVW5rbm93biBvcGVyYW5kIGtpbmQhIik7CisgICAgICAgIGFib3J0KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBQcmludEFyZ3VtZW50cyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BlcmFuZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKE9wZXJhbmRzW2ldID09ICJyIikgeworICAgICAgICBPUyA8PCAiT3AiIDw8IGkgPDwgIiwgT3AiIDw8IGkgPDwgIklzS2lsbCI7CisgICAgICB9IGVsc2UgaWYgKE9wZXJhbmRzW2ldID09ICJpIikgeworICAgICAgICBPUyA8PCAiaW1tIiA8PCBpOworICAgICAgfSBlbHNlIGlmIChPcGVyYW5kc1tpXSA9PSAiZiIpIHsKKyAgICAgICAgT1MgPDwgImYiIDw8IGk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoIlVua25vd24gb3BlcmFuZCBraW5kISIpOworICAgICAgICBhYm9ydCgpOworICAgICAgfQorICAgICAgaWYgKGkgKyAxICE9IGUpCisgICAgICAgIE9TIDw8ICIsICI7CisgICAgfQorICB9CisKKworICB2b2lkIFByaW50TWFuZ2xpbmdTdWZmaXgocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBQUikgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBPcGVyYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoUFJbaV0gIT0gIiIpCisgICAgICAgIC8vIEltcGxpY2l0IHBoeXNpY2FsIHJlZ2lzdGVyIG9wZXJhbmQuIGUuZy4gSW5zdHJ1Y3Rpb246Ok11bCBleHBlY3QgdG8KKyAgICAgICAgLy8gc2VsZWN0IHRvIGEgYmluYXJ5IG9wLiBPbiB4ODYsIG11bCBtYXkgdGFrZSBhIHNpbmdsZSBvcGVyYW5kIHdpdGgKKyAgICAgICAgLy8gdGhlIG90aGVyIG9wZXJhbmQgYmVpbmcgaW1wbGljaXQuIFdlIG11c3QgZW1pdCBzb21ldGhpbmcgdGhhdCBsb29rcworICAgICAgICAvLyBsaWtlIGEgYmluYXJ5IGluc3RydWN0aW9uIGV4Y2VwdCBmb3IgdGhlIHZlcnkgaW5uZXIgRmFzdEVtaXRJbnN0XyoKKyAgICAgICAgLy8gY2FsbC4KKyAgICAgICAgY29udGludWU7CisgICAgICBPUyA8PCBPcGVyYW5kc1tpXTsKKyAgICB9CisgIH0KKworICB2b2lkIFByaW50TWFuZ2xpbmdTdWZmaXgocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wZXJhbmRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE9TIDw8IE9wZXJhbmRzW2ldOworICAgIH0KKyAgfQorfTsKKworY2xhc3MgRmFzdElTZWxNYXAgeworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJbnN0cnVjdGlvbk1lbW8+IFByZWRNYXA7CisgIHR5cGVkZWYgc3RkOjptYXA8TVZUOjpTaW1wbGVWYWx1ZVR5cGUsIFByZWRNYXA+IFJldFByZWRNYXA7CisgIHR5cGVkZWYgc3RkOjptYXA8TVZUOjpTaW1wbGVWYWx1ZVR5cGUsIFJldFByZWRNYXA+IFR5cGVSZXRQcmVkTWFwOworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUeXBlUmV0UHJlZE1hcD4gT3Bjb2RlVHlwZVJldFByZWRNYXA7CisgIHR5cGVkZWYgc3RkOjptYXA8T3BlcmFuZHNTaWduYXR1cmUsIE9wY29kZVR5cGVSZXRQcmVkTWFwPiAKKyAgICAgICAgICAgIE9wZXJhbmRzT3Bjb2RlVHlwZVJldFByZWRNYXA7CisKKyAgT3BlcmFuZHNPcGNvZGVUeXBlUmV0UHJlZE1hcCBTaW1wbGVQYXR0ZXJuczsKKworICBzdGQ6OnN0cmluZyBJbnN0TlM7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRmFzdElTZWxNYXAoc3RkOjpzdHJpbmcgSW5zdE5TKTsKKworICB2b2lkIENvbGxlY3RQYXR0ZXJucyhDb2RlR2VuREFHUGF0dGVybnMgJkNHUCk7CisgIHZvaWQgUHJpbnRGdW5jdGlvbkRlZmluaXRpb25zKHJhd19vc3RyZWFtICZPUyk7Cit9OworCit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBnZXRPcGNvZGVOYW1lKFJlY29yZCAqT3AsIENvZGVHZW5EQUdQYXR0ZXJucyAmQ0dQKSB7CisgIHJldHVybiBDR1AuZ2V0U0ROb2RlSW5mbyhPcCkuZ2V0RW51bU5hbWUoKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGdldExlZ2FsQ05hbWUoc3RkOjpzdHJpbmcgT3BOYW1lKSB7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gT3BOYW1lLmZpbmQoIjo6Iik7CisgIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgT3BOYW1lLnJlcGxhY2UocG9zLCAyLCAiXyIpOworICByZXR1cm4gT3BOYW1lOworfQorCitGYXN0SVNlbE1hcDo6RmFzdElTZWxNYXAoc3RkOjpzdHJpbmcgaW5zdG5zKQorICA6IEluc3ROUyhpbnN0bnMpIHsKK30KKwordm9pZCBGYXN0SVNlbE1hcDo6Q29sbGVjdFBhdHRlcm5zKENvZGVHZW5EQUdQYXR0ZXJucyAmQ0dQKSB7CisgIGNvbnN0IENvZGVHZW5UYXJnZXQgJlRhcmdldCA9IENHUC5nZXRUYXJnZXRJbmZvKCk7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSB0YXJnZXQncyBuYW1lc3BhY2UgbmFtZS4KKyAgSW5zdE5TID0gVGFyZ2V0LmdldEluc3ROYW1lc3BhY2UoKSArICI6OiI7CisgIGFzc2VydChJbnN0TlMuc2l6ZSgpID4gMiAmJiAiQ2FuJ3QgZGV0ZXJtaW5lIHRhcmdldC1zcGVjaWZpYyBuYW1lc3BhY2UhIik7CisKKyAgLy8gU2NhbiB0aHJvdWdoIGFsbCB0aGUgcGF0dGVybnMgYW5kIHJlY29yZCB0aGUgc2ltcGxlIG9uZXMuCisgIGZvciAoQ29kZUdlbkRBR1BhdHRlcm5zOjpwdG1faXRlcmF0b3IgSSA9IENHUC5wdG1fYmVnaW4oKSwKKyAgICAgICBFID0gQ0dQLnB0bV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjb25zdCBQYXR0ZXJuVG9NYXRjaCAmUGF0dGVybiA9ICpJOworCisgICAgLy8gRm9yIG5vdywganVzdCBsb29rIGF0IEluc3RydWN0aW9ucywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5CisgICAgLy8gYWJvdXQgZW1pdHRpbmcgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIGZvciBhIHBhdHRlcm4uCisgICAgVHJlZVBhdHRlcm5Ob2RlICpEc3QgPSBQYXR0ZXJuLmdldERzdFBhdHRlcm4oKTsKKyAgICBpZiAoRHN0LT5pc0xlYWYoKSkgY29udGludWU7CisgICAgUmVjb3JkICpPcCA9IERzdC0+Z2V0T3BlcmF0b3IoKTsKKyAgICBpZiAoIU9wLT5pc1N1YkNsYXNzT2YoIkluc3RydWN0aW9uIikpCisgICAgICBjb250aW51ZTsKKyAgICBDb2RlR2VuSW5zdHJ1Y3Rpb24gJklJID0gQ0dQLmdldFRhcmdldEluZm8oKS5nZXRJbnN0cnVjdGlvbihPcCk7CisgICAgaWYgKElJLk9wZXJhbmRMaXN0LmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEZvciBub3cgaWdub3JlIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgcHJlZGljYXRlIG9wZXJhbmRzLgorICAgIGJvb2wgSGFzUHJlZGljYXRlID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IElJLk9wZXJhbmRMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmKElJLk9wZXJhbmRMaXN0W2ldLlJlYy0+aXNTdWJDbGFzc09mKCJQcmVkaWNhdGVPcGVyYW5kIikpCisgICAgICAgIEhhc1ByZWRpY2F0ZSA9IHRydWU7CisgICAgfQorICAgIGlmIChIYXNQcmVkaWNhdGUpCisgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgIC8vIEZvciBub3csIGlnbm9yZSBtdWx0aS1pbnN0cnVjdGlvbiBwYXR0ZXJucy4KKyAgICBib29sIE11bHRpSW5zdHMgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRHN0LT5nZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkgeworICAgICAgVHJlZVBhdHRlcm5Ob2RlICpDaGlsZE9wID0gRHN0LT5nZXRDaGlsZChpKTsKKyAgICAgIGlmIChDaGlsZE9wLT5pc0xlYWYoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoQ2hpbGRPcC0+Z2V0T3BlcmF0b3IoKS0+aXNTdWJDbGFzc09mKCJJbnN0cnVjdGlvbiIpKSB7CisgICAgICAgIE11bHRpSW5zdHMgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKE11bHRpSW5zdHMpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEZvciBub3csIGlnbm9yZSBpbnN0cnVjdGlvbnMgd2hlcmUgdGhlIGZpcnN0IG9wZXJhbmQgaXMgbm90IGFuCisgICAgLy8gb3V0cHV0IHJlZ2lzdGVyLgorICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICpEc3RSQyA9IDA7CisgICAgc3RkOjpzdHJpbmcgU3ViUmVnTm87CisgICAgaWYgKE9wLT5nZXROYW1lKCkgIT0gIkVYVFJBQ1RfU1VCUkVHIikgeworICAgICAgUmVjb3JkICpPcDBSZWMgPSBJSS5PcGVyYW5kTGlzdFswXS5SZWM7CisgICAgICBpZiAoIU9wMFJlYy0+aXNTdWJDbGFzc09mKCJSZWdpc3RlckNsYXNzIikpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgRHN0UkMgPSAmVGFyZ2V0LmdldFJlZ2lzdGVyQ2xhc3MoT3AwUmVjKTsKKyAgICAgIGlmICghRHN0UkMpCisgICAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICAvLyBJZiB0aGlzIGlzbid0IGEgbGVhZiwgdGhlbiBjb250aW51ZSBzaW5jZSB0aGUgcmVnaXN0ZXIgY2xhc3NlcyBhcmUKKyAgICAgIC8vIGEgYml0IHRvbyBjb21wbGljYXRlZCBmb3Igbm93LgorICAgICAgaWYgKCFEc3QtPmdldENoaWxkKDEpLT5pc0xlYWYoKSkgY29udGludWU7CisgICAgICAKKyAgICAgIERlZkluaXQgKlNSID0gZHluYW1pY19jYXN0PERlZkluaXQqPihEc3QtPmdldENoaWxkKDEpLT5nZXRMZWFmVmFsdWUoKSk7CisgICAgICBpZiAoU1IpCisgICAgICAgIFN1YlJlZ05vID0gZ2V0UXVhbGlmaWVkTmFtZShTUi0+Z2V0RGVmKCkpOworICAgICAgZWxzZQorICAgICAgICBTdWJSZWdObyA9IERzdC0+Z2V0Q2hpbGQoMSktPmdldExlYWZWYWx1ZSgpLT5nZXRBc1N0cmluZygpOworICAgIH0KKworICAgIC8vIEluc3BlY3QgdGhlIHBhdHRlcm4uCisgICAgVHJlZVBhdHRlcm5Ob2RlICpJbnN0UGF0Tm9kZSA9IFBhdHRlcm4uZ2V0U3JjUGF0dGVybigpOworICAgIGlmICghSW5zdFBhdE5vZGUpIGNvbnRpbnVlOworICAgIGlmIChJbnN0UGF0Tm9kZS0+aXNMZWFmKCkpIGNvbnRpbnVlOworCisgICAgLy8gSWdub3JlIG11bHRpcGxlIHJlc3VsdCBub2RlcyBmb3Igbm93LgorICAgIGlmIChJbnN0UGF0Tm9kZS0+Z2V0TnVtVHlwZXMoKSA+IDEpIGNvbnRpbnVlOworICAgIAorICAgIFJlY29yZCAqSW5zdFBhdE9wID0gSW5zdFBhdE5vZGUtPmdldE9wZXJhdG9yKCk7CisgICAgc3RkOjpzdHJpbmcgT3Bjb2RlTmFtZSA9IGdldE9wY29kZU5hbWUoSW5zdFBhdE9wLCBDR1ApOworICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFJldFZUID0gTVZUOjppc1ZvaWQ7CisgICAgaWYgKEluc3RQYXROb2RlLT5nZXROdW1UeXBlcygpKSBSZXRWVCA9IEluc3RQYXROb2RlLT5nZXRUeXBlKDApOworICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUID0gUmV0VlQ7CisgICAgaWYgKEluc3RQYXROb2RlLT5nZXROdW1DaGlsZHJlbigpKSB7CisgICAgICBhc3NlcnQoSW5zdFBhdE5vZGUtPmdldENoaWxkKDApLT5nZXROdW1UeXBlcygpID09IDEpOworICAgICAgVlQgPSBJbnN0UGF0Tm9kZS0+Z2V0Q2hpbGQoMCktPmdldFR5cGUoMCk7CisgICAgfQorCisgICAgLy8gRm9yIG5vdywgZmlsdGVyIG91dCBpbnN0cnVjdGlvbnMgd2hpY2gganVzdCBzZXQgYSByZWdpc3RlciB0bworICAgIC8vIGFuIE9wZXJhbmQgb3IgYW4gaW1tZWRpYXRlLCBsaWtlIE1PVjMycmkuCisgICAgaWYgKEluc3RQYXRPcC0+aXNTdWJDbGFzc09mKCJPcGVyYW5kIikpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEZvciBub3csIGZpbHRlciBvdXQgYW55IGluc3RydWN0aW9ucyB3aXRoIHByZWRpY2F0ZXMuCisgICAgaWYgKCFJbnN0UGF0Tm9kZS0+Z2V0UHJlZGljYXRlRm5zKCkuZW1wdHkoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gQ2hlY2sgYWxsIHRoZSBvcGVyYW5kcy4KKyAgICBPcGVyYW5kc1NpZ25hdHVyZSBPcGVyYW5kczsKKyAgICBpZiAoIU9wZXJhbmRzLmluaXRpYWxpemUoSW5zdFBhdE5vZGUsIFRhcmdldCwgVlQpKQorICAgICAgY29udGludWU7CisgICAgCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBQaHlzUmVnSW5wdXRzID0gbmV3IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpOworICAgIGlmICghSW5zdFBhdE5vZGUtPmlzTGVhZigpICYmCisgICAgICAgIChJbnN0UGF0Tm9kZS0+Z2V0T3BlcmF0b3IoKS0+Z2V0TmFtZSgpID09ICJpbW0iIHx8CisgICAgICAgICBJbnN0UGF0Tm9kZS0+Z2V0T3BlcmF0b3IoKS0+Z2V0TmFtZSgpID09ICJmcGltbW0iKSkKKyAgICAgIFBoeXNSZWdJbnB1dHMtPnB1c2hfYmFjaygiIik7CisgICAgZWxzZSBpZiAoIUluc3RQYXROb2RlLT5pc0xlYWYoKSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluc3RQYXROb2RlLT5nZXROdW1DaGlsZHJlbigpOyBpICE9IGU7ICsraSkgeworICAgICAgICBUcmVlUGF0dGVybk5vZGUgKk9wID0gSW5zdFBhdE5vZGUtPmdldENoaWxkKGkpOworICAgICAgICBpZiAoIU9wLT5pc0xlYWYoKSkgeworICAgICAgICAgIFBoeXNSZWdJbnB1dHMtPnB1c2hfYmFjaygiIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERlZkluaXQgKk9wREkgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KE9wLT5nZXRMZWFmVmFsdWUoKSk7CisgICAgICAgIFJlY29yZCAqT3BMZWFmUmVjID0gT3BESS0+Z2V0RGVmKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIFBoeXNSZWc7CisgICAgICAgIGlmIChPcExlYWZSZWMtPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXIiKSkgeworICAgICAgICAgIFBoeXNSZWcgKz0gc3RhdGljX2Nhc3Q8U3RyaW5nSW5pdCo+KE9wTGVhZlJlYy0+Z2V0VmFsdWUoIFwKKyAgICAgICAgICAgICAgICAgICAgICJOYW1lc3BhY2UiKS0+Z2V0VmFsdWUoKSktPmdldFZhbHVlKCk7CisgICAgICAgICAgUGh5c1JlZyArPSAiOjoiOworICAgICAgICAgIAorICAgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3Rlcj4gUmVncyA9IFRhcmdldC5nZXRSZWdpc3RlcnMoKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUmVncy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKFJlZ3NbaV0uVGhlRGVmID09IE9wTGVhZlJlYykgeworICAgICAgICAgICAgICBQaHlzUmVnICs9IFJlZ3NbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgICBQaHlzUmVnSW5wdXRzLT5wdXNoX2JhY2soUGh5c1JlZyk7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBQaHlzUmVnSW5wdXRzLT5wdXNoX2JhY2soIiIpOworCisgICAgLy8gR2V0IHRoZSBwcmVkaWNhdGUgdGhhdCBndWFyZHMgdGhpcyBwYXR0ZXJuLgorICAgIHN0ZDo6c3RyaW5nIFByZWRpY2F0ZUNoZWNrID0gUGF0dGVybi5nZXRQcmVkaWNhdGVDaGVjaygpOworCisgICAgLy8gT2ssIHdlIGZvdW5kIGEgcGF0dGVybiB0aGF0IHdlIGNhbiBoYW5kbGUuIFJlbWVtYmVyIGl0LgorICAgIEluc3RydWN0aW9uTWVtbyBNZW1vID0geworICAgICAgUGF0dGVybi5nZXREc3RQYXR0ZXJuKCktPmdldE9wZXJhdG9yKCktPmdldE5hbWUoKSwKKyAgICAgIERzdFJDLAorICAgICAgU3ViUmVnTm8sCisgICAgICBQaHlzUmVnSW5wdXRzCisgICAgfTsKKyAgICBhc3NlcnQoIVNpbXBsZVBhdHRlcm5zW09wZXJhbmRzXVtPcGNvZGVOYW1lXVtWVF1bUmV0VlRdCisgICAgICAgICAgICAuY291bnQoUHJlZGljYXRlQ2hlY2spICYmCisgICAgICAgICAgICJEdXBsaWNhdGUgcGF0dGVybiEiKTsKKyAgICBTaW1wbGVQYXR0ZXJuc1tPcGVyYW5kc11bT3Bjb2RlTmFtZV1bVlRdW1JldFZUXVtQcmVkaWNhdGVDaGVja10gPSBNZW1vOworICB9Cit9CisKK3ZvaWQgRmFzdElTZWxNYXA6OlByaW50RnVuY3Rpb25EZWZpbml0aW9ucyhyYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gTm93IGVtaXQgY29kZSBmb3IgYWxsIHRoZSBwYXR0ZXJucyB0aGF0IHdlIGNvbGxlY3RlZC4KKyAgZm9yIChPcGVyYW5kc09wY29kZVR5cGVSZXRQcmVkTWFwOjpjb25zdF9pdGVyYXRvciBPSSA9IFNpbXBsZVBhdHRlcm5zLmJlZ2luKCksCisgICAgICAgT0UgPSBTaW1wbGVQYXR0ZXJucy5lbmQoKTsgT0kgIT0gT0U7ICsrT0kpIHsKKyAgICBjb25zdCBPcGVyYW5kc1NpZ25hdHVyZSAmT3BlcmFuZHMgPSBPSS0+Zmlyc3Q7CisgICAgY29uc3QgT3Bjb2RlVHlwZVJldFByZWRNYXAgJk9UTSA9IE9JLT5zZWNvbmQ7CisKKyAgICBmb3IgKE9wY29kZVR5cGVSZXRQcmVkTWFwOjpjb25zdF9pdGVyYXRvciBJID0gT1RNLmJlZ2luKCksIEUgPSBPVE0uZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk9wY29kZSA9IEktPmZpcnN0OworICAgICAgY29uc3QgVHlwZVJldFByZWRNYXAgJlRNID0gSS0+c2Vjb25kOworCisgICAgICBPUyA8PCAiLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciAiIDw8IE9wY29kZSA8PCAiLlxuIjsKKyAgICAgIE9TIDw8ICJcbiI7CisKKyAgICAgIC8vIEVtaXQgb25lIGZ1bmN0aW9uIGZvciBlYWNoIG9wY29kZSx0eXBlIHBhaXIuCisgICAgICBmb3IgKFR5cGVSZXRQcmVkTWFwOjpjb25zdF9pdGVyYXRvciBUSSA9IFRNLmJlZ2luKCksIFRFID0gVE0uZW5kKCk7CisgICAgICAgICAgIFRJICE9IFRFOyArK1RJKSB7CisgICAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUID0gVEktPmZpcnN0OworICAgICAgICBjb25zdCBSZXRQcmVkTWFwICZSTSA9IFRJLT5zZWNvbmQ7CisgICAgICAgIGlmIChSTS5zaXplKCkgIT0gMSkgeworICAgICAgICAgIGZvciAoUmV0UHJlZE1hcDo6Y29uc3RfaXRlcmF0b3IgUkkgPSBSTS5iZWdpbigpLCBSRSA9IFJNLmVuZCgpOworICAgICAgICAgICAgICAgUkkgIT0gUkU7ICsrUkkpIHsKKyAgICAgICAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFJldFZUID0gUkktPmZpcnN0OworICAgICAgICAgICAgY29uc3QgUHJlZE1hcCAmUE0gPSBSSS0+c2Vjb25kOworICAgICAgICAgICAgYm9vbCBIYXNQcmVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIE9TIDw8ICJ1bnNpZ25lZCBGYXN0RW1pdF8iCisgICAgICAgICAgICAgICA8PCBnZXRMZWdhbENOYW1lKE9wY29kZSkKKyAgICAgICAgICAgICAgIDw8ICJfIiA8PCBnZXRMZWdhbENOYW1lKGdldE5hbWUoVlQpKQorICAgICAgICAgICAgICAgPDwgIl8iIDw8IGdldExlZ2FsQ05hbWUoZ2V0TmFtZShSZXRWVCkpIDw8ICJfIjsKKyAgICAgICAgICAgIE9wZXJhbmRzLlByaW50TWFuZ2xpbmdTdWZmaXgoT1MpOworICAgICAgICAgICAgT1MgPDwgIigiOworICAgICAgICAgICAgT3BlcmFuZHMuUHJpbnRQYXJhbWV0ZXJzKE9TKTsKKyAgICAgICAgICAgIE9TIDw8ICIpIHtcbiI7CisKKyAgICAgICAgICAgIC8vIEVtaXQgY29kZSBmb3IgZWFjaCBwb3NzaWJsZSBpbnN0cnVjdGlvbi4gVGhlcmUgbWF5IGJlCisgICAgICAgICAgICAvLyBtdWx0aXBsZSBpZiB0aGVyZSBhcmUgc3VidGFyZ2V0IGNvbmNlcm5zLgorICAgICAgICAgICAgZm9yIChQcmVkTWFwOjpjb25zdF9pdGVyYXRvciBQSSA9IFBNLmJlZ2luKCksIFBFID0gUE0uZW5kKCk7CisgICAgICAgICAgICAgICAgIFBJICE9IFBFOyArK1BJKSB7CisgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIFByZWRpY2F0ZUNoZWNrID0gUEktPmZpcnN0OworICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbk1lbW8gJk1lbW8gPSBQSS0+c2Vjb25kOworICAKKyAgICAgICAgICAgICAgaWYgKFByZWRpY2F0ZUNoZWNrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIUhhc1ByZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIGluc3RydWN0aW9ucyBtYXRjaCwgYXQgbGVhc3Qgb25lIGhhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJhIHByZWRpY2F0ZSBhbmQgYXQgbGVhc3Qgb25lIGRvZXNuJ3QhIik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgT1MgPDwgIiAgaWYgKCIgKyBQcmVkaWNhdGVDaGVjayArICIpIHtcbiI7CisgICAgICAgICAgICAgICAgT1MgPDwgIiAgIjsKKyAgICAgICAgICAgICAgICBIYXNQcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1lbW8uUGh5c1JlZ3MtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCgqTWVtby5QaHlzUmVncylbaV0gIT0gIiIpCisgICAgICAgICAgICAgICAgICBPUyA8PCAiICBCdWlsZE1JKCpGdW5jSW5mby5NQkIsIEZ1bmNJbmZvLkluc2VydFB0LCBETCwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgIlRJSS5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgKCpNZW1vLlBoeXNSZWdzKVtpXSA8PCAiKS5hZGRSZWcoT3AiIDw8IGkgPDwgIik7XG4iOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBPUyA8PCAiICByZXR1cm4gRmFzdEVtaXRJbnN0XyI7CisgICAgICAgICAgICAgIGlmIChNZW1vLlN1YlJlZ05vLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBPcGVyYW5kcy5QcmludE1hbmdsaW5nU3VmZml4KE9TLCAqTWVtby5QaHlzUmVncyk7CisgICAgICAgICAgICAgICAgT1MgPDwgIigiIDw8IEluc3ROUyA8PCBNZW1vLk5hbWUgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICBPUyA8PCBJbnN0TlMgPDwgTWVtby5SQy0+Z2V0TmFtZSgpIDw8ICJSZWdpc3RlckNsYXNzIjsKKyAgICAgICAgICAgICAgICBpZiAoIU9wZXJhbmRzLmVtcHR5KCkpCisgICAgICAgICAgICAgICAgICBPUyA8PCAiLCAiOworICAgICAgICAgICAgICAgIE9wZXJhbmRzLlByaW50QXJndW1lbnRzKE9TLCAqTWVtby5QaHlzUmVncyk7CisgICAgICAgICAgICAgICAgT1MgPDwgIik7XG4iOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE9TIDw8ICJleHRyYWN0c3VicmVnKCIgPDwgZ2V0TmFtZShSZXRWVCk7CisgICAgICAgICAgICAgICAgT1MgPDwgIiwgT3AwLCBPcDBJc0tpbGwsICI7CisgICAgICAgICAgICAgICAgT1MgPDwgTWVtby5TdWJSZWdObzsKKyAgICAgICAgICAgICAgICBPUyA8PCAiKTtcbiI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChIYXNQcmVkKQorICAgICAgICAgICAgICAgIE9TIDw8ICIgIH1cbiI7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmV0dXJuIDAgaWYgbm9uZSBvZiB0aGUgcHJlZGljYXRlcyB3ZXJlIHNhdGlzZmllZC4KKyAgICAgICAgICAgIGlmIChIYXNQcmVkKQorICAgICAgICAgICAgICBPUyA8PCAiICByZXR1cm4gMDtcbiI7CisgICAgICAgICAgICBPUyA8PCAifVxuIjsKKyAgICAgICAgICAgIE9TIDw8ICJcbiI7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIC8vIEVtaXQgb25lIGZ1bmN0aW9uIGZvciB0aGUgdHlwZSB0aGF0IGRlbXVsdGlwbGV4ZXMgb24gcmV0dXJuIHR5cGUuCisgICAgICAgICAgT1MgPDwgInVuc2lnbmVkIEZhc3RFbWl0XyIKKyAgICAgICAgICAgICA8PCBnZXRMZWdhbENOYW1lKE9wY29kZSkgPDwgIl8iCisgICAgICAgICAgICAgPDwgZ2V0TGVnYWxDTmFtZShnZXROYW1lKFZUKSkgPDwgIl8iOworICAgICAgICAgIE9wZXJhbmRzLlByaW50TWFuZ2xpbmdTdWZmaXgoT1MpOworICAgICAgICAgIE9TIDw8ICIoTVZUIFJldFZUIjsKKyAgICAgICAgICBpZiAoIU9wZXJhbmRzLmVtcHR5KCkpCisgICAgICAgICAgICBPUyA8PCAiLCAiOworICAgICAgICAgIE9wZXJhbmRzLlByaW50UGFyYW1ldGVycyhPUyk7CisgICAgICAgICAgT1MgPDwgIikge1xuc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkge1xuIjsKKyAgICAgICAgICBmb3IgKFJldFByZWRNYXA6OmNvbnN0X2l0ZXJhdG9yIFJJID0gUk0uYmVnaW4oKSwgUkUgPSBSTS5lbmQoKTsKKyAgICAgICAgICAgICAgIFJJICE9IFJFOyArK1JJKSB7CisgICAgICAgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBSZXRWVCA9IFJJLT5maXJzdDsKKyAgICAgICAgICAgIE9TIDw8ICIgIGNhc2UgIiA8PCBnZXROYW1lKFJldFZUKSA8PCAiOiByZXR1cm4gRmFzdEVtaXRfIgorICAgICAgICAgICAgICAgPDwgZ2V0TGVnYWxDTmFtZShPcGNvZGUpIDw8ICJfIiA8PCBnZXRMZWdhbENOYW1lKGdldE5hbWUoVlQpKQorICAgICAgICAgICAgICAgPDwgIl8iIDw8IGdldExlZ2FsQ05hbWUoZ2V0TmFtZShSZXRWVCkpIDw8ICJfIjsKKyAgICAgICAgICAgIE9wZXJhbmRzLlByaW50TWFuZ2xpbmdTdWZmaXgoT1MpOworICAgICAgICAgICAgT1MgPDwgIigiOworICAgICAgICAgICAgT3BlcmFuZHMuUHJpbnRBcmd1bWVudHMoT1MpOworICAgICAgICAgICAgT1MgPDwgIik7XG4iOworICAgICAgICAgIH0KKyAgICAgICAgICBPUyA8PCAiICBkZWZhdWx0OiByZXR1cm4gMDtcbn1cbn1cblxuIjsKKyAgICAgICAgICAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBOb24tdmFyaWFkaWMgcmV0dXJuIHR5cGUuCisgICAgICAgICAgT1MgPDwgInVuc2lnbmVkIEZhc3RFbWl0XyIKKyAgICAgICAgICAgICA8PCBnZXRMZWdhbENOYW1lKE9wY29kZSkgPDwgIl8iCisgICAgICAgICAgICAgPDwgZ2V0TGVnYWxDTmFtZShnZXROYW1lKFZUKSkgPDwgIl8iOworICAgICAgICAgIE9wZXJhbmRzLlByaW50TWFuZ2xpbmdTdWZmaXgoT1MpOworICAgICAgICAgIE9TIDw8ICIoTVZUIFJldFZUIjsKKyAgICAgICAgICBpZiAoIU9wZXJhbmRzLmVtcHR5KCkpCisgICAgICAgICAgICBPUyA8PCAiLCAiOworICAgICAgICAgIE9wZXJhbmRzLlByaW50UGFyYW1ldGVycyhPUyk7CisgICAgICAgICAgT1MgPDwgIikge1xuIjsKKyAgICAgICAgICAKKyAgICAgICAgICBPUyA8PCAiICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gIiA8PCBnZXROYW1lKFJNLmJlZ2luKCktPmZpcnN0KQorICAgICAgICAgICAgIDw8ICIpXG4gICAgcmV0dXJuIDA7XG4iOworICAgICAgICAgIAorICAgICAgICAgIGNvbnN0IFByZWRNYXAgJlBNID0gUk0uYmVnaW4oKS0+c2Vjb25kOworICAgICAgICAgIGJvb2wgSGFzUHJlZCA9IGZhbHNlOworICAgICAgICAgIAorICAgICAgICAgIC8vIEVtaXQgY29kZSBmb3IgZWFjaCBwb3NzaWJsZSBpbnN0cnVjdGlvbi4gVGhlcmUgbWF5IGJlCisgICAgICAgICAgLy8gbXVsdGlwbGUgaWYgdGhlcmUgYXJlIHN1YnRhcmdldCBjb25jZXJucy4KKyAgICAgICAgICBmb3IgKFByZWRNYXA6OmNvbnN0X2l0ZXJhdG9yIFBJID0gUE0uYmVnaW4oKSwgUEUgPSBQTS5lbmQoKTsgUEkgIT0gUEU7CisgICAgICAgICAgICAgICArK1BJKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBQcmVkaWNhdGVDaGVjayA9IFBJLT5maXJzdDsKKyAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uTWVtbyAmTWVtbyA9IFBJLT5zZWNvbmQ7CisKKyAgICAgICAgICAgIGlmIChQcmVkaWNhdGVDaGVjay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgIGFzc2VydCghSGFzUHJlZCAmJgorICAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIGluc3RydWN0aW9ucyBtYXRjaCwgYXQgbGVhc3Qgb25lIGhhcyAiCisgICAgICAgICAgICAgICAgICAgICAiYSBwcmVkaWNhdGUgYW5kIGF0IGxlYXN0IG9uZSBkb2Vzbid0ISIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgT1MgPDwgIiAgaWYgKCIgKyBQcmVkaWNhdGVDaGVjayArICIpIHtcbiI7CisgICAgICAgICAgICAgIE9TIDw8ICIgICI7CisgICAgICAgICAgICAgIEhhc1ByZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTWVtby5QaHlzUmVncy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgaWYgKCgqTWVtby5QaHlzUmVncylbaV0gIT0gIiIpCisgICAgICAgICAgICAgICAgT1MgPDwgIiAgQnVpbGRNSSgqRnVuY0luZm8uTUJCLCBGdW5jSW5mby5JbnNlcnRQdCwgREwsICIKKyAgICAgICAgICAgICAgICAgICA8PCAiVElJLmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLCAiCisgICAgICAgICAgICAgICAgICAgPDwgKCpNZW1vLlBoeXNSZWdzKVtpXSA8PCAiKS5hZGRSZWcoT3AiIDw8IGkgPDwgIik7XG4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBPUyA8PCAiICByZXR1cm4gRmFzdEVtaXRJbnN0XyI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChNZW1vLlN1YlJlZ05vLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgT3BlcmFuZHMuUHJpbnRNYW5nbGluZ1N1ZmZpeChPUywgKk1lbW8uUGh5c1JlZ3MpOworICAgICAgICAgICAgICBPUyA8PCAiKCIgPDwgSW5zdE5TIDw8IE1lbW8uTmFtZSA8PCAiLCAiOworICAgICAgICAgICAgICBPUyA8PCBJbnN0TlMgPDwgTWVtby5SQy0+Z2V0TmFtZSgpIDw8ICJSZWdpc3RlckNsYXNzIjsKKyAgICAgICAgICAgICAgaWYgKCFPcGVyYW5kcy5lbXB0eSgpKQorICAgICAgICAgICAgICAgIE9TIDw8ICIsICI7CisgICAgICAgICAgICAgIE9wZXJhbmRzLlByaW50QXJndW1lbnRzKE9TLCAqTWVtby5QaHlzUmVncyk7CisgICAgICAgICAgICAgIE9TIDw8ICIpO1xuIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIE9TIDw8ICJleHRyYWN0c3VicmVnKFJldFZULCBPcDAsIE9wMElzS2lsbCwgIjsKKyAgICAgICAgICAgICAgT1MgPDwgTWVtby5TdWJSZWdObzsKKyAgICAgICAgICAgICAgT1MgPDwgIik7XG4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAgaWYgKEhhc1ByZWQpCisgICAgICAgICAgICAgICBPUyA8PCAiICB9XG4iOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvLyBSZXR1cm4gMCBpZiBub25lIG9mIHRoZSBwcmVkaWNhdGVzIHdlcmUgc2F0aXNmaWVkLgorICAgICAgICAgIGlmIChIYXNQcmVkKQorICAgICAgICAgICAgT1MgPDwgIiAgcmV0dXJuIDA7XG4iOworICAgICAgICAgIE9TIDw8ICJ9XG4iOworICAgICAgICAgIE9TIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gRW1pdCBvbmUgZnVuY3Rpb24gZm9yIHRoZSBvcGNvZGUgdGhhdCBkZW11bHRpcGxleGVzIGJhc2VkIG9uIHRoZSB0eXBlLgorICAgICAgT1MgPDwgInVuc2lnbmVkIEZhc3RFbWl0XyIKKyAgICAgICAgIDw8IGdldExlZ2FsQ05hbWUoT3Bjb2RlKSA8PCAiXyI7CisgICAgICBPcGVyYW5kcy5QcmludE1hbmdsaW5nU3VmZml4KE9TKTsKKyAgICAgIE9TIDw8ICIoTVZUIFZULCBNVlQgUmV0VlQiOworICAgICAgaWYgKCFPcGVyYW5kcy5lbXB0eSgpKQorICAgICAgICBPUyA8PCAiLCAiOworICAgICAgT3BlcmFuZHMuUHJpbnRQYXJhbWV0ZXJzKE9TKTsKKyAgICAgIE9TIDw8ICIpIHtcbiI7CisgICAgICBPUyA8PCAiICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7XG4iOworICAgICAgZm9yIChUeXBlUmV0UHJlZE1hcDo6Y29uc3RfaXRlcmF0b3IgVEkgPSBUTS5iZWdpbigpLCBURSA9IFRNLmVuZCgpOworICAgICAgICAgICBUSSAhPSBURTsgKytUSSkgeworICAgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCA9IFRJLT5maXJzdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgVHlwZU5hbWUgPSBnZXROYW1lKFZUKTsKKyAgICAgICAgT1MgPDwgIiAgY2FzZSAiIDw8IFR5cGVOYW1lIDw8ICI6IHJldHVybiBGYXN0RW1pdF8iCisgICAgICAgICAgIDw8IGdldExlZ2FsQ05hbWUoT3Bjb2RlKSA8PCAiXyIgPDwgZ2V0TGVnYWxDTmFtZShUeXBlTmFtZSkgPDwgIl8iOworICAgICAgICBPcGVyYW5kcy5QcmludE1hbmdsaW5nU3VmZml4KE9TKTsKKyAgICAgICAgT1MgPDwgIihSZXRWVCI7CisgICAgICAgIGlmICghT3BlcmFuZHMuZW1wdHkoKSkKKyAgICAgICAgICBPUyA8PCAiLCAiOworICAgICAgICBPcGVyYW5kcy5QcmludEFyZ3VtZW50cyhPUyk7CisgICAgICAgIE9TIDw8ICIpO1xuIjsKKyAgICAgIH0KKyAgICAgIE9TIDw8ICIgIGRlZmF1bHQ6IHJldHVybiAwO1xuIjsKKyAgICAgIE9TIDw8ICIgIH1cbiI7CisgICAgICBPUyA8PCAifVxuIjsKKyAgICAgIE9TIDw8ICJcbiI7CisgICAgfQorCisgICAgT1MgPDwgIi8vIFRvcC1sZXZlbCBGYXN0RW1pdCBmdW5jdGlvbi5cbiI7CisgICAgT1MgPDwgIlxuIjsKKworICAgIC8vIEVtaXQgb25lIGZ1bmN0aW9uIGZvciB0aGUgb3BlcmFuZCBzaWduYXR1cmUgdGhhdCBkZW11bHRpcGxleGVzIGJhc2VkCisgICAgLy8gb24gb3Bjb2RlIGFuZCB0eXBlLgorICAgIE9TIDw8ICJ1bnNpZ25lZCBGYXN0RW1pdF8iOworICAgIE9wZXJhbmRzLlByaW50TWFuZ2xpbmdTdWZmaXgoT1MpOworICAgIE9TIDw8ICIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wY29kZSI7CisgICAgaWYgKCFPcGVyYW5kcy5lbXB0eSgpKQorICAgICAgT1MgPDwgIiwgIjsKKyAgICBPcGVyYW5kcy5QcmludFBhcmFtZXRlcnMoT1MpOworICAgIE9TIDw8ICIpIHtcbiI7CisgICAgT1MgPDwgIiAgc3dpdGNoIChPcGNvZGUpIHtcbiI7CisgICAgZm9yIChPcGNvZGVUeXBlUmV0UHJlZE1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IE9UTS5iZWdpbigpLCBFID0gT1RNLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZPcGNvZGUgPSBJLT5maXJzdDsKKworICAgICAgT1MgPDwgIiAgY2FzZSAiIDw8IE9wY29kZSA8PCAiOiByZXR1cm4gRmFzdEVtaXRfIgorICAgICAgICAgPDwgZ2V0TGVnYWxDTmFtZShPcGNvZGUpIDw8ICJfIjsKKyAgICAgIE9wZXJhbmRzLlByaW50TWFuZ2xpbmdTdWZmaXgoT1MpOworICAgICAgT1MgPDwgIihWVCwgUmV0VlQiOworICAgICAgaWYgKCFPcGVyYW5kcy5lbXB0eSgpKQorICAgICAgICBPUyA8PCAiLCAiOworICAgICAgT3BlcmFuZHMuUHJpbnRBcmd1bWVudHMoT1MpOworICAgICAgT1MgPDwgIik7XG4iOworICAgIH0KKyAgICBPUyA8PCAiICBkZWZhdWx0OiByZXR1cm4gMDtcbiI7CisgICAgT1MgPDwgIiAgfVxuIjsKKyAgICBPUyA8PCAifVxuIjsKKyAgICBPUyA8PCAiXG4iOworICB9Cit9CisKK3ZvaWQgRmFzdElTZWxFbWl0dGVyOjpydW4ocmF3X29zdHJlYW0gJk9TKSB7CisgIGNvbnN0IENvZGVHZW5UYXJnZXQgJlRhcmdldCA9IENHUC5nZXRUYXJnZXRJbmZvKCk7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSB0YXJnZXQncyBuYW1lc3BhY2UgbmFtZS4KKyAgc3RkOjpzdHJpbmcgSW5zdE5TID0gVGFyZ2V0LmdldEluc3ROYW1lc3BhY2UoKSArICI6OiI7CisgIGFzc2VydChJbnN0TlMuc2l6ZSgpID4gMiAmJiAiQ2FuJ3QgZGV0ZXJtaW5lIHRhcmdldC1zcGVjaWZpYyBuYW1lc3BhY2UhIik7CisKKyAgRW1pdFNvdXJjZUZpbGVIZWFkZXIoIlwiRmFzdFwiIEluc3RydWN0aW9uIFNlbGVjdG9yIGZvciB0aGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldC5nZXROYW1lKCkgKyAiIHRhcmdldCIsIE9TKTsKKworICBGYXN0SVNlbE1hcCBGKEluc3ROUyk7CisgIEYuQ29sbGVjdFBhdHRlcm5zKENHUCk7CisgIEYuUHJpbnRGdW5jdGlvbkRlZmluaXRpb25zKE9TKTsKK30KKworRmFzdElTZWxFbWl0dGVyOjpGYXN0SVNlbEVtaXR0ZXIoUmVjb3JkS2VlcGVyICZSKQorICA6IFJlY29yZHMoUiksCisgICAgQ0dQKFIpIHsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vRmFzdElTZWxFbWl0dGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9GYXN0SVNlbEVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTRlNzdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vRmFzdElTZWxFbWl0dGVyLmgKQEAgLTAsMCArMSwzOSBAQAorLy89PT0tIEZhc3RJU2VsRW1pdHRlci5oIC0gR2VuZXJhdGUgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgZW1pdHMgYSAiZmFzdCIgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBGQVNUSVNFTF9FTUlUVEVSX0gKKyNkZWZpbmUgRkFTVElTRUxfRU1JVFRFUl9ICisKKyNpbmNsdWRlICJUYWJsZUdlbkJhY2tlbmQuaCIKKyNpbmNsdWRlICJDb2RlR2VuREFHUGF0dGVybnMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb2RlR2VuVGFyZ2V0OworCisvLy8gRmFzdElTZWxFbWl0dGVyIC0gVGhlIHRvcC1sZXZlbCBjbGFzcyB3aGljaCBjb29yZGluYXRlcyBjb25zdHJ1Y3Rpb24KKy8vLyBhbmQgZW1pc3Npb24gb2YgdGhlIGluc3RydWN0aW9uIHNlbGVjdG9yLgorLy8vCitjbGFzcyBGYXN0SVNlbEVtaXR0ZXIgOiBwdWJsaWMgVGFibGVHZW5CYWNrZW5kIHsKKyAgUmVjb3JkS2VlcGVyICZSZWNvcmRzOworICBDb2RlR2VuREFHUGF0dGVybnMgQ0dQOworcHVibGljOgorICBleHBsaWNpdCBGYXN0SVNlbEVtaXR0ZXIoUmVjb3JkS2VlcGVyICZSKTsKKworICAvLyBydW4gLSBPdXRwdXQgdGhlIGlzZWwsIHJldHVybmluZyB0cnVlIG9uIGZhaWx1cmUuCisgIHZvaWQgcnVuKHJhd19vc3RyZWFtICZPUyk7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0luc3RyRW51bUVtaXR0ZXIuY3BwIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vSW5zdHJFbnVtRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhODQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0luc3RyRW51bUVtaXR0ZXIuY3BwCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBJbnN0ckVudW1FbWl0dGVyLmNwcCAtIEdlbmVyYXRlIEluc3RydWN0aW9uIFNldCBFbnVtcyAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBlbnVtcyBmb3IgZWFjaCBtYWNoaW5lCisvLyBpbnN0cnVjdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiSW5zdHJFbnVtRW1pdHRlci5oIgorI2luY2x1ZGUgIkNvZGVHZW5UYXJnZXQuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlIDxjc3RkaW8+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8gcnVuRW51bXMgLSBQcmludCBvdXQgZW51bSB2YWx1ZXMgZm9yIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zLgordm9pZCBJbnN0ckVudW1FbWl0dGVyOjpydW4ocmF3X29zdHJlYW0gJk9TKSB7CisgIEVtaXRTb3VyY2VGaWxlSGVhZGVyKCJUYXJnZXQgSW5zdHJ1Y3Rpb24gRW51bSBWYWx1ZXMiLCBPUyk7CisgIE9TIDw8ICJuYW1lc3BhY2UgbGx2bSB7XG5cbiI7CisKKyAgQ29kZUdlblRhcmdldCBUYXJnZXQ7CisKKyAgLy8gV2UgbXVzdCBlbWl0IHRoZSBQSEkgb3Bjb2RlIGZpcnN0Li4uCisgIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZSA9IFRhcmdldC5nZXRJbnN0TmFtZXNwYWNlKCk7CisgIAorICBpZiAoTmFtZXNwYWNlLmVtcHR5KCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGluc3RydWN0aW9ucyBkZWZpbmVkIVxuIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbio+ICZOdW1iZXJlZEluc3RydWN0aW9ucyA9CisgICAgVGFyZ2V0LmdldEluc3RydWN0aW9uc0J5RW51bVZhbHVlKCk7CisKKyAgT1MgPDwgIm5hbWVzcGFjZSAiIDw8IE5hbWVzcGFjZSA8PCAiIHtcbiI7CisgIE9TIDw8ICIgIGVudW0ge1xuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE51bWJlcmVkSW5zdHJ1Y3Rpb25zLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBPUyA8PCAiICAgICIgPDwgTnVtYmVyZWRJbnN0cnVjdGlvbnNbaV0tPlRoZURlZi0+Z2V0TmFtZSgpCisgICAgICAgPDwgIlx0PSAiIDw8IGkgPDwgIixcbiI7CisgIH0KKyAgT1MgPDwgIiAgICBJTlNUUlVDVElPTl9MSVNUX0VORCA9ICIgPDwgTnVtYmVyZWRJbnN0cnVjdGlvbnMuc2l6ZSgpIDw8ICJcbiI7CisgIE9TIDw8ICIgIH07XG59XG4iOworICBPUyA8PCAifSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UgXG4iOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vSW5zdHJFbnVtRW1pdHRlci5oIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vSW5zdHJFbnVtRW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjhiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9JbnN0ckVudW1FbWl0dGVyLmgKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tIEluc3RyRW51bUVtaXR0ZXIuaCAtIEdlbmVyYXRlIEluc3RydWN0aW9uIFNldCBFbnVtcyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgaXMgcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGVudW1zIGZvciBlYWNoIG1hY2hpbmUKKy8vIGluc3RydWN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgSU5TVFJFTlVNX0VNSVRURVJfSAorI2RlZmluZSBJTlNUUkVOVU1fRU1JVFRFUl9ICisKKyNpbmNsdWRlICJUYWJsZUdlbkJhY2tlbmQuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBJbnN0ckVudW1FbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKK3B1YmxpYzoKKyAgSW5zdHJFbnVtRW1pdHRlcihSZWNvcmRLZWVwZXIgJlIpIDogUmVjb3JkcyhSKSB7fQorCisgIC8vIHJ1biAtIE91dHB1dCB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGRlc2NyaXB0aW9uLCByZXR1cm5pbmcgdHJ1ZSBvbiBmYWlsdXJlLgorICB2b2lkIHJ1bihyYXdfb3N0cmVhbSAmT1MpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9JbnN0ckluZm9FbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0luc3RySW5mb0VtaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkM2FhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9JbnN0ckluZm9FbWl0dGVyLmNwcApAQCAtMCwwICsxLDMzNSBAQAorLy89PT0tIEluc3RySW5mb0VtaXR0ZXIuY3BwIC0gR2VuZXJhdGUgYSBJbnN0cnVjdGlvbiBTZXQgRGVzYy4gLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgaXMgcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIHRhcmdldAorLy8gaW5zdHJ1Y3Rpb24gc2V0IGZvciB0aGUgY29kZSBnZW5lcmF0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkluc3RySW5mb0VtaXR0ZXIuaCIKKyNpbmNsdWRlICJDb2RlR2VuVGFyZ2V0LmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyB2b2lkIFByaW50RGVmTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmVXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW0sIHJhd19vc3RyZWFtICZPUykgeworICBPUyA8PCAic3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdCIgPDwgTnVtIDw8ICJbXSA9IHsgIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFVzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBPUyA8PCBnZXRRdWFsaWZpZWROYW1lKFVzZXNbaV0pIDw8ICIsICI7CisgIE9TIDw8ICIwIH07XG4iOworfQorCitzdGF0aWMgdm9pZCBQcmludEJhcnJpZXJzKHN0ZDo6dmVjdG9yPFJlY29yZCo+ICZCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgInN0YXRpYyBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBCYXJyaWVycyIgPDwgTnVtIDw8ICJbXSA9IHsgIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEJhcnJpZXJzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgT1MgPDwgIiYiIDw8IGdldFF1YWxpZmllZE5hbWUoQmFycmllcnNbaV0pIDw8ICJSZWdDbGFzcywgIjsKKyAgT1MgPDwgIk5VTEwgfTtcbiI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBJdGluZXJhcnkgSW5mb3JtYXRpb24uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIEluc3RySW5mb0VtaXR0ZXI6OkdhdGhlckl0aW5DbGFzc2VzKCkgeworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBEZWZMaXN0ID0KKyAgUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkluc3RySXRpbkNsYXNzIik7CisgIHN0ZDo6c29ydChEZWZMaXN0LmJlZ2luKCksIERlZkxpc3QuZW5kKCksIExlc3NSZWNvcmQoKSk7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBOID0gRGVmTGlzdC5zaXplKCk7IGkgPCBOOyBpKyspCisgICAgSXRpbkNsYXNzTWFwW0RlZkxpc3RbaV0tPmdldE5hbWUoKV0gPSBpOworfSAgCisKK3Vuc2lnbmVkIEluc3RySW5mb0VtaXR0ZXI6OmdldEl0aW5DbGFzc051bWJlcihjb25zdCBSZWNvcmQgKkluc3RSZWMpIHsKKyAgcmV0dXJuIEl0aW5DbGFzc01hcFtJbnN0UmVjLT5nZXRWYWx1ZUFzRGVmKCJJdGluZXJhcnkiKS0+Z2V0TmFtZSgpXTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE9wZXJhbmQgSW5mbyBFbWlzc2lvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPgorSW5zdHJJbmZvRW1pdHRlcjo6R2V0T3BlcmFuZEluZm8oY29uc3QgQ29kZUdlbkluc3RydWN0aW9uICZJbnN0KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBSZXN1bHQ7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5zdC5PcGVyYW5kTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gSGFuZGxlIGFnZ3JlZ2F0ZSBvcGVyYW5kcyBhbmQgbm9ybWFsIG9wZXJhbmRzIHRoZSBzYW1lIHdheSBieSBleHBhbmRpbmcKKyAgICAvLyBlaXRoZXIgY2FzZSBpbnRvIGEgbGlzdCBvZiBvcGVyYW5kcyBmb3IgdGhpcyBvcC4KKyAgICBzdGQ6OnZlY3RvcjxDb2RlR2VuSW5zdHJ1Y3Rpb246Ok9wZXJhbmRJbmZvPiBPcGVyYW5kTGlzdDsKKworICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBtdWx0aXBsZSBvcGVyYW5kIHRoaW5nLiAgVGFyZ2V0cyBsaWtlIFg4NiBoYXZlCisgICAgLy8gcmVnaXN0ZXJzIGluIHRoZWlyIG11bHRpLW9wZXJhbmQgb3BlcmFuZHMuICBJdCBtYXkgYWxzbyBiZSBhbiBhbm9ueW1vdXMKKyAgICAvLyBvcGVyYW5kLCB3aGljaCBoYXMgYSBzaW5nbGUgb3BlcmFuZCwgYnV0IG5vIGRlY2xhcmVkIGNsYXNzIGZvciB0aGUKKyAgICAvLyBvcGVyYW5kLgorICAgIERhZ0luaXQgKk1JT0kgPSBJbnN0Lk9wZXJhbmRMaXN0W2ldLk1JT3BlcmFuZEluZm87CisgICAgCisgICAgaWYgKCFNSU9JIHx8IE1JT0ktPmdldE51bUFyZ3MoKSA9PSAwKSB7CisgICAgICAvLyBTaW5nbGUsIGFub255bW91cywgb3BlcmFuZC4KKyAgICAgIE9wZXJhbmRMaXN0LnB1c2hfYmFjayhJbnN0Lk9wZXJhbmRMaXN0W2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZSA9IEluc3QuT3BlcmFuZExpc3RbaV0uTUlOdW1PcGVyYW5kczsgaiAhPSBlOyArK2opIHsKKyAgICAgICAgT3BlcmFuZExpc3QucHVzaF9iYWNrKEluc3QuT3BlcmFuZExpc3RbaV0pOworCisgICAgICAgIFJlY29yZCAqT3BSID0gZHluYW1pY19jYXN0PERlZkluaXQqPihNSU9JLT5nZXRBcmcoaikpLT5nZXREZWYoKTsKKyAgICAgICAgT3BlcmFuZExpc3QuYmFjaygpLlJlYyA9IE9wUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gT3BlcmFuZExpc3Quc2l6ZSgpOyBqICE9IGU7ICsraikgeworICAgICAgUmVjb3JkICpPcFIgPSBPcGVyYW5kTGlzdFtqXS5SZWM7CisgICAgICBzdGQ6OnN0cmluZyBSZXM7CisgICAgICAKKyAgICAgIGlmIChPcFItPmlzU3ViQ2xhc3NPZigiUmVnaXN0ZXJDbGFzcyIpKQorICAgICAgICBSZXMgKz0gZ2V0UXVhbGlmaWVkTmFtZShPcFIpICsgIlJlZ0NsYXNzSUQsICI7CisgICAgICBlbHNlIGlmIChPcFItPmlzU3ViQ2xhc3NPZigiUG9pbnRlckxpa2VSZWdDbGFzcyIpKQorICAgICAgICBSZXMgKz0gdXRvc3RyKE9wUi0+Z2V0VmFsdWVBc0ludCgiUmVnQ2xhc3NLaW5kIikpICsgIiwgIjsKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gLTEgbWVhbnMgdGhlIG9wZXJhbmQgZG9lcyBub3QgaGF2ZSBhIGZpeGVkIHJlZ2lzdGVyIGNsYXNzLgorICAgICAgICBSZXMgKz0gIi0xLCAiOworICAgICAgCisgICAgICAvLyBGaWxsIGluIGFwcGxpY2FibGUgZmxhZ3MuCisgICAgICBSZXMgKz0gIjAiOworICAgICAgICAKKyAgICAgIC8vIFB0ciB2YWx1ZSB3aG9zZSByZWdpc3RlciBjbGFzcyBpcyByZXNvbHZlZCB2aWEgY2FsbGJhY2suCisgICAgICBpZiAoT3BSLT5pc1N1YkNsYXNzT2YoIlBvaW50ZXJMaWtlUmVnQ2xhc3MiKSkKKyAgICAgICAgUmVzICs9ICJ8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpIjsKKworICAgICAgLy8gUHJlZGljYXRlIG9wZXJhbmRzLiAgQ2hlY2sgdG8gc2VlIGlmIHRoZSBvcmlnaW5hbCB1bmV4cGFuZGVkIG9wZXJhbmQKKyAgICAgIC8vIHdhcyBvZiB0eXBlIFByZWRpY2F0ZU9wZXJhbmQuCisgICAgICBpZiAoSW5zdC5PcGVyYW5kTGlzdFtpXS5SZWMtPmlzU3ViQ2xhc3NPZigiUHJlZGljYXRlT3BlcmFuZCIpKQorICAgICAgICBSZXMgKz0gInwoMTw8VE9JOjpQcmVkaWNhdGUpIjsKKyAgICAgICAgCisgICAgICAvLyBPcHRpb25hbCBkZWYgb3BlcmFuZHMuICBDaGVjayB0byBzZWUgaWYgdGhlIG9yaWdpbmFsIHVuZXhwYW5kZWQgb3BlcmFuZAorICAgICAgLy8gd2FzIG9mIHR5cGUgT3B0aW9uYWxEZWZPcGVyYW5kLgorICAgICAgaWYgKEluc3QuT3BlcmFuZExpc3RbaV0uUmVjLT5pc1N1YkNsYXNzT2YoIk9wdGlvbmFsRGVmT3BlcmFuZCIpKQorICAgICAgICBSZXMgKz0gInwoMTw8VE9JOjpPcHRpb25hbERlZikiOworCisgICAgICAvLyBGaWxsIGluIGNvbnN0cmFpbnQgaW5mby4KKyAgICAgIFJlcyArPSAiLCAiOworICAgICAgCisgICAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb246OkNvbnN0cmFpbnRJbmZvICZDb25zdHJhaW50ID0KKyAgICAgICAgSW5zdC5PcGVyYW5kTGlzdFtpXS5Db25zdHJhaW50c1tqXTsKKyAgICAgIGlmIChDb25zdHJhaW50LmlzTm9uZSgpKQorICAgICAgICBSZXMgKz0gIjAiOworICAgICAgZWxzZSBpZiAoQ29uc3RyYWludC5pc0Vhcmx5Q2xvYmJlcigpKQorICAgICAgICBSZXMgKz0gIigxIDw8IFRPSTo6RUFSTFlfQ0xPQkJFUikiOworICAgICAgZWxzZSB7CisgICAgICAgIGFzc2VydChDb25zdHJhaW50LmlzVGllZCgpKTsKKyAgICAgICAgUmVzICs9ICIoKCIgKyB1dG9zdHIoQ29uc3RyYWludC5nZXRUaWVkT3BlcmFuZCgpKSArCisgICAgICAgICAgICAgICAgICAgICIgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkiOworICAgICAgfQorICAgICAgICAKKyAgICAgIFJlc3VsdC5wdXNoX2JhY2soUmVzKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gUmVzdWx0OworfQorCit2b2lkIEluc3RySW5mb0VtaXR0ZXI6OkVtaXRPcGVyYW5kSW5mbyhyYXdfb3N0cmVhbSAmT1MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZEluZm9NYXBUeSAmT3BlcmFuZEluZm9JRHMpIHsKKyAgLy8gSUQgIzAgaXMgZm9yIG5vIG9wZXJhbmQgaW5mby4KKyAgdW5zaWduZWQgT3BlcmFuZExpc3ROdW0gPSAwOworICBPcGVyYW5kSW5mb0lEc1tzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKV0gPSArK09wZXJhbmRMaXN0TnVtOworICAKKyAgT1MgPDwgIlxuIjsKKyAgY29uc3QgQ29kZUdlblRhcmdldCAmVGFyZ2V0ID0gQ0RQLmdldFRhcmdldEluZm8oKTsKKyAgZm9yIChDb2RlR2VuVGFyZ2V0OjppbnN0X2l0ZXJhdG9yIElJID0gVGFyZ2V0Lmluc3RfYmVnaW4oKSwKKyAgICAgICBFID0gVGFyZ2V0Lmluc3RfZW5kKCk7IElJICE9IEU7ICsrSUkpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gT3BlcmFuZEluZm8gPSBHZXRPcGVyYW5kSW5mbygqKklJKTsKKyAgICB1bnNpZ25lZCAmTiA9IE9wZXJhbmRJbmZvSURzW09wZXJhbmRJbmZvXTsKKyAgICBpZiAoTiAhPSAwKSBjb250aW51ZTsKKyAgICAKKyAgICBOID0gKytPcGVyYW5kTGlzdE51bTsKKyAgICBPUyA8PCAic3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvIiA8PCBOIDw8ICJbXSA9IHsgIjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3BlcmFuZEluZm8uc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIE9TIDw8ICJ7ICIgPDwgT3BlcmFuZEluZm9baV0gPDwgIiB9LCAiOworICAgIE9TIDw8ICJ9O1xuIjsKKyAgfQorfQorCit2b2lkIEluc3RySW5mb0VtaXR0ZXI6OkRldGVjdFJlZ2lzdGVyQ2xhc3NCYXJyaWVycyhzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmRGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb2RlR2VuUmVnaXN0ZXJDbGFzcz4gJlJDcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmQmFycmllcnMpIHsKKyAgc3RkOjpzZXQ8UmVjb3JkKj4gRGVmU2V0OworICB1bnNpZ25lZCBOdW1EZWZzID0gRGVmcy5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1EZWZzOyArK2kpCisgICAgRGVmU2V0Lmluc2VydChEZWZzW2ldKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUkNzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBDb2RlR2VuUmVnaXN0ZXJDbGFzcyAmUkMgPSBSQ3NbaV07CisgICAgdW5zaWduZWQgTnVtUmVncyA9IFJDLkVsZW1lbnRzLnNpemUoKTsKKyAgICBpZiAoTnVtUmVncyA+IE51bURlZnMpCisgICAgICBjb250aW51ZTsgLy8gQ2FuJ3QgcG9zc2libHkgY2xvYmJlciB0aGlzIFJDLgorCisgICAgYm9vbCBDbG9iYmVyID0gdHJ1ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgTnVtUmVnczsgKytqKSB7CisgICAgICBSZWNvcmQgKlJlZyA9IFJDLkVsZW1lbnRzW2pdOworICAgICAgaWYgKCFEZWZTZXQuY291bnQoUmVnKSkgeworICAgICAgICBDbG9iYmVyID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoQ2xvYmJlcikKKyAgICAgIEJhcnJpZXJzLnB1c2hfYmFjayhSQy5UaGVEZWYpOworICB9Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYWluIE91dHB1dC4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIHJ1biAtIEVtaXQgdGhlIG1haW4gaW5zdHJ1Y3Rpb24gZGVzY3JpcHRpb24gcmVjb3JkcyBmb3IgdGhlIHRhcmdldC4uLgordm9pZCBJbnN0ckluZm9FbWl0dGVyOjpydW4ocmF3X29zdHJlYW0gJk9TKSB7CisgIEdhdGhlckl0aW5DbGFzc2VzKCk7CisKKyAgRW1pdFNvdXJjZUZpbGVIZWFkZXIoIlRhcmdldCBJbnN0cnVjdGlvbiBEZXNjcmlwdG9ycyIsIE9TKTsKKyAgT1MgPDwgIm5hbWVzcGFjZSBsbHZtIHtcblxuIjsKKworICBDb2RlR2VuVGFyZ2V0ICZUYXJnZXQgPSBDRFAuZ2V0VGFyZ2V0SW5mbygpOworICBjb25zdCBzdGQ6OnN0cmluZyAmVGFyZ2V0TmFtZSA9IFRhcmdldC5nZXROYW1lKCk7CisgIFJlY29yZCAqSW5zdHJJbmZvID0gVGFyZ2V0LmdldEluc3RydWN0aW9uU2V0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3RlckNsYXNzPiAmUkNzID0gVGFyZ2V0LmdldFJlZ2lzdGVyQ2xhc3NlcygpOworCisgIC8vIEtlZXAgdHJhY2sgb2YgYWxsIG9mIHRoZSBkZWYgbGlzdHMgd2UgaGF2ZSBlbWl0dGVkIGFscmVhZHkuCisgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPFJlY29yZCo+LCB1bnNpZ25lZD4gRW1pdHRlZExpc3RzOworICB1bnNpZ25lZCBMaXN0TnVtYmVyID0gMDsKKyAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8UmVjb3JkKj4sIHVuc2lnbmVkPiBFbWl0dGVkQmFycmllcnM7CisgIHVuc2lnbmVkIEJhcnJpZXJOdW1iZXIgPSAwOworICBzdGQ6Om1hcDxSZWNvcmQqLCB1bnNpZ25lZD4gQmFycmllcnNNYXA7CisgCisgIC8vIEVtaXQgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbidzIGltcGxpY2l0IHVzZXMgYW5kIGRlZnMuCisgIGZvciAoQ29kZUdlblRhcmdldDo6aW5zdF9pdGVyYXRvciBJSSA9IFRhcmdldC5pbnN0X2JlZ2luKCksCisgICAgICAgICBFID0gVGFyZ2V0Lmluc3RfZW5kKCk7IElJICE9IEU7ICsrSUkpIHsKKyAgICBSZWNvcmQgKkluc3QgPSAoKklJKS0+VGhlRGVmOworICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFVzZXMgPSBJbnN0LT5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiVXNlcyIpOworICAgIGlmICghVXNlcy5lbXB0eSgpKSB7CisgICAgICB1bnNpZ25lZCAmSUwgPSBFbWl0dGVkTGlzdHNbVXNlc107CisgICAgICBpZiAoIUlMKSBQcmludERlZkxpc3QoVXNlcywgSUwgPSArK0xpc3ROdW1iZXIsIE9TKTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gRGVmcyA9IEluc3QtPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJEZWZzIik7CisgICAgaWYgKCFEZWZzLmVtcHR5KCkpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFJDQmFycmllcnM7CisgICAgICBEZXRlY3RSZWdpc3RlckNsYXNzQmFycmllcnMoRGVmcywgUkNzLCBSQ0JhcnJpZXJzKTsKKyAgICAgIGlmICghUkNCYXJyaWVycy5lbXB0eSgpKSB7CisgICAgICAgIHVuc2lnbmVkICZJQiA9IEVtaXR0ZWRCYXJyaWVyc1tSQ0JhcnJpZXJzXTsKKyAgICAgICAgaWYgKCFJQikgUHJpbnRCYXJyaWVycyhSQ0JhcnJpZXJzLCBJQiA9ICsrQmFycmllck51bWJlciwgT1MpOworICAgICAgICBCYXJyaWVyc01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSW5zdCwgSUIpKTsKKyAgICAgIH0KKworICAgICAgdW5zaWduZWQgJklMID0gRW1pdHRlZExpc3RzW0RlZnNdOworICAgICAgaWYgKCFJTCkgUHJpbnREZWZMaXN0KERlZnMsIElMID0gKytMaXN0TnVtYmVyLCBPUyk7CisgICAgfQorICB9CisKKyAgT3BlcmFuZEluZm9NYXBUeSBPcGVyYW5kSW5mb0lEczsKKyAgCisgIC8vIEVtaXQgYWxsIG9mIHRoZSBvcGVyYW5kIGluZm8gcmVjb3Jkcy4KKyAgRW1pdE9wZXJhbmRJbmZvKE9TLCBPcGVyYW5kSW5mb0lEcyk7CisgIAorICAvLyBFbWl0IGFsbCBvZiB0aGUgVGFyZ2V0SW5zdHJEZXNjIHJlY29yZHMgaW4gdGhlaXIgRU5VTSBvcmRlcmluZy4KKyAgLy8KKyAgT1MgPDwgIlxuc3RhdGljIGNvbnN0IFRhcmdldEluc3RyRGVzYyAiIDw8IFRhcmdldE5hbWUKKyAgICAgPDwgIkluc3RzW10gPSB7XG4iOworICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24qPiAmTnVtYmVyZWRJbnN0cnVjdGlvbnMgPQorICAgIFRhcmdldC5nZXRJbnN0cnVjdGlvbnNCeUVudW1WYWx1ZSgpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1iZXJlZEluc3RydWN0aW9ucy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGVtaXRSZWNvcmQoKk51bWJlcmVkSW5zdHJ1Y3Rpb25zW2ldLCBpLCBJbnN0ckluZm8sIEVtaXR0ZWRMaXN0cywKKyAgICAgICAgICAgICAgIEJhcnJpZXJzTWFwLCBPcGVyYW5kSW5mb0lEcywgT1MpOworICBPUyA8PCAifTtcbiI7CisgIE9TIDw8ICJ9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZSBcbiI7Cit9CisKK3ZvaWQgSW5zdHJJbmZvRW1pdHRlcjo6ZW1pdFJlY29yZChjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24gJkluc3QsIHVuc2lnbmVkIE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmQgKkluc3RySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnZlY3RvcjxSZWNvcmQqPiwgdW5zaWduZWQ+ICZFbWl0dGVkTGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8UmVjb3JkKiwgdW5zaWduZWQ+ICZCYXJyaWVyc01hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcGVyYW5kSW5mb01hcFR5ICZPcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSB7CisgIGludCBNaW5PcGVyYW5kcyA9IDA7CisgIGlmICghSW5zdC5PcGVyYW5kTGlzdC5lbXB0eSgpKQorICAgIC8vIEVhY2ggbG9naWNhbCBvcGVyYW5kIGNhbiBiZSBtdWx0aXBsZSBNSSBvcGVyYW5kcy4KKyAgICBNaW5PcGVyYW5kcyA9IEluc3QuT3BlcmFuZExpc3QuYmFjaygpLk1JT3BlcmFuZE5vICsKKyAgICAgICAgICAgICAgICAgIEluc3QuT3BlcmFuZExpc3QuYmFjaygpLk1JTnVtT3BlcmFuZHM7CisKKyAgT1MgPDwgIiAgeyAiOworICBPUyA8PCBOdW0gPDwgIixcdCIgPDwgTWluT3BlcmFuZHMgPDwgIixcdCIKKyAgICAgPDwgSW5zdC5OdW1EZWZzIDw8ICIsXHQiIDw8IGdldEl0aW5DbGFzc051bWJlcihJbnN0LlRoZURlZikKKyAgICAgPDwgIixcdFwiIiA8PCBJbnN0LlRoZURlZi0+Z2V0TmFtZSgpIDw8ICJcIiwgMCI7CisKKyAgLy8gRW1pdCBhbGwgb2YgdGhlIHRhcmdldCBpbmRlcGVkZW50IGZsYWdzLi4uCisgIGlmIChJbnN0LmlzUmV0dXJuKSAgICAgICAgICAgT1MgPDwgInwoMTw8VElEOjpSZXR1cm4pIjsKKyAgaWYgKEluc3QuaXNCcmFuY2gpICAgICAgICAgICBPUyA8PCAifCgxPDxUSUQ6OkJyYW5jaCkiOworICBpZiAoSW5zdC5pc0luZGlyZWN0QnJhbmNoKSAgIE9TIDw8ICJ8KDE8PFRJRDo6SW5kaXJlY3RCcmFuY2gpIjsKKyAgaWYgKEluc3QuaXNDb21wYXJlKSAgICAgICAgICBPUyA8PCAifCgxPDxUSUQ6OkNvbXBhcmUpIjsKKyAgaWYgKEluc3QuaXNCYXJyaWVyKSAgICAgICAgICBPUyA8PCAifCgxPDxUSUQ6OkJhcnJpZXIpIjsKKyAgaWYgKEluc3QuaGFzRGVsYXlTbG90KSAgICAgICBPUyA8PCAifCgxPDxUSUQ6OkRlbGF5U2xvdCkiOworICBpZiAoSW5zdC5pc0NhbGwpICAgICAgICAgICAgIE9TIDw8ICJ8KDE8PFRJRDo6Q2FsbCkiOworICBpZiAoSW5zdC5jYW5Gb2xkQXNMb2FkKSAgICAgIE9TIDw8ICJ8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpIjsKKyAgaWYgKEluc3QubWF5TG9hZCkgICAgICAgICAgICBPUyA8PCAifCgxPDxUSUQ6Ok1heUxvYWQpIjsKKyAgaWYgKEluc3QubWF5U3RvcmUpICAgICAgICAgICBPUyA8PCAifCgxPDxUSUQ6Ok1heVN0b3JlKSI7CisgIGlmIChJbnN0LmlzUHJlZGljYWJsZSkgICAgICAgT1MgPDwgInwoMTw8VElEOjpQcmVkaWNhYmxlKSI7CisgIGlmIChJbnN0LmlzQ29udmVydGlibGVUb1RocmVlQWRkcmVzcykgT1MgPDwgInwoMTw8VElEOjpDb252ZXJ0aWJsZVRvM0FkZHIpIjsKKyAgaWYgKEluc3QuaXNDb21tdXRhYmxlKSAgICAgICBPUyA8PCAifCgxPDxUSUQ6OkNvbW11dGFibGUpIjsKKyAgaWYgKEluc3QuaXNUZXJtaW5hdG9yKSAgICAgICBPUyA8PCAifCgxPDxUSUQ6OlRlcm1pbmF0b3IpIjsKKyAgaWYgKEluc3QuaXNSZU1hdGVyaWFsaXphYmxlKSBPUyA8PCAifCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpIjsKKyAgaWYgKEluc3QuaXNOb3REdXBsaWNhYmxlKSAgICBPUyA8PCAifCgxPDxUSUQ6Ok5vdER1cGxpY2FibGUpIjsKKyAgaWYgKEluc3QuaGFzT3B0aW9uYWxEZWYpICAgICBPUyA8PCAifCgxPDxUSUQ6Okhhc09wdGlvbmFsRGVmKSI7CisgIGlmIChJbnN0LnVzZXNDdXN0b21JbnNlcnRlcikgT1MgPDwgInwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpIjsKKyAgaWYgKEluc3QuaXNWYXJpYWRpYykgICAgICAgICBPUyA8PCAifCgxPDxUSUQ6OlZhcmlhZGljKSI7CisgIGlmIChJbnN0Lmhhc1NpZGVFZmZlY3RzKSAgICAgT1MgPDwgInwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cykiOworICBpZiAoSW5zdC5pc0FzQ2hlYXBBc0FNb3ZlKSAgIE9TIDw8ICJ8KDE8PFRJRDo6Q2hlYXBBc0FNb3ZlKSI7CisgIGlmIChJbnN0Lmhhc0V4dHJhU3JjUmVnQWxsb2NSZXEpIE9TIDw8ICJ8KDE8PFRJRDo6RXh0cmFTcmNSZWdBbGxvY1JlcSkiOworICBpZiAoSW5zdC5oYXNFeHRyYURlZlJlZ0FsbG9jUmVxKSBPUyA8PCAifCgxPDxUSUQ6OkV4dHJhRGVmUmVnQWxsb2NSZXEpIjsKKworICAvLyBFbWl0IGFsbCBvZiB0aGUgdGFyZ2V0LXNwZWNpZmljIGZsYWdzLi4uCisgIEJpdHNJbml0ICpUU0YgPSBJbnN0LlRoZURlZi0+Z2V0VmFsdWVBc0JpdHNJbml0KCJUU0ZsYWdzIik7CisgIGlmICghVFNGKSB0aHJvdyAibm8gVFNGbGFncz8iOworICB1aW50NjRfdCBWYWx1ZSA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUU0YtPmdldE51bUJpdHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoQml0SW5pdCAqQml0ID0gZHluYW1pY19jYXN0PEJpdEluaXQqPihUU0YtPmdldEJpdChpKSkpCisgICAgICBWYWx1ZSB8PSB1aW50NjRfdChCaXQtPmdldFZhbHVlKCkpIDw8IGk7CisgICAgZWxzZQorICAgICAgdGhyb3cgIkludmFsaWQgVFNGbGFncyBiaXQgaW4gIiArIEluc3QuVGhlRGVmLT5nZXROYW1lKCk7CisgIH0KKyAgT1MgPDwgIiwgMHgiOworICBPUy53cml0ZV9oZXgoVmFsdWUpOworICBPUyA8PCAiVUxMLCAiOworCisgIC8vIEVtaXQgdGhlIGltcGxpY2l0IHVzZXMgYW5kIGRlZnMgbGlzdHMuLi4KKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gVXNlTGlzdCA9IEluc3QuVGhlRGVmLT5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiVXNlcyIpOworICBpZiAoVXNlTGlzdC5lbXB0eSgpKQorICAgIE9TIDw8ICJOVUxMLCAiOworICBlbHNlCisgICAgT1MgPDwgIkltcGxpY2l0TGlzdCIgPDwgRW1pdHRlZExpc3RzW1VzZUxpc3RdIDw8ICIsICI7CisKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gRGVmTGlzdCA9IEluc3QuVGhlRGVmLT5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiRGVmcyIpOworICBpZiAoRGVmTGlzdC5lbXB0eSgpKQorICAgIE9TIDw8ICJOVUxMLCAiOworICBlbHNlCisgICAgT1MgPDwgIkltcGxpY2l0TGlzdCIgPDwgRW1pdHRlZExpc3RzW0RlZkxpc3RdIDw8ICIsICI7CisKKyAgc3RkOjptYXA8UmVjb3JkKiwgdW5zaWduZWQ+OjppdGVyYXRvciBCSSA9IEJhcnJpZXJzTWFwLmZpbmQoSW5zdC5UaGVEZWYpOworICBpZiAoQkkgPT0gQmFycmllcnNNYXAuZW5kKCkpCisgICAgT1MgPDwgIk5VTEwsICI7CisgIGVsc2UKKyAgICBPUyA8PCAiQmFycmllcnMiIDw8IEJJLT5zZWNvbmQgPDwgIiwgIjsKKworICAvLyBFbWl0IHRoZSBvcGVyYW5kIGluZm8uCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBPcGVyYW5kSW5mbyA9IEdldE9wZXJhbmRJbmZvKEluc3QpOworICBpZiAoT3BlcmFuZEluZm8uZW1wdHkoKSkKKyAgICBPUyA8PCAiMCI7CisgIGVsc2UKKyAgICBPUyA8PCAiT3BlcmFuZEluZm8iIDw8IE9wSW5mby5maW5kKE9wZXJhbmRJbmZvKS0+c2Vjb25kOworCisgIE9TIDw8ICIgfSwgIC8vIEluc3QgIyIgPDwgTnVtIDw8ICIgPSAiIDw8IEluc3QuVGhlRGVmLT5nZXROYW1lKCkgPDwgIlxuIjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0luc3RySW5mb0VtaXR0ZXIuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0luc3RySW5mb0VtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmIxYzZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vSW5zdHJJbmZvRW1pdHRlci5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vPT09LSBJbnN0ckluZm9FbWl0dGVyLmggLSBHZW5lcmF0ZSBhIEluc3RydWN0aW9uIFNldCBEZXNjLiAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0YXJnZXQKKy8vIGluc3RydWN0aW9uIHNldCBmb3IgdGhlIGNvZGUgZ2VuZXJhdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgSU5TVFJJTkZPX0VNSVRURVJfSAorI2RlZmluZSBJTlNUUklORk9fRU1JVFRFUl9ICisKKyNpbmNsdWRlICJUYWJsZUdlbkJhY2tlbmQuaCIKKyNpbmNsdWRlICJDb2RlR2VuREFHUGF0dGVybnMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFN0cmluZ0luaXQ7CitjbGFzcyBJbnRJbml0OworY2xhc3MgTGlzdEluaXQ7CitjbGFzcyBDb2RlR2VuSW5zdHJ1Y3Rpb247CisKK2NsYXNzIEluc3RySW5mb0VtaXR0ZXIgOiBwdWJsaWMgVGFibGVHZW5CYWNrZW5kIHsKKyAgUmVjb3JkS2VlcGVyICZSZWNvcmRzOworICBDb2RlR2VuREFHUGF0dGVybnMgQ0RQOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdW5zaWduZWQ+IEl0aW5DbGFzc01hcDsKKyAgCitwdWJsaWM6CisgIEluc3RySW5mb0VtaXR0ZXIoUmVjb3JkS2VlcGVyICZSKSA6IFJlY29yZHMoUiksIENEUChSKSB7IH0KKworICAvLyBydW4gLSBPdXRwdXQgdGhlIGluc3RydWN0aW9uIHNldCBkZXNjcmlwdGlvbiwgcmV0dXJuaW5nIHRydWUgb24gZmFpbHVyZS4KKyAgdm9pZCBydW4ocmF3X29zdHJlYW0gJk9TKTsKKworcHJpdmF0ZToKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4sIHVuc2lnbmVkPiBPcGVyYW5kSW5mb01hcFR5OworICAKKyAgdm9pZCBlbWl0UmVjb3JkKGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmSW5zdCwgdW5zaWduZWQgTnVtLAorICAgICAgICAgICAgICAgICAgUmVjb3JkICpJbnN0ckluZm8sIAorICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8UmVjb3JkKj4sIHVuc2lnbmVkPiAmRUwsCisgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxSZWNvcmQqLCB1bnNpZ25lZD4gJkJNLAorICAgICAgICAgICAgICAgICAgY29uc3QgT3BlcmFuZEluZm9NYXBUeSAmT3BJbmZvLAorICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKKworICAvLyBJdGluZXJhcnkgaW5mb3JtYXRpb24uCisgIHZvaWQgR2F0aGVySXRpbkNsYXNzZXMoKTsKKyAgdW5zaWduZWQgZ2V0SXRpbkNsYXNzTnVtYmVyKGNvbnN0IFJlY29yZCAqSW5zdFJlYyk7CisgIAorICAvLyBPcGVyYW5kIGluZm9ybWF0aW9uLgorICB2b2lkIEVtaXRPcGVyYW5kSW5mbyhyYXdfb3N0cmVhbSAmT1MsIE9wZXJhbmRJbmZvTWFwVHkgJk9wZXJhbmRJbmZvSURzKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldE9wZXJhbmRJbmZvKGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmSW5zdCk7CisKKyAgdm9pZCBEZXRlY3RSZWdpc3RlckNsYXNzQmFycmllcnMoc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJkRlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3RlckNsYXNzPiAmUkNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmQmFycmllcnMpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9JbnRyaW5zaWNFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0ludHJpbnNpY0VtaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzBkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9JbnRyaW5zaWNFbWl0dGVyLmNwcApAQCAtMCwwICsxLDc1MSBAQAorLy89PT0tIEludHJpbnNpY0VtaXR0ZXIuY3BwIC0gR2VuZXJhdGUgaW50cmluc2ljIGluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgZW1pdHMgaW5mb3JtYXRpb24gYWJvdXQgaW50cmluc2ljIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiQ29kZUdlblRhcmdldC5oIgorI2luY2x1ZGUgIkludHJpbnNpY0VtaXR0ZXIuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEludHJpbnNpY0VtaXR0ZXIgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgSW50cmluc2ljRW1pdHRlcjo6cnVuKHJhd19vc3RyZWFtICZPUykgeworICBFbWl0U291cmNlRmlsZUhlYWRlcigiSW50cmluc2ljIEZ1bmN0aW9uIFNvdXJjZSBGcmFnbWVudCIsIE9TKTsKKyAgCisgIHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+IEludHMgPSBMb2FkSW50cmluc2ljcyhSZWNvcmRzLCBUYXJnZXRPbmx5KTsKKyAgCisgIGlmIChUYXJnZXRPbmx5ICYmICFJbnRzLmVtcHR5KCkpCisgICAgVGFyZ2V0UHJlZml4ID0gSW50c1swXS5UYXJnZXRQcmVmaXg7CisKKyAgRW1pdFByZWZpeChPUyk7CisKKyAgLy8gRW1pdCB0aGUgZW51bSBpbmZvcm1hdGlvbi4KKyAgRW1pdEVudW1JbmZvKEludHMsIE9TKTsKKworICAvLyBFbWl0IHRoZSBpbnRyaW5zaWMgSUQgLT4gbmFtZSB0YWJsZS4KKyAgRW1pdEludHJpbnNpY1RvTmFtZVRhYmxlKEludHMsIE9TKTsKKworICAvLyBFbWl0IHRoZSBpbnRyaW5zaWMgSUQgLT4gb3ZlcmxvYWQgdGFibGUuCisgIEVtaXRJbnRyaW5zaWNUb092ZXJsb2FkVGFibGUoSW50cywgT1MpOworCisgIC8vIEVtaXQgdGhlIGZ1bmN0aW9uIG5hbWUgcmVjb2duaXplci4KKyAgRW1pdEZuTmFtZVJlY29nbml6ZXIoSW50cywgT1MpOworICAKKyAgLy8gRW1pdCB0aGUgaW50cmluc2ljIHZlcmlmaWVyLgorICBFbWl0VmVyaWZpZXIoSW50cywgT1MpOworICAKKyAgLy8gRW1pdCB0aGUgaW50cmluc2ljIGRlY2xhcmF0aW9uIGdlbmVyYXRvci4KKyAgRW1pdEdlbmVyYXRvcihJbnRzLCBPUyk7CisgIAorICAvLyBFbWl0IHRoZSBpbnRyaW5zaWMgcGFyYW1ldGVyIGF0dHJpYnV0ZXMuCisgIEVtaXRBdHRyaWJ1dGVzKEludHMsIE9TKTsKKworICAvLyBFbWl0IGludHJpbnNpYyBhbGlhcyBhbmFseXNpcyBtb2QvcmVmIGJlaGF2aW9yLgorICBFbWl0TW9kUmVmQmVoYXZpb3IoSW50cywgT1MpOworCisgIC8vIEVtaXQgYSBsaXN0IG9mIGludHJpbnNpY3Mgd2l0aCBjb3JyZXNwb25kaW5nIEdDQyBidWlsdGlucy4KKyAgRW1pdEdDQ0J1aWx0aW5MaXN0KEludHMsIE9TKTsKKworICAvLyBFbWl0IGNvZGUgdG8gdHJhbnNsYXRlIEdDQyBidWlsdGlucyBpbnRvIExMVk0gaW50cmluc2ljcy4KKyAgRW1pdEludHJpbnNpY1RvR0NDQnVpbHRpbk1hcChJbnRzLCBPUyk7CisKKyAgRW1pdFN1ZmZpeChPUyk7Cit9CisKK3ZvaWQgSW50cmluc2ljRW1pdHRlcjo6RW1pdFByZWZpeChyYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgIi8vIFZpc3VhbFN0dWRpbyBkZWZpbmVzIHNldGptcCBhcyBfc2V0am1wXG4iCisgICAgICAgICIjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChzZXRqbXApXG4iCisgICAgICAgICIjZGVmaW5lIHNldGptcF91bmRlZmluZWRfZm9yX3Zpc3VhbF9zdHVkaW9cbiIKKyAgICAgICAgIiN1bmRlZiBzZXRqbXBcbiIKKyAgICAgICAgIiNlbmRpZlxuXG4iOworfQorCit2b2lkIEludHJpbnNpY0VtaXR0ZXI6OkVtaXRTdWZmaXgocmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICIjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChzZXRqbXBfdW5kZWZpbmVkX2Zvcl92aXN1YWxfc3R1ZGlvKVxuIgorICAgICAgICAiLy8gbGV0J3MgcmV0dXJuIGl0IHRvIF9zZXRqbXAgc3RhdGVcbiIKKyAgICAgICAgIiNkZWZpbmUgc2V0am1wIF9zZXRqbXBcbiIKKyAgICAgICAgIiNlbmRpZlxuXG4iOworfQorCit2b2lkIEludHJpbnNpY0VtaXR0ZXI6OkVtaXRFbnVtSW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxDb2RlR2VuSW50cmluc2ljPiAmSW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgeworICBPUyA8PCAiLy8gRW51bSB2YWx1ZXMgZm9yIEludHJpbnNpY3MuaFxuIjsKKyAgT1MgPDwgIiNpZmRlZiBHRVRfSU5UUklOU0lDX0VOVU1fVkFMVUVTXG4iOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW50cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgT1MgPDwgIiAgICAiIDw8IEludHNbaV0uRW51bU5hbWU7CisgICAgT1MgPDwgKChpICE9IGUtMSkgPyAiLCAiIDogIiAgIik7CisgICAgT1MgPDwgc3RkOjpzdHJpbmcoNDAtSW50c1tpXS5FbnVtTmFtZS5zaXplKCksICcgJykgCisgICAgICA8PCAiLy8gIiA8PCBJbnRzW2ldLk5hbWUgPDwgIlxuIjsKKyAgfQorICBPUyA8PCAiI2VuZGlmXG5cbiI7Cit9CisKK3ZvaWQgSW50cmluc2ljRW1pdHRlcjo6CitFbWl0Rm5OYW1lUmVjb2duaXplcihjb25zdCBzdGQ6OnZlY3RvcjxDb2RlR2VuSW50cmluc2ljPiAmSW50cywgCisgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gQnVpbGQgYSBmdW5jdGlvbiBuYW1lIC0+IGludHJpbnNpYyBuYW1lIG1hcHBpbmcuCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB1bnNpZ25lZD4gSW50TWFwcGluZzsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEludHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBJbnRNYXBwaW5nW0ludHNbaV0uTmFtZV0gPSBpOworICAgIAorICBPUyA8PCAiLy8gRnVuY3Rpb24gbmFtZSAtPiBlbnVtIHZhbHVlIHJlY29nbml6ZXIgY29kZS5cbiI7CisgIE9TIDw8ICIjaWZkZWYgR0VUX0ZVTkNUSU9OX1JFQ09HTklaRVJcbiI7CisgIE9TIDw8ICIgIHN3aXRjaCAoTmFtZVs1XSkge1xuIjsKKyAgT1MgPDwgIiAgZGVmYXVsdDpcbiI7CisgIC8vIEVtaXQgdGhlIGludHJpbnNpY3MgaW4gc29ydGVkIG9yZGVyLgorICBjaGFyIExhc3RDaGFyID0gMDsKKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdW5zaWduZWQ+OjppdGVyYXRvciBJID0gSW50TWFwcGluZy5iZWdpbigpLAorICAgICAgIEUgPSBJbnRNYXBwaW5nLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGlmIChJLT5maXJzdFs1XSAhPSBMYXN0Q2hhcikgeworICAgICAgTGFzdENoYXIgPSBJLT5maXJzdFs1XTsKKyAgICAgIE9TIDw8ICIgICAgYnJlYWs7XG4iOworICAgICAgT1MgPDwgIiAgY2FzZSAnIiA8PCBMYXN0Q2hhciA8PCAiJzpcbiI7CisgICAgfQorICAgIAorICAgIC8vIEZvciBvdmVybG9hZGVkIGludHJpbnNpY3MsIG9ubHkgdGhlIHByZWZpeCBuZWVkcyB0byBtYXRjaAorICAgIGlmIChJbnRzW0ktPnNlY29uZF0uaXNPdmVybG9hZGVkKQorICAgICAgT1MgPDwgIiAgICBpZiAoTGVuID4gIiA8PCBJLT5maXJzdC5zaXplKCkKKyAgICAgICA8PCAiICYmICFtZW1jbXAoTmFtZSwgXCIiIDw8IEktPmZpcnN0IDw8ICIuXCIsICIKKyAgICAgICA8PCAoSS0+Zmlyc3Quc2l6ZSgpICsgMSkgPDwgIikpIHJldHVybiAiIDw8IFRhcmdldFByZWZpeCA8PCAiSW50cmluc2ljOjoiCisgICAgICAgPDwgSW50c1tJLT5zZWNvbmRdLkVudW1OYW1lIDw8ICI7XG4iOworICAgIGVsc2UgCisgICAgICBPUyA8PCAiICAgIGlmIChMZW4gPT0gIiA8PCBJLT5maXJzdC5zaXplKCkKKyAgICAgICAgIDw8ICIgJiYgIW1lbWNtcChOYW1lLCBcIiIgPDwgSS0+Zmlyc3QgPDwgIlwiLCAiCisgICAgICAgICA8PCBJLT5maXJzdC5zaXplKCkgPDwgIikpIHJldHVybiAiIDw8IFRhcmdldFByZWZpeCA8PCAiSW50cmluc2ljOjoiCisgICAgICAgICA8PCBJbnRzW0ktPnNlY29uZF0uRW51bU5hbWUgPDwgIjtcbiI7CisgIH0KKyAgT1MgPDwgIiAgfVxuIjsKKyAgT1MgPDwgIiNlbmRpZlxuXG4iOworfQorCit2b2lkIEludHJpbnNpY0VtaXR0ZXI6OgorRW1pdEludHJpbnNpY1RvTmFtZVRhYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+ICZJbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgIi8vIEludHJpbnNpYyBJRCB0byBuYW1lIHRhYmxlXG4iOworICBPUyA8PCAiI2lmZGVmIEdFVF9JTlRSSU5TSUNfTkFNRV9UQUJMRVxuIjsKKyAgT1MgPDwgIiAgLy8gTm90ZSB0aGF0IGVudHJ5ICMwIGlzIHRoZSBpbnZhbGlkIGludHJpbnNpYyFcbiI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgT1MgPDwgIiAgXCIiIDw8IEludHNbaV0uTmFtZSA8PCAiXCIsXG4iOworICBPUyA8PCAiI2VuZGlmXG5cbiI7Cit9CisKK3ZvaWQgSW50cmluc2ljRW1pdHRlcjo6CitFbWl0SW50cmluc2ljVG9PdmVybG9hZFRhYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+ICZJbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgIi8vIEludHJpbnNpYyBJRCB0byBvdmVybG9hZCB0YWJsZVxuIjsKKyAgT1MgPDwgIiNpZmRlZiBHRVRfSU5UUklOU0lDX09WRVJMT0FEX1RBQkxFXG4iOworICBPUyA8PCAiICAvLyBOb3RlIHRoYXQgZW50cnkgIzAgaXMgdGhlIGludmFsaWQgaW50cmluc2ljIVxuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEludHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIE9TIDw8ICIgICI7CisgICAgaWYgKEludHNbaV0uaXNPdmVybG9hZGVkKQorICAgICAgT1MgPDwgInRydWUiOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICJmYWxzZSI7CisgICAgT1MgPDwgIixcbiI7CisgIH0KKyAgT1MgPDwgIiNlbmRpZlxuXG4iOworfQorCitzdGF0aWMgdm9pZCBFbWl0VHlwZUZvclZhbHVlVHlwZShyYXdfb3N0cmVhbSAmT1MsIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUKSB7CisgIGlmIChFVlQoVlQpLmlzSW50ZWdlcigpKSB7CisgICAgdW5zaWduZWQgQml0V2lkdGggPSBFVlQoVlQpLmdldFNpemVJbkJpdHMoKTsKKyAgICBPUyA8PCAiSW50ZWdlclR5cGU6OmdldChDb250ZXh0LCAiIDw8IEJpdFdpZHRoIDw8ICIpIjsKKyAgfSBlbHNlIGlmIChWVCA9PSBNVlQ6Ok90aGVyKSB7CisgICAgLy8gTVZUOjpPdGhlclZUIGlzIHVzZWQgdG8gbWVhbiB0aGUgZW1wdHkgc3RydWN0IHR5cGUgaGVyZS4KKyAgICBPUyA8PCAiU3RydWN0VHlwZTo6Z2V0KENvbnRleHQpIjsKKyAgfSBlbHNlIGlmIChWVCA9PSBNVlQ6OmYzMikgeworICAgIE9TIDw8ICJUeXBlOjpnZXRGbG9hdFR5KENvbnRleHQpIjsKKyAgfSBlbHNlIGlmIChWVCA9PSBNVlQ6OmY2NCkgeworICAgIE9TIDw8ICJUeXBlOjpnZXREb3VibGVUeShDb250ZXh0KSI7CisgIH0gZWxzZSBpZiAoVlQgPT0gTVZUOjpmODApIHsKKyAgICBPUyA8PCAiVHlwZTo6Z2V0WDg2X0ZQODBUeShDb250ZXh0KSI7CisgIH0gZWxzZSBpZiAoVlQgPT0gTVZUOjpmMTI4KSB7CisgICAgT1MgPDwgIlR5cGU6OmdldEZQMTI4VHkoQ29udGV4dCkiOworICB9IGVsc2UgaWYgKFZUID09IE1WVDo6cHBjZjEyOCkgeworICAgIE9TIDw8ICJUeXBlOjpnZXRQUENfRlAxMjhUeShDb250ZXh0KSI7CisgIH0gZWxzZSBpZiAoVlQgPT0gTVZUOjppc1ZvaWQpIHsKKyAgICBPUyA8PCAiVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpIjsKKyAgfSBlbHNlIGlmIChWVCA9PSBNVlQ6Ok1ldGFkYXRhKSB7CisgICAgT1MgPDwgIlR5cGU6OmdldE1ldGFkYXRhVHkoQ29udGV4dCkiOworICB9IGVsc2UgeworICAgIGFzc2VydChmYWxzZSAmJiAiVW5zdXBwb3J0ZWQgVmFsdWVUeXBlISIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEVtaXRUeXBlR2VuZXJhdGUocmF3X29zdHJlYW0gJk9TLCBjb25zdCBSZWNvcmQgKkFyZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZBcmdObyk7CisKK3N0YXRpYyB2b2lkIEVtaXRUeXBlR2VuZXJhdGUocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmQXJnVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZBcmdObykgeworICBpZiAoQXJnVHlwZXMuZW1wdHkoKSkKKyAgICByZXR1cm4gRW1pdFR5cGVGb3JWYWx1ZVR5cGUoT1MsIE1WVDo6aXNWb2lkKTsKKyAgCisgIGlmIChBcmdUeXBlcy5zaXplKCkgPT0gMSkKKyAgICByZXR1cm4gRW1pdFR5cGVHZW5lcmF0ZShPUywgQXJnVHlwZXMuZnJvbnQoKSwgQXJnTm8pOworCisgIE9TIDw8ICJTdHJ1Y3RUeXBlOjpnZXQoQ29udGV4dCwgIjsKKworICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgSSA9IEFyZ1R5cGVzLmJlZ2luKCksIEUgPSBBcmdUeXBlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBFbWl0VHlwZUdlbmVyYXRlKE9TLCAqSSwgQXJnTm8pOworICAgIE9TIDw8ICIsICI7CisgIH0KKworICBPUyA8PCAiIE5VTEwpIjsKK30KKworc3RhdGljIHZvaWQgRW1pdFR5cGVHZW5lcmF0ZShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFJlY29yZCAqQXJnVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkFyZ05vKSB7CisgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUID0gZ2V0VmFsdWVUeXBlKEFyZ1R5cGUtPmdldFZhbHVlQXNEZWYoIlZUIikpOworCisgIGlmIChBcmdUeXBlLT5pc1N1YkNsYXNzT2YoIkxMVk1NYXRjaFR5cGUiKSkgeworICAgIHVuc2lnbmVkIE51bWJlciA9IEFyZ1R5cGUtPmdldFZhbHVlQXNJbnQoIk51bWJlciIpOworICAgIGFzc2VydChOdW1iZXIgPCBBcmdObyAmJiAiSW52YWxpZCBtYXRjaGluZyBudW1iZXIhIik7CisgICAgaWYgKEFyZ1R5cGUtPmlzU3ViQ2xhc3NPZigiTExWTUV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUiKSkKKyAgICAgIE9TIDw8ICJWZWN0b3JUeXBlOjpnZXRFeHRlbmRlZEVsZW1lbnRWZWN0b3JUeXBlIgorICAgICAgICAgPDwgIihkeW5fY2FzdDxWZWN0b3JUeXBlPihUeXNbIiA8PCBOdW1iZXIgPDwgIl0pKSI7CisgICAgZWxzZSBpZiAoQXJnVHlwZS0+aXNTdWJDbGFzc09mKCJMTFZNVHJ1bmNhdGVkRWxlbWVudFZlY3RvclR5cGUiKSkKKyAgICAgIE9TIDw8ICJWZWN0b3JUeXBlOjpnZXRUcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZSIKKyAgICAgICAgIDw8ICIoZHluX2Nhc3Q8VmVjdG9yVHlwZT4oVHlzWyIgPDwgTnVtYmVyIDw8ICJdKSkiOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICJUeXNbIiA8PCBOdW1iZXIgPDwgIl0iOworICB9IGVsc2UgaWYgKFZUID09IE1WVDo6aUFueSB8fCBWVCA9PSBNVlQ6OmZBbnkgfHwgVlQgPT0gTVZUOjp2QW55KSB7CisgICAgLy8gTk9URTogVGhlIEFyZ05vIHZhcmlhYmxlIGhlcmUgaXMgbm90IHRoZSBhYnNvbHV0ZSBhcmd1bWVudCBudW1iZXIsIGl0IGlzCisgICAgLy8gdGhlIGluZGV4IG9mIHRoZSAiYXJiaXRyYXJ5IiB0eXBlIGluIHRoZSBUeXMgYXJyYXkgcGFzc2VkIHRvIHRoZQorICAgIC8vIEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24gZnVuY3Rpb24uIENvbnNlcXVlbnRseSwgd2Ugb25seSB3YW50IHRvCisgICAgLy8gaW5jcmVtZW50IGl0IHdoZW4gd2UgYWN0dWFsbHkgaGl0IGFuIG92ZXJsb2FkZWQgdHlwZS4gR2V0dGluZyB0aGlzIHdyb25nCisgICAgLy8gbGVhZHMgdG8gdmVyeSBzdWJ0bGUgYnVncyEKKyAgICBPUyA8PCAiVHlzWyIgPDwgQXJnTm8rKyA8PCAiXSI7CisgIH0gZWxzZSBpZiAoRVZUKFZUKS5pc1ZlY3RvcigpKSB7CisgICAgRVZUIFZWVCA9IFZUOworICAgIE9TIDw8ICJWZWN0b3JUeXBlOjpnZXQoIjsKKyAgICBFbWl0VHlwZUZvclZhbHVlVHlwZShPUywgVlZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSk7CisgICAgT1MgPDwgIiwgIiA8PCBWVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA8PCAiKSI7CisgIH0gZWxzZSBpZiAoVlQgPT0gTVZUOjppUFRSKSB7CisgICAgT1MgPDwgIlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoIjsKKyAgICBFbWl0VHlwZUdlbmVyYXRlKE9TLCBBcmdUeXBlLT5nZXRWYWx1ZUFzRGVmKCJFbFR5IiksIEFyZ05vKTsKKyAgICBPUyA8PCAiKSI7CisgIH0gZWxzZSBpZiAoVlQgPT0gTVZUOjppUFRSQW55KSB7CisgICAgLy8gTWFrZSBzdXJlIHRoZSB1c2VyIGhhcyBwYXNzZWQgdXMgYW4gYXJndW1lbnQgdHlwZSB0byBvdmVybG9hZC4gSWYgbm90LAorICAgIC8vIHRyZWF0IGl0IGFzIGFuIG9yZGluYXJ5IChub3Qgb3ZlcmxvYWRlZCkgaW50cmluc2ljLgorICAgIE9TIDw8ICIoIiA8PCBBcmdObyA8PCAiIDwgbnVtVHlzKSA/IFR5c1siIDw8IEFyZ05vIAorICAgIDw8ICJdIDogUG9pbnRlclR5cGU6OmdldFVucXVhbCgiOworICAgIEVtaXRUeXBlR2VuZXJhdGUoT1MsIEFyZ1R5cGUtPmdldFZhbHVlQXNEZWYoIkVsVHkiKSwgQXJnTm8pOworICAgIE9TIDw8ICIpIjsKKyAgICArK0FyZ05vOworICB9IGVsc2UgaWYgKFZUID09IE1WVDo6aXNWb2lkKSB7CisgICAgaWYgKEFyZ05vID09IDApCisgICAgICBPUyA8PCAiVHlwZTo6Z2V0Vm9pZFR5KENvbnRleHQpIjsKKyAgICBlbHNlCisgICAgICAvLyBNVlQ6OmlzVm9pZCBpcyB1c2VkIHRvIG1lYW4gdmFyYXJncyBoZXJlLgorICAgICAgT1MgPDwgIi4uLiI7CisgIH0gZWxzZSB7CisgICAgRW1pdFR5cGVGb3JWYWx1ZVR5cGUoT1MsIFZUKTsKKyAgfQorfQorCisvLy8gUmVjb3JkTGlzdENvbXBhcmF0b3IgLSBQcm92aWRlIGEgZGV0ZXJtaW5pc3RpYyBjb21wYXJhdG9yIGZvciBsaXN0cyBvZgorLy8vIHJlY29yZHMuCituYW1lc3BhY2UgeworICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnZlY3RvcjxSZWNvcmQqPiwgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gPiBSZWNQYWlyOworICBzdHJ1Y3QgUmVjb3JkTGlzdENvbXBhcmF0b3IgeworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSZWNQYWlyICZMSFMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY1BhaXIgJlJIUykgY29uc3QgeworICAgICAgdW5zaWduZWQgaSA9IDA7CisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAqTEhTVmVjID0gJkxIUy5maXJzdDsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+ICpSSFNWZWMgPSAmUkhTLmZpcnN0OworICAgICAgdW5zaWduZWQgUkhTU2l6ZSA9IFJIU1ZlYy0+c2l6ZSgpOworICAgICAgdW5zaWduZWQgTEhTU2l6ZSA9IExIU1ZlYy0+c2l6ZSgpOworCisgICAgICBmb3IgKDsgaSAhPSBMSFNTaXplOyArK2kpIHsKKyAgICAgICAgaWYgKGkgPT0gUkhTU2l6ZSkgcmV0dXJuIGZhbHNlOyAgLy8gUkhTIGlzIHNob3J0ZXIgdGhhbiBMSFMuCisgICAgICAgIGlmICgoKkxIU1ZlYylbaV0gIT0gKCpSSFNWZWMpW2ldKQorICAgICAgICAgIHJldHVybiAoKkxIU1ZlYylbaV0tPmdldE5hbWUoKSA8ICgqUkhTVmVjKVtpXS0+Z2V0TmFtZSgpOworICAgICAgfQorCisgICAgICBpZiAoaSAhPSBSSFNTaXplKSByZXR1cm4gdHJ1ZTsKKworICAgICAgaSA9IDA7CisgICAgICBMSFNWZWMgPSAmTEhTLnNlY29uZDsKKyAgICAgIFJIU1ZlYyA9ICZSSFMuc2Vjb25kOworICAgICAgUkhTU2l6ZSA9IFJIU1ZlYy0+c2l6ZSgpOworICAgICAgTEhTU2l6ZSA9IExIU1ZlYy0+c2l6ZSgpOworCisgICAgICBmb3IgKGkgPSAwOyBpICE9IExIU1NpemU7ICsraSkgeworICAgICAgICBpZiAoaSA9PSBSSFNTaXplKSByZXR1cm4gZmFsc2U7ICAvLyBSSFMgaXMgc2hvcnRlciB0aGFuIExIUy4KKyAgICAgICAgaWYgKCgqTEhTVmVjKVtpXSAhPSAoKlJIU1ZlYylbaV0pCisgICAgICAgICAgcmV0dXJuICgqTEhTVmVjKVtpXS0+Z2V0TmFtZSgpIDwgKCpSSFNWZWMpW2ldLT5nZXROYW1lKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBpICE9IFJIU1NpemU7CisgICAgfQorICB9OworfQorCit2b2lkIEludHJpbnNpY0VtaXR0ZXI6OkVtaXRWZXJpZmllcihjb25zdCBzdGQ6OnZlY3RvcjxDb2RlR2VuSW50cmluc2ljPiAmSW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgIi8vIFZlcmlmaWVyOjp2aXNpdEludHJpbnNpY0Z1bmN0aW9uQ2FsbCBjb2RlLlxuIjsKKyAgT1MgPDwgIiNpZmRlZiBHRVRfSU5UUklOU0lDX1ZFUklGSUVSXG4iOworICBPUyA8PCAiICBzd2l0Y2ggKElEKSB7XG4iOworICBPUyA8PCAiICBkZWZhdWx0OiBhc3NlcnQoMCAmJiBcIkludmFsaWQgaW50cmluc2ljIVwiKTtcbiI7CisgIAorICAvLyBUaGlzIGNoZWNraW5nIGNhbiBlbWl0IGEgbG90IG9mIHZlcnkgY29tbW9uIGNvZGUuICBUbyByZWR1Y2UgdGhlIGFtb3VudCBvZgorICAvLyBjb2RlIHRoYXQgd2UgZW1pdCwgYmF0Y2ggdXAgY2FzZXMgdGhhdCBoYXZlIGlkZW50aWNhbCB0eXBlcy4gIFRoaXMgYXZvaWRzCisgIC8vIHByb2JsZW1zIHdoZXJlIEdDQyBjYW4gcnVuIG91dCBvZiBtZW1vcnkgY29tcGlsaW5nIFZlcmlmaWVyLmNwcC4KKyAgdHlwZWRlZiBzdGQ6Om1hcDxSZWNQYWlyLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4sIFJlY29yZExpc3RDb21wYXJhdG9yPiBNYXBUeTsKKyAgTWFwVHkgVW5pcXVlQXJnSW5mb3M7CisgIAorICAvLyBDb21wdXRlIHRoZSB1bmlxdWUgYXJndW1lbnQgdHlwZSBpbmZvLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW50cy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFVuaXF1ZUFyZ0luZm9zW21ha2VfcGFpcihJbnRzW2ldLklTLlJldFR5cGVEZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRzW2ldLklTLlBhcmFtVHlwZURlZnMpXS5wdXNoX2JhY2soaSk7CisKKyAgLy8gTG9vcCB0aHJvdWdoIHRoZSBhcnJheSwgZW1pdHRpbmcgb25lIGNvbXBhcmlzb24gZm9yIGVhY2ggYmF0Y2guCisgIGZvciAoTWFwVHk6Oml0ZXJhdG9yIEkgPSBVbmlxdWVBcmdJbmZvcy5iZWdpbigpLAorICAgICAgIEUgPSBVbmlxdWVBcmdJbmZvcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+c2Vjb25kLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBPUyA8PCAiICBjYXNlIEludHJpbnNpYzo6IiA8PCBJbnRzW0ktPnNlY29uZFtpXV0uRW51bU5hbWUgPDwgIjpcdFx0Ly8gIgorICAgICAgICAgPDwgSW50c1tJLT5zZWNvbmRbaV1dLk5hbWUgPDwgIlxuIjsKKyAgICAKKyAgICBjb25zdCBSZWNQYWlyICZBcmdUeXBlcyA9IEktPmZpcnN0OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+ICZSZXRUeXMgPSBBcmdUeXBlcy5maXJzdDsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmUGFyYW1UeXMgPSBBcmdUeXBlcy5zZWNvbmQ7CisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IE92ZXJsb2FkZWRUeXBlSW5kaWNlczsKKworICAgIE9TIDw8ICIgICAgVmVyaWZ5SW50cmluc2ljUHJvdG90eXBlKElELCBJRiwgIiA8PCBSZXRUeXMuc2l6ZSgpIDw8ICIsICIKKyAgICAgICA8PCBQYXJhbVR5cy5zaXplKCk7CisKKyAgICAvLyBFbWl0IHJldHVybiB0eXBlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBqZSA9IFJldFR5cy5zaXplKCk7IGogIT0gamU7ICsraikgeworICAgICAgUmVjb3JkICpBcmdUeXBlID0gUmV0VHlzW2pdOworICAgICAgT1MgPDwgIiwgIjsKKworICAgICAgaWYgKEFyZ1R5cGUtPmlzU3ViQ2xhc3NPZigiTExWTU1hdGNoVHlwZSIpKSB7CisgICAgICAgIHVuc2lnbmVkIE51bWJlciA9IEFyZ1R5cGUtPmdldFZhbHVlQXNJbnQoIk51bWJlciIpOworICAgICAgICBhc3NlcnQoTnVtYmVyIDwgT3ZlcmxvYWRlZFR5cGVJbmRpY2VzLnNpemUoKSAmJgorICAgICAgICAgICAgICAgIkludmFsaWQgbWF0Y2hpbmcgbnVtYmVyISIpOworICAgICAgICBOdW1iZXIgPSBPdmVybG9hZGVkVHlwZUluZGljZXNbTnVtYmVyXTsKKyAgICAgICAgaWYgKEFyZ1R5cGUtPmlzU3ViQ2xhc3NPZigiTExWTUV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUiKSkKKyAgICAgICAgICBPUyA8PCAifihFeHRlbmRlZEVsZW1lbnRWZWN0b3JUeXBlIHwgIiA8PCBOdW1iZXIgPDwgIikiOworICAgICAgICBlbHNlIGlmIChBcmdUeXBlLT5pc1N1YkNsYXNzT2YoIkxMVk1UcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZSIpKQorICAgICAgICAgIE9TIDw8ICJ+KFRydW5jYXRlZEVsZW1lbnRWZWN0b3JUeXBlIHwgIiA8PCBOdW1iZXIgPDwgIikiOworICAgICAgICBlbHNlCisgICAgICAgICAgT1MgPDwgIn4iIDw8IE51bWJlcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIFZUID0gZ2V0VmFsdWVUeXBlKEFyZ1R5cGUtPmdldFZhbHVlQXNEZWYoIlZUIikpOworICAgICAgICBPUyA8PCBnZXRFbnVtTmFtZShWVCk7CisKKyAgICAgICAgaWYgKEVWVChWVCkuaXNPdmVybG9hZGVkKCkpCisgICAgICAgICAgT3ZlcmxvYWRlZFR5cGVJbmRpY2VzLnB1c2hfYmFjayhqKTsKKworICAgICAgICBpZiAoVlQgPT0gTVZUOjppc1ZvaWQgJiYgaiAhPSAwICYmIGogIT0gamUgLSAxKQorICAgICAgICAgIHRocm93ICJWYXIgYXJnIHR5cGUgbm90IGxhc3QgYXJndW1lbnQiOworICAgICAgfQorICAgIH0KKworICAgIC8vIEVtaXQgdGhlIHBhcmFtZXRlciB0eXBlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBqZSA9IFBhcmFtVHlzLnNpemUoKTsgaiAhPSBqZTsgKytqKSB7CisgICAgICBSZWNvcmQgKkFyZ1R5cGUgPSBQYXJhbVR5c1tqXTsKKyAgICAgIE9TIDw8ICIsICI7CisKKyAgICAgIGlmIChBcmdUeXBlLT5pc1N1YkNsYXNzT2YoIkxMVk1NYXRjaFR5cGUiKSkgeworICAgICAgICB1bnNpZ25lZCBOdW1iZXIgPSBBcmdUeXBlLT5nZXRWYWx1ZUFzSW50KCJOdW1iZXIiKTsKKyAgICAgICAgYXNzZXJ0KE51bWJlciA8IE92ZXJsb2FkZWRUeXBlSW5kaWNlcy5zaXplKCkgJiYKKyAgICAgICAgICAgICAgICJJbnZhbGlkIG1hdGNoaW5nIG51bWJlciEiKTsKKyAgICAgICAgTnVtYmVyID0gT3ZlcmxvYWRlZFR5cGVJbmRpY2VzW051bWJlcl07CisgICAgICAgIGlmIChBcmdUeXBlLT5pc1N1YkNsYXNzT2YoIkxMVk1FeHRlbmRlZEVsZW1lbnRWZWN0b3JUeXBlIikpCisgICAgICAgICAgT1MgPDwgIn4oRXh0ZW5kZWRFbGVtZW50VmVjdG9yVHlwZSB8ICIgPDwgTnVtYmVyIDw8ICIpIjsKKyAgICAgICAgZWxzZSBpZiAoQXJnVHlwZS0+aXNTdWJDbGFzc09mKCJMTFZNVHJ1bmNhdGVkRWxlbWVudFZlY3RvclR5cGUiKSkKKyAgICAgICAgICBPUyA8PCAifihUcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZSB8ICIgPDwgTnVtYmVyIDw8ICIpIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIE9TIDw8ICJ+IiA8PCBOdW1iZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBWVCA9IGdldFZhbHVlVHlwZShBcmdUeXBlLT5nZXRWYWx1ZUFzRGVmKCJWVCIpKTsKKyAgICAgICAgT1MgPDwgZ2V0RW51bU5hbWUoVlQpOworCisgICAgICAgIGlmIChFVlQoVlQpLmlzT3ZlcmxvYWRlZCgpKQorICAgICAgICAgIE92ZXJsb2FkZWRUeXBlSW5kaWNlcy5wdXNoX2JhY2soaiArIFJldFR5cy5zaXplKCkpOworCisgICAgICAgIGlmIChWVCA9PSBNVlQ6OmlzVm9pZCAmJiBqICE9IDAgJiYgaiAhPSBqZSAtIDEpCisgICAgICAgICAgdGhyb3cgIlZhciBhcmcgdHlwZSBub3QgbGFzdCBhcmd1bWVudCI7CisgICAgICB9CisgICAgfQorICAgICAgCisgICAgT1MgPDwgIik7XG4iOworICAgIE9TIDw8ICIgICAgYnJlYWs7XG4iOworICB9CisgIE9TIDw8ICIgIH1cbiI7CisgIE9TIDw8ICIjZW5kaWZcblxuIjsKK30KKwordm9pZCBJbnRyaW5zaWNFbWl0dGVyOjpFbWl0R2VuZXJhdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+ICZJbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgIi8vIENvZGUgZm9yIGdlbmVyYXRpbmcgSW50cmluc2ljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy5cbiI7CisgIE9TIDw8ICIjaWZkZWYgR0VUX0lOVFJJTlNJQ19HRU5FUkFUT1JcbiI7CisgIE9TIDw8ICIgIHN3aXRjaCAoaWQpIHtcbiI7CisgIE9TIDw8ICIgIGRlZmF1bHQ6IGFzc2VydCgwICYmIFwiSW52YWxpZCBpbnRyaW5zaWMhXCIpO1xuIjsKKyAgCisgIC8vIFNpbWlsYXIgdG8gR0VUX0lOVFJJTlNJQ19WRVJJRklFUiwgYmF0Y2ggdXAgY2FzZXMgdGhhdCBoYXZlIGlkZW50aWNhbAorICAvLyB0eXBlcy4KKyAgdHlwZWRlZiBzdGQ6Om1hcDxSZWNQYWlyLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4sIFJlY29yZExpc3RDb21wYXJhdG9yPiBNYXBUeTsKKyAgTWFwVHkgVW5pcXVlQXJnSW5mb3M7CisgIAorICAvLyBDb21wdXRlIHRoZSB1bmlxdWUgYXJndW1lbnQgdHlwZSBpbmZvLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW50cy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIFVuaXF1ZUFyZ0luZm9zW21ha2VfcGFpcihJbnRzW2ldLklTLlJldFR5cGVEZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRzW2ldLklTLlBhcmFtVHlwZURlZnMpXS5wdXNoX2JhY2soaSk7CisKKyAgLy8gTG9vcCB0aHJvdWdoIHRoZSBhcnJheSwgZW1pdHRpbmcgb25lIGdlbmVyYXRvciBmb3IgZWFjaCBiYXRjaC4KKyAgc3RkOjpzdHJpbmcgSW50cmluc2ljU3RyID0gVGFyZ2V0UHJlZml4ICsgIkludHJpbnNpYzo6IjsKKyAgCisgIGZvciAoTWFwVHk6Oml0ZXJhdG9yIEkgPSBVbmlxdWVBcmdJbmZvcy5iZWdpbigpLAorICAgICAgIEUgPSBVbmlxdWVBcmdJbmZvcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSS0+c2Vjb25kLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBPUyA8PCAiICBjYXNlICIgPDwgSW50cmluc2ljU3RyIDw8IEludHNbSS0+c2Vjb25kW2ldXS5FbnVtTmFtZSAKKyAgICAgICAgIDw8ICI6XHRcdC8vICIgPDwgSW50c1tJLT5zZWNvbmRbaV1dLk5hbWUgPDwgIlxuIjsKKyAgICAKKyAgICBjb25zdCBSZWNQYWlyICZBcmdUeXBlcyA9IEktPmZpcnN0OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+ICZSZXRUeXMgPSBBcmdUeXBlcy5maXJzdDsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmUGFyYW1UeXMgPSBBcmdUeXBlcy5zZWNvbmQ7CisKKyAgICB1bnNpZ25lZCBOID0gUGFyYW1UeXMuc2l6ZSgpOworCisgICAgaWYgKE4gPiAxICYmCisgICAgICAgIGdldFZhbHVlVHlwZShQYXJhbVR5c1tOIC0gMV0tPmdldFZhbHVlQXNEZWYoIlZUIikpID09IE1WVDo6aXNWb2lkKSB7CisgICAgICBPUyA8PCAiICAgIElzVmFyQXJnID0gdHJ1ZTtcbiI7CisgICAgICAtLU47CisgICAgfQorCisgICAgdW5zaWduZWQgQXJnTm8gPSAwOworICAgIE9TIDw8ICIgICAgUmVzdWx0VHkgPSAiOworICAgIEVtaXRUeXBlR2VuZXJhdGUoT1MsIFJldFR5cywgQXJnTm8pOworICAgIE9TIDw8ICI7XG4iOworICAgIAorICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gTjsgKytqKSB7CisgICAgICBPUyA8PCAiICAgIEFyZ1R5cy5wdXNoX2JhY2soIjsKKyAgICAgIEVtaXRUeXBlR2VuZXJhdGUoT1MsIFBhcmFtVHlzW2pdLCBBcmdObyk7CisgICAgICBPUyA8PCAiKTtcbiI7CisgICAgfQorCisgICAgT1MgPDwgIiAgICBicmVhaztcbiI7CisgIH0KKworICBPUyA8PCAiICB9XG4iOworICBPUyA8PCAiI2VuZGlmXG5cbiI7Cit9CisKKy8vLyBFbWl0QXR0cmlidXRlcyAtIFRoaXMgZW1pdHMgdGhlIEludHJpbnNpYzo6Z2V0QXR0cmlidXRlcyBtZXRob2QuCit2b2lkIEludHJpbnNpY0VtaXR0ZXI6OgorRW1pdEF0dHJpYnV0ZXMoY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gJkludHMsIHJhd19vc3RyZWFtICZPUykgeworICBPUyA8PCAiLy8gQWRkIHBhcmFtZXRlciBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBjb21tb24gdG8gYWxsIGludHJpbnNpY3MuXG4iOworICBPUyA8PCAiI2lmZGVmIEdFVF9JTlRSSU5TSUNfQVRUUklCVVRFU1xuIjsKKyAgaWYgKFRhcmdldE9ubHkpCisgICAgT1MgPDwgInN0YXRpYyBBdHRyTGlzdFB0ciBnZXRBdHRyaWJ1dGVzKCIgPDwgVGFyZ2V0UHJlZml4IAorICAgICAgIDw8ICJJbnRyaW5zaWM6OklEIGlkKSB7IjsKKyAgZWxzZQorICAgIE9TIDw8ICJBdHRyTGlzdFB0ciBJbnRyaW5zaWM6OmdldEF0dHJpYnV0ZXMoSUQgaWQpIHsiOworICBPUyA8PCAiICAvLyBObyBpbnRyaW5zaWMgY2FuIHRocm93IGV4Y2VwdGlvbnMuXG4iOworICBPUyA8PCAiICBBdHRyaWJ1dGVzIEF0dHIgPSBBdHRyaWJ1dGU6Ok5vVW53aW5kO1xuIjsKKyAgT1MgPDwgIiAgc3dpdGNoIChpZCkge1xuIjsKKyAgT1MgPDwgIiAgZGVmYXVsdDogYnJlYWs7XG4iOworICB1bnNpZ25lZCBNYXhBcmdBdHRycyA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBNYXhBcmdBdHRycyA9CisgICAgICBzdGQ6Om1heChNYXhBcmdBdHRycywgdW5zaWduZWQoSW50c1tpXS5Bcmd1bWVudEF0dHJpYnV0ZXMuc2l6ZSgpKSk7CisgICAgc3dpdGNoIChJbnRzW2ldLk1vZFJlZikgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgQ29kZUdlbkludHJpbnNpYzo6Tm9NZW06CisgICAgICBPUyA8PCAiICBjYXNlICIgPDwgVGFyZ2V0UHJlZml4IDw8ICJJbnRyaW5zaWM6OiIgPDwgSW50c1tpXS5FbnVtTmFtZSAKKyAgICAgICAgIDw8ICI6XG4iOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIE9TIDw8ICIgICAgQXR0ciB8PSBBdHRyaWJ1dGU6OlJlYWROb25lOyAvLyBUaGVzZSBkbyBub3QgYWNjZXNzIG1lbW9yeS5cbiI7CisgIE9TIDw8ICIgICAgYnJlYWs7XG4iOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW50cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgc3dpdGNoIChJbnRzW2ldLk1vZFJlZikgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgQ29kZUdlbkludHJpbnNpYzo6UmVhZEFyZ01lbToKKyAgICBjYXNlIENvZGVHZW5JbnRyaW5zaWM6OlJlYWRNZW06CisgICAgICBPUyA8PCAiICBjYXNlICIgPDwgVGFyZ2V0UHJlZml4IDw8ICJJbnRyaW5zaWM6OiIgPDwgSW50c1tpXS5FbnVtTmFtZSAKKyAgICAgICAgIDw8ICI6XG4iOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIE9TIDw8ICIgICAgQXR0ciB8PSBBdHRyaWJ1dGU6OlJlYWRPbmx5OyAvLyBUaGVzZSBkbyBub3Qgd3JpdGUgbWVtb3J5LlxuIjsKKyAgT1MgPDwgIiAgICBicmVhaztcbiI7CisgIE9TIDw8ICIgIH1cbiI7CisgIE9TIDw8ICIgIEF0dHJpYnV0ZVdpdGhJbmRleCBBV0lbIiA8PCBNYXhBcmdBdHRycysxIDw8ICJdO1xuIjsKKyAgT1MgPDwgIiAgdW5zaWduZWQgTnVtQXR0cnMgPSAwO1xuIjsKKyAgT1MgPDwgIiAgc3dpdGNoIChpZCkge1xuIjsKKyAgT1MgPDwgIiAgZGVmYXVsdDogYnJlYWs7XG4iOworICAKKyAgLy8gQWRkIGFyZ3VtZW50IGF0dHJpYnV0ZXMgZm9yIGFueSBpbnRyaW5zaWNzIHRoYXQgaGF2ZSB0aGVtLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW50cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKEludHNbaV0uQXJndW1lbnRBdHRyaWJ1dGVzLmVtcHR5KCkpIGNvbnRpbnVlOworICAgIAorICAgIE9TIDw8ICIgIGNhc2UgIiA8PCBUYXJnZXRQcmVmaXggPDwgIkludHJpbnNpYzo6IiA8PCBJbnRzW2ldLkVudW1OYW1lIAorICAgICAgIDw8ICI6XG4iOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBDb2RlR2VuSW50cmluc2ljOjpBcmdBdHRyaWJ1dGU+ID4gQXJnQXR0cnMgPQorICAgICAgSW50c1tpXS5Bcmd1bWVudEF0dHJpYnV0ZXM7CisgICAgLy8gU29ydCBieSBhcmd1bWVudCBpbmRleC4KKyAgICBzdGQ6OnNvcnQoQXJnQXR0cnMuYmVnaW4oKSwgQXJnQXR0cnMuZW5kKCkpOworCisgICAgdW5zaWduZWQgTnVtQXJnc1dpdGhBdHRycyA9IDA7CisKKyAgICB3aGlsZSAoIUFyZ0F0dHJzLmVtcHR5KCkpIHsKKyAgICAgIHVuc2lnbmVkIEFyZ05vID0gQXJnQXR0cnNbMF0uZmlyc3Q7CisgICAgICAKKyAgICAgIE9TIDw8ICIgICAgQVdJWyIgPDwgTnVtQXJnc1dpdGhBdHRycysrIDw8ICJdID0gQXR0cmlidXRlV2l0aEluZGV4OjpnZXQoIgorICAgICAgICAgPDwgQXJnTm8rMSA8PCAiLCAwIjsKKworICAgICAgd2hpbGUgKCFBcmdBdHRycy5lbXB0eSgpICYmIEFyZ0F0dHJzWzBdLmZpcnN0ID09IEFyZ05vKSB7CisgICAgICAgIHN3aXRjaCAoQXJnQXR0cnNbMF0uc2Vjb25kKSB7CisgICAgICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIGFyZyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgY2FzZSBDb2RlR2VuSW50cmluc2ljOjpOb0NhcHR1cmU6CisgICAgICAgICAgT1MgPDwgInxBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQXJnQXR0cnMuZXJhc2UoQXJnQXR0cnMuYmVnaW4oKSk7CisgICAgICB9CisgICAgICBPUyA8PCAiKTtcbiI7CisgICAgfQorICAgIAorICAgIE9TIDw8ICIgICAgTnVtQXR0cnMgPSAiIDw8IE51bUFyZ3NXaXRoQXR0cnMgPDwgIjtcbiI7CisgICAgT1MgPDwgIiAgICBicmVhaztcbiI7CisgIH0KKyAgCisgIE9TIDw8ICIgIH1cbiI7CisgIE9TIDw8ICIgIEFXSVtOdW1BdHRyc10gPSBBdHRyaWJ1dGVXaXRoSW5kZXg6OmdldCh+MCwgQXR0cik7XG4iOworICBPUyA8PCAiICByZXR1cm4gQXR0ckxpc3RQdHI6OmdldChBV0ksIE51bUF0dHJzKzEpO1xuIjsKKyAgT1MgPDwgIn1cbiI7CisgIE9TIDw8ICIjZW5kaWYgLy8gR0VUX0lOVFJJTlNJQ19BVFRSSUJVVEVTXG5cbiI7Cit9CisKKy8vLyBFbWl0TW9kUmVmQmVoYXZpb3IgLSBEZXRlcm1pbmUgaW50cmluc2ljIGFsaWFzIGFuYWx5c2lzIG1vZC9yZWYgYmVoYXZpb3IuCit2b2lkIEludHJpbnNpY0VtaXR0ZXI6OgorRW1pdE1vZFJlZkJlaGF2aW9yKGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+ICZJbnRzLCByYXdfb3N0cmVhbSAmT1MpeworICBPUyA8PCAiLy8gRGV0ZXJtaW5lIGludHJpbnNpYyBhbGlhcyBhbmFseXNpcyBtb2QvcmVmIGJlaGF2aW9yLlxuIjsKKyAgT1MgPDwgIiNpZmRlZiBHRVRfSU5UUklOU0lDX01PRFJFRl9CRUhBVklPUlxuIjsKKyAgT1MgPDwgInN3aXRjaCAoaWlkKSB7XG4iOworICBPUyA8PCAiZGVmYXVsdDpcbiAgICByZXR1cm4gVW5rbm93bk1vZFJlZkJlaGF2aW9yO1xuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEludHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChJbnRzW2ldLk1vZFJlZiA9PSBDb2RlR2VuSW50cmluc2ljOjpSZWFkV3JpdGVNZW0pCisgICAgICBjb250aW51ZTsKKyAgICBPUyA8PCAiY2FzZSAiIDw8IFRhcmdldFByZWZpeCA8PCAiSW50cmluc2ljOjoiIDw8IEludHNbaV0uRW51bU5hbWUKKyAgICAgIDw8ICI6XG4iOworICAgIHN3aXRjaCAoSW50c1tpXS5Nb2RSZWYpIHsKKyAgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbmtub3duIE1vZC9SZWYgdHlwZSEiKTsKKyAgICBjYXNlIENvZGVHZW5JbnRyaW5zaWM6Ok5vTWVtOgorICAgICAgT1MgPDwgIiAgcmV0dXJuIERvZXNOb3RBY2Nlc3NNZW1vcnk7XG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDb2RlR2VuSW50cmluc2ljOjpSZWFkQXJnTWVtOgorICAgIGNhc2UgQ29kZUdlbkludHJpbnNpYzo6UmVhZE1lbToKKyAgICAgIE9TIDw8ICIgIHJldHVybiBPbmx5UmVhZHNNZW1vcnk7XG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDb2RlR2VuSW50cmluc2ljOjpSZWFkV3JpdGVBcmdNZW06CisgICAgICBPUyA8PCAiICByZXR1cm4gQWNjZXNzZXNBcmd1bWVudHM7XG4iOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIE9TIDw8ICJ9XG4iOworICBPUyA8PCAiI2VuZGlmIC8vIEdFVF9JTlRSSU5TSUNfTU9EUkVGX0JFSEFWSU9SXG5cbiI7Cit9CisKK3ZvaWQgSW50cmluc2ljRW1pdHRlcjo6CitFbWl0R0NDQnVpbHRpbkxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gJkludHMsIHJhd19vc3RyZWFtICZPUyl7CisgIE9TIDw8ICIvLyBHZXQgdGhlIEdDQyBidWlsdGluIHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gTExWTSBpbnRyaW5zaWMuXG4iOworICBPUyA8PCAiI2lmZGVmIEdFVF9HQ0NfQlVJTFRJTl9OQU1FXG4iOworICBPUyA8PCAiICBzd2l0Y2ggKEYtPmdldEludHJpbnNpY0lEKCkpIHtcbiI7CisgIE9TIDw8ICIgIGRlZmF1bHQ6IEJ1aWx0aW5OYW1lID0gXCJcIjsgYnJlYWs7XG4iOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW50cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKCFJbnRzW2ldLkdDQ0J1aWx0aW5OYW1lLmVtcHR5KCkpIHsKKyAgICAgIE9TIDw8ICIgIGNhc2UgSW50cmluc2ljOjoiIDw8IEludHNbaV0uRW51bU5hbWUgPDwgIjogQnVpbHRpbk5hbWUgPSBcIiIKKyAgICAgICAgIDw8IEludHNbaV0uR0NDQnVpbHRpbk5hbWUgPDwgIlwiOyBicmVhaztcbiI7CisgICAgfQorICB9CisgIE9TIDw8ICIgIH1cbiI7CisgIE9TIDw8ICIjZW5kaWZcblxuIjsKK30KKworLy8vIEVtaXRCdWlsdGluQ29tcGFyaXNvbnMgLSBFbWl0IGNvbXBhcmlzb25zIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQKKy8vLyBzb3J0ZWQgcmFuZ2Ugb2YgYnVpbHRpbiBuYW1lcyBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBidWlsdGluLiAgVGhpcyBicmVha3MKKy8vLyBpdCBkb3duIGludG8gYSBzaW1wbGUgdHJlZS4KKy8vLworLy8vIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCBhbGwgdGhlIGJ1aWx0aW5zIGluIHRoZSByYW5nZSBoYXZlIHRoZSBzYW1lIG5hbWUKKy8vLyBmb3IgdGhlIGZpcnN0ICdDaGFyU3RhcnQnIGNoYXJhY3RlcnMuICBPbmx5IHRoZSBlbmQgb2YgdGhlIG5hbWUgbmVlZHMgdG8gYmUKKy8vLyBkaXNjcmltaW5hdGVkLgordHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBTdHJNYXBJdGVyYXRvcjsKK3N0YXRpYyB2b2lkIEVtaXRCdWlsdGluQ29tcGFyaXNvbnMoU3RyTWFwSXRlcmF0b3IgU3RhcnQsIFN0ck1hcEl0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhclN0YXJ0LCB1bnNpZ25lZCBJbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIFRhcmdldFByZWZpeCwgcmF3X29zdHJlYW0gJk9TKSB7CisgIGlmIChTdGFydCA9PSBFbmQpIHJldHVybjsgLy8gZW1wdHkgcmFuZ2UuCisgIAorICAvLyBEZXRlcm1pbmUgd2hhdCwgaWYgYW55dGhpbmcsIGlzIHRoZSBzYW1lIGFib3V0IGFsbCB0aGVzZSBzdHJpbmdzLgorICBzdGQ6OnN0cmluZyBDb21tb25TdHJpbmcgPSBTdGFydC0+Zmlyc3Q7CisgIHVuc2lnbmVkIE51bUluUmFuZ2UgPSAwOworICBmb3IgKFN0ck1hcEl0ZXJhdG9yIEkgPSBTdGFydDsgSSAhPSBFbmQ7ICsrSSwgKytOdW1JblJhbmdlKSB7CisgICAgLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIHRoYXQgZG9lc24ndCBtYXRjaC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmVGhpc1N0ciA9IEktPmZpcnN0OworICAgIHVuc2lnbmVkIE5vbk1hdGNoQ2hhciA9IENoYXJTdGFydDsKKyAgICB3aGlsZSAoTm9uTWF0Y2hDaGFyIDwgQ29tbW9uU3RyaW5nLnNpemUoKSAmJiAKKyAgICAgICAgICAgTm9uTWF0Y2hDaGFyIDwgVGhpc1N0ci5zaXplKCkgJiYKKyAgICAgICAgICAgQ29tbW9uU3RyaW5nW05vbk1hdGNoQ2hhcl0gPT0gVGhpc1N0cltOb25NYXRjaENoYXJdKQorICAgICAgKytOb25NYXRjaENoYXI7CisgICAgLy8gVHJ1bmNhdGUgb2ZmIHBpZWNlcyB0aGF0IGRvbid0IG1hdGNoLgorICAgIENvbW1vblN0cmluZy5yZXNpemUoTm9uTWF0Y2hDaGFyKTsKKyAgfQorICAKKyAgLy8gSnVzdCBjb21wYXJlIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcuCisgIGlmIChOdW1JblJhbmdlID09IDEpIHsKKyAgICBpZiAoQ2hhclN0YXJ0ICE9IENvbW1vblN0cmluZy5zaXplKCkpIHsKKyAgICAgIE9TIDw8IHN0ZDo6c3RyaW5nKEluZGVudCoyLCAnICcpIDw8ICJpZiAoIW1lbWNtcChCdWlsdGluTmFtZSI7CisgICAgICBpZiAoQ2hhclN0YXJ0KSBPUyA8PCAiKyIgPDwgQ2hhclN0YXJ0OworICAgICAgT1MgPDwgIiwgXCIiIDw8IChDb21tb25TdHJpbmcuY19zdHIoKStDaGFyU3RhcnQpIDw8ICJcIiwgIjsKKyAgICAgIE9TIDw8IENvbW1vblN0cmluZy5zaXplKCkgLSBDaGFyU3RhcnQgPDwgIikpXG4iOworICAgICAgKytJbmRlbnQ7CisgICAgfQorICAgIE9TIDw8IHN0ZDo6c3RyaW5nKEluZGVudCoyLCAnICcpIDw8ICJJbnRyaW5zaWNJRCA9ICIgPDwgVGFyZ2V0UHJlZml4CisgICAgICAgPDwgIkludHJpbnNpYzo6IjsKKyAgICBPUyA8PCBTdGFydC0+c2Vjb25kIDw8ICI7XG4iOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIHBvdGVudGlhbGx5IGhhdmUgYSBjb21tb24gcHJlZml4IGZvciB0aGVzZSBidWlsdGlucywgZW1pdAorICAvLyBhIGNoZWNrIGZvciB0aGlzIGNvbW1vbiBwcmVmaXguCisgIGlmIChDb21tb25TdHJpbmcuc2l6ZSgpICE9IENoYXJTdGFydCkgeworICAgIE9TIDw8IHN0ZDo6c3RyaW5nKEluZGVudCoyLCAnICcpIDw8ICJpZiAoIW1lbWNtcChCdWlsdGluTmFtZSI7CisgICAgaWYgKENoYXJTdGFydCkgT1MgPDwgIisiIDw8IENoYXJTdGFydDsKKyAgICBPUyA8PCAiLCBcIiIgPDwgKENvbW1vblN0cmluZy5jX3N0cigpK0NoYXJTdGFydCkgPDwgIlwiLCAiOworICAgIE9TIDw8IENvbW1vblN0cmluZy5zaXplKCktQ2hhclN0YXJ0IDw8ICIpKSB7XG4iOworICAgIAorICAgIEVtaXRCdWlsdGluQ29tcGFyaXNvbnMoU3RhcnQsIEVuZCwgQ29tbW9uU3RyaW5nLnNpemUoKSwgSW5kZW50KzEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0UHJlZml4LCBPUyk7CisgICAgT1MgPDwgc3RkOjpzdHJpbmcoSW5kZW50KjIsICcgJykgPDwgIn1cbiI7CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBPdXRwdXQgYSBzd2l0Y2ggb24gdGhlIGNoYXJhY3RlciB0aGF0IGRpZmZlcnMgYWNyb3NzIHRoZSBzZXQuCisgIE9TIDw8IHN0ZDo6c3RyaW5nKEluZGVudCoyLCAnICcpIDw8ICJzd2l0Y2ggKEJ1aWx0aW5OYW1lWyIgPDwgQ2hhclN0YXJ0CisgICAgICA8PCAiXSkgeyI7CisgIGlmIChDaGFyU3RhcnQpCisgICAgT1MgPDwgIiAgLy8gXCIiIDw8IHN0ZDo6c3RyaW5nKFN0YXJ0LT5maXJzdC5iZWdpbigpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQtPmZpcnN0LmJlZ2luKCkrQ2hhclN0YXJ0KSA8PCAiXCIiOworICBPUyA8PCAiXG4iOworICAKKyAgZm9yIChTdHJNYXBJdGVyYXRvciBJID0gU3RhcnQ7IEkgIT0gRW5kOyApIHsKKyAgICBjaGFyIFRoaXNDaGFyID0gSS0+Zmlyc3RbQ2hhclN0YXJ0XTsKKyAgICBPUyA8PCBzdGQ6OnN0cmluZyhJbmRlbnQqMiwgJyAnKSA8PCAiY2FzZSAnIiA8PCBUaGlzQ2hhciA8PCAiJzpcbiI7CisgICAgLy8gRmlndXJlIG91dCB0aGUgcmFuZ2UgdGhhdCBoYXMgdGhpcyBjb21tb24gY2hhcmFjdGVyLgorICAgIFN0ck1hcEl0ZXJhdG9yIE5leHRDaGFyID0gSTsKKyAgICBmb3IgKCsrTmV4dENoYXI7IE5leHRDaGFyICE9IEVuZCAmJiBOZXh0Q2hhci0+Zmlyc3RbQ2hhclN0YXJ0XSA9PSBUaGlzQ2hhcjsKKyAgICAgICAgICsrTmV4dENoYXIpCisgICAgICAvKmVtcHR5Ki87CisgICAgRW1pdEJ1aWx0aW5Db21wYXJpc29ucyhJLCBOZXh0Q2hhciwgQ2hhclN0YXJ0KzEsIEluZGVudCsxLCBUYXJnZXRQcmVmaXgsT1MpOworICAgIE9TIDw8IHN0ZDo6c3RyaW5nKEluZGVudCoyLCAnICcpIDw8ICIgIGJyZWFrO1xuIjsKKyAgICBJID0gTmV4dENoYXI7CisgIH0KKyAgT1MgPDwgc3RkOjpzdHJpbmcoSW5kZW50KjIsICcgJykgPDwgIn1cbiI7Cit9CisKKy8vLyBFbWl0VGFyZ2V0QnVpbHRpbnMgLSBBbGwgb2YgdGhlIGJ1aWx0aW5zIGluIHRoZSBzcGVjaWZpZWQgbWFwIGFyZSBmb3IgdGhlCisvLy8gc2FtZSB0YXJnZXQsIGFuZCB3ZSBhbHJlYWR5IGNoZWNrZWQgaXQuCitzdGF0aWMgdm9pZCBFbWl0VGFyZ2V0QnVpbHRpbnMoY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmQklNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZUYXJnZXRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSB7CisgIC8vIFJlYXJyYW5nZSB0aGUgYnVpbHRpbnMgYnkgbGVuZ3RoLgorICBzdGQ6OnZlY3RvcjxzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4gQnVpbHRpbnNCeUxlbjsKKyAgQnVpbHRpbnNCeUxlbi5yZXNlcnZlKDEwMCk7CisgIAorICBmb3IgKFN0ck1hcEl0ZXJhdG9yIEkgPSBCSU0uYmVnaW4oKSwgRSA9IEJJTS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+Zmlyc3Quc2l6ZSgpID49IEJ1aWx0aW5zQnlMZW4uc2l6ZSgpKQorICAgICAgQnVpbHRpbnNCeUxlbi5yZXNpemUoSS0+Zmlyc3Quc2l6ZSgpKzEpOworICAgIEJ1aWx0aW5zQnlMZW5bSS0+Zmlyc3Quc2l6ZSgpXS5pbnNlcnQoKkkpOworICB9CisgIAorICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgYnVpbHRpbnMgYnkgdGhlaXIgbGVuZ3RoLCBlbWl0IGEgc3dpdGNoIHN0bXQuCisgIE9TIDw8ICIgICAgc3dpdGNoIChzdHJsZW4oQnVpbHRpbk5hbWUpKSB7XG4iOworICBPUyA8PCAiICAgIGRlZmF1bHQ6IGJyZWFrO1xuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEJ1aWx0aW5zQnlMZW4uc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChCdWlsdGluc0J5TGVuW2ldLmVtcHR5KCkpIGNvbnRpbnVlOworICAgIE9TIDw8ICIgICAgY2FzZSAiIDw8IGkgPDwgIjpcbiI7CisgICAgRW1pdEJ1aWx0aW5Db21wYXJpc29ucyhCdWlsdGluc0J5TGVuW2ldLmJlZ2luKCksIEJ1aWx0aW5zQnlMZW5baV0uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAzLCBUYXJnZXRQcmVmaXgsIE9TKTsKKyAgICBPUyA8PCAiICAgICAgYnJlYWs7XG4iOworICB9CisgIE9TIDw8ICIgICAgfVxuIjsKK30KKworICAgICAgICAKK3ZvaWQgSW50cmluc2ljRW1pdHRlcjo6CitFbWl0SW50cmluc2ljVG9HQ0NCdWlsdGluTWFwKGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+ICZJbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSB7CisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gPiBCSU1UeTsKKyAgQklNVHkgQnVpbHRpbk1hcDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEludHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmICghSW50c1tpXS5HQ0NCdWlsdGluTmFtZS5lbXB0eSgpKSB7CisgICAgICAvLyBHZXQgdGhlIG1hcCBmb3IgdGhpcyB0YXJnZXQgcHJlZml4LgorICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmQklNID1CdWlsdGluTWFwW0ludHNbaV0uVGFyZ2V0UHJlZml4XTsKKyAgICAgIAorICAgICAgaWYgKCFCSU0uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEludHNbaV0uR0NDQnVpbHRpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50c1tpXS5FbnVtTmFtZSkpLnNlY29uZCkKKyAgICAgICAgdGhyb3cgIkludHJpbnNpYyAnIiArIEludHNbaV0uVGhlRGVmLT5nZXROYW1lKCkgKworICAgICAgICAgICAgICAiJzogZHVwbGljYXRlIEdDQyBidWlsdGluIG5hbWUhIjsKKyAgICB9CisgIH0KKyAgCisgIE9TIDw8ICIvLyBHZXQgdGhlIExMVk0gaW50cmluc2ljIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBHQ0MgYnVpbHRpbi5cbiI7CisgIE9TIDw8ICIvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIEMgZnJvbnQtZW5kLiAgVGhlIEdDQyBidWlsdGluIG5hbWUgaXMgcGFzc2VkXG4iOworICBPUyA8PCAiLy8gaW4gYXMgQnVpbHRpbk5hbWUsIGFuZCBhIHRhcmdldCBwcmVmaXggKGUuZy4gJ3BwYycpIGlzIHBhc3NlZFxuIjsKKyAgT1MgPDwgIi8vIGluIGFzIFRhcmdldFByZWZpeC4gIFRoZSByZXN1bHQgaXMgYXNzaWduZWQgdG8gJ0ludHJpbnNpY0lEJy5cbiI7CisgIE9TIDw8ICIjaWZkZWYgR0VUX0xMVk1fSU5UUklOU0lDX0ZPUl9HQ0NfQlVJTFRJTlxuIjsKKyAgCisgIGlmIChUYXJnZXRPbmx5KSB7CisgICAgT1MgPDwgInN0YXRpYyAiIDw8IFRhcmdldFByZWZpeCA8PCAiSW50cmluc2ljOjpJRCAiCisgICAgICAgPDwgImdldEludHJpbnNpY0ZvckdDQ0J1aWx0aW4oY29uc3QgY2hhciAiCisgICAgICAgPDwgIipUYXJnZXRQcmVmaXgsIGNvbnN0IGNoYXIgKkJ1aWx0aW5OYW1lKSB7XG4iOworICAgIE9TIDw8ICIgICIgPDwgVGFyZ2V0UHJlZml4IDw8ICJJbnRyaW5zaWM6OklEIEludHJpbnNpY0lEID0gIjsKKyAgfSBlbHNlIHsKKyAgICBPUyA8PCAiSW50cmluc2ljOjpJRCBJbnRyaW5zaWM6OmdldEludHJpbnNpY0ZvckdDQ0J1aWx0aW4oY29uc3QgY2hhciAiCisgICAgICAgPDwgIipUYXJnZXRQcmVmaXgsIGNvbnN0IGNoYXIgKkJ1aWx0aW5OYW1lKSB7XG4iOworICAgIE9TIDw8ICIgIEludHJpbnNpYzo6SUQgSW50cmluc2ljSUQgPSAiOworICB9CisgIAorICBpZiAoVGFyZ2V0T25seSkKKyAgICBPUyA8PCAiKCIgPDwgVGFyZ2V0UHJlZml4PDwgIkludHJpbnNpYzo6SUQpIjsKKworICBPUyA8PCAiSW50cmluc2ljOjpub3RfaW50cmluc2ljO1xuIjsKKyAgCisgIC8vIE5vdGU6IHRoaXMgY291bGQgZW1pdCBzaWduaWZpY2FudGx5IGJldHRlciBjb2RlIGlmIHdlIGNhcmVkLgorICBmb3IgKEJJTVR5OjppdGVyYXRvciBJID0gQnVpbHRpbk1hcC5iZWdpbigpLCBFID0gQnVpbHRpbk1hcC5lbmQoKTtJICE9IEU7KytJKXsKKyAgICBPUyA8PCAiICAiOworICAgIGlmICghSS0+Zmlyc3QuZW1wdHkoKSkKKyAgICAgIE9TIDw8ICJpZiAoIXN0cmNtcChUYXJnZXRQcmVmaXgsIFwiIiA8PCBJLT5maXJzdCA8PCAiXCIpKSAiOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICIvKiBUYXJnZXQgSW5kZXBlbmRlbnQgQnVpbHRpbnMgKi8gIjsKKyAgICBPUyA8PCAie1xuIjsKKworICAgIC8vIEVtaXQgdGhlIGNvbXBhcmlzb25zIGZvciB0aGlzIHRhcmdldCBwcmVmaXguCisgICAgRW1pdFRhcmdldEJ1aWx0aW5zKEktPnNlY29uZCwgVGFyZ2V0UHJlZml4LCBPUyk7CisgICAgT1MgPDwgIiAgfVxuIjsKKyAgfQorICBPUyA8PCAiICByZXR1cm4gSW50cmluc2ljSUQ7XG4iOworICBPUyA8PCAifVxuIjsKKyAgT1MgPDwgIiNlbmRpZlxuXG4iOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vSW50cmluc2ljRW1pdHRlci5oIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vSW50cmluc2ljRW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWZlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9JbnRyaW5zaWNFbWl0dGVyLmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tIEludHJpbnNpY0VtaXR0ZXIuaCAtIEdlbmVyYXRlIGludHJpbnNpYyBpbmZvcm1hdGlvbiAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgZW1pdHMgaW5mb3JtYXRpb24gYWJvdXQgaW50cmluc2ljIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIElOVFJJTlNJQ19FTUlUVEVSX0gKKyNkZWZpbmUgSU5UUklOU0lDX0VNSVRURVJfSAorCisjaW5jbHVkZSAiQ29kZUdlbkludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJUYWJsZUdlbkJhY2tlbmQuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBJbnRyaW5zaWNFbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgICAgUmVjb3JkS2VlcGVyICZSZWNvcmRzOworICAgIGJvb2wgVGFyZ2V0T25seTsKKyAgICBzdGQ6OnN0cmluZyBUYXJnZXRQcmVmaXg7CisgICAgCisgIHB1YmxpYzoKKyAgICBJbnRyaW5zaWNFbWl0dGVyKFJlY29yZEtlZXBlciAmUiwgYm9vbCBUID0gZmFsc2UpIAorICAgICAgOiBSZWNvcmRzKFIpLCBUYXJnZXRPbmx5KFQpIHt9CisKKyAgICB2b2lkIHJ1bihyYXdfb3N0cmVhbSAmT1MpOworCisgICAgdm9pZCBFbWl0UHJlZml4KHJhd19vc3RyZWFtICZPUyk7CisgICAgCisgICAgdm9pZCBFbWl0RW51bUluZm8oY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gJkludHMsIAorICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7CisKKyAgICB2b2lkIEVtaXRGbk5hbWVSZWNvZ25pemVyKGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+ICZJbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7CisgICAgdm9pZCBFbWl0SW50cmluc2ljVG9OYW1lVGFibGUoY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gJkludHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7CisgICAgdm9pZCBFbWl0SW50cmluc2ljVG9PdmVybG9hZFRhYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+ICZJbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKKyAgICB2b2lkIEVtaXRWZXJpZmllcihjb25zdCBzdGQ6OnZlY3RvcjxDb2RlR2VuSW50cmluc2ljPiAmSW50cywgCisgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKKyAgICB2b2lkIEVtaXRHZW5lcmF0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gJkludHMsIAorICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpOworICAgIHZvaWQgRW1pdEF0dHJpYnV0ZXMoY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gJkludHMsCisgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpOworICAgIHZvaWQgRW1pdE1vZFJlZkJlaGF2aW9yKGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+ICZJbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7CisgICAgdm9pZCBFbWl0R0NDQnVpbHRpbkxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlbkludHJpbnNpYz4gJkludHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7CisgICAgdm9pZCBFbWl0SW50cmluc2ljVG9HQ0NCdWlsdGluTWFwKGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnRyaW5zaWM+ICZJbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKKyAgICB2b2lkIEVtaXRTdWZmaXgocmF3X29zdHJlYW0gJk9TKTsKKyAgfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9MTFZNQ0NvbmZpZ3VyYXRpb25FbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0xMVk1DQ29uZmlndXJhdGlvbkVtaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjI0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9MTFZNQ0NvbmZpZ3VyYXRpb25FbWl0dGVyLmNwcApAQCAtMCwwICsxLDMxNTMgQEAKKy8vPT09LSBMTFZNQ0NvbmZpZ3VyYXRpb25FbWl0dGVyLmNwcCAtIEdlbmVyYXRlIExMVk1DIGNvbmZpZyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBMTFZNQyBjb25maWd1cmF0aW9uIGNvZGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIkxMVk1DQ29uZmlndXJhdGlvbkVtaXR0ZXIuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKworI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworbmFtZXNwYWNlIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUeXBlZGVmcworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFJlY29yZFZlY3RvcjsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFN0clZlY3RvcjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBDb25zdGFudHMKKworLy8gSW5kZW50YXRpb24uCitjb25zdCB1bnNpZ25lZCBUYWJXaWR0aCA9IDQ7Citjb25zdCB1bnNpZ25lZCBJbmRlbnQxICA9IFRhYldpZHRoKjE7Citjb25zdCB1bnNpZ25lZCBJbmRlbnQyICA9IFRhYldpZHRoKjI7Citjb25zdCB1bnNpZ25lZCBJbmRlbnQzICA9IFRhYldpZHRoKjM7Citjb25zdCB1bnNpZ25lZCBJbmRlbnQ0ICA9IFRhYldpZHRoKjQ7CisKKy8vIERlZmF1bHQgaGVscCBzdHJpbmcuCitjb25zdCBjaGFyICogY29uc3QgRGVmYXVsdEhlbHBTdHJpbmcgPSAiTk8gSEVMUCBNRVNTQUdFIFBST1ZJREVEIjsKKworLy8gTmFtZSBmb3IgdGhlICJzaW5rIiBvcHRpb24uCitjb25zdCBjaGFyICogY29uc3QgU2lua09wdGlvbk5hbWUgPSAiQXV0b0dlbmVyYXRlZFNpbmtPcHRpb24iOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEhlbHBlciBmdW5jdGlvbnMKKworLy8vIElkIC0gQW4gJ2lkZW50aXR5JyBmdW5jdGlvbiBvYmplY3QuCitzdHJ1Y3QgSWQgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMD4KKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFQwJikgY29uc3QgeworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4KKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFQwJiwgY29uc3QgVDEmKSBjb25zdCB7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFQwJiwgY29uc3QgVDEmLCBjb25zdCBUMiYpIGNvbnN0IHsKKyAgfQorfTsKKworaW50IEluaXRQdHJUb0ludChjb25zdCBJbml0KiBwdHIpIHsKKyAgY29uc3QgSW50SW5pdCYgdmFsID0gZHluYW1pY19jYXN0PGNvbnN0IEludEluaXQmPigqcHRyKTsKKyAgcmV0dXJuIHZhbC5nZXRWYWx1ZSgpOworfQorCitjb25zdCBzdGQ6OnN0cmluZyYgSW5pdFB0clRvU3RyaW5nKGNvbnN0IEluaXQqIHB0cikgeworICBjb25zdCBTdHJpbmdJbml0JiB2YWwgPSBkeW5hbWljX2Nhc3Q8Y29uc3QgU3RyaW5nSW5pdCY+KCpwdHIpOworICByZXR1cm4gdmFsLmdldFZhbHVlKCk7Cit9CisKK2NvbnN0IExpc3RJbml0JiBJbml0UHRyVG9MaXN0KGNvbnN0IEluaXQqIHB0cikgeworICBjb25zdCBMaXN0SW5pdCYgdmFsID0gZHluYW1pY19jYXN0PGNvbnN0IExpc3RJbml0Jj4oKnB0cik7CisgIHJldHVybiB2YWw7Cit9CisKK2NvbnN0IERhZ0luaXQmIEluaXRQdHJUb0RhZyhjb25zdCBJbml0KiBwdHIpIHsKKyAgY29uc3QgRGFnSW5pdCYgdmFsID0gZHluYW1pY19jYXN0PGNvbnN0IERhZ0luaXQmPigqcHRyKTsKKyAgcmV0dXJuIHZhbDsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcgR2V0T3BlcmF0b3JOYW1lKGNvbnN0IERhZ0luaXQmIEQpIHsKKyAgcmV0dXJuIEQuZ2V0T3BlcmF0b3IoKS0+Z2V0QXNTdHJpbmcoKTsKK30KKworLy8vIENoZWNrQm9vbGVhbkNvbnN0YW50IC0gQ2hlY2sgdGhhdCB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgYSBib29sZWFuIGNvbnN0YW50Lgordm9pZCBDaGVja0Jvb2xlYW5Db25zdGFudChjb25zdCBJbml0KiBJKSB7CisgIGNvbnN0IERlZkluaXQmIHZhbCA9IGR5bmFtaWNfY2FzdDxjb25zdCBEZWZJbml0Jj4oKkkpOworICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyID0gdmFsLmdldEFzU3RyaW5nKCk7CisKKyAgaWYgKHN0ciAhPSAidHJ1ZSIgJiYgc3RyICE9ICJmYWxzZSIpIHsKKyAgICB0aHJvdyAiSW5jb3JyZWN0IGJvb2xlYW4gdmFsdWU6ICciICsgc3RyICsKKyAgICAgICInOiBtdXN0IGJlIGVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJyI7CisgIH0KK30KKworLy8gQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyAtIEVuc3VyZSB0aGF0IHRoZSBudW1iZXIgb2YgYXJncyBpbiBkIGlzCisvLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluX2FyZ3VtZW50cywgb3RoZXJ3aXNlIHRocm93IGFuIGV4Y2VwdGlvbi4KK3ZvaWQgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyAoY29uc3QgRGFnSW5pdCYgZCwgdW5zaWduZWQgbWluQXJncykgeworICBpZiAoZC5nZXROdW1BcmdzKCkgPCBtaW5BcmdzKQorICAgIHRocm93IEdldE9wZXJhdG9yTmFtZShkKSArICI6IHRvbyBmZXcgYXJndW1lbnRzISI7Cit9CisKKy8vIElzRGFnRW1wdHkgLSBpcyB0aGlzIERBRyBtYXJrZWQgd2l0aCBhbiBlbXB0eSBtYXJrZXI/Citib29sIElzRGFnRW1wdHkgKGNvbnN0IERhZ0luaXQmIGQpIHsKKyAgcmV0dXJuIEdldE9wZXJhdG9yTmFtZShkKSA9PSAiZW1wdHlfZGFnX21hcmtlciI7Cit9CisKKy8vIEVzY2FwZVZhcmlhYmxlTmFtZSAtIEVzY2FwZSBjb21tYXMgYW5kIG90aGVyIHN5bWJvbHMgbm90IGFsbG93ZWQKKy8vIGluIHRoZSBDKysgdmFyaWFibGUgbmFtZXMuIE1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBvcHRpb25zIG5hbWVkCisvLyBsaWtlICJXYSwiICh1c2VmdWwgZm9yIHByZWZpeCBvcHRpb25zKS4KK3N0ZDo6c3RyaW5nIEVzY2FwZVZhcmlhYmxlTmFtZSAoY29uc3Qgc3RkOjpzdHJpbmcmIFZhcikgeworICBzdGQ6OnN0cmluZyByZXQ7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gVmFyLnNpemUoKTsgKytpKSB7CisgICAgY2hhciBjdXJfY2hhciA9IFZhcltpXTsKKyAgICBpZiAoY3VyX2NoYXIgPT0gJywnKSB7CisgICAgICByZXQgKz0gIl9jb21tYV8iOworICAgIH0KKyAgICBlbHNlIGlmIChjdXJfY2hhciA9PSAnKycpIHsKKyAgICAgIHJldCArPSAiX3BsdXNfIjsKKyAgICB9CisgICAgZWxzZSBpZiAoY3VyX2NoYXIgPT0gJy0nKSB7CisgICAgICByZXQgKz0gIl9kYXNoXyI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0LnB1c2hfYmFjayhjdXJfY2hhcik7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8vLyBFc2NhcGVRdW90ZXMgLSBSZXBsYWNlICciJyB3aXRoICdcIicuCitzdGQ6OnN0cmluZyBFc2NhcGVRdW90ZXMgKGNvbnN0IHN0ZDo6c3RyaW5nJiBWYXIpIHsKKyAgc3RkOjpzdHJpbmcgcmV0OworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFZhci5zaXplKCk7ICsraSkgeworICAgIGNoYXIgY3VyX2NoYXIgPSBWYXJbaV07CisgICAgaWYgKGN1cl9jaGFyID09ICciJykgeworICAgICAgcmV0ICs9ICJcXFwiIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXQucHVzaF9iYWNrKGN1cl9jaGFyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8vIE9uZU9mIC0gRG9lcyB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW4gdGhpcyBjaGFyYWN0ZXI/Citib29sIE9uZU9mKGNvbnN0IGNoYXIqIGxzdCwgY2hhciBjKSB7CisgIHdoaWxlICgqbHN0KSB7CisgICAgaWYgKCpsc3QrKyA9PSBjKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSSwgY2xhc3MgUz4KK3ZvaWQgQ2hlY2tlZEluY3JlbWVudChJJiBQLCBJIEUsIFMgRXJyb3JTdHJpbmcpIHsKKyAgKytQOworICBpZiAoUCA9PSBFKQorICAgIHRocm93IEVycm9yU3RyaW5nOworfQorCisvLyBhcHBseSBpcyBuZWVkZWQgYmVjYXVzZSBDKysncyBzeW50YXggZG9lc24ndCBsZXQgdXMgY29uc3RydWN0IGEgZnVuY3Rpb24KKy8vIG9iamVjdCBhbmQgY2FsbCBpdCBpbiB0aGUgc2FtZSBzdGF0ZW1lbnQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZSBUMD4KK3ZvaWQgYXBwbHkoRiBGdW4sIFQwJiBBcmcwKSB7CisgIHJldHVybiBGdW4oQXJnMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4KK3ZvaWQgYXBwbHkoRiBGdW4sIFQwJiBBcmcwLCBUMSYgQXJnMSkgeworICByZXR1cm4gRnVuKEFyZzAsIEFyZzEpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEJhY2stZW5kIHNwZWNpZmljIGNvZGUKKworCisvLy8gT3B0aW9uVHlwZSAtIE9uZSBvZiBzaXggZGlmZmVyZW50IG9wdGlvbiB0eXBlcy4gU2VlIHRoZQorLy8vIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGRpZmZlcmVuY2VzLgorbmFtZXNwYWNlIE9wdGlvblR5cGUgeworCisgIGVudW0gT3B0aW9uVHlwZSB7IEFsaWFzLCBTd2l0Y2gsIFN3aXRjaExpc3QsCisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciwgUGFyYW1ldGVyTGlzdCwgUHJlZml4LCBQcmVmaXhMaXN0IH07CisKKyAgYm9vbCBJc0FsaWFzKE9wdGlvblR5cGUgdCkgeworICAgIHJldHVybiAodCA9PSBBbGlhcyk7CisgIH0KKworICBib29sIElzTGlzdCAoT3B0aW9uVHlwZSB0KSB7CisgICAgcmV0dXJuICh0ID09IFN3aXRjaExpc3QgfHwgdCA9PSBQYXJhbWV0ZXJMaXN0IHx8IHQgPT0gUHJlZml4TGlzdCk7CisgIH0KKworICBib29sIElzU3dpdGNoIChPcHRpb25UeXBlIHQpIHsKKyAgICByZXR1cm4gKHQgPT0gU3dpdGNoKTsKKyAgfQorCisgIGJvb2wgSXNTd2l0Y2hMaXN0IChPcHRpb25UeXBlIHQpIHsKKyAgICByZXR1cm4gKHQgPT0gU3dpdGNoTGlzdCk7CisgIH0KKworICBib29sIElzUGFyYW1ldGVyIChPcHRpb25UeXBlIHQpIHsKKyAgICByZXR1cm4gKHQgPT0gUGFyYW1ldGVyIHx8IHQgPT0gUHJlZml4KTsKKyAgfQorCit9CisKK09wdGlvblR5cGU6Ok9wdGlvblR5cGUgc3RyaW5nVG9PcHRpb25UeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBUKSB7CisgIGlmIChUID09ICJhbGlhc19vcHRpb24iKQorICAgIHJldHVybiBPcHRpb25UeXBlOjpBbGlhczsKKyAgZWxzZSBpZiAoVCA9PSAic3dpdGNoX29wdGlvbiIpCisgICAgcmV0dXJuIE9wdGlvblR5cGU6OlN3aXRjaDsKKyAgZWxzZSBpZiAoVCA9PSAic3dpdGNoX2xpc3Rfb3B0aW9uIikKKyAgICByZXR1cm4gT3B0aW9uVHlwZTo6U3dpdGNoTGlzdDsKKyAgZWxzZSBpZiAoVCA9PSAicGFyYW1ldGVyX29wdGlvbiIpCisgICAgcmV0dXJuIE9wdGlvblR5cGU6OlBhcmFtZXRlcjsKKyAgZWxzZSBpZiAoVCA9PSAicGFyYW1ldGVyX2xpc3Rfb3B0aW9uIikKKyAgICByZXR1cm4gT3B0aW9uVHlwZTo6UGFyYW1ldGVyTGlzdDsKKyAgZWxzZSBpZiAoVCA9PSAicHJlZml4X29wdGlvbiIpCisgICAgcmV0dXJuIE9wdGlvblR5cGU6OlByZWZpeDsKKyAgZWxzZSBpZiAoVCA9PSAicHJlZml4X2xpc3Rfb3B0aW9uIikKKyAgICByZXR1cm4gT3B0aW9uVHlwZTo6UHJlZml4TGlzdDsKKyAgZWxzZQorICAgIHRocm93ICJVbmtub3duIG9wdGlvbiB0eXBlOiAiICsgVCArICchJzsKK30KKworbmFtZXNwYWNlIE9wdGlvbkRlc2NyaXB0aW9uRmxhZ3MgeworICBlbnVtIE9wdGlvbkRlc2NyaXB0aW9uRmxhZ3MgeyBSZXF1aXJlZCA9IDB4MSwgSGlkZGVuID0gMHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbHlIaWRkZW4gPSAweDQsIEV4dGVybiA9IDB4OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25lT3JNb3JlID0gMHgxMCwgT3B0aW9uYWwgPSAweDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYVNlcGFyYXRlZCA9IDB4NDAsIEZvcndhcmROb3RTcGxpdCA9IDB4ODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFplcm9Pck1vcmUgPSAweDEwMCB9OworfQorCisvLy8gT3B0aW9uRGVzY3JpcHRpb24gLSBSZXByZXNlbnRzIGRhdGEgY29udGFpbmVkIGluIGEgc2luZ2xlCisvLy8gT3B0aW9uTGlzdCBlbnRyeS4KK3N0cnVjdCBPcHRpb25EZXNjcmlwdGlvbiB7CisgIE9wdGlvblR5cGU6Ok9wdGlvblR5cGUgVHlwZTsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgdW5zaWduZWQgRmxhZ3M7CisgIHN0ZDo6c3RyaW5nIEhlbHA7CisgIHVuc2lnbmVkIE11bHRpVmFsOworICBJbml0KiBJbml0VmFsOworCisgIE9wdGlvbkRlc2NyaXB0aW9uKE9wdGlvblR5cGU6Ok9wdGlvblR5cGUgdCA9IE9wdGlvblR5cGU6OlN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG4gPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGggPSBEZWZhdWx0SGVscFN0cmluZykKKyAgICA6IFR5cGUodCksIE5hbWUobiksIEZsYWdzKDB4MCksIEhlbHAoaCksIE11bHRpVmFsKDEpLCBJbml0VmFsKDApCisgIHt9CisKKyAgLy8vIEdlblR5cGVEZWNsYXJhdGlvbiAtIFJldHVybnMgdGhlIEMrKyB2YXJpYWJsZSB0eXBlIG9mIHRoaXMKKyAgLy8vIG9wdGlvbi4KKyAgY29uc3QgY2hhciogR2VuVHlwZURlY2xhcmF0aW9uKCkgY29uc3Q7CisKKyAgLy8vIEdlblZhcmlhYmxlTmFtZSAtIFJldHVybnMgdGhlIHZhcmlhYmxlIG5hbWUgdXNlZCBpbiB0aGUKKyAgLy8vIGdlbmVyYXRlZCBDKysgY29kZS4KKyAgc3RkOjpzdHJpbmcgR2VuVmFyaWFibGVOYW1lKCkgY29uc3Q7CisKKyAgLy8vIE1lcmdlIC0gTWVyZ2UgdHdvIG9wdGlvbiBkZXNjcmlwdGlvbnMuCisgIHZvaWQgTWVyZ2UgKGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBvdGhlcik7CisKKyAgLy8vIENoZWNrQ29uc2lzdGVuY3kgLSBDaGVjayB0aGF0IHRoZSBmbGFncyBhcmUgY29uc2lzdGVudC4KKyAgdm9pZCBDaGVja0NvbnNpc3RlbmN5KCkgY29uc3Q7CisKKyAgLy8gTWlzYyBjb252ZW5pZW50IGdldHRlcnMvc2V0dGVycy4KKworICBib29sIGlzQWxpYXMoKSBjb25zdDsKKworICBib29sIGlzTXVsdGlWYWwoKSBjb25zdDsKKworICBib29sIGlzQ29tbWFTZXBhcmF0ZWQoKSBjb25zdDsKKyAgdm9pZCBzZXRDb21tYVNlcGFyYXRlZCgpOworCisgIGJvb2wgaXNFeHRlcm4oKSBjb25zdDsKKyAgdm9pZCBzZXRFeHRlcm4oKTsKKworICBib29sIGlzRm9yd2FyZE5vdFNwbGl0KCkgY29uc3Q7CisgIHZvaWQgc2V0Rm9yd2FyZE5vdFNwbGl0KCk7CisKKyAgYm9vbCBpc1JlcXVpcmVkKCkgY29uc3Q7CisgIHZvaWQgc2V0UmVxdWlyZWQoKTsKKworICBib29sIGlzT25lT3JNb3JlKCkgY29uc3Q7CisgIHZvaWQgc2V0T25lT3JNb3JlKCk7CisKKyAgYm9vbCBpc1plcm9Pck1vcmUoKSBjb25zdDsKKyAgdm9pZCBzZXRaZXJvT3JNb3JlKCk7CisKKyAgYm9vbCBpc09wdGlvbmFsKCkgY29uc3Q7CisgIHZvaWQgc2V0T3B0aW9uYWwoKTsKKworICBib29sIGlzSGlkZGVuKCkgY29uc3Q7CisgIHZvaWQgc2V0SGlkZGVuKCk7CisKKyAgYm9vbCBpc1JlYWxseUhpZGRlbigpIGNvbnN0OworICB2b2lkIHNldFJlYWxseUhpZGRlbigpOworCisgIGJvb2wgaXNTd2l0Y2goKSBjb25zdAorICB7IHJldHVybiBPcHRpb25UeXBlOjpJc1N3aXRjaCh0aGlzLT5UeXBlKTsgfQorCisgIGJvb2wgaXNTd2l0Y2hMaXN0KCkgY29uc3QKKyAgeyByZXR1cm4gT3B0aW9uVHlwZTo6SXNTd2l0Y2hMaXN0KHRoaXMtPlR5cGUpOyB9CisKKyAgYm9vbCBpc1BhcmFtZXRlcigpIGNvbnN0CisgIHsgcmV0dXJuIE9wdGlvblR5cGU6OklzUGFyYW1ldGVyKHRoaXMtPlR5cGUpOyB9CisKKyAgYm9vbCBpc0xpc3QoKSBjb25zdAorICB7IHJldHVybiBPcHRpb25UeXBlOjpJc0xpc3QodGhpcy0+VHlwZSk7IH0KKworICBib29sIGlzUGFyYW1ldGVyTGlzdCgpIGNvbnN0CisgIHsgcmV0dXJuIChPcHRpb25UeXBlOjpJc0xpc3QodGhpcy0+VHlwZSkKKyAgICAgICAgICAgICYmICFPcHRpb25UeXBlOjpJc1N3aXRjaExpc3QodGhpcy0+VHlwZSkpOyB9CisKK307CisKK3ZvaWQgT3B0aW9uRGVzY3JpcHRpb246OkNoZWNrQ29uc2lzdGVuY3koKSBjb25zdCB7CisgIHVuc2lnbmVkIGkgPSAwOworCisgIGkgKz0gdGhpcy0+aXNSZXF1aXJlZCgpOworICBpICs9IHRoaXMtPmlzT3B0aW9uYWwoKTsKKyAgaSArPSB0aGlzLT5pc09uZU9yTW9yZSgpOworICBpICs9IHRoaXMtPmlzWmVyb09yTW9yZSgpOworCisgIGlmIChpID4gMSkgeworICAgIHRocm93ICJPbmx5IG9uZSBvZiAocmVxdWlyZWQpLCAob3B0aW9uYWwpLCAob25lX29yX21vcmUpIG9yICIKKyAgICAgICIoemVyb19vcl9tb3JlKSBwcm9wZXJ0aWVzIGlzIGFsbG93ZWQhIjsKKyAgfQorfQorCit2b2lkIE9wdGlvbkRlc2NyaXB0aW9uOjpNZXJnZSAoY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIG90aGVyKQoreworICBpZiAob3RoZXIuVHlwZSAhPSBUeXBlKQorICAgIHRocm93ICJDb25mbGljdGluZyBkZWZpbml0aW9ucyBmb3IgdGhlIG9wdGlvbiAiICsgTmFtZSArICIhIjsKKworICBpZiAoSGVscCA9PSBvdGhlci5IZWxwIHx8IEhlbHAgPT0gRGVmYXVsdEhlbHBTdHJpbmcpCisgICAgSGVscCA9IG90aGVyLkhlbHA7CisgIGVsc2UgaWYgKG90aGVyLkhlbHAgIT0gRGVmYXVsdEhlbHBTdHJpbmcpIHsKKyAgICBsbHZtOjplcnJzKCkgPDwgIldhcm5pbmc6IHNldmVyYWwgZGlmZmVyZW50IGhlbHAgc3RyaW5ncyIKKyAgICAgICIgZGVmaW5lZCBmb3Igb3B0aW9uICIgKyBOYW1lICsgIlxuIjsKKyAgfQorCisgIEZsYWdzIHw9IG90aGVyLkZsYWdzOworfQorCitib29sIE9wdGlvbkRlc2NyaXB0aW9uOjppc0FsaWFzKCkgY29uc3QgeworICByZXR1cm4gT3B0aW9uVHlwZTo6SXNBbGlhcyh0aGlzLT5UeXBlKTsKK30KKworYm9vbCBPcHRpb25EZXNjcmlwdGlvbjo6aXNNdWx0aVZhbCgpIGNvbnN0IHsKKyAgcmV0dXJuIE11bHRpVmFsID4gMTsKK30KKworYm9vbCBPcHRpb25EZXNjcmlwdGlvbjo6aXNDb21tYVNlcGFyYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIEZsYWdzICYgT3B0aW9uRGVzY3JpcHRpb25GbGFnczo6Q29tbWFTZXBhcmF0ZWQ7Cit9Cit2b2lkIE9wdGlvbkRlc2NyaXB0aW9uOjpzZXRDb21tYVNlcGFyYXRlZCgpIHsKKyAgRmxhZ3MgfD0gT3B0aW9uRGVzY3JpcHRpb25GbGFnczo6Q29tbWFTZXBhcmF0ZWQ7Cit9CisKK2Jvb2wgT3B0aW9uRGVzY3JpcHRpb246OmlzRm9yd2FyZE5vdFNwbGl0KCkgY29uc3QgeworICByZXR1cm4gRmxhZ3MgJiBPcHRpb25EZXNjcmlwdGlvbkZsYWdzOjpGb3J3YXJkTm90U3BsaXQ7Cit9Cit2b2lkIE9wdGlvbkRlc2NyaXB0aW9uOjpzZXRGb3J3YXJkTm90U3BsaXQoKSB7CisgIEZsYWdzIHw9IE9wdGlvbkRlc2NyaXB0aW9uRmxhZ3M6OkZvcndhcmROb3RTcGxpdDsKK30KKworYm9vbCBPcHRpb25EZXNjcmlwdGlvbjo6aXNFeHRlcm4oKSBjb25zdCB7CisgIHJldHVybiBGbGFncyAmIE9wdGlvbkRlc2NyaXB0aW9uRmxhZ3M6OkV4dGVybjsKK30KK3ZvaWQgT3B0aW9uRGVzY3JpcHRpb246OnNldEV4dGVybigpIHsKKyAgRmxhZ3MgfD0gT3B0aW9uRGVzY3JpcHRpb25GbGFnczo6RXh0ZXJuOworfQorCitib29sIE9wdGlvbkRlc2NyaXB0aW9uOjppc1JlcXVpcmVkKCkgY29uc3QgeworICByZXR1cm4gRmxhZ3MgJiBPcHRpb25EZXNjcmlwdGlvbkZsYWdzOjpSZXF1aXJlZDsKK30KK3ZvaWQgT3B0aW9uRGVzY3JpcHRpb246OnNldFJlcXVpcmVkKCkgeworICBGbGFncyB8PSBPcHRpb25EZXNjcmlwdGlvbkZsYWdzOjpSZXF1aXJlZDsKK30KKworYm9vbCBPcHRpb25EZXNjcmlwdGlvbjo6aXNPbmVPck1vcmUoKSBjb25zdCB7CisgIHJldHVybiBGbGFncyAmIE9wdGlvbkRlc2NyaXB0aW9uRmxhZ3M6Ok9uZU9yTW9yZTsKK30KK3ZvaWQgT3B0aW9uRGVzY3JpcHRpb246OnNldE9uZU9yTW9yZSgpIHsKKyAgRmxhZ3MgfD0gT3B0aW9uRGVzY3JpcHRpb25GbGFnczo6T25lT3JNb3JlOworfQorCitib29sIE9wdGlvbkRlc2NyaXB0aW9uOjppc1plcm9Pck1vcmUoKSBjb25zdCB7CisgIHJldHVybiBGbGFncyAmIE9wdGlvbkRlc2NyaXB0aW9uRmxhZ3M6Olplcm9Pck1vcmU7Cit9Cit2b2lkIE9wdGlvbkRlc2NyaXB0aW9uOjpzZXRaZXJvT3JNb3JlKCkgeworICBGbGFncyB8PSBPcHRpb25EZXNjcmlwdGlvbkZsYWdzOjpaZXJvT3JNb3JlOworfQorCitib29sIE9wdGlvbkRlc2NyaXB0aW9uOjppc09wdGlvbmFsKCkgY29uc3QgeworICByZXR1cm4gRmxhZ3MgJiBPcHRpb25EZXNjcmlwdGlvbkZsYWdzOjpPcHRpb25hbDsKK30KK3ZvaWQgT3B0aW9uRGVzY3JpcHRpb246OnNldE9wdGlvbmFsKCkgeworICBGbGFncyB8PSBPcHRpb25EZXNjcmlwdGlvbkZsYWdzOjpPcHRpb25hbDsKK30KKworYm9vbCBPcHRpb25EZXNjcmlwdGlvbjo6aXNIaWRkZW4oKSBjb25zdCB7CisgIHJldHVybiBGbGFncyAmIE9wdGlvbkRlc2NyaXB0aW9uRmxhZ3M6OkhpZGRlbjsKK30KK3ZvaWQgT3B0aW9uRGVzY3JpcHRpb246OnNldEhpZGRlbigpIHsKKyAgRmxhZ3MgfD0gT3B0aW9uRGVzY3JpcHRpb25GbGFnczo6SGlkZGVuOworfQorCitib29sIE9wdGlvbkRlc2NyaXB0aW9uOjppc1JlYWxseUhpZGRlbigpIGNvbnN0IHsKKyAgcmV0dXJuIEZsYWdzICYgT3B0aW9uRGVzY3JpcHRpb25GbGFnczo6UmVhbGx5SGlkZGVuOworfQordm9pZCBPcHRpb25EZXNjcmlwdGlvbjo6c2V0UmVhbGx5SGlkZGVuKCkgeworICBGbGFncyB8PSBPcHRpb25EZXNjcmlwdGlvbkZsYWdzOjpSZWFsbHlIaWRkZW47Cit9CisKK2NvbnN0IGNoYXIqIE9wdGlvbkRlc2NyaXB0aW9uOjpHZW5UeXBlRGVjbGFyYXRpb24oKSBjb25zdCB7CisgIHN3aXRjaCAoVHlwZSkgeworICBjYXNlIE9wdGlvblR5cGU6OkFsaWFzOgorICAgIHJldHVybiAiY2w6OmFsaWFzIjsKKyAgY2FzZSBPcHRpb25UeXBlOjpQcmVmaXhMaXN0OgorICBjYXNlIE9wdGlvblR5cGU6OlBhcmFtZXRlckxpc3Q6CisgICAgcmV0dXJuICJjbDo6bGlzdDxzdGQ6OnN0cmluZz4iOworICBjYXNlIE9wdGlvblR5cGU6OlN3aXRjaDoKKyAgICByZXR1cm4gImNsOjpvcHQ8Ym9vbD4iOworICBjYXNlIE9wdGlvblR5cGU6OlN3aXRjaExpc3Q6CisgICAgcmV0dXJuICJjbDo6bGlzdDxib29sPiI7CisgIGNhc2UgT3B0aW9uVHlwZTo6UGFyYW1ldGVyOgorICBjYXNlIE9wdGlvblR5cGU6OlByZWZpeDoKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gImNsOjpvcHQ8c3RkOjpzdHJpbmc+IjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBPcHRpb25EZXNjcmlwdGlvbjo6R2VuVmFyaWFibGVOYW1lKCkgY29uc3QgeworICBjb25zdCBzdGQ6OnN0cmluZyYgRXNjYXBlZE5hbWUgPSBFc2NhcGVWYXJpYWJsZU5hbWUoTmFtZSk7CisgIHN3aXRjaCAoVHlwZSkgeworICBjYXNlIE9wdGlvblR5cGU6OkFsaWFzOgorICAgIHJldHVybiAiQXV0b0dlbmVyYXRlZEFsaWFzXyIgKyBFc2NhcGVkTmFtZTsKKyAgY2FzZSBPcHRpb25UeXBlOjpQcmVmaXhMaXN0OgorICBjYXNlIE9wdGlvblR5cGU6OlBhcmFtZXRlckxpc3Q6CisgICAgcmV0dXJuICJBdXRvR2VuZXJhdGVkTGlzdF8iICsgRXNjYXBlZE5hbWU7CisgIGNhc2UgT3B0aW9uVHlwZTo6U3dpdGNoOgorICAgIHJldHVybiAiQXV0b0dlbmVyYXRlZFN3aXRjaF8iICsgRXNjYXBlZE5hbWU7CisgIGNhc2UgT3B0aW9uVHlwZTo6U3dpdGNoTGlzdDoKKyAgICByZXR1cm4gIkF1dG9HZW5lcmF0ZWRTd2l0Y2hMaXN0XyIgKyBFc2NhcGVkTmFtZTsKKyAgY2FzZSBPcHRpb25UeXBlOjpQcmVmaXg6CisgIGNhc2UgT3B0aW9uVHlwZTo6UGFyYW1ldGVyOgorICBkZWZhdWx0OgorICAgIHJldHVybiAiQXV0b0dlbmVyYXRlZFBhcmFtZXRlcl8iICsgRXNjYXBlZE5hbWU7CisgIH0KK30KKworLy8vIE9wdGlvbkRlc2NyaXB0aW9ucyAtIEFuIE9wdGlvbkRlc2NyaXB0aW9uIGFycmF5IHBsdXMgc29tZSBoZWxwZXIKKy8vLyBmdW5jdGlvbnMuCitjbGFzcyBPcHRpb25EZXNjcmlwdGlvbnMgeworICB0eXBlZGVmIFN0cmluZ01hcDxPcHRpb25EZXNjcmlwdGlvbj4gY29udGFpbmVyX3R5cGU7CisKKyAgLy8vIERlc2NyaXB0aW9ucyAtIEEgbGlzdCBvZiBPcHRpb25EZXNjcmlwdGlvbnMuCisgIGNvbnRhaW5lcl90eXBlIERlc2NyaXB0aW9uczsKKworcHVibGljOgorICAvLy8gRmluZE9wdGlvbiAtIGV4Y2VwdGlvbi10aHJvd2luZyB3cmFwcGVyIGZvciBmaW5kKCkuCisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBGaW5kT3B0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lKSBjb25zdDsKKworICAvLyBXcmFwcGVycyBmb3IgRmluZE9wdGlvbiB0aGF0IHRocm93IGFuIGV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBvcHRpb24gaGFzIGEKKyAgLy8gd3JvbmcgdHlwZS4KKyAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIEZpbmRTd2l0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIE9wdE5hbWUpIGNvbnN0OworICBjb25zdCBPcHRpb25EZXNjcmlwdGlvbiYgRmluZFBhcmFtZXRlcihjb25zdCBzdGQ6OnN0cmluZyYgT3B0TmFtZSkgY29uc3Q7CisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBGaW5kTGlzdChjb25zdCBzdGQ6OnN0cmluZyYgT3B0TmFtZSkgY29uc3Q7CisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBGaW5kUGFyYW1ldGVyTGlzdChjb25zdCBzdGQ6OnN0cmluZyYgT3B0TmFtZSkgY29uc3Q7CisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJgorICBGaW5kTGlzdE9yUGFyYW1ldGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lKSBjb25zdDsKKyAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mCisgIEZpbmRQYXJhbWV0ZXJMaXN0T3JQYXJhbWV0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIE9wdE5hbWUpIGNvbnN0OworCisgIC8vLyBpbnNlcnREZXNjcmlwdGlvbiAtIEluc2VydCBuZXcgT3B0aW9uRGVzY3JpcHRpb24gaW50bworICAvLy8gT3B0aW9uRGVzY3JpcHRpb25zIGxpc3QKKyAgdm9pZCBJbnNlcnREZXNjcmlwdGlvbiAoY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIG8pOworCisgIC8vIFN1cHBvcnQgZm9yIFNUTC1zdHlsZSBpdGVyYXRpb24KKyAgdHlwZWRlZiBjb250YWluZXJfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRGVzY3JpcHRpb25zLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRGVzY3JpcHRpb25zLmVuZCgpOyB9Cit9OworCitjb25zdCBPcHRpb25EZXNjcmlwdGlvbiYKK09wdGlvbkRlc2NyaXB0aW9uczo6RmluZE9wdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgT3B0TmFtZSkgY29uc3QgeworICBjb25zdF9pdGVyYXRvciBJID0gRGVzY3JpcHRpb25zLmZpbmQoT3B0TmFtZSk7CisgIGlmIChJICE9IERlc2NyaXB0aW9ucy5lbmQoKSkKKyAgICByZXR1cm4gSS0+c2Vjb25kOworICBlbHNlCisgICAgdGhyb3cgT3B0TmFtZSArICI6IG5vIHN1Y2ggb3B0aW9uISI7Cit9CisKK2NvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJgorT3B0aW9uRGVzY3JpcHRpb25zOjpGaW5kU3dpdGNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lKSBjb25zdCB7CisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBPcHREZXNjID0gdGhpcy0+RmluZE9wdGlvbihPcHROYW1lKTsKKyAgaWYgKCFPcHREZXNjLmlzU3dpdGNoKCkpCisgICAgdGhyb3cgT3B0TmFtZSArICI6IGluY29ycmVjdCBvcHRpb24gdHlwZSAtIHNob3VsZCBiZSBhIHN3aXRjaCEiOworICByZXR1cm4gT3B0RGVzYzsKK30KKworY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mCitPcHRpb25EZXNjcmlwdGlvbnM6OkZpbmRMaXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lKSBjb25zdCB7CisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBPcHREZXNjID0gdGhpcy0+RmluZE9wdGlvbihPcHROYW1lKTsKKyAgaWYgKCFPcHREZXNjLmlzTGlzdCgpKQorICAgIHRocm93IE9wdE5hbWUgKyAiOiBpbmNvcnJlY3Qgb3B0aW9uIHR5cGUgLSBzaG91bGQgYmUgYSBsaXN0ISI7CisgIHJldHVybiBPcHREZXNjOworfQorCitjb25zdCBPcHRpb25EZXNjcmlwdGlvbiYKK09wdGlvbkRlc2NyaXB0aW9uczo6RmluZFBhcmFtZXRlckxpc3QoY29uc3Qgc3RkOjpzdHJpbmcmIE9wdE5hbWUpIGNvbnN0IHsKKyAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIE9wdERlc2MgPSB0aGlzLT5GaW5kT3B0aW9uKE9wdE5hbWUpOworICBpZiAoIU9wdERlc2MuaXNMaXN0KCkgfHwgT3B0RGVzYy5pc1N3aXRjaExpc3QoKSkKKyAgICB0aHJvdyBPcHROYW1lICsgIjogaW5jb3JyZWN0IG9wdGlvbiB0eXBlIC0gc2hvdWxkIGJlIGEgcGFyYW1ldGVyIGxpc3QhIjsKKyAgcmV0dXJuIE9wdERlc2M7Cit9CisKK2NvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJgorT3B0aW9uRGVzY3JpcHRpb25zOjpGaW5kUGFyYW1ldGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lKSBjb25zdCB7CisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBPcHREZXNjID0gdGhpcy0+RmluZE9wdGlvbihPcHROYW1lKTsKKyAgaWYgKCFPcHREZXNjLmlzUGFyYW1ldGVyKCkpCisgICAgdGhyb3cgT3B0TmFtZSArICI6IGluY29ycmVjdCBvcHRpb24gdHlwZSAtIHNob3VsZCBiZSBhIHBhcmFtZXRlciEiOworICByZXR1cm4gT3B0RGVzYzsKK30KKworY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mCitPcHRpb25EZXNjcmlwdGlvbnM6OkZpbmRMaXN0T3JQYXJhbWV0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIE9wdE5hbWUpIGNvbnN0IHsKKyAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIE9wdERlc2MgPSB0aGlzLT5GaW5kT3B0aW9uKE9wdE5hbWUpOworICBpZiAoIU9wdERlc2MuaXNMaXN0KCkgJiYgIU9wdERlc2MuaXNQYXJhbWV0ZXIoKSkKKyAgICB0aHJvdyBPcHROYW1lCisgICAgICArICI6IGluY29ycmVjdCBvcHRpb24gdHlwZSAtIHNob3VsZCBiZSBhIGxpc3Qgb3IgcGFyYW1ldGVyISI7CisgIHJldHVybiBPcHREZXNjOworfQorCitjb25zdCBPcHRpb25EZXNjcmlwdGlvbiYKK09wdGlvbkRlc2NyaXB0aW9uczo6RmluZFBhcmFtZXRlckxpc3RPclBhcmFtZXRlcgorKGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lKSBjb25zdCB7CisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBPcHREZXNjID0gdGhpcy0+RmluZE9wdGlvbihPcHROYW1lKTsKKyAgaWYgKCghT3B0RGVzYy5pc0xpc3QoKSAmJiAhT3B0RGVzYy5pc1BhcmFtZXRlcigpKSB8fCBPcHREZXNjLmlzU3dpdGNoTGlzdCgpKQorICAgIHRocm93IE9wdE5hbWUKKyAgICAgICsgIjogaW5jb3JyZWN0IG9wdGlvbiB0eXBlIC0gc2hvdWxkIGJlIGEgcGFyYW1ldGVyIGxpc3Qgb3IgcGFyYW1ldGVyISI7CisgIHJldHVybiBPcHREZXNjOworfQorCit2b2lkIE9wdGlvbkRlc2NyaXB0aW9uczo6SW5zZXJ0RGVzY3JpcHRpb24gKGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBvKSB7CisgIGNvbnRhaW5lcl90eXBlOjppdGVyYXRvciBJID0gRGVzY3JpcHRpb25zLmZpbmQoby5OYW1lKTsKKyAgaWYgKEkgIT0gRGVzY3JpcHRpb25zLmVuZCgpKSB7CisgICAgT3B0aW9uRGVzY3JpcHRpb24mIEQgPSBJLT5zZWNvbmQ7CisgICAgRC5NZXJnZShvKTsKKyAgfQorICBlbHNlIHsKKyAgICBEZXNjcmlwdGlvbnNbby5OYW1lXSA9IG87CisgIH0KK30KKworLy8vIEhhbmRsZXJUYWJsZSAtIEEgYmFzZSBjbGFzcyBmb3IgZnVuY3Rpb24gb2JqZWN0cyBpbXBsZW1lbnRlZCBhcworLy8vICd0YWJsZXMgb2YgaGFuZGxlcnMnLgordGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+CitjbGFzcyBIYW5kbGVyVGFibGUgeworcHJvdGVjdGVkOgorICAvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorCisgIC8vLyBIYW5kbGVyTWFwIC0gQSBtYXAgZnJvbSBwcm9wZXJ0eSBuYW1lcyB0byBwcm9wZXJ0eSBoYW5kbGVycworICB0eXBlZGVmIFN0cmluZ01hcDxIYW5kbGVyPiBIYW5kbGVyTWFwOworCisgIHN0YXRpYyBIYW5kbGVyTWFwIEhhbmRsZXJzXzsKKyAgc3RhdGljIGJvb2wgc3RhdGljTWVtYmVyc0luaXRpYWxpemVkXzsKKworcHVibGljOgorCisgIEhhbmRsZXIgR2V0SGFuZGxlciAoY29uc3Qgc3RkOjpzdHJpbmcmIEhhbmRsZXJOYW1lKSBjb25zdCB7CisgICAgdHlwZW5hbWUgSGFuZGxlck1hcDo6aXRlcmF0b3IgbWV0aG9kID0gSGFuZGxlcnNfLmZpbmQoSGFuZGxlck5hbWUpOworCisgICAgaWYgKG1ldGhvZCAhPSBIYW5kbGVyc18uZW5kKCkpIHsKKyAgICAgIEhhbmRsZXIgaCA9IG1ldGhvZC0+c2Vjb25kOworICAgICAgcmV0dXJuIGg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhyb3cgIk5vIGhhbmRsZXIgZm91bmQgZm9yIHByb3BlcnR5ICIgKyBIYW5kbGVyTmFtZSArICIhIjsKKyAgICB9CisgIH0KKworICB2b2lkIEFkZEhhbmRsZXIoY29uc3QgY2hhciogUHJvcGVydHksIEhhbmRsZXIgSCkgeworICAgIEhhbmRsZXJzX1tQcm9wZXJ0eV0gPSBIOworICB9CisKK307CisKK3RlbXBsYXRlIDxjbGFzcyBIYW5kbGVyLCBjbGFzcyBGdW5jdGlvbk9iamVjdD4KK0hhbmRsZXIgR2V0SGFuZGxlcihGdW5jdGlvbk9iamVjdCogT2JqLCBjb25zdCBEYWdJbml0JiBEYWcpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIEhhbmRsZXJOYW1lID0gR2V0T3BlcmF0b3JOYW1lKERhZyk7CisgIHJldHVybiBPYmotPkdldEhhbmRsZXIoSGFuZGxlck5hbWUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRnVuY3Rpb25PYmplY3Q+Cit2b2lkIEludm9rZURhZ0luaXRIYW5kbGVyKEZ1bmN0aW9uT2JqZWN0KiBPYmosIEluaXQqIEkpIHsKKyAgdHlwZWRlZiB2b2lkIChGdW5jdGlvbk9iamVjdDo6KkhhbmRsZXIpIChjb25zdCBEYWdJbml0Jik7CisKKyAgY29uc3QgRGFnSW5pdCYgRGFnID0gSW5pdFB0clRvRGFnKEkpOworICBIYW5kbGVyIGggPSBHZXRIYW5kbGVyPEhhbmRsZXI+KE9iaiwgRGFnKTsKKworICAoKE9iaiktPiooaCkpKERhZyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBGdW5jdGlvbk9iamVjdD4KK3ZvaWQgSW52b2tlRGFnSW5pdEhhbmRsZXIoY29uc3QgRnVuY3Rpb25PYmplY3QqIGNvbnN0IE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdCogSSwgdW5zaWduZWQgSW5kZW50TGV2ZWwsIHJhd19vc3RyZWFtJiBPKQoreworICB0eXBlZGVmIHZvaWQgKEZ1bmN0aW9uT2JqZWN0OjoqSGFuZGxlcikKKyAgICAoY29uc3QgRGFnSW5pdCYsIHVuc2lnbmVkIEluZGVudExldmVsLCByYXdfb3N0cmVhbSYgTykgY29uc3Q7CisKKyAgY29uc3QgRGFnSW5pdCYgRGFnID0gSW5pdFB0clRvRGFnKEkpOworICBIYW5kbGVyIGggPSBHZXRIYW5kbGVyPEhhbmRsZXI+KE9iaiwgRGFnKTsKKworICAoKE9iaiktPiooaCkpKERhZywgSW5kZW50TGV2ZWwsIE8pOworfQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBIPgordHlwZW5hbWUgSGFuZGxlclRhYmxlPEg+OjpIYW5kbGVyTWFwIEhhbmRsZXJUYWJsZTxIPjo6SGFuZGxlcnNfOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSD4KK2Jvb2wgSGFuZGxlclRhYmxlPEg+OjpzdGF0aWNNZW1iZXJzSW5pdGlhbGl6ZWRfID0gZmFsc2U7CisKKworLy8vIENvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzIC0gRnVuY3Rpb24gb2JqZWN0IGZvciBpdGVyYXRpbmcgb3ZlciBhbgorLy8vIG9wdGlvbiBwcm9wZXJ0eSBsaXN0LgorY2xhc3MgQ29sbGVjdE9wdGlvblByb3BlcnRpZXM7Cit0eXBlZGVmIHZvaWQgKENvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzOjoqIENvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzSGFuZGxlcikKKyhjb25zdCBEYWdJbml0Jik7CisKK2NsYXNzIENvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzCis6IHB1YmxpYyBIYW5kbGVyVGFibGU8Q29sbGVjdE9wdGlvblByb3BlcnRpZXNIYW5kbGVyPgoreworcHJpdmF0ZToKKworICAvLy8gb3B0RGVzY3NfIC0gT3B0aW9uRGVzY3JpcHRpb25zIHRhYmxlLiBUaGlzIGlzIHdoZXJlIHRoZQorICAvLy8gaW5mb3JtYXRpb24gaXMgc3RvcmVkLgorICBPcHRpb25EZXNjcmlwdGlvbiYgb3B0RGVzY187CisKK3B1YmxpYzoKKworICBleHBsaWNpdCBDb2xsZWN0T3B0aW9uUHJvcGVydGllcyhPcHRpb25EZXNjcmlwdGlvbiYgT0QpCisgICAgOiBvcHREZXNjXyhPRCkKKyAgeworICAgIGlmICghc3RhdGljTWVtYmVyc0luaXRpYWxpemVkXykgeworICAgICAgQWRkSGFuZGxlcigiZXh0ZXJuIiwgJkNvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzOjpvbkV4dGVybik7CisgICAgICBBZGRIYW5kbGVyKCJoZWxwIiwgJkNvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzOjpvbkhlbHApOworICAgICAgQWRkSGFuZGxlcigiaGlkZGVuIiwgJkNvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzOjpvbkhpZGRlbik7CisgICAgICBBZGRIYW5kbGVyKCJpbml0IiwgJkNvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzOjpvbkluaXQpOworICAgICAgQWRkSGFuZGxlcigibXVsdGlfdmFsIiwgJkNvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzOjpvbk11bHRpVmFsKTsKKyAgICAgIEFkZEhhbmRsZXIoIm9uZV9vcl9tb3JlIiwgJkNvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzOjpvbk9uZU9yTW9yZSk7CisgICAgICBBZGRIYW5kbGVyKCJ6ZXJvX29yX21vcmUiLCAmQ29sbGVjdE9wdGlvblByb3BlcnRpZXM6Om9uWmVyb09yTW9yZSk7CisgICAgICBBZGRIYW5kbGVyKCJyZWFsbHlfaGlkZGVuIiwgJkNvbGxlY3RPcHRpb25Qcm9wZXJ0aWVzOjpvblJlYWxseUhpZGRlbik7CisgICAgICBBZGRIYW5kbGVyKCJyZXF1aXJlZCIsICZDb2xsZWN0T3B0aW9uUHJvcGVydGllczo6b25SZXF1aXJlZCk7CisgICAgICBBZGRIYW5kbGVyKCJvcHRpb25hbCIsICZDb2xsZWN0T3B0aW9uUHJvcGVydGllczo6b25PcHRpb25hbCk7CisgICAgICBBZGRIYW5kbGVyKCJjb21tYV9zZXBhcmF0ZWQiLCAmQ29sbGVjdE9wdGlvblByb3BlcnRpZXM6Om9uQ29tbWFTZXBhcmF0ZWQpOworICAgICAgQWRkSGFuZGxlcigiZm9yd2FyZF9ub3Rfc3BsaXQiLAorICAgICAgICAgICAgICAgICAmQ29sbGVjdE9wdGlvblByb3BlcnRpZXM6Om9uRm9yd2FyZE5vdFNwbGl0KTsKKworICAgICAgc3RhdGljTWVtYmVyc0luaXRpYWxpemVkXyA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8vIG9wZXJhdG9yKCkgLSBKdXN0IGZvcndhcmRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5CisgIC8vLyBoYW5kbGVyLgorICB2b2lkIG9wZXJhdG9yKCkgKEluaXQqIEkpIHsKKyAgICBJbnZva2VEYWdJbml0SGFuZGxlcih0aGlzLCBJKTsKKyAgfQorCitwcml2YXRlOgorCisgIC8vLyBPcHRpb24gcHJvcGVydHkgaGFuZGxlcnMgLS0KKyAgLy8vIE1ldGhvZHMgdGhhdCBoYW5kbGUgb3B0aW9uIHByb3BlcnRpZXMgc3VjaCBhcyAoaGVscCkgb3IgKGhpZGRlbikuCisKKyAgdm9pZCBvbkV4dGVybiAoY29uc3QgRGFnSW5pdCYgZCkgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMCk7CisgICAgb3B0RGVzY18uc2V0RXh0ZXJuKCk7CisgIH0KKworICB2b2lkIG9uSGVscCAoY29uc3QgRGFnSW5pdCYgZCkgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMSk7CisgICAgb3B0RGVzY18uSGVscCA9IEVzY2FwZVF1b3RlcyhJbml0UHRyVG9TdHJpbmcoZC5nZXRBcmcoMCkpKTsKKyAgfQorCisgIHZvaWQgb25IaWRkZW4gKGNvbnN0IERhZ0luaXQmIGQpIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDApOworICAgIG9wdERlc2NfLnNldEhpZGRlbigpOworICB9CisKKyAgdm9pZCBvblJlYWxseUhpZGRlbiAoY29uc3QgRGFnSW5pdCYgZCkgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMCk7CisgICAgb3B0RGVzY18uc2V0UmVhbGx5SGlkZGVuKCk7CisgIH0KKworICB2b2lkIG9uQ29tbWFTZXBhcmF0ZWQgKGNvbnN0IERhZ0luaXQmIGQpIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDApOworICAgIGlmICghb3B0RGVzY18uaXNQYXJhbWV0ZXJMaXN0KCkpCisgICAgICB0aHJvdyAiJ2NvbW1hX3NlcGFyYXRlZCcgaXMgdmFsaWQgb25seSBvbiBwYXJhbWV0ZXIgbGlzdCBvcHRpb25zISI7CisgICAgb3B0RGVzY18uc2V0Q29tbWFTZXBhcmF0ZWQoKTsKKyAgfQorCisgIHZvaWQgb25Gb3J3YXJkTm90U3BsaXQgKGNvbnN0IERhZ0luaXQmIGQpIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDApOworICAgIGlmICghb3B0RGVzY18uaXNQYXJhbWV0ZXIoKSkKKyAgICAgIHRocm93ICInZm9yd2FyZF9ub3Rfc3BsaXQnIGlzIHZhbGlkIG9ubHkgZm9yIHBhcmFtZXRlciBvcHRpb25zISI7CisgICAgb3B0RGVzY18uc2V0Rm9yd2FyZE5vdFNwbGl0KCk7CisgIH0KKworICB2b2lkIG9uUmVxdWlyZWQgKGNvbnN0IERhZ0luaXQmIGQpIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDApOworCisgICAgb3B0RGVzY18uc2V0UmVxdWlyZWQoKTsKKyAgICBvcHREZXNjXy5DaGVja0NvbnNpc3RlbmN5KCk7CisgIH0KKworICB2b2lkIG9uSW5pdCAoY29uc3QgRGFnSW5pdCYgZCkgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMSk7CisgICAgSW5pdCogaSA9IGQuZ2V0QXJnKDApOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIgPSBpLT5nZXRBc1N0cmluZygpOworCisgICAgYm9vbCBjb3JyZWN0ID0gb3B0RGVzY18uaXNQYXJhbWV0ZXIoKSAmJiBkeW5hbWljX2Nhc3Q8U3RyaW5nSW5pdCo+KGkpOworICAgIGNvcnJlY3QgfD0gKG9wdERlc2NfLmlzU3dpdGNoKCkgJiYgKHN0ciA9PSAidHJ1ZSIgfHwgc3RyID09ICJmYWxzZSIpKTsKKworICAgIGlmICghY29ycmVjdCkKKyAgICAgIHRocm93ICJJbmNvcnJlY3QgdXNhZ2Ugb2YgdGhlICdpbml0JyBvcHRpb24gcHJvcGVydHkhIjsKKworICAgIG9wdERlc2NfLkluaXRWYWwgPSBpOworICB9CisKKyAgdm9pZCBvbk9uZU9yTW9yZSAoY29uc3QgRGFnSW5pdCYgZCkgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMCk7CisKKyAgICBvcHREZXNjXy5zZXRPbmVPck1vcmUoKTsKKyAgICBvcHREZXNjXy5DaGVja0NvbnNpc3RlbmN5KCk7CisgIH0KKworICB2b2lkIG9uWmVyb09yTW9yZSAoY29uc3QgRGFnSW5pdCYgZCkgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMCk7CisKKyAgICBpZiAob3B0RGVzY18uaXNMaXN0KCkpCisgICAgICBsbHZtOjplcnJzKCkgPDwgIldhcm5pbmc6IHNwZWNpZnlpbmcgdGhlICd6ZXJvX29yX21vcmUnIHByb3BlcnR5ICIKKyAgICAgICAgIm9uIGEgbGlzdCBvcHRpb24gaGFzIG5vIGVmZmVjdC5cbiI7CisKKyAgICBvcHREZXNjXy5zZXRaZXJvT3JNb3JlKCk7CisgICAgb3B0RGVzY18uQ2hlY2tDb25zaXN0ZW5jeSgpOworICB9CisKKyAgdm9pZCBvbk9wdGlvbmFsIChjb25zdCBEYWdJbml0JiBkKSB7CisgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAwKTsKKworICAgIGlmICghb3B0RGVzY18uaXNMaXN0KCkpCisgICAgICBsbHZtOjplcnJzKCkgPDwgIldhcm5pbmc6IHNwZWNpZnlpbmcgdGhlICdvcHRpb25hbCcgcHJvcGVydHkiCisgICAgICAgICJvbiBhIG5vbi1saXN0IG9wdGlvbiBoYXMgbm8gZWZmZWN0LlxuIjsKKworICAgIG9wdERlc2NfLnNldE9wdGlvbmFsKCk7CisgICAgb3B0RGVzY18uQ2hlY2tDb25zaXN0ZW5jeSgpOworICB9CisKKyAgdm9pZCBvbk11bHRpVmFsIChjb25zdCBEYWdJbml0JiBkKSB7CisgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAxKTsKKyAgICBpbnQgdmFsID0gSW5pdFB0clRvSW50KGQuZ2V0QXJnKDApKTsKKyAgICBpZiAodmFsIDwgMikKKyAgICAgIHRocm93ICJFcnJvciBpbiB0aGUgJ211bHRpX3ZhbCcgcHJvcGVydHk6ICIKKyAgICAgICAgInRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxISI7CisgICAgaWYgKCFvcHREZXNjXy5pc1BhcmFtZXRlckxpc3QoKSkKKyAgICAgIHRocm93ICJUaGUgbXVsdGlfdmFsIHByb3BlcnR5IGlzIHZhbGlkIG9ubHkgb24gbGlzdCBvcHRpb25zISI7CisgICAgb3B0RGVzY18uTXVsdGlWYWwgPSB2YWw7CisgIH0KKworfTsKKworLy8vIEFkZE9wdGlvbiAtIEEgZnVuY3Rpb24gb2JqZWN0IHRoYXQgaXMgYXBwbGllZCB0byBldmVyeSBvcHRpb24KKy8vLyBkZXNjcmlwdGlvbi4gVXNlZCBieSBDb2xsZWN0T3B0aW9uRGVzY3JpcHRpb25zLgorY2xhc3MgQWRkT3B0aW9uIHsKK3ByaXZhdGU6CisgIE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3NfOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEFkZE9wdGlvbihPcHRpb25EZXNjcmlwdGlvbnMmIE9EKSA6IE9wdERlc2NzXyhPRCkKKyAge30KKworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgSW5pdCogaSkgeworICAgIGNvbnN0IERhZ0luaXQmIGQgPSBJbml0UHRyVG9EYWcoaSk7CisgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAxKTsKKworICAgIGNvbnN0IE9wdGlvblR5cGU6Ok9wdGlvblR5cGUgVHlwZSA9CisgICAgICBzdHJpbmdUb09wdGlvblR5cGUoR2V0T3BlcmF0b3JOYW1lKGQpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgTmFtZSA9IEluaXRQdHJUb1N0cmluZyhkLmdldEFyZygwKSk7CisKKyAgICBPcHRpb25EZXNjcmlwdGlvbiBPRChUeXBlLCBOYW1lKTsKKworICAgIGlmICghT0QuaXNFeHRlcm4oKSkKKyAgICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMik7CisKKyAgICBpZiAoT0QuaXNBbGlhcygpKSB7CisgICAgICAvLyBBbGlhc2VzIHN0b3JlIHRoZSBhbGlhc2VkIG9wdGlvbiBuYW1lIGluIHRoZSAnSGVscCcgZmllbGQuCisgICAgICBPRC5IZWxwID0gSW5pdFB0clRvU3RyaW5nKGQuZ2V0QXJnKDEpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIU9ELmlzRXh0ZXJuKCkpIHsKKyAgICAgIHByb2Nlc3NPcHRpb25Qcm9wZXJ0aWVzKGQsIE9EKTsKKyAgICB9CisgICAgT3B0RGVzY3NfLkluc2VydERlc2NyaXB0aW9uKE9EKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gcHJvY2Vzc09wdGlvblByb3BlcnRpZXMgLSBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIG9wdGlvbgorICAvLy8gcHJvcGVydGllcyBhbmQgY2FsbCBhIGNvcnJlc3BvbmRpbmcgaGFuZGxlciBmb3IgZWFjaC4KKyAgc3RhdGljIHZvaWQgcHJvY2Vzc09wdGlvblByb3BlcnRpZXMgKGNvbnN0IERhZ0luaXQmIGQsIE9wdGlvbkRlc2NyaXB0aW9uJiBvKSB7CisgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAyKTsKKyAgICBEYWdJbml0Ojpjb25zdF9hcmdfaXRlcmF0b3IgQiA9IGQuYXJnX2JlZ2luKCk7CisgICAgLy8gU2tpcCB0aGUgZmlyc3QgYXJndW1lbnQ6IGl0J3MgYWx3YXlzIHRoZSBvcHRpb24gbmFtZS4KKyAgICArK0I7CisgICAgc3RkOjpmb3JfZWFjaChCLCBkLmFyZ19lbmQoKSwgQ29sbGVjdE9wdGlvblByb3BlcnRpZXMobykpOworICB9CisKK307CisKKy8vLyBDb2xsZWN0T3B0aW9uRGVzY3JpcHRpb25zIC0gQ29sbGVjdHMgb3B0aW9uIHByb3BlcnRpZXMgZnJvbSBhbGwKKy8vLyBPcHRpb25MaXN0cy4KK3ZvaWQgQ29sbGVjdE9wdGlvbkRlc2NyaXB0aW9ucyAoUmVjb3JkVmVjdG9yOjpjb25zdF9pdGVyYXRvciBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3MpCit7CisgIC8vIEZvciBldmVyeSBPcHRpb25MaXN0OgorICBmb3IgKDsgQiE9RTsgKytCKSB7CisgICAgUmVjb3JkVmVjdG9yOjp2YWx1ZV90eXBlIFQgPSAqQjsKKyAgICAvLyBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdC4KKyAgICBMaXN0SW5pdCogUHJvcExpc3QgPSBULT5nZXRWYWx1ZUFzTGlzdEluaXQoIm9wdGlvbnMiKTsKKworICAgIC8vIEZvciBldmVyeSBvcHRpb24gZGVzY3JpcHRpb24gaW4gdGhpcyBsaXN0OgorICAgIC8vIGNvbGxlY3QgdGhlIGluZm9ybWF0aW9uIGFuZAorICAgIHN0ZDo6Zm9yX2VhY2goUHJvcExpc3QtPmJlZ2luKCksIFByb3BMaXN0LT5lbmQoKSwgQWRkT3B0aW9uKE9wdERlc2NzKSk7CisgIH0KK30KKworLy8gVG9vbCBpbmZvcm1hdGlvbiByZWNvcmQKKworbmFtZXNwYWNlIFRvb2xGbGFncyB7CisgIGVudW0gVG9vbEZsYWdzIHsgSm9pbiA9IDB4MSwgU2luayA9IDB4MiB9OworfQorCitzdHJ1Y3QgVG9vbERlc2NyaXB0aW9uIDogcHVibGljIFJlZkNvdW50ZWRCYXNlPFRvb2xEZXNjcmlwdGlvbj4geworICBzdGQ6OnN0cmluZyBOYW1lOworICBJbml0KiBDbWRMaW5lOworICBJbml0KiBBY3Rpb25zOworICBTdHJWZWN0b3IgSW5MYW5ndWFnZTsKKyAgc3RkOjpzdHJpbmcgSW5GaWxlT3B0aW9uOworICBzdGQ6OnN0cmluZyBPdXRGaWxlT3B0aW9uOworICBzdGQ6OnN0cmluZyBPdXRMYW5ndWFnZTsKKyAgc3RkOjpzdHJpbmcgT3V0cHV0U3VmZml4OworICB1bnNpZ25lZCBGbGFnczsKKyAgY29uc3QgSW5pdCogT25FbXB0eTsKKworICAvLyBWYXJpb3VzIGJvb2xlYW4gcHJvcGVydGllcworICB2b2lkIHNldFNpbmsoKSAgICAgIHsgRmxhZ3MgfD0gVG9vbEZsYWdzOjpTaW5rOyB9CisgIGJvb2wgaXNTaW5rKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiBUb29sRmxhZ3M6OlNpbms7IH0KKyAgdm9pZCBzZXRKb2luKCkgICAgICB7IEZsYWdzIHw9IFRvb2xGbGFnczo6Sm9pbjsgfQorICBib29sIGlzSm9pbigpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgVG9vbEZsYWdzOjpKb2luOyB9CisKKyAgLy8gRGVmYXVsdCBjdG9yIGhlcmUgaXMgbmVlZGVkIGJlY2F1c2UgU3RyaW5nTWFwIGNhbiBvbmx5IHN0b3JlCisgIC8vIERlZmF1bHRDb25zdHJ1Y3RpYmxlIG9iamVjdHMKKyAgVG9vbERlc2NyaXB0aW9uICgpCisgICAgOiBDbWRMaW5lKDApLCBBY3Rpb25zKDApLCBPdXRGaWxlT3B0aW9uKCItbyIpLAorICAgICAgRmxhZ3MoMCksIE9uRW1wdHkoMCkKKyAge30KKyAgVG9vbERlc2NyaXB0aW9uIChjb25zdCBzdGQ6OnN0cmluZyYgbikKKyAgICA6IE5hbWUobiksIENtZExpbmUoMCksIEFjdGlvbnMoMCksIE91dEZpbGVPcHRpb24oIi1vIiksCisgICAgICBGbGFncygwKSwgT25FbXB0eSgwKQorICB7fQorfTsKKworLy8vIFRvb2xEZXNjcmlwdGlvbnMgLSBBIGxpc3Qgb2YgVG9vbCBpbmZvcm1hdGlvbiByZWNvcmRzLgordHlwZWRlZiBzdGQ6OnZlY3RvcjxJbnRydXNpdmVSZWZDbnRQdHI8VG9vbERlc2NyaXB0aW9uPiA+IFRvb2xEZXNjcmlwdGlvbnM7CisKKworLy8vIENvbGxlY3RUb29sUHJvcGVydGllcyAtIEZ1bmN0aW9uIG9iamVjdCBmb3IgaXRlcmF0aW5nIG92ZXIgYSBsaXN0IG9mCisvLy8gdG9vbCBwcm9wZXJ0eSByZWNvcmRzLgorCitjbGFzcyBDb2xsZWN0VG9vbFByb3BlcnRpZXM7Cit0eXBlZGVmIHZvaWQgKENvbGxlY3RUb29sUHJvcGVydGllczo6KiBDb2xsZWN0VG9vbFByb3BlcnRpZXNIYW5kbGVyKQorKGNvbnN0IERhZ0luaXQmKTsKKworY2xhc3MgQ29sbGVjdFRvb2xQcm9wZXJ0aWVzIDogcHVibGljIEhhbmRsZXJUYWJsZTxDb2xsZWN0VG9vbFByb3BlcnRpZXNIYW5kbGVyPgoreworcHJpdmF0ZToKKworICAvLy8gdG9vbERlc2NfIC0gUHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBUb29sLiBUaGlzIGlzIHdoZXJlIHRoZQorICAvLy8gaW5mb3JtYXRpb24gaXMgc3RvcmVkLgorICBUb29sRGVzY3JpcHRpb24mIHRvb2xEZXNjXzsKKworcHVibGljOgorCisgIGV4cGxpY2l0IENvbGxlY3RUb29sUHJvcGVydGllcyAoVG9vbERlc2NyaXB0aW9uJiBkKQorICAgIDogdG9vbERlc2NfKGQpCisgIHsKKyAgICBpZiAoIXN0YXRpY01lbWJlcnNJbml0aWFsaXplZF8pIHsKKworICAgICAgQWRkSGFuZGxlcigiYWN0aW9ucyIsICZDb2xsZWN0VG9vbFByb3BlcnRpZXM6Om9uQWN0aW9ucyk7CisgICAgICBBZGRIYW5kbGVyKCJjb21tYW5kIiwgJkNvbGxlY3RUb29sUHJvcGVydGllczo6b25Db21tYW5kKTsKKyAgICAgIEFkZEhhbmRsZXIoImluX2xhbmd1YWdlIiwgJkNvbGxlY3RUb29sUHJvcGVydGllczo6b25Jbkxhbmd1YWdlKTsKKyAgICAgIEFkZEhhbmRsZXIoImpvaW4iLCAmQ29sbGVjdFRvb2xQcm9wZXJ0aWVzOjpvbkpvaW4pOworICAgICAgQWRkSGFuZGxlcigib3V0X2xhbmd1YWdlIiwgJkNvbGxlY3RUb29sUHJvcGVydGllczo6b25PdXRMYW5ndWFnZSk7CisKKyAgICAgIEFkZEhhbmRsZXIoIm91dF9maWxlX29wdGlvbiIsICZDb2xsZWN0VG9vbFByb3BlcnRpZXM6Om9uT3V0RmlsZU9wdGlvbik7CisgICAgICBBZGRIYW5kbGVyKCJpbl9maWxlX29wdGlvbiIsICZDb2xsZWN0VG9vbFByb3BlcnRpZXM6Om9uSW5GaWxlT3B0aW9uKTsKKworICAgICAgQWRkSGFuZGxlcigib3V0cHV0X3N1ZmZpeCIsICZDb2xsZWN0VG9vbFByb3BlcnRpZXM6Om9uT3V0cHV0U3VmZml4KTsKKyAgICAgIEFkZEhhbmRsZXIoInNpbmsiLCAmQ29sbGVjdFRvb2xQcm9wZXJ0aWVzOjpvblNpbmspOworICAgICAgQWRkSGFuZGxlcigid29ya3Nfb25fZW1wdHkiLCAmQ29sbGVjdFRvb2xQcm9wZXJ0aWVzOjpvbldvcmtzT25FbXB0eSk7CisKKyAgICAgIHN0YXRpY01lbWJlcnNJbml0aWFsaXplZF8gPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IoKSAoSW5pdCogSSkgeworICAgIEludm9rZURhZ0luaXRIYW5kbGVyKHRoaXMsIEkpOworICB9CisKK3ByaXZhdGU6CisKKyAgLy8vIFByb3BlcnR5IGhhbmRsZXJzIC0tCisgIC8vLyBGdW5jdGlvbnMgdGhhdCBleHRyYWN0IGluZm9ybWF0aW9uIGFib3V0IHRvb2wgcHJvcGVydGllcyBmcm9tCisgIC8vLyBEQUcgcmVwcmVzZW50YXRpb24uCisKKyAgdm9pZCBvbkFjdGlvbnMgKGNvbnN0IERhZ0luaXQmIGQpIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDEpOworICAgIEluaXQqIENhc2UgPSBkLmdldEFyZygwKTsKKyAgICBpZiAodHlwZWlkKCpDYXNlKSAhPSB0eXBlaWQoRGFnSW5pdCkgfHwKKyAgICAgICAgR2V0T3BlcmF0b3JOYW1lKHN0YXRpY19jYXN0PERhZ0luaXQmPigqQ2FzZSkpICE9ICJjYXNlIikKKyAgICAgIHRocm93ICJUaGUgYXJndW1lbnQgdG8gKGFjdGlvbnMpIHNob3VsZCBiZSBhICdjYXNlJyBjb25zdHJ1Y3QhIjsKKyAgICB0b29sRGVzY18uQWN0aW9ucyA9IENhc2U7CisgIH0KKworICB2b2lkIG9uQ29tbWFuZCAoY29uc3QgRGFnSW5pdCYgZCkgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMSk7CisgICAgdG9vbERlc2NfLkNtZExpbmUgPSBkLmdldEFyZygwKTsKKyAgfQorCisgIHZvaWQgb25Jbkxhbmd1YWdlIChjb25zdCBEYWdJbml0JiBkKSB7CisgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAxKTsKKyAgICBJbml0KiBhcmcgPSBkLmdldEFyZygwKTsKKworICAgIC8vIEZpbmQgb3V0IHRoZSBhcmd1bWVudCdzIHR5cGUuCisgICAgaWYgKHR5cGVpZCgqYXJnKSA9PSB0eXBlaWQoU3RyaW5nSW5pdCkpIHsKKyAgICAgIC8vIEl0J3MgYSBzdHJpbmcuCisgICAgICB0b29sRGVzY18uSW5MYW5ndWFnZS5wdXNoX2JhY2soSW5pdFB0clRvU3RyaW5nKGFyZykpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vIEl0J3MgYSBsaXN0LgorICAgICAgY29uc3QgTGlzdEluaXQmIGxzdCA9IEluaXRQdHJUb0xpc3QoYXJnKTsKKyAgICAgIFN0clZlY3RvciYgb3V0ID0gdG9vbERlc2NfLkluTGFuZ3VhZ2U7CisKKyAgICAgIC8vIENvcHkgc3RyaW5ncyB0byB0aGUgb3V0cHV0IHZlY3Rvci4KKyAgICAgIGZvciAoTGlzdEluaXQ6OmNvbnN0X2l0ZXJhdG9yIEIgPSBsc3QuYmVnaW4oKSwgRSA9IGxzdC5lbmQoKTsKKyAgICAgICAgICAgQiAhPSBFOyArK0IpIHsKKyAgICAgICAgb3V0LnB1c2hfYmFjayhJbml0UHRyVG9TdHJpbmcoKkIpKTsKKyAgICAgIH0KKworICAgICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXMuCisgICAgICBzdGQ6OnNvcnQob3V0LmJlZ2luKCksIG91dC5lbmQoKSk7CisgICAgICBTdHJWZWN0b3I6Oml0ZXJhdG9yIG5ld0UgPSBzdGQ6OnVuaXF1ZShvdXQuYmVnaW4oKSwgb3V0LmVuZCgpKTsKKyAgICAgIG91dC5lcmFzZShuZXdFLCBvdXQuZW5kKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb25Kb2luIChjb25zdCBEYWdJbml0JiBkKSB7CisgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAwKTsKKyAgICB0b29sRGVzY18uc2V0Sm9pbigpOworICB9CisKKyAgdm9pZCBvbk91dExhbmd1YWdlIChjb25zdCBEYWdJbml0JiBkKSB7CisgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAxKTsKKyAgICB0b29sRGVzY18uT3V0TGFuZ3VhZ2UgPSBJbml0UHRyVG9TdHJpbmcoZC5nZXRBcmcoMCkpOworICB9CisKKyAgdm9pZCBvbk91dEZpbGVPcHRpb24gKGNvbnN0IERhZ0luaXQmIGQpIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDEpOworICAgIHRvb2xEZXNjXy5PdXRGaWxlT3B0aW9uID0gSW5pdFB0clRvU3RyaW5nKGQuZ2V0QXJnKDApKTsKKyAgfQorCisgIHZvaWQgb25JbkZpbGVPcHRpb24gKGNvbnN0IERhZ0luaXQmIGQpIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDEpOworICAgIHRvb2xEZXNjXy5JbkZpbGVPcHRpb24gPSBJbml0UHRyVG9TdHJpbmcoZC5nZXRBcmcoMCkpOworICB9CisKKyAgdm9pZCBvbk91dHB1dFN1ZmZpeCAoY29uc3QgRGFnSW5pdCYgZCkgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMSk7CisgICAgdG9vbERlc2NfLk91dHB1dFN1ZmZpeCA9IEluaXRQdHJUb1N0cmluZyhkLmdldEFyZygwKSk7CisgIH0KKworICB2b2lkIG9uU2luayAoY29uc3QgRGFnSW5pdCYgZCkgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMCk7CisgICAgdG9vbERlc2NfLnNldFNpbmsoKTsKKyAgfQorCisgIHZvaWQgb25Xb3Jrc09uRW1wdHkgKGNvbnN0IERhZ0luaXQmIGQpIHsKKyAgICB0b29sRGVzY18uT25FbXB0eSA9IGQuZ2V0QXJnKDApOworICB9CisKK307CisKKy8vLyBDb2xsZWN0VG9vbERlc2NyaXB0aW9ucyAtIEdhdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0b29sIHByb3BlcnRpZXMKKy8vLyBmcm9tIHRoZSBwYXJzZWQgVGFibGVHZW4gZGF0YSAoYmFzaWNhbGx5IGEgd3JhcHBlciBmb3IgdGhlCisvLy8gQ29sbGVjdFRvb2xQcm9wZXJ0aWVzIGZ1bmN0aW9uIG9iamVjdCkuCit2b2lkIENvbGxlY3RUb29sRGVzY3JpcHRpb25zIChSZWNvcmRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb29sRGVzY3JpcHRpb25zJiBUb29sRGVzY3MpCit7CisgIC8vIEl0ZXJhdGUgb3ZlciBhIHByb3BlcnRpZXMgbGlzdCBvZiBldmVyeSBUb29sIGRlZmluaXRpb24KKyAgZm9yICg7QiE9RTsrK0IpIHsKKyAgICBjb25zdCBSZWNvcmQqIFQgPSAqQjsKKyAgICAvLyBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdC4KKyAgICBMaXN0SW5pdCogUHJvcExpc3QgPSBULT5nZXRWYWx1ZUFzTGlzdEluaXQoInByb3BlcnRpZXMiKTsKKworICAgIEludHJ1c2l2ZVJlZkNudFB0cjxUb29sRGVzY3JpcHRpb24+CisgICAgICBUb29sRGVzYyhuZXcgVG9vbERlc2NyaXB0aW9uKFQtPmdldE5hbWUoKSkpOworCisgICAgc3RkOjpmb3JfZWFjaChQcm9wTGlzdC0+YmVnaW4oKSwgUHJvcExpc3QtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgQ29sbGVjdFRvb2xQcm9wZXJ0aWVzKCpUb29sRGVzYykpOworICAgIFRvb2xEZXNjcy5wdXNoX2JhY2soVG9vbERlc2MpOworICB9Cit9CisKKy8vLyBGaWxsSW5FZGdlVmVjdG9yIC0gTWVyZ2UgYWxsIGNvbXBpbGF0aW9uIGdyYXBoIGRlZmluaXRpb25zIGludG8KKy8vLyBvbmUgc2luZ2xlIGVkZ2UgbGlzdC4KK3ZvaWQgRmlsbEluRWRnZVZlY3RvcihSZWNvcmRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIsCisgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkVmVjdG9yOjpjb25zdF9pdGVyYXRvciBFLCBSZWNvcmRWZWN0b3ImIE91dCkgeworICBmb3IgKDsgQiAhPSBFOyArK0IpIHsKKyAgICBjb25zdCBMaXN0SW5pdCogZWRnZXMgPSAoKkIpLT5nZXRWYWx1ZUFzTGlzdEluaXQoImVkZ2VzIik7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZWRnZXMtPnNpemUoKTsgKytpKQorICAgICAgT3V0LnB1c2hfYmFjayhlZGdlcy0+Z2V0RWxlbWVudEFzUmVjb3JkKGkpKTsKKyAgfQorfQorCisvLy8gQ2FsY3VsYXRlUHJpb3JpdHkgLSBDYWxjdWxhdGUgdGhlIHByaW9yaXR5IG9mIHRoaXMgcGx1Z2luLgoraW50IENhbGN1bGF0ZVByaW9yaXR5KFJlY29yZFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgQiwKKyAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEUpIHsKKyAgaW50IHByaW9yaXR5ID0gMDsKKworICBpZiAoQiAhPSBFKSB7CisgICAgcHJpb3JpdHkgID0gc3RhdGljX2Nhc3Q8aW50PigoKkIpLT5nZXRWYWx1ZUFzSW50KCJwcmlvcml0eSIpKTsKKworICAgIGlmICgrK0IgIT0gRSkKKyAgICAgIHRocm93ICJNb3JlIHRoYW4gb25lICdQbHVnaW5Qcmlvcml0eScgaW5zdGFuY2UgZm91bmQ6ICIKKyAgICAgICAgIm1vc3QgcHJvYmFibHkgYW4gZXJyb3IhIjsKKyAgfQorCisgIHJldHVybiBwcmlvcml0eTsKK30KKworLy8vIE5vdEluR3JhcGggLSBIZWxwZXIgZnVuY3Rpb24gb2JqZWN0IGZvciBGaWx0ZXJOb3RJbkdyYXBoLgorc3RydWN0IE5vdEluR3JhcGggeworcHJpdmF0ZToKKyAgY29uc3QgbGx2bTo6U3RyaW5nU2V0PD4mIFRvb2xzSW5HcmFwaF87CisKK3B1YmxpYzoKKyAgTm90SW5HcmFwaChjb25zdCBsbHZtOjpTdHJpbmdTZXQ8PiYgVG9vbHNJbkdyYXBoKQorICA6IFRvb2xzSW5HcmFwaF8oVG9vbHNJbkdyYXBoKQorICB7fQorCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VG9vbERlc2NyaXB0aW9uPiYgeCkgeworICAgIHJldHVybiAoVG9vbHNJbkdyYXBoXy5jb3VudCh4LT5OYW1lKSA9PSAwKTsKKyAgfQorfTsKKworLy8vIEZpbHRlck5vdEluR3JhcGggLSBGaWx0ZXIgb3V0IGZyb20gVG9vbERlc2NzIGFsbCBUb29scyBub3QKKy8vLyBtZW50aW9uZWQgaW4gdGhlIGNvbXBpbGF0aW9uIGdyYXBoIGRlZmluaXRpb24uCit2b2lkIEZpbHRlck5vdEluR3JhcGggKGNvbnN0IFJlY29yZFZlY3RvciYgRWRnZVZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgVG9vbERlc2NyaXB0aW9ucyYgVG9vbERlc2NzKSB7CisKKyAgLy8gTGlzdCBhbGwgdG9vbHMgbWVudGlvbmVkIGluIHRoZSBncmFwaC4KKyAgbGx2bTo6U3RyaW5nU2V0PD4gVG9vbHNJbkdyYXBoOworCisgIGZvciAoUmVjb3JkVmVjdG9yOjpjb25zdF9pdGVyYXRvciBCID0gRWRnZVZlY3Rvci5iZWdpbigpLAorICAgICAgICAgRSA9IEVkZ2VWZWN0b3IuZW5kKCk7IEIgIT0gRTsgKytCKSB7CisKKyAgICBjb25zdCBSZWNvcmQqIEVkZ2UgPSAqQjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgTm9kZUEgPSBFZGdlLT5nZXRWYWx1ZUFzU3RyaW5nKCJhIik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE5vZGVCID0gRWRnZS0+Z2V0VmFsdWVBc1N0cmluZygiYiIpOworCisgICAgaWYgKE5vZGVBICE9ICJyb290IikKKyAgICAgIFRvb2xzSW5HcmFwaC5pbnNlcnQoTm9kZUEpOworICAgIFRvb2xzSW5HcmFwaC5pbnNlcnQoTm9kZUIpOworICB9CisKKyAgLy8gRmlsdGVyIFRvb2xQcm9wZXJ0aWVzTGlzdC4KKyAgVG9vbERlc2NyaXB0aW9uczo6aXRlcmF0b3IgbmV3X2VuZCA9CisgICAgc3RkOjpyZW1vdmVfaWYoVG9vbERlc2NzLmJlZ2luKCksIFRvb2xEZXNjcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBOb3RJbkdyYXBoKFRvb2xzSW5HcmFwaCkpOworICBUb29sRGVzY3MuZXJhc2UobmV3X2VuZCwgVG9vbERlc2NzLmVuZCgpKTsKK30KKworLy8vIEZpbGxJblRvb2xUb0xhbmcgLSBGaWxscyBpbiB0d28gdGFibGVzIHRoYXQgbWFwIHRvb2wgbmFtZXMgdG8KKy8vLyAoaW5wdXQsIG91dHB1dCkgbGFuZ3VhZ2VzLiAgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgVHlwZWNoZWNrR3JhcGgoKS4KK3ZvaWQgRmlsbEluVG9vbFRvTGFuZyAoY29uc3QgVG9vbERlc2NyaXB0aW9ucyYgVG9vbERlc2NzLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdNYXA8U3RyaW5nU2V0PD4gPiYgVG9vbFRvSW5MYW5nLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdNYXA8c3RkOjpzdHJpbmc+JiBUb29sVG9PdXRMYW5nKSB7CisgIGZvciAoVG9vbERlc2NyaXB0aW9uczo6Y29uc3RfaXRlcmF0b3IgQiA9IFRvb2xEZXNjcy5iZWdpbigpLAorICAgICAgICAgRSA9IFRvb2xEZXNjcy5lbmQoKTsgQiAhPSBFOyArK0IpIHsKKyAgICBjb25zdCBUb29sRGVzY3JpcHRpb24mIEQgPSAqKCpCKTsKKyAgICBmb3IgKFN0clZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgQiA9IEQuSW5MYW5ndWFnZS5iZWdpbigpLAorICAgICAgICAgICBFID0gRC5Jbkxhbmd1YWdlLmVuZCgpOyBCICE9IEU7ICsrQikKKyAgICAgIFRvb2xUb0luTGFuZ1tELk5hbWVdLmluc2VydCgqQik7CisgICAgVG9vbFRvT3V0TGFuZ1tELk5hbWVdID0gRC5PdXRMYW5ndWFnZTsKKyAgfQorfQorCisvLy8gVHlwZWNoZWNrR3JhcGggLSBDaGVjayB0aGF0IG5hbWVzIGZvciBvdXRwdXQgYW5kIGlucHV0IGxhbmd1YWdlcworLy8vIG9uIGFsbCBlZGdlcyBkbyBtYXRjaC4gVGhpcyBkb2Vzbid0IGRvIG11Y2ggd2hlbiB0aGUgaW5mb3JtYXRpb24KKy8vLyBhYm91dCB0aGUgd2hvbGUgZ3JhcGggaXMgbm90IGF2YWlsYWJsZSAoaS5lLiB3aGVuIGNvbXBpbGluZyBtb3N0CisvLy8gcGx1Z2lucykuCit2b2lkIFR5cGVjaGVja0dyYXBoIChjb25zdCBSZWNvcmRWZWN0b3ImIEVkZ2VWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb29sRGVzY3JpcHRpb25zJiBUb29sRGVzY3MpIHsKKyAgU3RyaW5nTWFwPFN0cmluZ1NldDw+ID4gVG9vbFRvSW5MYW5nOworICBTdHJpbmdNYXA8c3RkOjpzdHJpbmc+IFRvb2xUb091dExhbmc7CisKKyAgRmlsbEluVG9vbFRvTGFuZyhUb29sRGVzY3MsIFRvb2xUb0luTGFuZywgVG9vbFRvT3V0TGFuZyk7CisgIFN0cmluZ01hcDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIElBRSA9IFRvb2xUb091dExhbmcuZW5kKCk7CisgIFN0cmluZ01hcDxTdHJpbmdTZXQ8PiA+OjppdGVyYXRvciBJQkUgPSBUb29sVG9JbkxhbmcuZW5kKCk7CisKKyAgZm9yIChSZWNvcmRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIgPSBFZGdlVmVjdG9yLmJlZ2luKCksCisgICAgICAgICBFID0gRWRnZVZlY3Rvci5lbmQoKTsgQiAhPSBFOyArK0IpIHsKKyAgICBjb25zdCBSZWNvcmQqIEVkZ2UgPSAqQjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgTm9kZUEgPSBFZGdlLT5nZXRWYWx1ZUFzU3RyaW5nKCJhIik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE5vZGVCID0gRWRnZS0+Z2V0VmFsdWVBc1N0cmluZygiYiIpOworICAgIFN0cmluZ01hcDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIElBID0gVG9vbFRvT3V0TGFuZy5maW5kKE5vZGVBKTsKKyAgICBTdHJpbmdNYXA8U3RyaW5nU2V0PD4gPjo6aXRlcmF0b3IgSUIgPSBUb29sVG9JbkxhbmcuZmluZChOb2RlQik7CisKKyAgICBpZiAoTm9kZUEgIT0gInJvb3QiKSB7CisgICAgICBpZiAoSUEgIT0gSUFFICYmIElCICE9IElCRSAmJiBJQi0+c2Vjb25kLmNvdW50KElBLT5zZWNvbmQpID09IDApCisgICAgICAgIHRocm93ICJFZGdlICIgKyBOb2RlQSArICItPiIgKyBOb2RlQgorICAgICAgICAgICsgIjogb3V0cHV0LT5pbnB1dCBsYW5ndWFnZSBtaXNtYXRjaCI7CisgICAgfQorCisgICAgaWYgKE5vZGVCID09ICJyb290IikKKyAgICAgIHRocm93ICJFZGdlcyBiYWNrIHRvIHRoZSByb290IGFyZSBub3QgYWxsb3dlZCEiOworICB9Cit9CisKKy8vLyBXYWxrQ2FzZSAtIFdhbGtzIHRoZSAnY2FzZScgZXhwcmVzc2lvbiBEQUcgYW5kIGludm9rZXMKKy8vLyBUZXN0Q2FsbGJhY2sgb24gZXZlcnkgdGVzdCwgYW5kIFN0YXRlbWVudENhbGxiYWNrIG9uIGV2ZXJ5CisvLy8gc3RhdGVtZW50LiBIYW5kbGVzICdjYXNlJyBuZXN0aW5nLCBidXQgbm90IHRoZSAnYW5kJyBhbmQgJ29yJworLy8vIGNvbWJpbmF0b3JzICh0aGF0IGlzLCB0aGV5IGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gVGVzdENhbGxiYWNrKS4KKy8vLyBUZXN0Q2FsbGJhY2sgbXVzdCBoYXZlIHR5cGUgJ3ZvaWQgVGVzdENhbGxiYWNrKGNvbnN0IERhZ0luaXQqLCB1bnNpZ25lZAorLy8vIEluZGVudExldmVsLCBib29sIEZpcnN0VGVzdCknLgorLy8vIFN0YXRlbWVudENhbGxiYWNrIG11c3QgaGF2ZSB0eXBlICd2b2lkIFN0YXRlbWVudENhbGxiYWNrKGNvbnN0IEluaXQqLAorLy8vIHVuc2lnbmVkIEluZGVudExldmVsKScuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRjEsIHR5cGVuYW1lIEYyPgordm9pZCBXYWxrQ2FzZShjb25zdCBJbml0KiBDYXNlLCBGMSBUZXN0Q2FsbGJhY2ssIEYyIFN0YXRlbWVudENhbGxiYWNrLAorICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCA9IDApCit7CisgIGNvbnN0IERhZ0luaXQmIGQgPSBJbml0UHRyVG9EYWcoQ2FzZSk7CisKKyAgLy8gRXJyb3IgY2hlY2tzLgorICBpZiAoR2V0T3BlcmF0b3JOYW1lKGQpICE9ICJjYXNlIikKKyAgICB0aHJvdyAiV2Fsa0Nhc2Ugc2hvdWxkIGJlIGludm9rZWQgb25seSBvbiAnY2FzZScgZXhwcmVzc2lvbnMhIjsKKworICBpZiAoZC5nZXROdW1BcmdzKCkgPCAyKQorICAgIHRocm93ICJUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGNsYXVzZSBpbiB0aGUgJ2Nhc2UnIGV4cHJlc3Npb246XG4iCisgICAgICArIGQuZ2V0QXNTdHJpbmcoKTsKKworICAvLyBNYWluIGxvb3AuCisgIGJvb2wgZXZlbiA9IGZhbHNlOworICBjb25zdCB1bnNpZ25lZCBudW1BcmdzID0gZC5nZXROdW1BcmdzKCk7CisgIHVuc2lnbmVkIGkgPSAxOworICBmb3IgKERhZ0luaXQ6OmNvbnN0X2FyZ19pdGVyYXRvciBCID0gZC5hcmdfYmVnaW4oKSwgRSA9IGQuYXJnX2VuZCgpOworICAgICAgIEIgIT0gRTsgKytCKSB7CisgICAgSW5pdCogYXJnID0gKkI7CisKKyAgICBpZiAoIWV2ZW4pCisgICAgeworICAgICAgLy8gSGFuZGxlIHRlc3QuCisgICAgICBjb25zdCBEYWdJbml0JiBUZXN0ID0gSW5pdFB0clRvRGFnKGFyZyk7CisKKyAgICAgIGlmIChHZXRPcGVyYXRvck5hbWUoVGVzdCkgPT0gImRlZmF1bHQiICYmIChpKzEgIT0gbnVtQXJncykpCisgICAgICAgIHRocm93ICJUaGUgJ2RlZmF1bHQnIGNsYXVzZSBzaG91bGQgYmUgdGhlIGxhc3QgaW4gdGhlICIKKyAgICAgICAgICAiJ2Nhc2UnIGNvbnN0cnVjdCEiOworICAgICAgaWYgKGkgPT0gbnVtQXJncykKKyAgICAgICAgdGhyb3cgIkNhc2UgY29uc3RydWN0IGhhbmRsZXI6IG5vIGNvcnJlc3BvbmRpbmcgYWN0aW9uICIKKyAgICAgICAgICAiZm91bmQgZm9yIHRoZSB0ZXN0ICIgKyBUZXN0LmdldEFzU3RyaW5nKCkgKyAnISc7CisKKyAgICAgIFRlc3RDYWxsYmFjayhUZXN0LCBJbmRlbnRMZXZlbCwgKGkgPT0gMSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKGR5bmFtaWNfY2FzdDxEYWdJbml0Kj4oYXJnKQorICAgICAgICAgICYmIEdldE9wZXJhdG9yTmFtZShzdGF0aWNfY2FzdDxEYWdJbml0Jj4oKmFyZykpID09ICJjYXNlIikgeworICAgICAgICAvLyBOZXN0ZWQgJ2Nhc2UnLgorICAgICAgICBXYWxrQ2FzZShhcmcsIFRlc3RDYWxsYmFjaywgU3RhdGVtZW50Q2FsbGJhY2ssIEluZGVudExldmVsICsgSW5kZW50MSk7CisgICAgICB9CisKKyAgICAgIC8vIEhhbmRsZSBzdGF0ZW1lbnQuCisgICAgICBTdGF0ZW1lbnRDYWxsYmFjayhhcmcsIEluZGVudExldmVsKTsKKyAgICB9CisKKyAgICArK2k7CisgICAgZXZlbiA9ICFldmVuOworICB9Cit9CisKKy8vLyBFeHRyYWN0T3B0aW9uTmFtZXMgLSBBIGhlbHBlciBmdW5jdGlvbiBvYmplY3QgdXNlZCBieQorLy8vIENoZWNrRm9yU3VwZXJmbHVvdXNPcHRpb25zKCkgdG8gd2FsayB0aGUgJ2Nhc2UnIERBRy4KK2NsYXNzIEV4dHJhY3RPcHRpb25OYW1lcyB7CisgIGxsdm06OlN0cmluZ1NldDw+JiBPcHRpb25OYW1lc187CisKKyAgdm9pZCBwcm9jZXNzRGFnKGNvbnN0IEluaXQqIFN0YXRlbWVudCkgeworICAgIGNvbnN0IERhZ0luaXQmIFN0bXQgPSBJbml0UHRyVG9EYWcoU3RhdGVtZW50KTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgQWN0aW9uTmFtZSA9IEdldE9wZXJhdG9yTmFtZShTdG10KTsKKyAgICBpZiAoQWN0aW9uTmFtZSA9PSAiZm9yd2FyZCIgfHwgQWN0aW9uTmFtZSA9PSAiZm9yd2FyZF9hcyIgfHwKKyAgICAgICAgQWN0aW9uTmFtZSA9PSAiZm9yd2FyZF92YWx1ZSIgfHwKKyAgICAgICAgQWN0aW9uTmFtZSA9PSAiZm9yd2FyZF90cmFuc2Zvcm1lZF92YWx1ZSIgfHwKKyAgICAgICAgQWN0aW9uTmFtZSA9PSAic3dpdGNoX29uIiB8fCBBY3Rpb25OYW1lID09ICJhbnlfc3dpdGNoX29uIiB8fAorICAgICAgICBBY3Rpb25OYW1lID09ICJwYXJhbWV0ZXJfZXF1YWxzIiB8fAorICAgICAgICBBY3Rpb25OYW1lID09ICJlbGVtZW50X2luX2xpc3QiIHx8IEFjdGlvbk5hbWUgPT0gIm5vdF9lbXB0eSIgfHwKKyAgICAgICAgQWN0aW9uTmFtZSA9PSAiZW1wdHkiKSB7CisgICAgICBDaGVja051bWJlck9mQXJndW1lbnRzKFN0bXQsIDEpOworCisgICAgICBJbml0KiBBcmcgPSBTdG10LmdldEFyZygwKTsKKyAgICAgIGlmICh0eXBlaWQoKkFyZykgPT0gdHlwZWlkKFN0cmluZ0luaXQpKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBOYW1lID0gSW5pdFB0clRvU3RyaW5nKEFyZyk7CisgICAgICAgIE9wdGlvbk5hbWVzXy5pbnNlcnQoTmFtZSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gSXQncyBhIGxpc3QuCisgICAgICAgIGNvbnN0IExpc3RJbml0JiBMaXN0ID0gSW5pdFB0clRvTGlzdChBcmcpOworICAgICAgICBmb3IgKExpc3RJbml0Ojpjb25zdF9pdGVyYXRvciBCID0gTGlzdC5iZWdpbigpLCBFID0gTGlzdC5lbmQoKTsKKyAgICAgICAgICAgICBCICE9IEU7ICsrQikgeworICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBOYW1lID0gSW5pdFB0clRvU3RyaW5nKCpCKTsKKyAgICAgICAgICBPcHRpb25OYW1lc18uaW5zZXJ0KE5hbWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKEFjdGlvbk5hbWUgPT0gImFuZCIgfHwgQWN0aW9uTmFtZSA9PSAib3IiIHx8IEFjdGlvbk5hbWUgPT0gIm5vdCIpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIE51bUFyZ3MgPSBTdG10LmdldE51bUFyZ3MoKTsgaSA8IE51bUFyZ3M7ICsraSkgeworICAgICAgICB0aGlzLT5wcm9jZXNzRGFnKFN0bXQuZ2V0QXJnKGkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHVibGljOgorICBFeHRyYWN0T3B0aW9uTmFtZXMobGx2bTo6U3RyaW5nU2V0PD4mIE9wdGlvbk5hbWVzKSA6IE9wdGlvbk5hbWVzXyhPcHRpb25OYW1lcykKKyAge30KKworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgSW5pdCogU3RhdGVtZW50KSB7CisgICAgaWYgKHR5cGVpZCgqU3RhdGVtZW50KSA9PSB0eXBlaWQoTGlzdEluaXQpKSB7CisgICAgICBjb25zdCBMaXN0SW5pdCYgRGFnTGlzdCA9ICpzdGF0aWNfY2FzdDxjb25zdCBMaXN0SW5pdCo+KFN0YXRlbWVudCk7CisgICAgICBmb3IgKExpc3RJbml0Ojpjb25zdF9pdGVyYXRvciBCID0gRGFnTGlzdC5iZWdpbigpLCBFID0gRGFnTGlzdC5lbmQoKTsKKyAgICAgICAgICAgQiAhPSBFOyArK0IpCisgICAgICAgIHRoaXMtPnByb2Nlc3NEYWcoKkIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRoaXMtPnByb2Nlc3NEYWcoU3RhdGVtZW50KTsKKyAgICB9CisgIH0KKworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgRGFnSW5pdCYgVGVzdCwgdW5zaWduZWQsIGJvb2wpIHsKKyAgICB0aGlzLT5vcGVyYXRvcigpKCZUZXN0KTsKKyAgfQorICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgSW5pdCogU3RhdGVtZW50LCB1bnNpZ25lZCkgeworICAgIHRoaXMtPm9wZXJhdG9yKCkoU3RhdGVtZW50KTsKKyAgfQorfTsKKworLy8vIENoZWNrRm9yU3VwZXJmbHVvdXNPcHRpb25zIC0gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gc2lkZQorLy8vIGVmZmVjdC1mcmVlIG9wdGlvbnMgKHNwZWNpZmllZCBvbmx5IGluIHRoZSBPcHRpb25MaXN0KS4gT3RoZXJ3aXNlLAorLy8vIG91dHB1dCBhIHdhcm5pbmcuCit2b2lkIENoZWNrRm9yU3VwZXJmbHVvdXNPcHRpb25zIChjb25zdCBSZWNvcmRWZWN0b3ImIEVkZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVG9vbERlc2NyaXB0aW9ucyYgVG9vbERlc2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcykgeworICBsbHZtOjpTdHJpbmdTZXQ8PiBub25TdXBlcmZsdW91c09wdGlvbnM7CisKKyAgLy8gQWRkIGFsbCBvcHRpb25zIG1lbnRpb25lZCBpbiB0aGUgVG9vbERlc2MuQWN0aW9ucyB0byB0aGUgc2V0IG9mCisgIC8vIG5vbi1zdXBlcmZsdW91cyBvcHRpb25zLgorICBmb3IgKFRvb2xEZXNjcmlwdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIEIgPSBUb29sRGVzY3MuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBUb29sRGVzY3MuZW5kKCk7IEIgIT0gRTsgKytCKSB7CisgICAgY29uc3QgVG9vbERlc2NyaXB0aW9uJiBURCA9ICooKkIpOworICAgIEV4dHJhY3RPcHRpb25OYW1lcyBDYWxsYmFjayhub25TdXBlcmZsdW91c09wdGlvbnMpOworICAgIGlmIChURC5BY3Rpb25zKQorICAgICAgV2Fsa0Nhc2UoVEQuQWN0aW9ucywgQ2FsbGJhY2ssIENhbGxiYWNrKTsKKyAgfQorCisgIC8vIEFkZCBhbGwgb3B0aW9ucyBtZW50aW9uZWQgaW4gdGhlICdjYXNlJyBjbGF1c2VzIG9mIHRoZQorICAvLyBPcHRpb25hbEVkZ2VzIG9mIHRoZSBjb21waWxhdGlvbiBncmFwaCB0byB0aGUgc2V0IG9mCisgIC8vIG5vbi1zdXBlcmZsdW91cyBvcHRpb25zLgorICBmb3IgKFJlY29yZFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgQiA9IEVkZ2VzLmJlZ2luKCksIEUgPSBFZGdlcy5lbmQoKTsKKyAgICAgICBCICE9IEU7ICsrQikgeworICAgIGNvbnN0IFJlY29yZCogRWRnZSA9ICpCOworICAgIERhZ0luaXQmIFdlaWdodCA9ICpFZGdlLT5nZXRWYWx1ZUFzRGFnKCJ3ZWlnaHQiKTsKKworICAgIGlmICghSXNEYWdFbXB0eShXZWlnaHQpKQorICAgICAgV2Fsa0Nhc2UoJldlaWdodCwgRXh0cmFjdE9wdGlvbk5hbWVzKG5vblN1cGVyZmx1b3VzT3B0aW9ucyksIElkKCkpOworICB9CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgb3B0aW9ucyBpbiBPcHREZXNjcyBiZWxvbmcgdG8gdGhlIHNldCBvZgorICAvLyBub24tc3VwZXJmbHVvdXMgb3B0aW9ucy4KKyAgZm9yIChPcHRpb25EZXNjcmlwdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIEIgPSBPcHREZXNjcy5iZWdpbigpLAorICAgICAgICAgRSA9IE9wdERlc2NzLmVuZCgpOyBCICE9IEU7ICsrQikgeworICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBWYWwgPSBCLT5zZWNvbmQ7CisgICAgaWYgKCFub25TdXBlcmZsdW91c09wdGlvbnMuY291bnQoVmFsLk5hbWUpCisgICAgICAgICYmIFZhbC5UeXBlICE9IE9wdGlvblR5cGU6OkFsaWFzKQorICAgICAgbGx2bTo6ZXJycygpIDw8ICJXYXJuaW5nOiBvcHRpb24gJy0iIDw8IFZhbC5OYW1lIDw8ICInIGhhcyBubyBlZmZlY3QhICIKKyAgICAgICAgIlByb2JhYmxlIGNhdXNlOiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQgb25seSBpbiB0aGUgT3B0aW9uTGlzdC5cbiI7CisgIH0KK30KKworLy8vIEVtaXRDYXNlVGVzdDBBcmdzIC0gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgRW1pdENhc2VDb25zdHJ1Y3RIYW5kbGVyKCkuCitib29sIEVtaXRDYXNlVGVzdDBBcmdzKGNvbnN0IHN0ZDo6c3RyaW5nJiBUZXN0TmFtZSwgcmF3X29zdHJlYW0mIE8pIHsKKyAgaWYgKFRlc3ROYW1lID09ICJzaW5nbGVfaW5wdXRfZmlsZSIpIHsKKyAgICBPIDw8ICJJbnB1dEZpbGVuYW1lcy5zaXplKCkgPT0gMSI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZWxzZSBpZiAoVGVzdE5hbWUgPT0gIm11bHRpcGxlX2lucHV0X2ZpbGVzIikgeworICAgIE8gPDwgIklucHV0RmlsZW5hbWVzLnNpemUoKSA+IDEiOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gRW1pdExpc3RUZXN0IC0gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgRW1pdENhc2VUZXN0MUFyZ0xpc3QoKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgordm9pZCBFbWl0TGlzdFRlc3QoY29uc3QgTGlzdEluaXQmIEwsIGNvbnN0IGNoYXIqIExvZ2ljT3AsCisgICAgICAgICAgICAgICAgICBGIENhbGxiYWNrLCByYXdfb3N0cmVhbSYgTykKK3sKKyAgLy8gVGhpcyBpcyBhIGxvdCBsaWtlIEVtaXRMb2dpY2FsT3BlcmF0aW9uVGVzdCwgYnV0IHdvcmtzIG9uIExpc3RJbml0cyBpbnN0ZWFkCisgIC8vIG9mIERhZ3MuLi4KKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChMaXN0SW5pdDo6Y29uc3RfaXRlcmF0b3IgQiA9IEwuYmVnaW4oKSwgRSA9IEwuZW5kKCk7IEIgIT0gRTsgKytCKSB7CisgICAgaWYgKGlzRmlyc3QpCisgICAgICBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZQorICAgICAgTyA8PCAnICcgPDwgTG9naWNPcCA8PCAnICc7CisgICAgQ2FsbGJhY2soSW5pdFB0clRvU3RyaW5nKCpCKSwgTyk7CisgIH0KK30KKworLy8gQ2FsbGJhY2tzIGZvciB1c2Ugd2l0aCBFbWl0TGlzdFRlc3QuCisKK2NsYXNzIEVtaXRTd2l0Y2hPbiB7CisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3NfOworcHVibGljOgorICBFbWl0U3dpdGNoT24oY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcykgOiBPcHREZXNjc18oT3B0RGVzY3MpCisgIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lLCByYXdfb3N0cmVhbSYgTykgY29uc3QgeworICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBPcHREZXNjID0gT3B0RGVzY3NfLkZpbmRTd2l0Y2goT3B0TmFtZSk7CisgICAgTyA8PCBPcHREZXNjLkdlblZhcmlhYmxlTmFtZSgpOworICB9Cit9OworCitjbGFzcyBFbWl0RW1wdHlUZXN0IHsKKyAgYm9vbCBFbWl0TmVnYXRlXzsKKyAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjc187CitwdWJsaWM6CisgIEVtaXRFbXB0eVRlc3QoYm9vbCBFbWl0TmVnYXRlLCBjb25zdCBPcHRpb25EZXNjcmlwdGlvbnMmIE9wdERlc2NzKQorICAgIDogRW1pdE5lZ2F0ZV8oRW1pdE5lZ2F0ZSksIE9wdERlc2NzXyhPcHREZXNjcykKKyAge30KKworICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIE9wdE5hbWUsIHJhd19vc3RyZWFtJiBPKSBjb25zdCB7CisgICAgY29uc3QgY2hhciogTmVnID0gKEVtaXROZWdhdGVfID8gIiEiIDogIiIpOworICAgIGlmIChPcHROYW1lID09ICJvIikgeworICAgICAgTyA8PCBOZWcgPDwgIk91dHB1dEZpbGVuYW1lLmVtcHR5KCkiOworICAgIH0KKyAgICBlbHNlIGlmIChPcHROYW1lID09ICJzYXZlLXRlbXBzIikgeworICAgICAgTyA8PCBOZWcgPDwgIihTYXZlVGVtcHMgPT0gU2F2ZVRlbXBzRW51bTo6VW5zZXQpIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjb25zdCBPcHRpb25EZXNjcmlwdGlvbiYgT3B0RGVzYyA9IE9wdERlc2NzXy5GaW5kTGlzdE9yUGFyYW1ldGVyKE9wdE5hbWUpOworICAgICAgTyA8PCBOZWcgPDwgT3B0RGVzYy5HZW5WYXJpYWJsZU5hbWUoKSA8PCAiLmVtcHR5KCkiOworICAgIH0KKyAgfQorfTsKKworCisvLy8gRW1pdENhc2VUZXN0MUFyZ0xpc3QgLSBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBFbWl0Q2FzZVRlc3QxQXJnKCk7Citib29sIEVtaXRDYXNlVGVzdDFBcmdMaXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBUZXN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGFnSW5pdCYgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0mIE8pIHsKKyAgY29uc3QgTGlzdEluaXQmIEwgPSBJbml0UHRyVG9MaXN0KGQuZ2V0QXJnKDApKTsKKworICBpZiAoVGVzdE5hbWUgPT0gImFueV9zd2l0Y2hfb24iKSB7CisgICAgRW1pdExpc3RUZXN0KEwsICJ8fCIsIEVtaXRTd2l0Y2hPbihPcHREZXNjcyksIE8pOworICAgIHJldHVybiB0cnVlOworICB9CisgIGVsc2UgaWYgKFRlc3ROYW1lID09ICJzd2l0Y2hfb24iKSB7CisgICAgRW1pdExpc3RUZXN0KEwsICImJiIsIEVtaXRTd2l0Y2hPbihPcHREZXNjcyksIE8pOworICAgIHJldHVybiB0cnVlOworICB9CisgIGVsc2UgaWYgKFRlc3ROYW1lID09ICJhbnlfbm90X2VtcHR5IikgeworICAgIEVtaXRMaXN0VGVzdChMLCAifHwiLCBFbWl0RW1wdHlUZXN0KHRydWUsIE9wdERlc2NzKSwgTyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZWxzZSBpZiAoVGVzdE5hbWUgPT0gImFueV9lbXB0eSIpIHsKKyAgICBFbWl0TGlzdFRlc3QoTCwgInx8IiwgRW1pdEVtcHR5VGVzdChmYWxzZSwgT3B0RGVzY3MpLCBPKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBlbHNlIGlmIChUZXN0TmFtZSA9PSAibm90X2VtcHR5IikgeworICAgIEVtaXRMaXN0VGVzdChMLCAiJiYiLCBFbWl0RW1wdHlUZXN0KHRydWUsIE9wdERlc2NzKSwgTyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZWxzZSBpZiAoVGVzdE5hbWUgPT0gImVtcHR5IikgeworICAgIEVtaXRMaXN0VGVzdChMLCAiJiYiLCBFbWl0RW1wdHlUZXN0KGZhbHNlLCBPcHREZXNjcyksIE8pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gRW1pdENhc2VUZXN0MUFyZ1N0ciAtIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IEVtaXRDYXNlVGVzdDFBcmcoKTsKK2Jvb2wgRW1pdENhc2VUZXN0MUFyZ1N0cihjb25zdCBzdGQ6OnN0cmluZyYgVGVzdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGFnSW5pdCYgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25EZXNjcmlwdGlvbnMmIE9wdERlc2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtJiBPKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lID0gSW5pdFB0clRvU3RyaW5nKGQuZ2V0QXJnKDApKTsKKworICBpZiAoVGVzdE5hbWUgPT0gInN3aXRjaF9vbiIpIHsKKyAgICBhcHBseShFbWl0U3dpdGNoT24oT3B0RGVzY3MpLCBPcHROYW1lLCBPKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBlbHNlIGlmIChUZXN0TmFtZSA9PSAiaW5wdXRfbGFuZ3VhZ2VzX2NvbnRhaW4iKSB7CisgICAgTyA8PCAiSW5MYW5ncy5jb3VudChcIiIgPDwgT3B0TmFtZSA8PCAiXCIpICE9IDAiOworICAgIHJldHVybiB0cnVlOworICB9CisgIGVsc2UgaWYgKFRlc3ROYW1lID09ICJpbl9sYW5ndWFnZSIpIHsKKyAgICAvLyBUaGlzIHdvcmtzIG9ubHkgZm9yIHNpbmdsZS1hcmd1bWVudCBUb29sOjpHZW5lcmF0ZUFjdGlvbi4gSm9pbgorICAgIC8vIHRvb2xzIGNhbiBwcm9jZXNzIHNldmVyYWwgZmlsZXMgaW4gZGlmZmVyZW50IGxhbmd1YWdlcyBzaW11bHRhbmVvdXNseS4KKworICAgIC8vIFRPRE86IG1ha2UgdGhpcyB3b3JrIHdpdGggRWRnZTo6V2VpZ2h0IChpZiBwb3NzaWJsZSkuCisgICAgTyA8PCAiTGFuZ01hcC5HZXRMYW5ndWFnZShpbkZpbGUpID09IFwiIiA8PCBPcHROYW1lIDw8ICdcIic7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZWxzZSBpZiAoVGVzdE5hbWUgPT0gIm5vdF9lbXB0eSIgfHwgVGVzdE5hbWUgPT0gImVtcHR5IikgeworICAgIGJvb2wgRW1pdE5lZ2F0ZSA9IChUZXN0TmFtZSA9PSAibm90X2VtcHR5Iik7CisgICAgYXBwbHkoRW1pdEVtcHR5VGVzdChFbWl0TmVnYXRlLCBPcHREZXNjcyksIE9wdE5hbWUsIE8pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gRW1pdENhc2VUZXN0MUFyZyAtIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IEVtaXRDYXNlQ29uc3RydWN0SGFuZGxlcigpOworYm9vbCBFbWl0Q2FzZVRlc3QxQXJnKGNvbnN0IHN0ZDo6c3RyaW5nJiBUZXN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYWdJbml0JiBkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3MsCisgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0mIE8pIHsKKyAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAxKTsKKyAgaWYgKHR5cGVpZCgqZC5nZXRBcmcoMCkpID09IHR5cGVpZChMaXN0SW5pdCkpCisgICAgcmV0dXJuIEVtaXRDYXNlVGVzdDFBcmdMaXN0KFRlc3ROYW1lLCBkLCBPcHREZXNjcywgTyk7CisgIGVsc2UKKyAgICByZXR1cm4gRW1pdENhc2VUZXN0MUFyZ1N0cihUZXN0TmFtZSwgZCwgT3B0RGVzY3MsIE8pOworfQorCisvLy8gRW1pdENhc2VUZXN0MkFyZ3MgLSBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBFbWl0Q2FzZUNvbnN0cnVjdEhhbmRsZXIoKS4KK2Jvb2wgRW1pdENhc2VUZXN0MkFyZ3MoY29uc3Qgc3RkOjpzdHJpbmcmIFRlc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYWdJbml0JiBkLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcywKKyAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0mIE8pIHsKKyAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAyKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIE9wdE5hbWUgPSBJbml0UHRyVG9TdHJpbmcoZC5nZXRBcmcoMCkpOworICBjb25zdCBzdGQ6OnN0cmluZyYgT3B0QXJnID0gSW5pdFB0clRvU3RyaW5nKGQuZ2V0QXJnKDEpKTsKKworICBpZiAoVGVzdE5hbWUgPT0gInBhcmFtZXRlcl9lcXVhbHMiKSB7CisgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIE9wdERlc2MgPSBPcHREZXNjcy5GaW5kUGFyYW1ldGVyKE9wdE5hbWUpOworICAgIE8gPDwgT3B0RGVzYy5HZW5WYXJpYWJsZU5hbWUoKSA8PCAiID09IFwiIiA8PCBPcHRBcmcgPDwgIlwiIjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBlbHNlIGlmIChUZXN0TmFtZSA9PSAiZWxlbWVudF9pbl9saXN0IikgeworICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBPcHREZXNjID0gT3B0RGVzY3MuRmluZFBhcmFtZXRlckxpc3QoT3B0TmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIFZhck5hbWUgPSBPcHREZXNjLkdlblZhcmlhYmxlTmFtZSgpOworICAgIE8gPDwgInN0ZDo6ZmluZCgiIDw8IFZhck5hbWUgPDwgIi5iZWdpbigpLFxuIjsKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbCArIEluZGVudDEpCisgICAgICA8PCBWYXJOYW1lIDw8ICIuZW5kKCksIFwiIgorICAgICAgPDwgT3B0QXJnIDw8ICJcIikgIT0gIiA8PCBWYXJOYW1lIDw8ICIuZW5kKCkiOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uLgorLy8gRW1pdExvZ2ljYWxPcGVyYXRpb25UZXN0IGFuZCBFbWl0Q2FzZVRlc3QgYXJlIG11dHVhbGx5IHJlY3Vyc2l2ZS4KK3ZvaWQgRW1pdENhc2VUZXN0KGNvbnN0IERhZ0luaXQmIGQsIHVuc2lnbmVkIEluZGVudExldmVsLAorICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcywKKyAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtJiBPKTsKKworLy8vIEVtaXRMb2dpY2FsT3BlcmF0aW9uVGVzdCAtIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5CisvLy8gRW1pdENhc2VDb25zdHJ1Y3RIYW5kbGVyLgordm9pZCBFbWl0TG9naWNhbE9wZXJhdGlvblRlc3QoY29uc3QgRGFnSW5pdCYgZCwgY29uc3QgY2hhciogTG9naWNPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtJiBPKSB7CisgIE8gPDwgJygnOworICBmb3IgKHVuc2lnbmVkIGogPSAwLCBOdW1BcmdzID0gZC5nZXROdW1BcmdzKCk7IGogPCBOdW1BcmdzOyArK2opIHsKKyAgICBjb25zdCBEYWdJbml0JiBJbm5lclRlc3QgPSBJbml0UHRyVG9EYWcoZC5nZXRBcmcoaikpOworICAgIEVtaXRDYXNlVGVzdChJbm5lclRlc3QsIEluZGVudExldmVsLCBPcHREZXNjcywgTyk7CisgICAgaWYgKGogIT0gTnVtQXJncyAtIDEpIHsKKyAgICAgIE8gPDwgIilcbiI7CisgICAgICBPLmluZGVudChJbmRlbnRMZXZlbCArIEluZGVudDEpIDw8ICcgJyA8PCBMb2dpY09wIDw8ICIgKCI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgTyA8PCAnKSc7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRW1pdExvZ2ljYWxOb3QoY29uc3QgRGFnSW5pdCYgZCwgdW5zaWduZWQgSW5kZW50TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3MsIHJhd19vc3RyZWFtJiBPKQoreworICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDEpOworICBjb25zdCBEYWdJbml0JiBJbm5lclRlc3QgPSBJbml0UHRyVG9EYWcoZC5nZXRBcmcoMCkpOworICBPIDw8ICIhICgiOworICBFbWl0Q2FzZVRlc3QoSW5uZXJUZXN0LCBJbmRlbnRMZXZlbCwgT3B0RGVzY3MsIE8pOworICBPIDw8ICIpIjsKK30KKworLy8vIEVtaXRDYXNlVGVzdCAtIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IEVtaXRDYXNlQ29uc3RydWN0SGFuZGxlci4KK3ZvaWQgRW1pdENhc2VUZXN0KGNvbnN0IERhZ0luaXQmIGQsIHVuc2lnbmVkIEluZGVudExldmVsLAorICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcywKKyAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtJiBPKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBUZXN0TmFtZSA9IEdldE9wZXJhdG9yTmFtZShkKTsKKworICBpZiAoVGVzdE5hbWUgPT0gImFuZCIpCisgICAgRW1pdExvZ2ljYWxPcGVyYXRpb25UZXN0KGQsICImJiIsIEluZGVudExldmVsLCBPcHREZXNjcywgTyk7CisgIGVsc2UgaWYgKFRlc3ROYW1lID09ICJvciIpCisgICAgRW1pdExvZ2ljYWxPcGVyYXRpb25UZXN0KGQsICJ8fCIsIEluZGVudExldmVsLCBPcHREZXNjcywgTyk7CisgIGVsc2UgaWYgKFRlc3ROYW1lID09ICJub3QiKQorICAgIEVtaXRMb2dpY2FsTm90KGQsIEluZGVudExldmVsLCBPcHREZXNjcywgTyk7CisgIGVsc2UgaWYgKEVtaXRDYXNlVGVzdDBBcmdzKFRlc3ROYW1lLCBPKSkKKyAgICByZXR1cm47CisgIGVsc2UgaWYgKEVtaXRDYXNlVGVzdDFBcmcoVGVzdE5hbWUsIGQsIE9wdERlc2NzLCBPKSkKKyAgICByZXR1cm47CisgIGVsc2UgaWYgKEVtaXRDYXNlVGVzdDJBcmdzKFRlc3ROYW1lLCBkLCBJbmRlbnRMZXZlbCwgT3B0RGVzY3MsIE8pKQorICAgIHJldHVybjsKKyAgZWxzZQorICAgIHRocm93ICJVbmtub3duIHRlc3QgJyIgKyBUZXN0TmFtZSArICInIHVzZWQgaW4gdGhlICdjYXNlJyBjb25zdHJ1Y3QhIjsKK30KKworCisvLy8gRW1pdENhc2VUZXN0Q2FsbGJhY2sgLSBDYWxsYmFjayB1c2VkIGJ5IEVtaXRDYXNlQ29uc3RydWN0SGFuZGxlci4KK2NsYXNzIEVtaXRDYXNlVGVzdENhbGxiYWNrIHsKKyAgYm9vbCBFbWl0RWxzZUlmXzsKKyAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjc187CisgIHJhd19vc3RyZWFtJiBPXzsKK3B1YmxpYzoKKworICBFbWl0Q2FzZVRlc3RDYWxsYmFjayhib29sIEVtaXRFbHNlSWYsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3MsIHJhd19vc3RyZWFtJiBPKQorICAgIDogRW1pdEVsc2VJZl8oRW1pdEVsc2VJZiksIE9wdERlc2NzXyhPcHREZXNjcyksIE9fKE8pCisgIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IERhZ0luaXQmIFRlc3QsIHVuc2lnbmVkIEluZGVudExldmVsLCBib29sIEZpcnN0VGVzdCkKKyAgeworICAgIGlmIChHZXRPcGVyYXRvck5hbWUoVGVzdCkgPT0gImRlZmF1bHQiKSB7CisgICAgICBPXy5pbmRlbnQoSW5kZW50TGV2ZWwpIDw8ICJlbHNlIHtcbiI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgT18uaW5kZW50KEluZGVudExldmVsKQorICAgICAgICA8PCAoKCFGaXJzdFRlc3QgJiYgRW1pdEVsc2VJZl8pID8gImVsc2UgaWYgKCIgOiAiaWYgKCIpOworICAgICAgRW1pdENhc2VUZXN0KFRlc3QsIEluZGVudExldmVsLCBPcHREZXNjc18sIE9fKTsKKyAgICAgIE9fIDw8ICIpIHtcbiI7CisgICAgfQorICB9Cit9OworCisvLy8gRW1pdENhc2VTdGF0ZW1lbnRDYWxsYmFjayAtIENhbGxiYWNrIHVzZWQgYnkgRW1pdENhc2VDb25zdHJ1Y3RIYW5kbGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIEY+CitjbGFzcyBFbWl0Q2FzZVN0YXRlbWVudENhbGxiYWNrIHsKKyAgRiBDYWxsYmFja187CisgIHJhd19vc3RyZWFtJiBPXzsKK3B1YmxpYzoKKworICBFbWl0Q2FzZVN0YXRlbWVudENhbGxiYWNrKEYgQ2FsbGJhY2ssIHJhd19vc3RyZWFtJiBPKQorICAgIDogQ2FsbGJhY2tfKENhbGxiYWNrKSwgT18oTykKKyAge30KKworICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IEluaXQqIFN0YXRlbWVudCwgdW5zaWduZWQgSW5kZW50TGV2ZWwpIHsKKworICAgIC8vIElnbm9yZSBuZXN0ZWQgJ2Nhc2UnIERBRy4KKyAgICBpZiAoIShkeW5hbWljX2Nhc3Q8Y29uc3QgRGFnSW5pdCo+KFN0YXRlbWVudCkgJiYKKyAgICAgICAgICBHZXRPcGVyYXRvck5hbWUoc3RhdGljX2Nhc3Q8Y29uc3QgRGFnSW5pdCY+KCpTdGF0ZW1lbnQpKSA9PSAiY2FzZSIpKSB7CisgICAgICBpZiAodHlwZWlkKCpTdGF0ZW1lbnQpID09IHR5cGVpZChMaXN0SW5pdCkpIHsKKyAgICAgICAgY29uc3QgTGlzdEluaXQmIERhZ0xpc3QgPSAqc3RhdGljX2Nhc3Q8Y29uc3QgTGlzdEluaXQqPihTdGF0ZW1lbnQpOworICAgICAgICBmb3IgKExpc3RJbml0Ojpjb25zdF9pdGVyYXRvciBCID0gRGFnTGlzdC5iZWdpbigpLCBFID0gRGFnTGlzdC5lbmQoKTsKKyAgICAgICAgICAgICBCICE9IEU7ICsrQikKKyAgICAgICAgICBDYWxsYmFja18oKkIsIChJbmRlbnRMZXZlbCArIEluZGVudDEpLCBPXyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgQ2FsbGJhY2tfKFN0YXRlbWVudCwgKEluZGVudExldmVsICsgSW5kZW50MSksIE9fKTsKKyAgICAgIH0KKyAgICB9CisgICAgT18uaW5kZW50KEluZGVudExldmVsKSA8PCAifVxuIjsKKyAgfQorCit9OworCisvLy8gRW1pdENhc2VDb25zdHJ1Y3RIYW5kbGVyIC0gRW1pdCBjb2RlIHRoYXQgaGFuZGxlcyB0aGUgJ2Nhc2UnCisvLy8gY29uc3RydWN0LiBUYWtlcyBhIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHNob3VsZCBlbWl0IGNvZGUgZm9yIGV2ZXJ5IGNhc2UKKy8vLyBjbGF1c2UuIEltcGxlbWVudGVkIG9uIHRvcCBvZiBXYWxrQ2FzZS4KKy8vLyBDYWxsYmFjaydzIHR5cGUgaXMgdm9pZCBGKGNvbnN0IEluaXQqIFN0YXRlbWVudCwgdW5zaWduZWQgSW5kZW50TGV2ZWwsCisvLy8gcmF3X29zdHJlYW0mIE8pLgorLy8vIEVtaXRFbHNlSWYgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSB0eXBlIG9mIGNvbmRpdGlvbiB0aGF0IGlzIGVtaXR0ZWQgKCdpZgorLy8vICguLikgey4ufSBlbHNlIGlmICguLikge30gLi4gZWxzZSB7Li59JyB2cy4gJ2lmICguLikgey4ufSBpZiguLikgIHsuLn0KKy8vLyAuLiBlbHNlIHsuLn0nKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgordm9pZCBFbWl0Q2FzZUNvbnN0cnVjdEhhbmRsZXIoY29uc3QgSW5pdCogQ2FzZSwgdW5zaWduZWQgSW5kZW50TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGIENhbGxiYWNrLCBib29sIEVtaXRFbHNlSWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25EZXNjcmlwdGlvbnMmIE9wdERlc2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0mIE8pIHsKKyAgV2Fsa0Nhc2UoQ2FzZSwgRW1pdENhc2VUZXN0Q2FsbGJhY2soRW1pdEVsc2VJZiwgT3B0RGVzY3MsIE8pLAorICAgICAgICAgICBFbWl0Q2FzZVN0YXRlbWVudENhbGxiYWNrPEY+KENhbGxiYWNrLCBPKSwgSW5kZW50TGV2ZWwpOworfQorCisvLy8gVG9rZW5pemVDbWRMaW5lIC0gY29udmVydHMgZnJvbQorLy8vICIkQ0FMTChIb29rTmFtZSwgJ0FyZzEnLCAnQXJnMicpL3BhdGggLWFyZzEgLWFyZzIiIHRvCisvLy8gWyIkQ0FMTCgiLCAiSG9va05hbWUiLCAiQXJnMSIsICJBcmcyIiwgIikvcGF0aCIsICItYXJnMSIsICItYXJnMiJdLgordm9pZCBUb2tlbml6ZUNtZExpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIENtZExpbmUsIFN0clZlY3RvciYgT3V0KSB7CisgIGNvbnN0IGNoYXIqIERlbGltaXRlcnMgPSAiIFx0XG5cdlxmXHIiOworICBlbnVtIFRva2VuaXplclN0YXRlCisgIHsgTm9ybWFsLCBTcGVjaWFsQ29tbWFuZCwgSW5zaWRlU3BlY2lhbENvbW1hbmQsIEluc2lkZVF1b3RhdGlvbk1hcmtzIH0KKyAgY3VyX3N0ICA9IE5vcm1hbDsKKworICBpZiAoQ21kTGluZS5lbXB0eSgpKQorICAgIHJldHVybjsKKyAgT3V0LnB1c2hfYmFjaygiIik7CisKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBCID0gQ21kTGluZS5maW5kX2ZpcnN0X25vdF9vZihEZWxpbWl0ZXJzKSwKKyAgICBFID0gQ21kTGluZS5zaXplKCk7CisKKyAgZm9yICg7IEIgIT0gRTsgKytCKSB7CisgICAgY2hhciBjdXJfY2ggPSBDbWRMaW5lW0JdOworCisgICAgc3dpdGNoIChjdXJfc3QpIHsKKyAgICBjYXNlIE5vcm1hbDoKKyAgICAgIGlmIChjdXJfY2ggPT0gJyQnKSB7CisgICAgICAgIGN1cl9zdCA9IFNwZWNpYWxDb21tYW5kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChPbmVPZihEZWxpbWl0ZXJzLCBjdXJfY2gpKSB7CisgICAgICAgIC8vIFNraXAgd2hpdGVzcGFjZQorICAgICAgICBCID0gQ21kTGluZS5maW5kX2ZpcnN0X25vdF9vZihEZWxpbWl0ZXJzLCBCKTsKKyAgICAgICAgaWYgKEIgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBCID0gRS0xOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC0tQjsKKyAgICAgICAgT3V0LnB1c2hfYmFjaygiIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgU3BlY2lhbENvbW1hbmQ6CisgICAgICBpZiAoT25lT2YoRGVsaW1pdGVycywgY3VyX2NoKSkgeworICAgICAgICBjdXJfc3QgPSBOb3JtYWw7CisgICAgICAgIE91dC5wdXNoX2JhY2soIiIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJfY2ggPT0gJygnKSB7CisgICAgICAgIE91dC5wdXNoX2JhY2soIiIpOworICAgICAgICBjdXJfc3QgPSBJbnNpZGVTcGVjaWFsQ29tbWFuZDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgSW5zaWRlU3BlY2lhbENvbW1hbmQ6CisgICAgICBpZiAoT25lT2YoRGVsaW1pdGVycywgY3VyX2NoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJfY2ggPT0gJ1wnJykgeworICAgICAgICBjdXJfc3QgPSBJbnNpZGVRdW90YXRpb25NYXJrczsKKyAgICAgICAgT3V0LnB1c2hfYmFjaygiIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGN1cl9jaCA9PSAnKScpIHsKKyAgICAgICAgY3VyX3N0ID0gTm9ybWFsOworICAgICAgICBPdXQucHVzaF9iYWNrKCIiKTsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJfY2ggPT0gJywnKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgSW5zaWRlUXVvdGF0aW9uTWFya3M6CisgICAgICBpZiAoY3VyX2NoID09ICdcJycpIHsKKyAgICAgICAgY3VyX3N0ID0gSW5zaWRlU3BlY2lhbENvbW1hbmQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgT3V0LmJhY2soKS5wdXNoX2JhY2soY3VyX2NoKTsKKyAgfQorfQorCisvLy8gU3Vic3RpdHV0ZUNhbGwgLSBHaXZlbiAiJENBTEwoSG9va05hbWUsIFtBcmcxIFssIEFyZzIgWy4uLl1dXSkiLCBvdXRwdXQKKy8vLyAiaG9va3M6Okhvb2tOYW1lKFtBcmcxIFssIEFyZzIgWywgLi4uXV1dKSIuIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5CisvLy8gU3Vic3RpdHV0ZVNwZWNpYWxDb21tYW5kcygpLgorU3RyVmVjdG9yOjpjb25zdF9pdGVyYXRvcgorU3Vic3RpdHV0ZUNhbGwgKFN0clZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgUG9zLAorICAgICAgICAgICAgICAgIFN0clZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgIGJvb2wgSXNKb2luLCByYXdfb3N0cmVhbSYgTykKK3sKKyAgY29uc3QgY2hhciogZXJyb3JNZXNzYWdlID0gIlN5bnRheCBlcnJvciBpbiAkQ0FMTCBpbnZvY2F0aW9uISI7CisgIENoZWNrZWRJbmNyZW1lbnQoUG9zLCBFbmQsIGVycm9yTWVzc2FnZSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBDbWROYW1lID0gKlBvczsKKworICBpZiAoQ21kTmFtZSA9PSAiKSIpCisgICAgdGhyb3cgIiRDQUxMIGludm9jYXRpb246IGVtcHR5IGFyZ3VtZW50IGxpc3QhIjsKKworICBPIDw8ICJob29rczo6IjsKKyAgTyA8PCBDbWROYW1lIDw8ICIoIjsKKworCisgIGJvb2wgZmlyc3RJdGVyYXRpb24gPSB0cnVlOworICB3aGlsZSAodHJ1ZSkgeworICAgIENoZWNrZWRJbmNyZW1lbnQoUG9zLCBFbmQsIGVycm9yTWVzc2FnZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIEFyZyA9ICpQb3M7CisgICAgYXNzZXJ0KEFyZy5zaXplKCkgIT0gMCk7CisKKyAgICBpZiAoQXJnWzBdID09ICcpJykKKyAgICAgIGJyZWFrOworCisgICAgaWYgKGZpcnN0SXRlcmF0aW9uKQorICAgICAgZmlyc3RJdGVyYXRpb24gPSBmYWxzZTsKKyAgICBlbHNlCisgICAgICBPIDw8ICIsICI7CisKKyAgICBpZiAoQXJnID09ICIkSU5GSUxFIikgeworICAgICAgaWYgKElzSm9pbikKKyAgICAgICAgdGhyb3cgIiRDQUxMKEhvb2ssICRJTkZJTEUpIGNhbid0IGJlIHVzZWQgd2l0aCBhIEpvaW4gdG9vbCEiOworICAgICAgZWxzZQorICAgICAgICBPIDw8ICJpbkZpbGUuY19zdHIoKSI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgTyA8PCAnIicgPDwgQXJnIDw8ICciJzsKKyAgICB9CisgIH0KKworICBPIDw8ICcpJzsKKworICByZXR1cm4gUG9zOworfQorCisvLy8gU3Vic3RpdHV0ZUVudiAtIEdpdmVuICckRU5WKFZBUl9OQU1FKScsIG91dHB1dCAnZ2V0ZW52KCJWQVJfTkFNRSIpJy4gSGVscGVyCisvLy8gZnVuY3Rpb24gdXNlZCBieSBTdWJzdGl0dXRlU3BlY2lhbENvbW1hbmRzKCkuCitTdHJWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yCitTdWJzdGl0dXRlRW52IChTdHJWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIFBvcywKKyAgICAgICAgICAgICAgIFN0clZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgRW5kLCByYXdfb3N0cmVhbSYgTykKK3sKKyAgY29uc3QgY2hhciogZXJyb3JNZXNzYWdlID0gIlN5bnRheCBlcnJvciBpbiAkRU5WIGludm9jYXRpb24hIjsKKyAgQ2hlY2tlZEluY3JlbWVudChQb3MsIEVuZCwgZXJyb3JNZXNzYWdlKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIEVudk5hbWUgPSAqUG9zOworCisgIGlmIChFbnZOYW1lID09ICIpIikKKyAgICB0aHJvdyAiJEVOViBpbnZvY2F0aW9uOiBlbXB0eSBhcmd1bWVudCBsaXN0ISI7CisKKyAgTyA8PCAiY2hlY2tDU3RyaW5nKHN0ZDo6Z2V0ZW52KFwiIjsKKyAgTyA8PCBFbnZOYW1lOworICBPIDw8ICJcIikpIjsKKworICBDaGVja2VkSW5jcmVtZW50KFBvcywgRW5kLCBlcnJvck1lc3NhZ2UpOworCisgIHJldHVybiBQb3M7Cit9CisKKy8vLyBTdWJzdGl0dXRlU3BlY2lhbENvbW1hbmRzIC0gR2l2ZW4gYW4gaW52b2NhdGlvbiBvZiAkQ0FMTCBvciAkRU5WLCBvdXRwdXQKKy8vLyBoYW5kbGVyIGNvZGUuIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IEVtaXRDbWRMaW5lVmVjRmlsbCgpLgorU3RyVmVjdG9yOjpjb25zdF9pdGVyYXRvcgorU3Vic3RpdHV0ZVNwZWNpYWxDb21tYW5kcyAoU3RyVmVjdG9yOjpjb25zdF9pdGVyYXRvciBQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNKb2luLCByYXdfb3N0cmVhbSYgTykKK3sKKworICBjb25zdCBzdGQ6OnN0cmluZyYgY21kID0gKlBvczsKKworICAvLyBQZXJmb3JtIHN1YnN0aXR1dGlvbi4KKyAgaWYgKGNtZCA9PSAiJENBTEwiKSB7CisgICAgUG9zID0gU3Vic3RpdHV0ZUNhbGwoUG9zLCBFbmQsIElzSm9pbiwgTyk7CisgIH0KKyAgZWxzZSBpZiAoY21kID09ICIkRU5WIikgeworICAgIFBvcyA9IFN1YnN0aXR1dGVFbnYoUG9zLCBFbmQsIE8pOworICB9CisgIGVsc2UgeworICAgIHRocm93ICJVbmtub3duIHNwZWNpYWwgY29tbWFuZDogIiArIGNtZDsKKyAgfQorCisgIC8vIEhhbmRsZSAnJENNRChBUkcpL2FkZGl0aW9uYWwvdGV4dCcuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBMZWZ0b3ZlciA9ICpQb3M7CisgIGFzc2VydChMZWZ0b3Zlci5hdCgwKSA9PSAnKScpOworICBpZiAoTGVmdG92ZXIuc2l6ZSgpICE9IDEpCisgICAgTyA8PCAiICsgc3RkOjpzdHJpbmcoXCIiIDw8IChMZWZ0b3Zlci5jX3N0cigpICsgMSkgPDwgIlwiKSI7CisKKyAgcmV0dXJuIFBvczsKK30KKworLy8vIEVtaXRDbWRMaW5lVmVjRmlsbCAtIEVtaXQgY29kZSB0aGF0IGZpbGxzIGluIHRoZSBjb21tYW5kIGxpbmUKKy8vLyB2ZWN0b3IuIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IEVtaXRHZW5lcmF0ZUFjdGlvbk1ldGhvZCgpLgordm9pZCBFbWl0Q21kTGluZVZlY0ZpbGwoY29uc3QgSW5pdCogQ21kTGluZSwgY29uc3Qgc3RkOjpzdHJpbmcmIFRvb2xOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0pvaW4sIHVuc2lnbmVkIEluZGVudExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0mIE8pIHsKKyAgU3RyVmVjdG9yIFN0clZlYzsKKyAgVG9rZW5pemVDbWRMaW5lKEluaXRQdHJUb1N0cmluZyhDbWRMaW5lKSwgU3RyVmVjKTsKKworICBpZiAoU3RyVmVjLmVtcHR5KCkpCisgICAgdGhyb3cgIlRvb2wgJyIgKyBUb29sTmFtZSArICInIGhhcyBlbXB0eSBjb21tYW5kIGxpbmUhIjsKKworICBTdHJWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIgPSBTdHJWZWMuYmVnaW4oKSwgRSA9IFN0clZlYy5lbmQoKTsKKworICAvLyBFbWl0IHRoZSBjb21tYW5kIGl0c2VsZi4KKyAgYXNzZXJ0KCFTdHJWZWNbMF0uZW1wdHkoKSk7CisgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAiY21kID0gIjsKKyAgaWYgKFN0clZlY1swXVswXSA9PSAnJCcpIHsKKyAgICBCID0gU3Vic3RpdHV0ZVNwZWNpYWxDb21tYW5kcyhCLCBFLCBJc0pvaW4sIE8pOworICAgICsrQjsKKyAgfQorICBlbHNlIHsKKyAgICBPIDw8ICciJyA8PCBTdHJWZWNbMF0gPDwgJyInOworICAgICsrQjsKKyAgfQorICBPIDw8ICI7XG4iOworCisgIC8vIEdvIHRocm91Z2ggdGhlIGNvbW1hbmQgYXJndW1lbnRzLgorICBhc3NlcnQoQiA8PSBFKTsKKyAgZm9yICg7IEIgIT0gRTsgKytCKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNtZCA9ICpCOworCisgICAgYXNzZXJ0KCFjbWQuZW1wdHkoKSk7CisgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpOworCisgICAgaWYgKGNtZC5hdCgwKSA9PSAnJCcpIHsKKyAgICAgIE8gPDwgInZlYy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoMCwgIjsKKyAgICAgIEIgPSBTdWJzdGl0dXRlU3BlY2lhbENvbW1hbmRzKEIsIEUsIElzSm9pbiwgTyk7CisgICAgICBPIDw8ICIpKTtcbiI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgTyA8PCAidmVjLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigwLCBcIiIgPDwgY21kIDw8ICJcIikpO1xuIjsKKyAgICB9CisgIH0KKworfQorCisvLy8gRW1pdEZvckVhY2hMaXN0RWxlbWVudEN5Y2xlSGVhZGVyIC0gRW1pdCBjb21tb24gY29kZSBmb3IgaXRlcmF0aW5nIHRocm91Z2gKKy8vLyBhbGwgZWxlbWVudHMgb2YgYSBsaXN0LiBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieQorLy8vIEVtaXRGb3J3YXJkT3B0aW9uUHJvcGVydHlIYW5kbGluZ0NvZGUuCit2b2lkIEVtaXRGb3JFYWNoTGlzdEVsZW1lbnRDeWNsZUhlYWRlciAoY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0mIE8pIHsKKyAgdW5zaWduZWQgSW5kZW50TGV2ZWwxID0gSW5kZW50TGV2ZWwgKyBJbmRlbnQxOworCisgIE8uaW5kZW50KEluZGVudExldmVsKQorICAgIDw8ICJmb3IgKCIgPDwgRC5HZW5UeXBlRGVjbGFyYXRpb24oKQorICAgIDw8ICI6Oml0ZXJhdG9yIEIgPSAiIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkgPDwgIi5iZWdpbigpLFxuIjsKKyAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpCisgICAgPDwgIkUgPSAiIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkgPDwgIi5lbmQoKTsgQiAhPSBFOykge1xuIjsKKyAgTy5pbmRlbnQoSW5kZW50TGV2ZWwxKSA8PCAidW5zaWduZWQgcG9zID0gIiA8PCBELkdlblZhcmlhYmxlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5nZXRQb3NpdGlvbihCIC0gIiA8PCBELkdlblZhcmlhYmxlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5iZWdpbigpKTtcbiI7Cit9CisKKy8vLyBFbWl0Rm9yd2FyZE9wdGlvblByb3BlcnR5SGFuZGxpbmdDb2RlIC0gSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8KKy8vLyBpbXBsZW1lbnQgRW1pdEFjdGlvbkhhbmRsZXIuIEVtaXRzIGNvZGUgZm9yCisvLy8gaGFuZGxpbmcgdGhlIChmb3J3YXJkKSBhbmQgKGZvcndhcmRfYXMpIG9wdGlvbiBwcm9wZXJ0aWVzLgordm9pZCBFbWl0Rm9yd2FyZE9wdGlvblByb3BlcnR5SGFuZGxpbmdDb2RlIChjb25zdCBPcHRpb25EZXNjcmlwdGlvbiYgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBOZXdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSYgTykgeworICBjb25zdCBzdGQ6OnN0cmluZyYgTmFtZSA9IE5ld05hbWUuZW1wdHkoKQorICAgID8gKCItIiArIEQuTmFtZSkKKyAgICA6IE5ld05hbWU7CisgIHVuc2lnbmVkIEluZGVudExldmVsMSA9IEluZGVudExldmVsICsgSW5kZW50MTsKKworICBzd2l0Y2ggKEQuVHlwZSkgeworICBjYXNlIE9wdGlvblR5cGU6OlN3aXRjaDoKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbCkKKyAgICAgIDw8ICJ2ZWMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCIgPDwgRC5HZW5WYXJpYWJsZU5hbWUoKQorICAgICAgPDwgIi5nZXRQb3NpdGlvbigpLCBcIiIgPDwgTmFtZSA8PCAiXCIpKTtcbiI7CisgICAgYnJlYWs7CisgIGNhc2UgT3B0aW9uVHlwZTo6UGFyYW1ldGVyOgorICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAidmVjLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwiLmdldFBvc2l0aW9uKCksIFwiIiA8PCBOYW1lOworCisgICAgaWYgKCFELmlzRm9yd2FyZE5vdFNwbGl0KCkpIHsKKyAgICAgIE8gPDwgIlwiKSk7XG4iOworICAgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpIDw8ICJ2ZWMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBELkdlblZhcmlhYmxlTmFtZSgpIDw8ICIuZ2V0UG9zaXRpb24oKSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkgPDwgIikpO1xuIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBPIDw8ICI9XCIgKyAiIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkgPDwgIikpO1xuIjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgT3B0aW9uVHlwZTo6UHJlZml4OgorICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAidmVjLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkgPDwgIi5nZXRQb3NpdGlvbigpLCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTmFtZSA8PCAiXCIgKyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkgPDwgIikpO1xuIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcHRpb25UeXBlOjpQcmVmaXhMaXN0OgorICAgIEVtaXRGb3JFYWNoTGlzdEVsZW1lbnRDeWNsZUhlYWRlcihELCBJbmRlbnRMZXZlbCwgTyk7CisgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwxKSA8PCAidmVjLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihwb3MsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTmFtZSA8PCAiXCIgKyAiIDw8ICIqQikpO1xuIjsKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbDEpIDw8ICIrK0I7XG4iOworCisgICAgZm9yIChpbnQgaSA9IDEsIGogPSBELk11bHRpVmFsOyBpIDwgajsgKytpKSB7CisgICAgICBPLmluZGVudChJbmRlbnRMZXZlbDEpIDw8ICJ2ZWMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHBvcywgKkIpKTtcbiI7CisgICAgICBPLmluZGVudChJbmRlbnRMZXZlbDEpIDw8ICIrK0I7XG4iOworICAgIH0KKworICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAifVxuIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcHRpb25UeXBlOjpQYXJhbWV0ZXJMaXN0OgorICAgIEVtaXRGb3JFYWNoTGlzdEVsZW1lbnRDeWNsZUhlYWRlcihELCBJbmRlbnRMZXZlbCwgTyk7CisgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwxKSA8PCAidmVjLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihwb3MsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTmFtZSA8PCAiXCIpKTtcbiI7CisKKyAgICBmb3IgKGludCBpID0gMCwgaiA9IEQuTXVsdGlWYWw7IGkgPCBqOyArK2kpIHsKKyAgICAgIE8uaW5kZW50KEluZGVudExldmVsMSkgPDwgInZlYy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIocG9zLCAqQikpO1xuIjsKKyAgICAgIE8uaW5kZW50KEluZGVudExldmVsMSkgPDwgIisrQjtcbiI7CisgICAgfQorCisgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpIDw8ICJ9XG4iOworICAgIGJyZWFrOworICBjYXNlIE9wdGlvblR5cGU6OlN3aXRjaExpc3Q6CisgICAgRW1pdEZvckVhY2hMaXN0RWxlbWVudEN5Y2xlSGVhZGVyKEQsIEluZGVudExldmVsLCBPKTsKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbDEpIDw8ICJ2ZWMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHBvcywgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBOYW1lIDw8ICJcIikpO1xuIjsKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbDEpIDw8ICIrK0I7XG4iOworICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAifVxuIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcHRpb25UeXBlOjpBbGlhczoKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiQWxpYXNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdG9vbCBvcHRpb24gZGVzY3JpcHRpb25zISI7CisgIH0KK30KKworLy8vIEFjdGlvbkhhbmRsaW5nQ2FsbGJhY2tCYXNlIC0gQmFzZSBjbGFzcyBvZiBFbWl0QWN0aW9uSGFuZGxlcnNDYWxsYmFjayBhbmQKKy8vLyBFbWl0UHJlcHJvY2Vzc09wdGlvbnNDYWxsYmFjay4KK3N0cnVjdCBBY3Rpb25IYW5kbGluZ0NhbGxiYWNrQmFzZQoreworCisgIHZvaWQgb25FcnJvckRhZyhjb25zdCBEYWdJbml0JiBkLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50TGV2ZWwsIHJhd19vc3RyZWFtJiBPKSBjb25zdAorICB7CisgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpCisgICAgICA8PCAiUHJpbnRFcnJvcihcIiIKKyAgICAgIDw8IChkLmdldE51bUFyZ3MoKSA+PSAxID8gSW5pdFB0clRvU3RyaW5nKGQuZ2V0QXJnKDApKSA6ICJVbmtub3duIGVycm9yISIpCisgICAgICA8PCAiXCIpO1xuIjsKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbCkgPDwgInJldHVybiAxO1xuIjsKKyAgfQorCisgIHZvaWQgb25XYXJuaW5nRGFnKGNvbnN0IERhZ0luaXQmIGQsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudExldmVsLCByYXdfb3N0cmVhbSYgTykgY29uc3QKKyAgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoZCwgMSk7CisgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpIDw8ICJsbHZtOjplcnJzKCkgPDwgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluaXRQdHJUb1N0cmluZyhkLmdldEFyZygwKSkgPDwgIlwiO1xuIjsKKyAgfQorCit9OworCisvLy8gRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2sgLSBFbWl0IGNvZGUgdGhhdCBoYW5kbGVzIGFjdGlvbnMuIFVzZWQgYnkKKy8vLyBFbWl0R2VuZXJhdGVBY3Rpb25NZXRob2QoKSBhcyBhbiBhcmd1bWVudCB0byBFbWl0Q2FzZUNvbnN0cnVjdEhhbmRsZXIoKS4KKworY2xhc3MgRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2s7CisKK3R5cGVkZWYgdm9pZCAoRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2s6OiogRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2tIYW5kbGVyKQorKGNvbnN0IERhZ0luaXQmLCB1bnNpZ25lZCwgcmF3X29zdHJlYW0mKSBjb25zdDsKKworY2xhc3MgRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2sgOgorICBwdWJsaWMgQWN0aW9uSGFuZGxpbmdDYWxsYmFja0Jhc2UsCisgIHB1YmxpYyBIYW5kbGVyVGFibGU8RW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2tIYW5kbGVyPgoreworICB0eXBlZGVmIEVtaXRBY3Rpb25IYW5kbGVyc0NhbGxiYWNrSGFuZGxlciBIYW5kbGVyOworCisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3M7CisKKyAgLy8vIEVtaXRIb29rSW52b2NhdGlvbiAtIENvbW1vbiBjb2RlIGZvciBob29rIGludm9jYXRpb24gZnJvbSBhY3Rpb25zLiBVc2VkIGJ5CisgIC8vLyBvbkFwcGVuZENtZCBhbmQgb25PdXRwdXRTdWZmaXguCisgIHZvaWQgRW1pdEhvb2tJbnZvY2F0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIEJsb2NrT3BlbiwgY29uc3QgY2hhciogQmxvY2tDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50TGV2ZWwsIHJhd19vc3RyZWFtJiBPKSBjb25zdAorICB7CisgICAgU3RyVmVjdG9yIE91dDsKKyAgICBUb2tlbml6ZUNtZExpbmUoU3RyLCBPdXQpOworCisgICAgZm9yIChTdHJWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIgPSBPdXQuYmVnaW4oKSwgRSA9IE91dC5lbmQoKTsKKyAgICAgICAgIEIgIT0gRTsgKytCKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY21kID0gKkI7CisKKyAgICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCBCbG9ja09wZW47CisKKyAgICAgIGlmIChjbWQuYXQoMCkgPT0gJyQnKQorICAgICAgICBCID0gU3Vic3RpdHV0ZVNwZWNpYWxDb21tYW5kcyhCLCBFLCAgLyogSXNKb2luID0gKi8gdHJ1ZSwgTyk7CisgICAgICBlbHNlCisgICAgICAgIE8gPDwgJyInIDw8IGNtZCA8PCAnIic7CisKKyAgICAgIE8gPDwgQmxvY2tDbG9zZTsKKyAgICB9CisgIH0KKworICB2b2lkIG9uQXBwZW5kQ21kIChjb25zdCBEYWdJbml0JiBEYWcsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudExldmVsLCByYXdfb3N0cmVhbSYgTykgY29uc3QKKyAgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoRGFnLCAxKTsKKyAgICB0aGlzLT5FbWl0SG9va0ludm9jYXRpb24oSW5pdFB0clRvU3RyaW5nKERhZy5nZXRBcmcoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVjLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcig2NTUzNiwgIiwgIikpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZW50TGV2ZWwsIE8pOworICB9CisKKyAgdm9pZCBvbkZvcndhcmQgKGNvbnN0IERhZ0luaXQmIERhZywKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudExldmVsLCByYXdfb3N0cmVhbSYgTykgY29uc3QKKyAgeworICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoRGFnLCAxKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgTmFtZSA9IEluaXRQdHJUb1N0cmluZyhEYWcuZ2V0QXJnKDApKTsKKyAgICBFbWl0Rm9yd2FyZE9wdGlvblByb3BlcnR5SGFuZGxpbmdDb2RlKE9wdERlc2NzLkZpbmRPcHRpb24oTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnRMZXZlbCwgIiIsIE8pOworICB9CisKKyAgdm9pZCBvbkZvcndhcmRBcyAoY29uc3QgRGFnSW5pdCYgRGFnLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgcmF3X29zdHJlYW0mIE8pIGNvbnN0CisgIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKERhZywgMik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE5hbWUgPSBJbml0UHRyVG9TdHJpbmcoRGFnLmdldEFyZygwKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE5ld05hbWUgPSBJbml0UHRyVG9TdHJpbmcoRGFnLmdldEFyZygxKSk7CisgICAgRW1pdEZvcndhcmRPcHRpb25Qcm9wZXJ0eUhhbmRsaW5nQ29kZShPcHREZXNjcy5GaW5kT3B0aW9uKE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZW50TGV2ZWwsIE5ld05hbWUsIE8pOworICB9CisKKyAgdm9pZCBvbkZvcndhcmRWYWx1ZSAoY29uc3QgRGFnSW5pdCYgRGFnLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgcmF3X29zdHJlYW0mIE8pIGNvbnN0CisgIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKERhZywgMSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE5hbWUgPSBJbml0UHRyVG9TdHJpbmcoRGFnLmdldEFyZygwKSk7CisgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIEQgPSBPcHREZXNjcy5GaW5kUGFyYW1ldGVyTGlzdE9yUGFyYW1ldGVyKE5hbWUpOworCisgICAgaWYgKEQuaXNTd2l0Y2hMaXN0KCkpIHsKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcgorICAgICAgICAoImZvcndhcmRfdmFsdWUgaXMgbm90IGFsbG93ZWQgd2l0aCBzd2l0Y2hfbGlzdCIpOworICAgIH0KKworICAgIGlmIChELmlzUGFyYW1ldGVyKCkpIHsKKyAgICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAidmVjLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRC5HZW5WYXJpYWJsZU5hbWUoKSA8PCAiLmdldFBvc2l0aW9uKCksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBELkdlblZhcmlhYmxlTmFtZSgpIDw8ICIpKTtcbiI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpIDw8ICJmb3IgKCIgPDwgRC5HZW5UeXBlRGVjbGFyYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6Oml0ZXJhdG9yIEIgPSAiIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLmJlZ2luKCksIFxuIjsKKyAgICAgIE8uaW5kZW50KEluZGVudExldmVsICsgSW5kZW50MSkgPDwgIiBFID0gIiA8PCBELkdlblZhcmlhYmxlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuZW5kKCk7IEIgIT0gRTsgKytCKVxuIjsKKyAgICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAie1xuIjsKKyAgICAgIE8uaW5kZW50KEluZGVudExldmVsICsgSW5kZW50MSkKKyAgICAgICAgPDwgInVuc2lnbmVkIHBvcyA9ICIgPDwgRC5HZW5WYXJpYWJsZU5hbWUoKQorICAgICAgICA8PCAiLmdldFBvc2l0aW9uKEIgLSAiIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkKKyAgICAgICAgPDwgIi5iZWdpbigpKTtcbiI7CisgICAgICBPLmluZGVudChJbmRlbnRMZXZlbCArIEluZGVudDEpCisgICAgICAgIDw8ICJ2ZWMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHBvcywgKkIpKTtcbiI7CisgICAgICBPLmluZGVudChJbmRlbnRMZXZlbCkgPDwgIn1cbiI7CisgICAgfQorICB9CisKKyAgdm9pZCBvbkZvcndhcmRUcmFuc2Zvcm1lZFZhbHVlIChjb25zdCBEYWdJbml0JiBEYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50TGV2ZWwsIHJhd19vc3RyZWFtJiBPKSBjb25zdAorICB7CisgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhEYWcsIDIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBOYW1lID0gSW5pdFB0clRvU3RyaW5nKERhZy5nZXRBcmcoMCkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBIb29rID0gSW5pdFB0clRvU3RyaW5nKERhZy5nZXRBcmcoMSkpOworICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBEID0gT3B0RGVzY3MuRmluZFBhcmFtZXRlckxpc3RPclBhcmFtZXRlcihOYW1lKTsKKworICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAidmVjLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkgPDwgIi5nZXRQb3NpdGlvbigiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChELmlzTGlzdCgpID8gIjAiIDogIiIpIDw8ICIpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJob29rczo6IiA8PCBIb29rIDw8ICIoIiA8PCBELkdlblZhcmlhYmxlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChELmlzUGFyYW1ldGVyKCkgPyAiLmNfc3RyKCkiIDogIiIpIDw8ICIpKSk7XG4iOworICB9CisKKyAgdm9pZCBvbk5vT3V0RmlsZSAoY29uc3QgRGFnSW5pdCYgRGFnLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgcmF3X29zdHJlYW0mIE8pIGNvbnN0CisgIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKERhZywgMCk7CisgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpIDw8ICJub19vdXRfZmlsZSA9IHRydWU7XG4iOworICB9CisKKyAgdm9pZCBvbk91dHB1dFN1ZmZpeCAoY29uc3QgRGFnSW5pdCYgRGFnLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgcmF3X29zdHJlYW0mIE8pIGNvbnN0CisgIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKERhZywgMSk7CisgICAgdGhpcy0+RW1pdEhvb2tJbnZvY2F0aW9uKEluaXRQdHJUb1N0cmluZyhEYWcuZ2V0QXJnKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9zdWZmaXggPSAiLCAiO1xuIiwgSW5kZW50TGV2ZWwsIE8pOworICB9CisKKyAgdm9pZCBvblN0b3BDb21waWxhdGlvbiAoY29uc3QgRGFnSW5pdCYgRGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgcmF3X29zdHJlYW0mIE8pIGNvbnN0CisgIHsKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbCkgPDwgInN0b3BfY29tcGlsYXRpb24gPSB0cnVlO1xuIjsKKyAgfQorCisKKyAgdm9pZCBvblVucGFja1ZhbHVlcyAoY29uc3QgRGFnSW5pdCYgRGFnLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgcmF3X29zdHJlYW0mIE8pIGNvbnN0CisgIHsKKyAgICB0aHJvdyAiJ3VucGFja192YWx1ZXMnIGlzIGRlcHJlY2F0ZWQuICIKKyAgICAgICJVc2UgJ2NvbW1hX3NlcGFyYXRlZCcgKyAnZm9yd2FyZF92YWx1ZScgaW5zdGVhZCEiOworICB9CisKKyBwdWJsaWM6CisKKyAgZXhwbGljaXQgRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2soY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPRCkKKyAgICA6IE9wdERlc2NzKE9EKQorICB7CisgICAgaWYgKCFzdGF0aWNNZW1iZXJzSW5pdGlhbGl6ZWRfKSB7CisgICAgICBBZGRIYW5kbGVyKCJlcnJvciIsICZFbWl0QWN0aW9uSGFuZGxlcnNDYWxsYmFjazo6b25FcnJvckRhZyk7CisgICAgICBBZGRIYW5kbGVyKCJ3YXJuaW5nIiwgJkVtaXRBY3Rpb25IYW5kbGVyc0NhbGxiYWNrOjpvbldhcm5pbmdEYWcpOworICAgICAgQWRkSGFuZGxlcigiYXBwZW5kX2NtZCIsICZFbWl0QWN0aW9uSGFuZGxlcnNDYWxsYmFjazo6b25BcHBlbmRDbWQpOworICAgICAgQWRkSGFuZGxlcigiZm9yd2FyZCIsICZFbWl0QWN0aW9uSGFuZGxlcnNDYWxsYmFjazo6b25Gb3J3YXJkKTsKKyAgICAgIEFkZEhhbmRsZXIoImZvcndhcmRfYXMiLCAmRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2s6Om9uRm9yd2FyZEFzKTsKKyAgICAgIEFkZEhhbmRsZXIoImZvcndhcmRfdmFsdWUiLCAmRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2s6Om9uRm9yd2FyZFZhbHVlKTsKKyAgICAgIEFkZEhhbmRsZXIoImZvcndhcmRfdHJhbnNmb3JtZWRfdmFsdWUiLAorICAgICAgICAgICAgICAgICAmRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2s6Om9uRm9yd2FyZFRyYW5zZm9ybWVkVmFsdWUpOworICAgICAgQWRkSGFuZGxlcigibm9fb3V0X2ZpbGUiLAorICAgICAgICAgICAgICAgICAmRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2s6Om9uTm9PdXRGaWxlKTsKKyAgICAgIEFkZEhhbmRsZXIoIm91dHB1dF9zdWZmaXgiLCAmRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2s6Om9uT3V0cHV0U3VmZml4KTsKKyAgICAgIEFkZEhhbmRsZXIoInN0b3BfY29tcGlsYXRpb24iLAorICAgICAgICAgICAgICAgICAmRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2s6Om9uU3RvcENvbXBpbGF0aW9uKTsKKyAgICAgIEFkZEhhbmRsZXIoInVucGFja192YWx1ZXMiLAorICAgICAgICAgICAgICAgICAmRW1pdEFjdGlvbkhhbmRsZXJzQ2FsbGJhY2s6Om9uVW5wYWNrVmFsdWVzKTsKKworCisgICAgICBzdGF0aWNNZW1iZXJzSW5pdGlhbGl6ZWRfID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgSW5pdCogSSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudExldmVsLCByYXdfb3N0cmVhbSYgTykgY29uc3QKKyAgeworICAgIEludm9rZURhZ0luaXRIYW5kbGVyKHRoaXMsIEksIEluZGVudExldmVsLCBPKTsKKyAgfQorfTsKKwordm9pZCBFbWl0R2VuZXJhdGVBY3Rpb25NZXRob2RIZWFkZXIoY29uc3QgVG9vbERlc2NyaXB0aW9uJiBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0pvaW4sIGJvb2wgTmFrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSYgTykKK3sKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgImludCBHZW5lcmF0ZUFjdGlvbihBY3Rpb24mIE91dCxcbiI7CisKKyAgaWYgKElzSm9pbikKKyAgICBPLmluZGVudChJbmRlbnQyKSA8PCAiY29uc3QgUGF0aFZlY3RvciYgaW5GaWxlcyxcbiI7CisgIGVsc2UKKyAgICBPLmluZGVudChJbmRlbnQyKSA8PCAiY29uc3Qgc3lzOjpQYXRoJiBpbkZpbGUsXG4iOworCisgIE8uaW5kZW50KEluZGVudDIpIDw8ICJjb25zdCBib29sIEhhc0NoaWxkcmVuLFxuIjsKKyAgTy5pbmRlbnQoSW5kZW50MikgPDwgImNvbnN0IGxsdm06OnN5czo6UGF0aCYgVGVtcERpcixcbiI7CisgIE8uaW5kZW50KEluZGVudDIpIDw8ICJjb25zdCBJbnB1dExhbmd1YWdlc1NldCYgSW5MYW5ncyxcbiI7CisgIE8uaW5kZW50KEluZGVudDIpIDw8ICJjb25zdCBMYW5ndWFnZU1hcCYgTGFuZ01hcCkgY29uc3RcbiI7CisgIE8uaW5kZW50KEluZGVudDEpIDw8ICJ7XG4iOworCisgIGlmICghTmFrZWQpIHsKKyAgICBPLmluZGVudChJbmRlbnQyKSA8PCAic3RkOjpzdHJpbmcgY21kO1xuIjsKKyAgICBPLmluZGVudChJbmRlbnQyKSA8PCAic3RkOjpzdHJpbmcgb3V0X2ZpbGU7XG4iOworICAgIE8uaW5kZW50KEluZGVudDIpCisgICAgICA8PCAic3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBzdGQ6OnN0cmluZz4gPiB2ZWM7XG4iOworICAgIE8uaW5kZW50KEluZGVudDIpIDw8ICJib29sIHN0b3BfY29tcGlsYXRpb24gPSAhSGFzQ2hpbGRyZW47XG4iOworICAgIE8uaW5kZW50KEluZGVudDIpIDw8ICJib29sIG5vX291dF9maWxlID0gZmFsc2U7XG4iOworICAgIE8uaW5kZW50KEluZGVudDIpIDw8ICJjb25zdCBjaGFyKiBvdXRwdXRfc3VmZml4ID0gXCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgRC5PdXRwdXRTdWZmaXggPDwgIlwiO1xuIjsKKyAgfQorfQorCisvLyBFbWl0R2VuZXJhdGVBY3Rpb25NZXRob2QgLSBFbWl0IGVpdGhlciBhIG5vcm1hbCBvciBhICJqb2luIiB2ZXJzaW9uIG9mIHRoZQorLy8gVG9vbDo6R2VuZXJhdGVBY3Rpb24oKSBtZXRob2QuCit2b2lkIEVtaXRHZW5lcmF0ZUFjdGlvbk1ldGhvZCAoY29uc3QgVG9vbERlc2NyaXB0aW9uJiBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0pvaW4sIHJhd19vc3RyZWFtJiBPKSB7CisKKyAgRW1pdEdlbmVyYXRlQWN0aW9uTWV0aG9kSGVhZGVyKEQsIElzSm9pbiwgLyogTmFrZWQgPSAqLyBmYWxzZSwgTyk7CisKKyAgaWYgKCFELkNtZExpbmUpCisgICAgdGhyb3cgIlRvb2wgIiArIEQuTmFtZSArICIgaGFzIG5vIGNtZF9saW5lIHByb3BlcnR5ISI7CisKKyAgLy8gUHJvY2VzcyB0aGUgJ2NvbW1hbmQnIHByb3BlcnR5LgorICBPIDw8ICdcbic7CisgIEVtaXRDbWRMaW5lVmVjRmlsbChELkNtZExpbmUsIEQuTmFtZSwgSXNKb2luLCBJbmRlbnQyLCBPKTsKKyAgTyA8PCAnXG4nOworCisgIC8vIFByb2Nlc3MgdGhlICdhY3Rpb25zJyBsaXN0IG9mIHRoaXMgdG9vbC4KKyAgaWYgKEQuQWN0aW9ucykKKyAgICBFbWl0Q2FzZUNvbnN0cnVjdEhhbmRsZXIoRC5BY3Rpb25zLCBJbmRlbnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbWl0QWN0aW9uSGFuZGxlcnNDYWxsYmFjayhPcHREZXNjcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBPcHREZXNjcywgTyk7CisgIE8gPDwgJ1xuJzsKKworICAvLyBJbnB1dCBmaWxlIChzKQorICBpZiAoIUQuSW5GaWxlT3B0aW9uLmVtcHR5KCkpIHsKKyAgICBPLmluZGVudChJbmRlbnQyKQorICAgICAgPDwgInZlYy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoSW5wdXRGaWxlbmFtZXMuZ2V0UG9zaXRpb24oMCksIFwiIgorICAgICAgPDwgRC5JbkZpbGVPcHRpb24gPDwgIlwiKTtcbiI7CisgIH0KKworICBpZiAoSXNKb2luKSB7CisgICAgTy5pbmRlbnQoSW5kZW50MikKKyAgICAgIDw8ICJmb3IgKFBhdGhWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIgPSBpbkZpbGVzLmJlZ2luKCksXG4iOworICAgIE8uaW5kZW50KEluZGVudDMpIDw8ICJFID0gaW5GaWxlcy5lbmQoKTsgQiAhPSBFOyArK0IpXG4iOworICAgIE8uaW5kZW50KEluZGVudDIpIDw8ICJ7XG4iOworICAgIE8uaW5kZW50KEluZGVudDMpIDw8ICJ2ZWMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiSW5wdXRGaWxlbmFtZXMuZ2V0UG9zaXRpb24oQiAtIGluRmlsZXMuYmVnaW4oKSksICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiQi0+c3RyKCkpKTtcbiI7CisgICAgTy5pbmRlbnQoSW5kZW50MikgPDwgIn1cbiI7CisgIH0KKyAgZWxzZSB7CisgICAgTy5pbmRlbnQoSW5kZW50MikgPDwgInZlYy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICJJbnB1dEZpbGVuYW1lcy5nZXRQb3NpdGlvbigwKSwgaW5GaWxlLnN0cigpKSk7XG4iOworICB9CisKKyAgLy8gT3V0cHV0IGZpbGUKKyAgTy5pbmRlbnQoSW5kZW50MikgPDwgImlmICghbm9fb3V0X2ZpbGUpIHtcbiI7CisgIGlmICghRC5PdXRGaWxlT3B0aW9uLmVtcHR5KCkpCisgICAgTy5pbmRlbnQoSW5kZW50MykgPDwgInZlYy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoNjU1MzYsIFwiIgorICAgICAgICAgICAgICAgICAgICAgIDw8IEQuT3V0RmlsZU9wdGlvbiA8PCAiXCIpKTtcbiI7CisKKyAgTy5pbmRlbnQoSW5kZW50MykgPDwgIm91dF9maWxlID0gdGhpcy0+T3V0RmlsZW5hbWUoIgorICAgICAgICAgICAgICAgICAgICA8PCAoSXNKb2luID8gInN5czo6UGF0aCgpLFxuIiA6ICJpbkZpbGUsXG4iKTsKKyAgTy5pbmRlbnQoSW5kZW50NCkgPDwgIlRlbXBEaXIsIHN0b3BfY29tcGlsYXRpb24sIG91dHB1dF9zdWZmaXgpLnN0cigpO1xuXG4iOworICBPLmluZGVudChJbmRlbnQzKSA8PCAidmVjLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcig2NTUzNiwgb3V0X2ZpbGUpKTtcbiI7CisKKyAgTy5pbmRlbnQoSW5kZW50MikgPDwgIn1cblxuIjsKKworICAvLyBIYW5kbGUgdGhlIFNpbmsgcHJvcGVydHkuCisgIGlmIChELmlzU2luaygpKSB7CisgICAgTy5pbmRlbnQoSW5kZW50MikgPDwgImlmICghIiA8PCBTaW5rT3B0aW9uTmFtZSA8PCAiLmVtcHR5KCkpIHtcbiI7CisgICAgTy5pbmRlbnQoSW5kZW50MykgPDwgImZvciAoY2w6Omxpc3Q8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBCID0gIgorICAgICAgICAgICAgICAgICAgICAgIDw8IFNpbmtPcHRpb25OYW1lIDw8ICIuYmVnaW4oKSwgRSA9ICIgPDwgU2lua09wdGlvbk5hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiLmVuZCgpOyBCICE9IEU7ICsrQilcbiI7CisgICAgTy5pbmRlbnQoSW5kZW50NCkgPDwgInZlYy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoIiA8PCBTaW5rT3B0aW9uTmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIuZ2V0UG9zaXRpb24oQiAtICIgPDwgU2lua09wdGlvbk5hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAgIi5iZWdpbigpKSwgKkIpKTtcbiI7CisgICAgTy5pbmRlbnQoSW5kZW50MikgPDwgIn1cbiI7CisgIH0KKworICBPLmluZGVudChJbmRlbnQyKSA8PCAiT3V0LkNvbnN0cnVjdChjbWQsIHRoaXMtPlNvcnRBcmdzKHZlYyksICIKKyAgICAgICAgICAgICAgICAgICAgPDwgInN0b3BfY29tcGlsYXRpb24sIG91dF9maWxlKTtcbiI7CisgIE8uaW5kZW50KEluZGVudDIpIDw8ICJyZXR1cm4gMDtcbiI7CisgIE8uaW5kZW50KEluZGVudDEpIDw8ICJ9XG5cbiI7Cit9CisKKy8vLyBFbWl0R2VuZXJhdGVBY3Rpb25NZXRob2RzIC0gRW1pdCB0d28gR2VuZXJhdGVBY3Rpb24oKSBtZXRob2RzIGZvcgorLy8vIGEgZ2l2ZW4gVG9vbCBjbGFzcy4KK3ZvaWQgRW1pdEdlbmVyYXRlQWN0aW9uTWV0aG9kcyAoY29uc3QgVG9vbERlc2NyaXB0aW9uJiBUb29sRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0mIE8pIHsKKyAgaWYgKCFUb29sRGVzYy5pc0pvaW4oKSkgeworICAgIEVtaXRHZW5lcmF0ZUFjdGlvbk1ldGhvZEhlYWRlcihUb29sRGVzYywgLyogSXNKb2luID0gKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmFrZWQgPSAqLyB0cnVlLCBPKTsKKyAgICBPLmluZGVudChJbmRlbnQyKSA8PCAiUHJpbnRFcnJvcihcIiIgPDwgVG9vbERlc2MuTmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgbm90IGEgSm9pbiB0b29sIVwiKTtcbiI7CisgICAgTy5pbmRlbnQoSW5kZW50MikgPDwgInJldHVybiAtMTtcbiI7CisgICAgTy5pbmRlbnQoSW5kZW50MSkgPDwgIn1cblxuIjsKKyAgfQorICBlbHNlIHsKKyAgICBFbWl0R2VuZXJhdGVBY3Rpb25NZXRob2QoVG9vbERlc2MsIE9wdERlc2NzLCB0cnVlLCBPKTsKKyAgfQorCisgIEVtaXRHZW5lcmF0ZUFjdGlvbk1ldGhvZChUb29sRGVzYywgT3B0RGVzY3MsIGZhbHNlLCBPKTsKK30KKworLy8vIEVtaXRJbk91dExhbmd1YWdlTWV0aG9kcyAtIEVtaXQgdGhlIFtJbnB1dCxPdXRwdXRdTGFuZ3VhZ2UoKQorLy8vIG1ldGhvZHMgZm9yIGEgZ2l2ZW4gVG9vbCBjbGFzcy4KK3ZvaWQgRW1pdEluT3V0TGFuZ3VhZ2VNZXRob2RzIChjb25zdCBUb29sRGVzY3JpcHRpb24mIEQsIHJhd19vc3RyZWFtJiBPKSB7CisgIE8uaW5kZW50KEluZGVudDEpIDw8ICJjb25zdCBjaGFyKiogSW5wdXRMYW5ndWFnZXMoKSBjb25zdCB7XG4iOworICBPLmluZGVudChJbmRlbnQyKSA8PCAicmV0dXJuIElucHV0TGFuZ3VhZ2VzXztcbiI7CisgIE8uaW5kZW50KEluZGVudDEpIDw8ICJ9XG5cbiI7CisKKyAgaWYgKEQuT3V0TGFuZ3VhZ2UuZW1wdHkoKSkKKyAgICB0aHJvdyAiVG9vbCAiICsgRC5OYW1lICsgIiBoYXMgbm8gJ291dF9sYW5ndWFnZScgcHJvcGVydHkhIjsKKworICBPLmluZGVudChJbmRlbnQxKSA8PCAiY29uc3QgY2hhciogT3V0cHV0TGFuZ3VhZ2UoKSBjb25zdCB7XG4iOworICBPLmluZGVudChJbmRlbnQyKSA8PCAicmV0dXJuIFwiIiA8PCBELk91dExhbmd1YWdlIDw8ICJcIjtcbiI7CisgIE8uaW5kZW50KEluZGVudDEpIDw8ICJ9XG5cbiI7Cit9CisKKy8vLyBFbWl0TmFtZU1ldGhvZCAtIEVtaXQgdGhlIE5hbWUoKSBtZXRob2QgZm9yIGEgZ2l2ZW4gVG9vbCBjbGFzcy4KK3ZvaWQgRW1pdE5hbWVNZXRob2QgKGNvbnN0IFRvb2xEZXNjcmlwdGlvbiYgRCwgcmF3X29zdHJlYW0mIE8pIHsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgImNvbnN0IGNoYXIqIE5hbWUoKSBjb25zdCB7XG4iOworICBPLmluZGVudChJbmRlbnQyKSA8PCAicmV0dXJuIFwiIiA8PCBELk5hbWUgPDwgIlwiO1xuIjsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgIn1cblxuIjsKK30KKworLy8vIEVtaXRJc0pvaW5NZXRob2QgLSBFbWl0IHRoZSBJc0pvaW4oKSBtZXRob2QgZm9yIGEgZ2l2ZW4gVG9vbAorLy8vIGNsYXNzLgordm9pZCBFbWl0SXNKb2luTWV0aG9kIChjb25zdCBUb29sRGVzY3JpcHRpb24mIEQsIHJhd19vc3RyZWFtJiBPKSB7CisgIE8uaW5kZW50KEluZGVudDEpIDw8ICJib29sIElzSm9pbigpIGNvbnN0IHtcbiI7CisgIGlmIChELmlzSm9pbigpKQorICAgIE8uaW5kZW50KEluZGVudDIpIDw8ICJyZXR1cm4gdHJ1ZTtcbiI7CisgIGVsc2UKKyAgICBPLmluZGVudChJbmRlbnQyKSA8PCAicmV0dXJuIGZhbHNlO1xuIjsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgIn1cblxuIjsKK30KKworLy8vIEVtaXRXb3Jrc09uRW1wdHlDYWxsYmFjayAtIENhbGxiYWNrIHVzZWQgYnkgRW1pdFdvcmtzT25FbXB0eU1ldGhvZCBpbgorLy8vIGNvbmp1bmN0aW9uIHdpdGggRW1pdENhc2VDb25zdHJ1Y3RIYW5kbGVyLgordm9pZCBFbWl0V29ya3NPbkVtcHR5Q2FsbGJhY2sgKGNvbnN0IEluaXQqIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudExldmVsLCByYXdfb3N0cmVhbSYgTykgeworICBDaGVja0Jvb2xlYW5Db25zdGFudChWYWx1ZSk7CisgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAicmV0dXJuICIgPDwgVmFsdWUtPmdldEFzU3RyaW5nKCkgPDwgIjtcbiI7Cit9CisKKy8vLyBFbWl0V29ya3NPbkVtcHR5TWV0aG9kIC0gRW1pdCB0aGUgV29ya3NPbkVtcHR5KCkgbWV0aG9kIGZvciBhIGdpdmVuIFRvb2wKKy8vLyBjbGFzcy4KK3ZvaWQgRW1pdFdvcmtzT25FbXB0eU1ldGhvZCAoY29uc3QgVG9vbERlc2NyaXB0aW9uJiBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25EZXNjcmlwdGlvbnMmIE9wdERlc2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSYgTykKK3sKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgImJvb2wgV29ya3NPbkVtcHR5KCkgY29uc3Qge1xuIjsKKyAgaWYgKEQuT25FbXB0eSA9PSAwKQorICAgIE8uaW5kZW50KEluZGVudDIpIDw8ICJyZXR1cm4gZmFsc2U7XG4iOworICBlbHNlCisgICAgRW1pdENhc2VDb25zdHJ1Y3RIYW5kbGVyKEQuT25FbXB0eSwgSW5kZW50MiwgRW1pdFdvcmtzT25FbXB0eUNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkVtaXRFbHNlSWYgPSAqLyB0cnVlLCBPcHREZXNjcywgTyk7CisgIE8uaW5kZW50KEluZGVudDEpIDw8ICJ9XG5cbiI7Cit9CisKKy8vLyBFbWl0U3RhdGljTWVtYmVyRGVmaW5pdGlvbnMgLSBFbWl0IHN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMgZm9yIGEKKy8vLyBnaXZlbiBUb29sIGNsYXNzLgordm9pZCBFbWl0U3RhdGljTWVtYmVyRGVmaW5pdGlvbnMoY29uc3QgVG9vbERlc2NyaXB0aW9uJiBELCByYXdfb3N0cmVhbSYgTykgeworICBpZiAoRC5Jbkxhbmd1YWdlLmVtcHR5KCkpCisgICAgdGhyb3cgIlRvb2wgIiArIEQuTmFtZSArICIgaGFzIG5vICdpbl9sYW5ndWFnZScgcHJvcGVydHkhIjsKKworICBPIDw8ICJjb25zdCBjaGFyKiAiIDw8IEQuTmFtZSA8PCAiOjpJbnB1dExhbmd1YWdlc19bXSA9IHsiOworICBmb3IgKFN0clZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgQiA9IEQuSW5MYW5ndWFnZS5iZWdpbigpLAorICAgICAgICAgRSA9IEQuSW5MYW5ndWFnZS5lbmQoKTsgQiAhPSBFOyArK0IpCisgICAgTyA8PCAnXCInIDw8ICpCIDw8ICJcIiwgIjsKKyAgTyA8PCAiMH07XG5cbiI7Cit9CisKKy8vLyBFbWl0VG9vbENsYXNzRGVmaW5pdGlvbiAtIEVtaXQgYSBUb29sIGNsYXNzIGRlZmluaXRpb24uCit2b2lkIEVtaXRUb29sQ2xhc3NEZWZpbml0aW9uIChjb25zdCBUb29sRGVzY3JpcHRpb24mIEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25EZXNjcmlwdGlvbnMmIE9wdERlc2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0mIE8pIHsKKyAgaWYgKEQuTmFtZSA9PSAicm9vdCIpCisgICAgcmV0dXJuOworCisgIC8vIEhlYWRlcgorICBPIDw8ICJjbGFzcyAiIDw8IEQuTmFtZSA8PCAiIDogcHVibGljICI7CisgIGlmIChELmlzSm9pbigpKQorICAgIE8gPDwgIkpvaW5Ub29sIjsKKyAgZWxzZQorICAgIE8gPDwgIlRvb2wiOworCisgIE8gPDwgIiB7XG5wcml2YXRlOlxuIjsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgInN0YXRpYyBjb25zdCBjaGFyKiBJbnB1dExhbmd1YWdlc19bXTtcblxuIjsKKworICBPIDw8ICJwdWJsaWM6XG4iOworICBFbWl0TmFtZU1ldGhvZChELCBPKTsKKyAgRW1pdEluT3V0TGFuZ3VhZ2VNZXRob2RzKEQsIE8pOworICBFbWl0SXNKb2luTWV0aG9kKEQsIE8pOworICBFbWl0V29ya3NPbkVtcHR5TWV0aG9kKEQsIE9wdERlc2NzLCBPKTsKKyAgRW1pdEdlbmVyYXRlQWN0aW9uTWV0aG9kcyhELCBPcHREZXNjcywgTyk7CisKKyAgLy8gQ2xvc2UgY2xhc3MgZGVmaW5pdGlvbgorICBPIDw8ICJ9O1xuIjsKKworICBFbWl0U3RhdGljTWVtYmVyRGVmaW5pdGlvbnMoRCwgTyk7CisKK30KKworLy8vIEVtaXRPcHRpb25EZWZpbml0aW9ucyAtIEl0ZXJhdGUgb3ZlciBhIGxpc3Qgb2Ygb3B0aW9uIGRlc2NyaXB0aW9ucworLy8vIGFuZCBlbWl0IHJlZ2lzdHJhdGlvbiBjb2RlLgordm9pZCBFbWl0T3B0aW9uRGVmaW5pdGlvbnMgKGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgZGVzY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNTaW5rLCBib29sIEhhc0V4dGVybnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0mIE8pCit7CisgIHN0ZDo6dmVjdG9yPE9wdGlvbkRlc2NyaXB0aW9uPiBBbGlhc2VzOworCisgIC8vIEVtaXQgc3RhdGljIGNsOjpPcHRpb24gdmFyaWFibGVzLgorICBmb3IgKE9wdGlvbkRlc2NyaXB0aW9uczo6Y29uc3RfaXRlcmF0b3IgQiA9IGRlc2NzLmJlZ2luKCksCisgICAgICAgICBFID0gZGVzY3MuZW5kKCk7IEIhPUU7ICsrQikgeworICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiB2YWwgPSBCLT5zZWNvbmQ7CisKKyAgICBpZiAodmFsLlR5cGUgPT0gT3B0aW9uVHlwZTo6QWxpYXMpIHsKKyAgICAgIEFsaWFzZXMucHVzaF9iYWNrKHZhbCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAodmFsLmlzRXh0ZXJuKCkpCisgICAgICBPIDw8ICJleHRlcm4gIjsKKworICAgIE8gPDwgdmFsLkdlblR5cGVEZWNsYXJhdGlvbigpIDw8ICcgJworICAgICAgPDwgdmFsLkdlblZhcmlhYmxlTmFtZSgpOworCisgICAgaWYgKHZhbC5pc0V4dGVybigpKSB7CisgICAgICBPIDw8ICI7XG4iOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgTyA8PCAiKFwiIiA8PCB2YWwuTmFtZSA8PCAiXCJcbiI7CisKKyAgICBpZiAodmFsLlR5cGUgPT0gT3B0aW9uVHlwZTo6UHJlZml4IHx8IHZhbC5UeXBlID09IE9wdGlvblR5cGU6OlByZWZpeExpc3QpCisgICAgICBPIDw8ICIsIGNsOjpQcmVmaXgiOworCisgICAgaWYgKHZhbC5pc1JlcXVpcmVkKCkpIHsKKyAgICAgIGlmICh2YWwuaXNMaXN0KCkgJiYgIXZhbC5pc011bHRpVmFsKCkpCisgICAgICAgIE8gPDwgIiwgY2w6Ok9uZU9yTW9yZSI7CisgICAgICBlbHNlCisgICAgICAgIE8gPDwgIiwgY2w6OlJlcXVpcmVkIjsKKyAgICB9CisKKyAgICBpZiAodmFsLmlzT3B0aW9uYWwoKSkKKyAgICAgICAgTyA8PCAiLCBjbDo6T3B0aW9uYWwiOworCisgICAgaWYgKHZhbC5pc09uZU9yTW9yZSgpKQorICAgICAgICBPIDw8ICIsIGNsOjpPbmVPck1vcmUiOworCisgICAgaWYgKHZhbC5pc1plcm9Pck1vcmUoKSkKKyAgICAgICAgTyA8PCAiLCBjbDo6WmVyb09yTW9yZSI7CisKKyAgICBpZiAodmFsLmlzUmVhbGx5SGlkZGVuKCkpCisgICAgICBPIDw8ICIsIGNsOjpSZWFsbHlIaWRkZW4iOworICAgIGVsc2UgaWYgKHZhbC5pc0hpZGRlbigpKQorICAgICAgTyA8PCAiLCBjbDo6SGlkZGVuIjsKKworICAgIGlmICh2YWwuaXNDb21tYVNlcGFyYXRlZCgpKQorICAgICAgTyA8PCAiLCBjbDo6Q29tbWFTZXBhcmF0ZWQiOworCisgICAgaWYgKHZhbC5NdWx0aVZhbCA+IDEpCisgICAgICBPIDw8ICIsIGNsOjptdWx0aV92YWwoIiA8PCB2YWwuTXVsdGlWYWwgPDwgJyknOworCisgICAgaWYgKHZhbC5Jbml0VmFsKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyID0gdmFsLkluaXRWYWwtPmdldEFzU3RyaW5nKCk7CisgICAgICBPIDw8ICIsIGNsOjppbml0KCIgPDwgc3RyIDw8ICcpJzsKKyAgICB9CisKKyAgICBpZiAoIXZhbC5IZWxwLmVtcHR5KCkpCisgICAgICBPIDw8ICIsIGNsOjpkZXNjKFwiIiA8PCB2YWwuSGVscCA8PCAiXCIpIjsKKworICAgIE8gPDwgIik7XG5cbiI7CisgIH0KKworICAvLyBFbWl0IHRoZSBhbGlhc2VzICh0aGV5IHNob3VsZCBnbyBhZnRlciBhbGwgdGhlICdwcm9wZXInIG9wdGlvbnMpLgorICBmb3IgKHN0ZDo6dmVjdG9yPE9wdGlvbkRlc2NyaXB0aW9uPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIEIgPSBBbGlhc2VzLmJlZ2luKCksIEUgPSBBbGlhc2VzLmVuZCgpOyBCICE9IEU7ICsrQikgeworICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiB2YWwgPSAqQjsKKworICAgIE8gPDwgdmFsLkdlblR5cGVEZWNsYXJhdGlvbigpIDw8ICcgJworICAgICAgPDwgdmFsLkdlblZhcmlhYmxlTmFtZSgpCisgICAgICA8PCAiKFwiIiA8PCB2YWwuTmFtZSA8PCAnXCInOworCisgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIEQgPSBkZXNjcy5GaW5kT3B0aW9uKHZhbC5IZWxwKTsKKyAgICBPIDw8ICIsIGNsOjphbGlhc29wdCgiIDw8IEQuR2VuVmFyaWFibGVOYW1lKCkgPDwgIikiOworCisgICAgTyA8PCAiLCBjbDo6ZGVzYyhcIiIgPDwgIkFuIGFsaWFzIGZvciAtIiArIHZhbC5IZWxwICA8PCAiXCIpKTtcbiI7CisgIH0KKworICAvLyBFbWl0IHRoZSBzaW5rIG9wdGlvbi4KKyAgaWYgKEhhc1NpbmspCisgICAgTyA8PCAoSGFzRXh0ZXJucyA/ICJleHRlcm4gY2wiIDogImNsIikKKyAgICAgIDw8ICI6Omxpc3Q8c3RkOjpzdHJpbmc+ICIgPDwgU2lua09wdGlvbk5hbWUKKyAgICAgIDw8IChIYXNFeHRlcm5zID8gIjtcbiIgOiAiKGNsOjpTaW5rKTtcbiIpOworCisgIE8gPDwgJ1xuJzsKK30KKworLy8vIEVtaXRQcmVwcm9jZXNzT3B0aW9uc0NhbGxiYWNrIC0gSGVscGVyIGZ1bmN0aW9uIHBhc3NlZCB0bworLy8vIEVtaXRDYXNlQ29uc3RydWN0SGFuZGxlcigpIGJ5IEVtaXRQcmVwcm9jZXNzT3B0aW9ucygpLgorCitjbGFzcyBFbWl0UHJlcHJvY2Vzc09wdGlvbnNDYWxsYmFjazsKKwordHlwZWRlZiB2b2lkCisoRW1pdFByZXByb2Nlc3NPcHRpb25zQ2FsbGJhY2s6OiogRW1pdFByZXByb2Nlc3NPcHRpb25zQ2FsbGJhY2tIYW5kbGVyKQorKGNvbnN0IERhZ0luaXQmLCB1bnNpZ25lZCwgcmF3X29zdHJlYW0mKSBjb25zdDsKKworY2xhc3MgRW1pdFByZXByb2Nlc3NPcHRpb25zQ2FsbGJhY2sgOgorICBwdWJsaWMgQWN0aW9uSGFuZGxpbmdDYWxsYmFja0Jhc2UsCisgIHB1YmxpYyBIYW5kbGVyVGFibGU8RW1pdFByZXByb2Nlc3NPcHRpb25zQ2FsbGJhY2tIYW5kbGVyPgoreworICB0eXBlZGVmIEVtaXRQcmVwcm9jZXNzT3B0aW9uc0NhbGxiYWNrSGFuZGxlciBIYW5kbGVyOworICB0eXBlZGVmIHZvaWQKKyAgKEVtaXRQcmVwcm9jZXNzT3B0aW9uc0NhbGxiYWNrOjoqIEhhbmRsZXJJbXBsKQorICAoY29uc3QgSW5pdCosIHVuc2lnbmVkLCByYXdfb3N0cmVhbSYpIGNvbnN0OworCisgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3NfOworCisgIHZvaWQgb25MaXN0T3JEYWcoY29uc3QgRGFnSW5pdCYgZCwgSGFuZGxlckltcGwgaCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgcmF3X29zdHJlYW0mIE8pIGNvbnN0CisgIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDEpOworICAgIGNvbnN0IEluaXQqIEkgPSBkLmdldEFyZygwKTsKKworICAgIC8vIElmIEkgaXMgYSBsaXN0LCBhcHBseSBoIHRvIGVhY2ggZWxlbWVudC4KKyAgICBpZiAodHlwZWlkKCpJKSA9PSB0eXBlaWQoTGlzdEluaXQpKSB7CisgICAgICBjb25zdCBMaXN0SW5pdCYgTCA9ICpzdGF0aWNfY2FzdDxjb25zdCBMaXN0SW5pdCo+KEkpOworICAgICAgZm9yIChMaXN0SW5pdDo6Y29uc3RfaXRlcmF0b3IgQiA9IEwuYmVnaW4oKSwgRSA9IEwuZW5kKCk7IEIgIT0gRTsgKytCKQorICAgICAgICAoKHRoaXMpLT4qKGgpKSgqQiwgSW5kZW50TGV2ZWwsIE8pOworICAgIH0KKyAgICAvLyBPdGhlcndpc2UsIGFwcGx5IGggdG8gSS4KKyAgICBlbHNlIHsKKyAgICAgICgodGhpcyktPiooaCkpKEksIEluZGVudExldmVsLCBPKTsKKyAgICB9CisgIH0KKworICB2b2lkIG9uVW5zZXRPcHRpb25JbXBsKGNvbnN0IEluaXQqIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50TGV2ZWwsIHJhd19vc3RyZWFtJiBPKSBjb25zdAorICB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE9wdE5hbWUgPSBJbml0UHRyVG9TdHJpbmcoSSk7CisgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIE9wdERlc2MgPSBPcHREZXNjc18uRmluZE9wdGlvbihPcHROYW1lKTsKKworICAgIGlmIChPcHREZXNjLmlzU3dpdGNoKCkpIHsKKyAgICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCBPcHREZXNjLkdlblZhcmlhYmxlTmFtZSgpIDw8ICIgPSBmYWxzZTtcbiI7CisgICAgfQorICAgIGVsc2UgaWYgKE9wdERlc2MuaXNQYXJhbWV0ZXIoKSkgeworICAgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpIDw8IE9wdERlc2MuR2VuVmFyaWFibGVOYW1lKCkgPDwgIiA9IFwiXCI7XG4iOworICAgIH0KKyAgICBlbHNlIGlmIChPcHREZXNjLmlzTGlzdCgpKSB7CisgICAgICBPLmluZGVudChJbmRlbnRMZXZlbCkgPDwgT3B0RGVzYy5HZW5WYXJpYWJsZU5hbWUoKSA8PCAiLmNsZWFyKCk7XG4iOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRocm93ICJDYW4ndCBhcHBseSAndW5zZXRfb3B0aW9uJyB0byBhbGlhcyBvcHRpb24gJyIgKyBPcHROYW1lICsgIichIjsKKyAgICB9CisgIH0KKworICB2b2lkIG9uVW5zZXRPcHRpb24oY29uc3QgRGFnSW5pdCYgZCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudExldmVsLCByYXdfb3N0cmVhbSYgTykgY29uc3QKKyAgeworICAgIHRoaXMtPm9uTGlzdE9yRGFnKGQsICZFbWl0UHJlcHJvY2Vzc09wdGlvbnNDYWxsYmFjazo6b25VbnNldE9wdGlvbkltcGwsCisgICAgICAgICAgICAgICAgICAgICAgSW5kZW50TGV2ZWwsIE8pOworICB9CisKKyAgdm9pZCBvblNldE9wdGlvbkltcGwoY29uc3QgRGFnSW5pdCYgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50TGV2ZWwsIHJhd19vc3RyZWFtJiBPKSBjb25zdCB7CisgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhkLCAyKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgT3B0TmFtZSA9IEluaXRQdHJUb1N0cmluZyhkLmdldEFyZygwKSk7CisgICAgY29uc3QgSW5pdCogVmFsdWUgPSBkLmdldEFyZygxKTsKKyAgICBjb25zdCBPcHRpb25EZXNjcmlwdGlvbiYgT3B0RGVzYyA9IE9wdERlc2NzXy5GaW5kT3B0aW9uKE9wdE5hbWUpOworCisgICAgaWYgKE9wdERlc2MuaXNMaXN0KCkpIHsKKyAgICAgIGNvbnN0IExpc3RJbml0JiBMaXN0ID0gSW5pdFB0clRvTGlzdChWYWx1ZSk7CisKKyAgICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCBPcHREZXNjLkdlblZhcmlhYmxlTmFtZSgpIDw8ICIuY2xlYXIoKTtcbiI7CisgICAgICBmb3IgKExpc3RJbml0Ojpjb25zdF9pdGVyYXRvciBCID0gTGlzdC5iZWdpbigpLCBFID0gTGlzdC5lbmQoKTsKKyAgICAgICAgICAgQiAhPSBFOyArK0IpIHsKKyAgICAgICAgY29uc3QgSW5pdCogQ3VyRWxlbSA9ICpCOworICAgICAgICBpZiAoT3B0RGVzYy5pc1N3aXRjaExpc3QoKSkKKyAgICAgICAgICBDaGVja0Jvb2xlYW5Db25zdGFudChDdXJFbGVtKTsKKworICAgICAgICBPLmluZGVudChJbmRlbnRMZXZlbCkKKyAgICAgICAgICA8PCBPcHREZXNjLkdlblZhcmlhYmxlTmFtZSgpIDw8ICIucHVzaF9iYWNrKFwiIgorICAgICAgICAgIDw8IChPcHREZXNjLmlzU3dpdGNoTGlzdCgpID8gQ3VyRWxlbS0+Z2V0QXNTdHJpbmcoKQorICAgICAgICAgICAgICA6IEluaXRQdHJUb1N0cmluZyhDdXJFbGVtKSkKKyAgICAgICAgICA8PCAiXCIpO1xuIjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoT3B0RGVzYy5pc1N3aXRjaCgpKSB7CisgICAgICBDaGVja0Jvb2xlYW5Db25zdGFudChWYWx1ZSk7CisgICAgICBPLmluZGVudChJbmRlbnRMZXZlbCkgPDwgT3B0RGVzYy5HZW5WYXJpYWJsZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8IFZhbHVlLT5nZXRBc1N0cmluZygpIDw8ICI7XG4iOworICAgIH0KKyAgICBlbHNlIGlmIChPcHREZXNjLmlzUGFyYW1ldGVyKCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBTdHIgPSBJbml0UHRyVG9TdHJpbmcoVmFsdWUpOworICAgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpIDw8IE9wdERlc2MuR2VuVmFyaWFibGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gXCIiIDw8IFN0ciA8PCAiXCI7XG4iOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRocm93ICJDYW4ndCBhcHBseSAnc2V0X29wdGlvbicgdG8gYWxpYXMgb3B0aW9uIC0iICsgT3B0TmFtZSArICIgISI7CisgICAgfQorICB9CisKKyAgdm9pZCBvblNldFN3aXRjaChjb25zdCBJbml0KiBJLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudExldmVsLCByYXdfb3N0cmVhbSYgTykgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lID0gSW5pdFB0clRvU3RyaW5nKEkpOworICAgIGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9uJiBPcHREZXNjID0gT3B0RGVzY3NfLkZpbmRPcHRpb24oT3B0TmFtZSk7CisKKyAgICBpZiAoT3B0RGVzYy5pc1N3aXRjaCgpKQorICAgICAgTy5pbmRlbnQoSW5kZW50TGV2ZWwpIDw8IE9wdERlc2MuR2VuVmFyaWFibGVOYW1lKCkgPDwgIiA9IHRydWU7XG4iOworICAgIGVsc2UKKyAgICAgIHRocm93ICJzZXRfb3B0aW9uOiAtIiArIE9wdE5hbWUgKyAiIGlzIG5vdCBhIHN3aXRjaCBvcHRpb24hIjsKKyAgfQorCisgIHZvaWQgb25TZXRPcHRpb24oY29uc3QgRGFnSW5pdCYgZCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgcmF3X29zdHJlYW0mIE8pIGNvbnN0CisgIHsKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDEpOworCisgICAgLy8gVHdvIGFyZ3VtZW50czogKHNldF9vcHRpb24gInBhcmFtZXRlciIsIFZBTFVFKSwgd2hlcmUgVkFMVUUgY2FuIGJlIGEKKyAgICAvLyBib29sZWFuLCBhIHN0cmluZyBvciBhIHN0cmluZyBsaXN0LgorICAgIGlmIChkLmdldE51bUFyZ3MoKSA+IDEpCisgICAgICB0aGlzLT5vblNldE9wdGlvbkltcGwoZCwgSW5kZW50TGV2ZWwsIE8pOworICAgIC8vIE9uZSBhcmd1bWVudDogKHNldF9vcHRpb24gInN3aXRjaCIpCisgICAgLy8gb3IgKHNldF9vcHRpb24gWyJzd2l0Y2gxIiwgInN3aXRjaDIiLCAuLi5dKQorICAgIGVsc2UKKyAgICAgIHRoaXMtPm9uTGlzdE9yRGFnKGQsICZFbWl0UHJlcHJvY2Vzc09wdGlvbnNDYWxsYmFjazo6b25TZXRTd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnRMZXZlbCwgTyk7CisgIH0KKworcHVibGljOgorCisgIEVtaXRQcmVwcm9jZXNzT3B0aW9uc0NhbGxiYWNrKGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3MpCisgIDogT3B0RGVzY3NfKE9wdERlc2NzKQorICB7CisgICAgaWYgKCFzdGF0aWNNZW1iZXJzSW5pdGlhbGl6ZWRfKSB7CisgICAgICBBZGRIYW5kbGVyKCJlcnJvciIsICZFbWl0UHJlcHJvY2Vzc09wdGlvbnNDYWxsYmFjazo6b25FcnJvckRhZyk7CisgICAgICBBZGRIYW5kbGVyKCJ3YXJuaW5nIiwgJkVtaXRQcmVwcm9jZXNzT3B0aW9uc0NhbGxiYWNrOjpvbldhcm5pbmdEYWcpOworICAgICAgQWRkSGFuZGxlcigidW5zZXRfb3B0aW9uIiwgJkVtaXRQcmVwcm9jZXNzT3B0aW9uc0NhbGxiYWNrOjpvblVuc2V0T3B0aW9uKTsKKyAgICAgIEFkZEhhbmRsZXIoInNldF9vcHRpb24iLCAmRW1pdFByZXByb2Nlc3NPcHRpb25zQ2FsbGJhY2s6Om9uU2V0T3B0aW9uKTsKKworICAgICAgc3RhdGljTWVtYmVyc0luaXRpYWxpemVkXyA9IHRydWU7CisgICAgfQorICB9CisKKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IEluaXQqIEksCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgcmF3X29zdHJlYW0mIE8pIGNvbnN0CisgIHsKKyAgICBJbnZva2VEYWdJbml0SGFuZGxlcih0aGlzLCBJLCBJbmRlbnRMZXZlbCwgTyk7CisgIH0KKworfTsKKworLy8vIEVtaXRQcmVwcm9jZXNzT3B0aW9ucyAtIEVtaXQgdGhlIFByZXByb2Nlc3NPcHRpb25zTG9jYWwoKSBmdW5jdGlvbi4KK3ZvaWQgRW1pdFByZXByb2Nlc3NPcHRpb25zIChjb25zdCBSZWNvcmRLZWVwZXImIFJlY29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZWNzLCByYXdfb3N0cmVhbSYgTykKK3sKKyAgTyA8PCAiaW50IFByZXByb2Nlc3NPcHRpb25zTG9jYWwoKSB7XG4iOworCisgIGNvbnN0IFJlY29yZFZlY3RvciYgT3B0aW9uUHJlcHJvY2Vzc29ycyA9CisgICAgUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIk9wdGlvblByZXByb2Nlc3NvciIpOworCisgIGZvciAoUmVjb3JkVmVjdG9yOjpjb25zdF9pdGVyYXRvciBCID0gT3B0aW9uUHJlcHJvY2Vzc29ycy5iZWdpbigpLAorICAgICAgICAgRSA9IE9wdGlvblByZXByb2Nlc3NvcnMuZW5kKCk7IEIhPUU7ICsrQikgeworICAgIERhZ0luaXQqIENhc2UgPSAoKkIpLT5nZXRWYWx1ZUFzRGFnKCJwcmVwcm9jZXNzb3IiKTsKKyAgICBFbWl0Q2FzZUNvbnN0cnVjdEhhbmRsZXIoQ2FzZSwgSW5kZW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1pdFByZXByb2Nlc3NPcHRpb25zQ2FsbGJhY2soT3B0RGVjcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBPcHREZWNzLCBPKTsKKyAgfQorCisgIE8gPDwgJ1xuJzsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgInJldHVybiAwO1xuIjsKKyAgTyA8PCAifVxuXG4iOworfQorCisvLy8gRW1pdFBvcHVsYXRlTGFuZ3VhZ2VNYXAgLSBFbWl0IHRoZSBQb3B1bGF0ZUxhbmd1YWdlTWFwTG9jYWwoKSBmdW5jdGlvbi4KK3ZvaWQgRW1pdFBvcHVsYXRlTGFuZ3VhZ2VNYXAgKGNvbnN0IFJlY29yZEtlZXBlciYgUmVjb3JkcywgcmF3X29zdHJlYW0mIE8pCit7CisgIE8gPDwgImludCBQb3B1bGF0ZUxhbmd1YWdlTWFwTG9jYWwoTGFuZ3VhZ2VNYXAmIGxhbmdNYXApIHtcbiI7CisKKyAgLy8gR2V0IHRoZSByZWxldmFudCBmaWVsZCBvdXQgb2YgUmVjb3JkS2VlcGVyCisgIGNvbnN0IFJlY29yZCogTGFuZ01hcFJlY29yZCA9IFJlY29yZHMuZ2V0RGVmKCJMYW5ndWFnZU1hcCIpOworCisgIC8vIEl0IGlzIGFsbG93ZWQgZm9yIGEgcGx1Z2luIHRvIGhhdmUgbm8gbGFuZ3VhZ2UgbWFwLgorICBpZiAoTGFuZ01hcFJlY29yZCkgeworCisgICAgTGlzdEluaXQqIExhbmdzVG9TdWZmaXhlc0xpc3QgPSBMYW5nTWFwUmVjb3JkLT5nZXRWYWx1ZUFzTGlzdEluaXQoIm1hcCIpOworICAgIGlmICghTGFuZ3NUb1N1ZmZpeGVzTGlzdCkKKyAgICAgIHRocm93ICJFcnJvciBpbiB0aGUgbGFuZ3VhZ2UgbWFwIGRlZmluaXRpb24hIjsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBMYW5nc1RvU3VmZml4ZXNMaXN0LT5zaXplKCk7ICsraSkgeworICAgICAgY29uc3QgUmVjb3JkKiBMYW5nVG9TdWZmaXhlcyA9IExhbmdzVG9TdWZmaXhlc0xpc3QtPmdldEVsZW1lbnRBc1JlY29yZChpKTsKKworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIExhbmcgPSBMYW5nVG9TdWZmaXhlcy0+Z2V0VmFsdWVBc1N0cmluZygibGFuZyIpOworICAgICAgY29uc3QgTGlzdEluaXQqIFN1ZmZpeGVzID0gTGFuZ1RvU3VmZml4ZXMtPmdldFZhbHVlQXNMaXN0SW5pdCgic3VmZml4ZXMiKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFN1ZmZpeGVzLT5zaXplKCk7ICsraSkKKyAgICAgICAgTy5pbmRlbnQoSW5kZW50MSkgPDwgImxhbmdNYXBbXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluaXRQdHJUb1N0cmluZyhTdWZmaXhlcy0+Z2V0RWxlbWVudChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiXSA9IFwiIiA8PCBMYW5nIDw8ICJcIjtcbiI7CisgICAgfQorICB9CisKKyAgTyA8PCAnXG4nOworICBPLmluZGVudChJbmRlbnQxKSA8PCAicmV0dXJuIDA7XG4iOworICBPIDw8ICJ9XG5cbiI7Cit9CisKKy8vLyBJbmNEZWNXZWlnaHQgLSBIZWxwZXIgZnVuY3Rpb24gcGFzc2VkIHRvIEVtaXRDYXNlQ29uc3RydWN0SGFuZGxlcigpCisvLy8gYnkgRW1pdEVkZ2VDbGFzcygpLgordm9pZCBJbmNEZWNXZWlnaHQgKGNvbnN0IEluaXQqIGksIHVuc2lnbmVkIEluZGVudExldmVsLAorICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtJiBPKSB7CisgIGNvbnN0IERhZ0luaXQmIGQgPSBJbml0UHRyVG9EYWcoaSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBPcE5hbWUgPSBHZXRPcGVyYXRvck5hbWUoZCk7CisKKyAgaWYgKE9wTmFtZSA9PSAiaW5jX3dlaWdodCIpIHsKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbCkgPDwgInJldCArPSAiOworICB9CisgIGVsc2UgaWYgKE9wTmFtZSA9PSAiZGVjX3dlaWdodCIpIHsKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbCkgPDwgInJldCAtPSAiOworICB9CisgIGVsc2UgaWYgKE9wTmFtZSA9PSAiZXJyb3IiKSB7CisgICAgLy8gVE9ETzogZml4IHRoaXMKKyAgICBDaGVja051bWJlck9mQXJndW1lbnRzKGQsIDEpOworICAgIE8uaW5kZW50KEluZGVudExldmVsKSA8PCAiUHJpbnRFcnJvcihcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5pdFB0clRvU3RyaW5nKGQuZ2V0QXJnKDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIpO1xuIjsKKyAgICBPLmluZGVudChJbmRlbnRMZXZlbCkgPDwgInJldHVybiAtMTtcbiI7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgeworICAgIHRocm93ICJVbmtub3duIG9wZXJhdG9yIGluIGVkZ2UgcHJvcGVydGllcyBsaXN0OiAnIiArIE9wTmFtZSArICInISIKKyAgICAgICJcbk9ubHkgJ2luY193ZWlnaHQnLCAnZGVjX3dlaWdodCcgYW5kICdlcnJvcicgYXJlIGFsbG93ZWQuIjsKKyAgfQorCisgIGlmIChkLmdldE51bUFyZ3MoKSA+IDApCisgICAgTyA8PCBJbml0UHRyVG9JbnQoZC5nZXRBcmcoMCkpIDw8ICI7XG4iOworICBlbHNlCisgICAgTyA8PCAiMjtcbiI7CisKK30KKworLy8vIEVtaXRFZGdlQ2xhc3MgLSBFbWl0IGEgc2luZ2xlIEVkZ2UjIGNsYXNzLgordm9pZCBFbWl0RWRnZUNsYXNzICh1bnNpZ25lZCBOLCBjb25zdCBzdGQ6OnN0cmluZyYgVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICBEYWdJbml0KiBDYXNlLCBjb25zdCBPcHRpb25EZXNjcmlwdGlvbnMmIE9wdERlc2NzLAorICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSYgTykgeworCisgIC8vIENsYXNzIGNvbnN0cnVjdG9yLgorICBPIDw8ICJjbGFzcyBFZGdlIiA8PCBOIDw8ICI6IHB1YmxpYyBFZGdlIHtcbiIKKyAgICA8PCAicHVibGljOlxuIjsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgIkVkZ2UiIDw8IE4gPDwgIigpIDogRWRnZShcIiIgPDwgVGFyZ2V0CisgICAgICAgICAgICAgICAgICAgIDw8ICJcIikge31cblxuIjsKKworICAvLyBGdW5jdGlvbiBXZWlnaHQoKS4KKyAgTy5pbmRlbnQoSW5kZW50MSkKKyAgICA8PCAidW5zaWduZWQgV2VpZ2h0KGNvbnN0IElucHV0TGFuZ3VhZ2VzU2V0JiBJbkxhbmdzKSBjb25zdCB7XG4iOworICBPLmluZGVudChJbmRlbnQyKSA8PCAidW5zaWduZWQgcmV0ID0gMDtcbiI7CisKKyAgLy8gSGFuZGxlIHRoZSAnY2FzZScgY29uc3RydWN0LgorICBFbWl0Q2FzZUNvbnN0cnVjdEhhbmRsZXIoQ2FzZSwgSW5kZW50MiwgSW5jRGVjV2VpZ2h0LCBmYWxzZSwgT3B0RGVzY3MsIE8pOworCisgIE8uaW5kZW50KEluZGVudDIpIDw8ICJyZXR1cm4gcmV0O1xuIjsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgIn1cblxufTtcblxuIjsKK30KKworLy8vIEVtaXRFZGdlQ2xhc3NlcyAtIEVtaXQgRWRnZSogY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBncmFwaCBlZGdlcy4KK3ZvaWQgRW1pdEVkZ2VDbGFzc2VzIChjb25zdCBSZWNvcmRWZWN0b3ImIEVkZ2VWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcywKKyAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSYgTykgeworICBpbnQgaSA9IDA7CisgIGZvciAoUmVjb3JkVmVjdG9yOjpjb25zdF9pdGVyYXRvciBCID0gRWRnZVZlY3Rvci5iZWdpbigpLAorICAgICAgICAgRSA9IEVkZ2VWZWN0b3IuZW5kKCk7IEIgIT0gRTsgKytCKSB7CisgICAgY29uc3QgUmVjb3JkKiBFZGdlID0gKkI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE5vZGVCID0gRWRnZS0+Z2V0VmFsdWVBc1N0cmluZygiYiIpOworICAgIERhZ0luaXQmIFdlaWdodCA9ICpFZGdlLT5nZXRWYWx1ZUFzRGFnKCJ3ZWlnaHQiKTsKKworICAgIGlmICghSXNEYWdFbXB0eShXZWlnaHQpKQorICAgICAgRW1pdEVkZ2VDbGFzcyhpLCBOb2RlQiwgJldlaWdodCwgT3B0RGVzY3MsIE8pOworICAgICsraTsKKyAgfQorfQorCisvLy8gRW1pdFBvcHVsYXRlQ29tcGlsYXRpb25HcmFwaCAtIEVtaXQgdGhlIFBvcHVsYXRlQ29tcGlsYXRpb25HcmFwaExvY2FsKCkKKy8vLyBmdW5jdGlvbi4KK3ZvaWQgRW1pdFBvcHVsYXRlQ29tcGlsYXRpb25HcmFwaCAoY29uc3QgUmVjb3JkVmVjdG9yJiBFZGdlVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb29sRGVzY3JpcHRpb25zJiBUb29sRGVzY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtJiBPKQoreworICBPIDw8ICJpbnQgUG9wdWxhdGVDb21waWxhdGlvbkdyYXBoTG9jYWwoQ29tcGlsYXRpb25HcmFwaCYgRykge1xuIjsKKworICBmb3IgKFRvb2xEZXNjcmlwdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIEIgPSBUb29sRGVzY3MuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBUb29sRGVzY3MuZW5kKCk7IEIgIT0gRTsgKytCKQorICAgIE8uaW5kZW50KEluZGVudDEpIDw8ICJHLmluc2VydE5vZGUobmV3ICIgPDwgKCpCKS0+TmFtZSA8PCAiKCkpO1xuIjsKKworICBPIDw8ICdcbic7CisKKyAgLy8gSW5zZXJ0IGVkZ2VzLgorCisgIGludCBpID0gMDsKKyAgZm9yIChSZWNvcmRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIgPSBFZGdlVmVjdG9yLmJlZ2luKCksCisgICAgICAgICBFID0gRWRnZVZlY3Rvci5lbmQoKTsgQiAhPSBFOyArK0IpIHsKKyAgICBjb25zdCBSZWNvcmQqIEVkZ2UgPSAqQjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgTm9kZUEgPSBFZGdlLT5nZXRWYWx1ZUFzU3RyaW5nKCJhIik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIE5vZGVCID0gRWRnZS0+Z2V0VmFsdWVBc1N0cmluZygiYiIpOworICAgIERhZ0luaXQmIFdlaWdodCA9ICpFZGdlLT5nZXRWYWx1ZUFzRGFnKCJ3ZWlnaHQiKTsKKworICAgIE8uaW5kZW50KEluZGVudDEpIDw8ICJpZiAoaW50IHJldCA9IEcuaW5zZXJ0RWRnZShcIiIgPDwgTm9kZUEgPDwgIlwiLCAiOworCisgICAgaWYgKElzRGFnRW1wdHkoV2VpZ2h0KSkKKyAgICAgIE8gPDwgIm5ldyBTaW1wbGVFZGdlKFwiIiA8PCBOb2RlQiA8PCAiXCIpIjsKKyAgICBlbHNlCisgICAgICBPIDw8ICJuZXcgRWRnZSIgPDwgaSA8PCAiKCkiOworCisgICAgTyA8PCAiKSlcbiI7CisgICAgTy5pbmRlbnQoSW5kZW50MikgPDwgInJldHVybiByZXQ7XG4iOworCisgICAgKytpOworICB9CisKKyAgTyA8PCAnXG4nOworICBPLmluZGVudChJbmRlbnQxKSA8PCAicmV0dXJuIDA7XG4iOworICBPIDw8ICJ9XG5cbiI7Cit9CisKKy8vLyBIb29rSW5mbyAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBob29rIHR5cGUgYW5kIG51bWJlciBvZiBhcmd1bWVudHMuCitzdHJ1Y3QgSG9va0luZm8geworCisgIC8vIEEgaG9vayBjYW4gZWl0aGVyIGhhdmUgYSBzaW5nbGUgcGFyYW1ldGVyIG9mIHR5cGUgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+LAorICAvLyBvciBOdW1BcmdzIHBhcmFtZXRlcnMgb2YgdHlwZSBjb25zdCBjaGFyKi4KKyAgZW51bSBIb29rVHlwZSB7IExpc3RIb29rLCBBcmdIb29rIH07CisKKyAgSG9va1R5cGUgVHlwZTsKKyAgdW5zaWduZWQgTnVtQXJnczsKKworICBIb29rSW5mbygpIDogVHlwZShBcmdIb29rKSwgTnVtQXJncygxKQorICB7fQorCisgIEhvb2tJbmZvKEhvb2tUeXBlIFQpIDogVHlwZShUKSwgTnVtQXJncygxKQorICB7fQorCisgIEhvb2tJbmZvKHVuc2lnbmVkIE4pIDogVHlwZShBcmdIb29rKSwgTnVtQXJncyhOKQorICB7fQorfTsKKwordHlwZWRlZiBsbHZtOjpTdHJpbmdNYXA8SG9va0luZm8+IEhvb2tJbmZvTWFwOworCisvLy8gRXh0cmFjdEhvb2tOYW1lcyAtIEV4dHJhY3QgdGhlIGhvb2sgbmFtZXMgZnJvbSBhbGwgaW5zdGFuY2VzIG9mCisvLy8gJENBTEwoSG9va05hbWUpIGluIHRoZSBwcm92aWRlZCBjb21tYW5kIGxpbmUgc3RyaW5nL2FjdGlvbi4gSGVscGVyCisvLy8gZnVuY3Rpb24gdXNlZCBieSBGaWxsSW5Ib29rTmFtZXMoKS4KK2NsYXNzIEV4dHJhY3RIb29rTmFtZXMgeworICBIb29rSW5mb01hcCYgSG9va05hbWVzXzsKKyAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjc187CitwdWJsaWM6CisgIEV4dHJhY3RIb29rTmFtZXMoSG9va0luZm9NYXAmIEhvb2tOYW1lcywgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcykKKyAgICA6IEhvb2tOYW1lc18oSG9va05hbWVzKSwgT3B0RGVzY3NfKE9wdERlc2NzKQorICB7fQorCisgIHZvaWQgb25BY3Rpb24gKGNvbnN0IERhZ0luaXQmIERhZykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBOYW1lID0gR2V0T3BlcmF0b3JOYW1lKERhZyk7CisKKyAgICBpZiAoTmFtZSA9PSAiZm9yd2FyZF90cmFuc2Zvcm1lZF92YWx1ZSIpIHsKKyAgICAgIENoZWNrTnVtYmVyT2ZBcmd1bWVudHMoRGFnLCAyKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHROYW1lID0gSW5pdFB0clRvU3RyaW5nKERhZy5nZXRBcmcoMCkpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIEhvb2tOYW1lID0gSW5pdFB0clRvU3RyaW5nKERhZy5nZXRBcmcoMSkpOworICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb24mIEQgPQorICAgICAgICBPcHREZXNjc18uRmluZFBhcmFtZXRlckxpc3RPclBhcmFtZXRlcihPcHROYW1lKTsKKworICAgICAgSG9va05hbWVzX1tIb29rTmFtZV0gPSBIb29rSW5mbyhELmlzTGlzdCgpID8gSG9va0luZm86Okxpc3RIb29rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSG9va0luZm86OkFyZ0hvb2spOworICAgIH0KKyAgICBlbHNlIGlmIChOYW1lID09ICJhcHBlbmRfY21kIiB8fCBOYW1lID09ICJvdXRwdXRfc3VmZml4IikgeworICAgICAgQ2hlY2tOdW1iZXJPZkFyZ3VtZW50cyhEYWcsIDEpOworICAgICAgdGhpcy0+b25DbWRMaW5lKEluaXRQdHJUb1N0cmluZyhEYWcuZ2V0QXJnKDApKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBvbkNtZExpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIENtZCkgeworICAgIFN0clZlY3RvciBjbWRzOworICAgIFRva2VuaXplQ21kTGluZShDbWQsIGNtZHMpOworCisgICAgZm9yIChTdHJWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIEIgPSBjbWRzLmJlZ2luKCksIEUgPSBjbWRzLmVuZCgpOworICAgICAgICAgQiAhPSBFOyArK0IpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWQgPSAqQjsKKworICAgICAgaWYgKGNtZCA9PSAiJENBTEwiKSB7CisgICAgICAgIHVuc2lnbmVkIE51bUFyZ3MgPSAwOworICAgICAgICBDaGVja2VkSW5jcmVtZW50KEIsIEUsICJTeW50YXggZXJyb3IgaW4gJENBTEwgaW52b2NhdGlvbiEiKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIEhvb2tOYW1lID0gKkI7CisKKyAgICAgICAgaWYgKEhvb2tOYW1lLmF0KDApID09ICcpJykKKyAgICAgICAgICB0aHJvdyAiJENBTEwgaW52b2tlZCB3aXRoIG5vIGFyZ3VtZW50cyEiOworCisgICAgICAgIHdoaWxlICgrK0IgIT0gRSAmJiBCLT5hdCgwKSAhPSAnKScpIHsKKyAgICAgICAgICArK051bUFyZ3M7CisgICAgICAgIH0KKworICAgICAgICBIb29rSW5mb01hcDo6Y29uc3RfaXRlcmF0b3IgSCA9IEhvb2tOYW1lc18uZmluZChIb29rTmFtZSk7CisKKyAgICAgICAgaWYgKEggIT0gSG9va05hbWVzXy5lbmQoKSAmJiBILT5zZWNvbmQuTnVtQXJncyAhPSBOdW1BcmdzICYmCisgICAgICAgICAgICBILT5zZWNvbmQuVHlwZSAhPSBIb29rSW5mbzo6QXJnSG9vaykKKyAgICAgICAgICB0aHJvdyAiT3ZlcmxvYWRpbmcgb2YgaG9va3MgaXMgbm90IGFsbG93ZWQuIE92ZXJsb2FkZWQgaG9vazogIgorICAgICAgICAgICAgKyBIb29rTmFtZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEhvb2tOYW1lc19bSG9va05hbWVdID0gSG9va0luZm8oTnVtQXJncyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IEluaXQqIEFyZykgeworCisgICAgLy8gV2UncmUgaW52b2tlZCBvbiBhbiBhY3Rpb24gKGVpdGhlciBhIGRhZyBvciBhIGRhZyBsaXN0KS4KKyAgICBpZiAodHlwZWlkKCpBcmcpID09IHR5cGVpZChEYWdJbml0KSkgeworICAgICAgY29uc3QgRGFnSW5pdCYgRGFnID0gSW5pdFB0clRvRGFnKEFyZyk7CisgICAgICB0aGlzLT5vbkFjdGlvbihEYWcpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlaWQoKkFyZykgPT0gdHlwZWlkKExpc3RJbml0KSkgeworICAgICAgY29uc3QgTGlzdEluaXQmIExpc3QgPSBJbml0UHRyVG9MaXN0KEFyZyk7CisgICAgICBmb3IgKExpc3RJbml0Ojpjb25zdF9pdGVyYXRvciBCID0gTGlzdC5iZWdpbigpLCBFID0gTGlzdC5lbmQoKTsgQiAhPSBFOworICAgICAgICAgICArK0IpIHsKKyAgICAgICAgY29uc3QgRGFnSW5pdCYgRGFnID0gSW5pdFB0clRvRGFnKCpCKTsKKyAgICAgICAgdGhpcy0+b25BY3Rpb24oRGFnKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXZSdyZSBpbnZva2VkIG9uIGEgY29tbWFuZCBsaW5lLgorICAgIHRoaXMtPm9uQ21kTGluZShJbml0UHRyVG9TdHJpbmcoQXJnKSk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgRGFnSW5pdCogVGVzdCwgdW5zaWduZWQsIGJvb2wpIHsKKyAgICB0aGlzLT5vcGVyYXRvcigpKFRlc3QpOworICB9CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBJbml0KiBTdGF0ZW1lbnQsIHVuc2lnbmVkKSB7CisgICAgdGhpcy0+b3BlcmF0b3IoKShTdGF0ZW1lbnQpOworICB9Cit9OworCisvLy8gRmlsbEluSG9va05hbWVzIC0gQWN0dWFsbHkgZXh0cmFjdCB0aGUgaG9vayBuYW1lcyBmcm9tIGFsbCBjb21tYW5kCisvLy8gbGluZSBzdHJpbmdzLiBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBFbWl0SG9va0RlY2xhcmF0aW9ucygpLgordm9pZCBGaWxsSW5Ib29rTmFtZXMoY29uc3QgVG9vbERlc2NyaXB0aW9ucyYgVG9vbERlc2NzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcywKKyAgICAgICAgICAgICAgICAgICAgIEhvb2tJbmZvTWFwJiBIb29rTmFtZXMpCit7CisgIC8vIEZvciBhbGwgdG9vbCBkZXNjcmlwdGlvbnM6CisgIGZvciAoVG9vbERlc2NyaXB0aW9uczo6Y29uc3RfaXRlcmF0b3IgQiA9IFRvb2xEZXNjcy5iZWdpbigpLAorICAgICAgICAgRSA9IFRvb2xEZXNjcy5lbmQoKTsgQiAhPSBFOyArK0IpIHsKKyAgICBjb25zdCBUb29sRGVzY3JpcHRpb24mIEQgPSAqKCpCKTsKKworICAgIC8vIExvb2sgZm9yICdmb3J3YXJkX3RyYW5zZm9ybWVkX3ZhbHVlJyBpbiAnYWN0aW9ucycuCisgICAgaWYgKEQuQWN0aW9ucykKKyAgICAgIFdhbGtDYXNlKEQuQWN0aW9ucywgSWQoKSwgRXh0cmFjdEhvb2tOYW1lcyhIb29rTmFtZXMsIE9wdERlc2NzKSk7CisKKyAgICAvLyBMb29rIGZvciBob29rIGludm9jYXRpb25zIGluICdjbWRfbGluZScuCisgICAgaWYgKCFELkNtZExpbmUpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoZHluYW1pY19jYXN0PFN0cmluZ0luaXQqPihELkNtZExpbmUpKQorICAgICAgLy8gVGhpcyBpcyBhIHN0cmluZy4KKyAgICAgIEV4dHJhY3RIb29rTmFtZXMoSG9va05hbWVzLCBPcHREZXNjcykub3BlcmF0b3IoKShELkNtZExpbmUpOworICAgIGVsc2UKKyAgICAgIC8vIFRoaXMgaXMgYSAnY2FzZScgY29uc3RydWN0LgorICAgICAgV2Fsa0Nhc2UoRC5DbWRMaW5lLCBJZCgpLCBFeHRyYWN0SG9va05hbWVzKEhvb2tOYW1lcywgT3B0RGVzY3MpKTsKKyAgfQorfQorCisvLy8gRW1pdEhvb2tEZWNsYXJhdGlvbnMgLSBQYXJzZSBDbWRMaW5lIGZpZWxkcyBvZiBhbGwgdGhlIHRvb2wKKy8vLyBwcm9wZXJ0eSByZWNvcmRzIGFuZCBlbWl0IGhvb2sgZnVuY3Rpb24gZGVjbGFyYXRpb24gZm9yIGVhY2gKKy8vLyBpbnN0YW5jZSBvZiAkQ0FMTChIb29rTmFtZSkuCit2b2lkIEVtaXRIb29rRGVjbGFyYXRpb25zKGNvbnN0IFRvb2xEZXNjcmlwdGlvbnMmIFRvb2xEZXNjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVzY3JpcHRpb25zJiBPcHREZXNjcywgcmF3X29zdHJlYW0mIE8pIHsKKyAgSG9va0luZm9NYXAgSG9va05hbWVzOworCisgIEZpbGxJbkhvb2tOYW1lcyhUb29sRGVzY3MsIE9wdERlc2NzLCBIb29rTmFtZXMpOworICBpZiAoSG9va05hbWVzLmVtcHR5KCkpCisgICAgcmV0dXJuOworCisgIE8gPDwgIm5hbWVzcGFjZSBob29rcyB7XG4iOworICBmb3IgKEhvb2tJbmZvTWFwOjpjb25zdF9pdGVyYXRvciBCID0gSG9va05hbWVzLmJlZ2luKCksCisgICAgICAgICBFID0gSG9va05hbWVzLmVuZCgpOyBCICE9IEU7ICsrQikgeworICAgIGNvbnN0IGNoYXIqIEhvb2tOYW1lID0gQi0+Zmlyc3QoKTsKKyAgICBjb25zdCBIb29rSW5mbyYgSW5mbyA9IEItPnNlY29uZDsKKworICAgIE8uaW5kZW50KEluZGVudDEpIDw8ICJzdGQ6OnN0cmluZyAiIDw8IEhvb2tOYW1lIDw8ICIoIjsKKworICAgIGlmIChJbmZvLlR5cGUgPT0gSG9va0luZm86OkFyZ0hvb2spIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGogPSBJbmZvLk51bUFyZ3M7IGkgPCBqOyArK2kpIHsKKyAgICAgICAgTyA8PCAiY29uc3QgY2hhciogQXJnIiA8PCBpIDw8IChpKzEgPT0gaiA/ICIiIDogIiwgIik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgTyA8PCAiY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBBcmciOworICAgIH0KKworICAgIE8gPDwiKTtcbiI7CisgIH0KKyAgTyA8PCAifVxuXG4iOworfQorCisvLy8gRW1pdFJlZ2lzdGVyUGx1Z2luIC0gRW1pdCBjb2RlIHRvIHJlZ2lzdGVyIHRoaXMgcGx1Z2luLgordm9pZCBFbWl0UmVnaXN0ZXJQbHVnaW4oaW50IFByaW9yaXR5LCByYXdfb3N0cmVhbSYgTykgeworICBPIDw8ICJzdHJ1Y3QgUGx1Z2luIDogcHVibGljIGxsdm1jOjpCYXNlUGx1Z2luIHtcblxuIjsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgImludCBQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgPDwgUHJpb3JpdHkgPDwgIjsgfVxuXG4iOworICBPLmluZGVudChJbmRlbnQxKSA8PCAiaW50IFByZXByb2Nlc3NPcHRpb25zKCkgY29uc3RcbiI7CisgIE8uaW5kZW50KEluZGVudDEpIDw8ICJ7IHJldHVybiBQcmVwcm9jZXNzT3B0aW9uc0xvY2FsKCk7IH1cblxuIjsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgImludCBQb3B1bGF0ZUxhbmd1YWdlTWFwKExhbmd1YWdlTWFwJiBsYW5nTWFwKSBjb25zdFxuIjsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgInsgcmV0dXJuIFBvcHVsYXRlTGFuZ3VhZ2VNYXBMb2NhbChsYW5nTWFwKTsgfVxuXG4iOworICBPLmluZGVudChJbmRlbnQxKQorICAgIDw8ICJpbnQgUG9wdWxhdGVDb21waWxhdGlvbkdyYXBoKENvbXBpbGF0aW9uR3JhcGgmIGdyYXBoKSBjb25zdFxuIjsKKyAgTy5pbmRlbnQoSW5kZW50MSkgPDwgInsgcmV0dXJuIFBvcHVsYXRlQ29tcGlsYXRpb25HcmFwaExvY2FsKGdyYXBoKTsgfVxuIgorICAgICAgICAgICAgICAgICAgICA8PCAifTtcblxuIgorICAgICAgICAgICAgICAgICAgICA8PCAic3RhdGljIGxsdm1jOjpSZWdpc3RlclBsdWdpbjxQbHVnaW4+IFJQO1xuXG4iOworfQorCisvLy8gRW1pdEluY2x1ZGVzIC0gRW1pdCBuZWNlc3NhcnkgI2luY2x1ZGUgZGlyZWN0aXZlcyBhbmQgc29tZQorLy8vIGFkZGl0aW9uYWwgZGVjbGFyYXRpb25zLgordm9pZCBFbWl0SW5jbHVkZXMocmF3X29zdHJlYW0mIE8pIHsKKyAgTyA8PCAiI2luY2x1ZGUgXCJsbHZtL0NvbXBpbGVyRHJpdmVyL0J1aWx0aW5PcHRpb25zLmhcIlxuIgorICAgIDw8ICIjaW5jbHVkZSBcImxsdm0vQ29tcGlsZXJEcml2ZXIvQ29tcGlsYXRpb25HcmFwaC5oXCJcbiIKKyAgICA8PCAiI2luY2x1ZGUgXCJsbHZtL0NvbXBpbGVyRHJpdmVyL0Vycm9yLmhcIlxuIgorICAgIDw8ICIjaW5jbHVkZSBcImxsdm0vQ29tcGlsZXJEcml2ZXIvRm9yY2VMaW5rYWdlTWFjcm9zLmhcIlxuIgorICAgIDw8ICIjaW5jbHVkZSBcImxsdm0vQ29tcGlsZXJEcml2ZXIvUGx1Z2luLmhcIlxuIgorICAgIDw8ICIjaW5jbHVkZSBcImxsdm0vQ29tcGlsZXJEcml2ZXIvVG9vbC5oXCJcblxuIgorCisgICAgPDwgIiNpbmNsdWRlIFwibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmhcIlxuIgorICAgIDw8ICIjaW5jbHVkZSBcImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oXCJcblxuIgorCisgICAgPDwgIiNpbmNsdWRlIDxhbGdvcml0aG0+XG4iCisgICAgPDwgIiNpbmNsdWRlIDxjc3RkbGliPlxuIgorICAgIDw8ICIjaW5jbHVkZSA8aXRlcmF0b3I+XG4iCisgICAgPDwgIiNpbmNsdWRlIDxzdGRleGNlcHQ+XG5cbiIKKworICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgbGx2bTtcbiIKKyAgICA8PCAidXNpbmcgbmFtZXNwYWNlIGxsdm1jO1xuXG4iCisKKyAgICA8PCAiZXh0ZXJuIGNsOjpvcHQ8c3RkOjpzdHJpbmc+IE91dHB1dEZpbGVuYW1lO1xuXG4iCisKKyAgICA8PCAiaW5saW5lIGNvbnN0IGNoYXIqIGNoZWNrQ1N0cmluZyhjb25zdCBjaGFyKiBzKVxuIgorICAgIDw8ICJ7IHJldHVybiBzID09IE5VTEwgPyBcIlwiIDogczsgfVxuXG4iOworfQorCisKKy8vLyBQbHVnaW5EYXRhIC0gSG9sZHMgYWxsIGluZm9ybWF0aW9uIGFib3V0IGEgcGx1Z2luLgorc3RydWN0IFBsdWdpbkRhdGEgeworICBPcHRpb25EZXNjcmlwdGlvbnMgT3B0RGVzY3M7CisgIGJvb2wgSGFzU2luazsKKyAgYm9vbCBIYXNFeHRlcm5zOworICBUb29sRGVzY3JpcHRpb25zIFRvb2xEZXNjczsKKyAgUmVjb3JkVmVjdG9yIEVkZ2VzOworICBpbnQgUHJpb3JpdHk7Cit9OworCisvLy8gSGFzU2luayAtIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgdG9vbCBkZXNjcmlwdGlvbnMgYW5kIGNoZWNrIGlmCisvLy8gdGhlcmUgYXJlIGFueSB3aXRoIHRoZSAnc2luaycgcHJvcGVydHkgc2V0LgorYm9vbCBIYXNTaW5rKGNvbnN0IFRvb2xEZXNjcmlwdGlvbnMmIFRvb2xEZXNjcykgeworICBmb3IgKFRvb2xEZXNjcmlwdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIEIgPSBUb29sRGVzY3MuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBUb29sRGVzY3MuZW5kKCk7IEIgIT0gRTsgKytCKQorICAgIGlmICgoKkIpLT5pc1NpbmsoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEhhc0V4dGVybnMgLSBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIG9wdGlvbiBkZXNjcmlwdGlvbnMgYW5kIGNoZWNrCisvLy8gaWYgdGhlcmUgYXJlIGFueSBleHRlcm5hbCBvcHRpb25zLgorYm9vbCBIYXNFeHRlcm5zKGNvbnN0IE9wdGlvbkRlc2NyaXB0aW9ucyYgT3B0RGVzY3MpIHsKKyBmb3IgKE9wdGlvbkRlc2NyaXB0aW9uczo6Y29uc3RfaXRlcmF0b3IgQiA9IE9wdERlc2NzLmJlZ2luKCksCisgICAgICAgICBFID0gT3B0RGVzY3MuZW5kKCk7IEIgIT0gRTsgKytCKQorICAgIGlmIChCLT5zZWNvbmQuaXNFeHRlcm4oKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIENvbGxlY3RQbHVnaW5EYXRhIC0gQ29sbGVjdCB0b29sIGFuZCBvcHRpb24gcHJvcGVydGllcywKKy8vLyBjb21waWxhdGlvbiBncmFwaCBlZGdlcyBhbmQgcGx1Z2luIHByaW9yaXR5IGZyb20gdGhlIHBhcnNlIHRyZWUuCit2b2lkIENvbGxlY3RQbHVnaW5EYXRhIChjb25zdCBSZWNvcmRLZWVwZXImIFJlY29yZHMsIFBsdWdpbkRhdGEmIERhdGEpIHsKKyAgLy8gQ29sbGVjdCBvcHRpb24gcHJvcGVydGllcy4KKyAgY29uc3QgUmVjb3JkVmVjdG9yJiBPcHRpb25MaXN0cyA9CisgICAgUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIk9wdGlvbkxpc3QiKTsKKyAgQ29sbGVjdE9wdGlvbkRlc2NyaXB0aW9ucyhPcHRpb25MaXN0cy5iZWdpbigpLCBPcHRpb25MaXN0cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLk9wdERlc2NzKTsKKworICAvLyBDb2xsZWN0IHRvb2wgcHJvcGVydGllcy4KKyAgY29uc3QgUmVjb3JkVmVjdG9yJiBUb29scyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJUb29sIik7CisgIENvbGxlY3RUb29sRGVzY3JpcHRpb25zKFRvb2xzLmJlZ2luKCksIFRvb2xzLmVuZCgpLCBEYXRhLlRvb2xEZXNjcyk7CisgIERhdGEuSGFzU2luayA9IEhhc1NpbmsoRGF0YS5Ub29sRGVzY3MpOworICBEYXRhLkhhc0V4dGVybnMgPSBIYXNFeHRlcm5zKERhdGEuT3B0RGVzY3MpOworCisgIC8vIENvbGxlY3QgY29tcGlsYXRpb24gZ3JhcGggZWRnZXMuCisgIGNvbnN0IFJlY29yZFZlY3RvciYgQ29tcGlsYXRpb25HcmFwaHMgPQorICAgIFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJDb21waWxhdGlvbkdyYXBoIik7CisgIEZpbGxJbkVkZ2VWZWN0b3IoQ29tcGlsYXRpb25HcmFwaHMuYmVnaW4oKSwgQ29tcGlsYXRpb25HcmFwaHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgRGF0YS5FZGdlcyk7CisKKyAgLy8gQ2FsY3VsYXRlIHRoZSBwcmlvcml0eSBvZiB0aGlzIHBsdWdpbi4KKyAgY29uc3QgUmVjb3JkVmVjdG9yJiBQcmlvcml0aWVzID0KKyAgICBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiUGx1Z2luUHJpb3JpdHkiKTsKKyAgRGF0YS5Qcmlvcml0eSA9IENhbGN1bGF0ZVByaW9yaXR5KFByaW9yaXRpZXMuYmVnaW4oKSwgUHJpb3JpdGllcy5lbmQoKSk7Cit9CisKKy8vLyBDaGVja1BsdWdpbkRhdGEgLSBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiB0aGUgY29sbGVjdGVkIGRhdGEuCit2b2lkIENoZWNrUGx1Z2luRGF0YShQbHVnaW5EYXRhJiBEYXRhKSB7CisgIC8vIEZpbHRlciBvdXQgYWxsIHRvb2xzIG5vdCBtZW50aW9uZWQgaW4gdGhlIGNvbXBpbGF0aW9uIGdyYXBoLgorICBGaWx0ZXJOb3RJbkdyYXBoKERhdGEuRWRnZXMsIERhdGEuVG9vbERlc2NzKTsKKworICAvLyBUeXBlY2hlY2sgdGhlIGNvbXBpbGF0aW9uIGdyYXBoLgorICBUeXBlY2hlY2tHcmFwaChEYXRhLkVkZ2VzLCBEYXRhLlRvb2xEZXNjcyk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gb3B0aW9ucyB3aXRob3V0IHNpZGUgZWZmZWN0cyAoc3BlY2lmaWVkCisgIC8vIG9ubHkgaW4gdGhlIE9wdGlvbkxpc3QpLgorICBDaGVja0ZvclN1cGVyZmx1b3VzT3B0aW9ucyhEYXRhLkVkZ2VzLCBEYXRhLlRvb2xEZXNjcywgRGF0YS5PcHREZXNjcyk7Cit9CisKK3ZvaWQgRW1pdFBsdWdpbkNvZGUoY29uc3QgUGx1Z2luRGF0YSYgRGF0YSwgcmF3X29zdHJlYW0mIE8pIHsKKyAgLy8gRW1pdCBmaWxlIGhlYWRlci4KKyAgRW1pdEluY2x1ZGVzKE8pOworCisgIC8vIEVtaXQgZ2xvYmFsIG9wdGlvbiByZWdpc3RyYXRpb24gY29kZS4KKyAgRW1pdE9wdGlvbkRlZmluaXRpb25zKERhdGEuT3B0RGVzY3MsIERhdGEuSGFzU2luaywgRGF0YS5IYXNFeHRlcm5zLCBPKTsKKworICAvLyBFbWl0IGhvb2sgZGVjbGFyYXRpb25zLgorICBFbWl0SG9va0RlY2xhcmF0aW9ucyhEYXRhLlRvb2xEZXNjcywgRGF0YS5PcHREZXNjcywgTyk7CisKKyAgTyA8PCAibmFtZXNwYWNlIHtcblxuIjsKKworICAvLyBFbWl0IFByZXByb2Nlc3NPcHRpb25zTG9jYWwoKSBmdW5jdGlvbi4KKyAgRW1pdFByZXByb2Nlc3NPcHRpb25zKFJlY29yZHMsIERhdGEuT3B0RGVzY3MsIE8pOworCisgIC8vIEVtaXQgUG9wdWxhdGVMYW5ndWFnZU1hcExvY2FsKCkgZnVuY3Rpb24KKyAgLy8gKGxhbmd1YWdlIG1hcCBtYXBzIGZyb20gZmlsZSBleHRlbnNpb25zIHRvIGxhbmd1YWdlIG5hbWVzKS4KKyAgRW1pdFBvcHVsYXRlTGFuZ3VhZ2VNYXAoUmVjb3JkcywgTyk7CisKKyAgLy8gRW1pdCBUb29sIGNsYXNzZXMuCisgIGZvciAoVG9vbERlc2NyaXB0aW9uczo6Y29uc3RfaXRlcmF0b3IgQiA9IERhdGEuVG9vbERlc2NzLmJlZ2luKCksCisgICAgICAgICBFID0gRGF0YS5Ub29sRGVzY3MuZW5kKCk7IEIhPUU7ICsrQikKKyAgICBFbWl0VG9vbENsYXNzRGVmaW5pdGlvbigqKCpCKSwgRGF0YS5PcHREZXNjcywgTyk7CisKKyAgLy8gRW1pdCBFZGdlIyBjbGFzc2VzLgorICBFbWl0RWRnZUNsYXNzZXMoRGF0YS5FZGdlcywgRGF0YS5PcHREZXNjcywgTyk7CisKKyAgLy8gRW1pdCBQb3B1bGF0ZUNvbXBpbGF0aW9uR3JhcGhMb2NhbCgpIGZ1bmN0aW9uLgorICBFbWl0UG9wdWxhdGVDb21waWxhdGlvbkdyYXBoKERhdGEuRWRnZXMsIERhdGEuVG9vbERlc2NzLCBPKTsKKworICAvLyBFbWl0IGNvZGUgZm9yIHBsdWdpbiByZWdpc3RyYXRpb24uCisgIEVtaXRSZWdpc3RlclBsdWdpbihEYXRhLlByaW9yaXR5LCBPKTsKKworICBPIDw8ICJ9IC8vIEVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlLlxuXG4iOworCisgIC8vIEZvcmNlIGxpbmthZ2UgbWFnaWMuCisgIE8gPDwgIm5hbWVzcGFjZSBsbHZtYyB7XG4iOworICBPIDw8ICJMTFZNQ19GT1JDRV9MSU5LQUdFX0RFQ0woTExWTUNfUExVR0lOX05BTUUpIHt9XG4iOworICBPIDw8ICJ9XG4iOworCisgIC8vIEVPRgorfQorCisKKy8vIEVuZCBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlCit9CisKKy8vLyBydW4gLSBUaGUgYmFjay1lbmQgZW50cnkgcG9pbnQuCit2b2lkIExMVk1DQ29uZmlndXJhdGlvbkVtaXR0ZXI6OnJ1biAocmF3X29zdHJlYW0gJk8pIHsKKyAgdHJ5IHsKKyAgUGx1Z2luRGF0YSBEYXRhOworCisgIENvbGxlY3RQbHVnaW5EYXRhKFJlY29yZHMsIERhdGEpOworICBDaGVja1BsdWdpbkRhdGEoRGF0YSk7CisKKyAgdGhpcy0+RW1pdFNvdXJjZUZpbGVIZWFkZXIoIkxMVk1DIENvbmZpZ3VyYXRpb24gTGlicmFyeSIsIE8pOworICBFbWl0UGx1Z2luQ29kZShEYXRhLCBPKTsKKworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgRXJyb3IpIHsKKyAgICB0aHJvdyBFcnJvci53aGF0KCkgKyBzdGQ6OnN0cmluZygiIC0gdXN1YWxseSB0aGlzIG1lYW5zIGEgc3ludGF4IGVycm9yLiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9MTFZNQ0NvbmZpZ3VyYXRpb25FbWl0dGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9MTFZNQ0NvbmZpZ3VyYXRpb25FbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3YjgzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL0xMVk1DQ29uZmlndXJhdGlvbkVtaXR0ZXIuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gTExWTUNDb25maWd1cmF0aW9uRW1pdHRlci5jcHAgLSBHZW5lcmF0ZSBMTFZNQ0MgY29uZmlnIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgdGFibGVnZW4gYmFja2VuZCBpcyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgTExWTUNDIGNvbmZpZ3VyYXRpb24gY29kZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVVRJTFNfVEFCTEVHRU5fTExWTUNDT05GX0VNSVRURVJfSAorI2RlZmluZSBMTFZNX1VUSUxTX1RBQkxFR0VOX0xMVk1DQ09ORl9FTUlUVEVSX0gKKworI2luY2x1ZGUgIlRhYmxlR2VuQmFja2VuZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIExMVk1DQ29uZmlndXJhdGlvbkVtaXR0ZXIgLSBUYWJsZUdlbiBiYWNrZW5kIHRoYXQgZ2VuZXJhdGVzCisgIC8vLyBjb25maWd1cmF0aW9uIGNvZGUgZm9yIExMVk1DLgorICBjbGFzcyBMTFZNQ0NvbmZpZ3VyYXRpb25FbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBMTFZNQ0NvbmZpZ3VyYXRpb25FbWl0dGVyKFJlY29yZEtlZXBlciYpIHt9CisKKyAgICAvLyBydW4gLSBPdXRwdXQgdGhlIGFzbXdyaXRlciwgcmV0dXJuaW5nIHRydWUgb24gZmFpbHVyZS4KKyAgICB2b2lkIHJ1bihyYXdfb3N0cmVhbSAmbyk7CisgIH07Cit9CisKKyNlbmRpZiAvL0xMVk1fVVRJTFNfVEFCTEVHRU5fTExWTUNDT05GX0VNSVRURVJfSApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vTWFrZWZpbGUgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdjZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorIyM9PT0tIHV0aWxzL1RhYmxlR2VuL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorVE9PTE5BTUUgPSB0YmxnZW4KK1VTRURMSUJTID0gTExWTVN1cHBvcnQuYSBMTFZNU3lzdGVtLmEKK1JFUVVJUkVTX0VIIDo9IDEKK1JFUVVJUkVTX1JUVEkgOj0gMQorCisjIFRoaXMgdG9vbCBoYXMgbm8gcGx1Z2lucywgb3B0aW1pemUgc3RhcnR1cCB0aW1lLgorVE9PTF9OT19FWFBPUlRTID0gMQorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9OZW9uRW1pdHRlci5jcHAgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9OZW9uRW1pdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExMmYzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL05lb25FbWl0dGVyLmNwcApAQCAtMCwwICsxLDEyMDcgQEAKKy8vPT09LSBOZW9uRW1pdHRlci5jcHAgLSBHZW5lcmF0ZSBhcm1fbmVvbi5oIGZvciB1c2Ugd2l0aCBjbGFuZyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBhcm1fbmVvbi5oLCB3aGljaCBpbmNsdWRlcworLy8gYSBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIHNwZWNpZmllZCBieSB0aGUgQVJNIE5FT04gCisvLyBjb21waWxlciBpbnRlcmZhY2UuICBTZWUgQVJNIGRvY3VtZW50IERVSTAzNDhCLgorLy8KKy8vIEVhY2ggTkVPTiBpbnN0cnVjdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiAxIG9yIG1vcmUgZnVuY3Rpb25zIHdoaWNoCisvLyBhcmUgc3VmZml4ZWQgd2l0aCB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBpbnB1dCB2ZWN0b3JzLiAgRnVuY3Rpb25zIG1heSBiZSAKKy8vIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIGdlbmVyaWMgdmVjdG9yIG9wZXJhdGlvbnMgc3VjaCBhcyArLCAqLCAtLCBldGMuIG9yCisvLyBieSBjYWxsaW5nIGEgX19idWlsdGluXy1wcmVmaXhlZCBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGhhbmRsZWQgYnkgY2xhbmcncworLy8gQ29kZUdlbiBsaWJyYXJ5LgorLy8KKy8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBjb2RlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhpcyBmaWxlIHdoZW4gcnVuSGVhZGVyKCkgaXMKKy8vIGNhbGxlZCwgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBydW4oKSBlbnRyeSBwb2ludC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiTmVvbkVtaXR0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8vIFBhcnNlVHlwZXMgLSBicmVhayBkb3duIGEgc3RyaW5nIHN1Y2ggYXMgImZRZiIgaW50byBhIHZlY3RvciBvZiBTdHJpbmdSZWZzLAorLy8vIHdoaWNoIGVhY2ggU3RyaW5nUmVmIHJlcHJlc2VudGluZyBhIHNpbmdsZSB0eXBlIGRlY2xhcmVkIGluIHRoZSBzdHJpbmcuCisvLy8gZm9yICJmUWYiIHdlIHdvdWxkIGVuZCB1cCB3aXRoIDIgU3RyaW5nUmVmcywgImYiLCBhbmQgIlFmIiwgcmVwcmVzZW50aW5nCisvLy8gMnhmbG9hdCBhbmQgNHhmbG9hdCByZXNwZWN0aXZlbHkuCitzdGF0aWMgdm9pZCBQYXJzZVR5cGVzKFJlY29yZCAqciwgc3RkOjpzdHJpbmcgJnMsCisgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZUVikgeworICBjb25zdCBjaGFyICpkYXRhID0gcy5kYXRhKCk7CisgIGludCBsZW4gPSAwOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHMuc2l6ZSgpOyBpICE9IGU7ICsraSwgKytsZW4pIHsKKyAgICBpZiAoZGF0YVtsZW5dID09ICdQJyB8fCBkYXRhW2xlbl0gPT0gJ1EnIHx8IGRhdGFbbGVuXSA9PSAnVScpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICBzd2l0Y2ggKGRhdGFbbGVuXSkgeworICAgICAgY2FzZSAnYyc6CisgICAgICBjYXNlICdzJzoKKyAgICAgIGNhc2UgJ2knOgorICAgICAgY2FzZSAnbCc6CisgICAgICBjYXNlICdoJzoKKyAgICAgIGNhc2UgJ2YnOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IFRHRXJyb3Ioci0+Z2V0TG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbGV0dGVyOiAiICsgc3RkOjpzdHJpbmcoZGF0YSArIGxlbiwgMSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgVFYucHVzaF9iYWNrKFN0cmluZ1JlZihkYXRhLCBsZW4gKyAxKSk7CisgICAgZGF0YSArPSBsZW4gKyAxOworICAgIGxlbiA9IC0xOworICB9Cit9CisKKy8vLyBXaWRlbiAtIENvbnZlcnQgYSB0eXBlIGNvZGUgaW50byB0aGUgbmV4dCB3aWRlciB0eXBlLiAgY2hhciAtPiBzaG9ydCwKKy8vLyBzaG9ydCAtPiBpbnQsIGV0Yy4KK3N0YXRpYyBjaGFyIFdpZGVuKGNvbnN0IGNoYXIgdCkgeworICBzd2l0Y2ggKHQpIHsKKyAgICBjYXNlICdjJzoKKyAgICAgIHJldHVybiAncyc7CisgICAgY2FzZSAncyc6CisgICAgICByZXR1cm4gJ2knOworICAgIGNhc2UgJ2knOgorICAgICAgcmV0dXJuICdsJzsKKyAgICBkZWZhdWx0OiB0aHJvdyAidW5oYW5kbGVkIHR5cGUgaW4gd2lkZW4hIjsKKyAgfQorICByZXR1cm4gJ1wwJzsKK30KKworLy8vIE5hcnJvdyAtIENvbnZlcnQgYSB0eXBlIGNvZGUgaW50byB0aGUgbmV4dCBzbWFsbGVyIHR5cGUuICBzaG9ydCAtPiBjaGFyLAorLy8vIGZsb2F0IC0+IGhhbGYgZmxvYXQsIGV0Yy4KK3N0YXRpYyBjaGFyIE5hcnJvdyhjb25zdCBjaGFyIHQpIHsKKyAgc3dpdGNoICh0KSB7CisgICAgY2FzZSAncyc6CisgICAgICByZXR1cm4gJ2MnOworICAgIGNhc2UgJ2knOgorICAgICAgcmV0dXJuICdzJzsKKyAgICBjYXNlICdsJzoKKyAgICAgIHJldHVybiAnaSc7CisgICAgY2FzZSAnZic6CisgICAgICByZXR1cm4gJ2gnOworICAgIGRlZmF1bHQ6IHRocm93ICJ1bmhhbmRsZWQgdHlwZSBpbiB3aWRlbiEiOworICB9CisgIHJldHVybiAnXDAnOworfQorCisvLy8gRm9yIGEgcGFydGljdWxhciBTdHJpbmdSZWYsIHJldHVybiB0aGUgYmFzZSB0eXBlIGNvZGUsIGFuZCB3aGV0aGVyIGl0IGhhcworLy8vIHRoZSBxdWFkLXZlY3RvciwgcG9seW5vbWlhbCwgb3IgdW5zaWduZWQgbW9kaWZpZXJzIHNldC4KK3N0YXRpYyBjaGFyIENsYXNzaWZ5VHlwZShTdHJpbmdSZWYgdHksIGJvb2wgJnF1YWQsIGJvb2wgJnBvbHksIGJvb2wgJnVzZ24pIHsKKyAgdW5zaWduZWQgb2ZmID0gMDsKKyAgCisgIC8vIHJlbWVtYmVyIHF1YWQuCisgIGlmICh0eVtvZmZdID09ICdRJykgeworICAgIHF1YWQgPSB0cnVlOworICAgICsrb2ZmOworICB9CisgIAorICAvLyByZW1lbWJlciBwb2x5LgorICBpZiAodHlbb2ZmXSA9PSAnUCcpIHsKKyAgICBwb2x5ID0gdHJ1ZTsKKyAgICArK29mZjsKKyAgfQorICAKKyAgLy8gcmVtZW1iZXIgdW5zaWduZWQuCisgIGlmICh0eVtvZmZdID09ICdVJykgeworICAgIHVzZ24gPSB0cnVlOworICAgICsrb2ZmOworICB9CisgIAorICAvLyBiYXNlIHR5cGUgdG8gZ2V0IHRoZSB0eXBlIHN0cmluZyBmb3IuCisgIHJldHVybiB0eVtvZmZdOworfQorCisvLy8gTW9kVHlwZSAtIFRyYW5zZm9ybSBhIHR5cGUgY29kZSBhbmQgaXRzIG1vZGlmaWVycyBiYXNlZCBvbiBhIG1vZCBjb2RlLiBUaGUKKy8vLyBtb2QgY29kZSBkZWZpbml0aW9ucyBtYXkgYmUgZm91bmQgYXQgdGhlIHRvcCBvZiBhcm1fbmVvbi50ZC4KK3N0YXRpYyBjaGFyIE1vZFR5cGUoY29uc3QgY2hhciBtb2QsIGNoYXIgdHlwZSwgYm9vbCAmcXVhZCwgYm9vbCAmcG9seSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAmdXNnbiwgYm9vbCAmc2NhbCwgYm9vbCAmY25zdCwgYm9vbCAmcG50cikgeworICBzd2l0Y2ggKG1vZCkgeworICAgIGNhc2UgJ3QnOgorICAgICAgaWYgKHBvbHkpIHsKKyAgICAgICAgcG9seSA9IGZhbHNlOworICAgICAgICB1c2duID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3UnOgorICAgICAgdXNnbiA9IHRydWU7CisgICAgY2FzZSAneCc6CisgICAgICBwb2x5ID0gZmFsc2U7CisgICAgICBpZiAodHlwZSA9PSAnZicpCisgICAgICAgIHR5cGUgPSAnaSc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICAgIGlmICh0eXBlID09ICdoJykKKyAgICAgICAgcXVhZCA9IHRydWU7CisgICAgICB0eXBlID0gJ2YnOworICAgICAgdXNnbiA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CisgICAgICBxdWFkID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlICd3JzoKKyAgICAgIHR5cGUgPSBXaWRlbih0eXBlKTsKKyAgICAgIHF1YWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgICB0eXBlID0gV2lkZW4odHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoKKyAgICAgIHR5cGUgPSAnbCc7CisgICAgICBzY2FsID0gdHJ1ZTsKKyAgICAgIHVzZ24gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnYSc6CisgICAgICBzY2FsID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2snOgorICAgICAgcXVhZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICAgIGNuc3QgPSB0cnVlOworICAgIGNhc2UgJ3AnOgorICAgICAgcG50ciA9IHRydWU7CisgICAgICBzY2FsID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOgorICAgICAgdHlwZSA9IE5hcnJvdyh0eXBlKTsKKyAgICAgIGlmICh0eXBlID09ICdoJykKKyAgICAgICAgcXVhZCA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZSc6CisgICAgICB0eXBlID0gTmFycm93KHR5cGUpOworICAgICAgdXNnbiA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKKy8vLyBUeXBlU3RyaW5nIC0gZm9yIGEgbW9kaWZpZXIgYW5kIHR5cGUsIGdlbmVyYXRlIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIGZvcgorLy8vIHRoYXQgdHlwZS4gIElmIGdlbmVyaWMgaXMgdHJ1ZSwgZW1pdCB0aGUgZ2VuZXJpYyB2ZWN0b3IgdHlwZSByYXRoZXIgdGhhbgorLy8vIHRoZSBwdWJsaWMgTkVPTiB0eXBlLiBRVWMgLT4gdWludDh4OF90IC8gX19uZW9uX3VpbnQ4eDhfdC4KK3N0YXRpYyBzdGQ6OnN0cmluZyBUeXBlU3RyaW5nKGNvbnN0IGNoYXIgbW9kLCBTdHJpbmdSZWYgdHlwZXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuZXJpYyA9IGZhbHNlKSB7CisgIGJvb2wgcXVhZCA9IGZhbHNlOworICBib29sIHBvbHkgPSBmYWxzZTsKKyAgYm9vbCB1c2duID0gZmFsc2U7CisgIGJvb2wgc2NhbCA9IGZhbHNlOworICBib29sIGNuc3QgPSBmYWxzZTsKKyAgYm9vbCBwbnRyID0gZmFsc2U7CisgIAorICBpZiAobW9kID09ICd2JykKKyAgICByZXR1cm4gInZvaWQiOworICBpZiAobW9kID09ICdpJykKKyAgICByZXR1cm4gImludCI7CisgIAorICAvLyBiYXNlIHR5cGUgdG8gZ2V0IHRoZSB0eXBlIHN0cmluZyBmb3IuCisgIGNoYXIgdHlwZSA9IENsYXNzaWZ5VHlwZSh0eXBlc3RyLCBxdWFkLCBwb2x5LCB1c2duKTsKKyAgCisgIC8vIEJhc2VkIG9uIHRoZSBtb2RpZnlpbmcgY2hhcmFjdGVyLCBjaGFuZ2UgdGhlIHR5cGUgYW5kIHdpZHRoIGlmIG5lY2Vzc2FyeS4KKyAgdHlwZSA9IE1vZFR5cGUobW9kLCB0eXBlLCBxdWFkLCBwb2x5LCB1c2duLCBzY2FsLCBjbnN0LCBwbnRyKTsKKyAgCisgIFNtYWxsU3RyaW5nPDEyOD4gczsKKyAgCisgIGlmIChnZW5lcmljKQorICAgIHMgKz0gIl9fbmVvbl8iOworICAKKyAgaWYgKHVzZ24pCisgICAgcy5wdXNoX2JhY2soJ3UnKTsKKyAgCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgJ2MnOgorICAgICAgcyArPSBwb2x5ID8gInBvbHk4IiA6ICJpbnQ4IjsKKyAgICAgIGlmIChzY2FsKQorICAgICAgICBicmVhazsKKyAgICAgIHMgKz0gcXVhZCA/ICJ4MTYiIDogIng4IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgcyArPSBwb2x5ID8gInBvbHkxNiIgOiAiaW50MTYiOworICAgICAgaWYgKHNjYWwpCisgICAgICAgIGJyZWFrOworICAgICAgcyArPSBxdWFkID8gIng4IiA6ICJ4NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoKKyAgICAgIHMgKz0gImludDMyIjsKKyAgICAgIGlmIChzY2FsKQorICAgICAgICBicmVhazsKKyAgICAgIHMgKz0gcXVhZCA/ICJ4NCIgOiAieDIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICBzICs9ICJpbnQ2NCI7CisgICAgICBpZiAoc2NhbCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzICs9IHF1YWQgPyAieDIiIDogIngxIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOgorICAgICAgcyArPSAiZmxvYXQxNiI7CisgICAgICBpZiAoc2NhbCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzICs9IHF1YWQgPyAieDgiIDogIng0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2YnOgorICAgICAgcyArPSAiZmxvYXQzMiI7CisgICAgICBpZiAoc2NhbCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzICs9IHF1YWQgPyAieDQiIDogIngyIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAidW5oYW5kbGVkIHR5cGUhIjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG1vZCA9PSAnMicpCisgICAgcyArPSAieDIiOworICBpZiAobW9kID09ICczJykKKyAgICBzICs9ICJ4MyI7CisgIGlmIChtb2QgPT0gJzQnKQorICAgIHMgKz0gIng0IjsKKyAgCisgIC8vIEFwcGVuZCBfdCwgZmluaXNoaW5nIHRoZSB0eXBlIHN0cmluZyB0eXBlZGVmIHR5cGUuCisgIHMgKz0gIl90IjsKKyAgCisgIGlmIChjbnN0KQorICAgIHMgKz0gIiBjb25zdCI7CisgIAorICBpZiAocG50cikKKyAgICBzICs9ICIgKiI7CisgIAorICByZXR1cm4gcy5zdHIoKTsKK30KKworLy8vIEJ1aWx0aW5UeXBlU3RyaW5nIC0gZm9yIGEgbW9kaWZpZXIgYW5kIHR5cGUsIGdlbmVyYXRlIHRoZSBjbGFuZworLy8vIEJ1aWx0aW5zQVJNLmRlZiBwcm90b3R5cGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uLiAgU2VlIHRoZSB0b3Agb2YgY2xhbmcncworLy8vIEJ1aWx0aW5zLmRlZiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBzdHJpbmdzLgorc3RhdGljIHN0ZDo6c3RyaW5nIEJ1aWx0aW5UeXBlU3RyaW5nKGNvbnN0IGNoYXIgbW9kLCBTdHJpbmdSZWYgdHlwZXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0tpbmQgY2ssIGJvb2wgcmV0KSB7CisgIGJvb2wgcXVhZCA9IGZhbHNlOworICBib29sIHBvbHkgPSBmYWxzZTsKKyAgYm9vbCB1c2duID0gZmFsc2U7CisgIGJvb2wgc2NhbCA9IGZhbHNlOworICBib29sIGNuc3QgPSBmYWxzZTsKKyAgYm9vbCBwbnRyID0gZmFsc2U7CisgIAorICBpZiAobW9kID09ICd2JykKKyAgICByZXR1cm4gInYiOworICBpZiAobW9kID09ICdpJykKKyAgICByZXR1cm4gImkiOworICAKKyAgLy8gYmFzZSB0eXBlIHRvIGdldCB0aGUgdHlwZSBzdHJpbmcgZm9yLgorICBjaGFyIHR5cGUgPSBDbGFzc2lmeVR5cGUodHlwZXN0ciwgcXVhZCwgcG9seSwgdXNnbik7CisgIAorICAvLyBCYXNlZCBvbiB0aGUgbW9kaWZ5aW5nIGNoYXJhY3RlciwgY2hhbmdlIHRoZSB0eXBlIGFuZCB3aWR0aCBpZiBuZWNlc3NhcnkuCisgIHR5cGUgPSBNb2RUeXBlKG1vZCwgdHlwZSwgcXVhZCwgcG9seSwgdXNnbiwgc2NhbCwgY25zdCwgcG50cik7CisKKyAgaWYgKHBudHIpIHsKKyAgICB1c2duID0gZmFsc2U7CisgICAgcG9seSA9IGZhbHNlOworICAgIHR5cGUgPSAndic7CisgIH0KKyAgaWYgKHR5cGUgPT0gJ2gnKSB7CisgICAgdHlwZSA9ICdzJzsKKyAgICB1c2duID0gdHJ1ZTsKKyAgfQorICB1c2duID0gdXNnbiB8IHBvbHkgfCAoKGNrID09IENsYXNzSSB8fCBjayA9PSBDbGFzc1cpICYmIHNjYWwgJiYgdHlwZSAhPSAnZicpOworCisgIGlmIChzY2FsKSB7CisgICAgU21hbGxTdHJpbmc8MTI4PiBzOworCisgICAgaWYgKHVzZ24pCisgICAgICBzLnB1c2hfYmFjaygnVScpOworICAgIAorICAgIGlmICh0eXBlID09ICdsJykKKyAgICAgIHMgKz0gIkxMaSI7CisgICAgZWxzZQorICAgICAgcy5wdXNoX2JhY2sodHlwZSk7CisgCisgICAgaWYgKGNuc3QpCisgICAgICBzLnB1c2hfYmFjaygnQycpOworICAgIGlmIChwbnRyKQorICAgICAgcy5wdXNoX2JhY2soJyonKTsKKyAgICByZXR1cm4gcy5zdHIoKTsKKyAgfQorCisgIC8vIFNpbmNlIHRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBvbmUgdHlwZSwgcmV0dXJuIGEgdmVjdG9yIHR5cGUgb2YgdGhlCisgIC8vIGFwcHJvcHJpYXRlIHdpZHRoIHdoaWNoIHdlIHdpbGwgYml0Y2FzdC4gIEFuIGV4Y2VwdGlvbiBpcyBtYWRlIGZvcgorICAvLyByZXR1cm5pbmcgc3RydWN0cyBvZiAyLCAzLCBvciA0IHZlY3RvcnMgd2hpY2ggYXJlIHJldHVybmVkIGluIGEgc3JldC1saWtlCisgIC8vIGZhc2hpb24sIHN0b3JpbmcgdGhlbSB0byBhIHBvaW50ZXIgYXJnLgorICBpZiAocmV0KSB7CisgICAgaWYgKG1vZCA9PSAnMicgfHwgbW9kID09ICczJyB8fCBtb2QgPT0gJzQnKQorICAgICAgcmV0dXJuICJ2dioiOworICAgIGlmIChtb2QgPT0gJ2YnIHx8IChjayAhPSBDbGFzc0IgJiYgdHlwZSA9PSAnZicpKQorICAgICAgcmV0dXJuIHF1YWQgPyAiVjRmIiA6ICJWMmYiOworICAgIGlmIChjayAhPSBDbGFzc0IgJiYgdHlwZSA9PSAncycpCisgICAgICByZXR1cm4gcXVhZCA/ICJWOHMiIDogIlY0cyI7CisgICAgaWYgKGNrICE9IENsYXNzQiAmJiB0eXBlID09ICdpJykKKyAgICAgIHJldHVybiBxdWFkID8gIlY0aSIgOiAiVjJpIjsKKyAgICBpZiAoY2sgIT0gQ2xhc3NCICYmIHR5cGUgPT0gJ2wnKQorICAgICAgcmV0dXJuIHF1YWQgPyAiVjJMTGkiIDogIlYxTExpIjsKKyAgICAKKyAgICByZXR1cm4gcXVhZCA/ICJWMTZjIiA6ICJWOGMiOworICB9ICAgIAorCisgIC8vIE5vbi1yZXR1cm4gYXJyYXkgdHlwZXMgYXJlIHBhc3NlZCBhcyBpbmRpdmlkdWFsIHZlY3RvcnMuCisgIGlmIChtb2QgPT0gJzInKQorICAgIHJldHVybiBxdWFkID8gIlYxNmNWMTZjIiA6ICJWOGNWOGMiOworICBpZiAobW9kID09ICczJykKKyAgICByZXR1cm4gcXVhZCA/ICJWMTZjVjE2Y1YxNmMiIDogIlY4Y1Y4Y1Y4YyI7CisgIGlmIChtb2QgPT0gJzQnKQorICAgIHJldHVybiBxdWFkID8gIlYxNmNWMTZjVjE2Y1YxNmMiIDogIlY4Y1Y4Y1Y4Y1Y4YyI7CisKKyAgaWYgKG1vZCA9PSAnZicgfHwgKGNrICE9IENsYXNzQiAmJiB0eXBlID09ICdmJykpCisgICAgcmV0dXJuIHF1YWQgPyAiVjRmIiA6ICJWMmYiOworICBpZiAoY2sgIT0gQ2xhc3NCICYmIHR5cGUgPT0gJ3MnKQorICAgIHJldHVybiBxdWFkID8gIlY4cyIgOiAiVjRzIjsKKyAgaWYgKGNrICE9IENsYXNzQiAmJiB0eXBlID09ICdpJykKKyAgICByZXR1cm4gcXVhZCA/ICJWNGkiIDogIlYyaSI7CisgIGlmIChjayAhPSBDbGFzc0IgJiYgdHlwZSA9PSAnbCcpCisgICAgcmV0dXJuIHF1YWQgPyAiVjJMTGkiIDogIlYxTExpIjsKKyAgCisgIHJldHVybiBxdWFkID8gIlYxNmMiIDogIlY4YyI7Cit9CisKKy8vLyBTdHJ1Y3RUYWcgLSBnZW5lcmF0ZSB0aGUgbmFtZSBvZiB0aGUgc3RydWN0IHRhZyBmb3IgYSB0eXBlLgorLy8vIFRoZXNlIG5hbWVzIGFyZSBtYW5kYXRlZCBieSBBUk0ncyBBQkkuCitzdGF0aWMgc3RkOjpzdHJpbmcgU3RydWN0VGFnKFN0cmluZ1JlZiB0eXBlc3RyKSB7CisgIGJvb2wgcXVhZCA9IGZhbHNlOworICBib29sIHBvbHkgPSBmYWxzZTsKKyAgYm9vbCB1c2duID0gZmFsc2U7CisgIAorICAvLyBiYXNlIHR5cGUgdG8gZ2V0IHRoZSB0eXBlIHN0cmluZyBmb3IuCisgIGNoYXIgdHlwZSA9IENsYXNzaWZ5VHlwZSh0eXBlc3RyLCBxdWFkLCBwb2x5LCB1c2duKTsKKyAgCisgIFNtYWxsU3RyaW5nPDEyOD4gczsKKyAgcyArPSAiX19zaW1kIjsKKyAgcyArPSBxdWFkID8gIjEyOF8iIDogIjY0XyI7CisgIGlmICh1c2duKQorICAgIHMucHVzaF9iYWNrKCd1Jyk7CisgIAorICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlICdjJzoKKyAgICAgIHMgKz0gcG9seSA/ICJwb2x5OCIgOiAiaW50OCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgIHMgKz0gcG9seSA/ICJwb2x5MTYiIDogImludDE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgcyArPSAiaW50MzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICBzICs9ICJpbnQ2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoKKyAgICAgIHMgKz0gImZsb2F0MTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZic6CisgICAgICBzICs9ICJmbG9hdDMyIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAidW5oYW5kbGVkIHR5cGUhIjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLy8gQXBwZW5kIF90LCBmaW5pc2hpbmcgdGhlIHN0cnVjdCB0YWcgbmFtZS4KKyAgcyArPSAiX3QiOworICAKKyAgcmV0dXJuIHMuc3RyKCk7Cit9CisKKy8vLyBNYW5nbGVOYW1lIC0gQXBwZW5kIGEgdHlwZSBvciB3aWR0aCBzdWZmaXggdG8gYSBiYXNlIG5lb24gZnVuY3Rpb24gbmFtZSwgCisvLy8gYW5kIGluc2VydCBhICdxJyBpbiB0aGUgYXBwcm9wcmlhdGUgbG9jYXRpb24gaWYgdGhlIG9wZXJhdGlvbiB3b3JrcyBvbgorLy8vIDEyOGIgcmF0aGVyIHRoYW4gNjRiLiAgIEUuZy4gdHVybiAidnN0Ml9sYW5lIiBpbnRvICJ2c3QycV9sYW5lX2YzMiIsIGV0Yy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBNYW5nbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBTdHJpbmdSZWYgdHlwZXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzS2luZCBjaykgeworICBpZiAobmFtZSA9PSAidmN2dF9mMzJfZjE2IikKKyAgICByZXR1cm4gbmFtZTsKKyAgCisgIGJvb2wgcXVhZCA9IGZhbHNlOworICBib29sIHBvbHkgPSBmYWxzZTsKKyAgYm9vbCB1c2duID0gZmFsc2U7CisgIGNoYXIgdHlwZSA9IENsYXNzaWZ5VHlwZSh0eXBlc3RyLCBxdWFkLCBwb2x5LCB1c2duKTsKKworICBzdGQ6OnN0cmluZyBzID0gbmFtZTsKKyAgCisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlICdjJzoKKyAgICBzd2l0Y2ggKGNrKSB7CisgICAgY2FzZSBDbGFzc1M6IHMgKz0gcG9seSA/ICJfcDgiIDogdXNnbiA/ICJfdTgiIDogIl9zOCI7IGJyZWFrOworICAgIGNhc2UgQ2xhc3NJOiBzICs9ICJfaTgiOyBicmVhazsKKyAgICBjYXNlIENsYXNzVzogcyArPSAiXzgiOyBicmVhazsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgJ3MnOgorICAgIHN3aXRjaCAoY2spIHsKKyAgICBjYXNlIENsYXNzUzogcyArPSBwb2x5ID8gIl9wMTYiIDogdXNnbiA/ICJfdTE2IiA6ICJfczE2IjsgYnJlYWs7CisgICAgY2FzZSBDbGFzc0k6IHMgKz0gIl9pMTYiOyBicmVhazsKKyAgICBjYXNlIENsYXNzVzogcyArPSAiXzE2IjsgYnJlYWs7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlICdpJzoKKyAgICBzd2l0Y2ggKGNrKSB7CisgICAgY2FzZSBDbGFzc1M6IHMgKz0gdXNnbiA/ICJfdTMyIiA6ICJfczMyIjsgYnJlYWs7CisgICAgY2FzZSBDbGFzc0k6IHMgKz0gIl9pMzIiOyBicmVhazsKKyAgICBjYXNlIENsYXNzVzogcyArPSAiXzMyIjsgYnJlYWs7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlICdsJzoKKyAgICBzd2l0Y2ggKGNrKSB7CisgICAgY2FzZSBDbGFzc1M6IHMgKz0gdXNnbiA/ICJfdTY0IiA6ICJfczY0IjsgYnJlYWs7CisgICAgY2FzZSBDbGFzc0k6IHMgKz0gIl9pNjQiOyBicmVhazsKKyAgICBjYXNlIENsYXNzVzogcyArPSAiXzY0IjsgYnJlYWs7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlICdoJzoKKyAgICBzd2l0Y2ggKGNrKSB7CisgICAgY2FzZSBDbGFzc1M6CisgICAgY2FzZSBDbGFzc0k6IHMgKz0gIl9mMTYiOyBicmVhazsKKyAgICBjYXNlIENsYXNzVzogcyArPSAiXzE2IjsgYnJlYWs7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlICdmJzoKKyAgICBzd2l0Y2ggKGNrKSB7CisgICAgY2FzZSBDbGFzc1M6CisgICAgY2FzZSBDbGFzc0k6IHMgKz0gIl9mMzIiOyBicmVhazsKKyAgICBjYXNlIENsYXNzVzogcyArPSAiXzMyIjsgYnJlYWs7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHRocm93ICJ1bmhhbmRsZWQgdHlwZSEiOworICAgIGJyZWFrOworICB9CisgIGlmIChjayA9PSBDbGFzc0IpCisgICAgcyArPSAiX3YiOworICAgIAorICAvLyBJbnNlcnQgYSAncScgYmVmb3JlIHRoZSBmaXJzdCAnXycgY2hhcmFjdGVyIHNvIHRoYXQgaXQgZW5kcyB1cCBiZWZvcmUgCisgIC8vIF9sYW5lIG9yIF9uIG9uIHZlY3Rvci1zY2FsYXIgb3BlcmF0aW9ucy4KKyAgaWYgKHF1YWQpIHsKKyAgICBzaXplX3QgcG9zID0gcy5maW5kKCdfJyk7CisgICAgcyA9IHMuaW5zZXJ0KHBvcywgInEiKTsKKyAgfQorICByZXR1cm4gczsKK30KKworLy8gR2VuZXJhdGUgdGhlIHN0cmluZyAiKGFyZ3R5cGUgYSwgYXJndHlwZSBiLCAuLi4pIgorc3RhdGljIHN0ZDo6c3RyaW5nIEdlbkFyZ3MoY29uc3Qgc3RkOjpzdHJpbmcgJnByb3RvLCBTdHJpbmdSZWYgdHlwZXN0cikgeworICBib29sIGRlZmluZSA9IHByb3RvLmZpbmQoJ2knKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgY2hhciBhcmcgPSAnYSc7CisgIAorICBzdGQ6OnN0cmluZyBzOworICBzICs9ICIoIjsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBwcm90by5zaXplKCk7IGkgIT0gZTsgKytpLCArK2FyZykgeworICAgIGlmICghZGVmaW5lKSB7CisgICAgICBzICs9IFR5cGVTdHJpbmcocHJvdG9baV0sIHR5cGVzdHIpOworICAgICAgcy5wdXNoX2JhY2soJyAnKTsKKyAgICB9CisgICAgcy5wdXNoX2JhY2soYXJnKTsKKyAgICBpZiAoKGkgKyAxKSA8IGUpCisgICAgICBzICs9ICIsICI7CisgIH0KKyAgCisgIHMgKz0gIikiOworICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIER1cGxpY2F0ZSh1bnNpZ25lZCBuRWx0cywgU3RyaW5nUmVmIHR5cGVzdHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmYSkgeworICBzdGQ6OnN0cmluZyBzOworICAKKyAgcyA9ICIoX19uZW9uXyIgKyBUeXBlU3RyaW5nKCdkJywgdHlwZXN0cikgKyAiKXsgIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBuRWx0czsgKytpKSB7CisgICAgcyArPSBhOworICAgIGlmICgoaSArIDEpIDwgbkVsdHMpCisgICAgICBzICs9ICIsICI7CisgIH0KKyAgcyArPSAiIH0iOworICAKKyAgcmV0dXJuIHM7Cit9CisKKy8vIEdlbmVyYXRlIHRoZSBkZWZpbml0aW9uIGZvciB0aGlzIGludHJpbnNpYywgZS5nLiAiYSArIGIiIGZvciBPcEFkZC4KKy8vIElmIHN0cnVjdFR5cGVzIGlzIHRydWUsIHRoZSBORU9OIHR5cGVzIGFyZSBzdHJ1Y3RzIG9mIHZlY3RvciB0eXBlcyByYXRoZXIKKy8vIHRoYW4gdmVjdG9yIHR5cGVzLCBhbmQgdGhlIGNhbGwgYmVjb21lcyAiYS52YWwgKyBiLnZhbCIKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZW5PcFN0cmluZyhPcEtpbmQgb3AsIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgdHlwZXN0ciwgYm9vbCBzdHJ1Y3RUeXBlcyA9IHRydWUpIHsKKyAgYm9vbCBkdW1teSwgcXVhZCA9IGZhbHNlOworICBjaGFyIHR5cGUgPSBDbGFzc2lmeVR5cGUodHlwZXN0ciwgcXVhZCwgZHVtbXksIGR1bW15KTsKKyAgdW5zaWduZWQgbkVsdHMgPSAwOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlICdjJzogbkVsdHMgPSA4OyBicmVhazsKKyAgICBjYXNlICdzJzogbkVsdHMgPSA0OyBicmVhazsKKyAgICBjYXNlICdpJzogbkVsdHMgPSAyOyBicmVhazsKKyAgICBjYXNlICdsJzogbkVsdHMgPSAxOyBicmVhazsKKyAgICBjYXNlICdoJzogbkVsdHMgPSA0OyBicmVhazsKKyAgICBjYXNlICdmJzogbkVsdHMgPSAyOyBicmVhazsKKyAgfQorICAKKyAgc3RkOjpzdHJpbmcgdHMgPSBUeXBlU3RyaW5nKHByb3RvWzBdLCB0eXBlc3RyKTsKKyAgc3RkOjpzdHJpbmcgcyA9IHRzICsgIiByOyByIjsKKyAgCisgIGlmIChzdHJ1Y3RUeXBlcykKKyAgICBzICs9ICIudmFsIjsKKyAgCisgIHMgKz0gIiA9ICI7CisKKyAgc3RkOjpzdHJpbmcgYSwgYiwgYzsKKyAgaWYgKHByb3RvLnNpemUoKSA+IDEpCisgICAgYSA9IChzdHJ1Y3RUeXBlcyAmJiBwcm90b1sxXSAhPSAnbCcgJiYgcHJvdG9bMV0gIT0gJ3MnKSA/ICJhLnZhbCIgOiAiYSI7CisgIGIgPSBzdHJ1Y3RUeXBlcyA/ICJiLnZhbCIgOiAiYiI7CisgIGMgPSBzdHJ1Y3RUeXBlcyA/ICJjLnZhbCIgOiAiYyI7CisgIAorICBzd2l0Y2gob3ApIHsKKyAgY2FzZSBPcEFkZDoKKyAgICBzICs9IGEgKyAiICsgIiArIGI7CisgICAgYnJlYWs7CisgIGNhc2UgT3BTdWI6CisgICAgcyArPSBhICsgIiAtICIgKyBiOworICAgIGJyZWFrOworICBjYXNlIE9wTXVsTjoKKyAgICBiID0gRHVwbGljYXRlKG5FbHRzIDw8IChpbnQpcXVhZCwgdHlwZXN0ciwgImIiKTsKKyAgY2FzZSBPcE11bDoKKyAgICBzICs9IGEgKyAiICogIiArIGI7CisgICAgYnJlYWs7CisgIGNhc2UgT3BNbGFOOgorICAgIGMgPSBEdXBsaWNhdGUobkVsdHMgPDwgKGludClxdWFkLCB0eXBlc3RyLCAiYyIpOworICBjYXNlIE9wTWxhOgorICAgIHMgKz0gYSArICIgKyAoICIgKyBiICsgIiAqICIgKyBjICsgIiApIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcE1sc046CisgICAgYyA9IER1cGxpY2F0ZShuRWx0cyA8PCAoaW50KXF1YWQsIHR5cGVzdHIsICJjIik7CisgIGNhc2UgT3BNbHM6CisgICAgcyArPSBhICsgIiAtICggIiArIGIgKyAiICogIiArIGMgKyAiICkiOworICAgIGJyZWFrOworICBjYXNlIE9wRXE6CisgICAgcyArPSAiKF9fbmVvbl8iICsgdHMgKyAiKSgiICsgYSArICIgPT0gIiArIGIgKyAiKSI7CisgICAgYnJlYWs7CisgIGNhc2UgT3BHZToKKyAgICBzICs9ICIoX19uZW9uXyIgKyB0cyArICIpKCIgKyBhICsgIiA+PSAiICsgYiArICIpIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcExlOgorICAgIHMgKz0gIihfX25lb25fIiArIHRzICsgIikoIiArIGEgKyAiIDw9ICIgKyBiICsgIikiOworICAgIGJyZWFrOworICBjYXNlIE9wR3Q6CisgICAgcyArPSAiKF9fbmVvbl8iICsgdHMgKyAiKSgiICsgYSArICIgPiAiICsgYiArICIpIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcEx0OgorICAgIHMgKz0gIihfX25lb25fIiArIHRzICsgIikoIiArIGEgKyAiIDwgIiArIGIgKyAiKSI7CisgICAgYnJlYWs7CisgIGNhc2UgT3BOZWc6CisgICAgcyArPSAiIC0iICsgYTsKKyAgICBicmVhazsKKyAgY2FzZSBPcE5vdDoKKyAgICBzICs9ICIgfiIgKyBhOworICAgIGJyZWFrOworICBjYXNlIE9wQW5kOgorICAgIHMgKz0gYSArICIgJiAiICsgYjsKKyAgICBicmVhazsKKyAgY2FzZSBPcE9yOgorICAgIHMgKz0gYSArICIgfCAiICsgYjsKKyAgICBicmVhazsKKyAgY2FzZSBPcFhvcjoKKyAgICBzICs9IGEgKyAiIF4gIiArIGI7CisgICAgYnJlYWs7CisgIGNhc2UgT3BBbmROb3Q6CisgICAgcyArPSBhICsgIiAmIH4iICsgYjsKKyAgICBicmVhazsKKyAgY2FzZSBPcE9yTm90OgorICAgIHMgKz0gYSArICIgfCB+IiArIGI7CisgICAgYnJlYWs7CisgIGNhc2UgT3BDYXN0OgorICAgIHMgKz0gIihfX25lb25fIiArIHRzICsgIikiICsgYTsKKyAgICBicmVhazsKKyAgY2FzZSBPcENvbmNhdDoKKyAgICBzICs9ICJfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX19uZW9uX2ludDY0eDFfdCkiICsgYTsKKyAgICBzICs9ICIsIChfX25lb25faW50NjR4MV90KSIgKyBiICsgIiwgMCwgMSkiOworICAgIGJyZWFrOworICBjYXNlIE9wSGk6CisgICAgcyArPSAiKF9fbmVvbl9pbnQ2NHgxX3QpKCgoX19uZW9uX2ludDY0eDJfdCkiICsgYSArICIpWzFdKSI7CisgICAgYnJlYWs7CisgIGNhc2UgT3BMbzoKKyAgICBzICs9ICIoX19uZW9uX2ludDY0eDFfdCkoKChfX25lb25faW50NjR4Ml90KSIgKyBhICsgIilbMF0pIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcER1cDoKKyAgICBzICs9IER1cGxpY2F0ZShuRWx0cyA8PCAoaW50KXF1YWQsIHR5cGVzdHIsIGEpOworICAgIGJyZWFrOworICBjYXNlIE9wU2VsZWN0OgorICAgIC8vICgoMCAmIDEpIHwgKH4wICYgMikpCisgICAgdHMgPSBUeXBlU3RyaW5nKHByb3RvWzFdLCB0eXBlc3RyKTsKKyAgICBzICs9ICIoICIgKyBhICsgIiAmIChfX25lb25fIiArIHRzICsgIikiICsgYiArICIpIHwgIjsKKyAgICBzICs9ICIofiIgKyBhICsgIiAmIChfX25lb25fIiArIHRzICsgIikiICsgYyArICIpIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcFJldjE2OgorICAgIHMgKz0gIl9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKCIgKyBhICsgIiwgIiArIGE7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMjsgaSA8PSBuRWx0cyA8PCAoaW50KXF1YWQ7IGkgKz0gMikKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gMjsgKytqKQorICAgICAgICBzICs9ICIsICIgKyB1dG9zdHIoaSAtIGogLSAxKTsKKyAgICBzICs9ICIpIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcFJldjMyOgorICAgIG5FbHRzID4+PSAxOworICAgIHMgKz0gIl9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKCIgKyBhICsgIiwgIiArIGE7CisgICAgZm9yICh1bnNpZ25lZCBpID0gbkVsdHM7IGkgPD0gbkVsdHMgPDwgKDEgKyAoaW50KXF1YWQpOyBpICs9IG5FbHRzKQorICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiAhPSBuRWx0czsgKytqKQorICAgICAgICBzICs9ICIsICIgKyB1dG9zdHIoaSAtIGogLSAxKTsKKyAgICBzICs9ICIpIjsKKyAgICBicmVhazsKKyAgY2FzZSBPcFJldjY0OgorICAgIHMgKz0gIl9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKCIgKyBhICsgIiwgIiArIGE7CisgICAgZm9yICh1bnNpZ25lZCBpID0gbkVsdHM7IGkgPD0gbkVsdHMgPDwgKGludClxdWFkOyBpICs9IG5FbHRzKQorICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiAhPSBuRWx0czsgKytqKQorICAgICAgICBzICs9ICIsICIgKyB1dG9zdHIoaSAtIGogLSAxKTsKKyAgICBzICs9ICIpIjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAidW5rbm93biBPcEtpbmQhIjsKKyAgICBicmVhazsKKyAgfQorICBzICs9ICI7IHJldHVybiByOyI7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgdW5zaWduZWQgR2V0TmVvbkVudW0oY29uc3Qgc3RkOjpzdHJpbmcgJnByb3RvLCBTdHJpbmdSZWYgdHlwZXN0cikgeworICB1bnNpZ25lZCBtb2QgPSBwcm90b1swXTsKKyAgdW5zaWduZWQgcmV0ID0gMDsKKworICBpZiAobW9kID09ICd2JyB8fCBtb2QgPT0gJ2YnKQorICAgIG1vZCA9IHByb3RvWzFdOworCisgIGJvb2wgcXVhZCA9IGZhbHNlOworICBib29sIHBvbHkgPSBmYWxzZTsKKyAgYm9vbCB1c2duID0gZmFsc2U7CisgIGJvb2wgc2NhbCA9IGZhbHNlOworICBib29sIGNuc3QgPSBmYWxzZTsKKyAgYm9vbCBwbnRyID0gZmFsc2U7CisgIAorICAvLyBCYXNlIHR5cGUgdG8gZ2V0IHRoZSB0eXBlIHN0cmluZyBmb3IuCisgIGNoYXIgdHlwZSA9IENsYXNzaWZ5VHlwZSh0eXBlc3RyLCBxdWFkLCBwb2x5LCB1c2duKTsKKyAgCisgIC8vIEJhc2VkIG9uIHRoZSBtb2RpZnlpbmcgY2hhcmFjdGVyLCBjaGFuZ2UgdGhlIHR5cGUgYW5kIHdpZHRoIGlmIG5lY2Vzc2FyeS4KKyAgdHlwZSA9IE1vZFR5cGUobW9kLCB0eXBlLCBxdWFkLCBwb2x5LCB1c2duLCBzY2FsLCBjbnN0LCBwbnRyKTsKKworICBpZiAodXNnbikKKyAgICByZXQgfD0gMHgwODsKKyAgaWYgKHF1YWQgJiYgcHJvdG9bMV0gIT0gJ2cnKQorICAgIHJldCB8PSAweDEwOworICAKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAnYyc6IAorICAgICAgcmV0IHw9IHBvbHkgPyA1IDogMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgcmV0IHw9IHBvbHkgPyA2IDogMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgcmV0IHw9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoKKyAgICAgIHJldCB8PSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6CisgICAgICByZXQgfD0gNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2YnOgorICAgICAgcmV0IHw9IDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgInVuaGFuZGxlZCB0eXBlISI7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvLyBHZW5lcmF0ZSB0aGUgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRyaW5zaWMsIGUuZy4gX19idWlsdGluX25lb25fY2xzKGEpCisvLyBJZiBzdHJ1Y3RUeXBlcyBpcyB0cnVlLCB0aGUgTkVPTiB0eXBlcyBhcmUgc3RydWN0cyBvZiB2ZWN0b3IgdHlwZXMgcmF0aGVyCisvLyB0aGFuIHZlY3RvciB0eXBlcywgYW5kIHRoZSBjYWxsIGJlY29tZXMgX19idWlsdGluX25lb25fY2xzKGEudmFsKQorc3RhdGljIHN0ZDo6c3RyaW5nIEdlbkJ1aWx0aW4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiB0eXBlc3RyLCBDbGFzc0tpbmQgY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cnVjdFR5cGVzID0gdHJ1ZSkgeworICBib29sIGR1bW15LCBxdWFkID0gZmFsc2U7CisgIGNoYXIgdHlwZSA9IENsYXNzaWZ5VHlwZSh0eXBlc3RyLCBxdWFkLCBkdW1teSwgZHVtbXkpOworICB1bnNpZ25lZCBuRWx0cyA9IDA7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgJ2MnOiBuRWx0cyA9IDg7IGJyZWFrOworICAgIGNhc2UgJ3MnOiBuRWx0cyA9IDQ7IGJyZWFrOworICAgIGNhc2UgJ2knOiBuRWx0cyA9IDI7IGJyZWFrOworICAgIGNhc2UgJ2wnOiBuRWx0cyA9IDE7IGJyZWFrOworICAgIGNhc2UgJ2gnOiBuRWx0cyA9IDQ7IGJyZWFrOworICAgIGNhc2UgJ2YnOiBuRWx0cyA9IDI7IGJyZWFrOworICB9CisgIGlmIChxdWFkKSBuRWx0cyA8PD0gMTsKKworICBjaGFyIGFyZyA9ICdhJzsKKyAgc3RkOjpzdHJpbmcgczsKKworICAvLyBJZiB0aGlzIGJ1aWx0aW4gcmV0dXJucyBhIHN0cnVjdCAyLCAzLCBvciA0IHZlY3RvcnMsIHBhc3MgaXQgYXMgYW4gaW1wbGljaXQKKyAgLy8gc3JldC1saWtlIGFyZ3VtZW50LgorICBib29sIHNyZXQgPSAocHJvdG9bMF0gPT0gJzInIHx8IHByb3RvWzBdID09ICczJyB8fCBwcm90b1swXSA9PSAnNCcpOworCisgIC8vIElmIHRoaXMgYnVpbHRpbiB0YWtlcyBhbiBpbW1lZGlhdGUgYXJndW1lbnQsIHdlIG5lZWQgdG8gI2RlZmluZSBpdCByYXRoZXIKKyAgLy8gdGhhbiB1c2UgYSBzdGFuZGFyZCBkZWNsYXJhdGlvbiwgc28gdGhhdCBTZW1hQ2hlY2tpbmcgY2FuIHJhbmdlIGNoZWNrCisgIC8vIHRoZSBpbW1lZGlhdGUgcGFzc2VkIGJ5IHRoZSB1c2VyLgorICBib29sIGRlZmluZSA9IHByb3RvLmZpbmQoJ2knKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKworICAvLyBJZiBhbGwgdHlwZXMgYXJlIHRoZSBzYW1lIHNpemUsIGJpdGNhc3RpbmcgdGhlIGFyZ3Mgd2lsbCB0YWtlIGNhcmUgCisgIC8vIG9mIGFyZyBjaGVja2luZy4gIFRoZSBhY3R1YWwgc2lnbmVkbmVzcyBldGMuIHdpbGwgYmUgdGFrZW4gY2FyZSBvZiB3aXRoCisgIC8vIHNwZWNpYWwgZW51bXMuCisgIGlmIChwcm90by5maW5kKCdzJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgY2sgPSBDbGFzc0I7CisKKyAgaWYgKHByb3RvWzBdICE9ICd2JykgeworICAgIHN0ZDo6c3RyaW5nIHRzID0gVHlwZVN0cmluZyhwcm90b1swXSwgdHlwZXN0cik7CisgICAgCisgICAgaWYgKGRlZmluZSkgeworICAgICAgaWYgKHNyZXQpCisgICAgICAgIHMgKz0gIih7ICIgKyB0cyArICIgcjsgIjsKKyAgICAgIGVsc2UgaWYgKHByb3RvWzBdICE9ICdzJykKKyAgICAgICAgcyArPSAiKCIgKyB0cyArICIpeyhfX25lb25fIiArIHRzICsgIikiOworICAgIH0gZWxzZSBpZiAoc3JldCkgeworICAgICAgcyArPSB0cyArICIgcjsgIjsKKyAgICB9IGVsc2UgeworICAgICAgcyArPSB0cyArICIgcjsgciI7CisgICAgICBpZiAoc3RydWN0VHlwZXMgJiYgcHJvdG9bMF0gIT0gJ3MnICYmIHByb3RvWzBdICE9ICdpJyAmJiBwcm90b1swXSAhPSAnbCcpCisgICAgICAgIHMgKz0gIi52YWwiOworICAgICAgCisgICAgICBzICs9ICIgPSAiOworICAgIH0KKyAgfQorICAKKyAgYm9vbCBzcGxhdCA9IHByb3RvLmZpbmQoJ2EnKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgCisgIHMgKz0gIl9fYnVpbHRpbl9uZW9uXyI7CisgIGlmIChzcGxhdCkgeworICAgIHN0ZDo6c3RyaW5nIHZuYW1lKG5hbWUsIDAsIG5hbWUuc2l6ZSgpLTIpOworICAgIHMgKz0gTWFuZ2xlTmFtZSh2bmFtZSwgdHlwZXN0ciwgY2spOworICB9IGVsc2UgeworICAgIHMgKz0gTWFuZ2xlTmFtZShuYW1lLCB0eXBlc3RyLCBjayk7CisgIH0KKyAgcyArPSAiKCI7CisKKyAgLy8gUGFzcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmV0dXJuIHZhcmlhYmxlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzcmV0LWxpa2UKKyAgLy8gYnVpbHRpbnMuCisgIGlmIChzcmV0KQorICAgIHMgKz0gIiZyLCAiOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IHByb3RvLnNpemUoKTsgaSAhPSBlOyArK2ksICsrYXJnKSB7CisgICAgc3RkOjpzdHJpbmcgYXJncyA9IHN0ZDo6c3RyaW5nKCZhcmcsIDEpOworICAgIGlmIChkZWZpbmUpCisgICAgICBhcmdzID0gIigiICsgYXJncyArICIpIjsKKyAgICAKKyAgICAvLyBIYW5kbGUgbXVsdGlwbGUtdmVjdG9yIHZhbHVlcyBzcGVjaWFsbHksIGVtaXR0aW5nIGVhY2ggc3VidmVjdG9yIGFzIGFuCisgICAgLy8gYXJndW1lbnQgdG8gdGhlIF9fYnVpbHRpbi4KKyAgICBpZiAoc3RydWN0VHlwZXMgJiYgKHByb3RvW2ldID09ICcyJyB8fCBwcm90b1tpXSA9PSAnMycgfHwgcHJvdG9baV0gPT0gJzQnKSl7CisgICAgICBmb3IgKHVuc2lnbmVkIHZpID0gMCwgdmUgPSBwcm90b1tpXSAtICcwJzsgdmkgIT0gdmU7ICsrdmkpIHsKKyAgICAgICAgcyArPSBhcmdzICsgIi52YWxbIiArIHV0b3N0cih2aSkgKyAiXS52YWwiOworICAgICAgICBpZiAoKHZpICsgMSkgPCB2ZSkKKyAgICAgICAgICBzICs9ICIsICI7CisgICAgICB9CisgICAgICBpZiAoKGkgKyAxKSA8IGUpCisgICAgICAgIHMgKz0gIiwgIjsKKworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIGlmIChzcGxhdCAmJiAoaSArIDEpID09IGUpIAorICAgICAgcyArPSBEdXBsaWNhdGUobkVsdHMsIHR5cGVzdHIsIGFyZ3MpOworICAgIGVsc2UKKyAgICAgIHMgKz0gYXJnczsKKyAgICAKKyAgICBpZiAoc3RydWN0VHlwZXMgJiYgcHJvdG9baV0gIT0gJ3MnICYmIHByb3RvW2ldICE9ICdpJyAmJiBwcm90b1tpXSAhPSAnbCcgJiYKKyAgICAgICAgcHJvdG9baV0gIT0gJ3AnICYmIHByb3RvW2ldICE9ICdjJyAmJiBwcm90b1tpXSAhPSAnYScpIHsKKyAgICAgIHMgKz0gIi52YWwiOworICAgIH0KKyAgICBpZiAoKGkgKyAxKSA8IGUpCisgICAgICBzICs9ICIsICI7CisgIH0KKyAgCisgIC8vIEV4dHJhIGNvbnN0YW50IGludGVnZXIgdG8gaG9sZCB0eXBlIGNsYXNzIGVudW0gZm9yIHRoaXMgZnVuY3Rpb24sIGUuZy4gczgKKyAgaWYgKGNrID09IENsYXNzQikKKyAgICBzICs9ICIsICIgKyB1dG9zdHIoR2V0TmVvbkVudW0ocHJvdG8sIHR5cGVzdHIpKTsKKyAgCisgIGlmIChkZWZpbmUpCisgICAgcyArPSAiKSI7CisgIGVsc2UKKyAgICBzICs9ICIpOyI7CisKKyAgaWYgKHByb3RvWzBdICE9ICd2JykgeworICAgIGlmIChkZWZpbmUpIHsKKyAgICAgIGlmIChzcmV0KQorICAgICAgICBzICs9ICI7IHI7IH0pIjsKKyAgICAgIGVsc2UgaWYgKHByb3RvWzBdICE9ICdzJykKKyAgICAgICAgcyArPSAifSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHMgKz0gIiByZXR1cm4gcjsiOworICAgIH0KKyAgfQorICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIEdlbkJ1aWx0aW5EZWYoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIHR5cGVzdHIsIENsYXNzS2luZCBjaykgeworICBzdGQ6OnN0cmluZyBzKCJCVUlMVElOKF9fYnVpbHRpbl9uZW9uXyIpOworCisgIC8vIElmIGFsbCB0eXBlcyBhcmUgdGhlIHNhbWUgc2l6ZSwgYml0Y2FzdGluZyB0aGUgYXJncyB3aWxsIHRha2UgY2FyZSAKKyAgLy8gb2YgYXJnIGNoZWNraW5nLiAgVGhlIGFjdHVhbCBzaWduZWRuZXNzIGV0Yy4gd2lsbCBiZSB0YWtlbiBjYXJlIG9mIHdpdGgKKyAgLy8gc3BlY2lhbCBlbnVtcy4KKyAgaWYgKHByb3RvLmZpbmQoJ3MnKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICBjayA9IENsYXNzQjsKKyAgCisgIHMgKz0gTWFuZ2xlTmFtZShuYW1lLCB0eXBlc3RyLCBjayk7CisgIHMgKz0gIiwgXCIiOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHByb3RvLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgcyArPSBCdWlsdGluVHlwZVN0cmluZyhwcm90b1tpXSwgdHlwZXN0ciwgY2ssIGkgPT0gMCk7CisKKyAgLy8gRXh0cmEgY29uc3RhbnQgaW50ZWdlciB0byBob2xkIHR5cGUgY2xhc3MgZW51bSBmb3IgdGhpcyBmdW5jdGlvbiwgZS5nLiBzOAorICBpZiAoY2sgPT0gQ2xhc3NCKQorICAgIHMgKz0gImkiOworICAKKyAgcyArPSAiXCIsIFwiblwiKSI7CisgIHJldHVybiBzOworfQorCisvLy8gcnVuIC0gUmVhZCB0aGUgcmVjb3JkcyBpbiBhcm1fbmVvbi50ZCBhbmQgb3V0cHV0IGFybV9uZW9uLmguICBhcm1fbmVvbi5oCisvLy8gaXMgY29tcHJpc2VkIG9mIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KK3ZvaWQgTmVvbkVtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmT1MpIHsKKyAgRW1pdFNvdXJjZUZpbGVIZWFkZXIoIkFSTSBORU9OIEhlYWRlciIsIE9TKTsKKyAgCisgIC8vIEZJWE1FOiBlbWl0IGxpY2Vuc2UgaW50byBmaWxlPworICAKKyAgT1MgPDwgIiNpZm5kZWYgX19BUk1fTkVPTl9IXG4iOworICBPUyA8PCAiI2RlZmluZSBfX0FSTV9ORU9OX0hcblxuIjsKKyAgCisgIE9TIDw8ICIjaWZuZGVmIF9fQVJNX05FT05fX1xuIjsKKyAgT1MgPDwgIiNlcnJvciBcIk5FT04gc3VwcG9ydCBub3QgZW5hYmxlZFwiXG4iOworICBPUyA8PCAiI2VuZGlmXG5cbiI7CisKKyAgT1MgPDwgIiNpbmNsdWRlIDxzdGRpbnQuaD5cblxuIjsKKworICAvLyBFbWl0IE5FT04tc3BlY2lmaWMgc2NhbGFyIHR5cGVkZWZzLgorICBPUyA8PCAidHlwZWRlZiBmbG9hdCBmbG9hdDMyX3Q7XG4iOworICBPUyA8PCAidHlwZWRlZiB1aW50OF90IHBvbHk4X3Q7XG4iOworICBPUyA8PCAidHlwZWRlZiB1aW50MTZfdCBwb2x5MTZfdDtcbiI7CisgIE9TIDw8ICJ0eXBlZGVmIHVpbnQxNl90IGZsb2F0MTZfdDtcbiI7CisKKyAgLy8gRW1pdCBOZW9uIHZlY3RvciB0eXBlZGVmcy4KKyAgc3RkOjpzdHJpbmcgVHlwZWRlZlR5cGVzKCJjUWNzUXNpUWlsUWxVY1FVY1VzUVVzVWlRVWlVbFFVbGhRaGZRZlBjUVBjUHNRUHMiKTsKKyAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCAyND4gVERUeXBlVmVjOworICBQYXJzZVR5cGVzKDAsIFR5cGVkZWZUeXBlcywgVERUeXBlVmVjKTsKKworICAvLyBFbWl0IHZlY3RvciB0eXBlZGVmcy4KKyAgZm9yICh1bnNpZ25lZCB2ID0gMTsgdiAhPSA1OyArK3YpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVERUeXBlVmVjLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGJvb2wgZHVtbXksIHF1YWQgPSBmYWxzZTsKKyAgICAgICh2b2lkKSBDbGFzc2lmeVR5cGUoVERUeXBlVmVjW2ldLCBxdWFkLCBkdW1teSwgZHVtbXkpOworICAgICAgT1MgPDwgInR5cGVkZWYgX19hdHRyaWJ1dGVfXygoIF9fdmVjdG9yX3NpemVfXygiOworICAgICAgCisgICAgICBPUyA8PCB1dG9zdHIoOCp2KihxdWFkID8gMiA6IDEpKSA8PCAiKSApKSAiOworICAgICAgaWYgKCFxdWFkKQorICAgICAgICBPUyA8PCAiICI7CisgICAgICAKKyAgICAgIE9TIDw8IFR5cGVTdHJpbmcoJ3MnLCBURFR5cGVWZWNbaV0pOworICAgICAgT1MgPDwgIiBfX25lb25fIjsKKyAgICAgIAorICAgICAgY2hhciB0ID0gKHYgPT0gMSkgPyAnZCcgOiAnMCcgKyB2OworICAgICAgT1MgPDwgVHlwZVN0cmluZyh0LCBURFR5cGVWZWNbaV0pIDw8ICI7XG4iOworICAgIH0KKyAgfQorICBPUyA8PCAiXG4iOworCisgIC8vIEVtaXQgc3RydWN0IHR5cGVkZWZzLgorICBmb3IgKHVuc2lnbmVkIHZpID0gMTsgdmkgIT0gNTsgKyt2aSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBURFR5cGVWZWMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgc3RkOjpzdHJpbmcgdHMgPSBUeXBlU3RyaW5nKCdkJywgVERUeXBlVmVjW2ldLCB2aSA9PSAxKTsKKyAgICAgIHN0ZDo6c3RyaW5nIHZzID0gVHlwZVN0cmluZygodmkgPiAxKSA/ICcwJyArIHZpIDogJ2QnLCBURFR5cGVWZWNbaV0pOworICAgICAgc3RkOjpzdHJpbmcgdGFnID0gKHZpID4gMSkgPyB2cyA6IFN0cnVjdFRhZyhURFR5cGVWZWNbaV0pOworICAgICAgT1MgPDwgInR5cGVkZWYgc3RydWN0ICIgPDwgdGFnIDw8ICIge1xuIjsKKyAgICAgIE9TIDw8ICIgICIgPDwgdHMgPDwgIiB2YWwiOworICAgICAgaWYgKHZpID4gMSkKKyAgICAgICAgT1MgPDwgIlsiIDw8IHV0b3N0cih2aSkgPDwgIl0iOworICAgICAgT1MgPDwgIjtcbn0gIiA8PCB2cyA8PCAiO1xuXG4iOworICAgIH0KKyAgfQorICAKKyAgT1MgPDwgIiNkZWZpbmUgX19haSBzdGF0aWMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKVxuXG4iOworCisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFJWID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkluc3QiKTsKKyAgCisgIC8vIFVuaXF1ZSB0aGUgcmV0dXJuK3BhdHRlcm4gdHlwZXMsIGFuZCBhc3NpZ24gdGhlbS4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJWLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQgKlIgPSBSVltpXTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gTG93ZXJjYXNlU3RyaW5nKFItPmdldE5hbWUoKSk7CisgICAgc3RkOjpzdHJpbmcgUHJvdG8gPSBSLT5nZXRWYWx1ZUFzU3RyaW5nKCJQcm90b3R5cGUiKTsKKyAgICBzdGQ6OnN0cmluZyBUeXBlcyA9IFItPmdldFZhbHVlQXNTdHJpbmcoIlR5cGVzIik7CisgICAgCisgICAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCAxNj4gVHlwZVZlYzsKKyAgICBQYXJzZVR5cGVzKFIsIFR5cGVzLCBUeXBlVmVjKTsKKyAgICAKKyAgICBPcEtpbmQgayA9IE9wTWFwW1ItPmdldFZhbHVlQXNEZWYoIk9wZXJhbmQiKS0+Z2V0TmFtZSgpXTsKKyAgICAKKyAgICBib29sIGRlZmluZSA9IFByb3RvLmZpbmQoJ2knKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIHRpID0gMCwgdGUgPSBUeXBlVmVjLnNpemUoKTsgdGkgIT0gdGU7ICsrdGkpIHsKKyAgICAgIGFzc2VydCghUHJvdG8uZW1wdHkoKSAmJiAiIik7CisgICAgICAKKyAgICAgIC8vIHN0YXRpYyBhbHdheXMgaW5saW5lICsgcmV0dXJuIHR5cGUKKyAgICAgIGlmIChkZWZpbmUpCisgICAgICAgIE9TIDw8ICIjZGVmaW5lIjsKKyAgICAgIGVsc2UKKyAgICAgICAgT1MgPDwgIl9fYWkgIiA8PCBUeXBlU3RyaW5nKFByb3RvWzBdLCBUeXBlVmVjW3RpXSk7CisgICAgICAKKyAgICAgIC8vIEZ1bmN0aW9uIG5hbWUgd2l0aCB0eXBlIHN1ZmZpeAorICAgICAgT1MgPDwgIiAiIDw8IE1hbmdsZU5hbWUobmFtZSwgVHlwZVZlY1t0aV0sIENsYXNzUyk7CisgICAgICAKKyAgICAgIC8vIEZ1bmN0aW9uIGFyZ3VtZW50cworICAgICAgT1MgPDwgR2VuQXJncyhQcm90bywgVHlwZVZlY1t0aV0pOworICAgICAgCisgICAgICAvLyBEZWZpbml0aW9uLgorICAgICAgaWYgKGRlZmluZSkKKyAgICAgICAgT1MgPDwgIiAiOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiIHsgIjsKKyAgICAgIAorICAgICAgaWYgKGsgIT0gT3BOb25lKSB7CisgICAgICAgIE9TIDw8IEdlbk9wU3RyaW5nKGssIFByb3RvLCBUeXBlVmVjW3RpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoUi0+Z2V0U3VwZXJDbGFzc2VzKCkuc2l6ZSgpIDwgMikKKyAgICAgICAgICB0aHJvdyBUR0Vycm9yKFItPmdldExvYygpLCAiQnVpbHRpbiBoYXMgbm8gY2xhc3Mga2luZCIpOworICAgICAgICAKKyAgICAgICAgQ2xhc3NLaW5kIGNrID0gQ2xhc3NNYXBbUi0+Z2V0U3VwZXJDbGFzc2VzKClbMV1dOworCisgICAgICAgIGlmIChjayA9PSBDbGFzc05vbmUpCisgICAgICAgICAgdGhyb3cgVEdFcnJvcihSLT5nZXRMb2MoKSwgIkJ1aWx0aW4gaGFzIG5vIGNsYXNzIGtpbmQiKTsKKyAgICAgICAgT1MgPDwgR2VuQnVpbHRpbihuYW1lLCBQcm90bywgVHlwZVZlY1t0aV0sIGNrKTsKKyAgICAgIH0KKyAgICAgIGlmICghZGVmaW5lKQorICAgICAgICBPUyA8PCAiIH0iOworICAgICAgT1MgPDwgIlxuIjsKKyAgICB9CisgICAgT1MgPDwgIlxuIjsKKyAgfQorICBPUyA8PCAiI3VuZGVmIF9fYWlcblxuIjsKKyAgT1MgPDwgIiNlbmRpZiAvKiBfX0FSTV9ORU9OX0ggKi9cbiI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBSYW5nZUZyb21UeXBlKFN0cmluZ1JlZiB0eXBlc3RyKSB7CisgIC8vIGJhc2UgdHlwZSB0byBnZXQgdGhlIHR5cGUgc3RyaW5nIGZvci4KKyAgYm9vbCBxdWFkID0gZmFsc2UsIGR1bW15ID0gZmFsc2U7CisgIGNoYXIgdHlwZSA9IENsYXNzaWZ5VHlwZSh0eXBlc3RyLCBxdWFkLCBkdW1teSwgZHVtbXkpOworICAKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAnYyc6CisgICAgICByZXR1cm4gKDggPDwgKGludClxdWFkKSAtIDE7CisgICAgY2FzZSAnaCc6CisgICAgY2FzZSAncyc6CisgICAgICByZXR1cm4gKDQgPDwgKGludClxdWFkKSAtIDE7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnaSc6CisgICAgICByZXR1cm4gKDIgPDwgKGludClxdWFkKSAtIDE7CisgICAgY2FzZSAnbCc6CisgICAgICByZXR1cm4gKDEgPDwgKGludClxdWFkKSAtIDE7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJ1bmhhbmRsZWQgdHlwZSEiOworICAgICAgYnJlYWs7CisgIH0KKyAgYXNzZXJ0KDAgJiYgInVucmVhY2hhYmxlIik7CisgIHJldHVybiAwOworfQorCisvLy8gcnVuSGVhZGVyIC0gRW1pdCBhIGZpbGUgd2l0aCBzZWN0aW9ucyBkZWZpbmluZzoKKy8vLyAxLiB0aGUgTkVPTiBzZWN0aW9uIG9mIEJ1aWx0aW5zQVJNLmRlZi4KKy8vLyAyLiB0aGUgU2VtYUNoZWNraW5nIGNvZGUgZm9yIHRoZSB0eXBlIG92ZXJsb2FkIGNoZWNraW5nLgorLy8vIDMuIHRoZSBTZW1hQ2hlY2tpbmcgY29kZSBmb3IgdmFsaWRhdGlvbiBvZiBpbnRyaW5zaWMgaW1tZWRhdGUgYXJndW1lbnRzLgordm9pZCBOZW9uRW1pdHRlcjo6cnVuSGVhZGVyKHJhd19vc3RyZWFtICZPUykgeworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBSViA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJJbnN0Iik7CisKKyAgU3RyaW5nTWFwPE9wS2luZD4gRW1pdHRlZE1hcDsKKyAgCisgIC8vIEdlbmVyYXRlIEJ1aWx0aW5zQVJNLmRlZiBmb3IgTkVPTgorICBPUyA8PCAiI2lmZGVmIEdFVF9ORU9OX0JVSUxUSU5TXG4iOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUlYuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIFJlY29yZCAqUiA9IFJWW2ldOworICAgIE9wS2luZCBrID0gT3BNYXBbUi0+Z2V0VmFsdWVBc0RlZigiT3BlcmFuZCIpLT5nZXROYW1lKCldOworICAgIGlmIChrICE9IE9wTm9uZSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgc3RkOjpzdHJpbmcgUHJvdG8gPSBSLT5nZXRWYWx1ZUFzU3RyaW5nKCJQcm90b3R5cGUiKTsKKyAgICAKKyAgICAvLyBGdW5jdGlvbnMgd2l0aCAnYScgKHRoZSBzcGxhdCBjb2RlKSBpbiB0aGUgdHlwZSBwcm90b3R5cGUgc2hvdWxkIG5vdCBnZXQKKyAgICAvLyB0aGVpciBvd24gYnVpbHRpbiBhcyB0aGV5IHVzZSB0aGUgbm9uLXNwbGF0IHZhcmlhbnQuCisgICAgaWYgKFByb3RvLmZpbmQoJ2EnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIHN0ZDo6c3RyaW5nIFR5cGVzID0gUi0+Z2V0VmFsdWVBc1N0cmluZygiVHlwZXMiKTsKKyAgICBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDE2PiBUeXBlVmVjOworICAgIFBhcnNlVHlwZXMoUiwgVHlwZXMsIFR5cGVWZWMpOworICAgIAorICAgIGlmIChSLT5nZXRTdXBlckNsYXNzZXMoKS5zaXplKCkgPCAyKQorICAgICAgdGhyb3cgVEdFcnJvcihSLT5nZXRMb2MoKSwgIkJ1aWx0aW4gaGFzIG5vIGNsYXNzIGtpbmQiKTsKKyAgICAKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gTG93ZXJjYXNlU3RyaW5nKFItPmdldE5hbWUoKSk7CisgICAgQ2xhc3NLaW5kIGNrID0gQ2xhc3NNYXBbUi0+Z2V0U3VwZXJDbGFzc2VzKClbMV1dOworICAgIAorICAgIGZvciAodW5zaWduZWQgdGkgPSAwLCB0ZSA9IFR5cGVWZWMuc2l6ZSgpOyB0aSAhPSB0ZTsgKyt0aSkgeworICAgICAgLy8gR2VuZXJhdGUgdGhlIEJ1aWx0aW5zQVJNLmRlZiBkZWNsYXJhdGlvbiBmb3IgdGhpcyBidWlsdGluLCBlbnN1cmluZworICAgICAgLy8gdGhhdCBlYWNoIHVuaXF1ZSBCVUlMVElOKCkgbWFjcm8gYXBwZWFycyBvbmx5IG9uY2UgaW4gdGhlIG91dHB1dAorICAgICAgLy8gc3RyZWFtLgorICAgICAgc3RkOjpzdHJpbmcgYmQgPSBHZW5CdWlsdGluRGVmKG5hbWUsIFByb3RvLCBUeXBlVmVjW3RpXSwgY2spOworICAgICAgaWYgKEVtaXR0ZWRNYXAuY291bnQoYmQpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgRW1pdHRlZE1hcFtiZF0gPSBPcE5vbmU7CisgICAgICBPUyA8PCBiZCA8PCAiXG4iOworICAgIH0KKyAgfQorICBPUyA8PCAiI2VuZGlmXG5cbiI7CisgIAorICAvLyBHZW5lcmF0ZSB0aGUgb3ZlcmxvYWRlZCB0eXBlIGNoZWNraW5nIGNvZGUgZm9yIFNlbWFDaGVja2luZy5jcHAKKyAgT1MgPDwgIiNpZmRlZiBHRVRfTkVPTl9PVkVSTE9BRF9DSEVDS1xuIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJWLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQgKlIgPSBSVltpXTsKKyAgICBPcEtpbmQgayA9IE9wTWFwW1ItPmdldFZhbHVlQXNEZWYoIk9wZXJhbmQiKS0+Z2V0TmFtZSgpXTsKKyAgICBpZiAoayAhPSBPcE5vbmUpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICBzdGQ6OnN0cmluZyBQcm90byA9IFItPmdldFZhbHVlQXNTdHJpbmcoIlByb3RvdHlwZSIpOworICAgIHN0ZDo6c3RyaW5nIFR5cGVzID0gUi0+Z2V0VmFsdWVBc1N0cmluZygiVHlwZXMiKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gTG93ZXJjYXNlU3RyaW5nKFItPmdldE5hbWUoKSk7CisgICAgCisgICAgLy8gRnVuY3Rpb25zIHdpdGggJ2EnICh0aGUgc3BsYXQgY29kZSkgaW4gdGhlIHR5cGUgcHJvdG90eXBlIHNob3VsZCBub3QgZ2V0CisgICAgLy8gdGhlaXIgb3duIGJ1aWx0aW4gYXMgdGhleSB1c2UgdGhlIG5vbi1zcGxhdCB2YXJpYW50LgorICAgIGlmIChQcm90by5maW5kKCdhJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAvLyBGdW5jdGlvbnMgd2hpY2ggaGF2ZSBhIHNjYWxhciBhcmd1bWVudCBjYW5ub3QgYmUgb3ZlcmxvYWRlZCwgbm8gbmVlZCB0bworICAgIC8vIGNoZWNrIHRoZW0gaWYgd2UgYXJlIGVtaXR0aW5nIHRoZSB0eXBlIGNoZWNraW5nIGNvZGUuCisgICAgaWYgKFByb3RvLmZpbmQoJ3MnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIFNtYWxsVmVjdG9yPFN0cmluZ1JlZiwgMTY+IFR5cGVWZWM7CisgICAgUGFyc2VUeXBlcyhSLCBUeXBlcywgVHlwZVZlYyk7CisgICAgCisgICAgaWYgKFItPmdldFN1cGVyQ2xhc3NlcygpLnNpemUoKSA8IDIpCisgICAgICB0aHJvdyBUR0Vycm9yKFItPmdldExvYygpLCAiQnVpbHRpbiBoYXMgbm8gY2xhc3Mga2luZCIpOworICAgIAorICAgIGludCBzaSA9IC0xLCBxaSA9IC0xOworICAgIHVuc2lnbmVkIG1hc2sgPSAwLCBxbWFzayA9IDA7CisgICAgZm9yICh1bnNpZ25lZCB0aSA9IDAsIHRlID0gVHlwZVZlYy5zaXplKCk7IHRpICE9IHRlOyArK3RpKSB7CisgICAgICAvLyBHZW5lcmF0ZSB0aGUgc3dpdGNoIGNhc2UocykgZm9yIHRoaXMgYnVpbHRpbiBmb3IgdGhlIHR5cGUgdmFsaWRhdGlvbi4KKyAgICAgIGJvb2wgcXVhZCA9IGZhbHNlLCBwb2x5ID0gZmFsc2UsIHVzZ24gPSBmYWxzZTsKKyAgICAgICh2b2lkKSBDbGFzc2lmeVR5cGUoVHlwZVZlY1t0aV0sIHF1YWQsIHBvbHksIHVzZ24pOworICAgICAgCisgICAgICBpZiAocXVhZCkgeworICAgICAgICBxaSA9IHRpOworICAgICAgICBxbWFzayB8PSAxIDw8IEdldE5lb25FbnVtKFByb3RvLCBUeXBlVmVjW3RpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzaSA9IHRpOworICAgICAgICBtYXNrIHw9IDEgPDwgR2V0TmVvbkVudW0oUHJvdG8sIFR5cGVWZWNbdGldKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1hc2spCisgICAgICBPUyA8PCAiY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fIiAKKyAgICAgIDw8IE1hbmdsZU5hbWUobmFtZSwgVHlwZVZlY1tzaV0sIENsYXNzQikKKyAgICAgIDw8ICI6IG1hc2sgPSAiIDw8ICIweCIgPDwgdXRvaGV4c3RyKG1hc2spIDw8ICI7IGJyZWFrO1xuIjsKKyAgICBpZiAocW1hc2spCisgICAgICBPUyA8PCAiY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fIiAKKyAgICAgIDw8IE1hbmdsZU5hbWUobmFtZSwgVHlwZVZlY1txaV0sIENsYXNzQikKKyAgICAgIDw8ICI6IG1hc2sgPSAiIDw8ICIweCIgPDwgdXRvaGV4c3RyKHFtYXNrKSA8PCAiOyBicmVhaztcbiI7CisgIH0KKyAgT1MgPDwgIiNlbmRpZlxuXG4iOworICAKKyAgLy8gR2VuZXJhdGUgdGhlIGludHJpbnNpYyByYW5nZSBjaGVja2luZyBjb2RlIGZvciBzaGlmdC9sYW5lIGltbWVkaWF0ZXMuCisgIE9TIDw8ICIjaWZkZWYgR0VUX05FT05fSU1NRURJQVRFX0NIRUNLXG4iOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUlYuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIFJlY29yZCAqUiA9IFJWW2ldOworICAgIAorICAgIE9wS2luZCBrID0gT3BNYXBbUi0+Z2V0VmFsdWVBc0RlZigiT3BlcmFuZCIpLT5nZXROYW1lKCldOworICAgIGlmIChrICE9IE9wTm9uZSkKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBMb3dlcmNhc2VTdHJpbmcoUi0+Z2V0TmFtZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBQcm90byA9IFItPmdldFZhbHVlQXNTdHJpbmcoIlByb3RvdHlwZSIpOworICAgIHN0ZDo6c3RyaW5nIFR5cGVzID0gUi0+Z2V0VmFsdWVBc1N0cmluZygiVHlwZXMiKTsKKyAgICAKKyAgICAvLyBGdW5jdGlvbnMgd2l0aCAnYScgKHRoZSBzcGxhdCBjb2RlKSBpbiB0aGUgdHlwZSBwcm90b3R5cGUgc2hvdWxkIG5vdCBnZXQKKyAgICAvLyB0aGVpciBvd24gYnVpbHRpbiBhcyB0aGV5IHVzZSB0aGUgbm9uLXNwbGF0IHZhcmlhbnQuCisgICAgaWYgKFByb3RvLmZpbmQoJ2EnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgIGNvbnRpbnVlOworICAgIAorICAgIC8vIEZ1bmN0aW9ucyB3aGljaCBkbyBub3QgaGF2ZSBhbiBpbW1lZGlhdGUgZG8gbm90IG5lZWQgdG8gaGF2ZSByYW5nZQorICAgIC8vIGNoZWNraW5nIGNvZGUgZW1pdHRlZC4KKyAgICBpZiAoUHJvdG8uZmluZCgnaScpID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgY29udGludWU7CisgICAgCisgICAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCAxNj4gVHlwZVZlYzsKKyAgICBQYXJzZVR5cGVzKFIsIFR5cGVzLCBUeXBlVmVjKTsKKyAgICAKKyAgICBpZiAoUi0+Z2V0U3VwZXJDbGFzc2VzKCkuc2l6ZSgpIDwgMikKKyAgICAgIHRocm93IFRHRXJyb3IoUi0+Z2V0TG9jKCksICJCdWlsdGluIGhhcyBubyBjbGFzcyBraW5kIik7CisgICAgCisgICAgQ2xhc3NLaW5kIGNrID0gQ2xhc3NNYXBbUi0+Z2V0U3VwZXJDbGFzc2VzKClbMV1dOworICAgIAorICAgIGZvciAodW5zaWduZWQgdGkgPSAwLCB0ZSA9IFR5cGVWZWMuc2l6ZSgpOyB0aSAhPSB0ZTsgKyt0aSkgeworICAgICAgc3RkOjpzdHJpbmcgbmFtZXN0ciwgc2hpZnRzdHIsIHJhbmdlc3RyOworICAgICAgCisgICAgICAvLyBCdWlsdGlucyB3aGljaCBhcmUgb3ZlcmxvYWRlZCBieSB0eXBlIHdpbGwgbmVlZCB0byBoYXZlIHRoZWlyIHVwcGVyCisgICAgICAvLyBib3VuZCBjb21wdXRlZCBhdCBTZW1hIHRpbWUgYmFzZWQgb24gdGhlIHR5cGUgY29uc3RhbnQuCisgICAgICBpZiAoUHJvdG8uZmluZCgncycpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGNrID0gQ2xhc3NCOworICAgICAgICBpZiAoUi0+Z2V0VmFsdWVBc0JpdCgiaXNTaGlmdCIpKSB7CisgICAgICAgICAgc2hpZnRzdHIgPSAiLCB0cnVlIjsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBSaWdodCBzaGlmdHMgaGF2ZSBhbiAncicgaW4gdGhlIG5hbWUsIGxlZnQgc2hpZnRzIGRvIG5vdC4KKyAgICAgICAgICBpZiAobmFtZS5maW5kKCdyJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgICAgICByYW5nZXN0ciA9ICJsID0gMTsgIjsKKyAgICAgICAgfQorICAgICAgICByYW5nZXN0ciArPSAidSA9IFJGVChUViIgKyBzaGlmdHN0ciArICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJhbmdlc3RyID0gInUgPSAiICsgdXRvc3RyKFJhbmdlRnJvbVR5cGUoVHlwZVZlY1t0aV0pKTsKKyAgICAgIH0KKyAgICAgIC8vIE1ha2Ugc3VyZSBjYXNlcyBhcHBlYXIgb25seSBvbmNlIGJ5IHVuaXF1aW5nIHRoZW0gaW4gYSBzdHJpbmcgbWFwLgorICAgICAgbmFtZXN0ciA9IE1hbmdsZU5hbWUobmFtZSwgVHlwZVZlY1t0aV0sIGNrKTsKKyAgICAgIGlmIChFbWl0dGVkTWFwLmNvdW50KG5hbWVzdHIpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIEVtaXR0ZWRNYXBbbmFtZXN0cl0gPSBPcE5vbmU7CisKKyAgICAgIC8vIENhbGN1bGF0ZSB0aGUgaW5kZXggb2YgdGhlIGltbWVkaWF0ZSB0aGF0IHNob3VsZCBiZSByYW5nZSBjaGVja2VkLgorICAgICAgdW5zaWduZWQgaW1taWR4ID0gMDsKKyAgICAgIAorICAgICAgLy8gQnVpbHRpbnMgdGhhdCByZXR1cm4gYSBzdHJ1Y3Qgb2YgbXVsdGlwbGUgdmVjdG9ycyBoYXZlIGFuIGV4dHJhCisgICAgICAvLyBsZWFkaW5nIGFyZyBmb3IgdGhlIHN0cnVjdCByZXR1cm4uCisgICAgICBpZiAoUHJvdG9bMF0gPT0gJzInIHx8IFByb3RvWzBdID09ICczJyB8fCBQcm90b1swXSA9PSAnNCcpCisgICAgICAgICsraW1taWR4OworICAgICAgCisgICAgICAvLyBBZGQgb25lIHRvIHRoZSBpbmRleCBmb3IgZWFjaCBhcmd1bWVudCB1bnRpbCB3ZSByZWFjaCB0aGUgaW1tZWRpYXRlIAorICAgICAgLy8gdG8gYmUgY2hlY2tlZC4gIFN0cnVjdHMgb2YgdmVjdG9ycyBhcmUgcGFzc2VkIGFzIG11bHRpcGxlIGFyZ3VtZW50cy4KKyAgICAgIGZvciAodW5zaWduZWQgaWkgPSAxLCBpZSA9IFByb3RvLnNpemUoKTsgaWkgIT0gaWU7ICsraWkpIHsKKyAgICAgICAgc3dpdGNoIChQcm90b1tpaV0pIHsKKyAgICAgICAgICBkZWZhdWx0OiAgaW1taWR4ICs9IDE7IGJyZWFrOworICAgICAgICAgIGNhc2UgJzInOiBpbW1pZHggKz0gMjsgYnJlYWs7CisgICAgICAgICAgY2FzZSAnMyc6IGltbWlkeCArPSAzOyBicmVhazsKKyAgICAgICAgICBjYXNlICc0JzogaW1taWR4ICs9IDQ7IGJyZWFrOworICAgICAgICAgIGNhc2UgJ2knOiBpZSA9IGlpICsgMTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIE9TIDw8ICJjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl8iICA8PCBNYW5nbGVOYW1lKG5hbWUsIFR5cGVWZWNbdGldLCBjaykKKyAgICAgICAgIDw8ICI6IGkgPSAiIDw8IGltbWlkeCA8PCAiOyAiIDw8IHJhbmdlc3RyIDw8ICI7IGJyZWFrO1xuIjsKKyAgICB9CisgIH0KKyAgT1MgPDwgIiNlbmRpZlxuXG4iOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vTmVvbkVtaXR0ZXIuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL05lb25FbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2NzYwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL05lb25FbWl0dGVyLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vPT09LSBOZW9uRW1pdHRlci5oIC0gR2VuZXJhdGUgYXJtX25lb24uaCBmb3IgdXNlIHdpdGggY2xhbmcgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBhcm1fbmVvbi5oLCB3aGljaCBpbmNsdWRlcworLy8gYSBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIHNwZWNpZmllZCBieSB0aGUgQVJNIE5FT04gCisvLyBjb21waWxlciBpbnRlcmZhY2UuICBTZWUgQVJNIGRvY3VtZW50IERVSTAzNDhCLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTkVPTl9FTUlUVEVSX0gKKyNkZWZpbmUgTkVPTl9FTUlUVEVSX0gKKworI2luY2x1ZGUgIlJlY29yZC5oIgorI2luY2x1ZGUgIlRhYmxlR2VuQmFja2VuZC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisKK2VudW0gT3BLaW5kIHsKKyAgT3BOb25lLAorICBPcEFkZCwKKyAgT3BTdWIsCisgIE9wTXVsLAorICBPcE1sYSwKKyAgT3BNbHMsCisgIE9wTXVsTiwKKyAgT3BNbGFOLAorICBPcE1sc04sCisgIE9wRXEsCisgIE9wR2UsCisgIE9wTGUsCisgIE9wR3QsCisgIE9wTHQsCisgIE9wTmVnLAorICBPcE5vdCwKKyAgT3BBbmQsCisgIE9wT3IsCisgIE9wWG9yLAorICBPcEFuZE5vdCwKKyAgT3BPck5vdCwKKyAgT3BDYXN0LAorICBPcENvbmNhdCwKKyAgT3BEdXAsCisgIE9wSGksCisgIE9wTG8sCisgIE9wU2VsZWN0LAorICBPcFJldjE2LAorICBPcFJldjMyLAorICBPcFJldjY0Cit9OworCitlbnVtIENsYXNzS2luZCB7CisgIENsYXNzTm9uZSwKKyAgQ2xhc3NJLAorICBDbGFzc1MsCisgIENsYXNzVywKKyAgQ2xhc3NCCit9OworCituYW1lc3BhY2UgbGx2bSB7CisgIAorICBjbGFzcyBOZW9uRW1pdHRlciA6IHB1YmxpYyBUYWJsZUdlbkJhY2tlbmQgeworICAgIFJlY29yZEtlZXBlciAmUmVjb3JkczsKKyAgICBTdHJpbmdNYXA8T3BLaW5kPiBPcE1hcDsKKyAgICBEZW5zZU1hcDxSZWNvcmQqLCBDbGFzc0tpbmQ+IENsYXNzTWFwOworICAgIAorICBwdWJsaWM6CisgICAgTmVvbkVtaXR0ZXIoUmVjb3JkS2VlcGVyICZSKSA6IFJlY29yZHMoUikgeworICAgICAgT3BNYXBbIk9QX05PTkUiXSAgPSBPcE5vbmU7CisgICAgICBPcE1hcFsiT1BfQUREIl0gICA9IE9wQWRkOworICAgICAgT3BNYXBbIk9QX1NVQiJdICAgPSBPcFN1YjsKKyAgICAgIE9wTWFwWyJPUF9NVUwiXSAgID0gT3BNdWw7CisgICAgICBPcE1hcFsiT1BfTUxBIl0gICA9IE9wTWxhOworICAgICAgT3BNYXBbIk9QX01MUyJdICAgPSBPcE1sczsKKyAgICAgIE9wTWFwWyJPUF9NVUxfTiJdID0gT3BNdWxOOworICAgICAgT3BNYXBbIk9QX01MQV9OIl0gPSBPcE1sYU47CisgICAgICBPcE1hcFsiT1BfTUxTX04iXSA9IE9wTWxzTjsKKyAgICAgIE9wTWFwWyJPUF9FUSJdICAgID0gT3BFcTsKKyAgICAgIE9wTWFwWyJPUF9HRSJdICAgID0gT3BHZTsKKyAgICAgIE9wTWFwWyJPUF9MRSJdICAgID0gT3BMZTsKKyAgICAgIE9wTWFwWyJPUF9HVCJdICAgID0gT3BHdDsKKyAgICAgIE9wTWFwWyJPUF9MVCJdICAgID0gT3BMdDsKKyAgICAgIE9wTWFwWyJPUF9ORUciXSAgID0gT3BOZWc7CisgICAgICBPcE1hcFsiT1BfTk9UIl0gICA9IE9wTm90OworICAgICAgT3BNYXBbIk9QX0FORCJdICAgPSBPcEFuZDsKKyAgICAgIE9wTWFwWyJPUF9PUiJdICAgID0gT3BPcjsKKyAgICAgIE9wTWFwWyJPUF9YT1IiXSAgID0gT3BYb3I7CisgICAgICBPcE1hcFsiT1BfQU5ETiJdICA9IE9wQW5kTm90OworICAgICAgT3BNYXBbIk9QX09STiJdICAgPSBPcE9yTm90OworICAgICAgT3BNYXBbIk9QX0NBU1QiXSAgPSBPcENhc3Q7CisgICAgICBPcE1hcFsiT1BfQ09OQyJdICA9IE9wQ29uY2F0OworICAgICAgT3BNYXBbIk9QX0hJIl0gICAgPSBPcEhpOworICAgICAgT3BNYXBbIk9QX0xPIl0gICAgPSBPcExvOworICAgICAgT3BNYXBbIk9QX0RVUCJdICAgPSBPcER1cDsKKyAgICAgIE9wTWFwWyJPUF9TRUwiXSAgID0gT3BTZWxlY3Q7CisgICAgICBPcE1hcFsiT1BfUkVWMTYiXSA9IE9wUmV2MTY7CisgICAgICBPcE1hcFsiT1BfUkVWMzIiXSA9IE9wUmV2MzI7CisgICAgICBPcE1hcFsiT1BfUkVWNjQiXSA9IE9wUmV2NjQ7CisKKyAgICAgIFJlY29yZCAqU0kgPSBSLmdldENsYXNzKCJTSW5zdCIpOworICAgICAgUmVjb3JkICpJSSA9IFIuZ2V0Q2xhc3MoIklJbnN0Iik7CisgICAgICBSZWNvcmQgKldJID0gUi5nZXRDbGFzcygiV0luc3QiKTsKKyAgICAgIENsYXNzTWFwW1NJXSA9IENsYXNzUzsKKyAgICAgIENsYXNzTWFwW0lJXSA9IENsYXNzSTsKKyAgICAgIENsYXNzTWFwW1dJXSA9IENsYXNzVzsKKyAgICB9CisgICAgCisgICAgLy8gcnVuIC0gRW1pdCBhcm1fbmVvbi5oLmluYworICAgIHZvaWQgcnVuKHJhd19vc3RyZWFtICZvKTsKKworICAgIC8vIHJ1bkhlYWRlciAtIEVtaXQgYWxsIHRoZSBfX2J1aWx0aW4gcHJvdG90eXBlcyB1c2VkIGluIGFybV9uZW9uLmgKKyAgICB2b2lkIHJ1bkhlYWRlcihyYXdfb3N0cmVhbSAmbyk7CisgIH07CisgIAorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9PcHRQYXJzZXJFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL09wdFBhcnNlckVtaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OTI5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9PcHRQYXJzZXJFbWl0dGVyLmNwcApAQCAtMCwwICsxLDE5NCBAQAorLy89PT0tIE9wdFBhcnNlckVtaXR0ZXIuY3BwIC0gVGFibGUgRHJpdmVuIENvbW1hbmQgTGluZSBQYXJzaW5nIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIk9wdFBhcnNlckVtaXR0ZXIuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgaW50IFN0ckNtcE9wdGlvbk5hbWUoY29uc3QgY2hhciAqQSwgY29uc3QgY2hhciAqQikgeworICBjaGFyIGEgPSAqQSwgYiA9ICpCOworICB3aGlsZSAoYSA9PSBiKSB7CisgICAgaWYgKGEgPT0gJ1wwJykKKyAgICAgIHJldHVybiAwOworCisgICAgYSA9ICorK0E7CisgICAgYiA9ICorK0I7CisgIH0KKworICBpZiAoYSA9PSAnXDAnKSAvLyBBIGlzIGEgcHJlZml4IG9mIEIuCisgICAgcmV0dXJuIDE7CisgIGlmIChiID09ICdcMCcpIC8vIEIgaXMgYSBwcmVmaXggb2YgQS4KKyAgICByZXR1cm4gLTE7CisKKyAgLy8gT3RoZXJ3aXNlIGxleGljb2dyYXBoaWMuCisgIHJldHVybiAoYSA8IGIpID8gLTEgOiAxOworfQorCitzdGF0aWMgaW50IENvbXBhcmVPcHRpb25SZWNvcmRzKGNvbnN0IHZvaWQgKkF2LCBjb25zdCB2b2lkICpCdikgeworICBjb25zdCBSZWNvcmQgKkEgPSAqKFJlY29yZCoqKSBBdjsKKyAgY29uc3QgUmVjb3JkICpCID0gKihSZWNvcmQqKikgQnY7CisKKyAgLy8gU2VudGluZWwgb3B0aW9ucyBwcmVjZWVkIGFsbCBvdGhlcnMgYW5kIGFyZSBvbmx5IG9yZGVyZWQgYnkgcHJlY2VkZW5jZS4KKyAgYm9vbCBBU2VudCA9IEEtPmdldFZhbHVlQXNEZWYoIktpbmQiKS0+Z2V0VmFsdWVBc0JpdCgiU2VudGluZWwiKTsKKyAgYm9vbCBCU2VudCA9IEItPmdldFZhbHVlQXNEZWYoIktpbmQiKS0+Z2V0VmFsdWVBc0JpdCgiU2VudGluZWwiKTsKKyAgaWYgKEFTZW50ICE9IEJTZW50KQorICAgIHJldHVybiBBU2VudCA/IC0xIDogMTsKKworICAvLyBDb21wYXJlIG9wdGlvbnMgYnkgbmFtZSwgdW5sZXNzIHRoZXkgYXJlIHNlbnRpbmVscy4KKyAgaWYgKCFBU2VudCkKKyAgICBpZiAoaW50IENtcCA9IFN0ckNtcE9wdGlvbk5hbWUoQS0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZSIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEItPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKS5jX3N0cigpKSkKKyAgICByZXR1cm4gQ21wOworCisgIC8vIFRoZW4gYnkgdGhlIGtpbmQgcHJlY2VkZW5jZTsKKyAgaW50IEFQcmVjID0gQS0+Z2V0VmFsdWVBc0RlZigiS2luZCIpLT5nZXRWYWx1ZUFzSW50KCJQcmVjZWRlbmNlIik7CisgIGludCBCUHJlYyA9IEItPmdldFZhbHVlQXNEZWYoIktpbmQiKS0+Z2V0VmFsdWVBc0ludCgiUHJlY2VkZW5jZSIpOworICBhc3NlcnQoQVByZWMgIT0gQlByZWMgJiYgIk9wdGlvbnMgYXJlIGVxdWl2YWxlbnQhIik7CisgIHJldHVybiBBUHJlYyA8IEJQcmVjID8gLTEgOiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3B0aW9uTmFtZShjb25zdCBSZWNvcmQgJlIpIHsKKyAgLy8gVXNlIHRoZSByZWNvcmQgbmFtZSB1bmxlc3MgRW51bU5hbWUgaXMgZGVmaW5lZC4KKyAgaWYgKGR5bmFtaWNfY2FzdDxVbnNldEluaXQqPihSLmdldFZhbHVlSW5pdCgiRW51bU5hbWUiKSkpCisgICAgcmV0dXJuIFIuZ2V0TmFtZSgpOworCisgIHJldHVybiBSLmdldFZhbHVlQXNTdHJpbmcoIkVudW1OYW1lIik7Cit9CisKK3N0YXRpYyByYXdfb3N0cmVhbSAmd3JpdGVfY3N0cmluZyhyYXdfb3N0cmVhbSAmT1MsIGxsdm06OlN0cmluZ1JlZiBTdHIpIHsKKyAgT1MgPDwgJyInOworICBPUy53cml0ZV9lc2NhcGVkKFN0cik7CisgIE9TIDw8ICciJzsKKyAgcmV0dXJuIE9TOworfQorCit2b2lkIE9wdFBhcnNlckVtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gR2V0IHRoZSBvcHRpb24gZ3JvdXBzIGFuZCBvcHRpb25zLgorICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmR3JvdXBzID0KKyAgICBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiT3B0aW9uR3JvdXAiKTsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gT3B0cyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJPcHRpb24iKTsKKworICBpZiAoR2VuRGVmcykKKyAgICBFbWl0U291cmNlRmlsZUhlYWRlcigiT3B0aW9uIFBhcnNpbmcgRGVmaW5pdGlvbnMiLCBPUyk7CisgIGVsc2UKKyAgICBFbWl0U291cmNlRmlsZUhlYWRlcigiT3B0aW9uIFBhcnNpbmcgVGFibGUiLCBPUyk7CisKKyAgYXJyYXlfcG9kX3NvcnQoT3B0cy5iZWdpbigpLCBPcHRzLmVuZCgpLCBDb21wYXJlT3B0aW9uUmVjb3Jkcyk7CisgIGlmIChHZW5EZWZzKSB7CisgICAgT1MgPDwgIiNpZm5kZWYgT1BUSU9OXG4iOworICAgIE9TIDw8ICIjZXJyb3IgXCJEZWZpbmUgT1BUSU9OIHByaW9yIHRvIGluY2x1ZGluZyB0aGlzIGZpbGUhXCJcbiI7CisgICAgT1MgPDwgIiNlbmRpZlxuXG4iOworCisgICAgT1MgPDwgIi8vLy8vLy8vL1xuIjsKKyAgICBPUyA8PCAiLy8gR3JvdXBzXG5cbiI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEdyb3Vwcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBSZWNvcmQgJlIgPSAqR3JvdXBzW2ldOworCisgICAgICAvLyBTdGFydCBhIHNpbmdsZSBvcHRpb24gZW50cnkuCisgICAgICBPUyA8PCAiT1BUSU9OKCI7CisKKyAgICAgIC8vIFRoZSBvcHRpb24gc3RyaW5nLgorICAgICAgT1MgPDwgJyInIDw8IFIuZ2V0VmFsdWVBc1N0cmluZygiTmFtZSIpIDw8ICciJzsKKworICAgICAgLy8gVGhlIG9wdGlvbiBpZGVudGlmaWVyIG5hbWUuCisgICAgICBPUyAgPDwgIiwgIjw8IGdldE9wdGlvbk5hbWUoUik7CisKKyAgICAgIC8vIFRoZSBvcHRpb24ga2luZC4KKyAgICAgIE9TIDw8ICIsIEdyb3VwIjsKKworICAgICAgLy8gVGhlIGNvbnRhaW5pbmcgb3B0aW9uIGdyb3VwIChpZiBhbnkpLgorICAgICAgT1MgPDwgIiwgIjsKKyAgICAgIGlmIChjb25zdCBEZWZJbml0ICpESSA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oUi5nZXRWYWx1ZUluaXQoIkdyb3VwIikpKQorICAgICAgICBPUyA8PCBnZXRPcHRpb25OYW1lKCpESS0+Z2V0RGVmKCkpOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiSU5WQUxJRCI7CisKKyAgICAgIC8vIFRoZSBvdGhlciBvcHRpb24gYXJndW1lbnRzICh1bnVzZWQgZm9yIGdyb3VwcykuCisgICAgICBPUyA8PCAiLCBJTlZBTElELCAwLCAwIjsKKworICAgICAgLy8gVGhlIG9wdGlvbiBoZWxwIHRleHQuCisgICAgICBpZiAoIWR5bmFtaWNfY2FzdDxVbnNldEluaXQqPihSLmdldFZhbHVlSW5pdCgiSGVscFRleHQiKSkpIHsKKyAgICAgICAgT1MgPDwgIixcbiI7CisgICAgICAgIE9TIDw8ICIgICAgICAgIjsKKyAgICAgICAgd3JpdGVfY3N0cmluZyhPUywgUi5nZXRWYWx1ZUFzU3RyaW5nKCJIZWxwVGV4dCIpKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBPUyA8PCAiLCAwIjsKKworICAgICAgLy8gVGhlIG9wdGlvbiBtZXRhLXZhcmlhYmxlIG5hbWUgKHVudXNlZCkuCisgICAgICBPUyA8PCAiLCAwKVxuIjsKKyAgICB9CisgICAgT1MgPDwgIlxuIjsKKworICAgIE9TIDw8ICIvLy8vLy8vLy8vXG4iOworICAgIE9TIDw8ICIvLyBPcHRpb25zXG5cbiI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE9wdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgUmVjb3JkICZSID0gKk9wdHNbaV07CisKKyAgICAgIC8vIFN0YXJ0IGEgc2luZ2xlIG9wdGlvbiBlbnRyeS4KKyAgICAgIE9TIDw8ICJPUFRJT04oIjsKKworICAgICAgLy8gVGhlIG9wdGlvbiBzdHJpbmcuCisgICAgICB3cml0ZV9jc3RyaW5nKE9TLCBSLmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKSk7CisKKyAgICAgIC8vIFRoZSBvcHRpb24gaWRlbnRpZmllciBuYW1lLgorICAgICAgT1MgIDw8ICIsICI8PCBnZXRPcHRpb25OYW1lKFIpOworCisgICAgICAvLyBUaGUgb3B0aW9uIGtpbmQuCisgICAgICBPUyA8PCAiLCAiIDw8IFIuZ2V0VmFsdWVBc0RlZigiS2luZCIpLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIik7CisKKyAgICAgIC8vIFRoZSBjb250YWluaW5nIG9wdGlvbiBncm91cCAoaWYgYW55KS4KKyAgICAgIE9TIDw8ICIsICI7CisgICAgICBpZiAoY29uc3QgRGVmSW5pdCAqREkgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KFIuZ2V0VmFsdWVJbml0KCJHcm91cCIpKSkKKyAgICAgICAgT1MgPDwgZ2V0T3B0aW9uTmFtZSgqREktPmdldERlZigpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgT1MgPDwgIklOVkFMSUQiOworCisgICAgICAvLyBUaGUgb3B0aW9uIGFsaWFzIChpZiBhbnkpLgorICAgICAgT1MgPDwgIiwgIjsKKyAgICAgIGlmIChjb25zdCBEZWZJbml0ICpESSA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oUi5nZXRWYWx1ZUluaXQoIkFsaWFzIikpKQorICAgICAgICBPUyA8PCBnZXRPcHRpb25OYW1lKCpESS0+Z2V0RGVmKCkpOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiSU5WQUxJRCI7CisKKyAgICAgIC8vIFRoZSBvcHRpb24gZmxhZ3MuCisgICAgICBjb25zdCBMaXN0SW5pdCAqTEkgPSBSLmdldFZhbHVlQXNMaXN0SW5pdCgiRmxhZ3MiKTsKKyAgICAgIGlmIChMSS0+ZW1wdHkoKSkgeworICAgICAgICBPUyA8PCAiLCAwIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE9TIDw8ICIsICI7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMSS0+c2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIGlmIChpKQorICAgICAgICAgICAgT1MgPDwgIiB8ICI7CisgICAgICAgICAgT1MgPDwgZHluYW1pY19jYXN0PERlZkluaXQqPihMSS0+Z2V0RWxlbWVudChpKSktPmdldERlZigpLT5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gVGhlIG9wdGlvbiBwYXJhbWV0ZXIgZmllbGQuCisgICAgICBPUyA8PCAiLCAiIDw8IFIuZ2V0VmFsdWVBc0ludCgiTnVtQXJncyIpOworCisgICAgICAvLyBUaGUgb3B0aW9uIGhlbHAgdGV4dC4KKyAgICAgIGlmICghZHluYW1pY19jYXN0PFVuc2V0SW5pdCo+KFIuZ2V0VmFsdWVJbml0KCJIZWxwVGV4dCIpKSkgeworICAgICAgICBPUyA8PCAiLFxuIjsKKyAgICAgICAgT1MgPDwgIiAgICAgICAiOworICAgICAgICB3cml0ZV9jc3RyaW5nKE9TLCBSLmdldFZhbHVlQXNTdHJpbmcoIkhlbHBUZXh0IikpOworICAgICAgfSBlbHNlCisgICAgICAgIE9TIDw8ICIsIDAiOworCisgICAgICAvLyBUaGUgb3B0aW9uIG1ldGEtdmFyaWFibGUgbmFtZS4KKyAgICAgIE9TIDw8ICIsICI7CisgICAgICBpZiAoIWR5bmFtaWNfY2FzdDxVbnNldEluaXQqPihSLmdldFZhbHVlSW5pdCgiTWV0YVZhck5hbWUiKSkpCisgICAgICAgIHdyaXRlX2NzdHJpbmcoT1MsIFIuZ2V0VmFsdWVBc1N0cmluZygiTWV0YVZhck5hbWUiKSk7CisgICAgICBlbHNlCisgICAgICAgIE9TIDw8ICIwIjsKKworICAgICAgT1MgPDwgIilcbiI7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9PcHRQYXJzZXJFbWl0dGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9PcHRQYXJzZXJFbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxYTNmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL09wdFBhcnNlckVtaXR0ZXIuaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gT3B0UGFyc2VyRW1pdHRlci5oIC0gVGFibGUgRHJpdmVuIENvbW1hbmQgTGluZSBQYXJzaW5nIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFVUSUxTX1RBQkxFR0VOX09QVFBBUlNFUkVNSVRURVJfSAorI2RlZmluZSBVVElMU19UQUJMRUdFTl9PUFRQQVJTRVJFTUlUVEVSX0gKKworI2luY2x1ZGUgIlRhYmxlR2VuQmFja2VuZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vLyBPcHRQYXJzZXJFbWl0dGVyIC0gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIHRha2VzIGFuIGlucHV0IC50ZCBmaWxlCisgIC8vLyBkZXNjcmliaW5nIGEgbGlzdCBvZiBvcHRpb25zIGFuZCBlbWl0cyBhIGRhdGEgc3RydWN0dXJlIGZvciBwYXJzaW5nIGFuZAorICAvLy8gd29ya2luZyB3aXRoIHRob3NlIG9wdGlvbnMgd2hlbiBnaXZlbiBhbiBpbnB1dCBjb21tYW5kIGxpbmUuCisgIGNsYXNzIE9wdFBhcnNlckVtaXR0ZXIgOiBwdWJsaWMgVGFibGVHZW5CYWNrZW5kIHsKKyAgICBSZWNvcmRLZWVwZXIgJlJlY29yZHM7CisgICAgYm9vbCBHZW5EZWZzOworCisgIHB1YmxpYzoKKyAgICBPcHRQYXJzZXJFbWl0dGVyKFJlY29yZEtlZXBlciAmUiwgYm9vbCBfR2VuRGVmcykKKyAgICAgIDogUmVjb3JkcyhSKSwgR2VuRGVmcyhfR2VuRGVmcykge30KKworICAgIC8vLyBydW4gLSBPdXRwdXQgdGhlIG9wdGlvbiBwYXJzaW5nIGluZm9ybWF0aW9uLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gR2VuSGVhZGVyIC0gR2VuZXJhdGUgdGhlIGhlYWRlciBkZXNjcmliaW5nIHRoZSBvcHRpb24gSURzLngKKyAgICB2b2lkIHJ1bihyYXdfb3N0cmVhbSAmT1MpOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1JlY29yZC5jcHAgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9SZWNvcmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2YzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9SZWNvcmQuY3BwCkBAIC0wLDAgKzEsMTU5NCBAQAorLy89PT0tIFJlY29yZC5jcHAgLSBSZWNvcmQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbXBsZW1lbnQgdGhlIHRhYmxlZ2VuIHJlY29yZCBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgVHlwZSBpbXBsZW1lbnRhdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ZvaWQgUmVjVHk6OmR1bXAoKSBjb25zdCB7IHByaW50KGVycnMoKSk7IH0KKworSW5pdCAqQml0UmVjVHk6OmNvbnZlcnRWYWx1ZShCaXRzSW5pdCAqQkkpIHsKKyAgaWYgKEJJLT5nZXROdW1CaXRzKCkgIT0gMSkgcmV0dXJuIDA7IC8vIE9ubHkgYWNjZXB0IGlmIGp1c3Qgb25lIGJpdCEKKyAgcmV0dXJuIEJJLT5nZXRCaXQoMCk7Cit9CisKK2Jvb2wgQml0UmVjVHk6OmJhc2VDbGFzc09mKGNvbnN0IEJpdHNSZWNUeSAqUkhTKSBjb25zdCB7CisgIHJldHVybiBSSFMtPmdldE51bUJpdHMoKSA9PSAxOworfQorCitJbml0ICpCaXRSZWNUeTo6Y29udmVydFZhbHVlKEludEluaXQgKklJKSB7CisgIGludDY0X3QgVmFsID0gSUktPmdldFZhbHVlKCk7CisgIGlmIChWYWwgIT0gMCAmJiBWYWwgIT0gMSkgcmV0dXJuIDA7ICAvLyBPbmx5IGFjY2VwdCAwIG9yIDEgZm9yIGEgYml0IQorCisgIHJldHVybiBuZXcgQml0SW5pdChWYWwgIT0gMCk7Cit9CisKK0luaXQgKkJpdFJlY1R5Ojpjb252ZXJ0VmFsdWUoVHlwZWRJbml0ICpWSSkgeworICBpZiAoZHluYW1pY19jYXN0PEJpdFJlY1R5Kj4oVkktPmdldFR5cGUoKSkpCisgICAgcmV0dXJuIFZJOyAgLy8gQWNjZXB0IHZhcmlhYmxlIGlmIGl0IGlzIGFscmVhZHkgb2YgYml0IHR5cGUhCisgIHJldHVybiAwOworfQorCitzdGQ6OnN0cmluZyBCaXRzUmVjVHk6OmdldEFzU3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gImJpdHM8IiArIHV0b3N0cihTaXplKSArICI+IjsKK30KKworSW5pdCAqQml0c1JlY1R5Ojpjb252ZXJ0VmFsdWUoVW5zZXRJbml0ICpVSSkgeworICBCaXRzSW5pdCAqUmV0ID0gbmV3IEJpdHNJbml0KFNpemUpOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gU2l6ZTsgKytpKQorICAgIFJldC0+c2V0Qml0KGksIG5ldyBVbnNldEluaXQoKSk7CisgIHJldHVybiBSZXQ7Cit9CisKK0luaXQgKkJpdHNSZWNUeTo6Y29udmVydFZhbHVlKEJpdEluaXQgKlVJKSB7CisgIGlmIChTaXplICE9IDEpIHJldHVybiAwOyAgLy8gQ2FuIG9ubHkgY29udmVydCBzaW5nbGUgYml0Li4uCisgIEJpdHNJbml0ICpSZXQgPSBuZXcgQml0c0luaXQoMSk7CisgIFJldC0+c2V0Qml0KDAsIFVJKTsKKyAgcmV0dXJuIFJldDsKK30KKworLy8gY29udmVydFZhbHVlIGZyb20gSW50IGluaXRpYWxpemVyIHRvIGJpdHMgdHlwZTogU3BsaXQgdGhlIGludGVnZXIgdXAgaW50byB0aGUKKy8vIGFwcHJvcHJpYXRlIGJpdHMuLi4KKy8vCitJbml0ICpCaXRzUmVjVHk6OmNvbnZlcnRWYWx1ZShJbnRJbml0ICpJSSkgeworICBpbnQ2NF90IFZhbHVlID0gSUktPmdldFZhbHVlKCk7CisgIC8vIE1ha2Ugc3VyZSB0aGlzIGJpdGZpZWxkIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBpbnRlZ2VyIHZhbHVlLi4uCisgIGlmIChWYWx1ZSA+PSAwKSB7CisgICAgaWYgKFZhbHVlICYgfigoMUxMIDw8IFNpemUpLTEpKQorICAgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgaWYgKChWYWx1ZSA+PiBTaXplKSAhPSAtMSB8fCAoKFZhbHVlICYgKDFMTCA8PCAoU2l6ZS0xKSkpID09IDApKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBCaXRzSW5pdCAqUmV0ID0gbmV3IEJpdHNJbml0KFNpemUpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFNpemU7ICsraSkKKyAgICBSZXQtPnNldEJpdChpLCBuZXcgQml0SW5pdChWYWx1ZSAmICgxTEwgPDwgaSkpKTsKKworICByZXR1cm4gUmV0OworfQorCitJbml0ICpCaXRzUmVjVHk6OmNvbnZlcnRWYWx1ZShCaXRzSW5pdCAqQkkpIHsKKyAgLy8gSWYgdGhlIG51bWJlciBvZiBiaXRzIGlzIHJpZ2h0LCByZXR1cm4gaXQuICBPdGhlcndpc2Ugd2UgbmVlZCB0byBleHBhbmQgb3IKKyAgLy8gdHJ1bmNhdGUuLi4KKyAgaWYgKEJJLT5nZXROdW1CaXRzKCkgPT0gU2l6ZSkgcmV0dXJuIEJJOworICByZXR1cm4gMDsKK30KKworSW5pdCAqQml0c1JlY1R5Ojpjb252ZXJ0VmFsdWUoVHlwZWRJbml0ICpWSSkgeworICBpZiAoQml0c1JlY1R5ICpCUlQgPSBkeW5hbWljX2Nhc3Q8Qml0c1JlY1R5Kj4oVkktPmdldFR5cGUoKSkpCisgICAgaWYgKEJSVC0+U2l6ZSA9PSBTaXplKSB7CisgICAgICBCaXRzSW5pdCAqUmV0ID0gbmV3IEJpdHNJbml0KFNpemUpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBTaXplOyArK2kpCisgICAgICAgIFJldC0+c2V0Qml0KGksIG5ldyBWYXJCaXRJbml0KFZJLCBpKSk7CisgICAgICByZXR1cm4gUmV0OworICAgIH0KKyAgaWYgKFNpemUgPT0gMSAmJiBkeW5hbWljX2Nhc3Q8Qml0UmVjVHkqPihWSS0+Z2V0VHlwZSgpKSkgeworICAgIEJpdHNJbml0ICpSZXQgPSBuZXcgQml0c0luaXQoMSk7CisgICAgUmV0LT5zZXRCaXQoMCwgVkkpOworICAgIHJldHVybiBSZXQ7CisgIH0KKworICByZXR1cm4gMDsKK30KKworSW5pdCAqSW50UmVjVHk6OmNvbnZlcnRWYWx1ZShCaXRJbml0ICpCSSkgeworICByZXR1cm4gbmV3IEludEluaXQoQkktPmdldFZhbHVlKCkpOworfQorCitJbml0ICpJbnRSZWNUeTo6Y29udmVydFZhbHVlKEJpdHNJbml0ICpCSSkgeworICBpbnQ2NF90IFJlc3VsdCA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCSS0+Z2V0TnVtQml0cygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoQml0SW5pdCAqQml0ID0gZHluYW1pY19jYXN0PEJpdEluaXQqPihCSS0+Z2V0Qml0KGkpKSkgeworICAgICAgUmVzdWx0IHw9IEJpdC0+Z2V0VmFsdWUoKSA8PCBpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiBuZXcgSW50SW5pdChSZXN1bHQpOworfQorCitJbml0ICpJbnRSZWNUeTo6Y29udmVydFZhbHVlKFR5cGVkSW5pdCAqVEkpIHsKKyAgaWYgKFRJLT5nZXRUeXBlKCktPnR5cGVJc0NvbnZlcnRpYmxlVG8odGhpcykpCisgICAgcmV0dXJuIFRJOyAgLy8gQWNjZXB0IHZhcmlhYmxlIGlmIGFscmVhZHkgb2YgdGhlIHJpZ2h0IHR5cGUhCisgIHJldHVybiAwOworfQorCitJbml0ICpTdHJpbmdSZWNUeTo6Y29udmVydFZhbHVlKFVuT3BJbml0ICpCTykgeworICBpZiAoQk8tPmdldE9wY29kZSgpID09IFVuT3BJbml0OjpDQVNUKSB7CisgICAgSW5pdCAqTCA9IEJPLT5nZXRPcGVyYW5kKCktPmNvbnZlcnRJbml0aWFsaXplclRvKHRoaXMpOworICAgIGlmIChMID09IDApIHJldHVybiAwOworICAgIGlmIChMICE9IEJPLT5nZXRPcGVyYW5kKCkpCisgICAgICByZXR1cm4gbmV3IFVuT3BJbml0KFVuT3BJbml0OjpDQVNULCBMLCBuZXcgU3RyaW5nUmVjVHkpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIHJldHVybiBjb252ZXJ0VmFsdWUoKFR5cGVkSW5pdCopQk8pOworfQorCitJbml0ICpTdHJpbmdSZWNUeTo6Y29udmVydFZhbHVlKEJpbk9wSW5pdCAqQk8pIHsKKyAgaWYgKEJPLT5nZXRPcGNvZGUoKSA9PSBCaW5PcEluaXQ6OlNUUkNPTkNBVCkgeworICAgIEluaXQgKkwgPSBCTy0+Z2V0TEhTKCktPmNvbnZlcnRJbml0aWFsaXplclRvKHRoaXMpOworICAgIEluaXQgKlIgPSBCTy0+Z2V0UkhTKCktPmNvbnZlcnRJbml0aWFsaXplclRvKHRoaXMpOworICAgIGlmIChMID09IDAgfHwgUiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoTCAhPSBCTy0+Z2V0TEhTKCkgfHwgUiAhPSBCTy0+Z2V0UkhTKCkpCisgICAgICByZXR1cm4gbmV3IEJpbk9wSW5pdChCaW5PcEluaXQ6OlNUUkNPTkNBVCwgTCwgUiwgbmV3IFN0cmluZ1JlY1R5KTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgaWYgKEJPLT5nZXRPcGNvZGUoKSA9PSBCaW5PcEluaXQ6Ok5BTUVDT05DQVQpIHsKKyAgICBpZiAoQk8tPmdldFR5cGUoKS0+Z2V0QXNTdHJpbmcoKSA9PSBnZXRBc1N0cmluZygpKSB7CisgICAgICBJbml0ICpMID0gQk8tPmdldExIUygpLT5jb252ZXJ0SW5pdGlhbGl6ZXJUbyh0aGlzKTsKKyAgICAgIEluaXQgKlIgPSBCTy0+Z2V0UkhTKCktPmNvbnZlcnRJbml0aWFsaXplclRvKHRoaXMpOworICAgICAgaWYgKEwgPT0gMCB8fCBSID09IDApIHJldHVybiAwOworICAgICAgaWYgKEwgIT0gQk8tPmdldExIUygpIHx8IFIgIT0gQk8tPmdldFJIUygpKQorICAgICAgICByZXR1cm4gbmV3IEJpbk9wSW5pdChCaW5PcEluaXQ6Ok5BTUVDT05DQVQsIEwsIFIsIG5ldyBTdHJpbmdSZWNUeSk7CisgICAgICByZXR1cm4gQk87CisgICAgfQorICB9CisKKyAgcmV0dXJuIGNvbnZlcnRWYWx1ZSgoVHlwZWRJbml0KilCTyk7Cit9CisKKworSW5pdCAqU3RyaW5nUmVjVHk6OmNvbnZlcnRWYWx1ZShUeXBlZEluaXQgKlRJKSB7CisgIGlmIChkeW5hbWljX2Nhc3Q8U3RyaW5nUmVjVHkqPihUSS0+Z2V0VHlwZSgpKSkKKyAgICByZXR1cm4gVEk7ICAvLyBBY2NlcHQgdmFyaWFibGUgaWYgYWxyZWFkeSBvZiB0aGUgcmlnaHQgdHlwZSEKKyAgcmV0dXJuIDA7Cit9CisKK3N0ZDo6c3RyaW5nIExpc3RSZWNUeTo6Z2V0QXNTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiAibGlzdDwiICsgVHktPmdldEFzU3RyaW5nKCkgKyAiPiI7Cit9CisKK0luaXQgKkxpc3RSZWNUeTo6Y29udmVydFZhbHVlKExpc3RJbml0ICpMSSkgeworICBzdGQ6OnZlY3RvcjxJbml0Kj4gRWxlbWVudHM7CisKKyAgLy8gVmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgbGlzdCBhcmUgc3ViY2xhc3NlcyBvZiB0aGUKKyAgLy8gYXBwcm9wcmlhdGUgY2xhc3MhCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBMSS0+Z2V0U2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoSW5pdCAqQ0kgPSBMSS0+Z2V0RWxlbWVudChpKS0+Y29udmVydEluaXRpYWxpemVyVG8oVHkpKQorICAgICAgRWxlbWVudHMucHVzaF9iYWNrKENJKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKworICBMaXN0UmVjVHkgKkxUeXBlID0gZHluYW1pY19jYXN0PExpc3RSZWNUeSo+KExJLT5nZXRUeXBlKCkpOworICBpZiAoTFR5cGUgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIG5ldyBMaXN0SW5pdChFbGVtZW50cywgbmV3IExpc3RSZWNUeShUeSkpOworfQorCitJbml0ICpMaXN0UmVjVHk6OmNvbnZlcnRWYWx1ZShUeXBlZEluaXQgKlRJKSB7CisgIC8vIEVuc3VyZSB0aGF0IFRJIGlzIGNvbXBhdGlibGUgd2l0aCBvdXIgY2xhc3MuCisgIGlmIChMaXN0UmVjVHkgKkxSVCA9IGR5bmFtaWNfY2FzdDxMaXN0UmVjVHkqPihUSS0+Z2V0VHlwZSgpKSkKKyAgICBpZiAoTFJULT5nZXRFbGVtZW50VHlwZSgpLT50eXBlSXNDb252ZXJ0aWJsZVRvKGdldEVsZW1lbnRUeXBlKCkpKQorICAgICAgcmV0dXJuIFRJOworICByZXR1cm4gMDsKK30KKworSW5pdCAqQ29kZVJlY1R5Ojpjb252ZXJ0VmFsdWUoVHlwZWRJbml0ICpUSSkgeworICBpZiAoVEktPmdldFR5cGUoKS0+dHlwZUlzQ29udmVydGlibGVUbyh0aGlzKSkKKyAgICByZXR1cm4gVEk7CisgIHJldHVybiAwOworfQorCitJbml0ICpEYWdSZWNUeTo6Y29udmVydFZhbHVlKFR5cGVkSW5pdCAqVEkpIHsKKyAgaWYgKFRJLT5nZXRUeXBlKCktPnR5cGVJc0NvbnZlcnRpYmxlVG8odGhpcykpCisgICAgcmV0dXJuIFRJOworICByZXR1cm4gMDsKK30KKworSW5pdCAqRGFnUmVjVHk6OmNvbnZlcnRWYWx1ZShVbk9wSW5pdCAqQk8pIHsKKyAgaWYgKEJPLT5nZXRPcGNvZGUoKSA9PSBVbk9wSW5pdDo6Q0FTVCkgeworICAgIEluaXQgKkwgPSBCTy0+Z2V0T3BlcmFuZCgpLT5jb252ZXJ0SW5pdGlhbGl6ZXJUbyh0aGlzKTsKKyAgICBpZiAoTCA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoTCAhPSBCTy0+Z2V0T3BlcmFuZCgpKQorICAgICAgcmV0dXJuIG5ldyBVbk9wSW5pdChVbk9wSW5pdDo6Q0FTVCwgTCwgbmV3IERhZ1JlY1R5KTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0luaXQgKkRhZ1JlY1R5Ojpjb252ZXJ0VmFsdWUoQmluT3BJbml0ICpCTykgeworICBpZiAoQk8tPmdldE9wY29kZSgpID09IEJpbk9wSW5pdDo6Q09OQ0FUKSB7CisgICAgSW5pdCAqTCA9IEJPLT5nZXRMSFMoKS0+Y29udmVydEluaXRpYWxpemVyVG8odGhpcyk7CisgICAgSW5pdCAqUiA9IEJPLT5nZXRSSFMoKS0+Y29udmVydEluaXRpYWxpemVyVG8odGhpcyk7CisgICAgaWYgKEwgPT0gMCB8fCBSID09IDApIHJldHVybiAwOworICAgIGlmIChMICE9IEJPLT5nZXRMSFMoKSB8fCBSICE9IEJPLT5nZXRSSFMoKSkKKyAgICAgIHJldHVybiBuZXcgQmluT3BJbml0KEJpbk9wSW5pdDo6Q09OQ0FULCBMLCBSLCBuZXcgRGFnUmVjVHkpOworICAgIHJldHVybiBCTzsKKyAgfQorICBpZiAoQk8tPmdldE9wY29kZSgpID09IEJpbk9wSW5pdDo6TkFNRUNPTkNBVCkgeworICAgIGlmIChCTy0+Z2V0VHlwZSgpLT5nZXRBc1N0cmluZygpID09IGdldEFzU3RyaW5nKCkpIHsKKyAgICAgIEluaXQgKkwgPSBCTy0+Z2V0TEhTKCktPmNvbnZlcnRJbml0aWFsaXplclRvKHRoaXMpOworICAgICAgSW5pdCAqUiA9IEJPLT5nZXRSSFMoKS0+Y29udmVydEluaXRpYWxpemVyVG8odGhpcyk7CisgICAgICBpZiAoTCA9PSAwIHx8IFIgPT0gMCkgcmV0dXJuIDA7CisgICAgICBpZiAoTCAhPSBCTy0+Z2V0TEhTKCkgfHwgUiAhPSBCTy0+Z2V0UkhTKCkpCisgICAgICAgIHJldHVybiBuZXcgQmluT3BJbml0KEJpbk9wSW5pdDo6Q09OQ0FULCBMLCBSLCBuZXcgRGFnUmVjVHkpOworICAgICAgcmV0dXJuIEJPOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RkOjpzdHJpbmcgUmVjb3JkUmVjVHk6OmdldEFzU3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gUmVjLT5nZXROYW1lKCk7Cit9CisKK0luaXQgKlJlY29yZFJlY1R5Ojpjb252ZXJ0VmFsdWUoRGVmSW5pdCAqREkpIHsKKyAgLy8gRW5zdXJlIHRoYXQgREkgaXMgYSBzdWJjbGFzcyBvZiBSZWMuCisgIGlmICghREktPmdldERlZigpLT5pc1N1YkNsYXNzT2YoUmVjKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIERJOworfQorCitJbml0ICpSZWNvcmRSZWNUeTo6Y29udmVydFZhbHVlKFR5cGVkSW5pdCAqVEkpIHsKKyAgLy8gRW5zdXJlIHRoYXQgVEkgaXMgY29tcGF0aWJsZSB3aXRoIFJlYy4KKyAgaWYgKFJlY29yZFJlY1R5ICpSUlQgPSBkeW5hbWljX2Nhc3Q8UmVjb3JkUmVjVHkqPihUSS0+Z2V0VHlwZSgpKSkKKyAgICBpZiAoUlJULT5nZXRSZWNvcmQoKS0+aXNTdWJDbGFzc09mKGdldFJlY29yZCgpKSB8fAorICAgICAgICBSUlQtPmdldFJlY29yZCgpID09IGdldFJlY29yZCgpKQorICAgICAgcmV0dXJuIFRJOworICByZXR1cm4gMDsKK30KKworYm9vbCBSZWNvcmRSZWNUeTo6YmFzZUNsYXNzT2YoY29uc3QgUmVjb3JkUmVjVHkgKlJIUykgY29uc3QgeworICBpZiAoUmVjID09IFJIUy0+Z2V0UmVjb3JkKCkgfHwgUkhTLT5nZXRSZWNvcmQoKS0+aXNTdWJDbGFzc09mKFJlYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJlNDID0gUmVjLT5nZXRTdXBlckNsYXNzZXMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNDLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFJIUy0+Z2V0UmVjb3JkKCktPmlzU3ViQ2xhc3NPZihTQ1tpXSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIHJlc29sdmVUeXBlcyAtIEZpbmQgYSBjb21tb24gdHlwZSB0aGF0IFQxIGFuZCBUMiBjb252ZXJ0IHRvLgorLy8vIFJldHVybiAwIGlmIG5vIHN1Y2ggdHlwZSBleGlzdHMuCisvLy8KK1JlY1R5ICpsbHZtOjpyZXNvbHZlVHlwZXMoUmVjVHkgKlQxLCBSZWNUeSAqVDIpIHsKKyAgaWYgKCFUMS0+dHlwZUlzQ29udmVydGlibGVUbyhUMikpIHsKKyAgICBpZiAoIVQyLT50eXBlSXNDb252ZXJ0aWJsZVRvKFQxKSkgeworICAgICAgLy8gSWYgb25lIGlzIGEgUmVjb3JkIHR5cGUsIGNoZWNrIHN1cGVyY2xhc3NlcworICAgICAgUmVjb3JkUmVjVHkgKlJlY1R5MSA9IGR5bmFtaWNfY2FzdDxSZWNvcmRSZWNUeSo+KFQxKTsKKyAgICAgIGlmIChSZWNUeTEpIHsKKyAgICAgICAgLy8gU2VlIGlmIFQyIGluaGVyaXRzIGZyb20gYSB0eXBlIFQxIGFsc28gaW5oZXJpdHMgZnJvbQorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gJlQxU3VwZXJDbGFzc2VzID0KKyAgICAgICAgICBSZWNUeTEtPmdldFJlY29yZCgpLT5nZXRTdXBlckNsYXNzZXMoKTsKKyAgICAgICAgZm9yKHN0ZDo6dmVjdG9yPFJlY29yZCAqPjo6Y29uc3RfaXRlcmF0b3IgaSA9IFQxU3VwZXJDbGFzc2VzLmJlZ2luKCksCisgICAgICAgICAgICAgIGllbmQgPSBUMVN1cGVyQ2xhc3Nlcy5lbmQoKTsKKyAgICAgICAgICAgIGkgIT0gaWVuZDsKKyAgICAgICAgICAgICsraSkgeworICAgICAgICAgIFJlY29yZFJlY1R5ICpTdXBlclJlY1R5MSA9IG5ldyBSZWNvcmRSZWNUeSgqaSk7CisgICAgICAgICAgUmVjVHkgKk5ld1R5cGUxID0gcmVzb2x2ZVR5cGVzKFN1cGVyUmVjVHkxLCBUMik7CisgICAgICAgICAgaWYgKE5ld1R5cGUxICE9IDApIHsKKyAgICAgICAgICAgIGlmIChOZXdUeXBlMSAhPSBTdXBlclJlY1R5MSkgeworICAgICAgICAgICAgICBkZWxldGUgU3VwZXJSZWNUeTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTmV3VHlwZTE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBSZWNvcmRSZWNUeSAqUmVjVHkyID0gZHluYW1pY19jYXN0PFJlY29yZFJlY1R5Kj4oVDIpOworICAgICAgaWYgKFJlY1R5MikgeworICAgICAgICAvLyBTZWUgaWYgVDEgaW5oZXJpdHMgZnJvbSBhIHR5cGUgVDIgYWxzbyBpbmhlcml0cyBmcm9tCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCAqPiAmVDJTdXBlckNsYXNzZXMgPQorICAgICAgICAgIFJlY1R5Mi0+Z2V0UmVjb3JkKCktPmdldFN1cGVyQ2xhc3NlcygpOworICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCAqPjo6Y29uc3RfaXRlcmF0b3IgaSA9IFQyU3VwZXJDbGFzc2VzLmJlZ2luKCksCisgICAgICAgICAgICAgIGllbmQgPSBUMlN1cGVyQ2xhc3Nlcy5lbmQoKTsKKyAgICAgICAgICAgIGkgIT0gaWVuZDsKKyAgICAgICAgICAgICsraSkgeworICAgICAgICAgIFJlY29yZFJlY1R5ICpTdXBlclJlY1R5MiA9IG5ldyBSZWNvcmRSZWNUeSgqaSk7CisgICAgICAgICAgUmVjVHkgKk5ld1R5cGUyID0gcmVzb2x2ZVR5cGVzKFQxLCBTdXBlclJlY1R5Mik7CisgICAgICAgICAgaWYgKE5ld1R5cGUyICE9IDApIHsKKyAgICAgICAgICAgIGlmIChOZXdUeXBlMiAhPSBTdXBlclJlY1R5MikgeworICAgICAgICAgICAgICBkZWxldGUgU3VwZXJSZWNUeTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTmV3VHlwZTI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIFQyOworICB9CisgIHJldHVybiBUMTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgSW5pdGlhbGl6ZXIgaW1wbGVtZW50YXRpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit2b2lkIEluaXQ6OmR1bXAoKSBjb25zdCB7IHJldHVybiBwcmludChlcnJzKCkpOyB9CisKK0luaXQgKkJpdHNJbml0Ojpjb252ZXJ0SW5pdGlhbGl6ZXJCaXRSYW5nZShjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJkJpdHMpIHsKKyAgQml0c0luaXQgKkJJID0gbmV3IEJpdHNJbml0KEJpdHMuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEJpdHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChCaXRzW2ldID49IGdldE51bUJpdHMoKSkgeworICAgICAgZGVsZXRlIEJJOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEJJLT5zZXRCaXQoaSwgZ2V0Qml0KEJpdHNbaV0pKTsKKyAgfQorICByZXR1cm4gQkk7Cit9CisKK3N0ZDo6c3RyaW5nIEJpdHNJbml0OjpnZXRBc1N0cmluZygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgUmVzdWx0ID0gInsgIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bUJpdHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoaSkgUmVzdWx0ICs9ICIsICI7CisgICAgaWYgKEluaXQgKkJpdCA9IGdldEJpdChlLWktMSkpCisgICAgICBSZXN1bHQgKz0gQml0LT5nZXRBc1N0cmluZygpOworICAgIGVsc2UKKyAgICAgIFJlc3VsdCArPSAiKiI7CisgIH0KKyAgcmV0dXJuIFJlc3VsdCArICIgfSI7Cit9CisKKy8vIHJlc29sdmVSZWZlcmVuY2VzIC0gSWYgdGhlcmUgYXJlIGFueSBmaWVsZCByZWZlcmVuY2VzIHRoYXQgcmVmZXIgdG8gZmllbGRzCisvLyB0aGF0IGhhdmUgYmVlbiBmaWxsZWQgaW4sIHdlIGNhbiBwcm9wYWdhdGUgdGhlIHZhbHVlcyBub3cuCisvLworSW5pdCAqQml0c0luaXQ6OnJlc29sdmVSZWZlcmVuY2VzKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSVikgeworICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgQml0c0luaXQgKk5ldyA9IG5ldyBCaXRzSW5pdChnZXROdW1CaXRzKCkpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCaXRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBJbml0ICpCOworICAgIEluaXQgKkN1ckJpdCA9IGdldEJpdChpKTsKKworICAgIGRvIHsKKyAgICAgIEIgPSBDdXJCaXQ7CisgICAgICBDdXJCaXQgPSBDdXJCaXQtPnJlc29sdmVSZWZlcmVuY2VzKFIsIFJWKTsKKyAgICAgIENoYW5nZWQgfD0gQiAhPSBDdXJCaXQ7CisgICAgfSB3aGlsZSAoQiAhPSBDdXJCaXQpOworICAgIE5ldy0+c2V0Qml0KGksIEN1ckJpdCk7CisgIH0KKworICBpZiAoQ2hhbmdlZCkKKyAgICByZXR1cm4gTmV3OworICBkZWxldGUgTmV3OworICByZXR1cm4gdGhpczsKK30KKworc3RkOjpzdHJpbmcgSW50SW5pdDo6Z2V0QXNTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBpdG9zdHIoVmFsdWUpOworfQorCitJbml0ICpJbnRJbml0Ojpjb252ZXJ0SW5pdGlhbGl6ZXJCaXRSYW5nZShjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJkJpdHMpIHsKKyAgQml0c0luaXQgKkJJID0gbmV3IEJpdHNJbml0KEJpdHMuc2l6ZSgpKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQml0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKEJpdHNbaV0gPj0gNjQpIHsKKyAgICAgIGRlbGV0ZSBCSTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBCSS0+c2V0Qml0KGksIG5ldyBCaXRJbml0KFZhbHVlICYgKElOVDY0X0MoMSkgPDwgQml0c1tpXSkpKTsKKyAgfQorICByZXR1cm4gQkk7Cit9CisKK0luaXQgKkxpc3RJbml0Ojpjb252ZXJ0SW5pdExpc3RTbGljZShjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJkVsZW1lbnRzKSB7CisgIHN0ZDo6dmVjdG9yPEluaXQqPiBWYWxzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRWxlbWVudHMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChFbGVtZW50c1tpXSA+PSBnZXRTaXplKCkpCisgICAgICByZXR1cm4gMDsKKyAgICBWYWxzLnB1c2hfYmFjayhnZXRFbGVtZW50KEVsZW1lbnRzW2ldKSk7CisgIH0KKyAgcmV0dXJuIG5ldyBMaXN0SW5pdChWYWxzLCBnZXRUeXBlKCkpOworfQorCitSZWNvcmQgKkxpc3RJbml0OjpnZXRFbGVtZW50QXNSZWNvcmQodW5zaWduZWQgaSkgY29uc3QgeworICBhc3NlcnQoaSA8IFZhbHVlcy5zaXplKCkgJiYgIkxpc3QgZWxlbWVudCBpbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgIERlZkluaXQgKkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihWYWx1ZXNbaV0pOworICBpZiAoREkgPT0gMCkgdGhyb3cgIkV4cGVjdGVkIHJlY29yZCBpbiBsaXN0ISI7CisgIHJldHVybiBESS0+Z2V0RGVmKCk7Cit9CisKK0luaXQgKkxpc3RJbml0OjpyZXNvbHZlUmVmZXJlbmNlcyhSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYpIHsKKyAgc3RkOjp2ZWN0b3I8SW5pdCo+IFJlc29sdmVkOworICBSZXNvbHZlZC5yZXNlcnZlKGdldFNpemUoKSk7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXRTaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgSW5pdCAqRTsKKyAgICBJbml0ICpDdXJFbHQgPSBnZXRFbGVtZW50KGkpOworCisgICAgZG8geworICAgICAgRSA9IEN1ckVsdDsKKyAgICAgIEN1ckVsdCA9IEN1ckVsdC0+cmVzb2x2ZVJlZmVyZW5jZXMoUiwgUlYpOworICAgICAgQ2hhbmdlZCB8PSBFICE9IEN1ckVsdDsKKyAgICB9IHdoaWxlIChFICE9IEN1ckVsdCk7CisgICAgUmVzb2x2ZWQucHVzaF9iYWNrKEUpOworICB9CisKKyAgaWYgKENoYW5nZWQpCisgICAgcmV0dXJuIG5ldyBMaXN0SW5pdChSZXNvbHZlZCwgZ2V0VHlwZSgpKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0luaXQgKkxpc3RJbml0OjpyZXNvbHZlTGlzdEVsZW1lbnRSZWZlcmVuY2UoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKklSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWx0KSB7CisgIGlmIChFbHQgPj0gZ2V0U2l6ZSgpKQorICAgIHJldHVybiAwOyAgLy8gT3V0IG9mIHJhbmdlIHJlZmVyZW5jZS4KKyAgSW5pdCAqRSA9IGdldEVsZW1lbnQoRWx0KTsKKyAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgc2V0IHRvIHNvbWUgdmFsdWUsIG9yIGlmIHdlIGFyZSByZXNvbHZpbmcgYSByZWZlcmVuY2UKKyAgLy8gdG8gYSBzcGVjaWZpYyB2YXJpYWJsZSBhbmQgdGhhdCB2YXJpYWJsZSBpcyBleHBsaWNpdGx5IHVuc2V0LCB0aGVuCisgIC8vIHJlcGxhY2UgdGhlIFZhckxpc3RFbGVtZW50SW5pdCB3aXRoIGl0LgorICBpZiAoSVJWIHx8ICFkeW5hbWljX2Nhc3Q8VW5zZXRJbml0Kj4oRSkpCisgICAgcmV0dXJuIEU7CisgIHJldHVybiAwOworfQorCitzdGQ6OnN0cmluZyBMaXN0SW5pdDo6Z2V0QXNTdHJpbmcoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIFJlc3VsdCA9ICJbIjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHVlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKGkpIFJlc3VsdCArPSAiLCAiOworICAgIFJlc3VsdCArPSBWYWx1ZXNbaV0tPmdldEFzU3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIFJlc3VsdCArICJdIjsKK30KKworSW5pdCAqT3BJbml0OjpyZXNvbHZlQml0UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpJUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQml0KSB7CisgIEluaXQgKkZvbGRlZCA9IEZvbGQoJlIsIDApOworCisgIGlmIChGb2xkZWQgIT0gdGhpcykgeworICAgIFR5cGVkSW5pdCAqVHlwZWQgPSBkeW5hbWljX2Nhc3Q8VHlwZWRJbml0ICo+KEZvbGRlZCk7CisgICAgaWYgKFR5cGVkKSB7CisgICAgICByZXR1cm4gVHlwZWQtPnJlc29sdmVCaXRSZWZlcmVuY2UoUiwgSVJWLCBCaXQpOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitJbml0ICpPcEluaXQ6OnJlc29sdmVMaXN0RWxlbWVudFJlZmVyZW5jZShSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqSVJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWx0KSB7CisgIEluaXQgKkZvbGRlZCA9IEZvbGQoJlIsIDApOworCisgIGlmIChGb2xkZWQgIT0gdGhpcykgeworICAgIFR5cGVkSW5pdCAqVHlwZWQgPSBkeW5hbWljX2Nhc3Q8VHlwZWRJbml0ICo+KEZvbGRlZCk7CisgICAgaWYgKFR5cGVkKSB7CisgICAgICByZXR1cm4gVHlwZWQtPnJlc29sdmVMaXN0RWxlbWVudFJlZmVyZW5jZShSLCBJUlYsIEVsdCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK0luaXQgKlVuT3BJbml0OjpGb2xkKFJlY29yZCAqQ3VyUmVjLCBNdWx0aUNsYXNzICpDdXJNdWx0aUNsYXNzKSB7CisgIHN3aXRjaCAoZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gdW5vcCIpOworICBjYXNlIENBU1Q6IHsKKyAgICBpZiAoZ2V0VHlwZSgpLT5nZXRBc1N0cmluZygpID09ICJzdHJpbmciKSB7CisgICAgICBTdHJpbmdJbml0ICpMSFNzID0gZHluYW1pY19jYXN0PFN0cmluZ0luaXQqPihMSFMpOworICAgICAgaWYgKExIU3MpIHsKKyAgICAgICAgcmV0dXJuIExIU3M7CisgICAgICB9CisKKyAgICAgIERlZkluaXQgKkxIU2QgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KExIUyk7CisgICAgICBpZiAoTEhTZCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0luaXQoTEhTZC0+Z2V0RGVmKCktPmdldE5hbWUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFN0cmluZ0luaXQgKkxIU3MgPSBkeW5hbWljX2Nhc3Q8U3RyaW5nSW5pdCo+KExIUyk7CisgICAgICBpZiAoTEhTcykgeworICAgICAgICBzdGQ6OnN0cmluZyBOYW1lID0gTEhTcy0+Z2V0VmFsdWUoKTsKKworICAgICAgICAvLyBGcm9tIFRHUGFyc2VyOjpQYXJzZUlEVmFsdWUKKyAgICAgICAgaWYgKEN1clJlYykgeworICAgICAgICAgIGlmIChjb25zdCBSZWNvcmRWYWwgKlJWID0gQ3VyUmVjLT5nZXRWYWx1ZShOYW1lKSkgeworICAgICAgICAgICAgaWYgKFJWLT5nZXRUeXBlKCkgIT0gZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgIHRocm93ICJ0eXBlIG1pc21hdGNoIGluIG5hbWVjb25jYXQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBWYXJJbml0KE5hbWUsIFJWLT5nZXRUeXBlKCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIHN0ZDo6c3RyaW5nIFRlbXBsYXRlQXJnTmFtZSA9IEN1clJlYy0+Z2V0TmFtZSgpKyI6IitOYW1lOworICAgICAgICAgIGlmIChDdXJSZWMtPmlzVGVtcGxhdGVBcmcoVGVtcGxhdGVBcmdOYW1lKSkgeworICAgICAgICAgICAgY29uc3QgUmVjb3JkVmFsICpSViA9IEN1clJlYy0+Z2V0VmFsdWUoVGVtcGxhdGVBcmdOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydChSViAmJiAiVGVtcGxhdGUgYXJnIGRvZXNuJ3QgZXhpc3Q/PyIpOworCisgICAgICAgICAgICBpZiAoUlYtPmdldFR5cGUoKSAhPSBnZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgdGhyb3cgInR5cGUgbWlzbWF0Y2ggaW4gbmFtZWNvbmNhdCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmFySW5pdChUZW1wbGF0ZUFyZ05hbWUsIFJWLT5nZXRUeXBlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChDdXJNdWx0aUNsYXNzKSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgTUNOYW1lID0gQ3VyTXVsdGlDbGFzcy0+UmVjLmdldE5hbWUoKSsiOjoiK05hbWU7CisgICAgICAgICAgaWYgKEN1ck11bHRpQ2xhc3MtPlJlYy5pc1RlbXBsYXRlQXJnKE1DTmFtZSkpIHsKKyAgICAgICAgICAgIGNvbnN0IFJlY29yZFZhbCAqUlYgPSBDdXJNdWx0aUNsYXNzLT5SZWMuZ2V0VmFsdWUoTUNOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydChSViAmJiAiVGVtcGxhdGUgYXJnIGRvZXNuJ3QgZXhpc3Q/PyIpOworCisgICAgICAgICAgICBpZiAoUlYtPmdldFR5cGUoKSAhPSBnZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgdGhyb3cgInR5cGUgbWlzbWF0Y2ggaW4gbmFtZWNvbmNhdCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmFySW5pdChNQ05hbWUsIFJWLT5nZXRUeXBlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChSZWNvcmQgKkQgPSBSZWNvcmRzLmdldERlZihOYW1lKSkKKyAgICAgICAgICByZXR1cm4gbmV3IERlZkluaXQoRCk7CisKKyAgICAgICAgZXJycygpIDw8ICJWYXJpYWJsZSBub3QgZGVmaW5lZDogJyIgKyBOYW1lICsgIidcbiI7CisgICAgICAgIGFzc2VydCgwICYmICJWYXJpYWJsZSBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgQ0FSOiB7CisgICAgTGlzdEluaXQgKkxIU2wgPSBkeW5hbWljX2Nhc3Q8TGlzdEluaXQqPihMSFMpOworICAgIGlmIChMSFNsKSB7CisgICAgICBpZiAoTEhTbC0+Z2V0U2l6ZSgpID09IDApIHsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkVtcHR5IGxpc3QgaW4gY2FyIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcmV0dXJuIExIU2wtPmdldEVsZW1lbnQoMCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgQ0RSOiB7CisgICAgTGlzdEluaXQgKkxIU2wgPSBkeW5hbWljX2Nhc3Q8TGlzdEluaXQqPihMSFMpOworICAgIGlmIChMSFNsKSB7CisgICAgICBpZiAoTEhTbC0+Z2V0U2l6ZSgpID09IDApIHsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkVtcHR5IGxpc3QgaW4gY2RyIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgTGlzdEluaXQgKlJlc3VsdCA9IG5ldyBMaXN0SW5pdChMSFNsLT5iZWdpbigpKzEsIExIU2wtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNsLT5nZXRUeXBlKCkpOworICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBMTlVMTDogeworICAgIExpc3RJbml0ICpMSFNsID0gZHluYW1pY19jYXN0PExpc3RJbml0Kj4oTEhTKTsKKyAgICBpZiAoTEhTbCkgeworICAgICAgaWYgKExIU2wtPmdldFNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50SW5pdCgxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBuZXcgSW50SW5pdCgwKTsKKyAgICAgIH0KKyAgICB9CisgICAgU3RyaW5nSW5pdCAqTEhTcyA9IGR5bmFtaWNfY2FzdDxTdHJpbmdJbml0Kj4oTEhTKTsKKyAgICBpZiAoTEhTcykgeworICAgICAgaWYgKExIU3MtPmdldFZhbHVlKCkuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gbmV3IEludEluaXQoMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbmV3IEludEluaXQoMCk7CisgICAgICB9CisgICAgfQorCisgICAgYnJlYWs7CisgIH0KKyAgfQorICByZXR1cm4gdGhpczsKK30KKworSW5pdCAqVW5PcEluaXQ6OnJlc29sdmVSZWZlcmVuY2VzKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSVikgeworICBJbml0ICpsaHMgPSBMSFMtPnJlc29sdmVSZWZlcmVuY2VzKFIsIFJWKTsKKworICBpZiAoTEhTICE9IGxocykKKyAgICByZXR1cm4gKG5ldyBVbk9wSW5pdChnZXRPcGNvZGUoKSwgbGhzLCBnZXRUeXBlKCkpKS0+Rm9sZCgmUiwgMCk7CisgIHJldHVybiBGb2xkKCZSLCAwKTsKK30KKworc3RkOjpzdHJpbmcgVW5PcEluaXQ6OmdldEFzU3RyaW5nKCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBSZXN1bHQ7CisgIHN3aXRjaCAoT3BjKSB7CisgIGNhc2UgQ0FTVDogUmVzdWx0ID0gIiFjYXN0PCIgKyBnZXRUeXBlKCktPmdldEFzU3RyaW5nKCkgKyAiPiI7IGJyZWFrOworICBjYXNlIENBUjogUmVzdWx0ID0gIiFjYXIiOyBicmVhazsKKyAgY2FzZSBDRFI6IFJlc3VsdCA9ICIhY2RyIjsgYnJlYWs7CisgIGNhc2UgTE5VTEw6IFJlc3VsdCA9ICIhbnVsbCI7IGJyZWFrOworICB9CisgIHJldHVybiBSZXN1bHQgKyAiKCIgKyBMSFMtPmdldEFzU3RyaW5nKCkgKyAiKSI7Cit9CisKK1JlY1R5ICpVbk9wSW5pdDo6Z2V0RmllbGRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZGaWVsZE5hbWUpIGNvbnN0IHsKKyAgc3dpdGNoIChnZXRPcGNvZGUoKSkgeworICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biB1bm9wIik7CisgIGNhc2UgQ0FTVDogeworICAgIFJlY29yZFJlY1R5ICpSZWNvcmRUeXBlID0gZHluYW1pY19jYXN0PFJlY29yZFJlY1R5ICo+KGdldFR5cGUoKSk7CisgICAgaWYgKFJlY29yZFR5cGUpIHsKKyAgICAgIFJlY29yZFZhbCAqRmllbGQgPSBSZWNvcmRUeXBlLT5nZXRSZWNvcmQoKS0+Z2V0VmFsdWUoRmllbGROYW1lKTsKKyAgICAgIGlmIChGaWVsZCkgeworICAgICAgICByZXR1cm4gRmllbGQtPmdldFR5cGUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworSW5pdCAqQmluT3BJbml0OjpGb2xkKFJlY29yZCAqQ3VyUmVjLCBNdWx0aUNsYXNzICpDdXJNdWx0aUNsYXNzKSB7CisgIHN3aXRjaCAoZ2V0T3Bjb2RlKCkpIHsKKyAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gYmlub3AiKTsKKyAgY2FzZSBDT05DQVQ6IHsKKyAgICBEYWdJbml0ICpMSFNzID0gZHluYW1pY19jYXN0PERhZ0luaXQqPihMSFMpOworICAgIERhZ0luaXQgKlJIU3MgPSBkeW5hbWljX2Nhc3Q8RGFnSW5pdCo+KFJIUyk7CisgICAgaWYgKExIU3MgJiYgUkhTcykgeworICAgICAgRGVmSW5pdCAqTE9wID0gZHluYW1pY19jYXN0PERlZkluaXQqPihMSFNzLT5nZXRPcGVyYXRvcigpKTsKKyAgICAgIERlZkluaXQgKlJPcCA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oUkhTcy0+Z2V0T3BlcmF0b3IoKSk7CisgICAgICBpZiAoTE9wID09IDAgfHwgUk9wID09IDAgfHwgTE9wLT5nZXREZWYoKSAhPSBST3AtPmdldERlZigpKQorICAgICAgICB0aHJvdyAiQ29uY2F0ZWQgRGFnIG9wZXJhdG9ycyBkbyBub3QgbWF0Y2ghIjsKKyAgICAgIHN0ZDo6dmVjdG9yPEluaXQqPiBBcmdzOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFyZ05hbWVzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExIU3MtPmdldE51bUFyZ3MoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgQXJncy5wdXNoX2JhY2soTEhTcy0+Z2V0QXJnKGkpKTsKKyAgICAgICAgQXJnTmFtZXMucHVzaF9iYWNrKExIU3MtPmdldEFyZ05hbWUoaSkpOworICAgICAgfQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJIU3MtPmdldE51bUFyZ3MoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgQXJncy5wdXNoX2JhY2soUkhTcy0+Z2V0QXJnKGkpKTsKKyAgICAgICAgQXJnTmFtZXMucHVzaF9iYWNrKFJIU3MtPmdldEFyZ05hbWUoaSkpOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBEYWdJbml0KExIU3MtPmdldE9wZXJhdG9yKCksICIiLCBBcmdzLCBBcmdOYW1lcyk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgU1RSQ09OQ0FUOiB7CisgICAgU3RyaW5nSW5pdCAqTEhTcyA9IGR5bmFtaWNfY2FzdDxTdHJpbmdJbml0Kj4oTEhTKTsKKyAgICBTdHJpbmdJbml0ICpSSFNzID0gZHluYW1pY19jYXN0PFN0cmluZ0luaXQqPihSSFMpOworICAgIGlmIChMSFNzICYmIFJIU3MpCisgICAgICByZXR1cm4gbmV3IFN0cmluZ0luaXQoTEhTcy0+Z2V0VmFsdWUoKSArIFJIU3MtPmdldFZhbHVlKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgTkFNRUNPTkNBVDogeworICAgIFN0cmluZ0luaXQgKkxIU3MgPSBkeW5hbWljX2Nhc3Q8U3RyaW5nSW5pdCo+KExIUyk7CisgICAgU3RyaW5nSW5pdCAqUkhTcyA9IGR5bmFtaWNfY2FzdDxTdHJpbmdJbml0Kj4oUkhTKTsKKyAgICBpZiAoTEhTcyAmJiBSSFNzKSB7CisgICAgICBzdGQ6OnN0cmluZyBOYW1lKExIU3MtPmdldFZhbHVlKCkgKyBSSFNzLT5nZXRWYWx1ZSgpKTsKKworICAgICAgLy8gRnJvbSBUR1BhcnNlcjo6UGFyc2VJRFZhbHVlCisgICAgICBpZiAoQ3VyUmVjKSB7CisgICAgICAgIGlmIChjb25zdCBSZWNvcmRWYWwgKlJWID0gQ3VyUmVjLT5nZXRWYWx1ZShOYW1lKSkgeworICAgICAgICAgIGlmIChSVi0+Z2V0VHlwZSgpICE9IGdldFR5cGUoKSkgeworICAgICAgICAgICAgdGhyb3cgInR5cGUgbWlzbWF0Y2ggaW4gbmFtZWNvbmNhdCI7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBuZXcgVmFySW5pdChOYW1lLCBSVi0+Z2V0VHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIFRlbXBsYXRlQXJnTmFtZSA9IEN1clJlYy0+Z2V0TmFtZSgpKyI6IitOYW1lOworICAgICAgICBpZiAoQ3VyUmVjLT5pc1RlbXBsYXRlQXJnKFRlbXBsYXRlQXJnTmFtZSkpIHsKKyAgICAgICAgICBjb25zdCBSZWNvcmRWYWwgKlJWID0gQ3VyUmVjLT5nZXRWYWx1ZShUZW1wbGF0ZUFyZ05hbWUpOworICAgICAgICAgIGFzc2VydChSViAmJiAiVGVtcGxhdGUgYXJnIGRvZXNuJ3QgZXhpc3Q/PyIpOworCisgICAgICAgICAgaWYgKFJWLT5nZXRUeXBlKCkgIT0gZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICB0aHJvdyAidHlwZSBtaXNtYXRjaCBpbiBuYW1lY29uY2F0IjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gbmV3IFZhckluaXQoVGVtcGxhdGVBcmdOYW1lLCBSVi0+Z2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoQ3VyTXVsdGlDbGFzcykgeworICAgICAgICBzdGQ6OnN0cmluZyBNQ05hbWUgPSBDdXJNdWx0aUNsYXNzLT5SZWMuZ2V0TmFtZSgpKyI6OiIrTmFtZTsKKyAgICAgICAgaWYgKEN1ck11bHRpQ2xhc3MtPlJlYy5pc1RlbXBsYXRlQXJnKE1DTmFtZSkpIHsKKyAgICAgICAgICBjb25zdCBSZWNvcmRWYWwgKlJWID0gQ3VyTXVsdGlDbGFzcy0+UmVjLmdldFZhbHVlKE1DTmFtZSk7CisgICAgICAgICAgYXNzZXJ0KFJWICYmICJUZW1wbGF0ZSBhcmcgZG9lc24ndCBleGlzdD8/Iik7CisKKyAgICAgICAgICBpZiAoUlYtPmdldFR5cGUoKSAhPSBnZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIHRocm93ICJ0eXBlIG1pc21hdGNoIGluIG5hbWVjb25jYXQiOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBuZXcgVmFySW5pdChNQ05hbWUsIFJWLT5nZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChSZWNvcmQgKkQgPSBSZWNvcmRzLmdldERlZihOYW1lKSkKKyAgICAgICAgcmV0dXJuIG5ldyBEZWZJbml0KEQpOworCisgICAgICBlcnJzKCkgPDwgIlZhcmlhYmxlIG5vdCBkZWZpbmVkIGluICFuYW1lY29uY2F0OiAnIiArIE5hbWUgKyAiJ1xuIjsKKyAgICAgIGFzc2VydCgwICYmICJWYXJpYWJsZSBub3QgZm91bmQgaW4gIW5hbWVjb25jYXQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIEVROiB7CisgICAgLy8gdHJ5IHRvIGZvbGQgZXEgY29tcGFyaXNvbiBmb3IgJ2JpdCcgYW5kICdpbnQnLCBvdGhlcndpc2UgZmFsbGJhY2sKKyAgICAvLyB0byBzdHJpbmcgb2JqZWN0cy4KKyAgICBJbnRJbml0KiBMID0KKyAgICAgIGR5bmFtaWNfY2FzdDxJbnRJbml0Kj4oTEhTLT5jb252ZXJ0SW5pdGlhbGl6ZXJUbyhuZXcgSW50UmVjVHkoKSkpOworICAgIEludEluaXQqIFIgPQorICAgICAgZHluYW1pY19jYXN0PEludEluaXQqPihSSFMtPmNvbnZlcnRJbml0aWFsaXplclRvKG5ldyBJbnRSZWNUeSgpKSk7CisKKyAgICBpZiAoTCAmJiBSKQorICAgICAgcmV0dXJuIG5ldyBJbnRJbml0KEwtPmdldFZhbHVlKCkgPT0gUi0+Z2V0VmFsdWUoKSk7CisKKyAgICBTdHJpbmdJbml0ICpMSFNzID0gZHluYW1pY19jYXN0PFN0cmluZ0luaXQqPihMSFMpOworICAgIFN0cmluZ0luaXQgKlJIU3MgPSBkeW5hbWljX2Nhc3Q8U3RyaW5nSW5pdCo+KFJIUyk7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UndmUgcmVzb2x2ZWQKKyAgICBpZiAoTEhTcyAmJiBSSFNzKQorICAgICAgcmV0dXJuIG5ldyBJbnRJbml0KExIU3MtPmdldFZhbHVlKCkgPT0gUkhTcy0+Z2V0VmFsdWUoKSk7CisKKyAgICBicmVhazsKKyAgfQorICBjYXNlIFNITDoKKyAgY2FzZSBTUkE6CisgIGNhc2UgU1JMOiB7CisgICAgSW50SW5pdCAqTEhTaSA9IGR5bmFtaWNfY2FzdDxJbnRJbml0Kj4oTEhTKTsKKyAgICBJbnRJbml0ICpSSFNpID0gZHluYW1pY19jYXN0PEludEluaXQqPihSSFMpOworICAgIGlmIChMSFNpICYmIFJIU2kpIHsKKyAgICAgIGludDY0X3QgTEhTdiA9IExIU2ktPmdldFZhbHVlKCksIFJIU3YgPSBSSFNpLT5nZXRWYWx1ZSgpOworICAgICAgaW50NjRfdCBSZXN1bHQ7CisgICAgICBzd2l0Y2ggKGdldE9wY29kZSgpKSB7CisgICAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiQmFkIG9wY29kZSEiKTsKKyAgICAgIGNhc2UgU0hMOiBSZXN1bHQgPSBMSFN2IDw8IFJIU3Y7IGJyZWFrOworICAgICAgY2FzZSBTUkE6IFJlc3VsdCA9IExIU3YgPj4gUkhTdjsgYnJlYWs7CisgICAgICBjYXNlIFNSTDogUmVzdWx0ID0gKHVpbnQ2NF90KUxIU3YgPj4gKHVpbnQ2NF90KVJIU3Y7IGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBJbnRJbml0KFJlc3VsdCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIH0KKyAgcmV0dXJuIHRoaXM7Cit9CisKK0luaXQgKkJpbk9wSW5pdDo6cmVzb2x2ZVJlZmVyZW5jZXMoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWKSB7CisgIEluaXQgKmxocyA9IExIUy0+cmVzb2x2ZVJlZmVyZW5jZXMoUiwgUlYpOworICBJbml0ICpyaHMgPSBSSFMtPnJlc29sdmVSZWZlcmVuY2VzKFIsIFJWKTsKKworICBpZiAoTEhTICE9IGxocyB8fCBSSFMgIT0gcmhzKQorICAgIHJldHVybiAobmV3IEJpbk9wSW5pdChnZXRPcGNvZGUoKSwgbGhzLCByaHMsIGdldFR5cGUoKSkpLT5Gb2xkKCZSLCAwKTsKKyAgcmV0dXJuIEZvbGQoJlIsIDApOworfQorCitzdGQ6OnN0cmluZyBCaW5PcEluaXQ6OmdldEFzU3RyaW5nKCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBSZXN1bHQ7CisgIHN3aXRjaCAoT3BjKSB7CisgIGNhc2UgQ09OQ0FUOiBSZXN1bHQgPSAiIWNvbiI7IGJyZWFrOworICBjYXNlIFNITDogUmVzdWx0ID0gIiFzaGwiOyBicmVhazsKKyAgY2FzZSBTUkE6IFJlc3VsdCA9ICIhc3JhIjsgYnJlYWs7CisgIGNhc2UgU1JMOiBSZXN1bHQgPSAiIXNybCI7IGJyZWFrOworICBjYXNlIEVROiBSZXN1bHQgPSAiIWVxIjsgYnJlYWs7CisgIGNhc2UgU1RSQ09OQ0FUOiBSZXN1bHQgPSAiIXN0cmNvbmNhdCI7IGJyZWFrOworICBjYXNlIE5BTUVDT05DQVQ6CisgICAgUmVzdWx0ID0gIiFuYW1lY29uY2F0PCIgKyBnZXRUeXBlKCktPmdldEFzU3RyaW5nKCkgKyAiPiI7IGJyZWFrOworICB9CisgIHJldHVybiBSZXN1bHQgKyAiKCIgKyBMSFMtPmdldEFzU3RyaW5nKCkgKyAiLCAiICsgUkhTLT5nZXRBc1N0cmluZygpICsgIikiOworfQorCitzdGF0aWMgSW5pdCAqRm9yZWFjaEhlbHBlcihJbml0ICpMSFMsIEluaXQgKk1IUywgSW5pdCAqUkhTLCBSZWNUeSAqVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZCAqQ3VyUmVjLCBNdWx0aUNsYXNzICpDdXJNdWx0aUNsYXNzKTsKKworc3RhdGljIEluaXQgKkV2YWx1YXRlT3BlcmF0aW9uKE9wSW5pdCAqUkhTbywgSW5pdCAqTEhTLCBJbml0ICpBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjVHkgKlR5cGUsIFJlY29yZCAqQ3VyUmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQ2xhc3MgKkN1ck11bHRpQ2xhc3MpIHsKKyAgc3RkOjp2ZWN0b3I8SW5pdCAqPiBOZXdPcGVyYW5kczsKKworICBUeXBlZEluaXQgKlRBcmcgPSBkeW5hbWljX2Nhc3Q8VHlwZWRJbml0Kj4oQXJnKTsKKworICAvLyBJZiB0aGlzIGlzIGEgZGFnLCByZWN1cnNlCisgIGlmIChUQXJnICYmIFRBcmctPmdldFR5cGUoKS0+Z2V0QXNTdHJpbmcoKSA9PSAiZGFnIikgeworICAgIEluaXQgKlJlc3VsdCA9IEZvcmVhY2hIZWxwZXIoTEhTLCBBcmcsIFJIU28sIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJSZWMsIEN1ck11bHRpQ2xhc3MpOworICAgIGlmIChSZXN1bHQgIT0gMCkgeworICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBSSFNvLT5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICBPcEluaXQgKlJIU29vID0gZHluYW1pY19jYXN0PE9wSW5pdCo+KFJIU28tPmdldE9wZXJhbmQoaSkpOworCisgICAgaWYgKFJIU29vKSB7CisgICAgICBJbml0ICpSZXN1bHQgPSBFdmFsdWF0ZU9wZXJhdGlvbihSSFNvbywgTEhTLCBBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLCBDdXJSZWMsIEN1ck11bHRpQ2xhc3MpOworICAgICAgaWYgKFJlc3VsdCAhPSAwKSB7CisgICAgICAgIE5ld09wZXJhbmRzLnB1c2hfYmFjayhSZXN1bHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTmV3T3BlcmFuZHMucHVzaF9iYWNrKEFyZyk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChMSFMtPmdldEFzU3RyaW5nKCkgPT0gUkhTby0+Z2V0T3BlcmFuZChpKS0+Z2V0QXNTdHJpbmcoKSkgeworICAgICAgTmV3T3BlcmFuZHMucHVzaF9iYWNrKEFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIE5ld09wZXJhbmRzLnB1c2hfYmFjayhSSFNvLT5nZXRPcGVyYW5kKGkpKTsKKyAgICB9CisgIH0KKworICAvLyBOb3cgcnVuIHRoZSBvcGVyYXRvciBhbmQgdXNlIGl0cyByZXN1bHQgYXMgdGhlIG5ldyBsZWFmCisgIE9wSW5pdCAqTmV3T3AgPSBSSFNvLT5jbG9uZShOZXdPcGVyYW5kcyk7CisgIEluaXQgKk5ld1ZhbCA9IE5ld09wLT5Gb2xkKEN1clJlYywgQ3VyTXVsdGlDbGFzcyk7CisgIGlmIChOZXdWYWwgIT0gTmV3T3ApIHsKKyAgICBkZWxldGUgTmV3T3A7CisgICAgcmV0dXJuIE5ld1ZhbDsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIEluaXQgKkZvcmVhY2hIZWxwZXIoSW5pdCAqTEhTLCBJbml0ICpNSFMsIEluaXQgKlJIUywgUmVjVHkgKlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmQgKkN1clJlYywgTXVsdGlDbGFzcyAqQ3VyTXVsdGlDbGFzcykgeworICBEYWdJbml0ICpNSFNkID0gZHluYW1pY19jYXN0PERhZ0luaXQqPihNSFMpOworICBMaXN0SW5pdCAqTUhTbCA9IGR5bmFtaWNfY2FzdDxMaXN0SW5pdCo+KE1IUyk7CisKKyAgRGFnUmVjVHkgKkRhZ1R5cGUgPSBkeW5hbWljX2Nhc3Q8RGFnUmVjVHkqPihUeXBlKTsKKyAgTGlzdFJlY1R5ICpMaXN0VHlwZSA9IGR5bmFtaWNfY2FzdDxMaXN0UmVjVHkqPihUeXBlKTsKKworICBPcEluaXQgKlJIU28gPSBkeW5hbWljX2Nhc3Q8T3BJbml0Kj4oUkhTKTsKKworICBpZiAoIVJIU28pIHsKKyAgICBlcnJzKCkgPDwgIiFmb3JlYWNoIHJlcXVpcmVzIGFuIG9wZXJhdG9yXG4iOworICAgIGFzc2VydCgwICYmICJObyBvcGVyYXRvciBmb3IgIWZvcmVhY2giKTsKKyAgfQorCisgIFR5cGVkSW5pdCAqTEhTdCA9IGR5bmFtaWNfY2FzdDxUeXBlZEluaXQqPihMSFMpOworCisgIGlmICghTEhTdCkgeworICAgIGVycnMoKSA8PCAiIWZvcmVhY2ggcmVxdWlyZXMgdHlwZWQgdmFyaWFibGVcbiI7CisgICAgYXNzZXJ0KDAgJiYgIk5vIHR5cGVkIHZhcmlhYmxlIGZvciAhZm9yZWFjaCIpOworICB9CisKKyAgaWYgKChNSFNkICYmIERhZ1R5cGUpIHx8IChNSFNsICYmIExpc3RUeXBlKSkgeworICAgIGlmIChNSFNkKSB7CisgICAgICBJbml0ICpWYWwgPSBNSFNkLT5nZXRPcGVyYXRvcigpOworICAgICAgSW5pdCAqUmVzdWx0ID0gRXZhbHVhdGVPcGVyYXRpb24oUkhTbywgTEhTLCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLCBDdXJSZWMsIEN1ck11bHRpQ2xhc3MpOworICAgICAgaWYgKFJlc3VsdCAhPSAwKSB7CisgICAgICAgIFZhbCA9IFJlc3VsdDsKKyAgICAgIH0KKworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEluaXQgKiwgc3RkOjpzdHJpbmc+ID4gYXJnczsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgTUhTZC0+Z2V0TnVtQXJncygpOyArK2kpIHsKKyAgICAgICAgSW5pdCAqQXJnOworICAgICAgICBzdGQ6OnN0cmluZyBBcmdOYW1lOworICAgICAgICBBcmcgPSBNSFNkLT5nZXRBcmcoaSk7CisgICAgICAgIEFyZ05hbWUgPSBNSFNkLT5nZXRBcmdOYW1lKGkpOworCisgICAgICAgIC8vIFByb2Nlc3MgYXJncworICAgICAgICBJbml0ICpSZXN1bHQgPSBFdmFsdWF0ZU9wZXJhdGlvbihSSFNvLCBMSFMsIEFyZywgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyUmVjLCBDdXJNdWx0aUNsYXNzKTsKKyAgICAgICAgaWYgKFJlc3VsdCAhPSAwKSB7CisgICAgICAgICAgQXJnID0gUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogUHJvY2VzcyBhcmcgbmFtZXMKKyAgICAgICAgYXJncy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQXJnLCBBcmdOYW1lKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgRGFnSW5pdChWYWwsICIiLCBhcmdzKTsKKyAgICB9CisgICAgaWYgKE1IU2wpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPEluaXQgKj4gTmV3T3BlcmFuZHM7CisgICAgICBzdGQ6OnZlY3RvcjxJbml0ICo+IE5ld0xpc3QoTUhTbC0+YmVnaW4oKSwgTUhTbC0+ZW5kKCkpOworCisgICAgICBmb3IgKExpc3RJbml0OjppdGVyYXRvciBsaSA9IE5ld0xpc3QuYmVnaW4oKSwKKyAgICAgICAgICAgICBsaWVuZCA9IE5ld0xpc3QuZW5kKCk7CisgICAgICAgICAgIGxpICE9IGxpZW5kOworICAgICAgICAgICArK2xpKSB7CisgICAgICAgIEluaXQgKkl0ZW0gPSAqbGk7CisgICAgICAgIE5ld09wZXJhbmRzLmNsZWFyKCk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBSSFNvLT5nZXROdW1PcGVyYW5kcygpOyArK2kpIHsKKyAgICAgICAgICAvLyBGaXJzdCwgcmVwbGFjZSB0aGUgZm9yZWFjaCB2YXJpYWJsZSB3aXRoIHRoZSBsaXN0IGl0ZW0KKyAgICAgICAgICBpZiAoTEhTLT5nZXRBc1N0cmluZygpID09IFJIU28tPmdldE9wZXJhbmQoaSktPmdldEFzU3RyaW5nKCkpIHsKKyAgICAgICAgICAgIE5ld09wZXJhbmRzLnB1c2hfYmFjayhJdGVtKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTmV3T3BlcmFuZHMucHVzaF9iYWNrKFJIU28tPmdldE9wZXJhbmQoaSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyBydW4gdGhlIG9wZXJhdG9yIGFuZCB1c2UgaXRzIHJlc3VsdCBhcyB0aGUgbmV3IGxpc3QgaXRlbQorICAgICAgICBPcEluaXQgKk5ld09wID0gUkhTby0+Y2xvbmUoTmV3T3BlcmFuZHMpOworICAgICAgICBJbml0ICpOZXdJdGVtID0gTmV3T3AtPkZvbGQoQ3VyUmVjLCBDdXJNdWx0aUNsYXNzKTsKKyAgICAgICAgaWYgKE5ld0l0ZW0gIT0gTmV3T3ApIHsKKyAgICAgICAgICAqbGkgPSBOZXdJdGVtOworICAgICAgICAgIGRlbGV0ZSBOZXdPcDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBMaXN0SW5pdChOZXdMaXN0LCBNSFNsLT5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworSW5pdCAqVGVybk9wSW5pdDo6Rm9sZChSZWNvcmQgKkN1clJlYywgTXVsdGlDbGFzcyAqQ3VyTXVsdGlDbGFzcykgeworICBzd2l0Y2ggKGdldE9wY29kZSgpKSB7CisgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIGJpbm9wIik7CisgIGNhc2UgU1VCU1Q6IHsKKyAgICBEZWZJbml0ICpMSFNkID0gZHluYW1pY19jYXN0PERlZkluaXQqPihMSFMpOworICAgIFZhckluaXQgKkxIU3YgPSBkeW5hbWljX2Nhc3Q8VmFySW5pdCo+KExIUyk7CisgICAgU3RyaW5nSW5pdCAqTEhTcyA9IGR5bmFtaWNfY2FzdDxTdHJpbmdJbml0Kj4oTEhTKTsKKworICAgIERlZkluaXQgKk1IU2QgPSBkeW5hbWljX2Nhc3Q8RGVmSW5pdCo+KE1IUyk7CisgICAgVmFySW5pdCAqTUhTdiA9IGR5bmFtaWNfY2FzdDxWYXJJbml0Kj4oTUhTKTsKKyAgICBTdHJpbmdJbml0ICpNSFNzID0gZHluYW1pY19jYXN0PFN0cmluZ0luaXQqPihNSFMpOworCisgICAgRGVmSW5pdCAqUkhTZCA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oUkhTKTsKKyAgICBWYXJJbml0ICpSSFN2ID0gZHluYW1pY19jYXN0PFZhckluaXQqPihSSFMpOworICAgIFN0cmluZ0luaXQgKlJIU3MgPSBkeW5hbWljX2Nhc3Q8U3RyaW5nSW5pdCo+KFJIUyk7CisKKyAgICBpZiAoKExIU2QgJiYgTUhTZCAmJiBSSFNkKQorICAgICAgICB8fCAoTEhTdiAmJiBNSFN2ICYmIFJIU3YpCisgICAgICAgIHx8IChMSFNzICYmIE1IU3MgJiYgUkhTcykpIHsKKyAgICAgIGlmIChSSFNkKSB7CisgICAgICAgIFJlY29yZCAqVmFsID0gUkhTZC0+Z2V0RGVmKCk7CisgICAgICAgIGlmIChMSFNkLT5nZXRBc1N0cmluZygpID09IFJIU2QtPmdldEFzU3RyaW5nKCkpIHsKKyAgICAgICAgICBWYWwgPSBNSFNkLT5nZXREZWYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERlZkluaXQoVmFsKTsKKyAgICAgIH0KKyAgICAgIGlmIChSSFN2KSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIFZhbCA9IFJIU3YtPmdldE5hbWUoKTsKKyAgICAgICAgaWYgKExIU3YtPmdldEFzU3RyaW5nKCkgPT0gUkhTdi0+Z2V0QXNTdHJpbmcoKSkgeworICAgICAgICAgIFZhbCA9IE1IU3YtPmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFZhckluaXQoVmFsLCBnZXRUeXBlKCkpOworICAgICAgfQorICAgICAgaWYgKFJIU3MpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgVmFsID0gUkhTcy0+Z2V0VmFsdWUoKTsKKworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGZvdW5kOworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGlkeCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBmb3VuZCA9IFZhbC5maW5kKExIU3MtPmdldFZhbHVlKCksIGlkeCk7CisgICAgICAgICAgaWYgKGZvdW5kICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBWYWwucmVwbGFjZShmb3VuZCwgTEhTcy0+Z2V0VmFsdWUoKS5zaXplKCksIE1IU3MtPmdldFZhbHVlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZHggPSBmb3VuZCArICBNSFNzLT5nZXRWYWx1ZSgpLnNpemUoKTsKKyAgICAgICAgfSB3aGlsZSAoZm91bmQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpOworCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nSW5pdChWYWwpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgRk9SRUFDSDogeworICAgIEluaXQgKlJlc3VsdCA9IEZvcmVhY2hIZWxwZXIoTEhTLCBNSFMsIFJIUywgZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyUmVjLCBDdXJNdWx0aUNsYXNzKTsKKyAgICBpZiAoUmVzdWx0ICE9IDApIHsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgY2FzZSBJRjogeworICAgIEludEluaXQgKkxIU2kgPSBkeW5hbWljX2Nhc3Q8SW50SW5pdCo+KExIUyk7CisgICAgaWYgKEluaXQgKkkgPSBMSFMtPmNvbnZlcnRJbml0aWFsaXplclRvKG5ldyBJbnRSZWNUeSgpKSkKKyAgICAgIExIU2kgPSBkeW5hbWljX2Nhc3Q8SW50SW5pdCo+KEkpOworICAgIGlmIChMSFNpKSB7CisgICAgICBpZiAoTEhTaS0+Z2V0VmFsdWUoKSkgeworICAgICAgICByZXR1cm4gTUhTOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFJIUzsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgfQorCisgIHJldHVybiB0aGlzOworfQorCitJbml0ICpUZXJuT3BJbml0OjpyZXNvbHZlUmVmZXJlbmNlcyhSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYpIHsKKyAgSW5pdCAqbGhzID0gTEhTLT5yZXNvbHZlUmVmZXJlbmNlcyhSLCBSVik7CisKKyAgaWYgKE9wYyA9PSBJRiAmJiBsaHMgIT0gTEhTKSB7CisgICAgSW50SW5pdCAqVmFsdWUgPSBkeW5hbWljX2Nhc3Q8SW50SW5pdCo+KGxocyk7CisgICAgaWYgKEluaXQgKkkgPSBsaHMtPmNvbnZlcnRJbml0aWFsaXplclRvKG5ldyBJbnRSZWNUeSgpKSkKKyAgICAgIFZhbHVlID0gZHluYW1pY19jYXN0PEludEluaXQqPihJKTsKKyAgICBpZiAoVmFsdWUgIT0gMCkgeworICAgICAgLy8gU2hvcnQtY2lyY3VpdAorICAgICAgaWYgKFZhbHVlLT5nZXRWYWx1ZSgpKSB7CisgICAgICAgIEluaXQgKm1ocyA9IE1IUy0+cmVzb2x2ZVJlZmVyZW5jZXMoUiwgUlYpOworICAgICAgICByZXR1cm4gKG5ldyBUZXJuT3BJbml0KGdldE9wY29kZSgpLCBsaHMsIG1ocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMsIGdldFR5cGUoKSkpLT5Gb2xkKCZSLCAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEluaXQgKnJocyA9IFJIUy0+cmVzb2x2ZVJlZmVyZW5jZXMoUiwgUlYpOworICAgICAgICByZXR1cm4gKG5ldyBUZXJuT3BJbml0KGdldE9wY29kZSgpLCBsaHMsIE1IUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHMsIGdldFR5cGUoKSkpLT5Gb2xkKCZSLCAwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBJbml0ICptaHMgPSBNSFMtPnJlc29sdmVSZWZlcmVuY2VzKFIsIFJWKTsKKyAgSW5pdCAqcmhzID0gUkhTLT5yZXNvbHZlUmVmZXJlbmNlcyhSLCBSVik7CisKKyAgaWYgKExIUyAhPSBsaHMgfHwgTUhTICE9IG1ocyB8fCBSSFMgIT0gcmhzKQorICAgIHJldHVybiAobmV3IFRlcm5PcEluaXQoZ2V0T3Bjb2RlKCksIGxocywgbWhzLCByaHMsIGdldFR5cGUoKSkpLT5Gb2xkKCZSLCAwKTsKKyAgcmV0dXJuIEZvbGQoJlIsIDApOworfQorCitzdGQ6OnN0cmluZyBUZXJuT3BJbml0OjpnZXRBc1N0cmluZygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgUmVzdWx0OworICBzd2l0Y2ggKE9wYykgeworICBjYXNlIFNVQlNUOiBSZXN1bHQgPSAiIXN1YnN0IjsgYnJlYWs7CisgIGNhc2UgRk9SRUFDSDogUmVzdWx0ID0gIiFmb3JlYWNoIjsgYnJlYWs7CisgIGNhc2UgSUY6IFJlc3VsdCA9ICIhaWYiOyBicmVhazsKKyB9CisgIHJldHVybiBSZXN1bHQgKyAiKCIgKyBMSFMtPmdldEFzU3RyaW5nKCkgKyAiLCAiICsgTUhTLT5nZXRBc1N0cmluZygpICsgIiwgIgorICAgICsgUkhTLT5nZXRBc1N0cmluZygpICsgIikiOworfQorCitJbml0ICpUeXBlZEluaXQ6OmNvbnZlcnRJbml0aWFsaXplckJpdFJhbmdlKGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmQml0cykgeworICBCaXRzUmVjVHkgKlQgPSBkeW5hbWljX2Nhc3Q8Qml0c1JlY1R5Kj4oZ2V0VHlwZSgpKTsKKyAgaWYgKFQgPT0gMCkgcmV0dXJuIDA7ICAvLyBDYW5ub3Qgc3Vic2NyaXB0IGEgbm9uLWJpdHMgdmFyaWFibGUuLi4KKyAgdW5zaWduZWQgTnVtQml0cyA9IFQtPmdldE51bUJpdHMoKTsKKworICBCaXRzSW5pdCAqQkkgPSBuZXcgQml0c0luaXQoQml0cy5zaXplKCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQml0cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKEJpdHNbaV0gPj0gTnVtQml0cykgeworICAgICAgZGVsZXRlIEJJOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEJJLT5zZXRCaXQoaSwgbmV3IFZhckJpdEluaXQodGhpcywgQml0c1tpXSkpOworICB9CisgIHJldHVybiBCSTsKK30KKworSW5pdCAqVHlwZWRJbml0Ojpjb252ZXJ0SW5pdExpc3RTbGljZShjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJkVsZW1lbnRzKSB7CisgIExpc3RSZWNUeSAqVCA9IGR5bmFtaWNfY2FzdDxMaXN0UmVjVHkqPihnZXRUeXBlKCkpOworICBpZiAoVCA9PSAwKSByZXR1cm4gMDsgIC8vIENhbm5vdCBzdWJzY3JpcHQgYSBub24tbGlzdCB2YXJpYWJsZS4uLgorCisgIGlmIChFbGVtZW50cy5zaXplKCkgPT0gMSkKKyAgICByZXR1cm4gbmV3IFZhckxpc3RFbGVtZW50SW5pdCh0aGlzLCBFbGVtZW50c1swXSk7CisKKyAgc3RkOjp2ZWN0b3I8SW5pdCo+IExpc3RJbml0czsKKyAgTGlzdEluaXRzLnJlc2VydmUoRWxlbWVudHMuc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEVsZW1lbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgTGlzdEluaXRzLnB1c2hfYmFjayhuZXcgVmFyTGlzdEVsZW1lbnRJbml0KHRoaXMsIEVsZW1lbnRzW2ldKSk7CisgIHJldHVybiBuZXcgTGlzdEluaXQoTGlzdEluaXRzLCBUKTsKK30KKworCitJbml0ICpWYXJJbml0OjpyZXNvbHZlQml0UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpJUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJpdCkgeworICBpZiAoUi5pc1RlbXBsYXRlQXJnKGdldE5hbWUoKSkpIHJldHVybiAwOworICBpZiAoSVJWICYmIElSVi0+Z2V0TmFtZSgpICE9IGdldE5hbWUoKSkgcmV0dXJuIDA7CisKKyAgUmVjb3JkVmFsICpSViA9IFIuZ2V0VmFsdWUoZ2V0TmFtZSgpKTsKKyAgYXNzZXJ0KFJWICYmICJSZWZlcmVuY2UgdG8gYSBub24tZXhpc3RlbnQgdmFyaWFibGU/Iik7CisgIGFzc2VydChkeW5hbWljX2Nhc3Q8Qml0c0luaXQqPihSVi0+Z2V0VmFsdWUoKSkpOworICBCaXRzSW5pdCAqQkkgPSAoQml0c0luaXQqKVJWLT5nZXRWYWx1ZSgpOworCisgIGFzc2VydChCaXQgPCBCSS0+Z2V0TnVtQml0cygpICYmICJCaXQgcmVmZXJlbmNlIG91dCBvZiByYW5nZSEiKTsKKyAgSW5pdCAqQiA9IEJJLT5nZXRCaXQoQml0KTsKKworICAvLyBJZiB0aGUgYml0IGlzIHNldCB0byBzb21lIHZhbHVlLCBvciBpZiB3ZSBhcmUgcmVzb2x2aW5nIGEgcmVmZXJlbmNlIHRvIGEKKyAgLy8gc3BlY2lmaWMgdmFyaWFibGUgYW5kIHRoYXQgdmFyaWFibGUgaXMgZXhwbGljaXRseSB1bnNldCwgdGhlbiByZXBsYWNlIHRoZQorICAvLyBWYXJCaXRJbml0IHdpdGggaXQuCisgIGlmIChJUlYgfHwgIWR5bmFtaWNfY2FzdDxVbnNldEluaXQqPihCKSkKKyAgICByZXR1cm4gQjsKKyAgcmV0dXJuIDA7Cit9CisKK0luaXQgKlZhckluaXQ6OnJlc29sdmVMaXN0RWxlbWVudFJlZmVyZW5jZShSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqSVJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVsdCkgeworICBpZiAoUi5pc1RlbXBsYXRlQXJnKGdldE5hbWUoKSkpIHJldHVybiAwOworICBpZiAoSVJWICYmIElSVi0+Z2V0TmFtZSgpICE9IGdldE5hbWUoKSkgcmV0dXJuIDA7CisKKyAgUmVjb3JkVmFsICpSViA9IFIuZ2V0VmFsdWUoZ2V0TmFtZSgpKTsKKyAgYXNzZXJ0KFJWICYmICJSZWZlcmVuY2UgdG8gYSBub24tZXhpc3RlbnQgdmFyaWFibGU/Iik7CisgIExpc3RJbml0ICpMSSA9IGR5bmFtaWNfY2FzdDxMaXN0SW5pdCo+KFJWLT5nZXRWYWx1ZSgpKTsKKyAgaWYgKCFMSSkgeworICAgIFZhckluaXQgKlZJID0gZHluYW1pY19jYXN0PFZhckluaXQqPihSVi0+Z2V0VmFsdWUoKSk7CisgICAgYXNzZXJ0KFZJICYmICJJbnZhbGlkIGxpc3QgZWxlbWVudCEiKTsKKyAgICByZXR1cm4gbmV3IFZhckxpc3RFbGVtZW50SW5pdChWSSwgRWx0KTsKKyAgfQorCisgIGlmIChFbHQgPj0gTEktPmdldFNpemUoKSkKKyAgICByZXR1cm4gMDsgIC8vIE91dCBvZiByYW5nZSByZWZlcmVuY2UuCisgIEluaXQgKkUgPSBMSS0+Z2V0RWxlbWVudChFbHQpOworICAvLyBJZiB0aGUgZWxlbWVudCBpcyBzZXQgdG8gc29tZSB2YWx1ZSwgb3IgaWYgd2UgYXJlIHJlc29sdmluZyBhIHJlZmVyZW5jZQorICAvLyB0byBhIHNwZWNpZmljIHZhcmlhYmxlIGFuZCB0aGF0IHZhcmlhYmxlIGlzIGV4cGxpY2l0bHkgdW5zZXQsIHRoZW4KKyAgLy8gcmVwbGFjZSB0aGUgVmFyTGlzdEVsZW1lbnRJbml0IHdpdGggaXQuCisgIGlmIChJUlYgfHwgIWR5bmFtaWNfY2FzdDxVbnNldEluaXQqPihFKSkKKyAgICByZXR1cm4gRTsKKyAgcmV0dXJuIDA7Cit9CisKKworUmVjVHkgKlZhckluaXQ6OmdldEZpZWxkVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmRmllbGROYW1lKSBjb25zdCB7CisgIGlmIChSZWNvcmRSZWNUeSAqUlR5ID0gZHluYW1pY19jYXN0PFJlY29yZFJlY1R5Kj4oZ2V0VHlwZSgpKSkKKyAgICBpZiAoY29uc3QgUmVjb3JkVmFsICpSViA9IFJUeS0+Z2V0UmVjb3JkKCktPmdldFZhbHVlKEZpZWxkTmFtZSkpCisgICAgICByZXR1cm4gUlYtPmdldFR5cGUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK0luaXQgKlZhckluaXQ6OmdldEZpZWxkSW5pdChSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZpZWxkTmFtZSkgY29uc3QgeworICBpZiAoZHluYW1pY19jYXN0PFJlY29yZFJlY1R5Kj4oZ2V0VHlwZSgpKSkKKyAgICBpZiAoY29uc3QgUmVjb3JkVmFsICpWYWwgPSBSLmdldFZhbHVlKFZhck5hbWUpKSB7CisgICAgICBpZiAoUlYgIT0gVmFsICYmIChSViB8fCBkeW5hbWljX2Nhc3Q8VW5zZXRJbml0Kj4oVmFsLT5nZXRWYWx1ZSgpKSkpCisgICAgICAgIHJldHVybiAwOworICAgICAgSW5pdCAqVGhlSW5pdCA9IFZhbC0+Z2V0VmFsdWUoKTsKKyAgICAgIGFzc2VydChUaGVJbml0ICE9IHRoaXMgJiYgIkluZmluaXRlIGxvb3AgZGV0ZWN0ZWQhIik7CisgICAgICBpZiAoSW5pdCAqSSA9IFRoZUluaXQtPmdldEZpZWxkSW5pdChSLCBSViwgRmllbGROYW1lKSkKKyAgICAgICAgcmV0dXJuIEk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLyByZXNvbHZlUmVmZXJlbmNlcyAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgY2xhc3NlcyB0aGF0IHJlZmVyIHRvIG90aGVyCisvLy8gdmFyaWFibGVzIHdoaWNoIG1heSBub3QgYmUgZGVmaW5lZCBhdCB0aGUgdGltZSB0aGUgZXhwcmVzc2lvbiBpcyBmb3JtZWQuCisvLy8gSWYgYSB2YWx1ZSBpcyBzZXQgZm9yIHRoZSB2YXJpYWJsZSBsYXRlciwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24KKy8vLyB1c2VycyBvZiB0aGUgdmFsdWUgdG8gYWxsb3cgdGhlIHZhbHVlIHRvIHByb3BhZ2F0ZSBvdXQuCisvLy8KK0luaXQgKlZhckluaXQ6OnJlc29sdmVSZWZlcmVuY2VzKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSVikgeworICBpZiAoUmVjb3JkVmFsICpWYWwgPSBSLmdldFZhbHVlKFZhck5hbWUpKQorICAgIGlmIChSViA9PSBWYWwgfHwgKFJWID09IDAgJiYgIWR5bmFtaWNfY2FzdDxVbnNldEluaXQqPihWYWwtPmdldFZhbHVlKCkpKSkKKyAgICAgIHJldHVybiBWYWwtPmdldFZhbHVlKCk7CisgIHJldHVybiB0aGlzOworfQorCitzdGQ6OnN0cmluZyBWYXJCaXRJbml0OjpnZXRBc1N0cmluZygpIGNvbnN0IHsKKyAgIHJldHVybiBUSS0+Z2V0QXNTdHJpbmcoKSArICJ7IiArIHV0b3N0cihCaXQpICsgIn0iOworfQorCitJbml0ICpWYXJCaXRJbml0OjpyZXNvbHZlUmVmZXJlbmNlcyhSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYpIHsKKyAgaWYgKEluaXQgKkkgPSBnZXRWYXJpYWJsZSgpLT5yZXNvbHZlQml0UmVmZXJlbmNlKFIsIFJWLCBnZXRCaXROdW0oKSkpCisgICAgcmV0dXJuIEk7CisgIHJldHVybiB0aGlzOworfQorCitzdGQ6OnN0cmluZyBWYXJMaXN0RWxlbWVudEluaXQ6OmdldEFzU3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gVEktPmdldEFzU3RyaW5nKCkgKyAiWyIgKyB1dG9zdHIoRWxlbWVudCkgKyAiXSI7Cit9CisKK0luaXQgKlZhckxpc3RFbGVtZW50SW5pdDo6cmVzb2x2ZVJlZmVyZW5jZXMoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWKSB7CisgIGlmIChJbml0ICpJID0gZ2V0VmFyaWFibGUoKS0+cmVzb2x2ZUxpc3RFbGVtZW50UmVmZXJlbmNlKFIsIFJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50TnVtKCkpKQorICAgIHJldHVybiBJOworICByZXR1cm4gdGhpczsKK30KKworSW5pdCAqVmFyTGlzdEVsZW1lbnRJbml0OjpyZXNvbHZlQml0UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaXQpIHsKKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkLCB0byBzdXBwb3J0IHJlZmVyZW5jZXMgbGlrZToKKyAgLy8gYml0IEIgPSBBQVswXXsxfTsKKyAgcmV0dXJuIDA7Cit9CisKK0luaXQgKlZhckxpc3RFbGVtZW50SW5pdDo6CityZXNvbHZlTGlzdEVsZW1lbnRSZWZlcmVuY2UoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWLCB1bnNpZ25lZCBFbHQpIHsKKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkLCB0byBzdXBwb3J0IHJlZmVyZW5jZXMgbGlrZToKKyAgLy8gaW50IEIgPSBBQVswXVsxXTsKKyAgcmV0dXJuIDA7Cit9CisKK1JlY1R5ICpEZWZJbml0OjpnZXRGaWVsZFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJkZpZWxkTmFtZSkgY29uc3QgeworICBpZiAoY29uc3QgUmVjb3JkVmFsICpSViA9IERlZi0+Z2V0VmFsdWUoRmllbGROYW1lKSkKKyAgICByZXR1cm4gUlYtPmdldFR5cGUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK0luaXQgKkRlZkluaXQ6OmdldEZpZWxkSW5pdChSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZpZWxkTmFtZSkgY29uc3QgeworICByZXR1cm4gRGVmLT5nZXRWYWx1ZShGaWVsZE5hbWUpLT5nZXRWYWx1ZSgpOworfQorCisKK3N0ZDo6c3RyaW5nIERlZkluaXQ6OmdldEFzU3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gRGVmLT5nZXROYW1lKCk7Cit9CisKK0luaXQgKkZpZWxkSW5pdDo6cmVzb2x2ZUJpdFJlZmVyZW5jZShSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQml0KSB7CisgIGlmIChJbml0ICpCaXRzVmFsID0gUmVjLT5nZXRGaWVsZEluaXQoUiwgUlYsIEZpZWxkTmFtZSkpCisgICAgaWYgKEJpdHNJbml0ICpCSSA9IGR5bmFtaWNfY2FzdDxCaXRzSW5pdCo+KEJpdHNWYWwpKSB7CisgICAgICBhc3NlcnQoQml0IDwgQkktPmdldE51bUJpdHMoKSAmJiAiQml0IHJlZmVyZW5jZSBvdXQgb2YgcmFuZ2UhIik7CisgICAgICBJbml0ICpCID0gQkktPmdldEJpdChCaXQpOworCisgICAgICBpZiAoZHluYW1pY19jYXN0PEJpdEluaXQqPihCKSkgIC8vIElmIHRoZSBiaXQgaXMgc2V0Li4uCisgICAgICAgIHJldHVybiBCOyAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIFZhckJpdEluaXQgd2l0aCBpdC4KKyAgICB9CisgIHJldHVybiAwOworfQorCitJbml0ICpGaWVsZEluaXQ6OnJlc29sdmVMaXN0RWxlbWVudFJlZmVyZW5jZShSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbHQpIHsKKyAgaWYgKEluaXQgKkxpc3RWYWwgPSBSZWMtPmdldEZpZWxkSW5pdChSLCBSViwgRmllbGROYW1lKSkKKyAgICBpZiAoTGlzdEluaXQgKkxJID0gZHluYW1pY19jYXN0PExpc3RJbml0Kj4oTGlzdFZhbCkpIHsKKyAgICAgIGlmIChFbHQgPj0gTEktPmdldFNpemUoKSkgcmV0dXJuIDA7CisgICAgICBJbml0ICpFID0gTEktPmdldEVsZW1lbnQoRWx0KTsKKworICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgc2V0IHRvIHNvbWUgdmFsdWUsIG9yIGlmIHdlIGFyZSByZXNvbHZpbmcgYQorICAgICAgLy8gcmVmZXJlbmNlIHRvIGEgc3BlY2lmaWMgdmFyaWFibGUgYW5kIHRoYXQgdmFyaWFibGUgaXMgZXhwbGljaXRseQorICAgICAgLy8gdW5zZXQsIHRoZW4gcmVwbGFjZSB0aGUgVmFyTGlzdEVsZW1lbnRJbml0IHdpdGggaXQuCisgICAgICBpZiAoUlYgfHwgIWR5bmFtaWNfY2FzdDxVbnNldEluaXQqPihFKSkKKyAgICAgICAgcmV0dXJuIEU7CisgICAgfQorICByZXR1cm4gMDsKK30KKworSW5pdCAqRmllbGRJbml0OjpyZXNvbHZlUmVmZXJlbmNlcyhSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYpIHsKKyAgSW5pdCAqTmV3UmVjID0gUlYgPyBSZWMtPnJlc29sdmVSZWZlcmVuY2VzKFIsIFJWKSA6IFJlYzsKKworICBJbml0ICpCaXRzVmFsID0gTmV3UmVjLT5nZXRGaWVsZEluaXQoUiwgUlYsIEZpZWxkTmFtZSk7CisgIGlmIChCaXRzVmFsKSB7CisgICAgSW5pdCAqQlZSID0gQml0c1ZhbC0+cmVzb2x2ZVJlZmVyZW5jZXMoUiwgUlYpOworICAgIHJldHVybiBCVlItPmlzQ29tcGxldGUoKSA/IEJWUiA6IHRoaXM7CisgIH0KKworICBpZiAoTmV3UmVjICE9IFJlYykgeworICAgIHJldHVybiBuZXcgRmllbGRJbml0KE5ld1JlYywgRmllbGROYW1lKTsKKyAgfQorICByZXR1cm4gdGhpczsKK30KKworSW5pdCAqRGFnSW5pdDo6cmVzb2x2ZVJlZmVyZW5jZXMoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWKSB7CisgIHN0ZDo6dmVjdG9yPEluaXQqPiBOZXdBcmdzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIE5ld0FyZ3MucHVzaF9iYWNrKEFyZ3NbaV0tPnJlc29sdmVSZWZlcmVuY2VzKFIsIFJWKSk7CisKKyAgSW5pdCAqT3AgPSBWYWwtPnJlc29sdmVSZWZlcmVuY2VzKFIsIFJWKTsKKworICBpZiAoQXJncyAhPSBOZXdBcmdzIHx8IE9wICE9IFZhbCkKKyAgICByZXR1cm4gbmV3IERhZ0luaXQoT3AsIFZhbE5hbWUsIE5ld0FyZ3MsIEFyZ05hbWVzKTsKKworICByZXR1cm4gdGhpczsKK30KKworCitzdGQ6OnN0cmluZyBEYWdJbml0OjpnZXRBc1N0cmluZygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgUmVzdWx0ID0gIigiICsgVmFsLT5nZXRBc1N0cmluZygpOworICBpZiAoIVZhbE5hbWUuZW1wdHkoKSkKKyAgICBSZXN1bHQgKz0gIjoiICsgVmFsTmFtZTsKKyAgaWYgKEFyZ3Muc2l6ZSgpKSB7CisgICAgUmVzdWx0ICs9ICIgIiArIEFyZ3NbMF0tPmdldEFzU3RyaW5nKCk7CisgICAgaWYgKCFBcmdOYW1lc1swXS5lbXB0eSgpKSBSZXN1bHQgKz0gIjokIiArIEFyZ05hbWVzWzBdOworICAgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBBcmdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFJlc3VsdCArPSAiLCAiICsgQXJnc1tpXS0+Z2V0QXNTdHJpbmcoKTsKKyAgICAgIGlmICghQXJnTmFtZXNbaV0uZW1wdHkoKSkgUmVzdWx0ICs9ICI6JCIgKyBBcmdOYW1lc1tpXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFJlc3VsdCArICIpIjsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgT3RoZXIgaW1wbGVtZW50YXRpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitSZWNvcmRWYWw6OlJlY29yZFZhbChjb25zdCBzdGQ6OnN0cmluZyAmTiwgUmVjVHkgKlQsIHVuc2lnbmVkIFApCisgIDogTmFtZShOKSwgVHkoVCksIFByZWZpeChQKSB7CisgIFZhbHVlID0gVHktPmNvbnZlcnRWYWx1ZShuZXcgVW5zZXRJbml0KCkpOworICBhc3NlcnQoVmFsdWUgJiYgIkNhbm5vdCBjcmVhdGUgdW5zZXQgdmFsdWUgZm9yIGN1cnJlbnQgdHlwZSEiKTsKK30KKwordm9pZCBSZWNvcmRWYWw6OmR1bXAoKSBjb25zdCB7IGVycnMoKSA8PCAqdGhpczsgfQorCit2b2lkIFJlY29yZFZhbDo6cHJpbnQocmF3X29zdHJlYW0gJk9TLCBib29sIFByaW50U2VtKSBjb25zdCB7CisgIGlmIChnZXRQcmVmaXgoKSkgT1MgPDwgImZpZWxkICI7CisgIE9TIDw8ICpnZXRUeXBlKCkgPDwgIiAiIDw8IGdldE5hbWUoKTsKKworICBpZiAoZ2V0VmFsdWUoKSkKKyAgICBPUyA8PCAiID0gIiA8PCAqZ2V0VmFsdWUoKTsKKworICBpZiAoUHJpbnRTZW0pIE9TIDw8ICI7XG4iOworfQorCit1bnNpZ25lZCBSZWNvcmQ6Okxhc3RJRCA9IDA7CisKK3ZvaWQgUmVjb3JkOjpzZXROYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgIGlmIChSZWNvcmRzLmdldERlZihnZXROYW1lKCkpID09IHRoaXMpIHsKKyAgICBSZWNvcmRzLnJlbW92ZURlZihnZXROYW1lKCkpOworICAgIHRoaXMtPk5hbWUgPSBOYW1lOworICAgIFJlY29yZHMuYWRkRGVmKHRoaXMpOworICB9IGVsc2UgeworICAgIFJlY29yZHMucmVtb3ZlQ2xhc3MoZ2V0TmFtZSgpKTsKKyAgICB0aGlzLT5OYW1lID0gTmFtZTsKKyAgICBSZWNvcmRzLmFkZENsYXNzKHRoaXMpOworICB9Cit9CisKKy8vLyByZXNvbHZlUmVmZXJlbmNlc1RvIC0gSWYgYW55dGhpbmcgaW4gdGhpcyByZWNvcmQgcmVmZXJzIHRvIFJWLCByZXBsYWNlIHRoZQorLy8vIHJlZmVyZW5jZSB0byBSViB3aXRoIHRoZSBSSFMgb2YgUlYuICBJZiBSViBpcyBudWxsLCB3ZSByZXNvbHZlIGFsbCBwb3NzaWJsZQorLy8vIHJlZmVyZW5jZXMuCit2b2lkIFJlY29yZDo6cmVzb2x2ZVJlZmVyZW5jZXNUbyhjb25zdCBSZWNvcmRWYWwgKlJWKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChJbml0ICpWID0gVmFsdWVzW2ldLmdldFZhbHVlKCkpCisgICAgICBWYWx1ZXNbaV0uc2V0VmFsdWUoVi0+cmVzb2x2ZVJlZmVyZW5jZXMoKnRoaXMsIFJWKSk7CisgIH0KK30KKwordm9pZCBSZWNvcmQ6OmR1bXAoKSBjb25zdCB7IGVycnMoKSA8PCAqdGhpczsgfQorCityYXdfb3N0cmVhbSAmbGx2bTo6b3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFJlY29yZCAmUikgeworICBPUyA8PCBSLmdldE5hbWUoKTsKKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJlRBcmdzID0gUi5nZXRUZW1wbGF0ZUFyZ3MoKTsKKyAgaWYgKCFUQXJncy5lbXB0eSgpKSB7CisgICAgT1MgPDwgIjwiOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoaSkgT1MgPDwgIiwgIjsKKyAgICAgIGNvbnN0IFJlY29yZFZhbCAqUlYgPSBSLmdldFZhbHVlKFRBcmdzW2ldKTsKKyAgICAgIGFzc2VydChSViAmJiAiVGVtcGxhdGUgYXJndW1lbnQgcmVjb3JkIG5vdCBmb3VuZD8/Iik7CisgICAgICBSVi0+cHJpbnQoT1MsIGZhbHNlKTsKKyAgICB9CisgICAgT1MgPDwgIj4iOworICB9CisKKyAgT1MgPDwgIiB7IjsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJlNDID0gUi5nZXRTdXBlckNsYXNzZXMoKTsKKyAgaWYgKCFTQy5lbXB0eSgpKSB7CisgICAgT1MgPDwgIlx0Ly8iOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTQy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgT1MgPDwgIiAiIDw8IFNDW2ldLT5nZXROYW1lKCk7CisgIH0KKyAgT1MgPDwgIlxuIjsKKworICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmRWYWw+ICZWYWxzID0gUi5nZXRWYWx1ZXMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoVmFsc1tpXS5nZXRQcmVmaXgoKSAmJiAhUi5pc1RlbXBsYXRlQXJnKFZhbHNbaV0uZ2V0TmFtZSgpKSkKKyAgICAgIE9TIDw8IFZhbHNbaV07CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYWxzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKCFWYWxzW2ldLmdldFByZWZpeCgpICYmICFSLmlzVGVtcGxhdGVBcmcoVmFsc1tpXS5nZXROYW1lKCkpKQorICAgICAgT1MgPDwgVmFsc1tpXTsKKworICByZXR1cm4gT1MgPDwgIn1cbiI7Cit9CisKKy8vLyBnZXRWYWx1ZUluaXQgLSBSZXR1cm4gdGhlIGluaXRpYWxpemVyIGZvciBhIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLAorLy8vIG9yIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QuCisvLy8KK0luaXQgKlJlY29yZDo6Z2V0VmFsdWVJbml0KFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0IHsKKyAgY29uc3QgUmVjb3JkVmFsICpSID0gZ2V0VmFsdWUoRmllbGROYW1lKTsKKyAgaWYgKFIgPT0gMCB8fCBSLT5nZXRWYWx1ZSgpID09IDApCisgICAgdGhyb3cgIlJlY29yZCBgIiArIGdldE5hbWUoKSArICInIGRvZXMgbm90IGhhdmUgYSBmaWVsZCBuYW1lZCBgIiArCisgICAgICBGaWVsZE5hbWUuc3RyKCkgKyAiJyFcbiI7CisgIHJldHVybiBSLT5nZXRWYWx1ZSgpOworfQorCisKKy8vLyBnZXRWYWx1ZUFzU3RyaW5nIC0gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucyBpdHMKKy8vLyB2YWx1ZSBhcyBhIHN0cmluZywgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBvciBpZgorLy8vIHRoZSB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuCisvLy8KK3N0ZDo6c3RyaW5nIFJlY29yZDo6Z2V0VmFsdWVBc1N0cmluZyhTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdCB7CisgIGNvbnN0IFJlY29yZFZhbCAqUiA9IGdldFZhbHVlKEZpZWxkTmFtZSk7CisgIGlmIChSID09IDAgfHwgUi0+Z2V0VmFsdWUoKSA9PSAwKQorICAgIHRocm93ICJSZWNvcmQgYCIgKyBnZXROYW1lKCkgKyAiJyBkb2VzIG5vdCBoYXZlIGEgZmllbGQgbmFtZWQgYCIgKworICAgICAgICAgIEZpZWxkTmFtZS5zdHIoKSArICInIVxuIjsKKworICBpZiAoY29uc3QgU3RyaW5nSW5pdCAqU0kgPSBkeW5hbWljX2Nhc3Q8Y29uc3QgU3RyaW5nSW5pdCo+KFItPmdldFZhbHVlKCkpKQorICAgIHJldHVybiBTSS0+Z2V0VmFsdWUoKTsKKyAgdGhyb3cgIlJlY29yZCBgIiArIGdldE5hbWUoKSArICInLCBmaWVsZCBgIiArIEZpZWxkTmFtZS5zdHIoKSArCisgICAgICAgICInIGRvZXMgbm90IGhhdmUgYSBzdHJpbmcgaW5pdGlhbGl6ZXIhIjsKK30KKworLy8vIGdldFZhbHVlQXNCaXRzSW5pdCAtIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHJldHVybnMKKy8vLyBpdHMgdmFsdWUgYXMgYSBCaXRzSW5pdCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdAorLy8vIG9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisvLy8KK0JpdHNJbml0ICpSZWNvcmQ6OmdldFZhbHVlQXNCaXRzSW5pdChTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdCB7CisgIGNvbnN0IFJlY29yZFZhbCAqUiA9IGdldFZhbHVlKEZpZWxkTmFtZSk7CisgIGlmIChSID09IDAgfHwgUi0+Z2V0VmFsdWUoKSA9PSAwKQorICAgIHRocm93ICJSZWNvcmQgYCIgKyBnZXROYW1lKCkgKyAiJyBkb2VzIG5vdCBoYXZlIGEgZmllbGQgbmFtZWQgYCIgKworICAgICAgICAgIEZpZWxkTmFtZS5zdHIoKSArICInIVxuIjsKKworICBpZiAoQml0c0luaXQgKkJJID0gZHluYW1pY19jYXN0PEJpdHNJbml0Kj4oUi0+Z2V0VmFsdWUoKSkpCisgICAgcmV0dXJuIEJJOworICB0aHJvdyAiUmVjb3JkIGAiICsgZ2V0TmFtZSgpICsgIicsIGZpZWxkIGAiICsgRmllbGROYW1lLnN0cigpICsKKyAgICAgICAgIicgZG9lcyBub3QgaGF2ZSBhIEJpdHNJbml0IGluaXRpYWxpemVyISI7Cit9CisKKy8vLyBnZXRWYWx1ZUFzTGlzdEluaXQgLSBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zCisvLy8gaXRzIHZhbHVlIGFzIGEgTGlzdEluaXQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QKKy8vLyBvciBpZiB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorLy8vCitMaXN0SW5pdCAqUmVjb3JkOjpnZXRWYWx1ZUFzTGlzdEluaXQoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3QgeworICBjb25zdCBSZWNvcmRWYWwgKlIgPSBnZXRWYWx1ZShGaWVsZE5hbWUpOworICBpZiAoUiA9PSAwIHx8IFItPmdldFZhbHVlKCkgPT0gMCkKKyAgICB0aHJvdyAiUmVjb3JkIGAiICsgZ2V0TmFtZSgpICsgIicgZG9lcyBub3QgaGF2ZSBhIGZpZWxkIG5hbWVkIGAiICsKKyAgICAgICAgICBGaWVsZE5hbWUuc3RyKCkgKyAiJyFcbiI7CisKKyAgaWYgKExpc3RJbml0ICpMSSA9IGR5bmFtaWNfY2FzdDxMaXN0SW5pdCo+KFItPmdldFZhbHVlKCkpKQorICAgIHJldHVybiBMSTsKKyAgdGhyb3cgIlJlY29yZCBgIiArIGdldE5hbWUoKSArICInLCBmaWVsZCBgIiArIEZpZWxkTmFtZS5zdHIoKSArCisgICAgICAgICInIGRvZXMgbm90IGhhdmUgYSBsaXN0IGluaXRpYWxpemVyISI7Cit9CisKKy8vLyBnZXRWYWx1ZUFzTGlzdE9mRGVmcyAtIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHJldHVybnMKKy8vLyBpdHMgdmFsdWUgYXMgYSB2ZWN0b3Igb2YgcmVjb3JkcywgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzCisvLy8gbm90IGV4aXN0IG9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisvLy8KK3N0ZDo6dmVjdG9yPFJlY29yZCo+CitSZWNvcmQ6OmdldFZhbHVlQXNMaXN0T2ZEZWZzKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0IHsKKyAgTGlzdEluaXQgKkxpc3QgPSBnZXRWYWx1ZUFzTGlzdEluaXQoRmllbGROYW1lKTsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gRGVmczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IExpc3QtPmdldFNpemUoKTsgaSsrKSB7CisgICAgaWYgKERlZkluaXQgKkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihMaXN0LT5nZXRFbGVtZW50KGkpKSkgeworICAgICAgRGVmcy5wdXNoX2JhY2soREktPmdldERlZigpKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgIlJlY29yZCBgIiArIGdldE5hbWUoKSArICInLCBmaWVsZCBgIiArIEZpZWxkTmFtZS5zdHIoKSArCisgICAgICAgICAgICAiJyBsaXN0IGlzIG5vdCBlbnRpcmVseSBEZWZJbml0ISI7CisgICAgfQorICB9CisgIHJldHVybiBEZWZzOworfQorCisvLy8gZ2V0VmFsdWVBc0ludCAtIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHJldHVybnMgaXRzCisvLy8gdmFsdWUgYXMgYW4gaW50NjRfdCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBvciBpZgorLy8vIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisvLy8KK2ludDY0X3QgUmVjb3JkOjpnZXRWYWx1ZUFzSW50KFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0IHsKKyAgY29uc3QgUmVjb3JkVmFsICpSID0gZ2V0VmFsdWUoRmllbGROYW1lKTsKKyAgaWYgKFIgPT0gMCB8fCBSLT5nZXRWYWx1ZSgpID09IDApCisgICAgdGhyb3cgIlJlY29yZCBgIiArIGdldE5hbWUoKSArICInIGRvZXMgbm90IGhhdmUgYSBmaWVsZCBuYW1lZCBgIiArCisgICAgICAgICAgRmllbGROYW1lLnN0cigpICsgIichXG4iOworCisgIGlmIChJbnRJbml0ICpJSSA9IGR5bmFtaWNfY2FzdDxJbnRJbml0Kj4oUi0+Z2V0VmFsdWUoKSkpCisgICAgcmV0dXJuIElJLT5nZXRWYWx1ZSgpOworICB0aHJvdyAiUmVjb3JkIGAiICsgZ2V0TmFtZSgpICsgIicsIGZpZWxkIGAiICsgRmllbGROYW1lLnN0cigpICsKKyAgICAgICAgIicgZG9lcyBub3QgaGF2ZSBhbiBpbnQgaW5pdGlhbGl6ZXIhIjsKK30KKworLy8vIGdldFZhbHVlQXNMaXN0T2ZJbnRzIC0gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucworLy8vIGl0cyB2YWx1ZSBhcyBhIHZlY3RvciBvZiBpbnRlZ2VycywgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzCisvLy8gbm90IGV4aXN0IG9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisvLy8KK3N0ZDo6dmVjdG9yPGludDY0X3Q+CitSZWNvcmQ6OmdldFZhbHVlQXNMaXN0T2ZJbnRzKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0IHsKKyAgTGlzdEluaXQgKkxpc3QgPSBnZXRWYWx1ZUFzTGlzdEluaXQoRmllbGROYW1lKTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gSW50czsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IExpc3QtPmdldFNpemUoKTsgaSsrKSB7CisgICAgaWYgKEludEluaXQgKklJID0gZHluYW1pY19jYXN0PEludEluaXQqPihMaXN0LT5nZXRFbGVtZW50KGkpKSkgeworICAgICAgSW50cy5wdXNoX2JhY2soSUktPmdldFZhbHVlKCkpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyAiUmVjb3JkIGAiICsgZ2V0TmFtZSgpICsgIicsIGZpZWxkIGAiICsgRmllbGROYW1lLnN0cigpICsKKyAgICAgICAgICAgICInIGRvZXMgbm90IGhhdmUgYSBsaXN0IG9mIGludHMgaW5pdGlhbGl6ZXIhIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEludHM7Cit9CisKKy8vLyBnZXRWYWx1ZUFzRGVmIC0gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucyBpdHMKKy8vLyB2YWx1ZSBhcyBhIFJlY29yZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBvciBpZgorLy8vIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisvLy8KK1JlY29yZCAqUmVjb3JkOjpnZXRWYWx1ZUFzRGVmKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0IHsKKyAgY29uc3QgUmVjb3JkVmFsICpSID0gZ2V0VmFsdWUoRmllbGROYW1lKTsKKyAgaWYgKFIgPT0gMCB8fCBSLT5nZXRWYWx1ZSgpID09IDApCisgICAgdGhyb3cgIlJlY29yZCBgIiArIGdldE5hbWUoKSArICInIGRvZXMgbm90IGhhdmUgYSBmaWVsZCBuYW1lZCBgIiArCisgICAgICBGaWVsZE5hbWUuc3RyKCkgKyAiJyFcbiI7CisKKyAgaWYgKERlZkluaXQgKkRJID0gZHluYW1pY19jYXN0PERlZkluaXQqPihSLT5nZXRWYWx1ZSgpKSkKKyAgICByZXR1cm4gREktPmdldERlZigpOworICB0aHJvdyAiUmVjb3JkIGAiICsgZ2V0TmFtZSgpICsgIicsIGZpZWxkIGAiICsgRmllbGROYW1lLnN0cigpICsKKyAgICAgICAgIicgZG9lcyBub3QgaGF2ZSBhIGRlZiBpbml0aWFsaXplciEiOworfQorCisvLy8gZ2V0VmFsdWVBc0JpdCAtIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHJldHVybnMgaXRzCisvLy8gdmFsdWUgYXMgYSBiaXQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3Qgb3IgaWYKKy8vLyB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorLy8vCitib29sIFJlY29yZDo6Z2V0VmFsdWVBc0JpdChTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdCB7CisgIGNvbnN0IFJlY29yZFZhbCAqUiA9IGdldFZhbHVlKEZpZWxkTmFtZSk7CisgIGlmIChSID09IDAgfHwgUi0+Z2V0VmFsdWUoKSA9PSAwKQorICAgIHRocm93ICJSZWNvcmQgYCIgKyBnZXROYW1lKCkgKyAiJyBkb2VzIG5vdCBoYXZlIGEgZmllbGQgbmFtZWQgYCIgKworICAgICAgRmllbGROYW1lLnN0cigpICsgIichXG4iOworCisgIGlmIChCaXRJbml0ICpCSSA9IGR5bmFtaWNfY2FzdDxCaXRJbml0Kj4oUi0+Z2V0VmFsdWUoKSkpCisgICAgcmV0dXJuIEJJLT5nZXRWYWx1ZSgpOworICB0aHJvdyAiUmVjb3JkIGAiICsgZ2V0TmFtZSgpICsgIicsIGZpZWxkIGAiICsgRmllbGROYW1lLnN0cigpICsKKyAgICAgICAgIicgZG9lcyBub3QgaGF2ZSBhIGJpdCBpbml0aWFsaXplciEiOworfQorCisvLy8gZ2V0VmFsdWVBc0RhZyAtIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHJldHVybnMgaXRzCisvLy8gdmFsdWUgYXMgYW4gRGFnLCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0IG9yIGlmCisvLy8gdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKy8vLworRGFnSW5pdCAqUmVjb3JkOjpnZXRWYWx1ZUFzRGFnKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0IHsKKyAgY29uc3QgUmVjb3JkVmFsICpSID0gZ2V0VmFsdWUoRmllbGROYW1lKTsKKyAgaWYgKFIgPT0gMCB8fCBSLT5nZXRWYWx1ZSgpID09IDApCisgICAgdGhyb3cgIlJlY29yZCBgIiArIGdldE5hbWUoKSArICInIGRvZXMgbm90IGhhdmUgYSBmaWVsZCBuYW1lZCBgIiArCisgICAgICBGaWVsZE5hbWUuc3RyKCkgKyAiJyFcbiI7CisKKyAgaWYgKERhZ0luaXQgKkRJID0gZHluYW1pY19jYXN0PERhZ0luaXQqPihSLT5nZXRWYWx1ZSgpKSkKKyAgICByZXR1cm4gREk7CisgIHRocm93ICJSZWNvcmQgYCIgKyBnZXROYW1lKCkgKyAiJywgZmllbGQgYCIgKyBGaWVsZE5hbWUuc3RyKCkgKworICAgICAgICAiJyBkb2VzIG5vdCBoYXZlIGEgZGFnIGluaXRpYWxpemVyISI7Cit9CisKK3N0ZDo6c3RyaW5nIFJlY29yZDo6Z2V0VmFsdWVBc0NvZGUoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3QgeworICBjb25zdCBSZWNvcmRWYWwgKlIgPSBnZXRWYWx1ZShGaWVsZE5hbWUpOworICBpZiAoUiA9PSAwIHx8IFItPmdldFZhbHVlKCkgPT0gMCkKKyAgICB0aHJvdyAiUmVjb3JkIGAiICsgZ2V0TmFtZSgpICsgIicgZG9lcyBub3QgaGF2ZSBhIGZpZWxkIG5hbWVkIGAiICsKKyAgICAgIEZpZWxkTmFtZS5zdHIoKSArICInIVxuIjsKKworICBpZiAoY29uc3QgQ29kZUluaXQgKkNJID0gZHluYW1pY19jYXN0PGNvbnN0IENvZGVJbml0Kj4oUi0+Z2V0VmFsdWUoKSkpCisgICAgcmV0dXJuIENJLT5nZXRWYWx1ZSgpOworICB0aHJvdyAiUmVjb3JkIGAiICsgZ2V0TmFtZSgpICsgIicsIGZpZWxkIGAiICsgRmllbGROYW1lLnN0cigpICsKKyAgICAiJyBkb2VzIG5vdCBoYXZlIGEgY29kZSBpbml0aWFsaXplciEiOworfQorCisKK3ZvaWQgTXVsdGlDbGFzczo6ZHVtcCgpIGNvbnN0IHsKKyAgZXJycygpIDw8ICJSZWNvcmQ6XG4iOworICBSZWMuZHVtcCgpOworCisgIGVycnMoKSA8PCAiRGVmczpcbiI7CisgIGZvciAoUmVjb3JkVmVjdG9yOjpjb25zdF9pdGVyYXRvciByID0gRGVmUHJvdG90eXBlcy5iZWdpbigpLAorICAgICAgICAgcmVuZCA9IERlZlByb3RvdHlwZXMuZW5kKCk7CisgICAgICAgciAhPSByZW5kOworICAgICAgICsrcikgeworICAgICgqciktPmR1bXAoKTsKKyAgfQorfQorCisKK3ZvaWQgUmVjb3JkS2VlcGVyOjpkdW1wKCkgY29uc3QgeyBlcnJzKCkgPDwgKnRoaXM7IH0KKworcmF3X29zdHJlYW0gJmxsdm06Om9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBSZWNvcmRLZWVwZXIgJlJLKSB7CisgIE9TIDw8ICItLS0tLS0tLS0tLS0tIENsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBSZWNvcmQqPiAmQ2xhc3NlcyA9IFJLLmdldENsYXNzZXMoKTsKKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUmVjb3JkKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBDbGFzc2VzLmJlZ2luKCksCisgICAgICAgICBFID0gQ2xhc3Nlcy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgT1MgPDwgImNsYXNzICIgPDwgKkktPnNlY29uZDsKKworICBPUyA8PCAiLS0tLS0tLS0tLS0tLSBEZWZzIC0tLS0tLS0tLS0tLS0tLS0tXG4iOworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUmVjb3JkKj4gJkRlZnMgPSBSSy5nZXREZWZzKCk7CisgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvciBJID0gRGVmcy5iZWdpbigpLAorICAgICAgICAgRSA9IERlZnMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIE9TIDw8ICJkZWYgIiA8PCAqSS0+c2Vjb25kOworICByZXR1cm4gT1M7Cit9CisKKworLy8vIGdldEFsbERlcml2ZWREZWZpbml0aW9ucyAtIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIGNvbmNyZXRlIGRlZmluaXRpb25zCisvLy8gdGhhdCBkZXJpdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUuICBJZiBhIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZAorLy8vIG5hbWUgZG9lcyBub3QgZXhpc3QsIGFuIGVycm9yIGlzIHByaW50ZWQgYW5kIHRydWUgaXMgcmV0dXJuZWQuCitzdGQ6OnZlY3RvcjxSZWNvcmQqPgorUmVjb3JkS2VlcGVyOjpnZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoY29uc3Qgc3RkOjpzdHJpbmcgJkNsYXNzTmFtZSkgY29uc3QgeworICBSZWNvcmQgKkNsYXNzID0gUmVjb3Jkcy5nZXRDbGFzcyhDbGFzc05hbWUpOworICBpZiAoIUNsYXNzKQorICAgIHRocm93ICJFUlJPUjogQ291bGRuJ3QgZmluZCB0aGUgYCIgKyBDbGFzc05hbWUgKyAiJyBjbGFzcyFcbiI7CisKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gRGVmczsKKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUmVjb3JkKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBnZXREZWZzKCkuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBnZXREZWZzKCkuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChJLT5zZWNvbmQtPmlzU3ViQ2xhc3NPZihDbGFzcykpCisgICAgICBEZWZzLnB1c2hfYmFjayhJLT5zZWNvbmQpOworCisgIHJldHVybiBEZWZzOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9SZWNvcmQuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1JlY29yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOWZkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9SZWNvcmQuaApAQCAtMCwwICsxLDE0OTcgQEAKKy8vPT09LSBSZWNvcmQuaCAtIENsYXNzZXMgdG8gcmVwcmVzZW50IFRhYmxlIFJlY29yZHMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIG1haW4gVGFibGVHZW4gZGF0YSBzdHJ1Y3R1cmVzLCBpbmNsdWRpbmcgdGhlIFRhYmxlR2VuCisvLyB0eXBlcywgdmFsdWVzLCBhbmQgaGlnaC1sZXZlbCBkYXRhIHN0cnVjdHVyZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBSRUNPUkRfSAorI2RlZmluZSBSRUNPUkRfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vIFJlY1R5IHN1YmNsYXNzZXMuCitjbGFzcyBCaXRSZWNUeTsKK2NsYXNzIEJpdHNSZWNUeTsKK2NsYXNzIEludFJlY1R5OworY2xhc3MgU3RyaW5nUmVjVHk7CitjbGFzcyBMaXN0UmVjVHk7CitjbGFzcyBDb2RlUmVjVHk7CitjbGFzcyBEYWdSZWNUeTsKK2NsYXNzIFJlY29yZFJlY1R5OworCisvLyBJbml0IHN1YmNsYXNzZXMuCitzdHJ1Y3QgSW5pdDsKK2NsYXNzIFVuc2V0SW5pdDsKK2NsYXNzIEJpdEluaXQ7CitjbGFzcyBCaXRzSW5pdDsKK2NsYXNzIEludEluaXQ7CitjbGFzcyBTdHJpbmdJbml0OworY2xhc3MgQ29kZUluaXQ7CitjbGFzcyBMaXN0SW5pdDsKK2NsYXNzIFVuT3BJbml0OworY2xhc3MgQmluT3BJbml0OworY2xhc3MgVGVybk9wSW5pdDsKK2NsYXNzIERlZkluaXQ7CitjbGFzcyBEYWdJbml0OworY2xhc3MgVHlwZWRJbml0OworY2xhc3MgVmFySW5pdDsKK2NsYXNzIEZpZWxkSW5pdDsKK2NsYXNzIFZhckJpdEluaXQ7CitjbGFzcyBWYXJMaXN0RWxlbWVudEluaXQ7CisKKy8vIE90aGVyIGNsYXNzZXMuCitjbGFzcyBSZWNvcmQ7CitjbGFzcyBSZWNvcmRWYWw7CitzdHJ1Y3QgTXVsdGlDbGFzczsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBUeXBlIENsYXNzZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3N0cnVjdCBSZWNUeSB7CisgIHZpcnR1YWwgflJlY1R5KCkge30KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgPSAwOworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeyBPUyA8PCBnZXRBc1N0cmluZygpOyB9CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyB0eXBlSXNDb252ZXJ0aWJsZVRvIC0gUmV0dXJuIHRydWUgaWYgYWxsIHZhbHVlcyBvZiAndGhpcycgdHlwZSBjYW4gYmUKKyAgLy8vIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIHZpcnR1YWwgYm9vbCB0eXBlSXNDb252ZXJ0aWJsZVRvKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0ID0gMDsKKworcHVibGljOiAgIC8vIFRoZXNlIG1ldGhvZHMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gc3ViY2xhc3NlcyBvZiBJbml0CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBVbnNldEluaXQgKlVJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIEJpdEluaXQgKkJJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgQml0c0luaXQgKkJJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIEludEluaXQgKklJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKFN0cmluZ0luaXQgKlNJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgTGlzdEluaXQgKkxJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBVbk9wSW5pdCAqVUkpIHsKKyAgICByZXR1cm4gY29udmVydFZhbHVlKChUeXBlZEluaXQqKVVJKTsKKyAgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggQmluT3BJbml0ICpVSSkgeworICAgIHJldHVybiBjb252ZXJ0VmFsdWUoKFR5cGVkSW5pdCopVUkpOworICB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBUZXJuT3BJbml0ICpVSSkgeworICAgIHJldHVybiBjb252ZXJ0VmFsdWUoKFR5cGVkSW5pdCopVUkpOworICB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgQ29kZUluaXQgKkNJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKFZhckJpdEluaXQgKlZCKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIERlZkluaXQgKkRJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIERhZ0luaXQgKkRJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBUeXBlZEluaXQgKlRJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIFZhckluaXQgKlZJKSB7CisgICAgcmV0dXJuIGNvbnZlcnRWYWx1ZSgoVHlwZWRJbml0KilWSSk7CisgIH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIEZpZWxkSW5pdCAqRkkpIHsKKyAgICByZXR1cm4gY29udmVydFZhbHVlKChUeXBlZEluaXQqKUZJKTsKKyAgfQorCitwdWJsaWM6ICAgLy8gVGhlc2UgbWV0aG9kcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgc3ViY2xhc3NlcyBvZiBSZWNUeS4KKyAgLy8gYmFzZUNsYXNzT2YgLSBUaGVzZSB2aXJ0dWFsIG1ldGhvZHMgc2hvdWxkIGJlIG92ZXJsb2FkZWQgdG8gcmV0dXJuIHRydWUgaWZmCisgIC8vIGFsbCB2YWx1ZXMgb2YgdHlwZSAnUkhTJyBjYW4gYmUgY29udmVydGVkIHRvIHRoZSAndGhpcycgdHlwZS4KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEJpdFJlY1R5ICAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBCaXRzUmVjVHkgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgSW50UmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IFN0cmluZ1JlY1R5ICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBMaXN0UmVjVHkgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgQ29kZVJlY1R5ICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IERhZ1JlY1R5ICAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBSZWNvcmRSZWNUeSAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVjVHkgJlR5KSB7CisgIFR5LnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCisKKy8vLyBCaXRSZWNUeSAtICdiaXQnIC0gUmVwcmVzZW50IGEgc2luZ2xlIGJpdAorLy8vCitjbGFzcyBCaXRSZWNUeSA6IHB1YmxpYyBSZWNUeSB7CitwdWJsaWM6CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBVbnNldEluaXQgKlVJKSB7IHJldHVybiAoSW5pdCopVUk7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgQml0SW5pdCAqQkkpIHsgcmV0dXJuIChJbml0KilCSTsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggIEJpdHNJbml0ICpCSSk7CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIEludEluaXQgKklJKTsKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoU3RyaW5nSW5pdCAqU0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBMaXN0SW5pdCAqTEkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBDb2RlSW5pdCAqQ0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoVmFyQml0SW5pdCAqVkIpIHsgcmV0dXJuIChJbml0KilWQjsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBEZWZJbml0ICpESSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBEYWdJbml0ICpESSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVW5PcEluaXQgKlVJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKFVJKTt9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBCaW5PcEluaXQgKlVJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKFVJKTt9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBUZXJuT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVHlwZWRJbml0ICpUSSk7CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIFZhckluaXQgKlZJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKFZJKTt9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBGaWVsZEluaXQgKkZJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKEZJKTt9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCB7IHJldHVybiAiYml0IjsgfQorCisgIGJvb2wgdHlwZUlzQ29udmVydGlibGVUbyhjb25zdCBSZWNUeSAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJIUy0+YmFzZUNsYXNzT2YodGhpcyk7CisgIH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEJpdFJlY1R5ICAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEJpdHNSZWNUeSAgICpSSFMpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgSW50UmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgU3RyaW5nUmVjVHkgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IExpc3RSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBDb2RlUmVjVHkgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgRGFnUmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IFJlY29yZFJlY1R5ICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKK307CisKKworLy8gQml0c1JlY1R5IC0gJ2JpdHM8bj4nIC0gUmVwcmVzZW50IGEgZml4ZWQgbnVtYmVyIG9mIGJpdHMKKy8vLyBCaXRzUmVjVHkgLSAnYml0cyZsdDtuJmd0OycgLSBSZXByZXNlbnQgYSBmaXhlZCBudW1iZXIgb2YgYml0cworLy8vCitjbGFzcyBCaXRzUmVjVHkgOiBwdWJsaWMgUmVjVHkgeworICB1bnNpZ25lZCBTaXplOworcHVibGljOgorICBleHBsaWNpdCBCaXRzUmVjVHkodW5zaWduZWQgU3opIDogU2l6ZShTeikge30KKworICB1bnNpZ25lZCBnZXROdW1CaXRzKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBVbnNldEluaXQgKlVJKTsKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgQml0SW5pdCAqVUkpOworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggIEJpdHNJbml0ICpCSSk7CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIEludEluaXQgKklJKTsKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoU3RyaW5nSW5pdCAqU0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBMaXN0SW5pdCAqTEkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBDb2RlSW5pdCAqQ0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoVmFyQml0SW5pdCAqVkIpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGVmSW5pdCAqREkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGFnSW5pdCAqREkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFVuT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggQmluT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVGVybk9wSW5pdCAqVUkpIHsgcmV0dXJuIFJlY1R5Ojpjb252ZXJ0VmFsdWUoVUkpO30KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFR5cGVkSW5pdCAqVEkpOworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBWYXJJbml0ICpWSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShWSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggRmllbGRJbml0ICpGSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShGSSk7fQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Q7CisKKyAgYm9vbCB0eXBlSXNDb252ZXJ0aWJsZVRvKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUkhTLT5iYXNlQ2xhc3NPZih0aGlzKTsKKyAgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgQml0UmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gU2l6ZSA9PSAxOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBCaXRzUmVjVHkgICAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJIUy0+U2l6ZSA9PSBTaXplOworICB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBJbnRSZWNUeSAgICAqUkhTKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBTdHJpbmdSZWNUeSAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgTGlzdFJlY1R5ICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IENvZGVSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBEYWdSZWNUeSAgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgUmVjb3JkUmVjVHkgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworfTsKKworCisvLy8gSW50UmVjVHkgLSAnaW50JyAtIFJlcHJlc2VudCBhbiBpbnRlZ2VyIHZhbHVlIG9mIG5vIHBhcnRpY3VsYXIgc2l6ZQorLy8vCitjbGFzcyBJbnRSZWNUeSA6IHB1YmxpYyBSZWNUeSB7CitwdWJsaWM6CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBVbnNldEluaXQgKlVJKSB7IHJldHVybiAoSW5pdCopVUk7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgQml0SW5pdCAqQkkpOworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggIEJpdHNJbml0ICpCSSk7CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIEludEluaXQgKklJKSB7IHJldHVybiAoSW5pdCopSUk7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoU3RyaW5nSW5pdCAqU0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBMaXN0SW5pdCAqTEkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBDb2RlSW5pdCAqQ0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoVmFyQml0SW5pdCAqVkIpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGVmSW5pdCAqREkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGFnSW5pdCAqREkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFVuT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggQmluT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVGVybk9wSW5pdCAqVUkpIHsgcmV0dXJuIFJlY1R5Ojpjb252ZXJ0VmFsdWUoVUkpO30KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFR5cGVkSW5pdCAqVEkpOworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBWYXJJbml0ICpWSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShWSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggRmllbGRJbml0ICpGSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShGSSk7fQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gImludCI7IH0KKworICBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3QgeworICAgIHJldHVybiBSSFMtPmJhc2VDbGFzc09mKHRoaXMpOworICB9CisKKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEJpdFJlY1R5ICAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEJpdHNSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEludFJlY1R5ICAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IFN0cmluZ1JlY1R5ICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBMaXN0UmVjVHkgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgQ29kZVJlY1R5ICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IERhZ1JlY1R5ICAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBSZWNvcmRSZWNUeSAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCit9OworCisvLy8gU3RyaW5nUmVjVHkgLSAnc3RyaW5nJyAtIFJlcHJlc2VudCBhbiBzdHJpbmcgdmFsdWUKKy8vLworY2xhc3MgU3RyaW5nUmVjVHkgOiBwdWJsaWMgUmVjVHkgeworcHVibGljOgorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVW5zZXRJbml0ICpVSSkgeyByZXR1cm4gKEluaXQqKVVJOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIEJpdEluaXQgKkJJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgQml0c0luaXQgKkJJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIEludEluaXQgKklJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKFN0cmluZ0luaXQgKlNJKSB7IHJldHVybiAoSW5pdCopU0k7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBMaXN0SW5pdCAqTEkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFVuT3BJbml0ICpCTyk7CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBCaW5PcEluaXQgKkJPKTsKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFRlcm5PcEluaXQgKkJPKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKEJPKTt9CisKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBDb2RlSW5pdCAqQ0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoVmFyQml0SW5pdCAqVkIpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGVmSW5pdCAqREkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGFnSW5pdCAqREkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFR5cGVkSW5pdCAqVEkpOworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBWYXJJbml0ICpWSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShWSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggRmllbGRJbml0ICpGSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShGSSk7fQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gInN0cmluZyI7IH0KKworICBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3QgeworICAgIHJldHVybiBSSFMtPmJhc2VDbGFzc09mKHRoaXMpOworICB9CisKKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEJpdFJlY1R5ICAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBCaXRzUmVjVHkgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgSW50UmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IFN0cmluZ1JlY1R5ICpSSFMpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IExpc3RSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBDb2RlUmVjVHkgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgRGFnUmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IFJlY29yZFJlY1R5ICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCisvLyBMaXN0UmVjVHkgLSAnbGlzdDxUeT4nIC0gUmVwcmVzZW50IGEgbGlzdCBvZiB2YWx1ZXMsIGFsbCBvZiB3aGljaCBtdXN0IGJlIG9mCisvLyB0aGUgc3BlY2lmaWVkIHR5cGUuCisvLy8gTGlzdFJlY1R5IC0gJ2xpc3QmbHQ7VHkmZ3Q7JyAtIFJlcHJlc2VudCBhIGxpc3Qgb2YgdmFsdWVzLCBhbGwgb2Ygd2hpY2ggbXVzdAorLy8vIGJlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKy8vLworY2xhc3MgTGlzdFJlY1R5IDogcHVibGljIFJlY1R5IHsKKyAgUmVjVHkgKlR5OworcHVibGljOgorICBleHBsaWNpdCBMaXN0UmVjVHkoUmVjVHkgKlQpIDogVHkoVCkge30KKworICBSZWNUeSAqZ2V0RWxlbWVudFR5cGUoKSBjb25zdCB7IHJldHVybiBUeTsgfQorCisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBVbnNldEluaXQgKlVJKSB7IHJldHVybiAoSW5pdCopVUk7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgQml0SW5pdCAqQkkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBCaXRzSW5pdCAqQkkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgSW50SW5pdCAqSUkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoU3RyaW5nSW5pdCAqU0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBMaXN0SW5pdCAqTEkpOworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggIENvZGVJbml0ICpDSSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZShWYXJCaXRJbml0ICpWQikgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBEZWZJbml0ICpESSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBEYWdJbml0ICpESSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVW5PcEluaXQgKlVJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKFVJKTt9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBCaW5PcEluaXQgKlVJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKFVJKTt9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBUZXJuT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVHlwZWRJbml0ICpUSSk7CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIFZhckluaXQgKlZJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKFZJKTt9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBGaWVsZEluaXQgKkZJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKEZJKTt9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdDsKKworICBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3QgeworICAgIHJldHVybiBSSFMtPmJhc2VDbGFzc09mKHRoaXMpOworICB9CisKKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEJpdFJlY1R5ICAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBCaXRzUmVjVHkgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgSW50UmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IFN0cmluZ1JlY1R5ICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBMaXN0UmVjVHkgICAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJIUy0+Z2V0RWxlbWVudFR5cGUoKS0+dHlwZUlzQ29udmVydGlibGVUbyhUeSk7CisgIH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IENvZGVSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBEYWdSZWNUeSAgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgUmVjb3JkUmVjVHkgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KK307CisKKy8vLyBDb2RlUmVjVHkgLSAnY29kZScgLSBSZXByZXNlbnQgYW4gY29kZSBmcmFnbWVudCwgZnVuY3Rpb24gb3IgbWV0aG9kLgorLy8vCitjbGFzcyBDb2RlUmVjVHkgOiBwdWJsaWMgUmVjVHkgeworcHVibGljOgorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVW5zZXRJbml0ICpVSSkgeyByZXR1cm4gKEluaXQqKVVJOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIEJpdEluaXQgKkJJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgQml0c0luaXQgKkJJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIEludEluaXQgKklJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKFN0cmluZ0luaXQgKlNJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgTGlzdEluaXQgKkxJKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgQ29kZUluaXQgKkNJKSB7IHJldHVybiAoSW5pdCopQ0k7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoVmFyQml0SW5pdCAqVkIpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGVmSW5pdCAqREkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGFnSW5pdCAqREkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFVuT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggQmluT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVGVybk9wSW5pdCAqVUkpIHsgcmV0dXJuIFJlY1R5Ojpjb252ZXJ0VmFsdWUoVUkpO30KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFR5cGVkSW5pdCAqVEkpOworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBWYXJJbml0ICpWSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShWSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggRmllbGRJbml0ICpGSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShGSSk7fQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gImNvZGUiOyB9CisKKyAgYm9vbCB0eXBlSXNDb252ZXJ0aWJsZVRvKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUkhTLT5iYXNlQ2xhc3NPZih0aGlzKTsKKyAgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgQml0UmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEJpdHNSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBJbnRSZWNUeSAgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgU3RyaW5nUmVjVHkgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IExpc3RSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBDb2RlUmVjVHkgICAqUkhTKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBEYWdSZWNUeSAgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgUmVjb3JkUmVjVHkgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KK307CisKKy8vLyBEYWdSZWNUeSAtICdkYWcnIC0gUmVwcmVzZW50IGEgZGFnIGZyYWdtZW50CisvLy8KK2NsYXNzIERhZ1JlY1R5IDogcHVibGljIFJlY1R5IHsKK3B1YmxpYzoKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFVuc2V0SW5pdCAqVUkpIHsgcmV0dXJuIChJbml0KilVSTsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBCaXRJbml0ICpCSSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggIEJpdHNJbml0ICpCSSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBJbnRJbml0ICpJSSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZShTdHJpbmdJbml0ICpTSSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggIExpc3RJbml0ICpMSSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggIENvZGVJbml0ICpDSSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZShWYXJCaXRJbml0ICpWQikgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBEZWZJbml0ICpESSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVW5PcEluaXQgKkJPKTsKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIEJpbk9wSW5pdCAqQk8pOworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVGVybk9wSW5pdCAqQk8pIHsgcmV0dXJuIFJlY1R5Ojpjb252ZXJ0VmFsdWUoQk8pO30KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGFnSW5pdCAqQ0kpIHsgcmV0dXJuIChJbml0KilDSTsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVHlwZWRJbml0ICpUSSk7CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIFZhckluaXQgKlZJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKFZJKTt9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBGaWVsZEluaXQgKkZJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKEZJKTt9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCB7IHJldHVybiAiZGFnIjsgfQorCisgIGJvb2wgdHlwZUlzQ29udmVydGlibGVUbyhjb25zdCBSZWNUeSAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJIUy0+YmFzZUNsYXNzT2YodGhpcyk7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgQml0UmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEJpdHNSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBJbnRSZWNUeSAgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgU3RyaW5nUmVjVHkgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IExpc3RSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBDb2RlUmVjVHkgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgRGFnUmVjVHkgICAgKlJIUykgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgUmVjb3JkUmVjVHkgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KK307CisKKworLy8vIFJlY29yZFJlY1R5IC0gJ1tjbGFzc25hbWVdJyAtIFJlcHJlc2VudCBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLCBzdWNoIGFzOgorLy8vIChSMzIgWCA9IEVBWCkuCisvLy8KK2NsYXNzIFJlY29yZFJlY1R5IDogcHVibGljIFJlY1R5IHsKKyAgUmVjb3JkICpSZWM7CitwdWJsaWM6CisgIGV4cGxpY2l0IFJlY29yZFJlY1R5KFJlY29yZCAqUikgOiBSZWMoUikge30KKworICBSZWNvcmQgKmdldFJlY29yZCgpIGNvbnN0IHsgcmV0dXJuIFJlYzsgfQorCisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBVbnNldEluaXQgKlVJKSB7IHJldHVybiAoSW5pdCopVUk7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgQml0SW5pdCAqQkkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBCaXRzSW5pdCAqQkkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgSW50SW5pdCAqSUkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoU3RyaW5nSW5pdCAqU0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBMaXN0SW5pdCAqTEkpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICBDb2RlSW5pdCAqQ0kpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoVmFyQml0SW5pdCAqVkIpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoIFVuT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggQmluT3BJbml0ICpVSSkgeyByZXR1cm4gUmVjVHk6OmNvbnZlcnRWYWx1ZShVSSk7fQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVGVybk9wSW5pdCAqVUkpIHsgcmV0dXJuIFJlY1R5Ojpjb252ZXJ0VmFsdWUoVUkpO30KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0VmFsdWUoICAgRGVmSW5pdCAqREkpOworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggICBEYWdJbml0ICpESSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRWYWx1ZSggVHlwZWRJbml0ICpWSSk7CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCAgIFZhckluaXQgKlZJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKFZJKTt9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydFZhbHVlKCBGaWVsZEluaXQgKkZJKSB7IHJldHVybiBSZWNUeTo6Y29udmVydFZhbHVlKEZJKTt9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdDsKKworICBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3QgeworICAgIHJldHVybiBSSFMtPmJhc2VDbGFzc09mKHRoaXMpOworICB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBCaXRSZWNUeSAgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgQml0c1JlY1R5ICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IEludFJlY1R5ICAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBTdHJpbmdSZWNUeSAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgTGlzdFJlY1R5ICAgKlJIUykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGJhc2VDbGFzc09mKGNvbnN0IENvZGVSZWNUeSAgICpSSFMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBiYXNlQ2xhc3NPZihjb25zdCBEYWdSZWNUeSAgICAqUkhTKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgYmFzZUNsYXNzT2YoY29uc3QgUmVjb3JkUmVjVHkgKlJIUykgY29uc3Q7Cit9OworCisvLy8gcmVzb2x2ZVR5cGVzIC0gRmluZCBhIGNvbW1vbiB0eXBlIHRoYXQgVDEgYW5kIFQyIGNvbnZlcnQgdG8uCisvLy8gUmV0dXJuIDAgaWYgbm8gc3VjaCB0eXBlIGV4aXN0cy4KKy8vLworUmVjVHkgKnJlc29sdmVUeXBlcyhSZWNUeSAqVDEsIFJlY1R5ICpUMik7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgSW5pdGlhbGl6ZXIgQ2xhc3NlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworc3RydWN0IEluaXQgeworICB2aXJ0dWFsIH5Jbml0KCkge30KKworICAvLy8gaXNDb21wbGV0ZSAtIFRoaXMgdmlydHVhbCBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgdmFsdWVzIHRoYXQgbWF5CisgIC8vLyBub3QgYmUgY29tcGxldGVseSBzcGVjaWZpZWQgeWV0LgorICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gcHJpbnQgLSBQcmludCBvdXQgdGhpcyB2YWx1ZS4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsgT1MgPDwgZ2V0QXNTdHJpbmcoKTsgfQorCisgIC8vLyBnZXRBc1N0cmluZyAtIENvbnZlcnQgdGhpcyB2YWx1ZSB0byBhIHN0cmluZyBmb3JtLgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgPSAwOworCisgIC8vLyBkdW1wIC0gRGVidWdnaW5nIG1ldGhvZCB0aGF0IG1heSBiZSBjYWxsZWQgdGhyb3VnaCBhIGRlYnVnZ2VyLCBqdXN0CisgIC8vLyBpbnZva2VzIHByaW50IG9uIHN0ZGVyci4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIGNvbnZlcnRJbml0aWFsaXplclRvIC0gVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGlzIGEgc2ltcGxlIGNhbGwtYmFjaworICAvLy8gZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgb3ZlcnJpZGRlbiB0byBjYWxsIHRoZSBhcHByb3ByaWF0ZQorICAvLy8gUmVjVHk6OmNvbnZlcnRWYWx1ZSBtZXRob2QuCisgIC8vLworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgPSAwOworCisgIC8vLyBjb252ZXJ0SW5pdGlhbGl6ZXJCaXRSYW5nZSAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaXRyYW5nZQorICAvLy8gc2VsZWN0aW9uIG9wZXJhdG9yLiAgR2l2ZW4gYW4gaW5pdGlhbGl6ZXIsIGl0IHNlbGVjdHMgdGhlIHNwZWNpZmllZCBiaXRzCisgIC8vLyBvdXQsIHJldHVybmluZyB0aGVtIGFzIGEgbmV3IGluaXQgb2YgYml0cyB0eXBlLiAgSWYgaXQgaXMgbm90IGxlZ2FsIHRvIHVzZQorICAvLy8gdGhlIGJpdCBzdWJzY3JpcHQgb3BlcmF0b3Igb24gdGhpcyBpbml0aWFsaXplciwgcmV0dXJuIG51bGwuCisgIC8vLworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplckJpdFJhbmdlKGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmQml0cykgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIGNvbnZlcnRJbml0TGlzdFNsaWNlIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGxpc3Qgc2xpY2UKKyAgLy8vIHNlbGVjdGlvbiBvcGVyYXRvci4gIEdpdmVuIGFuIGluaXRpYWxpemVyLCBpdCBzZWxlY3RzIHRoZSBzcGVjaWZpZWQgbGlzdAorICAvLy8gZWxlbWVudHMsIHJldHVybmluZyB0aGVtIGFzIGEgbmV3IGluaXQgb2YgbGlzdCB0eXBlLiAgSWYgaXQgaXMgbm90IGxlZ2FsCisgIC8vLyB0byB0YWtlIGEgc2xpY2Ugb2YgdGhpcywgcmV0dXJuIG51bGwuCisgIC8vLworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0TGlzdFNsaWNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmRWxlbWVudHMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXRGaWVsZFR5cGUgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgRmllbGRJbml0IGNsYXNzLgorICAvLy8gSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIG5hbWVkIGZpZWxkIGlmCisgIC8vLyB0aGV5IGFyZSBvZiByZWNvcmQgdHlwZS4KKyAgLy8vCisgIHZpcnR1YWwgUmVjVHkgKmdldEZpZWxkVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmRmllbGROYW1lKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgLy8vIGdldEZpZWxkSW5pdCAtIFRoaXMgbWV0aG9kIGNvbXBsZW1lbnRzIGdldEZpZWxkVHlwZSB0byByZXR1cm4gdGhlCisgIC8vLyBpbml0aWFsaXplciBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZC4gIElmIGdldEZpZWxkVHlwZSByZXR1cm5zIG5vbi1udWxsCisgIC8vLyB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIG5vbi1udWxsLCBvdGhlcndpc2UgaXQgcmV0dXJucyBudWxsLgorICAvLy8KKyAgdmlydHVhbCBJbml0ICpnZXRGaWVsZEluaXQoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRmllbGROYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gcmVzb2x2ZVJlZmVyZW5jZXMgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGNsYXNzZXMgdGhhdCByZWZlciB0byBvdGhlcgorICAvLy8gdmFyaWFibGVzIHdoaWNoIG1heSBub3QgYmUgZGVmaW5lZCBhdCB0aGUgdGltZSB0aGUgZXhwcmVzc2lvbiBpcyBmb3JtZWQuCisgIC8vLyBJZiBhIHZhbHVlIGlzIHNldCBmb3IgdGhlIHZhcmlhYmxlIGxhdGVyLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbgorICAvLy8gdXNlcnMgb2YgdGhlIHZhbHVlIHRvIGFsbG93IHRoZSB2YWx1ZSB0byBwcm9wYWdhdGUgb3V0LgorICAvLy8KKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYpIHsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgSW5pdCAmSSkgeworICBJLnByaW50KE9TKTsgcmV0dXJuIE9TOworfQorCisvLy8gVHlwZWRJbml0IC0gVGhpcyBpcyB0aGUgY29tbW9uIHN1cGVyLWNsYXNzIG9mIHR5cGVzIHRoYXQgaGF2ZSBhIHNwZWNpZmljLAorLy8vIGV4cGxpY2l0LCB0eXBlLgorLy8vCitjbGFzcyBUeXBlZEluaXQgOiBwdWJsaWMgSW5pdCB7CisgIFJlY1R5ICpUeTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVHlwZWRJbml0KFJlY1R5ICpUKSA6IFR5KFQpIHt9CisKKyAgUmVjVHkgKmdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeTsgfQorCisgIHZpcnR1YWwgSW5pdCAqY29udmVydEluaXRpYWxpemVyQml0UmFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZCaXRzKTsKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0SW5pdExpc3RTbGljZShjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJkVsZW1lbnRzKTsKKworICAvLy8gcmVzb2x2ZUJpdFJlZmVyZW5jZSAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW1wbGVtZW50CisgIC8vLyBWYXJCaXRJbml0OjpyZXNvbHZlUmVmZXJlbmNlcy4gIElmIHRoZSBiaXQgaXMgYWJsZSB0byBiZSByZXNvbHZlZCwgd2UKKyAgLy8vIHNpbXBseSByZXR1cm4gdGhlIHJlc29sdmVkIHZhbHVlLCBvdGhlcndpc2Ugd2UgcmV0dXJuIG51bGwuCisgIC8vLworICB2aXJ0dWFsIEluaXQgKnJlc29sdmVCaXRSZWZlcmVuY2UoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQml0KSA9IDA7CisKKyAgLy8vIHJlc29sdmVMaXN0RWxlbWVudFJlZmVyZW5jZSAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW1wbGVtZW50CisgIC8vLyBWYXJMaXN0RWxlbWVudEluaXQ6OnJlc29sdmVSZWZlcmVuY2VzLiAgSWYgdGhlIGxpc3QgZWxlbWVudCBpcyByZXNvbHZhYmxlCisgIC8vLyBub3csIHdlIHJldHVybiB0aGUgcmVzb2x2ZWQgdmFsdWUsIG90aGVyd2lzZSB3ZSByZXR1cm4gbnVsbC4KKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlTGlzdEVsZW1lbnRSZWZlcmVuY2UoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbHQpID0gMDsKK307CisKKworLy8vIFVuc2V0SW5pdCAtID8gLSBSZXByZXNlbnRzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUKKy8vLworY2xhc3MgVW5zZXRJbml0IDogcHVibGljIEluaXQgeworcHVibGljOgorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgeworICAgIHJldHVybiBUeS0+Y29udmVydFZhbHVlKHRoaXMpOworICB9CisKKyAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gIj8iOyB9Cit9OworCisKKy8vLyBCaXRJbml0IC0gdHJ1ZS9mYWxzZSAtIFJlcHJlc2VudCBhIGNvbmNyZXRlIGluaXRpYWxpemVyIGZvciBhIGJpdC4KKy8vLworY2xhc3MgQml0SW5pdCA6IHB1YmxpYyBJbml0IHsKKyAgYm9vbCBWYWx1ZTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQml0SW5pdChib29sIFYpIDogVmFsdWUoVikge30KKworICBib29sIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgeworICAgIHJldHVybiBUeS0+Y29udmVydFZhbHVlKHRoaXMpOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIFZhbHVlID8gIjEiIDogIjAiOyB9Cit9OworCisvLy8gQml0c0luaXQgLSB7IGEsIGIsIGMgfSAtIFJlcHJlc2VudHMgYW4gaW5pdGlhbGl6ZXIgZm9yIGEgQml0c1JlY1R5IHZhbHVlLgorLy8vIEl0IGNvbnRhaW5zIGEgdmVjdG9yIG9mIGJpdHMsIHdob3NlIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdHlwZS4KKy8vLworY2xhc3MgQml0c0luaXQgOiBwdWJsaWMgSW5pdCB7CisgIHN0ZDo6dmVjdG9yPEluaXQqPiBCaXRzOworcHVibGljOgorICBleHBsaWNpdCBCaXRzSW5pdCh1bnNpZ25lZCBTaXplKSA6IEJpdHMoU2l6ZSkge30KKworICB1bnNpZ25lZCBnZXROdW1CaXRzKCkgY29uc3QgeyByZXR1cm4gQml0cy5zaXplKCk7IH0KKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCB7CisgICAgYXNzZXJ0KEJpdCA8IEJpdHMuc2l6ZSgpICYmICJCaXQgaW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBCaXRzW0JpdF07CisgIH0KKyAgdm9pZCBzZXRCaXQodW5zaWduZWQgQml0LCBJbml0ICpWKSB7CisgICAgYXNzZXJ0KEJpdCA8IEJpdHMuc2l6ZSgpICYmICJCaXQgaW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgIGFzc2VydChCaXRzW0JpdF0gPT0gMCAmJiAiQml0IGFscmVhZHkgc2V0ISIpOworICAgIEJpdHNbQml0XSA9IFY7CisgIH0KKworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgeworICAgIHJldHVybiBUeS0+Y29udmVydFZhbHVlKHRoaXMpOworICB9CisgIHZpcnR1YWwgSW5pdCAqY29udmVydEluaXRpYWxpemVyQml0UmFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZCaXRzKTsKKworICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGdldE51bUJpdHMoKTsgKytpKQorICAgICAgaWYgKCFnZXRCaXQoaSktPmlzQ29tcGxldGUoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgYWxsSW5Db21wbGV0ZSgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGdldE51bUJpdHMoKTsgKytpKQorICAgICAgaWYgKGdldEJpdChpKS0+aXNDb21wbGV0ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OworCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWKTsKK307CisKKworLy8vIEludEluaXQgLSA3IC0gUmVwcmVzZW50IGFuIGluaXRhbGl6YXRpb24gYnkgYSBsaXRlcmFsIGludGVnZXIgdmFsdWUuCisvLy8KK2NsYXNzIEludEluaXQgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgaW50NjRfdCBWYWx1ZTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSW50SW5pdChpbnQ2NF90IFYpIDogVHlwZWRJbml0KG5ldyBJbnRSZWNUeSksIFZhbHVlKFYpIHt9CisKKyAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIHsKKyAgICByZXR1cm4gVHktPmNvbnZlcnRWYWx1ZSh0aGlzKTsKKyAgfQorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplckJpdFJhbmdlKGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmQml0cyk7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OworCisgIC8vLyByZXNvbHZlQml0UmVmZXJlbmNlIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQKKyAgLy8vIFZhckJpdEluaXQ6OnJlc29sdmVSZWZlcmVuY2VzLiAgSWYgdGhlIGJpdCBpcyBhYmxlIHRvIGJlIHJlc29sdmVkLCB3ZQorICAvLy8gc2ltcGx5IHJldHVybiB0aGUgcmVzb2x2ZWQgdmFsdWUsIG90aGVyd2lzZSB3ZSByZXR1cm4gbnVsbC4KKyAgLy8vCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZUJpdFJlZmVyZW5jZShSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaXQpIHsKKyAgICBhc3NlcnQoMCAmJiAiSWxsZWdhbCBiaXQgcmVmZXJlbmNlIG9mZiBpbnQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyByZXNvbHZlTGlzdEVsZW1lbnRSZWZlcmVuY2UgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudAorICAvLy8gVmFyTGlzdEVsZW1lbnRJbml0OjpyZXNvbHZlUmVmZXJlbmNlcy4gIElmIHRoZSBsaXN0IGVsZW1lbnQgaXMgcmVzb2x2YWJsZQorICAvLy8gbm93LCB3ZSByZXR1cm4gdGhlIHJlc29sdmVkIHZhbHVlLCBvdGhlcndpc2Ugd2UgcmV0dXJuIG51bGwuCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZUxpc3RFbGVtZW50UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWx0KSB7CisgICAgYXNzZXJ0KDAgJiYgIklsbGVnYWwgZWxlbWVudCByZWZlcmVuY2Ugb2ZmIGludCIpOworICAgIHJldHVybiAwOworICB9Cit9OworCisKKy8vLyBTdHJpbmdJbml0IC0gImZvbyIgLSBSZXByZXNlbnQgYW4gaW5pdGlhbGl6YXRpb24gYnkgYSBzdHJpbmcgdmFsdWUuCisvLy8KK2NsYXNzIFN0cmluZ0luaXQgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgc3RkOjpzdHJpbmcgVmFsdWU7CitwdWJsaWM6CisgIGV4cGxpY2l0IFN0cmluZ0luaXQoY29uc3Qgc3RkOjpzdHJpbmcgJlYpCisgICAgOiBUeXBlZEluaXQobmV3IFN0cmluZ1JlY1R5KSwgVmFsdWUoVikge30KKworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIHZpcnR1YWwgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSB7CisgICAgcmV0dXJuIFR5LT5jb252ZXJ0VmFsdWUodGhpcyk7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gIlwiIiArIFZhbHVlICsgIlwiIjsgfQorCisgIC8vLyByZXNvbHZlQml0UmVmZXJlbmNlIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQKKyAgLy8vIFZhckJpdEluaXQ6OnJlc29sdmVSZWZlcmVuY2VzLiAgSWYgdGhlIGJpdCBpcyBhYmxlIHRvIGJlIHJlc29sdmVkLCB3ZQorICAvLy8gc2ltcGx5IHJldHVybiB0aGUgcmVzb2x2ZWQgdmFsdWUsIG90aGVyd2lzZSB3ZSByZXR1cm4gbnVsbC4KKyAgLy8vCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZUJpdFJlZmVyZW5jZShSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaXQpIHsKKyAgICBhc3NlcnQoMCAmJiAiSWxsZWdhbCBiaXQgcmVmZXJlbmNlIG9mZiBzdHJpbmciKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyByZXNvbHZlTGlzdEVsZW1lbnRSZWZlcmVuY2UgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudAorICAvLy8gVmFyTGlzdEVsZW1lbnRJbml0OjpyZXNvbHZlUmVmZXJlbmNlcy4gIElmIHRoZSBsaXN0IGVsZW1lbnQgaXMgcmVzb2x2YWJsZQorICAvLy8gbm93LCB3ZSByZXR1cm4gdGhlIHJlc29sdmVkIHZhbHVlLCBvdGhlcndpc2Ugd2UgcmV0dXJuIG51bGwuCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZUxpc3RFbGVtZW50UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWx0KSB7CisgICAgYXNzZXJ0KDAgJiYgIklsbGVnYWwgZWxlbWVudCByZWZlcmVuY2Ugb2ZmIHN0cmluZyIpOworICAgIHJldHVybiAwOworICB9Cit9OworCisvLy8gQ29kZUluaXQgLSAiW3suLi59XSIgLSBSZXByZXNlbnQgYSBjb2RlIGZyYWdtZW50LgorLy8vCitjbGFzcyBDb2RlSW5pdCA6IHB1YmxpYyBJbml0IHsKKyAgc3RkOjpzdHJpbmcgVmFsdWU7CitwdWJsaWM6CisgIGV4cGxpY2l0IENvZGVJbml0KGNvbnN0IHN0ZDo6c3RyaW5nICZWKSA6IFZhbHVlKFYpIHt9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIHZpcnR1YWwgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSB7CisgICAgcmV0dXJuIFR5LT5jb252ZXJ0VmFsdWUodGhpcyk7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gIlt7IiArIFZhbHVlICsgIn1dIjsgfQorfTsKKworLy8vIExpc3RJbml0IC0gW0FMLCBBSCwgQ0xdIC0gUmVwcmVzZW50IGEgbGlzdCBvZiBkZWZzCisvLy8KK2NsYXNzIExpc3RJbml0IDogcHVibGljIFR5cGVkSW5pdCB7CisgIHN0ZDo6dmVjdG9yPEluaXQqPiBWYWx1ZXM7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8SW5pdCo+OjppdGVyYXRvciAgICAgICBpdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxJbml0Kj46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgIGV4cGxpY2l0IExpc3RJbml0KHN0ZDo6dmVjdG9yPEluaXQqPiAmVnMsIFJlY1R5ICpFbHRUeSkKKyAgICA6IFR5cGVkSW5pdChuZXcgTGlzdFJlY1R5KEVsdFR5KSkgeworICAgIFZhbHVlcy5zd2FwKFZzKTsKKyAgfQorICBleHBsaWNpdCBMaXN0SW5pdChpdGVyYXRvciBTdGFydCwgaXRlcmF0b3IgRW5kLCBSZWNUeSAqRWx0VHkpCisgICAgICA6IFR5cGVkSW5pdChuZXcgTGlzdFJlY1R5KEVsdFR5KSksIFZhbHVlcyhTdGFydCwgRW5kKSB7fQorCisgIHVuc2lnbmVkIGdldFNpemUoKSBjb25zdCB7IHJldHVybiBWYWx1ZXMuc2l6ZSgpOyB9CisgIEluaXQgKmdldEVsZW1lbnQodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgVmFsdWVzLnNpemUoKSAmJiAiTGlzdCBlbGVtZW50IGluZGV4IG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gVmFsdWVzW2ldOworICB9CisKKyAgUmVjb3JkICpnZXRFbGVtZW50QXNSZWNvcmQodW5zaWduZWQgaSkgY29uc3Q7CisKKyAgSW5pdCAqY29udmVydEluaXRMaXN0U2xpY2UoY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZFbGVtZW50cyk7CisKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIHsKKyAgICByZXR1cm4gVHktPmNvbnZlcnRWYWx1ZSh0aGlzKTsKKyAgfQorCisgIC8vLyByZXNvbHZlUmVmZXJlbmNlcyAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgY2xhc3NlcyB0aGF0IHJlZmVyIHRvIG90aGVyCisgIC8vLyB2YXJpYWJsZXMgd2hpY2ggbWF5IG5vdCBiZSBkZWZpbmVkIGF0IHRoZSB0aW1lIHRoZXkgZXhwcmVzc2lvbiBpcyBmb3JtZWQuCisgIC8vLyBJZiBhIHZhbHVlIGlzIHNldCBmb3IgdGhlIHZhcmlhYmxlIGxhdGVyLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbgorICAvLy8gdXNlcnMgb2YgdGhlIHZhbHVlIHRvIGFsbG93IHRoZSB2YWx1ZSB0byBwcm9wYWdhdGUgb3V0LgorICAvLy8KKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdDsKKworICBpbmxpbmUgaXRlcmF0b3IgICAgICAgYmVnaW4oKSAgICAgICB7IHJldHVybiBWYWx1ZXMuYmVnaW4oKTsgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBWYWx1ZXMuYmVnaW4oKTsgfQorICBpbmxpbmUgaXRlcmF0b3IgICAgICAgZW5kICAoKSAgICAgICB7IHJldHVybiBWYWx1ZXMuZW5kKCk7ICAgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kICAoKSBjb25zdCB7IHJldHVybiBWYWx1ZXMuZW5kKCk7ICAgfQorCisgIGlubGluZSBzaXplX3QgICAgICAgICBzaXplICgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlcy5zaXplKCk7ICB9CisgIGlubGluZSBib29sICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlcy5lbXB0eSgpOyB9CisKKyAgLy8vIHJlc29sdmVCaXRSZWZlcmVuY2UgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudAorICAvLy8gVmFyQml0SW5pdDo6cmVzb2x2ZVJlZmVyZW5jZXMuICBJZiB0aGUgYml0IGlzIGFibGUgdG8gYmUgcmVzb2x2ZWQsIHdlCisgIC8vLyBzaW1wbHkgcmV0dXJuIHRoZSByZXNvbHZlZCB2YWx1ZSwgb3RoZXJ3aXNlIHdlIHJldHVybiBudWxsLgorICAvLy8KKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlQml0UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJpdCkgeworICAgIGFzc2VydCgwICYmICJJbGxlZ2FsIGJpdCByZWZlcmVuY2Ugb2ZmIGxpc3QiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyByZXNvbHZlTGlzdEVsZW1lbnRSZWZlcmVuY2UgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudAorICAvLy8gVmFyTGlzdEVsZW1lbnRJbml0OjpyZXNvbHZlUmVmZXJlbmNlcy4gIElmIHRoZSBsaXN0IGVsZW1lbnQgaXMgcmVzb2x2YWJsZQorICAvLy8gbm93LCB3ZSByZXR1cm4gdGhlIHJlc29sdmVkIHZhbHVlLCBvdGhlcndpc2Ugd2UgcmV0dXJuIG51bGwuCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZUxpc3RFbGVtZW50UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWx0KTsKK307CisKKworLy8vIE9wSW5pdCAtIEJhc2UgY2xhc3MgZm9yIG9wZXJhdG9ycworLy8vCitjbGFzcyBPcEluaXQgOiBwdWJsaWMgVHlwZWRJbml0IHsKK3B1YmxpYzoKKyAgT3BJbml0KFJlY1R5ICpUeXBlKSA6IFR5cGVkSW5pdChUeXBlKSB7fQorCisgIC8vIENsb25lIC0gQ2xvbmUgdGhpcyBvcGVyYXRvciwgcmVwbGFjaW5nIGFyZ3VtZW50cyB3aXRoIHRoZSBuZXcgbGlzdAorICB2aXJ0dWFsIE9wSW5pdCAqY2xvbmUoc3RkOjp2ZWN0b3I8SW5pdCAqPiAmT3BlcmFuZHMpID0gMDsKKworICB2aXJ0dWFsIGludCBnZXROdW1PcGVyYW5kcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBJbml0ICpnZXRPcGVyYW5kKGludCBpKSA9IDA7CisKKyAgLy8gRm9sZCAtIElmIHBvc3NpYmxlLCBmb2xkIHRoaXMgdG8gYSBzaW1wbGVyIGluaXQuICBSZXR1cm4gdGhpcyBpZiBub3QKKyAgLy8gcG9zc2libGUgdG8gZm9sZC4KKyAgdmlydHVhbCBJbml0ICpGb2xkKFJlY29yZCAqQ3VyUmVjLCBNdWx0aUNsYXNzICpDdXJNdWx0aUNsYXNzKSA9IDA7CisKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIHsKKyAgICByZXR1cm4gVHktPmNvbnZlcnRWYWx1ZSh0aGlzKTsKKyAgfQorCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZUJpdFJlZmVyZW5jZShSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaXQpOworICB2aXJ0dWFsIEluaXQgKnJlc29sdmVMaXN0RWxlbWVudFJlZmVyZW5jZShSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVsdCk7Cit9OworCisKKy8vLyBVbk9wSW5pdCAtICFvcCAoWCkgLSBUcmFuc2Zvcm0gYW4gaW5pdC4KKy8vLworY2xhc3MgVW5PcEluaXQgOiBwdWJsaWMgT3BJbml0IHsKK3B1YmxpYzoKKyAgZW51bSBVbmFyeU9wIHsgQ0FTVCwgQ0FSLCBDRFIsIExOVUxMIH07Citwcml2YXRlOgorICBVbmFyeU9wIE9wYzsKKyAgSW5pdCAqTEhTOworcHVibGljOgorICBVbk9wSW5pdChVbmFyeU9wIG9wYywgSW5pdCAqbGhzLCBSZWNUeSAqVHlwZSkgOgorICAgICAgT3BJbml0KFR5cGUpLCBPcGMob3BjKSwgTEhTKGxocykgeworICB9CisKKyAgLy8gQ2xvbmUgLSBDbG9uZSB0aGlzIG9wZXJhdG9yLCByZXBsYWNpbmcgYXJndW1lbnRzIHdpdGggdGhlIG5ldyBsaXN0CisgIHZpcnR1YWwgT3BJbml0ICpjbG9uZShzdGQ6OnZlY3RvcjxJbml0ICo+ICZPcGVyYW5kcykgeworICAgIGFzc2VydChPcGVyYW5kcy5zaXplKCkgPT0gMSAmJgorICAgICAgICAgICAiV3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIGZvciB1bmFyeSBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gbmV3IFVuT3BJbml0KGdldE9wY29kZSgpLCAqT3BlcmFuZHMuYmVnaW4oKSwgZ2V0VHlwZSgpKTsKKyAgfQorCisgIGludCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIDE7IH0KKyAgSW5pdCAqZ2V0T3BlcmFuZChpbnQgaSkgeworICAgIGFzc2VydChpID09IDAgJiYgIkludmFsaWQgb3BlcmFuZCBpZCBmb3IgdW5hcnkgb3BlcmF0b3IiKTsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgpOworICB9CisKKyAgVW5hcnlPcCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcGM7IH0KKyAgSW5pdCAqZ2V0T3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIExIUzsgfQorCisgIC8vIEZvbGQgLSBJZiBwb3NzaWJsZSwgZm9sZCB0aGlzIHRvIGEgc2ltcGxlciBpbml0LiAgUmV0dXJuIHRoaXMgaWYgbm90CisgIC8vIHBvc3NpYmxlIHRvIGZvbGQuCisgIEluaXQgKkZvbGQoUmVjb3JkICpDdXJSZWMsIE11bHRpQ2xhc3MgKkN1ck11bHRpQ2xhc3MpOworCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWKTsKKworICAvLy8gZ2V0RmllbGRUeXBlIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIEZpZWxkSW5pdCBjbGFzcy4KKyAgLy8vIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBuYW1lZCBmaWVsZCBpZgorICAvLy8gdGhleSBhcmUgb2YgcmVjb3JkIHR5cGUuCisgIC8vLworICB2aXJ0dWFsIFJlY1R5ICpnZXRGaWVsZFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJkZpZWxkTmFtZSkgY29uc3Q7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OworfTsKKworLy8vIEJpbk9wSW5pdCAtICFvcCAoWCwgWSkgLSBDb21iaW5lIHR3byBpbml0cy4KKy8vLworY2xhc3MgQmluT3BJbml0IDogcHVibGljIE9wSW5pdCB7CitwdWJsaWM6CisgIGVudW0gQmluYXJ5T3AgeyBTSEwsIFNSQSwgU1JMLCBTVFJDT05DQVQsIENPTkNBVCwgTkFNRUNPTkNBVCwgRVEgfTsKK3ByaXZhdGU6CisgIEJpbmFyeU9wIE9wYzsKKyAgSW5pdCAqTEhTLCAqUkhTOworcHVibGljOgorICBCaW5PcEluaXQoQmluYXJ5T3Agb3BjLCBJbml0ICpsaHMsIEluaXQgKnJocywgUmVjVHkgKlR5cGUpIDoKKyAgICAgIE9wSW5pdChUeXBlKSwgT3BjKG9wYyksIExIUyhsaHMpLCBSSFMocmhzKSB7CisgIH0KKworICAvLyBDbG9uZSAtIENsb25lIHRoaXMgb3BlcmF0b3IsIHJlcGxhY2luZyBhcmd1bWVudHMgd2l0aCB0aGUgbmV3IGxpc3QKKyAgdmlydHVhbCBPcEluaXQgKmNsb25lKHN0ZDo6dmVjdG9yPEluaXQgKj4gJk9wZXJhbmRzKSB7CisgICAgYXNzZXJ0KE9wZXJhbmRzLnNpemUoKSA9PSAyICYmCisgICAgICAgICAgICJXcm9uZyBudW1iZXIgb2Ygb3BlcmFuZHMgZm9yIGJpbmFyeSBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gbmV3IEJpbk9wSW5pdChnZXRPcGNvZGUoKSwgT3BlcmFuZHNbMF0sIE9wZXJhbmRzWzFdLCBnZXRUeXBlKCkpOworICB9CisKKyAgaW50IGdldE51bU9wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gMjsgfQorICBJbml0ICpnZXRPcGVyYW5kKGludCBpKSB7CisgICAgYXNzZXJ0KChpID09IDAgfHwgaSA9PSAxKSAmJiAiSW52YWxpZCBvcGVyYW5kIGlkIGZvciBiaW5hcnkgb3BlcmF0b3IiKTsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICByZXR1cm4gZ2V0TEhTKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBnZXRSSFMoKTsKKyAgICB9CisgIH0KKworICBCaW5hcnlPcCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcGM7IH0KKyAgSW5pdCAqZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gTEhTOyB9CisgIEluaXQgKmdldFJIUygpIGNvbnN0IHsgcmV0dXJuIFJIUzsgfQorCisgIC8vIEZvbGQgLSBJZiBwb3NzaWJsZSwgZm9sZCB0aGlzIHRvIGEgc2ltcGxlciBpbml0LiAgUmV0dXJuIHRoaXMgaWYgbm90CisgIC8vIHBvc3NpYmxlIHRvIGZvbGQuCisgIEluaXQgKkZvbGQoUmVjb3JkICpDdXJSZWMsIE11bHRpQ2xhc3MgKkN1ck11bHRpQ2xhc3MpOworCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWKTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Q7Cit9OworCisvLy8gVGVybk9wSW5pdCAtICFvcCAoWCwgWSwgWikgLSBDb21iaW5lIHR3byBpbml0cy4KKy8vLworY2xhc3MgVGVybk9wSW5pdCA6IHB1YmxpYyBPcEluaXQgeworcHVibGljOgorICBlbnVtIFRlcm5hcnlPcCB7IFNVQlNULCBGT1JFQUNILCBJRiB9OworcHJpdmF0ZToKKyAgVGVybmFyeU9wIE9wYzsKKyAgSW5pdCAqTEhTLCAqTUhTLCAqUkhTOworcHVibGljOgorICBUZXJuT3BJbml0KFRlcm5hcnlPcCBvcGMsIEluaXQgKmxocywgSW5pdCAqbWhzLCBJbml0ICpyaHMsIFJlY1R5ICpUeXBlKSA6CisgICAgICBPcEluaXQoVHlwZSksIE9wYyhvcGMpLCBMSFMobGhzKSwgTUhTKG1ocyksIFJIUyhyaHMpIHsKKyAgfQorCisgIC8vIENsb25lIC0gQ2xvbmUgdGhpcyBvcGVyYXRvciwgcmVwbGFjaW5nIGFyZ3VtZW50cyB3aXRoIHRoZSBuZXcgbGlzdAorICB2aXJ0dWFsIE9wSW5pdCAqY2xvbmUoc3RkOjp2ZWN0b3I8SW5pdCAqPiAmT3BlcmFuZHMpIHsKKyAgICBhc3NlcnQoT3BlcmFuZHMuc2l6ZSgpID09IDMgJiYKKyAgICAgICAgICAgIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyBmb3IgdGVybmFyeSBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gbmV3IFRlcm5PcEluaXQoZ2V0T3Bjb2RlKCksIE9wZXJhbmRzWzBdLCBPcGVyYW5kc1sxXSwgT3BlcmFuZHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoKSk7CisgIH0KKworICBpbnQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiAzOyB9CisgIEluaXQgKmdldE9wZXJhbmQoaW50IGkpIHsKKyAgICBhc3NlcnQoKGkgPT0gMCB8fCBpID09IDEgfHwgaSA9PSAyKSAmJgorICAgICAgICAgICAiSW52YWxpZCBvcGVyYW5kIGlkIGZvciB0ZXJuYXJ5IG9wZXJhdG9yIik7CisgICAgaWYgKGkgPT0gMCkgeworICAgICAgcmV0dXJuIGdldExIUygpOworICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7CisgICAgICByZXR1cm4gZ2V0TUhTKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBnZXRSSFMoKTsKKyAgICB9CisgIH0KKworICBUZXJuYXJ5T3AgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gT3BjOyB9CisgIEluaXQgKmdldExIUygpIGNvbnN0IHsgcmV0dXJuIExIUzsgfQorICBJbml0ICpnZXRNSFMoKSBjb25zdCB7IHJldHVybiBNSFM7IH0KKyAgSW5pdCAqZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gUkhTOyB9CisKKyAgLy8gRm9sZCAtIElmIHBvc3NpYmxlLCBmb2xkIHRoaXMgdG8gYSBzaW1wbGVyIGluaXQuICBSZXR1cm4gdGhpcyBpZiBub3QKKyAgLy8gcG9zc2libGUgdG8gZm9sZC4KKyAgSW5pdCAqRm9sZChSZWNvcmQgKkN1clJlYywgTXVsdGlDbGFzcyAqQ3VyTXVsdGlDbGFzcyk7CisKKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdDsKK307CisKKworLy8vIFZhckluaXQgLSAnT3Bjb2RlJyAtIFJlcHJlc2VudCBhIHJlZmVyZW5jZSB0byBhbiBlbnRpcmUgdmFyaWFibGUgb2JqZWN0LgorLy8vCitjbGFzcyBWYXJJbml0IDogcHVibGljIFR5cGVkSW5pdCB7CisgIHN0ZDo6c3RyaW5nIFZhck5hbWU7CitwdWJsaWM6CisgIGV4cGxpY2l0IFZhckluaXQoY29uc3Qgc3RkOjpzdHJpbmcgJlZOLCBSZWNUeSAqVCkKKyAgICA6IFR5cGVkSW5pdChUKSwgVmFyTmFtZShWTikge30KKworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgeworICAgIHJldHVybiBUeS0+Y29udmVydFZhbHVlKHRoaXMpOworICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBWYXJOYW1lOyB9CisKKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlQml0UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJpdCk7CisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZUxpc3RFbGVtZW50UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWx0KTsKKworICB2aXJ0dWFsIFJlY1R5ICpnZXRGaWVsZFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJkZpZWxkTmFtZSkgY29uc3Q7CisgIHZpcnR1YWwgSW5pdCAqZ2V0RmllbGRJbml0KFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIHJlc29sdmVSZWZlcmVuY2VzIC0gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBjbGFzc2VzIHRoYXQgcmVmZXIgdG8gb3RoZXIKKyAgLy8vIHZhcmlhYmxlcyB3aGljaCBtYXkgbm90IGJlIGRlZmluZWQgYXQgdGhlIHRpbWUgdGhleSBleHByZXNzaW9uIGlzIGZvcm1lZC4KKyAgLy8vIElmIGEgdmFsdWUgaXMgc2V0IGZvciB0aGUgdmFyaWFibGUgbGF0ZXIsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uCisgIC8vLyB1c2VycyBvZiB0aGUgdmFsdWUgdG8gYWxsb3cgdGhlIHZhbHVlIHRvIHByb3BhZ2F0ZSBvdXQuCisgIC8vLworICB2aXJ0dWFsIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSVik7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIFZhck5hbWU7IH0KK307CisKKworLy8vIFZhckJpdEluaXQgLSBPcGNvZGV7MH0gLSBSZXByZXNlbnQgYWNjZXNzIHRvIG9uZSBiaXQgb2YgYSB2YXJpYWJsZSBvciBmaWVsZC4KKy8vLworY2xhc3MgVmFyQml0SW5pdCA6IHB1YmxpYyBJbml0IHsKKyAgVHlwZWRJbml0ICpUSTsKKyAgdW5zaWduZWQgQml0OworcHVibGljOgorICBWYXJCaXRJbml0KFR5cGVkSW5pdCAqVCwgdW5zaWduZWQgQikgOiBUSShUKSwgQml0KEIpIHsKKyAgICBhc3NlcnQoVC0+Z2V0VHlwZSgpICYmIGR5bmFtaWNfY2FzdDxCaXRzUmVjVHkqPihULT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICgoQml0c1JlY1R5KilULT5nZXRUeXBlKCkpLT5nZXROdW1CaXRzKCkgPiBCICYmCisgICAgICAgICAgICJJbGxlZ2FsIFZhckJpdEluaXQgZXhwcmVzc2lvbiEiKTsKKyAgfQorCisgIHZpcnR1YWwgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSB7CisgICAgcmV0dXJuIFR5LT5jb252ZXJ0VmFsdWUodGhpcyk7CisgIH0KKworICBUeXBlZEluaXQgKmdldFZhcmlhYmxlKCkgY29uc3QgeyByZXR1cm4gVEk7IH0KKyAgdW5zaWduZWQgZ2V0Qml0TnVtKCkgY29uc3QgeyByZXR1cm4gQml0OyB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OworICB2aXJ0dWFsIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSVik7Cit9OworCisvLy8gVmFyTGlzdEVsZW1lbnRJbml0IC0gTGlzdFs0XSAtIFJlcHJlc2VudCBhY2Nlc3MgdG8gb25lIGVsZW1lbnQgb2YgYSB2YXIgb3IKKy8vLyBmaWVsZC4KK2NsYXNzIFZhckxpc3RFbGVtZW50SW5pdCA6IHB1YmxpYyBUeXBlZEluaXQgeworICBUeXBlZEluaXQgKlRJOworICB1bnNpZ25lZCBFbGVtZW50OworcHVibGljOgorICBWYXJMaXN0RWxlbWVudEluaXQoVHlwZWRJbml0ICpULCB1bnNpZ25lZCBFKQorICAgIDogVHlwZWRJbml0KGR5bmFtaWNfY2FzdDxMaXN0UmVjVHkqPihULT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgICAgICAgICBUSShUKSwgRWxlbWVudChFKSB7CisgICAgYXNzZXJ0KFQtPmdldFR5cGUoKSAmJiBkeW5hbWljX2Nhc3Q8TGlzdFJlY1R5Kj4oVC0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgICAiSWxsZWdhbCBWYXJCaXRJbml0IGV4cHJlc3Npb24hIik7CisgIH0KKworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgeworICAgIHJldHVybiBUeS0+Y29udmVydFZhbHVlKHRoaXMpOworICB9CisKKyAgVHlwZWRJbml0ICpnZXRWYXJpYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRJOyB9CisgIHVuc2lnbmVkIGdldEVsZW1lbnROdW0oKSBjb25zdCB7IHJldHVybiBFbGVtZW50OyB9CisKKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlQml0UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJpdCk7CisKKyAgLy8vIHJlc29sdmVMaXN0RWxlbWVudFJlZmVyZW5jZSAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW1wbGVtZW50CisgIC8vLyBWYXJMaXN0RWxlbWVudEluaXQ6OnJlc29sdmVSZWZlcmVuY2VzLiAgSWYgdGhlIGxpc3QgZWxlbWVudCBpcyByZXNvbHZhYmxlCisgIC8vLyBub3csIHdlIHJldHVybiB0aGUgcmVzb2x2ZWQgdmFsdWUsIG90aGVyd2lzZSB3ZSByZXR1cm4gbnVsbC4KKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlTGlzdEVsZW1lbnRSZWZlcmVuY2UoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbHQpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdDsKKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYpOworfTsKKworLy8vIERlZkluaXQgLSBBTCAtIFJlcHJlc2VudCBhIHJlZmVyZW5jZSB0byBhICdkZWYnIGluIHRoZSBkZXNjcmlwdGlvbgorLy8vCitjbGFzcyBEZWZJbml0IDogcHVibGljIFR5cGVkSW5pdCB7CisgIFJlY29yZCAqRGVmOworcHVibGljOgorICBleHBsaWNpdCBEZWZJbml0KFJlY29yZCAqRCkgOiBUeXBlZEluaXQobmV3IFJlY29yZFJlY1R5KEQpKSwgRGVmKEQpIHt9CisKKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIHsKKyAgICByZXR1cm4gVHktPmNvbnZlcnRWYWx1ZSh0aGlzKTsKKyAgfQorCisgIFJlY29yZCAqZ2V0RGVmKCkgY29uc3QgeyByZXR1cm4gRGVmOyB9CisKKyAgLy92aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplckJpdFJhbmdlKGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmQml0cyk7CisKKyAgdmlydHVhbCBSZWNUeSAqZ2V0RmllbGRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZGaWVsZE5hbWUpIGNvbnN0OworICB2aXJ0dWFsIEluaXQgKmdldEZpZWxkSW5pdChSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZGaWVsZE5hbWUpIGNvbnN0OworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdDsKKworICAvLy8gcmVzb2x2ZUJpdFJlZmVyZW5jZSAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW1wbGVtZW50CisgIC8vLyBWYXJCaXRJbml0OjpyZXNvbHZlUmVmZXJlbmNlcy4gIElmIHRoZSBiaXQgaXMgYWJsZSB0byBiZSByZXNvbHZlZCwgd2UKKyAgLy8vIHNpbXBseSByZXR1cm4gdGhlIHJlc29sdmVkIHZhbHVlLCBvdGhlcndpc2Ugd2UgcmV0dXJuIG51bGwuCisgIC8vLworICB2aXJ0dWFsIEluaXQgKnJlc29sdmVCaXRSZWZlcmVuY2UoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQml0KSB7CisgICAgYXNzZXJ0KDAgJiYgIklsbGVnYWwgYml0IHJlZmVyZW5jZSBvZmYgZGVmIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gcmVzb2x2ZUxpc3RFbGVtZW50UmVmZXJlbmNlIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQKKyAgLy8vIFZhckxpc3RFbGVtZW50SW5pdDo6cmVzb2x2ZVJlZmVyZW5jZXMuICBJZiB0aGUgbGlzdCBlbGVtZW50IGlzIHJlc29sdmFibGUKKyAgLy8vIG5vdywgd2UgcmV0dXJuIHRoZSByZXNvbHZlZCB2YWx1ZSwgb3RoZXJ3aXNlIHdlIHJldHVybiBudWxsLgorICB2aXJ0dWFsIEluaXQgKnJlc29sdmVMaXN0RWxlbWVudFJlZmVyZW5jZShSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVsdCkgeworICAgIGFzc2VydCgwICYmICJJbGxlZ2FsIGVsZW1lbnQgcmVmZXJlbmNlIG9mZiBkZWYiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfTsKKworCisvLy8gRmllbGRJbml0IC0gWC5ZIC0gUmVwcmVzZW50IGEgcmVmZXJlbmNlIHRvIGEgc3ViZmllbGQgb2YgYSB2YXJpYWJsZQorLy8vCitjbGFzcyBGaWVsZEluaXQgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgSW5pdCAqUmVjOyAgICAgICAgICAgICAgICAvLyBSZWNvcmQgd2UgYXJlIHJlZmVycmluZyB0bworICBzdGQ6OnN0cmluZyBGaWVsZE5hbWU7ICAgIC8vIEZpZWxkIHdlIGFyZSBhY2Nlc3NpbmcKK3B1YmxpYzoKKyAgRmllbGRJbml0KEluaXQgKlIsIGNvbnN0IHN0ZDo6c3RyaW5nICZGTikKKyAgICA6IFR5cGVkSW5pdChSLT5nZXRGaWVsZFR5cGUoRk4pKSwgUmVjKFIpLCBGaWVsZE5hbWUoRk4pIHsKKyAgICBhc3NlcnQoZ2V0VHlwZSgpICYmICJGaWVsZEluaXQgd2l0aCBub24tcmVjb3JkIHR5cGUhIik7CisgIH0KKworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgeworICAgIHJldHVybiBUeS0+Y29udmVydFZhbHVlKHRoaXMpOworICB9CisKKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlQml0UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJpdCk7CisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZUxpc3RFbGVtZW50UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWx0KTsKKworICB2aXJ0dWFsIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSVik7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVjLT5nZXRBc1N0cmluZygpICsgIi4iICsgRmllbGROYW1lOworICB9Cit9OworCisvLy8gRGFnSW5pdCAtICh2IGEsIGIpIC0gUmVwcmVzZW50IGEgREFHIHRyZWUgdmFsdWUuICBEQUcgaW5pdHMgYXJlIHJlcXVpcmVkCisvLy8gdG8gaGF2ZSBhdCBsZWFzdCBvbmUgdmFsdWUgdGhlbiBhIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiBhcmd1bWVudHMuICBFYWNoCisvLy8gYXJndW1lbnQgY2FuIGhhdmUgYSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdC4KKy8vLworY2xhc3MgRGFnSW5pdCA6IHB1YmxpYyBUeXBlZEluaXQgeworICBJbml0ICpWYWw7CisgIHN0ZDo6c3RyaW5nIFZhbE5hbWU7CisgIHN0ZDo6dmVjdG9yPEluaXQqPiBBcmdzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQXJnTmFtZXM7CitwdWJsaWM6CisgIERhZ0luaXQoSW5pdCAqViwgc3RkOjpzdHJpbmcgVk4sCisgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEluaXQqLCBzdGQ6OnN0cmluZz4gPiAmYXJncykKKyAgICA6IFR5cGVkSW5pdChuZXcgRGFnUmVjVHkpLCBWYWwoViksIFZhbE5hbWUoVk4pIHsKKyAgICBBcmdzLnJlc2VydmUoYXJncy5zaXplKCkpOworICAgIEFyZ05hbWVzLnJlc2VydmUoYXJncy5zaXplKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBhcmdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEFyZ3MucHVzaF9iYWNrKGFyZ3NbaV0uZmlyc3QpOworICAgICAgQXJnTmFtZXMucHVzaF9iYWNrKGFyZ3NbaV0uc2Vjb25kKTsKKyAgICB9CisgIH0KKyAgRGFnSW5pdChJbml0ICpWLCBzdGQ6OnN0cmluZyBWTiwgY29uc3Qgc3RkOjp2ZWN0b3I8SW5pdCo+ICZhcmdzLAorICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJnTmFtZXMpCisgICAgOiBUeXBlZEluaXQobmV3IERhZ1JlY1R5KSwgVmFsKFYpLCBWYWxOYW1lKFZOKSwgQXJncyhhcmdzKSwKKyAgICAgIEFyZ05hbWVzKGFyZ05hbWVzKSB7IH0KKworICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgeworICAgIHJldHVybiBUeS0+Y29udmVydFZhbHVlKHRoaXMpOworICB9CisKKyAgSW5pdCAqZ2V0T3BlcmF0b3IoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIFZhbE5hbWU7IH0KKworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gQXJncy5zaXplKCk7IH0KKyAgSW5pdCAqZ2V0QXJnKHVuc2lnbmVkIE51bSkgY29uc3QgeworICAgIGFzc2VydChOdW0gPCBBcmdzLnNpemUoKSAmJiAiQXJnIG51bWJlciBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIEFyZ3NbTnVtXTsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0QXJnTmFtZSh1bnNpZ25lZCBOdW0pIGNvbnN0IHsKKyAgICBhc3NlcnQoTnVtIDwgQXJnTmFtZXMuc2l6ZSgpICYmICJBcmcgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gQXJnTmFtZXNbTnVtXTsKKyAgfQorCisgIHZvaWQgc2V0QXJnKHVuc2lnbmVkIE51bSwgSW5pdCAqSSkgeworICAgIGFzc2VydChOdW0gPCBBcmdzLnNpemUoKSAmJiAiQXJnIG51bWJlciBvdXQgb2YgcmFuZ2UhIik7CisgICAgQXJnc1tOdW1dID0gSTsKKyAgfQorCisgIHZpcnR1YWwgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWKTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Q7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxJbml0Kj46Oml0ZXJhdG9yICAgICAgICAgICAgIGFyZ19pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxJbml0Kj46OmNvbnN0X2l0ZXJhdG9yICAgICAgIGNvbnN0X2FyZ19pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yICAgICAgIG5hbWVfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9uYW1lX2l0ZXJhdG9yOworCisgIGlubGluZSBhcmdfaXRlcmF0b3IgICAgICAgIGFyZ19iZWdpbigpICAgICAgIHsgcmV0dXJuIEFyZ3MuYmVnaW4oKTsgfQorICBpbmxpbmUgY29uc3RfYXJnX2l0ZXJhdG9yICBhcmdfYmVnaW4oKSBjb25zdCB7IHJldHVybiBBcmdzLmJlZ2luKCk7IH0KKyAgaW5saW5lIGFyZ19pdGVyYXRvciAgICAgICAgYXJnX2VuZCAgKCkgICAgICAgeyByZXR1cm4gQXJncy5lbmQoKTsgICB9CisgIGlubGluZSBjb25zdF9hcmdfaXRlcmF0b3IgIGFyZ19lbmQgICgpIGNvbnN0IHsgcmV0dXJuIEFyZ3MuZW5kKCk7ICAgfQorCisgIGlubGluZSBzaXplX3QgICAgICAgICAgICAgIGFyZ19zaXplICgpIGNvbnN0IHsgcmV0dXJuIEFyZ3Muc2l6ZSgpOyAgfQorICBpbmxpbmUgYm9vbCAgICAgICAgICAgICAgICBhcmdfZW1wdHkoKSBjb25zdCB7IHJldHVybiBBcmdzLmVtcHR5KCk7IH0KKworICBpbmxpbmUgbmFtZV9pdGVyYXRvciAgICAgICBuYW1lX2JlZ2luKCkgICAgICAgeyByZXR1cm4gQXJnTmFtZXMuYmVnaW4oKTsgfQorICBpbmxpbmUgY29uc3RfbmFtZV9pdGVyYXRvciBuYW1lX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQXJnTmFtZXMuYmVnaW4oKTsgfQorICBpbmxpbmUgbmFtZV9pdGVyYXRvciAgICAgICBuYW1lX2VuZCAgKCkgICAgICAgeyByZXR1cm4gQXJnTmFtZXMuZW5kKCk7ICAgfQorICBpbmxpbmUgY29uc3RfbmFtZV9pdGVyYXRvciBuYW1lX2VuZCAgKCkgY29uc3QgeyByZXR1cm4gQXJnTmFtZXMuZW5kKCk7ICAgfQorCisgIGlubGluZSBzaXplX3QgICAgICAgICAgICAgIG5hbWVfc2l6ZSAoKSBjb25zdCB7IHJldHVybiBBcmdOYW1lcy5zaXplKCk7ICB9CisgIGlubGluZSBib29sICAgICAgICAgICAgICAgIG5hbWVfZW1wdHkoKSBjb25zdCB7IHJldHVybiBBcmdOYW1lcy5lbXB0eSgpOyB9CisKKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlQml0UmVmZXJlbmNlKFJlY29yZCAmUiwgY29uc3QgUmVjb3JkVmFsICpSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJpdCkgeworICAgIGFzc2VydCgwICYmICJJbGxlZ2FsIGJpdCByZWZlcmVuY2Ugb2ZmIGRhZyIpOworICAgIHJldHVybiAwOworICB9CisKKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlTGlzdEVsZW1lbnRSZWZlcmVuY2UoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbHQpIHsKKyAgICBhc3NlcnQoMCAmJiAiSWxsZWdhbCBlbGVtZW50IHJlZmVyZW5jZSBvZmYgZGFnIik7CisgICAgcmV0dXJuIDA7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgSGlnaC1MZXZlbCBDbGFzc2VzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBSZWNvcmRWYWwgeworICBzdGQ6OnN0cmluZyBOYW1lOworICBSZWNUeSAqVHk7CisgIHVuc2lnbmVkIFByZWZpeDsKKyAgSW5pdCAqVmFsdWU7CitwdWJsaWM6CisgIFJlY29yZFZhbChjb25zdCBzdGQ6OnN0cmluZyAmTiwgUmVjVHkgKlQsIHVuc2lnbmVkIFApOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIHVuc2lnbmVkIGdldFByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIFByZWZpeDsgfQorICBSZWNUeSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5OyB9CisgIEluaXQgKmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICBib29sIHNldFZhbHVlKEluaXQgKlYpIHsKKyAgICBpZiAoVikgeworICAgICAgVmFsdWUgPSBWLT5jb252ZXJ0SW5pdGlhbGl6ZXJUbyhUeSk7CisgICAgICByZXR1cm4gVmFsdWUgPT0gMDsKKyAgICB9CisgICAgVmFsdWUgPSAwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludFNlbSA9IHRydWUpIGNvbnN0OworfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVjb3JkVmFsICZSVikgeworICBSVi5wcmludChPUyA8PCAiICAiKTsKKyAgcmV0dXJuIE9TOworfQorCitjbGFzcyBSZWNvcmQgeworICBzdGF0aWMgdW5zaWduZWQgTGFzdElEOworCisgIC8vIFVuaXF1ZSByZWNvcmQgSUQuCisgIHVuc2lnbmVkIElEOworICBzdGQ6OnN0cmluZyBOYW1lOworICBTTUxvYyBMb2M7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBUZW1wbGF0ZUFyZ3M7CisgIHN0ZDo6dmVjdG9yPFJlY29yZFZhbD4gVmFsdWVzOworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBTdXBlckNsYXNzZXM7CitwdWJsaWM6CisKKyAgZXhwbGljaXQgUmVjb3JkKGNvbnN0IHN0ZDo6c3RyaW5nICZOLCBTTUxvYyBsb2MpIDoKKyAgICBJRChMYXN0SUQrKyksIE5hbWUoTiksIExvYyhsb2MpIHt9CisgIH5SZWNvcmQoKSB7fQorCisgIAorICBzdGF0aWMgdW5zaWduZWQgZ2V0TmV3VUlEKCkgeyByZXR1cm4gTGFzdElEKys7IH0KKyAgICAKKyAgICAKKyAgdW5zaWduZWQgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBJRDsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICB2b2lkIHNldE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpOyAgLy8gQWxzbyB1cGRhdGVzIFJlY29yZEtlZXBlci4KKworICBTTUxvYyBnZXRMb2MoKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmdldFRlbXBsYXRlQXJncygpIGNvbnN0IHsKKyAgICByZXR1cm4gVGVtcGxhdGVBcmdzOworICB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZFZhbD4gJmdldFZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIFZhbHVlczsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAgICZnZXRTdXBlckNsYXNzZXMoKSBjb25zdCB7IHJldHVybiBTdXBlckNsYXNzZXM7IH0KKworICBib29sIGlzVGVtcGxhdGVBcmcoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVGVtcGxhdGVBcmdzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVGVtcGxhdGVBcmdzW2ldID09IE5hbWUpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IFJlY29yZFZhbCAqZ2V0VmFsdWUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVmFsdWVzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVmFsdWVzW2ldLmdldE5hbWUoKSA9PSBOYW1lKSByZXR1cm4gJlZhbHVlc1tpXTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBSZWNvcmRWYWwgKmdldFZhbHVlKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHVlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFZhbHVlc1tpXS5nZXROYW1lKCkgPT0gTmFtZSkgcmV0dXJuICZWYWx1ZXNbaV07CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIGFkZFRlbXBsYXRlQXJnKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgYXNzZXJ0KCFpc1RlbXBsYXRlQXJnKE5hbWUpICYmICJUZW1wbGF0ZSBhcmcgYWxyZWFkeSBkZWZpbmVkISIpOworICAgIFRlbXBsYXRlQXJncy5wdXNoX2JhY2soTmFtZSk7CisgIH0KKworICB2b2lkIGFkZFZhbHVlKGNvbnN0IFJlY29yZFZhbCAmUlYpIHsKKyAgICBhc3NlcnQoZ2V0VmFsdWUoUlYuZ2V0TmFtZSgpKSA9PSAwICYmICJWYWx1ZSBhbHJlYWR5IGFkZGVkISIpOworICAgIFZhbHVlcy5wdXNoX2JhY2soUlYpOworICB9CisKKyAgdm9pZCByZW1vdmVWYWx1ZShTdHJpbmdSZWYgTmFtZSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChWYWx1ZXNbaV0uZ2V0TmFtZSgpID09IE5hbWUpIHsKKyAgICAgICAgVmFsdWVzLmVyYXNlKFZhbHVlcy5iZWdpbigpK2kpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgYXNzZXJ0KDAgJiYgIkNhbm5vdCByZW1vdmUgYW4gZW50cnkgdGhhdCBkb2VzIG5vdCBleGlzdCEiKTsKKyAgfQorCisgIGJvb2wgaXNTdWJDbGFzc09mKGNvbnN0IFJlY29yZCAqUikgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdXBlckNsYXNzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChTdXBlckNsYXNzZXNbaV0gPT0gUikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc1N1YkNsYXNzT2YoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3VwZXJDbGFzc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoU3VwZXJDbGFzc2VzW2ldLT5nZXROYW1lKCkgPT0gTmFtZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCBhZGRTdXBlckNsYXNzKFJlY29yZCAqUikgeworICAgIGFzc2VydCghaXNTdWJDbGFzc09mKFIpICYmICJBbHJlYWR5IHN1YmNsYXNzaW5nIHJlY29yZCEiKTsKKyAgICBTdXBlckNsYXNzZXMucHVzaF9iYWNrKFIpOworICB9CisKKyAgLy8vIHJlc29sdmVSZWZlcmVuY2VzIC0gSWYgdGhlcmUgYXJlIGFueSBmaWVsZCByZWZlcmVuY2VzIHRoYXQgcmVmZXIgdG8gZmllbGRzCisgIC8vLyB0aGF0IGhhdmUgYmVlbiBmaWxsZWQgaW4sIHdlIGNhbiBwcm9wYWdhdGUgdGhlIHZhbHVlcyBub3cuCisgIC8vLworICB2b2lkIHJlc29sdmVSZWZlcmVuY2VzKCkgeyByZXNvbHZlUmVmZXJlbmNlc1RvKDApOyB9CisKKyAgLy8vIHJlc29sdmVSZWZlcmVuY2VzVG8gLSBJZiBhbnl0aGluZyBpbiB0aGlzIHJlY29yZCByZWZlcnMgdG8gUlYsIHJlcGxhY2UgdGhlCisgIC8vLyByZWZlcmVuY2UgdG8gUlYgd2l0aCB0aGUgUkhTIG9mIFJWLiAgSWYgUlYgaXMgbnVsbCwgd2UgcmVzb2x2ZSBhbGwKKyAgLy8vIHBvc3NpYmxlIHJlZmVyZW5jZXMuCisgIHZvaWQgcmVzb2x2ZVJlZmVyZW5jZXNUbyhjb25zdCBSZWNvcmRWYWwgKlJWKTsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSGlnaC1sZXZlbCBtZXRob2RzIHVzZWZ1bCB0byB0YWJsZWdlbiBiYWNrLWVuZHMKKyAgLy8KKworICAvLy8gZ2V0VmFsdWVJbml0IC0gUmV0dXJuIHRoZSBpbml0aWFsaXplciBmb3IgYSB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwKKyAgLy8vIG9yIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QuCisgIC8vLworICBJbml0ICpnZXRWYWx1ZUluaXQoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIGdldFZhbHVlQXNTdHJpbmcgLSBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zCisgIC8vLyBpdHMgdmFsdWUgYXMgYSBzdHJpbmcsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QKKyAgLy8vIG9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuCisgIC8vLworICBzdGQ6OnN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBnZXRWYWx1ZUFzQml0c0luaXQgLSBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zCisgIC8vLyBpdHMgdmFsdWUgYXMgYSBCaXRzSW5pdCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdAorICAvLy8gb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKyAgLy8vCisgIEJpdHNJbml0ICpnZXRWYWx1ZUFzQml0c0luaXQoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIGdldFZhbHVlQXNMaXN0SW5pdCAtIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHJldHVybnMKKyAgLy8vIGl0cyB2YWx1ZSBhcyBhIExpc3RJbml0LCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0CisgIC8vLyBvciBpZiB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICAvLy8KKyAgTGlzdEluaXQgKmdldFZhbHVlQXNMaXN0SW5pdChTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gZ2V0VmFsdWVBc0xpc3RPZkRlZnMgLSBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZAorICAvLy8gcmV0dXJucyBpdHMgdmFsdWUgYXMgYSB2ZWN0b3Igb2YgcmVjb3JkcywgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZQorICAvLy8gZmllbGQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKyAgLy8vCisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IGdldFZhbHVlQXNMaXN0T2ZEZWZzKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBnZXRWYWx1ZUFzTGlzdE9mSW50cyAtIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHJldHVybnMKKyAgLy8vIGl0cyB2YWx1ZSBhcyBhIHZlY3RvciBvZiBpbnRlZ2VycywgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzCisgIC8vLyBub3QgZXhpc3Qgb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKyAgLy8vCisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGdldFZhbHVlQXNMaXN0T2ZJbnRzKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBnZXRWYWx1ZUFzRGVmIC0gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucyBpdHMKKyAgLy8vIHZhbHVlIGFzIGEgUmVjb3JkLCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0IG9yIGlmCisgIC8vLyB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICAvLy8KKyAgUmVjb3JkICpnZXRWYWx1ZUFzRGVmKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBnZXRWYWx1ZUFzQml0IC0gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucyBpdHMKKyAgLy8vIHZhbHVlIGFzIGEgYml0LCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0IG9yIGlmCisgIC8vLyB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICAvLy8KKyAgYm9vbCBnZXRWYWx1ZUFzQml0KFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBnZXRWYWx1ZUFzSW50IC0gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucyBpdHMKKyAgLy8vIHZhbHVlIGFzIGFuIGludDY0X3QsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3Qgb3IKKyAgLy8vIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisgIC8vLworICBpbnQ2NF90IGdldFZhbHVlQXNJbnQoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIGdldFZhbHVlQXNEYWcgLSBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zIGl0cworICAvLy8gdmFsdWUgYXMgYW4gRGFnLCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0IG9yIGlmCisgIC8vLyB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICAvLy8KKyAgRGFnSW5pdCAqZ2V0VmFsdWVBc0RhZyhTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gZ2V0VmFsdWVBc0NvZGUgLSBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zCisgIC8vLyBpdHMgdmFsdWUgYXMgdGhlIHN0cmluZyBkYXRhIGluIGEgQ29kZUluaXQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUKKyAgLy8vIGZpZWxkIGRvZXMgbm90IGV4aXN0IG9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSBjb2RlIG9iamVjdC4KKyAgLy8vCisgIHN0ZDo6c3RyaW5nIGdldFZhbHVlQXNDb2RlKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBSZWNvcmQgJlIpOworCitzdHJ1Y3QgTXVsdGlDbGFzcyB7CisgIFJlY29yZCBSZWM7ICAvLyBQbGFjZWhvbGRlciBmb3IgdGVtcGxhdGUgYXJncyBhbmQgTmFtZS4KKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBSZWNvcmRWZWN0b3I7CisgIFJlY29yZFZlY3RvciBEZWZQcm90b3R5cGVzOworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIE11bHRpQ2xhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIFNNTG9jIExvYykgOiBSZWMoTmFtZSwgTG9jKSB7fQorfTsKKworY2xhc3MgUmVjb3JkS2VlcGVyIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFJlY29yZCo+IENsYXNzZXMsIERlZnM7CitwdWJsaWM6CisgIH5SZWNvcmRLZWVwZXIoKSB7CisgICAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUmVjb3JkKj46Oml0ZXJhdG9yIEkgPSBDbGFzc2VzLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBDbGFzc2VzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGRlbGV0ZSBJLT5zZWNvbmQ7CisgICAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUmVjb3JkKj46Oml0ZXJhdG9yIEkgPSBEZWZzLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBEZWZzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGRlbGV0ZSBJLT5zZWNvbmQ7CisgIH0KKworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUmVjb3JkKj4gJmdldENsYXNzZXMoKSBjb25zdCB7IHJldHVybiBDbGFzc2VzOyB9CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBSZWNvcmQqPiAmZ2V0RGVmcygpIGNvbnN0IHsgcmV0dXJuIERlZnM7IH0KKworICBSZWNvcmQgKmdldENsYXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBjb25zdCB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvciBJID0gQ2xhc3Nlcy5maW5kKE5hbWUpOworICAgIHJldHVybiBJID09IENsYXNzZXMuZW5kKCkgPyAwIDogSS0+c2Vjb25kOworICB9CisgIFJlY29yZCAqZ2V0RGVmKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBjb25zdCB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvciBJID0gRGVmcy5maW5kKE5hbWUpOworICAgIHJldHVybiBJID09IERlZnMuZW5kKCkgPyAwIDogSS0+c2Vjb25kOworICB9CisgIHZvaWQgYWRkQ2xhc3MoUmVjb3JkICpSKSB7CisgICAgYXNzZXJ0KGdldENsYXNzKFItPmdldE5hbWUoKSkgPT0gMCAmJiAiQ2xhc3MgYWxyZWFkeSBleGlzdHMhIik7CisgICAgQ2xhc3Nlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUi0+Z2V0TmFtZSgpLCBSKSk7CisgIH0KKyAgdm9pZCBhZGREZWYoUmVjb3JkICpSKSB7CisgICAgYXNzZXJ0KGdldERlZihSLT5nZXROYW1lKCkpID09IDAgJiYgIkRlZiBhbHJlYWR5IGV4aXN0cyEiKTsKKyAgICBEZWZzLmluc2VydChzdGQ6Om1ha2VfcGFpcihSLT5nZXROYW1lKCksIFIpKTsKKyAgfQorCisgIC8vLyByZW1vdmVDbGFzcyAtIFJlbW92ZSwgYnV0IGRvIG5vdCBkZWxldGUsIHRoZSBzcGVjaWZpZWQgcmVjb3JkLgorICAvLy8KKyAgdm9pZCByZW1vdmVDbGFzcyhjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIGFzc2VydChDbGFzc2VzLmNvdW50KE5hbWUpICYmICJDbGFzcyBkb2VzIG5vdCBleGlzdCEiKTsKKyAgICBDbGFzc2VzLmVyYXNlKE5hbWUpOworICB9CisgIC8vLyByZW1vdmVEZWYgLSBSZW1vdmUsIGJ1dCBkbyBub3QgZGVsZXRlLCB0aGUgc3BlY2lmaWVkIHJlY29yZC4KKyAgLy8vCisgIHZvaWQgcmVtb3ZlRGVmKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgYXNzZXJ0KERlZnMuY291bnQoTmFtZSkgJiYgIkRlZiBkb2VzIG5vdCBleGlzdCEiKTsKKyAgICBEZWZzLmVyYXNlKE5hbWUpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEhpZ2gtbGV2ZWwgaGVscGVyIG1ldGhvZHMsIHVzZWZ1bCBmb3IgdGFibGVnZW4gYmFja2VuZHMuLi4KKworICAvLy8gZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zIC0gVGhpcyBtZXRob2QgcmV0dXJucyBhbGwgY29uY3JldGUgZGVmaW5pdGlvbnMKKyAgLy8vIHRoYXQgZGVyaXZlIGZyb20gdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lLiAgSWYgYSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIG5hbWUgZG9lcyBub3QgZXhpc3QsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+CisgIGdldEFsbERlcml2ZWREZWZpbml0aW9ucyhjb25zdCBzdGQ6OnN0cmluZyAmQ2xhc3NOYW1lKSBjb25zdDsKKworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy8vIExlc3NSZWNvcmQgLSBTb3J0aW5nIHByZWRpY2F0ZSB0byBzb3J0IHJlY29yZCBwb2ludGVycyBieSBuYW1lLgorLy8vCitzdHJ1Y3QgTGVzc1JlY29yZCB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSZWNvcmQgKlJlYzEsIGNvbnN0IFJlY29yZCAqUmVjMikgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdSZWYoUmVjMS0+Z2V0TmFtZSgpKS5jb21wYXJlX251bWVyaWMoUmVjMi0+Z2V0TmFtZSgpKSA8IDA7CisgIH0KK307CisKKy8vLyBMZXNzUmVjb3JkRmllbGROYW1lIC0gU29ydGluZyBwcmVkaWNhdGUgdG8gc29ydCByZWNvcmQgcG9pbnRlcnMgYnkgdGhlaXIKKy8vLyBuYW1lIGZpZWxkLgorLy8vCitzdHJ1Y3QgTGVzc1JlY29yZEZpZWxkTmFtZSB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSZWNvcmQgKlJlYzEsIGNvbnN0IFJlY29yZCAqUmVjMikgY29uc3QgeworICAgIHJldHVybiBSZWMxLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIikgPCBSZWMyLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIik7CisgIH0KK307CisKKworY2xhc3MgVEdFcnJvciB7CisgIFNNTG9jIExvYzsKKyAgc3RkOjpzdHJpbmcgTWVzc2FnZTsKK3B1YmxpYzoKKyAgVEdFcnJvcihTTUxvYyBsb2MsIGNvbnN0IHN0ZDo6c3RyaW5nICZtZXNzYWdlKSA6IExvYyhsb2MpLCBNZXNzYWdlKG1lc3NhZ2UpIHt9CisKKyAgU01Mb2MgZ2V0TG9jKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRNZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gTWVzc2FnZTsgfQorfTsKKworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFJlY29yZEtlZXBlciAmUkspOworCitleHRlcm4gUmVjb3JkS2VlcGVyIFJlY29yZHM7CisKK3ZvaWQgUHJpbnRFcnJvcihTTUxvYyBFcnJvckxvYywgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZyk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vUmVnaXN0ZXJJbmZvRW1pdHRlci5jcHAgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9SZWdpc3RlckluZm9FbWl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2NhMGJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vUmVnaXN0ZXJJbmZvRW1pdHRlci5jcHAKQEAgLTAsMCArMSwxMDQ1IEBACisvLz09PS0gUmVnaXN0ZXJJbmZvRW1pdHRlci5jcHAgLSBHZW5lcmF0ZSBhIFJlZ2lzdGVyIEZpbGUgRGVzYy4gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgdGFibGVnZW4gYmFja2VuZCBpcyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYSBkZXNjcmlwdGlvbiBvZiBhIHRhcmdldAorLy8gcmVnaXN0ZXIgZmlsZSBmb3IgYSBjb2RlIGdlbmVyYXRvci4gIEl0IHVzZXMgaW5zdGFuY2VzIG9mIHRoZSBSZWdpc3RlciwKKy8vIFJlZ2lzdGVyQWxpYXNlcywgYW5kIFJlZ2lzdGVyQ2xhc3MgY2xhc3NlcyB0byBnYXRoZXIgdGhpcyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiUmVnaXN0ZXJJbmZvRW1pdHRlci5oIgorI2luY2x1ZGUgIkNvZGVHZW5UYXJnZXQuaCIKKyNpbmNsdWRlICJDb2RlR2VuUmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNldD4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCisvLyBydW5FbnVtcyAtIFByaW50IG91dCBlbnVtIHZhbHVlcyBmb3IgYWxsIG9mIHRoZSByZWdpc3RlcnMuCit2b2lkIFJlZ2lzdGVySW5mb0VtaXR0ZXI6OnJ1bkVudW1zKHJhd19vc3RyZWFtICZPUykgeworICBDb2RlR2VuVGFyZ2V0IFRhcmdldDsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlblJlZ2lzdGVyPiAmUmVnaXN0ZXJzID0gVGFyZ2V0LmdldFJlZ2lzdGVycygpOworCisgIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZSA9IFJlZ2lzdGVyc1swXS5UaGVEZWYtPmdldFZhbHVlQXNTdHJpbmcoIk5hbWVzcGFjZSIpOworCisgIEVtaXRTb3VyY2VGaWxlSGVhZGVyKCJUYXJnZXQgUmVnaXN0ZXIgRW51bSBWYWx1ZXMiLCBPUyk7CisgIE9TIDw8ICJuYW1lc3BhY2UgbGx2bSB7XG5cbiI7CisKKyAgaWYgKCFOYW1lc3BhY2UuZW1wdHkoKSkKKyAgICBPUyA8PCAibmFtZXNwYWNlICIgPDwgTmFtZXNwYWNlIDw8ICIge1xuIjsKKyAgT1MgPDwgImVudW0ge1xuICBOb1JlZ2lzdGVyLFxuIjsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnaXN0ZXJzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgT1MgPDwgIiAgIiA8PCBSZWdpc3RlcnNbaV0uZ2V0TmFtZSgpIDw8ICIsIFx0Ly8gIiA8PCBpKzEgPDwgIlxuIjsKKyAgT1MgPDwgIiAgTlVNX1RBUkdFVF9SRUdTIFx0Ly8gIiA8PCBSZWdpc3RlcnMuc2l6ZSgpKzEgPDwgIlxuIjsKKyAgT1MgPDwgIn07XG4iOworICBpZiAoIU5hbWVzcGFjZS5lbXB0eSgpKQorICAgIE9TIDw8ICJ9XG4iOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+IFN1YlJlZ0luZGljZXMgPSBUYXJnZXQuZ2V0U3ViUmVnSW5kaWNlcygpOworICBpZiAoIVN1YlJlZ0luZGljZXMuZW1wdHkoKSkgeworICAgIE9TIDw8ICJcbi8vIFN1YnJlZ2lzdGVyIGluZGljZXNcbiI7CisgICAgTmFtZXNwYWNlID0gU3ViUmVnSW5kaWNlc1swXS0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZXNwYWNlIik7CisgICAgaWYgKCFOYW1lc3BhY2UuZW1wdHkoKSkKKyAgICAgIE9TIDw8ICJuYW1lc3BhY2UgIiA8PCBOYW1lc3BhY2UgPDwgIiB7XG4iOworICAgIE9TIDw8ICJlbnVtIHtcbiAgTm9TdWJSZWdpc3RlcixcbiI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN1YlJlZ0luZGljZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIE9TIDw8ICIgICIgPDwgU3ViUmVnSW5kaWNlc1tpXS0+Z2V0TmFtZSgpIDw8ICIsXHQvLyAiIDw8IGkrMSA8PCAiXG4iOworICAgIE9TIDw8ICIgIE5VTV9UQVJHRVRfU1VCUkVHUyA9ICIgPDwgU3ViUmVnSW5kaWNlcy5zaXplKCkrMSA8PCAiXG4iOworICAgIE9TIDw8ICJ9O1xuIjsKKyAgICBpZiAoIU5hbWVzcGFjZS5lbXB0eSgpKQorICAgICAgT1MgPDwgIn1cbiI7CisgIH0KKyAgT1MgPDwgIn0gLy8gRW5kIGxsdm0gbmFtZXNwYWNlIFxuIjsKK30KKwordm9pZCBSZWdpc3RlckluZm9FbWl0dGVyOjpydW5IZWFkZXIocmF3X29zdHJlYW0gJk9TKSB7CisgIEVtaXRTb3VyY2VGaWxlSGVhZGVyKCJSZWdpc3RlciBJbmZvcm1hdGlvbiBIZWFkZXIgRnJhZ21lbnQiLCBPUyk7CisgIENvZGVHZW5UYXJnZXQgVGFyZ2V0OworICBjb25zdCBzdGQ6OnN0cmluZyAmVGFyZ2V0TmFtZSA9IFRhcmdldC5nZXROYW1lKCk7CisgIHN0ZDo6c3RyaW5nIENsYXNzTmFtZSA9IFRhcmdldE5hbWUgKyAiR2VuUmVnaXN0ZXJJbmZvIjsKKworICBPUyA8PCAiI2luY2x1ZGUgXCJsbHZtL1RhcmdldC9UYXJnZXRSZWdpc3RlckluZm8uaFwiXG4iOworICBPUyA8PCAiI2luY2x1ZGUgPHN0cmluZz5cblxuIjsKKworICBPUyA8PCAibmFtZXNwYWNlIGxsdm0ge1xuXG4iOworCisgIE9TIDw8ICJzdHJ1Y3QgIiA8PCBDbGFzc05hbWUgPDwgIiA6IHB1YmxpYyBUYXJnZXRSZWdpc3RlckluZm8ge1xuIgorICAgICA8PCAiICBleHBsaWNpdCAiIDw8IENsYXNzTmFtZQorICAgICA8PCAiKGludCBDYWxsRnJhbWVTZXR1cE9wY29kZSA9IC0xLCBpbnQgQ2FsbEZyYW1lRGVzdHJveU9wY29kZSA9IC0xKTtcbiIKKyAgICAgPDwgIiAgdmlydHVhbCBpbnQgZ2V0RHdhcmZSZWdOdW1GdWxsKHVuc2lnbmVkIFJlZ051bSwgIgorICAgICA8PCAidW5zaWduZWQgRmxhdm91cikgY29uc3Q7XG4iCisgICAgIDw8ICIgIHZpcnR1YWwgaW50IGdldER3YXJmUmVnTnVtKHVuc2lnbmVkIFJlZ051bSwgYm9vbCBpc0VIKSBjb25zdCA9IDA7XG4iCisgICAgIDw8ICIgIHZpcnR1YWwgYm9vbCBuZWVkc1N0YWNrUmVhbGlnbm1lbnQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICYpIGNvbnN0XG4iCisgICAgIDw8ICIgICAgIHsgcmV0dXJuIGZhbHNlOyB9XG4iCisgICAgIDw8ICIgIHVuc2lnbmVkIGdldFN1YlJlZyh1bnNpZ25lZCBSZWdObywgdW5zaWduZWQgSW5kZXgpIGNvbnN0O1xuIgorICAgICA8PCAiICB1bnNpZ25lZCBnZXRTdWJSZWdJbmRleCh1bnNpZ25lZCBSZWdObywgdW5zaWduZWQgU3ViUmVnTm8pIGNvbnN0O1xuIgorICAgICA8PCAiICB1bnNpZ25lZCBjb21wb3NlU3ViUmVnSW5kaWNlcyh1bnNpZ25lZCwgdW5zaWduZWQpIGNvbnN0O1xuIgorICAgICA8PCAifTtcblxuIjsKKworICBjb25zdCBzdGQ6OnZlY3RvcjxDb2RlR2VuUmVnaXN0ZXJDbGFzcz4gJlJlZ2lzdGVyQ2xhc3NlcyA9CisgICAgVGFyZ2V0LmdldFJlZ2lzdGVyQ2xhc3NlcygpOworCisgIGlmICghUmVnaXN0ZXJDbGFzc2VzLmVtcHR5KCkpIHsKKyAgICBPUyA8PCAibmFtZXNwYWNlICIgPDwgUmVnaXN0ZXJDbGFzc2VzWzBdLk5hbWVzcGFjZQorICAgICAgIDw8ICIgeyAvLyBSZWdpc3RlciBjbGFzc2VzXG4iOworICAgICAgIAorICAgIE9TIDw8ICIgIGVudW0ge1xuIjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnaXN0ZXJDbGFzc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChpKSBPUyA8PCAiLFxuIjsKKyAgICAgIE9TIDw8ICIgICAgIiA8PCBSZWdpc3RlckNsYXNzZXNbaV0uZ2V0TmFtZSgpIDw8ICJSZWdDbGFzc0lEIjsKKyAgICAgIE9TIDw8ICIgPSAiIDw8IGk7CisgICAgfQorICAgIE9TIDw8ICJcbiAgfTtcblxuIjsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdpc3RlckNsYXNzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUgPSBSZWdpc3RlckNsYXNzZXNbaV0uZ2V0TmFtZSgpOworCisgICAgICAvLyBPdXRwdXQgdGhlIHJlZ2lzdGVyIGNsYXNzIGRlZmluaXRpb24uCisgICAgICBPUyA8PCAiICBzdHJ1Y3QgIiA8PCBOYW1lIDw8ICJDbGFzcyA6IHB1YmxpYyBUYXJnZXRSZWdpc3RlckNsYXNzIHtcbiIKKyAgICAgICAgIDw8ICIgICAgIiA8PCBOYW1lIDw8ICJDbGFzcygpO1xuIgorICAgICAgICAgPDwgUmVnaXN0ZXJDbGFzc2VzW2ldLk1ldGhvZFByb3RvcyA8PCAiICB9O1xuIjsKKworICAgICAgLy8gT3V0cHV0IHRoZSBleHRlcm4gZm9yIHRoZSBpbnN0YW5jZS4KKyAgICAgIE9TIDw8ICIgIGV4dGVybiAiIDw8IE5hbWUgPDwgIkNsYXNzXHQiIDw8IE5hbWUgPDwgIlJlZ0NsYXNzO1xuIjsKKyAgICAgIC8vIE91dHB1dCB0aGUgZXh0ZXJuIGZvciB0aGUgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgKHNob3VsZCByZW1vdmUpLgorICAgICAgT1MgPDwgIiAgc3RhdGljIFRhcmdldFJlZ2lzdGVyQ2xhc3MgKiBjb25zdCAiPDwgTmFtZSA8PCJSZWdpc3RlckNsYXNzID0gJiIKKyAgICAgICAgIDw8IE5hbWUgPDwgIlJlZ0NsYXNzO1xuIjsKKyAgICB9CisgICAgT1MgPDwgIn0gLy8gZW5kIG9mIG5hbWVzcGFjZSAiIDw8IFRhcmdldE5hbWUgPDwgIlxuXG4iOworICB9CisgIE9TIDw8ICJ9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZSBcbiI7Cit9CisKK2Jvb2wgaXNTdWJSZWdpc3RlckNsYXNzKGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICZSQywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PFJlY29yZCo+ICZSZWdTZXQpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJDLkVsZW1lbnRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQgKlJlZyA9IFJDLkVsZW1lbnRzW2ldOworICAgIGlmICghUmVnU2V0LmNvdW50KFJlZykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGFkZFN1cGVyUmVnKFJlY29yZCAqUiwgUmVjb3JkICpTLAorICAgICAgICAgICAgICAgICAgc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpzZXQ8UmVjb3JkKj4sIExlc3NSZWNvcmQ+ICZTdWJSZWdzLAorICAgICAgICAgICAgICAgICAgc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpzZXQ8UmVjb3JkKj4sIExlc3NSZWNvcmQ+ICZTdXBlclJlZ3MsCisgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxSZWNvcmQqLCBzdGQ6OnNldDxSZWNvcmQqPiwgTGVzc1JlY29yZD4gJkFsaWFzZXMpIHsKKyAgaWYgKFIgPT0gUykgeworICAgIGVycnMoKSA8PCAiRXJyb3I6IHJlY3Vyc2l2ZSBzdWItcmVnaXN0ZXIgcmVsYXRpb25zaGlwIGJldHdlZW4iCisgICAgICAgICAgIDw8ICIgcmVnaXN0ZXIgIiA8PCBnZXRRdWFsaWZpZWROYW1lKFIpCisgICAgICAgICAgIDw8ICIgYW5kIGl0cyBzdWItcmVnaXN0ZXJzP1xuIjsKKyAgICBhYm9ydCgpOworICB9CisgIGlmICghU3VwZXJSZWdzW1JdLmluc2VydChTKS5zZWNvbmQpCisgICAgcmV0dXJuOworICBTdWJSZWdzW1NdLmluc2VydChSKTsKKyAgQWxpYXNlc1tSXS5pbnNlcnQoUyk7CisgIEFsaWFzZXNbU10uaW5zZXJ0KFIpOworICBpZiAoU3VwZXJSZWdzLmNvdW50KFMpKQorICAgIGZvciAoc3RkOjpzZXQ8UmVjb3JkKj46Oml0ZXJhdG9yIEkgPSBTdXBlclJlZ3NbU10uYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IFN1cGVyUmVnc1tTXS5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBhZGRTdXBlclJlZyhSLCAqSSwgU3ViUmVncywgU3VwZXJSZWdzLCBBbGlhc2VzKTsKK30KKworc3RhdGljIHZvaWQgYWRkU3ViU3VwZXJSZWcoUmVjb3JkICpSLCBSZWNvcmQgKlMsCisgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpzZXQ8UmVjb3JkKj4sIExlc3NSZWNvcmQ+ICZTdWJSZWdzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPFJlY29yZCosIHN0ZDo6c2V0PFJlY29yZCo+LCBMZXNzUmVjb3JkPiAmU3VwZXJSZWdzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPFJlY29yZCosIHN0ZDo6c2V0PFJlY29yZCo+LCBMZXNzUmVjb3JkPiAmQWxpYXNlcykgeworICBpZiAoUiA9PSBTKSB7CisgICAgZXJycygpIDw8ICJFcnJvcjogcmVjdXJzaXZlIHN1Yi1yZWdpc3RlciByZWxhdGlvbnNoaXAgYmV0d2VlbiIKKyAgICAgICAgICAgPDwgIiByZWdpc3RlciAiIDw8IGdldFF1YWxpZmllZE5hbWUoUikKKyAgICAgICAgICAgPDwgIiBhbmQgaXRzIHN1Yi1yZWdpc3RlcnM/XG4iOworICAgIGFib3J0KCk7CisgIH0KKworICBpZiAoIVN1YlJlZ3NbUl0uaW5zZXJ0KFMpLnNlY29uZCkKKyAgICByZXR1cm47CisgIGFkZFN1cGVyUmVnKFMsIFIsIFN1YlJlZ3MsIFN1cGVyUmVncywgQWxpYXNlcyk7CisgIEFsaWFzZXNbUl0uaW5zZXJ0KFMpOworICBBbGlhc2VzW1NdLmluc2VydChSKTsKKyAgaWYgKFN1YlJlZ3MuY291bnQoUykpCisgICAgZm9yIChzdGQ6OnNldDxSZWNvcmQqPjo6aXRlcmF0b3IgSSA9IFN1YlJlZ3NbU10uYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IFN1YlJlZ3NbU10uZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgYWRkU3ViU3VwZXJSZWcoUiwgKkksIFN1YlJlZ3MsIFN1cGVyUmVncywgQWxpYXNlcyk7Cit9CisKK3N0cnVjdCBSZWdpc3Rlck1hcHMgeworICAvLyBNYXAgU3ViUmVnSW5kZXggLT4gUmVnaXN0ZXIKKyAgdHlwZWRlZiBzdGQ6Om1hcDxSZWNvcmQqLCBSZWNvcmQqLCBMZXNzUmVjb3JkPiBTdWJSZWdNYXA7CisgIC8vIE1hcCBSZWdpc3RlciAtPiBTdWJSZWdNYXAKKyAgdHlwZWRlZiBzdGQ6Om1hcDxSZWNvcmQqLCBTdWJSZWdNYXA+IFN1YlJlZ01hcHM7CisKKyAgU3ViUmVnTWFwcyBTdWJSZWc7CisgIFN1YlJlZ01hcCAmaW5mZXJTdWJSZWdJbmRpY2VzKFJlY29yZCAqUmVnKTsKKworICAvLyBDb21wb3NpdGUgU3ViUmVnSW5kZXggaW5zdGFuY2VzLgorICAvLyBNYXAgKFN1YlJlZ0luZGV4LFN1YlJlZ0luZGV4KSAtPiBTdWJSZWdJbmRleAorICB0eXBlZGVmIERlbnNlTWFwPHN0ZDo6cGFpcjxSZWNvcmQqLFJlY29yZCo+LFJlY29yZCo+IENvbXBvc2l0ZU1hcDsKKyAgQ29tcG9zaXRlTWFwIENvbXBvc2l0ZTsKKworICAvLyBDb21wdXRlIFN1YlJlZ0luZGV4IGNvbXBvc2l0aW9ucyBhZnRlciBpbmZlclN1YlJlZ0luZGljZXMgaGFzIHJ1biBvbiBhbGwKKyAgLy8gcmVnaXN0ZXJzLgorICB2b2lkIGNvbXB1dGVDb21wb3NpdGVzKCk7Cit9OworCisvLyBDYWxjdWxhdGUgYWxsIHN1YnJlZ2luZGljZXMgZm9yIFJlZy4gTG9vcHkgc3VicmVncyBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24uCitSZWdpc3Rlck1hcHM6OlN1YlJlZ01hcCAmUmVnaXN0ZXJNYXBzOjppbmZlclN1YlJlZ0luZGljZXMoUmVjb3JkICpSZWcpIHsKKyAgU3ViUmVnTWFwICZTUk0gPSBTdWJSZWdbUmVnXTsKKyAgaWYgKCFTUk0uZW1wdHkoKSkKKyAgICByZXR1cm4gU1JNOworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBTdWJSZWdzID0gUmVnLT5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiU3ViUmVncyIpOworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBJbmRpY2VzID0gUmVnLT5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiU3ViUmVnSW5kaWNlcyIpOworICBpZiAoU3ViUmVncy5zaXplKCkgIT0gSW5kaWNlcy5zaXplKCkpCisgICAgdGhyb3cgIlJlZ2lzdGVyICIgKyBSZWctPmdldE5hbWUoKSArICIgU3ViUmVnSW5kaWNlcyBkb2Vzbid0IG1hdGNoIFN1YlJlZ3MiOworCisgIC8vIEZpcnN0IGluc2VydCB0aGUgZGlyZWN0IHN1YnJlZ3MgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBmdWxseSBpbmRleGVkLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3ViUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKCFTUk0uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEluZGljZXNbaV0sIFN1YlJlZ3NbaV0pKS5zZWNvbmQpCisgICAgICB0aHJvdyAiU3ViUmVnSW5kZXggIiArIEluZGljZXNbaV0tPmdldE5hbWUoKQorICAgICAgICArICIgYXBwZWFycyB0d2ljZSBpbiBSZWdpc3RlciAiICsgUmVnLT5nZXROYW1lKCk7CisgICAgaW5mZXJTdWJSZWdJbmRpY2VzKFN1YlJlZ3NbaV0pOworICB9CisKKyAgLy8gS2VlcCB0cmFjayBvZiBpbmhlcml0ZWQgc3VicmVncyBhbmQgaG93IHRoZXkgY2FuIGJlIHJlYWNoZWQuCisgIC8vIFJlZ2lzdGVyIC0+IChTdWJSZWdJbmRleCwgU3ViUmVnSW5kZXgpCisgIHR5cGVkZWYgc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpwYWlyPFJlY29yZCosUmVjb3JkKj4sIExlc3NSZWNvcmQ+IE9ycGhhbk1hcDsKKyAgT3JwaGFuTWFwIE9ycGhhbnM7CisKKyAgLy8gQ2xvbmUgaW5oZXJpdGVkIHN1YnJlZ3MuIEhlcmUgdGhlIG9yZGVyIGlzIGltcG9ydGFudCAtIGVhcmxpZXIgc3VicmVncyB0YWtlCisgIC8vIHByZWNlZGVuY2UuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdWJSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBTdWJSZWdNYXAgJk0gPSBTdWJSZWdbU3ViUmVnc1tpXV07CisgICAgZm9yIChTdWJSZWdNYXA6Oml0ZXJhdG9yIHNpID0gTS5iZWdpbigpLCBzZSA9IE0uZW5kKCk7IHNpICE9IHNlOyArK3NpKQorICAgICAgaWYgKCFTUk0uaW5zZXJ0KCpzaSkuc2Vjb25kKQorICAgICAgICBPcnBoYW5zW3NpLT5zZWNvbmRdID0gc3RkOjptYWtlX3BhaXIoSW5kaWNlc1tpXSwgc2ktPmZpcnN0KTsKKyAgfQorCisgIC8vIEZpbmFsbHkgcHJvY2VzcyB0aGUgY29tcG9zaXRlcy4KKyAgTGlzdEluaXQgKkNvbXBzID0gUmVnLT5nZXRWYWx1ZUFzTGlzdEluaXQoIkNvbXBvc2l0ZUluZGljZXMiKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvbXBzLT5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgRGFnSW5pdCAqUGF0ID0gZHluYW1pY19jYXN0PERhZ0luaXQqPihDb21wcy0+Z2V0RWxlbWVudChpKSk7CisgICAgaWYgKCFQYXQpCisgICAgICB0aHJvdyAiSW52YWxpZCBkYWcgJyIgKyBDb21wcy0+Z2V0RWxlbWVudChpKS0+Z2V0QXNTdHJpbmcoKQorICAgICAgICArICInIGluIENvbXBvc2l0ZUluZGljZXMiOworICAgIERlZkluaXQgKkJhc2VJZHhJbml0ID0gZHluYW1pY19jYXN0PERlZkluaXQqPihQYXQtPmdldE9wZXJhdG9yKCkpOworICAgIGlmICghQmFzZUlkeEluaXQgfHwgIUJhc2VJZHhJbml0LT5nZXREZWYoKS0+aXNTdWJDbGFzc09mKCJTdWJSZWdJbmRleCIpKQorICAgICAgdGhyb3cgIkludmFsaWQgU3ViQ2xhc3NJbmRleCBpbiAiICsgUGF0LT5nZXRBc1N0cmluZygpOworCisgICAgLy8gUmVzb2x2ZSBsaXN0IG9mIHN1YnJlZyBpbmRpY2VzIGludG8gUjIuCisgICAgUmVjb3JkICpSMiA9IFJlZzsKKyAgICBmb3IgKERhZ0luaXQ6OmNvbnN0X2FyZ19pdGVyYXRvciBkaSA9IFBhdC0+YXJnX2JlZ2luKCksCisgICAgICAgICBkZSA9IFBhdC0+YXJnX2VuZCgpOyBkaSAhPSBkZTsgKytkaSkgeworICAgICAgRGVmSW5pdCAqSWR4SW5pdCA9IGR5bmFtaWNfY2FzdDxEZWZJbml0Kj4oKmRpKTsKKyAgICAgIGlmICghSWR4SW5pdCB8fCAhSWR4SW5pdC0+Z2V0RGVmKCktPmlzU3ViQ2xhc3NPZigiU3ViUmVnSW5kZXgiKSkKKyAgICAgICAgdGhyb3cgIkludmFsaWQgU3ViQ2xhc3NJbmRleCBpbiAiICsgUGF0LT5nZXRBc1N0cmluZygpOworICAgICAgU3ViUmVnTWFwOjpjb25zdF9pdGVyYXRvciBuaSA9IFN1YlJlZ1tSMl0uZmluZChJZHhJbml0LT5nZXREZWYoKSk7CisgICAgICBpZiAobmkgPT0gU3ViUmVnW1IyXS5lbmQoKSkKKyAgICAgICAgdGhyb3cgIkNvbXBvc2l0ZSAiICsgUGF0LT5nZXRBc1N0cmluZygpICsgIiByZWZlcnMgdG8gYmFkIGluZGV4IGluICIKKyAgICAgICAgICArIFIyLT5nZXROYW1lKCk7CisgICAgICBSMiA9IG5pLT5zZWNvbmQ7CisgICAgfQorCisgICAgLy8gSW5zZXJ0IGNvbXBvc2l0ZSBpbmRleC4gQWxsb3cgb3ZlcnJpZGluZyBpbmhlcml0ZWQgaW5kaWNlcyBldGMuCisgICAgU1JNW0Jhc2VJZHhJbml0LT5nZXREZWYoKV0gPSBSMjsKKworICAgIC8vIFIyIGlzIG5vdyBkaXJlY3RseSBhZGRyZXNzYWJsZSwgbm8gbG9uZ2VyIGFuIG9ycGhhbi4KKyAgICBPcnBoYW5zLmVyYXNlKFIyKTsKKyAgfQorCisgIC8vIE5vdywgT3JwaGFucyBjb250YWlucyB0aGUgaW5oZXJpdGVkIHN1YnJlZ2lzdGVycyB3aXRob3V0IGEgZGlyZWN0IGluZGV4LgorICBpZiAoIU9ycGhhbnMuZW1wdHkoKSkgeworICAgIGVycnMoKSA8PCAiRXJyb3I6IFJlZ2lzdGVyICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShSZWcpCisgICAgICAgICAgIDw8ICIgaW5oZXJpdGVkIHN1YnJlZ2lzdGVycyB3aXRob3V0IGFuIGluZGV4OlxuIjsKKyAgICBmb3IgKE9ycGhhbk1hcDo6aXRlcmF0b3IgaSA9IE9ycGhhbnMuYmVnaW4oKSwgZSA9IE9ycGhhbnMuZW5kKCk7IGkgIT0gZTsKKyAgICAgICAgICsraSkgeworICAgICAgZXJycygpIDw8ICIgICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShpLT5maXJzdCkKKyAgICAgICAgICAgICA8PCAiID0gIiA8PCBpLT5zZWNvbmQuZmlyc3QtPmdldE5hbWUoKQorICAgICAgICAgICAgIDw8ICIsICIgPDwgaS0+c2Vjb25kLnNlY29uZC0+Z2V0TmFtZSgpIDw8ICJcbiI7CisgICAgfQorICAgIGFib3J0KCk7CisgIH0KKyAgcmV0dXJuIFNSTTsKK30KKwordm9pZCBSZWdpc3Rlck1hcHM6OmNvbXB1dGVDb21wb3NpdGVzKCkgeworICBmb3IgKFN1YlJlZ01hcHM6OmNvbnN0X2l0ZXJhdG9yIHNyaSA9IFN1YlJlZy5iZWdpbigpLCBzcmUgPSBTdWJSZWcuZW5kKCk7CisgICAgICAgc3JpICE9IHNyZTsgKytzcmkpIHsKKyAgICBSZWNvcmQgKlJlZzEgPSBzcmktPmZpcnN0OworICAgIGNvbnN0IFN1YlJlZ01hcCAmU1JNMSA9IHNyaS0+c2Vjb25kOworICAgIGZvciAoU3ViUmVnTWFwOjpjb25zdF9pdGVyYXRvciBpMSA9IFNSTTEuYmVnaW4oKSwgZTEgPSBTUk0xLmVuZCgpOworICAgICAgICAgaTEgIT0gZTE7ICsraTEpIHsKKyAgICAgIFJlY29yZCAqSWR4MSA9IGkxLT5maXJzdDsKKyAgICAgIFJlY29yZCAqUmVnMiA9IGkxLT5zZWNvbmQ7CisgICAgICAvLyBJZ25vcmUgaWRlbnRpdHkgY29tcG9zaXRpb25zLgorICAgICAgaWYgKFJlZzEgPT0gUmVnMikKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBJZiBSZWcyIGhhcyBubyBzdWJyZWdzLCBJZHgxIGRvZXNuJ3QgY29tcG9zZS4KKyAgICAgIGlmICghU3ViUmVnLmNvdW50KFJlZzIpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGNvbnN0IFN1YlJlZ01hcCAmU1JNMiA9IFN1YlJlZ1tSZWcyXTsKKyAgICAgIC8vIFRyeSBjb21wb3NpbmcgSWR4MSB3aXRoIGFub3RoZXIgU3ViUmVnSW5kZXguCisgICAgICBmb3IgKFN1YlJlZ01hcDo6Y29uc3RfaXRlcmF0b3IgaTIgPSBTUk0yLmJlZ2luKCksIGUyID0gU1JNMi5lbmQoKTsKKyAgICAgICAgICAgaTIgIT0gZTI7ICsraTIpIHsKKyAgICAgICAgc3RkOjpwYWlyPFJlY29yZCosUmVjb3JkKj4gSWR4UGFpcihJZHgxLCBpMi0+Zmlyc3QpOworICAgICAgICBSZWNvcmQgKlJlZzMgPSBpMi0+c2Vjb25kOworICAgICAgICAvLyBPSyBSZWcxOklkeFBhaXIgPT0gUmVnMy4gRmluZCB0aGUgaW5kZXggd2l0aCBSZWc6SWR4ID09IFJlZzMuCisgICAgICAgIGZvciAoU3ViUmVnTWFwOjpjb25zdF9pdGVyYXRvciBpMWQgPSBTUk0xLmJlZ2luKCksIGUxZCA9IFNSTTEuZW5kKCk7CisgICAgICAgICAgICAgaTFkICE9IGUxZDsgKytpMWQpIHsKKyAgICAgICAgICAvLyBJZ25vcmUgaWRlbnRpdHkgY29tcG9zaXRpb25zLgorICAgICAgICAgIGlmIChSZWcyID09IFJlZzMpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBpZiAoaTFkLT5zZWNvbmQgPT0gUmVnMykgeworICAgICAgICAgICAgc3RkOjpwYWlyPENvbXBvc2l0ZU1hcDo6aXRlcmF0b3IsYm9vbD4gSW5zID0KKyAgICAgICAgICAgICAgQ29tcG9zaXRlLmluc2VydChzdGQ6Om1ha2VfcGFpcihJZHhQYWlyLCBpMWQtPmZpcnN0KSk7CisgICAgICAgICAgICAvLyBDb25mbGljdGluZyBjb21wb3NpdGlvbj8KKyAgICAgICAgICAgIGlmICghSW5zLnNlY29uZCAmJiBJbnMuZmlyc3QtPnNlY29uZCAhPSBpMWQtPmZpcnN0KSB7CisgICAgICAgICAgICAgIGVycnMoKSA8PCAiRXJyb3I6IFN1YlJlZ0luZGV4ICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShJZHgxKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBhbmQgIiA8PCBnZXRRdWFsaWZpZWROYW1lKElkeFBhaXIuc2Vjb25kKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBjb21wb3NlIGFtYmlndW91c2x5IGFzICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGdldFF1YWxpZmllZE5hbWUoSW5zLmZpcnN0LT5zZWNvbmQpIDw8ICIgb3IgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZ2V0UXVhbGlmaWVkTmFtZShpMWQtPmZpcnN0KSA8PCAiXG4iOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAoSWR4MSwgSWR4MikgLT4gSWR4MiBhbmQgaW52YWxpZAorICAvLyBjb21wb3NpdGlvbnMsIHNvIHJlbW92ZSBhbnkgbWFwcGluZ3Mgb2YgdGhhdCBmb3JtLgorICBmb3IgKENvbXBvc2l0ZU1hcDo6aXRlcmF0b3IgaSA9IENvbXBvc2l0ZS5iZWdpbigpLCBlID0gQ29tcG9zaXRlLmVuZCgpOworICAgICAgIGkgIT0gZTspIHsKKyAgICBDb21wb3NpdGVNYXA6Oml0ZXJhdG9yIGogPSBpOworICAgICsraTsKKyAgICBpZiAoai0+Zmlyc3Quc2Vjb25kID09IGotPnNlY29uZCkKKyAgICAgIENvbXBvc2l0ZS5lcmFzZShqKTsKKyAgfQorfQorCitjbGFzcyBSZWdpc3RlclNvcnRlciB7Citwcml2YXRlOgorICBzdGQ6Om1hcDxSZWNvcmQqLCBzdGQ6OnNldDxSZWNvcmQqPiwgTGVzc1JlY29yZD4gJlJlZ2lzdGVyU3ViUmVnczsKKworcHVibGljOgorICBSZWdpc3RlclNvcnRlcihzdGQ6Om1hcDxSZWNvcmQqLCBzdGQ6OnNldDxSZWNvcmQqPiwgTGVzc1JlY29yZD4gJlJTKQorICAgIDogUmVnaXN0ZXJTdWJSZWdzKFJTKSB7fQorCisgIGJvb2wgb3BlcmF0b3IoKShSZWNvcmQgKlJlZ0EsIFJlY29yZCAqUmVnQikgeworICAgIC8vIEIgaXMgc3ViLXJlZ2lzdGVyIG9mIEEuCisgICAgcmV0dXJuIFJlZ2lzdGVyU3ViUmVncy5jb3VudChSZWdBKSAmJiBSZWdpc3RlclN1YlJlZ3NbUmVnQV0uY291bnQoUmVnQik7CisgIH0KK307CisKKy8vIFJlZ2lzdGVySW5mb0VtaXR0ZXI6OnJ1biAtIE1haW4gcmVnaXN0ZXIgZmlsZSBkZXNjcmlwdGlvbiBlbWl0dGVyLgorLy8KK3ZvaWQgUmVnaXN0ZXJJbmZvRW1pdHRlcjo6cnVuKHJhd19vc3RyZWFtICZPUykgeworICBDb2RlR2VuVGFyZ2V0IFRhcmdldDsKKyAgRW1pdFNvdXJjZUZpbGVIZWFkZXIoIlJlZ2lzdGVyIEluZm9ybWF0aW9uIFNvdXJjZSBGcmFnbWVudCIsIE9TKTsKKworICBPUyA8PCAibmFtZXNwYWNlIGxsdm0ge1xuXG4iOworCisgIC8vIFN0YXJ0IG91dCBieSBlbWl0dGluZyBlYWNoIG9mIHRoZSByZWdpc3RlciBjbGFzc2VzLi4uIHRvIGRvIHRoaXMsIHdlIGJ1aWxkCisgIC8vIGEgc2V0IG9mIHJlZ2lzdGVycyB3aGljaCBiZWxvbmcgdG8gYSByZWdpc3RlciBjbGFzcywgdGhpcyBpcyB0byBlbnN1cmUgdGhhdAorICAvLyBlYWNoIHJlZ2lzdGVyIGlzIG9ubHkgaW4gYSBzaW5nbGUgcmVnaXN0ZXIgY2xhc3MuCisgIC8vCisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5SZWdpc3RlckNsYXNzPiAmUmVnaXN0ZXJDbGFzc2VzID0KKyAgICBUYXJnZXQuZ2V0UmVnaXN0ZXJDbGFzc2VzKCk7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgcmVnaXN0ZXIgY2xhc3Nlcy4uLiBlbWl0dGluZyBlYWNoIG9uZS4KKyAgT1MgPDwgIm5hbWVzcGFjZSB7ICAgICAvLyBSZWdpc3RlciBjbGFzc2VzLi4uXG4iOworCisgIC8vIFJlZ0NsYXNzZXNCZWxvbmdlZFRvIC0gS2VlcCB0cmFjayBvZiB3aGljaCByZWdpc3RlciBjbGFzc2VzIGVhY2ggcmVnCisgIC8vIGJlbG9uZ3MgdG8uCisgIHN0ZDo6bXVsdGltYXA8UmVjb3JkKiwgY29uc3QgQ29kZUdlblJlZ2lzdGVyQ2xhc3MqPiBSZWdDbGFzc2VzQmVsb25nZWRUbzsKKworICAvLyBFbWl0IHRoZSByZWdpc3RlciBlbnVtIHZhbHVlIGFycmF5cyBmb3IgZWFjaCBSZWdpc3RlckNsYXNzCisgIGZvciAodW5zaWduZWQgcmMgPSAwLCBlID0gUmVnaXN0ZXJDbGFzc2VzLnNpemUoKTsgcmMgIT0gZTsgKytyYykgeworICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICZSQyA9IFJlZ2lzdGVyQ2xhc3Nlc1tyY107CisKKyAgICAvLyBHaXZlIHRoZSByZWdpc3RlciBjbGFzcyBhIGxlZ2FsIEMgbmFtZSBpZiBpdCdzIGFub255bW91cy4KKyAgICBzdGQ6OnN0cmluZyBOYW1lID0gUkMuVGhlRGVmLT5nZXROYW1lKCk7CisgIAorICAgIC8vIEVtaXQgdGhlIHJlZ2lzdGVyIGxpc3Qgbm93LgorICAgIE9TIDw8ICIgIC8vICIgPDwgTmFtZSA8PCAiIFJlZ2lzdGVyIENsYXNzLi4uXG4iCisgICAgICAgPDwgIiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkICIgPDwgTmFtZQorICAgICAgIDw8ICJbXSA9IHtcbiAgICAiOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSQy5FbGVtZW50cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBSZWNvcmQgKlJlZyA9IFJDLkVsZW1lbnRzW2ldOworICAgICAgT1MgPDwgZ2V0UXVhbGlmaWVkTmFtZShSZWcpIDw8ICIsICI7CisKKyAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggcmVnY2xhc3NlcyB0aGlzIHJlZ2lzdGVyIGlzIGluLgorICAgICAgUmVnQ2xhc3Nlc0JlbG9uZ2VkVG8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFJlZywgJlJDKSk7CisgICAgfQorICAgIE9TIDw8ICJcbiAgfTtcblxuIjsKKyAgfQorCisgIC8vIEVtaXQgdGhlIFZhbHVlVHlwZSBhcnJheXMgZm9yIGVhY2ggUmVnaXN0ZXJDbGFzcworICBmb3IgKHVuc2lnbmVkIHJjID0gMCwgZSA9IFJlZ2lzdGVyQ2xhc3Nlcy5zaXplKCk7IHJjICE9IGU7ICsrcmMpIHsKKyAgICBjb25zdCBDb2RlR2VuUmVnaXN0ZXJDbGFzcyAmUkMgPSBSZWdpc3RlckNsYXNzZXNbcmNdOworICAgIAorICAgIC8vIEdpdmUgdGhlIHJlZ2lzdGVyIGNsYXNzIGEgbGVnYWwgQyBuYW1lIGlmIGl0J3MgYW5vbnltb3VzLgorICAgIHN0ZDo6c3RyaW5nIE5hbWUgPSBSQy5UaGVEZWYtPmdldE5hbWUoKSArICJWVHMiOworICAgIAorICAgIC8vIEVtaXQgdGhlIHJlZ2lzdGVyIGxpc3Qgbm93LgorICAgIE9TIDw8ICIgIC8vICIgPDwgTmFtZSAKKyAgICAgICA8PCAiIFJlZ2lzdGVyIENsYXNzIFZhbHVlIFR5cGVzLi4uXG4iCisgICAgICAgPDwgIiAgc3RhdGljIGNvbnN0IEVWVCAiIDw8IE5hbWUKKyAgICAgICA8PCAiW10gPSB7XG4gICAgIjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUkMuVlRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBPUyA8PCBnZXRFbnVtTmFtZShSQy5WVHNbaV0pIDw8ICIsICI7CisgICAgT1MgPDwgIk1WVDo6T3RoZXJcbiAgfTtcblxuIjsKKyAgfQorICBPUyA8PCAifSAgLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2VcblxuIjsKKyAgCisgIC8vIE5vdyB0aGF0IGFsbCBvZiB0aGUgc3RydWN0cyBoYXZlIGJlZW4gZW1pdHRlZCwgZW1pdCB0aGUgaW5zdGFuY2VzLgorICBpZiAoIVJlZ2lzdGVyQ2xhc3Nlcy5lbXB0eSgpKSB7CisgICAgT1MgPDwgIm5hbWVzcGFjZSAiIDw8IFJlZ2lzdGVyQ2xhc3Nlc1swXS5OYW1lc3BhY2UKKyAgICAgICA8PCAiIHsgICAvLyBSZWdpc3RlciBjbGFzcyBpbnN0YW5jZXNcbiI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ2lzdGVyQ2xhc3Nlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgT1MgPDwgIiAgIiA8PCBSZWdpc3RlckNsYXNzZXNbaV0uZ2V0TmFtZSgpICA8PCAiQ2xhc3NcdCIKKyAgICAgICAgIDw8IFJlZ2lzdGVyQ2xhc3Nlc1tpXS5nZXROYW1lKCkgPDwgIlJlZ0NsYXNzO1xuIjsKKyAgICAgICAgIAorICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnNldDx1bnNpZ25lZD4gPiBTdXBlckNsYXNzTWFwOworICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnNldDx1bnNpZ25lZD4gPiBTdXBlclJlZ0NsYXNzTWFwOworICAgIE9TIDw8ICJcbiI7CisKKyAgICB1bnNpZ25lZCBOdW1TdWJSZWdJbmRpY2VzID0gVGFyZ2V0LmdldFN1YlJlZ0luZGljZXMoKS5zaXplKCk7CisKKyAgICBpZiAoTnVtU3ViUmVnSW5kaWNlcykgeworICAgICAgLy8gRW1pdCB0aGUgc3ViLXJlZ2lzdGVyIGNsYXNzZXMgZm9yIGVhY2ggUmVnaXN0ZXJDbGFzcworICAgICAgZm9yICh1bnNpZ25lZCByYyA9IDAsIGUgPSBSZWdpc3RlckNsYXNzZXMuc2l6ZSgpOyByYyAhPSBlOyArK3JjKSB7CisgICAgICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICZSQyA9IFJlZ2lzdGVyQ2xhc3Nlc1tyY107CisgICAgICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFNSQyhOdW1TdWJSZWdJbmRpY2VzKTsKKyAgICAgICAgZm9yIChEZW5zZU1hcDxSZWNvcmQqLFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgIGkgPSBSQy5TdWJSZWdDbGFzc2VzLmJlZ2luKCksCisgICAgICAgICAgICAgZSA9IFJDLlN1YlJlZ0NsYXNzZXMuZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgLy8gQnVpbGQgU1JDIGFycmF5LgorICAgICAgICAgIHVuc2lnbmVkIGlkeCA9IFRhcmdldC5nZXRTdWJSZWdJbmRleE5vKGktPmZpcnN0KTsKKyAgICAgICAgICBTUkMuYXQoaWR4LTEpID0gaS0+c2Vjb25kOworCisgICAgICAgICAgLy8gRmluZCB0aGUgcmVnaXN0ZXIgY2xhc3MgbnVtYmVyIG9mIGktPnNlY29uZCBmb3IgU3VwZXJSZWdDbGFzc01hcC4KKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIHJjMiA9IDAsIGUyID0gUmVnaXN0ZXJDbGFzc2VzLnNpemUoKTsgcmMyICE9IGUyOyArK3JjMikgeworICAgICAgICAgICAgY29uc3QgQ29kZUdlblJlZ2lzdGVyQ2xhc3MgJlJDMiA9ICBSZWdpc3RlckNsYXNzZXNbcmMyXTsKKyAgICAgICAgICAgIGlmIChSQzIuVGhlRGVmID09IGktPnNlY29uZCkgeworICAgICAgICAgICAgICBTdXBlclJlZ0NsYXNzTWFwW3JjMl0uaW5zZXJ0KHJjKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gR2l2ZSB0aGUgcmVnaXN0ZXIgY2xhc3MgYSBsZWdhbCBDIG5hbWUgaWYgaXQncyBhbm9ueW1vdXMuCisgICAgICAgIHN0ZDo6c3RyaW5nIE5hbWUgPSBSQy5UaGVEZWYtPmdldE5hbWUoKTsKKworICAgICAgICBPUyA8PCAiICAvLyAiIDw8IE5hbWUKKyAgICAgICAgICAgPDwgIiBTdWItcmVnaXN0ZXIgQ2xhc3Nlcy4uLlxuIgorICAgICAgICAgICA8PCAiICBzdGF0aWMgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogY29uc3QgIgorICAgICAgICAgICA8PCBOYW1lIDw8ICJTdWJSZWdDbGFzc2VzW10gPSB7XG4gICAgIjsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGlkeCA9IDA7IGlkeCAhPSBOdW1TdWJSZWdJbmRpY2VzOyArK2lkeCkgeworICAgICAgICAgIGlmIChpZHgpCisgICAgICAgICAgICBPUyA8PCAiLCAiOworICAgICAgICAgIGlmIChTUkNbaWR4XSkKKyAgICAgICAgICAgIE9TIDw8ICImIiA8PCBnZXRRdWFsaWZpZWROYW1lKFNSQ1tpZHhdKSA8PCAiUmVnQ2xhc3MiOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE9TIDw8ICIwIjsKKyAgICAgICAgfQorICAgICAgICBPUyA8PCAiXG4gIH07XG5cbiI7CisgICAgICB9CisKKyAgICAgIC8vIEVtaXQgdGhlIHN1cGVyLXJlZ2lzdGVyIGNsYXNzZXMgZm9yIGVhY2ggUmVnaXN0ZXJDbGFzcworICAgICAgZm9yICh1bnNpZ25lZCByYyA9IDAsIGUgPSBSZWdpc3RlckNsYXNzZXMuc2l6ZSgpOyByYyAhPSBlOyArK3JjKSB7CisgICAgICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICZSQyA9IFJlZ2lzdGVyQ2xhc3Nlc1tyY107CisKKyAgICAgICAgLy8gR2l2ZSB0aGUgcmVnaXN0ZXIgY2xhc3MgYSBsZWdhbCBDIG5hbWUgaWYgaXQncyBhbm9ueW1vdXMuCisgICAgICAgIHN0ZDo6c3RyaW5nIE5hbWUgPSBSQy5UaGVEZWYtPmdldE5hbWUoKTsKKworICAgICAgICBPUyA8PCAiICAvLyAiIDw8IE5hbWUKKyAgICAgICAgICAgPDwgIiBTdXBlci1yZWdpc3RlciBDbGFzc2VzLi4uXG4iCisgICAgICAgICAgIDw8ICIgIHN0YXRpYyBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBjb25zdCAiCisgICAgICAgICAgIDw8IE5hbWUgPDwgIlN1cGVyUmVnQ2xhc3Nlc1tdID0ge1xuICAgICI7CisKKyAgICAgICAgYm9vbCBFbXB0eSA9IHRydWU7CisgICAgICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnNldDx1bnNpZ25lZD4gPjo6aXRlcmF0b3IgSSA9CisgICAgICAgICAgU3VwZXJSZWdDbGFzc01hcC5maW5kKHJjKTsKKyAgICAgICAgaWYgKEkgIT0gU3VwZXJSZWdDbGFzc01hcC5lbmQoKSkgeworICAgICAgICAgIGZvciAoc3RkOjpzZXQ8dW5zaWduZWQ+OjppdGVyYXRvciBJSSA9IEktPnNlY29uZC5iZWdpbigpLAorICAgICAgICAgICAgICAgICBFRSA9IEktPnNlY29uZC5lbmQoKTsgSUkgIT0gRUU7ICsrSUkpIHsKKyAgICAgICAgICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICZSQzIgPSBSZWdpc3RlckNsYXNzZXNbKklJXTsKKyAgICAgICAgICAgIGlmICghRW1wdHkpCisgICAgICAgICAgICAgIE9TIDw8ICIsICI7CisgICAgICAgICAgICBPUyA8PCAiJiIgPDwgZ2V0UXVhbGlmaWVkTmFtZShSQzIuVGhlRGVmKSA8PCAiUmVnQ2xhc3MiOworICAgICAgICAgICAgRW1wdHkgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPUyA8PCAoIUVtcHR5ID8gIiwgIiA6ICIiKSA8PCAiTlVMTCI7CisgICAgICAgIE9TIDw8ICJcbiAgfTtcblxuIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gTm8gc3VicmVnaW5kaWNlcyBpbiB0aGlzIHRhcmdldAorICAgICAgT1MgPDwgIiAgc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIGNvbnN0ICIKKyAgICAgICAgIDw8ICJOdWxsUmVnQ2xhc3Nlc1tdID0geyBOVUxMIH07XG5cbiI7CisgICAgfQorCisgICAgLy8gRW1pdCB0aGUgc3ViLWNsYXNzZXMgYXJyYXkgZm9yIGVhY2ggUmVnaXN0ZXJDbGFzcworICAgIGZvciAodW5zaWduZWQgcmMgPSAwLCBlID0gUmVnaXN0ZXJDbGFzc2VzLnNpemUoKTsgcmMgIT0gZTsgKytyYykgeworICAgICAgY29uc3QgQ29kZUdlblJlZ2lzdGVyQ2xhc3MgJlJDID0gUmVnaXN0ZXJDbGFzc2VzW3JjXTsKKworICAgICAgLy8gR2l2ZSB0aGUgcmVnaXN0ZXIgY2xhc3MgYSBsZWdhbCBDIG5hbWUgaWYgaXQncyBhbm9ueW1vdXMuCisgICAgICBzdGQ6OnN0cmluZyBOYW1lID0gUkMuVGhlRGVmLT5nZXROYW1lKCk7CisKKyAgICAgIHN0ZDo6c2V0PFJlY29yZCo+IFJlZ1NldDsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSQy5FbGVtZW50cy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFJlY29yZCAqUmVnID0gUkMuRWxlbWVudHNbaV07CisgICAgICAgIFJlZ1NldC5pbnNlcnQoUmVnKTsKKyAgICAgIH0KKworICAgICAgT1MgPDwgIiAgLy8gIiA8PCBOYW1lIAorICAgICAgICAgPDwgIiBSZWdpc3RlciBDbGFzcyBzdWItY2xhc3Nlcy4uLlxuIgorICAgICAgICAgPDwgIiAgc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIGNvbnN0ICIKKyAgICAgICAgIDw8IE5hbWUgPDwgIlN1YmNsYXNzZXNbXSA9IHtcbiAgICAiOworCisgICAgICBib29sIEVtcHR5ID0gdHJ1ZTsKKyAgICAgIGZvciAodW5zaWduZWQgcmMyID0gMCwgZTIgPSBSZWdpc3RlckNsYXNzZXMuc2l6ZSgpOyByYzIgIT0gZTI7ICsrcmMyKSB7CisgICAgICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICZSQzIgPSBSZWdpc3RlckNsYXNzZXNbcmMyXTsKKworICAgICAgICAvLyBSQzIgaXMgYSBzdWItY2xhc3Mgb2YgUkMgaWYgaXQgaXMgYSB2YWxpZCByZXBsYWNlbWVudCBmb3IgYW55CisgICAgICAgIC8vIGluc3RydWN0aW9uIG9wZXJhbmQgd2hlcmUgYW4gUkMgcmVnaXN0ZXIgaXMgcmVxdWlyZWQuIEl0IG11c3Qgc2F0aXNmeQorICAgICAgICAvLyB0aGVzZSBjb25kaXRpb25zOgorICAgICAgICAvLworICAgICAgICAvLyAxLiBBbGwgUkMyIHJlZ2lzdGVycyBhcmUgYWxzbyBpbiBSQy4KKyAgICAgICAgLy8gMi4gVGhlIFJDMiBzcGlsbCBzaXplIG11c3Qgbm90IGJlIHNtYWxsZXIgdGhhdCB0aGUgUkMgc3BpbGwgc2l6ZS4KKyAgICAgICAgLy8gMy4gUkMyIHNwaWxsIGFsaWdubWVudCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBSQy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gU3ViLWNsYXNzZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgdmlydHVhbCByZWdpc3RlciBjYW4gYmUgdXNlZAorICAgICAgICAvLyBhcyBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kLCBvciBpZiBpdCBtdXN0IGJlIGNvcGllZCBmaXJzdC4KKworICAgICAgICBpZiAocmMgPT0gcmMyIHx8IFJDMi5FbGVtZW50cy5zaXplKCkgPiBSQy5FbGVtZW50cy5zaXplKCkgfHwKKyAgICAgICAgICAgIChSQy5TcGlsbEFsaWdubWVudCAmJiBSQzIuU3BpbGxBbGlnbm1lbnQgJSBSQy5TcGlsbEFsaWdubWVudCkgfHwKKyAgICAgICAgICAgIFJDLlNwaWxsU2l6ZSA+IFJDMi5TcGlsbFNpemUgfHwgIWlzU3ViUmVnaXN0ZXJDbGFzcyhSQzIsIFJlZ1NldCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgICAgaWYgKCFFbXB0eSkgT1MgPDwgIiwgIjsKKyAgICAgICAgT1MgPDwgIiYiIDw8IGdldFF1YWxpZmllZE5hbWUoUkMyLlRoZURlZikgPDwgIlJlZ0NsYXNzIjsKKyAgICAgICAgRW1wdHkgPSBmYWxzZTsKKworICAgICAgICBzdGQ6Om1hcDx1bnNpZ25lZCwgc3RkOjpzZXQ8dW5zaWduZWQ+ID46Oml0ZXJhdG9yIFNDTUkgPQorICAgICAgICAgIFN1cGVyQ2xhc3NNYXAuZmluZChyYzIpOworICAgICAgICBpZiAoU0NNSSA9PSBTdXBlckNsYXNzTWFwLmVuZCgpKSB7CisgICAgICAgICAgU3VwZXJDbGFzc01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIocmMyLCBzdGQ6OnNldDx1bnNpZ25lZD4oKSkpOworICAgICAgICAgIFNDTUkgPSBTdXBlckNsYXNzTWFwLmZpbmQocmMyKTsKKyAgICAgICAgfQorICAgICAgICBTQ01JLT5zZWNvbmQuaW5zZXJ0KHJjKTsKKyAgICAgIH0KKworICAgICAgT1MgPDwgKCFFbXB0eSA/ICIsICIgOiAiIikgPDwgIk5VTEwiOworICAgICAgT1MgPDwgIlxuICB9O1xuXG4iOworICAgIH0KKworICAgIGZvciAodW5zaWduZWQgcmMgPSAwLCBlID0gUmVnaXN0ZXJDbGFzc2VzLnNpemUoKTsgcmMgIT0gZTsgKytyYykgeworICAgICAgY29uc3QgQ29kZUdlblJlZ2lzdGVyQ2xhc3MgJlJDID0gUmVnaXN0ZXJDbGFzc2VzW3JjXTsKKworICAgICAgLy8gR2l2ZSB0aGUgcmVnaXN0ZXIgY2xhc3MgYSBsZWdhbCBDIG5hbWUgaWYgaXQncyBhbm9ueW1vdXMuCisgICAgICBzdGQ6OnN0cmluZyBOYW1lID0gUkMuVGhlRGVmLT5nZXROYW1lKCk7CisKKyAgICAgIE9TIDw8ICIgIC8vICIgPDwgTmFtZSAKKyAgICAgICAgIDw8ICIgUmVnaXN0ZXIgQ2xhc3Mgc3VwZXItY2xhc3Nlcy4uLlxuIgorICAgICAgICAgPDwgIiAgc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIGNvbnN0ICIKKyAgICAgICAgIDw8IE5hbWUgPDwgIlN1cGVyY2xhc3Nlc1tdID0ge1xuICAgICI7CisKKyAgICAgIGJvb2wgRW1wdHkgPSB0cnVlOworICAgICAgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6c2V0PHVuc2lnbmVkPiA+OjppdGVyYXRvciBJID0KKyAgICAgICAgU3VwZXJDbGFzc01hcC5maW5kKHJjKTsKKyAgICAgIGlmIChJICE9IFN1cGVyQ2xhc3NNYXAuZW5kKCkpIHsKKyAgICAgICAgZm9yIChzdGQ6OnNldDx1bnNpZ25lZD46Oml0ZXJhdG9yIElJID0gSS0+c2Vjb25kLmJlZ2luKCksCisgICAgICAgICAgICAgICBFRSA9IEktPnNlY29uZC5lbmQoKTsgSUkgIT0gRUU7ICsrSUkpIHsKKyAgICAgICAgICBjb25zdCBDb2RlR2VuUmVnaXN0ZXJDbGFzcyAmUkMyID0gUmVnaXN0ZXJDbGFzc2VzWypJSV07CisgICAgICAgICAgaWYgKCFFbXB0eSkgT1MgPDwgIiwgIjsKKyAgICAgICAgICBPUyA8PCAiJiIgPDwgZ2V0UXVhbGlmaWVkTmFtZShSQzIuVGhlRGVmKSA8PCAiUmVnQ2xhc3MiOworICAgICAgICAgIEVtcHR5ID0gZmFsc2U7ICAgICAgICAKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBPUyA8PCAoIUVtcHR5ID8gIiwgIiA6ICIiKSA8PCAiTlVMTCI7CisgICAgICBPUyA8PCAiXG4gIH07XG5cbiI7CisgICAgfQorCisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVnaXN0ZXJDbGFzc2VzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlckNsYXNzICZSQyA9IFJlZ2lzdGVyQ2xhc3Nlc1tpXTsKKyAgICAgIE9TIDw8IFJDLk1ldGhvZEJvZGllcyA8PCAiXG4iOworICAgICAgT1MgPDwgUkMuZ2V0TmFtZSgpIDw8ICJDbGFzczo6IiA8PCBSQy5nZXROYW1lKCkgCisgICAgICAgICA8PCAiQ2xhc3MoKSAgOiBUYXJnZXRSZWdpc3RlckNsYXNzKCIKKyAgICAgICAgIDw8IFJDLmdldE5hbWUoKSArICJSZWdDbGFzc0lEIiA8PCAiLCAiCisgICAgICAgICA8PCAnXCInIDw8IFJDLmdldE5hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgIDw8IFJDLmdldE5hbWUoKSArICJWVHMiIDw8ICIsICIKKyAgICAgICAgIDw8IFJDLmdldE5hbWUoKSArICJTdWJjbGFzc2VzIiA8PCAiLCAiCisgICAgICAgICA8PCBSQy5nZXROYW1lKCkgKyAiU3VwZXJjbGFzc2VzIiA8PCAiLCAiCisgICAgICAgICA8PCAoTnVtU3ViUmVnSW5kaWNlcyA/IFJDLmdldE5hbWUoKSArICJTdWIiIDogc3RkOjpzdHJpbmcoIk51bGwiKSkKKyAgICAgICAgIDw8ICJSZWdDbGFzc2VzLCAiCisgICAgICAgICA8PCAoTnVtU3ViUmVnSW5kaWNlcyA/IFJDLmdldE5hbWUoKSArICJTdXBlciIgOiBzdGQ6OnN0cmluZygiTnVsbCIpKQorICAgICAgICAgPDwgIlJlZ0NsYXNzZXMsICIKKyAgICAgICAgIDw8IFJDLlNwaWxsU2l6ZS84IDw8ICIsICIKKyAgICAgICAgIDw8IFJDLlNwaWxsQWxpZ25tZW50LzggPDwgIiwgIgorICAgICAgICAgPDwgUkMuQ29weUNvc3QgPDwgIiwgIgorICAgICAgICAgPDwgUkMuZ2V0TmFtZSgpIDw8ICIsICIgPDwgUkMuZ2V0TmFtZSgpIDw8ICIgKyAiIDw8IFJDLkVsZW1lbnRzLnNpemUoKQorICAgICAgICAgPDwgIikge31cbiI7CisgICAgfQorICAKKyAgICBPUyA8PCAifVxuIjsKKyAgfQorCisgIE9TIDw8ICJcbm5hbWVzcGFjZSB7XG4iOworICBPUyA8PCAiICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBjb25zdCBSZWdpc3RlckNsYXNzZXNbXSA9IHtcbiI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdpc3RlckNsYXNzZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBPUyA8PCAiICAgICYiIDw8IGdldFF1YWxpZmllZE5hbWUoUmVnaXN0ZXJDbGFzc2VzW2ldLlRoZURlZikKKyAgICAgICA8PCAiUmVnQ2xhc3MsXG4iOworICBPUyA8PCAiICB9O1xuIjsKKworICAvLyBFbWl0IHJlZ2lzdGVyIHN1Yi1yZWdpc3RlcnMgLyBzdXBlci1yZWdpc3RlcnMsIGFsaWFzZXMuLi4KKyAgc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpzZXQ8UmVjb3JkKj4sIExlc3NSZWNvcmQ+IFJlZ2lzdGVyU3ViUmVnczsKKyAgc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpzZXQ8UmVjb3JkKj4sIExlc3NSZWNvcmQ+IFJlZ2lzdGVyU3VwZXJSZWdzOworICBzdGQ6Om1hcDxSZWNvcmQqLCBzdGQ6OnNldDxSZWNvcmQqPiwgTGVzc1JlY29yZD4gUmVnaXN0ZXJBbGlhc2VzOworICB0eXBlZGVmIHN0ZDo6bWFwPFJlY29yZCosIHN0ZDo6dmVjdG9yPGludDY0X3Q+LCBMZXNzUmVjb3JkPiBEd2FyZlJlZ051bXNNYXBUeTsKKyAgRHdhcmZSZWdOdW1zTWFwVHkgRHdhcmZSZWdOdW1zOworICAKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZUdlblJlZ2lzdGVyPiAmUmVncyA9IFRhcmdldC5nZXRSZWdpc3RlcnMoKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgUmVjb3JkICpSID0gUmVnc1tpXS5UaGVEZWY7CisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gTEkgPSBSZWdzW2ldLlRoZURlZi0+Z2V0VmFsdWVBc0xpc3RPZkRlZnMoIkFsaWFzZXMiKTsKKyAgICAvLyBBZGQgaW5mb3JtYXRpb24gdGhhdCBSIGFsaWFzZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdC4uLiBhbmQKKyAgICAvLyB0aGF0IGV2ZXJ5dGhpbmcgaW4gdGhlIGxpc3QgYWxpYXNlcyBSLgorICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGUgPSBMSS5zaXplKCk7IGogIT0gZTsgKytqKSB7CisgICAgICBSZWNvcmQgKlJlZyA9IExJW2pdOworICAgICAgaWYgKFJlZ2lzdGVyQWxpYXNlc1tSXS5jb3VudChSZWcpKQorICAgICAgICBlcnJzKCkgPDwgIldhcm5pbmc6IHJlZ2lzdGVyIGFsaWFzIGJldHdlZW4gIiA8PCBnZXRRdWFsaWZpZWROYW1lKFIpCisgICAgICAgICAgICAgICA8PCAiIGFuZCAiIDw8IGdldFF1YWxpZmllZE5hbWUoUmVnKQorICAgICAgICAgICAgICAgPDwgIiBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMhXG4iOworICAgICAgUmVnaXN0ZXJBbGlhc2VzW1JdLmluc2VydChSZWcpOworCisgICAgICBpZiAoUmVnaXN0ZXJBbGlhc2VzW1JlZ10uY291bnQoUikpCisgICAgICAgIGVycnMoKSA8PCAiV2FybmluZzogcmVnaXN0ZXIgYWxpYXMgYmV0d2VlbiAiIDw8IGdldFF1YWxpZmllZE5hbWUoUikKKyAgICAgICAgICAgICAgIDw8ICIgYW5kICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShSZWcpCisgICAgICAgICAgICAgICA8PCAiIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcyFcbiI7CisgICAgICBSZWdpc3RlckFsaWFzZXNbUmVnXS5pbnNlcnQoUik7CisgICAgfQorICB9CisKKyAgLy8gUHJvY2VzcyBzdWItcmVnaXN0ZXIgc2V0cy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIFJlY29yZCAqUiA9IFJlZ3NbaV0uVGhlRGVmOworICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IExJID0gUmVnc1tpXS5UaGVEZWYtPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJTdWJSZWdzIik7CisgICAgLy8gUHJvY2VzcyBzdWItcmVnaXN0ZXIgc2V0IGFuZCBhZGQgYWxpYXNlcyBpbmZvcm1hdGlvbi4KKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gTEkuc2l6ZSgpOyBqICE9IGU7ICsraikgeworICAgICAgUmVjb3JkICpTdWJSZWcgPSBMSVtqXTsKKyAgICAgIGlmIChSZWdpc3RlclN1YlJlZ3NbUl0uY291bnQoU3ViUmVnKSkKKyAgICAgICAgZXJycygpIDw8ICJXYXJuaW5nOiByZWdpc3RlciAiIDw8IGdldFF1YWxpZmllZE5hbWUoU3ViUmVnKQorICAgICAgICAgICAgICAgPDwgIiBzcGVjaWZpZWQgYXMgYSBzdWItcmVnaXN0ZXIgb2YgIiA8PCBnZXRRdWFsaWZpZWROYW1lKFIpCisgICAgICAgICAgICAgICA8PCAiIG11bHRpcGxlIHRpbWVzIVxuIjsKKyAgICAgIGFkZFN1YlN1cGVyUmVnKFIsIFN1YlJlZywgUmVnaXN0ZXJTdWJSZWdzLCBSZWdpc3RlclN1cGVyUmVncywKKyAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQWxpYXNlcyk7CisgICAgfQorICB9CisgIAorICAvLyBQcmludCB0aGUgU3VicmVnSGFzaFRhYmxlLCBhIHNpbXBsZSBxdWFkcmF0aWNhbGx5IHByb2JlZAorICAvLyBoYXNoIHRhYmxlIGZvciBkZXRlcm1pbmluZyBpZiBhIHJlZ2lzdGVyIGlzIGEgc3VicmVnaXN0ZXIKKyAgLy8gb2YgYW5vdGhlciByZWdpc3Rlci4KKyAgdW5zaWduZWQgTnVtU3ViUmVncyA9IDA7CisgIHN0ZDo6bWFwPFJlY29yZCosIHVuc2lnbmVkPiBSZWdObzsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIFJlZ05vW1JlZ3NbaV0uVGhlRGVmXSA9IGk7CisgICAgTnVtU3ViUmVncyArPSBSZWdpc3RlclN1YlJlZ3NbUmVnc1tpXS5UaGVEZWZdLnNpemUoKTsKKyAgfQorICAKKyAgdW5zaWduZWQgU3VicmVnSGFzaFRhYmxlU2l6ZSA9IDIgKiBOZXh0UG93ZXJPZjIoMiAqIE51bVN1YlJlZ3MpOworICB1bnNpZ25lZCogU3VicmVnSGFzaFRhYmxlID0gbmV3IHVuc2lnbmVkWzIgKiBTdWJyZWdIYXNoVGFibGVTaXplXTsKKyAgc3RkOjpmaWxsKFN1YnJlZ0hhc2hUYWJsZSwgU3VicmVnSGFzaFRhYmxlICsgMiAqIFN1YnJlZ0hhc2hUYWJsZVNpemUsIH4wVSk7CisgIAorICB1bnNpZ25lZCBoYXNoTWlzc2VzID0gMDsKKyAgCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWNvcmQqIFIgPSBSZWdzW2ldLlRoZURlZjsKKyAgICBmb3IgKHN0ZDo6c2V0PFJlY29yZCo+OjppdGVyYXRvciBJID0gUmVnaXN0ZXJTdWJSZWdzW1JdLmJlZ2luKCksCisgICAgICAgICBFID0gUmVnaXN0ZXJTdWJSZWdzW1JdLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgUmVjb3JkKiBSSiA9ICpJOworICAgICAgLy8gV2UgaGF2ZSB0byBpbmNyZWFzZSB0aGUgaW5kaWNlcyBvZiBib3RoIHJlZ2lzdGVycyBieSBvbmUgd2hlbgorICAgICAgLy8gY29tcHV0aW5nIHRoZSBoYXNoIGJlY2F1c2UsIGluIHRoZSBnZW5lcmF0ZWQgY29kZSwgdGhlcmUKKyAgICAgIC8vIHdpbGwgYmUgYW4gZXh0cmEgZW1wdHkgc2xvdCBhdCByZWdpc3RlciAwLgorICAgICAgc2l6ZV90IGluZGV4ID0gKChpKzEpICsgKFJlZ05vW1JKXSsxKSAqIDM3KSAmIChTdWJyZWdIYXNoVGFibGVTaXplLTEpOworICAgICAgdW5zaWduZWQgUHJvYmVBbXQgPSAyOworICAgICAgd2hpbGUgKFN1YnJlZ0hhc2hUYWJsZVtpbmRleCoyXSAhPSB+MFUgJiYKKyAgICAgICAgICAgICBTdWJyZWdIYXNoVGFibGVbaW5kZXgqMisxXSAhPSB+MFUpIHsKKyAgICAgICAgaW5kZXggPSAoaW5kZXggKyBQcm9iZUFtdCkgJiAoU3VicmVnSGFzaFRhYmxlU2l6ZS0xKTsKKyAgICAgICAgUHJvYmVBbXQgKz0gMjsKKyAgICAgICAgCisgICAgICAgIGhhc2hNaXNzZXMrKzsKKyAgICAgIH0KKyAgICAgIAorICAgICAgU3VicmVnSGFzaFRhYmxlW2luZGV4KjJdID0gaTsKKyAgICAgIFN1YnJlZ0hhc2hUYWJsZVtpbmRleCoyKzFdID0gUmVnTm9bUkpdOworICAgIH0KKyAgfQorICAKKyAgT1MgPDwgIlxuXG4gIC8vIE51bWJlciBvZiBoYXNoIGNvbGxpc2lvbnM6ICIgPDwgaGFzaE1pc3NlcyA8PCAiXG4iOworICAKKyAgaWYgKFN1YnJlZ0hhc2hUYWJsZVNpemUpIHsKKyAgICBzdGQ6OnN0cmluZyBOYW1lc3BhY2UgPSBSZWdzWzBdLlRoZURlZi0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZXNwYWNlIik7CisgICAgCisgICAgT1MgPDwgIiAgY29uc3QgdW5zaWduZWQgU3VicmVnSGFzaFRhYmxlW10gPSB7ICI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFN1YnJlZ0hhc2hUYWJsZVNpemUgLSAxOyArK2kpIHsKKyAgICAgIGlmIChpICE9IDApCisgICAgICAgIC8vIEluc2VydCBzcGFjZXMgZm9yIG5pY2UgZm9ybWF0dGluZy4KKyAgICAgICAgT1MgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CisgICAgICAKKyAgICAgIGlmIChTdWJyZWdIYXNoVGFibGVbMippXSAhPSB+MFUpIHsKKyAgICAgICAgT1MgPDwgZ2V0UXVhbGlmaWVkTmFtZShSZWdzW1N1YnJlZ0hhc2hUYWJsZVsyKmldXS5UaGVEZWYpIDw8ICIsICIKKyAgICAgICAgICAgPDwgZ2V0UXVhbGlmaWVkTmFtZShSZWdzW1N1YnJlZ0hhc2hUYWJsZVsyKmkrMV1dLlRoZURlZikgPDwgIiwgXG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgT1MgPDwgTmFtZXNwYWNlIDw8ICI6Ok5vUmVnaXN0ZXIsICIgPDwgTmFtZXNwYWNlIDw8ICI6Ok5vUmVnaXN0ZXIsIFxuIjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgSWR4ID0gU3VicmVnSGFzaFRhYmxlU2l6ZSoyLTI7CisgICAgaWYgKFN1YnJlZ0hhc2hUYWJsZVtJZHhdICE9IH4wVSkgeworICAgICAgT1MgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyAgICAgICAgIDw8IGdldFF1YWxpZmllZE5hbWUoUmVnc1tTdWJyZWdIYXNoVGFibGVbSWR4XV0uVGhlRGVmKSA8PCAiLCAiCisgICAgICAgICA8PCBnZXRRdWFsaWZpZWROYW1lKFJlZ3NbU3VicmVnSGFzaFRhYmxlW0lkeCsxXV0uVGhlRGVmKSA8PCAiIH07XG4iOworICAgIH0gZWxzZSB7CisgICAgICBPUyA8PCBOYW1lc3BhY2UgPDwgIjo6Tm9SZWdpc3RlciwgIiA8PCBOYW1lc3BhY2UgPDwgIjo6Tm9SZWdpc3RlciB9O1xuIjsKKyAgICB9CisgICAgCisgICAgT1MgPDwgIiAgY29uc3QgdW5zaWduZWQgU3VicmVnSGFzaFRhYmxlU2l6ZSA9ICIKKyAgICAgICA8PCBTdWJyZWdIYXNoVGFibGVTaXplIDw8ICI7XG4iOworICB9IGVsc2UgeworICAgIE9TIDw8ICIgIGNvbnN0IHVuc2lnbmVkIFN1YnJlZ0hhc2hUYWJsZVtdID0geyB+MFUsIH4wVSB9O1xuIgorICAgICAgIDw8ICIgIGNvbnN0IHVuc2lnbmVkIFN1YnJlZ0hhc2hUYWJsZVNpemUgPSAxO1xuIjsKKyAgfQorICAKKyAgZGVsZXRlIFtdIFN1YnJlZ0hhc2hUYWJsZTsKKworCisgIC8vIFByaW50IHRoZSBBbGlhc0hhc2hUYWJsZSwgYSBzaW1wbGUgcXVhZHJhdGljYWxseSBwcm9iZWQKKyAgLy8gaGFzaCB0YWJsZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYSByZWdpc3RlciBhbGlhc2VzIGFub3RoZXIgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIE51bUFsaWFzZXMgPSAwOworICBSZWdOby5jbGVhcigpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgUmVnTm9bUmVnc1tpXS5UaGVEZWZdID0gaTsKKyAgICBOdW1BbGlhc2VzICs9IFJlZ2lzdGVyQWxpYXNlc1tSZWdzW2ldLlRoZURlZl0uc2l6ZSgpOworICB9CisgIAorICB1bnNpZ25lZCBBbGlhc2VzSGFzaFRhYmxlU2l6ZSA9IDIgKiBOZXh0UG93ZXJPZjIoMiAqIE51bUFsaWFzZXMpOworICB1bnNpZ25lZCogQWxpYXNlc0hhc2hUYWJsZSA9IG5ldyB1bnNpZ25lZFsyICogQWxpYXNlc0hhc2hUYWJsZVNpemVdOworICBzdGQ6OmZpbGwoQWxpYXNlc0hhc2hUYWJsZSwgQWxpYXNlc0hhc2hUYWJsZSArIDIgKiBBbGlhc2VzSGFzaFRhYmxlU2l6ZSwgfjBVKTsKKyAgCisgIGhhc2hNaXNzZXMgPSAwOworICAKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIFJlY29yZCogUiA9IFJlZ3NbaV0uVGhlRGVmOworICAgIGZvciAoc3RkOjpzZXQ8UmVjb3JkKj46Oml0ZXJhdG9yIEkgPSBSZWdpc3RlckFsaWFzZXNbUl0uYmVnaW4oKSwKKyAgICAgICAgIEUgPSBSZWdpc3RlckFsaWFzZXNbUl0uZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBSZWNvcmQqIFJKID0gKkk7CisgICAgICAvLyBXZSBoYXZlIHRvIGluY3JlYXNlIHRoZSBpbmRpY2VzIG9mIGJvdGggcmVnaXN0ZXJzIGJ5IG9uZSB3aGVuCisgICAgICAvLyBjb21wdXRpbmcgdGhlIGhhc2ggYmVjYXVzZSwgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLCB0aGVyZQorICAgICAgLy8gd2lsbCBiZSBhbiBleHRyYSBlbXB0eSBzbG90IGF0IHJlZ2lzdGVyIDAuCisgICAgICBzaXplX3QgaW5kZXggPSAoKGkrMSkgKyAoUmVnTm9bUkpdKzEpICogMzcpICYgKEFsaWFzZXNIYXNoVGFibGVTaXplLTEpOworICAgICAgdW5zaWduZWQgUHJvYmVBbXQgPSAyOworICAgICAgd2hpbGUgKEFsaWFzZXNIYXNoVGFibGVbaW5kZXgqMl0gIT0gfjBVICYmCisgICAgICAgICAgICAgQWxpYXNlc0hhc2hUYWJsZVtpbmRleCoyKzFdICE9IH4wVSkgeworICAgICAgICBpbmRleCA9IChpbmRleCArIFByb2JlQW10KSAmIChBbGlhc2VzSGFzaFRhYmxlU2l6ZS0xKTsKKyAgICAgICAgUHJvYmVBbXQgKz0gMjsKKyAgICAgICAgCisgICAgICAgIGhhc2hNaXNzZXMrKzsKKyAgICAgIH0KKyAgICAgIAorICAgICAgQWxpYXNlc0hhc2hUYWJsZVtpbmRleCoyXSA9IGk7CisgICAgICBBbGlhc2VzSGFzaFRhYmxlW2luZGV4KjIrMV0gPSBSZWdOb1tSSl07CisgICAgfQorICB9CisgIAorICBPUyA8PCAiXG5cbiAgLy8gTnVtYmVyIG9mIGhhc2ggY29sbGlzaW9uczogIiA8PCBoYXNoTWlzc2VzIDw8ICJcbiI7CisgIAorICBpZiAoQWxpYXNlc0hhc2hUYWJsZVNpemUpIHsKKyAgICBzdGQ6OnN0cmluZyBOYW1lc3BhY2UgPSBSZWdzWzBdLlRoZURlZi0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZXNwYWNlIik7CisgICAgCisgICAgT1MgPDwgIiAgY29uc3QgdW5zaWduZWQgQWxpYXNlc0hhc2hUYWJsZVtdID0geyAiOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBBbGlhc2VzSGFzaFRhYmxlU2l6ZSAtIDE7ICsraSkgeworICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgLy8gSW5zZXJ0IHNwYWNlcyBmb3IgbmljZSBmb3JtYXR0aW5nLgorICAgICAgICBPUyA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyAgICAgIAorICAgICAgaWYgKEFsaWFzZXNIYXNoVGFibGVbMippXSAhPSB+MFUpIHsKKyAgICAgICAgT1MgPDwgZ2V0UXVhbGlmaWVkTmFtZShSZWdzW0FsaWFzZXNIYXNoVGFibGVbMippXV0uVGhlRGVmKSA8PCAiLCAiCisgICAgICAgICAgIDw8IGdldFF1YWxpZmllZE5hbWUoUmVnc1tBbGlhc2VzSGFzaFRhYmxlWzIqaSsxXV0uVGhlRGVmKSA8PCAiLCBcbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBPUyA8PCBOYW1lc3BhY2UgPDwgIjo6Tm9SZWdpc3RlciwgIiA8PCBOYW1lc3BhY2UgPDwgIjo6Tm9SZWdpc3RlciwgXG4iOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBJZHggPSBBbGlhc2VzSGFzaFRhYmxlU2l6ZSoyLTI7CisgICAgaWYgKEFsaWFzZXNIYXNoVGFibGVbSWR4XSAhPSB+MFUpIHsKKyAgICAgIE9TIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisgICAgICAgICA8PCBnZXRRdWFsaWZpZWROYW1lKFJlZ3NbQWxpYXNlc0hhc2hUYWJsZVtJZHhdXS5UaGVEZWYpIDw8ICIsICIKKyAgICAgICAgIDw8IGdldFF1YWxpZmllZE5hbWUoUmVnc1tBbGlhc2VzSGFzaFRhYmxlW0lkeCsxXV0uVGhlRGVmKSA8PCAiIH07XG4iOworICAgIH0gZWxzZSB7CisgICAgICBPUyA8PCBOYW1lc3BhY2UgPDwgIjo6Tm9SZWdpc3RlciwgIiA8PCBOYW1lc3BhY2UgPDwgIjo6Tm9SZWdpc3RlciB9O1xuIjsKKyAgICB9CisgICAgCisgICAgT1MgPDwgIiAgY29uc3QgdW5zaWduZWQgQWxpYXNlc0hhc2hUYWJsZVNpemUgPSAiCisgICAgICAgPDwgQWxpYXNlc0hhc2hUYWJsZVNpemUgPDwgIjtcbiI7CisgIH0gZWxzZSB7CisgICAgT1MgPDwgIiAgY29uc3QgdW5zaWduZWQgQWxpYXNlc0hhc2hUYWJsZVtdID0geyB+MFUsIH4wVSB9O1xuIgorICAgICAgIDw8ICIgIGNvbnN0IHVuc2lnbmVkIEFsaWFzZXNIYXNoVGFibGVTaXplID0gMTtcbiI7CisgIH0KKyAgCisgIGRlbGV0ZSBbXSBBbGlhc2VzSGFzaFRhYmxlOworCisgIGlmICghUmVnaXN0ZXJBbGlhc2VzLmVtcHR5KCkpCisgICAgT1MgPDwgIlxuXG4gIC8vIFJlZ2lzdGVyIEFsaWFzIFNldHMuLi5cbiI7CisKKyAgLy8gRW1pdCB0aGUgZW1wdHkgYWxpYXMgbGlzdAorICBPUyA8PCAiICBjb25zdCB1bnNpZ25lZCBFbXB0eV9BbGlhc1NldFtdID0geyAwIH07XG4iOworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSByZWdpc3RlcnMgd2hpY2ggaGF2ZSBhbGlhc2VzLCBlbWl0dGluZyB0aGUgYWxpYXMgbGlzdAorICAvLyB0byBtZW1vcnkuCisgIGZvciAoc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpzZXQ8UmVjb3JkKj4sIExlc3NSZWNvcmQgPjo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSBSZWdpc3RlckFsaWFzZXMuYmVnaW4oKSwgRSA9IFJlZ2lzdGVyQWxpYXNlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+c2Vjb25kLmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKyAgICBPUyA8PCAiICBjb25zdCB1bnNpZ25lZCAiIDw8IEktPmZpcnN0LT5nZXROYW1lKCkgPDwgIl9BbGlhc1NldFtdID0geyAiOworICAgIGZvciAoc3RkOjpzZXQ8UmVjb3JkKj46Oml0ZXJhdG9yIEFTSSA9IEktPnNlY29uZC5iZWdpbigpLAorICAgICAgICAgICBFID0gSS0+c2Vjb25kLmVuZCgpOyBBU0kgIT0gRTsgKytBU0kpCisgICAgICBPUyA8PCBnZXRRdWFsaWZpZWROYW1lKCpBU0kpIDw8ICIsICI7CisgICAgT1MgPDwgIjAgfTtcbiI7CisgIH0KKworICBpZiAoIVJlZ2lzdGVyU3ViUmVncy5lbXB0eSgpKQorICAgIE9TIDw8ICJcblxuICAvLyBSZWdpc3RlciBTdWItcmVnaXN0ZXJzIFNldHMuLi5cbiI7CisKKyAgLy8gRW1pdCB0aGUgZW1wdHkgc3ViLXJlZ2lzdGVycyBsaXN0CisgIE9TIDw8ICIgIGNvbnN0IHVuc2lnbmVkIEVtcHR5X1N1YlJlZ3NTZXRbXSA9IHsgMCB9O1xuIjsKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgcmVnaXN0ZXJzIHdoaWNoIGhhdmUgc3ViLXJlZ2lzdGVycywgZW1pdHRpbmcgdGhlCisgIC8vIHN1Yi1yZWdpc3RlcnMgbGlzdCB0byBtZW1vcnkuCisgIGZvciAoc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpzZXQ8UmVjb3JkKj4sIExlc3NSZWNvcmQ+OjppdGVyYXRvcgorICAgICAgICAgSSA9IFJlZ2lzdGVyU3ViUmVncy5iZWdpbigpLCBFID0gUmVnaXN0ZXJTdWJSZWdzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgaWYgKEktPnNlY29uZC5lbXB0eSgpKQorICAgICBjb250aW51ZTsKKyAgICBPUyA8PCAiICBjb25zdCB1bnNpZ25lZCAiIDw8IEktPmZpcnN0LT5nZXROYW1lKCkgPDwgIl9TdWJSZWdzU2V0W10gPSB7ICI7CisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gU3ViUmVnc1ZlY3RvcjsKKyAgICBmb3IgKHN0ZDo6c2V0PFJlY29yZCo+OjppdGVyYXRvciBBU0kgPSBJLT5zZWNvbmQuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IEktPnNlY29uZC5lbmQoKTsgQVNJICE9IEU7ICsrQVNJKQorICAgICAgU3ViUmVnc1ZlY3Rvci5wdXNoX2JhY2soKkFTSSk7CisgICAgUmVnaXN0ZXJTb3J0ZXIgUlMoUmVnaXN0ZXJTdWJSZWdzKTsKKyAgICBzdGQ6OnN0YWJsZV9zb3J0KFN1YlJlZ3NWZWN0b3IuYmVnaW4oKSwgU3ViUmVnc1ZlY3Rvci5lbmQoKSwgUlMpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBTdWJSZWdzVmVjdG9yLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBPUyA8PCBnZXRRdWFsaWZpZWROYW1lKFN1YlJlZ3NWZWN0b3JbaV0pIDw8ICIsICI7CisgICAgT1MgPDwgIjAgfTtcbiI7CisgIH0KKworICBpZiAoIVJlZ2lzdGVyU3VwZXJSZWdzLmVtcHR5KCkpCisgICAgT1MgPDwgIlxuXG4gIC8vIFJlZ2lzdGVyIFN1cGVyLXJlZ2lzdGVycyBTZXRzLi4uXG4iOworCisgIC8vIEVtaXQgdGhlIGVtcHR5IHN1cGVyLXJlZ2lzdGVycyBsaXN0CisgIE9TIDw8ICIgIGNvbnN0IHVuc2lnbmVkIEVtcHR5X1N1cGVyUmVnc1NldFtdID0geyAwIH07XG4iOworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSByZWdpc3RlcnMgd2hpY2ggaGF2ZSBzdXBlci1yZWdpc3RlcnMsIGVtaXR0aW5nIHRoZQorICAvLyBzdXBlci1yZWdpc3RlcnMgbGlzdCB0byBtZW1vcnkuCisgIGZvciAoc3RkOjptYXA8UmVjb3JkKiwgc3RkOjpzZXQ8UmVjb3JkKj4sIExlc3NSZWNvcmQgPjo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSBSZWdpc3RlclN1cGVyUmVncy5iZWdpbigpLCBFID0gUmVnaXN0ZXJTdXBlclJlZ3MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPnNlY29uZC5lbXB0eSgpKQorICAgICAgY29udGludWU7CisgICAgT1MgPDwgIiAgY29uc3QgdW5zaWduZWQgIiA8PCBJLT5maXJzdC0+Z2V0TmFtZSgpIDw8ICJfU3VwZXJSZWdzU2V0W10gPSB7ICI7CisKKyAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBTdXBlclJlZ3NWZWN0b3I7CisgICAgZm9yIChzdGQ6OnNldDxSZWNvcmQqPjo6aXRlcmF0b3IgQVNJID0gSS0+c2Vjb25kLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBJLT5zZWNvbmQuZW5kKCk7IEFTSSAhPSBFOyArK0FTSSkKKyAgICAgIFN1cGVyUmVnc1ZlY3Rvci5wdXNoX2JhY2soKkFTSSk7CisgICAgUmVnaXN0ZXJTb3J0ZXIgUlMoUmVnaXN0ZXJTdWJSZWdzKTsKKyAgICBzdGQ6OnN0YWJsZV9zb3J0KFN1cGVyUmVnc1ZlY3Rvci5iZWdpbigpLCBTdXBlclJlZ3NWZWN0b3IuZW5kKCksIFJTKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3VwZXJSZWdzVmVjdG9yLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBPUyA8PCBnZXRRdWFsaWZpZWROYW1lKFN1cGVyUmVnc1ZlY3RvcltpXSkgPDwgIiwgIjsKKyAgICBPUyA8PCAiMCB9O1xuIjsKKyAgfQorCisgIE9TPDwiXG4gIGNvbnN0IFRhcmdldFJlZ2lzdGVyRGVzYyBSZWdpc3RlckRlc2NyaXB0b3JzW10gPSB7IC8vIERlc2NyaXB0b3JzXG4iOworICBPUyA8PCAiICAgIHsgXCJOT1JFR1wiLFx0MCxcdDAsXHQwIH0sXG4iOworCisgIC8vIE5vdyB0aGF0IHJlZ2lzdGVyIGFsaWFzIGFuZCBzdWItcmVnaXN0ZXJzIHNldHMgaGF2ZSBiZWVuIGVtaXR0ZWQsIGVtaXQgdGhlCisgIC8vIHJlZ2lzdGVyIGRlc2NyaXB0b3JzIG5vdy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGNvbnN0IENvZGVHZW5SZWdpc3RlciAmUmVnID0gUmVnc1tpXTsKKyAgICBPUyA8PCAiICAgIHsgXCIiOworICAgIE9TIDw8IFJlZy5nZXROYW1lKCkgPDwgIlwiLFx0IjsKKyAgICBpZiAoIVJlZ2lzdGVyQWxpYXNlc1tSZWcuVGhlRGVmXS5lbXB0eSgpKQorICAgICAgT1MgPDwgUmVnLmdldE5hbWUoKSA8PCAiX0FsaWFzU2V0LFx0IjsKKyAgICBlbHNlCisgICAgICBPUyA8PCAiRW1wdHlfQWxpYXNTZXQsXHQiOworICAgIGlmICghUmVnaXN0ZXJTdWJSZWdzW1JlZy5UaGVEZWZdLmVtcHR5KCkpCisgICAgICBPUyA8PCBSZWcuZ2V0TmFtZSgpIDw8ICJfU3ViUmVnc1NldCxcdCI7CisgICAgZWxzZQorICAgICAgT1MgPDwgIkVtcHR5X1N1YlJlZ3NTZXQsXHQiOworICAgIGlmICghUmVnaXN0ZXJTdXBlclJlZ3NbUmVnLlRoZURlZl0uZW1wdHkoKSkKKyAgICAgIE9TIDw8IFJlZy5nZXROYW1lKCkgPDwgIl9TdXBlclJlZ3NTZXQgfSxcbiI7CisgICAgZWxzZQorICAgICAgT1MgPDwgIkVtcHR5X1N1cGVyUmVnc1NldCB9LFxuIjsKKyAgfQorICBPUyA8PCAiICB9O1xuIjsgICAgICAvLyBFbmQgb2YgcmVnaXN0ZXIgZGVzY3JpcHRvcnMuLi4KKworICAvLyBFbWl0IFN1YlJlZ0luZGV4IG5hbWVzLCBza2lwcGluZyAwCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+IFN1YlJlZ0luZGljZXMgPSBUYXJnZXQuZ2V0U3ViUmVnSW5kaWNlcygpOworICBPUyA8PCAiXG4gIGNvbnN0IGNoYXIgKmNvbnN0IFN1YlJlZ0luZGV4VGFibGVbXSA9IHsgXCIiOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3ViUmVnSW5kaWNlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgT1MgPDwgU3ViUmVnSW5kaWNlc1tpXS0+Z2V0TmFtZSgpOworICAgIGlmIChpKzEgIT0gZSkKKyAgICAgIE9TIDw8ICJcIiwgXCIiOworICB9CisgIE9TIDw8ICJcIiB9O1xuXG4iOworICBPUyA8PCAifVxuXG4iOyAgICAgICAvLyBFbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZS4uLgorCisgIHN0ZDo6c3RyaW5nIENsYXNzTmFtZSA9IFRhcmdldC5nZXROYW1lKCkgKyAiR2VuUmVnaXN0ZXJJbmZvIjsKKworICAvLyBDYWxjdWxhdGUgdGhlIG1hcHBpbmcgb2Ygc3VicmVnaXN0ZXIraW5kZXggcGFpcnMgdG8gcGh5c2ljYWwgcmVnaXN0ZXJzLgorICBSZWdpc3Rlck1hcHMgUmVnTWFwczsKKworICAvLyBFbWl0IHRoZSBzdWJyZWdpc3RlciArIGluZGV4IG1hcHBpbmcgZnVuY3Rpb24gYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uCisgIC8vIGNhbGN1bGF0ZWQgYWJvdmUuCisgIE9TIDw8ICJ1bnNpZ25lZCAiIDw8IENsYXNzTmFtZQorICAgICA8PCAiOjpnZXRTdWJSZWcodW5zaWduZWQgUmVnTm8sIHVuc2lnbmVkIEluZGV4KSBjb25zdCB7XG4iCisgICAgIDw8ICIgIHN3aXRjaCAoUmVnTm8pIHtcbiIKKyAgICAgPDwgIiAgZGVmYXVsdDpcbiAgICByZXR1cm4gMDtcbiI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBSZWdpc3Rlck1hcHM6OlN1YlJlZ01hcCAmU1JNID0gUmVnTWFwcy5pbmZlclN1YlJlZ0luZGljZXMoUmVnc1tpXS5UaGVEZWYpOworICAgIGlmIChTUk0uZW1wdHkoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIE9TIDw8ICIgIGNhc2UgIiA8PCBnZXRRdWFsaWZpZWROYW1lKFJlZ3NbaV0uVGhlRGVmKSA8PCAiOlxuIjsKKyAgICBPUyA8PCAiICAgIHN3aXRjaCAoSW5kZXgpIHtcbiI7CisgICAgT1MgPDwgIiAgICBkZWZhdWx0OiByZXR1cm4gMDtcbiI7CisgICAgZm9yIChSZWdpc3Rlck1hcHM6OlN1YlJlZ01hcDo6Y29uc3RfaXRlcmF0b3IgaWkgPSBTUk0uYmVnaW4oKSwKKyAgICAgICAgIGllID0gU1JNLmVuZCgpOyBpaSAhPSBpZTsgKytpaSkKKyAgICAgIE9TIDw8ICIgICAgY2FzZSAiIDw8IGdldFF1YWxpZmllZE5hbWUoaWktPmZpcnN0KQorICAgICAgICAgPDwgIjogcmV0dXJuICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShpaS0+c2Vjb25kKSA8PCAiO1xuIjsKKyAgICBPUyA8PCAiICAgIH07XG4iIDw8ICIgICAgYnJlYWs7XG4iOworICB9CisgIE9TIDw8ICIgIH07XG4iOworICBPUyA8PCAiICByZXR1cm4gMDtcbiI7CisgIE9TIDw8ICJ9XG5cbiI7CisKKyAgT1MgPDwgInVuc2lnbmVkICIgPDwgQ2xhc3NOYW1lCisgICAgIDw8ICI6OmdldFN1YlJlZ0luZGV4KHVuc2lnbmVkIFJlZ05vLCB1bnNpZ25lZCBTdWJSZWdObykgY29uc3Qge1xuIgorICAgICA8PCAiICBzd2l0Y2ggKFJlZ05vKSB7XG4iCisgICAgIDw8ICIgIGRlZmF1bHQ6XG4gICAgcmV0dXJuIDA7XG4iOworICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICBSZWdpc3Rlck1hcHM6OlN1YlJlZ01hcCAmU1JNID0gUmVnTWFwcy5TdWJSZWdbUmVnc1tpXS5UaGVEZWZdOworICAgICBpZiAoU1JNLmVtcHR5KCkpCisgICAgICAgY29udGludWU7CisgICAgT1MgPDwgIiAgY2FzZSAiIDw8IGdldFF1YWxpZmllZE5hbWUoUmVnc1tpXS5UaGVEZWYpIDw8ICI6XG4iOworICAgIGZvciAoUmVnaXN0ZXJNYXBzOjpTdWJSZWdNYXA6OmNvbnN0X2l0ZXJhdG9yIGlpID0gU1JNLmJlZ2luKCksCisgICAgICAgICBpZSA9IFNSTS5lbmQoKTsgaWkgIT0gaWU7ICsraWkpCisgICAgICBPUyA8PCAiICAgIGlmIChTdWJSZWdObyA9PSAiIDw8IGdldFF1YWxpZmllZE5hbWUoaWktPnNlY29uZCkKKyAgICAgICAgIDw8ICIpICByZXR1cm4gIiA8PCBnZXRRdWFsaWZpZWROYW1lKGlpLT5maXJzdCkgPDwgIjtcbiI7CisgICAgT1MgPDwgIiAgICByZXR1cm4gMDtcbiI7CisgIH0KKyAgT1MgPDwgIiAgfTtcbiI7CisgIE9TIDw8ICIgIHJldHVybiAwO1xuIjsKKyAgT1MgPDwgIn1cblxuIjsKKworICAvLyBFbWl0IGNvbXBvc2VTdWJSZWdJbmRpY2VzCisgIFJlZ01hcHMuY29tcHV0ZUNvbXBvc2l0ZXMoKTsKKyAgT1MgPDwgInVuc2lnbmVkICIgPDwgQ2xhc3NOYW1lCisgICAgIDw8ICI6OmNvbXBvc2VTdWJSZWdJbmRpY2VzKHVuc2lnbmVkIElkeEEsIHVuc2lnbmVkIElkeEIpIGNvbnN0IHtcbiIKKyAgICAgPDwgIiAgc3dpdGNoIChJZHhBKSB7XG4iCisgICAgIDw8ICIgIGRlZmF1bHQ6XG4gICAgcmV0dXJuIElkeEI7XG4iOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3ViUmVnSW5kaWNlcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgYm9vbCBPcGVuID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiAhPSBlOyArK2opIHsKKyAgICAgIGlmIChSZWNvcmQgKkNvbXAgPSBSZWdNYXBzLkNvbXBvc2l0ZS5sb29rdXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFN1YlJlZ0luZGljZXNbaV0sIFN1YlJlZ0luZGljZXNbal0pKSkgeworICAgICAgICBpZiAoIU9wZW4pIHsKKyAgICAgICAgICBPUyA8PCAiICBjYXNlICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShTdWJSZWdJbmRpY2VzW2ldKQorICAgICAgICAgICAgIDw8ICI6IHN3aXRjaChJZHhCKSB7XG4gICAgZGVmYXVsdDogcmV0dXJuIElkeEI7XG4iOworICAgICAgICAgIE9wZW4gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIE9TIDw8ICIgICAgY2FzZSAiIDw8IGdldFF1YWxpZmllZE5hbWUoU3ViUmVnSW5kaWNlc1tqXSkKKyAgICAgICAgICAgPDwgIjogcmV0dXJuICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShDb21wKSA8PCAiO1xuIjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKE9wZW4pCisgICAgICBPUyA8PCAiICAgIH1cbiI7CisgIH0KKyAgT1MgPDwgIiAgfVxufVxuXG4iOworCisgIC8vIEVtaXQgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcy4uLgorICBPUyA8PCBDbGFzc05hbWUgPDwgIjo6IiA8PCBDbGFzc05hbWUKKyAgICAgPDwgIihpbnQgQ2FsbEZyYW1lU2V0dXBPcGNvZGUsIGludCBDYWxsRnJhbWVEZXN0cm95T3Bjb2RlKVxuIgorICAgICA8PCAiICA6IFRhcmdldFJlZ2lzdGVySW5mbyhSZWdpc3RlckRlc2NyaXB0b3JzLCAiIDw8IFJlZ3Muc2l6ZSgpKzEKKyAgICAgPDwgIiwgUmVnaXN0ZXJDbGFzc2VzLCBSZWdpc3RlckNsYXNzZXMrIiA8PCBSZWdpc3RlckNsYXNzZXMuc2l6ZSgpIDw8IixcbiIKKyAgICAgPDwgIiAgICAgICAgICAgICAgICAgU3ViUmVnSW5kZXhUYWJsZSxcbiIKKyAgICAgPDwgIiAgICAgICAgICAgICAgICAgQ2FsbEZyYW1lU2V0dXBPcGNvZGUsIENhbGxGcmFtZURlc3Ryb3lPcGNvZGUsXG4iCisgICAgIDw8ICIgICAgICAgICAgICAgICAgIFN1YnJlZ0hhc2hUYWJsZSwgU3VicmVnSGFzaFRhYmxlU2l6ZSxcbiIKKyAgICAgPDwgIiAgICAgICAgICAgICAgICAgQWxpYXNlc0hhc2hUYWJsZSwgQWxpYXNlc0hhc2hUYWJsZVNpemUpIHtcbiIKKyAgICAgPDwgIn1cblxuIjsKKworICAvLyBDb2xsZWN0IGFsbCBpbmZvcm1hdGlvbiBhYm91dCBkd2FyZiByZWdpc3RlciBudW1iZXJzCisKKyAgLy8gRmlyc3QsIGp1c3QgcHVsbCBhbGwgcHJvdmlkZWQgaW5mb3JtYXRpb24gdG8gdGhlIG1hcAorICB1bnNpZ25lZCBtYXhMZW5ndGggPSAwOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgUmVjb3JkICpSZWcgPSBSZWdzW2ldLlRoZURlZjsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBSZWdOdW1zID0gUmVnLT5nZXRWYWx1ZUFzTGlzdE9mSW50cygiRHdhcmZOdW1iZXJzIik7CisgICAgbWF4TGVuZ3RoID0gc3RkOjptYXgoKHNpemVfdCltYXhMZW5ndGgsIFJlZ051bXMuc2l6ZSgpKTsKKyAgICBpZiAoRHdhcmZSZWdOdW1zLmNvdW50KFJlZykpCisgICAgICBlcnJzKCkgPDwgIldhcm5pbmc6IERXQVJGIG51bWJlcnMgZm9yIHJlZ2lzdGVyICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShSZWcpCisgICAgICAgICAgICAgPDwgInNwZWNpZmllZCBtdWx0aXBsZSB0aW1lc1xuIjsKKyAgICBEd2FyZlJlZ051bXNbUmVnXSA9IFJlZ051bXM7CisgIH0KKworICAvLyBOb3cgd2Uga25vdyBtYXhpbWFsIGxlbmd0aCBvZiBudW1iZXIgbGlzdC4gQXBwZW5kIC0xJ3MsIHdoZXJlIG5lZWRlZAorICBmb3IgKER3YXJmUmVnTnVtc01hcFR5OjppdGVyYXRvciAKKyAgICAgICBJID0gRHdhcmZSZWdOdW1zLmJlZ2luKCksIEUgPSBEd2FyZlJlZ051bXMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGZvciAodW5zaWduZWQgaSA9IEktPnNlY29uZC5zaXplKCksIGUgPSBtYXhMZW5ndGg7IGkgIT0gZTsgKytpKQorICAgICAgSS0+c2Vjb25kLnB1c2hfYmFjaygtMSk7CisKKyAgLy8gRW1pdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHdhcmYgcmVnaXN0ZXIgbnVtYmVycy4KKyAgT1MgPDwgImludCAiIDw8IENsYXNzTmFtZSA8PCAiOjpnZXREd2FyZlJlZ051bUZ1bGwodW5zaWduZWQgUmVnTnVtLCAiCisgICAgIDw8ICJ1bnNpZ25lZCBGbGF2b3VyKSBjb25zdCB7XG4iCisgICAgIDw8ICIgIHN3aXRjaCAoRmxhdm91cikge1xuIgorICAgICA8PCAiICBkZWZhdWx0OlxuIgorICAgICA8PCAiICAgIGFzc2VydCgwICYmIFwiVW5rbm93biBEV0FSRiBmbGF2b3VyXCIpO1xuIgorICAgICA8PCAiICAgIHJldHVybiAtMTtcbiI7CisgIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gbWF4TGVuZ3RoOyBpICE9IGU7ICsraSkgeworICAgIE9TIDw8ICIgIGNhc2UgIiA8PCBpIDw8ICI6XG4iCisgICAgICAgPDwgIiAgICBzd2l0Y2ggKFJlZ051bSkge1xuIgorICAgICAgIDw8ICIgICAgZGVmYXVsdDpcbiIKKyAgICAgICA8PCAiICAgICAgYXNzZXJ0KDAgJiYgXCJJbnZhbGlkIFJlZ051bVwiKTtcbiIKKyAgICAgICA8PCAiICAgICAgcmV0dXJuIC0xO1xuIjsKKyAgICAKKyAgICAvLyBTb3J0IGJ5IG5hbWUgdG8gZ2V0IGEgc3RhYmxlIG9yZGVyLgorICAgIAorCisgICAgZm9yIChEd2FyZlJlZ051bXNNYXBUeTo6aXRlcmF0b3IgCisgICAgICAgICAgIEkgPSBEd2FyZlJlZ051bXMuYmVnaW4oKSwgRSA9IER3YXJmUmVnTnVtcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGludCBSZWdObyA9IEktPnNlY29uZFtpXTsKKyAgICAgIGlmIChSZWdObyAhPSAtMikKKyAgICAgICAgT1MgPDwgIiAgICBjYXNlICIgPDwgZ2V0UXVhbGlmaWVkTmFtZShJLT5maXJzdCkgPDwgIjpcbiIKKyAgICAgICAgICAgPDwgIiAgICAgIHJldHVybiAiIDw8IFJlZ05vIDw8ICI7XG4iOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiICAgIGNhc2UgIiA8PCBnZXRRdWFsaWZpZWROYW1lKEktPmZpcnN0KSA8PCAiOlxuIgorICAgICAgICAgICA8PCAiICAgICAgYXNzZXJ0KDAgJiYgXCJJbnZhbGlkIHJlZ2lzdGVyIGZvciB0aGlzIG1vZGVcIik7XG4iCisgICAgICAgICAgIDw8ICIgICAgICByZXR1cm4gLTE7XG4iOworICAgIH0KKyAgICBPUyA8PCAiICAgIH07XG4iOworICB9CisgICAgCisgIE9TIDw8ICIgIH07XG59XG5cbiI7CisKKyAgT1MgPDwgIn0gLy8gRW5kIGxsdm0gbmFtZXNwYWNlIFxuIjsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1JlZ2lzdGVySW5mb0VtaXR0ZXIuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1JlZ2lzdGVySW5mb0VtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDU2YjRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vUmVnaXN0ZXJJbmZvRW1pdHRlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBSZWdpc3RlckluZm9FbWl0dGVyLmggLSBHZW5lcmF0ZSBhIFJlZ2lzdGVyIEZpbGUgRGVzYy4gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0YWJsZWdlbiBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBhIGRlc2NyaXB0aW9uIG9mIGEgdGFyZ2V0CisvLyByZWdpc3RlciBmaWxlIGZvciBhIGNvZGUgZ2VuZXJhdG9yLiAgSXQgdXNlcyBpbnN0YW5jZXMgb2YgdGhlIFJlZ2lzdGVyLAorLy8gUmVnaXN0ZXJBbGlhc2VzLCBhbmQgUmVnaXN0ZXJDbGFzcyBjbGFzc2VzIHRvIGdhdGhlciB0aGlzIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgUkVHSVNURVJfSU5GT19FTUlUVEVSX0gKKyNkZWZpbmUgUkVHSVNURVJfSU5GT19FTUlUVEVSX0gKKworI2luY2x1ZGUgIlRhYmxlR2VuQmFja2VuZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFJlZ2lzdGVySW5mb0VtaXR0ZXIgOiBwdWJsaWMgVGFibGVHZW5CYWNrZW5kIHsKKyAgUmVjb3JkS2VlcGVyICZSZWNvcmRzOworcHVibGljOgorICBSZWdpc3RlckluZm9FbWl0dGVyKFJlY29yZEtlZXBlciAmUikgOiBSZWNvcmRzKFIpIHt9CisKKyAgLy8gcnVuIC0gT3V0cHV0IHRoZSByZWdpc3RlciBmaWxlIGRlc2NyaXB0aW9uLCByZXR1cm5pbmcgdHJ1ZSBvbiBmYWlsdXJlLgorICB2b2lkIHJ1bihyYXdfb3N0cmVhbSAmbyk7CisKKyAgLy8gcnVuSGVhZGVyIC0gRW1pdCBhIGhlYWRlciBmcmFnbWVudCBmb3IgdGhlIHJlZ2lzdGVyIGluZm8gZW1pdHRlci4KKyAgdm9pZCBydW5IZWFkZXIocmF3X29zdHJlYW0gJm8pOworCisgIC8vIHJ1bkVudW1zIC0gUHJpbnQgb3V0IGVudW0gdmFsdWVzIGZvciBhbGwgb2YgdGhlIHJlZ2lzdGVycy4KKyAgdm9pZCBydW5FbnVtcyhyYXdfb3N0cmVhbSAmbyk7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1N0cmluZ1RvT2Zmc2V0VGFibGUuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1N0cmluZ1RvT2Zmc2V0VGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzk0MjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vU3RyaW5nVG9PZmZzZXRUYWJsZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LSBTdHJpbmdUb09mZnNldFRhYmxlLmggLSBFbWl0IGEgYmlnIGNvbmNhdGVuYXRlZCBzdHJpbmcgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVEJMR0VOX1NUUklOR19UT19PRkZTRVRfVEFCTEVfSAorI2RlZmluZSBUQkxHRU5fU1RSSU5HX1RPX09GRlNFVF9UQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTdHJpbmdUb09mZnNldFRhYmxlIC0gVGhpcyBjbGFzcyB1bmlxdWVzIGEgYnVuY2ggb2YgbnVsLXRlcm1pbmF0ZWQgc3RyaW5ncworLy8vIGFuZCBrZWVwcyB0cmFjayBvZiB0aGVpciBvZmZzZXQgaW4gYSBtYXNzaXZlIGNvbnRpZ3VvdXMgc3RyaW5nIGFsbG9jYXRpb24uCisvLy8gSXQgY2FuIHRoZW4gb3V0cHV0IHRoaXMgc3RyaW5nIGJsb2IgYW5kIHVzZSBpbmRleGVzIGludG8gdGhlIHN0cmluZyB0bworLy8vIHJlZmVyZW5jZSBlYWNoIHBpZWNlLgorY2xhc3MgU3RyaW5nVG9PZmZzZXRUYWJsZSB7CisgIFN0cmluZ01hcDx1bnNpZ25lZD4gU3RyaW5nT2Zmc2V0OworICBzdGQ6OnN0cmluZyBBZ2dyZWdhdGVTdHJpbmc7CitwdWJsaWM6CisgIAorICB1bnNpZ25lZCBHZXRPckFkZFN0cmluZ09mZnNldChTdHJpbmdSZWYgU3RyKSB7CisgICAgdW5zaWduZWQgJkVudHJ5ID0gU3RyaW5nT2Zmc2V0W1N0cl07CisgICAgaWYgKEVudHJ5ID09IDApIHsKKyAgICAgIC8vIEFkZCB0aGUgc3RyaW5nIHRvIHRoZSBhZ2dyZWdhdGUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBmb3VuZC4KKyAgICAgIEVudHJ5ID0gQWdncmVnYXRlU3RyaW5nLnNpemUoKTsKKyAgICAgIEFnZ3JlZ2F0ZVN0cmluZy5hcHBlbmQoU3RyLmJlZ2luKCksIFN0ci5lbmQoKSk7CisgICAgICBBZ2dyZWdhdGVTdHJpbmcgKz0gJ1wwJzsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEVudHJ5OworICB9CisgIAorICB2b2lkIEVtaXRTdHJpbmcocmF3X29zdHJlYW0gJk8pIHsKKyAgICAvLyBFc2NhcGUgdGhlIHN0cmluZy4KKyAgICBTbWFsbFN0cmluZzwyNTY+IFN0cjsKKyAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtKFN0cikud3JpdGVfZXNjYXBlZChBZ2dyZWdhdGVTdHJpbmcpOworICAgIEFnZ3JlZ2F0ZVN0cmluZyA9IFN0ci5zdHIoKTsKKworICAgIE8gPDwgIiAgICBcIiI7CisgICAgdW5zaWduZWQgQ2hhcnNQcmludGVkID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQWdncmVnYXRlU3RyaW5nLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChDaGFyc1ByaW50ZWQgPiA3MCkgeworICAgICAgICBPIDw8ICJcIlxuICAgIFwiIjsKKyAgICAgICAgQ2hhcnNQcmludGVkID0gMDsKKyAgICAgIH0KKyAgICAgIE8gPDwgQWdncmVnYXRlU3RyaW5nW2ldOworICAgICAgKytDaGFyc1ByaW50ZWQ7CisgICAgICAKKyAgICAgIC8vIFByaW50IGVzY2FwZSBzZXF1ZW5jZXMgYWxsIHRvZ2V0aGVyLgorICAgICAgaWYgKEFnZ3JlZ2F0ZVN0cmluZ1tpXSAhPSAnXFwnKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgYXNzZXJ0KGkrMSA8IEFnZ3JlZ2F0ZVN0cmluZy5zaXplKCkgJiYgIkluY29tcGxldGUgZXNjYXBlIHNlcXVlbmNlISIpOworICAgICAgaWYgKGlzZGlnaXQoQWdncmVnYXRlU3RyaW5nW2krMV0pKSB7CisgICAgICAgIGFzc2VydChpc2RpZ2l0KEFnZ3JlZ2F0ZVN0cmluZ1tpKzJdKSAmJiAKKyAgICAgICAgICAgICAgIGlzZGlnaXQoQWdncmVnYXRlU3RyaW5nW2krM10pICYmCisgICAgICAgICAgICAgICAiRXhwZWN0ZWQgMyBkaWdpdCBvY3RhbCBlc2NhcGUhIik7CisgICAgICAgIE8gPDwgQWdncmVnYXRlU3RyaW5nWysraV07CisgICAgICAgIE8gPDwgQWdncmVnYXRlU3RyaW5nWysraV07CisgICAgICAgIE8gPDwgQWdncmVnYXRlU3RyaW5nWysraV07CisgICAgICAgIENoYXJzUHJpbnRlZCArPSAzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTyA8PCBBZ2dyZWdhdGVTdHJpbmdbKytpXTsKKyAgICAgICAgKytDaGFyc1ByaW50ZWQ7CisgICAgICB9CisgICAgfQorICAgIE8gPDwgIlwiIjsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9TdWJ0YXJnZXRFbWl0dGVyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1N1YnRhcmdldEVtaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNGVhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9TdWJ0YXJnZXRFbWl0dGVyLmNwcApAQCAtMCwwICsxLDYwNSBAQAorLy89PT0tIFN1YnRhcmdldEVtaXR0ZXIuY3BwIC0gR2VuZXJhdGUgc3VidGFyZ2V0IGVudW1lcmF0aW9ucyAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRhYmxlZ2VuIGJhY2tlbmQgZW1pdHMgc3VidGFyZ2V0IGVudW1lcmF0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiU3VidGFyZ2V0RW1pdHRlci5oIgorI2luY2x1ZGUgIkNvZGVHZW5UYXJnZXQuaCIKKyNpbmNsdWRlICJSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy8KKy8vIEVudW1lcmF0aW9uIC0gRW1pdCB0aGUgc3BlY2lmaWVkIGNsYXNzIGFzIGFuIGVudW1lcmF0aW9uLgorLy8KK3ZvaWQgU3VidGFyZ2V0RW1pdHRlcjo6RW51bWVyYXRpb24ocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNCaXRzKSB7CisgIC8vIEdldCBhbGwgcmVjb3JkcyBvZiBjbGFzcyBhbmQgc29ydAorICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBEZWZMaXN0ID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoQ2xhc3NOYW1lKTsKKyAgc3RkOjpzb3J0KERlZkxpc3QuYmVnaW4oKSwgRGVmTGlzdC5lbmQoKSwgTGVzc1JlY29yZCgpKTsKKworICAvLyBPcGVuIGVudW1lcmF0aW9uCisgIE9TIDw8ICJlbnVtIHtcbiI7CisgIAorICAvLyBGb3IgZWFjaCByZWNvcmQKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgTiA9IERlZkxpc3Quc2l6ZSgpOyBpIDwgTjspIHsKKyAgICAvLyBOZXh0IHJlY29yZAorICAgIFJlY29yZCAqRGVmID0gRGVmTGlzdFtpXTsKKyAgICAKKyAgICAvLyBHZXQgYW5kIGVtaXQgbmFtZQorICAgIE9TIDw8ICIgICIgPDwgRGVmLT5nZXROYW1lKCk7CisgICAgCisgICAgLy8gSWYgYml0IGZsYWdzIHRoZW4gZW1pdCBleHByZXNzaW9uICgxIDw8IGkpCisgICAgaWYgKGlzQml0cykgIE9TIDw8ICIgPSAiIDw8ICIgMSA8PCAiIDw8IGk7CisKKyAgICAvLyBEZXBlbmRpbmcgb24gJ2lmIG1vcmUgaW4gdGhlIGxpc3QnIGVtaXQgY29tbWEKKyAgICBpZiAoKytpIDwgTikgT1MgPDwgIiwiOworICAgIAorICAgIE9TIDw8ICJcbiI7CisgIH0KKyAgCisgIC8vIENsb3NlIGVudW1lcmF0aW9uCisgIE9TIDw8ICJ9O1xuIjsKK30KKworLy8KKy8vIEZlYXR1cmVLZXlWYWx1ZXMgLSBFbWl0IGRhdGEgb2YgYWxsIHRoZSBzdWJ0YXJnZXQgZmVhdHVyZXMuICBVc2VkIGJ5IHRoZQorLy8gY29tbWFuZCBsaW5lLgorLy8KK3ZvaWQgU3VidGFyZ2V0RW1pdHRlcjo6RmVhdHVyZUtleVZhbHVlcyhyYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gR2F0aGVyIGFuZCBzb3J0IGFsbCB0aGUgZmVhdHVyZXMKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gRmVhdHVyZUxpc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIlN1YnRhcmdldEZlYXR1cmUiKTsKKyAgc3RkOjpzb3J0KEZlYXR1cmVMaXN0LmJlZ2luKCksIEZlYXR1cmVMaXN0LmVuZCgpLCBMZXNzUmVjb3JkRmllbGROYW1lKCkpOworCisgIC8vIEJlZ2luIGZlYXR1cmUgdGFibGUKKyAgT1MgPDwgIi8vIFNvcnRlZCAoYnkga2V5KSBhcnJheSBvZiB2YWx1ZXMgZm9yIENQVSBmZWF0dXJlcy5cbiIKKyAgICAgPDwgInN0YXRpYyBjb25zdCBsbHZtOjpTdWJ0YXJnZXRGZWF0dXJlS1YgRmVhdHVyZUtWW10gPSB7XG4iOworICAKKyAgLy8gRm9yIGVhY2ggZmVhdHVyZQorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBOID0gRmVhdHVyZUxpc3Quc2l6ZSgpOyBpIDwgTjsgKytpKSB7CisgICAgLy8gTmV4dCBmZWF0dXJlCisgICAgUmVjb3JkICpGZWF0dXJlID0gRmVhdHVyZUxpc3RbaV07CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSA9IEZlYXR1cmUtPmdldE5hbWUoKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmQ29tbWFuZExpbmVOYW1lID0gRmVhdHVyZS0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZSIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZEZXNjID0gRmVhdHVyZS0+Z2V0VmFsdWVBc1N0cmluZygiRGVzYyIpOworICAgIAorICAgIGlmIChDb21tYW5kTGluZU5hbWUuZW1wdHkoKSkgY29udGludWU7CisgICAgCisgICAgLy8gRW1pdCBhcyB7ICJmZWF0dXJlIiwgImRlc2NyaXB0aW9uIiwgZmVhdHVyZUVudW0sIGkxIHwgaTIgfCAuLi4gfCBpbiB9CisgICAgT1MgPDwgIiAgeyAiCisgICAgICAgPDwgIlwiIiA8PCBDb21tYW5kTGluZU5hbWUgPDwgIlwiLCAiCisgICAgICAgPDwgIlwiIiA8PCBEZXNjIDw8ICJcIiwgIgorICAgICAgIDw8IE5hbWUgPDwgIiwgIjsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+ICZJbXBsaWVzTGlzdCA9IAorICAgICAgRmVhdHVyZS0+Z2V0VmFsdWVBc0xpc3RPZkRlZnMoIkltcGxpZXMiKTsKKyAgICAKKyAgICBpZiAoSW1wbGllc0xpc3QuZW1wdHkoKSkgeworICAgICAgT1MgPDwgIjAiOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBNID0gSW1wbGllc0xpc3Quc2l6ZSgpOyBqIDwgTTspIHsKKyAgICAgICAgT1MgPDwgSW1wbGllc0xpc3Rbal0tPmdldE5hbWUoKTsKKyAgICAgICAgaWYgKCsraiA8IE0pIE9TIDw8ICIgfCAiOworICAgICAgfQorICAgIH0KKworICAgIE9TIDw8ICIgfSI7CisgICAgCisgICAgLy8gRGVwZW5kaW5nIG9uICdpZiBtb3JlIGluIHRoZSBsaXN0JyBlbWl0IGNvbW1hCisgICAgaWYgKChpICsgMSkgPCBOKSBPUyA8PCAiLCI7CisgICAgCisgICAgT1MgPDwgIlxuIjsKKyAgfQorICAKKyAgLy8gRW5kIGZlYXR1cmUgdGFibGUKKyAgT1MgPDwgIn07XG4iOworCisgIC8vIEVtaXQgc2l6ZSBvZiB0YWJsZQorICBPUzw8IlxuZW51bSB7XG4iOworICBPUzw8IiAgRmVhdHVyZUtWU2l6ZSA9IHNpemVvZihGZWF0dXJlS1YpL3NpemVvZihsbHZtOjpTdWJ0YXJnZXRGZWF0dXJlS1YpXG4iOworICBPUzw8In07XG4iOworfQorCisvLworLy8gQ1BVS2V5VmFsdWVzIC0gRW1pdCBkYXRhIG9mIGFsbCB0aGUgc3VidGFyZ2V0IHByb2Nlc3NvcnMuICBVc2VkIGJ5IGNvbW1hbmQKKy8vIGxpbmUuCisvLwordm9pZCBTdWJ0YXJnZXRFbWl0dGVyOjpDUFVLZXlWYWx1ZXMocmF3X29zdHJlYW0gJk9TKSB7CisgIC8vIEdhdGhlciBhbmQgc29ydCBwcm9jZXNzb3IgaW5mb3JtYXRpb24KKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gUHJvY2Vzc29yTGlzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJQcm9jZXNzb3IiKTsKKyAgc3RkOjpzb3J0KFByb2Nlc3Nvckxpc3QuYmVnaW4oKSwgUHJvY2Vzc29yTGlzdC5lbmQoKSwgTGVzc1JlY29yZEZpZWxkTmFtZSgpKTsKKworICAvLyBCZWdpbiBwcm9jZXNzb3IgdGFibGUKKyAgT1MgPDwgIi8vIFNvcnRlZCAoYnkga2V5KSBhcnJheSBvZiB2YWx1ZXMgZm9yIENQVSBzdWJ0eXBlLlxuIgorICAgICA8PCAic3RhdGljIGNvbnN0IGxsdm06OlN1YnRhcmdldEZlYXR1cmVLViBTdWJUeXBlS1ZbXSA9IHtcbiI7CisgICAgIAorICAvLyBGb3IgZWFjaCBwcm9jZXNzb3IKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgTiA9IFByb2Nlc3Nvckxpc3Quc2l6ZSgpOyBpIDwgTjspIHsKKyAgICAvLyBOZXh0IHByb2Nlc3NvcgorICAgIFJlY29yZCAqUHJvY2Vzc29yID0gUHJvY2Vzc29yTGlzdFtpXTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lID0gUHJvY2Vzc29yLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIik7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJkZlYXR1cmVMaXN0ID0gCisgICAgICBQcm9jZXNzb3ItPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJGZWF0dXJlcyIpOworICAgIAorICAgIC8vIEVtaXQgYXMgeyAiY3B1IiwgImRlc2NyaXB0aW9uIiwgZjEgfCBmMiB8IC4uLiBmbiB9LAorICAgIE9TIDw8ICIgIHsgIgorICAgICAgIDw8ICJcIiIgPDwgTmFtZSA8PCAiXCIsICIKKyAgICAgICA8PCAiXCJTZWxlY3QgdGhlICIgPDwgTmFtZSA8PCAiIHByb2Nlc3NvclwiLCAiOworICAgIAorICAgIGlmIChGZWF0dXJlTGlzdC5lbXB0eSgpKSB7CisgICAgICBPUyA8PCAiMCI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIE0gPSBGZWF0dXJlTGlzdC5zaXplKCk7IGogPCBNOykgeworICAgICAgICBPUyA8PCBGZWF0dXJlTGlzdFtqXS0+Z2V0TmFtZSgpOworICAgICAgICBpZiAoKytqIDwgTSkgT1MgPDwgIiB8ICI7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIFRoZSAiMCIgaXMgZm9yIHRoZSAiaW1wbGllcyIgc2VjdGlvbiBvZiB0aGlzIGRhdGEgc3RydWN0dXJlLgorICAgIE9TIDw8ICIsIDAgfSI7CisgICAgCisgICAgLy8gRGVwZW5kaW5nIG9uICdpZiBtb3JlIGluIHRoZSBsaXN0JyBlbWl0IGNvbW1hCisgICAgaWYgKCsraSA8IE4pIE9TIDw8ICIsIjsKKyAgICAKKyAgICBPUyA8PCAiXG4iOworICB9CisgIAorICAvLyBFbmQgcHJvY2Vzc29yIHRhYmxlCisgIE9TIDw8ICJ9O1xuIjsKKworICAvLyBFbWl0IHNpemUgb2YgdGFibGUKKyAgT1M8PCJcbmVudW0ge1xuIjsKKyAgT1M8PCIgIFN1YlR5cGVLVlNpemUgPSBzaXplb2YoU3ViVHlwZUtWKS9zaXplb2YobGx2bTo6U3VidGFyZ2V0RmVhdHVyZUtWKVxuIjsKKyAgT1M8PCJ9O1xuIjsKK30KKworLy8KKy8vIENvbGxlY3RBbGxJdGluQ2xhc3NlcyAtIEdhdGhlcnMgYW5kIGVudW1lcmF0ZXMgYWxsIHRoZSBpdGluZXJhcnkgY2xhc3Nlcy4KKy8vIFJldHVybnMgaXRpbmVyYXJ5IGNsYXNzIGNvdW50LgorLy8KK3Vuc2lnbmVkIFN1YnRhcmdldEVtaXR0ZXI6OkNvbGxlY3RBbGxJdGluQ2xhc3NlcyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdW5zaWduZWQ+ICZJdGluQ2xhc3Nlc01hcCkgeworICAvLyBHYXRoZXIgYW5kIHNvcnQgYWxsIGl0aW5lcmFyeSBjbGFzc2VzCisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEl0aW5DbGFzc0xpc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJJbnN0ckl0aW5DbGFzcyIpOworICBzdGQ6OnNvcnQoSXRpbkNsYXNzTGlzdC5iZWdpbigpLCBJdGluQ2xhc3NMaXN0LmVuZCgpLCBMZXNzUmVjb3JkKCkpOworCisgIC8vIEZvciBlYWNoIGl0aW5lcmFyeSBjbGFzcworICB1bnNpZ25lZCBOID0gSXRpbkNsYXNzTGlzdC5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAvLyBOZXh0IGl0aW5lcmFyeSBjbGFzcworICAgIGNvbnN0IFJlY29yZCAqSXRpbkNsYXNzID0gSXRpbkNsYXNzTGlzdFtpXTsKKyAgICAvLyBHZXQgbmFtZSBvZiBpdGluZXJhcnkgY2xhc3MKKyAgICAvLyBBc3NpZ24gaXRpbmVyYXJ5IGNsYXNzIGEgdW5pcXVlIG51bWJlcgorICAgIEl0aW5DbGFzc2VzTWFwW0l0aW5DbGFzcy0+Z2V0TmFtZSgpXSA9IGk7CisgIH0KKyAgCisgIC8vIEVtaXQgc2l6ZSBvZiB0YWJsZQorICBPUzw8IlxuZW51bSB7XG4iOworICBPUzw8IiAgSXRpbkNsYXNzZXNTaXplID0gIiA8PCBOIDw8ICJcbiI7CisgIE9TPDwifTtcbiI7CisKKyAgLy8gUmV0dXJuIGl0aW5lcmFyeSBjbGFzcyBjb3VudAorICByZXR1cm4gTjsKK30KKworLy8KKy8vIEZvcm1JdGluZXJhcnlTdGFnZVN0cmluZyAtIENvbXBvc2UgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RhZ2UKKy8vIGRhdGEgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgaXRpbmVyYXJ5LiAgTiBpcyB0aGUgbnVtYmVyCisvLyBvZiBzdGFnZXMuCisvLwordm9pZCBTdWJ0YXJnZXRFbWl0dGVyOjpGb3JtSXRpbmVyYXJ5U3RhZ2VTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmQgKkl0aW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJkl0aW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTlN0YWdlcykgeworICAvLyBHZXQgc3RhdGVzIGxpc3QKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJlN0YWdlTGlzdCA9CisgICAgSXRpbkRhdGEtPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJTdGFnZXMiKTsKKworICAvLyBGb3IgZWFjaCBzdGFnZQorICB1bnNpZ25lZCBOID0gTlN0YWdlcyA9IFN0YWdlTGlzdC5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOOykgeworICAgIC8vIE5leHQgc3RhZ2UKKyAgICBjb25zdCBSZWNvcmQgKlN0YWdlID0gU3RhZ2VMaXN0W2ldOworICAKKyAgICAvLyBGb3JtIHN0cmluZyBhcyAseyBjeWNsZXMsIHUxIHwgdTIgfCAuLi4gfCB1biwgdGltZWluYywga2luZCB9CisgICAgaW50IEN5Y2xlcyA9IFN0YWdlLT5nZXRWYWx1ZUFzSW50KCJDeWNsZXMiKTsKKyAgICBJdGluU3RyaW5nICs9ICIgIHsgIiArIGl0b3N0cihDeWNsZXMpICsgIiwgIjsKKyAgICAKKyAgICAvLyBHZXQgdW5pdCBsaXN0CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gJlVuaXRMaXN0ID0gU3RhZ2UtPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJVbml0cyIpOworICAgIAorICAgIC8vIEZvciBlYWNoIHVuaXQKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBNID0gVW5pdExpc3Quc2l6ZSgpOyBqIDwgTTspIHsKKyAgICAgIC8vIEFkZCBuYW1lIGFuZCBiaXR3aXNlIG9yCisgICAgICBJdGluU3RyaW5nICs9IE5hbWUgKyAiRlU6OiIgKyBVbml0TGlzdFtqXS0+Z2V0TmFtZSgpOworICAgICAgaWYgKCsraiA8IE0pIEl0aW5TdHJpbmcgKz0gIiB8ICI7CisgICAgfQorICAgIAorICAgIGludCBUaW1lSW5jID0gU3RhZ2UtPmdldFZhbHVlQXNJbnQoIlRpbWVJbmMiKTsKKyAgICBJdGluU3RyaW5nICs9ICIsICIgKyBpdG9zdHIoVGltZUluYyk7CisKKyAgICBpbnQgS2luZCA9IFN0YWdlLT5nZXRWYWx1ZUFzSW50KCJLaW5kIik7CisgICAgSXRpblN0cmluZyArPSAiLCAobGx2bTo6SW5zdHJTdGFnZTo6UmVzZXJ2YXRpb25LaW5kcykiICsgaXRvc3RyKEtpbmQpOworCisgICAgLy8gQ2xvc2Ugb2ZmIHN0YWdlCisgICAgSXRpblN0cmluZyArPSAiIH0iOworICAgIGlmICgrK2kgPCBOKSBJdGluU3RyaW5nICs9ICIsICI7CisgIH0KK30KKworLy8KKy8vIEZvcm1JdGluZXJhcnlPcGVyYW5kQ3ljbGVTdHJpbmcgLSBDb21wb3NlIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlCisvLyBvcGVyYW5kIGN5Y2xlIGluaXRpYWxpemF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGl0aW5lcmFyeS4gIE4gaXMgdGhlCisvLyBudW1iZXIgb2Ygb3BlcmFuZHMgdGhhdCBoYXMgY3ljbGVzIHNwZWNpZmllZC4KKy8vCit2b2lkIFN1YnRhcmdldEVtaXR0ZXI6OkZvcm1JdGluZXJhcnlPcGVyYW5kQ3ljbGVTdHJpbmcoUmVjb3JkICpJdGluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmSXRpblN0cmluZywgdW5zaWduZWQgJk5PcGVyYW5kQ3ljbGVzKSB7CisgIC8vIEdldCBvcGVyYW5kIGN5Y2xlIGxpc3QKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJk9wZXJhbmRDeWNsZUxpc3QgPQorICAgIEl0aW5EYXRhLT5nZXRWYWx1ZUFzTGlzdE9mSW50cygiT3BlcmFuZEN5Y2xlcyIpOworCisgIC8vIEZvciBlYWNoIG9wZXJhbmQgY3ljbGUKKyAgdW5zaWduZWQgTiA9IE5PcGVyYW5kQ3ljbGVzID0gT3BlcmFuZEN5Y2xlTGlzdC5zaXplKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOOykgeworICAgIC8vIE5leHQgb3BlcmFuZCBjeWNsZQorICAgIGNvbnN0IGludCBPQ3ljbGUgPSBPcGVyYW5kQ3ljbGVMaXN0W2ldOworICAKKyAgICBJdGluU3RyaW5nICs9ICIgICIgKyBpdG9zdHIoT0N5Y2xlKTsKKyAgICBpZiAoKytpIDwgTikgSXRpblN0cmluZyArPSAiLCAiOworICB9Cit9CisKKy8vCisvLyBFbWl0U3RhZ2VBbmRPcGVyYW5kQ3ljbGVEYXRhIC0gR2VuZXJhdGUgdW5pcXVlIGl0aW5lcmFyeSBzdGFnZXMgYW5kCisvLyBvcGVyYW5kIGN5Y2xlIHRhYmxlcy4gIFJlY29yZCBpdGluZXJhcmllcyBmb3IgcHJvY2Vzc29ycy4KKy8vCit2b2lkIFN1YnRhcmdldEVtaXR0ZXI6OkVtaXRTdGFnZUFuZE9wZXJhbmRDeWNsZURhdGEocmF3X29zdHJlYW0gJk9TLAorICAgICAgIHVuc2lnbmVkIE5JdGluQ2xhc3NlcywKKyAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdW5zaWduZWQ+ICZJdGluQ2xhc3Nlc01hcCwgCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8SW5zdHJJdGluZXJhcnk+ID4gJlByb2NMaXN0KSB7CisgIC8vIEdhdGhlciBwcm9jZXNzb3IgaXRlcmFyaWVzCisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFByb2NJdGluTGlzdCA9CisgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJQcm9jZXNzb3JJdGluZXJhcmllcyIpOworICAKKyAgLy8gSWYganVzdCBubyBpdGluZXJhcnkgdGhlbiBkb24ndCBib3RoZXIKKyAgaWYgKFByb2NJdGluTGlzdC5zaXplKCkgPCAyKSByZXR1cm47CisKKyAgLy8gRW1pdCBmdW5jdGlvbmFsIHVuaXRzIGZvciBhbGwgdGhlIGl0aW5lcmFyaWVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBOID0gUHJvY0l0aW5MaXN0LnNpemUoKTsgaSA8IE47ICsraSkgeworICAgIC8vIE5leHQgcmVjb3JkCisgICAgUmVjb3JkICpQcm9jID0gUHJvY0l0aW5MaXN0W2ldOworCisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gRlVzID0gUHJvYy0+Z2V0VmFsdWVBc0xpc3RPZkRlZnMoIkZVIik7CisgICAgaWYgKEZVcy5lbXB0eSgpKQorICAgICAgY29udGludWU7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSA9IFByb2MtPmdldE5hbWUoKTsKKyAgICBPUyA8PCAiXG4vLyBGdW5jdGlvbmFsIHVuaXRzIGZvciBpdGluZXJhcmllcyBcIiIgPDwgTmFtZSA8PCAiXCJcbiIKKyAgICAgICA8PCAibmFtZXNwYWNlICIgPDwgTmFtZSA8PCAiRlUge1xuIjsKKworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIEZVTiA9IEZVcy5zaXplKCk7IGogPCBGVU47ICsraikKKyAgICAgIE9TIDw8ICIgIGNvbnN0IHVuc2lnbmVkICIgPDwgRlVzW2pdLT5nZXROYW1lKCkKKyAgICAgICAgIDw8ICIgPSAxIDw8ICIgPDwgaiA8PCAiO1xuIjsKKworICAgIE9TIDw8ICJ9XG4iOworICB9CisKKyAgLy8gQmVnaW4gc3RhZ2VzIHRhYmxlCisgIHN0ZDo6c3RyaW5nIFN0YWdlVGFibGUgPSAiXG5zdGF0aWMgY29uc3QgbGx2bTo6SW5zdHJTdGFnZSBTdGFnZXNbXSA9IHtcbiI7CisgIFN0YWdlVGFibGUgKz0gIiAgeyAwLCAwLCAwLCBsbHZtOjpJbnN0clN0YWdlOjpSZXF1aXJlZCB9LCAvLyBObyBpdGluZXJhcnlcbiI7CisgICAgICAgIAorICAvLyBCZWdpbiBvcGVyYW5kIGN5Y2xlIHRhYmxlCisgIHN0ZDo6c3RyaW5nIE9wZXJhbmRDeWNsZVRhYmxlID0gInN0YXRpYyBjb25zdCB1bnNpZ25lZCBPcGVyYW5kQ3ljbGVzW10gPSB7XG4iOworICBPcGVyYW5kQ3ljbGVUYWJsZSArPSAiICAwLCAvLyBObyBpdGluZXJhcnlcbiI7CisgICAgICAgIAorICB1bnNpZ25lZCBTdGFnZUNvdW50ID0gMSwgT3BlcmFuZEN5Y2xlQ291bnQgPSAxOworICB1bnNpZ25lZCBJdGluU3RhZ2VFbnVtID0gMSwgSXRpbk9wZXJhbmRDeWNsZUVudW0gPSAxOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdW5zaWduZWQ+IEl0aW5TdGFnZU1hcCwgSXRpbk9wZXJhbmRDeWNsZU1hcDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgTiA9IFByb2NJdGluTGlzdC5zaXplKCk7IGkgPCBOOyBpKyspIHsKKyAgICAvLyBOZXh0IHJlY29yZAorICAgIFJlY29yZCAqUHJvYyA9IFByb2NJdGluTGlzdFtpXTsKKyAgICAKKyAgICAvLyBHZXQgcHJvY2Vzc29yIGl0aW5lcmFyeSBuYW1lCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUgPSBQcm9jLT5nZXROYW1lKCk7CisgICAgCisgICAgLy8gU2tpcCBkZWZhdWx0CisgICAgaWYgKE5hbWUgPT0gIk5vSXRpbmVyYXJpZXMiKSBjb250aW51ZTsKKyAgICAKKyAgICAvLyBDcmVhdGUgYW5kIGV4cGFuZCBwcm9jZXNzb3IgaXRpbmVyYXJ5IHRvIGNvdmVyIGFsbCBpdGluZXJhcnkgY2xhc3NlcworICAgIHN0ZDo6dmVjdG9yPEluc3RySXRpbmVyYXJ5PiBJdGluTGlzdDsKKyAgICBJdGluTGlzdC5yZXNpemUoTkl0aW5DbGFzc2VzKTsKKyAgICAKKyAgICAvLyBHZXQgaXRpbmVyYXJ5IGRhdGEgbGlzdAorICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEl0aW5EYXRhTGlzdCA9IFByb2MtPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJJSUQiKTsKKyAgICAKKyAgICAvLyBGb3IgZWFjaCBpdGluZXJhcnkgZGF0YQorICAgIGZvciAodW5zaWduZWQgaiA9IDAsIE0gPSBJdGluRGF0YUxpc3Quc2l6ZSgpOyBqIDwgTTsgaisrKSB7CisgICAgICAvLyBOZXh0IGl0aW5lcmFyeSBkYXRhCisgICAgICBSZWNvcmQgKkl0aW5EYXRhID0gSXRpbkRhdGFMaXN0W2pdOworICAgICAgCisgICAgICAvLyBHZXQgc3RyaW5nIGFuZCBzdGFnZSBjb3VudAorICAgICAgc3RkOjpzdHJpbmcgSXRpblN0YWdlU3RyaW5nOworICAgICAgdW5zaWduZWQgTlN0YWdlczsKKyAgICAgIEZvcm1JdGluZXJhcnlTdGFnZVN0cmluZyhOYW1lLCBJdGluRGF0YSwgSXRpblN0YWdlU3RyaW5nLCBOU3RhZ2VzKTsKKworICAgICAgLy8gR2V0IHN0cmluZyBhbmQgb3BlcmFuZCBjeWNsZSBjb3VudAorICAgICAgc3RkOjpzdHJpbmcgSXRpbk9wZXJhbmRDeWNsZVN0cmluZzsKKyAgICAgIHVuc2lnbmVkIE5PcGVyYW5kQ3ljbGVzOworICAgICAgRm9ybUl0aW5lcmFyeU9wZXJhbmRDeWNsZVN0cmluZyhJdGluRGF0YSwgSXRpbk9wZXJhbmRDeWNsZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9wZXJhbmRDeWNsZXMpOworCisgICAgICAvLyBDaGVjayB0byBzZWUgaWYgc3RhZ2UgYWxyZWFkeSBleGlzdHMgYW5kIGNyZWF0ZSBpZiBpdCBkb2Vzbid0CisgICAgICB1bnNpZ25lZCBGaW5kU3RhZ2UgPSAwOworICAgICAgaWYgKE5TdGFnZXMgPiAwKSB7CisgICAgICAgIEZpbmRTdGFnZSA9IEl0aW5TdGFnZU1hcFtJdGluU3RhZ2VTdHJpbmddOworICAgICAgICBpZiAoRmluZFN0YWdlID09IDApIHsKKyAgICAgICAgICAvLyBFbWl0IGFzIHsgY3ljbGVzLCB1MSB8IHUyIHwgLi4uIHwgdW4sIHRpbWVpbmMgfSwgLy8gaW5kZXgKKyAgICAgICAgICBTdGFnZVRhYmxlICs9IEl0aW5TdGFnZVN0cmluZyArICIsIC8vICIgKyBpdG9zdHIoSXRpblN0YWdlRW51bSkgKyAiXG4iOworICAgICAgICAgIC8vIFJlY29yZCBJdGluIGNsYXNzIG51bWJlci4KKyAgICAgICAgICBJdGluU3RhZ2VNYXBbSXRpblN0YWdlU3RyaW5nXSA9IEZpbmRTdGFnZSA9IFN0YWdlQ291bnQ7CisgICAgICAgICAgU3RhZ2VDb3VudCArPSBOU3RhZ2VzOworICAgICAgICAgIEl0aW5TdGFnZUVudW0rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvLyBDaGVjayB0byBzZWUgaWYgb3BlcmFuZCBjeWNsZSBhbHJlYWR5IGV4aXN0cyBhbmQgY3JlYXRlIGlmIGl0IGRvZXNuJ3QKKyAgICAgIHVuc2lnbmVkIEZpbmRPcGVyYW5kQ3ljbGUgPSAwOworICAgICAgaWYgKE5PcGVyYW5kQ3ljbGVzID4gMCkgeworICAgICAgICBGaW5kT3BlcmFuZEN5Y2xlID0gSXRpbk9wZXJhbmRDeWNsZU1hcFtJdGluT3BlcmFuZEN5Y2xlU3RyaW5nXTsKKyAgICAgICAgaWYgKEZpbmRPcGVyYW5kQ3ljbGUgPT0gMCkgeworICAgICAgICAgIC8vIEVtaXQgYXMgIGN5Y2xlLCAvLyBpbmRleAorICAgICAgICAgIE9wZXJhbmRDeWNsZVRhYmxlICs9IEl0aW5PcGVyYW5kQ3ljbGVTdHJpbmcgKyAiLCAvLyAiICsgCisgICAgICAgICAgICBpdG9zdHIoSXRpbk9wZXJhbmRDeWNsZUVudW0pICsgIlxuIjsKKyAgICAgICAgICAvLyBSZWNvcmQgSXRpbiBjbGFzcyBudW1iZXIuCisgICAgICAgICAgSXRpbk9wZXJhbmRDeWNsZU1hcFtJdGluT3BlcmFuZEN5Y2xlU3RyaW5nXSA9IAorICAgICAgICAgICAgRmluZE9wZXJhbmRDeWNsZSA9IE9wZXJhbmRDeWNsZUNvdW50OworICAgICAgICAgIE9wZXJhbmRDeWNsZUNvdW50ICs9IE5PcGVyYW5kQ3ljbGVzOworICAgICAgICAgIEl0aW5PcGVyYW5kQ3ljbGVFbnVtKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gU2V0IHVwIGl0aW5lcmFyeSBhcyBsb2NhdGlvbiBhbmQgbG9jYXRpb24gKyBzdGFnZSBjb3VudAorICAgICAgSW5zdHJJdGluZXJhcnkgSW50aW5lcmFyeSA9IHsgRmluZFN0YWdlLCBGaW5kU3RhZ2UgKyBOU3RhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZE9wZXJhbmRDeWNsZSwgRmluZE9wZXJhbmRDeWNsZSArIE5PcGVyYW5kQ3ljbGVzfTsKKworICAgICAgLy8gTG9jYXRlIHdoZXJlIHRvIGluamVjdCBpbnRvIHByb2Nlc3NvciBpdGluZXJhcnkgdGFibGUKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lID0gSXRpbkRhdGEtPmdldFZhbHVlQXNEZWYoIlRoZUNsYXNzIiktPmdldE5hbWUoKTsKKyAgICAgIHVuc2lnbmVkIEZpbmQgPSBJdGluQ2xhc3Nlc01hcFtOYW1lXTsKKyAgICAgIAorICAgICAgLy8gSW5qZWN0IC0gZW1wdHkgc2xvdHMgd2lsbCBiZSAwLCAwCisgICAgICBJdGluTGlzdFtGaW5kXSA9IEludGluZXJhcnk7CisgICAgfQorICAgIAorICAgIC8vIEFkZCBwcm9jZXNzIGl0aW5lcmFyeSB0byBsaXN0CisgICAgUHJvY0xpc3QucHVzaF9iYWNrKEl0aW5MaXN0KTsKKyAgfQorICAKKyAgLy8gQ2xvc2luZyBzdGFnZQorICBTdGFnZVRhYmxlICs9ICIgIHsgMCwgMCwgMCwgbGx2bTo6SW5zdHJTdGFnZTo6UmVxdWlyZWQgfSAvLyBFbmQgaXRpbmVyYXJ5XG4iOworICBTdGFnZVRhYmxlICs9ICJ9O1xuIjsKKworICAvLyBDbG9zaW5nIG9wZXJhbmQgY3ljbGVzCisgIE9wZXJhbmRDeWNsZVRhYmxlICs9ICIgIDAgLy8gRW5kIGl0aW5lcmFyeVxuIjsKKyAgT3BlcmFuZEN5Y2xlVGFibGUgKz0gIn07XG4iOworCisgIC8vIEVtaXQgdGFibGVzLgorICBPUyA8PCBTdGFnZVRhYmxlOworICBPUyA8PCBPcGVyYW5kQ3ljbGVUYWJsZTsKKyAgCisgIC8vIEVtaXQgc2l6ZSBvZiB0YWJsZXMKKyAgT1M8PCJcbmVudW0ge1xuIjsKKyAgT1M8PCIgIFN0YWdlc1NpemUgPSBzaXplb2YoU3RhZ2VzKS9zaXplb2YobGx2bTo6SW5zdHJTdGFnZSksXG4iOworICBPUzw8IiAgT3BlcmFuZEN5Y2xlc1NpemUgPSBzaXplb2YoT3BlcmFuZEN5Y2xlcykvc2l6ZW9mKHVuc2lnbmVkKVxuIjsKKyAgT1M8PCJ9O1xuIjsKK30KKworLy8KKy8vIEVtaXRQcm9jZXNzb3JEYXRhIC0gR2VuZXJhdGUgZGF0YSBmb3IgcHJvY2Vzc29yIGl0aW5lcmFyaWVzLgorLy8KK3ZvaWQgU3VidGFyZ2V0RW1pdHRlcjo6RW1pdFByb2Nlc3NvckRhdGEocmF3X29zdHJlYW0gJk9TLAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8SW5zdHJJdGluZXJhcnk+ID4gJlByb2NMaXN0KSB7CisgIC8vIEdldCBhbiBpdGVyYXRvciBmb3IgcHJvY2Vzc29yIGl0aW5lcmFyeSBzdGFnZXMKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8SW5zdHJJdGluZXJhcnk+ID46Oml0ZXJhdG9yCisgICAgICBQcm9jTGlzdEl0ZXIgPSBQcm9jTGlzdC5iZWdpbigpOworICAKKyAgLy8gRm9yIGVhY2ggcHJvY2Vzc29yIGl0aW5lcmFyeQorICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBJdGlucyA9CisgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJQcm9jZXNzb3JJdGluZXJhcmllcyIpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBOID0gSXRpbnMuc2l6ZSgpOyBpIDwgTjsgaSsrKSB7CisgICAgLy8gTmV4dCByZWNvcmQKKyAgICBSZWNvcmQgKkl0aW4gPSBJdGluc1tpXTsKKworICAgIC8vIEdldCBwcm9jZXNzb3IgaXRpbmVyYXJ5IG5hbWUKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSA9IEl0aW4tPmdldE5hbWUoKTsKKyAgICAKKyAgICAvLyBTa2lwIGRlZmF1bHQKKyAgICBpZiAoTmFtZSA9PSAiTm9JdGluZXJhcmllcyIpIGNvbnRpbnVlOworCisgICAgLy8gQmVnaW4gcHJvY2Vzc29yIGl0aW5lcmFyeSB0YWJsZQorICAgIE9TIDw8ICJcbiI7CisgICAgT1MgPDwgInN0YXRpYyBjb25zdCBsbHZtOjpJbnN0ckl0aW5lcmFyeSAiIDw8IE5hbWUgPDwgIltdID0ge1xuIjsKKyAgICAKKyAgICAvLyBGb3IgZWFjaCBpdGluZXJhcnkgY2xhc3MKKyAgICBzdGQ6OnZlY3RvcjxJbnN0ckl0aW5lcmFyeT4gJkl0aW5MaXN0ID0gKlByb2NMaXN0SXRlcisrOworICAgIGZvciAodW5zaWduZWQgaiA9IDAsIE0gPSBJdGluTGlzdC5zaXplKCk7IGogPCBNOyArK2opIHsKKyAgICAgIEluc3RySXRpbmVyYXJ5ICZJbnRpbmVyYXJ5ID0gSXRpbkxpc3Rbal07CisgICAgICAKKyAgICAgIC8vIEVtaXQgaW4gdGhlIGZvcm0gb2YgCisgICAgICAvLyB7IGZpcnN0U3RhZ2UsIGxhc3RTdGFnZSwgZmlyc3RDeWNsZSwgbGFzdEN5Y2xlIH0gLy8gaW5kZXgKKyAgICAgIGlmIChJbnRpbmVyYXJ5LkZpcnN0U3RhZ2UgPT0gMCkgeworICAgICAgICBPUyA8PCAiICB7IDAsIDAsIDAsIDAgfSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBPUyA8PCAiICB7ICIgPDwgSW50aW5lcmFyeS5GaXJzdFN0YWdlIDw8ICIsICIgPDwgCisgICAgICAgICAgSW50aW5lcmFyeS5MYXN0U3RhZ2UgPDwgIiwgIiA8PCAKKyAgICAgICAgICBJbnRpbmVyYXJ5LkZpcnN0T3BlcmFuZEN5Y2xlIDw8ICIsICIgPDwgCisgICAgICAgICAgSW50aW5lcmFyeS5MYXN0T3BlcmFuZEN5Y2xlIDw8ICIgfSI7CisgICAgICB9CisgICAgICAKKyAgICAgIE9TIDw8ICIsIC8vICIgPDwgaiA8PCAiXG4iOworICAgIH0KKyAgICAKKyAgICAvLyBFbmQgcHJvY2Vzc29yIGl0aW5lcmFyeSB0YWJsZQorICAgIE9TIDw8ICIgIHsgfjBVLCB+MFUsIH4wVSwgfjBVIH0gLy8gZW5kIG1hcmtlclxuIjsKKyAgICBPUyA8PCAifTtcbiI7CisgIH0KK30KKworLy8KKy8vIEVtaXRQcm9jZXNzb3JMb29rdXAgLSBnZW5lcmF0ZSBjcHUgbmFtZSB0byBpdGluZXJhcnkgbG9va3VwIHRhYmxlLgorLy8KK3ZvaWQgU3VidGFyZ2V0RW1pdHRlcjo6RW1pdFByb2Nlc3Nvckxvb2t1cChyYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gR2F0aGVyIGFuZCBzb3J0IHByb2Nlc3NvciBpbmZvcm1hdGlvbgorICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBQcm9jZXNzb3JMaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIlByb2Nlc3NvciIpOworICBzdGQ6OnNvcnQoUHJvY2Vzc29yTGlzdC5iZWdpbigpLCBQcm9jZXNzb3JMaXN0LmVuZCgpLCBMZXNzUmVjb3JkRmllbGROYW1lKCkpOworCisgIC8vIEJlZ2luIHByb2Nlc3NvciB0YWJsZQorICBPUyA8PCAiXG4iOworICBPUyA8PCAiLy8gU29ydGVkIChieSBrZXkpIGFycmF5IG9mIGl0aW5lcmFyaWVzIGZvciBDUFUgc3VidHlwZS5cbiIKKyAgICAgPDwgInN0YXRpYyBjb25zdCBsbHZtOjpTdWJ0YXJnZXRJbmZvS1YgUHJvY0l0aW5LVltdID0ge1xuIjsKKyAgICAgCisgIC8vIEZvciBlYWNoIHByb2Nlc3NvcgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBOID0gUHJvY2Vzc29yTGlzdC5zaXplKCk7IGkgPCBOOykgeworICAgIC8vIE5leHQgcHJvY2Vzc29yCisgICAgUmVjb3JkICpQcm9jZXNzb3IgPSBQcm9jZXNzb3JMaXN0W2ldOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUgPSBQcm9jZXNzb3ItPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmUHJvY0l0aW4gPQorICAgICAgUHJvY2Vzc29yLT5nZXRWYWx1ZUFzRGVmKCJQcm9jSXRpbiIpLT5nZXROYW1lKCk7CisgICAgCisgICAgLy8gRW1pdCBhcyB7ICJjcHUiLCBwcm9jaW5pdCB9LAorICAgIE9TIDw8ICIgIHsgIgorICAgICAgIDw8ICJcIiIgPDwgTmFtZSA8PCAiXCIsICIKKyAgICAgICA8PCAiKHZvaWQgKikmIiA8PCBQcm9jSXRpbjsKKyAgICAgICAgCisgICAgT1MgPDwgIiB9IjsKKyAgICAKKyAgICAvLyBEZXBlbmRpbmcgb24gJydpZiBtb3JlIGluIHRoZSBsaXN0JycgZW1pdCBjb21tYQorICAgIGlmICgrK2kgPCBOKSBPUyA8PCAiLCI7CisgICAgCisgICAgT1MgPDwgIlxuIjsKKyAgfQorICAKKyAgLy8gRW5kIHByb2Nlc3NvciB0YWJsZQorICBPUyA8PCAifTtcbiI7CisKKyAgLy8gRW1pdCBzaXplIG9mIHRhYmxlCisgIE9TPDwiXG5lbnVtIHtcbiI7CisgIE9TPDwiICBQcm9jSXRpbktWU2l6ZSA9IHNpemVvZihQcm9jSXRpbktWKS8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemVvZihsbHZtOjpTdWJ0YXJnZXRJbmZvS1YpXG4iOworICBPUzw8In07XG4iOworfQorCisvLworLy8gRW1pdERhdGEgLSBFbWl0cyBhbGwgc3RhZ2VzIGFuZCBpdGluZXJpZXMsIGZvbGRpbmcgY29tbW9uIHBhdHRlcm5zLgorLy8KK3ZvaWQgU3VidGFyZ2V0RW1pdHRlcjo6RW1pdERhdGEocmF3X29zdHJlYW0gJk9TKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB1bnNpZ25lZD4gSXRpbkNsYXNzZXNNYXA7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEluc3RySXRpbmVyYXJ5PiA+IFByb2NMaXN0OworICAKKyAgLy8gRW51bWVyYXRlIGFsbCB0aGUgaXRpbmVyYXJ5IGNsYXNzZXMKKyAgdW5zaWduZWQgTkl0aW5DbGFzc2VzID0gQ29sbGVjdEFsbEl0aW5DbGFzc2VzKE9TLCBJdGluQ2xhc3Nlc01hcCk7CisgIC8vIE1ha2Ugc3VyZSB0aGUgcmVzdCBpcyB3b3J0aCB0aGUgZWZmb3J0CisgIEhhc0l0aW5lcmFyaWVzID0gTkl0aW5DbGFzc2VzICE9IDE7ICAgLy8gSWdub3JlIE5vSXRpbmVyYXJ5LgorICAKKyAgaWYgKEhhc0l0aW5lcmFyaWVzKSB7CisgICAgLy8gRW1pdCB0aGUgc3RhZ2UgZGF0YQorICAgIEVtaXRTdGFnZUFuZE9wZXJhbmRDeWNsZURhdGEoT1MsIE5JdGluQ2xhc3NlcywgSXRpbkNsYXNzZXNNYXAsIFByb2NMaXN0KTsKKyAgICAvLyBFbWl0IHRoZSBwcm9jZXNzb3IgaXRpbmVyYXJ5IGRhdGEKKyAgICBFbWl0UHJvY2Vzc29yRGF0YShPUywgUHJvY0xpc3QpOworICAgIC8vIEVtaXQgdGhlIHByb2Nlc3NvciBsb29rdXAgZGF0YQorICAgIEVtaXRQcm9jZXNzb3JMb29rdXAoT1MpOworICB9Cit9CisKKy8vCisvLyBQYXJzZUZlYXR1cmVzRnVuY3Rpb24gLSBQcm9kdWNlcyBhIHN1YnRhcmdldCBzcGVjaWZpYyBmdW5jdGlvbiBmb3IgcGFyc2luZworLy8gdGhlIHN1YnRhcmdldCBmZWF0dXJlcyBzdHJpbmcuCisvLwordm9pZCBTdWJ0YXJnZXRFbWl0dGVyOjpQYXJzZUZlYXR1cmVzRnVuY3Rpb24ocmF3X29zdHJlYW0gJk9TKSB7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEZlYXR1cmVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIlN1YnRhcmdldEZlYXR1cmUiKTsKKyAgc3RkOjpzb3J0KEZlYXR1cmVzLmJlZ2luKCksIEZlYXR1cmVzLmVuZCgpLCBMZXNzUmVjb3JkKCkpOworCisgIE9TIDw8ICIvLyBQYXJzZVN1YnRhcmdldEZlYXR1cmVzIC0gUGFyc2VzIGZlYXR1cmVzIHN0cmluZyBzZXR0aW5nIHNwZWNpZmllZFxuIiAKKyAgICAgPDwgIi8vIHN1YnRhcmdldCBvcHRpb25zLlxuIiAKKyAgICAgPDwgInN0ZDo6c3RyaW5nIGxsdm06OiI7CisgIE9TIDw8IFRhcmdldDsKKyAgT1MgPDwgIlN1YnRhcmdldDo6UGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyhjb25zdCBzdGQ6OnN0cmluZyAmRlMsXG4iCisgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkNQVSkge1xuIgorICAgICA8PCAiICBERUJVRyhkYmdzKCkgPDwgXCJcXG5GZWF0dXJlczpcIiA8PCBGUyk7XG4iCisgICAgIDw8ICIgIERFQlVHKGRiZ3MoKSA8PCBcIlxcbkNQVTpcIiA8PCBDUFUpO1xuIgorICAgICA8PCAiICBTdWJ0YXJnZXRGZWF0dXJlcyBGZWF0dXJlcyhGUyk7XG4iCisgICAgIDw8ICIgIEZlYXR1cmVzLnNldENQVUlmTm9uZShDUFUpO1xuIgorICAgICA8PCAiICB1aW50MzJfdCBCaXRzID0gIEZlYXR1cmVzLmdldEJpdHMoU3ViVHlwZUtWLCBTdWJUeXBlS1ZTaXplLFxuIgorICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUtWLCBGZWF0dXJlS1ZTaXplKTtcbiI7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEZlYXR1cmVzLnNpemUoKTsgaSsrKSB7CisgICAgLy8gTmV4dCByZWNvcmQKKyAgICBSZWNvcmQgKlIgPSBGZWF0dXJlc1tpXTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmSW5zdGFuY2UgPSBSLT5nZXROYW1lKCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlZhbHVlID0gUi0+Z2V0VmFsdWVBc1N0cmluZygiVmFsdWUiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmQXR0cmlidXRlID0gUi0+Z2V0VmFsdWVBc1N0cmluZygiQXR0cmlidXRlIik7CisKKyAgICBpZiAoVmFsdWU9PSJ0cnVlIiB8fCBWYWx1ZT09ImZhbHNlIikKKyAgICAgIE9TIDw8ICIgIGlmICgoQml0cyAmICIgPDwgSW5zdGFuY2UgPDwgIikgIT0gMCkgIgorICAgICAgICAgPDwgQXR0cmlidXRlIDw8ICIgPSAiIDw8IFZhbHVlIDw8ICI7XG4iOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICIgIGlmICgoQml0cyAmICIgPDwgSW5zdGFuY2UgPDwgIikgIT0gMCAmJiAiIDw8IEF0dHJpYnV0ZSA8PCAKKyAgICAgICAgICAgICIgPCAiIDw8IFZhbHVlIDw8ICIpICIgPDwgQXR0cmlidXRlIDw8ICIgPSAiIDw8IFZhbHVlIDw8ICI7XG4iOworICB9CisKKyAgaWYgKEhhc0l0aW5lcmFyaWVzKSB7CisgICAgT1MgPDwgIlxuIgorICAgICAgIDw8ICIgIEluc3RySXRpbmVyYXJ5ICpJdGluZXJhcnkgPSAoSW5zdHJJdGluZXJhcnkgKikiCisgICAgICAgPDwgICAgICAgICAgICAgICJGZWF0dXJlcy5nZXRJbmZvKFByb2NJdGluS1YsIFByb2NJdGluS1ZTaXplKTtcbiIKKyAgICAgICA8PCAiICBJbnN0ckl0aW5zID0gSW5zdHJJdGluZXJhcnlEYXRhKFN0YWdlcywgT3BlcmFuZEN5Y2xlcywgSXRpbmVyYXJ5KTtcbiI7CisgIH0KKworICBPUyA8PCAiICByZXR1cm4gRmVhdHVyZXMuZ2V0Q1BVKCk7XG4iCisgICAgIDw8ICJ9XG4iOworfQorCisvLworLy8gU3VidGFyZ2V0RW1pdHRlcjo6cnVuIC0gTWFpbiBzdWJ0YXJnZXQgZW51bWVyYXRpb24gZW1pdHRlci4KKy8vCit2b2lkIFN1YnRhcmdldEVtaXR0ZXI6OnJ1bihyYXdfb3N0cmVhbSAmT1MpIHsKKyAgVGFyZ2V0ID0gQ29kZUdlblRhcmdldCgpLmdldE5hbWUoKTsKKworICBFbWl0U291cmNlRmlsZUhlYWRlcigiU3VidGFyZ2V0IEVudW1lcmF0aW9uIFNvdXJjZSBGcmFnbWVudCIsIE9TKTsKKworICBPUyA8PCAiI2luY2x1ZGUgXCJsbHZtL1N1cHBvcnQvRGVidWcuaFwiXG4iOworICBPUyA8PCAiI2luY2x1ZGUgXCJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaFwiXG4iOworICBPUyA8PCAiI2luY2x1ZGUgXCJsbHZtL1RhcmdldC9TdWJ0YXJnZXRGZWF0dXJlLmhcIlxuIjsKKyAgT1MgPDwgIiNpbmNsdWRlIFwibGx2bS9UYXJnZXQvVGFyZ2V0SW5zdHJJdGluZXJhcmllcy5oXCJcblxuIjsKKworLy8gIEVudW1lcmF0aW9uKE9TLCAiRnVuY1VuaXQiLCB0cnVlKTsKKy8vICBPUzw8IlxuIjsKKy8vICBFbnVtZXJhdGlvbihPUywgIkluc3RySXRpbkNsYXNzIiwgZmFsc2UpOworLy8gIE9TPDwiXG4iOworICBFbnVtZXJhdGlvbihPUywgIlN1YnRhcmdldEZlYXR1cmUiLCB0cnVlKTsKKyAgT1M8PCJcbiI7CisgIEZlYXR1cmVLZXlWYWx1ZXMoT1MpOworICBPUzw8IlxuIjsKKyAgQ1BVS2V5VmFsdWVzKE9TKTsKKyAgT1M8PCJcbiI7CisgIEVtaXREYXRhKE9TKTsKKyAgT1M8PCJcbiI7CisgIFBhcnNlRmVhdHVyZXNGdW5jdGlvbihPUyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9TdWJ0YXJnZXRFbWl0dGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9TdWJ0YXJnZXRFbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzYTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1N1YnRhcmdldEVtaXR0ZXIuaApAQCAtMCwwICsxLDY1IEBACisvLz09PS0gU3VidGFyZ2V0RW1pdHRlci5oIC0gR2VuZXJhdGUgc3VidGFyZ2V0IGVudW1lcmF0aW9ucyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgdGFibGVnZW4gYmFja2VuZCBlbWl0cyBzdWJ0YXJnZXQgZW51bWVyYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU1VCVEFSR0VUX0VNSVRURVJfSAorI2RlZmluZSBTVUJUQVJHRVRfRU1JVFRFUl9ICisKKyNpbmNsdWRlICJUYWJsZUdlbkJhY2tlbmQuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJbnN0ckl0aW5lcmFyaWVzLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTdWJ0YXJnZXRFbWl0dGVyIDogcHVibGljIFRhYmxlR2VuQmFja2VuZCB7CisgIAorICBSZWNvcmRLZWVwZXIgJlJlY29yZHM7CisgIHN0ZDo6c3RyaW5nIFRhcmdldDsKKyAgYm9vbCBIYXNJdGluZXJhcmllczsKKyAgCisgIHZvaWQgRW51bWVyYXRpb24ocmF3X29zdHJlYW0gJk9TLCBjb25zdCBjaGFyICpDbGFzc05hbWUsIGJvb2wgaXNCaXRzKTsKKyAgdm9pZCBGZWF0dXJlS2V5VmFsdWVzKHJhd19vc3RyZWFtICZPUyk7CisgIHZvaWQgQ1BVS2V5VmFsdWVzKHJhd19vc3RyZWFtICZPUyk7CisgIHVuc2lnbmVkIENvbGxlY3RBbGxJdGluQ2xhc3NlcyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHVuc2lnbmVkPiAmSXRpbkNsYXNzZXNNYXApOworICB2b2lkIEZvcm1JdGluZXJhcnlTdGFnZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZCAqSXRpbkRhdGEsIHN0ZDo6c3RyaW5nICZJdGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTlN0YWdlcyk7CisgIHZvaWQgRm9ybUl0aW5lcmFyeU9wZXJhbmRDeWNsZVN0cmluZyhSZWNvcmQgKkl0aW5EYXRhLCBzdGQ6OnN0cmluZyAmSXRpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOT3BlcmFuZEN5Y2xlcyk7CisgIHZvaWQgRW1pdFN0YWdlQW5kT3BlcmFuZEN5Y2xlRGF0YShyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIE5JdGluQ2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB1bnNpZ25lZD4gJkl0aW5DbGFzc2VzTWFwLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8SW5zdHJJdGluZXJhcnk+ID4gJlByb2NMaXN0KTsKKyAgdm9pZCBFbWl0UHJvY2Vzc29yRGF0YShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEluc3RySXRpbmVyYXJ5PiA+ICZQcm9jTGlzdCk7CisgIHZvaWQgRW1pdFByb2Nlc3Nvckxvb2t1cChyYXdfb3N0cmVhbSAmT1MpOworICB2b2lkIEVtaXREYXRhKHJhd19vc3RyZWFtICZPUyk7CisgIHZvaWQgUGFyc2VGZWF0dXJlc0Z1bmN0aW9uKHJhd19vc3RyZWFtICZPUyk7CisgIAorcHVibGljOgorICBTdWJ0YXJnZXRFbWl0dGVyKFJlY29yZEtlZXBlciAmUikgOiBSZWNvcmRzKFIpLCBIYXNJdGluZXJhcmllcyhmYWxzZSkge30KKworICAvLyBydW4gLSBPdXRwdXQgdGhlIHN1YnRhcmdldCBlbnVtZXJhdGlvbnMsIHJldHVybmluZyB0cnVlIG9uIGZhaWx1cmUuCisgIHZvaWQgcnVuKHJhd19vc3RyZWFtICZvKTsKKworfTsKKworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RHTGV4ZXIuY3BwIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vVEdMZXhlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3YmVjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RHTGV4ZXIuY3BwCkBAIC0wLDAgKzEsNDUwIEBACisvLz09PS0gVEdMZXhlci5jcHAgLSBMZXhlciBmb3IgVGFibGVHZW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEltcGxlbWVudCB0aGUgTGV4ZXIgZm9yIFRhYmxlR2VuLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJUR0xleGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjZXJybm8+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworVEdMZXhlcjo6VEdMZXhlcihTb3VyY2VNZ3IgJlNNKSA6IFNyY01ncihTTSkgeworICBDdXJCdWZmZXIgPSAwOworICBDdXJCdWYgPSBTcmNNZ3IuZ2V0TWVtb3J5QnVmZmVyKEN1ckJ1ZmZlcik7CisgIEN1clB0ciA9IEN1ckJ1Zi0+Z2V0QnVmZmVyU3RhcnQoKTsKKyAgVG9rU3RhcnQgPSAwOworfQorCitTTUxvYyBUR0xleGVyOjpnZXRMb2MoKSBjb25zdCB7CisgIHJldHVybiBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoVG9rU3RhcnQpOworfQorCisKKy8vLyBSZXR1cm5FcnJvciAtIFNldCB0aGUgZXJyb3IgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYXQgdGhlIHNwZWNpZmllZAorLy8vIGxvY2F0aW9uLiAgVGhpcyBpcyBkZWZpbmVkIHRvIGFsd2F5cyByZXR1cm4gdGd0b2s6OkVycm9yLgordGd0b2s6OlRva0tpbmQgVEdMZXhlcjo6UmV0dXJuRXJyb3IoY29uc3QgY2hhciAqTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTXNnKSB7CisgIFByaW50RXJyb3IoTG9jLCBNc2cpOworICByZXR1cm4gdGd0b2s6OkVycm9yOworfQorCisKK3ZvaWQgVEdMZXhlcjo6UHJpbnRFcnJvcihjb25zdCBjaGFyICpMb2MsIGNvbnN0IHN0ZDo6c3RyaW5nICZNc2cpIGNvbnN0IHsKKyAgU3JjTWdyLlByaW50TWVzc2FnZShTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoTG9jKSwgTXNnLCAiZXJyb3IiKTsKK30KKwordm9pZCBUR0xleGVyOjpQcmludEVycm9yKFNNTG9jIExvYywgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZykgY29uc3QgeworICBTcmNNZ3IuUHJpbnRNZXNzYWdlKExvYywgTXNnLCAiZXJyb3IiKTsKK30KKworCitpbnQgVEdMZXhlcjo6Z2V0TmV4dENoYXIoKSB7CisgIGNoYXIgQ3VyQ2hhciA9ICpDdXJQdHIrKzsKKyAgc3dpdGNoIChDdXJDaGFyKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKUN1ckNoYXI7CisgIGNhc2UgMDogeworICAgIC8vIEEgbnVsIGNoYXJhY3RlciBpbiB0aGUgc3RyZWFtIGlzIGVpdGhlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBvcgorICAgIC8vIGEgcmFuZG9tIG51bCBpbiB0aGUgZmlsZS4gIERpc2FtYmlndWF0ZSB0aGF0IGhlcmUuCisgICAgaWYgKEN1clB0ci0xICE9IEN1ckJ1Zi0+Z2V0QnVmZmVyRW5kKCkpCisgICAgICByZXR1cm4gMDsgIC8vIEp1c3Qgd2hpdGVzcGFjZS4KKyAgICAKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBlbmQgb2YgYW4gaW5jbHVkZWQgZmlsZSwgcG9wIHRoZSBwYXJlbnQgZmlsZSBvZmYgdGhlCisgICAgLy8gaW5jbHVkZSBzdGFjay4KKyAgICBTTUxvYyBQYXJlbnRJbmNsdWRlTG9jID0gU3JjTWdyLmdldFBhcmVudEluY2x1ZGVMb2MoQ3VyQnVmZmVyKTsKKyAgICBpZiAoUGFyZW50SW5jbHVkZUxvYyAhPSBTTUxvYygpKSB7CisgICAgICBDdXJCdWZmZXIgPSBTcmNNZ3IuRmluZEJ1ZmZlckNvbnRhaW5pbmdMb2MoUGFyZW50SW5jbHVkZUxvYyk7CisgICAgICBDdXJCdWYgPSBTcmNNZ3IuZ2V0TWVtb3J5QnVmZmVyKEN1ckJ1ZmZlcik7CisgICAgICBDdXJQdHIgPSBQYXJlbnRJbmNsdWRlTG9jLmdldFBvaW50ZXIoKTsKKyAgICAgIHJldHVybiBnZXROZXh0Q2hhcigpOworICAgIH0KKyAgICAKKyAgICAvLyBPdGhlcndpc2UsIHJldHVybiBlbmQgb2YgZmlsZS4KKyAgICAtLUN1clB0cjsgIC8vIEFub3RoZXIgY2FsbCB0byBsZXggd2lsbCByZXR1cm4gRU9GIGFnYWluLiAgCisgICAgcmV0dXJuIEVPRjsKKyAgfQorICBjYXNlICdcbic6CisgIGNhc2UgJ1xyJzoKKyAgICAvLyBIYW5kbGUgdGhlIG5ld2xpbmUgY2hhcmFjdGVyIGJ5IGlnbm9yaW5nIGl0IGFuZCBpbmNyZW1lbnRpbmcgdGhlIGxpbmUKKyAgICAvLyBjb3VudC4gIEhvd2V2ZXIsIGJlIGNhcmVmdWwgYWJvdXQgJ2RvcyBzdHlsZScgZmlsZXMgd2l0aCBcblxyIGluIHRoZW0uCisgICAgLy8gT25seSB0cmVhdCBhIFxuXHIgb3IgXHJcbiBhcyBhIHNpbmdsZSBsaW5lLgorICAgIGlmICgoKkN1clB0ciA9PSAnXG4nIHx8ICgqQ3VyUHRyID09ICdccicpKSAmJgorICAgICAgICAqQ3VyUHRyICE9IEN1ckNoYXIpCisgICAgICArK0N1clB0cjsgIC8vIEVhdCB0aGUgdHdvIGNoYXIgbmV3bGluZSBzZXF1ZW5jZS4KKyAgICByZXR1cm4gJ1xuJzsKKyAgfSAgCit9CisKK3RndG9rOjpUb2tLaW5kIFRHTGV4ZXI6OkxleFRva2VuKCkgeworICBUb2tTdGFydCA9IEN1clB0cjsKKyAgLy8gVGhpcyBhbHdheXMgY29uc3VtZXMgYXQgbGVhc3Qgb25lIGNoYXJhY3Rlci4KKyAgaW50IEN1ckNoYXIgPSBnZXROZXh0Q2hhcigpOworCisgIHN3aXRjaCAoQ3VyQ2hhcikgeworICBkZWZhdWx0OgorICAgIC8vIEhhbmRsZSBsZXR0ZXJzOiBbYS16QS1aX10KKyAgICBpZiAoaXNhbHBoYShDdXJDaGFyKSB8fCBDdXJDaGFyID09ICdfJyB8fCBDdXJDaGFyID09ICcjJykKKyAgICAgIHJldHVybiBMZXhJZGVudGlmaWVyKCk7CisgICAgICAKKyAgICAvLyBVbmtub3duIGNoYXJhY3RlciwgZW1pdCBhbiBlcnJvci4KKyAgICByZXR1cm4gUmV0dXJuRXJyb3IoVG9rU3RhcnQsICJVbmV4cGVjdGVkIGNoYXJhY3RlciIpOworICBjYXNlIEVPRjogcmV0dXJuIHRndG9rOjpFb2Y7CisgIGNhc2UgJzonOiByZXR1cm4gdGd0b2s6OmNvbG9uOworICBjYXNlICc7JzogcmV0dXJuIHRndG9rOjpzZW1pOworICBjYXNlICcuJzogcmV0dXJuIHRndG9rOjpwZXJpb2Q7CisgIGNhc2UgJywnOiByZXR1cm4gdGd0b2s6OmNvbW1hOworICBjYXNlICc8JzogcmV0dXJuIHRndG9rOjpsZXNzOworICBjYXNlICc+JzogcmV0dXJuIHRndG9rOjpncmVhdGVyOworICBjYXNlICddJzogcmV0dXJuIHRndG9rOjpyX3NxdWFyZTsKKyAgY2FzZSAneyc6IHJldHVybiB0Z3Rvazo6bF9icmFjZTsKKyAgY2FzZSAnfSc6IHJldHVybiB0Z3Rvazo6cl9icmFjZTsKKyAgY2FzZSAnKCc6IHJldHVybiB0Z3Rvazo6bF9wYXJlbjsKKyAgY2FzZSAnKSc6IHJldHVybiB0Z3Rvazo6cl9wYXJlbjsKKyAgY2FzZSAnPSc6IHJldHVybiB0Z3Rvazo6ZXF1YWw7CisgIGNhc2UgJz8nOiByZXR1cm4gdGd0b2s6OnF1ZXN0aW9uOworICAgICAgCisgIGNhc2UgMDoKKyAgY2FzZSAnICc6CisgIGNhc2UgJ1x0JzoKKyAgY2FzZSAnXG4nOgorICBjYXNlICdccic6CisgICAgLy8gSWdub3JlIHdoaXRlc3BhY2UuCisgICAgcmV0dXJuIExleFRva2VuKCk7CisgIGNhc2UgJy8nOgorICAgIC8vIElmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgLy8gY29tbWVudCwgc2tpcCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lIG9yCisgICAgLy8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICAgIGlmICgqQ3VyUHRyID09ICcvJykKKyAgICAgIFNraXBCQ1BMQ29tbWVudCgpOworICAgIGVsc2UgaWYgKCpDdXJQdHIgPT0gJyonKSB7CisgICAgICBpZiAoU2tpcENDb21tZW50KCkpCisgICAgICAgIHJldHVybiB0Z3Rvazo6RXJyb3I7CisgICAgfSBlbHNlIC8vIE90aGVyd2lzZSwgdGhpcyBpcyBhbiBlcnJvci4KKyAgICAgIHJldHVybiBSZXR1cm5FcnJvcihUb2tTdGFydCwgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIik7CisgICAgcmV0dXJuIExleFRva2VuKCk7CisgIGNhc2UgJy0nOiBjYXNlICcrJzoKKyAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6CisgIGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6ICAKKyAgICByZXR1cm4gTGV4TnVtYmVyKCk7CisgIGNhc2UgJyInOiByZXR1cm4gTGV4U3RyaW5nKCk7CisgIGNhc2UgJyQnOiByZXR1cm4gTGV4VmFyTmFtZSgpOworICBjYXNlICdbJzogcmV0dXJuIExleEJyYWNrZXQoKTsKKyAgY2FzZSAnISc6IHJldHVybiBMZXhFeGNsYWltKCk7CisgIH0KK30KKworLy8vIExleFN0cmluZyAtIExleCAiW14iXSoiCit0Z3Rvazo6VG9rS2luZCBUR0xleGVyOjpMZXhTdHJpbmcoKSB7CisgIGNvbnN0IGNoYXIgKlN0clN0YXJ0ID0gQ3VyUHRyOworICAKKyAgQ3VyU3RyVmFsID0gIiI7CisgIAorICB3aGlsZSAoKkN1clB0ciAhPSAnIicpIHsKKyAgICAvLyBJZiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCByZXBvcnQgYW4gZXJyb3IuCisgICAgaWYgKCpDdXJQdHIgPT0gMCAmJiBDdXJQdHIgPT0gQ3VyQnVmLT5nZXRCdWZmZXJFbmQoKSkKKyAgICAgIHJldHVybiBSZXR1cm5FcnJvcihTdHJTdGFydCwgIkVuZCBvZiBmaWxlIGluIHN0cmluZyBsaXRlcmFsIik7CisgICAgCisgICAgaWYgKCpDdXJQdHIgPT0gJ1xuJyB8fCAqQ3VyUHRyID09ICdccicpCisgICAgICByZXR1cm4gUmV0dXJuRXJyb3IoU3RyU3RhcnQsICJFbmQgb2YgbGluZSBpbiBzdHJpbmcgbGl0ZXJhbCIpOworICAgIAorICAgIGlmICgqQ3VyUHRyICE9ICdcXCcpIHsKKyAgICAgIEN1clN0clZhbCArPSAqQ3VyUHRyKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICArK0N1clB0cjsKKyAgICAKKyAgICBzd2l0Y2ggKCpDdXJQdHIpIHsKKyAgICBjYXNlICdcXCc6IGNhc2UgJ1wnJzogY2FzZSAnIic6CisgICAgICAvLyBUaGVzZSB0dXJuIGludG8gdGhlaXIgbGl0ZXJhbCBjaGFyYWN0ZXIuCisgICAgICBDdXJTdHJWYWwgKz0gKkN1clB0cisrOworICAgICAgYnJlYWs7CisgICAgY2FzZSAndCc6CisgICAgICBDdXJTdHJWYWwgKz0gJ1x0JzsKKyAgICAgICsrQ3VyUHRyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgICBDdXJTdHJWYWwgKz0gJ1xuJzsKKyAgICAgICsrQ3VyUHRyOworICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgJ1xuJzoKKyAgICBjYXNlICdccic6CisgICAgICByZXR1cm4gUmV0dXJuRXJyb3IoQ3VyUHRyLCAiZXNjYXBlZCBuZXdsaW5lcyBub3Qgc3VwcG9ydGVkIGluIHRibGdlbiIpOworCisgICAgLy8gSWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgcmVwb3J0IGFuIGVycm9yLgorICAgIGNhc2UgJ1wwJzoKKyAgICAgIGlmIChDdXJQdHIgPT0gQ3VyQnVmLT5nZXRCdWZmZXJFbmQoKSkKKyAgICAgICAgcmV0dXJuIFJldHVybkVycm9yKFN0clN0YXJ0LCAiRW5kIG9mIGZpbGUgaW4gc3RyaW5nIGxpdGVyYWwiKTsKKyAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gUmV0dXJuRXJyb3IoQ3VyUHRyLCAiaW52YWxpZCBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWwiKTsKKyAgICB9CisgIH0KKyAgCisgICsrQ3VyUHRyOworICByZXR1cm4gdGd0b2s6OlN0clZhbDsKK30KKwordGd0b2s6OlRva0tpbmQgVEdMZXhlcjo6TGV4VmFyTmFtZSgpIHsKKyAgaWYgKCFpc2FscGhhKEN1clB0clswXSkgJiYgQ3VyUHRyWzBdICE9ICdfJykKKyAgICByZXR1cm4gUmV0dXJuRXJyb3IoVG9rU3RhcnQsICJJbnZhbGlkIHZhcmlhYmxlIG5hbWUiKTsKKyAgCisgIC8vIE90aGVyd2lzZSwgd2UncmUgb2ssIGNvbnN1bWUgdGhlIHJlc3Qgb2YgdGhlIGNoYXJhY3RlcnMuCisgIGNvbnN0IGNoYXIgKlZhck5hbWVTdGFydCA9IEN1clB0cisrOworICAKKyAgd2hpbGUgKGlzYWxwaGEoKkN1clB0cikgfHwgaXNkaWdpdCgqQ3VyUHRyKSB8fCAqQ3VyUHRyID09ICdfJykKKyAgICArK0N1clB0cjsKKworICBDdXJTdHJWYWwuYXNzaWduKFZhck5hbWVTdGFydCwgQ3VyUHRyKTsKKyAgcmV0dXJuIHRndG9rOjpWYXJOYW1lOworfQorCisKK3RndG9rOjpUb2tLaW5kIFRHTGV4ZXI6OkxleElkZW50aWZpZXIoKSB7CisgIC8vIFRoZSBmaXJzdCBsZXR0ZXIgaXMgW2EtekEtWl9dLgorICBjb25zdCBjaGFyICpJZGVudFN0YXJ0ID0gVG9rU3RhcnQ7CisgIAorICAvLyBNYXRjaCB0aGUgcmVzdCBvZiB0aGUgaWRlbnRpZmllciByZWdleDogWzAtOWEtekEtWl9dKgorICB3aGlsZSAoaXNhbHBoYSgqQ3VyUHRyKSB8fCBpc2RpZ2l0KCpDdXJQdHIpIHx8ICpDdXJQdHIgPT0gJ18nCisgICAgICAgICB8fCAqQ3VyUHRyID09ICcjJykgeworICAgIC8vIElmIHRoaXMgY29udGFpbnMgYSAnIycsIG1ha2Ugc3VyZSBpdCdzIHZhbHVlCisgICAgaWYgKCpDdXJQdHIgPT0gJyMnKSB7CisgICAgICBpZiAoc3RybmNtcChDdXJQdHIsICIjTkFNRSMiLCA2KSAhPSAwKSB7CisgICAgICAgIHJldHVybiB0Z3Rvazo6RXJyb3I7CisgICAgICB9CisgICAgICBDdXJQdHIgKz0gNjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICArK0N1clB0cjsKKyAgICB9CisgIH0KKyAgCisgIAorICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpZGVudGlmaWVyIGlzIGEga2V5d29yZC4KKyAgdW5zaWduZWQgTGVuID0gQ3VyUHRyLUlkZW50U3RhcnQ7CisgIAorICBpZiAoTGVuID09IDMgJiYgIW1lbWNtcChJZGVudFN0YXJ0LCAiaW50IiwgMykpIHJldHVybiB0Z3Rvazo6SW50OworICBpZiAoTGVuID09IDMgJiYgIW1lbWNtcChJZGVudFN0YXJ0LCAiYml0IiwgMykpIHJldHVybiB0Z3Rvazo6Qml0OworICBpZiAoTGVuID09IDQgJiYgIW1lbWNtcChJZGVudFN0YXJ0LCAiYml0cyIsIDQpKSByZXR1cm4gdGd0b2s6OkJpdHM7CisgIGlmIChMZW4gPT0gNiAmJiAhbWVtY21wKElkZW50U3RhcnQsICJzdHJpbmciLCA2KSkgcmV0dXJuIHRndG9rOjpTdHJpbmc7CisgIGlmIChMZW4gPT0gNCAmJiAhbWVtY21wKElkZW50U3RhcnQsICJsaXN0IiwgNCkpIHJldHVybiB0Z3Rvazo6TGlzdDsKKyAgaWYgKExlbiA9PSA0ICYmICFtZW1jbXAoSWRlbnRTdGFydCwgImNvZGUiLCA0KSkgcmV0dXJuIHRndG9rOjpDb2RlOworICBpZiAoTGVuID09IDMgJiYgIW1lbWNtcChJZGVudFN0YXJ0LCAiZGFnIiwgMykpIHJldHVybiB0Z3Rvazo6RGFnOworICAKKyAgaWYgKExlbiA9PSA1ICYmICFtZW1jbXAoSWRlbnRTdGFydCwgImNsYXNzIiwgNSkpIHJldHVybiB0Z3Rvazo6Q2xhc3M7CisgIGlmIChMZW4gPT0gMyAmJiAhbWVtY21wKElkZW50U3RhcnQsICJkZWYiLCAzKSkgcmV0dXJuIHRndG9rOjpEZWY7CisgIGlmIChMZW4gPT0gNCAmJiAhbWVtY21wKElkZW50U3RhcnQsICJkZWZtIiwgNCkpIHJldHVybiB0Z3Rvazo6RGVmbTsKKyAgaWYgKExlbiA9PSAxMCAmJiAhbWVtY21wKElkZW50U3RhcnQsICJtdWx0aWNsYXNzIiwgMTApKQorICAgIHJldHVybiB0Z3Rvazo6TXVsdGlDbGFzczsKKyAgaWYgKExlbiA9PSA1ICYmICFtZW1jbXAoSWRlbnRTdGFydCwgImZpZWxkIiwgNSkpIHJldHVybiB0Z3Rvazo6RmllbGQ7CisgIGlmIChMZW4gPT0gMyAmJiAhbWVtY21wKElkZW50U3RhcnQsICJsZXQiLCAzKSkgcmV0dXJuIHRndG9rOjpMZXQ7CisgIGlmIChMZW4gPT0gMiAmJiAhbWVtY21wKElkZW50U3RhcnQsICJpbiIsIDIpKSByZXR1cm4gdGd0b2s6OkluOworICAKKyAgaWYgKExlbiA9PSA3ICYmICFtZW1jbXAoSWRlbnRTdGFydCwgImluY2x1ZGUiLCA3KSkgeworICAgIGlmIChMZXhJbmNsdWRlKCkpIHJldHVybiB0Z3Rvazo6RXJyb3I7CisgICAgcmV0dXJuIExleCgpOworICB9CisgICAgCisgIEN1clN0clZhbC5hc3NpZ24oSWRlbnRTdGFydCwgQ3VyUHRyKTsKKyAgcmV0dXJuIHRndG9rOjpJZDsKK30KKworLy8vIExleEluY2x1ZGUgLSBXZSBqdXN0IHJlYWQgdGhlICJpbmNsdWRlIiB0b2tlbi4gIEdldCB0aGUgc3RyaW5nIHRva2VuIHRoYXQKKy8vLyBjb21lcyBuZXh0IGFuZCBlbnRlciB0aGUgaW5jbHVkZS4KK2Jvb2wgVEdMZXhlcjo6TGV4SW5jbHVkZSgpIHsKKyAgLy8gVGhlIHRva2VuIGFmdGVyIHRoZSBpbmNsdWRlIG11c3QgYmUgYSBzdHJpbmcuCisgIHRndG9rOjpUb2tLaW5kIFRvayA9IExleFRva2VuKCk7CisgIGlmIChUb2sgPT0gdGd0b2s6OkVycm9yKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKFRvayAhPSB0Z3Rvazo6U3RyVmFsKSB7CisgICAgUHJpbnRFcnJvcihnZXRMb2MoKSwgIkV4cGVjdGVkIGZpbGVuYW1lIGFmdGVyIGluY2x1ZGUiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEdldCB0aGUgc3RyaW5nLgorICBzdGQ6OnN0cmluZyBGaWxlbmFtZSA9IEN1clN0clZhbDsKKworICAKKyAgQ3VyQnVmZmVyID0gU3JjTWdyLkFkZEluY2x1ZGVGaWxlKEZpbGVuYW1lLCBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoQ3VyUHRyKSk7CisgIGlmIChDdXJCdWZmZXIgPT0gLTEpIHsKKyAgICBQcmludEVycm9yKGdldExvYygpLCAiQ291bGQgbm90IGZpbmQgaW5jbHVkZSBmaWxlICciICsgRmlsZW5hbWUgKyAiJyIpOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICAvLyBTYXZlIHRoZSBsaW5lIG51bWJlciBhbmQgbGV4IGJ1ZmZlciBvZiB0aGUgaW5jbHVkZXIuCisgIEN1ckJ1ZiA9IFNyY01nci5nZXRNZW1vcnlCdWZmZXIoQ3VyQnVmZmVyKTsKKyAgQ3VyUHRyID0gQ3VyQnVmLT5nZXRCdWZmZXJTdGFydCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVEdMZXhlcjo6U2tpcEJDUExDb21tZW50KCkgeworICArK0N1clB0cjsgIC8vIHNraXAgdGhlIHNlY29uZCBzbGFzaC4KKyAgd2hpbGUgKDEpIHsKKyAgICBzd2l0Y2ggKCpDdXJQdHIpIHsKKyAgICBjYXNlICdcbic6CisgICAgY2FzZSAnXHInOgorICAgICAgcmV0dXJuOyAgLy8gTmV3bGluZSBpcyBlbmQgb2YgY29tbWVudC4KKyAgICBjYXNlIDA6CisgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgZW5kIHRoZSBjb21tZW50LgorICAgICAgaWYgKEN1clB0ciA9PSBDdXJCdWYtPmdldEJ1ZmZlckVuZCgpKQorICAgICAgICByZXR1cm47CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gT3RoZXJ3aXNlLCBza2lwIHRoZSBjaGFyYWN0ZXIuCisgICAgKytDdXJQdHI7CisgIH0KK30KKworLy8vIFNraXBDQ29tbWVudCAtIFRoaXMgc2tpcHMgQy1zdHlsZSAvKiovIGNvbW1lbnRzLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBmcm9tIEMKKy8vLyBpcyB0aGF0IHdlIGFsbG93IG5lc3RpbmcuCitib29sIFRHTGV4ZXI6OlNraXBDQ29tbWVudCgpIHsKKyAgKytDdXJQdHI7ICAvLyBza2lwIHRoZSBzdGFyLgorICB1bnNpZ25lZCBDb21tZW50RGVwdGggPSAxOworICAKKyAgd2hpbGUgKDEpIHsKKyAgICBpbnQgQ3VyQ2hhciA9IGdldE5leHRDaGFyKCk7CisgICAgc3dpdGNoIChDdXJDaGFyKSB7CisgICAgY2FzZSBFT0Y6CisgICAgICBQcmludEVycm9yKFRva1N0YXJ0LCAiVW50ZXJtaW5hdGVkIGNvbW1lbnQhIik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlICcqJzoKKyAgICAgIC8vIEVuZCBvZiB0aGUgY29tbWVudD8KKyAgICAgIGlmIChDdXJQdHJbMF0gIT0gJy8nKSBicmVhazsKKyAgICAgIAorICAgICAgKytDdXJQdHI7ICAgLy8gRW5kIHRoZSAqLy4KKyAgICAgIGlmICgtLUNvbW1lbnREZXB0aCA9PSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlICcvJzoKKyAgICAgIC8vIFN0YXJ0IG9mIGEgbmVzdGVkIGNvbW1lbnQ/CisgICAgICBpZiAoQ3VyUHRyWzBdICE9ICcqJykgYnJlYWs7CisgICAgICArK0N1clB0cjsKKyAgICAgICsrQ29tbWVudERlcHRoOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8vLyBMZXhOdW1iZXIgLSBMZXg6CisvLy8gICAgWy0rXT9bMC05XSsKKy8vLyAgICAweFswLTlhLWZBLUZdKworLy8vICAgIDBiWzAxXSsKK3RndG9rOjpUb2tLaW5kIFRHTGV4ZXI6OkxleE51bWJlcigpIHsKKyAgaWYgKEN1clB0clstMV0gPT0gJzAnKSB7CisgICAgaWYgKEN1clB0clswXSA9PSAneCcpIHsKKyAgICAgICsrQ3VyUHRyOworICAgICAgY29uc3QgY2hhciAqTnVtU3RhcnQgPSBDdXJQdHI7CisgICAgICB3aGlsZSAoaXN4ZGlnaXQoQ3VyUHRyWzBdKSkKKyAgICAgICAgKytDdXJQdHI7CisgICAgICAKKyAgICAgIC8vIFJlcXVpcmVzIGF0IGxlYXN0IG9uZSBoZXggZGlnaXQuCisgICAgICBpZiAoQ3VyUHRyID09IE51bVN0YXJ0KQorICAgICAgICByZXR1cm4gUmV0dXJuRXJyb3IoVG9rU3RhcnQsICJJbnZhbGlkIGhleGFkZWNpbWFsIG51bWJlciIpOworCisgICAgICBlcnJubyA9IDA7CisgICAgICBDdXJJbnRWYWwgPSBzdHJ0b2xsKE51bVN0YXJ0LCAwLCAxNik7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMKQorICAgICAgICByZXR1cm4gUmV0dXJuRXJyb3IoVG9rU3RhcnQsICJJbnZhbGlkIGhleGFkZWNpbWFsIG51bWJlciIpOworICAgICAgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIEN1ckludFZhbCA9IChpbnQ2NF90KXN0cnRvdWxsKE51bVN0YXJ0LCAwLCAxNik7CisgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpCisgICAgICAgICAgcmV0dXJuIFJldHVybkVycm9yKFRva1N0YXJ0LCAiSW52YWxpZCBoZXhhZGVjaW1hbCBudW1iZXIiKTsKKyAgICAgICAgaWYgKGVycm5vID09IEVSQU5HRSkKKyAgICAgICAgICByZXR1cm4gUmV0dXJuRXJyb3IoVG9rU3RhcnQsICJIZXhhZGVjaW1hbCBudW1iZXIgb3V0IG9mIHJhbmdlIik7CisgICAgICB9CisgICAgICByZXR1cm4gdGd0b2s6OkludFZhbDsKKyAgICB9IGVsc2UgaWYgKEN1clB0clswXSA9PSAnYicpIHsKKyAgICAgICsrQ3VyUHRyOworICAgICAgY29uc3QgY2hhciAqTnVtU3RhcnQgPSBDdXJQdHI7CisgICAgICB3aGlsZSAoQ3VyUHRyWzBdID09ICcwJyB8fCBDdXJQdHJbMF0gPT0gJzEnKQorICAgICAgICArK0N1clB0cjsKKworICAgICAgLy8gUmVxdWlyZXMgYXQgbGVhc3Qgb25lIGJpbmFyeSBkaWdpdC4KKyAgICAgIGlmIChDdXJQdHIgPT0gTnVtU3RhcnQpCisgICAgICAgIHJldHVybiBSZXR1cm5FcnJvcihDdXJQdHItMiwgIkludmFsaWQgYmluYXJ5IG51bWJlciIpOworICAgICAgQ3VySW50VmFsID0gc3RydG9sbChOdW1TdGFydCwgMCwgMik7CisgICAgICByZXR1cm4gdGd0b2s6OkludFZhbDsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBmb3IgYSBzaWduIHdpdGhvdXQgYSBkaWdpdC4KKyAgaWYgKCFpc2RpZ2l0KEN1clB0clswXSkpIHsKKyAgICBpZiAoQ3VyUHRyWy0xXSA9PSAnLScpCisgICAgICByZXR1cm4gdGd0b2s6Om1pbnVzOworICAgIGVsc2UgaWYgKEN1clB0clstMV0gPT0gJysnKQorICAgICAgcmV0dXJuIHRndG9rOjpwbHVzOworICB9CisgIAorICB3aGlsZSAoaXNkaWdpdChDdXJQdHJbMF0pKQorICAgICsrQ3VyUHRyOworICBDdXJJbnRWYWwgPSBzdHJ0b2xsKFRva1N0YXJ0LCAwLCAxMCk7CisgIHJldHVybiB0Z3Rvazo6SW50VmFsOworfQorCisvLy8gTGV4QnJhY2tldCAtIFdlIGp1c3QgcmVhZCAnWycuICBJZiB0aGlzIGlzIGEgY29kZSBibG9jaywgcmV0dXJuIGl0LAorLy8vIG90aGVyd2lzZSByZXR1cm4gdGhlIGJyYWNrZXQuICBNYXRjaDogJ1snIGFuZCAnW3sgKCBbXn1dKyB8IH1bXl1dICkqIH1dJwordGd0b2s6OlRva0tpbmQgVEdMZXhlcjo6TGV4QnJhY2tldCgpIHsKKyAgaWYgKEN1clB0clswXSAhPSAneycpCisgICAgcmV0dXJuIHRndG9rOjpsX3NxdWFyZTsKKyAgKytDdXJQdHI7CisgIGNvbnN0IGNoYXIgKkNvZGVTdGFydCA9IEN1clB0cjsKKyAgd2hpbGUgKDEpIHsKKyAgICBpbnQgQ2hhciA9IGdldE5leHRDaGFyKCk7CisgICAgaWYgKENoYXIgPT0gRU9GKSBicmVhazsKKyAgICAKKyAgICBpZiAoQ2hhciAhPSAnfScpIGNvbnRpbnVlOworICAgIAorICAgIENoYXIgPSBnZXROZXh0Q2hhcigpOworICAgIGlmIChDaGFyID09IEVPRikgYnJlYWs7CisgICAgaWYgKENoYXIgPT0gJ10nKSB7CisgICAgICBDdXJTdHJWYWwuYXNzaWduKENvZGVTdGFydCwgQ3VyUHRyLTIpOworICAgICAgcmV0dXJuIHRndG9rOjpDb2RlRnJhZ21lbnQ7CisgICAgfQorICB9CisgIAorICByZXR1cm4gUmV0dXJuRXJyb3IoQ29kZVN0YXJ0LTIsICJVbnRlcm1pbmF0ZWQgQ29kZSBCbG9jayIpOworfQorCisvLy8gTGV4RXhjbGFpbSAtIExleCAnIScgYW5kICchW2EtekEtWl0rJy4KK3RndG9rOjpUb2tLaW5kIFRHTGV4ZXI6OkxleEV4Y2xhaW0oKSB7CisgIGlmICghaXNhbHBoYSgqQ3VyUHRyKSkKKyAgICByZXR1cm4gUmV0dXJuRXJyb3IoQ3VyUHRyLTEsICJJbnZhbGlkIFwiIW9wZXJhdG9yXCIiKTsKKyAgCisgIGNvbnN0IGNoYXIgKlN0YXJ0ID0gQ3VyUHRyKys7CisgIHdoaWxlIChpc2FscGhhKCpDdXJQdHIpKQorICAgICsrQ3VyUHRyOworICAKKyAgLy8gQ2hlY2sgdG8gc2VlIHdoaWNoIG9wZXJhdG9yIHRoaXMgaXMuCisgIHVuc2lnbmVkIExlbiA9IEN1clB0ci1TdGFydDsKKyAgCisgIGlmIChMZW4gPT0gMyAgJiYgIW1lbWNtcChTdGFydCwgImNvbiIsIDMpKSByZXR1cm4gdGd0b2s6OlhDb25jYXQ7CisgIGlmIChMZW4gPT0gMyAgJiYgIW1lbWNtcChTdGFydCwgInNyYSIsIDMpKSByZXR1cm4gdGd0b2s6OlhTUkE7CisgIGlmIChMZW4gPT0gMyAgJiYgIW1lbWNtcChTdGFydCwgInNybCIsIDMpKSByZXR1cm4gdGd0b2s6OlhTUkw7CisgIGlmIChMZW4gPT0gMyAgJiYgIW1lbWNtcChTdGFydCwgInNobCIsIDMpKSByZXR1cm4gdGd0b2s6OlhTSEw7CisgIGlmIChMZW4gPT0gMiAgJiYgIW1lbWNtcChTdGFydCwgImVxIiwgMikpIHJldHVybiB0Z3Rvazo6WEVxOworICBpZiAoTGVuID09IDkgICYmICFtZW1jbXAoU3RhcnQsICJzdHJjb25jYXQiLCA5KSkgICByZXR1cm4gdGd0b2s6OlhTdHJDb25jYXQ7CisgIGlmIChMZW4gPT0gMTAgJiYgIW1lbWNtcChTdGFydCwgIm5hbWVjb25jYXQiLCAxMCkpIHJldHVybiB0Z3Rvazo6WE5hbWVDb25jYXQ7CisgIGlmIChMZW4gPT0gNSAmJiAhbWVtY21wKFN0YXJ0LCAic3Vic3QiLCA1KSkgcmV0dXJuIHRndG9rOjpYU3Vic3Q7CisgIGlmIChMZW4gPT0gNyAmJiAhbWVtY21wKFN0YXJ0LCAiZm9yZWFjaCIsIDcpKSByZXR1cm4gdGd0b2s6OlhGb3JFYWNoOworICBpZiAoTGVuID09IDQgJiYgIW1lbWNtcChTdGFydCwgImNhc3QiLCA0KSkgcmV0dXJuIHRndG9rOjpYQ2FzdDsKKyAgaWYgKExlbiA9PSAzICYmICFtZW1jbXAoU3RhcnQsICJjYXIiLCAzKSkgcmV0dXJuIHRndG9rOjpYQ2FyOworICBpZiAoTGVuID09IDMgJiYgIW1lbWNtcChTdGFydCwgImNkciIsIDMpKSByZXR1cm4gdGd0b2s6OlhDZHI7CisgIGlmIChMZW4gPT0gNCAmJiAhbWVtY21wKFN0YXJ0LCAibnVsbCIsIDQpKSByZXR1cm4gdGd0b2s6OlhOdWxsOworICBpZiAoTGVuID09IDIgJiYgIW1lbWNtcChTdGFydCwgImlmIiwgMikpIHJldHVybiB0Z3Rvazo6WElmOworCisgIHJldHVybiBSZXR1cm5FcnJvcihTdGFydC0xLCAiVW5rbm93biBvcGVyYXRvciIpOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9UR0xleGVyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9UR0xleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1ZjM1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RHTGV4ZXIuaApAQCAtMCwwICsxLDEyMSBAQAorLy89PT0tIFRHTGV4ZXIuaCAtIExleGVyIGZvciBUYWJsZUdlbiBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIExleGVyIGZvciB0YWJsZWdlbiBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFRHTEVYRVJfSAorI2RlZmluZSBUR0xFWEVSX0gKKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTWVtb3J5QnVmZmVyOworY2xhc3MgU291cmNlTWdyOworY2xhc3MgU01Mb2M7CisgIAorbmFtZXNwYWNlIHRndG9rIHsKKyAgZW51bSBUb2tLaW5kIHsKKyAgICAvLyBNYXJrZXJzCisgICAgRW9mLCBFcnJvciwKKyAgICAKKyAgICAvLyBUb2tlbnMgd2l0aCBubyBpbmZvLgorICAgIG1pbnVzLCBwbHVzLCAgICAgICAgLy8gLSArCisgICAgbF9zcXVhcmUsIHJfc3F1YXJlLCAvLyBbIF0KKyAgICBsX2JyYWNlLCByX2JyYWNlLCAgIC8vIHsgfQorICAgIGxfcGFyZW4sIHJfcGFyZW4sICAgLy8gKCApCisgICAgbGVzcywgZ3JlYXRlciwgICAgICAvLyA8ID4KKyAgICBjb2xvbiwgc2VtaSwgICAgICAgIC8vIDsgOgorICAgIGNvbW1hLCBwZXJpb2QsICAgICAgLy8gLCAuCisgICAgZXF1YWwsIHF1ZXN0aW9uLCAgICAvLyA9ID8KKyAgICAKKyAgICAvLyBLZXl3b3Jkcy4KKyAgICBCaXQsIEJpdHMsIENsYXNzLCBDb2RlLCBEYWcsIERlZiwgRGVmbSwgRmllbGQsIEluLCBJbnQsIExldCwgTGlzdCwKKyAgICBNdWx0aUNsYXNzLCBTdHJpbmcsCisgICAgCisgICAgLy8gIWtleXdvcmRzLgorICAgIFhDb25jYXQsIFhTUkEsIFhTUkwsIFhTSEwsIFhTdHJDb25jYXQsIFhOYW1lQ29uY2F0LCBYQ2FzdCwgWFN1YnN0LAorICAgIFhGb3JFYWNoLCBYQ2FyLCBYQ2RyLCBYTnVsbCwgWElmLCBYRXEsCisKKyAgICAvLyBJbnRlZ2VyIHZhbHVlLgorICAgIEludFZhbCwKKyAgICAKKyAgICAvLyBTdHJpbmcgdmFsdWVkIHRva2Vucy4KKyAgICBJZCwgU3RyVmFsLCBWYXJOYW1lLCBDb2RlRnJhZ21lbnQKKyAgfTsKK30KKworLy8vIFRHTGV4ZXIgLSBUYWJsZUdlbiBMZXhlciBjbGFzcy4KK2NsYXNzIFRHTGV4ZXIgeworICBTb3VyY2VNZ3IgJlNyY01ncjsKKyAgCisgIGNvbnN0IGNoYXIgKkN1clB0cjsKKyAgY29uc3QgTWVtb3J5QnVmZmVyICpDdXJCdWY7CisKKyAgLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgdG9rZW4uCisgIGNvbnN0IGNoYXIgKlRva1N0YXJ0OworICB0Z3Rvazo6VG9rS2luZCBDdXJDb2RlOworICBzdGQ6OnN0cmluZyBDdXJTdHJWYWw7ICAvLyBUaGlzIGlzIHZhbGlkIGZvciBJRCwgU1RSVkFMLCBWQVJOQU1FLCBDT0RFRlJBR01FTlQKKyAgaW50NjRfdCBDdXJJbnRWYWw7ICAgICAgLy8gVGhpcyBpcyB2YWxpZCBmb3IgSU5UVkFMLgorCisgIC8vLyBDdXJCdWZmZXIgLSBUaGlzIGlzIHRoZSBjdXJyZW50IGJ1ZmZlciBpbmRleCB3ZSdyZSBsZXhpbmcgZnJvbSBhcyBtYW5hZ2VkCisgIC8vLyBieSB0aGUgU291cmNlTWdyIG9iamVjdC4KKyAgaW50IEN1ckJ1ZmZlcjsKKyAgCitwdWJsaWM6CisgIFRHTGV4ZXIoU291cmNlTWdyICZTcmNNZ3IpOworICB+VEdMZXhlcigpIHt9CisgIAorICB0Z3Rvazo6VG9rS2luZCBMZXgoKSB7CisgICAgcmV0dXJuIEN1ckNvZGUgPSBMZXhUb2tlbigpOworICB9CisgIAorICB0Z3Rvazo6VG9rS2luZCBnZXRDb2RlKCkgY29uc3QgeyByZXR1cm4gQ3VyQ29kZTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRDdXJTdHJWYWwoKSBjb25zdCB7CisgICAgYXNzZXJ0KChDdXJDb2RlID09IHRndG9rOjpJZCB8fCBDdXJDb2RlID09IHRndG9rOjpTdHJWYWwgfHwgCisgICAgICAgICAgICBDdXJDb2RlID09IHRndG9rOjpWYXJOYW1lIHx8IEN1ckNvZGUgPT0gdGd0b2s6OkNvZGVGcmFnbWVudCkgJiYKKyAgICAgICAgICAgIlRoaXMgdG9rZW4gZG9lc24ndCBoYXZlIGEgc3RyaW5nIHZhbHVlIik7CisgICAgcmV0dXJuIEN1clN0clZhbDsKKyAgfQorICBpbnQ2NF90IGdldEN1ckludFZhbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoQ3VyQ29kZSA9PSB0Z3Rvazo6SW50VmFsICYmICJUaGlzIHRva2VuIGlzbid0IGFuIGludGVnZXIiKTsKKyAgICByZXR1cm4gQ3VySW50VmFsOworICB9CisKKyAgU01Mb2MgZ2V0TG9jKCkgY29uc3Q7CisKKyAgdm9pZCBQcmludEVycm9yKGNvbnN0IGNoYXIgKkxvYywgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZykgY29uc3Q7CisgIHZvaWQgUHJpbnRFcnJvcihTTUxvYyBMb2MsIGNvbnN0IHN0ZDo6c3RyaW5nICZNc2cpIGNvbnN0OworICAKK3ByaXZhdGU6CisgIC8vLyBMZXhUb2tlbiAtIFJlYWQgdGhlIG5leHQgdG9rZW4gYW5kIHJldHVybiBpdHMgY29kZS4KKyAgdGd0b2s6OlRva0tpbmQgTGV4VG9rZW4oKTsKKyAgCisgIHRndG9rOjpUb2tLaW5kIFJldHVybkVycm9yKGNvbnN0IGNoYXIgKkxvYywgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZyk7CisgIAorICBpbnQgZ2V0TmV4dENoYXIoKTsKKyAgdm9pZCBTa2lwQkNQTENvbW1lbnQoKTsKKyAgYm9vbCBTa2lwQ0NvbW1lbnQoKTsKKyAgdGd0b2s6OlRva0tpbmQgTGV4SWRlbnRpZmllcigpOworICBib29sIExleEluY2x1ZGUoKTsKKyAgdGd0b2s6OlRva0tpbmQgTGV4U3RyaW5nKCk7CisgIHRndG9rOjpUb2tLaW5kIExleFZhck5hbWUoKTsKKyAgdGd0b2s6OlRva0tpbmQgTGV4TnVtYmVyKCk7CisgIHRndG9rOjpUb2tLaW5kIExleEJyYWNrZXQoKTsKKyAgdGd0b2s6OlRva0tpbmQgTGV4RXhjbGFpbSgpOworfTsKKyAgCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RHUGFyc2VyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RHUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODFhYWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vVEdQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMjEyMyBAQAorLy89PT0tIFRHUGFyc2VyLmNwcCAtIFBhcnNlciBmb3IgVGFibGVHZW4gRmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbXBsZW1lbnQgdGhlIFBhcnNlciBmb3IgVGFibGVHZW4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlRHUGFyc2VyLmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNzdHJlYW0+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFN1cHBvcnQgQ29kZSBmb3IgdGhlIFNlbWFudGljIEFjdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgbGx2bSB7CitzdHJ1Y3QgU3ViQ2xhc3NSZWZlcmVuY2UgeworICBTTUxvYyBSZWZMb2M7CisgIFJlY29yZCAqUmVjOworICBzdGQ6OnZlY3RvcjxJbml0Kj4gVGVtcGxhdGVBcmdzOworICBTdWJDbGFzc1JlZmVyZW5jZSgpIDogUmVjKDApIHt9CisKKyAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCB7IHJldHVybiBSZWMgPT0gMDsgfQorfTsKKworc3RydWN0IFN1Yk11bHRpQ2xhc3NSZWZlcmVuY2UgeworICBTTUxvYyBSZWZMb2M7CisgIE11bHRpQ2xhc3MgKk1DOworICBzdGQ6OnZlY3RvcjxJbml0Kj4gVGVtcGxhdGVBcmdzOworICBTdWJNdWx0aUNsYXNzUmVmZXJlbmNlKCkgOiBNQygwKSB7fQorCisgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gTUMgPT0gMDsgfQorICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK3ZvaWQgU3ViTXVsdGlDbGFzc1JlZmVyZW5jZTo6ZHVtcCgpIGNvbnN0IHsKKyAgZXJycygpIDw8ICJNdWx0aWNsYXNzOlxuIjsKKworICBNQy0+ZHVtcCgpOworCisgIGVycnMoKSA8PCAiVGVtcGxhdGUgYXJnczpcbiI7CisgIGZvciAoc3RkOjp2ZWN0b3I8SW5pdCAqPjo6Y29uc3RfaXRlcmF0b3IgaSA9IFRlbXBsYXRlQXJncy5iZWdpbigpLAorICAgICAgICAgaWVuZCA9IFRlbXBsYXRlQXJncy5lbmQoKTsKKyAgICAgICBpICE9IGllbmQ7CisgICAgICAgKytpKSB7CisgICAgKCppKS0+ZHVtcCgpOworICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK2Jvb2wgVEdQYXJzZXI6OkFkZFZhbHVlKFJlY29yZCAqQ3VyUmVjLCBTTUxvYyBMb2MsIGNvbnN0IFJlY29yZFZhbCAmUlYpIHsKKyAgaWYgKEN1clJlYyA9PSAwKQorICAgIEN1clJlYyA9ICZDdXJNdWx0aUNsYXNzLT5SZWM7CisKKyAgaWYgKFJlY29yZFZhbCAqRVJWID0gQ3VyUmVjLT5nZXRWYWx1ZShSVi5nZXROYW1lKCkpKSB7CisgICAgLy8gVGhlIHZhbHVlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBjbGFzcywgdHJlYXQgdGhpcyBhcyBhIHNldC4KKyAgICBpZiAoRVJWLT5zZXRWYWx1ZShSVi5nZXRWYWx1ZSgpKSkKKyAgICAgIHJldHVybiBFcnJvcihMb2MsICJOZXcgZGVmaW5pdGlvbiBvZiAnIiArIFJWLmdldE5hbWUoKSArICInIG9mIHR5cGUgJyIgKworICAgICAgICAgICAgICAgICAgIFJWLmdldFR5cGUoKS0+Z2V0QXNTdHJpbmcoKSArICInIGlzIGluY29tcGF0aWJsZSB3aXRoICIgKworICAgICAgICAgICAgICAgICAgICJwcmV2aW91cyBkZWZpbml0aW9uIG9mIHR5cGUgJyIgKworICAgICAgICAgICAgICAgICAgIEVSVi0+Z2V0VHlwZSgpLT5nZXRBc1N0cmluZygpICsgIiciKTsKKyAgfSBlbHNlIHsKKyAgICBDdXJSZWMtPmFkZFZhbHVlKFJWKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBTZXRWYWx1ZSAtCisvLy8gUmV0dXJuIHRydWUgb24gZXJyb3IsIGZhbHNlIG9uIHN1Y2Nlc3MuCitib29sIFRHUGFyc2VyOjpTZXRWYWx1ZShSZWNvcmQgKkN1clJlYywgU01Mb2MgTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmVmFsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmQml0TGlzdCwgSW5pdCAqVikgeworICBpZiAoIVYpIHJldHVybiBmYWxzZTsKKworICBpZiAoQ3VyUmVjID09IDApIEN1clJlYyA9ICZDdXJNdWx0aUNsYXNzLT5SZWM7CisKKyAgUmVjb3JkVmFsICpSViA9IEN1clJlYy0+Z2V0VmFsdWUoVmFsTmFtZSk7CisgIGlmIChSViA9PSAwKQorICAgIHJldHVybiBFcnJvcihMb2MsICJWYWx1ZSAnIiArIFZhbE5hbWUgKyAiJyB1bmtub3duISIpOworCisgIC8vIERvIG5vdCBhbGxvdyBhc3NpZ25tZW50cyBsaWtlICdYID0gWCcuICBUaGlzIHdpbGwganVzdCBjYXVzZSBpbmZpbml0ZSBsb29wcworICAvLyBpbiB0aGUgcmVzb2x1dGlvbiBtYWNoaW5lcnkuCisgIGlmIChCaXRMaXN0LmVtcHR5KCkpCisgICAgaWYgKFZhckluaXQgKlZJID0gZHluYW1pY19jYXN0PFZhckluaXQqPihWKSkKKyAgICAgIGlmIChWSS0+Z2V0TmFtZSgpID09IFZhbE5hbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAvLyBJZiB3ZSBhcmUgYXNzaWduaW5nIHRvIGEgc3Vic2V0IG9mIHRoZSBiaXRzIGluIHRoZSB2YWx1ZS4uLiB0aGVuIHdlIG11c3QgYmUKKyAgLy8gYXNzaWduaW5nIHRvIGEgZmllbGQgb2YgQml0c1JlY1R5LCB3aGljaCBtdXN0IGhhdmUgYSBCaXRzSW5pdAorICAvLyBpbml0aWFsaXplci4KKyAgLy8KKyAgaWYgKCFCaXRMaXN0LmVtcHR5KCkpIHsKKyAgICBCaXRzSW5pdCAqQ3VyVmFsID0gZHluYW1pY19jYXN0PEJpdHNJbml0Kj4oUlYtPmdldFZhbHVlKCkpOworICAgIGlmIChDdXJWYWwgPT0gMCkKKyAgICAgIHJldHVybiBFcnJvcihMb2MsICJWYWx1ZSAnIiArIFZhbE5hbWUgKyAiJyBpcyBub3QgYSBiaXRzIHR5cGUiKTsKKworICAgIC8vIENvbnZlcnQgdGhlIGluY29taW5nIHZhbHVlIHRvIGEgYml0cyB0eXBlIG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplLi4uCisgICAgSW5pdCAqQkkgPSBWLT5jb252ZXJ0SW5pdGlhbGl6ZXJUbyhuZXcgQml0c1JlY1R5KEJpdExpc3Quc2l6ZSgpKSk7CisgICAgaWYgKEJJID09IDApIHsKKyAgICAgIFYtPmNvbnZlcnRJbml0aWFsaXplclRvKG5ldyBCaXRzUmVjVHkoQml0TGlzdC5zaXplKCkpKTsKKyAgICAgIHJldHVybiBFcnJvcihMb2MsICJJbml0aWFsaXplciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGJpdCByYW5nZSIpOworICAgIH0KKworICAgIC8vIFdlIHNob3VsZCBoYXZlIGEgQml0c0luaXQgdHlwZSBub3cuCisgICAgQml0c0luaXQgKkJJbml0ID0gZHluYW1pY19jYXN0PEJpdHNJbml0Kj4oQkkpOworICAgIGFzc2VydChCSW5pdCAhPSAwKTsKKworICAgIEJpdHNJbml0ICpOZXdWYWwgPSBuZXcgQml0c0luaXQoQ3VyVmFsLT5nZXROdW1CaXRzKCkpOworCisgICAgLy8gTG9vcCBvdmVyIGJpdHMsIGFzc2lnbmluZyB2YWx1ZXMgYXMgYXBwcm9wcmlhdGUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEJpdExpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgdW5zaWduZWQgQml0ID0gQml0TGlzdFtpXTsKKyAgICAgIGlmIChOZXdWYWwtPmdldEJpdChCaXQpKQorICAgICAgICByZXR1cm4gRXJyb3IoTG9jLCAiQ2Fubm90IHNldCBiaXQgIyIgKyB1dG9zdHIoQml0KSArICIgb2YgdmFsdWUgJyIgKworICAgICAgICAgICAgICAgICAgICAgVmFsTmFtZSArICInIG1vcmUgdGhhbiBvbmNlIik7CisgICAgICBOZXdWYWwtPnNldEJpdChCaXQsIEJJbml0LT5nZXRCaXQoaSkpOworICAgIH0KKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDdXJWYWwtPmdldE51bUJpdHMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoTmV3VmFsLT5nZXRCaXQoaSkgPT0gMCkKKyAgICAgICAgTmV3VmFsLT5zZXRCaXQoaSwgQ3VyVmFsLT5nZXRCaXQoaSkpOworCisgICAgViA9IE5ld1ZhbDsKKyAgfQorCisgIGlmIChSVi0+c2V0VmFsdWUoVikpCisgICByZXR1cm4gRXJyb3IoTG9jLCAiVmFsdWUgJyIgKyBWYWxOYW1lICsgIicgb2YgdHlwZSAnIiArCisgICAgICAgICAgICAgICAgUlYtPmdldFR5cGUoKS0+Z2V0QXNTdHJpbmcoKSArCisgICAgICAgICAgICAgICAgIicgaXMgaW5jb21wYXRpYmxlIHdpdGggaW5pdGlhbGl6ZXIgJyIgKyBWLT5nZXRBc1N0cmluZygpICsiJyIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBBZGRTdWJDbGFzcyAtIEFkZCBTdWJDbGFzcyBhcyBhIHN1YmNsYXNzIHRvIEN1clJlYywgcmVzb2x2aW5nIGl0cyB0ZW1wbGF0ZQorLy8vIGFyZ3MgYXMgU3ViQ2xhc3MncyB0ZW1wbGF0ZSBhcmd1bWVudHMuCitib29sIFRHUGFyc2VyOjpBZGRTdWJDbGFzcyhSZWNvcmQgKkN1clJlYywgU3ViQ2xhc3NSZWZlcmVuY2UgJlN1YkNsYXNzKSB7CisgIFJlY29yZCAqU0MgPSBTdWJDbGFzcy5SZWM7CisgIC8vIEFkZCBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGUgc3ViY2xhc3MgaW50byB0aGUgY3VycmVudCBjbGFzcy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkVmFsPiAmVmFscyA9IFNDLT5nZXRWYWx1ZXMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoQWRkVmFsdWUoQ3VyUmVjLCBTdWJDbGFzcy5SZWZMb2MsIFZhbHNbaV0pKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZUQXJncyA9IFNDLT5nZXRUZW1wbGF0ZUFyZ3MoKTsKKworICAvLyBFbnN1cmUgdGhhdCBhbiBhcHByb3ByaWF0ZSBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQuCisgIGlmIChUQXJncy5zaXplKCkgPCBTdWJDbGFzcy5UZW1wbGF0ZUFyZ3Muc2l6ZSgpKQorICAgIHJldHVybiBFcnJvcihTdWJDbGFzcy5SZWZMb2MsICJNb3JlIHRlbXBsYXRlIGFyZ3Mgc3BlY2lmaWVkIHRoYW4gZXhwZWN0ZWQiKTsKKworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMsIHNldHRpbmcgdGhlbSB0byB0aGUgc3BlY2lmaWVkCisgIC8vIHZhbHVlIG9yIGxlYXZpbmcgdGhlbSBhcyB0aGUgZGVmYXVsdCBpZiBuZWNlc3NhcnkuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKGkgPCBTdWJDbGFzcy5UZW1wbGF0ZUFyZ3Muc2l6ZSgpKSB7CisgICAgICAvLyBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgdGhpcyB0ZW1wbGF0ZSBhcmcsIHNldCBpdCBub3cuCisgICAgICBpZiAoU2V0VmFsdWUoQ3VyUmVjLCBTdWJDbGFzcy5SZWZMb2MsIFRBcmdzW2ldLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKSwKKyAgICAgICAgICAgICAgICAgICBTdWJDbGFzcy5UZW1wbGF0ZUFyZ3NbaV0pKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gUmVzb2x2ZSBpdCBuZXh0LgorICAgICAgQ3VyUmVjLT5yZXNvbHZlUmVmZXJlbmNlc1RvKEN1clJlYy0+Z2V0VmFsdWUoVEFyZ3NbaV0pKTsKKworICAgICAgLy8gTm93IHJlbW92ZSBpdC4KKyAgICAgIEN1clJlYy0+cmVtb3ZlVmFsdWUoVEFyZ3NbaV0pOworCisgICAgfSBlbHNlIGlmICghQ3VyUmVjLT5nZXRWYWx1ZShUQXJnc1tpXSktPmdldFZhbHVlKCktPmlzQ29tcGxldGUoKSkgeworICAgICAgcmV0dXJuIEVycm9yKFN1YkNsYXNzLlJlZkxvYywiVmFsdWUgbm90IHNwZWNpZmllZCBmb3IgdGVtcGxhdGUgYXJndW1lbnQgIyIKKyAgICAgICAgICAgICAgICAgICArIHV0b3N0cihpKSArICIgKCIgKyBUQXJnc1tpXSArICIpIG9mIHN1YmNsYXNzICciICsKKyAgICAgICAgICAgICAgICAgICBTQy0+Z2V0TmFtZSgpICsgIichIik7CisgICAgfQorICB9CisKKyAgLy8gU2luY2UgZXZlcnl0aGluZyB3ZW50IHdlbGwsIHdlIGNhbiBub3cgc2V0IHRoZSAic3VwZXJjbGFzcyIgbGlzdCBmb3IgdGhlCisgIC8vIGN1cnJlbnQgcmVjb3JkLgorICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQqPiAmU0NzID0gU0MtPmdldFN1cGVyQ2xhc3NlcygpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU0NzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoQ3VyUmVjLT5pc1N1YkNsYXNzT2YoU0NzW2ldKSkKKyAgICAgIHJldHVybiBFcnJvcihTdWJDbGFzcy5SZWZMb2MsCisgICAgICAgICAgICAgICAgICAgIkFscmVhZHkgc3ViY2xhc3Mgb2YgJyIgKyBTQ3NbaV0tPmdldE5hbWUoKSArICInIVxuIik7CisgICAgQ3VyUmVjLT5hZGRTdXBlckNsYXNzKFNDc1tpXSk7CisgIH0KKworICBpZiAoQ3VyUmVjLT5pc1N1YkNsYXNzT2YoU0MpKQorICAgIHJldHVybiBFcnJvcihTdWJDbGFzcy5SZWZMb2MsCisgICAgICAgICAgICAgICAgICJBbHJlYWR5IHN1YmNsYXNzIG9mICciICsgU0MtPmdldE5hbWUoKSArICInIVxuIik7CisgIEN1clJlYy0+YWRkU3VwZXJDbGFzcyhTQyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIEFkZFN1Yk11bHRpQ2xhc3MgLSBBZGQgU3ViTXVsdGlDbGFzcyBhcyBhIHN1YmNsYXNzIHRvCisvLy8gQ3VyTUMsIHJlc29sdmluZyBpdHMgdGVtcGxhdGUgYXJncyBhcyBTdWJNdWx0aUNsYXNzJ3MKKy8vLyB0ZW1wbGF0ZSBhcmd1bWVudHMuCitib29sIFRHUGFyc2VyOjpBZGRTdWJNdWx0aUNsYXNzKE11bHRpQ2xhc3MgKkN1ck1DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJNdWx0aUNsYXNzUmVmZXJlbmNlICZTdWJNdWx0aUNsYXNzKSB7CisgIE11bHRpQ2xhc3MgKlNNQyA9IFN1Yk11bHRpQ2xhc3MuTUM7CisgIFJlY29yZCAqQ3VyUmVjID0gJkN1ck1DLT5SZWM7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVjb3JkVmFsPiAmTUNWYWxzID0gQ3VyUmVjLT5nZXRWYWx1ZXMoKTsKKworICAvLyBBZGQgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIHN1YmNsYXNzIGludG8gdGhlIGN1cnJlbnQgY2xhc3MuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZFZhbD4gJlNNQ1ZhbHMgPSBTTUMtPlJlYy5nZXRWYWx1ZXMoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFNNQ1ZhbHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoQWRkVmFsdWUoQ3VyUmVjLCBTdWJNdWx0aUNsYXNzLlJlZkxvYywgU01DVmFsc1tpXSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICBpbnQgbmV3RGVmU3RhcnQgPSBDdXJNQy0+RGVmUHJvdG90eXBlcy5zaXplKCk7CisKKyAgLy8gQWRkIGFsbCBvZiB0aGUgZGVmcyBpbiB0aGUgc3ViY2xhc3MgaW50byB0aGUgY3VycmVudCBtdWx0aWNsYXNzLgorICBmb3IgKE11bHRpQ2xhc3M6OlJlY29yZFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaSA9IFNNQy0+RGVmUHJvdG90eXBlcy5iZWdpbigpLAorICAgICAgICAgaWVuZCA9IFNNQy0+RGVmUHJvdG90eXBlcy5lbmQoKTsKKyAgICAgICBpICE9IGllbmQ7CisgICAgICAgKytpKSB7CisgICAgLy8gQ2xvbmUgdGhlIGRlZiBhbmQgYWRkIGl0IHRvIHRoZSBjdXJyZW50IG11bHRpY2xhc3MKKyAgICBSZWNvcmQgKk5ld0RlZiA9IG5ldyBSZWNvcmQoKippKTsKKworICAgIC8vIEFkZCBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGUgc3VwZXJjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGRlZi4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTUNWYWxzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoQWRkVmFsdWUoTmV3RGVmLCBTdWJNdWx0aUNsYXNzLlJlZkxvYywgTUNWYWxzW2ldKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBDdXJNQy0+RGVmUHJvdG90eXBlcy5wdXNoX2JhY2soTmV3RGVmKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmU01DVEFyZ3MgPSBTTUMtPlJlYy5nZXRUZW1wbGF0ZUFyZ3MoKTsKKworICAvLyBFbnN1cmUgdGhhdCBhbiBhcHByb3ByaWF0ZSBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGFyZQorICAvLyBzcGVjaWZpZWQuCisgIGlmIChTTUNUQXJncy5zaXplKCkgPCBTdWJNdWx0aUNsYXNzLlRlbXBsYXRlQXJncy5zaXplKCkpCisgICAgcmV0dXJuIEVycm9yKFN1Yk11bHRpQ2xhc3MuUmVmTG9jLAorICAgICAgICAgICAgICAgICAiTW9yZSB0ZW1wbGF0ZSBhcmdzIHNwZWNpZmllZCB0aGFuIGV4cGVjdGVkIik7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdGVtcGxhdGUgYXJndW1lbnRzLCBzZXR0aW5nIHRoZW0gdG8gdGhlIHNwZWNpZmllZAorICAvLyB2YWx1ZSBvciBsZWF2aW5nIHRoZW0gYXMgdGhlIGRlZmF1bHQgaWYgbmVjZXNzYXJ5LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU01DVEFyZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGlmIChpIDwgU3ViTXVsdGlDbGFzcy5UZW1wbGF0ZUFyZ3Muc2l6ZSgpKSB7CisgICAgICAvLyBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgdGhpcyB0ZW1wbGF0ZSBhcmcsIHNldCBpdCBpbiB0aGUKKyAgICAgIC8vIHN1cGVyY2xhc3Mgbm93LgorICAgICAgaWYgKFNldFZhbHVlKEN1clJlYywgU3ViTXVsdGlDbGFzcy5SZWZMb2MsIFNNQ1RBcmdzW2ldLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPigpLAorICAgICAgICAgICAgICAgICAgIFN1Yk11bHRpQ2xhc3MuVGVtcGxhdGVBcmdzW2ldKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIFJlc29sdmUgaXQgbmV4dC4KKyAgICAgIEN1clJlYy0+cmVzb2x2ZVJlZmVyZW5jZXNUbyhDdXJSZWMtPmdldFZhbHVlKFNNQ1RBcmdzW2ldKSk7CisKKyAgICAgIC8vIE5vdyByZW1vdmUgaXQuCisgICAgICBDdXJSZWMtPnJlbW92ZVZhbHVlKFNNQ1RBcmdzW2ldKTsKKworICAgICAgLy8gSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIHRoaXMgdGVtcGxhdGUgYXJnLCBzZXQgaXQgaW4gdGhlCisgICAgICAvLyBuZXcgZGVmcyBub3cuCisgICAgICBmb3IgKE11bHRpQ2xhc3M6OlJlY29yZFZlY3Rvcjo6aXRlcmF0b3IgaiA9CisgICAgICAgICAgICAgQ3VyTUMtPkRlZlByb3RvdHlwZXMuYmVnaW4oKSArIG5ld0RlZlN0YXJ0LAorICAgICAgICAgICAgIGplbmQgPSBDdXJNQy0+RGVmUHJvdG90eXBlcy5lbmQoKTsKKyAgICAgICAgICAgaiAhPSBqZW5kOworICAgICAgICAgICArK2opIHsKKyAgICAgICAgUmVjb3JkICpEZWYgPSAqajsKKworICAgICAgICBpZiAoU2V0VmFsdWUoRGVmLCBTdWJNdWx0aUNsYXNzLlJlZkxvYywgU01DVEFyZ3NbaV0sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKSwKKyAgICAgICAgICAgICAgICAgICAgIFN1Yk11bHRpQ2xhc3MuVGVtcGxhdGVBcmdzW2ldKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBSZXNvbHZlIGl0IG5leHQuCisgICAgICAgIERlZi0+cmVzb2x2ZVJlZmVyZW5jZXNUbyhEZWYtPmdldFZhbHVlKFNNQ1RBcmdzW2ldKSk7CisKKyAgICAgICAgLy8gTm93IHJlbW92ZSBpdAorICAgICAgICBEZWYtPnJlbW92ZVZhbHVlKFNNQ1RBcmdzW2ldKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFDdXJSZWMtPmdldFZhbHVlKFNNQ1RBcmdzW2ldKS0+Z2V0VmFsdWUoKS0+aXNDb21wbGV0ZSgpKSB7CisgICAgICByZXR1cm4gRXJyb3IoU3ViTXVsdGlDbGFzcy5SZWZMb2MsCisgICAgICAgICAgICAgICAgICAgIlZhbHVlIG5vdCBzcGVjaWZpZWQgZm9yIHRlbXBsYXRlIGFyZ3VtZW50ICMiCisgICAgICAgICAgICAgICAgICAgKyB1dG9zdHIoaSkgKyAiICgiICsgU01DVEFyZ3NbaV0gKyAiKSBvZiBzdWJjbGFzcyAnIiArCisgICAgICAgICAgICAgICAgICAgU01DLT5SZWMuZ2V0TmFtZSgpICsgIichIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFyc2VyIENvZGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBpc09iamVjdFN0YXJ0IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIGZpcnN0IHRva2VuIGZvciBhbiBPYmplY3QuCitzdGF0aWMgYm9vbCBpc09iamVjdFN0YXJ0KHRndG9rOjpUb2tLaW5kIEspIHsKKyAgcmV0dXJuIEsgPT0gdGd0b2s6OkNsYXNzIHx8IEsgPT0gdGd0b2s6OkRlZiB8fAorICAgICAgICAgSyA9PSB0Z3Rvazo6RGVmbSB8fCBLID09IHRndG9rOjpMZXQgfHwgSyA9PSB0Z3Rvazo6TXVsdGlDbGFzczsKK30KKworLy8vIFBhcnNlT2JqZWN0TmFtZSAtIElmIGFuIG9iamVjdCBuYW1lIGlzIHNwZWNpZmllZCwgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLAorLy8vIHJldHVybiBhbiBhbm9ueW1vdXMgbmFtZS4KKy8vLyAgIE9iamVjdE5hbWUgOjo9IElECisvLy8gICBPYmplY3ROYW1lIDo6PSAvKmVtcHR5Ki8KKy8vLworc3RkOjpzdHJpbmcgVEdQYXJzZXI6OlBhcnNlT2JqZWN0TmFtZSgpIHsKKyAgaWYgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OklkKSB7CisgICAgc3RkOjpzdHJpbmcgUmV0ID0gTGV4LmdldEN1clN0clZhbCgpOworICAgIExleC5MZXgoKTsKKyAgICByZXR1cm4gUmV0OworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIEFub25Db3VudGVyID0gMDsKKyAgcmV0dXJuICJhbm9ueW1vdXMuIit1dG9zdHIoQW5vbkNvdW50ZXIrKyk7Cit9CisKKworLy8vIFBhcnNlQ2xhc3NJRCAtIFBhcnNlIGFuZCByZXNvbHZlIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3MgbmFtZS4gIFRoaXMgcmV0dXJucworLy8vIG51bGwgb24gZXJyb3IuCisvLy8KKy8vLyAgICBDbGFzc0lEIDo6PSBJRAorLy8vCitSZWNvcmQgKlRHUGFyc2VyOjpQYXJzZUNsYXNzSUQoKSB7CisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpJZCkgeworICAgIFRva0Vycm9yKCJleHBlY3RlZCBuYW1lIGZvciBDbGFzc0lEIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBSZWNvcmQgKlJlc3VsdCA9IFJlY29yZHMuZ2V0Q2xhc3MoTGV4LmdldEN1clN0clZhbCgpKTsKKyAgaWYgKFJlc3VsdCA9PSAwKQorICAgIFRva0Vycm9yKCJDb3VsZG4ndCBmaW5kIGNsYXNzICciICsgTGV4LmdldEN1clN0clZhbCgpICsgIiciKTsKKworICBMZXguTGV4KCk7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBQYXJzZU11bHRpQ2xhc3NJRCAtIFBhcnNlIGFuZCByZXNvbHZlIGEgcmVmZXJlbmNlIHRvIGEgbXVsdGljbGFzcyBuYW1lLgorLy8vIFRoaXMgcmV0dXJucyBudWxsIG9uIGVycm9yLgorLy8vCisvLy8gICAgTXVsdGlDbGFzc0lEIDo6PSBJRAorLy8vCitNdWx0aUNsYXNzICpUR1BhcnNlcjo6UGFyc2VNdWx0aUNsYXNzSUQoKSB7CisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpJZCkgeworICAgIFRva0Vycm9yKCJleHBlY3RlZCBuYW1lIGZvciBDbGFzc0lEIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBNdWx0aUNsYXNzICpSZXN1bHQgPSBNdWx0aUNsYXNzZXNbTGV4LmdldEN1clN0clZhbCgpXTsKKyAgaWYgKFJlc3VsdCA9PSAwKQorICAgIFRva0Vycm9yKCJDb3VsZG4ndCBmaW5kIGNsYXNzICciICsgTGV4LmdldEN1clN0clZhbCgpICsgIiciKTsKKworICBMZXguTGV4KCk7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK1JlY29yZCAqVEdQYXJzZXI6OlBhcnNlRGVmbUlEKCkgeworICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6SWQpIHsKKyAgICBUb2tFcnJvcigiZXhwZWN0ZWQgbXVsdGljbGFzcyBuYW1lIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBNdWx0aUNsYXNzICpNQyA9IE11bHRpQ2xhc3Nlc1tMZXguZ2V0Q3VyU3RyVmFsKCldOworICBpZiAoTUMgPT0gMCkgeworICAgIFRva0Vycm9yKCJDb3VsZG4ndCBmaW5kIG11bHRpY2xhc3MgJyIgKyBMZXguZ2V0Q3VyU3RyVmFsKCkgKyAiJyIpOworICAgIHJldHVybiAwOworICB9CisKKyAgTGV4LkxleCgpOworICByZXR1cm4gJk1DLT5SZWM7Cit9CisKKworLy8vIFBhcnNlU3ViQ2xhc3NSZWZlcmVuY2UgLSBQYXJzZSBhIHJlZmVyZW5jZSB0byBhIHN1YmNsYXNzIG9yIHRvIGEgdGVtcGxhdGVkCisvLy8gc3ViY2xhc3MuICBUaGlzIHJldHVybnMgYSBTdWJDbGFzc1JlZlR5IHdpdGggYSBudWxsIFJlY29yZCogb24gZXJyb3IuCisvLy8KKy8vLyAgU3ViQ2xhc3NSZWYgOjo9IENsYXNzSUQKKy8vLyAgU3ViQ2xhc3NSZWYgOjo9IENsYXNzSUQgJzwnIFZhbHVlTGlzdCAnPicKKy8vLworU3ViQ2xhc3NSZWZlcmVuY2UgVEdQYXJzZXI6OgorUGFyc2VTdWJDbGFzc1JlZmVyZW5jZShSZWNvcmQgKkN1clJlYywgYm9vbCBpc0RlZm0pIHsKKyAgU3ViQ2xhc3NSZWZlcmVuY2UgUmVzdWx0OworICBSZXN1bHQuUmVmTG9jID0gTGV4LmdldExvYygpOworCisgIGlmIChpc0RlZm0pCisgICAgUmVzdWx0LlJlYyA9IFBhcnNlRGVmbUlEKCk7CisgIGVsc2UKKyAgICBSZXN1bHQuUmVjID0gUGFyc2VDbGFzc0lEKCk7CisgIGlmIChSZXN1bHQuUmVjID09IDApIHJldHVybiBSZXN1bHQ7CisKKyAgLy8gSWYgdGhlcmUgaXMgbm8gdGVtcGxhdGUgYXJnIGxpc3QsIHdlJ3JlIGRvbmUuCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpsZXNzKQorICAgIHJldHVybiBSZXN1bHQ7CisgIExleC5MZXgoKTsgIC8vIEVhdCB0aGUgJzwnCisKKyAgaWYgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OmdyZWF0ZXIpIHsKKyAgICBUb2tFcnJvcigic3ViY2xhc3MgcmVmZXJlbmNlIHJlcXVpcmVzIGEgbm9uLWVtcHR5IGxpc3Qgb2YgdGVtcGxhdGUgdmFsdWVzIik7CisgICAgUmVzdWx0LlJlYyA9IDA7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIFJlc3VsdC5UZW1wbGF0ZUFyZ3MgPSBQYXJzZVZhbHVlTGlzdChDdXJSZWMsIFJlc3VsdC5SZWMpOworICBpZiAoUmVzdWx0LlRlbXBsYXRlQXJncy5lbXB0eSgpKSB7CisgICAgUmVzdWx0LlJlYyA9IDA7ICAgLy8gRXJyb3IgcGFyc2luZyB2YWx1ZSBsaXN0LgorICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6Z3JlYXRlcikgeworICAgIFRva0Vycm9yKCJleHBlY3RlZCAnPicgaW4gdGVtcGxhdGUgdmFsdWUgbGlzdCIpOworICAgIFJlc3VsdC5SZWMgPSAwOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKyAgTGV4LkxleCgpOworCisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBQYXJzZVN1Yk11bHRpQ2xhc3NSZWZlcmVuY2UgLSBQYXJzZSBhIHJlZmVyZW5jZSB0byBhIHN1YmNsYXNzIG9yIHRvIGEKKy8vLyB0ZW1wbGF0ZWQgc3VibXVsdGljbGFzcy4gIFRoaXMgcmV0dXJucyBhIFN1Yk11bHRpQ2xhc3NSZWZUeSB3aXRoIGEgbnVsbAorLy8vIFJlY29yZCogb24gZXJyb3IuCisvLy8KKy8vLyAgU3ViTXVsdGlDbGFzc1JlZiA6Oj0gTXVsdGlDbGFzc0lECisvLy8gIFN1Yk11bHRpQ2xhc3NSZWYgOjo9IE11bHRpQ2xhc3NJRCAnPCcgVmFsdWVMaXN0ICc+JworLy8vCitTdWJNdWx0aUNsYXNzUmVmZXJlbmNlIFRHUGFyc2VyOjoKK1BhcnNlU3ViTXVsdGlDbGFzc1JlZmVyZW5jZShNdWx0aUNsYXNzICpDdXJNQykgeworICBTdWJNdWx0aUNsYXNzUmVmZXJlbmNlIFJlc3VsdDsKKyAgUmVzdWx0LlJlZkxvYyA9IExleC5nZXRMb2MoKTsKKworICBSZXN1bHQuTUMgPSBQYXJzZU11bHRpQ2xhc3NJRCgpOworICBpZiAoUmVzdWx0Lk1DID09IDApIHJldHVybiBSZXN1bHQ7CisKKyAgLy8gSWYgdGhlcmUgaXMgbm8gdGVtcGxhdGUgYXJnIGxpc3QsIHdlJ3JlIGRvbmUuCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpsZXNzKQorICAgIHJldHVybiBSZXN1bHQ7CisgIExleC5MZXgoKTsgIC8vIEVhdCB0aGUgJzwnCisKKyAgaWYgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OmdyZWF0ZXIpIHsKKyAgICBUb2tFcnJvcigic3ViY2xhc3MgcmVmZXJlbmNlIHJlcXVpcmVzIGEgbm9uLWVtcHR5IGxpc3Qgb2YgdGVtcGxhdGUgdmFsdWVzIik7CisgICAgUmVzdWx0Lk1DID0gMDsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgUmVzdWx0LlRlbXBsYXRlQXJncyA9IFBhcnNlVmFsdWVMaXN0KCZDdXJNQy0+UmVjLCAmUmVzdWx0Lk1DLT5SZWMpOworICBpZiAoUmVzdWx0LlRlbXBsYXRlQXJncy5lbXB0eSgpKSB7CisgICAgUmVzdWx0Lk1DID0gMDsgICAvLyBFcnJvciBwYXJzaW5nIHZhbHVlIGxpc3QuCisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpncmVhdGVyKSB7CisgICAgVG9rRXJyb3IoImV4cGVjdGVkICc+JyBpbiB0ZW1wbGF0ZSB2YWx1ZSBsaXN0Iik7CisgICAgUmVzdWx0Lk1DID0gMDsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisgIExleC5MZXgoKTsKKworICByZXR1cm4gUmVzdWx0OworfQorCisvLy8gUGFyc2VSYW5nZVBpZWNlIC0gUGFyc2UgYSBiaXQvdmFsdWUgcmFuZ2UuCisvLy8gICBSYW5nZVBpZWNlIDo6PSBJTlRWQUwKKy8vLyAgIFJhbmdlUGllY2UgOjo9IElOVFZBTCAnLScgSU5UVkFMCisvLy8gICBSYW5nZVBpZWNlIDo6PSBJTlRWQUwgSU5UVkFMCitib29sIFRHUGFyc2VyOjpQYXJzZVJhbmdlUGllY2Uoc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZSYW5nZXMpIHsKKyAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OkludFZhbCkgeworICAgIFRva0Vycm9yKCJleHBlY3RlZCBpbnRlZ2VyIG9yIGJpdHJhbmdlIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaW50NjRfdCBTdGFydCA9IExleC5nZXRDdXJJbnRWYWwoKTsKKyAgaW50NjRfdCBFbmQ7CisKKyAgaWYgKFN0YXJ0IDwgMCkKKyAgICByZXR1cm4gVG9rRXJyb3IoImludmFsaWQgcmFuZ2UsIGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworCisgIHN3aXRjaCAoTGV4LkxleCgpKSB7ICAvLyBlYXQgZmlyc3QgY2hhcmFjdGVyLgorICBkZWZhdWx0OgorICAgIFJhbmdlcy5wdXNoX2JhY2soU3RhcnQpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSB0Z3Rvazo6bWludXM6CisgICAgaWYgKExleC5MZXgoKSAhPSB0Z3Rvazo6SW50VmFsKSB7CisgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgaW50ZWdlciB2YWx1ZSBhcyBlbmQgb2YgcmFuZ2UiKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBFbmQgPSBMZXguZ2V0Q3VySW50VmFsKCk7CisgICAgYnJlYWs7CisgIGNhc2UgdGd0b2s6OkludFZhbDoKKyAgICBFbmQgPSAtTGV4LmdldEN1ckludFZhbCgpOworICAgIGJyZWFrOworICB9CisgIGlmIChFbmQgPCAwKQorICAgIHJldHVybiBUb2tFcnJvcigiaW52YWxpZCByYW5nZSwgY2Fubm90IGJlIG5lZ2F0aXZlIik7CisgIExleC5MZXgoKTsKKworICAvLyBBZGQgdG8gdGhlIHJhbmdlLgorICBpZiAoU3RhcnQgPCBFbmQpIHsKKyAgICBmb3IgKDsgU3RhcnQgPD0gRW5kOyArK1N0YXJ0KQorICAgICAgUmFuZ2VzLnB1c2hfYmFjayhTdGFydCk7CisgIH0gZWxzZSB7CisgICAgZm9yICg7IFN0YXJ0ID49IEVuZDsgLS1TdGFydCkKKyAgICAgIFJhbmdlcy5wdXNoX2JhY2soU3RhcnQpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlUmFuZ2VMaXN0IC0gUGFyc2UgYSBsaXN0IG9mIHNjYWxhcnMgYW5kIHJhbmdlcyBpbnRvIHNjYWxhciB2YWx1ZXMuCisvLy8KKy8vLyAgIFJhbmdlTGlzdCA6Oj0gUmFuZ2VQaWVjZSAoJywnIFJhbmdlUGllY2UpKgorLy8vCitzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gVEdQYXJzZXI6OlBhcnNlUmFuZ2VMaXN0KCkgeworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUmVzdWx0OworCisgIC8vIFBhcnNlIHRoZSBmaXJzdCBwaWVjZS4KKyAgaWYgKFBhcnNlUmFuZ2VQaWVjZShSZXN1bHQpKQorICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKKyAgd2hpbGUgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OmNvbW1hKSB7CisgICAgTGV4LkxleCgpOyAgLy8gRWF0IHRoZSBjb21tYS4KKworICAgIC8vIFBhcnNlIHRoZSBuZXh0IHJhbmdlIHBpZWNlLgorICAgIGlmIChQYXJzZVJhbmdlUGllY2UoUmVzdWx0KSkKKyAgICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4oKTsKKyAgfQorICByZXR1cm4gUmVzdWx0OworfQorCisvLy8gUGFyc2VPcHRpb25hbFJhbmdlTGlzdCAtIFBhcnNlIGVpdGhlciBhIHJhbmdlIGxpc3QgaW4gPD4ncyBvciBub3RoaW5nLgorLy8vICAgT3B0aW9uYWxSYW5nZUxpc3QgOjo9ICc8JyBSYW5nZUxpc3QgJz4nCisvLy8gICBPcHRpb25hbFJhbmdlTGlzdCA6Oj0gLyplbXB0eSovCitib29sIFRHUGFyc2VyOjpQYXJzZU9wdGlvbmFsUmFuZ2VMaXN0KHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmUmFuZ2VzKSB7CisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpsZXNzKQorICAgIHJldHVybiBmYWxzZTsKKworICBTTUxvYyBTdGFydExvYyA9IExleC5nZXRMb2MoKTsKKyAgTGV4LkxleCgpOyAvLyBlYXQgdGhlICc8JworCisgIC8vIFBhcnNlIHRoZSByYW5nZSBsaXN0LgorICBSYW5nZXMgPSBQYXJzZVJhbmdlTGlzdCgpOworICBpZiAoUmFuZ2VzLmVtcHR5KCkpIHJldHVybiB0cnVlOworCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpncmVhdGVyKSB7CisgICAgVG9rRXJyb3IoImV4cGVjdGVkICc+JyBhdCBlbmQgb2YgcmFuZ2UgbGlzdCIpOworICAgIHJldHVybiBFcnJvcihTdGFydExvYywgInRvIG1hdGNoIHRoaXMgJzwnIik7CisgIH0KKyAgTGV4LkxleCgpOyAgIC8vIGVhdCB0aGUgJz4nLgorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZU9wdGlvbmFsQml0TGlzdCAtIFBhcnNlIGVpdGhlciBhIGJpdCBsaXN0IGluIHt9J3Mgb3Igbm90aGluZy4KKy8vLyAgIE9wdGlvbmFsQml0TGlzdCA6Oj0gJ3snIFJhbmdlTGlzdCAnfScKKy8vLyAgIE9wdGlvbmFsQml0TGlzdCA6Oj0gLyplbXB0eSovCitib29sIFRHUGFyc2VyOjpQYXJzZU9wdGlvbmFsQml0TGlzdChzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJlJhbmdlcykgeworICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6bF9icmFjZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU01Mb2MgU3RhcnRMb2MgPSBMZXguZ2V0TG9jKCk7CisgIExleC5MZXgoKTsgLy8gZWF0IHRoZSAneycKKworICAvLyBQYXJzZSB0aGUgcmFuZ2UgbGlzdC4KKyAgUmFuZ2VzID0gUGFyc2VSYW5nZUxpc3QoKTsKKyAgaWYgKFJhbmdlcy5lbXB0eSgpKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6cl9icmFjZSkgeworICAgIFRva0Vycm9yKCJleHBlY3RlZCAnfScgYXQgZW5kIG9mIGJpdCBsaXN0Iik7CisgICAgcmV0dXJuIEVycm9yKFN0YXJ0TG9jLCAidG8gbWF0Y2ggdGhpcyAneyciKTsKKyAgfQorICBMZXguTGV4KCk7ICAgLy8gZWF0IHRoZSAnfScuCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gUGFyc2VUeXBlIC0gUGFyc2UgYW5kIHJldHVybiBhIHRibGdlbiB0eXBlLiAgVGhpcyByZXR1cm5zIG51bGwgb24gZXJyb3IuCisvLy8KKy8vLyAgIFR5cGUgOjo9IFNUUklORyAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHR5cGUKKy8vLyAgIFR5cGUgOjo9IEJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0IHR5cGUKKy8vLyAgIFR5cGUgOjo9IEJJVFMgJzwnIElOVFZBTCAnPicgICAgICAgICAgLy8gYml0czx4PiB0eXBlCisvLy8gICBUeXBlIDo6PSBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludCB0eXBlCisvLy8gICBUeXBlIDo6PSBMSVNUICc8JyBUeXBlICc+JyAgICAgICAgICAgIC8vIGxpc3Q8eD4gdHlwZQorLy8vICAgVHlwZSA6Oj0gQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIHR5cGUKKy8vLyAgIFR5cGUgOjo9IERBRyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGFnIHR5cGUKKy8vLyAgIFR5cGUgOjo9IENsYXNzSUQgICAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3JkIFR5cGUKKy8vLworUmVjVHkgKlRHUGFyc2VyOjpQYXJzZVR5cGUoKSB7CisgIHN3aXRjaCAoTGV4LmdldENvZGUoKSkgeworICBkZWZhdWx0OiBUb2tFcnJvcigiVW5rbm93biB0b2tlbiB3aGVuIGV4cGVjdGluZyBhIHR5cGUiKTsgcmV0dXJuIDA7CisgIGNhc2UgdGd0b2s6OlN0cmluZzogTGV4LkxleCgpOyByZXR1cm4gbmV3IFN0cmluZ1JlY1R5KCk7CisgIGNhc2UgdGd0b2s6OkJpdDogICAgTGV4LkxleCgpOyByZXR1cm4gbmV3IEJpdFJlY1R5KCk7CisgIGNhc2UgdGd0b2s6OkludDogICAgTGV4LkxleCgpOyByZXR1cm4gbmV3IEludFJlY1R5KCk7CisgIGNhc2UgdGd0b2s6OkNvZGU6ICAgTGV4LkxleCgpOyByZXR1cm4gbmV3IENvZGVSZWNUeSgpOworICBjYXNlIHRndG9rOjpEYWc6ICAgIExleC5MZXgoKTsgcmV0dXJuIG5ldyBEYWdSZWNUeSgpOworICBjYXNlIHRndG9rOjpJZDoKKyAgICBpZiAoUmVjb3JkICpSID0gUGFyc2VDbGFzc0lEKCkpIHJldHVybiBuZXcgUmVjb3JkUmVjVHkoUik7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgdGd0b2s6OkJpdHM6IHsKKyAgICBpZiAoTGV4LkxleCgpICE9IHRndG9rOjpsZXNzKSB7IC8vIEVhdCAnYml0cycKKyAgICAgIFRva0Vycm9yKCJleHBlY3RlZCAnPCcgYWZ0ZXIgYml0cyB0eXBlIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKExleC5MZXgoKSAhPSB0Z3Rvazo6SW50VmFsKSB7ICAvLyBFYXQgJzwnCisgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgaW50ZWdlciBpbiBiaXRzPG4+IHR5cGUiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB1aW50NjRfdCBWYWwgPSBMZXguZ2V0Q3VySW50VmFsKCk7CisgICAgaWYgKExleC5MZXgoKSAhPSB0Z3Rvazo6Z3JlYXRlcikgeyAgLy8gRWF0IGNvdW50LgorICAgICAgVG9rRXJyb3IoImV4cGVjdGVkICc+JyBhdCBlbmQgb2YgYml0czxuPiB0eXBlIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gRWF0ICc+JworICAgIHJldHVybiBuZXcgQml0c1JlY1R5KFZhbCk7CisgIH0KKyAgY2FzZSB0Z3Rvazo6TGlzdDogeworICAgIGlmIChMZXguTGV4KCkgIT0gdGd0b2s6Omxlc3MpIHsgLy8gRWF0ICdiaXRzJworICAgICAgVG9rRXJyb3IoImV4cGVjdGVkICc8JyBhZnRlciBsaXN0IHR5cGUiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBMZXguTGV4KCk7ICAvLyBFYXQgJzwnCisgICAgUmVjVHkgKlN1YlR5cGUgPSBQYXJzZVR5cGUoKTsKKyAgICBpZiAoU3ViVHlwZSA9PSAwKSByZXR1cm4gMDsKKworICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpncmVhdGVyKSB7CisgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgJz4nIGF0IGVuZCBvZiBsaXN0PHR5PiB0eXBlIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gRWF0ICc+JworICAgIHJldHVybiBuZXcgTGlzdFJlY1R5KFN1YlR5cGUpOworICB9CisgIH0KK30KKworLy8vIFBhcnNlSURWYWx1ZSAtIFBhcnNlIGFuIElEIGFzIGEgdmFsdWUgYW5kIGRlY29kZSB3aGF0IGl0IG1lYW5zLgorLy8vCisvLy8gIElEVmFsdWUgOjo9IElEIFtkZWYgbG9jYWwgdmFsdWVdCisvLy8gIElEVmFsdWUgOjo9IElEIFtkZWYgdGVtcGxhdGUgYXJnXQorLy8vICBJRFZhbHVlIDo6PSBJRCBbbXVsdGljbGFzcyBsb2NhbCB2YWx1ZV0KKy8vLyAgSURWYWx1ZSA6Oj0gSUQgW211bHRpY2xhc3MgdGVtcGxhdGUgYXJndW1lbnRdCisvLy8gIElEVmFsdWUgOjo9IElEIFtkZWYgbmFtZV0KKy8vLworSW5pdCAqVEdQYXJzZXI6OlBhcnNlSURWYWx1ZShSZWNvcmQgKkN1clJlYykgeworICBhc3NlcnQoTGV4LmdldENvZGUoKSA9PSB0Z3Rvazo6SWQgJiYgIkV4cGVjdGVkIElEIGluIFBhcnNlSURWYWx1ZSIpOworICBzdGQ6OnN0cmluZyBOYW1lID0gTGV4LmdldEN1clN0clZhbCgpOworICBTTUxvYyBMb2MgPSBMZXguZ2V0TG9jKCk7CisgIExleC5MZXgoKTsKKyAgcmV0dXJuIFBhcnNlSURWYWx1ZShDdXJSZWMsIE5hbWUsIExvYyk7Cit9CisKKy8vLyBQYXJzZUlEVmFsdWUgLSBUaGlzIGlzIGp1c3QgbGlrZSBQYXJzZUlEVmFsdWUgYWJvdmUsIGJ1dCBpdCBhc3N1bWVzIHRoZSBJRAorLy8vIGhhcyBhbHJlYWR5IGJlZW4gcmVhZC4KK0luaXQgKlRHUGFyc2VyOjpQYXJzZUlEVmFsdWUoUmVjb3JkICpDdXJSZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBTTUxvYyBOYW1lTG9jKSB7CisgIGlmIChDdXJSZWMpIHsKKyAgICBpZiAoY29uc3QgUmVjb3JkVmFsICpSViA9IEN1clJlYy0+Z2V0VmFsdWUoTmFtZSkpCisgICAgICByZXR1cm4gbmV3IFZhckluaXQoTmFtZSwgUlYtPmdldFR5cGUoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBUZW1wbGF0ZUFyZ05hbWUgPSBDdXJSZWMtPmdldE5hbWUoKSsiOiIrTmFtZTsKKyAgICBpZiAoQ3VyUmVjLT5pc1RlbXBsYXRlQXJnKFRlbXBsYXRlQXJnTmFtZSkpIHsKKyAgICAgIGNvbnN0IFJlY29yZFZhbCAqUlYgPSBDdXJSZWMtPmdldFZhbHVlKFRlbXBsYXRlQXJnTmFtZSk7CisgICAgICBhc3NlcnQoUlYgJiYgIlRlbXBsYXRlIGFyZyBkb2Vzbid0IGV4aXN0Pz8iKTsKKyAgICAgIHJldHVybiBuZXcgVmFySW5pdChUZW1wbGF0ZUFyZ05hbWUsIFJWLT5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCisgIGlmIChDdXJNdWx0aUNsYXNzKSB7CisgICAgc3RkOjpzdHJpbmcgTUNOYW1lID0gQ3VyTXVsdGlDbGFzcy0+UmVjLmdldE5hbWUoKSsiOjoiK05hbWU7CisgICAgaWYgKEN1ck11bHRpQ2xhc3MtPlJlYy5pc1RlbXBsYXRlQXJnKE1DTmFtZSkpIHsKKyAgICAgIGNvbnN0IFJlY29yZFZhbCAqUlYgPSBDdXJNdWx0aUNsYXNzLT5SZWMuZ2V0VmFsdWUoTUNOYW1lKTsKKyAgICAgIGFzc2VydChSViAmJiAiVGVtcGxhdGUgYXJnIGRvZXNuJ3QgZXhpc3Q/PyIpOworICAgICAgcmV0dXJuIG5ldyBWYXJJbml0KE1DTmFtZSwgUlYtPmdldFR5cGUoKSk7CisgICAgfQorICB9CisKKyAgaWYgKFJlY29yZCAqRCA9IFJlY29yZHMuZ2V0RGVmKE5hbWUpKQorICAgIHJldHVybiBuZXcgRGVmSW5pdChEKTsKKworICBFcnJvcihOYW1lTG9jLCAiVmFyaWFibGUgbm90IGRlZmluZWQ6ICciICsgTmFtZSArICInIik7CisgIHJldHVybiAwOworfQorCisvLy8gUGFyc2VPcGVyYXRpb24gLSBQYXJzZSBhbiBvcGVyYXRvci4gIFRoaXMgcmV0dXJucyBudWxsIG9uIGVycm9yLgorLy8vCisvLy8gT3BlcmF0aW9uIDo6PSBYT3BlcmF0b3IgWyc8JyBUeXBlICc+J10gJygnIEFyZ3MgJyknCisvLy8KK0luaXQgKlRHUGFyc2VyOjpQYXJzZU9wZXJhdGlvbihSZWNvcmQgKkN1clJlYykgeworICBzd2l0Y2ggKExleC5nZXRDb2RlKCkpIHsKKyAgZGVmYXVsdDoKKyAgICBUb2tFcnJvcigidW5rbm93biBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgY2FzZSB0Z3Rvazo6WENhcjoKKyAgY2FzZSB0Z3Rvazo6WENkcjoKKyAgY2FzZSB0Z3Rvazo6WE51bGw6CisgIGNhc2UgdGd0b2s6OlhDYXN0OiB7ICAvLyBWYWx1ZSA6Oj0gIXVub3AgJygnIFZhbHVlICcpJworICAgIFVuT3BJbml0OjpVbmFyeU9wIENvZGU7CisgICAgUmVjVHkgKlR5cGUgPSAwOworCisgICAgc3dpdGNoIChMZXguZ2V0Q29kZSgpKSB7CisgICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVuaGFuZGxlZCBjb2RlISIpOworICAgIGNhc2UgdGd0b2s6OlhDYXN0OgorICAgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSBvcGVyYXRpb24KKyAgICAgIENvZGUgPSBVbk9wSW5pdDo6Q0FTVDsKKworICAgICAgVHlwZSA9IFBhcnNlT3BlcmF0b3JUeXBlKCk7CisKKyAgICAgIGlmIChUeXBlID09IDApIHsKKyAgICAgICAgVG9rRXJyb3IoImRpZCBub3QgZ2V0IHR5cGUgZm9yIHVuYXJ5IG9wZXJhdG9yIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBicmVhazsKKyAgICBjYXNlIHRndG9rOjpYQ2FyOgorICAgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSBvcGVyYXRpb24KKyAgICAgIENvZGUgPSBVbk9wSW5pdDo6Q0FSOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0Z3Rvazo6WENkcjoKKyAgICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgb3BlcmF0aW9uCisgICAgICBDb2RlID0gVW5PcEluaXQ6OkNEUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdGd0b2s6OlhOdWxsOgorICAgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSBvcGVyYXRpb24KKyAgICAgIENvZGUgPSBVbk9wSW5pdDo6TE5VTEw7CisgICAgICBUeXBlID0gbmV3IEludFJlY1R5OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpsX3BhcmVuKSB7CisgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgJygnIGFmdGVyIHVuYXJ5IG9wZXJhdG9yIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnKCcKKworICAgIEluaXQgKkxIUyA9IFBhcnNlVmFsdWUoQ3VyUmVjKTsKKyAgICBpZiAoTEhTID09IDApIHJldHVybiAwOworCisgICAgaWYgKENvZGUgPT0gVW5PcEluaXQ6OkNBUgorICAgICAgICB8fCBDb2RlID09IFVuT3BJbml0OjpDRFIKKyAgICAgICAgfHwgQ29kZSA9PSBVbk9wSW5pdDo6TE5VTEwpIHsKKyAgICAgIExpc3RJbml0ICpMSFNsID0gZHluYW1pY19jYXN0PExpc3RJbml0Kj4oTEhTKTsKKyAgICAgIFN0cmluZ0luaXQgKkxIU3MgPSBkeW5hbWljX2Nhc3Q8U3RyaW5nSW5pdCo+KExIUyk7CisgICAgICBUeXBlZEluaXQgKkxIU3QgPSBkeW5hbWljX2Nhc3Q8VHlwZWRJbml0Kj4oTEhTKTsKKyAgICAgIGlmIChMSFNsID09IDAgJiYgTEhTcyA9PSAwICYmIExIU3QgPT0gMCkgeworICAgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgbGlzdCBvciBzdHJpbmcgdHlwZSBhcmd1bWVudCBpbiB1bmFyeSBvcGVyYXRvciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmIChMSFN0KSB7CisgICAgICAgIExpc3RSZWNUeSAqTFR5cGUgPSBkeW5hbWljX2Nhc3Q8TGlzdFJlY1R5Kj4oTEhTdC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgU3RyaW5nUmVjVHkgKlNUeXBlID0gZHluYW1pY19jYXN0PFN0cmluZ1JlY1R5Kj4oTEhTdC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgaWYgKExUeXBlID09IDAgJiYgU1R5cGUgPT0gMCkgeworICAgICAgICAgIFRva0Vycm9yKCJleHBlY3RlZCBsaXN0IG9yIHN0cmluZyB0eXBlIGFyZ3VtbmV0IGluIHVuYXJ5IG9wZXJhdG9yIik7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKENvZGUgPT0gVW5PcEluaXQ6OkNBUgorICAgICAgICAgIHx8IENvZGUgPT0gVW5PcEluaXQ6OkNEUikgeworICAgICAgICBpZiAoTEhTbCA9PSAwICYmIExIU3QgPT0gMCkgeworICAgICAgICAgIFRva0Vycm9yKCJleHBlY3RlZCBsaXN0IHR5cGUgYXJndW1uZXQgaW4gdW5hcnkgb3BlcmF0b3IiKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMSFNsICYmIExIU2wtPmdldFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgVG9rRXJyb3IoImVtcHR5IGxpc3QgYXJndW1lbnQgaW4gdW5hcnkgb3BlcmF0b3IiKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoTEhTbCkgeworICAgICAgICAgIEluaXQgKkl0ZW0gPSBMSFNsLT5nZXRFbGVtZW50KDApOworICAgICAgICAgIFR5cGVkSW5pdCAqSXRlbXQgPSBkeW5hbWljX2Nhc3Q8VHlwZWRJbml0Kj4oSXRlbSk7CisgICAgICAgICAgaWYgKEl0ZW10ID09IDApIHsKKyAgICAgICAgICAgIFRva0Vycm9yKCJ1bnR5cGVkIGxpc3QgZWxlbWVudCBpbiB1bmFyeSBvcGVyYXRvciIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChDb2RlID09IFVuT3BJbml0OjpDQVIpIHsKKyAgICAgICAgICAgIFR5cGUgPSBJdGVtdC0+Z2V0VHlwZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUeXBlID0gbmV3IExpc3RSZWNUeShJdGVtdC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0KExIU3QgJiYgImV4cGVjdGVkIGxpc3QgdHlwZSBhcmd1bWVudCBpbiB1bmFyeSBvcGVyYXRvciIpOworICAgICAgICAgIExpc3RSZWNUeSAqTFR5cGUgPSBkeW5hbWljX2Nhc3Q8TGlzdFJlY1R5Kj4oTEhTdC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICBpZiAoTFR5cGUgPT0gMCkgeworICAgICAgICAgICAgVG9rRXJyb3IoImV4cGVjdGVkIGxpc3QgdHlwZSBhcmd1bW5ldCBpbiB1bmFyeSBvcGVyYXRvciIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChDb2RlID09IFVuT3BJbml0OjpDQVIpIHsKKyAgICAgICAgICAgIFR5cGUgPSBMVHlwZS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVHlwZSA9IExUeXBlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpyX3BhcmVuKSB7CisgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgJyknIGluIHVuYXJ5IG9wZXJhdG9yIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnKScKKyAgICByZXR1cm4gKG5ldyBVbk9wSW5pdChDb2RlLCBMSFMsIFR5cGUpKS0+Rm9sZChDdXJSZWMsIEN1ck11bHRpQ2xhc3MpOworICB9CisKKyAgY2FzZSB0Z3Rvazo6WENvbmNhdDoKKyAgY2FzZSB0Z3Rvazo6WFNSQToKKyAgY2FzZSB0Z3Rvazo6WFNSTDoKKyAgY2FzZSB0Z3Rvazo6WFNITDoKKyAgY2FzZSB0Z3Rvazo6WEVxOgorICBjYXNlIHRndG9rOjpYU3RyQ29uY2F0OgorICBjYXNlIHRndG9rOjpYTmFtZUNvbmNhdDogeyAgLy8gVmFsdWUgOjo9ICFiaW5vcCAnKCcgVmFsdWUgJywnIFZhbHVlICcpJworICAgIEJpbk9wSW5pdDo6QmluYXJ5T3AgQ29kZTsKKyAgICBSZWNUeSAqVHlwZSA9IDA7CisKKworICAgIHN3aXRjaCAoTGV4LmdldENvZGUoKSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmhhbmRsZWQgY29kZSEiKTsKKyAgICBjYXNlIHRndG9rOjpYQ29uY2F0OgorICAgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSBvcGVyYXRpb24KKyAgICAgIENvZGUgPSBCaW5PcEluaXQ6OkNPTkNBVDsKKyAgICAgIFR5cGUgPSBuZXcgRGFnUmVjVHkoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdGd0b2s6OlhTUkE6CisgICAgICBMZXguTGV4KCk7ICAvLyBlYXQgdGhlIG9wZXJhdGlvbgorICAgICAgQ29kZSA9IEJpbk9wSW5pdDo6U1JBOworICAgICAgVHlwZSA9IG5ldyBJbnRSZWNUeSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0Z3Rvazo6WFNSTDoKKyAgICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgb3BlcmF0aW9uCisgICAgICBDb2RlID0gQmluT3BJbml0OjpTUkw7CisgICAgICBUeXBlID0gbmV3IEludFJlY1R5KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRndG9rOjpYU0hMOgorICAgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSBvcGVyYXRpb24KKyAgICAgIENvZGUgPSBCaW5PcEluaXQ6OlNITDsKKyAgICAgIFR5cGUgPSBuZXcgSW50UmVjVHkoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdGd0b2s6OlhFcTogIAorICAgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSBvcGVyYXRpb24KKyAgICAgIENvZGUgPSBCaW5PcEluaXQ6OkVROworICAgICAgVHlwZSA9IG5ldyBJbnRSZWNUeSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0Z3Rvazo6WFN0ckNvbmNhdDoKKyAgICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgb3BlcmF0aW9uCisgICAgICBDb2RlID0gQmluT3BJbml0OjpTVFJDT05DQVQ7CisgICAgICBUeXBlID0gbmV3IFN0cmluZ1JlY1R5KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRndG9rOjpYTmFtZUNvbmNhdDoKKyAgICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgb3BlcmF0aW9uCisgICAgICBDb2RlID0gQmluT3BJbml0OjpOQU1FQ09OQ0FUOworCisgICAgICBUeXBlID0gUGFyc2VPcGVyYXRvclR5cGUoKTsKKworICAgICAgaWYgKFR5cGUgPT0gMCkgeworICAgICAgICBUb2tFcnJvcigiZGlkIG5vdCBnZXQgdHlwZSBmb3IgYmluYXJ5IG9wZXJhdG9yIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OmxfcGFyZW4pIHsKKyAgICAgIFRva0Vycm9yKCJleHBlY3RlZCAnKCcgYWZ0ZXIgYmluYXJ5IG9wZXJhdG9yIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnKCcKKworICAgIEluaXQgKkxIUyA9IFBhcnNlVmFsdWUoQ3VyUmVjKTsKKyAgICBpZiAoTEhTID09IDApIHJldHVybiAwOworCisgICAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OmNvbW1hKSB7CisgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgJywnIGluIGJpbmFyeSBvcGVyYXRvciIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgJywnCisKKyAgICBJbml0ICpSSFMgPSBQYXJzZVZhbHVlKEN1clJlYyk7CisgICAgaWYgKFJIUyA9PSAwKSByZXR1cm4gMDsKKworICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpyX3BhcmVuKSB7CisgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgJyknIGluIGJpbmFyeSBvcGVyYXRvciIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgJyknCisgICAgcmV0dXJuIChuZXcgQmluT3BJbml0KENvZGUsIExIUywgUkhTLCBUeXBlKSktPkZvbGQoQ3VyUmVjLCBDdXJNdWx0aUNsYXNzKTsKKyAgfQorCisgIGNhc2UgdGd0b2s6OlhJZjoKKyAgY2FzZSB0Z3Rvazo6WEZvckVhY2g6CisgIGNhc2UgdGd0b2s6OlhTdWJzdDogeyAgLy8gVmFsdWUgOjo9ICF0ZXJub3AgJygnIFZhbHVlICcsJyBWYWx1ZSAnLCcgVmFsdWUgJyknCisgICAgVGVybk9wSW5pdDo6VGVybmFyeU9wIENvZGU7CisgICAgUmVjVHkgKlR5cGUgPSAwOworCisKKyAgICB0Z3Rvazo6VG9rS2luZCBMZXhDb2RlID0gTGV4LmdldENvZGUoKTsKKyAgICBMZXguTGV4KCk7ICAvLyBlYXQgdGhlIG9wZXJhdGlvbgorICAgIHN3aXRjaCAoTGV4Q29kZSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmhhbmRsZWQgY29kZSEiKTsKKyAgICBjYXNlIHRndG9rOjpYSWY6CisgICAgICBDb2RlID0gVGVybk9wSW5pdDo6SUY7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRndG9rOjpYRm9yRWFjaDoKKyAgICAgIENvZGUgPSBUZXJuT3BJbml0OjpGT1JFQUNIOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0Z3Rvazo6WFN1YnN0OgorICAgICAgQ29kZSA9IFRlcm5PcEluaXQ6OlNVQlNUOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpsX3BhcmVuKSB7CisgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgJygnIGFmdGVyIHRlcm5hcnkgb3BlcmF0b3IiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBMZXguTGV4KCk7ICAvLyBlYXQgdGhlICcoJworCisgICAgSW5pdCAqTEhTID0gUGFyc2VWYWx1ZShDdXJSZWMpOworICAgIGlmIChMSFMgPT0gMCkgcmV0dXJuIDA7CisKKyAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6Y29tbWEpIHsKKyAgICAgIFRva0Vycm9yKCJleHBlY3RlZCAnLCcgaW4gdGVybmFyeSBvcGVyYXRvciIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgJywnCisKKyAgICBJbml0ICpNSFMgPSBQYXJzZVZhbHVlKEN1clJlYyk7CisgICAgaWYgKE1IUyA9PSAwKSByZXR1cm4gMDsKKworICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpjb21tYSkgeworICAgICAgVG9rRXJyb3IoImV4cGVjdGVkICcsJyBpbiB0ZXJuYXJ5IG9wZXJhdG9yIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnLCcKKworICAgIEluaXQgKlJIUyA9IFBhcnNlVmFsdWUoQ3VyUmVjKTsKKyAgICBpZiAoUkhTID09IDApIHJldHVybiAwOworCisgICAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OnJfcGFyZW4pIHsKKyAgICAgIFRva0Vycm9yKCJleHBlY3RlZCAnKScgaW4gYmluYXJ5IG9wZXJhdG9yIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnKScKKworICAgIHN3aXRjaCAoTGV4Q29kZSkgeworICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmhhbmRsZWQgY29kZSEiKTsKKyAgICBjYXNlIHRndG9rOjpYSWY6IHsKKyAgICAgIFR5cGVkSW5pdCAqTUhTdCA9IGR5bmFtaWNfY2FzdDxUeXBlZEluaXQgKj4oTUhTKTsKKyAgICAgIFR5cGVkSW5pdCAqUkhTdCA9IGR5bmFtaWNfY2FzdDxUeXBlZEluaXQgKj4oUkhTKTsKKyAgICAgIGlmIChNSFN0ID09IDAgfHwgUkhTdCA9PSAwKSB7CisgICAgICAgIFRva0Vycm9yKCJjb3VsZCBub3QgZ2V0IHR5cGUgZm9yICFpZiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmIChNSFN0LT5nZXRUeXBlKCktPnR5cGVJc0NvbnZlcnRpYmxlVG8oUkhTdC0+Z2V0VHlwZSgpKSkgeworICAgICAgICBUeXBlID0gUkhTdC0+Z2V0VHlwZSgpOworICAgICAgfSBlbHNlIGlmIChSSFN0LT5nZXRUeXBlKCktPnR5cGVJc0NvbnZlcnRpYmxlVG8oTUhTdC0+Z2V0VHlwZSgpKSkgeworICAgICAgICBUeXBlID0gTUhTdC0+Z2V0VHlwZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVG9rRXJyb3IoImluY29uc2lzdGVudCB0eXBlcyBmb3IgIWlmIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgdGd0b2s6OlhGb3JFYWNoOiB7CisgICAgICBUeXBlZEluaXQgKk1IU3QgPSBkeW5hbWljX2Nhc3Q8VHlwZWRJbml0ICo+KE1IUyk7CisgICAgICBpZiAoTUhTdCA9PSAwKSB7CisgICAgICAgIFRva0Vycm9yKCJjb3VsZCBub3QgZ2V0IHR5cGUgZm9yICFmb3JlYWNoIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgVHlwZSA9IE1IU3QtPmdldFR5cGUoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIHRndG9rOjpYU3Vic3Q6IHsKKyAgICAgIFR5cGVkSW5pdCAqUkhTdCA9IGR5bmFtaWNfY2FzdDxUeXBlZEluaXQgKj4oUkhTKTsKKyAgICAgIGlmIChSSFN0ID09IDApIHsKKyAgICAgICAgVG9rRXJyb3IoImNvdWxkIG5vdCBnZXQgdHlwZSBmb3IgIXN1YnN0Iik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgVHlwZSA9IFJIU3QtPmdldFR5cGUoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChuZXcgVGVybk9wSW5pdChDb2RlLCBMSFMsIE1IUywgUkhTLCBUeXBlKSktPkZvbGQoQ3VyUmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ck11bHRpQ2xhc3MpOworICB9CisgIH0KKyAgVG9rRXJyb3IoImNvdWxkIG5vdCBwYXJzZSBvcGVyYXRpb24iKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBQYXJzZU9wZXJhdG9yVHlwZSAtIFBhcnNlIGEgdHlwZSBmb3IgYW4gb3BlcmF0b3IuICBUaGlzIHJldHVybnMKKy8vLyBudWxsIG9uIGVycm9yLgorLy8vCisvLy8gT3BlcmF0b3JUeXBlIDo6PSAnPCcgVHlwZSAnPicKKy8vLworUmVjVHkgKlRHUGFyc2VyOjpQYXJzZU9wZXJhdG9yVHlwZSgpIHsKKyAgUmVjVHkgKlR5cGUgPSAwOworCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpsZXNzKSB7CisgICAgVG9rRXJyb3IoImV4cGVjdGVkIHR5cGUgbmFtZSBmb3Igb3BlcmF0b3IiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBMZXguTGV4KCk7ICAvLyBlYXQgdGhlIDwKKworICBUeXBlID0gUGFyc2VUeXBlKCk7CisKKyAgaWYgKFR5cGUgPT0gMCkgeworICAgIFRva0Vycm9yKCJleHBlY3RlZCB0eXBlIG5hbWUgZm9yIG9wZXJhdG9yIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6Z3JlYXRlcikgeworICAgIFRva0Vycm9yKCJleHBlY3RlZCB0eXBlIG5hbWUgZm9yIG9wZXJhdG9yIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSA+CisKKyAgcmV0dXJuIFR5cGU7Cit9CisKKworLy8vIFBhcnNlU2ltcGxlVmFsdWUgLSBQYXJzZSBhIHRibGdlbiB2YWx1ZS4gIFRoaXMgcmV0dXJucyBudWxsIG9uIGVycm9yLgorLy8vCisvLy8gICBTaW1wbGVWYWx1ZSA6Oj0gSURWYWx1ZQorLy8vICAgU2ltcGxlVmFsdWUgOjo9IElOVFZBTAorLy8vICAgU2ltcGxlVmFsdWUgOjo9IFNUUlZBTCsKKy8vLyAgIFNpbXBsZVZhbHVlIDo6PSBDT0RFRlJBR01FTlQKKy8vLyAgIFNpbXBsZVZhbHVlIDo6PSAnPycKKy8vLyAgIFNpbXBsZVZhbHVlIDo6PSAneycgVmFsdWVMaXN0ICd9JworLy8vICAgU2ltcGxlVmFsdWUgOjo9IElEICc8JyBWYWx1ZUxpc3RORSAnPicKKy8vLyAgIFNpbXBsZVZhbHVlIDo6PSAnWycgVmFsdWVMaXN0ICddJworLy8vICAgU2ltcGxlVmFsdWUgOjo9ICcoJyBJRFZhbHVlIERhZ0FyZ0xpc3QgJyknCisvLy8gICBTaW1wbGVWYWx1ZSA6Oj0gQ09OQ0FUVE9LICcoJyBWYWx1ZSAnLCcgVmFsdWUgJyknCisvLy8gICBTaW1wbGVWYWx1ZSA6Oj0gU0hMVE9LICcoJyBWYWx1ZSAnLCcgVmFsdWUgJyknCisvLy8gICBTaW1wbGVWYWx1ZSA6Oj0gU1JBVE9LICcoJyBWYWx1ZSAnLCcgVmFsdWUgJyknCisvLy8gICBTaW1wbGVWYWx1ZSA6Oj0gU1JMVE9LICcoJyBWYWx1ZSAnLCcgVmFsdWUgJyknCisvLy8gICBTaW1wbGVWYWx1ZSA6Oj0gU1RSQ09OQ0FUVE9LICcoJyBWYWx1ZSAnLCcgVmFsdWUgJyknCisvLy8KK0luaXQgKlRHUGFyc2VyOjpQYXJzZVNpbXBsZVZhbHVlKFJlY29yZCAqQ3VyUmVjLCBSZWNUeSAqSXRlbVR5cGUpIHsKKyAgSW5pdCAqUiA9IDA7CisgIHN3aXRjaCAoTGV4LmdldENvZGUoKSkgeworICBkZWZhdWx0OiBUb2tFcnJvcigiVW5rbm93biB0b2tlbiB3aGVuIHBhcnNpbmcgYSB2YWx1ZSIpOyBicmVhazsKKyAgY2FzZSB0Z3Rvazo6SW50VmFsOiBSID0gbmV3IEludEluaXQoTGV4LmdldEN1ckludFZhbCgpKTsgTGV4LkxleCgpOyBicmVhazsKKyAgY2FzZSB0Z3Rvazo6U3RyVmFsOiB7CisgICAgc3RkOjpzdHJpbmcgVmFsID0gTGV4LmdldEN1clN0clZhbCgpOworICAgIExleC5MZXgoKTsKKworICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBjb25jYXRlbmF0ZWQgc3RyaW5ncy4KKyAgICB3aGlsZSAoTGV4LmdldENvZGUoKSA9PSB0Z3Rvazo6U3RyVmFsKSB7CisgICAgICBWYWwgKz0gTGV4LmdldEN1clN0clZhbCgpOworICAgICAgTGV4LkxleCgpOworICAgIH0KKworICAgIFIgPSBuZXcgU3RyaW5nSW5pdChWYWwpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgdGd0b2s6OkNvZGVGcmFnbWVudDoKKyAgICBSID0gbmV3IENvZGVJbml0KExleC5nZXRDdXJTdHJWYWwoKSk7IExleC5MZXgoKTsgYnJlYWs7CisgIGNhc2UgdGd0b2s6OnF1ZXN0aW9uOiBSID0gbmV3IFVuc2V0SW5pdCgpOyBMZXguTGV4KCk7IGJyZWFrOworICBjYXNlIHRndG9rOjpJZDogeworICAgIFNNTG9jIE5hbWVMb2MgPSBMZXguZ2V0TG9jKCk7CisgICAgc3RkOjpzdHJpbmcgTmFtZSA9IExleC5nZXRDdXJTdHJWYWwoKTsKKyAgICBpZiAoTGV4LkxleCgpICE9IHRndG9rOjpsZXNzKSAgLy8gY29uc3VtZSB0aGUgSWQuCisgICAgICByZXR1cm4gUGFyc2VJRFZhbHVlKEN1clJlYywgTmFtZSwgTmFtZUxvYyk7ICAgIC8vIFZhbHVlIDo6PSBJRFZhbHVlCisKKyAgICAvLyBWYWx1ZSA6Oj0gSUQgJzwnIFZhbHVlTGlzdE5FICc+JworICAgIGlmIChMZXguTGV4KCkgPT0gdGd0b2s6OmdyZWF0ZXIpIHsKKyAgICAgIFRva0Vycm9yKCJleHBlY3RlZCBub24tZW1wdHkgdmFsdWUgbGlzdCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBhIENMQVNTPGluaXR2YWxzbGlzdD4gZXhwcmVzc2lvbi4gIFRoaXMgaXMgc3VwcG9zZWQgdG8gc3ludGhlc2l6ZQorICAgIC8vIGEgbmV3IGFub255bW91cyBkZWZpbml0aW9uLCBkZXJpdmluZyBmcm9tIENMQVNTPGluaXR2YWxzbGlzdD4gd2l0aCBubworICAgIC8vIGJvZHkuCisgICAgUmVjb3JkICpDbGFzcyA9IFJlY29yZHMuZ2V0Q2xhc3MoTmFtZSk7CisgICAgaWYgKCFDbGFzcykgeworICAgICAgRXJyb3IoTmFtZUxvYywgIkV4cGVjdGVkIGEgY2xhc3MgbmFtZSwgZ290ICciICsgTmFtZSArICInIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxJbml0Kj4gVmFsdWVMaXN0ID0gUGFyc2VWYWx1ZUxpc3QoQ3VyUmVjLCBDbGFzcyk7CisgICAgaWYgKFZhbHVlTGlzdC5lbXB0eSgpKSByZXR1cm4gMDsKKworICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpncmVhdGVyKSB7CisgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgJz4nIGF0IGVuZCBvZiB2YWx1ZSBsaXN0Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnPicKKworICAgIC8vIENyZWF0ZSB0aGUgbmV3IHJlY29yZCwgc2V0IGl0IGFzIEN1clJlYyB0ZW1wb3JhcmlseS4KKyAgICBzdGF0aWMgdW5zaWduZWQgQW5vbkNvdW50ZXIgPSAwOworICAgIFJlY29yZCAqTmV3UmVjID0gbmV3IFJlY29yZCgiYW5vbnltb3VzLnZhbC4iK3V0b3N0cihBbm9uQ291bnRlcisrKSxOYW1lTG9jKTsKKyAgICBTdWJDbGFzc1JlZmVyZW5jZSBTQ1JlZjsKKyAgICBTQ1JlZi5SZWZMb2MgPSBOYW1lTG9jOworICAgIFNDUmVmLlJlYyA9IENsYXNzOworICAgIFNDUmVmLlRlbXBsYXRlQXJncyA9IFZhbHVlTGlzdDsKKyAgICAvLyBBZGQgaW5mbyBhYm91dCB0aGUgc3ViY2xhc3MgdG8gTmV3UmVjLgorICAgIGlmIChBZGRTdWJDbGFzcyhOZXdSZWMsIFNDUmVmKSkKKyAgICAgIHJldHVybiAwOworICAgIE5ld1JlYy0+cmVzb2x2ZVJlZmVyZW5jZXMoKTsKKyAgICBSZWNvcmRzLmFkZERlZihOZXdSZWMpOworCisgICAgLy8gVGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBpcyBhIHJlZmVyZW5jZSB0byB0aGUgbmV3IHJlY29yZC4KKyAgICByZXR1cm4gbmV3IERlZkluaXQoTmV3UmVjKTsKKyAgfQorICBjYXNlIHRndG9rOjpsX2JyYWNlOiB7ICAgICAgICAgICAvLyBWYWx1ZSA6Oj0gJ3snIFZhbHVlTGlzdCAnfScKKyAgICBTTUxvYyBCcmFjZUxvYyA9IExleC5nZXRMb2MoKTsKKyAgICBMZXguTGV4KCk7IC8vIGVhdCB0aGUgJ3snCisgICAgc3RkOjp2ZWN0b3I8SW5pdCo+IFZhbHM7CisKKyAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6cl9icmFjZSkgeworICAgICAgVmFscyA9IFBhcnNlVmFsdWVMaXN0KEN1clJlYyk7CisgICAgICBpZiAoVmFscy5lbXB0eSgpKSByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OnJfYnJhY2UpIHsKKyAgICAgIFRva0Vycm9yKCJleHBlY3RlZCAnfScgYXQgZW5kIG9mIGJpdCBsaXN0IHZhbHVlIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnfScKKworICAgIEJpdHNJbml0ICpSZXN1bHQgPSBuZXcgQml0c0luaXQoVmFscy5zaXplKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYWxzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIEluaXQgKkJpdCA9IFZhbHNbaV0tPmNvbnZlcnRJbml0aWFsaXplclRvKG5ldyBCaXRSZWNUeSgpKTsKKyAgICAgIGlmIChCaXQgPT0gMCkgeworICAgICAgICBFcnJvcihCcmFjZUxvYywgIkVsZW1lbnQgIyIgKyB1dG9zdHIoaSkgKyAiICgiICsgVmFsc1tpXS0+Z2V0QXNTdHJpbmcoKSsKKyAgICAgICAgICAgICAgIikgaXMgbm90IGNvbnZlcnRhYmxlIHRvIGEgYml0Iik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgUmVzdWx0LT5zZXRCaXQoVmFscy5zaXplKCktaS0xLCBCaXQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9CisgIGNhc2UgdGd0b2s6Omxfc3F1YXJlOiB7ICAgICAgICAgIC8vIFZhbHVlIDo6PSAnWycgVmFsdWVMaXN0ICddJworICAgIExleC5MZXgoKTsgLy8gZWF0IHRoZSAnWycKKyAgICBzdGQ6OnZlY3RvcjxJbml0Kj4gVmFsczsKKworICAgIFJlY1R5ICpEZWR1Y2VkRWx0VHkgPSAwOworICAgIExpc3RSZWNUeSAqR2l2ZW5MaXN0VHkgPSAwOworCisgICAgaWYgKEl0ZW1UeXBlICE9IDApIHsKKyAgICAgIExpc3RSZWNUeSAqTGlzdFR5cGUgPSBkeW5hbWljX2Nhc3Q8TGlzdFJlY1R5Kj4oSXRlbVR5cGUpOworICAgICAgaWYgKExpc3RUeXBlID09IDApIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gczsKKyAgICAgICAgcyA8PCAiVHlwZSBtaXNtYXRjaCBmb3IgbGlzdCwgZXhwZWN0ZWQgbGlzdCB0eXBlLCBnb3QgIgorICAgICAgICAgIDw8IEl0ZW1UeXBlLT5nZXRBc1N0cmluZygpOworICAgICAgICBUb2tFcnJvcihzLnN0cigpKTsKKyAgICAgIH0KKyAgICAgIEdpdmVuTGlzdFR5ID0gTGlzdFR5cGU7CisgICAgfQorCisgICAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OnJfc3F1YXJlKSB7CisgICAgICBWYWxzID0gUGFyc2VWYWx1ZUxpc3QoQ3VyUmVjLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdpdmVuTGlzdFR5ID8gR2l2ZW5MaXN0VHktPmdldEVsZW1lbnRUeXBlKCkgOiAwKTsKKyAgICAgIGlmIChWYWxzLmVtcHR5KCkpIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6cl9zcXVhcmUpIHsKKyAgICAgIFRva0Vycm9yKCJleHBlY3RlZCAnXScgYXQgZW5kIG9mIGxpc3QgdmFsdWUiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBMZXguTGV4KCk7ICAvLyBlYXQgdGhlICddJworCisgICAgUmVjVHkgKkdpdmVuRWx0VHkgPSAwOworICAgIGlmIChMZXguZ2V0Q29kZSgpID09IHRndG9rOjpsZXNzKSB7CisgICAgICAvLyBPcHRpb25hbCBsaXN0IGVsZW1lbnQgdHlwZQorICAgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnPCcKKworICAgICAgR2l2ZW5FbHRUeSA9IFBhcnNlVHlwZSgpOworICAgICAgaWYgKEdpdmVuRWx0VHkgPT0gMCkgeworICAgICAgICAvLyBDb3VsZG4ndCBwYXJzZSBlbGVtZW50IHR5cGUKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpncmVhdGVyKSB7CisgICAgICAgIFRva0Vycm9yKCJleHBlY3RlZCAnPicgYXQgZW5kIG9mIGxpc3QgZWxlbWVudCB0eXBlIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnPicKKyAgICB9CisKKyAgICAvLyBDaGVjayBlbGVtZW50cworICAgIFJlY1R5ICpFbHRUeSA9IDA7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxJbml0ICo+OjppdGVyYXRvciBpID0gVmFscy5iZWdpbigpLCBpZSA9IFZhbHMuZW5kKCk7CisgICAgICAgICBpICE9IGllOworICAgICAgICAgKytpKSB7CisgICAgICBUeXBlZEluaXQgKlRBcmcgPSBkeW5hbWljX2Nhc3Q8VHlwZWRJbml0Kj4oKmkpOworICAgICAgaWYgKFRBcmcgPT0gMCkgeworICAgICAgICBUb2tFcnJvcigiVW50eXBlZCBsaXN0IGVsZW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAoRWx0VHkgIT0gMCkgeworICAgICAgICBFbHRUeSA9IHJlc29sdmVUeXBlcyhFbHRUeSwgVEFyZy0+Z2V0VHlwZSgpKTsKKyAgICAgICAgaWYgKEVsdFR5ID09IDApIHsKKyAgICAgICAgICBUb2tFcnJvcigiSW5jb21wYXRpYmxlIHR5cGVzIGluIGxpc3QgZWxlbWVudHMiKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgRWx0VHkgPSBUQXJnLT5nZXRUeXBlKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEdpdmVuRWx0VHkgIT0gMCkgeworICAgICAgaWYgKEVsdFR5ICE9IDApIHsKKyAgICAgICAgLy8gVmVyaWZ5IGNvbnNpc3RlbmN5CisgICAgICAgIGlmICghRWx0VHktPnR5cGVJc0NvbnZlcnRpYmxlVG8oR2l2ZW5FbHRUeSkpIHsKKyAgICAgICAgICBUb2tFcnJvcigiSW5jb21wYXRpYmxlIHR5cGVzIGluIGxpc3QgZWxlbWVudHMiKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRWx0VHkgPSBHaXZlbkVsdFR5OworICAgIH0KKworICAgIGlmIChFbHRUeSA9PSAwKSB7CisgICAgICBpZiAoSXRlbVR5cGUgPT0gMCkgeworICAgICAgICBUb2tFcnJvcigiTm8gdHlwZSBmb3IgbGlzdCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIERlZHVjZWRFbHRUeSA9IEdpdmVuTGlzdFR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBNYWtlIHN1cmUgdGhlIGRlZHVjZWQgdHlwZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGdpdmVuIHR5cGUKKyAgICAgIGlmIChHaXZlbkxpc3RUeSkgeworICAgICAgICBpZiAoIUVsdFR5LT50eXBlSXNDb252ZXJ0aWJsZVRvKEdpdmVuTGlzdFR5LT5nZXRFbGVtZW50VHlwZSgpKSkgeworICAgICAgICAgIFRva0Vycm9yKCJFbGVtZW50IHR5cGUgbWlzbWF0Y2ggZm9yIGxpc3QiKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRGVkdWNlZEVsdFR5ID0gRWx0VHk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBMaXN0SW5pdChWYWxzLCBEZWR1Y2VkRWx0VHkpOworICB9CisgIGNhc2UgdGd0b2s6OmxfcGFyZW46IHsgICAgICAgICAvLyBWYWx1ZSA6Oj0gJygnIElEVmFsdWUgRGFnQXJnTGlzdCAnKScKKyAgICBMZXguTGV4KCk7ICAgLy8gZWF0IHRoZSAnKCcKKyAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6SWQKKyAgICAgICAgJiYgTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6WENhc3QKKyAgICAgICAgJiYgTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6WE5hbWVDb25jYXQpIHsKKyAgICAgIFRva0Vycm9yKCJleHBlY3RlZCBpZGVudGlmaWVyIGluIGRhZyBpbml0Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBJbml0ICpPcGVyYXRvciA9IDA7CisgICAgaWYgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OklkKSB7CisgICAgICBPcGVyYXRvciA9IFBhcnNlSURWYWx1ZShDdXJSZWMpOworICAgICAgaWYgKE9wZXJhdG9yID09IDApIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBPcGVyYXRvciA9IFBhcnNlT3BlcmF0aW9uKEN1clJlYyk7CisgICAgICBpZiAoT3BlcmF0b3IgPT0gMCkgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gSWYgdGhlIG9wZXJhdG9yIG5hbWUgaXMgcHJlc2VudCwgcGFyc2UgaXQuCisgICAgc3RkOjpzdHJpbmcgT3BlcmF0b3JOYW1lOworICAgIGlmIChMZXguZ2V0Q29kZSgpID09IHRndG9rOjpjb2xvbikgeworICAgICAgaWYgKExleC5MZXgoKSAhPSB0Z3Rvazo6VmFyTmFtZSkgeyAvLyBlYXQgdGhlICc6JworICAgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgdmFyaWFibGUgbmFtZSBpbiBkYWcgb3BlcmF0b3IiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBPcGVyYXRvck5hbWUgPSBMZXguZ2V0Q3VyU3RyVmFsKCk7CisgICAgICBMZXguTGV4KCk7ICAvLyBlYXQgdGhlIFZhck5hbWUuCisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGxsdm06OkluaXQqLCBzdGQ6OnN0cmluZz4gPiBEYWdBcmdzOworICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpyX3BhcmVuKSB7CisgICAgICBEYWdBcmdzID0gUGFyc2VEYWdBcmdMaXN0KEN1clJlYyk7CisgICAgICBpZiAoRGFnQXJncy5lbXB0eSgpKSByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6cl9wYXJlbikgeworICAgICAgVG9rRXJyb3IoImV4cGVjdGVkICcpJyBpbiBkYWcgaW5pdCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgJyknCisKKyAgICByZXR1cm4gbmV3IERhZ0luaXQoT3BlcmF0b3IsIE9wZXJhdG9yTmFtZSwgRGFnQXJncyk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIHRndG9rOjpYQ2FyOgorICBjYXNlIHRndG9rOjpYQ2RyOgorICBjYXNlIHRndG9rOjpYTnVsbDoKKyAgY2FzZSB0Z3Rvazo6WENhc3Q6ICAvLyBWYWx1ZSA6Oj0gIXVub3AgJygnIFZhbHVlICcpJworICBjYXNlIHRndG9rOjpYQ29uY2F0OgorICBjYXNlIHRndG9rOjpYU1JBOgorICBjYXNlIHRndG9rOjpYU1JMOgorICBjYXNlIHRndG9rOjpYU0hMOgorICBjYXNlIHRndG9rOjpYRXE6CisgIGNhc2UgdGd0b2s6OlhTdHJDb25jYXQ6CisgIGNhc2UgdGd0b2s6OlhOYW1lQ29uY2F0OiAgLy8gVmFsdWUgOjo9ICFiaW5vcCAnKCcgVmFsdWUgJywnIFZhbHVlICcpJworICBjYXNlIHRndG9rOjpYSWY6CisgIGNhc2UgdGd0b2s6OlhGb3JFYWNoOgorICBjYXNlIHRndG9rOjpYU3Vic3Q6IHsgIC8vIFZhbHVlIDo6PSAhdGVybm9wICcoJyBWYWx1ZSAnLCcgVmFsdWUgJywnIFZhbHVlICcpJworICAgIHJldHVybiBQYXJzZU9wZXJhdGlvbihDdXJSZWMpOworICAgIGJyZWFrOworICB9CisgIH0KKworICByZXR1cm4gUjsKK30KKworLy8vIFBhcnNlVmFsdWUgLSBQYXJzZSBhIHRibGdlbiB2YWx1ZS4gIFRoaXMgcmV0dXJucyBudWxsIG9uIGVycm9yLgorLy8vCisvLy8gICBWYWx1ZSAgICAgICA6Oj0gU2ltcGxlVmFsdWUgVmFsdWVTdWZmaXgqCisvLy8gICBWYWx1ZVN1ZmZpeCA6Oj0gJ3snIEJpdExpc3QgJ30nCisvLy8gICBWYWx1ZVN1ZmZpeCA6Oj0gJ1snIEJpdExpc3QgJ10nCisvLy8gICBWYWx1ZVN1ZmZpeCA6Oj0gJy4nIElECisvLy8KK0luaXQgKlRHUGFyc2VyOjpQYXJzZVZhbHVlKFJlY29yZCAqQ3VyUmVjLCBSZWNUeSAqSXRlbVR5cGUpIHsKKyAgSW5pdCAqUmVzdWx0ID0gUGFyc2VTaW1wbGVWYWx1ZShDdXJSZWMsIEl0ZW1UeXBlKTsKKyAgaWYgKFJlc3VsdCA9PSAwKSByZXR1cm4gMDsKKworICAvLyBQYXJzZSB0aGUgc3VmZml4ZXMgbm93IGlmIHByZXNlbnQuCisgIHdoaWxlICgxKSB7CisgICAgc3dpdGNoIChMZXguZ2V0Q29kZSgpKSB7CisgICAgZGVmYXVsdDogcmV0dXJuIFJlc3VsdDsKKyAgICBjYXNlIHRndG9rOjpsX2JyYWNlOiB7CisgICAgICBTTUxvYyBDdXJseUxvYyA9IExleC5nZXRMb2MoKTsKKyAgICAgIExleC5MZXgoKTsgLy8gZWF0IHRoZSAneycKKyAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBSYW5nZXMgPSBQYXJzZVJhbmdlTGlzdCgpOworICAgICAgaWYgKFJhbmdlcy5lbXB0eSgpKSByZXR1cm4gMDsKKworICAgICAgLy8gUmV2ZXJzZSB0aGUgYml0bGlzdC4KKyAgICAgIHN0ZDo6cmV2ZXJzZShSYW5nZXMuYmVnaW4oKSwgUmFuZ2VzLmVuZCgpKTsKKyAgICAgIFJlc3VsdCA9IFJlc3VsdC0+Y29udmVydEluaXRpYWxpemVyQml0UmFuZ2UoUmFuZ2VzKTsKKyAgICAgIGlmIChSZXN1bHQgPT0gMCkgeworICAgICAgICBFcnJvcihDdXJseUxvYywgIkludmFsaWQgYml0IHJhbmdlIGZvciB2YWx1ZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgLy8gRWF0IHRoZSAnfScuCisgICAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6cl9icmFjZSkgeworICAgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgJ30nIGF0IGVuZCBvZiBiaXQgcmFuZ2UgbGlzdCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIExleC5MZXgoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIHRndG9rOjpsX3NxdWFyZTogeworICAgICAgU01Mb2MgU3F1YXJlTG9jID0gTGV4LmdldExvYygpOworICAgICAgTGV4LkxleCgpOyAvLyBlYXQgdGhlICdbJworICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFJhbmdlcyA9IFBhcnNlUmFuZ2VMaXN0KCk7CisgICAgICBpZiAoUmFuZ2VzLmVtcHR5KCkpIHJldHVybiAwOworCisgICAgICBSZXN1bHQgPSBSZXN1bHQtPmNvbnZlcnRJbml0TGlzdFNsaWNlKFJhbmdlcyk7CisgICAgICBpZiAoUmVzdWx0ID09IDApIHsKKyAgICAgICAgRXJyb3IoU3F1YXJlTG9jLCAiSW52YWxpZCByYW5nZSBmb3IgbGlzdCBzbGljZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgLy8gRWF0IHRoZSAnXScuCisgICAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6cl9zcXVhcmUpIHsKKyAgICAgICAgVG9rRXJyb3IoImV4cGVjdGVkICddJyBhdCBlbmQgb2YgbGlzdCBzbGljZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIExleC5MZXgoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIHRndG9rOjpwZXJpb2Q6CisgICAgICBpZiAoTGV4LkxleCgpICE9IHRndG9rOjpJZCkgeyAgLy8gZWF0IHRoZSAuCisgICAgICAgIFRva0Vycm9yKCJleHBlY3RlZCBmaWVsZCBpZGVudGlmaWVyIGFmdGVyICcuJyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmICghUmVzdWx0LT5nZXRGaWVsZFR5cGUoTGV4LmdldEN1clN0clZhbCgpKSkgeworICAgICAgICBUb2tFcnJvcigiQ2Fubm90IGFjY2VzcyBmaWVsZCAnIiArIExleC5nZXRDdXJTdHJWYWwoKSArICInIG9mIHZhbHVlICciICsKKyAgICAgICAgICAgICAgICAgUmVzdWx0LT5nZXRBc1N0cmluZygpICsgIiciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBSZXN1bHQgPSBuZXcgRmllbGRJbml0KFJlc3VsdCwgTGV4LmdldEN1clN0clZhbCgpKTsKKyAgICAgIExleC5MZXgoKTsgIC8vIGVhdCBmaWVsZCBuYW1lCisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLy8vIFBhcnNlRGFnQXJnTGlzdCAtIFBhcnNlIHRoZSBhcmd1bWVudCBsaXN0IGZvciBhIGRhZyBsaXRlcmFsIGV4cHJlc3Npb24uCisvLy8KKy8vLyAgICBQYXJzZURhZ0FyZ0xpc3QgOjo9IFZhbHVlICgnOicgVkFSTkFNRSk/CisvLy8gICAgUGFyc2VEYWdBcmdMaXN0IDo6PSBQYXJzZURhZ0FyZ0xpc3QgJywnIFZhbHVlICgnOicgVkFSTkFNRSk/CitzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8bGx2bTo6SW5pdCosIHN0ZDo6c3RyaW5nPiA+CitUR1BhcnNlcjo6UGFyc2VEYWdBcmdMaXN0KFJlY29yZCAqQ3VyUmVjKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxsbHZtOjpJbml0Kiwgc3RkOjpzdHJpbmc+ID4gUmVzdWx0OworCisgIHdoaWxlICgxKSB7CisgICAgSW5pdCAqVmFsID0gUGFyc2VWYWx1ZShDdXJSZWMpOworICAgIGlmIChWYWwgPT0gMCkgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxsbHZtOjpJbml0Kiwgc3RkOjpzdHJpbmc+ID4oKTsKKworICAgIC8vIElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIHByZXNlbnQsIGFkZCBpdC4KKyAgICBzdGQ6OnN0cmluZyBWYXJOYW1lOworICAgIGlmIChMZXguZ2V0Q29kZSgpID09IHRndG9rOjpjb2xvbikgeworICAgICAgaWYgKExleC5MZXgoKSAhPSB0Z3Rvazo6VmFyTmFtZSkgeyAvLyBlYXQgdGhlICc6JworICAgICAgICBUb2tFcnJvcigiZXhwZWN0ZWQgdmFyaWFibGUgbmFtZSBpbiBkYWcgbGl0ZXJhbCIpOworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGxsdm06OkluaXQqLCBzdGQ6OnN0cmluZz4gPigpOworICAgICAgfQorICAgICAgVmFyTmFtZSA9IExleC5nZXRDdXJTdHJWYWwoKTsKKyAgICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgVmFyTmFtZS4KKyAgICB9CisKKyAgICBSZXN1bHQucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFZhbCwgVmFyTmFtZSkpOworCisgICAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OmNvbW1hKSBicmVhazsKKyAgICBMZXguTGV4KCk7IC8vIGVhdCB0aGUgJywnCisgIH0KKworICByZXR1cm4gUmVzdWx0OworfQorCisKKy8vLyBQYXJzZVZhbHVlTGlzdCAtIFBhcnNlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdmFsdWVzLCByZXR1cm5pbmcgdGhlbSBhcyBhCisvLy8gdmVjdG9yLiAgTm90ZSB0aGF0IHRoaXMgYWx3YXlzIGV4cGVjdHMgdG8gYmUgYWJsZSB0byBwYXJzZSBhdCBsZWFzdCBvbmUKKy8vLyB2YWx1ZS4gIEl0IHJldHVybnMgYW4gZW1wdHkgbGlzdCBpZiB0aGlzIGlzIG5vdCBwb3NzaWJsZS4KKy8vLworLy8vICAgVmFsdWVMaXN0IDo6PSBWYWx1ZSAoJywnIFZhbHVlKQorLy8vCitzdGQ6OnZlY3RvcjxJbml0Kj4gVEdQYXJzZXI6OlBhcnNlVmFsdWVMaXN0KFJlY29yZCAqQ3VyUmVjLCBSZWNvcmQgKkFyZ3NSZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY1R5ICpFbHRUeSkgeworICBzdGQ6OnZlY3RvcjxJbml0Kj4gUmVzdWx0OworICBSZWNUeSAqSXRlbVR5cGUgPSBFbHRUeTsKKyAgdW5zaWduZWQgaW50IEFyZ04gPSAwOworICBpZiAoQXJnc1JlYyAhPSAwICYmIEVsdFR5ID09IDApIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJlRBcmdzID0gQXJnc1JlYy0+Z2V0VGVtcGxhdGVBcmdzKCk7CisgICAgY29uc3QgUmVjb3JkVmFsICpSViA9IEFyZ3NSZWMtPmdldFZhbHVlKFRBcmdzW0FyZ05dKTsKKyAgICBhc3NlcnQoUlYgJiYgIlRlbXBsYXRlIGFyZ3VtZW50IHJlY29yZCBub3QgZm91bmQ/PyIpOworICAgIEl0ZW1UeXBlID0gUlYtPmdldFR5cGUoKTsKKyAgICArK0FyZ047CisgIH0KKyAgUmVzdWx0LnB1c2hfYmFjayhQYXJzZVZhbHVlKEN1clJlYywgSXRlbVR5cGUpKTsKKyAgaWYgKFJlc3VsdC5iYWNrKCkgPT0gMCkgcmV0dXJuIHN0ZDo6dmVjdG9yPEluaXQqPigpOworCisgIHdoaWxlIChMZXguZ2V0Q29kZSgpID09IHRndG9rOjpjb21tYSkgeworICAgIExleC5MZXgoKTsgIC8vIEVhdCB0aGUgY29tbWEKKworICAgIGlmIChBcmdzUmVjICE9IDAgJiYgRWx0VHkgPT0gMCkgeworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZUQXJncyA9IEFyZ3NSZWMtPmdldFRlbXBsYXRlQXJncygpOworICAgICAgaWYgKEFyZ04gPj0gVEFyZ3Muc2l6ZSgpKSB7CisgICAgICAgIFRva0Vycm9yKCJ0b28gbWFueSB0ZW1wbGF0ZSBhcmd1bWVudHMiKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluaXQqPigpOworICAgICAgfQorICAgICAgY29uc3QgUmVjb3JkVmFsICpSViA9IEFyZ3NSZWMtPmdldFZhbHVlKFRBcmdzW0FyZ05dKTsKKyAgICAgIGFzc2VydChSViAmJiAiVGVtcGxhdGUgYXJndW1lbnQgcmVjb3JkIG5vdCBmb3VuZD8/Iik7CisgICAgICBJdGVtVHlwZSA9IFJWLT5nZXRUeXBlKCk7CisgICAgICArK0FyZ047CisgICAgfQorICAgIFJlc3VsdC5wdXNoX2JhY2soUGFyc2VWYWx1ZShDdXJSZWMsIEl0ZW1UeXBlKSk7CisgICAgaWYgKFJlc3VsdC5iYWNrKCkgPT0gMCkgcmV0dXJuIHN0ZDo6dmVjdG9yPEluaXQqPigpOworICB9CisKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworCisvLy8gUGFyc2VEZWNsYXJhdGlvbiAtIFJlYWQgYSBkZWNsYXJhdGlvbiwgcmV0dXJuaW5nIHRoZSBuYW1lIG9mIGZpZWxkIElELCBvciBhbgorLy8vIGVtcHR5IHN0cmluZyBvbiBlcnJvci4gIFRoaXMgY2FuIGhhcHBlbiBpbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgY29udGV4dCdzLAorLy8vIGluY2x1ZGluZyB3aXRoaW4gYSBkZWYgb3IgaW4gdGhlIHRlbXBsYXRlIGFyZ3MgZm9yIGEgZGVmICh3aGljaCB3aGljaCBjYXNlCisvLy8gQ3VyUmVjIHdpbGwgYmUgbm9uLW51bGwpIGFuZCB3aXRoaW4gdGhlIHRlbXBsYXRlIGFyZ3MgZm9yIGEgbXVsdGljbGFzcyAoaW4KKy8vLyB3aGljaCBjYXNlIEN1clJlYyB3aWxsIGJlIG51bGwsIGJ1dCBDdXJNdWx0aUNsYXNzIHdpbGwgYmUgc2V0KS4gIFRoaXMgY2FuCisvLy8gYWxzbyBoYXBwZW4gd2l0aGluIGEgZGVmIHRoYXQgaXMgd2l0aGluIGEgbXVsdGljbGFzcywgd2hpY2ggd2lsbCBzZXQgYm90aAorLy8vIEN1clJlYyBhbmQgQ3VyTXVsdGlDbGFzcy4KKy8vLworLy8vICBEZWNsYXJhdGlvbiA6Oj0gRklFTEQ/IFR5cGUgSUQgKCc9JyBWYWx1ZSk/CisvLy8KK3N0ZDo6c3RyaW5nIFRHUGFyc2VyOjpQYXJzZURlY2xhcmF0aW9uKFJlY29yZCAqQ3VyUmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQYXJzaW5nVGVtcGxhdGVBcmdzKSB7CisgIC8vIFJlYWQgdGhlIGZpZWxkIHByZWZpeCBpZiBwcmVzZW50LgorICBib29sIEhhc0ZpZWxkID0gTGV4LmdldENvZGUoKSA9PSB0Z3Rvazo6RmllbGQ7CisgIGlmIChIYXNGaWVsZCkgTGV4LkxleCgpOworCisgIFJlY1R5ICpUeXBlID0gUGFyc2VUeXBlKCk7CisgIGlmIChUeXBlID09IDApIHJldHVybiAiIjsKKworICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6SWQpIHsKKyAgICBUb2tFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciBpbiBkZWNsYXJhdGlvbiIpOworICAgIHJldHVybiAiIjsKKyAgfQorCisgIFNNTG9jIElkTG9jID0gTGV4LmdldExvYygpOworICBzdGQ6OnN0cmluZyBEZWNsTmFtZSA9IExleC5nZXRDdXJTdHJWYWwoKTsKKyAgTGV4LkxleCgpOworCisgIGlmIChQYXJzaW5nVGVtcGxhdGVBcmdzKSB7CisgICAgaWYgKEN1clJlYykgeworICAgICAgRGVjbE5hbWUgPSBDdXJSZWMtPmdldE5hbWUoKSArICI6IiArIERlY2xOYW1lOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoQ3VyTXVsdGlDbGFzcyk7CisgICAgfQorICAgIGlmIChDdXJNdWx0aUNsYXNzKQorICAgICAgRGVjbE5hbWUgPSBDdXJNdWx0aUNsYXNzLT5SZWMuZ2V0TmFtZSgpICsgIjo6IiArIERlY2xOYW1lOworICB9CisKKyAgLy8gQWRkIHRoZSB2YWx1ZS4KKyAgaWYgKEFkZFZhbHVlKEN1clJlYywgSWRMb2MsIFJlY29yZFZhbChEZWNsTmFtZSwgVHlwZSwgSGFzRmllbGQpKSkKKyAgICByZXR1cm4gIiI7CisKKyAgLy8gSWYgYSB2YWx1ZSBpcyBwcmVzZW50LCBwYXJzZSBpdC4KKyAgaWYgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OmVxdWFsKSB7CisgICAgTGV4LkxleCgpOworICAgIFNNTG9jIFZhbExvYyA9IExleC5nZXRMb2MoKTsKKyAgICBJbml0ICpWYWwgPSBQYXJzZVZhbHVlKEN1clJlYywgVHlwZSk7CisgICAgaWYgKFZhbCA9PSAwIHx8CisgICAgICAgIFNldFZhbHVlKEN1clJlYywgVmFsTG9jLCBEZWNsTmFtZSwgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+KCksIFZhbCkpCisgICAgICByZXR1cm4gIiI7CisgIH0KKworICByZXR1cm4gRGVjbE5hbWU7Cit9CisKKy8vLyBQYXJzZVRlbXBsYXRlQXJnTGlzdCAtIFJlYWQgYSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LCB3aGljaCBpcyBhIG5vbi1lbXB0eQorLy8vIHNlcXVlbmNlIG9mIHRlbXBsYXRlLWRlY2xhcmF0aW9ucyBpbiA8PidzLiAgSWYgQ3VyUmVjIGlzIG5vbi1udWxsLCB0aGVzZSBhcmUKKy8vLyB0ZW1wbGF0ZSBhcmdzIGZvciBhIGRlZiwgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgaW4gYSBtdWx0aWNsYXNzLiAgSWYgbnVsbCwKKy8vLyB0aGVzZSBhcmUgdGhlIHRlbXBsYXRlIGFyZ3MgZm9yIGEgbXVsdGljbGFzcy4KKy8vLworLy8vICAgIFRlbXBsYXRlQXJnTGlzdCA6Oj0gJzwnIERlY2xhcmF0aW9uICgnLCcgRGVjbGFyYXRpb24pKiAnPicKKy8vLworYm9vbCBUR1BhcnNlcjo6UGFyc2VUZW1wbGF0ZUFyZ0xpc3QoUmVjb3JkICpDdXJSZWMpIHsKKyAgYXNzZXJ0KExleC5nZXRDb2RlKCkgPT0gdGd0b2s6Omxlc3MgJiYgIk5vdCBhIHRlbXBsYXRlIGFyZyBsaXN0ISIpOworICBMZXguTGV4KCk7IC8vIGVhdCB0aGUgJzwnCisKKyAgUmVjb3JkICpUaGVSZWNUb0FkZFRvID0gQ3VyUmVjID8gQ3VyUmVjIDogJkN1ck11bHRpQ2xhc3MtPlJlYzsKKworICAvLyBSZWFkIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KKyAgc3RkOjpzdHJpbmcgVGVtcGxBcmcgPSBQYXJzZURlY2xhcmF0aW9uKEN1clJlYywgdHJ1ZS8qdGVtcGxhdGVhcmdzKi8pOworICBpZiAoVGVtcGxBcmcuZW1wdHkoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBUaGVSZWNUb0FkZFRvLT5hZGRUZW1wbGF0ZUFyZyhUZW1wbEFyZyk7CisKKyAgd2hpbGUgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OmNvbW1hKSB7CisgICAgTGV4LkxleCgpOyAvLyBlYXQgdGhlICcsJworCisgICAgLy8gUmVhZCB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9ucy4KKyAgICBUZW1wbEFyZyA9IFBhcnNlRGVjbGFyYXRpb24oQ3VyUmVjLCB0cnVlLyp0ZW1wbGF0ZWFyZ3MqLyk7CisgICAgaWYgKFRlbXBsQXJnLmVtcHR5KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBUaGVSZWNUb0FkZFRvLT5hZGRUZW1wbGF0ZUFyZyhUZW1wbEFyZyk7CisgIH0KKworICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6Z3JlYXRlcikKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkICc+JyBhdCBlbmQgb2YgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCIpOworICBMZXguTGV4KCk7IC8vIGVhdCB0aGUgJz4nLgorICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8vIFBhcnNlQm9keUl0ZW0gLSBQYXJzZSBhIHNpbmdsZSBpdGVtIGF0IHdpdGhpbiB0aGUgYm9keSBvZiBhIGRlZiBvciBjbGFzcy4KKy8vLworLy8vICAgQm9keUl0ZW0gOjo9IERlY2xhcmF0aW9uICc7JworLy8vICAgQm9keUl0ZW0gOjo9IExFVCBJRCBPcHRpb25hbEJpdExpc3QgJz0nIFZhbHVlICc7JworYm9vbCBUR1BhcnNlcjo6UGFyc2VCb2R5SXRlbShSZWNvcmQgKkN1clJlYykgeworICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6TGV0KSB7CisgICAgaWYgKFBhcnNlRGVjbGFyYXRpb24oQ3VyUmVjLCBmYWxzZSkuZW1wdHkoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OnNlbWkpCisgICAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkICc7JyBhZnRlciBkZWNsYXJhdGlvbiIpOworICAgIExleC5MZXgoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBMRVQgSUQgT3B0aW9uYWxSYW5nZUxpc3QgJz0nIFZhbHVlICc7JworICBpZiAoTGV4LkxleCgpICE9IHRndG9rOjpJZCkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIGZpZWxkIGlkZW50aWZpZXIgYWZ0ZXIgbGV0Iik7CisKKyAgU01Mb2MgSWRMb2MgPSBMZXguZ2V0TG9jKCk7CisgIHN0ZDo6c3RyaW5nIEZpZWxkTmFtZSA9IExleC5nZXRDdXJTdHJWYWwoKTsKKyAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSBmaWVsZCBuYW1lLgorCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBCaXRMaXN0OworICBpZiAoUGFyc2VPcHRpb25hbEJpdExpc3QoQml0TGlzdCkpCisgICAgcmV0dXJuIHRydWU7CisgIHN0ZDo6cmV2ZXJzZShCaXRMaXN0LmJlZ2luKCksIEJpdExpc3QuZW5kKCkpOworCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjplcXVhbCkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkICc9JyBpbiBsZXQgZXhwcmVzc2lvbiIpOworICBMZXguTGV4KCk7ICAvLyBlYXQgdGhlICc9Jy4KKworICBSZWNvcmRWYWwgKkZpZWxkID0gQ3VyUmVjLT5nZXRWYWx1ZShGaWVsZE5hbWUpOworICBpZiAoRmllbGQgPT0gMCkKKyAgICByZXR1cm4gVG9rRXJyb3IoIlZhbHVlICciICsgRmllbGROYW1lICsgIicgdW5rbm93biEiKTsKKworICBSZWNUeSAqVHlwZSA9IEZpZWxkLT5nZXRUeXBlKCk7CisKKyAgSW5pdCAqVmFsID0gUGFyc2VWYWx1ZShDdXJSZWMsIFR5cGUpOworICBpZiAoVmFsID09IDApIHJldHVybiB0cnVlOworCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpzZW1pKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgJzsnIGFmdGVyIGxldCBleHByZXNzaW9uIik7CisgIExleC5MZXgoKTsKKworICByZXR1cm4gU2V0VmFsdWUoQ3VyUmVjLCBJZExvYywgRmllbGROYW1lLCBCaXRMaXN0LCBWYWwpOworfQorCisvLy8gUGFyc2VCb2R5IC0gUmVhZCB0aGUgYm9keSBvZiBhIGNsYXNzIG9yIGRlZi4gIFJldHVybiB0cnVlIG9uIGVycm9yLCBmYWxzZSBvbgorLy8vIHN1Y2Nlc3MuCisvLy8KKy8vLyAgIEJvZHkgICAgIDo6PSAnOycKKy8vLyAgIEJvZHkgICAgIDo6PSAneycgQm9keUxpc3QgJ30nCisvLy8gICBCb2R5TGlzdCBCb2R5SXRlbSoKKy8vLworYm9vbCBUR1BhcnNlcjo6UGFyc2VCb2R5KFJlY29yZCAqQ3VyUmVjKSB7CisgIC8vIElmIHRoaXMgaXMgYSBudWxsIGRlZmluaXRpb24sIGp1c3QgZWF0IHRoZSBzZW1pIGFuZCByZXR1cm4uCisgIGlmIChMZXguZ2V0Q29kZSgpID09IHRndG9rOjpzZW1pKSB7CisgICAgTGV4LkxleCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpsX2JyYWNlKQorICAgIHJldHVybiBUb2tFcnJvcigiRXhwZWN0ZWQgJzsnIG9yICd7JyB0byBzdGFydCBib2R5Iik7CisgIC8vIEVhdCB0aGUgJ3snLgorICBMZXguTGV4KCk7CisKKyAgd2hpbGUgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OnJfYnJhY2UpCisgICAgaWYgKFBhcnNlQm9keUl0ZW0oQ3VyUmVjKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgIC8vIEVhdCB0aGUgJ30nLgorICBMZXguTGV4KCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFBhcnNlT2JqZWN0Qm9keSAtIFBhcnNlIHRoZSBib2R5IG9mIGEgZGVmIG9yIGNsYXNzLiAgVGhpcyBjb25zaXN0cyBvZiBhbgorLy8vIG9wdGlvbmFsIENsYXNzTGlzdCBmb2xsb3dlZCBieSBhIEJvZHkuICBDdXJSZWMgaXMgdGhlIGN1cnJlbnQgZGVmIG9yIGNsYXNzCisvLy8gdGhhdCBpcyBiZWluZyBwYXJzZWQuCisvLy8KKy8vLyAgIE9iamVjdEJvZHkgICAgICA6Oj0gQmFzZUNsYXNzTGlzdCBCb2R5CisvLy8gICBCYXNlQ2xhc3NMaXN0ICAgOjo9IC8qZW1wdHkqLworLy8vICAgQmFzZUNsYXNzTGlzdCAgIDo6PSAnOicgQmFzZUNsYXNzTGlzdE5FCisvLy8gICBCYXNlQ2xhc3NMaXN0TkUgOjo9IFN1YkNsYXNzUmVmICgnLCcgU3ViQ2xhc3NSZWYpKgorLy8vCitib29sIFRHUGFyc2VyOjpQYXJzZU9iamVjdEJvZHkoUmVjb3JkICpDdXJSZWMpIHsKKyAgLy8gSWYgdGhlcmUgaXMgYSBiYXNlY2xhc3MgbGlzdCwgcmVhZCBpdC4KKyAgaWYgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OmNvbG9uKSB7CisgICAgTGV4LkxleCgpOworCisgICAgLy8gUmVhZCBhbGwgb2YgdGhlIHN1YmNsYXNzZXMuCisgICAgU3ViQ2xhc3NSZWZlcmVuY2UgU3ViQ2xhc3MgPSBQYXJzZVN1YkNsYXNzUmVmZXJlbmNlKEN1clJlYywgZmFsc2UpOworICAgIHdoaWxlICgxKSB7CisgICAgICAvLyBDaGVjayBmb3IgZXJyb3IuCisgICAgICBpZiAoU3ViQ2xhc3MuUmVjID09IDApIHJldHVybiB0cnVlOworCisgICAgICAvLyBBZGQgaXQuCisgICAgICBpZiAoQWRkU3ViQ2xhc3MoQ3VyUmVjLCBTdWJDbGFzcykpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6Y29tbWEpIGJyZWFrOworICAgICAgTGV4LkxleCgpOyAvLyBlYXQgJywnLgorICAgICAgU3ViQ2xhc3MgPSBQYXJzZVN1YkNsYXNzUmVmZXJlbmNlKEN1clJlYywgZmFsc2UpOworICAgIH0KKyAgfQorCisgIC8vIFByb2Nlc3MgYW55IHZhcmlhYmxlcyBvbiB0aGUgbGV0IHN0YWNrLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTGV0U3RhY2suc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBlID0gTGV0U3RhY2tbaV0uc2l6ZSgpOyBqICE9IGU7ICsraikKKyAgICAgIGlmIChTZXRWYWx1ZShDdXJSZWMsIExldFN0YWNrW2ldW2pdLkxvYywgTGV0U3RhY2tbaV1bal0uTmFtZSwKKyAgICAgICAgICAgICAgICAgICBMZXRTdGFja1tpXVtqXS5CaXRzLCBMZXRTdGFja1tpXVtqXS5WYWx1ZSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBQYXJzZUJvZHkoQ3VyUmVjKTsKK30KKworLy8vIFBhcnNlRGVmIC0gUGFyc2UgYW5kIHJldHVybiBhIHRvcCBsZXZlbCBvciBtdWx0aWNsYXNzIGRlZiwgcmV0dXJuIHRoZSByZWNvcmQKKy8vLyBjb3JyZXNwb25kaW5nIHRvIGl0LiAgVGhpcyByZXR1cm5zIG51bGwgb24gZXJyb3IuCisvLy8KKy8vLyAgIERlZkluc3QgOjo9IERFRiBPYmplY3ROYW1lIE9iamVjdEJvZHkKKy8vLworYm9vbCBUR1BhcnNlcjo6UGFyc2VEZWYoTXVsdGlDbGFzcyAqQ3VyTXVsdGlDbGFzcykgeworICBTTUxvYyBEZWZMb2MgPSBMZXguZ2V0TG9jKCk7CisgIGFzc2VydChMZXguZ2V0Q29kZSgpID09IHRndG9rOjpEZWYgJiYgIlVua25vd24gdG9rIik7CisgIExleC5MZXgoKTsgIC8vIEVhdCB0aGUgJ2RlZicgdG9rZW4uCisKKyAgLy8gUGFyc2UgT2JqZWN0TmFtZSBhbmQgbWFrZSBhIHJlY29yZCBmb3IgaXQuCisgIFJlY29yZCAqQ3VyUmVjID0gbmV3IFJlY29yZChQYXJzZU9iamVjdE5hbWUoKSwgRGVmTG9jKTsKKworICBpZiAoIUN1ck11bHRpQ2xhc3MpIHsKKyAgICAvLyBUb3AtbGV2ZWwgZGVmIGRlZmluaXRpb24uCisKKyAgICAvLyBFbnN1cmUgcmVkZWZpbml0aW9uIGRvZXNuJ3QgaGFwcGVuLgorICAgIGlmIChSZWNvcmRzLmdldERlZihDdXJSZWMtPmdldE5hbWUoKSkpIHsKKyAgICAgIEVycm9yKERlZkxvYywgImRlZiAnIiArIEN1clJlYy0+Z2V0TmFtZSgpICsgIicgYWxyZWFkeSBkZWZpbmVkIik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgUmVjb3Jkcy5hZGREZWYoQ3VyUmVjKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPdGhlcndpc2UsIGEgZGVmIGluc2lkZSBhIG11bHRpY2xhc3MsIGFkZCBpdCB0byB0aGUgbXVsdGljbGFzcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ3VyTXVsdGlDbGFzcy0+RGVmUHJvdG90eXBlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKEN1ck11bHRpQ2xhc3MtPkRlZlByb3RvdHlwZXNbaV0tPmdldE5hbWUoKSA9PSBDdXJSZWMtPmdldE5hbWUoKSkgeworICAgICAgICBFcnJvcihEZWZMb2MsICJkZWYgJyIgKyBDdXJSZWMtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICInIGFscmVhZHkgZGVmaW5lZCBpbiB0aGlzIG11bHRpY2xhc3MhIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIEN1ck11bHRpQ2xhc3MtPkRlZlByb3RvdHlwZXMucHVzaF9iYWNrKEN1clJlYyk7CisgIH0KKworICBpZiAoUGFyc2VPYmplY3RCb2R5KEN1clJlYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKEN1ck11bHRpQ2xhc3MgPT0gMCkgIC8vIERlZidzIGluIG11bHRpY2xhc3NlcyBhcmVuJ3QgcmVhbGx5IGRlZnMuCisgICAgQ3VyUmVjLT5yZXNvbHZlUmVmZXJlbmNlcygpOworCisgIC8vIElmIE9iamVjdEJvZHkgaGFzIHRlbXBsYXRlIGFyZ3VtZW50cywgaXQncyBhbiBlcnJvci4KKyAgYXNzZXJ0KEN1clJlYy0+Z2V0VGVtcGxhdGVBcmdzKCkuZW1wdHkoKSAmJiAiSG93J2QgdGhpcyBnZXQgdGVtcGxhdGUgYXJncz8iKTsKKworICBpZiAoQ3VyTXVsdGlDbGFzcykgeworICAgIC8vIENvcHkgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgdGhlIG11bHRpY2xhc3MgaW50byB0aGUgZGVmLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmVEFyZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJNdWx0aUNsYXNzLT5SZWMuZ2V0VGVtcGxhdGVBcmdzKCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVEFyZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgUmVjb3JkVmFsICpSViA9IEN1ck11bHRpQ2xhc3MtPlJlYy5nZXRWYWx1ZShUQXJnc1tpXSk7CisgICAgICBhc3NlcnQoUlYgJiYgIlRlbXBsYXRlIGFyZyBkb2Vzbid0IGV4aXN0PyIpOworICAgICAgQ3VyUmVjLT5hZGRWYWx1ZSgqUlYpOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworCisvLy8gUGFyc2VDbGFzcyAtIFBhcnNlIGEgdGJsZ2VuIGNsYXNzIGRlZmluaXRpb24uCisvLy8KKy8vLyAgIENsYXNzSW5zdCA6Oj0gQ0xBU1MgSUQgVGVtcGxhdGVBcmdMaXN0PyBPYmplY3RCb2R5CisvLy8KK2Jvb2wgVEdQYXJzZXI6OlBhcnNlQ2xhc3MoKSB7CisgIGFzc2VydChMZXguZ2V0Q29kZSgpID09IHRndG9rOjpDbGFzcyAmJiAiVW5leHBlY3RlZCB0b2tlbiEiKTsKKyAgTGV4LkxleCgpOworCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpJZCkKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkIGNsYXNzIG5hbWUgYWZ0ZXIgJ2NsYXNzJyBrZXl3b3JkIik7CisKKyAgUmVjb3JkICpDdXJSZWMgPSBSZWNvcmRzLmdldENsYXNzKExleC5nZXRDdXJTdHJWYWwoKSk7CisgIGlmIChDdXJSZWMpIHsKKyAgICAvLyBJZiB0aGUgYm9keSB3YXMgcHJldmlvdXNseSBkZWZpbmVkLCB0aGlzIGlzIGFuIGVycm9yLgorICAgIGlmICghQ3VyUmVjLT5nZXRWYWx1ZXMoKS5lbXB0eSgpIHx8CisgICAgICAgICFDdXJSZWMtPmdldFN1cGVyQ2xhc3NlcygpLmVtcHR5KCkgfHwKKyAgICAgICAgIUN1clJlYy0+Z2V0VGVtcGxhdGVBcmdzKCkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBUb2tFcnJvcigiQ2xhc3MgJyIgKyBDdXJSZWMtPmdldE5hbWUoKSArICInIGFscmVhZHkgZGVmaW5lZCIpOworICB9IGVsc2UgeworICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHJlZmVyZW5jZSB0byB0aGlzIGNsYXNzLCBjcmVhdGUgYW5kIGFkZCBpdC4KKyAgICBDdXJSZWMgPSBuZXcgUmVjb3JkKExleC5nZXRDdXJTdHJWYWwoKSwgTGV4LmdldExvYygpKTsKKyAgICBSZWNvcmRzLmFkZENsYXNzKEN1clJlYyk7CisgIH0KKyAgTGV4LkxleCgpOyAvLyBlYXQgdGhlIG5hbWUuCisKKyAgLy8gSWYgdGhlcmUgYXJlIHRlbXBsYXRlIGFyZ3MsIHBhcnNlIHRoZW0uCisgIGlmIChMZXguZ2V0Q29kZSgpID09IHRndG9rOjpsZXNzKQorICAgIGlmIChQYXJzZVRlbXBsYXRlQXJnTGlzdChDdXJSZWMpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gRmluYWxseSwgcGFyc2UgdGhlIG9iamVjdCBib2R5LgorICByZXR1cm4gUGFyc2VPYmplY3RCb2R5KEN1clJlYyk7Cit9CisKKy8vLyBQYXJzZUxldExpc3QgLSBQYXJzZSBhIG5vbi1lbXB0eSBsaXN0IG9mIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMgaW50byBhIGxpc3QKKy8vLyBvZiBMZXRSZWNvcmRzLgorLy8vCisvLy8gICBMZXRMaXN0IDo6PSBMZXRJdGVtICgnLCcgTGV0SXRlbSkqCisvLy8gICBMZXRJdGVtIDo6PSBJRCBPcHRpb25hbFJhbmdlTGlzdCAnPScgVmFsdWUKKy8vLworc3RkOjp2ZWN0b3I8TGV0UmVjb3JkPiBUR1BhcnNlcjo6UGFyc2VMZXRMaXN0KCkgeworICBzdGQ6OnZlY3RvcjxMZXRSZWNvcmQ+IFJlc3VsdDsKKworICB3aGlsZSAoMSkgeworICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpJZCkgeworICAgICAgVG9rRXJyb3IoImV4cGVjdGVkIGlkZW50aWZpZXIgaW4gbGV0IGRlZmluaXRpb24iKTsKKyAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxMZXRSZWNvcmQ+KCk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIE5hbWUgPSBMZXguZ2V0Q3VyU3RyVmFsKCk7CisgICAgU01Mb2MgTmFtZUxvYyA9IExleC5nZXRMb2MoKTsKKyAgICBMZXguTGV4KCk7ICAvLyBFYXQgdGhlIGlkZW50aWZpZXIuCisKKyAgICAvLyBDaGVjayBmb3IgYW4gb3B0aW9uYWwgUmFuZ2VMaXN0LgorICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBCaXRzOworICAgIGlmIChQYXJzZU9wdGlvbmFsUmFuZ2VMaXN0KEJpdHMpKQorICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPExldFJlY29yZD4oKTsKKyAgICBzdGQ6OnJldmVyc2UoQml0cy5iZWdpbigpLCBCaXRzLmVuZCgpKTsKKworICAgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjplcXVhbCkgeworICAgICAgVG9rRXJyb3IoImV4cGVjdGVkICc9JyBpbiBsZXQgZXhwcmVzc2lvbiIpOworICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPExldFJlY29yZD4oKTsKKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnPScuCisKKyAgICBJbml0ICpWYWwgPSBQYXJzZVZhbHVlKDApOworICAgIGlmIChWYWwgPT0gMCkgcmV0dXJuIHN0ZDo6dmVjdG9yPExldFJlY29yZD4oKTsKKworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZXZlcnl0aGluZywgYWRkIHRoZSByZWNvcmQuCisgICAgUmVzdWx0LnB1c2hfYmFjayhMZXRSZWNvcmQoTmFtZSwgQml0cywgVmFsLCBOYW1lTG9jKSk7CisKKyAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6Y29tbWEpCisgICAgICByZXR1cm4gUmVzdWx0OworICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgY29tbWEuCisgIH0KK30KKworLy8vIFBhcnNlVG9wTGV2ZWxMZXQgLSBQYXJzZSBhICdsZXQnIGF0IHRvcCBsZXZlbC4gIFRoaXMgY2FuIGJlIGEgY291cGxlIG9mCisvLy8gZGlmZmVyZW50IHJlbGF0ZWQgcHJvZHVjdGlvbnMuIFRoaXMgd29ya3MgaW5zaWRlIG11bHRpY2xhc3NlcyB0b28uCisvLy8KKy8vLyAgIE9iamVjdCA6Oj0gTEVUIExldExpc3QgSU4gJ3snIE9iamVjdExpc3QgJ30nCisvLy8gICBPYmplY3QgOjo9IExFVCBMZXRMaXN0IElOIE9iamVjdAorLy8vCitib29sIFRHUGFyc2VyOjpQYXJzZVRvcExldmVsTGV0KE11bHRpQ2xhc3MgKkN1ck11bHRpQ2xhc3MpIHsKKyAgYXNzZXJ0KExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OkxldCAmJiAiVW5leHBlY3RlZCB0b2tlbiIpOworICBMZXguTGV4KCk7CisKKyAgLy8gQWRkIHRoaXMgZW50cnkgdG8gdGhlIGxldCBzdGFjay4KKyAgc3RkOjp2ZWN0b3I8TGV0UmVjb3JkPiBMZXRJbmZvID0gUGFyc2VMZXRMaXN0KCk7CisgIGlmIChMZXRJbmZvLmVtcHR5KCkpIHJldHVybiB0cnVlOworICBMZXRTdGFjay5wdXNoX2JhY2soTGV0SW5mbyk7CisKKyAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OkluKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgJ2luJyBhdCBlbmQgb2YgdG9wLWxldmVsICdsZXQnIik7CisgIExleC5MZXgoKTsKKworICAvLyBJZiB0aGlzIGlzIGEgc2NhbGFyIGxldCwganVzdCBoYW5kbGUgaXQgbm93CisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpsX2JyYWNlKSB7CisgICAgLy8gTEVUIExldExpc3QgSU4gT2JqZWN0CisgICAgaWYgKFBhcnNlT2JqZWN0KEN1ck11bHRpQ2xhc3MpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7ICAgLy8gT2JqZWN0IDo6PSBMRVRDb21tYW5kICd7JyBPYmplY3RMaXN0ICd9JworICAgIFNNTG9jIEJyYWNlTG9jID0gTGV4LmdldExvYygpOworICAgIC8vIE90aGVyd2lzZSwgdGhpcyBpcyBhIGdyb3VwIGxldC4KKyAgICBMZXguTGV4KCk7ICAvLyBlYXQgdGhlICd7Jy4KKworICAgIC8vIFBhcnNlIHRoZSBvYmplY3QgbGlzdC4KKyAgICBpZiAoUGFyc2VPYmplY3RMaXN0KEN1ck11bHRpQ2xhc3MpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6cl9icmFjZSkgeworICAgICAgVG9rRXJyb3IoImV4cGVjdGVkICd9JyBhdCBlbmQgb2YgdG9wIGxldmVsIGxldCBjb21tYW5kIik7CisgICAgICByZXR1cm4gRXJyb3IoQnJhY2VMb2MsICJ0byBtYXRjaCB0aGlzICd7JyIpOworICAgIH0KKyAgICBMZXguTGV4KCk7CisgIH0KKworICAvLyBPdXRzaWRlIHRoaXMgbGV0IHNjb3BlLCB0aGlzIGxldCBibG9jayBpcyBub3QgYWN0aXZlLgorICBMZXRTdGFjay5wb3BfYmFjaygpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZU11bHRpQ2xhc3MgLSBQYXJzZSBhIG11bHRpY2xhc3MgZGVmaW5pdGlvbi4KKy8vLworLy8vICBNdWx0aUNsYXNzSW5zdCA6Oj0gTVVMVElDTEFTUyBJRCBUZW1wbGF0ZUFyZ0xpc3Q/CisvLy8gICAgICAgICAgICAgICAgICAgICAnOicgQmFzZU11bHRpQ2xhc3NMaXN0ICd7JyBNdWx0aUNsYXNzRGVmKyAnfScKKy8vLworYm9vbCBUR1BhcnNlcjo6UGFyc2VNdWx0aUNsYXNzKCkgeworICBhc3NlcnQoTGV4LmdldENvZGUoKSA9PSB0Z3Rvazo6TXVsdGlDbGFzcyAmJiAiVW5leHBlY3RlZCB0b2tlbiIpOworICBMZXguTGV4KCk7ICAvLyBFYXQgdGhlIG11bHRpY2xhc3MgdG9rZW4uCisKKyAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OklkKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgaWRlbnRpZmllciBhZnRlciBtdWx0aWNsYXNzIGZvciBuYW1lIik7CisgIHN0ZDo6c3RyaW5nIE5hbWUgPSBMZXguZ2V0Q3VyU3RyVmFsKCk7CisKKyAgaWYgKE11bHRpQ2xhc3Nlcy5jb3VudChOYW1lKSkKKyAgICByZXR1cm4gVG9rRXJyb3IoIm11bHRpY2xhc3MgJyIgKyBOYW1lICsgIicgYWxyZWFkeSBkZWZpbmVkIik7CisKKyAgQ3VyTXVsdGlDbGFzcyA9IE11bHRpQ2xhc3Nlc1tOYW1lXSA9IG5ldyBNdWx0aUNsYXNzKE5hbWUsIExleC5nZXRMb2MoKSk7CisgIExleC5MZXgoKTsgIC8vIEVhdCB0aGUgaWRlbnRpZmllci4KKworICAvLyBJZiB0aGVyZSBhcmUgdGVtcGxhdGUgYXJncywgcGFyc2UgdGhlbS4KKyAgaWYgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6Omxlc3MpCisgICAgaWYgKFBhcnNlVGVtcGxhdGVBcmdMaXN0KDApKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgYm9vbCBpbmhlcml0cyA9IGZhbHNlOworCisgIC8vIElmIHRoZXJlIGFyZSBzdWJtdWx0aWNsYXNzZXMsIHBhcnNlIHRoZW0uCisgIGlmIChMZXguZ2V0Q29kZSgpID09IHRndG9rOjpjb2xvbikgeworICAgIGluaGVyaXRzID0gdHJ1ZTsKKworICAgIExleC5MZXgoKTsKKworICAgIC8vIFJlYWQgYWxsIG9mIHRoZSBzdWJtdWx0aWNsYXNzZXMuCisgICAgU3ViTXVsdGlDbGFzc1JlZmVyZW5jZSBTdWJNdWx0aUNsYXNzID0KKyAgICAgIFBhcnNlU3ViTXVsdGlDbGFzc1JlZmVyZW5jZShDdXJNdWx0aUNsYXNzKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgLy8gQ2hlY2sgZm9yIGVycm9yLgorICAgICAgaWYgKFN1Yk11bHRpQ2xhc3MuTUMgPT0gMCkgcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIEFkZCBpdC4KKyAgICAgIGlmIChBZGRTdWJNdWx0aUNsYXNzKEN1ck11bHRpQ2xhc3MsIFN1Yk11bHRpQ2xhc3MpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OmNvbW1hKSBicmVhazsKKyAgICAgIExleC5MZXgoKTsgLy8gZWF0ICcsJy4KKyAgICAgIFN1Yk11bHRpQ2xhc3MgPSBQYXJzZVN1Yk11bHRpQ2xhc3NSZWZlcmVuY2UoQ3VyTXVsdGlDbGFzcyk7CisgICAgfQorICB9CisKKyAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OmxfYnJhY2UpIHsKKyAgICBpZiAoIWluaGVyaXRzKQorICAgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCAneycgaW4gbXVsdGljbGFzcyBkZWZpbml0aW9uIik7CisgICAgZWxzZSBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6c2VtaSkKKyAgICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgJzsnIGluIG11bHRpY2xhc3MgZGVmaW5pdGlvbiIpOworICAgIGVsc2UKKyAgICAgIExleC5MZXgoKTsgIC8vIGVhdCB0aGUgJzsnLgorICB9IGVsc2UgeworICAgIGlmIChMZXguTGV4KCkgPT0gdGd0b2s6OnJfYnJhY2UpICAvLyBlYXQgdGhlICd7Jy4KKyAgICAgIHJldHVybiBUb2tFcnJvcigibXVsdGljbGFzcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGRlZiIpOworCisgICAgd2hpbGUgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OnJfYnJhY2UpIHsKKyAgICAgIHN3aXRjaCAoTGV4LmdldENvZGUoKSkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgJ2xldCcsICdkZWYnIG9yICdkZWZtJyBpbiBtdWx0aWNsYXNzIGJvZHkiKTsKKyAgICAgICAgY2FzZSB0Z3Rvazo6TGV0OgorICAgICAgICBjYXNlIHRndG9rOjpEZWY6CisgICAgICAgIGNhc2UgdGd0b2s6OkRlZm06CisgICAgICAgICAgaWYgKFBhcnNlT2JqZWN0KEN1ck11bHRpQ2xhc3MpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgTGV4LkxleCgpOyAgLy8gZWF0IHRoZSAnfScuCisgIH0KKworICBDdXJNdWx0aUNsYXNzID0gMDsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gUGFyc2VEZWZtIC0gUGFyc2UgdGhlIGluc3RhbnRpYXRpb24gb2YgYSBtdWx0aWNsYXNzLgorLy8vCisvLy8gICBEZWZNSW5zdCA6Oj0gREVGTSBJRCAnOicgRGVmbVN1YkNsYXNzUmVmICc7JworLy8vCitib29sIFRHUGFyc2VyOjpQYXJzZURlZm0oTXVsdGlDbGFzcyAqQ3VyTXVsdGlDbGFzcykgeworICBhc3NlcnQoTGV4LmdldENvZGUoKSA9PSB0Z3Rvazo6RGVmbSAmJiAiVW5leHBlY3RlZCB0b2tlbiEiKTsKKyAgaWYgKExleC5MZXgoKSAhPSB0Z3Rvazo6SWQpICAvLyBlYXQgdGhlIGRlZm0uCisgICAgcmV0dXJuIFRva0Vycm9yKCJleHBlY3RlZCBpZGVudGlmaWVyIGFmdGVyIGRlZm0iKTsKKworICBTTUxvYyBEZWZtUHJlZml4TG9jID0gTGV4LmdldExvYygpOworICBzdGQ6OnN0cmluZyBEZWZtUHJlZml4ID0gTGV4LmdldEN1clN0clZhbCgpOworICBpZiAoTGV4LkxleCgpICE9IHRndG9rOjpjb2xvbikKKyAgICByZXR1cm4gVG9rRXJyb3IoImV4cGVjdGVkICc6JyBhZnRlciBkZWZtIGlkZW50aWZpZXIiKTsKKworICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBuZXcgZ2VuZXJhdGVkIHJlY29yZCBkZWZpbml0aW9ucy4KKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gTmV3UmVjRGVmczsKKworICAvLyBUaGlzIHJlY29yZCBhbHNvIGluaGVyaXRzIGZyb20gYSByZWd1bGFyIGNsYXNzIChub24tbXVsdGljbGFzcyk/CisgIGJvb2wgSW5oZXJpdEZyb21DbGFzcyA9IGZhbHNlOworCisgIC8vIGVhdCB0aGUgY29sb24uCisgIExleC5MZXgoKTsKKworICBTTUxvYyBTdWJDbGFzc0xvYyA9IExleC5nZXRMb2MoKTsKKyAgU3ViQ2xhc3NSZWZlcmVuY2UgUmVmID0gUGFyc2VTdWJDbGFzc1JlZmVyZW5jZSgwLCB0cnVlKTsKKworICB3aGlsZSAoMSkgeworICAgIGlmIChSZWYuUmVjID09IDApIHJldHVybiB0cnVlOworCisgICAgLy8gVG8gaW5zdGFudGlhdGUgYSBtdWx0aWNsYXNzLCB3ZSBuZWVkIHRvIGZpcnN0IGdldCB0aGUgbXVsdGljbGFzcywgdGhlbgorICAgIC8vIGluc3RhbnRpYXRlIGVhY2ggZGVmIGNvbnRhaW5lZCBpbiB0aGUgbXVsdGljbGFzcyB3aXRoIHRoZSBTdWJDbGFzc1JlZgorICAgIC8vIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgICAgTXVsdGlDbGFzcyAqTUMgPSBNdWx0aUNsYXNzZXNbUmVmLlJlYy0+Z2V0TmFtZSgpXTsKKyAgICBhc3NlcnQoTUMgJiYgIkRpZG4ndCBsb29rdXAgbXVsdGljbGFzcyBjb3JyZWN0bHk/Iik7CisgICAgc3RkOjp2ZWN0b3I8SW5pdCo+ICZUZW1wbGF0ZVZhbHMgPSBSZWYuVGVtcGxhdGVBcmdzOworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyB3ZXJlIHNwZWNpZmllZC4KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJlRBcmdzID0gTUMtPlJlYy5nZXRUZW1wbGF0ZUFyZ3MoKTsKKyAgICBpZiAoVEFyZ3Muc2l6ZSgpIDwgVGVtcGxhdGVWYWxzLnNpemUoKSkKKyAgICAgIHJldHVybiBFcnJvcihTdWJDbGFzc0xvYywKKyAgICAgICAgICAgICAgICAgICAibW9yZSB0ZW1wbGF0ZSBhcmdzIHNwZWNpZmllZCB0aGFuIG11bHRpY2xhc3MgZXhwZWN0cyIpOworCisgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgZGVmJ3MgaW4gdGhlIG11bHRpY2xhc3MsIGluc3RhbnRpYXRpbmcgZWFjaCBvbmUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1DLT5EZWZQcm90b3R5cGVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIFJlY29yZCAqRGVmUHJvdG8gPSBNQy0+RGVmUHJvdG90eXBlc1tpXTsKKworICAgICAgLy8gQWRkIGluIHRoZSBkZWZtIG5hbWUKKyAgICAgIHN0ZDo6c3RyaW5nIERlZk5hbWUgPSBEZWZQcm90by0+Z2V0TmFtZSgpOworICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpZHggPSBEZWZOYW1lLmZpbmQoIiNOQU1FIyIpOworICAgICAgaWYgKGlkeCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBEZWZOYW1lLnJlcGxhY2UoaWR4LCA2LCBEZWZtUHJlZml4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFkZCB0aGUgc3VmZml4IHRvIHRoZSBkZWZtIG5hbWUgdG8gZ2V0IHRoZSBuZXcgbmFtZS4KKyAgICAgICAgRGVmTmFtZSA9IERlZm1QcmVmaXggKyBEZWZOYW1lOworICAgICAgfQorCisgICAgICBSZWNvcmQgKkN1clJlYyA9IG5ldyBSZWNvcmQoRGVmTmFtZSwgRGVmbVByZWZpeExvYyk7CisKKyAgICAgIFN1YkNsYXNzUmVmZXJlbmNlIFJlZjsKKyAgICAgIFJlZi5SZWZMb2MgPSBEZWZtUHJlZml4TG9jOworICAgICAgUmVmLlJlYyA9IERlZlByb3RvOworICAgICAgQWRkU3ViQ2xhc3MoQ3VyUmVjLCBSZWYpOworCisgICAgICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMsIHNldHRpbmcgdGhlbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICAvLyB2YWx1ZSBvciBsZWF2aW5nIHRoZW0gYXMgdGhlIGRlZmF1bHQgaWYgbmVjZXNzYXJ5LgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRBcmdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIHRoaXMgdGVtcC1hcmcuCisgICAgICAgIGlmIChpIDwgVGVtcGxhdGVWYWxzLnNpemUoKSkgeworICAgICAgICAgIC8vIFNldCBpdCBub3cuCisgICAgICAgICAgaWYgKFNldFZhbHVlKEN1clJlYywgRGVmbVByZWZpeExvYywgVEFyZ3NbaV0sIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPigpLAorICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVZhbHNbaV0pKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAvLyBSZXNvbHZlIGl0IG5leHQuCisgICAgICAgICAgQ3VyUmVjLT5yZXNvbHZlUmVmZXJlbmNlc1RvKEN1clJlYy0+Z2V0VmFsdWUoVEFyZ3NbaV0pKTsKKworICAgICAgICAgIC8vIE5vdyByZW1vdmUgaXQuCisgICAgICAgICAgQ3VyUmVjLT5yZW1vdmVWYWx1ZShUQXJnc1tpXSk7CisKKyAgICAgICAgfSBlbHNlIGlmICghQ3VyUmVjLT5nZXRWYWx1ZShUQXJnc1tpXSktPmdldFZhbHVlKCktPmlzQ29tcGxldGUoKSkgeworICAgICAgICAgIHJldHVybiBFcnJvcihTdWJDbGFzc0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIG5vdCBzcGVjaWZpZWQgZm9yIHRlbXBsYXRlIGFyZ3VtZW50ICMiKworICAgICAgICAgICAgICAgICAgICAgICB1dG9zdHIoaSkgKyAiICgiICsgVEFyZ3NbaV0gKyAiKSBvZiBtdWx0aWNsYXNzY2xhc3MgJyIgKworICAgICAgICAgICAgICAgICAgICAgICBNQy0+UmVjLmdldE5hbWUoKSArICInIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhlIG1kZWYgaXMgaW5zaWRlIGEgJ2xldCcgZXhwcmVzc2lvbiwgYWRkIHRvIGVhY2ggZGVmLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExldFN0YWNrLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGUgPSBMZXRTdGFja1tpXS5zaXplKCk7IGogIT0gZTsgKytqKQorICAgICAgICAgIGlmIChTZXRWYWx1ZShDdXJSZWMsIExldFN0YWNrW2ldW2pdLkxvYywgTGV0U3RhY2tbaV1bal0uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgTGV0U3RhY2tbaV1bal0uQml0cywgTGV0U3RhY2tbaV1bal0uVmFsdWUpKSB7CisgICAgICAgICAgICBFcnJvcihEZWZtUHJlZml4TG9jLCAid2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgZGVmbSIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorCisgICAgICAvLyBFbnN1cmUgcmVkZWZpbml0aW9uIGRvZXNuJ3QgaGFwcGVuLgorICAgICAgaWYgKFJlY29yZHMuZ2V0RGVmKEN1clJlYy0+Z2V0TmFtZSgpKSkKKyAgICAgICAgcmV0dXJuIEVycm9yKERlZm1QcmVmaXhMb2MsICJkZWYgJyIgKyBDdXJSZWMtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAiJyBhbHJlYWR5IGRlZmluZWQsIGluc3RhbnRpYXRpbmcgZGVmbSB3aXRoIHN1YmRlZiAnIiArCisgICAgICAgICAgICAgICAgICAgICBEZWZQcm90by0+Z2V0TmFtZSgpICsgIiciKTsKKworICAgICAgLy8gRG9uJ3QgY3JlYXRlIGEgdG9wIGxldmVsIGRlZmluaXRpb24gZm9yIGRlZm0gaW5zaWRlIG11bHRpY2xhc3NlcywKKyAgICAgIC8vIGluc3RlYWQsIG9ubHkgdXBkYXRlIHRoZSBwcm90b3R5cGVzIGFuZCBiaW5kIHRoZSB0ZW1wbGF0ZSBhcmdzCisgICAgICAvLyB3aXRoIHRoZSBuZXcgY3JlYXRlZCBkZWZpbml0aW9uLgorICAgICAgaWYgKEN1ck11bHRpQ2xhc3MpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEN1ck11bHRpQ2xhc3MtPkRlZlByb3RvdHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgaWYgKEN1ck11bHRpQ2xhc3MtPkRlZlByb3RvdHlwZXNbaV0tPmdldE5hbWUoKSA9PSBDdXJSZWMtPmdldE5hbWUoKSkgeworICAgICAgICAgICAgRXJyb3IoRGVmbVByZWZpeExvYywgImRlZm0gJyIgKyBDdXJSZWMtPmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAiJyBhbHJlYWR5IGRlZmluZWQgaW4gdGhpcyBtdWx0aWNsYXNzISIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEN1ck11bHRpQ2xhc3MtPkRlZlByb3RvdHlwZXMucHVzaF9iYWNrKEN1clJlYyk7CisKKyAgICAgICAgLy8gQ29weSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGZvciB0aGUgbXVsdGljbGFzcyBpbnRvIHRoZSBuZXcgZGVmLgorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJlRBID0KKyAgICAgICAgICBDdXJNdWx0aUNsYXNzLT5SZWMuZ2V0VGVtcGxhdGVBcmdzKCk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRBLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBSZWNvcmRWYWwgKlJWID0gQ3VyTXVsdGlDbGFzcy0+UmVjLmdldFZhbHVlKFRBW2ldKTsKKyAgICAgICAgICBhc3NlcnQoUlYgJiYgIlRlbXBsYXRlIGFyZyBkb2Vzbid0IGV4aXN0PyIpOworICAgICAgICAgIEN1clJlYy0+YWRkVmFsdWUoKlJWKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgUmVjb3Jkcy5hZGREZWYoQ3VyUmVjKTsKKyAgICAgIH0KKworICAgICAgTmV3UmVjRGVmcy5wdXNoX2JhY2soQ3VyUmVjKTsKKyAgICB9CisKKyAgICBpZiAoTGV4LmdldENvZGUoKSAhPSB0Z3Rvazo6Y29tbWEpIGJyZWFrOworICAgIExleC5MZXgoKTsgLy8gZWF0ICcsJy4KKworICAgIFN1YkNsYXNzTG9jID0gTGV4LmdldExvYygpOworCisgICAgLy8gQSBkZWZtIGNhbiBpbmhlcml0IGZyb20gcmVndWxhciBjbGFzc2VzIChub24tbXVsdGljbGFzcykgYXMKKyAgICAvLyBsb25nIGFzIHRoZXkgY29tZSBpbiB0aGUgZW5kIG9mIHRoZSBpbmhlcml0YW5jZSBsaXN0LgorICAgIEluaGVyaXRGcm9tQ2xhc3MgPSAoUmVjb3Jkcy5nZXRDbGFzcyhMZXguZ2V0Q3VyU3RyVmFsKCkpICE9IDApOworCisgICAgaWYgKEluaGVyaXRGcm9tQ2xhc3MpCisgICAgICBicmVhazsKKworICAgIFJlZiA9IFBhcnNlU3ViQ2xhc3NSZWZlcmVuY2UoMCwgdHJ1ZSk7CisgIH0KKworICBpZiAoSW5oZXJpdEZyb21DbGFzcykgeworICAgIC8vIFByb2Nlc3MgYWxsIHRoZSBjbGFzc2VzIHRvIGluaGVyaXQgYXMgaWYgdGhleSB3ZXJlIHBhcnQgb2YgYQorICAgIC8vIHJlZ3VsYXIgJ2RlZicgYW5kIGluaGVyaXQgYWxsIHJlY29yZCB2YWx1ZXMuCisgICAgU3ViQ2xhc3NSZWZlcmVuY2UgU3ViQ2xhc3MgPSBQYXJzZVN1YkNsYXNzUmVmZXJlbmNlKDAsIGZhbHNlKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgLy8gQ2hlY2sgZm9yIGVycm9yLgorICAgICAgaWYgKFN1YkNsYXNzLlJlYyA9PSAwKSByZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gR2V0IHRoZSBleHBhbmRlZCBkZWZpbml0aW9uIHByb3RvdHlwZXMgYW5kIHRlYWNoIHRoZW0gYWJvdXQKKyAgICAgIC8vIHRoZSByZWNvcmQgdmFsdWVzIHRoZSBjdXJyZW50IGNsYXNzIHRvIGluaGVyaXQgaGFzCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTmV3UmVjRGVmcy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFJlY29yZCAqQ3VyUmVjID0gTmV3UmVjRGVmc1tpXTsKKworICAgICAgICAvLyBBZGQgaXQuCisgICAgICAgIGlmIChBZGRTdWJDbGFzcyhDdXJSZWMsIFN1YkNsYXNzKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBQcm9jZXNzIGFueSB2YXJpYWJsZXMgb24gdGhlIGxldCBzdGFjay4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExldFN0YWNrLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgZSA9IExldFN0YWNrW2ldLnNpemUoKTsgaiAhPSBlOyArK2opCisgICAgICAgICAgICBpZiAoU2V0VmFsdWUoQ3VyUmVjLCBMZXRTdGFja1tpXVtqXS5Mb2MsIExldFN0YWNrW2ldW2pdLk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTGV0U3RhY2tbaV1bal0uQml0cywgTGV0U3RhY2tbaV1bal0uVmFsdWUpKQorICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKExleC5nZXRDb2RlKCkgIT0gdGd0b2s6OmNvbW1hKSBicmVhazsKKyAgICAgIExleC5MZXgoKTsgLy8gZWF0ICcsJy4KKyAgICAgIFN1YkNsYXNzID0gUGFyc2VTdWJDbGFzc1JlZmVyZW5jZSgwLCBmYWxzZSk7CisgICAgfQorICB9CisKKyAgaWYgKCFDdXJNdWx0aUNsYXNzKQorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOZXdSZWNEZWZzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBOZXdSZWNEZWZzW2ldLT5yZXNvbHZlUmVmZXJlbmNlcygpOworCisgIGlmIChMZXguZ2V0Q29kZSgpICE9IHRndG9rOjpzZW1pKQorICAgIHJldHVybiBUb2tFcnJvcigiZXhwZWN0ZWQgJzsnIGF0IGVuZCBvZiBkZWZtIik7CisgIExleC5MZXgoKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBQYXJzZU9iamVjdAorLy8vICAgT2JqZWN0IDo6PSBDbGFzc0luc3QKKy8vLyAgIE9iamVjdCA6Oj0gRGVmSW5zdAorLy8vICAgT2JqZWN0IDo6PSBNdWx0aUNsYXNzSW5zdAorLy8vICAgT2JqZWN0IDo6PSBEZWZNSW5zdAorLy8vICAgT2JqZWN0IDo6PSBMRVRDb21tYW5kICd7JyBPYmplY3RMaXN0ICd9JworLy8vICAgT2JqZWN0IDo6PSBMRVRDb21tYW5kIE9iamVjdAorYm9vbCBUR1BhcnNlcjo6UGFyc2VPYmplY3QoTXVsdGlDbGFzcyAqTUMpIHsKKyAgc3dpdGNoIChMZXguZ2V0Q29kZSgpKSB7CisgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJUaGlzIGlzIG5vdCBhbiBvYmplY3QiKTsKKyAgY2FzZSB0Z3Rvazo6TGV0OiAgIHJldHVybiBQYXJzZVRvcExldmVsTGV0KE1DKTsKKyAgY2FzZSB0Z3Rvazo6RGVmOiAgIHJldHVybiBQYXJzZURlZihNQyk7CisgIGNhc2UgdGd0b2s6OkRlZm06ICByZXR1cm4gUGFyc2VEZWZtKE1DKTsKKyAgY2FzZSB0Z3Rvazo6Q2xhc3M6IHJldHVybiBQYXJzZUNsYXNzKCk7CisgIGNhc2UgdGd0b2s6Ok11bHRpQ2xhc3M6IHJldHVybiBQYXJzZU11bHRpQ2xhc3MoKTsKKyAgfQorfQorCisvLy8gUGFyc2VPYmplY3RMaXN0CisvLy8gICBPYmplY3RMaXN0IDo9PSBPYmplY3QqCitib29sIFRHUGFyc2VyOjpQYXJzZU9iamVjdExpc3QoTXVsdGlDbGFzcyAqTUMpIHsKKyAgd2hpbGUgKGlzT2JqZWN0U3RhcnQoTGV4LmdldENvZGUoKSkpIHsKKyAgICBpZiAoUGFyc2VPYmplY3QoTUMpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRHUGFyc2VyOjpQYXJzZUZpbGUoKSB7CisgIExleC5MZXgoKTsgLy8gUHJpbWUgdGhlIGxleGVyLgorICBpZiAoUGFyc2VPYmplY3RMaXN0KCkpIHJldHVybiB0cnVlOworCisgIC8vIElmIHdlIGhhdmUgdW5yZWFkIGlucHV0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHJlcG9ydCBpdC4KKyAgaWYgKExleC5nZXRDb2RlKCkgPT0gdGd0b2s6OkVvZikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIFRva0Vycm9yKCJVbmV4cGVjdGVkIGlucHV0IGF0IHRvcCBsZXZlbCIpOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9UR1BhcnNlci5oIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vVEdQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWVlOTMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vVEdQYXJzZXIuaApAQCAtMCwwICsxLDExMiBAQAorLy89PT0tIFRHUGFyc2VyLmggLSBQYXJzZXIgZm9yIFRhYmxlR2VuIEZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIFBhcnNlciBmb3IgdGFibGVnZW4gZmlsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBUR1BBUlNFUl9ICisjZGVmaW5lIFRHUEFSU0VSX0gKKworI2luY2x1ZGUgIlRHTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFJlY29yZDsKKyAgY2xhc3MgUmVjb3JkVmFsOworICBzdHJ1Y3QgUmVjVHk7CisgIHN0cnVjdCBJbml0OworICBzdHJ1Y3QgTXVsdGlDbGFzczsKKyAgc3RydWN0IFN1YkNsYXNzUmVmZXJlbmNlOworICBzdHJ1Y3QgU3ViTXVsdGlDbGFzc1JlZmVyZW5jZTsKKyAgCisgIHN0cnVjdCBMZXRSZWNvcmQgeworICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IEJpdHM7CisgICAgSW5pdCAqVmFsdWU7CisgICAgU01Mb2MgTG9jOworICAgIExldFJlY29yZChjb25zdCBzdGQ6OnN0cmluZyAmTiwgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZCLCBJbml0ICpWLAorICAgICAgICAgICAgICBTTUxvYyBMKQorICAgICAgOiBOYW1lKE4pLCBCaXRzKEIpLCBWYWx1ZShWKSwgTG9jKEwpIHsKKyAgICB9CisgIH07CisgIAorY2xhc3MgVEdQYXJzZXIgeworICBUR0xleGVyIExleDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8TGV0UmVjb3JkPiA+IExldFN0YWNrOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTXVsdGlDbGFzcyo+IE11bHRpQ2xhc3NlczsKKyAgCisgIC8vLyBDdXJNdWx0aUNsYXNzIC0gSWYgd2UgYXJlIHBhcnNpbmcgYSAnbXVsdGljbGFzcycgZGVmaW5pdGlvbiwgdGhpcyBpcyB0aGUgCisgIC8vLyBjdXJyZW50IHZhbHVlLgorICBNdWx0aUNsYXNzICpDdXJNdWx0aUNsYXNzOworcHVibGljOgorICBUR1BhcnNlcihTb3VyY2VNZ3IgJlNyY01ncikgOiBMZXgoU3JjTWdyKSwgQ3VyTXVsdGlDbGFzcygwKSB7fQorICAKKyAgLy8vIFBhcnNlRmlsZSAtIE1haW4gZW50cnlwb2ludCBmb3IgcGFyc2luZyBhIHRibGdlbiBmaWxlLiAgVGhlc2UgcGFyc2VyCisgIC8vLyByb3V0aW5lcyByZXR1cm4gdHJ1ZSBvbiBlcnJvciwgb3IgZmFsc2Ugb24gc3VjY2Vzcy4KKyAgYm9vbCBQYXJzZUZpbGUoKTsKKyAgCisgIGJvb2wgRXJyb3IoU01Mb2MgTCwgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZykgY29uc3QgeworICAgIExleC5QcmludEVycm9yKEwsIE1zZyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCBUb2tFcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmTXNnKSBjb25zdCB7CisgICAgcmV0dXJuIEVycm9yKExleC5nZXRMb2MoKSwgTXNnKTsKKyAgfQorcHJpdmF0ZTogIC8vIFNlbWFudGljIGFuYWx5c2lzIG1ldGhvZHMuCisgIGJvb2wgQWRkVmFsdWUoUmVjb3JkICpUaGVSZWMsIFNNTG9jIExvYywgY29uc3QgUmVjb3JkVmFsICZSVik7CisgIGJvb2wgU2V0VmFsdWUoUmVjb3JkICpUaGVSZWMsIFNNTG9jIExvYywgY29uc3Qgc3RkOjpzdHJpbmcgJlZhbE5hbWUsIAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmQml0TGlzdCwgSW5pdCAqVik7CisgIGJvb2wgQWRkU3ViQ2xhc3MoUmVjb3JkICpSZWMsIFN1YkNsYXNzUmVmZXJlbmNlICZTdWJDbGFzcyk7CisgIGJvb2wgQWRkU3ViTXVsdGlDbGFzcyhNdWx0aUNsYXNzICpDdXJNQywKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1Yk11bHRpQ2xhc3NSZWZlcmVuY2UgJlN1Yk11bHRpQ2xhc3MpOworCitwcml2YXRlOiAgLy8gUGFyc2VyIG1ldGhvZHMuCisgIGJvb2wgUGFyc2VPYmplY3RMaXN0KE11bHRpQ2xhc3MgKk1DID0gMCk7CisgIGJvb2wgUGFyc2VPYmplY3QoTXVsdGlDbGFzcyAqTUMpOworICBib29sIFBhcnNlQ2xhc3MoKTsKKyAgYm9vbCBQYXJzZU11bHRpQ2xhc3MoKTsKKyAgYm9vbCBQYXJzZURlZm0oTXVsdGlDbGFzcyAqQ3VyTXVsdGlDbGFzcyk7CisgIGJvb2wgUGFyc2VEZWYoTXVsdGlDbGFzcyAqQ3VyTXVsdGlDbGFzcyk7CisgIGJvb2wgUGFyc2VUb3BMZXZlbExldChNdWx0aUNsYXNzICpDdXJNdWx0aUNsYXNzKTsKKyAgc3RkOjp2ZWN0b3I8TGV0UmVjb3JkPiBQYXJzZUxldExpc3QoKTsKKworICBib29sIFBhcnNlT2JqZWN0Qm9keShSZWNvcmQgKkN1clJlYyk7CisgIGJvb2wgUGFyc2VCb2R5KFJlY29yZCAqQ3VyUmVjKTsKKyAgYm9vbCBQYXJzZUJvZHlJdGVtKFJlY29yZCAqQ3VyUmVjKTsKKworICBib29sIFBhcnNlVGVtcGxhdGVBcmdMaXN0KFJlY29yZCAqQ3VyUmVjKTsKKyAgc3RkOjpzdHJpbmcgUGFyc2VEZWNsYXJhdGlvbihSZWNvcmQgKkN1clJlYywgYm9vbCBQYXJzaW5nVGVtcGxhdGVBcmdzKTsKKworICBTdWJDbGFzc1JlZmVyZW5jZSBQYXJzZVN1YkNsYXNzUmVmZXJlbmNlKFJlY29yZCAqQ3VyUmVjLCBib29sIGlzRGVmbSk7CisgIFN1Yk11bHRpQ2xhc3NSZWZlcmVuY2UgUGFyc2VTdWJNdWx0aUNsYXNzUmVmZXJlbmNlKE11bHRpQ2xhc3MgKkN1ck1DKTsKKworICBJbml0ICpQYXJzZUlEVmFsdWUoUmVjb3JkICpDdXJSZWMpOworICBJbml0ICpQYXJzZUlEVmFsdWUoUmVjb3JkICpDdXJSZWMsIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBTTUxvYyBOYW1lTG9jKTsKKyAgSW5pdCAqUGFyc2VTaW1wbGVWYWx1ZShSZWNvcmQgKkN1clJlYywgUmVjVHkgKkl0ZW1UeXBlID0gMCk7CisgIEluaXQgKlBhcnNlVmFsdWUoUmVjb3JkICpDdXJSZWMsIFJlY1R5ICpJdGVtVHlwZSA9IDApOworICBzdGQ6OnZlY3RvcjxJbml0Kj4gUGFyc2VWYWx1ZUxpc3QoUmVjb3JkICpDdXJSZWMsIFJlY29yZCAqQXJnc1JlYyA9IDAsIFJlY1R5ICpFbHRUeSA9IDApOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8bGx2bTo6SW5pdCosIHN0ZDo6c3RyaW5nPiA+IFBhcnNlRGFnQXJnTGlzdChSZWNvcmQgKik7CisgIGJvb2wgUGFyc2VPcHRpb25hbFJhbmdlTGlzdChzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJlJhbmdlcyk7CisgIGJvb2wgUGFyc2VPcHRpb25hbEJpdExpc3Qoc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZSYW5nZXMpOworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUGFyc2VSYW5nZUxpc3QoKTsKKyAgYm9vbCBQYXJzZVJhbmdlUGllY2Uoc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZSYW5nZXMpOworICBSZWNUeSAqUGFyc2VUeXBlKCk7CisgIEluaXQgKlBhcnNlT3BlcmF0aW9uKFJlY29yZCAqQ3VyUmVjKTsKKyAgUmVjVHkgKlBhcnNlT3BlcmF0b3JUeXBlKCk7CisgIHN0ZDo6c3RyaW5nIFBhcnNlT2JqZWN0TmFtZSgpOworICBSZWNvcmQgKlBhcnNlQ2xhc3NJRCgpOworICBNdWx0aUNsYXNzICpQYXJzZU11bHRpQ2xhc3NJRCgpOworICBSZWNvcmQgKlBhcnNlRGVmbUlEKCk7Cit9OworICAKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vVEdWYWx1ZVR5cGVzLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RHVmFsdWVUeXBlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyZDA4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RHVmFsdWVUeXBlcy5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8vPT09LSBWYWx1ZVR5cGVzLmNwcCAtIFRhYmxlZ2VuIGV4dGVuZGVkIFZhbHVlVHlwZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIEVWVCB0eXBlIGlzIHVzZWQgYnkgdGFibGVnZW4gYXMgd2VsbCBhcyBpbiBMTFZNLiBJbiBvcmRlciB0byBoYW5kbGUKKy8vIGV4dGVuZGVkIHR5cGVzLCB0aGUgRVZUIHR5cGUgdXNlcyBzdXBwb3J0IGZ1bmN0aW9ucyB0aGF0IGNhbGwgaW50bworLy8gTExWTSdzIHR5cGUgc3lzdGVtIGNvZGUuIFRoZXNlIGFyZW4ndCBhY2Nlc3NpYmxlIGluIHRhYmxlZ2VuLCBzbyB0aGlzCisvLyBmaWxlIHByb3ZpZGVzIHNpbXBsZSByZXBsYWNlbWVudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFR5cGUgeworcHVibGljOgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFNpemVJbkJpdHMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgflR5cGUoKSB7fQorfTsKKworfQorCitjbGFzcyBFeHRlbmRlZEludGVnZXJUeXBlIDogcHVibGljIFR5cGUgeworICB1bnNpZ25lZCBCaXRXaWR0aDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRXh0ZW5kZWRJbnRlZ2VyVHlwZSh1bnNpZ25lZCBiaXRzKQorICAgIDogQml0V2lkdGgoYml0cykge30KKyAgdW5zaWduZWQgZ2V0U2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Qml0V2lkdGgoKTsKKyAgfQorICB1bnNpZ25lZCBnZXRCaXRXaWR0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0V2lkdGg7CisgIH0KK307CisKK2NsYXNzIEV4dGVuZGVkVmVjdG9yVHlwZSA6IHB1YmxpYyBUeXBlIHsKKyAgRVZUIEVsZW1lbnRUeXBlOworICB1bnNpZ25lZCBOdW1FbGVtZW50czsKK3B1YmxpYzoKKyAgRXh0ZW5kZWRWZWN0b3JUeXBlKEVWVCBlbHR5LCB1bnNpZ25lZCBudW0pCisgICAgOiBFbGVtZW50VHlwZShlbHR5KSwgTnVtRWxlbWVudHMobnVtKSB7fQorICB1bnNpZ25lZCBnZXRTaXplSW5CaXRzKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1FbGVtZW50cygpICogZ2V0RWxlbWVudFR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgIH0KKyAgRVZUIGdldEVsZW1lbnRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBFbGVtZW50VHlwZTsKKyAgfQorICB1bnNpZ25lZCBnZXROdW1FbGVtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtRWxlbWVudHM7CisgIH0KK307CisKK3N0YXRpYyBzdGQ6Om1hcDx1bnNpZ25lZCwgY29uc3QgVHlwZSAqPgorICBFeHRlbmRlZEludGVnZXJUeXBlTWFwOworc3RhdGljIHN0ZDo6bWFwPHN0ZDo6cGFpcjx1aW50cHRyX3QsIHVpbnRwdHJfdD4sIGNvbnN0IFR5cGUgKj4KKyAgRXh0ZW5kZWRWZWN0b3JUeXBlTWFwOworCitib29sIEVWVDo6aXNFeHRlbmRlZEZsb2F0aW5nUG9pbnQoKSBjb25zdCB7CisgIGFzc2VydChpc0V4dGVuZGVkKCkgJiYgIlR5cGUgaXMgbm90IGV4dGVuZGVkISIpOworICAvLyBFeHRlbmRlZCBmbG9hdGluZy1wb2ludCB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBFVlQ6OmlzRXh0ZW5kZWRJbnRlZ2VyKCkgY29uc3QgeworICBhc3NlcnQoaXNFeHRlbmRlZCgpICYmICJUeXBlIGlzIG5vdCBleHRlbmRlZCEiKTsKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxjb25zdCBFeHRlbmRlZEludGVnZXJUeXBlICo+KExMVk1UeSkgIT0gMDsKK30KKworYm9vbCBFVlQ6OmlzRXh0ZW5kZWRWZWN0b3IoKSBjb25zdCB7CisgIGFzc2VydChpc0V4dGVuZGVkKCkgJiYgIlR5cGUgaXMgbm90IGV4dGVuZGVkISIpOworICByZXR1cm4gZHluYW1pY19jYXN0PGNvbnN0IEV4dGVuZGVkVmVjdG9yVHlwZSAqPihMTFZNVHkpICE9IDA7Cit9CisKK2Jvb2wgRVZUOjppc0V4dGVuZGVkNjRCaXRWZWN0b3IoKSBjb25zdCB7CisgIGFzc2VydChpc0V4dGVuZGVkKCkgJiYgIlR5cGUgaXMgbm90IGV4dGVuZGVkISIpOworICByZXR1cm4gaXNFeHRlbmRlZFZlY3RvcigpICYmIGdldFNpemVJbkJpdHMoKSA9PSA2NDsKK30KKworYm9vbCBFVlQ6OmlzRXh0ZW5kZWQxMjhCaXRWZWN0b3IoKSBjb25zdCB7CisgIGFzc2VydChpc0V4dGVuZGVkKCkgJiYgIlR5cGUgaXMgbm90IGV4dGVuZGVkISIpOworICByZXR1cm4gaXNFeHRlbmRlZFZlY3RvcigpICYmIGdldFNpemVJbkJpdHMoKSA9PSAxMjg7Cit9CisKK0VWVCBFVlQ6OmdldEV4dGVuZGVkVmVjdG9yRWxlbWVudFR5cGUoKSBjb25zdCB7CisgIGFzc2VydChpc0V4dGVuZGVkVmVjdG9yKCkgJiYgIlR5cGUgaXMgbm90IGFuIGV4dGVuZGVkIHZlY3RvciEiKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IEV4dGVuZGVkVmVjdG9yVHlwZSAqPihMTFZNVHkpLT5nZXRFbGVtZW50VHlwZSgpOworfQorCit1bnNpZ25lZCBFVlQ6OmdldEV4dGVuZGVkVmVjdG9yTnVtRWxlbWVudHMoKSBjb25zdCB7CisgIGFzc2VydChpc0V4dGVuZGVkVmVjdG9yKCkgJiYgIlR5cGUgaXMgbm90IGFuIGV4dGVuZGVkIHZlY3RvciEiKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IEV4dGVuZGVkVmVjdG9yVHlwZSAqPihMTFZNVHkpLT5nZXROdW1FbGVtZW50cygpOworfQorCit1bnNpZ25lZCBFVlQ6OmdldEV4dGVuZGVkU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzRXh0ZW5kZWQoKSAmJiAiVHlwZSBpcyBub3QgZXh0ZW5kZWQhIik7CisgIHJldHVybiBMTFZNVHktPmdldFNpemVJbkJpdHMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RhYmxlR2VuLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RhYmxlR2VuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQxNjNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vVGFibGVHZW4uY3BwCkBAIC0wLDAgKzEsMzQxIEBACisvLz09PS0gVGFibGVHZW4uY3BwIC0gVG9wLUxldmVsIFRhYmxlR2VuIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRhYmxlR2VuIGlzIGEgdG9vbCB3aGljaCBjYW4gYmUgdXNlZCB0byBidWlsZCB1cCBhIGRlc2NyaXB0aW9uIG9mIHNvbWV0aGluZywKKy8vIHRoZW4gaW52b2tlIG9uZSBvciBtb3JlICJ0YWJsZWdlbiBiYWNrZW5kcyIgdG8gZW1pdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKy8vIGRlc2NyaXB0aW9uIGluIHNvbWUgcHJlZGVmaW5lZCBmb3JtYXQuICBJbiBwcmFjdGljZSwgdGhpcyBpcyB1c2VkIGJ5IHRoZSBMTFZNCisvLyBjb2RlIGdlbmVyYXRvcnMgdG8gYXV0b21hdGUgZ2VuZXJhdGlvbiBvZiBhIGNvZGUgZ2VuZXJhdG9yIHRocm91Z2ggYQorLy8gaGlnaC1sZXZlbCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJBc21NYXRjaGVyRW1pdHRlci5oIgorI2luY2x1ZGUgIkFzbVdyaXRlckVtaXR0ZXIuaCIKKyNpbmNsdWRlICJDYWxsaW5nQ29udkVtaXR0ZXIuaCIKKyNpbmNsdWRlICJDbGFuZ0FTVE5vZGVzRW1pdHRlci5oIgorI2luY2x1ZGUgIkNsYW5nQXR0ckVtaXR0ZXIuaCIKKyNpbmNsdWRlICJDbGFuZ0RpYWdub3N0aWNzRW1pdHRlci5oIgorI2luY2x1ZGUgIkNvZGVFbWl0dGVyR2VuLmgiCisjaW5jbHVkZSAiREFHSVNlbEVtaXR0ZXIuaCIKKyNpbmNsdWRlICJEaXNhc3NlbWJsZXJFbWl0dGVyLmgiCisjaW5jbHVkZSAiRURFbWl0dGVyLmgiCisjaW5jbHVkZSAiRmFzdElTZWxFbWl0dGVyLmgiCisjaW5jbHVkZSAiSW5zdHJFbnVtRW1pdHRlci5oIgorI2luY2x1ZGUgIkluc3RySW5mb0VtaXR0ZXIuaCIKKyNpbmNsdWRlICJJbnRyaW5zaWNFbWl0dGVyLmgiCisjaW5jbHVkZSAiTExWTUNDb25maWd1cmF0aW9uRW1pdHRlci5oIgorI2luY2x1ZGUgIk5lb25FbWl0dGVyLmgiCisjaW5jbHVkZSAiT3B0UGFyc2VyRW1pdHRlci5oIgorI2luY2x1ZGUgIlJlY29yZC5oIgorI2luY2x1ZGUgIlJlZ2lzdGVySW5mb0VtaXR0ZXIuaCIKKyNpbmNsdWRlICJBUk1EZWNvZGVyRW1pdHRlci5oIgorI2luY2x1ZGUgIlN1YnRhcmdldEVtaXR0ZXIuaCIKKyNpbmNsdWRlICJUR1BhcnNlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3lzdGVtL1NpZ25hbHMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGlvPgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK2VudW0gQWN0aW9uVHlwZSB7CisgIFByaW50UmVjb3JkcywKKyAgR2VuRW1pdHRlciwKKyAgR2VuUmVnaXN0ZXJFbnVtcywgR2VuUmVnaXN0ZXIsIEdlblJlZ2lzdGVySGVhZGVyLAorICBHZW5JbnN0ckVudW1zLCBHZW5JbnN0cnMsIEdlbkFzbVdyaXRlciwgR2VuQXNtTWF0Y2hlciwKKyAgR2VuQVJNRGVjb2RlciwKKyAgR2VuRGlzYXNzZW1ibGVyLAorICBHZW5DYWxsaW5nQ29udiwKKyAgR2VuQ2xhbmdBdHRyQ2xhc3NlcywKKyAgR2VuQ2xhbmdBdHRyTGlzdCwKKyAgR2VuQ2xhbmdEaWFnc0RlZnMsCisgIEdlbkNsYW5nRGlhZ0dyb3VwcywKKyAgR2VuQ2xhbmdEZWNsTm9kZXMsCisgIEdlbkNsYW5nU3RtdE5vZGVzLAorICBHZW5EQUdJU2VsLAorICBHZW5GYXN0SVNlbCwKKyAgR2VuT3B0UGFyc2VyRGVmcywgR2VuT3B0UGFyc2VySW1wbCwKKyAgR2VuU3VidGFyZ2V0LAorICBHZW5JbnRyaW5zaWMsCisgIEdlblRndEludHJpbnNpYywKKyAgR2VuTExWTUNDb25mLAorICBHZW5FREluZm8sCisgIEdlbkFybU5lb24sCisgIEdlbkFybU5lb25TZW1hLAorICBQcmludEVudW1zCit9OworCituYW1lc3BhY2UgeworICBjbDo6b3B0PEFjdGlvblR5cGU+CisgIEFjdGlvbihjbDo6ZGVzYygiQWN0aW9uIHRvIHBlcmZvcm06IiksCisgICAgICAgICBjbDo6dmFsdWVzKGNsRW51bVZhbE4oUHJpbnRSZWNvcmRzLCAicHJpbnQtcmVjb3JkcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50IGFsbCByZWNvcmRzIHRvIHN0ZG91dCAoZGVmYXVsdCkiKSwKKyAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihHZW5FbWl0dGVyLCAiZ2VuLWVtaXR0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBtYWNoaW5lIGNvZGUgZW1pdHRlciIpLAorICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKEdlblJlZ2lzdGVyRW51bXMsICJnZW4tcmVnaXN0ZXItZW51bXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBlbnVtIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuUmVnaXN0ZXIsICJnZW4tcmVnaXN0ZXItZGVzYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIGEgcmVnaXN0ZXIgaW5mbyBkZXNjcmlwdGlvbiIpLAorICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKEdlblJlZ2lzdGVySGVhZGVyLCAiZ2VuLXJlZ2lzdGVyLWRlc2MtaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgYSByZWdpc3RlciBpbmZvIGRlc2NyaXB0aW9uIGhlYWRlciIpLAorICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKEdlbkluc3RyRW51bXMsICJnZW4taW5zdHItZW51bXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBlbnVtIHZhbHVlcyBmb3IgaW5zdHJ1Y3Rpb25zIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuSW5zdHJzLCAiZ2VuLWluc3RyLWRlc2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBpbnN0cnVjdGlvbiBkZXNjcmlwdGlvbnMiKSwKKyAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihHZW5DYWxsaW5nQ29udiwgImdlbi1jYWxsaW5nY29udiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIGNhbGxpbmcgY29udmVudGlvbiBkZXNjcmlwdGlvbnMiKSwKKyAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihHZW5Bc21Xcml0ZXIsICJnZW4tYXNtLXdyaXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIGFzc2VtYmx5IHdyaXRlciIpLAorICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKEdlbkFSTURlY29kZXIsICJnZW4tYXJtLWRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBkZWNvZGVycyBmb3IgQVJNL1RodW1iIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuRGlzYXNzZW1ibGVyLCAiZ2VuLWRpc2Fzc2VtYmxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIGRpc2Fzc2VtYmxlciIpLAorICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKEdlbkFzbU1hdGNoZXIsICJnZW4tYXNtLW1hdGNoZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBhc3NlbWJseSBpbnN0cnVjdGlvbiBtYXRjaGVyIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuREFHSVNlbCwgImdlbi1kYWctaXNlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIGEgREFHIGluc3RydWN0aW9uIHNlbGVjdG9yIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuRmFzdElTZWwsICJnZW4tZmFzdC1pc2VsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgYSBcImZhc3RcIiBpbnN0cnVjdGlvbiBzZWxlY3RvciIpLAorICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKEdlbk9wdFBhcnNlckRlZnMsICJnZW4tb3B0LXBhcnNlci1kZWZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgb3B0aW9uIGRlZmluaXRpb25zIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuT3B0UGFyc2VySW1wbCwgImdlbi1vcHQtcGFyc2VyLWltcGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBvcHRpb24gcGFyc2VyIGltcGxlbWVudGF0aW9uIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuU3VidGFyZ2V0LCAiZ2VuLXN1YnRhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIHN1YnRhcmdldCBlbnVtZXJhdGlvbnMiKSwKKyAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihHZW5JbnRyaW5zaWMsICJnZW4taW50cmluc2ljIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgaW50cmluc2ljIGluZm9ybWF0aW9uIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuVGd0SW50cmluc2ljLCAiZ2VuLXRndC1pbnRyaW5zaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSB0YXJnZXQgaW50cmluc2ljIGluZm9ybWF0aW9uIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuQ2xhbmdBdHRyQ2xhc3NlcywgImdlbi1jbGFuZy1hdHRyLWNsYXNzZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBjbGFuZyBhdHRyaWJ1dGUgY2xhc2VzIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuQ2xhbmdBdHRyTGlzdCwgImdlbi1jbGFuZy1hdHRyLWxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBhIGNsYW5nIGF0dHJpYnV0ZSBsaXN0IiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuQ2xhbmdEaWFnc0RlZnMsICJnZW4tY2xhbmctZGlhZ3MtZGVmcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIENsYW5nIGRpYWdub3N0aWNzIGRlZmluaXRpb25zIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuQ2xhbmdEaWFnR3JvdXBzLCAiZ2VuLWNsYW5nLWRpYWctZ3JvdXBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgQ2xhbmcgZGlhZ25vc3RpYyBncm91cHMiKSwKKyAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihHZW5DbGFuZ0RlY2xOb2RlcywgImdlbi1jbGFuZy1kZWNsLW5vZGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgQ2xhbmcgQVNUIHN0YXRlbWVudCBub2RlcyIpLAorICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKEdlbkNsYW5nU3RtdE5vZGVzLCAiZ2VuLWNsYW5nLXN0bXQtbm9kZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBDbGFuZyBBU1Qgc3RhdGVtZW50IG5vZGVzIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuTExWTUNDb25mLCAiZ2VuLWxsdm1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgTExWTUMgY29uZmlndXJhdGlvbiBsaWJyYXJ5IiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuRURJbmZvLCAiZ2VuLWVuaGFuY2VkLWRpc2Fzc2VtYmx5LWluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBlbmhhbmNlZCBkaXNhc3NlbWJseSBpbmZvIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuQXJtTmVvbiwgImdlbi1hcm0tbmVvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIGFybV9uZW9uLmggZm9yIGNsYW5nIiksCisgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oR2VuQXJtTmVvblNlbWEsICJnZW4tYXJtLW5lb24tc2VtYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIEFSTSBORU9OIHNlbWEgc3VwcG9ydCBmb3IgY2xhbmciKSwKKyAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihQcmludEVudW1zLCAicHJpbnQtZW51bXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmludCBlbnVtIHZhbHVlcyBmb3IgYSBjbGFzcyIpLAorICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxFbmQpKTsKKworICBjbDo6b3B0PHN0ZDo6c3RyaW5nPgorICBDbGFzcygiY2xhc3MiLCBjbDo6ZGVzYygiUHJpbnQgRW51bSBsaXN0IGZvciB0aGlzIGNsYXNzIiksCisgICAgICAgIGNsOjp2YWx1ZV9kZXNjKCJjbGFzcyBuYW1lIikpOworCisgIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CisgIE91dHB1dEZpbGVuYW1lKCJvIiwgY2w6OmRlc2MoIk91dHB1dCBmaWxlbmFtZSIpLCBjbDo6dmFsdWVfZGVzYygiZmlsZW5hbWUiKSwKKyAgICAgICAgICAgICAgICAgY2w6OmluaXQoIi0iKSk7CisKKyAgY2w6Om9wdDxzdGQ6OnN0cmluZz4KKyAgSW5wdXRGaWxlbmFtZShjbDo6UG9zaXRpb25hbCwgY2w6OmRlc2MoIjxpbnB1dCBmaWxlPiIpLCBjbDo6aW5pdCgiLSIpKTsKKworICBjbDo6bGlzdDxzdGQ6OnN0cmluZz4KKyAgSW5jbHVkZURpcnMoIkkiLCBjbDo6ZGVzYygiRGlyZWN0b3J5IG9mIGluY2x1ZGUgZmlsZXMiKSwKKyAgICAgICAgICAgICAgY2w6OnZhbHVlX2Rlc2MoImRpcmVjdG9yeSIpLCBjbDo6UHJlZml4KTsKKworICBjbDo6b3B0PHN0ZDo6c3RyaW5nPgorICBDbGFuZ0NvbXBvbmVudCgiY2xhbmctY29tcG9uZW50IiwKKyAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIk9ubHkgdXNlIHdhcm5pbmdzIGZyb20gc3BlY2lmaWVkIGNvbXBvbmVudCIpLAorICAgICAgICAgICAgICAgICBjbDo6dmFsdWVfZGVzYygiY29tcG9uZW50IiksIGNsOjpIaWRkZW4pOworfQorCisKKy8vIEZJWE1FOiBFbGltaW5hdGUgZ2xvYmFscyBmcm9tIHRibGdlbi4KK1JlY29yZEtlZXBlciBsbHZtOjpSZWNvcmRzOworCitzdGF0aWMgU291cmNlTWdyIFNyY01ncjsKKwordm9pZCBsbHZtOjpQcmludEVycm9yKFNNTG9jIEVycm9yTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTXNnKSB7CisgIFNyY01nci5QcmludE1lc3NhZ2UoRXJyb3JMb2MsIE1zZywgImVycm9yIik7Cit9CisKKworCisvLy8gUGFyc2VGaWxlIC0gdGhpcyBmdW5jdGlvbiBiZWdpbnMgdGhlIHBhcnNpbmcgb2YgdGhlIHNwZWNpZmllZCB0YWJsZWdlbgorLy8vIGZpbGUuCitzdGF0aWMgYm9vbCBQYXJzZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmSW5jbHVkZURpcnMsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTWdyICZTcmNNZ3IpIHsKKyAgc3RkOjpzdHJpbmcgRXJyb3JTdHI7CisgIE1lbW9yeUJ1ZmZlciAqRiA9IE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZU9yU1RESU4oRmlsZW5hbWUuY19zdHIoKSwgJkVycm9yU3RyKTsKKyAgaWYgKEYgPT0gMCkgeworICAgIGVycnMoKSA8PCAiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSAnIiA8PCBGaWxlbmFtZSA8PCAiJzogIgorICAgICAgICAgICA8PCBFcnJvclN0ciA8PCJcbiI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBUZWxsIFNyY01nciBhYm91dCB0aGlzIGJ1ZmZlciwgd2hpY2ggaXMgd2hhdCBUR1BhcnNlciB3aWxsIHBpY2sgdXAuCisgIFNyY01nci5BZGROZXdTb3VyY2VCdWZmZXIoRiwgU01Mb2MoKSk7CisKKyAgLy8gUmVjb3JkIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZSBkaXJlY3Rvcnkgc28gdGhhdCB0aGUgbGV4ZXIgY2FuIGZpbmQKKyAgLy8gaXQgbGF0ZXIuCisgIFNyY01nci5zZXRJbmNsdWRlRGlycyhJbmNsdWRlRGlycyk7CisKKyAgVEdQYXJzZXIgUGFyc2VyKFNyY01ncik7CisKKyAgcmV0dXJuIFBhcnNlci5QYXJzZUZpbGUoKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHN5czo6UHJpbnRTdGFja1RyYWNlT25FcnJvclNpZ25hbCgpOworICBQcmV0dHlTdGFja1RyYWNlUHJvZ3JhbSBYKGFyZ2MsIGFyZ3YpOworICBjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywgYXJndik7CisKKworICAvLyBQYXJzZSB0aGUgaW5wdXQgZmlsZS4KKyAgaWYgKFBhcnNlRmlsZShJbnB1dEZpbGVuYW1lLCBJbmNsdWRlRGlycywgU3JjTWdyKSkKKyAgICByZXR1cm4gMTsKKworICBzdGQ6OnN0cmluZyBFcnJvcjsKKyAgcmF3X2ZkX29zdHJlYW0gT3V0KE91dHB1dEZpbGVuYW1lLmNfc3RyKCksIEVycm9yKTsKKyAgaWYgKCFFcnJvci5lbXB0eSgpKSB7CisgICAgZXJycygpIDw8IGFyZ3ZbMF0gPDwgIjogZXJyb3Igb3BlbmluZyAiIDw8IE91dHB1dEZpbGVuYW1lCisgICAgICAgICAgIDw8ICI6IiA8PCBFcnJvciA8PCAiXG4iOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBmaWxlIGdldHMgcmVtb3ZlZCBpZiAqZ2FzcCogdGFibGVnZW4gY3Jhc2hlcy4uLgorICBzeXM6OlJlbW92ZUZpbGVPblNpZ25hbChzeXM6OlBhdGgoT3V0cHV0RmlsZW5hbWUpKTsKKworICB0cnkgeworICAgIHN3aXRjaCAoQWN0aW9uKSB7CisgICAgY2FzZSBQcmludFJlY29yZHM6CisgICAgICBPdXQgPDwgUmVjb3JkczsgICAgICAgICAgIC8vIE5vIGFyZ3VtZW50LCBkdW1wIGFsbCBjb250ZW50cworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5FbWl0dGVyOgorICAgICAgQ29kZUVtaXR0ZXJHZW4oUmVjb3JkcykucnVuKE91dCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR2VuUmVnaXN0ZXJFbnVtczoKKyAgICAgIFJlZ2lzdGVySW5mb0VtaXR0ZXIoUmVjb3JkcykucnVuRW51bXMoT3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR2VuUmVnaXN0ZXI6CisgICAgICBSZWdpc3RlckluZm9FbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5SZWdpc3RlckhlYWRlcjoKKyAgICAgIFJlZ2lzdGVySW5mb0VtaXR0ZXIoUmVjb3JkcykucnVuSGVhZGVyKE91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdlbkluc3RyRW51bXM6CisgICAgICBJbnN0ckVudW1FbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5JbnN0cnM6CisgICAgICBJbnN0ckluZm9FbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5DYWxsaW5nQ29udjoKKyAgICAgIENhbGxpbmdDb252RW1pdHRlcihSZWNvcmRzKS5ydW4oT3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR2VuQXNtV3JpdGVyOgorICAgICAgQXNtV3JpdGVyRW1pdHRlcihSZWNvcmRzKS5ydW4oT3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR2VuQVJNRGVjb2RlcjoKKyAgICAgIEFSTURlY29kZXJFbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5Bc21NYXRjaGVyOgorICAgICAgQXNtTWF0Y2hlckVtaXR0ZXIoUmVjb3JkcykucnVuKE91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdlbkNsYW5nQXR0ckNsYXNzZXM6CisgICAgICBDbGFuZ0F0dHJDbGFzc0VtaXR0ZXIoUmVjb3JkcykucnVuKE91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdlbkNsYW5nQXR0ckxpc3Q6CisgICAgICBDbGFuZ0F0dHJMaXN0RW1pdHRlcihSZWNvcmRzKS5ydW4oT3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR2VuQ2xhbmdEaWFnc0RlZnM6CisgICAgICBDbGFuZ0RpYWdzRGVmc0VtaXR0ZXIoUmVjb3JkcywgQ2xhbmdDb21wb25lbnQpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5DbGFuZ0RpYWdHcm91cHM6CisgICAgICBDbGFuZ0RpYWdHcm91cHNFbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5DbGFuZ0RlY2xOb2RlczoKKyAgICAgIENsYW5nQVNUTm9kZXNFbWl0dGVyKFJlY29yZHMsICJEZWNsIiwgIkRlY2wiKS5ydW4oT3V0KTsKKyAgICAgIENsYW5nRGVjbENvbnRleHRFbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5DbGFuZ1N0bXROb2RlczoKKyAgICAgIENsYW5nQVNUTm9kZXNFbWl0dGVyKFJlY29yZHMsICJTdG10IiwgIiIpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5EaXNhc3NlbWJsZXI6CisgICAgICBEaXNhc3NlbWJsZXJFbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5PcHRQYXJzZXJEZWZzOgorICAgICAgT3B0UGFyc2VyRW1pdHRlcihSZWNvcmRzLCB0cnVlKS5ydW4oT3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR2VuT3B0UGFyc2VySW1wbDoKKyAgICAgIE9wdFBhcnNlckVtaXR0ZXIoUmVjb3JkcywgZmFsc2UpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5EQUdJU2VsOgorICAgICAgREFHSVNlbEVtaXR0ZXIoUmVjb3JkcykucnVuKE91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdlbkZhc3RJU2VsOgorICAgICAgRmFzdElTZWxFbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5TdWJ0YXJnZXQ6CisgICAgICBTdWJ0YXJnZXRFbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5JbnRyaW5zaWM6CisgICAgICBJbnRyaW5zaWNFbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5UZ3RJbnRyaW5zaWM6CisgICAgICBJbnRyaW5zaWNFbWl0dGVyKFJlY29yZHMsIHRydWUpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5MTFZNQ0NvbmY6CisgICAgICBMTFZNQ0NvbmZpZ3VyYXRpb25FbWl0dGVyKFJlY29yZHMpLnJ1bihPdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5FREluZm86CisgICAgICBFREVtaXR0ZXIoUmVjb3JkcykucnVuKE91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdlbkFybU5lb246CisgICAgICBOZW9uRW1pdHRlcihSZWNvcmRzKS5ydW4oT3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR2VuQXJtTmVvblNlbWE6CisgICAgICBOZW9uRW1pdHRlcihSZWNvcmRzKS5ydW5IZWFkZXIoT3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUHJpbnRFbnVtczoKKyAgICB7CisgICAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBSZWNzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoQ2xhc3MpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlY3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgT3V0IDw8IFJlY3NbaV0tPmdldE5hbWUoKSA8PCAiLCAiOworICAgICAgT3V0IDw8ICJcbiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgxICYmICJJbnZhbGlkIEFjdGlvbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKKyAgfSBjYXRjaCAoY29uc3QgVEdFcnJvciAmRXJyb3IpIHsKKyAgICBlcnJzKCkgPDwgYXJndlswXSA8PCAiOiBlcnJvcjpcbiI7CisgICAgUHJpbnRFcnJvcihFcnJvci5nZXRMb2MoKSwgRXJyb3IuZ2V0TWVzc2FnZSgpKTsKKworICB9IGNhdGNoIChjb25zdCBzdGQ6OnN0cmluZyAmRXJyb3IpIHsKKyAgICBlcnJzKCkgPDwgYXJndlswXSA8PCAiOiAiIDw8IEVycm9yIDw8ICJcbiI7CisgIH0gY2F0Y2ggKGNvbnN0IGNoYXIgKkVycm9yKSB7CisgICAgZXJycygpIDw8IGFyZ3ZbMF0gPDwgIjogIiA8PCBFcnJvciA8PCAiXG4iOworICB9IGNhdGNoICguLi4pIHsKKyAgICBlcnJzKCkgPDwgYXJndlswXSA8PCAiOiBVbmtub3duIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkLlxuIjsKKyAgfQorCisgIGlmIChPdXRwdXRGaWxlbmFtZSAhPSAiLSIpCisgICAgc3RkOjpyZW1vdmUoT3V0cHV0RmlsZW5hbWUuY19zdHIoKSk7ICAgIC8vIFJlbW92ZSB0aGUgZmlsZSwgaXQncyBicm9rZW4KKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9UYWJsZUdlbkJhY2tlbmQuY3BwIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vVGFibGVHZW5CYWNrZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2UzM2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vVGFibGVHZW5CYWNrZW5kLmNwcApAQCAtMCwwICsxLDI1IEBACisvLz09PS0gVGFibGVHZW5CYWNrZW5kLmNwcCAtIEJhc2UgY2xhc3MgZm9yIFRhYmxlR2VuIEJhY2tlbmRzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB1c2VmdWwgc2VydmljZXMgZm9yIFRhYmxlR2VuIGJhY2tlbmRzLi4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIlRhYmxlR2VuQmFja2VuZC5oIgorI2luY2x1ZGUgIlJlY29yZC5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3ZvaWQgVGFibGVHZW5CYWNrZW5kOjpFbWl0U291cmNlRmlsZUhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyAmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIi8vPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0iCisgICAgICAgIiBDKysgLSotPT09Ly9cbi8vXG4vLyAiIDw8IERlc2MgPDwgIlxuLy9cbi8vIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUiCisgICAgICAgImQgZmlsZSwgZG8gbm90IGVkaXQhXG4vL1xuLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vL1xuXG4iOworfQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9UYWJsZUdlbkJhY2tlbmQuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1RhYmxlR2VuQmFja2VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMmI5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9UYWJsZUdlbkJhY2tlbmQuaApAQCAtMCwwICsxLDQzIEBACisvLz09PS0gVGFibGVHZW5CYWNrZW5kLmggLSBCYXNlIGNsYXNzIGZvciBUYWJsZUdlbiBCYWNrZW5kcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBUYWJsZUdlbkJhY2tlbmQgY2xhc3MgaXMgcHJvdmlkZWQgYXMgYSBjb21tb24gaW50ZXJmYWNlIGZvciBhbGwgVGFibGVHZW4KKy8vIGJhY2tlbmRzLiAgSXQgcHJvdmlkZXMgdXNlZnVsIHNlcnZpY2VzIGFuZCBhbiBzdGFuZGFyZGl6ZWQgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVEFCTEVHRU5CQUNLRU5EX0gKKyNkZWZpbmUgVEFCTEVHRU5CQUNLRU5EX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBSZWNvcmQ7CitjbGFzcyBSZWNvcmRLZWVwZXI7CisKK3N0cnVjdCBUYWJsZUdlbkJhY2tlbmQgeworICB2aXJ0dWFsIH5UYWJsZUdlbkJhY2tlbmQoKSB7fQorCisgIC8vIHJ1biAtIEFsbCBUYWJsZUdlbiBiYWNrZW5kcyBzaG91bGQgaW1wbGVtZW50IHRoZSBydW4gbWV0aG9kLCB3aGljaCBzaG91bGQKKyAgLy8gYmUgdGhlIG1haW4gZW50cnkgcG9pbnQuCisgIHZpcnR1YWwgdm9pZCBydW4ocmF3X29zdHJlYW0gJk9TKSA9IDA7CisKKworcHVibGljOiAgIC8vIFVzZWZ1bCBoZWxwZXIgcm91dGluZXMuLi4KKyAgLy8vIEVtaXRTb3VyY2VGaWxlSGVhZGVyIC0gT3V0cHV0IGEgTExWTSBzdHlsZSBmaWxlIGhlYWRlciB0byB0aGUgc3BlY2lmaWVkCisgIC8vLyBvc3RyZWFtLgorICB2b2lkIEVtaXRTb3VyY2VGaWxlSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZEZXNjLCByYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1g4NkRpc2Fzc2VtYmxlclNoYXJlZC5oIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vWDg2RGlzYXNzZW1ibGVyU2hhcmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxN2U5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1g4NkRpc2Fzc2VtYmxlclNoYXJlZC5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LSBYODZEaXNhc3NlbWJsZXJTaGFyZWQuaCAtIEVtaXR0ZXIgc2hhcmVkIGhlYWRlciAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWDg2RElTQVNTRU1CTEVSU0hBUkVEX0gKKyNkZWZpbmUgWDg2RElTQVNTRU1CTEVSU0hBUkVEX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBJTlNUUlVDVElPTl9TUEVDSUZJRVJfRklFTERTICAgICAgIFwKKyAgYm9vbCAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQ7ICAgICAgICBcCisgIEluc3RydWN0aW9uQ29udGV4dCAgICAgIGluc25Db250ZXh0OyAgICAgXAorICBzdGQ6OnN0cmluZyAgICAgICAgICAgICBuYW1lOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEluc3RydWN0aW9uU3BlY2lmaWVyKCkgeyAgICAgICAgICAgICAgICAgXAorICAgIGZpbHRlcmVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnNuQ29udGV4dCA9IElDOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSA9ICIiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmaWVyVHlwZSA9IE1PRElGSUVSX05PTkU7ICAgICAgICAgIFwKKyAgICBtb2RpZmllckJhc2UgPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtc2V0KG9wZXJhbmRzLCAwLCBzaXplb2Yob3BlcmFuZHMpKTsgXAorICB9CisKKyNkZWZpbmUgSU5TVFJVQ1RJT05fSURTICAgICAgICAgICBcCisgIEluc3RyVUlEICAgaW5zdHJ1Y3Rpb25JRHNbMjU2XTsKKworI2luY2x1ZGUgIi4uLy4uL2xpYi9UYXJnZXQvWDg2L0Rpc2Fzc2VtYmxlci9YODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmgiCisKKyN1bmRlZiBJTlNUUlVDVElPTl9TUEVDSUZJRVJfRklFTERTCisjdW5kZWYgSU5TVFJVQ1RJT05fSURTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vWDg2RGlzYXNzZW1ibGVyVGFibGVzLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1g4NkRpc2Fzc2VtYmxlclRhYmxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3NjIyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1g4NkRpc2Fzc2VtYmxlclRhYmxlcy5jcHAKQEAgLTAsMCArMSw2MDMgQEAKKy8vPT09LSBYODZEaXNhc3NlbWJsZXJUYWJsZXMuY3BwIC0gRGlzYXNzZW1ibGVyIHRhYmxlcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFg4NiBEaXNhc3NlbWJsZXIgRW1pdHRlci4KKy8vIEl0IGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGlzYXNzZW1ibGVyIHRhYmxlcy4KKy8vIERvY3VtZW50YXRpb24gZm9yIHRoZSBkaXNhc3NlbWJsZXIgZW1pdHRlciBpbiBnZW5lcmFsIGNhbiBiZSBmb3VuZCBpbgorLy8gIFg4NkRpc2FzZW1ibGVyRW1pdHRlci5oLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJYODZEaXNhc3NlbWJsZXJTaGFyZWQuaCIKKyNpbmNsdWRlICJYODZEaXNhc3NlbWJsZXJUYWJsZXMuaCIKKworI2luY2x1ZGUgIlRhYmxlR2VuQmFja2VuZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdC5oIgorCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIG5hbWVzcGFjZSBYODZEaXNhc3NlbWJsZXI7CisgIAorLy8vIGluaGVyaXRzRnJvbSAtIEluZGljYXRlcyB3aGV0aGVyIGFsbCBpbnN0cnVjdGlvbnMgaW4gb25lIGNsYXNzIGFsc28gYmVsb25nCisvLy8gICB0byBhbm90aGVyIGNsYXNzLgorLy8vCisvLy8gQHBhcmFtIGNoaWxkICAtIFRoZSBjbGFzcyB0aGF0IG1heSBiZSB0aGUgc3Vic2V0CisvLy8gQHBhcmFtIHBhcmVudCAtIFRoZSBjbGFzcyB0aGF0IG1heSBiZSB0aGUgc3VwZXJzZXQKKy8vLyBAcmV0dXJuICAgICAgIC0gVHJ1ZSBpZiBjaGlsZCBpcyBhIHN1YnNldCBvZiBwYXJlbnQsIGZhbHNlIG90aGVyd2lzZS4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpbmhlcml0c0Zyb20oSW5zdHJ1Y3Rpb25Db250ZXh0IGNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbkNvbnRleHQgcGFyZW50KSB7CisgIGlmIChjaGlsZCA9PSBwYXJlbnQpCisgICAgcmV0dXJuIHRydWU7CisgIAorICBzd2l0Y2ggKHBhcmVudCkgeworICBjYXNlIElDOgorICAgIHJldHVybiB0cnVlOworICBjYXNlIElDXzY0QklUOgorICAgIHJldHVybihpbmhlcml0c0Zyb20oY2hpbGQsIElDXzY0QklUX1JFWFcpICAgfHwKKyAgICAgICAgICAgaW5oZXJpdHNGcm9tKGNoaWxkLCBJQ182NEJJVF9PUFNJWkUpIHx8CisgICAgICAgICAgIGluaGVyaXRzRnJvbShjaGlsZCwgSUNfNjRCSVRfWEQpICAgICB8fAorICAgICAgICAgICBpbmhlcml0c0Zyb20oY2hpbGQsIElDXzY0QklUX1hTKSk7CisgIGNhc2UgSUNfT1BTSVpFOgorICAgIHJldHVybihpbmhlcml0c0Zyb20oY2hpbGQsIElDXzY0QklUX09QU0laRSkpOworICBjYXNlIElDX1hEOgorICAgIHJldHVybihpbmhlcml0c0Zyb20oY2hpbGQsIElDXzY0QklUX1hEKSk7CisgIGNhc2UgSUNfWFM6CisgICAgcmV0dXJuKGluaGVyaXRzRnJvbShjaGlsZCwgSUNfNjRCSVRfWFMpKTsKKyAgY2FzZSBJQ182NEJJVF9SRVhXOgorICAgIHJldHVybihpbmhlcml0c0Zyb20oY2hpbGQsIElDXzY0QklUX1JFWFdfWFMpIHx8CisgICAgICAgICAgIGluaGVyaXRzRnJvbShjaGlsZCwgSUNfNjRCSVRfUkVYV19YRCkgfHwKKyAgICAgICAgICAgaW5oZXJpdHNGcm9tKGNoaWxkLCBJQ182NEJJVF9SRVhXX09QU0laRSkpOworICBjYXNlIElDXzY0QklUX09QU0laRToKKyAgICByZXR1cm4oaW5oZXJpdHNGcm9tKGNoaWxkLCBJQ182NEJJVF9SRVhXX09QU0laRSkpOworICBjYXNlIElDXzY0QklUX1hEOgorICAgIHJldHVybihpbmhlcml0c0Zyb20oY2hpbGQsIElDXzY0QklUX1JFWFdfWEQpKTsKKyAgY2FzZSBJQ182NEJJVF9YUzoKKyAgICByZXR1cm4oaW5oZXJpdHNGcm9tKGNoaWxkLCBJQ182NEJJVF9SRVhXX1hTKSk7CisgIGNhc2UgSUNfNjRCSVRfUkVYV19YRDoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgSUNfNjRCSVRfUkVYV19YUzoKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgSUNfNjRCSVRfUkVYV19PUFNJWkU6CisgICAgcmV0dXJuIGZhbHNlOworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLy8gb3V0cmFua3MgLSBJbmRpY2F0ZXMgd2hldGhlciwgaWYgYW4gaW5zdHJ1Y3Rpb24gaGFzIHR3byBkaWZmZXJlbnQgYXBwbGljYWJsZQorLy8vICAgY2xhc3Nlcywgd2hpY2ggY2xhc3Mgc2hvdWxkIGJlIHByZWZlcnJlZCB3aGVuIHBlcmZvcm1pbmcgZGVjb2RlLiAgVGhpcworLy8vICAgaW1wb3NlcyBhIHRvdGFsIG9yZGVyaW5nICh0aWVzIGFyZSByZXNvbHZlZCB0b3dhcmQgImxvd2VyIikKKy8vLworLy8vIEBwYXJhbSB1cHBlciAgLSBUaGUgY2xhc3MgdGhhdCBtYXkgYmUgcHJlZmVyYWJsZQorLy8vIEBwYXJhbSBsb3dlciAgLSBUaGUgY2xhc3MgdGhhdCBtYXkgYmUgbGVzcyBwcmVmZXJhYmxlCisvLy8gQHJldHVybiAgICAgICAtIFRydWUgaWYgdXBwZXIgaXMgdG8gYmUgcHJlZmVycmVkLCBmYWxzZSBvdGhlcndpc2UuCitzdGF0aWMgaW5saW5lIGJvb2wgb3V0cmFua3MoSW5zdHJ1Y3Rpb25Db250ZXh0IHVwcGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbkNvbnRleHQgbG93ZXIpIHsKKyAgYXNzZXJ0KHVwcGVyIDwgSUNfbWF4KTsKKyAgYXNzZXJ0KGxvd2VyIDwgSUNfbWF4KTsKKyAgCisjZGVmaW5lIEVOVU1fRU5UUlkobiwgciwgZCkgciwKKyAgc3RhdGljIGludCByYW5rc1tJQ19tYXhdID0geworICAgIElOU1RSVUNUSU9OX0NPTlRFWFRTCisgIH07CisjdW5kZWYgRU5VTV9FTlRSWQorICAKKyAgcmV0dXJuIChyYW5rc1t1cHBlcl0gPiByYW5rc1tsb3dlcl0pOworfQorCisvLy8gc3RyaW5nRm9yQ29udGV4dCAtIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIHBhcnRpY3VsYXIKKy8vLyAgIEluc3RydWN0aW9uQ29udGV4dCwgdXN1YWxseSBmb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy4KKy8vLworLy8vIEBwYXJhbSBpbnNuQ29udGV4dCAgLSBUaGUgaW5zdHJ1Y3Rpb24gY2xhc3MgdG8gdHJhbnNmb3JtIHRvIGEgc3RyaW5nLgorLy8vIEByZXR1cm4gICAgICAgICAgIC0gQSBzdGF0aWNhbGx5LWFsbG9jYXRlZCBzdHJpbmcgY29uc3RhbnQgdGhhdCBjb250YWlucyB0aGUKKy8vLyAgICAgICAgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uIGNsYXNzLgorc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdGb3JDb250ZXh0KEluc3RydWN0aW9uQ29udGV4dCBpbnNuQ29udGV4dCkgeworICBzd2l0Y2ggKGluc25Db250ZXh0KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIGluc3RydWN0aW9uIGNsYXNzIik7CisjZGVmaW5lIEVOVU1fRU5UUlkobiwgciwgZCkgICBjYXNlIG46IHJldHVybiAjbjsgYnJlYWs7CisgIElOU1RSVUNUSU9OX0NPTlRFWFRTCisjdW5kZWYgRU5VTV9FTlRSWQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBzdHJpbmdGb3JPcGVyYW5kVHlwZSAtIExpa2Ugc3RyaW5nRm9yQ29udGV4dCwgYnV0IGZvciBPcGVyYW5kVHlwZXMuCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ0Zvck9wZXJhbmRUeXBlKE9wZXJhbmRUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIHR5cGUiKTsKKyNkZWZpbmUgRU5VTV9FTlRSWShpLCBkKSBjYXNlIGk6IHJldHVybiAjaTsKKyAgVFlQRVMKKyN1bmRlZiBFTlVNX0VOVFJZCisgIH0KK30KKworLy8vIHN0cmluZ0Zvck9wZXJhbmRFbmNvZGluZyAtIGxpa2Ugc3RyaW5nRm9yQ29udGV4dCwgYnV0IGZvcgorLy8vICAgT3BlcmFuZEVuY29kaW5ncy4KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nRm9yT3BlcmFuZEVuY29kaW5nKE9wZXJhbmRFbmNvZGluZyBlbmNvZGluZykgeworICBzd2l0Y2ggKGVuY29kaW5nKSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIGVuY29kaW5nIik7CisjZGVmaW5lIEVOVU1fRU5UUlkoaSwgZCkgY2FzZSBpOiByZXR1cm4gI2k7CisgIEVOQ09ESU5HUworI3VuZGVmIEVOVU1fRU5UUlkKKyAgfQorfQorCit2b2lkIERpc2Fzc2VtYmxlclRhYmxlczo6ZW1pdE9uZUlEKHJhd19vc3RyZWFtICZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJVSUQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkQ29tbWEpIGNvbnN0IHsKKyAgaWYgKGlkKQorICAgIG8uaW5kZW50KGkgKiAyKSA8PCBmb3JtYXQoIjB4JWh4IiwgaWQpOworICBlbHNlCisgICAgby5pbmRlbnQoaSAqIDIpIDw8IDA7CisgIAorICBpZiAoYWRkQ29tbWEpCisgICAgbyA8PCAiLCAiOworICBlbHNlCisgICAgbyA8PCAiICAiOworICAKKyAgbyA8PCAiLyogIjsKKyAgbyA8PCBJbnN0cnVjdGlvblNwZWNpZmllcnNbaWRdLm5hbWU7CisgIG8gPDwgIiovIjsKKyAgCisgIG8gPDwgIlxuIjsKK30KKworLy8vIGVtaXRFbXB0eVRhYmxlIC0gRW1pdHMgdGhlIG1vZFJNRW1wdHlUYWJsZSwgd2hpY2ggaXMgdXNlZCBhcyBhIElEIHRhYmxlIGJ5CisvLy8gICBhbGwgTW9kUi9NIGRlY2lzaW9ucyBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGludmFsaWQgZm9yIGFsbCBwb3NzaWJsZQorLy8vICAgTW9kUi9NIGJ5dGUgdmFsdWVzLgorLy8vCisvLy8gQHBhcmFtIG8gICAgICAgIC0gVGhlIG91dHB1dCBzdHJlYW0gb24gd2hpY2ggdG8gZW1pdCB0aGUgdGFibGUuCisvLy8gQHBhcmFtIGkgICAgICAgIC0gVGhlIGluZGVudGF0aW9uIGxldmVsIGZvciB0aGF0IG91dHB1dCBzdHJlYW0uCitzdGF0aWMgdm9pZCBlbWl0RW1wdHlUYWJsZShyYXdfb3N0cmVhbSAmbywgdWludDMyX3QgJmkpCit7CisgIG8uaW5kZW50KGkgKiAyKSA8PCAic3RhdGljIEluc3RyVUlEIG1vZFJNRW1wdHlUYWJsZVsxXSA9IHsgMCB9OyIgPDwgIlxuIjsKKyAgbyA8PCAiXG4iOworfQorCisvLy8gZ2V0RGVjaXNpb25UeXBlIC0gRGV0ZXJtaW5lcyB3aGV0aGVyIGEgTW9kUk0gZGVjaXNpb24gd2l0aCAyNTUgZW50cmllcyBjYW4KKy8vLyAgIGJlIGNvbXBhY3RlZCBieSBlbGltaW5hdGluZyByZWR1bmRhbnQgaW5mb3JtYXRpb24uCisvLy8KKy8vLyBAcGFyYW0gZGVjaXNpb24gLSBUaGUgZGVjaXNpb24gdG8gYmUgY29tcGFjdGVkLgorLy8vIEByZXR1cm4gICAgICAgICAtIFRoZSBjb21wYWN0ZXN0IGF2YWlsYWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGRlY2lzaW9uLgorc3RhdGljIE1vZFJNRGVjaXNpb25UeXBlIGdldERlY2lzaW9uVHlwZShNb2RSTURlY2lzaW9uICZkZWNpc2lvbikKK3sKKyAgYm9vbCBzYXRpc2ZpZXNPbmVFbnRyeSA9IHRydWU7CisgIGJvb2wgc2F0aXNmaWVzU3BsaXRSTSA9IHRydWU7CisgIAorICB1aW50MTZfdCBpbmRleDsKKyAgCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDI1NjsgKytpbmRleCkgeworICAgIGlmIChkZWNpc2lvbi5pbnN0cnVjdGlvbklEc1tpbmRleF0gIT0gZGVjaXNpb24uaW5zdHJ1Y3Rpb25JRHNbMF0pCisgICAgICBzYXRpc2ZpZXNPbmVFbnRyeSA9IGZhbHNlOworICAgIAorICAgIGlmICgoKGluZGV4ICYgMHhjMCkgPT0gMHhjMCkgJiYKKyAgICAgICAoZGVjaXNpb24uaW5zdHJ1Y3Rpb25JRHNbaW5kZXhdICE9IGRlY2lzaW9uLmluc3RydWN0aW9uSURzWzB4YzBdKSkKKyAgICAgIHNhdGlzZmllc1NwbGl0Uk0gPSBmYWxzZTsKKyAgICAKKyAgICBpZiAoKChpbmRleCAmIDB4YzApICE9IDB4YzApICYmCisgICAgICAgKGRlY2lzaW9uLmluc3RydWN0aW9uSURzW2luZGV4XSAhPSBkZWNpc2lvbi5pbnN0cnVjdGlvbklEc1sweDAwXSkpCisgICAgICBzYXRpc2ZpZXNTcGxpdFJNID0gZmFsc2U7CisgIH0KKyAgCisgIGlmIChzYXRpc2ZpZXNPbmVFbnRyeSkKKyAgICByZXR1cm4gTU9EUk1fT05FRU5UUlk7CisgIAorICBpZiAoc2F0aXNmaWVzU3BsaXRSTSkKKyAgICByZXR1cm4gTU9EUk1fU1BMSVRSTTsKKyAgCisgIHJldHVybiBNT0RSTV9GVUxMOworfQorCisvLy8gc3RyaW5nRm9yRGVjaXNpb25UeXBlIC0gUmV0dXJucyBhIHN0YXRpY2FsbHktYWxsb2NhdGVkIHN0cmluZyBjb3JyZXNwb25kaW5nCisvLy8gICB0byBhIHBhcnRpY3VsYXIgZGVjaXNpb24gdHlwZS4KKy8vLworLy8vIEBwYXJhbSBkdCAtIFRoZSBkZWNpc2lvbiB0eXBlLgorLy8vIEByZXR1cm4gICAtIEEgcG9pbnRlciB0byB0aGUgc3RhdGljYWxseS1hbGxvY2F0ZWQgc3RyaW5nIChlLmcuLCAKKy8vLyAgICAgICAgICAgICAiTU9EUk1fT05FRU5UUlkiIGZvciBNT0RSTV9PTkVFTlRSWSkuCitzdGF0aWMgY29uc3QgY2hhciogc3RyaW5nRm9yRGVjaXNpb25UeXBlKE1vZFJNRGVjaXNpb25UeXBlIGR0KQoreworI2RlZmluZSBFTlVNX0VOVFJZKG4pIGNhc2UgbjogcmV0dXJuICNuOworICBzd2l0Y2ggKGR0KSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gZGVjaXNpb24gdHlwZSIpOyAgCisgICAgTU9EUk1UWVBFUworICB9OyAgCisjdW5kZWYgRU5VTV9FTlRSWQorfQorICAKKy8vLyBzdHJpbmdGb3JNb2RpZmllclR5cGUgLSBSZXR1cm5zIGEgc3RhdGljYWxseS1hbGxvY2F0ZWQgc3RyaW5nIGNvcnJlc3BvbmRpbmcKKy8vLyAgIHRvIGFuIG9wY29kZSBtb2RpZmllciB0eXBlLgorLy8vCisvLy8gQHBhcmFtIG10IC0gVGhlIG1vZGlmaWVyIHR5cGUuCisvLy8gQHJldHVybiAgIC0gQSBwb2ludGVyIHRvIHRoZSBzdGF0aWNhbGx5LWFsbG9jYXRlZCBzdHJpbmcgKGUuZy4sCisvLy8gICAgICAgICAgICAgIk1PRElGSUVSX05PTkUiIGZvciBNT0RJRklFUl9OT05FKS4KK3N0YXRpYyBjb25zdCBjaGFyKiBzdHJpbmdGb3JNb2RpZmllclR5cGUoTW9kaWZpZXJUeXBlIG10KQoreworI2RlZmluZSBFTlVNX0VOVFJZKG4pIGNhc2UgbjogcmV0dXJuICNuOworICBzd2l0Y2gobXQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBtb2RpZmllciB0eXBlIik7CisgICAgTU9ESUZJRVJfVFlQRVMKKyAgfTsKKyN1bmRlZiBFTlVNX0VOVFJZCit9CisgIAorRGlzYXNzZW1ibGVyVGFibGVzOjpEaXNhc3NlbWJsZXJUYWJsZXMoKSB7CisgIHVuc2lnbmVkIGk7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgVGFibGVzW2ldID0gbmV3IENvbnRleHREZWNpc2lvbjsKKyAgICBtZW1zZXQoVGFibGVzW2ldLCAwLCBzaXplb2YoQ29udGV4dERlY2lzaW9uKSk7CisgIH0KKyAgCisgIEhhc0NvbmZsaWN0cyA9IGZhbHNlOworfQorICAKK0Rpc2Fzc2VtYmxlclRhYmxlczo6fkRpc2Fzc2VtYmxlclRhYmxlcygpIHsKKyAgdW5zaWduZWQgaTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZGVsZXRlIFRhYmxlc1tpXTsKK30KKyAgCit2b2lkIERpc2Fzc2VtYmxlclRhYmxlczo6ZW1pdE1vZFJNRGVjaXNpb24ocmF3X29zdHJlYW0gJm8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmaTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJmkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZFJNRGVjaXNpb24gJmRlY2lzaW9uKQorICBjb25zdCB7CisgIHN0YXRpYyB1aW50NjRfdCBzVGFibGVOdW1iZXIgPSAwOworICB1aW50NjRfdCB0aGlzVGFibGVOdW1iZXIgPSBzVGFibGVOdW1iZXI7CisgIE1vZFJNRGVjaXNpb25UeXBlIGR0ID0gZ2V0RGVjaXNpb25UeXBlKGRlY2lzaW9uKTsKKyAgdWludDE2X3QgaW5kZXg7CisgIAorICBpZiAoZHQgPT0gTU9EUk1fT05FRU5UUlkgJiYgZGVjaXNpb24uaW5zdHJ1Y3Rpb25JRHNbMF0gPT0gMCkKKyAgeworICAgIG8yLmluZGVudChpMikgPDwgInsgLyogTW9kUk1EZWNpc2lvbiAqLyIgPDwgIlxuIjsKKyAgICBpMisrOworICAgIAorICAgIG8yLmluZGVudChpMikgPDwgc3RyaW5nRm9yRGVjaXNpb25UeXBlKGR0KSA8PCAiLCIgPDwgIlxuIjsKKyAgICBvMi5pbmRlbnQoaTIpIDw8ICJtb2RSTUVtcHR5VGFibGUiOworICAgIAorICAgIGkyLS07CisgICAgbzIuaW5kZW50KGkyKSA8PCAifSI7CisgICAgcmV0dXJuOworICB9CisgICAgCisgIG8xLmluZGVudChpMSkgPDwgInN0YXRpYyBJbnN0clVJRCBtb2RSTVRhYmxlIiA8PCB0aGlzVGFibGVOdW1iZXI7CisgICAgCisgIHN3aXRjaCAoZHQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBkZWNpc2lvbiB0eXBlIik7CisgICAgY2FzZSBNT0RSTV9PTkVFTlRSWToKKyAgICAgIG8xIDw8ICJbMV0iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RSTV9TUExJVFJNOgorICAgICAgbzEgPDwgIlsyXSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PRFJNX0ZVTEw6CisgICAgICBvMSA8PCAiWzI1Nl0iOworICAgICAgYnJlYWs7ICAgICAgCisgIH0KKworICBvMSA8PCAiID0geyIgPDwgIlxuIjsKKyAgaTErKzsKKyAgICAKKyAgc3dpdGNoIChkdCkgeworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGRlY2lzaW9uIHR5cGUiKTsKKyAgICBjYXNlIE1PRFJNX09ORUVOVFJZOgorICAgICAgZW1pdE9uZUlEKG8xLCBpMSwgZGVjaXNpb24uaW5zdHJ1Y3Rpb25JRHNbMF0sIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9EUk1fU1BMSVRSTToKKyAgICAgIGVtaXRPbmVJRChvMSwgaTEsIGRlY2lzaW9uLmluc3RydWN0aW9uSURzWzB4MDBdLCB0cnVlKTsgLy8gbW9kID0gMGIwMAorICAgICAgZW1pdE9uZUlEKG8xLCBpMSwgZGVjaXNpb24uaW5zdHJ1Y3Rpb25JRHNbMHhjMF0sIGZhbHNlKTsgLy8gbW9kID0gMGIxMQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RSTV9GVUxMOgorICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMjU2OyArK2luZGV4KQorICAgICAgICBlbWl0T25lSUQobzEsIGkxLCBkZWNpc2lvbi5pbnN0cnVjdGlvbklEc1tpbmRleF0sIGluZGV4IDwgMjU1KTsKKyAgICAgIGJyZWFrOworICB9CisgICAgCisgIGkxLS07CisgIG8xLmluZGVudChpMSkgPDwgIn07IiA8PCAiXG4iOworICBvMSA8PCAiXG4iOworICAgIAorICBvMi5pbmRlbnQoaTIpIDw8ICJ7IC8qIHN0cnVjdCBNb2RSTURlY2lzaW9uICovIiA8PCAiXG4iOworICBpMisrOworICAgIAorICBvMi5pbmRlbnQoaTIpIDw8IHN0cmluZ0ZvckRlY2lzaW9uVHlwZShkdCkgPDwgIiwiIDw8ICJcbiI7CisgIG8yLmluZGVudChpMikgPDwgIm1vZFJNVGFibGUiIDw8IHNUYWJsZU51bWJlciA8PCAiXG4iOworICAgIAorICBpMi0tOworICBvMi5pbmRlbnQoaTIpIDw8ICJ9IjsKKyAgICAKKyAgKytzVGFibGVOdW1iZXI7Cit9CisKK3ZvaWQgRGlzYXNzZW1ibGVyVGFibGVzOjplbWl0T3Bjb2RlRGVjaXNpb24oCisgIHJhd19vc3RyZWFtICZvMSwKKyAgcmF3X29zdHJlYW0gJm8yLAorICB1aW50MzJfdCAmaTEsCisgIHVpbnQzMl90ICZpMiwKKyAgT3Bjb2RlRGVjaXNpb24gJmRlY2lzaW9uKSBjb25zdCB7CisgIHVpbnQxNl90IGluZGV4OworCisgIG8yLmluZGVudChpMikgPDwgInsgLyogc3RydWN0IE9wY29kZURlY2lzaW9uICovIiA8PCAiXG4iOworICBpMisrOworICBvMi5pbmRlbnQoaTIpIDw8ICJ7IiA8PCAiXG4iOworICBpMisrOworCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDI1NjsgKytpbmRleCkgeworICAgIG8yLmluZGVudChpMik7CisKKyAgICBvMiA8PCAiLyogMHgiIDw8IGZvcm1hdCgiJTAyaGh4IiwgaW5kZXgpIDw8ICIgKi8iIDw8ICJcbiI7CisKKyAgICBlbWl0TW9kUk1EZWNpc2lvbihvMSwgbzIsIGkxLCBpMiwgZGVjaXNpb24ubW9kUk1EZWNpc2lvbnNbaW5kZXhdKTsKKworICAgIGlmIChpbmRleCA8ICAyNTUpCisgICAgICBvMiA8PCAiLCI7CisKKyAgICBvMiA8PCAiXG4iOworICB9CisKKyAgaTItLTsKKyAgbzIuaW5kZW50KGkyKSA8PCAifSIgPDwgIlxuIjsKKyAgaTItLTsKKyAgbzIuaW5kZW50KGkyKSA8PCAifSIgPDwgIlxuIjsKK30KKwordm9pZCBEaXNhc3NlbWJsZXJUYWJsZXM6OmVtaXRDb250ZXh0RGVjaXNpb24oCisgIHJhd19vc3RyZWFtICZvMSwKKyAgcmF3X29zdHJlYW0gJm8yLAorICB1aW50MzJfdCAmaTEsCisgIHVpbnQzMl90ICZpMiwKKyAgQ29udGV4dERlY2lzaW9uICZkZWNpc2lvbiwKKyAgY29uc3QgY2hhciogbmFtZSkgY29uc3QgeworICBvMi5pbmRlbnQoaTIpIDw8ICJzdHJ1Y3QgQ29udGV4dERlY2lzaW9uICIgPDwgbmFtZSA8PCAiID0geyIgPDwgIlxuIjsKKyAgaTIrKzsKKyAgbzIuaW5kZW50KGkyKSA8PCAieyAvKiBvcGNvZGVEZWNpc2lvbnMgKi8iIDw8ICJcbiI7CisgIGkyKys7CisKKyAgdW5zaWduZWQgaW5kZXg7CisKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSUNfbWF4OyArK2luZGV4KSB7CisgICAgbzIuaW5kZW50KGkyKSA8PCAiLyogIjsKKyAgICBvMiA8PCBzdHJpbmdGb3JDb250ZXh0KChJbnN0cnVjdGlvbkNvbnRleHQpaW5kZXgpOworICAgIG8yIDw8ICIgKi8iOworICAgIG8yIDw8ICJcbiI7CisKKyAgICBlbWl0T3Bjb2RlRGVjaXNpb24obzEsIG8yLCBpMSwgaTIsIGRlY2lzaW9uLm9wY29kZURlY2lzaW9uc1tpbmRleF0pOworCisgICAgaWYgKGluZGV4ICsgMSA8IElDX21heCkKKyAgICAgIG8yIDw8ICIsICI7CisgIH0KKworICBpMi0tOworICBvMi5pbmRlbnQoaTIpIDw8ICJ9IiA8PCAiXG4iOworICBpMi0tOworICBvMi5pbmRlbnQoaTIpIDw8ICJ9OyIgPDwgIlxuIjsKK30KKwordm9pZCBEaXNhc3NlbWJsZXJUYWJsZXM6OmVtaXRJbnN0cnVjdGlvbkluZm8ocmF3X29zdHJlYW0gJm8sIHVpbnQzMl90ICZpKSAKKyAgY29uc3QgeworICBvLmluZGVudChpICogMikgPDwgInN0cnVjdCBJbnN0cnVjdGlvblNwZWNpZmllciAiOworICBvIDw8IElOU1RSVUNUSU9OU19TVFIgPDwgIlsiOworICBvIDw8IEluc3RydWN0aW9uU3BlY2lmaWVycy5zaXplKCk7CisgIG8gPDwgIl0gPSB7IiA8PCAiXG4iOworICAKKyAgaSsrOworCisgIHVpbnQxNl90IG51bUluc3RydWN0aW9ucyA9IEluc3RydWN0aW9uU3BlY2lmaWVycy5zaXplKCk7CisgIHVpbnQxNl90IGluZGV4LCBvcGVyYW5kSW5kZXg7CisKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtSW5zdHJ1Y3Rpb25zOyArK2luZGV4KSB7CisgICAgby5pbmRlbnQoaSAqIDIpIDw8ICJ7IC8qICIgPDwgaW5kZXggPDwgIiAqLyIgPDwgIlxuIjsKKyAgICBpKys7CisgICAgCisgICAgby5pbmRlbnQoaSAqIDIpIDw8IAorICAgICAgc3RyaW5nRm9yTW9kaWZpZXJUeXBlKEluc3RydWN0aW9uU3BlY2lmaWVyc1tpbmRleF0ubW9kaWZpZXJUeXBlKTsKKyAgICBvIDw8ICIsIiA8PCAiXG4iOworICAgIAorICAgIG8uaW5kZW50KGkgKiAyKSA8PCAiMHgiOworICAgIG8gPDwgZm9ybWF0KCIlMDJoaHgiLCAodWludDE2X3QpSW5zdHJ1Y3Rpb25TcGVjaWZpZXJzW2luZGV4XS5tb2RpZmllckJhc2UpOworICAgIG8gPDwgIiwiIDw8ICJcbiI7CisKKyAgICBvLmluZGVudChpICogMikgPDwgInsiIDw8ICJcbiI7CisgICAgaSsrOworCisgICAgZm9yIChvcGVyYW5kSW5kZXggPSAwOyBvcGVyYW5kSW5kZXggPCBYODZfTUFYX09QRVJBTkRTOyArK29wZXJhbmRJbmRleCkgeworICAgICAgby5pbmRlbnQoaSAqIDIpIDw8ICJ7ICI7CisgICAgICBvIDw8IHN0cmluZ0Zvck9wZXJhbmRFbmNvZGluZyhJbnN0cnVjdGlvblNwZWNpZmllcnNbaW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3BlcmFuZHNbb3BlcmFuZEluZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVuY29kaW5nKTsKKyAgICAgIG8gPDwgIiwgIjsKKyAgICAgIG8gPDwgc3RyaW5nRm9yT3BlcmFuZFR5cGUoSW5zdHJ1Y3Rpb25TcGVjaWZpZXJzW2luZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3BlcmFuZHNbb3BlcmFuZEluZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSk7CisgICAgICBvIDw8ICIgfSI7CisKKyAgICAgIGlmIChvcGVyYW5kSW5kZXggPCBYODZfTUFYX09QRVJBTkRTIC0gMSkKKyAgICAgICAgbyA8PCAiLCI7CisKKyAgICAgIG8gPDwgIlxuIjsKKyAgICB9CisKKyAgICBpLS07CisgICAgby5pbmRlbnQoaSAqIDIpIDw8ICJ9LCIgPDwgIlxuIjsKKyAgICAKKyAgICBvLmluZGVudChpICogMikgPDwgIlwiIiA8PCBJbnN0cnVjdGlvblNwZWNpZmllcnNbaW5kZXhdLm5hbWUgPDwgIlwiIjsKKyAgICBvIDw8ICJcbiI7CisKKyAgICBpLS07CisgICAgby5pbmRlbnQoaSAqIDIpIDw8ICJ9IjsKKworICAgIGlmIChpbmRleCArIDEgPCBudW1JbnN0cnVjdGlvbnMpCisgICAgICBvIDw8ICIsIjsKKworICAgIG8gPDwgIlxuIjsKKyAgfQorCisgIGktLTsKKyAgby5pbmRlbnQoaSAqIDIpIDw8ICJ9OyIgPDwgIlxuIjsKK30KKwordm9pZCBEaXNhc3NlbWJsZXJUYWJsZXM6OmVtaXRDb250ZXh0VGFibGUocmF3X29zdHJlYW0gJm8sIHVpbnQzMl90ICZpKSBjb25zdCB7CisgIHVpbnQxNl90IGluZGV4OworCisgIG8uaW5kZW50KGkgKiAyKSA8PCAiSW5zdHJ1Y3Rpb25Db250ZXh0ICI7CisgIG8gPDwgQ09OVEVYVFNfU1RSIDw8ICJbMjU2XSA9IHsiIDw8ICJcbiI7CisgIGkrKzsKKworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAyNTY7ICsraW5kZXgpIHsKKyAgICBvLmluZGVudChpICogMik7CisKKyAgICBpZiAoKGluZGV4ICYgQVRUUl82NEJJVCkgJiYgKGluZGV4ICYgQVRUUl9SRVhXKSAmJiAoaW5kZXggJiBBVFRSX1hTKSkKKyAgICAgIG8gPDwgIklDXzY0QklUX1JFWFdfWFMiOworICAgIGVsc2UgaWYgKChpbmRleCAmIEFUVFJfNjRCSVQpICYmIChpbmRleCAmIEFUVFJfUkVYVykgJiYgKGluZGV4ICYgQVRUUl9YRCkpCisgICAgICBvIDw8ICJJQ182NEJJVF9SRVhXX1hEIjsKKyAgICBlbHNlIGlmICgoaW5kZXggJiBBVFRSXzY0QklUKSAmJiAoaW5kZXggJiBBVFRSX1JFWFcpICYmIAorICAgICAgICAgICAgIChpbmRleCAmIEFUVFJfT1BTSVpFKSkKKyAgICAgIG8gPDwgIklDXzY0QklUX1JFWFdfT1BTSVpFIjsKKyAgICBlbHNlIGlmICgoaW5kZXggJiBBVFRSXzY0QklUKSAmJiAoaW5kZXggJiBBVFRSX1hTKSkKKyAgICAgIG8gPDwgIklDXzY0QklUX1hTIjsKKyAgICBlbHNlIGlmICgoaW5kZXggJiBBVFRSXzY0QklUKSAmJiAoaW5kZXggJiBBVFRSX1hEKSkKKyAgICAgIG8gPDwgIklDXzY0QklUX1hEIjsKKyAgICBlbHNlIGlmICgoaW5kZXggJiBBVFRSXzY0QklUKSAmJiAoaW5kZXggJiBBVFRSX09QU0laRSkpCisgICAgICBvIDw8ICJJQ182NEJJVF9PUFNJWkUiOworICAgIGVsc2UgaWYgKChpbmRleCAmIEFUVFJfNjRCSVQpICYmIChpbmRleCAmIEFUVFJfUkVYVykpCisgICAgICBvIDw8ICJJQ182NEJJVF9SRVhXIjsKKyAgICBlbHNlIGlmICgoaW5kZXggJiBBVFRSXzY0QklUKSkKKyAgICAgIG8gPDwgIklDXzY0QklUIjsKKyAgICBlbHNlIGlmIChpbmRleCAmIEFUVFJfWFMpCisgICAgICBvIDw8ICJJQ19YUyI7CisgICAgZWxzZSBpZiAoaW5kZXggJiBBVFRSX1hEKQorICAgICAgbyA8PCAiSUNfWEQiOworICAgIGVsc2UgaWYgKGluZGV4ICYgQVRUUl9PUFNJWkUpCisgICAgICBvIDw8ICJJQ19PUFNJWkUiOworICAgIGVsc2UKKyAgICAgIG8gPDwgIklDIjsKKworICAgIGlmIChpbmRleCA8IDI1NSkKKyAgICAgIG8gPDwgIiwiOworICAgIGVsc2UKKyAgICAgIG8gPDwgIiAiOworCisgICAgbyA8PCAiIC8qICIgPDwgaW5kZXggPDwgIiAqLyI7CisKKyAgICBvIDw8ICJcbiI7CisgIH0KKworICBpLS07CisgIG8uaW5kZW50KGkgKiAyKSA8PCAifTsiIDw8ICJcbiI7Cit9CisKK3ZvaWQgRGlzYXNzZW1ibGVyVGFibGVzOjplbWl0Q29udGV4dERlY2lzaW9ucyhyYXdfb3N0cmVhbSAmbzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJmkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmaTIpCisgIGNvbnN0IHsKKyAgZW1pdENvbnRleHREZWNpc2lvbihvMSwgbzIsIGkxLCBpMiwgKlRhYmxlc1swXSwgT05FQllURV9TVFIpOworICBlbWl0Q29udGV4dERlY2lzaW9uKG8xLCBvMiwgaTEsIGkyLCAqVGFibGVzWzFdLCBUV09CWVRFX1NUUik7CisgIGVtaXRDb250ZXh0RGVjaXNpb24obzEsIG8yLCBpMSwgaTIsICpUYWJsZXNbMl0sIFRIUkVFQllURTM4X1NUUik7CisgIGVtaXRDb250ZXh0RGVjaXNpb24obzEsIG8yLCBpMSwgaTIsICpUYWJsZXNbM10sIFRIUkVFQllURTNBX1NUUik7Cit9CisKK3ZvaWQgRGlzYXNzZW1ibGVyVGFibGVzOjplbWl0KHJhd19vc3RyZWFtICZvKSBjb25zdCB7CisgIHVpbnQzMl90IGkxID0gMDsKKyAgdWludDMyX3QgaTIgPSAwOworICAKKyAgc3RkOjpzdHJpbmcgczE7CisgIHN0ZDo6c3RyaW5nIHMyOworICAKKyAgcmF3X3N0cmluZ19vc3RyZWFtIG8xKHMxKTsKKyAgcmF3X3N0cmluZ19vc3RyZWFtIG8yKHMyKTsKKyAgCisgIGVtaXRJbnN0cnVjdGlvbkluZm8obywgaTIpOworICBvIDw8ICJcbiI7CisKKyAgZW1pdENvbnRleHRUYWJsZShvLCBpMik7CisgIG8gPDwgIlxuIjsKKyAgCisgIGVtaXRFbXB0eVRhYmxlKG8xLCBpMSk7CisgIGVtaXRDb250ZXh0RGVjaXNpb25zKG8xLCBvMiwgaTEsIGkyKTsKKyAgCisgIG8gPDwgbzEuc3RyKCk7CisgIG8gPDwgIlxuIjsKKyAgbyA8PCBvMi5zdHIoKTsKKyAgbyA8PCAiXG4iOworICBvIDw8ICJcbiI7Cit9CisKK3ZvaWQgRGlzYXNzZW1ibGVyVGFibGVzOjpzZXRUYWJsZUZpZWxkcyhNb2RSTURlY2lzaW9uICAgICAmZGVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kUk1GaWx0ZXIgJmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clVJRCAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgb3Bjb2RlKSB7CisgIHVuc2lnbmVkIGluZGV4OworCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDI1NjsgKytpbmRleCkgeworICAgIGlmIChmaWx0ZXIuYWNjZXB0cyhpbmRleCkpIHsKKyAgICAgIGlmIChkZWNpc2lvbi5pbnN0cnVjdGlvbklEc1tpbmRleF0gPT0gdWlkKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKGRlY2lzaW9uLmluc3RydWN0aW9uSURzW2luZGV4XSAhPSAwKSB7CisgICAgICAgIEluc3RydWN0aW9uU3BlY2lmaWVyICZuZXdJbmZvID0KKyAgICAgICAgICBJbnN0cnVjdGlvblNwZWNpZmllcnNbdWlkXTsKKyAgICAgICAgSW5zdHJ1Y3Rpb25TcGVjaWZpZXIgJnByZXZpb3VzSW5mbyA9CisgICAgICAgICAgSW5zdHJ1Y3Rpb25TcGVjaWZpZXJzW2RlY2lzaW9uLmluc3RydWN0aW9uSURzW2luZGV4XV07CisgICAgICAgIAorICAgICAgICBpZihuZXdJbmZvLmZpbHRlcmVkKQorICAgICAgICAgIGNvbnRpbnVlOyAvLyBmaWx0ZXJlZCBpbnN0cnVjdGlvbnMgZ2V0IGxvd2VzdCBwcmlvcml0eQorICAgICAgICAKKyAgICAgICAgaWYocHJldmlvdXNJbmZvLm5hbWUgPT0gIk5PT1AiKQorICAgICAgICAgIGNvbnRpbnVlOyAvLyBzcGVjaWFsIGNhc2UgZm9yIFhDSEczMmFyIGFuZCBOT09QCisKKyAgICAgICAgaWYgKG91dHJhbmtzKHByZXZpb3VzSW5mby5pbnNuQ29udGV4dCwgbmV3SW5mby5pbnNuQ29udGV4dCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorICAgICAgICBpZiAocHJldmlvdXNJbmZvLmluc25Db250ZXh0ID09IG5ld0luZm8uaW5zbkNvbnRleHQgJiYKKyAgICAgICAgICAgICFwcmV2aW91c0luZm8uZmlsdGVyZWQpIHsKKyAgICAgICAgICBlcnJzKCkgPDwgIkVycm9yOiBQcmltYXJ5IGRlY29kZSBjb25mbGljdDogIjsKKyAgICAgICAgICBlcnJzKCkgPDwgbmV3SW5mby5uYW1lIDw8ICIgd291bGQgb3ZlcndyaXRlICIgPDwgcHJldmlvdXNJbmZvLm5hbWU7CisgICAgICAgICAgZXJycygpIDw8ICJcbiI7CisgICAgICAgICAgZXJycygpIDw8ICJNb2RSTSAgICIgPDwgaW5kZXggPDwgIlxuIjsKKyAgICAgICAgICBlcnJzKCkgPDwgIk9wY29kZSAgIiA8PCAodWludDE2X3Qpb3Bjb2RlIDw8ICJcbiI7CisgICAgICAgICAgZXJycygpIDw8ICJDb250ZXh0ICIgPDwgc3RyaW5nRm9yQ29udGV4dChuZXdJbmZvLmluc25Db250ZXh0KSA8PCAiXG4iOworICAgICAgICAgIEhhc0NvbmZsaWN0cyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZGVjaXNpb24uaW5zdHJ1Y3Rpb25JRHNbaW5kZXhdID0gdWlkOworICAgIH0KKyAgfQorfQorCit2b2lkIERpc2Fzc2VtYmxlclRhYmxlczo6c2V0VGFibGVGaWVsZHMoT3Bjb2RlVHlwZSAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uQ29udGV4dCAgaW5zbkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kUk1GaWx0ZXIgICAmZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyVUlEICAgICAgICAgICAgdWlkKSB7CisgIHVuc2lnbmVkIGluZGV4OworICAKKyAgQ29udGV4dERlY2lzaW9uICZkZWNpc2lvbiA9ICpUYWJsZXNbdHlwZV07CisKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSUNfbWF4OyArK2luZGV4KSB7CisgICAgaWYgKGluaGVyaXRzRnJvbSgoSW5zdHJ1Y3Rpb25Db250ZXh0KWluZGV4LCAKKyAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uU3BlY2lmaWVyc1t1aWRdLmluc25Db250ZXh0KSkKKyAgICAgIHNldFRhYmxlRmllbGRzKGRlY2lzaW9uLm9wY29kZURlY2lzaW9uc1tpbmRleF0ubW9kUk1EZWNpc2lvbnNbb3Bjb2RlXSwgCisgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9YODZEaXNhc3NlbWJsZXJUYWJsZXMuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1g4NkRpc2Fzc2VtYmxlclRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZWJhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9YODZEaXNhc3NlbWJsZXJUYWJsZXMuaApAQCAtMCwwICsxLDI5MSBAQAorLy89PT0tIFg4NkRpc2Fzc2VtYmxlclRhYmxlcy5oIC0gRGlzYXNzZW1ibGVyIHRhYmxlcyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgWDg2IERpc2Fzc2VtYmxlciBFbWl0dGVyLgorLy8gSXQgY29udGFpbnMgdGhlIGludGVyZmFjZSBvZiB0aGUgZGlzYXNzZW1ibGVyIHRhYmxlcy4KKy8vIERvY3VtZW50YXRpb24gZm9yIHRoZSBkaXNhc3NlbWJsZXIgZW1pdHRlciBpbiBnZW5lcmFsIGNhbiBiZSBmb3VuZCBpbgorLy8gIFg4NkRpc2FzZW1ibGVyRW1pdHRlci5oLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgWDg2RElTQVNTRU1CTEVSVEFCTEVTX0gKKyNkZWZpbmUgWDg2RElTQVNTRU1CTEVSVEFCTEVTX0gKKworI2luY2x1ZGUgIlg4NkRpc2Fzc2VtYmxlclNoYXJlZC5oIgorI2luY2x1ZGUgIlg4Nk1vZFJNRmlsdGVycy5oIgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIFg4NkRpc2Fzc2VtYmxlciB7CisKKy8vLyBEaXNhc3NlbWJsZXJUYWJsZXMgLSBFbmNhcHN1bGF0ZXMgYWxsIHRoZSBkZWNvZGUgdGFibGVzIGJlaW5nIGdlbmVyYXRlZCBieQorLy8vICAgdGhlIHRhYmxlIGVtaXR0ZXIuICBDb250YWlucyBmdW5jdGlvbnMgdG8gcG9wdWxhdGUgdGhlIHRhYmxlcyBhcyB3ZWxsIGFzCisvLy8gICB0byBlbWl0IHRoZW0gYXMgaGllcmFyY2hpY2FsIEMgc3RydWN0dXJlcyBzdWl0YWJsZSBmb3IgY29uc3VtcHRpb24gYnkgdGhlCisvLy8gICBydW50aW1lLgorY2xhc3MgRGlzYXNzZW1ibGVyVGFibGVzIHsKK3ByaXZhdGU6CisgIC8vLyBUaGUgZGVjb2RlciB0YWJsZXMuICBUaGVyZSBpcyBvbmUgZm9yIGVhY2ggb3Bjb2RlIHR5cGU6CisgIC8vLyBbMF0gb25lLWJ5dGUgb3Bjb2RlcworICAvLy8gWzFdIHR3by1ieXRlIG9wY29kZXMgb2YgdGhlIGZvcm0gMGYgX18KKyAgLy8vIFsyXSB0aHJlZS1ieXRlIG9wY29kZXMgb2YgdGhlIGZvcm0gMGYgMzggX18KKyAgLy8vIFszXSB0aHJlZS1ieXRlIG9wY29kZXMgb2YgdGhlIGZvcm0gMGYgM2EgX18KKyAgQ29udGV4dERlY2lzaW9uKiBUYWJsZXNbNF07CisgIAorICAvLy8gVGhlIGluc3RydWN0aW9uIGluZm9ybWF0aW9uIHRhYmxlCisgIHN0ZDo6dmVjdG9yPEluc3RydWN0aW9uU3BlY2lmaWVyPiBJbnN0cnVjdGlvblNwZWNpZmllcnM7CisgIAorICAvLy8gVHJ1ZSBpZiB0aGVyZSBhcmUgcHJpbWFyeSBkZWNvZGUgY29uZmxpY3RzIGluIHRoZSBpbnN0cnVjdGlvbiBzZXQKKyAgYm9vbCBIYXNDb25mbGljdHM7CisgIAorICAvLy8gZW1pdE9uZUlEIC0gRW1pdHMgYSB0YWJsZSBlbnRyeSBmb3IgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gZW50cnksIGF0IHRoZQorICAvLy8gICBpbm5lcm1vc3QgbGV2ZWwgb2YgdGhlIHN0cnVjdHVyZSBoaWVyYXJjaHkuICBUaGUgZW50cnkgaXMgcHJpbnRlZCBvdXQKKyAgLy8vICAgaW4gdGhlIGZvcm1hdCAibm5ubiwgLyogTU5FTU9OSUMgKi8iIHdoZXJlIG5ubm4gaXMgdGhlIElEIGluIGRlY2ltYWwsCisgIC8vLyAgIHRoZSBjb21tYSBpcyBwcmludGVkIGlmIGFkZENvbW1hIGlzIHRydWUsIGFuZCB0aGUgbWVub25pYyBpcyB0aGUgbmFtZQorICAvLy8gICBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXMgbGlzdGVkIGluIHRoZSBMTFZNIHRhYmxlcy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gbyAgICAgICAgLSBUaGUgb3V0cHV0IHN0cmVhbSB0byBwcmludCB0aGUgZW50cnkgb24uCisgIC8vLyBAcGFyYW0gaSAgICAgICAgLSBUaGUgaW5kZW50YXRpb24gbGV2ZWwgZm9yIG8uCisgIC8vLyBAcGFyYW0gaWQgICAgICAgLSBUaGUgdW5pcXVlIElEIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBwcmludC4KKyAgLy8vIEBwYXJhbSBhZGRDb21tYSAtIFdoZXRoZXIgb3Igbm90IHRvIHByaW50IGEgY29tbWEgYWZ0ZXIgdGhlIElELiAgVHJ1ZSBpZgorICAvLy8gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgaXRlbXMgd2lsbCBmb2xsb3cuCisgIHZvaWQgZW1pdE9uZUlEKHJhd19vc3RyZWFtICZvLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCAmaSwKKyAgICAgICAgICAgICAgICAgSW5zdHJVSUQgaWQsCisgICAgICAgICAgICAgICAgIGJvb2wgYWRkQ29tbWEpIGNvbnN0OworICAKKyAgLy8vIGVtaXRNb2RSTURlY2lzaW9uIC0gRW1pdHMgYSB0YWJsZSBvZiBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gYSBzaW5nbGUKKyAgLy8vICAgTW9kUi9NIGRlY2lzaW9uLiAgQ29tcGFjdHMgdGhlIE1vZFIvTSBkZWNpc2lvbiBpZiBwb3NzaWJsZS4gIE1vZFIvTQorICAvLy8gICBkZWNpc2lvbnMgYXJlIHByaW50ZWQgYXM6CisgIC8vLworICAvLy8gICB7IC8qIHN0cnVjdCBNb2RSTURlY2lzaW9uICovCisgIC8vLyAgICAgVFlQRSwKKyAgLy8vICAgICBtb2RSTVRhYmxlbm5ubgorICAvLy8gICB9CisgIC8vLworICAvLy8gICB3aGVyZSBubm5uIGlzIGEgdW5pcXVlIElEIGZvciB0aGUgY29ycmVzcG9uZGluZyB0YWJsZSBvZiBJRHMuCisgIC8vLyAgIFRZUEUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhYmxlIGhhcyBvbmUgZW50cnkgdGhhdCBpcyB0aGUgc2FtZQorICAvLy8gICByZWdhcmRsZXNzIG9mIE1vZFIvTSBieXRlLCB0d28gZW50cmllcyAtIG9uZSBmb3IgYnl0ZXMgMHgwMC0weGJmIGFuZCBvbmUKKyAgLy8vICAgZm9yIGJ5dGVzIDB4YzAtMHhmZiAtLCBvciAyNTYgZW50cmllcywgb25lIGZvciBlYWNoIHBvc3NpYmxlIGJ5dGUuICAKKyAgLy8vICAgbm5ubiBpcyB0aGUgbnVtYmVyIG9mIGEgdGFibGUgZm9yIGxvb2tpbmcgdXAgdGhlc2UgdmFsdWVzLiAgVGhlIHRhYmxlcworICAvLy8gICBhcmUgd3JpdGVuIHNlcGFyYXRlbHkgc28gdGhhdCB0YWJsZXMgY29uc2lzdGluZyBlbnRpcmVseSBvZiB6ZXJvcyB3aWxsCisgIC8vLyAgIG5vdCBiZSBkdXBsaWNhdGVkLiAgKFRoZXNlIGFsbCBoYXZlIHRoZSBuYW1lIG1vZFJNRW1wdHlUYWJsZS4pICBBIHRhYmxlCisgIC8vLyAgIGlzIHByaW50ZWQgYXM6CisgIC8vLyAgIAorICAvLy8gICBJbnN0clVJRCBtb2RSTVRhYmxlbm5ubltrXSA9IHsKKyAgLy8vICAgICBubm5uLCAvKiBNTkVNT05JQyAqLworICAvLy8gICAgIC4uLgorICAvLy8gICAgIG5ubm4gLyogTU5FTU9OSUMgKi8KKyAgLy8vICAgfTsKKyAgLy8vCisgIC8vLyBAcGFyYW0gbzEgICAgICAgLSBUaGUgb3V0cHV0IHN0cmVhbSB0byBwcmludCB0aGUgSUQgdGFibGUgdG8uCisgIC8vLyBAcGFyYW0gbzIgICAgICAgLSBUaGUgb3V0cHV0IHN0cmVhbSB0byBwcmludCB0aGUgZGVjaXNpb24gc3RydWN0dXJlIHRvLgorICAvLy8gQHBhcmFtIGkxICAgICAgIC0gVGhlIGluZGVudGF0aW9uIGxldmVsIHRvIHVzZSB3aXRoIHN0cmVhbSBvMS4KKyAgLy8vIEBwYXJhbSBpMiAgICAgICAtIFRoZSBpbmRlbnRhdGlvbiBsZXZlbCB0byB1c2Ugd2l0aCBzdHJlYW0gbzIuCisgIC8vLyBAcGFyYW0gZGVjaXNpb24gLSBUaGUgTW9kUi9NIGRlY2lzaW9uIHRvIGVtaXQuICBUaGlzIGRlY2lzaW9uIGhhcyAyNTYKKyAgLy8vICAgICAgICAgICAgICAgICAgIGVudHJpZXMgLSBlbWl0TW9kUk1EZWNpc2lvbiBkZWNpZGVzIGhvdyB0byBjb21wYWN0IGl0LgorICB2b2lkIGVtaXRNb2RSTURlY2lzaW9uKHJhd19vc3RyZWFtICZvMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJmkxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZpMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb2RSTURlY2lzaW9uICZkZWNpc2lvbikgY29uc3Q7CisgIAorICAvLy8gZW1pdE9wY29kZURlY2lzaW9uIC0gRW1pdHMgYW4gT3Bjb2RlRGVjaXNpb24gYW5kIGFsbCBpdHMgc3Vic2lkaWFyeSBNb2RSL00KKyAgLy8vICAgZGVjaXNpb25zLiAgQW4gT3Bjb2RlRGVjaXNpb24gaXMgcHJpbnRlZCBhczoKKyAgLy8vCisgIC8vLyAgIHsgLyogc3RydWN0IE9wY29kZURlY2lzaW9uICovCisgIC8vLyAgICAgLyogMHgwMCAqLworICAvLy8gICAgIHsgLyogc3RydWN0IE1vZFJNRGVjaXNpb24gKi8KKyAgLy8vICAgICAgIC4uLgorICAvLy8gICAgIH0KKyAgLy8vICAgICAuLi4KKyAgLy8vICAgfQorICAvLy8KKyAgLy8vICAgd2hlcmUgdGhlIE1vZFJNRGVjaXNpb24gc3RydWN0dXJlIGlzIHByaW50ZWQgYXMgZGVzY3JpYmVkIGluIHRoZQorICAvLy8gICBkb2N1bWVudGF0aW9uIGZvciBlbWl0TW9kUk1EZWNpc2lvbigpLiAgZW1pdE9wY29kZURlY2lzaW9uKCkgcGFzc2VzIG9uIGEKKyAgLy8vICAgc3RyZWFtIGFuZCBpbmRlbnQgbGV2ZWwgZm9yIHRoZSBVSUQgdGFibGVzIGdlbmVyYXRlZCBieQorICAvLy8gICBlbWl0TW9kUk1EZWNpc2lvbigpLCBidXQgZG9lcyBub3QgdXNlIHRoZW0gaXRzZWxmLgorICAvLy8KKyAgLy8vIEBwYXJhbSBvMSAgICAgICAtIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHByaW50IHRoZSBJRCB0YWJsZXMgZ2VuZXJhdGVkIGJ5CisgIC8vLyAgICAgICAgICAgICAgICAgICBlbWl0TW9kUk1EZWNpc2lvbigpIHRvLgorICAvLy8gQHBhcmFtIG8yICAgICAgIC0gVGhlIG91dHB1dCBzdHJlYW0gZm9yIHRoZSBkZWNpc2lvbiBzdHJ1Y3R1cmUgaXRzZWxmLgorICAvLy8gQHBhcmFtIGkxICAgICAgIC0gVGhlIGluZGVudCBsZXZlbCB0byB1c2Ugd2l0aCBzdHJlYW0gbzEuCisgIC8vLyBAcGFyYW0gaTIgICAgICAgLSBUaGUgaW5kZW50IGxldmVsIHRvIHVzZSB3aXRoIHN0cmVhbSBvMi4KKyAgLy8vIEBwYXJhbSBkZWNpc2lvbiAtIFRoZSBPcGNvZGVEZWNpc2lvbiB0byBlbWl0IGFsb25nIHdpdGggaXRzIHN1YnNpZGlhcnkKKyAgLy8vICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzLgorICB2b2lkIGVtaXRPcGNvZGVEZWNpc2lvbihyYXdfb3N0cmVhbSAmbzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJmkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmaTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZURlY2lzaW9uICZkZWNpc2lvbikgY29uc3Q7CisgIAorICAvLy8gZW1pdENvbnRleHREZWNpc2lvbiAtIEVtaXRzIGEgQ29udGV4dERlY2lzaW9uIGFuZCBhbGwgaXRzIHN1YnNpZGlhcnkgCisgIC8vLyAgIE9wY29kZSBhbmQgTW9kUk1EZWNpc2lvbnMuICBBIENvbnRleHREZWNpc2lvbiBpcyBwcmludGVkIGFzOgorICAvLy8KKyAgLy8vICAgc3RydWN0IENvbnRleHREZWNpc2lvbiBOQU1FID0geworICAvLy8gICAgIHsgLyogT3Bjb2RlRGVjaXNpb25zICovCisgIC8vLyAgICAgICAvKiBJQyAqLworICAvLy8gICAgICAgeyAvKiBzdHJ1Y3QgT3Bjb2RlRGVjaXNpb24gKi8KKyAgLy8vICAgICAgICAgLi4uCisgIC8vLyAgICAgICB9LAorICAvLy8gICAgICAgLi4uCisgIC8vLyAgICAgfQorICAvLy8gICB9CisgIC8vLworICAvLy8gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBDb250ZXh0RGVjaXNpb24gKHR5cGljYWxseSBvbmUgb2YgdGhlIGZvdXIgbmFtZXMgCisgIC8vLyAgIE9ORUJZVEVfU1lNLCBUV09CWVRFX1NZTSwgVEhSRUVCWVRFMzhfU1lNLCBhbmQgVEhSRUVCWVRFM0FfU1lNIGZyb20KKyAgLy8vICAgWDg2RGlzYXNzZW1ibGVyRGVjb2RlckNvbW1vbi5oKS4KKyAgLy8vICAgSUMgaXMgb25lIG9mIHRoZSBjb250ZXh0cyBpbiBJbnN0cnVjdGlvbkNvbnRleHQuICBUaGVyZSBpcyBhbiBvcGNvZGUKKyAgLy8vICAgZGVjaXNpb24gZm9yIGVhY2ggcG9zc2libGUgY29udGV4dC4KKyAgLy8vICAgVGhlIE9wY29kZURlY2lzaW9uIHN0cnVjdHVyZXMgYXJlIHByaW50ZWQgYXMgZGVzY3JpYmVkIGluIHRoZQorICAvLy8gICBkb2N1bWVudGF0aW9uIGZvciBlbWl0T3Bjb2RlRGVjaXNpb24uCisgIC8vLworICAvLy8gQHBhcmFtIG8xICAgICAgIC0gVGhlIG91dHB1dCBzdHJlYW0gdG8gcHJpbnQgdGhlIElEIHRhYmxlcyBnZW5lcmF0ZWQgYnkKKyAgLy8vICAgICAgICAgICAgICAgICAgIGVtaXRNb2RSTURlY2lzaW9uKCkgdG8uCisgIC8vLyBAcGFyYW0gbzIgICAgICAgLSBUaGUgb3V0cHV0IHN0cmVhbSB0byBwcmludCB0aGUgZGVjaXNpb24gc3RydWN0dXJlIHRvLgorICAvLy8gQHBhcmFtIGkxICAgICAgIC0gVGhlIGluZGVudCBsZXZlbCB0byB1c2Ugd2l0aCBzdHJlYW0gbzEuCisgIC8vLyBAcGFyYW0gaTIgICAgICAgLSBUaGUgaW5kZW50IGxldmVsIHRvIHVzZSB3aXRoIHN0cmVhbSBvMi4KKyAgLy8vIEBwYXJhbSBkZWNpc2lvbiAtIFRoZSBDb250ZXh0RGVjaXNpb24gdG8gZW1pdCBhbG9uZyB3aXRoIGl0cyBzdWJzaWRpYXJ5CisgIC8vLyAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzLgorICAvLy8gQHBhcmFtIG5hbWUgICAgIC0gVGhlIG5hbWUgZm9yIHRoZSBDb250ZXh0RGVjaXNpb24uCisgIHZvaWQgZW1pdENvbnRleHREZWNpc2lvbihyYXdfb3N0cmVhbSAmbzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmaTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmaTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0RGVjaXNpb24gJmRlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkgY29uc3Q7CisgIAorICAvLy8gZW1pdEluc3RydWN0aW9uSW5mbyAtIFByaW50cyB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVyIHRhYmxlLCB3aGljaCBoYXMKKyAgLy8vICAgb25lIGVudHJ5IGZvciBlYWNoIGluc3RydWN0aW9uLCBhbmQgY29udGFpbnMgbmFtZSBhbmQgb3BlcmFuZAorICAvLy8gICBpbmZvcm1hdGlvbi4gIFRoaXMgdGFibGUgaXMgcHJpbnRlZCBhczoKKyAgLy8vCisgIC8vLyAgIHN0cnVjdCBJbnN0cnVjdGlvblNwZWNpZmllciBDT05URVhUU19TWU1ba10gPSB7CisgIC8vLyAgICAgeworICAvLy8gICAgICAgLyogbm5ubiAqLworICAvLy8gICAgICAgIk1ORU1PTklDIiwKKyAgLy8vICAgICAgIDB4bm4sCisgIC8vLyAgICAgICB7CisgIC8vLyAgICAgICAgIHsKKyAgLy8vICAgICAgICAgICBFTkNPRElORywKKyAgLy8vICAgICAgICAgICBUWVBFCisgIC8vLyAgICAgICAgIH0sCisgIC8vLyAgICAgICAgIC4uLgorICAvLy8gICAgICAgfQorICAvLy8gICAgIH0sCisgIC8vLyAgIH07CisgIC8vLworICAvLy8gICBrIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLgorICAvLy8gICBubm5uIGlzIHRoZSBJRCBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiAoMC1iYXNlZCkuICBUaGlzIHRhYmxlIAorICAvLy8gICBpbmNsdWRlcyBlbnRyaWVzIGZvciBub24taW5zdHJ1Y3Rpb25zIGxpa2UgUEhJTk9ERS4KKyAgLy8vICAgMHhubiBpcyB0aGUgbG93ZXN0IHBvc3NpYmxlIG9wY29kZSBmb3IgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24sIHVzZWQgZm9yCisgIC8vLyAgIEFkZFJlZ0ZybSBpbnN0cnVjdGlvbnMgdG8gY29tcHV0ZSB0aGUgb3BlcmFuZCdzIHZhbHVlLgorICAvLy8gICBFTkNPRElORyBhbmQgVFlQRSBkZXNjcmliZSB0aGUgZW5jb2RpbmcgYW5kIHR5cGUgZm9yIGEgc2luZ2xlIG9wZXJhbmQuCisgIC8vLworICAvLy8gQHBhcmFtIG8gIC0gVGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhlIGluc3RydWN0aW9uIHRhYmxlIHNob3VsZCBiZSAKKyAgLy8vICAgICAgICAgICAgIHdyaXR0ZW4uCisgIC8vLyBAcGFyYW0gaSAgLSBUaGUgaW5kZW50IGxldmVsIGZvciB1c2Ugd2l0aCB0aGUgc3RyZWFtLgorICB2b2lkIGVtaXRJbnN0cnVjdGlvbkluZm8ocmF3X29zdHJlYW0gJm8sIHVpbnQzMl90ICZpKSBjb25zdDsKKyAgCisgIC8vLyBlbWl0Q29udGV4dFRhYmxlIC0gUHJpbnRzIHRoZSB0YWJsZSB0aGF0IGlzIHVzZWQgdG8gdHJhbnNsYXRlIGZyb20gYW4KKyAgLy8vICAgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG1hc2sgdG8gYW4gaW5zdHJ1Y3Rpb24gY29udGV4dC4gIFRoaXMgdGFibGUgaXMKKyAgLy8vICAgcHJpbnRlZCBhczoKKyAgLy8vCisgIC8vLyAgIEluc3RydWN0aW9uQ29udGV4dCBDT05URVhUU19TVFJbMjU2XSA9IHsKKyAgLy8vICAgICBJQywgLyogMHgwMCAqLworICAvLy8gICAgIC4uLgorICAvLy8gICB9OworICAvLy8KKyAgLy8vICAgSUMgaXMgdGhlIGNvbnRleHQgY29ycmVzcG9uZGluZyB0byB0aGUgbWFzayAweDAwLCBhbmQgdGhlcmUgYXJlIDI1NgorICAvLy8gICBwb3NzaWJsZSBtYXNrcy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gbyAgLSBUaGUgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0aGUgY29udGV4dCB0YWJsZSBzaG91bGQgYmUgd3JpdHRlbi4KKyAgLy8vIEBwYXJhbSBpICAtIFRoZSBpbmRlbnQgbGV2ZWwgZm9yIHVzZSB3aXRoIHRoZSBzdHJlYW0uCisgIHZvaWQgZW1pdENvbnRleHRUYWJsZShyYXdfb3N0cmVhbSAmbywgdWludDMyX3QgJmkpIGNvbnN0OworICAKKyAgLy8vIGVtaXRDb250ZXh0RGVjaXNpb25zIC0gUHJpbnRzIGFsbCBmb3VyIENvbnRleHREZWNpc2lvbiBzdHJ1Y3R1cmVzIHVzaW5nCisgIC8vLyAgIGVtaXRDb250ZXh0RGVjaXNpb24oKS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gbzEgLSBUaGUgb3V0cHV0IHN0cmVhbSB0byBwcmludCB0aGUgSUQgdGFibGVzIGdlbmVyYXRlZCBieQorICAvLy8gICAgICAgICAgICAgZW1pdE1vZFJNRGVjaXNpb24oKSB0by4KKyAgLy8vIEBwYXJhbSBvMiAtIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHByaW50IHRoZSBkZWNpc2lvbiBzdHJ1Y3R1cmVzIHRvLgorICAvLy8gQHBhcmFtIGkxIC0gVGhlIGluZGVudCBsZXZlbCB0byB1c2Ugd2l0aCBzdHJlYW0gbzEuCisgIC8vLyBAcGFyYW0gaTIgLSBUaGUgaW5kZW50IGxldmVsIHRvIHVzZSB3aXRoIHN0cmVhbSBvMi4KKyAgdm9pZCBlbWl0Q29udGV4dERlY2lzaW9ucyhyYXdfb3N0cmVhbSAmbzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZpMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmaTIpIGNvbnN0OyAKKworICAvLy8gc2V0VGFibGVGaWVsZHMgLSBVc2VzIGEgTW9kUk1GaWx0ZXIgdG8gc2V0IHRoZSBhcHByb3ByaWF0ZSBlbnRyaWVzIGluIGEKKyAgLy8vICAgTW9kUk1EZWNpc2lvbiB0byByZWZlciB0byBhIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24gSUQuCisgIC8vLworICAvLy8gQHBhcmFtIGRlY2lzaW9uIC0gVGhlIE1vZFJNRGVjaXNpb24gdG8gcG9wdWxhdGUuCisgIC8vLyBAcGFyYW0gZmlsdGVyICAgLSBUaGUgZmlsdGVyIHRvIHVzZSBpbiBkZWNpZGluZyB3aGljaCBlbnRyaWVzIHRvIHBvcHVsYXRlLgorICAvLy8gQHBhcmFtIHVpZCAgICAgIC0gVGhlIHVuaXF1ZSBJRCB0byBzZXQgbWF0Y2hpbmcgZW50cmllcyB0by4KKyAgLy8vIEBwYXJhbSBvcGNvZGUgICAtIFRoZSBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uLCBmb3IgZXJyb3IgcmVwb3J0aW5nLgorICB2b2lkIHNldFRhYmxlRmllbGRzKE1vZFJNRGVjaXNpb24gJmRlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZFJNRmlsdGVyICZmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgSW5zdHJVSUQgdWlkLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3Bjb2RlKTsKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIC0gQWxsb2NhdGVzIHNwYWNlIGZvciB0aGUgY2xhc3MgZGVjaXNpb25zIGFuZCBjbGVhcnMgdGhlbS4KKyAgRGlzYXNzZW1ibGVyVGFibGVzKCk7CisgIAorICB+RGlzYXNzZW1ibGVyVGFibGVzKCk7CisgIAorICAvLy8gZW1pdCAtIEVtaXRzIHRoZSBpbnN0cnVjdGlvbiB0YWJsZSwgY29udGV4dCB0YWJsZSwgYW5kIGNsYXNzIGRlY2lzaW9ucy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gbyAgLSBUaGUgb3V0cHV0IHN0cmVhbSB0byBwcmludCB0aGUgdGFibGVzIHRvLgorICB2b2lkIGVtaXQocmF3X29zdHJlYW0gJm8pIGNvbnN0OworICAKKyAgLy8vIHNldFRhYmxlRmllbGRzIC0gVXNlcyB0aGUgb3Bjb2RlIHR5cGUsIGluc3RydWN0aW9uIGNvbnRleHQsIG9wY29kZSwgYW5kIGEKKyAgLy8vICAgTW9kUk1GaWx0ZXIgYXMgY3JpdGVyaWEgdG8gc2V0IGEgcGFydGljdWxhciBzZXQgb2YgZW50cmllcyBpbiB0aGUKKyAgLy8vICAgZGVjb2RlIHRhYmxlcyB0byBwb2ludCB0byBhIHNwZWNpZmljIHVpZC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gdHlwZSAgICAgICAgIC0gVGhlIG9wY29kZSB0eXBlIChPTkVCWVRFLCBUV09CWVRFLCBldGMuKQorICAvLy8gQHBhcmFtIGluc25Db250ZXh0ICAtIFRoZSBjb250ZXh0IHRvIHVzZSAoSUMsIElDXzY0QklULCBldGMuKQorICAvLy8gQHBhcmFtIG9wY29kZSAgICAgICAtIFRoZSBsYXN0IGJ5dGUgb2YgdGhlIG9wY29kZSAobm90IGNvdW50aW5nIGFueSBlc2NhcGUKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICBvciBleHRlbmRlZCBvcGNvZGVzKS4KKyAgLy8vIEBwYXJhbSBmaWx0ZXIgICAgICAgLSBUaGUgTW9kUk1GaWx0ZXIgdGhhdCBkZWNpZGVzIHdoaWNoIE1vZFIvTSBieXRlIHZhbHVlcworICAvLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gdGhlIGRlc2lyZWQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBAcGFyYW0gdWlkICAgICAgICAgIC0gVGhlIHVuaXF1ZSBJRCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0VGFibGVGaWVsZHMoT3Bjb2RlVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uQ29udGV4dCBpbnNuQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2RSTUZpbHRlciAmZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgIEluc3RyVUlEIHVpZCk7ICAKKyAgCisgIC8vLyBzcGVjRm9yVUlEIC0gUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVyIGZvciBhIGdpdmVuIHVuaXF1ZQorICAvLy8gICBpbnN0cnVjdGlvbiBJRC4gIFVzZWQgd2hlbiByZXNvbHZpbmcgY29sbGlzaW9ucy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gdWlkICAtIFRoZSB1bmlxdWUgSUQgb2YgdGhlIGluc3RydWN0aW9uLgorICAvLy8gQHJldHVybiAgICAgLSBBIHJlZmVyZW5jZSB0byB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVyLiAKKyAgSW5zdHJ1Y3Rpb25TcGVjaWZpZXImIHNwZWNGb3JVSUQoSW5zdHJVSUQgdWlkKSB7CisgICAgaWYgKHVpZCA+PSBJbnN0cnVjdGlvblNwZWNpZmllcnMuc2l6ZSgpKQorICAgICAgSW5zdHJ1Y3Rpb25TcGVjaWZpZXJzLnJlc2l6ZSh1aWQgKyAxKTsKKyAgICAKKyAgICByZXR1cm4gSW5zdHJ1Y3Rpb25TcGVjaWZpZXJzW3VpZF07CisgIH0KKyAgCisgIC8vIGhhc0NvbmZsaWN0cyAtIFJlcG9ydHMgd2hldGhlciB0aGVyZSB3ZXJlIHByaW1hcnkgZGVjb2RlIGNvbmZsaWN0cworICAvLyAgIGZyb20gYW55IGluc3RydWN0aW9ucyBhZGRlZCB0byB0aGUgdGFibGVzLgorICAvLyBAcmV0dXJuICAtIHRydWUgaWYgdGhlcmUgd2VyZTsgZmFsc2Ugb3RoZXJ3aXNlLgorICAKKyAgYm9vbCBoYXNDb25mbGljdHMoKSB7CisgICAgcmV0dXJuIEhhc0NvbmZsaWN0czsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgWDg2RGlzYXNzZW1ibGVyCisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9YODZNb2RSTUZpbHRlcnMuaCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1g4Nk1vZFJNRmlsdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Y2IwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9YODZNb2RSTUZpbHRlcnMuaApAQCAtMCwwICsxLDE5NyBAQAorLy89PT0tIFg4Nk1vZFJNRmlsdGVycy5oIC0gRGlzYXNzZW1ibGVyIE1vZFIvTSBmaWx0ZXJzcyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgWDg2IERpc2Fzc2VtYmxlciBFbWl0dGVyLgorLy8gSXQgY29udGFpbnMgTW9kUi9NIGZpbHRlcnMgdGhhdCBkZXRlcm1pbmUgd2hpY2ggdmFsdWVzIG9mIHRoZSBNb2RSL00gYnl0ZQorLy8gIGFyZSB2YWxpZCBmb3IgYSBwYXJ0aXVjbGFyIGluc3RydWN0aW9uLgorLy8gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRpc2Fzc2VtYmxlciBlbWl0dGVyIGluIGdlbmVyYWwgY2FuIGJlIGZvdW5kIGluCisvLyAgWDg2RGlzYXNlbWJsZXJFbWl0dGVyLmguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBYODZNT0RSTUZJTFRFUlNfSAorI2RlZmluZSBYODZNT0RSTUZJTFRFUlNfSAorCisjaW5jbHVkZSAibGx2bS9TeXN0ZW0vRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIFg4NkRpc2Fzc2VtYmxlciB7CisKKy8vLyBNb2RSTUZpbHRlciAtIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNsYXNlcyB0aGF0IHJlY29nbml6ZSBwYXR0ZXJucyBpbgorLy8vICAgTW9kUi9NIGJ5dGVzLgorY2xhc3MgTW9kUk1GaWx0ZXIgeworcHVibGljOgorICAvLy8gRGVzdHJ1Y3RvciAgICAtIE92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KKyAgdmlydHVhbCB+TW9kUk1GaWx0ZXIoKSB7IH0KKworICAvLy8gaXNEdW1iICAgICAgICAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgZmlsdGVyIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgZm9yCisgIC8vLyAgICAgICAgICAgICAgICAgYW55IHZhbHVlIG9mIHRoZSBNb2RSL00gYnl0ZS4KKyAgLy8vCisgIC8vLyBAcmVzdWx0ICAgICAgIC0gVHJ1ZSBpZiB0aGUgZmlsdGVyIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgZm9yIGFueSBNb2RSL00KKyAgLy8vICAgICAgICAgICAgICAgICBieXRlOyBmYWxzZSBpZiBub3QuCisgIHZpcnR1YWwgYm9vbCBpc0R1bWIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAKKyAgLy8vIGFjY2VwdHMgICAgICAgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsdGVyIGFjY2VwdHMgYSBwYXJ0aWN1bGFyIE1vZFIvTQorICAvLy8gICAgICAgICAgICAgICAgIGJ5dGUgdmFsdWUuCisgIC8vLworICAvLy8gQHJlc3VsdCAgICAgICAtIFRydWUgaWYgdGhlIGZpbHRlciBhY2NlcHRzIHRoZSBNb2RSL00gYnl0ZTsgZmFsc2UgaWYgbm90LgorICB2aXJ0dWFsIGJvb2wgYWNjZXB0cyh1aW50OF90IG1vZFJNKSBjb25zdCA9IDA7Cit9OworCisvLy8gRHVtYkZpbHRlciAtIEFjY2VwdHMgYW55IE1vZFIvTSBieXRlLiAgVXNlZCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgZG8gbm90CisvLy8gICByZXF1aXJlIGEgTW9kUi9NIGJ5dGUgb3IgaW5zdHJ1Y3Rpb25zIHdoZXJlIHRoZSBlbnRpcmUgTW9kUi9NIGJ5dGUgaXMgdXNlZAorLy8vICAgZm9yIG9wZXJhbmRzLgorY2xhc3MgRHVtYkZpbHRlciA6IHB1YmxpYyBNb2RSTUZpbHRlciB7CitwdWJsaWM6CisgIGJvb2wgaXNEdW1iKCkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBib29sIGFjY2VwdHModWludDhfdCBtb2RSTSkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCisvLy8gTW9kRmlsdGVyIC0gRmlsdGVycyBiYXNlZCBvbiB0aGUgbW9kIGJpdHMgW2JpdHMgNy02XSBvZiB0aGUgTW9kUi9NIGJ5dGUuCisvLy8gICBTb21lIGluc3RydWN0aW9ucyBhcmUgY2xhc3NpZmllZCBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIDExIG9yIGFueXRoaW5nCisvLy8gICBlbHNlLiAgVGhpcyBmaWx0ZXIgcGVyZm9ybXMgdGhhdCBjbGFzc2lmaWNhdGlvbi4KK2NsYXNzIE1vZEZpbHRlciA6IHB1YmxpYyBNb2RSTUZpbHRlciB7Citwcml2YXRlOgorICBib29sIFI7CitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8KKyAgLy8vIEByICAgICAgICAgICAgLSBUcnVlIGlmIHRoZSBtb2QgYml0cyBvZiB0aGUgTW9kUi9NIGJ5dGUgbXVzdCBiZSAxMTsgZmFsc2UKKyAgLy8vICAgICAgICAgICAgICAgICBvdGhlcndpc2UuICBUaGUgbmFtZSByIGRlcml2ZXMgZnJvbSB0aGUgZmFjdCB0aGF0IHRoZSBtb2QKKyAgLy8vICAgICAgICAgICAgICAgICBiaXRzIGluZGljYXRlIHdoZXRoZXIgdGhlIFIvTSBiaXRzIFtiaXRzIDItMF0gc2lnbmlmeSBhCisgIC8vLyAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgb3IgYSBtZW1vcnkgb3BlcmFuZC4KKyAgTW9kRmlsdGVyKGJvb2wgcikgOgorICAgIE1vZFJNRmlsdGVyKCksCisgICAgUihyKSB7CisgIH0KKyAgICAKKyAgYm9vbCBhY2NlcHRzKHVpbnQ4X3QgbW9kUk0pIGNvbnN0IHsKKyAgICBpZiAoUiA9PSAoKG1vZFJNICYgMHhjMCkgPT0gMHhjMCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBFc2NhcGVGaWx0ZXIgLSBGaWx0ZXJzIGVzY2FwZSBvcGNvZGVzLCB3aGljaCBhcmUgY2xhc3NpZmllZCBpbiB0d28gd2F5cy4gIElmCisvLy8gICB0aGUgTW9kUi9NIGJ5dGUgaXMgYmV0d2VlbiAweGMwIGFuZCAweGZmLCB0aGVuIHRoZXJlIGlzIG9uZSBzbG90IGZvciBlYWNoCisvLy8gICBwb3NzaWJsZSB2YWx1ZS4gIE90aGVyd2lzZSwgdGhlcmUgaXMgb25lIGluc3RydWN0aW9uIGZvciBlYWNoIHZhbHVlIG9mIHRoZQorLy8vICAgbm5uIGZpZWxkIFtiaXRzIDUtM10sIGtub3duIGVsc2V3aGVyZSBhcyB0aGUgcmVnIGZpZWxkLgorY2xhc3MgRXNjYXBlRmlsdGVyIDogcHVibGljIE1vZFJNRmlsdGVyIHsKK3ByaXZhdGU6CisgIGJvb2wgQzBfRkY7CisgIHVpbnQ4X3QgTk5OX29yX01vZFJNOworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vCisgIC8vLyBAYzBfZmYgICAgICAgIC0gVHJ1ZSBpZiB0aGUgTW9kUi9NIGJ5dGUgbXVzdCBmYWxsIGJldHdlZW4gMHhjMCBhbmQgMHhmZjsKKyAgLy8vICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgIC8vLyBAbm5uX29yX21vZFJNIC0gSWYgYzBfZmYgaXMgdHJ1ZSwgdGhlIHJlcXVpcmVkIHZhbHVlIG9mIHRoZSBlbnRpcmUgTW9kUi9NCisgIC8vLyAgICAgICAgICAgICAgICAgYnl0ZS4gIElmIGMwX2ZmIGlzIGZhbHNlLCB0aGUgcmVxdWlyZWQgdmFsdWUgb2YgdGhlIG5ubgorICAvLy8gICAgICAgICAgICAgICAgIGZpZWxkLgorICBFc2NhcGVGaWx0ZXIoYm9vbCBjMF9mZiwgdWludDhfdCBubm5fb3JfbW9kUk0pIDoKKyAgICBNb2RSTUZpbHRlcigpLAorICAgIEMwX0ZGKGMwX2ZmKSwKKyAgICBOTk5fb3JfTW9kUk0obm5uX29yX21vZFJNKSB7CisgIH0KKyAgICAKKyAgYm9vbCBhY2NlcHRzKHVpbnQ4X3QgbW9kUk0pIGNvbnN0IHsKKyAgICBpZiAoKEMwX0ZGICYmIG1vZFJNID49IDB4YzAgJiYgKG1vZFJNID09IE5OTl9vcl9Nb2RSTSkpIHx8CisgICAgICAgICghQzBfRkYgJiYgbW9kUk0gPCAweGMwICAmJiAoKG1vZFJNICYgMHgzOCkgPj4gMykgPT0gTk5OX29yX01vZFJNKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIEFkZFJlZ0VzY2FwZUZpbHRlciAtIFNvbWUgZXNjYXBlIG9wY29kZXMgaGF2ZSBvbmUgb2YgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzCisvLy8gICBhZGRlZCB0byB0aGUgTW9kUi9NIGJ5dGUsIG1lYW5pbmcgdGhhdCBhIHJhbmdlIG9mIGVpZ2h0IE1vZFIvTSB2YWx1ZXMKKy8vLyAgIG1hcHMgdG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBTdWNoIGluc3RydWN0aW9ucyByZXF1aXJlIHRoZSBNb2RSL00gYnl0ZQorLy8vICAgdG8gZmFsbCBiZXR3ZWVuIDB4YzAgYW5kIDB4ZmYuCitjbGFzcyBBZGRSZWdFc2NhcGVGaWx0ZXIgOiBwdWJsaWMgTW9kUk1GaWx0ZXIgeworcHJpdmF0ZToKKyAgdWludDhfdCBNb2RSTTsKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yCisgIC8vLworICAvLy8gQG1vZFJNICAgICAgICAtIFRoZSB2YWx1ZSBvZiB0aGUgTW9kUi9NIGJ5dGUgd2hlbiB0aGUgcmVnaXN0ZXIgb3BlcmFuZAorICAvLy8gICAgICAgICAgICAgICAgIHJlZmVycyB0byB0aGUgZmlyc3QgcmVnaXN0ZXIgaW4gdGhlIHJlZ2lzdGVyIHNldC4KKyAgQWRkUmVnRXNjYXBlRmlsdGVyKHVpbnQ4X3QgbW9kUk0pIDogTW9kUk0obW9kUk0pIHsKKyAgfQorICAKKyAgYm9vbCBhY2NlcHRzKHVpbnQ4X3QgbW9kUk0pIGNvbnN0IHsKKyAgICBpZiAobW9kUk0gPj0gTW9kUk0gJiYgbW9kUk0gPCBNb2RSTSArIDgpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBFeHRlbmRlZEZpbHRlciAtIEV4dGVuZGVkIG9wY29kZXMgYXJlIGNsYXNzaWZpZWQgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZQorLy8vICAgbW9kIGZpZWxkIFtiaXRzIDctNl0gYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbm5uIGZpZWxkIFtiaXRzIDUtM10uIAorY2xhc3MgRXh0ZW5kZWRGaWx0ZXIgOiBwdWJsaWMgTW9kUk1GaWx0ZXIgeworcHJpdmF0ZToKKyAgYm9vbCBSOworICB1aW50OF90IE5OTjsKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yCisgIC8vLworICAvLy8gQHIgICAgICAgICAgICAtIFRydWUgaWYgdGhlIG1vZCBmaWVsZCBtdXN0IGJlIHNldCB0byAxMTsgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8gICAgICAgICAgICAgICAgIFRoZSBuYW1lIGlzIGV4cGxhaW5lZCBhdCBNb2RGaWx0ZXIuCisgIC8vLyBAbm5uICAgICAgICAgIC0gVGhlIHJlcXVpcmVkIHZhbHVlIG9mIHRoZSBubm4gZmllbGQuCisgIEV4dGVuZGVkRmlsdGVyKGJvb2wgciwgdWludDhfdCBubm4pIDogCisgICAgTW9kUk1GaWx0ZXIoKSwKKyAgICBSKHIpLAorICAgIE5OTihubm4pIHsKKyAgfQorICAgIAorICBib29sIGFjY2VwdHModWludDhfdCBtb2RSTSkgY29uc3QgeworICAgIGlmICgoKFIgICYmICgobW9kUk0gJiAweGMwKSA9PSAweGMwKSkgfHwKKyAgICAgICAgKCFSICYmICgobW9kUk0gJiAweGMwKSAhPSAweGMwKSkpICYmCisgICAgICAgICgoKG1vZFJNICYgMHgzOCkgPj4gMykgPT0gTk5OKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIEV4YWN0RmlsdGVyIC0gVGhlIG9jY2FzaW9uYWwgZXh0ZW5kZWQgb3Bjb2RlIChzdWNoIGFzIFZNQ0FMTCBvciBNT05JVE9SKQorLy8vICAgcmVxdWlyZXMgdGhlIE1vZFIvTSBieXRlIHRvIGhhdmUgYSBzcGVjaWZpYyB2YWx1ZS4KK2NsYXNzIEV4YWN0RmlsdGVyIDogcHVibGljIE1vZFJNRmlsdGVyCit7Citwcml2YXRlOgorICB1aW50OF90IE1vZFJNOworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vCisgIC8vLyBAbW9kUk0gICAgICAgIC0gVGhlIHJlcXVpcmVkIHZhbHVlIG9mIHRoZSBmdWxsIE1vZFIvTSBieXRlLgorICBFeGFjdEZpbHRlcih1aW50OF90IG1vZFJNKSA6CisgICAgTW9kUk1GaWx0ZXIoKSwKKyAgICBNb2RSTShtb2RSTSkgeworICB9CisgICAgCisgIGJvb2wgYWNjZXB0cyh1aW50OF90IG1vZFJNKSBjb25zdCB7CisgICAgaWYgKE1vZFJNID09IG1vZFJNKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBYODZEaXNhc3NlbWJsZXIKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1g4NlJlY29nbml6YWJsZUluc3RyLmNwcCBiL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1g4NlJlY29nbml6YWJsZUluc3RyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJhODViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvVGFibGVHZW4vWDg2UmVjb2duaXphYmxlSW5zdHIuY3BwCkBAIC0wLDAgKzEsOTgzIEBACisvLz09PS0gWDg2UmVjb2duaXphYmxlSW5zdHIuY3BwIC0gRGlzYXNzZW1ibGVyIGluc3RydWN0aW9uIHNwZWMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgWDg2IERpc2Fzc2VtYmxlciBFbWl0dGVyLgorLy8gSXQgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgc2luZ2xlIHJlY29nbml6YWJsZSBpbnN0cnVjdGlvbi4KKy8vIERvY3VtZW50YXRpb24gZm9yIHRoZSBkaXNhc3NlbWJsZXIgZW1pdHRlciBpbiBnZW5lcmFsIGNhbiBiZSBmb3VuZCBpbgorLy8gIFg4NkRpc2FzZW1ibGVyRW1pdHRlci5oLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJYODZEaXNhc3NlbWJsZXJTaGFyZWQuaCIKKyNpbmNsdWRlICJYODZSZWNvZ25pemFibGVJbnN0ci5oIgorI2luY2x1ZGUgIlg4Nk1vZFJNRmlsdGVycy5oIgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKyNkZWZpbmUgTVJNX01BUFBJTkcgICAgIFwKKyAgTUFQKEMxLCAzMykgICAgICAgICAgIFwKKyAgTUFQKEMyLCAzNCkgICAgICAgICAgIFwKKyAgTUFQKEMzLCAzNSkgICAgICAgICAgIFwKKyAgTUFQKEM0LCAzNikgICAgICAgICAgIFwKKyAgTUFQKEM4LCAzNykgICAgICAgICAgIFwKKyAgTUFQKEM5LCAzOCkgICAgICAgICAgIFwKKyAgTUFQKEU4LCAzOSkgICAgICAgICAgIFwKKyAgTUFQKEYwLCA0MCkgICAgICAgICAgIFwKKyAgTUFQKEY4LCA0MSkgICAgICAgICAgIFwKKyAgTUFQKEY5LCA0MikKKworLy8gQSBjbG9uZSBvZiBYODYgc2luY2Ugd2UgY2FuJ3QgZGVwZW5kIG9uIHNvbWV0aGluZyB0aGF0IGlzIGdlbmVyYXRlZC4KK25hbWVzcGFjZSBYODZMb2NhbCB7CisgIGVudW0geworICAgIFBzZXVkbyAgICAgID0gMCwKKyAgICBSYXdGcm0gICAgICA9IDEsCisgICAgQWRkUmVnRnJtICAgPSAyLAorICAgIE1STURlc3RSZWcgID0gMywKKyAgICBNUk1EZXN0TWVtICA9IDQsCisgICAgTVJNU3JjUmVnICAgPSA1LAorICAgIE1STVNyY01lbSAgID0gNiwKKyAgICBNUk0wciA9IDE2LCBNUk0xciA9IDE3LCBNUk0yciA9IDE4LCBNUk0zciA9IDE5LCAKKyAgICBNUk00ciA9IDIwLCBNUk01ciA9IDIxLCBNUk02ciA9IDIyLCBNUk03ciA9IDIzLAorICAgIE1STTBtID0gMjQsIE1STTFtID0gMjUsIE1STTJtID0gMjYsIE1STTNtID0gMjcsCisgICAgTVJNNG0gPSAyOCwgTVJNNW0gPSAyOSwgTVJNNm0gPSAzMCwgTVJNN20gPSAzMSwKKyAgICBNUk1Jbml0UmVnICA9IDMyLAorICAgIAorI2RlZmluZSBNQVAoZnJvbSwgdG8pIE1STV8jI2Zyb20gPSB0bywKKyAgICBNUk1fTUFQUElORworI3VuZGVmIE1BUAorICAgIGxhc3RNUk0KKyAgfTsKKyAgCisgIGVudW0geworICAgIFRCICA9IDEsCisgICAgUkVQID0gMiwKKyAgICBEOCA9IDMsIEQ5ID0gNCwgREEgPSA1LCBEQiA9IDYsCisgICAgREMgPSA3LCBERCA9IDgsIERFID0gOSwgREYgPSAxMCwKKyAgICBYRCA9IDExLCAgWFMgPSAxMiwKKyAgICBUOCA9IDEzLCAgUF9UQSA9IDE0LAorICAgIFBfMEZfQUUgPSAxNiwgUF8wRl8wMSA9IDE3CisgIH07Cit9CisKKy8vIElmIHJvd3MgYXJlIGFkZGVkIHRvIHRoZSBvcGNvZGUgZXh0ZW5zaW9uIHRhYmxlcywgdGhlbiBjb3JyZXNwb25kaW5nIGVudHJpZXMKKy8vIG11c3QgYmUgYWRkZWQgaGVyZS4gIAorLy8KKy8vIElmIHRoZSByb3cgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgYnl0ZSAoaS5lLiwgOGYpLCB0aGVuIGFkZCBhbiBlbnRyeSBmb3IKKy8vIHRoYXQgYnl0ZSB0byBPTkVfQllURV9FWFRFTlNJT05fVEFCTEVTLgorLy8KKy8vIElmIHRoZSByb3cgY29ycmVzcG9uZHMgdG8gdHdvIGJ5dGVzIHdoZXJlIHRoZSBmaXJzdCBpcyAwZiwgYWRkIGFuIGVudHJ5IGZvciAKKy8vIHRoZSBzZWNvbmQgYnl0ZSB0byBUV09fQllURV9FWFRFTlNJT05fVEFCTEVTLgorLy8KKy8vIElmIHRoZSByb3cgY29ycmVzcG9uZHMgdG8gc29tZSBvdGhlciBzZXQgb2YgYnl0ZXMsIHlvdSB3aWxsIG5lZWQgdG8gbW9kaWZ5CisvLyB0aGUgY29kZSBpbiBSZWNvZ25pemFibGVJbnN0cjo6ZW1pdERlY29kZVBhdGgoKSBhcyB3ZWxsLCBhbmQgYWRkIG5ldyBwcmVmaXhlcworLy8gdG8gdGhlIFg4NiBURCBmaWxlcywgZXhjZXB0IGluIHR3byBjYXNlczogaWYgdGhlIGZpcnN0IHR3byBieXRlcyBvZiBzdWNoIGEgCisvLyBuZXcgY29tYmluYXRpb24gYXJlIDBmIDM4IG9yIDBmIDNhLCB5b3UganVzdCBoYXZlIHRvIGFkZCBtYXBzIGNhbGxlZAorLy8gVEhSRUVfQllURV8zOF9FWFRFTlNJT05fVEFCTEVTIGFuZCBUSFJFRV9CWVRFXzNBX0VYVEVOU0lPTl9UQUJMRVMgYW5kIGFkZCBhCisvLyBzd2l0Y2goT3Bjb2RlKSBqdXN0IGJlbG93IHRoZSBjYXNlIFg4NkxvY2FsOjpUODogb3IgY2FzZSBYODZMb2NhbDo6VEE6IGxpbmUKKy8vIGluIFJlY29nbml6YWJsZUluc3RyOjplbWl0RGVjb2RlUGF0aCgpLgorCisjZGVmaW5lIE9ORV9CWVRFX0VYVEVOU0lPTl9UQUJMRVMgXAorICBFWFRFTlNJT05fVEFCTEUoODApICAgICAgICAgICAgIFwKKyAgRVhURU5TSU9OX1RBQkxFKDgxKSAgICAgICAgICAgICBcCisgIEVYVEVOU0lPTl9UQUJMRSg4MikgICAgICAgICAgICAgXAorICBFWFRFTlNJT05fVEFCTEUoODMpICAgICAgICAgICAgIFwKKyAgRVhURU5TSU9OX1RBQkxFKDhmKSAgICAgICAgICAgICBcCisgIEVYVEVOU0lPTl9UQUJMRShjMCkgICAgICAgICAgICAgXAorICBFWFRFTlNJT05fVEFCTEUoYzEpICAgICAgICAgICAgIFwKKyAgRVhURU5TSU9OX1RBQkxFKGM2KSAgICAgICAgICAgICBcCisgIEVYVEVOU0lPTl9UQUJMRShjNykgICAgICAgICAgICAgXAorICBFWFRFTlNJT05fVEFCTEUoZDApICAgICAgICAgICAgIFwKKyAgRVhURU5TSU9OX1RBQkxFKGQxKSAgICAgICAgICAgICBcCisgIEVYVEVOU0lPTl9UQUJMRShkMikgICAgICAgICAgICAgXAorICBFWFRFTlNJT05fVEFCTEUoZDMpICAgICAgICAgICAgIFwKKyAgRVhURU5TSU9OX1RBQkxFKGY2KSAgICAgICAgICAgICBcCisgIEVYVEVOU0lPTl9UQUJMRShmNykgICAgICAgICAgICAgXAorICBFWFRFTlNJT05fVEFCTEUoZmUpICAgICAgICAgICAgIFwKKyAgRVhURU5TSU9OX1RBQkxFKGZmKQorICAKKyNkZWZpbmUgVFdPX0JZVEVfRVhURU5TSU9OX1RBQkxFUyBcCisgIEVYVEVOU0lPTl9UQUJMRSgwMCkgICAgICAgICAgICAgXAorICBFWFRFTlNJT05fVEFCTEUoMDEpICAgICAgICAgICAgIFwKKyAgRVhURU5TSU9OX1RBQkxFKDE4KSAgICAgICAgICAgICBcCisgIEVYVEVOU0lPTl9UQUJMRSg3MSkgICAgICAgICAgICAgXAorICBFWFRFTlNJT05fVEFCTEUoNzIpICAgICAgICAgICAgIFwKKyAgRVhURU5TSU9OX1RBQkxFKDczKSAgICAgICAgICAgICBcCisgIEVYVEVOU0lPTl9UQUJMRShhZSkgICAgICAgICAgICAgXAorICBFWFRFTlNJT05fVEFCTEUoYjkpICAgICAgICAgICAgIFwKKyAgRVhURU5TSU9OX1RBQkxFKGJhKSAgICAgICAgICAgICBcCisgIEVYVEVOU0lPTl9UQUJMRShjNykKKwordXNpbmcgbmFtZXNwYWNlIFg4NkRpc2Fzc2VtYmxlcjsKKworLy8vIG5lZWRzTW9kUk1Gb3JEZWNvZGUgLSBJbmRpY2F0ZXMgd2hldGhlciBhIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgYQorLy8vICAgTW9kUi9NIGJ5dGUgZm9yIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBwcm9wZXJseSBkZWNvZGVkLiAgRm9yIGV4YW1wbGUsIGEgCisvLy8gICBNUk1EZXN0UmVnIGluc3RydWN0aW9uIG5lZWRzIHRoZSBNb2QgZmllbGQgaW4gdGhlIE1vZFIvTSBieXRlIHRvIGJlIHNldCB0bworLy8vICAgMGIxMS4KKy8vLworLy8vIEBwYXJhbSBmb3JtIC0gVGhlIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uLgorLy8vIEByZXR1cm4gICAgIC0gdHJ1ZSBpZiB0aGUgZm9ybSBpbXBsaWVzIHRoYXQgYSBNb2RSL00gYnl0ZSBpcyByZXF1aXJlZCwgZmFsc2UKKy8vLyAgICAgICAgICAgICAgIG90aGVyd2lzZS4KK3N0YXRpYyBib29sIG5lZWRzTW9kUk1Gb3JEZWNvZGUodWludDhfdCBmb3JtKSB7CisgIGlmIChmb3JtID09IFg4NkxvY2FsOjpNUk1EZXN0UmVnICAgIHx8CisgICAgIGZvcm0gPT0gWDg2TG9jYWw6Ok1STURlc3RNZW0gICAgfHwKKyAgICAgZm9ybSA9PSBYODZMb2NhbDo6TVJNU3JjUmVnICAgICB8fAorICAgICBmb3JtID09IFg4NkxvY2FsOjpNUk1TcmNNZW0gICAgIHx8CisgICAgIChmb3JtID49IFg4NkxvY2FsOjpNUk0wciAmJiBmb3JtIDw9IFg4NkxvY2FsOjpNUk03cikgfHwKKyAgICAgKGZvcm0gPj0gWDg2TG9jYWw6Ok1STTBtICYmIGZvcm0gPD0gWDg2TG9jYWw6Ok1STTdtKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGlzUmVnRm9ybWF0IC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGZvcm0gcmVxdWlyZXMgdGhlIE1vZCBmaWVsZCBvZgorLy8vICAgdGhlIE1vZFIvTSBieXRlIHRvIGJlIDBiMTEuCisvLy8KKy8vLyBAcGFyYW0gZm9ybSAtIFRoZSBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbi4KKy8vLyBAcmV0dXJuICAgICAtIHRydWUgaWYgdGhlIGZvcm0gaW1wbGllcyB0aGF0IE1vZCBtdXN0IGJlIDBiMTEsIGZhbHNlCisvLy8gICAgICAgICAgICAgICBvdGhlcndpc2UuCitzdGF0aWMgYm9vbCBpc1JlZ0Zvcm1hdCh1aW50OF90IGZvcm0pIHsKKyAgaWYgKGZvcm0gPT0gWDg2TG9jYWw6Ok1STURlc3RSZWcgfHwKKyAgICAgZm9ybSA9PSBYODZMb2NhbDo6TVJNU3JjUmVnICB8fAorICAgICAoZm9ybSA+PSBYODZMb2NhbDo6TVJNMHIgJiYgZm9ybSA8PSBYODZMb2NhbDo6TVJNN3IpKQorICAgIHJldHVybiB0cnVlOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gYnl0ZUZyb21CaXRzSW5pdCAtIEV4dHJhY3RzIGEgdmFsdWUgYXQgbW9zdCA4IGJpdHMgaW4gd2lkdGggZnJvbSBhIEJpdHNJbml0LgorLy8vICAgVXNlZnVsIGZvciBzd2l0Y2ggc3RhdGVtZW50cyBhbmQgdGhlIGxpa2UuCisvLy8KKy8vLyBAcGFyYW0gaW5pdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBCaXRzSW5pdCB0byBiZSBkZWNvZGVkLgorLy8vIEByZXR1cm4gICAgIC0gVGhlIGZpZWxkLCB3aXRoIHRoZSBmaXJzdCBiaXQgaW4gdGhlIEJpdHNJbml0IGFzIHRoZSBsb3dlc3QKKy8vLyAgICAgICAgICAgICAgIG9yZGVyIGJpdC4KK3N0YXRpYyB1aW50OF90IGJ5dGVGcm9tQml0c0luaXQoQml0c0luaXQgJmluaXQpIHsKKyAgaW50IHdpZHRoID0gaW5pdC5nZXROdW1CaXRzKCk7CisKKyAgYXNzZXJ0KHdpZHRoIDw9IDggJiYgIkZpZWxkIGlzIHRvbyBsYXJnZSBmb3IgdWludDhfdCEiKTsKKworICBpbnQgICAgIGluZGV4OworICB1aW50OF90IG1hc2sgPSAweDAxOworCisgIHVpbnQ4X3QgcmV0ID0gMDsKKworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB3aWR0aDsgaW5kZXgrKykgeworICAgIGlmIChzdGF0aWNfY2FzdDxCaXRJbml0Kj4oaW5pdC5nZXRCaXQoaW5kZXgpKS0+Z2V0VmFsdWUoKSkKKyAgICAgIHJldCB8PSBtYXNrOworCisgICAgbWFzayA8PD0gMTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8vLyBieXRlRnJvbVJlYyAtIEV4dHJhY3QgYSB2YWx1ZSBhdCBtb3N0IDggYml0cyBpbiB3aXRoIGZyb20gYSBSZWNvcmQgZ2l2ZW4gdGhlCisvLy8gICBuYW1lIG9mIHRoZSBmaWVsZC4KKy8vLworLy8vIEBwYXJhbSByZWMgIC0gVGhlIHJlY29yZCBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIHZhbHVlLgorLy8vIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSByZWNvcmQuCisvLy8gQHJldHVybiAgICAgLSBUaGUgZmllbGQsIGFzIHRyYW5zbGF0ZWQgYnkgYnl0ZUZyb21CaXRzSW5pdCgpLgorc3RhdGljIHVpbnQ4X3QgYnl0ZUZyb21SZWMoY29uc3QgUmVjb3JkKiByZWMsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CisgIEJpdHNJbml0KiBiaXRzID0gcmVjLT5nZXRWYWx1ZUFzQml0c0luaXQobmFtZSk7CisgIHJldHVybiBieXRlRnJvbUJpdHNJbml0KCpiaXRzKTsKK30KKworUmVjb2duaXphYmxlSW5zdHI6OlJlY29nbml6YWJsZUluc3RyKERpc2Fzc2VtYmxlclRhYmxlcyAmdGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clVJRCB1aWQpIHsKKyAgVUlEID0gdWlkOworCisgIFJlYyA9IGluc24uVGhlRGVmOworICBOYW1lID0gUmVjLT5nZXROYW1lKCk7CisgIFNwZWMgPSAmdGFibGVzLnNwZWNGb3JVSUQoVUlEKTsKKyAgCisgIGlmICghUmVjLT5pc1N1YkNsYXNzT2YoIlg4Nkluc3QiKSkgeworICAgIFNob3VsZEJlRW1pdHRlZCA9IGZhbHNlOworICAgIHJldHVybjsKKyAgfQorICAKKyAgUHJlZml4ICAgPSBieXRlRnJvbVJlYyhSZWMsICJQcmVmaXgiKTsKKyAgT3Bjb2RlICAgPSBieXRlRnJvbVJlYyhSZWMsICJPcGNvZGUiKTsKKyAgRm9ybSAgICAgPSBieXRlRnJvbVJlYyhSZWMsICJGb3JtQml0cyIpOworICBTZWdPdnIgICA9IGJ5dGVGcm9tUmVjKFJlYywgIlNlZ092ckJpdHMiKTsKKyAgCisgIEhhc09wU2l6ZVByZWZpeCAgPSBSZWMtPmdldFZhbHVlQXNCaXQoImhhc09wU2l6ZVByZWZpeCIpOworICBIYXNSRVhfV1ByZWZpeCAgID0gUmVjLT5nZXRWYWx1ZUFzQml0KCJoYXNSRVhfV1ByZWZpeCIpOworICBIYXNWRVhfNFZQcmVmaXggID0gUmVjLT5nZXRWYWx1ZUFzQml0KCJoYXNWRVhfNFZQcmVmaXgiKTsKKyAgSGFzTG9ja1ByZWZpeCAgICA9IFJlYy0+Z2V0VmFsdWVBc0JpdCgiaGFzTG9ja1ByZWZpeCIpOworICBJc0NvZGVHZW5Pbmx5ICAgID0gUmVjLT5nZXRWYWx1ZUFzQml0KCJpc0NvZGVHZW5Pbmx5Iik7CisgIAorICBOYW1lICAgICAgPSBSZWMtPmdldE5hbWUoKTsKKyAgQXNtU3RyaW5nID0gUmVjLT5nZXRWYWx1ZUFzU3RyaW5nKCJBc21TdHJpbmciKTsKKyAgCisgIE9wZXJhbmRzID0gJmluc24uT3BlcmFuZExpc3Q7CisgIAorICBJc1NTRSAgICAgICAgICAgID0gSGFzT3BTaXplUHJlZml4ICYmIChOYW1lLmZpbmQoIjE2IikgPT0gTmFtZS5ucG9zKTsKKyAgSGFzRlJPcGVyYW5kcyAgICA9IGZhbHNlOworICAKKyAgU2hvdWxkQmVFbWl0dGVkICA9IHRydWU7Cit9CisgIAordm9pZCBSZWNvZ25pemFibGVJbnN0cjo6cHJvY2Vzc0luc3RyKERpc2Fzc2VtYmxlclRhYmxlcyAmdGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb24gJmluc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyVUlEIHVpZCkKK3sKKyAgLy8gSWdub3JlICJhc20gcGFyc2VyIG9ubHkiIGluc3RydWN0aW9ucy4KKyAgaWYgKGluc24uVGhlRGVmLT5nZXRWYWx1ZUFzQml0KCJpc0FzbVBhcnNlck9ubHkiKSkKKyAgICByZXR1cm47CisgIAorICBSZWNvZ25pemFibGVJbnN0ciByZWNvZ0luc3RyKHRhYmxlcywgaW5zbiwgdWlkKTsKKyAgCisgIHJlY29nSW5zdHIuZW1pdEluc3RydWN0aW9uU3BlY2lmaWVyKHRhYmxlcyk7CisgIAorICBpZiAocmVjb2dJbnN0ci5zaG91bGRCZUVtaXR0ZWQoKSkKKyAgICByZWNvZ0luc3RyLmVtaXREZWNvZGVQYXRoKHRhYmxlcyk7Cit9CisKK0luc3RydWN0aW9uQ29udGV4dCBSZWNvZ25pemFibGVJbnN0cjo6aW5zbkNvbnRleHQoKSBjb25zdCB7CisgIEluc3RydWN0aW9uQ29udGV4dCBpbnNuQ29udGV4dDsKKworICBpZiAoTmFtZS5maW5kKCI2NCIpICE9IE5hbWUubnBvcyB8fCBIYXNSRVhfV1ByZWZpeCkgeworICAgIGlmIChIYXNSRVhfV1ByZWZpeCAmJiBIYXNPcFNpemVQcmVmaXgpCisgICAgICBpbnNuQ29udGV4dCA9IElDXzY0QklUX1JFWFdfT1BTSVpFOworICAgIGVsc2UgaWYgKEhhc09wU2l6ZVByZWZpeCkKKyAgICAgIGluc25Db250ZXh0ID0gSUNfNjRCSVRfT1BTSVpFOworICAgIGVsc2UgaWYgKEhhc1JFWF9XUHJlZml4ICYmIFByZWZpeCA9PSBYODZMb2NhbDo6WFMpCisgICAgICBpbnNuQ29udGV4dCA9IElDXzY0QklUX1JFWFdfWFM7CisgICAgZWxzZSBpZiAoSGFzUkVYX1dQcmVmaXggJiYgUHJlZml4ID09IFg4NkxvY2FsOjpYRCkKKyAgICAgIGluc25Db250ZXh0ID0gSUNfNjRCSVRfUkVYV19YRDsKKyAgICBlbHNlIGlmIChQcmVmaXggPT0gWDg2TG9jYWw6OlhEKQorICAgICAgaW5zbkNvbnRleHQgPSBJQ182NEJJVF9YRDsKKyAgICBlbHNlIGlmIChQcmVmaXggPT0gWDg2TG9jYWw6OlhTKQorICAgICAgaW5zbkNvbnRleHQgPSBJQ182NEJJVF9YUzsKKyAgICBlbHNlIGlmIChIYXNSRVhfV1ByZWZpeCkKKyAgICAgIGluc25Db250ZXh0ID0gSUNfNjRCSVRfUkVYVzsKKyAgICBlbHNlCisgICAgICBpbnNuQ29udGV4dCA9IElDXzY0QklUOworICB9IGVsc2UgeworICAgIGlmIChIYXNPcFNpemVQcmVmaXgpCisgICAgICBpbnNuQ29udGV4dCA9IElDX09QU0laRTsKKyAgICBlbHNlIGlmIChQcmVmaXggPT0gWDg2TG9jYWw6OlhEKQorICAgICAgaW5zbkNvbnRleHQgPSBJQ19YRDsKKyAgICBlbHNlIGlmIChQcmVmaXggPT0gWDg2TG9jYWw6OlhTKQorICAgICAgaW5zbkNvbnRleHQgPSBJQ19YUzsKKyAgICBlbHNlCisgICAgICBpbnNuQ29udGV4dCA9IElDOworICB9CisKKyAgcmV0dXJuIGluc25Db250ZXh0OworfQorICAKK1JlY29nbml6YWJsZUluc3RyOjpmaWx0ZXJfcmV0IFJlY29nbml6YWJsZUluc3RyOjpmaWx0ZXIoKSBjb25zdCB7CisgIC8vIEZpbHRlciBvdXQgaW50cmluc2ljcworICAKKyAgaWYgKCFSZWMtPmlzU3ViQ2xhc3NPZigiWDg2SW5zdCIpKQorICAgIHJldHVybiBGSUxURVJfU1RST05HOworICAKKyAgaWYgKEZvcm0gPT0gWDg2TG9jYWw6OlBzZXVkbyB8fAorICAgICAgSXNDb2RlR2VuT25seSkKKyAgICByZXR1cm4gRklMVEVSX1NUUk9ORzsKKyAgCisgIGlmIChGb3JtID09IFg4NkxvY2FsOjpNUk1Jbml0UmVnKQorICAgIHJldHVybiBGSUxURVJfU1RST05HOworCisgIAorICAvLyBGaWx0ZXIgb3V0IGluc3RydWN0aW9ucyB3aXRoIGEgTE9DSyBwcmVmaXg7CisgIC8vICAgcHJlZmVyIGZvcm1zIHRoYXQgZG8gbm90IGhhdmUgdGhlIHByZWZpeAorICBpZiAoSGFzTG9ja1ByZWZpeCkKKyAgICByZXR1cm4gRklMVEVSX1dFQUs7CisgIAorICAvLyBGaWx0ZXIgb3V0IGFydGlmaWNpYWwgaW5zdHJ1Y3Rpb25zCisKKyAgaWYgKE5hbWUuZmluZCgiVEFJTEpNUCIpICE9IE5hbWUubnBvcyAgICB8fAorICAgICBOYW1lLmZpbmQoIl9JbnQiKSAhPSBOYW1lLm5wb3MgICAgICAgfHwKKyAgICAgTmFtZS5maW5kKCJfaW50IikgIT0gTmFtZS5ucG9zICAgICAgIHx8CisgICAgIE5hbWUuZmluZCgiSW50XyIpICE9IE5hbWUubnBvcyAgICAgICB8fAorICAgICBOYW1lLmZpbmQoIl9OT1JFWCIpICE9IE5hbWUubnBvcyAgICAgfHwKKyAgICAgTmFtZS5maW5kKCJfVEMiKSAhPSBOYW1lLm5wb3MgICAgIHx8CisgICAgIE5hbWUuZmluZCgiRUhfUkVUVVJOIikgIT0gTmFtZS5ucG9zICB8fAorICAgICBOYW1lLmZpbmQoIlZfU0VUIikgIT0gTmFtZS5ucG9zICAgICAgfHwKKyAgICAgTmFtZS5maW5kKCJMT0NLXyIpICE9IE5hbWUubnBvcyAgICAgIHx8CisgICAgIE5hbWUuZmluZCgiV0lOIikgIT0gTmFtZS5ucG9zKQorICAgIHJldHVybiBGSUxURVJfU1RST05HOworCisgIC8vIFNwZWNpYWwgY2FzZXMuCisgIAorICBpZiAoTmFtZS5maW5kKCJQQ01QSVNUUkkiKSAhPSBOYW1lLm5wb3MgJiYgTmFtZSAhPSAiUENNUElTVFJJIikKKyAgICByZXR1cm4gRklMVEVSX1dFQUs7CisgIGlmIChOYW1lLmZpbmQoIlBDTVBFU1RSSSIpICE9IE5hbWUubnBvcyAmJiBOYW1lICE9ICJQQ01QRVNUUkkiKQorICAgIHJldHVybiBGSUxURVJfV0VBSzsKKworICBpZiAoTmFtZS5maW5kKCJNT1YiKSAhPSBOYW1lLm5wb3MgJiYgTmFtZS5maW5kKCJyMCIpICE9IE5hbWUubnBvcykKKyAgICByZXR1cm4gRklMVEVSX1dFQUs7CisgIGlmIChOYW1lLmZpbmQoIk1PVloiKSAhPSBOYW1lLm5wb3MgJiYgTmFtZS5maW5kKCJNT1ZaWCIpID09IE5hbWUubnBvcykKKyAgICByZXR1cm4gRklMVEVSX1dFQUs7CisgIGlmIChOYW1lLmZpbmQoIkZzIikgIT0gTmFtZS5ucG9zKQorICAgIHJldHVybiBGSUxURVJfV0VBSzsKKyAgaWYgKE5hbWUgPT0gIk1PVkxQRHJyIiAgICAgICAgICB8fAorICAgICAgTmFtZSA9PSAiTU9WTFBTcnIiICAgICAgICAgIHx8CisgICAgICBOYW1lID09ICJQVVNIRlEiICAgICAgICAgICAgfHwKKyAgICAgIE5hbWUgPT0gIkJTRjE2cnIiICAgICAgICAgICB8fAorICAgICAgTmFtZSA9PSAiQlNGMTZybSIgICAgICAgICAgIHx8CisgICAgICBOYW1lID09ICJCU1IxNnJyIiAgICAgICAgICAgfHwKKyAgICAgIE5hbWUgPT0gIkJTUjE2cm0iICAgICAgICAgICB8fAorICAgICAgTmFtZSA9PSAiTU9WU1gxNnJtOCIgICAgICAgIHx8CisgICAgICBOYW1lID09ICJNT1ZTWDE2cnI4IiAgICAgICAgfHwKKyAgICAgIE5hbWUgPT0gIk1PVlpYMTZybTgiICAgICAgICB8fAorICAgICAgTmFtZSA9PSAiTU9WWlgxNnJyOCIgICAgICAgIHx8CisgICAgICBOYW1lID09ICJQVVNIMzJpMTYiICAgICAgICAgfHwKKyAgICAgIE5hbWUgPT0gIlBVU0g2NGkxNiIgICAgICAgICB8fAorICAgICAgTmFtZSA9PSAiTU9WUFFJMlFJbXIiICAgICAgIHx8CisgICAgICBOYW1lID09ICJNT1ZTRG1yIiAgICAgICAgICAgfHwKKyAgICAgIE5hbWUgPT0gIk1PVlNEcm0iICAgICAgICAgICB8fAorICAgICAgTmFtZSA9PSAiTU9WU1NtciIgICAgICAgICAgIHx8CisgICAgICBOYW1lID09ICJNT1ZTU3JtIiAgICAgICAgICAgfHwKKyAgICAgIE5hbWUgPT0gIk1NWF9NT1ZENjRycnYxNjQiICB8fAorICAgICAgTmFtZSA9PSAiQ1JDMzJtMTYiICAgICAgICAgIHx8CisgICAgICBOYW1lID09ICJNT1Y2NHJpNjRpMzIiICAgICAgfHwKKyAgICAgIE5hbWUgPT0gIkNSQzMycjE2IikKKyAgICByZXR1cm4gRklMVEVSX1dFQUs7CisKKyAgLy8gRmlsdGVyIG91dCBpbnN0cnVjdGlvbnMgd2l0aCBzZWdtZW50IG92ZXJyaWRlIHByZWZpeGVzLgorICAvLyBUaGV5J3JlIHRvbyBtZXNzeSB0byBoYW5kbGUgbm93IGFuZCB3ZSdsbCBzcGVjaWFsIGNhc2UgdGhlbSBpZiBuZWVkZWQuCisKKyAgaWYgKFNlZ092cikKKyAgICByZXR1cm4gRklMVEVSX1NUUk9ORzsKKyAgCisgIC8vIEZpbHRlciBvdXQgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuJ3QgYmUgcHJpbnRlZC4KKworICBpZiAoQXNtU3RyaW5nLnNpemUoKSA9PSAwKQorICAgIHJldHVybiBGSUxURVJfU1RST05HOworICAKKyAgLy8gRmlsdGVyIG91dCBpbnN0cnVjdGlvbnMgd2l0aCBzdWJyZWcgb3BlcmFuZHMuCisgIAorICBpZiAoQXNtU3RyaW5nLmZpbmQoInN1YnJlZyIpICE9IEFzbVN0cmluZy5ucG9zKQorICAgIHJldHVybiBGSUxURVJfU1RST05HOworCisgIGlmIChIYXNGUk9wZXJhbmRzICYmIE5hbWUuZmluZCgiTU9WIikgIT0gTmFtZS5ucG9zICYmCisgICAgICgoTmFtZS5maW5kKCIyIikgIT0gTmFtZS5ucG9zICYmIE5hbWUuZmluZCgiMzIiKSA9PSBOYW1lLm5wb3MpIHx8IAorICAgICAgKE5hbWUuZmluZCgidG8iKSAhPSBOYW1lLm5wb3MpKSkKKyAgICByZXR1cm4gRklMVEVSX1dFQUs7CisKKyAgcmV0dXJuIEZJTFRFUl9OT1JNQUw7Cit9CisgIAordm9pZCBSZWNvZ25pemFibGVJbnN0cjo6aGFuZGxlT3BlcmFuZCgKKyAgYm9vbCBvcHRpb25hbCwKKyAgdW5zaWduZWQgJm9wZXJhbmRJbmRleCwKKyAgdW5zaWduZWQgJnBoeXNpY2FsT3BlcmFuZEluZGV4LAorICB1bnNpZ25lZCAmbnVtUGh5c2ljYWxPcGVyYW5kcywKKyAgdW5zaWduZWQgKm9wZXJhbmRNYXBwaW5nLAorICBPcGVyYW5kRW5jb2RpbmcgKCplbmNvZGluZ0Zyb21TdHJpbmcpKGNvbnN0IHN0ZDo6c3RyaW5nJiwgYm9vbCBoYXNPcFNpemVQcmVmaXgpKSB7CisgIGlmIChvcHRpb25hbCkgeworICAgIGlmIChwaHlzaWNhbE9wZXJhbmRJbmRleCA+PSBudW1QaHlzaWNhbE9wZXJhbmRzKQorICAgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIGFzc2VydChwaHlzaWNhbE9wZXJhbmRJbmRleCA8IG51bVBoeXNpY2FsT3BlcmFuZHMpOworICB9CisgIAorICB3aGlsZSAob3BlcmFuZE1hcHBpbmdbb3BlcmFuZEluZGV4XSAhPSBvcGVyYW5kSW5kZXgpIHsKKyAgICBTcGVjLT5vcGVyYW5kc1tvcGVyYW5kSW5kZXhdLmVuY29kaW5nID0gRU5DT0RJTkdfRFVQOworICAgIFNwZWMtPm9wZXJhbmRzW29wZXJhbmRJbmRleF0udHlwZSA9CisgICAgICAoT3BlcmFuZFR5cGUpKFRZUEVfRFVQMCArIG9wZXJhbmRNYXBwaW5nW29wZXJhbmRJbmRleF0pOworICAgICsrb3BlcmFuZEluZGV4OworICB9CisgIAorICBjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUgPSAoKk9wZXJhbmRzKVtvcGVyYW5kSW5kZXhdLlJlYy0+Z2V0TmFtZSgpOworICAKKyAgU3BlYy0+b3BlcmFuZHNbb3BlcmFuZEluZGV4XS5lbmNvZGluZyA9IGVuY29kaW5nRnJvbVN0cmluZyh0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzT3BTaXplUHJlZml4KTsKKyAgU3BlYy0+b3BlcmFuZHNbb3BlcmFuZEluZGV4XS50eXBlID0gdHlwZUZyb21TdHJpbmcodHlwZU5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNTU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNSRVhfV1ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc09wU2l6ZVByZWZpeCk7CisgIAorICArK29wZXJhbmRJbmRleDsKKyAgKytwaHlzaWNhbE9wZXJhbmRJbmRleDsKK30KKwordm9pZCBSZWNvZ25pemFibGVJbnN0cjo6ZW1pdEluc3RydWN0aW9uU3BlY2lmaWVyKERpc2Fzc2VtYmxlclRhYmxlcyAmdGFibGVzKSB7CisgIFNwZWMtPm5hbWUgICAgICAgPSBOYW1lOworICAgIAorICBpZiAoIVJlYy0+aXNTdWJDbGFzc09mKCJYODZJbnN0IikpCisgICAgcmV0dXJuOworICAKKyAgc3dpdGNoIChmaWx0ZXIoKSkgeworICBjYXNlIEZJTFRFUl9XRUFLOgorICAgIFNwZWMtPmZpbHRlcmVkID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgY2FzZSBGSUxURVJfU1RST05HOgorICAgIFNob3VsZEJlRW1pdHRlZCA9IGZhbHNlOworICAgIHJldHVybjsKKyAgY2FzZSBGSUxURVJfTk9STUFMOgorICAgIGJyZWFrOworICB9CisgIAorICBTcGVjLT5pbnNuQ29udGV4dCA9IGluc25Db250ZXh0KCk7CisgICAgCisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnN0cnVjdGlvbjo6T3BlcmFuZEluZm8+ICZPcGVyYW5kTGlzdCA9ICpPcGVyYW5kczsKKyAgCisgIHVuc2lnbmVkIG9wZXJhbmRJbmRleDsKKyAgdW5zaWduZWQgbnVtT3BlcmFuZHMgPSBPcGVyYW5kTGlzdC5zaXplKCk7CisgIHVuc2lnbmVkIG51bVBoeXNpY2FsT3BlcmFuZHMgPSAwOworICAKKyAgLy8gb3BlcmFuZE1hcHBpbmcgbWFwcyBmcm9tIG9wZXJhbmRzIGluIE9wZXJhbmRMaXN0IHRvIHRoZWlyIG9yaWdpbmFscy4KKyAgLy8gSWYgb3BlcmFuZE1hcHBpbmdbaV0gIT0gaSwgdGhlbiB0aGUgZW50cnkgaXMgYSBkdXBsaWNhdGUuCisgIHVuc2lnbmVkIG9wZXJhbmRNYXBwaW5nW1g4Nl9NQVhfT1BFUkFORFNdOworICAKKyAgYm9vbCBoYXNGUk9wZXJhbmRzID0gZmFsc2U7CisgIAorICBhc3NlcnQobnVtT3BlcmFuZHMgPCBYODZfTUFYX09QRVJBTkRTICYmICJYODZfTUFYX09QRVJBTkRTIGlzIG5vdCBsYXJnZSBlbm91Z2giKTsKKyAgCisgIGZvciAob3BlcmFuZEluZGV4ID0gMDsgb3BlcmFuZEluZGV4IDwgbnVtT3BlcmFuZHM7ICsrb3BlcmFuZEluZGV4KSB7CisgICAgaWYgKE9wZXJhbmRMaXN0W29wZXJhbmRJbmRleF0uQ29uc3RyYWludHMuc2l6ZSgpKSB7CisgICAgICBjb25zdCBDb2RlR2VuSW5zdHJ1Y3Rpb246OkNvbnN0cmFpbnRJbmZvICZDb25zdHJhaW50ID0KKyAgICAgICAgT3BlcmFuZExpc3Rbb3BlcmFuZEluZGV4XS5Db25zdHJhaW50c1swXTsKKyAgICAgIGlmIChDb25zdHJhaW50LmlzVGllZCgpKSB7CisgICAgICAgIG9wZXJhbmRNYXBwaW5nW29wZXJhbmRJbmRleF0gPSBDb25zdHJhaW50LmdldFRpZWRPcGVyYW5kKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICArK251bVBoeXNpY2FsT3BlcmFuZHM7CisgICAgICAgIG9wZXJhbmRNYXBwaW5nW29wZXJhbmRJbmRleF0gPSBvcGVyYW5kSW5kZXg7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICsrbnVtUGh5c2ljYWxPcGVyYW5kczsKKyAgICAgIG9wZXJhbmRNYXBwaW5nW29wZXJhbmRJbmRleF0gPSBvcGVyYW5kSW5kZXg7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnJlY05hbWUgPSBPcGVyYW5kTGlzdFtvcGVyYW5kSW5kZXhdLlJlYy0+Z2V0TmFtZSgpOworCisgICAgaWYgKHJlY05hbWUuZmluZCgiRlIiKSAhPSByZWNOYW1lLm5wb3MpCisgICAgICBoYXNGUk9wZXJhbmRzID0gdHJ1ZTsKKyAgfQorICAKKyAgaWYgKGhhc0ZST3BlcmFuZHMgJiYgTmFtZS5maW5kKCJNT1YiKSAhPSBOYW1lLm5wb3MgJiYKKyAgICAgKChOYW1lLmZpbmQoIjIiKSAhPSBOYW1lLm5wb3MgJiYgTmFtZS5maW5kKCIzMiIpID09IE5hbWUubnBvcykgfHwKKyAgICAgIChOYW1lLmZpbmQoInRvIikgIT0gTmFtZS5ucG9zKSkpCisgICAgU2hvdWxkQmVFbWl0dGVkID0gZmFsc2U7CisgIAorICBpZiAoIVNob3VsZEJlRW1pdHRlZCkKKyAgICByZXR1cm47CisKKyNkZWZpbmUgSEFORExFX09QRVJBTkQoY2xhc3MpICAgICAgICAgICAgICAgXAorICBoYW5kbGVPcGVyYW5kKGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb3BlcmFuZEluZGV4LCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbE9wZXJhbmRJbmRleCwgICAgICAgXAorICAgICAgICAgICAgICAgIG51bVBoeXNpY2FsT3BlcmFuZHMsICAgICAgICBcCisgICAgICAgICAgICAgICAgb3BlcmFuZE1hcHBpbmcsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjbGFzcyMjRW5jb2RpbmdGcm9tU3RyaW5nKTsKKyAgCisjZGVmaW5lIEhBTkRMRV9PUFRJT05BTChjbGFzcykgICAgICAgICAgICAgIFwKKyAgaGFuZGxlT3BlcmFuZCh0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9wZXJhbmRJbmRleCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcGh5c2ljYWxPcGVyYW5kSW5kZXgsICAgICAgIFwKKyAgICAgICAgICAgICAgICBudW1QaHlzaWNhbE9wZXJhbmRzLCAgICAgICAgXAorICAgICAgICAgICAgICAgIG9wZXJhbmRNYXBwaW5nLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY2xhc3MjI0VuY29kaW5nRnJvbVN0cmluZyk7CisgIAorICAvLyBvcGVyYW5kSW5kZXggc2hvdWxkIGFsd2F5cyBiZSA8IG51bU9wZXJhbmRzCisgIG9wZXJhbmRJbmRleCA9IDA7CisgIC8vIHBoeXNpY2FsT3BlcmFuZEluZGV4IHNob3VsZCBhbHdheXMgYmUgPCBudW1QaHlzaWNhbE9wZXJhbmRzCisgIHVuc2lnbmVkIHBoeXNpY2FsT3BlcmFuZEluZGV4ID0gMDsKKyAgICAKKyAgc3dpdGNoIChGb3JtKSB7CisgIGNhc2UgWDg2TG9jYWw6OlJhd0ZybToKKyAgICAvLyBPcGVyYW5kIDEgKG9wdGlvbmFsKSBpcyBhbiBhZGRyZXNzIG9yIGltbWVkaWF0ZS4KKyAgICAvLyBPcGVyYW5kIDIgKG9wdGlvbmFsKSBpcyBhbiBpbW1lZGlhdGUuCisgICAgYXNzZXJ0KG51bVBoeXNpY2FsT3BlcmFuZHMgPD0gMiAmJiAKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIG9wZXJhbmRzIGZvciBSYXdGcm0iKTsKKyAgICBIQU5ETEVfT1BUSU9OQUwocmVsb2NhdGlvbikKKyAgICBIQU5ETEVfT1BUSU9OQUwoaW1tZWRpYXRlKQorICAgIGJyZWFrOworICBjYXNlIFg4NkxvY2FsOjpBZGRSZWdGcm06CisgICAgLy8gT3BlcmFuZCAxIGlzIGFkZGVkIHRvIHRoZSBvcGNvZGUuCisgICAgLy8gT3BlcmFuZCAyIChvcHRpb25hbCkgaXMgYW4gYWRkcmVzcy4KKyAgICBhc3NlcnQobnVtUGh5c2ljYWxPcGVyYW5kcyA+PSAxICYmIG51bVBoeXNpY2FsT3BlcmFuZHMgPD0gMiAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBudW1iZXIgb2Ygb3BlcmFuZHMgZm9yIEFkZFJlZ0ZybSIpOworICAgIEhBTkRMRV9PUEVSQU5EKG9wY29kZU1vZGlmaWVyKQorICAgIEhBTkRMRV9PUFRJT05BTChyZWxvY2F0aW9uKQorICAgIGJyZWFrOworICBjYXNlIFg4NkxvY2FsOjpNUk1EZXN0UmVnOgorICAgIC8vIE9wZXJhbmQgMSBpcyBhIHJlZ2lzdGVyIG9wZXJhbmQgaW4gdGhlIFIvTSBmaWVsZC4KKyAgICAvLyBPcGVyYW5kIDIgaXMgYSByZWdpc3RlciBvcGVyYW5kIGluIHRoZSBSZWcvT3Bjb2RlIGZpZWxkLgorICAgIC8vIE9wZXJhbmQgMyAob3B0aW9uYWwpIGlzIGFuIGltbWVkaWF0ZS4KKyAgICBhc3NlcnQobnVtUGh5c2ljYWxPcGVyYW5kcyA+PSAyICYmIG51bVBoeXNpY2FsT3BlcmFuZHMgPD0gMyAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBudW1iZXIgb2Ygb3BlcmFuZHMgZm9yIE1STURlc3RSZWdGcm0iKTsKKyAgICBIQU5ETEVfT1BFUkFORChybVJlZ2lzdGVyKQorICAgIEhBTkRMRV9PUEVSQU5EKHJvUmVnaXN0ZXIpCisgICAgSEFORExFX09QVElPTkFMKGltbWVkaWF0ZSkKKyAgICBicmVhazsKKyAgY2FzZSBYODZMb2NhbDo6TVJNRGVzdE1lbToKKyAgICAvLyBPcGVyYW5kIDEgaXMgYSBtZW1vcnkgb3BlcmFuZCAocG9zc2libHkgU0lCLWV4dGVuZGVkKQorICAgIC8vIE9wZXJhbmQgMiBpcyBhIHJlZ2lzdGVyIG9wZXJhbmQgaW4gdGhlIFJlZy9PcGNvZGUgZmllbGQuCisgICAgLy8gT3BlcmFuZCAzIChvcHRpb25hbCkgaXMgYW4gaW1tZWRpYXRlLgorICAgIGFzc2VydChudW1QaHlzaWNhbE9wZXJhbmRzID49IDIgJiYgbnVtUGh5c2ljYWxPcGVyYW5kcyA8PSAzICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkIG51bWJlciBvZiBvcGVyYW5kcyBmb3IgTVJNRGVzdE1lbUZybSIpOworICAgIEhBTkRMRV9PUEVSQU5EKG1lbW9yeSkKKyAgICBIQU5ETEVfT1BFUkFORChyb1JlZ2lzdGVyKQorICAgIEhBTkRMRV9PUFRJT05BTChpbW1lZGlhdGUpCisgICAgYnJlYWs7CisgIGNhc2UgWDg2TG9jYWw6Ok1STVNyY1JlZzoKKyAgICAvLyBPcGVyYW5kIDEgaXMgYSByZWdpc3RlciBvcGVyYW5kIGluIHRoZSBSZWcvT3Bjb2RlIGZpZWxkLgorICAgIC8vIE9wZXJhbmQgMiBpcyBhIHJlZ2lzdGVyIG9wZXJhbmQgaW4gdGhlIFIvTSBmaWVsZC4KKyAgICAvLyBPcGVyYW5kIDMgKG9wdGlvbmFsKSBpcyBhbiBpbW1lZGlhdGUuCisgICAgYXNzZXJ0KG51bVBoeXNpY2FsT3BlcmFuZHMgPj0gMiAmJiBudW1QaHlzaWNhbE9wZXJhbmRzIDw9IDMgJiYKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIG9wZXJhbmRzIGZvciBNUk1TcmNSZWdGcm0iKTsKKyAgICBIQU5ETEVfT1BFUkFORChyb1JlZ2lzdGVyKQorICAgIEhBTkRMRV9PUEVSQU5EKHJtUmVnaXN0ZXIpCisKKyAgICBpZiAoSGFzVkVYXzRWUHJlZml4KQorICAgICAgLy8gRklYTUU6IEluIEFWWCwgdGhlIHJlZ2lzdGVyIGJlbG93IGJlY29tZXMgdGhlIG9uZSBlbmNvZGVkCisgICAgICAvLyBpbiBNb2RSTVZFWCBhbmQgdGhlIG9uZSBhYm92ZSB0aGUgb25lIGluIHRoZSBWRVguVlZWViBmaWVsZAorICAgICAgSEFORExFX09QVElPTkFMKHJtUmVnaXN0ZXIpCisgICAgZWxzZQorICAgICAgSEFORExFX09QVElPTkFMKGltbWVkaWF0ZSkKKyAgICBicmVhazsKKyAgY2FzZSBYODZMb2NhbDo6TVJNU3JjTWVtOgorICAgIC8vIE9wZXJhbmQgMSBpcyBhIHJlZ2lzdGVyIG9wZXJhbmQgaW4gdGhlIFJlZy9PcGNvZGUgZmllbGQuCisgICAgLy8gT3BlcmFuZCAyIGlzIGEgbWVtb3J5IG9wZXJhbmQgKHBvc3NpYmx5IFNJQi1leHRlbmRlZCkKKyAgICAvLyBPcGVyYW5kIDMgKG9wdGlvbmFsKSBpcyBhbiBpbW1lZGlhdGUuCisgICAgYXNzZXJ0KG51bVBoeXNpY2FsT3BlcmFuZHMgPj0gMiAmJiBudW1QaHlzaWNhbE9wZXJhbmRzIDw9IDMgJiYKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIG9wZXJhbmRzIGZvciBNUk1TcmNNZW1Gcm0iKTsKKyAgICBIQU5ETEVfT1BFUkFORChyb1JlZ2lzdGVyKQorCisgICAgaWYgKEhhc1ZFWF80VlByZWZpeCkKKyAgICAgIC8vIEZJWE1FOiBJbiBBVlgsIHRoZSByZWdpc3RlciBiZWxvdyBiZWNvbWVzIHRoZSBvbmUgZW5jb2RlZAorICAgICAgLy8gaW4gTW9kUk1WRVggYW5kIHRoZSBvbmUgYWJvdmUgdGhlIG9uZSBpbiB0aGUgVkVYLlZWVlYgZmllbGQKKyAgICAgIEhBTkRMRV9PUFRJT05BTChybVJlZ2lzdGVyKQorCisgICAgSEFORExFX09QRVJBTkQobWVtb3J5KQorICAgIEhBTkRMRV9PUFRJT05BTChpbW1lZGlhdGUpCisgICAgYnJlYWs7CisgIGNhc2UgWDg2TG9jYWw6Ok1STTByOgorICBjYXNlIFg4NkxvY2FsOjpNUk0xcjoKKyAgY2FzZSBYODZMb2NhbDo6TVJNMnI6CisgIGNhc2UgWDg2TG9jYWw6Ok1STTNyOgorICBjYXNlIFg4NkxvY2FsOjpNUk00cjoKKyAgY2FzZSBYODZMb2NhbDo6TVJNNXI6CisgIGNhc2UgWDg2TG9jYWw6Ok1STTZyOgorICBjYXNlIFg4NkxvY2FsOjpNUk03cjoKKyAgICAvLyBPcGVyYW5kIDEgaXMgYSByZWdpc3RlciBvcGVyYW5kIGluIHRoZSBSL00gZmllbGQuCisgICAgLy8gT3BlcmFuZCAyIChvcHRpb25hbCkgaXMgYW4gaW1tZWRpYXRlIG9yIHJlbG9jYXRpb24uCisgICAgYXNzZXJ0KG51bVBoeXNpY2FsT3BlcmFuZHMgPD0gMiAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBudW1iZXIgb2Ygb3BlcmFuZHMgZm9yIE1STW5SRnJtIik7CisgICAgSEFORExFX09QVElPTkFMKHJtUmVnaXN0ZXIpCisgICAgSEFORExFX09QVElPTkFMKHJlbG9jYXRpb24pCisgICAgYnJlYWs7CisgIGNhc2UgWDg2TG9jYWw6Ok1STTBtOgorICBjYXNlIFg4NkxvY2FsOjpNUk0xbToKKyAgY2FzZSBYODZMb2NhbDo6TVJNMm06CisgIGNhc2UgWDg2TG9jYWw6Ok1STTNtOgorICBjYXNlIFg4NkxvY2FsOjpNUk00bToKKyAgY2FzZSBYODZMb2NhbDo6TVJNNW06CisgIGNhc2UgWDg2TG9jYWw6Ok1STTZtOgorICBjYXNlIFg4NkxvY2FsOjpNUk03bToKKyAgICAvLyBPcGVyYW5kIDEgaXMgYSBtZW1vcnkgb3BlcmFuZCAocG9zc2libHkgU0lCLWV4dGVuZGVkKQorICAgIC8vIE9wZXJhbmQgMiAob3B0aW9uYWwpIGlzIGFuIGltbWVkaWF0ZSBvciByZWxvY2F0aW9uLgorICAgIGFzc2VydChudW1QaHlzaWNhbE9wZXJhbmRzID49IDEgJiYgbnVtUGh5c2ljYWxPcGVyYW5kcyA8PSAyICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkIG51bWJlciBvZiBvcGVyYW5kcyBmb3IgTVJNbk1Gcm0iKTsKKyAgICBIQU5ETEVfT1BFUkFORChtZW1vcnkpCisgICAgSEFORExFX09QVElPTkFMKHJlbG9jYXRpb24pCisgICAgYnJlYWs7CisgIGNhc2UgWDg2TG9jYWw6Ok1STUluaXRSZWc6CisgICAgLy8gSWdub3JlZC4KKyAgICBicmVhazsKKyAgfQorICAKKyAgI3VuZGVmIEhBTkRMRV9PUEVSQU5ECisgICN1bmRlZiBIQU5ETEVfT1BUSU9OQUwKK30KKwordm9pZCBSZWNvZ25pemFibGVJbnN0cjo6ZW1pdERlY29kZVBhdGgoRGlzYXNzZW1ibGVyVGFibGVzICZ0YWJsZXMpIGNvbnN0IHsKKyAgLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSB0aGUgTExWTSB0YWJsZXMgYXJlIG5vdCBjb21wbGV0ZQorCisjZGVmaW5lIE1BUChmcm9tLCB0bykgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgWDg2TG9jYWw6Ok1STV8jI2Zyb206ICAgICAgICAgICAgICBcCisgICAgZmlsdGVyID0gbmV3IEV4YWN0RmlsdGVyKDB4IyNmcm9tKTsgICBcCisgICAgYnJlYWs7CisKKyAgT3Bjb2RlVHlwZSAgICBvcGNvZGVUeXBlICA9IChPcGNvZGVUeXBlKS0xOworICAKKyAgTW9kUk1GaWx0ZXIqICBmaWx0ZXIgICAgICA9IE5VTEw7IAorICB1aW50OF90ICAgICAgIG9wY29kZVRvU2V0ID0gMDsKKworICBzd2l0Y2ggKFByZWZpeCkgeworICAvLyBFeHRlbmRlZCB0d28tYnl0ZSBvcGNvZGVzIGNhbiBzdGFydCB3aXRoIGYyIDBmLCBmMyAwZiwgb3IgMGYKKyAgY2FzZSBYODZMb2NhbDo6WEQ6CisgIGNhc2UgWDg2TG9jYWw6OlhTOgorICBjYXNlIFg4NkxvY2FsOjpUQjoKKyAgICBvcGNvZGVUeXBlID0gVFdPQllURTsKKworICAgIHN3aXRjaCAoT3Bjb2RlKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChuZWVkc01vZFJNRm9yRGVjb2RlKEZvcm0pKQorICAgICAgICBmaWx0ZXIgPSBuZXcgTW9kRmlsdGVyKGlzUmVnRm9ybWF0KEZvcm0pKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZmlsdGVyID0gbmV3IER1bWJGaWx0ZXIoKTsKKyAgICAgIGJyZWFrOworI2RlZmluZSBFWFRFTlNJT05fVEFCTEUobikgY2FzZSAweCMjbjoKKyAgICBUV09fQllURV9FWFRFTlNJT05fVEFCTEVTCisjdW5kZWYgRVhURU5TSU9OX1RBQkxFCisgICAgICBzd2l0Y2ggKEZvcm0pIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCB0d28tYnl0ZSBleHRlbmRlZCBvcGNvZGUiKTsKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTByOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNMXI6CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk0ycjoKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTNyOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNNHI6CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk01cjoKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTZyOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNN3I6CisgICAgICAgIGZpbHRlciA9IG5ldyBFeHRlbmRlZEZpbHRlcih0cnVlLCBGb3JtIC0gWDg2TG9jYWw6Ok1STTByKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk0wbToKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTFtOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNMm06CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk0zbToKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTRtOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNNW06CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk02bToKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTdtOgorICAgICAgICBmaWx0ZXIgPSBuZXcgRXh0ZW5kZWRGaWx0ZXIoZmFsc2UsIEZvcm0gLSBYODZMb2NhbDo6TVJNMG0pOworICAgICAgICBicmVhazsKKyAgICAgIE1STV9NQVBQSU5HCisgICAgICB9IC8vIHN3aXRjaCAoRm9ybSkKKyAgICAgIGJyZWFrOworICAgIH0gLy8gc3dpdGNoIChPcGNvZGUpCisgICAgb3Bjb2RlVG9TZXQgPSBPcGNvZGU7CisgICAgYnJlYWs7CisgIGNhc2UgWDg2TG9jYWw6OlQ4OgorICAgIG9wY29kZVR5cGUgPSBUSFJFRUJZVEVfMzg7CisgICAgaWYgKG5lZWRzTW9kUk1Gb3JEZWNvZGUoRm9ybSkpCisgICAgICBmaWx0ZXIgPSBuZXcgTW9kRmlsdGVyKGlzUmVnRm9ybWF0KEZvcm0pKTsKKyAgICBlbHNlCisgICAgICBmaWx0ZXIgPSBuZXcgRHVtYkZpbHRlcigpOworICAgIG9wY29kZVRvU2V0ID0gT3Bjb2RlOworICAgIGJyZWFrOworICBjYXNlIFg4NkxvY2FsOjpQX1RBOgorICAgIG9wY29kZVR5cGUgPSBUSFJFRUJZVEVfM0E7CisgICAgaWYgKG5lZWRzTW9kUk1Gb3JEZWNvZGUoRm9ybSkpCisgICAgICBmaWx0ZXIgPSBuZXcgTW9kRmlsdGVyKGlzUmVnRm9ybWF0KEZvcm0pKTsKKyAgICBlbHNlCisgICAgICBmaWx0ZXIgPSBuZXcgRHVtYkZpbHRlcigpOworICAgIG9wY29kZVRvU2V0ID0gT3Bjb2RlOworICAgIGJyZWFrOworICBjYXNlIFg4NkxvY2FsOjpEODoKKyAgY2FzZSBYODZMb2NhbDo6RDk6CisgIGNhc2UgWDg2TG9jYWw6OkRBOgorICBjYXNlIFg4NkxvY2FsOjpEQjoKKyAgY2FzZSBYODZMb2NhbDo6REM6CisgIGNhc2UgWDg2TG9jYWw6OkREOgorICBjYXNlIFg4NkxvY2FsOjpERToKKyAgY2FzZSBYODZMb2NhbDo6REY6CisgICAgYXNzZXJ0KE9wY29kZSA+PSAweGMwICYmICJVbmV4cGVjdGVkIG9wY29kZSBmb3IgYW4gZXNjYXBlIG9wY29kZSIpOworICAgIG9wY29kZVR5cGUgPSBPTkVCWVRFOworICAgIGlmIChGb3JtID09IFg4NkxvY2FsOjpBZGRSZWdGcm0pIHsKKyAgICAgIFNwZWMtPm1vZGlmaWVyVHlwZSA9IE1PRElGSUVSX01PRFJNOworICAgICAgU3BlYy0+bW9kaWZpZXJCYXNlID0gT3Bjb2RlOworICAgICAgZmlsdGVyID0gbmV3IEFkZFJlZ0VzY2FwZUZpbHRlcihPcGNvZGUpOworICAgIH0gZWxzZSB7CisgICAgICBmaWx0ZXIgPSBuZXcgRXNjYXBlRmlsdGVyKHRydWUsIE9wY29kZSk7CisgICAgfQorICAgIG9wY29kZVRvU2V0ID0gMHhkOCArIChQcmVmaXggLSBYODZMb2NhbDo6RDgpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIG9wY29kZVR5cGUgPSBPTkVCWVRFOworICAgIHN3aXRjaCAoT3Bjb2RlKSB7CisjZGVmaW5lIEVYVEVOU0lPTl9UQUJMRShuKSBjYXNlIDB4IyNuOgorICAgIE9ORV9CWVRFX0VYVEVOU0lPTl9UQUJMRVMKKyN1bmRlZiBFWFRFTlNJT05fVEFCTEUKKyAgICAgIHN3aXRjaCAoRm9ybSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiRmVsbCB0aHJvdWdoIHRoZSBjcmFja3Mgb2YgYSBzaW5nbGUtYnl0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuZGVkIG9wY29kZSIpOworICAgICAgY2FzZSBYODZMb2NhbDo6TVJNMHI6CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk0xcjoKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTJyOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNM3I6CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk00cjoKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTVyOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNNnI6CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk03cjoKKyAgICAgICAgZmlsdGVyID0gbmV3IEV4dGVuZGVkRmlsdGVyKHRydWUsIEZvcm0gLSBYODZMb2NhbDo6TVJNMHIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTBtOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNMW06CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk0ybToKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTNtOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNNG06CisgICAgICBjYXNlIFg4NkxvY2FsOjpNUk01bToKKyAgICAgIGNhc2UgWDg2TG9jYWw6Ok1STTZtOgorICAgICAgY2FzZSBYODZMb2NhbDo6TVJNN206CisgICAgICAgIGZpbHRlciA9IG5ldyBFeHRlbmRlZEZpbHRlcihmYWxzZSwgRm9ybSAtIFg4NkxvY2FsOjpNUk0wbSk7CisgICAgICAgIGJyZWFrOworICAgICAgTVJNX01BUFBJTkcKKyAgICAgIH0gLy8gc3dpdGNoIChGb3JtKQorICAgICAgYnJlYWs7CisgICAgY2FzZSAweGQ4OgorICAgIGNhc2UgMHhkOToKKyAgICBjYXNlIDB4ZGE6CisgICAgY2FzZSAweGRiOgorICAgIGNhc2UgMHhkYzoKKyAgICBjYXNlIDB4ZGQ6CisgICAgY2FzZSAweGRlOgorICAgIGNhc2UgMHhkZjoKKyAgICAgIGZpbHRlciA9IG5ldyBFc2NhcGVGaWx0ZXIoZmFsc2UsIEZvcm0gLSBYODZMb2NhbDo6TVJNMG0pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChuZWVkc01vZFJNRm9yRGVjb2RlKEZvcm0pKQorICAgICAgICBmaWx0ZXIgPSBuZXcgTW9kRmlsdGVyKGlzUmVnRm9ybWF0KEZvcm0pKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZmlsdGVyID0gbmV3IER1bWJGaWx0ZXIoKTsKKyAgICAgIGJyZWFrOworICAgIH0gLy8gc3dpdGNoIChPcGNvZGUpCisgICAgb3Bjb2RlVG9TZXQgPSBPcGNvZGU7CisgIH0gLy8gc3dpdGNoIChQcmVmaXgpCisKKyAgYXNzZXJ0KG9wY29kZVR5cGUgIT0gKE9wY29kZVR5cGUpLTEgJiYKKyAgICAgICAgICJPcGNvZGUgdHlwZSBub3Qgc2V0Iik7CisgIGFzc2VydChmaWx0ZXIgJiYgIkZpbHRlciBub3Qgc2V0Iik7CisKKyAgaWYgKEZvcm0gPT0gWDg2TG9jYWw6OkFkZFJlZ0ZybSkgeworICAgIGlmKFNwZWMtPm1vZGlmaWVyVHlwZSAhPSBNT0RJRklFUl9NT0RSTSkgeworICAgICAgYXNzZXJ0KG9wY29kZVRvU2V0IDwgMHhmOSAmJgorICAgICAgICAgICAgICJOb3QgZW5vdWdoIHJvb20gZm9yIGFsbCBBRERSRUdfRlJNIG9wZXJhbmRzIik7CisgICAgCisgICAgICB1aW50OF90IGN1cnJlbnRPcGNvZGU7CisKKyAgICAgIGZvciAoY3VycmVudE9wY29kZSA9IG9wY29kZVRvU2V0OworICAgICAgICAgICBjdXJyZW50T3Bjb2RlIDwgb3Bjb2RlVG9TZXQgKyA4OworICAgICAgICAgICArK2N1cnJlbnRPcGNvZGUpCisgICAgICAgIHRhYmxlcy5zZXRUYWJsZUZpZWxkcyhvcGNvZGVUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc25Db250ZXh0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wY29kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmlsdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJRCk7CisgICAgCisgICAgICBTcGVjLT5tb2RpZmllclR5cGUgPSBNT0RJRklFUl9PUENPREU7CisgICAgICBTcGVjLT5tb2RpZmllckJhc2UgPSBvcGNvZGVUb1NldDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gbW9kaWZpZXJCYXNlIHdhcyBzZXQgd2hlcmUgTU9ESUZJRVJfTU9EUk0gd2FzIHNldAorICAgICAgdGFibGVzLnNldFRhYmxlRmllbGRzKG9wY29kZVR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc25Db250ZXh0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZVRvU2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmlsdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0YWJsZXMuc2V0VGFibGVGaWVsZHMob3Bjb2RlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zbkNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICpmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJRCk7CisgICAgCisgICAgU3BlYy0+bW9kaWZpZXJUeXBlID0gTU9ESUZJRVJfTk9ORTsKKyAgICBTcGVjLT5tb2RpZmllckJhc2UgPSBvcGNvZGVUb1NldDsKKyAgfQorICAKKyAgZGVsZXRlIGZpbHRlcjsKKyAgCisjdW5kZWYgTUFQCit9CisKKyNkZWZpbmUgVFlQRShzdHIsIHR5cGUpIGlmIChzID09IHN0cikgcmV0dXJuIHR5cGU7CitPcGVyYW5kVHlwZSBSZWNvZ25pemFibGVJbnN0cjo6dHlwZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc1JFWF9XUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzT3BTaXplUHJlZml4KSB7CisgIGlmIChpc1NTRSkgeworICAgIC8vIEZvciBTU0UgaW5zdHJ1Y3Rpb25zLCB3ZSBpZ25vcmUgdGhlIE9wU2l6ZSBwcmVmaXggYW5kIGZvcmNlIG9wZXJhbmQgCisgICAgLy8gc2l6ZXMuCisgICAgVFlQRSgiR1IxNiIsICAgICAgICAgICAgICBUWVBFX1IxNikKKyAgICBUWVBFKCJHUjMyIiwgICAgICAgICAgICAgIFRZUEVfUjMyKQorICAgIFRZUEUoIkdSNjQiLCAgICAgICAgICAgICAgVFlQRV9SNjQpCisgIH0KKyAgaWYoaGFzUkVYX1dQcmVmaXgpIHsKKyAgICAvLyBGb3IgaW5zdHJ1Y3Rpb25zIHdpdGggYSBSRVhfVyBwcmVmaXgsIGEgZGVjbGFyZWQgMzItYml0IHJlZ2lzdGVyIGVuY29kaW5nCisgICAgLy8gaXMgc3BlY2lhbC4KKyAgICBUWVBFKCJHUjMyIiwgICAgICAgICAgICAgIFRZUEVfUjMyKQorICB9CisgIGlmKCFoYXNPcFNpemVQcmVmaXgpIHsKKyAgICAvLyBGb3IgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYW4gT3BTaXplIHByZWZpeCwgYSBkZWNsYXJlZCAxNi1iaXQgcmVnaXN0ZXIgb3IKKyAgICAvLyBpbW1lZGlhdGUgZW5jb2RpbmcgaXMgc3BlY2lhbC4KKyAgICBUWVBFKCJHUjE2IiwgICAgICAgICAgICAgIFRZUEVfUjE2KQorICAgIFRZUEUoImkxNmltbSIsICAgICAgICAgICAgVFlQRV9JTU0xNikKKyAgfQorICBUWVBFKCJpMTZtZW0iLCAgICAgICAgICAgICAgVFlQRV9NdikKKyAgVFlQRSgiaTE2aW1tIiwgICAgICAgICAgICAgIFRZUEVfSU1NdikKKyAgVFlQRSgiaTE2aThpbW0iLCAgICAgICAgICAgIFRZUEVfSU1NdikKKyAgVFlQRSgiR1IxNiIsICAgICAgICAgICAgICAgIFRZUEVfUnYpCisgIFRZUEUoImkzMm1lbSIsICAgICAgICAgICAgICBUWVBFX012KQorICBUWVBFKCJpMzJpbW0iLCAgICAgICAgICAgICAgVFlQRV9JTU12KQorICBUWVBFKCJpMzJpOGltbSIsICAgICAgICAgICAgVFlQRV9JTU0zMikKKyAgVFlQRSgiR1IzMiIsICAgICAgICAgICAgICAgIFRZUEVfUnYpCisgIFRZUEUoImk2NG1lbSIsICAgICAgICAgICAgICBUWVBFX012KQorICBUWVBFKCJpNjRpMzJpbW0iLCAgICAgICAgICAgVFlQRV9JTU02NCkKKyAgVFlQRSgiaTY0aThpbW0iLCAgICAgICAgICAgIFRZUEVfSU1NNjQpCisgIFRZUEUoIkdSNjQiLCAgICAgICAgICAgICAgICBUWVBFX1I2NCkKKyAgVFlQRSgiaThtZW0iLCAgICAgICAgICAgICAgIFRZUEVfTTgpCisgIFRZUEUoImk4aW1tIiwgICAgICAgICAgICAgICBUWVBFX0lNTTgpCisgIFRZUEUoIkdSOCIsICAgICAgICAgICAgICAgICBUWVBFX1I4KQorICBUWVBFKCJWUjEyOCIsICAgICAgICAgICAgICAgVFlQRV9YTU0xMjgpCisgIFRZUEUoImYxMjhtZW0iLCAgICAgICAgICAgICBUWVBFX00xMjgpCisgIFRZUEUoIkZSNjQiLCAgICAgICAgICAgICAgICBUWVBFX1hNTTY0KQorICBUWVBFKCJmNjRtZW0iLCAgICAgICAgICAgICAgVFlQRV9NNjRGUCkKKyAgVFlQRSgiRlIzMiIsICAgICAgICAgICAgICAgIFRZUEVfWE1NMzIpCisgIFRZUEUoImYzMm1lbSIsICAgICAgICAgICAgICBUWVBFX00zMkZQKQorICBUWVBFKCJSU1QiLCAgICAgICAgICAgICAgICAgVFlQRV9TVCkKKyAgVFlQRSgiaTEyOG1lbSIsICAgICAgICAgICAgIFRZUEVfTTEyOCkKKyAgVFlQRSgiaTY0aTMyaW1tX3BjcmVsIiwgICAgIFRZUEVfUkVMNjQpCisgIFRZUEUoImkxNmltbV9wY3JlbCIsICAgICAgICBUWVBFX1JFTDE2KQorICBUWVBFKCJpMzJpbW1fcGNyZWwiLCAgICAgICAgVFlQRV9SRUwzMikKKyAgVFlQRSgiU1NFQ0MiLCAgICAgICAgICAgICAgIFRZUEVfSU1NMykKKyAgVFlQRSgiYnJ0YXJnZXQiLCAgICAgICAgICAgIFRZUEVfUkVMdikKKyAgVFlQRSgiYnJ0YXJnZXQ4IiwgICAgICAgICAgIFRZUEVfUkVMOCkKKyAgVFlQRSgiZjgwbWVtIiwgICAgICAgICAgICAgIFRZUEVfTTgwRlApCisgIFRZUEUoImxlYTMybWVtIiwgICAgICAgICAgICBUWVBFX0xFQSkKKyAgVFlQRSgibGVhNjRfMzJtZW0iLCAgICAgICAgIFRZUEVfTEVBKQorICBUWVBFKCJsZWE2NG1lbSIsICAgICAgICAgICAgVFlQRV9MRUEpCisgIFRZUEUoIlZSNjQiLCAgICAgICAgICAgICAgICBUWVBFX01NNjQpCisgIFRZUEUoImk2NGltbSIsICAgICAgICAgICAgICBUWVBFX0lNTXYpCisgIFRZUEUoIm9wYXF1ZTMybWVtIiwgICAgICAgICBUWVBFX00xNjE2KQorICBUWVBFKCJvcGFxdWU0OG1lbSIsICAgICAgICAgVFlQRV9NMTYzMikKKyAgVFlQRSgib3BhcXVlODBtZW0iLCAgICAgICAgIFRZUEVfTTE2NjQpCisgIFRZUEUoIm9wYXF1ZTUxMm1lbSIsICAgICAgICBUWVBFX001MTIpCisgIFRZUEUoIlNFR01FTlRfUkVHIiwgICAgICAgICBUWVBFX1NFR01FTlRSRUcpCisgIFRZUEUoIkRFQlVHX1JFRyIsICAgICAgICAgICBUWVBFX0RFQlVHUkVHKQorICBUWVBFKCJDT05UUk9MX1JFRyIsICAgICAgICAgVFlQRV9DT05UUk9MUkVHKQorICBUWVBFKCJvZmZzZXQ4IiwgICAgICAgICAgICAgVFlQRV9NT0ZGUzgpCisgIFRZUEUoIm9mZnNldDE2IiwgICAgICAgICAgICBUWVBFX01PRkZTMTYpCisgIFRZUEUoIm9mZnNldDMyIiwgICAgICAgICAgICBUWVBFX01PRkZTMzIpCisgIFRZUEUoIm9mZnNldDY0IiwgICAgICAgICAgICBUWVBFX01PRkZTNjQpCisgIGVycnMoKSA8PCAiVW5oYW5kbGVkIHR5cGUgc3RyaW5nICIgPDwgcyA8PCAiXG4iOworICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgdHlwZSBzdHJpbmciKTsKK30KKyN1bmRlZiBUWVBFCisKKyNkZWZpbmUgRU5DT0RJTkcoc3RyLCBlbmNvZGluZykgaWYgKHMgPT0gc3RyKSByZXR1cm4gZW5jb2Rpbmc7CitPcGVyYW5kRW5jb2RpbmcgUmVjb2duaXphYmxlSW5zdHI6OmltbWVkaWF0ZUVuY29kaW5nRnJvbVN0cmluZworICAoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICBib29sIGhhc09wU2l6ZVByZWZpeCkgeworICBpZighaGFzT3BTaXplUHJlZml4KSB7CisgICAgLy8gRm9yIGluc3RydWN0aW9ucyB3aXRob3V0IGFuIE9wU2l6ZSBwcmVmaXgsIGEgZGVjbGFyZWQgMTYtYml0IHJlZ2lzdGVyIG9yCisgICAgLy8gaW1tZWRpYXRlIGVuY29kaW5nIGlzIHNwZWNpYWwuCisgICAgRU5DT0RJTkcoImkxNmltbSIsICAgICAgICBFTkNPRElOR19JVykKKyAgfQorICBFTkNPRElORygiaTMyaThpbW0iLCAgICAgICAgRU5DT0RJTkdfSUIpCisgIEVOQ09ESU5HKCJTU0VDQyIsICAgICAgICAgICBFTkNPRElOR19JQikKKyAgRU5DT0RJTkcoImkxNmltbSIsICAgICAgICAgIEVOQ09ESU5HX0l2KQorICBFTkNPRElORygiaTE2aThpbW0iLCAgICAgICAgRU5DT0RJTkdfSUIpCisgIEVOQ09ESU5HKCJpMzJpbW0iLCAgICAgICAgICBFTkNPRElOR19JdikKKyAgRU5DT0RJTkcoImk2NGkzMmltbSIsICAgICAgIEVOQ09ESU5HX0lEKQorICBFTkNPRElORygiaTY0aThpbW0iLCAgICAgICAgRU5DT0RJTkdfSUIpCisgIEVOQ09ESU5HKCJpOGltbSIsICAgICAgICAgICBFTkNPRElOR19JQikKKyAgZXJycygpIDw8ICJVbmhhbmRsZWQgaW1tZWRpYXRlIGVuY29kaW5nICIgPDwgcyA8PCAiXG4iOworICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgaW1tZWRpYXRlIGVuY29kaW5nIik7Cit9CisKK09wZXJhbmRFbmNvZGluZyBSZWNvZ25pemFibGVJbnN0cjo6cm1SZWdpc3RlckVuY29kaW5nRnJvbVN0cmluZworICAoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICBib29sIGhhc09wU2l6ZVByZWZpeCkgeworICBFTkNPRElORygiR1IxNiIsICAgICAgICAgICAgRU5DT0RJTkdfUk0pCisgIEVOQ09ESU5HKCJHUjMyIiwgICAgICAgICAgICBFTkNPRElOR19STSkKKyAgRU5DT0RJTkcoIkdSNjQiLCAgICAgICAgICAgIEVOQ09ESU5HX1JNKQorICBFTkNPRElORygiR1I4IiwgICAgICAgICAgICAgRU5DT0RJTkdfUk0pCisgIEVOQ09ESU5HKCJWUjEyOCIsICAgICAgICAgICBFTkNPRElOR19STSkKKyAgRU5DT0RJTkcoIkZSNjQiLCAgICAgICAgICAgIEVOQ09ESU5HX1JNKQorICBFTkNPRElORygiRlIzMiIsICAgICAgICAgICAgRU5DT0RJTkdfUk0pCisgIEVOQ09ESU5HKCJWUjY0IiwgICAgICAgICAgICBFTkNPRElOR19STSkKKyAgZXJycygpIDw8ICJVbmhhbmRsZWQgUi9NIHJlZ2lzdGVyIGVuY29kaW5nICIgPDwgcyA8PCAiXG4iOworICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgUi9NIHJlZ2lzdGVyIGVuY29kaW5nIik7Cit9CisKK09wZXJhbmRFbmNvZGluZyBSZWNvZ25pemFibGVJbnN0cjo6cm9SZWdpc3RlckVuY29kaW5nRnJvbVN0cmluZworICAoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICBib29sIGhhc09wU2l6ZVByZWZpeCkgeworICBFTkNPRElORygiR1IxNiIsICAgICAgICAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiR1IzMiIsICAgICAgICAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiR1I2NCIsICAgICAgICAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiR1I4IiwgICAgICAgICAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiVlIxMjgiLCAgICAgICAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiRlI2NCIsICAgICAgICAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiRlIzMiIsICAgICAgICAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiVlI2NCIsICAgICAgICAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiU0VHTUVOVF9SRUciLCAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiREVCVUdfUkVHIiwgICAgICAgRU5DT0RJTkdfUkVHKQorICBFTkNPRElORygiQ09OVFJPTF9SRUciLCAgICAgRU5DT0RJTkdfUkVHKQorICBlcnJzKCkgPDwgIlVuaGFuZGxlZCByZWcvb3Bjb2RlIHJlZ2lzdGVyIGVuY29kaW5nICIgPDwgcyA8PCAiXG4iOworICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgcmVnL29wY29kZSByZWdpc3RlciBlbmNvZGluZyIpOworfQorCitPcGVyYW5kRW5jb2RpbmcgUmVjb2duaXphYmxlSW5zdHI6Om1lbW9yeUVuY29kaW5nRnJvbVN0cmluZworICAoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICBib29sIGhhc09wU2l6ZVByZWZpeCkgeworICBFTkNPRElORygiaTE2bWVtIiwgICAgICAgICAgRU5DT0RJTkdfUk0pCisgIEVOQ09ESU5HKCJpMzJtZW0iLCAgICAgICAgICBFTkNPRElOR19STSkKKyAgRU5DT0RJTkcoImk2NG1lbSIsICAgICAgICAgIEVOQ09ESU5HX1JNKQorICBFTkNPRElORygiaThtZW0iLCAgICAgICAgICAgRU5DT0RJTkdfUk0pCisgIEVOQ09ESU5HKCJmMTI4bWVtIiwgICAgICAgICBFTkNPRElOR19STSkKKyAgRU5DT0RJTkcoImY2NG1lbSIsICAgICAgICAgIEVOQ09ESU5HX1JNKQorICBFTkNPRElORygiZjMybWVtIiwgICAgICAgICAgRU5DT0RJTkdfUk0pCisgIEVOQ09ESU5HKCJpMTI4bWVtIiwgICAgICAgICBFTkNPRElOR19STSkKKyAgRU5DT0RJTkcoImY4MG1lbSIsICAgICAgICAgIEVOQ09ESU5HX1JNKQorICBFTkNPRElORygibGVhMzJtZW0iLCAgICAgICAgRU5DT0RJTkdfUk0pCisgIEVOQ09ESU5HKCJsZWE2NF8zMm1lbSIsICAgICBFTkNPRElOR19STSkKKyAgRU5DT0RJTkcoImxlYTY0bWVtIiwgICAgICAgIEVOQ09ESU5HX1JNKQorICBFTkNPRElORygib3BhcXVlMzJtZW0iLCAgICAgRU5DT0RJTkdfUk0pCisgIEVOQ09ESU5HKCJvcGFxdWU0OG1lbSIsICAgICBFTkNPRElOR19STSkKKyAgRU5DT0RJTkcoIm9wYXF1ZTgwbWVtIiwgICAgIEVOQ09ESU5HX1JNKQorICBFTkNPRElORygib3BhcXVlNTEybWVtIiwgICAgRU5DT0RJTkdfUk0pCisgIGVycnMoKSA8PCAiVW5oYW5kbGVkIG1lbW9yeSBlbmNvZGluZyAiIDw8IHMgPDwgIlxuIjsKKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIG1lbW9yeSBlbmNvZGluZyIpOworfQorCitPcGVyYW5kRW5jb2RpbmcgUmVjb2duaXphYmxlSW5zdHI6OnJlbG9jYXRpb25FbmNvZGluZ0Zyb21TdHJpbmcKKyAgKGNvbnN0IHN0ZDo6c3RyaW5nICZzLAorICAgYm9vbCBoYXNPcFNpemVQcmVmaXgpIHsKKyAgaWYoIWhhc09wU2l6ZVByZWZpeCkgeworICAgIC8vIEZvciBpbnN0cnVjdGlvbnMgd2l0aG91dCBhbiBPcFNpemUgcHJlZml4LCBhIGRlY2xhcmVkIDE2LWJpdCByZWdpc3RlciBvcgorICAgIC8vIGltbWVkaWF0ZSBlbmNvZGluZyBpcyBzcGVjaWFsLgorICAgIEVOQ09ESU5HKCJpMTZpbW0iLCAgICAgICAgRU5DT0RJTkdfSVcpCisgIH0KKyAgRU5DT0RJTkcoImkxNmltbSIsICAgICAgICAgIEVOQ09ESU5HX0l2KQorICBFTkNPRElORygiaTE2aThpbW0iLCAgICAgICAgRU5DT0RJTkdfSUIpCisgIEVOQ09ESU5HKCJpMzJpbW0iLCAgICAgICAgICBFTkNPRElOR19JdikKKyAgRU5DT0RJTkcoImkzMmk4aW1tIiwgICAgICAgIEVOQ09ESU5HX0lCKQorICBFTkNPRElORygiaTY0aTMyaW1tIiwgICAgICAgRU5DT0RJTkdfSUQpCisgIEVOQ09ESU5HKCJpNjRpOGltbSIsICAgICAgICBFTkNPRElOR19JQikKKyAgRU5DT0RJTkcoImk4aW1tIiwgICAgICAgICAgIEVOQ09ESU5HX0lCKQorICBFTkNPRElORygiaTY0aTMyaW1tX3BjcmVsIiwgRU5DT0RJTkdfSUQpCisgIEVOQ09ESU5HKCJpMTZpbW1fcGNyZWwiLCAgICBFTkNPRElOR19JVykKKyAgRU5DT0RJTkcoImkzMmltbV9wY3JlbCIsICAgIEVOQ09ESU5HX0lEKQorICBFTkNPRElORygiYnJ0YXJnZXQiLCAgICAgICAgRU5DT0RJTkdfSXYpCisgIEVOQ09ESU5HKCJicnRhcmdldDgiLCAgICAgICBFTkNPRElOR19JQikKKyAgRU5DT0RJTkcoImk2NGltbSIsICAgICAgICAgIEVOQ09ESU5HX0lPKQorICBFTkNPRElORygib2Zmc2V0OCIsICAgICAgICAgRU5DT0RJTkdfSWEpCisgIEVOQ09ESU5HKCJvZmZzZXQxNiIsICAgICAgICBFTkNPRElOR19JYSkKKyAgRU5DT0RJTkcoIm9mZnNldDMyIiwgICAgICAgIEVOQ09ESU5HX0lhKQorICBFTkNPRElORygib2Zmc2V0NjQiLCAgICAgICAgRU5DT0RJTkdfSWEpCisgIGVycnMoKSA8PCAiVW5oYW5kbGVkIHJlbG9jYXRpb24gZW5jb2RpbmcgIiA8PCBzIDw8ICJcbiI7CisgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCByZWxvY2F0aW9uIGVuY29kaW5nIik7Cit9CisKK09wZXJhbmRFbmNvZGluZyBSZWNvZ25pemFibGVJbnN0cjo6b3Bjb2RlTW9kaWZpZXJFbmNvZGluZ0Zyb21TdHJpbmcKKyAgKGNvbnN0IHN0ZDo6c3RyaW5nICZzLAorICAgYm9vbCBoYXNPcFNpemVQcmVmaXgpIHsKKyAgRU5DT0RJTkcoIlJTVCIsICAgICAgICAgICAgIEVOQ09ESU5HX0kpCisgIEVOQ09ESU5HKCJHUjMyIiwgICAgICAgICAgICBFTkNPRElOR19SdikKKyAgRU5DT0RJTkcoIkdSNjQiLCAgICAgICAgICAgIEVOQ09ESU5HX1JPKQorICBFTkNPRElORygiR1IxNiIsICAgICAgICAgICAgRU5DT0RJTkdfUnYpCisgIEVOQ09ESU5HKCJHUjgiLCAgICAgICAgICAgICBFTkNPRElOR19SQikKKyAgZXJycygpIDw8ICJVbmhhbmRsZWQgb3Bjb2RlIG1vZGlmaWVyIGVuY29kaW5nICIgPDwgcyA8PCAiXG4iOworICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgb3Bjb2RlIG1vZGlmaWVyIGVuY29kaW5nIik7Cit9CisjdW5kZWYgRU5DT0RJTkcKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL1RhYmxlR2VuL1g4NlJlY29nbml6YWJsZUluc3RyLmggYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9YODZSZWNvZ25pemFibGVJbnN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNGQ5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9UYWJsZUdlbi9YODZSZWNvZ25pemFibGVJbnN0ci5oCkBAIC0wLDAgKzEsMjM5IEBACisvLz09PS0gWDg2UmVjb2duaXphYmxlSW5zdHIuaCAtIERpc2Fzc2VtYmxlciBpbnN0cnVjdGlvbiBzcGVjIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgWDg2IERpc2Fzc2VtYmxlciBFbWl0dGVyLgorLy8gSXQgY29udGFpbnMgdGhlIGludGVyZmFjZSBvZiBhIHNpbmdsZSByZWNvZ25pemFibGUgaW5zdHJ1Y3Rpb24uCisvLyBEb2N1bWVudGF0aW9uIGZvciB0aGUgZGlzYXNzZW1ibGVyIGVtaXR0ZXIgaW4gZ2VuZXJhbCBjYW4gYmUgZm91bmQgaW4KKy8vICBYODZEaXNhc2VtYmxlckVtaXR0ZXIuaC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFg4NlJFQ09HTklaQUJMRUlOU1RSX0gKKyNkZWZpbmUgWDg2UkVDT0dOSVpBQkxFSU5TVFJfSAorCisjaW5jbHVkZSAiWDg2RGlzYXNzZW1ibGVyVGFibGVzLmgiCisKKyNpbmNsdWRlICJDb2RlR2VuVGFyZ2V0LmgiCisjaW5jbHVkZSAiUmVjb3JkLmgiCisKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBYODZEaXNhc3NlbWJsZXIgeworCisvLy8gUmVjb2duaXphYmxlSW5zdHIgLSBFbmNhcHN1bGF0ZXMgYWxsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGRlY29kZSBhIHNpbmdsZQorLy8vICAgaW5zdHJ1Y3Rpb24sIGFzIGV4dHJhY3RlZCBmcm9tIHRoZSBMTFZNIGluc3RydWN0aW9uIHRhYmxlcy4gIEhhcyBtZXRob2RzCisvLy8gICB0byBpbnRlcnByZXQgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgTExWTSB0YWJsZXMsIGFuZCB0byBlbWl0IHRoZQorLy8vICAgaW5zdHJ1Y3Rpb24gaW50byBEaXNhc3NlbWJsZXJUYWJsZXMuCitjbGFzcyBSZWNvZ25pemFibGVJbnN0ciB7Citwcml2YXRlOgorICAvLy8gVGhlIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGFzIHVzZWQgaW4gYW4gTUNJbnN0CisgIEluc3RyVUlEIFVJRDsKKyAgLy8vIFRoZSByZWNvcmQgZnJvbSB0aGUgLnRkIGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpbnN0cnVjdGlvbgorICBjb25zdCBSZWNvcmQqIFJlYzsKKyAgLy8vIFRoZSBwcmVmaXggZmllbGQgZnJvbSB0aGUgcmVjb3JkCisgIHVpbnQ4X3QgUHJlZml4OworICAvLy8gVGhlIG9wY29kZSBmaWVsZCBmcm9tIHRoZSByZWNvcmQ7IHRoaXMgaXMgdGhlIG9wY29kZSB1c2VkIGluIHRoZSBJbnRlbAorICAvLy8gZW5jb2RpbmcgYW5kIHRoZXJlZm9yZSBkaXN0aW5jdCBmcm9tIHRoZSBVSUQKKyAgdWludDhfdCBPcGNvZGU7CisgIC8vLyBUaGUgZm9ybSBmaWVsZCBmcm9tIHRoZSByZWNvcmQKKyAgdWludDhfdCBGb3JtOworICAvLy8gVGhlIHNlZ21lbnQgb3ZlcnJpZGUgZmllbGQgZnJvbSB0aGUgcmVjb3JkCisgIHVpbnQ4X3QgU2VnT3ZyOworICAvLy8gVGhlIGhhc09wU2l6ZVByZWZpeCBmaWVsZCBmcm9tIHRoZSByZWNvcmQKKyAgYm9vbCBIYXNPcFNpemVQcmVmaXg7CisgIC8vLyBUaGUgaGFzUkVYX1dQcmVmaXggZmllbGQgZnJvbSB0aGUgcmVjb3JkCisgIGJvb2wgSGFzUkVYX1dQcmVmaXg7CisgIC8vLyBUaGUgaGFzVkVYXzRWUHJlZml4IGZpZWxkIGZyb20gdGhlIHJlY29yZAorICBib29sIEhhc1ZFWF80VlByZWZpeDsKKyAgLy8vIFRoZSBoYXNMb2NrUHJlZml4IGZpZWxkIGZyb20gdGhlIHJlY29yZAorICBib29sIEhhc0xvY2tQcmVmaXg7CisgIC8vLyBUaGUgaXNDb2RlR2VuT25seSBmaWxlZCBmcm9tIHRoZSByZWNvcmQKKyAgYm9vbCBJc0NvZGVHZW5Pbmx5OworICAKKyAgLy8vIFRoZSBpbnN0cnVjdGlvbiBuYW1lIGFzIGxpc3RlZCBpbiB0aGUgdGFibGVzCisgIHN0ZDo6c3RyaW5nIE5hbWU7CisgIC8vLyBUaGUgQVQmVCBBc21TdHJpbmcgZm9yIHRoZSBpbnN0cnVjdGlvbgorICBzdGQ6OnN0cmluZyBBc21TdHJpbmc7CisgIAorICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGlzIFNTRQorICBib29sIElzU1NFOworICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGhhcyBGUiBvcGVyYW5kcyAtIE1PVnMgd2l0aCBGUiBvcGVyYW5kcworICAvLy8gYXJlIHR5cGljYWxseSBpZ25vcmVkCisgIGJvb2wgSGFzRlJPcGVyYW5kczsKKyAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBzaG91bGQgYmUgZW1pdHRlZCBpbnRvIHRoZSBkZWNvZGUKKyAgLy8vIHRhYmxlczsgcmVnYXJkbGVzcywgaXQgd2lsbCBiZSBlbWl0dGVkIGludG8gdGhlIGluc3RydWN0aW9uIGluZm8gdGFibGUKKyAgYm9vbCBTaG91bGRCZUVtaXR0ZWQ7CisgIAorICAvLy8gVGhlIG9wZXJhbmRzIG9mIHRoZSBpbnN0cnVjdGlvbiwgYXMgbGlzdGVkIGluIHRoZSBDb2RlR2VuSW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGV5IGFyZSBub3Qgb25lLXRvLW9uZSB3aXRoIG9wZXJhbmRzIGxpc3RlZCBpbiB0aGUgTUNJbnN0OyBmb3IgZXhhbXBsZSwKKyAgLy8vIG1lbW9yeSBvcGVyYW5kcyBleHBhbmQgdG8gNSBvcGVyYW5kcyBpbiB0aGUgTUNJbnN0CisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVHZW5JbnN0cnVjdGlvbjo6T3BlcmFuZEluZm8+KiBPcGVyYW5kczsKKyAgLy8vIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBlbWl0dGVkIGludG8gdGhlIGluc3RydWN0aW9uCisgIC8vLyBpbmZvIHRhYmxlCisgIEluc3RydWN0aW9uU3BlY2lmaWVyKiBTcGVjOworCisgIC8vLyBpbnNuQ29udGV4dCAtIFJldHVybnMgdGhlIHByaW1hcnkgY29udGV4dCBpbiB3aGljaCB0aGUgaW5zdHJ1Y3Rpb24gaXMKKyAgLy8vICAgdmFsaWQuCisgIC8vLworICAvLy8gQHJldHVybiAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4KKyAgSW5zdHJ1Y3Rpb25Db250ZXh0IGluc25Db250ZXh0KCkgY29uc3Q7CisgIAorICBlbnVtIGZpbHRlcl9yZXQgeworICAgIEZJTFRFUl9TVFJPTkcsICAgIC8vIGluc3RydWN0aW9uIGhhcyBubyBwbGFjZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGFibGVzCisgICAgRklMVEVSX1dFQUssICAgICAgLy8gaW5zdHJ1Y3Rpb24gbWF5IGNvbmZsaWN0LCBhbmQgc2hvdWxkIGJlIGVsaW1pbmF0ZWQgaWYKKyAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBkb2VzCisgICAgRklMVEVSX05PUk1BTCAgICAgLy8gaW5zdHJ1Y3Rpb24gc2hvdWxkIGhhdmUgaGlnaCBwcmlvcml0eSBhbmQgZ2VuZXJhdGUgYW4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBpZiBpdCBjb25mbGNpdHMgd2l0aCBhbnkgb3RoZXIgRklMVEVSX05PUk1BTAorICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RydWN0aW9uCisgIH07CisgIAorICAvLy8gZmlsdGVyIC0gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBzaG91bGQgYmUgZGVjb2RhYmxlLiAgU29tZSAKKyAgLy8vICAgaW5zdHJ1Y3Rpb25zIGFyZSBwdXJlIGludHJpbnNpY3MgYW5kIHVzZSB1bmVuY29kYWJsZSBvcGVyYW5kczsgbWFueQorICAvLy8gICBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zIGFyZSBkdXBsaWNhdGVzIG9mIG90aGVyIGluc3RydWN0aW9uczsgb3RoZXIKKyAgLy8vICAgaW5zdHJ1Y3Rpb25zIG9ubHkgZGlmZmVyIGluIHRoZSBsb2dpY2FsIHdheSBpbiB3aGljaCB0aGV5IGFyZSB1c2VkLCBhbmQKKyAgLy8vICAgaGF2ZSB0aGUgc2FtZSBkZWNvZGluZy4gIEJlY2F1c2UgdGhlc2Ugd291bGQgY2F1c2UgZGVjb2RlIGNvbmZsaWN0cywKKyAgLy8vICAgdGhleSBtdXN0IGJlIGZpbHRlcmVkIG91dC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIC0gVGhlIGRlZ3JlZSBvZiBmaWx0ZXJpbmcgdG8gYmUgYXBwbGllZCAoc2VlIGZpbHRlcl9yZXQpLgorICBmaWx0ZXJfcmV0IGZpbHRlcigpIGNvbnN0OworICAKKyAgLy8vIHR5cGVGcm9tU3RyaW5nIC0gVHJhbnNsYXRlcyBhbiBvcGVyYW5kIHR5cGUgZnJvbSB0aGUgc3RyaW5nIHByb3ZpZGVkIGluCisgIC8vLyAgIHRoZSBMTFZNIHRhYmxlcyB0byBhbiBPcGVyYW5kVHlwZSBmb3IgdXNlIGluIHRoZSBvcGVyYW5kIHNwZWNpZmllci4KKyAgLy8vCisgIC8vLyBAcGFyYW0gcyAgICAgICAgICAgICAgLSBUaGUgc3RyaW5nLCBhcyBleHRyYWN0ZWQgYnkgY2FsbGluZyBSZWMtPmdldE5hbWUoKQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgb24gYSBDb2RlR2VuSW5zdHJ1Y3Rpb246Ok9wZXJhbmRJbmZvLgorICAvLy8gQHBhcmFtIGlzU1NFICAgICAgICAgIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGlzIGFuIFNTRSAKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgRm9yIFNTRSBpbnN0cnVjdGlvbnMsIGltbWVkaWF0ZXMgYXJlIAorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQtc2l6ZSByYXRoZXIgdGhhbiBiZWluZyBhZmZlY3RlZCBieSB0aGUKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeSBPcFNpemUgcHJlZml4LgorICAvLy8gQHBhcmFtIGhhc1JFWF9XUHJlZml4IC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGhhcyBhIFJFWC5XCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXguICBJZiBpdCBkb2VzLCAzMi1iaXQgcmVnaXN0ZXIgb3BlcmFuZHMgc3RheQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgMzItYml0IHJlZ2FyZGxlc3Mgb2YgdGhlIG9wZXJhbmQgc2l6ZS4KKyAgLy8vIEBwYXJhbSBoYXNPcFNpemVQcmVmaXgtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBoYXMgYW4gT3BTaXplCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXguICBJZiBpdCBkb2VzIG5vdCwgdGhlbiAxNi1iaXQgcmVnaXN0ZXIKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzIHN0YXkgMTYtYml0LgorICAvLy8gQHJldHVybiAgICAgICAgICAgICAgIC0gVGhlIG9wZXJhbmQncyB0eXBlLgorICBzdGF0aWMgT3BlcmFuZFR5cGUgdHlwZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzUkVYX1dQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc09wU2l6ZVByZWZpeCk7CisgIAorICAvLy8gaW1tZWRpYXRlRW5jb2RpbmdGcm9tU3RyaW5nIC0gVHJhbnNsYXRlcyBhbiBpbW1lZGlhdGUgZW5jb2RpbmcgZnJvbSB0aGUKKyAgLy8vICAgc3RyaW5nIHByb3ZpZGVkIGluIHRoZSBMTFZNIHRhYmxlcyB0byBhbiBPcGVyYW5kRW5jb2RpbmcgZm9yIHVzZSBpbgorICAvLy8gICB0aGUgb3BlcmFuZCBzcGVjaWZpZXIuCisgIC8vLworICAvLy8gQHBhcmFtIHMgICAgICAgICAgICAgICAgLSBTZWUgdHlwZUZyb21TdHJpbmcoKS4KKyAgLy8vIEBwYXJhbSBoYXNPcFNpemVQcmVmaXggIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGhhcyBhbiBPcFNpemUKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LiAgSWYgaXQgZG9lcyBub3QsIHRoZW4gMTYtYml0IGltbWVkaWF0ZQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kcyBzdGF5IDE2LWJpdC4KKyAgLy8vIEByZXR1cm4gICAgICAgICAgICAgICAgIC0gVGhlIG9wZXJhbmQncyBlbmNvZGluZy4KKyAgc3RhdGljIE9wZXJhbmRFbmNvZGluZyBpbW1lZGlhdGVFbmNvZGluZ0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzT3BTaXplUHJlZml4KTsKKyAgCisgIC8vLyBybVJlZ2lzdGVyRW5jb2RpbmdGcm9tU3RyaW5nIC0gTGlrZSBpbW1lZGlhdGVFbmNvZGluZ0Zyb21TdHJpbmcsIGJ1dAorICAvLy8gICBoYW5kbGVzIG9wZXJhbmRzIHRoYXQgYXJlIGluIHRoZSBSRUcgZmllbGQgb2YgdGhlIE1vZFIvTSBieXRlLgorICBzdGF0aWMgT3BlcmFuZEVuY29kaW5nIHJtUmVnaXN0ZXJFbmNvZGluZ0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc09wU2l6ZVByZWZpeCk7CisgIAorICAvLy8gcm1SZWdpc3RlckVuY29kaW5nRnJvbVN0cmluZyAtIExpa2UgaW1tZWRpYXRlRW5jb2RpbmdGcm9tU3RyaW5nLCBidXQKKyAgLy8vICAgaGFuZGxlcyBvcGVyYW5kcyB0aGF0IGFyZSBpbiB0aGUgUkVHIGZpZWxkIG9mIHRoZSBNb2RSL00gYnl0ZS4KKyAgc3RhdGljIE9wZXJhbmRFbmNvZGluZyByb1JlZ2lzdGVyRW5jb2RpbmdGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNPcFNpemVQcmVmaXgpOworICBzdGF0aWMgT3BlcmFuZEVuY29kaW5nIG1lbW9yeUVuY29kaW5nRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNPcFNpemVQcmVmaXgpOworICBzdGF0aWMgT3BlcmFuZEVuY29kaW5nIHJlbG9jYXRpb25FbmNvZGluZ0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc09wU2l6ZVByZWZpeCk7CisgIHN0YXRpYyBPcGVyYW5kRW5jb2Rpbmcgb3Bjb2RlTW9kaWZpZXJFbmNvZGluZ0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNPcFNpemVQcmVmaXgpOworICAKKyAgLy8vIGhhbmRsZU9wZXJhbmQgLSBDb252ZXJ0cyBhIHNpbmdsZSBvcGVyYW5kIGZyb20gdGhlIExMVk0gdGFibGUgZm9ybWF0IHRvCisgIC8vLyAgIHRoZSBlbWl0dGVkIHRhYmxlIGZvcm1hdCwgaGFuZGxpbmcgYW55IGR1cGxpY2F0ZSBvcGVyYW5kcyBpdCBlbmNvdW50ZXJzCisgIC8vLyAgIGFuZCB0aGVuIG9uZSBub24tZHVwbGljYXRlLgorICAvLy8KKyAgLy8vIEBwYXJhbSBvcHRpb25hbCAgICAgICAgICAgICAtIERldGVybWluZXMgd2hldGhlciB0byBhc3NlcnQgdGhhdCB0aGUKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmQgZXhpc3RzLgorICAvLy8gQHBhcmFtIG9wZXJhbmRJbmRleCAgICAgICAgIC0gVGhlIGluZGV4IGludG8gdGhlIGdlbmVyYXRlZCBvcGVyYW5kIHRhYmxlLgorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50ZWQgYnkgdGhpcyBmdW5jdGlvbiBvbmUgb3IgbW9yZQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgdG8gcmVmbGVjdCBwb3NzaWJsZSBkdXBsaWNhdGUgCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kcykuCisgIC8vLyBAcGFyYW0gcGh5c2ljYWxPcGVyYW5kSW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgb3BlcmFuZCBpbnRvIHRoZQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG9mIG5vbi1kdXBsaWNhdGUgKCdwaHlzaWNhbCcpIG9wZXJhbmRzLgorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50ZWQgYnkgdGhpcyBmdW5jdGlvbiBvbmNlLgorICAvLy8gQHBhcmFtIG51bVBoeXNpY2FsT3BlcmFuZHMgIC0gVGhlIG51bWJlciBvZiBub24tZHVwbGljYXRlIG9wZXJhbmRzIGluIHRoZQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLgorICAvLy8gQHBhcmFtIG9wZXJhbmRNYXBwaW5nICAgICAgIC0gVGhlIG9wZXJhbmQgbWFwcGluZywgd2hpY2ggaGFzIGFuIGVudHJ5IGZvcgorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBvcGVyYW5kIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMgYQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlLCBhbmQgb2Ygd2hhdC4KKyAgdm9pZCBoYW5kbGVPcGVyYW5kKGJvb2wgb3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmb3BlcmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJnBoeXNpY2FsT3BlcmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJm51bVBoeXNpY2FsT3BlcmFuZHMsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqb3BlcmFuZE1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kRW5jb2RpbmcgKCplbmNvZGluZ0Zyb21TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdGQ6OnN0cmluZyYsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc09wU2l6ZVByZWZpeCkpOworICAKKyAgLy8vIHNob3VsZEJlRW1pdHRlZCAtIFJldHVybnMgdGhlIHNob3VsZEJlRW1pdHRlZCBmaWVsZC4gIEFsdGhvdWdoIGZpbHRlcigpCisgIC8vLyAgIGZpbHRlcnMgb3V0IG1hbnkgaW5zdHJ1Y3Rpb25zLCBhdCB2YXJpb3VzIHBvaW50cyBpbiBkZWNvZGluZyB3ZQorICAvLy8gICBkZXRlcm1pbmUgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gc2hvdWxkIG5vdCBhY3R1YWxseSBiZSBkZWNvZGFibGUuICBJbgorICAvLy8gICBwYXJ0aWN1bGFyLCBNTVggTU9WIGluc3RydWN0aW9ucyBhcmVuJ3QgZW1pdHRlZCwgYnV0IHRoZXkncmUgb25seQorICAvLy8gICBpZGVudGlmaWVkIGR1cmluZyBvcGVyYW5kIHBhcnNpbmcuCisgIC8vLworICAvLy8gQHJldHVybiAtIHRydWUgaWYgYXQgdGhpcyBwb2ludCB3ZSBiZWxpZXZlIHRoZSBpbnN0cnVjdGlvbiBzaG91bGQgYmUKKyAgLy8vICAgZW1pdHRlZDsgZmFsc2UgaWYgbm90LiAgVGhpcyB3aWxsIHJldHVybiBmYWxzZSBpZiBmaWx0ZXIoKSByZXR1cm5zIGZhbHNlCisgIC8vLyAgIG9uY2UgZW1pdEluc3RydWN0aW9uU3BlY2lmaWVyKCkgaGFzIGJlZW4gY2FsbGVkLgorICBib29sIHNob3VsZEJlRW1pdHRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2hvdWxkQmVFbWl0dGVkOworICB9CisgIAorICAvLy8gZW1pdEluc3RydWN0aW9uU3BlY2lmaWVyIC0gTG9hZHMgdGhlIGluc3RydWN0aW9uIHNwZWNpZmllciBmb3IgdGhlIGN1cnJlbnQKKyAgLy8vICAgaW5zdHJ1Y3Rpb24gaW50byBhIERpc2Fzc2VtYmxlclRhYmxlcy4KKyAgLy8vCisgIC8vLyBAYXJnIHRhYmxlcyAtIFRoZSBEaXNhc3NlbWJsZXJUYWJsZXMgdG8gcG9wdWxhdGUgd2l0aCB0aGUgc3BlY2lmaWVyIGZvcgorICAvLy8gICAgICAgICAgICAgICB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKyAgdm9pZCBlbWl0SW5zdHJ1Y3Rpb25TcGVjaWZpZXIoRGlzYXNzZW1ibGVyVGFibGVzICZ0YWJsZXMpOworICAKKyAgLy8vIGVtaXREZWNvZGVQYXRoIC0gUG9wdWxhdGVzIHRoZSBwcm9wZXIgZmllbGRzIGluIHRoZSBkZWNvZGUgdGFibGVzCisgIC8vLyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlY29kZSBwYXRocyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBAYXJnIHRhYmxlcyAtIFRoZSBEaXNhc3NlbWJsZXJUYWJsZXMgdG8gcG9wdWxhdGUgd2l0aCB0aGUgZGVjb2RlCisgIC8vLyAgICAgICAgICAgICAgIGRlY29kZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgZW1pdERlY29kZVBhdGgoRGlzYXNzZW1ibGVyVGFibGVzICZ0YWJsZXMpIGNvbnN0OworCisgIC8vLyBDb25zdHJ1Y3RvciAtIEluaXRpYWxpemVzIGEgUmVjb2duaXphYmxlSW5zdHIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmllbGRzCisgIC8vLyAgIGZyb20gYSBDb2RlR2VuSW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gQGFyZyB0YWJsZXMgLSBUaGUgRGlzYXNzZW1ibGVyVGFibGVzIHRoYXQgdGhlIHNwZWNpZmllciB3aWxsIGJlIGFkZGVkIHRvLgorICAvLy8gQGFyZyBpbnNuICAgLSBUaGUgQ29kZUdlbkluc3RydWN0aW9uIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbS4KKyAgLy8vIEBhcmcgdWlkICAgIC0gVGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKyAgUmVjb2duaXphYmxlSW5zdHIoRGlzYXNzZW1ibGVyVGFibGVzICZ0YWJsZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJVSUQgdWlkKTsKK3B1YmxpYzoKKyAgLy8vIHByb2Nlc3NJbnN0ciAtIEFjY2VwdHMgYSBDb2RlR2VuSW5zdHJ1Y3Rpb24gYW5kIGxvYWRzIGRlY29kZSBpbmZvcm1hdGlvbgorICAvLy8gICBmb3IgaXQgaW50byBhIERpc2Fzc2VtYmxlclRhYmxlcyBpZiBhcHByb3ByaWF0ZS4KKyAgLy8vCisgIC8vLyBAYXJnIHRhYmxlcyAtIFRoZSBEaWFzc2VtYmxlclRhYmxlcyB0byBiZSBwb3B1bGF0ZWQgd2l0aCBkZWNvZGUKKyAgLy8vICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uCisgIC8vLyBAYXJnIGluc24gICAtIFRoZSBDb2RlR2VuSW5zdHJ1Y3Rpb24gdG8gYmUgdXNlZCBhcyBhIHNvdXJjZSBmb3IgdGhpcworICAvLy8gICAgICAgICAgICAgICBpbmZvcm1hdGlvbi4KKyAgLy8vIEB1aWQgICAgICAgIC0gVGhlIHVuaXF1ZSBJRCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIHN0YXRpYyB2b2lkIHByb2Nlc3NJbnN0cihEaXNhc3NlbWJsZXJUYWJsZXMgJnRhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW5JbnN0cnVjdGlvbiAmaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyVUlEIHVpZCk7Cit9OworICAKK30gLy8gbmFtZXNwYWNlIFg4NkRpc2Fzc2VtYmxlcgorCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvVXBkYXRlQ01ha2VMaXN0cy5wbCBiL3NyYy9MTFZNL3V0aWxzL1VwZGF0ZUNNYWtlTGlzdHMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1MzUxNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL1VwZGF0ZUNNYWtlTGlzdHMucGwKQEAgLTAsMCArMSwxMTkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKK3VzZSBzdHJpY3Q7Cit1c2UgRmlsZTo6RmluZDsKK3VzZSBGaWxlOjpDb3B5OwordXNlIERpZ2VzdDo6TUQ1OworCitteSBAZmlsZVR5cGVzID0gKCJjcHAiLCAiYyIpOworbXkgJWRpckZpbGVzOworbXkgJWRpckNNYWtlOworCitzdWIgR2V0RmlsZXMgeworICBteSAkZGlyID0gc2hpZnQ7CisgIG15ICR4ID0gJGRpckZpbGVzeyRkaXJ9OyAgCisgIGlmICghZGVmaW5lZCAkeCkgeworICAgICR4ID0gW107CisgICAgJGRpckZpbGVzeyRkaXJ9ID0gJHg7CisgIH0gIAorICByZXR1cm4gJHg7Cit9CisKK3N1YiBQcm9jZXNzRmlsZSB7CisgIG15ICRmaWxlID0gJF87CisgIG15ICRkaXIgPSAkRmlsZTo6RmluZDo6ZGlyOworICAjIFJlY29yZCBpZiBhIENNYWtlIGZpbGUgd2FzIGZvdW5kLgorICBpZiAoJGZpbGUgZXEgIkNNYWtlTGlzdHMudHh0IikgeworICAgICRkaXJDTWFrZXskZGlyfSA9ICRGaWxlOjpGaW5kOjpuYW1lOworICAgIHJldHVybiAwOworICB9CisgICMgR3JhYiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlLgorICAkZmlsZSA9fiAvXC4oW14uXSspJC87CisgIG15ICRleHQgPSAkMTsKKyAgbXkgJGZpbGVzOworICBmb3JlYWNoIG15ICR4IChAZmlsZVR5cGVzKSB7CisgICAgaWYgKCRleHQgZXEgJHgpIHsKKyAgICAgIGlmICghZGVmaW5lZCAkZmlsZXMpIHsKKyAgICAgICAgJGZpbGVzID0gR2V0RmlsZXMoJGRpcik7CisgICAgICB9CisgICAgICBwdXNoIEAkZmlsZXMsICRmaWxlOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdWIgRW1pdENNYWtlTGlzdCB7CisgIG15ICRkaXIgPSBzaGlmdDsKKyAgbXkgJGZpbGVzID0gJGRpckZpbGVzeyRkaXJ9OworICAKKyAgaWYgKCFkZWZpbmVkICRmaWxlcykgeworICAgIHJldHVybjsKKyAgfQorICAKKyAgZm9yZWFjaCBteSAkZmlsZSAoc29ydCBAJGZpbGVzKSB7CisgICAgcHJpbnQgT1VUICIgICI7CisgICAgcHJpbnQgT1VUICRmaWxlOworICAgIHByaW50IE9VVCAiXG4iOworICB9ICAKK30KKworc3ViIFVwZGF0ZUNNYWtlIHsKKyAgbXkgJGNtYWtlTGlzdCA9IHNoaWZ0OworICBteSAkZGlyID0gc2hpZnQ7CisgIG15ICRjbWFrZUxpc3ROZXcgPSAkY21ha2VMaXN0IC4gIi5uZXciOworICBvcGVuKElOLCAkY21ha2VMaXN0KTsKKyAgb3BlbihPVVQsICI+IiwgJGNtYWtlTGlzdE5ldyk7CisgIG15ICRmb3VuZExpYnJhcnkgPSAwOworICAKKyAgd2hpbGUoPElOPikgeworICAgIGlmICghJGZvdW5kTGlicmFyeSkgeworICAgICAgcHJpbnQgT1VUICRfOworICAgICAgaWYgKC9eYWRkX2NsYW5nX2xpYnJhcnlcKC8gfHwgL15hZGRfbGx2bV9saWJyYXJ5XCgvIHx8IC9eYWRkX2xsdm1fdGFyZ2V0XCgvCisgICAgICAgICAgfHwgL15hZGRfZXhlY3V0YWJsZVwoLykgeworICAgICAgICAkZm91bmRMaWJyYXJ5ID0gMTsKKyAgICAgICAgRW1pdENNYWtlTGlzdCgkZGlyKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoL1wpLykgeworICAgICAgICBwcmludCBPVVQgJF87CisgICAgICAgICRmb3VuZExpYnJhcnkgPSAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGNsb3NlKElOKTsKKyAgY2xvc2UoT1VUKTsKKworICBvcGVuKEZJTEUsICRjbWFrZUxpc3QpIG9yCisgICAgZGllKCJDYW5ub3Qgb3BlbiAkY21ha2VMaXN0IHdoZW4gY29tcHV0aW5nIGRpZ2VzdFxuIik7CisgIGJpbm1vZGUgRklMRTsKKyAgbXkgJGRpZ2VzdEEgPSBEaWdlc3Q6Ok1ENS0+bmV3LT5hZGRmaWxlKCpGSUxFKS0+aGV4ZGlnZXN0OworICBjbG9zZShGSUxFKTsKKyAgICAKKyAgb3BlbihGSUxFLCAkY21ha2VMaXN0TmV3KSBvcgorICAgIGRpZSgiQ2Fubm90IG9wZW4gJGNtYWtlTGlzdE5ldyB3aGVuIGNvbXB1dGluZyBkaWdlc3RcbiIpOworICBiaW5tb2RlIEZJTEU7CisgIG15ICRkaWdlc3RCID0gRGlnZXN0OjpNRDUtPm5ldy0+YWRkZmlsZSgqRklMRSktPmhleGRpZ2VzdDsKKyAgY2xvc2UoRklMRSk7CisgIAorICBpZiAoJGRpZ2VzdEEgbmUgJGRpZ2VzdEIpIHsKKyAgICBtb3ZlKCRjbWFrZUxpc3ROZXcsICRjbWFrZUxpc3QpOworICAgIHJldHVybiAxOyAgICAKKyAgfQorICAKKyAgdW5saW5rKCRjbWFrZUxpc3ROZXcpOworICByZXR1cm4gMDsKK30KKworc3ViIFVwZGF0ZUNNYWtlRmlsZXMgeworICBmb3JlYWNoIG15ICRkaXIgKHNvcnQga2V5cyAlZGlyQ01ha2UpIHsKKyAgICBpZiAoVXBkYXRlQ01ha2UoJGRpckNNYWtleyRkaXJ9LCAkZGlyKSkgeworICAgICAgcHJpbnQgIlVwZGF0ZWQ6ICRkaXJcbiI7CisgICAgfQorICB9Cit9CisKK2ZpbmQoeyB3YW50ZWQgPT4gXCZQcm9jZXNzRmlsZSwgZm9sbG93ID0+IDEgfSwgJy4nKTsKK1VwZGF0ZUNNYWtlRmlsZXMoKTsKKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvYnVncG9pbnQvUmVtb3RlUnVuU2FmZWx5LnNoIGIvc3JjL0xMVk0vdXRpbHMvYnVncG9pbnQvUmVtb3RlUnVuU2FmZWx5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTBlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9idWdwb2ludC9SZW1vdGVSdW5TYWZlbHkuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9zaAorIworIyBQcm9ncmFtOiAgUmVtb3RlUnVuU2FmZWx5LnNoCisjCisjIFN5bm9wc2lzOiBUaGlzIHNjcmlwdCBzaW1wbHkgcnVucyBhbm90aGVyIHByb2dyYW0gcmVtb3RlbHkgdXNpbmcgc3NoLgorIyAgICAgICAgICAgSXQgYWx3YXlzIHJldHVybnMgdGhlIGFub3RoZXIgcHJvZ3JhbSBleGl0IGNvZGUgb3IgZXhpdCB3aXRoCisjICAgICAgICAgICBjb2RlIDI1NSB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvZ3JhbSBjb3VsZCBub3QgYmUgZXhlY3V0ZWQuCisjCisjIFN5bnRheDogCisjCisjICAgUmVtb3RlUnVuU2FmZWx5LnNoIDxob3N0bmFtZT4gWy1sIDxsb2dpbl9uYW1lPl0gWy1wIDxwb3J0Pl0KKyMgICAgICAgICAgICAgICAgPHByb2dyYW0+IDxhcmdzLi4uPgorIworIyAgIHdoZXJlOgorIyAgICAgPGhvc3RuYW1lPiAgICBpcyB0aGUgcmVtb3RlIGhvc3QgdG8gZXhlY3V0ZSB0aGUgcHJvZ3JhbSwKKyMgICAgIDxsb2dpbl9uYW1lPiAgaXMgdGhlIHVzZXJuYW1lIG9uIHRoZSByZW1vdGUgaG9zdCwKKyMgICAgIDxwb3J0PiAgICAgICAgaXMgdGhlIHBvcnQgdXNlZCBieSB0aGUgcmVtb3RlIGNsaWVudCwKKyMgICAgIDxwcm9ncmFtPiAgICAgaXMgdGhlIHBhdGggdG8gdGhlIHByb2dyYW0gdG8gcnVuLAorIyAgICAgPGFyZ3MuLi4+ICAgICBhcmUgdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBwcm9ncmFtLgorIworCitwcmludFVzYWdlQW5kRXhpdCgpCit7CisgIGVjaG8gIlVzYWdlOiIKKyAgZWNobyAiLi9SZW1vdGVSdW5TYWZlbHkuc2ggPGhvc3RuYW1lPiBbLWwgPGxvZ2luX25hbWU+XSBbLXAgPHBvcnQ+XSAiIFwKKyAgICAgICAiPHByb2dyYW0+IDxhcmdzLi4uPiIKKyAgZXhpdCAyNTUKK30KKworbW9yZUFyZ3NFeHBlY3RlZCgpCit7CisgICMgJDEgLSByZW1haW5pbmcgbnVtYmVyIG9mIGFyZ3VtZW50cworICAjICQyIC0gbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBzaGlmdAorICBpZiBbICQxIC1sdCAkMiBdCisgIHRoZW4KKyAgICBlY2hvICJFcnJvcjogV3JvbmcgbnVtYmVyIG9mIGFyZ3VtYW50cy4iCisgICAgcHJpbnRVc2FnZUFuZEV4aXQKKyAgZmkKK30KKworIyBTYXZlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgYXJndW1lbnRzIGluIGEgc3RyaW5nIGJlZm9yZSB3ZQorIyBjbG9iYmVyIHRoZW0gd2l0aCB0aGUgc2hpZnQgY29tbWFuZC4KK09SSUdfQVJHUz0iJCoiCisjREVCVUc6IGVjaG8gJ0dPVDogJyRPUklHX0FSR1MKKworbW9yZUFyZ3NFeHBlY3RlZCAkIyAxCitSSE9TVD0kMQorc2hpZnQgMQorCitSVVNFUj1gaWQgLXVuYAorUkNMSUVOVD1zc2gKK1JQT1JUPQorV09SS0lOR19ESVI9CisKK21vcmVBcmdzRXhwZWN0ZWQgJCMgMQoraWYgWyAkMSA9ICItbCIgXTsgdGhlbgorICBtb3JlQXJnc0V4cGVjdGVkICQjIDIKKyAgUlVTRVI9JDIKKyAgc2hpZnQgMgorZmkKK21vcmVBcmdzRXhwZWN0ZWQgJCMgMQoraWYgWyAkMSA9ICItcCIgXTsgdGhlbgorICBtb3JlQXJnc0V4cGVjdGVkICQjIDIKKyAgUlBPUlQ9Ii1wICQyIgorICBzaGlmdCAyCitmaQorCittb3JlQXJnc0V4cGVjdGVkICQjIDEKK1BST0dSQU09JChiYXNlbmFtZSAkMSkKK1dPUktJTkdfRElSPSQoZGlybmFtZSAkMSkKK3NoaWZ0IDEKKworI0RFQlVHOiBlY2hvICdESVI9JyR7MCUlYGJhc2VuYW1lICQwYH0KKyNERUJVRzogZWNobyAnUkhPU1Q9JyRSSE9TVAorI0RFQlVHOiBlY2hvICdSVVNFUj0nJFJVU0VSCisjREVCVUc6IGVjaG8gJ1BST0dSQU09JyRQUk9HUkFNCisjREVCVUc6IGVjaG8gJ1dPUktJTkdfRElSPSckV09SS0lOR19ESVIKKyNERUJVRzogZWNobyAnQVJHUz0nJCoKKworIyBTYW5pdHkgY2hlY2sKK2lmIFsgIiRSSE9TVCIgPSAiIiAtbyAiJFBST0dSQU0iID0gIiIgXTsgdGhlbgorICBwcmludFVzYWdlQW5kRXhpdAorZmkKKworIyBMb2NhbCBwcm9ncmFtIGZpbGUgbXVzdCBleGlzdCBhbmQgYmUgZXhlY3VhdGJsZQorbG9jYWxfcHJvZ3JhbT0kV09SS0lOR19ESVIiLyIkUFJPR1JBTQoraWYgWyAhIC14ICIkbG9jYWxfcHJvZ3JhbSIgXTsgdGhlbgorICBlY2hvICJGaWxlICIkbG9jYWxfcHJvZ3JhbSIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFuIGV4ZWN1dGFibGUuLiIKKyAgZXhpdCAyNTUKK2ZpCisKK2Nvbm5lY3Rpb249JFJVU0VSJ0AnJFJIT1NUCityZW1vdGU9Ii4vIiRQUk9HUkFNCisoCisgIGNhdCAkbG9jYWxfcHJvZ3JhbSB8ICAgICAgICBcCisgICRSQ0xJRU5UICRjb25uZWN0aW9uICRSUE9SVCBcCisgICAncm0gLWYgJyRyZW1vdGUnIDsgJyAgICAgICBcCisgICAnY2F0ID4gJyRyZW1vdGUnIDsgY2htb2QgK3ggJyRyZW1vdGUnIDsgJyRyZW1vdGUnICckKicgOyAnIFwKKyAgICdlcnI9JD8gOyBybSAtZiAnJHJlbW90ZScgOyBleGl0ICRlcnInCispCitlcnI9JD8KKworI0RFQlVHOiBlY2hvIHNjcmlwdCBleGl0ICRlcnIKK2V4aXQgJGVycgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9idWlsZGl0L0dOVW1ha2VmaWxlIGIvc3JjL0xMVk0vdXRpbHMvYnVpbGRpdC9HTlVtYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODkwNGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvYnVpbGRpdC9HTlVtYWtlZmlsZQpAQCAtMCwwICsxLDEzMSBAQAorIyBMTFZNIExPQ0FMIGZpbGUgYnVpbGQgbWFjaGluZXJ5CisjIExMVk0gQ29tcGlsZXIgTWFrZWZpbGUgZm9yIHVzZSBieSBidWlsZGl0LiAgCisjCisjIFRoaXMgbWFrZWZpbGUgaXMgaW50ZW5kZWQgb25seSBmb3IgdXNlIHdpdGggQiZJIGJ1aWxkaXQuIEZvciAibm9ybWFsIiBidWlsZHMKKyMgdXNlIHRoZSBjb252ZW50aW9uYWwgdG9wLWxldmVsIG1ha2VmaWxlLgorIworIyBZb3UgY2FuIHNwZWNpZnkgVEFSR0VUUz1wcGMgKG9yIGkzODYpIG9uIHRoZSBidWlsZGl0IGNvbW1hbmQgbGluZSB0byBsaW1pdCB0aGUKKyMgYnVpbGQgdG8ganVzdCBvbmUgdGFyZ2V0LiBUaGUgZGVmYXVsdCBpcyBmb3IgcHBjIGFuZCBpMzg2LiBUaGUgY29tcGlsZXIKKyMgdGFyZ2V0dGVkIGF0IHRoaXMgaG9zdCBnZXRzIGJ1aWx0IGFueXdheSwgYnV0IG5vdCBpbnN0YWxsZWQgdW5sZXNzIGl0J3MgbGlzdGVkCisjIGluIFRBUkdFVFMuCisKKyMgSW5jbHVkZSB0aGUgc2V0IG9mIHN0YW5kYXJkIEFwcGxlIG1ha2VmaWxlIGRlZmluaXRpb25zLgoraWZuZGVmIENvcmVPU01ha2VmaWxlcworQ29yZU9TTWFrZWZpbGVzID0gJChNQUtFRklMRVBBVEgpL0NvcmVPUworZW5kaWYKK2luY2x1ZGUgJChDb3JlT1NNYWtlZmlsZXMpL1N0YW5kYXJkL1N0YW5kYXJkLm1ha2UKKworIyBFbmFibGUgQXBwbGUgZXh0ZW5zaW9ucyB0byAoZ251KW1ha2UuCitVU0VfQVBQTEVfUEJfU1VQUE9SVCA9IGFsbAorCitSQ19BUkNIUyA6PSBwcGMgaTM4NgorSE9TVFMgPSAkKFJDX0FSQ0hTKQordGFyZ2V0cyA9IGVjaG8gJChSQ19BUkNIUykKK1RBUkdFVFMgOj0gJChzaGVsbCAkKHRhcmdldHMpKQorCitTUkNST09UID0gLgorCitTUkMgPSAkKHNoZWxsIGNkICQoU1JDUk9PVCkgJiYgcHdkIHwgc2VkIHMsL3ByaXZhdGUsLCkKK09CSlJPT1QgPSAkKFNSQykvb2JqCitTWU1ST09UID0gJChPQkpST09UKS8uLi9zeW0KK0RTVFJPT1QgPSAkKE9CSlJPT1QpLy4uL2RzdAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQUkVGSVggPSAvRGV2ZWxvcGVyL3Vzci9sb2NhbAorCisjIFVubGVzcyBhc3NlcnRpb25zIGFyZSBmb3JjZWQgb24gaW4gdGhlIEdNQUtFIGNvbW1hbmQgbGluZSwgZGlzYWJsZSB0aGVtLgoraWZuZGVmIEVOQUJMRV9BU1NFUlRJT05TCitFTkFCTEVfQVNTRVJUSU9OUyA6PSBubworZW5kaWYKKworIyBEZWZhdWx0IGlzIG9wdGltaXplZCBidWlsZC4KK2lmZXEgKCQoTExWTV9ERUJVRyksMSkKK0xMVk1fT1BUSU1JWkVEIDo9IG5vCitlbHNlCitMTFZNX09QVElNSVpFRCA6PSB5ZXMKK2VuZGlmCisKKyMgRGVmYXVsdCB0byBub3QgaW5zdGFsbCBsaWJMVE8uZHlsaWIuCitJTlNUQUxMX0xJQkxUTyA6PSBubworCisjIERlZmF1bHQgdG8gZG8gYSBuYXRpdmUgYnVpbGQsIG5vdCBhIGNyb3NzLWJ1aWxkIGZvciBhbiBBUk0gaG9zdCBvciBzaW11bGF0b3IuCitBUk1fSE9TVEVEX0JVSUxEIDo9IG5vCitJT1NfU0lNX0JVSUxEIDo9IG5vCisKK2lmbmRlZiBSQ19Qcm9qZWN0U291cmNlVmVyc2lvbgorUkNfUHJvamVjdFNvdXJjZVZlcnNpb24gPSA5OTk5CitlbmRpZgorCitpZm5kZWYgUkNfUHJvamVjdFNvdXJjZVN1YnZlcnNpb24KK1JDX1Byb2plY3RTb3VyY2VTdWJ2ZXJzaW9uID0gMAorZW5kaWYKKworIyBOT1RFIDogQWx3YXlzIHB1dCB2ZXJzaW9uIG51bWJlcnMgYXQgdGhlIGVuZCBiZWNhdXNlIHRoZXkgYXJlIG9wdGlvbmFsLgoraW5zdGFsbDogJChPQkpST09UKSAkKFNZTVJPT1QpICQoRFNUUk9PVCkKKwljZCAkKE9CSlJPT1QpICYmIFwKKwkgICQoU1JDKS91dGlscy9idWlsZGl0L2J1aWxkX2xsdm0gIiQoUkNfQVJDSFMpIiAiJChUQVJHRVRTKSIgXAorCSAgICAkKFNSQykgJChQUkVGSVgpICQoRFNUUk9PVCkgJChTWU1ST09UKSBcCisJICAgICQoRU5BQkxFX0FTU0VSVElPTlMpICQoTExWTV9PUFRJTUlaRUQpICQoSU5TVEFMTF9MSUJMVE8pIFwKKwkgICAgJChBUk1fSE9TVEVEX0JVSUxEKSAkKElPU19TSU1fQlVJTEQpIFwKKwkgICAgJChSQ19Qcm9qZWN0U291cmNlVmVyc2lvbikgJChSQ19Qcm9qZWN0U291cmNlU3VidmVyc2lvbikgCisKK0VtYmVkZGVkSG9zdGVkOgorCSQoTUFLRSkgQVJNX0hPU1RFRF9CVUlMRD15ZXMgUFJFRklYPS91c3IgaW5zdGFsbAorCisjIFdoZW4gYnVpbGRpbmcgZm9yIHRoZSBpT1Mgc2ltdWxhdG9yLCBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgaXMgbm90IHNldAorIyBieSBkZWZhdWx0LCBidXQgaXQgbmVlZHMgdG8gYmUgc2V0IHdoZW4gYnVpbGRpbmcgdG9vbHMgdGhhdCBydW4gb24gdGhlIGhvc3QKKyMgKGUuZy4sIHRibGdlbiksIHNvIHNldCBpdCBoZXJlLgorRW1iZWRkZWRTaW06CisJZXhwb3J0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD1gc3dfdmVycyAtcHJvZHVjdFZlcnNpb25gOyBcCisJJChNQUtFKSBJT1NfU0lNX0JVSUxEPXllcyBQUkVGSVg9JChTREtST09UKS91c3IgaW5zdGFsbAorCisjIGluc3RhbGxoZHJzIGRvZXMgbm90aGluZywgYmVjYXVzZSB0aGUgaGVhZGVycyBhcmVuJ3QgdXNlZnVsIHVudGlsCisjIHRoZSBjb21waWxlciBpcyBpbnN0YWxsZWQuCitpbnN0YWxsaGRyczoKKworIyBXZSBidWlsZCBhbmQgaW5zdGFsbCBpbiBvbmUgc2hlbGwgc2NyaXB0LgorYnVpbGQ6IAorCitpbnN0YWxsc3JjOgorCUBlY2hvCisJQGVjaG8gKysrKysrKysrKysrKysrKysrKysrKworCUBlY2hvICsgSW5zdGFsbGluZyBzb3VyY2VzICsKKwlAZWNobyArKysrKysrKysrKysrKysrKysrKysrCisJQGVjaG8KKwlpZiBbICQoU1JDUk9PVCkgIT0gLiBdOyB0aGVuIFwKKwkgICQoUEFYKSAtcncgLiAkKFNSQ1JPT1QpOyBcCisJZmkKKwlmaW5kIC1kICIkKFNSQ1JPT1QpIiBcKCAtdHlwZSBkIC1hIC1uYW1lIC5zdm4gLW8gXAorCSAgICAgICAgICAgICAgICAgICAgICAgIC10eXBlIGYgLWEgLW5hbWUgLkRTX1N0b3JlIC1vIFwKKwkJCQktbmFtZSBcKn4gLW8gLW5hbWUgLlwjXCogXCkgXAorCSAgLWV4ZWMgcm0gLXJmIHt9IFw7CisJcm0gLXJmICIkKFNSQ1JPT1QpL3Rlc3QiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsZWFuOgorCUBlY2hvCisJQGVjaG8gKysrKysrKysrKysrCisJQGVjaG8gKyBDbGVhbmluZyArCisJQGVjaG8gKysrKysrKysrKysrCisJQGVjaG8KKwlAaWYgWyAtZCAkKE9CSlJPT1QpIC1hICIkKE9CSlJPT1QpIiAhPSAvIF07IHRoZW4gXAorCSAgZWNobyAnKioqIERFTEVUSU5HICcgJChPQkpST09UKTsgXAorCSAgcm0gLXJmICQoT0JKUk9PVCk7IFwKKwlmaQorCUBpZiBbIC1kICQoU1lNUk9PVCkgLWEgIiQoU1lNUk9PVCkiICE9IC8gXTsgdGhlbiBcCisJICBlY2hvICcqKiogREVMRVRJTkcgJyAkKFNZTVJPT1QpOyBcCisJICBybSAtcmYgJChTWU1ST09UKTsgXAorCWZpCisJQGlmIFsgLWQgJChEU1RST09UKSAtYSAiJChEU1RST09UKSIgIT0gLyBdOyB0aGVuIFwKKwkgIGVjaG8gJyoqKiBERUxFVElORyAnICQoRFNUUk9PVCk7IFwKKwkgIHJtIC1yZiAkKERTVFJPT1QpOyBcCisJZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworJChPQkpST09UKSAkKFNZTVJPT1QpICQoRFNUUk9PVCk6CisJbWtkaXIgLXAgJEAKKworLlBIT05ZOiBpbnN0YWxsIGluc3RhbGxzcmMgY2xlYW4gRW1iZWRkZWRIb3N0ZWQgRW1iZWRkZWRTaW0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2J1aWxkaXQvYnVpbGRfbGx2bSBiL3NyYy9MTFZNL3V0aWxzL2J1aWxkaXQvYnVpbGRfbGx2bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWVjMWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvYnVpbGRpdC9idWlsZF9sbHZtCkBAIC0wLDAgKzEsMzczIEBACisjIS9iaW4vc2gKKyMgTExWTSBMT0NBTCBmaWxlIEImSQorCitzZXQgLXgKKworIyBCdWlsZCBMTFZNIHRoZSAiQXBwbGUgd2F5Ii4KKyMgUGFyYW1ldGVyczoKKworIyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIGFyY2hpdGVjdHVyZXMgdGhlCisjIGNvbXBpbGVycyB3aWxsIHJ1biBvbi4gRm9yIGluc3RhbmNlLCAicHBjIGkzODYiLiBJZiB0aGUgY3VycmVudCBtYWNoaW5lCisjIGlzbid0IGluIHRoZSBsaXN0LCBpdCB3aWxsIChlZmZlY3RpdmVseSkgYmUgYWRkZWQuCitIT1NUUz0iJDEiCisKKyMgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgYXJjaGl0ZWN0dXJlcyB0aGUKKyMgY29tcGlsZXJzIHdpbGwgZ2VuZXJhdGUgY29kZSBmb3IuIElmIHRoZSBjdXJyZW50IG1hY2hpbmUgaXNuJ3QgaW4gdGhlIGxpc3QsIGEKKyMgY29tcGlsZXIgZm9yIGl0IHdpbGwgZ2V0IGJ1aWx0IGFueXdheSwgYnV0IHdvbid0IGJlIGluc3RhbGxlZC4KKyMgRklYTUU6IFRoZSBsaXN0IG9mIHRhcmdldHMgaXMgY3VycmVudGx5IGhhcmQtY29kZWQgYW5kIFRBUkdFVFMgaXMgbm90IHVzZWQuCitUQVJHRVRTPSIkMiIKKworIyBUaGUgdGhpcmQgcGFyYW1ldGVyIGlzIHRoZSBwYXRoIHRvIHRoZSBjb21waWxlciBzb3VyY2VzLiBUaGVyZSBzaG91bGQgYmUgYQorIyBzaGVsbCBzY3JpcHQgbmFtZWQgJ2NvbmZpZ3VyZScgaW4gdGhpcyBkaXJlY3RvcnkuIFRoaXMgc2NyaXB0IG1ha2VzIGEgY29weS4uLgorT1JJR19TUkNfRElSPSIkMyIKKworIyBUaGUgZm91cnRoIHBhcmFtZXRlciBpcyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIExMVk0gd2lsbCBiZSBpbnN0YWxsZWQuIFlvdSBjYW4KKyMgbW92ZSBpdCBvbmNlIGl0J3MgYnVpbHQsIHNvIHRoaXMgbW9zdGx5IGNvbnRyb2xzIHRoZSBsYXlvdXQgb2YgJERFU1RfRElSLgorREVTVF9ST09UPSIkNCIKKworIyBUaGUgZmlmdGggcGFyYW1ldGVyIGlzIHRoZSBwbGFjZSB3aGVyZSB0aGUgY29tcGlsZXIgd2lsbCBiZSBjb3BpZWQgb25jZSBpdCdzCisjIGJ1aWx0LgorREVTVF9ESVI9IiQ1IgorCisjIFRoZSBzaXh0aCBwYXJhbWV0ZXIgaXMgYSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gcGxhY2UgaW5mb3JtYXRpb24gKGxpa2UKKyMgdW5zdHJpcHBlZCBleGVjdXRhYmxlcyBhbmQgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcykgaGVscGZ1bCBpbiBkZWJ1Z2dpbmcgdGhlCisjIHJlc3VsdGluZyBjb21waWxlci4KK1NZTV9ESVI9IiQ2IgorCisjIFRoZSBzZXZlbnRoIHBhcmFtZXRlciBpcyBhIHllcy9ubyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGFzc2VydGlvbnMgc2hvdWxkIGJlCisjIGVuYWJsZWQgaW4gdGhlIExMVk0gbGlicy90b29scy4KK0xMVk1fQVNTRVJUSU9OUz0iJDciCisKKyMgVGhlIGVpZ2h0aCBwYXJhbWV0ZXIgaXMgYSB5ZXMvbm8gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIG9wdGltaXplZAorIyBidWlsZC4KK0xMVk1fT1BUSU1JWkVEPSIkOCIKKworIyBUaGUgbmludGggcGFyYW1ldGVyIGlzIGEgeWVzL25vIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgbGliTFRPLmR5bGliCisjIHNob3VsZCBiZSBpbnN0YWxsZWQuCitJTlNUQUxMX0xJQkxUTz0iJDkiCisKKyMgQSB5ZXMvbm8gcGFyYW1ldGVyIHRoYXQgY29udHJvbHMgd2hldGhlciB0byBjcm9zcy1idWlsZCBmb3IgYW4gQVJNIGhvc3QuCitBUk1fSE9TVEVEX0JVSUxEPSIkezEwfSIKKworIyBBIHllcy9ubyBwYXJhbWV0ZXIgdGhhdCBjb250cm9scyB3aGV0aGVyIHRvIGNyb3NzLWJ1aWxkIGZvciB0aGUgaU9TIHNpbXVsYXRvcgorSU9TX1NJTV9CVUlMRD0iJHsxMX0iCisKKyMgVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBzdWJtaXNzaW9uLCBlLmcuIDEwMDcuCitMTFZNX1NVQk1JVF9WRVJTSU9OPSIkezEyfSIKKworIyBUaGUgc3VidmVyc2lvbiBudW1iZXIgb2YgdGhlIHN1Ym1pc3Npb24sIGUuZy4gMDMuCitMTFZNX1NVQk1JVF9TVUJWRVJTSU9OPSIkezEzfSIKKworIyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyB3aGVyZSB0aGUgYnVpbGQgd2lsbCBoYXBwZW4uIEl0IG1heSBhbHJlYWR5CisjIGNvbnRhaW4gYSBwYXJ0aWFsIHJlc3VsdCBvZiBhbiBpbnRlcnJ1cHRlZCBidWlsZCwgaW4gd2hpY2ggY2FzZSB0aGlzIHNjcmlwdAorIyB3aWxsIGNvbnRpbnVlIHdoZXJlIGl0IGxlZnQgb2ZmLgorRElSPWBwd2RgCisKK0RBUldJTl9WRVJTPWB1bmFtZSAtciB8IHNlZCAncy9cLi4qLy8nYAorZWNobyBEQVJXSU5fVkVSUyA9ICREQVJXSU5fVkVSUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSdW4gdGhlIGJ1aWxkLgorCisjIENyZWF0ZSB0aGUgc291cmNlIHRyZWUgd2UnbGwgYWN0dWFsbHkgdXNlIHRvIGJ1aWxkLCBkZWxldGluZworIyB0Y2wgc2luY2UgaXQgZG9lc24ndCBhY3R1YWxseSBidWlsZCBwcm9wZXJseSBpbiBhIGNyb3NzIGVudmlyb25tZW50CisjIGFuZCB3ZSBkb24ndCByZWFsbHkgbmVlZCBpdC4KK1NSQ19ESVI9JERJUi9zcmMKK3JtIC1yZiAkU1JDX0RJUiB8fCBleGl0IDEKK21rZGlyICRTUkNfRElSIHx8IGV4aXQgMQorbG4gLXMgJE9SSUdfU1JDX0RJUi8qICRTUkNfRElSLyB8fCBleGl0IDEKKyMgV2UgY2FuJ3QgdXNlIHRoZSB0b3AtbGV2ZWwgTWFrZWZpbGUgYXMtaXMuICBSZW1vdmUgdGhlIHNvZnQgbGluazoKK3JtICRTUkNfRElSL01ha2VmaWxlIHx8IGV4aXQgMQorIyBOb3cgY3JlYXRlIG91ciBvd24gYnkgZWRpdGluZyB0aGUgdG9wLWxldmVsIE1ha2VmaWxlLCBkZWxldGluZyBldmVyeSBsaW5lIG1hcmtlZCAiQXBwbGUtc3R5bGUiOgorc2VkIC1lICcvW0FhXXBwbGUtc3R5bGUvZCcgLWUgJy9pbmNsdWRlLipHTlVtYWtlZmlsZS9kJyAkT1JJR19TUkNfRElSL01ha2VmaWxlID4gJFNSQ19ESVIvTWFrZWZpbGUgfHwgZXhpdCAxCisKKyMgQnVpbGQgdGhlIExMVk0gdHJlZSB1bml2ZXJzYWwuCitta2RpciAtcCAkRElSL29iai1sbHZtIHx8IGV4aXQgMQorY2QgJERJUi9vYmotbGx2bSB8fCBleGl0IDEKKworaWYgWyAiJEFSTV9IT1NURURfQlVJTEQiID0geWVzIF07IHRoZW4KKyAgIyBUaGUgY3Jvc3MtdG9vbHMnIGJ1aWxkIHByb2Nlc3MgZXhwZWN0cyB0byBmaW5kIGFuIGV4aXN0aW5nIGNyb3NzIHRvb2xjaGFpbgorICAjIHVuZGVyIG5hbWVzIGxpa2UgJ2FybS1hcHBsZS1kYXJ3aW4kREFSV0lOX1ZFUlMtYXMnOyBzbyBtYWtlIHRoZW0uCisgIHJtIC1yZiAkRElSL2JpbiB8fCBleGl0IDEKKyAgbWtkaXIgJERJUi9iaW4gfHwgZXhpdCAxCisgIGZvciBwcm9nIGluIGFyIG5tIHJhbmxpYiBzdHJpcCBsaXBvIGxkIGFzIDsgZG8KKyAgICBQPSRESVIvYmluL2FybS1hcHBsZS1kYXJ3aW4kREFSV0lOX1ZFUlMtJHtwcm9nfQorICAgIFQ9YHhjcnVuIC1zZGsgJFNES1JPT1QgLWZpbmQgJHtwcm9nfWAKKyAgICBlY2hvICcjIS9iaW4vc2gnID4gJFAgfHwgZXhpdCAxCisgICAgZWNobyAnZXhlYyAnJFQnICIkQCInID4+ICRQIHx8IGV4aXQgMQorICAgIGNobW9kIGEreCAkUCB8fCBleGl0IDEKKyAgZG9uZQorICAjIFRyeSB0byB1c2UgdGhlIHBsYXRmb3JtIGxsdm0tZ2NjLiBGYWxsIGJhY2sgdG8gZ2NjIGlmIGl0J3Mgbm90IGF2YWlsYWJsZS4KKyAgZm9yIHByb2cgaW4gZ2NjIGcrKyA7IGRvCisgICAgUD0kRElSL2Jpbi9hcm0tYXBwbGUtZGFyd2luJERBUldJTl9WRVJTLSR7cHJvZ30KKyAgICBUPWB4Y3J1biAtc2RrICRTREtST09UIC1maW5kIGxsdm0tJHtwcm9nfWAKKyAgICBpZiBbICJ4JFQiID0gIngiIF0gOyB0aGVuCisgICAgICBUPWB4Y3J1biAtc2RrICRTREtST09UIC1maW5kICR7cHJvZ31gCisgICAgZmkKKyAgICBlY2hvICcjIS9iaW4vc2gnID4gJFAgfHwgZXhpdCAxCisgICAgZWNobyAnZXhlYyAnJFQnIC1hcmNoIGFybXY2IC1pc3lzcm9vdCAnJHtTREtST09UfScgIiRAIicgPj4gJFAgfHwgZXhpdCAxCisgICAgY2htb2QgYSt4ICRQIHx8IGV4aXQgMQorICBkb25lCisKKyAgUEFUSD0kRElSL2JpbjokUEFUSAorIyBvdGhlcndpc2UsIHRyeSB0byB1c2UgbGx2bS1nY2MgaWYgaXQncyBhdmFpbGFibGUKK2VsaWYgWyAkREFSV0lOX1ZFUlMgLWd0IDkgXTsgdGhlbgorICAjIElmIHRoZSB1c2VyIGhhcyBzZXQgQ0Mgb3IgQ1hYLCByZXNwZWN0IHRoZWlyIHdpc2hlcy4gIElmIG5vdCwKKyAgIyBjb21waWxlIHdpdGggTExWTS1HQ0MvTExWTS1HKysgaWYgYXZhaWxhYmxlOyBpZiBMTFZNIGlzIG5vdAorICAjIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIHVzdWFsIEdDQy9HKysgZGVmYXVsdC4KKyAgc2F2ZWRQQVRIPSRQQVRIIDsgUEFUSD0iL0RldmVsb3Blci91c3IvYmluOiRQQVRIIgorICBYVE1QQ0M9JCh3aGljaCBsbHZtLWdjYykKKyAgaWYgWyB4JENDICA9IHggLWEgeCRYVE1QQ0MgIT0geCBdIDsgdGhlbiBleHBvcnQgQ0M9JFhUTVBDQyAgOyBmaQorICBYVE1QQ0M9JCh3aGljaCBsbHZtLWcrKykKKyAgaWYgWyB4JENYWCA9IHggLWEgeCRYVE1QQ0MgIT0geCBdIDsgdGhlbiBleHBvcnQgQ1hYPSRYVE1QQ0MgOyBmaQorICBQQVRIPSRzYXZlZFBBVEgKKyAgdW5zZXQgWFRNUENDIHNhdmVkUEFUSAorZmkKKworaWYgWyAiJEFSTV9IT1NURURfQlVJTEQiID0geWVzIF07IHRoZW4KKyAgY29uZmlndXJlX29wdHM9Ii0tZW5hYmxlLXRhcmdldHM9YXJtIC0taG9zdD1hcm0tYXBwbGUtZGFyd2luMTAgXAorICAgICAgICAgICAgICAgICAgLS10YXJnZXQ9YXJtLWFwcGxlLWRhcndpbjEwIC0tYnVpbGQ9aTY4Ni1hcHBsZS1kYXJ3aW4xMCIKK2VsaWYgWyAiJElPU19TSU1fQlVJTEQiID0geWVzIF07IHRoZW4KKyAgIyBVc2UgYSBub24tc3RhbmRhcmQgImRhcndpbl9zaW0iIGhvc3QgdHJpcGxlIHRvIHRyaWdnZXIgYSBjcm9zcy1idWlsZC4KKyAgY29uZmlndXJlX29wdHM9Ii0tZW5hYmxlLXRhcmdldHM9eDg2IC0taG9zdD1pNjg2LWFwcGxlLWRhcndpbl9zaW0gXAorICAgICAgICAgICAgICAgICAgLS1idWlsZD1pNjg2LWFwcGxlLWRhcndpbjEwIgorZWxzZQorICBjb25maWd1cmVfb3B0cz0iLS1lbmFibGUtdGFyZ2V0cz1hcm0seDg2LHBvd2VycGMsY2JlIgorZmkKKworaWYgWyBcISAtZiBNYWtlZmlsZS5jb25maWcgXTsgdGhlbgorICAkU1JDX0RJUi9jb25maWd1cmUgLS1wcmVmaXg9JERFU1RfRElSJERFU1RfUk9PVCAkY29uZmlndXJlX29wdHMgXAorICAgIC0tZW5hYmxlLWFzc2VydGlvbnM9JExMVk1fQVNTRVJUSU9OUyBcCisgICAgLS1lbmFibGUtb3B0aW1pemVkPSRMTFZNX09QVElNSVpFRCBcCisgICAgLS1kaXNhYmxlLWJpbmRpbmdzIFwKKyAgICB8fCBleGl0IDEKK2ZpCisKK1NVQlZFUlNJT049YGVjaG8gJFJDX1Byb2plY3RTb3VyY2VWZXJzaW9uIHwgc2VkIC1lICdzL1teLl0qXC5cKFswLTldKlwpLiovXDEvJ2AKKworaWYgWyAieCRTVUJWRVJTSU9OIiAhPSAieCRSQ19Qcm9qZWN0U291cmNlVmVyc2lvbiIgXTsgdGhlbgorICAgIExMVk1fU1VCTUlUX1NVQlZFUlNJT049YHByaW50ZiAiJTAyZCIgJFNVQlZFUlNJT05gCisgICAgUkNfUHJvamVjdFNvdXJjZVZlcnNpb249YGVjaG8gJFJDX1Byb2plY3RTb3VyY2VWZXJzaW9uIHwgc2VkIC1lICdzL1wuLiovLydgCisgICAgTExWTV9TVUJNSVRfVkVSU0lPTj0kUkNfUHJvamVjdFNvdXJjZVZlcnNpb24KK2ZpCisKK2lmIFsgIngkTExWTV9TVUJNSVRfU1VCVkVSU0lPTiIgPSAieDAwIiAtbyAieCRMTFZNX1NVQk1JVF9TVUJWRVJTSU9OIiA9ICJ4MCIgXTsgdGhlbgorICAgIExMVk1fVkVSU0lPTj0iJExMVk1fU1VCTUlUX1ZFUlNJT04iCitlbHNlCisgICAgTExWTV9WRVJTSU9OPSIkTExWTV9TVUJNSVRfVkVSU0lPTi0kTExWTV9TVUJNSVRfU1VCVkVSU0lPTiIKK2ZpCisKK0dDQ19WRVI9YGNjIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKworaWYgZWNobyAiJEdDQ19WRVIiIHwgZ3JlcCBHQ0MgPiAvZGV2L251bGw7IHRoZW4KKyAgICBHQ0NfVkVSPWBlY2hvICRHQ0NfVkVSIHwgc2VkIC1lICdzLy4qKEdDQykgXChbMC05Ll1bMC05Ll0qXCkuKi9cMS8nYAorICAgIE1BSl9WRVI9YGVjaG8gJEdDQ19WRVIgfCBzZWQgJ3MvXC4uKi8vJ2AKKyAgICBNSU5fVkVSPWBlY2hvICRHQ0NfVkVSIHwgc2VkICdzL1teLl0qXC5cKFswLTldKlwpLiovXDEvJ2AKK2ZpCisKK0pPQlNfRkxBRz0iIgorCisjIE5vdGU6IElmIGNvbXBpbGluZyB3aXRoIEdDQyA0LjAsIGRvbid0IHBhc3MgdGhlIC1qTiBmbGFnLiBCdWlsZGluZyB1bml2ZXJzYWwKKyMgYWxyZWFkeSBoYXMgcGFyYWxsZWxpc20gYW5kIHdlIGRvbid0IHdhbnQgdG8gbWFrZSB0aGUgYnVpbGRlcnMgaGl0IHN3YXAgYnkKKyMgZmlyaW5nIG9mZiB0b28gbWFueSBnY2NzIGF0IHRoZSBzYW1lIHRpbWUuCitpZiBbICJ4JE1BSl9WRVIiICE9ICJ4NCIgLW8gIngkTUlOX1ZFUiIgIT0gIngwIiBdOyB0aGVuCisgICAgIyBGaWd1cmUgb3V0IGhvdyBtYW55IG1ha2UgcHJvY2Vzc2VzIHRvIHJ1bi4KKyAgICBTWVNDVEw9YHN5c2N0bCAtbiBody5hY3RpdmVjcHVgCisKKyAgICAjIGh3LmFjdGl2ZWNwdSBvbmx5IGF2YWlsYWJsZSBpbiAxMC4yLjYgYW5kIGxhdGVyCisgICAgaWYgWyAteiAiJFNZU0NUTCIgXTsgdGhlbgorICAgICAgICBTWVNDVEw9YHN5c2N0bCAtbiBody5uY3B1YAorICAgIGZpCisKKyAgICAjIHN5c2N0bCAtbiBody4qIGRvZXMgbm90IHdvcmsgd2hlbiBpbnZva2VkIHZpYSBCJkkgY2hyb290IC9CdWlsZFJvb3QuCisgICAgIyBCdWlsZGVycyBjYW4gZGVmYXVsdCB0byAyLCBzaW5jZSBldmVuIGlmIHRoZXkgYXJlIHNpbmdsZSBwcm9jZXNzb3IsCisgICAgIyBub3RoaW5nIGVsc2UgaXMgcnVubmluZyBvbiB0aGUgbWFjaGluZS4KKyAgICBpZiBbIC16ICIkU1lTQ1RMIiBdOyB0aGVuCisgICAgICAgIFNZU0NUTD0yCisgICAgZmkKKworICAgIEpPQlNfRkxBRz0iLWogJFNZU0NUTCIKK2ZpCisKK21ha2UgJEpPQlNfRkxBRyAkT1BUSU1JWkVfT1BUUyBVTklWRVJTQUw9MSBVTklWRVJTQUxfQVJDSD0iJEhPU1RTIiBcCisgICAgVU5JVkVSU0FMX1NES19QQVRIPSRTREtST09UIFwKKyAgICBOT19SVU5USU1FX0xJQlM9MSBcCisgICAgRElTQUJMRV9FRElTPTEgXAorICAgIERFQlVHX1NZTUJPTFM9MSBcCisgICAgTExWTV9TVUJNSVRfVkVSU0lPTj0kTExWTV9TVUJNSVRfVkVSU0lPTiBcCisgICAgTExWTV9TVUJNSVRfU1VCVkVSU0lPTj0kTExWTV9TVUJNSVRfU1VCVkVSU0lPTiBcCisgICAgQ1hYRkxBR1M9Ii1ETExWTV9WRVJTSU9OX0lORk89J1wiIEFwcGxlIEJ1aWxkICMkTExWTV9WRVJTSU9OXCInIiBcCisgICAgVkVSQk9TRT0xCisKK2lmIFsgJD8gIT0gMCBdIDsgdGhlbgorICAgIGVjaG8gImVycm9yOiBMTFZNICdtYWtlJyBmYWlsZWQhIgorICAgIGV4aXQgMQorZmkgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbnN0cnVjdCB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uIHJvb3QsIGJ5IGNvcHlpbmcgc3R1ZmYgZnJvbSAkRElSL2RzdC0qIHRvCisjICRERVNUX0RJUiwgd2l0aCBvY2Nhc2lvbmFsICdsaXBvJyBjb21tYW5kcy4KKworY2QgJERFU1RfRElSIHx8IGV4aXQgMQorCisjIENsZWFuIG91dCBERVNUX0RJUiBpbiBjYXNlIC1ub2NsZWFuIHdhcyBwYXNzZWQgdG8gYnVpbGRpdC4KK3JtIC1yZiAqIHx8IGV4aXQgMQorCitjZCAkRElSL29iai1sbHZtIHx8IGV4aXQgMQorCisjIEluc3RhbGwgdGhlIHRyZWUgaW50byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorbWFrZSAkTE9DQUxfTUFLRUZMQUdTICRPUFRJTUlaRV9PUFRTIFVOSVZFUlNBTD0xIFVOSVZFUlNBTF9BUkNIPSIkSE9TVFMiIFwKKyAgICBOT19SVU5USU1FX0xJQlM9MSBcCisgICAgRElTQUJMRV9FRElTPTEgXAorICAgIERFQlVHX1NZTUJPTFM9MSBcCisgICAgTExWTV9TVUJNSVRfVkVSU0lPTj0kTExWTV9TVUJNSVRfVkVSU0lPTiBcCisgICAgTExWTV9TVUJNSVRfU1VCVkVSU0lPTj0kTExWTV9TVUJNSVRfU1VCVkVSU0lPTiBcCisgICAgT1BUSU1JWkVfT1BUSU9OPSctTzMnIFZFUkJPU0U9MSBpbnN0YWxsCisKK2lmICEgdGVzdCAkPyA9PSAwIDsgdGhlbgorICAgIGVjaG8gImVycm9yOiBMTFZNICdtYWtlIGluc3RhbGwnIGZhaWxlZCEiCisgICAgZXhpdCAxCitmaSAKKworIyBJbnN0YWxsIFZlcnNpb24uaAorTExWTV9NSU5PUl9WRVJTSU9OPWBlY2hvICRMTFZNX1NVQk1JVF9TVUJWRVJTSU9OIHwgc2VkIC1lICdzLDAqXChbMS05XVswLTldKlwpLFwxLCdgCitpZiBbICJ4JExMVk1fTUlOT1JfVkVSU0lPTiIgPSAieCIgXTsgdGhlbgorICAgIExMVk1fTUlOT1JfVkVSU0lPTj0wCitmaQorUkNfUHJvamVjdFNvdXJjZVN1YnZlcnNpb249YHByaW50ZiAiJWQiICRMTFZNX01JTk9SX1ZFUlNJT05gCitlY2hvICIjZGVmaW5lIExMVk1fVkVSU0lPTiAke1JDX1Byb2plY3RTb3VyY2VWZXJzaW9ufSIgPiAkREVTVF9ESVIkREVTVF9ST09UL2luY2x1ZGUvbGx2bS9WZXJzaW9uLmgKK2VjaG8gIiNkZWZpbmUgTExWTV9NSU5PUl9WRVJTSU9OICR7UkNfUHJvamVjdFNvdXJjZVN1YnZlcnNpb259IiA+PiAkREVTVF9ESVIkREVTVF9ST09UL2luY2x1ZGUvbGx2bS9WZXJzaW9uLmgKKworaWYgWyAieCRMTFZNX0RFQlVHIiAhPSAieDEiIF07IHRoZW4KKyAgICAjIFN0cmlwIGxvY2FsIHN5bWJvbHMgZnJvbSBsbHZtIGxpYnJhcmllcy4KKyAgICAjCisgICAgIyBVc2UgJy1sJyB0byBzdHJpcCBpMzg2IG1vZHVsZXMuIE4uQi4gdGhhdCBmbGFnIGRvZXNuJ3Qgd29yayB3aXRoIGtleHQgb3IKKyAgICAjIFBQQyBvYmplY3RzIQorICAgIHN0cmlwIC1TbCAkREVTVF9ESVIkREVTVF9ST09UL2xpYi8qLltvYV0KKyAgICBmb3IgZiBpbiBgbHMgJERFU1RfRElSJERFU1RfUk9PVC9saWIvKi5zb2A7IGRvCisgICAgICAgIHN0cmlwIC1TeGwgJGYKKyAgICBkb25lCitmaQorCisjIENvcHkgb3ZlciB0aGUgdGJsZ2VuIHV0aWxpdHkuCitjcCBgZmluZCAkRElSIC1uYW1lIHRibGdlbmAgJERFU1RfRElSJERFU1RfUk9PVC9iaW4KKworIyBSZW1vdmUgLmRpciBmaWxlcyAKK2NkICRERVNUX0RJUiRERVNUX1JPT1QKK3JtIC1mIGJpbi8uZGlyIGV0Yy9sbHZtLy5kaXIgbGliLy5kaXIKKworIyBSZW1vdmUgUFBDNjQgZmF0IHNsaWNlcy4KK2NkICRERVNUX0RJUiRERVNUX1JPT1QvYmluCitpZiBbICRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAiMTAuNCIgXTsgdGhlbgorICAgIGZpbmQgLiAtcGVybSA3NTUgLXR5cGUgZiBcISBcKCAtbmFtZSAnKmdjY2FzJyAtbyAtbmFtZSAnKmdjY2xkJyAtbyAtbmFtZSBsbHZtLWNvbmZpZyBcKSBcCisgICAgICAgIC1leGVjIGxpcG8gLWV4dHJhY3QgcHBjIC1leHRyYWN0IGkzODYge30gLW91dHB1dCB7fSBcOworZWxpZiBbICRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAiMTAuNSIgXTsgdGhlbgorICAgIGZpbmQgLiAtcGVybSA3NTUgLXR5cGUgZiBcISBcKCAtbmFtZSAnKmdjY2FzJyAtbyAtbmFtZSAnKmdjY2xkJyAtbyAtbmFtZSBsbHZtLWNvbmZpZyBcKSBcCisgICAgICAgIC1leGVjIGxpcG8gLWV4dHJhY3QgcHBjNzQwMCAtZXh0cmFjdCBpMzg2IHt9IC1vdXRwdXQge30gXDsKK2Vsc2UKKyAgICBmaW5kIC4gLXBlcm0gNzU1IC10eXBlIGYgXCEgXCggLW5hbWUgJypnY2NhcycgLW8gLW5hbWUgJypnY2NsZCcgLW8gLW5hbWUgbGx2bS1jb25maWcgXCkgXAorICAgICAgICAtZXhlYyBsaXBvIC1leHRyYWN0IHBwYzc0MDAgLWV4dHJhY3QgaTM4NiAtZXh0cmFjdCB4ODZfNjQge30gLW91dHB1dCB7fSBcOworZmkKKworIyBUaGUgSGVsbG8gZHlsaWIgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBwYXNzLiBObyBuZWVkIHRvIGluc3RhbGwgaXQuCitybSAkREVTVF9ESVIkREVTVF9ST09UL2xpYi9MTFZNSGVsbG8uZHlsaWIKKworIyBDb21wcmVzcyBtYW5wYWdlcworTURJUj0kREVTVF9ESVIkREVTVF9ST09UL3NoYXJlL21hbi9tYW4xCitnemlwIC1mICRNRElSLyoKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ3JlYXRlIFNZTV9ESVIgd2l0aCBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgZGVidWdnaW5nLgorCisjIEZpZ3VyZSBvdXQgaG93IG1hbnkgbWFrZSBwcm9jZXNzZXMgdG8gcnVuLgorU1lTQ1RMPWBzeXNjdGwgLW4gaHcuYWN0aXZlY3B1YAorCisjIGh3LmFjdGl2ZWNwdSBvbmx5IGF2YWlsYWJsZSBpbiAxMC4yLjYgYW5kIGxhdGVyCitpZiBbIC16ICIkU1lTQ1RMIiBdOyB0aGVuCisgIFNZU0NUTD1gc3lzY3RsIC1uIGh3Lm5jcHVgCitmaQorCisjIHN5c2N0bCAtbiBody4qIGRvZXMgbm90IHdvcmsgd2hlbiBpbnZva2VkIHZpYSBCJkkgY2hyb290IC9CdWlsZFJvb3QuIEJ1aWxkZXJzCisjIGNhbiBkZWZhdWx0IHRvIDIsIHNpbmNlIGV2ZW4gaWYgdGhleSBhcmUgc2luZ2xlIHByb2Nlc3Nvciwgbm90aGluZyBlbHNlIGlzCisjIHJ1bm5pbmcgb24gdGhlIG1hY2hpbmUuCitpZiBbIC16ICIkU1lTQ1RMIiBdOyB0aGVuCisgIFNZU0NUTD0yCitmaQorCitjZCAkU1lNX0RJUiB8fCBleGl0IDEKKworIyBDbGVhbiBvdXQgU1lNX0RJUiBpbiBjYXNlIC1ub2NsZWFuIHdhcyBwYXNzZWQgdG8gYnVpbGRpdC4KK3JtIC1yZiAqIHx8IGV4aXQgMQorCisjIEdlbmVyYXRlIC5kU1lNIGZpbGVzCitmaW5kICRERVNUX0RJUiAtcGVybSAtMDExMSAtdHlwZSBmIFwKKyAgICAhIFwoIC1uYW1lICcqLmxhJyAtbyAtbmFtZSBnY2NhcyAtbyAtbmFtZSBnY2NsZCAtbyAtbmFtZSBsbHZtLWNvbmZpZyAtbyAtbmFtZSAnKi5hJyBcKSBcCisgICAgLXByaW50IHwgeGFyZ3MgLW4gMSAtUCAke1NZU0NUTH0gZHN5bXV0aWwKKworIyBTYXZlIC5kU1lNIGZpbGVzIGFuZCAuYSBhcmNoaXZlcworY2QgJERFU1RfRElSIHx8IGV4aXQgMQorZmluZCAuIFwoIC1wYXRoIFwqLmRTWU0vXCogLW9yIC1uYW1lIFwqLmEgXCkgLXByaW50IFwKKyAgICB8IGNwaW8gLXBkbWwgJFNZTV9ESVIgfHwgZXhpdCAxCisKKyMgU2F2ZSBzb3VyY2UgZmlsZXMuCitta2RpciAkU1lNX0RJUi9zcmMgfHwgZXhpdCAxCitjZCAkRElSIHx8IGV4aXQgMQorZmluZCBvYmotKiAtbmFtZSBcKi5cW2NoeVxdIC1vIC1uYW1lIFwqLmNwcCAtcHJpbnQgXAorICAgIHwgY3BpbyAtcGRtbCAkU1lNX0RJUi9zcmMgfHwgZXhpdCAxCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEluc3RhbGwgYW5kIHN0cmlwIGxpYkxUTy5keWxpYgorCitjZCAkREVTVF9ESVIkREVTVF9ST09UCitpZiBbICIkSU5TVEFMTF9MSUJMVE8iID0gInllcyIgXTsgdGhlbgorICBEVF9IT01FPSIkREVTVF9ESVIvRGV2ZWxvcGVyL3VzciIKKyAgbWtkaXIgLXAgJERUX0hPTUUvbGliCisgIG12IGxpYi9saWJMVE8uZHlsaWIgJERUX0hPTUUvbGliL2xpYkxUTy5keWxpYgorCisgICMgU2F2ZSBhIGNvcHkgb2YgdGhlIHVuc3RyaXBwZWQgZHlsaWIKKyAgbWtkaXIgLXAgJFNZTV9ESVIvRGV2ZWxvcGVyL3Vzci9saWIKKyAgY3AgJERUX0hPTUUvbGliL2xpYkxUTy5keWxpYiAkU1lNX0RJUi9EZXZlbG9wZXIvdXNyL2xpYi9saWJMVE8uZHlsaWIKKworICAjIFVzZSAnLWwnIHRvIHN0cmlwIGkzODYgbW9kdWxlcy4gTi5CLiB0aGF0IGZsYWcgZG9lc24ndCB3b3JrIHdpdGgga2V4dCBvcgorICAjIFBQQyBvYmplY3RzIQorICBzdHJpcCAtYXJjaCBhbGwgLVNsICREVF9IT01FL2xpYi9saWJMVE8uZHlsaWIKKworICBpZiBbICJ4JERJU0FCTEVfVVNSX0xJTktTIiA9PSAieCIgXTsgdGhlbgorICAgICMgQWRkIGEgc3ltbGluayBpbiAvdXNyL2xpYiBmb3IgQiZJLgorICAgIG1rZGlyIC1wICRERVNUX0RJUi91c3IvbGliLworICAgIChjZCAkREVTVF9ESVIvdXNyL2xpYiAmJiBcCisgICAgICBsbiAtcyAuLi8uLi9EZXZlbG9wZXIvdXNyL2xpYi9saWJMVE8uZHlsaWIgLi9saWJMVE8uZHlsaWIpCisgIGZpCitlbHNlCisgIHJtIC1mIGxpYi9saWJMVE8uZHlsaWIKK2ZpCitybSAtZiBsaWIvbGliTFRPLmEgbGliL2xpYkxUTy5sYQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZW1vdmUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gREVTVF9ESVIuCisKK2NkICRESVIgfHwgZXhpdCAxCisKK2ZpbmQgJERFU1RfRElSIC1uYW1lIFwqLmEgLXByaW50IHwgeGFyZ3MgcmFubGliIHx8IGV4aXQgMQorZmluZCAkREVTVF9ESVIgLW5hbWUgXCouZFNZTSAtcHJpbnQgfCB4YXJncyBybSAtciB8fCBleGl0IDEKKworIyBTdHJpcCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBmaWxlcworIworIyBVc2UgJy1sJyB0byBzdHJpcCBpMzg2IG1vZHVsZXMuIE4uQi4gdGhhdCBmbGFnIGRvZXNuJ3Qgd29yayB3aXRoIGtleHQgb3IKKyMgUFBDIG9iamVjdHMhCitmaW5kICRERVNUX0RJUiAtcGVybSAtMDExMSAtdHlwZSBmIFwKKyAgICAhIFwoIC1uYW1lICcqLmxhJyAtbyAtbmFtZSBnY2NhcyAtbyAtbmFtZSBnY2NsZCAtbyAtbmFtZSBsbHZtLWNvbmZpZyBcKSBcCisgICAgLXByaW50IHwgeGFyZ3MgLW4gMSAtUCAke1NZU0NUTH0gc3RyaXAgLWFyY2ggYWxsIC1TbAorCitjaGdycCAtaCAtUiB3aGVlbCAkREVTVF9ESVIKK2NoZ3JwIC1SIHdoZWVsICRERVNUX0RJUgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZW1vdmUgdGhlIGRvY3MgZGlyZWN0b3J5CisKK3JtIC1yZiAkREVTVF9ESVIkREVTVF9ST09UL2RvY3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdzAwdCEgRG9uZSEKKworZXhpdCAwCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9jZ2lwbG90TkxULnBsIGIvc3JjL0xMVk0vdXRpbHMvY2dpcGxvdE5MVC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzYwZTQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvY2dpcGxvdE5MVC5wbApAQCAtMCwwICsxLDY4IEBACisjIS91c3IvYmluL3BlcmwKKyN0YWtlcyBhIHRlc3QgYW5kIGEgcHJvZ3JhbSBmcm9tIGEgZHAgYW5kIHByb2R1Y2VzIGEgZ251cGxvdCBzY3JpcHQKKyN1c2UgbGlrZSBwZXJsIHBsb3ROTFQucGwgcGFzc3dvcmQgUHJvZ3JhbXMvTXVsdGlTb3VyY2UvQmVuY2htYXJrcy9BU0NJX1B1cnBsZS9TTUcyMDAwL3NtZzIwMDAgbGxjCisKK3VzZSBDR0k7Cit1c2UgREJJOworbXkgJHEgPSBuZXcgQ0dJOworCisjIGRhdGFiYXNlIGluZm9ybWF0aW9uCiskZGI9Imxsdm1hbHBoYSI7CiskaG9zdD0ibG9jYWxob3N0IjsKKyR1c2VyaWQ9Imxsdm1kYnVzZXIiOworJHBhc3N3ZD0kcS0+cGFyYW0oJ3B3ZCcpOworJGNvbm5lY3Rpb25JbmZvPSJkYmk6bXlzcWw6JGRiOyRob3N0IjsKKworIyBtYWtlIGNvbm5lY3Rpb24gdG8gZGF0YWJhc2UKKyRkYmggPSBEQkktPmNvbm5lY3QoJGNvbm5lY3Rpb25JbmZvLCR1c2VyaWQsJHBhc3N3ZCkgb3IgZGllIERCSS0+ZXJyc3RyOworCisKKyRjb3VudCA9IDA7Cit3aGlsZSAoJHEtPnBhcmFtKCduJyAuICRjb3VudCkpCisgIHsKKyAgICAkY291bnQrKzsKKyAgfQorCiskfCA9IDE7CitwcmludCAiQ29udGVudC10eXBlOiBpbWFnZS9wbmciLCAiXG5cbiI7CisKK29wZW4gQ01EU1RSRUFNLCAifGdudXBsb3QiOworI29wZW4gQ01EU1RSRUFNLCAifGVjaG8iOworCitwcmludCBDTURTVFJFQU0gInNldCB0ZXJtaW5hbCBwbmdcbiI7CitwcmludCBDTURTVFJFQU0gInNldCBvdXRwdXRcbiI7CitwcmludCBDTURTVFJFQU0gInNldCB4ZGF0YSB0aW1lXG4iOworcHJpbnQgQ01EU1RSRUFNICdzZXQgdGltZWZtdCAiJVktJW0tJWQiJzsKK3ByaW50IENNRFNUUkVBTSAiXG5wbG90IjsKK2ZvciAoJGl0ZXIgPSAwOyAkaXRlciA8ICRjb3VudDsgJGl0ZXIrKykgeworICBpZiAoJGl0ZXIpCisgICAgeyBwcmludCBDTURTVFJFQU0gIiwiOyB9CisgIHByaW50IENNRFNUUkVBTSAiICctJyB1c2luZyAxOjIgdGl0bGUgXCIiIC4gJHEtPnBhcmFtKCd0JyAuICRpdGVyKSAuICIsIiAuICRxLT5wYXJhbSgnbicgLiAkaXRlcikgLiAiXCJ3aXRoIGxpbmVzIjsKK30KKworcHJpbnQgQ01EU1RSRUFNICJcbiI7CisKK2ZvciAoJGl0ZXIgPSAwOyAkaXRlciA8ICRjb3VudDsgJGl0ZXIrKykgeworCisgICRwcm9nID0gJHEtPnBhcmFtKCduJyAuICRpdGVyKTsKKyAgJHRlc3QgPSAkcS0+cGFyYW0oJ3QnIC4gJGl0ZXIpOworCisgICRxdWVyeSA9ICJTZWxlY3QgUlVOLCBWQUxVRSBmcm9tIFRlc3RzIHdoZXJlIFRFU1QgPSAnJHRlc3QnIEFORCBOQU1FID0gJyRwcm9nJyBPUkRFUiBCWSBSVU4iOworICAjcHJpbnQgIlxuJHF1ZXJ5XG4iOworICAKKyAgbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoICRxdWVyeSkgfHwgZGllICJDYW4ndCBwcmVwYXJlIHN0YXRlbWVudDogJERCSTo6ZXJyc3RyIjs7CisgIAorICBteSAkcmMgPSAkc3RoLT5leGVjdXRlIG9yIGRpZSBEQkktPmVycnN0cjsKKyAgCisgIHdoaWxlKCgkZGEsJHYpID0gJHN0aC0+ZmV0Y2hyb3dfYXJyYXkpCisgICAgeworICAgICAgcHJpbnQgQ01EU1RSRUFNICIkZGEgJHZcbiI7CisgICAgfQorICAKKyAgcHJpbnQgQ01EU1RSRUFNICJlXG4iOworfQorcHJpbnQgQ01EU1RSRUFNICJleGl0XG4iOworY2xvc2UgQ01EU1RSRUFNOworCisjIGRpc2Nvbm5lY3QgZnJvbSBkYXRhYmFzZQorJGRiaC0+ZGlzY29ubmVjdDsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2NoZWNrLWVhY2gtZmlsZSBiL3NyYy9MTFZNL3V0aWxzL2NoZWNrLWVhY2gtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTNiNGYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvY2hlY2stZWFjaC1maWxlCkBAIC0wLDAgKzEsMTUwIEBACisjIS9iaW4vc2gNCisjIGNoZWNrLWVhY2gtZmlsZQ0KKyMgVXNlZCB0byBuYXJyb3cgZG93biBhIG1pc2NvbXBpbGF0aW9uIHRvIG9uZSAubyBmaWxlIGZyb20gYSBsaXN0LiBQbGVhc2UgcmVhZA0KKyMgdGhlIHVzYWdlIHByb2NlZHVyZSwgYmVsb3csIGZvciBjb21tYW5kLWxpbmUgc3ludGF4IChvciBydW4gaXQgd2l0aCAtLWhlbHApLg0KKyMgVGhpcyBzY3JpcHQgZGVwZW5kcyBvbiB0aGUgbGx2bS1uYXRpdmUtZ2NjIHNjcmlwdC4NCisNCitpZiBbIHgkMSA9IHgtLW1ha2UtbGlua2VyLXNjcmlwdCBdDQordGhlbg0KKwlwcm9ncmFtPSQyDQorCWxpbmtlcj0uL2xpbmstJHByb2dyYW0NCisJZWNobyAiQnVpbGRpbmcgJHByb2dyYW0gd2l0aCBsbHZtLW5hdGl2ZS1nY2MiDQorCXJtIC1mICRwcm9ncmFtDQorCWdtYWtlIC1lICRwcm9ncmFtIENDPWxsdm0tbmF0aXZlLWdjYyBDWFg9bGx2bS1uYXRpdmUtZ3h4DQorCWVjaG8gIkVyYXNpbmcgJHByb2dyYW0gYW5kIHJlLWxpbmtpbmcgaXQiIA0KKwlybSAtZiAkcHJvZ3JhbQ0KKwllY2hvICJybSAtZiAkcHJvZ3JhbSIgPiAkbGlua2VyDQorCWdtYWtlIC1uICRwcm9ncmFtID4+ICRsaW5rZXINCisJY2htb2QgNzU1ICRsaW5rZXINCisJZWNobyAiTGlua2VyIHNjcmlwdCBjcmVhdGVkIGluICRsaW5rZXI7IHRlc3RpbmcgaXQgb3V0Ig0KKwlvdXRwdXQ9YC4vJGxpbmtlciAyPiYxYA0KKwljYXNlICIkb3V0cHV0IiBpbg0KKwkJKnVuZGVmaW5lZCpyZWZlcmVuY2UqX19tYWluKikgDQorCQkJZWNobyAiJHByb2dyYW0gYXBwZWFycyB0byBuZWVkIGEgZHVtbXkgX19tYWluIGZ1bmN0aW9uOyBhZGRpbmcgb25lIg0KKwkJCWVjaG8gInZvaWQgX19tYWluICgpIHsgfSIgPiBfX21haW4uYw0KKwkJCWdjYyAtYyBfX21haW4uYw0KKwkJCWVjaG8gIkRvbmU7IHJlYnVpbGRpbmcgJGxpbmtlciINCisJCQllY2hvICJybSAtZiAkcHJvZ3JhbSIgPiAkbGlua2VyDQorCQkJZ21ha2UgLW4gJHByb2dyYW0gMj4mMSB8IHNlZCAnL2djYy9zLyQvX19tYWluLm8vJyA+PiAkbGlua2VyDQorCQkJLi8kbGlua2VyID4gL2Rldi9udWxsIDI+JjENCisJCQlpZiBbICEgLXggJHByb2dyYW0gXQ0KKwkJCXRoZW4NCisJCQkJZWNobyAiV0FSTklORzogbGlua2VyIHNjcmlwdCBkaWRuJ3Qgd29yayINCisJCQlmaQ0KKwkJCTs7DQorCQkqKQ0KKwkJCWlmIFsgISAteCAkcHJvZ3JhbSBdDQorCQkJdGhlbg0KKwkJCQllY2hvICJXQVJOSU5HOiBsaW5rZXIgc2NyaXB0IGRpZG4ndCB3b3JrIg0KKwkJCWZpDQorCQkJOzsNCisJZXNhYw0KKwllY2hvICJMaW5rZXIgc2NyaXB0IGNyZWF0ZWQgaW4gJGxpbmtlcjsgcGxlYXNlIGNoZWNrIGl0IG1hbnVhbGx5Ig0KKwlleGl0IDANCitmaQ0KKw0KK2NoZWNrZmlsZXM9IiQxIg0KK3Byb2dyYW09IiQyIg0KK2xpbmtlcj0iJDMiDQorY2hlY2tlcj0iJDQiDQorDQordXNhZ2UgKCkgew0KKwlteW5hbWU9YGJhc2VuYW1lICQwYA0KKwllY2hvICIkbXluYW1lIC0tbWFrZS1saW5rZXItc2NyaXB0IFBST0dSQU0iDQorCWVjaG8gIiRteW5hbWUgT0JKRUNUUy1GSUxFIFBST0dSQU0gTElOS0VSIENIRUNLRVIiDQorCWVjaG8gIiINCisJZWNobyAiT0JKRUNUUy1GSUxFIGlzIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB0aGUgLm8gZmlsZXMiDQorCWVjaG8gIlBST0dSQU0gaXMgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgdW5kZXIgdGVzdCINCisJZWNobyAiKHRoZXJlIG11c3QgYWxzbyBleGlzdCBhIE1ha2VmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGljaCINCisJZWNobyAiaGFzIFBST0dSQU0gYXMgYSB0YXJnZXQpIg0KKwllY2hvICJMSU5LRVIgaXMgdGhlIHNjcmlwdCB0aGF0IGJ1aWxkcyBQUk9HUkFNOyB0cnkgLS1tYWtlLWxpbmtlci1zY3JpcHQiIA0KKwllY2hvICJ0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGl0Ig0KKwllY2hvICJDSEVDS0VSIGlzIHRoZSBzY3JpcHQgdGhhdCBleGl0cyAwIGlmIFBST0dSQU0gaXMgb2ssIDEgaWYgaXQgaXMgbm90IE9LIg0KKwllY2hvICIoTElOS0VSIGFuZCBDSEVDS0VSIG11c3QgYmUgaW4geW91ciBQQVRILCBvciB5b3Ugc2hvdWxkIHNwZWNpZnkgLi8pIg0KKwllY2hvICIiDQorCWVjaG8gIkJ1Z3MgdG8gPGdhZWtlQHVpdWMuZWR1Pi4iDQorCWV4aXQgMQ0KK30NCisNCitpZiBbIHgkMSA9IHgtLWhlbHAgXQ0KK3RoZW4NCisJdXNhZ2UNCitmaQ0KKw0KK2lmIFsgLXogIiRjaGVja2ZpbGVzIiBdDQordGhlbg0KKwllY2hvICJFUlJPUjogTXVzdCBzcGVjaWZ5IG5hbWUgb2YgZmlsZSB3LyBsaXN0IG9mIG9iamVjdHMgYXMgMXN0IGFyZy4iDQorCWVjaG8gIihnb3QgXCIkY2hlY2tmaWxlc1wiKSINCisJdXNhZ2UNCitmaQ0KK2lmIFsgISAtZiAiJGNoZWNrZmlsZXMiIF0NCit0aGVuDQorCWVjaG8gIkVSUk9SOiAkY2hlY2tmaWxlcyBub3QgZm91bmQiDQorCXVzYWdlDQorZmkNCitpZiBbIC16ICIkcHJvZ3JhbSIgXQ0KK3RoZW4NCisJZWNobyAiRVJST1I6IE11c3Qgc3BlY2lmeSBuYW1lIG9mIHByb2dyYW0gYXMgMm5kIGFyZy4iDQorCXVzYWdlDQorZmkNCitpZiBbIC16ICIkbGlua2VyIiBdDQordGhlbg0KKwllY2hvICJFUlJPUjogTXVzdCBzcGVjaWZ5IG5hbWUgb2YgbGluayBzY3JpcHQgYXMgM3JkIGFyZy4iDQorCXVzYWdlDQorZmkNCitpZiBbICEgLXggIiRsaW5rZXIiIF0NCit0aGVuDQorCWVjaG8gIkVSUk9SOiAkbGlua2VyIG5vdCBmb3VuZCBvciBub3QgZXhlY3V0YWJsZSINCisJZWNobyAiWW91IG1heSB3aXNoIHRvIHRyeTogJDAgLS1tYWtlLWxpbmtlci1zY3JpcHQgJHByb2dyYW0iDQorCXVzYWdlDQorZmkNCitpZiBbIC16ICIkY2hlY2tlciIgXQ0KK3RoZW4NCisJZWNobyAiRVJST1I6IE11c3Qgc3BlY2lmeSBuYW1lIG9mICRwcm9ncmFtIGNoZWNrIHNjcmlwdCBhcyAzcmQgYXJnLiINCisJdXNhZ2UNCitmaQ0KK2lmIFsgISAteCAiJGNoZWNrZXIiIF0NCit0aGVuDQorCWVjaG8gIkVSUk9SOiAkY2hlY2tlciBub3QgZm91bmQgb3Igbm90IGV4ZWN1dGFibGUiDQorCXVzYWdlDQorZmkNCisNCitmaWxlcz1gY2F0ICRjaGVja2ZpbGVzYA0KK2VjaG8gIlJlY29tcGlsaW5nIGV2ZXJ5dGhpbmcgd2l0aCBsbHZtLW5hdGl2ZS1nY2MiDQorZm9yIGYgaW4gJGZpbGVzDQorZG8NCisJcm0gLWYgJGYNCisJZ21ha2UgJGYgQ0M9bGx2bS1uYXRpdmUtZ2NjIENYWD1sbHZtLW5hdGl2ZS1neHgNCitkb25lDQorcm0gLWYgJHByb2dyYW0NCiskbGlua2VyDQoraWYgJGNoZWNrZXINCit0aGVuDQorCWVjaG8gIlNvcnJ5LCBJIGNhbid0IGhlbHAgeW91LCAkcHJvZ3JhbSBpcyBPSyB3aGVuIGNvbXBpbGVkIHdpdGggbGx2bS1uYXRpdmUtZ2NjIg0KKwlleGl0IDENCitmaQ0KK2ZvciBmIGluICRmaWxlcw0KK2RvDQorCWVjaG8gVHJ5aW5nIHRvIGNvbXBpbGUgJGYgd2l0aCBuYXRpdmUgZ2NjIGFuZCByZWJ1aWxkICRwcm9ncmFtDQorCW12ICR7Zn0gJHtmfV9fT0xEX18NCisJZ21ha2UgJHtmfSBDQz1nY2MgPiAvZGV2L251bGwgMj4mMQ0KKwkkbGlua2VyDQorCWVjaG8gQ2hlY2tpbmcgdmFsaWRpdHkgb2YgbmV3ICRwcm9ncmFtDQorCWlmICRjaGVja2VyDQorCXRoZW4NCisJCWVjaG8gUHJvZ3JhbSBpcyBPSw0KKwkJb2tmaWxlcz0iJG9rZmlsZXMgJGYiDQorCWVsc2UNCisJCWVjaG8gUHJvZ3JhbSBpcyBub3QgT0sNCisJCW5vdG9rZmlsZXM9IiRub3Rva2ZpbGVzICRmIg0KKwlmaQ0KKwltdiAke2Z9X19PTERfXyAke2Z9DQorZG9uZQ0KK2VjaG8gIiINCitlY2hvICJQcm9ncmFtIGlzIE9LIHdoZW4gdGhlc2UgZmlsZXMgYXJlIHJlY29tcGlsZWQgd2l0aCBuYXRpdmUgZ2NjOiAiDQorZWNobyAiJG9rZmlsZXMiDQorZWNobyAiIg0KK2VjaG8gIlByb2dyYW0gaXMgbm90IE9LIHdoZW4gdGhlc2UgZmlsZXMgYXJlIHJlY29tcGlsZWQgd2l0aCBuYXRpdmUgZ2NjOiAiDQorZWNobyAiJG5vdG9rZmlsZXMiDQorZWNobyAiIg0KK2V4aXQgMA0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2NvZGVnZW4tZGlmZiBiL3NyYy9MTFZNL3V0aWxzL2NvZGVnZW4tZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdmNThkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvY29kZWdlbi1kaWZmCkBAIC0wLDAgKzEsMTM1IEBACisjIS91c3IvYmluL3BlcmwNCisNCit1c2UgR2V0b3B0OjpTdGQ7DQorJERFQlVHID0gMDsNCisNCitzdWIgcGFyc2Vfb2JqZHVtcF9maWxlIHsNCisgIG15ICgkZmlsZW5hbWUpID0gQF87DQorICBteSBAcmVzdWx0Ow0KKyAgb3BlbiAoSU5QVVQsICRmaWxlbmFtZSkgb3IgZGllICIkZmlsZW5hbWU6ICQhXG4iOw0KKyAgcHJpbnQgIm9wZW5lZCBvYmpkdW1wIG91dHB1dCBmaWxlICRmaWxlbmFtZVxuIiBpZiAkREVCVUc7DQorICB3aGlsZSAoPElOUFVUPikgew0KKyAgICBpZiAoL1xzKihbMC05YS1mXSopOlx0KChbMC05YS1mXXsyfSApKykgKlx0KC4qKSQvKSB7DQorICAgICAgbXkgKCRhZGRyLCAkYnl0ZXMsICRpbnN0cikgPSAoJDEsICQyLCAkNCk7DQorICAgICAgJGFkZHIgPSAiMHgiIC4gJGFkZHI7DQorICAgICAgJGJ5dGVzID1+IHMvXHMqKC4qXFMpXHMqLyQxLzsgIyB0cmltIGFueSByZW1haW5pbmcgd2hpdGVzcGFjZQ0KKyAgICAgICRpbnN0ciA9fiBzL1xzKiguKlxTKVxzKi8kMS87DQorICAgICAgcHVzaCAoQHJlc3VsdCwgeydhZGRyJyA9PiAkYWRkciwgJ2J5dGVzJyA9PiAkYnl0ZXMsICdpbnN0cicgPT4gJGluc3RyfSk7DQorICAgICAgcHJpbnQgImFkZHI9JGFkZHIgYnl0ZXM9JyRieXRlcycgaW5zdHI9JyRpbnN0cidcbiIgaWYgJERFQlVHOw0KKyAgICB9DQorICB9DQorICBjbG9zZSBJTlBVVDsNCisgIHJldHVybiBAcmVzdWx0Ow0KK30NCisNCitzdWIgcGFyc2VfZ2RiX2ZpbGUgew0KKyAgbXkgKCRmaWxlbmFtZSkgPSBAXzsNCisgIG15IEByZXN1bHQ7DQorICBteSAkZ290X2FkZHI7DQorICBvcGVuIChJTlBVVCwgJGZpbGVuYW1lKSBvciBkaWUgIiRmaWxlbmFtZTogJCFcbiI7DQorICBwcmludCAib3BlbmVkIGdkYiBvdXRwdXQgZmlsZSAkZmlsZW5hbWVcbiIgaWYgJERFQlVHOw0KKyAgd2hpbGUgKDxJTlBVVD4pIHsNCisgICAgaWYgKC9eKDB4WzAtOWEtZl0qKTpcdChbXlx0XSopXHRbXjpdKjpcdCgoMHhbMC05YS1mXXsyfVxzKikrKVxzKiQvKSB7DQorICAgICAgbXkgKCRhZGRyLCAkYnl0ZXMsICRpbnN0cikgPSAoJDEsICQzLCAkMik7DQorICAgICAgJGJ5dGVzID1+IHMvMHgvL2c7DQorICAgICAgJGJ5dGVzID1+IHMvXHMrLyAvZzsgICAgICAgICAgICMgcmVndWxhcml6ZSB3aGl0ZXNwYWNlDQorICAgICAgJGJ5dGVzID1+IHMvXHMqKC4qXFMpXHMqLyQxLzsgICMgdHJpbSBhbnkgcmVtYWluaW5nIHdoaXRlc3BhY2UNCisgICAgICAkaW5zdHIgPX4gcy9ccyooLipcUylccyovJDEvOw0KKyAgICAgIHB1c2ggKEByZXN1bHQsIHsnYWRkcicgPT4gJGFkZHIsICdieXRlcycgPT4gJGJ5dGVzLCAnaW5zdHInID0+ICRpbnN0cn0pOw0KKyAgICAgIHByaW50ICJhZGRyPSRhZGRyIGJ5dGVzPSckYnl0ZXMnIGluc3RyPSckaW5zdHInXG4iIGlmICRERUJVRzsNCisgICAgfSBlbHNpZiAoL14oMHhbMC05YS1mXSopOlx0JC8pIHsgIyBkZWFsIHdpdGggZ2RiJ3MgbGluZSBicmVha2VyDQorICAgICAgJGdvdF9hZGRyID0gJDE7DQorICAgIH0gZWxzaWYgKCRnb3RfYWRkciAmJiAvXiAgICAoW15cdF0qKVx0W146XSo6XHQoKDB4WzAtOWEtZl17Mn1ccyopKylccyokLykgew0KKyAgICAgIG15ICgkYWRkciwgJGJ5dGVzLCAkaW5zdHIpID0gKCRnb3RfYWRkciwgJDIsICQxKTsNCisgICAgICAkYnl0ZXMgPX4gcy8weC8vZzsNCisgICAgICAkYnl0ZXMgPX4gcy9ccysvIC9nOyAgICAgICAgICAgIyByZWd1bGFyaXplIHdoaXRlc3BhY2UNCisgICAgICAkYnl0ZXMgPX4gcy9ccyooLipcUylccyovJDEvOyAgIyB0cmltIGFueSByZW1haW5pbmcgd2hpdGVzcGFjZQ0KKyAgICAgICRpbnN0ciA9fiBzL1xzKiguKlxTKVxzKi8kMS87DQorICAgICAgcHVzaCAoQHJlc3VsdCwgeydhZGRyJyA9PiAkYWRkciwgJ2J5dGVzJyA9PiAkYnl0ZXMsICdpbnN0cicgPT4gJGluc3RyfSk7DQorICAgICAgcHJpbnQgImFkZHI9JGFkZHIgYnl0ZXM9JyRieXRlcycgaW5zdHI9JyRpbnN0cidcbiIgaWYgJERFQlVHOw0KKyAgICAgIHVuZGVmICRnb3RfYWRkcjsNCisgICAgfQ0KKyAgfQ0KKyAgY2xvc2UgSU5QVVQ7DQorICByZXR1cm4gQHJlc3VsdDsNCit9DQorDQorc3ViIGJpbmFyeV9kaWZmcyB7DQorICBteSAoJG9iamR1bXBfZmlsZSwgJGdkYl9maWxlKSA9IEBfOw0KKyAgbXkgQGZpbGUxID0gcGFyc2Vfb2JqZHVtcF9maWxlICgkb2JqZHVtcF9maWxlKTsNCisgIG15IEBmaWxlMiA9IHBhcnNlX2dkYl9maWxlICgkZ2RiX2ZpbGUpOw0KKyAgbXkgJGxhc3RyZWNvcmQgPSAoJCNmaWxlMSA+PSAkI2ZpbGUyKSA/ICgkI2ZpbGUxKSA6ICgkI2ZpbGUyKTsNCisgIGZvciAobXkgJGkgPSAwOyAkaSA8PSAkbGFzdHJlY29yZDsgKyskaSkgew0KKyAgICBteSAkZDEgPSAkZmlsZTFbJGldOw0KKyAgICBteSAkZDIgPSAkZmlsZTJbJGldOw0KKyAgICBpZiAoJGQxLT57J2J5dGVzJ30gbmUgJGQyLT57J2J5dGVzJ30pIHsNCisgICAgICBuZXh0IGlmICgoJGQxLT57J2luc3RyJ30gZXEgJGQyLT57J2luc3RyJ30pICYmICRvcHRfZCk7DQorICAgICAgcHJpbnRmICIweCUwOHg6XHQlMzBzIFx0JXNcbiIsIDArJGQxLT57J2FkZHInfSwgJGQxLT57J2J5dGVzJ30sICRkMS0+eydpbnN0cid9Ow0KKyAgICAgIHByaW50ZiAiMHglMDh4Olx0JTMwcyBcdCVzXG5cbiIsIDArJGQyLT57J2FkZHInfSwgJGQyLT57J2J5dGVzJ30sICRkMi0+eydpbnN0cid9Ow0KKyAgICB9DQorICB9DQorfQ0KKw0KKyZnZXRvcHRzKCdkJyk7DQorJG9iamR1bXBfZmlsZSA9ICRBUkdWWzBdOw0KKyRnZGJfZmlsZSA9ICRBUkdWWzFdOw0KK2JpbmFyeV9kaWZmcyAoJG9iamR1bXBfZmlsZSwgJGdkYl9maWxlKTsNCitleGl0ICgwKTsNCitfX0VORF9fDQorPXBvZA0KKw0KKz1oZWFkMSBOQU1FDQorDQorY29kZWdlbi1kaWZmDQorDQorPWhlYWQxIFNZTk9QU0lTDQorDQorY29kZWdlbi1kaWZmIFstZF0gSTxPQkpEVU1QLU9VVFBVVC1GSUxFPiBJPEdEQi1ESVNBU1NFTUJMWS1GSUxFPg0KKw0KKz1oZWFkMSBERVNDUklQVElPTg0KKw0KK0I8Y29kZWdlbi1kaWZmPiBpcyBhIHByb2dyYW0gdGhhdCB0cmllcyB0byBzaG93IHlvdSB0aGUgZGlmZmVyZW5jZXMNCitiZXR3ZWVuIHRoZSBjb2RlIHRoYXQgQjxsbGM+IGdlbmVyYXRlZCBhbmQgdGhlIGNvZGUgdGhhdCBCPGxsaT4gZ2VuZXJhdGVkLg0KKw0KK1RoZSB3YXkgeW91IHVzZSBpdCBpcyBhcyBmb2xsb3dzOiBmaXJzdCwgeW91IGNyZWF0ZSBJPE9CSkRVTVAtT1VUUFVULUZJTEU+DQorYnkgcnVubmluZyBCPG9iamR1bXA+IG9uIHRoZSBCPGxsYz4gY29tcGlsZWQgYW5kIGxpbmtlZCBiaW5hcnkuIFlvdSBuZWVkIHRvDQordHJpbSBkb3duIHRoZSByZXN1bHQgc28gaXQgY29udGFpbnMgb25seSB0aGUgZnVuY3Rpb24gb2YgaW50ZXJlc3QuDQorDQorU2Vjb25kLCB5b3UgY3JlYXRlIEk8R0RCLURJU0FTU0VNQkxZLUZJTEU+IGJ5IHJ1bm5pbmcgQjxnZGI+LCB3aXRoIG15IHBhdGNoDQordG8gcHJpbnQgb3V0IGhleCBieXRlcyBpbiB0aGUgQjxkaXNhc3NlbWJsZT4gY29tbWFuZCBvdXRwdXQsIG9uDQorQjxsbGk+LiAgU2V0IGEgYnJlYWtwb2ludCBpbiBDPEVtaXR0ZXI6OmZpbmlzaEZ1bmN0aW9uKCk+IGFuZCB3YWl0IHVudGlsDQordGhlIGZ1bmN0aW9uIHlvdSB3YW50IGlzIGNvbXBpbGVkLiAgVGhlbiB1c2UgdGhlIEI8ZGlzYXNzZW1ibGU+IGNvbW1hbmQNCit0byBwcmludCBvdXQgdGhlIGFzc2VtYmx5IGR1bXAgb2YgdGhlIGZ1bmN0aW9uIEI8bGxpPiBqdXN0IGNvbXBpbGVkLg0KKyhVc2UgQzxsbGkgLWRlYnVnPiB0byBmaW5kIG91dCB3aGVyZSB0aGUgZnVuY3Rpb24gc3RhcnRzIGFuZCBlbmRzIGluIG1lbW9yeS4pDQorSXQncyBlYXNpZXN0IHRvIHNhdmUgdGhpcyBvdXRwdXQgYnkgdXNpbmcgQjxzY3JpcHQ+Lg0KKw0KK0ZpbmFsbHksIHlvdSBydW4gQjxjb2RlZ2VuLWRpZmY+LCBhcyBpbmRpY2F0ZWQgaW4gdGhlIFN5bm9wc2lzIHNlY3Rpb24gb2YNCit0aGlzIG1hbnBhZ2UuIEl0IHdpbGwgcHJpbnQgb3V0IGEgdHdvLWxpbmUgc3RhbnphIGZvciBlYWNoIG1pc21hdGNoZWQNCitpbnN0cnVjdGlvbiwgd2l0aCB0aGUgIEI8bGxjPiB2ZXJzaW9uIGZpcnN0LCBhbmQgdGhlICBCPGxsaT4gdmVyc2lvbiBzZWNvbmQuDQorDQorPWhlYWQxIE9QVElPTlMNCisNCis9b3ZlciA0DQorDQorPWl0ZW0gLWQNCisNCitEb24ndCBzaG93IGluc3RydWN0aW9ucyB3aGVyZSB0aGUgYnl0ZXMgYXJlIGRpZmZlcmVudCBidXQgdGhleQ0KK2Rpc2Fzc2VtYmxlIHRvIHRoZSBzYW1lIHRoaW5nLiBUaGlzIHB1dHMgYSBsb3Qgb2YgdHJ1c3QgaW4gdGhlDQorZGlzYXNzZW1ibGVyLCBidXQgaXQgbWlnaHQgaGVscCB5b3UgaGlnaGxpZ2h0IHRoZSBtb3JlIGVncmVnaW91cyBjYXNlcw0KK29mIG1pc2Fzc2VtYmx5Lg0KKw0KKz1iYWNrDQorDQorPWhlYWQxIEFVVEhPUg0KKw0KK0I8Y29kZWdlbi1kaWZmPiB3YXMgd3JpdHRlbiBieSBCcmlhbiBHYWVrZS4NCisNCis9aGVhZDEgU0VFIEFMU08NCisNCitMPGdkYigxKT4sIEw8b2JqZHVtcCgxKT4sIEw8c2NyaXB0KDEpPi4NCisNCitZb3Ugd2lsbCBuZWVkIG15IEI8Z2RiPiBwYXRjaDoNCisNCisgIGh0dHA6Ly9sbHZtLmNzLnVpdWMuZWR1L35nYWVrZS9nZGItZGlzYXNzZW1ibHktcHJpbnQtYnl0ZXMucGF0Y2gNCisNCis9Y3V0DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvY291bnQvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS91dGlscy9jb3VudC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTI0ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvY291bnQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzIEBACithZGRfZXhlY3V0YWJsZShjb3VudAorICBjb3VudC5jCisgICkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2NvdW50L01ha2VmaWxlIGIvc3JjL0xMVk0vdXRpbHMvY291bnQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlMDc2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2NvdW50L01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMjPT09LSB1dGlscy9jb3VudC9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjIAorIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjIAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorVE9PTE5BTUUgPSBjb3VudAorVVNFRExJQlMgPSAKKworIyBUaGlzIHRvb2wgaGFzIG5vIHBsdWdpbnMsIG9wdGltaXplIHN0YXJ0dXAgdGltZS4KK1RPT0xfTk9fRVhQT1JUUyA9IDEKKworIyBEb24ndCBpbnN0YWxsIHRoaXMgdXRpbGl0eQorTk9fSU5TVEFMTCA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2NvdW50L2NvdW50LmMgYi9zcmMvTExWTS91dGlscy9jb3VudC9jb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTY3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9jb3VudC9jb3VudC5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qPT09LSBjb3VudC5jIC0gVGhlICdjb3VudCcgdGVzdGluZyB0b29sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSpcCisgKgorICogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorICogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorICoKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdW5zaWduZWQgQ291bnQsIE51bUxpbmVzLCBOdW1SZWFkOworICBjaGFyIEJ1ZmZlcls0MDk2XSwgKkVuZDsKKworICBpZiAoYXJnYyAhPSAyKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgPGV4cGVjdGVkIGxpbmUgY291bnQ+XG4iLCBhcmd2WzBdKTsKKyAgICByZXR1cm4gMjsKKyAgfQorCisgIENvdW50ID0gc3RydG9sKGFyZ3ZbMV0sICZFbmQsIDEwKTsKKyAgaWYgKCpFbmQgIT0gJ1wwJyAmJiBFbmQgIT0gYXJndlsxXSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgY291bnQgYXJndW1lbnQgJyVzJ1xuIiwgYXJndlswXSwgYXJndlsxXSk7CisgICAgcmV0dXJuIDI7CisgIH0KKworICBOdW1MaW5lcyA9IDA7CisgIGRvIHsKKyAgICB1bnNpZ25lZCBpOworCisgICAgTnVtUmVhZCA9IGZyZWFkKEJ1ZmZlciwgMSwgc2l6ZW9mKEJ1ZmZlciksIHN0ZGluKTsKKworICAgIGZvciAoaSA9IDA7IGkgIT0gTnVtUmVhZDsgKytpKQorICAgICAgaWYgKEJ1ZmZlcltpXSA9PSAnXG4nKQorICAgICAgICArK051bUxpbmVzOworICB9IHdoaWxlIChOdW1SZWFkID09IHNpemVvZihCdWZmZXIpKTsKKyAgICAKKyAgaWYgKCFmZW9mKHN0ZGluKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIHJlYWRpbmcgc3RkaW5cbiIsIGFyZ3ZbMF0pOworICAgIHJldHVybiAzOworICB9CisKKyAgaWYgKENvdW50ICE9IE51bUxpbmVzKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFeHBlY3RlZCAlZCBsaW5lcywgZ290ICVkLlxuIiwgQ291bnQsIE51bUxpbmVzKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvY291bnRsb2Muc2ggYi9zcmMvTExWTS91dGlscy9jb3VudGxvYy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDFiNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvY291bnRsb2Muc2gKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3NoCisjIz09PS0gdXRpbHMvY291bnRsb2Muc2ggLSBDb3VudHMgTGluZXMgT2YgQ29kZSAtLS0tLS0tLS0tLS0tLSotIFNjcmlwdCAtKi09PT0jIworIyAKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIyAKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisjCisjIFRoaXMgc2NyaXB0IGZpbmRzIGFsbCB0aGUgc291cmNlIGNvZGUgZmlsZXMgaW4gdGhlIHNvdXJjZSBjb2RlIGRpcmVjdG9yaWVzCisjIChleGNsdWRpbmcgY2VydGFpbiB0aGluZ3MpLCBydW5zICJ3YyAtbCIgb24gdGhlbSB0byBnZXQgdGhlIG51bWJlciBvZiBsaW5lcyBpbgorIyBlYWNoIGZpbGUgYW5kIHRoZW4gc3VtcyB1cCBhbmQgcHJpbnRzIHRoZSB0b3RhbCB3aXRoIGF3ay4gCisjCisjIFRoZSBzY3JpcHQgdGFrZXMgb25lIG9wdGlvbmFsIG9wdGlvbiwgLXRvcGRpciwgd2hpY2ggc3BlY2lmaWVzIHRoZSB0b3AgbGx2bQorIyBzb3VyY2UgZGlyZWN0b3J5LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlIGxsdm0tY29uZmlnIHRvb2wgaXMgCisjIGNvbnN1bHRlZCB0byBmaW5kIHRvcCBzb3VyY2UgZGlyLiAgCisjCisjIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gbGx2bWRvLiBTZWUgdGhhdCBzY3JpcHQgZm9yIG1vcmUKKyMgZGV0YWlscy4KKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK2lmIHRlc3QgJCMgLWd0IDEgOyB0aGVuCisgIGlmIHRlc3QgIiQxIiA9ICItdG9wZGlyIiA7IHRoZW4KKyAgICBUT1BESVI9IiQyIgorICAgIHNoaWZ0OyBzaGlmdDsKKyAgZWxzZQorICAgIFRPUERJUj1gbGx2bS1jb25maWcgLS1zcmMtcm9vdGAKKyAgZmkKK2ZpCisKK2lmIHRlc3QgLWQgIiRUT1BESVIiIDsgdGhlbgorICBjZCAkVE9QRElSCisgIC4vdXRpbHMvbGx2bWRvIC10b3BkaXIgIiRUT1BESVIiIC1kaXJzICJpbmNsdWRlIGxpYiB0b29scyB0ZXN0IHV0aWxzIGV4YW1wbGVzIiAtY29kZS1vbmx5IHdjIC1sIHwgYXdrICdcCisgICAgICBCRUdJTiB7IGxvYz0wOyB9IFwKKyAgICAgIHsgbG9jICs9ICQxOyB9IFwKKyAgICAgIEVORCB7IHByaW50IGxvYzsgfScKK2Vsc2UKKyAgZWNobyAiQ2FuJ3QgZmluZCBMTFZNIHRvcCBkaXJlY3RvcnkiCitmaQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvY3Jvc3N0b29sL0FSTS9SRUFETUUgYi9zcmMvTExWTS91dGlscy9jcm9zc3Rvb2wvQVJNL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU4NTgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvY3Jvc3N0b29sL0FSTS9SRUFETUUKQEAgLTAsMCArMSwzNyBAQAorSE9XVE8gY3JlYXRlIGFuIExMVk0gY3Jvc3N0b29sIGZyb20geDg2XzY0L0xpbnV4IHRvIEFSTS9MaW51eAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisxLiAlIGxsdm0vdXRpbHMvY3Jvc3N0b29sL2NyZWF0ZS1zbmFwc2hvdHMuc2gKKworICAgVGhpcyB3aWxsIGNyZWF0ZSBsbHZtLVtSRVZfTF0udGFyLmJ6MiBhbmQgbGx2bS1nY2MtNC4yLVtSRVZfR10udGFyLmJ6MiwKKyAgIHdoZXJlOgorICAgICBSRVZfTCBpcyB0aGUgcmV2aXNpb24gYXQgd2hpY2ggImxsdm0iIHdhcyBjaGVja2VkIG91dCwgYW5kCisgICAgIFJFVl9HIGlzIHRoZSByZXZpc2lvbiBhdCB3aGljaCAibGx2bS1nY2MtNC4yIiB3YXMgY2hlY2tlZCBvdXQKKworICAgTm90ZSB0aGF0IFJFVl9MIG1pZ2h0IFJFVl9HIG1pZ2h0IG5vdCBiZSB0aGUgc2FtZSByZXZpc2lvbi4KKworMi4gRG93bmxvYWQgQ29kZVNvdXJjZXJ5IHRvb2xjaGFpbi4gIFRoZSBleGFjdCBsb2NhdGlvbiBkZXBlbmRzIG9uIHlvdXIKKyAgICRDUk9TU19UQVJHRVQgYnV0IHRoZSBzY3JpcHQgd2lsbCB0ZWxsIHlvdSB3aGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSBpcworICAgaWYgeW91IHJ1biBpdCB3aXRob3V0IGhhdmluZyB0aGUgZmlsZSBhdmFpbGFibGUuCisKKyAgIEZvciBleGFtcGxlLCBpZiB5b3UncmUgdXNpbmcgJENST1NTX1RBUkdFVCA9PSAiYXJtLW5vbmUtbGludXgtZ251ZWFiaSIgdGhlbgorICAgeW91IG5lZWQgdG8gZG93bmxvYWQ6CisKKyAgIGh0dHA6Ly93d3cuY29kZXNvdXJjZXJ5LmNvbS9zZ3BwL2xpdGUvYXJtL3BvcnRhbC9wYWNrYWdlMTc4Ny9wdWJsaWMvYXJtLW5vbmUtbGludXgtZ251ZWFiaS9hcm0tMjAwN3EzLTUxLWFybS1ub25lLWxpbnV4LWdudWVhYmktaTY4Ni1wYy1saW51eC1nbnUudGFyLmJ6MgorCisgICBOT1RFOiBzaW1wbHkgY2hhbmdpbmcgJENST1NTX1RBUkdFVCBhbmQgbW9kaWZ5aW5nIHRoZSBVUkwgYWNjb3JkaW5nbHkgd2lsbAorICAgbm90IHdvcmsgLS0geW91J2xsIG5lZWQgdG8gZ28gdG8gaHR0cDovL3d3dy5jb2Rlc291cmNlcnkuY29tIGFuZCBmaW5kIHRoZQorICAgY29ycmVjdCBmaWxlLCBhcyB0aGUgcmVsZWFzZSBudW1iZXIgaW4gdGhlIGZpbGUgd2lsbCBhbHNvIGJlIGRpZmZlcmVudCAoZS5nLiwKKyAgIGluIHRoZSBmaWxlIGFib3ZlLCB0aGUgcmVsZWFzZSBudW1iZXIgaXMgIjUxIikuCisKKzMuIFlvdSBjYW4gb3ZlcnJpZGUgbW9zdCB2YWx1ZXMgaW4gdGhlIHNjcmlwdCB3aXRob3V0IG1vZGlmeWluZyBpdCwgZS5nLgorICAgJElOU1RBTExfUk9PVCAoaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBpbiBkaXJlY3Rvcnkgb3RoZXIgdGhhbiAvdXNyL2xvY2FsKS4KKworICAgUnVuIHRoZSBzY3JpcHQgYXM6CisKKyAgICUgZW52IElOU1RBTExfUk9PVD1bZGlyIHRvIGluc3RhbGwgaW5dIFwKKyAgICAgICAgIENPREVfU09VUkNFUllfUEtHX1BBVEg9W2RpciB3aGVyZSB5b3UgZG93bmxvYWRlZCBDb2RlU291cmNlcnkgdGFyYmFsbF0gXAorICAgICAgICAgTExWTV9QS0dfUEFUSD1bZGlyIHdoZXJlIHlvdSBzdG9yZWQgeW91ciBMTFZNIGFuZCBMTFZNLUdDQyBzbmFwc2hvdHNdIFwKKyAgICAgICAgIExMVk1fU1ZOX1JFVj0ke1JFVl9MfSBcCisgICAgICAgICBMTFZNR0NDX1NWTl9SRVY9JHtSRVZfR30gXAorICAgICAgICAgYnVpbGQtaW5zdGFsbC1saW51eC5zaApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvY3Jvc3N0b29sL0FSTS9idWlsZC1pbnN0YWxsLWxpbnV4LnNoIGIvc3JjL0xMVk0vdXRpbHMvY3Jvc3N0b29sL0FSTS9idWlsZC1pbnN0YWxsLWxpbnV4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjhkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9jcm9zc3Rvb2wvQVJNL2J1aWxkLWluc3RhbGwtbGludXguc2gKQEAgLTAsMCArMSwyMDAgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvbXBpbGVzIGFuZCBpbnN0YWxscyBhIExpbnV4L3g4Nl82NCAtPiBMaW51eC9BUk0gY3Jvc3N0b29sIGJhc2VkIG9uIExMVk0gYW5kCisjIExMVk0tR0NDLTQuMiB1c2luZyBTVk4gc25hcHNob3RzIGluIHByb3ZpZGVkIHRhcmJhbGxzLgorCitzZXQgLW8gbm91bnNldAorc2V0IC1vIGVycmV4aXQKKworZWNobyAtbiAiV2VsY29tZSB0byBMTFZNIExpbnV4L1g4Nl82NCAtPiBMaW51eC9BUk0gY3Jvc3N0b29sICIKK2VjaG8gImJ1aWxkZXIvaW5zdGFsbGVyOyBzb21lIHN0ZXBzIHdpbGwgcmVxdWlyZSBzdWRvIHByaXZpbGVnZXMuIgorCityZWFkb25seSBJTlNUQUxMX1JPT1Q9IiR7SU5TVEFMTF9ST09UOi0vdXNyL2xvY2FsL2Nyb3NzdG9vbH0iCisjIEJvdGggJFVTRVIgYW5kIHJvb3QgKm11c3QqIGhhdmUgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXIuCityZWFkb25seSBTQ1JBVENIX1JPT1Q9JChta3RlbXAgLWQgIiR7VE1QRElSOi0vdG1wfS9sbHZtLXByb2plY3QuWFhYWFhYIikKK3JlYWRvbmx5IFNSQ19ST09UPSIke1NDUkFUQ0hfUk9PVH0vc3JjIgorcmVhZG9ubHkgT0JKX1JPT1Q9IiR7U0NSQVRDSF9ST09UfS9vYmoiCisKK3JlYWRvbmx5IENST1NTX0hPU1Q9Ing4Nl82NC11bmtub3duLWxpbnV4LWdudSIKK3JlYWRvbmx5IENST1NTX1RBUkdFVD0iYXJtLW5vbmUtbGludXgtZ251ZWFiaSIKK3JlYWRvbmx5IENST1NTX01BUkNIPSIke0NST1NTX01BUkNIOi1hcm12Nn0iCisKK3JlYWRvbmx5IENPREVfU09VUkNFUlk9IiR7SU5TVEFMTF9ST09UfS9jb2Rlc291cmNlcnkiCityZWFkb25seSBDT0RFX1NPVVJDRVJZX1BLR19QQVRIPSIke0NPREVfU09VUkNFUllfUEtHX1BBVEg6LSR7SE9NRX0vY29kZXNvdXJjZXJ5fSIKK3JlYWRvbmx5IENPREVfU09VUkNFUllfSFRUUD0iaHR0cDovL3d3dy5jb2Rlc291cmNlcnkuY29tL3NncHAvbGl0ZS9hcm0vcG9ydGFsL3BhY2thZ2UxNzg3L3B1YmxpYyIKK3JlYWRvbmx5IENPREVfU09VUkNFUllfUEtHPSJhcm0tMjAwN3EzLTUxLWFybS1ub25lLWxpbnV4LWdudWVhYmktaTY4Ni1wYy1saW51eC1nbnUudGFyLmJ6MiIKK3JlYWRvbmx5IENPREVfU09VUkNFUllfUk9PVD0iJHtDT0RFX1NPVVJDRVJZfS9hcm0tMjAwN3EzIgorcmVhZG9ubHkgQ09ERV9TT1VSQ0VSWV9CSU49IiR7Q09ERV9TT1VSQ0VSWV9ST09UfS9iaW4iCisjIE1ha2Ugc3VyZSAke0NST1NTX1RBUkdFVH0tKiBiaW51dGlscyBhcmUgaW4gY29tbWFuZCBwYXRoCitleHBvcnQgUEFUSD0iJHtDT0RFX1NPVVJDRVJZX0JJTn06JHtQQVRIfSIKKworcmVhZG9ubHkgQ1JPU1NfVEFSR0VUX0FTPSIke0NPREVfU09VUkNFUllfQklOfS8ke0NST1NTX1RBUkdFVH0tYXMiCityZWFkb25seSBDUk9TU19UQVJHRVRfTEQ9IiR7Q09ERV9TT1VSQ0VSWV9CSU59LyR7Q1JPU1NfVEFSR0VUfS1sZCIKKworcmVhZG9ubHkgU1lTUk9PVD0iJHtDT0RFX1NPVVJDRVJZX1JPT1R9LyR7Q1JPU1NfVEFSR0VUfS9saWJjIgorCityZWFkb25seSBMTFZNX1BLR19QQVRIPSIke0xMVk1fUEtHX1BBVEg6LSR7SE9NRX0vbGx2bS1wcm9qZWN0L3NuYXBzaG90c30iCisKKyMgTGF0ZXN0IFNWTiByZXZpc2lvbnMga25vd24gdG8gYmUgd29ya2luZyBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uCityZWFkb25seSBMTFZNX0RFRkFVTFRfUkVWPSI3NDUzMCIKK3JlYWRvbmx5IExMVk1HQ0NfREVGQVVMVF9SRVY9Ijc0NTM1IgorCityZWFkb25seSBMTFZNX1BLRz0ibGx2bS0ke0xMVk1fU1ZOX1JFVjotJHtMTFZNX0RFRkFVTFRfUkVWfX0udGFyLmJ6MiIKK3JlYWRvbmx5IExMVk1fU1JDX0RJUj0iJHtTUkNfUk9PVH0vbGx2bSIKK3JlYWRvbmx5IExMVk1fT0JKX0RJUj0iJHtPQkpfUk9PVH0vbGx2bSIKK3JlYWRvbmx5IExMVk1fSU5TVEFMTF9ESVI9IiR7SU5TVEFMTF9ST09UfS8ke0NST1NTX1RBUkdFVH0vbGx2bSIKKworcmVhZG9ubHkgTExWTUdDQ19QS0c9Imxsdm0tZ2NjLTQuMi0ke0xMVk1HQ0NfU1ZOX1JFVjotJHtMTFZNR0NDX0RFRkFVTFRfUkVWfX0udGFyLmJ6MiIKK3JlYWRvbmx5IExMVk1HQ0NfU1JDX0RJUj0iJHtTUkNfUk9PVH0vbGx2bS1nY2MtNC4yIgorcmVhZG9ubHkgTExWTUdDQ19PQkpfRElSPSIke09CSl9ST09UfS9sbHZtLWdjYy00LjIiCityZWFkb25seSBMTFZNR0NDX0lOU1RBTExfRElSPSIke0lOU1RBTExfUk9PVH0vJHtDUk9TU19UQVJHRVR9L2xsdm0tZ2NjLTQuMiIKKworcmVhZG9ubHkgTUFLRV9PUFRTPSIke01BS0VfT1BUUzotLWoyfSIKKworIyBQYXJhbXM6CisjICAgJDE6IGRpcmVjdG9yeSB0byBiZSBjcmVhdGVkCisjICAgJDI6IG9wdGlvbmFsIG1rZGlyIGNvbW1hbmQgcHJlZml4LCBlLmcuICJzdWRvIgorY3JlYXRlRGlyKCkgeworICBpZiBbWyAhIC1lICQxIF1dOyB0aGVuCisgICAgJHsyOi19IG1rZGlyIC1wICQxCisgIGVsaWYgW1sgLWUgJDEgJiYgISAtZCAkMSBdXTsgdGhlbgorICAgIGVjaG8gIiQxIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5OyBleGl0aW5nLiIKKyAgICBleGl0IDMKKyAgZmkKK30KKworc3Vkb0NyZWF0ZURpcigpIHsKKyAgY3JlYXRlRGlyICQxIHN1ZG8KKyAgc3VkbyBjaG93biAke1VTRVJ9ICQxCit9CisKKyMgUHJpbnRzIG91dCBhbmQgcnVucyB0aGUgY29tbWFuZCwgYnV0IHdpdGhvdXQgbG9nZ2luZyAtLSBpbnRlbmRlZCBmb3IgdXNlIHdpdGgKKyMgbGlnaHR3ZWlnaHQgY29tbWFuZHMgdGhhdCBkb24ndCBoYXZlIHVzZWZ1bCBvdXRwdXQgdG8gcGFyc2UsIGUuZy4gbWtkaXIsIHRhciwKKyMgZXRjLgorcnVuQ29tbWFuZCgpIHsKKyAgbG9jYWwgbWVzc2FnZT0iJDEiCisgIHNoaWZ0CisgIGVjaG8gIj0+ICRtZXNzYWdlIgorICBlY2hvICI9PT4gUnVubmluZzogJCoiCisgICQqCit9CisKK3J1bkFuZExvZygpIHsKKyAgbG9jYWwgbWVzc2FnZT0iJDEiCisgIGxvY2FsIGxvZ19maWxlPSIkMiIKKyAgc2hpZnQgMgorICBlY2hvICI9PiAkbWVzc2FnZTsgbG9nIGluICRsb2dfZmlsZSIKKyAgZWNobyAiPT0+IFJ1bm5pbmc6ICQqIgorICAjIFBvcC11cCBhIHRlcm1pbmFsIHdpdGggdGhlIG91dHB1dCBvZiB0aGUgY3VycmVudCBjb21tYW5kPworICAjIGUuZy46IHh0ZXJtIC1lIC9iaW4vYmFzaCAtYyAiJCogPnwgdGVlICRsb2dfZmlsZSIKKyAgJCogJj4gJGxvZ19maWxlCisgIGlmIFtbICQ/ICE9IDAgXV07IHRoZW4KKyAgICBlY2hvICJFcnJvciBvY2N1cnJlZDogc2VlIG1vc3QgcmVjZW50IGxvZyBmaWxlIGZvciBkZXRhaWxzLiIKKyAgICBleGl0CisgIGZpCit9CisKK2luc3RhbGxDb2RlU291cmNlcnkoKSB7CisgICMgVW5wYWNrIHRoZSB0YXJiYWxsLCBjcmVhdGluZyB0aGUgQ29kZVNvdXJjZXJ5IGRpciwgaWYgbmVjZXNzYXJ5LgorICBpZiBbWyAhIC1kICR7Q09ERV9TT1VSQ0VSWV9ST09UfSBdXTsgdGhlbgorICAgIHN1ZG9DcmVhdGVEaXIgJHtDT0RFX1NPVVJDRVJZfQorICAgIGNkICR7Q09ERV9TT1VSQ0VSWX0KKyAgICBpZiBbWyAtZSAke0NPREVfU09VUkNFUllfUEtHX1BBVEh9LyR7Q09ERV9TT1VSQ0VSWV9QS0d9IF1dOyB0aGVuCisgICAgICBydW5Db21tYW5kICJVbnBhY2tpbmcgQ29kZVNvdXJjZXJ5IGluICR7Q09ERV9TT1VSQ0VSWX0iIFwKKyAgICAgICAgICB0YXIganhmICR7Q09ERV9TT1VSQ0VSWV9QS0dfUEFUSH0vJHtDT0RFX1NPVVJDRVJZX1BLR30KKyAgICBlbHNlCisgICAgICBlY2hvIC1uICJDb2RlU291cmNlcnkgdGFyYmFsbCBub3QgZm91bmQgaW4gIgorICAgICAgZWNobyAiJHtDT0RFX1NPVVJDRVJZX1BLR19QQVRIfS8ke0NPREVfU09VUkNFUllfUEtHfSIKKyAgICAgIGVjaG8gLW4gIkZpeCB0aGUgcGF0aCBvciBkb3dubG9hZCBpdCBmcm9tICIKKyAgICAgIGVjaG8gIiR7Q09ERV9TT1VSQ0VSWV9IVFRQfS8ke0NST1NTX1RBUkdFVH0vJHtDT0RFX1NPVVJDRVJZX1BLR30iCisgICAgICBleGl0CisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIkNvZGVTb3VyY2VyeSBpbnN0YWxsIGRpciBhbHJlYWR5IGV4aXN0czsgc2tpcHBpbmcuIgorICBmaQorCisgICMgVmVyaWZ5IG91ciBDb2RlU291cmNlcnkgdG9vbGNoYWluIGluc3RhbGxhdGlvbi4KKyAgaWYgW1sgISAtZCAiJHtTWVNST09UfSIgXV07IHRoZW4KKyAgICBlY2hvIC1uICJFcnJvcjogQ29kZVNvdXJjZXJ5IGRvZXMgbm90IGNvbnRhaW4gbGliYyBmb3IgJHtDUk9TU19UQVJHRVR9OiAiCisgICAgZWNobyAiJHtTWVNST09UfSBub3QgZm91bmQuIgorICAgIGV4aXQKKyAgZmkKKworICBmb3IgdG9vbCBpbiAke0NST1NTX1RBUkdFVF9BU30gJHtDUk9TU19UQVJHRVRfTER9OyBkbworICAgIGlmIFtbICEgLWUgJHRvb2wgXV07IHRoZW4KKyAgICAgIGVjaG8gIiR7dG9vbH0gbm90IGZvdW5kOyBleGl0aW5nLiIKKyAgICAgIGV4aXQKKyAgICBmaQorICBkb25lCit9CisKK2luc3RhbGxMTFZNKCkgeworICBpZiBbWyAtZCAke0xMVk1fSU5TVEFMTF9ESVJ9IF1dOyB0aGVuCisgICAgZWNobyAiTExWTSBpbnN0YWxsIGRpciAke0xMVk1fSU5TVEFMTF9ESVJ9IGV4aXN0czsgc2tpcHBpbmcuIgorICAgIHJldHVybgorICBmaQorCisgIHN1ZG9DcmVhdGVEaXIgJHtMTFZNX0lOU1RBTExfRElSfQorCisgICMgVW5wYWNrIExMVk0gdGFyYmFsbDsgc2hvdWxkIGNyZWF0ZSB0aGUgZGlyZWN0b3J5ICJsbHZtIi4KKyAgY2QgJHtTUkNfUk9PVH0KKyAgcnVuQ29tbWFuZCAiVW5wYWNraW5nIExMVk0iIHRhciBqeGYgJHtMTFZNX1BLR19QQVRIfS8ke0xMVk1fUEtHfQorCisgICMgQ29uZmlndXJlLCBidWlsZCwgYW5kIGluc3RhbGwgTExWTS4KKyAgY3JlYXRlRGlyICR7TExWTV9PQkpfRElSfQorICBjZCAke0xMVk1fT0JKX0RJUn0KKyAgcnVuQW5kTG9nICJDb25maWd1cmluZyBMTFZNIiAke0xMVk1fT0JKX0RJUn0vbGx2bS1jb25maWd1cmUubG9nIFwKKyAgICAgICR7TExWTV9TUkNfRElSfS9jb25maWd1cmUgXAorICAgICAgLS1kaXNhYmxlLWppdCBcCisgICAgICAtLWVuYWJsZS1vcHRpbWl6ZWQgXAorICAgICAgLS1wcmVmaXg9JHtMTFZNX0lOU1RBTExfRElSfSBcCisgICAgICAtLXRhcmdldD0ke0NST1NTX1RBUkdFVH0gXAorICAgICAgLS13aXRoLWxsdm1nY2NkaXI9JHtMTFZNR0NDX0lOU1RBTExfRElSfQorICBydW5BbmRMb2cgIkJ1aWxkaW5nIExMVk0iICR7TExWTV9PQkpfRElSfS9sbHZtLWJ1aWxkLmxvZyBcCisgICAgICBtYWtlICR7TUFLRV9PUFRTfQorICBydW5BbmRMb2cgIkluc3RhbGxpbmcgTExWTSIgJHtMTFZNX09CSl9ESVJ9L2xsdm0taW5zdGFsbC5sb2cgXAorICAgICAgbWFrZSAke01BS0VfT1BUU30gaW5zdGFsbAorfQorCitpbnN0YWxsTExWTUdDQygpIHsKKyAgaWYgW1sgLWQgJHtMTFZNR0NDX0lOU1RBTExfRElSfSBdXTsgdGhlbgorICAgIGVjaG8gIkxMVk0tR0NDIGluc3RhbGwgZGlyICR7TExWTUdDQ19JTlNUQUxMX0RJUn0gZXhpc3RzOyBza2lwcGluZy4iCisgICAgcmV0dXJuCisgIGZpCisKKyAgc3Vkb0NyZWF0ZURpciAke0xMVk1HQ0NfSU5TVEFMTF9ESVJ9CisKKyAgIyBVbnBhY2sgTExWTS1HQ0MgdGFyYmFsbDsgc2hvdWxkIGNyZWF0ZSB0aGUgZGlyZWN0b3J5ICJsbHZtLWdjYy00LjIiLgorICBjZCAke1NSQ19ST09UfQorICBydW5Db21tYW5kICJVbnBhY2tpbmcgTExWTS1HQ0MiIHRhciBqeGYgJHtMTFZNX1BLR19QQVRIfS8ke0xMVk1HQ0NfUEtHfQorCisgICMgQ29uZmlndXJlLCBidWlsZCwgYW5kIGluc3RhbGwgTExWTS1HQ0MuCisgIGNyZWF0ZURpciAke0xMVk1HQ0NfT0JKX0RJUn0KKyAgY2QgJHtMTFZNR0NDX09CSl9ESVJ9CisgIHJ1bkFuZExvZyAiQ29uZmlndXJpbmcgTExWTS1HQ0MiICR7TExWTUdDQ19PQkpfRElSfS9sbHZtZ2NjLWNvbmZpZ3VyZS5sb2cgXAorICAgICAgJHtMTFZNR0NDX1NSQ19ESVJ9L2NvbmZpZ3VyZSBcCisgICAgICAtLWVuYWJsZS1sYW5ndWFnZXM9YyxjKysgXAorICAgICAgLS1lbmFibGUtbGx2bT0ke0xMVk1fSU5TVEFMTF9ESVJ9IFwKKyAgICAgIC0tcHJlZml4PSR7TExWTUdDQ19JTlNUQUxMX0RJUn0gXAorICAgICAgLS1wcm9ncmFtLXByZWZpeD1sbHZtLSBcCisgICAgICAtLXRhcmdldD0ke0NST1NTX1RBUkdFVH0gXAorICAgICAgLS13aXRoLWFyY2g9JHtDUk9TU19NQVJDSH0gXAorICAgICAgLS13aXRoLWFzPSR7Q1JPU1NfVEFSR0VUX0FTfSBcCisgICAgICAtLXdpdGgtbGQ9JHtDUk9TU19UQVJHRVRfTER9IFwKKyAgICAgIC0td2l0aC1zeXNyb290PSR7U1lTUk9PVH0KKyAgcnVuQW5kTG9nICJCdWlsZGluZyBMTFZNLUdDQyIgJHtMTFZNR0NDX09CSl9ESVJ9L2xsdm1nY2MtYnVpbGQubG9nIFwKKyAgICAgIG1ha2UKKyAgcnVuQW5kTG9nICJJbnN0YWxsaW5nIExMVk0tR0NDIiAke0xMVk1HQ0NfT0JKX0RJUn0vbGx2bWdjYy1pbnN0YWxsLmxvZyBcCisgICAgICBtYWtlIGluc3RhbGwKK30KKworZWNobyAiQnVpbGRpbmcgaW4gJHtTQ1JBVENIX1JPT1R9OyBpbnN0YWxsaW5nIGluICR7SU5TVEFMTF9ST09UfSIKKworY3JlYXRlRGlyICR7U1JDX1JPT1R9CitjcmVhdGVEaXIgJHtPQkpfUk9PVH0KKworaW5zdGFsbENvZGVTb3VyY2VyeQoraW5zdGFsbExMVk0KK2luc3RhbGxMTFZNR0NDCisKK2VjaG8gIkRvbmUuIgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvY3Jvc3N0b29sL2NyZWF0ZS1zbmFwc2hvdHMuc2ggYi9zcmMvTExWTS91dGlscy9jcm9zc3Rvb2wvY3JlYXRlLXNuYXBzaG90cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzAyMzJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvY3Jvc3N0b29sL2NyZWF0ZS1zbmFwc2hvdHMuc2gKQEAgLTAsMCArMSw0MSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ3JlYXRlcyBMTFZNIFNWTiBzbmFwc2hvdHM6IGxsdm0tJFJFVi50YXIuYnoyIGFuZCBsbHZtLWdjYy00LjItJFJFVi50YXIuYnoyLAorIyB3aGVyZSAkUkVWIGlzIGFuIFNWTiByZXZpc2lvbiBvZiBMTFZNLiAgVGhpcyBpcyB1c2VkIGZvciBjcmVhdGluZyBzdGFibGUKKyMgdGFyYmFsbHMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYnVpbGQga25vd24tdG8td29yayBjcm9zc3Rvb2xzLgorIworIyBTeW50YXg6CisjICAgJDAgW1JFVl0gLS0gZ3JhYnMgdGhlIHJldmlzaW9uICRSRVYgZnJvbSBTVk47IGlmIG5vdCBzcGVjaWZpZWQsIGdyYWJzIHRoZQorIyAgIGxhdGVzdCBTVk4gcmV2aXNpb24uCisKK3NldCAtbyBub3Vuc2V0CitzZXQgLW8gZXJyZXhpdAorCityZWFkb25seSBMTFZNX1BST0pFQ1RfU1ZOPSJodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdCIKKworZ2V0TGF0ZXN0UmV2aXNpb25Gcm9tU1ZOKCkgeworICBzdm4gaW5mbyAke0xMVk1fUFJPSkVDVF9TVk59IHwgZWdyZXAgXlJldmlzaW9uIHwgc2VkICdzL15SZXZpc2lvbjogLy8nCit9CisKK3JlYWRvbmx5IFJFVj0iJHsxOi0kKGdldExhdGVzdFJldmlzaW9uRnJvbVNWTil9IgorCitjcmVhdGVUYXJiYWxsRnJvbVNWTigpIHsKKyAgbG9jYWwgbW9kdWxlPSQxCisgIGxvY2FsIGxvZz0iJHttb2R1bGV9LmxvZyIKKyAgZWNobyAiUnVubmluZzogc3ZuIGV4cG9ydCAtciAke1JFVn0gJHttb2R1bGV9OyBsb2cgaW4gJHtsb2d9IgorICBzdm4gLXEgZXhwb3J0IC1yICR7UkVWfSAke0xMVk1fUFJPSkVDVF9TVk59LyR7bW9kdWxlfS90cnVuayBcCisgICAgICAke21vZHVsZX0gPiAke2xvZ30gMj4mMQorCisgICMgQ3JlYXRlICJtb2R1bGUtcmV2aXNpb24udGFyLmJ6MiIgcGFja2FnZXMgZnJvbSB0aGUgU1ZOIGNoZWNrb3V0IGRpcnMuCisgIGxvY2FsIHRhcmJhbGw9IiR7bW9kdWxlfS0ke1JFVn0udGFyLmJ6MiIKKyAgZWNobyAiQ3JlYXRpbmcgdGFyYmFsbDogJHt0YXJiYWxsfSIKKyAgdGFyIGNqZiAke3RhcmJhbGx9ICR7bW9kdWxlfQorCisgIGVjaG8gIkNsZWFuaW5nIHVwICcke21vZHVsZX0nIgorICBybSAtcmYgJHttb2R1bGV9ICR7bG9nfQorfQorCitmb3IgbW9kdWxlIGluICJsbHZtIiAibGx2bS1nY2MtNC4yIjsgZG8KKyAgY3JlYXRlVGFyYmFsbEZyb21TVk4gJHttb2R1bGV9Citkb25lCisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2VtYWNzL1JFQURNRSBiL3NyYy9MTFZNL3V0aWxzL2VtYWNzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODYyMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvZW1hY3MvUkVBRE1FCkBAIC0wLDAgKzEsMjcgQEAKKy0qLSBsbHZtL3V0aWxzL2VtYWNzL1JFQURNRSAtKi0NCisNCitUaGVzZSBhcmUgc3ludGF4IGhpZ2hsaWdodGluZyBmaWxlcyBmb3IgdGhlIEVtYWNzIGFuZCBYRW1hY3MgZWRpdG9ycy4gSW5jbHVkZWQNCithcmU6DQorDQorKiBsbHZtLW1vZGUuZWwNCisNCisgIFN5bnRheCBoaWdobGlnaHRpbmcgbW9kZSBmb3IgTExWTSBhc3NlbWJseSBmaWxlcy4gVG8gdXNlLCBhZGQgdGhpcyBjb2RlIHRvDQorICB5b3VyIH4vLmVtYWNzIDoNCisNCisgIChzZXRxIGxvYWQtcGF0aA0KKyAgICAoY29ucyAoZXhwYW5kLWZpbGUtbmFtZSAicGF0aC10by1sbHZtL3V0aWxzL2VtYWNzIikgbG9hZC1wYXRoKSkNCisgIChyZXF1aXJlICdsbHZtLW1vZGUpDQorICANCisqIHRhYmxlZ2VuLW1vZGUuZWwNCisNCisgIFN5bnRheCBoaWdobGlnaHRpbmcgbW9kZSBmb3IgVGFibGVHZW4gZGVzY3JpcHRpb24gZmlsZXMuIFRvIHVzZSwgYWRkIHRoaXMgY29kZQ0KKyAgdG8geW91ciB+Ly5lbWFjczoNCisNCisgIChzZXRxIGxvYWQtcGF0aA0KKyAgICAoY29ucyAoZXhwYW5kLWZpbGUtbmFtZSAicGF0aC10by1sbHZtL3V0aWxzL2VtYWNzIikgbG9hZC1wYXRoKSkNCisgIChyZXF1aXJlICd0YWJsZWdlbi1tb2RlKQ0KKw0KKw0KK05vdGU6IElmIHlvdSBub3RpY2UgbWlzc2luZyBvciBpbmNvcnJlY3Qgc3ludGF4IGhpZ2hsaWdodGluZywgcGxlYXNlIGNvbnRhY3QNCis8bGx2bWJ1Z3MgW2F0XSBjcy51aXVjLmVkdT47IGlmIHlvdSB3aXNoIHRvIHByb3ZpZGUgYSBwYXRjaCB0byBpbXByb3ZlIHRoZQ0KK2Z1bmN0aW9uYWxpdHksIGl0IHdpbGwgYmUgbW9zdCBhcHByZWNpYXRlZC4gVGhhbmsgeW91Lg0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2VtYWNzL2VtYWNzLmVsIGIvc3JjL0xMVk0vdXRpbHMvZW1hY3MvZW1hY3MuZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3ZWFhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2VtYWNzL2VtYWNzLmVsCkBAIC0wLDAgKzEsMzkgQEAKKzs7IExMVk0gY29kaW5nIHN0eWxlIGd1aWRlbGluZXMgaW4gZW1hY3MNCis7OyBNYWludGFpbmVyOiBMTFZNIFRlYW0sIGh0dHA6Ly9sbHZtLm9yZy8NCis7OyBNb2RpZmllZDogICAyMDA5LTA3LTI4DQorDQorOzsgTWF4IDgwIGNvbHMgcGVyIGxpbmUsIGluZGVudCBieSB0d28gc3BhY2VzLCBubyB0YWJzLg0KKzs7IEFwcGFyZW50bHksIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRhYnMgaW4gTWFrZWZpbGVzLg0KKyhjdXN0b20tc2V0LXZhcmlhYmxlcw0KKyAgJyhmaWxsLWNvbHVtbiA4MCkNCisgICcoYysrLWluZGVudC1sZXZlbCAyKQ0KKyAgJyhjLWJhc2ljLW9mZnNldCAyKQ0KKyAgJyhpbmRlbnQtdGFicy1tb2RlIG5pbCkpDQorDQorDQorOzsgQWx0ZXJuYXRpdmUgdG8gc2V0dGluZyB0aGUgZ2xvYmFsIHN0eWxlLiAgT25seSBmaWxlcyB3aXRoICJsbHZtIiBpbg0KKzs7IHRoZWlyIG5hbWVzIHdpbGwgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlIGxsdm0ub3JnIGNvZGluZyBzdHlsZS4NCisoYy1hZGQtc3R5bGUgImxsdm0ub3JnIg0KKyAgICAgICAgICAgICAnKChmaWxsLWNvbHVtbiAuIDgwKQ0KKwkgICAgICAgKGMrKy1pbmRlbnQtbGV2ZWwgLiAyKQ0KKwkgICAgICAgKGMtYmFzaWMtb2Zmc2V0IC4gMikNCisJICAgICAgIChpbmRlbnQtdGFicy1tb2RlIC4gbmlsKQ0KKyAgICAgICAgICAgICAgIChjLW9mZnNldHMtYWxpc3QgLiAoKGlubmFtZXNwYWNlIDApKSkpKQ0KKw0KKyhhZGQtaG9vayAnYy1tb2RlLWhvb2sNCisJICAoZnVuY3Rpb24NCisJICAgKGxhbWJkYSBuaWwgDQorCSAgICAgKGlmIChzdHJpbmctbWF0Y2ggImxsdm0iIGJ1ZmZlci1maWxlLW5hbWUpDQorCQkgKHByb2duDQorCQkgICAoYy1zZXQtc3R5bGUgImxsdm0ub3JnIikNCisJCSAgICkNCisJICAgICAgICkpKSkNCisNCisoYWRkLWhvb2sgJ2MrKy1tb2RlLWhvb2sNCisJICAoZnVuY3Rpb24NCisJICAgKGxhbWJkYSBuaWwgDQorCSAgICAgKGlmIChzdHJpbmctbWF0Y2ggImxsdm0iIGJ1ZmZlci1maWxlLW5hbWUpDQorCQkgKHByb2duDQorCQkgICAoYy1zZXQtc3R5bGUgImxsdm0ub3JnIikNCisJCSAgICkNCisJICAgICAgICkpKSkNCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9lbWFjcy9sbHZtLW1vZGUuZWwgYi9zcmMvTExWTS91dGlscy9lbWFjcy9sbHZtLW1vZGUuZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiNjBiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2VtYWNzL2xsdm0tbW9kZS5lbApAQCAtMCwwICsxLDEyOCBAQAorOzsgTWFpbnRhaW5lcjogIFRoZSBMTFZNIHRlYW0sIGh0dHA6Ly9sbHZtLm9yZy8NCis7OyBEZXNjcmlwdGlvbjogTWFqb3IgbW9kZSBmb3IgdGhlIExMVk0gYXNzZW1ibGVyIGxhbmd1YWdlLg0KKzs7IFVwZGF0ZWQ6ICAgICAyMDA3LTA5LTE5DQorDQorOzsgQ3JlYXRlIG1vZGUtc3BlY2lmaWMgdGFibGVzLg0KKyhkZWZ2YXIgbGx2bS1tb2RlLXN5bnRheC10YWJsZSBuaWwNCisgICJTeW50YXggdGFibGUgdXNlZCB3aGlsZSBpbiBMTFZNIG1vZGUuIikNCisNCisoZGVmdmFyIGxsdm0tZm9udC1sb2NrLWtleXdvcmRzDQorICAobGlzdA0KKyAgIDs7IENvbW1lbnRzDQorICAgJygiOy4qIiAuIGZvbnQtbG9jay1jb21tZW50LWZhY2UpDQorICAgOzsgVmFyaWFibGVzDQorICAgJygiJVstYS16QS1aJFwuX11bLWEtekEtWiRcLl8wLTldKiIgLiBmb250LWxvY2stdmFyaWFibGUtbmFtZS1mYWNlKQ0KKyAgIDs7IExhYmVscw0KKyAgICcoIlstYS16QS1aJFwuXzAtOV0rOiIgLiBmb250LWxvY2stdmFyaWFibGUtbmFtZS1mYWNlKQ0KKyAgIDs7IFN0cmluZ3MNCisgICAnKCJcIlteXCJdK1wiIiAuIGZvbnQtbG9jay1zdHJpbmctZmFjZSkNCisgICA7OyBVbm5hbWVkIHZhcmlhYmxlIHNsb3RzDQorICAgJygiJVstXT9bMC05XSsiIC4gZm9udC1sb2NrLXZhcmlhYmxlLW5hbWUtZmFjZSkNCisgICA7OyBUeXBlcw0KKyAgICcoIlxcYnZvaWRcXGJcXHxcXGJpWzAtOV0rXFxiXFx8XFxmbG9hdFxcYlxcfFxcYmRvdWJsZVxcYlxcfFxcYnR5cGVcXGJcXHxcXGJsYWJlbFxcYlxcfFxcYm9wYXF1ZVxcYiIgLiBmb250LWxvY2stdHlwZS1mYWNlKQ0KKyAgIDs7IEludGVnZXIgbGl0ZXJhbHMNCisgICAnKCJcXGJbLV0/WzAtOV0rXFxiIiAuIGZvbnQtbG9jay1wcmVwcm9jZXNzb3ItZmFjZSkNCisgICA7OyBGbG9hdGluZyBwb2ludCBjb25zdGFudHMNCisgICAnKCJcXGJbLStdP1swLTldK1wuWzAtOV0qXChbZUVdWy0rXT9bMC05XStcKT9cXGIiIC4gZm9udC1sb2NrLXByZXByb2Nlc3Nvci1mYWNlKQ0KKyAgIDs7IEhleCBjb25zdGFudHMNCisgICAnKCJcXGIweFswLTlBLUZhLWZdK1xcYiIgLiBmb250LWxvY2stcHJlcHJvY2Vzc29yLWZhY2UpDQorICAgOzsgS2V5d29yZHMNCisgICAnKCJcXGJiZWdpblxcYlxcfFxcYmVuZFxcYlxcfFxcYnRydWVcXGJcXHxcXGJmYWxzZVxcYlxcfFxcYnplcm9pbml0aWFsaXplclxcYlxcfFxcYmRlY2xhcmVcXGJcXHxcXGJkZWZpbmVcXGJcXHxcXGJnbG9iYWxcXGJcXHxcXGJjb25zdGFudFxcYlxcfFxcYmNvbnN0XFxiXFx8XFxiaW50ZXJuYWxcXGJcXHxcXGJsaW5rb25jZVxcYlxcfFxcYmxpbmtvbmNlX29kclxcYlxcfFxcYndlYWtcXGJcXHxcXGJ3ZWFrX29kclxcYlxcfFxcYmFwcGVuZGluZ1xcYlxcfFxcYnVuaW5pdGlhbGl6ZWRcXGJcXHxcXGJpbXBsZW1lbnRhdGlvblxcYlxcfFxcYlxcLlxcLlxcLlxcYlxcfFxcYm51bGxcXGJcXHxcXGJ1bmRlZlxcYlxcfFxcYnRvXFxiXFx8XFxiZXhjZXB0XFxiXFx8XFxibm90XFxiXFx8XFxidGFyZ2V0XFxiXFx8XFxiZW5kaWFuXFxiXFx8XFxibGl0dGxlXFxiXFx8XFxiYmlnXFxiXFx8XFxicG9pbnRlcnNpemVcXGJcXHxcXGJkZXBsaWJzXFxiXFx8XFxidm9sYXRpbGVcXGJcXHxcXGJmYXN0Y2NcXGJcXHxcXGJjb2xkY2NcXGJcXHxcXGJjY1xcYiIgLiBmb250LWxvY2sta2V5d29yZC1mYWNlKQ0KKyAgIDs7IEFyaXRobWV0aWMgYW5kIExvZ2ljYWwgT3BlcmF0b3JzDQorICAgJygiXFxiYWRkXFxiXFx8XFxic3ViXFxiXFx8XFxibXVsXFxiXFx8XFxiZGl2XFxiXFx8XFxicmVtXFxiXFx8XFxiYW5kXFxiXFx8XFxib3JcXGJcXHxcXGJ4b3JcXGJcXHxcXGJzZXRcXChuZVxcYlxcfFxcYmVxXFxiXFx8XFxibHRcXGJcXHxcXGJndFxcYlxcfFxcYmxlXFxiXFx8XFxiZ2VcXGJcXCkiIC4gZm9udC1sb2NrLWtleXdvcmQtZmFjZSkNCisgICA7OyBTcGVjaWFsIGluc3RydWN0aW9ucw0KKyAgICcoIlxcYnBoaVxcYlxcfFxcYnRhaWxcXGJcXHxcXGJjYWxsXFxiXFx8XFxiY2FzdFxcYlxcfFxcYnNlbGVjdFxcYlxcfFxcYnRvXFxiXFx8XFxic2hsXFxiXFx8XFxic2hyXFxiXFx8XFxidmFhcmdcXGJcXHxcXGJ2YW5leHRcXGIiIC4gZm9udC1sb2NrLWtleXdvcmQtZmFjZSkNCisgICA7OyBDb250cm9sIGluc3RydWN0aW9ucw0KKyAgICcoIlxcYnJldFxcYlxcfFxcYmJyXFxiXFx8XFxic3dpdGNoXFxiXFx8XFxiaW52b2tlXFxiXFx8XFxidW53aW5kXFxiXFx8XFxidW5yZWFjaGFibGVcXGIiIC4gZm9udC1sb2NrLWtleXdvcmQtZmFjZSkNCisgICA7OyBNZW1vcnkgb3BlcmF0b3JzDQorICAgJygiXFxibWFsbG9jXFxiXFx8XFxiYWxsb2NhXFxiXFx8XFxiZnJlZVxcYlxcfFxcYmxvYWRcXGJcXHxcXGJzdG9yZVxcYlxcfFxcYmdldGVsZW1lbnRwdHJcXGIiIC4gZm9udC1sb2NrLWtleXdvcmQtZmFjZSkNCisgICApDQorICAiU3ludGF4IGhpZ2hsaWdodGluZyBmb3IgTExWTSINCisgICkNCisNCis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bnRheCB0YWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCis7OyBTaGFtZWxlc3NseSByaXBwZWQgZnJvbSBqYXNtaW4uZWwNCis7OyBVUkw6IGh0dHA6Ly93d3cubmVpbHZhbmR5a2Uub3JnL2phc21pbi1lbWFjcy9qYXNtaW4uZWwuaHRtbA0KKw0KKyhpZiAobm90IGxsdm0tbW9kZS1zeW50YXgtdGFibGUpDQorICAgIChwcm9nbg0KKyAgICAgIChzZXRxIGxsdm0tbW9kZS1zeW50YXgtdGFibGUgKG1ha2Utc3ludGF4LXRhYmxlKSkNCisgICAgICAobWFwY2FyIChmdW5jdGlvbiAobGFtYmRhIChuKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgKGFyZWYgbiAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZWYgbiAxKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bS1tb2RlLXN5bnRheC10YWJsZSkpKQ0KKyAgICAgICAgICAgICAgJygNCisgICAgICAgICAgICAgICAgOzsgd2hpdGVzcGFjZSAoYCAnKQ0KKyAgICAgICAgICAgICAgICBbP1xebSAiICJdDQorICAgICAgICAgICAgICAgIFs/XGYgICIgIl0NCisgICAgICAgICAgICAgICAgWz9cbiAgIiAiXQ0KKyAgICAgICAgICAgICAgICBbP1x0ICAiICJdDQorICAgICAgICAgICAgICAgIFs/XCAgICIgIl0NCisgICAgICAgICAgICAgICAgOzsgd29yZCBjb25zdGl0dWVudHMgKGB3JykNCisgICAgICAgICAgICAgICAgOztbPzwgICJ3Il0NCisgICAgICAgICAgICAgICAgOztbPz4gICJ3Il0NCisgICAgICAgICAgICAgICAgWz9cJSAgInciXQ0KKyAgICAgICAgICAgICAgICA7O1s/XyAgIncgICJdDQorICAgICAgICAgICAgICAgIDs7IGNvbW1lbnRzDQorICAgICAgICAgICAgICAgIFs/XDsgICI8ICJdDQorICAgICAgICAgICAgICAgIFs/XG4gICI+ICJdDQorICAgICAgICAgICAgICAgIDs7Wz9cciAgIj4gIl0NCisgICAgICAgICAgICAgICAgOztbP1xebSAiPiAiXQ0KKyAgICAgICAgICAgICAgICA7OyBzeW1ib2wgY29uc3RpdHVlbnRzIChgXycpDQorICAgICAgICAgICAgICAgIDs7IHB1bmN0dWF0aW9uIChgLicpDQorICAgICAgICAgICAgICAgIDs7IG9wZW4gcGFyZW4gKGAoJykNCisgICAgICAgICAgICAgICAgWz9cKCAiKCJdDQorICAgICAgICAgICAgICAgIFs/XFsgIigiXQ0KKyAgICAgICAgICAgICAgICBbP1x7ICIoIl0NCisgICAgICAgICAgICAgICAgOzsgY2xvc2UgcGFyZW4gKGApJykNCisgICAgICAgICAgICAgICAgWz9cKSAiKSJdDQorICAgICAgICAgICAgICAgIFs/XF0gIikiXQ0KKyAgICAgICAgICAgICAgICBbP1x9ICIpIl0NCisgICAgICAgICAgICAgICAgOzsgc3RyaW5nIHF1b3RlICgnIicpDQorICAgICAgICAgICAgICAgIFs/XCIgIlwiIl0NCisgICAgICAgICAgICAgICAgKSkpKQ0KKw0KKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBYmJyZXYgdGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisoZGVmdmFyIGxsdm0tbW9kZS1hYmJyZXYtdGFibGUgbmlsDQorICAiQWJicmV2IHRhYmxlIHVzZWQgd2hpbGUgaW4gTExWTSBtb2RlLiIpDQorKGRlZmluZS1hYmJyZXYtdGFibGUgJ2xsdm0tbW9kZS1hYmJyZXYtdGFibGUgKCkpDQorDQorKGRlZnZhciBsbHZtLW1vZGUtaG9vayBuaWwpDQorKGRlZnZhciBsbHZtLW1vZGUtbWFwIG5pbCkgICA7IENyZWF0ZSBhIG1vZGUtc3BlY2lmaWMga2V5bWFwLg0KKw0KKyhpZiAobm90IGxsdm0tbW9kZS1tYXApDQorICAgICgpICA7IERvIG5vdCBjaGFuZ2UgdGhlIGtleW1hcCBpZiBpdCBpcyBhbHJlYWR5IHNldCB1cC4NCisgIChzZXRxIGxsdm0tbW9kZS1tYXAgKG1ha2Utc3BhcnNlLWtleW1hcCkpDQorICAoZGVmaW5lLWtleSBsbHZtLW1vZGUtbWFwICJcdCIgJ3RhYi10by10YWItc3RvcCkNCisgIChkZWZpbmUta2V5IGxsdm0tbW9kZS1tYXAgIlxlcyIgJ2NlbnRlci1saW5lKQ0KKyAgKGRlZmluZS1rZXkgbGx2bS1tb2RlLW1hcCAiXGVTIiAnY2VudGVyLXBhcmFncmFwaCkpDQorDQorDQorKGRlZnVuIGxsdm0tbW9kZSAoKQ0KKyAgIk1ham9yIG1vZGUgZm9yIGVkaXRpbmcgTExWTSBzb3VyY2UgZmlsZXMuDQorICBcXHtsbHZtLW1vZGUtbWFwfQ0KKyAgUnVucyBsbHZtLW1vZGUtaG9vayBvbiBzdGFydHVwLiINCisgIChpbnRlcmFjdGl2ZSkNCisgIChraWxsLWFsbC1sb2NhbC12YXJpYWJsZXMpDQorICAodXNlLWxvY2FsLW1hcCBsbHZtLW1vZGUtbWFwKSAgICAgICAgIDsgUHJvdmlkZXMgdGhlIGxvY2FsIGtleW1hcC4NCisgIChzZXRxIG1ham9yLW1vZGUgJ2xsdm0tbW9kZSkgICAgICAgICAgDQorDQorICAobWFrZS1sb2NhbC12YXJpYWJsZSAnZm9udC1sb2NrLWRlZmF1bHRzKQ0KKyAgKHNldHEgbWFqb3ItbW9kZSAnbGx2bS1tb2RlICAgICAgICAgICA7IFRoaXMgaXMgaG93IGRlc2NyaWJlLW1vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIGZpbmRzIHRoZSBkb2Mgc3RyaW5nIHRvIHByaW50Lg0KKyAgbW9kZS1uYW1lICJMTFZNIiAgICAgICAgICAgICAgICAgICAgICA7IFRoaXMgbmFtZSBnb2VzIGludG8gdGhlIG1vZGVsaW5lLg0KKyAgZm9udC1sb2NrLWRlZmF1bHRzIGAobGx2bS1mb250LWxvY2sta2V5d29yZHMpKQ0KKw0KKyAgKHNldHEgbG9jYWwtYWJicmV2LXRhYmxlIGxsdm0tbW9kZS1hYmJyZXYtdGFibGUpDQorICAoc2V0LXN5bnRheC10YWJsZSBsbHZtLW1vZGUtc3ludGF4LXRhYmxlKQ0KKyAgKHNldHEgY29tbWVudC1zdGFydCAiOyIpDQorICAocnVuLWhvb2tzICdsbHZtLW1vZGUtaG9vaykpICAgICAgICAgIDsgRmluYWxseSwgdGhpcyBwZXJtaXRzIHRoZSB1c2VyIHRvDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICBjdXN0b21pemUgdGhlIG1vZGUgd2l0aCBhIGhvb2suDQorDQorOzsgQXNzb2NpYXRlIC5sbCBmaWxlcyB3aXRoIGxsdm0tbW9kZQ0KKyhzZXRxIGF1dG8tbW9kZS1hbGlzdA0KKyAgIChhcHBlbmQgJygoIlxcLmxsJCIgLiBsbHZtLW1vZGUpKSBhdXRvLW1vZGUtYWxpc3QpKQ0KKw0KKyhwcm92aWRlICdsbHZtLW1vZGUpDQorOzsgZW5kIG9mIGxsdm0tbW9kZS5lbA0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2VtYWNzL3RhYmxlZ2VuLW1vZGUuZWwgYi9zcmMvTExWTS91dGlscy9lbWFjcy90YWJsZWdlbi1tb2RlLmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODlhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9lbWFjcy90YWJsZWdlbi1tb2RlLmVsCkBAIC0wLDAgKzEsMTI0IEBACis7OyBNYWludGFpbmVyOiAgVGhlIExMVk0gdGVhbSwgaHR0cDovL2xsdm0ub3JnLw0KKzs7IERlc2NyaXB0aW9uOiBNYWpvciBtb2RlIGZvciBUYWJsZUdlbiBkZXNjcmlwdGlvbiBmaWxlcyAocGFydCBvZiBMTFZNIHByb2plY3QpDQorOzsgVXBkYXRlZDogICAgIDIwMDctMTItMTgNCisNCisocmVxdWlyZSAnY29taW50KQ0KKyhyZXF1aXJlICdjdXN0b20pDQorKHJlcXVpcmUgJ2Fuc2ktY29sb3IpDQorDQorOzsgQ3JlYXRlIG1vZGUtc3BlY2lmaWMgdGFibGVzLg0KKyhkZWZ2YXIgdGQtZGVjb3JhdG9ycy1mYWNlICd0ZC1kZWNvcmF0b3JzLWZhY2UNCisgICJGYWNlIG1ldGhvZCBkZWNvcmF0b3JzLiIpDQorKG1ha2UtZmFjZSAndGQtZGVjb3JhdG9ycy1mYWNlKQ0KKw0KKyhkZWZ2YXIgdGFibGVnZW4tZm9udC1sb2NrLWtleXdvcmRzDQorICAobGV0ICgoa3cgKG1hcGNvbmNhdCAnaWRlbnRpdHkNCisgICAgICAgICAgICAgICAgICAgICAgICcoImNsYXNzIiAiZGVmbSIgImRlZiIgImZpZWxkIiAiaW5jbHVkZSIgImluIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAibGV0IiAibXVsdGljbGFzcyIpDQorICAgICAgICAgICAgICAgICAgICAgICAiXFx8IikpDQorICAgICAgICAodHlwZS1rdyAobWFwY29uY2F0ICdpZGVudGl0eQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCJiaXQiICJiaXRzIiAiY29kZSIgImRhZyIgImludCIgImxpc3QiICJzdHJpbmciKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFx8IikpDQorICAgICAgICApDQorICAgIChsaXN0DQorICAgICA7OyBDb21tZW50cw0KKzs7ICAgICAnKCJcL1wvIiAuIGZvbnQtbG9jay1jb21tZW50LWZhY2UpDQorICAgICA7OyBTdHJpbmdzDQorICAgICAnKCJcIlteXCJdK1wiIiAuIGZvbnQtbG9jay1zdHJpbmctZmFjZSkNCisgICAgIDs7IEhleCBjb25zdGFudHMNCisgICAgICcoIlxcPDB4WzAtOUEtRmEtZl0rXFw+IiAuIGZvbnQtbG9jay1wcmVwcm9jZXNzb3ItZmFjZSkNCisgICAgIDs7IEJpbmFyeSBjb25zdGFudHMNCisgICAgICcoIlxcPDBiWzAxXStcXD4iIC4gZm9udC1sb2NrLXByZXByb2Nlc3Nvci1mYWNlKQ0KKyAgICAgOzsgSW50ZWdlciBsaXRlcmFscw0KKyAgICAgJygiXFw8Wy1dP1swLTldK1xcPiIgLiBmb250LWxvY2stcHJlcHJvY2Vzc29yLWZhY2UpDQorICAgICA7OyBGbG9hdGluZyBwb2ludCBjb25zdGFudHMNCisgICAgICcoIlxcPFstK10/WzAtOV0rXC5bMC05XSpcKFtlRV1bLStdP1swLTldK1wpP1xcPiIgLiBmb250LWxvY2stcHJlcHJvY2Vzc29yLWZhY2UpDQorDQorICAgICAnKCJeWyBcdF0qXFwoQC4rXFwpIiAxICd0ZC1kZWNvcmF0b3JzLWZhY2UpDQorICAgICA7OyBLZXl3b3Jkcw0KKyAgICAgKGNvbnMgKGNvbmNhdCAiXFw8XFwoIiBrdyAiXFwpXFw+WyBcblx0KF0iKSAxKQ0KKw0KKyAgICAgOzsgVHlwZSBrZXl3b3Jkcw0KKyAgICAgKGNvbnMgKGNvbmNhdCAiXFw8XFwoIiB0eXBlLWt3ICJcXClbIFxuXHQoXSIpIDEpDQorICAgICApKQ0KKyAgIkFkZGl0aW9uYWwgZXhwcmVzc2lvbnMgdG8gaGlnaGxpZ2h0IGluIFRhYmxlR2VuIG1vZGUuIikNCisocHV0ICd0YWJsZWdlbi1tb2RlICdmb250LWxvY2stZGVmYXVsdHMgJyh0YWJsZWdlbi1mb250LWxvY2sta2V5d29yZHMpKQ0KKw0KKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3ludGF4IHRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKzs7IFNoYW1lbGVzc2x5IHJpcHBlZCBmcm9tIGphc21pbi5lbA0KKzs7IFVSTDogaHR0cDovL3d3dy5uZWlsdmFuZHlrZS5vcmcvamFzbWluLWVtYWNzL2phc21pbi5lbA0KKw0KKyhkZWZ2YXIgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUgbmlsDQorICAiU3ludGF4IHRhYmxlIHVzZWQgaW4gYHRhYmxlZ2VuLW1vZGUnIGJ1ZmZlcnMuIikNCisod2hlbiAobm90IHRhYmxlZ2VuLW1vZGUtc3ludGF4LXRhYmxlKQ0KKyAgKHNldHEgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUgKG1ha2Utc3ludGF4LXRhYmxlKSkNCisgIDs7IHdoaXRlc3BhY2UgKGAgJykNCisgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cICAgIiAiICAgICAgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUpDQorICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XHQgICIgIiAgICAgIHRhYmxlZ2VuLW1vZGUtc3ludGF4LXRhYmxlKQ0KKyAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1xyICAiICIgICAgICB0YWJsZWdlbi1tb2RlLXN5bnRheC10YWJsZSkNCisgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cbiAgIiAiICAgICAgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUpDQorICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XGYgICIgIiAgICAgIHRhYmxlZ2VuLW1vZGUtc3ludGF4LXRhYmxlKQ0KKyAgOzsgd29yZCBjb25zdGl0dWVudHMgKGB3JykNCisgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cJSAgInciICAgICAgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUpDQorICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XF8gICJ3IiAgICAgIHRhYmxlZ2VuLW1vZGUtc3ludGF4LXRhYmxlKQ0KKyAgOzsgY29tbWVudHMNCisgIChtb2RpZnktc3ludGF4LWVudHJ5ID8vICAgIi4gMTI0YiIgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUpDQorICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/KiAgICIuIDIzIiAgIHRhYmxlZ2VuLW1vZGUtc3ludGF4LXRhYmxlKQ0KKyAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1xuICAiPiBiIiAgICB0YWJsZWdlbi1tb2RlLXN5bnRheC10YWJsZSkNCisgIDs7IG9wZW4gcGFyZW4gKGAoJykNCisgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cKCAgIigiICAgICAgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUpDQorICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XFsgICIoIiAgICAgIHRhYmxlZ2VuLW1vZGUtc3ludGF4LXRhYmxlKQ0KKyAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1x7ICAiKCIgICAgICB0YWJsZWdlbi1tb2RlLXN5bnRheC10YWJsZSkNCisgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cPCAgIigiICAgICAgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUpDQorICA7OyBjbG9zZSBwYXJlbiAoYCknKQ0KKyAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1wpICAiKSIgICAgICB0YWJsZWdlbi1tb2RlLXN5bnRheC10YWJsZSkNCisgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cXSAgIikiICAgICAgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUpDQorICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XH0gICIpIiAgICAgIHRhYmxlZ2VuLW1vZGUtc3ludGF4LXRhYmxlKQ0KKyAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1w+ICAiKSIgICAgICB0YWJsZWdlbi1tb2RlLXN5bnRheC10YWJsZSkNCisgIDs7IHN0cmluZyBxdW90ZSAoJyInKQ0KKyAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1wiICAiXCIiICAgICB0YWJsZWdlbi1tb2RlLXN5bnRheC10YWJsZSkNCisgICkNCisNCis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWJicmV2IHRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorKGRlZnZhciB0YWJsZWdlbi1tb2RlLWFiYnJldi10YWJsZSBuaWwNCisgICJBYmJyZXYgdGFibGUgdXNlZCB3aGlsZSBpbiBUYWJsZUdlbiBtb2RlLiIpDQorKGRlZmluZS1hYmJyZXYtdGFibGUgJ3RhYmxlZ2VuLW1vZGUtYWJicmV2LXRhYmxlICgpKQ0KKw0KKyhkZWZ2YXIgdGFibGVnZW4tbW9kZS1ob29rIG5pbCkNCisoZGVmdmFyIHRhYmxlZ2VuLW1vZGUtbWFwIG5pbCkgICA7IENyZWF0ZSBhIG1vZGUtc3BlY2lmaWMga2V5bWFwLg0KKw0KKyhpZiAobm90IHRhYmxlZ2VuLW1vZGUtbWFwKQ0KKyAgICAoKSAgOyBEbyBub3QgY2hhbmdlIHRoZSBrZXltYXAgaWYgaXQgaXMgYWxyZWFkeSBzZXQgdXAuDQorICAoc2V0cSB0YWJsZWdlbi1tb2RlLW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkNCisgIChkZWZpbmUta2V5IHRhYmxlZ2VuLW1vZGUtbWFwICJcdCIgICd0YWItdG8tdGFiLXN0b3ApDQorICAoZGVmaW5lLWtleSB0YWJsZWdlbi1tb2RlLW1hcCAiXGVzIiAnY2VudGVyLWxpbmUpDQorICAoZGVmaW5lLWtleSB0YWJsZWdlbi1tb2RlLW1hcCAiXGVTIiAnY2VudGVyLXBhcmFncmFwaCkpDQorDQorKGRlZnVuIHRhYmxlZ2VuLW1vZGUgKCkNCisgICJNYWpvciBtb2RlIGZvciBlZGl0aW5nIFRhYmxlR2VuIGRlc2NyaXB0aW9uIGZpbGVzLg0KKyAgXFx7dGFibGVnZW4tbW9kZS1tYXB9DQorICBSdW5zIHRhYmxlZ2VuLW1vZGUtaG9vayBvbiBzdGFydHVwLiINCisgIChpbnRlcmFjdGl2ZSkNCisgIChraWxsLWFsbC1sb2NhbC12YXJpYWJsZXMpDQorICAodXNlLWxvY2FsLW1hcCB0YWJsZWdlbi1tb2RlLW1hcCkgICAgICA7IFByb3ZpZGVzIHRoZSBsb2NhbCBrZXltYXAuDQorICAobWFrZS1sb2NhbC12YXJpYWJsZSAnZm9udC1sb2NrLWRlZmF1bHRzKQ0KKyAgKHNldHEgbWFqb3ItbW9kZSAndGFibGVnZW4tbW9kZSAgICAgICAgOyBUaGlzIGlzIGhvdyBkZXNjcmliZS1tb2RlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgZmluZHMgdGhlIGRvYyBzdHJpbmcgdG8gcHJpbnQuDQorCW1vZGUtbmFtZSAgICAgICAgICAgICAiVGFibGVHZW4iIDsgVGhpcyBuYW1lIGdvZXMgaW50byB0aGUgbW9kZWxpbmUuDQorICAgICAgICBsb2NhbC1hYmJyZXYtdGFibGUgICAgdGFibGVnZW4tbW9kZS1hYmJyZXYtdGFibGUNCisJZm9udC1sb2NrLWRlZmF1bHRzICAgIGAodGFibGVnZW4tZm9udC1sb2NrLWtleXdvcmRzKQ0KKwlyZXF1aXJlLWZpbmFsLW5ld2xpbmUgdA0KKyAgICAgICAgKQ0KKw0KKyAgKHNldC1zeW50YXgtdGFibGUgdGFibGVnZW4tbW9kZS1zeW50YXgtdGFibGUpDQorICAobWFrZS1sb2NhbC12YXJpYWJsZSAnY29tbWVudC1zdGFydCkNCisgIChzZXRxIGNvbW1lbnQtc3RhcnQgIi8vIikNCisgIChydW4taG9va3MgJ3RhYmxlZ2VuLW1vZGUtaG9vaykpICAgICAgIDsgRmluYWxseSwgdGhpcyBwZXJtaXRzIHRoZSB1c2VyIHRvDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgY3VzdG9taXplIHRoZSBtb2RlIHdpdGggYSBob29rLg0KKw0KKzs7IEFzc29jaWF0ZSAudGQgZmlsZXMgd2l0aCB0YWJsZWdlbi1tb2RlDQorKHNldHEgYXV0by1tb2RlLWFsaXN0IChhcHBlbmQgJygoIlxcLnRkJCIgLiB0YWJsZWdlbi1tb2RlKSkgYXV0by1tb2RlLWFsaXN0KSkNCisNCisocHJvdmlkZSAndGFibGVnZW4tbW9kZSkNCis7OyBlbmQgb2YgdGFibGVnZW4tbW9kZS5lbA0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2ZpbmRtaXNvcHQgYi9zcmMvTExWTS91dGlscy9maW5kbWlzb3B0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzAwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9maW5kbWlzb3B0CkBAIC0wLDAgKzEsMTc4IEBACisjIS9iaW4vYmFzaA0KKyMNCisjICBmaW5kbWlzb3B0DQorIw0KKyMgICAgICBUaGlzIGlzIGEgcXVpY2sgYW5kIGRpcnR5IGhhY2sgdG8gcG90ZW50aWFsbHkgZmluZCBhIG1pc29wdGltaXphdGlvbg0KKyMgICAgICBwcm9ibGVtLiBNb3N0bHkgaXRzIHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIGluIGJ1Z3BvaW50IHRoYXQgcHJldmVudA0KKyMgICAgICBpdCBmcm9tIGZpbmRpbmcgYSBwcm9ibGVtIHVubGVzcyB0aGUgc2V0IG9mIGZhaWxpbmcgb3B0aW1pemF0aW9ucyBhcmUNCisjICAgICAga25vd24gYW5kIGdpdmVuIHRvIGl0IG9uIHRoZSBjb21tYW5kIGxpbmUuDQorIw0KKyMgICAgICBHaXZlbiBhIGJ5dGVjb2RlIGZpbGUgdGhhdCBwcm9kdWNlcyBjb3JyZWN0IG91dHB1dCAob3IgcmV0dXJuIGNvZGUpLCANCisjICAgICAgdGhpcyBzY3JpcHQgd2lsbCBydW4gdGhyb3VnaCBhbGwgdGhlIG9wdGltaXphdGlvbnMgcGFzc2VzIHRoYXQgZ2NjYXMNCisjICAgICAgdXNlcyAoaW4gdGhlIHNhbWUgb3JkZXIpIGFuZCB3aWxsIG5hcnJvdyBkb3duIHdoaWNoIG9wdGltaXphdGlvbnMNCisjICAgICAgY2F1c2UgdGhlIHByb2dyYW0gZWl0aGVyIGdlbmVyYXRlIGRpZmZlcmVudCBvdXRwdXQgb3IgcmV0dXJuIGEgDQorIyAgICAgIGRpZmZlcmVudCByZXN1bHQgY29kZS4gV2hlbiB0aGUgcGFzc2VzIGhhdmUgYmVlbiBuYXJyb3dlZCBkb3duLCANCisjICAgICAgYnVncG9pbnQgaXMgaW52b2tlZCB0byBmdXJ0aGVyIHJlZmluZSB0aGUgcHJvYmxlbSB0byBpdHMgb3JpZ2luLiBJZiBhDQorIyAgICAgIHJlbGVhc2UgdmVyc2lvbiBvZiBidWdwb2ludCBpcyBhdmFpbGFibGUgaXQgd2lsbCBiZSB1c2VkLCBvdGhlcndpc2UgDQorIyAgICAgIGRlYnVnLg0KKyMNCisjICAgVXNhZ2U6DQorIyAgICAgIGZpbmRtaXNvcHQgYmNmaWxlIG91dGRpciBwcm9nYXJncyBbbWF0Y2hdDQorIw0KKyMgICBXaGVyZToNCisjICAgICAgYmNmaWxlIA0KKyMgICAgICAgICAgaXMgdGhlIGJ5dGVjb2RlIGZpbGUgaW5wdXQgKHRoZSB1bm9wdGltaXplZCB3b3JraW5nIGNhc2UpDQorIyAgICAgIG91dGRpcg0KKyMgICAgICAgICAgaXMgYSBkaXJlY3RvcnkgaW50byB3aGljaCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBhcmUgcGxhY2VkDQorIyAgICAgIHByb2dhcmdzDQorIyAgICAgICAgICBpcyBhIHNpbmdsZSBhcmd1bWVudCBjb250YWluaW5nIGFsbCB0aGUgYXJndW1lbnRzIHRoZSBwcm9ncmFtIG5lZWRzDQorIyAgICAgIHByb2dpbnB1dA0KKyMgICAgICAgICAgaXMgYSBmaWxlIG5hbWUgZnJvbSB3aGljaCBzdGRpbiBzaG91bGQgYmUgZGlyZWN0ZWQNCisjICAgICAgbWF0Y2gNCisjICAgICAgICAgIGlmIHNwZWNpZmllZCB0byBhbnkgdmFsdWUgY2F1c2VzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgcHJvZ3JhbSB0bw0KKyMgICAgICAgICAgYmUgdXNlZCB0byBkZXRlcm1pbmUgc3VjY2Vzcy9mYWlsLiBJZiBub3Qgc3BlY2lmaWVkIHN1Y2Nlc3MvZmFpbCBpcw0KKyMgICAgICAgICAgZGV0ZXJtaW5lZCBieSBkaWZmaW5nIHRoZSBwcm9ncmFtJ3Mgb3V0cHV0IHdpdGggdGhlIG5vbi1vcHRpbWl6ZWQNCisjICAgICAgICAgIG91dHB1dC4NCisjICAgICAgIA0KK2lmIFsgIiQjIiAtbHQgMyBdIDsgdGhlbg0KKyAgZWNobyAidXNhZ2U6IGZpbmRtaXNvcHQgYmNmaWxlIG91dGRpciBwcm9nYXJncyBbbWF0Y2hdIg0KKyAgZXhpdCAxDQorZmkNCisNCitkaXI9IiR7MCUlL3V0aWxzL2ZpbmRtaXNvcHR9Ig0KK2lmIFsgLXggIiRkaXIvUmVsZWFzZS9iaW4vYnVncG9pbnQiIF0gOyB0aGVuDQorICBidWdwb2ludD0iJGRpci9SZWxlYXNlL2Jpbi9idWdwb2ludCINCitlbGlmIFsgLXggIiRkaXIvRGVidWcvYmluL2J1Z3BvaW50IiBdIDsgdGhlbg0KKyAgYnVncG9pbnQ9IiRkaXIvRGVidWcvYmluL2J1Z3BvaW50Ig0KK2Vsc2UNCisgIGVjaG8gImZpbmRtaXNvcHQ6IGJ1Z3BvaW50IG5vdCBmb3VuZCINCisgIGV4aXQgMQ0KK2ZpDQorDQorYmNmaWxlPSIkMSINCitvdXRkaXI9IiQyIg0KK2FyZ3M9IiQzIg0KK2lucHV0PSIkNCINCitpZiBbICEgLWYgIiRpbnB1dCIgXSA7IHRoZW4NCisgIGlucHV0PSIvZGV2L251bGwiDQorZmkNCittYXRjaD0iJDUiDQorbmFtZT1gYmFzZW5hbWUgJGJjZmlsZSAuYmNgDQorbGw9IiRvdXRkaXIvJHtuYW1lfS5sbCINCitzPSIkb3V0ZGlyLyR7bmFtZX0ucyINCitwcm9nPSIkb3V0ZGlyLyR7bmFtZX0iDQorb3V0PSIkb3V0ZGlyLyR7bmFtZX0ub3V0Ig0KK29wdGJjPSIkb3V0ZGlyLyR7bmFtZX0ub3B0LmJjIg0KK29wdGxsPSIkb3V0ZGlyLyR7bmFtZX0ub3B0LmxsIg0KK29wdHM9IiRvdXRkaXIvJHtuYW1lfS5vcHQucyINCitvcHRwcm9nPSIkb3V0ZGlyLyR7bmFtZX0ub3B0Ig0KK29wdG91dD0iJG91dGRpci8ke25hbWV9Lm9wdC5vdXQiDQorbGRmbGFncz0iLWxzdGRjKysgLWxtIC1sZGwgLWxjIg0KKw0KK2VjaG8gIlRlc3QgTmFtZTogJG5hbWUiDQorZWNobyAiVW5vcHRpbWl6ZWQgcHJvZ3JhbTogJHByb2ciDQorZWNobyAiICBPcHRpbWl6ZWQgcHJvZ3JhbTogJG9wdHByb2ciDQorDQorIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygb3B0aW1pemF0aW9ucyB0byBydW4uIFRoaXMgY29tcHJpc2VzIHRoZSBzYW1lIHNldCBvZiANCisjIG9wdGltaXphdGlvbnMgdGhhdCBvcHQgLXN0ZC1jb21waWxlLW9wdHMgYW5kIGdjY2xkIHJ1biwgaW4gdGhlIHNhbWUgb3JkZXIuDQorb3B0X3N3aXRjaGVzPWBsbHZtLWFzIDwgL2Rldi9udWxsIC1vIC0gfCBvcHQgLXN0ZC1jb21waWxlLW9wdHMgLWRpc2FibGUtb3V0cHV0IC1kZWJ1Zy1wYXNzPUFyZ3VtZW50cyAyPiYxIHwgc2VkICdzL1Bhc3MgQXJndW1lbnRzOiAvLydgDQorbGRfc3dpdGNoZXM9YGxsdm0tYXMgPCAvZGV2L251bGwgLW8gLSB8IGxsdm0tbGQgLSAtZGVidWctcGFzcz1Bcmd1bWVudHMgMj4mMSB8IHNlZCAncy9QYXNzIEFyZ3VtZW50czogLy8nYA0KK2FsbF9zd2l0Y2hlcz0iJG9wdF9zd2l0Y2hlcyAkbGRfc3dpdGNoZXMiDQorZWNobyAiUGFzc2VzIDogJGFsbF9zd2l0Y2hlcyINCisNCisjIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QNCitpZiBbIC1mICIkb3V0ZGlyIiBdIDsgdGhlbg0KKyAgZWNobyAiJG91dGRpciBpcyBub3QgYSBkaXJlY3RvcnkiDQorICBleGl0IDENCitmaQ0KKw0KK2lmIFsgISAtZCAiJG91dGRpciIgXSA7IHRoZW4NCisgIG1rZGlyICIkb3V0ZGlyIiB8fCBleGl0IDENCitmaQ0KKw0KKyMgR2VuZXJhdGUgdGhlIGRpc2Fzc2VtYmx5DQorbGx2bS1kaXMgIiRiY2ZpbGUiIC1vICIkbGwiIC1mIHx8IGV4aXQgMQ0KKw0KKyMgR2VuZXJhdGUgdGhlIG5vbi1vcHRpbWl6ZWQgcHJvZ3JhbSBhbmQgaXRzIG91dHB1dA0KK2xsYyAiJGJjZmlsZSIgLW8gIiRzIiAtZiB8fCBleGl0IDENCitnY2MgIiRzIiAtbyAiJHByb2ciICRsZGZsYWdzIHx8IGV4aXQgMQ0KKyIkcHJvZyIgJGFyZ3MgPiAiJG91dCIgMj4mMSA8JGlucHV0DQorZXgxPSQ/DQorDQorIyBDdXJyZW50IHNldCBvZiBzd2l0Y2hlcyBpcyBlbXB0eQ0KK2Z1bmN0aW9uIHRyeWl0IHsNCisgIHN3aXRjaGVzX3RvX3VzZT0iJDEiDQorICBvcHQgJHN3aXRjaGVzX3RvX3VzZSAiJGJjZmlsZSIgLW8gIiRvcHRiYyIgLWYgfHwgZXhpdA0KKyAgbGx2bS1kaXMgIiRvcHRiYyIgLW8gIiRvcHRsbCIgLWYgfHwgZXhpdA0KKyAgbGxjICIkb3B0YmMiIC1vICIkb3B0cyIgLWYgfHwgZXhpdA0KKyAgZ2NjICIkb3B0cyIgLW8gIiRvcHRwcm9nIiAkbGRmbGFncyB8fCBleGl0DQorICAiJG9wdHByb2ciICRhcmdzID4gIiRvcHRvdXQiIDI+JjEgPCIkaW5wdXQiDQorICBleDI9JD8NCisNCisgIGlmIFsgLW4gIiRtYXRjaCIgXSA7IHRoZW4NCisgICAgaWYgWyAiJGV4MSIgLW5lICIkZXgyIiBdIDsgdGhlbg0KKyAgICAgIGVjaG8gIlJldHVybiBjb2RlIG5vdCB0aGUgc2FtZSB3aXRoIHRoZXNlIHN3aXRjaGVzOiINCisgICAgICBlY2hvICRzd2l0Y2hlcw0KKyAgICAgIGVjaG8gIlVub3B0aW1pemVkIHJldHVybmVkOiAkZXgxIg0KKyAgICAgIGVjaG8gIk9wdGltaXplZCAgIHJldHVybmVkOiAkZXgyIg0KKyAgICAgIHJldHVybiAwDQorICAgIGZpDQorICBlbHNlDQorICAgIGRpZmYgIiRvdXQiICIkb3B0b3V0IiA+IC9kZXYvbnVsbA0KKyAgICBpZiBbICQ/IC1uZSAwIF0gOyB0aGVuDQorICAgICAgZWNobyAiRGlmZiBmYWlscyB3aXRoIHRoZXNlIHN3aXRjaGVzOiINCisgICAgICBlY2hvICRzd2l0Y2hlcw0KKyAgICAgIGVjaG8gIkRpZmZlcmVuY2VzOiINCisgICAgICBkaWZmICIkb3V0IiAiJG9wdG91dCIgfCBoZWFkDQorICAgICAgcmV0dXJuIDA7DQorICAgIGZpDQorICBmaQ0KKyAgcmV0dXJuIDENCit9DQorDQorZWNobyAiVHJ5aW5nIHRvIGZpbmQgb3B0aW1pemF0aW9uIHRoYXQgYnJlYWtzIHByb2dyYW06Ig0KK2ZvciBzdyBpbiAkYWxsX3N3aXRjaGVzIDsgZG8NCisgIGVjaG8gLW4gIiAkc3ciDQorICBzd2l0Y2hlcz0iJHN3aXRjaGVzICRzdyINCisgIGlmIHRyeWl0ICIkc3dpdGNoZXMiIDsgdGhlbg0KKyAgICBicmVhazsNCisgIGZpDQorZG9uZQ0KKw0KKyMgVGVybWluYXRlIHRoZSBwcmV2aW91cyBvdXRwdXQgd2l0aCBhIG5ld2xpbmUNCitlY2hvICIiDQorDQorIyBEZXRlcm1pbmUgaWYgd2UncmUgZG9uZSBiZWNhdXNlIG5vbmUgb2YgdGhlIG9wdGltaXphdGlvbnMgYnJva2UgdGhlIHByb2dyYW0NCitpZiBbICIkc3dpdGNoZXMiID09ICIgJGFsbF9zd2l0Y2hlcyIgXSA7IHRoZW4NCisgIGVjaG8gIlRoZSBwcm9ncmFtIGRpZCBub3QgbWlzY29tcGlsZSINCisgIGV4aXQgMA0KK2ZpDQorDQorZmluYWw9IiINCit3aGlsZSBbICEgLXogIiRzd2l0Y2hlcyIgXSA7IGRvDQorICB0cmltbWVkPWBlY2hvICIkc3dpdGNoZXMiIHwgc2VkIC1lICdzL14gKlwoLVteIF0qXCkuKi9cMS8nYA0KKyAgc3dpdGNoZXM9YGVjaG8gIiRzd2l0Y2hlcyIgfCBzZWQgLWUgJ3MvXiAqLVteIF0qICovLydgDQorICBlY2hvICJUcmltbWVkICR0cmltbWVkIGZyb20gbGVmdCINCisgIHRyeWl0ICIkZmluYWwgJHN3aXRjaGVzIg0KKyAgaWYgWyAiJD8iIC1lcSAiMCIgXSA7IHRoZW4NCisgICAgZWNobyAiU3RpbGwgRmFpbGluZyAuLiBjb250aW51aW5nIC4uLiINCisgICAgY29udGludWUNCisgIGVsc2UNCisgICAgZWNobyAiRm91bmQgcmVxdWlyZWQgZWFybHkgcGFzczogJHRyaW1tZWQiDQorICAgIGZpbmFsPSIkZmluYWwgJHRyaW1tZWQiDQorICAgIGNvbnRpbnVlDQorICBmaQ0KKyAgZWNobyAiTmV4dCBMb29wIg0KK2RvbmUNCisNCitpZiBbICIkZmluYWwiID09ICIgJGFsbF9zd2l0Y2hlcyIgXSA7IHRoZW4NCisgIGVjaG8gImZpbmRtaXNvcHQ6IEFsbCBvcHRpbWl6YXRpb25zIHBhc3MuIFBlcmhhcHMgdGhpcyBpc24ndCBhIG1pc29wdD8iDQorICBleGl0IDANCitmaQ0KK2VjaG8gIlNtYWxsZXN0IE9wdGltaXphdGlvbiBsaXN0PSRmaW5hbCINCisNCiticGNtZD0iJGJ1Z3BvaW50IC1ydW4tbGxjIC1kaXNhYmxlLWxvb3AtZXh0cmFjdGlvbiAtLW91dHB1dCAiJG91dCIgLS1pbnB1dCAvZGV2L251bGwgJGJjZmlsZSAkZmluYWwgLS1hcmdzICRhcmdzIg0KKw0KK2VjaG8gIlJ1bm5pbmc6ICRicGNtZCINCiskYnBjbWQNCitlY2hvICJmaW5kbWlzb3B0IGZpbmlzaGVkLiINCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9maW5kb3B0ZGlmZiBiL3NyYy9MTFZNL3V0aWxzL2ZpbmRvcHRkaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OWRkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9maW5kb3B0ZGlmZgpAQCAtMCwwICsxLDEwMSBAQAorIyEvYmluL2Jhc2gNCisjDQorIyAgZmluZG9wdGRpZmYNCisjDQorIyAgICAgIFRoaXMgc2NyaXB0IGhlbHBzIGZpbmQgdGhlIG9wdGltaXphdGlvbiBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxsdm0NCisjICAgICAgYnVpbGRzLiBJdCBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGJ1aWxkIHRoYXQgaXMga25vd24gdG8gd29yayBhbmQNCisjICAgICAgb25lIHRoYXQgZXhoaWJpdHMgYW4gb3B0aW1pemF0aW9uIHByb2JsZW0uIElkZW50aWZ5aW5nIHRoZSBkaWZmZXJlbmNlDQorIyAgICAgIGJldHdlZW4gdGhlIHR3byBidWlsZHMgY2FuIGxlYWQgdG8gZGlzY292ZXJ5IG9mIHRoZSBzb3VyY2Ugb2YgYQ0KKyMgICAgICBtaXMtb3B0aW1pemF0aW9uLg0KKyMNCisjICAgICAgVGhlIHNjcmlwdCB0YWtlcyB0d28gbGx2bSBidWlsZCBwYXRocyBhcyBhcmd1bWVudHMuIFRoZXNlIHNwZWNpZnkgdGhlDQorIyAgICAgIHRoZSB0d28gbGx2bSBidWlsZHMgdG8gY29tcGFyZS4gSXQgaXMgZ2VuZXJhbGx5IGV4cGVjdGVkIHRoYXQgdGhleQ0KKyMgICAgICBhcmUgImNsb3NlIGNvdXNpbnMiLiAgVGhhdCBpcywgdGhleSBhcmUgdGhlIHNhbWUgZXhjZXB0IHRoYXQgdGhlIA0KKyMgICAgICBzZWNvbmQgYnVpbGQgY29udGFpbnMgc29tZSBleHBlcmltZW50YWwgb3B0aW1pemF0aW9uIGZlYXR1cmVzIHRoYXQNCisjICAgICAgYXJlIHN1c3BlY3RlZCBvZiBwcm9kdWNpbmcgYSBtaXNvcHRpbWl6YXRpb24uDQorIw0KKyMgICAgICBUaGUgc2NyaXB0IHRha2VzIHR3byBieXRlY29kZSBmaWxlcywgb25lIGZyb20gZWFjaCBidWlsZC4gVGhleSBhcmUNCisjICAgICAgcHJlc3VtZWQgdG8gYmUgYSBjb21waWxhdGlvbiBvZiB0aGUgc2FtZSBwcm9ncmFtIG9yIHByb2dyYW0gZnJhZ21lbnQNCisjICAgICAgd2l0aCB0aGUgb25seSBkaWZmZXJlbmNlIGJlaW5nIHRoZSBidWlsZHMuDQorIw0KKyMgICAgICBUaGUgc2NyaXB0IG9wZXJhdGVzIGJ5IGl0ZXJhdGl2ZWx5IGFwcGx5aW5nIHRoZSBvcHRpbWl6YXRpb25zIHRoYXQgZ2NjYXMNCisjICAgICAgYW5kIGdjY2xkIHJ1biB1bnRpbCB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gdGhlIGFzc2VtYmx5IHJlc3VsdGluZw0KKyMgICAgICBmcm9tIHRoZSBvcHRpbWl6YXRpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoZW4gcmVwb3J0ZWQgd2l0aCB0aGUgc2V0IG9mDQorIyAgICAgIG9wdGltaXphdGlvbiBwYXNzZXMgdGhhdCBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlLiAgVGhlIHByb2Nlc3NpbmcgDQorIyAgICAgIGNvbnRpbnVlcyB1bnRpbCBhbGwgb3B0aW1pemF0aW9uIHBhc3NlcyBoYXZlIGJlZW4gdHJpZWQuIFRoZSBkaWZmZXJlbmNlcw0KKyMgICAgICBmb3IgZWFjaCBwYXNzLCBpZiB0aGV5IGRvIGRpZmZlciwgYXJlIHBsYWNlZCBpbiBhIGRpZmZzLiMgZmlsZS4NCisjDQorIyAgICAgIFRvIHdvcmsgYXJvdW5kIGRpZmZlcmVuY2VzIGluIHRoZSBhc3NlbWJseSBsYW5ndWFnZSBmb3JtYXQsIHRoZSBzY3JpcHQNCisjICAgICAgY2FuIGFsc28gdGFrZSB0d28gZmlsdGVyIGFyZ3VtZW50cyB0aGF0IHBvc3QtcHJvY2VzcyB0aGUgYXNzZW1ibHkgDQorIyAgICAgIHNvIHRoZXkgY2FuIGJlIGRpZmZlcmVuY2VkIHdpdGhvdXQgbWFraW5nIGZhbHNlIHBvc2l0aXZlcyBmb3Iga25vd24NCisjICAgICAgZGlmZmVyZW5jZXMgaW4gdGhlIHR3byBidWlsZHMuIFRoZXNlIGZpbHRlcnMgYXJlIG9wdGlvbmFsLg0KKyMNCisjICAgVXNhZ2U6DQorIyAgICAgIGZpbmRvcHRkaWZmIGxsdm0xIGxsdm0yIGJjMSBiYzIgZmlsdGVyMSBmaWx0ZXIyDQorIw0KKyMgICBXaGVyZToNCisjICAgICAgbGx2bTENCisjICAgICAgICAgIGlzIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBsbHZtIGJ1aWxkIGRpcg0KKyMgICAgICBsbHZtMg0KKyMgICAgICAgICAgaXMgdGhlIHBhdGggdG8gdGhlIHNlY29uZCBsbHZtIGJ1aWxkIGRpcg0KKyMgICAgICBiYzENCisjICAgICAgICAgIGlzIHRoZSBieXRlY29kZSBmaWxlIGZvciB0aGUgZmlyc3QgbGx2bSBlbnZpcm9ubWVudA0KKyMgICAgICBiYzINCisjICAgICAgICAgIGlzIHRoZSBieXRlY29kZSBmaWxlIGZvciB0aGUgc2Vjb25kIGxsdm0gZW52aXJvbm1lbnQNCisjICAgICAgZmlsdGVyMQ0KKyMgICAgICAgICAgaXMgYW4gb3B0aW9uYWwgZmlsdGVyIGZvciBmaWx0ZXJpbmcgdGhlIGxsdm0xIGdlbmVyYXRlZCBhc3NlbWJseQ0KKyMgICAgICBmaWx0ZXIyDQorIyAgICAgICAgICBpcyBhbiBvcHRpb25hbCBmaWx0ZXIgZm9yIGZpbHRlcmluZyB0aGUgbGx2bTIgZ2VuZXJhdGVkIGFzc2VtYmx5DQorIyAgICAgICANCitsbHZtMT0kMQ0KK2xsdm0yPSQyDQorYmMxPSQzDQorYmMyPSQ0DQorZmlsdDE9JDUNCitmaWx0Mj0kNg0KK2lmIFsgLXogIiRmaWx0MSIgXSA7IHRoZW4NCisgIGZpbHQxPSJjYXQiDQorZmkNCitpZiBbIC16ICIkZmlsdDIiIF0gOyB0aGVuDQorICBmaWx0Mj0iY2F0Ig0KK2ZpDQorb3B0MT0iJHtiYzF9Lm9wdCINCitvcHQyPSIke2JjMn0ub3B0IiANCitsbDE9IiR7YmMxfS5sbCINCitsbDI9IiR7YmMyfS5sbCINCitvcHQxbGw9IiR7YmMxfS5vcHQubGwiDQorb3B0MmxsPSIke2JjMn0ub3B0LmxsIg0KK2RpczE9IiRsbHZtMS9EZWJ1Zy9iaW4vbGx2bS1kaXMiDQorZGlzMj0iJGxsdm0yL0RlYnVnL2Jpbi9sbHZtLWRpcyINCitvcHQxPSIkbGx2bTEvRGVidWcvYmluL29wdCINCitvcHQyPSIkbGx2bTIvRGVidWcvYmluL29wdCINCisNCithbGxfc3dpdGNoZXM9Ii12ZXJpZnkgLWxvd2Vyc2V0am1wIC1zaW1wbGlmeWNmZyAtbWVtMnJlZyAtZ2xvYmFsb3B0IC1nbG9iYWxkY2UgLWlwY29uc3Rwcm9wIC1kZWFkYXJnZWxpbSAtaW5zdGNvbWJpbmUgLXNpbXBsaWZ5Y2ZnIC1wcnVuZS1laCAtaW5saW5lIC1zaW1wbGlmeS1saWJjYWxscyAtYXJncHJvbW90aW9uIC10YWlsZHVwbGljYXRlIC1zaW1wbGlmeWNmZyAtc2NhbGFycmVwbCAtaW5zdGNvbWJpbmUgLXByZWRzaW1wbGlmeSAtY29uZHByb3AgLXRhaWxjYWxsZWxpbSAtc2ltcGxpZnljZmcgLXJlYXNzb2NpYXRlIC1saWNtIC1sb29wLXVuc3dpdGNoIC1pbnN0Y29tYmluZSAtaW5kdmFycyAtbG9vcC11bnJvbGwgLWluc3Rjb21iaW5lIC1sb2FkLXZuIC1nY3NlIC1zY2NwIC1pbnN0Y29tYmluZSAtY29uZHByb3AgLWRzZSAtZGNlIC1zaW1wbGlmeWNmZyAtZGVhZHR5cGVlbGltIC1jb25zdG1lcmdlIC1pbnRlcm5hbGl6ZSAtaXBzY2NwIC1nbG9iYWxvcHQgLWNvbnN0bWVyZ2UgLWRlYWRhcmdlbGltIC1pbmxpbmUgLXBydW5lLWVoIC1nbG9iYWxvcHQgLWdsb2JhbGRjZSAtYXJncHJvbW90aW9uIC1pbnN0Y29tYmluZSAtcHJlZHNpbXBsaWZ5IC1zY2FsYXJyZXBsIC1nbG9iYWxzbW9kcmVmLWFhIC1saWNtIC1sb2FkLXZuIC1nY3NlIC1kc2UgLWluc3Rjb21iaW5lIC1zaW1wbGlmeWNmZyAtdmVyaWZ5Ig0KKw0KKyNjb3VudGVyPTANCitmdW5jdGlvbiB0cnlpdCB7DQorICBzd2l0Y2hlc190b191c2U9IiQxIg0KKyAgJG9wdDEgJHN3aXRjaGVzX3RvX3VzZSAiJGJjMSIgLW8gLSB8ICRkaXMxIHwgJGZpbHQxID4gIiRvcHQxbGwiDQorICAkb3B0MiAkc3dpdGNoZXNfdG9fdXNlICIkYmMyIiAtbyAtIHwgJGRpczIgfCAkZmlsdDIgPiAiJG9wdDJsbCINCisgIGRpZmZzPSJkaWZmcy4iJCgoY291bnRlcisrKSkNCisgIGRpZmYgIiRvcHQxbGwiICIkb3B0MmxsIiA+ICRkaWZmcw0KKyAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbg0KKyAgICBlY2hvDQorICAgIGVjaG8gIkRpZmYgZmFpbHMgd2l0aCB0aGVzZSBzd2l0Y2hlczoiDQorICAgIGVjaG8gJHN3aXRjaGVzDQorICAgIGVjaG8gIkRpZmZlcmVuY2VzOiINCisgICAgaGVhZCAkZGlmZnMNCisgICAgZWNobyAnU3dpdGNoZXM6JyAkc3dpdGNoZXNfdG9fdXNlID4+ICRkaWZmcw0KKyAgZWxzZQ0KKyAgICBybSAkZGlmZnMNCisgIGZpDQorICByZXR1cm4gMQ0KK30NCisNCitmb3Igc3cgaW4gJGFsbF9zd2l0Y2hlcyA7IGRvDQorICBlY2hvIC1uICIgJHN3Ig0KKyAgc3dpdGNoZXM9IiRzd2l0Y2hlcyAkc3ciDQorICBpZiB0cnlpdCAiJHN3aXRjaGVzIiA7IHRoZW4NCisgICAgYnJlYWs7DQorICBmaQ0KK2RvbmUNCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9maW5kc3ltLnBsIGIvc3JjL0xMVk0vdXRpbHMvZmluZHN5bS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM0NjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvZmluZHN5bS5wbApAQCAtMCwwICsxLDMzIEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgUHJvZ3JhbTogIGZpbmRzeW0ucGwKKyMKKyMgU3lub3BzaXM6IEdlbmVyYXRlIGEgbGlzdCBvZiB0aGUgbGlicmFyaWVzIGluIHdoaWNoIGEgc3ltYm9sIGlzIGRlZmluZWQgb3IKKyMgICAgICAgICAgIHJlZmVyZW5jZWQuCisjCisjIFN5bnRheDogICBmaW5kc3ltLnBsIDxkaXJlY3Rvcnlfd2l0aF9saWJyYXJpZXNfaW5faXQ+IDxzeW1ib2w+CisjCisKKyMgR2l2ZSBmaXJzdCBvcHRpb24gYSBuYW1lLgorbXkgJERpcmVjdG9yeSA9ICRBUkdWWzBdOworbXkgJFN5bWJvbCA9ICRBUkdWWzFdOworCisjIE9wZW4gdGhlIGRpcmVjdG9yeSBhbmQgcmVhZCBpdHMgY29udGVudHMsIHNvcnRpbmcgYnkgbmFtZSBhbmQgZGlmZmVyZW50aWF0aW5nCisjIGJ5IHdoZXRoZXIgaXRzIGEgbGlicmFyeSAoLmEpIG9yIGFuIG9iamVjdCBmaWxlICgubykKK29wZW5kaXIgRElSLCREaXJlY3Rvcnk7CitteSBAZmlsZXMgPSByZWFkZGlyIERJUjsKK2Nsb3NlZGlyIERJUjsKK0BvYmplY3RzID0gZ3JlcCgvbD9pP2I/TExWTS4qXC5bb2FdJC8sc29ydChAZmlsZXMpKTsKKworIyBHYXRoZXIgZGVmaW5pdGlvbnMgZnJvbSB0aGUgbGlicmFyaWVzCitmb3JlYWNoICRsaWIgKEBvYmplY3RzKSB7CisgIG15ICRoZWFkID0gMDsKKyAgb3BlbiBTWU1TLCAKKyAgICAibm0gJERpcmVjdG9yeS8kbGliIHwgZ3JlcCAnJFN5bWJvbCcgfCBzb3J0IC0ta2V5PTMgfCB1bmlxIHwiOworICB3aGlsZSAoPFNZTVM+KSB7CisgICAgaWYgKCEkaGVhZCkgeyBwcmludCAiJGxpYjpcbiI7ICRoZWFkID0gMTsgfQorICAgIGNob21wKCRfKTsKKyAgICBwcmludCAiICAkX1xuIjsKKyAgfQorICBjbG9zZSBTWU1TOworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvZnBjbXAvTWFrZWZpbGUgYi9zcmMvTExWTS91dGlscy9mcGNtcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDJmNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvZnBjbXAvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIyM9PT0tIHV0aWxzL2ZwY21wL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMgCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMgCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uCitUT09MTkFNRSA9IGZwY21wCitVU0VETElCUyA9IExMVk1TdXBwb3J0LmEgTExWTVN5c3RlbS5hCitOT19JTlNUQUxMID0gMQorCitpbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9mcGNtcC9mcGNtcC5jcHAgYi9zcmMvTExWTS91dGlscy9mcGNtcC9mcGNtcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2YjVlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2ZwY21wL2ZwY21wLmNwcApAQCAtMCwwICsxLDQzIEBACisvLz09PS0gZnBjbXAuY3BwIC0gQSBmdXp6eSAiY21wIiB0aGF0IHBlcm1pdHMgZmxvYXRpbmcgcG9pbnQgbm9pc2UgLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIGZwY21wIGlzIGEgdG9vbCB0aGF0IGJhc2ljYWxseSB3b3JrcyBsaWtlIHRoZSAnY21wJyB0b29sLCBleGNlcHQgdGhhdCBpdCBjYW4KKy8vIHRvbGVyYXRlIGVycm9ycyBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgbm9pc2UsIHdpdGggdGhlIC1yIGFuZCAtYSBvcHRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK25hbWVzcGFjZSB7CisgIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CisgIEZpbGUxKGNsOjpQb3NpdGlvbmFsLCBjbDo6ZGVzYygiPGlucHV0IGZpbGUgIzE+IiksIGNsOjpSZXF1aXJlZCk7CisgIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CisgIEZpbGUyKGNsOjpQb3NpdGlvbmFsLCBjbDo6ZGVzYygiPGlucHV0IGZpbGUgIzI+IiksIGNsOjpSZXF1aXJlZCk7CisKKyAgY2w6Om9wdDxkb3VibGU+CisgIFJlbFRvbGVyYW5jZSgiciIsIGNsOjpkZXNjKCJSZWxhdGl2ZSBlcnJvciB0b2xlcmF0ZWQiKSwgY2w6OmluaXQoMCkpOworICBjbDo6b3B0PGRvdWJsZT4KKyAgQWJzVG9sZXJhbmNlKCJhIiwgY2w6OmRlc2MoIkFic29sdXRlIGVycm9yIHRvbGVyYXRlZCIpLCBjbDo6aW5pdCgwKSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywgYXJndik7CisKKyAgc3RkOjpzdHJpbmcgRXJyb3JNc2c7CisgIGludCBERiA9IERpZmZGaWxlc1dpdGhUb2xlcmFuY2Uoc3lzOjpQYXRoV2l0aFN0YXR1cyhGaWxlMSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5czo6UGF0aFdpdGhTdGF0dXMoRmlsZTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic1RvbGVyYW5jZSwgUmVsVG9sZXJhbmNlLCAmRXJyb3JNc2cpOworICBpZiAoIUVycm9yTXNnLmVtcHR5KCkpCisgICAgZXJycygpIDw8IGFyZ3ZbMF0gPDwgIjogIiA8PCBFcnJvck1zZyA8PCAiXG4iOworICByZXR1cm4gREY7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2dldHNyY3Muc2ggYi9zcmMvTExWTS91dGlscy9nZXRzcmNzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmZmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9nZXRzcmNzLnNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9zaAorIyM9PT0tIHV0aWxzL2dldHNyY3Muc2ggLSBDb3VudHMgTGluZXMgT2YgQ29kZSAtLS0tLS0tLS0tLS0tLS0qLSBTY3JpcHQgLSotPT09IyMKKyMgCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMgZGV0YWlscy4KKyMgCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworIworIyBUaGlzIHNjcmlwdCBqdXN0IHByaW50cyBvdXQgdGhlIHBhdGggbmFtZXMgZm9yIGFsbCB0aGUgc291cmNlIGZpbGVzIGluIExMVk0uCisjIFRoZSBvcHRpb25hbCAtdG9wZGlyIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0b3AgTExWTSBzb3VyY2UgCisjIGRpcmVjdG9yeS4gV2l0aG91dCBpdCwgdGhlIGxsdm0tY29uZmlnIGNvbW1hbmQgaXMgY29uc3VsdGVkIHRvIGZpbmQgdGhlCisjIHRvcCBzb3VyY2UgZGlyZWN0b3J5LgorIworIyBOb3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGxsdm1kby4gU2VlIHRoYXQgc2NyaXB0IGZvciBtb3JlCisjIGRldGFpbHMuCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitpZiB0ZXN0ICIkMSIgPSAiLXRvcGRpciIgOyB0aGVuCisgIFRPUERJUj0iJDIiCisgIHNoaWZ0OyBzaGlmdDsKK2Vsc2UKKyAgVE9QRElSPWBsbHZtLWNvbmZpZyAtLXNyYy1yb290YAorZmkKKworaWYgdGVzdCAtZCAiJFRPUERJUiIgOyB0aGVuCisgIGNkICRUT1BESVIKKyAgLi91dGlscy9sbHZtZG8gLXRvcGRpciAiJFRPUERJUiIgXAorICAgIC1kaXJzICJpbmNsdWRlIGxpYiB0b29scyB1dGlscyBleGFtcGxlcyBwcm9qZWN0cyIgZWNobworZWxzZQorICBlY2hvICJDYW4ndCBmaW5kIExMVk0gdG9wIGRpcmVjdG9yeSIKK2ZpCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9pbXBvcnROTFQucGwgYi9zcmMvTExWTS91dGlscy9pbXBvcnROTFQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiOTUwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2ltcG9ydE5MVC5wbApAQCAtMCwwICsxLDg2IEBACisjIS91c3IvYmluL3BlcmwKKyN0YWtlIHRoZSBvdXRwdXQgb2YgcGFyc2VOTFQucGwgYW5kIGxvYWQgaXQgaW50byBhIGRhdGFiYXNlCisjIHVzZSBsaWtlOiBjYXQgZmlsZSB8cGVybCBwYXJzZU5MVC5wbCB8cGVybCBpbXBvcnROTFQucGwgcGFzc3dvcmQKKwordXNlIERCSTsKKworIyBkYXRhYmFzZSBpbmZvcm1hdGlvbgorJGRiPSJsbHZtYWxwaGEiOworJGhvc3Q9ImxvY2FsaG9zdCI7CiskdXNlcmlkPSJsbHZtZGJ1c2VyIjsKKyRwYXNzd2Q9c2hpZnQgQEFSR1Y7CiskY29ubmVjdGlvbkluZm89ImRiaTpteXNxbDokZGI7JGhvc3QiOworCisjIG1ha2UgY29ubmVjdGlvbiB0byBkYXRhYmFzZQorJGRiaCA9IERCSS0+Y29ubmVjdCgkY29ubmVjdGlvbkluZm8sJHVzZXJpZCwkcGFzc3dkKSBvciBkaWUgREJJLT5lcnJzdHI7CitteSAkc3RoID0gJGRiaC0+cHJlcGFyZSggcXsKKyAgICAgIElOU0VSVCBJTlRPIFRlc3RzIChOQU1FLCBSVU4sIFRFU1QsIFZBTFVFKSBWQUxVRVMgKD8sIFNUUl9UT19EQVRFKD8sICdcJWQgXCVNIFwlWScpLCA/LCA/KQorICB9KSB8fCBkaWUgIkNhbid0IHByZXBhcmUgc3RhdGVtZW50OiAkREJJOjplcnJzdHIiOzsKKword2hpbGUoJGQgPSA8PikKK3sKKyAgY2hvbXAgJGQ7CisgIGlmICgxOCA9PSBzY2FsYXIgc3BsaXQgIiAiLCAkZCkKKyAgICB7CisgICAgICAoJGRheSwgJG1vbiwgJHllYXIsICRwcm9nLCAkZ2NjYXMsICRiYywgJGxsY2NvbXBpbGUsICRsbGNiZXRhY29tcGlsZSwgJGppdGNvbXBpbGUsCisgICAgICAgJG1jLCAkZ2NjLCAkY2JlLCAkbGxjLCAkbGxjYmV0YSwgJGppdCwgJGZvbzEsICRmb28yLCAkZm9vMykgPSBzcGxpdCAiICIsICRkOworICAgICAgaWYgKCRnY2NhcyA9fiAvXGQrLykKKyAgICAgICAgeworICAgICAgICAgICRkYmgtPmRvKCJJTlNFUlQgSU5UTyBUZXN0cyAoTkFNRSwgUlVOLCBURVNULCBWQUxVRSkgVkFMVUVTCisgICAgICAgICAgICAgICAgKCckcHJvZycsIFNUUl9UT19EQVRFKCckZGF5ICRtb24gJHllYXInLCAnXCVkIFwlTSBcJVknKSwgJ2djY2FzJywgJGdjY2FzKSIpIHx8IGRpZSBEQkktPmVycnN0cjsKKyAgICAgICAgfQorICAgICAgaWYgKCRiYyA9fiAvXGQvKQorICAgICAgICB7CisgICAgICAgICAgJGRiaC0+ZG8oIklOU0VSVCBJTlRPIFRlc3RzIChOQU1FLCBSVU4sIFRFU1QsIFZBTFVFKSBWQUxVRVMKKyAgICAgICAgICAgICAgICAoJyRwcm9nJywgU1RSX1RPX0RBVEUoJyRkYXkgJG1vbiAkeWVhcicsICdcJWQgXCVNIFwlWScpLCAnYnl0ZWNvZGUnLCAkYmMpIikgfHwgZGllIERCSS0+ZXJyc3RyOworICAgICAgICB9CisgICAgICBpZiAoJGxsY2NvbXBpbGUgPX4gL1xkLykKKyAgICAgICAgeworICAgICAgICAgICRkYmgtPmRvKCJJTlNFUlQgSU5UTyBUZXN0cyAoTkFNRSwgUlVOLCBURVNULCBWQUxVRSkgVkFMVUVTCisgICAgICAgICAgICAgICAgKCckcHJvZycsIFNUUl9UT19EQVRFKCckZGF5ICRtb24gJHllYXInLCAnXCVkIFwlTSBcJVknKSwgJ2xsYy1jb21waWxlJywgJGxsY2NvbXBpbGUpIikgfHwgZGllIERCSS0+ZXJyc3RyOworICAgICAgICB9CisgICAgICBpZiAoJGxsY2JldGFjb21waWxlID1+IC9cZC8pCisgICAgICAgIHsKKyAgICAgICAgICAkZGJoLT5kbygiSU5TRVJUIElOVE8gVGVzdHMgKE5BTUUsIFJVTiwgVEVTVCwgVkFMVUUpIFZBTFVFUworICAgICAgICAgICAgICAgICgnJHByb2cnLCBTVFJfVE9fREFURSgnJGRheSAkbW9uICR5ZWFyJywgJ1wlZCBcJU0gXCVZJyksICdsbGMtYmV0YS1jb21waWxlJywgJGxsY2JldGFjb21waWxlKSIpIHx8IGRpZSBEQkktPmVycnN0cjsKKyAgICAgICAgfQorICAgICAgaWYgKCRqaXRjb21waWxlID1+IC9cZC8pCisgICAgICAgIHsKKyAgICAgICAgICAkZGJoLT5kbygiSU5TRVJUIElOVE8gVGVzdHMgKE5BTUUsIFJVTiwgVEVTVCwgVkFMVUUpIFZBTFVFUworICAgICAgICAgICAgICAgICgnJHByb2cnLCBTVFJfVE9fREFURSgnJGRheSAkbW9uICR5ZWFyJywgJ1wlZCBcJU0gXCVZJyksICdqaXQtY29tcGlsZScsICRqaXRjb21waWxlKSIpIHx8IGRpZSBEQkktPmVycnN0cjsKKyAgICAgICAgfQorICAgICAgaWYgKCRtYyA9fiAvXGQvKQorICAgICAgICB7CisgICAgICAgICAgJGRiaC0+ZG8oIklOU0VSVCBJTlRPIFRlc3RzIChOQU1FLCBSVU4sIFRFU1QsIFZBTFVFKSBWQUxVRVMKKyAgICAgICAgICAgICAgICAoJyRwcm9nJywgU1RSX1RPX0RBVEUoJyRkYXkgJG1vbiAkeWVhcicsICdcJWQgXCVNIFwlWScpLCAnbWFjaGluZS1jb2RlJywgJG1jKSIpIHx8IGRpZSBEQkktPmVycnN0cjsKKyAgICAgICAgfQorICAgICAgaWYgKCRnY2MgPX4gL1xkLykKKyAgICAgICAgeworICAgICAgICAgICRkYmgtPmRvKCJJTlNFUlQgSU5UTyBUZXN0cyAoTkFNRSwgUlVOLCBURVNULCBWQUxVRSkgVkFMVUVTCisgICAgICAgICAgICAgICAgKCckcHJvZycsIFNUUl9UT19EQVRFKCckZGF5ICRtb24gJHllYXInLCAnXCVkIFwlTSBcJVknKSwgJ2djYycsICRnY2MpIikgfHwgZGllIERCSS0+ZXJyc3RyOworICAgICAgICB9CisgICAgICBpZiAoJGxsYyA9fiAvXGQvKQorICAgICAgICB7CisgICAgICAgICAgJGRiaC0+ZG8oIklOU0VSVCBJTlRPIFRlc3RzIChOQU1FLCBSVU4sIFRFU1QsIFZBTFVFKSBWQUxVRVMKKyAgICAgICAgICAgICAgICAoJyRwcm9nJywgU1RSX1RPX0RBVEUoJyRkYXkgJG1vbiAkeWVhcicsICdcJWQgXCVNIFwlWScpLCAnbGxjJywgJGxsYykiKSB8fCBkaWUgREJJLT5lcnJzdHI7CisgICAgICAgIH0KKyAgICAgIGlmICgkbGxjYmV0YSA9fiAvXGQvKQorICAgICAgICB7CisgICAgICAgICAgJGRiaC0+ZG8oIklOU0VSVCBJTlRPIFRlc3RzIChOQU1FLCBSVU4sIFRFU1QsIFZBTFVFKSBWQUxVRVMKKyAgICAgICAgICAgICAgICAoJyRwcm9nJywgU1RSX1RPX0RBVEUoJyRkYXkgJG1vbiAkeWVhcicsICdcJWQgXCVNIFwlWScpLCAnbGxjLWJldGEnLCAkbGxjYmV0YSkiKSB8fCBkaWUgREJJLT5lcnJzdHI7CisgICAgICAgIH0KKyAgICAgIGlmICgkaml0ID1+IC9cZC8pCisgICAgICAgIHsKKyAgICAgICAgICAkZGJoLT5kbygiSU5TRVJUIElOVE8gVGVzdHMgKE5BTUUsIFJVTiwgVEVTVCwgVkFMVUUpIFZBTFVFUworICAgICAgICAgICAgICAgICgnJHByb2cnLCBTVFJfVE9fREFURSgnJGRheSAkbW9uICR5ZWFyJywgJ1wlZCBcJU0gXCVZJyksICdqaXQnLCAkaml0KSIpIHx8IGRpZSBEQkktPmVycnN0cjsKKyAgICAgICAgfQorICAgICAgcHJpbnQgIi4iOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ICJcbk5POiAkZFxuIjsKKyAgICB9Cit9CitwcmludCAiXG4iOworIyBkaXNjb25uZWN0IGZyb20gZGF0YWJhc2UKKyRkYmgtPmRpc2Nvbm5lY3Q7CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9qZWRpdC9SRUFETUUgYi9zcmMvTExWTS91dGlscy9qZWRpdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2YzhjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2plZGl0L1JFQURNRQpAQCAtMCwwICsxLDE0IEBACistKi0gbGx2bS91dGlscy9qZWRpdC9SRUFETUUgLSotCisKK1RoZXNlIGFyZSBzeW50YXggaGlnaGxpZ2h0aW5nIGZpbGVzIGZvciB0aGUgakVkaXQgZWRpdG9yLiBJbmNsdWRlZCBhcmU6CisKKyogdGFibGVnZW4ueG1sCisKKyAgU3ludGF4IGhpZ2hsaWdodGluZyBtb2RlIGZvciBUYWJsZUdlbiBkZXNjcmlwdGlvbiBmaWxlcy4gVG8gdXNlLCBjb3B5IHRoaXMKKyAgZmlsZSB0byB+Ly5qZWRpdC9tb2Rlcy8gYW5kIGFkZCB0aGlzIGNvZGUgdG8geW91ciB+Ly5qZWRpdC9tb2Rlcy9jYXRhbG9nOgorCisgIDxNT0RFIE5BTUU9InRhYmxlZ2VuIiBGSUxFPSJ0YWJsZWdlbi54bWwiIEZJTEVfTkFNRV9HTE9CPSIqLnRkIiAvPgorCitOb3RlOiBJZiB5b3Ugbm90aWNlIG1pc3Npbmcgb3IgaW5jb3JyZWN0IHN5bnRheCBoaWdobGlnaHRpbmcsIHBsZWFzZSBjb250YWN0Cis8bGx2bWJ1Z3MgW2F0XSBjcy51aXVjLmVkdT47IGlmIHlvdSB3aXNoIHRvIHByb3ZpZGUgYSBwYXRjaCB0byBpbXByb3ZlIHRoZQorZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCBiZSBtb3N0IGFwcHJlY2lhdGVkLiBUaGFuayB5b3UuCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9qZWRpdC90YWJsZWdlbi54bWwgYi9zcmMvTExWTS91dGlscy9qZWRpdC90YWJsZWdlbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4MGEzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2plZGl0L3RhYmxlZ2VuLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBNT0RFIFNZU1RFTSAieG1vZGUuZHRkIj4KKzxNT0RFPgorCTxQUk9QUz4KKwkJPFBST1BFUlRZIE5BTUU9ImxpbmVDb21tZW50IiBWQUxVRT0iLy8iIC8+CisJCTxQUk9QRVJUWSBOQU1FPSJjb21tZW50U3RhcnQiIFZBTFVFPSIvKiIgLz4KKwkJPFBST1BFUlRZIE5BTUU9ImNvbW1lbnRFbmQiIFZBTFVFPSIqLyIgLz4KKwkJPFBST1BFUlRZIE5BTUU9ImluZGVudE9wZW5CcmFja2V0cyIgVkFMVUU9InsiIC8+CisJCTxQUk9QRVJUWSBOQU1FPSJpbmRlbnRDbG9zZUJyYWNrZXRzIiBWQUxVRT0ifSIgLz4KKwkJPFBST1BFUlRZIE5BTUU9IndvcmRCcmVha0NoYXJzIiBWQUxVRT0iLCstPSZsdDsmZ3Q7Lz9eJmFtcDsqIiAvPgorCQk8UFJPUEVSVFkgTkFNRT0idW5hbGlnbmVkT3BlbkJyYWNrZXRzIiBWQUxVRT0iKCZsdDsiIC8+CisJCTxQUk9QRVJUWSBOQU1FPSJ1bmFsaWduZWRDbG9zZUJyYWNrZXRzIiBWQUxVRT0iKSZndDsiIC8+CisJPC9QUk9QUz4KKwk8UlVMRVMgSUdOT1JFX0NBU0U9IkZBTFNFIiBISUdITElHSFRfRElHSVRTPSJUUlVFIj4KKwkJPEVPTF9TUEFOIFRZUEU9IkNPTU1FTlQxIj4vLzwvRU9MX1NQQU4+CisJCTxTUEFOIFRZUEU9IkNPTU1FTlQxIj4KKwkJICAgIDxCRUdJTj4vKjwvQkVHSU4+CisJCSAgICA8RU5EPiovPC9FTkQ+CisJCTwvU1BBTj4KKwkJPFNQQU4gVFlQRT0iTElURVJBTDEiIE5PX0xJTkVfQlJFQUs9IlRSVUUiIEVTQ0FQRT0iXCI+CisJCSAgICA8QkVHSU4+IjwvQkVHSU4+CisJCSAgICA8RU5EPiI8L0VORD4KKwkJPC9TUEFOPgorCQk8S0VZV09SRFM+CisJCQk8S0VZV09SRDE+bGV0PC9LRVlXT1JEMT4KKwkJCTxLRVlXT1JEMT5kZWY8L0tFWVdPUkQxPgorCQkJPEtFWVdPUkQxPmNsYXNzPC9LRVlXT1JEMT4KKwkJCTxLRVlXT1JEMT5pbmNsdWRlPC9LRVlXT1JEMT4KKworCQkJPEtFWVdPUkQzPmJpdDwvS0VZV09SRDM+CisJCQk8S0VZV09SRDM+aW50PC9LRVlXT1JEMz4KKwkJCTxLRVlXT1JEMz5zdHJpbmc8L0tFWVdPUkQzPgorCQkJPEtFWVdPUkQzPmJpdHM8L0tFWVdPUkQzPgorCQkJPEtFWVdPUkQzPmxpc3Q8L0tFWVdPUkQzPgorCQkJPEtFWVdPUkQzPmRhZzwvS0VZV09SRDM+CisJCQk8S0VZV09SRDM+Y29kZTwvS0VZV09SRDM+CisJCTwvS0VZV09SRFM+CisJPC9SVUxFUz4KKzwvTU9ERT4KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpbnQvY29tbW9uX2xpbnQucHkgYi9zcmMvTExWTS91dGlscy9saW50L2NvbW1vbl9saW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODI2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saW50L2NvbW1vbl9saW50LnB5CkBAIC0wLDAgKzEsOTcgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIENvbW1vbiBsaW50IGZ1bmN0aW9ucyBhcHBsaWNhYmxlIHRvIG11bHRpcGxlIHR5cGVzIG9mIGZpbGVzLgorCitpbXBvcnQgcmUKKworZGVmIFZlcmlmeUxpbmVMZW5ndGgoZmlsZW5hbWUsIGxpbmVzLCBtYXhfbGVuZ3RoKToKKyAgIiIiQ2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgZmlsZSBoYXMgbm8gbGluZXMgd2l0aCBsaW5lcyBleGNlZWRpbmcgdGhlIGxlbmd0aAorICBsaW1pdC4KKworICBBcmdzOgorICAgIGZpbGVuYW1lOiB0aGUgZmlsZSB1bmRlciBjb25zaWRlcmF0aW9uIGFzIHN0cmluZworICAgIGxpbmVzOiBjb250ZW50cyBvZiB0aGUgZmlsZSBhcyBzdHJpbmcgYXJyYXkKKyAgICBtYXhfbGVuZ3RoOiBtYXhpbXVtIGFjY2VwdGFibGUgbGluZSBsZW5ndGggYXMgbnVtYmVyCisKKyAgUmV0dXJuczoKKyAgICBBIGxpc3Qgb2YgdHVwbGVzIHdpdGggZm9ybWF0IFsoZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBtc2cpLCAuLi5dIHdpdGggYW55CisgICAgdmlvbGF0aW9ucyBmb3VuZC4KKyAgIiIiCisgIGxpbnQgPSBbXQorICBsaW5lX251bSA9IDEKKyAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgbGVuZ3RoID0gbGVuKGxpbmUucnN0cmlwKCdcbicpKQorICAgIGlmIGxlbmd0aCA+IG1heF9sZW5ndGg6CisgICAgICBsaW50LmFwcGVuZCgoZmlsZW5hbWUsIGxpbmVfbnVtLAorICAgICAgICAgICAgICAgICAgICdMaW5lIGV4Y2VlZHMgJWQgY2hhcnMgKCVkKScgJSAobWF4X2xlbmd0aCwgbGVuZ3RoKSkpCisgICAgbGluZV9udW0gKz0gMQorICByZXR1cm4gbGludAorCitkZWYgVmVyaWZ5VGFicyhmaWxlbmFtZSwgbGluZXMpOgorICAiIiJDaGVja3MgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGhhcyBubyB0YWIgY2hhcmFjdGVycy4KKworICBBcmdzOgorICAgIGZpbGVuYW1lOiB0aGUgZmlsZSB1bmRlciBjb25zaWRlcmF0aW9uIGFzIHN0cmluZworICAgIGxpbmVzOiBjb250ZW50cyBvZiB0aGUgZmlsZSBhcyBzdHJpbmcgYXJyYXkKKworICBSZXR1cm5zOgorICAgIEEgbGlzdCBvZiB0dXBsZXMgd2l0aCBmb3JtYXQgWyhsaW5lX251bWJlciwgbXNnKSwgLi4uXSB3aXRoIGFueSB2aW9sYXRpb25zCisgICAgZm91bmQuCisgICIiIgorICBsaW50ID0gW10KKyAgdGFiX3JlID0gcmUuY29tcGlsZShyJ1x0JykKKyAgbGluZV9udW0gPSAxCisgIGZvciBsaW5lIGluIGxpbmVzOgorICAgIGlmIHRhYl9yZS5tYXRjaChsaW5lLnJzdHJpcCgnXG4nKSk6CisgICAgICBsaW50LmFwcGVuZCgoZmlsZW5hbWUsIGxpbmVfbnVtLCAnVGFiIGZvdW5kIGluc3RlYWQgb2Ygd2hpdGVzcGFjZScpKQorICAgIGxpbmVfbnVtICs9IDEKKyAgcmV0dXJuIGxpbnQKKworCitkZWYgVmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGZpbGVuYW1lLCBsaW5lcyk6CisgICIiIkNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGZpbGUgaGFzIG5vIGxpbmVzIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworICBBcmdzOgorICAgIGZpbGVuYW1lOiB0aGUgZmlsZSB1bmRlciBjb25zaWRlcmF0aW9uIGFzIHN0cmluZworICAgIGxpbmVzOiBjb250ZW50cyBvZiB0aGUgZmlsZSBhcyBzdHJpbmcgYXJyYXkKKworICBSZXR1cm5zOgorICAgIEEgbGlzdCBvZiB0dXBsZXMgd2l0aCBmb3JtYXQgWyhmaWxlbmFtZSwgbGluZSBudW1iZXIsIG1zZyksIC4uLl0gd2l0aCBhbnkKKyAgICB2aW9sYXRpb25zIGZvdW5kLgorICAiIiIKKyAgbGludCA9IFtdCisgIHRyYWlsaW5nX3doaXRlc3BhY2VfcmUgPSByZS5jb21waWxlKHInXHMrJCcpCisgIGxpbmVfbnVtID0gMQorICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICBpZiB0cmFpbGluZ193aGl0ZXNwYWNlX3JlLm1hdGNoKGxpbmUucnN0cmlwKCdcbicpKToKKyAgICAgIGxpbnQuYXBwZW5kKChmaWxlbmFtZSwgbGluZV9udW0sICdUcmFpbGluZyB3aGl0ZXNwYWNlJykpCisgICAgbGluZV9udW0gKz0gMQorICByZXR1cm4gbGludAorCisKK2NsYXNzIEJhc2VMaW50OgorICBkZWYgUnVuT25GaWxlKGZpbGVuYW1lLCBsaW5lcyk6CisgICAgcmFpc2UgRXhjZXB0aW9uKCdSdW5PbkZpbGUoKSB1bmltcGxlbWVudGVkJykKKworCitkZWYgUnVuTGludE92ZXJBbGxGaWxlcyhsaW50ZXIsIGZpbGVuYW1lcyk6CisgICIiIlJ1bnMgbGludGVyIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGFsbCBmaWxlcy4KKworICBBcmdzOgorICAgIGxpbnQ6IHN1YmNsYXNzIG9mIEJhc2VMaW50LCBpbXBsZW1lbnRpbmcgUnVuT25GaWxlKCkKKyAgICBmaWxlbmFtZXM6IGxpc3Qgb2YgYWxsIGZpbGVzIHdob3NlIGNvbnRlbnRzIHdpbGwgYmUgbGludGVkCisKKyAgUmV0dXJuczoKKyAgICBBIGxpc3Qgb2YgdHVwbGVzIHdpdGggZm9ybWF0IFsoZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBtc2cpLCAuLi5dIHdpdGggYW55CisgICAgdmlvbGF0aW9ucyBmb3VuZC4KKyAgIiIiCisgIGxpbnQgPSBbXQorICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgorICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lLCAncicpCisgICAgaWYgbm90IGZpbGU6CisgICAgICBwcmludCAnQ291bmQgbm90IG9wZW4gJXMnICUgZmlsZW5hbWUKKyAgICAgIGNvbnRpbnVlCisgICAgbGluZXMgPSBmaWxlLnJlYWRsaW5lcygpCisgICAgbGludC5leHRlbmQobGludGVyLlJ1bk9uRmlsZShmaWxlbmFtZSwgbGluZXMpKQorCisgIHJldHVybiBsaW50CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saW50L2NwcF9saW50LnB5IGIvc3JjL0xMVk0vdXRpbHMvbGludC9jcHBfbGludC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2ZhZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGludC9jcHBfbGludC5weQpAQCAtMCwwICsxLDk0IEBACisjIS91c3IvYmluL3B5dGhvbgorIworIyBDaGVja3MgQysrIGZpbGVzIHRvIG1ha2Ugc3VyZSB0aGV5IGNvbmZvcm0gdG8gTExWTSBzdGFuZGFyZHMsIGFzIHNwZWNpZmllZCBpbgorIyBodHRwOi8vbGx2bS5vcmcvZG9jcy9Db2RpbmdTdGFuZGFyZHMuaHRtbCAuCisjCisjIFRPRE86IGFkZCB1bml0dGVzdHMgZm9yIHRoZSB2ZXJpZmllciBmdW5jdGlvbnM6CisjIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91bml0dGVzdC5odG1sIC4KKworaW1wb3J0IGNvbW1vbl9saW50CitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworZGVmIFZlcmlmeUluY2x1ZGVzKGZpbGVuYW1lLCBsaW5lcyk6CisgICIiIk1ha2VzIHN1cmUgdGhlICNpbmNsdWRlcyBhcmUgaW4gcHJvcGVyIG9yZGVyIGFuZCBubyBkaXNhbGxvd3MgZmlsZXMgYXJlCisgICNpbmNsdWRlZC4KKworICBBcmdzOgorICAgIGZpbGVuYW1lOiB0aGUgZmlsZSB1bmRlciBjb25zaWRlcmF0aW9uIGFzIHN0cmluZworICAgIGxpbmVzOiBjb250ZW50cyBvZiB0aGUgZmlsZSBhcyBzdHJpbmcgYXJyYXkKKyAgIiIiCisgIGxpbnQgPSBbXQorCisgIGluY2x1ZGVfZ3Rlc3RfcmUgPSByZS5jb21waWxlKHInXiNpbmNsdWRlICJndGVzdC8oLiopIicpCisgIGluY2x1ZGVfbGx2bV9yZSA9IHJlLmNvbXBpbGUocideI2luY2x1ZGUgImxsdm0vKC4qKSInKQorICBpbmNsdWRlX3N1cHBvcnRfcmUgPSByZS5jb21waWxlKHInXiNpbmNsdWRlICIoU3VwcG9ydC8uKikiJykKKyAgaW5jbHVkZV9jb25maWdfcmUgPSByZS5jb21waWxlKHInXiNpbmNsdWRlICIoQ29uZmlnLy4qKSInKQorICBpbmNsdWRlX3N5c3RlbV9yZSA9IHJlLmNvbXBpbGUocideI2luY2x1ZGUgPCguKik+JykKKworICBESVNBTExPV0VEX1NZU1RFTV9IRUFERVJTID0gWydpb3N0cmVhbSddCisKKyAgbGluZV9udW0gPSAxCisgIHByZXZfY29uZmlnX2hlYWRlciA9IE5vbmUKKyAgcHJldl9zeXN0ZW1faGVhZGVyID0gTm9uZQorICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAjIFRPRE86IGltcGxlbWVudCBwcml2YXRlIGhlYWRlcnMKKyAgICAjIFRPRE86IGltcGxlbWVudCBndGVzdCBoZWFkZXJzCisgICAgIyBUT0RPOiBpbXBsZW1lbnQgdG9wLWxldmVsIGxsdm0vKiBoZWFkZXJzCisgICAgIyBUT0RPOiBpbXBsZW1lbnQgbGx2bS9TdXBwb3J0LyogaGVhZGVycworCisgICAgIyBQcm9jZXNzIENvbmZpZy8qIGhlYWRlcnMKKyAgICBjb25maWdfaGVhZGVyID0gaW5jbHVkZV9jb25maWdfcmUubWF0Y2gobGluZSkKKyAgICBpZiBjb25maWdfaGVhZGVyOgorICAgICAgY3Vycl9jb25maWdfaGVhZGVyID0gY29uZmlnX2hlYWRlci5ncm91cCgxKQorICAgICAgaWYgcHJldl9jb25maWdfaGVhZGVyOgorICAgICAgICBpZiBwcmV2X2NvbmZpZ19oZWFkZXIgPiBjdXJyX2NvbmZpZ19oZWFkZXI6CisgICAgICAgICAgbGludC5hcHBlbmQoKGZpbGVuYW1lLCBsaW5lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgJ0NvbmZpZyBoZWFkZXJzIG5vdCBpbiBvcmRlcjogIiVzIiBiZWZvcmUgIiVzIicgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9jb25maWdfaGVhZGVyLCBjdXJyX2NvbmZpZ19oZWFkZXIpKSkKKworICAgICMgUHJvY2VzcyBzeXN0ZW0gaGVhZGVycworICAgIHN5c3RlbV9oZWFkZXIgPSBpbmNsdWRlX3N5c3RlbV9yZS5tYXRjaChsaW5lKQorICAgIGlmIHN5c3RlbV9oZWFkZXI6CisgICAgICBjdXJyX3N5c3RlbV9oZWFkZXIgPSBzeXN0ZW1faGVhZGVyLmdyb3VwKDEpCisKKyAgICAgICMgSXMgaXQgYmxhY2tsaXN0ZWQ/CisgICAgICBpZiBjdXJyX3N5c3RlbV9oZWFkZXIgaW4gRElTQUxMT1dFRF9TWVNURU1fSEVBREVSUzoKKyAgICAgICAgbGludC5hcHBlbmQoKGZpbGVuYW1lLCBsaW5lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICdEaXNhbGxvd2VkIHN5c3RlbSBoZWFkZXI6IDwlcz4nICUgY3Vycl9zeXN0ZW1faGVhZGVyKSkKKyAgICAgIGVsaWYgcHJldl9zeXN0ZW1faGVhZGVyOgorICAgICAgICAjIE1ha2Ugc3VyZSBzeXN0ZW0gaGVhZGVycyBhcmUgYWxwaGFiZXRpemVkIGFtb25nc3QgdGhlbXNlbHZlcworICAgICAgICBpZiBwcmV2X3N5c3RlbV9oZWFkZXIgPiBjdXJyX3N5c3RlbV9oZWFkZXI6CisgICAgICAgICAgbGludC5hcHBlbmQoKGZpbGVuYW1lLCBsaW5lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgJ1N5c3RlbSBoZWFkZXJzIG5vdCBpbiBvcmRlcjogPCVzPiBiZWZvcmUgPCVzPicgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9zeXN0ZW1faGVhZGVyLCBjdXJyX3N5c3RlbV9oZWFkZXIpKSkKKworICAgICAgcHJldl9zeXN0ZW1faGVhZGVyID0gY3Vycl9zeXN0ZW1faGVhZGVyCisKKyAgICBsaW5lX251bSArPSAxCisKKyAgcmV0dXJuIGxpbnQKKworCitjbGFzcyBDcHBMaW50KGNvbW1vbl9saW50LkJhc2VMaW50KToKKyAgTUFYX0xJTkVfTEVOR1RIID0gODAKKworICBkZWYgUnVuT25GaWxlKHNlbGYsIGZpbGVuYW1lLCBsaW5lcyk6CisgICAgbGludCA9IFtdCisgICAgbGludC5leHRlbmQoVmVyaWZ5SW5jbHVkZXMoZmlsZW5hbWUsIGxpbmVzKSkKKyAgICBsaW50LmV4dGVuZChjb21tb25fbGludC5WZXJpZnlMaW5lTGVuZ3RoKGZpbGVuYW1lLCBsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENwcExpbnQuTUFYX0xJTkVfTEVOR1RIKSkKKyAgICBsaW50LmV4dGVuZChjb21tb25fbGludC5WZXJpZnlUYWJzKGZpbGVuYW1lLCBsaW5lcykpCisgICAgbGludC5leHRlbmQoY29tbW9uX2xpbnQuVmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGZpbGVuYW1lLCBsaW5lcykpCisgICAgcmV0dXJuIGxpbnQKKworCitkZWYgQ3BwTGludE1haW4oZmlsZW5hbWVzKToKKyAgYWxsX2xpbnQgPSBjb21tb25fbGludC5SdW5MaW50T3ZlckFsbEZpbGVzKENwcExpbnQoKSwgZmlsZW5hbWVzKQorICBmb3IgbGludCBpbiBhbGxfbGludDoKKyAgICBwcmludCAnJXM6JWQ6JXMnICUgKGxpbnRbMF0sIGxpbnRbMV0sIGxpbnRbMl0pCisgIHJldHVybiAwCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQoQ3BwTGludE1haW4oc3lzLmFyZ3ZbMTpdKSkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpbnQvZ2VuZXJpY19saW50LnB5IGIvc3JjL0xMVk0vdXRpbHMvbGludC9nZW5lcmljX2xpbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmNDgzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpbnQvZ2VuZXJpY19saW50LnB5CkBAIC0wLDAgKzEsMjQgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIENoZWNrcyBmaWxlcyB0byBtYWtlIHN1cmUgdGhleSBjb25mb3JtIHRvIExMVk0gc3RhbmRhcmRzIHdoaWNoIGNhbiBiZSBhcHBsaWVkCisjIHRvIGFueSBwcm9ncmFtbWluZyBsYW5ndWFnZTogYXQgcHJlc2VudCwgbGluZSBsZW5ndGggYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisKK2ltcG9ydCBjb21tb25fbGludAoraW1wb3J0IHN5cworCitjbGFzcyBHZW5lcmljQ29kZUxpbnQoY29tbW9uX2xpbnQuQmFzZUxpbnQpOgorICBNQVhfTElORV9MRU5HVEggPSA4MAorCisgIGRlZiBSdW5PbkZpbGUoc2VsZiwgZmlsZW5hbWUsIGxpbmVzKToKKyAgICBjb21tb25fbGludC5WZXJpZnlMaW5lTGVuZ3RoKGZpbGVuYW1lLCBsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNDb2RlTGludC5NQVhfTElORV9MRU5HVEgpCisgICAgY29tbW9uX2xpbnQuVmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGZpbGVuYW1lLCBsaW5lcykKKworCitkZWYgR2VuZXJpY0NvZGVMaW50TWFpbihmaWxlbmFtZXMpOgorICBjb21tb25fbGludC5SdW5MaW50T3ZlckFsbEZpbGVzKEdlbmVyaWNDb2RlTGludCgpLCBmaWxlbmFtZXMpCisgIHJldHVybiAwCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQoR2VuZXJpY0NvZGVMaW50TWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGludC9yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZS5zaCBiL3NyYy9MTFZNL3V0aWxzL2xpbnQvcmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwYzliZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpbnQvcmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2Uuc2gKQEAgLTAsMCArMSw2IEBACisjIS9iaW4vc2gKKyMgRGVsZXRlcyB0cmFpbGluZyB3aGl0ZXNwYWNlIGluLXBsYWNlIGluIHRoZSBwYXNzZWQtaW4gZmlsZXMuCisjIFNhbXBsZSBzeW50YXg6CisjICAgJDAgKi5jcHAKKworcGVybCAtcGkgLWUgJ3MvXHMrJC9cbi8nICQqCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvTGl0Q29uZmlnLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L0xpdENvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTBhNDkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L0xpdENvbmZpZy5weQpAQCAtMCwwICsxLDk1IEBACitjbGFzcyBMaXRDb25maWc6CisgICAgIiIiTGl0Q29uZmlnIC0gQ29uZmlndXJhdGlvbiBkYXRhIGZvciBhICdsaXQnIHRlc3QgcnVubmVyIGluc3RhbmNlLCBzaGFyZWQKKyAgICBhY3Jvc3MgYWxsIHRlc3RzLgorCisgICAgVGhlIExpdENvbmZpZyBvYmplY3QgaXMgYWxzbyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggY2xpZW50IGNvbmZpZ3VyYXRpb24KKyAgICBmaWxlcywgaXQgaXMgYWx3YXlzIHBhc3NlZCBpbiBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlICdsaXQnIHNvIHRoYXQKKyAgICBjb25maWd1cmF0aW9uIGZpbGVzIGNhbiBhY2Nlc3MgY29tbW9uIGZ1bmN0aW9uYWxpdHkgYW5kIGludGVybmFsIGNvbXBvbmVudHMKKyAgICBlYXNpbHkuCisgICAgIiIiCisKKyAgICAjIFByb3ZpZGUgYWNjZXNzIHRvIGJ1aWx0LWluIGZvcm1hdHMuCisgICAgaW1wb3J0IExpdEZvcm1hdHMgYXMgZm9ybWF0cworCisgICAgIyBQcm92aWRlIGFjY2VzcyB0byBidWlsdC1pbiB1dGlsaXR5IGZ1bmN0aW9ucy4KKyAgICBpbXBvcnQgVXRpbCBhcyB1dGlsCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvZ25hbWUsIHBhdGgsIHF1aWV0LAorICAgICAgICAgICAgICAgICB1c2VWYWxncmluZCwgdmFsZ3JpbmRBcmdzLAorICAgICAgICAgICAgICAgICB1c2VUY2xBc1NoLAorICAgICAgICAgICAgICAgICBub0V4ZWN1dGUsIGRlYnVnLCBpc1dpbmRvd3MsCisgICAgICAgICAgICAgICAgIHBhcmFtcyk6CisgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIHRlc3QgcnVubmVyLgorICAgICAgICBzZWxmLnByb2duYW1lID0gcHJvZ25hbWUKKyAgICAgICAgIyBUaGUgaXRlbXMgdG8gYWRkIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAgICBzZWxmLnBhdGggPSBsaXN0KG1hcChzdHIsIHBhdGgpKQorICAgICAgICBzZWxmLnF1aWV0ID0gYm9vbChxdWlldCkKKyAgICAgICAgc2VsZi51c2VWYWxncmluZCA9IGJvb2wodXNlVmFsZ3JpbmQpCisgICAgICAgIHNlbGYudmFsZ3JpbmRBcmdzID0gbGlzdCh2YWxncmluZEFyZ3MpCisgICAgICAgIHNlbGYudXNlVGNsQXNTaCA9IGJvb2wodXNlVGNsQXNTaCkKKyAgICAgICAgc2VsZi5ub0V4ZWN1dGUgPSBub0V4ZWN1dGUKKyAgICAgICAgc2VsZi5kZWJ1ZyA9IGRlYnVnCisgICAgICAgIHNlbGYuaXNXaW5kb3dzID0gYm9vbChpc1dpbmRvd3MpCisgICAgICAgIHNlbGYucGFyYW1zID0gZGljdChwYXJhbXMpCisgICAgICAgIHNlbGYuYmFzaFBhdGggPSBOb25lCisKKyAgICAgICAgc2VsZi5udW1FcnJvcnMgPSAwCisgICAgICAgIHNlbGYubnVtV2FybmluZ3MgPSAwCisKKyAgICBkZWYgbG9hZF9jb25maWcoc2VsZiwgY29uZmlnLCBwYXRoKToKKyAgICAgICAgIiIibG9hZF9jb25maWcoY29uZmlnLCBwYXRoKSAtIExvYWQgYSBjb25maWcgb2JqZWN0IGZyb20gYW4gYWx0ZXJuYXRlCisgICAgICAgIHBhdGguIiIiCisgICAgICAgIGZyb20gVGVzdGluZ0NvbmZpZyBpbXBvcnQgVGVzdGluZ0NvbmZpZworICAgICAgICByZXR1cm4gVGVzdGluZ0NvbmZpZy5mcm9tcGF0aChwYXRoLCBjb25maWcucGFyZW50LCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0RXhpc3QgPSBUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcpCisKKyAgICBkZWYgZ2V0QmFzaFBhdGgoc2VsZik6CisgICAgICAgICIiImdldEJhc2hQYXRoIC0gR2V0IHRoZSBwYXRoIHRvICdiYXNoJyIiIgorICAgICAgICBpbXBvcnQgb3MsIFV0aWwKKworICAgICAgICBpZiBzZWxmLmJhc2hQYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYmFzaFBhdGgKKworICAgICAgICBzZWxmLmJhc2hQYXRoID0gVXRpbC53aGljaCgnYmFzaCcsIG9zLnBhdGhzZXAuam9pbihzZWxmLnBhdGgpKQorICAgICAgICBpZiBzZWxmLmJhc2hQYXRoIGlzIE5vbmU6CisgICAgICAgICAgICAjIENoZWNrIHNvbWUga25vd24gcGF0aHMuCisgICAgICAgICAgICBmb3IgcGF0aCBpbiAoJy9iaW4vYmFzaCcsICcvdXNyL2Jpbi9iYXNoJyk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFzaFBhdGggPSBwYXRoCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgc2VsZi5iYXNoUGF0aCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi53YXJuaW5nKCJVbmFibGUgdG8gZmluZCAnYmFzaCcsIHJ1bm5pbmcgVGNsIHRlc3RzIGludGVybmFsbHkuIikKKyAgICAgICAgICAgIHNlbGYuYmFzaFBhdGggPSAnJworCisgICAgICAgIHJldHVybiBzZWxmLmJhc2hQYXRoCisKKyAgICBkZWYgX3dyaXRlX21lc3NhZ2Uoc2VsZiwga2luZCwgbWVzc2FnZSk6CisgICAgICAgIGltcG9ydCBpbnNwZWN0LCBvcywgc3lzCisKKyAgICAgICAgIyBHZXQgdGhlIGZpbGUvbGluZSB3aGVyZSB0aGlzIG1lc3NhZ2Ugd2FzIGdlbmVyYXRlZC4KKyAgICAgICAgZiA9IGluc3BlY3QuY3VycmVudGZyYW1lKCkKKyAgICAgICAgIyBTdGVwIG91dCBvZiBfd3JpdGVfbWVzc2FnZSwgYW5kIHRoZW4gb3V0IG9mIHdyYXBwZXIuCisgICAgICAgIGYgPSBmLmZfYmFjay5mX2JhY2sKKyAgICAgICAgZmlsZSxsaW5lLF8sXyxfID0gaW5zcGVjdC5nZXRmcmFtZWluZm8oZikKKyAgICAgICAgbG9jYXRpb24gPSAnJXM6JWQnICUgKG9zLnBhdGguYmFzZW5hbWUoZmlsZSksIGxpbmUpCisKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAnJXM6ICVzOiAlczogJXMnICUgKHNlbGYucHJvZ25hbWUsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZCwgbWVzc2FnZSkKKworICAgIGRlZiBub3RlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLl93cml0ZV9tZXNzYWdlKCdub3RlJywgbWVzc2FnZSkKKworICAgIGRlZiB3YXJuaW5nKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLl93cml0ZV9tZXNzYWdlKCd3YXJuaW5nJywgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5udW1XYXJuaW5ncyArPSAxCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHNlbGYuX3dyaXRlX21lc3NhZ2UoJ2Vycm9yJywgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5udW1FcnJvcnMgKz0gMQorCisgICAgZGVmIGZhdGFsKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHNlbGYuX3dyaXRlX21lc3NhZ2UoJ2ZhdGFsJywgbWVzc2FnZSkKKyAgICAgICAgc3lzLmV4aXQoMikKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9MaXRGb3JtYXRzLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L0xpdEZvcm1hdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwZjA4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9MaXRGb3JtYXRzLnB5CkBAIC0wLDAgKzEsMyBAQAorZnJvbSBUZXN0Rm9ybWF0cyBpbXBvcnQgR29vZ2xlVGVzdCwgU2hUZXN0LCBUY2xUZXN0Citmcm9tIFRlc3RGb3JtYXRzIGltcG9ydCBTeW50YXhDaGVja1Rlc3QsIE9uZUNvbW1hbmRQZXJGaWxlVGVzdAorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvUHJvZ3Jlc3NCYXIucHkgYi9zcmMvTExWTS91dGlscy9saXQvUHJvZ3Jlc3NCYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjOTVmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9Qcm9ncmVzc0Jhci5weQpAQCAtMCwwICsxLDI2NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgU291cmNlOiBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy80NzUxMTYvLCB3aXRoCisjIG1vZGlmaWNhdGlvbnMgYnkgRGFuaWVsIER1bmJhci4KKworaW1wb3J0IHN5cywgcmUsIHRpbWUKKworY2xhc3MgVGVybWluYWxDb250cm9sbGVyOgorICAgICIiIgorICAgIEEgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byBwb3J0YWJseSBnZW5lcmF0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvCisgICAgYSB0ZXJtaW5hbC4gIAorICAgIAorICAgIGBUZXJtaW5hbENvbnRyb2xsZXJgIGRlZmluZXMgYSBzZXQgb2YgaW5zdGFuY2UgdmFyaWFibGVzIHdob3NlCisgICAgdmFsdWVzIGFyZSBpbml0aWFsaXplZCB0byB0aGUgY29udHJvbCBzZXF1ZW5jZSBuZWNlc3NhcnkgdG8KKyAgICBwZXJmb3JtIGEgZ2l2ZW4gYWN0aW9uLiAgVGhlc2UgY2FuIGJlIHNpbXBseSBpbmNsdWRlZCBpbiBub3JtYWwKKyAgICBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsOgorCisgICAgICAgID4+PiB0ZXJtID0gVGVybWluYWxDb250cm9sbGVyKCkKKyAgICAgICAgPj4+IHByaW50ICdUaGlzIGlzICcrdGVybS5HUkVFTisnZ3JlZW4nK3Rlcm0uTk9STUFMCisKKyAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgYHJlbmRlcigpYCBtZXRob2QgY2FuIHVzZWQsIHdoaWNoIHJlcGxhY2VzCisgICAgJyR7YWN0aW9ufScgd2l0aCB0aGUgc3RyaW5nIHJlcXVpcmVkIHRvIHBlcmZvcm0gJ2FjdGlvbic6CisKKyAgICAgICAgPj4+IHRlcm0gPSBUZXJtaW5hbENvbnRyb2xsZXIoKQorICAgICAgICA+Pj4gcHJpbnQgdGVybS5yZW5kZXIoJ1RoaXMgaXMgJHtHUkVFTn1ncmVlbiR7Tk9STUFMfScpCisKKyAgICBJZiB0aGUgdGVybWluYWwgZG9lc24ndCBzdXBwb3J0IGEgZ2l2ZW4gYWN0aW9uLCB0aGVuIHRoZSB2YWx1ZSBvZgorICAgIHRoZSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvICcnLiAgQXMgYQorICAgIHJlc3VsdCwgdGhlIGFib3ZlIGNvZGUgd2lsbCBzdGlsbCB3b3JrIG9uIHRlcm1pbmFscyB0aGF0IGRvIG5vdAorICAgIHN1cHBvcnQgY29sb3IsIGV4Y2VwdCB0aGF0IHRoZWlyIG91dHB1dCB3aWxsIG5vdCBiZSBjb2xvcmVkLgorICAgIEFsc28sIHRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHRlc3Qgd2hldGhlciB0aGUgdGVybWluYWwgc3VwcG9ydHMgYQorICAgIGdpdmVuIGFjdGlvbiBieSBzaW1wbHkgdGVzdGluZyB0aGUgdHJ1dGggdmFsdWUgb2YgdGhlCisgICAgY29ycmVzcG9uZGluZyBpbnN0YW5jZSB2YXJpYWJsZToKKworICAgICAgICA+Pj4gdGVybSA9IFRlcm1pbmFsQ29udHJvbGxlcigpCisgICAgICAgID4+PiBpZiB0ZXJtLkNMRUFSX1NDUkVFTjoKKyAgICAgICAgLi4uICAgICBwcmludCAnVGhpcyB0ZXJtaW5hbCBzdXBwb3J0cyBjbGVhcm5pbmcgdGhlIHNjcmVlbi4nCisKKyAgICBGaW5hbGx5LCBpZiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdGVybWluYWwgYXJlIGtub3duLCB0aGVuCisgICAgdGhleSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgYENPTFNgIGFuZCBgTElORVNgIGF0dHJpYnV0ZXMuCisgICAgIiIiCisgICAgIyBDdXJzb3IgbW92ZW1lbnQ6CisgICAgQk9MID0gJycgICAgICAgICAgICAgIzogTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUKKyAgICBVUCA9ICcnICAgICAgICAgICAgICAjOiBNb3ZlIHRoZSBjdXJzb3IgdXAgb25lIGxpbmUKKyAgICBET1dOID0gJycgICAgICAgICAgICAjOiBNb3ZlIHRoZSBjdXJzb3IgZG93biBvbmUgbGluZQorICAgIExFRlQgPSAnJyAgICAgICAgICAgICM6IE1vdmUgdGhlIGN1cnNvciBsZWZ0IG9uZSBjaGFyCisgICAgUklHSFQgPSAnJyAgICAgICAgICAgIzogTW92ZSB0aGUgY3Vyc29yIHJpZ2h0IG9uZSBjaGFyCisKKyAgICAjIERlbGV0aW9uOgorICAgIENMRUFSX1NDUkVFTiA9ICcnICAgICM6IENsZWFyIHRoZSBzY3JlZW4gYW5kIG1vdmUgdG8gaG9tZSBwb3NpdGlvbgorICAgIENMRUFSX0VPTCA9ICcnICAgICAgICM6IENsZWFyIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisgICAgQ0xFQVJfQk9MID0gJycgICAgICAgIzogQ2xlYXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KKyAgICBDTEVBUl9FT1MgPSAnJyAgICAgICAjOiBDbGVhciB0byB0aGUgZW5kIG9mIHRoZSBzY3JlZW4KKworICAgICMgT3V0cHV0IG1vZGVzOgorICAgIEJPTEQgPSAnJyAgICAgICAgICAgICM6IFR1cm4gb24gYm9sZCBtb2RlCisgICAgQkxJTksgPSAnJyAgICAgICAgICAgIzogVHVybiBvbiBibGluayBtb2RlCisgICAgRElNID0gJycgICAgICAgICAgICAgIzogVHVybiBvbiBoYWxmLWJyaWdodCBtb2RlCisgICAgUkVWRVJTRSA9ICcnICAgICAgICAgIzogVHVybiBvbiByZXZlcnNlLXZpZGVvIG1vZGUKKyAgICBOT1JNQUwgPSAnJyAgICAgICAgICAjOiBUdXJuIG9mZiBhbGwgbW9kZXMKKworICAgICMgQ3Vyc29yIGRpc3BsYXk6CisgICAgSElERV9DVVJTT1IgPSAnJyAgICAgIzogTWFrZSB0aGUgY3Vyc29yIGludmlzaWJsZQorICAgIFNIT1dfQ1VSU09SID0gJycgICAgICM6IE1ha2UgdGhlIGN1cnNvciB2aXNpYmxlCisKKyAgICAjIFRlcm1pbmFsIHNpemU6CisgICAgQ09MUyA9IE5vbmUgICAgICAgICAgIzogV2lkdGggb2YgdGhlIHRlcm1pbmFsIChOb25lIGZvciB1bmtub3duKQorICAgIExJTkVTID0gTm9uZSAgICAgICAgICM6IEhlaWdodCBvZiB0aGUgdGVybWluYWwgKE5vbmUgZm9yIHVua25vd24pCisKKyAgICAjIEZvcmVncm91bmQgY29sb3JzOgorICAgIEJMQUNLID0gQkxVRSA9IEdSRUVOID0gQ1lBTiA9IFJFRCA9IE1BR0VOVEEgPSBZRUxMT1cgPSBXSElURSA9ICcnCisgICAgCisgICAgIyBCYWNrZ3JvdW5kIGNvbG9yczoKKyAgICBCR19CTEFDSyA9IEJHX0JMVUUgPSBCR19HUkVFTiA9IEJHX0NZQU4gPSAnJworICAgIEJHX1JFRCA9IEJHX01BR0VOVEEgPSBCR19ZRUxMT1cgPSBCR19XSElURSA9ICcnCisgICAgCisgICAgX1NUUklOR19DQVBBQklMSVRJRVMgPSAiIiIKKyAgICBCT0w9Y3IgVVA9Y3V1MSBET1dOPWN1ZDEgTEVGVD1jdWIxIFJJR0hUPWN1ZjEKKyAgICBDTEVBUl9TQ1JFRU49Y2xlYXIgQ0xFQVJfRU9MPWVsIENMRUFSX0JPTD1lbDEgQ0xFQVJfRU9TPWVkIEJPTEQ9Ym9sZAorICAgIEJMSU5LPWJsaW5rIERJTT1kaW0gUkVWRVJTRT1yZXYgVU5ERVJMSU5FPXNtdWwgTk9STUFMPXNncjAKKyAgICBISURFX0NVUlNPUj1jaW52aXMgU0hPV19DVVJTT1I9Y25vcm0iIiIuc3BsaXQoKQorICAgIF9DT0xPUlMgPSAiIiJCTEFDSyBCTFVFIEdSRUVOIENZQU4gUkVEIE1BR0VOVEEgWUVMTE9XIFdISVRFIiIiLnNwbGl0KCkKKyAgICBfQU5TSUNPTE9SUyA9ICJCTEFDSyBSRUQgR1JFRU4gWUVMTE9XIEJMVUUgTUFHRU5UQSBDWUFOIFdISVRFIi5zcGxpdCgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVybV9zdHJlYW09c3lzLnN0ZG91dCk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgYSBgVGVybWluYWxDb250cm9sbGVyYCBhbmQgaW5pdGlhbGl6ZSBpdHMgYXR0cmlidXRlcworICAgICAgICB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgdGVybWluYWwuCisgICAgICAgIGB0ZXJtX3N0cmVhbWAgaXMgdGhlIHN0cmVhbSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGVybWluYWwKKyAgICAgICAgb3V0cHV0OyBpZiB0aGlzIHN0cmVhbSBpcyBub3QgYSB0dHksIHRoZW4gdGhlIHRlcm1pbmFsIGlzCisgICAgICAgIGFzc3VtZWQgdG8gYmUgYSBkdW1iIHRlcm1pbmFsIChpLmUuLCBoYXZlIG5vIGNhcGFiaWxpdGllcykuCisgICAgICAgICIiIgorICAgICAgICAjIEN1cnNlcyBpc24ndCBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3JtcworICAgICAgICB0cnk6IGltcG9ydCBjdXJzZXMKKyAgICAgICAgZXhjZXB0OiByZXR1cm4KKworICAgICAgICAjIElmIHRoZSBzdHJlYW0gaXNuJ3QgYSB0dHksIHRoZW4gYXNzdW1lIGl0IGhhcyBubyBjYXBhYmlsaXRpZXMuCisgICAgICAgIGlmIG5vdCB0ZXJtX3N0cmVhbS5pc2F0dHkoKTogcmV0dXJuCisKKyAgICAgICAgIyBDaGVjayB0aGUgdGVybWluYWwgdHlwZS4gIElmIHdlIGZhaWwsIHRoZW4gYXNzdW1lIHRoYXQgdGhlCisgICAgICAgICMgdGVybWluYWwgaGFzIG5vIGNhcGFiaWxpdGllcy4KKyAgICAgICAgdHJ5OiBjdXJzZXMuc2V0dXB0ZXJtKCkKKyAgICAgICAgZXhjZXB0OiByZXR1cm4KKworICAgICAgICAjIExvb2sgdXAgbnVtZXJpYyBjYXBhYmlsaXRpZXMuCisgICAgICAgIHNlbGYuQ09MUyA9IGN1cnNlcy50aWdldG51bSgnY29scycpCisgICAgICAgIHNlbGYuTElORVMgPSBjdXJzZXMudGlnZXRudW0oJ2xpbmVzJykKKyAgICAgICAgCisgICAgICAgICMgTG9vayB1cCBzdHJpbmcgY2FwYWJpbGl0aWVzLgorICAgICAgICBmb3IgY2FwYWJpbGl0eSBpbiBzZWxmLl9TVFJJTkdfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgKGF0dHJpYiwgY2FwX25hbWUpID0gY2FwYWJpbGl0eS5zcGxpdCgnPScpCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHJpYiwgc2VsZi5fdGlnZXRzdHIoY2FwX25hbWUpIG9yICcnKQorCisgICAgICAgICMgQ29sb3JzCisgICAgICAgIHNldF9mZyA9IHNlbGYuX3RpZ2V0c3RyKCdzZXRmJykKKyAgICAgICAgaWYgc2V0X2ZnOgorICAgICAgICAgICAgZm9yIGksY29sb3IgaW4gemlwKHJhbmdlKGxlbihzZWxmLl9DT0xPUlMpKSwgc2VsZi5fQ09MT1JTKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGNvbG9yLCBjdXJzZXMudHBhcm0oc2V0X2ZnLCBpKSBvciAnJykKKyAgICAgICAgc2V0X2ZnX2Fuc2kgPSBzZWxmLl90aWdldHN0cignc2V0YWYnKQorICAgICAgICBpZiBzZXRfZmdfYW5zaToKKyAgICAgICAgICAgIGZvciBpLGNvbG9yIGluIHppcChyYW5nZShsZW4oc2VsZi5fQU5TSUNPTE9SUykpLCBzZWxmLl9BTlNJQ09MT1JTKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGNvbG9yLCBjdXJzZXMudHBhcm0oc2V0X2ZnX2Fuc2ksIGkpIG9yICcnKQorICAgICAgICBzZXRfYmcgPSBzZWxmLl90aWdldHN0cignc2V0YicpCisgICAgICAgIGlmIHNldF9iZzoKKyAgICAgICAgICAgIGZvciBpLGNvbG9yIGluIHppcChyYW5nZShsZW4oc2VsZi5fQ09MT1JTKSksIHNlbGYuX0NPTE9SUyk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCAnQkdfJytjb2xvciwgY3Vyc2VzLnRwYXJtKHNldF9iZywgaSkgb3IgJycpCisgICAgICAgIHNldF9iZ19hbnNpID0gc2VsZi5fdGlnZXRzdHIoJ3NldGFiJykKKyAgICAgICAgaWYgc2V0X2JnX2Fuc2k6CisgICAgICAgICAgICBmb3IgaSxjb2xvciBpbiB6aXAocmFuZ2UobGVuKHNlbGYuX0FOU0lDT0xPUlMpKSwgc2VsZi5fQU5TSUNPTE9SUyk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCAnQkdfJytjb2xvciwgY3Vyc2VzLnRwYXJtKHNldF9iZ19hbnNpLCBpKSBvciAnJykKKworICAgIGRlZiBfdGlnZXRzdHIoc2VsZiwgY2FwX25hbWUpOgorICAgICAgICAjIFN0cmluZyBjYXBhYmlsaXRpZXMgY2FuIGluY2x1ZGUgImRlbGF5cyIgb2YgdGhlIGZvcm0gIiQ8Mj4iLgorICAgICAgICAjIEZvciBhbnkgbW9kZXJuIHRlcm1pbmFsLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBqdXN0IGlnbm9yZQorICAgICAgICAjIHRoZXNlLCBzbyBzdHJpcCB0aGVtIG91dC4KKyAgICAgICAgaW1wb3J0IGN1cnNlcworICAgICAgICBjYXAgPSBjdXJzZXMudGlnZXRzdHIoY2FwX25hbWUpIG9yICcnCisgICAgICAgIHJldHVybiByZS5zdWIocidcJDxcZCs+Wy8qXT8nLCAnJywgY2FwKQorCisgICAgZGVmIHJlbmRlcihzZWxmLCB0ZW1wbGF0ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXBsYWNlIGVhY2ggJC1zdWJzdGl0dXRpb25zIGluIHRoZSBnaXZlbiB0ZW1wbGF0ZSBzdHJpbmcgd2l0aAorICAgICAgICB0aGUgY29ycmVzcG9uZGluZyB0ZXJtaW5hbCBjb250cm9sIHN0cmluZyAoaWYgaXQncyBkZWZpbmVkKSBvcgorICAgICAgICAnJyAoaWYgaXQncyBub3QpLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHJlLnN1YihyJ1wkXCR8XCR7XHcrfScsIHNlbGYuX3JlbmRlcl9zdWIsIHRlbXBsYXRlKQorCisgICAgZGVmIF9yZW5kZXJfc3ViKHNlbGYsIG1hdGNoKToKKyAgICAgICAgcyA9IG1hdGNoLmdyb3VwKCkKKyAgICAgICAgaWYgcyA9PSAnJCQnOiByZXR1cm4gcworICAgICAgICBlbHNlOiByZXR1cm4gZ2V0YXR0cihzZWxmLCBzWzI6LTFdKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBFeGFtcGxlIHVzZSBjYXNlOiBwcm9ncmVzcyBiYXIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIFNpbXBsZVByb2dyZXNzQmFyOgorICAgICIiIgorICAgIEEgc2ltcGxlIHByb2dyZXNzIGJhciB3aGljaCBkb2Vzbid0IG5lZWQgYW55IHRlcm1pbmFsIHN1cHBvcnQuCisKKyAgICBUaGlzIHByaW50cyBvdXQgYSBwcm9ncmVzcyBiYXIgbGlrZToKKyAgICAgICdIZWFkZXI6IDAgLi4gMTAuLiAyMC4uIC4uLicKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXIpOgorICAgICAgICBzZWxmLmhlYWRlciA9IGhlYWRlcgorICAgICAgICBzZWxmLmF0SW5kZXggPSBOb25lCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBlcmNlbnQsIG1lc3NhZ2UpOgorICAgICAgICBpZiBzZWxmLmF0SW5kZXggaXMgTm9uZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc2VsZi5oZWFkZXIpCisgICAgICAgICAgICBzZWxmLmF0SW5kZXggPSAwCisKKyAgICAgICAgbmV4dCA9IGludChwZXJjZW50KjUwKQorICAgICAgICBpZiBuZXh0ID09IHNlbGYuYXRJbmRleDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuYXRJbmRleCwgbmV4dCk6CisgICAgICAgICAgICBpZHggPSBpICUgNQorICAgICAgICAgICAgaWYgaWR4ID09IDA6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnJS0yZCcgJSAoaSoyKSkKKyAgICAgICAgICAgIGVsaWYgaWR4ID09IDE6CisgICAgICAgICAgICAgICAgcGFzcyAjIFNraXAgc2Vjb25kIGNoYXIKKyAgICAgICAgICAgIGVsaWYgaWR4IDwgNDoKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCcuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnICcpCisgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICBzZWxmLmF0SW5kZXggPSBuZXh0CisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYXRJbmRleCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJykKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5hdEluZGV4ID0gTm9uZQorCitjbGFzcyBQcm9ncmVzc0JhcjoKKyAgICAiIiIKKyAgICBBIDMtbGluZSBwcm9ncmVzcyBiYXIsIHdoaWNoIGxvb2tzIGxpa2U6OgorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIKKyAgICAgICAgMjAlIFs9PT09PT09PT09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyBtZXNzYWdlCisKKyAgICBUaGUgcHJvZ3Jlc3MgYmFyIGlzIGNvbG9yZWQsIGlmIHRoZSB0ZXJtaW5hbCBzdXBwb3J0cyBjb2xvcgorICAgIG91dHB1dDsgYW5kIGFkanVzdHMgdG8gdGhlIHdpZHRoIG9mIHRoZSB0ZXJtaW5hbC4KKyAgICAiIiIKKyAgICBCQVIgPSAnJXMke0dSRUVOfVske0JPTER9JXMlcyR7Tk9STUFMfSR7R1JFRU59XSR7Tk9STUFMfSVzXG4nCisgICAgSEVBREVSID0gJyR7Qk9MRH0ke0NZQU59JXMke05PUk1BTH1cblxuJworICAgICAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVybSwgaGVhZGVyLCB1c2VFVEE9VHJ1ZSk6CisgICAgICAgIHNlbGYudGVybSA9IHRlcm0KKyAgICAgICAgaWYgbm90IChzZWxmLnRlcm0uQ0xFQVJfRU9MIGFuZCBzZWxmLnRlcm0uVVAgYW5kIHNlbGYudGVybS5CT0wpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGVybWluYWwgaXNuJ3QgY2FwYWJsZSBlbm91Z2ggLS0geW91ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCB1c2UgYSBzaW1wbGVyIHByb2dyZXNzIGRpc3BhbHkuIikKKyAgICAgICAgc2VsZi53aWR0aCA9IHNlbGYudGVybS5DT0xTIG9yIDc1CisgICAgICAgIHNlbGYuYmFyID0gdGVybS5yZW5kZXIoc2VsZi5CQVIpCisgICAgICAgIHNlbGYuaGVhZGVyID0gc2VsZi50ZXJtLnJlbmRlcihzZWxmLkhFQURFUiAlIGhlYWRlci5jZW50ZXIoc2VsZi53aWR0aCkpCisgICAgICAgIHNlbGYuY2xlYXJlZCA9IDEgIzogdHJ1ZSBpZiB3ZSBoYXZlbid0IGRyYXduIHRoZSBiYXIgeWV0LgorICAgICAgICBzZWxmLnVzZUVUQSA9IHVzZUVUQQorICAgICAgICBpZiBzZWxmLnVzZUVUQToKKyAgICAgICAgICAgIHNlbGYuc3RhcnRUaW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi51cGRhdGUoMCwgJycpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBlcmNlbnQsIG1lc3NhZ2UpOgorICAgICAgICBpZiBzZWxmLmNsZWFyZWQ6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHNlbGYuaGVhZGVyKQorICAgICAgICAgICAgc2VsZi5jbGVhcmVkID0gMAorICAgICAgICBwcmVmaXggPSAnJTNkJSUgJyAlIChwZXJjZW50KjEwMCwpCisgICAgICAgIHN1ZmZpeCA9ICcnCisgICAgICAgIGlmIHNlbGYudXNlRVRBOgorICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUudGltZSgpIC0gc2VsZi5zdGFydFRpbWUKKyAgICAgICAgICAgIGlmIHBlcmNlbnQgPiAuMDAwMSBhbmQgZWxhcHNlZCA+IDE6CisgICAgICAgICAgICAgICAgdG90YWwgPSBlbGFwc2VkIC8gcGVyY2VudAorICAgICAgICAgICAgICAgIGV0YSA9IGludCh0b3RhbCAtIGVsYXBzZWQpCisgICAgICAgICAgICAgICAgaCA9IGV0YS8vMzYwMC4KKyAgICAgICAgICAgICAgICBtID0gKGV0YS8vNjApICUgNjAKKyAgICAgICAgICAgICAgICBzID0gZXRhICUgNjAKKyAgICAgICAgICAgICAgICBzdWZmaXggPSAnIEVUQTogJTAyZDolMDJkOiUwMmQnJShoLG0scykKKyAgICAgICAgYmFyV2lkdGggPSBzZWxmLndpZHRoIC0gbGVuKHByZWZpeCkgLSBsZW4oc3VmZml4KSAtIDIKKyAgICAgICAgbiA9IGludChiYXJXaWR0aCpwZXJjZW50KQorICAgICAgICBpZiBsZW4obWVzc2FnZSkgPCBzZWxmLndpZHRoOgorICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAnICcqKHNlbGYud2lkdGggLSBsZW4obWVzc2FnZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZXNzYWdlID0gJy4uLiAnICsgbWVzc2FnZVstKHNlbGYud2lkdGgtNCk6XQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKAorICAgICAgICAgICAgc2VsZi50ZXJtLkJPTCArIHNlbGYudGVybS5VUCArIHNlbGYudGVybS5DTEVBUl9FT0wgKworICAgICAgICAgICAgKHNlbGYuYmFyICUgKHByZWZpeCwgJz0nKm4sICctJyooYmFyV2lkdGgtbiksIHN1ZmZpeCkpICsKKyAgICAgICAgICAgIHNlbGYudGVybS5DTEVBUl9FT0wgKyBtZXNzYWdlKQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jbGVhcmVkOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzZWxmLnRlcm0uQk9MICsgc2VsZi50ZXJtLkNMRUFSX0VPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVybS5VUCArIHNlbGYudGVybS5DTEVBUl9FT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlcm0uVVAgKyBzZWxmLnRlcm0uQ0xFQVJfRU9MKQorICAgICAgICAgICAgc2VsZi5jbGVhcmVkID0gMQorCitkZWYgdGVzdCgpOgorICAgIGltcG9ydCB0aW1lCisgICAgdGMgPSBUZXJtaW5hbENvbnRyb2xsZXIoKQorICAgIHAgPSBQcm9ncmVzc0Jhcih0YywgJ1Rlc3RzJykKKyAgICBmb3IgaSBpbiByYW5nZSgxMDEpOgorICAgICAgICBwLnVwZGF0ZShpLzEwMC4sIHN0cihpKSkgICAgICAgIAorICAgICAgICB0aW1lLnNsZWVwKC4zKQorCitpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9TaENvbW1hbmRzLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L1NoQ29tbWFuZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1MDQzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9TaENvbW1hbmRzLnB5CkBAIC0wLDAgKzEsODUgQEAKK2NsYXNzIENvbW1hbmQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3MsIHJlZGlyZWN0cyk6CisgICAgICAgIHNlbGYuYXJncyA9IGxpc3QoYXJncykKKyAgICAgICAgc2VsZi5yZWRpcmVjdHMgPSBsaXN0KHJlZGlyZWN0cykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICdDb21tYW5kKCVyLCAlciknICUgKHNlbGYuYXJncywgc2VsZi5yZWRpcmVjdHMpCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBDb21tYW5kKToKKyAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgICAgIHJldHVybiBjbXAoKHNlbGYuYXJncywgc2VsZi5yZWRpcmVjdHMpLAorICAgICAgICAgICAgICAgICAgIChvdGhlci5hcmdzLCBvdGhlci5yZWRpcmVjdHMpKQorCisgICAgZGVmIHRvU2hlbGwoc2VsZiwgZmlsZSk6CisgICAgICAgIGZvciBhcmcgaW4gc2VsZi5hcmdzOgorICAgICAgICAgICAgaWYgIiciIG5vdCBpbiBhcmc6CisgICAgICAgICAgICAgICAgcXVvdGVkID0gIiclcyciICUgYXJnCisgICAgICAgICAgICBlbGlmICciJyBub3QgaW4gYXJnIGFuZCAnJCcgbm90IGluIGFyZzoKKyAgICAgICAgICAgICAgICBxdW90ZWQgPSAnIiVzIicgJSBhcmcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwnVW5hYmxlIHRvIHF1b3RlICVyJyAlIGFyZworICAgICAgICAgICAgcHJpbnQgPj5maWxlLCBxdW90ZWQsCisKKyAgICAgICAgICAgICMgRm9yIGRlYnVnZ2luZyAvIHZhbGlkYXRpb24uCisgICAgICAgICAgICBpbXBvcnQgU2hVdGlsCisgICAgICAgICAgICBkZXF1b3RlZCA9IGxpc3QoU2hVdGlsLlNoTGV4ZXIocXVvdGVkKS5sZXgoKSkKKyAgICAgICAgICAgIGlmIGRlcXVvdGVkICE9IFthcmddOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsJ1VuYWJsZSB0byBxdW90ZSAlcicgJSBhcmcKKworICAgICAgICBmb3IgciBpbiBzZWxmLnJlZGlyZWN0czoKKyAgICAgICAgICAgIGlmIGxlbihyWzBdKSA9PSAxOgorICAgICAgICAgICAgICAgIHByaW50ID4+ZmlsZSwgIiVzICclcyciICUgKHJbMF1bMF0sIHJbMV0pLAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCA+PmZpbGUsICIlcyVzICclcyciICUgKHJbMF1bMV0sIHJbMF1bMF0sIHJbMV0pLAorCitjbGFzcyBQaXBlbGluZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29tbWFuZHMsIG5lZ2F0ZT1GYWxzZSwgcGlwZV9lcnI9RmFsc2UpOgorICAgICAgICBzZWxmLmNvbW1hbmRzID0gY29tbWFuZHMKKyAgICAgICAgc2VsZi5uZWdhdGUgPSBuZWdhdGUKKyAgICAgICAgc2VsZi5waXBlX2VyciA9IHBpcGVfZXJyCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnUGlwZWxpbmUoJXIsICVyLCAlciknICUgKHNlbGYuY29tbWFuZHMsIHNlbGYubmVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpcGVfZXJyKQorCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgUGlwZWxpbmUpOgorICAgICAgICAgICAgcmV0dXJuIC0xCisKKyAgICAgICAgcmV0dXJuIGNtcCgoc2VsZi5jb21tYW5kcywgc2VsZi5uZWdhdGUsIHNlbGYucGlwZV9lcnIpLAorICAgICAgICAgICAgICAgICAgIChvdGhlci5jb21tYW5kcywgb3RoZXIubmVnYXRlLCBzZWxmLnBpcGVfZXJyKSkKKworICAgIGRlZiB0b1NoZWxsKHNlbGYsIGZpbGUsIHBpcGVmYWlsPUZhbHNlKToKKyAgICAgICAgaWYgcGlwZWZhaWwgIT0gc2VsZi5waXBlX2VycjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsJ0luY29uc2lzdGVudCAicGlwZWZhaWwiIGF0dHJpYnV0ZSEnCisgICAgICAgIGlmIHNlbGYubmVnYXRlOgorICAgICAgICAgICAgcHJpbnQgPj5maWxlLCAnIScsCisgICAgICAgIGZvciBjbWQgaW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIGNtZC50b1NoZWxsKGZpbGUpCisgICAgICAgICAgICBpZiBjbWQgaXMgbm90IHNlbGYuY29tbWFuZHNbLTFdOgorICAgICAgICAgICAgICAgIHByaW50ID4+ZmlsZSwgJ3xcbiAnLAorCitjbGFzcyBTZXE6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxocywgb3AsIHJocyk6CisgICAgICAgIGFzc2VydCBvcCBpbiAoJzsnLCAnJicsICd8fCcsICcmJicpCisgICAgICAgIHNlbGYub3AgPSBvcAorICAgICAgICBzZWxmLmxocyA9IGxocworICAgICAgICBzZWxmLnJocyA9IHJocworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ1NlcSglciwgJXIsICVyKScgJSAoc2VsZi5saHMsIHNlbGYub3AsIHNlbGYucmhzKQorCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU2VxKToKKyAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgICAgIHJldHVybiBjbXAoKHNlbGYubGhzLCBzZWxmLm9wLCBzZWxmLnJocyksCisgICAgICAgICAgICAgICAgICAgKG90aGVyLmxocywgb3RoZXIub3AsIG90aGVyLnJocykpCisKKyAgICBkZWYgdG9TaGVsbChzZWxmLCBmaWxlLCBwaXBlZmFpbD1GYWxzZSk6CisgICAgICAgIHNlbGYubGhzLnRvU2hlbGwoZmlsZSwgcGlwZWZhaWwpCisgICAgICAgIHByaW50ID4+ZmlsZSwgJyAlc1xuJyAlIHNlbGYub3AKKyAgICAgICAgc2VsZi5yaHMudG9TaGVsbChmaWxlLCBwaXBlZmFpbCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9TaFV0aWwucHkgYi9zcmMvTExWTS91dGlscy9saXQvU2hVdGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjkzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvU2hVdGlsLnB5CkBAIC0wLDAgKzEsMzQ2IEBACitpbXBvcnQgaXRlcnRvb2xzCisKK2ltcG9ydCBVdGlsCitmcm9tIFNoQ29tbWFuZHMgaW1wb3J0IENvbW1hbmQsIFBpcGVsaW5lLCBTZXEKKworY2xhc3MgU2hMZXhlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSwgd2luMzJFc2NhcGVzID0gRmFsc2UpOgorICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgIHNlbGYucG9zID0gMAorICAgICAgICBzZWxmLmVuZCA9IGxlbihkYXRhKQorICAgICAgICBzZWxmLndpbjMyRXNjYXBlcyA9IHdpbjMyRXNjYXBlcworCisgICAgZGVmIGVhdChzZWxmKToKKyAgICAgICAgYyA9IHNlbGYuZGF0YVtzZWxmLnBvc10KKyAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICByZXR1cm4gYworCisgICAgZGVmIGxvb2soc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGFbc2VsZi5wb3NdCisKKyAgICBkZWYgbWF5YmVfZWF0KHNlbGYsIGMpOgorICAgICAgICAiIiIKKyAgICAgICAgbWF5YmVfZWF0KGMpIC0gQ29uc3VtZSB0aGUgY2hhcmFjdGVyIGMgaWYgaXQgaXMgdGhlIG5leHQgY2hhcmFjdGVyLAorICAgICAgICByZXR1cm5pbmcgVHJ1ZSBpZiBhIGNoYXJhY3RlciB3YXMgY29uc3VtZWQuICIiIgorICAgICAgICBpZiBzZWxmLmRhdGFbc2VsZi5wb3NdID09IGM6CisgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBsZXhfYXJnX2Zhc3Qoc2VsZiwgYyk6CisgICAgICAgICMgR2V0IHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgZnJlZSBzZWN0aW9uLgorICAgICAgICBjaHVuayA9IHNlbGYuZGF0YVtzZWxmLnBvcyAtIDE6XS5zcGxpdChOb25lLCAxKVswXQorICAgICAgICAKKyAgICAgICAgIyBJZiBpdCBoYXMgc3BlY2lhbCBjaGFyYWN0ZXJzLCB0aGUgZmFzdCBwYXRoIGZhaWxlZC4KKyAgICAgICAgaWYgKCd8JyBpbiBjaHVuayBvciAnJicgaW4gY2h1bmsgb3IgCisgICAgICAgICAgICAnPCcgaW4gY2h1bmsgb3IgJz4nIGluIGNodW5rIG9yCisgICAgICAgICAgICAiJyIgaW4gY2h1bmsgb3IgJyInIGluIGNodW5rIG9yCisgICAgICAgICAgICAnXFwnIGluIGNodW5rKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIAorICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zIC0gMSArIGxlbihjaHVuaykKKyAgICAgICAgcmV0dXJuIGNodW5rCisgICAgICAgIAorICAgIGRlZiBsZXhfYXJnX3Nsb3coc2VsZiwgYyk6CisgICAgICAgIGlmIGMgaW4gIidcIiI6CisgICAgICAgICAgICBzdHIgPSBzZWxmLmxleF9hcmdfcXVvdGVkKGMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHIgPSBjCisgICAgICAgIHdoaWxlIHNlbGYucG9zICE9IHNlbGYuZW5kOgorICAgICAgICAgICAgYyA9IHNlbGYubG9vaygpCisgICAgICAgICAgICBpZiBjLmlzc3BhY2UoKSBvciBjIGluICJ8JiI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgYyBpbiAnPjwnOgorICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhbiBhbm5veWluZyBjYXNlOyB3ZSB0cmVhdCAnMj4nIGFzIGEgc2luZ2xlIHRva2VuIHNvCisgICAgICAgICAgICAgICAgIyB3ZSBkb24ndCBoYXZlIHRvIHRyYWNrIHdoaXRlc3BhY2UgdG9rZW5zLgorCisgICAgICAgICAgICAgICAgIyBJZiB0aGUgcGFyc2Ugc3RyaW5nIGlzbid0IGFuIGludGVnZXIsIGRvIHRoZSB1c3VhbCB0aGluZy4KKyAgICAgICAgICAgICAgICBpZiBub3Qgc3RyLmlzZGlnaXQoKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBsZXggdGhlIG9wZXJhdG9yIGFuZCBjb252ZXJ0IHRvIGEgcmVkaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAjIHRva2VuLgorICAgICAgICAgICAgICAgIG51bSA9IGludChzdHIpCisgICAgICAgICAgICAgICAgdG9rID0gc2VsZi5sZXhfb25lX3Rva2VuKCkKKyAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0b2ssIHR1cGxlKSBhbmQgbGVuKHRvaykgPT0gMQorICAgICAgICAgICAgICAgIHJldHVybiAodG9rWzBdLCBudW0pICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGVsaWYgYyA9PSAnIic6CisgICAgICAgICAgICAgICAgc2VsZi5lYXQoKQorICAgICAgICAgICAgICAgIHN0ciArPSBzZWxmLmxleF9hcmdfcXVvdGVkKCciJykKKyAgICAgICAgICAgIGVsaWYgbm90IHNlbGYud2luMzJFc2NhcGVzIGFuZCBjID09ICdcXCc6CisgICAgICAgICAgICAgICAgIyBPdXRzaWRlIG9mIGEgc3RyaW5nLCAnXFwnIGVzY2FwZXMgZXZlcnl0aGluZy4KKyAgICAgICAgICAgICAgICBzZWxmLmVhdCgpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5wb3MgPT0gc2VsZi5lbmQ6CisgICAgICAgICAgICAgICAgICAgIFV0aWwud2FybmluZygiZXNjYXBlIGF0IGVuZCBvZiBxdW90ZWQgYXJndW1lbnQgaW46ICVyIiAlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyCisgICAgICAgICAgICAgICAgc3RyICs9IHNlbGYuZWF0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyICs9IHNlbGYuZWF0KCkKKyAgICAgICAgcmV0dXJuIHN0cgorCisgICAgZGVmIGxleF9hcmdfcXVvdGVkKHNlbGYsIGRlbGltKToKKyAgICAgICAgc3RyID0gJycKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgIT0gc2VsZi5lbmQ6CisgICAgICAgICAgICBjID0gc2VsZi5lYXQoKQorICAgICAgICAgICAgaWYgYyA9PSBkZWxpbToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyCisgICAgICAgICAgICBlbGlmIGMgPT0gJ1xcJyBhbmQgZGVsaW0gPT0gJyInOgorICAgICAgICAgICAgICAgICMgSW5zaWRlIGEgJyInIHF1b3RlZCBzdHJpbmcsICdcXCcgb25seSBlc2NhcGVzIHRoZSBxdW90ZQorICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIGFuZCBiYWNrc2xhc2gsIG90aGVyd2lzZSBpdCBpcyBwcmVzZXJ2ZWQuCisgICAgICAgICAgICAgICAgaWYgc2VsZi5wb3MgPT0gc2VsZi5lbmQ6CisgICAgICAgICAgICAgICAgICAgIFV0aWwud2FybmluZygiZXNjYXBlIGF0IGVuZCBvZiBxdW90ZWQgYXJndW1lbnQgaW46ICVyIiAlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyCisgICAgICAgICAgICAgICAgYyA9IHNlbGYuZWF0KCkKKyAgICAgICAgICAgICAgICBpZiBjID09ICciJzogIyAKKyAgICAgICAgICAgICAgICAgICAgc3RyICs9ICciJworICAgICAgICAgICAgICAgIGVsaWYgYyA9PSAnXFwnOgorICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFwnICsgYworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHIgKz0gYworICAgICAgICBVdGlsLndhcm5pbmcoIm1pc3NpbmcgcXVvdGUgY2hhcmFjdGVyIGluICVyIiAlIHNlbGYuZGF0YSkKKyAgICAgICAgcmV0dXJuIHN0cgorICAgIAorICAgIGRlZiBsZXhfYXJnX2NoZWNrZWQoc2VsZiwgYyk6CisgICAgICAgIHBvcyA9IHNlbGYucG9zCisgICAgICAgIHJlcyA9IHNlbGYubGV4X2FyZ19mYXN0KGMpCisgICAgICAgIGVuZCA9IHNlbGYucG9zCisKKyAgICAgICAgc2VsZi5wb3MgPSBwb3MKKyAgICAgICAgcmVmZXJlbmNlID0gc2VsZi5sZXhfYXJnX3Nsb3coYykKKyAgICAgICAgaWYgcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgcmVzICE9IHJlZmVyZW5jZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCJGYXN0IHBhdGggZmFpbHVyZTogJXIgIT0gJXIiICUgKHJlcywgcmVmZXJlbmNlKQorICAgICAgICAgICAgaWYgc2VsZi5wb3MgIT0gZW5kOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIkZhc3QgcGF0aCBmYWlsdXJlOiAlciAhPSAlciIgJSAoc2VsZi5wb3MsIGVuZCkKKyAgICAgICAgcmV0dXJuIHJlZmVyZW5jZQorICAgICAgICAKKyAgICBkZWYgbGV4X2FyZyhzZWxmLCBjKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGV4X2FyZ19mYXN0KGMpIG9yIHNlbGYubGV4X2FyZ19zbG93KGMpCisgICAgICAgIAorICAgIGRlZiBsZXhfb25lX3Rva2VuKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgbGV4X29uZV90b2tlbiAtIExleCBhIHNpbmdsZSAnc2gnIHRva2VuLiAiIiIKKworICAgICAgICBjID0gc2VsZi5lYXQoKQorICAgICAgICBpZiBjIGluICc7ISc6CisgICAgICAgICAgICByZXR1cm4gKGMsKQorICAgICAgICBpZiBjID09ICd8JzoKKyAgICAgICAgICAgIGlmIHNlbGYubWF5YmVfZWF0KCd8Jyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICgnfHwnLCkKKyAgICAgICAgICAgIHJldHVybiAoYywpCisgICAgICAgIGlmIGMgPT0gJyYnOgorICAgICAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJyYnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCcmJicsKQorICAgICAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJz4nKTogCisgICAgICAgICAgICAgICAgcmV0dXJuICgnJj4nLCkKKyAgICAgICAgICAgIHJldHVybiAoYywpCisgICAgICAgIGlmIGMgPT0gJz4nOgorICAgICAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJyYnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCc+JicsKQorICAgICAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJz4nKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCc+PicsKQorICAgICAgICAgICAgcmV0dXJuIChjLCkKKyAgICAgICAgaWYgYyA9PSAnPCc6CisgICAgICAgICAgICBpZiBzZWxmLm1heWJlX2VhdCgnJicpOgorICAgICAgICAgICAgICAgIHJldHVybiAoJzwmJywpCisgICAgICAgICAgICBpZiBzZWxmLm1heWJlX2VhdCgnPicpOgorICAgICAgICAgICAgICAgIHJldHVybiAoJzw8JywpCisgICAgICAgICAgICByZXR1cm4gKGMsKQorCisgICAgICAgIHJldHVybiBzZWxmLmxleF9hcmcoYykKKworICAgIGRlZiBsZXgoc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYucG9zICE9IHNlbGYuZW5kOgorICAgICAgICAgICAgaWYgc2VsZi5sb29rKCkuaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgIHNlbGYuZWF0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5sZXhfb25lX3Rva2VuKCkKKworIyMjCisgCitjbGFzcyBTaFBhcnNlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSwgd2luMzJFc2NhcGVzID0gRmFsc2UpOgorICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgIHNlbGYudG9rZW5zID0gU2hMZXhlcihkYXRhLCB3aW4zMkVzY2FwZXMgPSB3aW4zMkVzY2FwZXMpLmxleCgpCisgICAgCisgICAgZGVmIGxleChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zLm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgCisgICAgZGVmIGxvb2soc2VsZik6CisgICAgICAgIG5leHQgPSBzZWxmLmxleCgpCisgICAgICAgIGlmIG5leHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnRva2VucyA9IGl0ZXJ0b29scy5jaGFpbihbbmV4dF0sIHNlbGYudG9rZW5zKQorICAgICAgICByZXR1cm4gbmV4dAorICAgIAorICAgIGRlZiBwYXJzZV9jb21tYW5kKHNlbGYpOgorICAgICAgICB0b2sgPSBzZWxmLmxleCgpCisgICAgICAgIGlmIG5vdCB0b2s6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCJlbXB0eSBjb21tYW5kISIKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2ssIHR1cGxlKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsInN5bnRheCBlcnJvciBuZWFyIHVuZXhwZWN0ZWQgdG9rZW4gJXIiICUgdG9rWzBdCisgICAgICAgIAorICAgICAgICBhcmdzID0gW3Rva10KKyAgICAgICAgcmVkaXJlY3RzID0gW10KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRvayA9IHNlbGYubG9vaygpCisKKyAgICAgICAgICAgICMgRU9GPworICAgICAgICAgICAgaWYgdG9rIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGFuIGFyZ3VtZW50LCBqdXN0IGFkZCBpdCB0byB0aGUgY3VycmVudCBjb21tYW5kLgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2ssIHN0cik6CisgICAgICAgICAgICAgICAgYXJncy5hcHBlbmQoc2VsZi5sZXgoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIE90aGVyd2lzZSBzZWUgaWYgaXQgaXMgYSB0ZXJtaW5hdG9yLgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodG9rLCB0dXBsZSkKKyAgICAgICAgICAgIGlmIHRva1swXSBpbiAoJ3wnLCc7JywnJicsJ3x8JywnJiYnKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgCisgICAgICAgICAgICAjIE90aGVyd2lzZSBpdCBtdXN0IGJlIGEgcmVkaXJlY3Rpb24uCisgICAgICAgICAgICBvcCA9IHNlbGYubGV4KCkKKyAgICAgICAgICAgIGFyZyA9IHNlbGYubGV4KCkKKyAgICAgICAgICAgIGlmIG5vdCBhcmc6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwic3ludGF4IGVycm9yIG5lYXIgdG9rZW4gJXIiICUgb3BbMF0KKyAgICAgICAgICAgIHJlZGlyZWN0cy5hcHBlbmQoKG9wLCBhcmcpKQorCisgICAgICAgIHJldHVybiBDb21tYW5kKGFyZ3MsIHJlZGlyZWN0cykKKworICAgIGRlZiBwYXJzZV9waXBlbGluZShzZWxmKToKKyAgICAgICAgbmVnYXRlID0gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5sb29rKCkgPT0gKCchJywpOgorICAgICAgICAgICAgc2VsZi5sZXgoKQorICAgICAgICAgICAgbmVnYXRlID0gVHJ1ZQorCisgICAgICAgIGNvbW1hbmRzID0gW3NlbGYucGFyc2VfY29tbWFuZCgpXQorICAgICAgICB3aGlsZSBzZWxmLmxvb2soKSA9PSAoJ3wnLCk6CisgICAgICAgICAgICBzZWxmLmxleCgpCisgICAgICAgICAgICBjb21tYW5kcy5hcHBlbmQoc2VsZi5wYXJzZV9jb21tYW5kKCkpCisgICAgICAgIHJldHVybiBQaXBlbGluZShjb21tYW5kcywgbmVnYXRlKQorICAgICAgICAgICAgCisgICAgZGVmIHBhcnNlKHNlbGYpOgorICAgICAgICBsaHMgPSBzZWxmLnBhcnNlX3BpcGVsaW5lKCkKKworICAgICAgICB3aGlsZSBzZWxmLmxvb2soKToKKyAgICAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5sZXgoKQorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3BlcmF0b3IsIHR1cGxlKSBhbmQgbGVuKG9wZXJhdG9yKSA9PSAxCisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmxvb2soKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibWlzc2luZyBhcmd1bWVudCB0byBvcGVyYXRvciAlciIgJSBvcGVyYXRvclswXQorICAgICAgICAgICAgCisgICAgICAgICAgICAjIEZJWE1FOiBPcGVyYXRvciBwcmVjZWRlbmNlISEKKyAgICAgICAgICAgIGxocyA9IFNlcShsaHMsIG9wZXJhdG9yWzBdLCBzZWxmLnBhcnNlX3BpcGVsaW5lKCkpCisKKyAgICAgICAgcmV0dXJuIGxocworCisjIyMKKworaW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RTaExleGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbGV4KHNlbGYsIHN0ciwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIGxpc3QoU2hMZXhlcihzdHIsICphcmdzLCAqKmt3YXJncykubGV4KCkpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgnYXxiPmMmZDxlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgKCd8JywpLCAnYicsICgnPicsKSwgJ2MnLCAoJyYnLCksICdkJywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPCcsKSwgJ2UnXSkKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0aW9uX3Rva2VucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgnYTI+YycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnYTInLCAoJz4nLCksICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoJ2EgMj5jJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgKCc+JywyKSwgJ2MnXSkKKyAgICAgICAgCisgICAgZGVmIHRlc3RfcXVvdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgiIiIgJ2EnICIiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiICJoZWxsb1xcIndvcmxkIiAiIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnaGVsbG8id29ybGQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgiIiIgImhlbGxvXFwnd29ybGQiICIiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJoZWxsb1xcJ3dvcmxkIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiICJoZWxsb1xcXFx3b3JsZCIgIiIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbGxvXFx3b3JsZCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCIiIiBoZSJsbG8gd28icmxkICIiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJoZWxsbyB3b3JsZCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCIiIiBhXFwgYiBhXFxcXGIgIiIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImEgYiIsICJhXFxiIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiICIiICIiICIiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyIiLCAiIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiIGFcXCBiICIiIiwgd2luMzJFc2NhcGVzID0gVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhXFwnLCAnYiddKQorCitjbGFzcyBUZXN0U2hQYXJzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHBhcnNlKHNlbGYsIHN0cik6CisgICAgICAgIHJldHVybiBTaFBhcnNlcihzdHIpLnBhcnNlKCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2VjaG8gaGVsbG8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZShbQ29tbWFuZChbJ2VjaG8nLCAnaGVsbG8nXSwgW10pXSwgRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2VjaG8gIiInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZShbQ29tbWFuZChbJ2VjaG8nLCAnJ10sIFtdKV0sIEZhbHNlKSkKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2VjaG8gaGVsbG8gPiBjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydlY2hvJywgJ2hlbGxvJ10sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoKCgnPicpLCksICdjJyldKV0sIEZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdlY2hvIGhlbGxvID4gYyA+PiBkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydlY2hvJywgJ2hlbGxvJ10sIFsoKCc+JywpLCAnYycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCc+PicsKSwgJ2QnKV0pXSwgRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2EgMj4mMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbKCgnPiYnLDIpLCAnMScpXSldLCBGYWxzZSkpCisKKyAgICBkZWYgdGVzdF9waXBlbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdhIHwgYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQoWydiJ10sIFtdKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSB8IGIgfCBjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydhJ10sIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZChbJ2InXSwgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kKFsnYyddLCBbXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJyEgYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpKQorCisgICAgZGVmIHRlc3RfbGlzdChzZWxmKTogICAgICAgIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2EgOyBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydiJ10sIFtdKV0sIEZhbHNlKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdhICYgYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNlcShQaXBlbGluZShbQ29tbWFuZChbJ2EnXSwgW10pXSwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYiddLCBbXSldLCBGYWxzZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSAmJiBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcmJicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYiddLCBbXSldLCBGYWxzZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSB8fCBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd8fCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYiddLCBbXSldLCBGYWxzZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSAmJiBiIHx8IGMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXEoU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJiYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydiJ10sIFtdKV0sIEZhbHNlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd8fCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYyddLCBbXSldLCBGYWxzZSkpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L1NoVXRpbC5weS5iYWsgYi9zcmMvTExWTS91dGlscy9saXQvU2hVdGlsLnB5LmJhawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJiYjNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L1NoVXRpbC5weS5iYWsKQEAgLTAsMCArMSwzNDYgQEAKK2ltcG9ydCBpdGVydG9vbHMKKworaW1wb3J0IFV0aWwKK2Zyb20gU2hDb21tYW5kcyBpbXBvcnQgQ29tbWFuZCwgUGlwZWxpbmUsIFNlcQorCitjbGFzcyBTaExleGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB3aW4zMkVzY2FwZXMgPSBGYWxzZSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgc2VsZi5wb3MgPSAwCisgICAgICAgIHNlbGYuZW5kID0gbGVuKGRhdGEpCisgICAgICAgIHNlbGYud2luMzJFc2NhcGVzID0gd2luMzJFc2NhcGVzCisKKyAgICBkZWYgZWF0KHNlbGYpOgorICAgICAgICBjID0gc2VsZi5kYXRhW3NlbGYucG9zXQorICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgIHJldHVybiBjCisKKyAgICBkZWYgbG9vayhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtzZWxmLnBvc10KKworICAgIGRlZiBtYXliZV9lYXQoc2VsZiwgYyk6CisgICAgICAgICIiIgorICAgICAgICBtYXliZV9lYXQoYykgLSBDb25zdW1lIHRoZSBjaGFyYWN0ZXIgYyBpZiBpdCBpcyB0aGUgbmV4dCBjaGFyYWN0ZXIsCisgICAgICAgIHJldHVybmluZyBUcnVlIGlmIGEgY2hhcmFjdGVyIHdhcyBjb25zdW1lZC4gIiIiCisgICAgICAgIGlmIHNlbGYuZGF0YVtzZWxmLnBvc10gPT0gYzoKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGxleF9hcmdfZmFzdChzZWxmLCBjKToKKyAgICAgICAgIyBHZXQgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBmcmVlIHNlY3Rpb24uCisgICAgICAgIGNodW5rID0gc2VsZi5kYXRhW3NlbGYucG9zIC0gMTpdLnNwbGl0KE5vbmUsIDEpWzBdCisgICAgICAgIAorICAgICAgICAjIElmIGl0IGhhcyBzcGVjaWFsIGNoYXJhY3RlcnMsIHRoZSBmYXN0IHBhdGggZmFpbGVkLgorICAgICAgICBpZiAoJ3wnIGluIGNodW5rIG9yICcmJyBpbiBjaHVuayBvciAKKyAgICAgICAgICAgICc8JyBpbiBjaHVuayBvciAnPicgaW4gY2h1bmsgb3IKKyAgICAgICAgICAgICInIiBpbiBjaHVuayBvciAnIicgaW4gY2h1bmsgb3IKKyAgICAgICAgICAgICdcXCcgaW4gY2h1bmspOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgCisgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgLSAxICsgbGVuKGNodW5rKQorICAgICAgICByZXR1cm4gY2h1bmsKKyAgICAgICAgCisgICAgZGVmIGxleF9hcmdfc2xvdyhzZWxmLCBjKToKKyAgICAgICAgaWYgYyBpbiAiJ1wiIjoKKyAgICAgICAgICAgIHN0ciA9IHNlbGYubGV4X2FyZ19xdW90ZWQoYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0ciA9IGMKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgIT0gc2VsZi5lbmQ6CisgICAgICAgICAgICBjID0gc2VsZi5sb29rKCkKKyAgICAgICAgICAgIGlmIGMuaXNzcGFjZSgpIG9yIGMgaW4gInwmIjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBjIGluICc+PCc6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIGFubm95aW5nIGNhc2U7IHdlIHRyZWF0ICcyPicgYXMgYSBzaW5nbGUgdG9rZW4gc28KKyAgICAgICAgICAgICAgICAjIHdlIGRvbid0IGhhdmUgdG8gdHJhY2sgd2hpdGVzcGFjZSB0b2tlbnMuCisKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBwYXJzZSBzdHJpbmcgaXNuJ3QgYW4gaW50ZWdlciwgZG8gdGhlIHVzdWFsIHRoaW5nLgorICAgICAgICAgICAgICAgIGlmIG5vdCBzdHIuaXNkaWdpdCgpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgIyBPdGhlcndpc2UsIGxleCB0aGUgb3BlcmF0b3IgYW5kIGNvbnZlcnQgdG8gYSByZWRpcmVjdGlvbgorICAgICAgICAgICAgICAgICMgdG9rZW4uCisgICAgICAgICAgICAgICAgbnVtID0gaW50KHN0cikKKyAgICAgICAgICAgICAgICB0b2sgPSBzZWxmLmxleF9vbmVfdG9rZW4oKQorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRvaywgdHVwbGUpIGFuZCBsZW4odG9rKSA9PSAxCisgICAgICAgICAgICAgICAgcmV0dXJuICh0b2tbMF0sIG51bSkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZWxpZiBjID09ICciJzoKKyAgICAgICAgICAgICAgICBzZWxmLmVhdCgpCisgICAgICAgICAgICAgICAgc3RyICs9IHNlbGYubGV4X2FyZ19xdW90ZWQoJyInKQ0KKyAgICAgICAgICAgIGVsaWYgbm90IHNlbGYud2luMzJFc2NhcGVzIGFuZCBjID09ICdcXCc6CisgICAgICAgICAgICAgICAgIyBPdXRzaWRlIG9mIGEgc3RyaW5nLCAnXFwnIGVzY2FwZXMgZXZlcnl0aGluZy4KKyAgICAgICAgICAgICAgICBzZWxmLmVhdCgpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5wb3MgPT0gc2VsZi5lbmQ6CisgICAgICAgICAgICAgICAgICAgIFV0aWwud2FybmluZygiZXNjYXBlIGF0IGVuZCBvZiBxdW90ZWQgYXJndW1lbnQgaW46ICVyIiAlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyCisgICAgICAgICAgICAgICAgc3RyICs9IHNlbGYuZWF0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyICs9IHNlbGYuZWF0KCkKKyAgICAgICAgcmV0dXJuIHN0cgorCisgICAgZGVmIGxleF9hcmdfcXVvdGVkKHNlbGYsIGRlbGltKToKKyAgICAgICAgc3RyID0gJycKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgIT0gc2VsZi5lbmQ6CisgICAgICAgICAgICBjID0gc2VsZi5lYXQoKQorICAgICAgICAgICAgaWYgYyA9PSBkZWxpbToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyCisgICAgICAgICAgICBlbGlmIGMgPT0gJ1xcJyBhbmQgZGVsaW0gPT0gJyInOgorICAgICAgICAgICAgICAgICMgSW5zaWRlIGEgJyInIHF1b3RlZCBzdHJpbmcsICdcXCcgb25seSBlc2NhcGVzIHRoZSBxdW90ZQorICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIGFuZCBiYWNrc2xhc2gsIG90aGVyd2lzZSBpdCBpcyBwcmVzZXJ2ZWQuCisgICAgICAgICAgICAgICAgaWYgc2VsZi5wb3MgPT0gc2VsZi5lbmQ6CisgICAgICAgICAgICAgICAgICAgIFV0aWwud2FybmluZygiZXNjYXBlIGF0IGVuZCBvZiBxdW90ZWQgYXJndW1lbnQgaW46ICVyIiAlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyCisgICAgICAgICAgICAgICAgYyA9IHNlbGYuZWF0KCkKKyAgICAgICAgICAgICAgICBpZiBjID09ICciJzogIyAKKyAgICAgICAgICAgICAgICAgICAgc3RyICs9ICciJworICAgICAgICAgICAgICAgIGVsaWYgYyA9PSAnXFwnOgorICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFwnICsgYworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHIgKz0gYworICAgICAgICBVdGlsLndhcm5pbmcoIm1pc3NpbmcgcXVvdGUgY2hhcmFjdGVyIGluICVyIiAlIHNlbGYuZGF0YSkKKyAgICAgICAgcmV0dXJuIHN0cgorICAgIAorICAgIGRlZiBsZXhfYXJnX2NoZWNrZWQoc2VsZiwgYyk6CisgICAgICAgIHBvcyA9IHNlbGYucG9zCisgICAgICAgIHJlcyA9IHNlbGYubGV4X2FyZ19mYXN0KGMpCisgICAgICAgIGVuZCA9IHNlbGYucG9zCisKKyAgICAgICAgc2VsZi5wb3MgPSBwb3MKKyAgICAgICAgcmVmZXJlbmNlID0gc2VsZi5sZXhfYXJnX3Nsb3coYykKKyAgICAgICAgaWYgcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgcmVzICE9IHJlZmVyZW5jZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCJGYXN0IHBhdGggZmFpbHVyZTogJXIgIT0gJXIiICUgKHJlcywgcmVmZXJlbmNlKQorICAgICAgICAgICAgaWYgc2VsZi5wb3MgIT0gZW5kOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIkZhc3QgcGF0aCBmYWlsdXJlOiAlciAhPSAlciIgJSAoc2VsZi5wb3MsIGVuZCkKKyAgICAgICAgcmV0dXJuIHJlZmVyZW5jZQorICAgICAgICAKKyAgICBkZWYgbGV4X2FyZyhzZWxmLCBjKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGV4X2FyZ19mYXN0KGMpIG9yIHNlbGYubGV4X2FyZ19zbG93KGMpCisgICAgICAgIAorICAgIGRlZiBsZXhfb25lX3Rva2VuKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgbGV4X29uZV90b2tlbiAtIExleCBhIHNpbmdsZSAnc2gnIHRva2VuLiAiIiIKKworICAgICAgICBjID0gc2VsZi5lYXQoKQorICAgICAgICBpZiBjIGluICc7ISc6CisgICAgICAgICAgICByZXR1cm4gKGMsKQorICAgICAgICBpZiBjID09ICd8JzoKKyAgICAgICAgICAgIGlmIHNlbGYubWF5YmVfZWF0KCd8Jyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICgnfHwnLCkKKyAgICAgICAgICAgIHJldHVybiAoYywpCisgICAgICAgIGlmIGMgPT0gJyYnOgorICAgICAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJyYnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCcmJicsKQorICAgICAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJz4nKTogCisgICAgICAgICAgICAgICAgcmV0dXJuICgnJj4nLCkKKyAgICAgICAgICAgIHJldHVybiAoYywpCisgICAgICAgIGlmIGMgPT0gJz4nOgorICAgICAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJyYnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCc+JicsKQorICAgICAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJz4nKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCc+PicsKQorICAgICAgICAgICAgcmV0dXJuIChjLCkKKyAgICAgICAgaWYgYyA9PSAnPCc6CisgICAgICAgICAgICBpZiBzZWxmLm1heWJlX2VhdCgnJicpOgorICAgICAgICAgICAgICAgIHJldHVybiAoJzwmJywpCisgICAgICAgICAgICBpZiBzZWxmLm1heWJlX2VhdCgnPicpOgorICAgICAgICAgICAgICAgIHJldHVybiAoJzw8JywpCisgICAgICAgICAgICByZXR1cm4gKGMsKQorCisgICAgICAgIHJldHVybiBzZWxmLmxleF9hcmcoYykKKworICAgIGRlZiBsZXgoc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYucG9zICE9IHNlbGYuZW5kOgorICAgICAgICAgICAgaWYgc2VsZi5sb29rKCkuaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgIHNlbGYuZWF0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5sZXhfb25lX3Rva2VuKCkKKworIyMjCisgCitjbGFzcyBTaFBhcnNlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSwgd2luMzJFc2NhcGVzID0gRmFsc2UpOgorICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgIHNlbGYudG9rZW5zID0gU2hMZXhlcihkYXRhLCB3aW4zMkVzY2FwZXMgPSB3aW4zMkVzY2FwZXMpLmxleCgpCisgICAgCisgICAgZGVmIGxleChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zLm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgCisgICAgZGVmIGxvb2soc2VsZik6CisgICAgICAgIG5leHQgPSBzZWxmLmxleCgpCisgICAgICAgIGlmIG5leHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnRva2VucyA9IGl0ZXJ0b29scy5jaGFpbihbbmV4dF0sIHNlbGYudG9rZW5zKQorICAgICAgICByZXR1cm4gbmV4dAorICAgIAorICAgIGRlZiBwYXJzZV9jb21tYW5kKHNlbGYpOgorICAgICAgICB0b2sgPSBzZWxmLmxleCgpCisgICAgICAgIGlmIG5vdCB0b2s6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCJlbXB0eSBjb21tYW5kISIKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2ssIHR1cGxlKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsInN5bnRheCBlcnJvciBuZWFyIHVuZXhwZWN0ZWQgdG9rZW4gJXIiICUgdG9rWzBdCisgICAgICAgIAorICAgICAgICBhcmdzID0gW3Rva10KKyAgICAgICAgcmVkaXJlY3RzID0gW10KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRvayA9IHNlbGYubG9vaygpCisKKyAgICAgICAgICAgICMgRU9GPworICAgICAgICAgICAgaWYgdG9rIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGFuIGFyZ3VtZW50LCBqdXN0IGFkZCBpdCB0byB0aGUgY3VycmVudCBjb21tYW5kLgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2ssIHN0cik6CisgICAgICAgICAgICAgICAgYXJncy5hcHBlbmQoc2VsZi5sZXgoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIE90aGVyd2lzZSBzZWUgaWYgaXQgaXMgYSB0ZXJtaW5hdG9yLgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodG9rLCB0dXBsZSkKKyAgICAgICAgICAgIGlmIHRva1swXSBpbiAoJ3wnLCc7JywnJicsJ3x8JywnJiYnKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgCisgICAgICAgICAgICAjIE90aGVyd2lzZSBpdCBtdXN0IGJlIGEgcmVkaXJlY3Rpb24uCisgICAgICAgICAgICBvcCA9IHNlbGYubGV4KCkKKyAgICAgICAgICAgIGFyZyA9IHNlbGYubGV4KCkKKyAgICAgICAgICAgIGlmIG5vdCBhcmc6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwic3ludGF4IGVycm9yIG5lYXIgdG9rZW4gJXIiICUgb3BbMF0KKyAgICAgICAgICAgIHJlZGlyZWN0cy5hcHBlbmQoKG9wLCBhcmcpKQorCisgICAgICAgIHJldHVybiBDb21tYW5kKGFyZ3MsIHJlZGlyZWN0cykKKworICAgIGRlZiBwYXJzZV9waXBlbGluZShzZWxmKToKKyAgICAgICAgbmVnYXRlID0gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5sb29rKCkgPT0gKCchJywpOgorICAgICAgICAgICAgc2VsZi5sZXgoKQorICAgICAgICAgICAgbmVnYXRlID0gVHJ1ZQorCisgICAgICAgIGNvbW1hbmRzID0gW3NlbGYucGFyc2VfY29tbWFuZCgpXQorICAgICAgICB3aGlsZSBzZWxmLmxvb2soKSA9PSAoJ3wnLCk6CisgICAgICAgICAgICBzZWxmLmxleCgpCisgICAgICAgICAgICBjb21tYW5kcy5hcHBlbmQoc2VsZi5wYXJzZV9jb21tYW5kKCkpCisgICAgICAgIHJldHVybiBQaXBlbGluZShjb21tYW5kcywgbmVnYXRlKQorICAgICAgICAgICAgCisgICAgZGVmIHBhcnNlKHNlbGYpOgorICAgICAgICBsaHMgPSBzZWxmLnBhcnNlX3BpcGVsaW5lKCkKKworICAgICAgICB3aGlsZSBzZWxmLmxvb2soKToKKyAgICAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5sZXgoKQorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3BlcmF0b3IsIHR1cGxlKSBhbmQgbGVuKG9wZXJhdG9yKSA9PSAxCisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmxvb2soKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibWlzc2luZyBhcmd1bWVudCB0byBvcGVyYXRvciAlciIgJSBvcGVyYXRvclswXQorICAgICAgICAgICAgCisgICAgICAgICAgICAjIEZJWE1FOiBPcGVyYXRvciBwcmVjZWRlbmNlISEKKyAgICAgICAgICAgIGxocyA9IFNlcShsaHMsIG9wZXJhdG9yWzBdLCBzZWxmLnBhcnNlX3BpcGVsaW5lKCkpCisKKyAgICAgICAgcmV0dXJuIGxocworCisjIyMKKworaW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RTaExleGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbGV4KHNlbGYsIHN0ciwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIGxpc3QoU2hMZXhlcihzdHIsICphcmdzLCAqKmt3YXJncykubGV4KCkpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgnYXxiPmMmZDxlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgKCd8JywpLCAnYicsICgnPicsKSwgJ2MnLCAoJyYnLCksICdkJywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPCcsKSwgJ2UnXSkKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0aW9uX3Rva2VucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgnYTI+YycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnYTInLCAoJz4nLCksICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoJ2EgMj5jJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgKCc+JywyKSwgJ2MnXSkKKyAgICAgICAgCisgICAgZGVmIHRlc3RfcXVvdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgiIiIgJ2EnICIiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiICJoZWxsb1xcIndvcmxkIiAiIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnaGVsbG8id29ybGQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgiIiIgImhlbGxvXFwnd29ybGQiICIiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJoZWxsb1xcJ3dvcmxkIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiICJoZWxsb1xcXFx3b3JsZCIgIiIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbGxvXFx3b3JsZCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCIiIiBoZSJsbG8gd28icmxkICIiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJoZWxsbyB3b3JsZCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCIiIiBhXFwgYiBhXFxcXGIgIiIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImEgYiIsICJhXFxiIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiICIiICIiICIiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyIiLCAiIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiIGFcXCBiICIiIiwgd2luMzJFc2NhcGVzID0gVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhXFwnLCAnYiddKQorCitjbGFzcyBUZXN0U2hQYXJzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHBhcnNlKHNlbGYsIHN0cik6CisgICAgICAgIHJldHVybiBTaFBhcnNlcihzdHIpLnBhcnNlKCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2VjaG8gaGVsbG8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZShbQ29tbWFuZChbJ2VjaG8nLCAnaGVsbG8nXSwgW10pXSwgRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2VjaG8gIiInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZShbQ29tbWFuZChbJ2VjaG8nLCAnJ10sIFtdKV0sIEZhbHNlKSkKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2VjaG8gaGVsbG8gPiBjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydlY2hvJywgJ2hlbGxvJ10sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoKCgnPicpLCksICdjJyldKV0sIEZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdlY2hvIGhlbGxvID4gYyA+PiBkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydlY2hvJywgJ2hlbGxvJ10sIFsoKCc+JywpLCAnYycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCc+PicsKSwgJ2QnKV0pXSwgRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2EgMj4mMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbKCgnPiYnLDIpLCAnMScpXSldLCBGYWxzZSkpCisKKyAgICBkZWYgdGVzdF9waXBlbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdhIHwgYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQoWydiJ10sIFtdKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSB8IGIgfCBjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydhJ10sIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZChbJ2InXSwgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kKFsnYyddLCBbXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJyEgYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpKQorCisgICAgZGVmIHRlc3RfbGlzdChzZWxmKTogICAgICAgIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2EgOyBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydiJ10sIFtdKV0sIEZhbHNlKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdhICYgYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNlcShQaXBlbGluZShbQ29tbWFuZChbJ2EnXSwgW10pXSwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYiddLCBbXSldLCBGYWxzZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSAmJiBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcmJicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYiddLCBbXSldLCBGYWxzZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSB8fCBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd8fCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYiddLCBbXSldLCBGYWxzZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSAmJiBiIHx8IGMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXEoU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJiYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydiJ10sIFtdKV0sIEZhbHNlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd8fCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYyddLCBbXSldLCBGYWxzZSkpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L1RPRE8gYi9zcmMvTExWTS91dGlscy9saXQvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDAwZDJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L1RPRE8KQEAgLTAsMCArMSwxOSBAQAorIC0gTW92ZSB0ZW1wIGRpcmVjdG9yeSBuYW1lIGludG8gbG9jYWwgdGVzdCBjb25maWcuCisKKyAtIEFkZCAtLXNob3ctdW5zdXBwb3J0ZWQsIGRvbid0IHNob3cgYnkgZGVmYXVsdD8KKworIC0gRmluaXNoIGRvY3VtZW50YXRpb24uCisKKyAtIE9wdGlvbmFsbHkgdXNlIG11bHRpcHJvY2Vzc2luZy4KKworIC0gU3VwcG9ydCBsbHZtYyBhbmQgb2NhbWwgdGVzdHMuCisKKyAtIFN1cHBvcnQgdmFsZ3JpbmQgaW4gYWxsIGNvbmZpZ3MsIGFuZCBMTFZNIHN0eWxlIHZhbGdyaW5kLgorCisgLSBQcm92aWRlIHRlc3Qgc3VpdGUgY29uZmlnIGZvciBydW5uaW5nIHVuaXQgdGVzdHMuCisKKyAtIFN1cHBvcnQgYSB0aW1lb3V0IC8gdWxpbWl0LgorCisgLSBTdXBwb3J0ICJkaXNhYmxpbmciIHRlc3RzPyBUaGUgYWR2YW50YWdlIG9mIG1ha2luZyB0aGlzIGRpc3RpbmN0IGZyb20gWEZBSUwKKyAgIGlzIGl0IG1ha2VzIGl0IG1vcmUgb2J2aW91cyB0aGF0IGl0IGlzIGEgdGVtcG9yYXJ5IG1lYXN1cmUgKGFuZCBsaXQgY2FuIHB1dAorICAgaW4gYSBzZXBhcmF0ZSBjYXRlZ29yeSkuCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvVGNsVXRpbC5weSBiL3NyYy9MTFZNL3V0aWxzL2xpdC9UY2xVdGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhM2YzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvVGNsVXRpbC5weQpAQCAtMCwwICsxLDMyMiBAQAoraW1wb3J0IGl0ZXJ0b29scworCitmcm9tIFNoQ29tbWFuZHMgaW1wb3J0IENvbW1hbmQsIFBpcGVsaW5lCisKK2RlZiB0Y2xfcHJlcHJvY2VzcyhkYXRhKToKKyAgICAjIFRjbCBoYXMgYSBwcmVwcm9jZXNzaW5nIHN0ZXAgdG8gcmVwbGFjZSBlc2NhcGVkIG5ld2xpbmVzLgorICAgIGkgPSBkYXRhLmZpbmQoJ1xcXG4nKQorICAgIGlmIGkgPT0gLTE6CisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICAjIFJlcGxhY2UgJ1xcXG4nIGFuZCBzdWJzZXF1ZW50IHdoaXRlc3BhY2UgYnkgYSBzaW5nbGUgc3BhY2UuCisgICAgbiA9IGxlbihkYXRhKQorICAgIHN0ciA9IGRhdGFbOmldCisgICAgaSArPSAyCisgICAgd2hpbGUgaSA8IG4gYW5kIGRhdGFbaV0gaW4gJyBcdCc6CisgICAgICAgIGkgKz0gMQorICAgIHJldHVybiBzdHIgKyAnICcgKyBkYXRhW2k6XQorCitjbGFzcyBUY2xMZXhlcjoKKyAgICAiIiJUY2xMZXhlciAtIExleCBhIHN0cmluZyBpbnRvICJ3b3JkcyIsIGZvbGxvd2luZyB0aGUgVGNsIHN5bnRheC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhID0gdGNsX3ByZXByb2Nlc3MoZGF0YSkKKyAgICAgICAgc2VsZi5wb3MgPSAwCisgICAgICAgIHNlbGYuZW5kID0gbGVuKHNlbGYuZGF0YSkKKworICAgIGRlZiBhdF9lbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBvcyA9PSBzZWxmLmVuZAorCisgICAgZGVmIGVhdChzZWxmKToKKyAgICAgICAgYyA9IHNlbGYuZGF0YVtzZWxmLnBvc10KKyAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICByZXR1cm4gYworCisgICAgZGVmIGxvb2soc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGFbc2VsZi5wb3NdCisKKyAgICBkZWYgbWF5YmVfZWF0KHNlbGYsIGMpOgorICAgICAgICAiIiIKKyAgICAgICAgbWF5YmVfZWF0KGMpIC0gQ29uc3VtZSB0aGUgY2hhcmFjdGVyIGMgaWYgaXQgaXMgdGhlIG5leHQgY2hhcmFjdGVyLAorICAgICAgICByZXR1cm5pbmcgVHJ1ZSBpZiBhIGNoYXJhY3RlciB3YXMgY29uc3VtZWQuICIiIgorICAgICAgICBpZiBzZWxmLmRhdGFbc2VsZi5wb3NdID09IGM6CisgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBlc2NhcGUoc2VsZiwgYyk6CisgICAgICAgIGlmIGMgPT0gJ2EnOgorICAgICAgICAgICAgcmV0dXJuICdceDA3JworICAgICAgICBlbGlmIGMgPT0gJ2InOgorICAgICAgICAgICAgcmV0dXJuICdceDA4JworICAgICAgICBlbGlmIGMgPT0gJ2YnOgorICAgICAgICAgICAgcmV0dXJuICdceDBjJworICAgICAgICBlbGlmIGMgPT0gJ24nOgorICAgICAgICAgICAgcmV0dXJuICdcbicKKyAgICAgICAgZWxpZiBjID09ICdyJzoKKyAgICAgICAgICAgIHJldHVybiAnXHInCisgICAgICAgIGVsaWYgYyA9PSAndCc6CisgICAgICAgICAgICByZXR1cm4gJ1x0JworICAgICAgICBlbGlmIGMgPT0gJ3YnOgorICAgICAgICAgICAgcmV0dXJuICdceDBiJworICAgICAgICBlbGlmIGMgaW4gJ3V4byc6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCdJbnZhbGlkIHF1b3RlZCBjaGFyYWN0ZXIgJXInICUgYworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGMKKyAgICAgICAgCisgICAgZGVmIGxleF9icmFjZWQoc2VsZik6CisgICAgICAgICMgTGV4IHVudGlsIHdoaXRlc3BhY2Ugb3IgZW5kIG9mIHN0cmluZywgdGhlIG9wZW5pbmcgYnJhY2UgaGFzIGFscmVhZHkKKyAgICAgICAgIyBiZWVuIGNvbnN1bWVkLgorCisgICAgICAgIHN0ciA9ICcnICAgICAgICAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGlmIHNlbGYuYXRfZW5kKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwiVW50ZXJtaW5hdGVkICd7JyBxdW90ZWQgd29yZCIKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYyA9IHNlbGYuZWF0KCkKKyAgICAgICAgICAgIGlmIGMgPT0gJ30nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGMgPT0gJ3snOgorICAgICAgICAgICAgICAgIHN0ciArPSAneycgKyBzZWxmLmxleF9icmFjZWQoKSArICd9JworICAgICAgICAgICAgZWxpZiBjID09ICdcXCcgYW5kIHNlbGYubG9vaygpIGluICd7fSc6CisgICAgICAgICAgICAgICAgc3RyICs9IHNlbGYuZWF0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyICs9IGMKKworICAgICAgICByZXR1cm4gc3RyCisKKyAgICBkZWYgbGV4X3F1b3RlZChzZWxmKToKKyAgICAgICAgc3RyID0gJycKKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgaWYgc2VsZi5hdF9lbmQoKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCJVbnRlcm1pbmF0ZWQgJ1wiJyBxdW90ZWQgd29yZCIKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYyA9IHNlbGYuZWF0KCkKKyAgICAgICAgICAgIGlmIGMgPT0gJyInOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGMgPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmF0X2VuZCgpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCdNaXNzaW5nIHF1b3RlZCBjaGFyYWN0ZXInCisKKyAgICAgICAgICAgICAgICBzdHIgKz0gc2VsZi5lc2NhcGUoc2VsZi5lYXQoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyICs9IGMKKworICAgICAgICByZXR1cm4gc3RyCisKKyAgICBkZWYgbGV4X3VucXVvdGVkKHNlbGYsIHByb2Nlc3NfYWxsPUZhbHNlKToKKyAgICAgICAgIyBMZXggdW50aWwgd2hpdGVzcGFjZSBvciBlbmQgb2Ygc3RyaW5nLgorICAgICAgICBzdHIgPSAnJworICAgICAgICB3aGlsZSBub3Qgc2VsZi5hdF9lbmQoKToKKyAgICAgICAgICAgIGlmIG5vdCBwcm9jZXNzX2FsbDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmxvb2soKS5pc3NwYWNlKCkgb3Igc2VsZi5sb29rKCkgPT0gJzsnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBjID0gc2VsZi5lYXQoKQorICAgICAgICAgICAgaWYgYyA9PSAnXFwnOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuYXRfZW5kKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsJ01pc3NpbmcgcXVvdGVkIGNoYXJhY3RlcicKKworICAgICAgICAgICAgICAgIHN0ciArPSBzZWxmLmVzY2FwZShzZWxmLmVhdCgpKQorICAgICAgICAgICAgZWxpZiBjID09ICdbJzoKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAoJ0NvbW1hbmQgc3Vic3RpdHV0aW9uIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdCBzdXBwb3J0ZWQnKQorICAgICAgICAgICAgZWxpZiBjID09ICckJyBhbmQgbm90IHNlbGYuYXRfZW5kKCkgYW5kIChzZWxmLmxvb2soKS5pc2FscGhhKCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb29rKCkgPT0gJ3snKToKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAoJ1ZhcmlhYmxlIHN1YnN0aXR1dGlvbiBpcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3Qgc3VwcG9ydGVkJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyICs9IGMKKworICAgICAgICByZXR1cm4gc3RyCisKKyAgICBkZWYgbGV4X29uZV90b2tlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJyInKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxleF9xdW90ZWQoKQorICAgICAgICBlbGlmIHNlbGYubWF5YmVfZWF0KCd7Jyk6CisgICAgICAgICAgICAjIENoZWNrIGZvciBhcmd1bWVudCBzdWJzdGl0dXRpb24uCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5tYXliZV9lYXQoJyonKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5sZXhfYnJhY2VkKCkKKworICAgICAgICAgICAgaWYgbm90IHNlbGYubWF5YmVfZWF0KCd9Jyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnKicgKyBzZWxmLmxleF9icmFjZWQoKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgc2VsZi5hdF9lbmQoKSBvciBzZWxmLmxvb2soKS5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuICcqJworCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAiQXJndW1lbnQgc3Vic3RpdHV0aW9uIGlzIHVuc3VwcG9ydGVkIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubGV4X3VucXVvdGVkKCkKKworICAgIGRlZiBsZXgoc2VsZik6CisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmF0X2VuZCgpOgorICAgICAgICAgICAgYyA9IHNlbGYubG9vaygpCisgICAgICAgICAgICBpZiBjIGluICcgXHQnOgorICAgICAgICAgICAgICAgIHNlbGYuZWF0KCkKKyAgICAgICAgICAgIGVsaWYgYyBpbiAnO1xuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmVhdCgpCisgICAgICAgICAgICAgICAgeWllbGQgKCc7JywpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYubGV4X29uZV90b2tlbigpCisKK2NsYXNzIFRjbEV4ZWNDb21tYW5kOgorICAgIGtSZWRpcmVjdFByZWZpeGVzMSA9ICgnPCcsICc+JykKKyAgICBrUmVkaXJlY3RQcmVmaXhlczIgPSAoJzxAJywgJzw8JywgJzI+JywgJz4mJywgJz4+JywgJz5AJykKKyAgICBrUmVkaXJlY3RQcmVmaXhlczMgPSAoJzI+QCcsICcyPj4nLCAnPj4mJywgJz4mQCcpCisgICAga1JlZGlyZWN0UHJlZml4ZXM0ID0gKCcyPkAxJywpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJncyk6CisgICAgICAgIHNlbGYuYXJncyA9IGl0ZXIoYXJncykKKworICAgIGRlZiBsZXgoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFyZ3MubmV4dCgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBsb29rKHNlbGYpOgorICAgICAgICBuZXh0ID0gc2VsZi5sZXgoKQorICAgICAgICBpZiBuZXh0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hcmdzID0gaXRlcnRvb2xzLmNoYWluKFtuZXh0XSwgc2VsZi5hcmdzKQorICAgICAgICByZXR1cm4gbmV4dAorCisgICAgZGVmIHBhcnNlX3JlZGlyZWN0KHNlbGYsIHRvaywgbGVuZ3RoKToKKyAgICAgICAgaWYgbGVuKHRvaykgPT0gbGVuZ3RoOgorICAgICAgICAgICAgYXJnID0gc2VsZi5sZXgoKQorICAgICAgICAgICAgaWYgYXJnIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwnTWlzc2luZyBhcmd1bWVudCB0byAlciByZWRpcmVjdGlvbicgJSB0b2sKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRvayxhcmcgPSB0b2tbOmxlbmd0aF0sdG9rW2xlbmd0aDpdCisKKyAgICAgICAgaWYgdG9rWzBdID09ICcyJzoKKyAgICAgICAgICAgIG9wID0gKHRva1sxOl0sMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wID0gKHRvaywpCisgICAgICAgIHJldHVybiAob3AsIGFyZykKKworICAgIGRlZiBwYXJzZV9waXBlbGluZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5sb29rKCkgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudCB0byBleGVjIgorCisgICAgICAgIGNvbW1hbmRzID0gW0NvbW1hbmQoW10sW10pXQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgYXJnID0gc2VsZi5sZXgoKQorICAgICAgICAgICAgaWYgYXJnIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgYXJnID09ICd8JzoKKyAgICAgICAgICAgICAgICBjb21tYW5kcy5hcHBlbmQoQ29tbWFuZChbXSxbXSkpCisgICAgICAgICAgICBlbGlmIGFyZyA9PSAnfCYnOgorICAgICAgICAgICAgICAgICMgV3JpdGUgdGhpcyBhcyBhIHJlZGlyZWN0IG9mIHN0ZGVycjsgaXQgbXVzdCBjb21lIGZpcnN0IGJlY2F1c2UKKyAgICAgICAgICAgICAgICAjIHN0ZG91dCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVkaXJlY3RlZC4KKyAgICAgICAgICAgICAgICBjb21tYW5kc1stMV0ucmVkaXJlY3RzLmluc2VydCgwLCAoKCc+JicsMiksJzEnKSkKKyAgICAgICAgICAgICAgICBjb21tYW5kcy5hcHBlbmQoQ29tbWFuZChbXSxbXSkpCisgICAgICAgICAgICBlbGlmIGFyZ1s6NF0gaW4gVGNsRXhlY0NvbW1hbmQua1JlZGlyZWN0UHJlZml4ZXM0OgorICAgICAgICAgICAgICAgIGNvbW1hbmRzWy0xXS5yZWRpcmVjdHMuYXBwZW5kKHNlbGYucGFyc2VfcmVkaXJlY3QoYXJnLCA0KSkKKyAgICAgICAgICAgIGVsaWYgYXJnWzozXSBpbiBUY2xFeGVjQ29tbWFuZC5rUmVkaXJlY3RQcmVmaXhlczM6CisgICAgICAgICAgICAgICAgY29tbWFuZHNbLTFdLnJlZGlyZWN0cy5hcHBlbmQoc2VsZi5wYXJzZV9yZWRpcmVjdChhcmcsIDMpKQorICAgICAgICAgICAgZWxpZiBhcmdbOjJdIGluIFRjbEV4ZWNDb21tYW5kLmtSZWRpcmVjdFByZWZpeGVzMjoKKyAgICAgICAgICAgICAgICBjb21tYW5kc1stMV0ucmVkaXJlY3RzLmFwcGVuZChzZWxmLnBhcnNlX3JlZGlyZWN0KGFyZywgMikpCisgICAgICAgICAgICBlbGlmIGFyZ1s6MV0gaW4gVGNsRXhlY0NvbW1hbmQua1JlZGlyZWN0UHJlZml4ZXMxOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzWy0xXS5yZWRpcmVjdHMuYXBwZW5kKHNlbGYucGFyc2VfcmVkaXJlY3QoYXJnLCAxKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tbWFuZHNbLTFdLmFyZ3MuYXBwZW5kKGFyZykKKworICAgICAgICByZXR1cm4gUGlwZWxpbmUoY29tbWFuZHMsIEZhbHNlLCBwaXBlX2Vycj1UcnVlKQorCisgICAgZGVmIHBhcnNlKHNlbGYpOgorICAgICAgICBpZ25vcmVTdGRlcnIgPSBGYWxzZQorICAgICAgICBrZWVwTmV3bGluZSA9IEZhbHNlCisKKyAgICAgICAgIyBQYXJzZSBhcmd1bWVudHMuCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBuZXh0ID0gc2VsZi5sb29rKCkKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5leHQsIHN0cikgb3IgbmV4dFswXSAhPSAnLSc6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgaWYgbmV4dCA9PSAnLS0nOgorICAgICAgICAgICAgICAgIHNlbGYubGV4KCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBuZXh0ID09ICctaWdub3Jlc3RkZXJyJzoKKyAgICAgICAgICAgICAgICBpZ25vcmVTdGRlcnIgPSBUcnVlCisgICAgICAgICAgICBlbGlmIG5leHQgPT0gJy1rZWVwbmV3bGluZSc6CisgICAgICAgICAgICAgICAga2VlcE5ld2xpbmUgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIkludmFsaWQgZXhlYyBhcmd1bWVudCAlciIgJSBuZXh0CisKKyAgICAgICAgcmV0dXJuIChpZ25vcmVTdGRlcnIsIGtlZXBOZXdsaW5lLCBzZWxmLnBhcnNlX3BpcGVsaW5lKCkpCisKKyMjIworCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgVGVzdFRjbExleGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbGV4KHNlbGYsIHN0ciwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIGxpc3QoVGNsTGV4ZXIoc3RyLCAqYXJncywgKiprd2FyZ3MpLmxleCgpKQorCisgICAgZGVmIHRlc3RfcHJlcHJvY2VzcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2xfcHJlcHJvY2VzcygnYSBiJyksICdhIGInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbF9wcmVwcm9jZXNzKCdhXFxcbmIgYycpLCAnYSBiIGMnKQorCisgICAgZGVmIHRlc3RfdW5xdW90ZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoJ2EgYiBjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgJ2InLCAnYyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KHInYVxuYlx0Y1wgJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhXG5iXHRjICddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KHInYSBcXFwkYiBjICRcXCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnYScsIHInXCRiJywgJ2MnLCAnJFxcJ10pCisKKyAgICBkZWYgdGVzdF9icmFjZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoJ2Ege2IgY30ge30nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAnYiBjJywgJyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KHInYSB7YiB7Y1xufX0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAnYiB7Y1xcbn0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleChyJ2Ege2Jce30nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAnYnsnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleChyJ3sqfScpLCBbJyonXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleChyJ3sqfSBhJyksIFsnKicsICdhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgocid7Kn0gYScpLCBbJyonLCAnYSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCd7YVxcXG4gICBifScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnYSBiJ10pCisKKyAgICBkZWYgdGVzdF9xdW90ZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoJ2EgImIgYyInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAnYiBjJ10pCisKKyAgICBkZWYgdGVzdF90ZXJtaW5hdG9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgnYVxuYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnYScsICgnOycsKSwgJ2InXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgnYTtiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgKCc7JywpLCAnYiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCdhICAgOyAgIGInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAoJzsnLCksICdiJ10pCisKK2NsYXNzIFRlc3RUY2xFeGVjQ29tbWFuZCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHBhcnNlKHNlbGYsIHN0cik6CisgICAgICAgIHJldHVybiBUY2xFeGVjQ29tbWFuZChsaXN0KFRjbExleGVyKHN0cikubGV4KCkpKS5wYXJzZSgpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdlY2hvIGhlbGxvJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZhbHNlLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydlY2hvJywgJ2hlbGxvJ10sIFtdKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlLCBUcnVlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnZWNobyBoZWxsbyB8IGdyZXAgaGVsbG8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRmFsc2UsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZShbQ29tbWFuZChbJ2VjaG8nLCAnaGVsbG8nXSwgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZChbJ2dyZXAnLCAnaGVsbG8nXSwgW10pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UsIFRydWUpKSkKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2VjaG8gaGVsbG8gPiBhID5iID4+YyAyPiBkIHwmIGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRmFsc2UsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZShbQ29tbWFuZChbJ2VjaG8nLCAnaGVsbG8nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygoJz4mJywyKSwnMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgnPicsKSwnYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgnPicsKSwnYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgnPj4nLCksJ2MnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoJz4nLDIpLCdkJyldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQoWydlJ10sIFtdKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlLCBUcnVlKSkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvVGVzdC5weSBiL3NyYy9MTFZNL3V0aWxzL2xpdC9UZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNjU1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvVGVzdC5weQpAQCAtMCwwICsxLDc5IEBACitpbXBvcnQgb3MKKworIyBUZXN0IHJlc3VsdHMuCisKK2NsYXNzIFRlc3RSZXN1bHQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGlzRmFpbHVyZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5pc0ZhaWx1cmUgPSBpc0ZhaWx1cmUKKworUEFTUyAgICAgICAgPSBUZXN0UmVzdWx0KCdQQVNTJywgRmFsc2UpCitYRkFJTCAgICAgICA9IFRlc3RSZXN1bHQoJ1hGQUlMJywgRmFsc2UpCitGQUlMICAgICAgICA9IFRlc3RSZXN1bHQoJ0ZBSUwnLCBUcnVlKQorWFBBU1MgICAgICAgPSBUZXN0UmVzdWx0KCdYUEFTUycsIFRydWUpCitVTlJFU09MVkVEICA9IFRlc3RSZXN1bHQoJ1VOUkVTT0xWRUQnLCBUcnVlKQorVU5TVVBQT1JURUQgPSBUZXN0UmVzdWx0KCdVTlNVUFBPUlRFRCcsIEZhbHNlKQorCisjIFRlc3QgY2xhc3Nlcy4KKworY2xhc3MgVGVzdEZvcm1hdDoKKyAgICAiIiJUZXN0Rm9ybWF0IC0gVGVzdCBpbmZvcm1hdGlvbiBwcm92aWRlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorCitjbGFzcyBUZXN0U3VpdGU6CisgICAgIiIiVGVzdFN1aXRlIC0gSW5mb3JtYXRpb24gb24gYSBncm91cCBvZiB0ZXN0cy4KKworICAgIEEgdGVzdCBzdWl0ZSBncm91cHMgdG9nZXRoZXIgYSBzZXQgb2YgbG9naWNhbGx5IHJlbGF0ZWQgdGVzdHMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgc291cmNlX3Jvb3QsIGV4ZWNfcm9vdCwgY29uZmlnKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnNvdXJjZV9yb290ID0gc291cmNlX3Jvb3QKKyAgICAgICAgc2VsZi5leGVjX3Jvb3QgPSBleGVjX3Jvb3QKKyAgICAgICAgIyBUaGUgdGVzdCBzdWl0ZSBjb25maWd1cmF0aW9uLgorICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZworCisgICAgZGVmIGdldFNvdXJjZVBhdGgoc2VsZiwgY29tcG9uZW50cyk6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5zb3VyY2Vfcm9vdCwgKmNvbXBvbmVudHMpCisKKyAgICBkZWYgZ2V0RXhlY1BhdGgoc2VsZiwgY29tcG9uZW50cyk6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5leGVjX3Jvb3QsICpjb21wb25lbnRzKQorCitjbGFzcyBUZXN0OgorICAgICIiIlRlc3QgLSBJbmZvcm1hdGlvbiBvbiBhIHNpbmdsZSB0ZXN0IGluc3RhbmNlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN1aXRlLCBwYXRoX2luX3N1aXRlLCBjb25maWcpOgorICAgICAgICBzZWxmLnN1aXRlID0gc3VpdGUKKyAgICAgICAgc2VsZi5wYXRoX2luX3N1aXRlID0gcGF0aF9pbl9zdWl0ZQorICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZworICAgICAgICAjIFRoZSB0ZXN0IHJlc3VsdCBjb2RlLCBvbmNlIGNvbXBsZXRlLgorICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKKyAgICAgICAgIyBBbnkgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSB0aGUgdGVzdCwgb25jZSBjb21wbGV0ZS4KKyAgICAgICAgc2VsZi5vdXRwdXQgPSBOb25lCisgICAgICAgICMgVGhlIHdhbGwgdGltZSB0byBleGVjdXRlIHRoaXMgdGVzdCwgaWYgdGltaW5nIGFuZCBvbmNlIGNvbXBsZXRlLgorICAgICAgICBzZWxmLmVsYXBzZWQgPSBOb25lCisgICAgICAgICMgVGhlIHJlcGVhdCBpbmRleCBvZiB0aGlzIHRlc3QsIG9yIE5vbmUuCisgICAgICAgIHNlbGYuaW5kZXggPSBOb25lCisKKyAgICBkZWYgY29weVdpdGhJbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgIGltcG9ydCBjb3B5CisgICAgICAgIHJlcyA9IGNvcHkuY29weShzZWxmKQorICAgICAgICByZXMuaW5kZXggPSBpbmRleAorICAgICAgICByZXR1cm4gcmVzCisKKyAgICBkZWYgc2V0UmVzdWx0KHNlbGYsIHJlc3VsdCwgb3V0cHV0LCBlbGFwc2VkKToKKyAgICAgICAgYXNzZXJ0IHNlbGYucmVzdWx0IGlzIE5vbmUsICJUZXN0IHJlc3VsdCBhbHJlYWR5IHNldCEiCisgICAgICAgIHNlbGYucmVzdWx0ID0gcmVzdWx0CisgICAgICAgIHNlbGYub3V0cHV0ID0gb3V0cHV0CisgICAgICAgIHNlbGYuZWxhcHNlZCA9IGVsYXBzZWQKKworICAgIGRlZiBnZXRGdWxsTmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3VpdGUuY29uZmlnLm5hbWUgKyAnOjonICsgJy8nLmpvaW4oc2VsZi5wYXRoX2luX3N1aXRlKQorCisgICAgZGVmIGdldFNvdXJjZVBhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN1aXRlLmdldFNvdXJjZVBhdGgoc2VsZi5wYXRoX2luX3N1aXRlKQorCisgICAgZGVmIGdldEV4ZWNQYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZS5nZXRFeGVjUGF0aChzZWxmLnBhdGhfaW5fc3VpdGUpCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvVGVzdEZvcm1hdHMucHkgYi9zcmMvTExWTS91dGlscy9saXQvVGVzdEZvcm1hdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmZDU0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9UZXN0Rm9ybWF0cy5weQpAQCAtMCwwICsxLDE4OSBAQAoraW1wb3J0IG9zCisKK2ltcG9ydCBUZXN0CitpbXBvcnQgVGVzdFJ1bm5lcgoraW1wb3J0IFV0aWwKKworY2xhc3MgR29vZ2xlVGVzdChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X3N1Yl9kaXIsIHRlc3Rfc3VmZml4KToKKyAgICAgICAgc2VsZi50ZXN0X3N1Yl9kaXIgPSBzdHIodGVzdF9zdWJfZGlyKQorICAgICAgICBzZWxmLnRlc3Rfc3VmZml4ID0gc3RyKHRlc3Rfc3VmZml4KQorCisgICAgZGVmIGdldEdUZXN0VGVzdHMoc2VsZiwgcGF0aCwgbGl0Q29uZmlnKToKKyAgICAgICAgIiIiZ2V0R1Rlc3RUZXN0cyhwYXRoKSAtIFtuYW1lXQorICAgICAgICAKKyAgICAgICAgUmV0dXJuIHRoZSB0ZXN0cyBhdmFpbGFibGUgaW4gZ3Rlc3QgZXhlY3V0YWJsZS4iIiIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsaW5lcyA9IFV0aWwuY2FwdHVyZShbcGF0aCwgJy0tZ3Rlc3RfbGlzdF90ZXN0cyddKS5zcGxpdCgnXG4nKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBsaXRDb25maWcuZXJyb3IoInVuYWJsZSB0byBkaXNjb3ZlciBnb29nbGUtdGVzdHMgaW4gJXIiICUgcGF0aCkKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgICAgICBuZXN0ZWRfdGVzdHMgPSBbXQorICAgICAgICBmb3IgbG4gaW4gbGluZXM6CisgICAgICAgICAgICBpZiBub3QgbG4uc3RyaXAoKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBwcmVmaXggPSAnJworICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgICAgICB3aGlsZSBsbltpbmRleCoyOmluZGV4KjIrMl0gPT0gJyAgJzoKKyAgICAgICAgICAgICAgICBpbmRleCArPSAxCisgICAgICAgICAgICB3aGlsZSBsZW4obmVzdGVkX3Rlc3RzKSA+IGluZGV4OgorICAgICAgICAgICAgICAgIG5lc3RlZF90ZXN0cy5wb3AoKQorICAgICAgICAgICAgCisgICAgICAgICAgICBsbiA9IGxuW2luZGV4KjI6XQorICAgICAgICAgICAgaWYgbG4uZW5kc3dpdGgoJy4nKToKKyAgICAgICAgICAgICAgICBuZXN0ZWRfdGVzdHMuYXBwZW5kKGxuKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCAnJy5qb2luKG5lc3RlZF90ZXN0cykgKyBsbgorCisgICAgZGVmIGdldFRlc3RzSW5EaXJlY3Rvcnkoc2VsZiwgdGVzdFN1aXRlLCBwYXRoX2luX3N1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdENvbmZpZywgbG9jYWxDb25maWcpOgorICAgICAgICBzb3VyY2VfcGF0aCA9IHRlc3RTdWl0ZS5nZXRTb3VyY2VQYXRoKHBhdGhfaW5fc3VpdGUpCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKHNvdXJjZV9wYXRoKToKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIHRoZSBvbmUgc3ViZGlyZWN0b3J5IChidWlsZCBkaXJlY3RvcnkpIHRlc3RzIHdpbGwgYmUgaW4uCisgICAgICAgICAgICBpZiBmaWxlbmFtZSAhPSBzZWxmLnRlc3Rfc3ViX2RpcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfcGF0aCwgZmlsZW5hbWUpCisgICAgICAgICAgICBmb3Igc3ViZmlsZW5hbWUgaW4gb3MubGlzdGRpcihmaWxlcGF0aCk6CisgICAgICAgICAgICAgICAgaWYgc3ViZmlsZW5hbWUuZW5kc3dpdGgoc2VsZi50ZXN0X3N1ZmZpeCk6CisgICAgICAgICAgICAgICAgICAgIGV4ZWNwYXRoID0gb3MucGF0aC5qb2luKGZpbGVwYXRoLCBzdWJmaWxlbmFtZSkKKworICAgICAgICAgICAgICAgICAgICAjIERpc2NvdmVyIHRoZSB0ZXN0cyBpbiB0aGlzIGV4ZWN1dGFibGUuCisgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuZ2V0R1Rlc3RUZXN0cyhleGVjcGF0aCwgbGl0Q29uZmlnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RQYXRoID0gcGF0aF9pbl9zdWl0ZSArIChmaWxlbmFtZSwgc3ViZmlsZW5hbWUsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBUZXN0LlRlc3QodGVzdFN1aXRlLCB0ZXN0UGF0aCwgbG9jYWxDb25maWcpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCB0ZXN0LCBsaXRDb25maWcpOgorICAgICAgICB0ZXN0UGF0aCx0ZXN0TmFtZSA9IG9zLnBhdGguc3BsaXQodGVzdC5nZXRTb3VyY2VQYXRoKCkpCisgICAgICAgIHdoaWxlIG5vdCBvcy5wYXRoLmV4aXN0cyh0ZXN0UGF0aCk6CisgICAgICAgICAgICAjIEhhbmRsZSBHVGVzdCBwYXJhbWV0cml6ZWQgYW5kIHR5cGVkIHRlc3RzLCB3aG9zZSBuYW1lIGluY2x1ZGVzCisgICAgICAgICAgICAjIHNvbWUgJy8ncy4KKyAgICAgICAgICAgIHRlc3RQYXRoLCBuYW1lUHJlZml4ID0gb3MucGF0aC5zcGxpdCh0ZXN0UGF0aCkKKyAgICAgICAgICAgIHRlc3ROYW1lID0gb3MucGF0aC5qb2luKG5hbWVQcmVmaXgsIHRlc3ROYW1lKQorCisgICAgICAgIGNtZCA9IFt0ZXN0UGF0aCwgJy0tZ3Rlc3RfZmlsdGVyPScgKyB0ZXN0TmFtZV0KKyAgICAgICAgb3V0LCBlcnIsIGV4aXRDb2RlID0gVGVzdFJ1bm5lci5leGVjdXRlQ29tbWFuZChjbWQpCisgICAgICAgICAgICAKKyAgICAgICAgaWYgbm90IGV4aXRDb2RlOgorICAgICAgICAgICAgcmV0dXJuIFRlc3QuUEFTUywnJworCisgICAgICAgIHJldHVybiBUZXN0LkZBSUwsIG91dCArIGVycgorCisjIyMKKworY2xhc3MgRmlsZUJhc2VkVGVzdChvYmplY3QpOgorICAgIGRlZiBnZXRUZXN0c0luRGlyZWN0b3J5KHNlbGYsIHRlc3RTdWl0ZSwgcGF0aF9pbl9zdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRDb25maWcsIGxvY2FsQ29uZmlnKToKKyAgICAgICAgc291cmNlX3BhdGggPSB0ZXN0U3VpdGUuZ2V0U291cmNlUGF0aChwYXRoX2luX3N1aXRlKQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihzb3VyY2VfcGF0aCk6CisgICAgICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfcGF0aCwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihmaWxlcGF0aCk6CisgICAgICAgICAgICAgICAgYmFzZSxleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGlmIGV4dCBpbiBsb2NhbENvbmZpZy5zdWZmaXhlczoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgVGVzdC5UZXN0KHRlc3RTdWl0ZSwgcGF0aF9pbl9zdWl0ZSArIChmaWxlbmFtZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxDb25maWcpCisKK2NsYXNzIFNoVGVzdChGaWxlQmFzZWRUZXN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhlY3V0ZV9leHRlcm5hbCA9IEZhbHNlKToKKyAgICAgICAgc2VsZi5leGVjdXRlX2V4dGVybmFsID0gZXhlY3V0ZV9leHRlcm5hbAorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgdGVzdCwgbGl0Q29uZmlnKToKKyAgICAgICAgcmV0dXJuIFRlc3RSdW5uZXIuZXhlY3V0ZVNoVGVzdCh0ZXN0LCBsaXRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlX2V4dGVybmFsKQorCitjbGFzcyBUY2xUZXN0KEZpbGVCYXNlZFRlc3QpOgorICAgIGRlZiBleGVjdXRlKHNlbGYsIHRlc3QsIGxpdENvbmZpZyk6CisgICAgICAgIHJldHVybiBUZXN0UnVubmVyLmV4ZWN1dGVUY2xUZXN0KHRlc3QsIGxpdENvbmZpZykKKworIyMjCisKK2ltcG9ydCByZQoraW1wb3J0IHRlbXBmaWxlCisKK2NsYXNzIE9uZUNvbW1hbmRQZXJGaWxlVGVzdDoKKyAgICAjIEZJWE1FOiBSZWZhY3RvciBpbnRvIGdlbmVyaWMgdGVzdCBmb3IgcnVubmluZyBzb21lIGNvbW1hbmQgb24gYSBkaXJlY3RvcnkKKyAgICAjIG9mIGlucHV0cy4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBkaXIsIHJlY3Vyc2l2ZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgcGF0dGVybj0iLioiLCB1c2VUZW1wSW5wdXQ9RmFsc2UpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGNvbW1hbmQsIHN0cik6CisgICAgICAgICAgICBzZWxmLmNvbW1hbmQgPSBbY29tbWFuZF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29tbWFuZCA9IGxpc3QoY29tbWFuZCkKKyAgICAgICAgc2VsZi5kaXIgPSBzdHIoZGlyKQorICAgICAgICBzZWxmLnJlY3Vyc2l2ZSA9IGJvb2wocmVjdXJzaXZlKQorICAgICAgICBzZWxmLnBhdHRlcm4gPSByZS5jb21waWxlKHBhdHRlcm4pCisgICAgICAgIHNlbGYudXNlVGVtcElucHV0ID0gdXNlVGVtcElucHV0CisKKyAgICBkZWYgZ2V0VGVzdHNJbkRpcmVjdG9yeShzZWxmLCB0ZXN0U3VpdGUsIHBhdGhfaW5fc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0Q29uZmlnLCBsb2NhbENvbmZpZyk6CisgICAgICAgIGZvciBkaXJuYW1lLHN1YmRpcnMsZmlsZW5hbWVzIGluIG9zLndhbGsoc2VsZi5kaXIpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlOgorICAgICAgICAgICAgICAgIHN1YmRpcnNbOl0gPSBbXQorCisgICAgICAgICAgICBzdWJkaXJzWzpdID0gW2QgZm9yIGQgaW4gc3ViZGlycworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCAhPSAnLnN2bicgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkIG5vdCBpbiBsb2NhbENvbmZpZy5leGNsdWRlcyldCisKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgaWYgKG5vdCBzZWxmLnBhdHRlcm4ubWF0Y2goZmlsZW5hbWUpIG9yCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lIGluIGxvY2FsQ29uZmlnLmV4Y2x1ZGVzKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlybmFtZSxmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBzdWZmaXggPSBwYXRoW2xlbihzZWxmLmRpcik6XQorICAgICAgICAgICAgICAgIGlmIHN1ZmZpeC5zdGFydHN3aXRoKG9zLnNlcCk6CisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHN1ZmZpeFsxOl0KKyAgICAgICAgICAgICAgICB0ZXN0ID0gVGVzdC5UZXN0KHRlc3RTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaW5fc3VpdGUgKyB0dXBsZShzdWZmaXguc3BsaXQob3Muc2VwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbENvbmZpZykKKyAgICAgICAgICAgICAgICAjIEZJWE1FOiBIYWNrPworICAgICAgICAgICAgICAgIHRlc3Quc291cmNlX3BhdGggPSBwYXRoCisgICAgICAgICAgICAgICAgeWllbGQgdGVzdAorCisgICAgZGVmIGNyZWF0ZVRlbXBJbnB1dChzZWxmLCB0bXAsIHRlc3QpOgorICAgICAgICBhYnN0cmFjdAorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgdGVzdCwgbGl0Q29uZmlnKToKKyAgICAgICAgaWYgdGVzdC5jb25maWcudW5zdXBwb3J0ZWQ6CisgICAgICAgICAgICByZXR1cm4gKFRlc3QuVU5TVVBQT1JURUQsICdUZXN0IGlzIHVuc3VwcG9ydGVkJykKKworICAgICAgICBjbWQgPSBsaXN0KHNlbGYuY29tbWFuZCkKKworICAgICAgICAjIElmIHVzaW5nIHRlbXAgaW5wdXQsIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGFuZCBoYW5kIGl0IHRvIHRoZQorICAgICAgICAjIHN1YmNsYXNzLgorICAgICAgICBpZiBzZWxmLnVzZVRlbXBJbnB1dDoKKyAgICAgICAgICAgIHRtcCA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShzdWZmaXg9Jy5jcHAnKQorICAgICAgICAgICAgc2VsZi5jcmVhdGVUZW1wSW5wdXQodG1wLCB0ZXN0KQorICAgICAgICAgICAgdG1wLmZsdXNoKCkKKyAgICAgICAgICAgIGNtZC5hcHBlbmQodG1wLm5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWQuYXBwZW5kKHRlc3Quc291cmNlX3BhdGgpCisKKyAgICAgICAgb3V0LCBlcnIsIGV4aXRDb2RlID0gVGVzdFJ1bm5lci5leGVjdXRlQ29tbWFuZChjbWQpCisKKyAgICAgICAgZGlhZ3MgPSBvdXQgKyBlcnIKKyAgICAgICAgaWYgbm90IGV4aXRDb2RlIGFuZCBub3QgZGlhZ3Muc3RyaXAoKToKKyAgICAgICAgICAgIHJldHVybiBUZXN0LlBBU1MsJycKKworICAgICAgICAjIFRyeSB0byBpbmNsdWRlIHNvbWUgdXNlZnVsIGluZm9ybWF0aW9uLgorICAgICAgICByZXBvcnQgPSAiIiJDb21tYW5kOiAlc1xuIiIiICUgJyAnLmpvaW4oWyInJXMnIiAlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBpbiBjbWRdKQorICAgICAgICBpZiBzZWxmLnVzZVRlbXBJbnB1dDoKKyAgICAgICAgICAgIHJlcG9ydCArPSAiIiJUZW1wb3JhcnkgRmlsZTogJXNcbiIiIiAlIHRtcC5uYW1lCisgICAgICAgICAgICByZXBvcnQgKz0gIi0tXG4lcy0tXG4iIiIgJSBvcGVuKHRtcC5uYW1lKS5yZWFkKCkKKyAgICAgICAgcmVwb3J0ICs9ICIiIk91dHB1dDpcbi0tXG4lcy0tIiIiICUgZGlhZ3MKKworICAgICAgICByZXR1cm4gVGVzdC5GQUlMLCByZXBvcnQKKworY2xhc3MgU3ludGF4Q2hlY2tUZXN0KE9uZUNvbW1hbmRQZXJGaWxlVGVzdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbXBpbGVyLCBkaXIsIGV4dHJhX2N4eF9hcmdzPVtdLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBjbWQgPSBbY29tcGlsZXIsICcteCcsICdjKysnLCAnLWZzeW50YXgtb25seSddICsgZXh0cmFfY3h4X2FyZ3MKKyAgICAgICAgT25lQ29tbWFuZFBlckZpbGVUZXN0Ll9faW5pdF9fKHNlbGYsIGNtZCwgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVGVtcElucHV0PTEsICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBjcmVhdGVUZW1wSW5wdXQoc2VsZiwgdG1wLCB0ZXN0KToKKyAgICAgICAgcHJpbnQgPj50bXAsICcjaW5jbHVkZSAiJXMiJyAlIHRlc3Quc291cmNlX3BhdGgKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9UZXN0UnVubmVyLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L1Rlc3RSdW5uZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmYmM2YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9UZXN0UnVubmVyLnB5CkBAIC0wLDAgKzEsNTE3IEBACitpbXBvcnQgb3MsIHNpZ25hbCwgc3VicHJvY2Vzcywgc3lzCitpbXBvcnQgU3RyaW5nSU8KKworaW1wb3J0IFNoVXRpbAoraW1wb3J0IFRlc3QKK2ltcG9ydCBVdGlsCisKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHRlbXBmaWxlCisKK2NsYXNzIEludGVybmFsU2hlbGxFcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBtZXNzYWdlKToKKyAgICAgICAgc2VsZi5jb21tYW5kID0gY29tbWFuZAorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisKKyMgRG9uJ3QgdXNlIGNsb3NlX2ZkcyBvbiBXaW5kb3dzLgora1VzZUNsb3NlRkRzID0gcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnCisKKyMgVXNlIHRlbXBvcmFyeSBmaWxlcyB0byByZXBsYWNlIC9kZXYvbnVsbCBvbiBXaW5kb3dzLgora0F2b2lkRGV2TnVsbCA9IHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJworCitkZWYgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgY3dkPU5vbmUsIGVudj1Ob25lKToKKyAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihjb21tYW5kLCBjd2Q9Y3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudikKKyAgICBvdXQsZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgZXhpdENvZGUgPSBwLndhaXQoKQorCisgICAgIyBEZXRlY3QgQ3RybC1DIGluIHN1YnByb2Nlc3MuCisgICAgaWYgZXhpdENvZGUgPT0gLXNpZ25hbC5TSUdJTlQ6CisgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisKKyAgICByZXR1cm4gb3V0LCBlcnIsIGV4aXRDb2RlCisKK2RlZiBleGVjdXRlU2hDbWQoY21kLCBjZmcsIGN3ZCwgcmVzdWx0cyk6CisgICAgaWYgaXNpbnN0YW5jZShjbWQsIFNoVXRpbC5TZXEpOgorICAgICAgICBpZiBjbWQub3AgPT0gJzsnOgorICAgICAgICAgICAgcmVzID0gZXhlY3V0ZVNoQ21kKGNtZC5saHMsIGNmZywgY3dkLCByZXN1bHRzKQorICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVTaENtZChjbWQucmhzLCBjZmcsIGN3ZCwgcmVzdWx0cykKKworICAgICAgICBpZiBjbWQub3AgPT0gJyYnOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwidW5zdXBwb3J0ZWQgdGVzdCBjb21tYW5kOiAnJiciCisKKyAgICAgICAgaWYgY21kLm9wID09ICd8fCc6CisgICAgICAgICAgICByZXMgPSBleGVjdXRlU2hDbWQoY21kLmxocywgY2ZnLCBjd2QsIHJlc3VsdHMpCisgICAgICAgICAgICBpZiByZXMgIT0gMDoKKyAgICAgICAgICAgICAgICByZXMgPSBleGVjdXRlU2hDbWQoY21kLnJocywgY2ZnLCBjd2QsIHJlc3VsdHMpCisgICAgICAgICAgICByZXR1cm4gcmVzCisgICAgICAgIGlmIGNtZC5vcCA9PSAnJiYnOgorICAgICAgICAgICAgcmVzID0gZXhlY3V0ZVNoQ21kKGNtZC5saHMsIGNmZywgY3dkLCByZXN1bHRzKQorICAgICAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcworCisgICAgICAgICAgICBpZiByZXMgPT0gMDoKKyAgICAgICAgICAgICAgICByZXMgPSBleGVjdXRlU2hDbWQoY21kLnJocywgY2ZnLCBjd2QsIHJlc3VsdHMpCisgICAgICAgICAgICByZXR1cm4gcmVzCisKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwnVW5rbm93biBzaGVsbCBjb21tYW5kOiAlcicgJSBjbWQub3AKKworICAgIGFzc2VydCBpc2luc3RhbmNlKGNtZCwgU2hVdGlsLlBpcGVsaW5lKQorICAgIHByb2NzID0gW10KKyAgICBpbnB1dCA9IHN1YnByb2Nlc3MuUElQRQorICAgIHN0ZGVyclRlbXBGaWxlcyA9IFtdCisgICAgIyBUbyBhdm9pZCBkZWFkbG9jaywgd2UgdXNlIGEgc2luZ2xlIHN0ZGVyciBzdHJlYW0gZm9yIHBpcGVkCisgICAgIyBvdXRwdXQuIFRoaXMgaXMgbnVsbCB1bnRpbCB3ZSBoYXZlIHNlZW4gc29tZSBvdXRwdXQgdXNpbmcKKyAgICAjIHN0ZGVyci4KKyAgICBmb3IgaSxqIGluIGVudW1lcmF0ZShjbWQuY29tbWFuZHMpOgorICAgICAgICAjIEFwcGx5IHRoZSByZWRpcmVjdGlvbnMsIHdlIHVzZSAoTiwpIGFzIGEgc2VudGluYWwgdG8gaW5kaWNhdGUgc3RkaW4sCisgICAgICAgICMgc3Rkb3V0LCBzdGRlcnIgZm9yIE4gZXF1YWwgdG8gMCwgMSwgb3IgMiByZXNwZWN0aXZlbHkuIFJlZGlyZWN0cyB0byBvcgorICAgICAgICAjIGZyb20gYSBmaWxlIGFyZSByZXByZXNlbnRlZCB3aXRoIGEgbGlzdCBbZmlsZSwgbW9kZSwgZmlsZS1vYmplY3RdCisgICAgICAgICMgd2hlcmUgZmlsZS1vYmplY3QgaXMgaW5pdGlhbGx5IE5vbmUuCisgICAgICAgIHJlZGlyZWN0cyA9IFsoMCwpLCAoMSwpLCAoMiwpXQorICAgICAgICBmb3IgciBpbiBqLnJlZGlyZWN0czoKKyAgICAgICAgICAgIGlmIHJbMF0gPT0gKCc+JywyKToKKyAgICAgICAgICAgICAgICByZWRpcmVjdHNbMl0gPSBbclsxXSwgJ3cnLCBOb25lXQorICAgICAgICAgICAgZWxpZiByWzBdID09ICgnPj4nLDIpOgorICAgICAgICAgICAgICAgIHJlZGlyZWN0c1syXSA9IFtyWzFdLCAnYScsIE5vbmVdCisgICAgICAgICAgICBlbGlmIHJbMF0gPT0gKCc+JicsMikgYW5kIHJbMV0gaW4gJzAxMic6CisgICAgICAgICAgICAgICAgcmVkaXJlY3RzWzJdID0gcmVkaXJlY3RzW2ludChyWzFdKV0KKyAgICAgICAgICAgIGVsaWYgclswXSA9PSAoJz4mJywpIG9yIHJbMF0gPT0gKCcmPicsKToKKyAgICAgICAgICAgICAgICByZWRpcmVjdHNbMV0gPSByZWRpcmVjdHNbMl0gPSBbclsxXSwgJ3cnLCBOb25lXQorICAgICAgICAgICAgZWxpZiByWzBdID09ICgnPicsKToKKyAgICAgICAgICAgICAgICByZWRpcmVjdHNbMV0gPSBbclsxXSwgJ3cnLCBOb25lXQorICAgICAgICAgICAgZWxpZiByWzBdID09ICgnPj4nLCk6CisgICAgICAgICAgICAgICAgcmVkaXJlY3RzWzFdID0gW3JbMV0sICdhJywgTm9uZV0KKyAgICAgICAgICAgIGVsaWYgclswXSA9PSAoJzwnLCk6CisgICAgICAgICAgICAgICAgcmVkaXJlY3RzWzBdID0gW3JbMV0sICdyJywgTm9uZV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwiVW5zdXBwb3J0ZWQgcmVkaXJlY3Q6ICVyIiAlIChyLCkKKworICAgICAgICAjIE1hcCBmcm9tIHRoZSBmaW5hbCByZWRpcmVjdGlvbnMgdG8gc29tZXRoaW5nIHN1YnByb2Nlc3MgY2FuIGhhbmRsZS4KKyAgICAgICAgZmluYWxfcmVkaXJlY3RzID0gW10KKyAgICAgICAgZm9yIGluZGV4LHIgaW4gZW51bWVyYXRlKHJlZGlyZWN0cyk6CisgICAgICAgICAgICBpZiByID09ICgwLCk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5wdXQKKyAgICAgICAgICAgIGVsaWYgciA9PSAoMSwpOgorICAgICAgICAgICAgICAgIGlmIGluZGV4ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsIlVuc3VwcG9ydGVkIHJlZGlyZWN0IGZvciBzdGRpbiIKKyAgICAgICAgICAgICAgICBlbGlmIGluZGV4ID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MuUElQRQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MuU1RET1VUCisgICAgICAgICAgICBlbGlmIHIgPT0gKDIsKToKKyAgICAgICAgICAgICAgICBpZiBpbmRleCAhPSAyOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCJVbnN1cHBvcnRlZCByZWRpcmVjdCBvbiBzdGRvdXQiCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHJbMl0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYga0F2b2lkRGV2TnVsbCBhbmQgclswXSA9PSAnL2Rldi9udWxsJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJbMl0gPSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKG1vZGU9clsxXSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJbMl0gPSBvcGVuKHJbMF0sIHJbMV0pCisgICAgICAgICAgICAgICAgICAgICMgV29ya2Fyb3VuZCBhIFdpbjMyIGFuZC9vciBzdWJwcm9jZXNzIGJ1ZyB3aGVuIGFwcGVuZGluZy4KKyAgICAgICAgICAgICAgICAgICAgaWYgclsxXSA9PSAnYSc6CisgICAgICAgICAgICAgICAgICAgICAgICByWzJdLnNlZWsoMCwgMikKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByWzJdCisgICAgICAgICAgICBmaW5hbF9yZWRpcmVjdHMuYXBwZW5kKHJlc3VsdCkKKworICAgICAgICBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIgPSBmaW5hbF9yZWRpcmVjdHMKKworICAgICAgICAjIElmIHN0ZGVyciB3YW50cyB0byBjb21lIGZyb20gc3Rkb3V0LCBidXQgc3Rkb3V0IGlzbid0IGEgcGlwZSwgdGhlbiBwdXQKKyAgICAgICAgIyBzdGRlcnIgb24gYSBwaXBlIGFuZCB0cmVhdCBpdCBhcyBzdGRvdXQuCisgICAgICAgIGlmIChzdGRlcnIgPT0gc3VicHJvY2Vzcy5TVERPVVQgYW5kIHN0ZG91dCAhPSBzdWJwcm9jZXNzLlBJUEUpOgorICAgICAgICAgICAgc3RkZXJyID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgICAgICBzdGRlcnJJc1N0ZG91dCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0ZGVycklzU3Rkb3V0ID0gRmFsc2UKKworICAgICAgICAgICAgIyBEb24ndCBhbGxvdyBzdGRlcnIgb24gYSBQSVBFIGV4Y2VwdCBmb3IgdGhlIGxhc3QKKyAgICAgICAgICAgICMgcHJvY2VzcywgdGhpcyBjb3VsZCBkZWFkbG9jay4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgRklYTUU6IFRoaXMgaXMgc2xvdywgYnV0IHNvIGlzIGRlYWRsb2NrLgorICAgICAgICAgICAgaWYgc3RkZXJyID09IHN1YnByb2Nlc3MuUElQRSBhbmQgaiAhPSBjbWQuY29tbWFuZHNbLTFdOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUobW9kZT0ndytiJykKKyAgICAgICAgICAgICAgICBzdGRlcnJUZW1wRmlsZXMuYXBwZW5kKChpLCBzdGRlcnIpKQorCisgICAgICAgICMgUmVzb2x2ZSB0aGUgZXhlY3V0YWJsZSBwYXRoIG91cnNlbHZlcy4KKyAgICAgICAgYXJncyA9IGxpc3Qoai5hcmdzKQorICAgICAgICBhcmdzWzBdID0gVXRpbC53aGljaChhcmdzWzBdLCBjZmcuZW52aXJvbm1lbnRbJ1BBVEgnXSkKKyAgICAgICAgaWYgbm90IGFyZ3NbMF06CisgICAgICAgICAgICByYWlzZSBJbnRlcm5hbFNoZWxsRXJyb3IoaiwgJyVyOiBjb21tYW5kIG5vdCBmb3VuZCcgJSBqLmFyZ3NbMF0pCisKKyAgICAgICAgcHJvY3MuYXBwZW5kKHN1YnByb2Nlc3MuUG9wZW4oYXJncywgY3dkPWN3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW4gPSBzdGRpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IGNmZy5lbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzID0ga1VzZUNsb3NlRkRzKSkKKworICAgICAgICAjIEltbWVkaWF0ZWx5IGNsb3NlIHN0ZGluIGZvciBhbnkgcHJvY2VzcyB0YWtpbmcgc3RkaW4gZnJvbSB1cy4KKyAgICAgICAgaWYgc3RkaW4gPT0gc3VicHJvY2Vzcy5QSVBFOgorICAgICAgICAgICAgcHJvY3NbLTFdLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgIHByb2NzWy0xXS5zdGRpbiA9IE5vbmUKKworICAgICAgICAjIFVwZGF0ZSB0aGUgY3VycmVudCBzdGRpbiBzb3VyY2UuCisgICAgICAgIGlmIHN0ZG91dCA9PSBzdWJwcm9jZXNzLlBJUEU6CisgICAgICAgICAgICBpbnB1dCA9IHByb2NzWy0xXS5zdGRvdXQKKyAgICAgICAgZWxpZiBzdGRlcnJJc1N0ZG91dDoKKyAgICAgICAgICAgIGlucHV0ID0gcHJvY3NbLTFdLnN0ZGVycgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5wdXQgPSBzdWJwcm9jZXNzLlBJUEUKKworICAgICMgRklYTUU6IFRoZXJlIGlzIHByb2JhYmx5IHN0aWxsIGRlYWRsb2NrIHBvdGVudGlhbCBoZXJlLiBZYXduLgorICAgIHByb2NEYXRhID0gW05vbmVdICogbGVuKHByb2NzKQorICAgIHByb2NEYXRhWy0xXSA9IHByb2NzWy0xXS5jb21tdW5pY2F0ZSgpCisKKyAgICBmb3IgaSBpbiByYW5nZShsZW4ocHJvY3MpIC0gMSk6CisgICAgICAgIGlmIHByb2NzW2ldLnN0ZG91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG91dCA9IHByb2NzW2ldLnN0ZG91dC5yZWFkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dCA9ICcnCisgICAgICAgIGlmIHByb2NzW2ldLnN0ZGVyciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVyciA9IHByb2NzW2ldLnN0ZGVyci5yZWFkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVyciA9ICcnCisgICAgICAgIHByb2NEYXRhW2ldID0gKG91dCxlcnIpCisgICAgICAgIAorICAgICMgUmVhZCBzdGRlcnIgb3V0IG9mIHRoZSB0ZW1wIGZpbGVzLgorICAgIGZvciBpLGYgaW4gc3RkZXJyVGVtcEZpbGVzOgorICAgICAgICBmLnNlZWsoMCwgMCkKKyAgICAgICAgcHJvY0RhdGFbaV0gPSAocHJvY0RhdGFbaV1bMF0sIGYucmVhZCgpKQorCisgICAgZXhpdENvZGUgPSBOb25lCisgICAgZm9yIGksKG91dCxlcnIpIGluIGVudW1lcmF0ZShwcm9jRGF0YSk6CisgICAgICAgIHJlcyA9IHByb2NzW2ldLndhaXQoKQorICAgICAgICAjIERldGVjdCBDdHJsLUMgaW4gc3VicHJvY2Vzcy4KKyAgICAgICAgaWYgcmVzID09IC1zaWduYWwuU0lHSU5UOgorICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKworICAgICAgICByZXN1bHRzLmFwcGVuZCgoY21kLmNvbW1hbmRzW2ldLCBvdXQsIGVyciwgcmVzKSkKKyAgICAgICAgaWYgY21kLnBpcGVfZXJyOgorICAgICAgICAgICAgIyBQeXRob24gdHJlYXRzIHRoZSBleGl0IGNvZGUgYXMgYSBzaWduZWQgY2hhci4KKyAgICAgICAgICAgIGlmIHJlcyA8IDA6CisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBtaW4oZXhpdENvZGUsIHJlcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBtYXgoZXhpdENvZGUsIHJlcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4aXRDb2RlID0gcmVzCisKKyAgICBpZiBjbWQubmVnYXRlOgorICAgICAgICBleGl0Q29kZSA9IG5vdCBleGl0Q29kZQorCisgICAgcmV0dXJuIGV4aXRDb2RlCisKK2RlZiBleGVjdXRlU2NyaXB0SW50ZXJuYWwodGVzdCwgbGl0Q29uZmlnLCB0bXBCYXNlLCBjb21tYW5kcywgY3dkKToKKyAgICBsbiA9ICcgJiZcbicuam9pbihjb21tYW5kcykKKyAgICB0cnk6CisgICAgICAgIGNtZCA9IFNoVXRpbC5TaFBhcnNlcihsbiwgbGl0Q29uZmlnLmlzV2luZG93cykucGFyc2UoKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmV0dXJuIChUZXN0LkZBSUwsICJzaGVsbCBwYXJzZXIgZXJyb3Igb246ICVyIiAlIGxuKQorCisgICAgcmVzdWx0cyA9IFtdCisgICAgdHJ5OgorICAgICAgICBleGl0Q29kZSA9IGV4ZWN1dGVTaENtZChjbWQsIHRlc3QuY29uZmlnLCBjd2QsIHJlc3VsdHMpCisgICAgZXhjZXB0IEludGVybmFsU2hlbGxFcnJvcixlOgorICAgICAgICBvdXQgPSAnJworICAgICAgICBlcnIgPSBlLm1lc3NhZ2UKKyAgICAgICAgZXhpdENvZGUgPSAyNTUKKworICAgIG91dCA9IGVyciA9ICcnCisgICAgZm9yIGksKGNtZCwgY21kX291dCxjbWRfZXJyLHJlcykgaW4gZW51bWVyYXRlKHJlc3VsdHMpOgorICAgICAgICBvdXQgKz0gJ0NvbW1hbmQgJWQ6ICVzXG4nICUgKGksICcgJy5qb2luKCciJXMiJyAlIHMgZm9yIHMgaW4gY21kLmFyZ3MpKQorICAgICAgICBvdXQgKz0gJ0NvbW1hbmQgJWQgUmVzdWx0OiAlclxuJyAlIChpLCByZXMpCisgICAgICAgIG91dCArPSAnQ29tbWFuZCAlZCBPdXRwdXQ6XG4lc1xuXG4nICUgKGksIGNtZF9vdXQpCisgICAgICAgIG91dCArPSAnQ29tbWFuZCAlZCBTdGRlcnI6XG4lc1xuXG4nICUgKGksIGNtZF9lcnIpCisKKyAgICByZXR1cm4gb3V0LCBlcnIsIGV4aXRDb2RlCisKK2RlZiBleGVjdXRlVGNsU2NyaXB0SW50ZXJuYWwodGVzdCwgbGl0Q29uZmlnLCB0bXBCYXNlLCBjb21tYW5kcywgY3dkKToKKyAgICBpbXBvcnQgVGNsVXRpbAorICAgIGNtZHMgPSBbXQorICAgIGZvciBsbiBpbiBjb21tYW5kczoKKyAgICAgICAgIyBHaXZlbiB0aGUgdW5mb3J0dW5hdGUgd2F5IExMVk0ncyB0ZXN0IGFyZSB3cml0dGVuLCB0aGUgbGluZSBnZXRzCisgICAgICAgICMgYmFja3NsYXNoIHN1YnN0aXR1dGlvbiBkb25lIHR3aWNlLgorICAgICAgICBsbiA9IFRjbFV0aWwuVGNsTGV4ZXIobG4pLmxleF91bnF1b3RlZChwcm9jZXNzX2FsbCA9IFRydWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG9rZW5zID0gbGlzdChUY2xVdGlsLlRjbExleGVyKGxuKS5sZXgoKSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuIChUZXN0LkZBSUwsICJUY2wgbGV4ZXIgZXJyb3Igb246ICVyIiAlIGxuKQorCisgICAgICAgICMgVmFsaWRhdGUgdGhlcmUgYXJlIG5vIGNvbnRyb2wgdG9rZW5zLgorICAgICAgICBmb3IgdCBpbiB0b2tlbnM6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0LCBzdHIpOgorICAgICAgICAgICAgICAgIHJldHVybiAoVGVzdC5GQUlMLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdGVzdCBsaW5lOiAlciBjb250YWluaW5nICVyIiAlIChsbiwgdCkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kcy5hcHBlbmQoVGNsVXRpbC5UY2xFeGVjQ29tbWFuZCh0b2tlbnMpLnBhcnNlX3BpcGVsaW5lKCkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiAoVGVzdC5GQUlMLCAiVGNsICdleGVjJyBwYXJzZSBlcnJvciBvbjogJXIiICUgbG4pCisKKyAgICBjbWQgPSBjbWRzWzBdCisgICAgZm9yIGMgaW4gY21kc1sxOl06CisgICAgICAgIGNtZCA9IFNoVXRpbC5TZXEoY21kLCAnJiYnLCBjKQorCisgICAgIyBGSVhNRTogVGhpcyBpcyBsYW1lLCB3ZSBzaG91bGRuJ3QgbmVlZCBiYXNoLiBTZWUgUFI1MjQwLgorICAgIGJhc2hQYXRoID0gbGl0Q29uZmlnLmdldEJhc2hQYXRoKCkKKyAgICBpZiBsaXRDb25maWcudXNlVGNsQXNTaCBhbmQgYmFzaFBhdGg6CisgICAgICAgIHNjcmlwdCA9IHRtcEJhc2UgKyAnLnNjcmlwdCcKKworICAgICAgICAjIFdyaXRlIHNjcmlwdCBmaWxlCisgICAgICAgIGYgPSBvcGVuKHNjcmlwdCwndycpCisgICAgICAgIHByaW50ID4+ZiwgJ3NldCAtbyBwaXBlZmFpbCcKKyAgICAgICAgY21kLnRvU2hlbGwoZiwgcGlwZWZhaWwgPSBUcnVlKQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBpZiAwOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3Rkb3V0LCBjbWQKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZG91dCwgb3BlbihzY3JpcHQpLnJlYWQoKQorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3Rkb3V0CisgICAgICAgICAgICByZXR1cm4gJycsICcnLCAwCisKKyAgICAgICAgY29tbWFuZCA9IFtsaXRDb25maWcuZ2V0QmFzaFBhdGgoKSwgc2NyaXB0XQorICAgICAgICBvdXQsZXJyLGV4aXRDb2RlID0gZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgY3dkPWN3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj10ZXN0LmNvbmZpZy5lbnZpcm9ubWVudCkKKworICAgICAgICAjIFRjbCBjb21tYW5kcyBmYWlsIG9uIHN0YW5kYXJkIGVycm9yIG91dHB1dC4KKyAgICAgICAgaWYgZXJyOgorICAgICAgICAgICAgZXhpdENvZGUgPSAxCisgICAgICAgICAgICBvdXQgPSAnQ29tbWFuZCBoYXMgb3V0cHV0IG9uIHN0ZGVyciFcblxuJyArIG91dAorCisgICAgICAgIHJldHVybiBvdXQsZXJyLGV4aXRDb2RlCisgICAgZWxzZToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4aXRDb2RlID0gZXhlY3V0ZVNoQ21kKGNtZCwgdGVzdC5jb25maWcsIGN3ZCwgcmVzdWx0cykKKyAgICAgICAgZXhjZXB0IEludGVybmFsU2hlbGxFcnJvcixlOgorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKGUuY29tbWFuZCwgJycsIGUubWVzc2FnZSArICdcbicsIDI1NSkpCisgICAgICAgICAgICBleGl0Q29kZSA9IDI1NQorCisgICAgb3V0ID0gZXJyID0gJycKKworICAgICMgVGNsIGNvbW1hbmRzIGZhaWwgb24gc3RhbmRhcmQgZXJyb3Igb3V0cHV0LgorICAgIGlmIFtUcnVlIGZvciBfLF8sZXJyLHJlcyBpbiByZXN1bHRzIGlmIGVycl06CisgICAgICAgIGV4aXRDb2RlID0gMQorICAgICAgICBvdXQgKz0gJ0NvbW1hbmQgaGFzIG91dHB1dCBvbiBzdGRlcnIhXG5cbicKKworICAgIGZvciBpLChjbWQsIGNtZF9vdXQsIGNtZF9lcnIsIHJlcykgaW4gZW51bWVyYXRlKHJlc3VsdHMpOgorICAgICAgICBvdXQgKz0gJ0NvbW1hbmQgJWQ6ICVzXG4nICUgKGksICcgJy5qb2luKCciJXMiJyAlIHMgZm9yIHMgaW4gY21kLmFyZ3MpKQorICAgICAgICBvdXQgKz0gJ0NvbW1hbmQgJWQgUmVzdWx0OiAlclxuJyAlIChpLCByZXMpCisgICAgICAgIG91dCArPSAnQ29tbWFuZCAlZCBPdXRwdXQ6XG4lc1xuXG4nICUgKGksIGNtZF9vdXQpCisgICAgICAgIG91dCArPSAnQ29tbWFuZCAlZCBTdGRlcnI6XG4lc1xuXG4nICUgKGksIGNtZF9lcnIpCisKKyAgICByZXR1cm4gb3V0LCBlcnIsIGV4aXRDb2RlCisKK2RlZiBleGVjdXRlU2NyaXB0KHRlc3QsIGxpdENvbmZpZywgdG1wQmFzZSwgY29tbWFuZHMsIGN3ZCk6CisgICAgc2NyaXB0ID0gdG1wQmFzZSArICcuc2NyaXB0JworICAgIGlmIGxpdENvbmZpZy5pc1dpbmRvd3M6CisgICAgICAgIHNjcmlwdCArPSAnLmJhdCcKKworICAgICMgV3JpdGUgc2NyaXB0IGZpbGUKKyAgICBmID0gb3BlbihzY3JpcHQsJ3cnKQorICAgIGlmIGxpdENvbmZpZy5pc1dpbmRvd3M6CisgICAgICAgIGYud3JpdGUoJ1xuaWYgJUVSUk9STEVWRUwlIE5FUSAwIEVYSVRcbicuam9pbihjb21tYW5kcykpCisgICAgZWxzZToKKyAgICAgICAgZi53cml0ZSgnICYmXG4nLmpvaW4oY29tbWFuZHMpKQorICAgIGYud3JpdGUoJ1xuJykKKyAgICBmLmNsb3NlKCkKKworICAgIGlmIGxpdENvbmZpZy5pc1dpbmRvd3M6CisgICAgICAgIGNvbW1hbmQgPSBbJ2NtZCcsJy9jJywgc2NyaXB0XQorICAgIGVsc2U6CisgICAgICAgIGNvbW1hbmQgPSBbJy9iaW4vc2gnLCBzY3JpcHRdCisgICAgICAgIGlmIGxpdENvbmZpZy51c2VWYWxncmluZDoKKyAgICAgICAgICAgICMgRklYTUU6IFJ1bm5pbmcgdmFsZ3JpbmQgb24gc2ggaXMgb3ZlcmtpbGwuIFdlIHByb2JhYmx5IGNvdWxkIGp1c3QKKyAgICAgICAgICAgICMgcnVuIG9uIGNsYW5nIHdpdGggbm8gcmVhbCBsb3NzLgorICAgICAgICAgICAgdmFsZ3JpbmRBcmdzID0gWyd2YWxncmluZCcsICctcScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdG9vbD1tZW1jaGVjaycsICctLXRyYWNlLWNoaWxkcmVuPXllcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tZXJyb3ItZXhpdGNvZGU9MTIzJ10KKyAgICAgICAgICAgIHZhbGdyaW5kQXJncy5leHRlbmQobGl0Q29uZmlnLnZhbGdyaW5kQXJncykKKworICAgICAgICAgICAgY29tbWFuZCA9IHZhbGdyaW5kQXJncyArIGNvbW1hbmQKKworICAgIHJldHVybiBleGVjdXRlQ29tbWFuZChjb21tYW5kLCBjd2Q9Y3dkLCBlbnY9dGVzdC5jb25maWcuZW52aXJvbm1lbnQpCisKK2RlZiBpc0V4cGVjdGVkRmFpbCh4ZmFpbHMsIHh0YXJnZXRzLCB0YXJnZXRfdHJpcGxlKToKKyAgICAjIENoZWNrIGlmIGFueSB4ZmFpbCBtYXRjaGVzIHRoaXMgdGFyZ2V0LgorICAgIGZvciBpdGVtIGluIHhmYWlsczoKKyAgICAgICAgaWYgaXRlbSA9PSAnKicgb3IgaXRlbSBpbiB0YXJnZXRfdHJpcGxlOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgSWYgc28sIHNlZSBpZiBpdCBpcyBleHBlY3RlZCB0byBwYXNzIG9uIHRoaXMgdGFyZ2V0LgorICAgICMKKyAgICAjIEZJWE1FOiBSZW5hbWUgWFRBUkdFVCB0byBzb21ldGhpbmcgdGhhdCBtYWtlcyBzZW5zZSwgbGlrZSBYUEFTUy4KKyAgICBmb3IgaXRlbSBpbiB4dGFyZ2V0czoKKyAgICAgICAgaWYgaXRlbSA9PSAnKicgb3IgaXRlbSBpbiB0YXJnZXRfdHJpcGxlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgcGFyc2VJbnRlZ3JhdGVkVGVzdFNjcmlwdCh0ZXN0KToKKyAgICAiIiJwYXJzZUludGVncmF0ZWRUZXN0U2NyaXB0IC0gU2NhbiBhbiBMTFZNL0NsYW5nIHN0eWxlIGludGVncmF0ZWQgdGVzdAorICAgIHNjcmlwdCBhbmQgZXh0cmFjdCB0aGUgbGluZXMgdG8gJ1JVTicgYXMgd2VsbCBhcyAnWEZBSUwnIGFuZCAnWFRBUkdFVCcKKyAgICBpbmZvcm1hdGlvbi4gVGhlIFJVTiBsaW5lcyBhbHNvIHdpbGwgaGF2ZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gcGVyZm9ybWVkLgorICAgICIiIgorCisgICAgIyBHZXQgdGhlIHRlbXBvcmFyeSBsb2NhdGlvbiwgdGhpcyBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIHRlc3Qgc3VpdGUKKyAgICAjIHJvb3QsIG5vdCB0ZXN0IHNvdXJjZSByb290LgorICAgICMKKyAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgaGVyZT8KKyAgICBzb3VyY2VwYXRoID0gdGVzdC5nZXRTb3VyY2VQYXRoKCkKKyAgICBleGVjcGF0aCA9IHRlc3QuZ2V0RXhlY1BhdGgoKQorICAgIGV4ZWNkaXIsZXhlY2Jhc2UgPSBvcy5wYXRoLnNwbGl0KGV4ZWNwYXRoKQorICAgIHRtcEJhc2UgPSBvcy5wYXRoLmpvaW4oZXhlY2RpciwgJ091dHB1dCcsIGV4ZWNiYXNlKQorICAgIGlmIHRlc3QuaW5kZXggaXMgbm90IE5vbmU6CisgICAgICAgIHRtcEJhc2UgKz0gJ18lZCcgJSB0ZXN0LmluZGV4CisKKyAgICAjIFdlIHVzZSAjX01BUktFUl8jIHRvIGhpZGUgJSUgd2hpbGUgd2UgZG8gdGhlIG90aGVyIHN1YnN0aXR1dGlvbnMuCisgICAgc3Vic3RpdHV0aW9ucyA9IFsoJyUlJywgJyNfTUFSS0VSXyMnKV0KKyAgICBzdWJzdGl0dXRpb25zLmV4dGVuZCh0ZXN0LmNvbmZpZy5zdWJzdGl0dXRpb25zKQorICAgIHN1YnN0aXR1dGlvbnMuZXh0ZW5kKFsoJyVzJywgc291cmNlcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnJVMnLCBvcy5wYXRoLmRpcm5hbWUoc291cmNlcGF0aCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJyVwJywgb3MucGF0aC5kaXJuYW1lKHNvdXJjZXBhdGgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCcldCcsIHRtcEJhc2UgKyAnLnRtcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlIHdlIGtpbGwgRGVqYUdOVS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCclYWJzX3RtcCcsIHRtcEJhc2UgKyAnLnRtcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJyNfTUFSS0VSXyMnLCAnJScpXSkKKworICAgICMgQ29sbGVjdCB0aGUgdGVzdCBsaW5lcyBmcm9tIHRoZSBzY3JpcHQuCisgICAgc2NyaXB0ID0gW10KKyAgICB4ZmFpbHMgPSBbXQorICAgIHh0YXJnZXRzID0gW10KKyAgICBmb3IgbG4gaW4gb3Blbihzb3VyY2VwYXRoKToKKyAgICAgICAgaWYgJ1JVTjonIGluIGxuOgorICAgICAgICAgICAgIyBJc29sYXRlIHRoZSBjb21tYW5kIHRvIHJ1bi4KKyAgICAgICAgICAgIGluZGV4ID0gbG4uaW5kZXgoJ1JVTjonKQorICAgICAgICAgICAgbG4gPSBsbltpbmRleCs0Ol0KKworICAgICAgICAgICAgIyBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICAgICAgICBsbiA9IGxuLnJzdHJpcCgpCisKKyAgICAgICAgICAgICMgQ29sbGFwc2UgbGluZXMgd2l0aCB0cmFpbGluZyAnXFwnLgorICAgICAgICAgICAgaWYgc2NyaXB0IGFuZCBzY3JpcHRbLTFdWy0xXSA9PSAnXFwnOgorICAgICAgICAgICAgICAgIHNjcmlwdFstMV0gPSBzY3JpcHRbLTFdWzotMV0gKyBsbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKGxuKQorICAgICAgICBlbGlmICdYRkFJTDonIGluIGxuOgorICAgICAgICAgICAgaXRlbXMgPSBsbltsbi5pbmRleCgnWEZBSUw6JykgKyA2Ol0uc3BsaXQoJywnKQorICAgICAgICAgICAgeGZhaWxzLmV4dGVuZChbcy5zdHJpcCgpIGZvciBzIGluIGl0ZW1zXSkKKyAgICAgICAgZWxpZiAnWFRBUkdFVDonIGluIGxuOgorICAgICAgICAgICAgaXRlbXMgPSBsbltsbi5pbmRleCgnWFRBUkdFVDonKSArIDg6XS5zcGxpdCgnLCcpCisgICAgICAgICAgICB4dGFyZ2V0cy5leHRlbmQoW3Muc3RyaXAoKSBmb3IgcyBpbiBpdGVtc10pCisgICAgICAgIGVsaWYgJ0VORC4nIGluIGxuOgorICAgICAgICAgICAgIyBDaGVjayBmb3IgRU5ELiBsaW5lcy4KKyAgICAgICAgICAgIGlmIGxuW2xuLmluZGV4KCdFTkQuJyk6XS5zdHJpcCgpID09ICdFTkQuJzoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgIyBBcHBseSBzdWJzdGl0dXRpb25zIHRvIHRoZSBzY3JpcHQuCisgICAgZGVmIHByb2Nlc3NMaW5lKGxuKToKKyAgICAgICAgIyBBcHBseSBzdWJzdGl0dXRpb25zCisgICAgICAgIGZvciBhLGIgaW4gc3Vic3RpdHV0aW9uczoKKyAgICAgICAgICAgIGxuID0gbG4ucmVwbGFjZShhLGIpCisKKyAgICAgICAgIyBTdHJpcCB0aGUgdHJhaWxpbmcgbmV3bGluZSBhbmQgYW55IGV4dHJhIHdoaXRlc3BhY2UuCisgICAgICAgIHJldHVybiBsbi5zdHJpcCgpCisgICAgc2NyaXB0ID0gbWFwKHByb2Nlc3NMaW5lLCBzY3JpcHQpCisKKyAgICAjIFZlcmlmeSB0aGUgc2NyaXB0IGNvbnRhaW5zIGEgcnVuIGxpbmUuCisgICAgaWYgbm90IHNjcmlwdDoKKyAgICAgICAgcmV0dXJuIChUZXN0LlVOUkVTT0xWRUQsICJUZXN0IGhhcyBubyBydW4gbGluZSEiKQorCisgICAgaWYgc2NyaXB0Wy0xXVstMV0gPT0gJ1xcJzoKKyAgICAgICAgcmV0dXJuIChUZXN0LlVOUkVTT0xWRUQsICJUZXN0IGhhcyB1bnRlcm1pbmF0ZWQgcnVuIGxpbmVzICh3aXRoICdcXCcpIikKKworICAgIGlzWEZhaWwgPSBpc0V4cGVjdGVkRmFpbCh4ZmFpbHMsIHh0YXJnZXRzLCB0ZXN0LnN1aXRlLmNvbmZpZy50YXJnZXRfdHJpcGxlKQorICAgIHJldHVybiBzY3JpcHQsaXNYRmFpbCx0bXBCYXNlLGV4ZWNkaXIKKworZGVmIGZvcm1hdFRlc3RPdXRwdXQoc3RhdHVzLCBvdXQsIGVyciwgZXhpdENvZGUsIHNjcmlwdCk6CisgICAgb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgIHByaW50ID4+b3V0cHV0LCAiU2NyaXB0OiIKKyAgICBwcmludCA+Pm91dHB1dCwgIi0tIgorICAgIHByaW50ID4+b3V0cHV0LCAnXG4nLmpvaW4oc2NyaXB0KQorICAgIHByaW50ID4+b3V0cHV0LCAiLS0iCisgICAgcHJpbnQgPj5vdXRwdXQsICJFeGl0IENvZGU6ICVyIiAlIGV4aXRDb2RlCisgICAgcHJpbnQgPj5vdXRwdXQsICJDb21tYW5kIE91dHB1dCAoc3Rkb3V0KToiCisgICAgcHJpbnQgPj5vdXRwdXQsICItLSIKKyAgICBvdXRwdXQud3JpdGUob3V0KQorICAgIHByaW50ID4+b3V0cHV0LCAiLS0iCisgICAgcHJpbnQgPj5vdXRwdXQsICJDb21tYW5kIE91dHB1dCAoc3RkZXJyKToiCisgICAgcHJpbnQgPj5vdXRwdXQsICItLSIKKyAgICBvdXRwdXQud3JpdGUoZXJyKQorICAgIHByaW50ID4+b3V0cHV0LCAiLS0iCisgICAgcmV0dXJuIChzdGF0dXMsIG91dHB1dC5nZXR2YWx1ZSgpKQorCitkZWYgZXhlY3V0ZVRjbFRlc3QodGVzdCwgbGl0Q29uZmlnKToKKyAgICBpZiB0ZXN0LmNvbmZpZy51bnN1cHBvcnRlZDoKKyAgICAgICAgcmV0dXJuIChUZXN0LlVOU1VQUE9SVEVELCAnVGVzdCBpcyB1bnN1cHBvcnRlZCcpCisKKyAgICByZXMgPSBwYXJzZUludGVncmF0ZWRUZXN0U2NyaXB0KHRlc3QpCisgICAgaWYgbGVuKHJlcykgPT0gMjoKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgc2NyaXB0LCBpc1hGYWlsLCB0bXBCYXNlLCBleGVjZGlyID0gcmVzCisKKyAgICBpZiBsaXRDb25maWcubm9FeGVjdXRlOgorICAgICAgICByZXR1cm4gKFRlc3QuUEFTUywgJycpCisKKyAgICAjIENyZWF0ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorICAgIFV0aWwubWtkaXJfcChvcy5wYXRoLmRpcm5hbWUodG1wQmFzZSkpCisKKyAgICByZXMgPSBleGVjdXRlVGNsU2NyaXB0SW50ZXJuYWwodGVzdCwgbGl0Q29uZmlnLCB0bXBCYXNlLCBzY3JpcHQsIGV4ZWNkaXIpCisgICAgaWYgbGVuKHJlcykgPT0gMjoKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgb3V0LGVycixleGl0Q29kZSA9IHJlcworICAgIGlmIGlzWEZhaWw6CisgICAgICAgIG9rID0gZXhpdENvZGUgIT0gMAorICAgICAgICBzdGF0dXMgPSAoVGVzdC5YUEFTUywgVGVzdC5YRkFJTClbb2tdCisgICAgZWxzZToKKyAgICAgICAgb2sgPSBleGl0Q29kZSA9PSAwCisgICAgICAgIHN0YXR1cyA9IChUZXN0LkZBSUwsIFRlc3QuUEFTUylbb2tdCisKKyAgICBpZiBvazoKKyAgICAgICAgcmV0dXJuIChzdGF0dXMsJycpCisKKyAgICByZXR1cm4gZm9ybWF0VGVzdE91dHB1dChzdGF0dXMsIG91dCwgZXJyLCBleGl0Q29kZSwgc2NyaXB0KQorCitkZWYgZXhlY3V0ZVNoVGVzdCh0ZXN0LCBsaXRDb25maWcsIHVzZUV4dGVybmFsU2gpOgorICAgIGlmIHRlc3QuY29uZmlnLnVuc3VwcG9ydGVkOgorICAgICAgICByZXR1cm4gKFRlc3QuVU5TVVBQT1JURUQsICdUZXN0IGlzIHVuc3VwcG9ydGVkJykKKworICAgIHJlcyA9IHBhcnNlSW50ZWdyYXRlZFRlc3RTY3JpcHQodGVzdCkKKyAgICBpZiBsZW4ocmVzKSA9PSAyOgorICAgICAgICByZXR1cm4gcmVzCisKKyAgICBzY3JpcHQsIGlzWEZhaWwsIHRtcEJhc2UsIGV4ZWNkaXIgPSByZXMKKworICAgIGlmIGxpdENvbmZpZy5ub0V4ZWN1dGU6CisgICAgICAgIHJldHVybiAoVGVzdC5QQVNTLCAnJykKKworICAgICMgQ3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgICAgVXRpbC5ta2Rpcl9wKG9zLnBhdGguZGlybmFtZSh0bXBCYXNlKSkKKworICAgIGlmIHVzZUV4dGVybmFsU2g6CisgICAgICAgIHJlcyA9IGV4ZWN1dGVTY3JpcHQodGVzdCwgbGl0Q29uZmlnLCB0bXBCYXNlLCBzY3JpcHQsIGV4ZWNkaXIpCisgICAgZWxzZToKKyAgICAgICAgcmVzID0gZXhlY3V0ZVNjcmlwdEludGVybmFsKHRlc3QsIGxpdENvbmZpZywgdG1wQmFzZSwgc2NyaXB0LCBleGVjZGlyKQorICAgIGlmIGxlbihyZXMpID09IDI6CisgICAgICAgIHJldHVybiByZXMKKworICAgIG91dCxlcnIsZXhpdENvZGUgPSByZXMKKyAgICBpZiBpc1hGYWlsOgorICAgICAgICBvayA9IGV4aXRDb2RlICE9IDAKKyAgICAgICAgc3RhdHVzID0gKFRlc3QuWFBBU1MsIFRlc3QuWEZBSUwpW29rXQorICAgIGVsc2U6CisgICAgICAgIG9rID0gZXhpdENvZGUgPT0gMAorICAgICAgICBzdGF0dXMgPSAoVGVzdC5GQUlMLCBUZXN0LlBBU1MpW29rXQorCisgICAgaWYgb2s6CisgICAgICAgIHJldHVybiAoc3RhdHVzLCcnKQorCisgICAgcmV0dXJuIGZvcm1hdFRlc3RPdXRwdXQoc3RhdHVzLCBvdXQsIGVyciwgZXhpdENvZGUsIHNjcmlwdCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9UZXN0aW5nQ29uZmlnLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L1Rlc3RpbmdDb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1MDY3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9UZXN0aW5nQ29uZmlnLnB5CkBAIC0wLDAgKzEsOTcgQEAKK2ltcG9ydCBvcworCitjbGFzcyBUZXN0aW5nQ29uZmlnOgorICAgICIiIiIKKyAgICBUZXN0aW5nQ29uZmlnIC0gSW5mb3JtYXRpb24gb24gdGhlIHRlc3RzIGluc2lkZSBhIHN1aXRlLgorICAgICIiIgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmcm9tcGF0aChwYXRoLCBwYXJlbnQsIGxpdENvbmZpZywgbXVzdEV4aXN0LCBjb25maWcgPSBOb25lKToKKyAgICAgICAgaWYgY29uZmlnIGlzIE5vbmU6CisgICAgICAgICAgICAjIFNldCB0aGUgZW52aXJvbm1lbnQgYmFzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgICAgICAgICBlbnZpcm9ubWVudCA9IHsKKyAgICAgICAgICAgICAgICAnUEFUSCcgOiBvcy5wYXRoc2VwLmpvaW4obGl0Q29uZmlnLnBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3MuZW52aXJvbi5nZXQoJ1BBVEgnLCcnKV0pLAorICAgICAgICAgICAgICAgICdQQVRIRVhUJyA6IG9zLmVudmlyb24uZ2V0KCdQQVRIRVhUJywnJyksCisgICAgICAgICAgICAgICAgJ1NZU1RFTVJPT1QnIDogb3MuZW52aXJvbi5nZXQoJ1NZU1RFTVJPT1QnLCcnKSwKKyAgICAgICAgICAgICAgICAnTExWTV9ESVNBQkxFX0NSVF9ERUJVRycgOiAnMScsCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25maWcgPSBUZXN0aW5nQ29uZmlnKHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICc8dW5uYW1lZD4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IHNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Zvcm1hdCA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50ID0gZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbnMgPSBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgPSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fY2xvbmUgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2V4ZWNfcm9vdCA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc291cmNlX3Jvb3QgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlcyA9IFtdKQorCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgIyBGSVhNRTogSW1wcm92ZSBkZXRlY3Rpb24gYW5kIGVycm9yIHJlcG9ydGluZyBvZiBlcnJvcnMgaW4gdGhlCisgICAgICAgICAgICAjIGNvbmZpZyBmaWxlLgorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCkKKyAgICAgICAgICAgIGNmZ19nbG9iYWxzID0gZGljdChnbG9iYWxzKCkpCisgICAgICAgICAgICBjZmdfZ2xvYmFsc1snY29uZmlnJ10gPSBjb25maWcKKyAgICAgICAgICAgIGNmZ19nbG9iYWxzWydsaXQnXSA9IGxpdENvbmZpZworICAgICAgICAgICAgY2ZnX2dsb2JhbHNbJ19fZmlsZV9fJ10gPSBwYXRoCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXhlYyBmIGluIGNmZ19nbG9iYWxzCisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCxzdGF0dXM6CisgICAgICAgICAgICAgICAgIyBXZSBhbGxvdyBub3JtYWwgc3lzdGVtIGV4aXQgaW5zaWRlIGEgY29uZmlnIGZpbGUgdG8ganVzdAorICAgICAgICAgICAgICAgICMgcmV0dXJuIGNvbnRyb2wgd2l0aG91dCBlcnJvci4KKyAgICAgICAgICAgICAgICBpZiBzdGF0dXMuYXJnczoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBlbGlmIG11c3RFeGlzdDoKKyAgICAgICAgICAgIGxpdENvbmZpZy5mYXRhbCgndW5hYmxlIHRvIGxvYWQgY29uZmlnIGZyb20gJXIgJyAlIHBhdGgpCisKKyAgICAgICAgY29uZmlnLmZpbmlzaChsaXRDb25maWcpCisgICAgICAgIHJldHVybiBjb25maWcKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIG5hbWUsIHN1ZmZpeGVzLCB0ZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQsIHN1YnN0aXR1dGlvbnMsIHVuc3VwcG9ydGVkLCBvbl9jbG9uZSwKKyAgICAgICAgICAgICAgICAgdGVzdF9leGVjX3Jvb3QsIHRlc3Rfc291cmNlX3Jvb3QsIGV4Y2x1ZGVzKToKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5uYW1lID0gc3RyKG5hbWUpCisgICAgICAgIHNlbGYuc3VmZml4ZXMgPSBzZXQoc3VmZml4ZXMpCisgICAgICAgIHNlbGYudGVzdF9mb3JtYXQgPSB0ZXN0X2Zvcm1hdAorICAgICAgICBzZWxmLmVudmlyb25tZW50ID0gZGljdChlbnZpcm9ubWVudCkKKyAgICAgICAgc2VsZi5zdWJzdGl0dXRpb25zID0gbGlzdChzdWJzdGl0dXRpb25zKQorICAgICAgICBzZWxmLnVuc3VwcG9ydGVkID0gdW5zdXBwb3J0ZWQKKyAgICAgICAgc2VsZi5vbl9jbG9uZSA9IG9uX2Nsb25lCisgICAgICAgIHNlbGYudGVzdF9leGVjX3Jvb3QgPSB0ZXN0X2V4ZWNfcm9vdAorICAgICAgICBzZWxmLnRlc3Rfc291cmNlX3Jvb3QgPSB0ZXN0X3NvdXJjZV9yb290CisgICAgICAgIHNlbGYuZXhjbHVkZXMgPSBzZXQoZXhjbHVkZXMpCisKKyAgICBkZWYgY2xvbmUoc2VsZiwgcGF0aCk6CisgICAgICAgICMgRklYTUU6IENoYWluIGltcGxlbWVudGF0aW9ucz8KKyAgICAgICAgIworICAgICAgICAjIEZJWE1FOiBBbGxvdyBleHRyYSBwYXJhbWV0ZXJzPworICAgICAgICBjZmcgPSBUZXN0aW5nQ29uZmlnKHNlbGYsIHNlbGYubmFtZSwgc2VsZi5zdWZmaXhlcywgc2VsZi50ZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVudmlyb25tZW50LCBzZWxmLnN1YnN0aXR1dGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51bnN1cHBvcnRlZCwgc2VsZi5vbl9jbG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlc3RfZXhlY19yb290LCBzZWxmLnRlc3Rfc291cmNlX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5leGNsdWRlcykKKyAgICAgICAgaWYgY2ZnLm9uX2Nsb25lOgorICAgICAgICAgICAgY2ZnLm9uX2Nsb25lKHNlbGYsIGNmZywgcGF0aCkKKyAgICAgICAgcmV0dXJuIGNmZworCisgICAgZGVmIGZpbmlzaChzZWxmLCBsaXRDb25maWcpOgorICAgICAgICAiIiJmaW5pc2goKSAtIEZpbmlzaCB0aGlzIGNvbmZpZyBvYmplY3QsIGFmdGVyIGxvYWRpbmcgaXMgY29tcGxldGUuIiIiCisKKyAgICAgICAgc2VsZi5uYW1lID0gc3RyKHNlbGYubmFtZSkKKyAgICAgICAgc2VsZi5zdWZmaXhlcyA9IHNldChzZWxmLnN1ZmZpeGVzKQorICAgICAgICBzZWxmLmVudmlyb25tZW50ID0gZGljdChzZWxmLmVudmlyb25tZW50KQorICAgICAgICBzZWxmLnN1YnN0aXR1dGlvbnMgPSBsaXN0KHNlbGYuc3Vic3RpdHV0aW9ucykKKyAgICAgICAgaWYgc2VsZi50ZXN0X2V4ZWNfcm9vdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIHJlYWxseSBvbmx5IGJlIHN1aXRlIGluIHRlc3Qgc3VpdGUgY29uZmlnCisgICAgICAgICAgICAjIGZpbGVzLiBTaG91bGQgd2UgZGlzdGluZ3Vpc2ggdGhlbT8KKyAgICAgICAgICAgIHNlbGYudGVzdF9leGVjX3Jvb3QgPSBzdHIoc2VsZi50ZXN0X2V4ZWNfcm9vdCkKKyAgICAgICAgaWYgc2VsZi50ZXN0X3NvdXJjZV9yb290IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBGSVhNRTogVGhpcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgc3VpdGUgaW4gdGVzdCBzdWl0ZSBjb25maWcKKyAgICAgICAgICAgICMgZmlsZXMuIFNob3VsZCB3ZSBkaXN0aW5ndWlzaCB0aGVtPworICAgICAgICAgICAgc2VsZi50ZXN0X3NvdXJjZV9yb290ID0gc3RyKHNlbGYudGVzdF9zb3VyY2Vfcm9vdCkKKyAgICAgICAgc2VsZi5leGNsdWRlcyA9IHNldChzZWxmLmV4Y2x1ZGVzKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L1V0aWwucHkgYi9zcmMvTExWTS91dGlscy9saXQvVXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmM1ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L1V0aWwucHkKQEAgLTAsMCArMSwxMjQgQEAKK2ltcG9ydCBvcywgc3lzCisKK2RlZiBkZXRlY3RDUFVzKCk6CisgICAgIiIiCisgICAgRGV0ZWN0cyB0aGUgbnVtYmVyIG9mIENQVXMgb24gYSBzeXN0ZW0uIENyaWJiZWQgZnJvbSBwcC4KKyAgICAiIiIKKyAgICAjIExpbnV4LCBVbml4IGFuZCBNYWNPUzoKKyAgICBpZiBoYXNhdHRyKG9zLCAic3lzY29uZiIpOgorICAgICAgICBpZiBvcy5zeXNjb25mX25hbWVzLmhhc19rZXkoIlNDX05QUk9DRVNTT1JTX09OTE4iKToKKyAgICAgICAgICAgICMgTGludXggJiBVbml4OgorICAgICAgICAgICAgbmNwdXMgPSBvcy5zeXNjb25mKCJTQ19OUFJPQ0VTU09SU19PTkxOIikKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmNwdXMsIGludCkgYW5kIG5jcHVzID4gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmNwdXMKKyAgICAgICAgZWxzZTogIyBPU1g6CisgICAgICAgICAgICByZXR1cm4gaW50KG9zLnBvcGVuMigic3lzY3RsIC1uIGh3Lm5jcHUiKVsxXS5yZWFkKCkpCisgICAgIyBXaW5kb3dzOgorICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgiTlVNQkVSX09GX1BST0NFU1NPUlMiKToKKyAgICAgICAgbmNwdXMgPSBpbnQob3MuZW52aXJvblsiTlVNQkVSX09GX1BST0NFU1NPUlMiXSkKKyAgICAgICAgaWYgbmNwdXMgPiAwOgorICAgICAgICAgICAgcmV0dXJuIG5jcHVzCisgICAgcmV0dXJuIDEgIyBEZWZhdWx0CisKK2RlZiBta2Rpcl9wKHBhdGgpOgorICAgICIiIm1rZGlyX3AocGF0aCkgLSBNYWtlIHRoZSAicGF0aCIgZGlyZWN0b3J5LCBpZiBpdCBkb2VzIG5vdCBleGlzdDsgdGhpcworICAgIHdpbGwgYWxzbyBtYWtlIGRpcmVjdG9yaWVzIGZvciBhbnkgbWlzc2luZyBwYXJlbnQgZGlyZWN0b3JpZXMuIiIiCisgICAgaW1wb3J0IGVycm5vCisKKyAgICBpZiBub3QgcGF0aCBvciBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBwYXJlbnQgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkgCisgICAgaWYgcGFyZW50ICE9IHBhdGg6CisgICAgICAgIG1rZGlyX3AocGFyZW50KQorCisgICAgdHJ5OgorICAgICAgICBvcy5ta2RpcihwYXRoKQorICAgIGV4Y2VwdCBPU0Vycm9yLGU6CisgICAgICAgICMgSWdub3JlIEVFWElTVCwgd2hpY2ggbWF5IG9jY3VyIGR1cmluZyBhIHJhY2UgY29uZGl0aW9uLgorICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgIHJhaXNlCisKK2RlZiBjYXB0dXJlKGFyZ3MpOgorICAgIGltcG9ydCBzdWJwcm9jZXNzCisgICAgIiIiY2FwdHVyZShjb21tYW5kKSAtIFJ1biB0aGUgZ2l2ZW4gY29tbWFuZCAob3IgYXJndiBsaXN0KSBpbiBhIHNoZWxsIGFuZAorICAgIHJldHVybiB0aGUgc3RhbmRhcmQgb3V0cHV0LiIiIgorICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgb3V0LF8gPSBwLmNvbW11bmljYXRlKCkKKyAgICByZXR1cm4gb3V0CisKK2RlZiB3aGljaChjb21tYW5kLCBwYXRocyA9IE5vbmUpOgorICAgICIiIndoaWNoKGNvbW1hbmQsIFtwYXRoc10pIC0gTG9vayB1cCB0aGUgZ2l2ZW4gY29tbWFuZCBpbiB0aGUgcGF0aHMgc3RyaW5nCisgICAgKG9yIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiB1bnNwZWNpZmllZCkuIiIiCisKKyAgICBpZiBwYXRocyBpcyBOb25lOgorICAgICAgICBwYXRocyA9IG9zLmVudmlyb24uZ2V0KCdQQVRIJywnJykKKworICAgICMgQ2hlY2sgZm9yIGFic29sdXRlIG1hdGNoIGZpcnN0LgorICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbW1hbmQpOgorICAgICAgICByZXR1cm4gY29tbWFuZAorCisgICAgIyBXb3VsZCBiZSBuaWNlIGlmIFB5dGhvbiBoYWQgYSBsaWIgZnVuY3Rpb24gZm9yIHRoaXMuCisgICAgaWYgbm90IHBhdGhzOgorICAgICAgICBwYXRocyA9IG9zLmRlZnBhdGgKKworICAgICMgR2V0IHN1ZmZpeGVzIHRvIHNlYXJjaC4KKyAgICBwYXRoZXh0ID0gb3MuZW52aXJvbi5nZXQoJ1BBVEhFWFQnLCAnJykuc3BsaXQob3MucGF0aHNlcCkKKworICAgICMgU2VhcmNoIHRoZSBwYXRocy4uLgorICAgIGZvciBwYXRoIGluIHBhdGhzLnNwbGl0KG9zLnBhdGhzZXApOgorICAgICAgICBmb3IgZXh0IGluIHBhdGhleHQ6CisgICAgICAgICAgICBwID0gb3MucGF0aC5qb2luKHBhdGgsIGNvbW1hbmQgKyBleHQpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwKToKKyAgICAgICAgICAgICAgICByZXR1cm4gcAorCisgICAgcmV0dXJuIE5vbmUKKworZGVmIHByaW50SGlzdG9ncmFtKGl0ZW1zLCB0aXRsZSA9ICdJdGVtcycpOgorICAgIGltcG9ydCBpdGVydG9vbHMsIG1hdGgKKworICAgIGl0ZW1zLnNvcnQoa2V5ID0gbGFtYmRhIChfLHYpOiB2KQorCisgICAgbWF4VmFsdWUgPSBtYXgoW3YgZm9yIF8sdiBpbiBpdGVtc10pCisKKyAgICAjIFNlbGVjdCBmaXJzdCAibmljZSIgYmFyIGhlaWdodCB0aGF0IHByb2R1Y2VzIG1vcmUgdGhhbiAxMCBiYXJzLgorICAgIHBvd2VyID0gaW50KG1hdGguY2VpbChtYXRoLmxvZyhtYXhWYWx1ZSwgMTApKSkKKyAgICBmb3IgaW5jIGluIGl0ZXJ0b29scy5jeWNsZSgoNSwgMiwgMi41LCAxKSk6CisgICAgICAgIGJhckggPSBpbmMgKiAxMCoqcG93ZXIKKyAgICAgICAgTiA9IGludChtYXRoLmNlaWwobWF4VmFsdWUgLyBiYXJIKSkKKyAgICAgICAgaWYgTiA+IDEwOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxpZiBpbmMgPT0gMToKKyAgICAgICAgICAgIHBvd2VyIC09IDEKKworICAgIGhpc3RvID0gW3NldCgpIGZvciBpIGluIHJhbmdlKE4pXQorICAgIGZvciBuYW1lLHYgaW4gaXRlbXM6CisgICAgICAgIGJpbiA9IG1pbihpbnQoTiAqIHYvbWF4VmFsdWUpLCBOLTEpCisgICAgICAgIGhpc3RvW2Jpbl0uYWRkKG5hbWUpCisKKyAgICBiYXJXID0gNDAKKyAgICBociA9ICctJyAqIChiYXJXICsgMzQpCisgICAgcHJpbnQgJ1xuU2xvd2VzdCAlczonICUgdGl0bGUKKyAgICBwcmludCBocgorICAgIGZvciBuYW1lLHZhbHVlIGluIGl0ZW1zWy0yMDpdOgorICAgICAgICBwcmludCAnJS4yZnM6ICVzJyAlICh2YWx1ZSwgbmFtZSkKKyAgICBwcmludCAnXG4lcyBUaW1lczonICUgdGl0bGUKKyAgICBwcmludCBocgorICAgIHBEaWdpdHMgPSBpbnQobWF0aC5jZWlsKG1hdGgubG9nKG1heFZhbHVlLCAxMCkpKQorICAgIHBmRGlnaXRzID0gbWF4KDAsIDMtcERpZ2l0cykKKyAgICBpZiBwZkRpZ2l0czoKKyAgICAgICAgcERpZ2l0cyArPSBwZkRpZ2l0cyArIDEKKyAgICBjRGlnaXRzID0gaW50KG1hdGguY2VpbChtYXRoLmxvZyhsZW4oaXRlbXMpLCAxMCkpKQorICAgIHByaW50ICJbJXNdIDo6IFslc10gOjogWyVzXSIgJSAoJ1JhbmdlJy5jZW50ZXIoKHBEaWdpdHMrMSkqMiArIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BlcmNlbnRhZ2UnLmNlbnRlcihiYXJXKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VudCcuY2VudGVyKGNEaWdpdHMqMiArIDEpKQorICAgIHByaW50IGhyCisgICAgZm9yIGkscm93IGluIGVudW1lcmF0ZShoaXN0byk6CisgICAgICAgIHBjdCA9IGZsb2F0KGxlbihyb3cpKSAvIGxlbihpdGVtcykKKyAgICAgICAgdyA9IGludChiYXJXICogcGN0KQorICAgICAgICBwcmludCAiWyUqLipmcywlKi4qZnMpIiAlIChwRGlnaXRzLCBwZkRpZ2l0cywgaSpiYXJILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlnaXRzLCBwZkRpZ2l0cywgKGkrMSkqYmFySCksCisgICAgICAgIHByaW50ICI6OiBbJXMlc10gOjogWyUqZC8lKmRdIiAlICgnKicqdywgJyAnKihiYXJXLXcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY0RpZ2l0cywgbGVuKHJvdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjRGlnaXRzLCBsZW4oaXRlbXMpKQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvbGl0LnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTEwNjNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC5weQpAQCAtMCwwICsxLDUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKKyAgICBpbXBvcnQgbGl0CisgICAgbGl0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvQ2xhbmcvbGl0LmNmZyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0NsYW5nL2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxZTgwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0NsYW5nL2xpdC5jZmcKQEAgLTAsMCArMSw0NyBAQAorIyAtKi0gUHl0aG9uIC0qLQorCisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlICdsaXQnIHRlc3QgcnVubmVyLgorCisjIG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZS4KK2NvbmZpZy5uYW1lID0gJ0NsYW5nJworCisjIHRlc3RGb3JtYXQ6IFRoZSB0ZXN0IGZvcm1hdCB0byB1c2UgdG8gaW50ZXJwcmV0IHRlc3RzLgorIworIyBGb3Igbm93IHdlIHJlcXVpcmUgJyYmJyBiZXR3ZWVuIGNvbW1hbmRzLCB1bnRpbCB0aGV5IGdldCBnbG9iYWxseSBraWxsZWQgYW5kCisjIHRoZSB0ZXN0IHJ1bm5lciB1cGRhdGVkLgorY29uZmlnLnRlc3RfZm9ybWF0ID0gbGl0LmZvcm1hdHMuU2hUZXN0KGV4ZWN1dGVfZXh0ZXJuYWwgPSBUcnVlKQorCisjIHN1ZmZpeGVzOiBBIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRvIHRyZWF0IGFzIHRlc3QgZmlsZXMuCitjb25maWcuc3VmZml4ZXMgPSBbJy5jJywgJy5jcHAnLCAnLm0nLCAnLm1tJ10KKworIyB0YXJnZXRfdHJpcGxlOiBVc2VkIGJ5IFNoVGVzdCBhbmQgVGNsVGVzdCBmb3JtYXRzIGZvciBYRkFJTCBjaGVja3MuCitjb25maWcudGFyZ2V0X3RyaXBsZSA9ICdmb28nCisKKyMjIworCisjIERpc2NvdmVyIHRoZSAnY2xhbmcnIGFuZCAnY2xhbmdjYycgdG8gdXNlLgorCitpbXBvcnQgb3MKKworZGVmIGluZmVyQ2xhbmcoUEFUSCk6CisgICAgIyBEZXRlcm1pbmUgd2hpY2ggY2xhbmcgdG8gdXNlLgorICAgIGNsYW5nID0gb3MuZ2V0ZW52KCdDTEFORycpCisKKyAgICAjIElmIHRoZSB1c2VyIHNldCBjbGFuZyBpbiB0aGUgZW52aXJvbm1lbnQsIGRlZmluaXRlbHkgdXNlIHRoYXQgYW5kIGRvbid0CisgICAgIyB0cnkgdG8gdmFsaWRhdGUuCisgICAgaWYgY2xhbmc6CisgICAgICAgIHJldHVybiBjbGFuZworCisgICAgIyBPdGhlcndpc2UgbG9vayBpbiB0aGUgcGF0aC4KKyAgICBjbGFuZyA9IGxpdC51dGlsLndoaWNoKCdjbGFuZycsIFBBVEgpCisKKyAgICBpZiBub3QgY2xhbmc6CisgICAgICAgIGxpdC5mYXRhbCgiY291bGRuJ3QgZmluZCAnY2xhbmcnIHByb2dyYW0sIHRyeSBzZXR0aW5nICIKKyAgICAgICAgICAgICAgICAgICJDTEFORyBpbiB5b3VyIGVudmlyb25tZW50IikKKworICAgIHJldHVybiBjbGFuZworCitjbGFuZyA9IGluZmVyQ2xhbmcoY29uZmlnLmVudmlyb25tZW50WydQQVRIJ10pCitpZiBub3QgbGl0LnF1aWV0OgorICAgIGxpdC5ub3RlKCd1c2luZyBjbGFuZzogJXInICUgY2xhbmcpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoICgnIGNsYW5nICcsICcgJyArIGNsYW5nICsgJyAnKSApCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9MTFZNLkluVHJlZS90ZXN0L0Jhci9kZy5leHAgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9MTFZNLkluVHJlZS90ZXN0L0Jhci9kZy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkYTA3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0xMVk0uSW5UcmVlL3Rlc3QvQmFyL2RnLmV4cApAQCAtMCwwICsxLDYgQEAKK2xvYWRfbGliIGxsdm0uZXhwCisKK2lmIHsgW2xsdm1fc3VwcG9ydHNfdGFyZ2V0IFg4Nl0gfSB7CisgIFJ1bkxMVk1UZXN0cyBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyLyoue2xsfV1dCit9CisKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0xMVk0uSW5UcmVlL3Rlc3QvbGl0LmNmZyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0xMVk0uSW5UcmVlL3Rlc3QvbGl0LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2VmMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvTExWTS5JblRyZWUvdGVzdC9saXQuY2ZnCkBAIC0wLDAgKzEsMTUxIEBACisjIC0qLSBQeXRob24gLSotCisKKyMgQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgJ2xpdCcgdGVzdCBydW5uZXIuCisKK2ltcG9ydCBvcworCisjIG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZS4KK2NvbmZpZy5uYW1lID0gJ0xMVk0nCisKKyMgdGVzdEZvcm1hdDogVGhlIHRlc3QgZm9ybWF0IHRvIHVzZSB0byBpbnRlcnByZXQgdGVzdHMuCitjb25maWcudGVzdF9mb3JtYXQgPSBsaXQuZm9ybWF0cy5UY2xUZXN0KCkKKworIyBzdWZmaXhlczogQSBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byB0cmVhdCBhcyB0ZXN0IGZpbGVzLCB0aGlzIGlzIGFjdHVhbGx5CisjIHNldCBieSBvbl9jbG9uZSgpLgorY29uZmlnLnN1ZmZpeGVzID0gW10KKworIyB0ZXN0X3NvdXJjZV9yb290OiBUaGUgcm9vdCBwYXRoIHdoZXJlIHRlc3RzIGFyZSBsb2NhdGVkLgorY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisKKyMgdGVzdF9leGVjX3Jvb3Q6IFRoZSByb290IHBhdGggd2hlcmUgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KK2xsdm1fb2JqX3Jvb3QgPSBnZXRhdHRyKGNvbmZpZywgJ2xsdm1fb2JqX3Jvb3QnLCBOb25lKQoraWYgbGx2bV9vYmpfcm9vdCBpcyBub3QgTm9uZToKKyAgICBjb25maWcudGVzdF9leGVjX3Jvb3QgPSBvcy5wYXRoLmpvaW4obGx2bV9vYmpfcm9vdCwgJ3Rlc3QnKQorCisjIyMKKworaW1wb3J0IG9zCisKKyMgQ2hlY2sgdGhhdCB0aGUgb2JqZWN0IHJvb3QgaXMga25vd24uCitpZiBjb25maWcudGVzdF9leGVjX3Jvb3QgaXMgTm9uZToKKyAgICAjIE90aGVyd2lzZSwgd2UgaGF2ZW4ndCBsb2FkZWQgdGhlIHNpdGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAodGhlIHVzZXIgaXMKKyAgICAjIHByb2JhYmx5IHRyeWluZyB0byBydW4gb24gYSB0ZXN0IGZpbGUgZGlyZWN0bHksIGFuZCBlaXRoZXIgdGhlIHNpdGUKKyAgICAjIGNvbmZpZ3VyYXRpb24gaGFzbid0IGJlZW4gY3JlYXRlZCBieSB0aGUgYnVpbGQgc3lzdGVtLCBvciB3ZSBhcmUgaW4gYW4KKyAgICAjIG91dC1vZi10cmVlIGJ1aWxkIHNpdHVhdGlvbikuCisKKyAgICAjIFRyeSB0byBkZXRlY3QgdGhlIHNpdHVhdGlvbiB3aGVyZSB3ZSBhcmUgdXNpbmcgYW4gb3V0LW9mLXRyZWUgYnVpbGQgYnkKKyAgICAjIGxvb2tpbmcgZm9yICdsbHZtLWNvbmZpZycuCisgICAgIworICAgICMgRklYTUU6IEkgZGViYXRlZCAoaS5lLiwgd3JvdGUgYW5kIHRocmV3IGF3YXkpIGFkZGluZyBsb2dpYyB0bworICAgICMgYXV0b21hZ2ljYWxseSBnZW5lcmF0ZSB0aGUgbGl0LnNpdGUuY2ZnIGlmIHdlIGFyZSBpbiBzb21lIGtpbmQgb2YgZnJlc2gKKyAgICAjIGJ1aWxkIHNpdHVhdGlvbi4gVGhpcyBtZWFucyBrbm93aW5nIGhvdyB0byBpbnZva2UgdGhlIGJ1aWxkIHN5c3RlbQorICAgICMgdGhvdWdoLCBhbmQgSSBkZWNpZGVkIGl0IHdhcyB0b28gbXVjaCBtYWdpYy4KKworICAgIGxsdm1fY29uZmlnID0gbGl0LnV0aWwud2hpY2goJ2xsdm0tY29uZmlnJywgY29uZmlnLmVudmlyb25tZW50WydQQVRIJ10pCisgICAgaWYgbm90IGxsdm1fY29uZmlnOgorICAgICAgICBsaXQuZmF0YWwoJ05vIHNpdGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBhdmFpbGFibGUhJykKKworICAgICMgR2V0IHRoZSBzb3VyY2UgYW5kIG9iamVjdCByb290cy4KKyAgICBsbHZtX3NyY19yb290ID0gbGl0LnV0aWwuY2FwdHVyZShbJ2xsdm0tY29uZmlnJywgJy0tc3JjLXJvb3QnXSkuc3RyaXAoKQorICAgIGxsdm1fb2JqX3Jvb3QgPSBsaXQudXRpbC5jYXB0dXJlKFsnbGx2bS1jb25maWcnLCAnLS1vYmotcm9vdCddKS5zdHJpcCgpCisKKyAgICAjIFZhbGlkYXRlIHRoYXQgd2UgZ290IGEgdHJlZSB3aGljaCBwb2ludHMgdG8gaGVyZS4KKyAgICB0aGlzX3NyY19yb290ID0gb3MucGF0aC5kaXJuYW1lKGNvbmZpZy50ZXN0X3NvdXJjZV9yb290KQorICAgIGlmIG9zLnBhdGgucmVhbHBhdGgobGx2bV9zcmNfcm9vdCkgIT0gb3MucGF0aC5yZWFscGF0aCh0aGlzX3NyY19yb290KToKKyAgICAgICAgbGl0LmZhdGFsKCdObyBzaXRlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlIScpCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIHNpdGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBleGlzdHMuCisgICAgc2l0ZV9jZmcgPSBvcy5wYXRoLmpvaW4obGx2bV9vYmpfcm9vdCwgJ3Rlc3QnLCAnbGl0LnNpdGUuY2ZnJykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2l0ZV9jZmcpOgorICAgICAgICBsaXQuZmF0YWwoJ05vIHNpdGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBhdmFpbGFibGUhJykKKworICAgICMgT2theSwgdGhhdCB3b3JrZWQuIE5vdGlmeSB0aGUgdXNlciBvZiB0aGUgYXV0b21hZ2ljLCBhbmQgcmVjb25maWd1cmUuCisgICAgbGl0Lm5vdGUoJ3VzaW5nIG91dC1vZi10cmVlIGJ1aWxkIGF0ICVyJyAlIGxsdm1fb2JqX3Jvb3QpCisgICAgbGl0LmxvYWRfY29uZmlnKGNvbmZpZywgc2l0ZV9jZmcpCisgICAgcmFpc2UgU3lzdGVtRXhpdAorCisjIyMKKworIyBMb2FkIHNpdGUgZGF0YSBmcm9tIERlamFHTlUncyBzaXRlLmV4cC4KK2ltcG9ydCByZQorc2l0ZV9leHAgPSB7fQorIyBGSVhNRTogSW1wbGVtZW50IGxpdC5zaXRlLmNmZy4KK2ZvciBsaW5lIGluIG9wZW4ob3MucGF0aC5qb2luKGNvbmZpZy5sbHZtX29ial9yb290LCAndGVzdCcsICdzaXRlLmV4cCcpKToKKyAgICBtID0gcmUubWF0Y2goJ3NldCAoW14gXSspICIoW14iXSopIicsIGxpbmUpCisgICAgaWYgbToKKyAgICAgICAgc2l0ZV9leHBbbS5ncm91cCgxKV0gPSBtLmdyb3VwKDIpCisKKyMgQWRkIHN1YnN0aXR1dGlvbnMuCitmb3Igc3ViIGluIFsncHJjb250ZXh0JywgJ2xsdm1nY2MnLCAnbGx2bWd4eCcsICdjb21waWxlX2N4eCcsICdjb21waWxlX2MnLAorICAgICAgICAgICAgJ2xpbmsnLCAnc2hsaWJleHQnLCAnb2NhbWxvcHQnLCAnbGx2bWRzeW11dGlsJywgJ2xsdm1saWJzZGlyJywKKyAgICAgICAgICAgICdidWdwb2ludF90b3B0cyddOgorICAgIGlmIHN1YiBpbiAoJ2xsdm1nY2MnLCAnbGx2bWd4eCcpOgorICAgICAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCclJyArIHN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlX2V4cFtzdWJdICsgJyAtZW1pdC1sbHZtIC13JykpCisgICAgZWxzZToKKyAgICAgICAgY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgnJScgKyBzdWIsIHNpdGVfZXhwW3N1Yl0pKQorCitleGNsdWRlcyA9IFtdCisKKyMgUHJvdmlkZSB0YXJnZXRfdHJpcGxlIGZvciB1c2UgaW4gWEZBSUwgYW5kIFhUQVJHRVQuCitjb25maWcudGFyZ2V0X3RyaXBsZSA9IHNpdGVfZXhwWyd0YXJnZXRfdHJpcGxldCddCisKKyMgUHJvdmlkZSBsbHZtX3N1cHBvcnRzX3RhcmdldCBmb3IgdXNlIGluIGxvY2FsIGNvbmZpZ3MuCit0YXJnZXRzID0gc2V0KHNpdGVfZXhwWyJUQVJHRVRTX1RPX0JVSUxEIl0uc3BsaXQoKSkKK2RlZiBsbHZtX3N1cHBvcnRzX3RhcmdldChuYW1lKToKKyAgICByZXR1cm4gbmFtZSBpbiB0YXJnZXRzCisKK2xhbmdzID0gc2V0KHNpdGVfZXhwWydsbHZtZ2NjX2xhbmdzJ10uc3BsaXQoJywnKSkKK2RlZiBsbHZtX2djY19zdXBwb3J0cyhuYW1lKToKKyAgICByZXR1cm4gbmFtZSBpbiBsYW5ncworCisjIFByb3ZpZGUgb25fY2xvbmUgaG9vayBmb3IgcmVhZGluZyAnZGcuZXhwJy4KK2ltcG9ydCBvcworc2ltcGxlTGliRGF0YSA9IHJlLmNvbXBpbGUociIiImxvYWRfbGliIGxsdm0uZXhwCisKK1J1bkxMVk1UZXN0cyBcW2xzb3J0IFxbZ2xvYiAtbm9jb21wbGFpbiBcJHNyY2Rpci9cJHN1YmRpci9cKlwuKC4qKVxdXF0iIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5NVUxUSUxJTkUpCitjb25kaXRpb25hbExpYkRhdGEgPSByZS5jb21waWxlKHIiIiJsb2FkX2xpYiBsbHZtLmV4cAorCitpZi4qXFsgPyhsbHZtW14gXSopIChbXiBdKikgP1xdLip7CisgKlJ1bkxMVk1UZXN0cyBcW2xzb3J0IFxbZ2xvYiAtbm9jb21wbGFpbiBcJHNyY2Rpci9cJHN1YmRpci9cKlwuKC4qKVxdXF0KK1x9IiIiLCByZS5NVUxUSUxJTkUpCitkZWYgb25fY2xvbmUocGFyZW50LCBjZmcsIGZvcl9wYXRoKToKKyAgICBkZWYgYWRkU3VmZml4ZXMobWF0Y2gpOgorICAgICAgICBpZiBtYXRjaFswXSA9PSAneycgYW5kIG1hdGNoWy0xXSA9PSAnfSc6CisgICAgICAgICAgICBjZmcuc3VmZml4ZXMgPSBbJy4nICsgcyBmb3IgcyBpbiBtYXRjaFsxOi0xXS5zcGxpdCgnLCcpXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2ZnLnN1ZmZpeGVzID0gWycuJyArIG1hdGNoXQorCisgICAgbGliUGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZm9yX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RnLmV4cCcpCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGxpYlBhdGgpOgorICAgICAgICBjZmcudW5zdXBwb3J0ZWQgPSBUcnVlCisgICAgICAgIHJldHVybgorCisgICAgIyBSZXNldCB1bnN1cHBvcnRlZCwgaW4gY2FzZSB3ZSBpbmhlcml0ZWQgaXQuCisgICAgY2ZnLnVuc3VwcG9ydGVkID0gRmFsc2UKKyAgICBsaWIgPSBvcGVuKGxpYlBhdGgpLnJlYWQoKS5zdHJpcCgpCisKKyAgICAjIENoZWNrIGZvciBhIHNpbXBsZSBsaWJyYXJ5LgorICAgIG0gPSBzaW1wbGVMaWJEYXRhLm1hdGNoKGxpYikKKyAgICBpZiBtOgorICAgICAgICBhZGRTdWZmaXhlcyhtLmdyb3VwKDEpKQorICAgICAgICByZXR1cm4KKworICAgICMgQ2hlY2sgZm9yIGEgY29uZGl0aW9uYWwgdGVzdCBzZXQuCisgICAgbSA9IGNvbmRpdGlvbmFsTGliRGF0YS5tYXRjaChsaWIpCisgICAgaWYgbToKKyAgICAgICAgZnVuY25hbWUsYXJnLG1hdGNoID0gbS5ncm91cHMoKQorICAgICAgICBhZGRTdWZmaXhlcyhtYXRjaCkKKworICAgICAgICBmdW5jID0gZ2xvYmFscygpLmdldChmdW5jbmFtZSkKKyAgICAgICAgaWYgbm90IGZ1bmM6CisgICAgICAgICAgICBsaXQuZXJyb3IoJ3Vuc3VwcG9ydGVkIHByZWRpY2F0ZSAlcicgJSBmdW5jbmFtZSkKKyAgICAgICAgZWxpZiBub3QgZnVuYyhhcmcpOgorICAgICAgICAgICAgY2ZnLnVuc3VwcG9ydGVkID0gVHJ1ZQorICAgICAgICByZXR1cm4KKyAgICAjIE90aGVyd2lzZSwgZ2l2ZSB1cC4KKyAgICBsaXQuZXJyb3IoJ3VuYWJsZSB0byB1bmRlcnN0YW5kICVyOlxuJXMnICUgKGxpYlBhdGgsIGxpYikpCisKK2NvbmZpZy5vbl9jbG9uZSA9IG9uX2Nsb25lCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9MTFZNLkluVHJlZS90ZXN0L2xpdC5zaXRlLmNmZyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0xMVk0uSW5UcmVlL3Rlc3QvbGl0LnNpdGUuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZmVlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9MTFZNLkluVHJlZS90ZXN0L2xpdC5zaXRlLmNmZwpAQCAtMCwwICsxLDEwIEBACisjIC0qLSBQeXRob24gLSotCisKKyMjIEF1dG9nZW5lcmF0ZWQgYnkgTWFrZWZpbGUgIyMKKyMgRG8gbm90IGVkaXQhCisKKyMgUHJlc2VydmUgc29tZSBrZXkgcGF0aHMgZm9yIHVzZSBieSBtYWluIExMVk0gdGVzdCBzdWl0ZSBjb25maWcuCitjb25maWcubGx2bV9vYmpfcm9vdCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorCisjIExldCB0aGUgbWFpbiBjb25maWcgZG8gdGhlIHJlYWwgd29yay4KK2xpdC5sb2FkX2NvbmZpZyhjb25maWcsIG9zLnBhdGguam9pbihjb25maWcubGx2bV9vYmpfcm9vdCwgJ3Rlc3QvbGl0LmNmZycpKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvTExWTS5JblRyZWUvdGVzdC9zaXRlLmV4cCBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0xMVk0uSW5UcmVlL3Rlc3Qvc2l0ZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhODM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0xMVk0uSW5UcmVlL3Rlc3Qvc2l0ZS5leHAKQEAgLTAsMCArMSwyOCBAQAorIyMgdGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBtYWtlICMjCisjIERvIG5vdCBlZGl0IGhlcmUuICBJZiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGVzZSB2YWx1ZXMKKyMgZWRpdCB0aGUgbGFzdCBzZWN0aW9uCitzZXQgdGFyZ2V0X3RyaXBsZXQgIng4Nl82NC1hcHBsZS1kYXJ3aW4xMCIKK3NldCBUQVJHRVRTX1RPX0JVSUxEICJYODYgU3BhcmMgUG93ZXJQQyBBbHBoYSBBUk0gTWlwcyBDZWxsU1BVIFBJQzE2IFhDb3JlIE1TUDQzMCBTeXN0ZW1aIEJsYWNrZmluIENCYWNrZW5kIE1TSUwgQ3BwQmFja2VuZCIKK3NldCBsbHZtZ2NjX2xhbmdzICJjLGMrKyxvYmpjLG9iai1jKysiCitzZXQgcHJjb250ZXh0ICIvdXNyL2Jpbi90Y2xzaDguNCAvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS90ZXN0L1NjcmlwdHMvcHJjb250ZXh0LnRjbCIKK3NldCBsbHZtdG9vbHNkaXIgIi9Vc2Vycy9kZHVuYmFyL2xsdm0ub2JqLjY0L0RlYnVnL2JpbiIKK3NldCBsbHZtbGlic2RpciAiL1VzZXJzL2RkdW5iYXIvbGx2bS5vYmouNjQvRGVidWcvbGliIgorc2V0IHNyY3Jvb3QgIi9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtIgorc2V0IG9ianJvb3QgIi9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtLm9iai42NCIKK3NldCBzcmNkaXIgIi9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtL3Rlc3QiCitzZXQgb2JqZGlyICIvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS5vYmouNjQvdGVzdCIKK3NldCBnY2NwYXRoICIvdXNyL2Jpbi9nY2MgLWFyY2ggeDg2XzY0Igorc2V0IGd4eHBhdGggIi91c3IvYmluL2crKyAtYXJjaCB4ODZfNjQiCitzZXQgY29tcGlsZV9jICIgL3Vzci9iaW4vZ2NjIC1hcmNoIHg4Nl82NCAtSS9Vc2Vycy9kZHVuYmFyL2xsdm0ub2JqLjY0L2luY2x1ZGUgLUkvVXNlcnMvZGR1bmJhci9sbHZtLm9iai42NC90ZXN0IC1JL1ZvbHVtZXMvRGF0YS9kZHVuYmFyL2xsdm0ub2JqLjY0L2luY2x1ZGUgLUkvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS9pbmNsdWRlIC1JL1ZvbHVtZXMvRGF0YS9kZHVuYmFyL2xsdm0vdGVzdCAtRF9ERUJVRyAtRF9HTlVfU09VUkNFIC1EX19TVERDX0xJTUlUX01BQ1JPUyAtRF9fU1REQ19DT05TVEFOVF9NQUNST1MgLW02NCAtcGVkYW50aWMgLVduby1sb25nLWxvbmcgLVdhbGwgLVcgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xd3JpdGUtc3RyaW5ncyAtYyAiCitzZXQgY29tcGlsZV9jeHggIiAvdXNyL2Jpbi9nKysgLWFyY2ggeDg2XzY0IC1JL1VzZXJzL2RkdW5iYXIvbGx2bS5vYmouNjQvaW5jbHVkZSAtSS9Vc2Vycy9kZHVuYmFyL2xsdm0ub2JqLjY0L3Rlc3QgLUkvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS5vYmouNjQvaW5jbHVkZSAtSS9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtL2luY2x1ZGUgLUkvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS90ZXN0IC1EX0RFQlVHIC1EX0dOVV9TT1VSQ0UgLURfX1NURENfTElNSVRfTUFDUk9TIC1EX19TVERDX0NPTlNUQU5UX01BQ1JPUyAtZyAtZm5vLWV4Y2VwdGlvbnMgLWZuby1jb21tb24gLVdvdmVybG9hZGVkLXZpcnR1YWwgLW02NCAtcGVkYW50aWMgLVduby1sb25nLWxvbmcgLVdhbGwgLVcgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xd3JpdGUtc3RyaW5ncyAtYyAiCitzZXQgbGluayAiIC91c3IvYmluL2crKyAtYXJjaCB4ODZfNjQgLUkvVXNlcnMvZGR1bmJhci9sbHZtLm9iai42NC9pbmNsdWRlIC1JL1VzZXJzL2RkdW5iYXIvbGx2bS5vYmouNjQvdGVzdCAtSS9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtLm9iai42NC9pbmNsdWRlIC1JL1ZvbHVtZXMvRGF0YS9kZHVuYmFyL2xsdm0vaW5jbHVkZSAtSS9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtL3Rlc3QgLURfREVCVUcgLURfR05VX1NPVVJDRSAtRF9fU1REQ19MSU1JVF9NQUNST1MgLURfX1NURENfQ09OU1RBTlRfTUFDUk9TIC1nIC1mbm8tZXhjZXB0aW9ucyAtZm5vLWNvbW1vbiAtV292ZXJsb2FkZWQtdmlydHVhbCAtbTY0IC1wZWRhbnRpYyAtV25vLWxvbmctbG9uZyAtV2FsbCAtVyAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVd3cml0ZS1zdHJpbmdzIC1nIC1ML1VzZXJzL2RkdW5iYXIvbGx2bS5vYmouNjQvRGVidWcvbGliIC1ML1ZvbHVtZXMvRGF0YS9kZHVuYmFyL2xsdm0ub2JqLjY0L0RlYnVnL2xpYiAiCitzZXQgbGx2bWdjYyAiL1VzZXJzL2RkdW5iYXIvbGx2bS1nY2MvaW5zdGFsbC9iaW4vbGx2bS1nY2MgLW02NCAiCitzZXQgbGx2bWd4eCAiL1VzZXJzL2RkdW5iYXIvbGx2bS1nY2MvaW5zdGFsbC9iaW4vbGx2bS1nY2MgLW02NCAiCitzZXQgYnVncG9pbnRfdG9wdHMgIi1nY2MtdG9vbC1hcmdzIC1tNjQiCitzZXQgc2hsaWJleHQgIi5keWxpYiIKK3NldCBvY2FtbG9wdCAiL3N3L2Jpbi9vY2FtbG9wdCAtY2MgXCJnKysgLVdhbGwgLURfRklMRV9PRkZTRVRfQklUUz02NCAtRF9SRUVOVFJBTlRcIiAtSSAvVXNlcnMvZGR1bmJhci9sbHZtLm9iai42NC9EZWJ1Zy9saWIvb2NhbWwiCitzZXQgdmFsZ3JpbmQgIiIKK3NldCBncmVwICIvdXNyL2Jpbi9ncmVwIgorc2V0IGdhcyAiL3Vzci9iaW4vYXMiCitzZXQgbGx2bWRzeW11dGlsICJkc3ltdXRpbCIKKyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjIApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvTExWTS5PdXRPZlRyZWUvb2JqL3Rlc3Qvc2l0ZS5leHAgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9MTFZNLk91dE9mVHJlZS9vYmovdGVzdC9zaXRlLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmE4MzllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvTExWTS5PdXRPZlRyZWUvb2JqL3Rlc3Qvc2l0ZS5leHAKQEAgLTAsMCArMSwyOCBAQAorIyMgdGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBtYWtlICMjCisjIERvIG5vdCBlZGl0IGhlcmUuICBJZiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGVzZSB2YWx1ZXMKKyMgZWRpdCB0aGUgbGFzdCBzZWN0aW9uCitzZXQgdGFyZ2V0X3RyaXBsZXQgIng4Nl82NC1hcHBsZS1kYXJ3aW4xMCIKK3NldCBUQVJHRVRTX1RPX0JVSUxEICJYODYgU3BhcmMgUG93ZXJQQyBBbHBoYSBBUk0gTWlwcyBDZWxsU1BVIFBJQzE2IFhDb3JlIE1TUDQzMCBTeXN0ZW1aIEJsYWNrZmluIENCYWNrZW5kIE1TSUwgQ3BwQmFja2VuZCIKK3NldCBsbHZtZ2NjX2xhbmdzICJjLGMrKyxvYmpjLG9iai1jKysiCitzZXQgcHJjb250ZXh0ICIvdXNyL2Jpbi90Y2xzaDguNCAvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS90ZXN0L1NjcmlwdHMvcHJjb250ZXh0LnRjbCIKK3NldCBsbHZtdG9vbHNkaXIgIi9Vc2Vycy9kZHVuYmFyL2xsdm0ub2JqLjY0L0RlYnVnL2JpbiIKK3NldCBsbHZtbGlic2RpciAiL1VzZXJzL2RkdW5iYXIvbGx2bS5vYmouNjQvRGVidWcvbGliIgorc2V0IHNyY3Jvb3QgIi9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtIgorc2V0IG9ianJvb3QgIi9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtLm9iai42NCIKK3NldCBzcmNkaXIgIi9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtL3Rlc3QiCitzZXQgb2JqZGlyICIvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS5vYmouNjQvdGVzdCIKK3NldCBnY2NwYXRoICIvdXNyL2Jpbi9nY2MgLWFyY2ggeDg2XzY0Igorc2V0IGd4eHBhdGggIi91c3IvYmluL2crKyAtYXJjaCB4ODZfNjQiCitzZXQgY29tcGlsZV9jICIgL3Vzci9iaW4vZ2NjIC1hcmNoIHg4Nl82NCAtSS9Vc2Vycy9kZHVuYmFyL2xsdm0ub2JqLjY0L2luY2x1ZGUgLUkvVXNlcnMvZGR1bmJhci9sbHZtLm9iai42NC90ZXN0IC1JL1ZvbHVtZXMvRGF0YS9kZHVuYmFyL2xsdm0ub2JqLjY0L2luY2x1ZGUgLUkvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS9pbmNsdWRlIC1JL1ZvbHVtZXMvRGF0YS9kZHVuYmFyL2xsdm0vdGVzdCAtRF9ERUJVRyAtRF9HTlVfU09VUkNFIC1EX19TVERDX0xJTUlUX01BQ1JPUyAtRF9fU1REQ19DT05TVEFOVF9NQUNST1MgLW02NCAtcGVkYW50aWMgLVduby1sb25nLWxvbmcgLVdhbGwgLVcgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xd3JpdGUtc3RyaW5ncyAtYyAiCitzZXQgY29tcGlsZV9jeHggIiAvdXNyL2Jpbi9nKysgLWFyY2ggeDg2XzY0IC1JL1VzZXJzL2RkdW5iYXIvbGx2bS5vYmouNjQvaW5jbHVkZSAtSS9Vc2Vycy9kZHVuYmFyL2xsdm0ub2JqLjY0L3Rlc3QgLUkvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS5vYmouNjQvaW5jbHVkZSAtSS9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtL2luY2x1ZGUgLUkvVm9sdW1lcy9EYXRhL2RkdW5iYXIvbGx2bS90ZXN0IC1EX0RFQlVHIC1EX0dOVV9TT1VSQ0UgLURfX1NURENfTElNSVRfTUFDUk9TIC1EX19TVERDX0NPTlNUQU5UX01BQ1JPUyAtZyAtZm5vLWV4Y2VwdGlvbnMgLWZuby1jb21tb24gLVdvdmVybG9hZGVkLXZpcnR1YWwgLW02NCAtcGVkYW50aWMgLVduby1sb25nLWxvbmcgLVdhbGwgLVcgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xd3JpdGUtc3RyaW5ncyAtYyAiCitzZXQgbGluayAiIC91c3IvYmluL2crKyAtYXJjaCB4ODZfNjQgLUkvVXNlcnMvZGR1bmJhci9sbHZtLm9iai42NC9pbmNsdWRlIC1JL1VzZXJzL2RkdW5iYXIvbGx2bS5vYmouNjQvdGVzdCAtSS9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtLm9iai42NC9pbmNsdWRlIC1JL1ZvbHVtZXMvRGF0YS9kZHVuYmFyL2xsdm0vaW5jbHVkZSAtSS9Wb2x1bWVzL0RhdGEvZGR1bmJhci9sbHZtL3Rlc3QgLURfREVCVUcgLURfR05VX1NPVVJDRSAtRF9fU1REQ19MSU1JVF9NQUNST1MgLURfX1NURENfQ09OU1RBTlRfTUFDUk9TIC1nIC1mbm8tZXhjZXB0aW9ucyAtZm5vLWNvbW1vbiAtV292ZXJsb2FkZWQtdmlydHVhbCAtbTY0IC1wZWRhbnRpYyAtV25vLWxvbmctbG9uZyAtV2FsbCAtVyAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVd3cml0ZS1zdHJpbmdzIC1nIC1ML1VzZXJzL2RkdW5iYXIvbGx2bS5vYmouNjQvRGVidWcvbGliIC1ML1ZvbHVtZXMvRGF0YS9kZHVuYmFyL2xsdm0ub2JqLjY0L0RlYnVnL2xpYiAiCitzZXQgbGx2bWdjYyAiL1VzZXJzL2RkdW5iYXIvbGx2bS1nY2MvaW5zdGFsbC9iaW4vbGx2bS1nY2MgLW02NCAiCitzZXQgbGx2bWd4eCAiL1VzZXJzL2RkdW5iYXIvbGx2bS1nY2MvaW5zdGFsbC9iaW4vbGx2bS1nY2MgLW02NCAiCitzZXQgYnVncG9pbnRfdG9wdHMgIi1nY2MtdG9vbC1hcmdzIC1tNjQiCitzZXQgc2hsaWJleHQgIi5keWxpYiIKK3NldCBvY2FtbG9wdCAiL3N3L2Jpbi9vY2FtbG9wdCAtY2MgXCJnKysgLVdhbGwgLURfRklMRV9PRkZTRVRfQklUUz02NCAtRF9SRUVOVFJBTlRcIiAtSSAvVXNlcnMvZGR1bmJhci9sbHZtLm9iai42NC9EZWJ1Zy9saWIvb2NhbWwiCitzZXQgdmFsZ3JpbmQgIiIKK3NldCBncmVwICIvdXNyL2Jpbi9ncmVwIgorc2V0IGdhcyAiL3Vzci9iaW4vYXMiCitzZXQgbGx2bWRzeW11dGlsICJkc3ltdXRpbCIKKyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjIApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvTExWTS5PdXRPZlRyZWUvc3JjL3Rlc3QvRm9vL2RhdGEudHh0IGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvTExWTS5PdXRPZlRyZWUvc3JjL3Rlc3QvRm9vL2RhdGEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Yjk4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9MTFZNLk91dE9mVHJlZS9zcmMvdGVzdC9Gb28vZGF0YS50eHQKQEAgLTAsMCArMSBAQAoraGkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0xMVk0uT3V0T2ZUcmVlL3NyYy90ZXN0L0Zvby9kZy5leHAgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9MTFZNLk91dE9mVHJlZS9zcmMvdGVzdC9Gb28vZGcuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZGEwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9MTFZNLk91dE9mVHJlZS9zcmMvdGVzdC9Gb28vZGcuZXhwCkBAIC0wLDAgKzEsNiBAQAorbG9hZF9saWIgbGx2bS5leHAKKworaWYgeyBbbGx2bV9zdXBwb3J0c190YXJnZXQgWDg2XSB9IHsKKyAgUnVuTExWTVRlc3RzIFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi57bGx9XV0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvTExWTS5PdXRPZlRyZWUvc3JjL3Rlc3QvRm9vL3BjdC1TLmxsIGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvTExWTS5PdXRPZlRyZWUvc3JjL3Rlc3QvRm9vL3BjdC1TLmxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZjM2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9MTFZNLk91dE9mVHJlZS9zcmMvdGVzdC9Gb28vcGN0LVMubGwKQEAgLTAsMCArMSBAQAorOyBSVU46IGdyZXAgImhpIiAlUy9kYXRhLnR4dApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvTExWTS5PdXRPZlRyZWUvc3JjL3Rlc3QvbGl0LmNmZyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0xMVk0uT3V0T2ZUcmVlL3NyYy90ZXN0L2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlZjAzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL0xMVk0uT3V0T2ZUcmVlL3NyYy90ZXN0L2xpdC5jZmcKQEAgLTAsMCArMSwxNTEgQEAKKyMgLSotIFB5dGhvbiAtKi0KKworIyBDb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSAnbGl0JyB0ZXN0IHJ1bm5lci4KKworaW1wb3J0IG9zCisKKyMgbmFtZTogVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IHN1aXRlLgorY29uZmlnLm5hbWUgPSAnTExWTScKKworIyB0ZXN0Rm9ybWF0OiBUaGUgdGVzdCBmb3JtYXQgdG8gdXNlIHRvIGludGVycHJldCB0ZXN0cy4KK2NvbmZpZy50ZXN0X2Zvcm1hdCA9IGxpdC5mb3JtYXRzLlRjbFRlc3QoKQorCisjIHN1ZmZpeGVzOiBBIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRvIHRyZWF0IGFzIHRlc3QgZmlsZXMsIHRoaXMgaXMgYWN0dWFsbHkKKyMgc2V0IGJ5IG9uX2Nsb25lKCkuCitjb25maWcuc3VmZml4ZXMgPSBbXQorCisjIHRlc3Rfc291cmNlX3Jvb3Q6IFRoZSByb290IHBhdGggd2hlcmUgdGVzdHMgYXJlIGxvY2F0ZWQuCitjb25maWcudGVzdF9zb3VyY2Vfcm9vdCA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKworIyB0ZXN0X2V4ZWNfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBzaG91bGQgYmUgcnVuLgorbGx2bV9vYmpfcm9vdCA9IGdldGF0dHIoY29uZmlnLCAnbGx2bV9vYmpfcm9vdCcsIE5vbmUpCitpZiBsbHZtX29ial9yb290IGlzIG5vdCBOb25lOgorICAgIGNvbmZpZy50ZXN0X2V4ZWNfcm9vdCA9IG9zLnBhdGguam9pbihsbHZtX29ial9yb290LCAndGVzdCcpCisKKyMjIworCitpbXBvcnQgb3MKKworIyBDaGVjayB0aGF0IHRoZSBvYmplY3Qgcm9vdCBpcyBrbm93bi4KK2lmIGNvbmZpZy50ZXN0X2V4ZWNfcm9vdCBpcyBOb25lOgorICAgICMgT3RoZXJ3aXNlLCB3ZSBoYXZlbid0IGxvYWRlZCB0aGUgc2l0ZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICh0aGUgdXNlciBpcworICAgICMgcHJvYmFibHkgdHJ5aW5nIHRvIHJ1biBvbiBhIHRlc3QgZmlsZSBkaXJlY3RseSwgYW5kIGVpdGhlciB0aGUgc2l0ZQorICAgICMgY29uZmlndXJhdGlvbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0sIG9yIHdlIGFyZSBpbiBhbgorICAgICMgb3V0LW9mLXRyZWUgYnVpbGQgc2l0dWF0aW9uKS4KKworICAgICMgVHJ5IHRvIGRldGVjdCB0aGUgc2l0dWF0aW9uIHdoZXJlIHdlIGFyZSB1c2luZyBhbiBvdXQtb2YtdHJlZSBidWlsZCBieQorICAgICMgbG9va2luZyBmb3IgJ2xsdm0tY29uZmlnJy4KKyAgICAjCisgICAgIyBGSVhNRTogSSBkZWJhdGVkIChpLmUuLCB3cm90ZSBhbmQgdGhyZXcgYXdheSkgYWRkaW5nIGxvZ2ljIHRvCisgICAgIyBhdXRvbWFnaWNhbGx5IGdlbmVyYXRlIHRoZSBsaXQuc2l0ZS5jZmcgaWYgd2UgYXJlIGluIHNvbWUga2luZCBvZiBmcmVzaAorICAgICMgYnVpbGQgc2l0dWF0aW9uLiBUaGlzIG1lYW5zIGtub3dpbmcgaG93IHRvIGludm9rZSB0aGUgYnVpbGQgc3lzdGVtCisgICAgIyB0aG91Z2gsIGFuZCBJIGRlY2lkZWQgaXQgd2FzIHRvbyBtdWNoIG1hZ2ljLgorCisgICAgbGx2bV9jb25maWcgPSBsaXQudXRpbC53aGljaCgnbGx2bS1jb25maWcnLCBjb25maWcuZW52aXJvbm1lbnRbJ1BBVEgnXSkKKyAgICBpZiBub3QgbGx2bV9jb25maWc6CisgICAgICAgIGxpdC5mYXRhbCgnTm8gc2l0ZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGF2YWlsYWJsZSEnKQorCisgICAgIyBHZXQgdGhlIHNvdXJjZSBhbmQgb2JqZWN0IHJvb3RzLgorICAgIGxsdm1fc3JjX3Jvb3QgPSBsaXQudXRpbC5jYXB0dXJlKFsnbGx2bS1jb25maWcnLCAnLS1zcmMtcm9vdCddKS5zdHJpcCgpCisgICAgbGx2bV9vYmpfcm9vdCA9IGxpdC51dGlsLmNhcHR1cmUoWydsbHZtLWNvbmZpZycsICctLW9iai1yb290J10pLnN0cmlwKCkKKworICAgICMgVmFsaWRhdGUgdGhhdCB3ZSBnb3QgYSB0cmVlIHdoaWNoIHBvaW50cyB0byBoZXJlLgorICAgIHRoaXNfc3JjX3Jvb3QgPSBvcy5wYXRoLmRpcm5hbWUoY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QpCisgICAgaWYgb3MucGF0aC5yZWFscGF0aChsbHZtX3NyY19yb290KSAhPSBvcy5wYXRoLnJlYWxwYXRoKHRoaXNfc3JjX3Jvb3QpOgorICAgICAgICBsaXQuZmF0YWwoJ05vIHNpdGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBhdmFpbGFibGUhJykKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgc2l0ZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGV4aXN0cy4KKyAgICBzaXRlX2NmZyA9IG9zLnBhdGguam9pbihsbHZtX29ial9yb290LCAndGVzdCcsICdsaXQuc2l0ZS5jZmcnKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzaXRlX2NmZyk6CisgICAgICAgIGxpdC5mYXRhbCgnTm8gc2l0ZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGF2YWlsYWJsZSEnKQorCisgICAgIyBPa2F5LCB0aGF0IHdvcmtlZC4gTm90aWZ5IHRoZSB1c2VyIG9mIHRoZSBhdXRvbWFnaWMsIGFuZCByZWNvbmZpZ3VyZS4KKyAgICBsaXQubm90ZSgndXNpbmcgb3V0LW9mLXRyZWUgYnVpbGQgYXQgJXInICUgbGx2bV9vYmpfcm9vdCkKKyAgICBsaXQubG9hZF9jb25maWcoY29uZmlnLCBzaXRlX2NmZykKKyAgICByYWlzZSBTeXN0ZW1FeGl0CisKKyMjIworCisjIExvYWQgc2l0ZSBkYXRhIGZyb20gRGVqYUdOVSdzIHNpdGUuZXhwLgoraW1wb3J0IHJlCitzaXRlX2V4cCA9IHt9CisjIEZJWE1FOiBJbXBsZW1lbnQgbGl0LnNpdGUuY2ZnLgorZm9yIGxpbmUgaW4gb3Blbihvcy5wYXRoLmpvaW4oY29uZmlnLmxsdm1fb2JqX3Jvb3QsICd0ZXN0JywgJ3NpdGUuZXhwJykpOgorICAgIG0gPSByZS5tYXRjaCgnc2V0IChbXiBdKykgIihbXiJdKikiJywgbGluZSkKKyAgICBpZiBtOgorICAgICAgICBzaXRlX2V4cFttLmdyb3VwKDEpXSA9IG0uZ3JvdXAoMikKKworIyBBZGQgc3Vic3RpdHV0aW9ucy4KK2ZvciBzdWIgaW4gWydwcmNvbnRleHQnLCAnbGx2bWdjYycsICdsbHZtZ3h4JywgJ2NvbXBpbGVfY3h4JywgJ2NvbXBpbGVfYycsCisgICAgICAgICAgICAnbGluaycsICdzaGxpYmV4dCcsICdvY2FtbG9wdCcsICdsbHZtZHN5bXV0aWwnLCAnbGx2bWxpYnNkaXInLAorICAgICAgICAgICAgJ2J1Z3BvaW50X3RvcHRzJ106CisgICAgaWYgc3ViIGluICgnbGx2bWdjYycsICdsbHZtZ3h4Jyk6CisgICAgICAgIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoJyUnICsgc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVfZXhwW3N1Yl0gKyAnIC1lbWl0LWxsdm0gLXcnKSkKKyAgICBlbHNlOgorICAgICAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCclJyArIHN1Yiwgc2l0ZV9leHBbc3ViXSkpCisKK2V4Y2x1ZGVzID0gW10KKworIyBQcm92aWRlIHRhcmdldF90cmlwbGUgZm9yIHVzZSBpbiBYRkFJTCBhbmQgWFRBUkdFVC4KK2NvbmZpZy50YXJnZXRfdHJpcGxlID0gc2l0ZV9leHBbJ3RhcmdldF90cmlwbGV0J10KKworIyBQcm92aWRlIGxsdm1fc3VwcG9ydHNfdGFyZ2V0IGZvciB1c2UgaW4gbG9jYWwgY29uZmlncy4KK3RhcmdldHMgPSBzZXQoc2l0ZV9leHBbIlRBUkdFVFNfVE9fQlVJTEQiXS5zcGxpdCgpKQorZGVmIGxsdm1fc3VwcG9ydHNfdGFyZ2V0KG5hbWUpOgorICAgIHJldHVybiBuYW1lIGluIHRhcmdldHMKKworbGFuZ3MgPSBzZXQoc2l0ZV9leHBbJ2xsdm1nY2NfbGFuZ3MnXS5zcGxpdCgnLCcpKQorZGVmIGxsdm1fZ2NjX3N1cHBvcnRzKG5hbWUpOgorICAgIHJldHVybiBuYW1lIGluIGxhbmdzCisKKyMgUHJvdmlkZSBvbl9jbG9uZSBob29rIGZvciByZWFkaW5nICdkZy5leHAnLgoraW1wb3J0IG9zCitzaW1wbGVMaWJEYXRhID0gcmUuY29tcGlsZShyIiIibG9hZF9saWIgbGx2bS5leHAKKworUnVuTExWTVRlc3RzIFxbbHNvcnQgXFtnbG9iIC1ub2NvbXBsYWluIFwkc3JjZGlyL1wkc3ViZGlyL1wqXC4oLiopXF1cXSIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLk1VTFRJTElORSkKK2NvbmRpdGlvbmFsTGliRGF0YSA9IHJlLmNvbXBpbGUociIiImxvYWRfbGliIGxsdm0uZXhwCisKK2lmLipcWyA/KGxsdm1bXiBdKikgKFteIF0qKSA/XF0uKnsKKyAqUnVuTExWTVRlc3RzIFxbbHNvcnQgXFtnbG9iIC1ub2NvbXBsYWluIFwkc3JjZGlyL1wkc3ViZGlyL1wqXC4oLiopXF1cXQorXH0iIiIsIHJlLk1VTFRJTElORSkKK2RlZiBvbl9jbG9uZShwYXJlbnQsIGNmZywgZm9yX3BhdGgpOgorICAgIGRlZiBhZGRTdWZmaXhlcyhtYXRjaCk6CisgICAgICAgIGlmIG1hdGNoWzBdID09ICd7JyBhbmQgbWF0Y2hbLTFdID09ICd9JzoKKyAgICAgICAgICAgIGNmZy5zdWZmaXhlcyA9IFsnLicgKyBzIGZvciBzIGluIG1hdGNoWzE6LTFdLnNwbGl0KCcsJyldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjZmcuc3VmZml4ZXMgPSBbJy4nICsgbWF0Y2hdCisKKyAgICBsaWJQYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShmb3JfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGcuZXhwJykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobGliUGF0aCk6CisgICAgICAgIGNmZy51bnN1cHBvcnRlZCA9IFRydWUKKyAgICAgICAgcmV0dXJuCisKKyAgICAjIFJlc2V0IHVuc3VwcG9ydGVkLCBpbiBjYXNlIHdlIGluaGVyaXRlZCBpdC4KKyAgICBjZmcudW5zdXBwb3J0ZWQgPSBGYWxzZQorICAgIGxpYiA9IG9wZW4obGliUGF0aCkucmVhZCgpLnN0cmlwKCkKKworICAgICMgQ2hlY2sgZm9yIGEgc2ltcGxlIGxpYnJhcnkuCisgICAgbSA9IHNpbXBsZUxpYkRhdGEubWF0Y2gobGliKQorICAgIGlmIG06CisgICAgICAgIGFkZFN1ZmZpeGVzKG0uZ3JvdXAoMSkpCisgICAgICAgIHJldHVybgorCisgICAgIyBDaGVjayBmb3IgYSBjb25kaXRpb25hbCB0ZXN0IHNldC4KKyAgICBtID0gY29uZGl0aW9uYWxMaWJEYXRhLm1hdGNoKGxpYikKKyAgICBpZiBtOgorICAgICAgICBmdW5jbmFtZSxhcmcsbWF0Y2ggPSBtLmdyb3VwcygpCisgICAgICAgIGFkZFN1ZmZpeGVzKG1hdGNoKQorCisgICAgICAgIGZ1bmMgPSBnbG9iYWxzKCkuZ2V0KGZ1bmNuYW1lKQorICAgICAgICBpZiBub3QgZnVuYzoKKyAgICAgICAgICAgIGxpdC5lcnJvcigndW5zdXBwb3J0ZWQgcHJlZGljYXRlICVyJyAlIGZ1bmNuYW1lKQorICAgICAgICBlbGlmIG5vdCBmdW5jKGFyZyk6CisgICAgICAgICAgICBjZmcudW5zdXBwb3J0ZWQgPSBUcnVlCisgICAgICAgIHJldHVybgorICAgICMgT3RoZXJ3aXNlLCBnaXZlIHVwLgorICAgIGxpdC5lcnJvcigndW5hYmxlIHRvIHVuZGVyc3RhbmQgJXI6XG4lcycgJSAobGliUGF0aCwgbGliKSkKKworY29uZmlnLm9uX2Nsb25lID0gb25fY2xvbmUKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL1RjbFRlc3Qvc3RkZXJyLXBpcGUubGwgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9UY2xUZXN0L3N0ZGVyci1waXBlLmxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNTVmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0V4YW1wbGVUZXN0cy9UY2xUZXN0L3N0ZGVyci1waXBlLmxsCkBAIC0wLDAgKzEgQEAKKzsgUlVOOiBnY2MgLSMjIyA+IC9kZXYvbnVsbCB8JiBncmVwIHtnY2MgdmVyc2lvbn0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL2ZhaWwuYyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL2ZhaWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGRiNDFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvZmFpbC5jCkBAIC0wLDAgKzEsMiBAQAorLy8gUlVOOiBlY2hvICdJIGFtIHNvbWUgc3Rkb3V0JworLy8gUlVOOiBmYWxzZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvbGl0LmNmZyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlZTM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL2xpdC5jZmcKQEAgLTAsMCArMSwyNiBAQAorIyAtKi0gUHl0aG9uIC0qLQorCisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlICdsaXQnIHRlc3QgcnVubmVyLgorCisjIG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZS4KK2NvbmZpZy5uYW1lID0gJ0V4YW1wbGVzJworCisjIHN1ZmZpeGVzOiBBIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRvIHRyZWF0IGFzIHRlc3QgZmlsZXMuCitjb25maWcuc3VmZml4ZXMgPSBbJy5jJywgJy5jcHAnLCAnLm0nLCAnLm1tJywgJy5sbCddCisKKyMgdGVzdEZvcm1hdDogVGhlIHRlc3QgZm9ybWF0IHRvIHVzZSB0byBpbnRlcnByZXQgdGVzdHMuCitjb25maWcudGVzdF9mb3JtYXQgPSBsaXQuZm9ybWF0cy5TaFRlc3QoKQorCisjIHRlc3Rfc291cmNlX3Jvb3Q6IFRoZSBwYXRoIHdoZXJlIHRlc3RzIGFyZSBsb2NhdGVkIChkZWZhdWx0IGlzIHRoZSB0ZXN0IHN1aXRlCisjIHJvb3QpLgorY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgPSBOb25lCisKKyMgdGVzdF9leGVjX3Jvb3Q6IFRoZSBwYXRoIHdoZXJlIHRlc3RzIGFyZSBsb2NhdGVkIChkZWZhdWx0IGlzIHRoZSB0ZXN0IHN1aXRlCisjIHJvb3QpLgorY29uZmlnLnRlc3RfZXhlY19yb290ID0gTm9uZQorCisjIHRhcmdldF90cmlwbGU6IFVzZWQgYnkgU2hUZXN0IGFuZCBUY2xUZXN0IGZvcm1hdHMgZm9yIFhGQUlMIGNoZWNrcy4KK2NvbmZpZy50YXJnZXRfdHJpcGxlID0gJ2ZvbycKKworIyBhdmFpbGFibGVfZmVhdHVyZXM6IFVzZWQgYnkgU2hUZXN0IGFuZCBUY2xUZXN0IGZvcm1hdHMgZm9yIFJFUVVJUkVTIGNoZWNrcy4KK2NvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMgPSBbJ3NvbWUtZmVhdHVyZS1uYW1lJ10KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL3Bhc3MuYyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL3Bhc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzEwMzFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMvcGFzcy5jCkBAIC0wLDAgKzEgQEAKKy8vIFJVTjogdHJ1ZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMveGZhaWwuYyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL3hmYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2Y2Q5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL3hmYWlsLmMKQEAgLTAsMCArMSwyIEBACisvLyBSVU46IGZhbHNlCisvLyBYRkFJTDogKgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9FeGFtcGxlVGVzdHMveHBhc3MuYyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL3hwYXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4NDk5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvRXhhbXBsZVRlc3RzL3hwYXNzLmMKQEAgLTAsMCArMSwyIEBACisvLyBSVU46IHRydWUKKy8vIFhGQUlMCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvbGl0L0xpdENvbmZpZy5weSBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvTGl0Q29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDg1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L0xpdENvbmZpZy5weQpAQCAtMCwwICsxLDExMiBAQAorY2xhc3MgTGl0Q29uZmlnOgorICAgICIiIkxpdENvbmZpZyAtIENvbmZpZ3VyYXRpb24gZGF0YSBmb3IgYSAnbGl0JyB0ZXN0IHJ1bm5lciBpbnN0YW5jZSwgc2hhcmVkCisgICAgYWNyb3NzIGFsbCB0ZXN0cy4KKworICAgIFRoZSBMaXRDb25maWcgb2JqZWN0IGlzIGFsc28gdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGNsaWVudCBjb25maWd1cmF0aW9uCisgICAgZmlsZXMsIGl0IGlzIGFsd2F5cyBwYXNzZWQgaW4gYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSAnbGl0JyBzbyB0aGF0CisgICAgY29uZmlndXJhdGlvbiBmaWxlcyBjYW4gYWNjZXNzIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGFuZCBpbnRlcm5hbCBjb21wb25lbnRzCisgICAgZWFzaWx5LgorICAgICIiIgorCisgICAgIyBQcm92aWRlIGFjY2VzcyB0byBidWlsdC1pbiBmb3JtYXRzLgorICAgIGltcG9ydCBMaXRGb3JtYXRzIGFzIGZvcm1hdHMKKworICAgICMgUHJvdmlkZSBhY2Nlc3MgdG8gYnVpbHQtaW4gdXRpbGl0eSBmdW5jdGlvbnMuCisgICAgaW1wb3J0IFV0aWwgYXMgdXRpbAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2duYW1lLCBwYXRoLCBxdWlldCwKKyAgICAgICAgICAgICAgICAgdXNlVmFsZ3JpbmQsIHZhbGdyaW5kTGVha0NoZWNrLCB2YWxncmluZEFyZ3MsCisgICAgICAgICAgICAgICAgIHVzZVRjbEFzU2gsCisgICAgICAgICAgICAgICAgIG5vRXhlY3V0ZSwgZGVidWcsIGlzV2luZG93cywKKyAgICAgICAgICAgICAgICAgcGFyYW1zKToKKyAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgdGVzdCBydW5uZXIuCisgICAgICAgIHNlbGYucHJvZ25hbWUgPSBwcm9nbmFtZQorICAgICAgICAjIFRoZSBpdGVtcyB0byBhZGQgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICAgIHNlbGYucGF0aCA9IGxpc3QobWFwKHN0ciwgcGF0aCkpCisgICAgICAgIHNlbGYucXVpZXQgPSBib29sKHF1aWV0KQorICAgICAgICBzZWxmLnVzZVZhbGdyaW5kID0gYm9vbCh1c2VWYWxncmluZCkKKyAgICAgICAgc2VsZi52YWxncmluZExlYWtDaGVjayA9IGJvb2wodmFsZ3JpbmRMZWFrQ2hlY2spCisgICAgICAgIHNlbGYudmFsZ3JpbmRVc2VyQXJncyA9IGxpc3QodmFsZ3JpbmRBcmdzKQorICAgICAgICBzZWxmLnVzZVRjbEFzU2ggPSBib29sKHVzZVRjbEFzU2gpCisgICAgICAgIHNlbGYubm9FeGVjdXRlID0gbm9FeGVjdXRlCisgICAgICAgIHNlbGYuZGVidWcgPSBkZWJ1ZworICAgICAgICBzZWxmLmlzV2luZG93cyA9IGJvb2woaXNXaW5kb3dzKQorICAgICAgICBzZWxmLnBhcmFtcyA9IGRpY3QocGFyYW1zKQorICAgICAgICBzZWxmLmJhc2hQYXRoID0gTm9uZQorCisgICAgICAgIHNlbGYubnVtRXJyb3JzID0gMAorICAgICAgICBzZWxmLm51bVdhcm5pbmdzID0gMAorCisgICAgICAgIHNlbGYudmFsZ3JpbmRBcmdzID0gW10KKyAgICAgICAgc2VsZi52YWxncmluZFRyaXBsZSA9ICIiCisgICAgICAgIGlmIHNlbGYudXNlVmFsZ3JpbmQ6CisgICAgICAgICAgICBzZWxmLnZhbGdyaW5kVHJpcGxlID0gIi12ZyIKKyAgICAgICAgICAgIHNlbGYudmFsZ3JpbmRBcmdzID0gWyd2YWxncmluZCcsICctcScsICctLXJ1bi1saWJjLWZyZWVyZXM9bm8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdG9vbD1tZW1jaGVjaycsICctLXRyYWNlLWNoaWxkcmVuPXllcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1lcnJvci1leGl0Y29kZT0xMjMnXQorICAgICAgICAgICAgaWYgc2VsZi52YWxncmluZExlYWtDaGVjazoKKyAgICAgICAgICAgICAgICBzZWxmLnZhbGdyaW5kVHJpcGxlICs9ICJfbGVhayIKKyAgICAgICAgICAgICAgICBzZWxmLnZhbGdyaW5kQXJncy5hcHBlbmQoJy0tbGVhay1jaGVjaz1mdWxsJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGUgZGVmYXVsdCBpcyAnc3VtbWFyeScuCisgICAgICAgICAgICAgICAgc2VsZi52YWxncmluZEFyZ3MuYXBwZW5kKCctLWxlYWstY2hlY2s9bm8nKQorICAgICAgICAgICAgc2VsZi52YWxncmluZEFyZ3MuZXh0ZW5kKHNlbGYudmFsZ3JpbmRVc2VyQXJncykKKworCisgICAgZGVmIGxvYWRfY29uZmlnKHNlbGYsIGNvbmZpZywgcGF0aCk6CisgICAgICAgICIiImxvYWRfY29uZmlnKGNvbmZpZywgcGF0aCkgLSBMb2FkIGEgY29uZmlnIG9iamVjdCBmcm9tIGFuIGFsdGVybmF0ZQorICAgICAgICBwYXRoLiIiIgorICAgICAgICBmcm9tIFRlc3RpbmdDb25maWcgaW1wb3J0IFRlc3RpbmdDb25maWcKKyAgICAgICAgcmV0dXJuIFRlc3RpbmdDb25maWcuZnJvbXBhdGgocGF0aCwgY29uZmlnLnBhcmVudCwgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEV4aXN0ID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKQorCisgICAgZGVmIGdldEJhc2hQYXRoKHNlbGYpOgorICAgICAgICAiIiJnZXRCYXNoUGF0aCAtIEdldCB0aGUgcGF0aCB0byAnYmFzaCciIiIKKyAgICAgICAgaW1wb3J0IG9zLCBVdGlsCisKKyAgICAgICAgaWYgc2VsZi5iYXNoUGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJhc2hQYXRoCisKKyAgICAgICAgc2VsZi5iYXNoUGF0aCA9IFV0aWwud2hpY2goJ2Jhc2gnLCBvcy5wYXRoc2VwLmpvaW4oc2VsZi5wYXRoKSkKKyAgICAgICAgaWYgc2VsZi5iYXNoUGF0aCBpcyBOb25lOgorICAgICAgICAgICAgIyBDaGVjayBzb21lIGtub3duIHBhdGhzLgorICAgICAgICAgICAgZm9yIHBhdGggaW4gKCcvYmluL2Jhc2gnLCAnL3Vzci9iaW4vYmFzaCcsICcvdXNyL2xvY2FsL2Jpbi9iYXNoJyk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFzaFBhdGggPSBwYXRoCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgc2VsZi5iYXNoUGF0aCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi53YXJuaW5nKCJVbmFibGUgdG8gZmluZCAnYmFzaCcsIHJ1bm5pbmcgVGNsIHRlc3RzIGludGVybmFsbHkuIikKKyAgICAgICAgICAgIHNlbGYuYmFzaFBhdGggPSAnJworCisgICAgICAgIHJldHVybiBzZWxmLmJhc2hQYXRoCisKKyAgICBkZWYgX3dyaXRlX21lc3NhZ2Uoc2VsZiwga2luZCwgbWVzc2FnZSk6CisgICAgICAgIGltcG9ydCBpbnNwZWN0LCBvcywgc3lzCisKKyAgICAgICAgIyBHZXQgdGhlIGZpbGUvbGluZSB3aGVyZSB0aGlzIG1lc3NhZ2Ugd2FzIGdlbmVyYXRlZC4KKyAgICAgICAgZiA9IGluc3BlY3QuY3VycmVudGZyYW1lKCkKKyAgICAgICAgIyBTdGVwIG91dCBvZiBfd3JpdGVfbWVzc2FnZSwgYW5kIHRoZW4gb3V0IG9mIHdyYXBwZXIuCisgICAgICAgIGYgPSBmLmZfYmFjay5mX2JhY2sKKyAgICAgICAgZmlsZSxsaW5lLF8sXyxfID0gaW5zcGVjdC5nZXRmcmFtZWluZm8oZikKKyAgICAgICAgbG9jYXRpb24gPSAnJXM6JWQnICUgKG9zLnBhdGguYmFzZW5hbWUoZmlsZSksIGxpbmUpCisKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAnJXM6ICVzOiAlczogJXMnICUgKHNlbGYucHJvZ25hbWUsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZCwgbWVzc2FnZSkKKworICAgIGRlZiBub3RlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLl93cml0ZV9tZXNzYWdlKCdub3RlJywgbWVzc2FnZSkKKworICAgIGRlZiB3YXJuaW5nKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLl93cml0ZV9tZXNzYWdlKCd3YXJuaW5nJywgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5udW1XYXJuaW5ncyArPSAxCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHNlbGYuX3dyaXRlX21lc3NhZ2UoJ2Vycm9yJywgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5udW1FcnJvcnMgKz0gMQorCisgICAgZGVmIGZhdGFsKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHNlbGYuX3dyaXRlX21lc3NhZ2UoJ2ZhdGFsJywgbWVzc2FnZSkKKyAgICAgICAgc3lzLmV4aXQoMikKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvTGl0Rm9ybWF0cy5weSBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvTGl0Rm9ybWF0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZmMTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9MaXRGb3JtYXRzLnB5CkBAIC0wLDAgKzEsMiBAQAorZnJvbSBUZXN0Rm9ybWF0cyBpbXBvcnQgR29vZ2xlVGVzdCwgU2hUZXN0LCBUY2xUZXN0Citmcm9tIFRlc3RGb3JtYXRzIGltcG9ydCBTeW50YXhDaGVja1Rlc3QsIE9uZUNvbW1hbmRQZXJGaWxlVGVzdApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9MaXRUZXN0Q2FzZS5weSBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvTGl0VGVzdENhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1MTE4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvTGl0VGVzdENhc2UucHkKQEAgLTAsMCArMSwzMCBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVGVzdAorCisiIiIKK1Rlc3RDYXNlIGFkYXB0b3IgZm9yIHByb3ZpZGluZyBhICd1bml0dGVzdCcgY29tcGF0aWJsZSBpbnRlcmZhY2UgdG8gJ2xpdCcgdGVzdHMuCisiIiIKKworY2xhc3MgVW5yZXNvbHZlZEVycm9yKFJ1bnRpbWVFcnJvcik6CisgICAgcGFzcworICAgICAgICAKK2NsYXNzIExpdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdCwgbGl0X2NvbmZpZyk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX3Rlc3QgPSB0ZXN0CisgICAgICAgIHNlbGYuX2xpdF9jb25maWcgPSBsaXRfY29uZmlnCisKKyAgICBkZWYgaWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90ZXN0LmdldEZ1bGxOYW1lKCkKKworICAgIGRlZiBzaG9ydERlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdGVzdC5nZXRGdWxsTmFtZSgpCisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKyAgICAgICAgdHIsIG91dHB1dCA9IHNlbGYuX3Rlc3QuY29uZmlnLnRlc3RfZm9ybWF0LmV4ZWN1dGUoCisgICAgICAgICAgICBzZWxmLl90ZXN0LCBzZWxmLl9saXRfY29uZmlnKQorCisgICAgICAgIGlmIHRyIGlzIFRlc3QuVU5SRVNPTFZFRDoKKyAgICAgICAgICAgIHJhaXNlIFVucmVzb2x2ZWRFcnJvcihvdXRwdXQpCisgICAgICAgIGVsaWYgdHIuaXNGYWlsdXJlOgorICAgICAgICAgICAgc2VsZi5mYWlsKG91dHB1dCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xpdC9saXQvUHJvZ3Jlc3NCYXIucHkgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L1Byb2dyZXNzQmFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Yzk1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L1Byb2dyZXNzQmFyLnB5CkBAIC0wLDAgKzEsMjY3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyBTb3VyY2U6IGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzQ3NTExNi8sIHdpdGgKKyMgbW9kaWZpY2F0aW9ucyBieSBEYW5pZWwgRHVuYmFyLgorCitpbXBvcnQgc3lzLCByZSwgdGltZQorCitjbGFzcyBUZXJtaW5hbENvbnRyb2xsZXI6CisgICAgIiIiCisgICAgQSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvcnRhYmx5IGdlbmVyYXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8KKyAgICBhIHRlcm1pbmFsLiAgCisgICAgCisgICAgYFRlcm1pbmFsQ29udHJvbGxlcmAgZGVmaW5lcyBhIHNldCBvZiBpbnN0YW5jZSB2YXJpYWJsZXMgd2hvc2UKKyAgICB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIHRvIHRoZSBjb250cm9sIHNlcXVlbmNlIG5lY2Vzc2FyeSB0bworICAgIHBlcmZvcm0gYSBnaXZlbiBhY3Rpb24uICBUaGVzZSBjYW4gYmUgc2ltcGx5IGluY2x1ZGVkIGluIG5vcm1hbAorICAgIG91dHB1dCB0byB0aGUgdGVybWluYWw6CisKKyAgICAgICAgPj4+IHRlcm0gPSBUZXJtaW5hbENvbnRyb2xsZXIoKQorICAgICAgICA+Pj4gcHJpbnQgJ1RoaXMgaXMgJyt0ZXJtLkdSRUVOKydncmVlbicrdGVybS5OT1JNQUwKKworICAgIEFsdGVybmF0aXZlbHksIHRoZSBgcmVuZGVyKClgIG1ldGhvZCBjYW4gdXNlZCwgd2hpY2ggcmVwbGFjZXMKKyAgICAnJHthY3Rpb259JyB3aXRoIHRoZSBzdHJpbmcgcmVxdWlyZWQgdG8gcGVyZm9ybSAnYWN0aW9uJzoKKworICAgICAgICA+Pj4gdGVybSA9IFRlcm1pbmFsQ29udHJvbGxlcigpCisgICAgICAgID4+PiBwcmludCB0ZXJtLnJlbmRlcignVGhpcyBpcyAke0dSRUVOfWdyZWVuJHtOT1JNQUx9JykKKworICAgIElmIHRoZSB0ZXJtaW5hbCBkb2Vzbid0IHN1cHBvcnQgYSBnaXZlbiBhY3Rpb24sIHRoZW4gdGhlIHZhbHVlIG9mCisgICAgdGhlIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2UgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gJycuICBBcyBhCisgICAgcmVzdWx0LCB0aGUgYWJvdmUgY29kZSB3aWxsIHN0aWxsIHdvcmsgb24gdGVybWluYWxzIHRoYXQgZG8gbm90CisgICAgc3VwcG9ydCBjb2xvciwgZXhjZXB0IHRoYXQgdGhlaXIgb3V0cHV0IHdpbGwgbm90IGJlIGNvbG9yZWQuCisgICAgQWxzbywgdGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gdGVzdCB3aGV0aGVyIHRoZSB0ZXJtaW5hbCBzdXBwb3J0cyBhCisgICAgZ2l2ZW4gYWN0aW9uIGJ5IHNpbXBseSB0ZXN0aW5nIHRoZSB0cnV0aCB2YWx1ZSBvZiB0aGUKKyAgICBjb3JyZXNwb25kaW5nIGluc3RhbmNlIHZhcmlhYmxlOgorCisgICAgICAgID4+PiB0ZXJtID0gVGVybWluYWxDb250cm9sbGVyKCkKKyAgICAgICAgPj4+IGlmIHRlcm0uQ0xFQVJfU0NSRUVOOgorICAgICAgICAuLi4gICAgIHByaW50ICdUaGlzIHRlcm1pbmFsIHN1cHBvcnRzIGNsZWFybmluZyB0aGUgc2NyZWVuLicKKworICAgIEZpbmFsbHksIGlmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSB0ZXJtaW5hbCBhcmUga25vd24sIHRoZW4KKyAgICB0aGV5IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBgQ09MU2AgYW5kIGBMSU5FU2AgYXR0cmlidXRlcy4KKyAgICAiIiIKKyAgICAjIEN1cnNvciBtb3ZlbWVudDoKKyAgICBCT0wgPSAnJyAgICAgICAgICAgICAjOiBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZQorICAgIFVQID0gJycgICAgICAgICAgICAgICM6IE1vdmUgdGhlIGN1cnNvciB1cCBvbmUgbGluZQorICAgIERPV04gPSAnJyAgICAgICAgICAgICM6IE1vdmUgdGhlIGN1cnNvciBkb3duIG9uZSBsaW5lCisgICAgTEVGVCA9ICcnICAgICAgICAgICAgIzogTW92ZSB0aGUgY3Vyc29yIGxlZnQgb25lIGNoYXIKKyAgICBSSUdIVCA9ICcnICAgICAgICAgICAjOiBNb3ZlIHRoZSBjdXJzb3IgcmlnaHQgb25lIGNoYXIKKworICAgICMgRGVsZXRpb246CisgICAgQ0xFQVJfU0NSRUVOID0gJycgICAgIzogQ2xlYXIgdGhlIHNjcmVlbiBhbmQgbW92ZSB0byBob21lIHBvc2l0aW9uCisgICAgQ0xFQVJfRU9MID0gJycgICAgICAgIzogQ2xlYXIgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KKyAgICBDTEVBUl9CT0wgPSAnJyAgICAgICAjOiBDbGVhciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgorICAgIENMRUFSX0VPUyA9ICcnICAgICAgICM6IENsZWFyIHRvIHRoZSBlbmQgb2YgdGhlIHNjcmVlbgorCisgICAgIyBPdXRwdXQgbW9kZXM6CisgICAgQk9MRCA9ICcnICAgICAgICAgICAgIzogVHVybiBvbiBib2xkIG1vZGUKKyAgICBCTElOSyA9ICcnICAgICAgICAgICAjOiBUdXJuIG9uIGJsaW5rIG1vZGUKKyAgICBESU0gPSAnJyAgICAgICAgICAgICAjOiBUdXJuIG9uIGhhbGYtYnJpZ2h0IG1vZGUKKyAgICBSRVZFUlNFID0gJycgICAgICAgICAjOiBUdXJuIG9uIHJldmVyc2UtdmlkZW8gbW9kZQorICAgIE5PUk1BTCA9ICcnICAgICAgICAgICM6IFR1cm4gb2ZmIGFsbCBtb2RlcworCisgICAgIyBDdXJzb3IgZGlzcGxheToKKyAgICBISURFX0NVUlNPUiA9ICcnICAgICAjOiBNYWtlIHRoZSBjdXJzb3IgaW52aXNpYmxlCisgICAgU0hPV19DVVJTT1IgPSAnJyAgICAgIzogTWFrZSB0aGUgY3Vyc29yIHZpc2libGUKKworICAgICMgVGVybWluYWwgc2l6ZToKKyAgICBDT0xTID0gTm9uZSAgICAgICAgICAjOiBXaWR0aCBvZiB0aGUgdGVybWluYWwgKE5vbmUgZm9yIHVua25vd24pCisgICAgTElORVMgPSBOb25lICAgICAgICAgIzogSGVpZ2h0IG9mIHRoZSB0ZXJtaW5hbCAoTm9uZSBmb3IgdW5rbm93bikKKworICAgICMgRm9yZWdyb3VuZCBjb2xvcnM6CisgICAgQkxBQ0sgPSBCTFVFID0gR1JFRU4gPSBDWUFOID0gUkVEID0gTUFHRU5UQSA9IFlFTExPVyA9IFdISVRFID0gJycKKyAgICAKKyAgICAjIEJhY2tncm91bmQgY29sb3JzOgorICAgIEJHX0JMQUNLID0gQkdfQkxVRSA9IEJHX0dSRUVOID0gQkdfQ1lBTiA9ICcnCisgICAgQkdfUkVEID0gQkdfTUFHRU5UQSA9IEJHX1lFTExPVyA9IEJHX1dISVRFID0gJycKKyAgICAKKyAgICBfU1RSSU5HX0NBUEFCSUxJVElFUyA9ICIiIgorICAgIEJPTD1jciBVUD1jdXUxIERPV049Y3VkMSBMRUZUPWN1YjEgUklHSFQ9Y3VmMQorICAgIENMRUFSX1NDUkVFTj1jbGVhciBDTEVBUl9FT0w9ZWwgQ0xFQVJfQk9MPWVsMSBDTEVBUl9FT1M9ZWQgQk9MRD1ib2xkCisgICAgQkxJTks9YmxpbmsgRElNPWRpbSBSRVZFUlNFPXJldiBVTkRFUkxJTkU9c211bCBOT1JNQUw9c2dyMAorICAgIEhJREVfQ1VSU09SPWNpbnZpcyBTSE9XX0NVUlNPUj1jbm9ybSIiIi5zcGxpdCgpCisgICAgX0NPTE9SUyA9ICIiIkJMQUNLIEJMVUUgR1JFRU4gQ1lBTiBSRUQgTUFHRU5UQSBZRUxMT1cgV0hJVEUiIiIuc3BsaXQoKQorICAgIF9BTlNJQ09MT1JTID0gIkJMQUNLIFJFRCBHUkVFTiBZRUxMT1cgQkxVRSBNQUdFTlRBIENZQU4gV0hJVEUiLnNwbGl0KCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXJtX3N0cmVhbT1zeXMuc3Rkb3V0KToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIGBUZXJtaW5hbENvbnRyb2xsZXJgIGFuZCBpbml0aWFsaXplIGl0cyBhdHRyaWJ1dGVzCisgICAgICAgIHdpdGggYXBwcm9wcmlhdGUgdmFsdWVzIGZvciB0aGUgY3VycmVudCB0ZXJtaW5hbC4KKyAgICAgICAgYHRlcm1fc3RyZWFtYCBpcyB0aGUgc3RyZWFtIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0ZXJtaW5hbAorICAgICAgICBvdXRwdXQ7IGlmIHRoaXMgc3RyZWFtIGlzIG5vdCBhIHR0eSwgdGhlbiB0aGUgdGVybWluYWwgaXMKKyAgICAgICAgYXNzdW1lZCB0byBiZSBhIGR1bWIgdGVybWluYWwgKGkuZS4sIGhhdmUgbm8gY2FwYWJpbGl0aWVzKS4KKyAgICAgICAgIiIiCisgICAgICAgICMgQ3Vyc2VzIGlzbid0IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zCisgICAgICAgIHRyeTogaW1wb3J0IGN1cnNlcworICAgICAgICBleGNlcHQ6IHJldHVybgorCisgICAgICAgICMgSWYgdGhlIHN0cmVhbSBpc24ndCBhIHR0eSwgdGhlbiBhc3N1bWUgaXQgaGFzIG5vIGNhcGFiaWxpdGllcy4KKyAgICAgICAgaWYgbm90IHRlcm1fc3RyZWFtLmlzYXR0eSgpOiByZXR1cm4KKworICAgICAgICAjIENoZWNrIHRoZSB0ZXJtaW5hbCB0eXBlLiAgSWYgd2UgZmFpbCwgdGhlbiBhc3N1bWUgdGhhdCB0aGUKKyAgICAgICAgIyB0ZXJtaW5hbCBoYXMgbm8gY2FwYWJpbGl0aWVzLgorICAgICAgICB0cnk6IGN1cnNlcy5zZXR1cHRlcm0oKQorICAgICAgICBleGNlcHQ6IHJldHVybgorCisgICAgICAgICMgTG9vayB1cCBudW1lcmljIGNhcGFiaWxpdGllcy4KKyAgICAgICAgc2VsZi5DT0xTID0gY3Vyc2VzLnRpZ2V0bnVtKCdjb2xzJykKKyAgICAgICAgc2VsZi5MSU5FUyA9IGN1cnNlcy50aWdldG51bSgnbGluZXMnKQorICAgICAgICAKKyAgICAgICAgIyBMb29rIHVwIHN0cmluZyBjYXBhYmlsaXRpZXMuCisgICAgICAgIGZvciBjYXBhYmlsaXR5IGluIHNlbGYuX1NUUklOR19DQVBBQklMSVRJRVM6CisgICAgICAgICAgICAoYXR0cmliLCBjYXBfbmFtZSkgPSBjYXBhYmlsaXR5LnNwbGl0KCc9JykKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0cmliLCBzZWxmLl90aWdldHN0cihjYXBfbmFtZSkgb3IgJycpCisKKyAgICAgICAgIyBDb2xvcnMKKyAgICAgICAgc2V0X2ZnID0gc2VsZi5fdGlnZXRzdHIoJ3NldGYnKQorICAgICAgICBpZiBzZXRfZmc6CisgICAgICAgICAgICBmb3IgaSxjb2xvciBpbiB6aXAocmFuZ2UobGVuKHNlbGYuX0NPTE9SUykpLCBzZWxmLl9DT0xPUlMpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgY29sb3IsIGN1cnNlcy50cGFybShzZXRfZmcsIGkpIG9yICcnKQorICAgICAgICBzZXRfZmdfYW5zaSA9IHNlbGYuX3RpZ2V0c3RyKCdzZXRhZicpCisgICAgICAgIGlmIHNldF9mZ19hbnNpOgorICAgICAgICAgICAgZm9yIGksY29sb3IgaW4gemlwKHJhbmdlKGxlbihzZWxmLl9BTlNJQ09MT1JTKSksIHNlbGYuX0FOU0lDT0xPUlMpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgY29sb3IsIGN1cnNlcy50cGFybShzZXRfZmdfYW5zaSwgaSkgb3IgJycpCisgICAgICAgIHNldF9iZyA9IHNlbGYuX3RpZ2V0c3RyKCdzZXRiJykKKyAgICAgICAgaWYgc2V0X2JnOgorICAgICAgICAgICAgZm9yIGksY29sb3IgaW4gemlwKHJhbmdlKGxlbihzZWxmLl9DT0xPUlMpKSwgc2VsZi5fQ09MT1JTKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsICdCR18nK2NvbG9yLCBjdXJzZXMudHBhcm0oc2V0X2JnLCBpKSBvciAnJykKKyAgICAgICAgc2V0X2JnX2Fuc2kgPSBzZWxmLl90aWdldHN0cignc2V0YWInKQorICAgICAgICBpZiBzZXRfYmdfYW5zaToKKyAgICAgICAgICAgIGZvciBpLGNvbG9yIGluIHppcChyYW5nZShsZW4oc2VsZi5fQU5TSUNPTE9SUykpLCBzZWxmLl9BTlNJQ09MT1JTKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsICdCR18nK2NvbG9yLCBjdXJzZXMudHBhcm0oc2V0X2JnX2Fuc2ksIGkpIG9yICcnKQorCisgICAgZGVmIF90aWdldHN0cihzZWxmLCBjYXBfbmFtZSk6CisgICAgICAgICMgU3RyaW5nIGNhcGFiaWxpdGllcyBjYW4gaW5jbHVkZSAiZGVsYXlzIiBvZiB0aGUgZm9ybSAiJDwyPiIuCisgICAgICAgICMgRm9yIGFueSBtb2Rlcm4gdGVybWluYWwsIHdlIHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgaWdub3JlCisgICAgICAgICMgdGhlc2UsIHNvIHN0cmlwIHRoZW0gb3V0LgorICAgICAgICBpbXBvcnQgY3Vyc2VzCisgICAgICAgIGNhcCA9IGN1cnNlcy50aWdldHN0cihjYXBfbmFtZSkgb3IgJycKKyAgICAgICAgcmV0dXJuIHJlLnN1YihyJ1wkPFxkKz5bLypdPycsICcnLCBjYXApCisKKyAgICBkZWYgcmVuZGVyKHNlbGYsIHRlbXBsYXRlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlcGxhY2UgZWFjaCAkLXN1YnN0aXR1dGlvbnMgaW4gdGhlIGdpdmVuIHRlbXBsYXRlIHN0cmluZyB3aXRoCisgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIHRlcm1pbmFsIGNvbnRyb2wgc3RyaW5nIChpZiBpdCdzIGRlZmluZWQpIG9yCisgICAgICAgICcnIChpZiBpdCdzIG5vdCkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gcmUuc3ViKHInXCRcJHxcJHtcdyt9Jywgc2VsZi5fcmVuZGVyX3N1YiwgdGVtcGxhdGUpCisKKyAgICBkZWYgX3JlbmRlcl9zdWIoc2VsZiwgbWF0Y2gpOgorICAgICAgICBzID0gbWF0Y2guZ3JvdXAoKQorICAgICAgICBpZiBzID09ICckJCc6IHJldHVybiBzCisgICAgICAgIGVsc2U6IHJldHVybiBnZXRhdHRyKHNlbGYsIHNbMjotMV0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEV4YW1wbGUgdXNlIGNhc2U6IHByb2dyZXNzIGJhcgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgU2ltcGxlUHJvZ3Jlc3NCYXI6CisgICAgIiIiCisgICAgQSBzaW1wbGUgcHJvZ3Jlc3MgYmFyIHdoaWNoIGRvZXNuJ3QgbmVlZCBhbnkgdGVybWluYWwgc3VwcG9ydC4KKworICAgIFRoaXMgcHJpbnRzIG91dCBhIHByb2dyZXNzIGJhciBsaWtlOgorICAgICAgJ0hlYWRlcjogMCAuLiAxMC4uIDIwLi4gLi4uJworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcik6CisgICAgICAgIHNlbGYuaGVhZGVyID0gaGVhZGVyCisgICAgICAgIHNlbGYuYXRJbmRleCA9IE5vbmUKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgcGVyY2VudCwgbWVzc2FnZSk6CisgICAgICAgIGlmIHNlbGYuYXRJbmRleCBpcyBOb25lOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzZWxmLmhlYWRlcikKKyAgICAgICAgICAgIHNlbGYuYXRJbmRleCA9IDAKKworICAgICAgICBuZXh0ID0gaW50KHBlcmNlbnQqNTApCisgICAgICAgIGlmIG5leHQgPT0gc2VsZi5hdEluZGV4OgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5hdEluZGV4LCBuZXh0KToKKyAgICAgICAgICAgIGlkeCA9IGkgJSA1CisgICAgICAgICAgICBpZiBpZHggPT0gMDoKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCclLTJkJyAlIChpKjIpKQorICAgICAgICAgICAgZWxpZiBpZHggPT0gMToKKyAgICAgICAgICAgICAgICBwYXNzICMgU2tpcCBzZWNvbmQgY2hhcgorICAgICAgICAgICAgZWxpZiBpZHggPCA0OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJy4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCcgJykKKyAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIHNlbGYuYXRJbmRleCA9IG5leHQKKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hdEluZGV4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQorICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLmF0SW5kZXggPSBOb25lCisKK2NsYXNzIFByb2dyZXNzQmFyOgorICAgICIiIgorICAgIEEgMy1saW5lIHByb2dyZXNzIGJhciwgd2hpY2ggbG9va3MgbGlrZTo6CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlcgorICAgICAgICAyMCUgWz09PT09PT09PT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzIG1lc3NhZ2UKKworICAgIFRoZSBwcm9ncmVzcyBiYXIgaXMgY29sb3JlZCwgaWYgdGhlIHRlcm1pbmFsIHN1cHBvcnRzIGNvbG9yCisgICAgb3V0cHV0OyBhbmQgYWRqdXN0cyB0byB0aGUgd2lkdGggb2YgdGhlIHRlcm1pbmFsLgorICAgICIiIgorICAgIEJBUiA9ICclcyR7R1JFRU59WyR7Qk9MRH0lcyVzJHtOT1JNQUx9JHtHUkVFTn1dJHtOT1JNQUx9JXNcbicKKyAgICBIRUFERVIgPSAnJHtCT0xEfSR7Q1lBTn0lcyR7Tk9STUFMfVxuXG4nCisgICAgICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXJtLCBoZWFkZXIsIHVzZUVUQT1UcnVlKToKKyAgICAgICAgc2VsZi50ZXJtID0gdGVybQorICAgICAgICBpZiBub3QgKHNlbGYudGVybS5DTEVBUl9FT0wgYW5kIHNlbGYudGVybS5VUCBhbmQgc2VsZi50ZXJtLkJPTCk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUZXJtaW5hbCBpc24ndCBjYXBhYmxlIGVub3VnaCAtLSB5b3UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIHVzZSBhIHNpbXBsZXIgcHJvZ3Jlc3MgZGlzcGFseS4iKQorICAgICAgICBzZWxmLndpZHRoID0gc2VsZi50ZXJtLkNPTFMgb3IgNzUKKyAgICAgICAgc2VsZi5iYXIgPSB0ZXJtLnJlbmRlcihzZWxmLkJBUikKKyAgICAgICAgc2VsZi5oZWFkZXIgPSBzZWxmLnRlcm0ucmVuZGVyKHNlbGYuSEVBREVSICUgaGVhZGVyLmNlbnRlcihzZWxmLndpZHRoKSkKKyAgICAgICAgc2VsZi5jbGVhcmVkID0gMSAjOiB0cnVlIGlmIHdlIGhhdmVuJ3QgZHJhd24gdGhlIGJhciB5ZXQuCisgICAgICAgIHNlbGYudXNlRVRBID0gdXNlRVRBCisgICAgICAgIGlmIHNlbGYudXNlRVRBOgorICAgICAgICAgICAgc2VsZi5zdGFydFRpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLnVwZGF0ZSgwLCAnJykKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgcGVyY2VudCwgbWVzc2FnZSk6CisgICAgICAgIGlmIHNlbGYuY2xlYXJlZDoKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc2VsZi5oZWFkZXIpCisgICAgICAgICAgICBzZWxmLmNsZWFyZWQgPSAwCisgICAgICAgIHByZWZpeCA9ICclM2QlJSAnICUgKHBlcmNlbnQqMTAwLCkKKyAgICAgICAgc3VmZml4ID0gJycKKyAgICAgICAgaWYgc2VsZi51c2VFVEE6CisgICAgICAgICAgICBlbGFwc2VkID0gdGltZS50aW1lKCkgLSBzZWxmLnN0YXJ0VGltZQorICAgICAgICAgICAgaWYgcGVyY2VudCA+IC4wMDAxIGFuZCBlbGFwc2VkID4gMToKKyAgICAgICAgICAgICAgICB0b3RhbCA9IGVsYXBzZWQgLyBwZXJjZW50CisgICAgICAgICAgICAgICAgZXRhID0gaW50KHRvdGFsIC0gZWxhcHNlZCkKKyAgICAgICAgICAgICAgICBoID0gZXRhLy8zNjAwLgorICAgICAgICAgICAgICAgIG0gPSAoZXRhLy82MCkgJSA2MAorICAgICAgICAgICAgICAgIHMgPSBldGEgJSA2MAorICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICcgRVRBOiAlMDJkOiUwMmQ6JTAyZCclKGgsbSxzKQorICAgICAgICBiYXJXaWR0aCA9IHNlbGYud2lkdGggLSBsZW4ocHJlZml4KSAtIGxlbihzdWZmaXgpIC0gMgorICAgICAgICBuID0gaW50KGJhcldpZHRoKnBlcmNlbnQpCisgICAgICAgIGlmIGxlbihtZXNzYWdlKSA8IHNlbGYud2lkdGg6CisgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSArICcgJyooc2VsZi53aWR0aCAtIGxlbihtZXNzYWdlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAnLi4uICcgKyBtZXNzYWdlWy0oc2VsZi53aWR0aC00KTpdCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoCisgICAgICAgICAgICBzZWxmLnRlcm0uQk9MICsgc2VsZi50ZXJtLlVQICsgc2VsZi50ZXJtLkNMRUFSX0VPTCArCisgICAgICAgICAgICAoc2VsZi5iYXIgJSAocHJlZml4LCAnPScqbiwgJy0nKihiYXJXaWR0aC1uKSwgc3VmZml4KSkgKworICAgICAgICAgICAgc2VsZi50ZXJtLkNMRUFSX0VPTCArIG1lc3NhZ2UpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmNsZWFyZWQ6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHNlbGYudGVybS5CT0wgKyBzZWxmLnRlcm0uQ0xFQVJfRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXJtLlVQICsgc2VsZi50ZXJtLkNMRUFSX0VPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVybS5VUCArIHNlbGYudGVybS5DTEVBUl9FT0wpCisgICAgICAgICAgICBzZWxmLmNsZWFyZWQgPSAxCisKK2RlZiB0ZXN0KCk6CisgICAgaW1wb3J0IHRpbWUKKyAgICB0YyA9IFRlcm1pbmFsQ29udHJvbGxlcigpCisgICAgcCA9IFByb2dyZXNzQmFyKHRjLCAnVGVzdHMnKQorICAgIGZvciBpIGluIHJhbmdlKDEwMSk6CisgICAgICAgIHAudXBkYXRlKGkvMTAwLiwgc3RyKGkpKSAgICAgICAgCisgICAgICAgIHRpbWUuc2xlZXAoLjMpCisKK2lmIF9fbmFtZV9fPT0nX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9TaENvbW1hbmRzLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9TaENvbW1hbmRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTA0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L1NoQ29tbWFuZHMucHkKQEAgLTAsMCArMSw4NSBAQAorY2xhc3MgQ29tbWFuZDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJncywgcmVkaXJlY3RzKToKKyAgICAgICAgc2VsZi5hcmdzID0gbGlzdChhcmdzKQorICAgICAgICBzZWxmLnJlZGlyZWN0cyA9IGxpc3QocmVkaXJlY3RzKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ0NvbW1hbmQoJXIsICVyKScgJSAoc2VsZi5hcmdzLCBzZWxmLnJlZGlyZWN0cykKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIENvbW1hbmQpOgorICAgICAgICAgICAgcmV0dXJuIC0xCisKKyAgICAgICAgcmV0dXJuIGNtcCgoc2VsZi5hcmdzLCBzZWxmLnJlZGlyZWN0cyksCisgICAgICAgICAgICAgICAgICAgKG90aGVyLmFyZ3MsIG90aGVyLnJlZGlyZWN0cykpCisKKyAgICBkZWYgdG9TaGVsbChzZWxmLCBmaWxlKToKKyAgICAgICAgZm9yIGFyZyBpbiBzZWxmLmFyZ3M6CisgICAgICAgICAgICBpZiAiJyIgbm90IGluIGFyZzoKKyAgICAgICAgICAgICAgICBxdW90ZWQgPSAiJyVzJyIgJSBhcmcKKyAgICAgICAgICAgIGVsaWYgJyInIG5vdCBpbiBhcmcgYW5kICckJyBub3QgaW4gYXJnOgorICAgICAgICAgICAgICAgIHF1b3RlZCA9ICciJXMiJyAlIGFyZworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCdVbmFibGUgdG8gcXVvdGUgJXInICUgYXJnCisgICAgICAgICAgICBwcmludCA+PmZpbGUsIHF1b3RlZCwKKworICAgICAgICAgICAgIyBGb3IgZGVidWdnaW5nIC8gdmFsaWRhdGlvbi4KKyAgICAgICAgICAgIGltcG9ydCBTaFV0aWwKKyAgICAgICAgICAgIGRlcXVvdGVkID0gbGlzdChTaFV0aWwuU2hMZXhlcihxdW90ZWQpLmxleCgpKQorICAgICAgICAgICAgaWYgZGVxdW90ZWQgIT0gW2FyZ106CisgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwnVW5hYmxlIHRvIHF1b3RlICVyJyAlIGFyZworCisgICAgICAgIGZvciByIGluIHNlbGYucmVkaXJlY3RzOgorICAgICAgICAgICAgaWYgbGVuKHJbMF0pID09IDE6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5maWxlLCAiJXMgJyVzJyIgJSAoclswXVswXSwgclsxXSksCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ID4+ZmlsZSwgIiVzJXMgJyVzJyIgJSAoclswXVsxXSwgclswXVswXSwgclsxXSksCisKK2NsYXNzIFBpcGVsaW5lOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kcywgbmVnYXRlPUZhbHNlLCBwaXBlX2Vycj1GYWxzZSk6CisgICAgICAgIHNlbGYuY29tbWFuZHMgPSBjb21tYW5kcworICAgICAgICBzZWxmLm5lZ2F0ZSA9IG5lZ2F0ZQorICAgICAgICBzZWxmLnBpcGVfZXJyID0gcGlwZV9lcnIKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICdQaXBlbGluZSglciwgJXIsICVyKScgJSAoc2VsZi5jb21tYW5kcywgc2VsZi5uZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlwZV9lcnIpCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBQaXBlbGluZSk6CisgICAgICAgICAgICByZXR1cm4gLTEKKworICAgICAgICByZXR1cm4gY21wKChzZWxmLmNvbW1hbmRzLCBzZWxmLm5lZ2F0ZSwgc2VsZi5waXBlX2VyciksCisgICAgICAgICAgICAgICAgICAgKG90aGVyLmNvbW1hbmRzLCBvdGhlci5uZWdhdGUsIHNlbGYucGlwZV9lcnIpKQorCisgICAgZGVmIHRvU2hlbGwoc2VsZiwgZmlsZSwgcGlwZWZhaWw9RmFsc2UpOgorICAgICAgICBpZiBwaXBlZmFpbCAhPSBzZWxmLnBpcGVfZXJyOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwnSW5jb25zaXN0ZW50ICJwaXBlZmFpbCIgYXR0cmlidXRlIScKKyAgICAgICAgaWYgc2VsZi5uZWdhdGU6CisgICAgICAgICAgICBwcmludCA+PmZpbGUsICchJywKKyAgICAgICAgZm9yIGNtZCBpbiBzZWxmLmNvbW1hbmRzOgorICAgICAgICAgICAgY21kLnRvU2hlbGwoZmlsZSkKKyAgICAgICAgICAgIGlmIGNtZCBpcyBub3Qgc2VsZi5jb21tYW5kc1stMV06CisgICAgICAgICAgICAgICAgcHJpbnQgPj5maWxlLCAnfFxuICcsCisKK2NsYXNzIFNlcToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGhzLCBvcCwgcmhzKToKKyAgICAgICAgYXNzZXJ0IG9wIGluICgnOycsICcmJywgJ3x8JywgJyYmJykKKyAgICAgICAgc2VsZi5vcCA9IG9wCisgICAgICAgIHNlbGYubGhzID0gbGhzCisgICAgICAgIHNlbGYucmhzID0gcmhzCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnU2VxKCVyLCAlciwgJXIpJyAlIChzZWxmLmxocywgc2VsZi5vcCwgc2VsZi5yaHMpCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTZXEpOgorICAgICAgICAgICAgcmV0dXJuIC0xCisKKyAgICAgICAgcmV0dXJuIGNtcCgoc2VsZi5saHMsIHNlbGYub3AsIHNlbGYucmhzKSwKKyAgICAgICAgICAgICAgICAgICAob3RoZXIubGhzLCBvdGhlci5vcCwgb3RoZXIucmhzKSkKKworICAgIGRlZiB0b1NoZWxsKHNlbGYsIGZpbGUsIHBpcGVmYWlsPUZhbHNlKToKKyAgICAgICAgc2VsZi5saHMudG9TaGVsbChmaWxlLCBwaXBlZmFpbCkKKyAgICAgICAgcHJpbnQgPj5maWxlLCAnICVzXG4nICUgc2VsZi5vcAorICAgICAgICBzZWxmLnJocy50b1NoZWxsKGZpbGUsIHBpcGVmYWlsKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9TaFV0aWwucHkgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L1NoVXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGE2MjJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9TaFV0aWwucHkKQEAgLTAsMCArMSwzNTMgQEAKK2ltcG9ydCBpdGVydG9vbHMKKworaW1wb3J0IFV0aWwKK2Zyb20gU2hDb21tYW5kcyBpbXBvcnQgQ29tbWFuZCwgUGlwZWxpbmUsIFNlcQorCitjbGFzcyBTaExleGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB3aW4zMkVzY2FwZXMgPSBGYWxzZSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgc2VsZi5wb3MgPSAwCisgICAgICAgIHNlbGYuZW5kID0gbGVuKGRhdGEpCisgICAgICAgIHNlbGYud2luMzJFc2NhcGVzID0gd2luMzJFc2NhcGVzCisKKyAgICBkZWYgZWF0KHNlbGYpOgorICAgICAgICBjID0gc2VsZi5kYXRhW3NlbGYucG9zXQorICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgIHJldHVybiBjCisKKyAgICBkZWYgbG9vayhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtzZWxmLnBvc10KKworICAgIGRlZiBtYXliZV9lYXQoc2VsZiwgYyk6CisgICAgICAgICIiIgorICAgICAgICBtYXliZV9lYXQoYykgLSBDb25zdW1lIHRoZSBjaGFyYWN0ZXIgYyBpZiBpdCBpcyB0aGUgbmV4dCBjaGFyYWN0ZXIsCisgICAgICAgIHJldHVybmluZyBUcnVlIGlmIGEgY2hhcmFjdGVyIHdhcyBjb25zdW1lZC4gIiIiCisgICAgICAgIGlmIHNlbGYuZGF0YVtzZWxmLnBvc10gPT0gYzoKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGxleF9hcmdfZmFzdChzZWxmLCBjKToKKyAgICAgICAgIyBHZXQgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBmcmVlIHNlY3Rpb24uCisgICAgICAgIGNodW5rID0gc2VsZi5kYXRhW3NlbGYucG9zIC0gMTpdLnNwbGl0KE5vbmUsIDEpWzBdCisgICAgICAgIAorICAgICAgICAjIElmIGl0IGhhcyBzcGVjaWFsIGNoYXJhY3RlcnMsIHRoZSBmYXN0IHBhdGggZmFpbGVkLgorICAgICAgICBpZiAoJ3wnIGluIGNodW5rIG9yICcmJyBpbiBjaHVuayBvciAKKyAgICAgICAgICAgICc8JyBpbiBjaHVuayBvciAnPicgaW4gY2h1bmsgb3IKKyAgICAgICAgICAgICInIiBpbiBjaHVuayBvciAnIicgaW4gY2h1bmsgb3IKKyAgICAgICAgICAgICdcXCcgaW4gY2h1bmspOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgCisgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgLSAxICsgbGVuKGNodW5rKQorICAgICAgICByZXR1cm4gY2h1bmsKKyAgICAgICAgCisgICAgZGVmIGxleF9hcmdfc2xvdyhzZWxmLCBjKToKKyAgICAgICAgaWYgYyBpbiAiJ1wiIjoKKyAgICAgICAgICAgIHN0ciA9IHNlbGYubGV4X2FyZ19xdW90ZWQoYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0ciA9IGMKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgIT0gc2VsZi5lbmQ6CisgICAgICAgICAgICBjID0gc2VsZi5sb29rKCkKKyAgICAgICAgICAgIGlmIGMuaXNzcGFjZSgpIG9yIGMgaW4gInwmIjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBjIGluICc+PCc6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIGFubm95aW5nIGNhc2U7IHdlIHRyZWF0ICcyPicgYXMgYSBzaW5nbGUgdG9rZW4gc28KKyAgICAgICAgICAgICAgICAjIHdlIGRvbid0IGhhdmUgdG8gdHJhY2sgd2hpdGVzcGFjZSB0b2tlbnMuCisKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBwYXJzZSBzdHJpbmcgaXNuJ3QgYW4gaW50ZWdlciwgZG8gdGhlIHVzdWFsIHRoaW5nLgorICAgICAgICAgICAgICAgIGlmIG5vdCBzdHIuaXNkaWdpdCgpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgIyBPdGhlcndpc2UsIGxleCB0aGUgb3BlcmF0b3IgYW5kIGNvbnZlcnQgdG8gYSByZWRpcmVjdGlvbgorICAgICAgICAgICAgICAgICMgdG9rZW4uCisgICAgICAgICAgICAgICAgbnVtID0gaW50KHN0cikKKyAgICAgICAgICAgICAgICB0b2sgPSBzZWxmLmxleF9vbmVfdG9rZW4oKQorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRvaywgdHVwbGUpIGFuZCBsZW4odG9rKSA9PSAxCisgICAgICAgICAgICAgICAgcmV0dXJuICh0b2tbMF0sIG51bSkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZWxpZiBjID09ICciJzoKKyAgICAgICAgICAgICAgICBzZWxmLmVhdCgpCisgICAgICAgICAgICAgICAgc3RyICs9IHNlbGYubGV4X2FyZ19xdW90ZWQoJyInKQorICAgICAgICAgICAgZWxpZiBjID09ICInIjoKKyAgICAgICAgICAgICAgICBzZWxmLmVhdCgpCisgICAgICAgICAgICAgICAgc3RyICs9IHNlbGYubGV4X2FyZ19xdW90ZWQoIiciKQorICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi53aW4zMkVzY2FwZXMgYW5kIGMgPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICAjIE91dHNpZGUgb2YgYSBzdHJpbmcsICdcXCcgZXNjYXBlcyBldmVyeXRoaW5nLgorICAgICAgICAgICAgICAgIHNlbGYuZWF0KCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnBvcyA9PSBzZWxmLmVuZDoKKyAgICAgICAgICAgICAgICAgICAgVXRpbC53YXJuaW5nKCJlc2NhcGUgYXQgZW5kIG9mIHF1b3RlZCBhcmd1bWVudCBpbjogJXIiICUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIKKyAgICAgICAgICAgICAgICBzdHIgKz0gc2VsZi5lYXQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHIgKz0gc2VsZi5lYXQoKQorICAgICAgICByZXR1cm4gc3RyCisKKyAgICBkZWYgbGV4X2FyZ19xdW90ZWQoc2VsZiwgZGVsaW0pOgorICAgICAgICBzdHIgPSAnJworICAgICAgICB3aGlsZSBzZWxmLnBvcyAhPSBzZWxmLmVuZDoKKyAgICAgICAgICAgIGMgPSBzZWxmLmVhdCgpCisgICAgICAgICAgICBpZiBjID09IGRlbGltOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIKKyAgICAgICAgICAgIGVsaWYgYyA9PSAnXFwnIGFuZCBkZWxpbSA9PSAnIic6CisgICAgICAgICAgICAgICAgIyBJbnNpZGUgYSAnIicgcXVvdGVkIHN0cmluZywgJ1xcJyBvbmx5IGVzY2FwZXMgdGhlIHF1b3RlCisgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIgYW5kIGJhY2tzbGFzaCwgb3RoZXJ3aXNlIGl0IGlzIHByZXNlcnZlZC4KKyAgICAgICAgICAgICAgICBpZiBzZWxmLnBvcyA9PSBzZWxmLmVuZDoKKyAgICAgICAgICAgICAgICAgICAgVXRpbC53YXJuaW5nKCJlc2NhcGUgYXQgZW5kIG9mIHF1b3RlZCBhcmd1bWVudCBpbjogJXIiICUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIKKyAgICAgICAgICAgICAgICBjID0gc2VsZi5lYXQoKQorICAgICAgICAgICAgICAgIGlmIGMgPT0gJyInOiAjIAorICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyInCisgICAgICAgICAgICAgICAgZWxpZiBjID09ICdcXCc6CisgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFwnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXCcgKyBjCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0ciArPSBjCisgICAgICAgIFV0aWwud2FybmluZygibWlzc2luZyBxdW90ZSBjaGFyYWN0ZXIgaW4gJXIiICUgc2VsZi5kYXRhKQorICAgICAgICByZXR1cm4gc3RyCisgICAgCisgICAgZGVmIGxleF9hcmdfY2hlY2tlZChzZWxmLCBjKToKKyAgICAgICAgcG9zID0gc2VsZi5wb3MKKyAgICAgICAgcmVzID0gc2VsZi5sZXhfYXJnX2Zhc3QoYykKKyAgICAgICAgZW5kID0gc2VsZi5wb3MKKworICAgICAgICBzZWxmLnBvcyA9IHBvcworICAgICAgICByZWZlcmVuY2UgPSBzZWxmLmxleF9hcmdfc2xvdyhjKQorICAgICAgICBpZiByZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiByZXMgIT0gcmVmZXJlbmNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIkZhc3QgcGF0aCBmYWlsdXJlOiAlciAhPSAlciIgJSAocmVzLCByZWZlcmVuY2UpCisgICAgICAgICAgICBpZiBzZWxmLnBvcyAhPSBlbmQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwiRmFzdCBwYXRoIGZhaWx1cmU6ICVyICE9ICVyIiAlIChzZWxmLnBvcywgZW5kKQorICAgICAgICByZXR1cm4gcmVmZXJlbmNlCisgICAgICAgIAorICAgIGRlZiBsZXhfYXJnKHNlbGYsIGMpOgorICAgICAgICByZXR1cm4gc2VsZi5sZXhfYXJnX2Zhc3QoYykgb3Igc2VsZi5sZXhfYXJnX3Nsb3coYykKKyAgICAgICAgCisgICAgZGVmIGxleF9vbmVfdG9rZW4oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBsZXhfb25lX3Rva2VuIC0gTGV4IGEgc2luZ2xlICdzaCcgdG9rZW4uICIiIgorCisgICAgICAgIGMgPSBzZWxmLmVhdCgpCisgICAgICAgIGlmIGMgaW4gJzshJzoKKyAgICAgICAgICAgIHJldHVybiAoYywpCisgICAgICAgIGlmIGMgPT0gJ3wnOgorICAgICAgICAgICAgaWYgc2VsZi5tYXliZV9lYXQoJ3wnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCd8fCcsKQorICAgICAgICAgICAgcmV0dXJuIChjLCkKKyAgICAgICAgaWYgYyA9PSAnJic6CisgICAgICAgICAgICBpZiBzZWxmLm1heWJlX2VhdCgnJicpOgorICAgICAgICAgICAgICAgIHJldHVybiAoJyYmJywpCisgICAgICAgICAgICBpZiBzZWxmLm1heWJlX2VhdCgnPicpOiAKKyAgICAgICAgICAgICAgICByZXR1cm4gKCcmPicsKQorICAgICAgICAgICAgcmV0dXJuIChjLCkKKyAgICAgICAgaWYgYyA9PSAnPic6CisgICAgICAgICAgICBpZiBzZWxmLm1heWJlX2VhdCgnJicpOgorICAgICAgICAgICAgICAgIHJldHVybiAoJz4mJywpCisgICAgICAgICAgICBpZiBzZWxmLm1heWJlX2VhdCgnPicpOgorICAgICAgICAgICAgICAgIHJldHVybiAoJz4+JywpCisgICAgICAgICAgICByZXR1cm4gKGMsKQorICAgICAgICBpZiBjID09ICc8JzoKKyAgICAgICAgICAgIGlmIHNlbGYubWF5YmVfZWF0KCcmJyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICgnPCYnLCkKKyAgICAgICAgICAgIGlmIHNlbGYubWF5YmVfZWF0KCc+Jyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICgnPDwnLCkKKyAgICAgICAgICAgIHJldHVybiAoYywpCisKKyAgICAgICAgcmV0dXJuIHNlbGYubGV4X2FyZyhjKQorCisgICAgZGVmIGxleChzZWxmKToKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgIT0gc2VsZi5lbmQ6CisgICAgICAgICAgICBpZiBzZWxmLmxvb2soKS5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgc2VsZi5lYXQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmxleF9vbmVfdG9rZW4oKQorCisjIyMKKyAKK2NsYXNzIFNoUGFyc2VyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB3aW4zMkVzY2FwZXMgPSBGYWxzZSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgc2VsZi50b2tlbnMgPSBTaExleGVyKGRhdGEsIHdpbjMyRXNjYXBlcyA9IHdpbjMyRXNjYXBlcykubGV4KCkKKyAgICAKKyAgICBkZWYgbGV4KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbnMubmV4dCgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAKKyAgICBkZWYgbG9vayhzZWxmKToKKyAgICAgICAgbmV4dCA9IHNlbGYubGV4KCkKKyAgICAgICAgaWYgbmV4dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudG9rZW5zID0gaXRlcnRvb2xzLmNoYWluKFtuZXh0XSwgc2VsZi50b2tlbnMpCisgICAgICAgIHJldHVybiBuZXh0CisgICAgCisgICAgZGVmIHBhcnNlX2NvbW1hbmQoc2VsZik6CisgICAgICAgIHRvayA9IHNlbGYubGV4KCkKKyAgICAgICAgaWYgbm90IHRvazoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsImVtcHR5IGNvbW1hbmQhIgorICAgICAgICBpZiBpc2luc3RhbmNlKHRvaywgdHVwbGUpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwic3ludGF4IGVycm9yIG5lYXIgdW5leHBlY3RlZCB0b2tlbiAlciIgJSB0b2tbMF0KKyAgICAgICAgCisgICAgICAgIGFyZ3MgPSBbdG9rXQorICAgICAgICByZWRpcmVjdHMgPSBbXQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdG9rID0gc2VsZi5sb29rKCkKKworICAgICAgICAgICAgIyBFT0Y/CisgICAgICAgICAgICBpZiB0b2sgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAjIElmIHRoaXMgaXMgYW4gYXJndW1lbnQsIGp1c3QgYWRkIGl0IHRvIHRoZSBjdXJyZW50IGNvbW1hbmQuCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRvaywgc3RyKToKKyAgICAgICAgICAgICAgICBhcmdzLmFwcGVuZChzZWxmLmxleCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgT3RoZXJ3aXNlIHNlZSBpZiBpdCBpcyBhIHRlcm1pbmF0b3IuCisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0b2ssIHR1cGxlKQorICAgICAgICAgICAgaWYgdG9rWzBdIGluICgnfCcsJzsnLCcmJywnfHwnLCcmJicpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgT3RoZXJ3aXNlIGl0IG11c3QgYmUgYSByZWRpcmVjdGlvbi4KKyAgICAgICAgICAgIG9wID0gc2VsZi5sZXgoKQorICAgICAgICAgICAgYXJnID0gc2VsZi5sZXgoKQorICAgICAgICAgICAgaWYgbm90IGFyZzoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCJzeW50YXggZXJyb3IgbmVhciB0b2tlbiAlciIgJSBvcFswXQorICAgICAgICAgICAgcmVkaXJlY3RzLmFwcGVuZCgob3AsIGFyZykpCisKKyAgICAgICAgcmV0dXJuIENvbW1hbmQoYXJncywgcmVkaXJlY3RzKQorCisgICAgZGVmIHBhcnNlX3BpcGVsaW5lKHNlbGYpOgorICAgICAgICBuZWdhdGUgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLmxvb2soKSA9PSAoJyEnLCk6CisgICAgICAgICAgICBzZWxmLmxleCgpCisgICAgICAgICAgICBuZWdhdGUgPSBUcnVlCisKKyAgICAgICAgY29tbWFuZHMgPSBbc2VsZi5wYXJzZV9jb21tYW5kKCldCisgICAgICAgIHdoaWxlIHNlbGYubG9vaygpID09ICgnfCcsKToKKyAgICAgICAgICAgIHNlbGYubGV4KCkKKyAgICAgICAgICAgIGNvbW1hbmRzLmFwcGVuZChzZWxmLnBhcnNlX2NvbW1hbmQoKSkKKyAgICAgICAgcmV0dXJuIFBpcGVsaW5lKGNvbW1hbmRzLCBuZWdhdGUpCisgICAgICAgICAgICAKKyAgICBkZWYgcGFyc2Uoc2VsZik6CisgICAgICAgIGxocyA9IHNlbGYucGFyc2VfcGlwZWxpbmUoKQorCisgICAgICAgIHdoaWxlIHNlbGYubG9vaygpOgorICAgICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLmxleCgpCisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvcGVyYXRvciwgdHVwbGUpIGFuZCBsZW4ob3BlcmF0b3IpID09IDEKKworICAgICAgICAgICAgaWYgbm90IHNlbGYubG9vaygpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtaXNzaW5nIGFyZ3VtZW50IHRvIG9wZXJhdG9yICVyIiAlIG9wZXJhdG9yWzBdCisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgRklYTUU6IE9wZXJhdG9yIHByZWNlZGVuY2UhIQorICAgICAgICAgICAgbGhzID0gU2VxKGxocywgb3BlcmF0b3JbMF0sIHNlbGYucGFyc2VfcGlwZWxpbmUoKSkKKworICAgICAgICByZXR1cm4gbGhzCisKKyMjIworCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgVGVzdFNoTGV4ZXIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBsZXgoc2VsZiwgc3RyLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gbGlzdChTaExleGVyKHN0ciwgKmFyZ3MsICoqa3dhcmdzKS5sZXgoKSkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCdhfGI+YyZkPGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAoJ3wnLCksICdiJywgKCc+JywpLCAnYycsICgnJicsKSwgJ2QnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc8JywpLCAnZSddKQorCisgICAgZGVmIHRlc3RfcmVkaXJlY3Rpb25fdG9rZW5zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCdhMj5jJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhMicsICgnPicsKSwgJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgnYSAyPmMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAoJz4nLDIpLCAnYyddKQorICAgICAgICAKKyAgICBkZWYgdGVzdF9xdW90aW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCIiIiAnYScgIiIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgiIiIgImhlbGxvXFwid29ybGQiICIiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydoZWxsbyJ3b3JsZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCIiIiAiaGVsbG9cXCd3b3JsZCIgIiIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbGxvXFwnd29ybGQiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgiIiIgImhlbGxvXFxcXHdvcmxkIiAiIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsiaGVsbG9cXHdvcmxkIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiIGhlImxsbyB3byJybGQgIiIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbGxvIHdvcmxkIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoIiIiIGFcXCBiIGFcXFxcYiAiIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsiYSBiIiwgImFcXGIiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgiIiIgIiIgIiIgIiIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbIiIsICIiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgiIiIgYVxcIGIgIiIiLCB3aW4zMkVzY2FwZXMgPSBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2FcXCcsICdiJ10pCisKK2NsYXNzIFRlc3RTaFBhcnNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgcGFyc2Uoc2VsZiwgc3RyKToKKyAgICAgICAgcmV0dXJuIFNoUGFyc2VyKHN0cikucGFyc2UoKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnZWNobyBoZWxsbycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnZWNobycsICdoZWxsbyddLCBbXSldLCBGYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnZWNobyAiIicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnZWNobycsICcnXSwgW10pXSwgRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoIiIiZWNobyAtREZPTz0nYSciIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnZWNobycsICctREZPTz1hJ10sIFtdKV0sIEZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdlY2hvIC1ERk9PPSJhIicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnZWNobycsICctREZPTz1hJ10sIFtdKV0sIEZhbHNlKSkKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2VjaG8gaGVsbG8gPiBjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydlY2hvJywgJ2hlbGxvJ10sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoKCgnPicpLCksICdjJyldKV0sIEZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdlY2hvIGhlbGxvID4gYyA+PiBkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydlY2hvJywgJ2hlbGxvJ10sIFsoKCc+JywpLCAnYycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCc+PicsKSwgJ2QnKV0pXSwgRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2EgMj4mMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbKCgnPiYnLDIpLCAnMScpXSldLCBGYWxzZSkpCisKKyAgICBkZWYgdGVzdF9waXBlbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdhIHwgYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQoWydiJ10sIFtdKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSB8IGIgfCBjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydhJ10sIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZChbJ2InXSwgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kKFsnYyddLCBbXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJyEgYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpKQorCisgICAgZGVmIHRlc3RfbGlzdChzZWxmKTogICAgICAgIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2EgOyBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydiJ10sIFtdKV0sIEZhbHNlKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdhICYgYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNlcShQaXBlbGluZShbQ29tbWFuZChbJ2EnXSwgW10pXSwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYiddLCBbXSldLCBGYWxzZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSAmJiBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcmJicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYiddLCBbXSldLCBGYWxzZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSB8fCBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd8fCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYiddLCBbXSldLCBGYWxzZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnYSAmJiBiIHx8IGMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXEoU2VxKFBpcGVsaW5lKFtDb21tYW5kKFsnYSddLCBbXSldLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJiYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydiJ10sIFtdKV0sIEZhbHNlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd8fCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnYyddLCBbXSldLCBGYWxzZSkpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UY2xVdGlsLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UY2xVdGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhM2YzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L1RjbFV0aWwucHkKQEAgLTAsMCArMSwzMjIgQEAKK2ltcG9ydCBpdGVydG9vbHMKKworZnJvbSBTaENvbW1hbmRzIGltcG9ydCBDb21tYW5kLCBQaXBlbGluZQorCitkZWYgdGNsX3ByZXByb2Nlc3MoZGF0YSk6CisgICAgIyBUY2wgaGFzIGEgcHJlcHJvY2Vzc2luZyBzdGVwIHRvIHJlcGxhY2UgZXNjYXBlZCBuZXdsaW5lcy4KKyAgICBpID0gZGF0YS5maW5kKCdcXFxuJykKKyAgICBpZiBpID09IC0xOgorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgIyBSZXBsYWNlICdcXFxuJyBhbmQgc3Vic2VxdWVudCB3aGl0ZXNwYWNlIGJ5IGEgc2luZ2xlIHNwYWNlLgorICAgIG4gPSBsZW4oZGF0YSkKKyAgICBzdHIgPSBkYXRhWzppXQorICAgIGkgKz0gMgorICAgIHdoaWxlIGkgPCBuIGFuZCBkYXRhW2ldIGluICcgXHQnOgorICAgICAgICBpICs9IDEKKyAgICByZXR1cm4gc3RyICsgJyAnICsgZGF0YVtpOl0KKworY2xhc3MgVGNsTGV4ZXI6CisgICAgIiIiVGNsTGV4ZXIgLSBMZXggYSBzdHJpbmcgaW50byAid29yZHMiLCBmb2xsb3dpbmcgdGhlIFRjbCBzeW50YXguIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZGF0YSA9IHRjbF9wcmVwcm9jZXNzKGRhdGEpCisgICAgICAgIHNlbGYucG9zID0gMAorICAgICAgICBzZWxmLmVuZCA9IGxlbihzZWxmLmRhdGEpCisKKyAgICBkZWYgYXRfZW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wb3MgPT0gc2VsZi5lbmQKKworICAgIGRlZiBlYXQoc2VsZik6CisgICAgICAgIGMgPSBzZWxmLmRhdGFbc2VsZi5wb3NdCisgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgcmV0dXJuIGMKKworICAgIGRlZiBsb29rKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhW3NlbGYucG9zXQorCisgICAgZGVmIG1heWJlX2VhdChzZWxmLCBjKToKKyAgICAgICAgIiIiCisgICAgICAgIG1heWJlX2VhdChjKSAtIENvbnN1bWUgdGhlIGNoYXJhY3RlciBjIGlmIGl0IGlzIHRoZSBuZXh0IGNoYXJhY3RlciwKKyAgICAgICAgcmV0dXJuaW5nIFRydWUgaWYgYSBjaGFyYWN0ZXIgd2FzIGNvbnN1bWVkLiAiIiIKKyAgICAgICAgaWYgc2VsZi5kYXRhW3NlbGYucG9zXSA9PSBjOgorICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZXNjYXBlKHNlbGYsIGMpOgorICAgICAgICBpZiBjID09ICdhJzoKKyAgICAgICAgICAgIHJldHVybiAnXHgwNycKKyAgICAgICAgZWxpZiBjID09ICdiJzoKKyAgICAgICAgICAgIHJldHVybiAnXHgwOCcKKyAgICAgICAgZWxpZiBjID09ICdmJzoKKyAgICAgICAgICAgIHJldHVybiAnXHgwYycKKyAgICAgICAgZWxpZiBjID09ICduJzoKKyAgICAgICAgICAgIHJldHVybiAnXG4nCisgICAgICAgIGVsaWYgYyA9PSAncic6CisgICAgICAgICAgICByZXR1cm4gJ1xyJworICAgICAgICBlbGlmIGMgPT0gJ3QnOgorICAgICAgICAgICAgcmV0dXJuICdcdCcKKyAgICAgICAgZWxpZiBjID09ICd2JzoKKyAgICAgICAgICAgIHJldHVybiAnXHgwYicKKyAgICAgICAgZWxpZiBjIGluICd1eG8nOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwnSW52YWxpZCBxdW90ZWQgY2hhcmFjdGVyICVyJyAlIGMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjCisgICAgICAgIAorICAgIGRlZiBsZXhfYnJhY2VkKHNlbGYpOgorICAgICAgICAjIExleCB1bnRpbCB3aGl0ZXNwYWNlIG9yIGVuZCBvZiBzdHJpbmcsIHRoZSBvcGVuaW5nIGJyYWNlIGhhcyBhbHJlYWR5CisgICAgICAgICMgYmVlbiBjb25zdW1lZC4KKworICAgICAgICBzdHIgPSAnJyAgICAgICAgCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBpZiBzZWxmLmF0X2VuZCgpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIlVudGVybWluYXRlZCAneycgcXVvdGVkIHdvcmQiCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGMgPSBzZWxmLmVhdCgpCisgICAgICAgICAgICBpZiBjID09ICd9JzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBjID09ICd7JzoKKyAgICAgICAgICAgICAgICBzdHIgKz0gJ3snICsgc2VsZi5sZXhfYnJhY2VkKCkgKyAnfScKKyAgICAgICAgICAgIGVsaWYgYyA9PSAnXFwnIGFuZCBzZWxmLmxvb2soKSBpbiAne30nOgorICAgICAgICAgICAgICAgIHN0ciArPSBzZWxmLmVhdCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0ciArPSBjCisKKyAgICAgICAgcmV0dXJuIHN0cgorCisgICAgZGVmIGxleF9xdW90ZWQoc2VsZik6CisgICAgICAgIHN0ciA9ICcnCisKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGlmIHNlbGYuYXRfZW5kKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwiVW50ZXJtaW5hdGVkICdcIicgcXVvdGVkIHdvcmQiCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGMgPSBzZWxmLmVhdCgpCisgICAgICAgICAgICBpZiBjID09ICciJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBjID09ICdcXCc6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5hdF9lbmQoKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwnTWlzc2luZyBxdW90ZWQgY2hhcmFjdGVyJworCisgICAgICAgICAgICAgICAgc3RyICs9IHNlbGYuZXNjYXBlKHNlbGYuZWF0KCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0ciArPSBjCisKKyAgICAgICAgcmV0dXJuIHN0cgorCisgICAgZGVmIGxleF91bnF1b3RlZChzZWxmLCBwcm9jZXNzX2FsbD1GYWxzZSk6CisgICAgICAgICMgTGV4IHVudGlsIHdoaXRlc3BhY2Ugb3IgZW5kIG9mIHN0cmluZy4KKyAgICAgICAgc3RyID0gJycKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuYXRfZW5kKCk6CisgICAgICAgICAgICBpZiBub3QgcHJvY2Vzc19hbGw6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5sb29rKCkuaXNzcGFjZSgpIG9yIHNlbGYubG9vaygpID09ICc7JzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgYyA9IHNlbGYuZWF0KCkKKyAgICAgICAgICAgIGlmIGMgPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmF0X2VuZCgpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCdNaXNzaW5nIHF1b3RlZCBjaGFyYWN0ZXInCisKKyAgICAgICAgICAgICAgICBzdHIgKz0gc2VsZi5lc2NhcGUoc2VsZi5lYXQoKSkKKyAgICAgICAgICAgIGVsaWYgYyA9PSAnWyc6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgKCdDb21tYW5kIHN1YnN0aXR1dGlvbiBpcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3Qgc3VwcG9ydGVkJykKKyAgICAgICAgICAgIGVsaWYgYyA9PSAnJCcgYW5kIG5vdCBzZWxmLmF0X2VuZCgpIGFuZCAoc2VsZi5sb29rKCkuaXNhbHBoYSgpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9vaygpID09ICd7Jyk6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgKCdWYXJpYWJsZSBzdWJzdGl0dXRpb24gaXMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90IHN1cHBvcnRlZCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0ciArPSBjCisKKyAgICAgICAgcmV0dXJuIHN0cgorCisgICAgZGVmIGxleF9vbmVfdG9rZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYubWF5YmVfZWF0KCciJyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5sZXhfcXVvdGVkKCkKKyAgICAgICAgZWxpZiBzZWxmLm1heWJlX2VhdCgneycpOgorICAgICAgICAgICAgIyBDaGVjayBmb3IgYXJndW1lbnQgc3Vic3RpdHV0aW9uLgorICAgICAgICAgICAgaWYgbm90IHNlbGYubWF5YmVfZWF0KCcqJyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubGV4X2JyYWNlZCgpCisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLm1heWJlX2VhdCgnfScpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyonICsgc2VsZi5sZXhfYnJhY2VkKCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIHNlbGYuYXRfZW5kKCkgb3Igc2VsZi5sb29rKCkuaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgIHJldHVybiAnKicKKworICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgIkFyZ3VtZW50IHN1YnN0aXR1dGlvbiBpcyB1bnN1cHBvcnRlZCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxleF91bnF1b3RlZCgpCisKKyAgICBkZWYgbGV4KHNlbGYpOgorICAgICAgICB3aGlsZSBub3Qgc2VsZi5hdF9lbmQoKToKKyAgICAgICAgICAgIGMgPSBzZWxmLmxvb2soKQorICAgICAgICAgICAgaWYgYyBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICBzZWxmLmVhdCgpCisgICAgICAgICAgICBlbGlmIGMgaW4gJztcbic6CisgICAgICAgICAgICAgICAgc2VsZi5lYXQoKQorICAgICAgICAgICAgICAgIHlpZWxkICgnOycsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmxleF9vbmVfdG9rZW4oKQorCitjbGFzcyBUY2xFeGVjQ29tbWFuZDoKKyAgICBrUmVkaXJlY3RQcmVmaXhlczEgPSAoJzwnLCAnPicpCisgICAga1JlZGlyZWN0UHJlZml4ZXMyID0gKCc8QCcsICc8PCcsICcyPicsICc+JicsICc+PicsICc+QCcpCisgICAga1JlZGlyZWN0UHJlZml4ZXMzID0gKCcyPkAnLCAnMj4+JywgJz4+JicsICc+JkAnKQorICAgIGtSZWRpcmVjdFByZWZpeGVzNCA9ICgnMj5AMScsKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3MpOgorICAgICAgICBzZWxmLmFyZ3MgPSBpdGVyKGFyZ3MpCisKKyAgICBkZWYgbGV4KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hcmdzLm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgbG9vayhzZWxmKToKKyAgICAgICAgbmV4dCA9IHNlbGYubGV4KCkKKyAgICAgICAgaWYgbmV4dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXJncyA9IGl0ZXJ0b29scy5jaGFpbihbbmV4dF0sIHNlbGYuYXJncykKKyAgICAgICAgcmV0dXJuIG5leHQKKworICAgIGRlZiBwYXJzZV9yZWRpcmVjdChzZWxmLCB0b2ssIGxlbmd0aCk6CisgICAgICAgIGlmIGxlbih0b2spID09IGxlbmd0aDoKKyAgICAgICAgICAgIGFyZyA9IHNlbGYubGV4KCkKKyAgICAgICAgICAgIGlmIGFyZyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsJ01pc3NpbmcgYXJndW1lbnQgdG8gJXIgcmVkaXJlY3Rpb24nICUgdG9rCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0b2ssYXJnID0gdG9rWzpsZW5ndGhdLHRva1tsZW5ndGg6XQorCisgICAgICAgIGlmIHRva1swXSA9PSAnMic6CisgICAgICAgICAgICBvcCA9ICh0b2tbMTpdLDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcCA9ICh0b2ssKQorICAgICAgICByZXR1cm4gKG9wLCBhcmcpCisKKyAgICBkZWYgcGFyc2VfcGlwZWxpbmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYubG9vaygpIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCJFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQgdG8gZXhlYyIKKworICAgICAgICBjb21tYW5kcyA9IFtDb21tYW5kKFtdLFtdKV0KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGFyZyA9IHNlbGYubGV4KCkKKyAgICAgICAgICAgIGlmIGFyZyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGFyZyA9PSAnfCc6CisgICAgICAgICAgICAgICAgY29tbWFuZHMuYXBwZW5kKENvbW1hbmQoW10sW10pKQorICAgICAgICAgICAgZWxpZiBhcmcgPT0gJ3wmJzoKKyAgICAgICAgICAgICAgICAjIFdyaXRlIHRoaXMgYXMgYSByZWRpcmVjdCBvZiBzdGRlcnI7IGl0IG11c3QgY29tZSBmaXJzdCBiZWNhdXNlCisgICAgICAgICAgICAgICAgIyBzdGRvdXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlZGlyZWN0ZWQuCisgICAgICAgICAgICAgICAgY29tbWFuZHNbLTFdLnJlZGlyZWN0cy5pbnNlcnQoMCwgKCgnPiYnLDIpLCcxJykpCisgICAgICAgICAgICAgICAgY29tbWFuZHMuYXBwZW5kKENvbW1hbmQoW10sW10pKQorICAgICAgICAgICAgZWxpZiBhcmdbOjRdIGluIFRjbEV4ZWNDb21tYW5kLmtSZWRpcmVjdFByZWZpeGVzNDoKKyAgICAgICAgICAgICAgICBjb21tYW5kc1stMV0ucmVkaXJlY3RzLmFwcGVuZChzZWxmLnBhcnNlX3JlZGlyZWN0KGFyZywgNCkpCisgICAgICAgICAgICBlbGlmIGFyZ1s6M10gaW4gVGNsRXhlY0NvbW1hbmQua1JlZGlyZWN0UHJlZml4ZXMzOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzWy0xXS5yZWRpcmVjdHMuYXBwZW5kKHNlbGYucGFyc2VfcmVkaXJlY3QoYXJnLCAzKSkKKyAgICAgICAgICAgIGVsaWYgYXJnWzoyXSBpbiBUY2xFeGVjQ29tbWFuZC5rUmVkaXJlY3RQcmVmaXhlczI6CisgICAgICAgICAgICAgICAgY29tbWFuZHNbLTFdLnJlZGlyZWN0cy5hcHBlbmQoc2VsZi5wYXJzZV9yZWRpcmVjdChhcmcsIDIpKQorICAgICAgICAgICAgZWxpZiBhcmdbOjFdIGluIFRjbEV4ZWNDb21tYW5kLmtSZWRpcmVjdFByZWZpeGVzMToKKyAgICAgICAgICAgICAgICBjb21tYW5kc1stMV0ucmVkaXJlY3RzLmFwcGVuZChzZWxmLnBhcnNlX3JlZGlyZWN0KGFyZywgMSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzWy0xXS5hcmdzLmFwcGVuZChhcmcpCisKKyAgICAgICAgcmV0dXJuIFBpcGVsaW5lKGNvbW1hbmRzLCBGYWxzZSwgcGlwZV9lcnI9VHJ1ZSkKKworICAgIGRlZiBwYXJzZShzZWxmKToKKyAgICAgICAgaWdub3JlU3RkZXJyID0gRmFsc2UKKyAgICAgICAga2VlcE5ld2xpbmUgPSBGYWxzZQorCisgICAgICAgICMgUGFyc2UgYXJndW1lbnRzLgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbmV4dCA9IHNlbGYubG9vaygpCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuZXh0LCBzdHIpIG9yIG5leHRbMF0gIT0gJy0nOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIG5leHQgPT0gJy0tJzoKKyAgICAgICAgICAgICAgICBzZWxmLmxleCgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgbmV4dCA9PSAnLWlnbm9yZXN0ZGVycic6CisgICAgICAgICAgICAgICAgaWdub3JlU3RkZXJyID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBuZXh0ID09ICcta2VlcG5ld2xpbmUnOgorICAgICAgICAgICAgICAgIGtlZXBOZXdsaW5lID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCJJbnZhbGlkIGV4ZWMgYXJndW1lbnQgJXIiICUgbmV4dAorCisgICAgICAgIHJldHVybiAoaWdub3JlU3RkZXJyLCBrZWVwTmV3bGluZSwgc2VsZi5wYXJzZV9waXBlbGluZSgpKQorCisjIyMKKworaW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RUY2xMZXhlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGxleChzZWxmLCBzdHIsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBsaXN0KFRjbExleGVyKHN0ciwgKmFyZ3MsICoqa3dhcmdzKS5sZXgoKSkKKworICAgIGRlZiB0ZXN0X3ByZXByb2Nlc3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsX3ByZXByb2Nlc3MoJ2EgYicpLCAnYSBiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2xfcHJlcHJvY2VzcygnYVxcXG5iIGMnKSwgJ2EgYiBjJykKKworICAgIGRlZiB0ZXN0X3VucXVvdGVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCdhIGIgYycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnYScsICdiJywgJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleChyJ2FcbmJcdGNcICcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnYVxuYlx0YyAnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleChyJ2EgXFxcJGIgYyAkXFwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCByJ1wkYicsICdjJywgJyRcXCddKQorCisgICAgZGVmIHRlc3RfYnJhY2VkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCdhIHtiIGN9IHt9JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgJ2IgYycsICcnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleChyJ2Ege2Ige2Ncbn19JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgJ2Ige2NcXG59J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgocidhIHtiXHt9JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgJ2J7J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgocid7Kn0nKSwgWycqJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgocid7Kn0gYScpLCBbJyonLCAnYSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KHIneyp9IGEnKSwgWycqJywgJ2EnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgne2FcXFxuICAgYn0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EgYiddKQorCisgICAgZGVmIHRlc3RfcXVvdGVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGV4KCdhICJiIGMiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgJ2IgYyddKQorCisgICAgZGVmIHRlc3RfdGVybWluYXRvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoJ2FcbmInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAoJzsnLCksICdiJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sZXgoJ2E7YicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnYScsICgnOycsKSwgJ2InXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxleCgnYSAgIDsgICBiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgKCc7JywpLCAnYiddKQorCitjbGFzcyBUZXN0VGNsRXhlY0NvbW1hbmQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBwYXJzZShzZWxmLCBzdHIpOgorICAgICAgICByZXR1cm4gVGNsRXhlY0NvbW1hbmQobGlzdChUY2xMZXhlcihzdHIpLmxleCgpKSkucGFyc2UoKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZSgnZWNobyBoZWxsbycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGYWxzZSwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lKFtDb21tYW5kKFsnZWNobycsICdoZWxsbyddLCBbXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSwgVHJ1ZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2UoJ2VjaG8gaGVsbG8gfCBncmVwIGhlbGxvJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZhbHNlLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydlY2hvJywgJ2hlbGxvJ10sIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQoWydncmVwJywgJ2hlbGxvJ10sIFtdKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlLCBUcnVlKSkpCisKKyAgICBkZWYgdGVzdF9yZWRpcmVjdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlKCdlY2hvIGhlbGxvID4gYSA+YiA+PmMgMj4gZCB8JiBlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZhbHNlLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmUoW0NvbW1hbmQoWydlY2hvJywgJ2hlbGxvJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoKCc+JicsMiksJzEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoJz4nLCksJ2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoJz4nLCksJ2InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoJz4+JywpLCdjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCc+JywyKSwnZCcpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kKFsnZSddLCBbXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSwgVHJ1ZSkpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UZXN0LnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMmUwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L1Rlc3QucHkKQEAgLTAsMCArMSw3OSBAQAoraW1wb3J0IG9zCisKKyMgVGVzdCByZXN1bHRzLgorCitjbGFzcyBUZXN0UmVzdWx0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBpc0ZhaWx1cmUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuaXNGYWlsdXJlID0gaXNGYWlsdXJlCisKK1BBU1MgICAgICAgID0gVGVzdFJlc3VsdCgnUEFTUycsIEZhbHNlKQorWEZBSUwgICAgICAgPSBUZXN0UmVzdWx0KCdYRkFJTCcsIEZhbHNlKQorRkFJTCAgICAgICAgPSBUZXN0UmVzdWx0KCdGQUlMJywgVHJ1ZSkKK1hQQVNTICAgICAgID0gVGVzdFJlc3VsdCgnWFBBU1MnLCBUcnVlKQorVU5SRVNPTFZFRCAgPSBUZXN0UmVzdWx0KCdVTlJFU09MVkVEJywgVHJ1ZSkKK1VOU1VQUE9SVEVEID0gVGVzdFJlc3VsdCgnVU5TVVBQT1JURUQnLCBGYWxzZSkKKworIyBUZXN0IGNsYXNzZXMuCisKK2NsYXNzIFRlc3RGb3JtYXQ6CisgICAgIiIiVGVzdEZvcm1hdCAtIFRlc3QgaW5mb3JtYXRpb24gcHJvdmlkZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworY2xhc3MgVGVzdFN1aXRlOgorICAgICIiIlRlc3RTdWl0ZSAtIEluZm9ybWF0aW9uIG9uIGEgZ3JvdXAgb2YgdGVzdHMuCisKKyAgICBBIHRlc3Qgc3VpdGUgZ3JvdXBzIHRvZ2V0aGVyIGEgc2V0IG9mIGxvZ2ljYWxseSByZWxhdGVkIHRlc3RzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHNvdXJjZV9yb290LCBleGVjX3Jvb3QsIGNvbmZpZyk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5zb3VyY2Vfcm9vdCA9IHNvdXJjZV9yb290CisgICAgICAgIHNlbGYuZXhlY19yb290ID0gZXhlY19yb290CisgICAgICAgICMgVGhlIHRlc3Qgc3VpdGUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKKworICAgIGRlZiBnZXRTb3VyY2VQYXRoKHNlbGYsIGNvbXBvbmVudHMpOgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuc291cmNlX3Jvb3QsICpjb21wb25lbnRzKQorCisgICAgZGVmIGdldEV4ZWNQYXRoKHNlbGYsIGNvbXBvbmVudHMpOgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuZXhlY19yb290LCAqY29tcG9uZW50cykKKworY2xhc3MgVGVzdDoKKyAgICAiIiJUZXN0IC0gSW5mb3JtYXRpb24gb24gYSBzaW5nbGUgdGVzdCBpbnN0YW5jZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdWl0ZSwgcGF0aF9pbl9zdWl0ZSwgY29uZmlnKToKKyAgICAgICAgc2VsZi5zdWl0ZSA9IHN1aXRlCisgICAgICAgIHNlbGYucGF0aF9pbl9zdWl0ZSA9IHBhdGhfaW5fc3VpdGUKKyAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKKyAgICAgICAgIyBUaGUgdGVzdCByZXN1bHQgY29kZSwgb25jZSBjb21wbGV0ZS4KKyAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCisgICAgICAgICMgQW55IGFkZGl0aW9uYWwgb3V0cHV0IGZyb20gdGhlIHRlc3QsIG9uY2UgY29tcGxldGUuCisgICAgICAgIHNlbGYub3V0cHV0ID0gTm9uZQorICAgICAgICAjIFRoZSB3YWxsIHRpbWUgdG8gZXhlY3V0ZSB0aGlzIHRlc3QsIGlmIHRpbWluZyBhbmQgb25jZSBjb21wbGV0ZS4KKyAgICAgICAgc2VsZi5lbGFwc2VkID0gTm9uZQorICAgICAgICAjIFRoZSByZXBlYXQgaW5kZXggb2YgdGhpcyB0ZXN0LCBvciBOb25lLgorICAgICAgICBzZWxmLmluZGV4ID0gTm9uZQorCisgICAgZGVmIGNvcHlXaXRoSW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICBpbXBvcnQgY29weQorICAgICAgICByZXMgPSBjb3B5LmNvcHkoc2VsZikKKyAgICAgICAgcmVzLmluZGV4ID0gaW5kZXgKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgZGVmIHNldFJlc3VsdChzZWxmLCByZXN1bHQsIG91dHB1dCwgZWxhcHNlZCk6CisgICAgICAgIGFzc2VydCBzZWxmLnJlc3VsdCBpcyBOb25lLCAiVGVzdCByZXN1bHQgYWxyZWFkeSBzZXQhIgorICAgICAgICBzZWxmLnJlc3VsdCA9IHJlc3VsdAorICAgICAgICBzZWxmLm91dHB1dCA9IG91dHB1dAorICAgICAgICBzZWxmLmVsYXBzZWQgPSBlbGFwc2VkCisKKyAgICBkZWYgZ2V0RnVsbE5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN1aXRlLmNvbmZpZy5uYW1lICsgJyA6OiAnICsgJy8nLmpvaW4oc2VsZi5wYXRoX2luX3N1aXRlKQorCisgICAgZGVmIGdldFNvdXJjZVBhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN1aXRlLmdldFNvdXJjZVBhdGgoc2VsZi5wYXRoX2luX3N1aXRlKQorCisgICAgZGVmIGdldEV4ZWNQYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZS5nZXRFeGVjUGF0aChzZWxmLnBhdGhfaW5fc3VpdGUpCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvbGl0L1Rlc3RGb3JtYXRzLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UZXN0Rm9ybWF0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTJkMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UZXN0Rm9ybWF0cy5weQpAQCAtMCwwICsxLDIxNCBAQAoraW1wb3J0IG9zCisKK2ltcG9ydCBUZXN0CitpbXBvcnQgVGVzdFJ1bm5lcgoraW1wb3J0IFV0aWwKKworY2xhc3MgR29vZ2xlVGVzdChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X3N1Yl9kaXIsIHRlc3Rfc3VmZml4KToKKyAgICAgICAgc2VsZi50ZXN0X3N1Yl9kaXIgPSBzdHIodGVzdF9zdWJfZGlyKQorICAgICAgICBzZWxmLnRlc3Rfc3VmZml4ID0gc3RyKHRlc3Rfc3VmZml4KQorCisgICAgZGVmIGdldEdUZXN0VGVzdHMoc2VsZiwgcGF0aCwgbGl0Q29uZmlnLCBsb2NhbENvbmZpZyk6CisgICAgICAgICIiImdldEdUZXN0VGVzdHMocGF0aCkgLSBbbmFtZV0KKworICAgICAgICBSZXR1cm4gdGhlIHRlc3RzIGF2YWlsYWJsZSBpbiBndGVzdCBleGVjdXRhYmxlLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgcGF0aDogU3RyaW5nIHBhdGggdG8gYSBndGVzdCBleGVjdXRhYmxlCisgICAgICAgICAgbGl0Q29uZmlnOiBMaXRDb25maWcgaW5zdGFuY2UKKyAgICAgICAgICBsb2NhbENvbmZpZzogVGVzdGluZ0NvbmZpZyBpbnN0YW5jZSIiIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmVzID0gVXRpbC5jYXB0dXJlKFtwYXRoLCAnLS1ndGVzdF9saXN0X3Rlc3RzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bG9jYWxDb25maWcuZW52aXJvbm1lbnQpLnNwbGl0KCdcbicpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGxpdENvbmZpZy5lcnJvcigidW5hYmxlIHRvIGRpc2NvdmVyIGdvb2dsZS10ZXN0cyBpbiAlciIgJSBwYXRoKQorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgICAgIG5lc3RlZF90ZXN0cyA9IFtdCisgICAgICAgIGZvciBsbiBpbiBsaW5lczoKKyAgICAgICAgICAgIGlmIG5vdCBsbi5zdHJpcCgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHByZWZpeCA9ICcnCisgICAgICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgICAgIHdoaWxlIGxuW2luZGV4KjI6aW5kZXgqMisyXSA9PSAnICAnOgorICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgIHdoaWxlIGxlbihuZXN0ZWRfdGVzdHMpID4gaW5kZXg6CisgICAgICAgICAgICAgICAgbmVzdGVkX3Rlc3RzLnBvcCgpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxuID0gbG5baW5kZXgqMjpdCisgICAgICAgICAgICBpZiBsbi5lbmRzd2l0aCgnLicpOgorICAgICAgICAgICAgICAgIG5lc3RlZF90ZXN0cy5hcHBlbmQobG4pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkICcnLmpvaW4obmVzdGVkX3Rlc3RzKSArIGxuCisKKyAgICBkZWYgZ2V0VGVzdHNJbkRpcmVjdG9yeShzZWxmLCB0ZXN0U3VpdGUsIHBhdGhfaW5fc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0Q29uZmlnLCBsb2NhbENvbmZpZyk6CisgICAgICAgIHNvdXJjZV9wYXRoID0gdGVzdFN1aXRlLmdldFNvdXJjZVBhdGgocGF0aF9pbl9zdWl0ZSkKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoc291cmNlX3BhdGgpOgorICAgICAgICAgICAgIyBDaGVjayBmb3IgdGhlIG9uZSBzdWJkaXJlY3RvcnkgKGJ1aWxkIGRpcmVjdG9yeSkgdGVzdHMgd2lsbCBiZSBpbi4KKyAgICAgICAgICAgIGlmIGZpbGVuYW1lICE9IHNlbGYudGVzdF9zdWJfZGlyOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9wYXRoLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGZvciBzdWJmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGZpbGVwYXRoKToKKyAgICAgICAgICAgICAgICBpZiBzdWJmaWxlbmFtZS5lbmRzd2l0aChzZWxmLnRlc3Rfc3VmZml4KToKKyAgICAgICAgICAgICAgICAgICAgZXhlY3BhdGggPSBvcy5wYXRoLmpvaW4oZmlsZXBhdGgsIHN1YmZpbGVuYW1lKQorCisgICAgICAgICAgICAgICAgICAgICMgRGlzY292ZXIgdGhlIHRlc3RzIGluIHRoaXMgZXhlY3V0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5nZXRHVGVzdFRlc3RzKGV4ZWNwYXRoLCBsaXRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbENvbmZpZyk6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGF0aCA9IHBhdGhfaW5fc3VpdGUgKyAoZmlsZW5hbWUsIHN1YmZpbGVuYW1lLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgVGVzdC5UZXN0KHRlc3RTdWl0ZSwgdGVzdFBhdGgsIGxvY2FsQ29uZmlnKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgdGVzdCwgbGl0Q29uZmlnKToKKyAgICAgICAgdGVzdFBhdGgsdGVzdE5hbWUgPSBvcy5wYXRoLnNwbGl0KHRlc3QuZ2V0U291cmNlUGF0aCgpKQorICAgICAgICB3aGlsZSBub3Qgb3MucGF0aC5leGlzdHModGVzdFBhdGgpOgorICAgICAgICAgICAgIyBIYW5kbGUgR1Rlc3QgcGFyYW1ldHJpemVkIGFuZCB0eXBlZCB0ZXN0cywgd2hvc2UgbmFtZSBpbmNsdWRlcworICAgICAgICAgICAgIyBzb21lICcvJ3MuCisgICAgICAgICAgICB0ZXN0UGF0aCwgbmFtZVByZWZpeCA9IG9zLnBhdGguc3BsaXQodGVzdFBhdGgpCisgICAgICAgICAgICB0ZXN0TmFtZSA9IG9zLnBhdGguam9pbihuYW1lUHJlZml4LCB0ZXN0TmFtZSkKKworICAgICAgICBjbWQgPSBbdGVzdFBhdGgsICctLWd0ZXN0X2ZpbHRlcj0nICsgdGVzdE5hbWVdCisgICAgICAgIGlmIGxpdENvbmZpZy51c2VWYWxncmluZDoKKyAgICAgICAgICAgIGNtZCA9IGxpdENvbmZpZy52YWxncmluZEFyZ3MgKyBjbWQKKworICAgICAgICBvdXQsIGVyciwgZXhpdENvZGUgPSBUZXN0UnVubmVyLmV4ZWN1dGVDb21tYW5kKAorICAgICAgICAgICAgY21kLCBlbnY9dGVzdC5jb25maWcuZW52aXJvbm1lbnQpCisgICAgICAgICAgICAKKyAgICAgICAgaWYgbm90IGV4aXRDb2RlOgorICAgICAgICAgICAgcmV0dXJuIFRlc3QuUEFTUywnJworCisgICAgICAgIHJldHVybiBUZXN0LkZBSUwsIG91dCArIGVycgorCisjIyMKKworY2xhc3MgRmlsZUJhc2VkVGVzdChvYmplY3QpOgorICAgIGRlZiBnZXRUZXN0c0luRGlyZWN0b3J5KHNlbGYsIHRlc3RTdWl0ZSwgcGF0aF9pbl9zdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRDb25maWcsIGxvY2FsQ29uZmlnKToKKyAgICAgICAgc291cmNlX3BhdGggPSB0ZXN0U3VpdGUuZ2V0U291cmNlUGF0aChwYXRoX2luX3N1aXRlKQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihzb3VyY2VfcGF0aCk6CisgICAgICAgICAgICAjIElnbm9yZSBkb3QgZmlsZXMgYW5kIGV4Y2x1ZGVkIHRlc3RzLgorICAgICAgICAgICAgaWYgKGZpbGVuYW1lLnN0YXJ0c3dpdGgoJy4nKSBvcgorICAgICAgICAgICAgICAgIGZpbGVuYW1lIGluIGxvY2FsQ29uZmlnLmV4Y2x1ZGVzKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfcGF0aCwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihmaWxlcGF0aCk6CisgICAgICAgICAgICAgICAgYmFzZSxleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGlmIGV4dCBpbiBsb2NhbENvbmZpZy5zdWZmaXhlczoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgVGVzdC5UZXN0KHRlc3RTdWl0ZSwgcGF0aF9pbl9zdWl0ZSArIChmaWxlbmFtZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxDb25maWcpCisKK2NsYXNzIFNoVGVzdChGaWxlQmFzZWRUZXN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhlY3V0ZV9leHRlcm5hbCA9IEZhbHNlKToKKyAgICAgICAgc2VsZi5leGVjdXRlX2V4dGVybmFsID0gZXhlY3V0ZV9leHRlcm5hbAorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgdGVzdCwgbGl0Q29uZmlnKToKKyAgICAgICAgcmV0dXJuIFRlc3RSdW5uZXIuZXhlY3V0ZVNoVGVzdCh0ZXN0LCBsaXRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlX2V4dGVybmFsKQorCitjbGFzcyBUY2xUZXN0KEZpbGVCYXNlZFRlc3QpOgorICAgIGRlZiBleGVjdXRlKHNlbGYsIHRlc3QsIGxpdENvbmZpZyk6CisgICAgICAgIHJldHVybiBUZXN0UnVubmVyLmV4ZWN1dGVUY2xUZXN0KHRlc3QsIGxpdENvbmZpZykKKworIyMjCisKK2ltcG9ydCByZQoraW1wb3J0IHRlbXBmaWxlCisKK2NsYXNzIE9uZUNvbW1hbmRQZXJGaWxlVGVzdDoKKyAgICAjIEZJWE1FOiBSZWZhY3RvciBpbnRvIGdlbmVyaWMgdGVzdCBmb3IgcnVubmluZyBzb21lIGNvbW1hbmQgb24gYSBkaXJlY3RvcnkKKyAgICAjIG9mIGlucHV0cy4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBkaXIsIHJlY3Vyc2l2ZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgcGF0dGVybj0iLioiLCB1c2VUZW1wSW5wdXQ9RmFsc2UpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGNvbW1hbmQsIHN0cik6CisgICAgICAgICAgICBzZWxmLmNvbW1hbmQgPSBbY29tbWFuZF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29tbWFuZCA9IGxpc3QoY29tbWFuZCkKKyAgICAgICAgaWYgZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGlyID0gc3RyKGRpcikKKyAgICAgICAgc2VsZi5kaXIgPSBkaXIKKyAgICAgICAgc2VsZi5yZWN1cnNpdmUgPSBib29sKHJlY3Vyc2l2ZSkKKyAgICAgICAgc2VsZi5wYXR0ZXJuID0gcmUuY29tcGlsZShwYXR0ZXJuKQorICAgICAgICBzZWxmLnVzZVRlbXBJbnB1dCA9IHVzZVRlbXBJbnB1dAorCisgICAgZGVmIGdldFRlc3RzSW5EaXJlY3Rvcnkoc2VsZiwgdGVzdFN1aXRlLCBwYXRoX2luX3N1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdENvbmZpZywgbG9jYWxDb25maWcpOgorICAgICAgICBkaXIgPSBzZWxmLmRpcgorICAgICAgICBpZiBkaXIgaXMgTm9uZToKKyAgICAgICAgICAgIGRpciA9IHRlc3RTdWl0ZS5nZXRTb3VyY2VQYXRoKHBhdGhfaW5fc3VpdGUpCisKKyAgICAgICAgZm9yIGRpcm5hbWUsc3ViZGlycyxmaWxlbmFtZXMgaW4gb3Mud2FsayhkaXIpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlOgorICAgICAgICAgICAgICAgIHN1YmRpcnNbOl0gPSBbXQorCisgICAgICAgICAgICBzdWJkaXJzWzpdID0gW2QgZm9yIGQgaW4gc3ViZGlycworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCAhPSAnLnN2bicgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkIG5vdCBpbiBsb2NhbENvbmZpZy5leGNsdWRlcyldCisKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lLnN0YXJ0c3dpdGgoJy4nKSBvcgorICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi5wYXR0ZXJuLm1hdGNoKGZpbGVuYW1lKSBvcgorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSBpbiBsb2NhbENvbmZpZy5leGNsdWRlcyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpcm5hbWUsZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc3VmZml4ID0gcGF0aFtsZW4oZGlyKTpdCisgICAgICAgICAgICAgICAgaWYgc3VmZml4LnN0YXJ0c3dpdGgob3Muc2VwKToKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gc3VmZml4WzE6XQorICAgICAgICAgICAgICAgIHRlc3QgPSBUZXN0LlRlc3QodGVzdFN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9pbl9zdWl0ZSArIHR1cGxlKHN1ZmZpeC5zcGxpdChvcy5zZXApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsQ29uZmlnKQorICAgICAgICAgICAgICAgICMgRklYTUU6IEhhY2s/CisgICAgICAgICAgICAgICAgdGVzdC5zb3VyY2VfcGF0aCA9IHBhdGgKKyAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0CisKKyAgICBkZWYgY3JlYXRlVGVtcElucHV0KHNlbGYsIHRtcCwgdGVzdCk6CisgICAgICAgIGFic3RyYWN0CisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCB0ZXN0LCBsaXRDb25maWcpOgorICAgICAgICBpZiB0ZXN0LmNvbmZpZy51bnN1cHBvcnRlZDoKKyAgICAgICAgICAgIHJldHVybiAoVGVzdC5VTlNVUFBPUlRFRCwgJ1Rlc3QgaXMgdW5zdXBwb3J0ZWQnKQorCisgICAgICAgIGNtZCA9IGxpc3Qoc2VsZi5jb21tYW5kKQorCisgICAgICAgICMgSWYgdXNpbmcgdGVtcCBpbnB1dCwgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgYW5kIGhhbmQgaXQgdG8gdGhlCisgICAgICAgICMgc3ViY2xhc3MuCisgICAgICAgIGlmIHNlbGYudXNlVGVtcElucHV0OgorICAgICAgICAgICAgdG1wID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKHN1ZmZpeD0nLmNwcCcpCisgICAgICAgICAgICBzZWxmLmNyZWF0ZVRlbXBJbnB1dCh0bXAsIHRlc3QpCisgICAgICAgICAgICB0bXAuZmx1c2goKQorICAgICAgICAgICAgY21kLmFwcGVuZCh0bXAubmFtZSkKKyAgICAgICAgZWxpZiBoYXNhdHRyKHRlc3QsICdzb3VyY2VfcGF0aCcpOgorICAgICAgICAgICAgY21kLmFwcGVuZCh0ZXN0LnNvdXJjZV9wYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kLmFwcGVuZCh0ZXN0LmdldFNvdXJjZVBhdGgoKSkKKworICAgICAgICBvdXQsIGVyciwgZXhpdENvZGUgPSBUZXN0UnVubmVyLmV4ZWN1dGVDb21tYW5kKGNtZCkKKworICAgICAgICBkaWFncyA9IG91dCArIGVycgorICAgICAgICBpZiBub3QgZXhpdENvZGUgYW5kIG5vdCBkaWFncy5zdHJpcCgpOgorICAgICAgICAgICAgcmV0dXJuIFRlc3QuUEFTUywnJworCisgICAgICAgICMgVHJ5IHRvIGluY2x1ZGUgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24uCisgICAgICAgIHJlcG9ydCA9ICIiIkNvbW1hbmQ6ICVzXG4iIiIgJSAnICcuam9pbihbIiclcyciICUgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGluIGNtZF0pCisgICAgICAgIGlmIHNlbGYudXNlVGVtcElucHV0OgorICAgICAgICAgICAgcmVwb3J0ICs9ICIiIlRlbXBvcmFyeSBGaWxlOiAlc1xuIiIiICUgdG1wLm5hbWUKKyAgICAgICAgICAgIHJlcG9ydCArPSAiLS1cbiVzLS1cbiIiIiAlIG9wZW4odG1wLm5hbWUpLnJlYWQoKQorICAgICAgICByZXBvcnQgKz0gIiIiT3V0cHV0OlxuLS1cbiVzLS0iIiIgJSBkaWFncworCisgICAgICAgIHJldHVybiBUZXN0LkZBSUwsIHJlcG9ydAorCitjbGFzcyBTeW50YXhDaGVja1Rlc3QoT25lQ29tbWFuZFBlckZpbGVUZXN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29tcGlsZXIsIGRpciwgZXh0cmFfY3h4X2FyZ3M9W10sICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGNtZCA9IFtjb21waWxlciwgJy14JywgJ2MrKycsICctZnN5bnRheC1vbmx5J10gKyBleHRyYV9jeHhfYXJncworICAgICAgICBPbmVDb21tYW5kUGVyRmlsZVRlc3QuX19pbml0X18oc2VsZiwgY21kLCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VUZW1wSW5wdXQ9MSwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGNyZWF0ZVRlbXBJbnB1dChzZWxmLCB0bXAsIHRlc3QpOgorICAgICAgICBwcmludCA+PnRtcCwgJyNpbmNsdWRlICIlcyInICUgdGVzdC5zb3VyY2VfcGF0aApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UZXN0UnVubmVyLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UZXN0UnVubmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjUxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L1Rlc3RSdW5uZXIucHkKQEAgLTAsMCArMSw1ODYgQEAKK2ltcG9ydCBvcywgc2lnbmFsLCBzdWJwcm9jZXNzLCBzeXMKK2ltcG9ydCBTdHJpbmdJTworCitpbXBvcnQgU2hVdGlsCitpbXBvcnQgVGVzdAoraW1wb3J0IFV0aWwKKworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgdGVtcGZpbGUKKworY2xhc3MgSW50ZXJuYWxTaGVsbEVycm9yKEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLmNvbW1hbmQgPSBjb21tYW5kCisgICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKwora0lzV2luZG93cyA9IHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJworCisjIERvbid0IHVzZSBjbG9zZV9mZHMgb24gV2luZG93cy4KK2tVc2VDbG9zZUZEcyA9IG5vdCBrSXNXaW5kb3dzCisKKyMgVXNlIHRlbXBvcmFyeSBmaWxlcyB0byByZXBsYWNlIC9kZXYvbnVsbCBvbiBXaW5kb3dzLgora0F2b2lkRGV2TnVsbCA9IGtJc1dpbmRvd3MKKworZGVmIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGN3ZD1Ob25lLCBlbnY9Tm9uZSk6CisgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwgY3dkPWN3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnYpCisgICAgb3V0LGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgIGV4aXRDb2RlID0gcC53YWl0KCkKKworICAgICMgRGV0ZWN0IEN0cmwtQyBpbiBzdWJwcm9jZXNzLgorICAgIGlmIGV4aXRDb2RlID09IC1zaWduYWwuU0lHSU5UOgorICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAorCisgICAgcmV0dXJuIG91dCwgZXJyLCBleGl0Q29kZQorCitkZWYgZXhlY3V0ZVNoQ21kKGNtZCwgY2ZnLCBjd2QsIHJlc3VsdHMpOgorICAgIGlmIGlzaW5zdGFuY2UoY21kLCBTaFV0aWwuU2VxKToKKyAgICAgICAgaWYgY21kLm9wID09ICc7JzoKKyAgICAgICAgICAgIHJlcyA9IGV4ZWN1dGVTaENtZChjbWQubGhzLCBjZmcsIGN3ZCwgcmVzdWx0cykKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRlU2hDbWQoY21kLnJocywgY2ZnLCBjd2QsIHJlc3VsdHMpCisKKyAgICAgICAgaWYgY21kLm9wID09ICcmJzoKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsInVuc3VwcG9ydGVkIHRlc3QgY29tbWFuZDogJyYnIgorCisgICAgICAgIGlmIGNtZC5vcCA9PSAnfHwnOgorICAgICAgICAgICAgcmVzID0gZXhlY3V0ZVNoQ21kKGNtZC5saHMsIGNmZywgY3dkLCByZXN1bHRzKQorICAgICAgICAgICAgaWYgcmVzICE9IDA6CisgICAgICAgICAgICAgICAgcmVzID0gZXhlY3V0ZVNoQ21kKGNtZC5yaHMsIGNmZywgY3dkLCByZXN1bHRzKQorICAgICAgICAgICAgcmV0dXJuIHJlcworICAgICAgICBpZiBjbWQub3AgPT0gJyYmJzoKKyAgICAgICAgICAgIHJlcyA9IGV4ZWN1dGVTaENtZChjbWQubGhzLCBjZmcsIGN3ZCwgcmVzdWx0cykKKyAgICAgICAgICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiByZXMKKworICAgICAgICAgICAgaWYgcmVzID09IDA6CisgICAgICAgICAgICAgICAgcmVzID0gZXhlY3V0ZVNoQ21kKGNtZC5yaHMsIGNmZywgY3dkLCByZXN1bHRzKQorICAgICAgICAgICAgcmV0dXJuIHJlcworCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsJ1Vua25vd24gc2hlbGwgY29tbWFuZDogJXInICUgY21kLm9wCisKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShjbWQsIFNoVXRpbC5QaXBlbGluZSkKKyAgICBwcm9jcyA9IFtdCisgICAgaW5wdXQgPSBzdWJwcm9jZXNzLlBJUEUKKyAgICBzdGRlcnJUZW1wRmlsZXMgPSBbXQorICAgIG9wZW5lZF9maWxlcyA9IFtdCisgICAgbmFtZWRfdGVtcF9maWxlcyA9IFtdCisgICAgIyBUbyBhdm9pZCBkZWFkbG9jaywgd2UgdXNlIGEgc2luZ2xlIHN0ZGVyciBzdHJlYW0gZm9yIHBpcGVkCisgICAgIyBvdXRwdXQuIFRoaXMgaXMgbnVsbCB1bnRpbCB3ZSBoYXZlIHNlZW4gc29tZSBvdXRwdXQgdXNpbmcKKyAgICAjIHN0ZGVyci4KKyAgICBmb3IgaSxqIGluIGVudW1lcmF0ZShjbWQuY29tbWFuZHMpOgorICAgICAgICAjIEFwcGx5IHRoZSByZWRpcmVjdGlvbnMsIHdlIHVzZSAoTiwpIGFzIGEgc2VudGluYWwgdG8gaW5kaWNhdGUgc3RkaW4sCisgICAgICAgICMgc3Rkb3V0LCBzdGRlcnIgZm9yIE4gZXF1YWwgdG8gMCwgMSwgb3IgMiByZXNwZWN0aXZlbHkuIFJlZGlyZWN0cyB0byBvcgorICAgICAgICAjIGZyb20gYSBmaWxlIGFyZSByZXByZXNlbnRlZCB3aXRoIGEgbGlzdCBbZmlsZSwgbW9kZSwgZmlsZS1vYmplY3RdCisgICAgICAgICMgd2hlcmUgZmlsZS1vYmplY3QgaXMgaW5pdGlhbGx5IE5vbmUuCisgICAgICAgIHJlZGlyZWN0cyA9IFsoMCwpLCAoMSwpLCAoMiwpXQorICAgICAgICBmb3IgciBpbiBqLnJlZGlyZWN0czoKKyAgICAgICAgICAgIGlmIHJbMF0gPT0gKCc+JywyKToKKyAgICAgICAgICAgICAgICByZWRpcmVjdHNbMl0gPSBbclsxXSwgJ3cnLCBOb25lXQorICAgICAgICAgICAgZWxpZiByWzBdID09ICgnPj4nLDIpOgorICAgICAgICAgICAgICAgIHJlZGlyZWN0c1syXSA9IFtyWzFdLCAnYScsIE5vbmVdCisgICAgICAgICAgICBlbGlmIHJbMF0gPT0gKCc+JicsMikgYW5kIHJbMV0gaW4gJzAxMic6CisgICAgICAgICAgICAgICAgcmVkaXJlY3RzWzJdID0gcmVkaXJlY3RzW2ludChyWzFdKV0KKyAgICAgICAgICAgIGVsaWYgclswXSA9PSAoJz4mJywpIG9yIHJbMF0gPT0gKCcmPicsKToKKyAgICAgICAgICAgICAgICByZWRpcmVjdHNbMV0gPSByZWRpcmVjdHNbMl0gPSBbclsxXSwgJ3cnLCBOb25lXQorICAgICAgICAgICAgZWxpZiByWzBdID09ICgnPicsKToKKyAgICAgICAgICAgICAgICByZWRpcmVjdHNbMV0gPSBbclsxXSwgJ3cnLCBOb25lXQorICAgICAgICAgICAgZWxpZiByWzBdID09ICgnPj4nLCk6CisgICAgICAgICAgICAgICAgcmVkaXJlY3RzWzFdID0gW3JbMV0sICdhJywgTm9uZV0KKyAgICAgICAgICAgIGVsaWYgclswXSA9PSAoJzwnLCk6CisgICAgICAgICAgICAgICAgcmVkaXJlY3RzWzBdID0gW3JbMV0sICdyJywgTm9uZV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwiVW5zdXBwb3J0ZWQgcmVkaXJlY3Q6ICVyIiAlIChyLCkKKworICAgICAgICAjIE1hcCBmcm9tIHRoZSBmaW5hbCByZWRpcmVjdGlvbnMgdG8gc29tZXRoaW5nIHN1YnByb2Nlc3MgY2FuIGhhbmRsZS4KKyAgICAgICAgZmluYWxfcmVkaXJlY3RzID0gW10KKyAgICAgICAgZm9yIGluZGV4LHIgaW4gZW51bWVyYXRlKHJlZGlyZWN0cyk6CisgICAgICAgICAgICBpZiByID09ICgwLCk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5wdXQKKyAgICAgICAgICAgIGVsaWYgciA9PSAoMSwpOgorICAgICAgICAgICAgICAgIGlmIGluZGV4ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsIlVuc3VwcG9ydGVkIHJlZGlyZWN0IGZvciBzdGRpbiIKKyAgICAgICAgICAgICAgICBlbGlmIGluZGV4ID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MuUElQRQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MuU1RET1VUCisgICAgICAgICAgICBlbGlmIHIgPT0gKDIsKToKKyAgICAgICAgICAgICAgICBpZiBpbmRleCAhPSAyOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCJVbnN1cHBvcnRlZCByZWRpcmVjdCBvbiBzdGRvdXQiCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHJbMl0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYga0F2b2lkRGV2TnVsbCBhbmQgclswXSA9PSAnL2Rldi9udWxsJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJbMl0gPSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKG1vZGU9clsxXSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJbMl0gPSBvcGVuKHJbMF0sIHJbMV0pCisgICAgICAgICAgICAgICAgICAgICMgV29ya2Fyb3VuZCBhIFdpbjMyIGFuZC9vciBzdWJwcm9jZXNzIGJ1ZyB3aGVuIGFwcGVuZGluZy4KKyAgICAgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiBBY3R1YWxseSwgdGhpcyBpcyBwcm9iYWJseSBhbiBpbnN0YW5jZSBvZiBQUjY3NTMuCisgICAgICAgICAgICAgICAgICAgIGlmIHJbMV0gPT0gJ2EnOgorICAgICAgICAgICAgICAgICAgICAgICAgclsyXS5zZWVrKDAsIDIpCisgICAgICAgICAgICAgICAgICAgIG9wZW5lZF9maWxlcy5hcHBlbmQoclsyXSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByWzJdCisgICAgICAgICAgICBmaW5hbF9yZWRpcmVjdHMuYXBwZW5kKHJlc3VsdCkKKworICAgICAgICBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIgPSBmaW5hbF9yZWRpcmVjdHMKKworICAgICAgICAjIElmIHN0ZGVyciB3YW50cyB0byBjb21lIGZyb20gc3Rkb3V0LCBidXQgc3Rkb3V0IGlzbid0IGEgcGlwZSwgdGhlbiBwdXQKKyAgICAgICAgIyBzdGRlcnIgb24gYSBwaXBlIGFuZCB0cmVhdCBpdCBhcyBzdGRvdXQuCisgICAgICAgIGlmIChzdGRlcnIgPT0gc3VicHJvY2Vzcy5TVERPVVQgYW5kIHN0ZG91dCAhPSBzdWJwcm9jZXNzLlBJUEUpOgorICAgICAgICAgICAgc3RkZXJyID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgICAgICBzdGRlcnJJc1N0ZG91dCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0ZGVycklzU3Rkb3V0ID0gRmFsc2UKKworICAgICAgICAgICAgIyBEb24ndCBhbGxvdyBzdGRlcnIgb24gYSBQSVBFIGV4Y2VwdCBmb3IgdGhlIGxhc3QKKyAgICAgICAgICAgICMgcHJvY2VzcywgdGhpcyBjb3VsZCBkZWFkbG9jay4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgRklYTUU6IFRoaXMgaXMgc2xvdywgYnV0IHNvIGlzIGRlYWRsb2NrLgorICAgICAgICAgICAgaWYgc3RkZXJyID09IHN1YnByb2Nlc3MuUElQRSBhbmQgaiAhPSBjbWQuY29tbWFuZHNbLTFdOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUobW9kZT0ndytiJykKKyAgICAgICAgICAgICAgICBzdGRlcnJUZW1wRmlsZXMuYXBwZW5kKChpLCBzdGRlcnIpKQorCisgICAgICAgICMgUmVzb2x2ZSB0aGUgZXhlY3V0YWJsZSBwYXRoIG91cnNlbHZlcy4KKyAgICAgICAgYXJncyA9IGxpc3Qoai5hcmdzKQorICAgICAgICBhcmdzWzBdID0gVXRpbC53aGljaChhcmdzWzBdLCBjZmcuZW52aXJvbm1lbnRbJ1BBVEgnXSkKKyAgICAgICAgaWYgbm90IGFyZ3NbMF06CisgICAgICAgICAgICByYWlzZSBJbnRlcm5hbFNoZWxsRXJyb3IoaiwgJyVyOiBjb21tYW5kIG5vdCBmb3VuZCcgJSBqLmFyZ3NbMF0pCisKKyAgICAgICAgIyBSZXBsYWNlIHVzZXMgb2YgL2Rldi9udWxsIHdpdGggdGVtcG9yYXJ5IGZpbGVzLgorICAgICAgICBpZiBrQXZvaWREZXZOdWxsOgorICAgICAgICAgICAgZm9yIGksYXJnIGluIGVudW1lcmF0ZShhcmdzKToKKyAgICAgICAgICAgICAgICBpZiBhcmcgPT0gIi9kZXYvbnVsbCI6CisgICAgICAgICAgICAgICAgICAgIGYgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoZGVsZXRlPUZhbHNlKQorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgbmFtZWRfdGVtcF9maWxlcy5hcHBlbmQoZi5uYW1lKQorICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gZi5uYW1lCisKKyAgICAgICAgcHJvY3MuYXBwZW5kKHN1YnByb2Nlc3MuUG9wZW4oYXJncywgY3dkPWN3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW4gPSBzdGRpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IGNmZy5lbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzID0ga1VzZUNsb3NlRkRzKSkKKworICAgICAgICAjIEltbWVkaWF0ZWx5IGNsb3NlIHN0ZGluIGZvciBhbnkgcHJvY2VzcyB0YWtpbmcgc3RkaW4gZnJvbSB1cy4KKyAgICAgICAgaWYgc3RkaW4gPT0gc3VicHJvY2Vzcy5QSVBFOgorICAgICAgICAgICAgcHJvY3NbLTFdLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgIHByb2NzWy0xXS5zdGRpbiA9IE5vbmUKKworICAgICAgICAjIFVwZGF0ZSB0aGUgY3VycmVudCBzdGRpbiBzb3VyY2UuCisgICAgICAgIGlmIHN0ZG91dCA9PSBzdWJwcm9jZXNzLlBJUEU6CisgICAgICAgICAgICBpbnB1dCA9IHByb2NzWy0xXS5zdGRvdXQKKyAgICAgICAgZWxpZiBzdGRlcnJJc1N0ZG91dDoKKyAgICAgICAgICAgIGlucHV0ID0gcHJvY3NbLTFdLnN0ZGVycgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5wdXQgPSBzdWJwcm9jZXNzLlBJUEUKKworICAgICMgRklYTUU6IFRoZXJlIGlzIHByb2JhYmx5IHN0aWxsIGRlYWRsb2NrIHBvdGVudGlhbCBoZXJlLiBZYXduLgorICAgIHByb2NEYXRhID0gW05vbmVdICogbGVuKHByb2NzKQorICAgIHByb2NEYXRhWy0xXSA9IHByb2NzWy0xXS5jb21tdW5pY2F0ZSgpCisKKyAgICBmb3IgaSBpbiByYW5nZShsZW4ocHJvY3MpIC0gMSk6CisgICAgICAgIGlmIHByb2NzW2ldLnN0ZG91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG91dCA9IHByb2NzW2ldLnN0ZG91dC5yZWFkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dCA9ICcnCisgICAgICAgIGlmIHByb2NzW2ldLnN0ZGVyciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVyciA9IHByb2NzW2ldLnN0ZGVyci5yZWFkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVyciA9ICcnCisgICAgICAgIHByb2NEYXRhW2ldID0gKG91dCxlcnIpCisKKyAgICAjIFJlYWQgc3RkZXJyIG91dCBvZiB0aGUgdGVtcCBmaWxlcy4KKyAgICBmb3IgaSxmIGluIHN0ZGVyclRlbXBGaWxlczoKKyAgICAgICAgZi5zZWVrKDAsIDApCisgICAgICAgIHByb2NEYXRhW2ldID0gKHByb2NEYXRhW2ldWzBdLCBmLnJlYWQoKSkKKworICAgIGV4aXRDb2RlID0gTm9uZQorICAgIGZvciBpLChvdXQsZXJyKSBpbiBlbnVtZXJhdGUocHJvY0RhdGEpOgorICAgICAgICByZXMgPSBwcm9jc1tpXS53YWl0KCkKKyAgICAgICAgIyBEZXRlY3QgQ3RybC1DIGluIHN1YnByb2Nlc3MuCisgICAgICAgIGlmIHJlcyA9PSAtc2lnbmFsLlNJR0lOVDoKKyAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisKKyAgICAgICAgcmVzdWx0cy5hcHBlbmQoKGNtZC5jb21tYW5kc1tpXSwgb3V0LCBlcnIsIHJlcykpCisgICAgICAgIGlmIGNtZC5waXBlX2VycjoKKyAgICAgICAgICAgICMgUHl0aG9uIHRyZWF0cyB0aGUgZXhpdCBjb2RlIGFzIGEgc2lnbmVkIGNoYXIuCisgICAgICAgICAgICBpZiByZXMgPCAwOgorICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gbWluKGV4aXRDb2RlLCByZXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gbWF4KGV4aXRDb2RlLCByZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleGl0Q29kZSA9IHJlcworCisgICAgIyBFeHBsaWNpdGx5IGNsb3NlIGFueSByZWRpcmVjdGVkIGZpbGVzLgorICAgIGZvciBmIGluIG9wZW5lZF9maWxlczoKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAjIFJlbW92ZSBhbnkgbmFtZWQgdGVtcG9yYXJ5IGZpbGVzIHdlIGNyZWF0ZWQuCisgICAgZm9yIGYgaW4gbmFtZWRfdGVtcF9maWxlczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKGYpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgaWYgY21kLm5lZ2F0ZToKKyAgICAgICAgZXhpdENvZGUgPSBub3QgZXhpdENvZGUKKworICAgIHJldHVybiBleGl0Q29kZQorCitkZWYgZXhlY3V0ZVNjcmlwdEludGVybmFsKHRlc3QsIGxpdENvbmZpZywgdG1wQmFzZSwgY29tbWFuZHMsIGN3ZCk6CisgICAgbG4gPSAnICYmXG4nLmpvaW4oY29tbWFuZHMpCisgICAgdHJ5OgorICAgICAgICBjbWQgPSBTaFV0aWwuU2hQYXJzZXIobG4sIGxpdENvbmZpZy5pc1dpbmRvd3MpLnBhcnNlKCkKKyAgICBleGNlcHQ6CisgICAgICAgIHJldHVybiAoVGVzdC5GQUlMLCAic2hlbGwgcGFyc2VyIGVycm9yIG9uOiAlciIgJSBsbikKKworICAgIHJlc3VsdHMgPSBbXQorICAgIHRyeToKKyAgICAgICAgZXhpdENvZGUgPSBleGVjdXRlU2hDbWQoY21kLCB0ZXN0LmNvbmZpZywgY3dkLCByZXN1bHRzKQorICAgIGV4Y2VwdCBJbnRlcm5hbFNoZWxsRXJyb3IsZToKKyAgICAgICAgb3V0ID0gJycKKyAgICAgICAgZXJyID0gZS5tZXNzYWdlCisgICAgICAgIGV4aXRDb2RlID0gMjU1CisKKyAgICBvdXQgPSBlcnIgPSAnJworICAgIGZvciBpLChjbWQsIGNtZF9vdXQsY21kX2VycixyZXMpIGluIGVudW1lcmF0ZShyZXN1bHRzKToKKyAgICAgICAgb3V0ICs9ICdDb21tYW5kICVkOiAlc1xuJyAlIChpLCAnICcuam9pbignIiVzIicgJSBzIGZvciBzIGluIGNtZC5hcmdzKSkKKyAgICAgICAgb3V0ICs9ICdDb21tYW5kICVkIFJlc3VsdDogJXJcbicgJSAoaSwgcmVzKQorICAgICAgICBvdXQgKz0gJ0NvbW1hbmQgJWQgT3V0cHV0OlxuJXNcblxuJyAlIChpLCBjbWRfb3V0KQorICAgICAgICBvdXQgKz0gJ0NvbW1hbmQgJWQgU3RkZXJyOlxuJXNcblxuJyAlIChpLCBjbWRfZXJyKQorCisgICAgcmV0dXJuIG91dCwgZXJyLCBleGl0Q29kZQorCitkZWYgZXhlY3V0ZVRjbFNjcmlwdEludGVybmFsKHRlc3QsIGxpdENvbmZpZywgdG1wQmFzZSwgY29tbWFuZHMsIGN3ZCk6CisgICAgaW1wb3J0IFRjbFV0aWwKKyAgICBjbWRzID0gW10KKyAgICBmb3IgbG4gaW4gY29tbWFuZHM6CisgICAgICAgICMgR2l2ZW4gdGhlIHVuZm9ydHVuYXRlIHdheSBMTFZNJ3MgdGVzdCBhcmUgd3JpdHRlbiwgdGhlIGxpbmUgZ2V0cworICAgICAgICAjIGJhY2tzbGFzaCBzdWJzdGl0dXRpb24gZG9uZSB0d2ljZS4KKyAgICAgICAgbG4gPSBUY2xVdGlsLlRjbExleGVyKGxuKS5sZXhfdW5xdW90ZWQocHJvY2Vzc19hbGwgPSBUcnVlKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRva2VucyA9IGxpc3QoVGNsVXRpbC5UY2xMZXhlcihsbikubGV4KCkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiAoVGVzdC5GQUlMLCAiVGNsIGxleGVyIGVycm9yIG9uOiAlciIgJSBsbikKKworICAgICAgICAjIFZhbGlkYXRlIHRoZXJlIGFyZSBubyBjb250cm9sIHRva2Vucy4KKyAgICAgICAgZm9yIHQgaW4gdG9rZW5zOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodCwgc3RyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKFRlc3QuRkFJTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHRlc3QgbGluZTogJXIgY29udGFpbmluZyAlciIgJSAobG4sIHQpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZHMuYXBwZW5kKFRjbFV0aWwuVGNsRXhlY0NvbW1hbmQodG9rZW5zKS5wYXJzZV9waXBlbGluZSgpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gKFRlc3QuRkFJTCwgIlRjbCAnZXhlYycgcGFyc2UgZXJyb3Igb246ICVyIiAlIGxuKQorCisgICAgaWYgbGl0Q29uZmlnLnVzZVZhbGdyaW5kOgorICAgICAgICBmb3IgcGlwZWxpbmUgaW4gY21kczoKKyAgICAgICAgICAgIGlmIHBpcGVsaW5lLmNvbW1hbmRzOgorICAgICAgICAgICAgICAgICMgT25seSB2YWxncmluZCB0aGUgZmlyc3QgY29tbWFuZCBpbiBlYWNoIHBpcGVsaW5lLCB0byBhdm9pZAorICAgICAgICAgICAgICAgICMgdmFsZ3JpbmRpbmcgdGhpbmdzIGxpa2UgZ3JlcCwgbm90LCBhbmQgRmlsZUNoZWNrLgorICAgICAgICAgICAgICAgIGNtZCA9IHBpcGVsaW5lLmNvbW1hbmRzWzBdCisgICAgICAgICAgICAgICAgY21kLmFyZ3MgPSBsaXRDb25maWcudmFsZ3JpbmRBcmdzICsgY21kLmFyZ3MKKworICAgIGNtZCA9IGNtZHNbMF0KKyAgICBmb3IgYyBpbiBjbWRzWzE6XToKKyAgICAgICAgY21kID0gU2hVdGlsLlNlcShjbWQsICcmJicsIGMpCisKKyAgICAjIEZJWE1FOiBUaGlzIGlzIGxhbWUsIHdlIHNob3VsZG4ndCBuZWVkIGJhc2guIFNlZSBQUjUyNDAuCisgICAgYmFzaFBhdGggPSBsaXRDb25maWcuZ2V0QmFzaFBhdGgoKQorICAgIGlmIGxpdENvbmZpZy51c2VUY2xBc1NoIGFuZCBiYXNoUGF0aDoKKyAgICAgICAgc2NyaXB0ID0gdG1wQmFzZSArICcuc2NyaXB0JworCisgICAgICAgICMgV3JpdGUgc2NyaXB0IGZpbGUKKyAgICAgICAgZiA9IG9wZW4oc2NyaXB0LCd3JykKKyAgICAgICAgcHJpbnQgPj5mLCAnc2V0IC1vIHBpcGVmYWlsJworICAgICAgICBjbWQudG9TaGVsbChmLCBwaXBlZmFpbCA9IFRydWUpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGlmIDA6CisgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRvdXQsIGNtZAorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3Rkb3V0LCBvcGVuKHNjcmlwdCkucmVhZCgpCisgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRvdXQKKyAgICAgICAgICAgIHJldHVybiAnJywgJycsIDAKKworICAgICAgICBjb21tYW5kID0gW2xpdENvbmZpZy5nZXRCYXNoUGF0aCgpLCBzY3JpcHRdCisgICAgICAgIG91dCxlcnIsZXhpdENvZGUgPSBleGVjdXRlQ29tbWFuZChjb21tYW5kLCBjd2Q9Y3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PXRlc3QuY29uZmlnLmVudmlyb25tZW50KQorCisgICAgICAgIHJldHVybiBvdXQsZXJyLGV4aXRDb2RlCisgICAgZWxzZToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4aXRDb2RlID0gZXhlY3V0ZVNoQ21kKGNtZCwgdGVzdC5jb25maWcsIGN3ZCwgcmVzdWx0cykKKyAgICAgICAgZXhjZXB0IEludGVybmFsU2hlbGxFcnJvcixlOgorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKGUuY29tbWFuZCwgJycsIGUubWVzc2FnZSArICdcbicsIDI1NSkpCisgICAgICAgICAgICBleGl0Q29kZSA9IDI1NQorCisgICAgb3V0ID0gZXJyID0gJycKKworICAgIGZvciBpLChjbWQsIGNtZF9vdXQsIGNtZF9lcnIsIHJlcykgaW4gZW51bWVyYXRlKHJlc3VsdHMpOgorICAgICAgICBvdXQgKz0gJ0NvbW1hbmQgJWQ6ICVzXG4nICUgKGksICcgJy5qb2luKCciJXMiJyAlIHMgZm9yIHMgaW4gY21kLmFyZ3MpKQorICAgICAgICBvdXQgKz0gJ0NvbW1hbmQgJWQgUmVzdWx0OiAlclxuJyAlIChpLCByZXMpCisgICAgICAgIG91dCArPSAnQ29tbWFuZCAlZCBPdXRwdXQ6XG4lc1xuXG4nICUgKGksIGNtZF9vdXQpCisgICAgICAgIG91dCArPSAnQ29tbWFuZCAlZCBTdGRlcnI6XG4lc1xuXG4nICUgKGksIGNtZF9lcnIpCisKKyAgICByZXR1cm4gb3V0LCBlcnIsIGV4aXRDb2RlCisKK2RlZiBleGVjdXRlU2NyaXB0KHRlc3QsIGxpdENvbmZpZywgdG1wQmFzZSwgY29tbWFuZHMsIGN3ZCk6CisgICAgc2NyaXB0ID0gdG1wQmFzZSArICcuc2NyaXB0JworICAgIGlmIGxpdENvbmZpZy5pc1dpbmRvd3M6CisgICAgICAgIHNjcmlwdCArPSAnLmJhdCcKKworICAgICMgV3JpdGUgc2NyaXB0IGZpbGUKKyAgICBmID0gb3BlbihzY3JpcHQsJ3cnKQorICAgIGlmIGxpdENvbmZpZy5pc1dpbmRvd3M6CisgICAgICAgIGYud3JpdGUoJ1xuaWYgJUVSUk9STEVWRUwlIE5FUSAwIEVYSVRcbicuam9pbihjb21tYW5kcykpCisgICAgZWxzZToKKyAgICAgICAgZi53cml0ZSgnICYmXG4nLmpvaW4oY29tbWFuZHMpKQorICAgIGYud3JpdGUoJ1xuJykKKyAgICBmLmNsb3NlKCkKKworICAgIGlmIGxpdENvbmZpZy5pc1dpbmRvd3M6CisgICAgICAgIGNvbW1hbmQgPSBbJ2NtZCcsJy9jJywgc2NyaXB0XQorICAgIGVsc2U6CisgICAgICAgIGNvbW1hbmQgPSBbJy9iaW4vc2gnLCBzY3JpcHRdCisgICAgICAgIGlmIGxpdENvbmZpZy51c2VWYWxncmluZDoKKyAgICAgICAgICAgICMgRklYTUU6IFJ1bm5pbmcgdmFsZ3JpbmQgb24gc2ggaXMgb3ZlcmtpbGwuIFdlIHByb2JhYmx5IGNvdWxkIGp1c3QKKyAgICAgICAgICAgICMgcnVuIG9uIGNsYW5nIHdpdGggbm8gcmVhbCBsb3NzLgorICAgICAgICAgICAgY29tbWFuZCA9IGxpdENvbmZpZy52YWxncmluZEFyZ3MgKyBjb21tYW5kCisKKyAgICByZXR1cm4gZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgY3dkPWN3ZCwgZW52PXRlc3QuY29uZmlnLmVudmlyb25tZW50KQorCitkZWYgaXNFeHBlY3RlZEZhaWwoeGZhaWxzLCB4dGFyZ2V0cywgdGFyZ2V0X3RyaXBsZSk6CisgICAgIyBDaGVjayBpZiBhbnkgeGZhaWwgbWF0Y2hlcyB0aGlzIHRhcmdldC4KKyAgICBmb3IgaXRlbSBpbiB4ZmFpbHM6CisgICAgICAgIGlmIGl0ZW0gPT0gJyonIG9yIGl0ZW0gaW4gdGFyZ2V0X3RyaXBsZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIElmIHNvLCBzZWUgaWYgaXQgaXMgZXhwZWN0ZWQgdG8gcGFzcyBvbiB0aGlzIHRhcmdldC4KKyAgICAjCisgICAgIyBGSVhNRTogUmVuYW1lIFhUQVJHRVQgdG8gc29tZXRoaW5nIHRoYXQgbWFrZXMgc2Vuc2UsIGxpa2UgWFBBU1MuCisgICAgZm9yIGl0ZW0gaW4geHRhcmdldHM6CisgICAgICAgIGlmIGl0ZW0gPT0gJyonIG9yIGl0ZW0gaW4gdGFyZ2V0X3RyaXBsZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgcmV0dXJuIFRydWUKKworZGVmIHBhcnNlSW50ZWdyYXRlZFRlc3RTY3JpcHQodGVzdCwgbm9ybWFsaXplX3NsYXNoZXM9RmFsc2UpOgorICAgICIiInBhcnNlSW50ZWdyYXRlZFRlc3RTY3JpcHQgLSBTY2FuIGFuIExMVk0vQ2xhbmcgc3R5bGUgaW50ZWdyYXRlZCB0ZXN0CisgICAgc2NyaXB0IGFuZCBleHRyYWN0IHRoZSBsaW5lcyB0byAnUlVOJyBhcyB3ZWxsIGFzICdYRkFJTCcgYW5kICdYVEFSR0VUJworICAgIGluZm9ybWF0aW9uLiBUaGUgUlVOIGxpbmVzIGFsc28gd2lsbCBoYXZlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBwZXJmb3JtZWQuCisgICAgIiIiCisKKyAgICAjIEdldCB0aGUgdGVtcG9yYXJ5IGxvY2F0aW9uLCB0aGlzIGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgdGVzdCBzdWl0ZQorICAgICMgcm9vdCwgbm90IHRlc3Qgc291cmNlIHJvb3QuCisgICAgIworICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBoZXJlPworICAgIHNvdXJjZXBhdGggPSB0ZXN0LmdldFNvdXJjZVBhdGgoKQorICAgIHNvdXJjZWRpciA9IG9zLnBhdGguZGlybmFtZShzb3VyY2VwYXRoKQorICAgIGV4ZWNwYXRoID0gdGVzdC5nZXRFeGVjUGF0aCgpCisgICAgZXhlY2RpcixleGVjYmFzZSA9IG9zLnBhdGguc3BsaXQoZXhlY3BhdGgpCisgICAgdG1wQmFzZSA9IG9zLnBhdGguam9pbihleGVjZGlyLCAnT3V0cHV0JywgZXhlY2Jhc2UpCisgICAgaWYgdGVzdC5pbmRleCBpcyBub3QgTm9uZToKKyAgICAgICAgdG1wQmFzZSArPSAnXyVkJyAlIHRlc3QuaW5kZXgKKworICAgICMgTm9ybWFsaXplIHNsYXNoZXMsIGlmIHJlcXVlc3RlZC4KKyAgICBpZiBub3JtYWxpemVfc2xhc2hlczoKKyAgICAgICAgc291cmNlcGF0aCA9IHNvdXJjZXBhdGgucmVwbGFjZSgnXFwnLCAnLycpCisgICAgICAgIHNvdXJjZWRpciA9IHNvdXJjZWRpci5yZXBsYWNlKCdcXCcsICcvJykKKyAgICAgICAgdG1wQmFzZSA9IHRtcEJhc2UucmVwbGFjZSgnXFwnLCAnLycpCisKKyAgICAjIFdlIHVzZSAjX01BUktFUl8jIHRvIGhpZGUgJSUgd2hpbGUgd2UgZG8gdGhlIG90aGVyIHN1YnN0aXR1dGlvbnMuCisgICAgc3Vic3RpdHV0aW9ucyA9IFsoJyUlJywgJyNfTUFSS0VSXyMnKV0KKyAgICBzdWJzdGl0dXRpb25zLmV4dGVuZCh0ZXN0LmNvbmZpZy5zdWJzdGl0dXRpb25zKQorICAgIHN1YnN0aXR1dGlvbnMuZXh0ZW5kKFsoJyVzJywgc291cmNlcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnJVMnLCBzb3VyY2VkaXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJyVwJywgc291cmNlZGlyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCcldCcsIHRtcEJhc2UgKyAnLnRtcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlIHdlIGtpbGwgRGVqYUdOVS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCclYWJzX3RtcCcsIHRtcEJhc2UgKyAnLnRtcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJyNfTUFSS0VSXyMnLCAnJScpXSkKKworICAgICMgQ29sbGVjdCB0aGUgdGVzdCBsaW5lcyBmcm9tIHRoZSBzY3JpcHQuCisgICAgc2NyaXB0ID0gW10KKyAgICB4ZmFpbHMgPSBbXQorICAgIHh0YXJnZXRzID0gW10KKyAgICByZXF1aXJlcyA9IFtdCisgICAgZm9yIGxuIGluIG9wZW4oc291cmNlcGF0aCk6CisgICAgICAgIGlmICdSVU46JyBpbiBsbjoKKyAgICAgICAgICAgICMgSXNvbGF0ZSB0aGUgY29tbWFuZCB0byBydW4uCisgICAgICAgICAgICBpbmRleCA9IGxuLmluZGV4KCdSVU46JykKKyAgICAgICAgICAgIGxuID0gbG5baW5kZXgrNDpdCisKKyAgICAgICAgICAgICMgVHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAgICAgICAgbG4gPSBsbi5yc3RyaXAoKQorCisgICAgICAgICAgICAjIENvbGxhcHNlIGxpbmVzIHdpdGggdHJhaWxpbmcgJ1xcJy4KKyAgICAgICAgICAgIGlmIHNjcmlwdCBhbmQgc2NyaXB0Wy0xXVstMV0gPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICBzY3JpcHRbLTFdID0gc2NyaXB0Wy0xXVs6LTFdICsgbG4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZChsbikKKyAgICAgICAgZWxpZiAnWEZBSUw6JyBpbiBsbjoKKyAgICAgICAgICAgIGl0ZW1zID0gbG5bbG4uaW5kZXgoJ1hGQUlMOicpICsgNjpdLnNwbGl0KCcsJykKKyAgICAgICAgICAgIHhmYWlscy5leHRlbmQoW3Muc3RyaXAoKSBmb3IgcyBpbiBpdGVtc10pCisgICAgICAgIGVsaWYgJ1hUQVJHRVQ6JyBpbiBsbjoKKyAgICAgICAgICAgIGl0ZW1zID0gbG5bbG4uaW5kZXgoJ1hUQVJHRVQ6JykgKyA4Ol0uc3BsaXQoJywnKQorICAgICAgICAgICAgeHRhcmdldHMuZXh0ZW5kKFtzLnN0cmlwKCkgZm9yIHMgaW4gaXRlbXNdKQorICAgICAgICBlbGlmICdSRVFVSVJFUzonIGluIGxuOgorICAgICAgICAgICAgaXRlbXMgPSBsbltsbi5pbmRleCgnUkVRVUlSRVM6JykgKyA5Ol0uc3BsaXQoJywnKQorICAgICAgICAgICAgcmVxdWlyZXMuZXh0ZW5kKFtzLnN0cmlwKCkgZm9yIHMgaW4gaXRlbXNdKQorICAgICAgICBlbGlmICdFTkQuJyBpbiBsbjoKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIEVORC4gbGluZXMuCisgICAgICAgICAgICBpZiBsbltsbi5pbmRleCgnRU5ELicpOl0uc3RyaXAoKSA9PSAnRU5ELic6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICMgQXBwbHkgc3Vic3RpdHV0aW9ucyB0byB0aGUgc2NyaXB0LgorICAgIGRlZiBwcm9jZXNzTGluZShsbik6CisgICAgICAgICMgQXBwbHkgc3Vic3RpdHV0aW9ucworICAgICAgICBmb3IgYSxiIGluIHN1YnN0aXR1dGlvbnM6CisgICAgICAgICAgICBsbiA9IGxuLnJlcGxhY2UoYSxiKQorCisgICAgICAgICMgU3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUgYW5kIGFueSBleHRyYSB3aGl0ZXNwYWNlLgorICAgICAgICByZXR1cm4gbG4uc3RyaXAoKQorICAgIHNjcmlwdCA9IG1hcChwcm9jZXNzTGluZSwgc2NyaXB0KQorCisgICAgIyBWZXJpZnkgdGhlIHNjcmlwdCBjb250YWlucyBhIHJ1biBsaW5lLgorICAgIGlmIG5vdCBzY3JpcHQ6CisgICAgICAgIHJldHVybiAoVGVzdC5VTlJFU09MVkVELCAiVGVzdCBoYXMgbm8gcnVuIGxpbmUhIikKKworICAgICMgQ2hlY2sgZm9yIHVudGVybWluYXRlZCBydW4gbGluZXMuCisgICAgaWYgc2NyaXB0Wy0xXVstMV0gPT0gJ1xcJzoKKyAgICAgICAgcmV0dXJuIChUZXN0LlVOUkVTT0xWRUQsICJUZXN0IGhhcyB1bnRlcm1pbmF0ZWQgcnVuIGxpbmVzICh3aXRoICdcXCcpIikKKworICAgICMgQ2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSByZXF1aXJlZCBmZWF0dXJlczoKKyAgICBtaXNzaW5nX3JlcXVpcmVkX2ZlYXR1cmVzID0gW2YgZm9yIGYgaW4gcmVxdWlyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYgbm90IGluIHRlc3QuY29uZmlnLmF2YWlsYWJsZV9mZWF0dXJlc10KKyAgICBpZiBtaXNzaW5nX3JlcXVpcmVkX2ZlYXR1cmVzOgorICAgICAgICBtc2cgPSAnLCAnLmpvaW4obWlzc2luZ19yZXF1aXJlZF9mZWF0dXJlcykKKyAgICAgICAgcmV0dXJuIChUZXN0LlVOU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICJUZXN0IHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6ICVzIiAlIG1zZykKKworICAgIGlzWEZhaWwgPSBpc0V4cGVjdGVkRmFpbCh4ZmFpbHMsIHh0YXJnZXRzLCB0ZXN0LnN1aXRlLmNvbmZpZy50YXJnZXRfdHJpcGxlKQorICAgIHJldHVybiBzY3JpcHQsaXNYRmFpbCx0bXBCYXNlLGV4ZWNkaXIKKworZGVmIGZvcm1hdFRlc3RPdXRwdXQoc3RhdHVzLCBvdXQsIGVyciwgZXhpdENvZGUsIGZhaWxEdWVUb1N0ZGVyciwgc2NyaXB0KToKKyAgICBvdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgcHJpbnQgPj5vdXRwdXQsICJTY3JpcHQ6IgorICAgIHByaW50ID4+b3V0cHV0LCAiLS0iCisgICAgcHJpbnQgPj5vdXRwdXQsICdcbicuam9pbihzY3JpcHQpCisgICAgcHJpbnQgPj5vdXRwdXQsICItLSIKKyAgICBwcmludCA+Pm91dHB1dCwgIkV4aXQgQ29kZTogJXIiICUgZXhpdENvZGUsCisgICAgaWYgZmFpbER1ZVRvU3RkZXJyOgorICAgICAgICBwcmludCA+Pm91dHB1dCwgIihidXQgdGhlcmUgd2FzIG91dHB1dCBvbiBzdGRlcnIpIgorICAgIGVsc2U6CisgICAgICAgIHByaW50ID4+b3V0cHV0CisgICAgaWYgb3V0OgorICAgICAgICBwcmludCA+Pm91dHB1dCwgIkNvbW1hbmQgT3V0cHV0IChzdGRvdXQpOiIKKyAgICAgICAgcHJpbnQgPj5vdXRwdXQsICItLSIKKyAgICAgICAgb3V0cHV0LndyaXRlKG91dCkKKyAgICAgICAgcHJpbnQgPj5vdXRwdXQsICItLSIKKyAgICBpZiBlcnI6CisgICAgICAgIHByaW50ID4+b3V0cHV0LCAiQ29tbWFuZCBPdXRwdXQgKHN0ZGVycik6IgorICAgICAgICBwcmludCA+Pm91dHB1dCwgIi0tIgorICAgICAgICBvdXRwdXQud3JpdGUoZXJyKQorICAgICAgICBwcmludCA+Pm91dHB1dCwgIi0tIgorICAgIHJldHVybiAoc3RhdHVzLCBvdXRwdXQuZ2V0dmFsdWUoKSkKKworZGVmIGV4ZWN1dGVUY2xUZXN0KHRlc3QsIGxpdENvbmZpZyk6CisgICAgaWYgdGVzdC5jb25maWcudW5zdXBwb3J0ZWQ6CisgICAgICAgIHJldHVybiAoVGVzdC5VTlNVUFBPUlRFRCwgJ1Rlc3QgaXMgdW5zdXBwb3J0ZWQnKQorCisgICAgIyBQYXJzZSB0aGUgdGVzdCBzY3JpcHQsIG5vcm1hbGl6aW5nIHNsYXNoZXMgaW4gc3Vic3RpdHV0aW9ucyBvbiBXaW5kb3dzCisgICAgIyAoc2luY2Ugb3RoZXJ3aXNlIFRjbCBzdHlsZSBsZXhpbmcgd2lsbCB0cmVhdCB0aGVtIGFzIGVzY2FwZXMpLgorICAgIHJlcyA9IHBhcnNlSW50ZWdyYXRlZFRlc3RTY3JpcHQodGVzdCwgbm9ybWFsaXplX3NsYXNoZXM9a0lzV2luZG93cykKKyAgICBpZiBsZW4ocmVzKSA9PSAyOgorICAgICAgICByZXR1cm4gcmVzCisKKyAgICBzY3JpcHQsIGlzWEZhaWwsIHRtcEJhc2UsIGV4ZWNkaXIgPSByZXMKKworICAgIGlmIGxpdENvbmZpZy5ub0V4ZWN1dGU6CisgICAgICAgIHJldHVybiAoVGVzdC5QQVNTLCAnJykKKworICAgICMgQ3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgICAgVXRpbC5ta2Rpcl9wKG9zLnBhdGguZGlybmFtZSh0bXBCYXNlKSkKKworICAgIHJlcyA9IGV4ZWN1dGVUY2xTY3JpcHRJbnRlcm5hbCh0ZXN0LCBsaXRDb25maWcsIHRtcEJhc2UsIHNjcmlwdCwgZXhlY2RpcikKKyAgICBpZiBsZW4ocmVzKSA9PSAyOgorICAgICAgICByZXR1cm4gcmVzCisKKyAgICAjIFRlc3QgZm9yIGZhaWx1cmUuIEluIGFkZGl0aW9uIHRvIHRoZSBleGl0IGNvZGUsIFRjbCBjb21tYW5kcyBhcmUKKyAgICAjIGNvbnNpZGVyZWQgdG8gZmFpbCBpZiB0aGVyZSBpcyBhbnkgc3RhbmRhcmQgZXJyb3Igb3V0cHV0LgorICAgIG91dCxlcnIsZXhpdENvZGUgPSByZXMKKyAgICBpZiBpc1hGYWlsOgorICAgICAgICBvayA9IGV4aXRDb2RlICE9IDAgb3IgZXJyCisgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgc3RhdHVzID0gVGVzdC5YRkFJTAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdHVzID0gVGVzdC5YUEFTUworICAgIGVsc2U6CisgICAgICAgIG9rID0gZXhpdENvZGUgPT0gMCBhbmQgbm90IGVycgorICAgICAgICBpZiBvazoKKyAgICAgICAgICAgIHN0YXR1cyA9IFRlc3QuUEFTUworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdHVzID0gVGVzdC5GQUlMCisKKyAgICBpZiBvazoKKyAgICAgICAgcmV0dXJuIChzdGF0dXMsJycpCisKKyAgICAjIFNldCBhIGZsYWcgZm9yIGZvcm1hdFRlc3RPdXRwdXQgc28gaXQgY2FuIGV4cGxhaW4gd2h5IHRoZSB0ZXN0IHdhcworICAgICMgY29uc2lkZXJlZCB0byBoYXZlIGZhaWxlZCwgZGVzcGl0ZSBoYXZpbmcgYW4gZXhpdCBjb2RlIG9mIDAuCisgICAgZmFpbER1ZVRvU3RkZXJyID0gZXhpdENvZGUgPT0gMCBhbmQgZXJyCisKKyAgICByZXR1cm4gZm9ybWF0VGVzdE91dHB1dChzdGF0dXMsIG91dCwgZXJyLCBleGl0Q29kZSwgZmFpbER1ZVRvU3RkZXJyLCBzY3JpcHQpCisKK2RlZiBleGVjdXRlU2hUZXN0KHRlc3QsIGxpdENvbmZpZywgdXNlRXh0ZXJuYWxTaCk6CisgICAgaWYgdGVzdC5jb25maWcudW5zdXBwb3J0ZWQ6CisgICAgICAgIHJldHVybiAoVGVzdC5VTlNVUFBPUlRFRCwgJ1Rlc3QgaXMgdW5zdXBwb3J0ZWQnKQorCisgICAgcmVzID0gcGFyc2VJbnRlZ3JhdGVkVGVzdFNjcmlwdCh0ZXN0KQorICAgIGlmIGxlbihyZXMpID09IDI6CisgICAgICAgIHJldHVybiByZXMKKworICAgIHNjcmlwdCwgaXNYRmFpbCwgdG1wQmFzZSwgZXhlY2RpciA9IHJlcworCisgICAgaWYgbGl0Q29uZmlnLm5vRXhlY3V0ZToKKyAgICAgICAgcmV0dXJuIChUZXN0LlBBU1MsICcnKQorCisgICAgIyBDcmVhdGUgdGhlIG91dHB1dCBkaXJlY3RvcnkgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKyAgICBVdGlsLm1rZGlyX3Aob3MucGF0aC5kaXJuYW1lKHRtcEJhc2UpKQorCisgICAgaWYgdXNlRXh0ZXJuYWxTaDoKKyAgICAgICAgcmVzID0gZXhlY3V0ZVNjcmlwdCh0ZXN0LCBsaXRDb25maWcsIHRtcEJhc2UsIHNjcmlwdCwgZXhlY2RpcikKKyAgICBlbHNlOgorICAgICAgICByZXMgPSBleGVjdXRlU2NyaXB0SW50ZXJuYWwodGVzdCwgbGl0Q29uZmlnLCB0bXBCYXNlLCBzY3JpcHQsIGV4ZWNkaXIpCisgICAgaWYgbGVuKHJlcykgPT0gMjoKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgb3V0LGVycixleGl0Q29kZSA9IHJlcworICAgIGlmIGlzWEZhaWw6CisgICAgICAgIG9rID0gZXhpdENvZGUgIT0gMAorICAgICAgICBpZiBvazoKKyAgICAgICAgICAgIHN0YXR1cyA9IFRlc3QuWEZBSUwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YXR1cyA9IFRlc3QuWFBBU1MKKyAgICBlbHNlOgorICAgICAgICBvayA9IGV4aXRDb2RlID09IDAKKyAgICAgICAgaWYgb2s6CisgICAgICAgICAgICBzdGF0dXMgPSBUZXN0LlBBU1MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YXR1cyA9IFRlc3QuRkFJTAorCisgICAgaWYgb2s6CisgICAgICAgIHJldHVybiAoc3RhdHVzLCcnKQorCisgICAgIyBTaCB0ZXN0cyBhcmUgbm90IGNvbnNpZGVyZWQgdG8gZmFpbCBqdXN0IGZyb20gc3RkZXJyIG91dHB1dC4KKyAgICBmYWlsRHVlVG9TdGRlcnIgPSBGYWxzZQorCisgICAgcmV0dXJuIGZvcm1hdFRlc3RPdXRwdXQoc3RhdHVzLCBvdXQsIGVyciwgZXhpdENvZGUsIGZhaWxEdWVUb1N0ZGVyciwgc2NyaXB0KQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UZXN0aW5nQ29uZmlnLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9UZXN0aW5nQ29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMWIyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L1Rlc3RpbmdDb25maWcucHkKQEAgLTAsMCArMSwxMDEgQEAKK2ltcG9ydCBvcworCitjbGFzcyBUZXN0aW5nQ29uZmlnOgorICAgICIiIiIKKyAgICBUZXN0aW5nQ29uZmlnIC0gSW5mb3JtYXRpb24gb24gdGhlIHRlc3RzIGluc2lkZSBhIHN1aXRlLgorICAgICIiIgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmcm9tcGF0aChwYXRoLCBwYXJlbnQsIGxpdENvbmZpZywgbXVzdEV4aXN0LCBjb25maWcgPSBOb25lKToKKyAgICAgICAgaWYgY29uZmlnIGlzIE5vbmU6CisgICAgICAgICAgICAjIFNldCB0aGUgZW52aXJvbm1lbnQgYmFzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgICAgICAgICBlbnZpcm9ubWVudCA9IHsKKyAgICAgICAgICAgICAgICAnTERfTElCUkFSWV9QQVRIJyA6IG9zLmVudmlyb24uZ2V0KCdMRF9MSUJSQVJZX1BBVEgnLCcnKSwKKyAgICAgICAgICAgICAgICAnUEFUSCcgOiBvcy5wYXRoc2VwLmpvaW4obGl0Q29uZmlnLnBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3MuZW52aXJvbi5nZXQoJ1BBVEgnLCcnKV0pLAorICAgICAgICAgICAgICAgICdQQVRIRVhUJyA6IG9zLmVudmlyb24uZ2V0KCdQQVRIRVhUJywnJyksCisgICAgICAgICAgICAgICAgJ1NZU1RFTVJPT1QnIDogb3MuZW52aXJvbi5nZXQoJ1NZU1RFTVJPT1QnLCcnKSwKKyAgICAgICAgICAgICAgICAnTExWTV9ESVNBQkxFX0NSVF9ERUJVRycgOiAnMScsCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25maWcgPSBUZXN0aW5nQ29uZmlnKHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICc8dW5uYW1lZD4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IHNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Zvcm1hdCA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50ID0gZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbnMgPSBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgPSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fY2xvbmUgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2V4ZWNfcm9vdCA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc291cmNlX3Jvb3QgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlcyA9IFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVfZmVhdHVyZXMgPSBbXSkKKworICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICMgRklYTUU6IEltcHJvdmUgZGV0ZWN0aW9uIGFuZCBlcnJvciByZXBvcnRpbmcgb2YgZXJyb3JzIGluIHRoZQorICAgICAgICAgICAgIyBjb25maWcgZmlsZS4KKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgpCisgICAgICAgICAgICBjZmdfZ2xvYmFscyA9IGRpY3QoZ2xvYmFscygpKQorICAgICAgICAgICAgY2ZnX2dsb2JhbHNbJ2NvbmZpZyddID0gY29uZmlnCisgICAgICAgICAgICBjZmdfZ2xvYmFsc1snbGl0J10gPSBsaXRDb25maWcKKyAgICAgICAgICAgIGNmZ19nbG9iYWxzWydfX2ZpbGVfXyddID0gcGF0aAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGV4ZWMgZiBpbiBjZmdfZ2xvYmFscworICAgICAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQsc3RhdHVzOgorICAgICAgICAgICAgICAgICMgV2UgYWxsb3cgbm9ybWFsIHN5c3RlbSBleGl0IGluc2lkZSBhIGNvbmZpZyBmaWxlIHRvIGp1c3QKKyAgICAgICAgICAgICAgICAjIHJldHVybiBjb250cm9sIHdpdGhvdXQgZXJyb3IuCisgICAgICAgICAgICAgICAgaWYgc3RhdHVzLmFyZ3M6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZWxpZiBtdXN0RXhpc3Q6CisgICAgICAgICAgICBsaXRDb25maWcuZmF0YWwoJ3VuYWJsZSB0byBsb2FkIGNvbmZpZyBmcm9tICVyICcgJSBwYXRoKQorCisgICAgICAgIGNvbmZpZy5maW5pc2gobGl0Q29uZmlnKQorICAgICAgICByZXR1cm4gY29uZmlnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCBuYW1lLCBzdWZmaXhlcywgdGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgIGVudmlyb25tZW50LCBzdWJzdGl0dXRpb25zLCB1bnN1cHBvcnRlZCwgb25fY2xvbmUsCisgICAgICAgICAgICAgICAgIHRlc3RfZXhlY19yb290LCB0ZXN0X3NvdXJjZV9yb290LCBleGNsdWRlcywKKyAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2ZlYXR1cmVzKToKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5uYW1lID0gc3RyKG5hbWUpCisgICAgICAgIHNlbGYuc3VmZml4ZXMgPSBzZXQoc3VmZml4ZXMpCisgICAgICAgIHNlbGYudGVzdF9mb3JtYXQgPSB0ZXN0X2Zvcm1hdAorICAgICAgICBzZWxmLmVudmlyb25tZW50ID0gZGljdChlbnZpcm9ubWVudCkKKyAgICAgICAgc2VsZi5zdWJzdGl0dXRpb25zID0gbGlzdChzdWJzdGl0dXRpb25zKQorICAgICAgICBzZWxmLnVuc3VwcG9ydGVkID0gdW5zdXBwb3J0ZWQKKyAgICAgICAgc2VsZi5vbl9jbG9uZSA9IG9uX2Nsb25lCisgICAgICAgIHNlbGYudGVzdF9leGVjX3Jvb3QgPSB0ZXN0X2V4ZWNfcm9vdAorICAgICAgICBzZWxmLnRlc3Rfc291cmNlX3Jvb3QgPSB0ZXN0X3NvdXJjZV9yb290CisgICAgICAgIHNlbGYuZXhjbHVkZXMgPSBzZXQoZXhjbHVkZXMpCisgICAgICAgIHNlbGYuYXZhaWxhYmxlX2ZlYXR1cmVzID0gc2V0KGF2YWlsYWJsZV9mZWF0dXJlcykKKworICAgIGRlZiBjbG9uZShzZWxmLCBwYXRoKToKKyAgICAgICAgIyBGSVhNRTogQ2hhaW4gaW1wbGVtZW50YXRpb25zPworICAgICAgICAjCisgICAgICAgICMgRklYTUU6IEFsbG93IGV4dHJhIHBhcmFtZXRlcnM/CisgICAgICAgIGNmZyA9IFRlc3RpbmdDb25maWcoc2VsZiwgc2VsZi5uYW1lLCBzZWxmLnN1ZmZpeGVzLCBzZWxmLnRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW52aXJvbm1lbnQsIHNlbGYuc3Vic3RpdHV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVuc3VwcG9ydGVkLCBzZWxmLm9uX2Nsb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdF9leGVjX3Jvb3QsIHNlbGYudGVzdF9zb3VyY2Vfcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV4Y2x1ZGVzLCBzZWxmLmF2YWlsYWJsZV9mZWF0dXJlcykKKyAgICAgICAgaWYgY2ZnLm9uX2Nsb25lOgorICAgICAgICAgICAgY2ZnLm9uX2Nsb25lKHNlbGYsIGNmZywgcGF0aCkKKyAgICAgICAgcmV0dXJuIGNmZworCisgICAgZGVmIGZpbmlzaChzZWxmLCBsaXRDb25maWcpOgorICAgICAgICAiIiJmaW5pc2goKSAtIEZpbmlzaCB0aGlzIGNvbmZpZyBvYmplY3QsIGFmdGVyIGxvYWRpbmcgaXMgY29tcGxldGUuIiIiCisKKyAgICAgICAgc2VsZi5uYW1lID0gc3RyKHNlbGYubmFtZSkKKyAgICAgICAgc2VsZi5zdWZmaXhlcyA9IHNldChzZWxmLnN1ZmZpeGVzKQorICAgICAgICBzZWxmLmVudmlyb25tZW50ID0gZGljdChzZWxmLmVudmlyb25tZW50KQorICAgICAgICBzZWxmLnN1YnN0aXR1dGlvbnMgPSBsaXN0KHNlbGYuc3Vic3RpdHV0aW9ucykKKyAgICAgICAgaWYgc2VsZi50ZXN0X2V4ZWNfcm9vdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIHJlYWxseSBvbmx5IGJlIHN1aXRlIGluIHRlc3Qgc3VpdGUgY29uZmlnCisgICAgICAgICAgICAjIGZpbGVzLiBTaG91bGQgd2UgZGlzdGluZ3Vpc2ggdGhlbT8KKyAgICAgICAgICAgIHNlbGYudGVzdF9leGVjX3Jvb3QgPSBzdHIoc2VsZi50ZXN0X2V4ZWNfcm9vdCkKKyAgICAgICAgaWYgc2VsZi50ZXN0X3NvdXJjZV9yb290IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBGSVhNRTogVGhpcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgc3VpdGUgaW4gdGVzdCBzdWl0ZSBjb25maWcKKyAgICAgICAgICAgICMgZmlsZXMuIFNob3VsZCB3ZSBkaXN0aW5ndWlzaCB0aGVtPworICAgICAgICAgICAgc2VsZi50ZXN0X3NvdXJjZV9yb290ID0gc3RyKHNlbGYudGVzdF9zb3VyY2Vfcm9vdCkKKyAgICAgICAgc2VsZi5leGNsdWRlcyA9IHNldChzZWxmLmV4Y2x1ZGVzKQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9VdGlsLnB5IGIvc3JjL0xMVk0vdXRpbHMvbGl0L2xpdC9VdGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGI3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9saXQvbGl0L1V0aWwucHkKQEAgLTAsMCArMSwxMjUgQEAKK2ltcG9ydCBvcywgc3lzCisKK2RlZiBkZXRlY3RDUFVzKCk6CisgICAgIiIiCisgICAgRGV0ZWN0cyB0aGUgbnVtYmVyIG9mIENQVXMgb24gYSBzeXN0ZW0uIENyaWJiZWQgZnJvbSBwcC4KKyAgICAiIiIKKyAgICAjIExpbnV4LCBVbml4IGFuZCBNYWNPUzoKKyAgICBpZiBoYXNhdHRyKG9zLCAic3lzY29uZiIpOgorICAgICAgICBpZiBvcy5zeXNjb25mX25hbWVzLmhhc19rZXkoIlNDX05QUk9DRVNTT1JTX09OTE4iKToKKyAgICAgICAgICAgICMgTGludXggJiBVbml4OgorICAgICAgICAgICAgbmNwdXMgPSBvcy5zeXNjb25mKCJTQ19OUFJPQ0VTU09SU19PTkxOIikKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmNwdXMsIGludCkgYW5kIG5jcHVzID4gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmNwdXMKKyAgICAgICAgZWxzZTogIyBPU1g6CisgICAgICAgICAgICByZXR1cm4gaW50KG9zLnBvcGVuMigic3lzY3RsIC1uIGh3Lm5jcHUiKVsxXS5yZWFkKCkpCisgICAgIyBXaW5kb3dzOgorICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgiTlVNQkVSX09GX1BST0NFU1NPUlMiKToKKyAgICAgICAgbmNwdXMgPSBpbnQob3MuZW52aXJvblsiTlVNQkVSX09GX1BST0NFU1NPUlMiXSkKKyAgICAgICAgaWYgbmNwdXMgPiAwOgorICAgICAgICAgICAgcmV0dXJuIG5jcHVzCisgICAgcmV0dXJuIDEgIyBEZWZhdWx0CisKK2RlZiBta2Rpcl9wKHBhdGgpOgorICAgICIiIm1rZGlyX3AocGF0aCkgLSBNYWtlIHRoZSAicGF0aCIgZGlyZWN0b3J5LCBpZiBpdCBkb2VzIG5vdCBleGlzdDsgdGhpcworICAgIHdpbGwgYWxzbyBtYWtlIGRpcmVjdG9yaWVzIGZvciBhbnkgbWlzc2luZyBwYXJlbnQgZGlyZWN0b3JpZXMuIiIiCisgICAgaW1wb3J0IGVycm5vCisKKyAgICBpZiBub3QgcGF0aCBvciBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBwYXJlbnQgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkgCisgICAgaWYgcGFyZW50ICE9IHBhdGg6CisgICAgICAgIG1rZGlyX3AocGFyZW50KQorCisgICAgdHJ5OgorICAgICAgICBvcy5ta2RpcihwYXRoKQorICAgIGV4Y2VwdCBPU0Vycm9yLGU6CisgICAgICAgICMgSWdub3JlIEVFWElTVCwgd2hpY2ggbWF5IG9jY3VyIGR1cmluZyBhIHJhY2UgY29uZGl0aW9uLgorICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgIHJhaXNlCisKK2RlZiBjYXB0dXJlKGFyZ3MsIGVudj1Ob25lKToKKyAgICBpbXBvcnQgc3VicHJvY2VzcworICAgICIiImNhcHR1cmUoY29tbWFuZCkgLSBSdW4gdGhlIGdpdmVuIGNvbW1hbmQgKG9yIGFyZ3YgbGlzdCkgaW4gYSBzaGVsbCBhbmQKKyAgICByZXR1cm4gdGhlIHN0YW5kYXJkIG91dHB1dC4iIiIKKyAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnYpCisgICAgb3V0LF8gPSBwLmNvbW11bmljYXRlKCkKKyAgICByZXR1cm4gb3V0CisKK2RlZiB3aGljaChjb21tYW5kLCBwYXRocyA9IE5vbmUpOgorICAgICIiIndoaWNoKGNvbW1hbmQsIFtwYXRoc10pIC0gTG9vayB1cCB0aGUgZ2l2ZW4gY29tbWFuZCBpbiB0aGUgcGF0aHMgc3RyaW5nCisgICAgKG9yIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiB1bnNwZWNpZmllZCkuIiIiCisKKyAgICBpZiBwYXRocyBpcyBOb25lOgorICAgICAgICBwYXRocyA9IG9zLmVudmlyb24uZ2V0KCdQQVRIJywnJykKKworICAgICMgQ2hlY2sgZm9yIGFic29sdXRlIG1hdGNoIGZpcnN0LgorICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbW1hbmQpOgorICAgICAgICByZXR1cm4gY29tbWFuZAorCisgICAgIyBXb3VsZCBiZSBuaWNlIGlmIFB5dGhvbiBoYWQgYSBsaWIgZnVuY3Rpb24gZm9yIHRoaXMuCisgICAgaWYgbm90IHBhdGhzOgorICAgICAgICBwYXRocyA9IG9zLmRlZnBhdGgKKworICAgICMgR2V0IHN1ZmZpeGVzIHRvIHNlYXJjaC4KKyAgICBwYXRoZXh0ID0gb3MuZW52aXJvbi5nZXQoJ1BBVEhFWFQnLCAnJykuc3BsaXQob3MucGF0aHNlcCkKKworICAgICMgU2VhcmNoIHRoZSBwYXRocy4uLgorICAgIGZvciBwYXRoIGluIHBhdGhzLnNwbGl0KG9zLnBhdGhzZXApOgorICAgICAgICBmb3IgZXh0IGluIHBhdGhleHQ6CisgICAgICAgICAgICBwID0gb3MucGF0aC5qb2luKHBhdGgsIGNvbW1hbmQgKyBleHQpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwKToKKyAgICAgICAgICAgICAgICByZXR1cm4gcAorCisgICAgcmV0dXJuIE5vbmUKKworZGVmIHByaW50SGlzdG9ncmFtKGl0ZW1zLCB0aXRsZSA9ICdJdGVtcycpOgorICAgIGltcG9ydCBpdGVydG9vbHMsIG1hdGgKKworICAgIGl0ZW1zLnNvcnQoa2V5ID0gbGFtYmRhIChfLHYpOiB2KQorCisgICAgbWF4VmFsdWUgPSBtYXgoW3YgZm9yIF8sdiBpbiBpdGVtc10pCisKKyAgICAjIFNlbGVjdCBmaXJzdCAibmljZSIgYmFyIGhlaWdodCB0aGF0IHByb2R1Y2VzIG1vcmUgdGhhbiAxMCBiYXJzLgorICAgIHBvd2VyID0gaW50KG1hdGguY2VpbChtYXRoLmxvZyhtYXhWYWx1ZSwgMTApKSkKKyAgICBmb3IgaW5jIGluIGl0ZXJ0b29scy5jeWNsZSgoNSwgMiwgMi41LCAxKSk6CisgICAgICAgIGJhckggPSBpbmMgKiAxMCoqcG93ZXIKKyAgICAgICAgTiA9IGludChtYXRoLmNlaWwobWF4VmFsdWUgLyBiYXJIKSkKKyAgICAgICAgaWYgTiA+IDEwOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxpZiBpbmMgPT0gMToKKyAgICAgICAgICAgIHBvd2VyIC09IDEKKworICAgIGhpc3RvID0gW3NldCgpIGZvciBpIGluIHJhbmdlKE4pXQorICAgIGZvciBuYW1lLHYgaW4gaXRlbXM6CisgICAgICAgIGJpbiA9IG1pbihpbnQoTiAqIHYvbWF4VmFsdWUpLCBOLTEpCisgICAgICAgIGhpc3RvW2Jpbl0uYWRkKG5hbWUpCisKKyAgICBiYXJXID0gNDAKKyAgICBociA9ICctJyAqIChiYXJXICsgMzQpCisgICAgcHJpbnQgJ1xuU2xvd2VzdCAlczonICUgdGl0bGUKKyAgICBwcmludCBocgorICAgIGZvciBuYW1lLHZhbHVlIGluIGl0ZW1zWy0yMDpdOgorICAgICAgICBwcmludCAnJS4yZnM6ICVzJyAlICh2YWx1ZSwgbmFtZSkKKyAgICBwcmludCAnXG4lcyBUaW1lczonICUgdGl0bGUKKyAgICBwcmludCBocgorICAgIHBEaWdpdHMgPSBpbnQobWF0aC5jZWlsKG1hdGgubG9nKG1heFZhbHVlLCAxMCkpKQorICAgIHBmRGlnaXRzID0gbWF4KDAsIDMtcERpZ2l0cykKKyAgICBpZiBwZkRpZ2l0czoKKyAgICAgICAgcERpZ2l0cyArPSBwZkRpZ2l0cyArIDEKKyAgICBjRGlnaXRzID0gaW50KG1hdGguY2VpbChtYXRoLmxvZyhsZW4oaXRlbXMpLCAxMCkpKQorICAgIHByaW50ICJbJXNdIDo6IFslc10gOjogWyVzXSIgJSAoJ1JhbmdlJy5jZW50ZXIoKHBEaWdpdHMrMSkqMiArIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BlcmNlbnRhZ2UnLmNlbnRlcihiYXJXKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VudCcuY2VudGVyKGNEaWdpdHMqMiArIDEpKQorICAgIHByaW50IGhyCisgICAgZm9yIGkscm93IGluIGVudW1lcmF0ZShoaXN0byk6CisgICAgICAgIHBjdCA9IGZsb2F0KGxlbihyb3cpKSAvIGxlbihpdGVtcykKKyAgICAgICAgdyA9IGludChiYXJXICogcGN0KQorICAgICAgICBwcmludCAiWyUqLipmcywlKi4qZnMpIiAlIChwRGlnaXRzLCBwZkRpZ2l0cywgaSpiYXJILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlnaXRzLCBwZkRpZ2l0cywgKGkrMSkqYmFySCksCisgICAgICAgIHByaW50ICI6OiBbJXMlc10gOjogWyUqZC8lKmRdIiAlICgnKicqdywgJyAnKihiYXJXLXcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY0RpZ2l0cywgbGVuKHJvdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjRGlnaXRzLCBsZW4oaXRlbXMpKQorCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9saXQvc2V0dXAucHkgYi9zcmMvTExWTS91dGlscy9saXQvc2V0dXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhZTNkOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xpdC9zZXR1cC5weQpAQCAtMCwwICsxLDY5IEBACitpbXBvcnQgbGl0CisKKyMgRklYTUU6IFN1cHBvcnQgZGlzdHV0aWxzPworZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgZmluZF9wYWNrYWdlcworc2V0dXAoCisgICAgbmFtZSA9ICJMaXQiLAorICAgIHZlcnNpb24gPSBsaXQuX192ZXJzaW9uX18sCisKKyAgICBhdXRob3IgPSBsaXQuX19hdXRob3JfXywKKyAgICBhdXRob3JfZW1haWwgPSBsaXQuX19lbWFpbF9fLAorICAgIHVybCA9ICdodHRwOi8vbGx2bS5vcmcnLAorICAgIGxpY2Vuc2UgPSAnQlNEJywKKworICAgIGRlc2NyaXB0aW9uID0gIkEgU29mdHdhcmUgVGVzdGluZyBUb29sIiwKKyAgICBrZXl3b3JkcyA9ICd0ZXN0IEMrKyBhdXRvbWF0aWMgZGlzY292ZXJ5JywKKyAgICBsb25nX2Rlc2NyaXB0aW9uID0gIiIiXAorTGl0CisrKysKKworQWJvdXQKKz09PT09CisKK0xpdCBpcyBhIHBvcnRhYmxlIHRvb2wgZm9yIGV4ZWN1dGluZyBMTFZNIGFuZCBDbGFuZyBzdHlsZSB0ZXN0IHN1aXRlcywKK3N1bW1hcml6aW5nIHRoZWlyIHJlc3VsdHMsIGFuZCBwcm92aWRpbmcgaW5kaWNhdGlvbiBvZiBmYWlsdXJlcy4gTGl0IGlzIGRlc2lnbmVkCit0byBiZSBhIGxpZ2h0d2VpZ2h0IHRlc3RpbmcgdG9vbCB3aXRoIGFzIHNpbXBsZSBhIHVzZXIgaW50ZXJmYWNlIGFzIHBvc3NpYmxlLgorCisKK0ZlYXR1cmVzCis9PT09PT09PQorCisgKiBQb3J0YWJsZSEKKyAqIEZsZXhpYmxlIHRlc3QgZGlzY292ZXJ5LgorICogUGFyYWxsZWwgdGVzdCBleGVjdXRpb24uCisgKiBTdXBwb3J0IGZvciBtdWx0aXBsZSB0ZXN0IGZvcm1hdHMgYW5kIHRlc3Qgc3VpdGUgZGVzaWducy4KKworCitEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09CisKK1RoZSBvZmZpY2FsIExpdCBkb2N1bWVudGF0aW9uIGlzIGluIHRoZSBtYW4gcGFnZSwgYXZhaWxhYmxlIG9ubGluZSBpbiB0aGUgYExMVk0KK0NvbW1hbmQgR3VpZGUgaHR0cDovL2xsdm0ub3JnL2NtZHMvbGl0Lmh0bWxgXy4KKworCitTb3VyY2UKKz09PT09PQorCitUaGUgTGl0IHNvdXJjZSBpcyBhdmFpbGFibGUgYXMgcGFydCBvZiBMTFZNLCBpbiB0aGUgYExMVk0gU1ZOIHJlcG9zaXRvcnkKKzxodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9sbHZtL3RydW5rL3V0aWxzL2xpdGBfLgorIiIiLAorCisgICAgY2xhc3NpZmllcnM9WworICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDMgLSBBbHBoYScsCisgICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKKyAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAorICAgICAgICAnTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBIE9wZW4gU291cmNlIExpY2Vuc2UnLAorICAgICAgICAnTmF0dXJhbCBMYW5ndWFnZSA6OiBFbmdsaXNoJywKKyAgICAgICAgJ09wZXJhdGluZyBTeXN0ZW0gOjogT1MgSW5kZXBlbmRlbnQnLAorICAgICAgICAnUHJvZ2FtbWluZyBMYW5ndWFnZSA6OiBQeXRob24nLAorICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogVGVzdGluZycsCisgICAgICAgIF0sCisKKyAgICB6aXBfc2FmZSA9IEZhbHNlLAorICAgIHBhY2thZ2VzID0gZmluZF9wYWNrYWdlcygpLAorICAgIGVudHJ5X3BvaW50cyA9IHsKKyAgICAgICAgJ2NvbnNvbGVfc2NyaXB0cyc6IFsKKyAgICAgICAgICAgICdsaXQgPSBsaXQ6bWFpbicsCisgICAgICAgICAgICBdLAorICAgICAgICB9CispCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9sbHZtLW5hdGl2ZS1nY2MgYi9zcmMvTExWTS91dGlscy9sbHZtLW5hdGl2ZS1nY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0ZTAyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xsdm0tbmF0aXZlLWdjYwpAQCAtMCwwICsxLDI0OSBAQAorIyEvdXNyL2Jpbi9wZXJsDQorIyBXcmFwcGVyIGFyb3VuZCBMTFZNIHRvb2xzIHRvIGdlbmVyYXRlIGEgbmF0aXZlIC5vIGZyb20gbGx2bS1nY2MgdXNpbmcgYW4NCisjIExMVk0gYmFjay1lbmQgKENCRSBieSBkZWZhdWx0KS4NCisNCisjIHNldCB1cCBkZWZhdWx0cy4NCiskVmVyYm9zZSA9IDA7DQorJFNhdmVUZW1wcyA9IDE7DQorJFByZXByb2Nlc3NPbmx5ID0gMDsNCiskQ29tcGlsZURvbnRMaW5rID0gMDsNCiskQmFja2VuZCA9ICdjYmUnOw0KK2Nob21wICgkUHJvZ3JhbU5hbWUgPSBgYmFzZW5hbWUgJDBgKTsNCisNCitzdWIgYm9sZHByaW50IHsNCisJcHJpbnQgIhtbMW0iLCBAXywgIhtbMG0iOw0KK30NCisNCisjIHByb2Nlc3MgY29tbWFuZC1saW5lIG9wdGlvbnMuDQorIyBtb3N0IG9mIHRoZXNlIGFyZSBwYXNzZWQgb24gdG8gbGx2bS1nY2MuDQorJEdDQ09wdGlvbnMgPSAiIjsNCitmb3IgKCRpID0gMDsgJGkgPD0gJCNBUkdWOyArKyRpKSB7CQ0KKwlpZiAoJEFSR1ZbJGldID1+IC8tbWxsdm0tYmFja2VuZD0oW2EtejAtOV0qKS8pIHsNCisJCSRCYWNrZW5kID0gJDE7DQorCQlpZiAoJFByb2dyYW1OYW1lID1+IC9sbHZtLW5hdGl2ZS1nY2MvKSB7DQorCQkJc3BsaWNlIChAQVJHViwgJGksIDEpOw0KKwkJCS0tJGk7DQorCQl9DQorCX0gZWxzaWYgKCRBUkdWWyRpXSBlcSAiLUUiKSB7DQorCQkkUHJlcHJvY2Vzc09ubHkgPSAxOw0KKwl9IGVsc2lmICgkQVJHVlskaV0gZXEgIi1jIikgew0KKwkJJEdDQ09wdGlvbnMgLj0gIiAiIC4gJEFSR1ZbJGldOw0KKwkJJENvbXBpbGVEb250TGluayA9IDE7DQorCX0gZWxzaWYgKCRBUkdWWyRpXSBlcSAiLXYiKSB7DQorCQkkR0NDT3B0aW9ucyAuPSAiICIgLiAkQVJHVlskaV07DQorCQkkVmVyYm9zZSA9IDE7DQorCX0gZWxzaWYgKCRBUkdWWyRpXSBlcSAiLW8iKSB7DQorCQkkT3V0cHV0RmlsZSA9ICRBUkdWWyRpICsgMV07DQorCX0gZWxzaWYgKCRBUkdWWyRpXSBlcSAiLXNhdmUtdGVtcHMiKSB7DQorCQkkR0NDT3B0aW9ucyAuPSAiICIgLiAkQVJHVlskaV07DQorCQkkU2F2ZVRlbXBzID0gMTsNCisJfSBlbHNpZiAoJEFSR1ZbJGldID1+IC9cLmJjJC8pIHsNCisJCXB1c2ggKEBCeXRlY29kZUZpbGVzLCAkQVJHVlskaV0pOw0KKwl9IGVsc2lmICgkQVJHVlskaV0gPX4gL14tTC8pIHsNCisJCSRHQ0NPcHRpb25zIC49ICIgIiAuICRBUkdWWyRpXTsNCisJCXB1c2ggKEBMaWJEaXJzLCAkQVJHVlskaV0pOw0KKwl9IGVsc2lmICgkQVJHVlskaV0gPX4gL14tbC8pIHsNCisJCSRHQ0NPcHRpb25zIC49ICIgIiAuICRBUkdWWyRpXTsNCisJCXB1c2ggKEBMaWJzLCAkQVJHVlskaV0pOw0KKwl9IGVsc2lmICgkQVJHVlskaV0gPX4gL1wuKGN8Y3BwfGNjfGl8aWl8QykkLykgew0KKwkJJExhc3RDRmlsZSA9ICRBUkdWWyRpXTsNCisJfQ0KK30NCisNCitzdWIgR2V0RGVmYXVsdE91dHB1dEZpbGVOYW1lIHsNCisJbXkgJERlZmF1bHRPdXRwdXRGaWxlQmFzZTsNCisNCisJaWYgKCRQcm9ncmFtTmFtZSA9fiAvbGx2bS1uYXRpdmUtZ2NjLykgew0KKwkJJERlZmF1bHRPdXRwdXRGaWxlQmFzZSA9ICRMYXN0Q0ZpbGU7DQorCX0gZWxzaWYgKCRQcm9ncmFtTmFtZSA9fiAvbmF0aXZlLWJ1aWxkLykgew0KKwkJJERlZmF1bHRPdXRwdXRGaWxlQmFzZSA9ICRCeXRlY29kZUZpbGVzWzBdOw0KKwl9DQorDQorCW15ICRkZWYgPSAkRGVmYXVsdE91dHB1dEZpbGVCYXNlOw0KKw0KKwlkaWUgIkNhbid0IGZpZ3VyZSBvdXQgbmFtZSBvZiBvdXRwdXQgZmlsZS5cbiINCisJCXVubGVzcyAkRGVmYXVsdE91dHB1dEZpbGVCYXNlDQorCQkJICAgJiYgKCgkUHJvZ3JhbU5hbWUgIX4gL25hdGl2ZS1idWlsZC8pDQorCQkJCSAgIHx8ICQjQnl0ZWNvZGVGaWxlcyA9PSAwKTsNCisNCisJcHJpbnQgIldhcm5pbmc6IGRlZmF1bHRpbmcgb3V0cHV0IGZpbGUgbmFtZSAiLA0KKwkJImJhc2VkIG9uICckRGVmYXVsdE91dHB1dEZpbGVCYXNlJ1xuIiBpZiAkVmVyYm9zZTsNCisNCisJaWYgKCRQcm9ncmFtTmFtZSA9fiAvbGx2bS1uYXRpdmUtZ2NjLykgew0KKwkJJGRlZiA9fiBzL1wuKGN8Y3BwfGNjfGl8aWl8QykkLy5vLzsNCisJfSBlbHNpZiAoJFByb2dyYW1OYW1lID1+IC9uYXRpdmUtYnVpbGQvKSB7DQorCQkkZGVmID1+IHMvXC5iYyQvLiRCYWNrZW5kLzsNCisJCWlmICgkQ29tcGlsZURvbnRMaW5rKSB7DQorCQkJJGRlZiAuPSAiLm8iOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiAkZGVmOw0KK30NCisNCisjIHJ1biBhIGNvbW1hbmQsIG9wdGlvbmFsbHkgZWNob2luZywgYW5kIHF1aXR0aW5nIGlmIGl0IGZhaWxzOg0KK3N1YiBydW4gew0KKwlteSAkY29tbWFuZCA9IGpvaW4oIiAiLCBAXyk7DQorCXByaW50ICIkY29tbWFuZFxuIiBpZiAkVmVyYm9zZTsNCisJJGNvbW1hbmQgPX4gcy9cIi9cXFwiL2c7DQorCXN5c3RlbSAkY29tbWFuZCBhbmQgZGllICIkMDogJGNvbW1hbmQgZmFpbGVkIjsNCit9DQorDQorc3ViIExpbmtCeXRlY29kZUZpbGVzSW50b1RlbXBvcmFyeSB7DQorCW15ICRGaW5hbE91dHB1dEZpbGVOYW1lID0gc2hpZnQgQF87DQorCW15IEBCeXRlY29kZUZpbGVzID0gQF87DQorDQorCW15ICRCQ0ZpbGVzID0gam9pbiAoIiAiLCBAQnl0ZWNvZGVGaWxlcyk7DQorCW15ICRMaW5rZWRCQ0ZpbGU7DQorCWlmICgkU2F2ZVRlbXBzKSB7DQorCQkkTGlua2VkQkNGaWxlID0gIiR7RmluYWxPdXRwdXRGaWxlTmFtZX0ubGx2bS5iYyI7DQorCX0gZWxzZSB7DQorCQkkTGlua2VkQkNGaWxlID0gIi90bXAvbmF0aXZlYnVpbGQtJCQubGx2bS5iYyI7DQorCX0NCisJcnVuICJsbHZtLWxpbmsgLW8gJExpbmtlZEJDRmlsZSAkQkNGaWxlcyI7DQorCXJldHVybiAkTGlua2VkQkNGaWxlOw0KK30NCisNCitzdWIgQ29tcGlsZUJ5dGVjb2RlVG9OYXRpdmUgew0KKwlteSAoJEJDRmlsZSwgJEJhY2tlbmQsICRPdXRwdXRGaWxlKSA9IEBfOw0KKw0KKwlteSAkR2VuZXJhdGVkQ29kZTsNCisJaWYgKCRCYWNrZW5kIGVxICdjYmUnKSB7DQorCQlpZiAoJFNhdmVUZW1wcykgew0KKwkJCSRHZW5lcmF0ZWRDb2RlID0gIiR7T3V0cHV0RmlsZX0uYyI7DQorCQl9IGVsc2Ugew0KKwkJCSRHZW5lcmF0ZWRDb2RlID0gIi90bXAvbmF0aXZlYnVpbGQtJCQuYyI7DQorCQl9DQorCQlydW4gImxsYyAtZW5hYmxlLWNvcnJlY3QtZWgtc3VwcG9ydCAtbWFyY2g9YyAtZiAtbyAkR2VuZXJhdGVkQ29kZSAkQkNGaWxlIjsNCisJfSBlbHNpZiAoJEJhY2tlbmQgZXEgJ2xsYycpIHsNCisJCWlmICgkU2F2ZVRlbXBzKSB7DQorCQkJJEdlbmVyYXRlZENvZGUgPSAiJHtPdXRwdXRGaWxlfS5zIjsNCisJCX0gZWxzZSB7DQorCQkJJEdlbmVyYXRlZENvZGUgPSAiL3RtcC9uYXRpdmVidWlsZC0kJC5zIjsNCisJCX0NCisJCXJ1biAibGxjIC1lbmFibGUtY29ycmVjdC1laC1zdXBwb3J0IC1mIC1vICRHZW5lcmF0ZWRDb2RlICRCQ0ZpbGUiOw0KKwl9DQorCW15ICRMaWJEaXJzID0gam9pbiAoIiAiLCBATGliRGlycyk7DQorCW15ICRMaWJzID0gam9pbiAoIiAiLCBATGlicyk7DQorCXJ1biAiZ2NjICRHQ0NPcHRpb25zICRHZW5lcmF0ZWRDb2RlIC1vICRPdXRwdXRGaWxlICRMaWJEaXJzICRMaWJzIjsNCisJcnVuICJybSAkQkNGaWxlICRHZW5lcmF0ZWRDb2RlIg0KKwkJdW5sZXNzICRTYXZlVGVtcHM7DQorfQ0KKw0KK3N1YiBDb21waWxlQ1RvTmF0aXZlIHsNCisJbXkgKCRMTFZNR0NDQ29tbWFuZCwgJEJhY2tlbmQsICRPdXRwdXRGaWxlKSA9IEBfOw0KKwlydW4gJExMVk1HQ0NDb21tYW5kOw0KKwlpZiAoJFByZXByb2Nlc3NPbmx5KSB7DQorCQlyZXR1cm47DQorCX0NCisJbXkgJEJDRmlsZSA9ICIke091dHB1dEZpbGV9Lmxsdm0uYmMiOw0KKwlpZiAoJENvbXBpbGVEb250TGluaykgew0KKwkJcnVuICJtdiAke091dHB1dEZpbGV9ICRCQ0ZpbGUiOw0KKwl9IGVsc2UgeyAjIGdjY2xkIG1lc3NlcyB3aXRoIHRoZSBvdXRwdXQgZmlsZSBuYW1lDQorCQlydW4gIm12ICR7T3V0cHV0RmlsZX0uYmMgJEJDRmlsZSI7DQorCX0NCisJbXkgJEdlbmVyYXRlZENvZGU7DQorCWlmICgkQmFja2VuZCBlcSAnY2JlJykgew0KKwkJJEdlbmVyYXRlZENvZGUgPSAiJHtPdXRwdXRGaWxlfS5jYmUuYyI7DQorCQlydW4gImxsYyAtZW5hYmxlLWNvcnJlY3QtZWgtc3VwcG9ydCAtbWFyY2g9YyAtZiAtbyAkR2VuZXJhdGVkQ29kZSAkQkNGaWxlIjsNCisJfSBlbHNpZiAoJEJhY2tlbmQgZXEgJ2xsYycpIHsNCisJCSRHZW5lcmF0ZWRDb2RlID0gIiR7T3V0cHV0RmlsZX0ubGxjLnMiOw0KKwkJcnVuICJsbGMgLWVuYWJsZS1jb3JyZWN0LWVoLXN1cHBvcnQgLWYgLW8gJEdlbmVyYXRlZENvZGUgJEJDRmlsZSI7DQorCX0NCisJbXkgJE5hdGl2ZUdDQ09wdGlvbnMgPSAiIjsNCisJaWYgKCRDb21waWxlRG9udExpbmspIHsNCisJCSROYXRpdmVHQ0NPcHRpb25zID0gIi1jIjsNCisJfQ0KKwlydW4gImdjYyAkTmF0aXZlR0NDT3B0aW9ucyAkR2VuZXJhdGVkQ29kZSAtbyAkT3V0cHV0RmlsZSI7DQorCXJ1biAicm0gJHtPdXRwdXRGaWxlfS5sbHZtLmJjICRHZW5lcmF0ZWRDb2RlIg0KKwkJdW5sZXNzICRTYXZlVGVtcHM7DQorfQ0KKw0KKyMgZ3Vlc3MgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlLCBpZiAtbyB3YXMgbm90IHNwZWNpZmllZC4NCiskT3V0cHV0RmlsZSA9IEdldERlZmF1bHRPdXRwdXRGaWxlTmFtZSAoKSB1bmxlc3MgJE91dHB1dEZpbGU7DQorcHJpbnQgIk91dHB1dCBmaWxlIGlzICRPdXRwdXRGaWxlXG4iIGlmICRWZXJib3NlOw0KKyMgZG8gYWxsIHRoZSBkaXJ0eSB3b3JrOg0KK2lmICgkUHJvZ3JhbU5hbWUgZXEgL25hdGl2ZS1idWlsZC8pIHsNCisJbXkgJExpbmtlZEJDRmlsZSA9IExpbmtCeXRlY29kZUZpbGVzSW50b1RlbXBvcmFyeSAoQEJ5dGVjb2RlRmlsZXMpOw0KKwlDb21waWxlQnl0ZWNvZGVUb05hdGl2ZSAoJExpbmtlZEJDRmlsZSwgJEJhY2tlbmQsICRPdXRwdXRGaWxlKTsNCit9IGVsc2lmICgkUHJvZ3JhbU5hbWUgPX4gL2xsdm0tbmF0aXZlLWdjYy8pIHsNCisJIyBidWlsZCB0aGUgbGx2bS1nY2MgY29tbWFuZCBsaW5lLg0KKwkkTExWTUdDQ0NvbW1hbmQgPSBqb2luICgiICIsICgibGx2bS1nY2MiLCBAQVJHVikpOw0KKwlDb21waWxlQ1RvTmF0aXZlICgkTExWTUdDQ0NvbW1hbmQsICRCYWNrZW5kLCAkT3V0cHV0RmlsZSk7DQorfQ0KKw0KKyMgd2UncmUgZG9uZS4NCitleGl0IDA7DQorDQorX19FTkRfXw0KKw0KKz1wb2QNCisNCis9aGVhZDEgTkFNRQ0KKw0KK2xsdm0tbmF0aXZlLWdjYw0KKw0KKz1oZWFkMSBTWU5PUFNJUw0KKw0KK2xsdm0tbmF0aXZlLWdjYyBbT1BUSU9OUy4uLl0gRklMRQ0KKw0KK25hdGl2ZS1idWlsZCBbT1BUSU9OUy4uLl0gRklMRQ0KKw0KKz1oZWFkMSBERVNDUklQVElPTg0KKw0KK2xsdm0tbmF0aXZlLWdjYyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBMTFZNIGNvbW1hbmQtbGluZSB0b29scyB3aGljaCBnZW5lcmF0ZXMNCithIG5hdGl2ZSBvYmplY3QgKC5vKSBmaWxlIGJ5IGNvbXBpbGluZyBGSUxFIHdpdGggbGx2bS1nY2MsIGFuZCB0aGVuIHJ1bm5pbmcgDQorYW4gTExWTSBiYWNrLWVuZCAoQ0JFIGJ5IGRlZmF1bHQpIG92ZXIgdGhlIHJlc3VsdGluZyBieXRlY29kZSwgYW5kIHRoZW4NCitjb21waWxpbmcgdGhlIHJlc3VsdGluZyBjb2RlIHRvIGEgbmF0aXZlIG9iamVjdCBmaWxlLg0KKw0KK0lmIGNhbGxlZCBhcyAibmF0aXZlLWJ1aWxkIiwgaXQgY29tcGlsZXMgYnl0ZWNvZGUgdG8gbmF0aXZlIGNvZGUsIGFuZCB0YWtlcw0KK2RpZmZlcmVudCBvcHRpb25zLg0KKw0KKz1oZWFkMSBPUFRJT05TDQorDQorbGx2bS1uYXRpdmUtZ2NjIHRha2VzIHRoZSBzYW1lIG9wdGlvbnMgYXMgbGx2bS1nY2MuIEFsbCBvcHRpb25zDQorZXhjZXB0IC1tbGx2bS1iYWNrZW5kPS4uLiBhcmUgcGFzc2VkIG9uIHRvIGxsdm0tZ2NjLg0KKw0KKz1vdmVyIDQNCisNCis9aXRlbSAtbWxsdm0tYmFja2VuZD1CQUNLRU5EDQorDQorVXNlIEJBQ0tFTkQgZm9yIG5hdGl2ZSBjb2RlIGdlbmVyYXRpb24uIA0KKw0KKz1pdGVtIC12DQorDQorUHJpbnQgY29tbWFuZCBsaW5lcyB0aGF0IGxsdm0tbmF0aXZlLWdjYyBydW5zLg0KKw0KKz1pdGVtIC1vIEZJTEUNCisNCitsbHZtLW5hdGl2ZS1nY2MgdHJpZXMgdG8gZ3Vlc3MgdGhlIG5hbWUgb2YgdGhlIGxsdm0tZ2NjIG91dHB1dCBmaWxlIGJ5IGxvb2tpbmcNCitmb3IgdGhpcyBvcHRpb24gaW4gdGhlIGNvbW1hbmQgbGluZS4gSWYgaXQgY2FuJ3QgZmluZCBpdCwgaXQgZmluZHMgdGhlIGxhc3QgQw0KK29yIEMrKyBzb3VyY2UgZmlsZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdHVybnMgaXRzIHN1ZmZpeCBpbnRvIC5vLiBTZWUNCitCVUdTLg0KKw0KKz1pdGVtIC1zYXZlLXRlbXBzDQorDQorU2F2ZSB0ZW1wb3JhcnkgZmlsZXMgdXNlZCBieSBsbHZtLW5hdGl2ZS1nY2MgKGFuZCBsbHZtLWdjYywgYW5kIGdjYykuDQorDQorPWJhY2sNCisNCis9aGVhZDEgQlVHUw0KKw0KK2xsdm0tbmF0aXZlLWdjYyBvbmx5IGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgbGx2bS1nY2MgY29tcGlsZXMgYSBzaW5nbGUNCitmaWxlIHBlciBpbnZvY2F0aW9uLiAgbGx2bS1uYXRpdmUtZ2NjIGhhcyB3ZWFrIGNvbW1hbmQtbGluZSBhcmd1bWVudA0KK3BhcnNpbmcgYW5kIGlzIGEgcG9vciBzdWJzdGl0dXRlIGZvciBtYWtpbmcgZ2NjL2djYy5jIGRvIHRoaXMgc3R1ZmYuDQorDQorVGhpcyBtYW51YWwgcGFnZSBkb2VzIG5vdCBhZGVxdWF0ZWx5IGRvY3VtZW50IG5hdGl2ZS1idWlsZCBtb2RlLg0KKw0KK2xsdm0tbmF0aXZlLWdjYyBpcyBwcmV0dHkgZ3Jvc3MgYmVjYXVzZSBpdCByZXByZXNlbnRzIHRoZSBibGluZCBtZXJnaW5nIG9mIHR3bw0KK290aGVyIHNjcmlwdHMgdGhhdCBwcmVkYXRlZCBpdC4gSXQgY291bGQgdXNlIHNvbWUgY29kZSBjbGVhbi11cC4NCisNCis9aGVhZDEgU0VFIEFMU08NCisNCitnY2MoMSkNCisNCis9aGVhZDEgQVVUSE9SDQorDQorQnJpYW4gUi4gR2Fla2UNCisNCis9Y3V0DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbGx2bS1uYXRpdmUtZ3h4IGIvc3JjL0xMVk0vdXRpbHMvbGx2bS1uYXRpdmUtZ3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOWIwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9sbHZtLW5hdGl2ZS1neHgKQEAgLTAsMCArMSwyNDkgQEAKKyMhL3Vzci9iaW4vcGVybA0KKyMgV3JhcHBlciBhcm91bmQgTExWTSB0b29scyB0byBnZW5lcmF0ZSBhIG5hdGl2ZSAubyBmcm9tIGxsdm0tZ3h4IHVzaW5nIGFuDQorIyBMTFZNIGJhY2stZW5kIChDQkUgYnkgZGVmYXVsdCkuDQorDQorIyBzZXQgdXAgZGVmYXVsdHMuDQorJFZlcmJvc2UgPSAwOw0KKyRTYXZlVGVtcHMgPSAxOw0KKyRQcmVwcm9jZXNzT25seSA9IDA7DQorJENvbXBpbGVEb250TGluayA9IDA7DQorJEJhY2tlbmQgPSAnY2JlJzsNCitjaG9tcCAoJFByb2dyYW1OYW1lID0gYGJhc2VuYW1lICQwYCk7DQorDQorc3ViIGJvbGRwcmludCB7DQorCXByaW50ICIbWzFtIiwgQF8sICIbWzBtIjsNCit9DQorDQorIyBwcm9jZXNzIGNvbW1hbmQtbGluZSBvcHRpb25zLg0KKyMgbW9zdCBvZiB0aGVzZSBhcmUgcGFzc2VkIG9uIHRvIGxsdm0tZ3h4Lg0KKyRHQ0NPcHRpb25zID0gIiI7DQorZm9yICgkaSA9IDA7ICRpIDw9ICQjQVJHVjsgKyskaSkgewkNCisJaWYgKCRBUkdWWyRpXSA9fiAvLW1sbHZtLWJhY2tlbmQ9KFthLXowLTldKikvKSB7DQorCQkkQmFja2VuZCA9ICQxOw0KKwkJaWYgKCRQcm9ncmFtTmFtZSA9fiAvbGx2bS1uYXRpdmUtZ3h4Lykgew0KKwkJCXNwbGljZSAoQEFSR1YsICRpLCAxKTsNCisJCQktLSRpOw0KKwkJfQ0KKwl9IGVsc2lmICgkQVJHVlskaV0gZXEgIi1FIikgew0KKwkJJFByZXByb2Nlc3NPbmx5ID0gMTsNCisJfSBlbHNpZiAoJEFSR1ZbJGldIGVxICItYyIpIHsNCisJCSRHQ0NPcHRpb25zIC49ICIgIiAuICRBUkdWWyRpXTsNCisJCSRDb21waWxlRG9udExpbmsgPSAxOw0KKwl9IGVsc2lmICgkQVJHVlskaV0gZXEgIi12Iikgew0KKwkJJEdDQ09wdGlvbnMgLj0gIiAiIC4gJEFSR1ZbJGldOw0KKwkJJFZlcmJvc2UgPSAxOw0KKwl9IGVsc2lmICgkQVJHVlskaV0gZXEgIi1vIikgew0KKwkJJE91dHB1dEZpbGUgPSAkQVJHVlskaSArIDFdOw0KKwl9IGVsc2lmICgkQVJHVlskaV0gZXEgIi1zYXZlLXRlbXBzIikgew0KKwkJJEdDQ09wdGlvbnMgLj0gIiAiIC4gJEFSR1ZbJGldOw0KKwkJJFNhdmVUZW1wcyA9IDE7DQorCX0gZWxzaWYgKCRBUkdWWyRpXSA9fiAvXC5iYyQvKSB7DQorCQlwdXNoIChAQnl0ZWNvZGVGaWxlcywgJEFSR1ZbJGldKTsNCisJfSBlbHNpZiAoJEFSR1ZbJGldID1+IC9eLUwvKSB7DQorCQkkR0NDT3B0aW9ucyAuPSAiICIgLiAkQVJHVlskaV07DQorCQlwdXNoIChATGliRGlycywgJEFSR1ZbJGldKTsNCisJfSBlbHNpZiAoJEFSR1ZbJGldID1+IC9eLWwvKSB7DQorCQkkR0NDT3B0aW9ucyAuPSAiICIgLiAkQVJHVlskaV07DQorCQlwdXNoIChATGlicywgJEFSR1ZbJGldKTsNCisJfSBlbHNpZiAoJEFSR1ZbJGldID1+IC9cLihjfGNwcHxjY3xpfGlpfEMpJC8pIHsNCisJCSRMYXN0Q0ZpbGUgPSAkQVJHVlskaV07DQorCX0NCit9DQorDQorc3ViIEdldERlZmF1bHRPdXRwdXRGaWxlTmFtZSB7DQorCW15ICREZWZhdWx0T3V0cHV0RmlsZUJhc2U7DQorDQorCWlmICgkUHJvZ3JhbU5hbWUgPX4gL2xsdm0tbmF0aXZlLWd4eC8pIHsNCisJCSREZWZhdWx0T3V0cHV0RmlsZUJhc2UgPSAkTGFzdENGaWxlOw0KKwl9IGVsc2lmICgkUHJvZ3JhbU5hbWUgPX4gL25hdGl2ZS1idWlsZC8pIHsNCisJCSREZWZhdWx0T3V0cHV0RmlsZUJhc2UgPSAkQnl0ZWNvZGVGaWxlc1swXTsNCisJfQ0KKw0KKwlteSAkZGVmID0gJERlZmF1bHRPdXRwdXRGaWxlQmFzZTsNCisNCisJZGllICJDYW4ndCBmaWd1cmUgb3V0IG5hbWUgb2Ygb3V0cHV0IGZpbGUuXG4iDQorCQl1bmxlc3MgJERlZmF1bHRPdXRwdXRGaWxlQmFzZQ0KKwkJCSAgICYmICgoJFByb2dyYW1OYW1lICF+IC9uYXRpdmUtYnVpbGQvKQ0KKwkJCQkgICB8fCAkI0J5dGVjb2RlRmlsZXMgPT0gMCk7DQorDQorCXByaW50ICJXYXJuaW5nOiBkZWZhdWx0aW5nIG91dHB1dCBmaWxlIG5hbWUgIiwNCisJCSJiYXNlZCBvbiAnJERlZmF1bHRPdXRwdXRGaWxlQmFzZSdcbiIgaWYgJFZlcmJvc2U7DQorDQorCWlmICgkUHJvZ3JhbU5hbWUgPX4gL2xsdm0tbmF0aXZlLWd4eC8pIHsNCisJCSRkZWYgPX4gcy9cLihjfGNwcHxjY3xpfGlpfEMpJC8uby87DQorCX0gZWxzaWYgKCRQcm9ncmFtTmFtZSA9fiAvbmF0aXZlLWJ1aWxkLykgew0KKwkJJGRlZiA9fiBzL1wuYmMkLy4kQmFja2VuZC87DQorCQlpZiAoJENvbXBpbGVEb250TGluaykgew0KKwkJCSRkZWYgLj0gIi5vIjsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4gJGRlZjsNCit9DQorDQorIyBydW4gYSBjb21tYW5kLCBvcHRpb25hbGx5IGVjaG9pbmcsIGFuZCBxdWl0dGluZyBpZiBpdCBmYWlsczoNCitzdWIgcnVuIHsNCisJbXkgJGNvbW1hbmQgPSBqb2luKCIgIiwgQF8pOw0KKwlwcmludCAiJGNvbW1hbmRcbiIgaWYgJFZlcmJvc2U7DQorCSRjb21tYW5kID1+IHMvXCIvXFxcIi9nOw0KKwlzeXN0ZW0gJGNvbW1hbmQgYW5kIGRpZSAiJDA6ICRjb21tYW5kIGZhaWxlZCI7DQorfQ0KKw0KK3N1YiBMaW5rQnl0ZWNvZGVGaWxlc0ludG9UZW1wb3Jhcnkgew0KKwlteSAkRmluYWxPdXRwdXRGaWxlTmFtZSA9IHNoaWZ0IEBfOw0KKwlteSBAQnl0ZWNvZGVGaWxlcyA9IEBfOw0KKw0KKwlteSAkQkNGaWxlcyA9IGpvaW4gKCIgIiwgQEJ5dGVjb2RlRmlsZXMpOw0KKwlteSAkTGlua2VkQkNGaWxlOw0KKwlpZiAoJFNhdmVUZW1wcykgew0KKwkJJExpbmtlZEJDRmlsZSA9ICIke0ZpbmFsT3V0cHV0RmlsZU5hbWV9Lmxsdm0uYmMiOw0KKwl9IGVsc2Ugew0KKwkJJExpbmtlZEJDRmlsZSA9ICIvdG1wL25hdGl2ZWJ1aWxkLSQkLmxsdm0uYmMiOw0KKwl9DQorCXJ1biAibGx2bS1saW5rIC1vICRMaW5rZWRCQ0ZpbGUgJEJDRmlsZXMiOw0KKwlyZXR1cm4gJExpbmtlZEJDRmlsZTsNCit9DQorDQorc3ViIENvbXBpbGVCeXRlY29kZVRvTmF0aXZlIHsNCisJbXkgKCRCQ0ZpbGUsICRCYWNrZW5kLCAkT3V0cHV0RmlsZSkgPSBAXzsNCisNCisJbXkgJEdlbmVyYXRlZENvZGU7DQorCWlmICgkQmFja2VuZCBlcSAnY2JlJykgew0KKwkJaWYgKCRTYXZlVGVtcHMpIHsNCisJCQkkR2VuZXJhdGVkQ29kZSA9ICIke091dHB1dEZpbGV9LmMiOw0KKwkJfSBlbHNlIHsNCisJCQkkR2VuZXJhdGVkQ29kZSA9ICIvdG1wL25hdGl2ZWJ1aWxkLSQkLmMiOw0KKwkJfQ0KKwkJcnVuICJsbGMgLW1hcmNoPWMgLWYgLW8gJEdlbmVyYXRlZENvZGUgJEJDRmlsZSI7DQorCX0gZWxzaWYgKCRCYWNrZW5kIGVxICdsbGMnKSB7DQorCQlpZiAoJFNhdmVUZW1wcykgew0KKwkJCSRHZW5lcmF0ZWRDb2RlID0gIiR7T3V0cHV0RmlsZX0ucyI7DQorCQl9IGVsc2Ugew0KKwkJCSRHZW5lcmF0ZWRDb2RlID0gIi90bXAvbmF0aXZlYnVpbGQtJCQucyI7DQorCQl9DQorCQlydW4gImxsYyAtZiAtbyAkR2VuZXJhdGVkQ29kZSAkQkNGaWxlIjsNCisJfQ0KKwlteSAkTGliRGlycyA9IGpvaW4gKCIgIiwgQExpYkRpcnMpOw0KKwlteSAkTGlicyA9IGpvaW4gKCIgIiwgQExpYnMpOw0KKwlydW4gImdjYyAkR0NDT3B0aW9ucyAkR2VuZXJhdGVkQ29kZSAtbyAkT3V0cHV0RmlsZSAkTGliRGlycyAkTGlicyI7DQorCXJ1biAicm0gJEJDRmlsZSAkR2VuZXJhdGVkQ29kZSINCisJCXVubGVzcyAkU2F2ZVRlbXBzOw0KK30NCisNCitzdWIgQ29tcGlsZUNUb05hdGl2ZSB7DQorCW15ICgkTExWTUdDQ0NvbW1hbmQsICRCYWNrZW5kLCAkT3V0cHV0RmlsZSkgPSBAXzsNCisJcnVuICRMTFZNR0NDQ29tbWFuZDsNCisJaWYgKCRQcmVwcm9jZXNzT25seSkgew0KKwkJcmV0dXJuOw0KKwl9DQorCW15ICRCQ0ZpbGUgPSAiJHtPdXRwdXRGaWxlfS5sbHZtLmJjIjsNCisJaWYgKCRDb21waWxlRG9udExpbmspIHsNCisJCXJ1biAibXYgJHtPdXRwdXRGaWxlfSAkQkNGaWxlIjsNCisJfSBlbHNlIHsgIyBnY2NsZCBtZXNzZXMgd2l0aCB0aGUgb3V0cHV0IGZpbGUgbmFtZQ0KKwkJcnVuICJtdiAke091dHB1dEZpbGV9LmJjICRCQ0ZpbGUiOw0KKwl9DQorCW15ICRHZW5lcmF0ZWRDb2RlOw0KKwlpZiAoJEJhY2tlbmQgZXEgJ2NiZScpIHsNCisJCSRHZW5lcmF0ZWRDb2RlID0gIiR7T3V0cHV0RmlsZX0uY2JlLmMiOw0KKwkJcnVuICJsbGMgLW1hcmNoPWMgLWYgLW8gJEdlbmVyYXRlZENvZGUgJEJDRmlsZSI7DQorCX0gZWxzaWYgKCRCYWNrZW5kIGVxICdsbGMnKSB7DQorCQkkR2VuZXJhdGVkQ29kZSA9ICIke091dHB1dEZpbGV9LmxsYy5zIjsNCisJCXJ1biAibGxjIC1mIC1vICRHZW5lcmF0ZWRDb2RlICRCQ0ZpbGUiOw0KKwl9DQorCW15ICROYXRpdmVHQ0NPcHRpb25zID0gIiI7DQorCWlmICgkQ29tcGlsZURvbnRMaW5rKSB7DQorCQkkTmF0aXZlR0NDT3B0aW9ucyA9ICItYyI7DQorCX0NCisJcnVuICJnY2MgJE5hdGl2ZUdDQ09wdGlvbnMgJEdlbmVyYXRlZENvZGUgLW8gJE91dHB1dEZpbGUiOw0KKwlydW4gInJtICR7T3V0cHV0RmlsZX0ubGx2bS5iYyAkR2VuZXJhdGVkQ29kZSINCisJCXVubGVzcyAkU2F2ZVRlbXBzOw0KK30NCisNCisjIGd1ZXNzIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSwgaWYgLW8gd2FzIG5vdCBzcGVjaWZpZWQuDQorJE91dHB1dEZpbGUgPSBHZXREZWZhdWx0T3V0cHV0RmlsZU5hbWUgKCkgdW5sZXNzICRPdXRwdXRGaWxlOw0KK3ByaW50ICJPdXRwdXQgZmlsZSBpcyAkT3V0cHV0RmlsZVxuIiBpZiAkVmVyYm9zZTsNCisjIGRvIGFsbCB0aGUgZGlydHkgd29yazoNCitpZiAoJFByb2dyYW1OYW1lIGVxIC9uYXRpdmUtYnVpbGQvKSB7DQorCW15ICRMaW5rZWRCQ0ZpbGUgPSBMaW5rQnl0ZWNvZGVGaWxlc0ludG9UZW1wb3JhcnkgKEBCeXRlY29kZUZpbGVzKTsNCisJQ29tcGlsZUJ5dGVjb2RlVG9OYXRpdmUgKCRMaW5rZWRCQ0ZpbGUsICRCYWNrZW5kLCAkT3V0cHV0RmlsZSk7DQorfSBlbHNpZiAoJFByb2dyYW1OYW1lID1+IC9sbHZtLW5hdGl2ZS1neHgvKSB7DQorCSMgYnVpbGQgdGhlIGxsdm0tZ3h4IGNvbW1hbmQgbGluZS4NCisJJExMVk1HQ0NDb21tYW5kID0gam9pbiAoIiAiLCAoImxsdm0tZysrIiwgQEFSR1YpKTsNCisJQ29tcGlsZUNUb05hdGl2ZSAoJExMVk1HQ0NDb21tYW5kLCAkQmFja2VuZCwgJE91dHB1dEZpbGUpOw0KK30NCisNCisjIHdlJ3JlIGRvbmUuDQorZXhpdCAwOw0KKw0KK19fRU5EX18NCisNCis9cG9kDQorDQorPWhlYWQxIE5BTUUNCisNCitsbHZtLW5hdGl2ZS1neHgNCisNCis9aGVhZDEgU1lOT1BTSVMNCisNCitsbHZtLW5hdGl2ZS1nKysgW09QVElPTlMuLi5dIEZJTEUNCisNCituYXRpdmUtYnVpbGQgW09QVElPTlMuLi5dIEZJTEUNCisNCis9aGVhZDEgREVTQ1JJUFRJT04NCisNCitsbHZtLW5hdGl2ZS1nKysgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgTExWTSBjb21tYW5kLWxpbmUgdG9vbHMgd2hpY2ggZ2VuZXJhdGVzDQorYSBuYXRpdmUgb2JqZWN0ICgubykgZmlsZSBieSBjb21waWxpbmcgRklMRSB3aXRoIGxsdm0tZysrLCBhbmQgdGhlbiBydW5uaW5nIA0KK2FuIExMVk0gYmFjay1lbmQgKENCRSBieSBkZWZhdWx0KSBvdmVyIHRoZSByZXN1bHRpbmcgYnl0ZWNvZGUsIGFuZCB0aGVuDQorY29tcGlsaW5nIHRoZSByZXN1bHRpbmcgY29kZSB0byBhIG5hdGl2ZSBvYmplY3QgZmlsZS4NCisNCitJZiBjYWxsZWQgYXMgIm5hdGl2ZS1idWlsZCIsIGl0IGNvbXBpbGVzIGJ5dGVjb2RlIHRvIG5hdGl2ZSBjb2RlLCBhbmQgdGFrZXMNCitkaWZmZXJlbnQgb3B0aW9ucy4NCisNCis9aGVhZDEgT1BUSU9OUw0KKw0KK2xsdm0tbmF0aXZlLWcrKyB0YWtlcyB0aGUgc2FtZSBvcHRpb25zIGFzIGxsdm0tZ2NjLiBBbGwgb3B0aW9ucw0KK2V4Y2VwdCAtbWxsdm0tYmFja2VuZD0uLi4gYXJlIHBhc3NlZCBvbiB0byBsbHZtLWcrKy4NCisNCis9b3ZlciA0DQorDQorPWl0ZW0gLW1sbHZtLWJhY2tlbmQ9QkFDS0VORA0KKw0KK1VzZSBCQUNLRU5EIGZvciBuYXRpdmUgY29kZSBnZW5lcmF0aW9uLiANCisNCis9aXRlbSAtdg0KKw0KK1ByaW50IGNvbW1hbmQgbGluZXMgdGhhdCBsbHZtLW5hdGl2ZS1nKysgcnVucy4NCisNCis9aXRlbSAtbyBGSUxFDQorDQorbGx2bS1uYXRpdmUtZysrIHRyaWVzIHRvIGd1ZXNzIHRoZSBuYW1lIG9mIHRoZSBsbHZtLWcrKyBvdXRwdXQgZmlsZSBieSBsb29raW5nDQorZm9yIHRoaXMgb3B0aW9uIGluIHRoZSBjb21tYW5kIGxpbmUuIElmIGl0IGNhbid0IGZpbmQgaXQsIGl0IGZpbmRzIHRoZSBsYXN0IEMNCitvciBDKysgc291cmNlIGZpbGUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHR1cm5zIGl0cyBzdWZmaXggaW50byAuby4gU2VlDQorQlVHUy4NCisNCis9aXRlbSAtc2F2ZS10ZW1wcw0KKw0KK1NhdmUgdGVtcG9yYXJ5IGZpbGVzIHVzZWQgYnkgbGx2bS1uYXRpdmUtZysrIChhbmQgbGx2bS1nKyssIGFuZCBnKyspLg0KKw0KKz1iYWNrDQorDQorPWhlYWQxIEJVR1MNCisNCitsbHZtLW5hdGl2ZS1nKysgb25seSBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGxsdm0tZysrIGNvbXBpbGVzIGEgc2luZ2xlDQorZmlsZSBwZXIgaW52b2NhdGlvbi4gIGxsdm0tbmF0aXZlLWcrKyBoYXMgd2VhayBjb21tYW5kLWxpbmUgYXJndW1lbnQNCitwYXJzaW5nIGFuZCBpcyBhIHBvb3Igc3Vic3RpdHV0ZSBmb3IgbWFraW5nIGcrKy9nKysuYyBkbyB0aGlzIHN0dWZmLg0KKw0KK1RoaXMgbWFudWFsIHBhZ2UgZG9lcyBub3QgYWRlcXVhdGVseSBkb2N1bWVudCBuYXRpdmUtYnVpbGQgbW9kZS4NCisNCitsbHZtLW5hdGl2ZS1nKysgaXMgcHJldHR5IGdyb3NzIGJlY2F1c2UgaXQgcmVwcmVzZW50cyB0aGUgYmxpbmQgbWVyZ2luZyBvZiB0d28NCitvdGhlciBzY3JpcHRzIHRoYXQgcHJlZGF0ZWQgaXQuIEl0IGNvdWxkIHVzZSBzb21lIGNvZGUgY2xlYW4tdXAuDQorDQorPWhlYWQxIFNFRSBBTFNPDQorDQorZysrKDEpDQorDQorPWhlYWQxIEFVVEhPUg0KKw0KK0JyaWFuIFIuIEdhZWtlDQorDQorPWN1dA0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xsdm0uZ3JtIGIvc3JjL0xMVk0vdXRpbHMvbGx2bS5ncm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3YzBkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xsdm0uZ3JtCkBAIC0wLDAgKzEsNDE5IEBACisoKgorCitwb2x5Z2VuIGdyYW1tYXIgZm9yIExMVk0gYXNzZW1ibHkgbGFuZ3VhZ2UuCisKK1RoaXMgZmlsZSBkZWZpbmVzIGFuIExMVk0gYXNzZW1ibHkgbGFuZ3VhZ2UgZ3JhbW1hciBmb3IgcG9seWdlbiwKK3doaWNoIGlzIGEgdG9vbCBmb3IgZ2VuZXJhdGluZyByYW5kb20gdGV4dCBiYXNlZCBvbiBhIGdyYW1tYXIuCitJdCBpcyBzdHJpY3RseSBzeW50YXgtYmFzZWQsIGFuZCBtYWtlcyBubyBhdHRlbXB0IHRvIGdlbmVyYXRlCitJUiB0aGF0IGlzIHNlbWFudGljYWxseSB2YWxpZC4gTW9zdCBvZiB0aGUgSVIgcHJvZHVjZWQgZG9lc24ndAorcGFzcyB0aGUgVmVyaWZpZXIuCisKK1RPRE86IE1ldGFkYXRhLCBpbiBhbGwgaXRzIGZvcm1zCitUT0RPOiBVbmlvbiB0eXBlcworCisqKQorCitJIDo6PSAgICJ0aXRsZTogICAgTExWTSBhc3NlbWJseSBsYW5ndWFnZVxuIgorICAgICAgXiAic3RhdHVzOiAgIGV4cGVyaW1lbnRhbFxuIgorICAgICAgXiAiYXVkaWVuY2U6IExMVk0gZGV2ZWxvcGVyc1xuIgorOworCitTIDo6PSBNb2R1bGUgOworCisoKgorRGVmaW5lIHJ1bGVzIGZvciBub24ta2V5d29yZCB0b2tlbnMuIFRoaXMgaXMgY3VycmVudGx5IGp1c3QgYSBidW5jaAorb2YgaGFja3MuIFRoZXkgZG9uJ3QgY292ZXIgbWFueSB2YWxpZCBmb3JtcyBvZiB0b2tlbnMsIGFuZCB0aGV5IGFsc28KK2dlbmVyYXRlIHNvbWUgaW52YWxpZCBmb3JtcyBvZiB0b2tlbnMuIFRoZSBMTFZNIHBhcnNlciBoYXMgY3VzdG9tCitDKysgY29kZSB0byBsZXggdGhlc2U7IGN1c3RvbSBDKysgY29kZSBmb3IgZW1pdHRpbmcgdGhlbSB3b3VsZCBiZQorY29udmVuaWVudCwgYnV0IHBvbHlnZW4gZG9lc24ndCBzdXBwb3J0IHRoYXQuCisqKQorTm9uWmVyb0RlY2ltYWxEaWdpdCA6Oj0gICAgIDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCA4IHwgOSA7CitEZWNpbWFsRGlnaXQgICAgICAgIDo6PSAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IDsKK0RlY2ltYWxEaWdpdFNlcSAgICAgOjo9IERlY2ltYWxEaWdpdCBbXiBEZWNpbWFsRGlnaXRTZXEgXTsKK0hleERpZ2l0ICAgICAgICAgICAgOjo9IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgOCB8IDkKKyAgICAgICAgICAgICAgICAgICAgICB8IGEgfCBiIHwgYyB8IGQgfCBlIHwgZiA7CitIZXhEaWdpdFNlcSAgICAgICAgIDo6PSBIZXhEaWdpdCBbXiBIZXhEaWdpdFNlcSBdOworU3RyaW5nQ2hhciAgICAgICAgICA6Oj0gYSB8IGIgfCBjIHwgZCB8IGUgfCBmIHwgZyB8IGggfCBpIHwgaiB8IGsgfCBsIHwgbQorICAgICAgICAgICAgICAgICAgICAgIHwgbiB8IG8gfCBwIHwgcSB8IHIgfCBzIHwgdCB8IHUgfCB2IHwgdyB8IHggfCB5IHwgeiA7CitTdHJpbmdDb25zdGFudFNlcSAgIDo6PSBTdHJpbmdDaGFyIFteIFN0cmluZ0NvbnN0YW50U2VxIF07CitTdHJpbmdDb25zdGFudCAgICAgIDo6PSBTdHJpbmdDaGFyIFteIFN0cmluZ0NvbnN0YW50U2VxIF07CitFVUlOVDY0VkFMICAgICAgICAgIDo6PSBOb25aZXJvRGVjaW1hbERpZ2l0IFteIERlY2ltYWxEaWdpdFNlcSBdOworRVNJTlQ2NFZBTCAgICAgICAgICA6Oj0gWyAiLSIgXSBeIEVVSU5UNjRWQUwgOworRVVBUElOVFZBTCAgICAgICAgICA6Oj0gRVVJTlQ2NFZBTCA7CitFU0FQSU5UVkFMICAgICAgICAgIDo6PSBFU0lOVDY0VkFMIDsKK0xPQ0FMVkFMSUQgICAgICAgICAgOjo9ICIlIiBeIERlY2ltYWxEaWdpdFNlcSA7CitHTE9CQUxWQUxJRCAgICAgICAgIDo6PSAiQCIgXiBEZWNpbWFsRGlnaXRTZXEgOworSU5UVFlQRSAgICAgICAgICAgICA6Oj0gImkiIF4gRVVJTlQ2NFZBTCA7CitHTE9CQUxWQVIgICAgICAgICAgIDo6PSAiQCIgXiBTdHJpbmdDb25zdGFudCA7CitMT0NBTFZBUiAgICAgICAgICAgIDo6PSAiJSIgXiBTdHJpbmdDb25zdGFudCA7CitTVFJJTkdDT05TVEFOVCAgICAgIDo6PSAiXCIiIF4gU3RyaW5nQ29uc3RhbnQgXiAiXCIiIDsKK0FUU1RSSU5HQ09OU1RBTlQgICAgOjo9ICJAIiBeIFNUUklOR0NPTlNUQU5UIDsKK1BDVFNUUklOR0NPTlNUQU5UICAgOjo9ICIlIiBeIFNUUklOR0NPTlNUQU5UIDsKK0xBQkVMU1RSICAgICAgICAgICAgOjo9IFN0cmluZ0NvbnN0YW50IDsKK0ZQVkFMICAgICAgICAgICAgICAgOjo9IEVTQVBJTlRWQUwgXiAiLiIgXiBFVUFQSU5UVkFMIHwgIjB4IiBeIEhleERpZ2l0U2VxIDsKKworKCoKK1RoZSByZXN0IG9mIHRoaXMgZmlsZSBpcyBkZXJpdmVkIGRpcmVjdGx5IGZyb20gbGx2bUFzbVBhcnNlci55LgorKikKKworQXJpdGhtZXRpY09wcyA6Oj0gKyBPcHROVyBhZGQgfCBmYWRkIHwgT3B0Tlcgc3ViIHwgZnN1YiB8IE9wdE5XIG11bCB8IGZtdWwgfAorICAgICAgICAgICAgICAgICAgdWRpdiB8IE9wdEV4YWN0IHNkaXYgfCBmZGl2IHwgdXJlbSB8IHNyZW0gfCBmcmVtIDsKK0xvZ2ljYWxPcHMgICAgOjo9IHNobCB8IGxzaHIgfCBhc2hyIHwgYW5kIHwgb3IgfCB4b3I7CitDYXN0T3BzICAgICAgIDo6PSB0cnVuYyB8IHpleHQgfCBzZXh0IHwgZnB0cnVuYyB8IGZwZXh0IHwgYml0Y2FzdCB8CisgICAgICAgICAgICAgICAgICB1aXRvZnAgfCBzaXRvZnAgfCBmcHRvdWkgfCBmcHRvc2kgfCBpbnR0b3B0ciB8IHB0cnRvaW50IDsKKworSVByZWRpY2F0ZXMgOjo9IGVxIHwgbmUgfCBzbHQgfCBzZ3QgfCBzbGUgfCBzZ2UgfCB1bHQgfCB1Z3QgfCB1bGUgfCB1Z2UgOworCitGUHJlZGljYXRlcyA6Oj0gb2VxIHwgb25lIHwgb2x0IHwgb2d0IHwgb2xlIHwgb2dlIHwgb3JkIHwgdW5vIHwgdWVxIHwgdW5lCisgICAgICAgICAgICAgIHwgdWx0IHwgdWd0IHwgdWxlIHwgdWdlIHwgdHJ1ZSB8IGZhbHNlIDsKKworSW50VHlwZSA6Oj0gSU5UVFlQRTsKK0ZQVHlwZSAgOjo9IGZsb2F0IHwgZG91YmxlIHwgInBwY19mcDEyOCIgfCBmcDEyOCB8ICJ4ODZfZnA4MCI7CisKK0xvY2FsTmFtZSA6Oj0gTE9DQUxWQVIgfCBTVFJJTkdDT05TVEFOVCB8IFBDVFNUUklOR0NPTlNUQU5UIDsKK09wdExvY2FsTmFtZSA6Oj0gTG9jYWxOYW1lIHwgXyA7CisKK09wdEFkZHJTcGFjZSA6Oj0gLSBhZGRyc3BhY2UgXiAiKCIgXiBFVUlOVDY0VkFMIF4gIikiIHwgXyA7CisKK09wdExvY2FsQXNzaWduIDo6PSBMb2NhbE5hbWUgIj0iIHwgXyA7CisKK0dsb2JhbE5hbWUgOjo9IEdMT0JBTFZBUiB8IEFUU1RSSU5HQ09OU1RBTlQgOworCitPcHRHbG9iYWxBc3NpZ24gOjo9IEdsb2JhbEFzc2lnbiB8IF8gOworCitHbG9iYWxBc3NpZ24gOjo9IEdsb2JhbE5hbWUgIj0iIDsKKworR1ZJbnRlcm5hbExpbmthZ2UKKyAgOjo9ICsgaW50ZXJuYWwKKyB8IHdlYWsKKyB8ICJ3ZWFrX29kciIKKyB8IGxpbmtvbmNlCisgfCAibGlua29uY2Vfb2RyIgorIHwgYXBwZW5kaW5nCisgfCBkbGxleHBvcnQKKyB8IGNvbW1vbgorIHwgcHJpdmF0ZQorIHwgImxpbmtlcl9wcml2YXRlIgorIHwgImxpbmtlcl9wcml2YXRlX3dlYWsiCisgOworCitHVkV4dGVybmFsTGlua2FnZQorICA6Oj0gZGxsaW1wb3J0CisgfCAiZXh0ZXJuX3dlYWsiCisgfCArIGV4dGVybmFsCisgOworCitHVlZpc2liaWxpdHlTdHlsZQorICA6Oj0gKyBfCisgfCBkZWZhdWx0CisgfCBoaWRkZW4KKyB8IHByb3RlY3RlZAorIDsKKworRnVuY3Rpb25EZWNsYXJlTGlua2FnZQorICA6Oj0gKyBfCisgfCBkbGxpbXBvcnQKKyB8ICJleHRlcm5fd2VhayIKKyA7CisKK0Z1bmN0aW9uRGVmaW5lTGlua2FnZQorICA6Oj0gKyBfCisgfCBpbnRlcm5hbAorIHwgbGlua29uY2UKKyB8ICJsaW5rb25jZV9vZHIiCisgfCB3ZWFrCisgfCAid2Vha19vZHIiCisgfCBkbGxleHBvcnQKKyA7CisKK0FsaWFzTGlua2FnZSA6Oj0gKyBfIHwgd2VhayB8ICJ3ZWFrX29kciIgfCBpbnRlcm5hbCA7CisKK09wdENhbGxpbmdDb252IDo6PSArIF8gfAorICAgICAgICAgICAgICAgICBjY2MgfAorICAgICAgICAgICAgICAgICBmYXN0Y2MgfAorICAgICAgICAgICAgICAgICBjb2xkY2MgfAorICAgICAgICAgICAgICAgICAieDg2X3N0ZGNhbGxjYyIgfAorICAgICAgICAgICAgICAgICAieDg2X2Zhc3RjYWxsY2MiIHwKKyAgICAgICAgICAgICAgICAgY2MgRVVJTlQ2NFZBTCA7CisKK1BhcmFtQXR0ciA6Oj0gemVyb2V4dAorIHwgc2lnbmV4dAorIHwgaW5yZWcKKyB8IHNyZXQKKyB8IG5vYWxpYXMKKyB8IG5vY2FwdHVyZQorIHwgYnl2YWwKKyB8IG5lc3QKKyB8IGFsaWduIEVVSU5UNjRWQUwKKyA7CisKK09wdFBhcmFtQXR0cnMgOjo9ICsgXyB8IE9wdFBhcmFtQXR0cnMgUGFyYW1BdHRyIDsKKworUmV0QXR0ciAgICAgICA6Oj0gaW5yZWcKKyAgICAgICAgICAgICAgfCB6ZXJvZXh0CisgICAgICAgICAgICAgIHwgc2lnbmV4dAorICAgICAgICAgICAgICB8IG5vYWxpYXMKKyAgICAgICAgICAgICAgOworCitPcHRSZXRBdHRycyAgOjo9IF8KKyAgICAgICAgICAgICB8IE9wdFJldEF0dHJzIFJldEF0dHIKKyAgICAgICAgICAgICA7CisKK0Z1bmNBdHRyICAgICAgOjo9IG5vcmV0dXJuCisgfCBub3Vud2luZAorIHwgaW5yZWcKKyB8IHplcm9leHQKKyB8IHNpZ25leHQKKyB8IHJlYWRub25lCisgfCByZWFkb25seQorIHwgaW5saW5laGludAorIHwgYWxpZ25zdGFjaworIHwgbm9pbmxpbmUKKyB8IGFsd2F5c2lubGluZQorIHwgb3B0c2l6ZQorIHwgc3NwCisgfCBzc3ByZXEKKyA7CisKK09wdEZ1bmNBdHRycyAgOjo9ICsgXyB8IE9wdEZ1bmNBdHRycyBGdW5jQXR0ciA7CisKK09wdEdDICAgICAgICAgOjo9ICsgXyB8IGdjIFNUUklOR0NPTlNUQU5UIDsKKworT3B0QWxpZ24gICAgICA6Oj0gKyBfIHwgYWxpZ24gRVVJTlQ2NFZBTCA7CitPcHRDQWxpZ24gICAgIDo6PSArIF8gfCBeICIsIiBhbGlnbiBFVUlOVDY0VkFMIDsKKworU2VjdGlvblN0cmluZyA6Oj0gc2VjdGlvbiBTVFJJTkdDT05TVEFOVCA7CisKK09wdFNlY3Rpb24gICAgOjo9ICsgXyB8IFNlY3Rpb25TdHJpbmcgOworCitHbG9iYWxWYXJBdHRyaWJ1dGVzIDo6PSArIF8gfCBeICIsIiBHbG9iYWxWYXJBdHRyaWJ1dGUgR2xvYmFsVmFyQXR0cmlidXRlcyA7CitHbG9iYWxWYXJBdHRyaWJ1dGUgIDo6PSBTZWN0aW9uU3RyaW5nIHwgYWxpZ24gRVVJTlQ2NFZBTCA7CisKK1ByaW1UeXBlIDo6PSBJTlRUWVBFIHwgZmxvYXQgfCBkb3VibGUgfCAicHBjX2ZwMTI4IiB8IGZwMTI4IHwgIng4Nl9mcDgwIgorICAgICAgICAgIHwgLSBsYWJlbCA7CisKK1R5cGVzCisgIDo6PSBvcGFxdWUKKyB8IFByaW1UeXBlCisgfCBUeXBlcyBPcHRBZGRyU3BhY2UgXiAiKiIKKyB8IFN5bWJvbGljVmFsdWVSZWYKKyB8ICJcXCIgXiBFVUlOVDY0VkFMCisgfCBUeXBlcyAiKCIgXiBBcmdUeXBlTGlzdEkgXiAiKSIgT3B0RnVuY0F0dHJzCisgfCB2b2lkICIoIiBeIEFyZ1R5cGVMaXN0SSBeICIpIiBPcHRGdW5jQXR0cnMKKyB8ICJbIiBeIEVVSU5UNjRWQUwgIngiIFR5cGVzIF4gIl0iCisgfCAiPCIgXiBFVUlOVDY0VkFMICJ4IiBUeXBlcyBeICI+IgorIHwgInsiIFR5cGVMaXN0SSAifSIKKyB8ICJ7IiBeICJ9IgorIHwgIjwiIF4gInsiIFR5cGVMaXN0SSAifSIgXiAiPiIKKyB8ICI8IiBeICJ7IiBeICJ9IiBeICI+IgorIDsKKworQXJnVHlwZSA6Oj0gVHlwZXMgT3B0UGFyYW1BdHRycyA7CisKK1Jlc3VsdFR5cGVzIDo6PSBUeXBlcyB8IHZvaWQgOworCitBcmdUeXBlTGlzdCA6Oj0gQXJnVHlwZSB8IEFyZ1R5cGVMaXN0IF4gIiwiIEFyZ1R5cGUgOworCitBcmdUeXBlTGlzdEkgOjo9IEFyZ1R5cGVMaXN0IHwgQXJnVHlwZUxpc3QgXiAiLCIgIi4uLiIgfCAiLi4uIiB8IF8gOworCitUeXBlTGlzdEkgOjo9IFR5cGVzIHwgVHlwZUxpc3RJIF4gIiwiIFR5cGVzIDsKKworQ29uc3RWYWw6Oj0gVHlwZXMgIlsiIF4gQ29uc3RWZWN0b3IgXiAiXSIKKyB8IFR5cGVzICJbIiBeICJdIgorIHwgVHlwZXMgImMiIF4gU1RSSU5HQ09OU1RBTlQKKyB8IFR5cGVzICI8IiBeIENvbnN0VmVjdG9yIF4gIj4iCisgfCBUeXBlcyAieyIgQ29uc3RWZWN0b3IgIn0iCisgfCBUeXBlcyAieyIgXiAifSIKKyB8IFR5cGVzICI8IiBeICJ7IiBDb25zdFZlY3RvciAifSIgXiAiPiIKKyB8IFR5cGVzICI8IiBeICJ7IiBeICJ9IiBeICI+IgorIHwgVHlwZXMgbnVsbAorIHwgVHlwZXMgdW5kZWYKKyB8IFR5cGVzIFN5bWJvbGljVmFsdWVSZWYKKyB8IFR5cGVzIENvbnN0RXhwcgorIHwgVHlwZXMgemVyb2luaXRpYWxpemVyCisgfCBUeXBlcyBFU0lOVDY0VkFMCisgfCBUeXBlcyBFU0FQSU5UVkFMCisgfCBUeXBlcyBFVUlOVDY0VkFMCisgfCBUeXBlcyBFVUFQSU5UVkFMCisgfCBUeXBlcyB0cnVlCisgfCBUeXBlcyBmYWxzZQorIHwgVHlwZXMgRlBWQUwgOworCitDb25zdEV4cHI6Oj0gQ2FzdE9wcyAiKCIgXiBDb25zdFZhbCB0byBUeXBlcyBeICIpIgorIHwgZ2V0ZWxlbWVudHB0ciBPcHRJbkJvdW5kcyAiKCIgXiBDb25zdFZhbCBJbmRleExpc3QgXiAiKSIKKyB8IHNlbGVjdCAiKCIgXiBDb25zdFZhbCBeICIsIiBDb25zdFZhbCBeICIsIiBDb25zdFZhbCBeICIpIgorIHwgQXJpdGhtZXRpY09wcyAiKCIgXiBDb25zdFZhbCBeICIsIiBDb25zdFZhbCBeICIpIgorIHwgTG9naWNhbE9wcyAiKCIgXiBDb25zdFZhbCBeICIsIiBDb25zdFZhbCBeICIpIgorIHwgaWNtcCBJUHJlZGljYXRlcyAiKCIgXiBDb25zdFZhbCBeICIsIiBDb25zdFZhbCBeICIpIgorIHwgZmNtcCBGUHJlZGljYXRlcyAiKCIgXiBDb25zdFZhbCBeICIsIiBDb25zdFZhbCBeICIpIgorIHwgZXh0cmFjdGVsZW1lbnQgIigiIF4gQ29uc3RWYWwgXiAiLCIgQ29uc3RWYWwgXiAiKSIKKyB8IGluc2VydGVsZW1lbnQgIigiIF4gQ29uc3RWYWwgXiAiLCIgQ29uc3RWYWwgXiAiLCIgQ29uc3RWYWwgXiAiKSIKKyB8IHNodWZmbGV2ZWN0b3IgIigiIF4gQ29uc3RWYWwgXiAiLCIgQ29uc3RWYWwgXiAiLCIgQ29uc3RWYWwgXiAiKSIKKyB8IGV4dHJhY3R2YWx1ZSAiKCIgXiBDb25zdFZhbCBeIENvbnN0YW50SW5kZXhMaXN0IF4gIikiCisgfCBpbnNlcnR2YWx1ZSAiKCIgXiBDb25zdFZhbCBeICIsIiBDb25zdFZhbCBeIENvbnN0YW50SW5kZXhMaXN0IF4gIikiIDsKKworQ29uc3RWZWN0b3IgOjo9IENvbnN0VmVjdG9yIF4gIiwiIENvbnN0VmFsIHwgQ29uc3RWYWwgOworCitHbG9iYWxUeXBlIDo6PSBnbG9iYWwgfCBjb25zdGFudCA7CisKK1RocmVhZExvY2FsIDo6PSAtICJ0aHJlYWRfbG9jYWwiIHwgXyA7CisKK0FsaWFzZWVSZWYgOjo9IFJlc3VsdFR5cGVzIFN5bWJvbGljVmFsdWVSZWYKKyB8IGJpdGNhc3QgIigiIF4gQWxpYXNlZVJlZiB0byBUeXBlcyBeICIpIiA7CisKK01vZHVsZSA6Oj0gKysrIERlZmluaXRpb25MaXN0IHwgLS0tIF8gOworCitEZWZpbml0aW9uTGlzdCA6Oj0gLSBEZWZpbml0aW9uIHwgKyBEZWZpbml0aW9uTGlzdCBEZWZpbml0aW9uIDsKKworRGVmaW5pdGlvbgorICA6Oj0gXiAoICsrKysrIGRlZmluZSBGdW5jdGlvbgorIHwgZGVjbGFyZSBGdW5jdGlvblByb3RvCisgfCAtIG1vZHVsZSBhc20gQXNtQmxvY2sKKyB8IE9wdExvY2FsQXNzaWduIHR5cGUgVHlwZXMKKyB8IE9wdEdsb2JhbEFzc2lnbiBHVlZpc2liaWxpdHlTdHlsZSBUaHJlYWRMb2NhbCBPcHRBZGRyU3BhY2UgR2xvYmFsVHlwZQorICAgQ29uc3RWYWwgR2xvYmFsVmFyQXR0cmlidXRlcworIHwgT3B0R2xvYmFsQXNzaWduIEdWSW50ZXJuYWxMaW5rYWdlIEdWVmlzaWJpbGl0eVN0eWxlIFRocmVhZExvY2FsIE9wdEFkZHJTcGFjZQorICAgR2xvYmFsVHlwZSBDb25zdFZhbCBHbG9iYWxWYXJBdHRyaWJ1dGVzCisgfCBPcHRHbG9iYWxBc3NpZ24gR1ZFeHRlcm5hbExpbmthZ2UgR1ZWaXNpYmlsaXR5U3R5bGUgVGhyZWFkTG9jYWwgT3B0QWRkclNwYWNlCisgICBHbG9iYWxUeXBlIFR5cGVzIEdsb2JhbFZhckF0dHJpYnV0ZXMKKyB8IE9wdEdsb2JhbEFzc2lnbiBHVlZpc2liaWxpdHlTdHlsZSBhbGlhcyBBbGlhc0xpbmthZ2UgQWxpYXNlZVJlZgorIHwgdGFyZ2V0IFRhcmdldERlZmluaXRpb24KKyB8IGRlcGxpYnMgIj0iIExpYnJhcmllc0RlZmluaXRpb24KKyApIF4gIlxuIjsKKworQXNtQmxvY2sgOjo9IFNUUklOR0NPTlNUQU5UIDsKKworVGFyZ2V0RGVmaW5pdGlvbiA6Oj0gdHJpcGxlICI9IiBTVFJJTkdDT05TVEFOVAorIHwgZGF0YWxheW91dCAiPSIgU1RSSU5HQ09OU1RBTlQgOworCitMaWJyYXJpZXNEZWZpbml0aW9uIDo6PSAiWyIgKCBMaWJMaXN0IHwgXyApICJdIjsKKworTGliTGlzdCA6Oj0gTGliTGlzdCBeICIsIiBTVFJJTkdDT05TVEFOVCB8IFNUUklOR0NPTlNUQU5UIDsKKworQXJnTGlzdEggOjo9IEFyZ0xpc3RIIF4gIiwiIFR5cGVzIE9wdFBhcmFtQXR0cnMgT3B0TG9jYWxOYW1lCisgfCBUeXBlcyBPcHRQYXJhbUF0dHJzIE9wdExvY2FsTmFtZSA7CisKK0FyZ0xpc3QgOjo9IEFyZ0xpc3RIIHwgQXJnTGlzdEggXiAiLCIgIi4uLiIgfCAiLi4uIiB8IF8gOworCitGdW5jdGlvbkhlYWRlckggOjo9IE9wdENhbGxpbmdDb252IE9wdFJldEF0dHJzIFJlc3VsdFR5cGVzCisgICAgICAgICAgICAgICAgICBHbG9iYWxOYW1lIF4gIigiIF4gQXJnTGlzdCBeICIpIgorICAgICAgICAgICAgICAgICAgT3B0RnVuY0F0dHJzIE9wdFNlY3Rpb24gT3B0QWxpZ24gT3B0R0MgOworCitCRUdJTiA6Oj0gKCBiZWdpbiB8ICJ7IiApIF4gIlxuIjsKKworRnVuY3Rpb25IZWFkZXIgOjo9CisgIEZ1bmN0aW9uRGVmaW5lTGlua2FnZSBHVlZpc2liaWxpdHlTdHlsZSBGdW5jdGlvbkhlYWRlckggQkVHSU4gOworCitFTkQgOjo9IF4gKCBlbmQgfCAifSIgKSBeICJcbiI7CisKK0Z1bmN0aW9uIDo6PSBCYXNpY0Jsb2NrTGlzdCBFTkQgOworCitGdW5jdGlvblByb3RvIDo6PSBGdW5jdGlvbkRlY2xhcmVMaW5rYWdlIEdWVmlzaWJpbGl0eVN0eWxlIEZ1bmN0aW9uSGVhZGVySCA7CisKK09wdFNpZGVFZmZlY3QgOjo9IF8gfCBzaWRlZWZmZWN0IDsKKworQ29uc3RWYWx1ZVJlZiA6Oj0gRVNJTlQ2NFZBTAorIHwgRVVJTlQ2NFZBTAorIHwgRlBWQUwKKyB8IHRydWUKKyB8IGZhbHNlCisgfCBudWxsCisgfCB1bmRlZgorIHwgemVyb2luaXRpYWxpemVyCisgfCAiPCIgQ29uc3RWZWN0b3IgIj4iCisgfCAiWyIgQ29uc3RWZWN0b3IgIl0iCisgfCAiWyIgXiAiXSIKKyB8ICJjIiBeIFNUUklOR0NPTlNUQU5UCisgfCAieyIgQ29uc3RWZWN0b3IgIn0iCisgfCAieyIgXiAifSIKKyB8ICI8IiBeICJ7IiBDb25zdFZlY3RvciAifSIgXiAiPiIKKyB8ICI8IiBeICJ7IiBeICJ9IiBeICI+IgorIHwgQ29uc3RFeHByCisgfCBhc20gT3B0U2lkZUVmZmVjdCBTVFJJTkdDT05TVEFOVCBeICIsIiBTVFJJTkdDT05TVEFOVCA7CisKK1N5bWJvbGljVmFsdWVSZWYgOjo9IExPQ0FMVkFMSUQKKyB8IEdMT0JBTFZBTElECisgfCBMb2NhbE5hbWUKKyB8IEdsb2JhbE5hbWUgOworCitWYWx1ZVJlZiA6Oj0gU3ltYm9saWNWYWx1ZVJlZiB8IENvbnN0VmFsdWVSZWY7CisKK1Jlc29sdmVkVmFsIDo6PSBUeXBlcyBWYWx1ZVJlZiA7CisKK1JldHVybmVkVmFsIDo6PSBSZXNvbHZlZFZhbCB8IFJldHVybmVkVmFsIF4gIiwiIFJlc29sdmVkVmFsIDsKKworQmFzaWNCbG9ja0xpc3QgOjo9IEJhc2ljQmxvY2tMaXN0IEJhc2ljQmxvY2sgfCBGdW5jdGlvbkhlYWRlciBCYXNpY0Jsb2NrIDsKKworQmFzaWNCbG9jayA6Oj0gSW5zdHJ1Y3Rpb25MaXN0IE9wdExvY2FsQXNzaWduIEJCVGVybWluYXRvckluc3QgOworCitJbnN0cnVjdGlvbkxpc3QgOjo9ICsrKyBJbnN0cnVjdGlvbkxpc3QgSW5zdAorIHwgLSBfCisgfCBeIExBQkVMU1RSIF4gIjpcbiIgOworCitCQlRlcm1pbmF0b3JJbnN0IDo6PSBeICIgICIgXgorICggcmV0IFJldHVybmVkVmFsCisgfCByZXQgdm9pZAorIHwgYnIgbGFiZWwgVmFsdWVSZWYKKyB8IGJyIElOVFRZUEUgVmFsdWVSZWYgXiAiLCIgbGFiZWwgVmFsdWVSZWYgXiAiLCIgbGFiZWwgVmFsdWVSZWYKKyB8IHN3aXRjaCBJbnRUeXBlIFZhbHVlUmVmIF4gIiwiIGxhYmVsIFZhbHVlUmVmICJbIiBKdW1wVGFibGUgIl0iCisgfCBzd2l0Y2ggSW50VHlwZSBWYWx1ZVJlZiBeICIsIiBsYWJlbCBWYWx1ZVJlZiAiWyIgXiAiXSIKKyB8IGludm9rZSBPcHRDYWxsaW5nQ29udiBSZXN1bHRUeXBlcyBWYWx1ZVJlZiBeICIoIiBeIFBhcmFtTGlzdCBeICIpIgorICAgT3B0RnVuY0F0dHJzCisgICB0byBsYWJlbCBWYWx1ZVJlZiB1bndpbmQgbGFiZWwgVmFsdWVSZWYKKyB8IHVud2luZAorIHwgdW5yZWFjaGFibGUgKSBeICJcbiI7CisKK0p1bXBUYWJsZSA6Oj0gSnVtcFRhYmxlIEludFR5cGUgQ29uc3RWYWx1ZVJlZiBeICIsIiBsYWJlbCBWYWx1ZVJlZgorIHwgSW50VHlwZSBDb25zdFZhbHVlUmVmIF4gIiwiIGxhYmVsIFZhbHVlUmVmIDsKKworSW5zdCA6Oj0gXiAiICAiIF4gT3B0TG9jYWxBc3NpZ24gSW5zdFZhbCBeICJcbiI7CisKK1BISUxpc3QgOjo9IFR5cGVzICJbIiBWYWx1ZVJlZiBeICIsIiBWYWx1ZVJlZiAiXSIKKyB8IFBISUxpc3QgXiAiLCIgIlsiIFZhbHVlUmVmIF4gIiwiIFZhbHVlUmVmICJdIiA7CisKK1BhcmFtTGlzdCA6Oj0gVHlwZXMgT3B0UGFyYW1BdHRycyBWYWx1ZVJlZiBPcHRQYXJhbUF0dHJzCisgfCBsYWJlbCBPcHRQYXJhbUF0dHJzIFZhbHVlUmVmIE9wdFBhcmFtQXR0cnMKKyB8IFBhcmFtTGlzdCBeICIsIiBUeXBlcyBPcHRQYXJhbUF0dHJzIFZhbHVlUmVmIE9wdFBhcmFtQXR0cnMKKyB8IFBhcmFtTGlzdCBeICIsIiBsYWJlbCBPcHRQYXJhbUF0dHJzIFZhbHVlUmVmIE9wdFBhcmFtQXR0cnMKKyB8IC0gXyA7CisKK0luZGV4TGlzdCA6Oj0gXyB8IEluZGV4TGlzdCBeICIsIiBSZXNvbHZlZFZhbCA7CisKK0NvbnN0YW50SW5kZXhMaXN0IDo6PSAiLCIgRVVJTlQ2NFZBTCB8IENvbnN0YW50SW5kZXhMaXN0IF4gIiwiIEVVSU5UNjRWQUwgOworCitPcHRUYWlsQ2FsbCA6Oj0gdGFpbCBjYWxsIHwgY2FsbCA7CisKK0luc3RWYWwgOjo9CisgICBBcml0aG1ldGljT3BzIFR5cGVzIFZhbHVlUmVmIF4gIiwiIFZhbHVlUmVmCisgfCBMb2dpY2FsT3BzIFR5cGVzIFZhbHVlUmVmIF4gIiwiIFZhbHVlUmVmCisgfCBpY21wIElQcmVkaWNhdGVzIFR5cGVzIFZhbHVlUmVmIF4gIiwiIFZhbHVlUmVmCisgfCBmY21wIEZQcmVkaWNhdGVzIFR5cGVzIFZhbHVlUmVmIF4gIiwiIFZhbHVlUmVmCisgfCBDYXN0T3BzIFJlc29sdmVkVmFsIHRvIFR5cGVzCisgfCBzZWxlY3QgUmVzb2x2ZWRWYWwgXiAiLCIgUmVzb2x2ZWRWYWwgXiAiLCIgUmVzb2x2ZWRWYWwKKyB8ICJ2YV9hcmciIFJlc29sdmVkVmFsIF4gIiwiIFR5cGVzCisgfCBleHRyYWN0ZWxlbWVudCBSZXNvbHZlZFZhbCBeICIsIiBSZXNvbHZlZFZhbAorIHwgaW5zZXJ0ZWxlbWVudCBSZXNvbHZlZFZhbCBeICIsIiBSZXNvbHZlZFZhbCBeICIsIiBSZXNvbHZlZFZhbAorIHwgc2h1ZmZsZXZlY3RvciBSZXNvbHZlZFZhbCBeICIsIiBSZXNvbHZlZFZhbCBeICIsIiBSZXNvbHZlZFZhbAorIHwgcGhpIFBISUxpc3QKKyB8IE9wdFRhaWxDYWxsIE9wdENhbGxpbmdDb252IFJlc3VsdFR5cGVzIFZhbHVlUmVmIF4gIigiIF4gUGFyYW1MaXN0IF4gIikiCisgICBPcHRGdW5jQXR0cnMKKyB8IE1lbW9yeUluc3QgOworCitPcHRWb2xhdGlsZSA6Oj0gLSB2b2xhdGlsZSB8IF8gOworT3B0RXhhY3QgOjo9IC0gZXhhY3QgfCBfIDsKK09wdE5TVyA6Oj0gLSBuc3cgfCBfIDsKK09wdE5VVyA6Oj0gLSBudXcgfCBfIDsKK09wdE5XICA6Oj0gT3B0TlVXIE9wdE5TVyB8IE9wdE5TVyBPcHROVVcgOworT3B0SW5Cb3VuZHMgIDo6PSAtIGluYm91bmRzIHwgXyA7CisKK01lbW9yeUluc3QgOjo9IG1hbGxvYyBUeXBlcyBPcHRDQWxpZ24KKyB8IG1hbGxvYyBUeXBlcyBeICIsIiBJTlRUWVBFIFZhbHVlUmVmIE9wdENBbGlnbgorIHwgYWxsb2NhIFR5cGVzIE9wdENBbGlnbgorIHwgYWxsb2NhIFR5cGVzIF4gIiwiIElOVFRZUEUgVmFsdWVSZWYgT3B0Q0FsaWduCisgfCBmcmVlIFJlc29sdmVkVmFsCisgfCBPcHRWb2xhdGlsZSBsb2FkIFR5cGVzIFZhbHVlUmVmIE9wdENBbGlnbgorIHwgT3B0Vm9sYXRpbGUgc3RvcmUgUmVzb2x2ZWRWYWwgXiAiLCIgVHlwZXMgVmFsdWVSZWYgT3B0Q0FsaWduCisgfCBnZXRyZXN1bHQgVHlwZXMgVmFsdWVSZWYgXiAiLCIgRVVJTlQ2NFZBTAorIHwgZ2V0ZWxlbWVudHB0ciBPcHRJbkJvdW5kcyBUeXBlcyBWYWx1ZVJlZiBJbmRleExpc3QKKyB8IGV4dHJhY3R2YWx1ZSBUeXBlcyBWYWx1ZVJlZiBeIENvbnN0YW50SW5kZXhMaXN0IAorIHwgaW5zZXJ0dmFsdWUgVHlwZXMgVmFsdWVSZWYgXiAiLCIgVHlwZXMgVmFsdWVSZWYgXiBDb25zdGFudEluZGV4TGlzdCA7CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9sbHZtZG8gYi9zcmMvTExWTS91dGlscy9sbHZtZG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwMjA4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xsdm1kbwpAQCAtMCwwICsxLDE4NCBAQAorIyEvYmluL3NoDQorIyM9PT0tIHV0aWxzL2xsdm1kbyAtIENvdW50cyBMaW5lcyBPZiBDb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBTY3JpcHQgLSotPT09IyMNCisjIA0KKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKyMNCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQ0KKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0KKyMgDQorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMNCisjDQorIyBUaGlzIHNjcmlwdCBpcyBhIGdlbmVyYWwgcHVycG9zZSAiYXBwbHkiIGZ1bmN0aW9uIGZvciB0aGUgc291cmNlIGZpbGVzIGluIExMVk0NCisjIEl0IHVzZXMgImZpbmQiIHRvIGxvY2F0ZSBhbGwgdGhlIHNvdXJjZSBmaWxlcyBhbmQgdGhlbiBhcHBsaWVzIHRoZSB1c2VyJ3MgDQorIyBjb21tYW5kIHRvIHRoZW0uIEFzIHN1Y2gsIHRoaXMgY29tbWFuZCBpcyBvZnRlbiBub3QgdXNlZCBieSBpdHNlbGYgbXVjaCBidXQNCisjIHRoZSBvdGhlciBmaW5kIHJlbGF0ZWQgdG9vbHMgKGNvdW50bG9jLnNoLGxsdm1ncmVwLGdldHNyY3Muc2gsdXNlcmxvYy5zaCkgYXJlDQorIyBhbGwgYmFzZWQgb24gdGhpcyBzY3JpcHQuICBUaGlzIHNjcmlwdCBkZWZpbmVzICJ3aGF0IGlzIGEgc291cmNlIGZpbGUiIGluIA0KKyMgTExWTSBhbmQgc28gc2hvdWxkIGJlIG1haW50YWluZWQgaWYgbmV3IGRpcmVjdG9yaWVzLCBuZXcgZmlsZSBleHRlbnNpb25zLCANCisjIGV0Yy4gYXJlIHVzZWQgaW4gTExWTSBhcyBpdCBwcm9ncmVzc2VzLg0KKyMNCisjIFVzYWdlOg0KKyMgIGxsdm1kbyBbLXRvcGRpciBESVJdIFstZGlycyAiRElSTkFNRVMuLi4iXSBbLWNvZGUtb25seV0gUFJPR1JBTSBBUkdTLi4uDQorIw0KKyMgVGhlIC10b3BkaXIgb3B0aW9uIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbGx2bSBzb3VyY2Ugcm9vdCBkaXJlY3RseS4gSWYgaXQNCisjIGlzIG5vdCBzcGVjaWZpZWQgdGhlbiBpdCB3aWxsIGJlIG9idGFpbmVkIHdpdGggbGx2bS1jb25maWcgd2hpY2ggbXVzdCBiZSBidWlsdA0KKyMgYW5kIGluIHlvdXIgcGF0aC4NCisjDQorIyBUaGUgLWRpcnMgYXJndW1lbnQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzZXQgb2YgZGlyZWN0b3JpZXMgdGhhdCBhcmUgDQorIyBzZWFyY2hlZC4gVGhlIGRlZmF1bHQgbGlzdCBvZiBkaXJlY3RvcmllcyBzZWFyY2hlZCBpczoNCisjICAgaW5jbHVkZSBsaWIgdG9vbHMgdXRpbHMgcnVudGltZSBhdXRvY29uZiBkb2NzIHRlc3QgZXhhbXBsZXMgcHJvamVjdHMNCisjIE5vdGUgdGhhdCB5b3UgbXVzdCB1c2UgcXVvdGVzIGFyb3VuZCB0aGUgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMuIA0KKyMNCisjIFRoZSAtY29kZS1vbmx5IG9wdGlvbiBzcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIHRoYXQgYXJlIGNvbnNpZGVyZWQgDQorIyAiY29kZSIgc2hvdWxkIGJlIHZpc2l0ZWQuIEhUTUwgZG9jdW1lbnRhdGlvbiBpcyBjb25zaWRlcmVkIGNvZGUsIGJ1dCB0aGluZ3MgDQorIyBsaWtlIFJFQURNRSBmaWxlcywgZXRjLiBhcmUgbm90Lg0KKyMNCisjIEZpbmFsbHksIHlvdSBzaW1wbHkgc3BlY2lmeSB3aGF0ZXZlciBwcm9ncmFtIHlvdSB3YW50IHRvIHJ1biBhZ2FpbnN0IGVhY2ggDQorIyBmaWxlIGFuZCB0aGUgYXJndW1lbnRzIHRvIGdpdmUgaXQuIFRoZSBQUk9HUkFNIHdpbGwgYmUgZ2l2ZW4gdGhlIGZpbGUgbmFtZSANCisjIGFzIGl0cyBsYXN0IGFyZ3VtZW50Lg0KKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjDQorDQoraWYgdGVzdCAkIyAtbHQgMSA7IHRoZW4NCisgIGVjaG8gIlVzYWdlOiBsbHZtZG8gWy10b3BkaXIgRElSXSBbLWRpcnMgIkRJUk5BTUVTLi4uIl0gWy1jb2RlLW9ubHldIFBST0dSQU0gQVJHUy4uLiINCisgIGV4aXQgMQ0KK2ZpDQorDQoraWYgdGVzdCAiJDEiID0gIi10b3BkaXIiIDsgdGhlbg0KKyAgVE9QRElSPSIkMiINCisgIHNoaWZ0OyBzaGlmdDsNCitlbHNlDQorICBUT1BESVI9YGxsdm0tY29uZmlnIC0tc3JjLXJvb3RgDQorZmkNCisNCitpZiB0ZXN0ICIkMSIgPSAiLWRpcnMiIDsgdGhlbg0KKyAgTExWTURPX0RJUlM9IiQyIg0KKyAgc2hpZnQgOyBzaGlmdA0KK2VsaWYgdGVzdCAteiAiJExMVk1ET19ESVJTIiA7IHRoZW4NCisgIExMVk1ET19ESVJTPSJpbmNsdWRlIGxpYiB0b29scyB1dGlscyBydW50aW1lIGF1dG9jb25mIGRvY3MgdGVzdCBleGFtcGxlcyBwcm9qZWN0cyBjbWFrZSINCitmaQ0KKw0KK2lmIHRlc3QgIiQxIiA9ICItY29kZS1vbmx5IiA7IHRoZW4NCisgIENPREVfT05MWT0ic2V0Ig0KKyAgc2hpZnQNCitlbHNlDQorICBDT0RFX09OTFk9IiINCitmaQ0KKw0KK2lmIHRlc3QgIiQxIiA9ICIiIDsgdGhlbg0KKyAgZWNobyAiTWlzc2luZyBwcm9ncmFtIG5hbWUgdG8gcnVuIg0KKyAgZXhpdCAxDQorZmkNCisNCitQUk9HUkFNPWB3aGljaCAkMWANCitpZiB0ZXN0ICEgLXggIiRQUk9HUkFNIiA7IHRoZW4NCisgIGVjaG8gIkNhbid0IGV4ZWN1dGUgJDEiDQorICBleGl0IDENCitmaQ0KK3NoaWZ0Ow0KKw0KK3BhdGhzX3RvX2lnbm9yZT0iXA0KKyAgLXBhdGggKi8uc3ZuLyAtbyBcDQorICAtcGF0aCAqLy5zdm4vKiAtbyBcDQorICAtcGF0aCBkb2NzL2RveHlnZW4vKiAtbyBcDQorICAtcGF0aCBkb2NzL0NvbW1hbmRHdWlkZS9odG1sLyogLW8gXA0KKyAgLXBhdGggZG9jcy9Db21tYW5kR3VpZGUvbWFuLyogLW8gXA0KKyAgLXBhdGggZG9jcy9Db21tYW5kR3VpZGUvcHMvKiAtbyBcDQorICAtcGF0aCBkb2NzL0NvbW1hbmRHdWlkZS9tYW4vKiAtbyBcDQorICAtcGF0aCBkb2NzL0hpc3RvcmljYWxOb3Rlcy8qIC1vIFwNCisgIC1wYXRoIGRvY3MvaW1nLyogLW8gXA0KKyAgLXBhdGggKi8ubGlicy8qIC1vIFwNCisgIC1wYXRoIGxpYi9TdXBwb3J0L2J6aXAyLyogLW8gXA0KKyAgLXBhdGggcHJvamVjdHMvbGx2bS10ZXN0LyogXA0KKyINCitmaWxlc190b19tYXRjaD0iXA0KKyAgICAgLW5hbWUgKi5hYyBcDQorICAtbyAtbmFtZSAqLmIgXA0KKyAgLW8gLW5hbWUgKi5jIFwNCisgIC1vIC1uYW1lICouY2MgXA0KKyAgLW8gLW5hbWUgKi5jZmcgXA0KKyAgLW8gLW5hbWUgKi5jcHAgXA0KKyAgLW8gLW5hbWUgKi5jc3MgXA0KKyAgLW8gLW5hbWUgKi5kZWYgXA0KKyAgLW8gLW5hbWUgKi5lbCBcDQorICAtbyAtbmFtZSAqLmV4cCBcDQorICAtbyAtbmFtZSAqLmZvb3RlciBcDQorICAtbyAtbmFtZSAqLmdudXBsb3QnIFwNCisgIC1vIC1uYW1lICouaCBcDQorICAtbyAtbmFtZSAqLmhlYWRlciBcDQorICAtbyAtbmFtZSAqLmh0bWwgXA0KKyAgLW8gLW5hbWUgKi5pbiBcDQorICAtbyAtbmFtZSAqLmluYyBcDQorICAtbyAtbmFtZSAqLmludHJvIFwNCisgIC1vIC1uYW1lICoubCBcDQorICAtbyAtbmFtZSAqLmxsIFwNCisgIC1vIC1uYW1lICoubHN0IFwNCisgIC1vIC1uYW1lICoubTQgXA0KKyAgLW8gLW5hbWUgKi5wb2QgXA0KKyAgLW8gLW5hbWUgKi5wbCBcDQorICAtbyAtbmFtZSAqLnB5IFwNCisgIC1vIC1uYW1lICouc2ggXA0KKyAgLW8gLW5hbWUgKi5zY2hlbWEgXA0KKyAgLW8gLW5hbWUgKi5zdCBcDQorICAtbyAtbmFtZSAqLnRjbCBcDQorICAtbyAtbmFtZSAqLnRkIFwNCisgIC1vIC1uYW1lICoudHIgXA0KKyAgLW8gLW5hbWUgKi55IFwNCisgIC1vIC1uYW1lIE1ha2UqIFwNCisgIC1vIC1uYW1lICouY21ha2UgXA0KKyAgLW8gLW5hbWUgbGx2bWRvIFwNCisgIC1vIC1uYW1lIGxsdm1ncmVwIFwNCisgIC1vIC1uYW1lIGNoZWNrLWVhY2gtZmlsZSBcDQorICAtbyAtbmFtZSBjb2RnZW4tZGlmZiBcDQorICAtbyAtbmFtZSBsbHZtLW5hdGl2ZS1nY2MgXA0KKyAgLW8gLW5hbWUgbGx2bS1uYXRpdmUtZ3h4IFwNCisgIC1vIC1uYW1lIG1ha2VsbHZtIFwNCisgIC1vIC1wYXRoIGluY2x1ZGUvbGx2bS9BRFQvaWxpc3QgXA0KKyAgLW8gLXBhdGggdGVzdC9cKi5sbCBcDQorICAtbyAtcGF0aCB0ZXN0L1NjcmlwdHMvbm90IFwNCisgIC1vIC1wYXRoIHJ1bnRpbWUvXCoubGwgXA0KKyINCitpZiB0ZXN0IC16ICIkQ09ERV9PTkxZIiA7IHRoZW4NCisgIGZpbGVzX3RvX21hdGNoPSIkZmlsZXNfdG9fbWF0Y2ggXA0KKyAgICAtbyAtbmFtZSAqLnR4dCBcDQorICAgIC1vIC1uYW1lICouVFhUIFwNCisgICAgLW8gLW5hbWUgKi52aW0gXA0KKyAgICAtbyAtbmFtZSB2aW1yYyBcDQorICAgIC1vIC1uYW1lIFJFQURNRSBcDQorICAgIC1vIC1uYW1lIENPUFlJTkcuTElCIFwNCisgICAgLW8gLW5hbWUgTElDRU5TRSogIg0KK2ZpDQorZmlsZXNfdG9faWdub3JlPSJcDQorICAgICAtbmFtZSBcLiogXA0KKyAgLW8gLW5hbWUgKn4gXA0KKyAgLW8gLW5hbWUgIyogXA0KKyAgLW8gLW5hbWUgY29uZmlndXJlIFwNCisgIC1vIC1uYW1lIHNsb3cubGwgXA0KKyAgLW8gLW5hbWUgKmxpYnRvb2wqIFwNCisgIC1vIC1uYW1lIGx0ZGwqIFwNCisgIC1vIC1uYW1lIGx0ZGwubTQgXA0KKyAgLW8gLW5hbWUgbHRtYWluLm00IFwNCisgIC1vIC1uYW1lIGx0bWFpbi5zaCBcDQorICAtbyAtbmFtZSBhY2xvY2FsLm00IFwNCisgIC1vIC1uYW1lIGFjaW5jbHVkZS5tNCBcDQorICAtbyAtbmFtZSAqTG9vcFNpbXBsaWZ5Q3Jhc2gubGwgXA0KKyAgLW8gLW5hbWUgKkFTVC1SZW1vdmUubGwgXA0KKyAgLW8gLW5hbWUgUFBDUGVyZmVjdFNodWZmbGUuaCBcDQorIg0KKw0KK2lmIHRlc3QgLWQgIiRUT1BESVIiIDsgdGhlbg0KKyAgY2QgJFRPUERJUg0KKyAgIyBIYXZlIHRvIHVzZSB0aGUgcmlnaHQgImZpbmQiIG9uIGEgcGVyLXBsYXRmb3JtIGJhc2lzLiBNb3N0IHBsYXRmb3JtcyBoYXZlDQorICAjIEdudSBmaW5kIGFzICJmaW5kIiwgYnV0IFNvbGFyaXMgZG9lcyBub3QuDQorICBjYXNlIGB1bmFtZSAtc2AgaW4NCisgICAgU3VuT1MpIGZpbmRfcHJvZz1nZmluZCA7Ow0KKyAgICAqKSBmaW5kX3Byb2c9ZmluZCA7Ow0KKyAgZXNhYw0KKyAgIyBUdXJuIG9mZiBmaWxlIG5hbWUgZ2VuZXJhdGlvbiAoZ2xvYmJpbmcpIHNvIHRoYXQgc3Vic3RpdHV0aW9uIG9mIHRoZQ0KKyAgIyB2YXJpYWJsZXMgZG9lc24ndCBjYXVzZSB0aGUgc2hlbGwgdG8gY3JlYXRlIGxpc3RzIG9mIGZpbGUgbmFtZXMNCisgIHNldCAtZg0KKyAgJGZpbmRfcHJvZyAkTExWTURPX0RJUlMgLXR5cGUgZiBcDQorICAgIFwoICRwYXRoc190b19pZ25vcmUgXCkgLXBydW5lIFwNCisgICAgLW8gXCggXCggJGZpbGVzX3RvX21hdGNoIFwpIFwhIFwoICRmaWxlc190b19pZ25vcmUgXCkgXA0KKyAgICAtZXhlYyAkUFJPR1JBTSAiJEAiIHt9IFw7IFwpDQorZWxzZQ0KKyAgZWNobyAiQ2FuJ3QgZmluZCBMTFZNIHRvcCBkaXJlY3RvcnkgaW4gJFRPUERJUiINCitmaQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL2xsdm1ncmVwIGIvc3JjL0xMVk0vdXRpbHMvbGx2bWdyZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwZThhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL2xsdm1ncmVwCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaA0KKyMjPT09LSB1dGlscy9sbHZtZ3JlcCAtIENvdW50cyBMaW5lcyBPZiBDb2RlIC0tLS0tLS0tLS0tLS0tLS0tKi0gU2NyaXB0IC0qLT09PSMjDQorIyANCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisjDQorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4NCisjIA0KKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjDQorIw0KKyMgVGhpcyBzY3JpcHQgc2VhcmNoZXMgeW91ciBzcmNkaXIgZm9yIGFuIGVncmVwIHN0eWxlIHBhdHRlcm4uIFRoaXMgY2FuIHF1aWNrbHkNCisjIGhlbHAgeW91IGJ1aWxkIGEgbGlzdCBvZiB0aGUgcGxhY2VzIHlvdSBuZWVkIHRvIG1vZGlmeSB3aGVuIGNoYW5naW5nIGEgaGVhZGVyDQorIyBvciBvdGhlciAiZ2xvYmFsIiBuYW1lLiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgcGF0dGVybiB5b3Ugd2FudCB0byBzZWFyY2gNCisjIGZvci4gSXQgc2hvdWxkIGJlIHF1b3RlZCB0byBlc2NhcGUgc2hlbGwgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHBhdHRlcm4ncw0KKyMgc3BlY2lhbCBjaGFyYWN0ZXJzLg0KKyMNCisjIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gbGx2bWRvLiBTZWUgdGhhdCBzY3JpcHQgZm9yIG1vcmUNCisjIGRldGFpbHMuDQorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMNCisNCitpZiB0ZXN0ICIkMSIgPSAiLXRvcGRpciIgOyB0aGVuDQorICBUT1BESVI9IiQyIg0KKyAgc2hpZnQ7IHNoaWZ0Ow0KK2Vsc2UNCisgIFRPUERJUj1gbGx2bS1jb25maWcgLS1zcmMtcm9vdGANCitmaQ0KKw0KK2lmIHRlc3QgLWQgIiRUT1BESVIiIDsgdGhlbg0KKyAgY2QgJFRPUERJUg0KKyAgY2FzZSBgdW5hbWUgLXNgIGluDQorICAgIFN1bk9TKSBncmVwX2NtZD0iZ2dyZXAgLUggLW4iIDs7DQorICAgIExpbnV4KSBncmVwX2NtZD0iZWdyZXAgLUggLW4iIDs7DQorICAgICopIGdyZXBfY21kPSJlZ3JlcCAtbCAtbiIgOzsNCisgIGVzYWMNCisgIC4vdXRpbHMvbGx2bWRvIC10b3BkaXIgIiRUT1BESVIiIFwNCisgICAgLWRpcnMgImluY2x1ZGUgbGliIHRvb2xzIHV0aWxzIGRvY3MgZXhhbXBsZXMgdGVzdCB1bml0dGVzdHMgcHJvamVjdHMgY21ha2UiICRncmVwX2NtZCAiJCoiDQorZWxzZQ0KKyAgZWNobyAiQ2FuJ3QgZmluZCBMTFZNIHRvcCBkaXJlY3RvcnkiDQorZmkNCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9tYWtlbGx2bSBiL3NyYy9MTFZNL3V0aWxzL21ha2VsbHZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjFjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy9tYWtlbGx2bQpAQCAtMCwwICsxLDE0NSBAQAorIyEvYmluL2NzaCAtZg0KKw0KK3NldCBwc3RhdHVzID0gMA0KK29uaW50ciBjbGVhbnVwDQorYWxpYXMgdXNhZ2UgJ2VjaG8gIlVTQUdFOiAkMDp0IFstaF0gWy1uXSBbLW9iaiBvYmotcm9vdF0gW2dtYWtlLWZsYWdzXSBbVkFSPS4uLl0gW3Rvb2xuYW1lIChkZWZhdWx0OiBvcHQpXSI7IHNldCBwc3RhdHVzID0gMTsgZ290byBjbGVhbnVwJw0KKw0KK3NldCBFWEVDID0gb3B0DQorc2V0IEdNQUtFX09QVFMgPSAiIg0KK3NldCBERUJVRyA9IDANCisNCisjIyBTZWFyY2ggcGF0aCBmb3IgYXV0b21hdGljYWxseSBmaW5kaW5nIHRoZSBvYmotcm9vdCB0byB1c2UuDQorIyMgTm90ZTogVGhlIHNyYyByb290IGRpcmVjdG9yeSAke0xMVk1ESVJ9IHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoaXMgcGF0aCBsYXRlci4NCisjIyANCitzZXQgT0JKUk9PVERJUkxJU1QgPSAoICkNCisNCitzZXQgZG9pdCA9IDENCit1bnNldCBvcHRpb25zX2RvbmUNCit3aGlsZSAoICEoICQ/b3B0aW9uc19kb25lICkgJiYgKCQjYXJndiA+IDApKQ0KKyAgICBzd2l0Y2ggKCRhcmd2WzFdKQ0KKwljYXNlIC1oIDoNCisJICAgIHVzYWdlDQorCWNhc2UgLWYgOg0KKwkgICAgaWYgKCQjYXJndiA8IDIpIHVzYWdlDQorCSAgICBzaGlmdCBhcmd2OyBzZXQgTUZJTEUgPSAkYXJndlsxXTsgc2hpZnQgYXJndjsgYnJlYWtzdw0KKwljYXNlIC1uIDoNCisJICAgIHNldCBkb2l0ID0gMDsgc2hpZnQgYXJndjsgYnJlYWtzdw0KKwljYXNlIC1vYmogOg0KKwkgICAgc2V0IE9CSlJPT1QgPSAkYXJndlsyXTsgc2hpZnQgYXJndjsgc2hpZnQgYXJndg0KKwkgICAgaWYgKCEgLWQgIiRPQkpST09UIikgdGhlbg0KKwkJZWNobyAiRkFUQUw6IElsbGVnYWwgb2JqLXJvb3QgZGlyZWN0b3J5ICR7T0JKUk9PVH0iDQorCQlleGl0IDENCisJICAgIGVuZGlmDQorCSAgICBicmVha3N3DQorCWNhc2UgLWQgOg0KKwkgICAgc2V0IGRvaXQgPSAwOyBzZXQgREVCVUcgPSAxOyBzaGlmdCBhcmd2OyBicmVha3N3DQorCWNhc2UgLSogOg0KKwkgICAgc2V0IEdNQUtFX09QVFMgPSAoICRHTUFLRV9PUFRTICRhcmd2WzFdICk7IHNoaWZ0IGFyZ3Y7IGJyZWFrc3cNCisJZGVmYXVsdCA6DQorCSAgICBzZXQgb3B0YXJnID0gYGVjaG8gLW4gJGFyZ3ZbMV0gfCBzZWQgJ3MvXltePV0qJC8vJ2ANCisJICAgIGlmICgkI29wdGFyZykgdGhlbg0KKwkgICAgICAgIHNldCBHTUFLRV9PUFRTID0gKCAkR01BS0VfT1BUUyAkb3B0YXJnICkNCisJICAgICAgICBzaGlmdCBhcmd2DQorCSAgICBlbHNlDQorCSAgICAgICAgc2V0IG9wdGlvbnNfZG9uZQ0KKwkgICAgZW5kaWYNCisgICAgICAgICAgICBicmVha3N3DQorICAgIGVuZHN3DQorZW5kDQorDQoraWYgKCQjYXJndiA+IDEpIHRoZW4NCisgICAgZWNobyAnRVJST1I6IE1vcmUgdGhhbiBvbmUgdG9vbCBpcyBub3Qgc3VwcG9ydGVkIGJ5ICJtYWtlbGx2bSInDQorICAgIHVzYWdlDQorZW5kaWYNCitpZiAoJCNhcmd2ID4gMCkgdGhlbg0KKyAgICBzZXQgRVhFQyA9ICRhcmd2WzFdDQorZW5kaWYNCitpZiAoJERFQlVHKSB0aGVuDQorICAgIGVjaG8gIkRFQlVHOiBFWEVDID0gJEVYRUMiDQorZW5kaWYNCisNCisjIyBDb21wdXRlIExMVk1ESVI6IHRoZSByb290IG9mIHRoZSBjdXJyZW50IExMVk0gdHJlZS4NCisjIyBJdCBpcyByZWNvcmRlZCBpbiB0aGUgdmFyaWFibGUgTEVWRUwgaW4gTWFrZWZpbGUsIHRvIGNvbXB1dGUgaXQNCisjIyANCitpZiAoISAkP01GSUxFKSB0aGVuDQorICAgIGlmICgtZiBHTlVtYWtlZmlsZSkgdGhlbg0KKwlzZXQgTUZJTEUgPSBHTlVtYWtlZmlsZQ0KKyAgICBlbHNlIGlmICgtZiBtYWtlZmlsZSkgdGhlbg0KKwlzZXQgTUZJTEUgPSBtYWtlZmlsZQ0KKyAgICBlbHNlDQorCXNldCBNRklMRSA9IE1ha2VmaWxlDQorICAgIGVuZGlmDQorZW5kaWYNCitpZiAoJERFQlVHKSB0aGVuDQorICAgIGVjaG8gIkRFQlVHOiBNRklMRSA9ICRNRklMRSINCitlbmRpZg0KK2lmICghIC1mICRNRklMRSkgdGhlbg0KKyAgICBlY2hvICJNaXNzaW5nIG9yIGludmFsaWQgbWFrZWZpbGU6ICRNRklMRSINCisgICAgZXhpdCAxDQorZW5kaWYNCisNCitzZXQgTExWTURJUiA9IGBhd2sgJy9MRVZFTFsgCV0qPS8ge3ByaW50ICRORn0nICRNRklMRWANCitpZiAoJERFQlVHKSB0aGVuDQorICAgIGVjaG8gIkRFQlVHOiBMTFZNRElSID0gJExMVk1ESVIiDQorZW5kaWYNCisNCitpZiAoJCNMTFZNRElSID09IDAgfHwgISAtZCAiJExMVk1ESVIiKSB0aGVuDQorICAgIGVjaG8gIlVuYWJsZSB0byBmaW5kIExMVk0gc3JjLXJvb3QgZGlyZWN0b3J5IG9yIGRpcmVjdG9yeSBpcyBpbnZhbGlkLiINCisgICAgZWNobyAiQXJlIHlvdSB3aXRoaW4gYSB2YWxpZCBMTFZNIGRpcmVjdG9yeSBmb3IgcnVubmluZyBnbWFrZT8iDQorICAgIGV4aXQgMQ0KK2VuZGlmDQorDQorIyMgVHJ5IHRvIGRldGVybWluZSB0aGUgb2JqLXJvb3QgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkgaWYgbm90IHNwZWNpZmllZA0KKyMjIA0KK3NldCBPQkpST09URElSTElTVCA9ICggJHtMTFZNRElSfSAkT0JKUk9PVERJUkxJU1QgKQkjIyBhZGQgc3JjIGRpcg0KK2lmICgkP09CSlJPT1QgPT0gMCkgdGhlbg0KKyAgICAjIyBUcnkgdG8gZGV0ZXJtaW5lIG9iamVjdCByb290IGRpcmVjdG9yeSBieSBsb29raW5nIGZvciBNYWtlZmlsZS5jb25maWcNCisgICAgZm9yZWFjaCBvYmpkaXIgKCAkT0JKUk9PVERJUkxJU1QgKQ0KKwlpZiAoLWYgIiR7b2JqZGlyfS9NYWtlZmlsZS5jb25maWciKSB0aGVuDQorCSAgICBzZXQgT0JKUk9PVCA9ICR7b2JqZGlyfQ0KKyAgICAgICAgICAgIGJyZWFrDQorICAgICAgICBlbmRpZg0KKyAgICBlbmQNCisgICAgaWYgKCQ/T0JKUk9PVCA9PSAwKSB0aGVuDQorCWVjaG8gIkZBVEFMOiBDb3VsZCBub3QgY2hvb3NlIGFuIG9iai1yb290IGRpcmVjdG9yeSBmcm9tIHRoZXNlIGNob2ljZXM6Ig0KKwllY2hvICIgICAgICAgJHtPQkpST09URElSTElTVH0uIg0KKwllY2hvICIgICAgICAgWW91IGNhbiBzcGVjaWZ5IGl0IGV4cGxpY2l0bHkgdXNpbmcgJy1vYmogb2JqLXJvb3QnLiINCisJZXhpdCAxDQorICAgIGVuZGlmDQorICAgIGVjaG8gIlVzaW5nIE9CSi1ST09UID0gJHtPQkpST09UfSAoc3BlY2lmeSAnLW9iaiBvYmotcm9vdCcgdG8gb3ZlcnJpZGUpLiINCitlbmRpZg0KK2lmICgke09CSlJPT1R9ID09ICR7TExWTURJUn0pIHRoZW4NCisgICAgIyBydW4gbWFrZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBpdHNlbGYNCisgICAgc2V0IEJVSUxEUk9PVCA9IC4NCitlbHNlDQorICAgICMgcnVuIG1ha2UgaW4gdGhlIGluIHRoZSBvYmotcm9vdCB0cmVlLCBpbiB0aGUgZGlyZWN0b3J5IGZvciAkY3dkDQorICAgIHNldCBTUkNST09UID0gYHNoIC1jICJjZCAkTExWTURJUjsgcHdkIHwgc2VkICdzL1wvL1xcXC8vZyciYCANCisgICAgc2V0IENVUlNSQ0RJUiA9IGBlY2hvICRjd2QgfCBzZWQgLWUgInMvJHtTUkNST09UfS8vImANCisgICAgc2V0IEJVSUxEUk9PVCA9ICR7T0JKUk9PVH0vJHtDVVJTUkNESVJ9DQorICAgIHVuc2V0IFNSQ1JPT1QgQ1VSU1JDRElSDQorZW5kaWYNCitpZiAoJERFQlVHKSB0aGVuDQorICAgIGVjaG8gIkRFQlVHOiBCVUlMRFJPT1QgPSAkQlVJTERST09UIg0KK2VuZGlmDQoraWYgKCEgLWQgJEJVSUxEUk9PVCkgdGhlbg0KKyAgICBlY2hvICJGQVRBTDogSW52YWxpZCBidWlsZCBkaXJlY3Rvcnk6ICR7QlVJTERST09UfSINCisgICAgZXhpdCAxDQorZW5kaWYNCitjZCAkQlVJTERST09UIA0KKw0KK3NldCBDTUQgPSAibWFrZSAkR01BS0VfT1BUUyAmJiAoY2QgJExMVk1ESVIvdG9vbHMvJEVYRUMgJiYgbWFrZSAkR01BS0VfT1BUUykiDQorDQoraWYgKCRkb2l0ID09IDEpIHRoZW4NCisgICAgY3NoIC1mIC1jICIkQ01EIg0KKyAgICBzZXQgcHN0YXR1cyA9ICQ/DQorZWxzZQ0KKyAgICBlY2hvICcoTk9UIEVYRUNVVElORykgQ09NTUFORDonDQorICAgIGVjaG8gIiAgJENNRCINCitlbmRpZg0KKw0KKw0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjIENPREUgVE8gQkUgRVhFQ1VURUQgSUYgSU5URVJSVVBUIElTIFJFQ0VJVkVEDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK2NsZWFudXA6DQorICAgIGV4aXQoJHBzdGF0dXMpDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbWtwYXRjaCBiL3NyYy9MTFZNL3V0aWxzL21rcGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1ZGJiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL21rcGF0Y2gKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL2Jhc2gNCisjDQorIyBUaGlzIHNjcmlwdCBtYWtlcyBhIHBhdGNoIGZvciBMTFZNIGVuc3VyaW5nIHRoZSBjb3JyZWN0IGRpZmYgb3B0aW9ucyBhbmQNCisjIHB1dHRpbmcgdGhlIGZpbGVzIGluIGEgc3RhbmRhcmQgcmV2aWV3IG9yZGVyLg0KKw0KKw0KK2Z1bmN0aW9uIGVycm9yIHsNCisgIHJldGNvZGU9IiQ/Ig0KKyAgZWNobyAibWtwYXRjaDogZXJyb3I6ICQxICgkcmV0Y29kZSkiDQorICBleGl0IDENCit9DQorDQoraWYgWyAhIC1lIGxsdm0uc3BlYy5pbiBdIDsgdGhlbg0KKyAgZXJyb3IgIlBsZWFzZSBjaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSBMTFZNIHRvcCBzb3VyY2UgZGlyZWN0b3J5Ig0KK2ZpDQoraWYgWyAiJCMiIC1uZSAxIF0gOyB0aGVuDQorICBlcnJvciAidXNhZ2U6IHV0aWxzL21rcGF0Y2ggW1BBVENIX05BTUVdIg0KK2ZpDQorTkFNRT0iJDEiDQorZWNobyAibWtwYXRjaDogR2VuZXJhdGluZyBkaWZmZXJlbmNlcyBvbiB0b3AgbGV2ZWwgZmlsZXMiDQorc3ZuIGRpZmYgLU4gLXggLXUgPiAiJE5BTUUiLnBhdGNoLnJhdyAyPiYxDQorZWNobyAibWtwYXRjaDogR2VuZXJhdGluZyBkaWZmZXJlbmNlcyBvbiBhbGwgZGlyZWN0b3JpZXMiDQorc3ZuIGRpZmYgLXggLXUgID4+ICIkTkFNRSIucGF0Y2gucmF3IDI+JjEgXA0KKyAgYXV0b2NvbmYgZG9jcyB1dGlscyBpbmNsdWRlIGxpYi9TeXN0ZW0gbGliL1N1cHBvcnQgbGliL1ZNQ29yZSBsaWIvQXNtUGFyc2VyIFwNCisgIGxpYi9CaXRjb2RlIGxpYi9BbmFseXNpcyBsaWIvVHJhbnNmb3JtcyBsaWIvQ29kZUdlbiBsaWIvVGFyZ2V0IFwNCisgIGxpYi9FeGVjdXRpb25FbmdpbmUgbGliL0xpbmtlciBcDQorICB0b29scyB0ZXN0IHVuaXR0ZXN0cyBydW50aW1lIHByb2plY3RzIGV4YW1wbGVzIFhjb2RlDQorDQorZWNobyAibWtwYXRjaDogUmVtb3ZpbmcgY3J1ZnQgZnJvbSB0aGUgcGF0Y2ggZmlsZSINCitzZWQgLWUgJy9eWz9dIC4qL2QnIC1lICcvXmN2cyBkaWZmOiBEaWZmaW5nL2QnICIkTkFNRSIucGF0Y2gucmF3IHwgYXdrICdcDQorQkVHSU4geyBkZWxldGluZyA9IDA7IH0gXA0KKy9eSW5kZXg6IC4qWy5dY3ZzJC8geyBkZWxldGluZyA9IDE7IGZuYW1lPXN1YnN0cigkMCw3KTsgXA0KKyAgcHJpbnQgIlNraXBwaW5nOiAiLCBmbmFtZSA+ICIvZGV2L3N0ZGVyciI7IH0gXA0KKy9eSW5kZXg6LiovICYmICEvXkluZGV4OiAuKlsuXWN2cyQvIHsgZGVsZXRpbmcgPSAwOyB9IFwNCit7IGlmICghIGRlbGV0aW5nKSB7IHByaW50OyB9IH0gJyAgPiAiJE5BTUUiLnBhdGNoICB8fCBcDQorICBlcnJvciAic2VkL2F3ayBjbGVhbnVwIGZhaWxlZCINCisNCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9ub3QvQ01ha2VMaXN0cy50eHQgYi9zcmMvTExWTS91dGlscy9ub3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3YzgyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL25vdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDExIEBACithZGRfZXhlY3V0YWJsZShub3QKKyAgbm90LmNwcAorICApCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyhub3QgTExWTVN5c3RlbSkKK2lmKCBNSU5HVyApCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhub3QgaW1hZ2VobHAgcHNhcGkpCitlbmRpZiggTUlOR1cgKQoraWYoIExMVk1fRU5BQkxFX1RIUkVBRFMgQU5EIEhBVkVfTElCUFRIUkVBRCApCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhub3QgcHRocmVhZCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL25vdC9NYWtlZmlsZSBiL3NyYy9MTFZNL3V0aWxzL25vdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWY0ODAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbm90L01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMjPT09LSB1dGlscy9ub3QvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjIAorIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjIAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorVE9PTE5BTUUgPSBub3QKK1VTRURMSUJTID0gTExWTVN1cHBvcnQuYSBMTFZNU3lzdGVtLmEKKworIyBUaGlzIHRvb2wgaGFzIG5vIHBsdWdpbnMsIG9wdGltaXplIHN0YXJ0dXAgdGltZS4KK1RPT0xfTk9fRVhQT1JUUyA9IDEKKworIyBEb24ndCBpbnN0YWxsIHRoaXMgdXRpbGl0eQorTk9fSU5TVEFMTCA9IDEKKworaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KKwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvbm90L25vdC5jcHAgYi9zcmMvTExWTS91dGlscy9ub3Qvbm90LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDg5YjhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvbm90L25vdC5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy89PT0tIG5vdC5jcHAgLSBUaGUgJ25vdCcgdGVzdGluZyB0b29sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vU3lzdGVtL1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9Qcm9ncmFtLmgiCit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSB7CisgIHN5czo6UGF0aCBQcm9ncmFtID0gc3lzOjpQcm9ncmFtOjpGaW5kUHJvZ3JhbUJ5TmFtZShhcmd2WzFdKTsKKyAgcmV0dXJuICFzeXM6OlByb2dyYW06OkV4ZWN1dGVBbmRXYWl0KFByb2dyYW0sIGFyZ3YgKyAxKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3BhcnNlTkxULnBsIGIvc3JjL0xMVk0vdXRpbHMvcGFyc2VOTFQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhZmNhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL3BhcnNlTkxULnBsCkBAIC0wLDAgKzEsMzQgQEAKKyMhL3Vzci9iaW4vcGVybAorIyBhIGZpcnN0IGF0dGVtcHQgdG8gcGFyc2UgdGhlIG5pZ2h0bHkgdGVzdGVyIHBhZ2VzIGludG8gc29tZXRoaW5nCisjIG9uZSBjYW4gcmVhc29uIGFib3V0LCBuYW1lbHkgaW1wb3J0IGludG8gYSBkYXRhYmFzZQorIyBVU0U6IHBlcmwgcGFyc2VOTFQucGwgPDIwMDUtMDMtMzEuaHRtbAorIyBmb3IgZXhhbXBsZQorCit3aGlsZSg8PikKKyAgeworICAgIGlmICgvTExWTSBUZXN0IFJlc3VsdHMgZm9yIChcdyspIChcZCspLCAoXGQrKTwvKQorICAgICAgeworICAgICAgICAkbW9uID0gJDE7CisgICAgICAgICRkYXkgPSAkMjsKKyAgICAgICAgJHllYXIgPSAkMzsKKyAgICAgIH0KKyAgICBpZiAoLzx0ZD4oW148XSspPFwvdGQ+LykKKyAgICAgIHsKKyAgICAgICAgaWYgKCRwcmVmaXgpCisgICAgICAgICAgeyAkb3V0cHV0IC49ICIkMSAiOyAkY291bnQrKzsgfQorICAgICAgfQorICAgIGlmICgvPHRyLykKKyAgICAgIHsKKyAgICAgICAgaWYgKCRvdXRwdXQgYW5kICRjb3VudCA+IDMpCisgICAgICAgICAgeyBwcmludCAiXG4kZGF5ICRtb24gJHllYXIgJHByZWZpeC8kb3V0cHV0IjsgfQorCSRvdXRwdXQgPSAiIjsKKwkkY291bnQgPSAwOworICAgICAgfQorICAgIGlmICgvPGgyPihQcm9ncmFtcy4rKTxcL2gyPi8pCisgICAgICB7CisgICAgICAgICRwcmVmaXggPSAkMTsKKyAgICAgIH0KKyAgfQorCitpZiAoJG91dHB1dCkKKyAgeyBwcmludCAiXG4kZGF5ICRtb24gJHllYXIgJHByZWZpeC8kb3V0cHV0IjsgJG91dHB1dCA9ICIiOyB9CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9wbG90TkxULnBsIGIvc3JjL0xMVk0vdXRpbHMvcGxvdE5MVC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWQ1MDNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvcGxvdE5MVC5wbApAQCAtMCwwICsxLDUzIEBACisjIS91c3IvYmluL3BlcmwKKyN0YWtlcyBhIHRlc3QgYW5kIGEgcHJvZ3JhbSBmcm9tIGEgZHAgYW5kIHByb2R1Y2VzIGEgZ251cGxvdCBzY3JpcHQKKyN1c2UgbGlrZSBwZXJsIHBsb3ROTFQucGwgcGFzc3dvcmQgUHJvZ3JhbXMvTXVsdGlTb3VyY2UvQmVuY2htYXJrcy9BU0NJX1B1cnBsZS9TTUcyMDAwL3NtZzIwMDAgbGxjCisKK3VzZSBEQkk7CisKKyMgZGF0YWJhc2UgaW5mb3JtYXRpb24KKyRkYj0ibGx2bWFscGhhIjsKKyRob3N0PSJsb2NhbGhvc3QiOworJHVzZXJpZD0ibGx2bWRidXNlciI7CiskcGFzc3dkPXNoaWZ0IEBBUkdWOworJGNvbm5lY3Rpb25JbmZvPSJkYmk6bXlzcWw6JGRiOyRob3N0IjsKKworIyBtYWtlIGNvbm5lY3Rpb24gdG8gZGF0YWJhc2UKKyRkYmggPSBEQkktPmNvbm5lY3QoJGNvbm5lY3Rpb25JbmZvLCR1c2VyaWQsJHBhc3N3ZCkgb3IgZGllIERCSS0+ZXJyc3RyOworCisKKyRjb3VudCA9IEBBUkdWIC8gMjsKKworcHJpbnQgInNldCB4ZGF0YSB0aW1lXG4iOworcHJpbnQgJ3NldCB0aW1lZm10ICIlWS0lbS0lZCInOworcHJpbnQgIlxucGxvdCI7Citmb3IgKCRpdGVyID0gMDsgJGl0ZXIgPCAkY291bnQ7ICRpdGVyKyspIHsKKyAgaWYgKCRpdGVyKQorICAgIHsgcHJpbnQgIiwiOyB9CisgIHByaW50ICIgJy0nIHVzaW5nIDE6MiB3aXRoIGxpbmVzIjsKK30KKworcHJpbnQgIlxuIjsKKworZm9yICgkaXRlciA9IDA7ICRpdGVyIDwgJGNvdW50OyAkaXRlcisrKSB7CisKKyAgJHByb2cgPSBzaGlmdCBAQVJHVjsKKyAgJHRlc3QgPSBzaGlmdCBAQVJHVjsKKworICAkcXVlcnkgPSAiU2VsZWN0IFJVTiwgVkFMVUUgZnJvbSBUZXN0cyB3aGVyZSBURVNUID0gJyR0ZXN0JyBBTkQgTkFNRSA9ICckcHJvZycgT1JERVIgQlkgUlVOIjsKKyAgI3ByaW50ICJcbiRxdWVyeVxuIjsKKyAgCisgIG15ICRzdGggPSAkZGJoLT5wcmVwYXJlKCAkcXVlcnkpIHx8IGRpZSAiQ2FuJ3QgcHJlcGFyZSBzdGF0ZW1lbnQ6ICREQkk6OmVycnN0ciI7OworICAKKyAgbXkgJHJjID0gJHN0aC0+ZXhlY3V0ZSBvciBkaWUgREJJLT5lcnJzdHI7CisgIAorICB3aGlsZSgoJGRhLCR2KSA9ICRzdGgtPmZldGNocm93X2FycmF5KQorICAgIHsKKyAgICAgIHByaW50ICIkZGEgJHZcbiI7CisgICAgfQorICAKKyAgcHJpbnQgImVcbiI7Cit9CisKKworIyBkaXNjb25uZWN0IGZyb20gZGF0YWJhc2UKKyRkYmgtPmRpc2Nvbm5lY3Q7CmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy9wcm9maWxlLnBsIGIvc3JjL0xMVk0vdXRpbHMvcHJvZmlsZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTk1MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvcHJvZmlsZS5wbApAQCAtMCwwICsxLDc0IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgUHJvZ3JhbTogIHByb2ZpbGUucGwKKyMKKyMgU3lub3BzaXM6IEluc2VydCBpbnN0cnVtZW50YXRpb24gY29kZSBpbnRvIGEgcHJvZ3JhbSwgcnVuIGl0IHdpdGggdGhlIEpJVCwKKyMgICAgICAgICAgIHRoZW4gcHJpbnQgb3V0IGEgcHJvZmlsZSByZXBvcnQuCisjCisjIFN5bnRheDogICBwcm9maWxlLnBsIFtPUFRJT05TXSBieXRlY29kZWZpbGUgPGFyZ3VtZW50cz4KKyMKKyMgT1BUSU9OUyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nOgorIyAgICAgLWJsb2NrICAgIC0gRW5hYmxlIGJhc2ljYmxvY2sgcHJvZmlsaW5nCisjICAgICAtZWRnZSAgICAgLSBFbmFibGUgZWRnZSBwcm9maWxpbmcKKyMgICAgIC1mdW5jdGlvbiAtIEVuYWJsZSBmdW5jdGlvbiBwcm9maWxpbmcKKyMgICAgIC1vIDxmaWxlbmFtZT4gLSBFbWl0IHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgc3BlY2lmaWVkIGZpbGUsIGluc3RlYWQKKyMgICAgICAgICAgICAgICAgICAgICBvZiBsbHZtcHJvZi5vdXQKKyMKKyMgQW55IHVucmVjb2duaXplZCBvcHRpb25zIGFyZSBwYXNzZWQgaW50byB0aGUgaW52b2NhdGlvbiBvZiBsbHZtLXByb2YKKyMKKworbXkgJFByb2ZpbGVQYXNzID0gIi1pbnNlcnQtZWRnZS1wcm9maWxpbmciOworCitteSAkTExWTVByb2ZPcHRzID0gIiI7CitteSAkUHJvZ3JhbU9wdHMgPSAiIjsKK215ICRQcm9maWxlRmlsZSA9ICIiOworCisjIFBhcnNlIGFyZ3VtZW50cy4uLgord2hpbGUgKHNjYWxhcihAQVJHVikgYW5kICgkXyA9ICRBUkdWWzBdLCAvXlstK10vKSkgeworICBzaGlmdDsKKyAgbGFzdCBpZiAvXi0tJC87ICAjIFN0b3AgcHJvY2Vzc2luZyBhcmd1bWVudHMgb24gLS0KKworICAjIExpc3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgaGVyZS4uLgorICBpZiAoL14tPy1ibG9jayQvKSAgICB7ICRQcm9maWxlUGFzcyA9ICItaW5zZXJ0LWJsb2NrLXByb2ZpbGluZyI7IG5leHQ7IH0KKyAgaWYgKC9eLT8tZWRnZSQvKSAgICAgeyAkUHJvZmlsZVBhc3MgPSAiLWluc2VydC1lZGdlLXByb2ZpbGluZyI7IG5leHQ7IH0KKyAgaWYgKC9eLT8tZnVuY3Rpb24kLykgeyAkUHJvZmlsZVBhc3MgPSAiLWluc2VydC1mdW5jdGlvbi1wcm9maWxpbmciOyBuZXh0OyB9CisgIGlmICgvXi0/LW8kLykgeyAgICAgICAgICMgUmVhZCAtbyBmaWxlbmFtZS4uLgorICAgIGRpZSAiLW8gb3B0aW9uIHJlcXVpcmVzIGEgZmlsZW5hbWUgYXJndW1lbnQhIiBpZiAoIXNjYWxhcihAQVJHVikpOworICAgICRQcm9ncmFtT3B0cyAuPSAiIC1sbHZtcHJvZi1vdXRwdXQgJEFSR1ZbMF0iOworICAgICRQcm9maWxlRmlsZSA9ICRBUkdWWzBdOworICAgIHNoaWZ0OworICAgIG5leHQ7CisgIH0KKyAgaWYgKC9eLT8taGVscCQvKSB7CisgICAgcHJpbnQgIk9WRVJWSUVXOiBwcm9maWxlLnBsIC0gSW5zdHJ1bWVudGF0aW9uIGFuZCBwcm9maWxlIHByaW50ZXIuXG5cbiI7CisgICAgcHJpbnQgIlVTQUdFOiBwcm9maWxlLnBsIFtvcHRpb25zXSBwcm9ncmFtLmJjIDxwcm9ncmFtIGFyZ3M+XG5cbiI7CisgICAgcHJpbnQgIk9QVElPTlM6XG4iOworICAgIHByaW50ICIgIC1ibG9jayAgICAtIEVuYWJsZSBiYXNpY2Jsb2NrIHByb2ZpbGluZ1xuIjsKKyAgICBwcmludCAiICAtZWRnZSAgICAgLSBFbmFibGUgZWRnZSBwcm9maWxpbmdcbiI7CisgICAgcHJpbnQgIiAgLWZ1bmN0aW9uIC0gRW5hYmxlIGZ1bmN0aW9uIHByb2ZpbGluZ1xuIjsKKyAgICBwcmludCAiICAtbyA8ZmlsZT4gLSBTcGVjaWZ5IGFuIG91dHB1dCBmaWxlIG90aGVyIHRoYW4gbGx2bS1wcm9mLm91dC5cbiI7CisgICAgcHJpbnQgIiAgLWhlbHAgICAgIC0gUHJpbnQgdGhpcyB1c2FnZSBpbmZvcm1hdGlvblxuIjsKKyAgICBwcmludCAiXG5BbGwgb3RoZXIgb3B0aW9ucyBhcmUgcGFzc2VkIGludG8gbGx2bS1wcm9mLlxuIjsKKyAgICBleGl0IDE7CisgIH0KKworICAjIE90aGVyd2lzZSwgcGFzcyB0aGUgb3B0aW9uIG9uIHRvIGxsdm0tcHJvZgorICAkTExWTVByb2ZPcHRzIC49ICIgIiAuICRfOworfQorCitkaWUgIk11c3Qgc3BlY2lmeSBMTFZNIGJ5dGVjb2RlIGZpbGUgYXMgZmlyc3QgYXJndW1lbnQhIiBpZiAoQEFSR1YgPT0gMCk7CisKK215ICRCeXRlY29kZUZpbGUgPSAkQVJHVlswXTsKKworc2hpZnQgQEFSR1Y7CisKK215ICRsaWJkaXIgPSBgbGx2bS1jb25maWcgLS1saWJkaXJgOworY2hvbXAgJGxpYmRpcjsKKworbXkgJExpYlByb2ZQYXRoID0gJGxpYmRpciAuICIvcHJvZmlsZV9ydC5zbyI7CisKK3N5c3RlbSAib3B0IC1xIC1mICRQcm9maWxlUGFzcyAkQnl0ZWNvZGVGaWxlIC1vICRCeXRlY29kZUZpbGUuaW5zdCI7CitzeXN0ZW0gImxsaSAtZmFrZS1hcmd2MCAnJEJ5dGVjb2RlRmlsZScgLWxvYWQgJExpYlByb2ZQYXRoICIgLgorICAgICAgICIkQnl0ZWNvZGVGaWxlLmluc3QgJFByb2dyYW1PcHRzICIgLiAoam9pbiAnICcsIEBBUkdWKTsKK3N5c3RlbSAicm0gJEJ5dGVjb2RlRmlsZS5pbnN0IjsKK3N5c3RlbSAibGx2bS1wcm9mICRMTFZNUHJvZk9wdHMgJEJ5dGVjb2RlRmlsZSAkUHJvZmlsZUZpbGUiOwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvTWFrZWZpbGUgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTA5MzQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIyM9PT0tIHV0aWxzL3VuaXR0ZXN0L01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworTEVWRUwgPSAuLi8uLgorUEFSQUxMRUxfRElSUyA9IGdvb2dsZXRlc3QgVW5pdFRlc3RNYWluCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9Vbml0VGVzdE1haW4vTWFrZWZpbGUgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9Vbml0VGVzdE1haW4vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjNjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L1VuaXRUZXN0TWFpbi9NYWtlZmlsZQpAQCAtMCwwICsxLDMwIEBACisjIz09PS0gdXRpbHMvdW5pdHRlc3QvVW5pdFRlc3RNYWluL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitMRVZFTCA9IC4uLy4uLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCisKK0xJQlJBUllOQU1FID0gVW5pdFRlc3RNYWluCitCVUlMRF9BUkNISVZFID0gMQorUkVRVUlSRVNfUlRUSSA9IDEKKworQ1BQLkZsYWdzICs9IC1JJChMTFZNX1NSQ19ST09UKS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUKK0NQUC5GbGFncyArPSAkKE5PX01JU1NJTkdfRklFTERfSU5JVElBTElaRVJTKSAkKE5PX1ZBUklBRElDX01BQ1JPUykKK0NQUC5GbGFncyArPSAtREdURVNUX0hBU19SVFRJPTAKKyMgbGlic3RkYysrJ3MgVFIxIDx0dXBsZT4gaGVhZGVyIGRlcGVuZHMgb24gUlRUSSBhbmQgdXNlcyBDKysnMHggZmVhdHVyZXMgbm90CisjIHN1cHBvcnRlZCBieSBDbGFuZywgc28gZm9yY2UgZ29vZ2xldGVzdCB0byB1c2UgaXRzIG93biB0dXBsZSBpbXBsZW1lbnRhdGlvbi4KK0NQUC5GbGFncyArPSAtREdURVNUX1VTRV9PV05fVFIxX1RVUExFCisKKyMgRGlzYWJsZSBwdGhyZWFkcyBpZiBMTFZNIHdhcyBjb25maWd1cmVkIHdpdGhvdXQgdGhlbS4KK2lmbmVxICgkKEhBVkVfUFRIUkVBRCksIDEpCisgIENQUC5GbGFncyArPSAtREdURVNUX0hBU19QVEhSRUFEPTAKK2VuZGlmCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9Vbml0VGVzdE1haW4vVGVzdE1haW4uY3BwIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvVW5pdFRlc3RNYWluL1Rlc3RNYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTdkY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvVW5pdFRlc3RNYWluL1Rlc3RNYWluLmNwcApAQCAtMCwwICsxLDE1IEBACisvLz09PS0tLSB1dGlscy91bml0dGVzdC9Vbml0VGVzdE1haW4vVGVzdE1haW4uY3BwIC0gdW5pdHRlc3QgZHJpdmVyIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvTElDRU5TRS5UWFQgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L0xJQ0VOU0UuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NDFhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L0xJQ0VOU0UuVFhUCkBAIC0wLDAgKzEsMjggQEAKK0NvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQordGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvTWFrZWZpbGUgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYjI5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L01ha2VmaWxlCkBAIC0wLDAgKzEsMzkgQEAKKyMjPT09LSB1dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCisjCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisjIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK0xFVkVMIDo9IC4uLy4uLy4uCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCisKK0xJQlJBUllOQU1FID0gR29vZ2xlVGVzdAorQlVJTERfQVJDSElWRSA9IDEKK1JFUVVJUkVTX1JUVEkgPSAxCisKKyMgTm90ZSB0aGF0IHRoZXNlIGZsYWdzIGFyZSBkdXBsaWNhdGVkIHdoZW4gYnVpbGRpbmcgaW5kaXZpZHVhbCB0ZXN0cyBpbgorIyB1bml0dGVzdHMvTWFrZWZpbGUudW5pdHRlc3QgYW5kIC4uL1VuaXRUZXN0TWFpbi9NYWtlZmlsZTsgZW5zdXJlIHRoYXQgYW55CisjIGNoYW5nZXMgYXJlIG1hZGUgdG8gYm90aC4KK0NQUC5GbGFncyArPSAtSSQoTExWTV9TUkNfUk9PVCkvdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlCitDUFAuRmxhZ3MgKz0gJChOT19NSVNTSU5HX0ZJRUxEX0lOSVRJQUxJWkVSUykgJChOT19WQVJJQURJQ19NQUNST1MpCitDUFAuRmxhZ3MgKz0gLURHVEVTVF9IQVNfUlRUST0wCisjIGxpYnN0ZGMrKydzIFRSMSA8dHVwbGU+IGhlYWRlciBkZXBlbmRzIG9uIFJUVEkgYW5kIHVzZXMgQysrJzB4IGZlYXR1cmVzIG5vdAorIyBzdXBwb3J0ZWQgYnkgQ2xhbmcsIHNvIGZvcmNlIGdvb2dsZXRlc3QgdG8gdXNlIGl0cyBvd24gdHVwbGUgaW1wbGVtZW50YXRpb24uCitDUFAuRmxhZ3MgKz0gLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorCisjIERpc2FibGUgcHRocmVhZHMgaWYgTExWTSB3YXMgY29uZmlndXJlZCB3aXRob3V0IHRoZW0uCitpZm5lcSAoJChIQVZFX1BUSFJFQUQpLCAxKQorICBDUFAuRmxhZ3MgKz0gLURHVEVTVF9IQVNfUFRIUkVBRD0wCitlbmRpZgorCitpZmVxICgkKEhPU1RfT1MpLE1pbmdXKQorICBDUFAuRmxhZ3MgKz0gLURHVEVTVF9PU19XSU5ET1dTPTEKK2VuZGlmCisKK05PX0lOU1RBTEwgPSAxCisKK2luY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L1JFQURNRS5MTFZNIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9SRUFETUUuTExWTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmU2Zjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9SRUFETUUuTExWTQpAQCAtMCwwICsxLDMxIEBACitMTFZNIG5vdGVzCistLS0tLS0tLS0tCisKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIEdvb2dsZSBUZXN0IDEuNS4wLCB3aXRoIGFsbCBlbGVtZW50cyByZW1vdmVkIGV4Y2VwdCBmb3IKK3RoZSBhY3R1YWwgc291cmNlIGNvZGUsIHRvIG1pbmltaXplIHRoZSBhZGRpdGlvbiB0byB0aGUgTExWTSBkaXN0cmlidXRpb24uCisKK0NsZWFuZWQgdXAgYXMgZm9sbG93czoKKworIyBSZW1vdmUgYWxsIHRoZSB1bm5lY2Vzc2FyeSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyQgcm0gLWYgYWNsb2NhbCogQ01ha2VMaXN0cy50eHQgY29uZmlndXJlKiBNYWtlZmlsZSogQ0hBTkdFUyBDT05UUklCVVRPUlMgUkVBRE1FCiskIHJtIC1yZiBidWlsZC1hdXggY29kZWdlYXIgZnVzZWQtc3JjIG00IG1ha2UgbXN2YyBzYW1wbGVzIHNjcmlwdHMgdGVzdCB4Y29kZQorJCBybSAtZiBgZmluZCAuIC1uYW1lIFwqXC5wdW1wYAorCisjIE1vdmUgYWxsIHRoZSBzb3VyY2UgZmlsZXMgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiskIG12IHNyYy8qIC4KKyQgcm1kaXIgc3JjCisKKyMgTW92ZSBleHRyYSBoZWFkZXJzIGludG8gdGhlIGFscmVhZHktZXhpc3RpbmcgaW50ZXJuYWwgaGVhZGVycyBkaXIKKyQgbXYgKi5oIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvCisKKyMgVXBkYXRlIHBhdGhzIHRvIHRoZSBpbmNsdWRlZCBmaWxlcworJCBwZXJsIC1waSAtZSAnc3xeI2luY2x1ZGUgInNyYy98I2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL3wnICouY2MKKworJCBtdiBDT1BZSU5HIExJQ0VOU0UuVFhUCisKKworTW9kaWZpZWQgYXMgZm9sbG93czoKKyogVG8gR1Rlc3RTdHJlYW1Ub0hlbHBlciBpbiBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgsCisgIGFkZGVkIHRoZSBhYmlsaXR5IHRvIHN0cmVhbSB3aXRoIHJhd19vc19vc3RyZWFtLgorKiBUbyByZWZyZXNoIEhhaWt1IHN1cHBvcnQgaW4gaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgsCisgIHNlZSBodHRwOi8vbGlzdHMuY3MudWl1Yy5lZHUvcGlwZXJtYWlsL2xsdm0tY29tbWl0cy9XZWVrLW9mLU1vbi0yMDEwMDYyMS8xMDI4OTguaHRtbApkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9ndGVzdC1kZWF0aC10ZXN0LmNjIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9ndGVzdC1kZWF0aC10ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTk5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuY2MKQEAgLTAsMCArMSwxMTcyIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBkZWF0aCB0ZXN0cy4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0Lmg+CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjaWYgR1RFU1RfT1NfTUFDCisjaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oPgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIENvbnN0YW50cy4KKworLy8gVGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0RGVhdGhUZXN0U3R5bGVbXSA9ICJmYXN0IjsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgZGVhdGhfdGVzdF9zdHlsZSwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3N0eWxlIiwga0RlZmF1bHREZWF0aFRlc3RTdHlsZSksCisgICAgIkluZGljYXRlcyBob3cgdG8gcnVuIGEgZGVhdGggdGVzdCBpbiBhIGZvcmtlZCBjaGlsZCBwcm9jZXNzOiAiCisgICAgIlwidGhyZWFkc2FmZVwiIChjaGlsZCBwcm9jZXNzIHJlLWV4ZWN1dGVzIHRoZSB0ZXN0IGJpbmFyeSAiCisgICAgImZyb20gdGhlIGJlZ2lubmluZywgcnVubmluZyBvbmx5IHRoZSBzcGVjaWZpYyBkZWF0aCB0ZXN0KSBvciAiCisgICAgIlwiZmFzdFwiIChjaGlsZCBwcm9jZXNzIHJ1bnMgdGhlIGRlYXRoIHRlc3QgaW1tZWRpYXRlbHkgIgorICAgICJhZnRlciBmb3JraW5nKS4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmssCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImRlYXRoX3Rlc3RfdXNlX2ZvcmsiLCBmYWxzZSksCisgICAgIkluc3RydWN0cyB0byB1c2UgZm9yaygpL19leGl0KCkgaW5zdGVhZCBvZiBjbG9uZSgpIGluIGRlYXRoIHRlc3RzLiAiCisgICAgIklnbm9yZWQgYW5kIGFsd2F5cyB1c2VzIGZvcmsoKSBvbiBQT1NJWCBzeXN0ZW1zIHdoZXJlIGNsb25lKCkgaXMgbm90ICIKKyAgICAiaW1wbGVtZW50ZWQuIFVzZWZ1bCB3aGVuIHJ1bm5pbmcgdW5kZXIgdmFsZ3JpbmQgb3Igc2ltaWxhciB0b29scyBpZiAiCisgICAgInRob3NlIGRvIG5vdCBzdXBwb3J0IGNsb25lKCkuIFZhbGdyaW5kIDMuMy4xIHdpbGwganVzdCBmYWlsIGlmICIKKyAgICAiaXQgc2VlcyBhbiB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBjbG9uZSgpIGZsYWdzLiAiCisgICAgIkl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmbGFnIHcvbyB2YWxncmluZCB0aG91Z2ggaXQgd2lsbCAiCisgICAgIndvcmsgaW4gOTklIG9mIHRoZSBjYXNlcy4gT25jZSB2YWxncmluZCBpcyBmaXhlZCwgdGhpcyBmbGFnIHdpbGwgIgorICAgICJtb3N0IGxpa2VseSBiZSByZW1vdmVkLiIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QsICIiLAorICAgICJJbmRpY2F0ZXMgdGhlIGZpbGUsIGxpbmUgbnVtYmVyLCB0ZW1wb3JhbCBpbmRleCBvZiAiCisgICAgInRoZSBzaW5nbGUgZGVhdGggdGVzdCB0byBydW4sIGFuZCBhIGZpbGUgZGVzY3JpcHRvciB0byAiCisgICAgIndoaWNoIGEgc3VjY2VzcyBjb2RlIG1heSBiZSBzZW50LCBhbGwgc2VwYXJhdGVkIGJ5ICIKKyAgICAiY29sb25zLiAgVGhpcyBmbGFnIGlzIHNwZWNpZmllZCBpZiBhbmQgb25seSBpZiB0aGUgY3VycmVudCAiCisgICAgInByb2Nlc3MgaXMgYSBzdWItcHJvY2VzcyBsYXVuY2hlZCBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlICIKKyAgICAiZGVhdGggdGVzdC4gIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4iKTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gRXhpdGVkV2l0aENvZGUgY29uc3RydWN0b3IuCitFeGl0ZWRXaXRoQ29kZTo6RXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSkgOiBleGl0X2NvZGVfKGV4aXRfY29kZSkgeworfQorCisvLyBFeGl0ZWRXaXRoQ29kZSBmdW5jdGlvbi1jYWxsIG9wZXJhdG9yLgorYm9vbCBFeGl0ZWRXaXRoQ29kZTo6b3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHJldHVybiBleGl0X3N0YXR1cyA9PSBleGl0X2NvZGVfOworI2Vsc2UKKyAgcmV0dXJuIFdJRkVYSVRFRChleGl0X3N0YXR1cykgJiYgV0VYSVRTVEFUVVMoZXhpdF9zdGF0dXMpID09IGV4aXRfY29kZV87CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK30KKworI2lmICFHVEVTVF9PU19XSU5ET1dTCisvLyBLaWxsZWRCeVNpZ25hbCBjb25zdHJ1Y3Rvci4KK0tpbGxlZEJ5U2lnbmFsOjpLaWxsZWRCeVNpZ25hbChpbnQgc2lnbnVtKSA6IHNpZ251bV8oc2lnbnVtKSB7Cit9CisKKy8vIEtpbGxlZEJ5U2lnbmFsIGZ1bmN0aW9uLWNhbGwgb3BlcmF0b3IuCitib29sIEtpbGxlZEJ5U2lnbmFsOjpvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3QgeworICByZXR1cm4gV0lGU0lHTkFMRUQoZXhpdF9zdGF0dXMpICYmIFdURVJNU0lHKGV4aXRfc3RhdHVzKSA9PSBzaWdudW1fOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVdGlsaXRpZXMgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KKworLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIGV4aXQgY29kZSwgaW4gdGhlIGZvcm1hdAorLy8gc3BlY2lmaWVkIGJ5IHdhaXQoMikuCitzdGF0aWMgU3RyaW5nIEV4aXRTdW1tYXJ5KGludCBleGl0X2NvZGUpIHsKKyAgTWVzc2FnZSBtOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgbSA8PCAiRXhpdGVkIHdpdGggZXhpdCBzdGF0dXMgIiA8PCBleGl0X2NvZGU7CisjZWxzZQorICBpZiAoV0lGRVhJVEVEKGV4aXRfY29kZSkpIHsKKyAgICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IFdFWElUU1RBVFVTKGV4aXRfY29kZSk7CisgIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIlRlcm1pbmF0ZWQgYnkgc2lnbmFsICIgPDwgV1RFUk1TSUcoZXhpdF9jb2RlKTsKKyAgfQorI2lmZGVmIFdDT1JFRFVNUAorICBpZiAoV0NPUkVEVU1QKGV4aXRfY29kZSkpIHsKKyAgICBtIDw8ICIgKGNvcmUgZHVtcGVkKSI7CisgIH0KKyNlbmRpZgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgIHJldHVybiBtLkdldFN0cmluZygpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgZXhpdF9zdGF0dXMgZGVzY3JpYmVzIGEgcHJvY2VzcyB0aGF0IHdhcyB0ZXJtaW5hdGVkCisvLyBieSBhIHNpZ25hbCwgb3IgZXhpdGVkIG5vcm1hbGx5IHdpdGggYSBub256ZXJvIGV4aXQgY29kZS4KK2Jvb2wgRXhpdGVkVW5zdWNjZXNzZnVsbHkoaW50IGV4aXRfc3RhdHVzKSB7CisgIHJldHVybiAhRXhpdGVkV2l0aENvZGUoMCkoZXhpdF9zdGF0dXMpOworfQorCisjaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIEdlbmVyYXRlcyBhIHRleHR1YWwgZmFpbHVyZSBtZXNzYWdlIHdoZW4gYSBkZWF0aCB0ZXN0IGZpbmRzIG1vcmUgdGhhbgorLy8gb25lIHRocmVhZCBydW5uaW5nLCBvciBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhyZWFkcywgcHJpb3IKKy8vIHRvIGV4ZWN1dGluZyB0aGUgZ2l2ZW4gc3RhdGVtZW50LiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQorLy8gY2FsbGVyIG5vdCB0byBwYXNzIGEgdGhyZWFkX2NvdW50IG9mIDEuCitzdGF0aWMgU3RyaW5nIERlYXRoVGVzdFRocmVhZFdhcm5pbmcoc2l6ZV90IHRocmVhZF9jb3VudCkgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJEZWF0aCB0ZXN0cyB1c2UgZm9yaygpLCB3aGljaCBpcyB1bnNhZmUgcGFydGljdWxhcmx5IgorICAgICAgPDwgIiBpbiBhIHRocmVhZGVkIGNvbnRleHQuIEZvciB0aGlzIHRlc3QsICIgPDwgR1RFU1RfTkFNRV8gPDwgIiAiOworICBpZiAodGhyZWFkX2NvdW50ID09IDApCisgICAgbXNnIDw8ICJjb3VsZG4ndCBkZXRlY3QgdGhlIG51bWJlciBvZiB0aHJlYWRzLiI7CisgIGVsc2UKKyAgICBtc2cgPDwgImRldGVjdGVkICIgPDwgdGhyZWFkX2NvdW50IDw8ICIgdGhyZWFkcy4iOworICByZXR1cm4gbXNnLkdldFN0cmluZygpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBGbGFnIGNoYXJhY3RlcnMgZm9yIHJlcG9ydGluZyBhIGRlYXRoIHRlc3QgdGhhdCBkaWQgbm90IGRpZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RMaXZlZCA9ICdMJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RSZXR1cm5lZCA9ICdSJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yID0gJ0knOworCisvLyBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgcG9zc2libGUgd2F5cyB0aGF0IGEgZGVhdGggdGVzdAorLy8gY2FuIGNvbmNsdWRlLiAgRElFRCBtZWFucyB0aGF0IHRoZSBwcm9jZXNzIGRpZWQgd2hpbGUgZXhlY3V0aW5nIHRoZQorLy8gdGVzdCBjb2RlOyBMSVZFRCBtZWFucyB0aGF0IHByb2Nlc3MgbGl2ZWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHRlc3QKKy8vIGNvZGU7IGFuZCBSRVRVUk5FRCBtZWFucyB0aGF0IHRoZSB0ZXN0IHN0YXRlbWVudCBhdHRlbXB0ZWQgYSAicmV0dXJuLCIKKy8vIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiAgSU5fUFJPR1JFU1MgbWVhbnMgdGhlIHRlc3QgaGFzIG5vdCB5ZXQKKy8vIGNvbmNsdWRlZC4KK2VudW0gRGVhdGhUZXN0T3V0Y29tZSB7IElOX1BST0dSRVNTLCBESUVELCBMSVZFRCwgUkVUVVJORUQgfTsKKworLy8gUm91dGluZSBmb3IgYWJvcnRpbmcgdGhlIHByb2dyYW0gd2hpY2ggaXMgc2FmZSB0byBjYWxsIGZyb20gYW4KKy8vIGV4ZWMtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLCBpbiB3aGljaCBjYXNlIHRoZSBlcnJvcgorLy8gbWVzc2FnZSBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCB0aGUKKy8vIG1lc3NhZ2UgaXMgc2ltcGx5IHByaW50ZWQgdG8gc3RkZXJyLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBwcm9ncmFtCisvLyB0aGVuIGV4aXRzIHdpdGggc3RhdHVzIDEuCit2b2lkIERlYXRoVGVzdEFib3J0KGNvbnN0IFN0cmluZyYgbWVzc2FnZSkgeworICAvLyBPbiBhIFBPU0lYIHN5c3RlbSwgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gYSB0aHJlYWRzYWZlLXN0eWxlCisgIC8vIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcywgd2hpY2ggb3BlcmF0ZXMgb24gYSB2ZXJ5IHNtYWxsIHN0YWNrLiAgVXNlCisgIC8vIHRoZSBoZWFwIGZvciBhbnkgYWRkaXRpb25hbCBub24tbWludXNjdWxlIG1lbW9yeSByZXF1aXJlbWVudHMuCisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBHZXRVbml0VGVzdEltcGwoKS0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgRklMRSogcGFyZW50ID0gcG9zaXg6OkZET3BlbihmbGFnLT53cml0ZV9mZCgpLCAidyIpOworICAgIGZwdXRjKGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yLCBwYXJlbnQpOworICAgIGZwcmludGYocGFyZW50LCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOworICAgIGZmbHVzaChwYXJlbnQpOworICAgIF9leGl0KDEpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGFib3J0KCk7CisgIH0KK30KKworLy8gQSByZXBsYWNlbWVudCBmb3IgQ0hFQ0sgdGhhdCBjYWxscyBEZWF0aFRlc3RBYm9ydCBpZiB0aGUgYXNzZXJ0aW9uCisvLyBmYWlscy4KKyNkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZXhwcmVzc2lvbikgXAorICBkbyB7IFwKKyAgICBpZiAoITo6dGVzdGluZzo6aW50ZXJuYWw6OklzVHJ1ZShleHByZXNzaW9uKSkgeyBcCisgICAgICBEZWF0aFRlc3RBYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmc6OkZvcm1hdCggXAorICAgICAgICAgICJDSEVDSyBmYWlsZWQ6IEZpbGUgJXMsIGxpbmUgJWQ6ICVzIiwgXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI2V4cHJlc3Npb24pKTsgXAorICAgIH0gXAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisvLyBUaGlzIG1hY3JvIGlzIHNpbWlsYXIgdG8gR1RFU1RfREVBVEhfVEVTVF9DSEVDS18sIGJ1dCBpdCBpcyBtZWFudCBmb3IKKy8vIGV2YWx1YXRpbmcgYW55IHN5c3RlbSBjYWxsIHRoYXQgZnVsZmlsbHMgdHdvIGNvbmRpdGlvbnM6IGl0IG11c3QgcmV0dXJuCisvLyAtMSBvbiBmYWlsdXJlLCBhbmQgc2V0IGVycm5vIHRvIEVJTlRSIHdoZW4gaXQgaXMgaW50ZXJydXB0ZWQgYW5kCisvLyBzaG91bGQgYmUgdHJpZWQgYWdhaW4uICBUaGUgbWFjcm8gZXhwYW5kcyB0byBhIGxvb3AgdGhhdCByZXBlYXRlZGx5CisvLyBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gYXMgbG9uZyBhcyBpdCBldmFsdWF0ZXMgdG8gLTEgYW5kIHNldHMKKy8vIGVycm5vIHRvIEVJTlRSLiAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIC0xIGJ1dCBlcnJubyBpcworLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gRUlOVFIsIERlYXRoVGVzdEFib3J0IGlzIGNhbGxlZC4KKyNkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhleHByZXNzaW9uKSBcCisgIGRvIHsgXAorICAgIGludCBndGVzdF9yZXR2YWw7IFwKKyAgICBkbyB7IFwKKyAgICAgIGd0ZXN0X3JldHZhbCA9IChleHByZXNzaW9uKTsgXAorICAgIH0gd2hpbGUgKGd0ZXN0X3JldHZhbCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7IFwKKyAgICBpZiAoZ3Rlc3RfcmV0dmFsID09IC0xKSB7IFwKKyAgICAgIERlYXRoVGVzdEFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzo6Rm9ybWF0KCBcCisgICAgICAgICAgIkNIRUNLIGZhaWxlZDogRmlsZSAlcywgbGluZSAlZDogJXMgIT0gLTEiLCBcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjZXhwcmVzc2lvbikpOyBcCisgICAgfSBcCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaW4gZXJybm8uCitTdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIFN0cmluZyhlcnJubyA9PSAwID8gIiIgOiBwb3NpeDo6U3RyRXJyb3IoZXJybm8pKTsKK30KKworLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBhIGRlYXRoIHRlc3QgcGFyZW50IHByb2Nlc3MgdG8gcmVhZCBhIGZhaWx1cmUKKy8vIG1lc3NhZ2UgZnJvbSB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGFuZCBsb2cgaXQgd2l0aCB0aGUgRkFUQUwKKy8vIHNldmVyaXR5LiBPbiBXaW5kb3dzLCB0aGUgbWVzc2FnZSBpcyByZWFkIGZyb20gYSBwaXBlIGhhbmRsZS4gT24gb3RoZXIKKy8vIHBsYXRmb3JtcywgaXQgaXMgcmVhZCBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLgorc3RhdGljIHZvaWQgRmFpbEZyb21JbnRlcm5hbEVycm9yKGludCBmZCkgeworICBNZXNzYWdlIGVycm9yOworICBjaGFyIGJ1ZmZlclsyNTZdOworICBpbnQgbnVtX3JlYWQ7CisKKyAgZG8geworICAgIHdoaWxlICgobnVtX3JlYWQgPSBwb3NpeDo6UmVhZChmZCwgYnVmZmVyLCAyNTUpKSA+IDApIHsKKyAgICAgIGJ1ZmZlcltudW1fcmVhZF0gPSAnXDAnOworICAgICAgZXJyb3IgPDwgYnVmZmVyOworICAgIH0KKyAgfSB3aGlsZSAobnVtX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChudW1fcmVhZCA9PSAwKSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgZXJyb3IuR2V0U3RyaW5nKCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGxhc3RfZXJyb3IgPSBlcnJubzsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRXJyb3Igd2hpbGUgcmVhZGluZyBkZWF0aCB0ZXN0IGludGVybmFsOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSA8PCAiIFsiIDw8IGxhc3RfZXJyb3IgPDwgIl0iOworICB9Cit9CisKKy8vIERlYXRoIHRlc3QgY29uc3RydWN0b3IuICBJbmNyZW1lbnRzIHRoZSBydW5uaW5nIGRlYXRoIHRlc3QgY291bnQKKy8vIGZvciB0aGUgY3VycmVudCB0ZXN0LgorRGVhdGhUZXN0OjpEZWF0aFRlc3QoKSB7CisgIFRlc3RJbmZvKiBjb25zdCBpbmZvID0gR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICBEZWF0aFRlc3RBYm9ydCgiQ2Fubm90IHJ1biBhIGRlYXRoIHRlc3Qgb3V0c2lkZSBvZiBhIFRFU1Qgb3IgIgorICAgICAgICAgICAgICAgICAgICJURVNUX0YgY29uc3RydWN0Iik7CisgIH0KK30KKworLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGRlYXRoIHRlc3QgYnkgZGlzcGF0Y2hpbmcgdG8gdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgZmFjdG9yeS4KK2Jvb2wgRGVhdGhUZXN0OjpDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KSB7CisgIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+ZGVhdGhfdGVzdF9mYWN0b3J5KCktPkNyZWF0ZSgKKyAgICAgIHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUsIHRlc3QpOworfQorCitjb25zdCBjaGFyKiBEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkgeworICByZXR1cm4gbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfLmNfc3RyKCk7Cit9CisKK3ZvaWQgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoY29uc3QgU3RyaW5nJiBtZXNzYWdlKSB7CisgIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXyA9IG1lc3NhZ2U7Cit9CisKK1N0cmluZyBEZWF0aFRlc3Q6Omxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsKKworLy8gUHJvdmlkZXMgY3Jvc3MgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gZm9yIHNvbWUgZGVhdGggZnVuY3Rpb25hbGl0eS4KK2NsYXNzIERlYXRoVGVzdEltcGwgOiBwdWJsaWMgRGVhdGhUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIERlYXRoVGVzdEltcGwoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQorICAgICAgOiBzdGF0ZW1lbnRfKGFfc3RhdGVtZW50KSwKKyAgICAgICAgcmVnZXhfKGFfcmVnZXgpLAorICAgICAgICBzcGF3bmVkXyhmYWxzZSksCisgICAgICAgIHN0YXR1c18oLTEpLAorICAgICAgICBvdXRjb21lXyhJTl9QUk9HUkVTUyksCisgICAgICAgIHJlYWRfZmRfKC0xKSwKKyAgICAgICAgd3JpdGVfZmRfKC0xKSB7fQorCisgIC8vIHJlYWRfZmRfIGlzIGV4cGVjdGVkIHRvIGJlIGNsb3NlZCBhbmQgY2xlYXJlZCBieSBhIGRlcml2ZWQgY2xhc3MuCisgIH5EZWF0aFRlc3RJbXBsKCkgeyBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhyZWFkX2ZkXyA9PSAtMSk7IH0KKworICB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbik7CisgIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBzdGF0dXNfb2spOworCisgIGNvbnN0IGNoYXIqIHN0YXRlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlbWVudF87IH0KKyAgY29uc3QgUkUqIHJlZ2V4KCkgY29uc3QgeyByZXR1cm4gcmVnZXhfOyB9CisgIGJvb2wgc3Bhd25lZCgpIGNvbnN0IHsgcmV0dXJuIHNwYXduZWRfOyB9CisgIHZvaWQgc2V0X3NwYXduZWQoYm9vbCBpc19zcGF3bmVkKSB7IHNwYXduZWRfID0gaXNfc3Bhd25lZDsgfQorICBpbnQgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gc3RhdHVzXzsgfQorICB2b2lkIHNldF9zdGF0dXMoaW50IGFfc3RhdHVzKSB7IHN0YXR1c18gPSBhX3N0YXR1czsgfQorICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWUoKSBjb25zdCB7IHJldHVybiBvdXRjb21lXzsgfQorICB2b2lkIHNldF9vdXRjb21lKERlYXRoVGVzdE91dGNvbWUgYW5fb3V0Y29tZSkgeyBvdXRjb21lXyA9IGFuX291dGNvbWU7IH0KKyAgaW50IHJlYWRfZmQoKSBjb25zdCB7IHJldHVybiByZWFkX2ZkXzsgfQorICB2b2lkIHNldF9yZWFkX2ZkKGludCBmZCkgeyByZWFkX2ZkXyA9IGZkOyB9CisgIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQorICB2b2lkIHNldF93cml0ZV9mZChpbnQgZmQpIHsgd3JpdGVfZmRfID0gZmQ7IH0KKworICAvLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKKyAgLy8gdGVzdCBjaGlsZCBwcm9jZXNzIHZpYSBhIHBpcGUsIGludGVycHJldHMgaXQgdG8gc2V0IHRoZSBvdXRjb21lXworICAvLyBtZW1iZXIsIGFuZCBjbG9zZXMgcmVhZF9mZF8uICBPdXRwdXRzIGRpYWdub3N0aWNzIGFuZCB0ZXJtaW5hdGVzIGluCisgIC8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KKyAgdm9pZCBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgcHJpdmF0ZToKKyAgLy8gVGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY29kZSB0aGlzIG9iamVjdCBpcyB0ZXN0aW5nLiAgVGhpcyBjbGFzcworICAvLyBkb2Vzbid0IG93biB0aGlzIHN0cmluZyBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KKyAgY29uc3QgY2hhciogY29uc3Qgc3RhdGVtZW50XzsKKyAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCB0ZXN0IG91dHB1dCBtdXN0IG1hdGNoLiAgRGVhdGhUZXN0SW1wbAorICAvLyBkb2Vzbid0IG93biB0aGlzIG9iamVjdCBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KKyAgY29uc3QgUkUqIGNvbnN0IHJlZ2V4XzsKKyAgLy8gVHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzcGF3bmVkLgorICBib29sIHNwYXduZWRfOworICAvLyBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MuCisgIGludCBzdGF0dXNfOworICAvLyBIb3cgdGhlIGRlYXRoIHRlc3QgY29uY2x1ZGVkLgorICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWVfOworICAvLyBEZXNjcmlwdG9yIHRvIHRoZSByZWFkIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgY2hpbGQgcHJvY2Vzcy4gIEl0IGlzCisgIC8vIGFsd2F5cyAtMSBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4gIFRoZSBjaGlsZCBrZWVwcyBpdHMgd3JpdGUgZW5kIG9mIHRoZQorICAvLyBwaXBlIGluIHdyaXRlX2ZkXy4KKyAgaW50IHJlYWRfZmRfOworICAvLyBEZXNjcmlwdG9yIHRvIHRoZSBjaGlsZCdzIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgcGFyZW50IHByb2Nlc3MuCisgIC8vIEl0IGlzIGFsd2F5cyAtMSBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICBUaGUgcGFyZW50IGtlZXBzIGl0cyBlbmQgb2YgdGhlCisgIC8vIHBpcGUgaW4gcmVhZF9mZF8uCisgIGludCB3cml0ZV9mZF87Cit9OworCisvLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKKy8vIHRlc3QgY2hpbGQgcHJvY2VzcyB2aWEgYSBwaXBlLCBpbnRlcnByZXRzIGl0IHRvIHNldCB0aGUgb3V0Y29tZV8KKy8vIG1lbWJlciwgYW5kIGNsb3NlcyByZWFkX2ZkXy4gIE91dHB1dHMgZGlhZ25vc3RpY3MgYW5kIHRlcm1pbmF0ZXMgaW4KKy8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KK3ZvaWQgRGVhdGhUZXN0SW1wbDo6UmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKSB7CisgIGNoYXIgZmxhZzsKKyAgaW50IGJ5dGVzX3JlYWQ7CisKKyAgLy8gVGhlIHJlYWQoKSBoZXJlIGJsb2NrcyB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZSAoc2lnbmlmeWluZyB0aGUKKyAgLy8gZmFpbHVyZSBvZiB0aGUgZGVhdGggdGVzdCkgb3IgdW50aWwgdGhlIHBpcGUgaXMgY2xvc2VkIChzaWduaWZ5aW5nCisgIC8vIGl0cyBzdWNjZXNzKSwgc28gaXQncyBva2F5IHRvIGNhbGwgdGhpcyBpbiB0aGUgcGFyZW50IGJlZm9yZQorICAvLyB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgZXhpdGVkLgorICBkbyB7CisgICAgYnl0ZXNfcmVhZCA9IHBvc2l4OjpSZWFkKHJlYWRfZmQoKSwgJmZsYWcsIDEpOworICB9IHdoaWxlIChieXRlc19yZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgc2V0X291dGNvbWUoRElFRCk7CisgIH0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAxKSB7CisgICAgc3dpdGNoIChmbGFnKSB7CisgICAgICBjYXNlIGtEZWF0aFRlc3RSZXR1cm5lZDoKKyAgICAgICAgc2V0X291dGNvbWUoUkVUVVJORUQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdExpdmVkOgorICAgICAgICBzZXRfb3V0Y29tZShMSVZFRCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrRGVhdGhUZXN0SW50ZXJuYWxFcnJvcjoKKyAgICAgICAgRmFpbEZyb21JbnRlcm5hbEVycm9yKHJlYWRfZmQoKSk7ICAvLyBEb2VzIG5vdCByZXR1cm4uCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyByZXBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ1bmV4cGVjdGVkIHN0YXR1cyBieXRlICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZmxhZykgPDwgIikiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiUmVhZCBmcm9tIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpOworICB9CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8ocG9zaXg6OkNsb3NlKHJlYWRfZmQoKSkpOworICBzZXRfcmVhZF9mZCgtMSk7Cit9CisKKy8vIFNpZ25hbHMgdGhhdCB0aGUgZGVhdGggdGVzdCBjb2RlIHdoaWNoIHNob3VsZCBoYXZlIGV4aXRlZCwgZGlkbid0LgorLy8gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGluIGEgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgorLy8gV3JpdGVzIGEgc3RhdHVzIGJ5dGUgdG8gdGhlIGNoaWxkJ3Mgc3RhdHVzIGZpbGUgZGVzY3JpcHRvciwgdGhlbgorLy8gY2FsbHMgX2V4aXQoMSkuCit2b2lkIERlYXRoVGVzdEltcGw6OkFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgeworICAvLyBUaGUgcGFyZW50IHByb2Nlc3MgY29uc2lkZXJzIHRoZSBkZWF0aCB0ZXN0IHRvIGJlIGEgZmFpbHVyZSBpZgorICAvLyBpdCBmaW5kcyBhbnkgZGF0YSBpbiBvdXIgcGlwZS4gIFNvLCBoZXJlIHdlIHdyaXRlIGEgc2luZ2xlIGZsYWcgYnl0ZQorICAvLyB0byB0aGUgcGlwZSwgdGhlbiBleGl0LgorICBjb25zdCBjaGFyIHN0YXR1c19jaCA9CisgICAgICByZWFzb24gPT0gVEVTVF9ESURfTk9UX0RJRSA/IGtEZWF0aFRlc3RMaXZlZCA6IGtEZWF0aFRlc3RSZXR1cm5lZDsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhwb3NpeDo6V3JpdGUod3JpdGVfZmQoKSwgJnN0YXR1c19jaCwgMSkpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpDbG9zZSh3cml0ZV9mZCgpKSk7CisgIF9leGl0KDEpOyAgLy8gRXhpdHMgdy9vIGFueSBub3JtYWwgZXhpdCBob29rcyAod2Ugd2VyZSBzdXBwb3NlZCB0byBjcmFzaCkKK30KKworLy8gQXNzZXNzZXMgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBhIGRlYXRoIHRlc3QsIHVzaW5nIGJvdGggcHJpdmF0ZQorLy8gbWVtYmVycyB3aGljaCBoYXZlIHByZXZpb3VzbHkgYmVlbiBzZXQsIGFuZCBvbmUgYXJndW1lbnQ6CisvLworLy8gUHJpdmF0ZSBkYXRhIG1lbWJlcnM6CisvLyAgIG91dGNvbWU6ICBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGhvdyB0aGUgZGVhdGggdGVzdAorLy8gICAgICAgICAgICAgY29uY2x1ZGVkOiBESUVELCBMSVZFRCwgb3IgUkVUVVJORUQuICBUaGUgZGVhdGggdGVzdCBmYWlscworLy8gICAgICAgICAgICAgaW4gdGhlIGxhdHRlciB0d28gY2FzZXMuCisvLyAgIHN0YXR1czogICBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MuIE9uICpuaXgsIGl0IGlzIGluIHRoZQorLy8gICAgICAgICAgICAgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgd2FpdCgyKS4gT24gV2luZG93cywgdGhpcyBpcyB0aGUKKy8vICAgICAgICAgICAgIHZhbHVlIHN1cHBsaWVkIHRvIHRoZSBFeGl0UHJvY2VzcygpIEFQSSBvciBhIG51bWVyaWMgY29kZQorLy8gICAgICAgICAgICAgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IHRlcm1pbmF0ZWQgdGhlIHByb2dyYW0uCisvLyAgIHJlZ2V4OiAgICBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QgdG8gYmUgYXBwbGllZCB0bworLy8gICAgICAgICAgICAgdGhlIHRlc3QncyBjYXB0dXJlZCBzdGFuZGFyZCBlcnJvciBvdXRwdXQ7IHRoZSBkZWF0aCB0ZXN0CisvLyAgICAgICAgICAgICBmYWlscyBpZiBpdCBkb2VzIG5vdCBtYXRjaC4KKy8vCisvLyBBcmd1bWVudDoKKy8vICAgc3RhdHVzX29rOiB0cnVlIGlmIGV4aXRfc3RhdHVzIGlzIGFjY2VwdGFibGUgaW4gdGhlIGNvbnRleHQgb2YKKy8vICAgICAgICAgICAgICB0aGlzIHBhcnRpY3VsYXIgZGVhdGggdGVzdCwgd2hpY2ggZmFpbHMgaWYgaXQgaXMgZmFsc2UKKy8vCisvLyBSZXR1cm5zIHRydWUgaWZmIGFsbCBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgbWV0LiAgT3RoZXJ3aXNlLCB0aGUKKy8vIGZpcnN0IGZhaWxpbmcgY29uZGl0aW9uLCBpbiB0aGUgb3JkZXIgZ2l2ZW4gYWJvdmUsIGlzIHRoZSBvbmUgdGhhdCBpcworLy8gcmVwb3J0ZWQuIEFsc28gc2V0cyB0aGUgbGFzdCBkZWF0aCB0ZXN0IG1lc3NhZ2Ugc3RyaW5nLgorYm9vbCBEZWF0aFRlc3RJbXBsOjpQYXNzZWQoYm9vbCBzdGF0dXNfb2spIHsKKyAgaWYgKCFzcGF3bmVkKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IFN0cmluZyBlcnJvcl9tZXNzYWdlID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKworICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgTWVzc2FnZSBidWZmZXI7CisKKyAgYnVmZmVyIDw8ICJEZWF0aCB0ZXN0OiAiIDw8IHN0YXRlbWVudCgpIDw8ICJcbiI7CisgIHN3aXRjaCAob3V0Y29tZSgpKSB7CisgICAgY2FzZSBMSVZFRDoKKyAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZmFpbGVkIHRvIGRpZS5cbiIKKyAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzogIiA8PCBlcnJvcl9tZXNzYWdlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRVRVUk5FRDoKKyAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogaWxsZWdhbCByZXR1cm4gaW4gdGVzdCBzdGF0ZW1lbnQuXG4iCisgICAgICAgICAgICAgPDwgIiBFcnJvciBtc2c6ICIgPDwgZXJyb3JfbWVzc2FnZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRElFRDoKKyAgICAgIGlmIChzdGF0dXNfb2spIHsKKyAgICAgICAgY29uc3QgYm9vbCBtYXRjaGVkID0gUkU6OlBhcnRpYWxNYXRjaChlcnJvcl9tZXNzYWdlLmNfc3RyKCksICpyZWdleCgpKTsKKyAgICAgICAgaWYgKG1hdGNoZWQpIHsKKyAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGVycm9yLlxuIgorICAgICAgICAgICAgICAgICA8PCAiICBFeHBlY3RlZDogIiA8PCByZWdleCgpLT5wYXR0ZXJuKCkgPDwgIlxuIgorICAgICAgICAgICAgICAgICA8PCAiQWN0dWFsIG1zZzogIiA8PCBlcnJvcl9tZXNzYWdlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGV4aXQgY29kZTpcbiIKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAiIDw8IEV4aXRTdW1tYXJ5KHN0YXR1cygpKSA8PCAiXG4iOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJTl9QUk9HUkVTUzoKKyAgICBkZWZhdWx0OgorICAgICAgR1RFU1RfTE9HXyhGQVRBTCkKKyAgICAgICAgICA8PCAiRGVhdGhUZXN0OjpQYXNzZWQgc29tZWhvdyBjYWxsZWQgYmVmb3JlIGNvbmNsdXNpb24gb2YgdGVzdCI7CisgIH0KKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShidWZmZXIuR2V0U3RyaW5nKCkpOworICByZXR1cm4gc3VjY2VzczsKK30KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKy8vIFdpbmRvd3NEZWF0aFRlc3QgaW1wbGVtZW50cyBkZWF0aCB0ZXN0cyBvbiBXaW5kb3dzLiBEdWUgdG8gdGhlCisvLyBzcGVjaWZpY3Mgb2Ygc3RhcnRpbmcgbmV3IHByb2Nlc3NlcyBvbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyB0aGVyZSBhcmUKKy8vIGFsd2F5cyB0aHJlYWRzYWZlLCBhbmQgR29vZ2xlIFRlc3QgY29uc2lkZXJzIHRoZQorLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPWZhc3Qgc2V0dGluZyB0byBiZSBlcXVpdmFsZW50IHRvCisvLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9dGhyZWFkc2FmZSB0aGVyZS4KKy8vCisvLyBBIGZldyBpbXBsZW1lbnRhdGlvbiBub3RlczogIExpa2UgdGhlIExpbnV4IHZlcnNpb24sIHRoZSBXaW5kb3dzCisvLyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBpcGVzIGZvciBjaGlsZC10by1wYXJlbnQgY29tbXVuaWNhdGlvbi4gQnV0IGR1ZSB0bworLy8gdGhlIHNwZWNpZmljcyBvZiBwaXBlcyBvbiBXaW5kb3dzLCBzb21lIGV4dHJhIHN0ZXBzIGFyZSByZXF1aXJlZDoKKy8vCisvLyAxLiBUaGUgcGFyZW50IGNyZWF0ZXMgYSBjb21tdW5pY2F0aW9uIHBpcGUgYW5kIHN0b3JlcyBoYW5kbGVzIHRvIGJvdGgKKy8vICAgIGVuZHMgb2YgaXQuCisvLyAyLiBUaGUgcGFyZW50IHN0YXJ0cyB0aGUgY2hpbGQgYW5kIHByb3ZpZGVzIGl0IHdpdGggdGhlIGluZm9ybWF0aW9uCisvLyAgICBuZWNlc3NhcnkgdG8gYWNxdWlyZSB0aGUgaGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuCisvLyAzLiBUaGUgY2hpbGQgYWNxdWlyZXMgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBhbmQgc2lnbmFscyB0aGUgcGFyZW50CisvLyAgICB1c2luZyBhIFdpbmRvd3MgZXZlbnQuCisvLyA0LiBOb3cgdGhlIHBhcmVudCBjYW4gcmVsZWFzZSB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9uIGl0cyBzaWRlLiBJZgorLy8gICAgdGhpcyBpcyBkb25lIGJlZm9yZSBzdGVwIDMsIHRoZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgZ29lcyBkb3duIHRvCisvLyAgICAwIGFuZCBpdCBpcyBkZXN0cm95ZWQsIHByZXZlbnRpbmcgdGhlIGNoaWxkIGZyb20gYWNxdWlyaW5nIGl0LiBUaGUKKy8vICAgIHBhcmVudCBub3cgaGFzIHRvIHJlbGVhc2UgaXQsIG9yIHJlYWQgb3BlcmF0aW9ucyBvbiB0aGUgcmVhZCBlbmQgb2YKKy8vICAgIHRoZSBwaXBlIHdpbGwgbm90IHJldHVybiB3aGVuIHRoZSBjaGlsZCB0ZXJtaW5hdGVzLgorLy8gNS4gVGhlIHBhcmVudCByZWFkcyBjaGlsZCdzIG91dHB1dCB0aHJvdWdoIHRoZSBwaXBlIChvdXRjb21lIGNvZGUgYW5kCisvLyAgICBhbnkgcG9zc2libGUgZXJyb3IgbWVzc2FnZXMpIGZyb20gdGhlIHBpcGUsIGFuZCBpdHMgc3RkZXJyIGFuZCB0aGVuCisvLyAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gZmFpbCB0aGUgdGVzdC4KKy8vCisvLyBOb3RlOiB0byBkaXN0aW5ndWlzaCBXaW4zMiBBUEkgY2FsbHMgZnJvbSB0aGUgbG9jYWwgbWV0aG9kIGFuZCBmdW5jdGlvbgorLy8gY2FsbHMsIHRoZSBmb3JtZXIgYXJlIGV4cGxpY2l0bHkgcmVzb2x2ZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisvLworY2xhc3MgV2luZG93c0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3RJbXBsIHsKKyBwdWJsaWM6CisgIFdpbmRvd3NEZWF0aFRlc3QoY29uc3QgY2hhciogc3RhdGVtZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgIGludCBsaW5lKQorICAgICAgOiBEZWF0aFRlc3RJbXBsKHN0YXRlbWVudCwgcmVnZXgpLCBmaWxlXyhmaWxlKSwgbGluZV8obGluZSkge30KKworICAvLyBBbGwgb2YgdGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGluaGVyaXRlZCBmcm9tIERlYXRoVGVzdC4KKyAgdmlydHVhbCBpbnQgV2FpdCgpOworICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKKworIHByaXZhdGU6CisgIC8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCisgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfOworICAvLyBUaGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgaW50IGxpbmVfOworICAvLyBIYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgY2hpbGQgcHJvY2Vzcy4KKyAgQXV0b0hhbmRsZSB3cml0ZV9oYW5kbGVfOworICAvLyBDaGlsZCBwcm9jZXNzIGhhbmRsZS4KKyAgQXV0b0hhbmRsZSBjaGlsZF9oYW5kbGVfOworICAvLyBFdmVudCB0aGUgY2hpbGQgcHJvY2VzcyB1c2VzIHRvIHNpZ25hbCB0aGUgcGFyZW50IHRoYXQgaXQgaGFzCisgIC8vIGFjcXVpcmVkIHRoZSBoYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZS4gQWZ0ZXIgc2VlaW5nIHRoaXMKKyAgLy8gZXZlbnQgdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIGhhbmRsZXMgdG8gbWFrZSBzdXJlIGl0cworICAvLyBSZWFkRmlsZSgpIGNhbGxzIHJldHVybiB3aGVuIHRoZSBjaGlsZCB0ZXJtaW5hdGVzLgorICBBdXRvSGFuZGxlIGV2ZW50X2hhbmRsZV87Cit9OworCisvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIGluIGEgZGVhdGggdGVzdCB0byBleGl0LCByZXR1cm5pbmcgaXRzIGV4aXQKKy8vIHN0YXR1cywgb3IgMCBpZiBubyBjaGlsZCBwcm9jZXNzIGV4aXN0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHNldHMgdGhlCisvLyBvdXRjb21lIGRhdGEgbWVtYmVyLgoraW50IFdpbmRvd3NEZWF0aFRlc3Q6OldhaXQoKSB7CisgIGlmICghc3Bhd25lZCgpKQorICAgIHJldHVybiAwOworCisgIC8vIFdhaXQgdW50aWwgdGhlIGNoaWxkIGVpdGhlciBzaWduYWxzIHRoYXQgaXQgaGFzIGFjcXVpcmVkIHRoZSB3cml0ZSBlbmQKKyAgLy8gb2YgdGhlIHBpcGUgb3IgaXQgZGllcy4KKyAgY29uc3QgSEFORExFIHdhaXRfaGFuZGxlc1syXSA9IHsgY2hpbGRfaGFuZGxlXy5HZXQoKSwgZXZlbnRfaGFuZGxlXy5HZXQoKSB9OworICBzd2l0Y2ggKDo6V2FpdEZvck11bHRpcGxlT2JqZWN0cygyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2hhbmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gV2FpdHMgZm9yIGFueSBvZiB0aGUgaGFuZGxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpKSB7CisgICAgY2FzZSBXQUlUX09CSkVDVF8wOgorICAgIGNhc2UgV0FJVF9PQkpFQ1RfMCArIDE6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZmFsc2UpOyAgLy8gU2hvdWxkIG5vdCBnZXQgaGVyZS4KKyAgfQorCisgIC8vIFRoZSBjaGlsZCBoYXMgYWNxdWlyZWQgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBvciBleGl0ZWQuCisgIC8vIFdlIHJlbGVhc2UgdGhlIGhhbmRsZSBvbiBvdXIgc2lkZSBhbmQgY29udGludWUuCisgIHdyaXRlX2hhbmRsZV8uUmVzZXQoKTsKKyAgZXZlbnRfaGFuZGxlXy5SZXNldCgpOworCisgIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7CisKKyAgLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQgaWYgaXQgaGF2ZW4ndCBhbHJlYWR5LiBUaGlzCisgIC8vIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgdGhlIGNoaWxkIGhhcyBhbHJlYWR5IGV4aXRlZCwgcmVnYXJkbGVzcyBvZgorICAvLyB3aGV0aGVyIHByZXZpb3VzIGNhbGxzIHRvIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMgc3luY2hyb25pemVkIG9uIHRoaXMKKyAgLy8gaGFuZGxlIG9yIG5vdC4KKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICBXQUlUX09CSkVDVF8wID09IDo6V2FpdEZvclNpbmdsZU9iamVjdChjaGlsZF9oYW5kbGVfLkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpKTsKKyAgRFdPUkQgc3RhdHVzOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyg6OkdldEV4aXRDb2RlUHJvY2VzcyhjaGlsZF9oYW5kbGVfLkdldCgpLCAmc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBGQUxTRSk7CisgIGNoaWxkX2hhbmRsZV8uUmVzZXQoKTsKKyAgc2V0X3N0YXR1cyhzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICByZXR1cm4gdGhpcy0+c3RhdHVzKCk7Cit9CisKKy8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgV2luZG93cyBkZWF0aCB0ZXN0LiAgSXQgY3JlYXRlcyBhIGNoaWxkCisvLyBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIHRvIHJ1biB0aGUKKy8vIGRlYXRoIHRlc3QuICBUaGUgY2hpbGQgcHJvY2VzcyBpcyBnaXZlbiB0aGUgLS1ndGVzdF9maWx0ZXIgYW5kCisvLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHN1Y2ggdGhhdCBpdCBrbm93cyB0byBydW4gdGhlCisvLyBjdXJyZW50IGRlYXRoIHRlc3Qgb25seS4KK0RlYXRoVGVzdDo6VGVzdFJvbGUgV2luZG93c0RlYXRoVGVzdDo6QXNzdW1lUm9sZSgpIHsKKyAgY29uc3QgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7CisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBpbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbmZvLT5yZXN1bHQoKS0+ZGVhdGhfdGVzdF9jb3VudCgpOworCisgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICAvLyBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIGhhcyBwZXJmb3JtZWQgYWxsIHRoZSBuZWNlc3NhcnkKKyAgICAvLyBwcm9jZXNzaW5nLgorICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgLy8gV2luZG93c0RlYXRoVGVzdCB1c2VzIGFuIGFub255bW91cyBwaXBlIHRvIGNvbW11bmljYXRlIHJlc3VsdHMgb2YKKyAgLy8gYSBkZWF0aCB0ZXN0LgorICBTRUNVUklUWV9BVFRSSUJVVEVTIGhhbmRsZXNfYXJlX2luaGVyaXRhYmxlID0geworICAgIHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKSwgTlVMTCwgVFJVRSB9OworICBIQU5ETEUgcmVhZF9oYW5kbGUsIHdyaXRlX2hhbmRsZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICA6OkNyZWF0ZVBpcGUoJnJlYWRfaGFuZGxlLCAmd3JpdGVfaGFuZGxlLCAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCisgICAgICAgICAgICAgICAgICAgMCkgIC8vIERlZmF1bHQgYnVmZmVyIHNpemUuCisgICAgICAhPSBGQUxTRSk7CisgIHNldF9yZWFkX2ZkKDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHJlYWRfaGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19SRE9OTFkpKTsKKyAgd3JpdGVfaGFuZGxlXy5SZXNldCh3cml0ZV9oYW5kbGUpOworICBldmVudF9oYW5kbGVfLlJlc2V0KDo6Q3JlYXRlRXZlbnQoCisgICAgICAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCisgICAgICBUUlVFLCAgICAvLyBUaGUgZXZlbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIG5vbi1zaWduYWxlZCBzdGF0ZS4KKyAgICAgIEZBTFNFLCAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIGlzIG5vbi1zaWduYWxsZWQuCisgICAgICBOVUxMKSk7ICAvLyBUaGUgZXZlbiBpcyB1bm5hbWVkLgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhldmVudF9oYW5kbGVfLkdldCgpICE9IE5VTEwpOworICBjb25zdCBTdHJpbmcgZmlsdGVyX2ZsYWcgPSBTdHJpbmc6OkZvcm1hdCgiLS0lcyVzPSVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLCBrRmlsdGVyRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dGVzdF9jYXNlX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bmFtZSgpKTsKKyAgY29uc3QgU3RyaW5nIGludGVybmFsX2ZsYWcgPSBTdHJpbmc6OkZvcm1hdCgKKyAgICAiLS0lcyVzPSVzfCVkfCVkfCV1fCVJdXwlSXUiLAorICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLAorICAgICAga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKKyAgICAgIGZpbGVfLCBsaW5lXywKKyAgICAgIGRlYXRoX3Rlc3RfaW5kZXgsCisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDo6R2V0Q3VycmVudFByb2Nlc3NJZCgpKSwKKyAgICAgIC8vIHNpemVfdCBoYXMgdGhlIHNhbWUgd2l0aCBhcyBwb2ludGVycyBvbiBib3RoIDMyLWJpdCBhbmQgNjQtYml0CisgICAgICAvLyBXaW5kb3dzIHBsYXRmb3Jtcy4KKyAgICAgIC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvdGN4ZjFkdzYuYXNweC4KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih3cml0ZV9oYW5kbGUpLAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGV2ZW50X2hhbmRsZV8uR2V0KCkpKTsKKworICBjaGFyIGV4ZWN1dGFibGVfcGF0aFtfTUFYX1BBVEggKyAxXTsgIC8vIE5PTElOVAorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIF9NQVhfUEFUSCArIDEgIT0gOjpHZXRNb2R1bGVGaWxlTmFtZUEoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTUFYX1BBVEgpKTsKKworICBTdHJpbmcgY29tbWFuZF9saW5lID0gU3RyaW5nOjpGb3JtYXQoIiVzICVzIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldENvbW1hbmRMaW5lQSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2ZsYWcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsX2ZsYWcuY19zdHIoKSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gRmx1c2ggdGhlIGxvZyBidWZmZXJzIHNpbmNlIHRoZSBsb2cgc3RyZWFtcyBhcmUgc2hhcmVkIHdpdGggdGhlIGNoaWxkLgorICBGbHVzaEluZm9Mb2coKTsKKworICAvLyBUaGUgY2hpbGQgcHJvY2VzcyB3aWxsIHNoYXJlIHRoZSBzdGFuZGFyZCBoYW5kbGVzIHdpdGggdGhlIHBhcmVudC4KKyAgU1RBUlRVUElORk9BIHN0YXJ0dXBfaW5mbzsKKyAgbWVtc2V0KCZzdGFydHVwX2luZm8sIDAsIHNpemVvZihTVEFSVFVQSU5GTykpOworICBzdGFydHVwX2luZm8uZHdGbGFncyA9IFNUQVJURl9VU0VTVERIQU5ETEVTOworICBzdGFydHVwX2luZm8uaFN0ZElucHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX0lOUFVUX0hBTkRMRSk7CisgIHN0YXJ0dXBfaW5mby5oU3RkT3V0cHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworICBzdGFydHVwX2luZm8uaFN0ZEVycm9yID0gOjpHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CisKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzX2luZm87CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKDo6Q3JlYXRlUHJvY2Vzc0EoCisgICAgICBleGVjdXRhYmxlX3BhdGgsCisgICAgICBjb25zdF9jYXN0PGNoYXIqPihjb21tYW5kX2xpbmUuY19zdHIoKSksCisgICAgICBOVUxMLCAgIC8vIFJldHVuZWQgcHJvY2VzcyBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgorICAgICAgTlVMTCwgICAvLyBSZXR1bmVkIHRocmVhZCBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgorICAgICAgVFJVRSwgICAvLyBDaGlsZCBpbmhlcml0cyBhbGwgaW5oZXJpdGFibGUgaGFuZGxlcyAoZm9yIHdyaXRlX2hhbmRsZV8pLgorICAgICAgMHgwLCAgICAvLyBEZWZhdWx0IGNyZWF0aW9uIGZsYWdzLgorICAgICAgTlVMTCwgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBlbnZpcm9ubWVudC4KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpLAorICAgICAgJnN0YXJ0dXBfaW5mbywKKyAgICAgICZwcm9jZXNzX2luZm8pICE9IEZBTFNFKTsKKyAgY2hpbGRfaGFuZGxlXy5SZXNldChwcm9jZXNzX2luZm8uaFByb2Nlc3MpOworICA6OkNsb3NlSGFuZGxlKHByb2Nlc3NfaW5mby5oVGhyZWFkKTsKKyAgc2V0X3NwYXduZWQodHJ1ZSk7CisgIHJldHVybiBPVkVSU0VFX1RFU1Q7Cit9CisjZWxzZSAgLy8gV2UgYXJlIG5vdCBvbiBXaW5kb3dzLgorCisvLyBGb3JraW5nRGVhdGhUZXN0IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgbW9zdCBvZiB0aGUgYWJzdHJhY3QKKy8vIG1ldGhvZHMgb2YgdGhlIERlYXRoVGVzdCBpbnRlcmZhY2UuICBPbmx5IHRoZSBBc3N1bWVSb2xlIG1ldGhvZCBpcworLy8gbGVmdCB1bmRlZmluZWQuCitjbGFzcyBGb3JraW5nRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgeworIHB1YmxpYzoKKyAgRm9ya2luZ0RlYXRoVGVzdChjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCk7CisKKyAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuCisgIHZpcnR1YWwgaW50IFdhaXQoKTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBzZXRfY2hpbGRfcGlkKHBpZF90IGNoaWxkX3BpZCkgeyBjaGlsZF9waWRfID0gY2hpbGRfcGlkOyB9CisKKyBwcml2YXRlOgorICAvLyBQSUQgb2YgY2hpbGQgcHJvY2VzcyBkdXJpbmcgZGVhdGggdGVzdDsgMCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBpdHNlbGYuCisgIHBpZF90IGNoaWxkX3BpZF87Cit9OworCisvLyBDb25zdHJ1Y3RzIGEgRm9ya2luZ0RlYXRoVGVzdC4KK0ZvcmtpbmdEZWF0aFRlc3Q6OkZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQorICAgIDogRGVhdGhUZXN0SW1wbChhX3N0YXRlbWVudCwgYV9yZWdleCksCisgICAgICBjaGlsZF9waWRfKC0xKSB7fQorCisvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIGluIGEgZGVhdGggdGVzdCB0byBleGl0LCByZXR1cm5pbmcgaXRzIGV4aXQKKy8vIHN0YXR1cywgb3IgMCBpZiBubyBjaGlsZCBwcm9jZXNzIGV4aXN0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHNldHMgdGhlCisvLyBvdXRjb21lIGRhdGEgbWVtYmVyLgoraW50IEZvcmtpbmdEZWF0aFRlc3Q6OldhaXQoKSB7CisgIGlmICghc3Bhd25lZCgpKQorICAgIHJldHVybiAwOworCisgIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7CisKKyAgaW50IHN0YXR1c192YWx1ZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyh3YWl0cGlkKGNoaWxkX3BpZF8sICZzdGF0dXNfdmFsdWUsIDApKTsKKyAgc2V0X3N0YXR1cyhzdGF0dXNfdmFsdWUpOworICByZXR1cm4gc3RhdHVzX3ZhbHVlOworfQorCisvLyBBIGNvbmNyZXRlIGRlYXRoIHRlc3QgY2xhc3MgdGhhdCBmb3JrcywgdGhlbiBpbW1lZGlhdGVseSBydW5zIHRoZSB0ZXN0CisvLyBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4KK2NsYXNzIE5vRXhlY0RlYXRoVGVzdCA6IHB1YmxpYyBGb3JraW5nRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIE5vRXhlY0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpIDoKKyAgICAgIEZvcmtpbmdEZWF0aFRlc3QoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpIHsgfQorICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKK307CisKKy8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgZm9yay1hbmQtcnVuIGRlYXRoIHRlc3QuICBJdCBpbXBsZW1lbnRzIGEKKy8vIHN0cmFpZ2h0Zm9yd2FyZCBmb3JrLCB3aXRoIGEgc2ltcGxlIHBpcGUgdG8gdHJhbnNtaXQgdGhlIHN0YXR1cyBieXRlLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBOb0V4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7CisgIGNvbnN0IHNpemVfdCB0aHJlYWRfY291bnQgPSBHZXRUaHJlYWRDb3VudCgpOworICBpZiAodGhyZWFkX2NvdW50ICE9IDEpIHsKKyAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8IERlYXRoVGVzdFRocmVhZFdhcm5pbmcodGhyZWFkX2NvdW50KTsKKyAgfQorCisgIGludCBwaXBlX2ZkWzJdOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhwaXBlKHBpcGVfZmQpICE9IC0xKTsKKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gV2hlbiB3ZSBmb3JrIHRoZSBwcm9jZXNzIGJlbG93LCB0aGUgbG9nIGZpbGUgYnVmZmVycyBhcmUgY29waWVkLCBidXQgdGhlCisgIC8vIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHNoYXJlZC4gIFdlIGZsdXNoIGFsbCBsb2cgZmlsZXMgaGVyZSBzbyB0aGF0IGNsb3NpbmcKKyAgLy8gdGhlIGZpbGUgZGVzY3JpcHRvcnMgaW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lc24ndCB0aHJvdyBvZmYgdGhlCisgIC8vIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgLy8gVGhpcyBpcyBhcyBjbG9zZSB0byB0aGUgZm9yayBhcyBwb3NzaWJsZSB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIGNhc2UKKyAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIHRocmVhZHMgcnVubmluZyBiZWZvcmUgdGhlIGRlYXRoIHRlc3QsIGFuZCBhbm90aGVyCisgIC8vIHRocmVhZCB3cml0ZXMgdG8gdGhlIGxvZyBmaWxlLgorICBGbHVzaEluZm9Mb2coKTsKKworICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBmb3JrKCk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGNoaWxkX3BpZCAhPSAtMSk7CisgIHNldF9jaGlsZF9waWQoY2hpbGRfcGlkKTsKKyAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzBdKSk7CisgICAgc2V0X3dyaXRlX2ZkKHBpcGVfZmRbMV0pOworICAgIC8vIFJlZGlyZWN0cyBhbGwgbG9nZ2luZyB0byBzdGRlcnIgaW4gdGhlIGNoaWxkIHByb2Nlc3MgdG8gcHJldmVudAorICAgIC8vIGNvbmN1cnJlbnQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZXMuICBXZSBjYXB0dXJlIHN0ZGVyciBpbiB0aGUgcGFyZW50CisgICAgLy8gcHJvY2VzcyBhbmQgYXBwZW5kIHRoZSBjaGlsZCBwcm9jZXNzJyBvdXRwdXQgdG8gYSBsb2cuCisgICAgTG9nVG9TdGRlcnIoKTsKKyAgICAvLyBFdmVudCBmb3J3YXJkaW5nIHRvIHRoZSBsaXN0ZW5lcnMgb2YgZXZlbnQgbGlzdGVuZXIgQVBJIG11c2ggYmUgc2h1dAorICAgIC8vIGRvd24gaW4gZGVhdGggdGVzdCBzdWJwcm9jZXNzZXMuCisgICAgR2V0VW5pdFRlc3RJbXBsKCktPmxpc3RlbmVycygpLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOworICAgIHJldHVybiBFWEVDVVRFX1RFU1Q7CisgIH0gZWxzZSB7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzFdKSk7CisgICAgc2V0X3JlYWRfZmQocGlwZV9mZFswXSk7CisgICAgc2V0X3NwYXduZWQodHJ1ZSk7CisgICAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKKyAgfQorfQorCisvLyBBIGNvbmNyZXRlIGRlYXRoIHRlc3QgY2xhc3MgdGhhdCBmb3JrcyBhbmQgcmUtZXhlY3V0ZXMgdGhlIG1haW4KKy8vIHByb2dyYW0gZnJvbSB0aGUgYmVnaW5uaW5nLCB3aXRoIGNvbW1hbmQtbGluZSBmbGFncyBzZXQgdGhhdCBjYXVzZQorLy8gb25seSB0aGlzIHNwZWNpZmljIGRlYXRoIHRlc3QgdG8gYmUgcnVuLgorY2xhc3MgRXhlY0RlYXRoVGVzdCA6IHB1YmxpYyBGb3JraW5nRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIEV4ZWNEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSA6CisgICAgICBGb3JraW5nRGVhdGhUZXN0KGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwgZmlsZV8oZmlsZSksIGxpbmVfKGxpbmUpIHsgfQorICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKKyBwcml2YXRlOgorICAvLyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBjaGFyKiBjb25zdCBmaWxlXzsKKyAgLy8gVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCisgIGNvbnN0IGludCBsaW5lXzsKK307CisKKy8vIFV0aWxpdHkgY2xhc3MgZm9yIGFjY3VtdWxhdGluZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorY2xhc3MgQXJndW1lbnRzIHsKKyBwdWJsaWM6CisgIEFyZ3VtZW50cygpIHsKKyAgICBhcmdzXy5wdXNoX2JhY2soTlVMTCk7CisgIH0KKworICB+QXJndW1lbnRzKCkgeworICAgIGZvciAoc3RkOjp2ZWN0b3I8Y2hhcio+OjppdGVyYXRvciBpID0gYXJnc18uYmVnaW4oKTsgaSAhPSBhcmdzXy5lbmQoKTsKKyAgICAgICAgICsraSkgeworICAgICAgZnJlZSgqaSk7CisgICAgfQorICB9CisgIHZvaWQgQWRkQXJndW1lbnQoY29uc3QgY2hhciogYXJndW1lbnQpIHsKKyAgICBhcmdzXy5pbnNlcnQoYXJnc18uZW5kKCkgLSAxLCBwb3NpeDo6U3RyRHVwKGFyZ3VtZW50KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyPgorICB2b2lkIEFkZEFyZ3VtZW50cyhjb25zdCA6OnN0ZDo6dmVjdG9yPFN0cj4mIGFyZ3VtZW50cykgeworICAgIGZvciAodHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxTdHI+Ojpjb25zdF9pdGVyYXRvciBpID0gYXJndW1lbnRzLmJlZ2luKCk7CisgICAgICAgICBpICE9IGFyZ3VtZW50cy5lbmQoKTsKKyAgICAgICAgICsraSkgeworICAgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChpLT5jX3N0cigpKSk7CisgICAgfQorICB9CisgIGNoYXIqIGNvbnN0KiBBcmd2KCkgeworICAgIHJldHVybiAmYXJnc19bMF07CisgIH0KKyBwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxjaGFyKj4gYXJnc187Cit9OworCisvLyBBIHN0cnVjdCB0aGF0IGVuY29tcGFzc2VzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNoaWxkIHByb2Nlc3Mgb2YgYQorLy8gdGhyZWFkc2FmZS1zdHlsZSBkZWF0aCB0ZXN0IHByb2Nlc3MuCitzdHJ1Y3QgRXhlY0RlYXRoVGVzdEFyZ3MgeworICBjaGFyKiBjb25zdCogYXJndjsgIC8vIENvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjaGlsZCdzIGNhbGwgdG8gZXhlYworICBpbnQgY2xvc2VfZmQ7ICAgICAgIC8vIEZpbGUgZGVzY3JpcHRvciB0byBjbG9zZTsgdGhlIHJlYWQgZW5kIG9mIGEgcGlwZQorfTsKKworI2lmIEdURVNUX09TX01BQworaW5saW5lIGNoYXIqKiBHZXRFbnZpcm9uKCkgeworICAvLyBXaGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIGEgZnJhbWV3b3JrIG9uIE1hY09TIFgsIHRoZSBlbnZpcm9uIHZhcmlhYmxlCisgIC8vIGlzIHVuYXZhaWxhYmxlLiBBcHBsZSdzIGRvY3VtZW50YXRpb24gKG1hbiBlbnZpcm9uKSByZWNvbW1lbmRzIHVzaW5nCisgIC8vIF9OU0dldEVudmlyb24oKSBpbnN0ZWFkLgorICByZXR1cm4gKl9OU0dldEVudmlyb24oKTsKK30KKyNlbHNlCisvLyBTb21lIFBPU0lYIHBsYXRmb3JtcyBleHBlY3QgeW91IHRvIGRlY2xhcmUgZW52aXJvbi4gZXh0ZXJuICJDIiBtYWtlcworLy8gaXQgcmVzaWRlIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorZXh0ZXJuICJDIiBjaGFyKiogZW52aXJvbjsKK2lubGluZSBjaGFyKiogR2V0RW52aXJvbigpIHsgcmV0dXJuIGVudmlyb247IH0KKyNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKy8vIFRoZSBtYWluIGZ1bmN0aW9uIGZvciBhIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgorLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYSBjbG9uZSgpLWVkIHByb2Nlc3MgYW5kIHRodXMgbXVzdCBhdm9pZAorLy8gYW55IHBvdGVudGlhbGx5IHVuc2FmZSBvcGVyYXRpb25zIGxpa2UgbWFsbG9jIG9yIGxpYmMgZnVuY3Rpb25zLgorc3RhdGljIGludCBFeGVjRGVhdGhUZXN0Q2hpbGRNYWluKHZvaWQqIGNoaWxkX2FyZykgeworICBFeGVjRGVhdGhUZXN0QXJncyogY29uc3QgYXJncyA9IHN0YXRpY19jYXN0PEV4ZWNEZWF0aFRlc3RBcmdzKj4oY2hpbGRfYXJnKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShhcmdzLT5jbG9zZV9mZCkpOworCisgIC8vIFdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBzYW1lIGVudmlyb25tZW50IHdoZXJlCisgIC8vIGl0IHdhcyBvcmlnaW5hbGx5IGludm9rZWQuICBUaGVyZWZvcmUgd2UgY2hhbmdlIHRvIHRoZSBvcmlnaW5hbAorICAvLyB3b3JraW5nIGRpcmVjdG9yeSBmaXJzdC4KKyAgY29uc3QgY2hhciogY29uc3Qgb3JpZ2luYWxfZGlyID0KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpOworICAvLyBXZSBjYW4gc2FmZWx5IGNhbGwgY2hkaXIoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLgorICBpZiAoY2hkaXIob3JpZ2luYWxfZGlyKSAhPSAwKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoImNoZGlyKFwiJXNcIikgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkuY19zdHIoKSkpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICAvLyBXZSBjYW4gc2FmZWx5IGNhbGwgZXhlY3ZlKCkgYXMgaXQncyBhIGRpcmVjdCBzeXN0ZW0gY2FsbC4gIFdlCisgIC8vIGNhbm5vdCB1c2UgZXhlY3ZwKCkgYXMgaXQncyBhIGxpYmMgZnVuY3Rpb24gYW5kIHRodXMgcG90ZW50aWFsbHkKKyAgLy8gdW5zYWZlLiAgU2luY2UgZXhlY3ZlKCkgZG9lc24ndCBzZWFyY2ggdGhlIFBBVEgsIHRoZSB1c2VyIG11c3QKKyAgLy8gaW52b2tlIHRoZSB0ZXN0IHByb2dyYW0gdmlhIGEgdmFsaWQgcGF0aCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0CisgIC8vIG9uZSBwYXRoIHNlcGFyYXRvci4KKyAgZXhlY3ZlKGFyZ3MtPmFyZ3ZbMF0sIGFyZ3MtPmFyZ3YsIEdldEVudmlyb24oKSk7CisgIERlYXRoVGVzdEFib3J0KFN0cmluZzo6Rm9ybWF0KCJleGVjdmUoJXMsIC4uLikgaW4gJXMgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPmFyZ3ZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKS5jX3N0cigpKSk7CisgIHJldHVybiBFWElUX0ZBSUxVUkU7Cit9CisKKy8vIFR3byB1dGlsaXR5IHJvdXRpbmVzIHRoYXQgdG9nZXRoZXIgZGV0ZXJtaW5lIHRoZSBkaXJlY3Rpb24gdGhlIHN0YWNrCisvLyBncm93cy4KKy8vIFRoaXMgY291bGQgYmUgYWNjb21wbGlzaGVkIG1vcmUgZWxlZ2FudGx5IGJ5IGEgc2luZ2xlIHJlY3Vyc2l2ZQorLy8gZnVuY3Rpb24sIGJ1dCB3ZSB3YW50IHRvIGd1YXJkIGFnYWluc3QgdGhlIHVubGlrZWx5IHBvc3NpYmlsaXR5IG9mCisvLyBhIHNtYXJ0IGNvbXBpbGVyIG9wdGltaXppbmcgdGhlIHJlY3Vyc2lvbiBhd2F5LgorYm9vbCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyKSB7CisgIGludCBkdW1teTsKKyAgcmV0dXJuICZkdW1teSA8IHB0cjsKK30KKworYm9vbCBTdGFja0dyb3dzRG93bigpIHsKKyAgaW50IGR1bW15OworICByZXR1cm4gU3RhY2tMb3dlclRoYW5BZGRyZXNzKCZkdW1teSk7Cit9CisKKy8vIEEgdGhyZWFkc2FmZSBpbXBsZW1lbnRhdGlvbiBvZiBmb3JrKDIpIGZvciB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3RzCisvLyB0aGF0IHVzZXMgY2xvbmUoMikuICBJdCBkaWVzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBhbnl0aGluZyBnb2VzCisvLyB3cm9uZy4KK3N0YXRpYyBwaWRfdCBFeGVjRGVhdGhUZXN0Rm9yayhjaGFyKiBjb25zdCogYXJndiwgaW50IGNsb3NlX2ZkKSB7CisgIEV4ZWNEZWF0aFRlc3RBcmdzIGFyZ3MgPSB7IGFyZ3YsIGNsb3NlX2ZkIH07CisgIHBpZF90IGNoaWxkX3BpZCA9IC0xOworCisjaWYgR1RFU1RfSEFTX0NMT05FCisgIGNvbnN0IGJvb2wgdXNlX2ZvcmsgPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworCisgIGlmICghdXNlX2ZvcmspIHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBzdGFja19ncm93c19kb3duID0gU3RhY2tHcm93c0Rvd24oKTsKKyAgICBjb25zdCBzaXplX3Qgc3RhY2tfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgLy8gTU1BUF9BTk9OWU1PVVMgaXMgbm90IGRlZmluZWQgb24gTWFjLCBzbyB3ZSB1c2UgTUFQX0FOT04gaW5zdGVhZC4KKyAgICB2b2lkKiBjb25zdCBzdGFjayA9IG1tYXAoTlVMTCwgc3RhY2tfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0FOT04gfCBNQVBfUFJJVkFURSwgLTEsIDApOworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrICE9IE1BUF9GQUlMRUQpOworICAgIHZvaWQqIGNvbnN0IHN0YWNrX3RvcCA9CisgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihzdGFjaykgKyAoc3RhY2tfZ3Jvd3NfZG93biA/IHN0YWNrX3NpemUgOiAwKTsKKworICAgIGNoaWxkX3BpZCA9IGNsb25lKCZFeGVjRGVhdGhUZXN0Q2hpbGRNYWluLCBzdGFja190b3AsIFNJR0NITEQsICZhcmdzKTsKKworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKG11bm1hcChzdGFjaywgc3RhY2tfc2l6ZSkgIT0gLTEpOworICB9CisjZWxzZQorICBjb25zdCBib29sIHVzZV9mb3JrID0gdHJ1ZTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCisKKyAgaWYgKHVzZV9mb3JrICYmIChjaGlsZF9waWQgPSBmb3JrKCkpID09IDApIHsKKyAgICAgIEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4oJmFyZ3MpOworICAgICAgX2V4aXQoMCk7CisgIH0KKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICByZXR1cm4gY2hpbGRfcGlkOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLWV4ZWMgZGVhdGggdGVzdC4gIEl0IHJlLWV4ZWN1dGVzIHRoZQorLy8gbWFpbiBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgc2V0dGluZyB0aGUgLS1ndGVzdF9maWx0ZXIKKy8vIGFuZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHRvIGNhdXNlIG9ubHkgdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgdG8gYmUgcmUtcnVuLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBFeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgaW50IHBpcGVfZmRbMl07CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOworICAvLyBDbGVhciB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIG9uIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUsIGxlc3QKKyAgLy8gaXQgYmUgY2xvc2VkIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lcyBhbiBleGVjOgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY250bChwaXBlX2ZkWzFdLCBGX1NFVEZELCAwKSAhPSAtMSk7CisKKyAgY29uc3QgU3RyaW5nIGZpbHRlcl9mbGFnID0KKyAgICAgIFN0cmluZzo6Rm9ybWF0KCItLSVzJXM9JXMuJXMiLAorICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLCBrRmlsdGVyRmxhZywKKyAgICAgICAgICAgICAgICAgICAgIGluZm8tPnRlc3RfY2FzZV9uYW1lKCksIGluZm8tPm5hbWUoKSk7CisgIGNvbnN0IFN0cmluZyBpbnRlcm5hbF9mbGFnID0KKyAgICAgIFN0cmluZzo6Rm9ybWF0KCItLSVzJXM9JXN8JWR8JWR8JWQiLAorICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLCBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnLAorICAgICAgICAgICAgICAgICAgICAgZmlsZV8sIGxpbmVfLCBkZWF0aF90ZXN0X2luZGV4LCBwaXBlX2ZkWzFdKTsKKyAgQXJndW1lbnRzIGFyZ3M7CisgIGFyZ3MuQWRkQXJndW1lbnRzKEdldEFyZ3ZzKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGZpbHRlcl9mbGFnLmNfc3RyKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGludGVybmFsX2ZsYWcuY19zdHIoKSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gU2VlIHRoZSBjb21tZW50IGluIE5vRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSBmb3Igd2h5IHRoZSBuZXh0IGxpbmUKKyAgLy8gaXMgbmVjZXNzYXJ5LgorICBGbHVzaEluZm9Mb2coKTsKKworICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBFeGVjRGVhdGhUZXN0Rm9yayhhcmdzLkFyZ3YoKSwgcGlwZV9mZFswXSk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7CisgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICBzZXRfc3Bhd25lZCh0cnVlKTsKKyAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKK30KKworI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBDcmVhdGVzIGEgY29uY3JldGUgRGVhdGhUZXN0LWRlcml2ZWQgY2xhc3MgdGhhdCBkZXBlbmRzIG9uIHRoZQorLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlIGZsYWcsIGFuZCBzZXRzIHRoZSBwb2ludGVyIHBvaW50ZWQgdG8KKy8vIGJ5IHRoZSAidGVzdCIgYXJndW1lbnQgdG8gaXRzIGFkZHJlc3MuICBJZiB0aGUgdGVzdCBzaG91bGQgYmUKKy8vIHNraXBwZWQsIHNldHMgdGhhdCBwb2ludGVyIHRvIE5VTEwuICBSZXR1cm5zIHRydWUsIHVubGVzcyB0aGUKKy8vIGZsYWcgaXMgc2V0IHRvIGFuIGludmFsaWQgdmFsdWUuCitib29sIERlZmF1bHREZWF0aFRlc3RGYWN0b3J5OjpDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVhdGhUZXN0KiogdGVzdCkgeworICBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpCisgICAgICAtPmluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIGlmIChkZWF0aF90ZXN0X2luZGV4ID4gZmxhZy0+aW5kZXgoKSkgeworICAgICAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICAgIkRlYXRoIHRlc3QgY291bnQgKCVkKSBzb21laG93IGV4Y2VlZGVkIGV4cGVjdGVkIG1heGltdW0gKCVkKSIsCisgICAgICAgICAgZGVhdGhfdGVzdF9pbmRleCwgZmxhZy0+aW5kZXgoKSkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghKGZsYWctPmZpbGUoKSA9PSBmaWxlICYmIGZsYWctPmxpbmUoKSA9PSBsaW5lICYmCisgICAgICAgICAgZmxhZy0+aW5kZXgoKSA9PSBkZWF0aF90ZXN0X2luZGV4KSkgeworICAgICAgKnRlc3QgPSBOVUxMOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJ0aHJlYWRzYWZlIiB8fAorICAgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAiZmFzdCIpIHsKKyAgICAqdGVzdCA9IG5ldyBXaW5kb3dzRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUpOworICB9CisjZWxzZQorICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpIHsKKyAgICAqdGVzdCA9IG5ldyBFeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUpOworICB9IGVsc2UgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7CisgICAgKnRlc3QgPSBuZXcgTm9FeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgpOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgZWxzZSB7ICAvLyBOT0xJTlQgLSB0aGlzIGlzIG1vcmUgcmVhZGFibGUgdGhhbiB1bmJhbGFuY2VkIGJyYWNrZXRzIGluc2lkZSAjaWYuCisgICAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJVbmtub3duIGRlYXRoIHRlc3Qgc3R5bGUgXCIlc1wiIGVuY291bnRlcmVkIiwKKyAgICAgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKS5jX3N0cigpKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBvbiBhIGdpdmVuIGRlbGltaXRlciwgcG9wdWxhdGluZyBhIGdpdmVuCisvLyB2ZWN0b3Igd2l0aCB0aGUgZmllbGRzLiAgR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUKKy8vIDo6c3RkOjpzdHJpbmcsIHNvIHdlIGNhbiB1c2UgaXQgaGVyZS4KK3N0YXRpYyB2b2lkIFNwbGl0U3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY2hhciBkZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiogZGVzdCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBwYXJzZWQ7CisgIDo6c3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7CisgICAgY29uc3QgOjpzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGNvbG9uID0gc3RyLmZpbmQoZGVsaW1pdGVyLCBwb3MpOworICAgIGlmIChjb2xvbiA9PSA6OnN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBwYXJzZWQucHVzaF9iYWNrKHN0ci5zdWJzdHIocG9zKSk7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgcGFyc2VkLnB1c2hfYmFjayhzdHIuc3Vic3RyKHBvcywgY29sb24gLSBwb3MpKTsKKyAgICAgIHBvcyA9IGNvbG9uICsgMTsKKyAgICB9CisgIH0KKyAgZGVzdC0+c3dhcChwYXJzZWQpOworfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gUmVjcmVhdGVzIHRoZSBwaXBlIGFuZCBldmVudCBoYW5kbGVzIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMsCisvLyBzaWduYWxzIHRoZSBldmVudCwgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igd3JhcHBlZCBhcm91bmQgdGhlIHBpcGUKKy8vIGhhbmRsZS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIGNoaWxkIHByb2Nlc3Mgb25seS4KK2ludCBHZXRTdGF0dXNGaWxlRGVzY3JpcHRvcih1bnNpZ25lZCBpbnQgcGFyZW50X3Byb2Nlc3NfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV2ZW50X2hhbmRsZV9hc19zaXplX3QpIHsKKyAgQXV0b0hhbmRsZSBwYXJlbnRfcHJvY2Vzc19oYW5kbGUoOjpPcGVuUHJvY2VzcyhQUk9DRVNTX0RVUF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIE5vbi1pbmhlcml0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIGlmIChwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgiVW5hYmxlIHRvIG9wZW4gcGFyZW50IHByb2Nlc3MgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIH0KKworICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZXBsYWNlIHRoZSBmb2xsb3dpbmcgY2hlY2sgd2l0aCBhCisgIC8vIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gd2hlbiBhdmFpbGFibGUuCisgIEdURVNUX0NIRUNLXyhzaXplb2YoSEFORExFKSA8PSBzaXplb2Yoc2l6ZV90KSk7CisKKyAgY29uc3QgSEFORExFIHdyaXRlX2hhbmRsZSA9CisgICAgICByZWludGVycHJldF9jYXN0PEhBTkRMRT4od3JpdGVfaGFuZGxlX2FzX3NpemVfdCk7CisgIEhBTkRMRSBkdXBfd3JpdGVfaGFuZGxlOworCisgIC8vIFRoZSBuZXdseSBpbml0aWFsaXplZCBoYW5kbGUgaXMgYWNjZXNzaWJsZSBvbmx5IGluIGluIHRoZSBwYXJlbnQKKyAgLy8gcHJvY2Vzcy4gVG8gb2J0YWluIG9uZSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgY2hpbGQsIHdlIG5lZWQgdG8gdXNlCisgIC8vIER1cGxpY2F0ZUhhbmRsZS4KKyAgaWYgKCE6OkR1cGxpY2F0ZUhhbmRsZShwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCksIHdyaXRlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldEN1cnJlbnRQcm9jZXNzKCksICZkdXBfd3JpdGVfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgICAgLy8gUmVxdWVzdGVkIHByaXZpbGVnZXMgaWdub3JlZCBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRFVQTElDQVRFX1NBTUVfQUNDRVNTIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBSZXF1ZXN0IG5vbi1pbmhlcml0YWJsZSBoYW5kbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIHBpcGUgaGFuZGxlICVJdSBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAldSIsCisgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QsIHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIH0KKworICBjb25zdCBIQU5ETEUgZXZlbnRfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KGV2ZW50X2hhbmRsZV9hc19zaXplX3QpOworICBIQU5ETEUgZHVwX2V2ZW50X2hhbmRsZTsKKworICBpZiAoITo6RHVwbGljYXRlSGFuZGxlKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSwgZXZlbnRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6R2V0Q3VycmVudFByb2Nlc3MoKSwgJmR1cF9ldmVudF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIGV2ZW50IGhhbmRsZSAlSXUgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgJXUiLAorICAgICAgICBldmVudF9oYW5kbGVfYXNfc2l6ZV90LCBwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgY29uc3QgaW50IHdyaXRlX2ZkID0KKyAgICAgIDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGR1cF93cml0ZV9oYW5kbGUpLCBPX0FQUEVORCk7CisgIGlmICh3cml0ZV9mZCA9PSAtMSkgeworICAgIERlYXRoVGVzdEFib3J0KFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAiVW5hYmxlIHRvIGNvbnZlcnQgcGlwZSBoYW5kbGUgJUl1IHRvIGEgZmlsZSBkZXNjcmlwdG9yIiwKKyAgICAgICAgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCkpOworICB9CisKKyAgLy8gU2lnbmFscyB0aGUgcGFyZW50IHRoYXQgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBoYXMgYmVlbiBhY3F1aXJlZAorICAvLyBzbyB0aGUgcGFyZW50IGNhbiByZWxlYXNlIGl0cyBvd24gd3JpdGUgZW5kLgorICA6OlNldEV2ZW50KGR1cF9ldmVudF9oYW5kbGUpOworCisgIHJldHVybiB3cml0ZV9mZDsKK30KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgb2JqZWN0IHdpdGggZmllbGRzCisvLyBpbml0aWFsaXplZCBmcm9tIHRoZSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSBmbGFnIGlmCisvLyB0aGUgZmxhZyBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSByZXR1cm5zIE5VTEwuCitJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgeworICBpZiAoR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgPT0gIiIpIHJldHVybiBOVUxMOworCisgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcsIHNvIHdlCisgIC8vIGNhbiB1c2UgaXQgaGVyZS4KKyAgaW50IGxpbmUgPSAtMTsKKyAgaW50IGluZGV4ID0gLTE7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IGZpZWxkczsKKyAgU3BsaXRTdHJpbmcoR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkuY19zdHIoKSwgJ3wnLCAmZmllbGRzKTsKKyAgaW50IHdyaXRlX2ZkID0gLTE7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHVuc2lnbmVkIGludCBwYXJlbnRfcHJvY2Vzc19pZCA9IDA7CisgIHNpemVfdCB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90ID0gMDsKKyAgc2l6ZV90IGV2ZW50X2hhbmRsZV9hc19zaXplX3QgPSAwOworCisgIGlmIChmaWVsZHMuc2l6ZSgpICE9IDYKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzFdLCAmbGluZSkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzJdLCAmaW5kZXgpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1szXSwgJnBhcmVudF9wcm9jZXNzX2lkKQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbNF0sICZ3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbNV0sICZldmVudF9oYW5kbGVfYXNfc2l6ZV90KSkgeworICAgIERlYXRoVGVzdEFib3J0KFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAiQmFkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZzogJXMiLAorICAgICAgICBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5jX3N0cigpKSk7CisgIH0KKyAgd3JpdGVfZmQgPSBHZXRTdGF0dXNGaWxlRGVzY3JpcHRvcihwYXJlbnRfcHJvY2Vzc19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2hhbmRsZV9hc19zaXplX3QpOworI2Vsc2UKKyAgaWYgKGZpZWxkcy5zaXplKCkgIT0gNAorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMV0sICZsaW5lKQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMl0sICZpbmRleCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzNdLCAmd3JpdGVfZmQpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJCYWQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnOiAlcyIsCisgICAgICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmNfc3RyKCkpKTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgIHJldHVybiBuZXcgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKGZpZWxkc1swXSwgbGluZSwgaW5kZXgsIHdyaXRlX2ZkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvZ3Rlc3QtZmlsZXBhdGguY2MgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2d0ZXN0LWZpbGVwYXRoLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZWY5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2d0ZXN0LWZpbGVwYXRoLmNjCkBAIC0wLDAgKzEsMzgwIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorCisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0Lmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VsaWYgR1RFU1RfT1NfV0lORE9XUworI2luY2x1ZGUgPGRpcmVjdC5oPgorI2luY2x1ZGUgPGlvLmg+CisjZWxpZiBHVEVTVF9PU19TWU1CSUFOCisvLyBTeW1iaWFuIE9wZW5DIGhhcyBQQVRIX01BWCBpbiBzeXMvc3lzbGltaXRzLmgKKyNpbmNsdWRlIDxzeXMvc3lzbGltaXRzLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGNsaW1pdHM+ICAvLyBTb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgZGVmaW5lIFBBVEhfTUFYIGhlcmUuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfTUFYX1BBVEgKKyNlbGlmIGRlZmluZWQoUEFUSF9NQVgpCisjZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBQQVRIX01BWAorI2VsaWYgZGVmaW5lZChfWE9QRU5fUEFUSF9NQVgpCisjZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfWE9QRU5fUEFUSF9NQVgKKyNlbHNlCisjZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfUE9TSVhfUEFUSF9NQVgKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmg+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisvLyBPbiBXaW5kb3dzLCAnXFwnIGlzIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciwgYnV0IG1hbnkgdG9vbHMgYW5kIHRoZQorLy8gV2luZG93cyBBUEkgYWxzbyBhY2NlcHQgJy8nIGFzIGFuIGFsdGVybmF0ZSBwYXRoIHNlcGFyYXRvci4gVW5sZXNzIG90aGVyd2lzZQorLy8gbm90ZWQsIGEgZmlsZSBwYXRoIGNhbiBjb250YWluIGVpdGhlciBraW5kIG9mIHBhdGggc2VwYXJhdG9ycywgb3IgYSBtaXh0dXJlCisvLyBvZiB0aGVtLgorY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvciA9ICdcXCc7Citjb25zdCBjaGFyIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yID0gJy8nOworY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIlxcIjsKK2NvbnN0IGNoYXIga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICIvIjsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IGRpcmVjdG9yeS4gWW91IHNob3VsZCBub3QgdXNlCisvLyB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4gdGVzdHMgb24gV2luZG93cyBDRSwgYnV0IHRoaXMgYXQgbGVhc3QKKy8vIHByb3ZpZGVzIGEgcmVhc29uYWJsZSBmYWxsYmFjay4KK2NvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICJcXCI7CisvLyBXaW5kb3dzIENFIGRvZXNuJ3QgZGVmaW5lIElOVkFMSURfRklMRV9BVFRSSUJVVEVTCitjb25zdCBEV09SRCBrSW52YWxpZEZpbGVBdHRyaWJ1dGVzID0gMHhmZmZmZmZmZjsKKyNlbHNlCitjb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiLlxcIjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyNlbHNlCitjb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yID0gJy8nOworY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIi8iOworY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIi4vIjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIHZhbGlkIHBhdGggc2VwYXJhdG9yLgorc3RhdGljIGJvb2wgSXNQYXRoU2VwYXJhdG9yKGNoYXIgYykgeworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgIHJldHVybiAoYyA9PSBrUGF0aFNlcGFyYXRvcikgfHwgKGMgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOworI2Vsc2UKKyAgcmV0dXJuIGMgPT0ga1BhdGhTZXBhcmF0b3I7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLgorRmlsZVBhdGggRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IGRpcmVjdG9yeSwgc28gd2UganVzdCByZXR1cm4KKyAgLy8gc29tZXRoaW5nIHJlYXNvbmFibGUuCisgIHJldHVybiBGaWxlUGF0aChrQ3VycmVudERpcmVjdG9yeVN0cmluZyk7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisgIGNoYXIgY3dkW0dURVNUX1BBVEhfTUFYXyArIDFdID0geyAnXDAnIH07CisgIHJldHVybiBGaWxlUGF0aChfZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpID09IE5VTEwgPyAiIiA6IGN3ZCk7CisjZWxzZQorICBjaGFyIGN3ZFtHVEVTVF9QQVRIX01BWF8gKyAxXSA9IHsgJ1wwJyB9OworICByZXR1cm4gRmlsZVBhdGgoZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpID09IE5VTEwgPyAiIiA6IGN3ZCk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCit9CisKKy8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgorLy8gRXhhbXBsZTogRmlsZVBhdGgoImRpci9maWxlLmV4ZSIpLlJlbW92ZUV4dGVuc2lvbigiRVhFIikgcmV0dXJucworLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90CisvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsKKyAgU3RyaW5nIGRvdF9leHRlbnNpb24oU3RyaW5nOjpGb3JtYXQoIi4lcyIsIGV4dGVuc2lvbikpOworICBpZiAocGF0aG5hbWVfLkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKGRvdF9leHRlbnNpb24uY19zdHIoKSkpIHsKKyAgICByZXR1cm4gRmlsZVBhdGgoU3RyaW5nKHBhdGhuYW1lXy5jX3N0cigpLCBwYXRobmFtZV8ubGVuZ3RoKCkgLSA0KSk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB2YWxpZCBwYXRoIHNlcGFyYXRvciBpbgorLy8gdGhlIEZpbGVQYXRoLiBPbiBXaW5kb3dzLCBmb3IgZXhhbXBsZSwgYm90aCAnLycgYW5kICdcJyBhcmUgdmFsaWQgcGF0aAorLy8gc2VwYXJhdG9ycy4gUmV0dXJucyBOVUxMIGlmIG5vIHBhdGggc2VwYXJhdG9yIHdhcyBmb3VuZC4KK2NvbnN0IGNoYXIqIEZpbGVQYXRoOjpGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gc3RycmNocihjX3N0cigpLCBrUGF0aFNlcGFyYXRvcik7CisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9hbHRfc2VwID0gc3RycmNocihjX3N0cigpLCBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvcik7CisgIC8vIENvbXBhcmluZyB0d28gcG9pbnRlcnMgb2Ygd2hpY2ggb25seSBvbmUgaXMgTlVMTCBpcyB1bmRlZmluZWQuCisgIGlmIChsYXN0X2FsdF9zZXAgIT0gTlVMTCAmJgorICAgICAgKGxhc3Rfc2VwID09IE5VTEwgfHwgbGFzdF9hbHRfc2VwID4gbGFzdF9zZXApKSB7CisgICAgcmV0dXJuIGxhc3RfYWx0X3NlcDsKKyAgfQorI2VuZGlmCisgIHJldHVybiBsYXN0X3NlcDsKK30KKworLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGRpcmVjdG9yeSBwYXJ0IHJlbW92ZWQuCisvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpIHJldHVybnMKKy8vIEZpbGVQYXRoKCJmaWxlIikuIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBwYXJ0ICgianVzdF9hX2ZpbGUiKSwgaXQgcmV0dXJucworLy8gdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuIElmIHRoZXJlIGlzIG5vIGZpbGUgcGFydCAoImp1c3RfYV9kaXIvIikgaXQKKy8vIHJldHVybnMgYW4gZW1wdHkgRmlsZVBhdGggKCIiKS4KKy8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCitGaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlRGlyZWN0b3J5TmFtZSgpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKTsKKyAgcmV0dXJuIGxhc3Rfc2VwID8gRmlsZVBhdGgoU3RyaW5nKGxhc3Rfc2VwICsgMSkpIDogKnRoaXM7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lIHJldHVybnMgdGhlIGRpcmVjdG9yeSBwYXRoIHdpdGggdGhlIGZpbGVuYW1lIHJlbW92ZWQuCisvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuCisvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCisvLyBGaWxlUGF0aCgiLi8iKSBvciwgb24gV2luZG93cywgRmlsZVBhdGgoIi5cXCIpLiBJZiB0aGUgZmlsZXBhdGggZG9lcworLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUZpbGVOYW1lKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpOworICBTdHJpbmcgZGlyOworICBpZiAobGFzdF9zZXApIHsKKyAgICBkaXIgPSBTdHJpbmcoY19zdHIoKSwgbGFzdF9zZXAgKyAxIC0gY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgZGlyID0ga0N1cnJlbnREaXJlY3RvcnlTdHJpbmc7CisgIH0KKyAgcmV0dXJuIEZpbGVQYXRoKGRpcik7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4KKworLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwKKy8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgorLy8gdGhhbiB6ZXJvIChlLmcuLCAxMiksIHJldHVybnMgImRpci90ZXN0XzEyLnhtbCIuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorRmlsZVBhdGggRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pIHsKKyAgU3RyaW5nIGZpbGU7CisgIGlmIChudW1iZXIgPT0gMCkgeworICAgIGZpbGUgPSBTdHJpbmc6OkZvcm1hdCgiJXMuJXMiLCBiYXNlX25hbWUuY19zdHIoKSwgZXh0ZW5zaW9uKTsKKyAgfSBlbHNlIHsKKyAgICBmaWxlID0gU3RyaW5nOjpGb3JtYXQoIiVzXyVkLiVzIiwgYmFzZV9uYW1lLmNfc3RyKCksIG51bWJlciwgZXh0ZW5zaW9uKTsKKyAgfQorICByZXR1cm4gQ29uY2F0UGF0aHMoZGlyZWN0b3J5LCBGaWxlUGF0aChmaWxlKSk7Cit9CisKKy8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCByZWxhdGl2ZV9wYXRoID0gInRlc3QueG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4KKy8vIE9uIFdpbmRvd3MsIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCitGaWxlUGF0aCBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgcmVsYXRpdmVfcGF0aCkgeworICBpZiAoZGlyZWN0b3J5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gcmVsYXRpdmVfcGF0aDsKKyAgY29uc3QgRmlsZVBhdGggZGlyKGRpcmVjdG9yeS5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisgIHJldHVybiBGaWxlUGF0aChTdHJpbmc6OkZvcm1hdCgiJXMlYyVzIiwgZGlyLmNfc3RyKCksIGtQYXRoU2VwYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfcGF0aC5jX3N0cigpKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgc29tZXRoaW5nIGZpbmRhYmxlIGluIHRoZSBmaWxlLXN5c3RlbSwKKy8vIGVpdGhlciBhIGZpbGUsIGRpcmVjdG9yeSwgb3Igd2hhdGV2ZXIuCitib29sIEZpbGVQYXRoOjpGaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRobmFtZV8uY19zdHIoKSk7CisgIGNvbnN0IERXT1JEIGF0dHJpYnV0ZXMgPSBHZXRGaWxlQXR0cmlidXRlcyh1bmljb2RlKTsKKyAgZGVsZXRlIFtdIHVuaWNvZGU7CisgIHJldHVybiBhdHRyaWJ1dGVzICE9IGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXM7CisjZWxzZQorICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7CisgIHJldHVybiBwb3NpeDo6U3RhdChwYXRobmFtZV8uY19zdHIoKSwgJmZpbGVfc3RhdCkgPT0gMDsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZS1zeXN0ZW0KKy8vIHRoYXQgZXhpc3RzLgorYm9vbCBGaWxlUGF0aDo6RGlyZWN0b3J5RXhpc3RzKCkgY29uc3QgeworICBib29sIHJlc3VsdCA9IGZhbHNlOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgLy8gRG9uJ3Qgc3RyaXAgb2ZmIHRyYWlsaW5nIHNlcGFyYXRvciBpZiBwYXRoIGlzIGEgcm9vdCBkaXJlY3Rvcnkgb24KKyAgLy8gV2luZG93cyAobGlrZSAiQzpcXCIpLgorICBjb25zdCBGaWxlUGF0aCYgcGF0aChJc1Jvb3REaXJlY3RvcnkoKSA/ICp0aGlzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisjZWxzZQorICBjb25zdCBGaWxlUGF0aCYgcGF0aCgqdGhpcyk7CisjZW5kaWYKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocGF0aC5jX3N0cigpKTsKKyAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOworICBkZWxldGUgW10gdW5pY29kZTsKKyAgaWYgKChhdHRyaWJ1dGVzICE9IGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXMpICYmCisgICAgICAoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpIHsKKyAgICByZXN1bHQgPSB0cnVlOworICB9CisjZWxzZQorICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7CisgIHJlc3VsdCA9IHBvc2l4OjpTdGF0KHBhdGguY19zdHIoKSwgJmZpbGVfc3RhdCkgPT0gMCAmJgorICAgICAgcG9zaXg6OklzRGlyKGZpbGVfc3RhdCk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIHJvb3QgZGlyZWN0b3J5LiAoV2luZG93cyBoYXMgb25lCisvLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pCitib29sIEZpbGVQYXRoOjpJc1Jvb3REaXJlY3RvcnkoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogb24gV2luZG93cyBhIG5ldHdvcmsgc2hhcmUgbGlrZQorICAvLyBcXHNlcnZlclxzaGFyZSBjYW4gYmUgYSByb290IGRpcmVjdG9yeSwgYWx0aG91Z2ggaXQgY2Fubm90IGJlIHRoZQorICAvLyBjdXJyZW50IGRpcmVjdG9yeS4gIEhhbmRsZSB0aGlzIHByb3Blcmx5LgorICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID09IDMgJiYgSXNBYnNvbHV0ZVBhdGgoKTsKKyNlbHNlCisgIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMSAmJiBJc1BhdGhTZXBhcmF0b3IocGF0aG5hbWVfLmNfc3RyKClbMF0pOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYW4gYWJzb2x1dGUgcGF0aC4KK2Jvb2wgRmlsZVBhdGg6OklzQWJzb2x1dGVQYXRoKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBuYW1lID0gcGF0aG5hbWVfLmNfc3RyKCk7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID49IDMgJiYKKyAgICAgKChuYW1lWzBdID49ICdhJyAmJiBuYW1lWzBdIDw9ICd6JykgfHwKKyAgICAgIChuYW1lWzBdID49ICdBJyAmJiBuYW1lWzBdIDw9ICdaJykpICYmCisgICAgIG5hbWVbMV0gPT0gJzonICYmCisgICAgIElzUGF0aFNlcGFyYXRvcihuYW1lWzJdKTsKKyNlbHNlCisgIHJldHVybiBJc1BhdGhTZXBhcmF0b3IobmFtZVswXSk7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyBhIHBhdGhuYW1lIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoZSBwYXRobmFtZQorLy8gd2lsbCBiZSBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbiBvcgorLy8gZGlyZWN0b3J5L2Jhc2VfbmFtZV88bnVtYmVyPi5leHRlbnNpb24gaWYgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24KKy8vIGFscmVhZHkgZXhpc3RzLiBUaGUgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdW50aWwgYSBwYXRobmFtZSBpcyBmb3VuZAorLy8gdGhhdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorLy8gRXhhbXBsZXM6ICdkaXIvZm9vX3Rlc3QueG1sJyBvciAnZGlyL2Zvb190ZXN0XzEueG1sJy4KKy8vIFRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGFyZSBjYWxsaW5nIHRoaXMKKy8vIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUgLS0gdGhleSBjb3VsZCBib3RoIHBpY2sgdGhlIHNhbWUgZmlsZW5hbWUuCitGaWxlUGF0aCBGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgeworICBGaWxlUGF0aCBmdWxsX3BhdGhuYW1lOworICBpbnQgbnVtYmVyID0gMDsKKyAgZG8geworICAgIGZ1bGxfcGF0aG5hbWUuU2V0KE1ha2VGaWxlTmFtZShkaXJlY3RvcnksIGJhc2VfbmFtZSwgbnVtYmVyKyssIGV4dGVuc2lvbikpOworICB9IHdoaWxlIChmdWxsX3BhdGhuYW1lLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsKKyAgcmV0dXJuIGZ1bGxfcGF0aG5hbWU7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvciwgd2hpY2ggaW5kaWNhdGVzIHRoYXQKKy8vIGl0IGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGRpcmVjdG9yeS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisvLyBUaGlzIGRvZXMgTk9UIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgKG9yIGZpbGUpIGFjdHVhbGx5IGV4aXN0cy4KK2Jvb2wgRmlsZVBhdGg6OklzRGlyZWN0b3J5KCkgY29uc3QgeworICByZXR1cm4gIXBhdGhuYW1lXy5lbXB0eSgpICYmCisgICAgICAgICBJc1BhdGhTZXBhcmF0b3IocGF0aG5hbWVfLmNfc3RyKClbcGF0aG5hbWVfLmxlbmd0aCgpIC0gMV0pOworfQorCisvLyBDcmVhdGUgZGlyZWN0b3JpZXMgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgaWYKKy8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3JpZXMKKy8vIGZvciBhbnkgcmVhc29uLgorYm9vbCBGaWxlUGF0aDo6Q3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGNvbnN0IHsKKyAgaWYgKCF0aGlzLT5Jc0RpcmVjdG9yeSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAwIHx8IHRoaXMtPkRpcmVjdG9yeUV4aXN0cygpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBGaWxlUGF0aCBwYXJlbnQodGhpcy0+UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuUmVtb3ZlRmlsZU5hbWUoKSk7CisgIHJldHVybiBwYXJlbnQuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpICYmIHRoaXMtPkNyZWF0ZUZvbGRlcigpOworfQorCisvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvcgorLy8gaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZQorLy8gZGlyZWN0b3J5IGZvciBhbnkgcmVhc29uLCBpbmNsdWRpbmcgaWYgdGhlIHBhcmVudCBkaXJlY3RvcnkgZG9lcyBub3QKKy8vIGV4aXN0LiBOb3QgbmFtZWQgIkNyZWF0ZURpcmVjdG9yeSIgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBvbiBXaW5kb3dzLgorYm9vbCBGaWxlUGF0aDo6Q3JlYXRlRm9sZGVyKCkgY29uc3QgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIEZpbGVQYXRoIHJlbW92ZWRfc2VwKHRoaXMtPlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKKyAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihyZW1vdmVkX3NlcC5jX3N0cigpKTsKKyAgaW50IHJlc3VsdCA9IENyZWF0ZURpcmVjdG9yeSh1bmljb2RlLCBOVUxMKSA/IDAgOiAtMTsKKyAgZGVsZXRlIFtdIHVuaWNvZGU7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisgIGludCByZXN1bHQgPSBfbWtkaXIocGF0aG5hbWVfLmNfc3RyKCkpOworI2Vsc2UKKyAgaW50IHJlc3VsdCA9IG1rZGlyKHBhdGhuYW1lXy5jX3N0cigpLCAwNzc3KTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgcmV0dXJuIHRoaXMtPkRpcmVjdG9yeUV4aXN0cygpOyAgLy8gQW4gZXJyb3IgaXMgT0sgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgIH0KKyAgcmV0dXJuIHRydWU7ICAvLyBObyBlcnJvci4KK30KKworLy8gSWYgaW5wdXQgbmFtZSBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCByZW1vdmUgaXQgYW5kIHJldHVybiB0aGUKKy8vIG5hbWUsIG90aGVyd2lzZSByZXR1cm4gdGhlIG5hbWUgc3RyaW5nIHVubW9kaWZpZWQuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpIGNvbnN0IHsKKyAgcmV0dXJuIElzRGlyZWN0b3J5KCkKKyAgICAgID8gRmlsZVBhdGgoU3RyaW5nKHBhdGhuYW1lXy5jX3N0cigpLCBwYXRobmFtZV8ubGVuZ3RoKCkgLSAxKSkKKyAgICAgIDogKnRoaXM7Cit9CisKKy8vIFJlbW92ZXMgYW55IHJlZHVuZGFudCBzZXBhcmF0b3JzIHRoYXQgbWlnaHQgYmUgaW4gdGhlIHBhdGhuYW1lLgorLy8gRm9yIGV4YW1wbGUsICJiYXIvLy9mb28iIGJlY29tZXMgImJhci9mb28iLiBEb2VzIG5vdCBlbGltaW5hdGUgb3RoZXIKKy8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLgorLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGhhbmRsZSBXaW5kb3dzIG5ldHdvcmsgc2hhcmVzIChlLmcuIFxcc2VydmVyXHNoYXJlKS4KK3ZvaWQgRmlsZVBhdGg6Ok5vcm1hbGl6ZSgpIHsKKyAgaWYgKHBhdGhuYW1lXy5jX3N0cigpID09IE5VTEwpIHsKKyAgICBwYXRobmFtZV8gPSAiIjsKKyAgICByZXR1cm47CisgIH0KKyAgY29uc3QgY2hhciogc3JjID0gcGF0aG5hbWVfLmNfc3RyKCk7CisgIGNoYXIqIGNvbnN0IGRlc3QgPSBuZXcgY2hhcltwYXRobmFtZV8ubGVuZ3RoKCkgKyAxXTsKKyAgY2hhciogZGVzdF9wdHIgPSBkZXN0OworICBtZW1zZXQoZGVzdF9wdHIsIDAsIHBhdGhuYW1lXy5sZW5ndGgoKSArIDEpOworCisgIHdoaWxlICgqc3JjICE9ICdcMCcpIHsKKyAgICAqZGVzdF9wdHIgPSAqc3JjOworICAgIGlmICghSXNQYXRoU2VwYXJhdG9yKCpzcmMpKSB7CisgICAgICBzcmMrKzsKKyAgICB9IGVsc2UgeworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgICAgICBpZiAoKmRlc3RfcHRyID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKSB7CisgICAgICAgICpkZXN0X3B0ciA9IGtQYXRoU2VwYXJhdG9yOworICAgICAgfQorI2VuZGlmCisgICAgICB3aGlsZSAoSXNQYXRoU2VwYXJhdG9yKCpzcmMpKQorICAgICAgICBzcmMrKzsKKyAgICB9CisgICAgZGVzdF9wdHIrKzsKKyAgfQorICAqZGVzdF9wdHIgPSAnXDAnOworICBwYXRobmFtZV8gPSBkZXN0OworICBkZWxldGVbXSBkZXN0OworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2d0ZXN0LXBvcnQuY2MgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2d0ZXN0LXBvcnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwOTU5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvZ3Rlc3QtcG9ydC5jYwpAQCAtMCwwICsxLDcxMSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorI2luY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIEZvciBUZXJtaW5hdGVQcm9jZXNzKCkKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjaWYgR1RFU1RfT1NfTUFDCisjaW5jbHVkZSA8bWFjaC9tYWNoX2luaXQuaD4KKyNpbmNsdWRlIDxtYWNoL3Rhc2suaD4KKyNpbmNsdWRlIDxtYWNoL3ZtX21hcC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19NQUMKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0LXNwaS5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaD4KKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorLy8gTVNWQyBhbmQgQysrQnVpbGRlciBkbyBub3QgcHJvdmlkZSBhIGRlZmluaXRpb24gb2YgU1RERVJSX0ZJTEVOTy4KK2NvbnN0IGludCBrU3RkT3V0RmlsZW5vID0gMTsKK2NvbnN0IGludCBrU3RkRXJyRmlsZW5vID0gMjsKKyNlbHNlCitjb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IFNURE9VVF9GSUxFTk87Citjb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IFNUREVSUl9GSUxFTk87CisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyNpZiBHVEVTVF9PU19NQUMKKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGUgcHJvY2Vzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGF0CisvLyB3ZSBjYW5ub3QgZGV0ZWN0IGl0Lgorc2l6ZV90IEdldFRocmVhZENvdW50KCkgeworICBjb25zdCB0YXNrX3QgdGFzayA9IG1hY2hfdGFza19zZWxmKCk7CisgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgdGhyZWFkX2NvdW50OworICB0aHJlYWRfYWN0X2FycmF5X3QgdGhyZWFkX2xpc3Q7CisgIGNvbnN0IGtlcm5fcmV0dXJuX3Qgc3RhdHVzID0gdGFza190aHJlYWRzKHRhc2ssICZ0aHJlYWRfbGlzdCwgJnRocmVhZF9jb3VudCk7CisgIGlmIChzdGF0dXMgPT0gS0VSTl9TVUNDRVNTKSB7CisgICAgLy8gdGFza190aHJlYWRzIGFsbG9jYXRlcyByZXNvdXJjZXMgaW4gdGhyZWFkX2xpc3QgYW5kIHdlIG5lZWQgdG8gZnJlZSB0aGVtCisgICAgLy8gdG8gYXZvaWQgbGVha3MuCisgICAgdm1fZGVhbGxvY2F0ZSh0YXNrLAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2bV9hZGRyZXNzX3Q+KHRocmVhZF9saXN0KSwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0aHJlYWRfdCkgKiB0aHJlYWRfY291bnQpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHRocmVhZF9jb3VudCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2Vsc2UKKworc2l6ZV90IEdldFRocmVhZENvdW50KCkgeworICAvLyBUaGVyZSdzIG5vIHBvcnRhYmxlIHdheSB0byBkZXRlY3QgdGhlIG51bWJlciBvZiB0aHJlYWRzLCBzbyB3ZSBqdXN0CisgIC8vIHJldHVybiAwIHRvIGluZGljYXRlIHRoYXQgd2UgY2Fubm90IGRldGVjdCBpdC4KKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCisKKy8vIEltcGxlbWVudHMgUkUuICBDdXJyZW50bHkgb25seSBuZWVkZWQgZm9yIGRlYXRoIHRlc3RzLgorCitSRTo6flJFKCkgeworICBpZiAoaXNfdmFsaWRfKSB7CisgICAgLy8gcmVnZnJlZSdpbmcgYW4gaW52YWxpZCByZWdleCBtaWdodCBjcmFzaCBiZWNhdXNlIHRoZSBjb250ZW50CisgICAgLy8gb2YgdGhlIHJlZ2V4IGlzIHVuZGVmaW5lZC4gU2luY2UgdGhlIHJlZ2V4J3MgYXJlIGVzc2VudGlhbGx5CisgICAgLy8gdGhlIHNhbWUsIG9uZSBjYW5ub3QgYmUgdmFsaWQgKG9yIGludmFsaWQpIHdpdGhvdXQgdGhlIG90aGVyCisgICAgLy8gYmVpbmcgc28gdG9vLgorICAgIHJlZ2ZyZWUoJnBhcnRpYWxfcmVnZXhfKTsKKyAgICByZWdmcmVlKCZmdWxsX3JlZ2V4Xyk7CisgIH0KKyAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihwYXR0ZXJuXykpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLgorYm9vbCBSRTo6RnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIGlmICghcmUuaXNfdmFsaWRfKSByZXR1cm4gZmFsc2U7CisKKyAgcmVnbWF0Y2hfdCBtYXRjaDsKKyAgcmV0dXJuIHJlZ2V4ZWMoJnJlLmZ1bGxfcmVnZXhfLCBzdHIsIDEsICZtYXRjaCwgMCkgPT0gMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIKKy8vIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCitib29sIFJFOjpQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgaWYgKCFyZS5pc192YWxpZF8pIHJldHVybiBmYWxzZTsKKworICByZWdtYXRjaF90IG1hdGNoOworICByZXR1cm4gcmVnZXhlYygmcmUucGFydGlhbF9yZWdleF8sIHN0ciwgMSwgJm1hdGNoLCAwKSA9PSAwOworfQorCisvLyBJbml0aWFsaXplcyBhbiBSRSBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCit2b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7CisgIHBhdHRlcm5fID0gcG9zaXg6OlN0ckR1cChyZWdleCk7CisKKyAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhCisgIC8vIGZ1bGwgbWF0Y2guCisgIGNvbnN0IHNpemVfdCBmdWxsX3JlZ2V4X2xlbiA9IHN0cmxlbihyZWdleCkgKyAxMDsKKyAgY2hhciogY29uc3QgZnVsbF9wYXR0ZXJuID0gbmV3IGNoYXJbZnVsbF9yZWdleF9sZW5dOworCisgIHNucHJpbnRmKGZ1bGxfcGF0dGVybiwgZnVsbF9yZWdleF9sZW4sICJeKCVzKSQiLCByZWdleCk7CisgIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJmZ1bGxfcmVnZXhfLCBmdWxsX3BhdHRlcm4sIFJFR19FWFRFTkRFRCkgPT0gMDsKKyAgLy8gV2Ugd2FudCB0byBjYWxsIHJlZ2NvbXAoJnBhcnRpYWxfcmVnZXhfLCAuLi4pIGV2ZW4gaWYgdGhlCisgIC8vIHByZXZpb3VzIGV4cHJlc3Npb24gcmV0dXJucyBmYWxzZS4gIE90aGVyd2lzZSBwYXJ0aWFsX3JlZ2V4XyBtYXkKKyAgLy8gbm90IGJlIHByb3Blcmx5IGluaXRpYWxpemVkIGNhbiBtYXkgY2F1c2UgdHJvdWJsZSB3aGVuIGl0J3MKKyAgLy8gZnJlZWQuCisgIC8vCisgIC8vIFNvbWUgaW1wbGVtZW50YXRpb24gb2YgUE9TSVggcmVnZXggKGUuZy4gb24gYXQgbGVhc3Qgc29tZQorICAvLyB2ZXJzaW9ucyBvZiBDeWd3aW4pIGRvZXNuJ3QgYWNjZXB0IHRoZSBlbXB0eSBzdHJpbmcgYXMgYSB2YWxpZAorICAvLyByZWdleC4gIFdlIGNoYW5nZSBpdCB0byBhbiBlcXVpdmFsZW50IGZvcm0gIigpIiB0byBiZSBzYWZlLgorICBpZiAoaXNfdmFsaWRfKSB7CisgICAgY29uc3QgY2hhciogY29uc3QgcGFydGlhbF9yZWdleCA9ICgqcmVnZXggPT0gJ1wwJykgPyAiKCkiIDogcmVnZXg7CisgICAgaXNfdmFsaWRfID0gcmVnY29tcCgmcGFydGlhbF9yZWdleF8sIHBhcnRpYWxfcmVnZXgsIFJFR19FWFRFTkRFRCkgPT0gMDsKKyAgfQorICBFWFBFQ1RfVFJVRShpc192YWxpZF8pCisgICAgICA8PCAiUmVndWxhciBleHByZXNzaW9uIFwiIiA8PCByZWdleAorICAgICAgPDwgIlwiIGlzIG5vdCBhIHZhbGlkIFBPU0lYIEV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4iOworCisgIGRlbGV0ZVtdIGZ1bGxfcGF0dGVybjsKK30KKworI2VsaWYgR1RFU1RfVVNFU19TSU1QTEVfUkUKKworLy8gUmV0dXJucyB0cnVlIGlmZiBjaCBhcHBlYXJzIGFueXdoZXJlIGluIHN0ciAoZXhjbHVkaW5nIHRoZQorLy8gdGVybWluYXRpbmcgJ1wwJyBjaGFyYWN0ZXIpLgorYm9vbCBJc0luU2V0KGNoYXIgY2gsIGNvbnN0IGNoYXIqIHN0cikgeworICByZXR1cm4gY2ggIT0gJ1wwJyAmJiBzdHJjaHIoc3RyLCBjaCkgIT0gTlVMTDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiBjaCBiZWxvbmdzIHRvIHRoZSBnaXZlbiBjbGFzc2lmaWNhdGlvbi4gIFVubGlrZQorLy8gc2ltaWxhciBmdW5jdGlvbnMgaW4gPGN0eXBlLmg+LCB0aGVzZSBhcmVuJ3QgYWZmZWN0ZWQgYnkgdGhlCisvLyBjdXJyZW50IGxvY2FsZS4KK2Jvb2wgSXNEaWdpdChjaGFyIGNoKSB7IHJldHVybiAnMCcgPD0gY2ggJiYgY2ggPD0gJzknOyB9Citib29sIElzUHVuY3QoY2hhciBjaCkgeworICByZXR1cm4gSXNJblNldChjaCwgIl4tIVwiIyQlJicoKSorLC4vOjs8PT4/QFtcXF1fYHt8fX4iKTsKK30KK2Jvb2wgSXNSZXBlYXQoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIj8qKyIpOyB9Citib29sIElzV2hpdGVTcGFjZShjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiIFxmXG5cclx0XHYiKTsgfQorYm9vbCBJc1dvcmRDaGFyKGNoYXIgY2gpIHsKKyAgcmV0dXJuICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKSB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgfHwKKyAgICAgICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fCBjaCA9PSAnXyc7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgIlxcYyIgaXMgYSBzdXBwb3J0ZWQgZXNjYXBlIHNlcXVlbmNlLgorYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgYykgeworICByZXR1cm4gKElzUHVuY3QoYykgfHwgSXNJblNldChjLCAiZERmbnJzU3R2d1ciKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIGF0b20gKHNwZWNpZmllZCBieSBlc2NhcGVkIGFuZCBwYXR0ZXJuKQorLy8gbWF0Y2hlcyBjaC4gIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGlmIHRoZSBhdG9tIGlzIGludmFsaWQuCitib29sIEF0b21NYXRjaGVzQ2hhcihib29sIGVzY2FwZWQsIGNoYXIgcGF0dGVybl9jaGFyLCBjaGFyIGNoKSB7CisgIGlmIChlc2NhcGVkKSB7ICAvLyAiXFxwIiB3aGVyZSBwIGlzIHBhdHRlcm5fY2hhci4KKyAgICBzd2l0Y2ggKHBhdHRlcm5fY2hhcikgeworICAgICAgY2FzZSAnZCc6IHJldHVybiBJc0RpZ2l0KGNoKTsKKyAgICAgIGNhc2UgJ0QnOiByZXR1cm4gIUlzRGlnaXQoY2gpOworICAgICAgY2FzZSAnZic6IHJldHVybiBjaCA9PSAnXGYnOworICAgICAgY2FzZSAnbic6IHJldHVybiBjaCA9PSAnXG4nOworICAgICAgY2FzZSAncic6IHJldHVybiBjaCA9PSAnXHInOworICAgICAgY2FzZSAncyc6IHJldHVybiBJc1doaXRlU3BhY2UoY2gpOworICAgICAgY2FzZSAnUyc6IHJldHVybiAhSXNXaGl0ZVNwYWNlKGNoKTsKKyAgICAgIGNhc2UgJ3QnOiByZXR1cm4gY2ggPT0gJ1x0JzsKKyAgICAgIGNhc2UgJ3YnOiByZXR1cm4gY2ggPT0gJ1x2JzsKKyAgICAgIGNhc2UgJ3cnOiByZXR1cm4gSXNXb3JkQ2hhcihjaCk7CisgICAgICBjYXNlICdXJzogcmV0dXJuICFJc1dvcmRDaGFyKGNoKTsKKyAgICB9CisgICAgcmV0dXJuIElzUHVuY3QocGF0dGVybl9jaGFyKSAmJiBwYXR0ZXJuX2NoYXIgPT0gY2g7CisgIH0KKworICByZXR1cm4gKHBhdHRlcm5fY2hhciA9PSAnLicgJiYgY2ggIT0gJ1xuJykgfHwgcGF0dGVybl9jaGFyID09IGNoOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBWYWxpZGF0ZVJlZ2V4KCkgdG8gZm9ybWF0IGVycm9yIG1lc3NhZ2VzLgorU3RyaW5nIEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IoY29uc3QgY2hhciogcmVnZXgsIGludCBpbmRleCkgeworICByZXR1cm4gKE1lc3NhZ2UoKSA8PCAiU3ludGF4IGVycm9yIGF0IGluZGV4ICIgPDwgaW5kZXgKKyAgICAgICAgICA8PCAiIGluIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4IDw8ICJcIjogIikuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEdlbmVyYXRlcyBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgcmVnZXggaXMgaW52YWxpZDsKKy8vIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCitib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpIHsKKyAgaWYgKHJlZ2V4ID09IE5VTEwpIHsKKyAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogZml4IHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBpbiB0aGUKKyAgICAvLyBhc3NlcnRpb24gZmFpbHVyZXMgdG8gbWF0Y2ggd2hlcmUgdGhlIHJlZ2V4IGlzIHVzZWQgaW4gdXNlcgorICAgIC8vIGNvZGUuCisgICAgQUREX0ZBSUxVUkUoKSA8PCAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc192YWxpZCA9IHRydWU7CisKKyAgLy8gVHJ1ZSBpZmYgPywgKiwgb3IgKyBjYW4gZm9sbG93IHRoZSBwcmV2aW91cyBhdG9tLgorICBib29sIHByZXZfcmVwZWF0YWJsZSA9IGZhbHNlOworICBmb3IgKGludCBpID0gMDsgcmVnZXhbaV07IGkrKykgeworICAgIGlmIChyZWdleFtpXSA9PSAnXFwnKSB7ICAvLyBBbiBlc2NhcGUgc2VxdWVuY2UKKyAgICAgIGkrKzsKKyAgICAgIGlmIChyZWdleFtpXSA9PSAnXDAnKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFJc1ZhbGlkRXNjYXBlKHJlZ2V4W2ldKSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcIlxcIiA8PCByZWdleFtpXSA8PCAiXCIuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHByZXZfcmVwZWF0YWJsZSA9IHRydWU7CisgICAgfSBlbHNlIHsgIC8vIE5vdCBhbiBlc2NhcGUgc2VxdWVuY2UuCisgICAgICBjb25zdCBjaGFyIGNoID0gcmVnZXhbaV07CisKKyAgICAgIGlmIChjaCA9PSAnXicgJiYgaSA+IDApIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyQnICYmIHJlZ2V4W2kgKyAxXSAhPSAnXDAnKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKElzSW5TZXQoY2gsICIoKVtde318IikpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCBjaCA8PCAiJyBpcyB1bnN1cHBvcnRlZC4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChJc1JlcGVhdChjaCkgJiYgIXByZXZfcmVwZWF0YWJsZSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiciIDw8IGNoIDw8ICInIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4uIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHJldl9yZXBlYXRhYmxlID0gIUlzSW5TZXQoY2gsICJeJD8qKyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpc192YWxpZDsKK30KKworLy8gTWF0Y2hlcyBhIHJlcGVhdGVkIHJlZ2V4IGF0b20gZm9sbG93ZWQgYnkgYSB2YWxpZCBzaW1wbGUgcmVndWxhcgorLy8gZXhwcmVzc2lvbi4gIFRoZSByZWdleCBhdG9tIGlzIGRlZmluZWQgYXMgYyBpZiBlc2NhcGVkIGlzIGZhbHNlLAorLy8gb3IgXGMgb3RoZXJ3aXNlLiAgcmVwZWF0IGlzIHRoZSByZXBldGl0aW9uIG1ldGEgY2hhcmFjdGVyICg/LCAqLAorLy8gb3IgKykuICBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHN0ciBjb250YWlucyB0b28gbWFueQorLy8gY2hhcmFjdGVycyB0byBiZSBpbmRleGFibGUgYnkgc2l6ZV90LCBpbiB3aGljaCBjYXNlIHRoZSB0ZXN0IHdpbGwKKy8vIHByb2JhYmx5IHRpbWUgb3V0IGFueXdheS4gIFdlIGFyZSBmaW5lIHdpdGggdGhpcyBsaW1pdGF0aW9uIGFzCisvLyBzdGQ6OnN0cmluZyBoYXMgaXQgdG9vLgorYm9vbCBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKKyAgICBib29sIGVzY2FwZWQsIGNoYXIgYywgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LAorICAgIGNvbnN0IGNoYXIqIHN0cikgeworICBjb25zdCBzaXplX3QgbWluX2NvdW50ID0gKHJlcGVhdCA9PSAnKycpID8gMSA6IDA7CisgIGNvbnN0IHNpemVfdCBtYXhfY291bnQgPSAocmVwZWF0ID09ICc/JykgPyAxIDoKKyAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oLTEpIC0gMTsKKyAgLy8gV2UgY2Fubm90IGNhbGwgbnVtZXJpY19saW1pdHM6Om1heCgpIGFzIGl0IGNvbmZsaWN0cyB3aXRoIHRoZQorICAvLyBtYXgoKSBtYWNybyBvbiBXaW5kb3dzLgorCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IG1heF9jb3VudDsgKytpKSB7CisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBhdG9tIG1hdGNoZXMgZWFjaCBvZiB0aGUgZmlyc3QgaSBjaGFyYWN0ZXJzIGluIHN0ci4KKyAgICBpZiAoaSA+PSBtaW5fY291bnQgJiYgTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyICsgaSkpIHsKKyAgICAgIC8vIFdlIGhhdmUgZW5vdWdoIG1hdGNoZXMgYXQgdGhlIGhlYWQsIGFuZCB0aGUgdGFpbCBtYXRjaGVzIHRvby4KKyAgICAgIC8vIFNpbmNlIHdlIG9ubHkgY2FyZSBhYm91dCAqd2hldGhlciogdGhlIHBhdHRlcm4gbWF0Y2hlcyBzdHIKKyAgICAgIC8vIChhcyBvcHBvc2VkIHRvICpob3cqIGl0IG1hdGNoZXMpLCB0aGVyZSBpcyBubyBuZWVkIHRvIGZpbmQgYQorICAgICAgLy8gZ3JlZWR5IG1hdGNoLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChzdHJbaV0gPT0gJ1wwJyB8fCAhQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsIGMsIHN0cltpXSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2Ygc3RyLiAgcmVnZXggbXVzdCBiZSBhCisvLyB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBub3Qgc3RhcnQgd2l0aCAiXiIsIG9yIHRoZQorLy8gcmVzdWx0IGlzIHVuZGVmaW5lZC4KK2Jvb2wgTWF0Y2hSZWdleEF0SGVhZChjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7CisgIGlmICgqcmVnZXggPT0gJ1wwJykgIC8vIEFuIGVtcHR5IHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2YgYW55dGhpbmcuCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gIiQiIG9ubHkgbWF0Y2hlcyB0aGUgZW5kIG9mIGEgc3RyaW5nLiAgTm90ZSB0aGF0IHJlZ2V4IGJlaW5nCisgIC8vIHZhbGlkIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSdzIG5vdGhpbmcgYWZ0ZXIgIiQiIGluIGl0LgorICBpZiAoKnJlZ2V4ID09ICckJykKKyAgICByZXR1cm4gKnN0ciA9PSAnXDAnOworCisgIC8vIElzIHRoZSBmaXJzdCB0aGluZyBpbiByZWdleCBhbiBlc2NhcGUgc2VxdWVuY2U/CisgIGNvbnN0IGJvb2wgZXNjYXBlZCA9ICpyZWdleCA9PSAnXFwnOworICBpZiAoZXNjYXBlZCkKKyAgICArK3JlZ2V4OworICBpZiAoSXNSZXBlYXQocmVnZXhbMV0pKSB7CisgICAgLy8gTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoKSBjYWxscyBNYXRjaFJlZ2V4QXRIZWFkKCksIHNvCisgICAgLy8gaGVyZSdzIGFuIGluZGlyZWN0IHJlY3Vyc2lvbi4gIEl0IHRlcm1pbmF0ZXMgYXMgdGhlIHJlZ2V4IGdldHMKKyAgICAvLyBzaG9ydGVyIGluIGVhY2ggcmVjdXJzaW9uLgorICAgIHJldHVybiBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKKyAgICAgICAgZXNjYXBlZCwgcmVnZXhbMF0sIHJlZ2V4WzFdLCByZWdleCArIDIsIHN0cik7CisgIH0gZWxzZSB7CisgICAgLy8gcmVnZXggaXNuJ3QgZW1wdHksIGlzbid0ICIkIiwgYW5kIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhCisgICAgLy8gcmVwZXRpdGlvbi4gIFdlIG1hdGNoIHRoZSBmaXJzdCBhdG9tIG9mIHJlZ2V4IHdpdGggdGhlIGZpcnN0CisgICAgLy8gY2hhcmFjdGVyIG9mIHN0ciBhbmQgcmVjdXJzZS4KKyAgICByZXR1cm4gKCpzdHIgIT0gJ1wwJykgJiYgQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsICpyZWdleCwgKnN0cikgJiYKKyAgICAgICAgTWF0Y2hSZWdleEF0SGVhZChyZWdleCArIDEsIHN0ciArIDEpOworICB9Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhbnkgc3Vic3RyaW5nIG9mIHN0ci4gIHJlZ2V4IG11c3QgYmUKKy8vIGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisvLworLy8gVGhlIGFsZ29yaXRobSBpcyByZWN1cnNpdmUsIGJ1dCB0aGUgcmVjdXJzaW9uIGRlcHRoIGRvZXNuJ3QgZXhjZWVkCisvLyB0aGUgcmVnZXggbGVuZ3RoLCBzbyB3ZSB3b24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJ1bm5pbmcgb3V0IG9mCisvLyBzdGFjayBzcGFjZSBub3JtYWxseS4gIEluIHJhcmUgY2FzZXMgdGhlIHRpbWUgY29tcGxleGl0eSBjYW4gYmUKKy8vIGV4cG9uZW50aWFsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVnZXggbGVuZ3RoICsgdGhlIHN0cmluZyBsZW5ndGgsCisvLyBidXQgdXN1YWxseSBpdCdzIG11c3QgZmFzdGVyIChvZnRlbiBjbG9zZSB0byBsaW5lYXIpLgorYm9vbCBNYXRjaFJlZ2V4QW55d2hlcmUoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cikgeworICBpZiAocmVnZXggPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCpyZWdleCA9PSAnXicpCisgICAgcmV0dXJuIE1hdGNoUmVnZXhBdEhlYWQocmVnZXggKyAxLCBzdHIpOworCisgIC8vIEEgc3VjY2Vzc2Z1bCBtYXRjaCBjYW4gYmUgYW55d2hlcmUgaW4gc3RyLgorICBkbyB7CisgICAgaWYgKE1hdGNoUmVnZXhBdEhlYWQocmVnZXgsIHN0cikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfSB3aGlsZSAoKnN0cisrICE9ICdcMCcpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEltcGxlbWVudHMgdGhlIFJFIGNsYXNzLgorCitSRTo6flJFKCkgeworICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KHBhdHRlcm5fKSk7CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4oZnVsbF9wYXR0ZXJuXykpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLgorYm9vbCBSRTo6RnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLmZ1bGxfcGF0dGVybl8sIHN0cik7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCisvLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLnBhdHRlcm5fLCBzdHIpOworfQorCisvLyBJbml0aWFsaXplcyBhbiBSRSBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCit2b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7CisgIHBhdHRlcm5fID0gZnVsbF9wYXR0ZXJuXyA9IE5VTEw7CisgIGlmIChyZWdleCAhPSBOVUxMKSB7CisgICAgcGF0dGVybl8gPSBwb3NpeDo6U3RyRHVwKHJlZ2V4KTsKKyAgfQorCisgIGlzX3ZhbGlkXyA9IFZhbGlkYXRlUmVnZXgocmVnZXgpOworICBpZiAoIWlzX3ZhbGlkXykgeworICAgIC8vIE5vIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdHRlcm4gd2hlbiB0aGUgcmVnZXggaXMgaW52YWxpZC4KKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKHJlZ2V4KTsKKyAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhCisgIC8vIGZ1bGwgbWF0Y2g6IHdlIG5lZWQgc3BhY2UgdG8gcHJlcGVuZCBhICdeJywgYXBwZW5kIGEgJyQnLCBhbmQKKyAgLy8gdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCAnXDAnLgorICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4obWFsbG9jKGxlbiArIDMpKTsKKyAgZnVsbF9wYXR0ZXJuXyA9IGJ1ZmZlcjsKKworICBpZiAoKnJlZ2V4ICE9ICdeJykKKyAgICAqYnVmZmVyKysgPSAnXic7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gc3RhcnRzIHdpdGggJ14nLgorCisgIC8vIFdlIGRvbid0IHVzZSBzbnByaW50ZiBvciBzdHJuY3B5LCBhcyB0aGV5IHRyaWdnZXIgYSB3YXJuaW5nIHdoZW4KKyAgLy8gY29tcGlsZWQgd2l0aCBWQysrIDguMC4KKyAgbWVtY3B5KGJ1ZmZlciwgcmVnZXgsIGxlbik7CisgIGJ1ZmZlciArPSBsZW47CisKKyAgaWYgKGxlbiA9PSAwIHx8IHJlZ2V4W2xlbiAtIDFdICE9ICckJykKKyAgICAqYnVmZmVyKysgPSAnJCc7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gZW5kcyB3aXRoICckJy4KKworICAqYnVmZmVyID0gJ1wwJzsKK30KKworI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BPU0lYX1JFCisKKworR1Rlc3RMb2c6OkdUZXN0TG9nKEdUZXN0TG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKQorICAgIDogc2V2ZXJpdHlfKHNldmVyaXR5KSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IG1hcmtlciA9CisgICAgICBzZXZlcml0eSA9PSBHVEVTVF9JTkZPID8gICAgIlsgIElORk8gXSIgOgorICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfV0FSTklORyA/ICJbV0FSTklOR10iIDoKKyAgICAgIHNldmVyaXR5ID09IEdURVNUX0VSUk9SID8gICAiWyBFUlJPUiBdIiA6ICJbIEZBVEFMIF0iOworICBHZXRTdHJlYW0oKSA8PCA6OnN0ZDo6ZW5kbCA8PCBtYXJrZXIgPDwgIiAiCisgICAgICAgICAgICAgIDw8IEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpIDw8ICI6ICI7Cit9CisKKy8vIEZsdXNoZXMgdGhlIGJ1ZmZlcnMgYW5kLCBpZiBzZXZlcml0eSBpcyBHVEVTVF9GQVRBTCwgYWJvcnRzIHRoZSBwcm9ncmFtLgorR1Rlc3RMb2c6On5HVGVzdExvZygpIHsKKyAgR2V0U3RyZWFtKCkgPDwgOjpzdGQ6OmVuZGw7CisgIGlmIChzZXZlcml0eV8gPT0gR1RFU1RfRkFUQUwpIHsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBwb3NpeDo6QWJvcnQoKTsKKyAgfQorfQorLy8gRGlzYWJsZSBNaWNyb3NvZnQgZGVwcmVjYXRpb24gd2FybmluZ3MgZm9yIFBPU0lYIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbQorLy8gdGhpcyBjbGFzcyAoY3JlYXQsIGR1cCwgZHVwMiwgYW5kIGNsb3NlKQorI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0OTk2KQorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTl8KKworLy8gT2JqZWN0IHRoYXQgY2FwdHVyZXMgYW4gb3V0cHV0IHN0cmVhbSAoc3Rkb3V0L3N0ZGVycikuCitjbGFzcyBDYXB0dXJlZFN0cmVhbSB7CisgcHVibGljOgorICAvLyBUaGUgY3RvciByZWRpcmVjdHMgdGhlIHN0cmVhbSB0byBhIHRlbXBvcmFyeSBmaWxlLgorICBDYXB0dXJlZFN0cmVhbShpbnQgZmQpIDogZmRfKGZkKSwgdW5jYXB0dXJlZF9mZF8oZHVwKGZkKSkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgICBjaGFyIHRlbXBfZGlyX3BhdGhbTUFYX1BBVEggKyAxXSA9IHsgJ1wwJyB9OyAgLy8gTk9MSU5UCisgICAgY2hhciB0ZW1wX2ZpbGVfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQKKworICAgIDo6R2V0VGVtcFBhdGhBKHNpemVvZih0ZW1wX2Rpcl9wYXRoKSwgdGVtcF9kaXJfcGF0aCk7CisgICAgY29uc3QgVUlOVCBzdWNjZXNzID0gOjpHZXRUZW1wRmlsZU5hbWVBKHRlbXBfZGlyX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndGVzdF9yZWRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBHZW5lcmF0ZSB1bmlxdWUgZmlsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2ZpbGVfcGF0aCk7CisgICAgR1RFU1RfQ0hFQ0tfKHN1Y2Nlc3MgIT0gMCkKKyAgICAgICAgPDwgIlVuYWJsZSB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBpbiAiIDw8IHRlbXBfZGlyX3BhdGg7CisgICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gY3JlYXQodGVtcF9maWxlX3BhdGgsIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKKyAgICBHVEVTVF9DSEVDS18oY2FwdHVyZWRfZmQgIT0gLTEpIDw8ICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZW1wX2ZpbGVfcGF0aDsKKyAgICBmaWxlbmFtZV8gPSB0ZW1wX2ZpbGVfcGF0aDsKKyNlbHNlCisgICAgLy8gVGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHRlc3QgaGFzIHdyaXRlIGFjY2VzcyB0byB0aGUKKyAgICAvLyBjdXJyZW50IGRpcmVjdG9yeSwgc28gd2UgY3JlYXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgL3RtcAorICAgIC8vIGRpcmVjdG9yeSBpbnN0ZWFkLgorICAgIGNoYXIgbmFtZV90ZW1wbGF0ZVtdID0gIi90bXAvY2FwdHVyZWRfc3RyZWFtLlhYWFhYWCI7CisgICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gbWtzdGVtcChuYW1lX3RlbXBsYXRlKTsKKyAgICBmaWxlbmFtZV8gPSBuYW1lX3RlbXBsYXRlOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgICAgZmZsdXNoKE5VTEwpOworICAgIGR1cDIoY2FwdHVyZWRfZmQsIGZkXyk7CisgICAgY2xvc2UoY2FwdHVyZWRfZmQpOworICB9CisKKyAgfkNhcHR1cmVkU3RyZWFtKCkgeworICAgIHJlbW92ZShmaWxlbmFtZV8uY19zdHIoKSk7CisgIH0KKworICBTdHJpbmcgR2V0Q2FwdHVyZWRTdHJpbmcoKSB7CisgICAgaWYgKHVuY2FwdHVyZWRfZmRfICE9IC0xKSB7CisgICAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyZWFtLgorICAgICAgZmZsdXNoKE5VTEwpOworICAgICAgZHVwMih1bmNhcHR1cmVkX2ZkXywgZmRfKTsKKyAgICAgIGNsb3NlKHVuY2FwdHVyZWRfZmRfKTsKKyAgICAgIHVuY2FwdHVyZWRfZmRfID0gLTE7CisgICAgfQorCisgICAgRklMRSogY29uc3QgZmlsZSA9IHBvc2l4OjpGT3BlbihmaWxlbmFtZV8uY19zdHIoKSwgInIiKTsKKyAgICBjb25zdCBTdHJpbmcgY29udGVudCA9IFJlYWRFbnRpcmVGaWxlKGZpbGUpOworICAgIHBvc2l4OjpGQ2xvc2UoZmlsZSk7CisgICAgcmV0dXJuIGNvbnRlbnQ7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFJlYWRzIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIGZpbGUgYXMgYSBTdHJpbmcuCisgIHN0YXRpYyBTdHJpbmcgUmVhZEVudGlyZUZpbGUoRklMRSogZmlsZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgZmlsZS4KKyAgc3RhdGljIHNpemVfdCBHZXRGaWxlU2l6ZShGSUxFKiBmaWxlKTsKKworICBjb25zdCBpbnQgZmRfOyAgLy8gQSBzdHJlYW0gdG8gY2FwdHVyZS4KKyAgaW50IHVuY2FwdHVyZWRfZmRfOworICAvLyBOYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSBob2xkaW5nIHRoZSBzdGRlcnIgb3V0cHV0LgorICA6OnN0ZDo6c3RyaW5nIGZpbGVuYW1lXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKENhcHR1cmVkU3RyZWFtKTsKK307CisKKy8vIFJldHVybnMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiBhIGZpbGUuCitzaXplX3QgQ2FwdHVyZWRTdHJlYW06OkdldEZpbGVTaXplKEZJTEUqIGZpbGUpIHsKKyAgZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihmdGVsbChmaWxlKSk7Cit9CisKKy8vIFJlYWRzIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIGZpbGUgYXMgYSBzdHJpbmcuCitTdHJpbmcgQ2FwdHVyZWRTdHJlYW06OlJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpIHsKKyAgY29uc3Qgc2l6ZV90IGZpbGVfc2l6ZSA9IEdldEZpbGVTaXplKGZpbGUpOworICBjaGFyKiBjb25zdCBidWZmZXIgPSBuZXcgY2hhcltmaWxlX3NpemVdOworCisgIHNpemVfdCBieXRlc19sYXN0X3JlYWQgPSAwOyAgLy8gIyBvZiBieXRlcyByZWFkIGluIHRoZSBsYXN0IGZyZWFkKCkKKyAgc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOyAgICAgICAvLyAjIG9mIGJ5dGVzIHJlYWQgc28gZmFyCisKKyAgZnNlZWsoZmlsZSwgMCwgU0VFS19TRVQpOworCisgIC8vIEtlZXBzIHJlYWRpbmcgdGhlIGZpbGUgdW50aWwgd2UgY2Fubm90IHJlYWQgZnVydGhlciBvciB0aGUKKyAgLy8gcHJlLWRldGVybWluZWQgZmlsZSBzaXplIGlzIHJlYWNoZWQuCisgIGRvIHsKKyAgICBieXRlc19sYXN0X3JlYWQgPSBmcmVhZChidWZmZXIrYnl0ZXNfcmVhZCwgMSwgZmlsZV9zaXplLWJ5dGVzX3JlYWQsIGZpbGUpOworICAgIGJ5dGVzX3JlYWQgKz0gYnl0ZXNfbGFzdF9yZWFkOworICB9IHdoaWxlIChieXRlc19sYXN0X3JlYWQgPiAwICYmIGJ5dGVzX3JlYWQgPCBmaWxlX3NpemUpOworCisgIGNvbnN0IFN0cmluZyBjb250ZW50KGJ1ZmZlciwgYnl0ZXNfcmVhZCk7CisgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICByZXR1cm4gY29udGVudDsKK30KKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmICAvLyBfTVNDX1ZFUgorCitzdGF0aWMgQ2FwdHVyZWRTdHJlYW0qIGdfY2FwdHVyZWRfc3RkZXJyID0gTlVMTDsKK3N0YXRpYyBDYXB0dXJlZFN0cmVhbSogZ19jYXB0dXJlZF9zdGRvdXQgPSBOVUxMOworCisvLyBTdGFydHMgY2FwdHVyaW5nIGFuIG91dHB1dCBzdHJlYW0gKHN0ZG91dC9zdGRlcnIpLgordm9pZCBDYXB0dXJlU3RyZWFtKGludCBmZCwgY29uc3QgY2hhciogc3RyZWFtX25hbWUsIENhcHR1cmVkU3RyZWFtKiogc3RyZWFtKSB7CisgIGlmICgqc3RyZWFtICE9IE5VTEwpIHsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiT25seSBvbmUgIiA8PCBzdHJlYW1fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY2FwdHVyZXIgY2FuIGV4aXN0IGF0IGEgdGltZS4iOworICB9CisgICpzdHJlYW0gPSBuZXcgQ2FwdHVyZWRTdHJlYW0oZmQpOworfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgdGhlIG91dHB1dCBzdHJlYW0gYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KK1N0cmluZyBHZXRDYXB0dXJlZFN0cmVhbShDYXB0dXJlZFN0cmVhbSoqIGNhcHR1cmVkX3N0cmVhbSkgeworICBjb25zdCBTdHJpbmcgY29udGVudCA9ICgqY2FwdHVyZWRfc3RyZWFtKS0+R2V0Q2FwdHVyZWRTdHJpbmcoKTsKKworICBkZWxldGUgKmNhcHR1cmVkX3N0cmVhbTsKKyAgKmNhcHR1cmVkX3N0cmVhbSA9IE5VTEw7CisKKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisKKy8vIFN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0Lgordm9pZCBDYXB0dXJlU3Rkb3V0KCkgeworICBDYXB0dXJlU3RyZWFtKGtTdGRPdXRGaWxlbm8sICJzdGRvdXQiLCAmZ19jYXB0dXJlZF9zdGRvdXQpOworfQorCisvLyBTdGFydHMgY2FwdHVyaW5nIHN0ZGVyci4KK3ZvaWQgQ2FwdHVyZVN0ZGVycigpIHsKKyAgQ2FwdHVyZVN0cmVhbShrU3RkRXJyRmlsZW5vLCAic3RkZXJyIiwgJmdfY2FwdHVyZWRfc3RkZXJyKTsKK30KKworLy8gU3RvcHMgY2FwdHVyaW5nIHN0ZG91dCBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorU3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCkgeyByZXR1cm4gR2V0Q2FwdHVyZWRTdHJlYW0oJmdfY2FwdHVyZWRfc3Rkb3V0KTsgfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitTdHJpbmcgR2V0Q2FwdHVyZWRTdGRlcnIoKSB7IHJldHVybiBHZXRDYXB0dXJlZFN0cmVhbSgmZ19jYXB0dXJlZF9zdGRlcnIpOyB9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTl8KKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEEgY29weSBvZiBhbGwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFNldCBieSBJbml0R29vZ2xlVGVzdCgpLgorOjpzdGQ6OnZlY3RvcjxTdHJpbmc+IGdfYXJndnM7CisKKy8vIFJldHVybnMgdGhlIGNvbW1hbmQgbGluZSBhcyBhIHZlY3RvciBvZiBzdHJpbmdzLgorY29uc3QgOjpzdGQ6OnZlY3RvcjxTdHJpbmc+JiBHZXRBcmd2cygpIHsgcmV0dXJuIGdfYXJndnM7IH0KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK25hbWVzcGFjZSBwb3NpeCB7Cit2b2lkIEFib3J0KCkgeworICBEZWJ1Z0JyZWFrKCk7CisgIFRlcm1pbmF0ZVByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgMSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgcG9zaXgKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUKKy8vIGdpdmVuIGZsYWcuICBGb3IgZXhhbXBsZSwgRmxhZ1RvRW52VmFyKCJmb28iKSB3aWxsIHJldHVybgorLy8gIkdURVNUX0ZPTyIgaW4gdGhlIG9wZW4tc291cmNlIHZlcnNpb24uCitzdGF0aWMgU3RyaW5nIEZsYWdUb0VudlZhcihjb25zdCBjaGFyKiBmbGFnKSB7CisgIGNvbnN0IFN0cmluZyBmdWxsX2ZsYWcgPQorICAgICAgKE1lc3NhZ2UoKSA8PCBHVEVTVF9GTEFHX1BSRUZJWF8gPDwgZmxhZykuR2V0U3RyaW5nKCk7CisKKyAgTWVzc2FnZSBlbnZfdmFyOworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBmdWxsX2ZsYWcubGVuZ3RoKCk7IGkrKykgeworICAgIGVudl92YXIgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4odG91cHBlcihmdWxsX2ZsYWcuY19zdHIoKVtpXSkpOworICB9CisKKyAgcmV0dXJuIGVudl92YXIuR2V0U3RyaW5nKCk7Cit9CisKKy8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMKKy8vIHRoZSByZXN1bHQgdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlCisvLyB1bmNoYW5nZWQgYW5kIHJldHVybnMgZmFsc2UuCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKSB7CisgIC8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgYSBkZWNpbWFsIGludGVnZXIuCisgIGNoYXIqIGVuZCA9IE5VTEw7CisgIGNvbnN0IGxvbmcgbG9uZ192YWx1ZSA9IHN0cnRvbChzdHIsICZlbmQsIDEwKTsgIC8vIE5PTElOVAorCisgIC8vIEhhcyBzdHJ0b2woKSBjb25zdW1lZCBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nPworICBpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgLy8gTm8gLSBhbiBpbnZhbGlkIGNoYXJhY3RlciB3YXMgZW5jb3VudGVyZWQuCisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0CisgICAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSAzMi1iaXQgaW50ZWdlciwgYnV0IGFjdHVhbGx5IgorICAgICAgICA8PCAiIGhhcyB2YWx1ZSBcIiIgPDwgc3RyIDw8ICJcIi5cbiI7CisgICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJcyB0aGUgcGFyc2VkIHZhbHVlIGluIHRoZSByYW5nZSBvZiBhbiBJbnQzMj8KKyAgY29uc3QgSW50MzIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50MzI+KGxvbmdfdmFsdWUpOworICBpZiAobG9uZ192YWx1ZSA9PSBMT05HX01BWCB8fCBsb25nX3ZhbHVlID09IExPTkdfTUlOIHx8CisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhIGxvbmcuICAoc3RydG9sKCkgcmV0dXJucworICAgICAgLy8gTE9OR19NQVggb3IgTE9OR19NSU4gd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzLikKKyAgICAgIHJlc3VsdCAhPSBsb25nX3ZhbHVlCisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KKyAgICAgICkgeworICAgIE1lc3NhZ2UgbXNnOworICAgIG1zZyA8PCAiV0FSTklORzogIiA8PCBzcmNfdGV4dAorICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSIKKyAgICAgICAgPDwgIiBoYXMgdmFsdWUgIiA8PCBzdHIgPDwgIiwgd2hpY2ggb3ZlcmZsb3dzLlxuIjsKKyAgICBwcmludGYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICp2YWx1ZSA9IHJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBCb29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KKy8vCisvLyBUaGUgdmFsdWUgaXMgY29uc2lkZXJlZCB0cnVlIGlmZiBpdCdzIG5vdCAiMCIuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IFN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOworICBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdfdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiBzdHJpbmdfdmFsdWUgPT0gTlVMTCA/CisgICAgICBkZWZhdWx0X3ZhbHVlIDogc3RyY21wKHN0cmluZ192YWx1ZSwgIjAiKSAhPSAwOworfQorCisvLyBSZWFkcyBhbmQgcmV0dXJucyBhIDMyLWJpdCBpbnRlZ2VyIHN0b3JlZCBpbiB0aGUgZW52aXJvbm1lbnQKKy8vIHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0IGlzbid0IHNldCBvcgorLy8gZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCAzMi1iaXQgaW50ZWdlciwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgorSW50MzIgSW50MzJGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgSW50MzIgZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBTdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOworICBpZiAoc3RyaW5nX3ZhbHVlID09IE5VTEwpIHsKKyAgICAvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldC4KKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorCisgIEludDMyIHJlc3VsdCA9IGRlZmF1bHRfdmFsdWU7CisgIGlmICghUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIkVudmlyb25tZW50IHZhcmlhYmxlICIgPDwgZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZSwgJnJlc3VsdCkpIHsKKyAgICBwcmludGYoIlRoZSBkZWZhdWx0IHZhbHVlICVzIGlzIHVzZWQuXG4iLAorICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGRlZmF1bHRfdmFsdWUpLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCisvLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCitjb25zdCBjaGFyKiBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBTdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiB2YWx1ZSA9PSBOVUxMID8gZGVmYXVsdF92YWx1ZSA6IHZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2d0ZXN0LXRlc3QtcGFydC5jYyBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDlhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2d0ZXN0LXRlc3QtcGFydC5jYwpAQCAtMCwwICsxLDExMCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC10ZXN0LXBhcnQuaD4KKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCit1c2luZyBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsOworCisvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UgYnkgb21pdHRpbmcgdGhlIHN0YWNrIHRyYWNlCisvLyBpbiBpdC4KK2ludGVybmFsOjpTdHJpbmcgVGVzdFBhcnRSZXN1bHQ6OkV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RhY2tfdHJhY2UgPSBzdHJzdHIobWVzc2FnZSwgaW50ZXJuYWw6OmtTdGFja1RyYWNlTWFya2VyKTsKKyAgcmV0dXJuIHN0YWNrX3RyYWNlID09IE5VTEwgPyBpbnRlcm5hbDo6U3RyaW5nKG1lc3NhZ2UpIDoKKyAgICAgIGludGVybmFsOjpTdHJpbmcobWVzc2FnZSwgc3RhY2tfdHJhY2UgLSBtZXNzYWdlKTsKK30KKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0Lgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgcmV0dXJuIG9zCisgICAgICA8PCByZXN1bHQuZmlsZV9uYW1lKCkgPDwgIjoiIDw8IHJlc3VsdC5saW5lX251bWJlcigpIDw8ICI6ICIKKyAgICAgIDw8IChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcyA/ICJTdWNjZXNzIiA6CisgICAgICAgICAgcmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/ICJGYXRhbCBmYWlsdXJlIiA6CisgICAgICAgICAgIk5vbi1mYXRhbCBmYWlsdXJlIikgPDwgIjpcbiIKKyAgICAgIDw8IHJlc3VsdC5tZXNzYWdlKCkgPDwgc3RkOjplbmRsOworfQorCisvLyBBcHBlbmRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGFycmF5Lgordm9pZCBUZXN0UGFydFJlc3VsdEFycmF5OjpBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICBhcnJheV8ucHVzaF9iYWNrKHJlc3VsdCk7Cit9CisKKy8vIFJldHVybnMgdGhlIFRlc3RQYXJ0UmVzdWx0IGF0IHRoZSBnaXZlbiBpbmRleCAoMC1iYXNlZCkuCitjb25zdCBUZXN0UGFydFJlc3VsdCYgVGVzdFBhcnRSZXN1bHRBcnJheTo6R2V0VGVzdFBhcnRSZXN1bHQoaW50IGluZGV4KSBjb25zdCB7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSgpKSB7CisgICAgcHJpbnRmKCJcbkludmFsaWQgaW5kZXggKCVkKSBpbnRvIFRlc3RQYXJ0UmVzdWx0QXJyYXkuXG4iLCBpbmRleCk7CisgICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOworICB9CisKKyAgcmV0dXJuIGFycmF5X1tpbmRleF07Cit9CisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzIGluIHRoZSBhcnJheS4KK2ludCBUZXN0UGFydFJlc3VsdEFycmF5OjpzaXplKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihhcnJheV8uc2l6ZSgpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKQorICAgIDogaGFzX25ld19mYXRhbF9mYWlsdXJlXyhmYWxzZSksCisgICAgICBvcmlnaW5hbF9yZXBvcnRlcl8oR2V0VW5pdFRlc3RJbXBsKCktPgorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCkpIHsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKHRoaXMpOworfQorCitIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6On5IYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKSB7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgKKyAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyk7Cit9CisKK3ZvaWQgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIGlmIChyZXN1bHQuZmF0YWxseV9mYWlsZWQoKSkKKyAgICBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfID0gdHJ1ZTsKKyAgb3JpZ2luYWxfcmVwb3J0ZXJfLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5jYyBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2M0YjVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9ndGVzdC10eXBlZC10ZXN0LmNjCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC10eXBlZC10ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGluIHN0ci4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgc3RyCisvLyBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KK3N0YXRpYyBjb25zdCBjaGFyKiBTa2lwU3BhY2VzKGNvbnN0IGNoYXIqIHN0cikgeworICB3aGlsZSAoaXNzcGFjZSgqc3RyKSkKKyAgICBzdHIrKzsKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gVmVyaWZpZXMgdGhhdCByZWdpc3RlcmVkX3Rlc3RzIG1hdGNoIHRoZSB0ZXN0IG5hbWVzIGluCisvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKy8vIGFib3J0cyB0aGUgcHJvZ3JhbSBvdGhlcndpc2UuCitjb25zdCBjaGFyKiBUeXBlZFRlc3RDYXNlUFN0YXRlOjpWZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKAorICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKSB7CisgIHR5cGVkZWYgOjpzdGQ6OnNldDxjb25zdCBjaGFyKj46OmNvbnN0X2l0ZXJhdG9yIERlZmluZWRUZXN0SXRlcjsKKyAgcmVnaXN0ZXJlZF8gPSB0cnVlOworCisgIC8vIFNraXAgaW5pdGlhbCB3aGl0ZXNwYWNlIGluIHJlZ2lzdGVyZWRfdGVzdHMgc2luY2Ugc29tZQorICAvLyBwcmVwcm9jZXNzb3JzIHByZWZpeCBzdHJpbmdpemllZCBsaXRlcmFscyB3aXRoIHdoaXRlc3BhY2UuCisgIHJlZ2lzdGVyZWRfdGVzdHMgPSBTa2lwU3BhY2VzKHJlZ2lzdGVyZWRfdGVzdHMpOworCisgIE1lc3NhZ2UgZXJyb3JzOworICA6OnN0ZDo6c2V0PFN0cmluZz4gdGVzdHM7CisgIGZvciAoY29uc3QgY2hhciogbmFtZXMgPSByZWdpc3RlcmVkX3Rlc3RzOyBuYW1lcyAhPSBOVUxMOworICAgICAgIG5hbWVzID0gU2tpcENvbW1hKG5hbWVzKSkgeworICAgIGNvbnN0IFN0cmluZyBuYW1lID0gR2V0UHJlZml4VW50aWxDb21tYShuYW1lcyk7CisgICAgaWYgKHRlc3RzLmNvdW50KG5hbWUpICE9IDApIHsKKyAgICAgIGVycm9ycyA8PCAiVGVzdCAiIDw8IG5hbWUgPDwgIiBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UuXG4iOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvciAoRGVmaW5lZFRlc3RJdGVyIGl0ID0gZGVmaW5lZF90ZXN0X25hbWVzXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gZGVmaW5lZF90ZXN0X25hbWVzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmIChuYW1lID09ICppdCkgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmb3VuZCkgeworICAgICAgdGVzdHMuaW5zZXJ0KG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBlcnJvcnMgPDwgIk5vIHRlc3QgbmFtZWQgIiA8PCBuYW1lCisgICAgICAgICAgICAgPDwgIiBjYW4gYmUgZm91bmQgaW4gdGhpcyB0ZXN0IGNhc2UuXG4iOworICAgIH0KKyAgfQorCisgIGZvciAoRGVmaW5lZFRlc3RJdGVyIGl0ID0gZGVmaW5lZF90ZXN0X25hbWVzXy5iZWdpbigpOworICAgICAgIGl0ICE9IGRlZmluZWRfdGVzdF9uYW1lc18uZW5kKCk7CisgICAgICAgKytpdCkgeworICAgIGlmICh0ZXN0cy5jb3VudCgqaXQpID09IDApIHsKKyAgICAgIGVycm9ycyA8PCAiWW91IGZvcmdvdCB0byBsaXN0IHRlc3QgIiA8PCAqaXQgPDwgIi5cbiI7CisgICAgfQorICB9CisKKyAgY29uc3QgU3RyaW5nJiBlcnJvcnNfc3RyID0gZXJyb3JzLkdldFN0cmluZygpOworICBpZiAoZXJyb3JzX3N0ciAhPSAiIikgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKKyAgICAgICAgICAgIGVycm9yc19zdHIuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgcG9zaXg6OkFib3J0KCk7CisgIH0KKworICByZXR1cm4gcmVnaXN0ZXJlZF90ZXN0czsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvZ3Rlc3QuY2MgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2d0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMmQ1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2d0ZXN0LmNjCkBAIC0wLDAgKzEsNDcwNCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0LXNwaS5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx3Y2hhci5oPgorI2luY2x1ZGUgPHdjdHlwZS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZiBHVEVTVF9PU19MSU5VWAorCisvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIGF1dG9jb25mIHRvIGRldGVjdCBhdmFpbGFiaWxpdHkgb2YKKy8vIGdldHRpbWVvZmRheSgpLgorI2RlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisvLyBEZWNsYXJlcyB2c25wcmludGYoKS4gIFRoaXMgaGVhZGVyIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNlbGlmIEdURVNUX09TX1NZTUJJQU4KKyNkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorI2luY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKworI2VsaWYgR1RFU1RfT1NfWk9TCisjZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKyNpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisKKy8vIE9uIHovT1Mgd2UgYWRkaXRpb25hbGx5IG5lZWQgc3RyaW5ncy5oIGZvciBzdHJjYXNlY21wLgorI2luY2x1ZGUgPHN0cmluZ3MuaD4gIC8vIE5PTElOVAorCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgQ0UuCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKworI2VsaWYgR1RFU1RfT1NfV0lORE9XUyAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgcHJvcGVyLgorCisjaW5jbHVkZSA8aW8uaD4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHN5cy90aW1lYi5oPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPiAgLy8gTk9MSU5UCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01JTkdXCisvLyBNaW5HVyBoYXMgZ2V0dGltZW9mZGF5KCkgYnV0IG5vdCBfZnRpbWU2NCgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyAgIGdldHRpbWVvZmRheSgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGdldCB0aGUgdGltZSBvbgorLy8gICBXaW5kb3dzLCBsaWtlIEdldFRpY2tDb3VudCgpIG9yIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCkuICBNaW5HVworLy8gICBzdXBwb3J0cyB0aGVzZS4gIGNvbnNpZGVyIHVzaW5nIHRoZW0gaW5zdGVhZC4KKyNkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorI2luY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NSU5HVworCisvLyBjcHBsaW50IHRoaW5rcyB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCwgc28gd2Ugd2FudCB0bworLy8gc2lsZW5jZSBpdC4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKworI2Vsc2UKKworLy8gQXNzdW1lIG90aGVyIHBsYXRmb3JtcyBoYXZlIGdldHRpbWVvZmRheSgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyAgIGdldHRpbWVvZmRheSgpLgorI2RlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisKKy8vIGNwcGxpbnQgdGhpbmtzIHRoYXQgdGhlIGhlYWRlciBpcyBhbHJlYWR5IGluY2x1ZGVkLCBzbyB3ZSB3YW50IHRvCisvLyBzaWxlbmNlIGl0LgorI2luY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVAorCisjZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNlbmRpZgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjaWYgR1RFU1RfT1NfV0lORE9XUworI2RlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordXNpbmcgaW50ZXJuYWw6OkNvdW50SWY7Cit1c2luZyBpbnRlcm5hbDo6Rm9yRWFjaDsKK3VzaW5nIGludGVybmFsOjpHZXRFbGVtZW50T3I7Cit1c2luZyBpbnRlcm5hbDo6U2h1ZmZsZTsKKworLy8gQ29uc3RhbnRzLgorCisvLyBBIHRlc3Qgd2hvc2UgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMKKy8vIGRpc2FibGVkIGFuZCBub3QgcnVuLgorc3RhdGljIGNvbnN0IGNoYXIga0Rpc2FibGVUZXN0RmlsdGVyW10gPSAiRElTQUJMRURfKjoqL0RJU0FCTEVEXyoiOworCisvLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMgY29uc2lkZXJlZCBhIGRlYXRoCisvLyB0ZXN0IGNhc2UgYW5kIHdpbGwgYmUgcnVuIGJlZm9yZSB0ZXN0IGNhc2VzIHdob3NlIG5hbWUgZG9lc24ndAorLy8gbWF0Y2ggdGhpcyBmaWx0ZXIuCitzdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0Q2FzZUZpbHRlcltdID0gIipEZWF0aFRlc3Q6KkRlYXRoVGVzdC8qIjsKKworLy8gQSB0ZXN0IGZpbHRlciB0aGF0IG1hdGNoZXMgZXZlcnl0aGluZy4KK3N0YXRpYyBjb25zdCBjaGFyIGtVbml2ZXJzYWxGaWx0ZXJbXSA9ICIqIjsKKworLy8gVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZm9yIFhNTCBvdXRwdXQuCitzdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdE91dHB1dEZpbGVbXSA9ICJ0ZXN0X2RldGFpbC54bWwiOworCisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgaW5kZXguCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkSW5kZXhbXSA9ICJHVEVTVF9TSEFSRF9JTkRFWCI7CisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0IHNoYXJkcy4KK3N0YXRpYyBjb25zdCBjaGFyIGtUZXN0VG90YWxTaGFyZHNbXSA9ICJHVEVTVF9UT1RBTF9TSEFSRFMiOworLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlLgorc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RTaGFyZFN0YXR1c0ZpbGVbXSA9ICJHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSI7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisvLyBzdGFjayB0cmFjZS4KK2NvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXSA9ICJcblN0YWNrIHRyYWNlOlxuIjsKKworLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcworLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitib29sIGdfaGVscF9mbGFnID0gZmFsc2U7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwgZmFsc2UpLAorICAgICJSdW4gZGlzYWJsZWQgdGVzdHMgdG9vLCBpbiBhZGRpdGlvbiB0byB0aGUgdGVzdHMgbm9ybWFsbHkgYmVpbmcgcnVuLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgYnJlYWtfb25fZmFpbHVyZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiYnJlYWtfb25fZmFpbHVyZSIsIGZhbHNlKSwKKyAgICAiVHJ1ZSBpZmYgYSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCBiZSBhIGRlYnVnZ2VyIGJyZWFrLXBvaW50LiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgY2F0Y2hfZXhjZXB0aW9ucywKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiY2F0Y2hfZXhjZXB0aW9ucyIsIGZhbHNlKSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXworICAgICIgc2hvdWxkIGNhdGNoIGV4Y2VwdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgdGVzdCBmYWlsdXJlcy4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgY29sb3IsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiY29sb3IiLCAiYXV0byIpLAorICAgICJXaGV0aGVyIHRvIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4gIFZhbGlkIHZhbHVlczogeWVzLCBubywgIgorICAgICJhbmQgYXV0by4gICdhdXRvJyBtZWFucyB0byB1c2UgY29sb3JzIGlmIHRoZSBvdXRwdXQgaXMgIgorICAgICJiZWluZyBzZW50IHRvIGEgdGVybWluYWwgYW5kIHRoZSBURVJNIGVudmlyb25tZW50IHZhcmlhYmxlICIKKyAgICAiaXMgc2V0IHRvIHh0ZXJtLCB4dGVybS1jb2xvciwgeHRlcm0tMjU2Y29sb3IsIGxpbnV4IG9yIGN5Z3dpbi4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgZmlsdGVyLAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoImZpbHRlciIsIGtVbml2ZXJzYWxGaWx0ZXIpLAorICAgICJBIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGdsb2IgKG5vdCByZWdleCkgcGF0dGVybnMgIgorICAgICJmb3IgZmlsdGVyaW5nIHRoZSB0ZXN0cyB0byBydW4sIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAiCisgICAgIictJyBhbmQgYSA6IHNlcGFyYXRlZCBsaXN0IG9mIG5lZ2F0aXZlIHBhdHRlcm5zICh0ZXN0cyB0byAiCisgICAgImV4Y2x1ZGUpLiAgQSB0ZXN0IGlzIHJ1biBpZiBpdCBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgIgorICAgICJwYXR0ZXJucyBhbmQgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKGxpc3RfdGVzdHMsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICJMaXN0IGFsbCB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcgdGhlbS4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgb3V0cHV0LAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoIm91dHB1dCIsICIiKSwKKyAgICAiQSBmb3JtYXQgKGN1cnJlbnRseSBtdXN0IGJlIFwieG1sXCIpLCBvcHRpb25hbGx5IGZvbGxvd2VkICIKKyAgICAiYnkgYSBjb2xvbiBhbmQgYW4gb3V0cHV0IGZpbGUgbmFtZSBvciBkaXJlY3RvcnkuIEEgZGlyZWN0b3J5ICIKKyAgICAiaXMgaW5kaWNhdGVkIGJ5IGEgdHJhaWxpbmcgcGF0aG5hbWUgc2VwYXJhdG9yLiAiCisgICAgIkV4YW1wbGVzOiBcInhtbDpmaWxlbmFtZS54bWxcIiwgXCJ4bWw6OmRpcmVjdG9yeW5hbWUvXCIuICIKKyAgICAiSWYgYSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLCBvdXRwdXQgZmlsZXMgd2lsbCBiZSBjcmVhdGVkICIKKyAgICAid2l0aGluIHRoYXQgZGlyZWN0b3J5LCB3aXRoIGZpbGUtbmFtZXMgYmFzZWQgb24gdGhlIHRlc3QgIgorICAgICJleGVjdXRhYmxlJ3MgbmFtZSBhbmQsIGlmIG5lY2Vzc2FyeSwgbWFkZSB1bmlxdWUgYnkgYWRkaW5nICIKKyAgICAiZGlnaXRzLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgcHJpbnRfdGltZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigicHJpbnRfdGltZSIsIHRydWUpLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCisgICAgIiBzaG91bGQgZGlzcGxheSBlbGFwc2VkIHRpbWUgaW4gdGV4dCBvdXRwdXQuIik7CisKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgcmFuZG9tX3NlZWQsCisgICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJyYW5kb21fc2VlZCIsIDApLAorICAgICJSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIHdoZW4gc2h1ZmZsaW5nIHRlc3Qgb3JkZXJzLiAgTXVzdCBiZSBpbiByYW5nZSAiCisgICAgIlsxLCA5OTk5OV0sIG9yIDAgdG8gdXNlIGEgc2VlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lLiIpOworCitHVEVTVF9ERUZJTkVfaW50MzJfKAorICAgIHJlcGVhdCwKKyAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInJlcGVhdCIsIDEpLAorICAgICJIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgZWFjaCB0ZXN0LiAgU3BlY2lmeSBhIG5lZ2F0aXZlIG51bWJlciAiCisgICAgImZvciByZXBlYXRpbmcgZm9yZXZlci4gIFVzZWZ1bCBmb3Igc2hha2luZyBvdXQgZmxha3kgdGVzdHMuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcywgZmFsc2UsCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8gIiBzaG91bGQgaW5jbHVkZSBpbnRlcm5hbCBzdGFjayBmcmFtZXMgd2hlbiAiCisgICAgInByaW50aW5nIHRlc3QgZmFpbHVyZSBzdGFjayB0cmFjZXMuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBzaHVmZmxlLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJzaHVmZmxlIiwgZmFsc2UpLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCisgICAgIiBzaG91bGQgcmFuZG9taXplIHRlc3RzJyBvcmRlciBvbiBldmVyeSBydW4uIik7CisKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgc3RhY2tfdHJhY2VfZGVwdGgsCisgICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJzdGFja190cmFjZV9kZXB0aCIsIGtNYXhTdGFja1RyYWNlRGVwdGgpLAorICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIHByaW50IHdoZW4gYW4gIgorICAgICJhc3NlcnRpb24gZmFpbHMuICBUaGUgdmFsaWQgcmFuZ2UgaXMgMCB0aHJvdWdoIDEwMCwgaW5jbHVzaXZlLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgdGhyb3dfb25fZmFpbHVyZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigidGhyb3dfb25fZmFpbHVyZSIsIGZhbHNlKSwKKyAgICAiV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCBhIGZhaWxlZCBhc3NlcnRpb24gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gIgorICAgICJpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkIG9yIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBhIG5vbi16ZXJvIGNvZGUgIgorICAgICJvdGhlcndpc2UuIik7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEdlbmVyYXRlcyBhIHJhbmRvbSBudW1iZXIgZnJvbSBbMCwgcmFuZ2UpLCB1c2luZyBhIExpbmVhcgorLy8gQ29uZ3J1ZW50aWFsIEdlbmVyYXRvciAoTENHKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcyAwIG9yIGdyZWF0ZXIKKy8vIHRoYW4ga01heFJhbmdlLgorVUludDMyIFJhbmRvbTo6R2VuZXJhdGUoVUludDMyIHJhbmdlKSB7CisgIC8vIFRoZXNlIGNvbnN0YW50cyBhcmUgdGhlIHNhbWUgYXMgYXJlIHVzZWQgaW4gZ2xpYmMncyByYW5kKDMpLgorICBzdGF0ZV8gPSAoMTEwMzUxNTI0NVUqc3RhdGVfICsgMTIzNDVVKSAlIGtNYXhSYW5nZTsKKworICBHVEVTVF9DSEVDS18ocmFuZ2UgPiAwKQorICAgICAgPDwgIkNhbm5vdCBnZW5lcmF0ZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIDApLiI7CisgIEdURVNUX0NIRUNLXyhyYW5nZSA8PSBrTWF4UmFuZ2UpCisgICAgICA8PCAiR2VuZXJhdGlvbiBvZiBhIG51bWJlciBpbiBbMCwgIiA8PCByYW5nZSA8PCAiKSB3YXMgcmVxdWVzdGVkLCAiCisgICAgICA8PCAiYnV0IHRoaXMgY2FuIG9ubHkgZ2VuZXJhdGUgbnVtYmVycyBpbiBbMCwgIiA8PCBrTWF4UmFuZ2UgPDwgIikuIjsKKworICAvLyBDb252ZXJ0aW5nIHZpYSBtb2R1bHVzIGludHJvZHVjZXMgYSBiaXQgb2YgZG93bndhcmQgYmlhcywgYnV0CisgIC8vIGl0J3Mgc2ltcGxlLCBhbmQgYSBsaW5lYXIgY29uZ3J1ZW50aWFsIGdlbmVyYXRvciBpc24ndCB0b28gZ29vZAorICAvLyB0byBiZWdpbiB3aXRoLgorICByZXR1cm4gc3RhdGVfICUgcmFuZ2U7Cit9CisKKy8vIEdUZXN0SXNJbml0aWFsaXplZCgpIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXIgaGFzIGluaXRpYWxpemVkCisvLyBHb29nbGUgVGVzdC4gIFVzZWZ1bCBmb3IgY2F0Y2hpbmcgdGhlIHVzZXIgbWlzdGFrZSBvZiBub3QgaW5pdGlhbGl6aW5nCisvLyBHb29nbGUgVGVzdCBiZWZvcmUgY2FsbGluZyBSVU5fQUxMX1RFU1RTKCkuCisvLworLy8gQSB1c2VyIG11c3QgY2FsbCB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpIHRvIGluaXRpYWxpemUgR29vZ2xlCisvLyBUZXN0LiAgZ19pbml0X2d0ZXN0X2NvdW50IGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHRpbWVzCisvLyBJbml0R29vZ2xlVGVzdCgpIGhhcyBiZWVuIGNhbGxlZC4gIFdlIGRvbid0IHByb3RlY3QgdGhpcyB2YXJpYWJsZQorLy8gdW5kZXIgYSBtdXRleCBhcyBpdCBpcyBvbmx5IGFjY2Vzc2VkIGluIHRoZSBtYWluIHRocmVhZC4KK2ludCBnX2luaXRfZ3Rlc3RfY291bnQgPSAwOworc3RhdGljIGJvb2wgR1Rlc3RJc0luaXRpYWxpemVkKCkgeyByZXR1cm4gZ19pbml0X2d0ZXN0X2NvdW50ICE9IDA7IH0KKworLy8gSXRlcmF0ZXMgb3ZlciBhIHZlY3RvciBvZiBUZXN0Q2FzZXMsIGtlZXBpbmcgYSBydW5uaW5nIHN1bSBvZiB0aGUKKy8vIHJlc3VsdHMgb2YgY2FsbGluZyBhIGdpdmVuIGludC1yZXR1cm5pbmcgbWV0aG9kIG9uIGVhY2guCisvLyBSZXR1cm5zIHRoZSBzdW0uCitzdGF0aWMgaW50IFN1bU92ZXJUZXN0Q2FzZUxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiYgY2FzZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoVGVzdENhc2U6OiptZXRob2QpKCkgY29uc3QpIHsKKyAgaW50IHN1bSA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FzZV9saXN0LnNpemUoKTsgaSsrKSB7CisgICAgc3VtICs9IChjYXNlX2xpc3RbaV0tPiptZXRob2QpKCk7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIHBhc3NlZC4KK3N0YXRpYyBib29sIFRlc3RDYXNlUGFzc2VkKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpICYmIHRlc3RfY2FzZS0+UGFzc2VkKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBmYWlsZWQuCitzdGF0aWMgYm9vbCBUZXN0Q2FzZUZhaWxlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPkZhaWxlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3RfY2FzZSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGVzdCB0aGF0IHNob3VsZAorLy8gcnVuLgorc3RhdGljIGJvb2wgU2hvdWxkUnVuVGVzdENhc2UoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCk7Cit9CisKKy8vIEFzc2VydEhlbHBlciBjb25zdHJ1Y3Rvci4KK0Fzc2VydEhlbHBlcjo6QXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKQorICAgIDogZGF0YV8obmV3IEFzc2VydEhlbHBlckRhdGEodHlwZSwgZmlsZSwgbGluZSwgbWVzc2FnZSkpIHsKK30KKworQXNzZXJ0SGVscGVyOjp+QXNzZXJ0SGVscGVyKCkgeworICBkZWxldGUgZGF0YV87Cit9CisKKy8vIE1lc3NhZ2UgYXNzaWdubWVudCwgZm9yIGFzc2VydGlvbiBzdHJlYW1pbmcgc3VwcG9ydC4KK3ZvaWQgQXNzZXJ0SGVscGVyOjpvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+CisgICAgQWRkVGVzdFBhcnRSZXN1bHQoZGF0YV8tPnR5cGUsIGRhdGFfLT5maWxlLCBkYXRhXy0+bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRVc2VyTWVzc2FnZShkYXRhXy0+bWVzc2FnZSwgbWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKQorICAgICAgICAgICAgICAgICAgICAgIC0+Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKQorICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzIHRoZSBzdGFjayBmcmFtZSBmb3IgdGhpcyBmdW5jdGlvbiBpdHNlbGYuCisgICAgICAgICAgICAgICAgICAgICAgKTsgIC8vIE5PTElOVAorfQorCisvLyBNdXRleCBmb3IgbGlua2VkIHBvaW50ZXJzLgorR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsKKworLy8gQXBwbGljYXRpb24gcGF0aG5hbWUgZ290dGVuIGluIEluaXRHb29nbGVUZXN0LgorU3RyaW5nIGdfZXhlY3V0YWJsZV9wYXRoOworCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uJ3MgbmFtZSwgcmVtb3ZpbmcgZGlyZWN0b3J5IHBhdGggaWYgdGhhdAorLy8gaXMgcHJlc2VudC4KK0ZpbGVQYXRoIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpIHsKKyAgRmlsZVBhdGggcmVzdWx0OworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICByZXN1bHQuU2V0KEZpbGVQYXRoKGdfZXhlY3V0YWJsZV9wYXRoKS5SZW1vdmVFeHRlbnNpb24oImV4ZSIpKTsKKyNlbHNlCisgIHJlc3VsdC5TZXQoRmlsZVBhdGgoZ19leGVjdXRhYmxlX3BhdGgpKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIHJldHVybiByZXN1bHQuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpOworfQorCisvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X291dHB1dCBmbGFnLgorCisvLyBSZXR1cm5zIHRoZSBvdXRwdXQgZm9ybWF0LCBvciAiIiBmb3Igbm9ybWFsIHByaW50ZWQgb3V0cHV0LgorU3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOworICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkgcmV0dXJuIFN0cmluZygiIik7CisKKyAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7CisgIHJldHVybiAoY29sb24gPT0gTlVMTCkgPworICAgICAgU3RyaW5nKGd0ZXN0X291dHB1dF9mbGFnKSA6CisgICAgICBTdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcsIGNvbG9uIC0gZ3Rlc3Rfb3V0cHV0X2ZsYWcpOworfQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZSBkZWZhdWx0IGlmIG5vbmUKKy8vIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KK1N0cmluZyBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3Rfb3V0cHV0X2ZsYWcgPSBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKTsKKyAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpCisgICAgcmV0dXJuIFN0cmluZygiIik7CisKKyAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7CisgIGlmIChjb2xvbiA9PSBOVUxMKQorICAgIHJldHVybiBTdHJpbmcoaW50ZXJuYWw6OkZpbGVQYXRoOjpDb25jYXRQYXRocygKKyAgICAgICAgICAgICAgIGludGVybmFsOjpGaWxlUGF0aCgKKyAgICAgICAgICAgICAgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCisgICAgICAgICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoa0RlZmF1bHRPdXRwdXRGaWxlKSkuVG9TdHJpbmcoKSApOworCisgIGludGVybmFsOjpGaWxlUGF0aCBvdXRwdXRfbmFtZShjb2xvbiArIDEpOworICBpZiAoIW91dHB1dF9uYW1lLklzQWJzb2x1dGVQYXRoKCkpCisgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG9uIFdpbmRvd3MgXHNvbWVccGF0aCBpcyBub3QgYW4gYWJzb2x1dGUKKyAgICAvLyBwYXRoIChhcyBpdHMgbWVhbmluZyBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGRyaXZlKSwgeWV0IHRoZQorICAgIC8vIGZvbGxvd2luZyBsb2dpYyBmb3IgdHVybmluZyBpdCBpbnRvIGFuIGFic29sdXRlIHBhdGggaXMgd3JvbmcuCisgICAgLy8gRml4IGl0LgorICAgIG91dHB1dF9uYW1lID0gaW50ZXJuYWw6OkZpbGVQYXRoOjpDb25jYXRQYXRocygKKyAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpKSwKKyAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKGNvbG9uICsgMSkpOworCisgIGlmICghb3V0cHV0X25hbWUuSXNEaXJlY3RvcnkoKSkKKyAgICByZXR1cm4gb3V0cHV0X25hbWUuVG9TdHJpbmcoKTsKKworICBpbnRlcm5hbDo6RmlsZVBhdGggcmVzdWx0KGludGVybmFsOjpGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZSgKKyAgICAgIG91dHB1dF9uYW1lLCBpbnRlcm5hbDo6R2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCksCisgICAgICBHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKSk7CisgIHJldHVybiByZXN1bHQuVG9TdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKKy8vIGZpcnN0ICc6JyBvciAnXDAnIGNoYXJhY3RlciBpbiBwYXR0ZXJuIG1hcmtzIHRoZSBlbmQgb2YgaXQuCisvLworLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCisvLyB3b3JrcyB3ZWxsIGVub3VnaCBmb3IgbWF0Y2hpbmcgdGVzdCBuYW1lcywgd2hpY2ggYXJlIHNob3J0LgorYm9vbCBVbml0VGVzdE9wdGlvbnM6OlBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyKSB7CisgIHN3aXRjaCAoKnBhdHRlcm4pIHsKKyAgICBjYXNlICdcMCc6CisgICAgY2FzZSAnOic6ICAvLyBFaXRoZXIgJzonIG9yICdcMCcgbWFya3MgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4KKyAgICAgIHJldHVybiAqc3RyID09ICdcMCc7CisgICAgY2FzZSAnPyc6ICAvLyBNYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAgcmV0dXJuICpzdHIgIT0gJ1wwJyAmJiBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgICAgY2FzZSAnKic6ICAvLyBNYXRjaGVzIGFueSBzdHJpbmcgKHBvc3NpYmx5IGVtcHR5KSBvZiBjaGFyYWN0ZXJzLgorICAgICAgcmV0dXJuICgqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiwgc3RyICsgMSkpIHx8CisgICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0cik7CisgICAgZGVmYXVsdDogIC8vIE5vbi1zcGVjaWFsIGNoYXJhY3Rlci4gIE1hdGNoZXMgaXRzZWxmLgorICAgICAgcmV0dXJuICpwYXR0ZXJuID09ICpzdHIgJiYKKyAgICAgICAgICBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgIH0KK30KKworYm9vbCBVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpIHsKKyAgY29uc3QgY2hhciAqY3VyX3BhdHRlcm4gPSBmaWx0ZXI7CisgIGZvciAoOzspIHsKKyAgICBpZiAoUGF0dGVybk1hdGNoZXNTdHJpbmcoY3VyX3BhdHRlcm4sIG5hbWUuY19zdHIoKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZpbmRzIHRoZSBuZXh0IHBhdHRlcm4gaW4gdGhlIGZpbHRlci4KKyAgICBjdXJfcGF0dGVybiA9IHN0cmNocihjdXJfcGF0dGVybiwgJzonKTsKKworICAgIC8vIFJldHVybnMgaWYgbm8gbW9yZSBwYXR0ZXJuIGNhbiBiZSBmb3VuZC4KKyAgICBpZiAoY3VyX3BhdHRlcm4gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNraXBzIHRoZSBwYXR0ZXJuIHNlcGFyYXRlciAodGhlICc6JyBjaGFyYWN0ZXIpLgorICAgIGN1cl9wYXR0ZXJuKys7CisgIH0KK30KKworLy8gVE9ETyhrZWl0aHJheSk6IG1vdmUgU3RyaW5nIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyB0byBndGVzdC1zdHJpbmcuY2MuCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBtYXRjaGVzIHRoZSB0ZXN0IGNhc2UKKy8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCitib29sIFVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QoY29uc3QgU3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcgJnRlc3RfbmFtZSkgeworICBjb25zdCBTdHJpbmcmIGZ1bGxfbmFtZSA9IFN0cmluZzo6Rm9ybWF0KCIlcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jYXNlX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUuY19zdHIoKSk7CisKKyAgLy8gU3BsaXQgLS1ndGVzdF9maWx0ZXIgYXQgJy0nLCBpZiB0aGVyZSBpcyBvbmUsIHRvIHNlcGFyYXRlIGludG8KKyAgLy8gcG9zaXRpdmUgZmlsdGVyIGFuZCBuZWdhdGl2ZSBmaWx0ZXIgcG9ydGlvbnMKKyAgY29uc3QgY2hhciogY29uc3QgcCA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOworICBjb25zdCBjaGFyKiBjb25zdCBkYXNoID0gc3RyY2hyKHAsICctJyk7CisgIFN0cmluZyBwb3NpdGl2ZTsKKyAgU3RyaW5nIG5lZ2F0aXZlOworICBpZiAoZGFzaCA9PSBOVUxMKSB7CisgICAgcG9zaXRpdmUgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsgIC8vIFdob2xlIHN0cmluZyBpcyBhIHBvc2l0aXZlIGZpbHRlcgorICAgIG5lZ2F0aXZlID0gU3RyaW5nKCIiKTsKKyAgfSBlbHNlIHsKKyAgICBwb3NpdGl2ZSA9IFN0cmluZyhwLCBkYXNoIC0gcCk7ICAvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBkYXNoCisgICAgbmVnYXRpdmUgPSBTdHJpbmcoZGFzaCsxKTsgICAgICAgLy8gRXZlcnl0aGluZyBhZnRlciB0aGUgZGFzaAorICAgIGlmIChwb3NpdGl2ZS5lbXB0eSgpKSB7CisgICAgICAvLyBUcmVhdCAnLXRlc3QxJyBhcyB0aGUgc2FtZSBhcyAnKi10ZXN0MScKKyAgICAgIHBvc2l0aXZlID0ga1VuaXZlcnNhbEZpbHRlcjsKKyAgICB9CisgIH0KKworICAvLyBBIGZpbHRlciBpcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zLiAgSXQgbWF0Y2hlcyBhCisgIC8vIHRlc3QgaWYgYW55IHBhdHRlcm4gaW4gaXQgbWF0Y2hlcyB0aGUgdGVzdC4KKyAgcmV0dXJuIChNYXRjaGVzRmlsdGVyKGZ1bGxfbmFtZSwgcG9zaXRpdmUuY19zdHIoKSkgJiYKKyAgICAgICAgICAhTWF0Y2hlc0ZpbHRlcihmdWxsX25hbWUsIG5lZ2F0aXZlLmNfc3RyKCkpKTsKK30KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKy8vIFJldHVybnMgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiBpZiBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIHRoZQorLy8gZ2l2ZW4gU0VIIGV4Y2VwdGlvbiwgb3IgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCBvdGhlcndpc2UuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhcyBhbiBfX2V4Y2VwdCBjb25kaXRpb24uCitpbnQgVW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpIHsKKyAgLy8gR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSBhbiBleGNlcHRpb24gaWY6CisgIC8vICAgMS4gdGhlIHVzZXIgd2FudHMgaXQgdG8sIEFORAorICAvLyAgIDIuIHRoaXMgaXMgbm90IGEgYnJlYWtwb2ludCBleGNlcHRpb24uCisgIHJldHVybiAoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSAmJgorICAgICAgICAgIGV4Y2VwdGlvbl9jb2RlICE9IEVYQ0VQVElPTl9CUkVBS1BPSU5UKSA/CisgICAgICBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIDoKKyAgICAgIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorLy8gcmVzdWx0cy4gSW50ZXJjZXB0cyBvbmx5IGZhaWx1cmVzIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkLgorU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCkKKyAgICA6IGludGVyY2VwdF9tb2RlXyhJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCksCisgICAgICByZXN1bHRfKHJlc3VsdCkgeworICBJbml0KCk7Cit9CisKKy8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorLy8gcmVzdWx0cy4KK1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICBJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlLCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpCisgICAgOiBpbnRlcmNlcHRfbW9kZV8oaW50ZXJjZXB0X21vZGUpLAorICAgICAgcmVzdWx0XyhyZXN1bHQpIHsKKyAgSW5pdCgpOworfQorCit2b2lkIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJbml0KCkgeworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpZiAoaW50ZXJjZXB0X21vZGVfID09IElOVEVSQ0VQVF9BTExfVEhSRUFEUykgeworICAgIG9sZF9yZXBvcnRlcl8gPSBpbXBsLT5HZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7CisgICAgaW1wbC0+U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcih0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBvbGRfcmVwb3J0ZXJfID0gaW1wbC0+R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKTsKKyAgICBpbXBsLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCh0aGlzKTsKKyAgfQorfQorCisvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieSBHb29nbGUgVGVzdAorLy8gYmVmb3JlLgorU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6On5TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpIHsKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaWYgKGludGVyY2VwdF9tb2RlXyA9PSBJTlRFUkNFUFRfQUxMX1RIUkVBRFMpIHsKKyAgICBpbXBsLT5TZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKG9sZF9yZXBvcnRlcl8pOworICB9IGVsc2UgeworICAgIGltcGwtPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKG9sZF9yZXBvcnRlcl8pOworICB9Cit9CisKKy8vIEluY3JlbWVudHMgdGhlIHRlc3QgcGFydCByZXN1bHQgY291bnQgYW5kIHJlbWVtYmVycyB0aGUgcmVzdWx0LgorLy8gVGhpcyBtZXRob2QgaXMgZnJvbSB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSBpbnRlcmZhY2UuCit2b2lkIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJlc3VsdF8tPkFwcGVuZChyZXN1bHQpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBSZXR1cm5zIHRoZSB0eXBlIElEIG9mIDo6dGVzdGluZzo6VGVzdC4gIFdlIHNob3VsZCBhbHdheXMgY2FsbCB0aGlzCisvLyBpbnN0ZWFkIG9mIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIGdldCB0aGUgdHlwZSBJRCBvZgorLy8gdGVzdGluZzo6VGVzdC4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgYSBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuCisvLyB1c2luZyBHb29nbGUgVGVzdCBhcyBhIGZyYW1ld29yayBvbiBNYWMgT1MgWC4gIFRoZSBidWcgY2F1c2VzCisvLyBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcKKy8vIG9uIHdoZXRoZXIgdGhlIGNhbGwgaXMgZnJvbSB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrIGl0c2VsZiBvcgorLy8gZnJvbSB1c2VyIHRlc3QgY29kZS4gIEdldFRlc3RUeXBlSWQoKSBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cworLy8gcmV0dXJuIHRoZSBzYW1lIHZhbHVlLCBhcyBpdCBhbHdheXMgY2FsbHMgR2V0VHlwZUlkPD4oKSBmcm9tIHRoZQorLy8gZ3Rlc3QuY2MsIHdoaWNoIGlzIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrLgorVHlwZUlkIEdldFRlc3RUeXBlSWQoKSB7CisgIHJldHVybiBHZXRUeXBlSWQ8VGVzdD4oKTsKK30KKworLy8gVGhlIHZhbHVlIG9mIEdldFRlc3RUeXBlSWQoKSBhcyBzZWVuIGZyb20gd2l0aGluIHRoZSBHb29nbGUgVGVzdAorLy8gbGlicmFyeS4gIFRoaXMgaXMgc29sZWx5IGZvciB0ZXN0aW5nIEdldFRlc3RUeXBlSWQoKS4KK2NvbnN0IFR5cGVJZCBrVGVzdFR5cGVJZEluR29vZ2xlVGVzdCA9IEdldFRlc3RUeXBlSWQoKTsKKworLy8gVGhpcyBwcmVkaWNhdGUtZm9ybWF0dGVyIGNoZWNrcyB0aGF0ICdyZXN1bHRzJyBjb250YWlucyBhIHRlc3QgcGFydAorLy8gZmFpbHVyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgdGhhdCB0aGUgZmFpbHVyZSBtZXNzYWdlIGNvbnRhaW5zIHRoZQorLy8gZ2l2ZW4gc3Vic3RyaW5nLgorQXNzZXJ0aW9uUmVzdWx0IEhhc09uZUZhaWx1cmUoY29uc3QgY2hhciogLyogcmVzdWx0c19leHByICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogdHlwZV9leHByICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogc3Vic3RyX2V4cHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5JiByZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YnN0cikgeworICBjb25zdCBTdHJpbmcgZXhwZWN0ZWQodHlwZSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBmYXRhbCBmYWlsdXJlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBub24tZmF0YWwgZmFpbHVyZSIpOworICBNZXNzYWdlIG1zZzsKKyAgaWYgKHJlc3VsdHMuc2l6ZSgpICE9IDEpIHsKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKKyAgICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IHJlc3VsdHMuc2l6ZSgpIDw8ICIgZmFpbHVyZXMiOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgeworICAgICAgbXNnIDw8ICJcbiIgPDwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdChpKTsKKyAgICB9CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKKyAgfQorCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByID0gcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKTsKKyAgaWYgKHIudHlwZSgpICE9IHR5cGUpIHsKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKKyAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICA8PCByOworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7CisgIH0KKworICBpZiAoc3Ryc3RyKHIubWVzc2FnZSgpLCBzdWJzdHIpID09IE5VTEwpIHsKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgY29udGFpbmluZyBcIiIKKyAgICAgICAgPDwgc3Vic3RyIDw8ICJcIlxuIgorICAgICAgICA8PCAiICBBY3R1YWw6XG4iCisgICAgICAgIDw8IHI7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKKyAgfQorCisgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Cit9CisKKy8vIFRoZSBjb25zdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciByZW1lbWJlcnMgd2hlcmUgdG8gbG9vayB1cAorLy8gdGVzdCBwYXJ0IHJlc3VsdHMsIHdoYXQgdHlwZSBvZiBmYWlsdXJlIHdlIGV4cGVjdCwgYW5kIHdoYXQKKy8vIHN1YnN0cmluZyB0aGUgZmFpbHVyZSBtZXNzYWdlIHNob3VsZCBjb250YWluLgorU2luZ2xlRmFpbHVyZUNoZWNrZXI6OiBTaW5nbGVGYWlsdXJlQ2hlY2tlcigKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgY29uc3QgY2hhciogc3Vic3RyKQorICAgIDogcmVzdWx0c18ocmVzdWx0cyksCisgICAgICB0eXBlXyh0eXBlKSwKKyAgICAgIHN1YnN0cl8oc3Vic3RyKSB7fQorCisvLyBUaGUgZGVzdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgorLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyBleGFjdGx5IG9uZSBmYWlsdXJlIHRoYXQgaGFzIHRoZSBnaXZlbgorLy8gdHlwZSBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIGEKKy8vIG5vbi1mYXRhbCBmYWlsdXJlIHdpbGwgYmUgZ2VuZXJhdGVkLgorU2luZ2xlRmFpbHVyZUNoZWNrZXI6On5TaW5nbGVGYWlsdXJlQ2hlY2tlcigpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMyhIYXNPbmVGYWlsdXJlLCAqcmVzdWx0c18sIHR5cGVfLCBzdWJzdHJfLmNfc3RyKCkpOworfQorCitEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5BZGRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworICB1bml0X3Rlc3RfLT5saXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKS0+T25UZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCitEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCisvLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK1Rlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCitVbml0VGVzdEltcGw6OkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgcmV0dXJuIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOworfQorCisvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8gPSByZXBvcnRlcjsKK30KKworLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSoKK1VuaXRUZXN0SW1wbDo6R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSB7CisgIHJldHVybiBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLmdldCgpOworfQorCisvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpIHsKKyAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5zZXQocmVwb3J0ZXIpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZVBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZUZhaWxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9jYXNlc18sIFNob3VsZFJ1blRlc3RDYXNlKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRvdGFsX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRlc3RfdG9fcnVuX2NvdW50KTsKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhIFN0cmluZy4KKy8vCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKy8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAorLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKy8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisvLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KK1N0cmluZyBVbml0VGVzdEltcGw6OkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIHsKKyAgKHZvaWQpc2tpcF9jb3VudDsKKyAgcmV0dXJuIFN0cmluZygiIik7Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCitUaW1lSW5NaWxsaXMgR2V0VGltZUluTWlsbGlzKCkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBEaWZmZXJlbmNlIGJldHdlZW4gMTk3MC0wMS0wMSBhbmQgMTYwMS0wMS0wMSBpbiBtaWxsaXNlY29uZHMuCisgIC8vIGh0dHA6Ly9hbmFsb2dvdXMuYmxvZ3Nwb3QuY29tLzIwMDUvMDQvZXBvY2guaHRtbAorICBjb25zdCBUaW1lSW5NaWxsaXMga0phdmFFcG9jaFRvV2luRmlsZVRpbWVEZWx0YSA9CisgICAgc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPigxMTY0NDQ3MzZVTCkgKiAxMDAwMDBVTDsKKyAgY29uc3QgRFdPUkQga1RlbnRoTWljcm9zSW5NaWxsaVNlY29uZCA9IDEwMDAwOworCisgIFNZU1RFTVRJTUUgbm93X3N5c3RpbWU7CisgIEZJTEVUSU1FIG5vd19maWxldGltZTsKKyAgVUxBUkdFX0lOVEVHRVIgbm93X2ludDY0OworICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogU2hvdWxkbid0IHRoaXMganVzdCB1c2UKKyAgLy8gICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpPworICBHZXRTeXN0ZW1UaW1lKCZub3dfc3lzdGltZSk7CisgIGlmIChTeXN0ZW1UaW1lVG9GaWxlVGltZSgmbm93X3N5c3RpbWUsICZub3dfZmlsZXRpbWUpKSB7CisgICAgbm93X2ludDY0Lkxvd1BhcnQgPSBub3dfZmlsZXRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICBub3dfaW50NjQuSGlnaFBhcnQgPSBub3dfZmlsZXRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgbm93X2ludDY0LlF1YWRQYXJ0ID0gKG5vd19pbnQ2NC5RdWFkUGFydCAvIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQpIC0KKyAgICAgIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGE7CisgICAgcmV0dXJuIG5vd19pbnQ2NC5RdWFkUGFydDsKKyAgfQorICByZXR1cm4gMDsKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCisgIF9fdGltZWI2NCBub3c7CisjaWZkZWYgX01TQ19WRVIKKyAgLy8gTVNWQyA4IGRlcHJlY2F0ZXMgX2Z0aW1lNjQoKSwgc28gd2Ugd2FudCB0byBzdXBwcmVzcyB3YXJuaW5nIDQ5OTYKKyAgLy8gKGRlcHJlY2F0ZWQgZnVuY3Rpb24pIHRoZXJlLgorICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIEdldFRpY2tDb3VudCgpPyAgT3IgdXNlCisgIC8vICAgU3lzdGVtVGltZVRvRmlsZVRpbWUoKQorI3ByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0OTk2LgorICBfZnRpbWU2NCgmbm93KTsKKyNwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbHNlCisgIF9mdGltZTY0KCZub3cpOworI2VuZGlmICAvLyBfTVNDX1ZFUgorICByZXR1cm4gc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPihub3cudGltZSkgKiAxMDAwICsgbm93Lm1pbGxpdG07CisjZWxpZiBHVEVTVF9IQVNfR0VUVElNRU9GREFZXworICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgIGdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4obm93LnR2X3NlYykgKiAxMDAwICsgbm93LnR2X3VzZWMgLyAxMDAwOworI2Vsc2UKKyNlcnJvciAiRG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgb24geW91ciBzeXN0ZW0uIgorI2VuZGlmCit9CisKKy8vIFV0aWxpdGllcworCisvLyBjbGFzcyBTdHJpbmcKKworLy8gUmV0dXJucyB0aGUgaW5wdXQgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyBpZiBpdCdzIG5vdCBOVUxMOworLy8gb3RoZXJ3aXNlIHJldHVybnMgIihudWxsKSIuICBGb3IgZXhhbXBsZSwgIlwiSGVsbG9cIiIgaXMgcmV0dXJuZWQKKy8vIGZvciBpbnB1dCAiSGVsbG8iLgorLy8KKy8vIFRoaXMgaXMgdXNlZnVsIGZvciBwcmludGluZyBhIEMgc3RyaW5nIGluIHRoZSBzeW50YXggb2YgYSBsaXRlcmFsLgorLy8KKy8vIEtub3duIGlzc3VlOiBlc2NhcGUgc2VxdWVuY2VzIGFyZSBub3QgaGFuZGxlZCB5ZXQuCitTdHJpbmcgU3RyaW5nOjpTaG93Q1N0cmluZ1F1b3RlZChjb25zdCBjaGFyKiBjX3N0cikgeworICByZXR1cm4gY19zdHIgPyBTdHJpbmc6OkZvcm1hdCgiXCIlc1wiIiwgY19zdHIpIDogU3RyaW5nKCIobnVsbCkiKTsKK30KKworLy8gQ29waWVzIGF0IG1vc3QgbGVuZ3RoIGNoYXJhY3RlcnMgZnJvbSBzdHIgaW50byBhIG5ld2x5LWFsbG9jYXRlZAorLy8gcGllY2Ugb2YgbWVtb3J5IG9mIHNpemUgbGVuZ3RoKzEuICBUaGUgbWVtb3J5IGlzIGFsbG9jYXRlZCB3aXRoIG5ld1tdLgorLy8gQSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUgaXMgd3JpdHRlbiB0byB0aGUgbWVtb3J5LCBhbmQgYSBwb2ludGVyIHRvIGl0CisvLyBpcyByZXR1cm5lZC4gIElmIHN0ciBpcyBOVUxMLCBOVUxMIGlzIHJldHVybmVkLgorc3RhdGljIGNoYXIqIENsb25lU3RyaW5nKGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IGxlbmd0aCkgeworICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBjaGFyKiBjb25zdCBjbG9uZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdOworICAgIHBvc2l4OjpTdHJOQ3B5KGNsb25lLCBzdHIsIGxlbmd0aCk7CisgICAgY2xvbmVbbGVuZ3RoXSA9ICdcMCc7CisgICAgcmV0dXJuIGNsb25lOworICB9Cit9CisKKy8vIENsb25lcyBhIDAtdGVybWluYXRlZCBDIHN0cmluZywgYWxsb2NhdGluZyBtZW1vcnkgdXNpbmcgbmV3LiAgVGhlCisvLyBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nW10gdGhlIHJldHVybiB2YWx1ZS4gIFJldHVybnMgdGhlCisvLyBjbG9uZWQgc3RyaW5nLCBvciBOVUxMIGlmIHRoZSBpbnB1dCBpcyBOVUxMLgorY29uc3QgY2hhciAqIFN0cmluZzo6Q2xvbmVDU3RyaW5nKGNvbnN0IGNoYXIqIGNfc3RyKSB7CisgIHJldHVybiAoY19zdHIgPT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICBOVUxMIDogQ2xvbmVTdHJpbmcoY19zdHIsIHN0cmxlbihjX3N0cikpOworfQorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIENyZWF0ZXMgYSBVVEYtMTYgd2lkZSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gQU5TSSBzdHJpbmcsIGFsbG9jYXRpbmcKKy8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKy8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSB3aWRlIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKy8vIGlucHV0IGlzIE5VTEwuCitMUENXU1RSIFN0cmluZzo6QW5zaVRvVXRmMTYoY29uc3QgY2hhciogYW5zaSkgeworICBpZiAoIWFuc2kpIHJldHVybiBOVUxMOworICBjb25zdCBpbnQgbGVuZ3RoID0gc3RybGVuKGFuc2kpOworICBjb25zdCBpbnQgdW5pY29kZV9sZW5ndGggPQorICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuc2ksIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7CisgIFdDSEFSKiB1bmljb2RlID0gbmV3IFdDSEFSW3VuaWNvZGVfbGVuZ3RoICsgMV07CisgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBhbnNpLCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgdW5pY29kZV9sZW5ndGgpOworICB1bmljb2RlW3VuaWNvZGVfbGVuZ3RoXSA9IDA7CisgIHJldHVybiB1bmljb2RlOworfQorCisvLyBDcmVhdGVzIGFuIEFOU0kgc3RyaW5nIGZyb20gdGhlIGdpdmVuIHdpZGUgc3RyaW5nLCBhbGxvY2F0aW5nCisvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCisvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgQU5TSSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCisvLyBpbnB1dCBpcyBOVUxMLgorY29uc3QgY2hhciogU3RyaW5nOjpVdGYxNlRvQW5zaShMUENXU1RSIHV0ZjE2X3N0cikgIHsKKyAgaWYgKCF1dGYxNl9zdHIpIHJldHVybiBOVUxMOworICBjb25zdCBpbnQgYW5zaV9sZW5ndGggPQorICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHV0ZjE2X3N0ciwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICBjaGFyKiBhbnNpID0gbmV3IGNoYXJbYW5zaV9sZW5ndGggKyAxXTsKKyAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHV0ZjE2X3N0ciwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgYW5zaSwgYW5zaV9sZW5ndGgsIE5VTEwsIE5VTEwpOworICBhbnNpW2Fuc2lfbGVuZ3RoXSA9IDA7CisgIHJldHVybiBhbnNpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorLy8KKy8vIFVubGlrZSBzdHJjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBIE5VTEwKKy8vIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKy8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorYm9vbCBTdHJpbmc6OkNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciAqIGxocywgY29uc3QgY2hhciAqIHJocykgeworICBpZiAoIGxocyA9PSBOVUxMICkgcmV0dXJuIHJocyA9PSBOVUxMOworCisgIGlmICggcmhzID09IE5VTEwgKSByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHN0cmNtcChsaHMsIHJocykgPT0gMDsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORyB8fCBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gQ29udmVydHMgYW4gYXJyYXkgb2Ygd2lkZSBjaGFycyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGUgZ2l2ZW4gTWVzc2FnZSBvYmplY3QuCitzdGF0aWMgdm9pZCBTdHJlYW1XaWRlQ2hhcnNUb01lc3NhZ2UoY29uc3Qgd2NoYXJfdCogd3N0ciwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtc2cpIHsKKyAgLy8gVE9ETyh3YW4pOiBjb25zaWRlciBhbGxvd2luZyBhIHRlc3Rpbmc6OlN0cmluZyBvYmplY3QgdG8KKyAgLy8gY29udGFpbiAnXDAnLiAgVGhpcyB3aWxsIG1ha2UgaXQgYmVoYXZlIG1vcmUgbGlrZSBzdGQ6OnN0cmluZywKKyAgLy8gYW5kIHdpbGwgYWxsb3cgVG9VdGY4U3RyaW5nKCkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IGVuY29kaW5nCisgIC8vIGZvciAnXDAnIHMudC4gd2UgY2FuIGdldCByaWQgb2YgdGhlIGNvbmRpdGlvbmFsIGhlcmUgKGFuZCBpbgorICAvLyBzZXZlcmFsIG90aGVyIHBsYWNlcykuCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGxlbmd0aDsgKSB7ICAvLyBOT0xJTlQKKyAgICBpZiAod3N0cltpXSAhPSBMJ1wwJykgeworICAgICAgKm1zZyA8PCBXaWRlU3RyaW5nVG9VdGY4KHdzdHIgKyBpLCBzdGF0aWNfY2FzdDxpbnQ+KGxlbmd0aCAtIGkpKTsKKyAgICAgIHdoaWxlIChpICE9IGxlbmd0aCAmJiB3c3RyW2ldICE9IEwnXDAnKQorICAgICAgICBpKys7CisgICAgfSBlbHNlIHsKKyAgICAgICptc2cgPDwgJ1wwJzsKKyAgICAgIGkrKzsKKyAgICB9CisgIH0KK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcgfHwgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KK01lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKSB7CisgIGludGVybmFsOjpTdHJlYW1XaWRlQ2hhcnNUb01lc3NhZ2Uod3N0ci5jX3N0cigpLCB3c3RyLmxlbmd0aCgpLCB0aGlzKTsKKyAgcmV0dXJuICp0aGlzOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCitNZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCA6OndzdHJpbmcmIHdzdHIpIHsKKyAgaW50ZXJuYWw6OlN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZSh3c3RyLmNfc3RyKCksIHdzdHIubGVuZ3RoKCksIHRoaXMpOworICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBGb3JtYXRzIGEgdmFsdWUgdG8gYmUgdXNlZCBpbiBhIGZhaWx1cmUgbWVzc2FnZS4KKworLy8gRm9yIGEgY2hhciB2YWx1ZSwgd2UgcHJpbnQgaXQgYXMgYSBDKysgY2hhciBsaXRlcmFsIGFuZCBhcyBhbgorLy8gdW5zaWduZWQgaW50ZWdlciAoYm90aCBpbiBkZWNpbWFsIGFuZCBpbiBoZXhhZGVjaW1hbCkuCitTdHJpbmcgRm9ybWF0Rm9yRmFpbHVyZU1lc3NhZ2UoY2hhciBjaCkgeworICBjb25zdCB1bnNpZ25lZCBpbnQgY2hfYXNfdWludCA9IGNoOworICAvLyBBIFN0cmluZyBvYmplY3QgY2Fubm90IGNvbnRhaW4gJ1wwJywgc28gd2UgcHJpbnQgIlxcMCIgd2hlbiBjaCBpcworICAvLyAnXDAnLgorICByZXR1cm4gU3RyaW5nOjpGb3JtYXQoIiclcycgKCV1LCAweCVYKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBjaCA/IFN0cmluZzo6Rm9ybWF0KCIlYyIsIGNoKS5jX3N0cigpIDogIlxcMCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjaF9hc191aW50LCBjaF9hc191aW50KTsKK30KKworLy8gRm9yIGEgd2NoYXJfdCB2YWx1ZSwgd2UgcHJpbnQgaXQgYXMgYSBDKysgd2NoYXJfdCBsaXRlcmFsIGFuZCBhcyBhbgorLy8gdW5zaWduZWQgaW50ZWdlciAoYm90aCBpbiBkZWNpbWFsIGFuZCBpbiBoZXhpZGVjaW1hbCkuCitTdHJpbmcgRm9ybWF0Rm9yRmFpbHVyZU1lc3NhZ2Uod2NoYXJfdCB3Y2hhcikgeworICAvLyBUaGUgQysrIHN0YW5kYXJkIGRvZXNuJ3Qgc3BlY2lmeSB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgd2NoYXJfdAorICAvLyB0eXBlLiAgSXQganVzdCBzYXlzIHRoYXQgaXQgc2hhbGwgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIGFub3RoZXIKKyAgLy8gaW50ZWdyYWwgdHlwZSwgY2FsbGVkIGl0cyB1bmRlcmx5aW5nIHR5cGUuCisgIC8vCisgIC8vIFRoZXJlZm9yZSwgaW4gb3JkZXIgdG8gcHJpbnQgYSB3Y2hhcl90IHZhbHVlIGluIHRoZSBudW1lcmljIGZvcm0sCisgIC8vIHdlIGZpcnN0IGNvbnZlcnQgaXQgdG8gdGhlIGxhcmdlc3QgaW50ZWdyYWwgdHlwZSAoVUludDY0KSBhbmQKKyAgLy8gdGhlbiBwcmludCB0aGUgY29udmVydGVkIHZhbHVlLgorICAvLworICAvLyBXZSB1c2Ugc3RyZWFtaW5nIHRvIHByaW50IHRoZSB2YWx1ZSBhcyAiJWxsdSIgZG9lc24ndCB3b3JrCisgIC8vIGNvcnJlY3RseSB3aXRoIE1TVkMgNy4xLgorICBjb25zdCBVSW50NjQgd2NoYXJfYXNfdWludDY0ID0gd2NoYXI7CisgIE1lc3NhZ2UgbXNnOworICAvLyBBIFN0cmluZyBvYmplY3QgY2Fubm90IGNvbnRhaW4gJ1wwJywgc28gd2UgcHJpbnQgIlxcMCIgd2hlbiB3Y2hhciBpcworICAvLyBMJ1wwJy4KKyAgY2hhciBidWZmZXJbMzJdOyAgLy8gQ29kZVBvaW50VG9VdGY4IHJlcXVpcmVzIGEgYnVmZmVyIHRoYXQgYmlnLgorICBtc2cgPDwgIkwnIgorICAgICAgPDwgKHdjaGFyID8gQ29kZVBvaW50VG9VdGY4KHN0YXRpY19jYXN0PFVJbnQzMj4od2NoYXIpLCBidWZmZXIpIDogIlxcMCIpCisgICAgICA8PCAiJyAoIiA8PCB3Y2hhcl9hc191aW50NjQgPDwgIiwgMHgiIDw8IDo6c3RkOjpzZXRiYXNlKDE2KQorICAgICAgPDwgd2NoYXJfYXNfdWludDY0IDw8ICIpIjsKKyAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEFzc2VydGlvblJlc3VsdCBjb25zdHJ1Y3RvcnMuCisvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgorQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcikKKyAgICA6IHN1Y2Nlc3NfKG90aGVyLnN1Y2Nlc3NfKSwKKyAgICAgIG1lc3NhZ2VfKG90aGVyLm1lc3NhZ2VfLmdldCgpICE9IE5VTEwgPworICAgICAgICAgICAgICAgbmV3IGludGVybmFsOjpTdHJpbmcoKm90aGVyLm1lc3NhZ2VfKSA6CisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnRlcm5hbDo6U3RyaW5nKj4oTlVMTCkpIHsKK30KKworLy8gUmV0dXJucyB0aGUgYXNzZXJ0aW9uJ3MgbmVnYXRpb24uIFVzZWQgd2l0aCBFWFBFQ1QvQVNTRVJUX0ZBTFNFLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblJlc3VsdDo6b3BlcmF0b3IhKCkgY29uc3QgeworICBBc3NlcnRpb25SZXN1bHQgbmVnYXRpb24oIXN1Y2Nlc3NfKTsKKyAgaWYgKG1lc3NhZ2VfLmdldCgpICE9IE5VTEwpCisgICAgbmVnYXRpb24gPDwgKm1lc3NhZ2VfOworICByZXR1cm4gbmVnYXRpb247Cit9CisKKy8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0LgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblN1Y2Nlc3MoKSB7CisgIHJldHVybiBBc3NlcnRpb25SZXN1bHQodHJ1ZSk7Cit9CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpIHsKKyAgcmV0dXJuIEFzc2VydGlvblJlc3VsdChmYWxzZSk7Cit9CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlLgorLy8gRGVwcmVjYXRlZDsgdXNlIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtZXNzYWdlLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1lc3NhZ2U7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGFuIGVxdWFsaXR5IGFzc2VydGlvbgorLy8gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfU1RSRVEsIGV0YykgZmFpbHVyZS4KKy8vCisvLyBUaGUgZmlyc3QgZm91ciBwYXJhbWV0ZXJzIGFyZSB0aGUgZXhwcmVzc2lvbnMgdXNlZCBpbiB0aGUgYXNzZXJ0aW9uCisvLyBhbmQgdGhlaXIgdmFsdWVzLCBhcyBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIGZvciBBU1NFUlRfRVEoZm9vLCBiYXIpCisvLyB3aGVyZSBmb28gaXMgNSBhbmQgYmFyIGlzIDYsIHdlIGhhdmU6CisvLworLy8gICBleHBlY3RlZF9leHByZXNzaW9uOiAiZm9vIgorLy8gICBhY3R1YWxfZXhwcmVzc2lvbjogICAiYmFyIgorLy8gICBleHBlY3RlZF92YWx1ZTogICAgICAiNSIKKy8vICAgYWN0dWFsX3ZhbHVlOiAgICAgICAgIjYiCisvLworLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQorLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIiAoaWdub3JpbmcgY2FzZSkiIHdpbGwKKy8vIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UuCitBc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIGV4cGVjdGVkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIGFjdHVhbF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgIlZhbHVlIG9mOiAiIDw8IGFjdHVhbF9leHByZXNzaW9uOworICBpZiAoYWN0dWFsX3ZhbHVlICE9IGFjdHVhbF9leHByZXNzaW9uKSB7CisgICAgbXNnIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGFjdHVhbF92YWx1ZTsKKyAgfQorCisgIG1zZyA8PCAiXG5FeHBlY3RlZDogIiA8PCBleHBlY3RlZF9leHByZXNzaW9uOworICBpZiAoaWdub3JpbmdfY2FzZSkgeworICAgIG1zZyA8PCAiIChpZ25vcmluZyBjYXNlKSI7CisgIH0KKyAgaWYgKGV4cGVjdGVkX3ZhbHVlICE9IGV4cGVjdGVkX2V4cHJlc3Npb24pIHsKKyAgICBtc2cgPDwgIlxuV2hpY2ggaXM6ICIgPDwgZXhwZWN0ZWRfdmFsdWU7CisgIH0KKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZShtc2cpOworfQorCisvLyBDb25zdHJ1Y3RzIGEgZmFpbHVyZSBtZXNzYWdlIGZvciBCb29sZWFuIGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4KK1N0cmluZyBHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBhc3NlcnRpb25fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByZXNzaW9uX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9wcmVkaWNhdGVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3ByZWRpY2F0ZV92YWx1ZSkgeworICBjb25zdCBjaGFyKiBhY3R1YWxfbWVzc2FnZSA9IGFzc2VydGlvbl9yZXN1bHQubWVzc2FnZSgpOworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBleHByZXNzaW9uX3RleHQKKyAgICAgIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGFjdHVhbF9wcmVkaWNhdGVfdmFsdWU7CisgIGlmIChhY3R1YWxfbWVzc2FnZVswXSAhPSAnXDAnKQorICAgIG1zZyA8PCAiICgiIDw8IGFjdHVhbF9tZXNzYWdlIDw8ICIpIjsKKyAgbXNnIDw8ICJcbkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkX3ByZWRpY2F0ZV92YWx1ZTsKKyAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuCitBc3NlcnRpb25SZXN1bHQgRG91YmxlTmVhclByZWRGb3JtYXQoY29uc3QgY2hhciogZXhwcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJzX2Vycm9yX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic19lcnJvcikgeworICBjb25zdCBkb3VibGUgZGlmZiA9IGZhYnModmFsMSAtIHZhbDIpOworICBpZiAoZGlmZiA8PSBhYnNfZXJyb3IpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgLy8gVE9ETyh3YW4pOiBkbyBub3QgcHJpbnQgdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24gaWYgaXQncworICAvLyBhbHJlYWR5IGEgbGl0ZXJhbC4KKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiIDw8IGV4cHIxIDw8ICIgYW5kICIgPDwgZXhwcjIKKyAgICAgIDw8ICIgaXMgIiA8PCBkaWZmIDw8ICIsIHdoaWNoIGV4Y2VlZHMgIiA8PCBhYnNfZXJyb3JfZXhwciA8PCAiLCB3aGVyZVxuIgorICAgICAgPDwgZXhwcjEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2YWwxIDw8ICIsXG4iCisgICAgICA8PCBleHByMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHZhbDIgPDwgIiwgYW5kXG4iCisgICAgICA8PCBhYnNfZXJyb3JfZXhwciA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IGFic19lcnJvciA8PCAiLiI7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7Cit9CisKKworLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgRmxvYXRMRSgpIGFuZCBEb3VibGVMRSgpLgordGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+CitBc3NlcnRpb25SZXN1bHQgRmxvYXRpbmdQb2ludExFKGNvbnN0IGNoYXIqIGV4cHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSB2YWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDIpIHsKKyAgLy8gUmV0dXJucyBzdWNjZXNzIGlmIHZhbDEgaXMgbGVzcyB0aGFuIHZhbDIsCisgIGlmICh2YWwxIDwgdmFsMikgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICAvLyBvciBpZiB2YWwxIGlzIGFsbW9zdCBlcXVhbCB0byB2YWwyLgorICBjb25zdCBGbG9hdGluZ1BvaW50PFJhd1R5cGU+IGxocyh2YWwxKSwgcmhzKHZhbDIpOworICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vIE5vdGUgdGhhdCB0aGUgYWJvdmUgdHdvIGNoZWNrcyB3aWxsIGJvdGggZmFpbCBpZiBlaXRoZXIgdmFsMSBvcgorICAvLyB2YWwyIGlzIE5hTiwgYXMgdGhlIElFRUUgZmxvYXRpbmctcG9pbnQgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdAorICAvLyBhbnkgcHJlZGljYXRlIGludm9sdmluZyBhIE5hTiBtdXN0IHJldHVybiBmYWxzZS4KKworICBTdHJTdHJlYW0gdmFsMV9zczsKKyAgdmFsMV9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgPDwgdmFsMTsKKworICBTdHJTdHJlYW0gdmFsMl9zczsKKyAgdmFsMl9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgPDwgdmFsMjsKKworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgPD0gKCIgPDwgZXhwcjIgPDwgIilcbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBTdHJTdHJlYW1Ub1N0cmluZygmdmFsMV9zcykgPDwgIiB2cyAiCisgICAgICA8PCBTdHJTdHJlYW1Ub1N0cmluZygmdmFsMl9zcyk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMKKy8vIG90aGVyd2lzZS4gIEluIHBhcnRpY3VsYXIsIGl0IGZhaWxzIGlmIGVpdGhlciB2YWwxIG9yIHZhbDIgaXMgTmFOLgorQXNzZXJ0aW9uUmVzdWx0IEZsb2F0TEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMikgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nUG9pbnRMRTxmbG9hdD4oZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyKTsKK30KKworLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscworLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCitBc3NlcnRpb25SZXN1bHQgRG91YmxlTEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLCBkb3VibGUgdmFsMikgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nUG9pbnRMRTxkb3VibGU+KGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMik7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9FUSB3aXRoIGludCBvciBlbnVtCisvLyBhcmd1bWVudHMuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKSB7CisgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoYWN0dWFsLCBleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBBIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcgdGhlIGhlbHBlciBmdW5jdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorLy8gQVNTRVJUXz8/IGFuZCBFWFBFQ1RfPz8gd2l0aCBpbnRlZ2VyIG9yIGVudW0gYXJndW1lbnRzLiAgSXQgaXMgaGVyZQorLy8ganVzdCB0byBhdm9pZCBjb3B5LWFuZC1wYXN0ZSBvZiBzaW1pbGFyIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExfQ01QX0hFTFBFUl8ob3BfbmFtZSwgb3ApXAorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCB2YWwxLCBCaWdnZXN0SW50IHZhbDIpIHtcCisgIGlmICh2YWwxIG9wIHZhbDIpIHtcCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTtcCisgIH0gZWxzZSB7XAorICAgIE1lc3NhZ2UgbXNnO1wKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXAorICAgICAgICA8PCAiKSwgYWN0dWFsOiAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwxLCB2YWwyKVwKKyAgICAgICAgPDwgIiB2cyAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwyLCB2YWwxKTtcCisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTtcCisgIH1cCit9CisKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTkUsICE9KQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTEUgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVCB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExULCA8ICkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oR0UsID49KQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1Qgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHVCwgPiApCisKKyN1bmRlZiBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfCisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJFUS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJORS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsKKyAgaWYgKCFTdHJpbmc6OkNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0gZWxzZSB7CisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpLCBhY3R1YWw6IFwiIgorICAgICAgICA8PCBzMSA8PCAiXCIgdnMgXCIiIDw8IHMyIDw8ICJcIiI7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKKyAgfQorfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsKKyAgaWYgKCFTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0gZWxzZSB7CisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpIChpZ25vcmluZyBjYXNlKSwgYWN0dWFsOiBcIiIKKyAgICAgICAgPDwgczEgPDwgIlwiIHZzIFwiIiA8PCBzMiA8PCAiXCIiOworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBJc1N1YlN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpLgorCisvLyBUaGlzIGdyb3VwIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHJldHVybiB0cnVlIGlmZiBuZWVkbGUgaXMgYQorLy8gc3Vic3RyaW5nIG9mIGhheXN0YWNrLiAgTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZgorLy8gb25seS4KKworYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgeworICBpZiAobmVlZGxlID09IE5VTEwgfHwgaGF5c3RhY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gbmVlZGxlID09IGhheXN0YWNrOworCisgIHJldHVybiBzdHJzdHIoaGF5c3RhY2ssIG5lZWRsZSkgIT0gTlVMTDsKK30KKworYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgeworICBpZiAobmVlZGxlID09IE5VTEwgfHwgaGF5c3RhY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gbmVlZGxlID09IGhheXN0YWNrOworCisgIHJldHVybiB3Y3NzdHIoaGF5c3RhY2ssIG5lZWRsZSkgIT0gTlVMTDsKK30KKworLy8gU3RyaW5nVHlwZSBoZXJlIGNhbiBiZSBlaXRoZXIgOjpzdGQ6OnN0cmluZyBvciA6OnN0ZDo6d3N0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgorYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3QgU3RyaW5nVHlwZSYgbmVlZGxlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nVHlwZSYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIGhheXN0YWNrLmZpbmQobmVlZGxlKSAhPSBTdHJpbmdUeXBlOjpucG9zOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgZWl0aGVyIElzU3Vic3RyaW5nKCkgb3IgSXNOb3RTdWJzdHJpbmcoKSwKKy8vIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZyBwYXJhbWV0ZXIuCisvLyBTdHJpbmdUeXBlIGhlcmUgY2FuIGJlIGNvbnN0IGNoYXIqLCBjb25zdCB3Y2hhcl90KiwgOjpzdGQ6OnN0cmluZywKKy8vIG9yIDo6c3RkOjp3c3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+CitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmdJbXBsKAorICAgIGJvb2wgZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IFN0cmluZ1R5cGUmIG5lZWRsZSwgY29uc3QgU3RyaW5nVHlwZSYgaGF5c3RhY2spIHsKKyAgaWYgKElzU3Vic3RyaW5nUHJlZChuZWVkbGUsIGhheXN0YWNrKSA9PSBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcpCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICBjb25zdCBib29sIGlzX3dpZGVfc3RyaW5nID0gc2l6ZW9mKG5lZWRsZVswXSkgPiAxOworICBjb25zdCBjaGFyKiBjb25zdCBiZWdpbl9zdHJpbmdfcXVvdGUgPSBpc193aWRlX3N0cmluZyA/ICJMXCIiIDogIlwiIjsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoCisgICAgICBNZXNzYWdlKCkKKyAgICAgIDw8ICJWYWx1ZSBvZjogIiA8PCBuZWVkbGVfZXhwciA8PCAiXG4iCisgICAgICA8PCAiICBBY3R1YWw6ICIgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IG5lZWRsZSA8PCAiXCJcbiIKKyAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCAoZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nID8gIiIgOiAibm90ICIpCisgICAgICA8PCAiYSBzdWJzdHJpbmcgb2YgIiA8PCBoYXlzdGFja19leHByIDw8ICJcbiIKKyAgICAgIDw8ICJXaGljaCBpczogIiA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgaGF5c3RhY2sgPDwgIlwiIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEKKy8vIHN1YnN0cmluZyBvZiBoYXlzdGFjayAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZgorLy8gb25seSksIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfT1NfV0lORE9XUworCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIElzSFJFU1VMVHtTdWNjZXNzRmFpbHVyZX0gcHJlZGljYXRlcworQXNzZXJ0aW9uUmVzdWx0IEhSRVNVTFRGYWlsdXJlSGVscGVyKGNvbnN0IGNoYXIqIGV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocikgeyAgLy8gTk9MSU5UCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gV2luZG93cyBDRSBkb2Vzbid0IHN1cHBvcnQgRm9ybWF0TWVzc2FnZS4KKyAgY29uc3QgY2hhciBlcnJvcl90ZXh0W10gPSAiIjsKKyNlbHNlCisgIC8vIExvb2tzIHVwIHRoZSBodW1hbi1yZWFkYWJsZSBzeXN0ZW0gbWVzc2FnZSBmb3IgdGhlIEhSRVNVTFQgY29kZQorICAvLyBhbmQgc2luY2Ugd2UncmUgbm90IHBhc3NpbmcgYW55IHBhcmFtcyB0byBGb3JtYXRNZXNzYWdlLCB3ZSBkb24ndAorICAvLyB3YW50IGluc2VydHMgZXhwYW5kZWQuCisgIGNvbnN0IERXT1JEIGtGbGFncyA9IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKKyAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFM7CisgIGNvbnN0IERXT1JEIGtCdWZTaXplID0gNDA5NjsgIC8vIFN0cmluZzo6Rm9ybWF0IGNhbid0IGV4Y2VlZCB0aGlzIGxlbmd0aC4KKyAgLy8gR2V0cyB0aGUgc3lzdGVtJ3MgaHVtYW4gcmVhZGFibGUgbWVzc2FnZSBzdHJpbmcgZm9yIHRoaXMgSFJFU1VMVC4KKyAgY2hhciBlcnJvcl90ZXh0W2tCdWZTaXplXSA9IHsgJ1wwJyB9OworICBEV09SRCBtZXNzYWdlX2xlbmd0aCA9IDo6Rm9ybWF0TWVzc2FnZUEoa0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vIHNvdXJjZSwgd2UncmUgYXNraW5nIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHIsICAvLyB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBubyBsaW5lIHdpZHRoIHJlc3RyaWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGV4dCwgIC8vIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCdWZTaXplLCAgLy8gYnVmIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLy8gbm8gYXJndW1lbnRzIGZvciBpbnNlcnRzCisgIC8vIFRyaW1zIHRhaWxpbmcgd2hpdGUgc3BhY2UgKEZvcm1hdE1lc3NhZ2UgbGVhdmVzIGEgdHJhaWxpbmcgY3ItbGYpCisgIGZvciAoOyBtZXNzYWdlX2xlbmd0aCAmJiBpc3NwYWNlKGVycm9yX3RleHRbbWVzc2FnZV9sZW5ndGggLSAxXSk7CisgICAgICAgICAgLS1tZXNzYWdlX2xlbmd0aCkgeworICAgIGVycm9yX3RleHRbbWVzc2FnZV9sZW5ndGggLSAxXSA9ICdcMCc7CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICBjb25zdCBTdHJpbmcgZXJyb3JfaGV4KFN0cmluZzo6Rm9ybWF0KCIweCUwOFggIiwgaHIpKTsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiICIgPDwgZXhwZWN0ZWQgPDwgIi5cbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBlcnJvcl9oZXggPDwgZXJyb3JfdGV4dCA8PCAiXG4iOworCisgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUobXNnKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0Fzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRTdWNjZXNzKGNvbnN0IGNoYXIqIGV4cHIsIGxvbmcgaHIpIHsgIC8vIE5PTElOVAorICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKyAgcmV0dXJuIEhSRVNVTFRGYWlsdXJlSGVscGVyKGV4cHIsICJzdWNjZWVkcyIsIGhyKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgImZhaWxzIiwgaHIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIFVuaWNvZGUgdGV4dCAod2lkZSBzdHJpbmdzKSBpbgorLy8gVVRGLTguCisKKy8vIEEgVW5pY29kZSBjb2RlLXBvaW50IGNhbiBoYXZlIHVwdG8gMjEgYml0cywgYW5kIGlzIGVuY29kZWQgaW4gVVRGLTgKKy8vIGxpa2UgdGhpczoKKy8vCisvLyBDb2RlLXBvaW50IGxlbmd0aCAgIEVuY29kaW5nCisvLyAgIDAgLSAgNyBiaXRzICAgICAgIDB4eHh4eHh4CisvLyAgIDggLSAxMSBiaXRzICAgICAgIDExMHh4eHh4IDEweHh4eHh4CisvLyAgMTIgLSAxNiBiaXRzICAgICAgIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4CisvLyAgMTcgLSAyMSBiaXRzICAgICAgIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4CisKKy8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSBvbmUtYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgorY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQxID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgIDcpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHR3by1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDIgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNSArIDYpKSAtIDE7CisKKy8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSB0aHJlZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDMgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNCArIDIqNikpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIGZvdXItYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgorY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQ0ID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgKDMgKyAzKjYpKSAtIDE7CisKKy8vIENob3BzIG9mZiB0aGUgbiBsb3dlc3QgYml0cyBmcm9tIGEgYml0IHBhdHRlcm4uICBSZXR1cm5zIHRoZSBuCisvLyBsb3dlc3QgYml0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBvcmlnaW5hbCBiaXQgcGF0dGVybiB3aWxsIGJlCisvLyBzaGlmdGVkIHRvIHRoZSByaWdodCBieSBuIGJpdHMuCitpbmxpbmUgVUludDMyIENob3BMb3dCaXRzKFVJbnQzMiogYml0cywgaW50IG4pIHsKKyAgY29uc3QgVUludDMyIGxvd19iaXRzID0gKmJpdHMgJiAoKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgbikgLSAxKTsKKyAgKmJpdHMgPj49IG47CisgIHJldHVybiBsb3dfYml0czsKK30KKworLy8gQ29udmVydHMgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUKKy8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50LgorLy8gVGhlIG91dHB1dCBidWZmZXIgc3RyIG11c3QgY29udGFpbnQgYXQgbGVhc3QgMzIgY2hhcmFjdGVycy4KKy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8gSWYgdGhlIGNvZGVfcG9pbnQgaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50CisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIG91dHB1dAorLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLgorY2hhciogQ29kZVBvaW50VG9VdGY4KFVJbnQzMiBjb2RlX3BvaW50LCBjaGFyKiBzdHIpIHsKKyAgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDEpIHsKKyAgICBzdHJbMV0gPSAnXDAnOworICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHh4eHh4eHgKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQyKSB7CisgICAgc3RyWzJdID0gJ1wwJzsKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhDMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTB4eHh4eAorICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDMpIHsKKyAgICBzdHJbM10gPSAnXDAnOworICAgIHN0clsyXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhFMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTEweHh4eAorICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDQpIHsKKyAgICBzdHJbNF0gPSAnXDAnOworICAgIHN0clszXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMl0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RjAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMTB4eHgKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGUgbG9uZ2VzdCBzdHJpbmcgU3RyaW5nOjpGb3JtYXQgY2FuIHByb2R1Y2Ugd2hlbiBpbnZva2VkCisgICAgLy8gd2l0aCB0aGVzZSBwYXJhbWV0ZXJzIGlzIDI4IGNoYXJhY3RlciBsb25nIChub3QgaW5jbHVkaW5nCisgICAgLy8gdGhlIHRlcm1pbmF0aW5nIG51bCBjaGFyYWN0ZXIpLiBXZSBhcmUgYXNraW5nIGZvciAzMiBjaGFyYWN0ZXIKKyAgICAvLyBidWZmZXIganVzdCBpbiBjYXNlLiBUaGlzIGlzIGFsc28gZW5vdWdoIGZvciBzdHJuY3B5IHRvCisgICAgLy8gbnVsbC10ZXJtaW5hdGUgdGhlIGRlc3RpbmF0aW9uIHN0cmluZy4KKyAgICBwb3NpeDo6U3RyTkNweSgKKyAgICAgICAgc3RyLCBTdHJpbmc6OkZvcm1hdCgiKEludmFsaWQgVW5pY29kZSAweCVYKSIsIGNvZGVfcG9pbnQpLmNfc3RyKCksIDMyKTsKKyAgICBzdHJbMzFdID0gJ1wwJzsgIC8vIE1ha2VzIHN1cmUgbm8gY2hhbmdlIGluIHRoZSBmb3JtYXQgdG8gc3RybmNweSBsZWF2ZXMKKyAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN1bHQgdW50ZXJtaW5hdGVkLgorICB9CisgIHJldHVybiBzdHI7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgaWYgdGhlIHRoZSBzeXN0ZW0KKy8vIHVzZXMgVVRGLTE2IGZvciB3aWRlIHN0cmluZyBlbmNvZGluZy4gQWxsIHN1cHBvcnRlZCBzeXN0ZW1zCisvLyB3aXRoIDE2IGJpdCB3Y2hhcl90IChXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpIGRvIHVzZSBVVEYtMTYuCisKKy8vIERldGVybWluZXMgaWYgdGhlIGFyZ3VtZW50cyBjb25zdGl0dXRlIFVURi0xNiBzdXJyb2dhdGUgcGFpcgorLy8gYW5kIHRodXMgc2hvdWxkIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgVW5pY29kZSBjb2RlIHBvaW50CisvLyB1c2luZyBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyLgoraW5saW5lIGJvb2wgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIod2NoYXJfdCBmaXJzdCwgd2NoYXJfdCBzZWNvbmQpIHsKKyAgcmV0dXJuIHNpemVvZih3Y2hhcl90KSA9PSAyICYmCisgICAgICAoZmlyc3QgJiAweEZDMDApID09IDB4RDgwMCAmJiAoc2Vjb25kICYgMHhGQzAwKSA9PSAweERDMDA7Cit9CisKKy8vIENyZWF0ZXMgYSBVbmljb2RlIGNvZGUgcG9pbnQgZnJvbSBVVEYxNiBzdXJyb2dhdGUgcGFpci4KK2lubGluZSBVSW50MzIgQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcih3Y2hhcl90IGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgc2Vjb25kKSB7CisgIGNvbnN0IFVJbnQzMiBtYXNrID0gKDEgPDwgMTApIC0gMTsKKyAgcmV0dXJuIChzaXplb2Yod2NoYXJfdCkgPT0gMikgPworICAgICAgKCgoZmlyc3QgJiBtYXNrKSA8PCAxMCkgfCAoc2Vjb25kICYgbWFzaykpICsgMHgxMDAwMCA6CisgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbmRpdGlvbiBpcworICAgICAgLy8gZmFsc2UsIGJ1dCB3ZSBwcm92aWRlIGEgc2Vuc2libGUgZGVmYXVsdCBpbiBjYXNlIGl0IGlzLgorICAgICAgc3RhdGljX2Nhc3Q8VUludDMyPihmaXJzdCk7Cit9CisKKy8vIENvbnZlcnRzIGEgd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorLy8gICBVVEYtMTYgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgKG9uIFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykKKy8vICAgVVRGLTMyIGlmIHNpemVvZih3Y2hhcl90KSA9PSA0IChvbiBMaW51eCkKKy8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLgorLy8gUGFyYW1ldGVyIG51bV9jaGFycyBtYXkgYWRkaXRpb25hbGx5IGxpbWl0IHRoZSBudW1iZXIKKy8vIG9mIHdjaGFyX3QgY2hhcmFjdGVycyBwcm9jZXNzZWQuIC0xIGlzIHVzZWQgd2hlbiB0aGUgZW50aXJlIHN0cmluZworLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4KKy8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludHMKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIHRoZXkgd2lsbCBiZSBvdXRwdXQKKy8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZworLy8gYW5kIGNvbnRhaW5zIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycywgdmFsdWVzIGluIHRob3NlIHBhaXJzCisvLyB3aWxsIGJlIGVuY29kZWQgYXMgaW5kaXZpZHVhbCBVbmljb2RlIGNoYXJhY3RlcnMgZnJvbSBCYXNpYyBOb3JtYWwgUGxhbmUuCitTdHJpbmcgV2lkZVN0cmluZ1RvVXRmOChjb25zdCB3Y2hhcl90KiBzdHIsIGludCBudW1fY2hhcnMpIHsKKyAgaWYgKG51bV9jaGFycyA9PSAtMSkKKyAgICBudW1fY2hhcnMgPSBzdGF0aWNfY2FzdDxpbnQ+KHdjc2xlbihzdHIpKTsKKworICBTdHJTdHJlYW0gc3RyZWFtOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jaGFyczsgKytpKSB7CisgICAgVUludDMyIHVuaWNvZGVfY29kZV9wb2ludDsKKworICAgIGlmIChzdHJbaV0gPT0gTCdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoaSArIDEgPCBudW1fY2hhcnMgJiYgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIoc3RyW2ldLCBzdHJbaSArIDFdKSkgeworICAgICAgdW5pY29kZV9jb2RlX3BvaW50ID0gQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcihzdHJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cltpICsgMV0pOworICAgICAgaSsrOworICAgIH0gZWxzZSB7CisgICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBzdGF0aWNfY2FzdDxVSW50MzI+KHN0cltpXSk7CisgICAgfQorCisgICAgY2hhciBidWZmZXJbMzJdOyAgLy8gQ29kZVBvaW50VG9VdGY4IHJlcXVpcmVzIGEgYnVmZmVyIHRoaXMgYmlnLgorICAgIHN0cmVhbSA8PCBDb2RlUG9pbnRUb1V0ZjgodW5pY29kZV9jb2RlX3BvaW50LCBidWZmZXIpOworICB9CisgIHJldHVybiBTdHJTdHJlYW1Ub1N0cmluZygmc3RyZWFtKTsKK30KKworLy8gQ29udmVydHMgYSB3aWRlIEMgc3RyaW5nIHRvIGEgU3RyaW5nIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KKy8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuCitTdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoY29uc3Qgd2NoYXJfdCAqIHdpZGVfY19zdHIpIHsKKyAgaWYgKHdpZGVfY19zdHIgPT0gTlVMTCkgcmV0dXJuIFN0cmluZygiKG51bGwpIik7CisKKyAgcmV0dXJuIFN0cmluZyhpbnRlcm5hbDo6V2lkZVN0cmluZ1RvVXRmOCh3aWRlX2Nfc3RyLCAtMSkuY19zdHIoKSk7Cit9CisKKy8vIFNpbWlsYXIgdG8gU2hvd1dpZGVDU3RyaW5nKCksIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gZW5jbG9zZXMKKy8vIHRoZSBjb252ZXJ0ZWQgc3RyaW5nIGluIGRvdWJsZSBxdW90ZXMuCitTdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cikgeworICBpZiAod2lkZV9jX3N0ciA9PSBOVUxMKSByZXR1cm4gU3RyaW5nKCIobnVsbCkiKTsKKworICByZXR1cm4gU3RyaW5nOjpGb3JtYXQoIkxcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcod2lkZV9jX3N0cikuY19zdHIoKSk7Cit9CisKKy8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCisvLyBjb250ZW50LgorLy8KKy8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBIE5VTEwKKy8vIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKy8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorYm9vbCBTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QgKiBsaHMsIGNvbnN0IHdjaGFyX3QgKiByaHMpIHsKKyAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKHJocyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHdjc2NtcChsaHMsIHJocykgPT0gMDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nUXVvdGVkKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMikgeworICBpZiAoIVN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSwgYWN0dWFsOiAiCisgICAgICA8PCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZ1F1b3RlZChzMSkKKyAgICAgIDw8ICIgdnMgIiA8PCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZ1F1b3RlZChzMik7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7Cit9CisKKy8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZQorLy8gdGhlIHNhbWUgY29udGVudC4KKy8vCisvLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKy8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmIChsaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gcmhzID09IE5VTEw7CisgIGlmIChyaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBwb3NpeDo6U3RyQ2FzZUNtcChsaHMsIHJocykgPT0gMDsKK30KKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KKyAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCB3aWRlIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgLy8gTkI6IFRoZSBpbXBsZW1lbnRhdGlvbnMgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBzbGlnaHRseSBkaWZmZXIuCisgIC8vIE9uIHdpbmRvd3MsIHRoaXMgbWV0aG9kIHVzZXMgX3djc2ljbXAgd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFCisgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlLiBPbiBHTlUgcGxhdGZvcm0gdGhpcyBtZXRob2QgdXNlcyB3Y3NjYXNlY21wCisgIC8vIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisgIC8vIE9uIE1hY09TIFgsIGl0IHVzZXMgdG93bG93ZXIsIHdoaWNoIGFsc28gdXNlcyBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUKKyAgLy8gY3VycmVudCBsb2NhbGUuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocykgeworICBpZiAoIGxocyA9PSBOVUxMICkgcmV0dXJuIHJocyA9PSBOVUxMOworCisgIGlmICggcmhzID09IE5VTEwgKSByZXR1cm4gZmFsc2U7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHJldHVybiBfd2NzaWNtcChsaHMsIHJocykgPT0gMDsKKyNlbGlmIEdURVNUX09TX0xJTlVYCisgIHJldHVybiB3Y3NjYXNlY21wKGxocywgcmhzKSA9PSAwOworI2Vsc2UKKyAgLy8gTWFjIE9TIFggYW5kIEN5Z3dpbiBkb24ndCBkZWZpbmUgd2NzY2FzZWNtcC4gIE90aGVyIHVua25vd24gT1NlcworICAvLyBtYXkgbm90IGRlZmluZSBpdCBlaXRoZXIuCisgIHdpbnRfdCBsZWZ0LCByaWdodDsKKyAgZG8geworICAgIGxlZnQgPSB0b3dsb3dlcigqbGhzKyspOworICAgIHJpZ2h0ID0gdG93bG93ZXIoKnJocysrKTsKKyAgfSB3aGlsZSAobGVmdCAmJiBsZWZ0ID09IHJpZ2h0KTsKKyAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7CisjZW5kaWYgIC8vIE9TIHNlbGVjdG9yCit9CisKKy8vIENvbXBhcmVzIHRoaXMgd2l0aCBhbm90aGVyIFN0cmluZy4KKy8vIFJldHVybnMgPCAwIGlmIHRoaXMgaXMgbGVzcyB0aGFuIHJocywgMCBpZiB0aGlzIGlzIGVxdWFsIHRvIHJocywgb3IgPiAwCisvLyBpZiB0aGlzIGlzIGdyZWF0ZXIgdGhhbiByaHMuCitpbnQgU3RyaW5nOjpDb21wYXJlKGNvbnN0IFN0cmluZyAmIHJocykgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsaHNfY19zdHIgPSBjX3N0cigpOworICBjb25zdCBjaGFyKiBjb25zdCByaHNfY19zdHIgPSByaHMuY19zdHIoKTsKKworICBpZiAobGhzX2Nfc3RyID09IE5VTEwpIHsKKyAgICByZXR1cm4gcmhzX2Nfc3RyID09IE5VTEwgPyAwIDogLTE7ICAvLyBOVUxMIDwgYW55dGhpbmcgZXhjZXB0IE5VTEwKKyAgfSBlbHNlIGlmIChyaHNfY19zdHIgPT0gTlVMTCkgeworICAgIHJldHVybiAxOworICB9CisKKyAgY29uc3Qgc2l6ZV90IHNob3J0ZXJfc3RyX2xlbiA9CisgICAgICBsZW5ndGgoKSA8PSByaHMubGVuZ3RoKCkgPyBsZW5ndGgoKSA6IHJocy5sZW5ndGgoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc2hvcnRlcl9zdHJfbGVuOyBpKyspIHsKKyAgICBpZiAobGhzX2Nfc3RyW2ldIDwgcmhzX2Nfc3RyW2ldKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChsaHNfY19zdHJbaV0gPiByaHNfY19zdHJbaV0pIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gKGxlbmd0aCgpIDwgcmhzLmxlbmd0aCgpKSA/IC0xIDoKKyAgICAgIChsZW5ndGgoKSA+IHJocy5sZW5ndGgoKSkgPyAxIDogMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIFN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeC4gICpBbnkqCisvLyBTdHJpbmcgaXMgY29uc2lkZXJlZCB0byBlbmQgd2l0aCBhIE5VTEwgb3IgZW1wdHkgc3VmZml4LgorYm9vbCBTdHJpbmc6OkVuZHNXaXRoKGNvbnN0IGNoYXIqIHN1ZmZpeCkgY29uc3QgeworICBpZiAoc3VmZml4ID09IE5VTEwgfHwgQ1N0cmluZ0VxdWFscyhzdWZmaXgsICIiKSkgcmV0dXJuIHRydWU7CisKKyAgaWYgKGNfc3RyKCkgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IHNpemVfdCB0aGlzX2xlbiA9IHN0cmxlbihjX3N0cigpKTsKKyAgY29uc3Qgc2l6ZV90IHN1ZmZpeF9sZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgcmV0dXJuICh0aGlzX2xlbiA+PSBzdWZmaXhfbGVuKSAmJgorICAgICAgICAgQ1N0cmluZ0VxdWFscyhjX3N0cigpICsgdGhpc19sZW4gLSBzdWZmaXhfbGVuLCBzdWZmaXgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgU3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBpZ25vcmluZyBjYXNlLgorLy8gQW55IFN0cmluZyBpcyBjb25zaWRlcmVkIHRvIGVuZCB3aXRoIGEgTlVMTCBvciBlbXB0eSBzdWZmaXguCitib29sIFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoY29uc3QgY2hhciogc3VmZml4KSBjb25zdCB7CisgIGlmIChzdWZmaXggPT0gTlVMTCB8fCBDU3RyaW5nRXF1YWxzKHN1ZmZpeCwgIiIpKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoY19zdHIoKSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgY29uc3Qgc2l6ZV90IHRoaXNfbGVuID0gc3RybGVuKGNfc3RyKCkpOworICBjb25zdCBzaXplX3Qgc3VmZml4X2xlbiA9IHN0cmxlbihzdWZmaXgpOworICByZXR1cm4gKHRoaXNfbGVuID49IHN1ZmZpeF9sZW4pICYmCisgICAgICAgICBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNfc3RyKCkgKyB0aGlzX2xlbiAtIHN1ZmZpeF9sZW4sIHN1ZmZpeCk7Cit9CisKKy8vIEZvcm1hdHMgYSBsaXN0IG9mIGFyZ3VtZW50cyB0byBhIFN0cmluZywgdXNpbmcgdGhlIHNhbWUgZm9ybWF0CisvLyBzcGVjIHN0cmluZyBhcyBmb3IgcHJpbnRmLgorLy8KKy8vIFdlIGRvIG5vdCB1c2UgdGhlIFN0cmluZ1ByaW50ZiBjbGFzcyBhcyBpdCBpcyBub3QgdW5pdmVyc2FsbHkKKy8vIGF2YWlsYWJsZS4KKy8vCisvLyBUaGUgcmVzdWx0IGlzIGxpbWl0ZWQgdG8gNDA5NiBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgdGhlIHRhaWxpbmcgMCkuCisvLyBJZiA0MDk2IGNoYXJhY3RlcnMgYXJlIG5vdCBlbm91Z2ggdG8gZm9ybWF0IHRoZSBpbnB1dCwgb3IgaWYKKy8vIHRoZXJlJ3MgYW4gZXJyb3IsICI8Zm9ybWF0dGluZyBlcnJvciBvciBidWZmZXIgZXhjZWVkZWQ+IiBpcworLy8gcmV0dXJuZWQuCitTdHJpbmcgU3RyaW5nOjpGb3JtYXQoY29uc3QgY2hhciAqIGZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKworICBjaGFyIGJ1ZmZlcls0MDk2XTsKKyAgY29uc3QgaW50IGtCdWZmZXJTaXplID0gc2l6ZW9mKGJ1ZmZlcikvc2l6ZW9mKGJ1ZmZlclswXSk7CisKKyAgLy8gTVNWQyA4IGRlcHJlY2F0ZXMgdnNucHJpbnRmKCksIHNvIHdlIHdhbnQgdG8gc3VwcHJlc3Mgd2FybmluZworICAvLyA0OTk2IChkZXByZWNhdGVkIGZ1bmN0aW9uKSB0aGVyZS4KKyNpZmRlZiBfTVNDX1ZFUiAgLy8gV2UgYXJlIHVzaW5nIE1TVkMuCisjcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYuCisgIGNvbnN0IGludCBzaXplID0gdnNucHJpbnRmKGJ1ZmZlciwga0J1ZmZlclNpemUsIGZvcm1hdCwgYXJncyk7CisjcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZWxzZSAgLy8gV2UgYXJlIG5vdCB1c2luZyBNU1ZDLgorICBjb25zdCBpbnQgc2l6ZSA9IHZzbnByaW50ZihidWZmZXIsIGtCdWZmZXJTaXplLCBmb3JtYXQsIGFyZ3MpOworI2VuZGlmICAvLyBfTVNDX1ZFUgorICB2YV9lbmQoYXJncyk7CisKKyAgLy8gdnNucHJpbnRmKCkncyBiZWhhdmlvciBpcyBub3QgcG9ydGFibGUuICBXaGVuIHRoZSBidWZmZXIgaXMgbm90CisgIC8vIGJpZyBlbm91Z2gsIGl0IHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBpbiBNU1ZDLCBhbmQgcmV0dXJucyB0aGUKKyAgLy8gbmVlZGVkIGJ1ZmZlciBzaXplIG9uIExpbnV4LiAgV2hlbiB0aGVyZSBpcyBhbiBvdXRwdXQgZXJyb3IsIGl0CisgIC8vIGFsd2F5cyByZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUuICBGb3Igc2ltcGxpY2l0eSwgd2UgbHVtcCB0aGUgdHdvCisgIC8vIGVycm9yIGNhc2VzIHRvZ2V0aGVyLgorICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSBrQnVmZmVyU2l6ZSkgeworICAgIHJldHVybiBTdHJpbmcoIjxmb3JtYXR0aW5nIGVycm9yIG9yIGJ1ZmZlciBleGNlZWRlZD4iKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gU3RyaW5nKGJ1ZmZlciwgc2l6ZSk7CisgIH0KK30KKworLy8gQ29udmVydHMgdGhlIGJ1ZmZlciBpbiBhIFN0clN0cmVhbSB0byBhIFN0cmluZywgY29udmVydGluZyBOVUwKKy8vIGJ5dGVzIHRvICJcXDAiIGFsb25nIHRoZSB3YXkuCitTdHJpbmcgU3RyU3RyZWFtVG9TdHJpbmcoU3RyU3RyZWFtKiBzcykgeworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIgPSBzcy0+c3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0YXJ0ID0gc3RyLmNfc3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyLmxlbmd0aCgpOworCisgIC8vIFdlIG5lZWQgdG8gdXNlIGEgaGVscGVyIFN0clN0cmVhbSB0byBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uCisgIC8vIGJlY2F1c2UgU3RyaW5nIGRvZXNuJ3Qgc3VwcG9ydCBwdXNoX2JhY2soKS4KKyAgU3RyU3RyZWFtIGhlbHBlcjsKKyAgZm9yIChjb25zdCBjaGFyKiBjaCA9IHN0YXJ0OyBjaCAhPSBlbmQ7ICsrY2gpIHsKKyAgICBpZiAoKmNoID09ICdcMCcpIHsKKyAgICAgIGhlbHBlciA8PCAiXFwwIjsgIC8vIFJlcGxhY2VzIE5VTCB3aXRoICJcXDAiOworICAgIH0gZWxzZSB7CisgICAgICBoZWxwZXIucHV0KCpjaCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFN0cmluZyhoZWxwZXIuc3RyKCkuY19zdHIoKSk7Cit9CisKKy8vIEFwcGVuZHMgdGhlIHVzZXItc3VwcGxpZWQgbWVzc2FnZSB0byB0aGUgR29vZ2xlLVRlc3QtZ2VuZXJhdGVkIG1lc3NhZ2UuCitTdHJpbmcgQXBwZW5kVXNlck1lc3NhZ2UoY29uc3QgU3RyaW5nJiBndGVzdF9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgdXNlcl9tc2cpIHsKKyAgLy8gQXBwZW5kcyB0aGUgdXNlciBtZXNzYWdlIGlmIGl0J3Mgbm9uLWVtcHR5LgorICBjb25zdCBTdHJpbmcgdXNlcl9tc2dfc3RyaW5nID0gdXNlcl9tc2cuR2V0U3RyaW5nKCk7CisgIGlmICh1c2VyX21zZ19zdHJpbmcuZW1wdHkoKSkgeworICAgIHJldHVybiBndGVzdF9tc2c7CisgIH0KKworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8IGd0ZXN0X21zZyA8PCAiXG4iIDw8IHVzZXJfbXNnX3N0cmluZzsKKworICByZXR1cm4gbXNnLkdldFN0cmluZygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gY2xhc3MgVGVzdFJlc3VsdAorCisvLyBDcmVhdGVzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCitUZXN0UmVzdWx0OjpUZXN0UmVzdWx0KCkKKyAgICA6IGRlYXRoX3Rlc3RfY291bnRfKDApLAorICAgICAgZWxhcHNlZF90aW1lXygwKSB7Cit9CisKKy8vIEQndG9yLgorVGVzdFJlc3VsdDo6flRlc3RSZXN1bHQoKSB7Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwYXJ0IHJlc3VsdCBhbW9uZyBhbGwgdGhlIHJlc3VsdHMuIGkgY2FuCisvLyByYW5nZSBmcm9tIDAgdG8gdG90YWxfcGFydF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwKKy8vIGFib3J0cyB0aGUgcHJvZ3JhbS4KK2NvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UmVzdWx0OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaSkgY29uc3QgeworICBpZiAoaSA8IDAgfHwgaSA+PSB0b3RhbF9wYXJ0X2NvdW50KCkpCisgICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOworICByZXR1cm4gdGVzdF9wYXJ0X3Jlc3VsdHNfLmF0KGkpOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcHJvcGVydHkuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzIHRoZQorLy8gcHJvZ3JhbS4KK2NvbnN0IFRlc3RQcm9wZXJ0eSYgVGVzdFJlc3VsdDo6R2V0VGVzdFByb3BlcnR5KGludCBpKSBjb25zdCB7CisgIGlmIChpIDwgMCB8fCBpID49IHRlc3RfcHJvcGVydHlfY291bnQoKSkKKyAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisgIHJldHVybiB0ZXN0X3Byb3BlcnRpZXNfLmF0KGkpOworfQorCisvLyBDbGVhcnMgdGhlIHRlc3QgcGFydCByZXN1bHRzLgordm9pZCBUZXN0UmVzdWx0OjpDbGVhclRlc3RQYXJ0UmVzdWx0cygpIHsKKyAgdGVzdF9wYXJ0X3Jlc3VsdHNfLmNsZWFyKCk7Cit9CisKKy8vIEFkZHMgYSB0ZXN0IHBhcnQgcmVzdWx0IHRvIHRoZSBsaXN0Lgordm9pZCBUZXN0UmVzdWx0OjpBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICB0ZXN0X3BhcnRfcmVzdWx0c18ucHVzaF9iYWNrKHRlc3RfcGFydF9yZXN1bHQpOworfQorCisvLyBBZGRzIGEgdGVzdCBwcm9wZXJ0eSB0byB0aGUgbGlzdC4gSWYgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSBhcyB0aGUKKy8vIHN1cHBsaWVkIHByb3BlcnR5IGlzIGFscmVhZHkgcmVwcmVzZW50ZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIHRlc3RfcHJvcGVydHkKKy8vIHJlcGxhY2VzIHRoZSBvbGQgdmFsdWUgZm9yIHRoYXQga2V5Lgordm9pZCBUZXN0UmVzdWx0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIHsKKyAgaWYgKCFWYWxpZGF0ZVRlc3RQcm9wZXJ0eSh0ZXN0X3Byb3BlcnR5KSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJnRlc3RfcHJvcGVyaXRlc19tdXRleF8pOworICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+OjppdGVyYXRvciBwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleSA9CisgICAgICBzdGQ6OmZpbmRfaWYodGVzdF9wcm9wZXJ0aWVzXy5iZWdpbigpLCB0ZXN0X3Byb3BlcnRpZXNfLmVuZCgpLAorICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0UHJvcGVydHlLZXlJcyh0ZXN0X3Byb3BlcnR5LmtleSgpKSk7CisgIGlmIChwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleSA9PSB0ZXN0X3Byb3BlcnRpZXNfLmVuZCgpKSB7CisgICAgdGVzdF9wcm9wZXJ0aWVzXy5wdXNoX2JhY2sodGVzdF9wcm9wZXJ0eSk7CisgICAgcmV0dXJuOworICB9CisgIHByb3BlcnR5X3dpdGhfbWF0Y2hpbmdfa2V5LT5TZXRWYWx1ZSh0ZXN0X3Byb3BlcnR5LnZhbHVlKCkpOworfQorCisvLyBBZGRzIGEgZmFpbHVyZSBpZiB0aGUga2V5IGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIG9mIEdvb2dsZSBUZXN0CisvLyB0ZXN0Y2FzZSB0YWdzLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZC4KK2Jvb2wgVGVzdFJlc3VsdDo6VmFsaWRhdGVUZXN0UHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7CisgIGludGVybmFsOjpTdHJpbmcga2V5KHRlc3RfcHJvcGVydHkua2V5KCkpOworICBpZiAoa2V5ID09ICJuYW1lIiB8fCBrZXkgPT0gInN0YXR1cyIgfHwga2V5ID09ICJ0aW1lIiB8fCBrZXkgPT0gImNsYXNzbmFtZSIpIHsKKyAgICBBRERfRkFJTFVSRSgpCisgICAgICAgIDw8ICJSZXNlcnZlZCBrZXkgdXNlZCBpbiBSZWNvcmRQcm9wZXJ0eSgpOiAiCisgICAgICAgIDw8IGtleQorICAgICAgICA8PCAiICgnbmFtZScsICdzdGF0dXMnLCAndGltZScsIGFuZCAnY2xhc3NuYW1lJyBhcmUgcmVzZXJ2ZWQgYnkgIgorICAgICAgICA8PCBHVEVTVF9OQU1FXyA8PCAiKSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBDbGVhcnMgdGhlIG9iamVjdC4KK3ZvaWQgVGVzdFJlc3VsdDo6Q2xlYXIoKSB7CisgIHRlc3RfcGFydF9yZXN1bHRzXy5jbGVhcigpOworICB0ZXN0X3Byb3BlcnRpZXNfLmNsZWFyKCk7CisgIGRlYXRoX3Rlc3RfY291bnRfID0gMDsKKyAgZWxhcHNlZF90aW1lXyA9IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmFpbGVkLgorYm9vbCBUZXN0UmVzdWx0OjpGYWlsZWQoKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfcGFydF9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoR2V0VGVzdFBhcnRSZXN1bHQoaSkuZmFpbGVkKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KK3N0YXRpYyBib29sIFRlc3RQYXJ0RmF0YWxseUZhaWxlZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiByZXN1bHQuZmF0YWxseV9mYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYXRhbGx5IGZhaWxlZC4KK2Jvb2wgVGVzdFJlc3VsdDo6SGFzRmF0YWxGYWlsdXJlKCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X3BhcnRfcmVzdWx0c18sIFRlc3RQYXJ0RmF0YWxseUZhaWxlZCkgPiAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgorc3RhdGljIGJvb2wgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgcmV0dXJuIHJlc3VsdC5ub25mYXRhbGx5X2ZhaWxlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorYm9vbCBUZXN0UmVzdWx0OjpIYXNOb25mYXRhbEZhaWx1cmUoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfcGFydF9yZXN1bHRzXywgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKSA+IDA7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBwYXJ0cy4gIFRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyCisvLyBvZiBzdWNjZXNzZnVsIHRlc3QgcGFydHMgYW5kIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgcGFydHMuCitpbnQgVGVzdFJlc3VsdDo6dG90YWxfcGFydF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9wYXJ0X3Jlc3VsdHNfLnNpemUoKSk7Cit9CisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgdGVzdCBwcm9wZXJ0aWVzLgoraW50IFRlc3RSZXN1bHQ6OnRlc3RfcHJvcGVydHlfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfcHJvcGVydGllc18uc2l6ZSgpKTsKK30KKworLy8gY2xhc3MgVGVzdAorCisvLyBDcmVhdGVzIGEgVGVzdCBvYmplY3QuCisKKy8vIFRoZSBjJ3RvciBzYXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncy4KK1Rlc3Q6OlRlc3QoKQorICAgIDogZ3Rlc3RfZmxhZ19zYXZlcl8obmV3IGludGVybmFsOjpHVGVzdEZsYWdTYXZlcikgeworfQorCisvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCitUZXN0Ojp+VGVzdCgpIHsKKyAgZGVsZXRlIGd0ZXN0X2ZsYWdfc2F2ZXJfOworfQorCisvLyBTZXRzIHVwIHRoZSB0ZXN0IGZpeHR1cmUuCisvLworLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuCit2b2lkIFRlc3Q6OlNldFVwKCkgeworfQorCisvLyBUZWFycyBkb3duIHRoZSB0ZXN0IGZpeHR1cmUuCisvLworLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuCit2b2lkIFRlc3Q6OlRlYXJEb3duKCkgeworfQorCisvLyBBbGxvd3MgdXNlciBzdXBwbGllZCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgcmVjb3JkZWQgZm9yIGxhdGVyIG91dHB1dC4KK3ZvaWQgVGVzdDo6UmVjb3JkUHJvcGVydHkoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UmVjb3JkUHJvcGVydHlGb3JDdXJyZW50VGVzdChrZXksIHZhbHVlKTsKK30KKworLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuCit2b2lkIFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgaW50IHZhbHVlKSB7CisgIE1lc3NhZ2UgdmFsdWVfbWVzc2FnZTsKKyAgdmFsdWVfbWVzc2FnZSA8PCB2YWx1ZTsKKyAgUmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZV9tZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit2b2lkIFJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgbWVzc2FnZSkgeworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgZnJpZW5kIG9mIFVuaXRUZXN0IGFuZCBhcyBzdWNoIGhhcyBhY2Nlc3MgdG8KKyAgLy8gQWRkVGVzdFBhcnRSZXN1bHQuCisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5BZGRUZXN0UGFydFJlc3VsdCgKKyAgICAgIHJlc3VsdF90eXBlLAorICAgICAgTlVMTCwgIC8vIE5vIGluZm8gYWJvdXQgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCisgICAgICAtMSwgICAgLy8gV2UgaGF2ZSBubyBpbmZvIG9uIHdoaWNoIGxpbmUgY2F1c2VkIHRoZSBleGNlcHRpb24uCisgICAgICBtZXNzYWdlLAorICAgICAgU3RyaW5nKCkpOyAgLy8gTm8gc3RhY2sgdHJhY2UsIGVpdGhlci4KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisvLyBXZSBhcmUgb24gV2luZG93cy4KKworLy8gQWRkcyBhbiAiZXhjZXB0aW9uIHRocm93biIgZmF0YWwgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0Lgorc3RhdGljIHZvaWQgQWRkRXhjZXB0aW9uVGhyb3duRmFpbHVyZShEV09SRCBleGNlcHRpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyAgTWVzc2FnZSBtZXNzYWdlOworICBtZXNzYWdlIDw8ICJFeGNlcHRpb24gdGhyb3duIHdpdGggY29kZSAweCIgPDwgc3RkOjpzZXRiYXNlKDE2KSA8PAorICAgIGV4Y2VwdGlvbl9jb2RlIDw8IHN0ZDo6c2V0YmFzZSgxMCkgPDwgIiBpbiAiIDw8IGxvY2F0aW9uIDw8ICIuIjsKKworICBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0U3RyaW5nKCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gR29vZ2xlIFRlc3QgcmVxdWlyZXMgYWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSB0byB1c2UgdGhlIHNhbWUgdGVzdAorLy8gZml4dHVyZSBjbGFzcy4gIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjdXJyZW50IHRlc3QgaGFzIHRoZQorLy8gc2FtZSBmaXh0dXJlIGNsYXNzIGFzIHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjdXJyZW50IHRlc3QgY2FzZS4gIElmCisvLyB5ZXMsIGl0IHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGl0IGdlbmVyYXRlcyBhIEdvb2dsZSBUZXN0IGZhaWx1cmUgYW5kCisvLyByZXR1cm5zIGZhbHNlLgorYm9vbCBUZXN0OjpIYXNTYW1lRml4dHVyZUNsYXNzKCkgeworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gaW1wbC0+Y3VycmVudF90ZXN0X2Nhc2UoKTsKKworICAvLyBJbmZvIGFib3V0IHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjdXJyZW50IHRlc3QgY2FzZS4KKyAgY29uc3QgaW50ZXJuYWw6OlRlc3RJbmZvSW1wbCogY29uc3QgZmlyc3RfdGVzdF9pbmZvID0KKyAgICAgIHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVswXS0+aW1wbCgpOworICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIGZpcnN0X2ZpeHR1cmVfaWQgPSBmaXJzdF90ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWQoKTsKKyAgY29uc3QgY2hhciogY29uc3QgZmlyc3RfdGVzdF9uYW1lID0gZmlyc3RfdGVzdF9pbmZvLT5uYW1lKCk7CisKKyAgLy8gSW5mbyBhYm91dCB0aGUgY3VycmVudCB0ZXN0LgorICBjb25zdCBpbnRlcm5hbDo6VGVzdEluZm9JbXBsKiBjb25zdCB0aGlzX3Rlc3RfaW5mbyA9CisgICAgICBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpLT5pbXBsKCk7CisgIGNvbnN0IGludGVybmFsOjpUeXBlSWQgdGhpc19maXh0dXJlX2lkID0gdGhpc190ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWQoKTsKKyAgY29uc3QgY2hhciogY29uc3QgdGhpc190ZXN0X25hbWUgPSB0aGlzX3Rlc3RfaW5mby0+bmFtZSgpOworCisgIGlmICh0aGlzX2ZpeHR1cmVfaWQgIT0gZmlyc3RfZml4dHVyZV9pZCkgeworICAgIC8vIElzIHRoZSBmaXJzdCB0ZXN0IGRlZmluZWQgdXNpbmcgVEVTVD8KKyAgICBjb25zdCBib29sIGZpcnN0X2lzX1RFU1QgPSBmaXJzdF9maXh0dXJlX2lkID09IGludGVybmFsOjpHZXRUZXN0VHlwZUlkKCk7CisgICAgLy8gSXMgdGhpcyB0ZXN0IGRlZmluZWQgdXNpbmcgVEVTVD8KKyAgICBjb25zdCBib29sIHRoaXNfaXNfVEVTVCA9IHRoaXNfZml4dHVyZV9pZCA9PSBpbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpOworCisgICAgaWYgKGZpcnN0X2lzX1RFU1QgfHwgdGhpc19pc19URVNUKSB7CisgICAgICAvLyBUaGUgdXNlciBtaXhlZCBURVNUIGFuZCBURVNUX0YgaW4gdGhpcyB0ZXN0IGNhc2UgLSB3ZSdsbCB0ZWxsCisgICAgICAvLyBoaW0vaGVyIGhvdyB0byBmaXggaXQuCisKKyAgICAgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIFRFU1QgYW5kIHRoZSBuYW1lIG9mIHRoZSBURVNUX0YuICBOb3RlCisgICAgICAvLyB0aGF0IGZpcnN0X2lzX1RFU1QgYW5kIHRoaXNfaXNfVEVTVCBjYW5ub3QgYm90aCBiZSB0cnVlLCBhcworICAgICAgLy8gdGhlIGZpeHR1cmUgSURzIGFyZSBkaWZmZXJlbnQgZm9yIHRoZSB0d28gdGVzdHMuCisgICAgICBjb25zdCBjaGFyKiBjb25zdCBURVNUX25hbWUgPQorICAgICAgICAgIGZpcnN0X2lzX1RFU1QgPyBmaXJzdF90ZXN0X25hbWUgOiB0aGlzX3Rlc3RfbmFtZTsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IFRFU1RfRl9uYW1lID0KKyAgICAgICAgICBmaXJzdF9pc19URVNUID8gdGhpc190ZXN0X25hbWUgOiBmaXJzdF90ZXN0X25hbWU7CisKKyAgICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKKyAgICAgICAgICA8PCAiY2xhc3MsIHNvIG1peGluZyBURVNUX0YgYW5kIFRFU1QgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIGlzXG4iCisgICAgICAgICAgPDwgImlsbGVnYWwuICBJbiB0ZXN0IGNhc2UgIiA8PCB0aGlzX3Rlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKQorICAgICAgICAgIDw8ICIsXG4iCisgICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX0ZfbmFtZSA8PCAiIGlzIGRlZmluZWQgdXNpbmcgVEVTVF9GIGJ1dFxuIgorICAgICAgICAgIDw8ICJ0ZXN0ICIgPDwgVEVTVF9uYW1lIDw8ICIgaXMgZGVmaW5lZCB1c2luZyBURVNULiAgWW91IHByb2JhYmx5XG4iCisgICAgICAgICAgPDwgIndhbnQgdG8gY2hhbmdlIHRoZSBURVNUIHRvIFRFU1RfRiBvciBtb3ZlIGl0IHRvIGFub3RoZXIgdGVzdFxuIgorICAgICAgICAgIDw8ICJjYXNlLiI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSB1c2VyIGRlZmluZWQgdHdvIGZpeHR1cmUgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4KKyAgICAgIC8vIHR3byBuYW1lc3BhY2VzIC0gd2UnbGwgdGVsbCBoaW0vaGVyIGhvdyB0byBmaXggaXQuCisgICAgICBBRERfRkFJTFVSRSgpCisgICAgICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCisgICAgICAgICAgPDwgImNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlICIKKyAgICAgICAgICA8PCB0aGlzX3Rlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSA8PCAiLFxuIgorICAgICAgICAgIDw8ICJ5b3UgZGVmaW5lZCB0ZXN0ICIgPDwgZmlyc3RfdGVzdF9uYW1lCisgICAgICAgICAgPDwgIiBhbmQgdGVzdCAiIDw8IHRoaXNfdGVzdF9uYW1lIDw8ICJcbiIKKyAgICAgICAgICA8PCAidXNpbmcgdHdvIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgY2xhc3Nlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZlxuIgorICAgICAgICAgIDw8ICJ0aGUgdHdvIGNsYXNzZXMgYXJlIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgb3IgdHJhbnNsYXRpb25cbiIKKyAgICAgICAgICA8PCAidW5pdHMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgcmVuYW1lIG9uZVxuIgorICAgICAgICAgIDw8ICJvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50IHRlc3QgY2FzZXMuIjsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJ1bnMgdGhlIHRlc3QgYW5kIHVwZGF0ZXMgdGhlIHRlc3QgcmVzdWx0Lgordm9pZCBUZXN0OjpSdW4oKSB7CisgIGlmICghSGFzU2FtZUZpeHR1cmVDbGFzcygpKSByZXR1cm47CisKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyNpZiBHVEVTVF9IQVNfU0VICisgIC8vIENhdGNoIFNFSC1zdHlsZSBleGNlcHRpb25zLgorICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBfX3RyeSB7CisgICAgU2V0VXAoKTsKKyAgfSBfX2V4Y2VwdChpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoCisgICAgICBHZXRFeGNlcHRpb25Db2RlKCkpKSB7CisgICAgQWRkRXhjZXB0aW9uVGhyb3duRmFpbHVyZShHZXRFeGNlcHRpb25Db2RlKCksICJTZXRVcCgpIik7CisgIH0KKworICAvLyBXZSB3aWxsIHJ1biB0aGUgdGVzdCBvbmx5IGlmIFNldFVwKCkgaGFkIG5vIGZhdGFsIGZhaWx1cmUuCisgIGlmICghSGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICAgIF9fdHJ5IHsKKyAgICAgIFRlc3RCb2R5KCk7CisgICAgfSBfX2V4Y2VwdChpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoCisgICAgICAgIEdldEV4Y2VwdGlvbkNvZGUoKSkpIHsKKyAgICAgIEFkZEV4Y2VwdGlvblRocm93bkZhaWx1cmUoR2V0RXhjZXB0aW9uQ29kZSgpLCAidGhlIHRlc3QgYm9keSIpOworICAgIH0KKyAgfQorCisgIC8vIEhvd2V2ZXIsIHdlIHdhbnQgdG8gY2xlYW4gdXAgYXMgbXVjaCBhcyBwb3NzaWJsZS4gIEhlbmNlIHdlIHdpbGwKKyAgLy8gYWx3YXlzIGNhbGwgVGVhckRvd24oKSwgZXZlbiBpZiBTZXRVcCgpIG9yIHRoZSB0ZXN0IGJvZHkgaGFzCisgIC8vIGZhaWxlZC4KKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgX190cnkgeworICAgIFRlYXJEb3duKCk7CisgIH0gX19leGNlcHQoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKAorICAgICAgR2V0RXhjZXB0aW9uQ29kZSgpKSkgeworICAgIEFkZEV4Y2VwdGlvblRocm93bkZhaWx1cmUoR2V0RXhjZXB0aW9uQ29kZSgpLCAiVGVhckRvd24oKSIpOworICB9CisKKyNlbHNlICAvLyBXZSBhcmUgb24gYSBjb21waWxlciBvciBwbGF0Zm9ybSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBTRUguCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIFNldFVwKCk7CisKKyAgLy8gV2Ugd2lsbCBydW4gdGhlIHRlc3Qgb25seSBpZiBTZXRVcCgpIHdhcyBzdWNjZXNzZnVsLgorICBpZiAoIUhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgICBUZXN0Qm9keSgpOworICB9CisKKyAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgSGVuY2Ugd2Ugd2lsbAorICAvLyBhbHdheXMgY2FsbCBUZWFyRG93bigpLCBldmVuIGlmIFNldFVwKCkgb3IgdGhlIHRlc3QgYm9keSBoYXMKKyAgLy8gZmFpbGVkLgorICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBUZWFyRG93bigpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICit9CisKKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIGZhdGFsIGZhaWx1cmUuCitib29sIFRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5IYXNGYXRhbEZhaWx1cmUoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorYm9vbCBUZXN0OjpIYXNOb25mYXRhbEZhaWx1cmUoKSB7CisgIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+CisgICAgICBIYXNOb25mYXRhbEZhaWx1cmUoKTsKK30KKworLy8gY2xhc3MgVGVzdEluZm8KKworLy8gQ29uc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gSXQgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHRlc3QgZmFjdG9yeQorLy8gb2JqZWN0IHZpYSBpbXBsXy4KK1Rlc3RJbmZvOjpUZXN0SW5mbyhjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9jb21tZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkgeworICBpbXBsXyA9IG5ldyBpbnRlcm5hbDo6VGVzdEluZm9JbXBsKHRoaXMsIGFfdGVzdF9jYXNlX25hbWUsIGFfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhX3Rlc3RfY2FzZV9jb21tZW50LCBhX2NvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4dHVyZV9jbGFzc19pZCwgZmFjdG9yeSk7Cit9CisKKy8vIERlc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4KK1Rlc3RJbmZvOjp+VGVzdEluZm8oKSB7CisgIGRlbGV0ZSBpbXBsXzsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQ3JlYXRlcyBhIG5ldyBUZXN0SW5mbyBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEdvb2dsZSBUZXN0OworLy8gcmV0dXJucyB0aGUgY3JlYXRlZCBvYmplY3QuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6ICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIG5hbWU6ICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QKKy8vICAgdGVzdF9jYXNlX2NvbW1lbnQ6IGEgY29tbWVudCBvbiB0aGUgdGVzdCBjYXNlIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbgorLy8gICAgICAgICAgICAgICAgICAgICAgdGhlIHRlc3Qgb3V0cHV0CisvLyAgIGNvbW1lbnQ6ICAgICAgICAgIGEgY29tbWVudCBvbiB0aGUgdGVzdCB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisvLyAgICAgICAgICAgICAgICAgICAgIHRlc3Qgb3V0cHV0CisvLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKy8vICAgc2V0X3VwX3RjOiAgICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKy8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIG5ld2x5IGNyZWF0ZWQgVGVzdEluZm8gaW5zdGFuY2Ugd2lsbCBhc3N1bWUKKy8vICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KK1Rlc3RJbmZvKiBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfY29tbWVudCwgY29uc3QgY2hhciogY29tbWVudCwKKyAgICBUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICBTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgVGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgIFRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkgeworICBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgICAgIG5ldyBUZXN0SW5mbyh0ZXN0X2Nhc2VfbmFtZSwgbmFtZSwgdGVzdF9jYXNlX2NvbW1lbnQsIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgZml4dHVyZV9jbGFzc19pZCwgZmFjdG9yeSk7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5BZGRUZXN0SW5mbyhzZXRfdXBfdGMsIHRlYXJfZG93bl90YywgdGVzdF9pbmZvKTsKKyAgcmV0dXJuIHRlc3RfaW5mbzsKK30KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCit2b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgTWVzc2FnZSBlcnJvcnM7CisgIGVycm9ycworICAgICAgPDwgIkF0dGVtcHRlZCByZWRlZmluaXRpb24gb2YgdGVzdCBjYXNlICIgPDwgdGVzdF9jYXNlX25hbWUgPDwgIi5cbiIKKyAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgorICAgICAgPDwgImNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlICIgPDwgdGVzdF9jYXNlX25hbWUgPDwgIiwgeW91IHRyaWVkXG4iCisgICAgICA8PCAidG8gZGVmaW5lIGEgdGVzdCB1c2luZyBhIGZpeHR1cmUgY2xhc3MgZGlmZmVyZW50IGZyb20gdGhlIG9uZVxuIgorICAgICAgPDwgInVzZWQgZWFybGllci4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB0d28gZml4dHVyZSBjbGFzc2VzIGFyZVxuIgorICAgICAgPDwgImZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gWW91IHNob3VsZFxuIgorICAgICAgPDwgInByb2JhYmx5IHJlbmFtZSBvbmUgb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudFxuIgorICAgICAgPDwgInRlc3QgY2FzZXMuIjsKKworICBmcHJpbnRmKHN0ZGVyciwgIiVzICVzIiwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCksCisgICAgICAgICAgZXJyb3JzLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIG5hbWUuCitjb25zdCBjaGFyKiBUZXN0SW5mbzo6dGVzdF9jYXNlX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+dGVzdF9jYXNlX25hbWUoKTsKK30KKworLy8gUmV0dXJucyB0aGUgdGVzdCBuYW1lLgorY29uc3QgY2hhciogVGVzdEluZm86Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+bmFtZSgpOworfQorCisvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgY29tbWVudC4KK2NvbnN0IGNoYXIqIFRlc3RJbmZvOjp0ZXN0X2Nhc2VfY29tbWVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50ZXN0X2Nhc2VfY29tbWVudCgpOworfQorCisvLyBSZXR1cm5zIHRoZSB0ZXN0IGNvbW1lbnQuCitjb25zdCBjaGFyKiBUZXN0SW5mbzo6Y29tbWVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5jb21tZW50KCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRlc3Qgc2hvdWxkIHJ1bi4KK2Jvb2wgVGVzdEluZm86OnNob3VsZF9ydW4oKSBjb25zdCB7IHJldHVybiBpbXBsXy0+c2hvdWxkX3J1bigpOyB9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRlc3QgbWF0Y2hlcyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyLgorYm9vbCBUZXN0SW5mbzo6bWF0Y2hlc19maWx0ZXIoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+bWF0Y2hlc19maWx0ZXIoKTsgfQorCisvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuCitjb25zdCBUZXN0UmVzdWx0KiBUZXN0SW5mbzo6cmVzdWx0KCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPnJlc3VsdCgpOyB9CisKKy8vIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiBkZWF0aCB0ZXN0cyBlbmNvdW50ZXJlZCBpbiB0aGlzIHRlc3Qgc28KKy8vIGZhci4KK2ludCBUZXN0SW5mbzo6aW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7CisgIHJldHVybiBpbXBsXy0+cmVzdWx0KCktPmluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCk7Cit9CisKK25hbWVzcGFjZSB7CisKKy8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSB0ZXN0IG5hbWUgb2YgYSBUZXN0SW5mbyBhZ2FpbnN0IGEga25vd24KKy8vIHZhbHVlLgorLy8KKy8vIFRoaXMgaXMgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRlc3RDYXNlIGNsYXNzIG9ubHkuICBXZSBwdXQKKy8vIGl0IGluIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlIHRvIHByZXZlbnQgcG9sbHV0aW5nIHRoZSBvdXRlcgorLy8gbmFtZXNwYWNlLgorLy8KKy8vIFRlc3ROYW1lSXMgaXMgY29weWFibGUuCitjbGFzcyBUZXN0TmFtZUlzIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICAvLworICAvLyBUZXN0TmFtZUlzIGhhcyBOTyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICBleHBsaWNpdCBUZXN0TmFtZUlzKGNvbnN0IGNoYXIqIG5hbWUpCisgICAgICA6IG5hbWVfKG5hbWUpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBuYW1lIG9mIHRlc3RfaW5mbyBtYXRjaGVzIG5hbWVfLgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGVzdEluZm8gKiB0ZXN0X2luZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9pbmZvICYmIGludGVybmFsOjpTdHJpbmcodGVzdF9pbmZvLT5uYW1lKCkpLkNvbXBhcmUobmFtZV8pID09IDA7CisgIH0KKworIHByaXZhdGU6CisgIGludGVybmFsOjpTdHJpbmcgbmFtZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBtZXRob2QgZXhwYW5kcyBhbGwgcGFyYW1ldGVyaXplZCB0ZXN0cyByZWdpc3RlcmVkIHdpdGggbWFjcm9zIFRFU1RfUAorLy8gYW5kIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIGludG8gcmVndWxhciB0ZXN0cyBhbmQgcmVnaXN0ZXJzIHRob3NlLgorLy8gVGhpcyB3aWxsIGJlIGRvbmUganVzdCBvbmNlIGR1cmluZyB0aGUgcHJvZ3JhbSBydW50aW1lLgordm9pZCBVbml0VGVzdEltcGw6OlJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkgeworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIGlmICghcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXykgeworICAgIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV8uUmVnaXN0ZXJUZXN0cygpOworICAgIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8gPSB0cnVlOworICB9CisjZW5kaWYKK30KKworLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QsIHJ1bnMgaXQsIHJlY29yZHMgaXRzIHJlc3VsdCwgYW5kIHRoZW4KKy8vIGRlbGV0ZXMgaXQuCit2b2lkIFRlc3RJbmZvSW1wbDo6UnVuKCkgeworICBpZiAoIXNob3VsZF9ydW5fKSByZXR1cm47CisKKyAgLy8gVGVsbHMgVW5pdFRlc3Qgd2hlcmUgdG8gc3RvcmUgdGVzdCByZXN1bHQuCisgIFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaW1wbC0+c2V0X2N1cnJlbnRfdGVzdF9pbmZvKHBhcmVudF8pOworCisgIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlciA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5yZXBlYXRlcigpOworCisgIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSB0ZXN0IGlzIGFib3V0IHRvIHN0YXJ0LgorICByZXBlYXRlci0+T25UZXN0U3RhcnQoKnBhcmVudF8pOworCisgIGNvbnN0IFRpbWVJbk1pbGxpcyBzdGFydCA9IEdldFRpbWVJbk1pbGxpcygpOworCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisjaWYgR1RFU1RfSEFTX1NFSAorICAvLyBDYXRjaCBTRUgtc3R5bGUgZXhjZXB0aW9ucy4KKyAgVGVzdCogdGVzdCA9IE5VTEw7CisKKyAgX190cnkgeworICAgIC8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LgorICAgIHRlc3QgPSBmYWN0b3J5Xy0+Q3JlYXRlVGVzdCgpOworICB9IF9fZXhjZXB0KGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6OkdUZXN0U2hvdWxkUHJvY2Vzc1NFSCgKKyAgICAgIEdldEV4Y2VwdGlvbkNvZGUoKSkpIHsKKyAgICBBZGRFeGNlcHRpb25UaHJvd25GYWlsdXJlKEdldEV4Y2VwdGlvbkNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgdGVzdCBmaXh0dXJlJ3MgY29uc3RydWN0b3IiKTsKKyAgICByZXR1cm47CisgIH0KKyNlbHNlICAvLyBXZSBhcmUgb24gYSBjb21waWxlciBvciBwbGF0Zm9ybSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBTRUguCisKKyAgLy8gVE9ETyh3YW4pOiBJZiB0ZXN0LT5SdW4oKSB0aHJvd3MsIHRlc3Qgd29uJ3QgYmUgZGVsZXRlZC4gIFRoaXMgaXMKKyAgLy8gbm90IGEgcHJvYmxlbSBub3cgYXMgd2UgZG9uJ3QgdXNlIGV4Y2VwdGlvbnMuICBJZiB3ZSB3ZXJlIHRvCisgIC8vIGVuYWJsZSBleGNlcHRpb25zLCB3ZSBzaG91bGQgcmV2aXNlIHRoZSBmb2xsb3dpbmcgdG8gYmUKKyAgLy8gZXhjZXB0aW9uLXNhZmUuCisKKyAgLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QuCisgIFRlc3QqIHRlc3QgPSBmYWN0b3J5Xy0+Q3JlYXRlVGVzdCgpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyAgLy8gUnVucyB0aGUgdGVzdCBvbmx5IGlmIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgdGVzdCBmaXh0dXJlIGRpZG4ndAorICAvLyBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUuCisgIGlmICghVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICB0ZXN0LT5SdW4oKTsKKyAgfQorCisgIC8vIERlbGV0ZXMgdGhlIHRlc3Qgb2JqZWN0LgorICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBkZWxldGUgdGVzdDsKKyAgdGVzdCA9IE5VTEw7CisKKyAgcmVzdWx0Xy5zZXRfZWxhcHNlZF90aW1lKEdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQpOworCisgIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCBhIHRlc3QgaGFzIGp1c3QgZmluaXNoZWQuCisgIHJlcGVhdGVyLT5PblRlc3RFbmQoKnBhcmVudF8pOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHRvIHN0b3AgYXNzb2NpYXRpbmcgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gdGhpcworICAvLyB0ZXN0LgorICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8oTlVMTCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBjbGFzcyBUZXN0Q2FzZQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK2ludCBUZXN0Q2FzZTo6c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RQYXNzZWQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgoraW50IFRlc3RDYXNlOjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0RmFpbGVkKTsKK30KKworaW50IFRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3REaXNhYmxlZCk7Cit9CisKKy8vIEdldCB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBUZXN0Q2FzZTo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgU2hvdWxkUnVuVGVzdCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCitpbnQgVGVzdENhc2U6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfaW5mb19saXN0Xy5zaXplKCkpOworfQorCisvLyBDcmVhdGVzIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKy8vCisvLyBBcmd1bWVudHM6CisvLworLy8gICBuYW1lOiAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisvLyAgIHRlYXJfZG93bl90YzogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKK1Rlc3RDYXNlOjpUZXN0Q2FzZShjb25zdCBjaGFyKiBhX25hbWUsIGNvbnN0IGNoYXIqIGFfY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKQorICAgIDogbmFtZV8oYV9uYW1lKSwKKyAgICAgIGNvbW1lbnRfKGFfY29tbWVudCksCisgICAgICBzZXRfdXBfdGNfKHNldF91cF90YyksCisgICAgICB0ZWFyX2Rvd25fdGNfKHRlYXJfZG93bl90YyksCisgICAgICBzaG91bGRfcnVuXyhmYWxzZSksCisgICAgICBlbGFwc2VkX3RpbWVfKDApIHsKK30KKworLy8gRGVzdHJ1Y3RvciBvZiBUZXN0Q2FzZS4KK1Rlc3RDYXNlOjp+VGVzdENhc2UoKSB7CisgIC8vIERlbGV0ZXMgZXZlcnkgVGVzdCBpbiB0aGUgY29sbGVjdGlvbi4KKyAgRm9yRWFjaCh0ZXN0X2luZm9fbGlzdF8sIGludGVybmFsOjpEZWxldGU8VGVzdEluZm8+KTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorY29uc3QgVGVzdEluZm8qIFRlc3RDYXNlOjpHZXRUZXN0SW5mbyhpbnQgaSkgY29uc3QgeworICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9pbmRpY2VzXywgaSwgLTEpOworICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfaW5mb19saXN0X1tpbmRleF07Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KK1Rlc3RJbmZvKiBUZXN0Q2FzZTo6R2V0TXV0YWJsZVRlc3RJbmZvKGludCBpKSB7CisgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7CisgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9pbmZvX2xpc3RfW2luZGV4XTsKK30KKworLy8gQWRkcyBhIHRlc3QgdG8gdGhpcyB0ZXN0IGNhc2UuICBXaWxsIGRlbGV0ZSB0aGUgdGVzdCB1cG9uCisvLyBkZXN0cnVjdGlvbiBvZiB0aGUgVGVzdENhc2Ugb2JqZWN0Lgordm9pZCBUZXN0Q2FzZTo6QWRkVGVzdEluZm8oVGVzdEluZm8gKiB0ZXN0X2luZm8pIHsKKyAgdGVzdF9pbmZvX2xpc3RfLnB1c2hfYmFjayh0ZXN0X2luZm8pOworICB0ZXN0X2luZGljZXNfLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfaW5kaWNlc18uc2l6ZSgpKSk7Cit9CisKKy8vIFJ1bnMgZXZlcnkgdGVzdCBpbiB0aGlzIFRlc3RDYXNlLgordm9pZCBUZXN0Q2FzZTo6UnVuKCkgeworICBpZiAoIXNob3VsZF9ydW5fKSByZXR1cm47CisKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaW1wbC0+c2V0X2N1cnJlbnRfdGVzdF9jYXNlKHRoaXMpOworCisgIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlciA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5yZXBlYXRlcigpOworCisgIHJlcGVhdGVyLT5PblRlc3RDYXNlU3RhcnQoKnRoaXMpOworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBzZXRfdXBfdGNfKCk7CisKKyAgY29uc3QgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBzdGFydCA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbF90ZXN0X2NvdW50KCk7IGkrKykgeworICAgIEdldE11dGFibGVUZXN0SW5mbyhpKS0+aW1wbCgpLT5SdW4oKTsKKyAgfQorICBlbGFwc2VkX3RpbWVfID0gaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQ7CisKKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgdGVhcl9kb3duX3RjXygpOworICByZXBlYXRlci0+T25UZXN0Q2FzZUVuZCgqdGhpcyk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZShOVUxMKTsKK30KKworLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OkNsZWFyUmVzdWx0KCkgeworICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgaW50ZXJuYWw6OlRlc3RJbmZvSW1wbDo6Q2xlYXJUZXN0UmVzdWx0KTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IHBhc3NlZC4KK2Jvb2wgVGVzdENhc2U6OlRlc3RQYXNzZWQoY29uc3QgVGVzdEluZm8gKiB0ZXN0X2luZm8pIHsKKyAgY29uc3QgaW50ZXJuYWw6OlRlc3RJbmZvSW1wbCogY29uc3QgaW1wbCA9IHRlc3RfaW5mby0+aW1wbCgpOworICByZXR1cm4gaW1wbC0+c2hvdWxkX3J1bigpICYmIGltcGwtPnJlc3VsdCgpLT5QYXNzZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGZhaWxlZC4KK2Jvb2wgVGVzdENhc2U6OlRlc3RGYWlsZWQoY29uc3QgVGVzdEluZm8gKiB0ZXN0X2luZm8pIHsKKyAgY29uc3QgaW50ZXJuYWw6OlRlc3RJbmZvSW1wbCogY29uc3QgaW1wbCA9IHRlc3RfaW5mby0+aW1wbCgpOworICByZXR1cm4gaW1wbC0+c2hvdWxkX3J1bigpICYmIGltcGwtPnJlc3VsdCgpLT5GYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGlzIGRpc2FibGVkLgorYm9vbCBUZXN0Q2FzZTo6VGVzdERpc2FibGVkKGNvbnN0IFRlc3RJbmZvICogdGVzdF9pbmZvKSB7CisgIHJldHVybiB0ZXN0X2luZm8tPmltcGwoKS0+aXNfZGlzYWJsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0ZXN0IHNob3VsZCBydW4uCitib29sIFRlc3RDYXNlOjpTaG91bGRSdW5UZXN0KGNvbnN0IFRlc3RJbmZvICp0ZXN0X2luZm8pIHsKKyAgcmV0dXJuIHRlc3RfaW5mby0+aW1wbCgpLT5zaG91bGRfcnVuKCk7Cit9CisKKy8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OlNodWZmbGVUZXN0cyhpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20pIHsKKyAgU2h1ZmZsZShyYW5kb20sICZ0ZXN0X2luZGljZXNfKTsKK30KKworLy8gUmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgdG8gYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgordm9pZCBUZXN0Q2FzZTo6VW5zaHVmZmxlVGVzdHMoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9pbmRpY2VzXy5zaXplKCk7IGkrKykgeworICAgIHRlc3RfaW5kaWNlc19baV0gPSBzdGF0aWNfY2FzdDxpbnQ+KGkpOworICB9Cit9CisKKy8vIEZvcm1hdHMgYSBjb3VudGFibGUgbm91bi4gIERlcGVuZGluZyBvbiBpdHMgcXVhbnRpdHksIGVpdGhlciB0aGUKKy8vIHNpbmd1bGFyIGZvcm0gb3IgdGhlIHBsdXJhbCBmb3JtIGlzIHVzZWQuIGUuZy4KKy8vCisvLyBGb3JtYXRDb3VudGFibGVOb3VuKDEsICJmb3JtdWxhIiwgImZvcm11bGkiKSByZXR1cm5zICIxIGZvcm11bGEiLgorLy8gRm9ybWF0Q291bnRhYmxlTm91big1LCAiYm9vayIsICJib29rcyIpIHJldHVybnMgIjUgYm9va3MiLgorc3RhdGljIGludGVybmFsOjpTdHJpbmcgRm9ybWF0Q291bnRhYmxlTm91bihpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBzaW5ndWxhcl9mb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogcGx1cmFsX2Zvcm0pIHsKKyAgcmV0dXJuIGludGVybmFsOjpTdHJpbmc6OkZvcm1hdCgiJWQgJXMiLCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9PSAxID8gc2luZ3VsYXJfZm9ybSA6IHBsdXJhbF9mb3JtKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdHMuCitzdGF0aWMgaW50ZXJuYWw6OlN0cmluZyBGb3JtYXRUZXN0Q291bnQoaW50IHRlc3RfY291bnQpIHsKKyAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jb3VudCwgInRlc3QiLCAidGVzdHMiKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdCBjYXNlcy4KK3N0YXRpYyBpbnRlcm5hbDo6U3RyaW5nIEZvcm1hdFRlc3RDYXNlQ291bnQoaW50IHRlc3RfY2FzZV9jb3VudCkgeworICByZXR1cm4gRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2VfY291bnQsICJ0ZXN0IGNhc2UiLCAidGVzdCBjYXNlcyIpOworfQorCisvLyBDb252ZXJ0cyBhIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGVudW0gdG8gaHVtYW4tZnJpZW5kbHkgc3RyaW5nCisvLyByZXByZXNlbnRhdGlvbi4gIEJvdGgga05vbkZhdGFsRmFpbHVyZSBhbmQga0ZhdGFsRmFpbHVyZSBhcmUgdHJhbnNsYXRlZAorLy8gdG8gIkZhaWx1cmUiLCBhcyB0aGUgdXNlciB1c3VhbGx5IGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgZGlmZmVyZW5jZQorLy8gYmV0d2VlbiB0aGUgdHdvIHdoZW4gdmlld2luZyB0aGUgdGVzdCByZXN1bHQuCitzdGF0aWMgY29uc3QgY2hhciAqIFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3M6CisgICAgICByZXR1cm4gIlN1Y2Nlc3MiOworCisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZToKKyAgICBjYXNlIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlOgorI2lmZGVmIF9NU0NfVkVSCisgICAgICByZXR1cm4gImVycm9yOiAiOworI2Vsc2UKKyAgICAgIHJldHVybiAiRmFpbHVyZVxuIjsKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuICJVbmtub3duIHJlc3VsdCB0eXBlIjsKK30KKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gYSBTdHJpbmcuCitzdGF0aWMgaW50ZXJuYWw6OlN0cmluZyBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgcmV0dXJuIChNZXNzYWdlKCkKKyAgICAgICAgICA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpCisgICAgICAgICAgPDwgIiAiIDw8IFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQudHlwZSgpKQorICAgICAgICAgIDw8IHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKS5HZXRTdHJpbmcoKTsKK30KKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQuCitzdGF0aWMgdm9pZCBQcmludFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgIGNvbnN0IGludGVybmFsOjpTdHJpbmcmIHJlc3VsdCA9CisgICAgICBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcodGVzdF9wYXJ0X3Jlc3VsdCk7CisgIHByaW50ZigiJXNcbiIsIHJlc3VsdC5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZG91dCk7CisgIC8vIElmIHRoZSB0ZXN0IHByb2dyYW0gcnVucyBpbiBWaXN1YWwgU3R1ZGlvIG9yIGEgZGVidWdnZXIsIHRoZQorICAvLyBmb2xsb3dpbmcgc3RhdGVtZW50cyBhZGQgdGhlIHRlc3QgcGFydCByZXN1bHQgbWVzc2FnZSB0byB0aGUgT3V0cHV0CisgIC8vIHdpbmRvdyBzdWNoIHRoYXQgdGhlIHVzZXIgY2FuIGRvdWJsZS1jbGljayBvbiBpdCB0byBqdW1wIHRvIHRoZQorICAvLyBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlIGxvY2F0aW9uOyBvdGhlcndpc2UgdGhleSBkbyBub3RoaW5nLgorI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdlIGRvbid0IGNhbGwgT3V0cHV0RGVidWdTdHJpbmcqKCkgb24gV2luZG93cyBNb2JpbGUsIGFzIHByaW50aW5nCisgIC8vIHRvIHN0ZG91dCBpcyBkb25lIGJ5IE91dHB1dERlYnVnU3RyaW5nKCkgdGhlcmUgYWxyZWFkeSAtIHdlIGRvbid0CisgIC8vIHdhbnQgdGhlIHNhbWUgbWVzc2FnZSBwcmludGVkIHR3aWNlLgorICA6Ok91dHB1dERlYnVnU3RyaW5nQShyZXN1bHQuY19zdHIoKSk7CisgIDo6T3V0cHV0RGVidWdTdHJpbmdBKCJcbiIpOworI2VuZGlmCit9CisKKy8vIGNsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitlbnVtIEdUZXN0Q29sb3IgeworICBDT0xPUl9ERUZBVUxULAorICBDT0xPUl9SRUQsCisgIENPTE9SX0dSRUVOLAorICBDT0xPUl9ZRUxMT1cKK307CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gY29sb3IuCitXT1JEIEdldENvbG9yQXR0cmlidXRlKEdUZXN0Q29sb3IgY29sb3IpIHsKKyAgc3dpdGNoIChjb2xvcikgeworICAgIGNhc2UgQ09MT1JfUkVEOiAgICByZXR1cm4gRk9SRUdST1VORF9SRUQ7CisgICAgY2FzZSBDT0xPUl9HUkVFTjogIHJldHVybiBGT1JFR1JPVU5EX0dSRUVOOworICAgIGNhc2UgQ09MT1JfWUVMTE9XOiByZXR1cm4gRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOOworICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gMDsKKyAgfQorfQorCisjZWxzZQorCisvLyBSZXR1cm5zIHRoZSBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBjb2xvci4gIENPTE9SX0RFRkFVTFQgaXMKKy8vIGFuIGludmFsaWQgaW5wdXQuCitjb25zdCBjaGFyKiBHZXRBbnNpQ29sb3JDb2RlKEdUZXN0Q29sb3IgY29sb3IpIHsKKyAgc3dpdGNoIChjb2xvcikgeworICAgIGNhc2UgQ09MT1JfUkVEOiAgICAgcmV0dXJuICIxIjsKKyAgICBjYXNlIENPTE9SX0dSRUVOOiAgIHJldHVybiAiMiI7CisgICAgY2FzZSBDT0xPUl9ZRUxMT1c6ICByZXR1cm4gIjMiOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgIH07Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0cnVlIGlmZiBHb29nbGUgVGVzdCBzaG91bGQgdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgorYm9vbCBTaG91bGRVc2VDb2xvcihib29sIHN0ZG91dF9pc190dHkpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3RfY29sb3IgPSBHVEVTVF9GTEFHKGNvbG9yKS5jX3N0cigpOworCisgIGlmIChTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJhdXRvIikpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgICAgLy8gT24gV2luZG93cyB0aGUgVEVSTSB2YXJpYWJsZSBpcyB1c3VhbGx5IG5vdCBzZXQsIGJ1dCB0aGUKKyAgICAvLyBjb25zb2xlIHRoZXJlIGRvZXMgc3VwcG9ydCBjb2xvcnMuCisgICAgcmV0dXJuIHN0ZG91dF9pc190dHk7CisjZWxzZQorICAgIC8vIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcywgd2UgcmVseSBvbiB0aGUgVEVSTSB2YXJpYWJsZS4KKyAgICBjb25zdCBjaGFyKiBjb25zdCB0ZXJtID0gcG9zaXg6OkdldEVudigiVEVSTSIpOworICAgIGNvbnN0IGJvb2wgdGVybV9zdXBwb3J0c19jb2xvciA9CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0iKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtLWNvbG9yIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybS0yNTZjb2xvciIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAibGludXgiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgImN5Z3dpbiIpOworICAgIHJldHVybiBzdGRvdXRfaXNfdHR5ICYmIHRlcm1fc3VwcG9ydHNfY29sb3I7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgfQorCisgIHJldHVybiBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ5ZXMiKSB8fAorICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidHJ1ZSIpIHx8CisgICAgICBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ0IikgfHwKKyAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgIjEiKTsKKyAgLy8gV2UgdGFrZSAieWVzIiwgInRydWUiLCAidCIsIGFuZCAiMSIgYXMgbWVhbmluZyAieWVzIi4gIElmIHRoZQorICAvLyB2YWx1ZSBpcyBuZWl0aGVyIG9uZSBvZiB0aGVzZSBub3IgImF1dG8iLCB3ZSB0cmVhdCBpdCBhcyAibm8iIHRvCisgIC8vIGJlIGNvbnNlcnZhdGl2ZS4KK30KKworLy8gSGVscGVycyBmb3IgcHJpbnRpbmcgY29sb3JlZCBzdHJpbmdzIHRvIHN0ZG91dC4gTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHdlCisvLyBjYW5ub3Qgc2ltcGx5IGVtaXQgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBoYXZlIHRoZSB0ZXJtaW5hbCBjaGFuZ2UgY29sb3JzLgorLy8gVGhpcyByb3V0aW5lIG11c3QgYWN0dWFsbHkgZW1pdCB0aGUgY2hhcmFjdGVycyByYXRoZXIgdGhhbiByZXR1cm4gYSBzdHJpbmcKKy8vIHRoYXQgd291bGQgYmUgY29sb3JlZCB3aGVuIHByaW50ZWQsIGFzIGNhbiBiZSBkb25lIG9uIExpbnV4Lgordm9pZCBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3IgY29sb3IsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfWk9TCisgIGNvbnN0IGJvb2wgdXNlX2NvbG9yID0gZmFsc2U7CisjZWxzZQorICBzdGF0aWMgY29uc3QgYm9vbCBpbl9jb2xvcl9tb2RlID0KKyAgICAgIFNob3VsZFVzZUNvbG9yKHBvc2l4OjpJc0FUVFkocG9zaXg6OkZpbGVObyhzdGRvdXQpKSAhPSAwKTsKKyAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBpbl9jb2xvcl9tb2RlICYmIChjb2xvciAhPSBDT0xPUl9ERUZBVUxUKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTiB8fCBHVEVTVF9PU19aT1MKKyAgLy8gVGhlICchPSAwJyBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IE1TVkMgNy4xLgorCisgIGlmICghdXNlX2NvbG9yKSB7CisgICAgdnByaW50ZihmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm47CisgIH0KKworI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIGNvbnN0IEhBTkRMRSBzdGRvdXRfaGFuZGxlID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKworICAvLyBHZXRzIHRoZSBjdXJyZW50IHRleHQgY29sb3IuCisgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGJ1ZmZlcl9pbmZvOworICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhzdGRvdXRfaGFuZGxlLCAmYnVmZmVyX2luZm8pOworICBjb25zdCBXT1JEIG9sZF9jb2xvcl9hdHRycyA9IGJ1ZmZlcl9pbmZvLndBdHRyaWJ1dGVzOworCisgIC8vIFdlIG5lZWQgdG8gZmx1c2ggdGhlIHN0cmVhbSBidWZmZXJzIGludG8gdGhlIGNvbnNvbGUgYmVmb3JlIGVhY2gKKyAgLy8gU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUgY2FsbCBsZXN0IGl0IGFmZmVjdCB0aGUgdGV4dCB0aGF0IGlzIGFscmVhZHkKKyAgLy8gcHJpbnRlZCBidXQgaGFzIG5vdCB5ZXQgcmVhY2hlZCB0aGUgY29uc29sZS4KKyAgZmZsdXNoKHN0ZG91dCk7CisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0ZG91dF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvbG9yQXR0cmlidXRlKGNvbG9yKSB8IEZPUkVHUk9VTkRfSU5URU5TSVRZKTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworCisgIGZmbHVzaChzdGRvdXQpOworICAvLyBSZXN0b3JlcyB0aGUgdGV4dCBjb2xvci4KKyAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwgb2xkX2NvbG9yX2F0dHJzKTsKKyNlbHNlCisgIHByaW50ZigiXDAzM1swOzMlc20iLCBHZXRBbnNpQ29sb3JDb2RlKGNvbG9yKSk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgcHJpbnRmKCJcMDMzW20iKTsgIC8vIFJlc2V0cyB0aGUgdGVybWluYWwgdG8gZGVmYXVsdC4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgdmFfZW5kKGFyZ3MpOworfQorCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFRlc3RFdmVudExpc3RlbmVyIGludGVyZmFjZS4KKy8vCisvLyBDbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIgaXMgY29weWFibGUuCitjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyKCkge30KKyAgc3RhdGljIHZvaWQgUHJpbnRUZXN0TmFtZShjb25zdCBjaGFyICogdGVzdF9jYXNlLCBjb25zdCBjaGFyICogdGVzdCkgeworICAgIHByaW50ZigiJXMuJXMiLCB0ZXN0X2Nhc2UsIHRlc3QpOworICB9CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIG92ZXJyaWRlIHdoYXQncyBpbiB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBQcmludEZhaWxlZFRlc3RzKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworCisgIGludGVybmFsOjpTdHJpbmcgdGVzdF9jYXNlX25hbWVfOworfTsKKworICAvLyBGaXJlZCBiZWZvcmUgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvblN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKEdURVNUX0ZMQUcocmVwZWF0KSAhPSAxKQorICAgIHByaW50ZigiXG5SZXBlYXRpbmcgYWxsIHRlc3RzIChpdGVyYXRpb24gJWQpIC4gLiAuXG5cbiIsIGl0ZXJhdGlvbiArIDEpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbHRlciA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOworCisgIC8vIFByaW50cyB0aGUgZmlsdGVyIGlmIGl0J3Mgbm90ICouICBUaGlzIHJlbWluZHMgdGhlIHVzZXIgdGhhdCBzb21lCisgIC8vIHRlc3RzIG1heSBiZSBza2lwcGVkLgorICBpZiAoIWludGVybmFsOjpTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZmlsdGVyLCBrVW5pdmVyc2FsRmlsdGVyKSkgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAorICAgICAgICAgICAgICAgICAgIk5vdGU6ICVzIGZpbHRlciA9ICVzXG4iLCBHVEVTVF9OQU1FXywgZmlsdGVyKTsKKyAgfQorCisgIGlmIChpbnRlcm5hbDo6U2hvdWxkU2hhcmQoa1Rlc3RUb3RhbFNoYXJkcywga1Rlc3RTaGFyZEluZGV4LCBmYWxzZSkpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiBUaGlzIGlzIHRlc3Qgc2hhcmQgJXMgb2YgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpHZXRFbnYoa1Rlc3RTaGFyZEluZGV4KSwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwb3NpeDo6R2V0RW52KGtUZXN0VG90YWxTaGFyZHMpKTsKKyAgfQorCisgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogUmFuZG9taXppbmcgdGVzdHMnIG9yZGVycyB3aXRoIGEgc2VlZCBvZiAlZCAuXG4iLAorICAgICAgICAgICAgICAgICAgdW5pdF90ZXN0LnJhbmRvbV9zZWVkKCkpOworICB9CisKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbPT09PT09PT09PV0gIik7CisgIHByaW50ZigiUnVubmluZyAlcyBmcm9tICVzLlxuIiwKKyAgICAgICAgIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3QudGVzdF90b19ydW5fY291bnQoKSkuY19zdHIoKSwKKyAgICAgICAgIEZvcm1hdFRlc3RDYXNlQ291bnQodW5pdF90ZXN0LnRlc3RfY2FzZV90b19ydW5fY291bnQoKSkuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC5cbiIpOworICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIHRlc3RfY2FzZV9uYW1lXyA9IHRlc3RfY2FzZS5uYW1lKCk7CisgIGNvbnN0IGludGVybmFsOjpTdHJpbmcgY291bnRzID0KKyAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiJXMgZnJvbSAlcyIsIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2VfbmFtZV8uY19zdHIoKSk7CisgIGlmICh0ZXN0X2Nhc2UuY29tbWVudCgpWzBdID09ICdcMCcpIHsKKyAgICBwcmludGYoIlxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCIsIHdoZXJlICVzXG4iLCB0ZXN0X2Nhc2UuY29tbWVudCgpKTsKKyAgfQorICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbIFJVTiAgICAgIF0gIik7CisgIFByaW50VGVzdE5hbWUodGVzdF9jYXNlX25hbWVfLmNfc3RyKCksIHRlc3RfaW5mby5uYW1lKCkpOworICBpZiAodGVzdF9pbmZvLmNvbW1lbnQoKVswXSA9PSAnXDAnKSB7CisgICAgcHJpbnRmKCJcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZigiLCB3aGVyZSAlc1xuIiwgdGVzdF9pbmZvLmNvbW1lbnQoKSk7CisgIH0KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIENhbGxlZCBhZnRlciBhbiBhc3NlcnRpb24gZmFpbHVyZS4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgLy8gSWYgdGhlIHRlc3QgcGFydCBzdWNjZWVkZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCisgIGlmIChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykKKyAgICByZXR1cm47CisKKyAgLy8gUHJpbnQgZmFpbHVyZSBtZXNzYWdlIGZyb20gdGhlIGFzc2VydGlvbiAoZS5nLiBleHBlY3RlZCB0aGlzIGFuZCBnb3QgdGhhdCkuCisgIFByaW50VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbICAgICAgIE9LIF0gIik7CisgIH0gZWxzZSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7CisgIH0KKyAgUHJpbnRUZXN0TmFtZSh0ZXN0X2Nhc2VfbmFtZV8uY19zdHIoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgIGlmIChHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB7CisgICAgcHJpbnRmKCIgKCVzIG1zKVxuIiwgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZygKKyAgICAgICAgICAgdGVzdF9pbmZvLnJlc3VsdCgpLT5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIGlmICghR1RFU1RfRkxBRyhwcmludF90aW1lKSkgcmV0dXJuOworCisgIHRlc3RfY2FzZV9uYW1lXyA9IHRlc3RfY2FzZS5uYW1lKCk7CisgIGNvbnN0IGludGVybmFsOjpTdHJpbmcgY291bnRzID0KKyAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiJXMgZnJvbSAlcyAoJXMgbXMgdG90YWwpXG5cbiIsCisgICAgICAgICBjb3VudHMuY19zdHIoKSwgdGVzdF9jYXNlX25hbWVfLmNfc3RyKCksCisgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93blxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIHByaW50aW5nIHRoZSBsaXN0IG9mIGZhaWxlZCB0ZXN0cy4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludEZhaWxlZFRlc3RzKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgIGlmIChmYWlsZWRfdGVzdF9jb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UgPSAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOworICAgIGlmICghdGVzdF9jYXNlLnNob3VsZF9ydW4oKSB8fCAodGVzdF9jYXNlLmZhaWxlZF90ZXN0X2NvdW50KCkgPT0gMCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraikgeworICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyA9ICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaik7CisgICAgICBpZiAoIXRlc3RfaW5mby5zaG91bGRfcnVuKCkgfHwgdGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOworICAgICAgcHJpbnRmKCIlcy4lcyIsIHRlc3RfY2FzZS5uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICAgICAgaWYgKHRlc3RfY2FzZS5jb21tZW50KClbMF0gIT0gJ1wwJyB8fAorICAgICAgICAgIHRlc3RfaW5mby5jb21tZW50KClbMF0gIT0gJ1wwJykgeworICAgICAgICBwcmludGYoIiwgd2hlcmUgJXMiLCB0ZXN0X2Nhc2UuY29tbWVudCgpKTsKKyAgICAgICAgaWYgKHRlc3RfY2FzZS5jb21tZW50KClbMF0gIT0gJ1wwJyAmJgorICAgICAgICAgICAgdGVzdF9pbmZvLmNvbW1lbnQoKVswXSAhPSAnXDAnKSB7CisgICAgICAgICAgcHJpbnRmKCIgYW5kICIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBwcmludGYoIiVzXG4iLCB0ZXN0X2luZm8uY29tbWVudCgpKTsKKyAgICB9CisgIH0KK30KKworIHZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWz09PT09PT09PT1dICIpOworICBwcmludGYoIiVzIGZyb20gJXMgcmFuLiIsCisgICAgICAgICBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnRlc3RfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCksCisgICAgICAgICBGb3JtYXRUZXN0Q2FzZUNvdW50KHVuaXRfdGVzdC50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCkpOworICBpZiAoR1RFU1RfRkxBRyhwcmludF90aW1lKSkgeworICAgIHByaW50ZigiICglcyBtcyB0b3RhbCkiLAorICAgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIH0KKyAgcHJpbnRmKCJcbiIpOworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgIFBBU1NFRCAgXSAiKTsKKyAgcHJpbnRmKCIlcy5cbiIsIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3Quc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkpLmNfc3RyKCkpOworCisgIGludCBudW1fZmFpbHVyZXMgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKCF1bml0X3Rlc3QuUGFzc2VkKCkpIHsKKyAgICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgICJbICBGQUlMRUQgIF0gIik7CisgICAgcHJpbnRmKCIlcywgbGlzdGVkIGJlbG93OlxuIiwgRm9ybWF0VGVzdENvdW50KGZhaWxlZF90ZXN0X2NvdW50KS5jX3N0cigpKTsKKyAgICBQcmludEZhaWxlZFRlc3RzKHVuaXRfdGVzdCk7CisgICAgcHJpbnRmKCJcbiUyZCBGQUlMRUQgJXNcbiIsIG51bV9mYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mYWlsdXJlcyA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CisgIH0KKworICBpbnQgbnVtX2Rpc2FibGVkID0gdW5pdF90ZXN0LmRpc2FibGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKG51bV9kaXNhYmxlZCAmJiAhR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHsKKyAgICBpZiAoIW51bV9mYWlsdXJlcykgeworICAgICAgcHJpbnRmKCJcbiIpOyAgLy8gQWRkIGEgc3BhY2VyIGlmIG5vIEZBSUxVUkUgYmFubmVyIGlzIGRpc3BsYXllZC4KKyAgICB9CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiICBZT1UgSEFWRSAlZCBESVNBQkxFRCAlc1xuXG4iLAorICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkLAorICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkID09IDEgPyAiVEVTVCIgOiAiVEVTVFMiKTsKKyAgfQorICAvLyBFbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBvdXRwdXQgaXMgcHJpbnRlZCBiZWZvcmUsIGUuZy4sIGhlYXBjaGVja2VyIG91dHB1dC4KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIEVuZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKKworLy8gY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXIKKy8vCisvLyBUaGlzIGNsYXNzIGZvcndhcmRzIGV2ZW50cyB0byBvdGhlciBldmVudCBsaXN0ZW5lcnMuCitjbGFzcyBUZXN0RXZlbnRSZXBlYXRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBUZXN0RXZlbnRSZXBlYXRlcigpIDogZm9yd2FyZGluZ19lbmFibGVkXyh0cnVlKSB7fQorICB2aXJ0dWFsIH5UZXN0RXZlbnRSZXBlYXRlcigpOworICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpOworICBUZXN0RXZlbnRMaXN0ZW5lciogUmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQorICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KKyAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmb3J3YXJkaW5nX2VuYWJsZWRfOyB9CisgIHZvaWQgc2V0X2ZvcndhcmRpbmdfZW5hYmxlZChib29sIGVuYWJsZSkgeyBmb3J3YXJkaW5nX2VuYWJsZWRfID0gZW5hYmxlOyB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKworIHByaXZhdGU6CisgIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQorICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KKyAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWRfOworICAvLyBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCByZWNlaXZlIGV2ZW50cy4KKyAgc3RkOjp2ZWN0b3I8VGVzdEV2ZW50TGlzdGVuZXIqPiBsaXN0ZW5lcnNfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEV2ZW50UmVwZWF0ZXIpOworfTsKKworVGVzdEV2ZW50UmVwZWF0ZXI6On5UZXN0RXZlbnRSZXBlYXRlcigpIHsKKyAgRm9yRWFjaChsaXN0ZW5lcnNfLCBEZWxldGU8VGVzdEV2ZW50TGlzdGVuZXI+KTsKK30KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6QXBwZW5kKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcikgeworICBsaXN0ZW5lcnNfLnB1c2hfYmFjayhsaXN0ZW5lcik7Cit9CisKKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEZhY3RvciB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgaW50byBWZWN0b3I6OkZpbmQuCitUZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50UmVwZWF0ZXI6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7ICsraSkgeworICAgIGlmIChsaXN0ZW5lcnNfW2ldID09IGxpc3RlbmVyKSB7CisgICAgICBsaXN0ZW5lcnNfLmVyYXNlKGxpc3RlbmVyc18uYmVnaW4oKSArIGkpOworICAgICAgcmV0dXJuIGxpc3RlbmVyOworICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvLyBTaW5jZSBtb3N0IG1ldGhvZHMgYXJlIHZlcnkgc2ltaWxhciwgdXNlIG1hY3JvcyB0byByZWR1Y2UgYm9pbGVycGxhdGUuCisvLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzLgorI2RlZmluZSBHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE5hbWUsIFR5cGUpIFwKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok5hbWUoY29uc3QgVHlwZSYgcGFyYW1ldGVyKSB7IFwKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7IGkrKykgeyBcCisgICAgICBsaXN0ZW5lcnNfW2ldLT5OYW1lKHBhcmFtZXRlcik7IFwKKyAgICB9IFwKKyAgfSBcCit9CisvLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzIGluIHJldmVyc2UKKy8vIG9yZGVyLgorI2RlZmluZSBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oTmFtZSwgVHlwZSkgXAordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXAorICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeyBcCisgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4obGlzdGVuZXJzXy5zaXplKCkpIC0gMTsgaSA+PSAwOyBpLS0pIHsgXAorICAgICAgbGlzdGVuZXJzX1tpXS0+TmFtZShwYXJhbWV0ZXIpOyBcCisgICAgfSBcCisgIH0gXAorfQorCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFByb2dyYW1TdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdENhc2VTdGFydCwgVGVzdENhc2UpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFN0YXJ0LCBUZXN0SW5mbykKK0dURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UGFydFJlc3VsdCwgVGVzdFBhcnRSZXN1bHQpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNTZXRVcEVuZCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0RW5kLCBUZXN0SW5mbykKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RDYXNlRW5kLCBUZXN0Q2FzZSkKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQcm9ncmFtRW5kLCBVbml0VGVzdCkKKworI3VuZGVmIEdURVNUX1JFUEVBVEVSX01FVEhPRF8KKyN1bmRlZiBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGxpc3RlbmVyc19baV0tPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KHVuaXRfdGVzdCwgaXRlcmF0aW9uKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgeworICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeworICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGxpc3RlbmVyc18uc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBsaXN0ZW5lcnNfW2ldLT5PblRlc3RJdGVyYXRpb25FbmQodW5pdF90ZXN0LCBpdGVyYXRpb24pOworICAgIH0KKyAgfQorfQorCisvLyBFbmQgVGVzdEV2ZW50UmVwZWF0ZXIKKworLy8gVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYW4gWE1MIG91dHB1dCBmaWxlLgorY2xhc3MgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKGNvbnN0IGNoYXIqIG91dHB1dF9maWxlKTsKKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworCisgcHJpdmF0ZToKKyAgLy8gSXMgYyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIHRoYXQgaXMgbm9ybWFsaXplZCB0byBhIHNwYWNlIGNoYXJhY3RlcgorICAvLyB3aGVuIGl0IGFwcGVhcnMgaW4gYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZT8KKyAgc3RhdGljIGJvb2wgSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGNoYXIgYykgeworICAgIHJldHVybiBjID09IDB4OSB8fCBjID09IDB4QSB8fCBjID09IDB4RDsKKyAgfQorCisgIC8vIE1heSBjIGFwcGVhciBpbiBhIHdlbGwtZm9ybWVkIFhNTCBkb2N1bWVudD8KKyAgc3RhdGljIGJvb2wgSXNWYWxpZFhtbENoYXJhY3RlcihjaGFyIGMpIHsKKyAgICByZXR1cm4gSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGMpIHx8IGMgPj0gMHgyMDsKKyAgfQorCisgIC8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmCisgIC8vIGlzX2F0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgdGV4dCBpcyBtZWFudCB0byBhcHBlYXIgYXMgYW4gYXR0cmlidXRlCisgIC8vIHZhbHVlLCBhbmQgbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdAorICAvLyB3aXRoIGNoYXJhY3RlciByZWZlcmVuY2VzLgorICBzdGF0aWMgU3RyaW5nIEVzY2FwZVhtbChjb25zdCBjaGFyKiBzdHIsIGJvb2wgaXNfYXR0cmlidXRlKTsKKworICAvLyBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBhbGwgY2hhcmFjdGVycyBpbnZhbGlkIGluIFhNTCByZW1vdmVkLgorICBzdGF0aWMgU3RyaW5nIFJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGNvbnN0IGNoYXIqIHN0cik7CisKKyAgLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgRXNjYXBlWG1sIHdoZW4gc3RyIGlzIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgc3RhdGljIFN0cmluZyBFc2NhcGVYbWxBdHRyaWJ1dGUoY29uc3QgY2hhciogc3RyKSB7CisgICAgcmV0dXJuIEVzY2FwZVhtbChzdHIsIHRydWUpOworICB9CisKKyAgLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgRXNjYXBlWG1sIHdoZW4gc3RyIGlzIG5vdCBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgIHN0YXRpYyBTdHJpbmcgRXNjYXBlWG1sVGV4dChjb25zdCBjaGFyKiBzdHIpIHsgcmV0dXJuIEVzY2FwZVhtbChzdHIsIGZhbHNlKTsgfQorCisgIC8vIFN0cmVhbXMgYW4gWE1MIENEQVRBIHNlY3Rpb24sIGVzY2FwaW5nIGludmFsaWQgQ0RBVEEgc2VxdWVuY2VzIGFzIG5lZWRlZC4KKyAgc3RhdGljIHZvaWQgT3V0cHV0WG1sQ0RhdGFTZWN0aW9uKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGRhdGEpOworCisgIC8vIFN0cmVhbXMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0LgorICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisKKyAgLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RDYXNlIG9iamVjdAorICBzdGF0aWMgdm9pZCBQcmludFhtbFRlc3RDYXNlKEZJTEUqIG91dCwgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisKKyAgLy8gUHJpbnRzIGFuIFhNTCBzdW1tYXJ5IG9mIHVuaXRfdGVzdCB0byBvdXRwdXQgc3RyZWFtIG91dC4KKyAgc3RhdGljIHZvaWQgUHJpbnRYbWxVbml0VGVzdChGSUxFKiBvdXQsIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworCisgIC8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlCisgIC8vIGRlbGltaXRlZCBYTUwgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgcHJvcGVydHkga2V5PSJ2YWx1ZSIgcGFpcnMuCisgIC8vIFdoZW4gdGhlIFN0cmluZyBpcyBub3QgZW1wdHksIGl0IGluY2x1ZGVzIGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZywKKyAgLy8gdG8gZGVsaW1pdCB0aGlzIGF0dHJpYnV0ZSBmcm9tIHByaW9yIGF0dHJpYnV0ZXMuCisgIHN0YXRpYyBTdHJpbmcgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMoY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0KTsKKworICAvLyBUaGUgb3V0cHV0IGZpbGUuCisgIGNvbnN0IFN0cmluZyBvdXRwdXRfZmlsZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIpOworfTsKKworLy8gQ3JlYXRlcyBhIG5ldyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIuCitYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSkKKyAgICA6IG91dHB1dF9maWxlXyhvdXRwdXRfZmlsZSkgeworICBpZiAob3V0cHV0X2ZpbGVfLmNfc3RyKCkgPT0gTlVMTCB8fCBvdXRwdXRfZmlsZV8uZW1wdHkoKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiWE1MIG91dHB1dCBmaWxlIG1heSBub3QgYmUgbnVsbFxuIik7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9Cit9CisKKy8vIENhbGxlZCBhZnRlciB0aGUgdW5pdCB0ZXN0IGVuZHMuCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgIEZJTEUqIHhtbG91dCA9IE5VTEw7CisgIEZpbGVQYXRoIG91dHB1dF9maWxlKG91dHB1dF9maWxlXyk7CisgIEZpbGVQYXRoIG91dHB1dF9kaXIob3V0cHV0X2ZpbGUuUmVtb3ZlRmlsZU5hbWUoKSk7CisKKyAgaWYgKG91dHB1dF9kaXIuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKSB7CisgICAgeG1sb3V0ID0gcG9zaXg6OkZPcGVuKG91dHB1dF9maWxlXy5jX3N0cigpLCAidyIpOworICB9CisgIGlmICh4bWxvdXQgPT0gTlVMTCkgeworICAgIC8vIFRPRE8od2FuKTogcmVwb3J0IHRoZSByZWFzb24gb2YgdGhlIGZhaWx1cmUuCisgICAgLy8KKyAgICAvLyBXZSBkb24ndCBkbyBpdCBmb3Igbm93IGFzOgorICAgIC8vCisgICAgLy8gICAxLiBUaGVyZSBpcyBubyB1cmdlbnQgbmVlZCBmb3IgaXQuCisgICAgLy8gICAyLiBJdCdzIGEgYml0IGludm9sdmVkIHRvIG1ha2UgdGhlIGVycm5vIHZhcmlhYmxlIHRocmVhZC1zYWZlIG9uCisgICAgLy8gICAgICBhbGwgdGhyZWUgb3BlcmF0aW5nIHN5c3RlbXMgKExpbnV4LCBXaW5kb3dzLCBhbmQgTWFjIE9TKS4KKyAgICAvLyAgIDMuIFRvIGludGVycHJldCB0aGUgbWVhbmluZyBvZiBlcnJubyBpbiBhIHRocmVhZC1zYWZlIHdheSwKKyAgICAvLyAgICAgIHdlIG5lZWQgdGhlIHN0cmVycm9yX3IoKSBmdW5jdGlvbiwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbgorICAgIC8vICAgICAgV2luZG93cy4KKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJVbmFibGUgdG8gb3BlbiBmaWxlIFwiJXNcIlxuIiwKKyAgICAgICAgICAgIG91dHB1dF9maWxlXy5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyAgUHJpbnRYbWxVbml0VGVzdCh4bWxvdXQsIHVuaXRfdGVzdCk7CisgIGZjbG9zZSh4bWxvdXQpOworfQorCisvLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZiBpc19hdHRyaWJ1dGUKKy8vIGlzIHRydWUsIHRoZSB0ZXh0IGlzIG1lYW50IHRvIGFwcGVhciBhcyBhbiBhdHRyaWJ1dGUgdmFsdWUsIGFuZAorLy8gbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdCB3aXRoIGNoYXJhY3RlcgorLy8gcmVmZXJlbmNlcy4KKy8vCisvLyBJbnZhbGlkIFhNTCBjaGFyYWN0ZXJzIGluIHN0ciwgaWYgYW55LCBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0LgorLy8gSXQgaXMgZXhwZWN0ZWQgdGhhdCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aGUgdGV4dCBwcm9jZXNzZWQgYnkgdGhpcworLy8gbW9kdWxlIHdpbGwgY29uc2lzdCBvZiBvcmRpbmFyeSBFbmdsaXNoIHRleHQuCisvLyBJZiB0aGlzIG1vZHVsZSBpcyBldmVyIG1vZGlmaWVkIHRvIHByb2R1Y2UgdmVyc2lvbiAxLjEgWE1MIG91dHB1dCwKKy8vIG1vc3QgaW52YWxpZCBjaGFyYWN0ZXJzIGNhbiBiZSByZXRhaW5lZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KKy8vIFRPRE8od2FuKTogSXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgbWluaW1hbGx5IGludmFzaXZlLCBodW1hbi1yZWFkYWJsZQorLy8gZXNjYXBpbmcgc2NoZW1lIGZvciBpbnZhbGlkIGNoYXJhY3RlcnMsIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZW0uCitTdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpFc2NhcGVYbWwoY29uc3QgY2hhciogc3RyLCBib29sIGlzX2F0dHJpYnV0ZSkgeworICBNZXNzYWdlIG07CisKKyAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgZm9yIChjb25zdCBjaGFyKiBzcmMgPSBzdHI7ICpzcmM7ICsrc3JjKSB7CisgICAgICBzd2l0Y2ggKCpzcmMpIHsKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgbSA8PCAiJmx0OyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgIG0gPDwgIiZndDsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICBtIDw8ICImYW1wOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICBpZiAoaXNfYXR0cmlidXRlKQorICAgICAgICAgICAgbSA8PCAiJmFwb3M7IjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtIDw8ICdcJyc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgIGlmIChpc19hdHRyaWJ1dGUpCisgICAgICAgICAgICBtIDw8ICImcXVvdDsiOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG0gPDwgJyInOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChJc1ZhbGlkWG1sQ2hhcmFjdGVyKCpzcmMpKSB7CisgICAgICAgICAgICBpZiAoaXNfYXR0cmlidXRlICYmIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZSgqc3JjKSkKKyAgICAgICAgICAgICAgbSA8PCBTdHJpbmc6OkZvcm1hdCgiJiN4JTAyWDsiLCB1bnNpZ25lZCgqc3JjKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG0gPDwgKnNyYzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIG0uR2V0U3RyaW5nKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCBjaGFyYWN0ZXJzIGludmFsaWQgaW4gWE1MIHJlbW92ZWQuCisvLyBDdXJyZW50bHkgaW52YWxpZCBjaGFyYWN0ZXJzIGFyZSBkcm9wcGVkIGZyb20gdGhlIHN0cmluZy4gQW4KKy8vIGFsdGVybmF0aXZlIGlzIHRvIHJlcGxhY2UgdGhlbSB3aXRoIGNlcnRhaW4gY2hhcmFjdGVycyBzdWNoIGFzIC4gb3IgPy4KK1N0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGNvbnN0IGNoYXIqIHN0cikgeworICBjaGFyKiBjb25zdCBvdXRwdXQgPSBuZXcgY2hhcltzdHJsZW4oc3RyKSArIDFdOworICBjaGFyKiBhcHBlbmRlciA9IG91dHB1dDsKKyAgZm9yIChjaGFyIGNoID0gKnN0cjsgY2ggIT0gJ1wwJzsgY2ggPSAqKytzdHIpCisgICAgaWYgKElzVmFsaWRYbWxDaGFyYWN0ZXIoY2gpKQorICAgICAgKmFwcGVuZGVyKysgPSBjaDsKKyAgKmFwcGVuZGVyID0gJ1wwJzsKKworICBTdHJpbmcgcmV0X3ZhbHVlKG91dHB1dCk7CisgIGRlbGV0ZVtdIG91dHB1dDsKKyAgcmV0dXJuIHJldF92YWx1ZTsKK30KKworLy8gVGhlIGZvbGxvd2luZyByb3V0aW5lcyBnZW5lcmF0ZSBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBVbml0VGVzdAorLy8gb2JqZWN0LgorLy8KKy8vIFRoaXMgaXMgaG93IEdvb2dsZSBUZXN0IGNvbmNlcHRzIG1hcCB0byB0aGUgRFREOgorLy8KKy8vIDx0ZXN0c3VpdGVzIG5hbWU9IkFsbFRlc3RzIj4gICAgICAgIDwtLSBjb3JyZXNwb25kcyB0byBhIFVuaXRUZXN0IG9iamVjdAorLy8gICA8dGVzdHN1aXRlIG5hbWU9InRlc3RjYXNlLW5hbWUiPiAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVGVzdENhc2Ugb2JqZWN0CisvLyAgICAgPHRlc3RjYXNlIG5hbWU9InRlc3QtbmFtZSI+ICAgICA8LS0gY29ycmVzcG9uZHMgdG8gYSBUZXN0SW5mbyBvYmplY3QKKy8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgorLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+CisvLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLSBpbmRpdmlkdWFsIGFzc2VydGlvbiBmYWlsdXJlcworLy8gICAgIDwvdGVzdGNhc2U+CisvLyAgIDwvdGVzdHN1aXRlPgorLy8gPC90ZXN0c3VpdGVzPgorCisvLyBGb3JtYXRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBzZWNvbmRzLgorc3RkOjpzdHJpbmcgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKFRpbWVJbk1pbGxpcyBtcykgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBtcy8xMDAwLjA7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbENEYXRhU2VjdGlvbig6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhKSB7CisgIGNvbnN0IGNoYXIqIHNlZ21lbnQgPSBkYXRhOworICAqc3RyZWFtIDw8ICI8IVtDREFUQVsiOworICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciogY29uc3QgbmV4dF9zZWdtZW50ID0gc3Ryc3RyKHNlZ21lbnQsICJdXT4iKTsKKyAgICBpZiAobmV4dF9zZWdtZW50ICE9IE5VTEwpIHsKKyAgICAgIHN0cmVhbS0+d3JpdGUoCisgICAgICAgICAgc2VnbWVudCwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihuZXh0X3NlZ21lbnQgLSBzZWdtZW50KSk7CisgICAgICAqc3RyZWFtIDw8ICJdXT5dXSZndDs8IVtDREFUQVsiOworICAgICAgc2VnbWVudCA9IG5leHRfc2VnbWVudCArIHN0cmxlbigiXV0+Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICpzdHJlYW0gPDwgc2VnbWVudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAqc3RyZWFtIDw8ICJdXT4iOworfQorCisvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0LgorLy8gVE9ETyh3YW4pOiBUaGVyZSBpcyBhbHNvIHZhbHVlIGluIHByaW50aW5nIHByb3BlcnRpZXMgd2l0aCB0aGUgcGxhaW4gcHJpbnRlci4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0ID0gKnRlc3RfaW5mby5yZXN1bHQoKTsKKyAgKnN0cmVhbSA8PCAiICAgIDx0ZXN0Y2FzZSBuYW1lPVwiIgorICAgICAgICAgIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2luZm8ubmFtZSgpKS5jX3N0cigpCisgICAgICAgICAgPDwgIlwiIHN0YXR1cz1cIiIKKyAgICAgICAgICA8PCAodGVzdF9pbmZvLnNob3VsZF9ydW4oKSA/ICJydW4iIDogIm5vdHJ1biIpCisgICAgICAgICAgPDwgIlwiIHRpbWU9XCIiCisgICAgICAgICAgPDwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHJlc3VsdC5lbGFwc2VkX3RpbWUoKSkKKyAgICAgICAgICA8PCAiXCIgY2xhc3NuYW1lPVwiIiA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUodGVzdF9jYXNlX25hbWUpLmNfc3RyKCkKKyAgICAgICAgICA8PCAiXCIiIDw8IFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKHJlc3VsdCkuY19zdHIoKTsKKworICBpbnQgZmFpbHVyZXMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC50b3RhbF9wYXJ0X2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBwYXJ0ID0gcmVzdWx0LkdldFRlc3RQYXJ0UmVzdWx0KGkpOworICAgIGlmIChwYXJ0LmZhaWxlZCgpKSB7CisgICAgICBpZiAoKytmYWlsdXJlcyA9PSAxKQorICAgICAgICAqc3RyZWFtIDw8ICI+XG4iOworICAgICAgKnN0cmVhbSA8PCAiICAgICAgPGZhaWx1cmUgbWVzc2FnZT1cIiIKKyAgICAgICAgICAgICAgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHBhcnQuc3VtbWFyeSgpKS5jX3N0cigpCisgICAgICAgICAgICAgIDw8ICJcIiB0eXBlPVwiXCI+IjsKKyAgICAgIGNvbnN0IFN0cmluZyBtZXNzYWdlID0gUmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICAgIiVzOiVkXG4lcyIsCisgICAgICAgICAgcGFydC5maWxlX25hbWUoKSwgcGFydC5saW5lX251bWJlcigpLAorICAgICAgICAgIHBhcnQubWVzc2FnZSgpKS5jX3N0cigpKTsKKyAgICAgIE91dHB1dFhtbENEYXRhU2VjdGlvbihzdHJlYW0sIG1lc3NhZ2UuY19zdHIoKSk7CisgICAgICAqc3RyZWFtIDw8ICI8L2ZhaWx1cmU+XG4iOworICAgIH0KKyAgfQorCisgIGlmIChmYWlsdXJlcyA9PSAwKQorICAgICpzdHJlYW0gPDwgIiAvPlxuIjsKKyAgZWxzZQorICAgICpzdHJlYW0gPDwgIiAgICA8L3Rlc3RjYXNlPlxuIjsKK30KKworLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RDYXNlIG9iamVjdAordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50WG1sVGVzdENhc2UoRklMRSogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgeworICBmcHJpbnRmKG91dCwKKyAgICAgICAgICAiICA8dGVzdHN1aXRlIG5hbWU9XCIlc1wiIHRlc3RzPVwiJWRcIiBmYWlsdXJlcz1cIiVkXCIgIgorICAgICAgICAgICJkaXNhYmxlZD1cIiVkXCIgIiwKKyAgICAgICAgICBFc2NhcGVYbWxBdHRyaWJ1dGUodGVzdF9jYXNlLm5hbWUoKSkuY19zdHIoKSwKKyAgICAgICAgICB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpLAorICAgICAgICAgIHRlc3RfY2FzZS5mYWlsZWRfdGVzdF9jb3VudCgpLAorICAgICAgICAgIHRlc3RfY2FzZS5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICBmcHJpbnRmKG91dCwKKyAgICAgICAgICAiZXJyb3JzPVwiMFwiIHRpbWU9XCIlc1wiPlxuIiwKKyAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHModGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpOyArK2kpIHsKKyAgICBTdHJTdHJlYW0gc3RyZWFtOworICAgIE91dHB1dFhtbFRlc3RJbmZvKCZzdHJlYW0sIHRlc3RfY2FzZS5uYW1lKCksICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaSkpOworICAgIGZwcmludGYob3V0LCAiJXMiLCBTdHJTdHJlYW1Ub1N0cmluZygmc3RyZWFtKS5jX3N0cigpKTsKKyAgfQorICBmcHJpbnRmKG91dCwgIiAgPC90ZXN0c3VpdGU+XG4iKTsKK30KKworLy8gUHJpbnRzIGFuIFhNTCBzdW1tYXJ5IG9mIHVuaXRfdGVzdCB0byBvdXRwdXQgc3RyZWFtIG91dC4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludFhtbFVuaXRUZXN0KEZJTEUqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgZnByaW50ZihvdXQsICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpOworICBmcHJpbnRmKG91dCwKKyAgICAgICAgICAiPHRlc3RzdWl0ZXMgdGVzdHM9XCIlZFwiIGZhaWx1cmVzPVwiJWRcIiBkaXNhYmxlZD1cIiVkXCIgIgorICAgICAgICAgICJlcnJvcnM9XCIwXCIgdGltZT1cIiVzXCIgIiwKKyAgICAgICAgICB1bml0X3Rlc3QudG90YWxfdGVzdF9jb3VudCgpLAorICAgICAgICAgIHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpLAorICAgICAgICAgIHVuaXRfdGVzdC5kaXNhYmxlZF90ZXN0X2NvdW50KCksCisgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgZnByaW50ZihvdXQsICJyYW5kb21fc2VlZD1cIiVkXCIgIiwgdW5pdF90ZXN0LnJhbmRvbV9zZWVkKCkpOworICB9CisgIGZwcmludGYob3V0LCAibmFtZT1cIkFsbFRlc3RzXCI+XG4iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkKKyAgICBQcmludFhtbFRlc3RDYXNlKG91dCwgKnVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKSk7CisgIGZwcmludGYob3V0LCAiPC90ZXN0c3VpdGVzPlxuIik7Cit9CisKKy8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlCisvLyBkZWxpbWl0ZWQgWE1MIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHByb3BlcnR5IGtleT0idmFsdWUiIHBhaXJzLgorU3RyaW5nIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6VGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMoCisgICAgY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0KSB7CisgIE1lc3NhZ2UgYXR0cmlidXRlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5ID0gcmVzdWx0LkdldFRlc3RQcm9wZXJ0eShpKTsKKyAgICBhdHRyaWJ1dGVzIDw8ICIgIiA8PCBwcm9wZXJ0eS5rZXkoKSA8PCAiPSIKKyAgICAgICAgPDwgIlwiIiA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUocHJvcGVydHkudmFsdWUoKSkgPDwgIlwiIjsKKyAgfQorICByZXR1cm4gYXR0cmlidXRlcy5HZXRTdHJpbmcoKTsKK30KKworLy8gRW5kIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcgorCisvLyBDbGFzcyBTY29wZWRUcmFjZQorCisvLyBQdXNoZXMgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGFuZCBtZXNzYWdlIG9udG8gYSBwZXItdGhyZWFkCisvLyB0cmFjZSBzdGFjayBtYWludGFpbmVkIGJ5IEdvb2dsZSBUZXN0LgorLy8gTCA8IFVuaXRUZXN0OjptdXRleF8KK1Njb3BlZFRyYWNlOjpTY29wZWRUcmFjZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBUcmFjZUluZm8gdHJhY2U7CisgIHRyYWNlLmZpbGUgPSBmaWxlOworICB0cmFjZS5saW5lID0gbGluZTsKKyAgdHJhY2UubWVzc2FnZSA9IG1lc3NhZ2UuR2V0U3RyaW5nKCk7CisKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlB1c2hHVGVzdFRyYWNlKHRyYWNlKTsKK30KKworLy8gUG9wcyB0aGUgaW5mbyBwdXNoZWQgYnkgdGhlIGMndG9yLgorLy8gTCA8IFVuaXRUZXN0OjptdXRleF8KK1Njb3BlZFRyYWNlOjp+U2NvcGVkVHJhY2UoKSB7CisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5Qb3BHVGVzdFRyYWNlKCk7Cit9CisKKworLy8gY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVyCisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYSBTdHJpbmcuICBQYXJhbWV0ZXJzOgorLy8KKy8vICAgbWF4X2RlcHRoICAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQKKy8vICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZS4KKy8vICAgc2tpcF9jb3VudCAtIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkOyBkb2Vzbid0IGNvdW50CisvLyAgICAgICAgICAgICAgICBhZ2FpbnN0IG1heF9kZXB0aC4KKy8vCisvLyBMIDwgbXV0ZXhfCisvLyBXZSB1c2UgIkwgPCBtdXRleF8iIHRvIGRlbm90ZSB0aGF0IHRoZSBmdW5jdGlvbiBtYXkgYWNxdWlyZSBtdXRleF8uCitTdHJpbmcgT3NTdGFja1RyYWNlR2V0dGVyOjpDdXJyZW50U3RhY2tUcmFjZShpbnQsIGludCkgeworICByZXR1cm4gU3RyaW5nKCIiKTsKK30KKworLy8gTCA8IG11dGV4Xwordm9pZCBPc1N0YWNrVHJhY2VHZXR0ZXI6OlVwb25MZWF2aW5nR1Rlc3QoKSB7Cit9CisKK2NvbnN0IGNoYXIqIGNvbnN0CitPc1N0YWNrVHJhY2VHZXR0ZXI6OmtFbGlkZWRGcmFtZXNNYXJrZXIgPQorICAgICIuLi4gIiBHVEVTVF9OQU1FXyAiIGludGVybmFsIGZyYW1lcyAuLi4iOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXJzCisKK1Rlc3RFdmVudExpc3RlbmVyczo6VGVzdEV2ZW50TGlzdGVuZXJzKCkKKyAgICA6IHJlcGVhdGVyXyhuZXcgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKCkpLAorICAgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8oTlVMTCksCisgICAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfKE5VTEwpIHsKK30KKworVGVzdEV2ZW50TGlzdGVuZXJzOjp+VGVzdEV2ZW50TGlzdGVuZXJzKCkgeyBkZWxldGUgcmVwZWF0ZXJfOyB9CisKKy8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlCisvLyBvdXRwdXQuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0ZW5lcnMgbGlzdCB0byBzaHV0IGRvd24gZGVmYXVsdAorLy8gY29uc29sZSBvdXRwdXQuICBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdAorLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSB1c2VyLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgcmVwZWF0ZXJfLT5BcHBlbmQobGlzdGVuZXIpOworfQorCisvLyBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgSXQgdGhlbgorLy8gYmVjb21lcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlIHRoZSBsaXN0ZW5lci4gUmV0dXJucworLy8gTlVMTCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgorVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudExpc3RlbmVyczo6UmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKQorICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfID0gTlVMTDsKKyAgZWxzZSBpZiAobGlzdGVuZXIgPT0gZGVmYXVsdF94bWxfZ2VuZXJhdG9yXykKKyAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gTlVMTDsKKyAgcmV0dXJuIHJlcGVhdGVyXy0+UmVsZWFzZShsaXN0ZW5lcik7Cit9CisKKy8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCisvLyBzdWJzY3JpYmVycy4KK1Rlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OnJlcGVhdGVyKCkgeyByZXR1cm4gcmVwZWF0ZXJfOyB9CisKKy8vIFNldHMgdGhlIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4KKy8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworLy8gZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KKy8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCit2b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyAhPSBsaXN0ZW5lcikgeworICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlCisgICAgLy8gbGlzdC4KKyAgICBkZWxldGUgUmVsZWFzZShkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyk7CisgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gPSBsaXN0ZW5lcjsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKKyAgICAgIEFwcGVuZChsaXN0ZW5lcik7CisgIH0KK30KKworLy8gU2V0cyB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuICBUaGUKKy8vIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisvLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChkZWZhdWx0X3htbF9nZW5lcmF0b3JfICE9IGxpc3RlbmVyKSB7CisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyB0aGlzIG1ldGhvZCBhIGxpc3RlbmVyIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUKKyAgICAvLyBsaXN0LgorICAgIGRlbGV0ZSBSZWxlYXNlKGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pOworICAgIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8gPSBsaXN0ZW5lcjsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKKyAgICAgIEFwcGVuZChsaXN0ZW5lcik7CisgIH0KK30KKworLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQorLy8gbGlzdGVuZXJzIGluIHRoZSBsaXN0LgorYm9vbCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKSBjb25zdCB7CisgIHJldHVybiByZXBlYXRlcl8tPmZvcndhcmRpbmdfZW5hYmxlZCgpOworfQorCit2b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKSB7CisgIHJlcGVhdGVyXy0+c2V0X2ZvcndhcmRpbmdfZW5hYmxlZChmYWxzZSk7Cit9CisKKy8vIGNsYXNzIFVuaXRUZXN0CisKKy8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZCBpcworLy8gY2FsbGVkLCBhIFVuaXRUZXN0IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuICBDb25zZWN1dGl2ZQorLy8gY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgorLy8KKy8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8gYXMgYSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0bworLy8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkgc3RhcnRzLCBmcm9tIHdoaWNoIHBvaW50IG9uIHRoZSByZXR1cm4KKy8vIHZhbHVlIHdpbGwgbmV2ZXIgY2hhbmdlLgorVW5pdFRlc3QgKiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSB7CisgIC8vIFdoZW4gY29tcGlsZWQgd2l0aCBNU1ZDIDcuMSBpbiBvcHRpbWl6ZWQgbW9kZSwgZGVzdHJveWluZyB0aGUKKyAgLy8gVW5pdFRlc3Qgb2JqZWN0IHVwb24gZXhpdGluZyB0aGUgcHJvZ3JhbSBtZXNzZXMgdXAgdGhlIGV4aXQgY29kZSwKKyAgLy8gY2F1c2luZyBzdWNjZXNzZnVsIHRlc3RzIHRvIGFwcGVhciBmYWlsZWQuICBXZSBoYXZlIHRvIHVzZSBhCisgIC8vIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzIGNhc2UgdG8gYnlwYXNzIHRoZSBjb21waWxlciBidWcuCisgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdGhlIGNvbXBpbGVyIGhhcHB5LCBhdCB0aGUgY29zdCBvZgorICAvLyBsZWFraW5nIHRoZSBVbml0VGVzdCBvYmplY3QuCisKKyAgLy8gQ29kZUdlYXIgQysrQnVpbGRlciBpbnNpc3RzIG9uIGEgcHVibGljIGRlc3RydWN0b3IgZm9yIHRoZQorICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uLiAgVXNlIHRoaXMgaW1wbGVtZW50YXRpb24gdG8ga2VlcCBnb29kIE9PCisgIC8vIGRlc2lnbiB3aXRoIHByaXZhdGUgZGVzdHJ1Y3Rvci4KKworI2lmIChfTVNDX1ZFUiA9PSAxMzEwICYmICFkZWZpbmVkKF9ERUJVRykpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorICBzdGF0aWMgVW5pdFRlc3QqIGNvbnN0IGluc3RhbmNlID0gbmV3IFVuaXRUZXN0OworICByZXR1cm4gaW5zdGFuY2U7CisjZWxzZQorICBzdGF0aWMgVW5pdFRlc3QgaW5zdGFuY2U7CisgIHJldHVybiAmaW5zdGFuY2U7CisjZW5kaWYgIC8vIChfTVNDX1ZFUiA9PSAxMzEwICYmICFkZWZpbmVkKF9ERUJVRykpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0OjpzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0OjpmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5mYWlsZWRfdGVzdF9jYXNlX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0Ojp0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgoraW50IFVuaXRUZXN0OjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgoraW50IFVuaXRUZXN0OjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+ZmFpbGVkX3Rlc3RfY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmRpc2FibGVkX3Rlc3RfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+dG90YWxfdGVzdF9jb3VudCgpOyB9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCitpbnQgVW5pdFRlc3Q6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT50ZXN0X3RvX3J1bl9jb3VudCgpOyB9CisKKy8vIEdldHMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgoraW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBVbml0VGVzdDo6ZWxhcHNlZF90aW1lKCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5lbGFwc2VkX3RpbWUoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLgorYm9vbCBVbml0VGVzdDo6UGFzc2VkKCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5QYXNzZWQoKTsgfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZAorLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuCitib29sIFVuaXRUZXN0OjpGYWlsZWQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPkZhaWxlZCgpOyB9CisKKy8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KK2NvbnN0IFRlc3RDYXNlKiBVbml0VGVzdDo6R2V0VGVzdENhc2UoaW50IGkpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+R2V0VGVzdENhc2UoaSk7Cit9CisKKy8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KK1Rlc3RDYXNlKiBVbml0VGVzdDo6R2V0TXV0YWJsZVRlc3RDYXNlKGludCBpKSB7CisgIHJldHVybiBpbXBsKCktPkdldE11dGFibGVUZXN0Q2FzZShpKTsKK30KKworLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBldmVudHMKKy8vIGluc2lkZSBHb29nbGUgVGVzdC4KK1Rlc3RFdmVudExpc3RlbmVycyYgVW5pdFRlc3Q6Omxpc3RlbmVycygpIHsKKyAgcmV0dXJuICppbXBsKCktPmxpc3RlbmVycygpOworfQorCisvLyBSZWdpc3RlcnMgYW5kIHJldHVybnMgYSBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudC4gIFdoZW4gYSB0ZXN0CisvLyBwcm9ncmFtIGlzIHJ1biwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHNldC11cCBpbiB0aGUKKy8vIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLiAgQWZ0ZXIgYWxsIHRlc3RzIGluIHRoZSBwcm9ncmFtIGhhdmUKKy8vIGZpbmlzaGVkLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgdG9ybi1kb3duIGluIHRoZQorLy8gKnJldmVyc2UqIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLgorLy8KKy8vIFRoZSBVbml0VGVzdCBvYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKy8vCisvLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfLCBhcyB3ZSBvbmx5IHN1cHBvcnQgY2FsbGluZyBpdAorLy8gZnJvbSB0aGUgbWFpbiB0aHJlYWQuCitFbnZpcm9ubWVudCogVW5pdFRlc3Q6OkFkZEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsKKyAgaWYgKGVudiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpbXBsXy0+ZW52aXJvbm1lbnRzKCkucHVzaF9iYWNrKGVudik7CisgIHJldHVybiBlbnY7Cit9CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworLy8gQSBmYWlsZWQgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIG9mIHRoaXMgdHlwZQorLy8gd2hlbiBleGNlcHRpb25zIGFyZSBlbmFibGVkLiAgV2UgZGVyaXZlIGl0IGZyb20gc3RkOjpydW50aW1lX2Vycm9yLAorLy8gd2hpY2ggaXMgZm9yIGVycm9ycyBwcmVzdW1hYmx5IGRldGVjdGFibGUgb25seSBhdCBydW4gdGltZS4gIFNpbmNlCisvLyBzdGQ6OnJ1bnRpbWVfZXJyb3IgaW5oZXJpdHMgZnJvbSBzdGQ6OmV4Y2VwdGlvbiwgbWFueSB0ZXN0aW5nCisvLyBmcmFtZXdvcmtzIGtub3cgaG93IHRvIGV4dHJhY3QgYW5kIHByaW50IHRoZSBtZXNzYWdlIGluc2lkZSBpdC4KK2NsYXNzIEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uIDogcHVibGljIDo6c3RkOjpydW50aW1lX2Vycm9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBmYWlsdXJlKQorICAgICAgOiA6OnN0ZDo6cnVudGltZV9lcnJvcihQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoZmFpbHVyZSkuY19zdHIoKSkge30KK307CisjZW5kaWYKKworLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsIEdvb2dsZSBUZXN0CisvLyBhc3NlcnRpb24gbWFjcm9zIChlLmcuIEFTU0VSVF9UUlVFLCBFWFBFQ1RfRVEsIGV0YykgZXZlbnR1YWxseSBjYWxsCisvLyB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZSBzaG91bGQgdXNlIHRoZQorLy8gYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4KKy8vIEwgPCBtdXRleF8KK3ZvaWQgVW5pdFRlc3Q6OkFkZFRlc3RQYXJ0UmVzdWx0KFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OlN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsOjpTdHJpbmcmIG9zX3N0YWNrX3RyYWNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgbWVzc2FnZTsKKworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIGlmIChpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5zaXplKCkgPiAwKSB7CisgICAgbXNnIDw8ICJcbiIgPDwgR1RFU1RfTkFNRV8gPDwgIiB0cmFjZToiOworCisgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkuc2l6ZSgpKTsKKyAgICAgICAgIGkgPiAwOyAtLWkpIHsKKyAgICAgIGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlID0gaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKClbaSAtIDFdOworICAgICAgbXNnIDw8ICJcbiIgPDwgaW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbih0cmFjZS5maWxlLCB0cmFjZS5saW5lKQorICAgICAgICAgIDw8ICIgIiA8PCB0cmFjZS5tZXNzYWdlOworICAgIH0KKyAgfQorCisgIGlmIChvc19zdGFja190cmFjZS5jX3N0cigpICE9IE5VTEwgJiYgIW9zX3N0YWNrX3RyYWNlLmVtcHR5KCkpIHsKKyAgICBtc2cgPDwgaW50ZXJuYWw6OmtTdGFja1RyYWNlTWFya2VyIDw8IG9zX3N0YWNrX3RyYWNlOworICB9CisKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQgcmVzdWx0ID0KKyAgICBUZXN0UGFydFJlc3VsdChyZXN1bHRfdHlwZSwgZmlsZV9uYW1lLCBsaW5lX251bWJlciwKKyAgICAgICAgICAgICAgICAgICBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgIGltcGxfLT5HZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpLT4KKyAgICAgIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7CisKKyAgaWYgKHJlc3VsdF90eXBlICE9IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykgeworICAgIC8vIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyCisgICAgLy8gZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZS4gIFRoaXMgYWxsb3dzIGEgdXNlciB0byBzZXQgdGhlIGxhdHRlcgorICAgIC8vIGluIHRoZSBjb2RlIChwZXJoYXBzIGluIG9yZGVyIHRvIHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zCisgICAgLy8gd2l0aCBhbm90aGVyIHRlc3RpbmcgZnJhbWV3b3JrKSBhbmQgc3BlY2lmeSB0aGUgZm9ybWVyIG9uIHRoZQorICAgIC8vIGNvbW1hbmQgbGluZSBmb3IgZGVidWdnaW5nLgorICAgIGlmIChHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAgICAgLy8gVXNpbmcgRGVidWdCcmVhayBvbiBXaW5kb3dzIGFsbG93cyBndGVzdCB0byBzdGlsbCBicmVhayBpbnRvIGEgZGVidWdnZXIKKyAgICAgIC8vIHdoZW4gYSBmYWlsdXJlIGhhcHBlbnMgYW5kIGJvdGggdGhlIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBhbmQKKyAgICAgIC8vIHRoZSAtLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMgZmxhZ3MgYXJlIHNwZWNpZmllZC4KKyAgICAgIERlYnVnQnJlYWsoKTsKKyNlbHNlCisgICAgICBhYm9ydCgpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgICAgfSBlbHNlIGlmIChHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgICAgIHRocm93IEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKHJlc3VsdCk7CisjZWxzZQorICAgICAgLy8gV2UgY2Fubm90IGNhbGwgYWJvcnQoKSBhcyBpdCBnZW5lcmF0ZXMgYSBwb3AtdXAgaW4gZGVidWcgbW9kZQorICAgICAgLy8gdGhhdCBjYW5ub3QgYmUgc3VwcHJlc3NlZCBpbiBWQyA3LjEgb3IgYmVsb3cuCisgICAgICBleGl0KDEpOworI2VuZGlmCisgICAgfQorICB9Cit9CisKKy8vIENyZWF0ZXMgYW5kIGFkZHMgYSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0LiBJZiBhIHByb3BlcnR5IG1hdGNoaW5nCisvLyB0aGUgc3VwcGxpZWQgdmFsdWUgYWxyZWFkeSBleGlzdHMsIHVwZGF0ZXMgaXRzIHZhbHVlIGluc3RlYWQuCit2b2lkIFVuaXRUZXN0OjpSZWNvcmRQcm9wZXJ0eUZvckN1cnJlbnRUZXN0KGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgY29uc3QgVGVzdFByb3BlcnR5IHRlc3RfcHJvcGVydHkoa2V5LCB2YWx1ZSk7CisgIGltcGxfLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPlJlY29yZFByb3BlcnR5KHRlc3RfcHJvcGVydHkpOworfQorCisvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCBhbmQgcHJpbnRzIHRoZSByZXN1bHQuCisvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisvLworLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKKy8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgoraW50IFVuaXRUZXN0OjpSdW4oKSB7CisjaWYgR1RFU1RfSEFTX1NFSAorICAvLyBDYXRjaCBTRUgtc3R5bGUgZXhjZXB0aW9ucy4KKworICBjb25zdCBib29sIGluX2RlYXRoX3Rlc3RfY2hpbGRfcHJvY2VzcyA9CisgICAgICBpbnRlcm5hbDo6R1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkubGVuZ3RoKCkgPiAwOworCisgIC8vIEVpdGhlciB0aGUgdXNlciB3YW50cyBHb29nbGUgVGVzdCB0byBjYXRjaCBleGNlcHRpb25zIHRocm93biBieSB0aGUKKyAgLy8gdGVzdHMgb3IgdGhpcyBpcyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgZGVhdGggdGVzdCBjaGlsZAorICAvLyBwcm9jZXNzLiBJbiBlaXRoZXIgY2FzZSB0aGUgdXNlciBkb2VzIG5vdCB3YW50IHRvIHNlZSBwb3AtdXAgZGlhbG9ncworICAvLyBhYm91dCBjcmFzaGVzIC0gdGhleSBhcmUgZXhwZWN0ZWQuLgorICBpZiAoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSB8fCBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MpIHsKKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBTZXRFcnJvck1vZGUgZG9lc24ndCBleGlzdCBvbiBDRS4KKyAgICBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyB8IFNFTV9OT0FMSUdOTUVOVEZBVUxURVhDRVBUIHwKKyAgICAgICAgICAgICAgICAgU0VNX05PR1BGQVVMVEVSUk9SQk9YIHwgU0VNX05PT1BFTkZJTEVFUlJPUkJPWCk7CisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjaWYgKGRlZmluZWQoX01TQ19WRVIpIHx8IEdURVNUX09TX1dJTkRPV1NfTUlOR1cpICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAgIC8vIERlYXRoIHRlc3QgY2hpbGRyZW4gY2FuIGJlIHRlcm1pbmF0ZWQgd2l0aCBfYWJvcnQoKS4gIE9uIFdpbmRvd3MsCisgICAgLy8gX2Fib3J0KCkgY2FuIHNob3cgYSBkaWFsb2cgd2l0aCBhIHdhcm5pbmcgbWVzc2FnZS4gIFRoaXMgZm9yY2VzIHRoZQorICAgIC8vIGFib3J0IG1lc3NhZ2UgdG8gZ28gdG8gc3RkZXJyIGluc3RlYWQuCisgICAgX3NldF9lcnJvcl9tb2RlKF9PVVRfVE9fU1RERVJSKTsKKyNlbmRpZgorCisjaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBJbiB0aGUgZGVidWcgdmVyc2lvbiwgVmlzdWFsIFN0dWRpbyBwb3BzIHVwIGEgc2VwYXJhdGUgZGlhbG9nCisgICAgLy8gb2ZmZXJpbmcgYSBjaG9pY2UgdG8gZGVidWcgdGhlIGFib3J0ZWQgcHJvZ3JhbS4gV2UgbmVlZCB0byBzdXBwcmVzcworICAgIC8vIHRoaXMgZGlhbG9nIG9yIGl0IHdpbGwgcG9wIHVwIGZvciBldmVyeSBFWFBFQ1QvQVNTRVJUX0RFQVRIIHN0YXRlbWVudAorICAgIC8vIGV4ZWN1dGVkLiBHb29nbGUgVGVzdCB3aWxsIG5vdGlmeSB0aGUgdXNlciBvZiBhbnkgdW5leHBlY3RlZAorICAgIC8vIGZhaWx1cmUgdmlhIHN0ZGVyci4KKyAgICAvLworICAgIC8vIFZDKysgZG9lc24ndCBkZWZpbmUgX3NldF9hYm9ydF9iZWhhdmlvcigpIHByaW9yIHRvIHRoZSB2ZXJzaW9uIDguMC4KKyAgICAvLyBVc2VycyBvZiBwcmlvciBWQyB2ZXJzaW9ucyBzaGFsbCBzdWZmZXIgdGhlIGFnb255IGFuZCBwYWluIG9mCisgICAgLy8gY2xpY2tpbmcgdGhyb3VnaCB0aGUgY291bnRsZXNzIGRlYnVnIGRpYWxvZ3MuCisgICAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogZmluZCBhIHdheSB0byBzdXBwcmVzcyB0aGUgYWJvcnQgZGlhbG9nKCkgaW4gdGhlCisgICAgLy8gZGVidWcgbW9kZSB3aGVuIGNvbXBpbGVkIHdpdGggVkMgNy4xIG9yIGxvd2VyLgorICAgIGlmICghR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkKKyAgICAgIF9zZXRfYWJvcnRfYmVoYXZpb3IoCisgICAgICAgICAgMHgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgX1dSSVRFX0FCT1JUX01TRyB8IF9DQUxMX1JFUE9SVEZBVUxUKTsgIC8vIHBvcC11cCB3aW5kb3csIGNvcmUgZHVtcC4KKyNlbmRpZgorICB9CisKKyAgX190cnkgeworICAgIHJldHVybiBpbXBsXy0+UnVuQWxsVGVzdHMoKTsKKyAgfSBfX2V4Y2VwdChpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoCisgICAgICBHZXRFeGNlcHRpb25Db2RlKCkpKSB7CisgICAgcHJpbnRmKCJFeGNlcHRpb24gdGhyb3duIHdpdGggY29kZSAweCV4LlxuRkFJTFxuIiwgR2V0RXhjZXB0aW9uQ29kZSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisjZWxzZSAgLy8gV2UgYXJlIG9uIGEgY29tcGlsZXIgb3IgcGxhdGZvcm0gdGhhdCBkb2Vzbid0IHN1cHBvcnQgU0VILgorCisgIHJldHVybiBpbXBsXy0+UnVuQWxsVGVzdHMoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAorfQorCisvLyBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzCisvLyBleGVjdXRlZC4KK2NvbnN0IGNoYXIqIFVuaXRUZXN0OjpvcmlnaW5hbF93b3JraW5nX2RpcigpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5vcmlnaW5hbF93b3JraW5nX2Rpcl8uY19zdHIoKTsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCisvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KKy8vIEwgPCBtdXRleF8KK2NvbnN0IFRlc3RDYXNlKiBVbml0VGVzdDo6Y3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdCB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfY2FzZSgpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKy8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorLy8gTCA8IG11dGV4XworY29uc3QgVGVzdEluZm8qIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0IHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICByZXR1cm4gaW1wbF8tPmN1cnJlbnRfdGVzdF9pbmZvKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLgoraW50IFVuaXRUZXN0OjpyYW5kb21fc2VlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5yYW5kb21fc2VlZCgpOyB9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorLy8gUmV0dXJucyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBvYmplY3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mCisvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4KKy8vIEwgPCBtdXRleF8KK2ludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYKKyAgICBVbml0VGVzdDo6cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkgeworICByZXR1cm4gaW1wbF8tPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisvLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0LgorVW5pdFRlc3Q6OlVuaXRUZXN0KCkgeworICBpbXBsXyA9IG5ldyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKHRoaXMpOworfQorCisvLyBEZXN0cnVjdG9yIG9mIFVuaXRUZXN0LgorVW5pdFRlc3Q6On5Vbml0VGVzdCgpIHsKKyAgZGVsZXRlIGltcGxfOworfQorCisvLyBQdXNoZXMgYSB0cmFjZSBkZWZpbmVkIGJ5IFNDT1BFRF9UUkFDRSgpIG9uIHRvIHRoZSBwZXItdGhyZWFkCisvLyBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKy8vIEwgPCBtdXRleF8KK3ZvaWQgVW5pdFRlc3Q6OlB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkucHVzaF9iYWNrKHRyYWNlKTsKK30KKworLy8gUG9wcyBhIHRyYWNlIGZyb20gdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisvLyBMIDwgbXV0ZXhfCit2b2lkIFVuaXRUZXN0OjpQb3BHVGVzdFRyYWNlKCkgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnBvcF9iYWNrKCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK1VuaXRUZXN0SW1wbDo6VW5pdFRlc3RJbXBsKFVuaXRUZXN0KiBwYXJlbnQpCisgICAgOiBwYXJlbnRfKHBhcmVudCksCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzNTUpICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MzU1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2luZyB0aGlzIGluIGluaXRpYWxpemVyKS4KKyAgICAgIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorI3ByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZSBhZ2Fpbi4KKyNlbHNlCisgICAgICBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyNlbmRpZiAgLy8gX01TQ19WRVIKKyAgICAgIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfKAorICAgICAgICAgICZkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyksCisgICAgICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKAorICAgICAgICAgICZkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8pLAorI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgICAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfKCksCisgICAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfKGZhbHNlKSwKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgICAgIGxhc3RfZGVhdGhfdGVzdF9jYXNlXygtMSksCisgICAgICBjdXJyZW50X3Rlc3RfY2FzZV8oTlVMTCksCisgICAgICBjdXJyZW50X3Rlc3RfaW5mb18oTlVMTCksCisgICAgICBhZF9ob2NfdGVzdF9yZXN1bHRfKCksCisgICAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfKE5VTEwpLAorICAgICAgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXyhmYWxzZSksCisgICAgICByYW5kb21fc2VlZF8oMCksICAvLyBXaWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZsYWcgYmVmb3JlIGZpcnN0IHVzZS4KKyAgICAgIHJhbmRvbV8oMCksICAvLyBXaWxsIGJlIHJlc2VlZGVkIGJlZm9yZSBmaXJzdCB1c2UuCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgICAgIGVsYXBzZWRfdGltZV8oMCksCisgICAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXyhOVUxMKSwKKyAgICAgIGRlYXRoX3Rlc3RfZmFjdG9yeV8obmV3IERlZmF1bHREZWF0aFRlc3RGYWN0b3J5KSB7CisjZWxzZQorICAgICAgZWxhcHNlZF90aW1lXygwKSB7CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisgIGxpc3RlbmVycygpLT5TZXREZWZhdWx0UmVzdWx0UHJpbnRlcihuZXcgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyKTsKK30KKworVW5pdFRlc3RJbXBsOjp+VW5pdFRlc3RJbXBsKCkgeworICAvLyBEZWxldGVzIGV2ZXJ5IFRlc3RDYXNlLgorICBGb3JFYWNoKHRlc3RfY2FzZXNfLCBpbnRlcm5hbDo6RGVsZXRlPFRlc3RDYXNlPik7CisKKyAgLy8gRGVsZXRlcyBldmVyeSBFbnZpcm9ubWVudC4KKyAgRm9yRWFjaChlbnZpcm9ubWVudHNfLCBpbnRlcm5hbDo6RGVsZXRlPEVudmlyb25tZW50Pik7CisKKyAgZGVsZXRlIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87Cit9CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorLy8gRGlzYWJsZXMgZXZlbnQgZm9yd2FyZGluZyBpZiB0aGUgY29udHJvbCBpcyBjdXJyZW50bHkgaW4gYSBkZWF0aCB0ZXN0CisvLyBzdWJwcm9jZXNzLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgordm9pZCBVbml0VGVzdEltcGw6OlN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCkgeworICBpZiAoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCkgIT0gTlVMTCkKKyAgICBsaXN0ZW5lcnMoKS0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gSW5pdGlhbGl6ZXMgZXZlbnQgbGlzdGVuZXJzIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkKKy8vIFVuaXRUZXN0T3B0aW9ucy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpDb25maWd1cmVYbWxPdXRwdXQoKSB7CisgIGNvbnN0IFN0cmluZyYgb3V0cHV0X2Zvcm1hdCA9IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCk7CisgIGlmIChvdXRwdXRfZm9ybWF0ID09ICJ4bWwiKSB7CisgICAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRYbWxHZW5lcmF0b3IobmV3IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcigKKyAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKS5jX3N0cigpKSk7CisgIH0gZWxzZSBpZiAob3V0cHV0X2Zvcm1hdCAhPSAiIikgeworICAgIHByaW50ZigiV0FSTklORzogdW5yZWNvZ25pemVkIG91dHB1dCBmb3JtYXQgXCIlc1wiIGlnbm9yZWQuXG4iLAorICAgICAgICAgICBvdXRwdXRfZm9ybWF0LmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9Cit9CisKKy8vIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIGRlcGVuZGVudCB1cG9uIGZsYWcgdmFsdWVzIG9idGFpbmVkIGluCisvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJcyBjYWxsZWQgZnJvbSBJbml0R29vZ2xlVGVzdCBhZnRlciB0aGUgY2FsbCB0bworLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSW4gY2FzZSBhIHVzZXIgbmVnbGVjdHMgdG8gY2FsbCBJbml0R29vZ2xlVGVzdAorLy8gdGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKy8vIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgaXQgaGFzIHRvIGJlIGlkZW1wb3RlbnQuCit2b2lkIFVuaXRUZXN0SW1wbDo6UG9zdEZsYWdQYXJzaW5nSW5pdCgpIHsKKyAgLy8gRW5zdXJlcyB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZXhlY3V0ZSBtb3JlIHRoYW4gb25jZS4KKyAgaWYgKCFwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfKSB7CisgICAgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXyA9IHRydWU7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAgIEluaXREZWF0aFRlc3RTdWJwcm9jZXNzQ29udHJvbEluZm8oKTsKKyAgICBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgICAgLy8gUmVnaXN0ZXJzIHBhcmFtZXRlcml6ZWQgdGVzdHMuIFRoaXMgbWFrZXMgcGFyYW1ldGVyaXplZCB0ZXN0cworICAgIC8vIGF2YWlsYWJsZSB0byB0aGUgVW5pdFRlc3QgcmVmbGVjdGlvbiBBUEkgd2l0aG91dCBydW5uaW5nCisgICAgLy8gUlVOX0FMTF9URVNUUy4KKyAgICBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpOworCisgICAgLy8gQ29uZmlndXJlcyBsaXN0ZW5lcnMgZm9yIFhNTCBvdXRwdXQuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzZXJzCisgICAgLy8gdG8gc2h1dCBkb3duIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQgYmVmb3JlIGludm9raW5nIFJVTl9BTExfVEVTVFMuCisgICAgQ29uZmlndXJlWG1sT3V0cHV0KCk7CisgIH0KK30KKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIG5hbWUgb2YgYSBUZXN0Q2FzZSBhZ2FpbnN0IGEga25vd24KKy8vIHZhbHVlLgorLy8KKy8vIFRoaXMgaXMgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXRUZXN0IGNsYXNzIG9ubHkuICBXZSBwdXQKKy8vIGl0IGluIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlIHRvIHByZXZlbnQgcG9sbHV0aW5nIHRoZSBvdXRlcgorLy8gbmFtZXNwYWNlLgorLy8KKy8vIFRlc3RDYXNlTmFtZUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdENhc2VOYW1lSXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIGV4cGxpY2l0IFRlc3RDYXNlTmFtZUlzKGNvbnN0IFN0cmluZyYgbmFtZSkKKyAgICAgIDogbmFtZV8obmFtZSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBuYW1lIG9mIHRlc3RfY2FzZSBtYXRjaGVzIG5hbWVfLgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X2Nhc2UgIT0gTlVMTCAmJiBzdHJjbXAodGVzdF9jYXNlLT5uYW1lKCksIG5hbWVfLmNfc3RyKCkpID09IDA7CisgIH0KKworIHByaXZhdGU6CisgIFN0cmluZyBuYW1lXzsKK307CisKKy8vIEZpbmRzIGFuZCByZXR1cm5zIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG9uZSBkb2Vzbid0CisvLyBleGlzdCwgY3JlYXRlcyBvbmUgYW5kIHJldHVybnMgaXQuICBJdCdzIHRoZSBDQUxMRVInUworLy8gUkVTUE9OU0lCSUxJVFkgdG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBXSEVOIFRIRQorLy8gVEVTVFMgQVJFIE5PVCBTSFVGRkxFRC4KKy8vCisvLyBBcmd1bWVudHM6CisvLworLy8gICB0ZXN0X2Nhc2VfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIHNldF91cF90YzogICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKK1Rlc3RDYXNlKiBVbml0VGVzdEltcGw6OkdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YykgeworICAvLyBDYW4gd2UgZmluZCBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWU/CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj46OmNvbnN0X2l0ZXJhdG9yIHRlc3RfY2FzZSA9CisgICAgICBzdGQ6OmZpbmRfaWYodGVzdF9jYXNlc18uYmVnaW4oKSwgdGVzdF9jYXNlc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgVGVzdENhc2VOYW1lSXModGVzdF9jYXNlX25hbWUpKTsKKworICBpZiAodGVzdF9jYXNlICE9IHRlc3RfY2FzZXNfLmVuZCgpKQorICAgIHJldHVybiAqdGVzdF9jYXNlOworCisgIC8vIE5vLiAgTGV0J3MgY3JlYXRlIG9uZS4KKyAgVGVzdENhc2UqIGNvbnN0IG5ld190ZXN0X2Nhc2UgPQorICAgICAgbmV3IFRlc3RDYXNlKHRlc3RfY2FzZV9uYW1lLCBjb21tZW50LCBzZXRfdXBfdGMsIHRlYXJfZG93bl90Yyk7CisKKyAgLy8gSXMgdGhpcyBhIGRlYXRoIHRlc3QgY2FzZT8KKyAgaWYgKGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIoU3RyaW5nKHRlc3RfY2FzZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlYXRoVGVzdENhc2VGaWx0ZXIpKSB7CisgICAgLy8gWWVzLiAgSW5zZXJ0cyB0aGUgdGVzdCBjYXNlIGFmdGVyIHRoZSBsYXN0IGRlYXRoIHRlc3QgY2FzZQorICAgIC8vIGRlZmluZWQgc28gZmFyLiAgVGhpcyBvbmx5IHdvcmtzIHdoZW4gdGhlIHRlc3QgY2FzZXMgaGF2ZW4ndAorICAgIC8vIGJlZW4gc2h1ZmZsZWQuICBPdGhlcndpc2Ugd2UgbWF5IGVuZCB1cCBydW5uaW5nIGEgZGVhdGggdGVzdAorICAgIC8vIGFmdGVyIGEgbm9uLWRlYXRoIHRlc3QuCisgICAgKytsYXN0X2RlYXRoX3Rlc3RfY2FzZV87CisgICAgdGVzdF9jYXNlc18uaW5zZXJ0KHRlc3RfY2FzZXNfLmJlZ2luKCkgKyBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8sCisgICAgICAgICAgICAgICAgICAgICAgIG5ld190ZXN0X2Nhc2UpOworICB9IGVsc2UgeworICAgIC8vIE5vLiAgQXBwZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgIHRlc3RfY2FzZXNfLnB1c2hfYmFjayhuZXdfdGVzdF9jYXNlKTsKKyAgfQorCisgIHRlc3RfY2FzZV9pbmRpY2VzXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VfaW5kaWNlc18uc2l6ZSgpKSk7CisgIHJldHVybiBuZXdfdGVzdF9jYXNlOworfQorCisvLyBIZWxwZXJzIGZvciBzZXR0aW5nIHVwIC8gdGVhcmluZyBkb3duIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4gIFRoZXkKKy8vIGFyZSBmb3IgdXNlIGluIHRoZSBGb3JFYWNoKCkgZnVuY3Rpb24uCitzdGF0aWMgdm9pZCBTZXRVcEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5TZXRVcCgpOyB9CitzdGF0aWMgdm9pZCBUZWFyRG93bkVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5UZWFyRG93bigpOyB9CisKKy8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0LCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisvLyByZXR1cm5zIDAgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4gIElmIGFueQorLy8gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgYSB0ZXN0IG9uIFdpbmRvd3MsIHRoaXMgdGVzdCBpcworLy8gY29uc2lkZXJlZCB0byBiZSBmYWlsZWQsIGJ1dCB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgd2lsbCBzdGlsbCBiZQorLy8gcnVuLiAgKFdlIGRpc2FibGUgZXhjZXB0aW9ucyBvbiBMaW51eCBhbmQgTWFjIE9TIFgsIHNvIHRoZSBpc3N1ZQorLy8gZG9lc24ndCBhcHBseSB0aGVyZS4pCisvLyBXaGVuIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQsIGl0IGV4cGFuZHMgYW5kIHJlZ2lzdGVycworLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBmaXJzdCBpbiBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpLgorLy8gQWxsIG90aGVyIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cygpIG1heSBzYWZlbHkgYXNzdW1lIHRoYXQKKy8vIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIHJlYWR5IHRvIGJlIGNvdW50ZWQgYW5kIHJ1bi4KK2ludCBVbml0VGVzdEltcGw6OlJ1bkFsbFRlc3RzKCkgeworICAvLyBNYWtlcyBzdXJlIEluaXRHb29nbGVUZXN0KCkgd2FzIGNhbGxlZC4KKyAgaWYgKCFHVGVzdElzSW5pdGlhbGl6ZWQoKSkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiXG5UaGlzIHRlc3QgcHJvZ3JhbSBkaWQgTk9UIGNhbGwgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCAiCisgICAgICAgICAgICJiZWZvcmUgY2FsbGluZyBSVU5fQUxMX1RFU1RTKCkuICBQbGVhc2UgZml4IGl0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBEbyBub3QgcnVuIGFueSB0ZXN0IGlmIHRoZSAtLWhlbHAgZmxhZyB3YXMgc3BlY2lmaWVkLgorICBpZiAoZ19oZWxwX2ZsYWcpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gUmVwZWF0cyB0aGUgY2FsbCB0byB0aGUgcG9zdC1mbGFnIHBhcnNpbmcgaW5pdGlhbGl6YXRpb24gaW4gY2FzZSB0aGUKKyAgLy8gdXNlciBkaWRuJ3QgY2FsbCBJbml0R29vZ2xlVGVzdC4KKyAgUG9zdEZsYWdQYXJzaW5nSW5pdCgpOworCisgIC8vIEV2ZW4gaWYgc2hhcmRpbmcgaXMgbm90IG9uLCB0ZXN0IHJ1bm5lcnMgbWF5IHdhbnQgdG8gdXNlIHRoZQorICAvLyBHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSB0byBxdWVyeSB3aGV0aGVyIHRoZSB0ZXN0IHN1cHBvcnRzIHRoZSBzaGFyZGluZworICAvLyBwcm90b2NvbC4KKyAgaW50ZXJuYWw6OldyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpOworCisgIC8vIFRydWUgaWZmIHdlIGFyZSBpbiBhIHN1YnByb2Nlc3MgZm9yIHJ1bm5pbmcgYSB0aHJlYWQtc2FmZS1zdHlsZQorICAvLyBkZWF0aCB0ZXN0LgorICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPSBmYWxzZTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPSAoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCkgIT0gTlVMTCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgY29uc3QgYm9vbCBzaG91bGRfc2hhcmQgPSBTaG91bGRTaGFyZChrVGVzdFRvdGFsU2hhcmRzLCBrVGVzdFNoYXJkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7CisKKyAgLy8gQ29tcGFyZXMgdGhlIGZ1bGwgdGVzdCBuYW1lcyB3aXRoIHRoZSBmaWx0ZXIgdG8gZGVjaWRlIHdoaWNoCisgIC8vIHRlc3RzIHRvIHJ1bi4KKyAgY29uc3QgYm9vbCBoYXNfdGVzdHNfdG9fcnVuID0gRmlsdGVyVGVzdHMoc2hvdWxkX3NoYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBIT05PUl9TSEFSRElOR19QUk9UT0NPTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MKSA+IDA7CisKKyAgLy8gTGlzdHMgdGhlIHRlc3RzIGFuZCBleGl0cyBpZiB0aGUgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcgd2FzIHNwZWNpZmllZC4KKyAgaWYgKEdURVNUX0ZMQUcobGlzdF90ZXN0cykpIHsKKyAgICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkICphZnRlciogRmlsdGVyVGVzdHMoKSBoYXMgYmVlbiBjYWxsZWQuCisgICAgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJhbmRvbV9zZWVkXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSkgPworICAgICAgR2V0UmFuZG9tU2VlZEZyb21GbGFnKEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKSA6IDA7CisKKyAgLy8gVHJ1ZSBpZmYgYXQgbGVhc3Qgb25lIHRlc3QgaGFzIGZhaWxlZC4KKyAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKworICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBsaXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKTsKKworICByZXBlYXRlci0+T25UZXN0UHJvZ3JhbVN0YXJ0KCpwYXJlbnRfKTsKKworICAvLyBIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgdGhlIHRlc3RzPyAgV2UgZG9uJ3Qgd2FudCB0byByZXBlYXQgdGhlbQorICAvLyB3aGVuIHdlIGFyZSBpbnNpZGUgdGhlIHN1YnByb2Nlc3Mgb2YgYSBkZWF0aCB0ZXN0LgorICBjb25zdCBpbnQgcmVwZWF0ID0gaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA/IDEgOiBHVEVTVF9GTEFHKHJlcGVhdCk7CisgIC8vIFJlcGVhdHMgZm9yZXZlciBpZiB0aGUgcmVwZWF0IGNvdW50IGlzIG5lZ2F0aXZlLgorICBjb25zdCBib29sIGZvcmV2ZXIgPSByZXBlYXQgPCAwOworICBmb3IgKGludCBpID0gMDsgZm9yZXZlciB8fCBpICE9IHJlcGVhdDsgaSsrKSB7CisgICAgQ2xlYXJSZXN1bHQoKTsKKworICAgIGNvbnN0IFRpbWVJbk1pbGxpcyBzdGFydCA9IEdldFRpbWVJbk1pbGxpcygpOworCisgICAgLy8gU2h1ZmZsZXMgdGVzdCBjYXNlcyBhbmQgdGVzdHMgaWYgcmVxdWVzdGVkLgorICAgIGlmIChoYXNfdGVzdHNfdG9fcnVuICYmIEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICAgIHJhbmRvbSgpLT5SZXNlZWQocmFuZG9tX3NlZWRfKTsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgT25UZXN0SXRlcmF0aW9uU3RhcnQoKSwKKyAgICAgIC8vIHN1Y2ggdGhhdCBhIHRlc3QgZXZlbnQgbGlzdGVuZXIgY2FuIHNlZSB0aGUgYWN0dWFsIHRlc3Qgb3JkZXIKKyAgICAgIC8vIGluIHRoZSBldmVudC4KKyAgICAgIFNodWZmbGVUZXN0cygpOworICAgIH0KKworICAgIC8vIFRlbGxzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXJzIHRoYXQgdGhlIHRlc3RzIGFyZSBhYm91dCB0byBzdGFydC4KKyAgICByZXBlYXRlci0+T25UZXN0SXRlcmF0aW9uU3RhcnQoKnBhcmVudF8sIGkpOworCisgICAgLy8gUnVucyBlYWNoIHRlc3QgY2FzZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdGVzdCB0byBydW4uCisgICAgaWYgKGhhc190ZXN0c190b19ydW4pIHsKKyAgICAgIC8vIFNldHMgdXAgYWxsIGVudmlyb25tZW50cyBiZWZvcmVoYW5kLgorICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCgqcGFyZW50Xyk7CisgICAgICBGb3JFYWNoKGVudmlyb25tZW50c18sIFNldFVwRW52aXJvbm1lbnQpOworICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzU2V0VXBFbmQoKnBhcmVudF8pOworCisgICAgICAvLyBSdW5zIHRoZSB0ZXN0cyBvbmx5IGlmIHRoZXJlIHdhcyBubyBmYXRhbCBmYWlsdXJlIGR1cmluZyBnbG9iYWwKKyAgICAgIC8vIHNldC11cC4KKyAgICAgIGlmICghVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICAgICAgZm9yIChpbnQgdGVzdF9pbmRleCA9IDA7IHRlc3RfaW5kZXggPCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsKKyAgICAgICAgICAgICB0ZXN0X2luZGV4KyspIHsKKyAgICAgICAgICBHZXRNdXRhYmxlVGVzdENhc2UodGVzdF9pbmRleCktPlJ1bigpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRlYXJzIGRvd24gYWxsIGVudmlyb25tZW50cyBpbiByZXZlcnNlIG9yZGVyIGFmdGVyd2FyZHMuCisgICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KCpwYXJlbnRfKTsKKyAgICAgIHN0ZDo6Zm9yX2VhY2goZW52aXJvbm1lbnRzXy5yYmVnaW4oKSwgZW52aXJvbm1lbnRzXy5yZW5kKCksCisgICAgICAgICAgICAgICAgICAgIFRlYXJEb3duRW52aXJvbm1lbnQpOworICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoKnBhcmVudF8pOworICAgIH0KKworICAgIGVsYXBzZWRfdGltZV8gPSBHZXRUaW1lSW5NaWxsaXMoKSAtIHN0YXJ0OworCisgICAgLy8gVGVsbHMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lciB0aGF0IHRoZSB0ZXN0cyBoYXZlIGp1c3QgZmluaXNoZWQuCisgICAgcmVwZWF0ZXItPk9uVGVzdEl0ZXJhdGlvbkVuZCgqcGFyZW50XywgaSk7CisKKyAgICAvLyBHZXRzIHRoZSByZXN1bHQgYW5kIGNsZWFycyBpdC4KKyAgICBpZiAoIVBhc3NlZCgpKSB7CisgICAgICBmYWlsZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIFJlc3RvcmVzIHRoZSBvcmlnaW5hbCB0ZXN0IG9yZGVyIGFmdGVyIHRoZSBpdGVyYXRpb24uICBUaGlzCisgICAgLy8gYWxsb3dzIHRoZSB1c2VyIHRvIHF1aWNrbHkgcmVwcm8gYSBmYWlsdXJlIHRoYXQgaGFwcGVucyBpbiB0aGUKKyAgICAvLyBOLXRoIGl0ZXJhdGlvbiB3aXRob3V0IHJlcGVhdGluZyB0aGUgZmlyc3QgKE4gLSAxKSBpdGVyYXRpb25zLgorICAgIC8vIFRoaXMgaXMgbm90IGVuY2xvc2VkIGluICJpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgeyAuLi4gfSIsIGluCisgICAgLy8gY2FzZSB0aGUgdXNlciBzb21laG93IGNoYW5nZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIHNvbWV3aGVyZQorICAgIC8vIChpdCdzIGFsd2F5cyBzYWZlIHRvIHVuc2h1ZmZsZSB0aGUgdGVzdHMpLgorICAgIFVuc2h1ZmZsZVRlc3RzKCk7CisKKyAgICBpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgeworICAgICAgLy8gUGlja3MgYSBuZXcgcmFuZG9tIHNlZWQgZm9yIGVhY2ggaXRlcmF0aW9uLgorICAgICAgcmFuZG9tX3NlZWRfID0gR2V0TmV4dFJhbmRvbVNlZWQocmFuZG9tX3NlZWRfKTsKKyAgICB9CisgIH0KKworICByZXBlYXRlci0+T25UZXN0UHJvZ3JhbUVuZCgqcGFyZW50Xyk7CisKKyAgLy8gUmV0dXJucyAwIGlmIGFsbCB0ZXN0cyBwYXNzZWQsIG9yIDEgb3RoZXIgd2lzZS4KKyAgcmV0dXJuIGZhaWxlZCA/IDEgOiAwOworfQorCisvLyBSZWFkcyB0aGUgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBjcmVhdGVzIHRoZSBmaWxlCisvLyBpZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudC4gSWYgYSBmaWxlIGFscmVhZHkgZXhpc3RzIGF0IHRoaXMgbG9jYXRpb24sIHRoaXMKKy8vIGZ1bmN0aW9uIHdpbGwgd3JpdGUgb3ZlciBpdC4gSWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQsIGJ1dCB0aGUgZmlsZSBjYW5ub3QKKy8vIGJlIGNyZWF0ZWQsIHByaW50cyBhbiBlcnJvciBhbmQgZXhpdHMuCit2b2lkIFdyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgdGVzdF9zaGFyZF9maWxlID0gcG9zaXg6OkdldEVudihrVGVzdFNoYXJkU3RhdHVzRmlsZSk7CisgIGlmICh0ZXN0X3NoYXJkX2ZpbGUgIT0gTlVMTCkgeworICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4odGVzdF9zaGFyZF9maWxlLCAidyIpOworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlIFwiJXNcIiAiCisgICAgICAgICAgICAgICAgICAgICJzcGVjaWZpZWQgYnkgdGhlICVzIGVudmlyb25tZW50IHZhcmlhYmxlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9zaGFyZF9maWxlLCBrVGVzdFNoYXJkU3RhdHVzRmlsZSk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgICAgZmNsb3NlKGZpbGUpOworICB9Cit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudAorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGUgdmFyaWFibGVzIGFyZSBwcmVzZW50LAorLy8gYnV0IGluY29uc2lzdGVudCAoaS5lLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzCisvLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzCisvLyBkaXNhYmxlZCBiZWNhdXNlIGl0IG11c3Qgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCB0ZXN0CisvLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4KK2Jvb2wgU2hvdWxkU2hhcmQoY29uc3QgY2hhciogdG90YWxfc2hhcmRzX2VudiwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfZW52LAorICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKKyAgaWYgKGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBJbnQzMiB0b3RhbF9zaGFyZHMgPSBJbnQzMkZyb21FbnZPckRpZSh0b3RhbF9zaGFyZHNfZW52LCAtMSk7CisgIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gSW50MzJGcm9tRW52T3JEaWUoc2hhcmRfaW5kZXhfZW52LCAtMSk7CisKKyAgaWYgKHRvdGFsX3NoYXJkcyA9PSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggIT0gLTEpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB5b3UgaGF2ZSAiCisgICAgICA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiA9ICIgPDwgc2hhcmRfaW5kZXgKKyAgICAgIDw8ICIsIGJ1dCBoYXZlIGxlZnQgIiA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICIgdW5zZXQuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9IGVsc2UgaWYgKHRvdGFsX3NoYXJkcyAhPSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgeworICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCisgICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICIKKyAgICAgIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIiA9ICIgPDwgdG90YWxfc2hhcmRzCisgICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgdW5zZXQuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9IGVsc2UgaWYgKHNoYXJkX2luZGV4IDwgMCB8fCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB3ZSByZXF1aXJlIDAgPD0gIgorICAgICAgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgPCAiIDw8IGtUZXN0VG90YWxTaGFyZHMKKyAgICAgIDw8ICIsIGJ1dCB5b3UgaGF2ZSAiIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiPSIgPDwgc2hhcmRfaW5kZXgKKyAgICAgIDw8ICIsICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiPSIgPDwgdG90YWxfc2hhcmRzIDw8ICIuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisKKyAgcmV0dXJuIHRvdGFsX3NoYXJkcyA+IDE7Cit9CisKKy8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKKy8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yCisvLyBhbmQgYWJvcnRzLgorSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogY29uc3QgdmFyLCBJbnQzMiBkZWZhdWx0X3ZhbCkgeworICBjb25zdCBjaGFyKiBzdHJfdmFsID0gcG9zaXg6OkdldEVudih2YXIpOworICBpZiAoc3RyX3ZhbCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsOworICB9CisKKyAgSW50MzIgcmVzdWx0OworICBpZiAoIVBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgIiA8PCB2YXIsCisgICAgICAgICAgICAgICAgICBzdHJfdmFsLCAmcmVzdWx0KSkgeworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCisvLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKKy8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0CisvLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgorYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZChpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKSB7CisgIHJldHVybiAodGVzdF9pZCAlIHRvdGFsX3NoYXJkcykgPT0gc2hhcmRfaW5kZXg7Cit9CisKKy8vIENvbXBhcmVzIHRoZSBuYW1lIG9mIGVhY2ggdGVzdCB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgdG8KKy8vIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4sIHRoZW4gcmVjb3JkcyB0aGUgcmVzdWx0IGluCisvLyBlYWNoIFRlc3RDYXNlIGFuZCBUZXN0SW5mbyBvYmplY3QuCisvLyBJZiBzaGFyZF90ZXN0cyA9PSB0cnVlLCBmdXJ0aGVyIGZpbHRlcnMgdGVzdHMgYmFzZWQgb24gc2hhcmRpbmcKKy8vIHZhcmlhYmxlcyBpbiB0aGUgZW52aXJvbm1lbnQgLSBzZWUKKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvR29vZ2xlVGVzdEFkdmFuY2VkR3VpZGUuCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6RmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKSB7CisgIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KKyAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0VG90YWxTaGFyZHMsIC0xKSA6IC0xOworICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KKyAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0U2hhcmRJbmRleCwgLTEpIDogLTE7CisKKyAgLy8gbnVtX3J1bm5hYmxlX3Rlc3RzIGFyZSB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgd2lsbAorICAvLyBydW4gYWNyb3NzIGFsbCBzaGFyZHMgKGkuZS4sIG1hdGNoIGZpbHRlciBhbmQgYXJlIG5vdCBkaXNhYmxlZCkuCisgIC8vIG51bV9zZWxlY3RlZF90ZXN0cyBhcmUgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBydW4gb24KKyAgLy8gdGhpcyBzaGFyZC4KKyAgaW50IG51bV9ydW5uYWJsZV90ZXN0cyA9IDA7CisgIGludCBudW1fc2VsZWN0ZWRfdGVzdHMgPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOworICAgIGNvbnN0IFN0cmluZyAmdGVzdF9jYXNlX25hbWUgPSB0ZXN0X2Nhc2UtPm5hbWUoKTsKKyAgICB0ZXN0X2Nhc2UtPnNldF9zaG91bGRfcnVuKGZhbHNlKTsKKworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpLnNpemUoKTsgaisrKSB7CisgICAgICBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpW2pdOworICAgICAgY29uc3QgU3RyaW5nIHRlc3RfbmFtZSh0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICAvLyBBIHRlc3QgaXMgZGlzYWJsZWQgaWYgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMKKyAgICAgIC8vIGtEaXNhYmxlVGVzdEZpbHRlci4KKyAgICAgIGNvbnN0IGJvb2wgaXNfZGlzYWJsZWQgPQorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlzYWJsZVRlc3RGaWx0ZXIpIHx8CisgICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlzYWJsZVRlc3RGaWx0ZXIpOworICAgICAgdGVzdF9pbmZvLT5pbXBsKCktPnNldF9pc19kaXNhYmxlZChpc19kaXNhYmxlZCk7CisKKyAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlc19maWx0ZXIgPQorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk7CisgICAgICB0ZXN0X2luZm8tPmltcGwoKS0+c2V0X21hdGNoZXNfZmlsdGVyKG1hdGNoZXNfZmlsdGVyKTsKKworICAgICAgY29uc3QgYm9vbCBpc19ydW5uYWJsZSA9CisgICAgICAgICAgKEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpIHx8ICFpc19kaXNhYmxlZCkgJiYKKyAgICAgICAgICBtYXRjaGVzX2ZpbHRlcjsKKworICAgICAgY29uc3QgYm9vbCBpc19zZWxlY3RlZCA9IGlzX3J1bm5hYmxlICYmCisgICAgICAgICAgKHNoYXJkX3Rlc3RzID09IElHTk9SRV9TSEFSRElOR19QUk9UT0NPTCB8fAorICAgICAgICAgICBTaG91bGRSdW5UZXN0T25TaGFyZCh0b3RhbF9zaGFyZHMsIHNoYXJkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcnVubmFibGVfdGVzdHMpKTsKKworICAgICAgbnVtX3J1bm5hYmxlX3Rlc3RzICs9IGlzX3J1bm5hYmxlOworICAgICAgbnVtX3NlbGVjdGVkX3Rlc3RzICs9IGlzX3NlbGVjdGVkOworCisgICAgICB0ZXN0X2luZm8tPmltcGwoKS0+c2V0X3Nob3VsZF9ydW4oaXNfc2VsZWN0ZWQpOworICAgICAgdGVzdF9jYXNlLT5zZXRfc2hvdWxkX3J1bih0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSB8fCBpc19zZWxlY3RlZCk7CisgICAgfQorICB9CisgIHJldHVybiBudW1fc2VsZWN0ZWRfdGVzdHM7Cit9CisKKy8vIFByaW50cyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG1hdGNoaW5nIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgZmxhZy4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VzX1tpXTsKKyAgICBib29sIHByaW50ZWRfdGVzdF9jYXNlX25hbWUgPSBmYWxzZTsKKworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpLnNpemUoKTsgaisrKSB7CisgICAgICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgICAgICAgICB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbal07CisgICAgICBpZiAodGVzdF9pbmZvLT5tYXRjaGVzX2ZpbHRlcigpKSB7CisgICAgICAgIGlmICghcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSkgeworICAgICAgICAgIHByaW50ZWRfdGVzdF9jYXNlX25hbWUgPSB0cnVlOworICAgICAgICAgIHByaW50ZigiJXMuXG4iLCB0ZXN0X2Nhc2UtPm5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIgICVzXG4iLCB0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCisvLworLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhbmQgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGFyZQorLy8gdGhlIHNhbWU7IG90aGVyd2lzZSwgZGVsZXRlcyB0aGUgb2xkIGdldHRlciBhbmQgbWFrZXMgdGhlIGlucHV0IHRoZQorLy8gY3VycmVudCBnZXR0ZXIuCit2b2lkIFVuaXRUZXN0SW1wbDo6c2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcigKKyAgICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIGdldHRlcikgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyAhPSBnZXR0ZXIpIHsKKyAgICBkZWxldGUgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKKyAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gZ2V0dGVyOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOworLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQKKy8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuCitPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIFVuaXRUZXN0SW1wbDo6b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCkgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9PSBOVUxMKSB7CisgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IG5ldyBPc1N0YWNrVHJhY2VHZXR0ZXI7CisgIH0KKworICByZXR1cm4gb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcgorLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCitUZXN0UmVzdWx0KiBVbml0VGVzdEltcGw6OmN1cnJlbnRfdGVzdF9yZXN1bHQoKSB7CisgIHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb18gPworICAgIGN1cnJlbnRfdGVzdF9pbmZvXy0+aW1wbCgpLT5yZXN1bHQoKSA6ICZhZF9ob2NfdGVzdF9yZXN1bHRfOworfQorCisvLyBTaHVmZmxlcyBhbGwgdGVzdCBjYXNlcywgYW5kIHRoZSB0ZXN0cyB3aXRoaW4gZWFjaCB0ZXN0IGNhc2UsCisvLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2h1ZmZsZVRlc3RzKCkgeworICAvLyBTaHVmZmxlcyB0aGUgZGVhdGggdGVzdCBjYXNlcy4KKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCAwLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLCAmdGVzdF9jYXNlX2luZGljZXNfKTsKKworICAvLyBTaHVmZmxlcyB0aGUgbm9uLWRlYXRoIHRlc3QgY2FzZXMuCisgIFNodWZmbGVSYW5nZShyYW5kb20oKSwgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfICsgMSwKKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKSwgJnRlc3RfY2FzZV9pbmRpY2VzXyk7CisKKyAgLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluc2lkZSBlYWNoIHRlc3QgY2FzZS4KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIHRlc3RfY2FzZXNfW2ldLT5TaHVmZmxlVGVzdHMocmFuZG9tKCkpOworICB9Cit9CisKKy8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCit2b2lkIFVuaXRUZXN0SW1wbDo6VW5zaHVmZmxlVGVzdHMoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBVbnNodWZmbGVzIHRoZSB0ZXN0cyBpbiBlYWNoIHRlc3QgY2FzZS4KKyAgICB0ZXN0X2Nhc2VzX1tpXS0+VW5zaHVmZmxlVGVzdHMoKTsKKyAgICAvLyBSZXNldHMgdGhlIGluZGV4IG9mIGVhY2ggdGVzdCBjYXNlLgorICAgIHRlc3RfY2FzZV9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7CisgIH0KK30KKworLy8gVGVzdEluZm9JbXBsIGNvbnN0cnVjdG9yLiBUaGUgbmV3IGluc3RhbmNlIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSB0ZXN0CisvLyBmYWN0b3J5IG9iamVjdC4KK1Rlc3RJbmZvSW1wbDo6VGVzdEluZm9JbXBsKFRlc3RJbmZvKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV90ZXN0X2Nhc2VfY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVJZCBhX2ZpeHR1cmVfY2xhc3NfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KSA6CisgICAgcGFyZW50XyhwYXJlbnQpLAorICAgIHRlc3RfY2FzZV9uYW1lXyhTdHJpbmcoYV90ZXN0X2Nhc2VfbmFtZSkpLAorICAgIG5hbWVfKFN0cmluZyhhX25hbWUpKSwKKyAgICB0ZXN0X2Nhc2VfY29tbWVudF8oU3RyaW5nKGFfdGVzdF9jYXNlX2NvbW1lbnQpKSwKKyAgICBjb21tZW50XyhTdHJpbmcoYV9jb21tZW50KSksCisgICAgZml4dHVyZV9jbGFzc19pZF8oYV9maXh0dXJlX2NsYXNzX2lkKSwKKyAgICBzaG91bGRfcnVuXyhmYWxzZSksCisgICAgaXNfZGlzYWJsZWRfKGZhbHNlKSwKKyAgICBtYXRjaGVzX2ZpbHRlcl8oZmFsc2UpLAorICAgIGZhY3RvcnlfKGZhY3RvcnkpIHsKK30KKworLy8gVGVzdEluZm9JbXBsIGRlc3RydWN0b3IuCitUZXN0SW5mb0ltcGw6On5UZXN0SW5mb0ltcGwoKSB7CisgIGRlbGV0ZSBmYWN0b3J5XzsKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhIFN0cmluZy4KKy8vCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKy8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAorLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKy8vIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoLi4uLCAxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbgorLy8gdGhlIHRyYWNlIGJ1dCBCYXIoKSBhbmQgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0LgorU3RyaW5nIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoVW5pdFRlc3QqIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcF9jb3VudCkgeworICAvLyBXZSBwYXNzIHNraXBfY291bnQgKyAxIHRvIHNraXAgdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGluIGFkZGl0aW9uCisgIC8vIHRvIHdoYXQgdGhlIHVzZXIgcmVhbGx5IHdhbnRzIHRvIHNraXAuCisgIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChza2lwX2NvdW50ICsgMSk7Cit9CisKKy8vIFVzZWQgYnkgdGhlIEdURVNUX0hJREVfVU5SRUFDSEFCTEVfQ09ERV8gbWFjcm8gdG8gc3VwcHJlc3MgdW5yZWFjaGFibGUKKy8vIGNvZGUgd2FybmluZ3MuCituYW1lc3BhY2UgeworY2xhc3MgQ2xhc3NVbmlxdWVUb0Fsd2F5c1RydWUge307Cit9CisKK2Jvb2wgSXNUcnVlKGJvb2wgY29uZGl0aW9uKSB7IHJldHVybiBjb25kaXRpb247IH0KKworYm9vbCBBbHdheXNUcnVlKCkgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgIC8vIFRoaXMgY29uZGl0aW9uIGlzIGFsd2F5cyBmYWxzZSBzbyBBbHdheXNUcnVlKCkgbmV2ZXIgYWN0dWFsbHkgdGhyb3dzLAorICAvLyBidXQgaXQgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoYXQgaXQgbWF5IHRocm93LgorICBpZiAoSXNUcnVlKGZhbHNlKSkKKyAgICB0aHJvdyBDbGFzc1VuaXF1ZVRvQWx3YXlzVHJ1ZSgpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gSWYgKnBzdHIgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgbW9kaWZpZXMgKnBzdHIgdG8gYmUgcmlnaHQKKy8vIHBhc3QgdGhlIHByZWZpeCBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICpwc3RyIHVuY2hhbmdlZAorLy8gYW5kIHJldHVybnMgZmFsc2UuICBOb25lIG9mIHBzdHIsICpwc3RyLCBhbmQgcHJlZml4IGNhbiBiZSBOVUxMLgorYm9vbCBTa2lwUHJlZml4KGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhcioqIHBzdHIpIHsKKyAgY29uc3Qgc2l6ZV90IHByZWZpeF9sZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgaWYgKHN0cm5jbXAoKnBzdHIsIHByZWZpeCwgcHJlZml4X2xlbikgPT0gMCkgeworICAgICpwc3RyICs9IHByZWZpeF9sZW47CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgYXMgYSBjb21tYW5kIGxpbmUgZmxhZy4gIFRoZSBzdHJpbmcgc2hvdWxkIGhhdmUKKy8vIHRoZSBmb3JtYXQgIi0tZmxhZz12YWx1ZSIuICBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCB0aGUgIj12YWx1ZSIKKy8vIHBhcnQgY2FuIGJlIG9taXR0ZWQuCisvLworLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcsIG9yIE5VTEwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorY29uc3QgY2hhciogUGFyc2VGbGFnVmFsdWUoY29uc3QgY2hhciogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmX29wdGlvbmFsKSB7CisgIC8vIHN0ciBhbmQgZmxhZyBtdXN0IG5vdCBiZSBOVUxMLgorICBpZiAoc3RyID09IE5VTEwgfHwgZmxhZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAvLyBUaGUgZmxhZyBtdXN0IHN0YXJ0IHdpdGggIi0tIiBmb2xsb3dlZCBieSBHVEVTVF9GTEFHX1BSRUZJWF8uCisgIGNvbnN0IFN0cmluZyBmbGFnX3N0ciA9IFN0cmluZzo6Rm9ybWF0KCItLSVzJXMiLCBHVEVTVF9GTEFHX1BSRUZJWF8sIGZsYWcpOworICBjb25zdCBzaXplX3QgZmxhZ19sZW4gPSBmbGFnX3N0ci5sZW5ndGgoKTsKKyAgaWYgKHN0cm5jbXAoc3RyLCBmbGFnX3N0ci5jX3N0cigpLCBmbGFnX2xlbikgIT0gMCkgcmV0dXJuIE5VTEw7CisKKyAgLy8gU2tpcHMgdGhlIGZsYWcgbmFtZS4KKyAgY29uc3QgY2hhciogZmxhZ19lbmQgPSBzdHIgKyBmbGFnX2xlbjsKKworICAvLyBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCBpdCdzIE9LIHRvIG5vdCBoYXZlIGEgIj12YWx1ZSIgcGFydC4KKyAgaWYgKGRlZl9vcHRpb25hbCAmJiAoZmxhZ19lbmRbMF0gPT0gJ1wwJykpIHsKKyAgICByZXR1cm4gZmxhZ19lbmQ7CisgIH0KKworICAvLyBJZiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG1vcmUgY2hhcmFjdGVycyBhZnRlciB0aGUKKyAgLy8gZmxhZyBuYW1lLCBvciBpZiBkZWZfb3B0aW9uYWwgaXMgZmFsc2UsIHRoZXJlIG11c3QgYmUgYSAnPScgYWZ0ZXIKKyAgLy8gdGhlIGZsYWcgbmFtZS4KKyAgaWYgKGZsYWdfZW5kWzBdICE9ICc9JykgcmV0dXJuIE5VTEw7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIGFmdGVyICI9Ii4KKyAgcmV0dXJuIGZsYWdfZW5kICsgMTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIGJvb2wgZmxhZywgaW4gdGhlIGZvcm0gb2YgZWl0aGVyCisvLyAiLS1mbGFnPXZhbHVlIiBvciAiLS1mbGFnIi4KKy8vCisvLyBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0cnVlIGFzIGxvbmcgYXMgaXQgZG9lcworLy8gbm90IHN0YXJ0IHdpdGggJzAnLCAnZicsIG9yICdGJy4KKy8vCisvLyBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0cnVlLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlQm9vbEZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBib29sKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCB0cnVlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBDb252ZXJ0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIGEgYm9vbC4KKyAgKnZhbHVlID0gISgqdmFsdWVfc3RyID09ICcwJyB8fCAqdmFsdWVfc3RyID09ICdmJyB8fCAqdmFsdWVfc3RyID09ICdGJyk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mCisvLyAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZUludDMyRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIEludDMyKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgorICByZXR1cm4gUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIlRoZSB2YWx1ZSBvZiBmbGFnIC0tIiA8PCBmbGFnLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHIsIHZhbHVlKTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIHN0cmluZyBmbGFnLCBpbiB0aGUgZm9ybSBvZgorLy8gIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VTdHJpbmdGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgU3RyaW5nKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgorICAqdmFsdWUgPSB2YWx1ZV9zdHI7CisgIHJldHVybiB0cnVlOworfQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgaGFzIGEgcHJlZml4IHRoYXQgR29vZ2xlIFRlc3QgdXNlcyBmb3IgaXRzCisvLyBmbGFncywgaS5lLiwgc3RhcnRzIHdpdGggR1RFU1RfRkxBR19QUkVGSVhfIG9yIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLgorLy8gSWYgR29vZ2xlIFRlc3QgZGV0ZWN0cyB0aGF0IGEgY29tbWFuZCBsaW5lIGZsYWcgaGFzIGl0cyBwcmVmaXggYnV0IGlzIG5vdAorLy8gcmVjb2duaXplZCwgaXQgd2lsbCBwcmludCBpdHMgaGVscCBtZXNzYWdlLiBGbGFncyBzdGFydGluZyB3aXRoCisvLyBHVEVTVF9JTlRFUk5BTF9QUkVGSVhfIGZvbGxvd2VkIGJ5ICJpbnRlcm5hbF8iIGFyZSBjb25zaWRlcmVkIEdvb2dsZSBUZXN0CisvLyBpbnRlcm5hbCBmbGFncyBhbmQgZG8gbm90IHRyaWdnZXIgdGhlIGhlbHAgbWVzc2FnZS4KK3N0YXRpYyBib29sIEhhc0dvb2dsZVRlc3RGbGFnUHJlZml4KGNvbnN0IGNoYXIqIHN0cikgeworICByZXR1cm4gKFNraXBQcmVmaXgoIi0tIiwgJnN0cikgfHwKKyAgICAgICAgICBTa2lwUHJlZml4KCItIiwgJnN0cikgfHwKKyAgICAgICAgICBTa2lwUHJlZml4KCIvIiwgJnN0cikpICYmCisgICAgICAgICAhU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8gImludGVybmFsXyIsICZzdHIpICYmCisgICAgICAgICAoU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8sICZzdHIpIHx8CisgICAgICAgICAgU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXywgJnN0cikpOworfQorCisvLyBQcmludHMgYSBzdHJpbmcgY29udGFpbmluZyBjb2RlLWVuY29kZWQgdGV4dC4gIFRoZSBmb2xsb3dpbmcgZXNjYXBlCisvLyBzZXF1ZW5jZXMgY2FuIGJlIHVzZWQgaW4gdGhlIHN0cmluZyB0byBjb250cm9sIHRoZSB0ZXh0IGNvbG9yOgorLy8KKy8vICAgQEAgICAgcHJpbnRzIGEgc2luZ2xlICdAJyBjaGFyYWN0ZXIuCisvLyAgIEBSICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHJlZC4KKy8vICAgQEcgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8gZ3JlZW4uCisvLyAgIEBZICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHllbGxvdy4KKy8vICAgQEQgICAgY2hhbmdlcyB0byB0aGUgZGVmYXVsdCB0ZXJtaW5hbCB0ZXh0IGNvbG9yLgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBXcml0ZSB0ZXN0cyBmb3IgdGhpcyBvbmNlIHdlIGFkZCBzdGRvdXQKKy8vIGNhcHR1cmluZyB0byBHb29nbGUgVGVzdC4KK3N0YXRpYyB2b2lkIFByaW50Q29sb3JFbmNvZGVkKGNvbnN0IGNoYXIqIHN0cikgeworICBHVGVzdENvbG9yIGNvbG9yID0gQ09MT1JfREVGQVVMVDsgIC8vIFRoZSBjdXJyZW50IGNvbG9yLgorCisgIC8vIENvbmNlcHR1YWxseSwgd2Ugc3BsaXQgdGhlIHN0cmluZyBpbnRvIHNlZ21lbnRzIGRpdmlkZWQgYnkgZXNjYXBlCisgIC8vIHNlcXVlbmNlcy4gIFRoZW4gd2UgcHJpbnQgb25lIHNlZ21lbnQgYXQgYSB0aW1lLiAgQXQgdGhlIGVuZCBvZgorICAvLyBlYWNoIGl0ZXJhdGlvbiwgdGhlIHN0ciBwb2ludGVyIGFkdmFuY2VzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIC8vIG5leHQgc2VnbWVudC4KKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIqIHAgPSBzdHJjaHIoc3RyLCAnQCcpOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICIlcyIsIHN0cik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgU3RyaW5nKHN0ciwgcCAtIHN0cikuY19zdHIoKSk7CisKKyAgICBjb25zdCBjaGFyIGNoID0gcFsxXTsKKyAgICBzdHIgPSBwICsgMjsKKyAgICBpZiAoY2ggPT0gJ0AnKSB7CisgICAgICBDb2xvcmVkUHJpbnRmKGNvbG9yLCAiQCIpOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ0QnKSB7CisgICAgICBjb2xvciA9IENPTE9SX0RFRkFVTFQ7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnUicpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfUkVEOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ0cnKSB7CisgICAgICBjb2xvciA9IENPTE9SX0dSRUVOOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1knKSB7CisgICAgICBjb2xvciA9IENPTE9SX1lFTExPVzsKKyAgICB9IGVsc2UgeworICAgICAgLS1zdHI7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGtDb2xvckVuY29kZWRIZWxwTWVzc2FnZVtdID0KKyJUaGlzIHByb2dyYW0gY29udGFpbnMgdGVzdHMgd3JpdHRlbiB1c2luZyAiIEdURVNUX05BTUVfICIuIFlvdSBjYW4gdXNlIHRoZVxuIgorImZvbGxvd2luZyBjb21tYW5kIGxpbmUgZmxhZ3MgdG8gY29udHJvbCBpdHMgYmVoYXZpb3I6XG4iCisiXG4iCisiVGVzdCBTZWxlY3Rpb246XG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImxpc3RfdGVzdHNARFxuIgorIiAgICAgIExpc3QgdGhlIG5hbWVzIG9mIGFsbCB0ZXN0cyBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhlbS4gVGhlIG5hbWUgb2ZcbiIKKyIgICAgICBURVNUKEZvbywgQmFyKSBpcyBcIkZvby5CYXJcIi5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiZmlsdGVyPUBZUE9TVElWRV9QQVRURVJOUyIKKyAgICAiW0BHLUBZTkVHQVRJVkVfUEFUVEVSTlNdQERcbiIKKyIgICAgICBSdW4gb25seSB0aGUgdGVzdHMgd2hvc2UgbmFtZSBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgcGF0dGVybnMgYnV0XG4iCisiICAgICAgbm9uZSBvZiB0aGUgbmVnYXRpdmUgcGF0dGVybnMuICc/JyBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyOyAnKidcbiIKKyIgICAgICBtYXRjaGVzIGFueSBzdWJzdHJpbmc7ICc6JyBzZXBhcmF0ZXMgdHdvIHBhdHRlcm5zLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c0BEXG4iCisiICAgICAgUnVuIGFsbCBkaXNhYmxlZCB0ZXN0cyB0b28uXG4iCisiXG4iCisiVGVzdCBFeGVjdXRpb246XG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInJlcGVhdD1AWVtDT1VOVF1ARFxuIgorIiAgICAgIFJ1biB0aGUgdGVzdHMgcmVwZWF0ZWRseTsgdXNlIGEgbmVnYXRpdmUgY291bnQgdG8gcmVwZWF0IGZvcmV2ZXIuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInNodWZmbGVARFxuIgorIiAgICAgIFJhbmRvbWl6ZSB0ZXN0cycgb3JkZXJzIG9uIGV2ZXJ5IGl0ZXJhdGlvbi5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAicmFuZG9tX3NlZWQ9QFlbTlVNQkVSXUBEXG4iCisiICAgICAgUmFuZG9tIG51bWJlciBzZWVkIHRvIHVzZSBmb3Igc2h1ZmZsaW5nIHRlc3Qgb3JkZXJzIChiZXR3ZWVuIDEgYW5kXG4iCisiICAgICAgOTk5OTksIG9yIDAgdG8gdXNlIGEgc2VlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lKS5cbiIKKyJcbiIKKyJUZXN0IE91dHB1dDpcbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiY29sb3I9QFkoQEd5ZXNAWXxAR25vQFl8QEdhdXRvQFkpQERcbiIKKyIgICAgICBFbmFibGUvZGlzYWJsZSBjb2xvcmVkIG91dHB1dC4gVGhlIGRlZmF1bHQgaXMgQEdhdXRvQEQuXG4iCisiICAtQEctIiBHVEVTVF9GTEFHX1BSRUZJWF8gInByaW50X3RpbWU9MEBEXG4iCisiICAgICAgRG9uJ3QgcHJpbnQgdGhlIGVsYXBzZWQgdGltZSBvZiBlYWNoIHRlc3QuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gIm91dHB1dD14bWxAWVtARzpAWURJUkVDVE9SWV9QQVRIQEciCisgICAgR1RFU1RfUEFUSF9TRVBfICJAWXxARzpAWUZJTEVfUEFUSF1ARFxuIgorIiAgICAgIEdlbmVyYXRlIGFuIFhNTCByZXBvcnQgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSBvciB3aXRoIHRoZSBnaXZlbiBmaWxlXG4iCisiICAgICAgbmFtZS4gQFlGSUxFX1BBVEhARCBkZWZhdWx0cyB0byBAR3Rlc3RfZGV0YWlscy54bWxARC5cbiIKKyJcbiIKKyJBc3NlcnRpb24gQmVoYXZpb3I6XG4iCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QgJiYgIUdURVNUX09TX1dJTkRPV1MKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiZGVhdGhfdGVzdF9zdHlsZT1AWShAR2Zhc3RAWXxAR3RocmVhZHNhZmVAWSlARFxuIgorIiAgICAgIFNldCB0aGUgZGVmYXVsdCBkZWF0aCB0ZXN0IHN0eWxlLlxuIgorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVCAmJiAhR1RFU1RfT1NfV0lORE9XUworIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJicmVha19vbl9mYWlsdXJlQERcbiIKKyIgICAgICBUdXJuIGFzc2VydGlvbiBmYWlsdXJlcyBpbnRvIGRlYnVnZ2VyIGJyZWFrLXBvaW50cy5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAidGhyb3dfb25fZmFpbHVyZUBEXG4iCisiICAgICAgVHVybiBhc3NlcnRpb24gZmFpbHVyZXMgaW50byBDKysgZXhjZXB0aW9ucy5cbiIKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNhdGNoX2V4Y2VwdGlvbnNARFxuIgorIiAgICAgIFN1cHByZXNzIHBvcC11cHMgY2F1c2VkIGJ5IGV4Y2VwdGlvbnMuXG4iCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyJcbiIKKyJFeGNlcHQgZm9yIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAibGlzdF90ZXN0c0BELCB5b3UgY2FuIGFsdGVybmF0aXZlbHkgc2V0ICIKKyAgICAidGhlIGNvcnJlc3BvbmRpbmdcbiIKKyJlbnZpcm9ubWVudCB2YXJpYWJsZSBvZiBhIGZsYWcgKGFsbCBsZXR0ZXJzIGluIHVwcGVyLWNhc2UpLiBGb3IgZXhhbXBsZSwgdG9cbiIKKyJkaXNhYmxlIGNvbG9yZWQgdGV4dCBvdXRwdXQsIHlvdSBjYW4gZWl0aGVyIHNwZWNpZnkgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfCisgICAgImNvbG9yPW5vQEQgb3Igc2V0XG4iCisidGhlIEBHIiBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIkNPTE9SQEQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gQEdub0BELlxuIgorIlxuIgorIkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCB0aGUgIiBHVEVTVF9OQU1FXyAiIGRvY3VtZW50YXRpb24gYXRcbiIKKyJARyIgR1RFU1RfUFJPSkVDVF9VUkxfICJARC4gSWYgeW91IGZpbmQgYSBidWcgaW4gIiBHVEVTVF9OQU1FXyAiXG4iCisiKG5vdCBvbmUgaW4geW91ciBvd24gY29kZSBvciB0ZXN0cyksIHBsZWFzZSByZXBvcnQgaXQgdG9cbiIKKyJARzwiIEdURVNUX0RFVl9FTUFJTF8gIj5ARC5cbiI7CisKKy8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKKy8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0LiAgVGhlIHR5cGUgcGFyYW1ldGVyIENoYXJUeXBlIGNhbiBiZQorLy8gaW5zdGFudGlhdGVkIHRvIGVpdGhlciBjaGFyIG9yIHdjaGFyX3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Cit2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCAqYXJnYzsgaSsrKSB7CisgICAgY29uc3QgU3RyaW5nIGFyZ19zdHJpbmcgPSBTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSk7CisgICAgY29uc3QgY2hhciogY29uc3QgYXJnID0gYXJnX3N0cmluZy5jX3N0cigpOworCisgICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlQm9vbEZsYWc7CisgICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlSW50MzJGbGFnOworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZVN0cmluZ0ZsYWc7CisKKyAgICAvLyBEbyB3ZSBzZWUgYSBHb29nbGUgVGVzdCBmbGFnPworICAgIGlmIChQYXJzZUJvb2xGbGFnKGFyZywga0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrQnJlYWtPbkZhaWx1cmVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0NhdGNoRXhjZXB0aW9uc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtDb2xvckZsYWcsICZHVEVTVF9GTEFHKGNvbG9yKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0RlYXRoVGVzdFN0eWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0RlYXRoVGVzdFVzZUZvcmssCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtGaWx0ZXJGbGFnLCAmR1RFU1RfRkxBRyhmaWx0ZXIpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0xpc3RUZXN0c0ZsYWcsICZHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrT3V0cHV0RmxhZywgJkdURVNUX0ZMQUcob3V0cHV0KSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtQcmludFRpbWVGbGFnLCAmR1RFU1RfRkxBRyhwcmludF90aW1lKSkgfHwKKyAgICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmFuZG9tU2VlZEZsYWcsICZHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSkgfHwKKyAgICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmVwZWF0RmxhZywgJkdURVNUX0ZMQUcocmVwZWF0KSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtTaHVmZmxlRmxhZywgJkdURVNUX0ZMQUcoc2h1ZmZsZSkpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1N0YWNrVHJhY2VEZXB0aEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtUaHJvd09uRmFpbHVyZUZsYWcsICZHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKQorICAgICAgICApIHsKKyAgICAgIC8vIFllcy4gIFNoaWZ0IHRoZSByZW1haW5kZXIgb2YgdGhlIGFyZ3YgbGlzdCBsZWZ0IGJ5IG9uZS4gIE5vdGUKKyAgICAgIC8vIHRoYXQgYXJndiBoYXMgKCphcmdjICsgMSkgZWxlbWVudHMsIHRoZSBsYXN0IG9uZSBhbHdheXMgYmVpbmcKKyAgICAgIC8vIE5VTEwuICBUaGUgZm9sbG93aW5nIGxvb3AgbW92ZXMgdGhlIHRyYWlsaW5nIE5VTEwgZWxlbWVudCBhcworICAgICAgLy8gd2VsbC4KKyAgICAgIGZvciAoaW50IGogPSBpOyBqICE9ICphcmdjOyBqKyspIHsKKyAgICAgICAgYXJndltqXSA9IGFyZ3ZbaiArIDFdOworICAgICAgfQorCisgICAgICAvLyBEZWNyZW1lbnRzIHRoZSBhcmd1bWVudCBjb3VudC4KKyAgICAgICgqYXJnYyktLTsKKworICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGRlY3JlbWVudCB0aGUgaXRlcmF0b3IgYXMgd2UganVzdCByZW1vdmVkCisgICAgICAvLyBhbiBlbGVtZW50LgorICAgICAgaS0tOworICAgIH0gZWxzZSBpZiAoYXJnX3N0cmluZyA9PSAiLS1oZWxwIiB8fCBhcmdfc3RyaW5nID09ICItaCIgfHwKKyAgICAgICAgICAgICAgIGFyZ19zdHJpbmcgPT0gIi0/IiB8fCBhcmdfc3RyaW5nID09ICIvPyIgfHwKKyAgICAgICAgICAgICAgIEhhc0dvb2dsZVRlc3RGbGFnUHJlZml4KGFyZykpIHsKKyAgICAgIC8vIEJvdGggaGVscCBmbGFnIGFuZCB1bnJlY29nbml6ZWQgR29vZ2xlIFRlc3QgZmxhZ3MgKGV4Y2x1ZGluZworICAgICAgLy8gaW50ZXJuYWwgb25lcykgdHJpZ2dlciBoZWxwIGRpc3BsYXkuCisgICAgICBnX2hlbHBfZmxhZyA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKGdfaGVscF9mbGFnKSB7CisgICAgLy8gV2UgcHJpbnQgdGhlIGhlbHAgaGVyZSBpbnN0ZWFkIG9mIGluIFJVTl9BTExfVEVTVFMoKSwgYXMgdGhlCisgICAgLy8gbGF0dGVyIG1heSBub3QgYmUgY2FsbGVkIGF0IGFsbCBpZiB0aGUgdXNlciBpcyB1c2luZyBHb29nbGUKKyAgICAvLyBUZXN0IHdpdGggYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yay4KKyAgICBQcmludENvbG9yRW5jb2RlZChrQ29sb3JFbmNvZGVkSGVscE1lc3NhZ2UpOworICB9Cit9CisKKy8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKKy8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0Lgordm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCBjaGFyKiogYXJndikgeworICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGFyZ2MsIGFyZ3YpOworfQordm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgeworICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGFyZ2MsIGFyZ3YpOworfQorCisvLyBUaGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgSW5pdEdvb2dsZVRlc3QoKS4KKy8vCisvLyBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvcgorLy8gd2NoYXJfdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KK3ZvaWQgSW5pdEdvb2dsZVRlc3RJbXBsKGludCogYXJnYywgQ2hhclR5cGUqKiBhcmd2KSB7CisgIGdfaW5pdF9ndGVzdF9jb3VudCsrOworCisgIC8vIFdlIGRvbid0IHdhbnQgdG8gcnVuIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlIHR3aWNlLgorICBpZiAoZ19pbml0X2d0ZXN0X2NvdW50ICE9IDEpIHJldHVybjsKKworICBpZiAoKmFyZ2MgPD0gMCkgcmV0dXJuOworCisgIGludGVybmFsOjpnX2V4ZWN1dGFibGVfcGF0aCA9IGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoYXJndlswXSk7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICBnX2FyZ3ZzLmNsZWFyKCk7CisgIGZvciAoaW50IGkgPSAwOyBpICE9ICphcmdjOyBpKyspIHsKKyAgICBnX2FyZ3ZzLnB1c2hfYmFjayhTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSkpOworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGFyZ2MsIGFyZ3YpOworICBHZXRVbml0VGVzdEltcGwoKS0+UG9zdEZsYWdQYXJzaW5nSW5pdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nCisvLyBSVU5fQUxMX1RFU1RTKCkuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZQorLy8gZmxhZ3MgdGhhdCBHb29nbGUgVGVzdCByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgVGVzdCBmbGFnIGlzCisvLyBzZWVuLCBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgorLy8KKy8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBUZXN0IGZsYWcgdmFyaWFibGVzIGFyZQorLy8gdXBkYXRlZC4KKy8vCisvLyBDYWxsaW5nIHRoZSBmdW5jdGlvbiBmb3IgdGhlIHNlY29uZCB0aW1lIGhhcyBubyB1c2VyLXZpc2libGUgZWZmZWN0Lgordm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGludGVybmFsOjpJbml0R29vZ2xlVGVzdEltcGwoYXJnYywgYXJndik7Cit9CisKKy8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KKy8vIFVOSUNPREUgbW9kZS4KK3ZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgeworICBpbnRlcm5hbDo6SW5pdEdvb2dsZVRlc3RJbXBsKGFyZ2MsIGFyZ3YpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxZGMxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgKQEAgLTAsMCArMSwyODMgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljIEFQSSBmb3IgZGVhdGggdGVzdHMuICBJdCBpcworLy8gI2luY2x1ZGVkIGJ5IGd0ZXN0Lmggc28gYSB1c2VyIGRvZXNuJ3QgbmVlZCB0byBpbmNsdWRlIHRoaXMKKy8vIGRpcmVjdGx5LgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0RFQVRIX1RFU1RfSF8KKworI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaD4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUaGlzIGZsYWcgY29udHJvbHMgdGhlIHN0eWxlIG9mIGRlYXRoIHRlc3RzLiAgVmFsaWQgdmFsdWVzIGFyZSAidGhyZWFkc2FmZSIsCisvLyBtZWFuaW5nIHRoYXQgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyB3aWxsIHJlLWV4ZWN1dGUgdGhlIHRlc3QgYmluYXJ5CisvLyBmcm9tIHRoZSBzdGFydCwgcnVubmluZyBvbmx5IGEgc2luZ2xlIGRlYXRoIHRlc3QsIG9yICJmYXN0IiwKKy8vIG1lYW5pbmcgdGhhdCB0aGUgY2hpbGQgcHJvY2VzcyB3aWxsIGV4ZWN1dGUgdGhlIHRlc3QgbG9naWMgaW1tZWRpYXRlbHkKKy8vIGFmdGVyIGZvcmtpbmcuCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oZGVhdGhfdGVzdF9zdHlsZSk7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgdXNlZnVsIGZvciB3cml0aW5nIGRlYXRoIHRlc3RzLgorCisvLyBIZXJlJ3Mgd2hhdCBoYXBwZW5zIHdoZW4gYW4gQVNTRVJUX0RFQVRIKiBvciBFWFBFQ1RfREVBVEgqIGlzCisvLyBleGVjdXRlZDoKKy8vCisvLyAgIDEuIEl0IGdlbmVyYXRlcyBhIHdhcm5pbmcgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBhY3RpdmUKKy8vICAgdGhyZWFkLiAgVGhpcyBpcyBiZWNhdXNlIGl0J3Mgc2FmZSB0byBmb3JrKCkgb3IgY2xvbmUoKSBvbmx5CisvLyAgIHdoZW4gdGhlcmUgaXMgYSBzaW5nbGUgdGhyZWFkLgorLy8KKy8vICAgMi4gVGhlIHBhcmVudCBwcm9jZXNzIGNsb25lKClzIGEgc3ViLXByb2Nlc3MgYW5kIHJ1bnMgdGhlIGRlYXRoCisvLyAgIHRlc3QgaW4gaXQ7IHRoZSBzdWItcHJvY2VzcyBleGl0cyB3aXRoIGNvZGUgMCBhdCB0aGUgZW5kIG9mIHRoZQorLy8gICBkZWF0aCB0ZXN0LCBpZiBpdCBoYXNuJ3QgZXhpdGVkIGFscmVhZHkuCisvLworLy8gICAzLiBUaGUgcGFyZW50IHByb2Nlc3Mgd2FpdHMgZm9yIHRoZSBzdWItcHJvY2VzcyB0byB0ZXJtaW5hdGUuCisvLworLy8gICA0LiBUaGUgcGFyZW50IHByb2Nlc3MgY2hlY2tzIHRoZSBleGl0IGNvZGUgYW5kIGVycm9yIG1lc3NhZ2Ugb2YKKy8vICAgdGhlIHN1Yi1wcm9jZXNzLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vICAgQVNTRVJUX0RFQVRIKHNlcnZlci5TZW5kTWVzc2FnZSg1NiwgIkhlbGxvIiksICJJbnZhbGlkIHBvcnQgbnVtYmVyIik7CisvLyAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisvLyAgICAgRVhQRUNUX0RFQVRIKHNlcnZlci5Qcm9jZXNzUmVxdWVzdChpKSwKKy8vICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVxdWVzdCAuKiBpbiBQcm9jZXNzUmVxdWVzdCgpIikKKy8vICAgICAgICAgPDwgIkZhaWxlZCB0byBkaWUgb24gcmVxdWVzdCAiIDw8IGkpOworLy8gICB9CisvLworLy8gICBBU1NFUlRfRVhJVChzZXJ2ZXIuRXhpdE5vdygpLCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiRXhpdGluZyIpOworLy8KKy8vICAgYm9vbCBLaWxsZWRCeVNJR0hVUChpbnQgZXhpdF9jb2RlKSB7CisvLyAgICAgcmV0dXJuIFdJRlNJR05BTEVEKGV4aXRfY29kZSkgJiYgV1RFUk1TSUcoZXhpdF9jb2RlKSA9PSBTSUdIVVA7CisvLyAgIH0KKy8vCisvLyAgIEFTU0VSVF9FWElUKGNsaWVudC5IYW5nVXBTZXJ2ZXIoKSwgS2lsbGVkQnlTSUdIVVAsICJIYW5naW5nIHVwISIpOworLy8KKy8vIE9uIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIHVzZWQgaW4gZGVhdGggdGVzdHM6CisvLworLy8gICBPbiBQT1NJWC1jb21wbGlhbnQgc3lzdGVtcyAoKm5peCksIHdlIHVzZSB0aGUgPHJlZ2V4Lmg+IGxpYnJhcnksCisvLyAgIHdoaWNoIHVzZXMgdGhlIFBPU0lYIGV4dGVuZGVkIHJlZ2V4IHN5bnRheC4KKy8vCisvLyAgIE9uIG90aGVyIHBsYXRmb3JtcyAoZS5nLiBXaW5kb3dzKSwgd2Ugb25seSBzdXBwb3J0IGEgc2ltcGxlIHJlZ2V4CisvLyAgIHN5bnRheCBpbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIEdvb2dsZSBUZXN0LiAgVGhpcyBsaW1pdGVkCisvLyAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBlbm91Z2ggbW9zdCBvZiB0aGUgdGltZSB3aGVuIHdyaXRpbmcKKy8vICAgZGVhdGggdGVzdHM7IHRob3VnaCBpdCBsYWNrcyBtYW55IGZlYXR1cmVzIHlvdSBjYW4gZmluZCBpbiBQQ1JFCisvLyAgIG9yIFBPU0lYIGV4dGVuZGVkIHJlZ2V4IHN5bnRheC4gIEZvciBleGFtcGxlLCB3ZSBkb24ndCBzdXBwb3J0CisvLyAgIHVuaW9uICgieHx5IiksIGdyb3VwaW5nICgiKHh5KSIpLCBicmFja2V0cyAoIlt4eV0iKSwgYW5kCisvLyAgIHJlcGV0aXRpb24gY291bnQgKCJ4ezUsN30iKSwgYW1vbmcgb3RoZXJzLgorLy8KKy8vICAgQmVsb3cgaXMgdGhlIHN5bnRheCB0aGF0IHdlIGRvIHN1cHBvcnQuICBXZSBjaG9zZSBpdCB0byBiZSBhCisvLyAgIHN1YnNldCBvZiBib3RoIFBDUkUgYW5kIFBPU0lYIGV4dGVuZGVkIHJlZ2V4LCBzbyBpdCdzIGVhc3kgdG8KKy8vICAgbGVhcm4gd2hlcmV2ZXIgeW91IGNvbWUgZnJvbS4gIEluIHRoZSBmb2xsb3dpbmc6ICdBJyBkZW5vdGVzIGEKKy8vICAgbGl0ZXJhbCBjaGFyYWN0ZXIsIHBlcmlvZCAoLiksIG9yIGEgc2luZ2xlIFxcIGVzY2FwZSBzZXF1ZW5jZTsKKy8vICAgJ3gnIGFuZCAneScgZGVub3RlIHJlZ3VsYXIgZXhwcmVzc2lvbnM7ICdtJyBhbmQgJ24nIGFyZSBmb3IKKy8vICAgbmF0dXJhbCBudW1iZXJzLgorLy8KKy8vICAgICBjICAgICBtYXRjaGVzIGFueSBsaXRlcmFsIGNoYXJhY3RlciBjCisvLyAgICAgXFxkICAgbWF0Y2hlcyBhbnkgZGVjaW1hbCBkaWdpdAorLy8gICAgIFxcRCAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0J3Mgbm90IGEgZGVjaW1hbCBkaWdpdAorLy8gICAgIFxcZiAgIG1hdGNoZXMgXGYKKy8vICAgICBcXG4gICBtYXRjaGVzIFxuCisvLyAgICAgXFxyICAgbWF0Y2hlcyBccgorLy8gICAgIFxccyAgIG1hdGNoZXMgYW55IEFTQ0lJIHdoaXRlc3BhY2UsIGluY2x1ZGluZyBcbgorLy8gICAgIFxcUyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0J3Mgbm90IGEgd2hpdGVzcGFjZQorLy8gICAgIFxcdCAgIG1hdGNoZXMgXHQKKy8vICAgICBcXHYgICBtYXRjaGVzIFx2CisvLyAgICAgXFx3ICAgbWF0Y2hlcyBhbnkgbGV0dGVyLCBfLCBvciBkZWNpbWFsIGRpZ2l0CisvLyAgICAgXFxXICAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQgXFx3IGRvZXNuJ3QgbWF0Y2gKKy8vICAgICBcXGMgICBtYXRjaGVzIGFueSBsaXRlcmFsIGNoYXJhY3RlciBjLCB3aGljaCBtdXN0IGJlIGEgcHVuY3R1YXRpb24KKy8vICAgICAuICAgICBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIGV4Y2VwdCBcbgorLy8gICAgIEE/ICAgIG1hdGNoZXMgMCBvciAxIG9jY3VycmVuY2VzIG9mIEEKKy8vICAgICBBKiAgICBtYXRjaGVzIDAgb3IgbWFueSBvY2N1cnJlbmNlcyBvZiBBCisvLyAgICAgQSsgICAgbWF0Y2hlcyAxIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQorLy8gICAgIF4gICAgIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKQorLy8gICAgICQgICAgIG1hdGNoZXMgdGhlIGVuZCBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKQorLy8gICAgIHh5ICAgIG1hdGNoZXMgeCBmb2xsb3dlZCBieSB5CisvLworLy8gICBJZiB5b3UgYWNjaWRlbnRhbGx5IHVzZSBQQ1JFIG9yIFBPU0lYIGV4dGVuZGVkIHJlZ2V4IGZlYXR1cmVzCisvLyAgIG5vdCBpbXBsZW1lbnRlZCBieSB1cywgeW91IHdpbGwgZ2V0IGEgcnVuLXRpbWUgZmFpbHVyZS4gIEluIHRoYXQKKy8vICAgY2FzZSwgcGxlYXNlIHRyeSB0byByZXdyaXRlIHlvdXIgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiB0aGUKKy8vICAgYWJvdmUgc3ludGF4LgorLy8KKy8vICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyAqbm90KiBtZWFudCB0byBiZSBhcyBoaWdobHkgdHVuZWQgb3Igcm9idXN0CisvLyAgIGFzIGEgY29tcGlsZWQgcmVnZXggbGlicmFyeSwgYnV0IHNob3VsZCBwZXJmb3JtIHdlbGwgZW5vdWdoIGZvciBhCisvLyAgIGRlYXRoIHRlc3QsIHdoaWNoIGFscmVhZHkgaW5jdXJzIHNpZ25pZmljYW50IG92ZXJoZWFkIGJ5IGxhdW5jaGluZworLy8gICBhIGNoaWxkIHByb2Nlc3MuCisvLworLy8gS25vd24gY2F2ZWF0czoKKy8vCisvLyAgIEEgInRocmVhZHNhZmUiIHN0eWxlIGRlYXRoIHRlc3Qgb2J0YWlucyB0aGUgcGF0aCB0byB0aGUgdGVzdAorLy8gICBwcm9ncmFtIGZyb20gYXJndlswXSBhbmQgcmUtZXhlY3V0ZXMgaXQgaW4gdGhlIHN1Yi1wcm9jZXNzLiAgRm9yCisvLyAgIHNpbXBsaWNpdHksIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRICisvLyAgIHdoZW4gbGF1bmNoaW5nIHRoZSBzdWItcHJvY2Vzcy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciBtdXN0CisvLyAgIGludm9rZSB0aGUgdGVzdCBwcm9ncmFtIHZpYSBhIHBhdGggdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUKKy8vICAgcGF0aCBzZXBhcmF0b3IgKGUuZy4gcGF0aC90by9mb29fdGVzdCBhbmQKKy8vICAgL2Fic29sdXRlL3BhdGgvdG8vYmFyX3Rlc3QgYXJlIGZpbmUsIGJ1dCBmb29fdGVzdCBpcyBub3QpLiAgVGhpcworLy8gICBpcyByYXJlbHkgYSBwcm9ibGVtIGFzIHBlb3BsZSB1c3VhbGx5IGRvbid0IHB1dCB0aGUgdGVzdCBiaW5hcnkKKy8vICAgZGlyZWN0b3J5IGluIFBBVEguCisvLworLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG1ha2UgdGhyZWFkLXNhZmUgZGVhdGggdGVzdHMgc2VhcmNoIHRoZSBQQVRILgorCisvLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIHdpdGggYW4KKy8vIGludGVnZXIgZXhpdCBzdGF0dXMgdGhhdCBzYXRpc2ZpZXMgcHJlZGljYXRlLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0CisvLyB0aGF0IG1hdGNoZXMgcmVnZXguCisjZGVmaW5lIEFTU0VSVF9FWElUKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCkgXAorICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisvLyBMaWtlIEFTU0VSVF9FWElULCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCisvLyB0ZXN0IGNhc2UsIGlmIGFueToKKyNkZWZpbmUgRVhQRUNUX0VYSVQoc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4KSBcCisgIEdURVNUX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisKKy8vIEFzc2VydHMgdGhhdCBhIGdpdmVuIHN0YXRlbWVudCBjYXVzZXMgdGhlIHByb2dyYW0gdG8gZXhpdCwgZWl0aGVyIGJ5CisvLyBleHBsaWNpdGx5IGV4aXRpbmcgd2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlIG9yIGJlaW5nIGtpbGxlZCBieSBhCisvLyBzaWduYWwsIGFuZCBlbWl0dGluZyBlcnJvciBvdXRwdXQgdGhhdCBtYXRjaGVzIHJlZ2V4LgorI2RlZmluZSBBU1NFUlRfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBBU1NFUlRfRVhJVChzdGF0ZW1lbnQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4aXRlZFVuc3VjY2Vzc2Z1bGx5LCByZWdleCkKKworLy8gTGlrZSBBU1NFUlRfREVBVEgsIGJ1dCBjb250aW51ZXMgb24gdG8gc3VjY2Vzc2l2ZSB0ZXN0cyBpbiB0aGUKKy8vIHRlc3QgY2FzZSwgaWYgYW55OgorI2RlZmluZSBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4aXRlZFVuc3VjY2Vzc2Z1bGx5LCByZWdleCkKKworLy8gVHdvIHByZWRpY2F0ZSBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4ge0FTU0VSVCxFWFBFQ1R9X0VYSVQqOgorCisvLyBUZXN0cyB0aGF0IGFuIGV4aXQgY29kZSBkZXNjcmliZXMgYSBub3JtYWwgZXhpdCB3aXRoIGEgZ2l2ZW4gZXhpdCBjb2RlLgorY2xhc3MgR1RFU1RfQVBJXyBFeGl0ZWRXaXRoQ29kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBFeGl0ZWRXaXRoQ29kZShpbnQgZXhpdF9jb2RlKTsKKyAgYm9vbCBvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3Q7CisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBFeGl0ZWRXaXRoQ29kZSYgb3RoZXIpOworCisgIGNvbnN0IGludCBleGl0X2NvZGVfOworfTsKKworI2lmICFHVEVTVF9PU19XSU5ET1dTCisvLyBUZXN0cyB0aGF0IGFuIGV4aXQgY29kZSBkZXNjcmliZXMgYW4gZXhpdCBkdWUgdG8gdGVybWluYXRpb24gYnkgYQorLy8gZ2l2ZW4gc2lnbmFsLgorY2xhc3MgR1RFU1RfQVBJXyBLaWxsZWRCeVNpZ25hbCB7CisgcHVibGljOgorICBleHBsaWNpdCBLaWxsZWRCeVNpZ25hbChpbnQgc2lnbnVtKTsKKyAgYm9vbCBvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3Q7CisgcHJpdmF0ZToKKyAgY29uc3QgaW50IHNpZ251bV87Cit9OworI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBFWFBFQ1RfREVCVUdfREVBVEggYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnRzIGRpZSBpbiBkZWJ1ZyBtb2RlLgorLy8gVGhlIGRlYXRoIHRlc3RpbmcgZnJhbWV3b3JrIGNhdXNlcyB0aGlzIHRvIGhhdmUgaW50ZXJlc3Rpbmcgc2VtYW50aWNzLAorLy8gc2luY2UgdGhlIHNpZGVlZmZlY3RzIG9mIHRoZSBjYWxsIGFyZSBvbmx5IHZpc2libGUgaW4gb3B0IG1vZGUsIGFuZCBub3QKKy8vIGluIGRlYnVnIG1vZGUuCisvLworLy8gSW4gcHJhY3RpY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBmdW5jdGlvbnMgdGhhdCB1dGlsaXplIHRoZQorLy8gTE9HKERGQVRBTCkgbWFjcm8gdXNpbmcgdGhlIGZvbGxvd2luZyBzdHlsZToKKy8vCisvLyBpbnQgRGllSW5EZWJ1Z09yMTIoaW50KiBzaWRlZWZmZWN0KSB7CisvLyAgIGlmIChzaWRlZWZmZWN0KSB7CisvLyAgICAgKnNpZGVlZmZlY3QgPSAxMjsKKy8vICAgfQorLy8gICBMT0coREZBVEFMKSA8PCAiZGVhdGgiOworLy8gICByZXR1cm4gMTI7CisvLyB9CisvLworLy8gVEVTVChUZXN0Q2FzZSwgVGVzdERpZU9yMTJXb3Jrc0luRGdiQW5kT3B0KSB7CisvLyAgIGludCBzaWRlZWZmZWN0ID0gMDsKKy8vICAgLy8gT25seSBhc3NlcnRzIGluIGRiZy4KKy8vICAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdPcjEyKCZzaWRlZWZmZWN0KSwgImRlYXRoIik7CisvLworLy8gI2lmZGVmIE5ERUJVRworLy8gICAvLyBvcHQtbW9kZSBoYXMgc2lkZWVmZmVjdCB2aXNpYmxlLgorLy8gICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOworLy8gI2Vsc2UKKy8vICAgLy8gZGJnLW1vZGUgbm8gdmlzaWJsZSBzaWRlZWZmZWN0LgorLy8gICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7CisvLyAjZW5kaWYKKy8vIH0KKy8vCisvLyBUaGlzIHdpbGwgYXNzZXJ0IHRoYXQgRGllSW5EZWJ1Z1JldHVybjEySW5PcHQoKSBjcmFzaGVzIGluIGRlYnVnCisvLyBtb2RlLCB1c3VhbGx5IGR1ZSB0byBhIERDSEVDSyBvciBMT0coREZBVEFMKSwgYnV0IHJldHVybnMgdGhlCisvLyBhcHByb3ByaWF0ZSBmYWxsYmFjayB2YWx1ZSAoMTIgaW4gdGhpcyBjYXNlKSBpbiBvcHQgbW9kZS4gSWYgeW91CisvLyBuZWVkIHRvIHRlc3QgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhcHByb3ByaWF0ZSBzaWRlLWVmZmVjdHMgaW4gb3B0CisvLyBtb2RlLCBpbmNsdWRlIGFzc2VydGlvbnMgYWdhaW5zdCB0aGUgc2lkZS1lZmZlY3RzLiAgQSBnZW5lcmFsCisvLyBwYXR0ZXJuIGZvciB0aGlzIGlzOgorLy8KKy8vIEVYUEVDVF9ERUJVR19ERUFUSCh7CisvLyAgIC8vIFNpZGUtZWZmZWN0cyBoZXJlIHdpbGwgaGF2ZSBhbiBlZmZlY3QgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaW4KKy8vICAgLy8gb3B0IG1vZGUsIGJ1dCBub25lIGluIGRlYnVnIG1vZGUuCisvLyAgIEVYUEVDVF9FUSgxMiwgRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpKTsKKy8vIH0sICJkZWF0aCIpOworLy8KKyNpZmRlZiBOREVCVUcKKworI2RlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBkbyB7IHN0YXRlbWVudDsgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2RlZmluZSBBU1NFUlRfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBkbyB7IHN0YXRlbWVudDsgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2Vsc2UKKworI2RlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkKKworI2RlZmluZSBBU1NFUlRfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBBU1NFUlRfREVBVEgoc3RhdGVtZW50LCByZWdleCkKKworI2VuZGlmICAvLyBOREVCVUcgZm9yIEVYUEVDVF9ERUJVR19ERUFUSAorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIGFuZAorLy8gQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBleHBhbmQgdG8gcmVhbCBkZWF0aCB0ZXN0cyBpZgorLy8gZGVhdGggdGVzdHMgYXJlIHN1cHBvcnRlZDsgb3RoZXJ3aXNlIHRoZXkganVzdCBpc3N1ZSBhIHdhcm5pbmcuICBUaGlzIGlzCisvLyB1c2VmdWwgd2hlbiB5b3UgYXJlIGNvbWJpbmluZyBkZWF0aCB0ZXN0IGFzc2VydGlvbnMgd2l0aCBub3JtYWwgdGVzdAorLy8gYXNzZXJ0aW9ucyBpbiBvbmUgdGVzdC4KKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorI2RlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkKKyNkZWZpbmUgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCisjZWxzZQorI2RlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgICBHVEVTVF9VTlNVUFBPUlRFRF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHJlZ2V4LCApCisjZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHJldHVybikKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzNWI2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgTWVzc2FnZSBjbGFzcy4KKy8vCisvLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bworLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCisvLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6CisvLworLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisvLworLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKKy8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgorLy8gcHJvZ3JhbSEKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oPgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoZSBNZXNzYWdlIGNsYXNzIHdvcmtzIGxpa2UgYW4gb3N0cmVhbSByZXBlYXRlci4KKy8vCisvLyBUeXBpY2FsIHVzYWdlOgorLy8KKy8vICAgMS4gWW91IHN0cmVhbSBhIGJ1bmNoIG9mIHZhbHVlcyB0byBhIE1lc3NhZ2Ugb2JqZWN0LgorLy8gICAgICBJdCB3aWxsIHJlbWVtYmVyIHRoZSB0ZXh0IGluIGEgU3RyU3RyZWFtLgorLy8gICAyLiBUaGVuIHlvdSBzdHJlYW0gdGhlIE1lc3NhZ2Ugb2JqZWN0IHRvIGFuIG9zdHJlYW0uCisvLyAgICAgIFRoaXMgY2F1c2VzIHRoZSB0ZXh0IGluIHRoZSBNZXNzYWdlIHRvIGJlIHN0cmVhbWVkCisvLyAgICAgIHRvIHRoZSBvc3RyZWFtLgorLy8KKy8vIEZvciBleGFtcGxlOworLy8KKy8vICAgdGVzdGluZzo6TWVzc2FnZSBmb287CisvLyAgIGZvbyA8PCAxIDw8ICIgIT0gIiA8PCAyOworLy8gICBzdGQ6OmNvdXQgPDwgZm9vOworLy8KKy8vIHdpbGwgcHJpbnQgIjEgIT0gMiIuCisvLworLy8gTWVzc2FnZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5oZXJpdGVkIGZyb20uICBJbiBwYXJ0aWN1bGFyLCBpdHMKKy8vIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCisvLworLy8gTm90ZSB0aGF0IFN0clN0cmVhbSBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGdjYyBhbmQgaW4gTVNWQy4gIFlvdQorLy8gY2FuIHN0cmVhbSBhIE5VTEwgY2hhciBwb2ludGVyIHRvIGl0IGluIHRoZSBmb3JtZXIsIGJ1dCBub3QgaW4gdGhlCisvLyBsYXR0ZXIgKGl0IGNhdXNlcyBhbiBhY2Nlc3MgdmlvbGF0aW9uIGlmIHlvdSBkbykuICBUaGUgTWVzc2FnZQorLy8gY2xhc3MgaGlkZXMgdGhpcyBkaWZmZXJlbmNlIGJ5IHRyZWF0aW5nIGEgTlVMTCBjaGFyIHBvaW50ZXIgYXMKKy8vICIobnVsbCkiLgorY2xhc3MgR1RFU1RfQVBJXyBNZXNzYWdlIHsKKyBwcml2YXRlOgorICAvLyBUaGUgdHlwZSBvZiBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgZm9yCisgIC8vIG5hcnJvdyBzdHJlYW1zLgorICB0eXBlZGVmIHN0ZDo6b3N0cmVhbSYgKCpCYXNpY05hcnJvd0lvTWFuaXApKHN0ZDo6b3N0cmVhbSYpOworCisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IE1lc3NhZ2UuCisgIC8vIFdlIGFsbG9jYXRlIHRoZSBTdHJTdHJlYW0gc2VwYXJhdGVseSBiZWNhdXNlIGl0IG90aGVyd2lzZSBlYWNoIHVzZSBvZgorICAvLyBBU1NFUlQvRVhQRUNUIGluIGEgcHJvY2VkdXJlIGFkZHMgb3ZlciAyMDAgYnl0ZXMgdG8gdGhlIHByb2NlZHVyZSdzCisgIC8vIHN0YWNrIGZyYW1lIGxlYWRpbmcgdG8gaHVnZSBzdGFjayBmcmFtZXMgaW4gc29tZSBjYXNlczsgZ2NjIGRvZXMgbm90IHJldXNlCisgIC8vIHRoZSBzdGFjayBzcGFjZS4KKyAgTWVzc2FnZSgpIDogc3NfKG5ldyBpbnRlcm5hbDo6U3RyU3RyZWFtKSB7CisgICAgLy8gQnkgZGVmYXVsdCwgd2Ugd2FudCB0aGVyZSB0byBiZSBlbm91Z2ggcHJlY2lzaW9uIHdoZW4gcHJpbnRpbmcKKyAgICAvLyBhIGRvdWJsZSB0byBhIE1lc3NhZ2UuCisgICAgKnNzXyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMik7CisgIH0KKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1zZykgOiBzc18obmV3IGludGVybmFsOjpTdHJTdHJlYW0pIHsgIC8vIE5PTElOVAorICAgICpzc18gPDwgbXNnLkdldFN0cmluZygpOworICB9CisKKyAgLy8gQ29uc3RydWN0cyBhIE1lc3NhZ2UgZnJvbSBhIEMtc3RyaW5nLgorICBleHBsaWNpdCBNZXNzYWdlKGNvbnN0IGNoYXIqIHN0cikgOiBzc18obmV3IGludGVybmFsOjpTdHJTdHJlYW0pIHsKKyAgICAqc3NfIDw8IHN0cjsKKyAgfQorCisgIH5NZXNzYWdlKCkgeyBkZWxldGUgc3NfOyB9CisjaWYgR1RFU1RfT1NfU1lNQklBTgorICAvLyBTdHJlYW1zIGEgdmFsdWUgKGVpdGhlciBhIHBvaW50ZXIgb3Igbm90KSB0byB0aGlzIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCBUJiB2YWx1ZSkgeworICAgIFN0cmVhbUhlbHBlcih0eXBlbmFtZSBpbnRlcm5hbDo6aXNfcG9pbnRlcjxUPjo6dHlwZSgpLCB2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZWxzZQorICAvLyBTdHJlYW1zIGEgbm9uLXBvaW50ZXIgdmFsdWUgdG8gdGhpcyBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsKSB7CisgICAgOjpHVGVzdFN0cmVhbVRvSGVscGVyKHNzXywgdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTdHJlYW1zIGEgcG9pbnRlciB2YWx1ZSB0byB0aGlzIG9iamVjdC4KKyAgLy8KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhbiBvdmVybG9hZCBvZiB0aGUgcHJldmlvdXMgb25lLiAgV2hlbiB5b3UKKyAgLy8gc3RyZWFtIGEgcG9pbnRlciB0byBhIE1lc3NhZ2UsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQgYXMgaXQKKyAgLy8gaXMgbW9yZSBzcGVjaWFsaXplZC4gIChUaGUgQysrIFN0YW5kYXJkLCBzZWN0aW9uCisgIC8vIFt0ZW1wLmZ1bmMub3JkZXJdLikgIElmIHlvdSBzdHJlYW0gYSBub24tcG9pbnRlciwgdGhlbiB0aGUKKyAgLy8gcHJldmlvdXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQuCisgIC8vCisgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgb3ZlcmxvYWQgaXMgdGhhdCBzdHJlYW1pbmcgYSBOVUxMIHBvaW50ZXIgdG8KKyAgLy8gb3N0cmVhbSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuICBEZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLCB5b3UKKyAgLy8gbWF5IGdldCAiMCIsICIobmlsKSIsICIobnVsbCkiLCBvciBhbiBhY2Nlc3MgdmlvbGF0aW9uLiAgVG8KKyAgLy8gZW5zdXJlIGNvbnNpc3RlbnQgcmVzdWx0IGFjcm9zcyBjb21waWxlcnMsIHdlIGFsd2F5cyB0cmVhdCBOVUxMCisgIC8vIGFzICIobnVsbCkiLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KFQqIGNvbnN0JiBwb2ludGVyKSB7ICAvLyBOT0xJTlQKKyAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAqc3NfIDw8ICIobnVsbCkiOworICAgIH0gZWxzZSB7CisgICAgICA6OkdUZXN0U3RyZWFtVG9IZWxwZXIoc3NfLCBwb2ludGVyKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KKworICAvLyBTaW5jZSB0aGUgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIGFyZSBvdmVybG9hZGVkIGZvciBib3RoIG5hcnJvdworICAvLyBhbmQgd2lkZSBzdHJlYW1zLCB3ZSBoYXZlIHRvIHByb3ZpZGUgdGhpcyBzcGVjaWFsaXplZCBkZWZpbml0aW9uCisgIC8vIG9mIG9wZXJhdG9yIDw8LCBldmVuIHRob3VnaCBpdHMgYm9keSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgLy8gdGVtcGxhdGl6ZWQgdmVyc2lvbiBhYm92ZS4gIFdpdGhvdXQgdGhpcyBkZWZpbml0aW9uLCBzdHJlYW1pbmcKKyAgLy8gZW5kbCBvciBvdGhlciBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgdG8gTWVzc2FnZSB3aWxsIGNvbmZ1c2UgdGhlCisgIC8vIGNvbXBpbGVyLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChCYXNpY05hcnJvd0lvTWFuaXAgdmFsKSB7CisgICAgKnNzXyA8PCB2YWw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSW5zdGVhZCBvZiAxLzAsIHdlIHdhbnQgdG8gc2VlIHRydWUvZmFsc2UgZm9yIGJvb2wgdmFsdWVzLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChib29sIGIpIHsKKyAgICByZXR1cm4gKnRoaXMgPDwgKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgfQorCisgIC8vIFRoZXNlIHR3byBvdmVybG9hZHMgYWxsb3cgc3RyZWFtaW5nIGEgd2lkZSBDIHN0cmluZyB0byBhIE1lc3NhZ2UKKyAgLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgICAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKKyAgfQorICBNZXNzYWdlJiBvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgICAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisgIC8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisgIC8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCisgIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKyAgLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKyAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KKyAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjp3c3RyaW5nJiB3c3RyKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKyAgLy8gR2V0cyB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBzbyBmYXIgYXMgYSBTdHJpbmcuCisgIC8vIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorICAvLworICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisgIGludGVybmFsOjpTdHJpbmcgR2V0U3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6U3RyU3RyZWFtVG9TdHJpbmcoc3NfKTsKKyAgfQorCisgcHJpdmF0ZToKKyNpZiBHVEVTVF9PU19TWU1CSUFOCisgIC8vIFRoZXNlIGFyZSBuZWVkZWQgYXMgdGhlIE5va2lhIFN5bWJpYW4gQ29tcGlsZXIgY2Fubm90IGRlY2lkZSBiZXR3ZWVuCisgIC8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiBUaGUgTm9raWEgY29tcGlsZXIgX2Nhbl8KKyAgLy8gZGVjaWRlIGJldHdlZW4gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciBUIGFuZCBUKiwgc28gYQorICAvLyB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3JrcywgYW5kIHdlIGNhbiBvdmVybG9hZCBvbiB0aGF0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIHZvaWQgU3RyZWFtSGVscGVyKGludGVybmFsOjp0cnVlX3R5cGUgLypkdW1teSovLCBUKiBwb2ludGVyKSB7CisgICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgKnNzXyA8PCAiKG51bGwpIjsKKyAgICB9IGVsc2UgeworICAgICAgOjpHVGVzdFN0cmVhbVRvSGVscGVyKHNzXywgcG9pbnRlcik7CisgICAgfQorICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZCBTdHJlYW1IZWxwZXIoaW50ZXJuYWw6OmZhbHNlX3R5cGUgLypkdW1teSovLCBjb25zdCBUJiB2YWx1ZSkgeworICAgIDo6R1Rlc3RTdHJlYW1Ub0hlbHBlcihzc18sIHZhbHVlKTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFOCisKKyAgLy8gV2UnbGwgaG9sZCB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBoZXJlLgorICBpbnRlcm5hbDo6U3RyU3RyZWFtKiBjb25zdCBzc187CisKKyAgLy8gV2UgZGVjbGFyZSAoYnV0IGRvbid0IGltcGxlbWVudCkgdGhpcyB0byBwcmV2ZW50IHRoZSBjb21waWxlcgorICAvLyBmcm9tIGltcGxlbWVudGluZyB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYpOworfTsKKworLy8gU3RyZWFtcyBhIE1lc3NhZ2UgdG8gYW4gb3N0cmVhbS4KK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IE1lc3NhZ2UmIHNiKSB7CisgIHJldHVybiBvcyA8PCBzYi5HZXRTdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmggYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODRkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oCkBAIC0wLDAgKzEsMTM5NyBAQAorLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgYSBzY3JpcHQuICBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIE1hY3JvcyBhbmQgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gaW4gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCisKKworLy8gVmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbGxvdyB5b3UgdG8gdGVzdCB5b3VyIGNvZGUgd2l0aCBkaWZmZXJlbnQKKy8vIHBhcmFtZXRlcnMgd2l0aG91dCB3cml0aW5nIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSB0ZXN0LgorLy8KKy8vIEhlcmUgaXMgaG93IHlvdSB1c2UgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0czoKKworI2lmIDAKKworLy8gVG8gd3JpdGUgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cywgZmlyc3QgeW91IHNob3VsZCBkZWZpbmUgYSBmaXh0dXJlCisvLyBjbGFzcy4gSXQgbXVzdCBiZSBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUPiwgd2hlcmUgVCBpcworLy8gdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLiBUZXN0V2l0aFBhcmFtPFQ+IGlzIGl0c2VsZiBkZXJpdmVkCisvLyBmcm9tIHRlc3Rpbmc6OlRlc3QuIFQgY2FuIGJlIGFueSBjb3B5YWJsZSB0eXBlLiBJZiBpdCdzIGEgcmF3IHBvaW50ZXIsCisvLyB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgbGlmZXNwYW4gb2YgdGhlIHBvaW50ZWQgdmFsdWVzLgorCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxjb25zdCBjaGFyKj4geworICAvLyBZb3UgY2FuIGltcGxlbWVudCBhbGwgdGhlIHVzdWFsIGNsYXNzIGZpeHR1cmUgbWVtYmVycyBoZXJlLgorfTsKKworLy8gVGhlbiwgdXNlIHRoZSBURVNUX1AgbWFjcm8gdG8gZGVmaW5lIGFzIG1hbnkgcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gZm9yIHRoaXMgZml4dHVyZSBhcyB5b3Ugd2FudC4gVGhlIF9QIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiCisvLyBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UgcHJlZmVyIHRvIHRoaW5rLgorCitURVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgYWNjZXNzIHRoZSB0ZXN0IHBhcmFtZXRlciB3aXRoIHRoZSBHZXRQYXJhbSgpIG1ldGhvZAorICAvLyBvZiB0aGUgVGVzdFdpdGhQYXJhbTxUPiBjbGFzczoKKyAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOworICAuLi4KK30KKworVEVTVF9QKEZvb1Rlc3QsIEhhc0JsYWhCbGFoKSB7CisgIC4uLgorfQorCisvLyBGaW5hbGx5LCB5b3UgY2FuIHVzZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB0byBpbnN0YW50aWF0ZSB0aGUgdGVzdAorLy8gY2FzZSB3aXRoIGFueSBzZXQgb2YgcGFyYW1ldGVycyB5b3Ugd2FudC4gR29vZ2xlIFRlc3QgZGVmaW5lcyBhIG51bWJlcgorLy8gb2YgZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRlc3QgcGFyYW1ldGVycy4gVGhleSByZXR1cm4gd2hhdCB3ZSBjYWxsCisvLyAoc3VycHJpc2UhKSBwYXJhbWV0ZXIgZ2VuZXJhdG9ycy4gSGVyZSBpcyBhICBzdW1tYXJ5IG9mIHRoZW0sIHdoaWNoCisvLyBhcmUgYWxsIGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZToKKy8vCisvLworLy8gIFJhbmdlKGJlZ2luLCBlbmQgWywgc3RlcF0pIC0gWWllbGRzIHZhbHVlcyB7YmVnaW4sIGJlZ2luK3N0ZXAsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbitzdGVwK3N0ZXAsIC4uLn0uIFRoZSB2YWx1ZXMgZG8gbm90CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIGVuZC4gc3RlcCBkZWZhdWx0cyB0byAxLgorLy8gIFZhbHVlcyh2MSwgdjIsIC4uLiwgdk4pICAgIC0gWWllbGRzIHZhbHVlcyB7djEsIHYyLCAuLi4sIHZOfS4KKy8vICBWYWx1ZXNJbihjb250YWluZXIpICAgICAgICAtIFlpZWxkcyB2YWx1ZXMgZnJvbSBhIEMtc3R5bGUgYXJyYXksIGFuIFNUTAorLy8gIFZhbHVlc0luKGJlZ2luLGVuZCkgICAgICAgICAgY29udGFpbmVyLCBvciBhbiBpdGVyYXRvciByYW5nZSBbYmVnaW4sIGVuZCkuCisvLyAgQm9vbCgpICAgICAgICAgICAgICAgICAgICAgLSBZaWVsZHMgc2VxdWVuY2Uge2ZhbHNlLCB0cnVlfS4KKy8vICBDb21iaW5lKGcxLCBnMiwgLi4uLCBnTikgICAtIFlpZWxkcyBhbGwgY29tYmluYXRpb25zICh0aGUgQ2FydGVzaWFuIHByb2R1Y3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbWF0aCBzYXZ2eSkgb2YgdGhlIHZhbHVlcyBnZW5lcmF0ZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBOIGdlbmVyYXRvcnMuCisvLworLy8gRm9yIG1vcmUgZGV0YWlscywgc2VlIGNvbW1lbnRzIGF0IHRoZSBkZWZpbml0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgYmVsb3cKKy8vIGluIHRoaXMgZmlsZS4KKy8vCisvLyBUaGUgZm9sbG93aW5nIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gdGhlIEZvb1Rlc3QgdGVzdCBjYXNlCisvLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAibWVlbnkiLCAibWlueSIsIGFuZCAibW9lIi4KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5zdGFudGlhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGb29UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKCJtZWVueSIsICJtaW55IiwgIm1vZSIpKTsKKworLy8gVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgKHllcywgeW91CisvLyBjYW4gaW5zdGFudGlhdGUgaXQgbW9yZSB0aGVuIG9uY2UpIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUKKy8vIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yIGRpZmZlcmVudAorLy8gaW5zdGFudGlhdGlvbnMuIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZQorLy8gdGhlc2UgbmFtZXM6CisvLworLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJtZWVueSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xIGZvciAibWlueSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8yIGZvciAibW9lIgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJtZWVueSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xIGZvciAibWlueSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8yIGZvciAibW9lIgorLy8KKy8vIFlvdSBjYW4gdXNlIHRoZXNlIG5hbWVzIGluIC0tZ3Rlc3RfZmlsdGVyLgorLy8KKy8vIFRoaXMgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzIGZyb20gRm9vVGVzdCBhZ2FpbiwgZWFjaAorLy8gd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICJjYXQiIGFuZCAiZG9nIjoKKworY29uc3QgY2hhciogcGV0c1tdID0geyJjYXQiLCAiZG9nIn07CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbm90aGVySW5zdGFudGlhdGlvbk5hbWUsIEZvb1Rlc3QsIFZhbHVlc0luKHBldHMpKTsKKworLy8gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlIHRoZXNlIG5hbWVzOgorLy8KKy8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMCBmb3IgImNhdCIKKy8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgImRvZyIKKy8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMCBmb3IgImNhdCIKKy8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgImRvZyIKKy8vCisvLyBQbGVhc2Ugbm90ZSB0aGF0IElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzCisvLyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLCB3aGV0aGVyIHRoZWlyIGRlZmluaXRpb25zIGNvbWUgYmVmb3JlIG9yCisvLyBBRlRFUiB0aGUgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agc3RhdGVtZW50LgorLy8KKy8vIFBsZWFzZSBhbHNvIG5vdGUgdGhhdCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgKGluY2x1ZGluZyBwYXJhbWV0ZXJzIHRvIHRoZQorLy8gZ2VuZXJhdG9ycykgYXJlIGV2YWx1YXRlZCBpbiBJbml0R29vZ2xlVGVzdCgpLCBhZnRlciBtYWluKCkgaGFzIHN0YXJ0ZWQuCisvLyBUaGlzIGFsbG93cyB0aGUgdXNlciBvbiBvbmUgaGFuZCwgdG8gYWRqdXN0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIGluIG9yZGVyCisvLyB0byBkeW5hbWljYWxseSBkZXRlcm1pbmUgYSBzZXQgb2YgdGVzdHMgdG8gcnVuIGFuZCBvbiB0aGUgb3RoZXIgaGFuZCwKKy8vIGdpdmUgdGhlIHVzZXIgYSBjaGFuY2UgdG8gaW5zcGVjdCB0aGUgZ2VuZXJhdGVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QKKy8vIHJlZmxlY3Rpb24gQVBJIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgZXhlY3V0ZWQuCisvLworLy8gWW91IGNhbiBzZWUgc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIGFuZCBzYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MKKy8vIGZvciBtb3JlIGV4YW1wbGVzLgorLy8KKy8vIEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8gcHVibGlzaCB0aGUgQVBJIGZvciBkZWZpbmluZyBuZXcgcGFyYW1ldGVyCisvLyBnZW5lcmF0b3JzLiBCdXQgZm9yIG5vdyB0aGlzIGludGVyZmFjZSByZW1haW5zIHBhcnQgb2YgdGhlIGludGVybmFsCisvLyBpbXBsZW1lbnRhdGlvbiBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisKKyNlbmRpZiAgLy8gMAorCisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oPgorCisjaWYgIUdURVNUX09TX1NZTUJJQU4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2VuZGlmCisKKy8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKKy8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKKy8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmg+CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZ1bmN0aW9ucyBwcm9kdWNpbmcgcGFyYW1ldGVyIGdlbmVyYXRvcnMuCisvLworLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGVzZSBnZW5lcmF0b3JzIHRvIHByb2R1Y2UgcGFyYW1ldGVycyBmb3IgdmFsdWUtCisvLyBwYXJhbWV0ZXJpemVkIHRlc3RzLiBXaGVuIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgaXMgaW5zdGFudGlhdGVkCisvLyB3aXRoIGEgcGFydGljdWxhciBnZW5lcmF0b3IsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYW5kIHJ1bnMgdGVzdHMKKy8vIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBzYW1wbGUsIHRlc3RzIGZyb20gdGVzdCBjYXNlIEZvb1Rlc3QgYXJlIGluc3RhbnRpYXRlZAorLy8gZWFjaCB0aHJlZSB0aW1lcyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgMywgNSwgYW5kIDg6CisvLworLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geyAuLi4gfTsKKy8vCisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoaXMpIHsKKy8vIH0KKy8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhhdCkgeworLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdFNlcXVlbmNlLCBGb29UZXN0LCBWYWx1ZXMoMywgNSwgOCkpOworLy8KKworLy8gUmFuZ2UoKSByZXR1cm5zIGdlbmVyYXRvcnMgcHJvdmlkaW5nIHNlcXVlbmNlcyBvZiB2YWx1ZXMgaW4gYSByYW5nZS4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFJhbmdlKHN0YXJ0LCBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCsxLAorLy8gICAgIHN0YXJ0KzIsIC4uLiwgfS4KKy8vIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCtzdGVwLAorLy8gICAgIHN0YXJ0K3N0ZXArc3RlcCwgLi4uLCB9LgorLy8gTm90ZXM6CisvLyAgICogVGhlIGdlbmVyYXRlZCBzZXF1ZW5jZXMgbmV2ZXIgaW5jbHVkZSBlbmQuIEZvciBleGFtcGxlLCBSYW5nZSgxLCA1KQorLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2UgezEsIDIsIDMsIDR9LiBSYW5nZSgxLCA5LCAyKQorLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHsxLCAzLCA1LCA3fS4KKy8vICAgKiBzdGFydCBhbmQgZW5kIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBUaGF0IHR5cGUgbWF5IGJlIGFueSBpbnRlZ3JhbCBvcgorLy8gICAgIGZsb2F0aW5nLXBvaW50IHR5cGUgb3IgYSB1c2VyIGRlZmluZWQgdHlwZSBzYXRpc2Z5aW5nIHRoZXNlIGNvbmRpdGlvbnM6CisvLyAgICAgKiBJdCBtdXN0IGJlIGFzc2lnbmFibGUgKGhhdmUgb3BlcmF0b3I9KCkgZGVmaW5lZCkuCisvLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3IrKCkgKG9wZXJhdG9yKyhpbnQtY29tcGF0aWJsZSB0eXBlKSBmb3IKKy8vICAgICAgIHR3by1vcGVyYW5kIHZlcnNpb24pLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yPCgpIGRlZmluZWQuCisvLyAgICAgRWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZXMgd2lsbCBhbHNvIGhhdmUgdGhhdCB0eXBlLgorLy8gICAqIENvbmRpdGlvbiBzdGFydCA8IGVuZCBtdXN0IGJlIHNhdGlzZmllZCBpbiBvcmRlciBmb3IgcmVzdWx0aW5nIHNlcXVlbmNlcworLy8gICAgIHRvIGNvbnRhaW4gYW55IGVsZW1lbnRzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kLCBJbmNyZW1lbnRUIHN0ZXApIHsKKyAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPigKKyAgICAgIG5ldyBpbnRlcm5hbDo6UmFuZ2VHZW5lcmF0b3I8VCwgSW5jcmVtZW50VD4oc3RhcnQsIGVuZCwgc3RlcCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCkgeworICByZXR1cm4gUmFuZ2Uoc3RhcnQsIGVuZCwgMSk7Cit9CisKKy8vIFZhbHVlc0luKCkgZnVuY3Rpb24gYWxsb3dzIGdlbmVyYXRpb24gb2YgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGNvbWluZyBmcm9tCisvLyBhIGNvbnRhaW5lci4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgQy1zdHlsZSBhcnJheS4KKy8vIFZhbHVlc0luKGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhbiBTVEwtc3R5bGUgY29udGFpbmVyLgorLy8gVmFsdWVzSW4oSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCkKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYSByYW5nZSBbYmVnaW4sIGVuZCkgZGVmaW5lZCBieSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVGhlc2UKKy8vICAgICBpdGVyYXRvcnMgY2FuIGFsc28gYmUgcGxhaW4gQyBwb2ludGVycy4KKy8vCisvLyBQbGVhc2Ugbm90ZSB0aGF0IFZhbHVlc0luIGNvcGllcyB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRhaW5lcnMKKy8vIHBhc3NlZCBpbiBhbmQga2VlcHMgdGhlbSB0byBnZW5lcmF0ZSB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTKCkuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RyaW5nVGVzdAorLy8gZWFjaCB3aXRoIEMtc3RyaW5nIHZhbHVlcyBvZiAiZm9vIiwgImJhciIsIGFuZCAiYmF6IjoKKy8vCisvLyBjb25zdCBjaGFyKiBzdHJpbmdzW10gPSB7ImZvbyIsICJiYXIiLCAiYmF6In07CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJpbmdTZXF1ZW5jZSwgU3J0aW5nVGVzdCwgVmFsdWVzSW4oc3RyaW5ncykpOworLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0bFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBTVEwgc3RyaW5ncyB3aXRoIHZhbHVlcyAiYSIgYW5kICJiIjoKKy8vCisvLyA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBHZXRQYXJhbWV0ZXJTdHJpbmdzKCkgeworLy8gICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiB2OworLy8gICB2LnB1c2hfYmFjaygiYSIpOworLy8gICB2LnB1c2hfYmFjaygiYiIpOworLy8gICByZXR1cm4gdjsKKy8vIH0KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFyU2VxdWVuY2UsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBTdGxTdHJpbmdUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4oR2V0UGFyYW1ldGVyU3RyaW5ncygpKSk7CisvLworLy8KKy8vIFRoaXMgd2lsbCBhbHNvIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gQ2hhclRlc3QKKy8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICdhJyBhbmQgJ2InOgorLy8KKy8vIDo6c3RkOjpsaXN0PGNoYXI+IEdldFBhcmFtZXRlckNoYXJzKCkgeworLy8gICA6OnN0ZDo6bGlzdDxjaGFyPiBsaXN0OworLy8gICBsaXN0LnB1c2hfYmFjaygnYScpOworLy8gICBsaXN0LnB1c2hfYmFjaygnYicpOworLy8gICByZXR1cm4gbGlzdDsKKy8vIH0KKy8vIDo6c3RkOjpsaXN0PGNoYXI+IGwgPSBHZXRQYXJhbWV0ZXJDaGFycygpOworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlMiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4obC5iZWdpbigpLCBsLmVuZCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKKyAgICB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+IFZhbHVlc0luKAorICBGb3J3YXJkSXRlcmF0b3IgYmVnaW4sCisgIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKyAgICAgIFBhcmFtVHlwZTsKKyAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+KAorICAgICAgbmV3IGludGVybmFsOjpWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3I8UGFyYW1UeXBlPihiZWdpbiwgZW5kKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKSB7CisgIHJldHVybiBWYWx1ZXNJbihhcnJheSwgYXJyYXkgKyBOKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKAorICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKSB7CisgIHJldHVybiBWYWx1ZXNJbihjb250YWluZXIuYmVnaW4oKSwgY29udGFpbmVyLmVuZCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaD4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YKKy8vIHBhcmFtZXRlcnMuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXMoVCB2MSwgVCB2MiwgLi4uLCBUIHZOKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4KKy8vCisvLyBGb3IgZXhhbXBsZSwgdGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmFyVGVzdCBlYWNoCisvLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE51bVNlcXVlbmNlLCBCYXJUZXN0LCBWYWx1ZXMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSk7CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4KKy8vIFRoZSBleGFjdCB0eXBlIG9mIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgaW4gQmF6VGVzdC4KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsKKy8vCisvLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byA1MCBwYXJhbWV0ZXJzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4gVmFsdWVzKFQxIHYxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE8VDE+KHYxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+IFZhbHVlcyhUMSB2MSwgVDIgdjIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+KHYxLCB2Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzPFQxLCBUMiwgVDM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM8VDEsIFQyLCBUMz4odjEsIHYyLCB2Myk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ8VDEsIFQyLCBUMywgVDQ+KHYxLCB2MiwgdjMsIHY0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NTxUMSwgVDIsIFQzLCBUNCwgVDU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4odjEsIHYyLCB2MywgdjQsIHY1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsCisgICAgICB2NiwgdjcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KHYxLCB2MiwgdjMsIHY0LAorICAgICAgdjUsIHY2LCB2NywgdjgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5Pih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBWYWx1ZXMoVDEgdjEsCisgICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwKKyAgICBUMTE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLAorICAgICAgVDExPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgVDEyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgVDEzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCisgICAgICB2MTQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKKyAgICAgIHYxMywgdjE0LCB2MTUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAorICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LAorICAgIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKKyAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAorICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+KHYxLCB2MiwgdjMsIHY0LAorICAgICAgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCisgICAgICB2MjAsIHYyMSwgdjIyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4odjEsIHYyLCB2MywKKyAgICAgIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+KHYxLCB2MiwKKyAgICAgIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LAorICAgICAgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFZhbHVlcyhUMSB2MSwKKyAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsCisgICAgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwKKyAgICBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+KHYxLAorICAgICAgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywKKyAgICAgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgVDI2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LAorICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgVDI3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LAorICAgICAgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICBUMjg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCisgICAgICB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywKKyAgICAgIHYyOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKKyAgICAgIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LAorICAgICAgdjI3LCB2MjgsIHYyOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCisgICAgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCisgICAgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKKyAgICBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCisgICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwKKyAgICAgIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAorICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKKyAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKKyAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsCisgICAgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsCisgICAgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwKKyAgICBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLAorICAgIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAorICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsCisgICAgICB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwKKyAgICAgIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsCisgICAgICB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCisgICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKKyAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAorICAgICAgdjM0LCB2MzUsIHYzNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCisgICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCisgICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKKyAgICBUMzcgdjM3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3Pih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2LCB2MzcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcsIFQzOCB2MzgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4odjEsIHYyLAorICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsCisgICAgICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwKKyAgICAgIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCisgICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKKyAgICBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LAorICAgICAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsCisgICAgICB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVmFsdWVzKFQxIHYxLAorICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwKKyAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LAorICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsCisgICAgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwKKyAgICBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwKKyAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LAorICAgICAgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgIFQ0MT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsCisgICAgICB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwKKyAgICAgIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgIFQ0Mj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICBUNDIgdjQyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LAorICAgICAgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsCisgICAgICB2NDIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgVDQzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIsIFQ0MyB2NDMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsCisgICAgICB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwKKyAgICAgIHY0MSwgdjQyLCB2NDMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0ND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKKyAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LAorICAgICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksCisgICAgICB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKKyAgICBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAorICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsCisgICAgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwKKyAgICBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAorICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsCisgICAgICB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCisgICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksCisgICAgICB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKKyAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LAorICAgICAgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0Nik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCisgICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsCisgICAgICB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LAorICAgIFQ0OCB2NDgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwKKyAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LAorICAgICAgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsIHY0OCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLAorICAgIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsCisgICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwKKyAgICBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LAorICAgIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwKKyAgICAgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LAorICAgICAgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4LCB2NDkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+CitpbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCisgICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKKyAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LAorICAgIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsCisgICAgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSwgVDUwIHY1MCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAorICAgICAgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsCisgICAgICB2NDgsIHY0OSwgdjUwKTsKK30KKworLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLgorLy8KKy8vIFN5bm9wc2lzOgorLy8gQm9vbCgpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMge2ZhbHNlLCB0cnVlfS4KKy8vCisvLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucworLy8gb2YgbXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHRlc3RlZCB3aGVuIHNldmVyYWwgQm9vbCgpJ3MgYXJlIGNvbWJpbmVkIHVzaW5nCisvLyBDb21iaW5lKCkgZnVuY3Rpb24uCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIEZsYWdEZXBlbmRlbnRUZXN0CisvLyB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSB3aXRoIHBhcmFtZXRlcnMgZmFsc2UgYW5kIHRydWUuCisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsKKy8vICAgfQorLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsKKy8vCitpbmxpbmUgaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPGJvb2w+IEJvb2woKSB7CisgIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOworfQorCisjaWYgR1RFU1RfSEFTX0NPTUJJTkUKKy8vIENvbWJpbmUoKSBhbGxvd3MgdGhlIHVzZXIgdG8gY29tYmluZSB0d28gb3IgbW9yZSBzZXF1ZW5jZXMgdG8gcHJvZHVjZQorLy8gdmFsdWVzIG9mIGEgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhvc2Ugc2VxdWVuY2VzJyBlbGVtZW50cy4KKy8vCisvLyBTeW5vcHNpczoKKy8vIENvbWJpbmUoZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGNvbWluZyBmcm9tCisvLyAgICAgdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlcyBnZW5lcmF0ZWQgYnkKKy8vICAgICBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uIFRoZSBzZXF1ZW5jZSBlbGVtZW50cyB3aWxsIGhhdmUgYSB0eXBlIG9mCisvLyAgICAgdHVwbGU8VDEsIFQyLCAuLi4sIFROPiB3aGVyZSBUMSwgVDIsIC4uLiwgVE4gYXJlIHRoZSB0eXBlcworLy8gICAgIG9mIGVsZW1lbnRzIGZyb20gc2VxdWVuY2VzIHByb2R1Y2VzIGJ5IGdlbjEsIGdlbjIsIC4uLiwgZ2VuTi4KKy8vCisvLyBDb21iaW5lIGNhbiBoYXZlIHVwIHRvIDEwIGFyZ3VtZW50cy4gVGhpcyBudW1iZXIgaXMgY3VycmVudGx5IGxpbWl0ZWQKKy8vIGJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHVwbGUgaW1wbGVtZW50YXRpb24gdXNlZCBieSBHb29nbGUKKy8vIFRlc3QuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gdGVzdCBjYXNlIEFuaW1hbFRlc3QgZWFjaCBvbmUgd2l0aAorLy8gdGhlIHBhcmFtZXRlciB2YWx1ZXMgdHVwbGUoImNhdCIsIEJMQUNLKSwgdHVwbGUoImNhdCIsIFdISVRFKSwKKy8vIHR1cGxlKCJkb2ciLCBCTEFDSyksIGFuZCB0dXBsZSgiZG9nIiwgV0hJVEUpOgorLy8KKy8vIGVudW0gQ29sb3IgeyBCTEFDSywgR1JBWSwgV0hJVEUgfTsKKy8vIGNsYXNzIEFuaW1hbFRlc3QKKy8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGNvbnN0IGNoYXIqLCBDb2xvcj4gPiB7Li4ufTsKKy8vCisvLyBURVNUX1AoQW5pbWFsVGVzdCwgQW5pbWFsTG9va3NOaWNlKSB7Li4ufQorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFuaW1hbFZhcmlhdGlvbnMsIEFuaW1hbFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKFZhbHVlcygiY2F0IiwgImRvZyIpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoQkxBQ0ssIFdISVRFKSkpOworLy8KKy8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiBGbGFnRGVwZW5kZW50VGVzdCB3aXRoIGFsbCB2YXJpYXRpb25zIG9mIHR3bworLy8gQm9vbGVhbiBmbGFnczoKKy8vCisvLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdAorLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGUoYm9vbCwgYm9vbCk+ID4geworLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQXNzaWducyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCisvLyAgICAgdGllKGV4dGVybmFsX2ZsYWdfMSwgZXh0ZXJuYWxfZmxhZ18yKSA9IEdldFBhcmFtKCk7CisvLyAgIH0KKy8vIH07CisvLworLy8gVEVTVF9QKEZsYWdEZXBlbmRlbnRUZXN0LCBUZXN0RmVhdHVyZTEpIHsKKy8vICAgLy8gVGVzdCB5b3VyIGNvZGUgdXNpbmcgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgaGVyZS4KKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFR3b0Jvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgQm9vbCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjI+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjI8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPigKKyAgICAgIGcxLCBnMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMykgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+KAorICAgICAgZzEsIGcyLCBnMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQ+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICBHZW5lcmF0b3I0PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQ+KAorICAgICAgZzEsIGcyLCBnMywgZzQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjY8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjY+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNz4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjc+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOD4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyODxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwKKyAgICBHZW5lcmF0b3I5PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwgY29uc3QgR2VuZXJhdG9yOSYgZzkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgsIGc5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5LAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjEwPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksCisgICAgR2VuZXJhdG9yMTA+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LCBjb25zdCBHZW5lcmF0b3I5JiBnOSwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOSwKKyAgICAgIEdlbmVyYXRvcjEwPigKKyAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzksIGcxMCk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKKworCisjZGVmaW5lIFRFU1RfUCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAorICAgICAgOiBwdWJsaWMgdGVzdF9jYXNlX25hbWUgeyBcCisgICBwdWJsaWM6IFwKKyAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKCkge30gXAorICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCisgICBwcml2YXRlOiBcCisgICAgc3RhdGljIGludCBBZGRUb1JlZ2lzdHJ5KCkgeyBcCisgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAorICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAorICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyktPkFkZFRlc3RQYXR0ZXJuKFwKKyAgICAgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgI3Rlc3RfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RNZXRhRmFjdG9yeTwgXAorICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KCkpOyBcCisgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAorICAgIHN0YXRpYyBpbnQgZ3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfOyBcCisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhcCisgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpOyBcCisgIH07IFwKKyAgaW50IEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lKTo6Z3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfID0gXAorICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6QWRkVG9SZWdpc3RyeSgpOyBcCisgIHZvaWQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6VGVzdEJvZHkoKQorCisjZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvcikgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCisgICAgICBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXygpIHsgcmV0dXJuIGdlbmVyYXRvcjsgfSBcCisgIGludCBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19kdW1teV8gPSBcCisgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAorICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAorICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCisgICAgICAgICAgICAgICAgICAjcHJlZml4LCBcCisgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8sIFwKKyAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWRhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVXRpbGl0aWVzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGl0c2VsZiBhbmQgY29kZSB0aGF0IHVzZXMgR29vZ2xlIFRlc3QKKy8vIChlLmcuIGZyYW1ld29ya3MgYnVpbHQgb24gdG9wIG9mIEdvb2dsZSBUZXN0KS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUaGlzIGhlbHBlciBjbGFzcyBjYW4gYmUgdXNlZCB0byBtb2NrIG91dCBHb29nbGUgVGVzdCBmYWlsdXJlIHJlcG9ydGluZworLy8gc28gdGhhdCB3ZSBjYW4gdGVzdCBHb29nbGUgVGVzdCBvciBjb2RlIHRoYXQgYnVpbGRzIG9uIEdvb2dsZSBUZXN0LgorLy8KKy8vIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGFwcGVuZHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QgdG8gdGhlCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IG9iamVjdCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3Igd2hlbmV2ZXIgYSBHb29nbGUgVGVzdAorLy8gZmFpbHVyZSBpcyByZXBvcnRlZC4gSXQgY2FuIGVpdGhlciBpbnRlcmNlcHQgb25seSBmYWlsdXJlcyB0aGF0IGFyZQorLy8gZ2VuZXJhdGVkIGluIHRoZSBzYW1lIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhpcyBvYmplY3Qgb3IgaXQgY2FuIGludGVyY2VwdAorLy8gYWxsIGdlbmVyYXRlZCBmYWlsdXJlcy4gVGhlIHNjb3BlIG9mIHRoaXMgbW9jayBvYmplY3QgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aAorLy8gdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgdHdvIGFyZ3VtZW50cyBjb25zdHJ1Y3Rvci4KK2NsYXNzIEdURVNUX0FQSV8gU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSB0d28gcG9zc2libGUgbW9ja2luZyBtb2RlcyBvZiB0aGlzIG9iamVjdC4KKyAgZW51bSBJbnRlcmNlcHRNb2RlIHsKKyAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgIC8vIEludGVyY2VwdHMgb25seSB0aHJlYWQgbG9jYWwgZmFpbHVyZXMuCisgICAgSU5URVJDRVBUX0FMTF9USFJFQURTICAgICAgICAgICAvLyBJbnRlcmNlcHRzIGFsbCBmYWlsdXJlcy4KKyAgfTsKKworICAvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkCisgIC8vIGJ5IEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorICAvLyByZXN1bHRzLiBUaGlzIHJlcG9ydGVyIHdpbGwgb25seSBjYXRjaCBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQKKyAgLy8gdGhyZWFkLiBERVBSRUNBVEVECisgIGV4cGxpY2l0IFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCk7CisKKyAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHlvdSBjYW4gY2hvb3NlIHRoZSBpbnRlcmNlcHRpb24gc2NvcGUgb2YgdGhpcyBvYmplY3QuCisgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCk7CisKKyAgLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICB2aXJ0dWFsIH5TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOworCisgIC8vIEFwcGVuZHMgdGhlIFRlc3RQYXJ0UmVzdWx0IG9iamVjdCB0byB0aGUgVGVzdFBhcnRSZXN1bHRBcnJheQorICAvLyByZWNlaXZlZCBpbiB0aGUgY29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGlzIGZyb20gdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UKKyAgLy8gaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgcHJpdmF0ZToKKyAgdm9pZCBJbml0KCk7CisKKyAgY29uc3QgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZV87CisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIG9sZF9yZXBvcnRlcl87CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIGNvbnN0IHJlc3VsdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBIGhlbHBlciBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgYW5kCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpLiAgSXRzIGRlc3RydWN0b3IgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KKy8vIFRlc3RQYXJ0UmVzdWx0QXJyYXkgY29udGFpbnMgZXhhY3RseSBvbmUgZmFpbHVyZSB0aGF0IGhhcyB0aGUgZ2l2ZW4KKy8vIHR5cGUgYW5kIGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuICBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCBhCisvLyBub24tZmF0YWwgZmFpbHVyZSB3aWxsIGJlIGdlbmVyYXRlZC4KK2NsYXNzIEdURVNUX0FQSV8gU2luZ2xlRmFpbHVyZUNoZWNrZXIgeworIHB1YmxpYzoKKyAgLy8gVGhlIGNvbnN0cnVjdG9yIHJlbWVtYmVycyB0aGUgYXJndW1lbnRzLgorICBTaW5nbGVGYWlsdXJlQ2hlY2tlcihjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJzdHIpOworICB+U2luZ2xlRmFpbHVyZUNoZWNrZXIoKTsKKyBwcml2YXRlOgorICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiBjb25zdCByZXN1bHRzXzsKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZV87CisgIGNvbnN0IFN0cmluZyBzdWJzdHJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2luZ2xlRmFpbHVyZUNoZWNrZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKy8vIEEgc2V0IG9mIG1hY3JvcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIG9yIGNvZGUgdGhhdCdzIGV4cGVjdGVkCisvLyB0byBnZW5lcmF0ZSBHb29nbGUgVGVzdCBmYXRhbCBmYWlsdXJlcy4gIEl0IHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBzdGF0ZW1lbnQgd2lsbCBjYXVzZSBleGFjdGx5IG9uZSBmYXRhbCBHb29nbGUgVGVzdCBmYWlsdXJlIHdpdGggJ3N1YnN0cicKKy8vIGJlaW5nIHBhcnQgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZS4KKy8vCisvLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIG1hY3JvLiBFWFBFQ1RfRkFUQUxfRkFJTFVSRSBvbmx5CisvLyBhZmZlY3RzIGFuZCBjb25zaWRlcnMgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50IHRocmVhZCBhbmQKKy8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTIGRvZXMgdGhlIHNhbWUgYnV0IGZvciBhbGwgdGhyZWFkcy4KKy8vCisvLyBUaGUgdmVyaWZpY2F0aW9uIG9mIHRoZSBhc3NlcnRpb24gaXMgZG9uZSBjb3JyZWN0bHkgZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQKKy8vIHRocm93cyBhbiBleGNlcHRpb24gb3IgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorLy8KKy8vIEtub3duIHJlc3RyaWN0aW9uczoKKy8vICAgLSAnc3RhdGVtZW50JyBjYW5ub3QgcmVmZXJlbmNlIGxvY2FsIG5vbi1zdGF0aWMgdmFyaWFibGVzIG9yCisvLyAgICAgbm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBjdXJyZW50IG9iamVjdC4KKy8vICAgLSAnc3RhdGVtZW50JyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUuCisvLyAgIC0gWW91IGNhbm5vdCBzdHJlYW0gYSBmYWlsdXJlIG1lc3NhZ2UgdG8gdGhpcyBtYWNyby4KKy8vCisvLyBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHR3bworLy8gbWFjcm9zIGFyZSBtdWNoIGFsaWtlLCB3ZSBjYW5ub3QgcmVmYWN0b3IgdGhlbSB0byB1c2UgYSBjb21tb24KKy8vIGhlbHBlciBtYWNybywgZHVlIHRvIHNvbWUgcGVjdWxpYXJpdHkgaW4gaG93IHRoZSBwcmVwcm9jZXNzb3IKKy8vIHdvcmtzLiAgVGhlIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hIHRlc3QgaW4KKy8vIGd0ZXN0X3VuaXR0ZXN0LmNjIHdpbGwgZmFpbCB0byBjb21waWxlIGlmIHdlIGRvIHRoYXQuCisjZGVmaW5lIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHsgXAorICAgIGNsYXNzIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyIHtcCisgICAgIHB1YmxpYzpcCisgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfTtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAoc3Vic3RyKSk7XAorICAgIHtcCisgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAorICAgICAgICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAmZ3Rlc3RfZmFpbHVyZXMpO1wKKyAgICAgIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyOjpFeGVjdXRlKCk7XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKyNkZWZpbmUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8geyBcCisgICAgY2xhc3MgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXIge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9O1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCisgICAgICAgICAgSU5URVJDRVBUX0FMTF9USFJFQURTLCAmZ3Rlc3RfZmFpbHVyZXMpO1wKKyAgICAgIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyOjpFeGVjdXRlKCk7XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIEEgbWFjcm8gZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBvciBjb2RlIHRoYXQncyBleHBlY3RlZCB0bworLy8gZ2VuZXJhdGUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzLiAgSXQgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbgorLy8gc3RhdGVtZW50IHdpbGwgY2F1c2UgZXhhY3RseSBvbmUgbm9uLWZhdGFsIEdvb2dsZSBUZXN0IGZhaWx1cmUgd2l0aCAnc3Vic3RyJworLy8gYmVpbmcgcGFydCBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorLy8KKy8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoaXMgbWFjcm8uIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFIG9ubHkKKy8vIGFmZmVjdHMgYW5kIGNvbnNpZGVycyBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZAorLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMgZG9lcyB0aGUgc2FtZSBidXQgZm9yIGFsbCB0aHJlYWRzLgorLy8KKy8vICdzdGF0ZW1lbnQnIGlzIGFsbG93ZWQgdG8gcmVmZXJlbmNlIGxvY2FsIHZhcmlhYmxlcyBhbmQgbWVtYmVycyBvZgorLy8gdGhlIGN1cnJlbnQgb2JqZWN0LgorLy8KKy8vIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIGFzc2VydGlvbiBpcyBkb25lIGNvcnJlY3RseSBldmVuIHdoZW4gdGhlIHN0YXRlbWVudAorLy8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisvLworLy8gS25vd24gcmVzdHJpY3Rpb25zOgorLy8gICAtIFlvdSBjYW5ub3Qgc3RyZWFtIGEgZmFpbHVyZSBtZXNzYWdlIHRvIHRoaXMgbWFjcm8uCisvLworLy8gTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB0d28KKy8vIG1hY3JvcyBhcmUgbXVjaCBhbGlrZSwgd2UgY2Fubm90IHJlZmFjdG9yIHRoZW0gdG8gdXNlIGEgY29tbW9uCisvLyBoZWxwZXIgbWFjcm8sIGR1ZSB0byBzb21lIHBlY3VsaWFyaXR5IGluIGhvdyB0aGUgcHJlcHJvY2Vzc29yCisvLyB3b3Jrcy4gIElmIHdlIGRvIHRoYXQsIHRoZSBjb2RlIHdvbid0IGNvbXBpbGUgd2hlbiB0aGUgdXNlciBnaXZlcworLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBhIHN0YXRlbWVudCB0aGF0IGNvbnRhaW5zIGEgbWFjcm8gdGhhdAorLy8gZXhwYW5kcyB0byBjb2RlIGNvbnRhaW5pbmcgYW4gdW5wcm90ZWN0ZWQgY29tbWEuICBUaGUKKy8vIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hIHRlc3QgaW4gZ3Rlc3RfdW5pdHRlc3QuY2MKKy8vIGNhdGNoZXMgdGhhdC4KKy8vCisvLyBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBoYXZlIHRvIHdyaXRlCisvLyAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9CisvLyBpbnN0ZWFkIG9mCisvLyAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KQorLy8gdG8gYXZvaWQgYW4gTVNWQyB3YXJuaW5nIG9uIHVucmVhY2hhYmxlIGNvZGUuCisjZGVmaW5lIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCBcCisgICAgICAgIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCisgICAgICAgICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2RlZmluZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhzdGF0ZW1lbnQsIHN1YnN0cikgXAorICBkbyB7XAorICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCisgICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgXAorICAgICAgICAoc3Vic3RyKSk7XAorICAgIHtcCisgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJTlRFUkNFUFRfQUxMX1RIUkVBRFMsXAorICAgICAgICAgICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTQ3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmg+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gQSBjb3B5YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4KKy8vIGFzc2VydGlvbiBvciBhbiBleHBsaWNpdCBGQUlMKCksIEFERF9GQUlMVVJFKCksIG9yIFNVQ0NFU1MoKSkuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdCB7CisgcHVibGljOgorICAvLyBUaGUgcG9zc2libGUgb3V0Y29tZXMgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4gYXNzZXJ0aW9uIG9yIGFuCisgIC8vIGV4cGxpY2l0IFNVQ0NFRUQoKSwgRkFJTCgpLCBvciBBRERfRkFJTFVSRSgpKS4KKyAgZW51bSBUeXBlIHsKKyAgICBrU3VjY2VzcywgICAgICAgICAgLy8gU3VjY2VlZGVkLgorICAgIGtOb25GYXRhbEZhaWx1cmUsICAvLyBGYWlsZWQgYnV0IHRoZSB0ZXN0IGNhbiBjb250aW51ZS4KKyAgICBrRmF0YWxGYWlsdXJlICAgICAgLy8gRmFpbGVkIGFuZCB0aGUgdGVzdCBzaG91bGQgYmUgdGVybWluYXRlZC4KKyAgfTsKKworICAvLyBDJ3Rvci4gIFRlc3RQYXJ0UmVzdWx0IGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAvLyBBbHdheXMgdXNlIHRoaXMgY29uc3RydWN0b3IgKHdpdGggcGFyYW1ldGVycykgdG8gY3JlYXRlIGEKKyAgLy8gVGVzdFBhcnRSZXN1bHQgb2JqZWN0LgorICBUZXN0UGFydFJlc3VsdChUeXBlIGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9maWxlX25hbWUsCisgICAgICAgICAgICAgICAgIGludCBhX2xpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX21lc3NhZ2UpCisgICAgICA6IHR5cGVfKGFfdHlwZSksCisgICAgICAgIGZpbGVfbmFtZV8oYV9maWxlX25hbWUpLAorICAgICAgICBsaW5lX251bWJlcl8oYV9saW5lX251bWJlciksCisgICAgICAgIHN1bW1hcnlfKEV4dHJhY3RTdW1tYXJ5KGFfbWVzc2FnZSkpLAorICAgICAgICBtZXNzYWdlXyhhX21lc3NhZ2UpIHsKKyAgfQorCisgIC8vIEdldHMgdGhlIG91dGNvbWUgb2YgdGhlIHRlc3QgcGFydC4KKyAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vIE5VTEwgaWYgaXQncyB1bmtub3duLgorICBjb25zdCBjaGFyKiBmaWxlX25hbWUoKSBjb25zdCB7IHJldHVybiBmaWxlX25hbWVfLmNfc3RyKCk7IH0KKworICAvLyBHZXRzIHRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsCisgIC8vIG9yIC0xIGlmIGl0J3MgdW5rbm93bi4KKyAgaW50IGxpbmVfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbGluZV9udW1iZXJfOyB9CisKKyAgLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorICBjb25zdCBjaGFyKiBzdW1tYXJ5KCkgY29uc3QgeyByZXR1cm4gc3VtbWFyeV8uY19zdHIoKTsgfQorCisgIC8vIEdldHMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXN0IHBhcnQuCisgIGNvbnN0IGNoYXIqIG1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IHBhc3NlZC4KKyAgYm9vbCBwYXNzZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrU3VjY2VzczsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYWlsZWQuCisgIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gIT0ga1N1Y2Nlc3M7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgorICBib29sIG5vbmZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga05vbkZhdGFsRmFpbHVyZTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KKyAgYm9vbCBmYXRhbGx5X2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtGYXRhbEZhaWx1cmU7IH0KKyBwcml2YXRlOgorICBUeXBlIHR5cGVfOworCisgIC8vIEdldHMgdGhlIHN1bW1hcnkgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZSBieSBvbWl0dGluZyB0aGUgc3RhY2sKKyAgLy8gdHJhY2UgaW4gaXQuCisgIHN0YXRpYyBpbnRlcm5hbDo6U3RyaW5nIEV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworCisgIC8vIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vIE5VTEwgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIHVua25vd24uCisgIGludGVybmFsOjpTdHJpbmcgZmlsZV9uYW1lXzsKKyAgLy8gVGhlIGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IgLTEKKyAgLy8gaWYgdGhlIGxpbmUgbnVtYmVyIGlzIHVua25vd24uCisgIGludCBsaW5lX251bWJlcl87CisgIGludGVybmFsOjpTdHJpbmcgc3VtbWFyeV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIHN1bW1hcnkuCisgIGludGVybmFsOjpTdHJpbmcgbWVzc2FnZV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIG1lc3NhZ2UuCit9OworCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKy8vIEFuIGFycmF5IG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0QXJyYXkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90CisvLyB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdEFycmF5IHsKKyBwdWJsaWM6CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkoKSB7fQorCisgIC8vIEFwcGVuZHMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KKyAgdm9pZCBBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgorICBpbnQgc2l6ZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IGFycmF5XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RQYXJ0UmVzdWx0QXJyYXkpOworfTsKKworLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIHRlc3QgcGFydCByZXN1bHQuCitjbGFzcyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSA9IDA7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIGhlbHBlciBjbGFzcyBpcyB1c2VkIGJ5IHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFIHRvIGNoZWNrIGlmIGEKKy8vIHN0YXRlbWVudCBnZW5lcmF0ZXMgbmV3IGZhdGFsIGZhaWx1cmVzLiBUbyBkbyBzbyBpdCByZWdpc3RlcnMgaXRzZWxmIGFzIHRoZQorLy8gY3VycmVudCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLiBCZXNpZGVzIGNoZWNraW5nIGlmIGZhdGFsIGZhaWx1cmVzIHdlcmUKKy8vIHJlcG9ydGVkLCBpdCBvbmx5IGRlbGVnYXRlcyB0aGUgcmVwb3J0aW5nIHRvIHRoZSBmb3JtZXIgcmVzdWx0IHJlcG9ydGVyLgorLy8gVGhlIG9yaWdpbmFsIHJlc3VsdCByZXBvcnRlciBpcyByZXN0b3JlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK2NsYXNzIEdURVNUX0FQSV8gSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKTsKKyAgdmlydHVhbCB+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7CisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSBjb25zdCB7IHJldHVybiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOyB9CisgcHJpdmF0ZToKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOworICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvcmlnaW5hbF9yZXBvcnRlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmggYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzhlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oCkBAIC0wLDAgKzEsMjU5IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXworCisvLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIHR5cGVkIHRlc3RzIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKy8vIFR5cGVkIChha2EgdHlwZS1kcml2ZW4pIHRlc3RzIHJlcGVhdCB0aGUgc2FtZSB0ZXN0IGZvciB0eXBlcyBpbiBhCisvLyBsaXN0LiAgWW91IG11c3Qga25vdyB3aGljaCB0eXBlcyB5b3Ugd2FudCB0byB0ZXN0IHdpdGggd2hlbiB3cml0aW5nCisvLyB0eXBlZCB0ZXN0cy4gSGVyZSdzIGhvdyB5b3UgZG8gaXQ6CisKKyNpZiAwCisKKy8vIEZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQKKy8vIGJ5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIHRlc3Rpbmc6OlRlc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICAuLi4KKyAgdHlwZWRlZiBzdGQ6Omxpc3Q8VD4gTGlzdDsKKyAgc3RhdGljIFQgc2hhcmVkXzsKKyAgVCB2YWx1ZV87Cit9OworCisvLyBOZXh0LCBhc3NvY2lhdGUgYSBsaXN0IG9mIHR5cGVzIHdpdGggdGhlIHRlc3QgY2FzZSwgd2hpY2ggd2lsbCBiZQorLy8gcmVwZWF0ZWQgZm9yIGVhY2ggdHlwZSBpbiB0aGUgbGlzdC4gIFRoZSB0eXBlZGVmIGlzIG5lY2Vzc2FyeSBmb3IKKy8vIHRoZSBtYWNybyB0byBwYXJzZSBjb3JyZWN0bHkuCit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOworVFlQRURfVEVTVF9DQVNFKEZvb1Rlc3QsIE15VHlwZXMpOworCisvLyBJZiB0aGUgdHlwZSBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIHR5cGUsIHlvdSBjYW4gd3JpdGUgdGhhdCB0eXBlCisvLyBkaXJlY3RseSB3aXRob3V0IFR5cGVzPC4uLj46CisvLyAgIFRZUEVEX1RFU1RfQ0FTRShGb29UZXN0LCBpbnQpOworCisvLyBUaGVuLCB1c2UgVFlQRURfVEVTVCgpIGluc3RlYWQgb2YgVEVTVF9GKCkgdG8gZGVmaW5lIGFzIG1hbnkgdHlwZWQKKy8vIHRlc3RzIGZvciB0aGlzIHRlc3QgY2FzZSBhcyB5b3Ugd2FudC4KK1RZUEVEX1RFU1QoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZSBwYXJhbWV0ZXIuCisgIC8vIFNpbmNlIHdlIGFyZSBpbnNpZGUgYSBkZXJpdmVkIGNsYXNzIHRlbXBsYXRlLCBDKysgcmVxdWlyZXMgdXNlIHRvCisgIC8vIHZpc2l0IHRoZSBtZW1iZXJzIG9mIEZvb1Rlc3QgdmlhICd0aGlzJy4KKyAgVHlwZVBhcmFtIG4gPSB0aGlzLT52YWx1ZV87CisKKyAgLy8gVG8gdmlzaXQgc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUsIGFkZCB0aGUgVGVzdEZpeHR1cmU6OgorICAvLyBwcmVmaXguCisgIG4gKz0gVGVzdEZpeHR1cmU6OnNoYXJlZF87CisKKyAgLy8gVG8gcmVmZXIgdG8gdHlwZWRlZnMgaW4gdGhlIGZpeHR1cmUsIGFkZCB0aGUgInR5cGVuYW1lCisgIC8vIFRlc3RGaXh0dXJlOjoiIHByZWZpeC4KKyAgdHlwZW5hbWUgVGVzdEZpeHR1cmU6Okxpc3QgdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKG4pOworICAuLi4KK30KKworVFlQRURfVEVTVChGb29UZXN0LCBIYXNQcm9wZXJ0eUEpIHsgLi4uIH0KKworI2VuZGlmICAvLyAwCisKKy8vIFR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgYWJzdHJhY3QgdGVzdCBwYXR0ZXJucyBwYXJhbWV0ZXJpemVkCisvLyBieSBhIHR5cGUuICBDb21wYXJlZCB3aXRoIHR5cGVkIHRlc3RzLCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGFsbG93IHlvdSB0byBkZWZpbmUgdGhlIHRlc3QgcGF0dGVybiB3aXRob3V0IGtub3dpbmcgd2hhdCB0aGUgdHlwZQorLy8gcGFyYW1ldGVycyBhcmUuICBUaGUgZGVmaW5lZCBwYXR0ZXJuIGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gZGlmZmVyZW50IHR5cGVzIGFueSBudW1iZXIgb2YgdGltZXMsIGluIGFueSBudW1iZXIgb2YgdHJhbnNsYXRpb24KKy8vIHVuaXRzLgorLy8KKy8vIElmIHlvdSBhcmUgZGVzaWduaW5nIGFuIGludGVyZmFjZSBvciBjb25jZXB0LCB5b3UgY2FuIGRlZmluZSBhCisvLyBzdWl0ZSBvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgdG8gdmVyaWZ5IHByb3BlcnRpZXMgdGhhdCBhbnkKKy8vIHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UvY29uY2VwdCBzaG91bGQgaGF2ZS4gIFRoZW4sCisvLyBlYWNoIGltcGxlbWVudGF0aW9uIGNhbiBlYXNpbHkgaW5zdGFudGlhdGUgdGhlIHRlc3Qgc3VpdGUgdG8gdmVyaWZ5CisvLyB0aGF0IGl0IGNvbmZvcm1zIHRvIHRoZSByZXF1aXJlbWVudHMsIHdpdGhvdXQgaGF2aW5nIHRvIHdyaXRlCisvLyBzaW1pbGFyIHRlc3RzIHJlcGVhdGVkbHkuICBIZXJlJ3MgYW4gZXhhbXBsZToKKworI2lmIDAKKworLy8gRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBJdCBzaG91bGQgYmUgcGFyYW1ldGVyaXplZAorLy8gYnkgYSB0eXBlLiAgUmVtZW1iZXIgdG8gZGVyaXZlIGl0IGZyb20gdGVzdGluZzo6VGVzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyAgLi4uCit9OworCisvLyBOZXh0LCBkZWNsYXJlIHRoYXQgeW91IHdpbGwgZGVmaW5lIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZQorLy8gKHRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIiBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UKKy8vIHByZWZlcik6CitUWVBFRF9URVNUX0NBU0VfUChGb29UZXN0KTsKKworLy8gVGhlbiwgdXNlIFRZUEVEX1RFU1RfUCgpIHRvIGRlZmluZSBhcyBtYW55IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gZm9yIHRoaXMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBhcyB5b3Ugd2FudC4KK1RZUEVEX1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgVHlwZVBhcmFtIG4gPSAwOworICAuLi4KK30KKworVFlQRURfVEVTVF9QKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQorCisvLyBOb3cgdGhlIHRyaWNreSBwYXJ0OiB5b3UgbmVlZCB0byByZWdpc3RlciBhbGwgdGVzdCBwYXR0ZXJucyBiZWZvcmUKKy8vIHlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbS4gIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgbWFjcm8gaXMgdGhlCisvLyB0ZXN0IGNhc2UgbmFtZTsgdGhlIHJlc3QgYXJlIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0CisvLyBjYXNlLgorUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERvZXNCbGFoLCBIYXNQcm9wZXJ0eUEpOworCisvLyBGaW5hbGx5LCB5b3UgYXJlIGZyZWUgdG8gaW5zdGFudGlhdGUgdGhlIHBhdHRlcm4gd2l0aCB0aGUgdHlwZXMgeW91CisvLyB3YW50LiAgSWYgeW91IHB1dCB0aGUgYWJvdmUgY29kZSBpbiBhIGhlYWRlciBmaWxlLCB5b3UgY2FuICNpbmNsdWRlCisvLyBpdCBpbiBtdWx0aXBsZSBDKysgc291cmNlIGZpbGVzIGFuZCBpbnN0YW50aWF0ZSBpdCBtdWx0aXBsZSB0aW1lcy4KKy8vCisvLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCB0aGUgZmlyc3QKKy8vIGFyZ3VtZW50IHRvIHRoZSBJTlNUQU5USUFURV8qIG1hY3JvIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZAorLy8gdG8gdGhlIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvcgorLy8gZGlmZmVyZW50IGluc3RhbmNlcy4KK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgTXlUeXBlcyk7CisKKy8vIElmIHRoZSB0eXBlIGxpc3QgY29udGFpbnMgb25seSBvbmUgdHlwZSwgeW91IGNhbiB3cml0ZSB0aGF0IHR5cGUKKy8vIGRpcmVjdGx5IHdpdGhvdXQgVHlwZXM8Li4uPjoKKy8vICAgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIGludCk7CisKKyNlbmRpZiAgLy8gMAorCisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oPgorI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oPgorCisvLyBJbXBsZW1lbnRzIHR5cGVkIHRlc3RzLgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIGZvciB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZQorLy8gZ2l2ZW4gdGVzdCBjYXNlLgorI2RlZmluZSBHVEVTVF9UWVBFX1BBUkFNU18oVGVzdENhc2VOYW1lKSBndGVzdF90eXBlX3BhcmFtc18jI1Rlc3RDYXNlTmFtZSMjXworCisvLyBUaGUgJ1R5cGVzJyB0ZW1wbGF0ZSBhcmd1bWVudCBiZWxvdyBtdXN0IGhhdmUgc3BhY2VzIGFyb3VuZCBpdAorLy8gc2luY2Ugc29tZSBjb21waWxlcnMgbWF5IGNob2tlIG9uICc+Picgd2hlbiBwYXNzaW5nIGEgdGVtcGxhdGUKKy8vIGluc3RhbmNlIChlLmcuIFR5cGVzPGludD4pCisjZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRShDYXNlTmFtZSwgVHlwZXMpIFwKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlTGlzdDwgVHlwZXMgPjo6dHlwZSBcCisgICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpCisKKyNkZWZpbmUgVFlQRURfVEVTVChDYXNlTmFtZSwgVGVzdE5hbWUpIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhDYXNlTmFtZSwgVGVzdE5hbWUpIFwKKyAgICAgIDogcHVibGljIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IHsgXAorICAgcHJpdmF0ZTogXAorICAgIHR5cGVkZWYgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4gVGVzdEZpeHR1cmU7IFwKKyAgICB0eXBlZGVmIGd0ZXN0X1R5cGVQYXJhbV8gVHlwZVBhcmFtOyBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgfTsgXAorICBib29sIGd0ZXN0XyMjQ2FzZU5hbWUjI18jI1Rlc3ROYW1lIyNfcmVnaXN0ZXJlZF8gPSBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlUGFyYW1ldGVyaXplZFRlc3Q8IFwKKyAgICAgICAgICBDYXNlTmFtZSwgXAorICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlbXBsYXRlU2VsPCBcCisgICAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKT4sIFwKKyAgICAgICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpPjo6UmVnaXN0ZXIoXAorICAgICAgICAgICAgICAiIiwgI0Nhc2VOYW1lLCAjVGVzdE5hbWUsIDApOyBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCisgIHZvaWQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhDYXNlTmFtZSwgVGVzdE5hbWUpPGd0ZXN0X1R5cGVQYXJhbV8+OjpUZXN0Qm9keSgpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gSW1wbGVtZW50cyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gRXhwYW5kcyB0byB0aGUgbmFtZXNwYWNlIG5hbWUgdGhhdCB0aGUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGZvcgorLy8gdGhlIGdpdmVuIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgYXJlIGRlZmluZWQgaW4uICBUaGUgZXhhY3QKKy8vIG5hbWUgb2YgdGhlIG5hbWVzcGFjZSBpcyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKyNkZWZpbmUgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKFRlc3RDYXNlTmFtZSkgXAorICBndGVzdF9jYXNlXyMjVGVzdENhc2VOYW1lIyNfCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdXNlZCB0byByZW1lbWJlciB0aGUgbmFtZXMgb2YKKy8vIHRoZSBkZWZpbmVkIHRlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCisjZGVmaW5lIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhUZXN0Q2FzZU5hbWUpIFwKKyAgZ3Rlc3RfdHlwZWRfdGVzdF9jYXNlX3Bfc3RhdGVfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERSBESVJFQ1RMWS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgorLy8gdGhlIHJlZ2lzdGVyZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KKyNkZWZpbmUgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhUZXN0Q2FzZU5hbWUpIFwKKyAgZ3Rlc3RfcmVnaXN0ZXJlZF90ZXN0X25hbWVzXyMjVGVzdENhc2VOYW1lIyNfCisKKy8vIFRoZSB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgbWFjcm9zIGFyZQorLy8gc3RhdGljIGFzIHR5cGljYWxseSB0aGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gYSAuaCBmaWxlIHRoYXQgY2FuIGJlCisvLyAjaW5jbHVkZWQgaW4gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMgbGlua2VkIHRvZ2V0aGVyLgorI2RlZmluZSBUWVBFRF9URVNUX0NBU0VfUChDYXNlTmFtZSkgXAorICBzdGF0aWMgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZWRUZXN0Q2FzZVBTdGF0ZSBcCisgICAgICBHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpCisKKyNkZWZpbmUgVFlQRURfVEVTVF9QKENhc2VOYW1lLCBUZXN0TmFtZSkgXAorICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKKyAgY2xhc3MgVGVzdE5hbWUgOiBwdWJsaWMgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4geyBcCisgICBwcml2YXRlOiBcCisgICAgdHlwZWRlZiBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiBUZXN0Rml4dHVyZTsgXAorICAgIHR5cGVkZWYgZ3Rlc3RfVHlwZVBhcmFtXyBUeXBlUGFyYW07IFwKKyAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAorICB9OyBcCisgIHN0YXRpYyBib29sIGd0ZXN0XyMjVGVzdE5hbWUjI19kZWZpbmVkXyA9IFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuQWRkVGVzdE5hbWUoXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI0Nhc2VOYW1lLCAjVGVzdE5hbWUpOyBcCisgIH0gXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICB2b2lkIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6OlRlc3ROYW1lPGd0ZXN0X1R5cGVQYXJhbV8+OjpUZXN0Qm9keSgpCisKKyNkZWZpbmUgUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoQ2FzZU5hbWUsIC4uLikgXAorICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUZW1wbGF0ZXM8X19WQV9BUkdTX18+Ojp0eXBlIGd0ZXN0X0FsbFRlc3RzXzsgXAorICB9IFwKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oQ2FzZU5hbWUpID0gXAorICAgICAgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKENhc2VOYW1lKS5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKFwKKyAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICNfX1ZBX0FSR1NfXykKKworLy8gVGhlICdUeXBlcycgdGVtcGxhdGUgYXJndW1lbnQgYmVsb3cgbXVzdCBoYXZlIHNwYWNlcyBhcm91bmQgaXQKKy8vIHNpbmNlIHNvbWUgY29tcGlsZXJzIG1heSBjaG9rZSBvbiAnPj4nIHdoZW4gcGFzc2luZyBhIHRlbXBsYXRlCisvLyBpbnN0YW5jZSAoZS5nLiBUeXBlczxpbnQ+KQorI2RlZmluZSBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChQcmVmaXgsIENhc2VOYW1lLCBUeXBlcykgXAorICBib29sIGd0ZXN0XyMjUHJlZml4IyNfIyNDYXNlTmFtZSA9IFwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Q2FzZU5hbWUsIFwKKyAgICAgICAgICBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpOjpndGVzdF9BbGxUZXN0c18sIFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlTGlzdDwgVHlwZXMgPjo6dHlwZT46OlJlZ2lzdGVyKFwKKyAgICAgICAgICAgICAgI1ByZWZpeCwgI0Nhc2VOYW1lLCBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKENhc2VOYW1lKSkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWZhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaApAQCAtMCwwICsxLDIwNTIgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljIEFQSSBmb3IgR29vZ2xlIFRlc3QuICBJdCBzaG91bGQgYmUKKy8vIGluY2x1ZGVkIGJ5IGFueSB0ZXN0IHByb2dyYW0gdGhhdCB1c2VzIEdvb2dsZSBUZXN0LgorLy8KKy8vIElNUE9SVEFOVCBOT1RFOiBEdWUgdG8gbGltaXRhdGlvbiBvZiB0aGUgQysrIGxhbmd1YWdlLCB3ZSBoYXZlIHRvCisvLyBsZWF2ZSBzb21lIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaW4gdGhpcyBoZWFkZXIgZmlsZS4KKy8vIFRoZXkgYXJlIGNsZWFybHkgbWFya2VkIGJ5IGNvbW1lbnRzIGxpa2UgdGhpczoKKy8vCisvLyAgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKy8vCisvLyBTdWNoIGNvZGUgaXMgTk9UIG1lYW50IHRvIGJlIHVzZWQgYnkgYSB1c2VyIGRpcmVjdGx5LCBhbmQgaXMgc3ViamVjdAorLy8gdG8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFLiAgVGhlcmVmb3JlIERPIE5PVCBERVBFTkQgT04gSVQgaW4gYSB1c2VyCisvLyBwcm9ncmFtIQorLy8KKy8vIEFja25vd2xlZGdtZW50OiBHb29nbGUgVGVzdCBib3Jyb3dlZCB0aGUgaWRlYSBvZiBhdXRvbWF0aWMgdGVzdAorLy8gcmVnaXN0cmF0aW9uIGZyb20gQmFydGhlbGVteSBEYWdlbmFpcycgKGJhcnRoZWxlbXlAcHJvbG9naXF1ZS5jb20pCisvLyBlYXN5VW5pdCBmcmFtZXdvcmsuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC1kZWF0aC10ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdF9wcm9kLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oPgorCisvLyBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLCBkaWZmZXJlbnQgc3RyaW5nIGNsYXNzZXMgYXJlIGF2YWlsYWJsZS4KKy8vIE9uIExpbnV4LCBpbiBhZGRpdGlvbiB0byA6OnN0ZDo6c3RyaW5nLCBHb29nbGUgYWxzbyBtYWtlcyB1c2Ugb2YKKy8vIGNsYXNzIDo6c3RyaW5nLCB3aGljaCBoYXMgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIDo6c3RkOjpzdHJpbmcsIGJ1dAorLy8gaGFzIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgorLy8KKy8vIFRoZSB1c2VyIGNhbiBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgdG8gMSB0byBpbmRpY2F0ZSB0aGF0CisvLyA6OnN0cmluZyBpcyBhdmFpbGFibGUgQU5EIGlzIGEgZGlzdGluY3QgdHlwZSB0byA6OnN0ZDo6c3RyaW5nLCBvcgorLy8gZGVmaW5lIGl0IHRvIDAgdG8gaW5kaWNhdGUgb3RoZXJ3aXNlLgorLy8KKy8vIElmIHRoZSB1c2VyJ3MgOjpzdGQ6OnN0cmluZyBhbmQgOjpzdHJpbmcgYXJlIHRoZSBzYW1lIGNsYXNzIGR1ZSB0bworLy8gYWxpYXNpbmcsIGhlIHNob3VsZCBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgdG8gMC4KKy8vCisvLyBJZiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORywgaXQgaXMgZGVmaW5lZAorLy8gaGV1cmlzdGljYWxseS4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBEZWNsYXJlcyB0aGUgZmxhZ3MuCisKKy8vIFRoaXMgZmxhZyB0ZW1wb3JhcnkgZW5hYmxlcyB0aGUgZGlzYWJsZWQgdGVzdHMuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKKworLy8gVGhpcyBmbGFnIGJyaW5ncyB0aGUgZGVidWdnZXIgb24gYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGJyZWFrX29uX2ZhaWx1cmUpOworCisvLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBjYXRjaGVzIGFsbCB0ZXN0LXRocm93biBleGNlcHRpb25zCisvLyBhbmQgbG9ncyB0aGVtIGFzIGZhaWx1cmVzLgorR1RFU1RfREVDTEFSRV9ib29sXyhjYXRjaF9leGNlcHRpb25zKTsKKworLy8gVGhpcyBmbGFnIGVuYWJsZXMgdXNpbmcgY29sb3JzIGluIHRlcm1pbmFsIG91dHB1dC4gQXZhaWxhYmxlIHZhbHVlcyBhcmUKKy8vICJ5ZXMiIHRvIGVuYWJsZSBjb2xvcnMsICJubyIgKGRpc2FibGUgY29sb3JzKSwgb3IgImF1dG8iICh0aGUgZGVmYXVsdCkKKy8vIHRvIGxldCBHb29nbGUgVGVzdCBkZWNpZGUuCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oY29sb3IpOworCisvLyBUaGlzIGZsYWcgc2V0cyB1cCB0aGUgZmlsdGVyIHRvIHNlbGVjdCBieSBuYW1lIHVzaW5nIGEgZ2xvYiBwYXR0ZXJuCisvLyB0aGUgdGVzdHMgdG8gcnVuLiBJZiB0aGUgZmlsdGVyIGlzIG5vdCBnaXZlbiBhbGwgdGVzdHMgYXJlIGV4ZWN1dGVkLgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKGZpbHRlcik7CisKKy8vIFRoaXMgZmxhZyBjYXVzZXMgdGhlIEdvb2dsZSBUZXN0IHRvIGxpc3QgdGVzdHMuIE5vbmUgb2YgdGhlIHRlc3RzIGxpc3RlZAorLy8gYXJlIGFjdHVhbGx5IHJ1biBpZiB0aGUgZmxhZyBpcyBwcm92aWRlZC4KK0dURVNUX0RFQ0xBUkVfYm9vbF8obGlzdF90ZXN0cyk7CisKKy8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGVtaXRzIGEgZGV0YWlsZWQgWE1MIHJlcG9ydCB0byBhIGZpbGUKKy8vIGluIGFkZGl0aW9uIHRvIGl0cyBub3JtYWwgdGV4dHVhbCBvdXRwdXQuCitHVEVTVF9ERUNMQVJFX3N0cmluZ18ob3V0cHV0KTsKKworLy8gVGhpcyBmbGFncyBjb250cm9sIHdoZXRoZXIgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSBlbGFwc2VkIHRpbWUgZm9yIGVhY2gKKy8vIHRlc3QuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKHByaW50X3RpbWUpOworCisvLyBUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSByYW5kb20gbnVtYmVyIHNlZWQuCitHVEVTVF9ERUNMQVJFX2ludDMyXyhyYW5kb21fc2VlZCk7CisKKy8vIFRoaXMgZmxhZyBzZXRzIGhvdyBtYW55IHRpbWVzIHRoZSB0ZXN0cyBhcmUgcmVwZWF0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlCisvLyBpcyAxLiBJZiB0aGUgdmFsdWUgaXMgLTEgdGhlIHRlc3RzIGFyZSByZXBlYXRpbmcgZm9yZXZlci4KK0dURVNUX0RFQ0xBUkVfaW50MzJfKHJlcGVhdCk7CisKKy8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGluY2x1ZGVzIEdvb2dsZSBUZXN0IGludGVybmFsCisvLyBzdGFjayBmcmFtZXMgaW4gZmFpbHVyZSBzdGFjayB0cmFjZXMuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzKTsKKworLy8gV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0ZXN0cycgb3JkZXIgaXMgcmFuZG9taXplZCBvbiBldmVyeSBpdGVyYXRpb24uCitHVEVTVF9ERUNMQVJFX2Jvb2xfKHNodWZmbGUpOworCisvLyBUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUKKy8vIHByaW50ZWQgaW4gYSBmYWlsdXJlIG1lc3NhZ2UuCitHVEVTVF9ERUNMQVJFX2ludDMyXyhzdGFja190cmFjZV9kZXB0aCk7CisKKy8vIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgYSBmYWlsZWQgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4KKy8vIGV4Y2VwdGlvbiBpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBvciBleGl0IHRoZSBwcm9ncmFtIHdpdGggYQorLy8gbm9uLXplcm8gY29kZSBvdGhlcndpc2UuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKHRocm93X29uX2ZhaWx1cmUpOworCisvLyBUaGUgdXBwZXIgbGltaXQgZm9yIHZhbGlkIHN0YWNrIHRyYWNlIGRlcHRocy4KK2NvbnN0IGludCBrTWF4U3RhY2tUcmFjZURlcHRoID0gMTAwOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBBc3NlcnRIZWxwZXI7CitjbGFzcyBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKK2NsYXNzIEV4ZWNEZWF0aFRlc3Q7CitjbGFzcyBOb0V4ZWNEZWF0aFRlc3Q7CitjbGFzcyBGaW5hbFN1Y2Nlc3NDaGVja2VyOworY2xhc3MgR1Rlc3RGbGFnU2F2ZXI7CitjbGFzcyBUZXN0SW5mb0ltcGw7CitjbGFzcyBUZXN0UmVzdWx0QWNjZXNzb3I7CitjbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKK2NsYXNzIFRlc3RFdmVudFJlcGVhdGVyOworY2xhc3MgV2luZG93c0RlYXRoVGVzdDsKK2NsYXNzIFVuaXRUZXN0SW1wbCogR2V0VW5pdFRlc3RJbXBsKCk7Cit2b2lkIFJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgbWVzc2FnZSk7CitjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI7CitjbGFzcyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI7CisKKy8vIENvbnZlcnRzIGEgc3RyZWFtYWJsZSB2YWx1ZSB0byBhIFN0cmluZy4gIEEgTlVMTCBwb2ludGVyIGlzCisvLyBjb252ZXJ0ZWQgdG8gIihudWxsKSIuICBXaGVuIHRoZSBpbnB1dCB2YWx1ZSBpcyBhIDo6c3RyaW5nLAorLy8gOjpzdGQ6OnN0cmluZywgOjp3c3RyaW5nLCBvciA6OnN0ZDo6d3N0cmluZyBvYmplY3QsIGVhY2ggTlVMCisvLyBjaGFyYWN0ZXIgaW4gaXQgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KKy8vIERlY2xhcmVkIGluIGd0ZXN0LWludGVybmFsLmggYnV0IGRlZmluZWQgaGVyZSwgc28gdGhhdCBpdCBoYXMgYWNjZXNzCisvLyB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgTWVzc2FnZSBjbGFzcywgcmVxdWlyZWQgYnkgdGhlIEFSTQorLy8gY29tcGlsZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1N0cmluZyBTdHJlYW1hYmxlVG9TdHJpbmcoY29uc3QgVCYgc3RyZWFtYWJsZSkgeworICByZXR1cm4gKE1lc3NhZ2UoKSA8PCBzdHJlYW1hYmxlKS5HZXRTdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEEgY2xhc3MgZm9yIGluZGljYXRpbmcgd2hldGhlciBhbiBhc3NlcnRpb24gd2FzIHN1Y2Nlc3NmdWwuICBXaGVuCisvLyB0aGUgYXNzZXJ0aW9uIHdhc24ndCBzdWNjZXNzZnVsLCB0aGUgQXNzZXJ0aW9uUmVzdWx0IG9iamVjdAorLy8gcmVtZW1iZXJzIGEgbm9uLWVtcHR5IG1lc3NhZ2UgdGhhdCBkZXNjcmliZXMgaG93IGl0IGZhaWxlZC4KKy8vCisvLyBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgdXNlIG9uZSBvZiB0aGUgZmFjdG9yeSBmdW5jdGlvbnMKKy8vIChBc3NlcnRpb25TdWNjZXNzKCkgYW5kIEFzc2VydGlvbkZhaWx1cmUoKSkuCisvLworLy8gVGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIHR3byBwdXJwb3NlczoKKy8vICAgMS4gRGVmaW5pbmcgcHJlZGljYXRlIGZ1bmN0aW9ucyB0byBiZSB1c2VkIHdpdGggQm9vbGVhbiB0ZXN0IGFzc2VydGlvbnMKKy8vICAgICAgRVhQRUNUX1RSVUUvRVhQRUNUX0ZBTFNFIGFuZCB0aGVpciBBU1NFUlRfIGNvdW50ZXJwYXJ0cworLy8gICAyLiBEZWZpbmluZyBwcmVkaWNhdGUtZm9ybWF0IGZ1bmN0aW9ucyB0byBiZQorLy8gICAgICB1c2VkIHdpdGggcHJlZGljYXRlIGFzc2VydGlvbnMgKEFTU0VSVF9QUkVEX0ZPUk1BVCosIGV0YykuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWZpbmUgSXNFdmVuIHByZWRpY2F0ZToKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKy8vICAgICBlbHNlCisvLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworLy8gICB9CisvLworLy8gVGhlbiB0aGUgZmFpbGVkIGV4cGVjdGF0aW9uIEVYUEVDVF9UUlVFKElzRXZlbihGaWIoNSkpKQorLy8gd2lsbCBwcmludCB0aGUgbWVzc2FnZQorLy8KKy8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNSkpCisvLyAgICAgQWN0dWFsOiBmYWxzZSAoNSBpcyBvZGQpCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW5zdGVhZCBvZiBhIG1vcmUgb3BhcXVlCisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig1KSkKKy8vICAgICBBY3R1YWw6IGZhbHNlCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW4gY2FzZSBJc0V2ZW4gaXMgYSBzaW1wbGUgQm9vbGVhbiBwcmVkaWNhdGUuCisvLworLy8gSWYgeW91IGV4cGVjdCB5b3VyIHByZWRpY2F0ZSB0byBiZSByZXVzZWQgYW5kIHdhbnQgdG8gc3VwcG9ydCBpbmZvcm1hdGl2ZQorLy8gbWVzc2FnZXMgaW4gRVhQRUNUX0ZBTFNFIGFuZCBBU1NFUlRfRkFMU0UgKG5lZ2F0aXZlIGFzc2VydGlvbnMgc2hvdyB1cAorLy8gYWJvdXQgaGFsZiBhcyBvZnRlbiBhcyBwb3NpdGl2ZSBvbmVzIGluIG91ciB0ZXN0cyksIHN1cHBseSBtZXNzYWdlcyBmb3IKKy8vIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBjYXNlczoKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKSA8PCBuIDw8ICIgaXMgZXZlbiI7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKKy8vICAgfQorLy8KKy8vIFRoZW4gYSBzdGF0ZW1lbnQgRVhQRUNUX0ZBTFNFKElzRXZlbihGaWIoNikpKSB3aWxsIHByaW50CisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig2KSkKKy8vICAgICBBY3R1YWw6IHRydWUgKDggaXMgZXZlbikKKy8vICAgRXhwZWN0ZWQ6IGZhbHNlCisvLworLy8gTkI6IFByZWRpY2F0ZXMgdGhhdCBzdXBwb3J0IG5lZ2F0aXZlIEJvb2xlYW4gYXNzZXJ0aW9ucyBoYXZlIHJlZHVjZWQKKy8vIHBlcmZvcm1hbmNlIGluIHBvc2l0aXZlIG9uZXMgc28gYmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRoZW0gaW4gdGVzdHMKKy8vIHRoYXQgaGF2ZSBsb3RzICh0ZW5zIG9mIHRob3VzYW5kcykgb2YgcG9zaXRpdmUgQm9vbGVhbiBhc3NlcnRpb25zLgorLy8KKy8vIFRvIHVzZSB0aGlzIGNsYXNzIHdpdGggRVhQRUNUX1BSRURfRk9STUFUIGFzc2VydGlvbnMgc3VjaCBhczoKKy8vCisvLyAgIC8vIFZlcmlmaWVzIHRoYXQgRm9vKCkgcmV0dXJucyBhbiBldmVuIG51bWJlci4KKy8vICAgRVhQRUNUX1BSRURfRk9STUFUMShJc0V2ZW4sIEZvbygpKTsKKy8vCisvLyB5b3UgbmVlZCB0byBkZWZpbmU6CisvLworLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGNvbnN0IGNoYXIqIGV4cHIsIGludCBuKSB7CisvLyAgICAgaWYgKChuICUgMikgPT0gMCkKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorLy8gICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiIGlzIGV2ZW5cbiAgQWN0dWFsOiBpdCdzICIgPDwgbjsKKy8vICAgfQorLy8KKy8vIElmIEZvbygpIHJldHVybnMgNSwgeW91IHdpbGwgc2VlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKKy8vCisvLyAgIEV4cGVjdGVkOiBGb28oKSBpcyBldmVuCisvLyAgICAgQWN0dWFsOiBpdCdzIDUKKy8vCitjbGFzcyBHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCB7CisgcHVibGljOgorICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICAvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgorICBBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcik7CisgIC8vIFVzZWQgaW4gdGhlIEVYUEVDVF9UUlVFL0ZBTFNFKGJvb2xfZXhwcmVzc2lvbikuCisgIGV4cGxpY2l0IEFzc2VydGlvblJlc3VsdChib29sIHN1Y2Nlc3MpIDogc3VjY2Vzc18oc3VjY2Vzcykge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gc3VjY2VlZGVkLgorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gc3VjY2Vzc187IH0gIC8vIE5PTElOVAorCisgIC8vIFJldHVybnMgdGhlIGFzc2VydGlvbidzIG5lZ2F0aW9uLiBVc2VkIHdpdGggRVhQRUNUL0FTU0VSVF9GQUxTRS4KKyAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yISgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHRleHQgc3RyZWFtZWQgaW50byB0aGlzIEFzc2VydGlvblJlc3VsdC4gVGVzdCBhc3NlcnRpb25zCisgIC8vIHVzZSBpdCB3aGVuIHRoZXkgZmFpbCAoaS5lLiwgdGhlIHByZWRpY2F0ZSdzIG91dGNvbWUgZG9lc24ndCBtYXRjaCB0aGUKKyAgLy8gYXNzZXJ0aW9uJ3MgZXhwZWN0YXRpb24pLiBXaGVuIG5vdGhpbmcgaGFzIGJlZW4gc3RyZWFtZWQgaW50byB0aGUKKyAgLy8gb2JqZWN0LCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCAmJiBtZXNzYWdlXy0+Y19zdHIoKSAhPSBOVUxMID8KKyAgICAgICAgICAgbWVzc2FnZV8tPmNfc3RyKCkgOiAiIjsKKyAgfQorICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZW1vdmUgdGhpcyBhZnRlciBtYWtpbmcgc3VyZSBubyBjbGllbnRzIHVzZSBpdC4KKyAgLy8gRGVwcmVjYXRlZDsgcGxlYXNlIHVzZSBtZXNzYWdlKCkgaW5zdGVhZC4KKyAgY29uc3QgY2hhciogZmFpbHVyZV9tZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gbWVzc2FnZSgpOyB9CisKKyAgLy8gU3RyZWFtcyBhIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2UgaW50byB0aGlzIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3I8PChjb25zdCBUJiB2YWx1ZSk7CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIHdlIHdhbnQgQXNzZXJ0aW9uUmVzdWx0IHRvIGJlCisgIC8vIGNvcHktY29uc3RydWN0aWJsZSBidXQgbm90IGFzc2lnbmFibGUuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEFzc2VydGlvblJlc3VsdCYgb3RoZXIpOworCisgIC8vIFN0b3JlcyByZXN1bHQgb2YgdGhlIGFzc2VydGlvbiBwcmVkaWNhdGUuCisgIGJvb2wgc3VjY2Vzc187CisgIC8vIFN0b3JlcyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBjb25kaXRpb24gaW4gY2FzZSB0aGUgZXhwZWN0YXRpb24KKyAgLy8gY29uc3RydWN0IGlzIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgcHJlZGljYXRlJ3Mgb3V0Y29tZS4KKyAgLy8gUmVmZXJlbmNlZCB2aWEgYSBwb2ludGVyIHRvIGF2b2lkIHRha2luZyB0b28gbXVjaCBzdGFjayBmcmFtZSBzcGFjZQorICAvLyB3aXRoIHRlc3QgYXNzZXJ0aW9ucy4KKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8aW50ZXJuYWw6OlN0cmluZz4gbWVzc2FnZV87Cit9OyAgLy8gY2xhc3MgQXNzZXJ0aW9uUmVzdWx0CisKKy8vIFN0cmVhbXMgYSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlIGludG8gdGhpcyBvYmplY3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0Fzc2VydGlvblJlc3VsdCYgQXNzZXJ0aW9uUmVzdWx0OjpvcGVyYXRvcjw8KGNvbnN0IFQmIHZhbHVlKSB7CisgIE1lc3NhZ2UgbXNnOworICBpZiAobWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCkKKyAgICBtc2cgPDwgKm1lc3NhZ2VfOworICBtc2cgPDwgdmFsdWU7CisgIG1lc3NhZ2VfLnJlc2V0KG5ldyBpbnRlcm5hbDo6U3RyaW5nKG1zZy5HZXRTdHJpbmcoKSkpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0LgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uU3VjY2VzcygpOworCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0LgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpOworCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0IHdpdGggdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZS4KKy8vIERlcHJlY2F0ZWQ7IHVzZSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZShjb25zdCBNZXNzYWdlJiBtc2cpOworCisvLyBUaGUgYWJzdHJhY3QgY2xhc3MgdGhhdCBhbGwgdGVzdHMgaW5oZXJpdCBmcm9tLgorLy8KKy8vIEluIEdvb2dsZSBUZXN0LCBhIHVuaXQgdGVzdCBwcm9ncmFtIGNvbnRhaW5zIG9uZSBvciBtYW55IFRlc3RDYXNlcywgYW5kCisvLyBlYWNoIFRlc3RDYXNlIGNvbnRhaW5zIG9uZSBvciBtYW55IFRlc3RzLgorLy8KKy8vIFdoZW4geW91IGRlZmluZSBhIHRlc3QgdXNpbmcgdGhlIFRFU1QgbWFjcm8sIHlvdSBkb24ndCBuZWVkIHRvCisvLyBleHBsaWNpdGx5IGRlcml2ZSBmcm9tIFRlc3QgLSB0aGUgVEVTVCBtYWNybyBhdXRvbWF0aWNhbGx5IGRvZXMKKy8vIHRoaXMgZm9yIHlvdS4KKy8vCisvLyBUaGUgb25seSB0aW1lIHlvdSBkZXJpdmUgZnJvbSBUZXN0IGlzIHdoZW4gZGVmaW5pbmcgYSB0ZXN0IGZpeHR1cmUKKy8vIHRvIGJlIHVzZWQgYSBURVNUX0YuICBGb3IgZXhhbXBsZToKKy8vCisvLyAgIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisvLyAgICBwcm90ZWN0ZWQ6CisvLyAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyAuLi4gfQorLy8gICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsgLi4uIH0KKy8vICAgICAuLi4KKy8vICAgfTsKKy8vCisvLyAgIFRFU1RfRihGb29UZXN0LCBCYXIpIHsgLi4uIH0KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIEJheikgeyAuLi4gfQorLy8KKy8vIFRlc3QgaXMgbm90IGNvcHlhYmxlLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0IHsKKyBwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VGVzdEluZm9JbXBsOworCisgIC8vIERlZmluZXMgdHlwZXMgZm9yIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IHNldCB1cCBhbmQgdGVhciBkb3duCisgIC8vIGEgdGVzdCBjYXNlLgorICB0eXBlZGVmIGludGVybmFsOjpTZXRVcFRlc3RDYXNlRnVuYyBTZXRVcFRlc3RDYXNlRnVuYzsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgVGVhckRvd25UZXN0Q2FzZUZ1bmM7CisKKyAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgaW50ZW5kIHRvIGluaGVyaXQgZnJvbSBUZXN0LgorICB2aXJ0dWFsIH5UZXN0KCk7CisKKyAgLy8gU2V0cyB1cCB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6U2V0VXBUZXN0Q2FzZSgpIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdAorICAvLyB0ZXN0IGluIHRlc3QgY2FzZSBGb28uICBIZW5jZSBhIHN1Yi1jbGFzcyBjYW4gZGVmaW5lIGl0cyBvd24KKyAgLy8gU2V0VXBUZXN0Q2FzZSgpIG1ldGhvZCB0byBzaGFkb3cgdGhlIG9uZSBkZWZpbmVkIGluIHRoZSBzdXBlcgorICAvLyBjbGFzcy4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHt9CisKKyAgLy8gVGVhcnMgZG93biB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6VGVhckRvd25UZXN0Q2FzZSgpIGFmdGVyIHJ1bm5pbmcgdGhlIGxhc3QKKyAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duCisgIC8vIFRlYXJEb3duVGVzdENhc2UoKSBtZXRob2QgdG8gc2hhZG93IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgc3VwZXIKKyAgLy8gY2xhc3MuCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgorICBzdGF0aWMgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCisgIHN0YXRpYyBib29sIEhhc05vbmZhdGFsRmFpbHVyZSgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSAoZWl0aGVyIGZhdGFsIG9yCisgIC8vIG5vbi1mYXRhbCkgZmFpbHVyZS4KKyAgc3RhdGljIGJvb2wgSGFzRmFpbHVyZSgpIHsgcmV0dXJuIEhhc0ZhdGFsRmFpbHVyZSgpIHx8IEhhc05vbmZhdGFsRmFpbHVyZSgpOyB9CisKKyAgLy8gTG9ncyBhIHByb3BlcnR5IGZvciB0aGUgY3VycmVudCB0ZXN0LiAgT25seSB0aGUgbGFzdCB2YWx1ZSBmb3IgYSBnaXZlbgorICAvLyBrZXkgaXMgcmVtZW1iZXJlZC4KKyAgLy8gVGhlc2UgYXJlIHB1YmxpYyBzdGF0aWMgc28gdGhleSBjYW4gYmUgY2FsbGVkIGZyb20gdXRpbGl0eSBmdW5jdGlvbnMKKyAgLy8gdGhhdCBhcmUgbm90IG1lbWJlcnMgb2YgdGhlIHRlc3QgZml4dHVyZS4KKyAgLy8gVGhlIGFyZ3VtZW50cyBhcmUgY29uc3QgY2hhciogaW5zdGVhZCBzdHJpbmdzLCBhcyBHb29nbGUgVGVzdCBpcyB1c2VkCisgIC8vIG9uIHBsYXRmb3JtcyB3aGVyZSBzdHJpbmcgZG9lc24ndCBjb21waWxlLgorICAvLworICAvLyBOb3RlIHRoYXQgYSBkcml2aW5nIGNvbnNpZGVyYXRpb24gZm9yIHRoZXNlIFJlY29yZFByb3BlcnR5IG1ldGhvZHMKKyAgLy8gd2FzIHRvIHByb2R1Y2UgeG1sIG91dHB1dCBzdWl0ZWQgdG8gdGhlIEdyZWVuc3BhbiBjaGFydGluZyB1dGlsaXR5LAorICAvLyB3aGljaCBhdCBwcmVzZW50IHdpbGwgb25seSBjaGFydCB2YWx1ZXMgdGhhdCBmaXQgaW4gYSAzMi1iaXQgaW50LiBJdAorICAvLyBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIHJlc3RyaWN0IHRoZWlyIHZhbHVlcyB0byAzMi1iaXQgaW50cworICAvLyBpZiB0aGV5IGludGVuZCB0aGVtIHRvIGJlIHVzZWQgd2l0aCBHcmVlbnNwYW4uCisgIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOworICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBjaGFyKiBrZXksIGludCB2YWx1ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIENyZWF0ZXMgYSBUZXN0IG9iamVjdC4KKyAgVGVzdCgpOworCisgIC8vIFNldHMgdXAgdGhlIHRlc3QgZml4dHVyZS4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCk7CisKKyAgLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKworIHByaXZhdGU6CisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlIHNhbWUgZml4dHVyZSBjbGFzcyBhcworICAvLyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuCisgIHN0YXRpYyBib29sIEhhc1NhbWVGaXh0dXJlQ2xhc3MoKTsKKworICAvLyBSdW5zIHRoZSB0ZXN0IGFmdGVyIHRoZSB0ZXN0IGZpeHR1cmUgaGFzIGJlZW4gc2V0IHVwLgorICAvLworICAvLyBBIHN1Yi1jbGFzcyBtdXN0IGltcGxlbWVudCB0aGlzIHRvIGRlZmluZSB0aGUgdGVzdCBsb2dpYy4KKyAgLy8KKyAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgRlVOQ1RJT04gRElSRUNUTFkgSU4gQSBVU0VSIFBST0dSQU0uCisgIC8vIEluc3RlYWQsIHVzZSB0aGUgVEVTVCBvciBURVNUX0YgbWFjcm8uCisgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpID0gMDsKKworICAvLyBTZXRzIHVwLCBleGVjdXRlcywgYW5kIHRlYXJzIGRvd24gdGhlIHRlc3QuCisgIHZvaWQgUnVuKCk7CisKKyAgLy8gVXNlcyBhIEdUZXN0RmxhZ1NhdmVyIHRvIHNhdmUgYW5kIHJlc3RvcmUgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorICBjb25zdCBpbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXIqIGNvbnN0IGd0ZXN0X2ZsYWdfc2F2ZXJfOworCisgIC8vIE9mdGVuIGEgdXNlciBtaXMtc3BlbGxzIFNldFVwKCkgYXMgU2V0dXAoKSBhbmQgc3BlbmRzIGEgbG9uZyB0aW1lCisgIC8vIHdvbmRlcmluZyB3aHkgaXQgaXMgbmV2ZXIgY2FsbGVkIGJ5IEdvb2dsZSBUZXN0LiAgVGhlIGRlY2xhcmF0aW9uIG9mCisgIC8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIHNvbGVseSBmb3IgY2F0Y2hpbmcgc3VjaCBhbiBlcnJvciBhdAorICAvLyBjb21waWxlIHRpbWU6CisgIC8vCisgIC8vICAgLSBUaGUgcmV0dXJuIHR5cGUgaXMgZGVsaWJlcmF0ZWx5IGNob3NlbiB0byBiZSBub3Qgdm9pZCwgc28gaXQKKyAgLy8gICB3aWxsIGJlIGEgY29uZmxpY3QgaWYgYSB1c2VyIGRlY2xhcmVzIHZvaWQgU2V0dXAoKSBpbiBoaXMgdGVzdAorICAvLyAgIGZpeHR1cmUuCisgIC8vCisgIC8vICAgLSBUaGlzIG1ldGhvZCBpcyBwcml2YXRlLCBzbyBpdCB3aWxsIGJlIGFub3RoZXIgY29tcGlsZXIgZXJyb3IKKyAgLy8gICBpZiBhIHVzZXIgY2FsbHMgaXQgZnJvbSBoaXMgdGVzdCBmaXh0dXJlLgorICAvLworICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBGVU5DVElPTi4KKyAgLy8KKyAgLy8gSWYgeW91IHNlZSBhbiBlcnJvciBhYm91dCBvdmVycmlkaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gb3IKKyAgLy8gYWJvdXQgaXQgYmVpbmcgcHJpdmF0ZSwgeW91IGhhdmUgbWlzLXNwZWxsZWQgU2V0VXAoKSBhcyBTZXR1cCgpLgorICBzdHJ1Y3QgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAge307CisgIHZpcnR1YWwgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAqIFNldHVwKCkgeyByZXR1cm4gTlVMTDsgfQorCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdHMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdCk7Cit9OworCit0eXBlZGVmIGludGVybmFsOjpUaW1lSW5NaWxsaXMgVGltZUluTWlsbGlzOworCisvLyBBIGNvcHlhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgYSB1c2VyIHNwZWNpZmllZCB0ZXN0IHByb3BlcnR5IHdoaWNoIGNhbiBiZQorLy8gb3V0cHV0IGFzIGEga2V5L3ZhbHVlIHN0cmluZyBwYWlyLgorLy8KKy8vIERvbid0IGluaGVyaXQgZnJvbSBUZXN0UHJvcGVydHkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCitjbGFzcyBUZXN0UHJvcGVydHkgeworIHB1YmxpYzoKKyAgLy8gQyd0b3IuICBUZXN0UHJvcGVydHkgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIC8vIEFsd2F5cyB1c2UgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCBwYXJhbWV0ZXJzKSB0byBjcmVhdGUgYQorICAvLyBUZXN0UHJvcGVydHkgb2JqZWN0LgorICBUZXN0UHJvcGVydHkoY29uc3QgY2hhciogYV9rZXksIGNvbnN0IGNoYXIqIGFfdmFsdWUpIDoKKyAgICBrZXlfKGFfa2V5KSwgdmFsdWVfKGFfdmFsdWUpIHsKKyAgfQorCisgIC8vIEdldHMgdGhlIHVzZXIgc3VwcGxpZWQga2V5LgorICBjb25zdCBjaGFyKiBrZXkoKSBjb25zdCB7CisgICAgcmV0dXJuIGtleV8uY19zdHIoKTsKKyAgfQorCisgIC8vIEdldHMgdGhlIHVzZXIgc3VwcGxpZWQgdmFsdWUuCisgIGNvbnN0IGNoYXIqIHZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8uY19zdHIoKTsKKyAgfQorCisgIC8vIFNldHMgYSBuZXcgdmFsdWUsIG92ZXJyaWRpbmcgdGhlIG9uZSBzdXBwbGllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgIHZvaWQgU2V0VmFsdWUoY29uc3QgY2hhciogbmV3X3ZhbHVlKSB7CisgICAgdmFsdWVfID0gbmV3X3ZhbHVlOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUga2V5IHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorICBpbnRlcm5hbDo6U3RyaW5nIGtleV87CisgIC8vIFRoZSB2YWx1ZSBzdXBwbGllZCBieSB0aGUgdXNlci4KKyAgaW50ZXJuYWw6OlN0cmluZyB2YWx1ZV87Cit9OworCisvLyBUaGUgcmVzdWx0IG9mIGEgc2luZ2xlIFRlc3QuICBUaGlzIGluY2x1ZGVzIGEgbGlzdCBvZgorLy8gVGVzdFBhcnRSZXN1bHRzLCBhIGxpc3Qgb2YgVGVzdFByb3BlcnRpZXMsIGEgY291bnQgb2YgaG93IG1hbnkKKy8vIGRlYXRoIHRlc3RzIHRoZXJlIGFyZSBpbiB0aGUgVGVzdCwgYW5kIGhvdyBtdWNoIHRpbWUgaXQgdG9vayB0byBydW4KKy8vIHRoZSBUZXN0LgorLy8KKy8vIFRlc3RSZXN1bHQgaXMgbm90IGNvcHlhYmxlLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UmVzdWx0IHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYW4gZW1wdHkgVGVzdFJlc3VsdC4KKyAgVGVzdFJlc3VsdCgpOworCisgIC8vIEQndG9yLiAgRG8gbm90IGluaGVyaXQgZnJvbSBUZXN0UmVzdWx0LgorICB+VGVzdFJlc3VsdCgpOworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBwYXJ0cy4gIFRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyCisgIC8vIG9mIHN1Y2Nlc3NmdWwgdGVzdCBwYXJ0cyBhbmQgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBwYXJ0cy4KKyAgaW50IHRvdGFsX3BhcnRfY291bnQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRlc3QgcHJvcGVydGllcy4KKyAgaW50IHRlc3RfcHJvcGVydHlfY291bnQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhc3NlZCAoaS5lLiBubyB0ZXN0IHBhcnQgZmFpbGVkKS4KKyAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4KKyAgYm9vbCBGYWlsZWQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhdGFsbHkgZmFpbGVkLgorICBib29sIEhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCisgIGJvb2wgSGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHBhcnQgcmVzdWx0IGFtb25nIGFsbCB0aGUgcmVzdWx0cy4gaSBjYW4gcmFuZ2UKKyAgLy8gZnJvbSAwIHRvIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cworICAvLyB0aGUgcHJvZ3JhbS4KKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcHJvcGVydHkuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCBhYm9ydHMgdGhlCisgIC8vIHByb2dyYW0uCisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgR2V0VGVzdFByb3BlcnR5KGludCBpKSBjb25zdDsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKKyAgZnJpZW5kIGNsYXNzIFVuaXRUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkV4ZWNEZWF0aFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VGVzdEluZm9JbXBsOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRlc3RSZXN1bHRBY2Nlc3NvcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6V2luZG93c0RlYXRoVGVzdDsKKworICAvLyBHZXRzIHRoZSB2ZWN0b3Igb2YgVGVzdFBhcnRSZXN1bHRzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4mIHRlc3RfcGFydF9yZXN1bHRzKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3BhcnRfcmVzdWx0c187CisgIH0KKworICAvLyBHZXRzIHRoZSB2ZWN0b3Igb2YgVGVzdFByb3BlcnRpZXMuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4mIHRlc3RfcHJvcGVydGllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXzsKKyAgfQorCisgIC8vIFNldHMgdGhlIGVsYXBzZWQgdGltZS4KKyAgdm9pZCBzZXRfZWxhcHNlZF90aW1lKFRpbWVJbk1pbGxpcyBlbGFwc2VkKSB7IGVsYXBzZWRfdGltZV8gPSBlbGFwc2VkOyB9CisKKyAgLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIFRoZSBwcm9wZXJ0eSBpcyB2YWxpZGF0ZWQgYW5kIG1heSBhZGQKKyAgLy8gYSBub24tZmF0YWwgZmFpbHVyZSBpZiBpbnZhbGlkIChlLmcuLCBpZiBpdCBjb25mbGljdHMgd2l0aCByZXNlcnZlZAorICAvLyBrZXkgbmFtZXMpLiBJZiBhIHByb3BlcnR5IGlzIGFscmVhZHkgcmVjb3JkZWQgZm9yIHRoZSBzYW1lIGtleSwgdGhlCisgIC8vIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCwgcmF0aGVyIHRoYW4gc3RvcmluZyBtdWx0aXBsZSB2YWx1ZXMgZm9yIHRoZSBzYW1lCisgIC8vIGtleS4KKyAgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpOworCisgIC8vIEFkZHMgYSBmYWlsdXJlIGlmIHRoZSBrZXkgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgb2YgR29vZ2xlIFRlc3QKKyAgLy8gdGVzdGNhc2UgdGFncy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgdmFsaWQuCisgIC8vIFRPRE8ocnVzc3IpOiBWYWxpZGF0ZSBhdHRyaWJ1dGUgbmFtZXMgYXJlIGxlZ2FsIGFuZCBodW1hbiByZWFkYWJsZS4KKyAgc3RhdGljIGJvb2wgVmFsaWRhdGVUZXN0UHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsKKworICAvLyBBZGRzIGEgdGVzdCBwYXJ0IHJlc3VsdCB0byB0aGUgbGlzdC4KKyAgdm9pZCBBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgZGVhdGggdGVzdCBjb3VudC4KKyAgaW50IGRlYXRoX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBkZWF0aF90ZXN0X2NvdW50XzsgfQorCisgIC8vIEluY3JlbWVudHMgdGhlIGRlYXRoIHRlc3QgY291bnQsIHJldHVybmluZyB0aGUgbmV3IGNvdW50LgorICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7IHJldHVybiArK2RlYXRoX3Rlc3RfY291bnRfOyB9CisKKyAgLy8gQ2xlYXJzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0cy4KKyAgdm9pZCBDbGVhclRlc3RQYXJ0UmVzdWx0cygpOworCisgIC8vIENsZWFycyB0aGUgb2JqZWN0LgorICB2b2lkIENsZWFyKCk7CisKKyAgLy8gUHJvdGVjdHMgbXV0YWJsZSBzdGF0ZSBvZiB0aGUgcHJvcGVydHkgdmVjdG9yIGFuZCBvZiBvd25lZAorICAvLyBwcm9wZXJ0aWVzLCB3aG9zZSB2YWx1ZXMgbWF5IGJlIHVwZGF0ZWQuCisgIGludGVybmFsOjpNdXRleCB0ZXN0X3Byb3Blcml0ZXNfbXV0ZXhfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdFBhcnRSZXN1bHRzCisgIHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiB0ZXN0X3BhcnRfcmVzdWx0c187CisgIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdFByb3BlcnRpZXMKKyAgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiB0ZXN0X3Byb3BlcnRpZXNfOworICAvLyBSdW5uaW5nIGNvdW50IG9mIGRlYXRoIHRlc3RzLgorICBpbnQgZGVhdGhfdGVzdF9jb3VudF87CisgIC8vIFRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0UmVzdWx0LgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RSZXN1bHQpOworfTsgIC8vIGNsYXNzIFRlc3RSZXN1bHQKKworLy8gQSBUZXN0SW5mbyBvYmplY3Qgc3RvcmVzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSB0ZXN0OgorLy8KKy8vICAgVGVzdCBjYXNlIG5hbWUKKy8vICAgVGVzdCBuYW1lCisvLyAgIFdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1bgorLy8gICBBIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBjcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCB3aGVuIGludm9rZWQKKy8vICAgVGVzdCByZXN1bHQKKy8vCisvLyBUaGUgY29uc3RydWN0b3Igb2YgVGVzdEluZm8gcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIHRoZSBVbml0VGVzdAorLy8gc2luZ2xldG9uIHN1Y2ggdGhhdCB0aGUgUlVOX0FMTF9URVNUUygpIG1hY3JvIGtub3dzIHdoaWNoIHRlc3RzIHRvCisvLyBydW4uCitjbGFzcyBHVEVTVF9BUElfIFRlc3RJbmZvIHsKKyBwdWJsaWM6CisgIC8vIERlc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHZpcnR1YWwsIHNvCisgIC8vIGRvbid0IGluaGVyaXQgZnJvbSBUZXN0SW5mby4KKyAgflRlc3RJbmZvKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIG5hbWUuCisgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBuYW1lLgorICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIGNvbW1lbnQuCisgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9jb21tZW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBjb21tZW50LgorICBjb25zdCBjaGFyKiBjb21tZW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdGVzdCBzaG91bGQgcnVuLCB0aGF0IGlzIGlmIHRoZSB0ZXN0IGlzIG5vdCBkaXNhYmxlZAorICAvLyAob3IgaXQgaXMgZGlzYWJsZWQgYnV0IHRoZSBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnIGhhcyBiZWVuIHNwZWNpZmllZCkKKyAgLy8gYW5kIGl0cyBmdWxsIG5hbWUgbWF0Y2hlcyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyLgorICAvLworICAvLyBHb29nbGUgVGVzdCBhbGxvd3MgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSB0ZXN0cyBieSB0aGVpciBmdWxsIG5hbWVzLgorICAvLyBUaGUgZnVsbCBuYW1lIG9mIGEgdGVzdCBCYXIgaW4gdGVzdCBjYXNlIEZvbyBpcyBkZWZpbmVkIGFzCisgIC8vICJGb28uQmFyIi4gIE9ubHkgdGhlIHRlc3RzIHRoYXQgbWF0Y2ggdGhlIGZpbHRlciB3aWxsIHJ1bi4KKyAgLy8KKyAgLy8gQSBmaWx0ZXIgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBnbG9iIChub3QgcmVnZXgpIHBhdHRlcm5zLAorICAvLyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgJy0nIGFuZCBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mCisgIC8vIG5lZ2F0aXZlIHBhdHRlcm5zICh0ZXN0cyB0byBleGNsdWRlKS4gIEEgdGVzdCBpcyBydW4gaWYgaXQKKyAgLy8gbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlIHBhdHRlcm5zIGFuZCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YKKyAgLy8gdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLgorICAvLworICAvLyBGb3IgZXhhbXBsZSwgKkEqOkZvby4qIGlzIGEgZmlsdGVyIHRoYXQgbWF0Y2hlcyBhbnkgc3RyaW5nIHRoYXQKKyAgLy8gY29udGFpbnMgdGhlIGNoYXJhY3RlciAnQScgb3Igc3RhcnRzIHdpdGggIkZvby4iLgorICBib29sIHNob3VsZF9ydW4oKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuCisgIGNvbnN0IFRlc3RSZXN1bHQqIHJlc3VsdCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHREZWF0aFRlc3RGYWN0b3J5OworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIFRlc3RDYXNlOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRlc3RJbmZvSW1wbDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisgIGZyaWVuZCBUZXN0SW5mbyogaW50ZXJuYWw6Ok1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfY29tbWVudCwgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgIGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKKyAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRlc3QgbWF0Y2hlcyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyLgorICBib29sIG1hdGNoZXNfZmlsdGVyKCkgY29uc3Q7CisKKyAgLy8gSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIGRlYXRoIHRlc3RzIGVuY291bnRlcmVkIGluIHRoaXMgdGVzdCBzbworICAvLyBmYXIuCisgIGludCBpbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpOworCisgIC8vIEFjY2Vzc29ycyBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgaW50ZXJuYWw6OlRlc3RJbmZvSW1wbCogaW1wbCgpIHsgcmV0dXJuIGltcGxfOyB9CisgIGNvbnN0IGludGVybmFsOjpUZXN0SW5mb0ltcGwqIGltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXzsgfQorCisgIC8vIENvbnN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuIFRoZSBuZXdseSBjb25zdHJ1Y3RlZCBpbnN0YW5jZSBhc3N1bWVzCisgIC8vIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCisgIFRlc3RJbmZvKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfY29tbWVudCwgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgICAgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKKworICAvLyBBbiBvcGFxdWUgaW1wbGVtZW50YXRpb24gb2JqZWN0LgorICBpbnRlcm5hbDo6VGVzdEluZm9JbXBsKiBpbXBsXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RJbmZvKTsKK307CisKKy8vIEEgdGVzdCBjYXNlLCB3aGljaCBjb25zaXN0cyBvZiBhIHZlY3RvciBvZiBUZXN0SW5mb3MuCisvLworLy8gVGVzdENhc2UgaXMgbm90IGNvcHlhYmxlLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0Q2FzZSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgLy8KKyAgLy8gVGVzdENhc2UgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuICBBbHdheXMgdXNlIHRoaXMKKyAgLy8gY29uc3RydWN0b3IgdG8gY3JlYXRlIGEgVGVzdENhc2Ugb2JqZWN0LgorICAvLworICAvLyBBcmd1bWVudHM6CisgIC8vCisgIC8vICAgbmFtZTogICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICBUZXN0Q2FzZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBjb21tZW50LAorICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Yyk7CisKKyAgLy8gRGVzdHJ1Y3RvciBvZiBUZXN0Q2FzZS4KKyAgdmlydHVhbCB+VGVzdENhc2UoKTsKKworICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBUZXN0Q2FzZS4KKyAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgY29tbWVudC4KKyAgY29uc3QgY2hhciogY29tbWVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbW1lbnRfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgYW55IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2Ugc2hvdWxkIHJ1bi4KKyAgYm9vbCBzaG91bGRfcnVuKCkgY29uc3QgeyByZXR1cm4gc2hvdWxkX3J1bl87IH0KKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXQgdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIGludCB0b3RhbF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIHBhc3NlZC4KKyAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgZmFpbGVkLgorICBib29sIEZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhaWxlZF90ZXN0X2NvdW50KCkgPiAwOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIGNvbnN0IFRlc3RJbmZvKiBHZXRUZXN0SW5mbyhpbnQgaSkgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisKKyAgLy8gR2V0cyB0aGUgKG11dGFibGUpIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhpcyBUZXN0Q2FzZS4KKyAgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiYgdGVzdF9pbmZvX2xpc3QoKSB7IHJldHVybiB0ZXN0X2luZm9fbGlzdF87IH0KKworICAvLyBHZXRzIHRoZSAoaW1tdXRhYmxlKSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoaXMgVGVzdENhc2UuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4mIHRlc3RfaW5mb19saXN0KCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X2luZm9fbGlzdF87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgVGVzdEluZm8qIEdldE11dGFibGVUZXN0SW5mbyhpbnQgaSk7CisKKyAgLy8gU2V0cyB0aGUgc2hvdWxkX3J1biBtZW1iZXIuCisgIHZvaWQgc2V0X3Nob3VsZF9ydW4oYm9vbCBzaG91bGQpIHsgc2hvdWxkX3J1bl8gPSBzaG91bGQ7IH0KKworICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhpcyB0ZXN0IGNhc2UuICBXaWxsIGRlbGV0ZSB0aGUgVGVzdEluZm8gdXBvbgorICAvLyBkZXN0cnVjdGlvbiBvZiB0aGUgVGVzdENhc2Ugb2JqZWN0LgorICB2b2lkIEFkZFRlc3RJbmZvKFRlc3RJbmZvICogdGVzdF9pbmZvKTsKKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICB2b2lkIENsZWFyUmVzdWx0KCk7CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgorICBzdGF0aWMgdm9pZCBDbGVhclRlc3RDYXNlUmVzdWx0KFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgICB0ZXN0X2Nhc2UtPkNsZWFyUmVzdWx0KCk7CisgIH0KKworICAvLyBSdW5zIGV2ZXJ5IHRlc3QgaW4gdGhpcyBUZXN0Q2FzZS4KKyAgdm9pZCBSdW4oKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgcGFzc2VkLgorICBzdGF0aWMgYm9vbCBUZXN0UGFzc2VkKGNvbnN0IFRlc3RJbmZvICogdGVzdF9pbmZvKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgZmFpbGVkLgorICBzdGF0aWMgYm9vbCBUZXN0RmFpbGVkKGNvbnN0IFRlc3RJbmZvICogdGVzdF9pbmZvKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgaXMgZGlzYWJsZWQuCisgIHN0YXRpYyBib29sIFRlc3REaXNhYmxlZChjb25zdCBUZXN0SW5mbyAqIHRlc3RfaW5mbyk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0ZXN0IHNob3VsZCBydW4uCisgIHN0YXRpYyBib29sIFNob3VsZFJ1blRlc3QoY29uc3QgVGVzdEluZm8gKnRlc3RfaW5mbyk7CisKKyAgLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICB2b2lkIFNodWZmbGVUZXN0cyhpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20pOworCisgIC8vIFJlc3RvcmVzIHRoZSB0ZXN0IG9yZGVyIHRvIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KKyAgdm9pZCBVbnNodWZmbGVUZXN0cygpOworCisgIC8vIE5hbWUgb2YgdGhlIHRlc3QgY2FzZS4KKyAgaW50ZXJuYWw6OlN0cmluZyBuYW1lXzsKKyAgLy8gQ29tbWVudCBvbiB0aGUgdGVzdCBjYXNlLgorICBpbnRlcm5hbDo6U3RyaW5nIGNvbW1lbnRfOworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4gIEl0IG93bnMgdGhlCisgIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCisgIHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4gdGVzdF9pbmZvX2xpc3RfOworICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBsaXN0IHRvIGFsbG93IGVhc3kKKyAgLy8gc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3Qgb3JkZXIuICBUaGUgaS10aCBlbGVtZW50IGluIHRoaXMKKyAgLy8gdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGluIHRoZSBzaHVmZmxlZCB0ZXN0IGxpc3QuCisgIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9pbmRpY2VzXzsKKyAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UuCisgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90Y187CisgIC8vIFBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlLgorICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGNfOworICAvLyBUcnVlIGlmZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgorICBib29sIHNob3VsZF9ydW5fOworICAvLyBFbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0Q2FzZXMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdENhc2UpOworfTsKKworLy8gQW4gRW52aXJvbm1lbnQgb2JqZWN0IGlzIGNhcGFibGUgb2Ygc2V0dGluZyB1cCBhbmQgdGVhcmluZyBkb3duIGFuCisvLyBlbnZpcm9ubWVudC4gIFRoZSB1c2VyIHNob3VsZCBzdWJjbGFzcyB0aGlzIHRvIGRlZmluZSBoaXMgb3duCisvLyBlbnZpcm9ubWVudChzKS4KKy8vCisvLyBBbiBFbnZpcm9ubWVudCBvYmplY3QgZG9lcyB0aGUgc2V0LXVwIGFuZCB0ZWFyLWRvd24gaW4gdmlydHVhbAorLy8gbWV0aG9kcyBTZXRVcCgpIGFuZCBUZWFyRG93bigpIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUKKy8vIGRlc3RydWN0b3IsIGFzOgorLy8KKy8vICAgMS4gWW91IGNhbm5vdCBzYWZlbHkgdGhyb3cgZnJvbSBhIGRlc3RydWN0b3IuICBUaGlzIGlzIGEgcHJvYmxlbQorLy8gICAgICBhcyBpbiBzb21lIGNhc2VzIEdvb2dsZSBUZXN0IGlzIHVzZWQgd2hlcmUgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgYW5kCisvLyAgICAgIHdlIG1heSB3YW50IHRvIGltcGxlbWVudCBBU1NFUlRfKiB1c2luZyBleGNlcHRpb25zIHdoZXJlIHRoZXkgYXJlCisvLyAgICAgIGF2YWlsYWJsZS4KKy8vICAgMi4gWW91IGNhbm5vdCB1c2UgQVNTRVJUXyogZGlyZWN0bHkgaW4gYSBjb25zdHJ1Y3RvciBvcgorLy8gICAgICBkZXN0cnVjdG9yLgorY2xhc3MgRW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgbmVlZCB0byBzdWJjbGFzcyBFbnZpcm9ubWVudC4KKyAgdmlydHVhbCB+RW52aXJvbm1lbnQoKSB7fQorCisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQorCisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byB0ZWFyIGRvd24gdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQorIHByaXZhdGU6CisgIC8vIElmIHlvdSBzZWUgYW4gZXJyb3IgYWJvdXQgb3ZlcnJpZGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIG9yCisgIC8vIGFib3V0IGl0IGJlaW5nIHByaXZhdGUsIHlvdSBoYXZlIG1pcy1zcGVsbGVkIFNldFVwKCkgYXMgU2V0dXAoKS4KKyAgc3RydWN0IFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwIHt9OworICB2aXJ0dWFsIFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwKiBTZXR1cCgpIHsgcmV0dXJuIE5VTEw7IH0KK307CisKKy8vIFRoZSBpbnRlcmZhY2UgZm9yIHRyYWNpbmcgZXhlY3V0aW9uIG9mIHRlc3RzLiBUaGUgbWV0aG9kcyBhcmUgb3JnYW5pemVkIGluCisvLyB0aGUgb3JkZXIgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGFyZSBmaXJlZC4KK2NsYXNzIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RFdmVudExpc3RlbmVyKCkge30KKworICAvLyBGaXJlZCBiZWZvcmUgYW55IHRlc3QgYWN0aXZpdHkgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLiAgVGhlcmUgbWF5IGJlIG1vcmUgdGhhbgorICAvLyBvbmUgaXRlcmF0aW9uIGlmIEdURVNUX0ZMQUcocmVwZWF0KSBpcyBzZXQuIGl0ZXJhdGlvbiBpcyB0aGUgaXRlcmF0aW9uCisgIC8vIGluZGV4LCBzdGFydGluZyBmcm9tIDAuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlbnZpcm9ubWVudCBzZXQtdXAgZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZW52aXJvbm1lbnQgc2V0LXVwIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2Ugc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgdGhlIHRlc3Qgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIGEgZmFpbGVkIGFzc2VydGlvbiBvciBhIFNVQ0NFU1MoKS4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciB0aGUgdGVzdCBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pID0gMDsKKworICAvLyBGaXJlZCBhZnRlciB0aGUgdGVzdCBjYXNlIGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgZW52aXJvbm1lbnQgdGVhci1kb3duIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIGVudmlyb25tZW50IHRlYXItZG93biBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZW5kcy4KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGZpbmlzaGVzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIGFsbCB0ZXN0IGFjdGl2aXRpZXMgaGF2ZSBlbmRlZC4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOworfTsKKworLy8gVGhlIGNvbnZlbmllbmNlIGNsYXNzIGZvciB1c2VycyB3aG8gbmVlZCB0byBvdmVycmlkZSBqdXN0IG9uZSBvciB0d28KKy8vIG1ldGhvZHMgYW5kIGFyZSBub3QgY29uY2VybmVkIHRoYXQgYSBwb3NzaWJsZSBjaGFuZ2UgdG8gYSBzaWduYXR1cmUgb2YKKy8vIHRoZSBtZXRob2RzIHRoZXkgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2F1Z2h0IGR1cmluZyB0aGUgYnVpbGQuICBGb3IKKy8vIGNvbW1lbnRzIGFib3V0IGVhY2ggbWV0aG9kIHBsZWFzZSBzZWUgdGhlIGRlZmluaXRpb24gb2YgVGVzdEV2ZW50TGlzdGVuZXIKKy8vIGFib3ZlLgorY2xhc3MgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykge30KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIC8qdGVzdF9jYXNlKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIC8qdGVzdF9wYXJ0X3Jlc3VsdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiAvKnRlc3RfaW5mbyovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykge30KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorfTsKKworLy8gVGVzdEV2ZW50TGlzdGVuZXJzIGxldHMgdXNlcnMgYWRkIGxpc3RlbmVycyB0byB0cmFjayBldmVudHMgaW4gR29vZ2xlIFRlc3QuCitjbGFzcyBHVEVTVF9BUElfIFRlc3RFdmVudExpc3RlbmVycyB7CisgcHVibGljOgorICBUZXN0RXZlbnRMaXN0ZW5lcnMoKTsKKyAgflRlc3RFdmVudExpc3RlbmVycygpOworCisgIC8vIEFwcGVuZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gR29vZ2xlIFRlc3QgYXNzdW1lcworICAvLyB0aGUgb3duZXJzaGlwIG9mIHRoZSBsaXN0ZW5lciAoaS5lLiBpdCB3aWxsIGRlbGV0ZSB0aGUgbGlzdGVuZXIgd2hlbgorICAvLyB0aGUgdGVzdCBwcm9ncmFtIGZpbmlzaGVzKS4KKyAgdm9pZCBBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgSXQgdGhlbgorICAvLyBiZWNvbWVzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBkZWxldGUgdGhlIGxpc3RlbmVyLiBSZXR1cm5zCisgIC8vIE5VTEwgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIFJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgY29uc29sZQorICAvLyBvdXRwdXQuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0ZW5lcnMgbGlzdCB0byBzaHV0IGRvd24gZGVmYXVsdAorICAvLyBjb25zb2xlIG91dHB1dC4gIE5vdGUgdGhhdCByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0CisgIC8vIHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyIGFuZCBtYWtlcyB0aGlzCisgIC8vIGZ1bmN0aW9uIHJldHVybiBOVUxMIHRoZSBuZXh0IHRpbWUuCisgIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkgY29uc3QgeworICAgIHJldHVybiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXzsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0CisgIC8vIGNvbnRyb2xsZWQgYnkgdGhlIC0tZ3Rlc3Rfb3V0cHV0PXhtbCBmbGFnLiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgLy8gbGlzdGVuZXJzIGxpc3QgYnkgdXNlcnMgd2hvIHdhbnQgdG8gc2h1dCBkb3duIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQKKyAgLy8gY29udHJvbGxlZCBieSB0aGlzIGZsYWcgYW5kIHN1YnN0aXR1dGUgaXQgd2l0aCBjdXN0b20gb25lLiAgTm90ZSB0aGF0CisgIC8vIHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3Qgd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMKKyAgLy8gb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIgYW5kIG1ha2VzIHRoaXMgZnVuY3Rpb24gcmV0dXJuIE5VTEwgdGhlIG5leHQKKyAgLy8gdGltZS4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfeG1sX2dlbmVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmYXVsdF94bWxfZ2VuZXJhdG9yXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRlc3RDYXNlOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6Ok5vRXhlY0RlYXRoVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0SW5mb0ltcGw7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOworCisgIC8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCisgIC8vIHN1YnNjcmliZXJzLgorICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIoKTsKKworICAvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCisgIC8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworICAvLyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgorICAvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworICAvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCisgIHZvaWQgU2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBTZXRzIHRoZSBkZWZhdWx0X3htbF9nZW5lcmF0b3IgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4gIFRoZQorICAvLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworICAvLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisgIC8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisgIC8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KKyAgdm9pZCBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQorICAvLyBsaXN0ZW5lcnMgaW4gdGhlIGxpc3QuCisgIGJvb2wgRXZlbnRGb3J3YXJkaW5nRW5hYmxlZCgpIGNvbnN0OworICB2b2lkIFN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7CisKKyAgLy8gVGhlIGFjdHVhbCBsaXN0IG9mIGxpc3RlbmVycy4KKyAgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKiByZXBlYXRlcl87CisgIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgc3RhbmRhcmQgcmVzdWx0IG91dHB1dC4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfOworICAvLyBMaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBYTUwgb3V0cHV0IGZpbGUuCisgIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOworCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdEV2ZW50TGlzdGVuZXJzLgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RFdmVudExpc3RlbmVycyk7Cit9OworCisvLyBBIFVuaXRUZXN0IGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RDYXNlcy4KKy8vCisvLyBUaGlzIGlzIGEgc2luZ2xldG9uIGNsYXNzLiAgVGhlIG9ubHkgaW5zdGFuY2Ugb2YgVW5pdFRlc3QgaXMKKy8vIGNyZWF0ZWQgd2hlbiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSBpcyBmaXJzdCBjYWxsZWQuICBUaGlzCisvLyBpbnN0YW5jZSBpcyBuZXZlciBkZWxldGVkLgorLy8KKy8vIFVuaXRUZXN0IGlzIG5vdCBjb3B5YWJsZS4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlIGFzIGxvbmcgYXMgdGhlIG1ldGhvZHMgYXJlIGNhbGxlZAorLy8gYWNjb3JkaW5nIHRvIHRoZWlyIHNwZWNpZmljYXRpb24uCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0IHsKKyBwdWJsaWM6CisgIC8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZAorICAvLyBpcyBjYWxsZWQsIGEgVW5pdFRlc3Qgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGFuZCByZXR1cm5lZC4KKyAgLy8gQ29uc2VjdXRpdmUgY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgorICBzdGF0aWMgVW5pdFRlc3QqIEdldEluc3RhbmNlKCk7CisKKyAgLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QgYW5kIHByaW50cyB0aGUgcmVzdWx0LgorICAvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgLy8KKyAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorICBpbnQgUnVuKCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKKworICAvLyBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkKKyAgLy8gd2FzIGV4ZWN1dGVkLiAgVGhlIFVuaXRUZXN0IG9iamVjdCBvd25zIHRoZSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIG9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCisgIC8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKyAgLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLgorICBpbnQgcmFuZG9tX3NlZWQoKSBjb25zdDsKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFJldHVybnMgdGhlIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCisgIC8vCisgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCisgIGludCBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgorICBpbnQgdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorICAvLyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgorICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCisgIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KKyAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KKyAgYm9vbCBQYXNzZWQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZAorICAvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KKyAgYm9vbCBGYWlsZWQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdENhc2UqIEdldFRlc3RDYXNlKGludCBpKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cworICAvLyBpbnNpZGUgR29vZ2xlIFRlc3QuCisgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzKCk7CisKKyBwcml2YXRlOgorICAvLyBSZWdpc3RlcnMgYW5kIHJldHVybnMgYSBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudC4gIFdoZW4gYSB0ZXN0CisgIC8vIHByb2dyYW0gaXMgcnVuLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgc2V0LXVwIGluCisgIC8vIHRoZSBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbQorICAvLyBoYXZlIGZpbmlzaGVkLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgdG9ybi1kb3duIGluCisgIC8vIHRoZSAqcmV2ZXJzZSogb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCisgIC8vCisgIC8vIFRoZSBVbml0VGVzdCBvYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICBFbnZpcm9ubWVudCogQWRkRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7CisKKyAgLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsCisgIC8vIEdvb2dsZSBUZXN0IGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKQorICAvLyBldmVudHVhbGx5IGNhbGwgdGhpcyB0byByZXBvcnQgdGhlaXIgcmVzdWx0cy4gIFRoZSB1c2VyIGNvZGUKKyAgLy8gc2hvdWxkIHVzZSB0aGUgYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4KKyAgdm9pZCBBZGRUZXN0UGFydFJlc3VsdChUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsOjpTdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OlN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpOworCisgIC8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuIElmIHRoZSByZXN1bHQgYWxyZWFkeQorICAvLyBjb250YWlucyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LCB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLgorICB2b2lkIFJlY29yZFByb3BlcnR5Rm9yQ3VycmVudFRlc3QoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisKKyAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIFRlc3RDYXNlKiBHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpOworCisgIC8vIEFjY2Vzc29ycyBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbCgpIHsgcmV0dXJuIGltcGxfOyB9CisgIGNvbnN0IGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXzsgfQorCisgIC8vIFRoZXNlIGNsYXNzZXMgYW5kIGZ1bmNpb25zIGFyZSBmcmllbmRzIGFzIHRoZXkgbmVlZCB0byBhY2Nlc3MgcHJpdmF0ZQorICAvLyBtZW1iZXJzIG9mIFVuaXRUZXN0LgorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpBc3NlcnRIZWxwZXI7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U2NvcGVkVHJhY2U7CisgIGZyaWVuZCBFbnZpcm9ubWVudCogQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpOworICBmcmllbmQgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBmcmllbmQgdm9pZCBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAorICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICBjb25zdCBpbnRlcm5hbDo6U3RyaW5nJiBtZXNzYWdlKTsKKworICAvLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0LgorICBVbml0VGVzdCgpOworCisgIC8vIEQndG9yCisgIHZpcnR1YWwgflVuaXRUZXN0KCk7CisKKyAgLy8gUHVzaGVzIGEgdHJhY2UgZGVmaW5lZCBieSBTQ09QRURfVFJBQ0UoKSBvbiB0byB0aGUgcGVyLXRocmVhZAorICAvLyBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKyAgdm9pZCBQdXNoR1Rlc3RUcmFjZShjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSk7CisKKyAgLy8gUG9wcyBhIHRyYWNlIGZyb20gdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisgIHZvaWQgUG9wR1Rlc3RUcmFjZSgpOworCisgIC8vIFByb3RlY3RzIG11dGFibGUgc3RhdGUgaW4gKmltcGxfLiAgVGhpcyBpcyBtdXRhYmxlIGFzIHNvbWUgY29uc3QKKyAgLy8gbWV0aG9kcyBuZWVkIHRvIGxvY2sgaXQgdG9vLgorICBtdXRhYmxlIGludGVybmFsOjpNdXRleCBtdXRleF87CisKKyAgLy8gT3BhcXVlIGltcGxlbWVudGF0aW9uIG9iamVjdC4gIFRoaXMgZmllbGQgaXMgbmV2ZXIgY2hhbmdlZCBvbmNlCisgIC8vIHRoZSBvYmplY3QgaXMgY29uc3RydWN0ZWQuICBXZSBkb24ndCBtYXJrIGl0IGFzIGNvbnN0IGhlcmUsIGFzCisgIC8vIGRvaW5nIHNvIHdpbGwgY2F1c2UgYSB3YXJuaW5nIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBVbml0VGVzdC4KKyAgLy8gTXV0YWJsZSBzdGF0ZSBpbiAqaW1wbF8gaXMgcHJvdGVjdGVkIGJ5IG11dGV4Xy4KKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbF87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBVbml0VGVzdC4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbml0VGVzdCk7Cit9OworCisvLyBBIGNvbnZlbmllbnQgd3JhcHBlciBmb3IgYWRkaW5nIGFuIGVudmlyb25tZW50IGZvciB0aGUgdGVzdAorLy8gcHJvZ3JhbS4KKy8vCisvLyBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGNhbGxlZCwgcHJvYmFibHkgaW4KKy8vIG1haW4oKS4gIElmIHlvdSB1c2UgZ3Rlc3RfbWFpbiwgeW91IG5lZWQgdG8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkKKy8vIHN0YXJ0cyBmb3IgaXQgdG8gdGFrZSBlZmZlY3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkZWZpbmUgYSBnbG9iYWwKKy8vIHZhcmlhYmxlIGxpa2UgdGhpczoKKy8vCisvLyAgIHRlc3Rpbmc6OkVudmlyb25tZW50KiBjb25zdCBmb29fZW52ID0KKy8vICAgICAgIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOworLy8KKy8vIEhvd2V2ZXIsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB5b3UgdG8gd3JpdGUgeW91ciBvd24gbWFpbigpIGFuZAorLy8gY2FsbCBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKSB0aGVyZSwgYXMgcmVseWluZyBvbiBpbml0aWFsaXphdGlvbgorLy8gb2YgZ2xvYmFsIHZhcmlhYmxlcyBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZCBhbmQgbWF5IGNhdXNlCisvLyBwcm9ibGVtcyB3aGVuIHlvdSByZWdpc3RlciBtdWx0aXBsZSBlbnZpcm9ubWVudHMgZnJvbSBkaWZmZXJlbnQKKy8vIHRyYW5zbGF0aW9uIHVuaXRzIGFuZCB0aGUgZW52aXJvbm1lbnRzIGhhdmUgZGVwZW5kZW5jaWVzIGFtb25nIHRoZW0KKy8vIChyZW1lbWJlciB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgaW4gd2hpY2gKKy8vIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgYXJlIGluaXRpYWxpemVkKS4KK2lubGluZSBFbnZpcm9ubWVudCogQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsKKyAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5BZGRFbnZpcm9ubWVudChlbnYpOworfQorCisvLyBJbml0aWFsaXplcyBHb29nbGUgVGVzdC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcKKy8vIFJVTl9BTExfVEVTVFMoKS4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyBhIGNvbW1hbmQgbGluZSBmb3IgdGhlCisvLyBmbGFncyB0aGF0IEdvb2dsZSBUZXN0IHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBUZXN0IGZsYWcgaXMKKy8vIHNlZW4sIGl0IGlzIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuCisvLworLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIFRlc3QgZmxhZyB2YXJpYWJsZXMgYXJlCisvLyB1cGRhdGVkLgorLy8KKy8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc2Vjb25kIHRpbWUgaGFzIG5vIHVzZXItdmlzaWJsZSBlZmZlY3QuCitHVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCBjaGFyKiogYXJndik7CisKKy8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KKy8vIFVOSUNPREUgbW9kZS4KK0dURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlc2Ugb3ZlcmxvYWRlZCB2ZXJzaW9ucyBoYW5kbGUgOjpzdGQ6OnN0cmluZyBhbmQgOjpzdGQ6OndzdHJpbmcuCitHVEVTVF9BUElfIGlubGluZSBTdHJpbmcgRm9ybWF0Rm9yRmFpbHVyZU1lc3NhZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiAoTWVzc2FnZSgpIDw8ICciJyA8PCBzdHIgPDwgJyInKS5HZXRTdHJpbmcoKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfQVBJXyBpbmxpbmUgU3RyaW5nIEZvcm1hdEZvckZhaWx1cmVNZXNzYWdlKGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKSB7CisgIHJldHVybiAoTWVzc2FnZSgpIDw8ICJMXCIiIDw8IHdzdHIgPDwgJyInKS5HZXRTdHJpbmcoKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKy8vIFRoZXNlIG92ZXJsb2FkZWQgdmVyc2lvbnMgaGFuZGxlIDo6c3RyaW5nIGFuZCA6OndzdHJpbmcuCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK0dURVNUX0FQSV8gaW5saW5lIFN0cmluZyBGb3JtYXRGb3JGYWlsdXJlTWVzc2FnZShjb25zdCA6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiAoTWVzc2FnZSgpIDw8ICciJyA8PCBzdHIgPDwgJyInKS5HZXRTdHJpbmcoKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworR1RFU1RfQVBJXyBpbmxpbmUgU3RyaW5nIEZvcm1hdEZvckZhaWx1cmVNZXNzYWdlKGNvbnN0IDo6d3N0cmluZyYgd3N0cikgeworICByZXR1cm4gKE1lc3NhZ2UoKSA8PCAiTFwiIiA8PCB3c3RyIDw8ICciJykuR2V0U3RyaW5nKCk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBGb3JtYXRzIGEgY29tcGFyaXNvbiBhc3NlcnRpb24gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfTFQsIGFuZCBldGMpCisvLyBvcGVyYW5kIHRvIGJlIHVzZWQgaW4gYSBmYWlsdXJlIG1lc3NhZ2UuICBUaGUgdHlwZSAoYnV0IG5vdCB2YWx1ZSkKKy8vIG9mIHRoZSBvdGhlciBvcGVyYW5kIG1heSBhZmZlY3QgdGhlIGZvcm1hdC4gIFRoaXMgYWxsb3dzIHVzIHRvCisvLyBwcmludCBhIGNoYXIqIGFzIGEgcmF3IHBvaW50ZXIgd2hlbiBpdCBpcyBjb21wYXJlZCBhZ2FpbnN0IGFub3RoZXIKKy8vIGNoYXIqLCBhbmQgcHJpbnQgaXQgYXMgYSBDIHN0cmluZyB3aGVuIGl0IGlzIGNvbXBhcmVkIGFnYWluc3QgYW4KKy8vIHN0ZDo6c3RyaW5nIG9iamVjdCwgZm9yIGV4YW1wbGUuCisvLworLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgdHlwZSBvZiB0aGUgb3RoZXIgb3BlcmFuZC4KKy8vIFNvbWUgc3BlY2lhbGl6ZWQgdmVyc2lvbnMgYXJlIHVzZWQgdG8gaGFuZGxlIGZvcm1hdHRpbmcgd2lkZSBvcgorLy8gbmFycm93IEMgc3RyaW5ncy4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorU3RyaW5nIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShjb25zdCBUMSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiAvKiBvdGhlcl9vcGVyYW5kICovKSB7CisgIHJldHVybiBGb3JtYXRGb3JGYWlsdXJlTWVzc2FnZSh2YWx1ZSk7Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9FUS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIGFjdHVhbCkgeworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzODkpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoLgorI2VuZGlmCisKKyAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbmRpZgorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gV2l0aCB0aGlzIG92ZXJsb2FkZWQgdmVyc2lvbiwgd2UgYWxsb3cgYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQKKy8vIGluIHtBU1NFUlR8RVhQRUNUfV9FUSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjIDQsIGFzIGFub255bW91cyBlbnVtcworLy8gY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byBCaWdnZXN0SW50LgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKTsKKworLy8gVGhlIGhlbHBlciBjbGFzcyBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50CisvLyBsaHNfaXNfbnVsbF9saXRlcmFsIGlzIHRydWUgaWZmIHRoZSBmaXJzdCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKQorLy8gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbC4gIFRoZSBmb2xsb3dpbmcgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcworLy8gZm9yIGxoc19pc19udWxsX2xpdGVyYWwgYmVpbmcgZmFsc2UuCit0ZW1wbGF0ZSA8Ym9vbCBsaHNfaXNfbnVsbF9saXRlcmFsPgorY2xhc3MgRXFIZWxwZXIgeworIHB1YmxpYzoKKyAgLy8gVGhpcyB0ZW1wbGF0aXplZCB2ZXJzaW9uIGlzIGZvciB0aGUgZ2VuZXJhbCBjYXNlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIGFjdHVhbCkgeworICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgIH0KKworICAvLyBXaXRoIHRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uLCB3ZSBhbGxvdyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZAorICAvLyBpbiB7QVNTRVJUfEVYUEVDVH1fRVEgd2hlbiBjb21waWxlZCB3aXRoIGdjYyA0LCBhcyBhbm9ueW1vdXMKKyAgLy8gZW51bXMgY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byBCaWdnZXN0SW50LgorICAvLworICAvLyBFdmVuIHRob3VnaCBpdHMgYm9keSBsb29rcyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgdmVyc2lvbiwgd2UKKyAgLy8gY2Fubm90IG1lcmdlIHRoZSB0d28sIGFzIGl0IHdpbGwgbWFrZSBhbm9ueW1vdXMgZW51bXMgdW5oYXBweS4KKyAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGFjdHVhbCkgeworICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgIH0KK307CisKKy8vIFRoaXMgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCB3aGVuIHRoZSBmaXJzdCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKQorLy8gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbC4KK3RlbXBsYXRlIDw+CitjbGFzcyBFcUhlbHBlcjx0cnVlPiB7CisgcHVibGljOgorICAvLyBXZSBkZWZpbmUgdHdvIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgQ29tcGFyZSgpLiAgVGhlIGZpcnN0CisgIC8vIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpIGlzCisgIC8vIE5PVCBhIHBvaW50ZXIsIGUuZy4gQVNTRVJUX0VRKDAsIEFuSW50RnVuY3Rpb24oKSkgb3IKKyAgLy8gRVhQRUNUX0VRKGZhbHNlLCBhX2Jvb2wpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIGFjdHVhbCkgeworICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgIH0KKworICAvLyBUaGlzIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvCisgIC8vIEFTU0VSVF9FUSgpIGlzIGEgcG9pbnRlciwgZS5nLiBBU1NFUlRfRVEoTlVMTCwgYV9wb2ludGVyKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiAvKiBleHBlY3RlZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQyKiBhY3R1YWwpIHsKKyAgICAvLyBXZSBhbHJlYWR5IGtub3cgdGhhdCAnZXhwZWN0ZWQnIGlzIGEgbnVsbCBwb2ludGVyLgorICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VDIqPihOVUxMKSwgYWN0dWFsKTsKKyAgfQorfTsKKworLy8gQSBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHRoZSBoZWxwZXIgZnVuY3Rpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQKKy8vIEFTU0VSVF8/PyBhbmQgRVhQRUNUXz8/LiAgSXQgaXMgaGVyZSBqdXN0IHRvIGF2b2lkIGNvcHktYW5kLXBhc3RlCisvLyBvZiBzaW1pbGFyIGNvZGUuCisvLworLy8gRm9yIGVhY2ggdGVtcGxhdGl6ZWQgaGVscGVyIGZ1bmN0aW9uLCB3ZSBhbHNvIGRlZmluZSBhbiBvdmVybG9hZGVkCisvLyB2ZXJzaW9uIGZvciBCaWdnZXN0SW50IGluIG9yZGVyIHRvIHJlZHVjZSBjb2RlIGJsb2F0IGFuZCBhbGxvdworLy8gYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQgd2l0aCB7QVNTRVJUfEVYUEVDVH1fPz8gd2hlbiBjb21waWxlZAorLy8gd2l0aCBnY2MgNC4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisjZGVmaW5lIEdURVNUX0lNUExfQ01QX0hFTFBFUl8ob3BfbmFtZSwgb3ApXAordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj5cCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdmFsMSwgY29uc3QgVDImIHZhbDIpIHtcCisgIGlmICh2YWwxIG9wIHZhbDIpIHtcCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTtcCisgIH0gZWxzZSB7XAorICAgIE1lc3NhZ2UgbXNnO1wKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXAorICAgICAgICA8PCAiKSwgYWN0dWFsOiAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwxLCB2YWwyKVwKKyAgICAgICAgPDwgIiB2cyAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwyLCB2YWwxKTtcCisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTtcCisgIH1cCit9XAorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKFwKKyAgICBjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKQorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKE5FLCAhPSk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MRQorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pOworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTFQKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwgKTsKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdFLCA+PSk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HVAorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHVCwgPiApOworCisjdW5kZWYgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSRVEuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCk7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJORS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBhY3R1YWwpOworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZQorLy8gZmlyc3QgYXJndW1lbnQgdG8ge0VYUEVDVCxBU1NFUlR9X1BSRURfRk9STUFUMigpLCBub3QgYnkKKy8vIHRoZW1zZWx2ZXMuICBUaGV5IGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrCisvLyAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZiBvbmx5KSwgYW5kIHJldHVybiBhbgorLy8gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KKy8vCisvLyBUaGUge25lZWRsZSxoYXlzdGFja31fZXhwciBhcmd1bWVudHMgYXJlIHRoZSBzdHJpbmdpZmllZAorLy8gZXhwcmVzc2lvbnMgdGhhdCBnZW5lcmF0ZWQgdGhlIHR3byByZWFsIGFyZ3VtZW50cy4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKTsKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBIZWxwZXIgdGVtcGxhdGUgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBmbG9hdGluZy1wb2ludHMuCisvLworLy8gVGVtcGxhdGUgcGFyYW1ldGVyOgorLy8KKy8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckZsb2F0aW5nUG9pbnRFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSBhY3R1YWwpIHsKKyAgY29uc3QgRmxvYXRpbmdQb2ludDxSYXdUeXBlPiBsaHMoZXhwZWN0ZWQpLCByaHMoYWN0dWFsKTsKKworICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIFN0clN0cmVhbSBleHBlY3RlZF9zczsKKyAgZXhwZWN0ZWRfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgICAgICA8PCBleHBlY3RlZDsKKworICBTdHJTdHJlYW0gYWN0dWFsX3NzOworICBhY3R1YWxfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgICAgPDwgYWN0dWFsOworCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBTdHJTdHJlYW1Ub1N0cmluZygmZXhwZWN0ZWRfc3MpLAorICAgICAgICAgICAgICAgICAgIFN0clN0cmVhbVRvU3RyaW5nKCZhY3R1YWxfc3MpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRG91YmxlTmVhclByZWRGb3JtYXQoY29uc3QgY2hhciogZXhwcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFic19lcnJvcl9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNfZXJyb3IpOworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8gQSBjbGFzcyB0aGF0IGVuYWJsZXMgb25lIHRvIHN0cmVhbSBtZXNzYWdlcyB0byBhc3NlcnRpb24gbWFjcm9zCitjbGFzcyBHVEVTVF9BUElfIEFzc2VydEhlbHBlciB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgQXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgaW50IGxpbmUsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKTsKKyAgfkFzc2VydEhlbHBlcigpOworCisgIC8vIE1lc3NhZ2UgYXNzaWdubWVudCBpcyBhIHNlbWFudGljIHRyaWNrIHRvIGVuYWJsZSBhc3NlcnRpb24KKyAgLy8gc3RyZWFtaW5nOyBzZWUgdGhlIEdURVNUX01FU1NBR0VfIG1hY3JvIGJlbG93LgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFdlIHB1dCBvdXIgZGF0YSBpbiBhIHN0cnVjdCBzbyB0aGF0IHRoZSBzaXplIG9mIHRoZSBBc3NlcnRIZWxwZXIgY2xhc3MgY2FuCisgIC8vIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBnY2MgaXMgaW5jYXBhYmxlIG9mCisgIC8vIHJlLXVzaW5nIHN0YWNrIHNwYWNlIGV2ZW4gZm9yIHRlbXBvcmFyeSB2YXJpYWJsZXMsIHNvIGV2ZXJ5IEVYUEVDVF9FUQorICAvLyByZXNlcnZlcyBzdGFjayBzcGFjZSBmb3IgYW5vdGhlciBBc3NlcnRIZWxwZXIuCisgIHN0cnVjdCBBc3NlcnRIZWxwZXJEYXRhIHsKKyAgICBBc3NlcnRIZWxwZXJEYXRhKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzcmNmaWxlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbXNnKQorICAgICAgICA6IHR5cGUodCksIGZpbGUoc3JjZmlsZSksIGxpbmUobGluZV9udW0pLCBtZXNzYWdlKG1zZykgeyB9CisKKyAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSBjb25zdCB0eXBlOworICAgIGNvbnN0IGNoYXIqICAgICAgICBjb25zdCBmaWxlOworICAgIGludCAgICAgICAgICAgICAgICBjb25zdCBsaW5lOworICAgIFN0cmluZyAgICAgICAgICAgICBjb25zdCBtZXNzYWdlOworCisgICBwcml2YXRlOgorICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXNzZXJ0SGVscGVyRGF0YSk7CisgIH07CisKKyAgQXNzZXJ0SGVscGVyRGF0YSogY29uc3QgZGF0YV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBc3NlcnRIZWxwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorLy8gVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBhbGwgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbmhlcml0IGZyb20uCisvLworLy8gVGhpcyBjbGFzcyBhZGRzIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgdGVzdCBwYXJhbWV0ZXIgdmFsdWUgdmlhCisvLyB0aGUgR2V0UGFyYW0oKSBtZXRob2QuCisvLworLy8gVXNlIGl0IHdpdGggb25lIG9mIHRoZSBwYXJhbWV0ZXIgZ2VuZXJhdG9yIGRlZmluaW5nIGZ1bmN0aW9ucywgbGlrZSBSYW5nZSgpLAorLy8gVmFsdWVzKCksIFZhbHVlc0luKCksIEJvb2woKSwgYW5kIENvbWJpbmUoKS4KKy8vCisvLyBjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKKy8vICBwcm90ZWN0ZWQ6CisvLyAgIEZvb1Rlc3QoKSB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vICAgdmlydHVhbCB+Rm9vVGVzdCgpIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vICAgdmlydHVhbCB2b2lkIFRlYXJEb3duIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gfTsKKy8vIFRFU1RfUChGb29UZXN0LCBEb2VzQmFyKSB7CisvLyAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBtZXRob2QgaGVyZS4KKy8vICAgRm9vIGZvbzsKKy8vICAgQVNTRVJUX1RSVUUoZm9vLkRvZXNCYXIoR2V0UGFyYW0oKSkpOworLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoT25lVG9UZW5SYW5nZSwgRm9vVGVzdCwgOjp0ZXN0aW5nOjpSYW5nZSgxLCAxMCkpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRlc3RXaXRoUGFyYW0gOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICB0eXBlZGVmIFQgUGFyYW1UeXBlOworCisgIC8vIFRoZSBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZS4gSXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHRlc3QgZml4dHVyZSdzCisgIC8vIGNvbnN0cnVjdG9yLgorICBjb25zdCBQYXJhbVR5cGUmIEdldFBhcmFtKCkgY29uc3QgeyByZXR1cm4gKnBhcmFtZXRlcl87IH0KKworIHByaXZhdGU6CisgIC8vIFNldHMgcGFyYW1ldGVyIHZhbHVlLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgc3VyZSB0aGUgdmFsdWUKKyAgLy8gcmVtYWlucyBhbGl2ZSBhbmQgdW5jaGFuZ2VkIHRocm91Z2hvdXQgdGhlIGN1cnJlbnQgdGVzdC4KKyAgc3RhdGljIHZvaWQgU2V0UGFyYW0oY29uc3QgUGFyYW1UeXBlKiBwYXJhbWV0ZXIpIHsKKyAgICBwYXJhbWV0ZXJfID0gcGFyYW1ldGVyOworICB9CisKKyAgLy8gU3RhdGljIHZhbHVlIHVzZWQgZm9yIGFjY2Vzc2luZyBwYXJhbWV0ZXIgZHVyaW5nIGEgdGVzdCBsaWZldGltZS4KKyAgc3RhdGljIGNvbnN0IFBhcmFtVHlwZSogcGFyYW1ldGVyXzsKKworICAvLyBUZXN0Q2xhc3MgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIFRlc3RXaXRoUGFyYW08VD4uCisgIHRlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+IGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25zdCBUKiBUZXN0V2l0aFBhcmFtPFQ+OjpwYXJhbWV0ZXJfID0gTlVMTDsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisvLyBNYWNyb3MgZm9yIGluZGljYXRpbmcgc3VjY2Vzcy9mYWlsdXJlIGluIHRlc3QgY29kZS4KKworLy8gQUREX0ZBSUxVUkUgdW5jb25kaXRpb25hbGx5IGFkZHMgYSBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuCisvLyBTVUNDRUVEIGdlbmVyYXRlcyBhIHN1Y2Nlc3MgLSBpdCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUKKy8vIGN1cnJlbnQgdGVzdCBzdWNjZXNzZnVsLCBhcyBhIHRlc3QgaXMgb25seSBzdWNjZXNzZnVsIHdoZW4gaXQgaGFzCisvLyBubyBmYWlsdXJlLgorLy8KKy8vIEVYUEVDVF8qIHZlcmlmaWVzIHRoYXQgYSBjZXJ0YWluIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuICBJZiBub3QsCisvLyBpdCBiZWhhdmVzIGxpa2UgQUREX0ZBSUxVUkUuICBJbiBwYXJ0aWN1bGFyOgorLy8KKy8vICAgRVhQRUNUX1RSVUUgIHZlcmlmaWVzIHRoYXQgYSBCb29sZWFuIGNvbmRpdGlvbiBpcyB0cnVlLgorLy8gICBFWFBFQ1RfRkFMU0UgdmVyaWZpZXMgdGhhdCBhIEJvb2xlYW4gY29uZGl0aW9uIGlzIGZhbHNlLgorLy8KKy8vIEZBSUwgYW5kIEFTU0VSVF8qIGFyZSBzaW1pbGFyIHRvIEFERF9GQUlMVVJFIGFuZCBFWFBFQ1RfKiwgZXhjZXB0CisvLyB0aGF0IHRoZXkgd2lsbCBhbHNvIGFib3J0IHRoZSBjdXJyZW50IGZ1bmN0aW9uIG9uIGZhaWx1cmUuICBQZW9wbGUKKy8vIHVzdWFsbHkgd2FudCB0aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIEZBSUwgYW5kIEFTU0VSVF8qLCBidXQgdGhvc2UKKy8vIHdyaXRpbmcgZGF0YS1kcml2ZW4gdGVzdHMgb2Z0ZW4gZmluZCB0aGVtc2VsdmVzIHVzaW5nIEFERF9GQUlMVVJFCisvLyBhbmQgRVhQRUNUXyogbW9yZS4KKy8vCisvLyBFeGFtcGxlczoKKy8vCisvLyAgIEVYUEVDVF9UUlVFKHNlcnZlci5TdGF0dXNJc09LKCkpOworLy8gICBBU1NFUlRfRkFMU0Uoc2VydmVyLkhhc1BlbmRpbmdSZXF1ZXN0KHBvcnQpKQorLy8gICAgICAgPDwgIlRoZXJlIGFyZSBzdGlsbCBwZW5kaW5nIHJlcXVlc3RzICIgPDwgIm9uIHBvcnQgIiA8PCBwb3J0OworCisvLyBHZW5lcmF0ZXMgYSBub25mYXRhbCBmYWlsdXJlIHdpdGggYSBnZW5lcmljIG1lc3NhZ2UuCisjZGVmaW5lIEFERF9GQUlMVVJFKCkgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpCisKKy8vIEdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KKyNkZWZpbmUgR1RFU1RfRkFJTCgpIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKCJGYWlsZWQiKQorCisvLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgRkFJTCgpLCB3aGljaCBpcyBhCisvLyBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfRkFJTAorI2RlZmluZSBGQUlMKCkgR1RFU1RfRkFJTCgpCisjZW5kaWYKKworLy8gR2VuZXJhdGVzIGEgc3VjY2VzcyB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBHVEVTVF9TVUNDRUVEKCkgR1RFU1RfU1VDQ0VTU18oIlN1Y2NlZWRlZCIpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBTVUNDRUVEKCksIHdoaWNoCisvLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9TVUNDRUVECisjZGVmaW5lIFNVQ0NFRUQoKSBHVEVTVF9TVUNDRUVEKCkKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIHRlc3RpbmcgZXhjZXB0aW9ucy4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbik6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCB0aHJvd3MgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbi4KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X05PX1RIUk9XKHN0YXRlbWVudCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCBkb2Vzbid0IHRocm93IGFueSBleGNlcHRpb24uCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9BTllfVEhST1coc3RhdGVtZW50KToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB0aGUgc3RhdGVtZW50IHRocm93cyBhbiBleGNlcHRpb24uCisKKyNkZWZpbmUgRVhQRUNUX1RIUk9XKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uKSBcCisgIEdURVNUX1RFU1RfVEhST1dfKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX05PX1RIUk9XKHN0YXRlbWVudCkgXAorICBHVEVTVF9URVNUX05PX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfQU5ZX1RIUk9XKHN0YXRlbWVudCkgXAorICBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1RIUk9XKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uKSBcCisgIEdURVNUX1RFU1RfVEhST1dfKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX05PX1RIUk9XKHN0YXRlbWVudCkgXAorICBHVEVTVF9URVNUX05PX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfQU5ZX1RIUk9XKHN0YXRlbWVudCkgXAorICBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gQm9vbGVhbiBhc3NlcnRpb25zLiBDb25kaXRpb24gY2FuIGJlIGVpdGhlciBhIEJvb2xlYW4gZXhwcmVzc2lvbiBvciBhbgorLy8gQXNzZXJ0aW9uUmVzdWx0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIEFzc2VydGlvblJlc3VsdCB3aXRoCisvLyB0aGVzZSBtYWNyb3Mgc2VlIGNvbW1lbnRzIG9uIHRoYXQgY2xhc3MuCisjZGVmaW5lIEVYUEVDVF9UUlVFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgZmFsc2UsIHRydWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX0ZBTFNFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKCEoY29uZGl0aW9uKSwgI2NvbmRpdGlvbiwgdHJ1ZSwgZmFsc2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1RSVUUoY29uZGl0aW9uKSBcCisgIEdURVNUX1RFU1RfQk9PTEVBTl8oY29uZGl0aW9uLCAjY29uZGl0aW9uLCBmYWxzZSwgdHJ1ZSwgXAorICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfRkFMU0UoY29uZGl0aW9uKSBcCisgIEdURVNUX1RFU1RfQk9PTEVBTl8oIShjb25kaXRpb24pLCAjY29uZGl0aW9uLCB0cnVlLCBmYWxzZSwgXAorICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisvLyBJbmNsdWRlcyB0aGUgYXV0by1nZW5lcmF0ZWQgaGVhZGVyIHRoYXQgaW1wbGVtZW50cyBhIGZhbWlseSBvZgorLy8gZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdF9wcmVkX2ltcGwuaD4KKworLy8gTWFjcm9zIGZvciB0ZXN0aW5nIGVxdWFsaXRpZXMgYW5kIGluZXF1YWxpdGllcy4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9FUShleHBlY3RlZCwgYWN0dWFsKTogVGVzdHMgdGhhdCBleHBlY3RlZCA9PSBhY3R1YWwKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X05FKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxICE9IHYyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9MVCh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA8IHYyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9MRSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA8PSB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fR1QodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPiB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fR0UodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPj0gdjIKKy8vCisvLyBXaGVuIHRoZXkgYXJlIG5vdCwgR29vZ2xlIFRlc3QgcHJpbnRzIGJvdGggdGhlIHRlc3RlZCBleHByZXNzaW9ucyBhbmQKKy8vIHRoZWlyIGFjdHVhbCB2YWx1ZXMuICBUaGUgdmFsdWVzIG11c3QgYmUgY29tcGF0aWJsZSBidWlsdC1pbiB0eXBlcywKKy8vIG9yIHlvdSB3aWxsIGdldCBhIGNvbXBpbGVyIGVycm9yLiAgQnkgImNvbXBhdGlibGUiIHdlIG1lYW4gdGhhdCB0aGUKKy8vIHZhbHVlcyBjYW4gYmUgY29tcGFyZWQgYnkgdGhlIHJlc3BlY3RpdmUgb3BlcmF0b3IuCisvLworLy8gTm90ZToKKy8vCisvLyAgIDEuIEl0IGlzIHBvc3NpYmxlIHRvIG1ha2UgYSB1c2VyLWRlZmluZWQgdHlwZSB3b3JrIHdpdGgKKy8vICAge0FTU0VSVHxFWFBFQ1R9Xz8/KCksIGJ1dCB0aGF0IHJlcXVpcmVzIG92ZXJsb2FkaW5nIHRoZQorLy8gICBjb21wYXJpc29uIG9wZXJhdG9ycyBhbmQgaXMgdGh1cyBkaXNjb3VyYWdlZCBieSB0aGUgR29vZ2xlIEMrKworLy8gICBVc2FnZSBHdWlkZS4gIFRoZXJlZm9yZSwgeW91IGFyZSBhZHZpc2VkIHRvIHVzZSB0aGUKKy8vICAge0FTU0VSVHxFWFBFQ1R9X1RSVUUoKSBtYWNybyB0byBhc3NlcnQgdGhhdCB0d28gb2JqZWN0cyBhcmUKKy8vICAgZXF1YWwuCisvLworLy8gICAyLiBUaGUge0FTU0VSVHxFWFBFQ1R9Xz8/KCkgbWFjcm9zIGRvIHBvaW50ZXIgY29tcGFyaXNvbnMgb24KKy8vICAgcG9pbnRlcnMgKGluIHBhcnRpY3VsYXIsIEMgc3RyaW5ncykuICBUaGVyZWZvcmUsIGlmIHlvdSB1c2UgaXQKKy8vICAgd2l0aCB0d28gQyBzdHJpbmdzLCB5b3UgYXJlIHRlc3RpbmcgaG93IHRoZWlyIGxvY2F0aW9ucyBpbiBtZW1vcnkKKy8vICAgYXJlIHJlbGF0ZWQsIG5vdCBob3cgdGhlaXIgY29udGVudCBpcyByZWxhdGVkLiAgVG8gY29tcGFyZSB0d28gQworLy8gICBzdHJpbmdzIGJ5IGNvbnRlbnQsIHVzZSB7QVNTRVJUfEVYUEVDVH1fU1RSKigpLgorLy8KKy8vICAgMy4ge0FTU0VSVHxFWFBFQ1R9X0VRKGV4cGVjdGVkLCBhY3R1YWwpIGlzIHByZWZlcnJlZCB0bworLy8gICB7QVNTRVJUfEVYUEVDVH1fVFJVRShleHBlY3RlZCA9PSBhY3R1YWwpLCBhcyB0aGUgZm9ybWVyIHRlbGxzIHlvdQorLy8gICB3aGF0IHRoZSBhY3R1YWwgdmFsdWUgaXMgd2hlbiBpdCBmYWlscywgYW5kIHNpbWlsYXJseSBmb3IgdGhlCisvLyAgIG90aGVyIGNvbXBhcmlzb25zLgorLy8KKy8vICAgNC4gRG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4gd2hpY2gge0FTU0VSVHxFWFBFQ1R9Xz8/KCkKKy8vICAgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzLCB3aGljaCBpcyB1bmRlZmluZWQuCisvLworLy8gICA1LiBUaGVzZSBtYWNyb3MgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzIGV4YWN0bHkgb25jZS4KKy8vCisvLyBFeGFtcGxlczoKKy8vCisvLyAgIEVYUEVDVF9ORSg1LCBGb28oKSk7CisvLyAgIEVYUEVDVF9FUShOVUxMLCBhX3BvaW50ZXIpOworLy8gICBBU1NFUlRfTFQoaSwgYXJyYXlfc2l6ZSk7CisvLyAgIEFTU0VSVF9HVChyZWNvcmRzLnNpemUoKSwgMCkgPDwgIlRoZXJlIGlzIG5vIHJlY29yZCBsZWZ0LiI7CisKKyNkZWZpbmUgRVhQRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjogXAorICAgICAgICAgICAgICAgICAgICAgIEVxSGVscGVyPEdURVNUX0lTX05VTExfTElURVJBTF8oZXhwZWN0ZWQpPjo6Q29tcGFyZSwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9ORShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTkUsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9MRSh2YWwxLCB2YWwyKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTEUsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9MVCh2YWwxLCB2YWwyKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTFQsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9HRSh2YWwxLCB2YWwyKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR0UsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9HVCh2YWwxLCB2YWwyKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR1QsIHZhbDEsIHZhbDIpCisKKyNkZWZpbmUgQVNTRVJUX0VRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjogXAorICAgICAgICAgICAgICAgICAgICAgIEVxSGVscGVyPEdURVNUX0lTX05VTExfTElURVJBTF8oZXhwZWN0ZWQpPjo6Q29tcGFyZSwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEFTU0VSVF9ORSh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTkUsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEFTU0VSVF9MRSh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTEUsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEFTU0VSVF9MVCh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTFQsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEFTU0VSVF9HRSh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR0UsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEFTU0VSVF9HVCh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR1QsIHZhbDEsIHZhbDIpCisKKy8vIEMgU3RyaW5nIENvbXBhcmlzb25zLiAgQWxsIHRlc3RzIHRyZWF0IE5VTEwgYW5kIGFueSBub24tTlVMTCBzdHJpbmcKKy8vIGFzIGRpZmZlcmVudC4gIFR3byBOVUxMcyBhcmUgZXF1YWwuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSRVEoczEsIHMyKTogICAgIFRlc3RzIHRoYXQgczEgPT0gczIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUk5FKHMxLCBzMik6ICAgICBUZXN0cyB0aGF0IHMxICE9IHMyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEoczEsIHMyKTogVGVzdHMgdGhhdCBzMSA9PSBzMiwgaWdub3JpbmcgY2FzZQorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FKHMxLCBzMik6IFRlc3RzIHRoYXQgczEgIT0gczIsIGlnbm9yaW5nIGNhc2UKKy8vCisvLyBGb3Igd2lkZSBvciBuYXJyb3cgc3RyaW5nIG9iamVjdHMsIHlvdSBjYW4gdXNlIHRoZQorLy8ge0FTU0VSVHxFWFBFQ1R9Xz8/KCkgbWFjcm9zLgorLy8KKy8vIERvbid0IGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkLAorLy8gd2hpY2ggaXMgdW5kZWZpbmVkLgorLy8KKy8vIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgorCisjZGVmaW5lIEVYUEVDVF9TVFJFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9TVFJORShzMSwgczIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJORSwgczEsIHMyKQorI2RlZmluZSBFWFBFQ1RfU1RSQ0FTRUVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9TVFJDQVNFTkUoczEsIHMyKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikKKworI2RlZmluZSBBU1NFUlRfU1RSRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkVRLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBBU1NFUlRfU1RSTkUoczEsIHMyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSTkUsIHMxLCBzMikKKyNkZWZpbmUgQVNTRVJUX1NUUkNBU0VFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRUVRLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBBU1NFUlRfU1RSQ0FTRU5FKHMxLCBzMilcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRU5FLCBzMSwgczIpCisKKy8vIE1hY3JvcyBmb3IgY29tcGFyaW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdHdvIGZsb2F0IHZhbHVlcyBhcmUgYWxtb3N0IGVxdWFsLgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHR3byBkb3VibGUgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORUFSKHYxLCB2MiwgYWJzX2Vycm9yKToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB2MSBhbmQgdjIgYXJlIHdpdGhpbiB0aGUgZ2l2ZW4gZGlzdGFuY2UgdG8gZWFjaCBvdGhlci4KKy8vCisvLyBHb29nbGUgVGVzdCB1c2VzIFVMUC1iYXNlZCBjb21wYXJpc29uIHRvIGF1dG9tYXRpY2FsbHkgcGljayBhIGRlZmF1bHQKKy8vIGVycm9yIGJvdW5kIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBvcGVyYW5kcy4gIFNlZSB0aGUKKy8vIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgaW4gZ3Rlc3QtaW50ZXJuYWwuaCBpZiB5b3UgYXJlCisvLyBpbnRlcmVzdGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorCisjZGVmaW5lIEVYUEVDVF9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZmxvYXQ+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBFWFBFQ1RfRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxkb3VibGU+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBBU1NFUlRfRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbClcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGZsb2F0PiwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisKKyNkZWZpbmUgQVNTRVJUX0RPVUJMRV9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZG91YmxlPiwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisKKyNkZWZpbmUgRVhQRUNUX05FQVIodmFsMSwgdmFsMiwgYWJzX2Vycm9yKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMyg6OnRlc3Rpbmc6OmludGVybmFsOjpEb3VibGVOZWFyUHJlZEZvcm1hdCwgXAorICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsIGFic19lcnJvcikKKworI2RlZmluZSBBU1NFUlRfTkVBUih2YWwxLCB2YWwyLCBhYnNfZXJyb3IpXAorICBBU1NFUlRfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcCisgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgYWJzX2Vycm9yKQorCisvLyBUaGVzZSBwcmVkaWNhdGUgZm9ybWF0IGZ1bmN0aW9ucyB3b3JrIG9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcywgYW5kCisvLyBjYW4gYmUgdXNlZCBpbiB7QVNTRVJUfEVYUEVDVH1fUFJFRF9GT1JNQVQyKigpLCBlLmcuCisvLworLy8gICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OkRvdWJsZUxFLCBGb28oKSwgNS4wKTsKKworLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscworLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBGbG9hdExFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMik7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpOworCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisKKy8vIE1hY3JvcyB0aGF0IHRlc3QgZm9yIEhSRVNVTFQgZmFpbHVyZSBhbmQgc3VjY2VzcywgdGhlc2UgYXJlIG9ubHkgdXNlZnVsCisvLyBvbiBXaW5kb3dzLCBhbmQgcmVseSBvbiBXaW5kb3dzIFNESyBtYWNyb3MgYW5kIEFQSXMgdG8gY29tcGlsZS4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfShleHByKQorLy8KKy8vIFdoZW4gZXhwciB1bmV4cGVjdGVkbHkgZmFpbHMgb3Igc3VjY2VlZHMsIEdvb2dsZSBUZXN0IHByaW50cyB0aGUKKy8vIGV4cGVjdGVkIHJlc3VsdCBhbmQgdGhlIGFjdHVhbCByZXN1bHQgd2l0aCBib3RoIGEgaHVtYW4tcmVhZGFibGUKKy8vIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IsIGlmIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyB0aGUKKy8vIGhleCByZXN1bHQgY29kZS4KKyNkZWZpbmUgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKGV4cHIpIFwKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVFN1Y2Nlc3MsIChleHByKSkKKworI2RlZmluZSBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoZXhwcikgXAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNIUkVTVUxUU3VjY2VzcywgKGV4cHIpKQorCisjZGVmaW5lIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcCisgICAgRVhQRUNUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRGYWlsdXJlLCAoZXhwcikpCisKKyNkZWZpbmUgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKGV4cHIpIFwKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVEZhaWx1cmUsIChleHByKSkKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIE1hY3JvcyB0aGF0IGV4ZWN1dGUgc3RhdGVtZW50IGFuZCBjaGVjayB0aGF0IGl0IGRvZXNuJ3QgZ2VuZXJhdGUgbmV3IGZhdGFsCisvLyBmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQuCisvLworLy8gICAqIHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCk7CisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpOworLy8gICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpIDw8ICJQcm9jZXNzKCkgZmFpbGVkIjsKKy8vCisjZGVmaW5lIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCkgXAorICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50KSBcCisgICAgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorCisvLyBDYXVzZXMgYSB0cmFjZSAoaW5jbHVkaW5nIHRoZSBzb3VyY2UgZmlsZSBwYXRoLCB0aGUgY3VycmVudCBsaW5lCisvLyBudW1iZXIsIGFuZCB0aGUgZ2l2ZW4gbWVzc2FnZSkgdG8gYmUgaW5jbHVkZWQgaW4gZXZlcnkgdGVzdCBmYWlsdXJlCisvLyBtZXNzYWdlIGdlbmVyYXRlZCBieSBjb2RlIGluIHRoZSBjdXJyZW50IHNjb3BlLiAgVGhlIGVmZmVjdCBpcworLy8gdW5kb25lIHdoZW4gdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBjdXJyZW50IHNjb3BlLgorLy8KKy8vIFRoZSBtZXNzYWdlIGFyZ3VtZW50IGNhbiBiZSBhbnl0aGluZyBzdHJlYW1hYmxlIHRvIHN0ZDo6b3N0cmVhbS4KKy8vCisvLyBJbiB0aGUgaW1wbGVtZW50YXRpb24sIHdlIGluY2x1ZGUgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgYXMgcGFydAorLy8gb2YgdGhlIGR1bW15IHZhcmlhYmxlIG5hbWUsIHRodXMgYWxsb3dpbmcgbXVsdGlwbGUgU0NPUEVEX1RSQUNFKClzCisvLyB0byBhcHBlYXIgaW4gdGhlIHNhbWUgYmxvY2sgLSBhcyBsb25nIGFzIHRoZXkgYXJlIG9uIGRpZmZlcmVudAorLy8gbGluZXMuCisjZGVmaW5lIFNDT1BFRF9UUkFDRShtZXNzYWdlKSBcCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNjb3BlZFRyYWNlIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfdHJhY2VfLCBfX0xJTkVfXykoXAorICAgIF9fRklMRV9fLCBfX0xJTkVfXywgOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgKG1lc3NhZ2UpKQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIHRlbXBsYXRlIGlzIGRlY2xhcmVkLCBidXQgaW50ZW50aW9uYWxseSB1bmRlZmluZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPFQsIFQ+IHt9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQ29tcGlsZS10aW1lIGFzc2VydGlvbiBmb3IgdHlwZSBlcXVhbGl0eS4KKy8vIFN0YXRpY0Fzc2VydFR5cGVFcTx0eXBlMSwgdHlwZTI+KCkgY29tcGlsZXMgaWZmIHR5cGUxIGFuZCB0eXBlMiBhcmUKKy8vIHRoZSBzYW1lIHR5cGUuICBUaGUgdmFsdWUgaXQgcmV0dXJucyBpcyBub3QgaW50ZXJlc3RpbmcuCisvLworLy8gSW5zdGVhZCBvZiBtYWtpbmcgU3RhdGljQXNzZXJ0VHlwZUVxIGEgY2xhc3MgdGVtcGxhdGUsIHdlIG1ha2UgaXQgYQorLy8gZnVuY3Rpb24gdGVtcGxhdGUgdGhhdCBpbnZva2VzIGEgaGVscGVyIGNsYXNzIHRlbXBsYXRlLiAgVGhpcworLy8gcHJldmVudHMgYSB1c2VyIGZyb20gbWlzdXNpbmcgU3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4gYnkKKy8vIGRlZmluaW5nIG9iamVjdHMgb2YgdGhhdCB0eXBlLgorLy8KKy8vIENBVkVBVDoKKy8vCisvLyBXaGVuIHVzZWQgaW5zaWRlIGEgbWV0aG9kIG9mIGEgY2xhc3MgdGVtcGxhdGUsCisvLyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPigpIGlzIGVmZmVjdGl2ZSBPTkxZIElGIHRoZSBtZXRob2QgaXMKKy8vIGluc3RhbnRpYXRlZC4gIEZvciBleGFtcGxlLCBnaXZlbjoKKy8vCisvLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBGb28geworLy8gICAgcHVibGljOgorLy8gICAgIHZvaWQgQmFyKCkgeyB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBUPigpOyB9CisvLyAgIH07CisvLworLy8gdGhlIGNvZGU6CisvLworLy8gICB2b2lkIFRlc3QxKCkgeyBGb288Ym9vbD4gZm9vOyB9CisvLworLy8gd2lsbCBOT1QgZ2VuZXJhdGUgYSBjb21waWxlciBlcnJvciwgYXMgRm9vPGJvb2w+OjpCYXIoKSBpcyBuZXZlcgorLy8gYWN0dWFsbHkgaW5zdGFudGlhdGVkLiAgSW5zdGVhZCwgeW91IG5lZWQ6CisvLworLy8gICB2b2lkIFRlc3QyKCkgeyBGb288Ym9vbD4gZm9vOyBmb28uQmFyKCk7IH0KKy8vCisvLyB0byBjYXVzZSBhIGNvbXBpbGVyIGVycm9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2Jvb2wgU3RhdGljQXNzZXJ0VHlwZUVxKCkgeworICBpbnRlcm5hbDo6U3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPFQxLCBUMj4oKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIERlZmluZXMgYSB0ZXN0LgorLy8KKy8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSwgYW5kIHRoZSBzZWNvbmQKKy8vIHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KKy8vCisvLyBUaGUgY29udmVudGlvbiBpcyB0byBlbmQgdGhlIHRlc3QgY2FzZSBuYW1lIHdpdGggIlRlc3QiLiAgRm9yCisvLyBleGFtcGxlLCBhIHRlc3QgY2FzZSBmb3IgdGhlIEZvbyBjbGFzcyBjYW4gYmUgbmFtZWQgRm9vVGVzdC4KKy8vCisvLyBUaGUgdXNlciBzaG91bGQgcHV0IGhpcyB0ZXN0IGNvZGUgYmV0d2VlbiBicmFjZXMgYWZ0ZXIgdXNpbmcgdGhpcworLy8gbWFjcm8uICBFeGFtcGxlOgorLy8KKy8vICAgVEVTVChGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgeworLy8gICAgIEZvbyBmb287CisvLyAgICAgRVhQRUNUX1RSVUUoZm9vLlN0YXR1c0lzT0soKSk7CisvLyAgIH0KKworLy8gTm90ZSB0aGF0IHdlIGNhbGwgR2V0VGVzdFR5cGVJZCgpIGluc3RlYWQgb2YgR2V0VHlwZUlkPAorLy8gOjp0ZXN0aW5nOjpUZXN0PigpIGhlcmUgdG8gZ2V0IHRoZSB0eXBlIElEIG9mIHRlc3Rpbmc6OlRlc3QuICBUaGlzCisvLyBpcyB0byB3b3JrIGFyb3VuZCBhIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4gdXNpbmcgR29vZ2xlIFRlc3QgYXMKKy8vIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMgR2V0VHlwZUlkPAorLy8gOjp0ZXN0aW5nOjpUZXN0PigpIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyCisvLyB0aGUgY2FsbCBpcyBmcm9tIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsgaXRzZWxmIG9yIGZyb20gdXNlciB0ZXN0CisvLyBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZQorLy8gdmFsdWUsIGFzIGl0IGFsd2F5cyBjYWxscyBHZXRUeXBlSWQ8PigpIGZyb20gdGhlIEdvb2dsZSBUZXN0CisvLyBmcmFtZXdvcmsuCisjZGVmaW5lIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCisgIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIFwKKyAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0LCA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRUZXN0VHlwZUlkKCkpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBURVNUKCksIHdoaWNoCisvLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9URVNUCisjZGVmaW5lIFRFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgR1RFU1RfVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKQorI2VuZGlmCisKKy8vIERlZmluZXMgYSB0ZXN0IHRoYXQgdXNlcyBhIHRlc3QgZml4dHVyZS4KKy8vCisvLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MsIHdoaWNoCisvLyBhbHNvIGRvdWJsZXMgYXMgdGhlIHRlc3QgY2FzZSBuYW1lLiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlCisvLyBuYW1lIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgdGVzdCBjYXNlLgorLy8KKy8vIEEgdGVzdCBmaXh0dXJlIGNsYXNzIG11c3QgYmUgZGVjbGFyZWQgZWFybGllci4gIFRoZSB1c2VyIHNob3VsZCBwdXQKKy8vIGhpcyB0ZXN0IGNvZGUgYmV0d2VlbiBicmFjZXMgYWZ0ZXIgdXNpbmcgdGhpcyBtYWNyby4gIEV4YW1wbGU6CisvLworLy8gICBjbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworLy8gICAgcHJvdGVjdGVkOgorLy8gICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgYl8uQWRkRWxlbWVudCgzKTsgfQorLy8KKy8vICAgICBGb28gYV87CisvLyAgICAgRm9vIGJfOworLy8gICB9OworLy8KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIEluaXRpYWxpemVzQ29ycmVjdGx5KSB7CisvLyAgICAgRVhQRUNUX1RSVUUoYV8uU3RhdHVzSXNPSygpKTsKKy8vICAgfQorLy8KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIFJldHVybnNFbGVtZW50Q291bnRDb3JyZWN0bHkpIHsKKy8vICAgICBFWFBFQ1RfRVEoMCwgYV8uc2l6ZSgpKTsKKy8vICAgICBFWFBFQ1RfRVEoMSwgYl8uc2l6ZSgpKTsKKy8vICAgfQorCisjZGVmaW5lIFRFU1RfRih0ZXN0X2ZpeHR1cmUsIHRlc3RfbmFtZSlcCisgIEdURVNUX1RFU1RfKHRlc3RfZml4dHVyZSwgdGVzdF9uYW1lLCB0ZXN0X2ZpeHR1cmUsIFwKKyAgICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VHlwZUlkPHRlc3RfZml4dHVyZT4oKSkKKworLy8gVXNlIHRoaXMgbWFjcm8gaW4gbWFpbigpIHRvIHJ1biBhbGwgdGVzdHMuICBJdCByZXR1cm5zIDAgaWYgYWxsCisvLyB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisvLworLy8gUlVOX0FMTF9URVNUUygpIHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBjb21tYW5kIGxpbmUgaGFzIGJlZW4KKy8vIHBhcnNlZCBieSBJbml0R29vZ2xlVGVzdCgpLgorCisjZGVmaW5lIFJVTl9BTExfVEVTVFMoKVwKKyAgKDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlJ1bigpKQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWUyZjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oCkBAIC0wLDAgKzEsMzY4IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBvbiAxMC8wMi8yMDA4IGJ5IGNvbW1hbmQKKy8vICdnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IDUnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBJbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKworLy8gTWFrZXMgc3VyZSB0aGlzIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgYmVmb3JlIGd0ZXN0LmguCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyNlcnJvciBEbyBub3QgaW5jbHVkZSBndGVzdF9wcmVkX2ltcGwuaCBkaXJlY3RseS4gIEluY2x1ZGUgZ3Rlc3QuaCBpbnN0ZWFkLgorI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCisKKy8vIFRoaXMgaGVhZGVyIGltcGxlbWVudHMgYSBmYW1pbHkgb2YgZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uCisvLyBtYWNyb3M6CisvLworLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkKKy8vICAgQVNTRVJUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKQorLy8gICAuLi4KKy8vCisvLyB3aGVyZSBwcmVkX2Zvcm1hdCBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCB0YWtlcyBuIChpbiB0aGUKKy8vIGNhc2Ugb2YgQVNTRVJUX1BSRURfRk9STUFUbikgdmFsdWVzIGFuZCB0aGVpciBzb3VyY2UgZXhwcmVzc2lvbgorLy8gdGV4dCwgYW5kIHJldHVybnMgYSB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQuICBTZWUgdGhlIGRlZmluaXRpb24KKy8vIG9mIEFTU0VSVF9FUSBpbiBndGVzdC5oIGZvciBhbiBleGFtcGxlLgorLy8KKy8vIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IGZvcm1hdHRpbmcsIHlvdSBjYW4gdXNlIHRoZSBtb3JlCisvLyByZXN0cmljdGl2ZSB2ZXJzaW9uOgorLy8KKy8vICAgQVNTRVJUX1BSRUQxKHByZWQsIHYxKQorLy8gICBBU1NFUlRfUFJFRDIocHJlZCwgdjEsIHYyKQorLy8gICAuLi4KKy8vCisvLyB3aGVyZSBwcmVkIGlzIGFuIG4tYXJ5IGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCByZXR1cm5zIGJvb2wsCisvLyBhbmQgdGhlIHZhbHVlcyB2MSwgdjIsIC4uLiwgbXVzdCBzdXBwb3J0IHRoZSA8PCBvcGVyYXRvciBmb3IKKy8vIHN0cmVhbWluZyB0byBzdGQ6Om9zdHJlYW0uCisvLworLy8gV2UgYWxzbyBkZWZpbmUgdGhlIEVYUEVDVF8qIHZhcmlhdGlvbnMuCisvLworLy8gRm9yIG5vdyB3ZSBvbmx5IHN1cHBvcnQgcHJlZGljYXRlcyB3aG9zZSBhcml0eSBpcyBhdCBtb3N0IDUuCisvLyBQbGVhc2UgZW1haWwgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCisvLyBzdXBwb3J0IGZvciBoaWdoZXIgYXJpdGllcy4KKworLy8gR1RFU1RfQVNTRVJUXyBpcyB0aGUgYmFzaWMgc3RhdGVtZW50IHRvIHdoaWNoIGFsbCBvZiB0aGUgYXNzZXJ0aW9ucworLy8gaW4gdGhpcyBmaWxlIHJlZHVjZS4gIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKworI2RlZmluZSBHVEVTVF9BU1NFUlRfKGV4cHJlc3Npb24sIG9uX2ZhaWx1cmUpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoY29uc3QgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgZ3Rlc3RfYXIgPSAoZXhwcmVzc2lvbikpIFwKKyAgICA7IFwKKyAgZWxzZSBcCisgICAgb25fZmFpbHVyZShndGVzdF9hci5mYWlsdXJlX21lc3NhZ2UoKSkKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDEuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDE+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDFIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEpIHsKKyAgaWYgKHByZWQodjEpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgPDwgZTEgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MTsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQxLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCB2MSksXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQxLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQxSGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxKSwgb25fZmFpbHVyZSkKKworLy8gVW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKSBcCisgIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQxKHByZWQsIHYxKSBcCisgIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKSBcCisgIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQxKHByZWQsIHYxKSBcCisgIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDIuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDI+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDJIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyKSB7CisgIGlmIChwcmVkKHYxLCB2MikpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICA8PCBlMSA8PCAiLCAiCisgICAgICA8PCBlMiA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCisgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjI7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMi4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgdjEsIHYyKSxcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDIuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQySGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyKSwgb25fZmFpbHVyZSkKKworLy8gQmluYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQyKHByZWQsIHYxLCB2MikgXAorICBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKSBcCisgIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2MiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDMuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDM+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDNIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgeworICBpZiAocHJlZCh2MSwgdjIsIHYzKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgIDw8IGUyIDw8ICIsICIKKyAgICAgIDw8IGUzIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCisgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKKyAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgorICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzOworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZShtc2cpOworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDMuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsIHYxLCB2MiwgdjMpLFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMy4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQzSGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzKSwgb25fZmFpbHVyZSkKKworLy8gVGVybmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUMyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MykgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQzKHByZWQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQzKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzKSBcCisgIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRDMocHJlZCwgdjEsIHYyLCB2MykgXAorICBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2MywgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDQuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDMsCisgICAgICAgICAgdHlwZW5hbWUgVDQ+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDRIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQpIHsKKyAgaWYgKHByZWQodjEsIHYyLCB2MywgdjQpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgPDwgZTEgPDwgIiwgIgorICAgICAgPDwgZTIgPDwgIiwgIgorICAgICAgPDwgZTMgPDwgIiwgIgorICAgICAgPDwgZTQgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyCisgICAgICA8PCAiXG4iIDw8IGUzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjMKKyAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NDsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ0LgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgI3Y0LCB2MSwgdjIsIHYzLCB2NCksXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ0LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQ0SGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0KSwgb25fZmFpbHVyZSkKKworLy8gNC1hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDQocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQ0KHByZWQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDQocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQ0KHByZWQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDUuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDMsCisgICAgICAgICAgdHlwZW5hbWUgVDQsCisgICAgICAgICAgdHlwZW5hbWUgVDU+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDVIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDUmIHY1KSB7CisgIGlmIChwcmVkKHYxLCB2MiwgdjMsIHY0LCB2NSkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICA8PCBlMSA8PCAiLCAiCisgICAgICA8PCBlMiA8PCAiLCAiCisgICAgICA8PCBlMyA8PCAiLCAiCisgICAgICA8PCBlNCA8PCAiLCAiCisgICAgICA8PCBlNSA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCisgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjIKKyAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MworICAgICAgPDwgIlxuIiA8PCBlNCA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHY0CisgICAgICA8PCAiXG4iIDw8IGU1IDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjU7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNS4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgI3YzLCAjdjQsICN2NSwgdjEsIHYyLCB2MywgdjQsIHY1KSxcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDUuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQ1SGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY1KSwgb25fZmFpbHVyZSkKKworLy8gNS1hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDUocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRDUocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCisgIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQ1KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQ1KHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmggYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhODBkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBkZWZpbml0aW9ucyB1c2VmdWwgaW4gcHJvZHVjdGlvbiBjb2RlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KKworLy8gV2hlbiB5b3UgbmVlZCB0byB0ZXN0IHRoZSBwcml2YXRlIG9yIHByb3RlY3RlZCBtZW1iZXJzIG9mIGEgY2xhc3MsCisvLyB1c2UgdGhlIEZSSUVORF9URVNUIG1hY3JvIHRvIGRlY2xhcmUgeW91ciB0ZXN0cyBhcyBmcmllbmRzIG9mIHRoZQorLy8gY2xhc3MuICBGb3IgZXhhbXBsZToKKy8vCisvLyBjbGFzcyBNeUNsYXNzIHsKKy8vICBwcml2YXRlOgorLy8gICB2b2lkIE15TWV0aG9kKCk7CisvLyAgIEZSSUVORF9URVNUKE15Q2xhc3NUZXN0LCBNeU1ldGhvZCk7CisvLyB9OworLy8KKy8vIGNsYXNzIE15Q2xhc3NUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworLy8gICAvLyAuLi4KKy8vIH07CisvLworLy8gVEVTVF9GKE15Q2xhc3NUZXN0LCBNeU1ldGhvZCkgeworLy8gICAvLyBDYW4gY2FsbCBNeUNsYXNzOjpNeU1ldGhvZCgpIGhlcmUuCisvLyB9CisKKyNkZWZpbmUgRlJJRU5EX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCitmcmllbmQgY2xhc3MgdGVzdF9jYXNlX25hbWUjI18jI3Rlc3RfbmFtZSMjX1Rlc3QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzMwODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMjc1IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgaW50ZXJuYWwgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nCisvLyBkZWF0aCB0ZXN0cy4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0RFQVRIX1RFU1RfSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCk7CisKKy8vIE5hbWVzIG9mIHRoZSBmbGFncyAobmVlZGVkIGZvciBwYXJzaW5nIEdvb2dsZSBUZXN0IGZsYWdzKS4KK2NvbnN0IGNoYXIga0RlYXRoVGVzdFN0eWxlRmxhZ1tdID0gImRlYXRoX3Rlc3Rfc3R5bGUiOworY29uc3QgY2hhciBrRGVhdGhUZXN0VXNlRm9ya1tdID0gImRlYXRoX3Rlc3RfdXNlX2ZvcmsiOworY29uc3QgY2hhciBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnW10gPSAiaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QiOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gRGVhdGhUZXN0IGlzIGEgY2xhc3MgdGhhdCBoaWRlcyBtdWNoIG9mIHRoZSBjb21wbGV4aXR5IG9mIHRoZQorLy8gR1RFU1RfREVBVEhfVEVTVF8gbWFjcm8uICBJdCBpcyBhYnN0cmFjdDsgaXRzIHN0YXRpYyBDcmVhdGUgbWV0aG9kCisvLyByZXR1cm5zIGEgY29uY3JldGUgY2xhc3MgdGhhdCBkZXBlbmRzIG9uIHRoZSBwcmV2YWlsaW5nIGRlYXRoIHRlc3QKKy8vIHN0eWxlLCBhcyBkZWZpbmVkIGJ5IHRoZSAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgYW5kL29yCisvLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzLgorCisvLyBJbiBkZXNjcmliaW5nIHRoZSByZXN1bHRzIG9mIGRlYXRoIHRlc3RzLCB0aGVzZSB0ZXJtcyBhcmUgdXNlZCB3aXRoCisvLyB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9uczoKKy8vCisvLyBleGl0IHN0YXR1czogIFRoZSBpbnRlZ2VyIGV4aXQgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQKKy8vICAgICAgICAgICAgICAgYnkgd2FpdCgyKQorLy8gZXhpdCBjb2RlOiAgICBUaGUgaW50ZWdlciBjb2RlIHBhc3NlZCB0byBleGl0KDMpLCBfZXhpdCgyKSwgb3IKKy8vICAgICAgICAgICAgICAgcmV0dXJuZWQgZnJvbSBtYWluKCkKK2NsYXNzIEdURVNUX0FQSV8gRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSByZXR1cm5zIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBkZXRlcm1pbmluZyB0aGUKKyAgLy8gYXBwcm9wcmlhdGUgYWN0aW9uIHRvIHRha2UgZm9yIHRoZSBjdXJyZW50IGRlYXRoIHRlc3Q7IGZvciBleGFtcGxlLAorICAvLyBpZiB0aGUgZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgorICAvLyBUaGUgTGFzdE1lc3NhZ2UgbWV0aG9kIHdpbGwgcmV0dXJuIGEgbW9yZSBkZXRhaWxlZCBtZXNzYWdlIGluIHRoYXQKKyAgLy8gY2FzZS4gIE90aGVyd2lzZSwgdGhlIERlYXRoVGVzdCBwb2ludGVyIHBvaW50ZWQgdG8gYnkgdGhlICJ0ZXN0IgorICAvLyBhcmd1bWVudCBpcyBzZXQuICBJZiB0aGUgZGVhdGggdGVzdCBzaG91bGQgYmUgc2tpcHBlZCwgdGhlIHBvaW50ZXIKKyAgLy8gaXMgc2V0IHRvIE5VTEw7IG90aGVyd2lzZSwgaXQgaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIGEgbmV3IGNvbmNyZXRlCisgIC8vIERlYXRoVGVzdCBvYmplY3QgdGhhdCBjb250cm9scyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50IHRlc3QuCisgIHN0YXRpYyBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKKyAgRGVhdGhUZXN0KCk7CisgIHZpcnR1YWwgfkRlYXRoVGVzdCgpIHsgfQorCisgIC8vIEEgaGVscGVyIGNsYXNzIHRoYXQgYWJvcnRzIGEgZGVhdGggdGVzdCB3aGVuIGl0J3MgZGVsZXRlZC4KKyAgY2xhc3MgUmV0dXJuU2VudGluZWwgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IFJldHVyblNlbnRpbmVsKERlYXRoVGVzdCogdGVzdCkgOiB0ZXN0Xyh0ZXN0KSB7IH0KKyAgICB+UmV0dXJuU2VudGluZWwoKSB7IHRlc3RfLT5BYm9ydChURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQpOyB9CisgICBwcml2YXRlOgorICAgIERlYXRoVGVzdCogY29uc3QgdGVzdF87CisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSZXR1cm5TZW50aW5lbCk7CisgIH0gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87CisKKyAgLy8gQW4gZW51bWVyYXRpb24gb2YgcG9zc2libGUgcm9sZXMgdGhhdCBtYXkgYmUgdGFrZW4gd2hlbiBhIGRlYXRoCisgIC8vIHRlc3QgaXMgZW5jb3VudGVyZWQuICBFWEVDVVRFIG1lYW5zIHRoYXQgdGhlIGRlYXRoIHRlc3QgbG9naWMgc2hvdWxkCisgIC8vIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LiAgT1ZFUlNFRSBtZWFucyB0aGF0IHRoZSBwcm9ncmFtIHNob3VsZCBwcmVwYXJlCisgIC8vIHRoZSBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudCBmb3IgYSBjaGlsZCBwcm9jZXNzIHRvIGV4ZWN1dGUgdGhlIGRlYXRoCisgIC8vIHRlc3QsIHRoZW4gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuCisgIGVudW0gVGVzdFJvbGUgeyBPVkVSU0VFX1RFU1QsIEVYRUNVVEVfVEVTVCB9OworCisgIC8vIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB0d28gcmVhc29ucyB0aGF0IGEgdGVzdCBtaWdodCBiZSBhYm9ydGVkLgorICBlbnVtIEFib3J0UmVhc29uIHsgVEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5ULCBURVNUX0RJRF9OT1RfRElFIH07CisKKyAgLy8gQXNzdW1lcyBvbmUgb2YgdGhlIGFib3ZlIHJvbGVzLgorICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKSA9IDA7CisKKyAgLy8gV2FpdHMgZm9yIHRoZSBkZWF0aCB0ZXN0IHRvIGZpbmlzaCBhbmQgcmV0dXJucyBpdHMgc3RhdHVzLgorICB2aXJ0dWFsIGludCBXYWl0KCkgPSAwOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBwYXNzZWQ7IHRoYXQgaXMsIHRoZSB0ZXN0IHByb2Nlc3MKKyAgLy8gZXhpdGVkIGR1cmluZyB0aGUgdGVzdCwgaXRzIGV4aXQgc3RhdHVzIG1hdGNoZXMgYSB1c2VyLXN1cHBsaWVkCisgIC8vIHByZWRpY2F0ZSwgYW5kIGl0cyBzdGRlcnIgb3V0cHV0IG1hdGNoZXMgYSB1c2VyLXN1cHBsaWVkIHJlZ3VsYXIKKyAgLy8gZXhwcmVzc2lvbi4KKyAgLy8gVGhlIHVzZXItc3VwcGxpZWQgcHJlZGljYXRlIG1heSBiZSBhIG1hY3JvIGV4cHJlc3Npb24gcmF0aGVyCisgIC8vIHRoYW4gYSBmdW5jdGlvbiBwb2ludGVyIG9yIGZ1bmN0b3IsIG9yIGVsc2UgV2FpdCBhbmQgUGFzc2VkIGNvdWxkCisgIC8vIGJlIGNvbWJpbmVkLgorICB2aXJ0dWFsIGJvb2wgUGFzc2VkKGJvb2wgZXhpdF9zdGF0dXNfb2spID0gMDsKKworICAvLyBTaWduYWxzIHRoYXQgdGhlIGRlYXRoIHRlc3QgZGlkIG5vdCBkaWUgYXMgZXhwZWN0ZWQuCisgIHZpcnR1YWwgdm9pZCBBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pID0gMDsKKworICAvLyBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgb3V0Y29tZSBtZXNzYWdlIHJlZ2FyZGluZyB0aGUgb3V0Y29tZSBvZgorICAvLyB0aGUgbGFzdCBkZWF0aCB0ZXN0LgorICBzdGF0aWMgY29uc3QgY2hhciogTGFzdE1lc3NhZ2UoKTsKKworICBzdGF0aWMgdm9pZCBzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoY29uc3QgU3RyaW5nJiBtZXNzYWdlKTsKKworIHByaXZhdGU6CisgIC8vIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbiBvZiB0aGUgb3V0Y29tZSBvZiB0aGUgbGFzdCBkZWF0aCB0ZXN0LgorICBzdGF0aWMgU3RyaW5nIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlYXRoVGVzdCk7Cit9OworCisvLyBGYWN0b3J5IGludGVyZmFjZSBmb3IgZGVhdGggdGVzdHMuICBNYXkgYmUgbW9ja2VkIG91dCBmb3IgdGVzdGluZy4KK2NsYXNzIERlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+RGVhdGhUZXN0RmFjdG9yeSgpIHsgfQorICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KSA9IDA7Cit9OworCisvLyBBIGNvbmNyZXRlIERlYXRoVGVzdEZhY3RvcnkgaW1wbGVtZW50YXRpb24gZm9yIG5vcm1hbCB1c2UuCitjbGFzcyBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeSA6IHB1YmxpYyBEZWF0aFRlc3RGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOworfTsKKworLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAorLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCitHVEVTVF9BUElfIGJvb2wgRXhpdGVkVW5zdWNjZXNzZnVsbHkoaW50IGV4aXRfc3RhdHVzKTsKKworLy8gVGhpcyBtYWNybyBpcyBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9ERUFUSCosIEVYUEVDVF9ERUFUSCosCisvLyBBU1NFUlRfRVhJVCosIGFuZCBFWFBFQ1RfRVhJVCouCisjZGVmaW5lIEdURVNUX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OlJFJiBndGVzdF9yZWdleCA9IChyZWdleCk7IFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3QqIGd0ZXN0X2R0OyBcCisgICAgaWYgKCE6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OkNyZWF0ZSgjc3RhdGVtZW50LCAmZ3Rlc3RfcmVnZXgsIFwKKyAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAmZ3Rlc3RfZHQpKSB7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTsgXAorICAgIH0gXAorICAgIGlmIChndGVzdF9kdCAhPSBOVUxMKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdD4gXAorICAgICAgICAgIGd0ZXN0X2R0X3B0cihndGVzdF9kdCk7IFwKKyAgICAgIHN3aXRjaCAoZ3Rlc3RfZHQtPkFzc3VtZVJvbGUoKSkgeyBcCisgICAgICAgIGNhc2UgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpPVkVSU0VFX1RFU1Q6IFwKKyAgICAgICAgICBpZiAoIWd0ZXN0X2R0LT5QYXNzZWQocHJlZGljYXRlKGd0ZXN0X2R0LT5XYWl0KCkpKSkgeyBcCisgICAgICAgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgICB9IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICBjYXNlIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6RVhFQ1VURV9URVNUOiB7IFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlJldHVyblNlbnRpbmVsIFwKKyAgICAgICAgICAgICAgZ3Rlc3Rfc2VudGluZWwoZ3Rlc3RfZHQpOyBcCisgICAgICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgICAgICAgZ3Rlc3RfZHQtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9ESURfTk9UX0RJRSk7IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgIH0gXAorICAgIH0gXAorICB9IGVsc2UgXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpMYXN0TWVzc2FnZSgpKQorLy8gVGhlIHN5bWJvbCAiZmFpbCIgaGVyZSBleHBhbmRzIHRvIHNvbWV0aGluZyBpbnRvIHdoaWNoIGEgbWVzc2FnZQorLy8gY2FuIGJlIHN0cmVhbWVkLgorCisvLyBBIGNsYXNzIHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIGNvbnRlbnRzIG9mIHRoZQorLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnLCBhcyBpdCBleGlzdGVkIHdoZW4KKy8vIFJVTl9BTExfVEVTVFMgd2FzIGNhbGxlZC4KK2NsYXNzIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyB7CisgcHVibGljOgorICBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoY29uc3QgU3RyaW5nJiBhX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYV9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFuX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfd3JpdGVfZmQpCisgICAgICA6IGZpbGVfKGFfZmlsZSksIGxpbmVfKGFfbGluZSksIGluZGV4Xyhhbl9pbmRleCksCisgICAgICAgIHdyaXRlX2ZkXyhhX3dyaXRlX2ZkKSB7fQorCisgIH5JbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7CisgICAgaWYgKHdyaXRlX2ZkXyA+PSAwKQorICAgICAgcG9zaXg6OkNsb3NlKHdyaXRlX2ZkXyk7CisgIH0KKworICBTdHJpbmcgZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9CisgIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KKyAgaW50IGluZGV4KCkgY29uc3QgeyByZXR1cm4gaW5kZXhfOyB9CisgIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQorCisgcHJpdmF0ZToKKyAgU3RyaW5nIGZpbGVfOworICBpbnQgbGluZV87CisgIGludCBpbmRleF87CisgIGludCB3cml0ZV9mZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcpOworfTsKKworLy8gUmV0dXJucyBhIG5ld2x5IGNyZWF0ZWQgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIG9iamVjdCB3aXRoIGZpZWxkcworLy8gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgZmxhZyBpZgorLy8gdGhlIGZsYWcgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgcmV0dXJucyBOVUxMLgorSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpOworCisjZWxzZSAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGhpcyBtYWNybyBpcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgbWFjcm9zIHN1Y2ggYXMKKy8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgYW5kIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgb24gc3lzdGVtcyB3aGVyZQorLy8gZGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRob3NlIG1hY3JvcyBtdXN0IGNvbXBpbGUgb24gc3VjaCBzeXN0ZW1zCisvLyBpZmYgRVhQRUNUX0RFQVRIIGFuZCBBU1NFUlRfREVBVEggY29tcGlsZSB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgb24KKy8vIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGRlYXRoIHRlc3RzLiBUaGlzIGFsbG93cyBvbmUgdG8gd3JpdGUgc3VjaCBhIG1hY3JvCisvLyBvbiBhIHN5c3RlbSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgZGVhdGggdGVzdHMgYW5kIGJlIHN1cmUgdGhhdCBpdCB3aWxsCisvLyBjb21waWxlIG9uIGEgZGVhdGgtdGVzdCBzdXBwb3J0aW5nIHN5c3RlbS4KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gICBzdGF0ZW1lbnQgLSAgQSBzdGF0ZW1lbnQgdGhhdCBhIG1hY3JvIHN1Y2ggYXMgRVhQRUNUX0RFQVRIIHdvdWxkIHRlc3QKKy8vICAgICAgICAgICAgICAgIGZvciBwcm9ncmFtIHRlcm1pbmF0aW9uLiBUaGlzIG1hY3JvIGhhcyB0byBtYWtlIHN1cmUgdGhpcworLy8gICAgICAgICAgICAgICAgc3RhdGVtZW50IGlzIGNvbXBpbGVkIGJ1dCBub3QgZXhlY3V0ZWQsIHRvIGVuc3VyZSB0aGF0CisvLyAgICAgICAgICAgICAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEIGNvbXBpbGVzIHdpdGggYSBjZXJ0YWluCisvLyAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaWZmIEVYUEVDVF9ERUFUSCBjb21waWxlcyB3aXRoIGl0LgorLy8gICByZWdleCAgICAgLSAgQSByZWdleCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdXNlIHRvIHRlc3QKKy8vICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgb2Ygc3RhdGVtZW50LiAgVGhpcyBwYXJhbWV0ZXIgaGFzIHRvIGJlCisvLyAgICAgICAgICAgICAgICBjb21waWxlZCBidXQgbm90IGV2YWx1YXRlZCBieSB0aGlzIG1hY3JvLCB0byBlbnN1cmUgdGhhdAorLy8gICAgICAgICAgICAgICAgdGhpcyBtYWNybyBvbmx5IGFjY2VwdHMgZXhwcmVzc2lvbnMgdGhhdCBhIG1hY3JvIHN1Y2ggYXMKKy8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSCB3b3VsZCBhY2NlcHQuCisvLyAgIHRlcm1pbmF0b3IgLSBNdXN0IGJlIGFuIGVtcHR5IHN0YXRlbWVudCBmb3IgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRAorLy8gICAgICAgICAgICAgICAgYW5kIGEgcmV0dXJuIHN0YXRlbWVudCBmb3IgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRC4KKy8vICAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgd2lsbCBub3QKKy8vICAgICAgICAgICAgICAgIGNvbXBpbGUgaW5zaWRlIGZ1bmN0aW9ucyB3aGVyZSBBU1NFUlRfREVBVEggZG9lc24ndAorLy8gICAgICAgICAgICAgICAgY29tcGlsZS4KKy8vCisvLyAgVGhlIGJyYW5jaCB0aGF0IGhhcyBhbiBhbHdheXMgZmFsc2UgY29uZGl0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKKy8vICBzdGF0ZW1lbnQgYW5kIHJlZ2V4IGFyZSBjb21waWxlZCAoYW5kIHRodXMgc3ludGFjdGljYWxseSBjb3JyZWN0KSBidXQKKy8vICBuZXZlciBleGVjdXRlZC4gVGhlIHVucmVhY2hhYmxlIGNvZGUgbWFjcm8gcHJvdGVjdHMgdGhlIHRlcm1pbmF0b3IKKy8vICBzdGF0ZW1lbnQgZnJvbSBnZW5lcmF0aW5nIGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGluIGNhc2UKKy8vICBzdGF0ZW1lbnQgdW5jb25kaXRpb25hbGx5IHJldHVybnMgb3IgdGhyb3dzLiBUaGUgTWVzc2FnZSBjb25zdHJ1Y3RvciBhdAorLy8gIHRoZSBlbmQgYWxsb3dzIHRoZSBzeW50YXggb2Ygc3RyZWFtaW5nIGFkZGl0aW9uYWwgbWVzc2FnZXMgaW50byB0aGUKKy8vICBtYWNybywgZm9yIGNvbXBpbGF0aW9uYWwgY29tcGF0aWJpbGl0eSB3aXRoIEVYUEVDVF9ERUFUSC9BU1NFUlRfREVBVEguCisjZGVmaW5lIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHRlcm1pbmF0b3IpIFwKKyAgICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIFwKKyAgICAgICAgICA8PCAiRGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS5cbiIgXAorICAgICAgICAgIDw8ICJTdGF0ZW1lbnQgJyIgI3N0YXRlbWVudCAiJyBjYW5ub3QgYmUgdmVyaWZpZWQuIjsgXAorICAgIH0gZWxzZSBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkgeyBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpSRTo6UGFydGlhbE1hdGNoKCIuKiIsIChyZWdleCkpOyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICAgIHRlcm1pbmF0b3I7IFwKKyAgICB9IGVsc2UgXAorICAgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzZkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaApAQCAtMCwwICsxLDIxMCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorLy8KKy8vIEdvb2dsZSBUZXN0IGZpbGVwYXRoIHV0aWxpdGllcworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieQorLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKy8vCisvLyBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGluIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oPi4KKy8vIERvIG5vdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGZpbGUgc2VwYXJhdGVseSEKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8KKworI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oPgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBGaWxlUGF0aCAtIGEgY2xhc3MgZm9yIGZpbGUgYW5kIGRpcmVjdG9yeSBwYXRobmFtZSBtYW5pcHVsYXRpb24gd2hpY2gKKy8vIGhhbmRsZXMgcGxhdGZvcm0tc3BlY2lmaWMgY29udmVudGlvbnMgKGxpa2UgdGhlIHBhdGhuYW1lIHNlcGFyYXRvcikuCisvLyBVc2VkIGZvciBoZWxwZXIgZnVuY3Rpb25zIGZvciBuYW1pbmcgZmlsZXMgaW4gYSBkaXJlY3RvcnkgZm9yIHhtbCBvdXRwdXQuCisvLyBFeGNlcHQgZm9yIFNldCBtZXRob2RzLCBhbGwgbWV0aG9kcyBhcmUgY29uc3Qgb3Igc3RhdGljLCB3aGljaCBwcm92aWRlcyBhbgorLy8gImltbXV0YWJsZSB2YWx1ZSBvYmplY3QiIC0tIHVzZWZ1bCBmb3IgcGVhY2Ugb2YgbWluZC4KKy8vIEEgRmlsZVBhdGggd2l0aCBhIHZhbHVlIGVuZGluZyBpbiBhIHBhdGggc2VwYXJhdG9yICgibGlrZS90aGlzLyIpIHJlcHJlc2VudHMKKy8vIGEgZGlyZWN0b3J5LCBvdGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0byByZXByZXNlbnQgYSBmaWxlLiBJbiBlaXRoZXIgY2FzZSwKKy8vIGl0IG1heSBvciBtYXkgbm90IHJlcHJlc2VudCBhbiBhY3R1YWwgZmlsZSBvciBkaXJlY3RvcnkgaW4gdGhlIGZpbGUgc3lzdGVtLgorLy8gTmFtZXMgYXJlIE5PVCBjaGVja2VkIGZvciBzeW50YXggY29ycmVjdG5lc3MgLS0gbm8gY2hlY2tpbmcgZm9yIGlsbGVnYWwKKy8vIGNoYXJhY3RlcnMsIG1hbGZvcm1lZCBwYXRocywgZXRjLgorCitjbGFzcyBHVEVTVF9BUElfIEZpbGVQYXRoIHsKKyBwdWJsaWM6CisgIEZpbGVQYXRoKCkgOiBwYXRobmFtZV8oIiIpIHsgfQorICBGaWxlUGF0aChjb25zdCBGaWxlUGF0aCYgcmhzKSA6IHBhdGhuYW1lXyhyaHMucGF0aG5hbWVfKSB7IH0KKworICBleHBsaWNpdCBGaWxlUGF0aChjb25zdCBjaGFyKiBwYXRobmFtZSkgOiBwYXRobmFtZV8ocGF0aG5hbWUpIHsKKyAgICBOb3JtYWxpemUoKTsKKyAgfQorCisgIGV4cGxpY2l0IEZpbGVQYXRoKGNvbnN0IFN0cmluZyYgcGF0aG5hbWUpIDogcGF0aG5hbWVfKHBhdGhuYW1lKSB7CisgICAgTm9ybWFsaXplKCk7CisgIH0KKworICBGaWxlUGF0aCYgb3BlcmF0b3I9KGNvbnN0IEZpbGVQYXRoJiByaHMpIHsKKyAgICBTZXQocmhzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIFNldChjb25zdCBGaWxlUGF0aCYgcmhzKSB7CisgICAgcGF0aG5hbWVfID0gcmhzLnBhdGhuYW1lXzsKKyAgfQorCisgIFN0cmluZyBUb1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXzsgfQorICBjb25zdCBjaGFyKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLgorICBzdGF0aWMgRmlsZVBhdGggR2V0Q3VycmVudERpcigpOworCisgIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCBiYXNlX25hbWUgPSAidGVzdCIsIG51bWJlciA9IDAsCisgIC8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgorICAvLyB0aGFuIHplcm8gKGUuZy4sIDEyKSwgcmV0dXJucyAiZGlyL3Rlc3RfMTIueG1sIi4KKyAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KKyAgc3RhdGljIEZpbGVQYXRoIE1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pOworCisgIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCByZWxhdGl2ZV9wYXRoID0gInRlc3QueG1sIiwKKyAgLy8gcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4KKyAgLy8gT24gV2luZG93cywgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KKyAgc3RhdGljIEZpbGVQYXRoIENvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgcmVsYXRpdmVfcGF0aCk7CisKKyAgLy8gUmV0dXJucyBhIHBhdGhuYW1lIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoZSBwYXRobmFtZQorICAvLyB3aWxsIGJlIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uIG9yCisgIC8vIGRpcmVjdG9yeS9iYXNlX25hbWVfPG51bWJlcj4uZXh0ZW5zaW9uIGlmIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uCisgIC8vIGFscmVhZHkgZXhpc3RzLiBUaGUgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdW50aWwgYSBwYXRobmFtZSBpcyBmb3VuZAorICAvLyB0aGF0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgIC8vIEV4YW1wbGVzOiAnZGlyL2Zvb190ZXN0LnhtbCcgb3IgJ2Rpci9mb29fdGVzdF8xLnhtbCcuCisgIC8vIFRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGFyZSBjYWxsaW5nIHRoaXMKKyAgLy8gZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZSAtLSB0aGV5IGNvdWxkIGJvdGggcGljayB0aGUgc2FtZSBmaWxlbmFtZS4KKyAgc3RhdGljIEZpbGVQYXRoIEdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBwYXRoIGlzIE5VTEwgb3IgIiIuCisgIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGNfc3RyKCkgPT0gTlVMTCB8fCAqY19zdHIoKSA9PSAnXDAnOyB9CisKKyAgLy8gSWYgaW5wdXQgbmFtZSBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCByZW1vdmVzIGl0IGFuZCByZXR1cm5zCisgIC8vIHRoZSBuYW1lLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBuYW1lIHN0cmluZyB1bm1vZGlmaWVkLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLgorICBGaWxlUGF0aCBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhcnQgcmVtb3ZlZC4KKyAgLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKSByZXR1cm5zCisgIC8vIEZpbGVQYXRoKCJmaWxlIikuIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBwYXJ0ICgianVzdF9hX2ZpbGUiKSwgaXQgcmV0dXJucworICAvLyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4gSWYgdGhlcmUgaXMgbm8gZmlsZSBwYXJ0ICgianVzdF9hX2Rpci8iKSBpdAorICAvLyByZXR1cm5zIGFuIGVtcHR5IEZpbGVQYXRoICgiIikuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCisgIEZpbGVQYXRoIFJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdDsKKworICAvLyBSZW1vdmVGaWxlTmFtZSByZXR1cm5zIHRoZSBkaXJlY3RvcnkgcGF0aCB3aXRoIHRoZSBmaWxlbmFtZSByZW1vdmVkLgorICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuCisgIC8vIElmIHRoZSBGaWxlUGF0aCBpcyAiYV9maWxlIiBvciAiL2FfZmlsZSIsIFJlbW92ZUZpbGVOYW1lIHJldHVybnMKKyAgLy8gRmlsZVBhdGgoIi4vIikgb3IsIG9uIFdpbmRvd3MsIEZpbGVQYXRoKCIuXFwiKS4gSWYgdGhlIGZpbGVwYXRoIGRvZXMKKyAgLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCisgIEZpbGVQYXRoIFJlbW92ZUZpbGVOYW1lKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIHJlbW92ZWQuCisgIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJkaXIvZmlsZS5leGUiKS5SZW1vdmVFeHRlbnNpb24oIkVYRSIpIHJldHVybnMKKyAgLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90CisgIC8vIGZvdW5kLCByZXR1cm5zIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgRmlsZVBhdGguCisgIEZpbGVQYXRoIFJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0OworCisgIC8vIENyZWF0ZXMgZGlyZWN0b3JpZXMgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgaWYKKyAgLy8gdGhlIGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3Q7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZQorICAvLyBkaXJlY3RvcmllcyBmb3IgYW55IHJlYXNvbi4gV2lsbCBhbHNvIHJldHVybiBmYWxzZSBpZiB0aGUgRmlsZVBhdGggZG9lcworICAvLyBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5ICh0aGF0IGlzLCBpdCBkb2Vzbid0IGVuZCB3aXRoIGEgcGF0aCBzZXBhcmF0b3IpLgorICBib29sIENyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSBjb25zdDsKKworICAvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvcgorICAvLyBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlCisgIC8vIGRpcmVjdG9yeSBmb3IgYW55IHJlYXNvbiwgaW5jbHVkaW5nIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGRvZXMgbm90CisgIC8vIGV4aXN0LiBOb3QgbmFtZWQgIkNyZWF0ZURpcmVjdG9yeSIgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBvbiBXaW5kb3dzLgorICBib29sIENyZWF0ZUZvbGRlcigpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBkZXNjcmliZXMgc29tZXRoaW5nIGluIHRoZSBmaWxlLXN5c3RlbSwKKyAgLy8gZWl0aGVyIGEgZmlsZSwgZGlyZWN0b3J5LCBvciB3aGF0ZXZlciwgYW5kIHRoYXQgc29tZXRoaW5nIGV4aXN0cy4KKyAgYm9vbCBGaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQorICAvLyB0aGF0IGV4aXN0cy4KKyAgYm9vbCBEaXJlY3RvcnlFeGlzdHMoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZW5kcyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IsIHdoaWNoIGluZGljYXRlcyB0aGF0CisgIC8vIGl0IGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGRpcmVjdG9yeS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisgIC8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLgorICBib29sIElzRGlyZWN0b3J5KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIHJvb3QgZGlyZWN0b3J5LiAoV2luZG93cyBoYXMgb25lCisgIC8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikKKyAgYm9vbCBJc1Jvb3REaXJlY3RvcnkoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGFuIGFic29sdXRlIHBhdGguCisgIGJvb2wgSXNBYnNvbHV0ZVBhdGgoKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFJlcGxhY2VzIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMgd2l0aCBhIHNpbmdsZSBzZXBhcmF0b3IuCisgIC8vIEZvciBleGFtcGxlLCAiYmFyLy8vZm9vIiBiZWNvbWVzICJiYXIvZm9vIi4gRG9lcyBub3QgZWxpbWluYXRlIG90aGVyCisgIC8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLgorICAvLworICAvLyBBIHBhdGhuYW1lIHdpdGggbXVsdGlwbGUgY29uc2VjdXRpdmUgc2VwYXJhdG9ycyBtYXkgb2NjdXIgZWl0aGVyIHRocm91Z2gKKyAgLy8gdXNlciBlcnJvciBvciBhcyBhIHJlc3VsdCBvZiBzb21lIHNjcmlwdHMgb3IgQVBJcyB0aGF0IGdlbmVyYXRlIGEgcGF0aG5hbWUKKyAgLy8gd2l0aCBhIHRyYWlsaW5nIHNlcGFyYXRvci4gT24gb3RoZXIgcGxhdGZvcm1zIHRoZSBzYW1lIEFQSSBvciBzY3JpcHQKKyAgLy8gbWF5IE5PVCBnZW5lcmF0ZSBhIHBhdGhuYW1lIHdpdGggYSB0cmFpbGluZyAiLyIuIFRoZW4gZWxzZXdoZXJlIHRoYXQKKyAgLy8gcGF0aG5hbWUgbWF5IGhhdmUgYW5vdGhlciAiLyIgYW5kIHBhdGhuYW1lIGNvbXBvbmVudHMgYWRkZWQgdG8gaXQsCisgIC8vIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHRoZSBzZXBhcmF0b3IgYWxyZWFkeSBiZWluZyB0aGVyZS4KKyAgLy8gVGhlIHNjcmlwdCBsYW5ndWFnZSBhbmQgb3BlcmF0aW5nIHN5c3RlbSBtYXkgYWxsb3cgcGF0aHMgbGlrZSAiZm9vLy9iYXIiCisgIC8vIGJ1dCBzb21lIG9mIHRoZSBmdW5jdGlvbnMgaW4gRmlsZVBhdGggd2lsbCBub3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LiBJbgorICAvLyBwYXJ0aWN1bGFyLCBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBvbmx5IHJlbW92ZXMgb25lIHNlcGFyYXRvciwgYW5kCisgIC8vIGl0IGlzIGNhbGxlZCBpbiBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgYXNzdW1pbmcgdGhhdCBpdCB3aWxsIGNoYW5nZQorICAvLyBhIHBhdGhuYW1lIGZyb20gZGlyZWN0b3J5IHN5bnRheCAodHJhaWxpbmcgc2VwYXJhdG9yKSB0byBmaWxlbmFtZSBzeW50YXguCisgIC8vCisgIC8vIE9uIFdpbmRvd3MgdGhpcyBtZXRob2QgYWxzbyByZXBsYWNlcyB0aGUgYWx0ZXJuYXRlIHBhdGggc2VwYXJhdG9yICcvJyB3aXRoCisgIC8vIHRoZSBwcmltYXJ5IHBhdGggc2VwYXJhdG9yICdcXCcsIHNvIHRoYXQgZm9yIGV4YW1wbGUgImJhclxcL1xcZm9vIiBiZWNvbWVzCisgIC8vICJiYXJcXGZvbyIuCisKKyAgdm9pZCBOb3JtYWxpemUoKTsKKworICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB2YWxpZCBwYXRoIHNlcGFyYXRvciBpbgorICAvLyB0aGUgRmlsZVBhdGguIE9uIFdpbmRvd3MsIGZvciBleGFtcGxlLCBib3RoICcvJyBhbmQgJ1wnIGFyZSB2YWxpZCBwYXRoCisgIC8vIHNlcGFyYXRvcnMuIFJldHVybnMgTlVMTCBpZiBubyBwYXRoIHNlcGFyYXRvciB3YXMgZm91bmQuCisgIGNvbnN0IGNoYXIqIEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpIGNvbnN0OworCisgIFN0cmluZyBwYXRobmFtZV87Cit9OyAgLy8gY2xhc3MgRmlsZVBhdGgKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC1pbmwuaCBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC1pbmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTViMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLWlubC5oCkBAIC0wLDAgKzEsMTA3NCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyB1c2VkIGJ5IHRoZSBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcHVyZWx5IEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uICBQbGVhc2UKKy8vIERPIE5PVCAjSU5DTFVERSBJVCBJTiBBIFVTRVIgUFJPR1JBTS4KKworI2lmbmRlZiBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCisjZGVmaW5lIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KKworLy8gR1RFU1RfSU1QTEVNRU5UQVRJT05fIGlzIGRlZmluZWQgdG8gMSBpZmYgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdCBpcworLy8gcGFydCBvZiBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uOyBvdGhlcndpc2UgaXQncyB1bmRlZmluZWQuCisjaWYgIUdURVNUX0lNUExFTUVOVEFUSU9OXworLy8gQSB1c2VyIGlzIHRyeWluZyB0byBpbmNsdWRlIHRoaXMgZnJvbSBoaXMgY29kZSAtIGp1c3Qgc2F5IG5vLgorI2Vycm9yICJndGVzdC1pbnRlcm5hbC1pbmwuaCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uIgorI2Vycm9yICJJdCBtdXN0IG5vdCBiZSBpbmNsdWRlZCBleGNlcHQgYnkgR29vZ2xlIFRlc3QgaXRzZWxmLiIKKyNlbmRpZiAgLy8gR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpZm5kZWYgX1dJTjMyX1dDRQorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYgIC8vICFfV0lOMzJfV0NFCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBGb3Igc3RydG9sbC9fc3RydG91bDY0L21hbGxvYy9mcmVlLgorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIG1lbW1vdmUuCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaD4KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyNpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBGb3IgRFdPUkQuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC1zcGkuaD4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBEZWNsYXJlcyB0aGUgZmxhZ3MuCisvLworLy8gV2UgZG9uJ3Qgd2FudCB0aGUgdXNlcnMgdG8gbW9kaWZ5IHRoaXMgZmxhZyBpbiB0aGUgY29kZSwgYnV0IHdhbnQKKy8vIEdvb2dsZSBUZXN0J3Mgb3duIHVuaXQgdGVzdHMgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaXQuIFRoZXJlZm9yZSB3ZQorLy8gZGVjbGFyZSBpdCBoZXJlIGFzIG9wcG9zZWQgdG8gaW4gZ3Rlc3QuaC4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oZGVhdGhfdGVzdF91c2VfZm9yayk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSB2YWx1ZSBvZiBHZXRUZXN0VHlwZUlkKCkgYXMgc2VlbiBmcm9tIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QKKy8vIGxpYnJhcnkuICBUaGlzIGlzIHNvbGVseSBmb3IgdGVzdGluZyBHZXRUZXN0VHlwZUlkKCkuCitHVEVTVF9BUElfIGV4dGVybiBjb25zdCBUeXBlSWQga1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3Q7CisKKy8vIE5hbWVzIG9mIHRoZSBmbGFncyAobmVlZGVkIGZvciBwYXJzaW5nIEdvb2dsZSBUZXN0IGZsYWdzKS4KK2NvbnN0IGNoYXIga0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1tdID0gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIjsKK2NvbnN0IGNoYXIga0JyZWFrT25GYWlsdXJlRmxhZ1tdID0gImJyZWFrX29uX2ZhaWx1cmUiOworY29uc3QgY2hhciBrQ2F0Y2hFeGNlcHRpb25zRmxhZ1tdID0gImNhdGNoX2V4Y2VwdGlvbnMiOworY29uc3QgY2hhciBrQ29sb3JGbGFnW10gPSAiY29sb3IiOworY29uc3QgY2hhciBrRmlsdGVyRmxhZ1tdID0gImZpbHRlciI7Citjb25zdCBjaGFyIGtMaXN0VGVzdHNGbGFnW10gPSAibGlzdF90ZXN0cyI7Citjb25zdCBjaGFyIGtPdXRwdXRGbGFnW10gPSAib3V0cHV0IjsKK2NvbnN0IGNoYXIga1ByaW50VGltZUZsYWdbXSA9ICJwcmludF90aW1lIjsKK2NvbnN0IGNoYXIga1JhbmRvbVNlZWRGbGFnW10gPSAicmFuZG9tX3NlZWQiOworY29uc3QgY2hhciBrUmVwZWF0RmxhZ1tdID0gInJlcGVhdCI7Citjb25zdCBjaGFyIGtTaHVmZmxlRmxhZ1tdID0gInNodWZmbGUiOworY29uc3QgY2hhciBrU3RhY2tUcmFjZURlcHRoRmxhZ1tdID0gInN0YWNrX3RyYWNlX2RlcHRoIjsKK2NvbnN0IGNoYXIga1Rocm93T25GYWlsdXJlRmxhZ1tdID0gInRocm93X29uX2ZhaWx1cmUiOworCisvLyBBIHZhbGlkIHJhbmRvbSBzZWVkIG11c3QgYmUgaW4gWzEsIGtNYXhSYW5kb21TZWVkXS4KK2NvbnN0IGludCBrTWF4UmFuZG9tU2VlZCA9IDk5OTk5OworCisvLyBnX2hlbHBfZmxhZyBpcyB0cnVlIGlmZiB0aGUgLS1oZWxwIGZsYWcgb3IgYW4gZXF1aXZhbGVudCBmb3JtIGlzCisvLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KK0dURVNUX0FQSV8gZXh0ZXJuIGJvb2wgZ19oZWxwX2ZsYWc7CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCitHVEVTVF9BUElfIFRpbWVJbk1pbGxpcyBHZXRUaW1lSW5NaWxsaXMoKTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiBHb29nbGUgVGVzdCBzaG91bGQgdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgorR1RFU1RfQVBJXyBib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSk7CisKKy8vIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFzIHNlY29uZHMuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpOworCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitHVEVTVF9BUElfIGJvb2wgUGFyc2VJbnQzMkZsYWcoCisgICAgY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpOworCisvLyBSZXR1cm5zIGEgcmFuZG9tIHNlZWQgaW4gcmFuZ2UgWzEsIGtNYXhSYW5kb21TZWVkXSBiYXNlZCBvbiB0aGUKKy8vIGdpdmVuIC0tZ3Rlc3RfcmFuZG9tX3NlZWQgZmxhZyB2YWx1ZS4KK2lubGluZSBpbnQgR2V0UmFuZG9tU2VlZEZyb21GbGFnKEludDMyIHJhbmRvbV9zZWVkX2ZsYWcpIHsKKyAgY29uc3QgdW5zaWduZWQgaW50IHJhd19zZWVkID0gKHJhbmRvbV9zZWVkX2ZsYWcgPT0gMCkgPworICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihHZXRUaW1lSW5NaWxsaXMoKSkgOgorICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihyYW5kb21fc2VlZF9mbGFnKTsKKworICAvLyBOb3JtYWxpemVzIHRoZSBhY3R1YWwgc2VlZCB0byByYW5nZSBbMSwga01heFJhbmRvbVNlZWRdIHN1Y2ggdGhhdAorICAvLyBpdCdzIGVhc3kgdG8gdHlwZS4KKyAgY29uc3QgaW50IG5vcm1hbGl6ZWRfc2VlZCA9CisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KChyYXdfc2VlZCAtIDFVKSAlCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oa01heFJhbmRvbVNlZWQpKSArIDE7CisgIHJldHVybiBub3JtYWxpemVkX3NlZWQ7Cit9CisKKy8vIFJldHVybnMgdGhlIGZpcnN0IHZhbGlkIHJhbmRvbSBzZWVkIGFmdGVyICdzZWVkJy4gIFRoZSBiZWhhdmlvciBpcworLy8gdW5kZWZpbmVkIGlmICdzZWVkJyBpcyBpbnZhbGlkLiAgVGhlIHNlZWQgYWZ0ZXIga01heFJhbmRvbVNlZWQgaXMKKy8vIGNvbnNpZGVyZWQgdG8gYmUgMS4KK2lubGluZSBpbnQgR2V0TmV4dFJhbmRvbVNlZWQoaW50IHNlZWQpIHsKKyAgR1RFU1RfQ0hFQ0tfKDEgPD0gc2VlZCAmJiBzZWVkIDw9IGtNYXhSYW5kb21TZWVkKQorICAgICAgPDwgIkludmFsaWQgcmFuZG9tIHNlZWQgIiA8PCBzZWVkIDw8ICIgLSBtdXN0IGJlIGluIFsxLCAiCisgICAgICA8PCBrTWF4UmFuZG9tU2VlZCA8PCAiXS4iOworICBjb25zdCBpbnQgbmV4dF9zZWVkID0gc2VlZCArIDE7CisgIHJldHVybiAobmV4dF9zZWVkID4ga01heFJhbmRvbVNlZWQpID8gMSA6IG5leHRfc2VlZDsKK30KKworLy8gVGhpcyBjbGFzcyBzYXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncyBpbiBpdHMgYyd0b3IsIGFuZAorLy8gcmVzdG9yZXMgdGhlbSBpbiBpdHMgZCd0b3IuCitjbGFzcyBHVGVzdEZsYWdTYXZlciB7CisgcHVibGljOgorICAvLyBUaGUgYyd0b3IuCisgIEdUZXN0RmxhZ1NhdmVyKCkgeworICAgIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXyA9IEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpOworICAgIGJyZWFrX29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKTsKKyAgICBjYXRjaF9leGNlcHRpb25zXyA9IEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyk7CisgICAgY29sb3JfID0gR1RFU1RfRkxBRyhjb2xvcik7CisgICAgZGVhdGhfdGVzdF9zdHlsZV8gPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpOworICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmtfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKKyAgICBmaWx0ZXJfID0gR1RFU1RfRkxBRyhmaWx0ZXIpOworICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0XyA9IEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpOworICAgIGxpc3RfdGVzdHNfID0gR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKTsKKyAgICBvdXRwdXRfID0gR1RFU1RfRkxBRyhvdXRwdXQpOworICAgIHByaW50X3RpbWVfID0gR1RFU1RfRkxBRyhwcmludF90aW1lKTsKKyAgICByYW5kb21fc2VlZF8gPSBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKTsKKyAgICByZXBlYXRfID0gR1RFU1RfRkxBRyhyZXBlYXQpOworICAgIHNodWZmbGVfID0gR1RFU1RfRkxBRyhzaHVmZmxlKTsKKyAgICBzdGFja190cmFjZV9kZXB0aF8gPSBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKTsKKyAgICB0aHJvd19vbl9mYWlsdXJlXyA9IEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSk7CisgIH0KKworICAvLyBUaGUgZCd0b3IgaXMgbm90IHZpcnR1YWwuICBETyBOT1QgSU5IRVJJVCBGUk9NIFRISVMgQ0xBU1MuCisgIH5HVGVzdEZsYWdTYXZlcigpIHsKKyAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSA9IGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXzsKKyAgICBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpID0gYnJlYWtfb25fZmFpbHVyZV87CisgICAgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IGNhdGNoX2V4Y2VwdGlvbnNfOworICAgIEdURVNUX0ZMQUcoY29sb3IpID0gY29sb3JfOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSBkZWF0aF90ZXN0X3N0eWxlXzsKKyAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gZGVhdGhfdGVzdF91c2VfZm9ya187CisgICAgR1RFU1RfRkxBRyhmaWx0ZXIpID0gZmlsdGVyXzsKKyAgICBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSA9IGludGVybmFsX3J1bl9kZWF0aF90ZXN0XzsKKyAgICBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpID0gbGlzdF90ZXN0c187CisgICAgR1RFU1RfRkxBRyhvdXRwdXQpID0gb3V0cHV0XzsKKyAgICBHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gcHJpbnRfdGltZV87CisgICAgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkgPSByYW5kb21fc2VlZF87CisgICAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0XzsKKyAgICBHVEVTVF9GTEFHKHNodWZmbGUpID0gc2h1ZmZsZV87CisgICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSBzdGFja190cmFjZV9kZXB0aF87CisgICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRocm93X29uX2ZhaWx1cmVfOworICB9CisgcHJpdmF0ZToKKyAgLy8gRmllbGRzIGZvciBzYXZpbmcgdGhlIG9yaWdpbmFsIHZhbHVlcyBvZiBmbGFncy4KKyAgYm9vbCBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c187CisgIGJvb2wgYnJlYWtfb25fZmFpbHVyZV87CisgIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187CisgIFN0cmluZyBjb2xvcl87CisgIFN0cmluZyBkZWF0aF90ZXN0X3N0eWxlXzsKKyAgYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKKyAgU3RyaW5nIGZpbHRlcl87CisgIFN0cmluZyBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF87CisgIGJvb2wgbGlzdF90ZXN0c187CisgIFN0cmluZyBvdXRwdXRfOworICBib29sIHByaW50X3RpbWVfOworICBib29sIHByZXR0eV87CisgIGludGVybmFsOjpJbnQzMiByYW5kb21fc2VlZF87CisgIGludGVybmFsOjpJbnQzMiByZXBlYXRfOworICBib29sIHNodWZmbGVfOworICBpbnRlcm5hbDo6SW50MzIgc3RhY2tfdHJhY2VfZGVwdGhfOworICBib29sIHRocm93X29uX2ZhaWx1cmVfOworfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKworLy8gQ29udmVydHMgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUKKy8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50LgorLy8gVGhlIG91dHB1dCBidWZmZXIgc3RyIG11c3QgY29udGFpbnQgYXQgbGVhc3QgMzIgY2hhcmFjdGVycy4KKy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8gSWYgdGhlIGNvZGVfcG9pbnQgaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50CisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIG91dHB1dAorLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLgorR1RFU1RfQVBJXyBjaGFyKiBDb2RlUG9pbnRUb1V0ZjgoVUludDMyIGNvZGVfcG9pbnQsIGNoYXIqIHN0cik7CisKKy8vIENvbnZlcnRzIGEgd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorLy8gICBVVEYtMTYgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgKG9uIFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykKKy8vICAgVVRGLTMyIGlmIHNpemVvZih3Y2hhcl90KSA9PSA0IChvbiBMaW51eCkKKy8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLgorLy8gUGFyYW1ldGVyIG51bV9jaGFycyBtYXkgYWRkaXRpb25hbGx5IGxpbWl0IHRoZSBudW1iZXIKKy8vIG9mIHdjaGFyX3QgY2hhcmFjdGVycyBwcm9jZXNzZWQuIC0xIGlzIHVzZWQgd2hlbiB0aGUgZW50aXJlIHN0cmluZworLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4KKy8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludHMKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIHRoZXkgd2lsbCBiZSBvdXRwdXQKKy8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZworLy8gYW5kIGNvbnRhaW5zIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycywgdmFsdWVzIGluIHRob3NlIHBhaXJzCisvLyB3aWxsIGJlIGVuY29kZWQgYXMgaW5kaXZpZHVhbCBVbmljb2RlIGNoYXJhY3RlcnMgZnJvbSBCYXNpYyBOb3JtYWwgUGxhbmUuCitHVEVTVF9BUElfIFN0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycyk7CisKKy8vIFJlYWRzIHRoZSBHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYW5kIGNyZWF0ZXMgdGhlIGZpbGUKKy8vIGlmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LiBJZiBhIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhpcyBsb2NhdGlvbiwgdGhpcworLy8gZnVuY3Rpb24gd2lsbCB3cml0ZSBvdmVyIGl0LiBJZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudCwgYnV0IHRoZSBmaWxlIGNhbm5vdAorLy8gYmUgY3JlYXRlZCwgcHJpbnRzIGFuIGVycm9yIGFuZCBleGl0cy4KK3ZvaWQgV3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCk7CisKKy8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudAorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGUgdmFyaWFibGVzIGFyZSBwcmVzZW50LAorLy8gYnV0IGluY29uc2lzdGVudCAoZS5nLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzCisvLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzCisvLyBkaXNhYmxlZCBiZWNhdXNlIGl0IG11c3Qgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCB0ZXN0CisvLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRTaGFyZChjb25zdCBjaGFyKiB0b3RhbF9zaGFyZHNfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJkX2luZGV4X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpOworCisvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHZhciBhcyBhbiBJbnQzMi4gSWYgaXQgaXMgdW5zZXQsCisvLyByZXR1cm5zIGRlZmF1bHRfdmFsLiBJZiBpdCBpcyBub3QgYW4gSW50MzIsIHByaW50cyBhbiBlcnJvciBhbmQKKy8vIGFuZCBhYm9ydHMuCitHVEVTVF9BUElfIEludDMyIEludDMyRnJvbUVudk9yRGllKGNvbnN0IGNoYXIqIGVudl92YXIsIEludDMyIGRlZmF1bHRfdmFsKTsKKworLy8gR2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZiBzaGFyZHMsIHRoZSBzaGFyZCBpbmRleCwgYW5kIHRoZSB0ZXN0IGlkLAorLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBzaG91bGQgYmUgcnVuIG9uIHRoaXMgc2hhcmQuIFRoZSB0ZXN0IGlkIGlzCisvLyBzb21lIGFyYml0cmFyeSBidXQgdW5pcXVlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFzc2lnbmVkIHRvIGVhY2ggdGVzdAorLy8gbWV0aG9kLiBBc3N1bWVzIHRoYXQgMCA8PSBzaGFyZF9pbmRleCA8IHRvdGFsX3NoYXJkcy4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZCgKKyAgICBpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKTsKKworLy8gU1RMIGNvbnRhaW5lciB1dGlsaXRpZXMuCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyIHRoYXQgc2F0aXNmeQorLy8gdGhlIGdpdmVuIHByZWRpY2F0ZS4KK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIFByZWRpY2F0ZT4KK2lubGluZSBpbnQgQ291bnRJZihjb25zdCBDb250YWluZXImIGMsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oc3RkOjpjb3VudF9pZihjLmJlZ2luKCksIGMuZW5kKCksIHByZWRpY2F0ZSkpOworfQorCisvLyBBcHBsaWVzIGEgZnVuY3Rpb24vZnVuY3RvciB0byBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4KK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIEZ1bmN0b3I+Cit2b2lkIEZvckVhY2goY29uc3QgQ29udGFpbmVyJiBjLCBGdW5jdG9yIGZ1bmN0b3IpIHsKKyAgc3RkOjpmb3JfZWFjaChjLmJlZ2luKCksIGMuZW5kKCksIGZ1bmN0b3IpOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIGVsZW1lbnQgb2YgdGhlIHZlY3Rvciwgb3IgZGVmYXVsdF92YWx1ZSBpZiBpIGlzIG5vdAorLy8gaW4gcmFuZ2UgWzAsIHYuc2l6ZSgpKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPgoraW5saW5lIEUgR2V0RWxlbWVudE9yKGNvbnN0IHN0ZDo6dmVjdG9yPEU+JiB2LCBpbnQgaSwgRSBkZWZhdWx0X3ZhbHVlKSB7CisgIHJldHVybiAoaSA8IDAgfHwgaSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHYuc2l6ZSgpKSkgPyBkZWZhdWx0X3ZhbHVlIDogdltpXTsKK30KKworLy8gUGVyZm9ybXMgYW4gaW4tcGxhY2Ugc2h1ZmZsZSBvZiBhIHJhbmdlIG9mIHRoZSB2ZWN0b3IncyBlbGVtZW50cy4KKy8vICdiZWdpbicgYW5kICdlbmQnIGFyZSBlbGVtZW50IGluZGljZXMgYXMgYW4gU1RMLXN0eWxlIHJhbmdlOworLy8gaS5lLiBbYmVnaW4sIGVuZCkgYXJlIHNodWZmbGVkLCB3aGVyZSAnZW5kJyA9PSBzaXplKCkgbWVhbnMgdG8KKy8vIHNodWZmbGUgdG8gdGhlIGVuZCBvZiB0aGUgdmVjdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+Cit2b2lkIFNodWZmbGVSYW5nZShpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20sIGludCBiZWdpbiwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEU+KiB2KSB7CisgIGNvbnN0IGludCBzaXplID0gc3RhdGljX2Nhc3Q8aW50Pih2LT5zaXplKCkpOworICBHVEVTVF9DSEVDS18oMCA8PSBiZWdpbiAmJiBiZWdpbiA8PSBzaXplKQorICAgICAgPDwgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBzdGFydCAiIDw8IGJlZ2luIDw8ICI6IG11c3QgYmUgaW4gcmFuZ2UgWzAsICIKKyAgICAgIDw8IHNpemUgPDwgIl0uIjsKKyAgR1RFU1RfQ0hFQ0tfKGJlZ2luIDw9IGVuZCAmJiBlbmQgPD0gc2l6ZSkKKyAgICAgIDw8ICJJbnZhbGlkIHNodWZmbGUgcmFuZ2UgZmluaXNoICIgPDwgZW5kIDw8ICI6IG11c3QgYmUgaW4gcmFuZ2UgWyIKKyAgICAgIDw8IGJlZ2luIDw8ICIsICIgPDwgc2l6ZSA8PCAiXS4iOworCisgIC8vIEZpc2hlci1ZYXRlcyBzaHVmZmxlLCBmcm9tCisgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUKKyAgZm9yIChpbnQgcmFuZ2Vfd2lkdGggPSBlbmQgLSBiZWdpbjsgcmFuZ2Vfd2lkdGggPj0gMjsgcmFuZ2Vfd2lkdGgtLSkgeworICAgIGNvbnN0IGludCBsYXN0X2luX3JhbmdlID0gYmVnaW4gKyByYW5nZV93aWR0aCAtIDE7CisgICAgY29uc3QgaW50IHNlbGVjdGVkID0gYmVnaW4gKyByYW5kb20tPkdlbmVyYXRlKHJhbmdlX3dpZHRoKTsKKyAgICBzdGQ6OnN3YXAoKCp2KVtzZWxlY3RlZF0sICgqdilbbGFzdF9pbl9yYW5nZV0pOworICB9Cit9CisKKy8vIFBlcmZvcm1zIGFuIGluLXBsYWNlIHNodWZmbGUgb2YgdGhlIHZlY3RvcidzIGVsZW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+CitpbmxpbmUgdm9pZCBTaHVmZmxlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgc3RkOjp2ZWN0b3I8RT4qIHYpIHsKKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSwgMCwgc3RhdGljX2Nhc3Q8aW50Pih2LT5zaXplKCkpLCB2KTsKK30KKworLy8gQSBmdW5jdGlvbiBmb3IgZGVsZXRpbmcgYW4gb2JqZWN0LiAgSGFuZHkgZm9yIGJlaW5nIHVzZWQgYXMgYQorLy8gZnVuY3Rvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgRGVsZXRlKFQqIHgpIHsKKyAgZGVsZXRlIHg7Cit9CisKKy8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSBrZXkgb2YgYSBUZXN0UHJvcGVydHkgYWdhaW5zdCBhIGtub3duIGtleS4KKy8vCisvLyBUZXN0UHJvcGVydHlLZXlJcyBpcyBjb3B5YWJsZS4KK2NsYXNzIFRlc3RQcm9wZXJ0eUtleUlzIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICAvLworICAvLyBUZXN0UHJvcGVydHlLZXlJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdFByb3BlcnR5S2V5SXMoY29uc3QgY2hhcioga2V5KQorICAgICAgOiBrZXlfKGtleSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IG5hbWUgb2YgdGVzdCBwcm9wZXJ0eSBtYXRjaGVzIG9uIGtleV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nKHRlc3RfcHJvcGVydHkua2V5KCkpLkNvbXBhcmUoa2V5XykgPT0gMDsKKyAgfQorCisgcHJpdmF0ZToKKyAgU3RyaW5nIGtleV87Cit9OworCitjbGFzcyBUZXN0SW5mb0ltcGwgeworIHB1YmxpYzoKKyAgVGVzdEluZm9JbXBsKFRlc3RJbmZvKiBwYXJlbnQsIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdGVzdF9jYXNlX2NvbW1lbnQsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LCBUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOworICB+VGVzdEluZm9JbXBsKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdGVzdCBzaG91bGQgcnVuLgorICBib29sIHNob3VsZF9ydW4oKSBjb25zdCB7IHJldHVybiBzaG91bGRfcnVuXzsgfQorCisgIC8vIFNldHMgdGhlIHNob3VsZF9ydW4gbWVtYmVyLgorICB2b2lkIHNldF9zaG91bGRfcnVuKGJvb2wgc2hvdWxkKSB7IHNob3VsZF9ydW5fID0gc2hvdWxkOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdGVzdCBpcyBkaXNhYmxlZC4gRGlzYWJsZWQgdGVzdHMgYXJlIG5vdCBydW4uCisgIGJvb2wgaXNfZGlzYWJsZWQoKSBjb25zdCB7IHJldHVybiBpc19kaXNhYmxlZF87IH0KKworICAvLyBTZXRzIHRoZSBpc19kaXNhYmxlZCBtZW1iZXIuCisgIHZvaWQgc2V0X2lzX2Rpc2FibGVkKGJvb2wgaXMpIHsgaXNfZGlzYWJsZWRfID0gaXM7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0ZXN0IG1hdGNoZXMgdGhlIGZpbHRlciBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgIGJvb2wgbWF0Y2hlc19maWx0ZXIoKSBjb25zdCB7IHJldHVybiBtYXRjaGVzX2ZpbHRlcl87IH0KKworICAvLyBTZXRzIHRoZSBtYXRjaGVzX2ZpbHRlciBtZW1iZXIuCisgIHZvaWQgc2V0X21hdGNoZXNfZmlsdGVyKGJvb2wgbWF0Y2hlcykgeyBtYXRjaGVzX2ZpbHRlcl8gPSBtYXRjaGVzOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIG5hbWUuCisgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gdGVzdF9jYXNlX25hbWVfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IG5hbWUuCisgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIGNvbW1lbnQuCisgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9jb21tZW50KCkgY29uc3QgeyByZXR1cm4gdGVzdF9jYXNlX2NvbW1lbnRfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNvbW1lbnQuCisgIGNvbnN0IGNoYXIqIGNvbW1lbnQoKSBjb25zdCB7IHJldHVybiBjb21tZW50Xy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgSUQgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcy4KKyAgVHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQoKSBjb25zdCB7IHJldHVybiBmaXh0dXJlX2NsYXNzX2lkXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHRlc3QgcmVzdWx0LgorICBUZXN0UmVzdWx0KiByZXN1bHQoKSB7IHJldHVybiAmcmVzdWx0XzsgfQorICBjb25zdCBUZXN0UmVzdWx0KiByZXN1bHQoKSBjb25zdCB7IHJldHVybiAmcmVzdWx0XzsgfQorCisgIC8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LCBydW5zIGl0LCByZWNvcmRzIGl0cyByZXN1bHQsIGFuZCB0aGVuCisgIC8vIGRlbGV0ZXMgaXQuCisgIHZvaWQgUnVuKCk7CisKKyAgLy8gQ2xlYXJzIHRoZSB0ZXN0IHJlc3VsdC4KKyAgdm9pZCBDbGVhclJlc3VsdCgpIHsgcmVzdWx0Xy5DbGVhcigpOyB9CisKKyAgLy8gQ2xlYXJzIHRoZSB0ZXN0IHJlc3VsdCBpbiB0aGUgZ2l2ZW4gVGVzdEluZm8gb2JqZWN0LgorICBzdGF0aWMgdm9pZCBDbGVhclRlc3RSZXN1bHQoVGVzdEluZm8gKiB0ZXN0X2luZm8pIHsKKyAgICB0ZXN0X2luZm8tPmltcGwoKS0+Q2xlYXJSZXN1bHQoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVGhlc2UgZmllbGRzIGFyZSBpbW11dGFibGUgcHJvcGVydGllcyBvZiB0aGUgdGVzdC4KKyAgVGVzdEluZm8qIGNvbnN0IHBhcmVudF87ICAgICAgICAgIC8vIFRoZSBvd25lciBvZiB0aGlzIG9iamVjdAorICBjb25zdCBTdHJpbmcgdGVzdF9jYXNlX25hbWVfOyAgICAgLy8gVGVzdCBjYXNlIG5hbWUKKyAgY29uc3QgU3RyaW5nIG5hbWVfOyAgICAgICAgICAgICAgIC8vIFRlc3QgbmFtZQorICBjb25zdCBTdHJpbmcgdGVzdF9jYXNlX2NvbW1lbnRfOyAgLy8gVGVzdCBjYXNlIGNvbW1lbnQKKyAgY29uc3QgU3RyaW5nIGNvbW1lbnRfOyAgICAgICAgICAgIC8vIFRlc3QgY29tbWVudAorICBjb25zdCBUeXBlSWQgZml4dHVyZV9jbGFzc19pZF87ICAgLy8gSUQgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcworICBib29sIHNob3VsZF9ydW5fOyAgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZmYgdGhpcyB0ZXN0IHNob3VsZCBydW4KKyAgYm9vbCBpc19kaXNhYmxlZF87ICAgICAgICAgICAgICAgIC8vIFRydWUgaWZmIHRoaXMgdGVzdCBpcyBkaXNhYmxlZAorICBib29sIG1hdGNoZXNfZmlsdGVyXzsgICAgICAgICAgICAgLy8gVHJ1ZSBpZiB0aGlzIHRlc3QgbWF0Y2hlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXItc3BlY2lmaWVkIGZpbHRlci4KKyAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogY29uc3QgZmFjdG9yeV87ICAvLyBUaGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVzdCBvYmplY3QKKworICAvLyBUaGlzIGZpZWxkIGlzIG11dGFibGUgYW5kIG5lZWRzIHRvIGJlIHJlc2V0IGJlZm9yZSBydW5uaW5nIHRoZQorICAvLyB0ZXN0IGZvciB0aGUgc2Vjb25kIHRpbWUuCisgIFRlc3RSZXN1bHQgcmVzdWx0XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RJbmZvSW1wbCk7Cit9OworCisvLyBDbGFzcyBVbml0VGVzdE9wdGlvbnMuCisvLworLy8gVGhpcyBjbGFzcyBjb250YWlucyBmdW5jdGlvbnMgZm9yIHByb2Nlc3Npbmcgb3B0aW9ucyB0aGUgdXNlcgorLy8gc3BlY2lmaWVzIHdoZW4gcnVubmluZyB0aGUgdGVzdHMuICBJdCBoYXMgb25seSBzdGF0aWMgbWVtYmVycy4KKy8vCisvLyBJbiBtb3N0IGNhc2VzLCB0aGUgdXNlciBjYW4gc3BlY2lmeSBhbiBvcHRpb24gdXNpbmcgZWl0aGVyIGFuCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBhIGNvbW1hbmQgbGluZSBmbGFnLiAgRS5nLiB5b3UgY2FuIHNldCB0aGUKKy8vIHRlc3QgZmlsdGVyIHVzaW5nIGVpdGhlciBHVEVTVF9GSUxURVIgb3IgLS1ndGVzdF9maWx0ZXIuICBJZiBib3RoCisvLyB0aGUgdmFyaWFibGUgYW5kIHRoZSBmbGFnIGFyZSBwcmVzZW50LCB0aGUgbGF0dGVyIG92ZXJyaWRlcyB0aGUKKy8vIGZvcm1lci4KK2NsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3RPcHRpb25zIHsKKyBwdWJsaWM6CisgIC8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcuCisKKyAgLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KKyAgc3RhdGljIFN0cmluZyBHZXRPdXRwdXRGb3JtYXQoKTsKKworICAvLyBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZQorICAvLyBkZWZhdWx0ICh0ZXN0X2RldGFpbC54bWwgaW4gdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5KSBpZgorICAvLyBub25lIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KKyAgc3RhdGljIFN0cmluZyBHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKTsKKworICAvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X2ZpbHRlciBmbGFnLgorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHdpbGRjYXJkIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc3RyaW5nLiAgVGhlCisgIC8vIGZpcnN0ICc6JyBvciAnXDAnIGNoYXJhY3RlciBpbiBwYXR0ZXJuIG1hcmtzIHRoZSBlbmQgb2YgaXQuCisgIC8vCisgIC8vIFRoaXMgcmVjdXJzaXZlIGFsZ29yaXRobSBpc24ndCB2ZXJ5IGVmZmljaWVudCwgYnV0IGlzIGNsZWFyIGFuZAorICAvLyB3b3JrcyB3ZWxsIGVub3VnaCBmb3IgbWF0Y2hpbmcgdGVzdCBuYW1lcywgd2hpY2ggYXJlIHNob3J0LgorICBzdGF0aWMgYm9vbCBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjb25zdCBjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpzdHIpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBtYXRjaGVzIHRoZSB0ZXN0IGNhc2UKKyAgLy8gbmFtZSBhbmQgdGhlIHRlc3QgbmFtZS4KKyAgc3RhdGljIGJvb2wgRmlsdGVyTWF0Y2hlc1Rlc3QoY29uc3QgU3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nICZ0ZXN0X25hbWUpOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBGdW5jdGlvbiBmb3Igc3VwcG9ydGluZyB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uIGZsYWcuCisKKyAgLy8gUmV0dXJucyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIGlmIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgdGhlCisgIC8vIGdpdmVuIFNFSCBleGNlcHRpb24sIG9yIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggb3RoZXJ3aXNlLgorICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhcyBhbiBfX2V4Y2VwdCBjb25kaXRpb24uCisgIHN0YXRpYyBpbnQgR1Rlc3RTaG91bGRQcm9jZXNzU0VIKERXT1JEIGV4Y2VwdGlvbl9jb2RlKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiAibmFtZSIgbWF0Y2hlcyB0aGUgJzonIHNlcGFyYXRlZCBsaXN0IG9mIGdsb2Itc3R5bGUKKyAgLy8gZmlsdGVycyBpbiAiZmlsdGVyIi4KKyAgc3RhdGljIGJvb2wgTWF0Y2hlc0ZpbHRlcihjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIGZpbHRlcik7Cit9OworCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uJ3MgbmFtZSwgcmVtb3ZpbmcgZGlyZWN0b3J5IHBhdGggaWYgdGhhdAorLy8gaXMgcHJlc2VudC4gIFVzZWQgYnkgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGaWxlLgorR1RFU1RfQVBJXyBGaWxlUGF0aCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKTsKKworLy8gVGhlIHJvbGUgaW50ZXJmYWNlIGZvciBnZXR0aW5nIHRoZSBPUyBzdGFjayB0cmFjZSBhcyBhIHN0cmluZy4KK2NsYXNzIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSB7CisgcHVibGljOgorICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UoKSB7fQorICB2aXJ0dWFsIH5Pc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UoKSB7fQorCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYSBTdHJpbmcuICBQYXJhbWV0ZXJzOgorICAvLworICAvLyAgIG1heF9kZXB0aCAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkCisgIC8vICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZS4KKyAgLy8gICBza2lwX2NvdW50IC0gdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQ7IGRvZXNuJ3QgY291bnQKKyAgLy8gICAgICAgICAgICAgICAgYWdhaW5zdCBtYXhfZGVwdGguCisgIHZpcnR1YWwgU3RyaW5nIEN1cnJlbnRTdGFja1RyYWNlKGludCBtYXhfZGVwdGgsIGludCBza2lwX2NvdW50KSA9IDA7CisKKyAgLy8gVXBvbkxlYXZpbmdHVGVzdCgpIHNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIEdvb2dsZSBUZXN0IGNhbGxzCisgIC8vIHVzZXIgY29kZS4gSXQgc2F2ZXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGFjayB0aGF0CisgIC8vIEN1cnJlbnRTdGFja1RyYWNlKCkgd2lsbCB1c2UgdG8gZmluZCBhbmQgaGlkZSBHb29nbGUgVGVzdCBzdGFjayBmcmFtZXMuCisgIHZpcnR1YWwgdm9pZCBVcG9uTGVhdmluZ0dUZXN0KCkgPSAwOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UpOworfTsKKworLy8gQSB3b3JraW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgaW50ZXJmYWNlLgorY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVyIDogcHVibGljIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSB7CisgcHVibGljOgorICBPc1N0YWNrVHJhY2VHZXR0ZXIoKSA6IGNhbGxlcl9mcmFtZV8oTlVMTCkge30KKyAgdmlydHVhbCBTdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpOworICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpOworCisgIC8vIFRoaXMgc3RyaW5nIGlzIGluc2VydGVkIGluIHBsYWNlIG9mIHN0YWNrIGZyYW1lcyB0aGF0IGFyZSBwYXJ0IG9mCisgIC8vIEdvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb24uCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRWxpZGVkRnJhbWVzTWFya2VyOworCisgcHJpdmF0ZToKKyAgTXV0ZXggbXV0ZXhfOyAgLy8gcHJvdGVjdHMgYWxsIGludGVybmFsIHN0YXRlCisKKyAgLy8gV2Ugc2F2ZSB0aGUgc3RhY2sgZnJhbWUgYmVsb3cgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdXNlciBjb2RlLgorICAvLyBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZyYW1lIGltbWVkaWF0ZWx5IGJlbG93CisgIC8vIHRoZSB1c2VyIGNvZGUgY2hhbmdlcyBiZXR3ZWVuIHRoZSBjYWxsIHRvIFVwb25MZWF2aW5nR1Rlc3QoKQorICAvLyBhbmQgYW55IGNhbGxzIHRvIEN1cnJlbnRTdGFja1RyYWNlKCkgZnJvbSB3aXRoaW4gdGhlIHVzZXIgY29kZS4KKyAgdm9pZCogY2FsbGVyX2ZyYW1lXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE9zU3RhY2tUcmFjZUdldHRlcik7Cit9OworCisvLyBJbmZvcm1hdGlvbiBhYm91dCBhIEdvb2dsZSBUZXN0IHRyYWNlIHBvaW50Lgorc3RydWN0IFRyYWNlSW5mbyB7CisgIGNvbnN0IGNoYXIqIGZpbGU7CisgIGludCBsaW5lOworICBTdHJpbmcgbWVzc2FnZTsKK307CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBpbiBVbml0VGVzdEltcGwuCisvLyBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgVW5pdFRlc3RJbXBsLgorY2xhc3MgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihVbml0VGVzdEltcGwqIHVuaXRfdGVzdCk7CisgIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFJlcG9ydHMgdGhlIHRlc3QgcGFydAorICAvLyByZXN1bHQgaW4gdGhlIGN1cnJlbnQgdGVzdC4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisgcHJpdmF0ZToKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCB1bml0X3Rlc3RfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOworfTsKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBwZXIgdGhyZWFkIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBpbgorLy8gVW5pdFRlc3RJbXBsLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgVW5pdFRlc3RJbXBsLgorY2xhc3MgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KTsKKyAgLy8gSW1wbGVtZW50cyB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZS4gVGhlIGltcGxlbWVudGF0aW9uIGp1c3QKKyAgLy8gZGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIG9mICp1bml0X3Rlc3RfLgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyBwcml2YXRlOgorICBVbml0VGVzdEltcGwqIGNvbnN0IHVuaXRfdGVzdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Cit9OworCisvLyBUaGUgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVW5pdFRlc3QgY2xhc3MuICBXZSBkb24ndCBwcm90ZWN0CisvLyB0aGUgbWV0aG9kcyB1bmRlciBhIG11dGV4LCBhcyB0aGlzIGNsYXNzIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IGEKKy8vIHVzZXIgYW5kIHRoZSBVbml0VGVzdCBjbGFzcyB0aGF0IGRlbGVnYXRlcyB3b3JrIHRvIHRoaXMgY2xhc3MgZG9lcworLy8gcHJvcGVyIGxvY2tpbmcuCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0SW1wbCB7CisgcHVibGljOgorICBleHBsaWNpdCBVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCk7CisgIHZpcnR1YWwgflVuaXRUZXN0SW1wbCgpOworCisgIC8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgdG8gcmVnaXN0ZXIgeW91ciBvd24gVGVzdFBhcnRSZXN1bHRSZXBvcnRlci4KKyAgLy8gWW91IGNhbiByZWdpc3RlciB5b3VyIG93biByZXBvdGVyIHRvIGxpc3RlbiBlaXRoZXIgb25seSBmb3IgdGVzdCByZXN1bHRzCisgIC8vIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkIG9yIGZvciByZXN1bHRzIGZyb20gYWxsIHRocmVhZHMuCisgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggcGVyLXRocmVhZCB0ZXN0IHJlc3VsdCByZXBvdGVyIGp1c3QgcGFzc2VzIGEgbmV3CisgIC8vIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBnbG9iYWwgdGVzdCByZXN1bHQgcmVwb3J0ZXIsIHdoaWNoIHJlZ2lzdGVycyB0aGUKKyAgLy8gdGVzdCBwYXJ0IHJlc3VsdCBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuCisKKyAgLy8gUmV0dXJucyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIEdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKKworICAvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KKyAgdm9pZCBTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpOworCisgIC8vIFJldHVybnMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogR2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKTsKKworICAvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIHZvaWQgU2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcik7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgorICBpbnQgZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KKyAgaW50IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKKyAgLy8gdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KKyAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgorICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCisgIGludCB0b3RhbF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLgorICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCisgIC8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgorICBib29sIEZhaWxlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpID4gMCB8fCBhZF9ob2NfdGVzdF9yZXN1bHQoKS0+RmFpbGVkKCk7CisgIH0KKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdENhc2UqIEdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7CisgICAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfY2FzZV9pbmRpY2VzXywgaSwgLTEpOworICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9jYXNlc19baV07CisgIH0KKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgVGVzdENhc2UqIEdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgeworICAgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2Nhc2VfaW5kaWNlc18sIGksIC0xKTsKKyAgICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfY2FzZXNfW2luZGV4XTsKKyAgfQorCisgIC8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXIgbGlzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzKiBsaXN0ZW5lcnMoKSB7IHJldHVybiAmbGlzdGVuZXJzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywgb3IKKyAgLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIFRlc3RSZXN1bHQqIGN1cnJlbnRfdGVzdF9yZXN1bHQoKTsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QuCisgIGNvbnN0IFRlc3RSZXN1bHQqIGFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICZhZF9ob2NfdGVzdF9yZXN1bHRfOyB9CisKKyAgLy8gU2V0cyB0aGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLgorICAvLworICAvLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGlucHV0IGFuZCB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIKKyAgLy8gYXJlIHRoZSBzYW1lOyBvdGhlcndpc2UsIGRlbGV0ZXMgdGhlIG9sZCBnZXR0ZXIgYW5kIG1ha2VzIHRoZQorICAvLyBpbnB1dCB0aGUgY3VycmVudCBnZXR0ZXIuCisgIHZvaWQgc2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcihPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIGdldHRlcik7CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgaWYgaXQgaXMgbm90IE5VTEw7CisgIC8vIG90aGVyd2lzZSwgY3JlYXRlcyBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIsIG1ha2VzIGl0IHRoZSBjdXJyZW50CisgIC8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuCisgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhIFN0cmluZy4KKyAgLy8KKyAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKyAgLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKyAgLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisgIC8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisgIC8vCisgIC8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworICAvLyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorICAvLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KKyAgU3RyaW5nIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpOworCisgIC8vIEZpbmRzIGFuZCByZXR1cm5zIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG9uZSBkb2Vzbid0CisgIC8vIGV4aXN0LCBjcmVhdGVzIG9uZSBhbmQgcmV0dXJucyBpdC4KKyAgLy8KKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyAgIHRlc3RfY2FzZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICBzZXRfdXBfdGM6ICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKyAgVGVzdENhc2UqIEdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Yyk7CisKKyAgLy8gQWRkcyBhIFRlc3RJbmZvIHRvIHRoZSB1bml0IHRlc3QuCisgIC8vCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICAvLyAgIHRlc3RfaW5mbzogICAgdGhlIFRlc3RJbmZvIG9iamVjdAorICB2b2lkIEFkZFRlc3RJbmZvKFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgICAgICAgICAgICAgICAgVGVzdEluZm8gKiB0ZXN0X2luZm8pIHsKKyAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzLCB3ZSBuZWVkIHRvCisgICAgLy8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIHRlc3QgcHJvZ3JhbQorICAgIC8vIHdhcyBmaXJzdCBpbnZva2VkLiAgV2UgY2Fubm90IGRvIHRoaXMgaW4gUlVOX0FMTF9URVNUUygpLCBhcworICAgIC8vIHRoZSB1c2VyIG1heSBoYXZlIGNoYW5nZWQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGJlZm9yZSBjYWxsaW5nCisgICAgLy8gUlVOX0FMTF9URVNUUygpLiAgVGhlcmVmb3JlIHdlIGNhcHR1cmUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluCisgICAgLy8gQWRkVGVzdEluZm8oKSwgd2hpY2ggaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGEgVEVTVCBvciBURVNUX0YKKyAgICAvLyBiZWZvcmUgbWFpbigpIGlzIHJlYWNoZWQuCisgICAgaWYgKG9yaWdpbmFsX3dvcmtpbmdfZGlyXy5Jc0VtcHR5KCkpIHsKKyAgICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXy5TZXQoRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSk7CisgICAgICBHVEVTVF9DSEVDS18oIW9yaWdpbmFsX3dvcmtpbmdfZGlyXy5Jc0VtcHR5KCkpCisgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIjsKKyAgICB9CisKKyAgICBHZXRUZXN0Q2FzZSh0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCksCisgICAgICAgICAgICAgICAgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfY29tbWVudCgpLAorICAgICAgICAgICAgICAgIHNldF91cF90YywKKyAgICAgICAgICAgICAgICB0ZWFyX2Rvd25fdGMpLT5BZGRUZXN0SW5mbyh0ZXN0X2luZm8pOworICB9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBSZXR1cm5zIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCisgIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkgeworICAgIHJldHVybiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyAgLy8gU2V0cyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcuCisgIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9jYXNlKFRlc3RDYXNlKiBhX2N1cnJlbnRfdGVzdF9jYXNlKSB7CisgICAgY3VycmVudF90ZXN0X2Nhc2VfID0gYV9jdXJyZW50X3Rlc3RfY2FzZTsKKyAgfQorCisgIC8vIFNldHMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLiAgSWYKKyAgLy8gY3VycmVudF90ZXN0X2luZm8gaXMgTlVMTCwgdGhlIGFzc2VydGlvbiByZXN1bHRzIHdpbGwgYmUgc3RvcmVkIGluCisgIC8vIGFkX2hvY190ZXN0X3Jlc3VsdF8uCisgIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9pbmZvKFRlc3RJbmZvKiBhX2N1cnJlbnRfdGVzdF9pbmZvKSB7CisgICAgY3VycmVudF90ZXN0X2luZm9fID0gYV9jdXJyZW50X3Rlc3RfaW5mbzsKKyAgfQorCisgIC8vIFJlZ2lzdGVycyBhbGwgcGFyYW1ldGVyaXplZCB0ZXN0cyBkZWZpbmVkIHVzaW5nIFRFU1RfUCBhbmQKKyAgLy8gSU5TVEFOVElBVEVfVEVTVF9QLCBjcmVhdGluZyByZWd1bGFyIHRlc3RzIGZvciBlYWNoIHRlc3QvcGFyYW1ldGVyCisgIC8vIGNvbWJpbmF0aW9uLiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlOyBpdCBoYXMKKyAgLy8gZ3VhcmRzIHByb3RlY3RpbmcgZnJvbSByZWdpc3RlcmluZyB0aGUgdGVzdHMgbW9yZSB0aGVuIG9uY2UuCisgIC8vIElmIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGRpc2FibGVkLCBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cworICAvLyBpcyBwcmVzZW50IGJ1dCBkb2VzIG5vdGhpbmcuCisgIHZvaWQgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKTsKKworICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAorICAvLyByZXR1cm5zIDAgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4gIElmIGFueQorICAvLyBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBhIHRlc3Qgb24gV2luZG93cywgdGhpcyB0ZXN0IGlzCisgIC8vIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLCBidXQgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHdpbGwgc3RpbGwgYmUKKyAgLy8gcnVuLiAgKFdlIGRpc2FibGUgZXhjZXB0aW9ucyBvbiBMaW51eCBhbmQgTWFjIE9TIFgsIHNvIHRoZSBpc3N1ZQorICAvLyBkb2Vzbid0IGFwcGx5IHRoZXJlLikKKyAgaW50IFJ1bkFsbFRlc3RzKCk7CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cywgaW5jbHVkaW5nIHRoZSBhZCBob2MgdGVzdC4KKyAgdm9pZCBDbGVhclJlc3VsdCgpIHsKKyAgICBGb3JFYWNoKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZTo6Q2xlYXJUZXN0Q2FzZVJlc3VsdCk7CisgICAgYWRfaG9jX3Rlc3RfcmVzdWx0Xy5DbGVhcigpOworICB9CisKKyAgZW51bSBSZWFjdGlvblRvU2hhcmRpbmcgeworICAgIEhPTk9SX1NIQVJESU5HX1BST1RPQ09MLAorICAgIElHTk9SRV9TSEFSRElOR19QUk9UT0NPTAorICB9OworCisgIC8vIE1hdGNoZXMgdGhlIGZ1bGwgbmFtZSBvZiBlYWNoIHRlc3QgYWdhaW5zdCB0aGUgdXNlci1zcGVjaWZpZWQKKyAgLy8gZmlsdGVyIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBydW4sIHRoZW4gcmVjb3JkcyB0aGUKKyAgLy8gcmVzdWx0IGluIGVhY2ggVGVzdENhc2UgYW5kIFRlc3RJbmZvIG9iamVjdC4KKyAgLy8gSWYgc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsIGZ1cnRoZXIgZmlsdGVycyB0ZXN0cworICAvLyBiYXNlZCBvbiBzaGFyZGluZyB2YXJpYWJsZXMgaW4gdGhlIGVudmlyb25tZW50LgorICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgRmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKTsKKworICAvLyBQcmludHMgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBtYXRjaGluZyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIGZsYWcuCisgIHZvaWQgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsKKworICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3Rlc3RfY2FzZV87IH0KKyAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgeyByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fOyB9CisgIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHZlY3RvciBvZiBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIGJlIHNldC11cC90b3JuLWRvd24KKyAgLy8gYmVmb3JlL2FmdGVyIHRoZSB0ZXN0cyBhcmUgcnVuLgorICBzdGQ6OnZlY3RvcjxFbnZpcm9ubWVudCo+JiBlbnZpcm9ubWVudHMoKSB7IHJldHVybiBlbnZpcm9ubWVudHNfOyB9CisKKyAgLy8gR2V0dGVycyBmb3IgdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisgIHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgeworICAgIHJldHVybiAqKGd0ZXN0X3RyYWNlX3N0YWNrXy5wb2ludGVyKCkpOworICB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgY29uc3QgeworICAgIHJldHVybiBndGVzdF90cmFjZV9zdGFja18uZ2V0KCk7CisgIH0KKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgIHZvaWQgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpIHsKKyAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5yZXNldChQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpKTsKKyAgfQorICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QKKyAgLy8gZmxhZywgb3IgTlVMTCBpZiB0aGF0IGZsYWcgd2FzIG5vdCBzcGVjaWZpZWQuCisgIC8vIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCisgIC8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgYSBjYWxsIHRvIEluaXRHb29nbGVUZXN0LgorICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpOworICB9CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGVhdGggdGVzdCBmYWN0b3J5LgorICBpbnRlcm5hbDo6RGVhdGhUZXN0RmFjdG9yeSogZGVhdGhfdGVzdF9mYWN0b3J5KCkgeworICAgIHJldHVybiBkZWF0aF90ZXN0X2ZhY3RvcnlfLmdldCgpOworICB9CisKKyAgdm9pZCBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOworCisgIGZyaWVuZCBjbGFzcyBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICAvLyBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXIgcGVyZm9ybWluZyBYTUwgb3V0cHV0IGFzIHNwZWNpZmllZCBieQorICAvLyBVbml0VGVzdE9wdGlvbnMuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCisgIHZvaWQgQ29uZmlndXJlWG1sT3V0cHV0KCk7CisKKyAgLy8gUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gZGVwZW5kZW50IHVwb24gZmxhZyB2YWx1ZXMgb2J0YWluZWQgaW4KKyAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSXMgY2FsbGVkIGZyb20gSW5pdEdvb2dsZVRlc3QgYWZ0ZXIgdGhlIGNhbGwgdG8KKyAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSW4gY2FzZSBhIHVzZXIgbmVnbGVjdHMgdG8gY2FsbCBJbml0R29vZ2xlVGVzdAorICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZQorICAvLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IGhhcyB0byBiZSBpZGVtcG90ZW50LgorICB2b2lkIFBvc3RGbGFnUGFyc2luZ0luaXQoKTsKKworICAvLyBHZXRzIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IGl0ZXJhdGlvbi4KKyAgaW50IHJhbmRvbV9zZWVkKCkgY29uc3QgeyByZXR1cm4gcmFuZG9tX3NlZWRfOyB9CisKKyAgLy8gR2V0cyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgIGludGVybmFsOjpSYW5kb20qIHJhbmRvbSgpIHsgcmV0dXJuICZyYW5kb21fOyB9CisKKyAgLy8gU2h1ZmZsZXMgYWxsIHRlc3QgY2FzZXMsIGFuZCB0aGUgdGVzdHMgd2l0aGluIGVhY2ggdGVzdCBjYXNlLAorICAvLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuCisgIHZvaWQgU2h1ZmZsZVRlc3RzKCk7CisKKyAgLy8gUmVzdG9yZXMgdGhlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIHRvIHRoZWlyIG9yZGVyIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KKyAgdm9pZCBVbnNodWZmbGVUZXN0cygpOworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6VW5pdFRlc3Q7CisKKyAgLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0aGF0IG93bnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCisgIFVuaXRUZXN0KiBjb25zdCBwYXJlbnRfOworCisgIC8vIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzCisgIC8vIGV4ZWN1dGVkLgorICBpbnRlcm5hbDo6RmlsZVBhdGggb3JpZ2luYWxfd29ya2luZ19kaXJfOworCisgIC8vIFRoZSBkZWZhdWx0IHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXJzLgorICBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKKyAgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKKworICAvLyBQb2ludHMgdG8gKGJ1dCBkb2Vzbid0IG93bikgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXzsKKworICAvLyBQcm90ZWN0cyByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLgorICBpbnRlcm5hbDo6TXV0ZXggZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfOworCisgIC8vIFBvaW50cyB0byAoYnV0IGRvZXNuJ3Qgb3duKSB0aGUgcGVyLXRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBpbnRlcm5hbDo6VGhyZWFkTG9jYWw8VGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSo+CisgICAgICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBiZSBzZXQtdXAvdG9ybi1kb3duCisgIC8vIGJlZm9yZS9hZnRlciB0aGUgdGVzdHMgYXJlIHJ1bi4KKyAgc3RkOjp2ZWN0b3I8RW52aXJvbm1lbnQqPiBlbnZpcm9ubWVudHNfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdENhc2VzIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLiAgSXQgb3ducyB0aGUKKyAgLy8gZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiB0ZXN0X2Nhc2VzXzsKKworICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBjYXNlIGxpc3QgdG8gYWxsb3cKKyAgLy8gZWFzeSBzaHVmZmxpbmcgYW5kIHJlc3RvcmluZyB0aGUgdGVzdCBjYXNlIG9yZGVyLiAgVGhlIGktdGgKKyAgLy8gZWxlbWVudCBvZiB0aGlzIHZlY3RvciBpcyB0aGUgaW5kZXggb2YgdGhlIGktdGggdGVzdCBjYXNlIGluIHRoZQorICAvLyBzaHVmZmxlZCBvcmRlci4KKyAgc3RkOjp2ZWN0b3I8aW50PiB0ZXN0X2Nhc2VfaW5kaWNlc187CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBQYXJhbWV0ZXJpemVkVGVzdFJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIHJlZ2lzdGVyIHZhbHVlLXBhcmFtZXRlcml6ZWQKKyAgLy8gdGVzdHMuCisgIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOworCisgIC8vIEluZGljYXRlcyB3aGV0aGVyIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkgaGFzIGJlZW4gY2FsbGVkIGFscmVhZHkuCisgIGJvb2wgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXzsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBJbmRleCBvZiB0aGUgbGFzdCBkZWF0aCB0ZXN0IGNhc2UgcmVnaXN0ZXJlZC4gIEluaXRpYWxseSAtMS4KKyAgaW50IGxhc3RfZGVhdGhfdGVzdF9jYXNlXzsKKworICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdENhc2UgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKKyAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgY2FzZSBhZnRlciBhbm90aGVyLgorICAvLyBXaGVuIG5vIHRlc3QgaXMgcnVubmluZywgdGhpcyBpcyBzZXQgdG8gTlVMTCBhbmQgR29vZ2xlIFRlc3QKKyAgLy8gc3RvcmVzIGFzc2VydGlvbiByZXN1bHRzIGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uICBJbml0aWFsbHkgTlVMTC4KKyAgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlXzsKKworICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdEluZm8gZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKKyAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgYWZ0ZXIgYW5vdGhlci4gIFdoZW4KKyAgLy8gbm8gdGVzdCBpcyBydW5uaW5nLCB0aGlzIGlzIHNldCB0byBOVUxMIGFuZCBHb29nbGUgVGVzdCBzdG9yZXMKKyAgLy8gYXNzZXJ0aW9uIHJlc3VsdHMgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4gIEluaXRpYWxseSBOVUxMLgorICBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm9fOworCisgIC8vIE5vcm1hbGx5LCBhIHVzZXIgb25seSB3cml0ZXMgYXNzZXJ0aW9ucyBpbnNpZGUgYSBURVNUIG9yIFRFU1RfRiwKKyAgLy8gb3IgaW5zaWRlIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IGEgVEVTVCBvciBURVNUX0YuICBTaW5jZSBHb29nbGUKKyAgLy8gVGVzdCBrZWVwcyB0cmFjayBvZiB3aGljaCB0ZXN0IGlzIGN1cnJlbnQgcnVubmluZywgaXQgY2FuCisgIC8vIGFzc29jaWF0ZSBzdWNoIGFuIGFzc2VydGlvbiB3aXRoIHRoZSB0ZXN0IGl0IGJlbG9uZ3MgdG8uCisgIC8vCisgIC8vIElmIGFuIGFzc2VydGlvbiBpcyBlbmNvdW50ZXJlZCB3aGVuIG5vIFRFU1Qgb3IgVEVTVF9GIGlzIHJ1bm5pbmcsCisgIC8vIEdvb2dsZSBUZXN0IGF0dHJpYnV0ZXMgdGhlIGFzc2VydGlvbiByZXN1bHQgdG8gYW4gaW1hZ2luYXJ5ICJhZCBob2MiCisgIC8vIHRlc3QsIGFuZCByZWNvcmRzIHRoZSByZXN1bHQgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4KKyAgVGVzdFJlc3VsdCBhZF9ob2NfdGVzdF9yZXN1bHRfOworCisgIC8vIFRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cyBpbnNpZGUKKyAgLy8gR29vZ2xlIFRlc3QuCisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnNfOworCisgIC8vIFRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuICBXaWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUgVW5pdFRlc3QKKyAgLy8gb2JqZWN0IGlzIGRlc3RydWN0ZWQuICBCeSBkZWZhdWx0LCBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIgaXMgdXNlZCwKKyAgLy8gYnV0IHRoZSB1c2VyIGNhbiBzZXQgdGhpcyBmaWVsZCB0byB1c2UgYSBjdXN0b20gZ2V0dGVyIGlmIHRoYXQgaXMKKyAgLy8gZGVzaXJlZC4KKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXJfOworCisgIC8vIFRydWUgaWZmIFBvc3RGbGFnUGFyc2luZ0luaXQoKSBoYXMgYmVlbiBjYWxsZWQuCisgIGJvb2wgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXzsKKworICAvLyBUaGUgcmFuZG9tIG51bWJlciBzZWVkIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVzdCBydW4uCisgIGludCByYW5kb21fc2VlZF87CisKKyAgLy8gT3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICBpbnRlcm5hbDo6UmFuZG9tIHJhbmRvbV87CisKKyAgLy8gSG93IGxvbmcgdGhlIHRlc3QgdG9vayB0byBydW4sIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAvLyBUaGUgZGVjb21wb3NlZCBjb21wb25lbnRzIG9mIHRoZSBndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnLAorICAvLyBwYXJzZWQgd2hlbiBSVU5fQUxMX1RFU1RTIGlzIGNhbGxlZC4KKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8SW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnPiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXzsKKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8aW50ZXJuYWw6OkRlYXRoVGVzdEZhY3Rvcnk+IGRlYXRoX3Rlc3RfZmFjdG9yeV87CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgLy8gQSBwZXItdGhyZWFkIHN0YWNrIG9mIHRyYWNlcyBjcmVhdGVkIGJ5IHRoZSBTQ09QRURfVFJBQ0UoKSBtYWNyby4KKyAgaW50ZXJuYWw6OlRocmVhZExvY2FsPHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4gPiBndGVzdF90cmFjZV9zdGFja187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbml0VGVzdEltcGwpOworfTsgIC8vIGNsYXNzIFVuaXRUZXN0SW1wbAorCisvLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWNjZXNzaW5nIHRoZSBnbG9iYWwgVW5pdFRlc3QKKy8vIGltcGxlbWVudGF0aW9uIG9iamVjdC4KK2lubGluZSBVbml0VGVzdEltcGwqIEdldFVuaXRUZXN0SW1wbCgpIHsKKyAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCk7Cit9CisKKy8vIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyB0aGUgc2ltcGxlIHJlZ3VsYXIKKy8vIGV4cHJlc3Npb24gbWF0Y2hlci4KK0dURVNUX0FQSV8gYm9vbCBJc0luU2V0KGNoYXIgY2gsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgSXNEaWdpdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc1B1bmN0KGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzUmVwZWF0KGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzV2hpdGVTcGFjZShjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc1dvcmRDaGFyKGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzVmFsaWRFc2NhcGUoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuLCBjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBWYWxpZGF0ZVJlZ2V4KGNvbnN0IGNoYXIqIHJlZ2V4KTsKK0dURVNUX0FQSV8gYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAorICAgIGJvb2wgZXNjYXBlZCwgY2hhciBjaCwgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsKKworLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZworLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuCitHVEVTVF9BUElfIHZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgY2hhcioqIGFyZ3YpOworR1RFU1RfQVBJXyB2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IsIHJlZ2FyZGxlc3Mgb2YgdGhlCisvLyBwbGF0Zm9ybS4KK1N0cmluZyBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gUHJvdmlkZXMgbGVhay1zYWZlIFdpbmRvd3Mga2VybmVsIGhhbmRsZSBvd25lcnNoaXAuCitjbGFzcyBBdXRvSGFuZGxlIHsKKyBwdWJsaWM6CisgIEF1dG9IYW5kbGUoKSA6IGhhbmRsZV8oSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHt9CisgIGV4cGxpY2l0IEF1dG9IYW5kbGUoSEFORExFIGhhbmRsZSkgOiBoYW5kbGVfKGhhbmRsZSkge30KKworICB+QXV0b0hhbmRsZSgpIHsgUmVzZXQoKTsgfQorCisgIEhBTkRMRSBHZXQoKSBjb25zdCB7IHJldHVybiBoYW5kbGVfOyB9CisgIHZvaWQgUmVzZXQoKSB7IFJlc2V0KElOVkFMSURfSEFORExFX1ZBTFVFKTsgfQorICB2b2lkIFJlc2V0KEhBTkRMRSBoYW5kbGUpIHsKKyAgICBpZiAoaGFuZGxlICE9IGhhbmRsZV8pIHsKKyAgICAgIGlmIChoYW5kbGVfICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZV8pOworICAgICAgaGFuZGxlXyA9IGhhbmRsZTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIEhBTkRMRSBoYW5kbGVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXV0b0hhbmRsZSk7Cit9OworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIEF0dGVtcHRzIHRvIHBhcnNlIGEgc3RyaW5nIGludG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIHBvaW50ZWQgdG8gYnkgdGhlCisvLyBudW1iZXIgcGFyYW1ldGVyLiAgUmV0dXJucyB0cnVlIGlmIHRoYXQgaXMgcG9zc2libGUuCisvLyBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHRoYXQgd2UgaGF2ZSA6OnN0ZDo6c3RyaW5nLCBzbyB3ZSBjYW4gdXNlCisvLyBpdCBoZXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIEludGVnZXI+Citib29sIFBhcnNlTmF0dXJhbE51bWJlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIEludGVnZXIqIG51bWJlcikgeworICAvLyBGYWlsIGZhc3QgaWYgdGhlIGdpdmVuIHN0cmluZyBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgZGlnaXQ7CisgIC8vIHRoaXMgYnlwYXNzZXMgc3RydG9YWFgncyAib3B0aW9uYWwgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBwbHVzCisgIC8vIG9yIG1pbnVzIHNpZ24iIHNlbWFudGljcywgd2hpY2ggYXJlIHVuZGVzaXJhYmxlIGhlcmUuCisgIGlmIChzdHIuZW1wdHkoKSB8fCAhaXNkaWdpdChzdHJbMF0pKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGVycm5vID0gMDsKKworICBjaGFyKiBlbmQ7CisgIC8vIEJpZ2dlc3RDb252ZXJ0aWJsZSBpcyB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHR5cGUgdGhhdCBzeXN0ZW0tcHJvdmlkZWQKKyAgLy8gc3RyaW5nLXRvLW51bWJlciBjb252ZXJzaW9uIHJvdXRpbmVzIGNhbiByZXR1cm4uCisjaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhZGVmaW5lZChfX0dOVUNfXykKKyAgLy8gTVNWQyBhbmQgQysrIEJ1aWxkZXIgZGVmaW5lIF9faW50NjQgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgbG9uZyBsb25nLgorICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgQmlnZ2VzdENvbnZlcnRpYmxlOworICBjb25zdCBCaWdnZXN0Q29udmVydGlibGUgcGFyc2VkID0gX3N0cnRvdWk2NChzdHIuY19zdHIoKSwgJmVuZCwgMTApOworI2Vsc2UKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQmlnZ2VzdENvbnZlcnRpYmxlOyAgLy8gTk9MSU5UCisgIGNvbnN0IEJpZ2dlc3RDb252ZXJ0aWJsZSBwYXJzZWQgPSBzdHJ0b3VsbChzdHIuY19zdHIoKSwgJmVuZCwgMTApOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQorICBjb25zdCBib29sIHBhcnNlX3N1Y2Nlc3MgPSAqZW5kID09ICdcMCcgJiYgZXJybm8gPT0gMDsKKworICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBDb252ZXJ0IHRoaXMgdG8gY29tcGlsZSB0aW1lIGFzc2VydGlvbiB3aGVuIGl0IGlzCisgIC8vIGF2YWlsYWJsZS4KKyAgR1RFU1RfQ0hFQ0tfKHNpemVvZihJbnRlZ2VyKSA8PSBzaXplb2YocGFyc2VkKSk7CisKKyAgY29uc3QgSW50ZWdlciByZXN1bHQgPSBzdGF0aWNfY2FzdDxJbnRlZ2VyPihwYXJzZWQpOworICBpZiAocGFyc2Vfc3VjY2VzcyAmJiBzdGF0aWNfY2FzdDxCaWdnZXN0Q29udmVydGlibGU+KHJlc3VsdCkgPT0gcGFyc2VkKSB7CisgICAgKm51bWJlciA9IHJlc3VsdDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFRlc3RSZXN1bHQgY29udGFpbnMgc29tZSBwcml2YXRlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGZyb20KKy8vIEdvb2dsZSBUZXN0IHVzZXIgYnV0IGFyZSByZXF1aXJlZCBmb3IgdGVzdGluZy4gVGhpcyBjbGFzcyBhbGxvdyBvdXIgdGVzdHMKKy8vIHRvIGFjY2VzcyB0aGVtLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgc3VwcGxpZWQgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93bgorLy8gY29uc3RydWN0cy4gRG8gbm90IHVzZSBpdCBpbiB1c2VyIHRlc3RzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KK2NsYXNzIFRlc3RSZXN1bHRBY2Nlc3NvciB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShUZXN0UmVzdWx0KiB0ZXN0X3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSkgeworICAgIHRlc3RfcmVzdWx0LT5SZWNvcmRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBDbGVhclRlc3RQYXJ0UmVzdWx0cyhUZXN0UmVzdWx0KiB0ZXN0X3Jlc3VsdCkgeworICAgIHRlc3RfcmVzdWx0LT5DbGVhclRlc3RQYXJ0UmVzdWx0cygpOworICB9CisKKyAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0PiYgdGVzdF9wYXJ0X3Jlc3VsdHMoCisgICAgICBjb25zdCBUZXN0UmVzdWx0JiB0ZXN0X3Jlc3VsdCkgeworICAgIHJldHVybiB0ZXN0X3Jlc3VsdC50ZXN0X3BhcnRfcmVzdWx0cygpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmggYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjkwMTMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgKQEAgLTAsMCArMSw5NDMgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oPgorCisjaWYgR1RFU1RfT1NfTElOVVgKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oPgorI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oPgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc19vc3RyZWFtLmgiCisKKy8vIER1ZSB0byBDKysgcHJlcHJvY2Vzc29yIHdlaXJkbmVzcywgd2UgbmVlZCBkb3VibGUgaW5kaXJlY3Rpb24gdG8KKy8vIGNvbmNhdGVuYXRlIHR3byB0b2tlbnMgd2hlbiBvbmUgb2YgdGhlbSBpcyBfX0xJTkVfXy4gIFdyaXRpbmcKKy8vCisvLyAgIGZvbyAjIyBfX0xJTkVfXworLy8KKy8vIHdpbGwgcmVzdWx0IGluIHRoZSB0b2tlbiBmb29fX0xJTkVfXywgaW5zdGVhZCBvZiBmb28gZm9sbG93ZWQgYnkKKy8vIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlCisvLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL21pc2MtdGVjaG5pY2FsLWlzc3Vlcy5odG1sI2ZhcS0zOS42CisjZGVmaW5lIEdURVNUX0NPTkNBVF9UT0tFTl8oZm9vLCBiYXIpIEdURVNUX0NPTkNBVF9UT0tFTl9JTVBMXyhmb28sIGJhcikKKyNkZWZpbmUgR1RFU1RfQ09OQ0FUX1RPS0VOX0lNUExfKGZvbywgYmFyKSBmb28gIyMgYmFyCisKKy8vIEdvb2dsZSBUZXN0IGRlZmluZXMgdGhlIHRlc3Rpbmc6Ok1lc3NhZ2UgY2xhc3MgdG8gYWxsb3cgY29uc3RydWN0aW9uIG9mCisvLyB0ZXN0IG1lc3NhZ2VzIHZpYSB0aGUgPDwgb3BlcmF0b3IuICBUaGUgaWRlYSBpcyB0aGF0IGFueXRoaW5nCisvLyBzdHJlYW1hYmxlIHRvIHN0ZDo6b3N0cmVhbSBjYW4gYmUgc3RyZWFtZWQgdG8gYSB0ZXN0aW5nOjpNZXNzYWdlLgorLy8gVGhpcyBhbGxvd3MgYSB1c2VyIHRvIHVzZSBoaXMgb3duIHR5cGVzIGluIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgYnkKKy8vIG92ZXJsb2FkaW5nIHRoZSA8PCBvcGVyYXRvci4KKy8vCisvLyB1dGlsL2d0bC9zdGxfbG9nZ2luZy1pbmwuaCBvdmVybG9hZHMgPDwgZm9yIFNUTCBjb250YWluZXJzLiAgVGhlc2UKKy8vIG92ZXJsb2FkcyBjYW5ub3QgYmUgZGVmaW5lZCBpbiB0aGUgc3RkIG5hbWVzcGFjZSwgYXMgdGhhdCB3aWxsIGJlCisvLyB1bmRlZmluZWQgYmVoYXZpb3IuICBUaGVyZWZvcmUsIHRoZXkgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbAorLy8gbmFtZXNwYWNlIGluc3RlYWQuCisvLworLy8gQysrJ3Mgc3ltYm9sIGxvb2t1cCBydWxlIChpLmUuIEtvZW5pZyBsb29rdXApIHNheXMgdGhhdCB0aGVzZQorLy8gb3ZlcmxvYWRzIGFyZSB2aXNpYmxlIGluIGVpdGhlciB0aGUgc3RkIG5hbWVzcGFjZSBvciB0aGUgZ2xvYmFsCisvLyBuYW1lc3BhY2UsIGJ1dCBub3Qgb3RoZXIgbmFtZXNwYWNlcywgaW5jbHVkaW5nIHRoZSB0ZXN0aW5nCisvLyBuYW1lc3BhY2Ugd2hpY2ggR29vZ2xlIFRlc3QncyBNZXNzYWdlIGNsYXNzIGlzIGluLgorLy8KKy8vIFRvIGFsbG93IFNUTCBjb250YWluZXJzIChhbmQgb3RoZXIgdHlwZXMgdGhhdCBoYXMgYSA8PCBvcGVyYXRvcgorLy8gZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSkgdG8gYmUgdXNlZCBpbiBHb29nbGUgVGVzdCBhc3NlcnRpb25zLAorLy8gdGVzdGluZzo6TWVzc2FnZSBtdXN0IGFjY2VzcyB0aGUgY3VzdG9tIDw8IG9wZXJhdG9yIGZyb20gdGhlIGdsb2JhbAorLy8gbmFtZXNwYWNlLiAgSGVuY2UgdGhpcyBoZWxwZXIgZnVuY3Rpb24uCisvLworLy8gTm90ZTogSmVmZnJleSBZYXNza2luIHN1Z2dlc3RlZCBhbiBhbHRlcm5hdGl2ZSBmaXggYnkgInVzaW5nCisvLyA6Om9wZXJhdG9yPDw7IiBpbiB0aGUgZGVmaW5pdGlvbiBvZiBNZXNzYWdlJ3Mgb3BlcmF0b3I8PC4gIFRoYXQgZml4CisvLyBkb2Vzbid0IHJlcXVpcmUgYSBoZWxwZXIgZnVuY3Rpb24sIGJ1dCB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QKKy8vIGNvbXBpbGUgd2l0aCBNU1ZDLgorCisvLyBMTFZNIElOVEVSTkFMIENIQU5HRTogVG8gYWxsb3cgb3BlcmF0b3I8PCB0byB3b3JrIHdpdGggYm90aAorLy8gc3RkOjpvc3RyZWFtcyBhbmQgTExWTSdzIHJhd19vc3RyZWFtcywgd2UgZGVmaW5lIGEgc3BlY2lhbAorLy8gc3RkOjpvc3RyZWFtIHdpdGggYW4gaW1wbGljaXQgY29udmVyc2lvbiB0byByYXdfb3N0cmVhbSYgYW5kIHN0cmVhbQorLy8gdG8gdGhhdC4gIFRoaXMgY2F1c2VzIHRoZSBjb21waWxlciB0byBwcmVmZXIgc3RkOjpvc3RyZWFtIG92ZXJsb2FkcworLy8gYnV0IHN0aWxsIGZpbmQgcmF3X29zdHJlYW0mIG92ZXJsb2Fkcy4KK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIGNvbnZlcnRpYmxlX2Z3ZF9vc3RyZWFtIDogcHVibGljIHN0ZDo6b3N0cmVhbSB7CisgIHN0ZDo6b3N0cmVhbSYgb3NfOworICByYXdfb3Nfb3N0cmVhbSByb3NfOworCitwdWJsaWM6CisgIGNvbnZlcnRpYmxlX2Z3ZF9vc3RyZWFtKHN0ZDo6b3N0cmVhbSYgb3MpCisgICAgOiBzdGQ6Om9zdHJlYW0ob3MucmRidWYoKSksIG9zXyhvcyksIHJvc18oKnRoaXMpIHt9CisgIG9wZXJhdG9yIHJhd19vc3RyZWFtJigpIHsgcmV0dXJuIHJvc187IH0KK307Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB2b2lkIEdUZXN0U3RyZWFtVG9IZWxwZXIoc3RkOjpvc3RyZWFtKiBvcywgY29uc3QgVCYgdmFsKSB7CisgIGxsdm06OmNvbnZlcnRpYmxlX2Z3ZF9vc3RyZWFtIGNvcygqb3MpOworICBjb3MgPDwgdmFsOworfQorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgY2xhc3Nlcy4KKworY2xhc3MgQXNzZXJ0aW9uUmVzdWx0OyAgICAgICAgICAgICAgICAgLy8gUmVzdWx0IG9mIGFuIGFzc2VydGlvbi4KK2NsYXNzIE1lc3NhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcHJlc2VudHMgYSBmYWlsdXJlIG1lc3NhZ2UuCitjbGFzcyBUZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgdGVzdC4KK2NsYXNzIFRlc3RJbmZvOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGEgdGVzdC4KK2NsYXNzIFRlc3RQYXJ0UmVzdWx0OyAgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBhIHRlc3QgcGFydC4KK2NsYXNzIFVuaXRUZXN0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29sbGVjdGlvbiBvZiB0ZXN0IGNhc2VzLgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdHJ1Y3QgVHJhY2VJbmZvOyAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRyYWNlIHBvaW50LgorY2xhc3MgU2NvcGVkVHJhY2U7ICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50cyBzY29wZWQgdHJhY2UuCitjbGFzcyBUZXN0SW5mb0ltcGw7ICAgICAgICAgICAgICAgICAgICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2YgVGVzdEluZm8KK2NsYXNzIFVuaXRUZXN0SW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBVbml0VGVzdAorCisvLyBIb3cgbWFueSB0aW1lcyBJbml0R29vZ2xlVGVzdCgpIGhhcyBiZWVuIGNhbGxlZC4KK2V4dGVybiBpbnQgZ19pbml0X2d0ZXN0X2NvdW50OworCisvLyBUaGUgdGV4dCB1c2VkIGluIGZhaWx1cmUgbWVzc2FnZXMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIHRoZQorLy8gc3RhY2sgdHJhY2UuCitHVEVTVF9BUElfIGV4dGVybiBjb25zdCBjaGFyIGtTdGFja1RyYWNlTWFya2VyW107CisKKy8vIEEgc2VjcmV0IHR5cGUgdGhhdCBHb29nbGUgVGVzdCB1c2VycyBkb24ndCBrbm93IGFib3V0LiAgSXQgaGFzIG5vCisvLyBkZWZpbml0aW9uIG9uIHB1cnBvc2UuICBUaGVyZWZvcmUgaXQncyBpbXBvc3NpYmxlIHRvIGNyZWF0ZSBhCisvLyBTZWNyZXQgb2JqZWN0LCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuCitjbGFzcyBTZWNyZXQ7CisKKy8vIFR3byBvdmVybG9hZGVkIGhlbHBlcnMgZm9yIGNoZWNraW5nIGF0IGNvbXBpbGUgdGltZSB3aGV0aGVyIGFuCisvLyBleHByZXNzaW9uIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQKKy8vIGNvbXBpbGUtdGltZSBpbnRlZ3JhbCBjb25zdGFudCkuICBUaGVpciByZXR1cm4gdmFsdWVzIGhhdmUKKy8vIGRpZmZlcmVudCBzaXplcywgc28gd2UgY2FuIHVzZSBzaXplb2YoKSB0byB0ZXN0IHdoaWNoIHZlcnNpb24gaXMKKy8vIHBpY2tlZCBieSB0aGUgY29tcGlsZXIuICBUaGVzZSBoZWxwZXJzIGhhdmUgbm8gaW1wbGVtZW50YXRpb25zLCBhcworLy8gd2Ugb25seSBuZWVkIHRoZWlyIHNpZ25hdHVyZXMuCisvLworLy8gR2l2ZW4gSXNOdWxsTGl0ZXJhbEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QKKy8vIHZlcnNpb24gaWYgeCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gU2VjcmV0KiwgYW5kIHBpY2sgdGhlCisvLyBzZWNvbmQgdmVyc2lvbiBvdGhlcndpc2UuICBTaW5jZSBTZWNyZXQgaXMgYSBzZWNyZXQgYW5kIGluY29tcGxldGUKKy8vIHR5cGUsIHRoZSBvbmx5IGV4cHJlc3Npb24gYSB1c2VyIGNhbiB3cml0ZSB0aGF0IGhhcyB0eXBlIFNlY3JldCogaXMKKy8vIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwuICBUaGVyZWZvcmUsIHdlIGtub3cgdGhhdCB4IGlzIGEgbnVsbAorLy8gcG9pbnRlciBsaXRlcmFsIGlmIGFuZCBvbmx5IGlmIHRoZSBmaXJzdCB2ZXJzaW9uIGlzIHBpY2tlZCBieSB0aGUKKy8vIGNvbXBpbGVyLgorY2hhciBJc051bGxMaXRlcmFsSGVscGVyKFNlY3JldCogcCk7CitjaGFyICgmSXNOdWxsTGl0ZXJhbEhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAorCisvLyBBIGNvbXBpbGUtdGltZSBib29sIGNvbnN0YW50IHRoYXQgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB4IGlzIGEKKy8vIG51bGwgcG9pbnRlciBsaXRlcmFsIChpLmUuIE5VTEwgb3IgYW55IDAtdmFsdWVkIGNvbXBpbGUtdGltZQorLy8gaW50ZWdyYWwgY29uc3RhbnQpLgorI2lmZGVmIEdURVNUX0VMTElQU0lTX05FRURTX1BPRF8KKy8vIFdlIGxvc2Ugc3VwcG9ydCBmb3IgTlVMTCBkZXRlY3Rpb24gd2hlcmUgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZQorLy8gcGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKS4KKyNkZWZpbmUgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBmYWxzZQorI2Vsc2UKKyNkZWZpbmUgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBcCisgICAgKHNpemVvZig6OnRlc3Rpbmc6OmludGVybmFsOjpJc051bGxMaXRlcmFsSGVscGVyKHgpKSA9PSAxKQorI2VuZGlmICAvLyBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfCisKKy8vIEFwcGVuZHMgdGhlIHVzZXItc3VwcGxpZWQgbWVzc2FnZSB0byB0aGUgR29vZ2xlLVRlc3QtZ2VuZXJhdGVkIG1lc3NhZ2UuCitHVEVTVF9BUElfIFN0cmluZyBBcHBlbmRVc2VyTWVzc2FnZShjb25zdCBTdHJpbmcmIGd0ZXN0X21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHVzZXJfbXNnKTsKKworLy8gQSBoZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIHNjb3BlZCB0cmFjZXMgaW4gdXNlciBwcm9ncmFtcy4KK2NsYXNzIEdURVNUX0FQSV8gU2NvcGVkVHJhY2UgeworIHB1YmxpYzoKKyAgLy8gVGhlIGMndG9yIHB1c2hlcyB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gYW5kIG1lc3NhZ2Ugb250bworICAvLyBhIHRyYWNlIHN0YWNrIG1haW50YWluZWQgYnkgR29vZ2xlIFRlc3QuCisgIFNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKworICAvLyBUaGUgZCd0b3IgcG9wcyB0aGUgaW5mbyBwdXNoZWQgYnkgdGhlIGMndG9yLgorICAvLworICAvLyBOb3RlIHRoYXQgdGhlIGQndG9yIGlzIG5vdCB2aXJ0dWFsIGluIG9yZGVyIHRvIGJlIGVmZmljaWVudC4KKyAgLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFNjb3BlZFRyYWNlIQorICB+U2NvcGVkVHJhY2UoKTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkVHJhY2UpOworfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsgIC8vIEEgU2NvcGVkVHJhY2Ugb2JqZWN0IGRvZXMgaXRzIGpvYiBpbiBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjJ3RvciBhbmQgZCd0b3IuICBUaGVyZWZvcmUgaXQgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYmUgdXNlZCBvdGhlcndpc2UuCisKKy8vIENvbnZlcnRzIGEgc3RyZWFtYWJsZSB2YWx1ZSB0byBhIFN0cmluZy4gIEEgTlVMTCBwb2ludGVyIGlzCisvLyBjb252ZXJ0ZWQgdG8gIihudWxsKSIuICBXaGVuIHRoZSBpbnB1dCB2YWx1ZSBpcyBhIDo6c3RyaW5nLAorLy8gOjpzdGQ6OnN0cmluZywgOjp3c3RyaW5nLCBvciA6OnN0ZDo6d3N0cmluZyBvYmplY3QsIGVhY2ggTlVMCisvLyBjaGFyYWN0ZXIgaW4gaXQgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KKy8vIERlY2xhcmVkIGhlcmUgYnV0IGRlZmluZWQgaW4gZ3Rlc3QuaCwgc28gdGhhdCBpdCBoYXMgYWNjZXNzCisvLyB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgTWVzc2FnZSBjbGFzcywgcmVxdWlyZWQgYnkgdGhlIEFSTQorLy8gY29tcGlsZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1N0cmluZyBTdHJlYW1hYmxlVG9TdHJpbmcoY29uc3QgVCYgc3RyZWFtYWJsZSk7CisKKy8vIEZvcm1hdHMgYSB2YWx1ZSB0byBiZSB1c2VkIGluIGEgZmFpbHVyZSBtZXNzYWdlLgorCisjaWZkZWYgR1RFU1RfTkVFRFNfSVNfUE9JTlRFUl8KKworLy8gVGhlc2UgYXJlIG5lZWRlZCBhcyB0aGUgTm9raWEgU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIGNvbXBpbGVycworLy8gY2Fubm90IGRlY2lkZSBiZXR3ZWVuIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLgorLy8gVGhlc2UgY29tcGlsZXJzIF9jYW5fIGRlY2lkZSBiZXR3ZWVuIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucworLy8gZm9yIFQgYW5kIFQqLCBzbyBhIHRyMTo6dHlwZV90cmFpdHMtbGlrZSBpc19wb2ludGVyIHdvcmtzLCBhbmQgd2UKKy8vIGNhbiBvdmVybG9hZCBvbiB0aGF0LgorCisvLyBUaGlzIG92ZXJsb2FkIG1ha2VzIHN1cmUgdGhhdCBhbGwgcG9pbnRlcnMgKGluY2x1ZGluZworLy8gdGhvc2UgdG8gY2hhciBvciB3Y2hhcl90KSBhcmUgcHJpbnRlZCBhcyByYXcgcG9pbnRlcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBTdHJpbmcgRm9ybWF0VmFsdWVGb3JGYWlsdXJlTWVzc2FnZShpbnRlcm5hbDo6dHJ1ZV90eXBlIC8qZHVtbXkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUKiBwb2ludGVyKSB7CisgIHJldHVybiBTdHJlYW1hYmxlVG9TdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHBvaW50ZXIpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgU3RyaW5nIEZvcm1hdFZhbHVlRm9yRmFpbHVyZU1lc3NhZ2UoaW50ZXJuYWw6OmZhbHNlX3R5cGUgLypkdW1teSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIHZhbHVlKSB7CisgIHJldHVybiBTdHJlYW1hYmxlVG9TdHJpbmcodmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBTdHJpbmcgRm9ybWF0Rm9yRmFpbHVyZU1lc3NhZ2UoY29uc3QgVCYgdmFsdWUpIHsKKyAgcmV0dXJuIEZvcm1hdFZhbHVlRm9yRmFpbHVyZU1lc3NhZ2UoCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6aXNfcG9pbnRlcjxUPjo6dHlwZSgpLCB2YWx1ZSk7Cit9CisKKyNlbHNlCisKKy8vIFRoZXNlIGFyZSBuZWVkZWQgYXMgdGhlIGFib3ZlIHNvbHV0aW9uIHVzaW5nIGlzX3BvaW50ZXIgaGFzIHRoZQorLy8gbGltaXRhdGlvbiB0aGF0IFQgY2Fubm90IGJlIGEgdHlwZSB3aXRob3V0IGV4dGVybmFsIGxpbmthZ2UsIHdoZW4KKy8vIGNvbXBpbGVkIHVzaW5nIE1TVkMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIFN0cmluZyBGb3JtYXRGb3JGYWlsdXJlTWVzc2FnZShjb25zdCBUJiB2YWx1ZSkgeworICByZXR1cm4gU3RyZWFtYWJsZVRvU3RyaW5nKHZhbHVlKTsKK30KKworLy8gVGhpcyBvdmVybG9hZCBtYWtlcyBzdXJlIHRoYXQgYWxsIHBvaW50ZXJzIChpbmNsdWRpbmcKKy8vIHRob3NlIHRvIGNoYXIgb3Igd2NoYXJfdCkgYXJlIHByaW50ZWQgYXMgcmF3IHBvaW50ZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgU3RyaW5nIEZvcm1hdEZvckZhaWx1cmVNZXNzYWdlKFQqIHBvaW50ZXIpIHsKKyAgcmV0dXJuIFN0cmVhbWFibGVUb1N0cmluZyhzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4ocG9pbnRlcikpOworfQorCisjZW5kaWYgIC8vIEdURVNUX05FRURTX0lTX1BPSU5URVJfCisKKy8vIFRoZXNlIG92ZXJsb2FkZWQgdmVyc2lvbnMgaGFuZGxlIG5hcnJvdyBhbmQgd2lkZSBjaGFyYWN0ZXJzLgorR1RFU1RfQVBJXyBTdHJpbmcgRm9ybWF0Rm9yRmFpbHVyZU1lc3NhZ2UoY2hhciBjaCk7CitHVEVTVF9BUElfIFN0cmluZyBGb3JtYXRGb3JGYWlsdXJlTWVzc2FnZSh3Y2hhcl90IHdjaGFyKTsKKworLy8gV2hlbiB0aGlzIG9wZXJhbmQgaXMgYSBjb25zdCBjaGFyKiBvciBjaGFyKiwgYW5kIHRoZSBvdGhlciBvcGVyYW5kCisvLyBpcyBhIDo6c3RkOjpzdHJpbmcgb3IgOjpzdHJpbmcsIHdlIHByaW50IHRoaXMgb3BlcmFuZCBhcyBhIEMgc3RyaW5nCisvLyByYXRoZXIgdGhhbiBhIHBvaW50ZXIuICBXZSBkbyB0aGUgc2FtZSBmb3Igd2lkZSBzdHJpbmdzLgorCisvLyBUaGlzIGludGVybmFsIG1hY3JvIGlzIHVzZWQgdG8gYXZvaWQgZHVwbGljYXRlZCBjb2RlLgorI2RlZmluZSBHVEVTVF9GT1JNQVRfSU1QTF8ob3BlcmFuZDJfdHlwZSwgb3BlcmFuZDFfcHJpbnRlcilcCitpbmxpbmUgU3RyaW5nIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShcCisgICAgb3BlcmFuZDJfdHlwZTo6dmFsdWVfdHlwZSogc3RyLCBjb25zdCBvcGVyYW5kMl90eXBlJiAvKm9wZXJhbmQyKi8pIHtcCisgIHJldHVybiBvcGVyYW5kMV9wcmludGVyKHN0cik7XAorfVwKK2lubGluZSBTdHJpbmcgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKFwKKyAgICBjb25zdCBvcGVyYW5kMl90eXBlOjp2YWx1ZV90eXBlKiBzdHIsIGNvbnN0IG9wZXJhbmQyX3R5cGUmIC8qb3BlcmFuZDIqLykge1wKKyAgcmV0dXJuIG9wZXJhbmQxX3ByaW50ZXIoc3RyKTtcCit9CisKK0dURVNUX0ZPUk1BVF9JTVBMXyg6OnN0ZDo6c3RyaW5nLCBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKQorI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfRk9STUFUX0lNUExfKDo6c3RkOjp3c3RyaW5nLCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZ1F1b3RlZCkKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworR1RFU1RfRk9STUFUX0lNUExfKDo6c3RyaW5nLCBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworR1RFU1RfRk9STUFUX0lNUExfKDo6d3N0cmluZywgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQpCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisjdW5kZWYgR1RFU1RfRk9STUFUX0lNUExfCisKKy8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGFuIGVxdWFsaXR5IGFzc2VydGlvbgorLy8gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfU1RSRVEsIGV0YykgZmFpbHVyZS4KKy8vCisvLyBUaGUgZmlyc3QgZm91ciBwYXJhbWV0ZXJzIGFyZSB0aGUgZXhwcmVzc2lvbnMgdXNlZCBpbiB0aGUgYXNzZXJ0aW9uCisvLyBhbmQgdGhlaXIgdmFsdWVzLCBhcyBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIGZvciBBU1NFUlRfRVEoZm9vLCBiYXIpCisvLyB3aGVyZSBmb28gaXMgNSBhbmQgYmFyIGlzIDYsIHdlIGhhdmU6CisvLworLy8gICBleHBlY3RlZF9leHByZXNzaW9uOiAiZm9vIgorLy8gICBhY3R1YWxfZXhwcmVzc2lvbjogICAiYmFyIgorLy8gICBleHBlY3RlZF92YWx1ZTogICAgICAiNSIKKy8vICAgYWN0dWFsX3ZhbHVlOiAgICAgICAgIjYiCisvLworLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQorLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIiAoaWdub3JpbmcgY2FzZSkiIHdpbGwKKy8vIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBFcUZhaWx1cmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIGV4cGVjdGVkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgYWN0dWFsX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JpbmdfY2FzZSk7CisKKy8vIENvbnN0cnVjdHMgYSBmYWlsdXJlIG1lc3NhZ2UgZm9yIEJvb2xlYW4gYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLgorR1RFU1RfQVBJXyBTdHJpbmcgR2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKAorICAgIGNvbnN0IEFzc2VydGlvblJlc3VsdCYgYXNzZXJ0aW9uX3Jlc3VsdCwKKyAgICBjb25zdCBjaGFyKiBleHByZXNzaW9uX3RleHQsCisgICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwKKyAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWUpOworCisvLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHJlcHJlc2VudHMgYW4gSUVFRSBmbG9hdGluZy1wb2ludCBudW1iZXIKKy8vIChlaXRoZXIgc2luZ2xlLXByZWNpc2lvbiBvciBkb3VibGUtcHJlY2lzaW9uLCBkZXBlbmRpbmcgb24gdGhlCisvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzKS4KKy8vCisvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGRvIG1vcmUgc29waGlzdGljYXRlZCBudW1iZXIKKy8vIGNvbXBhcmlzb24uICAoRHVlIHRvIHJvdW5kLW9mZiBlcnJvciwgZXRjLCBpdCdzIHZlcnkgdW5saWtlbHkgdGhhdAorLy8gdHdvIGZsb2F0aW5nLXBvaW50cyB3aWxsIGJlIGVxdWFsIGV4YWN0bHkuICBIZW5jZSBhIG5haXZlCisvLyBjb21wYXJpc29uIGJ5IHRoZSA9PSBvcGVyYXRpb24gb2Z0ZW4gZG9lc24ndCB3b3JrLikKKy8vCisvLyBGb3JtYXQgb2YgSUVFRSBmbG9hdGluZy1wb2ludDoKKy8vCisvLyAgIFRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBiZWluZyB0aGUgbGVmdG1vc3QsIGFuIElFRUUKKy8vICAgZmxvYXRpbmctcG9pbnQgbG9va3MgbGlrZQorLy8KKy8vICAgICBzaWduX2JpdCBleHBvbmVudF9iaXRzIGZyYWN0aW9uX2JpdHMKKy8vCisvLyAgIEhlcmUsIHNpZ25fYml0IGlzIGEgc2luZ2xlIGJpdCB0aGF0IGRlc2lnbmF0ZXMgdGhlIHNpZ24gb2YgdGhlCisvLyAgIG51bWJlci4KKy8vCisvLyAgIEZvciBmbG9hdCwgdGhlcmUgYXJlIDggZXhwb25lbnQgYml0cyBhbmQgMjMgZnJhY3Rpb24gYml0cy4KKy8vCisvLyAgIEZvciBkb3VibGUsIHRoZXJlIGFyZSAxMSBleHBvbmVudCBiaXRzIGFuZCA1MiBmcmFjdGlvbiBiaXRzLgorLy8KKy8vICAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBhdAorLy8gICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lFRUVfZmxvYXRpbmctcG9pbnRfc3RhbmRhcmQuCisvLworLy8gVGVtcGxhdGUgcGFyYW1ldGVyOgorLy8KKy8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQordGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+CitjbGFzcyBGbG9hdGluZ1BvaW50IHsKKyBwdWJsaWM6CisgIC8vIERlZmluZXMgdGhlIHVuc2lnbmVkIGludGVnZXIgdHlwZSB0aGF0IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZQorICAvLyBmbG9hdGluZyBwb2ludCBudW1iZXIuCisgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZVdpdGhTaXplPHNpemVvZihSYXdUeXBlKT46OlVJbnQgQml0czsKKworICAvLyBDb25zdGFudHMuCisKKyAgLy8gIyBvZiBiaXRzIGluIGEgbnVtYmVyLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaXRDb3VudCA9IDgqc2l6ZW9mKFJhd1R5cGUpOworCisgIC8vICMgb2YgZnJhY3Rpb24gYml0cyBpbiBhIG51bWJlci4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhY3Rpb25CaXRDb3VudCA9CisgICAgc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzIC0gMTsKKworICAvLyAjIG9mIGV4cG9uZW50IGJpdHMgaW4gYSBudW1iZXIuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0V4cG9uZW50Qml0Q291bnQgPSBrQml0Q291bnQgLSAxIC0ga0ZyYWN0aW9uQml0Q291bnQ7CisKKyAgLy8gVGhlIG1hc2sgZm9yIHRoZSBzaWduIGJpdC4KKyAgc3RhdGljIGNvbnN0IEJpdHMga1NpZ25CaXRNYXNrID0gc3RhdGljX2Nhc3Q8Qml0cz4oMSkgPDwgKGtCaXRDb3VudCAtIDEpOworCisgIC8vIFRoZSBtYXNrIGZvciB0aGUgZnJhY3Rpb24gYml0cy4KKyAgc3RhdGljIGNvbnN0IEJpdHMga0ZyYWN0aW9uQml0TWFzayA9CisgICAgfnN0YXRpY19jYXN0PEJpdHM+KDApID4+IChrRXhwb25lbnRCaXRDb3VudCArIDEpOworCisgIC8vIFRoZSBtYXNrIGZvciB0aGUgZXhwb25lbnQgYml0cy4KKyAgc3RhdGljIGNvbnN0IEJpdHMga0V4cG9uZW50Qml0TWFzayA9IH4oa1NpZ25CaXRNYXNrIHwga0ZyYWN0aW9uQml0TWFzayk7CisKKyAgLy8gSG93IG1hbnkgVUxQJ3MgKFVuaXRzIGluIHRoZSBMYXN0IFBsYWNlKSB3ZSB3YW50IHRvIHRvbGVyYXRlIHdoZW4KKyAgLy8gY29tcGFyaW5nIHR3byBudW1iZXJzLiAgVGhlIGxhcmdlciB0aGUgdmFsdWUsIHRoZSBtb3JlIGVycm9yIHdlCisgIC8vIGFsbG93LiAgQSAwIHZhbHVlIG1lYW5zIHRoYXQgdHdvIG51bWJlcnMgbXVzdCBiZSBleGFjdGx5IHRoZSBzYW1lCisgIC8vIHRvIGJlIGNvbnNpZGVyZWQgZXF1YWwuCisgIC8vCisgIC8vIFRoZSBtYXhpbXVtIGVycm9yIG9mIGEgc2luZ2xlIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbiBpcyAwLjUKKyAgLy8gdW5pdHMgaW4gdGhlIGxhc3QgcGxhY2UuICBPbiBJbnRlbCBDUFUncywgYWxsIGZsb2F0aW5nLXBvaW50CisgIC8vIGNhbGN1bGF0aW9ucyBhcmUgZG9uZSB3aXRoIDgwLWJpdCBwcmVjaXNpb24sIHdoaWxlIGRvdWJsZSBoYXMgNjQKKyAgLy8gYml0cy4gIFRoZXJlZm9yZSwgNCBzaG91bGQgYmUgZW5vdWdoIGZvciBvcmRpbmFyeSB1c2UuCisgIC8vCisgIC8vIFNlZSB0aGUgZm9sbG93aW5nIGFydGljbGUgZm9yIG1vcmUgZGV0YWlscyBvbiBVTFA6CisgIC8vIGh0dHA6Ly93d3cuY3lnbnVzLXNvZnR3YXJlLmNvbS9wYXBlcnMvY29tcGFyaW5nZmxvYXRzL2NvbXBhcmluZ2Zsb2F0cy5odG0uCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFVscHMgPSA0OworCisgIC8vIENvbnN0cnVjdHMgYSBGbG9hdGluZ1BvaW50IGZyb20gYSByYXcgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAvLworICAvLyBPbiBhbiBJbnRlbCBDUFUsIHBhc3NpbmcgYSBub24tbm9ybWFsaXplZCBOQU4gKE5vdCBhIE51bWJlcikKKyAgLy8gYXJvdW5kIG1heSBjaGFuZ2UgaXRzIGJpdHMsIGFsdGhvdWdoIHRoZSBuZXcgdmFsdWUgaXMgZ3VhcmFudGVlZAorICAvLyB0byBiZSBhbHNvIGEgTkFOLiAgVGhlcmVmb3JlLCBkb24ndCBleHBlY3QgdGhpcyBjb25zdHJ1Y3RvciB0bworICAvLyBwcmVzZXJ2ZSB0aGUgYml0cyBpbiB4IHdoZW4geCBpcyBhIE5BTi4KKyAgZXhwbGljaXQgRmxvYXRpbmdQb2ludChjb25zdCBSYXdUeXBlJiB4KSB7IHVfLnZhbHVlXyA9IHg7IH0KKworICAvLyBTdGF0aWMgbWV0aG9kcworCisgIC8vIFJlaW50ZXJwcmV0cyBhIGJpdCBwYXR0ZXJuIGFzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAvLworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCB0byB0ZXN0IHRoZSBBbG1vc3RFcXVhbHMoKSBtZXRob2QuCisgIHN0YXRpYyBSYXdUeXBlIFJlaW50ZXJwcmV0Qml0cyhjb25zdCBCaXRzIGJpdHMpIHsKKyAgICBGbG9hdGluZ1BvaW50IGZwKDApOworICAgIGZwLnVfLmJpdHNfID0gYml0czsKKyAgICByZXR1cm4gZnAudV8udmFsdWVfOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHRoYXQgcmVwcmVzZW50IHBvc2l0aXZlIGluZmluaXR5LgorICBzdGF0aWMgUmF3VHlwZSBJbmZpbml0eSgpIHsKKyAgICByZXR1cm4gUmVpbnRlcnByZXRCaXRzKGtFeHBvbmVudEJpdE1hc2spOworICB9CisKKyAgLy8gTm9uLXN0YXRpYyBtZXRob2RzCisKKyAgLy8gUmV0dXJucyB0aGUgYml0cyB0aGF0IHJlcHJlc2VudHMgdGhpcyBudW1iZXIuCisgIGNvbnN0IEJpdHMgJmJpdHMoKSBjb25zdCB7IHJldHVybiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGV4cG9uZW50IGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZXhwb25lbnRfYml0cygpIGNvbnN0IHsgcmV0dXJuIGtFeHBvbmVudEJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGZyYWN0aW9uIGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZnJhY3Rpb25fYml0cygpIGNvbnN0IHsgcmV0dXJuIGtGcmFjdGlvbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHNpZ24gYml0IG9mIHRoaXMgbnVtYmVyLgorICBCaXRzIHNpZ25fYml0KCkgY29uc3QgeyByZXR1cm4ga1NpZ25CaXRNYXNrICYgdV8uYml0c187IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgTkFOIChub3QgYSBudW1iZXIpLgorICBib29sIGlzX25hbigpIGNvbnN0IHsKKyAgICAvLyBJdCdzIGEgTkFOIGlmIHRoZSBleHBvbmVudCBiaXRzIGFyZSBhbGwgb25lcyBhbmQgdGhlIGZyYWN0aW9uCisgICAgLy8gYml0cyBhcmUgbm90IGVudGlyZWx5IHplcm9zLgorICAgIHJldHVybiAoZXhwb25lbnRfYml0cygpID09IGtFeHBvbmVudEJpdE1hc2spICYmIChmcmFjdGlvbl9iaXRzKCkgIT0gMCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgbnVtYmVyIGlzIGF0IG1vc3Qga01heFVscHMgVUxQJ3MgYXdheSBmcm9tCisgIC8vIHJocy4gIEluIHBhcnRpY3VsYXIsIHRoaXMgZnVuY3Rpb246CisgIC8vCisgIC8vICAgLSByZXR1cm5zIGZhbHNlIGlmIGVpdGhlciBudW1iZXIgaXMgKG9yIGJvdGggYXJlKSBOQU4uCisgIC8vICAgLSB0cmVhdHMgcmVhbGx5IGxhcmdlIG51bWJlcnMgYXMgYWxtb3N0IGVxdWFsIHRvIGluZmluaXR5LgorICAvLyAgIC0gdGhpbmtzICswLjAgYW5kIC0wLjAgYXJlIDAgRExQJ3MgYXBhcnQuCisgIGJvb2wgQWxtb3N0RXF1YWxzKGNvbnN0IEZsb2F0aW5nUG9pbnQmIHJocykgY29uc3QgeworICAgIC8vIFRoZSBJRUVFIHN0YW5kYXJkIHNheXMgdGhhdCBhbnkgY29tcGFyaXNvbiBvcGVyYXRpb24gaW52b2x2aW5nCisgICAgLy8gYSBOQU4gbXVzdCByZXR1cm4gZmFsc2UuCisgICAgaWYgKGlzX25hbigpIHx8IHJocy5pc19uYW4oKSkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIERpc3RhbmNlQmV0d2VlblNpZ25BbmRNYWduaXR1ZGVOdW1iZXJzKHVfLmJpdHNfLCByaHMudV8uYml0c18pCisgICAgICAgIDw9IGtNYXhVbHBzOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIGFjdHVhbCBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIHVuaW9uIEZsb2F0aW5nUG9pbnRVbmlvbiB7CisgICAgUmF3VHlwZSB2YWx1ZV87ICAvLyBUaGUgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICBCaXRzIGJpdHNfOyAgICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBudW1iZXIuCisgIH07CisKKyAgLy8gQ29udmVydHMgYW4gaW50ZWdlciBmcm9tIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24gdG8KKyAgLy8gdGhlIGJpYXNlZCByZXByZXNlbnRhdGlvbi4gIE1vcmUgcHJlY2lzZWx5LCBsZXQgTiBiZSAyIHRvIHRoZQorICAvLyBwb3dlciBvZiAoa0JpdENvdW50IC0gMSksIGFuIGludGVnZXIgeCBpcyByZXByZXNlbnRlZCBieSB0aGUKKyAgLy8gdW5zaWduZWQgbnVtYmVyIHggKyBOLgorICAvLworICAvLyBGb3IgaW5zdGFuY2UsCisgIC8vCisgIC8vICAgLU4gKyAxICh0aGUgbW9zdCBuZWdhdGl2ZSBudW1iZXIgcmVwcmVzZW50YWJsZSB1c2luZworICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDE7CisgIC8vICAgMCAgICAgIGlzIHJlcHJlc2VudGVkIGJ5IE47IGFuZAorICAvLyAgIE4gLSAxICAodGhlIGJpZ2dlc3QgbnVtYmVyIHJlcHJlc2VudGFibGUgdXNpbmcKKyAgLy8gICAgICAgICAgc2lnbi1hbmQtbWFnbml0dWRlKSBpcyByZXByZXNlbnRlZCBieSAyTiAtIDEuCisgIC8vCisgIC8vIFJlYWQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWduZWRfbnVtYmVyX3JlcHJlc2VudGF0aW9ucworICAvLyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNpZ25lZCBudW1iZXIgcmVwcmVzZW50YXRpb25zLgorICBzdGF0aWMgQml0cyBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoY29uc3QgQml0cyAmc2FtKSB7CisgICAgaWYgKGtTaWduQml0TWFzayAmIHNhbSkgeworICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBuZWdhdGl2ZSBudW1iZXIuCisgICAgICByZXR1cm4gfnNhbSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHNhbSByZXByZXNlbnRzIGEgcG9zaXRpdmUgbnVtYmVyLgorICAgICAgcmV0dXJuIGtTaWduQml0TWFzayB8IHNhbTsKKyAgICB9CisgIH0KKworICAvLyBHaXZlbiB0d28gbnVtYmVycyBpbiB0aGUgc2lnbi1hbmQtbWFnbml0dWRlIHJlcHJlc2VudGF0aW9uLAorICAvLyByZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0gYXMgYW4gdW5zaWduZWQgbnVtYmVyLgorICBzdGF0aWMgQml0cyBEaXN0YW5jZUJldHdlZW5TaWduQW5kTWFnbml0dWRlTnVtYmVycyhjb25zdCBCaXRzICZzYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaXRzICZzYW0yKSB7CisgICAgY29uc3QgQml0cyBiaWFzZWQxID0gU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKHNhbTEpOworICAgIGNvbnN0IEJpdHMgYmlhc2VkMiA9IFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChzYW0yKTsKKyAgICByZXR1cm4gKGJpYXNlZDEgPj0gYmlhc2VkMikgPyAoYmlhc2VkMSAtIGJpYXNlZDIpIDogKGJpYXNlZDIgLSBiaWFzZWQxKTsKKyAgfQorCisgIEZsb2F0aW5nUG9pbnRVbmlvbiB1XzsKK307CisKKy8vIFR5cGVkZWZzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgdGhhdCB3ZQorLy8gY2FyZSB0byB1c2UuCit0eXBlZGVmIEZsb2F0aW5nUG9pbnQ8ZmxvYXQ+IEZsb2F0OwordHlwZWRlZiBGbG9hdGluZ1BvaW50PGRvdWJsZT4gRG91YmxlOworCisvLyBJbiBvcmRlciB0byBjYXRjaCB0aGUgbWlzdGFrZSBvZiBwdXR0aW5nIHRlc3RzIHRoYXQgdXNlIGRpZmZlcmVudAorLy8gdGVzdCBmaXh0dXJlIGNsYXNzZXMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlLCB3ZSBuZWVkIHRvIGFzc2lnbgorLy8gdW5pcXVlIElEcyB0byBmaXh0dXJlIGNsYXNzZXMgYW5kIGNvbXBhcmUgdGhlbS4gIFRoZSBUeXBlSWQgdHlwZSBpcworLy8gdXNlZCB0byBob2xkIHN1Y2ggSURzLiAgVGhlIHVzZXIgc2hvdWxkIHRyZWF0IFR5cGVJZCBhcyBhbiBvcGFxdWUKKy8vIHR5cGU6IHRoZSBvbmx5IG9wZXJhdGlvbiBhbGxvd2VkIG9uIFR5cGVJZCB2YWx1ZXMgaXMgdG8gY29tcGFyZQorLy8gdGhlbSBmb3IgZXF1YWxpdHkgdXNpbmcgdGhlID09IG9wZXJhdG9yLgordHlwZWRlZiBjb25zdCB2b2lkKiBUeXBlSWQ7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZUlkSGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIGR1bW15XyBtdXN0IG5vdCBoYXZlIGEgY29uc3QgdHlwZS4gIE90aGVyd2lzZSBhbiBvdmVybHkgZWFnZXIKKyAgLy8gY29tcGlsZXIgKGUuZy4gTVNWQyA3LjEgJiA4LjApIG1heSB0cnkgdG8gbWVyZ2UKKyAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gZm9yIGRpZmZlcmVudCBUcyBhcyBhbiAib3B0aW1pemF0aW9uIi4KKyAgc3RhdGljIGJvb2wgZHVtbXlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfID0gZmFsc2U7CisKKy8vIEdldFR5cGVJZDxUPigpIHJldHVybnMgdGhlIElEIG9mIHR5cGUgVC4gIERpZmZlcmVudCB2YWx1ZXMgd2lsbCBiZQorLy8gcmV0dXJuZWQgZm9yIGRpZmZlcmVudCB0eXBlcy4gIENhbGxpbmcgdGhlIGZ1bmN0aW9uIHR3aWNlIHdpdGggdGhlCisvLyBzYW1lIHR5cGUgYXJndW1lbnQgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgSUQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1R5cGVJZCBHZXRUeXBlSWQoKSB7CisgIC8vIFRoZSBjb21waWxlciBpcyByZXF1aXJlZCB0byBhbGxvY2F0ZSBhIGRpZmZlcmVudAorICAvLyBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyB2YXJpYWJsZSBmb3IgZWFjaCBUIHVzZWQgdG8gaW5zdGFudGlhdGUKKyAgLy8gdGhlIHRlbXBsYXRlLiAgVGhlcmVmb3JlLCB0aGUgYWRkcmVzcyBvZiBkdW1teV8gaXMgZ3VhcmFudGVlZCB0bworICAvLyBiZSB1bmlxdWUuCisgIHJldHVybiAmKFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfKTsKK30KKworLy8gUmV0dXJucyB0aGUgdHlwZSBJRCBvZiA6OnRlc3Rpbmc6OlRlc3QuICBBbHdheXMgY2FsbCB0aGlzIGluc3RlYWQKKy8vIG9mIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIGdldCB0aGUgdHlwZSBJRCBvZgorLy8gOjp0ZXN0aW5nOjpUZXN0LCBhcyB0aGUgbGF0dGVyIG1heSBnaXZlIHRoZSB3cm9uZyByZXN1bHQgZHVlIHRvIGEKKy8vIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4gY29tcGlsaW5nIEdvb2dsZSBUZXN0IGFzIGEgTWFjIE9TIFgKKy8vIGZyYW1ld29yay4KK0dURVNUX0FQSV8gVHlwZUlkIEdldFRlc3RUeXBlSWQoKTsKKworLy8gRGVmaW5lcyB0aGUgYWJzdHJhY3QgZmFjdG9yeSBpbnRlcmZhY2UgdGhhdCBjcmVhdGVzIGluc3RhbmNlcworLy8gb2YgYSBUZXN0IG9iamVjdC4KK2NsYXNzIFRlc3RGYWN0b3J5QmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UZXN0RmFjdG9yeUJhc2UoKSB7fQorCisgIC8vIENyZWF0ZXMgYSB0ZXN0IGluc3RhbmNlIHRvIHJ1bi4gVGhlIGluc3RhbmNlIGlzIGJvdGggY3JlYXRlZCBhbmQgZGVzdHJveWVkCisgIC8vIHdpdGhpbiBUZXN0SW5mb0ltcGw6OlJ1bigpCisgIHZpcnR1YWwgVGVzdCogQ3JlYXRlVGVzdCgpID0gMDsKKworIHByb3RlY3RlZDoKKyAgVGVzdEZhY3RvcnlCYXNlKCkge30KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEZhY3RvcnlCYXNlKTsKK307CisKKy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gb2YgVGVhc3RGYWN0b3J5QmFzZSBpbnRlcmZhY2UuCisvLyBJdCBpcyB1c2VkIGluIFRFU1QgYW5kIFRFU1RfRiBtYWNyb3MuCit0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPgorY2xhc3MgVGVzdEZhY3RvcnlJbXBsIDogcHVibGljIFRlc3RGYWN0b3J5QmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSB7IHJldHVybiBuZXcgVGVzdENsYXNzOyB9Cit9OworCisjaWYgR1RFU1RfT1NfV0lORE9XUworCisvLyBQcmVkaWNhdGUtZm9ybWF0dGVycyBmb3IgaW1wbGVtZW50aW5nIHRoZSBIUkVTVUxUIGNoZWNraW5nIG1hY3JvcworLy8ge0FTU0VSVHxFWFBFQ1R9X0hSRVNVTFRfe1NVQ0NFRURFRHxGQUlMRUR9CisvLyBXZSBwYXNzIGEgbG9uZyBpbnN0ZWFkIG9mIEhSRVNVTFQgdG8gYXZvaWQgY2F1c2luZyBhbgorLy8gaW5jbHVkZSBkZXBlbmRlbmN5IGZvciB0aGUgSFJFU1VMVCB0eXBlLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxUU3VjY2Vzcyhjb25zdCBjaGFyKiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKTsgIC8vIE5PTElOVAorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxURmFpbHVyZShjb25zdCBjaGFyKiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKTsgIC8vIE5PTElOVAorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKKy8vIGluIGEgY29tcGlsZXIgZXJyb3IgbWVzc2FnZS4KK2lubGluZSBTdHJpbmcgRm9ybWF0RmlsZUxvY2F0aW9uKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfbmFtZSA9IGZpbGUgPT0gTlVMTCA/ICJ1bmtub3duIGZpbGUiIDogZmlsZTsKKyAgaWYgKGxpbmUgPCAwKSB7CisgICAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlczoiLCBmaWxlX25hbWUpOworICB9CisjaWZkZWYgX01TQ19WRVIKKyAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlcyglZCk6IiwgZmlsZV9uYW1lLCBsaW5lKTsKKyNlbHNlCisgIHJldHVybiBTdHJpbmc6OkZvcm1hdCgiJXM6JWQ6IiwgZmlsZV9uYW1lLCBsaW5lKTsKKyNlbmRpZiAgLy8gX01TQ19WRVIKK30KKworLy8gVHlwZXMgb2YgU2V0VXBUZXN0Q2FzZSgpIGFuZCBUZWFyRG93blRlc3RDYXNlKCkgZnVuY3Rpb25zLgordHlwZWRlZiB2b2lkICgqU2V0VXBUZXN0Q2FzZUZ1bmMpKCk7Cit0eXBlZGVmIHZvaWQgKCpUZWFyRG93blRlc3RDYXNlRnVuYykoKTsKKworLy8gQ3JlYXRlcyBhIG5ldyBUZXN0SW5mbyBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEdvb2dsZSBUZXN0OworLy8gcmV0dXJucyB0aGUgY3JlYXRlZCBvYmplY3QuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6ICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIG5hbWU6ICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QKKy8vICAgdGVzdF9jYXNlX2NvbW1lbnQ6IGEgY29tbWVudCBvbiB0aGUgdGVzdCBjYXNlIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbgorLy8gICAgICAgICAgICAgICAgICAgICAgdGhlIHRlc3Qgb3V0cHV0CisvLyAgIGNvbW1lbnQ6ICAgICAgICAgIGEgY29tbWVudCBvbiB0aGUgdGVzdCB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisvLyAgICAgICAgICAgICAgICAgICAgIHRlc3Qgb3V0cHV0CisvLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKy8vICAgc2V0X3VwX3RjOiAgICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKy8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIG5ld2x5IGNyZWF0ZWQgVGVzdEluZm8gaW5zdGFuY2Ugd2lsbCBhc3N1bWUKKy8vICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KK0dURVNUX0FQSV8gVGVzdEluZm8qIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLCBjb25zdCBjaGFyKiBuYW1lLAorICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9jb21tZW50LCBjb25zdCBjaGFyKiBjb21tZW50LAorICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKKworLy8gSWYgKnBzdHIgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgbW9kaWZpZXMgKnBzdHIgdG8gYmUgcmlnaHQKKy8vIHBhc3QgdGhlIHByZWZpeCBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICpwc3RyIHVuY2hhbmdlZAorLy8gYW5kIHJldHVybnMgZmFsc2UuICBOb25lIG9mIHBzdHIsICpwc3RyLCBhbmQgcHJlZml4IGNhbiBiZSBOVUxMLgorYm9vbCBTa2lwUHJlZml4KGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhcioqIHBzdHIpOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBTdGF0ZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCitjbGFzcyBHVEVTVF9BUElfIFR5cGVkVGVzdENhc2VQU3RhdGUgeworIHB1YmxpYzoKKyAgVHlwZWRUZXN0Q2FzZVBTdGF0ZSgpIDogcmVnaXN0ZXJlZF8oZmFsc2UpIHt9CisKKyAgLy8gQWRkcyB0aGUgZ2l2ZW4gdGVzdCBuYW1lIHRvIGRlZmluZWRfdGVzdF9uYW1lc18gYW5kIHJldHVybiB0cnVlCisgIC8vIGlmIHRoZSB0ZXN0IGNhc2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZDsgb3RoZXJ3aXNlIGFib3J0cyB0aGUKKyAgLy8gcHJvZ3JhbS4KKyAgYm9vbCBBZGRUZXN0TmFtZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfbmFtZSkgeworICAgIGlmIChyZWdpc3RlcmVkXykgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBUZXN0ICVzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgIgorICAgICAgICAgICAgICAiUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoJXMsIC4uLikuXG4iLAorICAgICAgICAgICAgICBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwgdGVzdF9uYW1lLCBjYXNlX25hbWUpOworICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICBwb3NpeDo6QWJvcnQoKTsKKyAgICB9CisgICAgZGVmaW5lZF90ZXN0X25hbWVzXy5pbnNlcnQodGVzdF9uYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbgorICAvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKyAgLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KKyAgY29uc3QgY2hhciogVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygKKyAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKTsKKworIHByaXZhdGU6CisgIGJvb2wgcmVnaXN0ZXJlZF87CisgIDo6c3RkOjpzZXQ8Y29uc3QgY2hhcio+IGRlZmluZWRfdGVzdF9uYW1lc187Cit9OworCisvLyBTa2lwcyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXIgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluICdzdHInOworLy8gcmV0dXJucyBOVUxMIGlmIG5vIGNvbW1hIGlzIGZvdW5kIGluICdzdHInLgoraW5saW5lIGNvbnN0IGNoYXIqIFNraXBDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOworICBpZiAoY29tbWEgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHdoaWxlIChpc3NwYWNlKCooKytjb21tYSkpKSB7fQorICByZXR1cm4gY29tbWE7Cit9CisKKy8vIFJldHVybnMgdGhlIHByZWZpeCBvZiAnc3RyJyBiZWZvcmUgdGhlIGZpcnN0IGNvbW1hIGluIGl0OyByZXR1cm5zCisvLyB0aGUgZW50aXJlIHN0cmluZyBpZiBpdCBjb250YWlucyBubyBjb21tYS4KK2lubGluZSBTdHJpbmcgR2V0UHJlZml4VW50aWxDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOworICByZXR1cm4gY29tbWEgPT0gTlVMTCA/IFN0cmluZyhzdHIpIDogU3RyaW5nKHN0ciwgY29tbWEgLSBzdHIpOworfQorCisvLyBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgVHlwZXM+OjpSZWdpc3RlcigpCisvLyByZWdpc3RlcnMgYSBsaXN0IG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0LiAgVGhlCisvLyByZXR1cm4gdmFsdWUgaXMgaW5zaWduaWZpY2FudCAtIHdlIGp1c3QgbmVlZCB0byByZXR1cm4gc29tZXRoaW5nCisvLyBzdWNoIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSBzY29wZS4KKy8vCisvLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBUaGUgR1RFU1RfVEVNUExBVEVfIG1hY3JvIGRlY2xhcmVzIGEgdGVtcGxhdGUKKy8vIHRlbXBsYXRlIHBhcmFtZXRlci4gIEl0J3MgZGVmaW5lZCBpbiBndGVzdC10eXBlLXV0aWwuaC4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgY2xhc3MgVGVzdFNlbCwgdHlwZW5hbWUgVHlwZXM+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3QgeworIHB1YmxpYzoKKyAgLy8gJ2luZGV4JyBpcyB0aGUgaW5kZXggb2YgdGhlIHRlc3QgaW4gdGhlIHR5cGUgbGlzdCAnVHlwZXMnCisgIC8vIHNwZWNpZmllZCBpbiBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChQcmVmaXgsIFRlc3RDYXNlLAorICAvLyBUeXBlcykuICBWYWxpZCB2YWx1ZXMgZm9yICdpbmRleCcgYXJlIFswLCBOIC0gMV0gd2hlcmUgTiBpcyB0aGUKKyAgLy8gbGVuZ3RoIG9mIFR5cGVzLgorICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9uYW1lcywgaW50IGluZGV4KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlczo6SGVhZCBUeXBlOworICAgIHR5cGVkZWYgRml4dHVyZTxUeXBlPiBGaXh0dXJlQ2xhc3M7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBHVEVTVF9CSU5EXyhUZXN0U2VsLCBUeXBlKSBUZXN0Q2xhc3M7CisKKyAgICAvLyBGaXJzdCwgcmVnaXN0ZXJzIHRoZSBmaXJzdCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBpbiB0aGUgdHlwZQorICAgIC8vIGxpc3QuCisgICAgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgICAgIFN0cmluZzo6Rm9ybWF0KCIlcyVzJXMvJWQiLCBwcmVmaXgsIHByZWZpeFswXSA9PSAnXDAnID8gIiIgOiAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgIGNhc2VfbmFtZSwgaW5kZXgpLmNfc3RyKCksCisgICAgICAgIEdldFByZWZpeFVudGlsQ29tbWEodGVzdF9uYW1lcykuY19zdHIoKSwKKyAgICAgICAgU3RyaW5nOjpGb3JtYXQoIlR5cGVQYXJhbSA9ICVzIiwgR2V0VHlwZU5hbWU8VHlwZT4oKS5jX3N0cigpKS5jX3N0cigpLAorICAgICAgICAiIiwKKyAgICAgICAgR2V0VHlwZUlkPEZpeHR1cmVDbGFzcz4oKSwKKyAgICAgICAgVGVzdENsYXNzOjpTZXRVcFRlc3RDYXNlLAorICAgICAgICBUZXN0Q2xhc3M6OlRlYXJEb3duVGVzdENhc2UsCisgICAgICAgIG5ldyBUZXN0RmFjdG9yeUltcGw8VGVzdENsYXNzPik7CisKKyAgICAvLyBOZXh0LCByZWN1cnNlcyAoYXQgY29tcGlsZSB0aW1lKSB3aXRoIHRoZSB0YWlsIG9mIHRoZSB0eXBlIGxpc3QuCisgICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCB0eXBlbmFtZSBUeXBlczo6VGFpbD4KKyAgICAgICAgOjpSZWdpc3RlcihwcmVmaXgsIGNhc2VfbmFtZSwgdGVzdF9uYW1lcywgaW5kZXggKyAxKTsKKyAgfQorfTsKKworLy8gVGhlIGJhc2UgY2FzZSBmb3IgdGhlIGNvbXBpbGUgdGltZSByZWN1cnNpb24uCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIGNsYXNzIFRlc3RTZWw+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgVHlwZXMwPiB7CisgcHVibGljOgorICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiAvKnByZWZpeCovLCBjb25zdCBjaGFyKiAvKmNhc2VfbmFtZSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKnRlc3RfbmFtZXMqLywgaW50IC8qaW5kZXgqLykgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCisvLyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIFRlc3RzLCBUeXBlcz46OlJlZ2lzdGVyKCkKKy8vIHJlZ2lzdGVycyAqYWxsIGNvbWJpbmF0aW9ucyogb2YgJ1Rlc3RzJyBhbmQgJ1R5cGVzJyB3aXRoIEdvb2dsZQorLy8gVGVzdC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgaW5zaWduaWZpY2FudCAtIHdlIGp1c3QgbmVlZCB0byByZXR1cm4KKy8vIHNvbWV0aGluZyBzdWNoIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSBzY29wZS4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgdHlwZW5hbWUgVGVzdHMsIHR5cGVuYW1lIFR5cGVzPgorY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZSB7CisgcHVibGljOgorICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9uYW1lcykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgVGVzdHM6OkhlYWQgSGVhZDsKKworICAgIC8vIEZpcnN0LCByZWdpc3RlciB0aGUgZmlyc3QgdGVzdCBpbiAnVGVzdCcgZm9yIGVhY2ggdHlwZSBpbiAnVHlwZXMnLgorICAgIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBIZWFkLCBUeXBlcz46OlJlZ2lzdGVyKAorICAgICAgICBwcmVmaXgsIGNhc2VfbmFtZSwgdGVzdF9uYW1lcywgMCk7CisKKyAgICAvLyBOZXh0LCByZWN1cnNlcyAoYXQgY29tcGlsZSB0aW1lKSB3aXRoIHRoZSB0YWlsIG9mIHRoZSB0ZXN0IGxpc3QuCisgICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Rml4dHVyZSwgdHlwZW5hbWUgVGVzdHM6OlRhaWwsIFR5cGVzPgorICAgICAgICA6OlJlZ2lzdGVyKHByZWZpeCwgY2FzZV9uYW1lLCBTa2lwQ29tbWEodGVzdF9uYW1lcykpOworICB9Cit9OworCisvLyBUaGUgYmFzZSBjYXNlIGZvciB0aGUgY29tcGlsZSB0aW1lIHJlY3Vyc2lvbi4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgdHlwZW5hbWUgVHlwZXM+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIFRlbXBsYXRlczAsIFR5cGVzPiB7CisgcHVibGljOgorICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiAvKnByZWZpeCovLCBjb25zdCBjaGFyKiAvKmNhc2VfbmFtZSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKnRlc3RfbmFtZXMqLykgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhIFN0cmluZy4KKy8vCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKy8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAorLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKy8vIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoLi4uLCAxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbgorLy8gdGhlIHRyYWNlIGJ1dCBCYXIoKSBhbmQgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0LgorR1RFU1RfQVBJXyBTdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChVbml0VGVzdCogdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcF9jb3VudCk7CisKKy8vIEhlbHBlcnMgZm9yIHN1cHByZXNzaW5nIHdhcm5pbmdzIG9uIHVucmVhY2hhYmxlIGNvZGUgb3IgY29uc3RhbnQKKy8vIGNvbmRpdGlvbi4KKworLy8gQWx3YXlzIHJldHVybnMgdHJ1ZS4KK0dURVNUX0FQSV8gYm9vbCBBbHdheXNUcnVlKCk7CisKKy8vIEFsd2F5cyByZXR1cm5zIGZhbHNlLgoraW5saW5lIGJvb2wgQWx3YXlzRmFsc2UoKSB7IHJldHVybiAhQWx3YXlzVHJ1ZSgpOyB9CisKKy8vIEEgc2ltcGxlIExpbmVhciBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIGZvciBnZW5lcmF0aW5nIHJhbmRvbQorLy8gbnVtYmVycyB3aXRoIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uICBVbmxpa2UgcmFuZCgpIGFuZCBzcmFuZCgpLCBpdAorLy8gZG9lc24ndCB1c2UgZ2xvYmFsIHN0YXRlIChhbmQgdGhlcmVmb3JlIGNhbid0IGludGVyZmVyZSB3aXRoIHVzZXIKKy8vIGNvZGUpLiAgVW5saWtlIHJhbmRfcigpLCBpdCdzIHBvcnRhYmxlLiAgQW4gTENHIGlzbid0IHZlcnkgcmFuZG9tLAorLy8gYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4KK2NsYXNzIEdURVNUX0FQSV8gUmFuZG9tIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBVSW50MzIga01heFJhbmdlID0gMXUgPDwgMzE7CisKKyAgZXhwbGljaXQgUmFuZG9tKFVJbnQzMiBzZWVkKSA6IHN0YXRlXyhzZWVkKSB7fQorCisgIHZvaWQgUmVzZWVkKFVJbnQzMiBzZWVkKSB7IHN0YXRlXyA9IHNlZWQ7IH0KKworICAvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcworICAvLyAwIG9yIGdyZWF0ZXIgdGhhbiBrTWF4UmFuZ2UuCisgIFVJbnQzMiBHZW5lcmF0ZShVSW50MzIgcmFuZ2UpOworCisgcHJpdmF0ZToKKyAgVUludDMyIHN0YXRlXzsKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSYW5kb20pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZGVmaW5lIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIHJlc3VsdF90eXBlKSBcCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFzc2VydEhlbHBlcihyZXN1bHRfdHlwZSwgX19GSUxFX18sIF9fTElORV9fLCBtZXNzYWdlKSBcCisgICAgPSA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorCisjZGVmaW5lIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKG1lc3NhZ2UpIFwKKyAgcmV0dXJuIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUpCisKKyNkZWZpbmUgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8obWVzc2FnZSkgXAorICBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlKQorCisjZGVmaW5lIEdURVNUX1NVQ0NFU1NfKG1lc3NhZ2UpIFwKKyAgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpCisKKy8vIFN1cHByZXNzZXMgTVNWQyB3YXJuaW5ncyA0MDcyICh1bnJlYWNoYWJsZSBjb2RlKSBmb3IgdGhlIGNvZGUgZm9sbG93aW5nCisvLyBzdGF0ZW1lbnQgaWYgaXQgcmV0dXJucyBvciB0aHJvd3MgKG9yIGRvZXNuJ3QgcmV0dXJuIG9yIHRocm93IGluIHNvbWUKKy8vIHNpdHVhdGlvbnMpLgorI2RlZmluZSBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCkgXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfQorCisjZGVmaW5lIEdURVNUX1RFU1RfVEhST1dfKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKGNvbnN0IGNoYXIqIGd0ZXN0X21zZyA9ICIiKSB7IFwKKyAgICBib29sIGd0ZXN0X2NhdWdodF9leHBlY3RlZCA9IGZhbHNlOyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKGV4cGVjdGVkX2V4Y2VwdGlvbiBjb25zdCYpIHsgXAorICAgICAgZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkID0gdHJ1ZTsgXAorICAgIH0gXAorICAgIGNhdGNoICguLi4pIHsgXAorICAgICAgZ3Rlc3RfbXNnID0gIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiBcCisgICAgICAgICAgICAgICAgICAjZXhwZWN0ZWRfZXhjZXB0aW9uICIuXG4gIEFjdHVhbDogaXQgdGhyb3dzIGEgZGlmZmVyZW50ICIgXAorICAgICAgICAgICAgICAgICAgInR5cGUuIjsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTsgXAorICAgIH0gXAorICAgIGlmICghZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkKSB7IFwKKyAgICAgIGd0ZXN0X21zZyA9ICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlICIgXAorICAgICAgICAgICAgICAgICAgI2V4cGVjdGVkX2V4Y2VwdGlvbiAiLlxuICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiI7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTogXAorICAgICAgZmFpbChndGVzdF9tc2cpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKGNvbnN0IGNoYXIqIGd0ZXN0X21zZyA9ICIiKSB7IFwKKyAgICB0cnkgeyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICB9IFwKKyAgICBjYXRjaCAoLi4uKSB7IFwKKyAgICAgIGd0ZXN0X21zZyA9ICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24uXG4iIFwKKyAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogaXQgdGhyb3dzLiI7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm90aHJvd18sIF9fTElORV9fKTsgXAorICAgIH0gXAorICB9IGVsc2UgXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vdGhyb3dfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoZ3Rlc3RfbXNnKQorCisjZGVmaW5lIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoY29uc3QgY2hhciogZ3Rlc3RfbXNnID0gIiIpIHsgXAorICAgIGJvb2wgZ3Rlc3RfY2F1Z2h0X2FueSA9IGZhbHNlOyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKC4uLikgeyBcCisgICAgICBndGVzdF9jYXVnaHRfYW55ID0gdHJ1ZTsgXAorICAgIH0gXAorICAgIGlmICghZ3Rlc3RfY2F1Z2h0X2FueSkgeyBcCisgICAgICBndGVzdF9tc2cgPSAiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24uXG4iIFwKKyAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogaXQgZG9lc24ndC4iOyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdGFueXRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0YW55dGhyb3dfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoZ3Rlc3RfbXNnKQorCisKKy8vIEltcGxlbWVudHMgQm9vbGVhbiB0ZXN0IGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4gZXhwcmVzc2lvbiBjYW4gYmUKKy8vIGVpdGhlciBhIGJvb2xlYW4gZXhwcmVzc2lvbiBvciBhbiBBc3NlcnRpb25SZXN1bHQuIHRleHQgaXMgYSB0ZXh0dWFsCisvLyByZXByZXNlbmF0aW9uIG9mIGV4cHJlc3Npb24gYXMgaXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBFWFBFQ1RfVFJVRS4KKyNkZWZpbmUgR1RFU1RfVEVTVF9CT09MRUFOXyhleHByZXNzaW9uLCB0ZXh0LCBhY3R1YWwsIGV4cGVjdGVkLCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyXyA9IFwKKyAgICAgIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0KGV4cHJlc3Npb24pKSBcCisgICAgOyBcCisgIGVsc2UgXAorICAgIGZhaWwoOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKFwKKyAgICAgICAgZ3Rlc3RfYXJfLCB0ZXh0LCAjYWN0dWFsLCAjZXhwZWN0ZWQpLmNfc3RyKCkpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoY29uc3QgY2hhciogZ3Rlc3RfbXNnID0gIiIpIHsgXAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlciBndGVzdF9mYXRhbF9mYWlsdXJlX2NoZWNrZXI7IFwKKyAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICBpZiAoZ3Rlc3RfZmF0YWxfZmFpbHVyZV9jaGVja2VyLmhhc19uZXdfZmF0YWxfZmFpbHVyZSgpKSB7IFwKKyAgICAgIGd0ZXN0X21zZyA9ICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCBnZW5lcmF0ZSBuZXcgZmF0YWwgIiBcCisgICAgICAgICAgICAgICAgICAiZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLlxuIiBcCisgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGl0IGRvZXMuIjsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub2ZhdGFsXywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm9mYXRhbF8sIF9fTElORV9fKTogXAorICAgICAgZmFpbChndGVzdF9tc2cpCisKKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgZ2l2ZW4gdGVzdC4KKyNkZWZpbmUgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0CisKKy8vIEhlbHBlciBtYWNybyBmb3IgZGVmaW5pbmcgdGVzdHMuCisjZGVmaW5lIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIHBhcmVudF9jbGFzcywgcGFyZW50X2lkKVwKK2NsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgOiBwdWJsaWMgcGFyZW50X2NsYXNzIHtcCisgcHVibGljOlwKKyAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSgpIHt9XAorIHByaXZhdGU6XAorICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTtcCisgIHN0YXRpYyA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm9fO1wKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhcCisgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKTtcCit9O1wKK1wKKzo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCisgIDo6dGVzdF9pbmZvXyA9XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKFwKKyAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCAjdGVzdF9uYW1lLCAiIiwgIiIsIFwKKyAgICAgICAgKHBhcmVudF9pZCksIFwKKyAgICAgICAgcGFyZW50X2NsYXNzOjpTZXRVcFRlc3RDYXNlLCBcCisgICAgICAgIHBhcmVudF9jbGFzczo6VGVhckRvd25UZXN0Q2FzZSwgXAorICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdEZhY3RvcnlJbXBsPFwKKyAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KTtcCit2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDA0ZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaApAQCAtMCwwICsxLDI0MyBAQAorLy8gQ29weXJpZ2h0IDIwMDMgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogRGFuIEVnbm9yIChlZ25vckBnb29nbGUuY29tKQorLy8KKy8vIEEgInNtYXJ0IiBwb2ludGVyIHR5cGUgd2l0aCByZWZlcmVuY2UgdHJhY2tpbmcuICBFdmVyeSBwb2ludGVyIHRvIGEKKy8vIHBhcnRpY3VsYXIgb2JqZWN0IGlzIGtlcHQgb24gYSBjaXJjdWxhciBsaW5rZWQgbGlzdC4gIFdoZW4gdGhlIGxhc3QgcG9pbnRlcgorLy8gdG8gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZCBvciByZWFzc2lnbmVkLCB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCisvLworLy8gVXNlZCBwcm9wZXJseSwgdGhpcyBkZWxldGVzIHRoZSBvYmplY3Qgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgZ29lcyBhd2F5LgorLy8gVGhlcmUgYXJlIHNldmVyYWwgY2F2ZWF0czoKKy8vIC0gTGlrZSBhbGwgcmVmZXJlbmNlIGNvdW50aW5nIHNjaGVtZXMsIGN5Y2xlcyBsZWFkIHRvIGxlYWtzLgorLy8gLSBFYWNoIHNtYXJ0IHBvaW50ZXIgaXMgYWN0dWFsbHkgdHdvIHBvaW50ZXJzICg4IGJ5dGVzIGluc3RlYWQgb2YgNCkuCisvLyAtIEV2ZXJ5IHRpbWUgYSBwb2ludGVyIGlzIGFzc2lnbmVkLCB0aGUgZW50aXJlIGxpc3Qgb2YgcG9pbnRlcnMgdG8gdGhhdAorLy8gICBvYmplY3QgaXMgdHJhdmVyc2VkLiAgVGhpcyBjbGFzcyBpcyB0aGVyZWZvcmUgTk9UIFNVSVRBQkxFIHdoZW4gdGhlcmUKKy8vICAgd2lsbCBvZnRlbiBiZSBtb3JlIHRoYW4gdHdvIG9yIHRocmVlIHBvaW50ZXJzIHRvIGEgcGFydGljdWxhciBvYmplY3QuCisvLyAtIFJlZmVyZW5jZXMgYXJlIG9ubHkgdHJhY2tlZCBhcyBsb25nIGFzIGxpbmtlZF9wdHI8PiBvYmplY3RzIGFyZSBjb3BpZWQuCisvLyAgIElmIGEgbGlua2VkX3B0cjw+IGlzIGNvbnZlcnRlZCB0byBhIHJhdyBwb2ludGVyIGFuZCBiYWNrLCBCQUQgVEhJTkdTCisvLyAgIHdpbGwgaGFwcGVuIChkb3VibGUgZGVsZXRpb24pLgorLy8KKy8vIEEgZ29vZCB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBzdG9yaW5nIG9iamVjdCByZWZlcmVuY2VzIGluIFNUTCBjb250YWluZXJzLgorLy8gWW91IGNhbiBzYWZlbHkgcHV0IGxpbmtlZF9wdHI8PiBpbiBhIHZlY3Rvcjw+LgorLy8gT3RoZXIgdXNlcyBtYXkgbm90IGJlIGFzIGdvb2QuCisvLworLy8gTm90ZTogSWYgeW91IHVzZSBhbiBpbmNvbXBsZXRlIHR5cGUgd2l0aCBsaW5rZWRfcHRyPD4sIHRoZSBjbGFzcworLy8gKmNvbnRhaW5pbmcqIGxpbmtlZF9wdHI8PiBtdXN0IGhhdmUgYSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciAoZXZlbgorLy8gaWYgdGhleSBkbyBub3RoaW5nISkuCisvLworLy8gQmlsbCBHaWJib25zIHN1Z2dlc3RlZCB3ZSB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcy4KKy8vCisvLyBUaHJlYWQgU2FmZXR5OgorLy8gICBVbmxpa2Ugb3RoZXIgbGlua2VkX3B0ciBpbXBsZW1lbnRhdGlvbnMsIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKy8vICAgYSBsaW5rZWRfcHRyIG9iamVjdCBpcyB0aHJlYWQtc2FmZSBpbiB0aGUgc2Vuc2UgdGhhdDoKKy8vICAgICAtIGl0J3Mgc2FmZSB0byBjb3B5IGxpbmtlZF9wdHIgb2JqZWN0cyBjb25jdXJyZW50bHksCisvLyAgICAgLSBpdCdzIHNhZmUgdG8gY29weSAqZnJvbSogYSBsaW5rZWRfcHRyIGFuZCByZWFkIGl0cyB1bmRlcmx5aW5nCisvLyAgICAgICByYXcgcG9pbnRlciAoZS5nLiB2aWEgZ2V0KCkpIGNvbmN1cnJlbnRseSwgYW5kCisvLyAgICAgLSBpdCdzIHNhZmUgdG8gd3JpdGUgdG8gdHdvIGxpbmtlZF9wdHJzIHRoYXQgcG9pbnQgdG8gdGhlIHNhbWUKKy8vICAgICAgIHNoYXJlZCBvYmplY3QgY29uY3VycmVudGx5LgorLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbmFtZSB0aGlzIHRvIHNhZmVfbGlua2VkX3B0ciB0byBhdm9pZAorLy8gY29uZnVzaW9uIHdpdGggbm9ybWFsIGxpbmtlZF9wdHIuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0Lmg+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFByb3RlY3RzIGNvcHlpbmcgb2YgYWxsIGxpbmtlZF9wdHIgb2JqZWN0cy4KK0dURVNUX0FQSV8gR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKGdfbGlua2VkX3B0cl9tdXRleCk7CisKKy8vIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IGFsbCBpbnN0YW5jZXMgb2YgbGlua2VkX3B0cjw+LiAgSXQgbmVlZHMgdG8gYmUKKy8vIGEgbm9uLXRlbXBsYXRlIGNsYXNzIGJlY2F1c2UgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHI8PiBjYW4gcmVmZXIgdG8KKy8vIHRoZSBzYW1lIG9iamVjdCAobGlua2VkX3B0cjxTdXBlcmNsYXNzPihvYmopIHZzIGxpbmtlZF9wdHI8U3ViY2xhc3M+KG9iaikpLgorLy8gU28sIGl0IG5lZWRzIHRvIGJlIHBvc3NpYmxlIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0ciB0byBwYXJ0aWNpcGF0ZQorLy8gaW4gdGhlIHNhbWUgY2lyY3VsYXIgbGlua2VkIGxpc3QsIHNvIHdlIG5lZWQgYSBzaW5nbGUgY2xhc3MgdHlwZSBoZXJlLgorLy8KKy8vIERPIE5PVCBVU0UgVEhJUyBDTEFTUyBESVJFQ1RMWSBZT1VSU0VMRi4gIFVzZSBsaW5rZWRfcHRyPFQ+LgorY2xhc3MgbGlua2VkX3B0cl9pbnRlcm5hbCB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYSBuZXcgY2lyY2xlIHRoYXQgaW5jbHVkZXMgb25seSB0aGlzIGluc3RhbmNlLgorICB2b2lkIGpvaW5fbmV3KCkgeworICAgIG5leHRfID0gdGhpczsKKyAgfQorCisgIC8vIE1hbnkgbGlua2VkX3B0ciBvcGVyYXRpb25zIG1heSBjaGFuZ2UgcC5saW5rXyBmb3Igc29tZSBsaW5rZWRfcHRyCisgIC8vIHZhcmlhYmxlIHAgaW4gdGhlIHNhbWUgY2lyY2xlIGFzIHRoaXMgb2JqZWN0LiAgVGhlcmVmb3JlIHdlIG5lZWQKKyAgLy8gdG8gcHJldmVudCB0d28gc3VjaCBvcGVyYXRpb25zIGZyb20gb2NjdXJyaW5nIGNvbmN1cnJlbnRseS4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyIG9iamVjdHMgY2FuIGNvZXhpc3QgaW4gYQorICAvLyBjaXJjbGUgKGUuZy4gbGlua2VkX3B0cjxCYXNlPiwgbGlua2VkX3B0cjxEZXJpdmVkMT4sIGFuZAorICAvLyBsaW5rZWRfcHRyPERlcml2ZWQyPikuICBUaGVyZWZvcmUgd2UgbXVzdCB1c2UgYSBzaW5nbGUgbXV0ZXggdG8KKyAgLy8gcHJvdGVjdCBhbGwgbGlua2VkX3B0ciBvYmplY3RzLiAgVGhpcyBjYW4gY3JlYXRlIHNlcmlvdXMKKyAgLy8gY29udGVudGlvbiBpbiBwcm9kdWN0aW9uIGNvZGUsIGJ1dCBpcyBhY2NlcHRhYmxlIGluIGEgdGVzdGluZworICAvLyBmcmFtZXdvcmsuCisKKyAgLy8gSm9pbiBhbiBleGlzdGluZyBjaXJjbGUuCisgIC8vIEwgPCBnX2xpbmtlZF9wdHJfbXV0ZXgKKyAgdm9pZCBqb2luKGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHB0cikgeworICAgIE11dGV4TG9jayBsb2NrKCZnX2xpbmtlZF9wdHJfbXV0ZXgpOworCisgICAgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogcCA9IHB0cjsKKyAgICB3aGlsZSAocC0+bmV4dF8gIT0gcHRyKSBwID0gcC0+bmV4dF87CisgICAgcC0+bmV4dF8gPSB0aGlzOworICAgIG5leHRfID0gcHRyOworICB9CisKKyAgLy8gTGVhdmUgd2hhdGV2ZXIgY2lyY2xlIHdlJ3JlIHBhcnQgb2YuICBSZXR1cm5zIHRydWUgaWYgd2Ugd2VyZSB0aGUKKyAgLy8gbGFzdCBtZW1iZXIgb2YgdGhlIGNpcmNsZS4gIE9uY2UgdGhpcyBpcyBkb25lLCB5b3UgY2FuIGpvaW4oKSBhbm90aGVyLgorICAvLyBMIDwgZ19saW5rZWRfcHRyX211dGV4CisgIGJvb2wgZGVwYXJ0KCkgeworICAgIE11dGV4TG9jayBsb2NrKCZnX2xpbmtlZF9wdHJfbXV0ZXgpOworCisgICAgaWYgKG5leHRfID09IHRoaXMpIHJldHVybiB0cnVlOworICAgIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHAgPSBuZXh0XzsKKyAgICB3aGlsZSAocC0+bmV4dF8gIT0gdGhpcykgcCA9IHAtPm5leHRfOworICAgIHAtPm5leHRfID0gbmV4dF87CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyBwcml2YXRlOgorICBtdXRhYmxlIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIG5leHRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBsaW5rZWRfcHRyIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7CisKKyAgLy8gVGFrZSBvdmVyIG93bmVyc2hpcCBvZiBhIHJhdyBwb2ludGVyLiAgVGhpcyBzaG91bGQgaGFwcGVuIGFzIHNvb24gYXMKKyAgLy8gcG9zc2libGUgYWZ0ZXIgdGhlIG9iamVjdCBpcyBjcmVhdGVkLgorICBleHBsaWNpdCBsaW5rZWRfcHRyKFQqIHB0ciA9IE5VTEwpIHsgY2FwdHVyZShwdHIpOyB9CisgIH5saW5rZWRfcHRyKCkgeyBkZXBhcnQoKTsgfQorCisgIC8vIENvcHkgYW4gZXhpc3RpbmcgbGlua2VkX3B0cjw+LCBhZGRpbmcgb3Vyc2VsdmVzIHRvIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBsaW5rZWRfcHRyKGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgeyBjb3B5KCZwdHIpOyB9CisgIGxpbmtlZF9wdHIobGlua2VkX3B0ciBjb25zdCYgcHRyKSB7ICAvLyBOT0xJTlQKKyAgICBhc3NlcnQoJnB0ciAhPSB0aGlzKTsKKyAgICBjb3B5KCZwdHIpOworICB9CisKKyAgLy8gQXNzaWdubWVudCByZWxlYXNlcyB0aGUgb2xkIHZhbHVlIGFuZCBhY3F1aXJlcyB0aGUgbmV3LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gbGlua2VkX3B0ciYgb3BlcmF0b3I9KGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgeworICAgIGRlcGFydCgpOworICAgIGNvcHkoJnB0cik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgbGlua2VkX3B0ciYgb3BlcmF0b3I9KGxpbmtlZF9wdHIgY29uc3QmIHB0cikgeworICAgIGlmICgmcHRyICE9IHRoaXMpIHsKKyAgICAgIGRlcGFydCgpOworICAgICAgY29weSgmcHRyKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gU21hcnQgcG9pbnRlciBtZW1iZXJzLgorICB2b2lkIHJlc2V0KFQqIHB0ciA9IE5VTEwpIHsKKyAgICBkZXBhcnQoKTsKKyAgICBjYXB0dXJlKHB0cik7CisgIH0KKyAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnZhbHVlXzsgfQorICAvLyBSZWxlYXNlIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlZCBvYmplY3QgYW5kIHJldHVybnMgaXQuCisgIC8vIFNvbGUgb3duZXJzaGlwIGJ5IHRoaXMgbGlua2VkX3B0ciBvYmplY3QgaXMgcmVxdWlyZWQuCisgIFQqIHJlbGVhc2UoKSB7CisgICAgYm9vbCBsYXN0ID0gbGlua18uZGVwYXJ0KCk7CisgICAgKHZvaWQpIGxhc3Q7CisgICAgYXNzZXJ0KGxhc3QpOworICAgIFQqIHYgPSB2YWx1ZV87CisgICAgdmFsdWVfID0gTlVMTDsKKyAgICByZXR1cm4gdjsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShUKiBwKSBjb25zdCB7IHJldHVybiB2YWx1ZV8gPT0gcDsgfQorICBib29sIG9wZXJhdG9yIT0oVCogcCkgY29uc3QgeyByZXR1cm4gdmFsdWVfICE9IHA7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGJvb2wgb3BlcmF0b3I9PShsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfID09IHB0ci5nZXQoKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgYm9vbCBvcGVyYXRvciE9KGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8gIT0gcHRyLmdldCgpOworICB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgZnJpZW5kIGNsYXNzIGxpbmtlZF9wdHI7CisKKyAgVCogdmFsdWVfOworICBsaW5rZWRfcHRyX2ludGVybmFsIGxpbmtfOworCisgIHZvaWQgZGVwYXJ0KCkgeworICAgIGlmIChsaW5rXy5kZXBhcnQoKSkgZGVsZXRlIHZhbHVlXzsKKyAgfQorCisgIHZvaWQgY2FwdHVyZShUKiBwdHIpIHsKKyAgICB2YWx1ZV8gPSBwdHI7CisgICAgbGlua18uam9pbl9uZXcoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiB2b2lkIGNvcHkobGlua2VkX3B0cjxVPiBjb25zdCogcHRyKSB7CisgICAgdmFsdWVfID0gcHRyLT5nZXQoKTsKKyAgICBpZiAodmFsdWVfKQorICAgICAgbGlua18uam9pbigmcHRyLT5saW5rXyk7CisgICAgZWxzZQorICAgICAgbGlua18uam9pbl9uZXcoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lCitib29sIG9wZXJhdG9yPT0oVCogcHRyLCBjb25zdCBsaW5rZWRfcHRyPFQ+JiB4KSB7CisgIHJldHVybiBwdHIgPT0geC5nZXQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lCitib29sIG9wZXJhdG9yIT0oVCogcHRyLCBjb25zdCBsaW5rZWRfcHRyPFQ+JiB4KSB7CisgIHJldHVybiBwdHIgIT0geC5nZXQoKTsKK30KKworLy8gQSBmdW5jdGlvbiB0byBjb252ZXJ0IFQqIGludG8gbGlua2VkX3B0cjxUPgorLy8gRG9pbmcgZS5nLiBtYWtlX2xpbmtlZF9wdHIobmV3IEZvb0JhckJhejx0eXBlPihhcmcpKSBpcyBhIHNob3J0ZXIgbm90YXRpb24KKy8vIGZvciBsaW5rZWRfcHRyPEZvb0JhckJhejx0eXBlPiA+KG5ldyBGb29CYXJCYXo8dHlwZT4oYXJnKSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorbGlua2VkX3B0cjxUPiBtYWtlX2xpbmtlZF9wdHIoVCogcHRyKSB7CisgIHJldHVybiBsaW5rZWRfcHRyPFQ+KHB0cik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0xJTktFRF9QVFJfSF8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0YWI1NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oCkBAIC0wLDAgKzEsNDgyMCBAQAorLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgYSBzY3JpcHQuICBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEN1cnJlbnRseSBHb29nbGUgVGVzdCBzdXBwb3J0cyBhdCBtb3N0IDUwIGFyZ3VtZW50cyBpbiBWYWx1ZXMsCisvLyBhbmQgYXQgbW9zdCAxMCBhcmd1bWVudHMgaW4gQ29tYmluZS4gUGxlYXNlIGNvbnRhY3QKKy8vIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZCBtb3JlLgorLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBDb21iaW5lIGlzIGxpbWl0ZWQKKy8vIGJ5IHRoZSBtYXhpbXVtIGFyaXR5IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0cjE6OnR1cGxlIHdoaWNoIGlzCisvLyBjdXJyZW50bHkgc2V0IGF0IDEwLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXworCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0Lmg+CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIFZhbHVlc0luKCksIHdoaWNoIGlzIGltcGxlbWVudGVkIGluCisvLyBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgICAgdHlwZW5hbWUgOjpzdGQ6Oml0ZXJhdG9yX3RyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKKyAgICAgICAgRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pOworCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCisgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVc2VkIGluIHRoZSBWYWx1ZXMoKSBmdW5jdGlvbiB0byBwcm92aWRlIHBvbHltb3JwaGljIGNhcGFiaWxpdGllcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK2NsYXNzIFZhbHVlQXJyYXkxIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFZhbHVlQXJyYXkxKFQxIHYxKSA6IHYxXyh2MSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7IHJldHVybiBWYWx1ZXNJbigmdjFfLCAmdjFfICsgMSk7IH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorY2xhc3MgVmFsdWVBcnJheTIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTIoVDEgdjEsIFQyIHYyKSA6IHYxXyh2MSksIHYyXyh2Mikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK2NsYXNzIFZhbHVlQXJyYXkzIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzKFQxIHYxLCBUMiB2MiwgVDMgdjMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitjbGFzcyBWYWx1ZUFycmF5NCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2NsYXNzIFZhbHVlQXJyYXk1IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTUmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitjbGFzcyBWYWx1ZUFycmF5NiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2KSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk2JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgorY2xhc3MgVmFsdWVBcnJheTcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcpIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2Nykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK2NsYXNzIFZhbHVlQXJyYXk4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgICAgVDggdjgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgorY2xhc3MgVmFsdWVBcnJheTkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAorICAgICAgVDkgdjkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorY2xhc3MgVmFsdWVBcnJheTEwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxMChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMT4KK2NsYXNzIFZhbHVlQXJyYXkxMSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KK2NsYXNzIFZhbHVlQXJyYXkxMiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzPgorY2xhc3MgVmFsdWVBcnJheTEzIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxMyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAorICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCisgICAgICB2MTJfKHYxMiksIHYxM18odjEzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitjbGFzcyBWYWx1ZUFycmF5MTQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE0JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1PgorY2xhc3MgVmFsdWVBcnJheTE1IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSkgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTY+CitjbGFzcyBWYWx1ZUFycmF5MTYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KK2NsYXNzIFZhbHVlQXJyYXkxNyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCisgICAgICBUMTcgdjE3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+CitjbGFzcyBWYWx1ZUFycmF5MTggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+CitjbGFzcyBWYWx1ZUFycmF5MTkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAorICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK2NsYXNzIFZhbHVlQXJyYXkyMCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitjbGFzcyBWYWx1ZUFycmF5MjEgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTIxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAorICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCisgICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAorICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+CitjbGFzcyBWYWx1ZUFycmF5MjIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTIyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK2NsYXNzIFZhbHVlQXJyYXkyMyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzKSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywKKyAgICAgICAgdjIzX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0PgorY2xhc3MgVmFsdWVBcnJheTI0IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQpIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCisgICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAorICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKKyAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI0JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KK2NsYXNzIFZhbHVlQXJyYXkyNSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAorICAgICAgVDI1IHYyNSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2PgorY2xhc3MgVmFsdWVBcnJheTI2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KK2NsYXNzIFZhbHVlQXJyYXkyNyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAorICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwKKyAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksCisgICAgICB2MjZfKHYyNiksIHYyN18odjI3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjcmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitjbGFzcyBWYWx1ZUFycmF5MjggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCisgICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAorICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKKyAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitjbGFzcyBWYWx1ZUFycmF5MjkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKKyAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCisgICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyOSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK2NsYXNzIFZhbHVlQXJyYXkzMCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzE+CitjbGFzcyBWYWx1ZUFycmF5MzEgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+CitjbGFzcyBWYWx1ZUFycmF5MzIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIpIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCisgICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAorICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKKyAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCisgICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KK2NsYXNzIFZhbHVlQXJyYXkzMyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwKKyAgICAgIFQzMyB2MzMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0PgorY2xhc3MgVmFsdWVBcnJheTM0IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KK2NsYXNzIFZhbHVlQXJyYXkzNSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCisgICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAorICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwKKyAgICAgIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywKKyAgICAgICAgdjM1X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzUmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2PgorY2xhc3MgVmFsdWVBcnJheTM2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKKyAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCisgICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAorICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwKKyAgICAgIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM2JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK2NsYXNzIFZhbHVlQXJyYXkzNyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKKyAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCisgICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLAorICAgICAgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwKKyAgICAgIHYzNl8odjM2KSwgdjM3Xyh2MzcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzg+CitjbGFzcyBWYWx1ZUFycmF5MzggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAorICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzOCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitjbGFzcyBWYWx1ZUFycmF5MzkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5KSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAorICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK2NsYXNzIFZhbHVlQXJyYXk0MCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDApIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCisgICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAorICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKKyAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCisgICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLAorICAgICAgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwKKyAgICAgIHY0MF8odjQwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitjbGFzcyBWYWx1ZUFycmF5NDEgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLAorICAgICAgVDQxIHY0MSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAorICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDI+CitjbGFzcyBWYWx1ZUFycmF5NDIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAorICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhfLCB2MzlfLCB2NDBfLCB2NDFfLCB2NDJffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK2NsYXNzIFZhbHVlQXJyYXk0MyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCisgICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCisgICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAorICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKKyAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksCisgICAgICB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLAorICAgICAgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyXywgdjQzX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+CitjbGFzcyBWYWx1ZUFycmF5NDQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKKyAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCisgICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAorICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwKKyAgICAgIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksCisgICAgICB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLAorICAgICAgdjQzXyh2NDMpLCB2NDRfKHY0NCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M18sIHY0NF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ0JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1PgorY2xhc3MgVmFsdWVBcnJheTQ1IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKKyAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCisgICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLAorICAgICAgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwKKyAgICAgIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksCisgICAgICB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M18sIHY0NF8sIHY0NV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDY+CitjbGFzcyBWYWx1ZUFycmF5NDYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKKyAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksCisgICAgICB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhfLCB2MzlfLCB2NDBfLCB2NDFfLCB2NDJfLCB2NDNfLCB2NDRfLCB2NDVfLCB2NDZffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3PgorY2xhc3MgVmFsdWVBcnJheTQ3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLAorICAgICAgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksIHY0Nl8odjQ2KSwKKyAgICAgIHY0N18odjQ3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyXywgdjQzXywgdjQ0XywgdjQ1XywgdjQ2XywKKyAgICAgICAgdjQ3X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDcmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87CisgIGNvbnN0IFQ0NSB2NDVfOworICBjb25zdCBUNDYgdjQ2XzsKKyAgY29uc3QgVDQ3IHY0N187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KK2NsYXNzIFZhbHVlQXJyYXk0OCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAorICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwKKyAgICAgIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksCisgICAgICB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLAorICAgICAgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyXywgdjQzXywgdjQ0XywgdjQ1XywgdjQ2XywgdjQ3XywKKyAgICAgICAgdjQ4X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87CisgIGNvbnN0IFQ0NSB2NDVfOworICBjb25zdCBUNDYgdjQ2XzsKKyAgY29uc3QgVDQ3IHY0N187CisgIGNvbnN0IFQ0OCB2NDhfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KK2NsYXNzIFZhbHVlQXJyYXk0OSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LAorICAgICAgVDQ5IHY0OSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAorICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwKKyAgICAgIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSwgdjQ5Xyh2NDkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhfLCB2MzlfLCB2NDBfLCB2NDFfLCB2NDJfLCB2NDNfLCB2NDRfLCB2NDVfLCB2NDZfLCB2NDdfLAorICAgICAgICB2NDhfLCB2NDlffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0OSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworICBjb25zdCBUNDcgdjQ3XzsKKyAgY29uc3QgVDQ4IHY0OF87CisgIGNvbnN0IFQ0OSB2NDlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPgorY2xhc3MgVmFsdWVBcnJheTUwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk1MChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDksCisgICAgICBUNTAgdjUwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCisgICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLAorICAgICAgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpLCB2NDlfKHY0OSksIHY1MF8odjUwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyXywgdjQzXywgdjQ0XywgdjQ1XywgdjQ2XywgdjQ3XywKKyAgICAgICAgdjQ4XywgdjQ5XywgdjUwX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NTAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87CisgIGNvbnN0IFQ0NSB2NDVfOworICBjb25zdCBUNDYgdjQ2XzsKKyAgY29uc3QgVDQ3IHY0N187CisgIGNvbnN0IFQ0OCB2NDhfOworICBjb25zdCBUNDkgdjQ5XzsKKyAgY29uc3QgVDUwIHY1MF87Cit9OworCisjaWYgR1RFU1RfSEFTX0NPTUJJTkUKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB2YWx1ZXMgcHJvZHVjZWQKKy8vIGJ5IHRoZSBhcmd1bWVudCBnZW5lcmF0b3JzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMgorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMihjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMigpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MikKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDJfOworICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMjo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyJiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMgorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMyhjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMygpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MykgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50M187CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzOjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzCisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1CisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDVfOworICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjU6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LAorICAgICAgICBUNj4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNihjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NikKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAorICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAorICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNworICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNz4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNygpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAorICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKKyAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKKyAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAorICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAorICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAorICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAorICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKKyAgICAgICAgVDcsIFQ4PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksCisgICAgICAgICAgZzhfKGc4KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sCisgICAgICAgIGc4Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDhfOworICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgeworICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOworICAgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCisgICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8CisgICAgICAgICAgY3VycmVudDhfID09IGVuZDhfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBiZWdpbjhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBjdXJyZW50OF87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjg6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKKyAgICAgICAgVDcsIFQ4LCBUOT4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOShjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKKyAgICAgICAgZzhfLmVuZCgpLCBnOV8sIGc5Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yJiBjdXJyZW50OSkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpLAorICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ5XzsKKyAgICAgIGlmIChjdXJyZW50OV8gPT0gZW5kOV8pIHsKKyAgICAgICAgY3VycmVudDlfID0gYmVnaW45XzsKKyAgICAgICAgKytjdXJyZW50OF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDhfID09IGVuZDhfKSB7CisgICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87CisgICAgICAgICsrY3VycmVudDdfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18gJiYKKyAgICAgICAgICBjdXJyZW50OF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ4XyAmJgorICAgICAgICAgIGN1cnJlbnQ5XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDlfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKKyAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKKyAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAorICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSwKKyAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwKKyAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLAorICAgICAgICBjdXJyZW50OF8ob3RoZXIuY3VycmVudDhfKSwKKyAgICAgICAgYmVnaW45XyhvdGhlci5iZWdpbjlfKSwKKyAgICAgICAgZW5kOV8ob3RoZXIuZW5kOV8pLAorICAgICAgICBjdXJyZW50OV8ob3RoZXIuY3VycmVudDlfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4XywKKyAgICAgICAgICAgICpjdXJyZW50OV8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF8gfHwKKyAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBlbmQ5XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGN1cnJlbnQ5XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOTo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+IGc5XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDgsIFQ5LCBUMTA+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+JiBnMTApCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCisgICAgICAgICAgZzlfKGc5KSwgZzEwXyhnMTApIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSwgZzlfLCBnOV8uYmVnaW4oKSwgZzEwXywgZzEwXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKKyAgICAgICAgZzhfLmVuZCgpLCBnOV8sIGc5Xy5lbmQoKSwgZzEwXywgZzEwXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yJiBjdXJyZW50OSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yJiBjdXJyZW50MTApCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAorICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKKyAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCisgICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpLAorICAgICAgICAgIGJlZ2luOF8oZzguYmVnaW4oKSksIGVuZDhfKGc4LmVuZCgpKSwgY3VycmVudDhfKGN1cnJlbnQ4KSwKKyAgICAgICAgICBiZWdpbjlfKGc5LmJlZ2luKCkpLCBlbmQ5XyhnOS5lbmQoKSksIGN1cnJlbnQ5XyhjdXJyZW50OSksCisgICAgICAgICAgYmVnaW4xMF8oZzEwLmJlZ2luKCkpLCBlbmQxMF8oZzEwLmVuZCgpKSwgY3VycmVudDEwXyhjdXJyZW50MTApICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDEwXzsKKyAgICAgIGlmIChjdXJyZW50MTBfID09IGVuZDEwXykgeworICAgICAgICBjdXJyZW50MTBfID0gYmVnaW4xMF87CisgICAgICAgICsrY3VycmVudDlfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ5XyA9PSBlbmQ5XykgeworICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOworICAgICAgICArK2N1cnJlbnQ4XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsKKyAgICAgICAgY3VycmVudDhfID0gYmVnaW44XzsKKyAgICAgICAgKytjdXJyZW50N187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7CisgICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187CisgICAgICAgICsrY3VycmVudDZfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgeworICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOworICAgICAgICArK2N1cnJlbnQ1XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKKyAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKKyAgICAgICAgKytjdXJyZW50NF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7CisgICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87CisgICAgICAgICsrY3VycmVudDNfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKKyAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgorICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCisgICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKKyAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3XyAmJgorICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmCisgICAgICAgICAgY3VycmVudDlfID09IHR5cGVkX290aGVyLT5jdXJyZW50OV8gJiYKKyAgICAgICAgICBjdXJyZW50MTBfID09IHR5cGVkX290aGVyLT5jdXJyZW50MTBfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKKyAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKKyAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAorICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSwKKyAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwKKyAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLAorICAgICAgICBjdXJyZW50OF8ob3RoZXIuY3VycmVudDhfKSwKKyAgICAgICAgYmVnaW45XyhvdGhlci5iZWdpbjlfKSwKKyAgICAgICAgZW5kOV8ob3RoZXIuZW5kOV8pLAorICAgICAgICBjdXJyZW50OV8ob3RoZXIuY3VycmVudDlfKSwKKyAgICAgICAgYmVnaW4xMF8ob3RoZXIuYmVnaW4xMF8pLAorICAgICAgICBlbmQxMF8ob3RoZXIuZW5kMTBfKSwKKyAgICAgICAgY3VycmVudDEwXyhvdGhlci5jdXJyZW50MTBfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4XywKKyAgICAgICAgICAgICpjdXJyZW50OV8sICpjdXJyZW50MTBfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8CisgICAgICAgICAgY3VycmVudDhfID09IGVuZDhfIHx8CisgICAgICAgICAgY3VycmVudDlfID09IGVuZDlfIHx8CisgICAgICAgICAgY3VycmVudDEwXyA9PSBlbmQxMF87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBlbmQ5XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGN1cnJlbnQ5XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBiZWdpbjEwXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBlbmQxMF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3IgY3VycmVudDEwXzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4gZzhfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4gZzlfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+IGcxMF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwCisKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgQ29tYmluZSgpIHdpdGggcG9seW1vcnBoaWMgZmVhdHVyZXMuIFRoZXkgYWxsb3cKKy8vIGNhc3RpbmcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvck48VD4gdG8gUGFyYW1HZW5lcmF0b3I8VT4gaWYgVCBpcworLy8gY29udmVydGlibGUgdG8gVS4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIyIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMihjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMikge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyPFQxLCBUMj4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMiYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMgorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIzIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyhjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzPFQxLCBUMiwgVDM+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIzCisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQ+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQ8VDEsIFQyLCBUMywgVDQ+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNAorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI1KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNTxUMSwgVDIsIFQzLCBUNCwgVDU+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI2IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNihjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDY+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI2CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjc+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgVDc+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI3JiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworICBjb25zdCBHZW5lcmF0b3IzIGczXzsKKyAgY29uc3QgR2VuZXJhdG9yNCBnNF87CisgIGNvbnN0IEdlbmVyYXRvcjUgZzVfOworICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKKyAgY29uc3QgR2VuZXJhdG9yNyBnN187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKKyAgICBjbGFzcyBHZW5lcmF0b3I4PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjggeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI4KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksCisgICAgICAgICAgZzhfKGc4KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LAorICAgICAgVDg+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKKyAgICBjbGFzcyBHZW5lcmF0b3I4LCBjbGFzcyBHZW5lcmF0b3I5PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI5KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsCisgICAgY29uc3QgR2VuZXJhdG9yOSYgZzkpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCisgICAgICAgICAgZzlfKGc5KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICBUOT4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgICAgVDk+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDg+ID4oZzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDk+ID4oZzlfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI5JiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworICBjb25zdCBHZW5lcmF0b3IzIGczXzsKKyAgY29uc3QgR2VuZXJhdG9yNCBnNF87CisgIGNvbnN0IEdlbmVyYXRvcjUgZzVfOworICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKKyAgY29uc3QgR2VuZXJhdG9yNyBnN187CisgIGNvbnN0IEdlbmVyYXRvcjggZzhfOworICBjb25zdCBHZW5lcmF0b3I5IGc5XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOQorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjgsIGNsYXNzIEdlbmVyYXRvcjksIGNsYXNzIEdlbmVyYXRvcjEwPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwKKyAgICBjb25zdCBHZW5lcmF0b3I5JiBnOSwgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpLCBnMTBfKGcxMCkge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICBUOSwgVDEwPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LAorICAgICAgICBUOSwgVDEwPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksCisgICAgICAgICAgICBUMTA+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOT4gPihnOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMTA+ID4oZzEwXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87CisgIGNvbnN0IEdlbmVyYXRvcjkgZzlfOworICBjb25zdCBHZW5lcmF0b3IxMCBnMTBfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JiNThjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaApAQCAtMCwwICsxLDYxOSBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUeXBlIGFuZCBmdW5jdGlvbiB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oPgorI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaD4KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gT3V0cHV0cyBhIG1lc3NhZ2UgZXhwbGFpbmluZyBpbnZhbGlkIHJlZ2lzdHJhdGlvbiBvZiBkaWZmZXJlbnQKKy8vIGZpeHR1cmUgY2xhc3MgZm9yIHRoZSBzYW1lIHRlc3QgY2FzZS4gVGhpcyBtYXkgaGFwcGVuIHdoZW4KKy8vIFRFU1RfUCBtYWNybyBpcyB1c2VkIHRvIGRlZmluZSB0d28gdGVzdHMgd2l0aCB0aGUgc2FtZSBuYW1lCisvLyBidXQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuCitHVEVTVF9BUElfIHZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTsKK3RlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUGFyYW1HZW5lcmF0b3I7CisKKy8vIEludGVyZmFjZSBmb3IgaXRlcmF0aW5nIG92ZXIgZWxlbWVudHMgcHJvdmlkZWQgYnkgYW4gaW1wbGVtZW50YXRpb24KKy8vIG9mIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflBhcmFtSXRlcmF0b3JJbnRlcmZhY2UoKSB7fQorICAvLyBBIHBvaW50ZXIgdG8gdGhlIGJhc2UgZ2VuZXJhdG9yIGluc3RhbmNlLgorICAvLyBVc2VkIG9ubHkgZm9yIHRoZSBwdXJwb3NlcyBvZiBpdGVyYXRvciBjb21wYXJpc29uCisgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHR3byBpdGVyYXRvcnMgYmVsb25nIHRvIHRoZSBzYW1lIGdlbmVyYXRvci4KKyAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0ID0gMDsKKyAgLy8gQWR2YW5jZXMgaXRlcmF0b3IgdG8gcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudAorICAvLyBwcm92aWRlZCBieSB0aGUgZ2VuZXJhdG9yLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgIC8vIGZvciBub3QgY2FsbGluZyBBZHZhbmNlKCkgb24gYW4gaXRlcmF0b3IgZXF1YWwgdG8KKyAgLy8gQmFzZUdlbmVyYXRvcigpLT5FbmQoKS4KKyAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSA9IDA7CisgIC8vIENsb25lcyB0aGUgaXRlcmF0b3Igb2JqZWN0LiBVc2VkIGZvciBpbXBsZW1lbnRpbmcgY29weSBzZW1hbnRpY3MKKyAgLy8gb2YgUGFyYW1JdGVyYXRvcjxUPi4KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlKiBDbG9uZSgpIGNvbnN0ID0gMDsKKyAgLy8gRGVyZWZlcmVuY2VzIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGFuZCBwcm92aWRlcyAocmVhZC1vbmx5KSBhY2Nlc3MKKyAgLy8gdG8gdGhlIHBvaW50ZWQgdmFsdWUuIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSBub3QgdG8gY2FsbAorICAvLyBDdXJyZW50KCkgb24gYW4gaXRlcmF0b3IgZXF1YWwgdG8gQmFzZUdlbmVyYXRvcigpLT5FbmQoKS4KKyAgLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFBhcmFtR2VuZXJhdG9yPFQ+OjpvcGVyYXRvciooKS4KKyAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgPSAwOworICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGl0ZXJhdG9yIGFuZCBvdGhlciBwb2ludCB0byB0aGUgc2FtZQorICAvLyBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIGdlbmVyYXRvci4KKyAgLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFBhcmFtR2VuZXJhdG9yPFQ+OjpvcGVyYXRvcj09KCkuCisgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZSYgb3RoZXIpIGNvbnN0ID0gMDsKK307CisKKy8vIENsYXNzIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mCisvLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPi4gSXQgd3JhcHMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPgorLy8gYW5kIGltcGxlbWVudHMgdGhlIGNvbnN0IGZvcndhcmQgaXRlcmF0b3IgY29uY2VwdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1JdGVyYXRvciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBUJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICAvLyBQYXJhbUl0ZXJhdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBpbXBsXyBwb2ludGVyLgorICBQYXJhbUl0ZXJhdG9yKGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSA6IGltcGxfKG90aGVyLmltcGxfLT5DbG9uZSgpKSB7fQorICBQYXJhbUl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIHsKKyAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisgICAgICBpbXBsXy5yZXNldChvdGhlci5pbXBsXy0+Q2xvbmUoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmltcGxfLT5DdXJyZW50KCk7IH0KKyAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5DdXJyZW50KCk7IH0KKyAgLy8gUHJlZml4IHZlcnNpb24gb2Ygb3BlcmF0b3IrKy4KKyAgUGFyYW1JdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICBpbXBsXy0+QWR2YW5jZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLyBQb3N0Zml4IHZlcnNpb24gb2Ygb3BlcmF0b3IrKy4KKyAgUGFyYW1JdGVyYXRvciBvcGVyYXRvcisrKGludCAvKnVudXNlZCovKSB7CisgICAgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogY2xvbmUgPSBpbXBsXy0+Q2xvbmUoKTsKKyAgICBpbXBsXy0+QWR2YW5jZSgpOworICAgIHJldHVybiBQYXJhbUl0ZXJhdG9yKGNsb25lKTsKKyAgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gaW1wbF8uZ2V0KCkgPT0gb3RoZXIuaW1wbF8uZ2V0KCkgfHwgaW1wbF8tPkVxdWFscygqb3RoZXIuaW1wbF8pOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFBhcmFtR2VuZXJhdG9yPFQ+OworICBleHBsaWNpdCBQYXJhbUl0ZXJhdG9yKFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIGltcGwpIDogaW1wbF8oaW1wbCkge30KKyAgc2NvcGVkX3B0cjxQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+ID4gaW1wbF87Cit9OworCisvLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBpcyB0aGUgYmluYXJ5IGludGVyZmFjZSB0byBhY2Nlc3MgZ2VuZXJhdG9ycworLy8gZGVmaW5lZCBpbiBvdGhlciB0cmFuc2xhdGlvbiB1bml0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIFBhcmFtVHlwZTsKKworICB2aXJ0dWFsIH5QYXJhbUdlbmVyYXRvckludGVyZmFjZSgpIHt9CisKKyAgLy8gR2VuZXJhdG9yIGludGVyZmFjZSBkZWZpbml0aW9uCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgPSAwOworfTsKKworLy8gV3JhcHMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gYW5kIHByb3ZpZGVzIGdlbmVyYWwgZ2VuZXJhdG9yIHN5bnRheAorLy8gY29tcGF0aWJsZSB3aXRoIHRoZSBTVEwgQ29udGFpbmVyIGNvbmNlcHQuCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgY29weSBpbml0aWFsaXphdGlvbiBzZW1hbnRpY3MgYW5kIHRoZSBjb250YWluZWQKKy8vIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGluc3RhbmNlIGlzIHNoYXJlZCBhbW9uZyBhbGwgY29waWVzCisvLyBvZiB0aGUgb3JpZ2luYWwgb2JqZWN0LiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgdGhhdCBpbnN0YW5jZSBpcyBpbW11dGFibGUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1HZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBQYXJhbUl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOworCisgIGV4cGxpY2l0IFBhcmFtR2VuZXJhdG9yKFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9CisgIFBhcmFtR2VuZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9yJiBvdGhlcikgOiBpbXBsXyhvdGhlci5pbXBsXykge30KKworICBQYXJhbUdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFBhcmFtR2VuZXJhdG9yJiBvdGhlcikgeworICAgIGltcGxfID0gb3RoZXIuaW1wbF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihpbXBsXy0+QmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoaW1wbF8tPkVuZCgpKTsgfQorCisgcHJpdmF0ZToKKyAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjxjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiA+IGltcGxfOworfTsKKworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcmFuZ2Ugb2YgdHdvIGNvbXBhcmFibGUgdmFsdWVzLiBDYW4gYmUgdXNlZCB0bworLy8gZ2VuZXJhdGUgc2VxdWVuY2VzIG9mIHVzZXItZGVmaW5lZCB0eXBlcyB0aGF0IGltcGxlbWVudCBvcGVyYXRvcisoKSBhbmQKKy8vIG9wZXJhdG9yPCgpLgorLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGluIHRoZSBSYW5nZSgpIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluY3JlbWVudFQ+CitjbGFzcyBSYW5nZUdlbmVyYXRvciA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiB7CisgcHVibGljOgorICBSYW5nZUdlbmVyYXRvcihUIGJlZ2luLCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKQorICAgICAgOiBiZWdpbl8oYmVnaW4pLCBlbmRfKGVuZCksCisgICAgICAgIHN0ZXBfKHN0ZXApLCBlbmRfaW5kZXhfKENhbGN1bGF0ZUVuZEluZGV4KGJlZ2luLCBlbmQsIHN0ZXApKSB7fQorICB2aXJ0dWFsIH5SYW5nZUdlbmVyYXRvcigpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGJlZ2luXywgMCwgc3RlcF8pOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZW5kXywgZW5kX2luZGV4Xywgc3RlcF8pOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogYmFzZSwgVCB2YWx1ZSwgaW50IGluZGV4LAorICAgICAgICAgICAgIEluY3JlbWVudFQgc3RlcCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwgdmFsdWVfKHZhbHVlKSwgaW5kZXhfKGluZGV4KSwgc3RlcF8oc3RlcCkge30KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIHZhbHVlXyA9IHZhbHVlXyArIHN0ZXBfOworICAgICAgaW5kZXhfKys7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJnZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IGludCBvdGhlcl9pbmRleCA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpLT5pbmRleF87CisgICAgICByZXR1cm4gaW5kZXhfID09IG90aGVyX2luZGV4OworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPigpLAorICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwgdmFsdWVfKG90aGVyLnZhbHVlXyksIGluZGV4XyhvdGhlci5pbmRleF8pLAorICAgICAgICAgIHN0ZXBfKG90aGVyLnN0ZXBfKSB7fQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogY29uc3QgYmFzZV87CisgICAgVCB2YWx1ZV87CisgICAgaW50IGluZGV4XzsKKyAgICBjb25zdCBJbmNyZW1lbnRUIHN0ZXBfOworICB9OyAgLy8gY2xhc3MgUmFuZ2VHZW5lcmF0b3I6Okl0ZXJhdG9yCisKKyAgc3RhdGljIGludCBDYWxjdWxhdGVFbmRJbmRleChjb25zdCBUJiBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5jcmVtZW50VCYgc3RlcCkgeworICAgIGludCBlbmRfaW5kZXggPSAwOworICAgIGZvciAoVCBpID0gYmVnaW47IGkgPCBlbmQ7IGkgPSBpICsgc3RlcCkKKyAgICAgIGVuZF9pbmRleCsrOworICAgIHJldHVybiBlbmRfaW5kZXg7CisgIH0KKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFJhbmdlR2VuZXJhdG9yJiBvdGhlcik7CisKKyAgY29uc3QgVCBiZWdpbl87CisgIGNvbnN0IFQgZW5kXzsKKyAgY29uc3QgSW5jcmVtZW50VCBzdGVwXzsKKyAgLy8gVGhlIGluZGV4IGZvciB0aGUgZW5kKCkgaXRlcmF0b3IuIEFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIGdlbmVyYXRlZAorICAvLyBzZXF1ZW5jZSBhcmUgaW5kZXhlZCAoMC1iYXNlZCkgdG8gYWlkIGl0ZXJhdG9yIGNvbXBhcmlzb24uCisgIGNvbnN0IGludCBlbmRfaW5kZXhfOworfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yCisKKworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcGFpciBvZiBTVEwtc3R5bGUgaXRlcmF0b3JzLiBVc2VkIGluIHRoZQorLy8gVmFsdWVzSW4oKSBmdW5jdGlvbi4gVGhlIGVsZW1lbnRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgc291cmNlIHJhbmdlCisvLyBzaW5jZSB0aGUgc291cmNlIGNhbiBiZSBsb2NhdGVkIG9uIHRoZSBzdGFjaywgYW5kIHRoZSBnZW5lcmF0b3IKKy8vIGlzIGxpa2VseSB0byBwZXJzaXN0IGJleW9uZCB0aGF0IHN0YWNrIGZyYW1lLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KKyAgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkKKyAgICAgIDogY29udGFpbmVyXyhiZWdpbiwgZW5kKSB7fQorICB2aXJ0dWFsIH5WYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBjb250YWluZXJfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgY29udGFpbmVyXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxUPiBDb250YWluZXJUeXBlOworCisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBiYXNlLAorICAgICAgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yKQorICAgICAgICA6ICBiYXNlXyhiYXNlKSwgaXRlcmF0b3JfKGl0ZXJhdG9yKSB7fQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgKytpdGVyYXRvcl87CisgICAgICB2YWx1ZV8ucmVzZXQoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICAvLyBXZSBuZWVkIHRvIHVzZSBjYWNoZWQgdmFsdWUgcmVmZXJlbmNlZCBieSBpdGVyYXRvcl8gYmVjYXVzZSAqaXRlcmF0b3JfCisgICAgLy8gY2FuIHJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QgKGFuZCBvZiB0eXBlIG90aGVyIHRoZW4gVCksIHNvIGp1c3QKKyAgICAvLyBoYXZpbmcgInJldHVybiAmKml0ZXJhdG9yXzsiIGRvZXNuJ3Qgd29yay4KKyAgICAvLyB2YWx1ZV8gaXMgdXBkYXRlZCBoZXJlIGFuZCBub3QgaW4gQWR2YW5jZSgpIGJlY2F1c2UgQWR2YW5jZSgpCisgICAgLy8gY2FuIGFkdmFuY2UgaXRlcmF0b3JfIGJleW9uZCB0aGUgZW5kIG9mIHRoZSByYW5nZSwgYW5kIHdlIGNhbm5vdAorICAgIC8vIGRldGVjdCB0aGF0IGZhY3QuIFRoZSBjbGllbnQgY29kZSwgb24gdGhlIG90aGVyIGhhbmQsIGlzCisgICAgLy8gcmVzcG9uc2libGUgZm9yIG5vdCBjYWxsaW5nIEN1cnJlbnQoKSBvbiBhbiBvdXQtb2YtcmFuZ2UgaXRlcmF0b3IuCisgICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgeworICAgICAgaWYgKHZhbHVlXy5nZXQoKSA9PSBOVUxMKQorICAgICAgICB2YWx1ZV8ucmVzZXQobmV3IFQoKml0ZXJhdG9yXykpOworICAgICAgcmV0dXJuIHZhbHVlXy5nZXQoKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGl0ZXJhdG9yXyA9PQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKS0+aXRlcmF0b3JfOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgICAgLy8gVGhlIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgc3VwcHJlc3NlcyBhIGZhbHNlIHdhcm5pbmcKKyAgICAgICAgICAvLyBlbWl0dGVkIGJ5IGdjYyB3aGVuIHN1cHBsaWVkIHdpdGggdGhlIC1XZXh0cmEgb3B0aW9uLgorICAgICAgICA6IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4oKSwKKyAgICAgICAgICBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgICAgaXRlcmF0b3JfKG90aGVyLml0ZXJhdG9yXykge30KKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBjb25zdCBiYXNlXzsKKyAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcl87CisgICAgLy8gQSBjYWNoZWQgdmFsdWUgb2YgKml0ZXJhdG9yXy4gV2Uga2VlcCBpdCBoZXJlIHRvIGFsbG93IGFjY2VzcyBieQorICAgIC8vIHBvaW50ZXIgaW4gdGhlIHdyYXBwaW5nIGl0ZXJhdG9yJ3Mgb3BlcmF0b3ItPigpLgorICAgIC8vIHZhbHVlXyBuZWVkcyB0byBiZSBtdXRhYmxlIHRvIGJlIGFjY2Vzc2VkIGluIEN1cnJlbnQoKS4KKyAgICAvLyBVc2Ugb2Ygc2NvcGVkX3B0ciBoZWxwcyBtYW5hZ2UgY2FjaGVkIHZhbHVlJ3MgbGlmZXRpbWUsCisgICAgLy8gd2hpY2ggaXMgYm91bmQgYnkgdGhlIGxpZmVzcGFuIG9mIHRoZSBpdGVyYXRvciBpdHNlbGYuCisgICAgbXV0YWJsZSBzY29wZWRfcHRyPGNvbnN0IFQ+IHZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvciYgb3RoZXIpOworCisgIGNvbnN0IENvbnRhaW5lclR5cGUgY29udGFpbmVyXzsKK307ICAvLyBjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBTdG9yZXMgYSBwYXJhbWV0ZXIgdmFsdWUgYW5kIGxhdGVyIGNyZWF0ZXMgdGVzdHMgcGFyYW1ldGVyaXplZCB3aXRoIHRoYXQKKy8vIHZhbHVlLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeSA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2xhc3M6OlBhcmFtVHlwZSBQYXJhbVR5cGU7CisgIGV4cGxpY2l0IFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSA6CisgICAgICBwYXJhbWV0ZXJfKHBhcmFtZXRlcikge30KKyAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgeworICAgIFRlc3RDbGFzczo6U2V0UGFyYW0oJnBhcmFtZXRlcl8pOworICAgIHJldHVybiBuZXcgVGVzdENsYXNzKCk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IFBhcmFtVHlwZSBwYXJhbWV0ZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5KTsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVGVzdE1ldGFGYWN0b3J5QmFzZSBpcyBhIGJhc2UgY2xhc3MgZm9yIG1ldGEtZmFjdG9yaWVzIHRoYXQgY3JlYXRlCisvLyB0ZXN0IGZhY3RvcmllcyBmb3IgcGFzc2luZyBpbnRvIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIGZ1bmN0aW9uLgordGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KK2NsYXNzIFRlc3RNZXRhRmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdE1ldGFGYWN0b3J5QmFzZSgpIHt9CisKKyAgdmlydHVhbCBUZXN0RmFjdG9yeUJhc2UqIENyZWF0ZVRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpID0gMDsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVGVzdE1ldGFGYWN0b3J5IGNyZWF0ZXMgdGVzdCBmYWN0b3JpZXMgZm9yIHBhc3NpbmcgaW50bworLy8gTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gZnVuY3Rpb24uIFNpbmNlIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIHJlY2VpdmVzCisvLyBvd25lcnNoaXAgb2YgdGVzdCBmYWN0b3J5IHBvaW50ZXIsIHNhbWUgZmFjdG9yeSBvYmplY3QgY2Fubm90IGJlIHBhc3NlZAorLy8gaW50byB0aGF0IG1ldGhvZCB0d2ljZS4gQnV0IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gaXMgZ29pbmcgdG8gY2FsbAorLy8gaXQgZm9yIGVhY2ggVGVzdC9QYXJhbWV0ZXIgdmFsdWUgY29tYmluYXRpb24uIFRodXMgaXQgbmVlZHMgbWV0YSBmYWN0b3J5CisvLyBjcmVhdG9yIGNsYXNzLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgorY2xhc3MgVGVzdE1ldGFGYWN0b3J5CisgICAgOiBwdWJsaWMgVGVzdE1ldGFGYWN0b3J5QmFzZTx0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlPiB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGUgUGFyYW1UeXBlOworCisgIFRlc3RNZXRhRmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCBUZXN0RmFjdG9yeUJhc2UqIENyZWF0ZVRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpIHsKKyAgICByZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeTxUZXN0Q2FzZT4ocGFyYW1ldGVyKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0TWV0YUZhY3RvcnkpOworfTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBpcyBhIGdlbmVyaWMgaW50ZXJmYWNlCisvLyB0byBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGNsYXNzZXMuIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlCisvLyBhY2N1bXVsYXRlcyB0ZXN0IGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IFRFU1RfUCBtYWNybyBpbnZvY2F0aW9ucworLy8gYW5kIGdlbmVyYXRvcnMgcHJvdmlkZWQgYnkgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaW52b2NhdGlvbnMKKy8vIGFuZCB1c2VzIHRoYXQgaW5mb3JtYXRpb24gdG8gcmVnaXN0ZXIgYWxsIHJlc3VsdGluZyB0ZXN0IGluc3RhbmNlcworLy8gaW4gUmVnaXN0ZXJUZXN0cyBtZXRob2QuIFRoZSBQYXJhbWV0ZXJpemVUZXN0Q2FzZVJlZ2lzdHJ5IGNsYXNzIGhvbGRzCisvLyBhIGNvbGxlY3Rpb24gb2YgcG9pbnRlcnMgdG8gdGhlIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gb2JqZWN0cworLy8gYW5kIGNhbGxzIFJlZ2lzdGVyVGVzdHMoKSBvbiBlYWNoIG9mIHRoZW0gd2hlbiBhc2tlZC4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKCkge30KKworICAvLyBCYXNlIHBhcnQgb2YgdGVzdCBjYXNlIG5hbWUgZm9yIGRpc3BsYXkgcHVycG9zZXMuCisgIHZpcnR1YWwgY29uc3QgU3RyaW5nJiBHZXRUZXN0Q2FzZU5hbWUoKSBjb25zdCA9IDA7CisgIC8vIFRlc3QgY2FzZSBpZCB0byB2ZXJpZnkgaWRlbnRpdHkuCisgIHZpcnR1YWwgVHlwZUlkIEdldFRlc3RDYXNlVHlwZUlkKCkgY29uc3QgPSAwOworICAvLyBVbml0VGVzdCBjbGFzcyBpbnZva2VzIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHRlc3RzIGluIHRoaXMKKyAgLy8gdGVzdCBjYXNlIHJpZ2h0IGJlZm9yZSBydW5uaW5nIHRoZW0gaW4gUlVOX0FMTF9URVNUUyBtYWNyby4KKyAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2Ugb24gYW55IHNpbmdsZQorICAvLyBpbnN0YW5jZSBvZiBhIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGRlcml2ZWQgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBSZWdpc3RlclRlc3RzKCkgPSAwOworCisgcHJvdGVjdGVkOgorICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSgpIHt9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKTsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBhY2N1bXVsYXRlcyB0ZXN0cyBvYnRhaW5lZCBmcm9tIFRFU1RfUAorLy8gbWFjcm8gaW52b2NhdGlvbnMgZm9yIGEgcGFydGljdWxhciB0ZXN0IGNhc2UgYW5kIGdlbmVyYXRvcnMKKy8vIG9idGFpbmVkIGZyb20gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaW52b2NhdGlvbnMgZm9yIHRoYXQKKy8vIHRlc3QgY2FzZS4gSXQgcmVnaXN0ZXJzIHRlc3RzIHdpdGggYWxsIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYWxsCisvLyBnZW5lcmF0b3JzIHdoZW4gYXNrZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+CitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIDogcHVibGljIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIHsKKyBwdWJsaWM6CisgIC8vIFBhcmFtVHlwZSBhbmQgR2VuZXJhdG9yQ3JlYXRpb25GdW5jIGFyZSBwcml2YXRlIHR5cGVzIGJ1dCBhcmUgcmVxdWlyZWQKKyAgLy8gZm9yIGRlY2xhcmF0aW9ucyBvZiBwdWJsaWMgbWV0aG9kcyBBZGRUZXN0UGF0dGVybigpIGFuZAorICAvLyBBZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oKS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKKyAgLy8gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYXBwcm9wcmlhdGUgZ2VuZXJhdG9yIHR5cGUuCisgIHR5cGVkZWYgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPihHZW5lcmF0b3JDcmVhdGlvbkZ1bmMpKCk7CisKKyAgZXhwbGljaXQgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyhjb25zdCBjaGFyKiBuYW1lKQorICAgICAgOiB0ZXN0X2Nhc2VfbmFtZV8obmFtZSkge30KKworICAvLyBUZXN0IGNhc2UgYmFzZSBuYW1lIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICB2aXJ0dWFsIGNvbnN0IFN0cmluZyYgR2V0VGVzdENhc2VOYW1lKCkgY29uc3QgeyByZXR1cm4gdGVzdF9jYXNlX25hbWVfOyB9CisgIC8vIFRlc3QgY2FzZSBpZCB0byB2ZXJpZnkgaWRlbnRpdHkuCisgIHZpcnR1YWwgVHlwZUlkIEdldFRlc3RDYXNlVHlwZUlkKCkgY29uc3QgeyByZXR1cm4gR2V0VHlwZUlkPFRlc3RDYXNlPigpOyB9CisgIC8vIFRFU1RfUCBtYWNybyB1c2VzIEFkZFRlc3RQYXR0ZXJuKCkgdG8gcmVjb3JkIGluZm9ybWF0aW9uCisgIC8vIGFib3V0IGEgc2luZ2xlIHRlc3QgaW4gYSBMb2NhbFRlc3RJbmZvIHN0cnVjdHVyZS4KKyAgLy8gdGVzdF9jYXNlX25hbWUgaXMgdGhlIGJhc2UgbmFtZSBvZiB0aGUgdGVzdCBjYXNlICh3aXRob3V0IGludm9jYXRpb24KKyAgLy8gcHJlZml4KS4gdGVzdF9iYXNlX25hbWUgaXMgdGhlIG5hbWUgb2YgYW4gaW5kaXZpZHVhbCB0ZXN0IHdpdGhvdXQKKyAgLy8gcGFyYW1ldGVyIGluZGV4LiBGb3IgdGhlIHRlc3QgU2VxdWVuY2VBL0Zvb1Rlc3QuRG9CYXIvMSBGb29UZXN0IGlzCisgIC8vIHRlc3QgY2FzZSBiYXNlIG5hbWUgYW5kIERvQmFyIGlzIHRlc3QgYmFzZSBuYW1lLgorICB2b2lkIEFkZFRlc3RQYXR0ZXJuKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiogbWV0YV9mYWN0b3J5KSB7CisgICAgdGVzdHNfLnB1c2hfYmFjayhsaW5rZWRfcHRyPFRlc3RJbmZvPihuZXcgVGVzdEluZm8odGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9iYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9mYWN0b3J5KSkpOworICB9CisgIC8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIHVzZXMgQWRkR2VuZXJhdG9yKCkgdG8gcmVjb3JkIGluZm9ybWF0aW9uCisgIC8vIGFib3V0IGEgZ2VuZXJhdG9yLgorICBpbnQgQWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKGNvbnN0IGNoYXIqIGluc3RhbnRpYXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMqIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogZmlsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogbGluZSAqLykgeworICAgIGluc3RhbnRpYXRpb25zXy5wdXNoX2JhY2soOjpzdGQ6Om1ha2VfcGFpcihpbnN0YW50aWF0aW9uX25hbWUsIGZ1bmMpKTsKKyAgICByZXR1cm4gMDsgIC8vIFJldHVybiB2YWx1ZSB1c2VkIG9ubHkgdG8gcnVuIHRoaXMgbWV0aG9kIGluIG5hbWVzcGFjZSBzY29wZS4KKyAgfQorICAvLyBVbml0VGVzdCBjbGFzcyBpbnZva2VzIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlCisgIC8vIHRlc3QgY2FzZXMgcmlnaHQgYmVmb3JlIHJ1bm5pbmcgdGVzdHMgaW4gUlVOX0FMTF9URVNUUyBtYWNyby4KKyAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2Ugb24gYW55IHNpbmdsZQorICAvLyBpbnN0YW5jZSBvZiBhIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGRlcml2ZWQgY2xhc3MuCisgIC8vIFVuaXRUZXN0IGhhcyBhIGd1YXJkIHRvIHByZXZlbnQgZnJvbSBjYWxsaW5nIHRoaXMgbWV0aG9kIG1vcmUgdGhlbiBvbmNlLgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJUZXN0cygpIHsKKyAgICBmb3IgKHR5cGVuYW1lIFRlc3RJbmZvQ29udGFpbmVyOjppdGVyYXRvciB0ZXN0X2l0ID0gdGVzdHNfLmJlZ2luKCk7CisgICAgICAgICB0ZXN0X2l0ICE9IHRlc3RzXy5lbmQoKTsgKyt0ZXN0X2l0KSB7CisgICAgICBsaW5rZWRfcHRyPFRlc3RJbmZvPiB0ZXN0X2luZm8gPSAqdGVzdF9pdDsKKyAgICAgIGZvciAodHlwZW5hbWUgSW5zdGFudGlhdGlvbkNvbnRhaW5lcjo6aXRlcmF0b3IgZ2VuX2l0ID0KKyAgICAgICAgICAgICAgIGluc3RhbnRpYXRpb25zXy5iZWdpbigpOyBnZW5faXQgIT0gaW5zdGFudGlhdGlvbnNfLmVuZCgpOworICAgICAgICAgICAgICAgKytnZW5faXQpIHsKKyAgICAgICAgY29uc3QgU3RyaW5nJiBpbnN0YW50aWF0aW9uX25hbWUgPSBnZW5faXQtPmZpcnN0OworICAgICAgICBQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+IGdlbmVyYXRvcigoKmdlbl9pdC0+c2Vjb25kKSgpKTsKKworICAgICAgICBNZXNzYWdlIHRlc3RfY2FzZV9uYW1lX3N0cmVhbTsKKyAgICAgICAgaWYgKCAhaW5zdGFudGlhdGlvbl9uYW1lLmVtcHR5KCkgKQorICAgICAgICAgIHRlc3RfY2FzZV9uYW1lX3N0cmVhbSA8PCBpbnN0YW50aWF0aW9uX25hbWUuY19zdHIoKSA8PCAiLyI7CisgICAgICAgIHRlc3RfY2FzZV9uYW1lX3N0cmVhbSA8PCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9iYXNlX25hbWUuY19zdHIoKTsKKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAodHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPjo6aXRlcmF0b3IgcGFyYW1faXQgPQorICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgICAgICAgICAgICBwYXJhbV9pdCAhPSBnZW5lcmF0b3IuZW5kKCk7ICsrcGFyYW1faXQsICsraSkgeworICAgICAgICAgIE1lc3NhZ2UgdGVzdF9uYW1lX3N0cmVhbTsKKyAgICAgICAgICB0ZXN0X25hbWVfc3RyZWFtIDw8IHRlc3RfaW5mby0+dGVzdF9iYXNlX25hbWUuY19zdHIoKSA8PCAiLyIgPDwgaTsKKyAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICAgICAgICAgICAgdGVzdF9jYXNlX25hbWVfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgIHRlc3RfbmFtZV9zdHJlYW0uR2V0U3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIiIsICAvLyB0ZXN0X2Nhc2VfY29tbWVudAorICAgICAgICAgICAgICAiIiwgIC8vIGNvbW1lbnQ7IFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IHByb3ZpZGUgcGFyYW1ldGVyIHZhbHVlCisgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgICAgIEdldFRlc3RDYXNlVHlwZUlkKCksCisgICAgICAgICAgICAgIFRlc3RDYXNlOjpTZXRVcFRlc3RDYXNlLAorICAgICAgICAgICAgICBUZXN0Q2FzZTo6VGVhckRvd25UZXN0Q2FzZSwKKyAgICAgICAgICAgICAgdGVzdF9pbmZvLT50ZXN0X21ldGFfZmFjdG9yeS0+Q3JlYXRlVGVzdEZhY3RvcnkoKnBhcmFtX2l0KSk7CisgICAgICAgIH0gIC8vIGZvciBwYXJhbV9pdAorICAgICAgfSAgLy8gZm9yIGdlbl9pdAorICAgIH0gIC8vIGZvciB0ZXN0X2l0CisgIH0gIC8vIFJlZ2lzdGVyVGVzdHMKKworIHByaXZhdGU6CisgIC8vIExvY2FsVGVzdEluZm8gc3RydWN0dXJlIGtlZXBzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHRlc3QgcmVnaXN0ZXJlZAorICAvLyB3aXRoIFRFU1RfUCBtYWNyby4KKyAgc3RydWN0IFRlc3RJbmZvIHsKKyAgICBUZXN0SW5mbyhjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9iYXNlX25hbWUsCisgICAgICAgICAgICAgY29uc3QgY2hhciogYV90ZXN0X2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICBUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4qIGFfdGVzdF9tZXRhX2ZhY3RvcnkpIDoKKyAgICAgICAgdGVzdF9jYXNlX2Jhc2VfbmFtZShhX3Rlc3RfY2FzZV9iYXNlX25hbWUpLAorICAgICAgICB0ZXN0X2Jhc2VfbmFtZShhX3Rlc3RfYmFzZV9uYW1lKSwKKyAgICAgICAgdGVzdF9tZXRhX2ZhY3RvcnkoYV90ZXN0X21ldGFfZmFjdG9yeSkge30KKworICAgIGNvbnN0IFN0cmluZyB0ZXN0X2Nhc2VfYmFzZV9uYW1lOworICAgIGNvbnN0IFN0cmluZyB0ZXN0X2Jhc2VfbmFtZTsKKyAgICBjb25zdCBzY29wZWRfcHRyPFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiA+IHRlc3RfbWV0YV9mYWN0b3J5OworICB9OworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8bGlua2VkX3B0cjxUZXN0SW5mbz4gPiBUZXN0SW5mb0NvbnRhaW5lcjsKKyAgLy8gS2VlcHMgcGFpcnMgb2YgPEluc3RhbnRpYXRpb24gbmFtZSwgU2VxdWVuY2UgZ2VuZXJhdG9yIGNyZWF0aW9uIGZ1bmN0aW9uPgorICAvLyByZWNlaXZlZCBmcm9tIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3Jvcy4KKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTdHJpbmcsIEdlbmVyYXRvckNyZWF0aW9uRnVuYyo+ID4KKyAgICAgIEluc3RhbnRpYXRpb25Db250YWluZXI7CisKKyAgY29uc3QgU3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsKKyAgVGVzdEluZm9Db250YWluZXIgdGVzdHNfOworICBJbnN0YW50aWF0aW9uQ29udGFpbmVyIGluc3RhbnRpYXRpb25zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8pOworfTsgIC8vIGNsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBjb250YWlucyBhIG1hcCBvZiBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZQorLy8gY2xhc3NlcyBhY2Nlc3NlZCBieSB0ZXN0IGNhc2UgbmFtZXMuIFRFU1RfUCBhbmQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AKKy8vIG1hY3JvcyB1c2UgaXQgdG8gbG9jYXRlIHRoZWlyIGNvcnJlc3BvbmRpbmcgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbworLy8gZGVzY3JpcHRvcnMuCitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSB7CisgcHVibGljOgorICBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSgpIHt9CisgIH5QYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSgpIHsKKyAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7CisgICAgICBkZWxldGUgKml0OworICAgIH0KKyAgfQorCisgIC8vIExvb2tzIHVwIG9yIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dAorICAvLyB0ZXN0cyBhbmQgaW5zdGFudGlhdGlvbnMgb2YgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgorICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyKAorICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgaW50IGxpbmUpIHsKKyAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogdHlwZWRfdGVzdF9pbmZvID0gTlVMTDsKKyAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7CisgICAgICBpZiAoKCppdCktPkdldFRlc3RDYXNlTmFtZSgpID09IHRlc3RfY2FzZV9uYW1lKSB7CisgICAgICAgIGlmICgoKml0KS0+R2V0VGVzdENhc2VUeXBlSWQoKSAhPSBHZXRUeXBlSWQ8VGVzdENhc2U+KCkpIHsKKyAgICAgICAgICAvLyBDb21wbGFpbiBhYm91dCBpbmNvcnJlY3QgdXNhZ2Ugb2YgR29vZ2xlIFRlc3QgZmFjaWxpdGllcworICAgICAgICAgIC8vIGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0gc2luY2Ugd2UgY2Fubm90IGd1YXJhbnR5IGNvcnJlY3QKKyAgICAgICAgICAvLyB0ZXN0IGNhc2Ugc2V0dXAgYW5kIHRlYXItZG93biBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZSh0ZXN0X2Nhc2VfbmFtZSwgIGZpbGUsIGxpbmUpOworICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBvYmplY3Qgd2UgZm91bmQgaXMgb2YgdGhlIHNhbWUKKyAgICAgICAgICAvLyB0eXBlIHdlIGFyZSBsb29raW5nIGZvciwgc28gd2UgZG93bmNhc3QgaXQgdG8gdGhhdCB0eXBlCisgICAgICAgICAgLy8gd2l0aG91dCBmdXJ0aGVyIGNoZWNrcy4KKyAgICAgICAgICB0eXBlZF90ZXN0X2luZm8gPSBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8CisgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+ID4oKml0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHR5cGVkX3Rlc3RfaW5mbyA9PSBOVUxMKSB7CisgICAgICB0eXBlZF90ZXN0X2luZm8gPSBuZXcgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4odGVzdF9jYXNlX25hbWUpOworICAgICAgdGVzdF9jYXNlX2luZm9zXy5wdXNoX2JhY2sodHlwZWRfdGVzdF9pbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVkX3Rlc3RfaW5mbzsKKyAgfQorICB2b2lkIFJlZ2lzdGVyVGVzdHMoKSB7CisgICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgeworICAgICAgKCppdCktPlJlZ2lzdGVyVGVzdHMoKTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSo+IFRlc3RDYXNlSW5mb0NvbnRhaW5lcjsKKworICBUZXN0Q2FzZUluZm9Db250YWluZXIgdGVzdF9jYXNlX2luZm9zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmggYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODMyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oCkBAIC0wLDAgKzEsMTUwMSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gTG93LWxldmVsIHR5cGVzIGFuZCB1dGlsaXRpZXMgZm9yIHBvcnRpbmcgR29vZ2xlIFRlc3QgdG8gdmFyaW91cworLy8gcGxhdGZvcm1zLiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBETyBOT1QgVVNFCisvLyBUSEVNIElOIFVTRVIgQ09ERS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCisKKy8vIFRoZSB1c2VyIGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3MgaW4gdGhlIGJ1aWxkIHNjcmlwdCB0bworLy8gY29udHJvbCBHb29nbGUgVGVzdCdzIGJlaGF2aW9yLiAgSWYgdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgYSBtYWNybworLy8gaW4gdGhpcyBsaXN0LCBHb29nbGUgVGVzdCB3aWxsIGRlZmluZSBpdC4KKy8vCisvLyAgIEdURVNUX0hBU19DTE9ORSAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBjbG9uZSgyKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19FWENFUFRJT05TICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBleGNlcHRpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RyaW5nLCB3aGljaCBpcyBkaWZmZXJlbnQgdG8gc3RkOjpzdHJpbmcpLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6d3N0cmluZywgd2hpY2ggaXMgZGlmZmVyZW50IHRvIHN0ZDo6d3N0cmluZykuCisvLyAgIEdURVNUX0hBU19QVEhSRUFEICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCA8cHRocmVhZC5oPgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19SVFRJICAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBSVFRJIGlzL2lzbid0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQuCisvLyAgIEdURVNUX0hBU19TVERfV1NUUklORyAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OndzdHJpbmcgZG9lcy9kb2Vzbid0IHdvcmsgKEdvb2dsZSBUZXN0IGNhbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIHdoZXJlIHN0ZDo6d3N0cmluZyBpcyB1bmF2YWlsYWJsZSkuCisvLyAgIEdURVNUX0hBU19UUjFfVFVQTEUgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdHIxOjp0dXBsZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19TRUggICAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIgc3VwcG9ydHMgTWljcm9zb2Z0J3MgIlN0cnVjdHVyZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIEhhbmRsaW5nIi4KKy8vICAgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIEdvb2dsZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0J3Mgb3duIHRyMSB0dXBsZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZC4gIFVudXNlZCB3aGVuIHRoZSB1c2VyIHNldHMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfSEFTX1RSMV9UVVBMRSB0byAwLgorLy8gICBHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIHRvIDEgd2hlbiBjb21waWxpbmcgdGVzdHMgdGhhdCB1c2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZ2xlIFRlc3QgYXMgYSBzaGFyZWQgbGlicmFyeSAoa25vd24gYXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRExMIG9uIFdpbmRvd3MpLgorLy8gICBHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIHRvIDEgd2hlbiBjb21waWxpbmcgR29vZ2xlIFRlc3QgaXRzZWxmCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgc2hhcmVkIGxpYnJhcnkuCisKKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIGZvbGxvd2luZyB1dGlsaXRpZXM6CisvLworLy8gTWFjcm9zIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0gKGRlZmluZWQgdG8gMSBpZiBjb21waWxlZCBvbgorLy8gdGhlIGdpdmVuIHBsYXRmb3JtOyBvdGhlcndpc2UgdW5kZWZpbmVkKToKKy8vICAgR1RFU1RfT1NfQUlYICAgICAgLSBJQk0gQUlYCisvLyAgIEdURVNUX09TX0NZR1dJTiAgIC0gQ3lnd2luCisvLyAgIEdURVNUX09TX0hBSUtVICAgIC0gSGFpa3UKKy8vICAgR1RFU1RfT1NfTElOVVggICAgLSBMaW51eAorLy8gICBHVEVTVF9PU19NQUMgICAgICAtIE1hYyBPUyBYCisvLyAgIEdURVNUX09TX1NPTEFSSVMgIC0gU3VuIFNvbGFyaXMKKy8vICAgR1RFU1RfT1NfU1lNQklBTiAgLSBTeW1iaWFuCisvLyAgIEdURVNUX09TX1dJTkRPV1MgIC0gV2luZG93cyAoRGVza3RvcCwgTWluR1csIG9yIE1vYmlsZSkKKy8vICAgICBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgIC0gV2luZG93cyBEZXNrdG9wCisvLyAgICAgR1RFU1RfT1NfV0lORE9XU19NSU5HVyAgICAtIE1pbkdXCisvLyAgICAgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgICAtIFdpbmRvd3MgTW9iaWxlCisvLyAgIEdURVNUX09TX1pPUyAgICAgIC0gei9PUworLy8KKy8vIEFtb25nIHRoZSBwbGF0Zm9ybXMsIEN5Z3dpbiwgTGludXgsIE1heCBPUyBYLCBhbmQgV2luZG93cyBoYXZlIHRoZQorLy8gbW9zdCBzdGFibGUgc3VwcG9ydC4gIFNpbmNlIGNvcmUgbWVtYmVycyBvZiB0aGUgR29vZ2xlIFRlc3QgcHJvamVjdAorLy8gZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gb3RoZXIgcGxhdGZvcm1zLCBzdXBwb3J0IGZvciB0aGVtIG1heSBiZSBsZXNzCisvLyBzdGFibGUuICBJZiB5b3Ugbm90aWNlIGFueSBwcm9ibGVtcyBvbiB5b3VyIHBsYXRmb3JtLCBwbGVhc2Ugbm90aWZ5CisvLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gKHBhdGNoZXMgZm9yIGZpeGluZyB0aGVtIGFyZQorLy8gZXZlbiBtb3JlIHdlbGNvbWUhKS4KKy8vCisvLyBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdCBub25lIG9mIHRoZSBHVEVTVF9PU18qIG1hY3JvcyBhcmUgZGVmaW5lZC4KKy8vCisvLyBNYWNyb3MgaW5kaWNhdGluZyBhdmFpbGFibGUgR29vZ2xlIFRlc3QgZmVhdHVyZXMgKGRlZmluZWQgdG8gMSBpZgorLy8gdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBpcyBzdXBwb3J0ZWQ7IG90aGVyd2lzZSB1bmRlZmluZWQpOgorLy8gICBHVEVTVF9IQVNfQ09NQklORSAgICAgIC0gdGhlIENvbWJpbmUoKSBmdW5jdGlvbiAoZm9yIHZhbHVlLXBhcmFtZXRlcml6ZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzKQorLy8gICBHVEVTVF9IQVNfREVBVEhfVEVTVCAgIC0gZGVhdGggdGVzdHMKKy8vICAgR1RFU1RfSEFTX1BBUkFNX1RFU1QgICAtIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vICAgR1RFU1RfSEFTX1RZUEVEX1RFU1QgICAtIHR5cGVkIHRlc3RzCisvLyAgIEdURVNUX0hBU19UWVBFRF9URVNUX1AgLSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vICAgR1RFU1RfVVNFU19QT1NJWF9SRSAgICAtIGVuaGFuY2VkIFBPU0lYIHJlZ2V4IGlzIHVzZWQuCisvLyAgIEdURVNUX1VTRVNfU0lNUExFX1JFICAgLSBvdXIgb3duIHNpbXBsZSByZWdleCBpcyB1c2VkOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFib3ZlIHR3byBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorLy8gICBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIC0gYWNjZXB0cyB1bnR5cGVkIE5VTEwgaW4gRVhQRUNUX0VRKCkuCisvLworLy8gTWFjcm9zIGZvciBiYXNpYyBDKysgY29kaW5nOgorLy8gICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyAtIGZvciBkaXNhYmxpbmcgYSBnY2Mgd2FybmluZy4KKy8vICAgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gIC0gZGVjbGFyZXMgdGhhdCBhIGNsYXNzJyBpbnN0YW5jZXMgb3IgYQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBkb24ndCBoYXZlIHRvIGJlIHVzZWQuCisvLyAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8gICAtIGRpc2FibGVzIG9wZXJhdG9yPS4KKy8vICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyAtIGRpc2FibGVzIGNvcHkgY3RvciBhbmQgb3BlcmF0b3I9LgorLy8gICBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfICAgLSBkZWNsYXJlcyB0aGF0IGEgZnVuY3Rpb24ncyByZXN1bHQgbXVzdCBiZSB1c2VkLgorLy8KKy8vIFN5bmNocm9uaXphdGlvbjoKKy8vICAgTXV0ZXgsIE11dGV4TG9jaywgVGhyZWFkTG9jYWwsIEdldFRocmVhZENvdW50KCkKKy8vICAgICAgICAgICAgICAgICAgLSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKy8vICAgR1RFU1RfSVNfVEhSRUFEU0FGRSAtIGRlZmluZWQgdG8gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBhYm92ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgaGF2ZSByZWFsIGltcGxlbWVudGF0aW9ucworLy8gICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEdvb2dsZSBUZXN0IGlzIHRocmVhZC1zYWZlOyBvciAwIG90aGVyd2lzZS4KKy8vCisvLyBUZW1wbGF0ZSBtZXRhIHByb2dyYW1taW5nOgorLy8gICBpc19wb2ludGVyICAgICAtIGFzIGluIFRSMTsgbmVlZGVkIG9uIFN5bWJpYW4gYW5kIElCTSBYTCBDL0MrKyBvbmx5LgorLy8KKy8vIFNtYXJ0IHBvaW50ZXJzOgorLy8gICBzY29wZWRfcHRyICAgICAtIGFzIGluIFRSMi4KKy8vCisvLyBSZWd1bGFyIGV4cHJlc3Npb25zOgorLy8gICBSRSAgICAgICAgICAgICAtIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjbGFzcyB1c2luZyB0aGUgUE9TSVgKKy8vICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4LiAgTm90IGF2YWlsYWJsZSBvbgorLy8gICAgICAgICAgICAgICAgICAgIFdpbmRvd3MuCisvLworLy8gTG9nZ2luZzoKKy8vICAgR1RFU1RfTE9HXygpICAgLSBsb2dzIG1lc3NhZ2VzIGF0IHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgbGV2ZWwuCisvLyAgIExvZ1RvU3RkZXJyKCkgIC0gZGlyZWN0cyBhbGwgbG9nIG1lc3NhZ2VzIHRvIHN0ZGVyci4KKy8vICAgRmx1c2hJbmZvTG9nKCkgLSBmbHVzaGVzIGluZm9ybWF0aW9uYWwgbG9nIG1lc3NhZ2VzLgorLy8KKy8vIFN0ZG91dCBhbmQgc3RkZXJyIGNhcHR1cmluZzoKKy8vICAgQ2FwdHVyZVN0ZG91dCgpICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0LgorLy8gICBHZXRDYXB0dXJlZFN0ZG91dCgpIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZG91dCBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4KKy8vICAgQ2FwdHVyZVN0ZGVycigpICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgorLy8gICBHZXRDYXB0dXJlZFN0ZGVycigpIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4KKy8vCisvLyBJbnRlZ2VyIHR5cGVzOgorLy8gICBUeXBlV2l0aFNpemUgICAtIG1hcHMgYW4gaW50ZWdlciB0byBhIGludCB0eXBlLgorLy8gICBJbnQzMiwgVUludDMyLCBJbnQ2NCwgVUludDY0LCBUaW1lSW5NaWxsaXMKKy8vICAgICAgICAgICAgICAgICAgLSBpbnRlZ2VycyBvZiBrbm93biBzaXplcy4KKy8vICAgQmlnZ2VzdEludCAgICAgLSB0aGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlLgorLy8KKy8vIENvbW1hbmQtbGluZSB1dGlsaXRpZXM6CisvLyAgIEdURVNUX0ZMQUcoKSAgICAgICAtIHJlZmVyZW5jZXMgYSBmbGFnLgorLy8gICBHVEVTVF9ERUNMQVJFXyooKSAgLSBkZWNsYXJlcyBhIGZsYWcuCisvLyAgIEdURVNUX0RFRklORV8qKCkgICAtIGRlZmluZXMgYSBmbGFnLgorLy8gICBHZXRBcmd2cygpICAgICAgICAgLSByZXR1cm5zIHRoZSBjb21tYW5kIGxpbmUgYXMgYSB2ZWN0b3Igb2Ygc3RyaW5ncy4KKy8vCisvLyBFbnZpcm9ubWVudCB2YXJpYWJsZSB1dGlsaXRpZXM6CisvLyAgIEdldEVudigpICAgICAgICAgICAgIC0gZ2V0cyB0aGUgdmFsdWUgb2YgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCisvLyAgIEJvb2xGcm9tR1Rlc3RFbnYoKSAgIC0gcGFyc2VzIGEgYm9vbCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKy8vICAgSW50MzJGcm9tR1Rlc3RFbnYoKSAgLSBwYXJzZXMgYW4gSW50MzIgZW52aXJvbm1lbnQgdmFyaWFibGUuCisvLyAgIFN0cmluZ0Zyb21HVGVzdEVudigpIC0gcGFyc2VzIGEgc3RyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlLgorCisjaW5jbHVkZSA8c3RkZGVmLmg+ICAvLyBGb3IgcHRyZGlmZl90CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgX1dJTjMyX1dDRQorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgIC8vICFfV0lOMzJfV0NFCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzdHJpbmc+ICAvLyBOT0xJTlQKKworI2RlZmluZSBHVEVTVF9ERVZfRU1BSUxfICJnb29nbGV0ZXN0ZnJhbWV3b3JrQEBnb29nbGVncm91cHMuY29tIgorI2RlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF8gImd0ZXN0XyIKKyNkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfREFTSF8gImd0ZXN0LSIKKyNkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJHVEVTVF8iCisjZGVmaW5lIEdURVNUX05BTUVfICJHb29nbGUgVGVzdCIKKyNkZWZpbmUgR1RFU1RfUFJPSkVDVF9VUkxfICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8iCisKKy8vIERldGVybWluZXMgdGhlIHZlcnNpb24gb2YgZ2NjIHRoYXQgaXMgdXNlZCB0byBjb21waWxlIHRoaXMuCisjaWZkZWYgX19HTlVDX18KKy8vIDQwMzAyIG1lYW5zIHZlcnNpb24gNC4zLjIuCisjZGVmaW5lIEdURVNUX0dDQ19WRVJfIFwKKyAgICAoX19HTlVDX18qMTAwMDAgKyBfX0dOVUNfTUlOT1JfXyoxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQorI2VuZGlmICAvLyBfX0dOVUNfXworCisvLyBEZXRlcm1pbmVzIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCBHb29nbGUgVGVzdCBpcyBjb21waWxlZC4KKyNpZmRlZiBfX0NZR1dJTl9fCisjZGVmaW5lIEdURVNUX09TX0NZR1dJTiAxCisjZWxpZiBkZWZpbmVkIF9fU1lNQklBTjMyX18KKyNkZWZpbmUgR1RFU1RfT1NfU1lNQklBTiAxCisjZWxpZiBkZWZpbmVkIF9XSU4zMgorI2RlZmluZSBHVEVTVF9PU19XSU5ET1dTIDEKKyNpZmRlZiBfV0lOMzJfV0NFCisjZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIDEKKyNlbGlmIGRlZmluZWQoX19NSU5HV19fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorI2RlZmluZSBHVEVTVF9PU19XSU5ET1dTX01JTkdXIDEKKyNlbHNlCisjZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAxCisjZW5kaWYgIC8vIF9XSU4zMl9XQ0UKKyNlbGlmIGRlZmluZWQgX19BUFBMRV9fCisjZGVmaW5lIEdURVNUX09TX01BQyAxCisjZWxpZiBkZWZpbmVkIF9fbGludXhfXworI2RlZmluZSBHVEVTVF9PU19MSU5VWCAxCisjZWxpZiBkZWZpbmVkIF9fTVZTX18KKyNkZWZpbmUgR1RFU1RfT1NfWk9TIDEKKyNlbGlmIGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19TVlI0KQorI2RlZmluZSBHVEVTVF9PU19TT0xBUklTIDEKKyNlbGlmIGRlZmluZWQoX0FJWCkKKyNkZWZpbmUgR1RFU1RfT1NfQUlYIDEKKyNlbGlmIGRlZmluZWQoX19IQUlLVV9fKQorI2RlZmluZSBHVEVTVF9PU19IQUlLVSAxCisjZW5kaWYgIC8vIF9fQ1lHV0lOX18KKworI2lmIEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19IQUlLVSB8fCBHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMgfHwgXAorICAgIEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfU09MQVJJUyB8fCBHVEVTVF9PU19BSVgKKworLy8gT24gc29tZSBwbGF0Zm9ybXMsIDxyZWdleC5oPiBuZWVkcyBzb21lb25lIHRvIGRlZmluZSBzaXplX3QsIGFuZAorLy8gd29uJ3QgY29tcGlsZSBvdGhlcndpc2UuICBXZSBjYW4gI2luY2x1ZGUgaXQgaGVyZSBhcyB3ZSBhbHJlYWR5CisvLyBpbmNsdWRlZCA8c3RkbGliLmg+LCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGRlZmluZSBzaXplX3QgdGhyb3VnaAorLy8gPHN0ZGRlZi5oPi4KKyNpbmNsdWRlIDxyZWdleC5oPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDx0aW1lLmg+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVAorCisjZGVmaW5lIEdURVNUX1VTRVNfUE9TSVhfUkUgMQorCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisKKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyNpbmNsdWRlIDxkaXJlY3QuaD4gIC8vIE5PTElOVAorI2luY2x1ZGUgPGlvLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCisvLyA8cmVnZXguaD4gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLiAgVXNlIG91ciBvd24gc2ltcGxlIHJlZ2V4CisvLyBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgorI2RlZmluZSBHVEVTVF9VU0VTX1NJTVBMRV9SRSAxCisKKyNlbHNlCisKKy8vIDxyZWdleC5oPiBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLiAgVXNlIG91ciBvd24KKy8vIHNpbXBsZSByZWdleCBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgorI2RlZmluZSBHVEVTVF9VU0VTX1NJTVBMRV9SRSAxCisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX0xJTlVYIHx8IEdURVNUX09TX01BQyB8fAorICAgICAgICAvLyBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1NPTEFSSVMgfHwgR1RFU1RfT1NfQUlYCisKKyNpZm5kZWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKy8vIE1TVkMncyBhbmQgQysrQnVpbGRlcidzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgU1RMIHVzZSB0aGUgX0hBU19FWENFUFRJT05TCisvLyBtYWNybyB0byBlbmFibGUgZXhjZXB0aW9ucywgc28gd2UnbGwgZG8gdGhlIHNhbWUuCisvLyBBc3N1bWVzIHRoYXQgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorI2lmbmRlZiBfSEFTX0VYQ0VQVElPTlMKKyNkZWZpbmUgX0hBU19FWENFUFRJT05TIDEKKyNlbmRpZiAgLy8gX0hBU19FWENFUFRJT05TCisjZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIF9IQVNfRVhDRVBUSU9OUworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19FWENFUFRJT05TCisvLyBnY2MgZGVmaW5lcyBfX0VYQ0VQVElPTlMgdG8gMSBpZmYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZC4KKyNkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DQykKKy8vIFN1biBQcm8gQ0Mgc3VwcG9ydHMgZXhjZXB0aW9ucy4gIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGNvbXBpbGUtdGltZSB3YXkgb2YKKy8vIGRldGVjdGluZyB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWQgb3Igbm90LiAgVGhlcmVmb3JlLCB3ZSBhc3N1bWUgdGhhdAorLy8gdGhleSBhcmUgZW5hYmxlZCB1bmxlc3MgdGhlIHVzZXIgdGVsbHMgdXMgb3RoZXJ3aXNlLgorI2RlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCisjZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmIF9fRVhDRVBUSU9OUworLy8geGxDIGRlZmluZXMgX19FWENFUFRJT05TIHRvIDEgaWZmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCisjZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKKyNlbHNlCisvLyBGb3Igb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQgdG8gYmUKKy8vIGNvbnNlcnZhdGl2ZS4KKyNkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMAorI2VuZGlmICAvLyBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworI2lmICFkZWZpbmVkKEdURVNUX0hBU19TVERfU1RSSU5HKQorLy8gRXZlbiB0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgbWFjcm8gYW55IGxvbmdlciwgd2Uga2VlcCBpdCBpbiBjYXNlCisvLyBzb21lIGNsaWVudHMgc3RpbGwgZGVwZW5kIG9uIGl0LgorI2RlZmluZSBHVEVTVF9IQVNfU1REX1NUUklORyAxCisjZWxpZiAhR1RFU1RfSEFTX1NURF9TVFJJTkcKKy8vIFRoZSB1c2VyIHRvbGQgdXMgdGhhdCA6OnN0ZDo6c3RyaW5nIGlzbid0IGF2YWlsYWJsZS4KKyNlcnJvciAiR29vZ2xlIFRlc3QgY2Fubm90IGJlIHVzZWQgd2hlcmUgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuIgorI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykKKworI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKKy8vIHRvIGZpZ3VyZSBpdCBvdXQuCisKKyNkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgMAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyNpZm5kZWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiB1c2VzIGF1dG9jb25mIHRvIGRldGVjdCB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nCisvLyAgIGlzIGF2YWlsYWJsZS4KKworLy8gQ3lnd2luIDEuNSBhbmQgYmVsb3cgZG9lc24ndCBzdXBwb3J0IDo6c3RkOjp3c3RyaW5nLgorLy8gQ3lnd2luIDEuNyBtaWdodCBhZGQgd3N0cmluZyBzdXBwb3J0OyB0aGlzIHNob3VsZCBiZSB1cGRhdGVkIHdoZW4gY2xlYXIuCisvLyBTb2xhcmlzJyBsaWJjKysgZG9lc24ndCBzdXBwb3J0IGl0IGVpdGhlci4KKy8vIE1pbml4IGN1cnJlbnRseSBkb2Vzbid0IHN1cHBvcnQgaXQgZWl0aGVyLgorI2RlZmluZSBHVEVTVF9IQVNfU1REX1dTVFJJTkcgKCEoR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX1NPTEFSSVMgfHwgR1RFU1RfT1NfSEFJS1UgfHwgZGVmaW5lZChfTUlOSVgpKSkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKyNkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HIFwKKyAgICAoR1RFU1RfSEFTX1NURF9XU1RSSU5HICYmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIFJUVEkgaXMgYXZhaWxhYmxlLgorI2lmbmRlZiBHVEVTVF9IQVNfUlRUSQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciBSVFRJIGlzIGVuYWJsZWQsIHNvIHdlIG5lZWQgdG8KKy8vIGZpZ3VyZSBpdCBvdXQuCisKKyNpZmRlZiBfTVNDX1ZFUgorCisjaWZkZWYgX0NQUFJUVEkgIC8vIE1TVkMgZGVmaW5lcyB0aGlzIG1hY3JvIGlmZiBSVFRJIGlzIGVuYWJsZWQuCisjZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyNlbHNlCisjZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKKyNlbmRpZgorCisvLyBTdGFydGluZyB3aXRoIHZlcnNpb24gNC4zLjIsIGdjYyBkZWZpbmVzIF9fR1hYX1JUVEkgaWZmIFJUVEkgaXMgZW5hYmxlZC4KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDMwMikKKworI2lmZGVmIF9fR1hYX1JUVEkKKyNkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMQorI2Vsc2UKKyNkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorI2VuZGlmICAvLyBfX0dYWF9SVFRJCisKKy8vIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiA5LjAgSUJNIFZpc3VhbCBBZ2UgZGVmaW5lcyBfX1JUVElfQUxMX18gdG8gMSBpZgorLy8gYm90aCB0aGUgdHlwZWlkIGFuZCBkeW5hbWljX2Nhc3QgZmVhdHVyZXMgYXJlIHByZXNlbnQuCisjZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fID49IDkwMCkKKworI2lmZGVmIF9fUlRUSV9BTExfXworI2RlZmluZSBHVEVTVF9IQVNfUlRUSSAxCisjZWxzZQorI2RlZmluZSBHVEVTVF9IQVNfUlRUSSAwCisjZW5kaWYKKworI2Vsc2UKKworLy8gRm9yIGFsbCBvdGhlciBjb21waWxlcnMsIHdlIGFzc3VtZSBSVFRJIGlzIGVuYWJsZWQuCisjZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKworI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJCisKKy8vIEl0J3MgdGhpcyBoZWFkZXIncyByZXNwb25zaWJpbGl0eSB0byAjaW5jbHVkZSA8dHlwZWluZm8+IHdoZW4gUlRUSQorLy8gaXMgZW5hYmxlZC4KKyNpZiBHVEVTVF9IQVNfUlRUSQorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2VuZGlmCisKKy8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gdXNlIHRoZSBwdGhyZWFkcyBsaWJyYXJ5LgorI2lmbmRlZiBHVEVTVF9IQVNfUFRIUkVBRAorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgZXhwbGljaXRseSwgc28gd2UgYXNzdW1lIHB0aHJlYWRzIHN1cHBvcnQgaXMKKy8vIGF2YWlsYWJsZSBvbiBMaW51eCBhbmQgTWFjLgorLy8KKy8vIFRvIGRpc2FibGUgdGhyZWFkaW5nIHN1cHBvcnQgaW4gR29vZ2xlIFRlc3QsIGFkZCAtREdURVNUX0hBU19QVEhSRUFEPTAKKy8vIHRvIHlvdXIgY29tcGlsZXIgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0hBU19QVEhSRUFEIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMpCisjZW5kaWYgIC8vIEdURVNUX0hBU19QVEhSRUFECisKKy8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gdXNlIHRyMS90dXBsZS4gIFlvdSBjYW4gZGVmaW5lCisvLyB0aGlzIG1hY3JvIHRvIDAgdG8gcHJldmVudCBHb29nbGUgVGVzdCBmcm9tIHVzaW5nIHR1cGxlIChhbnkKKy8vIGZlYXR1cmUgZGVwZW5kaW5nIG9uIHR1cGxlIHdpdGggYmUgZGlzYWJsZWQgaW4gdGhpcyBtb2RlKS4KKyNpZm5kZWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgbm90IHRvIGRvIGl0LCBzbyB3ZSBhc3N1bWUgaXQncyBPSy4KKyNkZWZpbmUgR1RFU1RfSEFTX1RSMV9UVVBMRSAxCisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0J3Mgb3duIHRyMSB0dXBsZSBpbXBsZW1lbnRhdGlvbgorLy8gc2hvdWxkIGJlIHVzZWQuCisjaWZuZGVmIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cywgc28gd2UgbmVlZCB0byBmaWd1cmUgaXQgb3V0LgorCisvLyBXZSB1c2Ugb3VyIG93biBUUjEgdHVwbGUgaWYgd2UgYXJlbid0IHN1cmUgdGhlIHVzZXIgaGFzIGFuCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBpdCBhbHJlYWR5LiAgQXQgdGhpcyB0aW1lLCBHQ0MgNC4wLjArIGFuZCBNU1ZDCisvLyAyMDEwIGFyZSB0aGUgb25seSBtYWluc3RyZWFtIGNvbXBpbGVycyB0aGF0IGNvbWUgd2l0aCBhIFRSMSB0dXBsZQorLy8gaW1wbGVtZW50YXRpb24uICBOVklESUEncyBDVURBIE5WQ0MgY29tcGlsZXIgcHJldGVuZHMgdG8gYmUgR0NDIGJ5CisvLyBkZWZpbmluZyBfX0dOVUNfXyBhbmQgZnJpZW5kcywgYnV0IGNhbm5vdCBjb21waWxlIEdDQydzIHR1cGxlCisvLyBpbXBsZW1lbnRhdGlvbi4gIE1TVkMgMjAwOCAoOS4wKSBwcm92aWRlcyBUUjEgdHVwbGUgaW4gYSAzMjMgTUIKKy8vIEZlYXR1cmUgUGFjayBkb3dubG9hZCwgd2hpY2ggd2UgY2Fubm90IGFzc3VtZSB0aGUgdXNlciBoYXMuCisjaWYgKGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fQ1VEQUNDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDAwMCkpIFwKKyAgICB8fCBfTVNDX1ZFUiA+PSAxNjAwCisjZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDAKKyNlbHNlCisjZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDEKKyNlbmRpZgorCisjZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisKKy8vIFRvIGF2b2lkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGV2ZXJ5d2hlcmUsIHdlIG1ha2UgaXQKKy8vIGd0ZXN0LXBvcnQuaCdzIHJlc3BvbnNpYmlsaXR5IHRvICNpbmNsdWRlIHRoZSBoZWFkZXIgaW1wbGVtZW50aW5nCisvLyB0cjEvdHVwbGUuCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorCisjaWYgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oPgorI2VsaWYgR1RFU1RfT1NfU1lNQklBTgorCisvLyBPbiBTeW1iaWFuLCBCT09TVF9IQVNfVFIxX1RVUExFIGNhdXNlcyBCb29zdCdzIFRSMSB0dXBsZSBsaWJyYXJ5IHRvCisvLyB1c2UgU1RMcG9ydCdzIHR1cGxlIGltcGxlbWVudGF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QKKy8vIHdvcmsgYXMgdGhlIGNvcHkgb2YgU1RMcG9ydCBkaXN0cmlidXRlZCB3aXRoIFN5bWJpYW4gaXMgaW5jb21wbGV0ZS4KKy8vIEJ5IG1ha2luZyBzdXJlIEJPT1NUX0hBU19UUjFfVFVQTEUgaXMgdW5kZWZpbmVkLCB3ZSBmb3JjZSBCb29zdCB0bworLy8gdXNlIGl0cyBvd24gdHVwbGUgaW1wbGVtZW50YXRpb24uCisjaWZkZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQorI3VuZGVmIEJPT1NUX0hBU19UUjFfVFVQTEUKKyNlbmRpZiAgLy8gQk9PU1RfSEFTX1RSMV9UVVBMRQorCisvLyBUaGlzIHByZXZlbnRzIDxib29zdC90cjEvZGV0YWlsL2NvbmZpZy5ocHA+LCB3aGljaCBkZWZpbmVzCisvLyBCT09TVF9IQVNfVFIxX1RVUExFLCBmcm9tIGJlaW5nICNpbmNsdWRlZCBieSBCb29zdCdzIDx0dXBsZT4uCisjZGVmaW5lIEJPT1NUX1RSMV9ERVRBSUxfQ09ORklHX0hQUF9JTkNMVURFRAorI2luY2x1ZGUgPHR1cGxlPgorCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApCisvLyBHQ0MgNC4wKyBpbXBsZW1lbnRzIHRyMS90dXBsZSBpbiB0aGUgPHRyMS90dXBsZT4gaGVhZGVyLiAgVGhpcyBkb2VzCisvLyBub3QgY29uZm9ybSB0byB0aGUgVFIxIHNwZWMsIHdoaWNoIHJlcXVpcmVzIHRoZSBoZWFkZXIgdG8gYmUgPHR1cGxlPi4KKworI2lmICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyCisvLyBVbnRpbCB2ZXJzaW9uIDQuMy4yLCBnY2MgaGFzIGEgYnVnIHRoYXQgY2F1c2VzIDx0cjEvZnVuY3Rpb25hbD4sCisvLyB3aGljaCBpcyAjaW5jbHVkZWQgYnkgPHRyMS90dXBsZT4sIHRvIG5vdCBjb21waWxlIHdoZW4gUlRUSSBpcworLy8gZGlzYWJsZWQuICBfVFIxX0ZVTkNUSU9OQUwgaXMgdGhlIGhlYWRlciBndWFyZCBmb3IKKy8vIDx0cjEvZnVuY3Rpb25hbD4uICBIZW5jZSB0aGUgZm9sbG93aW5nICNkZWZpbmUgaXMgYSBoYWNrIHRvIHByZXZlbnQKKy8vIDx0cjEvZnVuY3Rpb25hbD4gZnJvbSBiZWluZyBpbmNsdWRlZC4KKyNkZWZpbmUgX1RSMV9GVU5DVElPTkFMIDEKKyNpbmNsdWRlIDx0cjEvdHVwbGU+CisjdW5kZWYgX1RSMV9GVU5DVElPTkFMICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gI2luY2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDx0cjEvZnVuY3Rpb25hbD4gaWYgaGUgY2hvb3NlcyB0by4KKyNlbHNlCisjaW5jbHVkZSA8dHIxL3R1cGxlPiAgLy8gTk9MSU5UCisjZW5kaWYgIC8vICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyCisKKyNlbHNlCisvLyBJZiB0aGUgY29tcGlsZXIgaXMgbm90IEdDQyA0LjArLCB3ZSBhc3N1bWUgdGhlIHVzZXIgaXMgdXNpbmcgYQorLy8gc3BlYy1jb25mb3JtaW5nIFRSMSBpbXBsZW1lbnRhdGlvbi4KKyNpbmNsdWRlIDx0dXBsZT4gIC8vIE5PTElOVAorI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGNsb25lKDIpIGlzIHN1cHBvcnRlZC4KKy8vIFVzdWFsbHkgaXQgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBvbiBMaW51eCwgZXhjbHVkaW5nCisvLyBMaW51eCBvbiB0aGUgSXRhbml1bSBhcmNoaXRlY3R1cmUuCisvLyBBbHNvIHNlZSBodHRwOi8vbGludXguZGllLm5ldC9tYW4vMi9jbG9uZS4KKyNpZm5kZWYgR1RFU1RfSEFTX0NMT05FCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cywgc28gd2UgbmVlZCB0byBmaWd1cmUgaXQgb3V0LgorCisjaWYgR1RFU1RfT1NfTElOVVggJiYgIWRlZmluZWQoX19pYTY0X18pCisjZGVmaW5lIEdURVNUX0hBU19DTE9ORSAxCisjZWxzZQorI2RlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMAorI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWCAmJiAhZGVmaW5lZChfX2lhNjRfXykKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfQ0xPTkUKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgc3RyZWFtIHJlZGlyZWN0aW9uLiBUaGlzIGlzIHVzZWQgdG8gdGVzdAorLy8gb3V0cHV0IGNvcnJlY3RuZXNzIGFuZCB0byBpbXBsZW1lbnQgZGVhdGggdGVzdHMuCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmICFHVEVTVF9PU19TWU1CSUFOCisjZGVmaW5lIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT05fIDEKKyNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmICFHVEVTVF9PU19TWU1CSUFOCisKKy8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IGRlYXRoIHRlc3RzLgorLy8gR29vZ2xlIFRlc3QgZG9lcyBub3Qgc3VwcG9ydCBkZWF0aCB0ZXN0cyBmb3IgVkMgNy4xIGFuZCBlYXJsaWVyIGFzCisvLyBhYm9ydCgpIGluIGEgVkMgNy4xIGFwcGxpY2F0aW9uIGNvbXBpbGVkIGFzIEdVSSBpbiBkZWJ1ZyBjb25maWcKKy8vIHBvcHMgdXAgYSBkaWFsb2cgd2luZG93IHRoYXQgY2Fubm90IGJlIHN1cHByZXNzZWQgcHJvZ3JhbW1hdGljYWxseS4KKyNpZiAoR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TT0xBUklTIHx8IFwKKyAgICAgKEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAmJiBfTVNDX1ZFUiA+PSAxNDAwKSB8fCBcCisgICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgfHwgR1RFU1RfT1NfQUlYKQorI2RlZmluZSBHVEVTVF9IQVNfREVBVEhfVEVTVCAxCisjaW5jbHVkZSA8dmVjdG9yPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gV2UgZG9uJ3Qgc3VwcG9ydCBNU1ZDIDcuMSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQgbm93LiAgVGhlcmVmb3JlCisvLyBhbGwgdGhlIGNvbXBpbGVycyB3ZSBjYXJlIGFib3V0IGFyZSBhZGVxdWF0ZSBmb3Igc3VwcG9ydGluZworLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyNkZWZpbmUgR1RFU1RfSEFTX1BBUkFNX1RFU1QgMQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCB0eXBlLWRyaXZlbiB0ZXN0cy4KKworLy8gVHlwZWQgdGVzdHMgbmVlZCA8dHlwZWluZm8+IGFuZCB2YXJpYWRpYyBtYWNyb3MsIHdoaWNoIEdDQywgVkMrKyA4LjAsCisvLyBTdW4gUHJvIENDLCBhbmQgSUJNIFZpc3VhbCBBZ2Ugc3VwcG9ydC4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCAoX01TQ19WRVIgPj0gMTQwMCkgfHwgZGVmaW5lZChfX1NVTlBST19DQykgfHwgXAorICAgIGRlZmluZWQoX19JQk1DUFBfXykKKyNkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1QgMQorI2RlZmluZSBHVEVTVF9IQVNfVFlQRURfVEVTVF9QIDEKKyNlbmRpZgorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCBDb21iaW5lKCkuIFRoaXMgb25seSBtYWtlcyBzZW5zZSB3aGVuCisvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBlbmFibGVkLiAgVGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QKKy8vIHdvcmsgb24gU3VuIFN0dWRpbyBzaW5jZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGVtcGxhdGVkIGNvbnZlcnNpb24KKy8vIG9wZXJhdG9ycy4KKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVCAmJiBHVEVTVF9IQVNfVFIxX1RVUExFICYmICFkZWZpbmVkKF9fU1VOUFJPX0NDKQorI2RlZmluZSBHVEVTVF9IQVNfQ09NQklORSAxCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzeXN0ZW0gY29tcGlsZXIgdXNlcyBVVEYtMTYgZm9yIGVuY29kaW5nIHdpZGUgc3RyaW5ncy4KKyNkZWZpbmUgR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8gXAorICAgIChHVEVTVF9PU19XSU5ET1dTIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX0FJWCkKKworLy8gRGVmaW5lcyBzb21lIHV0aWxpdHkgbWFjcm9zLgorCisvLyBUaGUgR05VIGNvbXBpbGVyIGVtaXRzIGEgd2FybmluZyBpZiBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIGFyZSBmb2xsb3dlZCBieQorLy8gYW4gImVsc2UiIHN0YXRlbWVudCBhbmQgYnJhY2VzIGFyZSBub3QgdXNlZCB0byBleHBsaWNpdGx5IGRpc2FtYmlndWF0ZSB0aGUKKy8vICJlbHNlIiBiaW5kaW5nLiAgVGhpcyBsZWFkcyB0byBwcm9ibGVtcyB3aXRoIGNvZGUgbGlrZToKKy8vCisvLyAgIGlmIChnYXRlKQorLy8gICAgIEFTU0VSVF8qKGNvbmRpdGlvbikgPDwgIlNvbWUgbWVzc2FnZSI7CisvLworLy8gVGhlICJzd2l0Y2ggKDApIGNhc2UgMDoiIGlkaW9tIGlzIHVzZWQgdG8gc3VwcHJlc3MgdGhpcy4KKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjZGVmaW5lIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfCisjZWxzZQorI2RlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBzd2l0Y2ggKDApIGNhc2UgMDogIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIFVzZSB0aGlzIGFubm90YXRpb24gYXQgdGhlIGVuZCBvZiBhIHN0cnVjdC9jbGFzcyBkZWZpbml0aW9uIHRvCisvLyBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXppbmcgYXdheSBpbnN0YW5jZXMgdGhhdCBhcmUgbmV2ZXIKKy8vIHVzZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFsbCBpbnRlcmVzdGluZyBsb2dpYyBoYXBwZW5zIGluc2lkZSB0aGUKKy8vIGMndG9yIGFuZCAvIG9yIGQndG9yLiAgRXhhbXBsZToKKy8vCisvLyAgIHN0cnVjdCBGb28geworLy8gICAgIEZvbygpIHsgLi4uIH0KKy8vICAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKy8vCisvLyBBbHNvIHVzZSBpdCBhZnRlciBhIHZhcmlhYmxlIG9yIHBhcmFtZXRlciBkZWNsYXJhdGlvbiB0byB0ZWxsIHRoZQorLy8gY29tcGlsZXIgdGhlIHZhcmlhYmxlL3BhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIHVzZWQuCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ09NUElMRVJfSUNDKQorI2RlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfCisjZW5kaWYKKworLy8gQSBtYWNybyB0byBkaXNhbGxvdyBvcGVyYXRvcj0KKy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHByaXZhdGU6IGRlY2xhcmF0aW9ucyBmb3IgYSBjbGFzcy4KKyNkZWZpbmUgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyh0eXBlKVwKKyAgdm9pZCBvcGVyYXRvcj0odHlwZSBjb25zdCAmKQorCisvLyBBIG1hY3JvIHRvIGRpc2FsbG93IGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQorLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzLgorI2RlZmluZSBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKHR5cGUpXAorICB0eXBlKHR5cGUgY29uc3QgJik7XAorICBHVEVTVF9ESVNBTExPV19BU1NJR05fKHR5cGUpCisKKy8vIFRlbGwgdGhlIGNvbXBpbGVyIHRvIHdhcm4gYWJvdXQgdW51c2VkIHJldHVybiB2YWx1ZXMgZm9yIGZ1bmN0aW9ucyBkZWNsYXJlZAorLy8gd2l0aCB0aGlzIG1hY3JvLiAgVGhlIG1hY3JvIHNob3VsZCBiZSB1c2VkIG9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworLy8gZm9sbG93aW5nIHRoZSBhcmd1bWVudCBsaXN0OgorLy8KKy8vICAgU3Byb2NrZXQqIEFsbG9jYXRlU3Byb2NrZXQoKSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfOworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSAzMDQwMCkgJiYgIWRlZmluZWQoQ09NUElMRVJfSUNDKQorI2RlZmluZSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfIF9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKQorI2Vsc2UKKyNkZWZpbmUgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXworI2VuZGlmICAvLyBfX0dOVUNfXyAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFDT01QSUxFUl9JQ0MKKworLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzIFN0cnVjdHVyZWQgRXhjZXB0aW9uCisvLyBIYW5kbGluZy4gIFRoaXMgaXMgc3VwcG9ydGVkIGJ5IHNldmVyYWwgV2luZG93cyBjb21waWxlcnMgYnV0IGdlbmVyYWxseQorLy8gZG9lcyBub3QgZXhpc3Qgb24gYW55IG90aGVyIHN5c3RlbS4KKyNpZm5kZWYgR1RFU1RfSEFTX1NFSAorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorLy8gVGhlc2UgdHdvIGNvbXBpbGVycyBhcmUga25vd24gdG8gc3VwcG9ydCBTRUguCisjZGVmaW5lIEdURVNUX0hBU19TRUggMQorI2Vsc2UKKy8vIEFzc3VtZSBubyBTRUguCisjZGVmaW5lIEdURVNUX0hBU19TRUggMAorI2VuZGlmCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAorCisjaWZkZWYgX01TQ19WRVIKKworI2lmIEdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWQorI2RlZmluZSBHVEVTVF9BUElfIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2VsaWYgR1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZCisjZGVmaW5lIEdURVNUX0FQSV8gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZW5kaWYKKworI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIEdURVNUX0FQSV8KKyNkZWZpbmUgR1RFU1RfQVBJXworI2VuZGlmCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTWVzc2FnZTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgU3RyaW5nOworCit0eXBlZGVmIDo6c3RkOjpzdHJpbmdzdHJlYW0gU3RyU3RyZWFtOworCisvLyBBIGhlbHBlciBmb3Igc3VwcHJlc3Npbmcgd2FybmluZ3Mgb24gY29uc3RhbnQgY29uZGl0aW9uLiAgSXQganVzdAorLy8gcmV0dXJucyAnY29uZGl0aW9uJy4KK0dURVNUX0FQSV8gYm9vbCBJc1RydWUoYm9vbCBjb25kaXRpb24pOworCisvLyBEZWZpbmVzIHNjb3BlZF9wdHIuCisKKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gb2Ygc2NvcGVkX3B0ciBpcyBQQVJUSUFMIC0gaXQgb25seSBjb250YWlucworLy8gZW5vdWdoIHN0dWZmIHRvIHNhdGlzZnkgR29vZ2xlIFRlc3QncyBuZWVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBzY29wZWRfcHRyIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7CisKKyAgZXhwbGljaXQgc2NvcGVkX3B0cihUKiBwID0gTlVMTCkgOiBwdHJfKHApIHt9CisgIH5zY29wZWRfcHRyKCkgeyByZXNldCgpOyB9CisKKyAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnB0cl87IH0KKyAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KKyAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQorCisgIFQqIHJlbGVhc2UoKSB7CisgICAgVCogY29uc3QgcHRyID0gcHRyXzsKKyAgICBwdHJfID0gTlVMTDsKKyAgICByZXR1cm4gcHRyOworICB9CisKKyAgdm9pZCByZXNldChUKiBwID0gTlVMTCkgeworICAgIGlmIChwICE9IHB0cl8pIHsKKyAgICAgIGlmIChJc1RydWUoc2l6ZW9mKFQpID4gMCkpIHsgIC8vIE1ha2VzIHN1cmUgVCBpcyBhIGNvbXBsZXRlIHR5cGUuCisgICAgICAgIGRlbGV0ZSBwdHJfOworICAgICAgfQorICAgICAgcHRyXyA9IHA7CisgICAgfQorICB9CisgcHJpdmF0ZToKKyAgVCogcHRyXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKHNjb3BlZF9wdHIpOworfTsKKworLy8gRGVmaW5lcyBSRS4KKworLy8gQSBzaW1wbGUgQysrIHdyYXBwZXIgZm9yIDxyZWdleC5oPi4gIEl0IHVzZXMgdGhlIFBPU0lYIEV4dGVuZGVkCisvLyBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4LgorY2xhc3MgR1RFU1RfQVBJXyBSRSB7CisgcHVibGljOgorICAvLyBBIGNvcHkgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgYnkgdGhlIFN0YW5kYXJkIHRvIGluaXRpYWxpemUgb2JqZWN0CisgIC8vIHJlZmVyZW5jZXMgZnJvbSByLXZhbHVlcy4KKyAgUkUoY29uc3QgUkUmIG90aGVyKSB7IEluaXQob3RoZXIucGF0dGVybigpKTsgfQorCisgIC8vIENvbnN0cnVjdHMgYW4gUkUgZnJvbSBhIHN0cmluZy4KKyAgUkUoY29uc3QgOjpzdGQ6OnN0cmluZyYgcmVnZXgpIHsgSW5pdChyZWdleC5jX3N0cigpKTsgfSAgLy8gTk9MSU5UCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworICBSRShjb25zdCA6OnN0cmluZyYgcmVnZXgpIHsgSW5pdChyZWdleC5jX3N0cigpKTsgfSAgLy8gTk9MSU5UCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyAgUkUoY29uc3QgY2hhciogcmVnZXgpIHsgSW5pdChyZWdleCk7IH0gIC8vIE5PTElOVAorICB+UkUoKTsKKworICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4LgorICBjb25zdCBjaGFyKiBwYXR0ZXJuKCkgY29uc3QgeyByZXR1cm4gcGF0dGVybl87IH0KKworICAvLyBGdWxsTWF0Y2goc3RyLCByZSkgcmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcworICAvLyB0aGUgZW50aXJlIHN0ci4KKyAgLy8gUGFydGlhbE1hdGNoKHN0ciwgcmUpIHJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlCisgIC8vIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCisgIC8vCisgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIEZ1bGxNYXRjaCgpIGFuZCBQYXJ0aWFsTWF0Y2goKSB3b3JrCisgIC8vIHdoZW4gc3RyIGNvbnRhaW5zIE5VTCBjaGFyYWN0ZXJzLgorICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgICByZXR1cm4gRnVsbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7CisgIH0KKyAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIFBhcnRpYWxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCA6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgICByZXR1cm4gUGFydGlhbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpOworICBzdGF0aWMgYm9vbCBQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpOworCisgcHJpdmF0ZToKKyAgdm9pZCBJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KTsKKworICAvLyBXZSB1c2UgYSBjb25zdCBjaGFyKiBpbnN0ZWFkIG9mIGEgc3RyaW5nLCBhcyBHb29nbGUgVGVzdCBtYXkgYmUgdXNlZAorICAvLyB3aGVyZSBzdHJpbmcgaXMgbm90IGF2YWlsYWJsZS4gIFdlIGFsc28gZG8gbm90IHVzZSBHb29nbGUgVGVzdCdzIG93bgorICAvLyBTdHJpbmcgdHlwZSBoZXJlLCBpbiBvcmRlciB0byBzaW1wbGlmeSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUKKyAgLy8gZmlsZXMuCisgIGNvbnN0IGNoYXIqIHBhdHRlcm5fOworICBib29sIGlzX3ZhbGlkXzsKKyNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCisgIHJlZ2V4X3QgZnVsbF9yZWdleF87ICAgICAvLyBGb3IgRnVsbE1hdGNoKCkuCisgIHJlZ2V4X3QgcGFydGlhbF9yZWdleF87ICAvLyBGb3IgUGFydGlhbE1hdGNoKCkuCisjZWxzZSAgLy8gR1RFU1RfVVNFU19TSU1QTEVfUkUKKyAgY29uc3QgY2hhciogZnVsbF9wYXR0ZXJuXzsgIC8vIEZvciBGdWxsTWF0Y2goKTsKKyNlbmRpZgorCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUkUpOworfTsKKworLy8gRGVmaW5lcyBsb2dnaW5nIHV0aWxpdGllczoKKy8vICAgR1RFU1RfTE9HXyhzZXZlcml0eSkgLSBsb2dzIG1lc3NhZ2VzIGF0IHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgbGV2ZWwuIFRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaXRzZWxmIGlzIHN0cmVhbWVkIGludG8gdGhlIG1hY3JvLgorLy8gICBMb2dUb1N0ZGVycigpICAtIGRpcmVjdHMgYWxsIGxvZyBtZXNzYWdlcyB0byBzdGRlcnIuCisvLyAgIEZsdXNoSW5mb0xvZygpIC0gZmx1c2hlcyBpbmZvcm1hdGlvbmFsIGxvZyBtZXNzYWdlcy4KKworZW51bSBHVGVzdExvZ1NldmVyaXR5IHsKKyAgR1RFU1RfSU5GTywKKyAgR1RFU1RfV0FSTklORywKKyAgR1RFU1RfRVJST1IsCisgIEdURVNUX0ZBVEFMCit9OworCisvLyBGb3JtYXRzIGxvZyBlbnRyeSBzZXZlcml0eSwgcHJvdmlkZXMgYSBzdHJlYW0gb2JqZWN0IGZvciBzdHJlYW1pbmcgdGhlCisvLyBsb2cgbWVzc2FnZSwgYW5kIHRlcm1pbmF0ZXMgdGhlIG1lc3NhZ2Ugd2l0aCBhIG5ld2xpbmUgd2hlbiBnb2luZyBvdXQgb2YKKy8vIHNjb3BlLgorY2xhc3MgR1RFU1RfQVBJXyBHVGVzdExvZyB7CisgcHVibGljOgorICBHVGVzdExvZyhHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7CisKKyAgLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCisgIH5HVGVzdExvZygpOworCisgIDo6c3RkOjpvc3RyZWFtJiBHZXRTdHJlYW0oKSB7IHJldHVybiA6OnN0ZDo6Y2VycjsgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdExvZyk7Cit9OworCisjZGVmaW5lIEdURVNUX0xPR18oc2V2ZXJpdHkpIFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpHVGVzdExvZyg6OnRlc3Rpbmc6OmludGVybmFsOjpHVEVTVF8jI3NldmVyaXR5LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKS5HZXRTdHJlYW0oKQorCitpbmxpbmUgdm9pZCBMb2dUb1N0ZGVycigpIHt9CitpbmxpbmUgdm9pZCBGbHVzaEluZm9Mb2coKSB7IGZmbHVzaChOVUxMKTsgfQorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UuCisvLworLy8gR1RFU1RfQ0hFQ0tfIGlzIGFuIGFsbC1tb2RlIGFzc2VydC4gSXQgYWJvcnRzIHRoZSBwcm9ncmFtIGlmIHRoZSBjb25kaXRpb24KKy8vIGlzIG5vdCBzYXRpc2ZpZWQuCisvLyAgU3lub3BzeXM6CisvLyAgICBHVEVTVF9DSEVDS18oYm9vbGVhbl9jb25kaXRpb24pOworLy8gICAgIG9yCisvLyAgICBHVEVTVF9DSEVDS18oYm9vbGVhbl9jb25kaXRpb24pIDw8ICJBZGRpdGlvbmFsIG1lc3NhZ2UiOworLy8KKy8vICAgIFRoaXMgY2hlY2tzIHRoZSBjb25kaXRpb24gYW5kIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZAorLy8gICAgaXQgcHJpbnRzIG1lc3NhZ2UgYWJvdXQgdGhlIGNvbmRpdGlvbiB2aW9sYXRpb24sIGluY2x1ZGluZyB0aGUKKy8vICAgIGNvbmRpdGlvbiBpdHNlbGYsIHBsdXMgYWRkaXRpb25hbCBtZXNzYWdlIHN0cmVhbWVkIGludG8gaXQsIGlmIGFueSwKKy8vICAgIGFuZCB0aGVuIGl0IGFib3J0cyB0aGUgcHJvZ3JhbS4gSXQgYWJvcnRzIHRoZSBwcm9ncmFtIGlycmVzcGVjdGl2ZSBvZgorLy8gICAgd2hldGhlciBpdCBpcyBidWlsdCBpbiB0aGUgZGVidWcgbW9kZSBvciBub3QuCisjZGVmaW5lIEdURVNUX0NIRUNLXyhjb25kaXRpb24pIFwKKyAgICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzVHJ1ZShjb25kaXRpb24pKSBcCisgICAgICA7IFwKKyAgICBlbHNlIFwKKyAgICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJDb25kaXRpb24gIiAjY29uZGl0aW9uICIgZmFpbGVkLiAiCisKKy8vIEFuIGFsbC1tb2RlIGFzc2VydCB0byB2ZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gUE9TSVgtc3R5bGUgZnVuY3Rpb24KKy8vIGNhbGwgcmV0dXJucyAwIChpbmRpY2F0aW5nIHN1Y2Nlc3MpLiAgS25vd24gbGltaXRhdGlvbjogdGhpcworLy8gZG9lc24ndCBleHBhbmQgdG8gYSBiYWxhbmNlZCAnaWYnIHN0YXRlbWVudCwgc28gZW5jbG9zZSB0aGUgbWFjcm8KKy8vIGluIHt9IGlmIHlvdSBuZWVkIHRvIHVzZSBpdCBhcyB0aGUgb25seSBzdGF0ZW1lbnQgaW4gYW4gJ2lmJworLy8gYnJhbmNoLgorI2RlZmluZSBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwb3NpeF9jYWxsKSBcCisgIGlmIChjb25zdCBpbnQgZ3Rlc3RfZXJyb3IgPSAocG9zaXhfY2FsbCkpIFwKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAjcG9zaXhfY2FsbCA8PCAiZmFpbGVkIHdpdGggZXJyb3IgIiBcCisgICAgICAgICAgICAgICAgICAgICAgPDwgZ3Rlc3RfZXJyb3IKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBEb3duY2FzdHMgdGhlIHBvaW50ZXIgb2YgdHlwZSBCYXNlIHRvIERlcml2ZWQuCisvLyBEZXJpdmVkIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBCYXNlLiBUaGUgcGFyYW1ldGVyIE1VU1QKKy8vIHBvaW50IHRvIGEgY2xhc3Mgb2YgdHlwZSBEZXJpdmVkLCBub3QgYW55IHN1YmNsYXNzIG9mIGl0LgorLy8gV2hlbiBSVFRJIGlzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHBlcmZvcm1zIGEgcnVudGltZQorLy8gY2hlY2sgdG8gZW5mb3JjZSB0aGlzLgordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQsIGNsYXNzIEJhc2U+CitEZXJpdmVkKiBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGUoQmFzZSogYmFzZSkgeworI2lmIEdURVNUX0hBU19SVFRJCisgIEdURVNUX0NIRUNLXyh0eXBlaWQoKmJhc2UpID09IHR5cGVpZChEZXJpdmVkKSk7CisgIHJldHVybiBkeW5hbWljX2Nhc3Q8RGVyaXZlZCo+KGJhc2UpOyAgLy8gTk9MSU5UCisjZWxzZQorICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KGJhc2UpOyAgLy8gUG9vciBtYW4ncyBkb3duY2FzdC4KKyNlbmRpZgorfQorCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTl8KKworLy8gRGVmaW5lcyB0aGUgc3RkZXJyIGNhcHR1cmVyOgorLy8gICBDYXB0dXJlU3Rkb3V0ICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0LgorLy8gICBHZXRDYXB0dXJlZFN0ZG91dCAtIHN0b3BzIGNhcHR1cmluZyBzdGRvdXQgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KKy8vICAgQ2FwdHVyZVN0ZGVyciAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZGVyci4KKy8vICAgR2V0Q2FwdHVyZWRTdGRlcnIgLSBzdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCisvLworR1RFU1RfQVBJXyB2b2lkIENhcHR1cmVTdGRvdXQoKTsKK0dURVNUX0FQSV8gU3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCk7CitHVEVTVF9BUElfIHZvaWQgQ2FwdHVyZVN0ZGVycigpOworR1RFU1RfQVBJXyBTdHJpbmcgR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OXworCisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBBIGNvcHkgb2YgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZXQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KK2V4dGVybiA6OnN0ZDo6dmVjdG9yPFN0cmluZz4gZ19hcmd2czsKKworLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcuCitjb25zdCA6OnN0ZDo6dmVjdG9yPFN0cmluZz4mIEdldEFyZ3ZzKCk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gRGVmaW5lcyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKworI2lmIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFNsZWVwcyBmb3IgKHJvdWdobHkpIG4gbWlsbGktc2Vjb25kcy4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3IKKy8vIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gIERvbid0IHVzZSBpdCBpbiB1c2VyIHRlc3RzLAorLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitpbmxpbmUgdm9pZCBTbGVlcE1pbGxpc2Vjb25kcyhpbnQgbikgeworICBjb25zdCB0aW1lc3BlYyB0aW1lID0geworICAgIDAsICAgICAgICAgICAgICAgICAgLy8gMCBzZWNvbmRzLgorICAgIG4gKiAxMDAwTCAqIDEwMDBMLCAgLy8gQW5kIG4gbXMuCisgIH07CisgIG5hbm9zbGVlcCgmdGltZSwgTlVMTCk7Cit9CisKKy8vIEFsbG93cyBhIGNvbnRyb2xsZXIgdGhyZWFkIHRvIHBhdXNlIGV4ZWN1dGlvbiBvZiBuZXdseSBjcmVhdGVkCisvLyB0aHJlYWRzIHVudGlsIG5vdGlmaWVkLiAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjcmVhdGVkCisvLyBhbmQgZGVzdHJveWVkIGluIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8gbm90CisvLyB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitjbGFzcyBOb3RpZmljYXRpb24geworIHB1YmxpYzoKKyAgTm90aWZpY2F0aW9uKCkgOiBub3RpZmllZF8oZmFsc2UpIHt9CisKKyAgLy8gTm90aWZpZXMgYWxsIHRocmVhZHMgY3JlYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uIHRvIHN0YXJ0LiBNdXN0CisgIC8vIGJlIGNhbGxlZCBmcm9tIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKyAgdm9pZCBOb3RpZnkoKSB7IG5vdGlmaWVkXyA9IHRydWU7IH0KKworICAvLyBCbG9ja3MgdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkIG5vdGlmaWVzLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGVzdAorICAvLyB0aHJlYWQuCisgIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpIHsKKyAgICB3aGlsZSghbm90aWZpZWRfKSB7CisgICAgICBTbGVlcE1pbGxpc2Vjb25kcygxMCk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICB2b2xhdGlsZSBib29sIG5vdGlmaWVkXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5vdGlmaWNhdGlvbik7Cit9OworCisvLyBBcyBhIEMtZnVuY3Rpb24sIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UgY2Fubm90IGJlIHRlbXBsYXRlZCBpdHNlbGYuCisvLyBDb25zZXF1ZW50bHksIGl0IGNhbm5vdCBzZWxlY3QgYSBjb3JyZWN0IGluc3RhbnRpYXRpb24gb2YgVGhyZWFkV2l0aFBhcmFtCisvLyBpbiBvcmRlciB0byBjYWxsIGl0cyBSdW4oKS4gSW50cm9kdWNpbmcgVGhyZWFkV2l0aFBhcmFtQmFzZSBhcyBhCisvLyBub24tdGVtcGxhdGVkIGJhc2UgY2xhc3MgZm9yIFRocmVhZFdpdGhQYXJhbSBhbGxvd3MgdXMgdG8gYnlwYXNzIHRoaXMKKy8vIHByb2JsZW0uCitjbGFzcyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRocmVhZFdpdGhQYXJhbUJhc2UoKSB7fQorICB2aXJ0dWFsIHZvaWQgUnVuKCkgPSAwOworfTsKKworLy8gcHRocmVhZF9jcmVhdGUoKSBhY2NlcHRzIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHR5cGUgd2l0aCB0aGUgQyBsaW5rYWdlLgorLy8gQWNjb3JkaW5nIHRvIHRoZSBTdGFuZGFyZCAoNy41LzEpLCBmdW5jdGlvbiB0eXBlcyB3aXRoIGRpZmZlcmVudCBsaW5rYWdlcworLy8gYXJlIGRpZmZlcmVudCBldmVuIGlmIHRoZXkgYXJlIG90aGVyd2lzZSBpZGVudGljYWwuICBTb21lIGNvbXBpbGVycyAoZm9yCisvLyBleGFtcGxlLCBTdW5TdHVkaW8pIHRyZWF0IHRoZW0gYXMgZGlmZmVyZW50IHR5cGVzLiAgU2luY2UgY2xhc3MgbWV0aG9kcworLy8gY2Fubm90IGJlIGRlZmluZWQgd2l0aCBDLWxpbmthZ2Ugd2UgbmVlZCB0byBkZWZpbmUgYSBmcmVlIEMtZnVuY3Rpb24gdG8KKy8vIHBhc3MgaW50byBwdGhyZWFkX2NyZWF0ZSgpLgorZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCogVGhyZWFkRnVuY1dpdGhDTGlua2FnZSh2b2lkKiB0aHJlYWQpIHsKKyAgc3RhdGljX2Nhc3Q8VGhyZWFkV2l0aFBhcmFtQmFzZSo+KHRocmVhZCktPlJ1bigpOworICByZXR1cm4gTlVMTDsKK30KKworLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3MgbXVsdGktdGhyZWFkaW5nIGNvbnN0cnVjdHMuCisvLyBUbyB1c2UgaXQsIHdyaXRlOgorLy8KKy8vICAgdm9pZCBUaHJlYWRGdW5jKGludCBwYXJhbSkgeyAvKiBEbyB0aGluZ3Mgd2l0aCBwYXJhbSAqLyB9CisvLyAgIE5vdGlmaWNhdGlvbiB0aHJlYWRfY2FuX3N0YXJ0OworLy8gICAuLi4KKy8vICAgLy8gVGhlIHRocmVhZF9jYW5fc3RhcnQgcGFyYW1ldGVyIGlzIG9wdGlvbmFsOyB5b3UgY2FuIHN1cHBseSBOVUxMLgorLy8gICBUaHJlYWRXaXRoUGFyYW08aW50PiB0aHJlYWQoJlRocmVhZEZ1bmMsIDUsICZ0aHJlYWRfY2FuX3N0YXJ0KTsKKy8vICAgdGhyZWFkX2Nhbl9zdGFydC5Ob3RpZnkoKTsKKy8vCisvLyBUaGVzZSBjbGFzc2VzIGFyZSBvbmx5IGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuIERvCisvLyBub3QgdXNlIHRoZW0gaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZFdpdGhQYXJhbSA6IHB1YmxpYyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoKlVzZXJUaHJlYWRGdW5jKShUKTsKKworICBUaHJlYWRXaXRoUGFyYW0oCisgICAgICBVc2VyVGhyZWFkRnVuYyBmdW5jLCBUIHBhcmFtLCBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpCisgICAgICA6IGZ1bmNfKGZ1bmMpLAorICAgICAgICBwYXJhbV8ocGFyYW0pLAorICAgICAgICB0aHJlYWRfY2FuX3N0YXJ0Xyh0aHJlYWRfY2FuX3N0YXJ0KSwKKyAgICAgICAgZmluaXNoZWRfKGZhbHNlKSB7CisgICAgVGhyZWFkV2l0aFBhcmFtQmFzZSogY29uc3QgYmFzZSA9IHRoaXM7CisgICAgLy8gVGhlIHRocmVhZCBjYW4gYmUgY3JlYXRlZCBvbmx5IGFmdGVyIGFsbCBmaWVsZHMgZXhjZXB0IHRocmVhZF8KKyAgICAvLyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18oCisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRfLCAwLCAmVGhyZWFkRnVuY1dpdGhDTGlua2FnZSwgYmFzZSkpOworICB9CisgIH5UaHJlYWRXaXRoUGFyYW0oKSB7IEpvaW4oKTsgfQorCisgIHZvaWQgSm9pbigpIHsKKyAgICBpZiAoIWZpbmlzaGVkXykgeworICAgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9qb2luKHRocmVhZF8sIDApKTsKKyAgICAgIGZpbmlzaGVkXyA9IHRydWU7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB2b2lkIFJ1bigpIHsKKyAgICBpZiAodGhyZWFkX2Nhbl9zdGFydF8gIT0gTlVMTCkKKyAgICAgIHRocmVhZF9jYW5fc3RhcnRfLT5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7CisgICAgZnVuY18ocGFyYW1fKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgVXNlclRocmVhZEZ1bmMgZnVuY187ICAvLyBVc2VyLXN1cHBsaWVkIHRocmVhZCBmdW5jdGlvbi4KKyAgY29uc3QgVCBwYXJhbV87ICAvLyBVc2VyLXN1cHBsaWVkIHBhcmFtZXRlciB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uLgorICAvLyBXaGVuIG5vbi1OVUxMLCB1c2VkIHRvIGJsb2NrIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY29udHJvbGxlciB0aHJlYWQKKyAgLy8gbm90aWZpZXMuCisgIE5vdGlmaWNhdGlvbiogY29uc3QgdGhyZWFkX2Nhbl9zdGFydF87CisgIGJvb2wgZmluaXNoZWRfOyAgLy8gdHJ1ZSBpZmYgd2Uga25vdyB0aGF0IHRoZSB0aHJlYWQgZnVuY3Rpb24gaGFzIGZpbmlzaGVkLgorICBwdGhyZWFkX3QgdGhyZWFkXzsgIC8vIFRoZSBuYXRpdmUgdGhyZWFkIG9iamVjdC4KKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZFdpdGhQYXJhbSk7Cit9OworCisvLyBndGVzdC1wb3J0LmggZ3VhcmFudGVlcyB0byAjaW5jbHVkZSA8cHRocmVhZC5oPiB3aGVuIEdURVNUX0hBU19QVEhSRUFEIGlzCisvLyB0cnVlLgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLy8gTXV0ZXhCYXNlIGFuZCBNdXRleCBpbXBsZW1lbnQgbXV0ZXggb24gcHRocmVhZHMtYmFzZWQgcGxhdGZvcm1zLiBUaGV5CisvLyBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNsYXNzIE11dGV4TG9jazoKKy8vCisvLyAgIE11dGV4IG11dGV4OworLy8gICAuLi4KKy8vICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4KTsgIC8vIEFjcXVpcmVzIHRoZSBtdXRleCBhbmQgcmVsZWFzZXMgaXQgYXQgdGhlIGVuZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgc2NvcGUuCisvLworLy8gTXV0ZXhCYXNlIGltcGxlbWVudHMgYmVoYXZpb3IgZm9yIGJvdGggc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkKKy8vIGFsbG9jYXRlZCBtdXRleGVzLiAgRG8gbm90IHVzZSBNdXRleEJhc2UgZGlyZWN0bHkuICBJbnN0ZWFkLCB3cml0ZQorLy8gdGhlIGZvbGxvd2luZyB0byBkZWZpbmUgYSBzdGF0aWMgbXV0ZXg6CisvLworLy8gICBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOworLy8KKy8vIFlvdSBjYW4gZm9yd2FyZCBkZWNsYXJlIGEgc3RhdGljIG11dGV4IGxpa2UgdGhpczoKKy8vCisvLyAgIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOworLy8KKy8vIFRvIGNyZWF0ZSBhIGR5bmFtaWMgbXV0ZXgsIGp1c3QgZGVmaW5lIGFuIG9iamVjdCBvZiB0eXBlIE11dGV4LgorY2xhc3MgTXV0ZXhCYXNlIHsKKyBwdWJsaWM6CisgIC8vIEFjcXVpcmVzIHRoaXMgbXV0ZXguCisgIHZvaWQgTG9jaygpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2xvY2soJm11dGV4XykpOworICAgIG93bmVyXyA9IHB0aHJlYWRfc2VsZigpOworICB9CisKKyAgLy8gUmVsZWFzZXMgdGhpcyBtdXRleC4KKyAgdm9pZCBVbmxvY2soKSB7CisgICAgLy8gV2UgZG9uJ3QgcHJvdGVjdCB3cml0aW5nIHRvIG93bmVyXyBoZXJlLCBhcyBpdCdzIHRoZSBjYWxsZXIncworICAgIC8vIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUKKyAgICAvLyBtdXRleCB3aGVuIHRoaXMgaXMgY2FsbGVkLgorICAgIG93bmVyXyA9IDA7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4XykpOworICB9CisKKyAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgbXV0ZXguIE90aGVyd2lzZSwgY3Jhc2hlcworICAvLyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHsKKyAgICBHVEVTVF9DSEVDS18ob3duZXJfID09IHB0aHJlYWRfc2VsZigpKQorICAgICAgICA8PCAiVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBob2xkaW5nIHRoZSBtdXRleCBAIiA8PCB0aGlzOworICB9CisKKyAgLy8gQSBzdGF0aWMgbXV0ZXggbWF5IGJlIHVzZWQgYmVmb3JlIG1haW4oKSBpcyBlbnRlcmVkLiAgSXQgbWF5IGV2ZW4KKyAgLy8gYmUgdXNlZCBiZWZvcmUgdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gc3RhZ2UuICBUaGVyZWZvcmUgd2UKKyAgLy8gbXVzdCBiZSBhYmxlIHRvIGluaXRpYWxpemUgYSBzdGF0aWMgbXV0ZXggb2JqZWN0IGF0IGxpbmsgdGltZS4KKyAgLy8gVGhpcyBtZWFucyBNdXRleEJhc2UgaGFzIHRvIGJlIGEgUE9EIGFuZCBpdHMgbWVtYmVyIHZhcmlhYmxlcworICAvLyBoYXZlIHRvIGJlIHB1YmxpYy4KKyBwdWJsaWM6CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87ICAvLyBUaGUgdW5kZXJseWluZyBwdGhyZWFkIG11dGV4LgorICBwdGhyZWFkX3Qgb3duZXJfOyAgLy8gVGhlIHRocmVhZCBob2xkaW5nIHRoZSBtdXRleDsgMCBtZWFucyBubyBvbmUgaG9sZHMgaXQuCit9OworCisvLyBGb3J3YXJkLWRlY2xhcmVzIGEgc3RhdGljIG11dGV4LgorI2RlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4CisKKy8vIERlZmluZXMgYW5kIHN0YXRpY2FsbHkgKGkuZS4gYXQgbGluayB0aW1lKSBpbml0aWFsaXplcyBhIHN0YXRpYyBtdXRleC4KKyNkZWZpbmUgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleEJhc2UgbXV0ZXggPSB7IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsIDAgfQorCisvLyBUaGUgTXV0ZXggY2xhc3MgY2FuIG9ubHkgYmUgdXNlZCBmb3IgbXV0ZXhlcyBjcmVhdGVkIGF0IHJ1bnRpbWUuIEl0CisvLyBzaGFyZXMgaXRzIEFQSSB3aXRoIE11dGV4QmFzZSBvdGhlcndpc2UuCitjbGFzcyBNdXRleCA6IHB1YmxpYyBNdXRleEJhc2UgeworIHB1YmxpYzoKKyAgTXV0ZXgoKSB7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpKTsKKyAgICBvd25lcl8gPSAwOworICB9CisgIH5NdXRleCgpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4XykpOworICB9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE11dGV4KTsKK307CisKKy8vIFdlIGNhbm5vdCBuYW1lIHRoaXMgY2xhc3MgTXV0ZXhMb2NrIGFzIHRoZSBjdG9yIGRlY2xhcmF0aW9uIHdvdWxkCisvLyBjb25mbGljdCB3aXRoIGEgbWFjcm8gbmFtZWQgTXV0ZXhMb2NrLCB3aGljaCBpcyBkZWZpbmVkIG9uIHNvbWUKKy8vIHBsYXRmb3Jtcy4gIEhlbmNlIHRoZSB0eXBlZGVmIHRyaWNrIGJlbG93LgorY2xhc3MgR1Rlc3RNdXRleExvY2sgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgR1Rlc3RNdXRleExvY2soTXV0ZXhCYXNlKiBtdXRleCkKKyAgICAgIDogbXV0ZXhfKG11dGV4KSB7IG11dGV4Xy0+TG9jaygpOyB9CisKKyAgfkdUZXN0TXV0ZXhMb2NrKCkgeyBtdXRleF8tPlVubG9jaygpOyB9CisKKyBwcml2YXRlOgorICBNdXRleEJhc2UqIGNvbnN0IG11dGV4XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEdUZXN0TXV0ZXhMb2NrKTsKK307CisKK3R5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOworCisvLyBIZWxwZXJzIGZvciBUaHJlYWRMb2NhbC4KKworLy8gcHRocmVhZF9rZXlfY3JlYXRlKCkgcmVxdWlyZXMgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSgpIHRvIGhhdmUKKy8vIEMtbGlua2FnZS4gIFRoZXJlZm9yZSBpdCBjYW5ub3QgYmUgdGVtcGxhdGl6ZWQgdG8gYWNjZXNzCisvLyBUaHJlYWRMb2NhbDxUPi4gIEhlbmNlIHRoZSBuZWVkIGZvciBjbGFzcworLy8gVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UuCitjbGFzcyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSgpIHt9Cit9OworCisvLyBDYWxsZWQgYnkgcHRocmVhZCB0byBkZWxldGUgdGhyZWFkLWxvY2FsIGRhdGEgc3RvcmVkIGJ5CisvLyBwdGhyZWFkX3NldHNwZWNpZmljKCkuCitleHRlcm4gIkMiIGlubGluZSB2b2lkIERlbGV0ZVRocmVhZExvY2FsVmFsdWUodm9pZCogdmFsdWVfaG9sZGVyKSB7CisgIGRlbGV0ZSBzdGF0aWNfY2FzdDxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSo+KHZhbHVlX2hvbGRlcik7Cit9CisKKy8vIEltcGxlbWVudHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2Ugb24gcHRocmVhZHMtYmFzZWQgc3lzdGVtcy4KKy8vCisvLyAgIC8vIFRocmVhZCAxCisvLyAgIFRocmVhZExvY2FsPGludD4gdGwoMTAwKTsgIC8vIDEwMCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgZWFjaCB0aHJlYWQuCisvLworLy8gICAvLyBUaHJlYWQgMgorLy8gICB0bC5zZXQoMTUwKTsgIC8vIENoYW5nZXMgdGhlIHZhbHVlIGZvciB0aHJlYWQgMiBvbmx5LgorLy8gICBFWFBFQ1RfRVEoMTUwLCB0bC5nZXQoKSk7CisvLworLy8gICAvLyBUaHJlYWQgMQorLy8gICBFWFBFQ1RfRVEoMTAwLCB0bC5nZXQoKSk7ICAvLyBJbiB0aHJlYWQgMSwgdGwgaGFzIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKy8vICAgdGwuc2V0KDIwMCk7CisvLyAgIEVYUEVDVF9FUSgyMDAsIHRsLmdldCgpKTsKKy8vCisvLyBUaGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudCBUIG11c3QgaGF2ZSBhIHB1YmxpYyBjb3B5IGNvbnN0cnVjdG9yLgorLy8gSW4gYWRkaXRpb24sIHRoZSBkZWZhdWx0IFRocmVhZExvY2FsIGNvbnN0cnVjdG9yIHJlcXVpcmVzIFQgdG8gaGF2ZQorLy8gYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKy8vCisvLyBBbiBvYmplY3QgbWFuYWdlZCBmb3IgYSB0aHJlYWQgYnkgYSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBpcyBkZWxldGVkCisvLyB3aGVuIHRoZSB0aHJlYWQgZXhpdHMuICBPciwgaWYgdGhlIFRocmVhZExvY2FsIGluc3RhbmNlIGRpZXMgaW4KKy8vIHRoYXQgdGhyZWFkLCB3aGVuIHRoZSBUaHJlYWRMb2NhbCBkaWVzLiAgSXQncyB0aGUgdXNlcidzCisvLyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbGwgb3RoZXIgdGhyZWFkcyB1c2luZyBhIFRocmVhZExvY2FsCisvLyBoYXZlIGV4aXRlZCB3aGVuIGl0IGRpZXMsIG9yIHRoZSBwZXItdGhyZWFkIG9iamVjdHMgZm9yIHRob3NlCisvLyB0aHJlYWRzIHdpbGwgbm90IGJlIGRlbGV0ZWQuCisvLworLy8gR29vZ2xlIFRlc3Qgb25seSB1c2VzIGdsb2JhbCBUaHJlYWRMb2NhbCBvYmplY3RzLiAgVGhhdCBtZWFucyB0aGV5CisvLyB3aWxsIGRpZSBhZnRlciBtYWluKCkgaGFzIHJldHVybmVkLiAgVGhlcmVmb3JlLCBubyBwZXItdGhyZWFkCisvLyBvYmplY3QgbWFuYWdlZCBieSBHb29nbGUgVGVzdCB3aWxsIGJlIGxlYWtlZCBhcyBsb25nIGFzIGFsbCB0aHJlYWRzCisvLyB1c2luZyBHb29nbGUgVGVzdCBoYXZlIGV4aXRlZCB3aGVuIG1haW4oKSByZXR1cm5zLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUaHJlYWRMb2NhbCB7CisgcHVibGljOgorICBUaHJlYWRMb2NhbCgpIDoga2V5XyhDcmVhdGVLZXkoKSksCisgICAgICAgICAgICAgICAgICBkZWZhdWx0XygpIHt9CisgIGV4cGxpY2l0IFRocmVhZExvY2FsKGNvbnN0IFQmIHZhbHVlKSA6IGtleV8oQ3JlYXRlS2V5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Xyh2YWx1ZSkge30KKworICB+VGhyZWFkTG9jYWwoKSB7CisgICAgLy8gRGVzdHJveXMgdGhlIG1hbmFnZWQgb2JqZWN0IGZvciB0aGUgY3VycmVudCB0aHJlYWQsIGlmIGFueS4KKyAgICBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5XykpOworCisgICAgLy8gUmVsZWFzZXMgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LiAgVGhpcyB3aWxsICpub3QqCisgICAgLy8gZGVsZXRlIG1hbmFnZWQgb2JqZWN0cyBmb3Igb3RoZXIgdGhyZWFkcy4KKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX2tleV9kZWxldGUoa2V5XykpOworICB9CisKKyAgVCogcG9pbnRlcigpIHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQorICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZSgpOyB9CisgIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyKCk7IH0KKyAgdm9pZCBzZXQoY29uc3QgVCYgdmFsdWUpIHsgKnBvaW50ZXIoKSA9IHZhbHVlOyB9CisKKyBwcml2YXRlOgorICAvLyBIb2xkcyBhIHZhbHVlIG9mIHR5cGUgVC4KKyAgY2xhc3MgVmFsdWVIb2xkZXIgOiBwdWJsaWMgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IFZhbHVlSG9sZGVyKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KKworICAgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9CisKKyAgIHByaXZhdGU6CisgICAgVCB2YWx1ZV87CisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhWYWx1ZUhvbGRlcik7CisgIH07CisKKyAgc3RhdGljIHB0aHJlYWRfa2V5X3QgQ3JlYXRlS2V5KCkgeworICAgIHB0aHJlYWRfa2V5X3Qga2V5OworICAgIC8vIFdoZW4gYSB0aHJlYWQgZXhpdHMsIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB3aWxsIGJlIGNhbGxlZCBvbgorICAgIC8vIHRoZSBvYmplY3QgbWFuYWdlZCBmb3IgdGhhdCB0aHJlYWQuCisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18oCisgICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgma2V5LCAmRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSkpOworICAgIHJldHVybiBrZXk7CisgIH0KKworICBUKiBHZXRPckNyZWF0ZVZhbHVlKCkgY29uc3QgeworICAgIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBjb25zdCBob2xkZXIgPQorICAgICAgICBzdGF0aWNfY2FzdDxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5XykpOworICAgIGlmIChob2xkZXIgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxWYWx1ZUhvbGRlcj4oaG9sZGVyKS0+cG9pbnRlcigpOworICAgIH0KKworICAgIFZhbHVlSG9sZGVyKiBjb25zdCBuZXdfaG9sZGVyID0gbmV3IFZhbHVlSG9sZGVyKGRlZmF1bHRfKTsKKyAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyX2Jhc2UgPSBuZXdfaG9sZGVyOworICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5XywgaG9sZGVyX2Jhc2UpKTsKKyAgICByZXR1cm4gbmV3X2hvbGRlci0+cG9pbnRlcigpOworICB9CisKKyAgLy8gQSBrZXkgcHRocmVhZHMgdXNlcyBmb3IgbG9va2luZyB1cCBwZXItdGhyZWFkIHZhbHVlcy4KKyAgY29uc3QgcHRocmVhZF9rZXlfdCBrZXlfOworICBjb25zdCBUIGRlZmF1bHRfOyAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgorCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkTG9jYWwpOworfTsKKworI2RlZmluZSBHVEVTVF9JU19USFJFQURTQUZFIDEKKworI2Vsc2UgIC8vIEdURVNUX0hBU19QVEhSRUFECisKKy8vIEEgZHVtbXkgaW1wbGVtZW50YXRpb24gb2Ygc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgKG11dGV4LCBsb2NrLAorLy8gYW5kIHRocmVhZC1sb2NhbCB2YXJpYWJsZSkuICBOZWNlc3NhcnkgZm9yIGNvbXBpbGluZyBHb29nbGUgVGVzdCB3aGVyZQorLy8gbXV0ZXggaXMgbm90IHN1cHBvcnRlZCAtIHVzaW5nIEdvb2dsZSBUZXN0IGluIG11bHRpcGxlIHRocmVhZHMgaXMgbm90CisvLyBzdXBwb3J0ZWQgb24gc3VjaCBwbGF0Zm9ybXMuCisKK2NsYXNzIE11dGV4IHsKKyBwdWJsaWM6CisgIE11dGV4KCkge30KKyAgdm9pZCBBc3NlcnRIZWxkKCkgY29uc3Qge30KK307CisKKyNkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAorCisjZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAorCitjbGFzcyBHVGVzdE11dGV4TG9jayB7CisgcHVibGljOgorICBleHBsaWNpdCBHVGVzdE11dGV4TG9jayhNdXRleCopIHt9ICAvLyBOT0xJTlQKK307CisKK3R5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZExvY2FsIHsKKyBwdWJsaWM6CisgIFRocmVhZExvY2FsKCkgOiB2YWx1ZV8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQqIHBvaW50ZXIoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKworLy8gVGhlIGFib3ZlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGhhdmUgZHVtbXkgaW1wbGVtZW50YXRpb25zLgorLy8gVGhlcmVmb3JlIEdvb2dsZSBUZXN0IGlzIG5vdCB0aHJlYWQtc2FmZS4KKyNkZWZpbmUgR1RFU1RfSVNfVEhSRUFEU0FGRSAwCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGUgcHJvY2Vzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGF0CisvLyB3ZSBjYW5ub3QgZGV0ZWN0IGl0LgorR1RFU1RfQVBJXyBzaXplX3QgR2V0VGhyZWFkQ291bnQoKTsKKworLy8gUGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKSBjcmFzaGVzIHRoZSBBUk0KKy8vIGNvbXBpbGVyIGFuZCBnZW5lcmF0ZXMgYSB3YXJuaW5nIGluIFN1biBTdHVkaW8uICBUaGUgTm9raWEgU3ltYmlhbgorLy8gYW5kIHRoZSBJQk0gWEwgQy9DKysgY29tcGlsZXIgdHJ5IHRvIGluc3RhbnRpYXRlIGEgY29weSBjb25zdHJ1Y3RvcgorLy8gZm9yIG9iamVjdHMgcGFzc2VkIHRocm91Z2ggZWxsaXBzaXMgKC4uLiksIGZhaWxpbmcgZm9yIHVuY29weWFibGUKKy8vIG9iamVjdHMuICBXZSBkZWZpbmUgdGhpcyB0byBlbnN1cmUgdGhhdCBvbmx5IFBPRCBpcyBwYXNzZWQgdGhyb3VnaAorLy8gZWxsaXBzaXMgb24gdGhlc2Ugc3lzdGVtcy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykgfHwgZGVmaW5lZChfX1NVTlBST19DQykKKy8vIFdlIGxvc2Ugc3VwcG9ydCBmb3IgTlVMTCBkZXRlY3Rpb24gd2hlcmUgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZQorLy8gcGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKS4KKyNkZWZpbmUgR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXyAxCisjZWxzZQorI2RlZmluZSBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIDEKKyNlbmRpZgorCisvLyBUaGUgTm9raWEgU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIGNvbXBpbGVycyBjYW5ub3QgZGVjaWRlIGJldHdlZW4KKy8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgVGhlc2UgY29tcGlsZXJzCisvLyBfY2FuXyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLAorLy8gc28gYSB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3Jrcy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykKKyNkZWZpbmUgR1RFU1RfTkVFRFNfSVNfUE9JTlRFUl8gMQorI2VuZGlmCisKK3RlbXBsYXRlIDxib29sIGJvb2xfdmFsdWU+CitzdHJ1Y3QgYm9vbF9jb25zdGFudCB7CisgIHR5cGVkZWYgYm9vbF9jb25zdGFudDxib29sX3ZhbHVlPiB0eXBlOworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGJvb2xfdmFsdWU7Cit9OwordGVtcGxhdGUgPGJvb2wgYm9vbF92YWx1ZT4gY29uc3QgYm9vbCBib29sX2NvbnN0YW50PGJvb2xfdmFsdWU+Ojp2YWx1ZTsKKwordHlwZWRlZiBib29sX2NvbnN0YW50PGZhbHNlPiBmYWxzZV90eXBlOwordHlwZWRlZiBib29sX2NvbnN0YW50PHRydWU+IHRydWVfdHlwZTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfcG9pbnRlciA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc19wb2ludGVyPFQqPiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiXFwiCisjZGVmaW5lIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfIDEKKy8vIFRoZSBiaWdnZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhlIGNvbXBpbGVyIHN1cHBvcnRzLgordHlwZWRlZiBfX2ludDY0IEJpZ2dlc3RJbnQ7CisjZWxzZQorI2RlZmluZSBHVEVTVF9QQVRIX1NFUF8gIi8iCisjZGVmaW5lIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfIDAKK3R5cGVkZWYgbG9uZyBsb25nIEJpZ2dlc3RJbnQ7ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBUaGUgdGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4IG5hbWVzcGFjZSBob2xkcyB3cmFwcGVycyBmb3IgY29tbW9uCisvLyBQT1NJWCBmdW5jdGlvbnMuICBUaGVzZSB3cmFwcGVycyBoaWRlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisvLyBXaW5kb3dzL01TVkMgYW5kIFBPU0lYIHN5c3RlbXMuICBTaW5jZSBzb21lIGNvbXBpbGVycyBkZWZpbmUgdGhlc2UKKy8vIHN0YW5kYXJkIGZ1bmN0aW9ucyBhcyBtYWNyb3MsIHRoZSB3cmFwcGVyIGNhbm5vdCBoYXZlIHRoZSBzYW1lIG5hbWUKKy8vIGFzIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgorCituYW1lc3BhY2UgcG9zaXggeworCisvLyBGdW5jdGlvbnMgd2l0aCBhIGRpZmZlcmVudCBuYW1lIG9uIFdpbmRvd3MuCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisKK3R5cGVkZWYgc3RydWN0IF9zdGF0IFN0YXRTdHJ1Y3Q7CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KK2lubGluZSBpbnQgSXNBVFRZKGludCBmZCkgeyByZXR1cm4gaXNhdHR5KGZkKTsgfQoraW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgeworICByZXR1cm4gc3RyaWNtcChzMSwgczIpOworfQoraW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIHN0cmR1cChzcmMpOyB9CisjZWxzZSAgLy8gIV9fQk9STEFORENfXworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IElzQVRUWShpbnQgLyogZmQgKi8pIHsgcmV0dXJuIDA7IH0KKyNlbHNlCitpbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIF9pc2F0dHkoZmQpOyB9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBfc3RyaWNtcChzMSwgczIpOworfQoraW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIF9zdHJkdXAoc3JjKTsgfQorI2VuZGlmICAvLyBfX0JPUkxBTkRDX18KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IEZpbGVObyhGSUxFKiBmaWxlKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PGludD4oX2ZpbGVubyhmaWxlKSk7IH0KKy8vIFN0YXQoKSwgUm1EaXIoKSwgYW5kIElzRGlyKCkgYXJlIG5vdCBuZWVkZWQgb24gV2luZG93cyBDRSBhdCB0aGlzCisvLyB0aW1lIGFuZCB0aHVzIG5vdCBkZWZpbmVkIHRoZXJlLgorI2Vsc2UKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIF9maWxlbm8oZmlsZSk7IH0KK2lubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIF9zdGF0KHBhdGgsIGJ1Zik7IH0KK2lubGluZSBpbnQgUm1EaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBfcm1kaXIoZGlyKTsgfQoraW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsKKyAgcmV0dXJuIChfU19JRkRJUiAmIHN0LnN0X21vZGUpICE9IDA7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNlbHNlCisKK3R5cGVkZWYgc3RydWN0IHN0YXQgU3RhdFN0cnVjdDsKKworaW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gZmlsZW5vKGZpbGUpOyB9CitpbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIGlzYXR0eShmZCk7IH0KK2lubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIHN0YXQocGF0aCwgYnVmKTsgfQoraW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgeworICByZXR1cm4gc3RyY2FzZWNtcChzMSwgczIpOworfQoraW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIHN0cmR1cChzcmMpOyB9CitpbmxpbmUgaW50IFJtRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gcm1kaXIoZGlyKTsgfQoraW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsgcmV0dXJuIFNfSVNESVIoc3Quc3RfbW9kZSk7IH0KKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIEZ1bmN0aW9ucyBkZXByZWNhdGVkIGJ5IE1TVkMgOC4wLgorCisjaWZkZWYgX01TQ19WRVIKKy8vIFRlbXBvcmFyaWx5IGRpc2FibGUgd2FybmluZyA0OTk2IChkZXByZWNhdGVkIGZ1bmN0aW9uKS4KKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKKyNlbmRpZgorCitpbmxpbmUgY29uc3QgY2hhciogU3RyTkNweShjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBzcmMsIHNpemVfdCBuKSB7CisgIHJldHVybiBzdHJuY3B5KGRlc3QsIHNyYywgbik7Cit9CisKKy8vIENoRGlyKCksIEZSZW9wZW4oKSwgRkRPcGVuKCksIFJlYWQoKSwgV3JpdGUoKSwgQ2xvc2UoKSwgYW5kCisvLyBTdHJFcnJvcigpIGFyZW4ndCBuZWVkZWQgb24gV2luZG93cyBDRSBhdCB0aGlzIHRpbWUgYW5kIHRodXMgbm90CisvLyBkZWZpbmVkIHRoZXJlLgorCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IENoRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gY2hkaXIoZGlyKTsgfQorI2VuZGlmCitpbmxpbmUgRklMRSogRk9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSkgeworICByZXR1cm4gZm9wZW4ocGF0aCwgbW9kZSk7Cit9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgRklMRSAqRlJlb3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlLCBGSUxFKiBzdHJlYW0pIHsKKyAgcmV0dXJuIGZyZW9wZW4ocGF0aCwgbW9kZSwgc3RyZWFtKTsKK30KK2lubGluZSBGSUxFKiBGRE9wZW4oaW50IGZkLCBjb25zdCBjaGFyKiBtb2RlKSB7IHJldHVybiBmZG9wZW4oZmQsIG1vZGUpOyB9CisjZW5kaWYKK2lubGluZSBpbnQgRkNsb3NlKEZJTEUqIGZwKSB7IHJldHVybiBmY2xvc2UoZnApOyB9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFJlYWQoaW50IGZkLCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBjb3VudCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihyZWFkKGZkLCBidWYsIGNvdW50KSk7Cit9CitpbmxpbmUgaW50IFdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4od3JpdGUoZmQsIGJ1ZiwgY291bnQpKTsKK30KK2lubGluZSBpbnQgQ2xvc2UoaW50IGZkKSB7IHJldHVybiBjbG9zZShmZCk7IH0KK2lubGluZSBjb25zdCBjaGFyKiBTdHJFcnJvcihpbnQgZXJybnVtKSB7IHJldHVybiBzdHJlcnJvcihlcnJudW0pOyB9CisjZW5kaWYKK2lubGluZSBjb25zdCBjaGFyKiBHZXRFbnYoY29uc3QgY2hhciogbmFtZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIENFLCB3aGljaCBoYXMgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICByZXR1cm4gTlVMTDsKKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV84KSB8fCBkZWZpbmVkKF9fU3VuT1NfNV85KQorICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggd2UgcHJvZ3JhbW1hdGljYWxseSBjbGVhciB3aWxsIGJlIHNldCB0byB0aGUKKyAgLy8gZW1wdHkgc3RyaW5nIHJhdGhlciB0aGFuIHVuc2V0IChOVUxMKS4gIEhhbmRsZSB0aGF0IGNhc2UuCisgIGNvbnN0IGNoYXIqIGNvbnN0IGVudiA9IGdldGVudihuYW1lKTsKKyAgcmV0dXJuIChlbnYgIT0gTlVMTCAmJiBlbnZbMF0gIT0gJ1wwJykgPyBlbnYgOiBOVUxMOworI2Vsc2UKKyAgcmV0dXJuIGdldGVudihuYW1lKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwb3ApICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbmRpZgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIFdpbmRvd3MgQ0UgaGFzIG5vIEMgbGlicmFyeS4gVGhlIGFib3J0KCkgZnVuY3Rpb24gaXMgdXNlZCBpbgorLy8gc2V2ZXJhbCBwbGFjZXMgaW4gR29vZ2xlIFRlc3QuIFRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSByZWFzb25hYmxlCisvLyBpbWl0YXRpb24gb2Ygc3RhbmRhcmQgYmVoYXZpb3VyLgordm9pZCBBYm9ydCgpOworI2Vsc2UKK2lubGluZSB2b2lkIEFib3J0KCkgeyBhYm9ydCgpOyB9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKK30gIC8vIG5hbWVzcGFjZSBwb3NpeAorCisvLyBUaGUgbWF4aW11bSBudW1iZXIgYSBCaWdnZXN0SW50IGNhbiByZXByZXNlbnQuICBUaGlzIGRlZmluaXRpb24KKy8vIHdvcmtzIG5vIG1hdHRlciBCaWdnZXN0SW50IGlzIHJlcHJlc2VudGVkIGluIG9uZSdzIGNvbXBsZW1lbnQgb3IKKy8vIHR3bydzIGNvbXBsZW1lbnQuCisvLworLy8gV2UgY2Fubm90IHJlbHkgb24gbnVtZXJpY19saW1pdHMgaW4gU1RMLCBhcyBfX2ludDY0IGFuZCBsb25nIGxvbmcKKy8vIGFyZSBub3QgcGFydCBvZiBzdGFuZGFyZCBDKysgYW5kIG51bWVyaWNfbGltaXRzIGRvZXNuJ3QgbmVlZCB0byBiZQorLy8gZGVmaW5lZCBmb3IgdGhlbS4KK2NvbnN0IEJpZ2dlc3RJbnQga01heEJpZ2dlc3RJbnQgPQorICAgIH4oc3RhdGljX2Nhc3Q8QmlnZ2VzdEludD4oMSkgPDwgKDgqc2l6ZW9mKEJpZ2dlc3RJbnQpIC0gMSkpOworCisvLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHNlcnZlcyBhcyBhIGNvbXBpbGUtdGltZSBmdW5jdGlvbiBmcm9tIHNpemUgdG8KKy8vIHR5cGUuICBJdCBtYXBzIGEgc2l6ZSBpbiBieXRlcyB0byBhIHByaW1pdGl2ZSB0eXBlIHdpdGggdGhhdAorLy8gc2l6ZS4gZS5nLgorLy8KKy8vICAgVHlwZVdpdGhTaXplPDQ+OjpVSW50CisvLworLy8gaXMgdHlwZWRlZi1lZCB0byBiZSB1bnNpZ25lZCBpbnQgKHVuc2lnbmVkIGludGVnZXIgbWFkZSB1cCBvZiA0CisvLyBieXRlcykuCisvLworLy8gU3VjaCBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZWxvbmcgdG8gU1RMLCBidXQgSSBjYW5ub3QgZmluZCBpdAorLy8gdGhlcmUuCisvLworLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGlzIGNsYXNzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmbG9hdGluZy1wb2ludAorLy8gY29tcGFyaXNvbi4KKy8vCisvLyBGb3Igbm93IGl0IG9ubHkgaGFuZGxlcyBVSW50ICh1bnNpZ25lZCBpbnQpIGFzIHRoYXQncyBhbGwgR29vZ2xlIFRlc3QKKy8vIG5lZWRzLiAgT3RoZXIgdHlwZXMgY2FuIGJlIGVhc2lseSBhZGRlZCBpbiB0aGUgZnV0dXJlIGlmIG5lZWQKKy8vIGFyaXNlcy4KK3RlbXBsYXRlIDxzaXplX3Qgc2l6ZT4KK2NsYXNzIFR5cGVXaXRoU2l6ZSB7CisgcHVibGljOgorICAvLyBUaGlzIHByZXZlbnRzIHRoZSB1c2VyIGZyb20gdXNpbmcgVHlwZVdpdGhTaXplPE4+IHdpdGggaW5jb3JyZWN0CisgIC8vIHZhbHVlcyBvZiBOLgorICB0eXBlZGVmIHZvaWQgVUludDsKK307CisKKy8vIFRoZSBzcGVjaWFsaXphdGlvbiBmb3Igc2l6ZSA0LgordGVtcGxhdGUgPD4KK2NsYXNzIFR5cGVXaXRoU2l6ZTw0PiB7CisgcHVibGljOgorICAvLyB1bnNpZ25lZCBpbnQgaGFzIHNpemUgNCBpbiBib3RoIGdjYyBhbmQgTVNWQy4KKyAgLy8KKyAgLy8gQXMgYmFzZS9iYXNpY3R5cGVzLmggZG9lc24ndCBjb21waWxlIG9uIFdpbmRvd3MsIHdlIGNhbm5vdCB1c2UKKyAgLy8gdWludDMyLCB1aW50NjQsIGFuZCBldGMgaGVyZS4KKyAgdHlwZWRlZiBpbnQgSW50OworICB0eXBlZGVmIHVuc2lnbmVkIGludCBVSW50OworfTsKKworLy8gVGhlIHNwZWNpYWxpemF0aW9uIGZvciBzaXplIDguCit0ZW1wbGF0ZSA8PgorY2xhc3MgVHlwZVdpdGhTaXplPDg+IHsKKyBwdWJsaWM6CisjaWYgR1RFU1RfT1NfV0lORE9XUworICB0eXBlZGVmIF9faW50NjQgSW50OworICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgVUludDsKKyNlbHNlCisgIHR5cGVkZWYgbG9uZyBsb25nIEludDsgIC8vIE5PTElOVAorICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSW50OyAgLy8gTk9MSU5UCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK307CisKKy8vIEludGVnZXIgdHlwZXMgb2Yga25vd24gc2l6ZXMuCit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw0Pjo6SW50IEludDMyOwordHlwZWRlZiBUeXBlV2l0aFNpemU8ND46OlVJbnQgVUludDMyOwordHlwZWRlZiBUeXBlV2l0aFNpemU8OD46OkludCBJbnQ2NDsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpVSW50IFVJbnQ2NDsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpJbnQgVGltZUluTWlsbGlzOyAgLy8gUmVwcmVzZW50cyB0aW1lIGluIG1pbGxpc2Vjb25kcy4KKworLy8gVXRpbGl0aWVzIGZvciBjb21tYW5kIGxpbmUgZmxhZ3MgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworLy8gTWFjcm8gZm9yIHJlZmVyZW5jaW5nIGZsYWdzLgorI2RlZmluZSBHVEVTVF9GTEFHKG5hbWUpIEZMQUdTX2d0ZXN0XyMjbmFtZQorCisvLyBNYWNyb3MgZm9yIGRlY2xhcmluZyBmbGFncy4KKyNkZWZpbmUgR1RFU1RfREVDTEFSRV9ib29sXyhuYW1lKSBHVEVTVF9BUElfIGV4dGVybiBib29sIEdURVNUX0ZMQUcobmFtZSkKKyNkZWZpbmUgR1RFU1RfREVDTEFSRV9pbnQzMl8obmFtZSkgXAorICAgIEdURVNUX0FQSV8gZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkludDMyIEdURVNUX0ZMQUcobmFtZSkKKyNkZWZpbmUgR1RFU1RfREVDTEFSRV9zdHJpbmdfKG5hbWUpIFwKKyAgICBHVEVTVF9BUElfIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmcgR1RFU1RfRkxBRyhuYW1lKQorCisvLyBNYWNyb3MgZm9yIGRlZmluaW5nIGZsYWdzLgorI2RlZmluZSBHVEVTVF9ERUZJTkVfYm9vbF8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gYm9vbCBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQorI2RlZmluZSBHVEVTVF9ERUZJTkVfaW50MzJfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwKKyAgICBHVEVTVF9BUElfIDo6dGVzdGluZzo6aW50ZXJuYWw6OkludDMyIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIEdURVNUX0RFRklORV9zdHJpbmdfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwKKyAgICBHVEVTVF9BUElfIDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZyBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQorCisvLyBQYXJzZXMgJ3N0cicgZm9yIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLiAgSWYgc3VjY2Vzc2Z1bCwgd3JpdGVzIHRoZSByZXN1bHQKKy8vIHRvICp2YWx1ZSBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICp2YWx1ZSB1bmNoYW5nZWQgYW5kIHJldHVybnMKKy8vIGZhbHNlLgorLy8gVE9ETyhjaGFuZGxlcmMpOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWZhY3RvciBmbGFnIGFuZCBlbnZpcm9ubWVudCBwYXJzaW5nCisvLyBvdXQgb2YgYm90aCBndGVzdC1wb3J0LmNjIGFuZCBndGVzdC5jYyB0byBhdm9pZCBleHBvcnRpbmcgdGhpcyB1dGlsaXR5CisvLyBmdW5jdGlvbi4KK2Jvb2wgUGFyc2VJbnQzMihjb25zdCBNZXNzYWdlJiBzcmNfdGV4dCwgY29uc3QgY2hhciogc3RyLCBJbnQzMiogdmFsdWUpOworCisvLyBQYXJzZXMgYSBib29sL0ludDMyL3N0cmluZyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorLy8gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gR29vZ2xlIFRlc3QgZmxhZy4KK2Jvb2wgQm9vbEZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBib29sIGRlZmF1bHRfdmFsKTsKK0dURVNUX0FQSV8gSW50MzIgSW50MzJGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgSW50MzIgZGVmYXVsdF92YWwpOworY29uc3QgY2hhciogU3RyaW5nRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZjA5M2RlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oCkBAIC0wLDAgKzEsMzUwIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIHRoZSBTdHJpbmcgY2xhc3MgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuIFRoZXkgc2hvdWxkIG5vdCB1c2VkCisvLyBieSBjb2RlIGV4dGVybmFsIHRvIEdvb2dsZSBUZXN0LgorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgaXMgI2luY2x1ZGVkIGJ5IDxndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oPi4KKy8vIEl0IHNob3VsZCBub3QgYmUgI2luY2x1ZGVkIGJ5IG90aGVyIGZpbGVzLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIHN0cmluZy5oIGlzIG5vdCBndWFyYW50ZWVkIHRvIHByb3ZpZGUgc3RyY3B5IG9uIEMrKyBCdWlsZGVyLgorI2luY2x1ZGUgPG1lbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFN0cmluZyAtIGEgVVRGLTggc3RyaW5nIGNsYXNzLgorLy8KKy8vIEZvciBoaXN0b3JpYyByZWFzb25zLCB3ZSBkb24ndCB1c2Ugc3RkOjpzdHJpbmcuCisvLworLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlcGxhY2UgdGhpcyBjbGFzcyB3aXRoIHN0ZDo6c3RyaW5nIG9yCisvLyBpbXBsZW1lbnQgaXQgaW4gdGVybXMgb2YgdGhlIGxhdHRlci4KKy8vCisvLyBOb3RlIHRoYXQgU3RyaW5nIGNhbiByZXByZXNlbnQgYm90aCBOVUxMIGFuZCB0aGUgZW1wdHkgc3RyaW5nLAorLy8gd2hpbGUgc3RkOjpzdHJpbmcgY2Fubm90IHJlcHJlc2VudCBOVUxMLgorLy8KKy8vIE5VTEwgYW5kIHRoZSBlbXB0eSBzdHJpbmcgYXJlIGNvbnNpZGVyZWQgZGlmZmVyZW50LiAgTlVMTCBpcyBsZXNzCisvLyB0aGFuIGFueXRoaW5nIChpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZykgZXhjZXB0IGl0c2VsZi4KKy8vCisvLyBUaGlzIGNsYXNzIG9ubHkgcHJvdmlkZXMgbWluaW11bSBmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeSBmb3IKKy8vIGltcGxlbWVudGluZyBHb29nbGUgVGVzdC4gIFdlIGRvIG5vdCBpbnRlbmQgdG8gaW1wbGVtZW50IGEgZnVsbC1mbGVkZ2VkCisvLyBzdHJpbmcgY2xhc3MgaGVyZS4KKy8vCisvLyBTaW5jZSB0aGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHByb3ZpZGUgYSBzdWJzdGl0dXRlIGZvcgorLy8gc3RkOjpzdHJpbmcgb24gcGxhdGZvcm1zIHdoZXJlIGl0IGNhbm5vdCBiZSB1c2VkLCB3ZSBkZWZpbmUgYSBjb3B5CisvLyBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMgc3VjaCB0aGF0IHdlIGRvbid0IG5lZWQKKy8vIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGluIGEgbG90IG9mIHBsYWNlcy4KKy8vCisvLyBJbiBvcmRlciB0byBtYWtlIHRoZSByZXByZXNlbnRhdGlvbiBlZmZpY2llbnQsIHRoZSBkJ3RvciBvZiBTdHJpbmcKKy8vIGlzIG5vdCB2aXJ0dWFsLiAgVGhlcmVmb3JlIERPIE5PVCBJTkhFUklUIEZST00gU3RyaW5nLgorY2xhc3MgR1RFU1RfQVBJXyBTdHJpbmcgeworIHB1YmxpYzoKKyAgLy8gU3RhdGljIHV0aWxpdHkgbWV0aG9kcworCisgIC8vIFJldHVybnMgdGhlIGlucHV0IGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMgaWYgaXQncyBub3QgTlVMTDsKKyAgLy8gb3RoZXJ3aXNlIHJldHVybnMgIihudWxsKSIuICBGb3IgZXhhbXBsZSwgIlwiSGVsbG9cIiIgaXMgcmV0dXJuZWQKKyAgLy8gZm9yIGlucHV0ICJIZWxsbyIuCisgIC8vCisgIC8vIFRoaXMgaXMgdXNlZnVsIGZvciBwcmludGluZyBhIEMgc3RyaW5nIGluIHRoZSBzeW50YXggb2YgYSBsaXRlcmFsLgorICAvLworICAvLyBLbm93biBpc3N1ZTogZXNjYXBlIHNlcXVlbmNlcyBhcmUgbm90IGhhbmRsZWQgeWV0LgorICBzdGF0aWMgU3RyaW5nIFNob3dDU3RyaW5nUXVvdGVkKGNvbnN0IGNoYXIqIGNfc3RyKTsKKworICAvLyBDbG9uZXMgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHVzaW5nIG5ldy4gIFRoZQorICAvLyBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4gdmFsdWUgdXNpbmcKKyAgLy8gZGVsZXRlW10uICBSZXR1cm5zIHRoZSBjbG9uZWQgc3RyaW5nLCBvciBOVUxMIGlmIHRoZSBpbnB1dCBpcworICAvLyBOVUxMLgorICAvLworICAvLyBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHN0cmR1cCgpIGluIHN0cmluZy5oLCB3aGljaCBhbGxvY2F0ZXMKKyAgLy8gbWVtb3J5IHVzaW5nIG1hbGxvYygpLgorICBzdGF0aWMgY29uc3QgY2hhciogQ2xvbmVDU3RyaW5nKGNvbnN0IGNoYXIqIGNfc3RyKTsKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdpbmRvd3MgQ0UgZG9lcyBub3QgaGF2ZSB0aGUgJ0FOU0knIHZlcnNpb25zIG9mIFdpbjMyIEFQSXMuIFRvIGJlCisgIC8vIGFibGUgdG8gcGFzcyBzdHJpbmdzIHRvIFdpbjMyIEFQSXMgb24gQ0Ugd2UgbmVlZCB0byBjb252ZXJ0IHRoZW0KKyAgLy8gdG8gJ1VuaWNvZGUnLCBVVEYtMTYuCisKKyAgLy8gQ3JlYXRlcyBhIFVURi0xNiB3aWRlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBBTlNJIHN0cmluZywgYWxsb2NhdGluZworICAvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCisgIC8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSB3aWRlIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKyAgLy8gaW5wdXQgaXMgTlVMTC4KKyAgLy8KKyAgLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIEFOU0kgY29kZXBhZ2UgKENQX0FDUCkgdG8KKyAgLy8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiB0aGUgQU5TSSB2ZXJzaW9ucyBvZiBXaW4zMiBjYWxscyBhbmQgdGhlCisgIC8vIEMgcnVudGltZS4KKyAgc3RhdGljIExQQ1dTVFIgQW5zaVRvVXRmMTYoY29uc3QgY2hhciogY19zdHIpOworCisgIC8vIENyZWF0ZXMgYW4gQU5TSSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcsIGFsbG9jYXRpbmcKKyAgLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorICAvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgQU5TSSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCisgIC8vIGlucHV0IGlzIE5VTEwuCisgIC8vCisgIC8vIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY3JlYXRlZCB1c2luZyB0aGUgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSB0bworICAvLyBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBBTlNJIHZlcnNpb25zIG9mIFdpbjMyIGNhbGxzIGFuZCB0aGUKKyAgLy8gQyBydW50aW1lLgorICBzdGF0aWMgY29uc3QgY2hhciogVXRmMTZUb0Fuc2koTFBDV1NUUiB1dGYxNl9zdHIpOworI2VuZGlmCisKKyAgLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSBzdHJjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBCisgIC8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgc3RhdGljIGJvb2wgQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyKiBsaHMsIGNvbnN0IGNoYXIqIHJocyk7CisKKyAgLy8gQ29udmVydHMgYSB3aWRlIEMgc3RyaW5nIHRvIGEgU3RyaW5nIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KKyAgLy8gTlVMTCB3aWxsIGJlIGNvbnZlcnRlZCB0byAiKG51bGwpIi4gIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZworICAvLyB0aGUgY29udmVyc2lvbiwgIihmYWlsZWQgdG8gY29udmVydCBmcm9tIHdpZGUgc3RyaW5nKSIgaXMKKyAgLy8gcmV0dXJuZWQuCisgIHN0YXRpYyBTdHJpbmcgU2hvd1dpZGVDU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHdpZGVfY19zdHIpOworCisgIC8vIFNpbWlsYXIgdG8gU2hvd1dpZGVDU3RyaW5nKCksIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gZW5jbG9zZXMKKyAgLy8gdGhlIGNvbnZlcnRlZCBzdHJpbmcgaW4gZG91YmxlIHF1b3Rlcy4KKyAgc3RhdGljIFN0cmluZyBTaG93V2lkZUNTdHJpbmdRdW90ZWQoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cik7CisKKyAgLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUKKyAgLy8gY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHdjc2NtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKyAgLy8gTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsIGNvbnN0IHdjaGFyX3QqIHJocyk7CisKKyAgLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQorICAvLyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSBzdHJjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLgorICAvLyBBIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgc3RhdGljIGJvb2wgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyKiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzKTsKKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KKyAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCB3aWRlIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgLy8gTkI6IFRoZSBpbXBsZW1lbnRhdGlvbnMgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBzbGlnaHRseSBkaWZmZXIuCisgIC8vIE9uIHdpbmRvd3MsIHRoaXMgbWV0aG9kIHVzZXMgX3djc2ljbXAgd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFCisgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlLiBPbiBHTlUgcGxhdGZvcm0gdGhpcyBtZXRob2QgdXNlcyB3Y3NjYXNlY21wCisgIC8vIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisgIC8vIE9uIE1hY09TIFgsIGl0IHVzZXMgdG93bG93ZXIsIHdoaWNoIGFsc28gdXNlcyBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUKKyAgLy8gY3VycmVudCBsb2NhbGUuCisgIHN0YXRpYyBib29sIENhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcmhzKTsKKworICAvLyBGb3JtYXRzIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYSBTdHJpbmcsIHVzaW5nIHRoZSBzYW1lIGZvcm1hdAorICAvLyBzcGVjIHN0cmluZyBhcyBmb3IgcHJpbnRmLgorICAvLworICAvLyBXZSBkbyBub3QgdXNlIHRoZSBTdHJpbmdQcmludGYgY2xhc3MgYXMgaXQgaXMgbm90IHVuaXZlcnNhbGx5CisgIC8vIGF2YWlsYWJsZS4KKyAgLy8KKyAgLy8gVGhlIHJlc3VsdCBpcyBsaW1pdGVkIHRvIDQwOTYgY2hhcmFjdGVycyAoaW5jbHVkaW5nIHRoZSB0YWlsaW5nCisgIC8vIDApLiAgSWYgNDA5NiBjaGFyYWN0ZXJzIGFyZSBub3QgZW5vdWdoIHRvIGZvcm1hdCB0aGUgaW5wdXQsCisgIC8vICI8YnVmZmVyIGV4Y2VlZGVkPiIgaXMgcmV0dXJuZWQuCisgIHN0YXRpYyBTdHJpbmcgRm9ybWF0KGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKTsKKworICAvLyBDJ3RvcnMKKworICAvLyBUaGUgZGVmYXVsdCBjJ3RvciBjb25zdHJ1Y3RzIGEgTlVMTCBzdHJpbmcuCisgIFN0cmluZygpIDogY19zdHJfKE5VTEwpLCBsZW5ndGhfKDApIHt9CisKKyAgLy8gQ29uc3RydWN0cyBhIFN0cmluZyBieSBjbG9uaW5nIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLgorICBTdHJpbmcoY29uc3QgY2hhciogYV9jX3N0cikgeyAgLy8gTk9MSU5UCisgICAgaWYgKGFfY19zdHIgPT0gTlVMTCkgeworICAgICAgY19zdHJfID0gTlVMTDsKKyAgICAgIGxlbmd0aF8gPSAwOworICAgIH0gZWxzZSB7CisgICAgICBDb25zdHJ1Y3ROb25OdWxsKGFfY19zdHIsIHN0cmxlbihhX2Nfc3RyKSk7CisgICAgfQorICB9CisKKyAgLy8gQ29uc3RydWN0cyBhIFN0cmluZyBieSBjb3B5aW5nIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJzIGZyb20gYQorICAvLyBidWZmZXIuICBFLmcuIFN0cmluZygiaGVsbG8iLCAzKSBjcmVhdGVzIHRoZSBzdHJpbmcgImhlbCIsCisgIC8vIFN0cmluZygiYVwwYmNkIiwgNCkgY3JlYXRlcyAiYVwwYmMiLCBTdHJpbmcoTlVMTCwgMCkgY3JlYXRlcyAiIiwKKyAgLy8gYW5kIFN0cmluZyhOVUxMLCAxKSByZXN1bHRzIGluIGFjY2VzcyB2aW9sYXRpb24uCisgIFN0cmluZyhjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBhX2xlbmd0aCkgeworICAgIENvbnN0cnVjdE5vbk51bGwoYnVmZmVyLCBhX2xlbmd0aCk7CisgIH0KKworICAvLyBUaGUgY29weSBjJ3RvciBjcmVhdGVzIGEgbmV3IGNvcHkgb2YgdGhlIHN0cmluZy4gIFRoZSB0d28KKyAgLy8gU3RyaW5nIG9iamVjdHMgZG8gbm90IHNoYXJlIGNvbnRlbnQuCisgIFN0cmluZyhjb25zdCBTdHJpbmcmIHN0cikgOiBjX3N0cl8oTlVMTCksIGxlbmd0aF8oMCkgeyAqdGhpcyA9IHN0cjsgfQorCisgIC8vIEQndG9yLiAgU3RyaW5nIGlzIGludGVuZGVkIHRvIGJlIGEgZmluYWwgY2xhc3MsIHNvIHRoZSBkJ3RvcgorICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgdmlydHVhbC4KKyAgflN0cmluZygpIHsgZGVsZXRlW10gY19zdHJfOyB9CisKKyAgLy8gQWxsb3dzIGEgU3RyaW5nIHRvIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGFuIDo6c3RkOjpzdHJpbmcgb3IKKyAgLy8gOjpzdHJpbmcsIGFuZCB2aWNlIHZlcnNhLiAgQ29udmVydGluZyBhIFN0cmluZyBjb250YWluaW5nIGEgTlVMTAorICAvLyBwb2ludGVyIHRvIDo6c3RkOjpzdHJpbmcgb3IgOjpzdHJpbmcgaXMgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAvLyBDb252ZXJ0aW5nIGEgOjpzdGQ6OnN0cmluZyBvciA6OnN0cmluZyBjb250YWluaW5nIGFuIGVtYmVkZGVkIE5VTAorICAvLyBjaGFyYWN0ZXIgdG8gYSBTdHJpbmcgd2lsbCByZXN1bHQgaW4gdGhlIHByZWZpeCB1cCB0byB0aGUgZmlyc3QKKyAgLy8gTlVMIGNoYXJhY3Rlci4KKyAgU3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0cikgeworICAgIENvbnN0cnVjdE5vbk51bGwoc3RyLmNfc3RyKCksIHN0ci5sZW5ndGgoKSk7CisgIH0KKworICBvcGVyYXRvciA6OnN0ZDo6c3RyaW5nKCkgY29uc3QgeyByZXR1cm4gOjpzdGQ6OnN0cmluZyhjX3N0cigpLCBsZW5ndGgoKSk7IH0KKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisgIFN0cmluZyhjb25zdCA6OnN0cmluZyYgc3RyKSB7CisgICAgQ29uc3RydWN0Tm9uTnVsbChzdHIuY19zdHIoKSwgc3RyLmxlbmd0aCgpKTsKKyAgfQorCisgIG9wZXJhdG9yIDo6c3RyaW5nKCkgY29uc3QgeyByZXR1cm4gOjpzdHJpbmcoY19zdHIoKSwgbGVuZ3RoKCkpOyB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIGVtcHR5IHN0cmluZyAoaS5lLiAiIikuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiAoY19zdHIoKSAhPSBOVUxMKSAmJiAobGVuZ3RoKCkgPT0gMCk7IH0KKworICAvLyBDb21wYXJlcyB0aGlzIHdpdGggYW5vdGhlciBTdHJpbmcuCisgIC8vIFJldHVybnMgPCAwIGlmIHRoaXMgaXMgbGVzcyB0aGFuIHJocywgMCBpZiB0aGlzIGlzIGVxdWFsIHRvIHJocywgb3IgPiAwCisgIC8vIGlmIHRoaXMgaXMgZ3JlYXRlciB0aGFuIHJocy4KKyAgaW50IENvbXBhcmUoY29uc3QgU3RyaW5nJiByaHMpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBTdHJpbmcgZXF1YWxzIHRoZSBnaXZlbiBDIHN0cmluZy4gIEEgTlVMTAorICAvLyBzdHJpbmcgYW5kIGEgbm9uLU5VTEwgc3RyaW5nIGFyZSBjb25zaWRlcmVkIG5vdCBlcXVhbC4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoYXIqIGFfY19zdHIpIGNvbnN0IHsgcmV0dXJuIENvbXBhcmUoYV9jX3N0cikgPT0gMDsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBTdHJpbmcgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBTdHJpbmcuICBBCisgIC8vIE5VTEwgc3RyaW5nIGlzIGNvbnNpZGVyZWQgbGVzcyB0aGFuICIiLgorICBib29sIG9wZXJhdG9yPChjb25zdCBTdHJpbmcmIHJocykgY29uc3QgeyByZXR1cm4gQ29tcGFyZShyaHMpIDwgMDsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBTdHJpbmcgZG9lc24ndCBlcXVhbCB0aGUgZ2l2ZW4gQyBzdHJpbmcuICBBIE5VTEwKKyAgLy8gc3RyaW5nIGFuZCBhIG5vbi1OVUxMIHN0cmluZyBhcmUgY29uc2lkZXJlZCBub3QgZXF1YWwuCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjaGFyKiBhX2Nfc3RyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IGFfY19zdHIpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIFN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeC4gICpBbnkqCisgIC8vIFN0cmluZyBpcyBjb25zaWRlcmVkIHRvIGVuZCB3aXRoIGEgTlVMTCBvciBlbXB0eSBzdWZmaXguCisgIGJvb2wgRW5kc1dpdGgoY29uc3QgY2hhciogc3VmZml4KSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgU3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBub3QgY29uc2lkZXJpbmcKKyAgLy8gY2FzZS4gQW55IFN0cmluZyBpcyBjb25zaWRlcmVkIHRvIGVuZCB3aXRoIGEgTlVMTCBvciBlbXB0eSBzdWZmaXguCisgIGJvb2wgRW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoY29uc3QgY2hhciogc3VmZml4KSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGVuY2Fwc3VsYXRlZCBzdHJpbmcsIG9yIDAgaWYgdGhlCisgIC8vIHN0cmluZyBpcyBOVUxMLgorICBzaXplX3QgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXzsgfQorCisgIC8vIEdldHMgdGhlIDAtdGVybWluYXRlZCBDIHN0cmluZyB0aGlzIFN0cmluZyBvYmplY3QgcmVwcmVzZW50cy4KKyAgLy8gVGhlIFN0cmluZyBvYmplY3Qgc3RpbGwgb3ducyB0aGUgc3RyaW5nLiAgVGhlcmVmb3JlIHRoZSBjYWxsZXIKKyAgLy8gc2hvdWxkIE5PVCBkZWxldGUgdGhlIHJldHVybiB2YWx1ZS4KKyAgY29uc3QgY2hhciogY19zdHIoKSBjb25zdCB7IHJldHVybiBjX3N0cl87IH0KKworICAvLyBBc3NpZ25zIGEgQyBzdHJpbmcgdG8gdGhpcyBvYmplY3QuICBTZWxmLWFzc2lnbm1lbnQgd29ya3MuCisgIGNvbnN0IFN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IGNoYXIqIGFfY19zdHIpIHsKKyAgICByZXR1cm4gKnRoaXMgPSBTdHJpbmcoYV9jX3N0cik7CisgIH0KKworICAvLyBBc3NpZ25zIGEgU3RyaW5nIG9iamVjdCB0byB0aGlzIG9iamVjdC4gIFNlbGYtYXNzaWdubWVudCB3b3Jrcy4KKyAgY29uc3QgU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgU3RyaW5nJiByaHMpIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICBkZWxldGVbXSBjX3N0cl87CisgICAgICBpZiAocmhzLmNfc3RyKCkgPT0gTlVMTCkgeworICAgICAgICBjX3N0cl8gPSBOVUxMOworICAgICAgICBsZW5ndGhfID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvbnN0cnVjdE5vbk51bGwocmhzLmNfc3RyKCksIHJocy5sZW5ndGgoKSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyBwcml2YXRlOgorICAvLyBDb25zdHJ1Y3RzIGEgbm9uLU5VTEwgU3RyaW5nIGZyb20gdGhlIGdpdmVuIGNvbnRlbnQuICBUaGlzCisgIC8vIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIGRhdGFfIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQuCisgIC8vIENvbnN0cnVjdE5vbk51bGwoTlVMTCwgMCkgcmVzdWx0cyBpbiBhbiBlbXB0eSBzdHJpbmcgKCIiKS4KKyAgLy8gQ29uc3RydWN0Tm9uTnVsbChOVUxMLCBub25femVybykgaXMgdW5kZWZpbmVkIGJlaGF2aW9yLgorICB2b2lkIENvbnN0cnVjdE5vbk51bGwoY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgYV9sZW5ndGgpIHsKKyAgICBjaGFyKiBjb25zdCBzdHIgPSBuZXcgY2hhclthX2xlbmd0aCArIDFdOworICAgIG1lbWNweShzdHIsIGJ1ZmZlciwgYV9sZW5ndGgpOworICAgIHN0clthX2xlbmd0aF0gPSAnXDAnOworICAgIGNfc3RyXyA9IHN0cjsKKyAgICBsZW5ndGhfID0gYV9sZW5ndGg7CisgIH0KKworICBjb25zdCBjaGFyKiBjX3N0cl87CisgIHNpemVfdCBsZW5ndGhfOworfTsgIC8vIGNsYXNzIFN0cmluZworCisvLyBTdHJlYW1zIGEgU3RyaW5nIHRvIGFuIG9zdHJlYW0uICBFYWNoICdcMCcgY2hhcmFjdGVyIGluIHRoZSBTdHJpbmcKKy8vIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCitpbmxpbmUgOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdHJpbmcmIHN0cikgeworICBpZiAoc3RyLmNfc3RyKCkgPT0gTlVMTCkgeworICAgIG9zIDw8ICIobnVsbCkiOworICB9IGVsc2UgeworICAgIGNvbnN0IGNoYXIqIGNvbnN0IGNfc3RyID0gc3RyLmNfc3RyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIGlmIChjX3N0cltpXSA9PSAnXDAnKSB7CisgICAgICAgIG9zIDw8ICJcXDAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3MgPDwgY19zdHJbaV07CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBvczsKK30KKworLy8gR2V0cyB0aGUgY29udGVudCBvZiB0aGUgU3RyU3RyZWFtJ3MgYnVmZmVyIGFzIGEgU3RyaW5nLiAgRWFjaCAnXDAnCisvLyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorR1RFU1RfQVBJXyBTdHJpbmcgU3RyU3RyZWFtVG9TdHJpbmcoU3RyU3RyZWFtKiBzdHJlYW0pOworCisvLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYSBTdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcworLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKKy8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAorLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCisKKy8vIERlY2xhcmVkIGhlcmUgYnV0IGRlZmluZWQgaW4gZ3Rlc3QuaCwgc28gdGhhdCBpdCBoYXMgYWNjZXNzCisvLyB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgTWVzc2FnZSBjbGFzcywgcmVxdWlyZWQgYnkgdGhlIEFSTQorLy8gY29tcGlsZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1N0cmluZyBTdHJlYW1hYmxlVG9TdHJpbmcoY29uc3QgVCYgc3RyZWFtYWJsZSk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1NUUklOR19IXwpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmggYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjE3OGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgKQEAgLTAsMCArMSw5NjggQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGEgc2NyaXB0LiAgRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEltcGxlbWVudHMgYSBzdWJzZXQgb2YgVFIxIHR1cGxlIG5lZWRlZCBieSBHb29nbGUgVGVzdCBhbmQgR29vZ2xlIE1vY2suCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PiAgLy8gRm9yIDo6c3RkOjpwYWlyLgorCisvLyBUaGUgY29tcGlsZXIgdXNlZCBpbiBTeW1iaWFuIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHVzIGZyb20gZGVjbGFyaW5nIHRoZQorLy8gdHVwbGUgdGVtcGxhdGUgYXMgYSBmcmllbmQgKGl0IGNvbXBsYWlucyB0aGF0IHR1cGxlIGlzIHJlZGVmaW5lZCkuICBUaGlzCisvLyBoYWNrIGJ5cGFzc2VzIHRoZSBidWcgYnkgZGVjbGFyaW5nIHRoZSBtZW1iZXJzIHRoYXQgc2hvdWxkIG90aGVyd2lzZSBiZQorLy8gcHJpdmF0ZSBhcyBwdWJsaWMuCisvLyBTdW4gU3R1ZGlvIHZlcnNpb25zIDwgMTIgYWxzbyBoYXZlIHRoZSBhYm92ZSBidWcuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCAoZGVmaW5lZChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDU5MCkKKyNkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoKKyNlbHNlCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBcCisgICAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+IGZyaWVuZCBjbGFzcyB0dXBsZTsgXAorICAgcHJpdmF0ZToKKyNlbmRpZgorCisvLyBHVEVTVF9uX1RVUExFXyhUKSBpcyB0aGUgdHlwZSBvZiBhbiBuLXR1cGxlLgorI2RlZmluZSBHVEVTVF8wX1RVUExFXyhUKSB0dXBsZTw+CisjZGVmaW5lIEdURVNUXzFfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF8yX1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfM19UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzRfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIHZvaWQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF81X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfNl9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzdfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF84X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCisgICAgVCMjNywgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfOV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIFQjIzcsIFQjIzgsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzEwX1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCisgICAgVCMjNywgVCMjOCwgVCMjOT4KKworLy8gR1RFU1Rfbl9UWVBFTkFNRVNfKFQpIGRlY2xhcmVzIGEgbGlzdCBvZiBuIHR5cGVuYW1lcy4KKyNkZWZpbmUgR1RFU1RfMF9UWVBFTkFNRVNfKFQpCisjZGVmaW5lIEdURVNUXzFfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwCisjZGVmaW5lIEdURVNUXzJfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxCisjZGVmaW5lIEdURVNUXzNfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyCisjZGVmaW5lIEdURVNUXzRfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMworI2RlZmluZSBHVEVTVF81X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQKKyNkZWZpbmUgR1RFU1RfNl9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1CisjZGVmaW5lIEdURVNUXzdfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNgorI2RlZmluZSBHVEVTVF84X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYsIHR5cGVuYW1lIFQjIzcKKyNkZWZpbmUgR1RFU1RfOV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCBcCisgICAgdHlwZW5hbWUgVCMjNywgdHlwZW5hbWUgVCMjOAorI2RlZmluZSBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCBcCisgICAgdHlwZW5hbWUgVCMjNywgdHlwZW5hbWUgVCMjOCwgdHlwZW5hbWUgVCMjOQorCisvLyBJbiB0aGVvcnksIGRlZmluaW5nIHN0dWZmIGluIHRoZSA6OnN0ZCBuYW1lc3BhY2UgaXMgdW5kZWZpbmVkCisvLyBiZWhhdmlvci4gIFdlIGNhbiBkbyB0aGlzIGFzIHdlIGFyZSBwbGF5aW5nIHRoZSByb2xlIG9mIGEgc3RhbmRhcmQKKy8vIGxpYnJhcnkgdmVuZG9yLgorbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgdHIxIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQwID0gdm9pZCwgdHlwZW5hbWUgVDEgPSB2b2lkLCB0eXBlbmFtZSBUMiA9IHZvaWQsCisgICAgdHlwZW5hbWUgVDMgPSB2b2lkLCB0eXBlbmFtZSBUNCA9IHZvaWQsIHR5cGVuYW1lIFQ1ID0gdm9pZCwKKyAgICB0eXBlbmFtZSBUNiA9IHZvaWQsIHR5cGVuYW1lIFQ3ID0gdm9pZCwgdHlwZW5hbWUgVDggPSB2b2lkLAorICAgIHR5cGVuYW1lIFQ5ID0gdm9pZD4KK2NsYXNzIHR1cGxlOworCisvLyBBbnl0aGluZyBpbiBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgaXMgR29vZ2xlIFRlc3QncyBJTlRFUk5BTAorLy8gSU1QTEVNRU5UQVRJT04gREVUQUlMIGFuZCBNVVNUIE5PVCBCRSBVU0VEIERJUkVDVExZIGluIHVzZXIgY29kZS4KK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKKy8vIEJ5UmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgY29uc3QgVCYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCeVJlZiB7IHR5cGVkZWYgY29uc3QgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQnlSZWY8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBmb3IgQnlSZWYuCisjZGVmaW5lIEdURVNUX0JZX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkJ5UmVmPFQ+Ojp0eXBlCisKKy8vIEFkZFJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIFQmLiAgVGhpcworLy8gaXMgdGhlIHNhbWUgYXMgdHIxOjphZGRfcmVmZXJlbmNlPFQ+Ojp0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmIHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWY8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBmb3IgQWRkUmVmLgorI2RlZmluZSBHVEVTVF9BRERfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QWRkUmVmPFQ+Ojp0eXBlCisKKy8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgZ2V0PGs+KCkuCit0ZW1wbGF0ZSA8aW50IGs+IGNsYXNzIEdldDsKKworLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyB0dXBsZV9lbGVtZW50PGssIFQ+LiAga0luZGV4VmFsaWQgaXMgdHJ1ZQorLy8gaWZmIGsgPCB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0dXBsZSB0eXBlIFQuCit0ZW1wbGF0ZSA8Ym9vbCBrSW5kZXhWYWxpZCwgaW50IGtJbmRleCwgY2xhc3MgVHVwbGU+CitzdHJ1Y3QgVHVwbGVFbGVtZW50OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgMCwgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDAgdHlwZTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDEsIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQxIHR5cGU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAyLCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUMiB0eXBlOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgMywgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDMgdHlwZTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDQsIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQ0IHR5cGU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA1LCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUNSB0eXBlOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgNiwgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDYgdHlwZTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDcsIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQ3IHR5cGU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA4LCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUOCB0eXBlOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgOSwgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDkgdHlwZTsgfTsKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDw+CitjbGFzcyB0dXBsZTw+IHsKKyBwdWJsaWM6CisgIHR1cGxlKCkge30KKyAgdHVwbGUoY29uc3QgdHVwbGUmIC8qIHQgKi8pICB7fQorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiAvKiB0ICovKSB7IHJldHVybiAqdGhpczsgfQorfTsKKwordGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzFfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjApIDogZjBfKGYwKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzJfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSkgOiBmMF8oZjApLAorICAgICAgZjFfKGYxKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+CisgIHR1cGxlKGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIDogZjBfKHAuZmlyc3QpLCBmMV8ocC5zZWNvbmQpIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgeworICAgIGYwXyA9IHAuZmlyc3Q7CisgICAgZjFfID0gcC5zZWNvbmQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfM19UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyKSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMikge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfNF9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKKyAgICAgIGYzXyhmMykge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfNV9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLAorICAgICAgR1RFU1RfQllfUkVGXyhUNCkgZjQpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF82X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCisgICAgICBmNV8oZjUpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfN19UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCisgICAgICBmM18oZjMpLCBmNF8oZjQpLCBmNV8oZjUpLCBmNl8oZjYpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF84X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LAorICAgICAgR1RFU1RfQllfUkVGXyhUNykgZjcpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKKyAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNykge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgZjdfID0gdC5mN187CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworICBUNyBmN187Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfOV9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LAorICAgICAgR1RFU1RfQllfUkVGXyhUOCkgZjgpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKKyAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgZjdfID0gdC5mN187CisgICAgZjhfID0gdC5mOF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworICBUNyBmN187CisgIFQ4IGY4XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorY2xhc3MgdHVwbGUgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSwKKyAgICAgIGY5XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwgR1RFU1RfQllfUkVGXyhUNykgZjcsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ4KSBmOCwgR1RFU1RfQllfUkVGXyhUOSkgZjkpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKKyAgICAgIGYzXyhmMyksIGY0XyhmNCksIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCksIGY5XyhmOSkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSwgZjlfKHQuZjlfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4XyksCisgICAgICBmOV8odC5mOV8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIGY3XyA9IHQuZjdfOworICAgIGY4XyA9IHQuZjhfOworICAgIGY5XyA9IHQuZjlfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKKyAgVDcgZjdfOworICBUOCBmOF87CisgIFQ5IGY5XzsKK307CisKKy8vIDYuMS4zLjIgVHVwbGUgY3JlYXRpb24gZnVuY3Rpb25zLgorCisvLyBLbm93biBsaW1pdGF0aW9uczogd2UgZG9uJ3Qgc3VwcG9ydCBwYXNzaW5nIGFuCisvLyBzdGQ6OnRyMTo6cmVmZXJlbmNlX3dyYXBwZXI8VD4gdG8gbWFrZV90dXBsZSgpLiAgQW5kIHdlIGRvbid0CisvLyBpbXBsZW1lbnQgdGllKCkuCisKK2lubGluZSB0dXBsZTw+IG1ha2VfdHVwbGUoKSB7IHJldHVybiB0dXBsZTw+KCk7IH0KKwordGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8xX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCkgeworICByZXR1cm4gR1RFU1RfMV9UVVBMRV8oVCkoZjApOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzJfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEpIHsKKyAgcmV0dXJuIEdURVNUXzJfVFVQTEVfKFQpKGYwLCBmMSk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfM19UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyKSB7CisgIHJldHVybiBHVEVTVF8zX1RVUExFXyhUKShmMCwgZjEsIGYyKTsKK30KKwordGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF80X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzKSB7CisgIHJldHVybiBHVEVTVF80X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMyk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfNV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0KSB7CisgIHJldHVybiBHVEVTVF81X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzZfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1KSB7CisgIHJldHVybiBHVEVTVF82X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF83X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2KSB7CisgIHJldHVybiBHVEVTVF83X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNik7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfOF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3KSB7CisgIHJldHVybiBHVEVTVF84X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzlfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNywKKyAgICBjb25zdCBUOCYgZjgpIHsKKyAgcmV0dXJuIEdURVNUXzlfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8xMF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3LAorICAgIGNvbnN0IFQ4JiBmOCwgY29uc3QgVDkmIGY5KSB7CisgIHJldHVybiBHVEVTVF8xMF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3LCBmOCwgZjkpOworfQorCisvLyA2LjEuMy4zIFR1cGxlIGhlbHBlciBjbGFzc2VzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+IHN0cnVjdCB0dXBsZV9zaXplOworCit0ZW1wbGF0ZSA8R1RFU1RfMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMF9UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDA7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8xX1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzJfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAyOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfM19UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDM7IH07CisKK3RlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF80X1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNDsgfTsKKwordGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzVfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA1OyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNl9UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDY7IH07CisKK3RlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF83X1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNzsgfTsKKwordGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzhfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA4OyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfOV9UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDk7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAxMDsgfTsKKwordGVtcGxhdGUgPGludCBrLCBjbGFzcyBUdXBsZT4KK3N0cnVjdCB0dXBsZV9lbGVtZW50IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBndGVzdF9pbnRlcm5hbDo6VHVwbGVFbGVtZW50PAorICAgICAgayA8ICh0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpLCBrLCBUdXBsZT46OnR5cGUgdHlwZTsKK307CisKKyNkZWZpbmUgR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgVHVwbGUpIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8aywgVHVwbGUgPjo6dHlwZQorCisvLyA2LjEuMy40IEVsZW1lbnQgYWNjZXNzLgorCituYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDA+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDAsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjBfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDAsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMF87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8MT4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMSwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMV87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMSwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYxXzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwyPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygyLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYyXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygyLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjJfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDM+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDMsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjNfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDMsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mM187IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8ND4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNCwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNF87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNCwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY0XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw1PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg1LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY1XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg1LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjVfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDY+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDYsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjZfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDYsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNl87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8Nz4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNywgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mN187IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNywgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY3XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw4PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg4LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY4XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg4LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjhfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDk+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDksIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjlfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDksIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mOV87IH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAorCit0ZW1wbGF0ZSA8aW50IGssIEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBHVEVTVF8xMF9UVVBMRV8oVCkpKQorZ2V0KEdURVNUXzEwX1RVUExFXyhUKSYgdCkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6RmllbGQodCk7Cit9CisKK3RlbXBsYXRlIDxpbnQgaywgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK0dURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgIEdURVNUXzEwX1RVUExFXyhUKSkpCitnZXQoY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0KSB7CisgIHJldHVybiBndGVzdF9pbnRlcm5hbDo6R2V0PGs+OjpDb25zdEZpZWxkKHQpOworfQorCisvLyA2LjEuMy41IFJlbGF0aW9uYWwgb3BlcmF0b3JzCisKKy8vIFdlIG9ubHkgaW1wbGVtZW50ID09IGFuZCAhPSwgYXMgd2UgZG9uJ3QgaGF2ZSBhIG5lZWQgZm9yIHRoZSByZXN0IHlldC4KKworbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKworLy8gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8aywgaz46OkVxKHQxLCB0MikgcmV0dXJucyB0cnVlIGlmIHRoZQorLy8gZmlyc3QgayBmaWVsZHMgb2YgdDEgZXF1YWxzIHRoZSBmaXJzdCBrIGZpZWxkcyBvZiB0Mi4KKy8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yKGsxLCBrMikgd291bGQgYmUgYSBjb21waWxlciBlcnJvciBpZgorLy8gazEgIT0gazIuCit0ZW1wbGF0ZSA8aW50IGtTaXplMSwgaW50IGtTaXplMj4KK3N0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwwLCAwPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZTEsIGNsYXNzIFR1cGxlMj4KKyAgc3RhdGljIGJvb2wgRXEoY29uc3QgVHVwbGUxJiAvKiB0MSAqLywgY29uc3QgVHVwbGUyJiAvKiB0MiAqLykgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8aW50IGs+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8aywgaz4geworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+CisgIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgdDEsIGNvbnN0IFR1cGxlMiYgdDIpIHsKKyAgICByZXR1cm4gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8ayAtIDEsIGsgLSAxPjo6RXEodDEsIHQyKSAmJgorICAgICAgICA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQxKSA9PSA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQyKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVCkmIHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdSkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OlNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPAorICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVCk+Ojp2YWx1ZSwKKyAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFUpPjo6dmFsdWU+OjpFcSh0LCB1KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCksIEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7IHJldHVybiAhKHQgPT0gdSk7IH0KKworLy8gNi4xLjQgUGFpcnMuCisvLyBVbmltcGxlbWVudGVkLgorCit9ICAvLyBuYW1lc3BhY2UgdHIxCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKyN1bmRlZiBHVEVTVF8wX1RVUExFXworI3VuZGVmIEdURVNUXzFfVFVQTEVfCisjdW5kZWYgR1RFU1RfMl9UVVBMRV8KKyN1bmRlZiBHVEVTVF8zX1RVUExFXworI3VuZGVmIEdURVNUXzRfVFVQTEVfCisjdW5kZWYgR1RFU1RfNV9UVVBMRV8KKyN1bmRlZiBHVEVTVF82X1RVUExFXworI3VuZGVmIEdURVNUXzdfVFVQTEVfCisjdW5kZWYgR1RFU1RfOF9UVVBMRV8KKyN1bmRlZiBHVEVTVF85X1RVUExFXworI3VuZGVmIEdURVNUXzEwX1RVUExFXworCisjdW5kZWYgR1RFU1RfMF9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfMV9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfMl9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfM19UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfNF9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfNV9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfNl9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfN19UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfOF9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfOV9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfMTBfVFlQRU5BTUVTXworCisjdW5kZWYgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisjdW5kZWYgR1RFU1RfQllfUkVGXworI3VuZGVmIEdURVNUX0FERF9SRUZfCisjdW5kZWYgR1RFU1RfVFVQTEVfRUxFTUVOVF8KKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmggYi9zcmMvTExWTS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzZWVlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaApAQCAtMCwwICsxLDMzMjEgQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBndGVzdC10eXBlLXV0aWwuaC5wdW1wCisvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVHlwZSB1dGlsaXRpZXMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgdHlwZWQgYW5kIHR5cGUtcGFyYW1ldGVyaXplZAorLy8gdGVzdHMuICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBDdXJyZW50bHkgd2Ugc3VwcG9ydCBhdCBtb3N0IDUwIHR5cGVzIGluIGEgbGlzdCwgYW5kIGF0IG1vc3QgNTAKKy8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbiBvbmUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKy8vIFBsZWFzZSBjb250YWN0IGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZAorLy8gbW9yZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXworCisjaW5jbHVkZSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oPgorI2luY2x1ZGUgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oPgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyAjaWZkZWYgX19HTlVDX18gaXMgdG9vIGdlbmVyYWwgaGVyZS4gIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBnY2Mgd2l0aG91dCB1c2luZworLy8gbGlic3RkYysrICh3aGljaCBpcyB3aGVyZSBjeHhhYmkuaCBjb21lcyBmcm9tKS4KKyNpZmRlZiBfX0dMSUJDWFhfXworI2luY2x1ZGUgPGN4eGFiaS5oPgorI2VuZGlmICAvLyBfX0dMSUJDWFhfXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBc3NlcnR5VHlwZUVxPFQxLCBUMj46OnR5cGUgaXMgZGVmaW5lZCBpZmYgVDEgYW5kIFQyIGFyZSB0aGUgc2FtZQorLy8gdHlwZS4gIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHRvIGVuc3VyZSB0aGF0CisvLyB0d28gdHlwZXMgYXJlIGVxdWFsLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IEFzc2VydFR5cGVFcTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQXNzZXJ0VHlwZUVxPFQsIFQ+IHsKKyAgdHlwZWRlZiBib29sIHR5cGU7Cit9OworCisvLyBHZXRUeXBlTmFtZTxUPigpIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHR5cGUgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorU3RyaW5nIEdldFR5cGVOYW1lKCkgeworI2lmIEdURVNUX0hBU19SVFRJCisKKyAgY29uc3QgY2hhciogY29uc3QgbmFtZSA9IHR5cGVpZChUKS5uYW1lKCk7CisjaWZkZWYgX19HTElCQ1hYX18KKyAgaW50IHN0YXR1cyA9IDA7CisgIC8vIGdjYydzIGltcGxlbWVudGF0aW9uIG9mIHR5cGVpZChUKS5uYW1lKCkgbWFuZ2xlcyB0aGUgdHlwZSBuYW1lLAorICAvLyBzbyB3ZSBoYXZlIHRvIGRlbWFuZ2xlIGl0LgorICBjaGFyKiBjb25zdCByZWFkYWJsZV9uYW1lID0gYWJpOjpfX2N4YV9kZW1hbmdsZShuYW1lLCAwLCAwLCAmc3RhdHVzKTsKKyAgY29uc3QgU3RyaW5nIG5hbWVfc3RyKHN0YXR1cyA9PSAwID8gcmVhZGFibGVfbmFtZSA6IG5hbWUpOworICBmcmVlKHJlYWRhYmxlX25hbWUpOworICByZXR1cm4gbmFtZV9zdHI7CisjZWxzZQorICByZXR1cm4gbmFtZTsKKyNlbmRpZiAgLy8gX19HTElCQ1hYX18KKworI2Vsc2UKKyAgcmV0dXJuICI8dHlwZT4iOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQorfQorCisvLyBBIHVuaXF1ZSB0eXBlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhcmd1bWVudHMgb2YgY2xhc3MKKy8vIHRlbXBsYXRlIFR5cGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUgdmFyaWFkaWMgdGVtcGxhdGVzCisvLyAoZS5nLiBUeXBlczxpbnQ+LCBUeXBlPGludCwgZG91YmxlPiwgYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0CisvLyBzdXBwb3J0IGRpcmVjdGx5Lgorc3RydWN0IE5vbmUge307CisKKy8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHR5cGUgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLCBUeXBlc048VDEsIFQyLCAuLi4sIFROPgorLy8gcmVwcmVzZW50cyBhIHR5cGUgbGlzdCB3aXRoIE4gdHlwZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pIGluIGl0LgorLy8gRXhjZXB0IGZvciBUeXBlczAsIGV2ZXJ5IHN0cnVjdCBpbiB0aGUgZmFtaWx5IGhhcyB0d28gbWVtYmVyIHR5cGVzOgorLy8gSGVhZCBmb3IgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsIGZvciB0aGUgcmVzdCBvZiB0aGUKKy8vIGxpc3QuCisKKy8vIFRoZSBlbXB0eSB0eXBlIGxpc3QuCitzdHJ1Y3QgVHlwZXMwIHt9OworCisvLyBUeXBlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK3N0cnVjdCBUeXBlczEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMwIFRhaWw7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBUeXBlczIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxPFQyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitzdHJ1Y3QgVHlwZXMzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjxUMiwgVDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitzdHJ1Y3QgVHlwZXM0IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzxUMiwgVDMsIFQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3N0cnVjdCBUeXBlczUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0PFQyLCBUMywgVDQsIFQ1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK3N0cnVjdCBUeXBlczYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM1PFQyLCBUMywgVDQsIFQ1LCBUNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pgorc3RydWN0IFR5cGVzNyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK3N0cnVjdCBUeXBlczggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK3N0cnVjdCBUeXBlczkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK3N0cnVjdCBUeXBlczEwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitzdHJ1Y3QgVHlwZXMxMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczEwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitzdHJ1Y3QgVHlwZXMxMiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzPgorc3RydWN0IFR5cGVzMTMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitzdHJ1Y3QgVHlwZXMxNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczEzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitzdHJ1Y3QgVHlwZXMxNSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2Pgorc3RydWN0IFR5cGVzMTYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitzdHJ1Y3QgVHlwZXMxNyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+CitzdHJ1Y3QgVHlwZXMxOCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5Pgorc3RydWN0IFR5cGVzMTkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+CitzdHJ1Y3QgVHlwZXMyMCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK3N0cnVjdCBUeXBlczIxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KK3N0cnVjdCBUeXBlczIyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+CitzdHJ1Y3QgVHlwZXMyMyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK3N0cnVjdCBUeXBlczI0IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KK3N0cnVjdCBUeXBlczI1IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK3N0cnVjdCBUeXBlczI2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitzdHJ1Y3QgVHlwZXMyNyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KK3N0cnVjdCBUeXBlczI4IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK3N0cnVjdCBUeXBlczI5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgorc3RydWN0IFR5cGVzMzAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzE+CitzdHJ1Y3QgVHlwZXMzMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczMwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+CitzdHJ1Y3QgVHlwZXMzMiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgorc3RydWN0IFR5cGVzMzMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitzdHJ1Y3QgVHlwZXMzNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczMzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+CitzdHJ1Y3QgVHlwZXMzNSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitzdHJ1Y3QgVHlwZXMzNiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3Pgorc3RydWN0IFR5cGVzMzcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzg+CitzdHJ1Y3QgVHlwZXMzOCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitzdHJ1Y3QgVHlwZXMzOSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgorc3RydWN0IFR5cGVzNDAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MT4KK3N0cnVjdCBUeXBlczQxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorc3RydWN0IFR5cGVzNDIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0MTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0Mj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgorc3RydWN0IFR5cGVzNDMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0MjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0Mz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+CitzdHJ1Y3QgVHlwZXM0NCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+CitzdHJ1Y3QgVHlwZXM0NSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDY+CitzdHJ1Y3QgVHlwZXM0NiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NSwgVDQ2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pgorc3RydWN0IFR5cGVzNDcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitzdHJ1Y3QgVHlwZXM0OCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitzdHJ1Y3QgVHlwZXM0OSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPgorc3RydWN0IFR5cGVzNTAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0OTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBUYWlsOworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUeXBlc048Li4uPiBkaXJlY3RseSwKKy8vIGFzIHRoYXQgd291bGQgcmVxdWlyZSB0aGVtIHRvIGNvdW50IHRoZSBsZW5ndGguICBUeXBlczwuLi4+IGlzIG11Y2gKKy8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKKy8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQorLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFR5cGVzPGludD4KKy8vIHdpbGwgYXBwZWFyIGFzIFR5cGVzPGludCwgTm9uZSwgTm9uZSwgLi4uLCBOb25lPiBpbiB0aGUgY29tcGlsZXIKKy8vIGVycm9ycykuCisvLworLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKKy8vIHVzZXIgd291bGQgd3JpdGUgVHlwZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUKKy8vIHRoYXQgdG8gVHlwZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKKy8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCisvLyBUeXBlcyB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUOCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxMCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDE1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxNiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIwID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDIxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyMiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjQgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDI3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyOCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDMyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDMzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDM5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0MCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0MSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQ1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0NiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0NyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDUwID0gaW50ZXJuYWw6Ok5vbmU+CitzdHJ1Y3QgVHlwZXMgeworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBUeXBlczxpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMwIHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorc3RydWN0IFR5cGVzPFQxLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE8VDE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyPFQxLCBUMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzxUMSwgVDIsIFQzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDxUMSwgVDIsIFQzLCBUND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM1PFQxLCBUMiwgVDMsIFQ0LCBUNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0Mz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0ND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBUNDcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKKyAgICBUNDYsIFQ0NywgVDQ4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gdHlwZTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNkZWZpbmUgR1RFU1RfVEVNUExBVEVfIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcworCisvLyBUaGUgdGVtcGxhdGUgInNlbGVjdG9yIiBzdHJ1Y3QgVGVtcGxhdGVTZWw8VG1wbD4gaXMgdXNlZCB0bworLy8gcmVwcmVzZW50IFRtcGwsIHdoaWNoIG11c3QgYmUgYSBjbGFzcyB0ZW1wbGF0ZSB3aXRoIG9uZSB0eXBlCisvLyBwYXJhbWV0ZXIsIGFzIGEgdHlwZS4gIFRlbXBsYXRlU2VsPFRtcGw+OjpCaW5kPFQ+Ojp0eXBlIGlzIGRlZmluZWQKKy8vIGFzIHRoZSB0eXBlIFRtcGw8VD4uICBUaGlzIGFsbG93cyB1cyB0byBhY3R1YWxseSBpbnN0YW50aWF0ZSB0aGUKKy8vIHRlbXBsYXRlICJzZWxlY3RlZCIgYnkgVGVtcGxhdGVTZWw8VG1wbD4uCisvLworLy8gVGhpcyB0cmljayBpcyBuZWNlc3NhcnkgZm9yIHNpbXVsYXRpbmcgdHlwZWRlZiBmb3IgY2xhc3MgdGVtcGxhdGVzLAorLy8gd2hpY2ggQysrIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3RseS4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVG1wbD4KK3N0cnVjdCBUZW1wbGF0ZVNlbCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgQmluZCB7CisgICAgdHlwZWRlZiBUbXBsPFQ+IHR5cGU7CisgIH07Cit9OworCisjZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwKKyAgVG1wbFNlbDo6dGVtcGxhdGUgQmluZDxUPjo6dHlwZQorCisvLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisvLyBhcmd1bWVudHMgb2YgY2xhc3MgdGVtcGxhdGUgVGVtcGxhdGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUKKy8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwKKy8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTm9uZVQge307CisKKy8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwKKy8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQKKy8vIGZvciBUZW1wbGF0ZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsCisvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCisKKy8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lgorc3RydWN0IFRlbXBsYXRlczAge307CisKKy8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+CitzdHJ1Y3QgVGVtcGxhdGVzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMCBUYWlsOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMj4KK3N0cnVjdCBUZW1wbGF0ZXMyIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxPFQyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+CitzdHJ1Y3QgVGVtcGxhdGVzMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjxUMiwgVDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzxUMiwgVDMsIFQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzNSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+CitzdHJ1Y3QgVGVtcGxhdGVzNiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNz4KK3N0cnVjdCBUZW1wbGF0ZXM3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+CitzdHJ1Y3QgVGVtcGxhdGVzOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMD4KK3N0cnVjdCBUZW1wbGF0ZXMxMCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExPgorc3RydWN0IFRlbXBsYXRlczExIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTI+CitzdHJ1Y3QgVGVtcGxhdGVzMTIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTM+CitzdHJ1Y3QgVGVtcGxhdGVzMTMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4KK3N0cnVjdCBUZW1wbGF0ZXMxNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1Pgorc3RydWN0IFRlbXBsYXRlczE1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczE2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTc+CitzdHJ1Y3QgVGVtcGxhdGVzMTcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4Pgorc3RydWN0IFRlbXBsYXRlczE4IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzMTkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPgorc3RydWN0IFRlbXBsYXRlczIwIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxPgorc3RydWN0IFRlbXBsYXRlczIxIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXMyMiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4KK3N0cnVjdCBUZW1wbGF0ZXMyMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0Pgorc3RydWN0IFRlbXBsYXRlczI0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczI1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjY+CitzdHJ1Y3QgVGVtcGxhdGVzMjYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3Pgorc3RydWN0IFRlbXBsYXRlczI3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjg+CitzdHJ1Y3QgVGVtcGxhdGVzMjggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXMyOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzMzAgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMT4KK3N0cnVjdCBUZW1wbGF0ZXMzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+CitzdHJ1Y3QgVGVtcGxhdGVzMzIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzMzMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0Pgorc3RydWN0IFRlbXBsYXRlczM0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1Pgorc3RydWN0IFRlbXBsYXRlczM1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzMzYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzc+CitzdHJ1Y3QgVGVtcGxhdGVzMzcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOD4KK3N0cnVjdCBUZW1wbGF0ZXMzOCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzMzkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4KK3N0cnVjdCBUZW1wbGF0ZXM0MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+CitzdHJ1Y3QgVGVtcGxhdGVzNDEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDI+CitzdHJ1Y3QgVGVtcGxhdGVzNDIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0Mj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM0MyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNDQgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDU+CitzdHJ1Y3QgVGVtcGxhdGVzNDUgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczQ2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczQ3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDg+CitzdHJ1Y3QgVGVtcGxhdGVzNDggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzNDkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0OSwgR1RFU1RfVEVNUExBVEVfIFQ1MD4KK3N0cnVjdCBUZW1wbGF0ZXM1MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKK307CisKKworLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVGVtcGxhdGVzPC4uLj4gaXMgbXVjaAorLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQorLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCisvLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVGVtcGxhdGVzPGxpc3Q+CisvLyB3aWxsIGFwcGVhciBhcyBUZW1wbGF0ZXM8bGlzdCwgTm9uZVQsIE5vbmVULCAuLi4sIE5vbmVUPiBpbiB0aGUgY29tcGlsZXIKKy8vIGVycm9ycykuCisvLworLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKKy8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFRlbXBsYXRlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcworLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKKy8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ4ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDExID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNTAgPSBOb25lVD4KK3N0cnVjdCBUZW1wbGF0ZXMgeworICB0eXBlZGVmIFRlbXBsYXRlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBUZW1wbGF0ZXM8Tm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTxUMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyPFQxLCBUMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzPFQxLCBUMiwgVDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTg+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjE+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0Mz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Cit9OworCisvLyBUaGUgVHlwZUxpc3QgdGVtcGxhdGUgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGVpdGhlciBhIHNpbmdsZSB0eXBlCisvLyBvciBhIFR5cGVzPC4uLj4gbGlzdCBpbiBUWVBFRF9URVNUX0NBU0UoKSBhbmQKKy8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVMaXN0IHsgdHlwZWRlZiBUeXBlczE8VD4gdHlwZTsgfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPgorc3RydWN0IFR5cGVMaXN0PFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiA+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD46OnR5cGUgdHlwZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3VzZXJsb2MucGwgYi9zcmMvTExWTS91dGlscy91c2VybG9jLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTJmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy91c2VybG9jLnBsCkBAIC0wLDAgKzEsMjE2IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgUHJvZ3JhbTogIHVzZXJsb2MucGwKKyMKKyMgU3lub3BzaXM6IFRoaXMgcHJvZ3JhbSB1c2VzICJjdnMgYW5ub3RhdGUiIHRvIGdldCBhIHN1bW1hcnkgb2YgaG93IG1hbnkgbGluZXMKKyMgICAgICAgICAgIG9mIGNvZGUgdGhlIHZhcmlvdXMgZGV2ZWxvcHJlcyBhcmUgcmVzcG9uc2libGUgZm9yLiBJdCB0YWtlcyBvbmUKKyMgICAgICAgICAgIGFyZ3VtZW50LCB0aGUgZGlyZWN0b3J5IHRvIHByb2Nlc3MuIElmIHRoZSBhcmd1bWVudCBpcyBub3Qgc3BlY2lmaWVkCisjICAgICAgICAgICB0aGVuIHRoZSBjd2QgaXMgdXNlZC4gVGhlIGRpcmVjdG9yeSBtdXN0IGJlIGFuIExMVk0gdHJlZSBjaGVja2VkIG91dAorIyAgICAgICAgICAgZnJvbSBjdnMuIAorIworIyBTeW50YXg6ICAgdXNlcmxvYy5wbCBbLXRhZz10YWd8LWh0bWwuLi4gPGRpcmVjdG9yeT4uLi4KKyMKKyMgT3B0aW9uczoKKyMgICAgICAgICAgIC10YWc9dGFnCisjICAgICAgICAgICAgICAgVXNlICJ0YWciIHRvIHNlbGVjdCB0aGUgcmV2aXNpb24gKGFzIHBlciBjdnMgLXIgb3B0aW9uKQorIyAgICAgICAgICAgLWZpbGVkZXRhaWxzCisjICAgICAgICAgICAgICAgUmVwb3J0IGRldGFpbHMgYWJvdXQgbGluZXMgb2YgY29kZSBpbiBlYWNoIGZpbGUgZm9yIGVhY2ggdXNlcgorIyAgICAgICAgICAgLWh0bWwKKyMgICAgICAgICAgICAgICBHZW5lcmF0ZSBIVE1MIG91dHB1dCBpbnN0ZWFkIG9mIHRleHQgb3V0cHV0CisjICAgICAgICAgICAtdG9wZGlyCisjICAgICAgICAgICAgICAgU3BlY2lmeSB3aGVyZSB0aGUgdG9wIGxsdm0gc291cmNlIGRpcmVjdG9yeSBpcy4gT3RoZXJ3aXNlIHRoZQorIyAgICAgICAgICAgICAgIGxsdm0tY29uZmlnIHRvb2wgaXMgdXNlZCB0byBmaW5kIGl0LgorIyBEaXJlY3RvcmllczoKKyMgICBUaGUgZGlyZWN0b3JpZXMgcGFzc2VkIGFmdGVyIHRoZSBvcHRpb25zIHNob3VsZCBiZSByZWxhdGl2ZSBwYXRocyB0bworIyAgIGRpcmVjdG9yaWVzIG9mIGludGVyZXN0IGZyb20gdGhlIHRvcCBvZiB0aGUgbGx2bSBzb3VyY2UgdHJlZSwgZS5nLiAibGliIgorIyAgIG9yICJpbmNsdWRlIiwgZXRjLgorCitkaWUgIlVzYWdlIHVzZXJsb2MucGwgWy10YWc9dGFnfC1odG1sXSA8ZGlyZWN0b3JpZXM+Li4uIiAKKyAgaWYgKCQjQVJHViA8IDApOworCitteSAkdGFnID0gIiI7CitteSAkaHRtbCA9IDA7CitteSAkZGVidWcgPSAwOworbXkgJGZpbGVkZXRhaWxzID0gIiI7CitteSAkc3Jjcm9vdCA9ICIiOword2hpbGUgKCBkZWZpbmVkKCRBUkdWWzBdKSAmJiBzdWJzdHIoJEFSR1ZbMF0sMCwxKSBlcSAnLScgKQoreworICBpZiAoJEFSR1ZbMF0gPX4gLy10YWc9LiovKSB7CisgICAgJHRhZyA9ICRBUkdWWzBdOworICAgICR0YWcgPX4gcyMtdGFnPSguKikjJDEjOworICB9IGVsc2lmICgkQVJHVlswXSA9fiAvLWZpbGVkZXRhaWxzLykgeworICAgICRmaWxlZGV0YWlscyA9IDE7CisgIH0gZWxzaWYgKCRBUkdWWzBdIGVxICItaHRtbCIpIHsKKyAgICAkaHRtbCA9IDE7CisgIH0gZWxzaWYgKCRBUkdWWzBdIGVxICItZGVidWciKSB7CisgICAgJGRlYnVnID0gMTsKKyAgfSBlbHNpZiAoJEFSR1ZbMF0gZXEgIi10b3BkaXIiKSB7CisgICAgc2hpZnQ7ICRzcmNyb290ID0gJEFSR1ZbMF07IHNoaWZ0OworICB9IGVsc2UgeworICAgIGRpZSAiSW52YWxpZCBvcHRpb246ICRBUkdWWzBdIjsKKyAgfQorICBzaGlmdDsKK30KKworaWYgKGxlbmd0aCgkc3Jjcm9vdCkgPT0gMCkgeworICBjaG9tcCgkc3Jjcm9vdCA9IGBsbHZtLWNvbmZpZyAtLXNyYy1yb290YCk7Cit9CitpZiAoISAtZCAiJHNyY3Jvb3QiKSB7CisgIGRpZSAiSW52YWxpZCBzb3VyY2Ugcm9vdDogJHNyY3Jvb3RcbiI7Cit9CitjaGRpcigkc3Jjcm9vdCk7CitteSAkbGx2bWRvID0gIiRzcmNyb290L3V0aWxzL2xsdm1kbyAtdG9wZGlyICckc3Jjcm9vdCciOworbXkgJVN0YXRzOworbXkgJUZpbGVTdGF0czsKKworbXkgJGFubm90YXRlID0gImN2cyAtejYgYW5ub3RhdGUgLWxmICI7CitpZiAobGVuZ3RoKCR0YWcpID4gMCkKK3sKKyAgJGFubm90YXRlID0gJGFubm90YXRlIC4gIiAtciIgLiAkdGFnOworfQorCitzdWIgR2V0Q1ZTRmlsZXMKK3sKKyAgbXkgJGQgPSAkX1swXTsKKyAgbXkgJGZpbGVzID0iIjsKKyAgb3BlbiBGSUxFTElTVCwgCisgICAgIiRsbHZtZG8gLWRpcnMgXCIkZFwiIC1jb2RlLW9ubHkgZWNobyB8IiB8fCBkaWUgIkNhbid0IGdldCBsaXN0IG9mIGZpbGVzIHdpdGggbGx2bWRvIjsKKyAgd2hpbGUgKCBkZWZpbmVkKCRsaW5lID0gPEZJTEVMSVNUPikgKSB7CisgICAgY2hvbXAoJGZpbGUgPSAkbGluZSk7CisgICAgcHJpbnQgIkZpbGU6ICRmaWxlXG4iIGlmICgkZGVidWcpOworICAgICRmaWxlcyA9ICIkZmlsZXMgJGZpbGUiOworICB9CisgIHJldHVybiAkZmlsZXM7Cit9CisKK3N1YiBTY2FuRGlyCit7CisgIG15ICREaXIgPSAkX1swXTsKKyAgbXkgJGZpbGVzID0gR2V0Q1ZTRmlsZXMoJERpcik7CisKKyAgb3BlbiAoREFUQSwiJGFubm90YXRlICRmaWxlcyAyPiYxIHwiKQorICAgIHx8IGRpZSAiQ2FuJ3QgcmVhZCBjdnMgYW5ub3RhdGlvbiBkYXRhIjsKKworICBteSAkY3VyZmlsZSA9ICIiOworICB3aGlsZSAoIGRlZmluZWQoJGxpbmUgPSA8REFUQT4pICkKKyAgeworICAgIGNob21wKCRsaW5lKTsKKyAgICBpZiAoJGxpbmUgPX4gJ15Bbm5vdGF0aW9ucyBmb3IuKicpIHsKKyAgICAgICRjdXJmaWxlID0gJGxpbmU7CisgICAgICAkY3VyZmlsZSA9fiBzI15Bbm5vdGF0aW9ucyBmb3IgKFtbOnByaW50Ol1dKikjJDEjOworICAgICAgcHJpbnQgIlNjYW5uaW5nOiAkY3VyZmlsZVxuIiBpZiAoJGRlYnVnKTsKKyAgICB9IGVsc2lmICgkbGluZSA9fiAvXlswLTkuXSpbIFx0XSpcKFteKV0qXCk6LykgeworICAgICAgJHVuYW1lID0gJGxpbmU7CisgICAgICAkdW5hbWUgPX4gcyNeWzAtOS5dKlsgXHRdKlwoKFthLXpBLVowLTlfLi1dKikgW14pXSpcKTouKiMkMSM7CisgICAgICAkU3RhdHN7JHVuYW1lfSsrOworICAgICAgaWYgKCRmaWxlZGV0YWlscykgeworICAgICAgICAkRmlsZVN0YXRzeyR1bmFtZX0gPSB7fSB1bmxlc3MgZXhpc3RzICRGaWxlU3RhdHN7JHVuYW1lfTsKKyAgICAgICAgJHskRmlsZVN0YXRzeyR1bmFtZX19eyRjdXJmaWxlfSsrOworICAgICAgfQorICAgIH0KKyAgfQorICBjbG9zZSBEQVRBOworfQorCitzdWIgcHJpbnRTdGF0cworeworICBteSAkZGlyID0gJF9bMF07CisgIG15ICRoYXNoID0gJF9bMV07CisgIG15ICR1c2VyOworICBteSAkdG90YWwgPSAwOworCisgIGZvcmVhY2ggJHVzZXIgKGtleXMgJVN0YXRzKSB7ICR0b3RhbCArPSAkU3RhdHN7JHVzZXJ9OyB9CisKKyAgaWYgKCRodG1sKSB7IAorICAgIHByaW50ICI8cD5Ub3RhbCBTb3VyY2UgTGluZXM6ICR0b3RhbDxici8+PC9wPlxuIjsKKyAgICBwcmludCAiPHRhYmxlPiI7CisgICAgcHJpbnQgIiA8dHI+PHRoIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodFwiPkxPQzwvdGg+XG4iOworICAgIHByaW50ICIgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodFwiPlwlTE9DPC90aD5cbiI7CisgICAgcHJpbnQgIiA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnRcIj5Vc2VyPC90aD5cbiI7CisgICAgcHJpbnQgIjwvdHI+XG4iOworICB9CisKKyAgZm9yZWFjaCAkdXNlciAoIHNvcnQga2V5cyAlU3RhdHMgKQorICB7CisgICAgbXkgJHYgPSAkU3RhdHN7JHVzZXJ9OworICAgIGlmIChkZWZpbmVkKCR2KSkKKyAgICB7CisgICAgICBpZiAoJGh0bWwpIHsKKyAgICAgICAgcHJpbnRmICI8dHI+PHRkIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodFwiPiVkPC90ZD48dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0XCI+KCU0LjFmJSUpPC90ZD48dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnRcIj4iLCAkdiwgKDEwMC4wLyR0b3RhbCkqJHY7CisgICAgICAgIGlmICgkZmlsZWRldGFpbHMpIHsKKyAgICAgICAgICBwcmludCAiPGEgaHJlZj1cIiMkdXNlclwiPiR1c2VyPC9hPjwvdGQ+PC90cj4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ICR1c2VyLCI8L3RkPjwvdHI+IjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICIlOGQgICglNC4xZiUlKSAgJXNcbiIsICR2LCAoMTAwLjAvJHRvdGFsKSokdiwgJHVzZXI7CisgICAgICB9CisgICAgfQorICB9CisgIHByaW50ICI8L3RhYmxlPlxuIiBpZiAoJGh0bWwpOworCisgIGlmICgkZmlsZWRldGFpbHMpIHsKKyAgICBmb3JlYWNoICR1c2VyIChzb3J0IGtleXMgJUZpbGVTdGF0cykgeworICAgICAgbXkgJHRvdGFsID0gMDsKKyAgICAgIGZvcmVhY2ggJGZpbGUgKHNvcnQga2V5cyAleyRGaWxlU3RhdHN7JHVzZXJ9fSkgeyAKKyAgICAgICAgJHRvdGFsICs9ICR7JEZpbGVTdGF0c3skdXNlcn19eyRmaWxlfQorICAgICAgfQorICAgICAgaWYgKCRodG1sKSB7CisgICAgICAgIHByaW50ICI8dGFibGU+PHRyPjx0aCBzdHlsZT1cInRleHQtYWxpZ246bGVmdFwiIGNvbHNwYW49XCIzXCI+PGEgbmFtZT1cIiR1c2VyXCI+JHVzZXI8L2E+PC90aD48L3RyPlxuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ICR1c2VyLCI6XG4iOworICAgICAgfQorICAgICAgZm9yZWFjaCAkZmlsZSAoc29ydCBrZXlzICV7JEZpbGVTdGF0c3skdXNlcn19KSB7CisgICAgICAgIG15ICR2ID0gJHskRmlsZVN0YXRzeyR1c2VyfX17JGZpbGV9OworICAgICAgICBpZiAoJGh0bWwpIHsgCisgICAgICAgICAgcHJpbnRmICI8dHI+PHRkIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodFwiPiZuYnNwOyZuYnNwOyVkPC90ZD48dGQKKyAgICAgICAgICBzdHlsZT1cInRleHQtYWxpZ246cmlnaHRcIj4mbmJzcDslNC4xZiUlPC90ZD48dGQKKyAgICAgICAgICBzdHlsZT1cInRleHQtYWxpZ246bGVmdFwiPiVzPC90ZD48L3RyPiIsJHYsICgxMDAuMC8kdG90YWwpKiR2LCRmaWxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZiAiJThkICAoJTQuMWYlJSkgICVzXG4iLCAkdiwgKDEwMC4wLyR0b3RhbCkqJHYsICRmaWxlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoJGh0bWwpIHsgcHJpbnQgIjwvdGFibGU+XG4iOyB9CisgICAgfQorICB9Cit9CisKKworaWYgKCRodG1sKQoreworcHJpbnQgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGRcIj5cbiI7CitwcmludCAiPGh0bWw+XG48aGVhZD5cbiI7CitwcmludCAiICA8dGl0bGU+TExWTSBMT0MgQmFzZWQgT24gQ1ZTIEFubm90YXRpb248L3RpdGxlPlxuIjsKK3ByaW50ICIgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwibGx2bS5jc3NcIiB0eXBlPVwidGV4dC9jc3NcIi8+XG4iOworcHJpbnQgIjwvaGVhZD5cbiI7CitwcmludCAiPGJvZHk+PGRpdiBjbGFzcz1cImRvY190aXRsZVwiPkxMVk0gTE9DIEJhc2VkIE9uIENWUyBBbm5vdGF0aW9uPC9kaXY+XG4iOworcHJpbnQgIjxwPlRoaXMgZG9jdW1lbnQgc2hvd3MgdGhlIHRvdGFsIGxpbmVzIG9mIGNvZGUgcGVyIHVzZXIgaW4gZWFjaFxuIjsKK3ByaW50ICJMTFZNIGRpcmVjdG9yeS4gTGluZXMgb2YgY29kZSBhcmUgYXR0cmlidXRlZCBieSB0aGUgdXNlciB0aGF0IGxhc3RcbiI7CitwcmludCAiY29tbWl0dGVkIHRoZSBsaW5lLiBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgYXV0aG9yc2hpcC48L3A+XG4iOworfQorCitteSBARElSUzsKK2lmICgkI0FSR1YgPiAwKSB7CisgIEBESVJTID0gQEFSR1Y7Cit9IGVsc2UgeworICBwdXNoIEBESVJTLCAnaW5jbHVkZSc7CisgIHB1c2ggQERJUlMsICdsaWInOworICBwdXNoIEBESVJTLCAndG9vbHMnOworICBwdXNoIEBESVJTLCAncnVudGltZSc7CisgIHB1c2ggQERJUlMsICdkb2NzJzsKKyAgcHVzaCBARElSUywgJ3Rlc3QnOworICBwdXNoIEBESVJTLCAndXRpbHMnOworICBwdXNoIEBESVJTLCAnZXhhbXBsZXMnOworICBwdXNoIEBESVJTLCAncHJvamVjdHMvU3RhY2tlcic7CisgIHB1c2ggQERJUlMsICdwcm9qZWN0cy9zYW1wbGUnOworICBwdXNoIEBESVJTLCAnYXV0b2NvbmYnOworfQorICAKK2ZvciAkSW5kZXggKCAwIC4uICQjRElSUykgeyAKKyAgcHJpbnQgIlNjYW5uaW5nIERpcjogJERJUlNbJEluZGV4XVxuIiBpZiAoJGRlYnVnKTsKKyAgU2NhbkRpcigkRElSU1skSW5kZXhdKTsgCit9CisKK3ByaW50U3RhdHM7CisKK3ByaW50ICI8L2JvZHk+PC9odG1sPlxuIiBpZiAoJGh0bWwpIDsKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3ZhbGdyaW5kL3g4Nl82NC1wYy1saW51eC1nbnVfZ2NjLTQuMy4zLnN1cHAgYi9zcmMvTExWTS91dGlscy92YWxncmluZC94ODZfNjQtcGMtbGludXgtZ251X2djYy00LjMuMy5zdXBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmJlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy92YWxncmluZC94ODZfNjQtcGMtbGludXgtZ251X2djYy00LjMuMy5zdXBwCkBAIC0wLDAgKzEsMjMgQEAKK3sKKyAgIGxpYnN0ZGN4eF9vdmVybGFwcGVkX21lbWNweV9pbl9zdGFibGVfc29ydF8xCisgICBNZW1jaGVjazpPdmVybGFwCisgICBmdW46bWVtY3B5CisgICAuLi4KKyAgIGZ1bjpfWlN0MTFzdGFibGVfc29ydElOOV9fZ251X2N4eDE3X19ub3JtYWxfaXRlcmF0b3JJUFN0NHBhaXJJUEtONGxsdm01VmFsdWVFakVTdDZ2ZWN0b3JJUzdfU2FJUzdfRUVFRU4xMl9HTE9CQUxfX05fMTE2Q3N0U29ydFByZWRpY2F0ZUVFdlRfU0ZfVDBfCit9CisKK3sKKyAgIGxpYnN0ZGN4eF9vdmVybGFwcGVkX21lbWNweV9pbl9zdGFibGVfc29ydF8yCisgICBNZW1jaGVjazpPdmVybGFwCisgICBmdW46bWVtY3B5CisgICAuLi4KKyAgIGZ1bjpfWlN0MTFzdGFibGVfc29ydElOOV9fZ251X2N4eDE3X19ub3JtYWxfaXRlcmF0b3JJUFN0NHBhaXJJUEtONGxsdm01VmFsdWVFakVTdDZ2ZWN0b3JJUzdfU2FJUzdfRUVFRU4xMl9HTE9CQUxfX05fMTE2Q3N0U29ydFByZWRpY2F0ZUVFdlRfU0ZfVDBfCit9CisKK3sKKyAgIGxpYnN0ZGN4eF9vdmVybGFwcGVkX21lbWNweV9pbl9zdGFibGVfc29ydF8zCisgICBNZW1jaGVjazpPdmVybGFwCisgICBmdW46bWVtY3B5CisgICAuLi4KKyAgIGZ1bjpfWlN0MTFzdGFibGVfc29ydElOOV9fZ251X2N4eDE3X19ub3JtYWxfaXRlcmF0b3JJUFN0NHBhaXJJUEtONGxsdm00VHlwZUVqRVN0NnZlY3RvcklTN19TYUlTN19FRUVFUEZiUktTN19TRV9FRXZUX1NIX1QwXworfQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdmltL1JFQURNRSBiL3NyYy9MTFZNL3V0aWxzL3ZpbS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzMWFiZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3V0aWxzL3ZpbS9SRUFETUUKQEAgLTAsMCArMSw0MyBAQAorLSotIGxsdm0vdXRpbHMvdmltL1JFQURNRSAtKi0NCisNCitUaGVzZSBhcmUgc3ludGF4IGhpZ2hsaWdodGluZyBmaWxlcyBmb3IgdGhlIFZJTSBlZGl0b3IuIEluY2x1ZGVkIGFyZToNCisNCisqIGxsdm0udmltDQorDQorICBTeW50YXggaGlnaGxpZ2h0aW5nIG1vZGUgZm9yIExMVk0gYXNzZW1ibHkgZmlsZXMuIFRvIHVzZSwgY29weSBgbGx2bS52aW0nIHRvDQorICB+Ly52aW0vc3ludGF4IGFuZCBhZGQgdGhpcyBjb2RlIHRvIHlvdXIgfi8udmltcmMgOg0KKw0KKyAgYXVncm91cCBmaWxldHlwZQ0KKyAgICBhdSEgQnVmUmVhZCxCdWZOZXdGaWxlICoubGwgICAgIHNldCBmaWxldHlwZT1sbHZtDQorICBhdWdyb3VwIEVORA0KKw0KKyogdGFibGVnZW4udmltDQorDQorICBTeW50YXggaGlnaGxpZ2h0aW5nIG1vZGUgZm9yIFRhYmxlR2VuIGRlc2NyaXB0aW9uIGZpbGVzLiBUbyB1c2UsIGNvcHkNCisgIGB0YWJsZWdlbi52aW0nIHRvIH4vLnZpbS9zeW50YXggYW5kIGFkZCB0aGlzIGNvZGUgdG8geW91ciB+Ly52aW1yYyA6DQorDQorICBhdWdyb3VwIGZpbGV0eXBlDQorICAgIGF1ISBCdWZSZWFkLEJ1Zk5ld0ZpbGUgKi50ZCAgICAgc2V0IGZpbGV0eXBlPXRhYmxlZ2VuDQorICBhdWdyb3VwIEVORA0KKw0KKw0KK0lmIHlvdSBwcmVmZXIsIGluc3RlYWQgb2YgbWFraW5nIGNvcGllcyB5b3UgY2FuIG1ha2Ugc3ltbGlua3MgZnJvbQ0KK34vLnZpbS9zeW50YXgvLi4uIHRvIHRoZSBzeW50YXggZmlsZXMgaW4geW91ciBMTFZNIHNvdXJjZSB0cmVlLiBBcHBhcmVudGx5DQordGhpcyBkaWQgbm90IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiB2aW0gaG93ZXZlciwgc28gaWYgdGhpcyBkb2Vzbid0DQord29yayB5b3UgbWF5IG5lZWQgdG8gbWFrZSBhY3R1YWwgY29waWVzIG9mIHRoZSBmaWxlcy4NCisNCitBbm90aGVyIG9wdGlvbiwgaWYgeW91IGRvIG5vdCBhbHJlYWR5IGhhdmUgYSB+Ly52aW0vc3ludGF4IGRpcmVjdG9yeSwgaXMNCit0byBzeW1saW5rIH4vLnZpbS9zeW50YXggaXRzZWxmIHRvIGxsdm0vdXRpbHMvdmltIC4NCisNCitOb3RlOiBJZiB5b3Ugbm90aWNlIG1pc3Npbmcgb3IgaW5jb3JyZWN0IHN5bnRheCBoaWdobGlnaHRpbmcsIHBsZWFzZSBjb250YWN0DQorPGxsdm1idWdzIFthdF0gY3MudWl1Yy5lZHU+OyBpZiB5b3Ugd2lzaCB0byBwcm92aWRlIGEgcGF0Y2ggdG8gaW1wcm92ZSB0aGUNCitmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIGJlIG1vc3QgYXBwcmVjaWF0ZWQuIFRoYW5rIHlvdS4NCisNCitJZiB5b3UgZmluZCB5b3Vyc2VsZiB3b3JraW5nIHdpdGggTExWTSBNYWtlZmlsZXMgb2Z0ZW4sIGJ1dCB5b3UgZG9uJ3QgZ2V0IHN5bnRheA0KK2hpZ2hsaWdodGluZyAoYmVjYXVzZSB0aGUgZmlsZXMgaGF2ZSBuYW1lcyBzdWNoIGFzIE1ha2VmaWxlLnJ1bGVzIG9yDQorVEVTVC5uaWdodGx5Lk1ha2VmaWxlKSwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciB+Ly52aW1yYzoNCisNCisgICIgTExWTSBNYWtlZmlsZSBoaWdobGlnaHRpbmcgbW9kZQ0KKyAgYXVncm91cCBmaWxldHlwZQ0KKyAgICBhdSEgQnVmUmVhZCxCdWZOZXdGaWxlICpNYWtlZmlsZSogICAgIHNldCBmaWxldHlwZT1tYWtlDQorICBhdWdyb3VwIEVORA0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3V0aWxzL3ZpbS9sbHZtLnZpbSBiL3NyYy9MTFZNL3V0aWxzL3ZpbS9sbHZtLnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjQxOWVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdmltL2xsdm0udmltCkBAIC0wLDAgKzEsMTExIEBACisiIFZpbSBzeW50YXggZmlsZQ0KKyIgTGFuZ3VhZ2U6ICAgbGx2bQ0KKyIgTWFpbnRhaW5lcjogVGhlIExMVk0gdGVhbSwgaHR0cDovL2xsdm0ub3JnLw0KKyIgVmVyc2lvbjogICAgICAkUmV2aXNpb246IDEwOTc3MiAkDQorDQoraWYgdmVyc2lvbiA8IDYwMA0KKyAgc3ludGF4IGNsZWFyDQorZWxzZWlmIGV4aXN0cygiYjpjdXJyZW50X3N5bnRheCIpDQorICBmaW5pc2gNCitlbmRpZg0KKw0KK3N5biBjYXNlIG1hdGNoDQorDQorIiBUeXBlcy4NCisiIFR5cGVzIGFsc28gaW5jbHVkZSBzdHJ1Y3QsIGFycmF5LCB2ZWN0b3IsIGV0Yy4gYnV0IHRoZXNlIGRvbid0DQorIiBiZW5lZml0IGFzIG11Y2ggZnJvbSBoYXZpbmcgZGVkaWNhdGVkIGhpZ2hsaWdodGluZyBydWxlcy4NCitzeW4ga2V5d29yZCBsbHZtVHlwZSB2b2lkIGZsb2F0IGRvdWJsZQ0KK3N5biBrZXl3b3JkIGxsdm1UeXBlIHg4Nl9mcDgwIGZwMTI4IHBwY19mcDEyOA0KK3N5biBrZXl3b3JkIGxsdm1UeXBlIHR5cGUgbGFiZWwgb3BhcXVlDQorc3luIG1hdGNoICAgbGx2bVR5cGUgL1w8aVxkXCtcPi8NCisNCisiIEluc3RydWN0aW9ucy4NCisiIFRoZSB0cnVlIGFuZCBmYWxzZSB0b2tlbnMgY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24gb3Bjb2RlcywgYnV0IGl0J3MNCisiIG11Y2ggbW9yZSBjb21tb24gZm9yIHRoZXNlIHRva2VucyB0byBiZSB1c2VkIGZvciBib29sZWFuIGNvbnN0YW50cy4NCitzeW4ga2V5d29yZCBsbHZtU3RhdGVtZW50IGFkZCBmYWRkIHN1YiBmc3ViIG11bCBmbXVsDQorc3luIGtleXdvcmQgbGx2bVN0YXRlbWVudCBzZGl2IHVkaXYgZmRpdiBzcmVtIHVyZW0gZnJlbQ0KK3N5biBrZXl3b3JkIGxsdm1TdGF0ZW1lbnQgYW5kIG9yIHhvcg0KK3N5biBrZXl3b3JkIGxsdm1TdGF0ZW1lbnQgaWNtcCBmY21wDQorc3luIGtleXdvcmQgbGx2bVN0YXRlbWVudCBlcSBuZSB1Z3QgdWdlIHVsdCB1bGUgc2d0IHNnZSBzbHQgc2xlDQorc3luIGtleXdvcmQgbGx2bVN0YXRlbWVudCBvZXEgb2d0IG9nZSBvbHQgb2xlIG9uZSBvcmQgdWVxIHVndCB1Z2UNCitzeW4ga2V5d29yZCBsbHZtU3RhdGVtZW50IHVsdCB1bGUgdW5lIHVubw0KK3N5biBrZXl3b3JkIGxsdm1TdGF0ZW1lbnQgbnV3IG5zdyBleGFjdCBpbmJvdW5kcw0KK3N5biBrZXl3b3JkIGxsdm1TdGF0ZW1lbnQgcGhpIGNhbGwgc2VsZWN0IHNobCBsc2hyIGFzaHIgdmFfYXJnDQorc3luIGtleXdvcmQgbGx2bVN0YXRlbWVudCB0cnVuYyB6ZXh0IHNleHQNCitzeW4ga2V5d29yZCBsbHZtU3RhdGVtZW50IGZwdHJ1bmMgZnBleHQgZnB0b3VpIGZwdG9zaSB1aXRvZnAgc2l0b2ZwDQorc3luIGtleXdvcmQgbGx2bVN0YXRlbWVudCBwdHJ0b2ludCBpbnR0b3B0ciBiaXRjYXN0DQorc3luIGtleXdvcmQgbGx2bVN0YXRlbWVudCByZXQgYnIgaW5kaXJlY3RiciBzd2l0Y2ggaW52b2tlIHVud2luZCB1bnJlYWNoYWJsZQ0KK3N5biBrZXl3b3JkIGxsdm1TdGF0ZW1lbnQgbWFsbG9jIGFsbG9jYSBmcmVlIGxvYWQgc3RvcmUgZ2V0ZWxlbWVudHB0cg0KK3N5biBrZXl3b3JkIGxsdm1TdGF0ZW1lbnQgZXh0cmFjdGVsZW1lbnQgaW5zZXJ0ZWxlbWVudCBzaHVmZmxldmVjdG9yDQorc3luIGtleXdvcmQgbGx2bVN0YXRlbWVudCBleHRyYWN0dmFsdWUgaW5zZXJ0dmFsdWUNCisNCisiIEtleXdvcmRzLg0KK3N5biBrZXl3b3JkIGxsdm1LZXl3b3JkIGRlZmluZSBkZWNsYXJlIGdsb2JhbCBjb25zdGFudA0KK3N5biBrZXl3b3JkIGxsdm1LZXl3b3JkIGludGVybmFsIGV4dGVybmFsIHByaXZhdGUNCitzeW4ga2V5d29yZCBsbHZtS2V5d29yZCBsaW5rb25jZSBsaW5rb25jZV9vZHIgd2VhayB3ZWFrX29kciBhcHBlbmRpbmcNCitzeW4ga2V5d29yZCBsbHZtS2V5d29yZCBjb21tb24gZXh0ZXJuX3dlYWsNCitzeW4ga2V5d29yZCBsbHZtS2V5d29yZCB0aHJlYWRfbG9jYWwgZGxsaW1wb3J0IGRsbGV4cG9ydA0KK3N5biBrZXl3b3JkIGxsdm1LZXl3b3JkIGhpZGRlbiBwcm90ZWN0ZWQgZGVmYXVsdA0KK3N5biBrZXl3b3JkIGxsdm1LZXl3b3JkIGV4Y2VwdCBkZXBsaWJzDQorc3luIGtleXdvcmQgbGx2bUtleXdvcmQgdm9sYXRpbGUgZmFzdGNjIGNvbGRjYyBjYyBjY2MNCitzeW4ga2V5d29yZCBsbHZtS2V5d29yZCB4ODZfc3RkY2FsbGNjIHg4Nl9mYXN0Y2FsbGNjDQorc3luIGtleXdvcmQgbGx2bUtleXdvcmQgc2lnbmV4dCB6ZXJvZXh0IGlucmVnIHNyZXQgbm91bndpbmQgbm9yZXR1cm4NCitzeW4ga2V5d29yZCBsbHZtS2V5d29yZCBub2NhcHR1cmUgYnl2YWwgbmVzdCByZWFkbm9uZSByZWFkb25seSBub2FsaWFzDQorc3luIGtleXdvcmQgbGx2bUtleXdvcmQgaW5saW5laGludCBub2lubGluZSBhbHdheXNpbmxpbmUgb3B0c2l6ZSBzc3Agc3NwcmVxDQorc3luIGtleXdvcmQgbGx2bUtleXdvcmQgbm9yZWR6b25lIG5vaW1wbGljaXRmbG9hdCBuYWtlZCBhbGlnbnN0YWNrDQorc3luIGtleXdvcmQgbGx2bUtleXdvcmQgbW9kdWxlIGFzbSBhbGlnbiB0YWlsIHRvDQorc3luIGtleXdvcmQgbGx2bUtleXdvcmQgYWRkcnNwYWNlIHNlY3Rpb24gYWxpYXMgc2lkZWVmZmVjdCBjIGdjDQorc3luIGtleXdvcmQgbGx2bUtleXdvcmQgdGFyZ2V0IGRhdGFsYXlvdXQgdHJpcGxlDQorc3luIGtleXdvcmQgbGx2bUtleXdvcmQgYmxvY2thZGRyZXNzDQorc3luIGtleXdvcmQgbGx2bUtleXdvcmQgdW5pb24NCisNCisiIE9ic29sZXRlIGtleXdvcmRzLg0KK3N5biBrZXl3b3JkIGxsdm1FcnJvciAgdW5pbml0aWFsaXplZCBpbXBsZW1lbnRhdGlvbg0KK3N5biBrZXl3b3JkIGxsdm1FcnJvciAgZ2V0cmVzdWx0IGJpZyBsaXR0bGUgZW5kaWFuIGJlZ2luIGVuZA0KKw0KKyIgTWlzYyBzeW50YXguDQorc3luIG1hdGNoICAgbGx2bU5vTmFtZSAvWyVAXVxkXCtcPi8NCitzeW4gbWF0Y2ggICBsbHZtTnVtYmVyIC8tXD9cPFxkXCtcPi8NCitzeW4gbWF0Y2ggICBsbHZtRmxvYXQgIC8tXD9cPFxkXCtcLlxkKlwoZVsrLV1cZFwrXClcP1w+Lw0KK3N5biBtYXRjaCAgIGxsdm1GbG9hdCAgL1w8MHhceFwrXD4vDQorc3luIGtleXdvcmQgbGx2bUJvb2xlYW4gdHJ1ZSBmYWxzZQ0KK3N5biBrZXl3b3JkIGxsdm1Db25zdGFudCB6ZXJvaW5pdGlhbGl6ZXIgdW5kZWYgbnVsbA0KK3N5biBtYXRjaCAgIGxsdm1Db21tZW50IC87LiokLw0KK3N5biByZWdpb24gIGxsdm1TdHJpbmcgc3RhcnQ9LyIvIHNraXA9L1xcIi8gZW5kPS8iLw0KK3N5biBtYXRjaCAgIGxsdm1MYWJlbCAvWy1hLXpBLVokLl9dWy1hLXpBLVokLl8wLTldKjovDQorc3luIG1hdGNoICAgbGx2bUlkZW50aWZpZXIgL1slQF1bLWEtekEtWiQuX11bLWEtekEtWiQuXzAtOV0qLw0KKw0KKyIgU3ludGF4LWhpZ2hsaWdodCBkZWphZ251IHRlc3QgY29tbWFuZHMuDQorc3luIG1hdGNoICBsbHZtU3BlY2lhbENvbW1lbnQgLztccypSVU46LiokLw0KK3N5biBtYXRjaCAgbGx2bVNwZWNpYWxDb21tZW50IC87XHMqUFJcZCpccyokLw0KK3N5biBtYXRjaCAgbGx2bVNwZWNpYWxDb21tZW50IC87XHMqRU5EXC5ccyokLw0KK3N5biBtYXRjaCAgbGx2bVNwZWNpYWxDb21tZW50IC87XHMqWEZBSUw6LiokLw0KK3N5biBtYXRjaCAgbGx2bVNwZWNpYWxDb21tZW50IC87XHMqWFRBUkdFVDouKiQvDQorDQoraWYgdmVyc2lvbiA+PSA1MDggfHwgIWV4aXN0cygiZGlkX2Nfc3luX2luaXRzIikNCisgIGlmIHZlcnNpb24gPCA1MDgNCisgICAgbGV0IGRpZF9jX3N5bl9pbml0cyA9IDENCisgICAgY29tbWFuZCAtbmFyZ3M9KyBIaUxpbmsgaGkgbGluayA8YXJncz4NCisgIGVsc2UNCisgICAgY29tbWFuZCAtbmFyZ3M9KyBIaUxpbmsgaGkgZGVmIGxpbmsgPGFyZ3M+DQorICBlbmRpZg0KKw0KKyAgSGlMaW5rIGxsdm1UeXBlIFR5cGUNCisgIEhpTGluayBsbHZtU3RhdGVtZW50IFN0YXRlbWVudA0KKyAgSGlMaW5rIGxsdm1OdW1iZXIgTnVtYmVyDQorICBIaUxpbmsgbGx2bUNvbW1lbnQgQ29tbWVudA0KKyAgSGlMaW5rIGxsdm1TdHJpbmcgU3RyaW5nDQorICBIaUxpbmsgbGx2bUxhYmVsIExhYmVsDQorICBIaUxpbmsgbGx2bUtleXdvcmQgS2V5d29yZA0KKyAgSGlMaW5rIGxsdm1Cb29sZWFuIEJvb2xlYW4NCisgIEhpTGluayBsbHZtRmxvYXQgRmxvYXQNCisgIEhpTGluayBsbHZtTm9OYW1lIElkZW50aWZpZXINCisgIEhpTGluayBsbHZtQ29uc3RhbnQgQ29uc3RhbnQNCisgIEhpTGluayBsbHZtU3BlY2lhbENvbW1lbnQgU3BlY2lhbENvbW1lbnQNCisgIEhpTGluayBsbHZtRXJyb3IgRXJyb3INCisgIEhpTGluayBsbHZtSWRlbnRpZmllciBJZGVudGlmaWVyDQorDQorICBkZWxjb21tYW5kIEhpTGluaw0KK2VuZGlmDQorDQorbGV0IGI6Y3VycmVudF9zeW50YXggPSAibGx2bSINCmRpZmYgLS1naXQgYS9zcmMvTExWTS91dGlscy92aW0vdGFibGVnZW4udmltIGIvc3JjL0xMVk0vdXRpbHMvdmltL3RhYmxlZ2VuLnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQ0ZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vdXRpbHMvdmltL3RhYmxlZ2VuLnZpbQpAQCAtMCwwICsxLDU0IEBACisiIFZpbSBzeW50YXggZmlsZQ0KKyIgTGFuZ3VhZ2U6ICAgVGFibGVHZW4NCisiIE1haW50YWluZXI6IFRoZSBMTFZNIHRlYW0sIGh0dHA6Ly9sbHZtLm9yZy8NCisiIFZlcnNpb246ICAgICRSZXZpc2lvbjogOTcyNzEgJA0KKw0KK2lmIHZlcnNpb24gPCA2MDANCisgIHN5bnRheCBjbGVhcg0KK2Vsc2VpZiBleGlzdHMoImI6Y3VycmVudF9zeW50YXgiKQ0KKyAgZmluaXNoDQorZW5kaWYNCisNCisiIE1heSBiZSBjaGFuZ2VkIGlmIHlvdSBoYXZlIGEgcmVhbGx5IHNsb3cgbWFjaGluZQ0KK3N5bnRheCBzeW5jIG1pbmxpbmVzPTEwMA0KKw0KK3N5biBjYXNlIG1hdGNoDQorDQorc3luIGtleXdvcmQgdGdLZXl3b3JkICAgZGVmIGxldCBpbiBjb2RlIGRhZyBmaWVsZCBpbmNsdWRlIGRlZm0NCitzeW4ga2V5d29yZCB0Z1R5cGUgICAgICBjbGFzcyBpbnQgc3RyaW5nIGxpc3QgYml0IGJpdHMgbXVsdGljbGFzcw0KKw0KK3N5biBtYXRjaCAgIHRnTnVtYmVyICAgIC9cPFxkXCtcPi8NCitzeW4gbWF0Y2ggICB0Z051bWJlciAgICAvXDxcZFwrXC5cZCpcPi8NCitzeW4gbWF0Y2ggICB0Z051bWJlciAgICAvXDwwYlswMV1cK1w+Lw0KK3N5biBtYXRjaCAgIHRnTnVtYmVyICAgIC9cPDB4WzAtOWEtZkEtRl1cK1w+Lw0KK3N5biByZWdpb24gIHRnU3RyaW5nICAgIHN0YXJ0PS8iLyBza2lwPS9cXCIvIGVuZD0vIi8gICAgb25lbGluZQ0KKw0KK3N5biByZWdpb24gIHRnQ29kZSAgICAgIHN0YXJ0PS9cW3svIGVuZD0vfVxdLw0KKw0KK3N5biBrZXl3b3JkIHRnVG9kbyAgICAgICAgICAgICBjb250YWluZWQgVE9ETyBGSVhNRQ0KK3N5biBtYXRjaCAgIHRnQ29tbWVudCAgIC9cL1wvLiokLyAgICAgICAgIGNvbnRhaW5zPXRnVG9kbw0KKyIgSGFuZGxlIGNvcnJlY3RseSBpbWJyaWNhdGVkIGNvbW1lbnQNCitzeW4gcmVnaW9uICB0Z0NvbW1lbnQyIG1hdGNoZ3JvdXA9dGdDb21tZW50MiAgc3RhcnQ9Ky9cKisgZW5kPStcKi8rIGNvbnRhaW5zPXRnVG9kbyx0Z0NvbW1lbnQyDQorDQoraWYgdmVyc2lvbiA+PSA1MDggfHwgIWV4aXN0cygiZGlkX2Nfc3luX2luaXRzIikNCisgIGlmIHZlcnNpb24gPCA1MDgNCisgICAgbGV0IGRpZF9jX3N5bl9pbml0cyA9IDENCisgICAgY29tbWFuZCAtbmFyZ3M9KyBIaUxpbmsgaGkgbGluayA8YXJncz4NCisgIGVsc2UNCisgICAgY29tbWFuZCAtbmFyZ3M9KyBIaUxpbmsgaGkgZGVmIGxpbmsgPGFyZ3M+DQorICBlbmRpZg0KKw0KKyAgSGlMaW5rIHRnS2V5d29yZCBTdGF0ZW1lbnQNCisgIEhpTGluayB0Z1R5cGUgVHlwZQ0KKyAgSGlMaW5rIHRnTnVtYmVyIE51bWJlcg0KKyAgSGlMaW5rIHRnQ29tbWVudCBDb21tZW50DQorICBIaUxpbmsgdGdDb21tZW50MiBDb21tZW50DQorICBIaUxpbmsgdGdTdHJpbmcgU3RyaW5nDQorICAiIE1heSBmaW5kIGEgYmV0dGVyIEhpbGlnaHQgZ3JvdXAuLi4NCisgIEhpTGluayB0Z0NvZGUgU3BlY2lhbA0KKyAgSGlMaW5rIHRnVG9kbyBUb2RvDQorDQorICBkZWxjb21tYW5kIEhpTGluaw0KK2VuZGlmDQorDQorbGV0IGI6Y3VycmVudF9zeW50YXggPSAidGFibGVnZW4iDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvdmltL3ZpbXJjIGIvc3JjL0xMVk0vdXRpbHMvdmltL3ZpbXJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OGEwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy92aW0vdmltcmMKQEAgLTAsMCArMSw5MyBAQAorIiBMTFZNIGNvZGluZyBndWlkZWxpbmVzIGNvbmZvcm1hbmNlIGZvciBWSU0NCisiICRSZXZpc2lvbjogOTcyNzMgJA0KKyINCisiIE1haW50YWluZXI6IFRoZSBMTFZNIFRlYW0sIGh0dHA6Ly9sbHZtLm9yZw0KKyIgV0FSTklORzogICAgUmVhZCBiZWZvcmUgeW91IHNvdXJjZSBpbiBhbGwgdGhlc2UgY29tbWFuZHMgYW5kIG1hY3JvcyEgIFNvbWUNCisiICAgICAgICAgICAgIG9mIHRoZW0gbWF5IGNoYW5nZSBWSU0gYmVoYXZpb3IgdGhhdCB5b3UgZGVwZW5kIG9uLg0KKyINCisiIFlvdSBjYW4gcnVuIFZJTSB3aXRoIHRoZXNlIHNldHRpbmdzIHdpdGhvdXQgY2hhbmdpbmcgeW91ciBjdXJyZW50IHNldHVwIHdpdGg6DQorIiAkIHZpbSAtdSAvcGF0aC90by9sbHZtL3V0aWxzL3ZpbS92aW1yYw0KKw0KKyIgSXQncyBWSU0sIG5vdCBWSQ0KK3NldCBub2NvbXBhdGlibGUNCisNCisiIEEgdGFiIHByb2R1Y2VzIGEgMi1zcGFjZSBpbmRlbnRhdGlvbg0KK3NldCBzb2Z0dGFic3RvcD0yDQorc2V0IHNoaWZ0d2lkdGg9Mg0KK3NldCBleHBhbmR0YWINCisNCisiIEhpZ2hsaWdodCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFuZCBsaW5lcyBsb25nZXIgdGhhbiA4MCBjb2x1bW5zLg0KK2hpZ2hsaWdodCBMb25nTGluZSBjdGVybWJnPURhcmtZZWxsb3cgZ3VpYmc9RGFya1llbGxvdw0KK2hpZ2hsaWdodCBXaGl0ZXNwYWNlRU9MIGN0ZXJtYmc9RGFya1llbGxvdyBndWliZz1EYXJrWWVsbG93DQoraWYgdjp2ZXJzaW9uID49IDcwMg0KKyAgIiBMaW5lcyBsb25nZXIgdGhhbiA4MCBjb2x1bW5zLg0KKyAgYXUgQnVmV2luRW50ZXIgKiBsZXQgdzptMD1tYXRjaGFkZCgnTG9uZ0xpbmUnLCAnXCU+ODB2LlwrJywgLTEpDQorDQorICAiIFdoaXRlc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUuIFRoaXMgbGl0dGxlIGRhbmNlIHN1cHByZXNzZXMNCisgICIgd2hpdGVzcGFjZSB0aGF0IGhhcyBqdXN0IGJlZW4gdHlwZWQuDQorICBhdSBCdWZXaW5FbnRlciAqIGxldCB3Om0xPW1hdGNoYWRkKCdXaGl0ZXNwYWNlRU9MJywgJ1xzXCskJywgLTEpDQorICBhdSBJbnNlcnRFbnRlciAqIGNhbGwgbWF0Y2hkZWxldGUodzptMSkNCisgIGF1IEluc2VydEVudGVyICogbGV0IHc6bTI9bWF0Y2hhZGQoJ1doaXRlc3BhY2VFT0wnLCAnXHNcK1wlI1xAPCEkJywgLTEpDQorICBhdSBJbnNlcnRMZWF2ZSAqIGNhbGwgbWF0Y2hkZWxldGUodzptMikNCisgIGF1IEluc2VydExlYXZlICogbGV0IHc6bTE9bWF0Y2hhZGQoJ1doaXRlc3BhY2VFT0wnLCAnXHNcKyQnLCAtMSkNCitlbHNlDQorICBhdSBCdWZSZWFkLEJ1Zk5ld0ZpbGUgKiBzeW50YXggbWF0Y2ggTG9uZ0xpbmUgL1wlPjgwdi5cKy8NCisgIGF1IEluc2VydEVudGVyICogc3ludGF4IG1hdGNoIFdoaXRlc3BhY2VFT0wgL1xzXCtcJSNcQDwhJC8NCisgIGF1IEluc2VydExlYXZlICogc3ludGF4IG1hdGNoIFdoaXRlc3BhY2VFT0wgL1xzXCskLw0KK2VuZGlmDQorDQorIiBFbmFibGUgZmlsZXR5cGUgZGV0ZWN0aW9uDQorZmlsZXR5cGUgb24NCisNCisiIE9wdGlvbmFsDQorIiBDL0MrKyBwcm9ncmFtbWluZyBoZWxwZXJzDQorYXVncm91cCBjc3JjDQorICBhdSENCisgIGF1dG9jbWQgRmlsZVR5cGUgKiAgICAgIHNldCBub2NpbmRlbnQgc21hcnRpbmRlbnQNCisgIGF1dG9jbWQgRmlsZVR5cGUgYyxjcHAgIHNldCBjaW5kZW50DQorYXVncm91cCBFTkQNCisiIFNldCBhIGZldyBpbmRlbnRhdGlvbiBwYXJhbWV0ZXJzLiBTZWUgdGhlIFZJTSBoZWxwIGZvciBjaW5vcHRpb25zLXZhbHVlcyBmb3INCisiIGRldGFpbHMuICBUaGVzZSBhcmVuJ3QgYWJzb2x1dGUgcnVsZXM7IHRoZXkncmUganVzdCBhbiBhcHByb3hpbWF0aW9uIG9mDQorIiBjb21tb24gc3R5bGUgaW4gTExWTSBzb3VyY2UuDQorc2V0IGNpbm9wdGlvbnM9OjAsZzAsKDAsV3MsbDENCisiIEFkZCBhbmQgZGVsZXRlIHNwYWNlcyBpbiBpbmNyZW1lbnRzIG9mIGBzaGlmdHdpZHRoJyBmb3IgdGFicw0KK3NldCBzbWFydHRhYg0KKw0KKyIgSGlnaGxpZ2h0IHN5bnRheCBpbiBwcm9ncmFtbWluZyBsYW5ndWFnZXMNCitzeW50YXggb24NCisNCisiIExMVk0gTWFrZWZpbGVzIGNhbiBoYXZlIG5hbWVzIHN1Y2ggYXMgTWFrZWZpbGUucnVsZXMgb3IgVEVTVC5uaWdodGx5Lk1ha2VmaWxlLA0KKyIgc28gaXQncyBpbXBvcnRhbnQgdG8gY2F0ZWdvcml6ZSB0aGVtIGFzIHN1Y2guDQorYXVncm91cCBmaWxldHlwZQ0KKyAgYXUhIEJ1ZlJlYWQsQnVmTmV3RmlsZSAqTWFrZWZpbGUqIHNldCBmaWxldHlwZT1tYWtlDQorYXVncm91cCBFTkQNCisNCisiIEluIE1ha2VmaWxlcywgZG9uJ3QgZXhwYW5kIHRhYnMgdG8gc3BhY2VzLCBzaW5jZSB3ZSBuZWVkIHRoZSBhY3R1YWwgdGFicw0KK2F1dG9jbWQgRmlsZVR5cGUgbWFrZSBzZXQgbm9leHBhbmR0YWINCisNCisiIFVzZWZ1bCBtYWNyb3MgZm9yIGNsZWFuaW5nIHVwIGNvZGUgdG8gY29uZm9ybSB0byBMTFZNIGNvZGluZyBndWlkZWxpbmVzDQorDQorIiBEZWxldGUgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgdGFicyBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZQ0KK2NvbW1hbmQhIERlbGV0ZVRyYWlsaW5nV3MgOiVzL1xzXCskLy8NCisNCisiIENvbnZlcnQgYWxsIHRhYiBjaGFyYWN0ZXJzIHRvIHR3byBzcGFjZXMNCitjb21tYW5kISBVbnRhYiA6JXMvXHQvICAvZw0KKw0KKyIgRW5hYmxlIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIExMVk0gZmlsZXMuIFRvIHVzZSwgY29weQ0KKyIgdXRpbHMvdmltL2xsdm0udmltIHRvIH4vLnZpbS9zeW50YXggLg0KK2F1Z3JvdXAgZmlsZXR5cGUNCisgIGF1ISBCdWZSZWFkLEJ1Zk5ld0ZpbGUgKi5sbCAgICAgc2V0IGZpbGV0eXBlPWxsdm0NCithdWdyb3VwIEVORA0KKw0KKyIgRW5hYmxlIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIHRhYmxlZ2VuIGZpbGVzLiBUbyB1c2UsIGNvcHkNCisiIHV0aWxzL3ZpbS90YWJsZWdlbi52aW0gdG8gfi8udmltL3N5bnRheCAuDQorYXVncm91cCBmaWxldHlwZQ0KKyAgYXUhIEJ1ZlJlYWQsQnVmTmV3RmlsZSAqLnRkICAgICBzZXQgZmlsZXR5cGU9dGFibGVnZW4NCithdWdyb3VwIEVORA0KKw0KKyIgQWRkaXRpb25hbCB2aW0gZmVhdHVyZXMgdG8gb3B0aW9uYWxseSB1bmNvbW1lbnQuDQorInNldCBzaG93Y21kDQorInNldCBzaG93bWF0Y2gNCisic2V0IHNob3dtb2RlDQorInNldCBpbmNzZWFyY2gNCisic2V0IHJ1bGVyDQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vdXRpbHMvd2ViTkxULnBsIGIvc3JjL0xMVk0vdXRpbHMvd2ViTkxULnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjlmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS91dGlscy93ZWJOTFQucGwKQEAgLTAsMCArMSw4MyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBEQkk7Cit1c2UgQ0dJOworCiskcSA9IG5ldyBDR0k7CitwcmludCAkcS0+aGVhZGVyKCk7CitwcmludCAkcS0+c3RhcnRfaHRtbCgtdGl0bGU9PiJOaWdodGx5IFRlc3RlciBEQiIpOworCit1bmxlc3MoJHEtPnBhcmFtKCdwd2QnKSkKKyAgeworICAgIHByaW50ICRxLT5zdGFydGZvcm0oKTsKKyAgICBwcmludCAkcS0+cGFzc3dvcmRfZmllbGQoLW5hbWU9PiJwd2QiLCAtc2l6ZT0+MjAsIC1tYXhsZW5ndGg9PjIwKTsKKyAgICBwcmludCAkcS0+c3VibWl0KCk7CisgICAgcHJpbnQgJHEtPmVuZGZvcm0oKTsKKyAgfQorZWxzZQorICB7CisgICAgIyBkYXRhYmFzZSBpbmZvcm1hdGlvbgorICAgICRkYj0ibGx2bWFscGhhIjsKKyAgICAkaG9zdD0ibG9jYWxob3N0IjsKKyAgICAkdXNlcmlkPSJsbHZtZGJ1c2VyIjsKKyAgICAkcGFzc3dkPSRxLT5wYXJhbSgncHdkJyk7CisgICAgJGNvbm5lY3Rpb25JbmZvPSJkYmk6bXlzcWw6JGRiOyRob3N0IjsKKyAgICAKKyAgICAjIG1ha2UgY29ubmVjdGlvbiB0byBkYXRhYmFzZQorICAgICRkYmggPSBEQkktPmNvbm5lY3QoJGNvbm5lY3Rpb25JbmZvLCR1c2VyaWQsJHBhc3N3ZCkgb3IgZGllIERCSS0+ZXJyc3RyOworICAgICRxdWVyeSA9ICJTZWxlY3QgRElTVElOQ1QoTkFNRSkgZnJvbSBUZXN0cyI7CisgICAgbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoJHF1ZXJ5KSB8fCBkaWUgIkNhbid0IHByZXBhcmUgc3RhdGVtZW50OiAkREJJOjplcnJzdHIiOworICAgIG15ICRyYyA9ICRzdGgtPmV4ZWN1dGUgb3IgZGllIERCSS0+ZXJyc3RyOworICAgIHdoaWxlICgoJG4pID0gJHN0aC0+ZmV0Y2hyb3dfYXJyYXkpCisgICAgICB7CisgICAgICAgIHB1c2ggQG5hbWVzLCAoJG4pOworIyAgICAgICAgcHJpbnQgIiRuPFA+IjsKKyAgICAgIH0KKyAgICAkcXVlcnkgPSAiU2VsZWN0IERJU1RJTkNUKFRFU1QpIGZyb20gVGVzdHMiOworICAgIG15ICRzdGggPSAkZGJoLT5wcmVwYXJlKCRxdWVyeSkgfHwgZGllICJDYW4ndCBwcmVwYXJlIHN0YXRlbWVudDogJERCSTo6ZXJyc3RyIjsKKyAgICBteSAkcmMgPSAkc3RoLT5leGVjdXRlIG9yIGRpZSBEQkktPmVycnN0cjsKKyAgICB3aGlsZSAoKCRuKSA9ICRzdGgtPmZldGNocm93X2FycmF5KQorICAgICAgeworICAgICAgICBwdXNoIEB0ZXN0cywgKCRuKTsKKyMgICAgICAgIHByaW50ICIkblxuIjsKKyAgICAgIH0KKworIyAgICBwcmludCBqb2luICI8QlI+IiwgQG5hbWVzOworCisgICAgcHJpbnQgJHEtPnN0YXJ0Zm9ybSgpOworICAgIHByaW50ICRxLT5zY3JvbGxpbmdfbGlzdCgtbmFtZT0+InRlc3QiLCAtdmFsdWVzPT5cQHRlc3RzLCAtbXVsdGlwbGU9Pid0cnVlJyk7CisgICAgcHJpbnQgIjxQPiI7CisgICAgcHJpbnQgJHEtPnNjcm9sbGluZ19saXN0KC1uYW1lPT4ibmFtZSIsIC12YWx1ZXM9PlxAbmFtZXMsIC1tdWx0aXBsZT0+J3RydWUnKTsKKyAgICBwcmludCAiPFA+IjsKKyAgICBwcmludCAkcS0+c3VibWl0KCk7CisgICAgcHJpbnQgJHEtPmhpZGRlbigicHdkIiwgJHEtPnBhcmFtKCdwd2QnKSk7CisgICAgcHJpbnQgJHEtPmVuZGZvcm0oKTsKKworICAgICMgZGlzY29ubmVjdCBmcm9tIGRhdGFiYXNlCisgICAgJGRiaC0+ZGlzY29ubmVjdDsKKworICAgICNub3cgZ2VuZXJhdGUgdGhlIHVybHMgdG8gdGhlIGNoYXJ0CisgICAgaWYgKCRxLT5wYXJhbSgndGVzdCcpICYmICRxLT5wYXJhbSgnbmFtZScpKQorICAgICAgeworICAgICAgICBteSBAbmFtZXMgPSAkcS0+cGFyYW0oJ25hbWUnKTsKKyAgICAgICAgbXkgQHRlc3RzID0gJHEtPnBhcmFtKCd0ZXN0Jyk7CisgICAgICAgIHByaW50ICI8UD4iOworICAgICAgICBwcmludCBqb2luICI8QlI+IiwgQG5hbWVzOworICAgICAgICBwcmludCAiPFA+IjsKKyAgICAgICAgcHJpbnQgam9pbiAiPEJSPiIsIEB0ZXN0czsKKyAgICAgICAgcHJpbnQgIjxQPiI7CisgICAgICAgICRzdHIgPSAicHdkPSIgLiAkcS0+cGFyYW0oJ3B3ZCcpOworICAgICAgICAkY291bnQgPSAwOworICAgICAgICBmb3JlYWNoICRuIChAbmFtZXMpCisgICAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAkdCAoQHRlc3RzKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJHN0ciA9ICIkc3RyJnQkY291bnQ9JHQmbiRjb3VudD0kbiI7CisgICAgICAgICAgICAgICAgJGNvdW50Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIHByaW50ICI8aW1nIHNyYz1cImNnaXBsb3ROTFQucGw/JHN0clwiPiI7CisgICAgICB9CisgIH0KKworcHJpbnQgJHEtPmVuZF9odG1sKCk7CmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi9BbmFseXNpcy9BbmFseXNpcy52Y3hwcm9qIGIvc3JjL0xMVk0vd2luMzIvQW5hbHlzaXMvQW5hbHlzaXMudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTU1YTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvQW5hbHlzaXMvQW5hbHlzaXMudmN4cHJvagpAQCAtMCwwICsxLDMxMSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJQcm9maWxlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5Qcm9maWxlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJQcm9maWxlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fTwvUHJvamVjdEd1aWQ+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtfREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO19ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7TkRFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUztfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7TkRFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUztfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7TkRFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUztfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcQWxpYXNBbmFseXNpcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXEFsaWFzU2V0VHJhY2tlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXEJhc2ljQWxpYXNBbmFseXNpcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXENhcHR1cmVUcmFja2luZy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXENvbnN0YW50Rm9sZGluZy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXERlYnVnSW5mby5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXEluc3RydWN0aW9uU2ltcGxpZnkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xJVlVzZXJzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcTG9hZHMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xMb29wSW5mby5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXExvb3BQYXNzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcUEhJVHJhbnNBZGRyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcUHJvZmlsZUluZm8uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xTY2FsYXJFdm9sdXRpb24uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xTY2FsYXJFdm9sdXRpb25FeHBhbmRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXFNjYWxhckV2b2x1dGlvbk5vcm1hbGl6YXRpb24uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xWYWx1ZVRyYWNraW5nLmNwcCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcQWxpYXNBbmFseXNpcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xBbGlhc1NldFRyYWNrZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcQ2FsbEdyYXBoLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXENGR1ByaW50ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcQ29uc3RhbnRGb2xkaW5nLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXENvbnN0YW50c1NjYW5uZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcRG9taW5hdG9ySW50ZXJuYWxzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXERvbWluYXRvcnMuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcRmluZFVzZWRUeXBlcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xJbnRlcnZhbC5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xJbnRlcnZhbEl0ZXJhdG9yLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXEludGVydmFsUGFydGl0aW9uLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXExvb3BJbmZvLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXExvb3BQYXNzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXFBhc3Nlcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xQb3N0RG9taW5hdG9ycy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xQcm9maWxlSW5mby5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xQcm9maWxlSW5mb0xvYWRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xQcm9maWxlSW5mb1R5cGVzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXFNjYWxhckV2b2x1dGlvbi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xTY2FsYXJFdm9sdXRpb25FeHBhbmRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xTY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xUcmFjZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xWZXJpZmllci5oIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL0FuYWx5c2lzL0FuYWx5c2lzLnZjeHByb2ouZmlsdGVycyBiL3NyYy9MTFZNL3dpbjMyL0FuYWx5c2lzL0FuYWx5c2lzLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTg2YjIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvQW5hbHlzaXMvQW5hbHlzaXMudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMTQzIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzt4c2Q8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xBbGlhc0FuYWx5c2lzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXEFsaWFzU2V0VHJhY2tlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xCYXNpY0FsaWFzQW5hbHlzaXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcQ2FwdHVyZVRyYWNraW5nLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXENvbnN0YW50Rm9sZGluZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xEZWJ1Z0luZm8uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcSW5zdHJ1Y3Rpb25TaW1wbGlmeS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xJVlVzZXJzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXExvYWRzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXExvb3BJbmZvLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXExvb3BQYXNzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXE1lbW9yeURlcGVuZGVuY2VBbmFseXNpcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxBbmFseXNpc1xQSElUcmFuc0FkZHIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcUHJvZmlsZUluZm8uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcU2NhbGFyRXZvbHV0aW9uLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXFNjYWxhckV2b2x1dGlvbkV4cGFuZGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEFuYWx5c2lzXFNjYWxhckV2b2x1dGlvbk5vcm1hbGl6YXRpb24uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQW5hbHlzaXNcVmFsdWVUcmFja2luZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xBbGlhc0FuYWx5c2lzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xBbGlhc1NldFRyYWNrZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXENhbGxHcmFwaC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcQ0ZHUHJpbnRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcQ29uc3RhbnRGb2xkaW5nLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xDb25zdGFudHNTY2FubmVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xEb21pbmF0b3JJbnRlcm5hbHMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXERvbWluYXRvcnMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXEZpbmRVc2VkVHlwZXMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXEludGVydmFsLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xJbnRlcnZhbEl0ZXJhdG9yLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xJbnRlcnZhbFBhcnRpdGlvbi5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcTG9vcEluZm8uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXExvb3BQYXNzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xQYXNzZXMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXFBvc3REb21pbmF0b3JzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xQcm9maWxlSW5mby5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcUHJvZmlsZUluZm9Mb2FkZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXFByb2ZpbGVJbmZvVHlwZXMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXFNjYWxhckV2b2x1dGlvbi5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcU2NhbGFyRXZvbHV0aW9uRXhwYW5kZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEFuYWx5c2lzXFNjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxBbmFseXNpc1xUcmFjZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cQW5hbHlzaXNcVmVyaWZpZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvQ29kZUdlbi9Db2RlR2VuLnZjeHByb2ogYi9zcmMvTExWTS93aW4zMi9Db2RlR2VuL0NvZGVHZW4udmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2VmMDEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvQ29kZUdlbi9Db2RlR2VuLnZjeHByb2oKQEAgLTAsMCArMSwzODAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezA4Q0VCMUJCLUMyQTQtNDU4Ny1COUE5LUFFREI4RkI0NDg5N308L1Byb2plY3RHdWlkPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7X0RFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtfREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxBbmFseXNpcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQnJhbmNoRm9sZGluZy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQ2FsY1NwaWxsV2VpZ2h0cy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQ2FsbGluZ0NvbnZMb3dlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQ29kZVBsYWNlbWVudE9wdC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQ3JpdGljYWxBbnRpRGVwQnJlYWtlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cRGVhZE1hY2hpbmVJbnN0cnVjdGlvbkVsaW0uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXElubGluZVNwaWxsZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXExhdGVuY3lQcmlvcml0eVF1ZXVlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxMaXZlSW50ZXJ2YWwuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXExpdmVJbnRlcnZhbEFuYWx5c2lzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxMaXZlU3RhY2tBbmFseXNpcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTGl2ZVZhcmlhYmxlcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTExWTVRhcmdldE1hY2hpbmUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXExvd2VyU3VicmVncy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZUJhc2ljQmxvY2suY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVDU0UuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVEb21pbmF0b3JzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lRnVuY3Rpb24uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVGdW5jdGlvbkFuYWx5c2lzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lRnVuY3Rpb25QYXNzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lRnVuY3Rpb25QcmludGVyUGFzcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZUluc3RyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lTElDTS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZUxvb3BJbmZvLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lTW9kdWxlSW5mby5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZU1vZHVsZUluZm9JbXBscy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZVBhc3NSZWdpc3RyeS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZVJlZ2lzdGVySW5mby5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZVNpbmsuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVTU0FVcGRhdGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxPYmplY3RDb2RlRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cT3B0aW1pemVQSElzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxQYXNzZXMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFBlZXBob2xlT3B0aW1pemVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxQSElFbGltaW5hdGlvbi5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cUG9zdFJBSGF6YXJkUmVjb2duaXplci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cUG9zdFJBU2NoZWR1bGVyTGlzdC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cUHJlQWxsb2NTcGxpdHRpbmcuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFByb2Nlc3NJbXBsaWNpdERlZnMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFByb2xvZ0VwaWxvZ0luc2VydGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxQc2V1ZG9Tb3VyY2VWYWx1ZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cUmVnQWxsb2NGYXN0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxSZWdBbGxvY0xpbmVhclNjYW4uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFJlZ2lzdGVyQ29hbGVzY2VyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxSZWdpc3RlclNjYXZlbmdpbmcuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNjaGVkdWxlREFHLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTY2hlZHVsZURBR0VtaXQuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNjaGVkdWxlREFHSW5zdHJzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTY2hlZHVsZURBR1ByaW50ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNocmlua1dyYXBwaW5nLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTaW1wbGVSZWdpc3RlckNvYWxlc2NpbmcuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNsb3RJbmRleGVzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTcGlsbGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTcGxpdEtpdC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU3RhY2tQcm90ZWN0b3IuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFN0YWNrU2xvdENvbG9yaW5nLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTdHJvbmdQSElFbGltaW5hdGlvbi5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cVGFpbER1cGxpY2F0aW9uLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxUYXJnZXRJbnN0ckluZm9JbXBsLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxVbnJlYWNoYWJsZUJsb2NrRWxpbS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cVmlydFJlZ01hcC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cVmlydFJlZ1Jld3JpdGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcREFHQ29tYmluZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xGdW5jdGlvbkxvd2VyaW5nSW5mby5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXEluc3RyRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXExlZ2FsaXplREFHLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcTGVnYWxpemVGbG9hdFR5cGVzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcTGVnYWxpemVJbnRlZ2VyVHlwZXMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xMZWdhbGl6ZVR5cGVzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcTGVnYWxpemVUeXBlc0dlbmVyaWMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xMZWdhbGl6ZVZlY3Rvck9wcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXExlZ2FsaXplVmVjdG9yVHlwZXMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTY2hlZHVsZURBR0Zhc3QuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTY2hlZHVsZURBR0xpc3QuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTY2hlZHVsZURBR1JSTGlzdC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFNjaGVkdWxlREFHU0ROb2Rlcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFNlbGVjdGlvbkRBRy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFNlbGVjdGlvbkRBR0J1aWxkZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTZWxlY3Rpb25EQUdJU2VsLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcU2VsZWN0aW9uREFHUHJpbnRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFRhcmdldExvd2VyaW5nLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcVGFyZ2V0U2VsZWN0aW9uREFHSW5mby5jcHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQWdncmVzc2l2ZUFudGlEZXBCcmVha2VyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQW50aURlcEJyZWFrZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxCcmFuY2hGb2xkaW5nLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQ3JpdGljYWxBbnRpRGVwQnJlYWtlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXEVMRi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXEVMRkNvZGVFbWl0dGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cRUxGV3JpdGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cUEhJRWxpbWluYXRpb24uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxQcm9sb2dFcGlsb2dJbnNlcnRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFJlbmRlck1hY2hpbmVGdW5jdGlvbi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNjaGVkdWxlREFHSW5zdHJzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU3BpbGxlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNwbGl0S2l0LmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU3BsaXR0ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxWaXJ0UmVnTWFwLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cVmlydFJlZ1Jld3JpdGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQXNtUHJpbnRlclxESUUuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxBc21QcmludGVyXER3YXJmRGVidWcuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxBc21QcmludGVyXER3YXJmRXhjZXB0aW9uLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXEluc3RyRW1pdHRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xMZWdhbGl6ZVR5cGVzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFNjaGVkdWxlREFHU0ROb2Rlcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTRE5vZGVEYmdWYWx1ZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTRE5vZGVPcmRlcmluZy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTZWxlY3Rpb25EQUdCdWlsZGVyLmgiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvQ29kZUdlbi9Db2RlR2VuLnZjeHByb2ouZmlsdGVycyBiL3NyYy9MTFZNL3dpbjMyL0NvZGVHZW4vQ29kZUdlbi52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4NjFmMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL0NvZGVHZW4vQ29kZUdlbi52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSwzNTkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214PC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNcU2VsZWN0aW9uREFHIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZmEzNTMwOTctMGU3ZC00MWIxLTgyZGItMjRlMDVjNDVkODNhfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzt4c2Q8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlc1xBc21QcmludGVyIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjQzOTFiNmEtNmI0ZC00ZTRiLThiNzgtN2RiN2RmZTYzMGMzfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzXFNlbGVjdGlvbkRBRyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezBiZmE3ZDA0LTRhMDMtNGM1My05OWQ0LTJhNzZjMWU1ODJkZn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXEFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXEFuYWx5c2lzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQnJhbmNoRm9sZGluZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXENhbGNTcGlsbFdlaWdodHMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxDYWxsaW5nQ29udkxvd2VyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQ29kZVBsYWNlbWVudE9wdC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXENyaXRpY2FsQW50aURlcEJyZWFrZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxEZWFkTWFjaGluZUluc3RydWN0aW9uRWxpbS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXElubGluZVNwaWxsZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxMYXRlbmN5UHJpb3JpdHlRdWV1ZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXExpdmVJbnRlcnZhbC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXExpdmVJbnRlcnZhbEFuYWx5c2lzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTGl2ZVN0YWNrQW5hbHlzaXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxMaXZlVmFyaWFibGVzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTExWTVRhcmdldE1hY2hpbmUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxMb3dlclN1YnJlZ3MuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lQmFzaWNCbG9jay5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVDU0UuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lRG9taW5hdG9ycy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVGdW5jdGlvbi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVGdW5jdGlvbkFuYWx5c2lzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZUZ1bmN0aW9uUGFzcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVGdW5jdGlvblByaW50ZXJQYXNzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZUluc3RyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZUxJQ00uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lTG9vcEluZm8uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lTW9kdWxlSW5mby5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVNb2R1bGVJbmZvSW1wbHMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxNYWNoaW5lUGFzc1JlZ2lzdHJ5LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZVJlZ2lzdGVySW5mby5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE1hY2hpbmVTaW5rLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cTWFjaGluZVNTQVVwZGF0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxPYmplY3RDb2RlRW1pdHRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXE9wdGltaXplUEhJcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFBhc3Nlcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFBlZXBob2xlT3B0aW1pemVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cUEhJRWxpbWluYXRpb24uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxQb3N0UkFIYXphcmRSZWNvZ25pemVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cUG9zdFJBU2NoZWR1bGVyTGlzdC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFByZUFsbG9jU3BsaXR0aW5nLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cUHJvY2Vzc0ltcGxpY2l0RGVmcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFByb2xvZ0VwaWxvZ0luc2VydGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cUHNldWRvU291cmNlVmFsdWUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxSZWdBbGxvY0Zhc3QuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxSZWdBbGxvY0xpbmVhclNjYW4uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxSZWdpc3RlckNvYWxlc2Nlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFJlZ2lzdGVyU2NhdmVuZ2luZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNjaGVkdWxlREFHLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2NoZWR1bGVEQUdFbWl0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2NoZWR1bGVEQUdJbnN0cnMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTY2hlZHVsZURBR1ByaW50ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTaHJpbmtXcmFwcGluZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNpbXBsZVJlZ2lzdGVyQ29hbGVzY2luZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNsb3RJbmRleGVzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU3BpbGxlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNwbGl0S2l0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU3RhY2tQcm90ZWN0b3IuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTdGFja1Nsb3RDb2xvcmluZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFN0cm9uZ1BISUVsaW1pbmF0aW9uLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cVGFpbER1cGxpY2F0aW9uLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cVGFyZ2V0SW5zdHJJbmZvSW1wbC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3MuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxVbnJlYWNoYWJsZUJsb2NrRWxpbS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFZpcnRSZWdNYXAuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxWaXJ0UmVnUmV3cml0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcREFHQ29tYmluZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXEZ1bmN0aW9uTG93ZXJpbmdJbmZvLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xJbnN0ckVtaXR0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXExlZ2FsaXplREFHLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xMZWdhbGl6ZUZsb2F0VHlwZXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXExlZ2FsaXplSW50ZWdlclR5cGVzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xMZWdhbGl6ZVR5cGVzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xMZWdhbGl6ZVR5cGVzR2VuZXJpYy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNlbGVjdGlvbkRBRzwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcTGVnYWxpemVWZWN0b3JPcHMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXExlZ2FsaXplVmVjdG9yVHlwZXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFNjaGVkdWxlREFHRmFzdC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNlbGVjdGlvbkRBRzwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcU2NoZWR1bGVEQUdMaXN0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTY2hlZHVsZURBR1JSTGlzdC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNlbGVjdGlvbkRBRzwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcU2NoZWR1bGVEQUdTRE5vZGVzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTZWxlY3Rpb25EQUcuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFNlbGVjdGlvbkRBR0J1aWxkZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFNlbGVjdGlvbkRBR0lTZWwuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFNlbGVjdGlvbkRBR1ByaW50ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFRhcmdldExvd2VyaW5nLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xUYXJnZXRTZWxlY3Rpb25EQUdJbmZvLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXEFnZ3Jlc3NpdmVBbnRpRGVwQnJlYWtlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxBbnRpRGVwQnJlYWtlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxCcmFuY2hGb2xkaW5nLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXENyaXRpY2FsQW50aURlcEJyZWFrZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cRUxGLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXEVMRkNvZGVFbWl0dGVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXEVMRldyaXRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxQSElFbGltaW5hdGlvbi5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxQcm9sb2dFcGlsb2dJbnNlcnRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxSZW5kZXJNYWNoaW5lRnVuY3Rpb24uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2NoZWR1bGVEQUdJbnN0cnMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2ltcGxlUmVnaXN0ZXJDb2FsZXNjaW5nLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNwaWxsZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU3BsaXRLaXQuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU3BsaXR0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cVmlydFJlZ01hcC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxWaXJ0UmVnUmV3cml0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cQXNtUHJpbnRlclxESUUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcQXNtUHJpbnRlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxBc21QcmludGVyXER3YXJmRGVidWcuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcQXNtUHJpbnRlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxBc21QcmludGVyXER3YXJmRXhjZXB0aW9uLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXEFzbVByaW50ZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXEluc3RyRW1pdHRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXExlZ2FsaXplVHlwZXMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTY2hlZHVsZURBR1NETm9kZXMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcU2VsZWN0aW9uREFHPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxDb2RlR2VuXFNlbGVjdGlvbkRBR1xTRE5vZGVEYmdWYWx1ZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXENvZGVHZW5cU2VsZWN0aW9uREFHXFNETm9kZU9yZGVyaW5nLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXFNlbGVjdGlvbkRBRzwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcQ29kZUdlblxTZWxlY3Rpb25EQUdcU2VsZWN0aW9uREFHQnVpbGRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xTZWxlY3Rpb25EQUc8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvQ29uZmlndXJlL0NvbmZpZ3VyZS9Db25maWd1cmUuZXhlLmVtYmVkLm1hbmlmZXN0IGIvc3JjL0xMVk0vd2luMzIvQ29uZmlndXJlL0NvbmZpZ3VyZS9Db25maWd1cmUuZXhlLmVtYmVkLm1hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDIwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi9Db25maWd1cmUvQ29uZmlndXJlL0NvbmZpZ3VyZS5leGUuZW1iZWQubWFuaWZlc3QKQEAgLTAsMCArMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pjxhc3NlbWJseSBtYW5pZmVzdFZlcnNpb249IjEuMCIgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj48L2Fzc2VtYmx5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLnZjeHByb2ogYi9zcmMvTExWTS93aW4zMi9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkYzZiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUudmN4cHJvagpAQCAtMCwwICsxLDI4MSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJQcm9maWxlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5Qcm9maWxlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJQcm9maWxlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfTwvUHJvamVjdEd1aWQ+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtfREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO19ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7TkRFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUztfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7TkRFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUztfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7TkRFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUztfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcRXhlY3V0aW9uRW5naW5lXEV4ZWN1dGlvbkVuZ2luZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEV4ZWN1dGlvbkVuZ2luZVxKaXRcSW50ZXJjZXB0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcRXhlY3V0aW9uRW5naW5lXEppdFxKSVQuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxFeGVjdXRpb25FbmdpbmVcSml0XEpJVEVtaXR0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxFeGVjdXRpb25FbmdpbmVcSklUXEpJVE1lbW9yeU1hbmFnZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxFeGVjdXRpb25FbmdpbmVcSml0XFRhcmdldFNlbGVjdC5jcHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEV4ZWN1dGlvbkVuZ2luZVxFeGVjdXRpb25FbmdpbmUuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cRXhlY3V0aW9uRW5naW5lXEdlbmVyaWNWYWx1ZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxFeGVjdXRpb25FbmdpbmVcSklULmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXEV4ZWN1dGlvbkVuZ2luZVxKSVRcSklURGVidWdSZWdpc3RlcmVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXEV4ZWN1dGlvbkVuZ2luZVxKSVRcSklURHdhcmZFbWl0dGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEV4ZWN1dGlvbkVuZ2luZVxKSVRNZW1vcnlNYW5hZ2VyLmgiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvRXhlY3V0aW9uRW5naW5lL0V4ZWN1dGlvbkVuZ2luZS52Y3hwcm9qLmZpbHRlcnMgYi9zcmMvTExWTS93aW4zMi9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU3NTZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvRXhlY3V0aW9uRW5naW5lL0V4ZWN1dGlvbkVuZ2luZS52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSw1NiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXg8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM7eHNkPC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJKSVQiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswYWY2ZDM1MC03YjZjLTQyZjktODk2YS0zZTJmZjNkMWU4OWJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICA8L0ZpbHRlcj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcRXhlY3V0aW9uRW5naW5lXEV4ZWN1dGlvbkVuZ2luZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxFeGVjdXRpb25FbmdpbmVcSml0XEludGVyY2VwdC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+SklUPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxFeGVjdXRpb25FbmdpbmVcSml0XEpJVC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+SklUPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxFeGVjdXRpb25FbmdpbmVcSml0XEpJVEVtaXR0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPkpJVDwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcRXhlY3V0aW9uRW5naW5lXEpJVFxKSVRNZW1vcnlNYW5hZ2VyLmNwcCI+DQorICAgICAgPEZpbHRlcj5KSVQ8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXEV4ZWN1dGlvbkVuZ2luZVxKaXRcVGFyZ2V0U2VsZWN0LmNwcCI+DQorICAgICAgPEZpbHRlcj5KSVQ8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEV4ZWN1dGlvbkVuZ2luZVxFeGVjdXRpb25FbmdpbmUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEV4ZWN1dGlvbkVuZ2luZVxHZW5lcmljVmFsdWUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXEV4ZWN1dGlvbkVuZ2luZVxKSVQuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXEV4ZWN1dGlvbkVuZ2luZVxKSVRcSklURGVidWdSZWdpc3RlcmVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxFeGVjdXRpb25FbmdpbmVcSklUXEpJVER3YXJmRW1pdHRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cRXhlY3V0aW9uRW5naW5lXEpJVE1lbW9yeU1hbmFnZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvTUMvTUMudmN4cHJvaiBiL3NyYy9MTFZNL3dpbjMyL01DL01DLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhZDhlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL01DL01DLnZjeHByb2oKQEAgLTAsMCArMSwyNjAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX08L1Byb2plY3RHdWlkPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5NQzwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDMxOS4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1hY2hPYmplY3RXcml0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ0FzbUluZm8uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ0FzbUluZm9DT0ZGLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNBc21JbmZvRGFyd2luLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNBc21TdHJlYW1lci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1DQXNzZW1ibGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNDb2RlRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1DQ29udGV4dC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1DRXhwci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1DSW5zdC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1DTG9nZ2luZ1N0cmVhbWVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNNYWNoT1N0cmVhbWVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNOdWxsU3RyZWFtZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ09iamVjdFN0cmVhbWVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNPYmplY3RXcml0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ1NlY3Rpb24uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ1NlY3Rpb25DT0ZGLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNTZWN0aW9uRUxGLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNTZWN0aW9uTWFjaE8uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ1N0cmVhbWVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNTeW1ib2wuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xUYXJnZXRBc21CYWNrZW5kLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcV2luQ09GRk9iamVjdFdyaXRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXFdpbkNPRkZTdHJlYW1lci5jcHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvTUMvTUMudmN4cHJvai5maWx0ZXJzIGIvc3JjL0xMVk0vd2luMzIvTUMvTUMudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YWY4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi9NQy9NQy52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSw5MSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXg8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM7eHNkPC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJSZXNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+cmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdjwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1hY2hPYmplY3RXcml0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNBc21JbmZvLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1DQXNtSW5mb0NPRkYuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNBc21JbmZvRGFyd2luLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1DQXNtU3RyZWFtZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNBc3NlbWJsZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNDb2RlRW1pdHRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ0NvbnRleHQuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNFeHByLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXE1DSW5zdC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ0xvZ2dpbmdTdHJlYW1lci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ01hY2hPU3RyZWFtZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNOdWxsU3RyZWFtZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNPYmplY3RTdHJlYW1lci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ09iamVjdFdyaXRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ1NlY3Rpb24uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNTZWN0aW9uQ09GRi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ1NlY3Rpb25FTEYuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNTZWN0aW9uTWFjaE8uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcTUNTdHJlYW1lci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xNQ1N5bWJvbC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxNQ1xUYXJnZXRBc21CYWNrZW5kLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE1DXFdpbkNPRkZPYmplY3RXcml0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTUNcV2luQ09GRlN0cmVhbWVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvU3VwcG9ydC9TdXBwb3J0LnZjeHByb2ogYi9zcmMvTExWTS93aW4zMi9TdXBwb3J0L1N1cHBvcnQudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2U4OTBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvU3VwcG9ydC9TdXBwb3J0LnZjeHByb2oKQEAgLTAsMCArMSwzMDYgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH08L1Byb2plY3RHdWlkPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5zdXBwb3J0PC9Sb290TmFtZXNwYWNlPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7X0RFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtfREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcQWxsb2NhdG9yLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxBUEZsb2F0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxBUEludC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcY2lyY3VsYXJfcmF3X29zdHJlYW0uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XENvbW1hbmRMaW5lLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxDb25zdGFudFJhbmdlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxEZWJ1Zy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcRHdhcmYuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XEVycm9ySGFuZGxpbmcuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XEZvbGRpbmdTZXQuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XEZvcm1hdHRlZFN0cmVhbS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcR3JhcGhXcml0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XE1hbmFnZWRTdGF0aWMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XE1lbW9yeUJ1ZmZlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcUHJldHR5U3RhY2tUcmFjZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRccmF3X29zdHJlYW0uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFNtYWxsUHRyU2V0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTbWFsbFZlY3Rvci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcU291cmNlTWdyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTdGF0aXN0aWMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFN0cmluZ0V4dHJhcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcU3RyaW5nTWFwLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTdHJpbmdQb29sLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTdHJpbmdSZWYuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFRhcmdldFJlZ2lzdHJ5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxUaW1lci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcVHJpcGxlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxUd2luZS5jcHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRccmVnY2NsYXNzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRccmVnY25hbWUuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxyZWdleDIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxyZWdleF9pbXBsLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRccmVndXRpbHMuaCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRccmVnZW5naW5lLmluYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi9TdXBwb3J0L1N1cHBvcnQudmN4cHJvai5maWx0ZXJzIGIvc3JjL0xMVk0vd2luMzIvU3VwcG9ydC9TdXBwb3J0LnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2EwYjJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvU3VwcG9ydC9TdXBwb3J0LnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDEyMSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXg8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM7eHNkPC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxBbGxvY2F0b3IuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxBUEZsb2F0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcQVBJbnQuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxjaXJjdWxhcl9yYXdfb3N0cmVhbS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XENvbW1hbmRMaW5lLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcQ29uc3RhbnRSYW5nZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XERlYnVnLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcRHdhcmYuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxFcnJvckhhbmRsaW5nLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcRm9sZGluZ1NldC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XEZvcm1hdHRlZFN0cmVhbS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XEdyYXBoV3JpdGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcTWFuYWdlZFN0YXRpYy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XE1lbW9yeUJ1ZmZlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFByZXR0eVN0YWNrVHJhY2UuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxyYXdfb3N0cmVhbS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFNtYWxsUHRyU2V0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcU21hbGxWZWN0b3IuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTb3VyY2VNZ3IuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTdGF0aXN0aWMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTdHJpbmdFeHRyYXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTdHJpbmdNYXAuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTdHJpbmdQb29sLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcU3RyaW5nUmVmLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcVGFyZ2V0UmVnaXN0cnkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxUaW1lci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFRyaXBsZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFR3aW5lLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRccmVnY2NsYXNzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XHJlZ2NuYW1lLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XHJlZ2V4Mi5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxyZWdleF9pbXBsLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XHJlZ3V0aWxzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxyZWdlbmdpbmUuaW5jIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvU3lzdGVtL1N5c3RlbS52Y3hwcm9qIGIvc3JjL0xMVk0vd2luMzIvU3lzdGVtL1N5c3RlbS52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMzQyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi9TeXN0ZW0vU3lzdGVtLnZjeHByb2oKQEAgLTAsMCArMSwzMDMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX08L1Byb2plY3RHdWlkPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5TeXN0ZW08L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtfREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+ZmFsc2U8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXEF0b21pYy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxEaXNhc3NlbWJsZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cRHluYW1pY0xpYnJhcnkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cRXJybm8uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cSG9zdC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxJbmNsdWRlRmlsZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxNZW1vcnkuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cTXV0ZXguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cUGF0aC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxQcm9jZXNzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFByb2dyYW0uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cUldNdXRleC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxTaWduYWxzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFRocmVhZGluZy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxUaHJlYWRMb2NhbC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxUaW1lVmFsdWUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cVmFsZ3JpbmQuY3BwIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFdpbjMyXEFsYXJtLmluYyIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxXaW4zMlxEeW5hbWljTGlicmFyeS5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcSG9zdC5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcTWVtb3J5LmluYyIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxXaW4zMlxNdXRleC5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcUGF0aC5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcUHJvY2Vzcy5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcUHJvZ3JhbS5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcUldNdXRleC5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcU2lnbmFscy5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcVGhyZWFkTG9jYWwuaW5jIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFdpbjMyXFRpbWVWYWx1ZS5pbmMiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxXaW4zMlxXaW4zMi5oIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL1N5c3RlbS9TeXN0ZW0udmN4cHJvai5maWx0ZXJzIGIvc3JjL0xMVk0vd2luMzIvU3lzdGVtL1N5c3RlbS52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlZGFmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL1N5c3RlbS9TeXN0ZW0udmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMTEyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzt4c2Q8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IldpbjMyIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZjEwOGFlZDctOTI5ZC00NDk4LTliMzktZWE4MDA4YmYwNWJlfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgPC9GaWx0ZXI+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxBdG9taWMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXERpc2Fzc2VtYmxlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cRHluYW1pY0xpYnJhcnkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXEVycm5vLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxIb3N0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxJbmNsdWRlRmlsZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cTWVtb3J5LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxNdXRleC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cUGF0aC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cUHJvY2Vzcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cUHJvZ3JhbS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cUldNdXRleC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cU2lnbmFscy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cVGhyZWFkaW5nLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxUaHJlYWRMb2NhbC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cVGltZVZhbHVlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxWYWxncmluZC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFdpbjMyXEFsYXJtLmluYyI+DQorICAgICAgPEZpbHRlcj5XaW4zMjwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcRHluYW1pY0xpYnJhcnkuaW5jIj4NCisgICAgICA8RmlsdGVyPldpbjMyPC9GaWx0ZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxXaW4zMlxIb3N0LmluYyI+DQorICAgICAgPEZpbHRlcj5XaW4zMjwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcTWVtb3J5LmluYyI+DQorICAgICAgPEZpbHRlcj5XaW4zMjwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcTXV0ZXguaW5jIj4NCisgICAgICA8RmlsdGVyPldpbjMyPC9GaWx0ZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxXaW4zMlxQYXRoLmluYyI+DQorICAgICAgPEZpbHRlcj5XaW4zMjwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcUHJvY2Vzcy5pbmMiPg0KKyAgICAgIDxGaWx0ZXI+V2luMzI8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFdpbjMyXFByb2dyYW0uaW5jIj4NCisgICAgICA8RmlsdGVyPldpbjMyPC9GaWx0ZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxXaW4zMlxSV011dGV4LmluYyI+DQorICAgICAgPEZpbHRlcj5XaW4zMjwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcU2lnbmFscy5pbmMiPg0KKyAgICAgIDxGaWx0ZXI+V2luMzI8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFdpbjMyXFRocmVhZExvY2FsLmluYyI+DQorICAgICAgPEZpbHRlcj5XaW4zMjwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cV2luMzJcVGltZVZhbHVlLmluYyI+DQorICAgICAgPEZpbHRlcj5XaW4zMjwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxXaW4zMlxXaW4zMi5oIj4NCisgICAgICA8RmlsdGVyPldpbjMyPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL1RhYmxlR2VuL1RhYmxlR2VuLnZjeHByb2ogYi9zcmMvTExWTS93aW4zMi9UYWJsZUdlbi9UYWJsZUdlbi52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZjNmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi9UYWJsZUdlbi9UYWJsZUdlbi52Y3hwcm9qCkBAIC0wLDAgKzEsMjY1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fTwvUHJvamVjdEd1aWQ+DQorICAgIDxSb290TmFtZXNwYWNlPlRhYmxlR2VuPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFByb2plY3REaXIpLi5cYmluXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47Li5cLi5cdXRpbHNcdGFibGVnZW47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtfREVCVUc7X0NPTlNPTEU7X19TVERDX0xJTUlUX01BQ1JPUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JShBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47Li5cLi5cdXRpbHNcdGFibGVnZW47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0NPTlNPTEU7X19TVERDX0xJTUlUX01BQ1JPUztfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOy4uXC4uXHV0aWxzXHRhYmxlZ2VuOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7V0lOMzI7TkRFQlVHO19DT05TT0xFO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4lKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxBbGxvY2F0b3IuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XEFQSW50LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxjaXJjdWxhcl9yYXdfb3N0cmVhbS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcQ29tbWFuZExpbmUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XERlYnVnLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxFcnJvckhhbmRsaW5nLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxGb2xkaW5nU2V0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxGb3JtYXR0ZWRTdHJlYW0uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XE1hbmFnZWRTdGF0aWMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XE1lbW9yeUJ1ZmZlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcUHJldHR5U3RhY2tUcmFjZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRccmF3X29zdHJlYW0uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFNtYWxsUHRyU2V0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTbWFsbFZlY3Rvci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcU291cmNlTWdyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTdHJpbmdFeHRyYXMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFN0cmluZ01hcC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcU3RyaW5nUmVmLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxUYXJnZXRSZWdpc3RyeS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcVHdpbmUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cQXRvbWljLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXEVycm5vLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXEhvc3QuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cTWVtb3J5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXE11dGV4LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFBhdGguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cUHJvY2Vzcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxQcm9ncmFtLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFNpZ25hbHMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cVGhyZWFkaW5nLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFRocmVhZExvY2FsLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFRpbWVWYWx1ZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxWYWxncmluZC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQVJNRGVjb2RlckVtaXR0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEFzbU1hdGNoZXJFbWl0dGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxBc21Xcml0ZXJFbWl0dGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxBc21Xcml0ZXJJbnN0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDYWxsaW5nQ29udkVtaXR0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENsYW5nQVNUTm9kZXNFbWl0dGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDbGFuZ0F0dHJFbWl0dGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDbGFuZ0RpYWdub3N0aWNzRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ29kZUVtaXR0ZXJHZW4uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENvZGVHZW5EQUdQYXR0ZXJucy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ29kZUdlbkluc3RydWN0aW9uLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDb2RlR2VuVGFyZ2V0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxEQUdJU2VsRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cREFHSVNlbE1hdGNoZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXERBR0lTZWxNYXRjaGVyRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cREFHSVNlbE1hdGNoZXJHZW4uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXERBR0lTZWxNYXRjaGVyT3B0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxEaXNhc3NlbWJsZXJFbWl0dGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxFREVtaXR0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEZhc3RJU2VsRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cSW5zdHJFbnVtRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cSW5zdHJJbmZvRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cSW50cmluc2ljRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cTExWTUNDb25maWd1cmF0aW9uRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cTmVvbkVtaXR0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXE9wdFBhcnNlckVtaXR0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXFJlY29yZC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cUmVnaXN0ZXJJbmZvRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cU3VidGFyZ2V0RW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cVGFibGVHZW4uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXFRhYmxlR2VuQmFja2VuZC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cVEdMZXhlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cVEdQYXJzZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXFRHVmFsdWVUeXBlcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cWDg2RGlzYXNzZW1ibGVyVGFibGVzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxYODZSZWNvZ25pemFibGVJbnN0ci5jcHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQVJNRGVjb2RlckVtaXR0ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxBc21NYXRjaGVyRW1pdHRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEFzbVdyaXRlckVtaXR0ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxBc21Xcml0ZXJJbnN0LmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ2FsbGluZ0NvbnZFbWl0dGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ2xhbmdBU1ROb2Rlc0VtaXR0ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDbGFuZ0F0dHJFbWl0dGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ2xhbmdEaWFnbm9zdGljc0VtaXR0ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDb2RlRW1pdHRlckdlbi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENvZGVHZW5EQUdQYXR0ZXJucy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENvZGVHZW5JbnN0cnVjdGlvbi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENvZGVHZW5JbnRyaW5zaWNzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ29kZUdlblJlZ2lzdGVycy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENvZGVHZW5UYXJnZXQuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxEQUdJU2VsRW1pdHRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXERBR0lTZWxNYXRjaGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cRGlzYXNzZW1ibGVyRW1pdHRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEVERW1pdHRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEZhc3RJU2VsRW1pdHRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEluc3RyRW51bUVtaXR0ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxJbnN0ckluZm9FbWl0dGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cSW50cmluc2ljRW1pdHRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXExMVk1DQ29uZmlndXJhdGlvbkVtaXR0ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxOZW9uRW1pdHRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXE9wdFBhcnNlckVtaXR0ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxSZWNvcmQuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxSZWdpc3RlckluZm9FbWl0dGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cU3RyaW5nVG9PZmZzZXRUYWJsZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXFN1YnRhcmdldEVtaXR0ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxUYWJsZUdlbkJhY2tlbmQuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxUR0xleGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cVEdQYXJzZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxYODZEaXNhc3NlbWJsZXJTaGFyZWQuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxYODZEaXNhc3NlbWJsZXJUYWJsZXMuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxYODZNb2RSTUZpbHRlcnMuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxYODZSZWNvZ25pemFibGVJbnN0ci5oIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL1RhYmxlR2VuL1RhYmxlR2VuLnZjeHByb2ouZmlsdGVycyBiL3NyYy9MTFZNL3dpbjMyL1RhYmxlR2VuL1RhYmxlR2VuLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2U4NWUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvVGFibGVHZW4vVGFibGVHZW4udmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMzMyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzt4c2Q8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEFSTURlY29kZXJFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQXNtTWF0Y2hlckVtaXR0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxBc21Xcml0ZXJFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQXNtV3JpdGVySW5zdC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENhbGxpbmdDb252RW1pdHRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENsYW5nQVNUTm9kZXNFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ2xhbmdBdHRyRW1pdHRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENsYW5nRGlhZ25vc3RpY3NFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ29kZUVtaXR0ZXJHZW4uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDb2RlR2VuREFHUGF0dGVybnMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDb2RlR2VuSW5zdHJ1Y3Rpb24uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDb2RlR2VuVGFyZ2V0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cREFHSVNlbEVtaXR0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxEQUdJU2VsTWF0Y2hlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXERBR0lTZWxNYXRjaGVyRW1pdHRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXERBR0lTZWxNYXRjaGVyR2VuLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cREFHSVNlbE1hdGNoZXJPcHQuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxEaXNhc3NlbWJsZXJFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cRURFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cRmFzdElTZWxFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cSW5zdHJFbnVtRW1pdHRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEluc3RySW5mb0VtaXR0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxJbnRyaW5zaWNFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cTExWTUNDb25maWd1cmF0aW9uRW1pdHRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXE5lb25FbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cT3B0UGFyc2VyRW1pdHRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXFJlY29yZC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXFJlZ2lzdGVySW5mb0VtaXR0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxTdWJ0YXJnZXRFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cVGFibGVHZW4uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxUYWJsZUdlbkJhY2tlbmQuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxUR0xleGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cVEdQYXJzZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxUR1ZhbHVlVHlwZXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxYODZEaXNhc3NlbWJsZXJUYWJsZXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxYODZSZWNvZ25pemFibGVJbnN0ci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XHJhd19vc3RyZWFtLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcRXJyb3JIYW5kbGluZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cU2lnbmFscy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cUGF0aC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFNvdXJjZU1nci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFR3aW5lLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcQ29tbWFuZExpbmUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxUYXJnZXRSZWdpc3RyeS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFByZXR0eVN0YWNrVHJhY2UuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxTdHJpbmdSZWYuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxNZW1vcnlCdWZmZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFByb2Nlc3MuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxBUEludC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XEZvbGRpbmdTZXQuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxEZWJ1Zy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFNtYWxsVmVjdG9yLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxUaHJlYWRMb2NhbC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XEZvcm1hdHRlZFN0cmVhbS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFN0cmluZ0V4dHJhcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTdXBwb3J0XFN0cmluZ01hcC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cVGltZVZhbHVlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcU21hbGxQdHJTZXQuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFRocmVhZGluZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cTXV0ZXguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXFByb2dyYW0uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXEF0b21pYy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cRXJybm8uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3lzdGVtXEhvc3QuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxNYW5hZ2VkU3RhdGljLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN1cHBvcnRcQWxsb2NhdG9yLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFN5c3RlbVxNZW1vcnkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcU3VwcG9ydFxjaXJjdWxhcl9yYXdfb3N0cmVhbS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxTeXN0ZW1cVmFsZ3JpbmQuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxBUk1EZWNvZGVyRW1pdHRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxBc21NYXRjaGVyRW1pdHRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxBc21Xcml0ZXJFbWl0dGVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEFzbVdyaXRlckluc3QuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ2FsbGluZ0NvbnZFbWl0dGVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENsYW5nQVNUTm9kZXNFbWl0dGVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENsYW5nQXR0ckVtaXR0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ2xhbmdEaWFnbm9zdGljc0VtaXR0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ29kZUVtaXR0ZXJHZW4uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cQ29kZUdlbkRBR1BhdHRlcm5zLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENvZGVHZW5JbnN0cnVjdGlvbi5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDb2RlR2VuSW50cmluc2ljcy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxDb2RlR2VuUmVnaXN0ZXJzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXENvZGVHZW5UYXJnZXQuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cREFHSVNlbEVtaXR0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cREFHSVNlbE1hdGNoZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cRGlzYXNzZW1ibGVyRW1pdHRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxFREVtaXR0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cRmFzdElTZWxFbWl0dGVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXEluc3RyRW51bUVtaXR0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cSW5zdHJJbmZvRW1pdHRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxJbnRyaW5zaWNFbWl0dGVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXExMVk1DQ29uZmlndXJhdGlvbkVtaXR0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cTmVvbkVtaXR0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cT3B0UGFyc2VyRW1pdHRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxSZWNvcmQuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cUmVnaXN0ZXJJbmZvRW1pdHRlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxTdHJpbmdUb09mZnNldFRhYmxlLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXFN1YnRhcmdldEVtaXR0ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cVGFibGVHZW5CYWNrZW5kLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXFRHTGV4ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cVEdQYXJzZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cWDg2RGlzYXNzZW1ibGVyU2hhcmVkLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHV0aWxzXFRhYmxlR2VuXFg4NkRpc2Fzc2VtYmxlclRhYmxlcy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlx1dGlsc1xUYWJsZUdlblxYODZNb2RSTUZpbHRlcnMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cdXRpbHNcVGFibGVHZW5cWDg2UmVjb2duaXphYmxlSW5zdHIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvVGFyZ2V0L1RhcmdldC52Y3hwcm9qIGIvc3JjL0xMVk0vd2luMzIvVGFyZ2V0L1RhcmdldC52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMzczMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi9UYXJnZXQvVGFyZ2V0LnZjeHByb2oKQEAgLTAsMCArMSwyOTAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH08L1Byb2plY3RHdWlkPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7X0RFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtfREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxTdWJ0YXJnZXRGZWF0dXJlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFRhcmdldERhdGEuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcVGFyZ2V0RnJhbWVJbmZvLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFRhcmdldEluc3RySW5mby5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxUYXJnZXRNYWNoaW5lLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFRhcmdldFJlZ2lzdGVySW5mby5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxUYXJnZXRTdWJ0YXJnZXQuY3BwIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcU3VidGFyZ2V0RmVhdHVyZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0RGF0YS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0RUxGV3JpdGVySW5mby5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0RnJhbWVJbmZvLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXFRhcmdldFxUYXJnZXRJbnN0ckRlc2MuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cVGFyZ2V0XFRhcmdldEluc3RySW5mby5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0SW5zdHJJdGluZXJhcmllcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0SklUSW5mby5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0TG93ZXJpbmcuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cVGFyZ2V0XFRhcmdldE1hY2hpbmUuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cVGFyZ2V0XFRhcmdldE1hY2hPV3JpdGVySW5mby5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0T3B0aW9ucy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXFRhcmdldFxUYXJnZXRTdWJ0YXJnZXQuaCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi9UYXJnZXQvVGFyZ2V0LnZjeHByb2ouZmlsdGVycyBiL3NyYy9MTFZNL3dpbjMyL1RhcmdldC9UYXJnZXQudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODU3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi9UYXJnZXQvVGFyZ2V0LnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDgwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzt4c2Q8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcU3VidGFyZ2V0RmVhdHVyZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcVGFyZ2V0RGF0YS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcVGFyZ2V0RnJhbWVJbmZvLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxUYXJnZXRJbnN0ckluZm8uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFRhcmdldE1hY2hpbmUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFRhcmdldFJlZ2lzdGVySW5mby5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcVGFyZ2V0U3VidGFyZ2V0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXFRhcmdldFxTdWJ0YXJnZXRGZWF0dXJlLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0RGF0YS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cVGFyZ2V0XFRhcmdldEVMRldyaXRlckluZm8uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXFRhcmdldFxUYXJnZXRGcmFtZUluZm8uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXFRhcmdldFxUYXJnZXRJbnN0ckRlc2MuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXFRhcmdldFxUYXJnZXRJbnN0ckluZm8uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXFRhcmdldFxUYXJnZXRJbnN0ckl0aW5lcmFyaWVzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0SklUSW5mby5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cVGFyZ2V0XFRhcmdldExvd2VyaW5nLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxUYXJnZXRcVGFyZ2V0TWFjaGluZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cVGFyZ2V0XFRhcmdldE1hY2hPV3JpdGVySW5mby5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cVGFyZ2V0XFRhcmdldE9wdGlvbnMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXFRhcmdldFxUYXJnZXRSZWdpc3RlckluZm8uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxsbHZtXFRhcmdldFxUYXJnZXRTdWJ0YXJnZXQuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvVHJhbnNmb3Jtcy9UcmFuc2Zvcm1zLnZjeHByb2ogYi9zcmMvTExWTS93aW4zMi9UcmFuc2Zvcm1zL1RyYW5zZm9ybXMudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTJiMTNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvVHJhbnNmb3Jtcy9UcmFuc2Zvcm1zLnZjeHByb2oKQEAgLTAsMCArMSwzMDggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+e0M1OTM3NEMxLTlGQzAtNDE0Ny1CODM2LTMyN0RGREM1MkQ5OX08L1Byb2plY3RHdWlkPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7X0RFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtfREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcU2NhbGFyXEFEQ0UuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxDb2RlR2VuUHJlcGFyZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcU2NhbGFyXERlYWRTdG9yZUVsaW1pbmF0aW9uLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xTY2FsYXJcR0VQU3BsaXR0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxHVk4uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxMSUNNLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xTY2FsYXJcTG9vcFN0cmVuZ3RoUmVkdWNlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xTY2FsYXJcUmVhc3NvY2lhdGUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxTY2FsYXJSZXBsQWdncmVnYXRlcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcU2NhbGFyXFNDQ1AuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxTaW1wbGlmeUNGR1Bhc3MuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXEFkZHJNb2RlTWF0Y2hlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcVXRpbHNcQmFzaWNCbG9ja1V0aWxzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xVdGlsc1xCcmVha0NyaXRpY2FsRWRnZXMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXERlbW90ZVJlZ1RvU3RhY2suY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXExDU1NBLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xVdGlsc1xMb2NhbC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcVXRpbHNcTG9vcFNpbXBsaWZ5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xVdGlsc1xMb3dlclN3aXRjaC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcVXRpbHNcUHJvbW90ZU1lbW9yeVRvUmVnaXN0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXFNpbXBsaWZ5Q0ZHLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xVdGlsc1xTU0FVcGRhdGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xVdGlsc1xVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0Q29tYmluZUFkZFN1Yi5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVBbmRPclhvci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVDYWxscy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVDYXN0cy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVDb21wYXJlcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVMb2FkU3RvcmVBbGxvY2EuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXEluc3RDb21iaW5lXEluc3RDb21iaW5lTXVsRGl2UmVtLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0Q29tYmluZVBISS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVTZWxlY3QuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXEluc3RDb21iaW5lXEluc3RDb21iaW5lU2hpZnRzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0Q29tYmluZVNpbXBsaWZ5RGVtYW5kZWQuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXEluc3RDb21iaW5lXEluc3RDb21iaW5lVmVjdG9yT3BzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0cnVjdGlvbkNvbWJpbmluZy5jcHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmUuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0Q29tYmluZVdvcmtsaXN0LmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcVXRpbHNcVmFsdWVNYXBwZXIuaCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi9UcmFuc2Zvcm1zL1RyYW5zZm9ybXMudmN4cHJvai5maWx0ZXJzIGIvc3JjL0xMVk0vd2luMzIvVHJhbnNmb3Jtcy9UcmFuc2Zvcm1zLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTJhMThmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvVHJhbnNmb3Jtcy9UcmFuc2Zvcm1zLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDE1MiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXg8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlc1xTY2FsYXIiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0ZjIxMjRkOC05NTRiLTQ5MGUtOTBhYi04ZDY1MzQzODJiOTF9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNcVXRpbHMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntlYTY3MWYzOS05ZjNlLTQ0NmUtODQwMy0zYTI2NDBmZTZiZDR9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNcSW5zdENvbWJpbmUiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntkYzRmOGM1ZS1kNjMzLTQ5OTgtYjc4YS0yNjRjNWEwMmIxZWV9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzXEluc3RDb21iaW5lIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjdkMzk4MmMtYzdkNC00ZDIxLWFjYzYtMGJiOGNhYWU0OTNifTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzXFNjYWxhciI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezJkZDI3Y2QxLTU2ZmYtNDE2MS05Y2I1LTk4ZmI1ZDVkMmUyNH08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlc1xVdGlscyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2IxZjMxOTlkLTFiY2ItNGNkZi04ZTM0LTRiY2IxY2VjMDkyMn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxBRENFLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2NhbGFyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxDb2RlR2VuUHJlcGFyZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNjYWxhcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xTY2FsYXJcR0VQU3BsaXR0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTY2FsYXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcU2NhbGFyXEdWTi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNjYWxhcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xTY2FsYXJcTElDTS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNjYWxhcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xTY2FsYXJcTG9vcFN0cmVuZ3RoUmVkdWNlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2NhbGFyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxTY2FsYXJSZXBsQWdncmVnYXRlcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNjYWxhcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xTY2FsYXJcU2ltcGxpZnlDRkdQYXNzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2NhbGFyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXEFkZHJNb2RlTWF0Y2hlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFV0aWxzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXEJhc2ljQmxvY2tVdGlscy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFV0aWxzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXEJyZWFrQ3JpdGljYWxFZGdlcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFV0aWxzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXERlbW90ZVJlZ1RvU3RhY2suY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xVdGlsczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xVdGlsc1xMQ1NTQS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFV0aWxzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXExvY2FsLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcVXRpbHM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcVXRpbHNcTG9vcFNpbXBsaWZ5LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcVXRpbHM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcVXRpbHNcTG93ZXJTd2l0Y2guY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xVdGlsczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xVdGlsc1xQcm9tb3RlTWVtb3J5VG9SZWdpc3Rlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFV0aWxzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXFNpbXBsaWZ5Q0ZHLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcVXRpbHM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcVXRpbHNcU1NBVXBkYXRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFV0aWxzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFV0aWxzXFVuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xVdGlsczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0Q29tYmluZUFkZFN1Yi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEluc3RDb21iaW5lPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXEluc3RDb21iaW5lXEluc3RDb21iaW5lQW5kT3JYb3IuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xJbnN0Q29tYmluZTwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0Q29tYmluZUNhbGxzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcSW5zdENvbWJpbmU8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVDYXN0cy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEluc3RDb21iaW5lPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXEluc3RDb21iaW5lXEluc3RDb21iaW5lQ29tcGFyZXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xJbnN0Q29tYmluZTwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0Q29tYmluZUxvYWRTdG9yZUFsbG9jYS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEluc3RDb21iaW5lPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXEluc3RDb21iaW5lXEluc3RDb21iaW5lTXVsRGl2UmVtLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcSW5zdENvbWJpbmU8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVQSEkuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xJbnN0Q29tYmluZTwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0Q29tYmluZVNlbGVjdC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEluc3RDb21iaW5lPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXEluc3RDb21iaW5lXEluc3RDb21iaW5lU2hpZnRzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcSW5zdENvbWJpbmU8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVTaW1wbGlmeURlbWFuZGVkLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcSW5zdENvbWJpbmU8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVWZWN0b3JPcHMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xJbnN0Q29tYmluZTwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xJbnN0Q29tYmluZVxJbnN0cnVjdGlvbkNvbWJpbmluZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEluc3RDb21iaW5lPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxTQ0NQLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2NhbGFyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUcmFuc2Zvcm1zXFNjYWxhclxEZWFkU3RvcmVFbGltaW5hdGlvbi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNjYWxhcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xTY2FsYXJcUmVhc3NvY2lhdGUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTY2FsYXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcSW5zdENvbWJpbmU8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRyYW5zZm9ybXNcSW5zdENvbWJpbmVcSW5zdENvbWJpbmVXb3JrbGlzdC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xJbnN0Q29tYmluZTwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVHJhbnNmb3Jtc1xVdGlsc1xWYWx1ZU1hcHBlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xVdGlsczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi9WTUNvcmUvVk1Db3JlLnZjeHByb2ogYi9zcmMvTExWTS93aW4zMi9WTUNvcmUvVk1Db3JlLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkNzk4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL1ZNQ29yZS9WTUNvcmUudmN4cHJvagpAQCAtMCwwICsxLDM0NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJQcm9maWxlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5Qcm9maWxlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJQcm9maWxlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfTwvUHJvamVjdEd1aWQ+DQorICAgIDxSb290TmFtZXNwYWNlPlZNQ29yZTwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDMxOS4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO19ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpVk1Db3JlLmxpYjwvT3V0cHV0RmlsZT4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7X0RFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7TkRFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUztfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+ZmFsc2U8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+ZmFsc2U8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcQXNtV3JpdGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXEF0dHJpYnV0ZXMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcQmFzaWNCbG9jay5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxDb25zdGFudEZvbGQuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcQ29uc3RhbnRzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXERlYnVnTG9jLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXERvbWluYXRvcnMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcRnVuY3Rpb24uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcR2xvYmFscy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxHVk1hdGVyaWFsaXplci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxJbmxpbmVBc20uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcSW5zdHJ1Y3Rpb24uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcSW5zdHJ1Y3Rpb25zLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXEludHJpbnNpY0luc3QuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcSVJCdWlsZGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXExlYWtEZXRlY3Rvci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxMTFZNQ29udGV4dC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxMTFZNQ29udGV4dEltcGwuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcTWV0YWRhdGEuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcTW9kdWxlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXFBhc3MuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcUGFzc01hbmFnZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcUGFzc1JlZ2lzdHJ5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXFByaW50TW9kdWxlUGFzcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxUeXBlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXFR5cGVTeW1ib2xUYWJsZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxVc2UuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcVmFsdWUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcVmFsdWVTeW1ib2xUYWJsZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxWYWx1ZVR5cGVzLmNwcCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEN1c3RvbUJ1aWxkIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxJbnRyaW5zaWNzLnRkIj4NCisgICAgICA8TWVzc2FnZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+UGVyZm9ybWluZyBUYWJsZUdlbiBTdGVwPC9NZXNzYWdlPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5lY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGNvZGUgZW1pdHRlciB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWludHJpbnNpYyAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vICQoUHJvamVjdERpcikuLlxsbHZtXGludHJpbnNpY3MuZ2VuPC9Db21tYW5kPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5wdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGU7JShSb290RGlyKSUoRGlyZWN0b3J5KUludHJpbnNpY3NYODYudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KUludHJpbnNpY3NQb3dlclBDLnRkPC9BZGRpdGlvbmFsSW5wdXRzPg0KKyAgICAgIDxPdXRwdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFByb2plY3REaXIpLi5cbGx2bVxpbnRyaW5zaWNzLmdlbjslKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICAgIDxNZXNzYWdlIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+UGVyZm9ybWluZyBUYWJsZUdlbiBTdGVwPC9NZXNzYWdlPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBjb2RlIGVtaXR0ZXIgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1pbnRyaW5zaWMgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyAkKFByb2plY3REaXIpLi5cbGx2bVxpbnRyaW5zaWNzLmdlbjwvQ29tbWFuZD4NCisgICAgICA8QWRkaXRpb25hbElucHV0cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZTslKFJvb3REaXIpJShEaXJlY3RvcnkpSW50cmluc2ljc1g4Ni50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpSW50cmluc2ljc1Bvd2VyUEMudGQ8L0FkZGl0aW9uYWxJbnB1dHM+DQorICAgICAgPE91dHB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFByb2plY3REaXIpLi5cbGx2bVxpbnRyaW5zaWNzLmdlbjslKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICAgIDxNZXNzYWdlIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPlBlcmZvcm1pbmcgVGFibGVHZW4gU3RlcDwvTWVzc2FnZT4NCisgICAgICA8TWVzc2FnZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj5QZXJmb3JtaW5nIFRhYmxlR2VuIFN0ZXA8L01lc3NhZ2U+DQorICAgICAgPENvbW1hbmQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBjb2RlIGVtaXR0ZXIgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1pbnRyaW5zaWMgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyAkKFByb2plY3REaXIpLi5cbGx2bVxpbnRyaW5zaWNzLmdlbjwvQ29tbWFuZD4NCisgICAgICA8Q29tbWFuZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj5lY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGNvZGUgZW1pdHRlciB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWludHJpbnNpYyAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vICQoUHJvamVjdERpcikuLlxsbHZtXGludHJpbnNpY3MuZ2VuPC9Db21tYW5kPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5wdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZTslKFJvb3REaXIpJShEaXJlY3RvcnkpSW50cmluc2ljc1g4Ni50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpSW50cmluc2ljc1Bvd2VyUEMudGQ8L0FkZGl0aW9uYWxJbnB1dHM+DQorICAgICAgPEFkZGl0aW9uYWxJbnB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlOyUoUm9vdERpciklKERpcmVjdG9yeSlJbnRyaW5zaWNzWDg2LnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlJbnRyaW5zaWNzUG93ZXJQQy50ZDwvQWRkaXRpb25hbElucHV0cz4NCisgICAgICA8T3V0cHV0cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFByb2plY3REaXIpLi5cbGx2bVxpbnRyaW5zaWNzLmdlbjslKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICAgIDxPdXRwdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUHJvamVjdERpcikuLlxsbHZtXGludHJpbnNpY3MuZ2VuOyUoT3V0cHV0cyk8L091dHB1dHM+DQorICAgICAgPE1lc3NhZ2UgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPlBlcmZvcm1pbmcgVGFibGVHZW4gU3RlcDwvTWVzc2FnZT4NCisgICAgICA8TWVzc2FnZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+UGVyZm9ybWluZyBUYWJsZUdlbiBTdGVwPC9NZXNzYWdlPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5lY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGNvZGUgZW1pdHRlciB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWludHJpbnNpYyAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vICQoUHJvamVjdERpcikuLlxsbHZtXGludHJpbnNpY3MuZ2VuPC9Db21tYW5kPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj5lY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGNvZGUgZW1pdHRlciB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWludHJpbnNpYyAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vICQoUHJvamVjdERpcikuLlxsbHZtXGludHJpbnNpY3MuZ2VuPC9Db21tYW5kPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5wdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGU7JShSb290RGlyKSUoRGlyZWN0b3J5KUludHJpbnNpY3NYODYudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KUludHJpbnNpY3NQb3dlclBDLnRkPC9BZGRpdGlvbmFsSW5wdXRzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5wdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGU7JShSb290RGlyKSUoRGlyZWN0b3J5KUludHJpbnNpY3NYODYudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KUludHJpbnNpY3NQb3dlclBDLnRkPC9BZGRpdGlvbmFsSW5wdXRzPg0KKyAgICAgIDxPdXRwdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFByb2plY3REaXIpLi5cbGx2bVxpbnRyaW5zaWNzLmdlbjslKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICAgIDxPdXRwdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFByb2plY3REaXIpLi5cbGx2bVxpbnRyaW5zaWNzLmdlbjslKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICA8L0N1c3RvbUJ1aWxkPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cSW5zdHJ1Y3Rpb24uZGVmIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cSW50cmluc2ljc1Bvd2VyUEMudGQiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxJbnRyaW5zaWNzWDg2LnRkIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbHZtXGludHJpbnNpY3MuZ2VuIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcQ29uc3RhbnRGb2xkLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxDb25zdGFudHNDb250ZXh0LmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxMZWFrc0NvbnRleHQuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXExMVk1Db250ZXh0SW1wbC5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcU3ltYm9sVGFibGVMaXN0VHJhaXRzSW1wbC5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcVHlwZXNDb250ZXh0LmgiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIvVk1Db3JlL1ZNQ29yZS52Y3hwcm9qLmZpbHRlcnMgYi9zcmMvTExWTS93aW4zMi9WTUNvcmUvVk1Db3JlLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMzY2U4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIvVk1Db3JlL1ZNQ29yZS52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSwxNDcgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214PC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iR2VuZXJhdGVkIFRhYmxlZ2VuIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OWViZjRhZTYtZmJmMS00YjFlLTg2MTAtOTlkM2JiMWJhZWEyfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgPC9GaWx0ZXI+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxBc21Xcml0ZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXEF0dHJpYnV0ZXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXEJhc2ljQmxvY2suY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXENvbnN0YW50Rm9sZC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcQ29uc3RhbnRzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxEZWJ1Z0xvYy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcRG9taW5hdG9ycy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcRnVuY3Rpb24uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXEdsb2JhbHMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXEdWTWF0ZXJpYWxpemVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxJbmxpbmVBc20uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXEluc3RydWN0aW9uLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxJbnN0cnVjdGlvbnMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXEludHJpbnNpY0luc3QuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXElSQnVpbGRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcTGVha0RldGVjdG9yLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxMTFZNQ29udGV4dC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcTExWTUNvbnRleHRJbXBsLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxNZXRhZGF0YS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcTW9kdWxlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxQYXNzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxQYXNzTWFuYWdlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcUGFzc1JlZ2lzdHJ5LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxQcmludE1vZHVsZVBhc3MuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXFR5cGUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXFR5cGVTeW1ib2xUYWJsZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcVXNlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxWYWx1ZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcVmFsdWVTeW1ib2xUYWJsZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcVmFsdWVUeXBlcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cSW5zdHJ1Y3Rpb24uZGVmIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxJbnRyaW5zaWNzUG93ZXJQQy50ZCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXGxsdm1cSW50cmluc2ljc1g4Ni50ZCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxsbHZtXGludHJpbnNpY3MuZ2VuIj4NCisgICAgICA8RmlsdGVyPkdlbmVyYXRlZCBUYWJsZWdlbiBGaWxlczwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxDb25zdGFudEZvbGQuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFZNQ29yZVxDb25zdGFudHNDb250ZXh0LmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcTGVha3NDb250ZXh0LmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcTExWTUNvbnRleHRJbXBsLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxWTUNvcmVcU3ltYm9sVGFibGVMaXN0VHJhaXRzSW1wbC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVk1Db3JlXFR5cGVzQ29udGV4dC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEN1c3RvbUJ1aWxkIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcbGx2bVxJbnRyaW5zaWNzLnRkIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0N1c3RvbUJ1aWxkPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL2RvYmlzb24uY21kIGIvc3JjL0xMVk0vd2luMzIvZG9iaXNvbi5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxNWM4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL2RvYmlzb24uY21kCkBAIC0wLDAgKzEsMjkgQEAKK0BlY2hvIG9mZg0KK3JlbSBkb2Jpc29uLmNtZCBwcmVmaXggbW9kZSB0YXJnZXQgc291cmNlDQorcmVtICAgcHJlZml4IC0gcGFzc2VkIHRvIGJpc29uIGFzIC1wPHByZWZpeD4NCityZW0gICBtb2RlIC0gZWl0aGVyIGRlYnVnIG9yIHJlbGVhc2UNCityZW0gICB0YXJnZXQgLSBnZW5lcmF0ZWQgcGFyc2VyIGZpbGUgbmFtZSB3aXRob3V0IGV4dGVuc2lvbg0KK3JlbSAgIHNvdXJjZSAtIGlucHV0IHRvIGJpc29uDQorcmVtICAgaGVhZGVyY29weWRpciAtIGRpcmVjdG9yeSB0byByZWNlaXZlIGEgY29weSBvZiB0aGUgaGVhZGVyDQorDQoraWYgIiUyIj09ImRlYnVnIiAoc2V0IGZsYWdzPS10dmRvKSBlbHNlIChzZXQgZmxhZ3M9LXZkbykNCisNCityZW0gVGVzdCBmb3IgcHJlc2VuY2Ugb2YgYmlzb24uDQorYmlzb24gLS1oZWxwID5OVUwNCitpZiBlcnJvcmxldmVsIDEgZ290byBub2Jpc29uDQorDQorcmVtIFJ1biBiaXNvbi4NCitlY2hvIGJpc29uIC1wJTEgJWZsYWdzJSUzLmNwcCAlNA0KK2VjaG8gbW92ZSAlMy5ocHAgJTMuaA0KK2Jpc29uIC1wJTEgJWZsYWdzJSUzLmNwcCAlNCAmJiBtb3ZlICUzLmhwcCAlMy5oDQorZWNobyBjb3B5ICUzLmggJTUNCitjb3B5ICUzLmggJTUNCitleGl0DQorDQorOm5vYmlzb24NCitlY2hvIEJpc29uIG5vdCBmb3VuZC4gIFVzaW5nIHByZS1nZW5lcmF0ZWQgZmlsZXMuDQorY29weSAlfnBuNC5jcHAuY3ZzIC5cJTMuY3BwDQorY29weSAlfnBuNC5jcHAuY3ZzICU1XCUzLmNwcA0KK2NvcHkgJX5wbjQuaC5jdnMgLlwlMy5oDQorY29weSAlfnBuNC5oLmN2cyAlNVwlMy5oDQorZXhpdA0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL2RvZmxleC5jbWQgYi9zcmMvTExWTS93aW4zMi9kb2ZsZXguY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2E3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi9kb2ZsZXguY21kCkBAIC0wLDAgKzEsMjAgQEAKK0BlY2hvIG9mZg0KK3JlbSBkb2ZsZXguY21kIHByZWZpeCBtb2RlIHRhcmdldCBzb3VyY2UNCityZW0gICBtb2RlIC0gZWl0aGVyIGRlYnVnIG9yIHJlbGVhc2UNCityZW0gICB0YXJnZXQgLSBnZW5lcmF0ZWQgcGFyc2VyIGZpbGUgbmFtZSB3aXRob3V0IGV4dGVuc2lvbg0KK3JlbSAgIHNvdXJjZSAtIGlucHV0IHRvIGJpc29uDQorDQoraWYgIiUxIj09ImRlYnVnIiAoc2V0IGZsYWdzPS10KSBlbHNlIChzZXQgZmxhZ3M9LXQpDQorDQorcmVtIFRlc3QgZm9yIHByZXNlbmNlIG9mIGZsZXguDQorZmxleCAtLWhlbHAgPk5VTA0KK2lmIGVycm9ybGV2ZWwgMSBnb3RvIG5vZmxleA0KKw0KK3JlbSBSdW4gZmxleC4NCitmbGV4ICVmbGFncyUgPiUyLmNwcCAlMw0KK2V4aXQNCisNCis6bm9mbGV4DQorZWNobyBGbGV4IG5vdCBmb3VuZC4gIFVzaW5nIHByZS1nZW5lcmF0ZWQgZmlsZXMuDQorY29weSAlfnBuMy5jcHAuY3ZzICUyLmNwcA0KK2V4aXQNCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi9sbHZtL0NvbmZpZy9jb25maWcuaCBiL3NyYy9MTFZNL3dpbjMyL2xsdm0vQ29uZmlnL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTY0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi9sbHZtL0NvbmZpZy9jb25maWcuaApAQCAtMCwwICsxLDYzNSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIENyZWF0ZWQgYnkgS2V2aW4gZnJvbSBjb25maWcuaC5pbiAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENPTkZJR19ICisjZGVmaW5lIENPTkZJR19ICisKKy8qIERlZmluZSBpZiBkbG9wZW4oMCkgd2lsbCBvcGVuIHRoZSBzeW1ib2xzIG9mIHRoZSBwcm9ncmFtICovCisjdW5kZWYgQ0FOX0RMT1BFTl9TRUxGCisKKy8qIERlZmluZSBpZiBDQkUgaXMgZW5hYmxlZCBmb3IgcHJpbnRmICVhIG91dHB1dCAqLworI3VuZGVmIEVOQUJMRV9DQkVfUFJJTlRGX0EKKworLyogRGlyZWN0b3JpZXMgY2xhbmcgd2lsbCBzZWFyY2ggZm9yIGhlYWRlcnMgKi8KKyNkZWZpbmUgQ19JTkNMVURFX0RJUlMgIiIKKworLyogRGlyZWN0b3J5IGNsYW5nIHdpbGwgc2VhcmNoIGZvciBsaWJzdGRjKysgaGVhZGVycyAqLworI2RlZmluZSBDWFhfSU5DTFVERV9ST09UICIiCisKKy8qIEFyY2hpdGVjdHVyZSBvZiBsaWJzdGRjKysgaGVhZGVycyAqLworI2RlZmluZSBDWFhfSU5DTFVERV9BUkNIICIiCisKKy8qIDMyIGJpdCBtdWx0aWxpYiBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgQ1hYX0lOQ0xVREVfMzJCSVRfRElSICIiCisKKy8qIDY0IGJpdCBtdWx0aWxpYiBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgQ1hYX0lOQ0xVREVfNjRCSVRfRElSICIiCisKKy8qIERlZmluZSBpZiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIGlzIGVuYWJsZWQgKi8KKy8qICN1bmRlZiBFTkFCTEVfUElDICovCisKKy8qIERlZmluZSBpZiB0aHJlYWRzIGVuYWJsZWQgKi8KKyNkZWZpbmUgRU5BQkxFX1RIUkVBRFMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyZ3pfYXBwZW5kJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0FSR1pfQVBQRU5ECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXJnel9jcmVhdGVfc2VwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0FSR1pfQ1JFQVRFX1NFUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9BUkdaX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhcmd6X2luc2VydCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BUkdaX0lOU0VSVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyZ3pfbmV4dCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BUkdaX05FWFQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhcmd6X3N0cmluZ2lmeScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BUkdaX1NUUklOR0lGWQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFzc2VydC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9BU1NFUlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYmFja3RyYWNlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0JBQ0tUUkFDRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJjb3B5JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0JDT1BZCisKKy8qIERvZXMgbm90IGhhdmUgYmktZGlyZWN0aW9uYWwgaXRlcmF0b3IgKi8KKyN1bmRlZiBIQVZFX0JJX0lURVJBVE9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY2VpbGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0NFSUxGIDEKKworLyogRGVmaW5lIGlmIHRoZSBuZWF0IHByb2dyYW0gaXMgYXZhaWxhYmxlICovCisvKiAjdW5kZWYgSEFWRV9DSVJDTyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNsb3NlZGlyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0NMT1NFRElSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y3R5cGUuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9DVFlQRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4KKyAgICovCisvKiAjdW5kZWYgSEFWRV9ESVJFTlRfSCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEdOVSBkbGQgbGlicmFyeS4gKi8KKyN1bmRlZiBIQVZFX0RMRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0RMRF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZGxlcnJvcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9ETEVSUk9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9ETEZDTl9IICovCisKKy8qIERlZmluZSBpZiBkbG9wZW4oKSBpcyBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4gKi8KKyN1bmRlZiBIQVZFX0RMT1BFTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfRExfSCAqLworCisvKiBEZWZpbmUgaWYgdGhlIGRvdCBwcm9ncmFtIGlzIGF2YWlsYWJsZSAqLworLyogI3VuZGVmIEhBVkVfRE9UICovCisKKy8qIERlZmluZSBpZiB0aGUgZG90dHkgcHJvZ3JhbSBpcyBhdmFpbGFibGUgKi8KKy8qICN1bmRlZiBIQVZFX0RPVFRZICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX2R5bGRfZnVuY19sb29rdXAgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9EWUxECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRVJSTk9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBlcnJvcl90Jy4gKi8KKyN1bmRlZiBIQVZFX0VSUk9SX1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxleGVjaW5mby5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0VYRUNJTkZPX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKworLyogRGVmaW5lIGlmIHRoZSBuZWF0IHByb2dyYW0gaXMgYXZhaWxhYmxlICovCisvKiAjdW5kZWYgSEFWRV9GRFAgKi8KKworLyogU2V0IHRvIDEgaWYgdGhlIGZpbml0ZSBmdW5jdGlvbiBpcyBmb3VuZCBpbiA8aWVlZWZwLmg+ICovCisvKiAjdW5kZWYgSEFWRV9GSU5JVEVfSU5fSUVFRUZQX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbG9vcmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZMT09SRiAxCisKKy8qIERvZXMgbm90IGhhdmUgZm9yd2FyZCBpdGVyYXRvciAqLworI3VuZGVmIEhBVkVfRldEX0lURVJBVE9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Y3dkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVENXRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBhZ2VzaXplJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cmxpbWl0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFJMSU1JVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHJ1c2FnZScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9HRVRSVVNBR0UgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR0aW1lb2ZkYXknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZCisKKy8qIERvZXMgbm90IGhhdmUgPGhhc2hfbWFwPiAqLworI3VuZGVmIEhBVkVfR0xPQkFMX0hBU0hfTUFQCisKKy8qIERvZXMgbm90IGhhdmUgaGFzaF9zZXQgaW4gZ2xvYmFsIG5hbWVzcGFjZSAqLworI3VuZGVmIEhBVkVfR0xPQkFMX0hBU0hfU0VUCisKKy8qIERvZXMgbm90IGhhdmUgZXh0L2hhc2hfbWFwICovCisjdW5kZWYgSEFWRV9HTlVfRVhUX0hBU0hfTUFQCisKKy8qIERvZXMgbm90IGhhdmUgaGFzaF9zZXQgaW4gZ251IG5hbWVzcGFjZSAqLworI3VuZGVmIEhBVkVfR05VX0VYVF9IQVNIX1NFVAorCisvKiBEZWZpbmUgaWYgdGhlIEdyYXBodml6IHByb2dyYW0gaXMgYXZhaWxhYmxlICovCisjdW5kZWYgSEFWRV9HUkFQSFZJWgorCisvKiBEZWZpbmUgaWYgdGhlIGd2IHByb2dyYW0gaXMgYXZhaWxhYmxlICovCisvKiAjdW5kZWYgSEFWRV9HViAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluZGV4JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0lOREVYCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBpbnQ2NF90Jy4gKi8KKyN1bmRlZiBIQVZFX0lOVDY0X1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0lOVFRZUEVTX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc2F0dHknIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0lTQVRUWSAxCisKKy8qIFNldCB0byAxIGlmIHRoZSBpc2luZiBmdW5jdGlvbiBpcyBmb3VuZCBpbiA8Y21hdGg+ICovCisvKiAjdW5kZWYgSEFWRV9JU0lORl9JTl9DTUFUSCAqLworCisvKiBTZXQgdG8gMSBpZiB0aGUgaXNpbmYgZnVuY3Rpb24gaXMgZm91bmQgaW4gPG1hdGguaD4gKi8KKy8qICN1bmRlZiBIQVZFX0lTSU5GX0lOX01BVEhfSCAqLworCisvKiBTZXQgdG8gMSBpZiB0aGUgaXNuYW4gZnVuY3Rpb24gaXMgZm91bmQgaW4gPGNtYXRoPiAqLworLyogI3VuZGVmIEhBVkVfSVNOQU5fSU5fQ01BVEggKi8KKworLyogU2V0IHRvIDEgaWYgdGhlIGlzbmFuIGZ1bmN0aW9uIGlzIGZvdW5kIGluIDxtYXRoLmg+ICovCisvKiAjdW5kZWYgSEFWRV9JU05BTl9JTl9NQVRIX0ggKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBsaWJkbCBsaWJyYXJ5IG9yIGVxdWl2YWxlbnQuICovCisjdW5kZWYgSEFWRV9MSUJETAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGltYWdlaGxwJyBsaWJyYXJ5ICgtbGltYWdlaGxwKS4gKi8KKy8qICN1bmRlZiBIQVZFX0xJQklNQUdFSExQICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbScgbGlicmFyeSAoLWxtKS4gKi8KKyN1bmRlZiBIQVZFX0xJQk0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwc2FwaScgbGlicmFyeSAoLWxwc2FwaSkuICovCisvKiAjdW5kZWYgSEFWRV9MSUJQU0FQSSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB0aHJlYWQnIGxpYnJhcnkgKC1scHRocmVhZCkuICovCisvKiAjdW5kZWYgSEFWRV9MSUJQVEhSRUFEICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdWRpczg2JyBsaWJyYXJ5ICgtbHVkaXM4NikuICovCisjdW5kZWYgSEFWRV9MSUJVRElTODYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTElNSVRTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbmsuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9MSU5LX0ggKi8KKworLyogRGVmaW5lIGlmIHlvdSBjYW4gdXNlIC1XbCwtUi4gdG8gcGFzcyAtUi4gdG8gdGhlIGxpbmtlciwgaW4gb3JkZXIgdG8gYWRkCisgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIGR5bmFtaWMgbGlua2VyIHNlYXJjaCBwYXRoLiAqLworI3VuZGVmIEhBVkVfTElOS19SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9uZ2ptcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9MT05HSk1QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFjaC9tYWNoLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUFDSF9NQUNIX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoLW8vZHlsZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01BQ0hfT19EWUxEX0gKKworLyogRGVmaW5lIGlmIG1hbGxpbmZvKCkgaXMgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uICovCisvKiAjdW5kZWYgSEFWRV9NQUxMSU5GTyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9NQUxMT0NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jL21hbGxvYy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX01BTExPQ19NQUxMT0NfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1hbGxvY196b25lX3N0YXRpc3RpY3MnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfTUFMTE9DX1pPTkVfU1RBVElTVElDUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbWNweScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9NRU1DUFkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1tb3ZlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01FTU1PVkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rZHRlbXAnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfTUtEVEVNUCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rc3RlbXAnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfTUtTVEVNUCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rdGVtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9NS1RFTVAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIGlmIG1tYXAoKSB1c2VzIE1BUF9BTk9OWU1PVVMgdG8gbWFwIGFub255bW91cyBwYWdlcywgb3IgdW5kZWZpbmUgaWYKKyAgIGl0IHVzZXMgTUFQX0FOT04gKi8KKyN1bmRlZiBIQVZFX01NQVBfQU5PTllNT1VTCisKKy8qIERlZmluZSBpZiBtbWFwKCkgY2FuIG1hcCBmaWxlcyBpbnRvIG1lbW9yeSAqLworI3VuZGVmIEhBVkVfTU1BUF9GSUxFCisKKy8qIGRlZmluZSBpZiB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBuYW1lc3BhY2VzICovCisjdW5kZWYgSEFWRV9OQU1FU1BBQ0VTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuICovCisvKiAjdW5kZWYgSEFWRV9ORElSX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuZWFyYnlpbnRmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX05FQVJCWUlOVEYgKi8KKworLyogRGVmaW5lIGlmIHRoZSBuZWF0IHByb2dyYW0gaXMgYXZhaWxhYmxlICovCisvKiAjdW5kZWYgSEFWRV9ORUFUTyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG9wZW5kaXInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfT1BFTkRJUgorCisvKiBEZWZpbmUgaWYgbGlidG9vbCBjYW4gZXh0cmFjdCBzeW1ib2wgbGlzdHMgZnJvbSBvYmplY3QgZmlsZXMuICovCisjdW5kZWYgSEFWRV9QUkVMT0FERURfU1lNQk9MUworCisvKiBEZWZpbmUgdG8gaGF2ZSB0aGUgJWEgZm9ybWF0IHN0cmluZyAqLworI3VuZGVmIEhBVkVfUFJJTlRGX0EKKworLyogSGF2ZSBwdGhyZWFkLmggKi8KKy8qICN1bmRlZiBIQVZFX1BUSFJFQURfSCAqLworCisvKiBIYXZlIHB0aHJlYWRfbXV0ZXhfbG9jayAqLworLyogI3VuZGVmIEhBVkVfUFRIUkVBRF9NVVRFWF9MT0NLICovCisKKy8qIEhhdmUgcHRocmVhZF9yd2xvY2tfaW5pdCAqLworLyogI3VuZGVmIEhBVkVfUFRIUkVBRF9SV0xPQ0tfSU5JVCAqLworCisvKiBIYXZlIHB0aHJlYWRfZ2V0c3BlY2lmaWMgKi8KKy8qICN1bmRlZiBIQVZFX1BUSFJFQURfR0VUU1BFQ0lGSUMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgc3JhbmQ0OC9scmFuZDQ4L2RyYW5kNDggZXhpc3QgaW4gPHN0ZGxpYi5oPiAqLworI3VuZGVmIEhBVkVfUkFORDQ4CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmVhZGRpcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9SRUFERElSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmVhbHBhdGgnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUkVBTFBBVEgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByaW5kZXgnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUklOREVYCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmludGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUklOVEYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByb3VuZGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUk9VTkRGCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcm91bmQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfUk9VTkQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzYnJrJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1NCUksgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRlbnYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfU0VURU5WICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0am1wJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVEpNUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNldGptcC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TRVRKTVBfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmxpbWl0JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1NFVFJMSU1JVCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNobF9sb2FkIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0hMX0xPQUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdsb25nam1wJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NJR0xPTkdKTVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ3NldGptcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TSUdTRVRKTVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9TVERJTlRfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGlvLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURElPX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qIERvZXMgbm90IGhhdmUgZXh0L2hhc2hfbWFwPiAqLworI3VuZGVmIEhBVkVfU1REX0VYVF9IQVNIX01BUAorCisvKiBEb2VzIG5vdCBoYXZlIGhhc2hfc2V0IGluIHN0ZCBuYW1lc3BhY2UgKi8KKyN1bmRlZiBIQVZFX1NURF9FWFRfSEFTSF9TRVQKKworLyogU2V0IHRvIDEgaWYgdGhlIHN0ZDo6aXNpbmYgZnVuY3Rpb24gaXMgZm91bmQgaW4gPGNtYXRoPiAqLworI3VuZGVmIEhBVkVfU1REX0lTSU5GX0lOX0NNQVRICisKKy8qIFNldCB0byAxIGlmIHRoZSBzdGQ6OmlzbmFuIGZ1bmN0aW9uIGlzIGZvdW5kIGluIDxjbWF0aD4gKi8KKyN1bmRlZiBIQVZFX1NURF9JU05BTl9JTl9DTUFUSAorCisvKiBEb2VzIG5vdCBoYXZlIHN0ZCBuYW1lc3BhY2UgaXRlcmF0b3IgKi8KKyN1bmRlZiBIQVZFX1NURF9JVEVSQVRPUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNocicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjbXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSQ01QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZHVwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkRVUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JfcicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJFUlJPUl9SICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JfcycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSRVJST1JfUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RycmNocicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJSQ0hSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9sbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSVE9MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9xJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlRPUQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN5c2NvbmYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1lTQ09ORgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLgorICAgKi8KKy8qICN1bmRlZiBIQVZFX1NZU19ESVJfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kbC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19ETF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY3RsLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX0lPQ1RMX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW1hbi5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19NTUFOX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuCisgICAqLworLyogI3VuZGVmIEhBVkVfU1lTX05ESVJfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19QQVJBTV9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19USU1FX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuICovCisvKiAjdW5kZWYgSEFWRV9TWVNfV0FJVF9IICovCisKKy8qIERlZmluZSBpZiB0aGUgbmVhdCBwcm9ncmFtIGlzIGF2YWlsYWJsZSAqLworLyogI3VuZGVmIEhBVkVfVFdPUEkgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVpbnQ2NF90Jy4gKi8KKyN1bmRlZiBIQVZFX1VJTlQ2NF9UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dGVybWlvcy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1RFUk1JT1NfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1VOSVNURF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dXRpbWUuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9VVElNRV9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1X2ludDY0X3QnLiAqLworI3VuZGVmIEhBVkVfVV9JTlQ2NF9UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dmFsZ3JpbmQvdmFsZ3JpbmQuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9WQUxHUklORF9WQUxHUklORF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d2luZG93cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9XSU5ET1dTX0ggMQorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBiaW5hcnkgZXhlY3V0YWJsZXMgKi8KKyN1bmRlZiBMTFZNX0JJTkRJUgorCisvKiBUaW1lIGF0IHdoaWNoIExMVk0gd2FzIGNvbmZpZ3VyZWQgKi8KKyN1bmRlZiBMTFZNX0NPTkZJR1RJTUUKKworLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgZG9jdW1lbnRhdGlvbiAqLworI3VuZGVmIExMVk1fREFUQURJUgorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBjb25maWcgZmlsZXMgKi8KKyN1bmRlZiBMTFZNX0VUQ0RJUgorCisvKiBIb3N0IHRyaXBsZSB3ZSB3ZXJlIGJ1aWx0IG9uICovCisjZGVmaW5lIExMVk1fSE9TVFRSSVBMRSAiaTY4Ni1wYy13aW4zMiIKKworLyogSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgaW5jbHVkZSBmaWxlcyAqLworI3VuZGVmIExMVk1fSU5DTFVERURJUgorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciAuaW5mbyBmaWxlcyAqLworI3VuZGVmIExMVk1fSU5GT0RJUgorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBsaWJyYXJpZXMgKi8KKyN1bmRlZiBMTFZNX0xJQkRJUgorCisvKiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBtYW4gcGFnZXMgKi8KKyN1bmRlZiBMTFZNX01BTkRJUgorCisvKiBCdWlsZCBtdWx0aXRocmVhZGluZyBzdXBwb3J0IGludG8gTExWTSAqLworI2RlZmluZSBMTFZNX01VTFRJVEhSRUFERUQgMQorCisvKiBEZWZpbmUgaWYgdGhpcyBpcyBVbml4aXNoIHBsYXRmb3JtICovCisvKiAjdW5kZWYgTExWTV9PTl9VTklYICovCisKKy8qIERlZmluZSBpZiB0aGlzIGlzIFdpbjMyaXNoIHBsYXRmb3JtICovCisjZGVmaW5lIExMVk1fT05fV0lOMzIgMQorCisvKiBBZGRlZCBieSBLZXZpbiAtLSBNYXhpbXVtIHBhdGggbGVuZ3RoICovCisjZGVmaW5lIE1BWFBBVEhMRU4gMTYwCisKKy8qIERlZmluZSB0byBwYXRoIHRvIGNpcmNvIHByb2dyYW0gaWYgZm91bmQgb3IgJ2VjaG8gY2lyY28nIG90aGVyd2lzZSAqLworLyogI3VuZGVmIExMVk1fUEFUSF9DSVJDTyAqLworCisvKiBEZWZpbmUgdG8gcGF0aCB0byBkb3QgcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBkb3QnIG90aGVyd2lzZSAqLworLyogI3VuZGVmIExMVk1fUEFUSF9ET1QgKi8KKworLyogRGVmaW5lIHRvIHBhdGggdG8gZG90dHkgcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBkb3R0eScgb3RoZXJ3aXNlICovCisvKiAjdW5kZWYgTExWTV9QQVRIX0RPVFRZICovCisKKy8qIERlZmluZSB0byBwYXRoIHRvIGZkcCBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIGZkcCcgb3RoZXJ3aXNlICovCisvKiAjdW5kZWYgTExWTV9QQVRIX0ZEUCAqLworCisvKiBEZWZpbmUgdG8gcGF0aCB0byBHcmFwaHZpeiBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIEdyYXBodml6JyBvdGhlcndpc2UgKi8KKyN1bmRlZiBMTFZNX1BBVEhfR1JBUEhWSVoKKworLyogRGVmaW5lIHRvIHBhdGggdG8gZ3YgcHJvZ3JhbSBpZiBmb3VuZCBvciAnZWNobyBndicgb3RoZXJ3aXNlICovCisvKiAjdW5kZWYgTExWTV9QQVRIX0dWICovCisKKy8qIERlZmluZSB0byBwYXRoIHRvIG5lYXRvIHByb2dyYW0gaWYgZm91bmQgb3IgJ2VjaG8gbmVhdG8nIG90aGVyd2lzZSAqLworLyogI3VuZGVmIExMVk1fUEFUSF9ORUFUTyAqLworCisvKiBEZWZpbmUgdG8gcGF0aCB0byB0d29waSBwcm9ncmFtIGlmIGZvdW5kIG9yICdlY2hvIHR3b3BpJyBvdGhlcndpc2UgKi8KKy8qICN1bmRlZiBMTFZNX1BBVEhfVFdPUEkgKi8KKworLyogSW5zdGFsbGF0aW9uIHByZWZpeCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgTExWTV9QUkVGSVggIkM6L1Byb2dyYW0gRmlsZXMgKHg4NikvTExWTSIKKworLyogRGVmaW5lIGlmIHRoZSBPUyBuZWVkcyBoZWxwIHRvIGxvYWQgZGVwZW5kZW50IGxpYnJhcmllcyBmb3IgZGxvcGVuKCkuICovCisjZGVmaW5lIExURExfRExPUEVOX0RFUExJQlMgMQorCisvKiBEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLgorICAgKi8KKyN1bmRlZiBMVERMX09CSkRJUgorCisvKiBEZWZpbmUgdG8gdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgZHluYW1pYworICAgbGlicmFyeSBzZWFyY2ggcGF0aC4gKi8KKyNkZWZpbmUgTFRETF9TSExJQlBBVEhfVkFSICJQQVRIIgorCisvKiBEZWZpbmUgdG8gdGhlIGV4dGVuc2lvbiB1c2VkIGZvciBzaGFyZWQgbGlicmFyaWVzLCBzYXksICIuc28iLiAqLworI2RlZmluZSBMVERMX1NITElCX0VYVCAiLmRsbCIKKworLyogRGVmaW5lIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAqLworLyogI3VuZGVmIExURExfU1lTU0VBUkNIUEFUSCAqLworCisvKiBEZWZpbmUgaWYgL2Rldi96ZXJvIHNob3VsZCBiZSB1c2VkIHdoZW4gbWFwcGluZyBSV1ggbWVtb3J5LCBvciB1bmRlZmluZSBpZgorICAgaXRzIG5vdCBuZWNlc3NhcnkgKi8KKyN1bmRlZiBORUVEX0RFVl9aRVJPX0ZPUl9NTUFQCisKKy8qIERlZmluZSBpZiBkbHN5bSgpIHJlcXVpcmVzIGEgbGVhZGluZyB1bmRlcnNjb3JlIGluIHN5bWJvbCBuYW1lcy4gKi8KKyN1bmRlZiBORUVEX1VTQ09SRQorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImxsdm1idWdzQGNzLnVpdWMuZWR1IgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAibGx2bSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAibGx2bSAyLjgiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIyLjgiCisKKy8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChgaW50JyBvciBgdm9pZCcpLiAqLworI2RlZmluZSBSRVRTSUdUWVBFIHZvaWQKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW50aW1lLgorCVNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKwlTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKwlTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93biAqLworI3VuZGVmIFNUQUNLX0RJUkVDVElPTgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgYFNfSVMqJyBtYWNyb3MgaW4gPHN5cy9zdGF0Lmg+IGRvIG5vdCB3b3JrIHByb3Blcmx5LiAqLworI3VuZGVmIFNUQVRfTUFDUk9TX0JST0tFTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICovCisjdW5kZWYgVElNRV9XSVRIX1NZU19USU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgPHN5cy90aW1lLmg+IGRlY2xhcmVzIGBzdHJ1Y3QgdG0nLiAqLworI3VuZGVmIFRNX0lOX1NZU19USU1FCisKKy8qIERlZmluZSBpZiB1c2UgdWRpczg2IGxpYnJhcnkgKi8KKyN1bmRlZiBVU0VfVURJUzg2CisKKy8qIERlZmluZSB0byAxIGlmIGBsZXgnIGRlY2xhcmVzIGB5eXRleHQnIGFzIGEgYGNoYXIgKicgYnkgZGVmYXVsdCwgbm90IGEKKyAgIGBjaGFyW10nLiAqLworI3VuZGVmIFlZVEVYVF9QT0lOVEVSCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBhIHR5cGUgdG8gdXNlIGZvciBgZXJyb3JfdCcgaWYgaXQgaXMgbm90IG90aGVyd2lzZSBhdmFpbGFibGUuICovCisjZGVmaW5lIGVycm9yX3QgaW50CisKKy8qIERlZmluZSB0byBhIHR5cGUgdG8gdXNlIGZvciBgbW9kZV90JyBpZiBpdCBpcyBub3Qgb3RoZXJ3aXNlIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgbW9kZV90IHVuc2lnbmVkIHNob3J0CisKKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBwaWRfdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjdW5kZWYgc2l6ZV90CisKKy8qIERlZmluZSB0byBhIGZ1bmN0aW9uIHJlcGxhY2luZyBzdHJ0b2xsICovCisjZGVmaW5lIHN0cnRvbGwgX3N0cnRvaTY0CisKKy8qIERlZmluZSB0byBhIGZ1bmN0aW9uIGltcGxlbWVudGluZyBzdHJ0b3VsbCAqLworI2RlZmluZSBzdHJ0b3VsbCBfc3RydG91aTY0CisKKy8qIERlZmluZSB0byBhIGZ1bmN0aW9uIGltcGxlbWVudGluZyBzdHJpY21wICovCisjZGVmaW5lIHN0cmljbXAgX3N0cmljbXAKKworLyogRGVmaW5lIHRvIGEgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHN0cmR1cCAqLworI2RlZmluZSBzdHJkdXAgX3N0cmR1cAorCisvKiBOYXRpdmUgTExWTSBhcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgTExWTV9OQVRJVkVfQVJDSCBYODZUYXJnZXQKKworLyogTmF0aXZlIExMVk0gYXJjaGl0ZWN0dXJlLCBzaG9ydCBuYW1lICovCisjZGVmaW5lIExMVk1fTkFUSVZFX0FSQ0hOQU1FIFg4NgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL2xsdm0vc3lzdGVtL0RhdGFUeXBlcy5oIGIvc3JjL0xMVk0vd2luMzIvbGx2bS9zeXN0ZW0vRGF0YVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0ZDVlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL2xsdm0vc3lzdGVtL0RhdGFUeXBlcy5oCkBAIC0wLDAgKzEsMTg5IEBACisvKj09PS0tIGluY2x1ZGUvU3lzdGVtL0RhdGFUeXBlcy5oIC0gRGVmaW5lIGZpeGVkIHNpemUgdHlwZXMgLS0tLS0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyB0byBmaWd1cmUgb3V0IHRoZSBzaXplIG9mIF9IT1NUXyBkYXRhIHR5cGVzLip8Cit8KiBUaGlzIGZpbGUgaXMgaW1wb3J0YW50IGJlY2F1c2UgZGlmZmVyZW50IGhvc3QgT1MncyBkZWZpbmUgZGlmZmVyZW50IG1hY3JvcywqfAorfCogd2hpY2ggbWFrZXMgcG9ydGFiaWxpdHkgdG91Z2guICBUaGlzIGZpbGUgZXhwb3J0cyB0aGUgZm9sbG93aW5nICAgICAgICAgICAgKnwKK3wqIGRlZmluaXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICBbdV1pbnQoMzJ8NjQpX3QgOiB0eXBlZGVmcyBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCAzMi82NCBiaXQgc3lzdGVtIHR5cGVzKnwKK3wqICAgW1VdSU5UKDh8MTZ8MzJ8NjQpXyhNSU58TUFYKSA6IENvbnN0YW50cyBmb3IgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcy4gICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTm8gbGlicmFyeSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZXNlIGZ1bmN0aW5vbnMuICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKiBQbGVhc2UgbGVhdmUgdGhpcyBmaWxlIEMtY29tcGF0aWJsZS4gKi8KKworI2lmbmRlZiBTVVBQT1JUX0RBVEFUWVBFU19ICisjZGVmaW5lIFNVUFBPUlRfREFUQVRZUEVTX0gKKworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKy8qICN1bmRlZiBIQVZFX0lOVFRZUEVTX0ggKi8KKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZGVmaW5lIEhBVkVfVUlOVDY0X1QgMQorLyogI3VuZGVmIEhBVkVfVV9JTlQ2NF9UICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPGNtYXRoPgorI2Vsc2UKKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKKworI2lmbmRlZiBfTVNDX1ZFUgorCisvKiBOb3RlIHRoYXQgdGhpcyBoZWFkZXIncyBjb3JyZWN0IG9wZXJhdGlvbiBkZXBlbmRzIG9uIF9fU1REQ19MSU1JVF9NQUNST1MKKyAgIGJlaW5nIGRlZmluZWQuICBXZSB3b3VsZCBkZWZpbmUgaXQgaGVyZSwgYnV0IGluIG9yZGVyIHRvIHByZXZlbnQgQmFkIFRoaW5ncworICAgaGFwcGVuaW5nIHdoZW4gc3lzdGVtIGhlYWRlcnMgb3IgQysrIFNUTCBoZWFkZXJzIGluY2x1ZGUgc3RkaW50LmggYmVmb3JlIHdlCisgICBkZWZpbmUgaXQgaGVyZSwgd2UgZGVmaW5lIGl0IG9uIHRoZSBnKysgY29tbWFuZCBsaW5lIChpbiBNYWtlZmlsZS5ydWxlcykuICovCisjaWYgIWRlZmluZWQoX19TVERDX0xJTUlUX01BQ1JPUykKKyMgZXJyb3IgIk11c3QgI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIGJlZm9yZSAjaW5jbHVkaW5nIFN5c3RlbS9EYXRhVHlwZXMuaCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykKKyMgZXJyb3IgIk11c3QgI2RlZmluZSBfX1NURENfQ09OU1RBTlRfTUFDUk9TIGJlZm9yZSAiIFwKKyAgICAgICAgIiNpbmNsdWRpbmcgU3lzdGVtL0RhdGFUeXBlcy5oIgorI2VuZGlmCisKKy8qIE5vdGUgdGhhdCA8aW50dHlwZXMuaD4gaW5jbHVkZXMgPHN0ZGludC5oPiwgaWYgdGhpcyBpcyBhIEM5OSBzeXN0ZW0uICovCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIF9BSVgKKyNpbmNsdWRlICJsbHZtL1N5c3RlbS9BSVhEYXRhVHlwZXNGaXguaCIKKyNlbmRpZgorCisvKiBIYW5kbGUgaW5jb3JyZWN0IGRlZmluaXRpb24gb2YgdWludDY0X3QgYXMgdV9pbnQ2NF90ICovCisjaWZuZGVmIEhBVkVfVUlOVDY0X1QKKyNpZmRlZiBIQVZFX1VfSU5UNjRfVAordHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3Q7CisjZWxzZQorIyBlcnJvciAiRG9uJ3QgaGF2ZSBhIGRlZmluaXRpb24gZm9yIHVpbnQ2NF90IG9uIHRoaXMgcGxhdGZvcm0iCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX09wZW5CU0RfCisjZGVmaW5lIElOVDhfTUFYIDEyNworI2RlZmluZSBJTlQ4X01JTiAtMTI4CisjZGVmaW5lIFVJTlQ4X01BWCAyNTUKKyNkZWZpbmUgSU5UMTZfTUFYIDMyNzY3CisjZGVmaW5lIElOVDE2X01JTiAtMzI3NjgKKyNkZWZpbmUgVUlOVDE2X01BWCA2NTUzNQorI2RlZmluZSBJTlQzMl9NQVggMjE0NzQ4MzY0NworI2RlZmluZSBJTlQzMl9NSU4gLTIxNDc0ODM2NDgKKyNkZWZpbmUgVUlOVDMyX01BWCA0Mjk0OTY3Mjk1VQorI2VuZGlmCisKKyNlbHNlIC8qIF9NU0NfVkVSICovCisvKiBWaXN1YWwgQysrIGRvZXNuJ3QgcHJvdmlkZSBzdGFuZGFyZCBpbnRlZ2VyIGhlYWRlcnMsIGJ1dCBpdCBkb2VzIHByb3ZpZGUKKyAgIGJ1aWx0LWluIGRhdGEgdHlwZXMuICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxjbWF0aD4KKyNlbHNlCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCit0eXBlZGVmIF9faW50NjQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKK3R5cGVkZWYgc2lnbmVkIGludCBpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Cit0eXBlZGVmIHNob3J0IGludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNl90OwordHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKK3R5cGVkZWYgc2lnbmVkIGludCBzc2l6ZV90OworI2lmbmRlZiBJTlQ4X01BWAorIyBkZWZpbmUgSU5UOF9NQVggMTI3CisjZW5kaWYKKyNpZm5kZWYgSU5UOF9NSU4KKyMgZGVmaW5lIElOVDhfTUlOIC0xMjgKKyNlbmRpZgorI2lmbmRlZiBVSU5UOF9NQVgKKyMgZGVmaW5lIFVJTlQ4X01BWCAyNTUKKyNlbmRpZgorI2lmbmRlZiBJTlQxNl9NQVgKKyMgZGVmaW5lIElOVDE2X01BWCAzMjc2NworI2VuZGlmCisjaWZuZGVmIElOVDE2X01JTgorIyBkZWZpbmUgSU5UMTZfTUlOIC0zMjc2OAorI2VuZGlmCisjaWZuZGVmIFVJTlQxNl9NQVgKKyMgZGVmaW5lIFVJTlQxNl9NQVggNjU1MzUKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NQVgKKyMgZGVmaW5lIElOVDMyX01BWCAyMTQ3NDgzNjQ3CisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUlOCisjIGRlZmluZSBJTlQzMl9NSU4gLTIxNDc0ODM2NDgKKyNlbmRpZgorI2lmbmRlZiBVSU5UMzJfTUFYCisjIGRlZmluZSBVSU5UMzJfTUFYIDQyOTQ5NjcyOTVVCisjZW5kaWYKKy8qIENlcnRhaW4gY29tcGF0aWJpbGl0eSB1cGRhdGVzIHRvIFZDKysgaW50cm9kdWNlIHRoZSBgY3N0ZGludCcKKyAqIGhlYWRlciwgd2hpY2ggZGVmaW5lcyB0aGUgSU5UKl9DIG1hY3Jvcy4gT24gZGVmYXVsdCBpbnN0YWxscyB0aGV5CisgKiBhcmUgYWJzZW50LiAqLworI2lmbmRlZiBJTlQ4X0MKKyMgZGVmaW5lIElOVDhfQyhDKSAgIEMjI2k4CisjZW5kaWYKKyNpZm5kZWYgVUlOVDhfQworIyBkZWZpbmUgVUlOVDhfQyhDKSAgQyMjdWk4CisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfQworIyBkZWZpbmUgSU5UMTZfQyhDKSAgQyMjaTE2CisjZW5kaWYKKyNpZm5kZWYgVUlOVDE2X0MKKyMgZGVmaW5lIFVJTlQxNl9DKEMpIEMjI3VpMTYKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9DCisjIGRlZmluZSBJTlQzMl9DKEMpICBDIyNpMzIKKyNlbmRpZgorI2lmbmRlZiBVSU5UMzJfQworIyBkZWZpbmUgVUlOVDMyX0MoQykgQyMjdWkzMgorI2VuZGlmCisjaWZuZGVmIElOVDY0X0MKKyMgZGVmaW5lIElOVDY0X0MoQykgIEMjI2k2NAorI2VuZGlmCisjaWZuZGVmIFVJTlQ2NF9DCisjIGRlZmluZSBVSU5UNjRfQyhDKSBDIyN1aTY0CisjZW5kaWYKKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCisvKiBTZXQgZGVmYXVsdHMgZm9yIGNvbnN0YW50cyB3aGljaCB3ZSBjYW5ub3QgZmluZC4gKi8KKyNpZiAhZGVmaW5lZChJTlQ2NF9NQVgpCisjIGRlZmluZSBJTlQ2NF9NQVggOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjZW5kaWYKKyNpZiAhZGVmaW5lZChJTlQ2NF9NSU4pCisjIGRlZmluZSBJTlQ2NF9NSU4gKCgtSU5UNjRfTUFYKS0xKQorI2VuZGlmCisjaWYgIWRlZmluZWQoVUlOVDY0X01BWCkKKyMgZGVmaW5lIFVJTlQ2NF9NQVggMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisjZW5kaWYKKworI2lmIF9fR05VQ19fID4gMworI2RlZmluZSBFTkRfV0lUSF9OVUxMIF9fYXR0cmlidXRlX18oKHNlbnRpbmVsKSkKKyNlbHNlCisjZGVmaW5lIEVORF9XSVRIX05VTEwKKyNlbmRpZgorCisjaWZuZGVmIEhVR0VfVkFMRgorI2RlZmluZSBIVUdFX1ZBTEYgKGZsb2F0KUhVR0VfVkFMCisjZW5kaWYKKworI2VuZGlmICAvKiBTVVBQT1JUX0RBVEFUWVBFU19IICovCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuQXNtV3JpdGVyLmluYyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5Bc21Xcml0ZXIuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDNkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuQXNtV3JpdGVyLmluYwpAQCAtMCwwICsxLDY5OTUgQEAKKy8vPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8NCisvLyBBc3NlbWJseSBXcml0ZXIgU291cmNlIEZyYWdtZW50DQorLy8NCisvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCENCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8vIHByaW50SW5zdHJ1Y3Rpb24gLSBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0YWJsZWdlbg0KKy8vLyBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzZXQgZGVzY3JpcHRpb24uDQordm9pZCBYODZBVFRJbnN0UHJpbnRlcjo6cHJpbnRJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmTykgew0KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE9wSW5mb1tdID0gew0KKyAgICAwVSwJLy8gUEhJDQorICAgIDBVLAkvLyBJTkxJTkVBU00NCisgICAgMFUsCS8vIFBST0xPR19MQUJFTA0KKyAgICAwVSwJLy8gRUhfTEFCRUwNCisgICAgMFUsCS8vIEdDX0xBQkVMDQorICAgIDBVLAkvLyBLSUxMDQorICAgIDBVLAkvLyBFWFRSQUNUX1NVQlJFRw0KKyAgICAwVSwJLy8gSU5TRVJUX1NVQlJFRw0KKyAgICAwVSwJLy8gSU1QTElDSVRfREVGDQorICAgIDBVLAkvLyBTVUJSRUdfVE9fUkVHDQorICAgIDBVLAkvLyBDT1BZX1RPX1JFR0NMQVNTDQorICAgIDFVLAkvLyBEQkdfVkFMVUUNCisgICAgMFUsCS8vIFJFR19TRVFVRU5DRQ0KKyAgICAwVSwJLy8gQ09QWQ0KKyAgICAxMVUsCS8vIEFCU19GDQorICAgIDBVLAkvLyBBQlNfRnAzMg0KKyAgICAwVSwJLy8gQUJTX0ZwNjQNCisgICAgMFUsCS8vIEFCU19GcDgwDQorICAgIDY3MTA4ODgwVSwJLy8gQURDMTZpMTYNCisgICAgMTM1MjY2MzIwVSwJLy8gQURDMTZtaQ0KKyAgICAxMzUyNjYzMjBVLAkvLyBBREMxNm1pOA0KKyAgICAxMzUyNjYzMjBVLAkvLyBBREMxNm1yDQorICAgIDIwMzQ1NjUyOFUsCS8vIEFEQzE2cmkNCisgICAgMjAzNDU2NTI4VSwJLy8gQURDMTZyaTgNCisgICAgMjcwNTY1MzkyVSwJLy8gQURDMTZybQ0KKyAgICAyMDM0NTY1MjhVLAkvLyBBREMxNnJyDQorICAgIDIwMzQ1NjUyOFUsCS8vIEFEQzE2cnJfUkVWDQorICAgIDcwMjU0NjE0VSwJLy8gQURDMzJpMzINCisgICAgMTM1MzMxODYyVSwJLy8gQURDMzJtaQ0KKyAgICAxMzUzMzE4NjJVLAkvLyBBREMzMm1pOA0KKyAgICAxMzUzMzE4NjJVLAkvLyBBREMzMm1yDQorICAgIDIwMzQ1NjUzNFUsCS8vIEFEQzMycmkNCisgICAgMjAzNDU2NTM0VSwJLy8gQURDMzJyaTgNCisgICAgMzM3Njc0MjYyVSwJLy8gQURDMzJybQ0KKyAgICAyMDM0NTY1MzRVLAkvLyBBREMzMnJyDQorICAgIDIwMzQ1NjUzNFUsCS8vIEFEQzMycnJfUkVWDQorICAgIDcxMzAzMTk2VSwJLy8gQURDNjRpMzINCisgICAgMTM1MzY0NjM2VSwJLy8gQURDNjRtaTMyDQorICAgIDEzNTM2NDYzNlUsCS8vIEFEQzY0bWk4DQorICAgIDEzNTM2NDYzNlUsCS8vIEFEQzY0bXINCisgICAgMjAzNDU2NTQwVSwJLy8gQURDNjRyaTMyDQorICAgIDIwMzQ1NjU0MFUsCS8vIEFEQzY0cmk4DQorICAgIDQwNDc4MzEzMlUsCS8vIEFEQzY0cm0NCisgICAgMjAzNDU2NTQwVSwJLy8gQURDNjRycg0KKyAgICAyMDM0NTY1NDBVLAkvLyBBREM2NHJyX1JFVg0KKyAgICA3MjM1MTc3OFUsCS8vIEFEQzhpOA0KKyAgICAxMzUzOTc0MTBVLAkvLyBBREM4bWkNCisgICAgMTM1Mzk3NDEwVSwJLy8gQURDOG1yDQorICAgIDIwMzQ1NjU0NlUsCS8vIEFEQzhyaQ0KKyAgICA0NzE4OTIwMDJVLAkvLyBBREM4cm0NCisgICAgMjAzNDU2NTQ2VSwJLy8gQURDOHJyDQorICAgIDIwMzQ1NjU0NlUsCS8vIEFEQzhycl9SRVYNCisgICAgNjcxMDg5MDRVLAkvLyBBREQxNmkxNg0KKyAgICAxMzUyNjYzNDRVLAkvLyBBREQxNm1pDQorICAgIDEzNTI2NjM0NFUsCS8vIEFERDE2bWk4DQorICAgIDEzNTI2NjM0NFUsCS8vIEFERDE2bXINCisgICAgMjAzNDU2NTUyVSwJLy8gQUREMTZyaQ0KKyAgICAyMDM0NTY1NTJVLAkvLyBBREQxNnJpOA0KKyAgICAyNzA1NjU0MTZVLAkvLyBBREQxNnJtDQorICAgIDIwMzQ1NjU1MlUsCS8vIEFERDE2cnINCisgICAgMjAzNDU2NTUyVSwJLy8gQUREMTZycl9hbHQNCisgICAgNzAyNTQ2MzhVLAkvLyBBREQzMmkzMg0KKyAgICAxMzUzMzE4ODZVLAkvLyBBREQzMm1pDQorICAgIDEzNTMzMTg4NlUsCS8vIEFERDMybWk4DQorICAgIDEzNTMzMTg4NlUsCS8vIEFERDMybXINCisgICAgMjAzNDU2NTU4VSwJLy8gQUREMzJyaQ0KKyAgICAyMDM0NTY1NThVLAkvLyBBREQzMnJpOA0KKyAgICAzMzc2NzQyODZVLAkvLyBBREQzMnJtDQorICAgIDIwMzQ1NjU1OFUsCS8vIEFERDMycnINCisgICAgMjAzNDU2NTU4VSwJLy8gQUREMzJycl9hbHQNCisgICAgNzEzMDMyMjBVLAkvLyBBREQ2NGkzMg0KKyAgICAxMzUzNjQ2NjBVLAkvLyBBREQ2NG1pMzINCisgICAgMTM1MzY0NjYwVSwJLy8gQURENjRtaTgNCisgICAgMTM1MzY0NjYwVSwJLy8gQURENjRtcg0KKyAgICAyMDM0NTY1NjRVLAkvLyBBREQ2NHJpMzINCisgICAgMjAzNDU2NTY0VSwJLy8gQURENjRyaTgNCisgICAgNDA0NzgzMTU2VSwJLy8gQURENjRybQ0KKyAgICAyMDM0NTY1NjRVLAkvLyBBREQ2NHJyDQorICAgIDIwMzQ1NjU1OFUsCS8vIEFERDY0cnJfYWx0DQorICAgIDcyMzUxODAyVSwJLy8gQUREOGk4DQorICAgIDEzNTM5NzQzNFUsCS8vIEFERDhtaQ0KKyAgICAxMzUzOTc0MzRVLAkvLyBBREQ4bXINCisgICAgMjAzNDU2NTcwVSwJLy8gQUREOHJpDQorICAgIDQ3MTg5MjAyNlUsCS8vIEFERDhybQ0KKyAgICAyMDM0NTY1NzBVLAkvLyBBREQ4cnINCisgICAgMjAzNDU2NTcwVSwJLy8gQUREOHJyX2FsdA0KKyAgICA1MzkwMDA4OTZVLAkvLyBBRERQRHJtDQorICAgIDIwMzQ1NjU3NlUsCS8vIEFERFBEcnINCisgICAgNTM5MDAwOTAzVSwJLy8gQUREUFNybQ0KKyAgICAyMDM0NTY1ODNVLAkvLyBBRERQU3JyDQorICAgIDYwNjEwOTc3NFUsCS8vIEFERFNEcm0NCisgICAgNjA2MTA5Nzc0VSwJLy8gQUREU0RybV9JbnQNCisgICAgMjAzNDU2NTkwVSwJLy8gQUREU0Rycg0KKyAgICAyMDM0NTY1OTBVLAkvLyBBRERTRHJyX0ludA0KKyAgICA2NzMyMTg2NDVVLAkvLyBBRERTU3JtDQorICAgIDY3MzIxODY0NVUsCS8vIEFERFNTcm1fSW50DQorICAgIDIwMzQ1NjU5N1UsCS8vIEFERFNTcnINCisgICAgMjAzNDU2NTk3VSwJLy8gQUREU1Nycl9JbnQNCisgICAgNTM5MDAwOTI0VSwJLy8gQUREU1VCUERybQ0KKyAgICAyMDM0NTY2MDRVLAkvLyBBRERTVUJQRHJyDQorICAgIDUzOTAwMDkzNFUsCS8vIEFERFNVQlBTcm0NCisgICAgMjAzNDU2NjE0VSwJLy8gQUREU1VCUFNycg0KKyAgICA3MzgxOTc2MTZVLAkvLyBBRERfRjMybQ0KKyAgICA4MDUzMDY0ODdVLAkvLyBBRERfRjY0bQ0KKyAgICA4NzI0MTUzNThVLAkvLyBBRERfRkkxNm0NCisgICAgOTQ1ODE1Njg2VSwJLy8gQUREX0ZJMzJtDQorICAgIDczNDAwNDYyVSwJLy8gQUREX0ZQclNUMA0KKyAgICA3MzQwMDQ2OVUsCS8vIEFERF9GU1Qwcg0KKyAgICAwVSwJLy8gQUREX0ZwMzINCisgICAgMFUsCS8vIEFERF9GcDMybQ0KKyAgICAwVSwJLy8gQUREX0ZwNjQNCisgICAgMFUsCS8vIEFERF9GcDY0bQ0KKyAgICAwVSwJLy8gQUREX0ZwNjRtMzINCisgICAgMFUsCS8vIEFERF9GcDgwDQorICAgIDBVLAkvLyBBRERfRnA4MG0zMg0KKyAgICAwVSwJLy8gQUREX0ZwODBtNjQNCisgICAgMFUsCS8vIEFERF9GcEkxNm0zMg0KKyAgICAwVSwJLy8gQUREX0ZwSTE2bTY0DQorICAgIDBVLAkvLyBBRERfRnBJMTZtODANCisgICAgMFUsCS8vIEFERF9GcEkzMm0zMg0KKyAgICAwVSwJLy8gQUREX0ZwSTMybTY0DQorICAgIDBVLAkvLyBBRERfRnBJMzJtODANCisgICAgNzM0MDA0NzVVLAkvLyBBRERfRnJTVDANCisgICAgMTY5VSwJLy8gQURKQ0FMTFNUQUNLRE9XTjMyDQorICAgIDE2OVUsCS8vIEFESkNBTExTVEFDS0RPV042NA0KKyAgICAxODdVLAkvLyBBREpDQUxMU1RBQ0tVUDMyDQorICAgIDE4N1UsCS8vIEFESkNBTExTVEFDS1VQNjQNCisgICAgMTAwODc2MzA4M1UsCS8vIEFFU0RFQ0xBU1RybQ0KKyAgICAyMDM0NTY3MTVVLAkvLyBBRVNERUNMQVNUcnINCisgICAgMTAwODc2MzA5NVUsCS8vIEFFU0RFQ3JtDQorICAgIDIwMzQ1NjcyN1UsCS8vIEFFU0RFQ3JyDQorICAgIDEwMDg3NjMxMDNVLAkvLyBBRVNFTkNMQVNUcm0NCisgICAgMjAzNDU2NzM1VSwJLy8gQUVTRU5DTEFTVHJyDQorICAgIDEwMDg3NjMxMTVVLAkvLyBBRVNFTkNybQ0KKyAgICAyMDM0NTY3NDdVLAkvLyBBRVNFTkNycg0KKyAgICAxMDczNzQyMDY3VSwJLy8gQUVTSU1Dcm0NCisgICAgMTE0Mjk4MDg1MVUsCS8vIEFFU0lNQ3JyDQorICAgIDEyMTUyOTk4MzVVLAkvLyBBRVNLRVlHRU5BU1NJU1QxMjhybQ0KKyAgICAyMDk4NzkyOTFVLAkvLyBBRVNLRVlHRU5BU1NJU1QxMjhycg0KKyAgICA2NzEwOTEzMlUsCS8vIEFORDE2aTE2DQorICAgIDEzNTI2NjU3MlUsCS8vIEFORDE2bWkNCisgICAgMTM1MjY2NTcyVSwJLy8gQU5EMTZtaTgNCisgICAgMTM1MjY2NTcyVSwJLy8gQU5EMTZtcg0KKyAgICAyMDM0NTY3ODBVLAkvLyBBTkQxNnJpDQorICAgIDIwMzQ1Njc4MFUsCS8vIEFORDE2cmk4DQorICAgIDI3MDU2NTY0NFUsCS8vIEFORDE2cm0NCisgICAgMjAzNDU2NzgwVSwJLy8gQU5EMTZycg0KKyAgICAyMDM0NTY3ODBVLAkvLyBBTkQxNnJyX1JFVg0KKyAgICA3MDI1NDg2NlUsCS8vIEFORDMyaTMyDQorICAgIDEzNTMzMjExNFUsCS8vIEFORDMybWkNCisgICAgMTM1MzMyMTE0VSwJLy8gQU5EMzJtaTgNCisgICAgMTM1MzMyMTE0VSwJLy8gQU5EMzJtcg0KKyAgICAyMDM0NTY3ODZVLAkvLyBBTkQzMnJpDQorICAgIDIwMzQ1Njc4NlUsCS8vIEFORDMycmk4DQorICAgIDMzNzY3NDUxNFUsCS8vIEFORDMycm0NCisgICAgMjAzNDU2Nzg2VSwJLy8gQU5EMzJycg0KKyAgICAyMDM0NTY3ODZVLAkvLyBBTkQzMnJyX1JFVg0KKyAgICA3MTMwMzQ0OFUsCS8vIEFORDY0aTMyDQorICAgIDEzNTM2NDg4OFUsCS8vIEFORDY0bWkzMg0KKyAgICAxMzUzNjQ4ODhVLAkvLyBBTkQ2NG1pOA0KKyAgICAxMzUzNjQ4ODhVLAkvLyBBTkQ2NG1yDQorICAgIDIwMzQ1Njc5MlUsCS8vIEFORDY0cmkzMg0KKyAgICAyMDM0NTY3OTJVLAkvLyBBTkQ2NHJpOA0KKyAgICA0MDQ3ODMzODRVLAkvLyBBTkQ2NHJtDQorICAgIDIwMzQ1Njc5MlUsCS8vIEFORDY0cnINCisgICAgMjAzNDU2NzkyVSwJLy8gQU5ENjRycl9SRVYNCisgICAgNzIzNTIwMzBVLAkvLyBBTkQ4aTgNCisgICAgMTM1Mzk3NjYyVSwJLy8gQU5EOG1pDQorICAgIDEzNTM5NzY2MlUsCS8vIEFORDhtcg0KKyAgICAyMDM0NTY3OThVLAkvLyBBTkQ4cmkNCisgICAgNDcxODkyMjU0VSwJLy8gQU5EOHJtDQorICAgIDIwMzQ1Njc5OFUsCS8vIEFORDhycg0KKyAgICAyMDM0NTY3OThVLAkvLyBBTkQ4cnJfUkVWDQorICAgIDUzOTAwMTEyNFUsCS8vIEFORE5QRHJtDQorICAgIDIwMzQ1NjgwNFUsCS8vIEFORE5QRHJyDQorICAgIDUzOTAwMTEzMlUsCS8vIEFORE5QU3JtDQorICAgIDIwMzQ1NjgxMlUsCS8vIEFORE5QU3JyDQorICAgIDUzOTAwMTE0MFUsCS8vIEFORFBEcm0NCisgICAgMjAzNDU2ODIwVSwJLy8gQU5EUERycg0KKyAgICA1MzkwMDExNDdVLAkvLyBBTkRQU3JtDQorICAgIDIwMzQ1NjgyN1UsCS8vIEFORFBTcnINCisgICAgMzIyVSwJLy8gQVRPTUFERDY0MzINCisgICAgMzQzVSwJLy8gQVRPTUFORDE2DQorICAgIDM2MlUsCS8vIEFUT01BTkQzMg0KKyAgICAzODFVLAkvLyBBVE9NQU5ENjQNCisgICAgNDAwVSwJLy8gQVRPTUFORDY0MzINCisgICAgNDIxVSwJLy8gQVRPTUFORDgNCisgICAgNDM5VSwJLy8gQVRPTU1BWDE2DQorICAgIDQ1OFUsCS8vIEFUT01NQVgzMg0KKyAgICA0NzdVLAkvLyBBVE9NTUFYNjQNCisgICAgNDk2VSwJLy8gQVRPTU1JTjE2DQorICAgIDUxNVUsCS8vIEFUT01NSU4zMg0KKyAgICA1MzRVLAkvLyBBVE9NTUlONjQNCisgICAgNTUzVSwJLy8gQVRPTU5BTkQxNg0KKyAgICA1NzNVLAkvLyBBVE9NTkFORDMyDQorICAgIDU5M1UsCS8vIEFUT01OQU5ENjQNCisgICAgNjEzVSwJLy8gQVRPTU5BTkQ2NDMyDQorICAgIDYzNVUsCS8vIEFUT01OQU5EOA0KKyAgICA2NTRVLAkvLyBBVE9NT1IxNg0KKyAgICA2NzJVLAkvLyBBVE9NT1IzMg0KKyAgICA2OTBVLAkvLyBBVE9NT1I2NA0KKyAgICA3MDhVLAkvLyBBVE9NT1I2NDMyDQorICAgIDcyOFUsCS8vIEFUT01PUjgNCisgICAgNzQ1VSwJLy8gQVRPTVNVQjY0MzINCisgICAgNzY2VSwJLy8gQVRPTVNXQVA2NDMyDQorICAgIDc4OFUsCS8vIEFUT01VTUFYMTYNCisgICAgODA4VSwJLy8gQVRPTVVNQVgzMg0KKyAgICA4MjhVLAkvLyBBVE9NVU1BWDY0DQorICAgIDg0OFUsCS8vIEFUT01VTUlOMTYNCisgICAgODY4VSwJLy8gQVRPTVVNSU4zMg0KKyAgICA4ODhVLAkvLyBBVE9NVU1JTjY0DQorICAgIDkwOFUsCS8vIEFUT01YT1IxNg0KKyAgICA5MjdVLAkvLyBBVE9NWE9SMzINCisgICAgOTQ2VSwJLy8gQVRPTVhPUjY0DQorICAgIDk2NVUsCS8vIEFUT01YT1I2NDMyDQorICAgIDk4NlUsCS8vIEFUT01YT1I4DQorICAgIDEyODQ3MDMyMTJVLAkvLyBCTEVORFBEcm1pDQorICAgIDEzNDQzMDgyMDRVLAkvLyBCTEVORFBEcnJpDQorICAgIDEyODQ3MDMyMjFVLAkvLyBCTEVORFBTcm1pDQorICAgIDEzNDQzMDgyMTNVLAkvLyBCTEVORFBTcnJpDQorICAgIDEwMDg3NjM5MDJVLAkvLyBCTEVORFZQRHJtMA0KKyAgICAyMDM0NTc1MzRVLAkvLyBCTEVORFZQRHJyMA0KKyAgICAxMDA4NzYzOTE5VSwJLy8gQkxFTkRWUFNybTANCisgICAgMjAzNDU3NTUxVSwJLy8gQkxFTkRWUFNycjANCisgICAgMTQwOTI4NzIwMFUsCS8vIEJTRjE2cm0NCisgICAgMTE0Mjk4MTY2NFUsCS8vIEJTRjE2cnINCisgICAgMTQ3NjM5NjA3MFUsCS8vIEJTRjMycm0NCisgICAgMTE0Mjk4MTY3MFUsCS8vIEJTRjMycnINCisgICAgMTU0MzUwNDk0MFUsCS8vIEJTRjY0cm0NCisgICAgMTE0Mjk4MTY3NlUsCS8vIEJTRjY0cnINCisgICAgMTQwOTI4NzIxOFUsCS8vIEJTUjE2cm0NCisgICAgMTE0Mjk4MTY4MlUsCS8vIEJTUjE2cnINCisgICAgMTQ3NjM5NjA4OFUsCS8vIEJTUjMycm0NCisgICAgMTE0Mjk4MTY4OFUsCS8vIEJTUjMycnINCisgICAgMTU0MzUwNDk1OFUsCS8vIEJTUjY0cm0NCisgICAgMTE0Mjk4MTY5NFUsCS8vIEJTUjY0cnINCisgICAgNzM0MDE0MTJVLAkvLyBCU1dBUDMycg0KKyAgICA3MzQwMTQyMFUsCS8vIEJTV0FQNjRyDQorICAgIDEzNTI2NzQxMlUsCS8vIEJUMTZtaTgNCisgICAgMTM1MjY3NDEyVSwJLy8gQlQxNm1yDQorICAgIDExNDI5ODE3MTZVLAkvLyBCVDE2cmk4DQorICAgIDExNDI5ODE3MTZVLAkvLyBCVDE2cnINCisgICAgMTM1MzMyOTUzVSwJLy8gQlQzMm1pOA0KKyAgICAxMzUzMzI5NTNVLAkvLyBCVDMybXINCisgICAgMTE0Mjk4MTcyMVUsCS8vIEJUMzJyaTgNCisgICAgMTE0Mjk4MTcyMVUsCS8vIEJUMzJycg0KKyAgICAxMzUzNjU3MjZVLAkvLyBCVDY0bWk4DQorICAgIDEzNTM2NTcyNlUsCS8vIEJUNjRtcg0KKyAgICAxMTQyOTgxNzI2VSwJLy8gQlQ2NHJpOA0KKyAgICAxMTQyOTgxNzI2VSwJLy8gQlQ2NHJyDQorICAgIDEzNTI2NzQyN1UsCS8vIEJUQzE2bWk4DQorICAgIDEzNTI2NzQyN1UsCS8vIEJUQzE2bXINCisgICAgMTE0Mjk4MTczMVUsCS8vIEJUQzE2cmk4DQorICAgIDExNDI5ODE3MzFVLAkvLyBCVEMxNnJyDQorICAgIDEzNTMzMjk2OVUsCS8vIEJUQzMybWk4DQorICAgIDEzNTMzMjk2OVUsCS8vIEJUQzMybXINCisgICAgMTE0Mjk4MTczN1UsCS8vIEJUQzMycmk4DQorICAgIDExNDI5ODE3MzdVLAkvLyBCVEMzMnJyDQorICAgIDEzNTM2NTc0M1UsCS8vIEJUQzY0bWk4DQorICAgIDEzNTM2NTc0M1UsCS8vIEJUQzY0bXINCisgICAgMTE0Mjk4MTc0M1UsCS8vIEJUQzY0cmk4DQorICAgIDExNDI5ODE3NDNVLAkvLyBCVEM2NHJyDQorICAgIDEzNTI2NzQ0NVUsCS8vIEJUUjE2bWk4DQorICAgIDEzNTI2NzQ0NVUsCS8vIEJUUjE2bXINCisgICAgMTE0Mjk4MTc0OVUsCS8vIEJUUjE2cmk4DQorICAgIDExNDI5ODE3NDlVLAkvLyBCVFIxNnJyDQorICAgIDEzNTMzMjk4N1UsCS8vIEJUUjMybWk4DQorICAgIDEzNTMzMjk4N1UsCS8vIEJUUjMybXINCisgICAgMTE0Mjk4MTc1NVUsCS8vIEJUUjMycmk4DQorICAgIDExNDI5ODE3NTVVLAkvLyBCVFIzMnJyDQorICAgIDEzNTM2NTc2MVUsCS8vIEJUUjY0bWk4DQorICAgIDEzNTM2NTc2MVUsCS8vIEJUUjY0bXINCisgICAgMTE0Mjk4MTc2MVUsCS8vIEJUUjY0cmk4DQorICAgIDExNDI5ODE3NjFVLAkvLyBCVFI2NHJyDQorICAgIDEzNTI2NzQ2M1UsCS8vIEJUUzE2bWk4DQorICAgIDEzNTI2NzQ2M1UsCS8vIEJUUzE2bXINCisgICAgMTE0Mjk4MTc2N1UsCS8vIEJUUzE2cmk4DQorICAgIDExNDI5ODE3NjdVLAkvLyBCVFMxNnJyDQorICAgIDEzNTMzMzAwNVUsCS8vIEJUUzMybWk4DQorICAgIDEzNTMzMzAwNVUsCS8vIEJUUzMybXINCisgICAgMTE0Mjk4MTc3M1UsCS8vIEJUUzMycmk4DQorICAgIDExNDI5ODE3NzNVLAkvLyBCVFMzMnJyDQorICAgIDEzNTM2NTc3OVUsCS8vIEJUUzY0bWk4DQorICAgIDEzNTM2NTc3OVUsCS8vIEJUUzY0bXINCisgICAgMTE0Mjk4MTc3OVUsCS8vIEJUUzY0cmk4DQorICAgIDExNDI5ODE3NzlVLAkvLyBCVFM2NHJyDQorICAgIDk0NTgxNjcyOVUsCS8vIENBTEwzMm0NCisgICAgNzM0MDE0OTdVLAkvLyBDQUxMMzJyDQorICAgIDE2MTY5MDUzNzZVLAkvLyBDQUxMNjRtDQorICAgIDE2ODQwMTQyNDhVLAkvLyBDQUxMNjRwY3JlbDMyDQorICAgIDczNDAxNTA0VSwJLy8gQ0FMTDY0cg0KKyAgICAxNjg0MDE0MjU1VSwJLy8gQ0FMTHBjcmVsMTYNCisgICAgMTY4NDAxNDI2MlUsCS8vIENBTExwY3JlbDMyDQorICAgIDEyMTJVLAkvLyBDQlcNCisgICAgMTIxN1UsCS8vIENEUQ0KKyAgICAxMjIyVSwJLy8gQ0RRRQ0KKyAgICAxMjI3VSwJLy8gQ0hTX0YNCisgICAgMFUsCS8vIENIU19GcDMyDQorICAgIDBVLAkvLyBDSFNfRnA2NA0KKyAgICAwVSwJLy8gQ0hTX0ZwODANCisgICAgMTIzMlUsCS8vIENMQw0KKyAgICAxMjM2VSwJLy8gQ0xEDQorICAgIDE3NDQ4MzE3MDRVLAkvLyBDTEZMVVNIDQorICAgIDEyNDlVLAkvLyBDTEkNCisgICAgMTI1M1UsCS8vIENMVFMNCisgICAgMTI1OFUsCS8vIENNQw0KKyAgICAyNzA1NjY2MzhVLAkvLyBDTU9WQTE2cm0NCisgICAgMjAzNDU3Nzc0VSwJLy8gQ01PVkExNnJyDQorICAgIDMzNzY3NTUxMFUsCS8vIENNT1ZBMzJybQ0KKyAgICAyMDM0NTc3ODJVLAkvLyBDTU9WQTMycnINCisgICAgNDA0Nzg0MzgyVSwJLy8gQ01PVkE2NHJtDQorICAgIDIwMzQ1Nzc5MFUsCS8vIENNT1ZBNjRycg0KKyAgICAyNzA1NjY2NjJVLAkvLyBDTU9WQUUxNnJtDQorICAgIDIwMzQ1Nzc5OFUsCS8vIENNT1ZBRTE2cnINCisgICAgMzM3Njc1NTM1VSwJLy8gQ01PVkFFMzJybQ0KKyAgICAyMDM0NTc4MDdVLAkvLyBDTU9WQUUzMnJyDQorICAgIDQwNDc4NDQwOFUsCS8vIENNT1ZBRTY0cm0NCisgICAgMjAzNDU3ODE2VSwJLy8gQ01PVkFFNjRycg0KKyAgICAyNzA1NjY2ODlVLAkvLyBDTU9WQjE2cm0NCisgICAgMjAzNDU3ODI1VSwJLy8gQ01PVkIxNnJyDQorICAgIDMzNzY3NTU2MVUsCS8vIENNT1ZCMzJybQ0KKyAgICAyMDM0NTc4MzNVLAkvLyBDTU9WQjMycnINCisgICAgNDA0Nzg0NDMzVSwJLy8gQ01PVkI2NHJtDQorICAgIDIwMzQ1Nzg0MVUsCS8vIENNT1ZCNjRycg0KKyAgICAyNzA1NjY3MTNVLAkvLyBDTU9WQkUxNnJtDQorICAgIDIwMzQ1Nzg0OVUsCS8vIENNT1ZCRTE2cnINCisgICAgMzM3Njc1NTg2VSwJLy8gQ01PVkJFMzJybQ0KKyAgICAyMDM0NTc4NThVLAkvLyBDTU9WQkUzMnJyDQorICAgIDQwNDc4NDQ1OVUsCS8vIENNT1ZCRTY0cm0NCisgICAgMjAzNDU3ODY3VSwJLy8gQ01PVkJFNjRycg0KKyAgICA3NzU5NTk4OFUsCS8vIENNT1ZCRV9GDQorICAgIDBVLAkvLyBDTU9WQkVfRnAzMg0KKyAgICAwVSwJLy8gQ01PVkJFX0ZwNjQNCisgICAgMFUsCS8vIENNT1ZCRV9GcDgwDQorICAgIDc3NTk1OTk3VSwJLy8gQ01PVkJfRg0KKyAgICAwVSwJLy8gQ01PVkJfRnAzMg0KKyAgICAwVSwJLy8gQ01PVkJfRnA2NA0KKyAgICAwVSwJLy8gQ01PVkJfRnA4MA0KKyAgICAyNzA1NjY3NTdVLAkvLyBDTU9WRTE2cm0NCisgICAgMjAzNDU3ODkzVSwJLy8gQ01PVkUxNnJyDQorICAgIDMzNzY3NTYyOVUsCS8vIENNT1ZFMzJybQ0KKyAgICAyMDM0NTc5MDFVLAkvLyBDTU9WRTMycnINCisgICAgNDA0Nzg0NTAxVSwJLy8gQ01PVkU2NHJtDQorICAgIDIwMzQ1NzkwOVUsCS8vIENNT1ZFNjRycg0KKyAgICA3NzU5NjAyOVUsCS8vIENNT1ZFX0YNCisgICAgMFUsCS8vIENNT1ZFX0ZwMzINCisgICAgMFUsCS8vIENNT1ZFX0ZwNjQNCisgICAgMFUsCS8vIENNT1ZFX0ZwODANCisgICAgMjcwNTY2Nzg5VSwJLy8gQ01PVkcxNnJtDQorICAgIDIwMzQ1NzkyNVUsCS8vIENNT1ZHMTZycg0KKyAgICAzMzc2NzU2NjFVLAkvLyBDTU9WRzMycm0NCisgICAgMjAzNDU3OTMzVSwJLy8gQ01PVkczMnJyDQorICAgIDQwNDc4NDUzM1UsCS8vIENNT1ZHNjRybQ0KKyAgICAyMDM0NTc5NDFVLAkvLyBDTU9WRzY0cnINCisgICAgMjcwNTY2ODEzVSwJLy8gQ01PVkdFMTZybQ0KKyAgICAyMDM0NTc5NDlVLAkvLyBDTU9WR0UxNnJyDQorICAgIDMzNzY3NTY4NlUsCS8vIENNT1ZHRTMycm0NCisgICAgMjAzNDU3OTU4VSwJLy8gQ01PVkdFMzJycg0KKyAgICA0MDQ3ODQ1NTlVLAkvLyBDTU9WR0U2NHJtDQorICAgIDIwMzQ1Nzk2N1UsCS8vIENNT1ZHRTY0cnINCisgICAgMjcwNTY2ODQwVSwJLy8gQ01PVkwxNnJtDQorICAgIDIwMzQ1Nzk3NlUsCS8vIENNT1ZMMTZycg0KKyAgICAzMzc2NzU3MTJVLAkvLyBDTU9WTDMycm0NCisgICAgMjAzNDU3OTg0VSwJLy8gQ01PVkwzMnJyDQorICAgIDQwNDc4NDU4NFUsCS8vIENNT1ZMNjRybQ0KKyAgICAyMDM0NTc5OTJVLAkvLyBDTU9WTDY0cnINCisgICAgMjcwNTY2ODY0VSwJLy8gQ01PVkxFMTZybQ0KKyAgICAyMDM0NTgwMDBVLAkvLyBDTU9WTEUxNnJyDQorICAgIDMzNzY3NTczN1UsCS8vIENNT1ZMRTMycm0NCisgICAgMjAzNDU4MDA5VSwJLy8gQ01PVkxFMzJycg0KKyAgICA0MDQ3ODQ2MTBVLAkvLyBDTU9WTEU2NHJtDQorICAgIDIwMzQ1ODAxOFUsCS8vIENNT1ZMRTY0cnINCisgICAgNzc1OTYxMzlVLAkvLyBDTU9WTkJFX0YNCisgICAgMFUsCS8vIENNT1ZOQkVfRnAzMg0KKyAgICAwVSwJLy8gQ01PVk5CRV9GcDY0DQorICAgIDBVLAkvLyBDTU9WTkJFX0ZwODANCisgICAgNzc1OTYxNDlVLAkvLyBDTU9WTkJfRg0KKyAgICAwVSwJLy8gQ01PVk5CX0ZwMzINCisgICAgMFUsCS8vIENNT1ZOQl9GcDY0DQorICAgIDBVLAkvLyBDTU9WTkJfRnA4MA0KKyAgICAyNzA1NjY5MTBVLAkvLyBDTU9WTkUxNnJtDQorICAgIDIwMzQ1ODA0NlUsCS8vIENNT1ZORTE2cnINCisgICAgMzM3Njc1NzgzVSwJLy8gQ01PVk5FMzJybQ0KKyAgICAyMDM0NTgwNTVVLAkvLyBDTU9WTkUzMnJyDQorICAgIDQwNDc4NDY1NlUsCS8vIENNT1ZORTY0cm0NCisgICAgMjAzNDU4MDY0VSwJLy8gQ01PVk5FNjRycg0KKyAgICA3NzU5NjE4NVUsCS8vIENNT1ZORV9GDQorICAgIDBVLAkvLyBDTU9WTkVfRnAzMg0KKyAgICAwVSwJLy8gQ01PVk5FX0ZwNjQNCisgICAgMFUsCS8vIENNT1ZORV9GcDgwDQorICAgIDI3MDU2Njk0NlUsCS8vIENNT1ZOTzE2cm0NCisgICAgMjAzNDU4MDgyVSwJLy8gQ01PVk5PMTZycg0KKyAgICAzMzc2NzU4MTlVLAkvLyBDTU9WTk8zMnJtDQorICAgIDIwMzQ1ODA5MVUsCS8vIENNT1ZOTzMycnINCisgICAgNDA0Nzg0NjkyVSwJLy8gQ01PVk5PNjRybQ0KKyAgICAyMDM0NTgxMDBVLAkvLyBDTU9WTk82NHJyDQorICAgIDI3MDU2Njk3M1UsCS8vIENNT1ZOUDE2cm0NCisgICAgMjAzNDU4MTA5VSwJLy8gQ01PVk5QMTZycg0KKyAgICAzMzc2NzU4NDZVLAkvLyBDTU9WTlAzMnJtDQorICAgIDIwMzQ1ODExOFUsCS8vIENNT1ZOUDMycnINCisgICAgNDA0Nzg0NzE5VSwJLy8gQ01PVk5QNjRybQ0KKyAgICAyMDM0NTgxMjdVLAkvLyBDTU9WTlA2NHJyDQorICAgIDc3NTk2MjQ4VSwJLy8gQ01PVk5QX0YNCisgICAgMFUsCS8vIENNT1ZOUF9GcDMyDQorICAgIDBVLAkvLyBDTU9WTlBfRnA2NA0KKyAgICAwVSwJLy8gQ01PVk5QX0ZwODANCisgICAgMjcwNTY3MDA5VSwJLy8gQ01PVk5TMTZybQ0KKyAgICAyMDM0NTgxNDVVLAkvLyBDTU9WTlMxNnJyDQorICAgIDMzNzY3NTg4MlUsCS8vIENNT1ZOUzMycm0NCisgICAgMjAzNDU4MTU0VSwJLy8gQ01PVk5TMzJycg0KKyAgICA0MDQ3ODQ3NTVVLAkvLyBDTU9WTlM2NHJtDQorICAgIDIwMzQ1ODE2M1UsCS8vIENNT1ZOUzY0cnINCisgICAgMjcwNTY3MDM2VSwJLy8gQ01PVk8xNnJtDQorICAgIDIwMzQ1ODE3MlUsCS8vIENNT1ZPMTZycg0KKyAgICAzMzc2NzU5MDhVLAkvLyBDTU9WTzMycm0NCisgICAgMjAzNDU4MTgwVSwJLy8gQ01PVk8zMnJyDQorICAgIDQwNDc4NDc4MFUsCS8vIENNT1ZPNjRybQ0KKyAgICAyMDM0NTgxODhVLAkvLyBDTU9WTzY0cnINCisgICAgMjcwNTY3MDYwVSwJLy8gQ01PVlAxNnJtDQorICAgIDIwMzQ1ODE5NlUsCS8vIENNT1ZQMTZycg0KKyAgICAzMzc2NzU5MzJVLAkvLyBDTU9WUDMycm0NCisgICAgMjAzNDU4MjA0VSwJLy8gQ01PVlAzMnJyDQorICAgIDQwNDc4NDgwNFUsCS8vIENNT1ZQNjRybQ0KKyAgICAyMDM0NTgyMTJVLAkvLyBDTU9WUDY0cnINCisgICAgNzc1OTYzMzJVLAkvLyBDTU9WUF9GDQorICAgIDBVLAkvLyBDTU9WUF9GcDMyDQorICAgIDBVLAkvLyBDTU9WUF9GcDY0DQorICAgIDBVLAkvLyBDTU9WUF9GcDgwDQorICAgIDI3MDU2NzA5M1UsCS8vIENNT1ZTMTZybQ0KKyAgICAyMDM0NTgyMjlVLAkvLyBDTU9WUzE2cnINCisgICAgMzM3Njc1OTY1VSwJLy8gQ01PVlMzMnJtDQorICAgIDIwMzQ1ODIzN1UsCS8vIENNT1ZTMzJycg0KKyAgICA0MDQ3ODQ4MzdVLAkvLyBDTU9WUzY0cm0NCisgICAgMjAzNDU4MjQ1VSwJLy8gQ01PVlM2NHJyDQorICAgIDE3NDFVLAkvLyBDTU9WX0ZSMzINCisgICAgMTc2MFUsCS8vIENNT1ZfRlI2NA0KKyAgICAxNzc5VSwJLy8gQ01PVl9HUjE2DQorICAgIDE3OTlVLAkvLyBDTU9WX0dSMzINCisgICAgMTgxOVUsCS8vIENNT1ZfR1I4DQorICAgIDE4MzdVLAkvLyBDTU9WX1JGUDMyDQorICAgIDE4NTdVLAkvLyBDTU9WX1JGUDY0DQorICAgIDE4NzdVLAkvLyBDTU9WX1JGUDgwDQorICAgIDE4OTdVLAkvLyBDTU9WX1YxSTY0DQorICAgIDE5MTdVLAkvLyBDTU9WX1YyRjY0DQorICAgIDE5MzdVLAkvLyBDTU9WX1YySTY0DQorICAgIDE5NTdVLAkvLyBDTU9WX1Y0RjMyDQorICAgIDY3MTEwODQxVSwJLy8gQ01QMTZpMTYNCisgICAgMTM1MjY4MjgxVSwJLy8gQ01QMTZtaQ0KKyAgICAxMzUyNjgyODFVLAkvLyBDTVAxNm1pOA0KKyAgICAxMzUyNjgyODFVLAkvLyBDTVAxNm1yDQorICAgIDExNDI5ODI1ODVVLAkvLyBDTVAxNnJpDQorICAgIDExNDI5ODI1ODVVLAkvLyBDTVAxNnJpOA0KKyAgICAxNDA5Mjg4MTIxVSwJLy8gQ01QMTZybQ0KKyAgICAxMTQyOTgyNTg1VSwJLy8gQ01QMTZycg0KKyAgICAxMTQyOTgyNTg1VSwJLy8gQ01QMTZycl9hbHQNCisgICAgNzAyNTY1NzVVLAkvLyBDTVAzMmkzMg0KKyAgICAxMzUzMzM4MjNVLAkvLyBDTVAzMm1pDQorICAgIDEzNTMzMzgyM1UsCS8vIENNUDMybWk4DQorICAgIDEzNTMzMzgyM1UsCS8vIENNUDMybXINCisgICAgMTE0Mjk4MjU5MVUsCS8vIENNUDMycmkNCisgICAgMTE0Mjk4MjU5MVUsCS8vIENNUDMycmk4DQorICAgIDE0NzYzOTY5OTFVLAkvLyBDTVAzMnJtDQorICAgIDExNDI5ODI1OTFVLAkvLyBDTVAzMnJyDQorICAgIDExNDI5ODI1OTFVLAkvLyBDTVAzMnJyX2FsdA0KKyAgICA3MTMwNTE1N1UsCS8vIENNUDY0aTMyDQorICAgIDEzNTM2NjU5N1UsCS8vIENNUDY0bWkzMg0KKyAgICAxMzUzNjY1OTdVLAkvLyBDTVA2NG1pOA0KKyAgICAxMzUzNjY1OTdVLAkvLyBDTVA2NG1yDQorICAgIDExNDI5ODI1OTdVLAkvLyBDTVA2NG1ybXJyDQorICAgIDExNDI5ODI1OTdVLAkvLyBDTVA2NHJpMzINCisgICAgMTE0Mjk4MjU5N1UsCS8vIENNUDY0cmk4DQorICAgIDE1NDM1MDU4NjFVLAkvLyBDTVA2NHJtDQorICAgIDExNDI5ODI1OTdVLAkvLyBDTVA2NHJyDQorICAgIDcyMzUzNzM5VSwJLy8gQ01QOGk4DQorICAgIDEzNTM5OTM3MVUsCS8vIENNUDhtaQ0KKyAgICAxMzUzOTkzNzFVLAkvLyBDTVA4bXINCisgICAgMTE0Mjk4MjYwM1UsCS8vIENNUDhyaQ0KKyAgICAxODE4MjMyNzc5VSwJLy8gQ01QOHJtDQorICAgIDExNDI5ODI2MDNVLAkvLyBDTVA4cnINCisgICAgMTE0Mjk4MjYwM1UsCS8vIENNUDhycl9hbHQNCisgICAgMTg5MDgxMzkwNVUsCS8vIENNUFBEcm1pDQorICAgIDEyODc4NDk5NDFVLAkvLyBDTVBQRHJtaV9hbHQNCisgICAgMTk1Nzk1NTUzN1UsCS8vIENNUFBEcnJpDQorICAgIDEzNDQzMDkyMDVVLAkvLyBDTVBQRHJyaV9hbHQNCisgICAgMTg5MjkxMTA1N1UsCS8vIENNUFBTcm1pDQorICAgIDEyODc4NDk5NDhVLAkvLyBDTVBQU3JtaV9hbHQNCisgICAgMTk2MDA1MjY4OVUsCS8vIENNUFBTcnJpDQorICAgIDEzNDQzMDkyMTJVLAkvLyBDTVBQU3JyaV9hbHQNCisgICAgMjAxOVUsCS8vIENNUFMxNg0KKyAgICAyMDI1VSwJLy8gQ01QUzMyDQorICAgIDIwMzFVLAkvLyBDTVBTNjQNCisgICAgMjAzN1UsCS8vIENNUFM4DQorICAgIDE4OTQwMjUxNjlVLAkvLyBDTVBTRHJtDQorICAgIDEyOTA5OTU3MDdVLAkvLyBDTVBTRHJtX2FsdA0KKyAgICAxOTYxMTAxMjY1VSwJLy8gQ01QU0Rycg0KKyAgICAxMzQ0MzA5MjQzVSwJLy8gQ01QU0Rycl9hbHQNCisgICAgMTg5NjE1NTA4OVUsCS8vIENNUFNTcm0NCisgICAgMTI5MzA5Mjg2NlUsCS8vIENNUFNTcm1fYWx0DQorICAgIDE5NjMxOTg0MTdVLAkvLyBDTVBTU3JyDQorICAgIDEzNDQzMDkyNTBVLAkvLyBDTVBTU3JyX2FsdA0KKyAgICAyMDEzMjY3OTc3VSwJLy8gQ01QWENIRzE2Qg0KKyAgICAxMzUyNjgzNzNVLAkvLyBDTVBYQ0hHMTZybQ0KKyAgICAxMTQyOTgyNjc3VSwJLy8gQ01QWENIRzE2cnINCisgICAgMTM1MzMzOTE5VSwJLy8gQ01QWENIRzMycm0NCisgICAgMTE0Mjk4MjY4N1UsCS8vIENNUFhDSEczMnJyDQorICAgIDEzNTM2NjY5N1UsCS8vIENNUFhDSEc2NHJtDQorICAgIDExNDI5ODI2OTdVLAkvLyBDTVBYQ0hHNjRycg0KKyAgICAxNjE2OTA2MjkxVSwJLy8gQ01QWENIRzhCDQorICAgIDEzNTM5OTQ4NlUsCS8vIENNUFhDSEc4cm0NCisgICAgMTE0Mjk4MjcxOFUsCS8vIENNUFhDSEc4cnINCisgICAgMjA4MDM3NjkwNFUsCS8vIENPTUlTRHJtDQorICAgIDExNDI5ODI3MjhVLAkvLyBDT01JU0Rycg0KKyAgICAyMDgwMzc2OTEyVSwJLy8gQ09NSVNTcm0NCisgICAgMTE0Mjk4MjczNlUsCS8vIENPTUlTU3JyDQorICAgIDczNDAyNDU2VSwJLy8gQ09NUF9GU1Qwcg0KKyAgICA3NzU5Njc2N1UsCS8vIENPTV9GSVByDQorICAgIDc3NTk2Nzc1VSwJLy8gQ09NX0ZJcg0KKyAgICA3MzQwMjQ3OFUsCS8vIENPTV9GU1Qwcg0KKyAgICAyMTY0VSwJLy8gQ09TX0YNCisgICAgMFUsCS8vIENPU19GcDMyDQorICAgIDBVLAkvLyBDT1NfRnA2NA0KKyAgICAwVSwJLy8gQ09TX0ZwODANCisgICAgMjE2OVUsCS8vIENQVUlEDQorICAgIDIxNzVVLAkvLyBDUU8NCisgICAgMjc2ODU5MDEyVSwJLy8gQ1JDMzJtMTYNCisgICAgMzQzOTY3ODg1VSwJLy8gQ1JDMzJtMzINCisgICAgNDc4MTg1NjIyVSwJLy8gQ1JDMzJtOA0KKyAgICAyMDk3NTAxNDhVLAkvLyBDUkMzMnIxNg0KKyAgICAyMDk3NTAxNTdVLAkvLyBDUkMzMnIzMg0KKyAgICAyMDk3NTAxNjZVLAkvLyBDUkMzMnI4DQorICAgIDQxMTA3Njc2N1UsCS8vIENSQzY0bTY0DQorICAgIDQ3ODE4NTYyMlUsCS8vIENSQzY0bTgNCisgICAgMjA5NzUwMTc1VSwJLy8gQ1JDNjRyNjQNCisgICAgMjA5NzUwMTY2VSwJLy8gQ1JDNjRyOA0KKyAgICAyMjE2VSwJLy8gQ1NfUFJFRklYDQorICAgIDIwODAzNzcwMDNVLAkvLyBDVlREUTJQRHJtDQorICAgIDExNDI5ODI4MjdVLAkvLyBDVlREUTJQRHJyDQorICAgIDEwNzM3NDQwNTNVLAkvLyBDVlREUTJQU3JtDQorICAgIDExNDI5ODI4MzdVLAkvLyBDVlREUTJQU3JyDQorICAgIDIwODAzNzcwMjNVLAkvLyBDVlRQRDJEUXJtDQorICAgIDExNDI5ODI4NDdVLAkvLyBDVlRQRDJEUXJyDQorICAgIDIwODAzNzcwMzNVLAkvLyBDVlRQRDJQU3JtDQorICAgIDExNDI5ODI4NTdVLAkvLyBDVlRQRDJQU3JyDQorICAgIDIwODAzNzcwNDNVLAkvLyBDVlRQUzJEUXJtDQorICAgIDExNDI5ODI4NjdVLAkvLyBDVlRQUzJEUXJyDQorICAgIDIxNTM3NzczNzNVLAkvLyBDVlRQUzJQRHJtDQorICAgIDExNDI5ODI4NzdVLAkvLyBDVlRQUzJQRHJyDQorICAgIDIyNzlVLAkvLyBDVlRTRDJTSTY0cm0NCisgICAgMjI3OVUsCS8vIENWVFNEMlNJNjRycg0KKyAgICAyMTUzNzc3MzkzVSwJLy8gQ1ZUU0QyU1NybQ0KKyAgICAxMTQyOTgyODk3VSwJLy8gQ1ZUU0QyU1Nycg0KKyAgICAxNTQzNTA2MTcxVSwJLy8gQ1ZUU0kyU0Q2NHJtDQorICAgIDExNDI5ODI5MDdVLAkvLyBDVlRTSTJTRDY0cnINCisgICAgMTQ3NjM5NzMxOFUsCS8vIENWVFNJMlNEcm0NCisgICAgMTE0Mjk4MjkxOFUsCS8vIENWVFNJMlNEcnINCisgICAgMTU0MzUwNjE5MlUsCS8vIENWVFNJMlNTNjRybQ0KKyAgICAxMTQyOTgyOTI4VSwJLy8gQ1ZUU0kyU1M2NHJyDQorICAgIDE0NzYzOTczMzlVLAkvLyBDVlRTSTJTU3JtDQorICAgIDExNDI5ODI5MzlVLAkvLyBDVlRTSTJTU3JyDQorICAgIDIyMjA4ODYzMDlVLAkvLyBDVlRTUzJTRHJtDQorICAgIDExNDI5ODI5NDlVLAkvLyBDVlRTUzJTRHJyDQorICAgIDIyMjA4ODYzMTlVLAkvLyBDVlRTUzJTSTY0cm0NCisgICAgMTE0Mjk4Mjk1OVUsCS8vIENWVFNTMlNJNjRycg0KKyAgICAyMjIwODg2MzMwVSwJLy8gQ1ZUU1MyU0lybQ0KKyAgICAxMTQyOTgyOTcwVSwJLy8gQ1ZUU1MyU0lycg0KKyAgICAyMDgwMzc3MTU3VSwJLy8gQ1ZUVFBTMkRRcm0NCisgICAgMTE0Mjk4Mjk4MVUsCS8vIENWVFRQUzJEUXJyDQorICAgIDIxNTM3Nzc0ODhVLAkvLyBDVlRUU0QyU0k2NHJtDQorICAgIDExNDI5ODI5OTJVLAkvLyBDVlRUU0QyU0k2NHJyDQorICAgIDIxNTM3Nzc1MDBVLAkvLyBDVlRUU0QyU0lybQ0KKyAgICAxMTQyOTgzMDA0VSwJLy8gQ1ZUVFNEMlNJcnINCisgICAgMjIyMDg4NjM3NVUsCS8vIENWVFRTUzJTSTY0cm0NCisgICAgMTE0Mjk4MzAxNVUsCS8vIENWVFRTUzJTSTY0cnINCisgICAgMjIyMDg4NjM4N1UsCS8vIENWVFRTUzJTSXJtDQorICAgIDExNDI5ODMwMjdVLAkvLyBDVlRUU1MyU0lycg0KKyAgICAyNDMwVSwJLy8gQ1dEDQorICAgIDI0MzVVLAkvLyBDV0RFDQorICAgIDg3MjQxNzY3MlUsCS8vIERFQzE2bQ0KKyAgICA3MzQwMjc2MFUsCS8vIERFQzE2cg0KKyAgICA5NDU4MTc5OThVLAkvLyBERUMzMm0NCisgICAgNzM0MDI3NjZVLAkvLyBERUMzMnINCisgICAgODcyNDE3NjcyVSwJLy8gREVDNjRfMTZtDQorICAgIDczNDAyNzYwVSwJLy8gREVDNjRfMTZyDQorICAgIDk0NTgxNzk5OFUsCS8vIERFQzY0XzMybQ0KKyAgICA3MzQwMjc2NlUsCS8vIERFQzY0XzMycg0KKyAgICAxNjE2OTA2NjQ0VSwJLy8gREVDNjRtDQorICAgIDczNDAyNzcyVSwJLy8gREVDNjRyDQorICAgIDE3NDQ4MzI5MjJVLAkvLyBERUM4bQ0KKyAgICA3MzQwMjc3OFUsCS8vIERFQzhyDQorICAgIDg3MjQxNzY5NlUsCS8vIERJVjE2bQ0KKyAgICA3MzQwMjc4NFUsCS8vIERJVjE2cg0KKyAgICA5NDU4MTgwMjJVLAkvLyBESVYzMm0NCisgICAgNzM0MDI3OTBVLAkvLyBESVYzMnINCisgICAgMTYxNjkwNjY2OFUsCS8vIERJVjY0bQ0KKyAgICA3MzQwMjc5NlUsCS8vIERJVjY0cg0KKyAgICAxNzQ0ODMyOTQ2VSwJLy8gRElWOG0NCisgICAgNzM0MDI4MDJVLAkvLyBESVY4cg0KKyAgICA1MzkwMDMzMjBVLAkvLyBESVZQRHJtDQorICAgIDIwMzQ1OTAwMFUsCS8vIERJVlBEcnINCisgICAgNTM5MDAzMzI3VSwJLy8gRElWUFNybQ0KKyAgICAyMDM0NTkwMDdVLAkvLyBESVZQU3JyDQorICAgIDczODIwMDAwNlUsCS8vIERJVlJfRjMybQ0KKyAgICA4MDUzMDg4NzhVLAkvLyBESVZSX0Y2NG0NCisgICAgODcyNDE3NzUwVSwJLy8gRElWUl9GSTE2bQ0KKyAgICA5NDU4MTgwNzlVLAkvLyBESVZSX0ZJMzJtDQorICAgIDczNDAyODU2VSwJLy8gRElWUl9GUHJTVDANCisgICAgNzM0MDI4NjNVLAkvLyBESVZSX0ZTVDByDQorICAgIDBVLAkvLyBESVZSX0ZwMzJtDQorICAgIDBVLAkvLyBESVZSX0ZwNjRtDQorICAgIDBVLAkvLyBESVZSX0ZwNjRtMzINCisgICAgMFUsCS8vIERJVlJfRnA4MG0zMg0KKyAgICAwVSwJLy8gRElWUl9GcDgwbTY0DQorICAgIDBVLAkvLyBESVZSX0ZwSTE2bTMyDQorICAgIDBVLAkvLyBESVZSX0ZwSTE2bTY0DQorICAgIDBVLAkvLyBESVZSX0ZwSTE2bTgwDQorICAgIDBVLAkvLyBESVZSX0ZwSTMybTMyDQorICAgIDBVLAkvLyBESVZSX0ZwSTMybTY0DQorICAgIDBVLAkvLyBESVZSX0ZwSTMybTgwDQorICAgIDczNDAyODcwVSwJLy8gRElWUl9GclNUMA0KKyAgICA2MDYxMTIyNjBVLAkvLyBESVZTRHJtDQorICAgIDYwNjExMjI2MFUsCS8vIERJVlNEcm1fSW50DQorICAgIDIwMzQ1OTA3NlUsCS8vIERJVlNEcnINCisgICAgMjAzNDU5MDc2VSwJLy8gRElWU0Rycl9JbnQNCisgICAgNjczMjIxMTMxVSwJLy8gRElWU1NybQ0KKyAgICA2NzMyMjExMzFVLAkvLyBESVZTU3JtX0ludA0KKyAgICAyMDM0NTkwODNVLAkvLyBESVZTU3JyDQorICAgIDIwMzQ1OTA4M1UsCS8vIERJVlNTcnJfSW50DQorICAgIDczODIwMDA4MlUsCS8vIERJVl9GMzJtDQorICAgIDgwNTMwODk1M1UsCS8vIERJVl9GNjRtDQorICAgIDg3MjQxNzgyNFUsCS8vIERJVl9GSTE2bQ0KKyAgICA5NDU4MTgxNTJVLAkvLyBESVZfRkkzMm0NCisgICAgNzM0MDI5MjhVLAkvLyBESVZfRlByU1QwDQorICAgIDczNDAyOTM2VSwJLy8gRElWX0ZTVDByDQorICAgIDBVLAkvLyBESVZfRnAzMg0KKyAgICAwVSwJLy8gRElWX0ZwMzJtDQorICAgIDBVLAkvLyBESVZfRnA2NA0KKyAgICAwVSwJLy8gRElWX0ZwNjRtDQorICAgIDBVLAkvLyBESVZfRnA2NG0zMg0KKyAgICAwVSwJLy8gRElWX0ZwODANCisgICAgMFUsCS8vIERJVl9GcDgwbTMyDQorICAgIDBVLAkvLyBESVZfRnA4MG02NA0KKyAgICAwVSwJLy8gRElWX0ZwSTE2bTMyDQorICAgIDBVLAkvLyBESVZfRnBJMTZtNjQNCisgICAgMFUsCS8vIERJVl9GcEkxNm04MA0KKyAgICAwVSwJLy8gRElWX0ZwSTMybTMyDQorICAgIDBVLAkvLyBESVZfRnBJMzJtNjQNCisgICAgMFUsCS8vIERJVl9GcEkzMm04MA0KKyAgICA3MzQwMjk0MlUsCS8vIERJVl9GclNUMA0KKyAgICAxMjg0NzA0ODQ1VSwJLy8gRFBQRHJtaQ0KKyAgICAxMzQ0MzA5ODM3VSwJLy8gRFBQRHJyaQ0KKyAgICAxMjg0NzA0ODUxVSwJLy8gRFBQU3JtaQ0KKyAgICAxMzQ0MzA5ODQzVSwJLy8gRFBQU3JyaQ0KKyAgICAyNjQ5VSwJLy8gRFNfUFJFRklYDQorICAgIDczNDAyOTcyVSwJLy8gRUhfUkVUVVJODQorICAgIDczNDAyOTcyVSwJLy8gRUhfUkVUVVJONjQNCisgICAgNjg1MjA1NjNVLAkvLyBFTlRFUg0KKyAgICAyNjgyVSwJLy8gRVNfUFJFRklYDQorICAgIDEyMjcyMjk4MjFVLAkvLyBFWFRSQUNUUFNtcg0KKyAgICAyMDk4ODE3MjVVLAkvLyBFWFRSQUNUUFNycg0KKyAgICAyNjk2VSwJLy8gRjJYTTENCisgICAgNjg1MjA1OTBVLAkvLyBGQVJDQUxMMTZpDQorICAgIDIyODE3MDQwODZVLAkvLyBGQVJDQUxMMTZtDQorICAgIDY4NTIwNjA3VSwJLy8gRkFSQ0FMTDMyaQ0KKyAgICAyMjgxNzA0MTAzVSwJLy8gRkFSQ0FMTDMybQ0KKyAgICAyMjgxNzA0MTEyVSwJLy8gRkFSQ0FMTDY0DQorICAgIDY4NTIwNjMzVSwJLy8gRkFSSk1QMTZpDQorICAgIDIyODE3MDQxMjhVLAkvLyBGQVJKTVAxNm0NCisgICAgNjg1MjA2NDhVLAkvLyBGQVJKTVAzMmkNCisgICAgMjI4MTcwNDE0M1UsCS8vIEZBUkpNUDMybQ0KKyAgICAyMjgxNzA0MTUxVSwJLy8gRkFSSk1QNjQNCisgICAgNzM4MjAwMjg3VSwJLy8gRkJMRG0NCisgICAgNzM4MjAwMjkzVSwJLy8gRkJTVFBtDQorICAgIDczODIwMDMwMFUsCS8vIEZDT00zMm0NCisgICAgODA1MzA5MTcxVSwJLy8gRkNPTTY0bQ0KKyAgICA3MzgyMDAzMTRVLAkvLyBGQ09NUDMybQ0KKyAgICA4MDUzMDkxODZVLAkvLyBGQ09NUDY0bQ0KKyAgICAyODI2VSwJLy8gRkNPTVBQDQorICAgIDI4MzNVLAkvLyBGREVDU1RQDQorICAgIDczNDAzMTYxVSwJLy8gRkZSRUUNCisgICAgODcyNDE4MDgwVSwJLy8gRklDT00xNm0NCisgICAgOTQ1ODE4NDA4VSwJLy8gRklDT00zMm0NCisgICAgODcyNDE4MDk2VSwJLy8gRklDT01QMTZtDQorICAgIDk0NTgxODQyNVUsCS8vIEZJQ09NUDMybQ0KKyAgICAyODgyVSwJLy8gRklOQ1NUUA0KKyAgICA4NzI0MTgxMjJVLAkvLyBGTERDVzE2bQ0KKyAgICA3MzgyMDA0MDFVLAkvLyBGTERFTlZtDQorICAgIDI5MDVVLAkvLyBGTERMMkUNCisgICAgMjkxMlUsCS8vIEZMREwyVA0KKyAgICAyOTE5VSwJLy8gRkxETEcyDQorICAgIDI5MjZVLAkvLyBGTERMTjINCisgICAgMjkzM1UsCS8vIEZMRFBJDQorICAgIDI5MzlVLAkvLyBGTkNMRVgNCisgICAgMjk0NlUsCS8vIEZOSU5JVA0KKyAgICAyOTUzVSwJLy8gRk5PUA0KKyAgICA4NzI0MTgxOTBVLAkvLyBGTlNUQ1cxNm0NCisgICAgMjk2NlUsCS8vIEZOU1RTVzhyDQorICAgIDczODIwMDQ4MVUsCS8vIEZOU1RTV20NCisgICAgMjk4NVUsCS8vIEZQMzJfVE9fSU5UMTZfSU5fTUVNDQorICAgIDMwMTZVLAkvLyBGUDMyX1RPX0lOVDMyX0lOX01FTQ0KKyAgICAzMDQ3VSwJLy8gRlAzMl9UT19JTlQ2NF9JTl9NRU0NCisgICAgMzA3OFUsCS8vIEZQNjRfVE9fSU5UMTZfSU5fTUVNDQorICAgIDMxMDlVLAkvLyBGUDY0X1RPX0lOVDMyX0lOX01FTQ0KKyAgICAzMTQwVSwJLy8gRlA2NF9UT19JTlQ2NF9JTl9NRU0NCisgICAgMzE3MVUsCS8vIEZQODBfVE9fSU5UMTZfSU5fTUVNDQorICAgIDMyMDJVLAkvLyBGUDgwX1RPX0lOVDMyX0lOX01FTQ0KKyAgICAzMjMzVSwJLy8gRlA4MF9UT19JTlQ2NF9JTl9NRU0NCisgICAgMzI2NFUsCS8vIEZQQVRBTg0KKyAgICAzMjcxVSwJLy8gRlBSRU0NCisgICAgMzI3N1UsCS8vIEZQUkVNMQ0KKyAgICAzMjg0VSwJLy8gRlBUQU4NCisgICAgMzI5MFUsCS8vIEZSTkRJTlQNCisgICAgNzM4MjAwODAyVSwJLy8gRlJTVE9SbQ0KKyAgICA3MzgyMDA4MTBVLAkvLyBGU0FWRW0NCisgICAgMzMxNFUsCS8vIEZTQ0FMRQ0KKyAgICAzMzIxVSwJLy8gRlNJTkNPUw0KKyAgICA3MzgyMDA4MzNVLAkvLyBGU1RFTlZtDQorICAgIDE0NzYzOTgzNDZVLAkvLyBGU19NT1YzMnJtDQorICAgIDMzNDhVLAkvLyBGU19QUkVGSVgNCisgICAgMzM1MVUsCS8vIEZYQU0NCisgICAgMjI4MTcwNDczMlUsCS8vIEZYUlNUT1INCisgICAgMjI4MTcwNDc0MVUsCS8vIEZYU0FWRQ0KKyAgICAzMzczVSwJLy8gRlhUUkFDVA0KKyAgICAzMzgxVSwJLy8gRllMMlgNCisgICAgMzM4N1UsCS8vIEZZTDJYUDENCisgICAgMFUsCS8vIEZwR0VUX1NUMF8zMg0KKyAgICAwVSwJLy8gRnBHRVRfU1QwXzY0DQorICAgIDBVLAkvLyBGcEdFVF9TVDBfODANCisgICAgMFUsCS8vIEZwR0VUX1NUMV8zMg0KKyAgICAwVSwJLy8gRnBHRVRfU1QxXzY0DQorICAgIDBVLAkvLyBGcEdFVF9TVDFfODANCisgICAgMFUsCS8vIEZwU0VUX1NUMF8zMg0KKyAgICAwVSwJLy8gRnBTRVRfU1QwXzY0DQorICAgIDBVLAkvLyBGcFNFVF9TVDBfODANCisgICAgMFUsCS8vIEZwU0VUX1NUMV8zMg0KKyAgICAwVSwJLy8gRnBTRVRfU1QxXzY0DQorICAgIDBVLAkvLyBGcFNFVF9TVDFfODANCisgICAgNTM5MDAxMTI0VSwJLy8gRnNBTkROUERybQ0KKyAgICAyMDM0NTY4MDRVLAkvLyBGc0FORE5QRHJyDQorICAgIDUzOTAwMTEzMlUsCS8vIEZzQU5ETlBTcm0NCisgICAgMjAzNDU2ODEyVSwJLy8gRnNBTkROUFNycg0KKyAgICA1MzkwMDExNDBVLAkvLyBGc0FORFBEcm0NCisgICAgMjAzNDU2ODIwVSwJLy8gRnNBTkRQRHJyDQorICAgIDUzOTAwMTE0N1UsCS8vIEZzQU5EUFNybQ0KKyAgICAyMDM0NTY4MjdVLAkvLyBGc0FORFBTcnINCisgICAgMFUsCS8vIEZzRkxEMFNEDQorICAgIDBVLAkvLyBGc0ZMRDBTUw0KKyAgICAyMDgwMzc4MTc5VSwJLy8gRnNNT1ZBUERybQ0KKyAgICAxMTQyOTg0MDAzVSwJLy8gRnNNT1ZBUERycg0KKyAgICAyMDgwMzc4MTg3VSwJLy8gRnNNT1ZBUFNybQ0KKyAgICAxMTQyOTg0MDExVSwJLy8gRnNNT1ZBUFNycg0KKyAgICA1MzkwMDQyNDNVLAkvLyBGc09SUERybQ0KKyAgICAyMDM0NTk5MjNVLAkvLyBGc09SUERycg0KKyAgICA1MzkwMDQyNDlVLAkvLyBGc09SUFNybQ0KKyAgICAyMDM0NTk5MjlVLAkvLyBGc09SUFNycg0KKyAgICA1MzkwMDQyNTVVLAkvLyBGc1hPUlBEcm0NCisgICAgMjAzNDU5OTM1VSwJLy8gRnNYT1JQRHJyDQorICAgIDUzOTAwNDI2MlUsCS8vIEZzWE9SUFNybQ0KKyAgICAyMDM0NTk5NDJVLAkvLyBGc1hPUlBTcnINCisgICAgMTQ3NjM5ODQ0NVUsCS8vIEdTX01PVjMycm0NCisgICAgMzQ0N1UsCS8vIEdTX1BSRUZJWA0KKyAgICA1MzkwMDQyODJVLAkvLyBIQUREUERybQ0KKyAgICAyMDM0NTk5NjJVLAkvLyBIQUREUERycg0KKyAgICA1MzkwMDQyOTBVLAkvLyBIQUREUFNybQ0KKyAgICAyMDM0NTk5NzBVLAkvLyBIQUREUFNycg0KKyAgICAzNDY2VSwJLy8gSExUDQorICAgIDUzOTAwNDMwMlUsCS8vIEhTVUJQRHJtDQorICAgIDIwMzQ1OTk4MlUsCS8vIEhTVUJQRHJyDQorICAgIDUzOTAwNDMxMFUsCS8vIEhTVUJQU3JtDQorICAgIDIwMzQ1OTk5MFUsCS8vIEhTVUJQU3JyDQorICAgIDg3MjQxODcxOFUsCS8vIElESVYxNm0NCisgICAgNzM0MDM4MDZVLAkvLyBJRElWMTZyDQorICAgIDk0NTgxOTA0NVUsCS8vIElESVYzMm0NCisgICAgNzM0MDM4MTNVLAkvLyBJRElWMzJyDQorICAgIDE2MTY5MDc2OTJVLAkvLyBJRElWNjRtDQorICAgIDczNDAzODIwVSwJLy8gSURJVjY0cg0KKyAgICAxNzQ0ODMzOTcxVSwJLy8gSURJVjhtDQorICAgIDczNDAzODI3VSwJLy8gSURJVjhyDQorICAgIDg3MjQxODc0NlUsCS8vIElMRF9GMTZtDQorICAgIDk0NTgxOTA3M1UsCS8vIElMRF9GMzJtDQorICAgIDE2MTY5MDc3MjBVLAkvLyBJTERfRjY0bQ0KKyAgICAwVSwJLy8gSUxEX0ZwMTZtMzINCisgICAgMFUsCS8vIElMRF9GcDE2bTY0DQorICAgIDBVLAkvLyBJTERfRnAxNm04MA0KKyAgICAwVSwJLy8gSUxEX0ZwMzJtMzINCisgICAgMFUsCS8vIElMRF9GcDMybTY0DQorICAgIDBVLAkvLyBJTERfRnAzMm04MA0KKyAgICAwVSwJLy8gSUxEX0ZwNjRtMzINCisgICAgMFUsCS8vIElMRF9GcDY0bTY0DQorICAgIDBVLAkvLyBJTERfRnA2NG04MA0KKyAgICA4NzI0MTg3NjhVLAkvLyBJTVVMMTZtDQorICAgIDczNDAzODU2VSwJLy8gSU1VTDE2cg0KKyAgICAyNzA1Njg5MTJVLAkvLyBJTVVMMTZybQ0KKyAgICAxMjI3ODg2MDMyVSwJLy8gSU1VTDE2cm1pDQorICAgIDEyMjc4ODYwMzJVLAkvLyBJTVVMMTZybWk4DQorICAgIDIwMzQ2MDA0OFUsCS8vIElNVUwxNnJyDQorICAgIDIwOTg4MjU3NlUsCS8vIElNVUwxNnJyaQ0KKyAgICAyMDk4ODI1NzZVLAkvLyBJTVVMMTZycmk4DQorICAgIDk0NTgxOTA5NVUsCS8vIElNVUwzMm0NCisgICAgNzM0MDM4NjNVLAkvLyBJTVVMMzJyDQorICAgIDMzNzY3Nzc4M1UsCS8vIElNVUwzMnJtDQorICAgIDEyMjg5MzQ2MTVVLAkvLyBJTVVMMzJybWkNCisgICAgMTIyODkzNDYxNVUsCS8vIElNVUwzMnJtaTgNCisgICAgMjAzNDYwMDU1VSwJLy8gSU1VTDMycnINCisgICAgMjA5ODgyNTgzVSwJLy8gSU1VTDMycnJpDQorICAgIDIwOTg4MjU4M1UsCS8vIElNVUwzMnJyaTgNCisgICAgMTYxNjkwNzc0MlUsCS8vIElNVUw2NG0NCisgICAgNzM0MDM4NzBVLAkvLyBJTVVMNjRyDQorICAgIDQwNDc4NjY1NFUsCS8vIElNVUw2NHJtDQorICAgIDEyMjk5ODMxOThVLAkvLyBJTVVMNjRybWkzMg0KKyAgICAxMjI5OTgzMTk4VSwJLy8gSU1VTDY0cm1pOA0KKyAgICAyMDM0NjAwNjJVLAkvLyBJTVVMNjRycg0KKyAgICAyMDk4ODI1OTBVLAkvLyBJTVVMNjRycmkzMg0KKyAgICAyMDk4ODI1OTBVLAkvLyBJTVVMNjRycmk4DQorICAgIDE3NDQ4MzQwMjFVLAkvLyBJTVVMOG0NCisgICAgNzM0MDM4NzdVLAkvLyBJTVVMOHINCisgICAgMzU2NFUsCS8vIElOMTYNCisgICAgNjcxMTI0MzNVLAkvLyBJTjE2cmkNCisgICAgMzU3NFUsCS8vIElOMTZycg0KKyAgICAzNTg3VSwJLy8gSU4zMg0KKyAgICA3MDI1ODE4NFUsCS8vIElOMzJyaQ0KKyAgICAzNTk3VSwJLy8gSU4zMnJyDQorICAgIDM2MTFVLAkvLyBJTjgNCisgICAgNzIzNTUzNjBVLAkvLyBJTjhyaQ0KKyAgICAzNjIxVSwJLy8gSU44cnINCisgICAgODcyNDE4ODY2VSwJLy8gSU5DMTZtDQorICAgIDczNDAzOTU0VSwJLy8gSU5DMTZyDQorICAgIDk0NTgxOTE5MlUsCS8vIElOQzMybQ0KKyAgICA3MzQwMzk2MFUsCS8vIElOQzMycg0KKyAgICA4NzI0MTg4NjZVLAkvLyBJTkM2NF8xNm0NCisgICAgNzM0MDM5NTRVLAkvLyBJTkM2NF8xNnINCisgICAgOTQ1ODE5MTkyVSwJLy8gSU5DNjRfMzJtDQorICAgIDczNDAzOTYwVSwJLy8gSU5DNjRfMzJyDQorICAgIDE2MTY5MDc4MzhVLAkvLyBJTkM2NG0NCisgICAgNzM0MDM5NjZVLAkvLyBJTkM2NHINCisgICAgMTc0NDgzNDExNlUsCS8vIElOQzhtDQorICAgIDczNDAzOTcyVSwJLy8gSU5DOHINCisgICAgMTI5MzA5NDQ3NFUsCS8vIElOU0VSVFBTcm0NCisgICAgMTM0NDMxMDg1OFUsCS8vIElOU0VSVFBTcnINCisgICAgNzM0MDM5ODhVLAkvLyBJTlQNCisgICAgMzY3M1UsCS8vIElOVDMNCisgICAgMzY3OFUsCS8vIElOVE8NCisgICAgMzY4M1UsCS8vIElOVkQNCisgICAgMzY4OFUsCS8vIElOVkVQVA0KKyAgICAxNzQ0ODM0MTU5VSwJLy8gSU5WTFBHDQorICAgIDM3MDNVLAkvLyBJTlZWUElEDQorICAgIDM3MTFVLAkvLyBJUkVUMTYNCisgICAgMzcxN1UsCS8vIElSRVQzMg0KKyAgICAzNzIzVSwJLy8gSVJFVDY0DQorICAgIDg3MjQxODk2MVUsCS8vIElTVFRfRlAxNm0NCisgICAgOTQ1ODE5MjkwVSwJLy8gSVNUVF9GUDMybQ0KKyAgICAxNjE2OTA3OTM5VSwJLy8gSVNUVF9GUDY0bQ0KKyAgICAwVSwJLy8gSVNUVF9GcDE2bTMyDQorICAgIDBVLAkvLyBJU1RUX0ZwMTZtNjQNCisgICAgMFUsCS8vIElTVFRfRnAxNm04MA0KKyAgICAwVSwJLy8gSVNUVF9GcDMybTMyDQorICAgIDBVLAkvLyBJU1RUX0ZwMzJtNjQNCisgICAgMFUsCS8vIElTVFRfRnAzMm04MA0KKyAgICAwVSwJLy8gSVNUVF9GcDY0bTMyDQorICAgIDBVLAkvLyBJU1RUX0ZwNjRtNjQNCisgICAgMFUsCS8vIElTVFRfRnA2NG04MA0KKyAgICA4NzI0MTg5ODlVLAkvLyBJU1RfRjE2bQ0KKyAgICA5NDU4MTkzMTZVLAkvLyBJU1RfRjMybQ0KKyAgICA4NzI0MTkwMDNVLAkvLyBJU1RfRlAxNm0NCisgICAgOTQ1ODE5MzMxVSwJLy8gSVNUX0ZQMzJtDQorICAgIDE2MTY5MDc5NzlVLAkvLyBJU1RfRlA2NG0NCisgICAgMFUsCS8vIElTVF9GcDE2bTMyDQorICAgIDBVLAkvLyBJU1RfRnAxNm02NA0KKyAgICAwVSwJLy8gSVNUX0ZwMTZtODANCisgICAgMFUsCS8vIElTVF9GcDMybTMyDQorICAgIDBVLAkvLyBJU1RfRnAzMm02NA0KKyAgICAwVSwJLy8gSVNUX0ZwMzJtODANCisgICAgMFUsCS8vIElTVF9GcDY0bTMyDQorICAgIDBVLAkvLyBJU1RfRnA2NG02NA0KKyAgICAwVSwJLy8gSVNUX0ZwNjRtODANCisgICAgMTg5NDAyNTE2OVUsCS8vIEludF9DTVBTRHJtDQorICAgIDE5NjExMDEyNjVVLAkvLyBJbnRfQ01QU0Rycg0KKyAgICAxODk2MTU1MDg5VSwJLy8gSW50X0NNUFNTcm0NCisgICAgMTk2MzE5ODQxN1UsCS8vIEludF9DTVBTU3JyDQorICAgIDIwODAzNzY5MDRVLAkvLyBJbnRfQ09NSVNEcm0NCisgICAgMTE0Mjk4MjcyOFUsCS8vIEludF9DT01JU0Rycg0KKyAgICAyMDgwMzc2OTEyVSwJLy8gSW50X0NPTUlTU3JtDQorICAgIDExNDI5ODI3MzZVLAkvLyBJbnRfQ09NSVNTcnINCisgICAgMTU0MzUwNjA5MVUsCS8vIEludF9DVlREUTJQRHJtDQorICAgIDExNDI5ODI4MjdVLAkvLyBJbnRfQ1ZURFEyUERycg0KKyAgICAxMDczNzQ0MDUzVSwJLy8gSW50X0NWVERRMlBTcm0NCisgICAgMTE0Mjk4MjgzN1UsCS8vIEludF9DVlREUTJQU3JyDQorICAgIDIwODAzNzcwMjNVLAkvLyBJbnRfQ1ZUUEQyRFFybQ0KKyAgICAxMTQyOTgyODQ3VSwJLy8gSW50X0NWVFBEMkRRcnINCisgICAgMjA4MDM3ODU4MFUsCS8vIEludF9DVlRQRDJQSXJtDQorICAgIDExNDI5ODQ0MDRVLAkvLyBJbnRfQ1ZUUEQyUElycg0KKyAgICAyMDgwMzc3MDMzVSwJLy8gSW50X0NWVFBEMlBTcm0NCisgICAgMTE0Mjk4Mjg1N1UsCS8vIEludF9DVlRQRDJQU3JyDQorICAgIDE1NDM1MDc2NzhVLAkvLyBJbnRfQ1ZUUEkyUERybQ0KKyAgICAxMTQyOTg0NDE0VSwJLy8gSW50X0NWVFBJMlBEcnINCisgICAgNDA0Nzg2OTIwVSwJLy8gSW50X0NWVFBJMlBTcm0NCisgICAgMjAzNDYwMzI4VSwJLy8gSW50X0NWVFBJMlBTcnINCisgICAgMjA4MDM3NzA0M1UsCS8vIEludF9DVlRQUzJEUXJtDQorICAgIDExNDI5ODI4NjdVLAkvLyBJbnRfQ1ZUUFMyRFFycg0KKyAgICAyMTUzNzc3MzczVSwJLy8gSW50X0NWVFBTMlBEcm0NCisgICAgMTE0Mjk4Mjg3N1UsCS8vIEludF9DVlRQUzJQRHJyDQorICAgIDIxNTM3Nzg5MzBVLAkvLyBJbnRfQ1ZUUFMyUElybQ0KKyAgICAxMTQyOTg0NDM0VSwJLy8gSW50X0NWVFBTMlBJcnINCisgICAgMjA4MDM3ODYyMFUsCS8vIEludF9DVlRTRDJTSTY0cm0NCisgICAgMTE0Mjk4NDQ0NFUsCS8vIEludF9DVlRTRDJTSTY0cnINCisgICAgMjA4MDM3ODYyMFUsCS8vIEludF9DVlRTRDJTSXJtDQorICAgIDExNDI5ODQ0NDRVLAkvLyBJbnRfQ1ZUU0QyU0lycg0KKyAgICA2MDYxMTE5ODVVLAkvLyBJbnRfQ1ZUU0QyU1NybQ0KKyAgICAyMDM0NTg4MDFVLAkvLyBJbnRfQ1ZUU0QyU1Nycg0KKyAgICA0MDQ3ODU0MTRVLAkvLyBJbnRfQ1ZUU0kyU0Q2NHJtDQorICAgIDIwMzQ1ODgyMlUsCS8vIEludF9DVlRTSTJTRDY0cnINCisgICAgMzM3Njc2NTUwVSwJLy8gSW50X0NWVFNJMlNEcm0NCisgICAgMjAzNDU4ODIyVSwJLy8gSW50X0NWVFNJMlNEcnINCisgICAgNDA0Nzg1NDI0VSwJLy8gSW50X0NWVFNJMlNTNjRybQ0KKyAgICAyMDM0NTg4MzJVLAkvLyBJbnRfQ1ZUU0kyU1M2NHJyDQorICAgIDMzNzY3NjU3MVUsCS8vIEludF9DVlRTSTJTU3JtDQorICAgIDIwMzQ1ODg0M1UsCS8vIEludF9DVlRTSTJTU3JyDQorICAgIDY3MzIyMDkwMVUsCS8vIEludF9DVlRTUzJTRHJtDQorICAgIDIwMzQ1ODg1M1UsCS8vIEludF9DVlRTUzJTRHJyDQorICAgIDIyMjA4ODYzMTlVLAkvLyBJbnRfQ1ZUU1MyU0k2NHJtDQorICAgIDExNDI5ODI5NTlVLAkvLyBJbnRfQ1ZUU1MyU0k2NHJyDQorICAgIDIyMjA4ODc4MTRVLAkvLyBJbnRfQ1ZUU1MyU0lybQ0KKyAgICAxMTQyOTg0NDU0VSwJLy8gSW50X0NWVFNTMlNJcnINCisgICAgMjA4MDM3ODY0MFUsCS8vIEludF9DVlRUUEQyRFFybQ0KKyAgICAxMTQyOTg0NDY0VSwJLy8gSW50X0NWVFRQRDJEUXJyDQorICAgIDIwODAzNzg2NTFVLAkvLyBJbnRfQ1ZUVFBEMlBJcm0NCisgICAgMTE0Mjk4NDQ3NVUsCS8vIEludF9DVlRUUEQyUElycg0KKyAgICAyMDgwMzc3MTU3VSwJLy8gSW50X0NWVFRQUzJEUXJtDQorICAgIDExNDI5ODI5ODFVLAkvLyBJbnRfQ1ZUVFBTMkRRcnINCisgICAgMjE1Mzc3ODk4MlUsCS8vIEludF9DVlRUUFMyUElybQ0KKyAgICAxMTQyOTg0NDg2VSwJLy8gSW50X0NWVFRQUzJQSXJyDQorICAgIDIwODAzNzcxOTFVLAkvLyBJbnRfQ1ZUVFNEMlNJNjRybQ0KKyAgICAxMTQyOTgzMDE1VSwJLy8gSW50X0NWVFRTRDJTSTY0cnINCisgICAgMjA4MDM3NzIwM1UsCS8vIEludF9DVlRUU0QyU0lybQ0KKyAgICAxMTQyOTgzMDI3VSwJLy8gSW50X0NWVFRTRDJTSXJyDQorICAgIDIyMjA4ODYzNzVVLAkvLyBJbnRfQ1ZUVFNTMlNJNjRybQ0KKyAgICAxMTQyOTgzMDE1VSwJLy8gSW50X0NWVFRTUzJTSTY0cnINCisgICAgMjIyMDg4NjM4N1UsCS8vIEludF9DVlRUU1MyU0lybQ0KKyAgICAxMTQyOTgzMDI3VSwJLy8gSW50X0NWVFRTUzJTSXJyDQorICAgIDM4ODlVLAkvLyBJbnRfTWVtQmFycmllcg0KKyAgICA5MDE4MTQzN1UsCS8vIEludF9NZW1CYXJyaWVyTm9TU0UNCisgICAgOTEyMzAwMjRVLAkvLyBJbnRfTWVtQmFycmllck5vU1NFNjQNCisgICAgMjA4MDM3ODcwN1UsCS8vIEludF9VQ09NSVNEcm0NCisgICAgMTE0Mjk4NDUzMVUsCS8vIEludF9VQ09NSVNEcnINCisgICAgMjA4MDM3ODcxNlUsCS8vIEludF9VQ09NSVNTcm0NCisgICAgMTE0Mjk4NDU0MFUsCS8vIEludF9VQ09NSVNTcnINCisgICAgMTg5NDAyNzEwOVUsCS8vIEludF9WQ01QU0RybQ0KKyAgICAxOTYxMTAzMjA1VSwJLy8gSW50X1ZDTVBTRHJyDQorICAgIDE4OTYxNTcwMjlVLAkvLyBJbnRfVkNNUFNTcm0NCisgICAgMTk2MzIwMDM1N1UsCS8vIEludF9WQ01QU1Nycg0KKyAgICAyMDgwMzc4NzMwVSwJLy8gSW50X1ZDT01JU0RybQ0KKyAgICAxMTQyOTg0NTU0VSwJLy8gSW50X1ZDT01JU0Rycg0KKyAgICAyMDgwMzc4NzM5VSwJLy8gSW50X1ZDT01JU1NybQ0KKyAgICAxMTQyOTg0NTYzVSwJLy8gSW50X1ZDT01JU1Nycg0KKyAgICAxNTQzNTA3ODM2VSwJLy8gSW50X1ZDVlREUTJQRHJtDQorICAgIDExNDI5ODQ1NzJVLAkvLyBJbnRfVkNWVERRMlBEcnINCisgICAgMTA3Mzc0NTc5OVUsCS8vIEludF9WQ1ZURFEyUFNybQ0KKyAgICAxMTQyOTg0NTgzVSwJLy8gSW50X1ZDVlREUTJQU3JyDQorICAgIDIwODAzNzg3NzBVLAkvLyBJbnRfVkNWVFBEMkRRcm0NCisgICAgMTE0Mjk4NDU5NFUsCS8vIEludF9WQ1ZUUEQyRFFycg0KKyAgICAyMDgwMzc4NzgxVSwJLy8gSW50X1ZDVlRQRDJQU3JtDQorICAgIDExNDI5ODQ2MDVVLAkvLyBJbnRfVkNWVFBEMlBTcnINCisgICAgMjA4MDM3ODc5MlUsCS8vIEludF9WQ1ZUUFMyRFFybQ0KKyAgICAxMTQyOTg0NjE2VSwJLy8gSW50X1ZDVlRQUzJEUXJyDQorICAgIDIxNTM3NzkxMjNVLAkvLyBJbnRfVkNWVFBTMlBEcm0NCisgICAgMTE0Mjk4NDYyN1UsCS8vIEludF9WQ1ZUUFMyUERycg0KKyAgICAyMDgwMzc4ODE0VSwJLy8gSW50X1ZDVlRTRDJTSTY0cm0NCisgICAgMTE0Mjk4NDYzOFUsCS8vIEludF9WQ1ZUU0QyU0k2NHJyDQorICAgIDIwODAzNzg4MTRVLAkvLyBJbnRfVkNWVFNEMlNJcm0NCisgICAgMTE0Mjk4NDYzOFUsCS8vIEludF9WQ1ZUU0QyU0lycg0KKyAgICA2MTI1MzYyNjVVLAkvLyBJbnRfVkNWVFNEMlNTcm0NCisgICAgMjA5ODgzMDgxVSwJLy8gSW50X1ZDVlRTRDJTU3JyDQorICAgIDQxMTIwOTY4NFUsCS8vIEludF9WQ1ZUU0kyU0Q2NHJtDQorICAgIDIwOTg4MzA5MlUsCS8vIEludF9WQ1ZUU0kyU0Q2NHJyDQorICAgIDM0NDEwMDgyMFUsCS8vIEludF9WQ1ZUU0kyU0RybQ0KKyAgICAyMDk4ODMwOTJVLAkvLyBJbnRfVkNWVFNJMlNEcnINCisgICAgNDExMjA5Njk1VSwJLy8gSW50X1ZDVlRTSTJTUzY0cm0NCisgICAgMjA5ODgzMTAzVSwJLy8gSW50X1ZDVlRTSTJTUzY0cnINCisgICAgMzQ0MTAwODMxVSwJLy8gSW50X1ZDVlRTSTJTU3JtDQorICAgIDIwOTg4MzEwM1UsCS8vIEludF9WQ1ZUU0kyU1Nycg0KKyAgICA2Nzk2NDUxNjJVLAkvLyBJbnRfVkNWVFNTMlNEcm0NCisgICAgMjA5ODgzMTE0VSwJLy8gSW50X1ZDVlRTUzJTRHJyDQorICAgIDIyMjA4ODgwNTNVLAkvLyBJbnRfVkNWVFNTMlNJNjRybQ0KKyAgICAxMTQyOTg0NjkzVSwJLy8gSW50X1ZDVlRTUzJTSTY0cnINCisgICAgMjIyMDg4ODA1M1UsCS8vIEludF9WQ1ZUU1MyU0lybQ0KKyAgICAxMTQyOTg0NjkzVSwJLy8gSW50X1ZDVlRTUzJTSXJyDQorICAgIDIwODAzNzg4ODBVLAkvLyBJbnRfVkNWVFRQRDJEUXJtDQorICAgIDExNDI5ODQ3MDRVLAkvLyBJbnRfVkNWVFRQRDJEUXJyDQorICAgIDIwODAzNzg4OTJVLAkvLyBJbnRfVkNWVFRQUzJEUXJtDQorICAgIDExNDI5ODQ3MTZVLAkvLyBJbnRfVkNWVFRQUzJEUXJyDQorICAgIDIwODAzNzg5MDRVLAkvLyBJbnRfVkNWVFRTRDJTSTY0cm0NCisgICAgMTE0Mjk4NDcyOFUsCS8vIEludF9WQ1ZUVFNEMlNJNjRycg0KKyAgICAyMDgwMzc4OTA0VSwJLy8gSW50X1ZDVlRUU0QyU0lybQ0KKyAgICAxMTQyOTg0NzI4VSwJLy8gSW50X1ZDVlRUU0QyU0lycg0KKyAgICAyMjIwODg4MDg4VSwJLy8gSW50X1ZDVlRUU1MyU0k2NHJtDQorICAgIDExNDI5ODQ3MjhVLAkvLyBJbnRfVkNWVFRTUzJTSTY0cnINCisgICAgMjIyMDg4ODA4OFUsCS8vIEludF9WQ1ZUVFNTMlNJcm0NCisgICAgMTE0Mjk4NDcyOFUsCS8vIEludF9WQ1ZUVFNTMlNJcnINCisgICAgMjA4MDM3ODkxNlUsCS8vIEludF9WVUNPTUlTRHJtDQorICAgIDExNDI5ODQ3NDBVLAkvLyBJbnRfVlVDT01JU0Rycg0KKyAgICAyMDgwMzc4OTI2VSwJLy8gSW50X1ZVQ09NSVNTcm0NCisgICAgMTE0Mjk4NDc1MFUsCS8vIEludF9WVUNPTUlTU3JyDQorICAgIDE2ODQwMTcyMDhVLAkvLyBKQUVfMQ0KKyAgICAxNjg0MDE3MjA4VSwJLy8gSkFFXzQNCisgICAgMTY4NDAxNzIxM1UsCS8vIEpBXzENCisgICAgMTY4NDAxNzIxM1UsCS8vIEpBXzQNCisgICAgMTY4NDAxNzIxN1UsCS8vIEpCRV8xDQorICAgIDE2ODQwMTcyMTdVLAkvLyBKQkVfNA0KKyAgICAxNjg0MDE3MjIyVSwJLy8gSkJfMQ0KKyAgICAxNjg0MDE3MjIyVSwJLy8gSkJfNA0KKyAgICAxNjg0MDE3MjI2VSwJLy8gSkNYWjgNCisgICAgMTY4NDAxNzIzMlUsCS8vIEpFXzENCisgICAgMTY4NDAxNzIzMlUsCS8vIEpFXzQNCisgICAgMTY4NDAxNzIzNlUsCS8vIEpHRV8xDQorICAgIDE2ODQwMTcyMzZVLAkvLyBKR0VfNA0KKyAgICAxNjg0MDE3MjQxVSwJLy8gSkdfMQ0KKyAgICAxNjg0MDE3MjQxVSwJLy8gSkdfNA0KKyAgICAxNjg0MDE3MjQ1VSwJLy8gSkxFXzENCisgICAgMTY4NDAxNzI0NVUsCS8vIEpMRV80DQorICAgIDE2ODQwMTcyNTBVLAkvLyBKTF8xDQorICAgIDE2ODQwMTcyNTBVLAkvLyBKTF80DQorICAgIDk0NTgxOTc1MFUsCS8vIEpNUDMybQ0KKyAgICA3MzQwNDUxOFUsCS8vIEpNUDMycg0KKyAgICAxNjE2OTA4Mzk3VSwJLy8gSk1QNjRtDQorICAgIDE2ODQwMTcyNjhVLAkvLyBKTVA2NHBjcmVsMzINCisgICAgNzM0MDQ1MjVVLAkvLyBKTVA2NHINCisgICAgMTY4NDAxNzI3NFUsCS8vIEpNUF8xDQorICAgIDE2ODQwMTcyNzRVLAkvLyBKTVBfNA0KKyAgICAxNjg0MDE3Mjc5VSwJLy8gSk5FXzENCisgICAgMTY4NDAxNzI3OVUsCS8vIEpORV80DQorICAgIDE2ODQwMTcyODRVLAkvLyBKTk9fMQ0KKyAgICAxNjg0MDE3Mjg0VSwJLy8gSk5PXzQNCisgICAgMTY4NDAxNzI4OVUsCS8vIEpOUF8xDQorICAgIDE2ODQwMTcyODlVLAkvLyBKTlBfNA0KKyAgICAxNjg0MDE3Mjk0VSwJLy8gSk5TXzENCisgICAgMTY4NDAxNzI5NFUsCS8vIEpOU180DQorICAgIDE2ODQwMTcyOTlVLAkvLyBKT18xDQorICAgIDE2ODQwMTcyOTlVLAkvLyBKT180DQorICAgIDE2ODQwMTczMDNVLAkvLyBKUF8xDQorICAgIDE2ODQwMTczMDNVLAkvLyBKUF80DQorICAgIDE2ODQwMTczMDdVLAkvLyBKU18xDQorICAgIDE2ODQwMTczMDdVLAkvLyBKU180DQorICAgIDQyNTVVLAkvLyBMQUhGDQorICAgIDE0MDkyOTA0MDRVLAkvLyBMQVIxNnJtDQorICAgIDExNDI5ODQ4NjhVLAkvLyBMQVIxNnJyDQorICAgIDE0MDkyOTA0MTBVLAkvLyBMQVIzMnJtDQorICAgIDExNDI5ODQ4NzRVLAkvLyBMQVIzMnJyDQorICAgIDE0MDkyOTA0MTZVLAkvLyBMQVI2NHJtDQorICAgIDExNDI5ODQ4ODBVLAkvLyBMQVI2NHJyDQorICAgIDEzNTI3MDU4MlUsCS8vIExDTVBYQ0hHMTYNCisgICAgMTM1MzM2MTM0VSwJLy8gTENNUFhDSEczMg0KKyAgICAxNTkzODc4NjJVLAkvLyBMQ01QWENIRzY0DQorICAgIDEzNTQwMTcwMlUsCS8vIExDTVBYQ0hHOA0KKyAgICAxNjE2OTA4NTM0VSwJLy8gTENNUFhDSEc4Qg0KKyAgICAxMDczNzQ2MTgzVSwJLy8gTEREUVVybQ0KKyAgICA5NDU4MTk5MThVLAkvLyBMRE1YQ1NSDQorICAgIDIzNDg4MTQ2MTVVLAkvLyBMRFMxNnJtDQorICAgIDIzNDg4MTQ2MjFVLAkvLyBMRFMzMnJtDQorICAgIDQzODdVLAkvLyBMRF9GMA0KKyAgICA0MzkyVSwJLy8gTERfRjENCisgICAgNzM4MjAxOTAxVSwJLy8gTERfRjMybQ0KKyAgICA4MDUzMTA3NzFVLAkvLyBMRF9GNjRtDQorICAgIDI0MTU5MjM1MTNVLAkvLyBMRF9GODBtDQorICAgIDBVLAkvLyBMRF9GcDAzMg0KKyAgICAwVSwJLy8gTERfRnAwNjQNCisgICAgMFUsCS8vIExEX0ZwMDgwDQorICAgIDBVLAkvLyBMRF9GcDEzMg0KKyAgICAwVSwJLy8gTERfRnAxNjQNCisgICAgMFUsCS8vIExEX0ZwMTgwDQorICAgIDBVLAkvLyBMRF9GcDMybQ0KKyAgICAwVSwJLy8gTERfRnAzMm02NA0KKyAgICAwVSwJLy8gTERfRnAzMm04MA0KKyAgICAwVSwJLy8gTERfRnA2NG0NCisgICAgMFUsCS8vIExEX0ZwNjRtODANCisgICAgMFUsCS8vIExEX0ZwODBtDQorICAgIDczNDA0NzM1VSwJLy8gTERfRnJyDQorICAgIDE0NzYzOTk0MjhVLAkvLyBMRUExNnINCisgICAgMTQ3NjM5OTQzNFUsCS8vIExFQTMycg0KKyAgICAxNDc2Mzk5NDM0VSwJLy8gTEVBNjRfMzJyDQorICAgIDE1NDM1MDgzMDRVLAkvLyBMRUE2NHINCisgICAgNDQzOFUsCS8vIExFQVZFDQorICAgIDQ0MzhVLAkvLyBMRUFWRTY0DQorICAgIDIzNDg4MTQ2ODRVLAkvLyBMRVMxNnJtDQorICAgIDIzNDg4MTQ2OTBVLAkvLyBMRVMzMnJtDQorICAgIDQ0NTZVLAkvLyBMRkVOQ0UNCisgICAgMjM0ODgxNDcwM1UsCS8vIExGUzE2cm0NCisgICAgMjM0ODgxNDcwOVUsCS8vIExGUzMycm0NCisgICAgMjM0ODgxNDcxNVUsCS8vIExGUzY0cm0NCisgICAgMjI4MTcwNTg1N1UsCS8vIExHRFRtDQorICAgIDIzNDg4MTQ3MjdVLAkvLyBMR1MxNnJtDQorICAgIDIzNDg4MTQ3MzNVLAkvLyBMR1MzMnJtDQorICAgIDIzNDg4MTQ3MzlVLAkvLyBMR1M2NHJtDQorICAgIDIyODE3MDU4ODFVLAkvLyBMSURUbQ0KKyAgICA4NzI0MTk3NDNVLAkvLyBMTERUMTZtDQorICAgIDczNDA0ODMxVSwJLy8gTExEVDE2cg0KKyAgICA4NzI0MTk3NTBVLAkvLyBMTVNXMTZtDQorICAgIDczNDA0ODM4VSwJLy8gTE1TVzE2cg0KKyAgICAxMzUyNzA4MjlVLAkvLyBMT0NLX0FERDE2bWkNCisgICAgMTM1MjcwODI5VSwJLy8gTE9DS19BREQxNm1pOA0KKyAgICAxMzUyNzA4MjlVLAkvLyBMT0NLX0FERDE2bXINCisgICAgMTM1MzM2Mzc3VSwJLy8gTE9DS19BREQzMm1pDQorICAgIDEzNTMzNjM3N1UsCS8vIExPQ0tfQUREMzJtaTgNCisgICAgMTM1MzM2Mzc3VSwJLy8gTE9DS19BREQzMm1yDQorICAgIDEzNTM2OTE1N1UsCS8vIExPQ0tfQURENjRtaTMyDQorICAgIDEzNTM2OTE1N1UsCS8vIExPQ0tfQURENjRtaTgNCisgICAgMTM1MzY5MTU3VSwJLy8gTE9DS19BREQ2NG1yDQorICAgIDEzNTQwMTkzN1UsCS8vIExPQ0tfQUREOG1pDQorICAgIDEzNTQwMTkzN1UsCS8vIExPQ0tfQUREOG1yDQorICAgIDg3MjQxOTgwNVUsCS8vIExPQ0tfREVDMTZtDQorICAgIDk0NTgyMDEzN1UsCS8vIExPQ0tfREVDMzJtDQorICAgIDE2MTY5MDg3ODlVLAkvLyBMT0NLX0RFQzY0bQ0KKyAgICAxNzQ0ODM1MDczVSwJLy8gTE9DS19ERUM4bQ0KKyAgICA4NzI0MTk4NTNVLAkvLyBMT0NLX0lOQzE2bQ0KKyAgICA5NDU4MjAxODVVLAkvLyBMT0NLX0lOQzMybQ0KKyAgICAxNjE2OTA4ODM3VSwJLy8gTE9DS19JTkM2NG0NCisgICAgMTc0NDgzNTEyMVUsCS8vIExPQ0tfSU5DOG0NCisgICAgNDY2OVUsCS8vIExPQ0tfUFJFRklYDQorICAgIDEzNTI3MDk3OFUsCS8vIExPQ0tfU1VCMTZtaQ0KKyAgICAxMzUyNzA5NzhVLAkvLyBMT0NLX1NVQjE2bWk4DQorICAgIDEzNTI3MDk3OFUsCS8vIExPQ0tfU1VCMTZtcg0KKyAgICAxMzUzMzY1MjZVLAkvLyBMT0NLX1NVQjMybWkNCisgICAgMTM1MzM2NTI2VSwJLy8gTE9DS19TVUIzMm1pOA0KKyAgICAxMzUzMzY1MjZVLAkvLyBMT0NLX1NVQjMybXINCisgICAgMTM1MzY5MzA2VSwJLy8gTE9DS19TVUI2NG1pMzINCisgICAgMTM1MzY5MzA2VSwJLy8gTE9DS19TVUI2NG1pOA0KKyAgICAxMzUzNjkzMDZVLAkvLyBMT0NLX1NVQjY0bXINCisgICAgMTM1NDAyMDg2VSwJLy8gTE9DS19TVUI4bWkNCisgICAgMTM1NDAyMDg2VSwJLy8gTE9DS19TVUI4bXINCisgICAgNDcyMlUsCS8vIExPRFNCDQorICAgIDQ3MjhVLAkvLyBMT0RTRA0KKyAgICA0NzM0VSwJLy8gTE9EU1ENCisgICAgNDc0MFUsCS8vIExPRFNXDQorICAgIDE2ODQwMTc4MDJVLAkvLyBMT09QDQorICAgIDE2ODQwMTc4MDhVLAkvLyBMT09QRQ0KKyAgICAxNjg0MDE3ODE1VSwJLy8gTE9PUE5FDQorICAgIDQ3NjdVLAkvLyBMUkVUDQorICAgIDczNDA1MDkyVSwJLy8gTFJFVEkNCisgICAgMTQwOTI5MDkyMlUsCS8vIExTTDE2cm0NCisgICAgMTE0Mjk4NTM4NlUsCS8vIExTTDE2cnINCisgICAgMTQ3NjM5OTc5MlUsCS8vIExTTDMycm0NCisgICAgMTE0Mjk4NTM5MlUsCS8vIExTTDMycnINCisgICAgMTU0MzUwODY2MlUsCS8vIExTTDY0cm0NCisgICAgMTE0Mjk4NTM5OFUsCS8vIExTTDY0cnINCisgICAgMjM0ODgxNTAzNlUsCS8vIExTUzE2cm0NCisgICAgMjM0ODgxNTA0MlUsCS8vIExTUzMycm0NCisgICAgMjM0ODgxNTA0OFUsCS8vIExTUzY0cm0NCisgICAgODcyNDIwMDQ2VSwJLy8gTFRSbQ0KKyAgICA3MzQwNTEzNFUsCS8vIExUUnINCisgICAgMTE2NzEwMjY3NlUsCS8vIExYQUREMTYNCisgICAgMTE2ODE1MTI2NVUsCS8vIExYQUREMzINCisgICAgMTE2OTE5OTg1NFUsCS8vIExYQURENjQNCisgICAgMTE3MDI0ODQ0MlUsCS8vIExYQUREOA0KKyAgICAxMTQyOTg1NDc5VSwJLy8gTUFTS01PVkRRVQ0KKyAgICAxMTQyOTg1NDc5VSwJLy8gTUFTS01PVkRRVTY0DQorICAgIDUzOTAwNTcxNVUsCS8vIE1BWFBEcm0NCisgICAgNTM5MDA1NzE1VSwJLy8gTUFYUERybV9JbnQNCisgICAgMjAzNDYxMzk1VSwJLy8gTUFYUERycg0KKyAgICAyMDM0NjEzOTVVLAkvLyBNQVhQRHJyX0ludA0KKyAgICA1MzkwMDU3MjJVLAkvLyBNQVhQU3JtDQorICAgIDUzOTAwNTcyMlUsCS8vIE1BWFBTcm1fSW50DQorICAgIDIwMzQ2MTQwMlUsCS8vIE1BWFBTcnINCisgICAgMjAzNDYxNDAyVSwJLy8gTUFYUFNycl9JbnQNCisgICAgNjA2MTE0NTkzVSwJLy8gTUFYU0RybQ0KKyAgICA2MDYxMTQ1OTNVLAkvLyBNQVhTRHJtX0ludA0KKyAgICAyMDM0NjE0MDlVLAkvLyBNQVhTRHJyDQorICAgIDIwMzQ2MTQwOVUsCS8vIE1BWFNEcnJfSW50DQorICAgIDY3MzIyMzQ2NFUsCS8vIE1BWFNTcm0NCisgICAgNjczMjIzNDY0VSwJLy8gTUFYU1NybV9JbnQNCisgICAgMjAzNDYxNDE2VSwJLy8gTUFYU1Nycg0KKyAgICAyMDM0NjE0MTZVLAkvLyBNQVhTU3JyX0ludA0KKyAgICA0OTExVSwJLy8gTUZFTkNFDQorICAgIDQ5MThVLAkvLyBNSU5HV19BTExPQ0ENCisgICAgNTM5MDA1Nzc3VSwJLy8gTUlOUERybQ0KKyAgICA1MzkwMDU3NzdVLAkvLyBNSU5QRHJtX0ludA0KKyAgICAyMDM0NjE0NTdVLAkvLyBNSU5QRHJyDQorICAgIDIwMzQ2MTQ1N1UsCS8vIE1JTlBEcnJfSW50DQorICAgIDUzOTAwNTc4NFUsCS8vIE1JTlBTcm0NCisgICAgNTM5MDA1Nzg0VSwJLy8gTUlOUFNybV9JbnQNCisgICAgMjAzNDYxNDY0VSwJLy8gTUlOUFNycg0KKyAgICAyMDM0NjE0NjRVLAkvLyBNSU5QU3JyX0ludA0KKyAgICA2MDYxMTQ2NTVVLAkvLyBNSU5TRHJtDQorICAgIDYwNjExNDY1NVUsCS8vIE1JTlNEcm1fSW50DQorICAgIDIwMzQ2MTQ3MVUsCS8vIE1JTlNEcnINCisgICAgMjAzNDYxNDcxVSwJLy8gTUlOU0Rycl9JbnQNCisgICAgNjczMjIzNTI2VSwJLy8gTUlOU1NybQ0KKyAgICA2NzMyMjM1MjZVLAkvLyBNSU5TU3JtX0ludA0KKyAgICAyMDM0NjE0NzhVLAkvLyBNSU5TU3JyDQorICAgIDIwMzQ2MTQ3OFUsCS8vIE1JTlNTcnJfSW50DQorICAgIDIwODAzNzg1ODBVLAkvLyBNTVhfQ1ZUUEQyUElybQ0KKyAgICAxMTQyOTg0NDA0VSwJLy8gTU1YX0NWVFBEMlBJcnINCisgICAgMTU0MzUwNzY3OFUsCS8vIE1NWF9DVlRQSTJQRHJtDQorICAgIDExNDI5ODQ0MTRVLAkvLyBNTVhfQ1ZUUEkyUERycg0KKyAgICAxNTQzNTA3Njg4VSwJLy8gTU1YX0NWVFBJMlBTcm0NCisgICAgMTE0Mjk4NDQyNFUsCS8vIE1NWF9DVlRQSTJQU3JyDQorICAgIDIxNTM3Nzg5MzBVLAkvLyBNTVhfQ1ZUUFMyUElybQ0KKyAgICAxMTQyOTg0NDM0VSwJLy8gTU1YX0NWVFBTMlBJcnINCisgICAgMjA4MDM3ODY1MVUsCS8vIE1NWF9DVlRUUEQyUElybQ0KKyAgICAxMTQyOTg0NDc1VSwJLy8gTU1YX0NWVFRQRDJQSXJyDQorICAgIDIxNTM3Nzg5ODJVLAkvLyBNTVhfQ1ZUVFBTMlBJcm0NCisgICAgMTE0Mjk4NDQ4NlUsCS8vIE1NWF9DVlRUUFMyUElycg0KKyAgICA0OTczVSwJLy8gTU1YX0VNTVMNCisgICAgNDk3OFUsCS8vIE1NWF9GRU1NUw0KKyAgICAxMTQyOTg1NTkyVSwJLy8gTU1YX01BU0tNT1ZRDQorICAgIDExNDI5ODU1OTJVLAkvLyBNTVhfTUFTS01PVlE2NA0KKyAgICAxMTQyOTg1NjAyVSwJLy8gTU1YX01PVkQ2NGZyb202NHJyDQorICAgIDExNDI5ODU2MDJVLAkvLyBNTVhfTU9WRDY0Z3JyDQorICAgIDEzNTMzNjgzNFUsCS8vIE1NWF9NT1ZENjRtcg0KKyAgICAxNDc2NDAwMDAyVSwJLy8gTU1YX01PVkQ2NHJtDQorICAgIDExNDI5ODU2MDJVLAkvLyBNTVhfTU9WRDY0cnINCisgICAgMTE0Mjk4NTYwMlUsCS8vIE1NWF9NT1ZENjRycnYxNjQNCisgICAgMTE0Mjk4NTYwMlUsCS8vIE1NWF9NT1ZENjR0bzY0cnINCisgICAgMTE0Mjk4NTYwOFUsCS8vIE1NWF9NT1ZEUTJRcnINCisgICAgMTE0Mjk4NTYwOFUsCS8vIE1NWF9NT1ZGUjY0MlFycg0KKyAgICAxMzUzNjk2MTdVLAkvLyBNTVhfTU9WTlRRbXINCisgICAgMTE0Mjk4NTYyNVUsCS8vIE1NWF9NT1ZRMkRRcnINCisgICAgMTE0Mjk4NTYyNVUsCS8vIE1NWF9NT1ZRMkZSNjRycg0KKyAgICAxMzUzNjk2MzRVLAkvLyBNTVhfTU9WUTY0bXINCisgICAgMTU0MzUwODg5OFUsCS8vIE1NWF9NT1ZRNjRybQ0KKyAgICAxMTQyOTg1NjM0VSwJLy8gTU1YX01PVlE2NHJyDQorICAgIDE0NzY0MDAwMDJVLAkvLyBNTVhfTU9WWkRJMlBESXJtDQorICAgIDExNDI5ODU2MDJVLAkvLyBNTVhfTU9WWkRJMlBESXJyDQorICAgIDQwNDc4ODEzNlUsCS8vIE1NWF9QQUNLU1NEV3JtDQorICAgIDIwMzQ2MTU0NFUsCS8vIE1NWF9QQUNLU1NEV3JyDQorICAgIDQwNDc4ODE0NlUsCS8vIE1NWF9QQUNLU1NXQnJtDQorICAgIDIwMzQ2MTU1NFUsCS8vIE1NWF9QQUNLU1NXQnJyDQorICAgIDQwNDc4ODE1NlUsCS8vIE1NWF9QQUNLVVNXQnJtDQorICAgIDIwMzQ2MTU2NFUsCS8vIE1NWF9QQUNLVVNXQnJyDQorICAgIDQwNDc4ODE2NlUsCS8vIE1NWF9QQUREQnJtDQorICAgIDIwMzQ2MTU3NFUsCS8vIE1NWF9QQUREQnJyDQorICAgIDQwNDc4ODE3M1UsCS8vIE1NWF9QQURERHJtDQorICAgIDIwMzQ2MTU4MVUsCS8vIE1NWF9QQURERHJyDQorICAgIDQwNDc4ODE4MFUsCS8vIE1NWF9QQUREUXJtDQorICAgIDIwMzQ2MTU4OFUsCS8vIE1NWF9QQUREUXJyDQorICAgIDQwNDc4ODE4N1UsCS8vIE1NWF9QQUREU0JybQ0KKyAgICAyMDM0NjE1OTVVLAkvLyBNTVhfUEFERFNCcnINCisgICAgNDA0Nzg4MTk1VSwJLy8gTU1YX1BBRERTV3JtDQorICAgIDIwMzQ2MTYwM1UsCS8vIE1NWF9QQUREU1dycg0KKyAgICA0MDQ3ODgyMDNVLAkvLyBNTVhfUEFERFVTQnJtDQorICAgIDIwMzQ2MTYxMVUsCS8vIE1NWF9QQUREVVNCcnINCisgICAgNDA0Nzg4MjEyVSwJLy8gTU1YX1BBRERVU1dybQ0KKyAgICAyMDM0NjE2MjBVLAkvLyBNTVhfUEFERFVTV3JyDQorICAgIDQwNDc4ODIyMVUsCS8vIE1NWF9QQUREV3JtDQorICAgIDIwMzQ2MTYyOVUsCS8vIE1NWF9QQUREV3JyDQorICAgIDQwNDc4ODIyOFUsCS8vIE1NWF9QQU5ETnJtDQorICAgIDIwMzQ2MTYzNlUsCS8vIE1NWF9QQU5ETnJyDQorICAgIDQwNDc4ODIzNVUsCS8vIE1NWF9QQU5Ecm0NCisgICAgMjAzNDYxNjQzVSwJLy8gTU1YX1BBTkRycg0KKyAgICA0MDQ3ODgyNDFVLAkvLyBNTVhfUEFWR0JybQ0KKyAgICAyMDM0NjE2NDlVLAkvLyBNTVhfUEFWR0Jycg0KKyAgICA0MDQ3ODgyNDhVLAkvLyBNTVhfUEFWR1dybQ0KKyAgICAyMDM0NjE2NTZVLAkvLyBNTVhfUEFWR1dycg0KKyAgICA0MDQ3ODgyNTVVLAkvLyBNTVhfUENNUEVRQnJtDQorICAgIDIwMzQ2MTY2M1UsCS8vIE1NWF9QQ01QRVFCcnINCisgICAgNDA0Nzg4MjY0VSwJLy8gTU1YX1BDTVBFUURybQ0KKyAgICAyMDM0NjE2NzJVLAkvLyBNTVhfUENNUEVRRHJyDQorICAgIDQwNDc4ODI3M1UsCS8vIE1NWF9QQ01QRVFXcm0NCisgICAgMjAzNDYxNjgxVSwJLy8gTU1YX1BDTVBFUVdycg0KKyAgICA0MDQ3ODgyODJVLAkvLyBNTVhfUENNUEdUQnJtDQorICAgIDIwMzQ2MTY5MFUsCS8vIE1NWF9QQ01QR1RCcnINCisgICAgNDA0Nzg4MjkxVSwJLy8gTU1YX1BDTVBHVERybQ0KKyAgICAyMDM0NjE2OTlVLAkvLyBNTVhfUENNUEdURHJyDQorICAgIDQwNDc4ODMwMFUsCS8vIE1NWF9QQ01QR1RXcm0NCisgICAgMjAzNDYxNzA4VSwJLy8gTU1YX1BDTVBHVFdycg0KKyAgICAyMDk4ODQyNDVVLAkvLyBNTVhfUEVYVFJXcmkNCisgICAgMTMwMTQ1MTg2OVUsCS8vIE1NWF9QSU5TUldybWkNCisgICAgMTM0NDMxMjQxM1UsCS8vIE1NWF9QSU5TUldycmkNCisgICAgNDA0Nzg4MzI1VSwJLy8gTU1YX1BNQUREV0RybQ0KKyAgICAyMDM0NjE3MzNVLAkvLyBNTVhfUE1BRERXRHJyDQorICAgIDQwNDc4ODMzNFUsCS8vIE1NWF9QTUFYU1dybQ0KKyAgICAyMDM0NjE3NDJVLAkvLyBNTVhfUE1BWFNXcnINCisgICAgNDA0Nzg4MzQyVSwJLy8gTU1YX1BNQVhVQnJtDQorICAgIDIwMzQ2MTc1MFUsCS8vIE1NWF9QTUFYVUJycg0KKyAgICA0MDQ3ODgzNTBVLAkvLyBNTVhfUE1JTlNXcm0NCisgICAgMjAzNDYxNzU4VSwJLy8gTU1YX1BNSU5TV3JyDQorICAgIDQwNDc4ODM1OFUsCS8vIE1NWF9QTUlOVUJybQ0KKyAgICAyMDM0NjE3NjZVLAkvLyBNTVhfUE1JTlVCcnINCisgICAgMTE0Mjk4NTg3MFUsCS8vIE1NWF9QTU9WTVNLQnJyDQorICAgIDQwNDc4ODM3NlUsCS8vIE1NWF9QTVVMSFVXcm0NCisgICAgMjAzNDYxNzg0VSwJLy8gTU1YX1BNVUxIVVdycg0KKyAgICA0MDQ3ODgzODVVLAkvLyBNTVhfUE1VTEhXcm0NCisgICAgMjAzNDYxNzkzVSwJLy8gTU1YX1BNVUxIV3JyDQorICAgIDQwNDc4ODM5M1UsCS8vIE1NWF9QTVVMTFdybQ0KKyAgICAyMDM0NjE4MDFVLAkvLyBNTVhfUE1VTExXcnINCisgICAgNDA0Nzg4NDAxVSwJLy8gTU1YX1BNVUxVRFFybQ0KKyAgICAyMDM0NjE4MDlVLAkvLyBNTVhfUE1VTFVEUXJyDQorICAgIDQwNDc4ODQxMFUsCS8vIE1NWF9QT1JybQ0KKyAgICAyMDM0NjE4MThVLAkvLyBNTVhfUE9ScnINCisgICAgNDA0Nzg4NDE1VSwJLy8gTU1YX1BTQURCV3JtDQorICAgIDIwMzQ2MTgyM1UsCS8vIE1NWF9QU0FEQldycg0KKyAgICAxMjI5OTg0OTY3VSwJLy8gTU1YX1BTSFVGV21pDQorICAgIDIwOTg4NDM1OVUsCS8vIE1NWF9QU0hVRldyaQ0KKyAgICAyMDM0NjE4MzlVLAkvLyBNTVhfUFNMTERyaQ0KKyAgICA0MDQ3ODg0MzFVLAkvLyBNTVhfUFNMTERybQ0KKyAgICAyMDM0NjE4MzlVLAkvLyBNTVhfUFNMTERycg0KKyAgICAyMDM0NjE4NDZVLAkvLyBNTVhfUFNMTFFyaQ0KKyAgICA0MDQ3ODg0MzhVLAkvLyBNTVhfUFNMTFFybQ0KKyAgICAyMDM0NjE4NDZVLAkvLyBNTVhfUFNMTFFycg0KKyAgICAyMDM0NjE4NTNVLAkvLyBNTVhfUFNMTFdyaQ0KKyAgICA0MDQ3ODg0NDVVLAkvLyBNTVhfUFNMTFdybQ0KKyAgICAyMDM0NjE4NTNVLAkvLyBNTVhfUFNMTFdycg0KKyAgICAyMDM0NjE4NjBVLAkvLyBNTVhfUFNSQURyaQ0KKyAgICA0MDQ3ODg0NTJVLAkvLyBNTVhfUFNSQURybQ0KKyAgICAyMDM0NjE4NjBVLAkvLyBNTVhfUFNSQURycg0KKyAgICAyMDM0NjE4NjdVLAkvLyBNTVhfUFNSQVdyaQ0KKyAgICA0MDQ3ODg0NTlVLAkvLyBNTVhfUFNSQVdybQ0KKyAgICAyMDM0NjE4NjdVLAkvLyBNTVhfUFNSQVdycg0KKyAgICAyMDM0NjE4NzRVLAkvLyBNTVhfUFNSTERyaQ0KKyAgICA0MDQ3ODg0NjZVLAkvLyBNTVhfUFNSTERybQ0KKyAgICAyMDM0NjE4NzRVLAkvLyBNTVhfUFNSTERycg0KKyAgICAyMDM0NjE4ODFVLAkvLyBNTVhfUFNSTFFyaQ0KKyAgICA0MDQ3ODg0NzNVLAkvLyBNTVhfUFNSTFFybQ0KKyAgICAyMDM0NjE4ODFVLAkvLyBNTVhfUFNSTFFycg0KKyAgICAyMDM0NjE4ODhVLAkvLyBNTVhfUFNSTFdyaQ0KKyAgICA0MDQ3ODg0ODBVLAkvLyBNTVhfUFNSTFdybQ0KKyAgICAyMDM0NjE4ODhVLAkvLyBNTVhfUFNSTFdycg0KKyAgICA0MDQ3ODg0ODdVLAkvLyBNTVhfUFNVQkJybQ0KKyAgICAyMDM0NjE4OTVVLAkvLyBNTVhfUFNVQkJycg0KKyAgICA0MDQ3ODg0OTRVLAkvLyBNTVhfUFNVQkRybQ0KKyAgICAyMDM0NjE5MDJVLAkvLyBNTVhfUFNVQkRycg0KKyAgICA0MDQ3ODg1MDFVLAkvLyBNTVhfUFNVQlFybQ0KKyAgICAyMDM0NjE5MDlVLAkvLyBNTVhfUFNVQlFycg0KKyAgICA0MDQ3ODg1MDhVLAkvLyBNTVhfUFNVQlNCcm0NCisgICAgMjAzNDYxOTE2VSwJLy8gTU1YX1BTVUJTQnJyDQorICAgIDQwNDc4ODUxNlUsCS8vIE1NWF9QU1VCU1dybQ0KKyAgICAyMDM0NjE5MjRVLAkvLyBNTVhfUFNVQlNXcnINCisgICAgNDA0Nzg4NTI0VSwJLy8gTU1YX1BTVUJVU0JybQ0KKyAgICAyMDM0NjE5MzJVLAkvLyBNTVhfUFNVQlVTQnJyDQorICAgIDQwNDc4ODUzM1UsCS8vIE1NWF9QU1VCVVNXcm0NCisgICAgMjAzNDYxOTQxVSwJLy8gTU1YX1BTVUJVU1dycg0KKyAgICA0MDQ3ODg1NDJVLAkvLyBNTVhfUFNVQldybQ0KKyAgICAyMDM0NjE5NTBVLAkvLyBNTVhfUFNVQldycg0KKyAgICA0MDQ3ODg1NDlVLAkvLyBNTVhfUFVOUENLSEJXcm0NCisgICAgMjAzNDYxOTU3VSwJLy8gTU1YX1BVTlBDS0hCV3JyDQorICAgIDQwNDc4ODU2MFUsCS8vIE1NWF9QVU5QQ0tIRFFybQ0KKyAgICAyMDM0NjE5NjhVLAkvLyBNTVhfUFVOUENLSERRcnINCisgICAgNDA0Nzg4NTcxVSwJLy8gTU1YX1BVTlBDS0hXRHJtDQorICAgIDIwMzQ2MTk3OVUsCS8vIE1NWF9QVU5QQ0tIV0Rycg0KKyAgICA0MDQ3ODg1ODJVLAkvLyBNTVhfUFVOUENLTEJXcm0NCisgICAgMjAzNDYxOTkwVSwJLy8gTU1YX1BVTlBDS0xCV3JyDQorICAgIDQwNDc4ODU5M1UsCS8vIE1NWF9QVU5QQ0tMRFFybQ0KKyAgICAyMDM0NjIwMDFVLAkvLyBNTVhfUFVOUENLTERRcnINCisgICAgNDA0Nzg4NjA0VSwJLy8gTU1YX1BVTlBDS0xXRHJtDQorICAgIDIwMzQ2MjAxMlUsCS8vIE1NWF9QVU5QQ0tMV0Rycg0KKyAgICA0MDQ3ODg2MTVVLAkvLyBNTVhfUFhPUnJtDQorICAgIDIwMzQ2MjAyM1UsCS8vIE1NWF9QWE9ScnINCisgICAgMFUsCS8vIE1NWF9WX1NFVDANCisgICAgMFUsCS8vIE1NWF9WX1NFVEFMTE9ORVMNCisgICAgNTUxN1UsCS8vIE1PTklUT1INCisgICAgMTY4NDAxODU4MVUsCS8vIE1PVjE2YW8xNg0KKyAgICAxMzUyNzE4NDBVLAkvLyBNT1YxNm1pDQorICAgIDEzNTI3MTg0MFUsCS8vIE1PVjE2bXINCisgICAgMTM1MjcxODQwVSwJLy8gTU9WMTZtcw0KKyAgICAxNjc3NzI3MTM2VSwJLy8gTU9WMTZvMTZhDQorICAgIDBVLAkvLyBNT1YxNnIwDQorICAgIDExNDI5ODYxNDRVLAkvLyBNT1YxNnJpDQorICAgIDE0MDkyOTE2ODBVLAkvLyBNT1YxNnJtDQorICAgIDExNDI5ODYxNDRVLAkvLyBNT1YxNnJyDQorICAgIDExNDI5ODYxNDRVLAkvLyBNT1YxNnJyX1JFVg0KKyAgICAxMTQyOTg2MTQ0VSwJLy8gTU9WMTZycw0KKyAgICAxNDA5MjkxNjgwVSwJLy8gTU9WMTZzbQ0KKyAgICAxMTQyOTg2MTQ0VSwJLy8gTU9WMTZzcg0KKyAgICAxNjg0MDE4NTk4VSwJLy8gTU9WMzJhbzMyDQorICAgIDExNDI5ODYxNjJVLAkvLyBNT1YzMmNyDQorICAgIDExNDI5ODYxNjJVLAkvLyBNT1YzMmRyDQorICAgIDEzNTMzNzM5NFUsCS8vIE1PVjMybWkNCisgICAgMTM1MzM3Mzk0VSwJLy8gTU9WMzJtcg0KKyAgICAxMzUzMzczOTRVLAkvLyBNT1YzMm1yX1RDDQorICAgIDEzNTMzNzM5NFUsCS8vIE1PVjMybXMNCisgICAgMTY4MDg3Mjg4MlUsCS8vIE1PVjMybzMyYQ0KKyAgICAwVSwJLy8gTU9WMzJyMA0KKyAgICAxMTQyOTg2MTYyVSwJLy8gTU9WMzJyYw0KKyAgICAxMTQyOTg2MTYyVSwJLy8gTU9WMzJyZA0KKyAgICAxMTQyOTg2MTYyVSwJLy8gTU9WMzJyaQ0KKyAgICAxNDc2NDAwNTYyVSwJLy8gTU9WMzJybQ0KKyAgICAxNDc2NDAwNTYyVSwJLy8gTU9WMzJybV9UQw0KKyAgICAxMTQyOTg2MTYyVSwJLy8gTU9WMzJycg0KKyAgICAxMTQyOTg2MTYyVSwJLy8gTU9WMzJycl9SRVYNCisgICAgMTE0Mjk4NjE2MlUsCS8vIE1PVjMycnJfVEMNCisgICAgMTE0Mjk4NjE2MlUsCS8vIE1PVjMycnMNCisgICAgMTQ3NjQwMDU2MlUsCS8vIE1PVjMyc20NCisgICAgMTE0Mjk4NjE2MlUsCS8vIE1PVjMyc3INCisgICAgMTU0MzUwOTQzMlUsCS8vIE1PVjY0RlNybQ0KKyAgICAxNTQzNTA5NDQyVSwJLy8gTU9WNjRHU3JtDQorICAgIDE2ODQwMTg2MzZVLAkvLyBNT1Y2NGFvNjQNCisgICAgMTY4NDAxODYzNlUsCS8vIE1PVjY0YW84DQorICAgIDExNDI5ODU2MzRVLAkvLyBNT1Y2NGNyDQorICAgIDExNDI5ODU2MzRVLAkvLyBNT1Y2NGRyDQorICAgIDEzNTM2OTYzNFUsCS8vIE1PVjY0bWkzMg0KKyAgICAxMzUzNjk2MzRVLAkvLyBNT1Y2NG1yDQorICAgIDEzNTM2OTYzNFUsCS8vIE1PVjY0bXJfVEMNCisgICAgMTM1MzY5NjM0VSwJLy8gTU9WNjRtcw0KKyAgICAxNjgxOTIwOTMwVSwJLy8gTU9WNjRvNjRhDQorICAgIDE2ODE5MjA5MzBVLAkvLyBNT1Y2NG84YQ0KKyAgICAwVSwJLy8gTU9WNjRyMA0KKyAgICAxMTQyOTg1NjM0VSwJLy8gTU9WNjRyYw0KKyAgICAxMTQyOTg1NjM0VSwJLy8gTU9WNjRyZA0KKyAgICAxMTQyOTg2MjAwVSwJLy8gTU9WNjRyaQ0KKyAgICAxMTQyOTg1NjM0VSwJLy8gTU9WNjRyaTMyDQorICAgIDBVLAkvLyBNT1Y2NHJpNjRpMzINCisgICAgMTE0Mjk4NTYzNFUsCS8vIE1PVjY0cmlfYWx0DQorICAgIDE1NDM1MDg4OThVLAkvLyBNT1Y2NHJtDQorICAgIDE1NDM1MDg4OThVLAkvLyBNT1Y2NHJtX1RDDQorICAgIDExNDI5ODU2MzRVLAkvLyBNT1Y2NHJyDQorICAgIDExNDI5ODU2MzRVLAkvLyBNT1Y2NHJyX1JFVg0KKyAgICAxMTQyOTg1NjM0VSwJLy8gTU9WNjRycl9UQw0KKyAgICAxMTQyOTg1NjM0VSwJLy8gTU9WNjRycw0KKyAgICAxNTQzNTA4ODk4VSwJLy8gTU9WNjRzbQ0KKyAgICAxMTQyOTg1NjM0VSwJLy8gTU9WNjRzcg0KKyAgICAxMTQyOTg1NjAyVSwJLy8gTU9WNjR0b1BRSXJyDQorICAgIDE1NDM1MDg4OThVLAkvLyBNT1Y2NHRvU0RybQ0KKyAgICAxMTQyOTg1NjAyVSwJLy8gTU9WNjR0b1NEcnINCisgICAgMTY4NDAxODY1N1UsCS8vIE1PVjhhbzgNCisgICAgMTM1NDAyOTg4VSwJLy8gTU9WOG1pDQorICAgIDEzNTQwMjk4OFUsCS8vIE1PVjhtcg0KKyAgICAxMzU0MDI5ODhVLAkvLyBNT1Y4bXJfTk9SRVgNCisgICAgMTY4Mjk3MDA5MlUsCS8vIE1PVjhvOGENCisgICAgMFUsCS8vIE1PVjhyMA0KKyAgICAxMTQyOTg2MjIwVSwJLy8gTU9WOHJpDQorICAgIDE4MTgyMzYzOTZVLAkvLyBNT1Y4cm0NCisgICAgMTg0MjM1MzY0NFUsCS8vIE1PVjhybV9OT1JFWA0KKyAgICAxMTQyOTg2MjIwVSwJLy8gTU9WOHJyDQorICAgIDExNDMzNzk0MzZVLAkvLyBNT1Y4cnJfTk9SRVgNCisgICAgMTE0Mjk4NjIyMFUsCS8vIE1PVjhycl9SRVYNCisgICAgMTM1NzI4NDUxVSwJLy8gTU9WQVBEbXINCisgICAgMjA4MDM3ODE3OVUsCS8vIE1PVkFQRHJtDQorICAgIDExNDI5ODQwMDNVLAkvLyBNT1ZBUERycg0KKyAgICAxMzU3Mjg0NTlVLAkvLyBNT1ZBUFNtcg0KKyAgICAyMDgwMzc4MTg3VSwJLy8gTU9WQVBTcm0NCisgICAgMTE0Mjk4NDAxMVUsCS8vIE1PVkFQU3JyDQorICAgIDIxNTM3ODA3MjJVLAkvLyBNT1ZERFVQcm0NCisgICAgMTE0Mjk4NjIyNlUsCS8vIE1PVkREVVBycg0KKyAgICAxNDc2NDAwMDAyVSwJLy8gTU9WREkyUERJcm0NCisgICAgMTE0Mjk4NTYwMlUsCS8vIE1PVkRJMlBESXJyDQorICAgIDE0NzY0MDAwMDJVLAkvLyBNT1ZESTJTU3JtDQorICAgIDExNDI5ODU2MDJVLAkvLyBNT1ZESTJTU3JyDQorICAgIDEzNTc2MzQ1MVUsCS8vIE1PVkRRQW1yDQorICAgIDEwNzM3NDc0NTFVLAkvLyBNT1ZEUUFybQ0KKyAgICAxMTQyOTg2MjM1VSwJLy8gTU9WRFFBcnINCisgICAgMTM1NzYzNDU5VSwJLy8gTU9WRFFVbXINCisgICAgMTM1NzYzNDU5VSwJLy8gTU9WRFFVbXJfSW50DQorICAgIDEwNzM3NDc0NTlVLAkvLyBNT1ZEUVVybQ0KKyAgICAxMDczNzQ3NDU5VSwJLy8gTU9WRFFVcm1fSW50DQorICAgIDIwMzQ2MjE1NVUsCS8vIE1PVkhMUFNycg0KKyAgICAxMzU3OTYyNDRVLAkvLyBNT1ZIUERtcg0KKyAgICA2MDYxMTUzNDhVLAkvLyBNT1ZIUERybQ0KKyAgICAxMzU3OTYyNTJVLAkvLyBNT1ZIUFNtcg0KKyAgICA2MDYxMTUzNTZVLAkvLyBNT1ZIUFNybQ0KKyAgICAyMDM0NjIxODBVLAkvLyBNT1ZMSFBTcnINCisgICAgMTM1Nzk2MjY5VSwJLy8gTU9WTFBEbXINCisgICAgNjA2MTE1MzczVSwJLy8gTU9WTFBEcm0NCisgICAgMTM1Nzk2Mjc3VSwJLy8gTU9WTFBTbXINCisgICAgNjA2MTE1MzgxVSwJLy8gTU9WTFBTcm0NCisgICAgMTM1MzY5NjM0VSwJLy8gTU9WTFExMjhtcg0KKyAgICAxMTQyOTg2MzAxVSwJLy8gTU9WTVNLUERycg0KKyAgICAxMTQyOTg2MzExVSwJLy8gTU9WTVNLUFNycg0KKyAgICAxMDczNzQ3NTM3VSwJLy8gTU9WTlREUUFybQ0KKyAgICAxMzU3MzA3NzlVLAkvLyBNT1ZOVERRXzY0bXINCisgICAgMTM1NzMwNzc5VSwJLy8gTU9WTlREUW1yDQorICAgIDEzNTczMDc3OVUsCS8vIE1PVk5URFFtcl9JbnQNCisgICAgMTM1MzcwMzQwVSwJLy8gTU9WTlRJXzY0bXINCisgICAgMTM1MzM3NTcyVSwJLy8gTU9WTlRJbXINCisgICAgMTM1MzM3NTcyVSwJLy8gTU9WTlRJbXJfSW50DQorICAgIDEzNTczMDc5NlUsCS8vIE1PVk5UUERtcg0KKyAgICAxMzU3NjM1NjRVLAkvLyBNT1ZOVFBEbXJfSW50DQorICAgIDEzNTczMDgwNVUsCS8vIE1PVk5UUFNtcg0KKyAgICAxMzU3NjM1NzNVLAkvLyBNT1ZOVFBTbXJfSW50DQorICAgIDBVLAkvLyBNT1ZQQzMycg0KKyAgICAxMzUzMzY4MzRVLAkvLyBNT1ZQREkyREltcg0KKyAgICAxMTQyOTg1NjAyVSwJLy8gTU9WUERJMkRJcnINCisgICAgMTM1MzY5NjM0VSwJLy8gTU9WUFFJMlFJbXINCisgICAgMTE0Mjk4NTYwMlUsCS8vIE1PVlBRSXRvNjRycg0KKyAgICAxNTQzNTA4ODk4VSwJLy8gTU9WUUkyUFFJcm0NCisgICAgMTE0Mjk4NTYzNFUsCS8vIE1PVlF4cnhyDQorICAgIDU3NThVLAkvLyBNT1ZTQg0KKyAgICA1NzY0VSwJLy8gTU9WU0QNCisgICAgMTM1Nzk2MzYyVSwJLy8gTU9WU0Rtcg0KKyAgICAyMTUzNzgwODc0VSwJLy8gTU9WU0RybQ0KKyAgICAyMDM0NjIyODJVLAkvLyBNT1ZTRHJyDQorICAgIDEzNTM2OTYzNFUsCS8vIE1PVlNEdG82NG1yDQorICAgIDExNDI5ODU2MDJVLAkvLyBNT1ZTRHRvNjRycg0KKyAgICAyMDgwMzgwNTYxVSwJLy8gTU9WU0hEVVBybQ0KKyAgICAxMTQyOTg2Mzg1VSwJLy8gTU9WU0hEVVBycg0KKyAgICAyMDgwMzgwNTcxVSwJLy8gTU9WU0xEVVBybQ0KKyAgICAxMTQyOTg2Mzk1VSwJLy8gTU9WU0xEVVBycg0KKyAgICA1Nzk3VSwJLy8gTU9WU1ENCisgICAgMTM1MzM2ODM0VSwJLy8gTU9WU1MyREltcg0KKyAgICAxMTQyOTg1NjAyVSwJLy8gTU9WU1MyRElycg0KKyAgICAxMzU2NjUzMjNVLAkvLyBNT1ZTU21yDQorICAgIDIyMjA4ODk3NzFVLAkvLyBNT1ZTU3JtDQorICAgIDIwMzQ2MjMxNVUsCS8vIE1PVlNTcnINCisgICAgNTgxMFUsCS8vIE1PVlNXDQorICAgIDBVLAkvLyBNT1ZTWDE2cm04DQorICAgIDE4MTgyMzY2MDBVLAkvLyBNT1ZTWDE2cm04Vw0KKyAgICAwVSwJLy8gTU9WU1gxNnJyOA0KKyAgICAxMTQyOTg2NDI0VSwJLy8gTU9WU1gxNnJyOFcNCisgICAgMTQwOTI5MTk2OFUsCS8vIE1PVlNYMzJybTE2DQorICAgIDE4MTgyMzY2MTZVLAkvLyBNT1ZTWDMycm04DQorICAgIDExNDI5ODY0MzJVLAkvLyBNT1ZTWDMycnIxNg0KKyAgICAxMTQyOTg2NDQwVSwJLy8gTU9WU1gzMnJyOA0KKyAgICAxNDA5MjkxOTg0VSwJLy8gTU9WU1g2NHJtMTYNCisgICAgMTQ3NjQwMDg1NlUsCS8vIE1PVlNYNjRybTMyDQorICAgIDE4MTgyMzY2NDBVLAkvLyBNT1ZTWDY0cm04DQorICAgIDExNDI5ODY0NDhVLAkvLyBNT1ZTWDY0cnIxNg0KKyAgICAxMTQyOTg2NDU2VSwJLy8gTU9WU1g2NHJyMzINCisgICAgMTE0Mjk4NjQ2NFUsCS8vIE1PVlNYNjRycjgNCisgICAgMTM1NzMwOTIwVSwJLy8gTU9WVVBEbXINCisgICAgMTM1NzMwOTIwVSwJLy8gTU9WVVBEbXJfSW50DQorICAgIDIwODAzODA2NDhVLAkvLyBNT1ZVUERybQ0KKyAgICAyMDgwMzgwNjQ4VSwJLy8gTU9WVVBEcm1fSW50DQorICAgIDExNDI5ODY0NzJVLAkvLyBNT1ZVUERycg0KKyAgICAxMzU3MzA5MjhVLAkvLyBNT1ZVUFNtcg0KKyAgICAxMzU3MzA5MjhVLAkvLyBNT1ZVUFNtcl9JbnQNCisgICAgMjA4MDM4MDY1NlUsCS8vIE1PVlVQU3JtDQorICAgIDIwODAzODA2NTZVLAkvLyBNT1ZVUFNybV9JbnQNCisgICAgMTE0Mjk4NjQ4MFUsCS8vIE1PVlVQU3JyDQorICAgIDE0NzY0MDAwMDJVLAkvLyBNT1ZaREkyUERJcm0NCisgICAgMTE0Mjk4NTYwMlUsCS8vIE1PVlpESTJQRElycg0KKyAgICAxMDczNzQ2ODUwVSwJLy8gTU9WWlBRSUxvMlBRSXJtDQorICAgIDExNDI5ODU2MzRVLAkvLyBNT1ZaUFFJTG8yUFFJcnINCisgICAgMTU0MzUwODg5OFUsCS8vIE1PVlpRSTJQUUlybQ0KKyAgICAxMTQyOTg1NjAyVSwJLy8gTU9WWlFJMlBRSXJyDQorICAgIDBVLAkvLyBNT1ZaWDE2cm04DQorICAgIDE4MTgyMzY2NjRVLAkvLyBNT1ZaWDE2cm04Vw0KKyAgICAwVSwJLy8gTU9WWlgxNnJyOA0KKyAgICAxMTQyOTg2NDg4VSwJLy8gTU9WWlgxNnJyOFcNCisgICAgMTg0MjM1MzkyMFUsCS8vIE1PVlpYMzJfTk9SRVhybTgNCisgICAgMTE0MzM3OTcxMlUsCS8vIE1PVlpYMzJfTk9SRVhycjgNCisgICAgMTQwOTI5MjA0MFUsCS8vIE1PVlpYMzJybTE2DQorICAgIDE4MTgyMzY2NzJVLAkvLyBNT1ZaWDMycm04DQorICAgIDExNDI5ODY1MDRVLAkvLyBNT1ZaWDMycnIxNg0KKyAgICAxMTQyOTg2NDk2VSwJLy8gTU9WWlgzMnJyOA0KKyAgICAwVSwJLy8gTU9WWlg2NHJtMTYNCisgICAgMTQwOTI5MjA0OFUsCS8vIE1PVlpYNjRybTE2X1ENCisgICAgMFUsCS8vIE1PVlpYNjRybTMyDQorICAgIDBVLAkvLyBNT1ZaWDY0cm04DQorICAgIDE4MTgyMzY2OTZVLAkvLyBNT1ZaWDY0cm04X1ENCisgICAgMFUsCS8vIE1PVlpYNjRycjE2DQorICAgIDExNDI5ODY1MTJVLAkvLyBNT1ZaWDY0cnIxNl9RDQorICAgIDBVLAkvLyBNT1ZaWDY0cnIzMg0KKyAgICAwVSwJLy8gTU9WWlg2NHJyOA0KKyAgICAxMTQyOTg2NTIwVSwJLy8gTU9WWlg2NHJyOF9RDQorICAgIDBVLAkvLyBNT1ZfRnAzMjMyDQorICAgIDBVLAkvLyBNT1ZfRnAzMjY0DQorICAgIDBVLAkvLyBNT1ZfRnAzMjgwDQorICAgIDBVLAkvLyBNT1ZfRnA2NDMyDQorICAgIDBVLAkvLyBNT1ZfRnA2NDY0DQorICAgIDBVLAkvLyBNT1ZfRnA2NDgwDQorICAgIDBVLAkvLyBNT1ZfRnA4MDMyDQorICAgIDBVLAkvLyBNT1ZfRnA4MDY0DQorICAgIDBVLAkvLyBNT1ZfRnA4MDgwDQorICAgIDEyODQ3MDgxMjhVLAkvLyBNUFNBREJXcm1pDQorICAgIDEzNDQzMTMxMjBVLAkvLyBNUFNBREJXcnJpDQorICAgIDg3MjQyMTE2MVUsCS8vIE1VTDE2bQ0KKyAgICA3MzQwNjI0OVUsCS8vIE1VTDE2cg0KKyAgICA5NDU4MjE0ODdVLAkvLyBNVUwzMm0NCisgICAgNzM0MDYyNTVVLAkvLyBNVUwzMnINCisgICAgMTYxNjkxMDEzM1UsCS8vIE1VTDY0bQ0KKyAgICA3MzQwNjI2MVUsCS8vIE1VTDY0cg0KKyAgICAxNzQ0ODM2NDExVSwJLy8gTVVMOG0NCisgICAgNzM0MDYyNjdVLAkvLyBNVUw4cg0KKyAgICA1MzkwMDY3ODVVLAkvLyBNVUxQRHJtDQorICAgIDIwMzQ2MjQ2NVUsCS8vIE1VTFBEcnINCisgICAgNTM5MDA2NzkyVSwJLy8gTVVMUFNybQ0KKyAgICAyMDM0NjI0NzJVLAkvLyBNVUxQU3JyDQorICAgIDYwNjExNTY2M1UsCS8vIE1VTFNEcm0NCisgICAgNjA2MTE1NjYzVSwJLy8gTVVMU0RybV9JbnQNCisgICAgMjAzNDYyNDc5VSwJLy8gTVVMU0Rycg0KKyAgICAyMDM0NjI0NzlVLAkvLyBNVUxTRHJyX0ludA0KKyAgICA2NzMyMjQ1MzRVLAkvLyBNVUxTU3JtDQorICAgIDY3MzIyNDUzNFUsCS8vIE1VTFNTcm1fSW50DQorICAgIDIwMzQ2MjQ4NlUsCS8vIE1VTFNTcnINCisgICAgMjAzNDYyNDg2VSwJLy8gTVVMU1Nycl9JbnQNCisgICAgNzM4MjAzNDg1VSwJLy8gTVVMX0YzMm0NCisgICAgODA1MzEyMzU2VSwJLy8gTVVMX0Y2NG0NCisgICAgODcyNDIxMjI3VSwJLy8gTVVMX0ZJMTZtDQorICAgIDk0NTgyMTU1NVUsCS8vIE1VTF9GSTMybQ0KKyAgICA3MzQwNjMzMVUsCS8vIE1VTF9GUHJTVDANCisgICAgNzM0MDYzMzhVLAkvLyBNVUxfRlNUMHINCisgICAgMFUsCS8vIE1VTF9GcDMyDQorICAgIDBVLAkvLyBNVUxfRnAzMm0NCisgICAgMFUsCS8vIE1VTF9GcDY0DQorICAgIDBVLAkvLyBNVUxfRnA2NG0NCisgICAgMFUsCS8vIE1VTF9GcDY0bTMyDQorICAgIDBVLAkvLyBNVUxfRnA4MA0KKyAgICAwVSwJLy8gTVVMX0ZwODBtMzINCisgICAgMFUsCS8vIE1VTF9GcDgwbTY0DQorICAgIDBVLAkvLyBNVUxfRnBJMTZtMzINCisgICAgMFUsCS8vIE1VTF9GcEkxNm02NA0KKyAgICAwVSwJLy8gTVVMX0ZwSTE2bTgwDQorICAgIDBVLAkvLyBNVUxfRnBJMzJtMzINCisgICAgMFUsCS8vIE1VTF9GcEkzMm02NA0KKyAgICAwVSwJLy8gTVVMX0ZwSTMybTgwDQorICAgIDczNDA2MzQ0VSwJLy8gTVVMX0ZyU1QwDQorICAgIDYwMzhVLAkvLyBNV0FJVA0KKyAgICA4NzI0MjEyNzZVLAkvLyBORUcxNm0NCisgICAgNzM0MDYzNjRVLAkvLyBORUcxNnINCisgICAgOTQ1ODIxNjAyVSwJLy8gTkVHMzJtDQorICAgIDczNDA2MzcwVSwJLy8gTkVHMzJyDQorICAgIDE2MTY5MTAyNDhVLAkvLyBORUc2NG0NCisgICAgNzM0MDYzNzZVLAkvLyBORUc2NHINCisgICAgMTc0NDgzNjUyNlUsCS8vIE5FRzhtDQorICAgIDczNDA2MzgyVSwJLy8gTkVHOHINCisgICAgNjA2OFUsCS8vIE5PT1ANCisgICAgOTQ1ODIxNjI0VSwJLy8gTk9PUEwNCisgICAgODcyNDIxMzEwVSwJLy8gTk9PUFcNCisgICAgODcyNDIxMzE2VSwJLy8gTk9UMTZtDQorICAgIDczNDA2NDA0VSwJLy8gTk9UMTZyDQorICAgIDk0NTgyMTY0MlUsCS8vIE5PVDMybQ0KKyAgICA3MzQwNjQxMFUsCS8vIE5PVDMycg0KKyAgICAxNjE2OTEwMjg4VSwJLy8gTk9UNjRtDQorICAgIDczNDA2NDE2VSwJLy8gTk9UNjRyDQorICAgIDE3NDQ4MzY1NjZVLAkvLyBOT1Q4bQ0KKyAgICA3MzQwNjQyMlUsCS8vIE5PVDhyDQorICAgIDY3MTE0OTcyVSwJLy8gT1IxNmkxNg0KKyAgICAxMzUyNzI0MTJVLAkvLyBPUjE2bWkNCisgICAgMTM1MjcyNDEyVSwJLy8gT1IxNm1pOA0KKyAgICAxMzUyNzI0MTJVLAkvLyBPUjE2bXINCisgICAgMjAzNDYyNjIwVSwJLy8gT1IxNnJpDQorICAgIDIwMzQ2MjYyMFUsCS8vIE9SMTZyaTgNCisgICAgMjcwNTcxNDg0VSwJLy8gT1IxNnJtDQorICAgIDIwMzQ2MjYyMFUsCS8vIE9SMTZycg0KKyAgICAyMDM0NjI2MjBVLAkvLyBPUjE2cnJfUkVWDQorICAgIDcwMjYwNzA1VSwJLy8gT1IzMmkzMg0KKyAgICAxMzUzMzc5NTNVLAkvLyBPUjMybWkNCisgICAgMTM1MzM3OTUzVSwJLy8gT1IzMm1pOA0KKyAgICAxMzUzMzc5NTNVLAkvLyBPUjMybXINCisgICAgMjAzNDYyNjI1VSwJLy8gT1IzMnJpDQorICAgIDIwMzQ2MjYyNVUsCS8vIE9SMzJyaTgNCisgICAgMzM3NjgwMzUzVSwJLy8gT1IzMnJtDQorICAgIDIwMzQ2MjYyNVUsCS8vIE9SMzJycg0KKyAgICAyMDM0NjI2MjVVLAkvLyBPUjMycnJfUkVWDQorICAgIDcxMzA5Mjg2VSwJLy8gT1I2NGkzMg0KKyAgICAxMzUzNzA3MjZVLAkvLyBPUjY0bWkzMg0KKyAgICAxMzUzNzA3MjZVLAkvLyBPUjY0bWk4DQorICAgIDEzNTM3MDcyNlUsCS8vIE9SNjRtcg0KKyAgICAyMDM0NjI2MzBVLAkvLyBPUjY0cmkzMg0KKyAgICAyMDM0NjI2MzBVLAkvLyBPUjY0cmk4DQorICAgIDQwNDc4OTIyMlUsCS8vIE9SNjRybQ0KKyAgICAyMDM0NjI2MzBVLAkvLyBPUjY0cnINCisgICAgMjAzNDYyNjMwVSwJLy8gT1I2NHJyX1JFVg0KKyAgICA3MjM1Nzg2N1UsCS8vIE9SOGk4DQorICAgIDEzNTQwMzQ5OVUsCS8vIE9SOG1pDQorICAgIDEzNTQwMzQ5OVUsCS8vIE9SOG1yDQorICAgIDIwMzQ2MjYzNVUsCS8vIE9SOHJpDQorICAgIDQ3MTg5ODA5MVUsCS8vIE9SOHJtDQorICAgIDIwMzQ2MjYzNVUsCS8vIE9SOHJyDQorICAgIDIwMzQ2MjYzNVUsCS8vIE9SOHJyX1JFVg0KKyAgICA1MzkwMDQyNDNVLAkvLyBPUlBEcm0NCisgICAgMjAzNDU5OTIzVSwJLy8gT1JQRHJyDQorICAgIDUzOTAwNDI0OVUsCS8vIE9SUFNybQ0KKyAgICAyMDM0NTk5MjlVLAkvLyBPUlBTcnINCisgICAgNzM0MDY0NDhVLAkvLyBPVVQxNmlyDQorICAgIDYxMzlVLAkvLyBPVVQxNnJyDQorICAgIDczNDA2NDczVSwJLy8gT1VUMzJpcg0KKyAgICA2MTY1VSwJLy8gT1VUMzJycg0KKyAgICA3MzQwNjUwMFUsCS8vIE9VVDhpcg0KKyAgICA2MTkxVSwJLy8gT1VUOHJyDQorICAgIDYyMDVVLAkvLyBPVVRTQg0KKyAgICA2MjExVSwJLy8gT1VUU0QNCisgICAgNjIxN1UsCS8vIE9VVFNXDQorICAgIDEwNzM3NDgwNDdVLAkvLyBQQUJTQnJtMTI4DQorICAgIDE1NDM1MTAwOTVVLAkvLyBQQUJTQnJtNjQNCisgICAgMTE0Mjk4NjgzMVUsCS8vIFBBQlNCcnIxMjgNCisgICAgMTE0Mjk4NjgzMVUsCS8vIFBBQlNCcnI2NA0KKyAgICAxMDczNzQ4MDU0VSwJLy8gUEFCU0RybTEyOA0KKyAgICAxNTQzNTEwMTAyVSwJLy8gUEFCU0RybTY0DQorICAgIDExNDI5ODY4MzhVLAkvLyBQQUJTRHJyMTI4DQorICAgIDExNDI5ODY4MzhVLAkvLyBQQUJTRHJyNjQNCisgICAgMTA3Mzc0ODA2MVUsCS8vIFBBQlNXcm0xMjgNCisgICAgMTU0MzUxMDEwOVUsCS8vIFBBQlNXcm02NA0KKyAgICAxMTQyOTg2ODQ1VSwJLy8gUEFCU1dycjEyOA0KKyAgICAxMTQyOTg2ODQ1VSwJLy8gUEFCU1dycjY0DQorICAgIDEwMDg3Njc5MTJVLAkvLyBQQUNLU1NEV3JtDQorICAgIDIwMzQ2MTU0NFUsCS8vIFBBQ0tTU0RXcnINCisgICAgMTAwODc2NzkyMlUsCS8vIFBBQ0tTU1dCcm0NCisgICAgMjAzNDYxNTU0VSwJLy8gUEFDS1NTV0Jycg0KKyAgICAxMDA4NzY5MTI0VSwJLy8gUEFDS1VTRFdybQ0KKyAgICAyMDM0NjI3NTZVLAkvLyBQQUNLVVNEV3JyDQorICAgIDEwMDg3Njc5MzJVLAkvLyBQQUNLVVNXQnJtDQorICAgIDIwMzQ2MTU2NFUsCS8vIFBBQ0tVU1dCcnINCisgICAgMTAwODc2Nzk0MlUsCS8vIFBBRERCcm0NCisgICAgMjAzNDYxNTc0VSwJLy8gUEFEREJycg0KKyAgICAxMDA4NzY3OTQ5VSwJLy8gUEFERERybQ0KKyAgICAyMDM0NjE1ODFVLAkvLyBQQURERHJyDQorICAgIDEwMDg3Njc5NTZVLAkvLyBQQUREUXJtDQorICAgIDIwMzQ2MTU4OFUsCS8vIFBBRERRcnINCisgICAgMTAwODc2Nzk2M1UsCS8vIFBBRERTQnJtDQorICAgIDIwMzQ2MTU5NVUsCS8vIFBBRERTQnJyDQorICAgIDEwMDg3Njc5NzFVLAkvLyBQQUREU1dybQ0KKyAgICAyMDM0NjE2MDNVLAkvLyBQQUREU1dycg0KKyAgICAxMDA4NzY3OTc5VSwJLy8gUEFERFVTQnJtDQorICAgIDIwMzQ2MTYxMVUsCS8vIFBBRERVU0Jycg0KKyAgICAxMDA4NzY3OTg4VSwJLy8gUEFERFVTV3JtDQorICAgIDIwMzQ2MTYyMFUsCS8vIFBBRERVU1dycg0KKyAgICAxMDA4NzY3OTk3VSwJLy8gUEFERFdybQ0KKyAgICAyMDM0NjE2MjlVLAkvLyBQQUREV3JyDQorICAgIDEyODQ3MDg0NjJVLAkvLyBQQUxJR05SMTI4cm0NCisgICAgMTM0NDMxMzQ1NFUsCS8vIFBBTElHTlIxMjhycg0KKyAgICAxMzAzNTUwMDYyVSwJLy8gUEFMSUdOUjY0cm0NCisgICAgMTM0NDMxMzQ1NFUsCS8vIFBBTElHTlI2NHJyDQorICAgIDEwMDg3NjgwMDRVLAkvLyBQQU5ETnJtDQorICAgIDIwMzQ2MTYzNlUsCS8vIFBBTkROcnINCisgICAgMTAwODc2ODAxMVUsCS8vIFBBTkRybQ0KKyAgICAyMDM0NjE2NDNVLAkvLyBQQU5EcnINCisgICAgNjI2M1UsCS8vIFBBVVNFDQorICAgIDEwMDg3NjgwMTdVLAkvLyBQQVZHQnJtDQorICAgIDIwMzQ2MTY0OVUsCS8vIFBBVkdCcnINCisgICAgMTAwODc2ODAyNFUsCS8vIFBBVkdXcm0NCisgICAgMjAzNDYxNjU2VSwJLy8gUEFWR1dycg0KKyAgICAxMDA4NzY5MTQ5VSwJLy8gUEJMRU5EVkJybTANCisgICAgMjAzNDYyNzgxVSwJLy8gUEJMRU5EVkJycjANCisgICAgMTI4NDcwODQ5NFUsCS8vIFBCTEVORFdybWkNCisgICAgMTM0NDMxMzQ4NlUsCS8vIFBCTEVORFdycmkNCisgICAgMTAwODc2ODAzMVUsCS8vIFBDTVBFUUJybQ0KKyAgICAyMDM0NjE2NjNVLAkvLyBQQ01QRVFCcnINCisgICAgMTAwODc2ODA0MFUsCS8vIFBDTVBFUURybQ0KKyAgICAyMDM0NjE2NzJVLAkvLyBQQ01QRVFEcnINCisgICAgMTAwODc2OTE3NVUsCS8vIFBDTVBFUVFybQ0KKyAgICAyMDM0NjI4MDdVLAkvLyBQQ01QRVFRcnINCisgICAgMTAwODc2ODA0OVUsCS8vIFBDTVBFUVdybQ0KKyAgICAyMDM0NjE2ODFVLAkvLyBQQ01QRVFXcnINCisgICAgMTIxNTMwNTg4OFUsCS8vIFBDTVBFU1RSSUFybQ0KKyAgICAyMDk4ODUzNDRVLAkvLyBQQ01QRVNUUklBcnINCisgICAgMTIxNTMwNTg4OFUsCS8vIFBDTVBFU1RSSUNybQ0KKyAgICAyMDk4ODUzNDRVLAkvLyBQQ01QRVNUUklDcnINCisgICAgMTIxNTMwNTg4OFUsCS8vIFBDTVBFU1RSSU9ybQ0KKyAgICAyMDk4ODUzNDRVLAkvLyBQQ01QRVNUUklPcnINCisgICAgMTIxNTMwNTg4OFUsCS8vIFBDTVBFU1RSSVNybQ0KKyAgICAyMDk4ODUzNDRVLAkvLyBQQ01QRVNUUklTcnINCisgICAgMTIxNTMwNTg4OFUsCS8vIFBDTVBFU1RSSVpybQ0KKyAgICAyMDk4ODUzNDRVLAkvLyBQQ01QRVNUUklacnINCisgICAgMTIxNTMwNTg4OFUsCS8vIFBDTVBFU1RSSXJtDQorICAgIDIwOTg4NTM0NFUsCS8vIFBDTVBFU1RSSXJyDQorICAgIDYzMTVVLAkvLyBQQ01QRVNUUk0xMjhNRU0NCisgICAgNjMzOFUsCS8vIFBDTVBFU1RSTTEyOFJFRw0KKyAgICAxMjE1MzA1OTQ1VSwJLy8gUENNUEVTVFJNMTI4cm0NCisgICAgMjA5ODg1NDAxVSwJLy8gUENNUEVTVFJNMTI4cnINCisgICAgMTAwODc2ODA1OFUsCS8vIFBDTVBHVEJybQ0KKyAgICAyMDM0NjE2OTBVLAkvLyBQQ01QR1RCcnINCisgICAgMTAwODc2ODA2N1UsCS8vIFBDTVBHVERybQ0KKyAgICAyMDM0NjE2OTlVLAkvLyBQQ01QR1REcnINCisgICAgMTAwODc2OTI1MlUsCS8vIFBDTVBHVFFybQ0KKyAgICAyMDM0NjI4ODRVLAkvLyBQQ01QR1RRcnINCisgICAgMTAwODc2ODA3NlUsCS8vIFBDTVBHVFdybQ0KKyAgICAyMDM0NjE3MDhVLAkvLyBQQ01QR1RXcnINCisgICAgMTIxNTMwNTk2NVUsCS8vIFBDTVBJU1RSSUFybQ0KKyAgICAyMDk4ODU0MjFVLAkvLyBQQ01QSVNUUklBcnINCisgICAgMTIxNTMwNTk2NVUsCS8vIFBDTVBJU1RSSUNybQ0KKyAgICAyMDk4ODU0MjFVLAkvLyBQQ01QSVNUUklDcnINCisgICAgMTIxNTMwNTk2NVUsCS8vIFBDTVBJU1RSSU9ybQ0KKyAgICAyMDk4ODU0MjFVLAkvLyBQQ01QSVNUUklPcnINCisgICAgMTIxNTMwNTk2NVUsCS8vIFBDTVBJU1RSSVNybQ0KKyAgICAyMDk4ODU0MjFVLAkvLyBQQ01QSVNUUklTcnINCisgICAgMTIxNTMwNTk2NVUsCS8vIFBDTVBJU1RSSVpybQ0KKyAgICAyMDk4ODU0MjFVLAkvLyBQQ01QSVNUUklacnINCisgICAgMTIxNTMwNTk2NVUsCS8vIFBDTVBJU1RSSXJtDQorICAgIDIwOTg4NTQyMVUsCS8vIFBDTVBJU1RSSXJyDQorICAgIDYzOTJVLAkvLyBQQ01QSVNUUk0xMjhNRU0NCisgICAgNjQxNVUsCS8vIFBDTVBJU1RSTTEyOFJFRw0KKyAgICAxMjE1MzA2MDIyVSwJLy8gUENNUElTVFJNMTI4cm0NCisgICAgMjA5ODg1NDc4VSwJLy8gUENNUElTVFJNMTI4cnINCisgICAgMTIyNjk3MTQ0MVUsCS8vIFBFWFRSQm1yDQorICAgIDIwOTg4NTQ4OVUsCS8vIFBFWFRSQnJyDQorICAgIDEyMjY5MDU5MTNVLAkvLyBQRVhUUkRtcg0KKyAgICAyMDk4ODU0OTdVLAkvLyBQRVhUUkRycg0KKyAgICAxMjI2OTM4Njg5VSwJLy8gUEVYVFJRbXINCisgICAgMjA5ODg1NTA1VSwJLy8gUEVYVFJRcnINCisgICAgMTIyNjgzOTEyNVUsCS8vIFBFWFRSV21yDQorICAgIDIwOTg4NDI0NVUsCS8vIFBFWFRSV3JpDQorICAgIDEwMDg3NjkzNTNVLAkvLyBQSEFERERybTEyOA0KKyAgICA0MDQ3ODk1NzdVLAkvLyBQSEFERERybTY0DQorICAgIDIwMzQ2Mjk4NVUsCS8vIFBIQURERHJyMTI4DQorICAgIDIwMzQ2Mjk4NVUsCS8vIFBIQURERHJyNjQNCisgICAgMTAwODc2OTM2MVUsCS8vIFBIQUREU1dybTEyOA0KKyAgICA0MDQ3ODk1ODVVLAkvLyBQSEFERFNXcm02NA0KKyAgICAyMDM0NjI5OTNVLAkvLyBQSEFERFNXcnIxMjgNCisgICAgMjAzNDYyOTkzVSwJLy8gUEhBRERTV3JyNjQNCisgICAgMTAwODc2OTM3MFUsCS8vIFBIQUREV3JtMTI4DQorICAgIDQwNDc4OTU5NFUsCS8vIFBIQUREV3JtNjQNCisgICAgMjAzNDYzMDAyVSwJLy8gUEhBRERXcnIxMjgNCisgICAgMjAzNDYzMDAyVSwJLy8gUEhBRERXcnI2NA0KKyAgICAxMDczNzQ4MzIyVSwJLy8gUEhNSU5QT1NVV3JtMTI4DQorICAgIDExNDI5ODcxMDZVLAkvLyBQSE1JTlBPU1VXcnIxMjgNCisgICAgMTAwODc2OTM5MFUsCS8vIFBIU1VCRHJtMTI4DQorICAgIDQwNDc4OTYxNFUsCS8vIFBIU1VCRHJtNjQNCisgICAgMjAzNDYzMDIyVSwJLy8gUEhTVUJEcnIxMjgNCisgICAgMjAzNDYzMDIyVSwJLy8gUEhTVUJEcnI2NA0KKyAgICAxMDA4NzY5Mzk4VSwJLy8gUEhTVUJTV3JtMTI4DQorICAgIDQwNDc4OTYyMlUsCS8vIFBIU1VCU1dybTY0DQorICAgIDIwMzQ2MzAzMFUsCS8vIFBIU1VCU1dycjEyOA0KKyAgICAyMDM0NjMwMzBVLAkvLyBQSFNVQlNXcnI2NA0KKyAgICAxMDA4NzY5NDA3VSwJLy8gUEhTVUJXcm0xMjgNCisgICAgNDA0Nzg5NjMxVSwJLy8gUEhTVUJXcm02NA0KKyAgICAyMDM0NjMwMzlVLAkvLyBQSFNVQldycjEyOA0KKyAgICAyMDM0NjMwMzlVLAkvLyBQSFNVQldycjY0DQorICAgIDEzMDQ1OTg5MTlVLAkvLyBQSU5TUkJybQ0KKyAgICAxMzQ0MzEzNzM1VSwJLy8gUElOU1JCcnINCisgICAgMTMwMjUwMTc3NVUsCS8vIFBJTlNSRHJtDQorICAgIDEzNDQzMTM3NDNVLAkvLyBQSU5TUkRycg0KKyAgICAxMzAzNTUwMzU5VSwJLy8gUElOU1JRcm0NCisgICAgMTM0NDMxMzc1MVUsCS8vIFBJTlNSUXJyDQorICAgIDEzMDE0NTE4NjlVLAkvLyBQSU5TUldybWkNCisgICAgMTM0NDMxMjQxM1UsCS8vIFBJTlNSV3JyaQ0KKyAgICAxMDA4NzY5NDM5VSwJLy8gUE1BRERVQlNXcm0xMjgNCisgICAgNDA0Nzg5NjYzVSwJLy8gUE1BRERVQlNXcm02NA0KKyAgICAyMDM0NjMwNzFVLAkvLyBQTUFERFVCU1dycjEyOA0KKyAgICAyMDM0NjMwNzFVLAkvLyBQTUFERFVCU1dycjY0DQorICAgIDEwMDg3NjgxMDFVLAkvLyBQTUFERFdEcm0NCisgICAgMjAzNDYxNzMzVSwJLy8gUE1BRERXRHJyDQorICAgIDEwMDg3Njk0NTBVLAkvLyBQTUFYU0JybQ0KKyAgICAyMDM0NjMwODJVLAkvLyBQTUFYU0Jycg0KKyAgICAxMDA4NzY5NDU4VSwJLy8gUE1BWFNEcm0NCisgICAgMjAzNDYzMDkwVSwJLy8gUE1BWFNEcnINCisgICAgMTAwODc2ODExMFUsCS8vIFBNQVhTV3JtDQorICAgIDIwMzQ2MTc0MlUsCS8vIFBNQVhTV3JyDQorICAgIDEwMDg3NjgxMThVLAkvLyBQTUFYVUJybQ0KKyAgICAyMDM0NjE3NTBVLAkvLyBQTUFYVUJycg0KKyAgICAxMDA4NzY5NDY2VSwJLy8gUE1BWFVEcm0NCisgICAgMjAzNDYzMDk4VSwJLy8gUE1BWFVEcnINCisgICAgMTAwODc2OTQ3NFUsCS8vIFBNQVhVV3JtDQorICAgIDIwMzQ2MzEwNlUsCS8vIFBNQVhVV3JyDQorICAgIDEwMDg3Njk0ODJVLAkvLyBQTUlOU0JybQ0KKyAgICAyMDM0NjMxMTRVLAkvLyBQTUlOU0Jycg0KKyAgICAxMDA4NzY5NDkwVSwJLy8gUE1JTlNEcm0NCisgICAgMjAzNDYzMTIyVSwJLy8gUE1JTlNEcnINCisgICAgMTAwODc2ODEyNlUsCS8vIFBNSU5TV3JtDQorICAgIDIwMzQ2MTc1OFUsCS8vIFBNSU5TV3JyDQorICAgIDEwMDg3NjgxMzRVLAkvLyBQTUlOVUJybQ0KKyAgICAyMDM0NjE3NjZVLAkvLyBQTUlOVUJycg0KKyAgICAxMDA4NzY5NDk4VSwJLy8gUE1JTlVEcm0NCisgICAgMjAzNDYzMTMwVSwJLy8gUE1JTlVEcnINCisgICAgMTAwODc2OTUwNlUsCS8vIFBNSU5VV3JtDQorICAgIDIwMzQ2MzEzOFUsCS8vIFBNSU5VV3JyDQorICAgIDExNDI5ODU4NzBVLAkvLyBQTU9WTVNLQnJyDQorICAgIDE0NzY0MDE2NDJVLAkvLyBQTU9WU1hCRHJtDQorICAgIDExNDI5ODcyNDJVLAkvLyBQTU9WU1hCRHJyDQorICAgIDE0MDkyOTI3ODhVLAkvLyBQTU9WU1hCUXJtDQorICAgIDExNDI5ODcyNTJVLAkvLyBQTU9WU1hCUXJyDQorICAgIDE1NDM1MTA1MjZVLAkvLyBQTU9WU1hCV3JtDQorICAgIDExNDI5ODcyNjJVLAkvLyBQTU9WU1hCV3JyDQorICAgIDE1NDM1MTA1MzZVLAkvLyBQTU9WU1hEUXJtDQorICAgIDExNDI5ODcyNzJVLAkvLyBQTU9WU1hEUXJyDQorICAgIDE1NDM1MTA1NDZVLAkvLyBQTU9WU1hXRHJtDQorICAgIDExNDI5ODcyODJVLAkvLyBQTU9WU1hXRHJyDQorICAgIDE0NzY0MDE2OTJVLAkvLyBQTU9WU1hXUXJtDQorICAgIDExNDI5ODcyOTJVLAkvLyBQTU9WU1hXUXJyDQorICAgIDE0NzY0MDE3MDJVLAkvLyBQTU9WWlhCRHJtDQorICAgIDExNDI5ODczMDJVLAkvLyBQTU9WWlhCRHJyDQorICAgIDE0MDkyOTI4NDhVLAkvLyBQTU9WWlhCUXJtDQorICAgIDExNDI5ODczMTJVLAkvLyBQTU9WWlhCUXJyDQorICAgIDE1NDM1MTA1ODZVLAkvLyBQTU9WWlhCV3JtDQorICAgIDExNDI5ODczMjJVLAkvLyBQTU9WWlhCV3JyDQorICAgIDE1NDM1MTA1OTZVLAkvLyBQTU9WWlhEUXJtDQorICAgIDExNDI5ODczMzJVLAkvLyBQTU9WWlhEUXJyDQorICAgIDE1NDM1MTA2MDZVLAkvLyBQTU9WWlhXRHJtDQorICAgIDExNDI5ODczNDJVLAkvLyBQTU9WWlhXRHJyDQorICAgIDE0NzY0MDE3NTJVLAkvLyBQTU9WWlhXUXJtDQorICAgIDExNDI5ODczNTJVLAkvLyBQTU9WWlhXUXJyDQorICAgIDEwMDg3Njk2MzRVLAkvLyBQTVVMRFFybQ0KKyAgICAyMDM0NjMyNjZVLAkvLyBQTVVMRFFycg0KKyAgICAxMDA4NzY5NjQyVSwJLy8gUE1VTEhSU1dybTEyOA0KKyAgICA0MDQ3ODk4NjZVLAkvLyBQTVVMSFJTV3JtNjQNCisgICAgMjAzNDYzMjc0VSwJLy8gUE1VTEhSU1dycjEyOA0KKyAgICAyMDM0NjMyNzRVLAkvLyBQTVVMSFJTV3JyNjQNCisgICAgMTAwODc2ODE1MlUsCS8vIFBNVUxIVVdybQ0KKyAgICAyMDM0NjE3ODRVLAkvLyBQTVVMSFVXcnINCisgICAgMTAwODc2ODE2MVUsCS8vIFBNVUxIV3JtDQorICAgIDIwMzQ2MTc5M1UsCS8vIFBNVUxIV3JyDQorICAgIDEwMDg3Njk2NTJVLAkvLyBQTVVMTERybQ0KKyAgICAyMDM0NjMyODRVLAkvLyBQTVVMTERycg0KKyAgICAxMDA4NzY4MTY5VSwJLy8gUE1VTExXcm0NCisgICAgMjAzNDYxODAxVSwJLy8gUE1VTExXcnINCisgICAgMTAwODc2ODE3N1UsCS8vIFBNVUxVRFFybQ0KKyAgICAyMDM0NjE4MDlVLAkvLyBQTVVMVURRcnINCisgICAgNzM0MDcxMDBVLAkvLyBQT1AxNnINCisgICAgODcyNDIyMDEyVSwJLy8gUE9QMTZybW0NCisgICAgNzM0MDcxMDBVLAkvLyBQT1AxNnJtcg0KKyAgICA3MzQwNzEwNlUsCS8vIFBPUDMycg0KKyAgICA5NDU4MjIzMzhVLAkvLyBQT1AzMnJtbQ0KKyAgICA3MzQwNzEwNlUsCS8vIFBPUDMycm1yDQorICAgIDczNDA3MTEyVSwJLy8gUE9QNjRyDQorICAgIDE2MTY5MTA5ODRVLAkvLyBQT1A2NHJtbQ0KKyAgICA3MzQwNzExMlUsCS8vIFBPUDY0cm1yDQorICAgIDY3OThVLAkvLyBQT1BBMzINCisgICAgMTQwOTI5Mjk0OFUsCS8vIFBPUENOVDE2cm0NCisgICAgMTE0Mjk4NzQxMlUsCS8vIFBPUENOVDE2cnINCisgICAgMTQ3NjQwMTgyMVUsCS8vIFBPUENOVDMycm0NCisgICAgMTE0Mjk4NzQyMVUsCS8vIFBPUENOVDMycnINCisgICAgMTU0MzUxMDY5NFUsCS8vIFBPUENOVDY0cm0NCisgICAgMTE0Mjk4NzQzMFUsCS8vIFBPUENOVDY0cnINCisgICAgNjgzMVUsCS8vIFBPUEYxNg0KKyAgICA2ODM3VSwJLy8gUE9QRjMyDQorICAgIDY4NDNVLAkvLyBQT1BGNjQNCisgICAgNjg0OVUsCS8vIFBPUEZTMTYNCisgICAgNjg1OFUsCS8vIFBPUEZTMzINCisgICAgNjg2N1UsCS8vIFBPUEZTNjQNCisgICAgNjg3NlUsCS8vIFBPUEdTMTYNCisgICAgNjg4NVUsCS8vIFBPUEdTMzINCisgICAgNjg5NFUsCS8vIFBPUEdTNjQNCisgICAgMTAwODc2ODE4NlUsCS8vIFBPUnJtDQorICAgIDIwMzQ2MTgxOFUsCS8vIFBPUnJyDQorICAgIDE3NDQ4MzczNjdVLAkvLyBQUkVGRVRDSE5UQQ0KKyAgICAxNzQ0ODM3MzgwVSwJLy8gUFJFRkVUQ0hUMA0KKyAgICAxNzQ0ODM3MzkyVSwJLy8gUFJFRkVUQ0hUMQ0KKyAgICAxNzQ0ODM3NDA0VSwJLy8gUFJFRkVUQ0hUMg0KKyAgICAxMDA4NzY4MTkxVSwJLy8gUFNBREJXcm0NCisgICAgMjAzNDYxODIzVSwJLy8gUFNBREJXcnINCisgICAgMTAwODc2OTgzMlUsCS8vIFBTSFVGQnJtMTI4DQorICAgIDQwNDc5MDA1NlUsCS8vIFBTSFVGQnJtNjQNCisgICAgMjAzNDYzNDY0VSwJLy8gUFNIVUZCcnIxMjgNCisgICAgMjAzNDYzNDY0VSwJLy8gUFNIVUZCcnI2NA0KKyAgICAxMjE1MzA2NTQ0VSwJLy8gUFNIVUZEbWkNCisgICAgMjA5ODg2MDAwVSwJLy8gUFNIVUZEcmkNCisgICAgMTIxNTMwNjU1MlUsCS8vIFBTSFVGSFdtaQ0KKyAgICAyMDk4ODYwMDhVLAkvLyBQU0hVRkhXcmkNCisgICAgMTIxNTMwNjU2MVUsCS8vIFBTSFVGTFdtaQ0KKyAgICAyMDk4ODYwMTdVLAkvLyBQU0hVRkxXcmkNCisgICAgMTAwODc2OTg2NlUsCS8vIFBTSUdOQnJtMTI4DQorICAgIDQwNDc5MDA5MFUsCS8vIFBTSUdOQnJtNjQNCisgICAgMjAzNDYzNDk4VSwJLy8gUFNJR05CcnIxMjgNCisgICAgMjAzNDYzNDk4VSwJLy8gUFNJR05CcnI2NA0KKyAgICAxMDA4NzY5ODc0VSwJLy8gUFNJR05Ecm0xMjgNCisgICAgNDA0NzkwMDk4VSwJLy8gUFNJR05Ecm02NA0KKyAgICAyMDM0NjM1MDZVLAkvLyBQU0lHTkRycjEyOA0KKyAgICAyMDM0NjM1MDZVLAkvLyBQU0lHTkRycjY0DQorICAgIDEwMDg3Njk4ODJVLAkvLyBQU0lHTldybTEyOA0KKyAgICA0MDQ3OTAxMDZVLAkvLyBQU0lHTldybTY0DQorICAgIDIwMzQ2MzUxNFUsCS8vIFBTSUdOV3JyMTI4DQorICAgIDIwMzQ2MzUxNFUsCS8vIFBTSUdOV3JyNjQNCisgICAgMjAzNDYzNTIyVSwJLy8gUFNMTERRcmkNCisgICAgMjAzNDYxODM5VSwJLy8gUFNMTERyaQ0KKyAgICAxMDA4NzY4MjA3VSwJLy8gUFNMTERybQ0KKyAgICAyMDM0NjE4MzlVLAkvLyBQU0xMRHJyDQorICAgIDIwMzQ2MTg0NlUsCS8vIFBTTExRcmkNCisgICAgMTAwODc2ODIxNFUsCS8vIFBTTExRcm0NCisgICAgMjAzNDYxODQ2VSwJLy8gUFNMTFFycg0KKyAgICAyMDM0NjE4NTNVLAkvLyBQU0xMV3JpDQorICAgIDEwMDg3NjgyMjFVLAkvLyBQU0xMV3JtDQorICAgIDIwMzQ2MTg1M1UsCS8vIFBTTExXcnINCisgICAgMjAzNDYxODYwVSwJLy8gUFNSQURyaQ0KKyAgICAxMDA4NzY4MjI4VSwJLy8gUFNSQURybQ0KKyAgICAyMDM0NjE4NjBVLAkvLyBQU1JBRHJyDQorICAgIDIwMzQ2MTg2N1UsCS8vIFBTUkFXcmkNCisgICAgMTAwODc2ODIzNVUsCS8vIFBTUkFXcm0NCisgICAgMjAzNDYxODY3VSwJLy8gUFNSQVdycg0KKyAgICAyMDM0NjM1MzBVLAkvLyBQU1JMRFFyaQ0KKyAgICAyMDM0NjE4NzRVLAkvLyBQU1JMRHJpDQorICAgIDEwMDg3NjgyNDJVLAkvLyBQU1JMRHJtDQorICAgIDIwMzQ2MTg3NFUsCS8vIFBTUkxEcnINCisgICAgMjAzNDYxODgxVSwJLy8gUFNSTFFyaQ0KKyAgICAxMDA4NzY4MjQ5VSwJLy8gUFNSTFFybQ0KKyAgICAyMDM0NjE4ODFVLAkvLyBQU1JMUXJyDQorICAgIDIwMzQ2MTg4OFUsCS8vIFBTUkxXcmkNCisgICAgMTAwODc2ODI1NlUsCS8vIFBTUkxXcm0NCisgICAgMjAzNDYxODg4VSwJLy8gUFNSTFdycg0KKyAgICAxMDA4NzY4MjYzVSwJLy8gUFNVQkJybQ0KKyAgICAyMDM0NjE4OTVVLAkvLyBQU1VCQnJyDQorICAgIDEwMDg3NjgyNzBVLAkvLyBQU1VCRHJtDQorICAgIDIwMzQ2MTkwMlUsCS8vIFBTVUJEcnINCisgICAgMTAwODc2ODI3N1UsCS8vIFBTVUJRcm0NCisgICAgMjAzNDYxOTA5VSwJLy8gUFNVQlFycg0KKyAgICAxMDA4NzY4Mjg0VSwJLy8gUFNVQlNCcm0NCisgICAgMjAzNDYxOTE2VSwJLy8gUFNVQlNCcnINCisgICAgMTAwODc2ODI5MlUsCS8vIFBTVUJTV3JtDQorICAgIDIwMzQ2MTkyNFUsCS8vIFBTVUJTV3JyDQorICAgIDEwMDg3NjgzMDBVLAkvLyBQU1VCVVNCcm0NCisgICAgMjAzNDYxOTMyVSwJLy8gUFNVQlVTQnJyDQorICAgIDEwMDg3NjgzMDlVLAkvLyBQU1VCVVNXcm0NCisgICAgMjAzNDYxOTQxVSwJLy8gUFNVQlVTV3JyDQorICAgIDEwMDg3NjgzMThVLAkvLyBQU1VCV3JtDQorICAgIDIwMzQ2MTk1MFUsCS8vIFBTVUJXcnINCisgICAgMjA4MDM4MTgxMFUsCS8vIFBURVNUcm0NCisgICAgMTE0Mjk4NzYzNFUsCS8vIFBURVNUcnINCisgICAgMTAwODc2ODMyNVUsCS8vIFBVTlBDS0hCV3JtDQorICAgIDIwMzQ2MTk1N1UsCS8vIFBVTlBDS0hCV3JyDQorICAgIDEwMDg3NjgzMzZVLAkvLyBQVU5QQ0tIRFFybQ0KKyAgICAyMDM0NjE5NjhVLAkvLyBQVU5QQ0tIRFFycg0KKyAgICAxMDA4NzY5OTE0VSwJLy8gUFVOUENLSFFEUXJtDQorICAgIDIwMzQ2MzU0NlUsCS8vIFBVTlBDS0hRRFFycg0KKyAgICAxMDA4NzY4MzQ3VSwJLy8gUFVOUENLSFdEcm0NCisgICAgMjAzNDYxOTc5VSwJLy8gUFVOUENLSFdEcnINCisgICAgMTAwODc2ODM1OFUsCS8vIFBVTlBDS0xCV3JtDQorICAgIDIwMzQ2MTk5MFUsCS8vIFBVTlBDS0xCV3JyDQorICAgIDEwMDg3NjgzNjlVLAkvLyBQVU5QQ0tMRFFybQ0KKyAgICAyMDM0NjIwMDFVLAkvLyBQVU5QQ0tMRFFycg0KKyAgICAxMDA4NzY5OTI2VSwJLy8gUFVOUENLTFFEUXJtDQorICAgIDIwMzQ2MzU1OFUsCS8vIFBVTlBDS0xRRFFycg0KKyAgICAxMDA4NzY4MzgwVSwJLy8gUFVOUENLTFdEcm0NCisgICAgMjAzNDYyMDEyVSwJLy8gUFVOUENLTFdEcnINCisgICAgNzM0MDczNzhVLAkvLyBQVVNIMTZyDQorICAgIDg3MjQyMjI5MFUsCS8vIFBVU0gxNnJtbQ0KKyAgICA3MzQwNzM3OFUsCS8vIFBVU0gxNnJtcg0KKyAgICA3MzQwNzM4NVUsCS8vIFBVU0gzMnINCisgICAgOTQ1ODIyNjE3VSwJLy8gUFVTSDMycm1tDQorICAgIDczNDA3Mzg1VSwJLy8gUFVTSDMycm1yDQorICAgIDczNDA3MzkyVSwJLy8gUFVTSDY0aTE2DQorICAgIDczNDA3MzkyVSwJLy8gUFVTSDY0aTMyDQorICAgIDczNDA3MzkyVSwJLy8gUFVTSDY0aTgNCisgICAgNzM0MDczOTJVLAkvLyBQVVNINjRyDQorICAgIDE2MTY5MTEyNjRVLAkvLyBQVVNINjRybW0NCisgICAgNzM0MDczOTJVLAkvLyBQVVNINjRybXINCisgICAgNzA3OVUsCS8vIFBVU0hBMzINCisgICAgNzA4NlUsCS8vIFBVU0hGMTYNCisgICAgNzA5M1UsCS8vIFBVU0hGMzINCisgICAgNzEwMFUsCS8vIFBVU0hGNjQNCisgICAgNzEwN1UsCS8vIFBVU0hGUzE2DQorICAgIDcxMTdVLAkvLyBQVVNIRlMzMg0KKyAgICA3MTI3VSwJLy8gUFVTSEZTNjQNCisgICAgNzEzN1UsCS8vIFBVU0hHUzE2DQorICAgIDcxNDdVLAkvLyBQVVNIR1MzMg0KKyAgICA3MTU3VSwJLy8gUFVTSEdTNjQNCisgICAgNzM0MDczNzhVLAkvLyBQVVNIaTE2DQorICAgIDczNDA3Mzg1VSwJLy8gUFVTSGkzMg0KKyAgICA3MzQwNzM4NVUsCS8vIFBVU0hpOA0KKyAgICAxMDA4NzY4MzkxVSwJLy8gUFhPUnJtDQorICAgIDIwMzQ2MjAyM1UsCS8vIFBYT1Jycg0KKyAgICA4NzI0MjIzOTlVLAkvLyBSQ0wxNm0xDQorICAgIDg3MjQyMjQwOFUsCS8vIFJDTDE2bUNMDQorICAgIDEzNTI3MzQ5MVUsCS8vIFJDTDE2bWkNCisgICAgNzM0MDc0ODdVLAkvLyBSQ0wxNnIxDQorICAgIDczNDA3NDk2VSwJLy8gUkNMMTZyQ0wNCisgICAgMjAzNDYzNjk5VSwJLy8gUkNMMTZyaQ0KKyAgICA5NDU4MjI3NDVVLAkvLyBSQ0wzMm0xDQorICAgIDk0NTgyMjc1NFUsCS8vIFJDTDMybUNMDQorICAgIDEzNTMzOTA1M1UsCS8vIFJDTDMybWkNCisgICAgNzM0MDc1MTNVLAkvLyBSQ0wzMnIxDQorICAgIDczNDA3NTIyVSwJLy8gUkNMMzJyQ0wNCisgICAgMjAzNDYzNzI1VSwJLy8gUkNMMzJyaQ0KKyAgICAxNjE2OTExNDExVSwJLy8gUkNMNjRtMQ0KKyAgICAxNjE2OTExNDIwVSwJLy8gUkNMNjRtQ0wNCisgICAgMTM1MzcxODQ3VSwJLy8gUkNMNjRtaQ0KKyAgICA3MzQwNzUzOVUsCS8vIFJDTDY0cjENCisgICAgNzM0MDc1NDhVLAkvLyBSQ0w2NHJDTA0KKyAgICAyMDM0NjM3NTFVLAkvLyBSQ0w2NHJpDQorICAgIDE3NDQ4Mzc3MDlVLAkvLyBSQ0w4bTENCisgICAgMTc0NDgzNzcxOFUsCS8vIFJDTDhtQ0wNCisgICAgMTM1NDA0NjQxVSwJLy8gUkNMOG1pDQorICAgIDczNDA3NTY1VSwJLy8gUkNMOHIxDQorICAgIDczNDA3NTc0VSwJLy8gUkNMOHJDTA0KKyAgICAyMDM0NjM3NzdVLAkvLyBSQ0w4cmkNCisgICAgMjA4MDM4MjA1NVUsCS8vIFJDUFBTbQ0KKyAgICAyMDgwMzgyMDU1VSwJLy8gUkNQUFNtX0ludA0KKyAgICAxMTQyOTg3ODc5VSwJLy8gUkNQUFNyDQorICAgIDExNDI5ODc4NzlVLAkvLyBSQ1BQU3JfSW50DQorICAgIDIyMjA4OTEyNDZVLAkvLyBSQ1BTU20NCisgICAgMjIyMDg5MTI0NlUsCS8vIFJDUFNTbV9JbnQNCisgICAgMTE0Mjk4Nzg4NlUsCS8vIFJDUFNTcg0KKyAgICAxMTQyOTg3ODg2VSwJLy8gUkNQU1NyX0ludA0KKyAgICA4NzI0MjI1MTdVLAkvLyBSQ1IxNm0xDQorICAgIDg3MjQyMjUyNlUsCS8vIFJDUjE2bUNMDQorICAgIDEzNTI3MzYwOVUsCS8vIFJDUjE2bWkNCisgICAgNzM0MDc2MDVVLAkvLyBSQ1IxNnIxDQorICAgIDczNDA3NjE0VSwJLy8gUkNSMTZyQ0wNCisgICAgMjAzNDYzODE3VSwJLy8gUkNSMTZyaQ0KKyAgICA5NDU4MjI4NjNVLAkvLyBSQ1IzMm0xDQorICAgIDk0NTgyMjg3MlUsCS8vIFJDUjMybUNMDQorICAgIDEzNTMzOTE3MVUsCS8vIFJDUjMybWkNCisgICAgNzM0MDc2MzFVLAkvLyBSQ1IzMnIxDQorICAgIDczNDA3NjQwVSwJLy8gUkNSMzJyQ0wNCisgICAgMjAzNDYzODQzVSwJLy8gUkNSMzJyaQ0KKyAgICAxNjE2OTExNTI5VSwJLy8gUkNSNjRtMQ0KKyAgICAxNjE2OTExNTM4VSwJLy8gUkNSNjRtQ0wNCisgICAgMTM1MzcxOTY1VSwJLy8gUkNSNjRtaQ0KKyAgICA3MzQwNzY1N1UsCS8vIFJDUjY0cjENCisgICAgNzM0MDc2NjZVLAkvLyBSQ1I2NHJDTA0KKyAgICAyMDM0NjM4NjlVLAkvLyBSQ1I2NHJpDQorICAgIDE3NDQ4Mzc4MjdVLAkvLyBSQ1I4bTENCisgICAgMTc0NDgzNzgzNlUsCS8vIFJDUjhtQ0wNCisgICAgMTM1NDA0NzU5VSwJLy8gUkNSOG1pDQorICAgIDczNDA3NjgzVSwJLy8gUkNSOHIxDQorICAgIDczNDA3NjkyVSwJLy8gUkNSOHJDTA0KKyAgICAyMDM0NjM4OTVVLAkvLyBSQ1I4cmkNCisgICAgNzM4OVUsCS8vIFJETVNSDQorICAgIDczOTVVLAkvLyBSRFBNQw0KKyAgICA3NDAxVSwJLy8gUkRUU0MNCisgICAgNzQwN1UsCS8vIFJEVFNDUA0KKyAgICA3NDE0VSwJLy8gUkVQTkVfUFJFRklYDQorICAgIDc0MjBVLAkvLyBSRVBfTU9WU0INCisgICAgNzQzMFUsCS8vIFJFUF9NT1ZTRA0KKyAgICA3NDQwVSwJLy8gUkVQX01PVlNRDQorICAgIDc0NTBVLAkvLyBSRVBfTU9WU1cNCisgICAgNzQ2MFUsCS8vIFJFUF9QUkVGSVgNCisgICAgNzQ2NFUsCS8vIFJFUF9TVE9TQg0KKyAgICA3NDc0VSwJLy8gUkVQX1NUT1NEDQorICAgIDc0ODRVLAkvLyBSRVBfU1RPU1ENCisgICAgNzQ5NFUsCS8vIFJFUF9TVE9TVw0KKyAgICA3NTA0VSwJLy8gUkVUDQorICAgIDczNDA3ODI4VSwJLy8gUkVUSQ0KKyAgICA4NzI0MjI3NDVVLAkvLyBST0wxNm0xDQorICAgIDg3MjQyMjc1MVUsCS8vIFJPTDE2bUNMDQorICAgIDEzNTI3MzgxN1UsCS8vIFJPTDE2bWkNCisgICAgNzM0MDc4MzNVLAkvLyBST0wxNnIxDQorICAgIDczNDA3ODM5VSwJLy8gUk9MMTZyQ0wNCisgICAgMjAzNDY0MDI1VSwJLy8gUk9MMTZyaQ0KKyAgICA5NDU4MjMwODJVLAkvLyBST0wzMm0xDQorICAgIDk0NTgyMzA4OFUsCS8vIFJPTDMybUNMDQorICAgIDEzNTMzOTM3MFUsCS8vIFJPTDMybWkNCisgICAgNzM0MDc4NTBVLAkvLyBST0wzMnIxDQorICAgIDczNDA3ODU2VSwJLy8gUk9MMzJyQ0wNCisgICAgMjAzNDY0MDQyVSwJLy8gUk9MMzJyaQ0KKyAgICAxNjE2OTExNzM5VSwJLy8gUk9MNjRtMQ0KKyAgICAxNjE2OTExNzQ1VSwJLy8gUk9MNjRtQ0wNCisgICAgMTM1MzcyMTU1VSwJLy8gUk9MNjRtaQ0KKyAgICA3MzQwNzg2N1UsCS8vIFJPTDY0cjENCisgICAgNzM0MDc4NzNVLAkvLyBST0w2NHJDTA0KKyAgICAyMDM0NjQwNTlVLAkvLyBST0w2NHJpDQorICAgIDE3NDQ4MzgwMjhVLAkvLyBST0w4bTENCisgICAgMTc0NDgzODAzNFUsCS8vIFJPTDhtQ0wNCisgICAgMTM1NDA0OTQwVSwJLy8gUk9MOG1pDQorICAgIDczNDA3ODg0VSwJLy8gUk9MOHIxDQorICAgIDczNDA3ODkwVSwJLy8gUk9MOHJDTA0KKyAgICAyMDM0NjQwNzZVLAkvLyBST0w4cmkNCisgICAgODcyNDIyODEzVSwJLy8gUk9SMTZtMQ0KKyAgICA4NzI0MjI4MTlVLAkvLyBST1IxNm1DTA0KKyAgICAxMzUyNzM4ODVVLAkvLyBST1IxNm1pDQorICAgIDczNDA3OTAxVSwJLy8gUk9SMTZyMQ0KKyAgICA3MzQwNzkwN1UsCS8vIFJPUjE2ckNMDQorICAgIDIwMzQ2NDA5M1UsCS8vIFJPUjE2cmkNCisgICAgOTQ1ODIzMTUwVSwJLy8gUk9SMzJtMQ0KKyAgICA5NDU4MjMxNTZVLAkvLyBST1IzMm1DTA0KKyAgICAxMzUzMzk0MzhVLAkvLyBST1IzMm1pDQorICAgIDczNDA3OTE4VSwJLy8gUk9SMzJyMQ0KKyAgICA3MzQwNzkyNFUsCS8vIFJPUjMyckNMDQorICAgIDIwMzQ2NDExMFUsCS8vIFJPUjMycmkNCisgICAgMTYxNjkxMTgwN1UsCS8vIFJPUjY0bTENCisgICAgMTYxNjkxMTgxM1UsCS8vIFJPUjY0bUNMDQorICAgIDEzNTM3MjIyM1UsCS8vIFJPUjY0bWkNCisgICAgNzM0MDc5MzVVLAkvLyBST1I2NHIxDQorICAgIDczNDA3OTQxVSwJLy8gUk9SNjRyQ0wNCisgICAgMjAzNDY0MTI3VSwJLy8gUk9SNjRyaQ0KKyAgICAxNzQ0ODM4MDk2VSwJLy8gUk9SOG0xDQorICAgIDE3NDQ4MzgxMDJVLAkvLyBST1I4bUNMDQorICAgIDEzNTQwNTAwOFUsCS8vIFJPUjhtaQ0KKyAgICA3MzQwNzk1MlUsCS8vIFJPUjhyMQ0KKyAgICA3MzQwNzk1OFUsCS8vIFJPUjhyQ0wNCisgICAgMjAzNDY0MTQ0VSwJLy8gUk9SOHJpDQorICAgIDEyMzk0MjQ0ODFVLAkvLyBST1VORFBEbV9JbnQNCisgICAgMjA5ODg2Njg5VSwJLy8gUk9VTkRQRHJfSW50DQorICAgIDEyMzk0MjQ0OTBVLAkvLyBST1VORFBTbV9JbnQNCisgICAgMjA5ODg2Njk4VSwJLy8gUk9VTkRQU3JfSW50DQorICAgIDEyOTEwMDEzMzFVLAkvLyBST1VORFNEbV9JbnQNCisgICAgMTM0NDMxNDg2N1UsCS8vIFJPVU5EU0RyX0ludA0KKyAgICAxMjkzMDk4NDkyVSwJLy8gUk9VTkRTU21fSW50DQorICAgIDEzNDQzMTQ4NzZVLAkvLyBST1VORFNTcl9JbnQNCisgICAgNzY4NVUsCS8vIFJTTQ0KKyAgICAyMDgwMzgyNDczVSwJLy8gUlNRUlRQU20NCisgICAgMjA4MDM4MjQ3M1UsCS8vIFJTUVJUUFNtX0ludA0KKyAgICAxMTQyOTg4Mjk3VSwJLy8gUlNRUlRQU3INCisgICAgMTE0Mjk4ODI5N1UsCS8vIFJTUVJUUFNyX0ludA0KKyAgICAyMjIwODkxNjY2VSwJLy8gUlNRUlRTU20NCisgICAgMjIyMDg5MTY2NlUsCS8vIFJTUVJUU1NtX0ludA0KKyAgICAxMTQyOTg4MzA2VSwJLy8gUlNRUlRTU3INCisgICAgMTE0Mjk4ODMwNlUsCS8vIFJTUVJUU1NyX0ludA0KKyAgICA3NzA3VSwJLy8gU0FIRg0KKyAgICA4NzI0MjI5NDRVLAkvLyBTQVIxNm0xDQorICAgIDg3MjQyMjk1MFUsCS8vIFNBUjE2bUNMDQorICAgIDEzNTI3NDAxNlUsCS8vIFNBUjE2bWkNCisgICAgNzM0MDgwMzJVLAkvLyBTQVIxNnIxDQorICAgIDczNDA4MDM4VSwJLy8gU0FSMTZyQ0wNCisgICAgMjAzNDY0MjI0VSwJLy8gU0FSMTZyaQ0KKyAgICA5NDU4MjMyODFVLAkvLyBTQVIzMm0xDQorICAgIDk0NTgyMzI4N1UsCS8vIFNBUjMybUNMDQorICAgIDEzNTMzOTU2OVUsCS8vIFNBUjMybWkNCisgICAgNzM0MDgwNDlVLAkvLyBTQVIzMnIxDQorICAgIDczNDA4MDU1VSwJLy8gU0FSMzJyQ0wNCisgICAgMjAzNDY0MjQxVSwJLy8gU0FSMzJyaQ0KKyAgICAxNjE2OTExOTM4VSwJLy8gU0FSNjRtMQ0KKyAgICAxNjE2OTExOTQ0VSwJLy8gU0FSNjRtQ0wNCisgICAgMTM1MzcyMzU0VSwJLy8gU0FSNjRtaQ0KKyAgICA3MzQwODA2NlUsCS8vIFNBUjY0cjENCisgICAgNzM0MDgwNzJVLAkvLyBTQVI2NHJDTA0KKyAgICAyMDM0NjQyNThVLAkvLyBTQVI2NHJpDQorICAgIDE3NDQ4MzgyMjdVLAkvLyBTQVI4bTENCisgICAgMTc0NDgzODIzM1UsCS8vIFNBUjhtQ0wNCisgICAgMTM1NDA1MTM5VSwJLy8gU0FSOG1pDQorICAgIDczNDA4MDgzVSwJLy8gU0FSOHIxDQorICAgIDczNDA4MDg5VSwJLy8gU0FSOHJDTA0KKyAgICAyMDM0NjQyNzVVLAkvLyBTQVI4cmkNCisgICAgNjcxMTY2NDRVLAkvLyBTQkIxNmkxNg0KKyAgICAxMzUyNzQwODRVLAkvLyBTQkIxNm1pDQorICAgIDEzNTI3NDA4NFUsCS8vIFNCQjE2bWk4DQorICAgIDEzNTI3NDA4NFUsCS8vIFNCQjE2bXINCisgICAgMjAzNDY0MjkyVSwJLy8gU0JCMTZyaQ0KKyAgICAyMDM0NjQyOTJVLAkvLyBTQkIxNnJpOA0KKyAgICAyNzA1NzMxNTZVLAkvLyBTQkIxNnJtDQorICAgIDIwMzQ2NDI5MlUsCS8vIFNCQjE2cnINCisgICAgMjAzNDY0MjkyVSwJLy8gU0JCMTZycl9SRVYNCisgICAgNzAyNjIzNzhVLAkvLyBTQkIzMmkzMg0KKyAgICAxMzUzMzk2MjZVLAkvLyBTQkIzMm1pDQorICAgIDEzNTMzOTYyNlUsCS8vIFNCQjMybWk4DQorICAgIDEzNTMzOTYyNlUsCS8vIFNCQjMybXINCisgICAgMjAzNDY0Mjk4VSwJLy8gU0JCMzJyaQ0KKyAgICAyMDM0NjQyOThVLAkvLyBTQkIzMnJpOA0KKyAgICAzMzc2ODIwMjZVLAkvLyBTQkIzMnJtDQorICAgIDIwMzQ2NDI5OFUsCS8vIFNCQjMycnINCisgICAgMjAzNDY0Mjk4VSwJLy8gU0JCMzJycl9SRVYNCisgICAgNzEzMTA5NjBVLAkvLyBTQkI2NGkzMg0KKyAgICAxMzUzNzI0MDBVLAkvLyBTQkI2NG1pMzINCisgICAgMTM1MzcyNDAwVSwJLy8gU0JCNjRtaTgNCisgICAgMTM1MzcyNDAwVSwJLy8gU0JCNjRtcg0KKyAgICAyMDM0NjQzMDRVLAkvLyBTQkI2NHJpMzINCisgICAgMjAzNDY0MzA0VSwJLy8gU0JCNjRyaTgNCisgICAgNDA0NzkwODk2VSwJLy8gU0JCNjRybQ0KKyAgICAyMDM0NjQzMDRVLAkvLyBTQkI2NHJyDQorICAgIDIwMzQ2NDMwNFUsCS8vIFNCQjY0cnJfUkVWDQorICAgIDcyMzU5NTQyVSwJLy8gU0JCOGk4DQorICAgIDEzNTQwNTE3NFUsCS8vIFNCQjhtaQ0KKyAgICAxMzU0MDUxNzRVLAkvLyBTQkI4bXINCisgICAgMjAzNDY0MzEwVSwJLy8gU0JCOHJpDQorICAgIDQ3MTg5OTc2NlUsCS8vIFNCQjhybQ0KKyAgICAyMDM0NjQzMTBVLAkvLyBTQkI4cnINCisgICAgMjAzNDY0MzEwVSwJLy8gU0JCOHJyX1JFVg0KKyAgICA3ODA0VSwJLy8gU0NBUzE2DQorICAgIDc4MTBVLAkvLyBTQ0FTMzINCisgICAgNzgxNlUsCS8vIFNDQVM2NA0KKyAgICA3ODIyVSwJLy8gU0NBUzgNCisgICAgMTc0NDgzODI5MlUsCS8vIFNFVEFFbQ0KKyAgICA3MzQwODE0OFUsCS8vIFNFVEFFcg0KKyAgICAxNzQ0ODM4Mjk5VSwJLy8gU0VUQW0NCisgICAgNzM0MDgxNTVVLAkvLyBTRVRBcg0KKyAgICAxNzQ0ODM4MzA1VSwJLy8gU0VUQkVtDQorICAgIDczNDA4MTYxVSwJLy8gU0VUQkVyDQorICAgIDBVLAkvLyBTRVRCX0MxNnINCisgICAgMFUsCS8vIFNFVEJfQzMycg0KKyAgICAwVSwJLy8gU0VUQl9DNjRyDQorICAgIDBVLAkvLyBTRVRCX0M4cg0KKyAgICAxNzQ0ODM4MzEyVSwJLy8gU0VUQm0NCisgICAgNzM0MDgxNjhVLAkvLyBTRVRCcg0KKyAgICAxNzQ0ODM4MzE4VSwJLy8gU0VURW0NCisgICAgNzM0MDgxNzRVLAkvLyBTRVRFcg0KKyAgICAxNzQ0ODM4MzI0VSwJLy8gU0VUR0VtDQorICAgIDczNDA4MTgwVSwJLy8gU0VUR0VyDQorICAgIDE3NDQ4MzgzMzFVLAkvLyBTRVRHbQ0KKyAgICA3MzQwODE4N1UsCS8vIFNFVEdyDQorICAgIDE3NDQ4MzgzMzdVLAkvLyBTRVRMRW0NCisgICAgNzM0MDgxOTNVLAkvLyBTRVRMRXINCisgICAgMTc0NDgzODM0NFUsCS8vIFNFVExtDQorICAgIDczNDA4MjAwVSwJLy8gU0VUTHINCisgICAgMTc0NDgzODM1MFUsCS8vIFNFVE5FbQ0KKyAgICA3MzQwODIwNlUsCS8vIFNFVE5Fcg0KKyAgICAxNzQ0ODM4MzU3VSwJLy8gU0VUTk9tDQorICAgIDczNDA4MjEzVSwJLy8gU0VUTk9yDQorICAgIDE3NDQ4MzgzNjRVLAkvLyBTRVROUG0NCisgICAgNzM0MDgyMjBVLAkvLyBTRVROUHINCisgICAgMTc0NDgzODM3MVUsCS8vIFNFVE5TbQ0KKyAgICA3MzQwODIyN1UsCS8vIFNFVE5Tcg0KKyAgICAxNzQ0ODM4Mzc4VSwJLy8gU0VUT20NCisgICAgNzM0MDgyMzRVLAkvLyBTRVRPcg0KKyAgICAxNzQ0ODM4Mzg0VSwJLy8gU0VUUG0NCisgICAgNzM0MDgyNDBVLAkvLyBTRVRQcg0KKyAgICAxNzQ0ODM4MzkwVSwJLy8gU0VUU20NCisgICAgNzM0MDgyNDZVLAkvLyBTRVRTcg0KKyAgICA3OTMyVSwJLy8gU0ZFTkNFDQorICAgIDIyODE3MDkzMTVVLAkvLyBTR0RUbQ0KKyAgICA4NzI0MjMxNzdVLAkvLyBTSEwxNm0xDQorICAgIDg3MjQyMzE4M1UsCS8vIFNITDE2bUNMDQorICAgIDEzNTI3NDI0OVUsCS8vIFNITDE2bWkNCisgICAgNzM0MDgyNjVVLAkvLyBTSEwxNnIxDQorICAgIDczNDA4MjcxVSwJLy8gU0hMMTZyQ0wNCisgICAgMjAzNDY0NDU3VSwJLy8gU0hMMTZyaQ0KKyAgICA5NDU4MjM1MTRVLAkvLyBTSEwzMm0xDQorICAgIDk0NTgyMzUyMFUsCS8vIFNITDMybUNMDQorICAgIDEzNTMzOTgwMlUsCS8vIFNITDMybWkNCisgICAgNzM0MDgyODJVLAkvLyBTSEwzMnIxDQorICAgIDczNDA4Mjg4VSwJLy8gU0hMMzJyQ0wNCisgICAgMjAzNDY0NDc0VSwJLy8gU0hMMzJyaQ0KKyAgICAxNjE2OTEyMTcxVSwJLy8gU0hMNjRtMQ0KKyAgICAxNjE2OTEyMTc3VSwJLy8gU0hMNjRtQ0wNCisgICAgMTM1MzcyNTg3VSwJLy8gU0hMNjRtaQ0KKyAgICA3MzQwODI5OVUsCS8vIFNITDY0cjENCisgICAgNzM0MDgzMDVVLAkvLyBTSEw2NHJDTA0KKyAgICAyMDM0NjQ0OTFVLAkvLyBTSEw2NHJpDQorICAgIDE3NDQ4Mzg0NjBVLAkvLyBTSEw4bTENCisgICAgMTc0NDgzODQ2NlUsCS8vIFNITDhtQ0wNCisgICAgMTM1NDA1MzcyVSwJLy8gU0hMOG1pDQorICAgIDczNDA4MzE2VSwJLy8gU0hMOHIxDQorICAgIDczNDA4MzIyVSwJLy8gU0hMOHJDTA0KKyAgICAyMDM0NjQ1MDhVLAkvLyBTSEw4cmkNCisgICAgMTM1Mjc0MzE3VSwJLy8gU0hMRDE2bXJDTA0KKyAgICAxMjI2ODQxOTQ1VSwJLy8gU0hMRDE2bXJpOA0KKyAgICAyMDM0NjQ1MjVVLAkvLyBTSExEMTZyckNMDQorICAgIDEzNDQzMTUyMjVVLAkvLyBTSExEMTZycmk4DQorICAgIDEzNTMzOTg3MlUsCS8vIFNITEQzMm1yQ0wNCisgICAgMTIyNjkwNzUwMFUsCS8vIFNITEQzMm1yaTgNCisgICAgMjAzNDY0NTQ0VSwJLy8gU0hMRDMycnJDTA0KKyAgICAxMzQ0MzE1MjQ0VSwJLy8gU0hMRDMycnJpOA0KKyAgICAxMzUzNzI2NTlVLAkvLyBTSExENjRtckNMDQorICAgIDEyMjY5NDAyODdVLAkvLyBTSExENjRtcmk4DQorICAgIDIwMzQ2NDU2M1UsCS8vIFNITEQ2NHJyQ0wNCisgICAgMTM0NDMxNTI2M1UsCS8vIFNITEQ2NHJyaTgNCisgICAgODcyNDIzMzAyVSwJLy8gU0hSMTZtMQ0KKyAgICA4NzI0MjMzMDhVLAkvLyBTSFIxNm1DTA0KKyAgICAxMzUyNzQzNzRVLAkvLyBTSFIxNm1pDQorICAgIDczNDA4MzkwVSwJLy8gU0hSMTZyMQ0KKyAgICA3MzQwODM5NlUsCS8vIFNIUjE2ckNMDQorICAgIDIwMzQ2NDU4MlUsCS8vIFNIUjE2cmkNCisgICAgOTQ1ODIzNjM5VSwJLy8gU0hSMzJtMQ0KKyAgICA5NDU4MjM2NDVVLAkvLyBTSFIzMm1DTA0KKyAgICAxMzUzMzk5MjdVLAkvLyBTSFIzMm1pDQorICAgIDczNDA4NDA3VSwJLy8gU0hSMzJyMQ0KKyAgICA3MzQwODQxM1UsCS8vIFNIUjMyckNMDQorICAgIDIwMzQ2NDU5OVUsCS8vIFNIUjMycmkNCisgICAgMTYxNjkxMjI5NlUsCS8vIFNIUjY0bTENCisgICAgMTYxNjkxMjMwMlUsCS8vIFNIUjY0bUNMDQorICAgIDEzNTM3MjcxMlUsCS8vIFNIUjY0bWkNCisgICAgNzM0MDg0MjRVLAkvLyBTSFI2NHIxDQorICAgIDczNDA4NDMwVSwJLy8gU0hSNjRyQ0wNCisgICAgMjAzNDY0NjE2VSwJLy8gU0hSNjRyaQ0KKyAgICAxNzQ0ODM4NTg1VSwJLy8gU0hSOG0xDQorICAgIDE3NDQ4Mzg1OTFVLAkvLyBTSFI4bUNMDQorICAgIDEzNTQwNTQ5N1UsCS8vIFNIUjhtaQ0KKyAgICA3MzQwODQ0MVUsCS8vIFNIUjhyMQ0KKyAgICA3MzQwODQ0N1UsCS8vIFNIUjhyQ0wNCisgICAgMjAzNDY0NjMzVSwJLy8gU0hSOHJpDQorICAgIDEzNTI3NDQ0MlUsCS8vIFNIUkQxNm1yQ0wNCisgICAgMTIyNjg0MjA3MFUsCS8vIFNIUkQxNm1yaTgNCisgICAgMjAzNDY0NjUwVSwJLy8gU0hSRDE2cnJDTA0KKyAgICAxMzQ0MzE1MzUwVSwJLy8gU0hSRDE2cnJpOA0KKyAgICAxMzUzMzk5OTdVLAkvLyBTSFJEMzJtckNMDQorICAgIDEyMjY5MDc2MjVVLAkvLyBTSFJEMzJtcmk4DQorICAgIDIwMzQ2NDY2OVUsCS8vIFNIUkQzMnJyQ0wNCisgICAgMTM0NDMxNTM2OVUsCS8vIFNIUkQzMnJyaTgNCisgICAgMTM1MzcyNzg0VSwJLy8gU0hSRDY0bXJDTA0KKyAgICAxMjI2OTQwNDEyVSwJLy8gU0hSRDY0bXJpOA0KKyAgICAyMDM0NjQ2ODhVLAkvLyBTSFJENjRyckNMDQorICAgIDEzNDQzMTUzODhVLAkvLyBTSFJENjRycmk4DQorICAgIDEyODc4NTYxMzFVLAkvLyBTSFVGUERybWkNCisgICAgMTM0NDMxNTM5NVUsCS8vIFNIVUZQRHJyaQ0KKyAgICAxMjg3ODU2MTM5VSwJLy8gU0hVRlBTcm1pDQorICAgIDEzNDQzMTU0MDNVLAkvLyBTSFVGUFNycmkNCisgICAgMjI4MTcwOTU4N1UsCS8vIFNJRFRtDQorICAgIDgyMTdVLAkvLyBTSU5fRg0KKyAgICAwVSwJLy8gU0lOX0ZwMzINCisgICAgMFUsCS8vIFNJTl9GcDY0DQorICAgIDBVLAkvLyBTSU5fRnA4MA0KKyAgICA4NzI0MjM0NTRVLAkvLyBTTERUMTZtDQorICAgIDczNDA4NTQyVSwJLy8gU0xEVDE2cg0KKyAgICA4NzI0MjM0NjFVLAkvLyBTTERUNjRtDQorICAgIDczNDA4NTQ5VSwJLy8gU0xEVDY0cg0KKyAgICA4NzI0MjM0NjhVLAkvLyBTTVNXMTZtDQorICAgIDczNDA4NTU2VSwJLy8gU01TVzE2cg0KKyAgICA3MzQwODU2M1UsCS8vIFNNU1czMnINCisgICAgNzM0MDg1NzBVLAkvLyBTTVNXNjRyDQorICAgIDIwODAzODMwNDFVLAkvLyBTUVJUUERtDQorICAgIDIwODAzODMwNDFVLAkvLyBTUVJUUERtX0ludA0KKyAgICAxMTQyOTg4ODY1VSwJLy8gU1FSVFBEcg0KKyAgICAxMTQyOTg4ODY1VSwJLy8gU1FSVFBEcl9JbnQNCisgICAgMjA4MDM4MzA0OVUsCS8vIFNRUlRQU20NCisgICAgMjA4MDM4MzA0OVUsCS8vIFNRUlRQU21fSW50DQorICAgIDExNDI5ODg4NzNVLAkvLyBTUVJUUFNyDQorICAgIDExNDI5ODg4NzNVLAkvLyBTUVJUUFNyX0ludA0KKyAgICAyMTUzNzgzMzc3VSwJLy8gU1FSVFNEbQ0KKyAgICAyMTUzNzgzMzc3VSwJLy8gU1FSVFNEbV9JbnQNCisgICAgMTE0Mjk4ODg4MVUsCS8vIFNRUlRTRHINCisgICAgMTE0Mjk4ODg4MVUsCS8vIFNRUlRTRHJfSW50DQorICAgIDIyMjA4OTIyNDlVLAkvLyBTUVJUU1NtDQorICAgIDIyMjA4OTIyNDlVLAkvLyBTUVJUU1NtX0ludA0KKyAgICAxMTQyOTg4ODg5VSwJLy8gU1FSVFNTcg0KKyAgICAxMTQyOTg4ODg5VSwJLy8gU1FSVFNTcl9JbnQNCisgICAgODI4OVUsCS8vIFNRUlRfRg0KKyAgICAwVSwJLy8gU1FSVF9GcDMyDQorICAgIDBVLAkvLyBTUVJUX0ZwNjQNCisgICAgMFUsCS8vIFNRUlRfRnA4MA0KKyAgICA4Mjk1VSwJLy8gU1NfUFJFRklYDQorICAgIDgyOThVLAkvLyBTVEMNCisgICAgODMwMlUsCS8vIFNURA0KKyAgICA4MzA2VSwJLy8gU1RJDQorICAgIDk0NTgyMzg2MlUsCS8vIFNUTVhDU1INCisgICAgODMxOVUsCS8vIFNUT1NCDQorICAgIDgzMjVVLAkvLyBTVE9TRA0KKyAgICA4MzMxVSwJLy8gU1RPU1ENCisgICAgODMzN1UsCS8vIFNUT1NXDQorICAgIDg3MjQyMzU3NVUsCS8vIFNUUm0NCisgICAgNzM0MDg2NjNVLAkvLyBTVFJyDQorICAgIDczODIwNTg1M1UsCS8vIFNUX0YzMm0NCisgICAgODA1MzE0NzIzVSwJLy8gU1RfRjY0bQ0KKyAgICA3MzgyMDU4NjVVLAkvLyBTVF9GUDMybQ0KKyAgICA4MDUzMTQ3MzZVLAkvLyBTVF9GUDY0bQ0KKyAgICAyNDE1OTI3NDc5VSwJLy8gU1RfRlA4MG0NCisgICAgNzM0MDg3MDJVLAkvLyBTVF9GUHJyDQorICAgIDBVLAkvLyBTVF9GcDMybQ0KKyAgICAwVSwJLy8gU1RfRnA2NG0NCisgICAgMFUsCS8vIFNUX0ZwNjRtMzINCisgICAgMFUsCS8vIFNUX0ZwODBtMzINCisgICAgMFUsCS8vIFNUX0ZwODBtNjQNCisgICAgMFUsCS8vIFNUX0ZwUDMybQ0KKyAgICAwVSwJLy8gU1RfRnBQNjRtDQorICAgIDBVLAkvLyBTVF9GcFA2NG0zMg0KKyAgICAwVSwJLy8gU1RfRnBQODBtDQorICAgIDBVLAkvLyBTVF9GcFA4MG0zMg0KKyAgICAwVSwJLy8gU1RfRnBQODBtNjQNCisgICAgNzM0MDg3MDhVLAkvLyBTVF9GcnINCisgICAgNjcxMTcyNTdVLAkvLyBTVUIxNmkxNg0KKyAgICAxMzUyNzQ2OTdVLAkvLyBTVUIxNm1pDQorICAgIDEzNTI3NDY5N1UsCS8vIFNVQjE2bWk4DQorICAgIDEzNTI3NDY5N1UsCS8vIFNVQjE2bXINCisgICAgMjAzNDY0OTA1VSwJLy8gU1VCMTZyaQ0KKyAgICAyMDM0NjQ5MDVVLAkvLyBTVUIxNnJpOA0KKyAgICAyNzA1NzM3NjlVLAkvLyBTVUIxNnJtDQorICAgIDIwMzQ2NDkwNVUsCS8vIFNVQjE2cnINCisgICAgMjAzNDY0OTA1VSwJLy8gU1VCMTZycl9SRVYNCisgICAgNzAyNjI5OTFVLAkvLyBTVUIzMmkzMg0KKyAgICAxMzUzNDAyMzlVLAkvLyBTVUIzMm1pDQorICAgIDEzNTM0MDIzOVUsCS8vIFNVQjMybWk4DQorICAgIDEzNTM0MDIzOVUsCS8vIFNVQjMybXINCisgICAgMjAzNDY0OTExVSwJLy8gU1VCMzJyaQ0KKyAgICAyMDM0NjQ5MTFVLAkvLyBTVUIzMnJpOA0KKyAgICAzMzc2ODI2MzlVLAkvLyBTVUIzMnJtDQorICAgIDIwMzQ2NDkxMVUsCS8vIFNVQjMycnINCisgICAgMjAzNDY0OTExVSwJLy8gU1VCMzJycl9SRVYNCisgICAgNzEzMTE1NzNVLAkvLyBTVUI2NGkzMg0KKyAgICAxMzUzNzMwMTNVLAkvLyBTVUI2NG1pMzINCisgICAgMTM1MzczMDEzVSwJLy8gU1VCNjRtaTgNCisgICAgMTM1MzczMDEzVSwJLy8gU1VCNjRtcg0KKyAgICAyMDM0NjQ5MTdVLAkvLyBTVUI2NHJpMzINCisgICAgMjAzNDY0OTE3VSwJLy8gU1VCNjRyaTgNCisgICAgNDA0NzkxNTA5VSwJLy8gU1VCNjRybQ0KKyAgICAyMDM0NjQ5MTdVLAkvLyBTVUI2NHJyDQorICAgIDIwMzQ2NDkxN1UsCS8vIFNVQjY0cnJfUkVWDQorICAgIDcyMzYwMTU1VSwJLy8gU1VCOGk4DQorICAgIDEzNTQwNTc4N1UsCS8vIFNVQjhtaQ0KKyAgICAxMzU0MDU3ODdVLAkvLyBTVUI4bXINCisgICAgMjAzNDY0OTIzVSwJLy8gU1VCOHJpDQorICAgIDQ3MTkwMDM3OVUsCS8vIFNVQjhybQ0KKyAgICAyMDM0NjQ5MjNVLAkvLyBTVUI4cnINCisgICAgMjAzNDY0OTIzVSwJLy8gU1VCOHJyX1JFVg0KKyAgICA1MzkwMDkyNDlVLAkvLyBTVUJQRHJtDQorICAgIDIwMzQ2NDkyOVUsCS8vIFNVQlBEcnINCisgICAgNTM5MDA5MjU2VSwJLy8gU1VCUFNybQ0KKyAgICAyMDM0NjQ5MzZVLAkvLyBTVUJQU3JyDQorICAgIDczODIwNTkzNVUsCS8vIFNVQlJfRjMybQ0KKyAgICA4MDUzMTQ4MDdVLAkvLyBTVUJSX0Y2NG0NCisgICAgODcyNDIzNjc5VSwJLy8gU1VCUl9GSTE2bQ0KKyAgICA5NDU4MjQwMDhVLAkvLyBTVUJSX0ZJMzJtDQorICAgIDczNDA4Nzg1VSwJLy8gU1VCUl9GUHJTVDANCisgICAgNzM0MDg3OTJVLAkvLyBTVUJSX0ZTVDByDQorICAgIDBVLAkvLyBTVUJSX0ZwMzJtDQorICAgIDBVLAkvLyBTVUJSX0ZwNjRtDQorICAgIDBVLAkvLyBTVUJSX0ZwNjRtMzINCisgICAgMFUsCS8vIFNVQlJfRnA4MG0zMg0KKyAgICAwVSwJLy8gU1VCUl9GcDgwbTY0DQorICAgIDBVLAkvLyBTVUJSX0ZwSTE2bTMyDQorICAgIDBVLAkvLyBTVUJSX0ZwSTE2bTY0DQorICAgIDBVLAkvLyBTVUJSX0ZwSTE2bTgwDQorICAgIDBVLAkvLyBTVUJSX0ZwSTMybTMyDQorICAgIDBVLAkvLyBTVUJSX0ZwSTMybTY0DQorICAgIDBVLAkvLyBTVUJSX0ZwSTMybTgwDQorICAgIDczNDA4Nzk5VSwJLy8gU1VCUl9GclNUMA0KKyAgICA2MDYxMTgxODlVLAkvLyBTVUJTRHJtDQorICAgIDYwNjExODE4OVUsCS8vIFNVQlNEcm1fSW50DQorICAgIDIwMzQ2NTAwNVUsCS8vIFNVQlNEcnINCisgICAgMjAzNDY1MDA1VSwJLy8gU1VCU0Rycl9JbnQNCisgICAgNjczMjI3MDYwVSwJLy8gU1VCU1NybQ0KKyAgICA2NzMyMjcwNjBVLAkvLyBTVUJTU3JtX0ludA0KKyAgICAyMDM0NjUwMTJVLAkvLyBTVUJTU3JyDQorICAgIDIwMzQ2NTAxMlUsCS8vIFNVQlNTcnJfSW50DQorICAgIDczODIwNjAxMVUsCS8vIFNVQl9GMzJtDQorICAgIDgwNTMxNDg4MlUsCS8vIFNVQl9GNjRtDQorICAgIDg3MjQyMzc1M1UsCS8vIFNVQl9GSTE2bQ0KKyAgICA5NDU4MjQwODFVLAkvLyBTVUJfRkkzMm0NCisgICAgNzM0MDg4NTdVLAkvLyBTVUJfRlByU1QwDQorICAgIDczNDA4ODY1VSwJLy8gU1VCX0ZTVDByDQorICAgIDBVLAkvLyBTVUJfRnAzMg0KKyAgICAwVSwJLy8gU1VCX0ZwMzJtDQorICAgIDBVLAkvLyBTVUJfRnA2NA0KKyAgICAwVSwJLy8gU1VCX0ZwNjRtDQorICAgIDBVLAkvLyBTVUJfRnA2NG0zMg0KKyAgICAwVSwJLy8gU1VCX0ZwODANCisgICAgMFUsCS8vIFNVQl9GcDgwbTMyDQorICAgIDBVLAkvLyBTVUJfRnA4MG02NA0KKyAgICAwVSwJLy8gU1VCX0ZwSTE2bTMyDQorICAgIDBVLAkvLyBTVUJfRnBJMTZtNjQNCisgICAgMFUsCS8vIFNVQl9GcEkxNm04MA0KKyAgICAwVSwJLy8gU1VCX0ZwSTMybTMyDQorICAgIDBVLAkvLyBTVUJfRnBJMzJtNjQNCisgICAgMFUsCS8vIFNVQl9GcEkzMm04MA0KKyAgICA3MzQwODg3MVUsCS8vIFNVQl9GclNUMA0KKyAgICA4NTY2VSwJLy8gU1dBUEdTDQorICAgIDg1NzNVLAkvLyBTWVNDQUxMDQorICAgIDg1ODFVLAkvLyBTWVNFTlRFUg0KKyAgICA4NTkwVSwJLy8gU1lTRVhJVA0KKyAgICA4NTkwVSwJLy8gU1lTRVhJVDY0DQorICAgIDg1OThVLAkvLyBTWVNSRVQNCisgICAgMTcxMDIzMTY3NFUsCS8vIFRBSUxKTVBkDQorICAgIDE3MTAyMzE2NzRVLAkvLyBUQUlMSk1QZDY0DQorICAgIDk3MjAzNDE1MFUsCS8vIFRBSUxKTVBtDQorICAgIDE2NDMxMjI3OTdVLAkvLyBUQUlMSk1QbTY0DQorICAgIDBVLAkvLyBUQUlMSk1Qcg0KKyAgICA5OTYxODkyNVUsCS8vIFRBSUxKTVByNjQNCisgICAgMTcxMTY0NTA4NVUsCS8vIFRDUkVUVVJOZGkNCisgICAgMTcxMTY0NTA4NVUsCS8vIFRDUkVUVVJOZGk2NA0KKyAgICA5NzM2NDQxODlVLAkvLyBUQ1JFVFVSTm1pDQorICAgIDE2NDQ3MzI4MjlVLAkvLyBUQ1JFVFVSTm1pNjQNCisgICAgMTAxMDMyMzQ5VSwJLy8gVENSRVRVUk5yaQ0KKyAgICAxMDEwMzIzNDlVLAkvLyBUQ1JFVFVSTnJpNjQNCisgICAgNjcxMTc0ODFVLAkvLyBURVNUMTZpMTYNCisgICAgMTM1Mjc0OTIxVSwJLy8gVEVTVDE2bWkNCisgICAgMTE0Mjk4OTIyNVUsCS8vIFRFU1QxNnJpDQorICAgIDE0MDkyOTQ3NjFVLAkvLyBURVNUMTZybQ0KKyAgICAxMTQyOTg5MjI1VSwJLy8gVEVTVDE2cnINCisgICAgNzAyNjMyMTZVLAkvLyBURVNUMzJpMzINCisgICAgMTM1MzQwNDY0VSwJLy8gVEVTVDMybWkNCisgICAgMTE0Mjk4OTIzMlUsCS8vIFRFU1QzMnJpDQorICAgIDE0NzY0MDM2MzJVLAkvLyBURVNUMzJybQ0KKyAgICAxMTQyOTg5MjMyVSwJLy8gVEVTVDMycnINCisgICAgNzEzMTE3OTlVLAkvLyBURVNUNjRpMzINCisgICAgMTM1MzczMjM5VSwJLy8gVEVTVDY0bWkzMg0KKyAgICAxMTQyOTg5MjM5VSwJLy8gVEVTVDY0cmkzMg0KKyAgICAxNTQzNTEyNTAzVSwJLy8gVEVTVDY0cm0NCisgICAgMTE0Mjk4OTIzOVUsCS8vIFRFU1Q2NHJyDQorICAgIDcyMzYwMzgyVSwJLy8gVEVTVDhpOA0KKyAgICAxMzU0MDYwMTRVLAkvLyBURVNUOG1pDQorICAgIDExNDI5ODkyNDZVLAkvLyBURVNUOHJpDQorICAgIDE4MTgyMzk0MjJVLAkvLyBURVNUOHJtDQorICAgIDExNDI5ODkyNDZVLAkvLyBURVNUOHJyDQorICAgIDg2NDVVLAkvLyBUTFNDYWxsXzMyDQorICAgIDg2NThVLAkvLyBUTFNDYWxsXzY0DQorICAgIDk3NDEzMTUzMFUsCS8vIFRMU19hZGRyMzINCisgICAgMTY0NjI3Mjk5MVUsCS8vIFRMU19hZGRyNjQNCisgICAgODY4OVUsCS8vIFRSQVANCisgICAgODY5M1UsCS8vIFRTVF9GDQorICAgIDBVLAkvLyBUU1RfRnAzMg0KKyAgICAwVSwJLy8gVFNUX0ZwNjQNCisgICAgMFUsCS8vIFRTVF9GcDgwDQorICAgIDIxNTM3NzkwMjdVLAkvLyBVQ09NSVNEcm0NCisgICAgMTE0Mjk4NDUzMVUsCS8vIFVDT01JU0Rycg0KKyAgICAyMjIwODg3OTAwVSwJLy8gVUNPTUlTU3JtDQorICAgIDExNDI5ODQ1NDBVLAkvLyBVQ09NSVNTcnINCisgICAgNzc2MDMzMjJVLAkvLyBVQ09NX0ZJUHINCisgICAgNzc2MDMzMzFVLAkvLyBVQ09NX0ZJcg0KKyAgICA4NzE1VSwJLy8gVUNPTV9GUFByDQorICAgIDczNDA5MDQzVSwJLy8gVUNPTV9GUHINCisgICAgMFUsCS8vIFVDT01fRnBJcjMyDQorICAgIDBVLAkvLyBVQ09NX0ZwSXI2NA0KKyAgICAwVSwJLy8gVUNPTV9GcElyODANCisgICAgMFUsCS8vIFVDT01fRnByMzINCisgICAgMFUsCS8vIFVDT01fRnByNjQNCisgICAgMFUsCS8vIFVDT01fRnByODANCisgICAgNzM0MDkwNTFVLAkvLyBVQ09NX0ZyDQorICAgIDUzOTAwOTU3MFUsCS8vIFVOUENLSFBEcm0NCisgICAgMjAzNDY1MjUwVSwJLy8gVU5QQ0tIUERycg0KKyAgICA1MzkwMDk1ODBVLAkvLyBVTlBDS0hQU3JtDQorICAgIDIwMzQ2NTI2MFUsCS8vIFVOUENLSFBTcnINCisgICAgNTM5MDA5NTkwVSwJLy8gVU5QQ0tMUERybQ0KKyAgICAyMDM0NjUyNzBVLAkvLyBVTlBDS0xQRHJyDQorICAgIDUzOTAwOTYwMFUsCS8vIFVOUENLTFBTcm0NCisgICAgMjAzNDY1MjgwVSwJLy8gVU5QQ0tMUFNycg0KKyAgICAyNDgzMDM2NzQ2VSwJLy8gVkFERFBEWXJtDQorICAgIDIwOTg4NzgxOFUsCS8vIFZBRERQRFlycg0KKyAgICA1NDU0MzIxMzhVLAkvLyBWQUREUERybQ0KKyAgICAyMDk4ODc4MThVLAkvLyBWQUREUERycg0KKyAgICAyNDgzMDM2NzU0VSwJLy8gVkFERFBTWXJtDQorICAgIDIwOTg4NzgyNlUsCS8vIFZBRERQU1lycg0KKyAgICA1NDU0MzIxNDZVLAkvLyBWQUREUFNybQ0KKyAgICAyMDk4ODc4MjZVLAkvLyBWQUREUFNycg0KKyAgICA2MTI1NDEwMThVLAkvLyBWQUREU0RybQ0KKyAgICA2MTI1NDEwMThVLAkvLyBWQUREU0RybV9JbnQNCisgICAgMjA5ODg3ODM0VSwJLy8gVkFERFNEcnINCisgICAgMjA5ODg3ODM0VSwJLy8gVkFERFNEcnJfSW50DQorICAgIDY3OTY0OTg5MFUsCS8vIFZBRERTU3JtDQorICAgIDY3OTY0OTg5MFUsCS8vIFZBRERTU3JtX0ludA0KKyAgICAyMDk4ODc4NDJVLAkvLyBWQUREU1Nycg0KKyAgICAyMDk4ODc4NDJVLAkvLyBWQUREU1Nycl9JbnQNCisgICAgMjQ4MzAzNjc3OFUsCS8vIFZBRERTVUJQRFlybQ0KKyAgICAyMDk4ODc4NTBVLAkvLyBWQUREU1VCUERZcnINCisgICAgNTQ1NDMyMTcwVSwJLy8gVkFERFNVQlBEcm0NCisgICAgMjA5ODg3ODUwVSwJLy8gVkFERFNVQlBEcnINCisgICAgMjQ4MzAzNjc4OVUsCS8vIFZBRERTVUJQU1lybQ0KKyAgICAyMDk4ODc4NjFVLAkvLyBWQUREU1VCUFNZcnINCisgICAgNTQ1NDMyMTgxVSwJLy8gVkFERFNVQlBTcm0NCisgICAgMjA5ODg3ODYxVSwJLy8gVkFERFNVQlBTcnINCisgICAgMTAxNTE5NDI0MFUsCS8vIFZBRVNERUNMQVNUcm0NCisgICAgMjA5ODg3ODcyVSwJLy8gVkFFU0RFQ0xBU1Rycg0KKyAgICAxMDE1MTk0MjUzVSwJLy8gVkFFU0RFQ3JtDQorICAgIDIwOTg4Nzg4NVUsCS8vIFZBRVNERUNycg0KKyAgICAxMDE1MTk0MjYyVSwJLy8gVkFFU0VOQ0xBU1RybQ0KKyAgICAyMDk4ODc4OTRVLAkvLyBWQUVTRU5DTEFTVHJyDQorICAgIDEwMTUxOTQyNzVVLAkvLyBWQUVTRU5Dcm0NCisgICAgMjA5ODg3OTA3VSwJLy8gVkFFU0VOQ3JyDQorICAgIDEwNzM3NTA3MDBVLAkvLyBWQUVTSU1Dcm0NCisgICAgMTE0Mjk4OTQ4NFUsCS8vIFZBRVNJTUNycg0KKyAgICAxMjE1MzA4NDY5VSwJLy8gVkFFU0tFWUdFTkFTU0lTVDEyOHJtDQorICAgIDIwOTg4NzkyNVUsCS8vIFZBRVNLRVlHRU5BU1NJU1QxMjhycg0KKyAgICAyNDgzMDM2ODcxVSwJLy8gVkFORE5QRFlybQ0KKyAgICAyMDk4ODc5NDNVLAkvLyBWQU5ETlBEWXJyDQorICAgIDU0NTQzMjI2M1UsCS8vIFZBTkROUERybQ0KKyAgICAyMDk4ODc5NDNVLAkvLyBWQU5ETlBEcnINCisgICAgMjQ4MzAzNjg4MFUsCS8vIFZBTkROUFNZcm0NCisgICAgMjA5ODg3OTUyVSwJLy8gVkFORE5QU1lycg0KKyAgICA1NDU0MzIyNzJVLAkvLyBWQU5ETlBTcm0NCisgICAgMjA5ODg3OTUyVSwJLy8gVkFORE5QU3JyDQorICAgIDI0ODMwMzY4ODlVLAkvLyBWQU5EUERZcm0NCisgICAgMjA5ODg3OTYxVSwJLy8gVkFORFBEWXJyDQorICAgIDU0NTQzMjI4MVUsCS8vIFZBTkRQRHJtDQorICAgIDIwOTg4Nzk2MVUsCS8vIFZBTkRQRHJyDQorICAgIDI0ODMwMzY4OTdVLAkvLyBWQU5EUFNZcm0NCisgICAgMjA5ODg3OTY5VSwJLy8gVkFORFBTWXJyDQorICAgIDU0NTQzMjI4OVUsCS8vIFZBTkRQU3JtDQorICAgIDIwOTg4Nzk2OVUsCS8vIFZBTkRQU3JyDQorICAgIDY4NTI2ODI1VSwJLy8gVkFTVEFSVF9TQVZFX1hNTV9SRUdTDQorICAgIDEzMTE3Nzc1MzdVLAkvLyBWQkxFTkRQRFlybWkNCisgICAgMTM1MDczODY4OVUsCS8vIFZCTEVORFBEWXJyaQ0KKyAgICAxMjg0ODc1MDA5VSwJLy8gVkJMRU5EUERybWkNCisgICAgMTM1MDczODY4OVUsCS8vIFZCTEVORFBEcnJpDQorICAgIDEzMTE3Nzc1NDdVLAkvLyBWQkxFTkRQU1lybWkNCisgICAgMTM1MDczODY5OVUsCS8vIFZCTEVORFBTWXJyaQ0KKyAgICAxMjg0ODc1MDE5VSwJLy8gVkJMRU5EUFNybWkNCisgICAgMTM1MDczODY5OVUsCS8vIFZCTEVORFBTcnJpDQorICAgIDEzMTE3Nzc1NTdVLAkvLyBWQkxFTkRWUERZcm0NCisgICAgMTM1MDczODcwOVUsCS8vIFZCTEVORFZQRFlycg0KKyAgICAxMjg0ODc1MDI5VSwJLy8gVkJMRU5EVlBEcm0NCisgICAgMTM1MDczODcwOVUsCS8vIFZCTEVORFZQRHJyDQorICAgIDEzMTE3Nzc1NjhVLAkvLyBWQkxFTkRWUFNZcm0NCisgICAgMTM1MDczODcyMFUsCS8vIFZCTEVORFZQU1lycg0KKyAgICAxMjg0ODc1MDQwVSwJLy8gVkJMRU5EVlBTcm0NCisgICAgMTM1MDczODcyMFUsCS8vIFZCTEVORFZQU3JyDQorICAgIDIwODAzODM3ODdVLAkvLyBWQlJPQURDQVNURjEyOA0KKyAgICAyMTUzNzg0MTIzVSwJLy8gVkJST0FEQ0FTVFNEDQorICAgIDIyMjA4OTMwMDFVLAkvLyBWQlJPQURDQVNUU1MNCisgICAgMjIyMDg5MzAwMVUsCS8vIFZCUk9BRENBU1RTU1kNCisgICAgMTg5MDgxNTg0NVUsCS8vIFZDTVBQRFlybWkNCisgICAgMTI4ODAyMDgyM1UsCS8vIFZDTVBQRFlybWlfYWx0DQorICAgIDE5NTc5NTc0NzdVLAkvLyBWQ01QUERZcnJpDQorICAgIDEzNTA3Mzg3NzVVLAkvLyBWQ01QUERZcnJpX2FsdA0KKyAgICAxODkwODE1ODQ1VSwJLy8gVkNNUFBEcm1pDQorICAgIDEyODgwMjA4MjNVLAkvLyBWQ01QUERybWlfYWx0DQorICAgIDE5NTc5NTc0NzdVLAkvLyBWQ01QUERycmkNCisgICAgMTM1MDczODc3NVUsCS8vIFZDTVBQRHJyaV9hbHQNCisgICAgMTg5MjkxMjk5N1UsCS8vIFZDTVBQU1lybWkNCisgICAgMTI4ODAyMDgzMVUsCS8vIFZDTVBQU1lybWlfYWx0DQorICAgIDE5NjAwNTQ2MjlVLAkvLyBWQ01QUFNZcnJpDQorICAgIDEzNTA3Mzg3ODNVLAkvLyBWQ01QUFNZcnJpX2FsdA0KKyAgICAxODkyOTEyOTk3VSwJLy8gVkNNUFBTcm1pDQorICAgIDEyODgwMjA4MzFVLAkvLyBWQ01QUFNybWlfYWx0DQorICAgIDE5NjAwNTQ2MjlVLAkvLyBWQ01QUFNycmkNCisgICAgMTM1MDczODc4M1UsCS8vIFZDTVBQU3JyaV9hbHQNCisgICAgMTg5NDAyNzEwOVUsCS8vIFZDTVBTRHJtDQorICAgIDEyOTExNjY1NjdVLAkvLyBWQ01QU0RybV9hbHQNCisgICAgMTk2MTEwMzIwNVUsCS8vIFZDTVBTRHJyDQorICAgIDEzNTA3Mzg3OTFVLAkvLyBWQ01QU0Rycl9hbHQNCisgICAgMTg5NjE1NzAyOVUsCS8vIFZDTVBTU3JtDQorICAgIDEyOTMyNjM3MjdVLAkvLyBWQ01QU1NybV9hbHQNCisgICAgMTk2MzIwMDM1N1UsCS8vIFZDTVBTU3JyDQorICAgIDEzNTA3Mzg3OTlVLAkvLyBWQ01QU1Nycl9hbHQNCisgICAgMjA4MDM3ODczMFUsCS8vIFZDT01JU0RybQ0KKyAgICAxMTQyOTg0NTU0VSwJLy8gVkNPTUlTRHJyDQorICAgIDIwODAzNzg3MzlVLAkvLyBWQ09NSVNTcm0NCisgICAgMTE0Mjk4NDU2M1UsCS8vIFZDT01JU1Nycg0KKyAgICAyMDgwMzc4NzQ4VSwJLy8gVkNWVERRMlBEWXJtDQorICAgIDExNDI5ODQ1NzJVLAkvLyBWQ1ZURFEyUERZcnINCisgICAgMjA4MDM3ODc0OFUsCS8vIFZDVlREUTJQRHJtDQorICAgIDExNDI5ODQ1NzJVLAkvLyBWQ1ZURFEyUERycg0KKyAgICAyNTUwMTQwODA3VSwJLy8gVkNWVERRMlBTWXJtDQorICAgIDExNDI5ODQ1ODNVLAkvLyBWQ1ZURFEyUFNZcnINCisgICAgMTA3Mzc0NTc5OVUsCS8vIFZDVlREUTJQU3JtDQorICAgIDExNDI5ODQ1ODNVLAkvLyBWQ1ZURFEyUFNycg0KKyAgICAxMTQyOTg0NTk0VSwJLy8gVkNWVFBEMkRRWHJZcg0KKyAgICAyMDgwMzgzODYzVSwJLy8gVkNWVFBEMkRRWHJtDQorICAgIDExNDI5ODk2ODdVLAkvLyBWQ1ZUUEQyRFFYcnINCisgICAgMjYxNzI1NDc4N1UsCS8vIFZDVlRQRDJEUVlybQ0KKyAgICAxMTQyOTg5Njk5VSwJLy8gVkNWVFBEMkRRWXJyDQorICAgIDExNDI5ODQ1OTRVLAkvLyBWQ1ZUUEQyRFFycg0KKyAgICAxMTQyOTg0NjA1VSwJLy8gVkNWVFBEMlBTWHJZcg0KKyAgICAyMDgwMzgzODg3VSwJLy8gVkNWVFBEMlBTWHJtDQorICAgIDExNDI5ODk3MTFVLAkvLyBWQ1ZUUEQyUFNYcnINCisgICAgMjYxNzI1NDgxMVUsCS8vIFZDVlRQRDJQU1lybQ0KKyAgICAxMTQyOTg5NzIzVSwJLy8gVkNWVFBEMlBTWXJyDQorICAgIDExNDI5ODQ2MDVVLAkvLyBWQ1ZUUEQyUFNycg0KKyAgICAyNjE3MjQ5NzA0VSwJLy8gVkNWVFBTMkRRWXJtDQorICAgIDExNDI5ODQ2MTZVLAkvLyBWQ1ZUUFMyRFFZcnINCisgICAgMjA4MDM3ODc5MlUsCS8vIFZDVlRQUzJEUXJtDQorICAgIDExNDI5ODQ2MTZVLAkvLyBWQ1ZUUFMyRFFycg0KKyAgICAyMDgwMzc4ODAzVSwJLy8gVkNWVFBTMlBEWXJtDQorICAgIDExNDI5ODQ2MjdVLAkvLyBWQ1ZUUFMyUERZcnINCisgICAgMjE1Mzc3OTEyM1UsCS8vIFZDVlRQUzJQRHJtDQorICAgIDExNDI5ODQ2MjdVLAkvLyBWQ1ZUUFMyUERycg0KKyAgICAyMTUzNzc5MTM0VSwJLy8gVkNWVFNEMlNJNjRybQ0KKyAgICAxMTQyOTg0NjM4VSwJLy8gVkNWVFNEMlNJNjRycg0KKyAgICAyMTUzNzc5MTM0VSwJLy8gVkNWVFNEMlNJX2FsdHJtDQorICAgIDExNDI5ODQ2MzhVLAkvLyBWQ1ZUU0QyU0lfYWx0cnINCisgICAgNjEyNTM2MjY1VSwJLy8gVkNWVFNEMlNTcm0NCisgICAgMjA5ODgzMDgxVSwJLy8gVkNWVFNEMlNTcnINCisgICAgNDExMjE0NzU5VSwJLy8gVkNWVFNJMlNENjRybQ0KKyAgICAyMDk4ODgxNjdVLAkvLyBWQ1ZUU0kyU0Q2NHJyDQorICAgIDM0NDEwNTkwN1UsCS8vIFZDVlRTSTJTRExybQ0KKyAgICAyMDk4ODgxNzlVLAkvLyBWQ1ZUU0kyU0RMcnINCisgICAgMzQ0MTAwODIwVSwJLy8gVkNWVFNJMlNEcm0NCisgICAgMjA5ODgzMDkyVSwJLy8gVkNWVFNJMlNEcnINCisgICAgNDExMjE0NzgzVSwJLy8gVkNWVFNJMlNTNjRybQ0KKyAgICAyMDk4ODgxOTFVLAkvLyBWQ1ZUU0kyU1M2NHJyDQorICAgIDM0NDEwMDgzMVUsCS8vIFZDVlRTSTJTU3JtDQorICAgIDIwOTg4MzEwM1UsCS8vIFZDVlRTSTJTU3JyDQorICAgIDY3OTY0NTE2MlUsCS8vIFZDVlRTUzJTRHJtDQorICAgIDIwOTg4MzExNFUsCS8vIFZDVlRTUzJTRHJyDQorICAgIDIyMjA4ODgwNTNVLAkvLyBWQ1ZUU1MyU0k2NHJtDQorICAgIDExNDI5ODQ2OTNVLAkvLyBWQ1ZUU1MyU0k2NHJyDQorICAgIDIyMjA4OTMxMzFVLAkvLyBWQ1ZUU1MyU0lybQ0KKyAgICAxMTQyOTg5NzcxVSwJLy8gVkNWVFNTMlNJcnINCisgICAgMTE0Mjk4NDcwNFUsCS8vIFZDVlRUUEQyRFFYcllyDQorICAgIDIwODAzODM5NTlVLAkvLyBWQ1ZUVFBEMkRRWHJtDQorICAgIDExNDI5ODk3ODNVLAkvLyBWQ1ZUVFBEMkRRWHJyDQorICAgIDI2MTcyNTQ4ODRVLAkvLyBWQ1ZUVFBEMkRRWXJtDQorICAgIDExNDI5ODk3OTZVLAkvLyBWQ1ZUVFBEMkRRWXJyDQorICAgIDExNDI5ODQ3MDRVLAkvLyBWQ1ZUVFBEMkRRcnINCisgICAgMjYxNzI0OTgwNFUsCS8vIFZDVlRUUFMyRFFZcm0NCisgICAgMTE0Mjk4NDcxNlUsCS8vIFZDVlRUUFMyRFFZcnINCisgICAgMjA4MDM3ODg5MlUsCS8vIFZDVlRUUFMyRFFybQ0KKyAgICAxMTQyOTg0NzE2VSwJLy8gVkNWVFRQUzJEUXJyDQorICAgIDIxNTM3ODQzMDVVLAkvLyBWQ1ZUVFNEMlNJNjRybQ0KKyAgICAxMTQyOTg5ODA5VSwJLy8gVkNWVFRTRDJTSTY0cnINCisgICAgMjE1Mzc4NDMwNVUsCS8vIFZDVlRUU0QyU0lybQ0KKyAgICAxMTQyOTg5ODA5VSwJLy8gVkNWVFRTRDJTSXJyDQorICAgIDIyMjA4ODgwODhVLAkvLyBWQ1ZUVFNTMlNJNjRybQ0KKyAgICAxMTQyOTg0NzI4VSwJLy8gVkNWVFRTUzJTSTY0cnINCisgICAgMjIyMDg4ODA4OFUsCS8vIFZDVlRUU1MyU0lybQ0KKyAgICAxMTQyOTg0NzI4VSwJLy8gVkNWVFRTUzJTSXJyDQorICAgIDI0ODMwMzcxODFVLAkvLyBWRElWUERZcm0NCisgICAgMjA5ODg4MjUzVSwJLy8gVkRJVlBEWXJyDQorICAgIDU0NTQzMjU3M1UsCS8vIFZESVZQRHJtDQorICAgIDIwOTg4ODI1M1UsCS8vIFZESVZQRHJyDQorICAgIDI0ODMwMzcxODlVLAkvLyBWRElWUFNZcm0NCisgICAgMjA5ODg4MjYxVSwJLy8gVkRJVlBTWXJyDQorICAgIDU0NTQzMjU4MVUsCS8vIFZESVZQU3JtDQorICAgIDIwOTg4ODI2MVUsCS8vIFZESVZQU3JyDQorICAgIDYxMjU0MTQ1M1UsCS8vIFZESVZTRHJtDQorICAgIDYxMjU0MTQ1M1UsCS8vIFZESVZTRHJtX0ludA0KKyAgICAyMDk4ODgyNjlVLAkvLyBWRElWU0Rycg0KKyAgICAyMDk4ODgyNjlVLAkvLyBWRElWU0Rycl9JbnQNCisgICAgNjc5NjUwMzI1VSwJLy8gVkRJVlNTcm0NCisgICAgNjc5NjUwMzI1VSwJLy8gVkRJVlNTcm1fSW50DQorICAgIDIwOTg4ODI3N1UsCS8vIFZESVZTU3JyDQorICAgIDIwOTg4ODI3N1UsCS8vIFZESVZTU3JyX0ludA0KKyAgICAxMjg0ODc1MjkzVSwJLy8gVkRQUERybWkNCisgICAgMTM1MDczODk3M1UsCS8vIFZEUFBEcnJpDQorICAgIDEzMTE3Nzc4MjhVLAkvLyBWRFBQU1lybWkNCisgICAgMTM1MDczODk4MFUsCS8vIFZEUFBTWXJyaQ0KKyAgICAxMjg0ODc1MzAwVSwJLy8gVkRQUFNybWkNCisgICAgMTM1MDczODk4MFUsCS8vIFZEUFBTcnJpDQorICAgIDg3MjQyNDQ5MVUsCS8vIFZFUlJtDQorICAgIDczNDA5NTc5VSwJLy8gVkVSUnINCisgICAgODcyNDI0NDk3VSwJLy8gVkVSV20NCisgICAgNzM0MDk1ODVVLAkvLyBWRVJXcg0KKyAgICAxMjI3MzAxOTQzVSwJLy8gVkVYVFJBQ1RGMTI4bXINCisgICAgMjA5ODg4MzExVSwJLy8gVkVYVFJBQ1RGMTI4cnINCisgICAgMTIyNzIzNjQyMVUsCS8vIFZFWFRSQUNUUFNtcg0KKyAgICAyMDk4ODgzMjVVLAkvLyBWRVhUUkFDVFBTcnINCisgICAgMjA5ODg4MzM3VSwJLy8gVkVYVFJBQ1RQU3JyNjQNCisgICAgNTQ1NDMyNjcwVSwJLy8gVkZNQUREUERyMTMybQ0KKyAgICAyNDgzMDM3Mjc4VSwJLy8gVkZNQUREUERyMTMybVkNCisgICAgMjA5ODg4MzUwVSwJLy8gVkZNQUREUERyMTMycg0KKyAgICAyMDk4ODgzNTBVLAkvLyBWRk1BRERQRHIxMzJyWQ0KKyAgICA1NDU0MzI2ODNVLAkvLyBWRk1BRERQRHIyMTNtDQorICAgIDI0ODMwMzcyOTFVLAkvLyBWRk1BRERQRHIyMTNtWQ0KKyAgICAyMDk4ODgzNjNVLAkvLyBWRk1BRERQRHIyMTNyDQorICAgIDIwOTg4ODM2M1UsCS8vIFZGTUFERFBEcjIxM3JZDQorICAgIDU0NTQzMjY5NlUsCS8vIFZGTUFERFBEcjIzMW0NCisgICAgMjQ4MzAzNzMwNFUsCS8vIFZGTUFERFBEcjIzMW1ZDQorICAgIDIwOTg4ODM3NlUsCS8vIFZGTUFERFBEcjIzMXINCisgICAgMjA5ODg4Mzc2VSwJLy8gVkZNQUREUERyMjMxclkNCisgICAgNTQ1NDMyNzA5VSwJLy8gVkZNQUREUFNyMTMybQ0KKyAgICAyNDgzMDM3MzE3VSwJLy8gVkZNQUREUFNyMTMybVkNCisgICAgMjA5ODg4Mzg5VSwJLy8gVkZNQUREUFNyMTMycg0KKyAgICAyMDk4ODgzODlVLAkvLyBWRk1BRERQU3IxMzJyWQ0KKyAgICA1NDU0MzI3MjJVLAkvLyBWRk1BRERQU3IyMTNtDQorICAgIDI0ODMwMzczMzBVLAkvLyBWRk1BRERQU3IyMTNtWQ0KKyAgICAyMDk4ODg0MDJVLAkvLyBWRk1BRERQU3IyMTNyDQorICAgIDIwOTg4ODQwMlUsCS8vIFZGTUFERFBTcjIxM3JZDQorICAgIDU0NTQzMjczNVUsCS8vIFZGTUFERFBTcjIzMW0NCisgICAgMjQ4MzAzNzM0M1UsCS8vIFZGTUFERFBTcjIzMW1ZDQorICAgIDIwOTg4ODQxNVUsCS8vIFZGTUFERFBTcjIzMXINCisgICAgMjA5ODg4NDE1VSwJLy8gVkZNQUREUFNyMjMxclkNCisgICAgNTQ1NDMyNzQ4VSwJLy8gVkZNQUREU1VCUERyMTMybQ0KKyAgICAyNDgzMDM3MzU2VSwJLy8gVkZNQUREU1VCUERyMTMybVkNCisgICAgMjA5ODg4NDI4VSwJLy8gVkZNQUREU1VCUERyMTMycg0KKyAgICAyMDk4ODg0MjhVLAkvLyBWRk1BRERTVUJQRHIxMzJyWQ0KKyAgICA1NDU0MzI3NjRVLAkvLyBWRk1BRERTVUJQRHIyMTNtDQorICAgIDI0ODMwMzczNzJVLAkvLyBWRk1BRERTVUJQRHIyMTNtWQ0KKyAgICAyMDk4ODg0NDRVLAkvLyBWRk1BRERTVUJQRHIyMTNyDQorICAgIDIwOTg4ODQ0NFUsCS8vIFZGTUFERFNVQlBEcjIxM3JZDQorICAgIDU0NTQzMjc4MFUsCS8vIFZGTUFERFNVQlBEcjIzMW0NCisgICAgMjQ4MzAzNzM4OFUsCS8vIFZGTUFERFNVQlBEcjIzMW1ZDQorICAgIDIwOTg4ODQ2MFUsCS8vIFZGTUFERFNVQlBEcjIzMXINCisgICAgMjA5ODg4NDYwVSwJLy8gVkZNQUREU1VCUERyMjMxclkNCisgICAgNTQ1NDMyNzk2VSwJLy8gVkZNQUREU1VCUFNyMTMybQ0KKyAgICAyNDgzMDM3NDA0VSwJLy8gVkZNQUREU1VCUFNyMTMybVkNCisgICAgMjA5ODg4NDc2VSwJLy8gVkZNQUREU1VCUFNyMTMycg0KKyAgICAyMDk4ODg0NzZVLAkvLyBWRk1BRERTVUJQU3IxMzJyWQ0KKyAgICA1NDU0MzI4MTJVLAkvLyBWRk1BRERTVUJQU3IyMTNtDQorICAgIDI0ODMwMzc0MjBVLAkvLyBWRk1BRERTVUJQU3IyMTNtWQ0KKyAgICAyMDk4ODg0OTJVLAkvLyBWRk1BRERTVUJQU3IyMTNyDQorICAgIDIwOTg4ODQ5MlUsCS8vIFZGTUFERFNVQlBTcjIxM3JZDQorICAgIDU0NTQzMjgyOFUsCS8vIFZGTUFERFNVQlBTcjIzMW0NCisgICAgMjQ4MzAzNzQzNlUsCS8vIFZGTUFERFNVQlBTcjIzMW1ZDQorICAgIDIwOTg4ODUwOFUsCS8vIFZGTUFERFNVQlBTcjIzMXINCisgICAgMjA5ODg4NTA4VSwJLy8gVkZNQUREU1VCUFNyMjMxclkNCisgICAgNTQ1NDMyODQ0VSwJLy8gVkZNU1VCQUREUERyMTMybQ0KKyAgICAyNDgzMDM3NDUyVSwJLy8gVkZNU1VCQUREUERyMTMybVkNCisgICAgMjA5ODg4NTI0VSwJLy8gVkZNU1VCQUREUERyMTMycg0KKyAgICAyMDk4ODg1MjRVLAkvLyBWRk1TVUJBRERQRHIxMzJyWQ0KKyAgICA1NDU0MzI4NjBVLAkvLyBWRk1TVUJBRERQRHIyMTNtDQorICAgIDI0ODMwMzc0NjhVLAkvLyBWRk1TVUJBRERQRHIyMTNtWQ0KKyAgICAyMDk4ODg1NDBVLAkvLyBWRk1TVUJBRERQRHIyMTNyDQorICAgIDIwOTg4ODU0MFUsCS8vIFZGTVNVQkFERFBEcjIxM3JZDQorICAgIDU0NTQzMjg3NlUsCS8vIFZGTVNVQkFERFBEcjIzMW0NCisgICAgMjQ4MzAzNzQ4NFUsCS8vIFZGTVNVQkFERFBEcjIzMW1ZDQorICAgIDIwOTg4ODU1NlUsCS8vIFZGTVNVQkFERFBEcjIzMXINCisgICAgMjA5ODg4NTU2VSwJLy8gVkZNU1VCQUREUERyMjMxclkNCisgICAgNTQ1NDMyODkyVSwJLy8gVkZNU1VCQUREUFNyMTMybQ0KKyAgICAyNDgzMDM3NTAwVSwJLy8gVkZNU1VCQUREUFNyMTMybVkNCisgICAgMjA5ODg4NTcyVSwJLy8gVkZNU1VCQUREUFNyMTMycg0KKyAgICAyMDk4ODg1NzJVLAkvLyBWRk1TVUJBRERQU3IxMzJyWQ0KKyAgICA1NDU0MzI5MDhVLAkvLyBWRk1TVUJBRERQU3IyMTNtDQorICAgIDI0ODMwMzc1MTZVLAkvLyBWRk1TVUJBRERQU3IyMTNtWQ0KKyAgICAyMDk4ODg1ODhVLAkvLyBWRk1TVUJBRERQU3IyMTNyDQorICAgIDIwOTg4ODU4OFUsCS8vIFZGTVNVQkFERFBTcjIxM3JZDQorICAgIDU0NTQzMjkyNFUsCS8vIFZGTVNVQkFERFBTcjIzMW0NCisgICAgMjQ4MzAzNzUzMlUsCS8vIFZGTVNVQkFERFBTcjIzMW1ZDQorICAgIDIwOTg4ODYwNFUsCS8vIFZGTVNVQkFERFBTcjIzMXINCisgICAgMjA5ODg4NjA0VSwJLy8gVkZNU1VCQUREUFNyMjMxclkNCisgICAgNTQ1NDMyOTQwVSwJLy8gVkZNU1VCUERyMTMybQ0KKyAgICAyNDgzMDM3NTQ4VSwJLy8gVkZNU1VCUERyMTMybVkNCisgICAgMjA5ODg4NjIwVSwJLy8gVkZNU1VCUERyMTMycg0KKyAgICAyMDk4ODg2MjBVLAkvLyBWRk1TVUJQRHIxMzJyWQ0KKyAgICA1NDU0MzI5NTNVLAkvLyBWRk1TVUJQRHIyMTNtDQorICAgIDI0ODMwMzc1NjFVLAkvLyBWRk1TVUJQRHIyMTNtWQ0KKyAgICAyMDk4ODg2MzNVLAkvLyBWRk1TVUJQRHIyMTNyDQorICAgIDIwOTg4ODYzM1UsCS8vIFZGTVNVQlBEcjIxM3JZDQorICAgIDU0NTQzMjk2NlUsCS8vIFZGTVNVQlBEcjIzMW0NCisgICAgMjQ4MzAzNzU3NFUsCS8vIFZGTVNVQlBEcjIzMW1ZDQorICAgIDIwOTg4ODY0NlUsCS8vIFZGTVNVQlBEcjIzMXINCisgICAgMjA5ODg4NjQ2VSwJLy8gVkZNU1VCUERyMjMxclkNCisgICAgNTQ1NDMyOTc5VSwJLy8gVkZNU1VCUFNyMTMybQ0KKyAgICAyNDgzMDM3NTg3VSwJLy8gVkZNU1VCUFNyMTMybVkNCisgICAgMjA5ODg4NjU5VSwJLy8gVkZNU1VCUFNyMTMycg0KKyAgICAyMDk4ODg2NTlVLAkvLyBWRk1TVUJQU3IxMzJyWQ0KKyAgICA1NDU0MzI5OTJVLAkvLyBWRk1TVUJQU3IyMTNtDQorICAgIDI0ODMwMzc2MDBVLAkvLyBWRk1TVUJQU3IyMTNtWQ0KKyAgICAyMDk4ODg2NzJVLAkvLyBWRk1TVUJQU3IyMTNyDQorICAgIDIwOTg4ODY3MlUsCS8vIFZGTVNVQlBTcjIxM3JZDQorICAgIDU0NTQzMzAwNVUsCS8vIFZGTVNVQlBTcjIzMW0NCisgICAgMjQ4MzAzNzYxM1UsCS8vIFZGTVNVQlBTcjIzMW1ZDQorICAgIDIwOTg4ODY4NVUsCS8vIFZGTVNVQlBTcjIzMXINCisgICAgMjA5ODg4Njg1VSwJLy8gVkZNU1VCUFNyMjMxclkNCisgICAgNTQ1NDMzMDE4VSwJLy8gVkZOTUFERFBEcjEzMm0NCisgICAgMjQ4MzAzNzYyNlUsCS8vIFZGTk1BRERQRHIxMzJtWQ0KKyAgICAyMDk4ODg2OThVLAkvLyBWRk5NQUREUERyMTMycg0KKyAgICAyMDk4ODg2OThVLAkvLyBWRk5NQUREUERyMTMyclkNCisgICAgNTQ1NDMzMDMyVSwJLy8gVkZOTUFERFBEcjIxM20NCisgICAgMjQ4MzAzNzY0MFUsCS8vIFZGTk1BRERQRHIyMTNtWQ0KKyAgICAyMDk4ODg3MTJVLAkvLyBWRk5NQUREUERyMjEzcg0KKyAgICAyMDk4ODg3MTJVLAkvLyBWRk5NQUREUERyMjEzclkNCisgICAgNTQ1NDMzMDQ2VSwJLy8gVkZOTUFERFBEcjIzMW0NCisgICAgMjQ4MzAzNzY1NFUsCS8vIFZGTk1BRERQRHIyMzFtWQ0KKyAgICAyMDk4ODg3MjZVLAkvLyBWRk5NQUREUERyMjMxcg0KKyAgICAyMDk4ODg3MjZVLAkvLyBWRk5NQUREUERyMjMxclkNCisgICAgNTQ1NDMzMDYwVSwJLy8gVkZOTUFERFBTcjEzMm0NCisgICAgMjQ4MzAzNzY2OFUsCS8vIFZGTk1BRERQU3IxMzJtWQ0KKyAgICAyMDk4ODg3NDBVLAkvLyBWRk5NQUREUFNyMTMycg0KKyAgICAyMDk4ODg3NDBVLAkvLyBWRk5NQUREUFNyMTMyclkNCisgICAgNTQ1NDMzMDc0VSwJLy8gVkZOTUFERFBTcjIxM20NCisgICAgMjQ4MzAzNzY4MlUsCS8vIFZGTk1BRERQU3IyMTNtWQ0KKyAgICAyMDk4ODg3NTRVLAkvLyBWRk5NQUREUFNyMjEzcg0KKyAgICAyMDk4ODg3NTRVLAkvLyBWRk5NQUREUFNyMjEzclkNCisgICAgNTQ1NDMzMDg4VSwJLy8gVkZOTUFERFBTcjIzMW0NCisgICAgMjQ4MzAzNzY5NlUsCS8vIFZGTk1BRERQU3IyMzFtWQ0KKyAgICAyMDk4ODg3NjhVLAkvLyBWRk5NQUREUFNyMjMxcg0KKyAgICAyMDk4ODg3NjhVLAkvLyBWRk5NQUREUFNyMjMxclkNCisgICAgNTQ1NDMzMTAyVSwJLy8gVkZOTVNVQlBEcjEzMm0NCisgICAgMjQ4MzAzNzcxMFUsCS8vIFZGTk1TVUJQRHIxMzJtWQ0KKyAgICAyMDk4ODg3ODJVLAkvLyBWRk5NU1VCUERyMTMycg0KKyAgICAyMDk4ODg3ODJVLAkvLyBWRk5NU1VCUERyMTMyclkNCisgICAgNTQ1NDMzMTE2VSwJLy8gVkZOTVNVQlBEcjIxM20NCisgICAgMjQ4MzAzNzcyNFUsCS8vIFZGTk1TVUJQRHIyMTNtWQ0KKyAgICAyMDk4ODg3OTZVLAkvLyBWRk5NU1VCUERyMjEzcg0KKyAgICAyMDk4ODg3OTZVLAkvLyBWRk5NU1VCUERyMjEzclkNCisgICAgNTQ1NDMzMTMwVSwJLy8gVkZOTVNVQlBEcjIzMW0NCisgICAgMjQ4MzAzNzczOFUsCS8vIFZGTk1TVUJQRHIyMzFtWQ0KKyAgICAyMDk4ODg4MTBVLAkvLyBWRk5NU1VCUERyMjMxcg0KKyAgICAyMDk4ODg4MTBVLAkvLyBWRk5NU1VCUERyMjMxclkNCisgICAgNTQ1NDMzMTQ0VSwJLy8gVkZOTVNVQlBTcjEzMm0NCisgICAgMjQ4MzAzNzc1MlUsCS8vIFZGTk1TVUJQU3IxMzJtWQ0KKyAgICAyMDk4ODg4MjRVLAkvLyBWRk5NU1VCUFNyMTMycg0KKyAgICAyMDk4ODg4MjRVLAkvLyBWRk5NU1VCUFNyMTMyclkNCisgICAgNTQ1NDMzMTU4VSwJLy8gVkZOTVNVQlBTcjIxM20NCisgICAgMjQ4MzAzNzc2NlUsCS8vIFZGTk1TVUJQU3IyMTNtWQ0KKyAgICAyMDk4ODg4MzhVLAkvLyBWRk5NU1VCUFNyMjEzcg0KKyAgICAyMDk4ODg4MzhVLAkvLyBWRk5NU1VCUFNyMjEzclkNCisgICAgNTQ1NDMzMTcyVSwJLy8gVkZOTVNVQlBTcjIzMW0NCisgICAgMjQ4MzAzNzc4MFUsCS8vIFZGTk1TVUJQU3IyMzFtWQ0KKyAgICAyMDk4ODg4NTJVLAkvLyBWRk5NU1VCUFNyMjMxcg0KKyAgICAyMDk4ODg4NTJVLAkvLyBWRk5NU1VCUFNyMjMxclkNCisgICAgNTQ1NDMyMjYzVSwJLy8gVkZzQU5ETlBEcm0NCisgICAgMjA5ODg3OTQzVSwJLy8gVkZzQU5ETlBEcnINCisgICAgNTQ1NDMyMjcyVSwJLy8gVkZzQU5ETlBTcm0NCisgICAgMjA5ODg3OTUyVSwJLy8gVkZzQU5ETlBTcnINCisgICAgNTQ1NDMyMjgxVSwJLy8gVkZzQU5EUERybQ0KKyAgICAyMDk4ODc5NjFVLAkvLyBWRnNBTkRQRHJyDQorICAgIDU0NTQzMjI4OVUsCS8vIFZGc0FORFBTcm0NCisgICAgMjA5ODg3OTY5VSwJLy8gVkZzQU5EUFNycg0KKyAgICA1NDU0MzMxODZVLAkvLyBWRnNPUlBEcm0NCisgICAgMjA5ODg4ODY2VSwJLy8gVkZzT1JQRHJyDQorICAgIDU0NTQzMzE5M1UsCS8vIFZGc09SUFNybQ0KKyAgICAyMDk4ODg4NzNVLAkvLyBWRnNPUlBTcnINCisgICAgNTQ1NDMzMjAwVSwJLy8gVkZzWE9SUERybQ0KKyAgICAyMDk4ODg4ODBVLAkvLyBWRnNYT1JQRHJyDQorICAgIDU0NTQzMzIwOFUsCS8vIFZGc1hPUlBTcm0NCisgICAgMjA5ODg4ODg4VSwJLy8gVkZzWE9SUFNycg0KKyAgICAyNDgzMDM3ODI0VSwJLy8gVkhBRERQRFlybQ0KKyAgICAyMDk4ODg4OTZVLAkvLyBWSEFERFBEWXJyDQorICAgIDU0NTQzMzIxNlUsCS8vIFZIQUREUERybQ0KKyAgICAyMDk4ODg4OTZVLAkvLyBWSEFERFBEcnINCisgICAgMjQ4MzAzNzgzM1UsCS8vIFZIQUREUFNZcm0NCisgICAgMjA5ODg4OTA1VSwJLy8gVkhBRERQU1lycg0KKyAgICA1NDU0MzMyMjVVLAkvLyBWSEFERFBTcm0NCisgICAgMjA5ODg4OTA1VSwJLy8gVkhBRERQU3JyDQorICAgIDI0ODMwMzc4NDJVLAkvLyBWSFNVQlBEWXJtDQorICAgIDIwOTg4ODkxNFUsCS8vIFZIU1VCUERZcnINCisgICAgNTQ1NDMzMjM0VSwJLy8gVkhTVUJQRHJtDQorICAgIDIwOTg4ODkxNFUsCS8vIFZIU1VCUERycg0KKyAgICAyNDgzMDM3ODUxVSwJLy8gVkhTVUJQU1lybQ0KKyAgICAyMDk4ODg5MjNVLAkvLyBWSFNVQlBTWXJyDQorICAgIDU0NTQzMzI0M1UsCS8vIFZIU1VCUFNybQ0KKyAgICAyMDk4ODg5MjNVLAkvLyBWSFNVQlBTcnINCisgICAgMTI4ODAyMTY2OFUsCS8vIFZJTlNFUlRGMTI4cm0NCisgICAgMTM1MDczOTYyMFUsCS8vIFZJTlNFUlRGMTI4cnINCisgICAgMTI5MzI2NDU2MVUsCS8vIFZJTlNFUlRQU3JtDQorICAgIDEzNTA3Mzk2MzNVLAkvLyBWSU5TRVJUUFNycg0KKyAgICAyNTUwMTQ2NzQ4VSwJLy8gVkxERFFVWXJtDQorICAgIDEwNzM3NTE3NDBVLAkvLyBWTEREUVVybQ0KKyAgICA5NDU4MjU0NzZVLAkvLyBWTERNWENTUg0KKyAgICAxMTQyOTkwNTQyVSwJLy8gVk1BU0tNT1ZEUVUNCisgICAgMTE0Mjk5MDU0MlUsCS8vIFZNQVNLTU9WRFFVNjQNCisgICAgMTIyNzQzMzY5MVUsCS8vIFZNQVNLTU9WUERZbXINCisgICAgMjQ4MzAzNzkxNVUsCS8vIFZNQVNLTU9WUERZcm0NCisgICAgMTIyNzMwMjYxOVUsCS8vIFZNQVNLTU9WUERtcg0KKyAgICA1NDU0MzMzMDdVLAkvLyBWTUFTS01PVlBEcm0NCisgICAgMTIyNzQzMzcwM1UsCS8vIFZNQVNLTU9WUFNZbXINCisgICAgMjQ4MzAzNzkyN1UsCS8vIFZNQVNLTU9WUFNZcm0NCisgICAgMTIyNzMwMjYzMVUsCS8vIFZNQVNLTU9WUFNtcg0KKyAgICA1NDU0MzMzMTlVLAkvLyBWTUFTS01PVlBTcm0NCisgICAgMjQ4MzAzNzkzOVUsCS8vIFZNQVhQRFlybQ0KKyAgICAyNDgzMDM3OTM5VSwJLy8gVk1BWFBEWXJtX0ludA0KKyAgICAyMDk4ODkwMTFVLAkvLyBWTUFYUERZcnINCisgICAgMjA5ODg5MDExVSwJLy8gVk1BWFBEWXJyX0ludA0KKyAgICA1NDU0MzMzMzFVLAkvLyBWTUFYUERybQ0KKyAgICA1NDU0MzMzMzFVLAkvLyBWTUFYUERybV9JbnQNCisgICAgMjA5ODg5MDExVSwJLy8gVk1BWFBEcnINCisgICAgMjA5ODg5MDExVSwJLy8gVk1BWFBEcnJfSW50DQorICAgIDI0ODMwMzc5NDdVLAkvLyBWTUFYUFNZcm0NCisgICAgMjQ4MzAzNzk0N1UsCS8vIFZNQVhQU1lybV9JbnQNCisgICAgMjA5ODg5MDE5VSwJLy8gVk1BWFBTWXJyDQorICAgIDIwOTg4OTAxOVUsCS8vIFZNQVhQU1lycl9JbnQNCisgICAgNTQ1NDMzMzM5VSwJLy8gVk1BWFBTcm0NCisgICAgNTQ1NDMzMzM5VSwJLy8gVk1BWFBTcm1fSW50DQorICAgIDIwOTg4OTAxOVUsCS8vIFZNQVhQU3JyDQorICAgIDIwOTg4OTAxOVUsCS8vIFZNQVhQU3JyX0ludA0KKyAgICA2MTI1NDIyMTFVLAkvLyBWTUFYU0RybQ0KKyAgICA2MTI1NDIyMTFVLAkvLyBWTUFYU0RybV9JbnQNCisgICAgMjA5ODg5MDI3VSwJLy8gVk1BWFNEcnINCisgICAgMjA5ODg5MDI3VSwJLy8gVk1BWFNEcnJfSW50DQorICAgIDY3OTY1MTA4M1UsCS8vIFZNQVhTU3JtDQorICAgIDY3OTY1MTA4M1UsCS8vIFZNQVhTU3JtX0ludA0KKyAgICAyMDk4ODkwMzVVLAkvLyBWTUFYU1Nycg0KKyAgICAyMDk4ODkwMzVVLAkvLyBWTUFYU1Nycl9JbnQNCisgICAgMTAwMDNVLAkvLyBWTUNBTEwNCisgICAgMTYxNjkxNDIwMlUsCS8vIFZNQ0xFQVJtDQorICAgIDI0ODMwMzc5ODdVLAkvLyBWTUlOUERZcm0NCisgICAgMjQ4MzAzNzk4N1UsCS8vIFZNSU5QRFlybV9JbnQNCisgICAgMjA5ODg5MDU5VSwJLy8gVk1JTlBEWXJyDQorICAgIDIwOTg4OTA1OVUsCS8vIFZNSU5QRFlycl9JbnQNCisgICAgNTQ1NDMzMzc5VSwJLy8gVk1JTlBEcm0NCisgICAgNTQ1NDMzMzc5VSwJLy8gVk1JTlBEcm1fSW50DQorICAgIDIwOTg4OTA1OVUsCS8vIFZNSU5QRHJyDQorICAgIDIwOTg4OTA1OVUsCS8vIFZNSU5QRHJyX0ludA0KKyAgICAyNDgzMDM3OTk1VSwJLy8gVk1JTlBTWXJtDQorICAgIDI0ODMwMzc5OTVVLAkvLyBWTUlOUFNZcm1fSW50DQorICAgIDIwOTg4OTA2N1UsCS8vIFZNSU5QU1lycg0KKyAgICAyMDk4ODkwNjdVLAkvLyBWTUlOUFNZcnJfSW50DQorICAgIDU0NTQzMzM4N1UsCS8vIFZNSU5QU3JtDQorICAgIDU0NTQzMzM4N1UsCS8vIFZNSU5QU3JtX0ludA0KKyAgICAyMDk4ODkwNjdVLAkvLyBWTUlOUFNycg0KKyAgICAyMDk4ODkwNjdVLAkvLyBWTUlOUFNycl9JbnQNCisgICAgNjEyNTQyMjU5VSwJLy8gVk1JTlNEcm0NCisgICAgNjEyNTQyMjU5VSwJLy8gVk1JTlNEcm1fSW50DQorICAgIDIwOTg4OTA3NVUsCS8vIFZNSU5TRHJyDQorICAgIDIwOTg4OTA3NVUsCS8vIFZNSU5TRHJyX0ludA0KKyAgICA2Nzk2NTExMzFVLAkvLyBWTUlOU1NybQ0KKyAgICA2Nzk2NTExMzFVLAkvLyBWTUlOU1NybV9JbnQNCisgICAgMjA5ODg5MDgzVSwJLy8gVk1JTlNTcnINCisgICAgMjA5ODg5MDgzVSwJLy8gVk1JTlNTcnJfSW50DQorICAgIDEwMDUxVSwJLy8gVk1MQVVOQ0gNCisgICAgMTM1ODY2MTg4VSwJLy8gVk1PVkFQRFltcg0KKyAgICAyNjE3MjU1NzU2VSwJLy8gVk1PVkFQRFlybQ0KKyAgICAxMTQyOTkwNjY4VSwJLy8gVk1PVkFQRFlycg0KKyAgICAxMzU3MzUxMTZVLAkvLyBWTU9WQVBEbXINCisgICAgMjA4MDM4NDg0NFUsCS8vIFZNT1ZBUERybQ0KKyAgICAxMTQyOTkwNjY4VSwJLy8gVk1PVkFQRHJyDQorICAgIDEzNTg2NjE5N1UsCS8vIFZNT1ZBUFNZbXINCisgICAgMjYxNzI1NTc2NVUsCS8vIFZNT1ZBUFNZcm0NCisgICAgMTE0Mjk5MDY3N1UsCS8vIFZNT1ZBUFNZcnINCisgICAgMTM1NzM1MTI1VSwJLy8gVk1PVkFQU21yDQorICAgIDIwODAzODQ4NTNVLAkvLyBWTU9WQVBTcm0NCisgICAgMTE0Mjk5MDY3N1UsCS8vIFZNT1ZBUFNycg0KKyAgICAyNjE3MjU1Nzc0VSwJLy8gVk1PVkREVVBZcm0NCisgICAgMTE0Mjk5MDY4NlUsCS8vIFZNT1ZERFVQWXJyDQorICAgIDIxNTM3ODUxODJVLAkvLyBWTU9WRERVUHJtDQorICAgIDExNDI5OTA2ODZVLAkvLyBWTU9WRERVUHJyDQorICAgIDE0NzY0MDUwOTZVLAkvLyBWTU9WREkyUERJcm0NCisgICAgMTE0Mjk5MDY5NlUsCS8vIFZNT1ZESTJQRElycg0KKyAgICAxNDc2NDA1MDk2VSwJLy8gVk1PVkRJMlNTcm0NCisgICAgMTE0Mjk5MDY5NlUsCS8vIFZNT1ZESTJTU3JyDQorICAgIDEzNTg5ODk5MVUsCS8vIFZNT1ZEUUFZbXINCisgICAgMjU1MDE0NjkyN1UsCS8vIFZNT1ZEUUFZcm0NCisgICAgMTE0Mjk5MDcwM1UsCS8vIFZNT1ZEUUFZcnINCisgICAgMTM1NzY3OTE5VSwJLy8gVk1PVkRRQW1yDQorICAgIDEwNzM3NTE5MTlVLAkvLyBWTU9WRFFBcm0NCisgICAgMTE0Mjk5MDcwM1UsCS8vIFZNT1ZEUUFycg0KKyAgICAxMzU4OTkwMDBVLAkvLyBWTU9WRFFVWW1yDQorICAgIDI1NTAxNDY5MzZVLAkvLyBWTU9WRFFVWXJtDQorICAgIDExNDI5OTA3MTJVLAkvLyBWTU9WRFFVWXJyDQorICAgIDEzNTc2NzkyOFUsCS8vIFZNT1ZEUVVtcg0KKyAgICAxMzU3Njc5MjhVLAkvLyBWTU9WRFFVbXJfSW50DQorICAgIDEwNzM3NTE5MjhVLAkvLyBWTU9WRFFVcm0NCisgICAgMTA3Mzc1MTkyOFUsCS8vIFZNT1ZEUVVybV9JbnQNCisgICAgMTE0Mjk5MDcxMlUsCS8vIFZNT1ZEUVVycg0KKyAgICAyMDk4ODkxNTNVLAkvLyBWTU9WSExQU3JyDQorICAgIDEzNTgwMDcxNVUsCS8vIFZNT1ZIUERtcg0KKyAgICA2MTI1NDIzNDdVLAkvLyBWTU9WSFBEcm0NCisgICAgMTM1ODAwNzI0VSwJLy8gVk1PVkhQU21yDQorICAgIDYxMjU0MjM1NlUsCS8vIFZNT1ZIUFNybQ0KKyAgICAyMDk4ODkxODFVLAkvLyBWTU9WTEhQU3JyDQorICAgIDEzNTgwMDc0M1UsCS8vIFZNT1ZMUERtcg0KKyAgICA2MTI1NDIzNzVVLAkvLyBWTU9WTFBEcm0NCisgICAgMTM1ODAwNzUyVSwJLy8gVk1PVkxQU21yDQorICAgIDYxMjU0MjM4NFUsCS8vIFZNT1ZMUFNybQ0KKyAgICAxMzUzNzQ3NzdVLAkvLyBWTU9WTFExMjhtcg0KKyAgICAxMTQyOTkwNzg0VSwJLy8gVk1PVk1TS1BEWXI2NHINCisgICAgMTE0Mjk5MDc4NFUsCS8vIFZNT1ZNU0tQRFlycg0KKyAgICAxMTQyOTkwNzg0VSwJLy8gVk1PVk1TS1BEcjY0cg0KKyAgICAxMTQyOTkwNzg0VSwJLy8gVk1PVk1TS1BEcnINCisgICAgMTE0Mjk5MDc5NVUsCS8vIFZNT1ZNU0tQU1lyNjRyDQorICAgIDExNDI5OTA3OTVVLAkvLyBWTU9WTVNLUFNZcnINCisgICAgMTE0Mjk5MDc5NVUsCS8vIFZNT1ZNU0tQU3I2NHINCisgICAgMTE0Mjk5MDc5NVUsCS8vIFZNT1ZNU0tQU3JyDQorICAgIDEwNzM3NTIwMjJVLAkvLyBWTU9WTlREUUFybQ0KKyAgICAxMzU4NjYzMzdVLAkvLyBWTU9WTlREUVlfNjRtcg0KKyAgICAxMzU4NjYzMzdVLAkvLyBWTU9WTlREUVltcg0KKyAgICAxMzU3MzUyNjVVLAkvLyBWTU9WTlREUV82NG1yDQorICAgIDEzNTczNTI2NVUsCS8vIFZNT1ZOVERRbXINCisgICAgMTM1NzM1MjY1VSwJLy8gVk1PVk5URFFtcl9JbnQNCisgICAgMTM1ODY2MzQ3VSwJLy8gVk1PVk5UUERZbXINCisgICAgMTM1NzM1Mjc1VSwJLy8gVk1PVk5UUERtcg0KKyAgICAxMzU3NjgwNDNVLAkvLyBWTU9WTlRQRG1yX0ludA0KKyAgICAxMzU4NjYzNTdVLAkvLyBWTU9WTlRQU1ltcg0KKyAgICAxMzU3MzUyODVVLAkvLyBWTU9WTlRQU21yDQorICAgIDEzNTc2ODA1M1UsCS8vIFZNT1ZOVFBTbXJfSW50DQorICAgIDEzNTM0MTkyOFUsCS8vIFZNT1ZQREkyREltcg0KKyAgICAxMTQyOTkwNjk2VSwJLy8gVk1PVlBESTJESXJyDQorICAgIDEzNTM3NDc3N1UsCS8vIFZNT1ZQUUkyUUltcg0KKyAgICAxNTQzNTE0MDQxVSwJLy8gVk1PVlFJMlBRSXJtDQorICAgIDExNDI5OTA3NzdVLAkvLyBWTU9WUWQ2NHJyDQorICAgIDExNDI5OTA2OTZVLAkvLyBWTU9WUWQ2NHJyX2FsdA0KKyAgICAxMTQyOTkwNzc3VSwJLy8gVk1PVlFzNjRycg0KKyAgICAxMTQyOTkwNzc3VSwJLy8gVk1PVlF4cnhyDQorICAgIDEzNTgwMDgzMVUsCS8vIFZNT1ZTRG1yDQorICAgIDIxNTM3ODUzNDNVLAkvLyBWTU9WU0RybQ0KKyAgICAyMDk4ODkyNzlVLAkvLyBWTU9WU0Rycg0KKyAgICAyNjE3MjU1OTQzVSwJLy8gVk1PVlNIRFVQWXJtDQorICAgIDExNDI5OTA4NTVVLAkvLyBWTU9WU0hEVVBZcnINCisgICAgMjA4MDM4NTAzMVUsCS8vIFZNT1ZTSERVUHJtDQorICAgIDExNDI5OTA4NTVVLAkvLyBWTU9WU0hEVVBycg0KKyAgICAyNjE3MjU1OTU0VSwJLy8gVk1PVlNMRFVQWXJtDQorICAgIDExNDI5OTA4NjZVLAkvLyBWTU9WU0xEVVBZcnINCisgICAgMjA4MDM4NTA0MlUsCS8vIFZNT1ZTTERVUHJtDQorICAgIDExNDI5OTA4NjZVLAkvLyBWTU9WU0xEVVBycg0KKyAgICAxMzUzNDE5MjhVLAkvLyBWTU9WU1MyREltcg0KKyAgICAxMTQyOTkwNjk2VSwJLy8gVk1PVlNTMkRJcnINCisgICAgMTM1NjY5Nzg5VSwJLy8gVk1PVlNTbXINCisgICAgMjIyMDg5NDIzN1UsCS8vIFZNT1ZTU3JtDQorICAgIDIwOTg4OTMwOVUsCS8vIFZNT1ZTU3JyDQorICAgIDEzNTg2NjQwNVUsCS8vIFZNT1ZVUERZbXINCisgICAgMjYxNzI1NTk3M1UsCS8vIFZNT1ZVUERZcm0NCisgICAgMTE0Mjk5MDg4NVUsCS8vIFZNT1ZVUERZcnINCisgICAgMTM1NzM1MzMzVSwJLy8gVk1PVlVQRG1yDQorICAgIDEzNTczNTMzM1UsCS8vIFZNT1ZVUERtcl9JbnQNCisgICAgMjA4MDM4NTA2MVUsCS8vIFZNT1ZVUERybQ0KKyAgICAyMDgwMzg1MDYxVSwJLy8gVk1PVlVQRHJtX0ludA0KKyAgICAxMTQyOTkwODg1VSwJLy8gVk1PVlVQRHJyDQorICAgIDEzNTg2NjQxNFUsCS8vIFZNT1ZVUFNZbXINCisgICAgMjYxNzI1NTk4MlUsCS8vIFZNT1ZVUFNZcm0NCisgICAgMTE0Mjk5MDg5NFUsCS8vIFZNT1ZVUFNZcnINCisgICAgMTM1NzM1MzQyVSwJLy8gVk1PVlVQU21yDQorICAgIDEzNTczNTM0MlUsCS8vIFZNT1ZVUFNtcl9JbnQNCisgICAgMjA4MDM4NTA3MFUsCS8vIFZNT1ZVUFNybQ0KKyAgICAyMDgwMzg1MDcwVSwJLy8gVk1PVlVQU3JtX0ludA0KKyAgICAxMTQyOTkwODk0VSwJLy8gVk1PVlVQU3JyDQorICAgIDE0NzY0MDUwOTZVLAkvLyBWTU9WWkRJMlBESXJtDQorICAgIDExNDI5OTA2OTZVLAkvLyBWTU9WWkRJMlBESXJyDQorICAgIDEwNzM3NTE5OTNVLAkvLyBWTU9WWlBRSUxvMlBRSXJtDQorICAgIDExNDI5OTA3NzdVLAkvLyBWTU9WWlBRSUxvMlBRSXJyDQorICAgIDE1NDM1MTQwNDFVLAkvLyBWTU9WWlFJMlBRSXJtDQorICAgIDExNDI5OTA2OTZVLAkvLyBWTU9WWlFJMlBRSXJyDQorICAgIDEyODQ4NzYzNDNVLAkvLyBWTVBTQURCV3JtaQ0KKyAgICAxMzUwNzQwMDIzVSwJLy8gVk1QU0FEQldycmkNCisgICAgMTYxNjkxNDQ5N1UsCS8vIFZNUFRSTERtDQorICAgIDE2MTY5MTQ1MDZVLAkvLyBWTVBUUlNUbQ0KKyAgICAxMzUzNDIxNjNVLAkvLyBWTVJFQUQzMnJtDQorICAgIDExNDI5OTA5MzFVLAkvLyBWTVJFQUQzMnJyDQorICAgIDEzNTM3NDk0MFUsCS8vIFZNUkVBRDY0cm0NCisgICAgMTE0Mjk5MDk0MFUsCS8vIFZNUkVBRDY0cnINCisgICAgMTAzNDFVLAkvLyBWTVJFU1VNRQ0KKyAgICAyNDgzMDM4MzE4VSwJLy8gVk1VTFBEWXJtDQorICAgIDIwOTg4OTM5MFUsCS8vIFZNVUxQRFlycg0KKyAgICA1NDU0MzM3MTBVLAkvLyBWTVVMUERybQ0KKyAgICAyMDk4ODkzOTBVLAkvLyBWTVVMUERycg0KKyAgICAyNDgzMDM4MzI2VSwJLy8gVk1VTFBTWXJtDQorICAgIDIwOTg4OTM5OFUsCS8vIFZNVUxQU1lycg0KKyAgICA1NDU0MzM3MThVLAkvLyBWTVVMUFNybQ0KKyAgICAyMDk4ODkzOThVLAkvLyBWTVVMUFNycg0KKyAgICA2MTI1NDI1OTBVLAkvLyBWTVVMU0RybQ0KKyAgICA2MTI1NDI1OTBVLAkvLyBWTVVMU0RybV9JbnQNCisgICAgMjA5ODg5NDA2VSwJLy8gVk1VTFNEcnINCisgICAgMjA5ODg5NDA2VSwJLy8gVk1VTFNEcnJfSW50DQorICAgIDY3OTY1MTQ2MlUsCS8vIFZNVUxTU3JtDQorICAgIDY3OTY1MTQ2MlUsCS8vIFZNVUxTU3JtX0ludA0KKyAgICAyMDk4ODk0MTRVLAkvLyBWTVVMU1Nycg0KKyAgICAyMDk4ODk0MTRVLAkvLyBWTVVMU1Nycl9JbnQNCisgICAgMTQ3NjQwNTM5MFUsCS8vIFZNV1JJVEUzMnJtDQorICAgIDExNDI5OTA5OTBVLAkvLyBWTVdSSVRFMzJycg0KKyAgICAxNTQzNTE0MjY0VSwJLy8gVk1XUklURTY0cm0NCisgICAgMTE0Mjk5MTAwMFUsCS8vIFZNV1JJVEU2NHJyDQorICAgIDEwNDAyVSwJLy8gVk1YT0ZGDQorICAgIDE2MTY5MTQ2MDFVLAkvLyBWTVhPTg0KKyAgICAyNDgzMDM3Nzk0VSwJLy8gVk9SUERZcm0NCisgICAgMjA5ODg4ODY2VSwJLy8gVk9SUERZcnINCisgICAgNTQ1NDMzMTg2VSwJLy8gVk9SUERybQ0KKyAgICAyMDk4ODg4NjZVLAkvLyBWT1JQRHJyDQorICAgIDI0ODMwMzc4MDFVLAkvLyBWT1JQU1lybQ0KKyAgICAyMDk4ODg4NzNVLAkvLyBWT1JQU1lycg0KKyAgICA1NDU0MzMxOTNVLAkvLyBWT1JQU3JtDQorICAgIDIwOTg4ODg3M1UsCS8vIFZPUlBTcnINCisgICAgMTA3Mzc1MjI0MFUsCS8vIFZQQUJTQnJtMTI4DQorICAgIDE1NDM1MTQyODhVLAkvLyBWUEFCU0JybTY0DQorICAgIDExNDI5OTEwMjRVLAkvLyBWUEFCU0JycjEyOA0KKyAgICAxMTQyOTkxMDI0VSwJLy8gVlBBQlNCcnI2NA0KKyAgICAxMDczNzUyMjQ4VSwJLy8gVlBBQlNEcm0xMjgNCisgICAgMTU0MzUxNDI5NlUsCS8vIFZQQUJTRHJtNjQNCisgICAgMTE0Mjk5MTAzMlUsCS8vIFZQQUJTRHJyMTI4DQorICAgIDExNDI5OTEwMzJVLAkvLyBWUEFCU0RycjY0DQorICAgIDEwNzM3NTIyNTZVLAkvLyBWUEFCU1dybTEyOA0KKyAgICAxNTQzNTE0MzA0VSwJLy8gVlBBQlNXcm02NA0KKyAgICAxMTQyOTkxMDQwVSwJLy8gVlBBQlNXcnIxMjgNCisgICAgMTE0Mjk5MTA0MFUsCS8vIFZQQUJTV3JyNjQNCisgICAgMTAxNTE5NTg0OFUsCS8vIFZQQUNLU1NEV3JtDQorICAgIDIwOTg4OTQ4MFUsCS8vIFZQQUNLU1NEV3JyDQorICAgIDEwMTUxOTU4NTlVLAkvLyBWUEFDS1NTV0JybQ0KKyAgICAyMDk4ODk0OTFVLAkvLyBWUEFDS1NTV0Jycg0KKyAgICAxMDE1MTk1ODcwVSwJLy8gVlBBQ0tVU0RXcm0NCisgICAgMjA5ODg5NTAyVSwJLy8gVlBBQ0tVU0RXcnINCisgICAgMTAxNTE5NTg4MVUsCS8vIFZQQUNLVVNXQnJtDQorICAgIDIwOTg4OTUxM1UsCS8vIFZQQUNLVVNXQnJyDQorICAgIDEwMTUxOTU4OTJVLAkvLyBWUEFEREJybQ0KKyAgICAyMDk4ODk1MjRVLAkvLyBWUEFEREJycg0KKyAgICAxMDE1MTk1OTAwVSwJLy8gVlBBREREcm0NCisgICAgMjA5ODg5NTMyVSwJLy8gVlBBREREcnINCisgICAgMTAxNTE5NTkwOFUsCS8vIFZQQUREUXJtDQorICAgIDIwOTg4OTU0MFUsCS8vIFZQQUREUXJyDQorICAgIDEwMTUxOTU5MTZVLAkvLyBWUEFERFNCcm0NCisgICAgMjA5ODg5NTQ4VSwJLy8gVlBBRERTQnJyDQorICAgIDEwMTUxOTU5MjVVLAkvLyBWUEFERFNXcm0NCisgICAgMjA5ODg5NTU3VSwJLy8gVlBBRERTV3JyDQorICAgIDEwMTUxOTU5MzRVLAkvLyBWUEFERFVTQnJtDQorICAgIDIwOTg4OTU2NlUsCS8vIFZQQUREVVNCcnINCisgICAgMTAxNTE5NTk0NFUsCS8vIFZQQUREVVNXcm0NCisgICAgMjA5ODg5NTc2VSwJLy8gVlBBRERVU1dycg0KKyAgICAxMDE1MTk1OTU0VSwJLy8gVlBBRERXcm0NCisgICAgMjA5ODg5NTg2VSwJLy8gVlBBRERXcnINCisgICAgMTI4NDg3NjYwMlUsCS8vIFZQQUxJR05SMTI4cm0NCisgICAgMTM1MDc0MDI4MlUsCS8vIFZQQUxJR05SMTI4cnINCisgICAgMTMwMzU1NDM2MlUsCS8vIFZQQUxJR05SNjRybQ0KKyAgICAxMzUwNzQwMjgyVSwJLy8gVlBBTElHTlI2NHJyDQorICAgIDEwMTUxOTU5NzJVLAkvLyBWUEFORE5ybQ0KKyAgICAyMDk4ODk2MDRVLAkvLyBWUEFORE5ycg0KKyAgICAxMDE1MTk1OTgwVSwJLy8gVlBBTkRybQ0KKyAgICAyMDk4ODk2MTJVLAkvLyBWUEFORHJyDQorICAgIDEwMTUxOTU5ODdVLAkvLyBWUEFWR0JybQ0KKyAgICAyMDk4ODk2MTlVLAkvLyBWUEFWR0Jycg0KKyAgICAxMDE1MTk1OTk1VSwJLy8gVlBBVkdXcm0NCisgICAgMjA5ODg5NjI3VSwJLy8gVlBBVkdXcnINCisgICAgMTI4NDg3NjY0M1UsCS8vIFZQQkxFTkRWQnJtDQorICAgIDEzNTA3NDAzMjNVLAkvLyBWUEJMRU5EVkJycg0KKyAgICAxMjg0ODc2NjU0VSwJLy8gVlBCTEVORFdybWkNCisgICAgMTM1MDc0MDMzNFUsCS8vIFZQQkxFTkRXcnJpDQorICAgIDEwMTUxOTYwMjRVLAkvLyBWUENMTVVMSFFIUURRcm0NCisgICAgMjA5ODg5NjU2VSwJLy8gVlBDTE1VTEhRSFFEUXJyDQorICAgIDEwMTUxOTYwMzlVLAkvLyBWUENMTVVMSFFMUURRcm0NCisgICAgMjA5ODg5NjcxVSwJLy8gVlBDTE1VTEhRTFFEUXJyDQorICAgIDEwMTUxOTYwNTRVLAkvLyBWUENMTVVMTFFIUURRcm0NCisgICAgMjA5ODg5Njg2VSwJLy8gVlBDTE1VTExRSFFEUXJyDQorICAgIDEwMTUxOTYwNjlVLAkvLyBWUENMTVVMTFFMUURRcm0NCisgICAgMjA5ODg5NzAxVSwJLy8gVlBDTE1VTExRTFFEUXJyDQorICAgIDEyODQ4NzY3MjRVLAkvLyBWUENMTVVMUURRcm0NCisgICAgMTM1MDc0MDQwNFUsCS8vIFZQQ0xNVUxRRFFycg0KKyAgICAxMDE1MTk2MDk2VSwJLy8gVlBDTVBFUUJybQ0KKyAgICAyMDk4ODk3MjhVLAkvLyBWUENNUEVRQnJyDQorICAgIDEwMTUxOTYxMDZVLAkvLyBWUENNUEVRRHJtDQorICAgIDIwOTg4OTczOFUsCS8vIFZQQ01QRVFEcnINCisgICAgMTAxNTE5NjExNlUsCS8vIFZQQ01QRVFRcm0NCisgICAgMjA5ODg5NzQ4VSwJLy8gVlBDTVBFUVFycg0KKyAgICAxMDE1MTk2MTI2VSwJLy8gVlBDTVBFUVdybQ0KKyAgICAyMDk4ODk3NThVLAkvLyBWUENNUEVRV3JyDQorICAgIDEyMTUzMTAzMTJVLAkvLyBWUENNUEVTVFJJQXJtDQorICAgIDIwOTg4OTc2OFUsCS8vIFZQQ01QRVNUUklBcnINCisgICAgMTIxNTMxMDMxMlUsCS8vIFZQQ01QRVNUUklDcm0NCisgICAgMjA5ODg5NzY4VSwJLy8gVlBDTVBFU1RSSUNycg0KKyAgICAxMjE1MzEwMzEyVSwJLy8gVlBDTVBFU1RSSU9ybQ0KKyAgICAyMDk4ODk3NjhVLAkvLyBWUENNUEVTVFJJT3JyDQorICAgIDEyMTUzMTAzMTJVLAkvLyBWUENNUEVTVFJJU3JtDQorICAgIDIwOTg4OTc2OFUsCS8vIFZQQ01QRVNUUklTcnINCisgICAgMTIxNTMxMDMxMlUsCS8vIFZQQ01QRVNUUklacm0NCisgICAgMjA5ODg5NzY4VSwJLy8gVlBDTVBFU1RSSVpycg0KKyAgICAxMjE1MzEwMzEyVSwJLy8gVlBDTVBFU1RSSXJtDQorICAgIDIwOTg4OTc2OFUsCS8vIFZQQ01QRVNUUklycg0KKyAgICAxMDc0MFUsCS8vIFZQQ01QRVNUUk0xMjhNRU0NCisgICAgMTA3NjRVLAkvLyBWUENNUEVTVFJNMTI4UkVHDQorICAgIDEyMTUzMTAzNzJVLAkvLyBWUENNUEVTVFJNMTI4cm0NCisgICAgMjA5ODg5ODI4VSwJLy8gVlBDTVBFU1RSTTEyOHJyDQorICAgIDEwMTUxOTYyMDhVLAkvLyBWUENNUEdUQnJtDQorICAgIDIwOTg4OTg0MFUsCS8vIFZQQ01QR1RCcnINCisgICAgMTAxNTE5NjIxOFUsCS8vIFZQQ01QR1REcm0NCisgICAgMjA5ODg5ODUwVSwJLy8gVlBDTVBHVERycg0KKyAgICAxMDE1MTk2MjI4VSwJLy8gVlBDTVBHVFFybQ0KKyAgICAyMDk4ODk4NjBVLAkvLyBWUENNUEdUUXJyDQorICAgIDEwMTUxOTYyMzhVLAkvLyBWUENNUEdUV3JtDQorICAgIDIwOTg4OTg3MFUsCS8vIFZQQ01QR1RXcnINCisgICAgMTIxNTMxMDQyNFUsCS8vIFZQQ01QSVNUUklBcm0NCisgICAgMjA5ODg5ODgwVSwJLy8gVlBDTVBJU1RSSUFycg0KKyAgICAxMjE1MzEwNDI0VSwJLy8gVlBDTVBJU1RSSUNybQ0KKyAgICAyMDk4ODk4ODBVLAkvLyBWUENNUElTVFJJQ3JyDQorICAgIDEyMTUzMTA0MjRVLAkvLyBWUENNUElTVFJJT3JtDQorICAgIDIwOTg4OTg4MFUsCS8vIFZQQ01QSVNUUklPcnINCisgICAgMTIxNTMxMDQyNFUsCS8vIFZQQ01QSVNUUklTcm0NCisgICAgMjA5ODg5ODgwVSwJLy8gVlBDTVBJU1RSSVNycg0KKyAgICAxMjE1MzEwNDI0VSwJLy8gVlBDTVBJU1RSSVpybQ0KKyAgICAyMDk4ODk4ODBVLAkvLyBWUENNUElTVFJJWnJyDQorICAgIDEyMTUzMTA0MjRVLAkvLyBWUENNUElTVFJJcm0NCisgICAgMjA5ODg5ODgwVSwJLy8gVlBDTVBJU1RSSXJyDQorICAgIDEwODUyVSwJLy8gVlBDTVBJU1RSTTEyOE1FTQ0KKyAgICAxMDg3NlUsCS8vIFZQQ01QSVNUUk0xMjhSRUcNCisgICAgMTIxNTMxMDQ4NFUsCS8vIFZQQ01QSVNUUk0xMjhybQ0KKyAgICAyMDk4ODk5NDBVLAkvLyBWUENNUElTVFJNMTI4cnINCisgICAgMTMxMjgyODA2NFUsCS8vIFZQRVJNMkYxMjhybQ0KKyAgICAxMzUwNzQwNjQwVSwJLy8gVlBFUk0yRjEyOHJyDQorICAgIDEyMzk0Mjc3NTZVLAkvLyBWUEVSTUlMUERZbWkNCisgICAgMjA5ODg5OTY0VSwJLy8gVlBFUk1JTFBEWXJpDQorICAgIDI2ODQzNjU0ODRVLAkvLyBWUEVSTUlMUERZcm0NCisgICAgMjA5ODg5OTY0VSwJLy8gVlBFUk1JTFBEWXJyDQorICAgIDEyNDY3Njc3ODhVLAkvLyBWUEVSTUlMUERtaQ0KKyAgICAyMDk4ODk5NjRVLAkvLyBWUEVSTUlMUERyaQ0KKyAgICAxMDE1MTk2MzMyVSwJLy8gVlBFUk1JTFBEcm0NCisgICAgMjA5ODg5OTY0VSwJLy8gVlBFUk1JTFBEcnINCisgICAgMTIzOTQyNzc2N1UsCS8vIFZQRVJNSUxQU1ltaQ0KKyAgICAyMDk4ODk5NzVVLAkvLyBWUEVSTUlMUFNZcmkNCisgICAgMjY4NDM2NTQ5NVUsCS8vIFZQRVJNSUxQU1lybQ0KKyAgICAyMDk4ODk5NzVVLAkvLyBWUEVSTUlMUFNZcnINCisgICAgMTI0Njc2Nzc5OVUsCS8vIFZQRVJNSUxQU21pDQorICAgIDIwOTg4OTk3NVUsCS8vIFZQRVJNSUxQU3JpDQorICAgIDEwMTUxOTYzNDNVLAkvLyBWUEVSTUlMUFNybQ0KKyAgICAyMDk4ODk5NzVVLAkvLyBWUEVSTUlMUFNycg0KKyAgICAxMjI2OTc1OTM4VSwJLy8gVlBFWFRSQm1yDQorICAgIDIwOTg4OTk4NlUsCS8vIFZQRVhUUkJycg0KKyAgICAyMDk4ODk5ODZVLAkvLyBWUEVYVFJCcnI2NA0KKyAgICAxMjI2OTEwNDExVSwJLy8gVlBFWFRSRG1yDQorICAgIDIwOTg4OTk5NVUsCS8vIFZQRVhUUkRycg0KKyAgICAxMjI2OTQzMTg4VSwJLy8gVlBFWFRSUW1yDQorICAgIDIwOTg5MDAwNFUsCS8vIFZQRVhUUlFycg0KKyAgICAxMjI2ODQ0ODkzVSwJLy8gVlBFWFRSV21yDQorICAgIDIwOTg5MDAxM1UsCS8vIFZQRVhUUldyaQ0KKyAgICAxMDE1MTk2MzkwVSwJLy8gVlBIQURERHJtMTI4DQorICAgIDQxMTIxNjYxNFUsCS8vIFZQSEFERERybTY0DQorICAgIDIwOTg5MDAyMlUsCS8vIFZQSEFERERycjEyOA0KKyAgICAyMDk4OTAwMjJVLAkvLyBWUEhBREREcnI2NA0KKyAgICAxMDE1MTk2Mzk5VSwJLy8gVlBIQUREU1dybTEyOA0KKyAgICA0MTEyMTY2MjNVLAkvLyBWUEhBRERTV3JtNjQNCisgICAgMjA5ODkwMDMxVSwJLy8gVlBIQUREU1dycjEyOA0KKyAgICAyMDk4OTAwMzFVLAkvLyBWUEhBRERTV3JyNjQNCisgICAgMTAxNTE5NjQwOVUsCS8vIFZQSEFERFdybTEyOA0KKyAgICA0MTEyMTY2MzNVLAkvLyBWUEhBRERXcm02NA0KKyAgICAyMDk4OTAwNDFVLAkvLyBWUEhBRERXcnIxMjgNCisgICAgMjA5ODkwMDQxVSwJLy8gVlBIQUREV3JyNjQNCisgICAgMTA3Mzc1MjgzNFUsCS8vIFZQSE1JTlBPU1VXcm0xMjgNCisgICAgMTE0Mjk5MTYxOFUsCS8vIFZQSE1JTlBPU1VXcnIxMjgNCisgICAgMTAxNTE5NjQzMVUsCS8vIFZQSFNVQkRybTEyOA0KKyAgICA0MTEyMTY2NTVVLAkvLyBWUEhTVUJEcm02NA0KKyAgICAyMDk4OTAwNjNVLAkvLyBWUEhTVUJEcnIxMjgNCisgICAgMjA5ODkwMDYzVSwJLy8gVlBIU1VCRHJyNjQNCisgICAgMTAxNTE5NjQ0MFUsCS8vIFZQSFNVQlNXcm0xMjgNCisgICAgNDExMjE2NjY0VSwJLy8gVlBIU1VCU1dybTY0DQorICAgIDIwOTg5MDA3MlUsCS8vIFZQSFNVQlNXcnIxMjgNCisgICAgMjA5ODkwMDcyVSwJLy8gVlBIU1VCU1dycjY0DQorICAgIDEwMTUxOTY0NTBVLAkvLyBWUEhTVUJXcm0xMjgNCisgICAgNDExMjE2Njc0VSwJLy8gVlBIU1VCV3JtNjQNCisgICAgMjA5ODkwMDgyVSwJLy8gVlBIU1VCV3JyMTI4DQorICAgIDIwOTg5MDA4MlUsCS8vIFZQSFNVQldycjY0DQorICAgIDEzMDQ2MDM0MzVVLAkvLyBWUElOU1JCcm0NCisgICAgMTM1MDc0MDc3OVUsCS8vIFZQSU5TUkJycg0KKyAgICAxMzAyNTA2MjkyVSwJLy8gVlBJTlNSRHJtDQorICAgIDEzNTA3NDA3ODhVLAkvLyBWUElOU1JEcnINCisgICAgMTMwMzU1NDg3N1UsCS8vIFZQSU5TUlFybQ0KKyAgICAxMzUwNzQwNzk3VSwJLy8gVlBJTlNSUXJyDQorICAgIDEzMDE0NTc3MzRVLAkvLyBWUElOU1JXcm1pDQorICAgIDEzNTA3NDA4MDZVLAkvLyBWUElOU1JXcnI2NGkNCisgICAgMTM1MDc0MDgwNlUsCS8vIFZQSU5TUldycmkNCisgICAgMTAxNTE5NjQ5NVUsCS8vIFZQTUFERFVCU1dybTEyOA0KKyAgICA0MTEyMTY3MTlVLAkvLyBWUE1BRERVQlNXcm02NA0KKyAgICAyMDk4OTAxMjdVLAkvLyBWUE1BRERVQlNXcnIxMjgNCisgICAgMjA5ODkwMTI3VSwJLy8gVlBNQUREVUJTV3JyNjQNCisgICAgMTAxNTE5NjUwN1UsCS8vIFZQTUFERFdEcm0NCisgICAgMjA5ODkwMTM5VSwJLy8gVlBNQUREV0Rycg0KKyAgICAxMDE1MTk2NTE3VSwJLy8gVlBNQVhTQnJtDQorICAgIDIwOTg5MDE0OVUsCS8vIFZQTUFYU0Jycg0KKyAgICAxMDE1MTk2NTI2VSwJLy8gVlBNQVhTRHJtDQorICAgIDIwOTg5MDE1OFUsCS8vIFZQTUFYU0Rycg0KKyAgICAxMDE1MTk2NTM1VSwJLy8gVlBNQVhTV3JtDQorICAgIDIwOTg5MDE2N1UsCS8vIFZQTUFYU1dycg0KKyAgICAxMDE1MTk2NTQ0VSwJLy8gVlBNQVhVQnJtDQorICAgIDIwOTg5MDE3NlUsCS8vIFZQTUFYVUJycg0KKyAgICAxMDE1MTk2NTUzVSwJLy8gVlBNQVhVRHJtDQorICAgIDIwOTg5MDE4NVUsCS8vIFZQTUFYVURycg0KKyAgICAxMDE1MTk2NTYyVSwJLy8gVlBNQVhVV3JtDQorICAgIDIwOTg5MDE5NFUsCS8vIFZQTUFYVVdycg0KKyAgICAxMDE1MTk2NTcxVSwJLy8gVlBNSU5TQnJtDQorICAgIDIwOTg5MDIwM1UsCS8vIFZQTUlOU0Jycg0KKyAgICAxMDE1MTk2NTgwVSwJLy8gVlBNSU5TRHJtDQorICAgIDIwOTg5MDIxMlUsCS8vIFZQTUlOU0Rycg0KKyAgICAxMDE1MTk2NTg5VSwJLy8gVlBNSU5TV3JtDQorICAgIDIwOTg5MDIyMVUsCS8vIFZQTUlOU1dycg0KKyAgICAxMDE1MTk2NTk4VSwJLy8gVlBNSU5VQnJtDQorICAgIDIwOTg5MDIzMFUsCS8vIFZQTUlOVUJycg0KKyAgICAxMDE1MTk2NjA3VSwJLy8gVlBNSU5VRHJtDQorICAgIDIwOTg5MDIzOVUsCS8vIFZQTUlOVURycg0KKyAgICAxMDE1MTk2NjE2VSwJLy8gVlBNSU5VV3JtDQorICAgIDIwOTg5MDI0OFUsCS8vIFZQTUlOVVdycg0KKyAgICAxMTQyOTkxODI1VSwJLy8gVlBNT1ZNU0tCcjY0cg0KKyAgICAxMTQyOTkxODI1VSwJLy8gVlBNT1ZNU0tCcnINCisgICAgMTQ3NjQwNjIzNlUsCS8vIFZQTU9WU1hCRHJtDQorICAgIDExNDI5OTE4MzZVLAkvLyBWUE1PVlNYQkRycg0KKyAgICAxNDA5Mjk3MzgzVSwJLy8gVlBNT1ZTWEJRcm0NCisgICAgMTE0Mjk5MTg0N1UsCS8vIFZQTU9WU1hCUXJyDQorICAgIDE1NDM1MTUxMjJVLAkvLyBWUE1PVlNYQldybQ0KKyAgICAxMTQyOTkxODU4VSwJLy8gVlBNT1ZTWEJXcnINCisgICAgMTU0MzUxNTEzM1UsCS8vIFZQTU9WU1hEUXJtDQorICAgIDExNDI5OTE4NjlVLAkvLyBWUE1PVlNYRFFycg0KKyAgICAxNTQzNTE1MTQ0VSwJLy8gVlBNT1ZTWFdEcm0NCisgICAgMTE0Mjk5MTg4MFUsCS8vIFZQTU9WU1hXRHJyDQorICAgIDE0NzY0MDYyOTFVLAkvLyBWUE1PVlNYV1FybQ0KKyAgICAxMTQyOTkxODkxVSwJLy8gVlBNT1ZTWFdRcnINCisgICAgMTQ3NjQwNjMwMlUsCS8vIFZQTU9WWlhCRHJtDQorICAgIDExNDI5OTE5MDJVLAkvLyBWUE1PVlpYQkRycg0KKyAgICAxNDA5Mjk3NDQ5VSwJLy8gVlBNT1ZaWEJRcm0NCisgICAgMTE0Mjk5MTkxM1UsCS8vIFZQTU9WWlhCUXJyDQorICAgIDE1NDM1MTUxODhVLAkvLyBWUE1PVlpYQldybQ0KKyAgICAxMTQyOTkxOTI0VSwJLy8gVlBNT1ZaWEJXcnINCisgICAgMTU0MzUxNTE5OVUsCS8vIFZQTU9WWlhEUXJtDQorICAgIDExNDI5OTE5MzVVLAkvLyBWUE1PVlpYRFFycg0KKyAgICAxNTQzNTE1MjEwVSwJLy8gVlBNT1ZaWFdEcm0NCisgICAgMTE0Mjk5MTk0NlUsCS8vIFZQTU9WWlhXRHJyDQorICAgIDE0NzY0MDYzNTdVLAkvLyBWUE1PVlpYV1FybQ0KKyAgICAxMTQyOTkxOTU3VSwJLy8gVlBNT1ZaWFdRcnINCisgICAgMTAxNTE5Njc2OFUsCS8vIFZQTVVMRFFybQ0KKyAgICAyMDk4OTA0MDBVLAkvLyBWUE1VTERRcnINCisgICAgMTAxNTE5Njc3N1UsCS8vIFZQTVVMSFJTV3JtMTI4DQorICAgIDQxMTIxNzAwMVUsCS8vIFZQTVVMSFJTV3JtNjQNCisgICAgMjA5ODkwNDA5VSwJLy8gVlBNVUxIUlNXcnIxMjgNCisgICAgMjA5ODkwNDA5VSwJLy8gVlBNVUxIUlNXcnI2NA0KKyAgICAxMDE1MTk2Nzg4VSwJLy8gVlBNVUxIVVdybQ0KKyAgICAyMDk4OTA0MjBVLAkvLyBWUE1VTEhVV3JyDQorICAgIDEwMTUxOTY3OThVLAkvLyBWUE1VTEhXcm0NCisgICAgMjA5ODkwNDMwVSwJLy8gVlBNVUxIV3JyDQorICAgIDEwMTUxOTY4MDdVLAkvLyBWUE1VTExEcm0NCisgICAgMjA5ODkwNDM5VSwJLy8gVlBNVUxMRHJyDQorICAgIDEwMTUxOTY4MTZVLAkvLyBWUE1VTExXcm0NCisgICAgMjA5ODkwNDQ4VSwJLy8gVlBNVUxMV3JyDQorICAgIDEwMTUxOTY4MjVVLAkvLyBWUE1VTFVEUXJtDQorICAgIDIwOTg5MDQ1N1UsCS8vIFZQTVVMVURRcnINCisgICAgMTAxNTE5NjgzNVUsCS8vIFZQT1JybQ0KKyAgICAyMDk4OTA0NjdVLAkvLyBWUE9ScnINCisgICAgMTAxNTE5Njg0MVUsCS8vIFZQU0FEQldybQ0KKyAgICAyMDk4OTA0NzNVLAkvLyBWUFNBREJXcnINCisgICAgMTAxNTE5Njg1MFUsCS8vIFZQU0hVRkJybTEyOA0KKyAgICA0MTEyMTcwNzRVLAkvLyBWUFNIVUZCcm02NA0KKyAgICAyMDk4OTA0ODJVLAkvLyBWUFNIVUZCcnIxMjgNCisgICAgMjA5ODkwNDgyVSwJLy8gVlBTSFVGQnJyNjQNCisgICAgMTIxNTMxMTAzNVUsCS8vIFZQU0hVRkRtaQ0KKyAgICAyMDk4OTA0OTFVLAkvLyBWUFNIVUZEcmkNCisgICAgMTIxNTMxMTA0NFUsCS8vIFZQU0hVRkhXbWkNCisgICAgMjA5ODkwNTAwVSwJLy8gVlBTSFVGSFdyaQ0KKyAgICAxMjE1MzExMDU0VSwJLy8gVlBTSFVGTFdtaQ0KKyAgICAyMDk4OTA1MTBVLAkvLyBWUFNIVUZMV3JpDQorICAgIDEwMTUxOTY4ODhVLAkvLyBWUFNJR05Ccm0xMjgNCisgICAgNDExMjE3MTEyVSwJLy8gVlBTSUdOQnJtNjQNCisgICAgMjA5ODkwNTIwVSwJLy8gVlBTSUdOQnJyMTI4DQorICAgIDIwOTg5MDUyMFUsCS8vIFZQU0lHTkJycjY0DQorICAgIDEwMTUxOTY4OTdVLAkvLyBWUFNJR05Ecm0xMjgNCisgICAgNDExMjE3MTIxVSwJLy8gVlBTSUdORHJtNjQNCisgICAgMjA5ODkwNTI5VSwJLy8gVlBTSUdORHJyMTI4DQorICAgIDIwOTg5MDUyOVUsCS8vIFZQU0lHTkRycjY0DQorICAgIDEwMTUxOTY5MDZVLAkvLyBWUFNJR05Xcm0xMjgNCisgICAgNDExMjE3MTMwVSwJLy8gVlBTSUdOV3JtNjQNCisgICAgMjA5ODkwNTM4VSwJLy8gVlBTSUdOV3JyMTI4DQorICAgIDIwOTg5MDUzOFUsCS8vIFZQU0lHTldycjY0DQorICAgIDIwOTg5MDU0N1UsCS8vIFZQU0xMRFFyaQ0KKyAgICAyMDk4OTA1NTZVLAkvLyBWUFNMTERyaQ0KKyAgICAxMDE1MTk2OTI0VSwJLy8gVlBTTExEcm0NCisgICAgMjA5ODkwNTU2VSwJLy8gVlBTTExEcnINCisgICAgMjA5ODkwNTY0VSwJLy8gVlBTTExRcmkNCisgICAgMTAxNTE5NjkzMlUsCS8vIFZQU0xMUXJtDQorICAgIDIwOTg5MDU2NFUsCS8vIFZQU0xMUXJyDQorICAgIDIwOTg5MDU3MlUsCS8vIFZQU0xMV3JpDQorICAgIDEwMTUxOTY5NDBVLAkvLyBWUFNMTFdybQ0KKyAgICAyMDk4OTA1NzJVLAkvLyBWUFNMTFdycg0KKyAgICAyMDk4OTA1ODBVLAkvLyBWUFNSQURyaQ0KKyAgICAxMDE1MTk2OTQ4VSwJLy8gVlBTUkFEcm0NCisgICAgMjA5ODkwNTgwVSwJLy8gVlBTUkFEcnINCisgICAgMjA5ODkwNTg4VSwJLy8gVlBTUkFXcmkNCisgICAgMTAxNTE5Njk1NlUsCS8vIFZQU1JBV3JtDQorICAgIDIwOTg5MDU4OFUsCS8vIFZQU1JBV3JyDQorICAgIDIwOTg5MDU5NlUsCS8vIFZQU1JMRFFyaQ0KKyAgICAyMDk4OTA2MDVVLAkvLyBWUFNSTERyaQ0KKyAgICAxMDE1MTk2OTczVSwJLy8gVlBTUkxEcm0NCisgICAgMjA5ODkwNjA1VSwJLy8gVlBTUkxEcnINCisgICAgMjA5ODkwNjEzVSwJLy8gVlBTUkxRcmkNCisgICAgMTAxNTE5Njk4MVUsCS8vIFZQU1JMUXJtDQorICAgIDIwOTg5MDYxM1UsCS8vIFZQU1JMUXJyDQorICAgIDIwOTg5MDYyMVUsCS8vIFZQU1JMV3JpDQorICAgIDEwMTUxOTY5ODlVLAkvLyBWUFNSTFdybQ0KKyAgICAyMDk4OTA2MjFVLAkvLyBWUFNSTFdycg0KKyAgICAxMDE1MTk2OTk3VSwJLy8gVlBTVUJCcm0NCisgICAgMjA5ODkwNjI5VSwJLy8gVlBTVUJCcnINCisgICAgMTAxNTE5NzAwNVUsCS8vIFZQU1VCRHJtDQorICAgIDIwOTg5MDYzN1UsCS8vIFZQU1VCRHJyDQorICAgIDEwMTUxOTcwMTNVLAkvLyBWUFNVQlFybQ0KKyAgICAyMDk4OTA2NDVVLAkvLyBWUFNVQlFycg0KKyAgICAxMDE1MTk3MDIxVSwJLy8gVlBTVUJTQnJtDQorICAgIDIwOTg5MDY1M1UsCS8vIFZQU1VCU0Jycg0KKyAgICAxMDE1MTk3MDMwVSwJLy8gVlBTVUJTV3JtDQorICAgIDIwOTg5MDY2MlUsCS8vIFZQU1VCU1dycg0KKyAgICAxMDE1MTk3MDM5VSwJLy8gVlBTVUJVU0JybQ0KKyAgICAyMDk4OTA2NzFVLAkvLyBWUFNVQlVTQnJyDQorICAgIDEwMTUxOTcwNDlVLAkvLyBWUFNVQlVTV3JtDQorICAgIDIwOTg5MDY4MVUsCS8vIFZQU1VCVVNXcnINCisgICAgMTAxNTE5NzA1OVUsCS8vIFZQU1VCV3JtDQorICAgIDIwOTg5MDY5MVUsCS8vIFZQU1VCV3JyDQorICAgIDI1NTAxNDg0OTFVLAkvLyBWUFRFU1RZcm0NCisgICAgMTE0Mjk5MjI2N1UsCS8vIFZQVEVTVFlycg0KKyAgICAyMDgwMzg2NDQzVSwJLy8gVlBURVNUcm0NCisgICAgMTE0Mjk5MjI2N1UsCS8vIFZQVEVTVHJyDQorICAgIDEwMTUxOTcwNzVVLAkvLyBWUFVOUENLSEJXcm0NCisgICAgMjA5ODkwNzA3VSwJLy8gVlBVTlBDS0hCV3JyDQorICAgIDEwMTUxOTcwODdVLAkvLyBWUFVOUENLSERRcm0NCisgICAgMjA5ODkwNzE5VSwJLy8gVlBVTlBDS0hEUXJyDQorICAgIDEwMTUxOTcwOTlVLAkvLyBWUFVOUENLSFFEUXJtDQorICAgIDIwOTg5MDczMVUsCS8vIFZQVU5QQ0tIUURRcnINCisgICAgMTAxNTE5NzExMlUsCS8vIFZQVU5QQ0tIV0RybQ0KKyAgICAyMDk4OTA3NDRVLAkvLyBWUFVOUENLSFdEcnINCisgICAgMTAxNTE5NzEyNFUsCS8vIFZQVU5QQ0tMQldybQ0KKyAgICAyMDk4OTA3NTZVLAkvLyBWUFVOUENLTEJXcnINCisgICAgMTAxNTE5NzEzNlUsCS8vIFZQVU5QQ0tMRFFybQ0KKyAgICAyMDk4OTA3NjhVLAkvLyBWUFVOUENLTERRcnINCisgICAgMTAxNTE5NzE0OFUsCS8vIFZQVU5QQ0tMUURRcm0NCisgICAgMjA5ODkwNzgwVSwJLy8gVlBVTlBDS0xRRFFycg0KKyAgICAxMDE1MTk3MTYxVSwJLy8gVlBVTlBDS0xXRHJtDQorICAgIDIwOTg5MDc5M1UsCS8vIFZQVU5QQ0tMV0Rycg0KKyAgICAxMDE1MTk3MTczVSwJLy8gVlBYT1JybQ0KKyAgICAyMDk4OTA4MDVVLAkvLyBWUFhPUnJyDQorICAgIDI2MTcyNTc0NjhVLAkvLyBWUkNQUFNZbQ0KKyAgICAyNjE3MjU3NDY4VSwJLy8gVlJDUFBTWW1fSW50DQorICAgIDExNDI5OTIzODBVLAkvLyBWUkNQUFNZcg0KKyAgICAxMTQyOTkyMzgwVSwJLy8gVlJDUFBTWXJfSW50DQorICAgIDIwODAzODY1NTZVLAkvLyBWUkNQUFNtDQorICAgIDIwODAzODY1NTZVLAkvLyBWUkNQUFNtX0ludA0KKyAgICAxMTQyOTkyMzgwVSwJLy8gVlJDUFBTcg0KKyAgICAxMTQyOTkyMzgwVSwJLy8gVlJDUFBTcl9JbnQNCisgICAgNjc5NjUyODY4VSwJLy8gVlJDUFNTbQ0KKyAgICAyMjE1ODQ5NDc2VSwJLy8gVlJDUFNTbV9JbnQNCisgICAgMjA5ODkwODIwVSwJLy8gVlJDUFNTcg0KKyAgICAxMTQzMTIzNDYwVSwJLy8gVlJDUFNTcl9JbnQNCisgICAgMTI0Njc2ODY1MlUsCS8vIFZST1VORFBEbQ0KKyAgICAxMjM5NDI4NjIwVSwJLy8gVlJPVU5EUERtX0ludA0KKyAgICAyMDk4OTA4MjhVLAkvLyBWUk9VTkRQRHINCisgICAgMjA5ODkwODI4VSwJLy8gVlJPVU5EUERyX0ludA0KKyAgICAxMjQ2NzY4NjYyVSwJLy8gVlJPVU5EUFNtDQorICAgIDEyMzk0Mjg2MzBVLAkvLyBWUk9VTkRQU21fSW50DQorICAgIDIwOTg5MDgzOFUsCS8vIFZST1VORFBTcg0KKyAgICAyMDk4OTA4MzhVLAkvLyBWUk9VTkRQU3JfSW50DQorICAgIDEyOTExNjkzMTJVLAkvLyBWUk9VTkRTRG0NCisgICAgMTI5MTE2OTMxMlUsCS8vIFZST1VORFNEbV9JbnQNCisgICAgMTM1MDc0MTUzNlUsCS8vIFZST1VORFNEcg0KKyAgICAxMzUwNzQxNTM2VSwJLy8gVlJPVU5EU0RyX0ludA0KKyAgICAxMjkzMjY2NDc0VSwJLy8gVlJPVU5EU1NtDQorICAgIDEyOTMyNjY0NzRVLAkvLyBWUk9VTkRTU21fSW50DQorICAgIDEzNTA3NDE1NDZVLAkvLyBWUk9VTkRTU3INCisgICAgMTM1MDc0MTU0NlUsCS8vIFZST1VORFNTcl9JbnQNCisgICAgMTIzOTQyODYyMFUsCS8vIFZST1VORFlQRG0NCisgICAgMTIzOTQyODYyMFUsCS8vIFZST1VORFlQRG1fSW50DQorICAgIDIwOTg5MDgyOFUsCS8vIFZST1VORFlQRHINCisgICAgMjA5ODkwODI4VSwJLy8gVlJPVU5EWVBEcl9JbnQNCisgICAgMTIzOTQyODYzMFUsCS8vIFZST1VORFlQU20NCisgICAgMTIzOTQyODYzMFUsCS8vIFZST1VORFlQU21fSW50DQorICAgIDIwOTg5MDgzOFUsCS8vIFZST1VORFlQU3INCisgICAgMjA5ODkwODM4VSwJLy8gVlJPVU5EWVBTcl9JbnQNCisgICAgMjYxNzI1NzUyNFUsCS8vIFZSU1FSVFBTWW0NCisgICAgMjYxNzI1NzUyNFUsCS8vIFZSU1FSVFBTWW1fSW50DQorICAgIDExNDI5OTI0MzZVLAkvLyBWUlNRUlRQU1lyDQorICAgIDExNDI5OTI0MzZVLAkvLyBWUlNRUlRQU1lyX0ludA0KKyAgICAyMDgwMzg2NjEyVSwJLy8gVlJTUVJUUFNtDQorICAgIDIwODAzODY2MTJVLAkvLyBWUlNRUlRQU21fSW50DQorICAgIDExNDI5OTI0MzZVLAkvLyBWUlNRUlRQU3INCisgICAgMTE0Mjk5MjQzNlUsCS8vIFZSU1FSVFBTcl9JbnQNCisgICAgNjc5NjUyOTI2VSwJLy8gVlJTUVJUU1NtDQorICAgIDIyMTU4NDk1MzRVLAkvLyBWUlNRUlRTU21fSW50DQorICAgIDIwOTg5MDg3OFUsCS8vIFZSU1FSVFNTcg0KKyAgICAxMTQzMTIzNTE4VSwJLy8gVlJTUVJUU1NyX0ludA0KKyAgICAxMjg4MDIzNjI0VSwJLy8gVlNIVUZQRFlybWkNCisgICAgMTM1MDc0MTU3NlUsCS8vIFZTSFVGUERZcnJpDQorICAgIDEyODgwMjM2MjRVLAkvLyBWU0hVRlBEcm1pDQorICAgIDEzNTA3NDE1NzZVLAkvLyBWU0hVRlBEcnJpDQorICAgIDEyODgwMjM2MzNVLAkvLyBWU0hVRlBTWXJtaQ0KKyAgICAxMzUwNzQxNTg1VSwJLy8gVlNIVUZQU1lycmkNCisgICAgMTI4ODAyMzYzM1UsCS8vIFZTSFVGUFNybWkNCisgICAgMTM1MDc0MTU4NVUsCS8vIFZTSFVGUFNycmkNCisgICAgMjYxNzI1NzU2MlUsCS8vIFZTUVJUUERZbQ0KKyAgICAyNjE3MjU3NTYyVSwJLy8gVlNRUlRQRFltX0ludA0KKyAgICAxMTQyOTkyNDc0VSwJLy8gVlNRUlRQRFlyDQorICAgIDExNDI5OTI0NzRVLAkvLyBWU1FSVFBEWXJfSW50DQorICAgIDIwODAzODY2NTBVLAkvLyBWU1FSVFBEbQ0KKyAgICAyMDgwMzg2NjUwVSwJLy8gVlNRUlRQRG1fSW50DQorICAgIDExNDI5OTI0NzRVLAkvLyBWU1FSVFBEcg0KKyAgICAxMTQyOTkyNDc0VSwJLy8gVlNRUlRQRHJfSW50DQorICAgIDI2MTcyNTc1NzFVLAkvLyBWU1FSVFBTWW0NCisgICAgMjYxNzI1NzU3MVUsCS8vIFZTUVJUUFNZbV9JbnQNCisgICAgMTE0Mjk5MjQ4M1UsCS8vIFZTUVJUUFNZcg0KKyAgICAxMTQyOTkyNDgzVSwJLy8gVlNRUlRQU1lyX0ludA0KKyAgICAyMDgwMzg2NjU5VSwJLy8gVlNRUlRQU20NCisgICAgMjA4MDM4NjY1OVUsCS8vIFZTUVJUUFNtX0ludA0KKyAgICAxMTQyOTkyNDgzVSwJLy8gVlNRUlRQU3INCisgICAgMTE0Mjk5MjQ4M1UsCS8vIFZTUVJUUFNyX0ludA0KKyAgICA2MTI1NDQxMDhVLAkvLyBWU1FSVFNEbQ0KKyAgICAyMTQ4NzQwNzE2VSwJLy8gVlNRUlRTRG1fSW50DQorICAgIDIwOTg5MDkyNFUsCS8vIFZTUVJUU0RyDQorICAgIDExNDMxMjM1NjRVLAkvLyBWU1FSVFNEcl9JbnQNCisgICAgNjc5NjUyOTgxVSwJLy8gVlNRUlRTU20NCisgICAgMjIxNTg0OTU4OVUsCS8vIFZTUVJUU1NtX0ludA0KKyAgICAyMDk4OTA5MzNVLAkvLyBWU1FSVFNTcg0KKyAgICAxMTQzMTIzNTczVSwJLy8gVlNRUlRTU3JfSW50DQorICAgIDk0NTgyNzQ1NFUsCS8vIFZTVE1YQ1NSDQorICAgIDI0ODMwMzk4ODBVLAkvLyBWU1VCUERZcm0NCisgICAgMjA5ODkwOTUyVSwJLy8gVlNVQlBEWXJyDQorICAgIDU0NTQzNTI3MlUsCS8vIFZTVUJQRHJtDQorICAgIDIwOTg5MDk1MlUsCS8vIFZTVUJQRHJyDQorICAgIDI0ODMwMzk4ODhVLAkvLyBWU1VCUFNZcm0NCisgICAgMjA5ODkwOTYwVSwJLy8gVlNVQlBTWXJyDQorICAgIDU0NTQzNTI4MFUsCS8vIFZTVUJQU3JtDQorICAgIDIwOTg5MDk2MFUsCS8vIFZTVUJQU3JyDQorICAgIDYxMjU0NDE1MlUsCS8vIFZTVUJTRHJtDQorICAgIDYxMjU0NDE1MlUsCS8vIFZTVUJTRHJtX0ludA0KKyAgICAyMDk4OTA5NjhVLAkvLyBWU1VCU0Rycg0KKyAgICAyMDk4OTA5NjhVLAkvLyBWU1VCU0Rycl9JbnQNCisgICAgNjc5NjUzMDI0VSwJLy8gVlNVQlNTcm0NCisgICAgNjc5NjUzMDI0VSwJLy8gVlNVQlNTcm1fSW50DQorICAgIDIwOTg5MDk3NlUsCS8vIFZTVUJTU3JyDQorICAgIDIwOTg5MDk3NlUsCS8vIFZTVUJTU3JyX0ludA0KKyAgICAyNjE3MjU3NjQwVSwJLy8gVlRFU1RQRFlybQ0KKyAgICAxMTQyOTkyNTUyVSwJLy8gVlRFU1RQRFlycg0KKyAgICAyMDgwMzg2NzI4VSwJLy8gVlRFU1RQRHJtDQorICAgIDExNDI5OTI1NTJVLAkvLyBWVEVTVFBEcnINCisgICAgMjYxNzI1NzY0OVUsCS8vIFZURVNUUFNZcm0NCisgICAgMTE0Mjk5MjU2MVUsCS8vIFZURVNUUFNZcnINCisgICAgMjA4MDM4NjczN1UsCS8vIFZURVNUUFNybQ0KKyAgICAxMTQyOTkyNTYxVSwJLy8gVlRFU1RQU3JyDQorICAgIDIxNTM3NzkyMzZVLAkvLyBWVUNPTUlTRHJtDQorICAgIDExNDI5ODQ3NDBVLAkvLyBWVUNPTUlTRHJyDQorICAgIDIyMjA4ODgxMTBVLAkvLyBWVUNPTUlTU3JtDQorICAgIDExNDI5ODQ3NTBVLAkvLyBWVUNPTUlTU3JyDQorICAgIDI0ODMwMzk5MzBVLAkvLyBWVU5QQ0tIUERZcm0NCisgICAgMjA5ODkxMDAyVSwJLy8gVlVOUENLSFBEWXJyDQorICAgIDU0NTQzNTMyMlUsCS8vIFZVTlBDS0hQRHJtDQorICAgIDIwOTg5MTAwMlUsCS8vIFZVTlBDS0hQRHJyDQorICAgIDI0ODMwMzk5NDFVLAkvLyBWVU5QQ0tIUFNZcm0NCisgICAgMjA5ODkxMDEzVSwJLy8gVlVOUENLSFBTWXJyDQorICAgIDU0NTQzNTMzM1UsCS8vIFZVTlBDS0hQU3JtDQorICAgIDIwOTg5MTAxM1UsCS8vIFZVTlBDS0hQU3JyDQorICAgIDI0ODMwMzk5NTJVLAkvLyBWVU5QQ0tMUERZcm0NCisgICAgMjA5ODkxMDI0VSwJLy8gVlVOUENLTFBEWXJyDQorICAgIDU0NTQzNTM0NFUsCS8vIFZVTlBDS0xQRHJtDQorICAgIDIwOTg5MTAyNFUsCS8vIFZVTlBDS0xQRHJyDQorICAgIDI0ODMwMzk5NjNVLAkvLyBWVU5QQ0tMUFNZcm0NCisgICAgMjA5ODkxMDM1VSwJLy8gVlVOUENLTFBTWXJyDQorICAgIDU0NTQzNTM1NVUsCS8vIFZVTlBDS0xQU3JtDQorICAgIDIwOTg5MTAzNVUsCS8vIFZVTlBDS0xQU3JyDQorICAgIDI0ODMwMzc4MDhVLAkvLyBWWE9SUERZcm0NCisgICAgMjA5ODg4ODgwVSwJLy8gVlhPUlBEWXJyDQorICAgIDU0NTQzMzIwMFUsCS8vIFZYT1JQRHJtDQorICAgIDIwOTg4ODg4MFUsCS8vIFZYT1JQRHJyDQorICAgIDI0ODMwMzc4MTZVLAkvLyBWWE9SUFNZcm0NCisgICAgMjA5ODg4ODg4VSwJLy8gVlhPUlBTWXJyDQorICAgIDU0NTQzMzIwOFUsCS8vIFZYT1JQU3JtDQorICAgIDIwOTg4ODg4OFUsCS8vIFZYT1JQU3JyDQorICAgIDEyMDA2VSwJLy8gVlpFUk9BTEwNCisgICAgMTIwMTVVLAkvLyBWWkVST1VQUEVSDQorICAgIDBVLAkvLyBWX1NFVDBQRA0KKyAgICAwVSwJLy8gVl9TRVQwUEkNCisgICAgMFUsCS8vIFZfU0VUMFBTDQorICAgIDBVLAkvLyBWX1NFVEFMTE9ORVMNCisgICAgMTIwMjZVLAkvLyBXQUlUDQorICAgIDEyMDMxVSwJLy8gV0JJTlZEDQorICAgIDE2MTY5MDUzNjlVLAkvLyBXSU5DQUxMNjRtDQorICAgIDE2ODQwMTQyNjJVLAkvLyBXSU5DQUxMNjRwY3JlbDMyDQorICAgIDczNDAxNDk3VSwJLy8gV0lOQ0FMTDY0cg0KKyAgICAxMjAzOFUsCS8vIFdSTVNSDQorICAgIDEzNTI3ODM0OFUsCS8vIFhBREQxNnJtDQorICAgIDExNDI5OTI2NTJVLAkvLyBYQUREMTZycg0KKyAgICAxMzUzNDM4OTFVLAkvLyBYQUREMzJybQ0KKyAgICAxMTQyOTkyNjU5VSwJLy8gWEFERDMycnINCisgICAgMTM1Mzc2NjY2VSwJLy8gWEFERDY0cm0NCisgICAgMTE0Mjk5MjY2NlUsCS8vIFhBREQ2NHJyDQorICAgIDEzNTQwOTQ0MVUsCS8vIFhBREQ4cm0NCisgICAgMTE0Mjk5MjY3M1UsCS8vIFhBREQ4cnINCisgICAgNjcxMjA5MzZVLAkvLyBYQ0hHMTZhcg0KKyAgICAxMTY3MTA5OTI4VSwJLy8gWENIRzE2cm0NCisgICAgMTE4MDcwODY0OFUsCS8vIFhDSEcxNnJyDQorICAgIDcwMjY2NjcxVSwJLy8gWENIRzMyYXINCisgICAgMTE2ODE1ODUxMVUsCS8vIFhDSEczMnJtDQorICAgIDExODA3MDg2NTVVLAkvLyBYQ0hHMzJycg0KKyAgICA3MTMxNTI1NFUsCS8vIFhDSEc2NGFyDQorICAgIDExNjkyMDcwOTRVLAkvLyBYQ0hHNjRybQ0KKyAgICAxMTgwNzA4NjYyVSwJLy8gWENIRzY0cnINCisgICAgMTE3MDI1NTY3N1UsCS8vIFhDSEc4cm0NCisgICAgMTE4MDcwODY2OVUsCS8vIFhDSEc4cnINCisgICAgNzM0MTI0MjBVLAkvLyBYQ0hfRg0KKyAgICAxMjEwNlUsCS8vIFhMQVQNCisgICAgNjcxMjA5NzZVLAkvLyBYT1IxNmkxNg0KKyAgICAxMzUyNzg0MTZVLAkvLyBYT1IxNm1pDQorICAgIDEzNTI3ODQxNlUsCS8vIFhPUjE2bWk4DQorICAgIDEzNTI3ODQxNlUsCS8vIFhPUjE2bXINCisgICAgMjAzNDY4NjI0VSwJLy8gWE9SMTZyaQ0KKyAgICAyMDM0Njg2MjRVLAkvLyBYT1IxNnJpOA0KKyAgICAyNzA1Nzc0ODhVLAkvLyBYT1IxNnJtDQorICAgIDIwMzQ2ODYyNFUsCS8vIFhPUjE2cnINCisgICAgMjAzNDY4NjI0VSwJLy8gWE9SMTZycl9SRVYNCisgICAgNzAyNjY3MTBVLAkvLyBYT1IzMmkzMg0KKyAgICAxMzUzNDM5NThVLAkvLyBYT1IzMm1pDQorICAgIDEzNTM0Mzk1OFUsCS8vIFhPUjMybWk4DQorICAgIDEzNTM0Mzk1OFUsCS8vIFhPUjMybXINCisgICAgMjAzNDY4NjMwVSwJLy8gWE9SMzJyaQ0KKyAgICAyMDM0Njg2MzBVLAkvLyBYT1IzMnJpOA0KKyAgICAzMzc2ODYzNThVLAkvLyBYT1IzMnJtDQorICAgIDIwMzQ2ODYzMFUsCS8vIFhPUjMycnINCisgICAgMjAzNDY4NjMwVSwJLy8gWE9SMzJycl9SRVYNCisgICAgNzEzMTUyOTJVLAkvLyBYT1I2NGkzMg0KKyAgICAxMzUzNzY3MzJVLAkvLyBYT1I2NG1pMzINCisgICAgMTM1Mzc2NzMyVSwJLy8gWE9SNjRtaTgNCisgICAgMTM1Mzc2NzMyVSwJLy8gWE9SNjRtcg0KKyAgICAyMDM0Njg2MzZVLAkvLyBYT1I2NHJpMzINCisgICAgMjAzNDY4NjM2VSwJLy8gWE9SNjRyaTgNCisgICAgNDA0Nzk1MjI4VSwJLy8gWE9SNjRybQ0KKyAgICAyMDM0Njg2MzZVLAkvLyBYT1I2NHJyDQorICAgIDIwMzQ2ODYzNlUsCS8vIFhPUjY0cnJfUkVWDQorICAgIDcyMzYzODc0VSwJLy8gWE9SOGk4DQorICAgIDEzNTQwOTUwNlUsCS8vIFhPUjhtaQ0KKyAgICAxMzU0MDk1MDZVLAkvLyBYT1I4bXINCisgICAgMjAzNDY4NjQyVSwJLy8gWE9SOHJpDQorICAgIDQ3MTkwNDA5OFUsCS8vIFhPUjhybQ0KKyAgICAyMDM0Njg2NDJVLAkvLyBYT1I4cnINCisgICAgMjAzNDY4NjQyVSwJLy8gWE9SOHJyX1JFVg0KKyAgICA1MzkwMDQyNTVVLAkvLyBYT1JQRHJtDQorICAgIDIwMzQ1OTkzNVUsCS8vIFhPUlBEcnINCisgICAgNTM5MDA0MjYyVSwJLy8gWE9SUFNybQ0KKyAgICAyMDM0NTk5NDJVLAkvLyBYT1JQU3JyDQorICAgIDBVDQorICB9Ow0KKw0KKyAgY29uc3QgY2hhciAqQXNtU3RycyA9IA0KKyAgICAiREJHX1ZBTFVFXDAwMGZhYnNcMDAwYWRjd1x0XDAwMGFkY2xcdFwwMDBhZGNxXHRcMDAwYWRjYlx0XDAwMGFkZHdcdFwwMDAiDQorICAgICJhZGRsXHRcMDAwYWRkcVx0XDAwMGFkZGJcdFwwMDBhZGRwZFx0XDAwMGFkZHBzXHRcMDAwYWRkc2RcdFwwMDBhZGRzc1x0XDAwMCINCisgICAgImFkZHN1YnBkXHRcMDAwYWRkc3VicHNcdFwwMDBmYWRkc1x0XDAwMGZhZGRsXHRcMDAwZmlhZGRzXHRcMDAwZmlhZGRsXHRcMDAwIg0KKyAgICAiZmFkZHBcdFwwMDBmYWRkXHRcMDAwZmFkZFx0JXN0KDApLCBcMDAwI0FESkNBTExTVEFDS0RPV05cMDAwI0FESkNBTExTVEEiDQorICAgICJDS1VQXDAwMGFlc2RlY2xhc3RcdFwwMDBhZXNkZWNcdFwwMDBhZXNlbmNsYXN0XHRcMDAwYWVzZW5jXHRcMDAwYWVzaW1jXHQiDQorICAgICJcMDAwYWVza2V5Z2VuYXNzaXN0XHRcMDAwYW5kd1x0XDAwMGFuZGxcdFwwMDBhbmRxXHRcMDAwYW5kYlx0XDAwMGFuZG5wZCINCisgICAgIlx0XDAwMGFuZG5wc1x0XDAwMGFuZHBkXHRcMDAwYW5kcHNcdFwwMDAjQVRPTUFERDY0MzIgUFNFVURPIVwwMDAjQVRPTUFOIg0KKyAgICAiRDE2IFBTRVVETyFcMDAwI0FUT01BTkQzMiBQU0VVRE8hXDAwMCNBVE9NQU5ENjQgUFNFVURPIVwwMDAjQVRPTUFORDY0MzIiDQorICAgICIgUFNFVURPIVwwMDAjQVRPTUFORDggUFNFVURPIVwwMDAjQVRPTU1BWDE2IFBTRVVETyFcMDAwI0FUT01NQVgzMiBQU0VVRCINCisgICAgIk8hXDAwMCNBVE9NTUFYNjQgUFNFVURPIVwwMDAjQVRPTU1JTjE2IFBTRVVETyFcMDAwI0FUT01NSU4zMiBQU0VVRE8hXDAwMCINCisgICAgIiNBVE9NTUlONjQgUFNFVURPIVwwMDAjQVRPTU5BTkQxNiBQU0VVRE8hXDAwMCNBVE9NTkFORDMyIFBTRVVETyFcMDAwI0FUIg0KKyAgICAiT01OQU5ENjQgUFNFVURPIVwwMDAjQVRPTU5BTkQ2NDMyIFBTRVVETyFcMDAwI0FUT01OQU5EOCBQU0VVRE8hXDAwMCNBVE8iDQorICAgICJNT1IxNiBQU0VVRE8hXDAwMCNBVE9NT1IzMiBQU0VVRE8hXDAwMCNBVE9NT1I2NCBQU0VVRE8hXDAwMCNBVE9NT1I2NDMyICINCisgICAgIlBTRVVETyFcMDAwI0FUT01PUjggUFNFVURPIVwwMDAjQVRPTVNVQjY0MzIgUFNFVURPIVwwMDAjQVRPTVNXQVA2NDMyIFBTIg0KKyAgICAiRVVETyFcMDAwI0FUT01VTUFYMTYgUFNFVURPIVwwMDAjQVRPTVVNQVgzMiBQU0VVRE8hXDAwMCNBVE9NVU1BWDY0IFBTRVUiDQorICAgICJETyFcMDAwI0FUT01VTUlOMTYgUFNFVURPIVwwMDAjQVRPTVVNSU4zMiBQU0VVRE8hXDAwMCNBVE9NVU1JTjY0IFBTRVVETyINCisgICAgIiFcMDAwI0FUT01YT1IxNiBQU0VVRE8hXDAwMCNBVE9NWE9SMzIgUFNFVURPIVwwMDAjQVRPTVhPUjY0IFBTRVVETyFcMDAwIg0KKyAgICAiI0FUT01YT1I2NDMyIFBTRVVETyFcMDAwI0FUT01YT1I4IFBTRVVETyFcMDAwYmxlbmRwZFx0XDAwMGJsZW5kcHNcdFwwMDAiDQorICAgICJibGVuZHZwZFx0JXhtbTAsIFwwMDBibGVuZHZwc1x0JXhtbTAsIFwwMDBic2Z3XHRcMDAwYnNmbFx0XDAwMGJzZnFcdFwwMDAiDQorICAgICJic3J3XHRcMDAwYnNybFx0XDAwMGJzcnFcdFwwMDBic3dhcGxcdFwwMDBic3dhcHFcdFwwMDBidHdcdFwwMDBidGxcdFwwMDAiDQorICAgICJidHFcdFwwMDBidGN3XHRcMDAwYnRjbFx0XDAwMGJ0Y3FcdFwwMDBidHJ3XHRcMDAwYnRybFx0XDAwMGJ0cnFcdFwwMDBidCINCisgICAgInN3XHRcMDAwYnRzbFx0XDAwMGJ0c3FcdFwwMDBjYWxsXHQqXDAwMGNhbGxxXHQqXDAwMGNhbGxxXHRcMDAwY2FsbHdcdFwwMDAiDQorICAgICJjYWxsXHRcMDAwY2J0d1wwMDBjbHRkXDAwMGNsdHFcMDAwZmNoc1wwMDBjbGNcMDAwY2xkXDAwMGNsZmx1c2hcdFwwMDBjbCINCisgICAgImlcMDAwY2x0c1wwMDBjbWNcMDAwY21vdmF3XHRcMDAwY21vdmFsXHRcMDAwY21vdmFxXHRcMDAwY21vdmFld1x0XDAwMGNtIg0KKyAgICAib3ZhZWxcdFwwMDBjbW92YWVxXHRcMDAwY21vdmJ3XHRcMDAwY21vdmJsXHRcMDAwY21vdmJxXHRcMDAwY21vdmJld1x0XDAwMCINCisgICAgImNtb3ZiZWxcdFwwMDBjbW92YmVxXHRcMDAwZmNtb3ZiZVx0XDAwMGZjbW92Ylx0XDAwMGNtb3Zld1x0XDAwMGNtb3ZlbFx0Ig0KKyAgICAiXDAwMGNtb3ZlcVx0XDAwMGZjbW92ZVx0XDAwMGNtb3Znd1x0XDAwMGNtb3ZnbFx0XDAwMGNtb3ZncVx0XDAwMGNtb3ZnZXciDQorICAgICJcdFwwMDBjbW92Z2VsXHRcMDAwY21vdmdlcVx0XDAwMGNtb3Zsd1x0XDAwMGNtb3ZsbFx0XDAwMGNtb3ZscVx0XDAwMGNtbyINCisgICAgInZsZXdcdFwwMDBjbW92bGVsXHRcMDAwY21vdmxlcVx0XDAwMGZjbW92bmJlXHRcMDAwZmNtb3ZuYlx0XDAwMGNtb3ZuZXdcdCINCisgICAgIlwwMDBjbW92bmVsXHRcMDAwY21vdm5lcVx0XDAwMGZjbW92bmVcdFwwMDBjbW92bm93XHRcMDAwY21vdm5vbFx0XDAwMGNtIg0KKyAgICAib3Zub3FcdFwwMDBjbW92bnB3XHRcMDAwY21vdm5wbFx0XDAwMGNtb3ZucHFcdFwwMDBmY21vdm51XHRcMDAwY21vdm5zd1x0Ig0KKyAgICAiXDAwMGNtb3Zuc2xcdFwwMDBjbW92bnNxXHRcMDAwY21vdm93XHRcMDAwY21vdm9sXHRcMDAwY21vdm9xXHRcMDAwY21vdnAiDQorICAgICJ3XHRcMDAwY21vdnBsXHRcMDAwY21vdnBxXHRcMDAwZmNtb3Z1XHQgXDAwMGNtb3Zzd1x0XDAwMGNtb3ZzbFx0XDAwMGNtbyINCisgICAgInZzcVx0XDAwMCNDTU9WX0ZSMzIgUFNFVURPIVwwMDAjQ01PVl9GUjY0IFBTRVVETyFcMDAwI0NNT1ZfR1IxNiogUFNFVURPIg0KKyAgICAiIVwwMDAjQ01PVl9HUjMyKiBQU0VVRE8hXDAwMCNDTU9WX0dSOCBQU0VVRE8hXDAwMCNDTU9WX1JGUDMyIFBTRVVETyFcMDAwIg0KKyAgICAiI0NNT1ZfUkZQNjQgUFNFVURPIVwwMDAjQ01PVl9SRlA4MCBQU0VVRE8hXDAwMCNDTU9WX1YxSTY0IFBTRVVETyFcMDAwI0MiDQorICAgICJNT1ZfVjJGNjQgUFNFVURPIVwwMDAjQ01PVl9WMkk2NCBQU0VVRE8hXDAwMCNDTU9WX1Y0RjMyIFBTRVVETyFcMDAwY21wdyINCisgICAgIlx0XDAwMGNtcGxcdFwwMDBjbXBxXHRcMDAwY21wYlx0XDAwMGNtcFwwMDBjbXBwZFx0XDAwMGNtcHBzXHRcMDAwY21wc3dcMDAwIg0KKyAgICAiY21wc2xcMDAwY21wc3FcMDAwY21wc2JcMDAwY21wc2RcdFwwMDBjbXBzc1x0XDAwMGNtcHhjaGcxNmJcdFwwMDBjbXB4Y2giDQorICAgICJnd1x0XDAwMGNtcHhjaGdsXHRcMDAwY21weGNoZ3FcdFwwMDBjbXB4Y2hnOGJcdFwwMDBjbXB4Y2hnYlx0XDAwMGNvbWlzZCINCisgICAgIlx0XDAwMGNvbWlzc1x0XDAwMGZjb21wXHRcMDAwZmNvbWlwXHRcMDAwZmNvbWlcdFwwMDBmY29tXHRcMDAwZmNvc1wwMDBjIg0KKyAgICAicHVpZFwwMDBjcXRvXDAwMGNyYzMydyBcdFwwMDBjcmMzMmwgXHRcMDAwY3JjMzJiIFx0XDAwMGNyYzMycSBcdFwwMDBjc1wwMDAiDQorICAgICJjdnRkcTJwZFx0XDAwMGN2dGRxMnBzXHRcMDAwY3Z0cGQyZHFcdFwwMDBjdnRwZDJwc1x0XDAwMGN2dHBzMmRxXHRcMDAwYyINCisgICAgInZ0cHMycGRcdFwwMDBjdnRzZDJzaXFcMDAwY3Z0c2Qyc3NcdFwwMDBjdnRzaTJzZHFcdFwwMDBjdnRzaTJzZFx0XDAwMGN2Ig0KKyAgICAidHNpMnNzcVx0XDAwMGN2dHNpMnNzXHRcMDAwY3Z0c3Myc2RcdFwwMDBjdnRzczJzaXFcdFwwMDBjdnRzczJzaWxcdFwwMDAiDQorICAgICJjdnR0cHMyZHFcdFwwMDBjdnR0c2Qyc2lxXHRcMDAwY3Z0dHNkMnNpXHRcMDAwY3Z0dHNzMnNpcVx0XDAwMGN2dHRzczJzaSINCisgICAgIlx0XDAwMGN3dGRcMDAwY3d0bFwwMDBkZWN3XHRcMDAwZGVjbFx0XDAwMGRlY3FcdFwwMDBkZWNiXHRcMDAwZGl2d1x0XDAwMCINCisgICAgImRpdmxcdFwwMDBkaXZxXHRcMDAwZGl2Ylx0XDAwMGRpdnBkXHRcMDAwZGl2cHNcdFwwMDBmZGl2cnNcdFwwMDBmZGl2cmxcdCINCisgICAgIlwwMDBmaWRpdnJzXHRcMDAwZmlkaXZybFx0XDAwMGZkaXZwXHRcMDAwZmRpdnJcdFwwMDBmZGl2XHQlc3QoMCksIFwwMDBkIg0KKyAgICAiaXZzZFx0XDAwMGRpdnNzXHRcMDAwZmRpdnNcdFwwMDBmZGl2bFx0XDAwMGZpZGl2c1x0XDAwMGZpZGl2bFx0XDAwMGZkaXYiDQorICAgICJycFx0XDAwMGZkaXZcdFwwMDBmZGl2clx0JXN0KDApLCBcMDAwZHBwZFx0XDAwMGRwcHNcdFwwMDBkc1wwMDByZXRcdCNlaCINCisgICAgIl9yZXR1cm4sIGFkZHI6IFwwMDBlbnRlclx0XDAwMGVzXDAwMGV4dHJhY3Rwc1x0XDAwMGYyeG0xXDAwMGxjYWxsd1x0XDAwMCINCisgICAgImxjYWxsd1x0KlwwMDBsY2FsbGxcdFwwMDBsY2FsbGxcdCpcMDAwbGNhbGxxXHQqXDAwMGxqbXB3XHRcMDAwbGptcHdcdCpcMDAwIg0KKyAgICAibGptcGxcdFwwMDBsam1wbFx0KlwwMDBsam1wcVx0KlwwMDBmYmxkXHRcMDAwZmJzdHBcdFwwMDBmY29tc1x0XDAwMGZjb20iDQorICAgICJsXHRcMDAwZmNvbXBzXHRcMDAwZmNvbXBsXHRcMDAwZmNvbXBwXDAwMGZkZWNzdHBcMDAwZmZyZWVcdFwwMDBmaWNvbXNcdCINCisgICAgIlwwMDBmaWNvbWxcdFwwMDBmaWNvbXBzXHRcMDAwZmljb21wbFx0XDAwMGZpbmNzdHBcMDAwZmxkY3dcdFwwMDBmbGRlbnZcdCINCisgICAgIlwwMDBmbGRsMmVcMDAwZmxkbDJ0XDAwMGZsZGxnMlwwMDBmbGRsbjJcMDAwZmxkcGlcMDAwZm5jbGV4XDAwMGZuaW5pdFwwMDAiDQorICAgICJmbm9wXDAwMGZuc3Rjd1x0XDAwMGZuc3RzdyAlYXhcMDAwZm5zdHN3XHRcMDAwIyNGUDMyX1RPX0lOVDE2X0lOX01FTSBQUyINCisgICAgIkVVRE8hXDAwMCMjRlAzMl9UT19JTlQzMl9JTl9NRU0gUFNFVURPIVwwMDAjI0ZQMzJfVE9fSU5UNjRfSU5fTUVNIFBTRVVEIg0KKyAgICAiTyFcMDAwIyNGUDY0X1RPX0lOVDE2X0lOX01FTSBQU0VVRE8hXDAwMCMjRlA2NF9UT19JTlQzMl9JTl9NRU0gUFNFVURPIVwwMDAiDQorICAgICIjI0ZQNjRfVE9fSU5UNjRfSU5fTUVNIFBTRVVETyFcMDAwIyNGUDgwX1RPX0lOVDE2X0lOX01FTSBQU0VVRE8hXDAwMCMjRiINCisgICAgIlA4MF9UT19JTlQzMl9JTl9NRU0gUFNFVURPIVwwMDAjI0ZQODBfVE9fSU5UNjRfSU5fTUVNIFBTRVVETyFcMDAwZnBhdGFuIg0KKyAgICAiXDAwMGZwcmVtXDAwMGZwcmVtMVwwMDBmcHRhblwwMDBmcm5kaW50XDAwMGZyc3Rvclx0XDAwMGZuc2F2ZVx0XDAwMGZzY2EiDQorICAgICJsZVwwMDBmc2luY29zXDAwMGZuc3RlbnZcdFwwMDBtb3ZsXHQlZnM6XDAwMGZzXDAwMGZ4YW1cMDAwZnhyc3Rvclx0XDAwMCINCisgICAgImZ4c2F2ZVx0XDAwMGZ4dHJhY3RcMDAwZnlsMnhcMDAwZnlsMnhwMVwwMDBtb3ZhcGRcdFwwMDBtb3ZhcHNcdFwwMDBvcnBkIg0KKyAgICAiXHRcMDAwb3Jwc1x0XDAwMHhvcnBkXHRcMDAweG9ycHNcdFwwMDBtb3ZsXHQlZ3M6XDAwMGdzXDAwMGhhZGRwZFx0XDAwMGgiDQorICAgICJhZGRwc1x0XDAwMGhsdFwwMDBoc3VicGRcdFwwMDBoc3VicHNcdFwwMDBpZGl2d1x0XDAwMGlkaXZsXHRcMDAwaWRpdnFcdCINCisgICAgIlwwMDBpZGl2Ylx0XDAwMGZpbGRzXHRcMDAwZmlsZGxcdFwwMDBmaWxkbGxcdFwwMDBpbXVsd1x0XDAwMGltdWxsXHRcMDAwIg0KKyAgICAiaW11bHFcdFwwMDBpbXVsYlx0XDAwMGluc3dcMDAwaW53XHRcMDAwaW53XHQlZHgsICVheFwwMDBpbnNsXDAwMGlubFx0XDAwMCINCisgICAgImlubFx0JWR4LCAlZWF4XDAwMGluc2JcMDAwaW5iXHRcMDAwaW5iXHQlZHgsICVhbFwwMDBpbmN3XHRcMDAwaW5jbFx0XDAwMCINCisgICAgImluY3FcdFwwMDBpbmNiXHRcMDAwaW5zZXJ0cHNcdFwwMDBpbnRcdFwwMDBpbnQzXDAwMGludG9cMDAwaW52ZFwwMDBpbnZlIg0KKyAgICAicHRcMDAwaW52bHBnXHRcMDAwaW52dnBpZFwwMDBpcmV0d1wwMDBpcmV0bFwwMDBpcmV0cVwwMDBmaXN0dHBzXHRcMDAwZmkiDQorICAgICJzdHRwbFx0XDAwMGZpc3R0cGxsXHRcMDAwZmlzdHNcdFwwMDBmaXN0bFx0XDAwMGZpc3Rwc1x0XDAwMGZpc3RwbFx0XDAwMCINCisgICAgImZpc3RwbGxcdFwwMDBjdnRwZDJwaVx0XDAwMGN2dHBpMnBkXHRcMDAwY3Z0cGkycHNcdFwwMDBjdnRwczJwaVx0XDAwMGN2Ig0KKyAgICAidHNkMnNpXHRcMDAwY3Z0c3Myc2lcdFwwMDBjdnR0cGQyZHFcdFwwMDBjdnR0cGQycGlcdFwwMDBjdnR0cHMycGlcdFwwMDAiDQorICAgICIjTUVNQkFSUklFUlwwMDBsb2NrXG5cdG9ybFx0XDAwMGxvY2tcblx0b3JxXHRcMDAwdWNvbWlzZFx0XDAwMHVjb21pc3NcdCINCisgICAgIlwwMDB2Y21wXDAwMHZjb21pc2RcdFwwMDB2Y29taXNzXHRcMDAwdmN2dGRxMnBkXHRcMDAwdmN2dGRxMnBzXHRcMDAwdmN2Ig0KKyAgICAidHBkMmRxXHRcMDAwdmN2dHBkMnBzXHRcMDAwdmN2dHBzMmRxXHRcMDAwdmN2dHBzMnBkXHRcMDAwdmN2dHNkMnNpXHRcMDAwIg0KKyAgICAidmN2dHNkMnNzXHRcMDAwdmN2dHNpMnNkXHRcMDAwdmN2dHNpMnNzXHRcMDAwdmN2dHNzMnNkXHRcMDAwdmN2dHNzMnNpXHQiDQorICAgICJcMDAwdmN2dHRwZDJkcVx0XDAwMHZjdnR0cHMyZHFcdFwwMDB2Y3Z0dHNzMnNpXHRcMDAwdnVjb21pc2RcdFwwMDB2dWNvbSINCisgICAgImlzc1x0XDAwMGphZVx0XDAwMGphXHRcMDAwamJlXHRcMDAwamJcdFwwMDBqY3h6XHRcMDAwamVcdFwwMDBqZ2VcdFwwMDBqIg0KKyAgICAiZ1x0XDAwMGpsZVx0XDAwMGpsXHRcMDAwam1wbFx0KlwwMDBqbXBxXHQqXDAwMGptcHFcdFwwMDBqbXBcdFwwMDBqbmVcdFwwMDAiDQorICAgICJqbm9cdFwwMDBqbnBcdFwwMDBqbnNcdFwwMDBqb1x0XDAwMGpwXHRcMDAwanNcdFwwMDBsYWhmXDAwMGxhcndcdFwwMDBsYSINCisgICAgInJsXHRcMDAwbGFycVx0XDAwMGxvY2tcblx0Y21weGNoZ3dcdFwwMDBsb2NrXG5cdGNtcHhjaGdsXHRcMDAwbG9ja1xuXHRjIg0KKyAgICAibXB4Y2hncVx0XDAwMGxvY2tcblx0Y21weGNoZ2JcdFwwMDBsb2NrXG5cdGNtcHhjaGc4Ylx0XDAwMGxkZHF1XHRcMDAwbGQiDQorICAgICJteGNzclx0XDAwMGxkc3dcdFwwMDBsZHNsXHRcMDAwZmxkelwwMDBmbGQxXDAwMGZsZHNcdFwwMDBmbGRsXHRcMDAwZmxkdCINCisgICAgIlx0XDAwMGZsZFx0XDAwMGxlYXdcdFwwMDBsZWFsXHRcMDAwbGVhcVx0XDAwMGxlYXZlXDAwMGxlc3dcdFwwMDBsZXNsXHRcMDAwIg0KKyAgICAibGZlbmNlXDAwMGxmc3dcdFwwMDBsZnNsXHRcMDAwbGZzcVx0XDAwMGxnZHRcdFwwMDBsZ3N3XHRcMDAwbGdzbFx0XDAwMGwiDQorICAgICJnc3FcdFwwMDBsaWR0XHRcMDAwbGxkdHdcdFwwMDBsbXN3d1x0XDAwMGxvY2tcblx0YWRkd1x0XDAwMGxvY2tcblx0YWRkbCINCisgICAgIlx0XDAwMGxvY2tcblx0YWRkcVx0XDAwMGxvY2tcblx0YWRkYlx0XDAwMGxvY2tcblx0ZGVjd1x0XDAwMGxvY2tcblx0ZGVjIg0KKyAgICAibFx0XDAwMGxvY2tcblx0ZGVjcVx0XDAwMGxvY2tcblx0ZGVjYlx0XDAwMGxvY2tcblx0aW5jd1x0XDAwMGxvY2tcblx0aW4iDQorICAgICJjbFx0XDAwMGxvY2tcblx0aW5jcVx0XDAwMGxvY2tcblx0aW5jYlx0XDAwMGxvY2tcMDAwbG9ja1xuXHRzdWJ3XHRcMDAwbCINCisgICAgIm9ja1xuXHRzdWJsXHRcMDAwbG9ja1xuXHRzdWJxXHRcMDAwbG9ja1xuXHRzdWJiXHRcMDAwbG9kc2JcMDAwbG9kc2xcMDAwIg0KKyAgICAibG9kc3FcMDAwbG9kc3dcMDAwbG9vcFx0XDAwMGxvb3BlXHRcMDAwbG9vcG5lXHRcMDAwbHJldFwwMDBscmV0XHRcMDAwbHMiDQorICAgICJsd1x0XDAwMGxzbGxcdFwwMDBsc2xxXHRcMDAwbHNzd1x0XDAwMGxzc2xcdFwwMDBsc3NxXHRcMDAwbHRyd1x0XDAwMGxvYyINCisgICAgImtcblx0eGFkZHdcdFwwMDBsb2NrXG5cdHhhZGRsXHRcMDAwbG9ja1xuXHR4YWRkXHRcMDAwbG9ja1xuXHR4YWRkYlx0XDAwMCINCisgICAgIm1hc2ttb3ZkcXVcdFwwMDBtYXhwZFx0XDAwMG1heHBzXHRcMDAwbWF4c2RcdFwwMDBtYXhzc1x0XDAwMG1mZW5jZVwwMDAjIg0KKyAgICAiIGR5bmFtaWMgc3RhY2sgYWxsb2NhdGlvblwwMDBtaW5wZFx0XDAwMG1pbnBzXHRcMDAwbWluc2RcdFwwMDBtaW5zc1x0XDAwMCINCisgICAgImVtbXNcMDAwZmVtbXNcMDAwbWFza21vdnFcdFwwMDBtb3ZkXHRcMDAwbW92ZHEycVx0XDAwMG1vdm50cVx0XDAwMG1vdnEyIg0KKyAgICAiZHFcdFwwMDBtb3ZxXHRcMDAwcGFja3NzZHdcdFwwMDBwYWNrc3N3Ylx0XDAwMHBhY2t1c3diXHRcMDAwcGFkZGJcdFwwMDAiDQorICAgICJwYWRkZFx0XDAwMHBhZGRxXHRcMDAwcGFkZHNiXHRcMDAwcGFkZHN3XHRcMDAwcGFkZHVzYlx0XDAwMHBhZGR1c3dcdFwwMDAiDQorICAgICJwYWRkd1x0XDAwMHBhbmRuXHRcMDAwcGFuZFx0XDAwMHBhdmdiXHRcMDAwcGF2Z3dcdFwwMDBwY21wZXFiXHRcMDAwcGNtcCINCisgICAgImVxZFx0XDAwMHBjbXBlcXdcdFwwMDBwY21wZ3RiXHRcMDAwcGNtcGd0ZFx0XDAwMHBjbXBndHdcdFwwMDBwZXh0cndcdFwwMDAiDQorICAgICJwaW5zcndcdFwwMDBwbWFkZHdkXHRcMDAwcG1heHN3XHRcMDAwcG1heHViXHRcMDAwcG1pbnN3XHRcMDAwcG1pbnViXHRcMDAwIg0KKyAgICAicG1vdm1za2JcdFwwMDBwbXVsaHV3XHRcMDAwcG11bGh3XHRcMDAwcG11bGx3XHRcMDAwcG11bHVkcVx0XDAwMHBvclx0XDAwMCINCisgICAgInBzYWRid1x0XDAwMHBzaHVmd1x0XDAwMHBzbGxkXHRcMDAwcHNsbHFcdFwwMDBwc2xsd1x0XDAwMHBzcmFkXHRcMDAwcHNyIg0KKyAgICAiYXdcdFwwMDBwc3JsZFx0XDAwMHBzcmxxXHRcMDAwcHNybHdcdFwwMDBwc3ViYlx0XDAwMHBzdWJkXHRcMDAwcHN1YnFcdFwwMDAiDQorICAgICJwc3Vic2JcdFwwMDBwc3Vic3dcdFwwMDBwc3VidXNiXHRcMDAwcHN1YnVzd1x0XDAwMHBzdWJ3XHRcMDAwcHVucGNraGJ3XHQiDQorICAgICJcMDAwcHVucGNraGRxXHRcMDAwcHVucGNraHdkXHRcMDAwcHVucGNrbGJ3XHRcMDAwcHVucGNrbGRxXHRcMDAwcHVucGNrbCINCisgICAgIndkXHRcMDAwcHhvclx0XDAwMG1vbml0b3JcMDAwbW92d1x0JWF4LCBcMDAwbW92d1x0XDAwMG1vdmxcdCVlYXgsIFwwMDBtIg0KKyAgICAib3ZsXHRcMDAwbW92cVx0JWZzOlwwMDBtb3ZxXHQlZ3M6XDAwMG1vdnFcdCVyYXgsIFwwMDBtb3ZhYnNxXHRcMDAwbW92Ylx0Ig0KKyAgICAiJWFsLCBcMDAwbW92Ylx0XDAwMG1vdmRkdXBcdFwwMDBtb3ZkcWFcdFwwMDBtb3ZkcXVcdFwwMDBtb3ZobHBzXHRcMDAwbW8iDQorICAgICJ2aHBkXHRcMDAwbW92aHBzXHRcMDAwbW92bGhwc1x0XDAwMG1vdmxwZFx0XDAwMG1vdmxwc1x0XDAwMG1vdm1za3BkXHRcMDAwIg0KKyAgICAibW92bXNrcHNcdFwwMDBtb3ZudGRxYVx0XDAwMG1vdm50ZHFcdFwwMDBtb3ZudGlcdFwwMDBtb3ZudHBkXHRcMDAwbW92bnQiDQorICAgICJwc1x0XDAwMG1vdnNiXDAwMG1vdnNsXDAwMG1vdnNkXHRcMDAwbW92c2hkdXBcdFwwMDBtb3ZzbGR1cFx0XDAwMG1vdnNxXDAwMCINCisgICAgIm1vdnNzXHRcMDAwbW92c3dcMDAwbW92c2J3XHRcMDAwbW92c3dsXHRcMDAwbW92c2JsXHRcMDAwbW92c3dxXHRcMDAwbW92Ig0KKyAgICAic2xxXHRcMDAwbW92c2JxXHRcMDAwbW92dXBkXHRcMDAwbW92dXBzXHRcMDAwbW92emJ3XHRcMDAwbW92emJsXHRcMDAwbW8iDQorICAgICJ2endsXHRcMDAwbW92endxXHRcMDAwbW92emJxXHRcMDAwbXBzYWRid1x0XDAwMG11bHdcdFwwMDBtdWxsXHRcMDAwbXVscSINCisgICAgIlx0XDAwMG11bGJcdFwwMDBtdWxwZFx0XDAwMG11bHBzXHRcMDAwbXVsc2RcdFwwMDBtdWxzc1x0XDAwMGZtdWxzXHRcMDAwIg0KKyAgICAiZm11bGxcdFwwMDBmaW11bHNcdFwwMDBmaW11bGxcdFwwMDBmbXVscFx0XDAwMGZtdWxcdFwwMDBmbXVsXHQlc3QoMCksIFwwMDAiDQorICAgICJtd2FpdFwwMDBuZWd3XHRcMDAwbmVnbFx0XDAwMG5lZ3FcdFwwMDBuZWdiXHRcMDAwbm9wXDAwMG5vcGxcdFwwMDBub3B3XHQiDQorICAgICJcMDAwbm90d1x0XDAwMG5vdGxcdFwwMDBub3RxXHRcMDAwbm90Ylx0XDAwMG9yd1x0XDAwMG9ybFx0XDAwMG9ycVx0XDAwMCINCisgICAgIm9yYlx0XDAwMG91dHdcdCVheCwgXDAwMG91dHdcdCVheCwgJWR4XDAwMG91dGxcdCVlYXgsIFwwMDBvdXRsXHQlZWF4LCAlIg0KKyAgICAiZHhcMDAwb3V0Ylx0JWFsLCBcMDAwb3V0Ylx0JWFsLCAlZHhcMDAwb3V0c2JcMDAwb3V0c2xcMDAwb3V0c3dcMDAwcGFic2IiDQorICAgICJcdFwwMDBwYWJzZFx0XDAwMHBhYnN3XHRcMDAwcGFja3VzZHdcdFwwMDBwYWxpZ25yXHRcMDAwcGF1c2VcMDAwcGJsZW5kdiINCisgICAgImJcdCV4bW0wLCBcMDAwcGJsZW5kd1x0XDAwMHBjbXBlcXFcdFwwMDBwY21wZXN0cmlcdFwwMDAjUENNUEVTVFJNMTI4cm0gIg0KKyAgICAiUFNFVURPXDAwMCNQQ01QRVNUUk0xMjhyciBQU0VVRE9cMDAwcGNtcGVzdHJtXHRcMDAwcGNtcGd0cVx0XDAwMHBjbXBpc3QiDQorICAgICJyaVx0XDAwMCNQQ01QSVNUUk0xMjhybSBQU0VVRE9cMDAwI1BDTVBJU1RSTTEyOHJyIFBTRVVET1wwMDBwY21waXN0cm1cdCINCisgICAgIlwwMDBwZXh0cmJcdFwwMDBwZXh0cmRcdFwwMDBwZXh0cnFcdFwwMDBwaGFkZGRcdFwwMDBwaGFkZHN3XHRcMDAwcGhhZGR3Ig0KKyAgICAiXHRcMDAwcGhtaW5wb3N1d1x0XDAwMHBoc3ViZFx0XDAwMHBoc3Vic3dcdFwwMDBwaHN1YndcdFwwMDBwaW5zcmJcdFwwMDAiDQorICAgICJwaW5zcmRcdFwwMDBwaW5zcnFcdFwwMDBwbWFkZHVic3dcdFwwMDBwbWF4c2JcdFwwMDBwbWF4c2RcdFwwMDBwbWF4dWRcdCINCisgICAgIlwwMDBwbWF4dXdcdFwwMDBwbWluc2JcdFwwMDBwbWluc2RcdFwwMDBwbWludWRcdFwwMDBwbWludXdcdFwwMDBwbW92c3hiIg0KKyAgICAiZFx0XDAwMHBtb3ZzeGJxXHRcMDAwcG1vdnN4YndcdFwwMDBwbW92c3hkcVx0XDAwMHBtb3ZzeHdkXHRcMDAwcG1vdnN4d3EiDQorICAgICJcdFwwMDBwbW92enhiZFx0XDAwMHBtb3Z6eGJxXHRcMDAwcG1vdnp4YndcdFwwMDBwbW92enhkcVx0XDAwMHBtb3Z6eHdkXHQiDQorICAgICJcMDAwcG1vdnp4d3FcdFwwMDBwbXVsZHFcdFwwMDBwbXVsaHJzd1x0XDAwMHBtdWxsZFx0XDAwMHBvcHdcdFwwMDBwb3BsXHQiDQorICAgICJcMDAwcG9wcVx0XDAwMHBvcGFsXDAwMHBvcGNudHdcdFwwMDBwb3BjbnRsXHRcMDAwcG9wY250cVx0XDAwMHBvcGZ3XDAwMCINCisgICAgInBvcGZsXDAwMHBvcGZxXDAwMHBvcHdcdCVmc1wwMDBwb3BsXHQlZnNcMDAwcG9wcVx0JWZzXDAwMHBvcHdcdCVnc1wwMDBwIg0KKyAgICAib3BsXHQlZ3NcMDAwcG9wcVx0JWdzXDAwMHByZWZldGNobnRhXHRcMDAwcHJlZmV0Y2h0MFx0XDAwMHByZWZldGNodDFcdFwwMDAiDQorICAgICJwcmVmZXRjaHQyXHRcMDAwcHNodWZiXHRcMDAwcHNodWZkXHRcMDAwcHNodWZod1x0XDAwMHBzaHVmbHdcdFwwMDBwc2lnbiINCisgICAgImJcdFwwMDBwc2lnbmRcdFwwMDBwc2lnbndcdFwwMDBwc2xsZHFcdFwwMDBwc3JsZHFcdFwwMDBwdGVzdCBcdFwwMDBwdW5wIg0KKyAgICAiY2tocWRxXHRcMDAwcHVucGNrbHFkcVx0XDAwMHB1c2h3XHRcMDAwcHVzaGxcdFwwMDBwdXNocVx0XDAwMHB1c2hhbFwwMDAiDQorICAgICJwdXNoZndcMDAwcHVzaGZsXDAwMHB1c2hmcVwwMDBwdXNod1x0JWZzXDAwMHB1c2hsXHQlZnNcMDAwcHVzaHFcdCVmc1wwMDAiDQorICAgICJwdXNod1x0JWdzXDAwMHB1c2hsXHQlZ3NcMDAwcHVzaHFcdCVnc1wwMDByY2x3XHQxLCBcMDAwcmNsd1x0JWNsLCBcMDAwciINCisgICAgImNsd1x0XDAwMHJjbGxcdDEsIFwwMDByY2xsXHQlY2wsIFwwMDByY2xsXHRcMDAwcmNscVx0MSwgXDAwMHJjbHFcdCVjbCwgIg0KKyAgICAiXDAwMHJjbHFcdFwwMDByY2xiXHQxLCBcMDAwcmNsYlx0JWNsLCBcMDAwcmNsYlx0XDAwMHJjcHBzXHRcMDAwcmNwc3NcdFwwMDAiDQorICAgICJyY3J3XHQxLCBcMDAwcmNyd1x0JWNsLCBcMDAwcmNyd1x0XDAwMHJjcmxcdDEsIFwwMDByY3JsXHQlY2wsIFwwMDByY3JsXHQiDQorICAgICJcMDAwcmNycVx0MSwgXDAwMHJjcnFcdCVjbCwgXDAwMHJjcnFcdFwwMDByY3JiXHQxLCBcMDAwcmNyYlx0JWNsLCBcMDAwciINCisgICAgImNyYlx0XDAwMHJkbXNyXDAwMHJkcG1jXDAwMHJkdHNjXDAwMHJkdHNjcFwwMDByZXBuZVwwMDByZXA7bW92c2JcMDAwcmVwIg0KKyAgICAiO21vdnNsXDAwMHJlcDttb3ZzcVwwMDByZXA7bW92c3dcMDAwcmVwXDAwMHJlcDtzdG9zYlwwMDByZXA7c3Rvc2xcMDAwcmUiDQorICAgICJwO3N0b3NxXDAwMHJlcDtzdG9zd1wwMDByZXRcMDAwcmV0XHRcMDAwcm9sd1x0XDAwMHJvbHdcdCVjbCwgXDAwMHJvbGxcdCINCisgICAgIlwwMDByb2xsXHQlY2wsIFwwMDByb2xxXHRcMDAwcm9scVx0JWNsLCBcMDAwcm9sYlx0XDAwMHJvbGJcdCVjbCwgXDAwMHJvIg0KKyAgICAicndcdFwwMDByb3J3XHQlY2wsIFwwMDByb3JsXHRcMDAwcm9ybFx0JWNsLCBcMDAwcm9ycVx0XDAwMHJvcnFcdCVjbCwgXDAwMCINCisgICAgInJvcmJcdFwwMDByb3JiXHQlY2wsIFwwMDByb3VuZHBkXHRcMDAwcm91bmRwc1x0XDAwMHJvdW5kc2RcdFwwMDByb3VuZHNzIg0KKyAgICAiXHRcMDAwcnNtXDAwMHJzcXJ0cHNcdFwwMDByc3FydHNzXHRcMDAwc2FoZlwwMDBzYXJ3XHRcMDAwc2Fyd1x0JWNsLCBcMDAwIg0KKyAgICAic2FybFx0XDAwMHNhcmxcdCVjbCwgXDAwMHNhcnFcdFwwMDBzYXJxXHQlY2wsIFwwMDBzYXJiXHRcMDAwc2FyYlx0JWNsLCAiDQorICAgICJcMDAwc2Jid1x0XDAwMHNiYmxcdFwwMDBzYmJxXHRcMDAwc2JiYlx0XDAwMHNjYXN3XDAwMHNjYXNsXDAwMHNjYXNxXDAwMCINCisgICAgInNjYXNiXDAwMHNldGFlXHRcMDAwc2V0YVx0XDAwMHNldGJlXHRcMDAwc2V0Ylx0XDAwMHNldGVcdFwwMDBzZXRnZVx0XDAwMCINCisgICAgInNldGdcdFwwMDBzZXRsZVx0XDAwMHNldGxcdFwwMDBzZXRuZVx0XDAwMHNldG5vXHRcMDAwc2V0bnBcdFwwMDBzZXRuc1x0Ig0KKyAgICAiXDAwMHNldG9cdFwwMDBzZXRwXHRcMDAwc2V0c1x0XDAwMHNmZW5jZVwwMDBzZ2R0XHRcMDAwc2hsd1x0XDAwMHNobHdcdCUiDQorICAgICJjbCwgXDAwMHNobGxcdFwwMDBzaGxsXHQlY2wsIFwwMDBzaGxxXHRcMDAwc2hscVx0JWNsLCBcMDAwc2hsYlx0XDAwMHNobCINCisgICAgImJcdCVjbCwgXDAwMHNobGR3XHQlY2wsIFwwMDBzaGxkd1x0XDAwMHNobGRsXHQlY2wsIFwwMDBzaGxkbFx0XDAwMHNobGRxIg0KKyAgICAiXHQlY2wsIFwwMDBzaGxkcVx0XDAwMHNocndcdFwwMDBzaHJ3XHQlY2wsIFwwMDBzaHJsXHRcMDAwc2hybFx0JWNsLCBcMDAwIg0KKyAgICAic2hycVx0XDAwMHNocnFcdCVjbCwgXDAwMHNocmJcdFwwMDBzaHJiXHQlY2wsIFwwMDBzaHJkd1x0JWNsLCBcMDAwc2hyZHciDQorICAgICJcdFwwMDBzaHJkbFx0JWNsLCBcMDAwc2hyZGxcdFwwMDBzaHJkcVx0JWNsLCBcMDAwc2hyZHFcdFwwMDBzaHVmcGRcdFwwMDAiDQorICAgICJzaHVmcHNcdFwwMDBzaWR0XHRcMDAwZnNpblwwMDBzbGR0d1x0XDAwMHNsZHRxXHRcMDAwc21zd3dcdFwwMDBzbXN3bFx0XDAwMCINCisgICAgInNtc3dxXHRcMDAwc3FydHBkXHRcMDAwc3FydHBzXHRcMDAwc3FydHNkXHRcMDAwc3FydHNzXHRcMDAwZnNxcnRcMDAwc3NcMDAwIg0KKyAgICAic3RjXDAwMHN0ZFwwMDBzdGlcMDAwc3RteGNzclx0XDAwMHN0b3NiXDAwMHN0b3NsXDAwMHN0b3NxXDAwMHN0b3N3XDAwMHMiDQorICAgICJ0cndcdFwwMDBmc3RzXHRcMDAwZnN0bFx0XDAwMGZzdHBzXHRcMDAwZnN0cGxcdFwwMDBmc3RwdFx0XDAwMGZzdHBcdFwwMDAiDQorICAgICJmc3RcdFwwMDBzdWJ3XHRcMDAwc3VibFx0XDAwMHN1YnFcdFwwMDBzdWJiXHRcMDAwc3VicGRcdFwwMDBzdWJwc1x0XDAwMCINCisgICAgImZzdWJyc1x0XDAwMGZzdWJybFx0XDAwMGZpc3VicnNcdFwwMDBmaXN1YnJsXHRcMDAwZnN1YnBcdFwwMDBmc3Viclx0XDAwMCINCisgICAgImZzdWJcdCVzdCgwKSwgXDAwMHN1YnNkXHRcMDAwc3Vic3NcdFwwMDBmc3Vic1x0XDAwMGZzdWJsXHRcMDAwZmlzdWJzXHRcMDAwIg0KKyAgICAiZmlzdWJsXHRcMDAwZnN1YnJwXHRcMDAwZnN1Ylx0XDAwMGZzdWJyXHQlc3QoMCksIFwwMDBzd2FwZ3NcMDAwc3lzY2FsbFwwMDAiDQorICAgICJzeXNlbnRlclwwMDBzeXNleGl0XDAwMHN5c3JldFwwMDAjVENfUkVUVVJOIFwwMDB0ZXN0d1x0XDAwMHRlc3RsXHRcMDAwdCINCisgICAgImVzdHFcdFwwMDB0ZXN0Ylx0XDAwMCMgVExTQ2FsbF8zMlwwMDAjIFRMU0NhbGxfNjRcMDAwLmJ5dGVcdDB4NjY7IGxlYXFcdCINCisgICAgIlwwMDB1ZDJcMDAwZnRzdFwwMDBmdWNvbWlwXHRcMDAwZnVjb21pXHRcMDAwZnVjb21wcFwwMDBmdWNvbXBcdFwwMDBmdWNvIg0KKyAgICAibVx0XDAwMHVucGNraHBkXHRcMDAwdW5wY2tocHNcdFwwMDB1bnBja2xwZFx0XDAwMHVucGNrbHBzXHRcMDAwdmFkZHBkXHQiDQorICAgICJcMDAwdmFkZHBzXHRcMDAwdmFkZHNkXHRcMDAwdmFkZHNzXHRcMDAwdmFkZHN1YnBkXHRcMDAwdmFkZHN1YnBzXHRcMDAwdiINCisgICAgImFlc2RlY2xhc3RcdFwwMDB2YWVzZGVjXHRcMDAwdmFlc2VuY2xhc3RcdFwwMDB2YWVzZW5jXHRcMDAwdmFlc2ltY1x0XDAwMCINCisgICAgInZhZXNrZXlnZW5hc3Npc3RcdFwwMDB2YW5kbnBkXHRcMDAwdmFuZG5wc1x0XDAwMHZhbmRwZFx0XDAwMHZhbmRwc1x0XDAwMCINCisgICAgIiNWQVNUQVJUX1NBVkVfWE1NX1JFR1MgXDAwMHZibGVuZHBkXHRcMDAwdmJsZW5kcHNcdFwwMDB2YmxlbmR2cGRcdFwwMDB2Ig0KKyAgICAiYmxlbmR2cHNcdFwwMDB2YnJvYWRjYXN0ZjEyOFx0XDAwMHZicm9hZGNhc3RzZFx0XDAwMHZicm9hZGNhc3Rzc1x0XDAwMHYiDQorICAgICJjbXBwZFx0XDAwMHZjbXBwc1x0XDAwMHZjbXBzZFx0XDAwMHZjbXBzc1x0XDAwMHZjdnRwZDJkcXhcdFwwMDB2Y3Z0cGQyZCINCisgICAgInF5XHRcMDAwdmN2dHBkMnBzeFx0XDAwMHZjdnRwZDJwc3lcdFwwMDB2Y3Z0c2kyc2RxXHRcMDAwdmN2dHNpMnNkbFx0XDAwMCINCisgICAgInZjdnRzaTJzc3FcdFwwMDB2Y3Z0c3Myc2lsXHRcMDAwdmN2dHRwZDJkcXhcdFwwMDB2Y3Z0dHBkMmRxeVx0XDAwMHZjdnR0Ig0KKyAgICAic2Qyc2lcdFwwMDB2ZGl2cGRcdFwwMDB2ZGl2cHNcdFwwMDB2ZGl2c2RcdFwwMDB2ZGl2c3NcdFwwMDB2ZHBwZFx0XDAwMHYiDQorICAgICJkcHBzXHRcMDAwdmVyclx0XDAwMHZlcndcdFwwMDB2ZXh0cmFjdGYxMjhcdFwwMDB2ZXh0cmFjdHBzXHRcMDAwdmV4dHJhYyINCisgICAgInRwcyBcdFwwMDB2Zm1hZGQxMzJwZFx0XDAwMHZmbWFkZDIxM3BkXHRcMDAwdmZtYWRkMjMxcGRcdFwwMDB2Zm1hZGQxMzJwIg0KKyAgICAic1x0XDAwMHZmbWFkZDIxM3BzXHRcMDAwdmZtYWRkMjMxcHNcdFwwMDB2Zm1hZGRzdWIxMzJwZFx0XDAwMHZmbWFkZHN1YjIiDQorICAgICIxM3BkXHRcMDAwdmZtYWRkc3ViMjMxcGRcdFwwMDB2Zm1hZGRzdWIxMzJwc1x0XDAwMHZmbWFkZHN1YjIxM3BzXHRcMDAwdiINCisgICAgImZtYWRkc3ViMjMxcHNcdFwwMDB2Zm1zdWJhZGQxMzJwZFx0XDAwMHZmbXN1YmFkZDIxM3BkXHRcMDAwdmZtc3ViYWRkMjMxIg0KKyAgICAicGRcdFwwMDB2Zm1zdWJhZGQxMzJwc1x0XDAwMHZmbXN1YmFkZDIxM3BzXHRcMDAwdmZtc3ViYWRkMjMxcHNcdFwwMDB2Zm0iDQorICAgICJzdWIxMzJwZFx0XDAwMHZmbXN1YjIxM3BkXHRcMDAwdmZtc3ViMjMxcGRcdFwwMDB2Zm1zdWIxMzJwc1x0XDAwMHZmbXN1YiINCisgICAgIjIxM3BzXHRcMDAwdmZtc3ViMjMxcHNcdFwwMDB2Zm5tYWRkMTMycGRcdFwwMDB2Zm5tYWRkMjEzcGRcdFwwMDB2Zm5tYWRkIg0KKyAgICAiMjMxcGRcdFwwMDB2Zm5tYWRkMTMycHNcdFwwMDB2Zm5tYWRkMjEzcHNcdFwwMDB2Zm5tYWRkMjMxcHNcdFwwMDB2Zm5tc3UiDQorICAgICJiMTMycGRcdFwwMDB2Zm5tc3ViMjEzcGRcdFwwMDB2Zm5tc3ViMjMxcGRcdFwwMDB2Zm5tc3ViMTMycHNcdFwwMDB2Zm5tcyINCisgICAgInViMjEzcHNcdFwwMDB2Zm5tc3ViMjMxcHNcdFwwMDB2b3JwZFx0XDAwMHZvcnBzXHRcMDAwdnhvcnBkXHRcMDAwdnhvcnBzIg0KKyAgICAiXHRcMDAwdmhhZGRwZFx0XDAwMHZoYWRkcHNcdFwwMDB2aHN1YnBkXHRcMDAwdmhzdWJwc1x0XDAwMHZpbnNlcnRmMTI4XHQiDQorICAgICJcMDAwdmluc2VydHBzXHRcMDAwdmxkZHF1XHRcMDAwdmxkbXhjc3JcdFwwMDB2bWFza21vdmRxdVx0XDAwMHZtYXNrbW92cCINCisgICAgImRcdFwwMDB2bWFza21vdnBzXHRcMDAwdm1heHBkXHRcMDAwdm1heHBzXHRcMDAwdm1heHNkXHRcMDAwdm1heHNzXHRcMDAwIg0KKyAgICAidm1jYWxsXDAwMHZtY2xlYXJcdFwwMDB2bWlucGRcdFwwMDB2bWlucHNcdFwwMDB2bWluc2RcdFwwMDB2bWluc3NcdFwwMDAiDQorICAgICJ2bWxhdW5jaFwwMDB2bW92YXBkXHRcMDAwdm1vdmFwc1x0XDAwMHZtb3ZkZHVwXHRcMDAwdm1vdmRcdFwwMDB2bW92ZHFhXHQiDQorICAgICJcMDAwdm1vdmRxdVx0XDAwMHZtb3ZobHBzXHRcMDAwdm1vdmhwZFx0XDAwMHZtb3ZocHNcdFwwMDB2bW92bGhwc1x0XDAwMCINCisgICAgInZtb3ZscGRcdFwwMDB2bW92bHBzXHRcMDAwdm1vdnFcdFwwMDB2bW92bXNrcGRcdFwwMDB2bW92bXNrcHNcdFwwMDB2bW92Ig0KKyAgICAibnRkcWFcdFwwMDB2bW92bnRkcVx0XDAwMHZtb3ZudHBkXHRcMDAwdm1vdm50cHNcdFwwMDB2bW92c2RcdFwwMDB2bW92c2giDQorICAgICJkdXBcdFwwMDB2bW92c2xkdXBcdFwwMDB2bW92c3NcdFwwMDB2bW92dXBkXHRcMDAwdm1vdnVwc1x0XDAwMHZtcHNhZGJ3XHQiDQorICAgICJcMDAwdm1wdHJsZFx0XDAwMHZtcHRyc3RcdFwwMDB2bXJlYWRsXHRcMDAwdm1yZWFkcVx0XDAwMHZtcmVzdW1lXDAwMHZtdSINCisgICAgImxwZFx0XDAwMHZtdWxwc1x0XDAwMHZtdWxzZFx0XDAwMHZtdWxzc1x0XDAwMHZtd3JpdGVsXHRcMDAwdm13cml0ZXFcdFwwMDAiDQorICAgICJ2bXhvZmZcMDAwdm14b25cdFwwMDB2cGFic2JcdFwwMDB2cGFic2RcdFwwMDB2cGFic3dcdFwwMDB2cGFja3NzZHdcdFwwMDAiDQorICAgICJ2cGFja3Nzd2JcdFwwMDB2cGFja3VzZHdcdFwwMDB2cGFja3Vzd2JcdFwwMDB2cGFkZGJcdFwwMDB2cGFkZGRcdFwwMDB2cCINCisgICAgImFkZHFcdFwwMDB2cGFkZHNiXHRcMDAwdnBhZGRzd1x0XDAwMHZwYWRkdXNiXHRcMDAwdnBhZGR1c3dcdFwwMDB2cGFkZHdcdCINCisgICAgIlwwMDB2cGFsaWduclx0XDAwMHZwYW5kblx0XDAwMHZwYW5kXHRcMDAwdnBhdmdiXHRcMDAwdnBhdmd3XHRcMDAwdnBibGVuIg0KKyAgICAiZHZiXHRcMDAwdnBibGVuZHdcdFwwMDB2cGNsbXVsaHFocWRxXHRcMDAwdnBjbG11bGhxbHFkcVx0XDAwMHZwY2xtdWxscWgiDQorICAgICJxZHFcdFwwMDB2cGNsbXVsbHFscWRxXHRcMDAwdnBjbG11bHFkcVx0XDAwMHZwY21wZXFiXHRcMDAwdnBjbXBlcWRcdFwwMDAiDQorICAgICJ2cGNtcGVxcVx0XDAwMHZwY21wZXF3XHRcMDAwdnBjbXBlc3RyaVx0XDAwMCNWUENNUEVTVFJNMTI4cm0gUFNFVURPXDAwMCINCisgICAgIiNWUENNUEVTVFJNMTI4cnIgUFNFVURPXDAwMHZwY21wZXN0cm1cdFwwMDB2cGNtcGd0Ylx0XDAwMHZwY21wZ3RkXHRcMDAwIg0KKyAgICAidnBjbXBndHFcdFwwMDB2cGNtcGd0d1x0XDAwMHZwY21waXN0cmlcdFwwMDAjVlBDTVBJU1RSTTEyOHJtIFBTRVVET1wwMDAiDQorICAgICIjVlBDTVBJU1RSTTEyOHJyIFBTRVVET1wwMDB2cGNtcGlzdHJtXHRcMDAwdnBlcm0yZjEyOFx0XDAwMHZwZXJtaWxwZFx0XDAwMCINCisgICAgInZwZXJtaWxwc1x0XDAwMHZwZXh0cmJcdFwwMDB2cGV4dHJkXHRcMDAwdnBleHRycVx0XDAwMHZwZXh0cndcdFwwMDB2cGhhIg0KKyAgICAiZGRkXHRcMDAwdnBoYWRkc3dcdFwwMDB2cGhhZGR3XHRcMDAwdnBobWlucG9zdXdcdFwwMDB2cGhzdWJkXHRcMDAwdnBoc3UiDQorICAgICJic3dcdFwwMDB2cGhzdWJ3XHRcMDAwdnBpbnNyYlx0XDAwMHZwaW5zcmRcdFwwMDB2cGluc3JxXHRcMDAwdnBpbnNyd1x0XDAwMCINCisgICAgInZwbWFkZHVic3dcdFwwMDB2cG1hZGR3ZFx0XDAwMHZwbWF4c2JcdFwwMDB2cG1heHNkXHRcMDAwdnBtYXhzd1x0XDAwMHZwIg0KKyAgICAibWF4dWJcdFwwMDB2cG1heHVkXHRcMDAwdnBtYXh1d1x0XDAwMHZwbWluc2JcdFwwMDB2cG1pbnNkXHRcMDAwdnBtaW5zd1x0Ig0KKyAgICAiXDAwMHZwbWludWJcdFwwMDB2cG1pbnVkXHRcMDAwdnBtaW51d1x0XDAwMHZwbW92bXNrYlx0XDAwMHZwbW92c3hiZFx0XDAwMCINCisgICAgInZwbW92c3hicVx0XDAwMHZwbW92c3hid1x0XDAwMHZwbW92c3hkcVx0XDAwMHZwbW92c3h3ZFx0XDAwMHZwbW92c3h3cVx0Ig0KKyAgICAiXDAwMHZwbW92enhiZFx0XDAwMHZwbW92enhicVx0XDAwMHZwbW92enhid1x0XDAwMHZwbW92enhkcVx0XDAwMHZwbW92engiDQorICAgICJ3ZFx0XDAwMHZwbW92enh3cVx0XDAwMHZwbXVsZHFcdFwwMDB2cG11bGhyc3dcdFwwMDB2cG11bGh1d1x0XDAwMHZwbXVsaCINCisgICAgIndcdFwwMDB2cG11bGxkXHRcMDAwdnBtdWxsd1x0XDAwMHZwbXVsdWRxXHRcMDAwdnBvclx0XDAwMHZwc2FkYndcdFwwMDB2Ig0KKyAgICAicHNodWZiXHRcMDAwdnBzaHVmZFx0XDAwMHZwc2h1Zmh3XHRcMDAwdnBzaHVmbHdcdFwwMDB2cHNpZ25iXHRcMDAwdnBzaWciDQorICAgICJuZFx0XDAwMHZwc2lnbndcdFwwMDB2cHNsbGRxXHRcMDAwdnBzbGxkXHRcMDAwdnBzbGxxXHRcMDAwdnBzbGx3XHRcMDAwdiINCisgICAgInBzcmFkXHRcMDAwdnBzcmF3XHRcMDAwdnBzcmxkcVx0XDAwMHZwc3JsZFx0XDAwMHZwc3JscVx0XDAwMHZwc3Jsd1x0XDAwMCINCisgICAgInZwc3ViYlx0XDAwMHZwc3ViZFx0XDAwMHZwc3VicVx0XDAwMHZwc3Vic2JcdFwwMDB2cHN1YnN3XHRcMDAwdnBzdWJ1c2JcdCINCisgICAgIlwwMDB2cHN1YnVzd1x0XDAwMHZwc3Vid1x0XDAwMHZwdGVzdFx0XDAwMHZwdW5wY2toYndcdFwwMDB2cHVucGNraGRxXHRcMDAwIg0KKyAgICAidnB1bnBja2hxZHFcdFwwMDB2cHVucGNraHdkXHRcMDAwdnB1bnBja2xid1x0XDAwMHZwdW5wY2tsZHFcdFwwMDB2cHVucGMiDQorICAgICJrbHFkcVx0XDAwMHZwdW5wY2tsd2RcdFwwMDB2cHhvclx0XDAwMHZyY3Bwc1x0XDAwMHZyY3Bzc1x0XDAwMHZyb3VuZHBkXHQiDQorICAgICJcMDAwdnJvdW5kcHNcdFwwMDB2cm91bmRzZFx0XDAwMHZyb3VuZHNzXHRcMDAwdnJzcXJ0cHNcdFwwMDB2cnNxcnRzc1x0XDAwMCINCisgICAgInZzaHVmcGRcdFwwMDB2c2h1ZnBzXHRcMDAwdnNxcnRwZFx0XDAwMHZzcXJ0cHNcdFwwMDB2c3FydHNkXHRcMDAwdnNxcnRzIg0KKyAgICAic1x0XDAwMHZzdG14Y3NyXHRcMDAwdnN1YnBkXHRcMDAwdnN1YnBzXHRcMDAwdnN1YnNkXHRcMDAwdnN1YnNzXHRcMDAwdnQiDQorICAgICJlc3RwZFx0XDAwMHZ0ZXN0cHNcdFwwMDB2dW5wY2tocGRcdFwwMDB2dW5wY2tocHNcdFwwMDB2dW5wY2tscGRcdFwwMDB2dSINCisgICAgIm5wY2tscHNcdFwwMDB2emVyb2FsbFwwMDB2emVyb3VwcGVyXDAwMHdhaXRcMDAwd2JpbnZkXDAwMHdybXNyXDAwMHhhZGR3Ig0KKyAgICAiXHRcMDAweGFkZGxcdFwwMDB4YWRkcVx0XDAwMHhhZGRiXHRcMDAweGNoZ3dcdFwwMDB4Y2hnbFx0XDAwMHhjaGdxXHRcMDAwIg0KKyAgICAieGNoZ2JcdFwwMDBmeGNoXHRcMDAweGxhdGJcMDAweG9yd1x0XDAwMHhvcmxcdFwwMDB4b3JxXHRcMDAweG9yYlx0XDAwMCI7DQorDQorICBPIDw8ICJcdCI7DQorDQorICAvLyBFbWl0IHRoZSBvcGNvZGUgZm9yIHRoZSBpbnN0cnVjdGlvbi4NCisgIHVuc2lnbmVkIEJpdHMgPSBPcEluZm9bTUktPmdldE9wY29kZSgpXTsNCisgIGFzc2VydChCaXRzICE9IDAgJiYgIkNhbm5vdCBwcmludCB0aGlzIGluc3RydWN0aW9uLiIpOw0KKyAgTyA8PCBBc21TdHJzKyhCaXRzICYgMTYzODMpLTE7DQorDQorDQorICAvLyBGcmFnbWVudCAwIGVuY29kZWQgaW50byA2IGJpdHMgZm9yIDQxIHVuaXF1ZSBjb21tYW5kcy4NCisgIHN3aXRjaCAoKEJpdHMgPj4gMjYpICYgNjMpIHsNCisgIGRlZmF1bHQ6ICAgLy8gdW5yZWFjaGFibGUuDQorICBjYXNlIDA6DQorICAgIC8vIERCR19WQUxVRSwgQUJTX0YsIEFESkNBTExTVEFDS0RPV04zMiwgQURKQ0FMTFNUQUNLRE9XTjY0LCBBREpDQUxMU1RBQ0suLi4NCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMToNCisgICAgLy8gQURDMTZpMTYsIEFEQzMyaTMyLCBBREM2NGkzMiwgQURDOGk4LCBBREQxNmkxNiwgQUREMzJpMzIsIEFERDY0aTMyLCBBRC4uLg0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDI6DQorICAgIC8vIEFEQzE2bWksIEFEQzE2bWk4LCBBREMxNm1yLCBBREMzMm1pLCBBREMzMm1pOCwgQURDMzJtciwgQURDNjRtaTMyLCBBREMuLi4NCisgICAgcHJpbnRPcGVyYW5kKE1JLCA1LCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAzOg0KKyAgICAvLyBBREMxNnJpLCBBREMxNnJpOCwgQURDMTZyciwgQURDMTZycl9SRVYsIEFEQzMycmksIEFEQzMycmk4LCBBREMzMnJyLCBBLi4uDQorICAgIHByaW50T3BlcmFuZChNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgNDoNCisgICAgLy8gQURDMTZybSwgQUREMTZybSwgQU5EMTZybSwgQ01PVkExNnJtLCBDTU9WQUUxNnJtLCBDTU9WQjE2cm0sIENNT1ZCRTE2ci4uLg0KKyAgICBwcmludGkxNm1lbShNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgNToNCisgICAgLy8gQURDMzJybSwgQUREMzJybSwgQU5EMzJybSwgQ01PVkEzMnJtLCBDTU9WQUUzMnJtLCBDTU9WQjMycm0sIENNT1ZCRTMyci4uLg0KKyAgICBwcmludGkzMm1lbShNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgNjoNCisgICAgLy8gQURDNjRybSwgQURENjRybSwgQU5ENjRybSwgQ01PVkE2NHJtLCBDTU9WQUU2NHJtLCBDTU9WQjY0cm0sIENNT1ZCRTY0ci4uLg0KKyAgICBwcmludGk2NG1lbShNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgNzoNCisgICAgLy8gQURDOHJtLCBBREQ4cm0sIEFORDhybSwgQ1JDMzJtOCwgQ1JDNjRtOCwgT1I4cm0sIFNCQjhybSwgU1VCOHJtLCBYT1I4ci4uLg0KKyAgICBwcmludGk4bWVtKE1JLCAyLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSA4Og0KKyAgICAvLyBBRERQRHJtLCBBRERQU3JtLCBBRERTVUJQRHJtLCBBRERTVUJQU3JtLCBBTkROUERybSwgQU5ETlBTcm0sIEFORFBEcm0sLi4uDQorICAgIHByaW50ZjEyOG1lbShNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgOToNCisgICAgLy8gQUREU0RybSwgQUREU0RybV9JbnQsIERJVlNEcm0sIERJVlNEcm1fSW50LCBJbnRfQ1ZUU0QyU1NybSwgSW50X1ZDVlRTRC4uLg0KKyAgICBwcmludGY2NG1lbShNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMTA6DQorICAgIC8vIEFERFNTcm0sIEFERFNTcm1fSW50LCBESVZTU3JtLCBESVZTU3JtX0ludCwgSW50X0NWVFNTMlNEcm0sIEludF9WQ1ZUU1MuLi4NCisgICAgcHJpbnRmMzJtZW0oTUksIDIsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDExOg0KKyAgICAvLyBBRERfRjMybSwgRElWUl9GMzJtLCBESVZfRjMybSwgRkJMRG0sIEZCU1RQbSwgRkNPTTMybSwgRkNPTVAzMm0sIEZMREVOLi4uDQorICAgIHByaW50ZjMybWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDEyOg0KKyAgICAvLyBBRERfRjY0bSwgRElWUl9GNjRtLCBESVZfRjY0bSwgRkNPTTY0bSwgRkNPTVA2NG0sIExEX0Y2NG0sIE1VTF9GNjRtLCBTLi4uDQorICAgIHByaW50ZjY0bWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDEzOg0KKyAgICAvLyBBRERfRkkxNm0sIERFQzE2bSwgREVDNjRfMTZtLCBESVYxNm0sIERJVlJfRkkxNm0sIERJVl9GSTE2bSwgRklDT00xNm0sLi4uDQorICAgIHByaW50aTE2bWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE0Og0KKyAgICAvLyBBRERfRkkzMm0sIENBTEwzMm0sIERFQzMybSwgREVDNjRfMzJtLCBESVYzMm0sIERJVlJfRkkzMm0sIERJVl9GSTMybSwgLi4uDQorICAgIHByaW50aTMybWVtKE1JLCAwLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxNToNCisgICAgLy8gQUVTREVDTEFTVHJtLCBBRVNERUNybSwgQUVTRU5DTEFTVHJtLCBBRVNFTkNybSwgQkxFTkRWUERybTAsIEJMRU5EVlBTci4uLg0KKyAgICBwcmludGkxMjhtZW0oTUksIDIsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDE2Og0KKyAgICAvLyBBRVNJTUNybSwgQ1ZURFEyUFNybSwgSW50X0NWVERRMlBTcm0sIEludF9WQ1ZURFEyUFNybSwgTEREUVVybSwgTU9WRFFBLi4uDQorICAgIHByaW50aTEyOG1lbShNSSwgMSwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMTc6DQorICAgIC8vIEFFU0lNQ3JyLCBCU0YxNnJyLCBCU0YzMnJyLCBCU0Y2NHJyLCBCU1IxNnJyLCBCU1IzMnJyLCBCU1I2NHJyLCBCVDE2cmkuLi4NCisgICAgcHJpbnRPcGVyYW5kKE1JLCAxLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxODoNCisgICAgLy8gQUVTS0VZR0VOQVNTSVNUMTI4cm0sIEVYVFJBQ1RQU21yLCBJTVVMMTZybWksIElNVUwxNnJtaTgsIElNVUwzMnJtaSwgSS4uLg0KKyAgICBwcmludE9wZXJhbmQoTUksIDYsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDE5Og0KKyAgICAvLyBCTEVORFBEcm1pLCBCTEVORFBTcm1pLCBDTVBQRHJtaV9hbHQsIENNUFBTcm1pX2FsdCwgQ01QU0RybV9hbHQsIENNUFNTLi4uDQorICAgIHByaW50T3BlcmFuZChNSSwgNywgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMjA6DQorICAgIC8vIEJMRU5EUERycmksIEJMRU5EUFNycmksIENNUFBEcnJpX2FsdCwgQ01QUFNycmlfYWx0LCBDTVBTRHJyX2FsdCwgQ01QU1MuLi4NCisgICAgcHJpbnRPcGVyYW5kKE1JLCAzLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMjE6DQorICAgIC8vIEJTRjE2cm0sIEJTUjE2cm0sIENNUDE2cm0sIExBUjE2cm0sIExBUjMycm0sIExBUjY0cm0sIExTTDE2cm0sIE1PVjE2cm0uLi4NCisgICAgcHJpbnRpMTZtZW0oTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDIyOg0KKyAgICAvLyBCU0YzMnJtLCBCU1IzMnJtLCBDTVAzMnJtLCBDVlRTSTJTRHJtLCBDVlRTSTJTU3JtLCBGU19NT1YzMnJtLCBHU19NT1YzLi4uDQorICAgIHByaW50aTMybWVtKE1JLCAxLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyMzoNCisgICAgLy8gQlNGNjRybSwgQlNSNjRybSwgQ01QNjRybSwgQ1ZUU0kyU0Q2NHJtLCBDVlRTSTJTUzY0cm0sIEludF9DVlREUTJQRHJtLC4uLg0KKyAgICBwcmludGk2NG1lbShNSSwgMSwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMjQ6DQorICAgIC8vIENBTEw2NG0sIENNUFhDSEc4QiwgREVDNjRtLCBESVY2NG0sIElESVY2NG0sIElMRF9GNjRtLCBJTVVMNjRtLCBJTkM2NG0uLi4NCisgICAgcHJpbnRpNjRtZW0oTUksIDAsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDI1Og0KKyAgICAvLyBDQUxMNjRwY3JlbDMyLCBDQUxMcGNyZWwxNiwgQ0FMTHBjcmVsMzIsIEpBRV8xLCBKQUVfNCwgSkFfMSwgSkFfNCwgSkJFLi4uDQorICAgIHByaW50X3BjcmVsX2ltbShNSSwgMCwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMjY6DQorICAgIC8vIENMRkxVU0gsIERFQzhtLCBESVY4bSwgSURJVjhtLCBJTVVMOG0sIElOQzhtLCBJTlZMUEcsIExPQ0tfREVDOG0sIExPQ0suLi4NCisgICAgcHJpbnRpOG1lbShNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyNzoNCisgICAgLy8gQ01QOHJtLCBNT1Y4cm0sIE1PVjhybV9OT1JFWCwgTU9WU1gxNnJtOFcsIE1PVlNYMzJybTgsIE1PVlNYNjRybTgsIE1PVi4uLg0KKyAgICBwcmludGk4bWVtKE1JLCAxLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMjg6DQorICAgIC8vIENNUFBEcm1pLCBDTVBQU3JtaSwgQ01QU0RybSwgQ01QU1NybSwgSW50X0NNUFNEcm0sIEludF9DTVBTU3JtLCBJbnRfVkMuLi4NCisgICAgcHJpbnRTU0VDQyhNSSwgNywgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMjk6DQorICAgIC8vIENNUFBEcnJpLCBDTVBQU3JyaSwgQ01QU0RyciwgQ01QU1NyciwgSW50X0NNUFNEcnIsIEludF9DTVBTU3JyLCBJbnRfVkMuLi4NCisgICAgcHJpbnRTU0VDQyhNSSwgMywgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMzA6DQorICAgIC8vIENNUFhDSEcxNkINCisgICAgcHJpbnRpMTI4bWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDMxOg0KKyAgICAvLyBDT01JU0RybSwgQ09NSVNTcm0sIENWVERRMlBEcm0sIENWVFBEMkRRcm0sIENWVFBEMlBTcm0sIENWVFBTMkRRcm0sIENWLi4uDQorICAgIHByaW50ZjEyOG1lbShNSSwgMSwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMzI6DQorICAgIC8vIENWVFBTMlBEcm0sIENWVFNEMlNTcm0sIENWVFRTRDJTSTY0cm0sIENWVFRTRDJTSXJtLCBJbnRfQ1ZUUFMyUERybSwgSW4uLi4NCisgICAgcHJpbnRmNjRtZW0oTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAzMzoNCisgICAgLy8gQ1ZUU1MyU0RybSwgQ1ZUU1MyU0k2NHJtLCBDVlRTUzJTSXJtLCBDVlRUU1MyU0k2NHJtLCBDVlRUU1MyU0lybSwgSW50Xy4uLg0KKyAgICBwcmludGYzMm1lbShNSSwgMSwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDM0Og0KKyAgICAvLyBGQVJDQUxMMTZtLCBGQVJDQUxMMzJtLCBGQVJDQUxMNjQsIEZBUkpNUDE2bSwgRkFSSk1QMzJtLCBGQVJKTVA2NCwgRlhSLi4uDQorICAgIHByaW50b3BhcXVlbWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDM1Og0KKyAgICAvLyBMRFMxNnJtLCBMRFMzMnJtLCBMRVMxNnJtLCBMRVMzMnJtLCBMRlMxNnJtLCBMRlMzMnJtLCBMRlM2NHJtLCBMR1MxNnJtLi4uDQorICAgIHByaW50b3BhcXVlbWVtKE1JLCAxLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAzNjoNCisgICAgLy8gTERfRjgwbSwgU1RfRlA4MG0NCisgICAgcHJpbnRmODBtZW0oTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMzc6DQorICAgIC8vIFZBRERQRFlybSwgVkFERFBTWXJtLCBWQUREU1VCUERZcm0sIFZBRERTVUJQU1lybSwgVkFORE5QRFlybSwgVkFORE5QU1kuLi4NCisgICAgcHJpbnRmMjU2bWVtKE1JLCAyLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMSwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMzg6DQorICAgIC8vIFZDVlREUTJQU1lybSwgVkxERFFVWXJtLCBWTU9WRFFBWXJtLCBWTU9WRFFVWXJtLCBWUFRFU1RZcm0NCisgICAgcHJpbnRpMjU2bWVtKE1JLCAxLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAzOToNCisgICAgLy8gVkNWVFBEMkRRWXJtLCBWQ1ZUUEQyUFNZcm0sIFZDVlRQUzJEUVlybSwgVkNWVFRQRDJEUVlybSwgVkNWVFRQUzJEUVlybS4uLg0KKyAgICBwcmludGYyNTZtZW0oTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDQwOg0KKyAgICAvLyBWUEVSTUlMUERZcm0sIFZQRVJNSUxQU1lybQ0KKyAgICBwcmludGkyNTZtZW0oTUksIDIsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAxLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgfQ0KKw0KKw0KKyAgLy8gRnJhZ21lbnQgMSBlbmNvZGVkIGludG8gNiBiaXRzIGZvciAzOSB1bmlxdWUgY29tbWFuZHMuDQorICBzd2l0Y2ggKChCaXRzID4+IDIwKSAmIDYzKSB7DQorICBkZWZhdWx0OiAgIC8vIHVucmVhY2hhYmxlLg0KKyAgY2FzZSAwOg0KKyAgICAvLyBBREMxNmkxNiwgQUREMTZpMTYsIEFORDE2aTE2LCBDTVAxNmkxNiwgSU4xNnJpLCBNT1YxNm8xNmEsIE9SMTZpMTYsIFNCLi4uDQorICAgIE8gPDwgIiwgJWF4IjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE6DQorICAgIC8vIEFEQzE2bWksIEFEQzE2bWk4LCBBREMxNm1yLCBBREMzMm1pLCBBREMzMm1pOCwgQURDMzJtciwgQURDNjRtaTMyLCBBREMuLi4NCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDI6DQorICAgIC8vIEFEQzE2cmksIEFEQzE2cmk4LCBBREMxNnJtLCBBREMxNnJyLCBBREMxNnJyX1JFViwgQURDMzJyaSwgQURDMzJyaTgsIEEuLi4NCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAzOg0KKyAgICAvLyBBREMzMmkzMiwgQUREMzJpMzIsIEFORDMyaTMyLCBDTVAzMmkzMiwgSU4zMnJpLCBNT1YzMm8zMmEsIE9SMzJpMzIsIFNCLi4uDQorICAgIE8gPDwgIiwgJWVheCI7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSA0Og0KKyAgICAvLyBBREM2NGkzMiwgQURENjRpMzIsIEFORDY0aTMyLCBDTVA2NGkzMiwgTU9WNjRvNjRhLCBNT1Y2NG84YSwgT1I2NGkzMiwgLi4uDQorICAgIE8gPDwgIiwgJXJheCI7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSA1Og0KKyAgICAvLyBBREM4aTgsIEFERDhpOCwgQU5EOGk4LCBDTVA4aTgsIElOOHJpLCBNT1Y4bzhhLCBPUjhpOCwgU0JCOGk4LCBTVUI4aTgsLi4uDQorICAgIE8gPDwgIiwgJWFsIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDY6DQorICAgIC8vIEFERF9GSTMybSwgQUREX0ZQclNUMCwgQUREX0ZTVDByLCBBRERfRnJTVDAsIEJTV0FQMzJyLCBCU1dBUDY0ciwgQ0FMTDMuLi4NCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgNzoNCisgICAgLy8gQUVTS0VZR0VOQVNTSVNUMTI4cm0sIFBDTVBFU1RSSUFybSwgUENNUEVTVFJJQ3JtLCBQQ01QRVNUUklPcm0sIFBDTVBFUy4uLg0KKyAgICBwcmludGkxMjhtZW0oTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDg6DQorICAgIC8vIEFFU0tFWUdFTkFTU0lTVDEyOHJyLCBDUkMzMm0xNiwgQ1JDMzJtMzIsIENSQzMybTgsIENSQzMycjE2LCBDUkMzMnIzMiwuLi4NCisgICAgcHJpbnRPcGVyYW5kKE1JLCAxLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSA5Og0KKyAgICAvLyBCTEVORFBEcm1pLCBCTEVORFBTcm1pLCBEUFBEcm1pLCBEUFBTcm1pLCBNUFNBREJXcm1pLCBQQUxJR05SMTI4cm0sIFBCLi4uDQorICAgIHByaW50aTEyOG1lbShNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMTA6DQorICAgIC8vIENNT1ZCRV9GLCBDTU9WQl9GLCBDTU9WRV9GLCBDTU9WTkJFX0YsIENNT1ZOQl9GLCBDTU9WTkVfRiwgQ01PVk5QX0YsIEMuLi4NCisgICAgTyA8PCAiLCAlc3QoMCkiOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMTE6DQorICAgIC8vIENNUFBEcm1pLCBDTVBQRHJyaSwgVkNNUFBEWXJtaSwgVkNNUFBEWXJyaSwgVkNNUFBEcm1pLCBWQ01QUERycmkNCisgICAgTyA8PCAicGRcdCI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMTI6DQorICAgIC8vIENNUFBEcm1pX2FsdCwgQ01QUFNybWlfYWx0LCBTSFVGUERybWksIFNIVUZQU3JtaSwgVkNNUFBEWXJtaV9hbHQsIFZDTVAuLi4NCisgICAgcHJpbnRmMTI4bWVtKE1JLCAyLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxMzoNCisgICAgLy8gQ01QUFNybWksIENNUFBTcnJpLCBWQ01QUFNZcm1pLCBWQ01QUFNZcnJpLCBWQ01QUFNybWksIFZDTVBQU3JyaQ0KKyAgICBPIDw8ICJwc1x0IjsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxNDoNCisgICAgLy8gQ01QU0RybSwgQ01QU0RyciwgSW50X0NNUFNEcm0sIEludF9DTVBTRHJyLCBJbnRfVkNNUFNEcm0sIEludF9WQ01QU0Ryci4uLg0KKyAgICBPIDw8ICJzZFx0IjsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxNToNCisgICAgLy8gQ01QU0RybV9hbHQsIFJPVU5EU0RtX0ludCwgVkNNUFNEcm1fYWx0LCBWUk9VTkRTRG0sIFZST1VORFNEbV9JbnQNCisgICAgcHJpbnRmNjRtZW0oTUksIDIsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDE2Og0KKyAgICAvLyBDTVBTU3JtLCBDTVBTU3JyLCBJbnRfQ01QU1NybSwgSW50X0NNUFNTcnIsIEludF9WQ01QU1NybSwgSW50X1ZDTVBTU3JyLi4uDQorICAgIE8gPDwgInNzXHQiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDE3Og0KKyAgICAvLyBDTVBTU3JtX2FsdCwgSU5TRVJUUFNybSwgUk9VTkRTU21fSW50LCBWQ01QU1NybV9hbHQsIFZJTlNFUlRQU3JtLCBWUk9VLi4uDQorICAgIHByaW50ZjMybWVtKE1JLCAyLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxODoNCisgICAgLy8gRVhUUkFDVFBTbXIsIFBFWFRSQm1yLCBQRVhUUkRtciwgUEVYVFJRbXIsIFBFWFRSV21yLCBTSExEMTZtcmk4LCBTSExEMy4uLg0KKyAgICBwcmludE9wZXJhbmQoTUksIDUsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDE5Og0KKyAgICAvLyBJTVVMMTZybWksIElNVUwxNnJtaTgNCisgICAgcHJpbnRpMTZtZW0oTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDIwOg0KKyAgICAvLyBJTVVMMzJybWksIElNVUwzMnJtaTgNCisgICAgcHJpbnRpMzJtZW0oTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDIxOg0KKyAgICAvLyBJTVVMNjRybWkzMiwgSU1VTDY0cm1pOCwgTU1YX1BTSFVGV21pDQorICAgIHByaW50aTY0bWVtKE1JLCAxLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyMjoNCisgICAgLy8gSW50X01lbUJhcnJpZXJOb1NTRQ0KKyAgICBPIDw8ICIsICglZXNwKSI7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyMzoNCisgICAgLy8gSW50X01lbUJhcnJpZXJOb1NTRTY0DQorICAgIE8gPDwgIiwgKCVyc3ApIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDI0Og0KKyAgICAvLyBMQ01QWENIRzY0DQorICAgIE8gPDwgJywnOyANCisgICAgcHJpbnRpNjRtZW0oTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMjU6DQorICAgIC8vIExYQUREMTYsIE1NWF9QSU5TUldybWksIFBJTlNSV3JtaSwgVlBJTlNSV3JtaSwgWENIRzE2cm0NCisgICAgcHJpbnRpMTZtZW0oTUksIDIsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDI2Og0KKyAgICAvLyBMWEFERDMyLCBQSU5TUkRybSwgVlBJTlNSRHJtLCBYQ0hHMzJybQ0KKyAgICBwcmludGkzMm1lbShNSSwgMiwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMjc6DQorICAgIC8vIExYQURENjQsIFBBTElHTlI2NHJtLCBQSU5TUlFybSwgVlBBTElHTlI2NHJtLCBWUElOU1JRcm0sIFhDSEc2NHJtDQorICAgIHByaW50aTY0bWVtKE1JLCAyLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAyODoNCisgICAgLy8gTFhBREQ4LCBQSU5TUkJybSwgVlBJTlNSQnJtLCBYQ0hHOHJtDQorICAgIHByaW50aThtZW0oTUksIDIsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDI5Og0KKyAgICAvLyBNT1Y4cm1fTk9SRVgsIE1PVlpYMzJfTk9SRVhybTgNCisgICAgTyA8PCAiICAjIE5PUkVYIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDMwOg0KKyAgICAvLyBST1VORFBEbV9JbnQsIFJPVU5EUFNtX0ludCwgVlBFUk1JTFBEWW1pLCBWUEVSTUlMUFNZbWksIFZST1VORFBEbV9JbnQsLi4uDQorICAgIHByaW50ZjI1Nm1lbShNSSwgMSwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMzE6DQorICAgIC8vIFRBSUxKTVBkLCBUQUlMSk1QZDY0LCBUQUlMSk1QbSwgVEFJTEpNUG02NCwgVEFJTEpNUHI2NA0KKyAgICBPIDw8ICIgICMgVEFJTENBTEwiOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMzI6DQorICAgIC8vIFRDUkVUVVJOZGksIFRDUkVUVVJOZGk2NCwgVENSRVRVUk5taSwgVENSRVRVUk5taTY0LCBUQ1JFVFVSTnJpLCBUQ1JFVFUuLi4NCisgICAgTyA8PCAnICc7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMzM6DQorICAgIC8vIFRMU19hZGRyMzINCisgICAgTyA8PCAiLCAlZWF4OyBjYWxsXHRfX190bHNfZ2V0X2FkZHJAUExUIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDM0Og0KKyAgICAvLyBUTFNfYWRkcjY0DQorICAgIE8gPDwgIiglcmlwKSwgJXJkaTsgLndvcmRcdDB4NjY2NjsgcmV4NjQ7IGNhbGxcdF9fdGxzX2dldF9hZGRyQFBMVCI7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAzNToNCisgICAgLy8gVkJMRU5EUERZcm1pLCBWQkxFTkRQU1lybWksIFZCTEVORFZQRFlybSwgVkJMRU5EVlBTWXJtLCBWRFBQU1lybWkNCisgICAgcHJpbnRpMjU2bWVtKE1JLCAyLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMSwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMzY6DQorICAgIC8vIFZQRVJNMkYxMjhybQ0KKyAgICBwcmludGYyNTZtZW0oTUksIDIsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAxLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAzNzoNCisgICAgLy8gVlBFUk1JTFBEbWksIFZQRVJNSUxQU21pLCBWUk9VTkRQRG0sIFZST1VORFBTbQ0KKyAgICBwcmludGYxMjhtZW0oTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDM4Og0KKyAgICAvLyBYQ0hHMTZyciwgWENIRzMycnIsIFhDSEc2NHJyLCBYQ0hHOHJyDQorICAgIHByaW50T3BlcmFuZChNSSwgMiwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgfQ0KKw0KKw0KKyAgLy8gRnJhZ21lbnQgMiBlbmNvZGVkIGludG8gNSBiaXRzIGZvciAyMCB1bmlxdWUgY29tbWFuZHMuDQorICBzd2l0Y2ggKChCaXRzID4+IDE1KSAmIDMxKSB7DQorICBkZWZhdWx0OiAgIC8vIHVucmVhY2hhYmxlLg0KKyAgY2FzZSAwOg0KKyAgICAvLyBBREMxNm1pLCBBREMxNm1pOCwgQURDMTZtciwgQUREMTZtaSwgQUREMTZtaTgsIEFERDE2bXIsIEFORDE2bWksIEFORDE2Li4uDQorICAgIHByaW50aTE2bWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE6DQorICAgIC8vIEFEQzE2cmksIEFEQzE2cmk4LCBBREMxNnJtLCBBREMxNnJyLCBBREMxNnJyX1JFViwgQURDMzJyaSwgQURDMzJyaTgsIEEuLi4NCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMjoNCisgICAgLy8gQURDMzJtaSwgQURDMzJtaTgsIEFEQzMybXIsIEFERDMybWksIEFERDMybWk4LCBBREQzMm1yLCBBTkQzMm1pLCBBTkQzMi4uLg0KKyAgICBwcmludGkzMm1lbShNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAzOg0KKyAgICAvLyBBREM2NG1pMzIsIEFEQzY0bWk4LCBBREM2NG1yLCBBREQ2NG1pMzIsIEFERDY0bWk4LCBBREQ2NG1yLCBBTkQ2NG1pMzIsLi4uDQorICAgIHByaW50aTY0bWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDQ6DQorICAgIC8vIEFEQzhtaSwgQURDOG1yLCBBREQ4bWksIEFERDhtciwgQU5EOG1pLCBBTkQ4bXIsIENNUDhtaSwgQ01QOG1yLCBDTVBYQ0guLi4NCisgICAgcHJpbnRpOG1lbShNSSwgMCwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgNToNCisgICAgLy8gQUVTS0VZR0VOQVNTSVNUMTI4cnIsIEVYVFJBQ1RQU3JyLCBJTVVMMTZycmksIElNVUwxNnJyaTgsIElNVUwzMnJyaSwgSS4uLg0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgNjoNCisgICAgLy8gQkxFTkRQRHJtaSwgQkxFTkRQU3JtaSwgQ01QUERybWlfYWx0LCBDTVBQU3JtaV9hbHQsIENNUFNEcm1fYWx0LCBDTVBTUy4uLg0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgNzoNCisgICAgLy8gQ01QUERybWksIENNUFBTcm1pLCBWQ01QUERZcm1pLCBWQ01QUERybWksIFZDTVBQU1lybWksIFZDTVBQU3JtaQ0KKyAgICBwcmludGYxMjhtZW0oTUksIDIsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDg6DQorICAgIC8vIENNUFBEcnJpLCBDTVBQU3JyaSwgQ01QU0RyciwgQ01QU1NyciwgSW50X0NNUFNEcnIsIEludF9DTVBTU3JyLCBJbnRfVkMuLi4NCisgICAgcHJpbnRPcGVyYW5kKE1JLCAyLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSA5Og0KKyAgICAvLyBDTVBTRHJtLCBJbnRfQ01QU0RybSwgSW50X1ZDTVBTRHJtLCBWQ01QU0RybQ0KKyAgICBwcmludGY2NG1lbShNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMTA6DQorICAgIC8vIENNUFNTcm0sIEludF9DTVBTU3JtLCBJbnRfVkNNUFNTcm0sIFZDTVBTU3JtDQorICAgIHByaW50ZjMybWVtKE1JLCAyLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxMToNCisgICAgLy8gRU5URVIsIEZBUkNBTEwxNmksIEZBUkNBTEwzMmksIEZBUkpNUDE2aSwgRkFSSk1QMzJpLCBUQ1JFVFVSTmRpLCBUQ1JFVC4uLg0KKyAgICBwcmludE9wZXJhbmQoTUksIDEsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDEyOg0KKyAgICAvLyBFWFRSQUNUUFNtciwgTU9WU1NtciwgVkVYVFJBQ1RQU21yLCBWTU9WU1Ntcg0KKyAgICBwcmludGYzMm1lbShNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAxMzoNCisgICAgLy8gTU9WOHJyX05PUkVYLCBNT1ZaWDMyX05PUkVYcnI4DQorICAgIE8gPDwgIiAgIyBOT1JFWCI7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAxNDoNCisgICAgLy8gTU9WQVBEbXIsIE1PVkFQU21yLCBNT1ZOVERRXzY0bXIsIE1PVk5URFFtciwgTU9WTlREUW1yX0ludCwgTU9WTlRQRG1yLC4uLg0KKyAgICBwcmludGYxMjhtZW0oTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMTU6DQorICAgIC8vIE1PVkRRQW1yLCBNT1ZEUVVtciwgTU9WRFFVbXJfSW50LCBNT1ZOVFBEbXJfSW50LCBNT1ZOVFBTbXJfSW50LCBWTU9WRFEuLi4NCisgICAgcHJpbnRpMTI4bWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE2Og0KKyAgICAvLyBNT1ZIUERtciwgTU9WSFBTbXIsIE1PVkxQRG1yLCBNT1ZMUFNtciwgTU9WU0RtciwgVk1PVkhQRG1yLCBWTU9WSFBTbXIsLi4uDQorICAgIHByaW50ZjY0bWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE3Og0KKyAgICAvLyBUQ1JFVFVSTm1pLCBUQ1JFVFVSTm1pNjQNCisgICAgcHJpbnRPcGVyYW5kKE1JLCA1LCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE4Og0KKyAgICAvLyBWTUFTS01PVlBEWW1yLCBWTUFTS01PVlBTWW1yLCBWTU9WQVBEWW1yLCBWTU9WQVBTWW1yLCBWTU9WTlREUVlfNjRtciwgLi4uDQorICAgIHByaW50ZjI1Nm1lbShNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAxOToNCisgICAgLy8gVk1PVkRRQVltciwgVk1PVkRRVVltcg0KKyAgICBwcmludGkyNTZtZW0oTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIH0NCisNCisgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7DQorICBjYXNlIFg4Njo6QURDOG1pOg0KKyAgY2FzZSBYODY6OkFEQzhtcjoNCisgIGNhc2UgWDg2OjpBREQ4bWk6DQorICBjYXNlIFg4Njo6QUREOG1yOg0KKyAgY2FzZSBYODY6OkFORDhtaToNCisgIGNhc2UgWDg2OjpBTkQ4bXI6DQorICBjYXNlIFg4Njo6Q01QOG1pOg0KKyAgY2FzZSBYODY6OkNNUDhtcjoNCisgIGNhc2UgWDg2OjpDTVBYQ0hHOHJtOg0KKyAgY2FzZSBYODY6OkVOVEVSOg0KKyAgY2FzZSBYODY6OkZBUkNBTEwxNmk6DQorICBjYXNlIFg4Njo6RkFSQ0FMTDMyaToNCisgIGNhc2UgWDg2OjpGQVJKTVAxNmk6DQorICBjYXNlIFg4Njo6RkFSSk1QMzJpOg0KKyAgY2FzZSBYODY6OkxDTVBYQ0hHODoNCisgIGNhc2UgWDg2OjpMT0NLX0FERDhtaToNCisgIGNhc2UgWDg2OjpMT0NLX0FERDhtcjoNCisgIGNhc2UgWDg2OjpMT0NLX1NVQjhtaToNCisgIGNhc2UgWDg2OjpMT0NLX1NVQjhtcjoNCisgIGNhc2UgWDg2OjpNT1Y4bWk6DQorICBjYXNlIFg4Njo6TU9WOG1yOg0KKyAgY2FzZSBYODY6Ok9SOG1pOg0KKyAgY2FzZSBYODY6Ok9SOG1yOg0KKyAgY2FzZSBYODY6OlBFWFRSQm1yOg0KKyAgY2FzZSBYODY6OlJDTDhtaToNCisgIGNhc2UgWDg2OjpSQ1I4bWk6DQorICBjYXNlIFg4Njo6Uk9MOG1pOg0KKyAgY2FzZSBYODY6OlJPUjhtaToNCisgIGNhc2UgWDg2OjpTQVI4bWk6DQorICBjYXNlIFg4Njo6U0JCOG1pOg0KKyAgY2FzZSBYODY6OlNCQjhtcjoNCisgIGNhc2UgWDg2OjpTSEw4bWk6DQorICBjYXNlIFg4Njo6U0hSOG1pOg0KKyAgY2FzZSBYODY6OlNVQjhtaToNCisgIGNhc2UgWDg2OjpTVUI4bXI6DQorICBjYXNlIFg4Njo6VENSRVRVUk5kaToNCisgIGNhc2UgWDg2OjpUQ1JFVFVSTmRpNjQ6DQorICBjYXNlIFg4Njo6VENSRVRVUk5yaToNCisgIGNhc2UgWDg2OjpUQ1JFVFVSTnJpNjQ6DQorICBjYXNlIFg4Njo6VEVTVDhtaToNCisgIGNhc2UgWDg2OjpWUEVYVFJCbXI6DQorICBjYXNlIFg4Njo6WEFERDhybToNCisgIGNhc2UgWDg2OjpYT1I4bWk6DQorICBjYXNlIFg4Njo6WE9SOG1yOg0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSBYODY6OkFFU0tFWUdFTkFTU0lTVDEyOHJyOg0KKyAgY2FzZSBYODY6OkNNUFBEcm1pOg0KKyAgY2FzZSBYODY6OkNNUFBEcnJpOg0KKyAgY2FzZSBYODY6OkNNUFBTcm1pOg0KKyAgY2FzZSBYODY6OkNNUFBTcnJpOg0KKyAgY2FzZSBYODY6OkNNUFNEcm06DQorICBjYXNlIFg4Njo6Q01QU0RycjoNCisgIGNhc2UgWDg2OjpDTVBTU3JtOg0KKyAgY2FzZSBYODY6OkNNUFNTcnI6DQorICBjYXNlIFg4Njo6RVhUUkFDVFBTcnI6DQorICBjYXNlIFg4Njo6SU1VTDE2cnJpOg0KKyAgY2FzZSBYODY6OklNVUwxNnJyaTg6DQorICBjYXNlIFg4Njo6SU1VTDMycnJpOg0KKyAgY2FzZSBYODY6OklNVUwzMnJyaTg6DQorICBjYXNlIFg4Njo6SU1VTDY0cnJpMzI6DQorICBjYXNlIFg4Njo6SU1VTDY0cnJpODoNCisgIGNhc2UgWDg2OjpJbnRfQ01QU0RybToNCisgIGNhc2UgWDg2OjpJbnRfQ01QU0RycjoNCisgIGNhc2UgWDg2OjpJbnRfQ01QU1NybToNCisgIGNhc2UgWDg2OjpJbnRfQ01QU1NycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNEMlNTcm06DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTRDJTU3JyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUU0kyU0Q2NHJtOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUU0kyU0Q2NHJyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUU0kyU0RybToNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNEcnI6DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTUzY0cm06DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTUzY0cnI6DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTU3JtOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUU0kyU1NycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNTMlNEcm06DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTUzJTRHJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QRVhUUldyaToNCisgIGNhc2UgWDg2OjpNTVhfUElOU1JXcm1pOg0KKyAgY2FzZSBYODY6Ok1NWF9QU0hVRldyaToNCisgIGNhc2UgWDg2OjpNT1Y4bXJfTk9SRVg6DQorICBjYXNlIFg4Njo6UEFMSUdOUjY0cm06DQorICBjYXNlIFg4Njo6UENNUEVTVFJJQXJyOg0KKyAgY2FzZSBYODY6OlBDTVBFU1RSSUNycjoNCisgIGNhc2UgWDg2OjpQQ01QRVNUUklPcnI6DQorICBjYXNlIFg4Njo6UENNUEVTVFJJU3JyOg0KKyAgY2FzZSBYODY6OlBDTVBFU1RSSVpycjoNCisgIGNhc2UgWDg2OjpQQ01QRVNUUklycjoNCisgIGNhc2UgWDg2OjpQQ01QRVNUUk0xMjhycjoNCisgIGNhc2UgWDg2OjpQQ01QSVNUUklBcnI6DQorICBjYXNlIFg4Njo6UENNUElTVFJJQ3JyOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSSU9ycjoNCisgIGNhc2UgWDg2OjpQQ01QSVNUUklTcnI6DQorICBjYXNlIFg4Njo6UENNUElTVFJJWnJyOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSSXJyOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSTTEyOHJyOg0KKyAgY2FzZSBYODY6OlBFWFRSQnJyOg0KKyAgY2FzZSBYODY6OlBFWFRSRHJyOg0KKyAgY2FzZSBYODY6OlBFWFRSUXJyOg0KKyAgY2FzZSBYODY6OlBFWFRSV3JpOg0KKyAgY2FzZSBYODY6OlBJTlNSQnJtOg0KKyAgY2FzZSBYODY6OlBJTlNSRHJtOg0KKyAgY2FzZSBYODY6OlBJTlNSUXJtOg0KKyAgY2FzZSBYODY6OlBJTlNSV3JtaToNCisgIGNhc2UgWDg2OjpQU0hVRkRyaToNCisgIGNhc2UgWDg2OjpQU0hVRkhXcmk6DQorICBjYXNlIFg4Njo6UFNIVUZMV3JpOg0KKyAgY2FzZSBYODY6OlJPVU5EUERyX0ludDoNCisgIGNhc2UgWDg2OjpST1VORFBTcl9JbnQ6DQorICBjYXNlIFg4Njo6VkFERFBEWXJyOg0KKyAgY2FzZSBYODY6OlZBRERQRHJtOg0KKyAgY2FzZSBYODY6OlZBRERQRHJyOg0KKyAgY2FzZSBYODY6OlZBRERQU1lycjoNCisgIGNhc2UgWDg2OjpWQUREUFNybToNCisgIGNhc2UgWDg2OjpWQUREUFNycjoNCisgIGNhc2UgWDg2OjpWQUREU0RybToNCisgIGNhc2UgWDg2OjpWQUREU0RybV9JbnQ6DQorICBjYXNlIFg4Njo6VkFERFNEcnI6DQorICBjYXNlIFg4Njo6VkFERFNEcnJfSW50Og0KKyAgY2FzZSBYODY6OlZBRERTU3JtOg0KKyAgY2FzZSBYODY6OlZBRERTU3JtX0ludDoNCisgIGNhc2UgWDg2OjpWQUREU1NycjoNCisgIGNhc2UgWDg2OjpWQUREU1Nycl9JbnQ6DQorICBjYXNlIFg4Njo6VkFERFNVQlBEWXJyOg0KKyAgY2FzZSBYODY6OlZBRERTVUJQRHJtOg0KKyAgY2FzZSBYODY6OlZBRERTVUJQRHJyOg0KKyAgY2FzZSBYODY6OlZBRERTVUJQU1lycjoNCisgIGNhc2UgWDg2OjpWQUREU1VCUFNybToNCisgIGNhc2UgWDg2OjpWQUREU1VCUFNycjoNCisgIGNhc2UgWDg2OjpWQUVTREVDTEFTVHJtOg0KKyAgY2FzZSBYODY6OlZBRVNERUNMQVNUcnI6DQorICBjYXNlIFg4Njo6VkFFU0RFQ3JtOg0KKyAgY2FzZSBYODY6OlZBRVNERUNycjoNCisgIGNhc2UgWDg2OjpWQUVTRU5DTEFTVHJtOg0KKyAgY2FzZSBYODY6OlZBRVNFTkNMQVNUcnI6DQorICBjYXNlIFg4Njo6VkFFU0VOQ3JtOg0KKyAgY2FzZSBYODY6OlZBRVNFTkNycjoNCisgIGNhc2UgWDg2OjpWQUVTS0VZR0VOQVNTSVNUMTI4cnI6DQorICBjYXNlIFg4Njo6VkFORE5QRFlycjoNCisgIGNhc2UgWDg2OjpWQU5ETlBEcm06DQorICBjYXNlIFg4Njo6VkFORE5QRHJyOg0KKyAgY2FzZSBYODY6OlZBTkROUFNZcnI6DQorICBjYXNlIFg4Njo6VkFORE5QU3JtOg0KKyAgY2FzZSBYODY6OlZBTkROUFNycjoNCisgIGNhc2UgWDg2OjpWQU5EUERZcnI6DQorICBjYXNlIFg4Njo6VkFORFBEcm06DQorICBjYXNlIFg4Njo6VkFORFBEcnI6DQorICBjYXNlIFg4Njo6VkFORFBTWXJyOg0KKyAgY2FzZSBYODY6OlZBTkRQU3JtOg0KKyAgY2FzZSBYODY6OlZBTkRQU3JyOg0KKyAgY2FzZSBYODY6OlZCTEVORFBEWXJyaToNCisgIGNhc2UgWDg2OjpWQkxFTkRQRHJyaToNCisgIGNhc2UgWDg2OjpWQkxFTkRQU1lycmk6DQorICBjYXNlIFg4Njo6VkJMRU5EUFNycmk6DQorICBjYXNlIFg4Njo6VkJMRU5EVlBEWXJyOg0KKyAgY2FzZSBYODY6OlZCTEVORFZQRHJyOg0KKyAgY2FzZSBYODY6OlZCTEVORFZQU1lycjoNCisgIGNhc2UgWDg2OjpWQkxFTkRWUFNycjoNCisgIGNhc2UgWDg2OjpWQ01QUERZcnJpX2FsdDoNCisgIGNhc2UgWDg2OjpWQ01QUERycmlfYWx0Og0KKyAgY2FzZSBYODY6OlZDTVBQU1lycmlfYWx0Og0KKyAgY2FzZSBYODY6OlZDTVBQU3JyaV9hbHQ6DQorICBjYXNlIFg4Njo6VkNNUFNEcnJfYWx0Og0KKyAgY2FzZSBYODY6OlZDTVBTU3JyX2FsdDoNCisgIGNhc2UgWDg2OjpWQ1ZUU0QyU1NybToNCisgIGNhc2UgWDg2OjpWQ1ZUU0QyU1NycjoNCisgIGNhc2UgWDg2OjpWQ1ZUU0kyU0Q2NHJtOg0KKyAgY2FzZSBYODY6OlZDVlRTSTJTRDY0cnI6DQorICBjYXNlIFg4Njo6VkNWVFNJMlNETHJtOg0KKyAgY2FzZSBYODY6OlZDVlRTSTJTRExycjoNCisgIGNhc2UgWDg2OjpWQ1ZUU0kyU0RybToNCisgIGNhc2UgWDg2OjpWQ1ZUU0kyU0RycjoNCisgIGNhc2UgWDg2OjpWQ1ZUU0kyU1M2NHJtOg0KKyAgY2FzZSBYODY6OlZDVlRTSTJTUzY0cnI6DQorICBjYXNlIFg4Njo6VkNWVFNJMlNTcm06DQorICBjYXNlIFg4Njo6VkNWVFNJMlNTcnI6DQorICBjYXNlIFg4Njo6VkNWVFNTMlNEcm06DQorICBjYXNlIFg4Njo6VkNWVFNTMlNEcnI6DQorICBjYXNlIFg4Njo6VkRJVlBEWXJyOg0KKyAgY2FzZSBYODY6OlZESVZQRHJtOg0KKyAgY2FzZSBYODY6OlZESVZQRHJyOg0KKyAgY2FzZSBYODY6OlZESVZQU1lycjoNCisgIGNhc2UgWDg2OjpWRElWUFNybToNCisgIGNhc2UgWDg2OjpWRElWUFNycjoNCisgIGNhc2UgWDg2OjpWRElWU0RybToNCisgIGNhc2UgWDg2OjpWRElWU0RybV9JbnQ6DQorICBjYXNlIFg4Njo6VkRJVlNEcnI6DQorICBjYXNlIFg4Njo6VkRJVlNEcnJfSW50Og0KKyAgY2FzZSBYODY6OlZESVZTU3JtOg0KKyAgY2FzZSBYODY6OlZESVZTU3JtX0ludDoNCisgIGNhc2UgWDg2OjpWRElWU1NycjoNCisgIGNhc2UgWDg2OjpWRElWU1Nycl9JbnQ6DQorICBjYXNlIFg4Njo6VkRQUERycmk6DQorICBjYXNlIFg4Njo6VkRQUFNZcnJpOg0KKyAgY2FzZSBYODY6OlZEUFBTcnJpOg0KKyAgY2FzZSBYODY6OlZFWFRSQUNURjEyOHJyOg0KKyAgY2FzZSBYODY6OlZFWFRSQUNUUFNycjoNCisgIGNhc2UgWDg2OjpWRVhUUkFDVFBTcnI2NDoNCisgIGNhc2UgWDg2OjpWRk1BRERQRHIxMzJtOg0KKyAgY2FzZSBYODY6OlZGTUFERFBEcjEzMnI6DQorICBjYXNlIFg4Njo6VkZNQUREUERyMTMyclk6DQorICBjYXNlIFg4Njo6VkZNQUREUERyMjEzbToNCisgIGNhc2UgWDg2OjpWRk1BRERQRHIyMTNyOg0KKyAgY2FzZSBYODY6OlZGTUFERFBEcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTUFERFBEcjIzMW06DQorICBjYXNlIFg4Njo6VkZNQUREUERyMjMxcjoNCisgIGNhc2UgWDg2OjpWRk1BRERQRHIyMzFyWToNCisgIGNhc2UgWDg2OjpWRk1BRERQU3IxMzJtOg0KKyAgY2FzZSBYODY6OlZGTUFERFBTcjEzMnI6DQorICBjYXNlIFg4Njo6VkZNQUREUFNyMTMyclk6DQorICBjYXNlIFg4Njo6VkZNQUREUFNyMjEzbToNCisgIGNhc2UgWDg2OjpWRk1BRERQU3IyMTNyOg0KKyAgY2FzZSBYODY6OlZGTUFERFBTcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTUFERFBTcjIzMW06DQorICBjYXNlIFg4Njo6VkZNQUREUFNyMjMxcjoNCisgIGNhc2UgWDg2OjpWRk1BRERQU3IyMzFyWToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIxMzJtOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjEzMnI6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMTMyclk6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMjEzbToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIyMTNyOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIzMW06DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMjMxcjoNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIyMzFyWToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IxMzJtOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjEzMnI6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMTMyclk6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMjEzbToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IyMTNyOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIzMW06DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMjMxcjoNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IyMzFyWToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIxMzJtOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjEzMnI6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMTMyclk6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMjEzbToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIyMTNyOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIzMW06DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMjMxcjoNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIyMzFyWToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IxMzJtOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjEzMnI6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMTMyclk6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMjEzbToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IyMTNyOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIzMW06DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMjMxcjoNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IyMzFyWToNCisgIGNhc2UgWDg2OjpWRk1TVUJQRHIxMzJtOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBEcjEzMnI6DQorICBjYXNlIFg4Njo6VkZNU1VCUERyMTMyclk6DQorICBjYXNlIFg4Njo6VkZNU1VCUERyMjEzbToNCisgIGNhc2UgWDg2OjpWRk1TVUJQRHIyMTNyOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBEcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBEcjIzMW06DQorICBjYXNlIFg4Njo6VkZNU1VCUERyMjMxcjoNCisgIGNhc2UgWDg2OjpWRk1TVUJQRHIyMzFyWToNCisgIGNhc2UgWDg2OjpWRk1TVUJQU3IxMzJtOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBTcjEzMnI6DQorICBjYXNlIFg4Njo6VkZNU1VCUFNyMTMyclk6DQorICBjYXNlIFg4Njo6VkZNU1VCUFNyMjEzbToNCisgIGNhc2UgWDg2OjpWRk1TVUJQU3IyMTNyOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBTcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBTcjIzMW06DQorICBjYXNlIFg4Njo6VkZNU1VCUFNyMjMxcjoNCisgIGNhc2UgWDg2OjpWRk1TVUJQU3IyMzFyWToNCisgIGNhc2UgWDg2OjpWRk5NQUREUERyMTMybToNCisgIGNhc2UgWDg2OjpWRk5NQUREUERyMTMycjoNCisgIGNhc2UgWDg2OjpWRk5NQUREUERyMTMyclk6DQorICBjYXNlIFg4Njo6VkZOTUFERFBEcjIxM206DQorICBjYXNlIFg4Njo6VkZOTUFERFBEcjIxM3I6DQorICBjYXNlIFg4Njo6VkZOTUFERFBEcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQRHIyMzFtOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQRHIyMzFyOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQRHIyMzFyWToNCisgIGNhc2UgWDg2OjpWRk5NQUREUFNyMTMybToNCisgIGNhc2UgWDg2OjpWRk5NQUREUFNyMTMycjoNCisgIGNhc2UgWDg2OjpWRk5NQUREUFNyMTMyclk6DQorICBjYXNlIFg4Njo6VkZOTUFERFBTcjIxM206DQorICBjYXNlIFg4Njo6VkZOTUFERFBTcjIxM3I6DQorICBjYXNlIFg4Njo6VkZOTUFERFBTcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQU3IyMzFtOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQU3IyMzFyOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQU3IyMzFyWToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUERyMTMybToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUERyMTMycjoNCisgIGNhc2UgWDg2OjpWRk5NU1VCUERyMTMyclk6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIxM206DQorICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIxM3I6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMzFtOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMzFyOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMzFyWToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMTMybToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMTMycjoNCisgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMTMyclk6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIxM206DQorICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIxM3I6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIxM3JZOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMzFtOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMzFyOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMzFyWToNCisgIGNhc2UgWDg2OjpWRnNBTkROUERybToNCisgIGNhc2UgWDg2OjpWRnNBTkROUERycjoNCisgIGNhc2UgWDg2OjpWRnNBTkROUFNybToNCisgIGNhc2UgWDg2OjpWRnNBTkROUFNycjoNCisgIGNhc2UgWDg2OjpWRnNBTkRQRHJtOg0KKyAgY2FzZSBYODY6OlZGc0FORFBEcnI6DQorICBjYXNlIFg4Njo6VkZzQU5EUFNybToNCisgIGNhc2UgWDg2OjpWRnNBTkRQU3JyOg0KKyAgY2FzZSBYODY6OlZGc09SUERybToNCisgIGNhc2UgWDg2OjpWRnNPUlBEcnI6DQorICBjYXNlIFg4Njo6VkZzT1JQU3JtOg0KKyAgY2FzZSBYODY6OlZGc09SUFNycjoNCisgIGNhc2UgWDg2OjpWRnNYT1JQRHJtOg0KKyAgY2FzZSBYODY6OlZGc1hPUlBEcnI6DQorICBjYXNlIFg4Njo6VkZzWE9SUFNybToNCisgIGNhc2UgWDg2OjpWRnNYT1JQU3JyOg0KKyAgY2FzZSBYODY6OlZIQUREUERZcnI6DQorICBjYXNlIFg4Njo6VkhBRERQRHJtOg0KKyAgY2FzZSBYODY6OlZIQUREUERycjoNCisgIGNhc2UgWDg2OjpWSEFERFBTWXJyOg0KKyAgY2FzZSBYODY6OlZIQUREUFNybToNCisgIGNhc2UgWDg2OjpWSEFERFBTcnI6DQorICBjYXNlIFg4Njo6VkhTVUJQRFlycjoNCisgIGNhc2UgWDg2OjpWSFNVQlBEcm06DQorICBjYXNlIFg4Njo6VkhTVUJQRHJyOg0KKyAgY2FzZSBYODY6OlZIU1VCUFNZcnI6DQorICBjYXNlIFg4Njo6VkhTVUJQU3JtOg0KKyAgY2FzZSBYODY6OlZIU1VCUFNycjoNCisgIGNhc2UgWDg2OjpWSU5TRVJURjEyOHJyOg0KKyAgY2FzZSBYODY6OlZJTlNFUlRQU3JyOg0KKyAgY2FzZSBYODY6OlZNQVNLTU9WUERybToNCisgIGNhc2UgWDg2OjpWTUFTS01PVlBTcm06DQorICBjYXNlIFg4Njo6Vk1BWFBEWXJyOg0KKyAgY2FzZSBYODY6OlZNQVhQRFlycl9JbnQ6DQorICBjYXNlIFg4Njo6Vk1BWFBEcm06DQorICBjYXNlIFg4Njo6Vk1BWFBEcm1fSW50Og0KKyAgY2FzZSBYODY6OlZNQVhQRHJyOg0KKyAgY2FzZSBYODY6OlZNQVhQRHJyX0ludDoNCisgIGNhc2UgWDg2OjpWTUFYUFNZcnI6DQorICBjYXNlIFg4Njo6Vk1BWFBTWXJyX0ludDoNCisgIGNhc2UgWDg2OjpWTUFYUFNybToNCisgIGNhc2UgWDg2OjpWTUFYUFNybV9JbnQ6DQorICBjYXNlIFg4Njo6Vk1BWFBTcnI6DQorICBjYXNlIFg4Njo6Vk1BWFBTcnJfSW50Og0KKyAgY2FzZSBYODY6OlZNQVhTRHJtOg0KKyAgY2FzZSBYODY6OlZNQVhTRHJtX0ludDoNCisgIGNhc2UgWDg2OjpWTUFYU0RycjoNCisgIGNhc2UgWDg2OjpWTUFYU0Rycl9JbnQ6DQorICBjYXNlIFg4Njo6Vk1BWFNTcm06DQorICBjYXNlIFg4Njo6Vk1BWFNTcm1fSW50Og0KKyAgY2FzZSBYODY6OlZNQVhTU3JyOg0KKyAgY2FzZSBYODY6OlZNQVhTU3JyX0ludDoNCisgIGNhc2UgWDg2OjpWTUlOUERZcnI6DQorICBjYXNlIFg4Njo6Vk1JTlBEWXJyX0ludDoNCisgIGNhc2UgWDg2OjpWTUlOUERybToNCisgIGNhc2UgWDg2OjpWTUlOUERybV9JbnQ6DQorICBjYXNlIFg4Njo6Vk1JTlBEcnI6DQorICBjYXNlIFg4Njo6Vk1JTlBEcnJfSW50Og0KKyAgY2FzZSBYODY6OlZNSU5QU1lycjoNCisgIGNhc2UgWDg2OjpWTUlOUFNZcnJfSW50Og0KKyAgY2FzZSBYODY6OlZNSU5QU3JtOg0KKyAgY2FzZSBYODY6OlZNSU5QU3JtX0ludDoNCisgIGNhc2UgWDg2OjpWTUlOUFNycjoNCisgIGNhc2UgWDg2OjpWTUlOUFNycl9JbnQ6DQorICBjYXNlIFg4Njo6Vk1JTlNEcm06DQorICBjYXNlIFg4Njo6Vk1JTlNEcm1fSW50Og0KKyAgY2FzZSBYODY6OlZNSU5TRHJyOg0KKyAgY2FzZSBYODY6OlZNSU5TRHJyX0ludDoNCisgIGNhc2UgWDg2OjpWTUlOU1NybToNCisgIGNhc2UgWDg2OjpWTUlOU1NybV9JbnQ6DQorICBjYXNlIFg4Njo6Vk1JTlNTcnI6DQorICBjYXNlIFg4Njo6Vk1JTlNTcnJfSW50Og0KKyAgY2FzZSBYODY6OlZNT1ZITFBTcnI6DQorICBjYXNlIFg4Njo6Vk1PVkhQRHJtOg0KKyAgY2FzZSBYODY6OlZNT1ZIUFNybToNCisgIGNhc2UgWDg2OjpWTU9WTEhQU3JyOg0KKyAgY2FzZSBYODY6OlZNT1ZMUERybToNCisgIGNhc2UgWDg2OjpWTU9WTFBTcm06DQorICBjYXNlIFg4Njo6Vk1PVlNEcnI6DQorICBjYXNlIFg4Njo6Vk1PVlNTcnI6DQorICBjYXNlIFg4Njo6Vk1QU0FEQldycmk6DQorICBjYXNlIFg4Njo6Vk1VTFBEWXJyOg0KKyAgY2FzZSBYODY6OlZNVUxQRHJtOg0KKyAgY2FzZSBYODY6OlZNVUxQRHJyOg0KKyAgY2FzZSBYODY6OlZNVUxQU1lycjoNCisgIGNhc2UgWDg2OjpWTVVMUFNybToNCisgIGNhc2UgWDg2OjpWTVVMUFNycjoNCisgIGNhc2UgWDg2OjpWTVVMU0RybToNCisgIGNhc2UgWDg2OjpWTVVMU0RybV9JbnQ6DQorICBjYXNlIFg4Njo6Vk1VTFNEcnI6DQorICBjYXNlIFg4Njo6Vk1VTFNEcnJfSW50Og0KKyAgY2FzZSBYODY6OlZNVUxTU3JtOg0KKyAgY2FzZSBYODY6OlZNVUxTU3JtX0ludDoNCisgIGNhc2UgWDg2OjpWTVVMU1NycjoNCisgIGNhc2UgWDg2OjpWTVVMU1Nycl9JbnQ6DQorICBjYXNlIFg4Njo6Vk9SUERZcnI6DQorICBjYXNlIFg4Njo6Vk9SUERybToNCisgIGNhc2UgWDg2OjpWT1JQRHJyOg0KKyAgY2FzZSBYODY6OlZPUlBTWXJyOg0KKyAgY2FzZSBYODY6OlZPUlBTcm06DQorICBjYXNlIFg4Njo6Vk9SUFNycjoNCisgIGNhc2UgWDg2OjpWUEFDS1NTRFdybToNCisgIGNhc2UgWDg2OjpWUEFDS1NTRFdycjoNCisgIGNhc2UgWDg2OjpWUEFDS1NTV0JybToNCisgIGNhc2UgWDg2OjpWUEFDS1NTV0JycjoNCisgIGNhc2UgWDg2OjpWUEFDS1VTRFdybToNCisgIGNhc2UgWDg2OjpWUEFDS1VTRFdycjoNCisgIGNhc2UgWDg2OjpWUEFDS1VTV0JybToNCisgIGNhc2UgWDg2OjpWUEFDS1VTV0JycjoNCisgIGNhc2UgWDg2OjpWUEFEREJybToNCisgIGNhc2UgWDg2OjpWUEFEREJycjoNCisgIGNhc2UgWDg2OjpWUEFERERybToNCisgIGNhc2UgWDg2OjpWUEFERERycjoNCisgIGNhc2UgWDg2OjpWUEFERFFybToNCisgIGNhc2UgWDg2OjpWUEFERFFycjoNCisgIGNhc2UgWDg2OjpWUEFERFNCcm06DQorICBjYXNlIFg4Njo6VlBBRERTQnJyOg0KKyAgY2FzZSBYODY6OlZQQUREU1dybToNCisgIGNhc2UgWDg2OjpWUEFERFNXcnI6DQorICBjYXNlIFg4Njo6VlBBRERVU0JybToNCisgIGNhc2UgWDg2OjpWUEFERFVTQnJyOg0KKyAgY2FzZSBYODY6OlZQQUREVVNXcm06DQorICBjYXNlIFg4Njo6VlBBRERVU1dycjoNCisgIGNhc2UgWDg2OjpWUEFERFdybToNCisgIGNhc2UgWDg2OjpWUEFERFdycjoNCisgIGNhc2UgWDg2OjpWUEFMSUdOUjEyOHJyOg0KKyAgY2FzZSBYODY6OlZQQUxJR05SNjRycjoNCisgIGNhc2UgWDg2OjpWUEFORE5ybToNCisgIGNhc2UgWDg2OjpWUEFORE5ycjoNCisgIGNhc2UgWDg2OjpWUEFORHJtOg0KKyAgY2FzZSBYODY6OlZQQU5EcnI6DQorICBjYXNlIFg4Njo6VlBBVkdCcm06DQorICBjYXNlIFg4Njo6VlBBVkdCcnI6DQorICBjYXNlIFg4Njo6VlBBVkdXcm06DQorICBjYXNlIFg4Njo6VlBBVkdXcnI6DQorICBjYXNlIFg4Njo6VlBCTEVORFZCcnI6DQorICBjYXNlIFg4Njo6VlBCTEVORFdycmk6DQorICBjYXNlIFg4Njo6VlBDTE1VTEhRSFFEUXJtOg0KKyAgY2FzZSBYODY6OlZQQ0xNVUxIUUhRRFFycjoNCisgIGNhc2UgWDg2OjpWUENMTVVMSFFMUURRcm06DQorICBjYXNlIFg4Njo6VlBDTE1VTEhRTFFEUXJyOg0KKyAgY2FzZSBYODY6OlZQQ0xNVUxMUUhRRFFybToNCisgIGNhc2UgWDg2OjpWUENMTVVMTFFIUURRcnI6DQorICBjYXNlIFg4Njo6VlBDTE1VTExRTFFEUXJtOg0KKyAgY2FzZSBYODY6OlZQQ0xNVUxMUUxRRFFycjoNCisgIGNhc2UgWDg2OjpWUENMTVVMUURRcnI6DQorICBjYXNlIFg4Njo6VlBDTVBFUUJybToNCisgIGNhc2UgWDg2OjpWUENNUEVRQnJyOg0KKyAgY2FzZSBYODY6OlZQQ01QRVFEcm06DQorICBjYXNlIFg4Njo6VlBDTVBFUURycjoNCisgIGNhc2UgWDg2OjpWUENNUEVRUXJtOg0KKyAgY2FzZSBYODY6OlZQQ01QRVFRcnI6DQorICBjYXNlIFg4Njo6VlBDTVBFUVdybToNCisgIGNhc2UgWDg2OjpWUENNUEVRV3JyOg0KKyAgY2FzZSBYODY6OlZQQ01QRVNUUklBcnI6DQorICBjYXNlIFg4Njo6VlBDTVBFU1RSSUNycjoNCisgIGNhc2UgWDg2OjpWUENNUEVTVFJJT3JyOg0KKyAgY2FzZSBYODY6OlZQQ01QRVNUUklTcnI6DQorICBjYXNlIFg4Njo6VlBDTVBFU1RSSVpycjoNCisgIGNhc2UgWDg2OjpWUENNUEVTVFJJcnI6DQorICBjYXNlIFg4Njo6VlBDTVBFU1RSTTEyOHJyOg0KKyAgY2FzZSBYODY6OlZQQ01QR1RCcm06DQorICBjYXNlIFg4Njo6VlBDTVBHVEJycjoNCisgIGNhc2UgWDg2OjpWUENNUEdURHJtOg0KKyAgY2FzZSBYODY6OlZQQ01QR1REcnI6DQorICBjYXNlIFg4Njo6VlBDTVBHVFFybToNCisgIGNhc2UgWDg2OjpWUENNUEdUUXJyOg0KKyAgY2FzZSBYODY6OlZQQ01QR1RXcm06DQorICBjYXNlIFg4Njo6VlBDTVBHVFdycjoNCisgIGNhc2UgWDg2OjpWUENNUElTVFJJQXJyOg0KKyAgY2FzZSBYODY6OlZQQ01QSVNUUklDcnI6DQorICBjYXNlIFg4Njo6VlBDTVBJU1RSSU9ycjoNCisgIGNhc2UgWDg2OjpWUENNUElTVFJJU3JyOg0KKyAgY2FzZSBYODY6OlZQQ01QSVNUUklacnI6DQorICBjYXNlIFg4Njo6VlBDTVBJU1RSSXJyOg0KKyAgY2FzZSBYODY6OlZQQ01QSVNUUk0xMjhycjoNCisgIGNhc2UgWDg2OjpWUEVSTTJGMTI4cnI6DQorICBjYXNlIFg4Njo6VlBFUk1JTFBEWXJpOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQRFlycjoNCisgIGNhc2UgWDg2OjpWUEVSTUlMUERyaToNCisgIGNhc2UgWDg2OjpWUEVSTUlMUERybToNCisgIGNhc2UgWDg2OjpWUEVSTUlMUERycjoNCisgIGNhc2UgWDg2OjpWUEVSTUlMUFNZcmk6DQorICBjYXNlIFg4Njo6VlBFUk1JTFBTWXJyOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQU3JpOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQU3JtOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQU3JyOg0KKyAgY2FzZSBYODY6OlZQRVhUUkJycjoNCisgIGNhc2UgWDg2OjpWUEVYVFJCcnI2NDoNCisgIGNhc2UgWDg2OjpWUEVYVFJEcnI6DQorICBjYXNlIFg4Njo6VlBFWFRSUXJyOg0KKyAgY2FzZSBYODY6OlZQRVhUUldyaToNCisgIGNhc2UgWDg2OjpWUEhBREREcm0xMjg6DQorICBjYXNlIFg4Njo6VlBIQURERHJtNjQ6DQorICBjYXNlIFg4Njo6VlBIQURERHJyMTI4Og0KKyAgY2FzZSBYODY6OlZQSEFERERycjY0Og0KKyAgY2FzZSBYODY6OlZQSEFERFNXcm0xMjg6DQorICBjYXNlIFg4Njo6VlBIQUREU1dybTY0Og0KKyAgY2FzZSBYODY6OlZQSEFERFNXcnIxMjg6DQorICBjYXNlIFg4Njo6VlBIQUREU1dycjY0Og0KKyAgY2FzZSBYODY6OlZQSEFERFdybTEyODoNCisgIGNhc2UgWDg2OjpWUEhBRERXcm02NDoNCisgIGNhc2UgWDg2OjpWUEhBRERXcnIxMjg6DQorICBjYXNlIFg4Njo6VlBIQUREV3JyNjQ6DQorICBjYXNlIFg4Njo6VlBIU1VCRHJtMTI4Og0KKyAgY2FzZSBYODY6OlZQSFNVQkRybTY0Og0KKyAgY2FzZSBYODY6OlZQSFNVQkRycjEyODoNCisgIGNhc2UgWDg2OjpWUEhTVUJEcnI2NDoNCisgIGNhc2UgWDg2OjpWUEhTVUJTV3JtMTI4Og0KKyAgY2FzZSBYODY6OlZQSFNVQlNXcm02NDoNCisgIGNhc2UgWDg2OjpWUEhTVUJTV3JyMTI4Og0KKyAgY2FzZSBYODY6OlZQSFNVQlNXcnI2NDoNCisgIGNhc2UgWDg2OjpWUEhTVUJXcm0xMjg6DQorICBjYXNlIFg4Njo6VlBIU1VCV3JtNjQ6DQorICBjYXNlIFg4Njo6VlBIU1VCV3JyMTI4Og0KKyAgY2FzZSBYODY6OlZQSFNVQldycjY0Og0KKyAgY2FzZSBYODY6OlZQSU5TUkJycjoNCisgIGNhc2UgWDg2OjpWUElOU1JEcnI6DQorICBjYXNlIFg4Njo6VlBJTlNSUXJyOg0KKyAgY2FzZSBYODY6OlZQSU5TUldycjY0aToNCisgIGNhc2UgWDg2OjpWUElOU1JXcnJpOg0KKyAgY2FzZSBYODY6OlZQTUFERFVCU1dybTEyODoNCisgIGNhc2UgWDg2OjpWUE1BRERVQlNXcm02NDoNCisgIGNhc2UgWDg2OjpWUE1BRERVQlNXcnIxMjg6DQorICBjYXNlIFg4Njo6VlBNQUREVUJTV3JyNjQ6DQorICBjYXNlIFg4Njo6VlBNQUREV0RybToNCisgIGNhc2UgWDg2OjpWUE1BRERXRHJyOg0KKyAgY2FzZSBYODY6OlZQTUFYU0JybToNCisgIGNhc2UgWDg2OjpWUE1BWFNCcnI6DQorICBjYXNlIFg4Njo6VlBNQVhTRHJtOg0KKyAgY2FzZSBYODY6OlZQTUFYU0RycjoNCisgIGNhc2UgWDg2OjpWUE1BWFNXcm06DQorICBjYXNlIFg4Njo6VlBNQVhTV3JyOg0KKyAgY2FzZSBYODY6OlZQTUFYVUJybToNCisgIGNhc2UgWDg2OjpWUE1BWFVCcnI6DQorICBjYXNlIFg4Njo6VlBNQVhVRHJtOg0KKyAgY2FzZSBYODY6OlZQTUFYVURycjoNCisgIGNhc2UgWDg2OjpWUE1BWFVXcm06DQorICBjYXNlIFg4Njo6VlBNQVhVV3JyOg0KKyAgY2FzZSBYODY6OlZQTUlOU0JybToNCisgIGNhc2UgWDg2OjpWUE1JTlNCcnI6DQorICBjYXNlIFg4Njo6VlBNSU5TRHJtOg0KKyAgY2FzZSBYODY6OlZQTUlOU0RycjoNCisgIGNhc2UgWDg2OjpWUE1JTlNXcm06DQorICBjYXNlIFg4Njo6VlBNSU5TV3JyOg0KKyAgY2FzZSBYODY6OlZQTUlOVUJybToNCisgIGNhc2UgWDg2OjpWUE1JTlVCcnI6DQorICBjYXNlIFg4Njo6VlBNSU5VRHJtOg0KKyAgY2FzZSBYODY6OlZQTUlOVURycjoNCisgIGNhc2UgWDg2OjpWUE1JTlVXcm06DQorICBjYXNlIFg4Njo6VlBNSU5VV3JyOg0KKyAgY2FzZSBYODY6OlZQTVVMRFFybToNCisgIGNhc2UgWDg2OjpWUE1VTERRcnI6DQorICBjYXNlIFg4Njo6VlBNVUxIUlNXcm0xMjg6DQorICBjYXNlIFg4Njo6VlBNVUxIUlNXcm02NDoNCisgIGNhc2UgWDg2OjpWUE1VTEhSU1dycjEyODoNCisgIGNhc2UgWDg2OjpWUE1VTEhSU1dycjY0Og0KKyAgY2FzZSBYODY6OlZQTVVMSFVXcm06DQorICBjYXNlIFg4Njo6VlBNVUxIVVdycjoNCisgIGNhc2UgWDg2OjpWUE1VTEhXcm06DQorICBjYXNlIFg4Njo6VlBNVUxIV3JyOg0KKyAgY2FzZSBYODY6OlZQTVVMTERybToNCisgIGNhc2UgWDg2OjpWUE1VTExEcnI6DQorICBjYXNlIFg4Njo6VlBNVUxMV3JtOg0KKyAgY2FzZSBYODY6OlZQTVVMTFdycjoNCisgIGNhc2UgWDg2OjpWUE1VTFVEUXJtOg0KKyAgY2FzZSBYODY6OlZQTVVMVURRcnI6DQorICBjYXNlIFg4Njo6VlBPUnJtOg0KKyAgY2FzZSBYODY6OlZQT1JycjoNCisgIGNhc2UgWDg2OjpWUFNBREJXcm06DQorICBjYXNlIFg4Njo6VlBTQURCV3JyOg0KKyAgY2FzZSBYODY6OlZQU0hVRkJybTEyODoNCisgIGNhc2UgWDg2OjpWUFNIVUZCcm02NDoNCisgIGNhc2UgWDg2OjpWUFNIVUZCcnIxMjg6DQorICBjYXNlIFg4Njo6VlBTSFVGQnJyNjQ6DQorICBjYXNlIFg4Njo6VlBTSFVGRHJpOg0KKyAgY2FzZSBYODY6OlZQU0hVRkhXcmk6DQorICBjYXNlIFg4Njo6VlBTSFVGTFdyaToNCisgIGNhc2UgWDg2OjpWUFNJR05Ccm0xMjg6DQorICBjYXNlIFg4Njo6VlBTSUdOQnJtNjQ6DQorICBjYXNlIFg4Njo6VlBTSUdOQnJyMTI4Og0KKyAgY2FzZSBYODY6OlZQU0lHTkJycjY0Og0KKyAgY2FzZSBYODY6OlZQU0lHTkRybTEyODoNCisgIGNhc2UgWDg2OjpWUFNJR05Ecm02NDoNCisgIGNhc2UgWDg2OjpWUFNJR05EcnIxMjg6DQorICBjYXNlIFg4Njo6VlBTSUdORHJyNjQ6DQorICBjYXNlIFg4Njo6VlBTSUdOV3JtMTI4Og0KKyAgY2FzZSBYODY6OlZQU0lHTldybTY0Og0KKyAgY2FzZSBYODY6OlZQU0lHTldycjEyODoNCisgIGNhc2UgWDg2OjpWUFNJR05XcnI2NDoNCisgIGNhc2UgWDg2OjpWUFNMTERRcmk6DQorICBjYXNlIFg4Njo6VlBTTExEcmk6DQorICBjYXNlIFg4Njo6VlBTTExEcm06DQorICBjYXNlIFg4Njo6VlBTTExEcnI6DQorICBjYXNlIFg4Njo6VlBTTExRcmk6DQorICBjYXNlIFg4Njo6VlBTTExRcm06DQorICBjYXNlIFg4Njo6VlBTTExRcnI6DQorICBjYXNlIFg4Njo6VlBTTExXcmk6DQorICBjYXNlIFg4Njo6VlBTTExXcm06DQorICBjYXNlIFg4Njo6VlBTTExXcnI6DQorICBjYXNlIFg4Njo6VlBTUkFEcmk6DQorICBjYXNlIFg4Njo6VlBTUkFEcm06DQorICBjYXNlIFg4Njo6VlBTUkFEcnI6DQorICBjYXNlIFg4Njo6VlBTUkFXcmk6DQorICBjYXNlIFg4Njo6VlBTUkFXcm06DQorICBjYXNlIFg4Njo6VlBTUkFXcnI6DQorICBjYXNlIFg4Njo6VlBTUkxEUXJpOg0KKyAgY2FzZSBYODY6OlZQU1JMRHJpOg0KKyAgY2FzZSBYODY6OlZQU1JMRHJtOg0KKyAgY2FzZSBYODY6OlZQU1JMRHJyOg0KKyAgY2FzZSBYODY6OlZQU1JMUXJpOg0KKyAgY2FzZSBYODY6OlZQU1JMUXJtOg0KKyAgY2FzZSBYODY6OlZQU1JMUXJyOg0KKyAgY2FzZSBYODY6OlZQU1JMV3JpOg0KKyAgY2FzZSBYODY6OlZQU1JMV3JtOg0KKyAgY2FzZSBYODY6OlZQU1JMV3JyOg0KKyAgY2FzZSBYODY6OlZQU1VCQnJtOg0KKyAgY2FzZSBYODY6OlZQU1VCQnJyOg0KKyAgY2FzZSBYODY6OlZQU1VCRHJtOg0KKyAgY2FzZSBYODY6OlZQU1VCRHJyOg0KKyAgY2FzZSBYODY6OlZQU1VCUXJtOg0KKyAgY2FzZSBYODY6OlZQU1VCUXJyOg0KKyAgY2FzZSBYODY6OlZQU1VCU0JybToNCisgIGNhc2UgWDg2OjpWUFNVQlNCcnI6DQorICBjYXNlIFg4Njo6VlBTVUJTV3JtOg0KKyAgY2FzZSBYODY6OlZQU1VCU1dycjoNCisgIGNhc2UgWDg2OjpWUFNVQlVTQnJtOg0KKyAgY2FzZSBYODY6OlZQU1VCVVNCcnI6DQorICBjYXNlIFg4Njo6VlBTVUJVU1dybToNCisgIGNhc2UgWDg2OjpWUFNVQlVTV3JyOg0KKyAgY2FzZSBYODY6OlZQU1VCV3JtOg0KKyAgY2FzZSBYODY6OlZQU1VCV3JyOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tIQldybToNCisgIGNhc2UgWDg2OjpWUFVOUENLSEJXcnI6DQorICBjYXNlIFg4Njo6VlBVTlBDS0hEUXJtOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tIRFFycjoNCisgIGNhc2UgWDg2OjpWUFVOUENLSFFEUXJtOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tIUURRcnI6DQorICBjYXNlIFg4Njo6VlBVTlBDS0hXRHJtOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tIV0RycjoNCisgIGNhc2UgWDg2OjpWUFVOUENLTEJXcm06DQorICBjYXNlIFg4Njo6VlBVTlBDS0xCV3JyOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tMRFFybToNCisgIGNhc2UgWDg2OjpWUFVOUENLTERRcnI6DQorICBjYXNlIFg4Njo6VlBVTlBDS0xRRFFybToNCisgIGNhc2UgWDg2OjpWUFVOUENLTFFEUXJyOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tMV0RybToNCisgIGNhc2UgWDg2OjpWUFVOUENLTFdEcnI6DQorICBjYXNlIFg4Njo6VlBYT1JybToNCisgIGNhc2UgWDg2OjpWUFhPUnJyOg0KKyAgY2FzZSBYODY6OlZSQ1BTU206DQorICBjYXNlIFg4Njo6VlJDUFNTcjoNCisgIGNhc2UgWDg2OjpWUkNQU1NyX0ludDoNCisgIGNhc2UgWDg2OjpWUk9VTkRQRHI6DQorICBjYXNlIFg4Njo6VlJPVU5EUERyX0ludDoNCisgIGNhc2UgWDg2OjpWUk9VTkRQU3I6DQorICBjYXNlIFg4Njo6VlJPVU5EUFNyX0ludDoNCisgIGNhc2UgWDg2OjpWUk9VTkRTRHI6DQorICBjYXNlIFg4Njo6VlJPVU5EU0RyX0ludDoNCisgIGNhc2UgWDg2OjpWUk9VTkRTU3I6DQorICBjYXNlIFg4Njo6VlJPVU5EU1NyX0ludDoNCisgIGNhc2UgWDg2OjpWUk9VTkRZUERyOg0KKyAgY2FzZSBYODY6OlZST1VORFlQRHJfSW50Og0KKyAgY2FzZSBYODY6OlZST1VORFlQU3I6DQorICBjYXNlIFg4Njo6VlJPVU5EWVBTcl9JbnQ6DQorICBjYXNlIFg4Njo6VlJTUVJUU1NtOg0KKyAgY2FzZSBYODY6OlZSU1FSVFNTcjoNCisgIGNhc2UgWDg2OjpWUlNRUlRTU3JfSW50Og0KKyAgY2FzZSBYODY6OlZTSFVGUERZcnJpOg0KKyAgY2FzZSBYODY6OlZTSFVGUERycmk6DQorICBjYXNlIFg4Njo6VlNIVUZQU1lycmk6DQorICBjYXNlIFg4Njo6VlNIVUZQU3JyaToNCisgIGNhc2UgWDg2OjpWU1FSVFNEbToNCisgIGNhc2UgWDg2OjpWU1FSVFNEcjoNCisgIGNhc2UgWDg2OjpWU1FSVFNEcl9JbnQ6DQorICBjYXNlIFg4Njo6VlNRUlRTU206DQorICBjYXNlIFg4Njo6VlNRUlRTU3I6DQorICBjYXNlIFg4Njo6VlNRUlRTU3JfSW50Og0KKyAgY2FzZSBYODY6OlZTVUJQRFlycjoNCisgIGNhc2UgWDg2OjpWU1VCUERybToNCisgIGNhc2UgWDg2OjpWU1VCUERycjoNCisgIGNhc2UgWDg2OjpWU1VCUFNZcnI6DQorICBjYXNlIFg4Njo6VlNVQlBTcm06DQorICBjYXNlIFg4Njo6VlNVQlBTcnI6DQorICBjYXNlIFg4Njo6VlNVQlNEcm06DQorICBjYXNlIFg4Njo6VlNVQlNEcm1fSW50Og0KKyAgY2FzZSBYODY6OlZTVUJTRHJyOg0KKyAgY2FzZSBYODY6OlZTVUJTRHJyX0ludDoNCisgIGNhc2UgWDg2OjpWU1VCU1NybToNCisgIGNhc2UgWDg2OjpWU1VCU1NybV9JbnQ6DQorICBjYXNlIFg4Njo6VlNVQlNTcnI6DQorICBjYXNlIFg4Njo6VlNVQlNTcnJfSW50Og0KKyAgY2FzZSBYODY6OlZVTlBDS0hQRFlycjoNCisgIGNhc2UgWDg2OjpWVU5QQ0tIUERybToNCisgIGNhc2UgWDg2OjpWVU5QQ0tIUERycjoNCisgIGNhc2UgWDg2OjpWVU5QQ0tIUFNZcnI6DQorICBjYXNlIFg4Njo6VlVOUENLSFBTcm06DQorICBjYXNlIFg4Njo6VlVOUENLSFBTcnI6DQorICBjYXNlIFg4Njo6VlVOUENLTFBEWXJyOg0KKyAgY2FzZSBYODY6OlZVTlBDS0xQRHJtOg0KKyAgY2FzZSBYODY6OlZVTlBDS0xQRHJyOg0KKyAgY2FzZSBYODY6OlZVTlBDS0xQU1lycjoNCisgIGNhc2UgWDg2OjpWVU5QQ0tMUFNybToNCisgIGNhc2UgWDg2OjpWVU5QQ0tMUFNycjoNCisgIGNhc2UgWDg2OjpWWE9SUERZcnI6DQorICBjYXNlIFg4Njo6VlhPUlBEcm06DQorICBjYXNlIFg4Njo6VlhPUlBEcnI6DQorICBjYXNlIFg4Njo6VlhPUlBTWXJyOg0KKyAgY2FzZSBYODY6OlZYT1JQU3JtOg0KKyAgY2FzZSBYODY6OlZYT1JQU3JyOg0KKyAgICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgew0KKyAgICBjYXNlIFg4Njo6QUVTS0VZR0VOQVNTSVNUMTI4cnI6IA0KKyAgICBjYXNlIFg4Njo6Q01QUERybWk6IA0KKyAgICBjYXNlIFg4Njo6Q01QUERycmk6IA0KKyAgICBjYXNlIFg4Njo6Q01QUFNybWk6IA0KKyAgICBjYXNlIFg4Njo6Q01QUFNycmk6IA0KKyAgICBjYXNlIFg4Njo6Q01QU0RybTogDQorICAgIGNhc2UgWDg2OjpDTVBTRHJyOiANCisgICAgY2FzZSBYODY6OkNNUFNTcm06IA0KKyAgICBjYXNlIFg4Njo6Q01QU1NycjogDQorICAgIGNhc2UgWDg2OjpFWFRSQUNUUFNycjogDQorICAgIGNhc2UgWDg2OjpJTVVMMTZycmk6IA0KKyAgICBjYXNlIFg4Njo6SU1VTDE2cnJpODogDQorICAgIGNhc2UgWDg2OjpJTVVMMzJycmk6IA0KKyAgICBjYXNlIFg4Njo6SU1VTDMycnJpODogDQorICAgIGNhc2UgWDg2OjpJTVVMNjRycmkzMjogDQorICAgIGNhc2UgWDg2OjpJTVVMNjRycmk4OiANCisgICAgY2FzZSBYODY6OkludF9DTVBTRHJtOiANCisgICAgY2FzZSBYODY6OkludF9DTVBTRHJyOiANCisgICAgY2FzZSBYODY6OkludF9DTVBTU3JtOiANCisgICAgY2FzZSBYODY6OkludF9DTVBTU3JyOiANCisgICAgY2FzZSBYODY6OkludF9WQ1ZUU0QyU1NybTogDQorICAgIGNhc2UgWDg2OjpJbnRfVkNWVFNEMlNTcnI6IA0KKyAgICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTRDY0cm06IA0KKyAgICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTRDY0cnI6IA0KKyAgICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTRHJtOiANCisgICAgY2FzZSBYODY6OkludF9WQ1ZUU0kyU0RycjogDQorICAgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNTNjRybTogDQorICAgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNTNjRycjogDQorICAgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNTcm06IA0KKyAgICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTU3JyOiANCisgICAgY2FzZSBYODY6OkludF9WQ1ZUU1MyU0RybTogDQorICAgIGNhc2UgWDg2OjpJbnRfVkNWVFNTMlNEcnI6IA0KKyAgICBjYXNlIFg4Njo6TU1YX1BFWFRSV3JpOiANCisgICAgY2FzZSBYODY6Ok1NWF9QSU5TUldybWk6IA0KKyAgICBjYXNlIFg4Njo6TU1YX1BTSFVGV3JpOiANCisgICAgY2FzZSBYODY6OlBBTElHTlI2NHJtOiANCisgICAgY2FzZSBYODY6OlBDTVBFU1RSSUFycjogDQorICAgIGNhc2UgWDg2OjpQQ01QRVNUUklDcnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUEVTVFJJT3JyOiANCisgICAgY2FzZSBYODY6OlBDTVBFU1RSSVNycjogDQorICAgIGNhc2UgWDg2OjpQQ01QRVNUUklacnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUEVTVFJJcnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUEVTVFJNMTI4cnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUElTVFJJQXJyOiANCisgICAgY2FzZSBYODY6OlBDTVBJU1RSSUNycjogDQorICAgIGNhc2UgWDg2OjpQQ01QSVNUUklPcnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUElTVFJJU3JyOiANCisgICAgY2FzZSBYODY6OlBDTVBJU1RSSVpycjogDQorICAgIGNhc2UgWDg2OjpQQ01QSVNUUklycjogDQorICAgIGNhc2UgWDg2OjpQQ01QSVNUUk0xMjhycjogDQorICAgIGNhc2UgWDg2OjpQRVhUUkJycjogDQorICAgIGNhc2UgWDg2OjpQRVhUUkRycjogDQorICAgIGNhc2UgWDg2OjpQRVhUUlFycjogDQorICAgIGNhc2UgWDg2OjpQRVhUUldyaTogDQorICAgIGNhc2UgWDg2OjpQSU5TUkJybTogDQorICAgIGNhc2UgWDg2OjpQSU5TUkRybTogDQorICAgIGNhc2UgWDg2OjpQSU5TUlFybTogDQorICAgIGNhc2UgWDg2OjpQSU5TUldybWk6IA0KKyAgICBjYXNlIFg4Njo6UFNIVUZEcmk6IA0KKyAgICBjYXNlIFg4Njo6UFNIVUZIV3JpOiANCisgICAgY2FzZSBYODY6OlBTSFVGTFdyaTogDQorICAgIGNhc2UgWDg2OjpST1VORFBEcl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Uk9VTkRQU3JfSW50OiANCisgICAgY2FzZSBYODY6OlZBRERQRFlycjogDQorICAgIGNhc2UgWDg2OjpWQUREUERybTogDQorICAgIGNhc2UgWDg2OjpWQUREUERycjogDQorICAgIGNhc2UgWDg2OjpWQUREUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFERFBTcm06IA0KKyAgICBjYXNlIFg4Njo6VkFERFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFERFNEcm06IA0KKyAgICBjYXNlIFg4Njo6VkFERFNEcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZBRERTRHJyOiANCisgICAgY2FzZSBYODY6OlZBRERTRHJyX0ludDogDQorICAgIGNhc2UgWDg2OjpWQUREU1NybTogDQorICAgIGNhc2UgWDg2OjpWQUREU1NybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VkFERFNTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFERFNTcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZBRERTVUJQRFlycjogDQorICAgIGNhc2UgWDg2OjpWQUREU1VCUERybTogDQorICAgIGNhc2UgWDg2OjpWQUREU1VCUERycjogDQorICAgIGNhc2UgWDg2OjpWQUREU1VCUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFERFNVQlBTcm06IA0KKyAgICBjYXNlIFg4Njo6VkFERFNVQlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFFU0RFQ0xBU1RybTogDQorICAgIGNhc2UgWDg2OjpWQUVTREVDTEFTVHJyOiANCisgICAgY2FzZSBYODY6OlZBRVNERUNybTogDQorICAgIGNhc2UgWDg2OjpWQUVTREVDcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFFU0VOQ0xBU1RybTogDQorICAgIGNhc2UgWDg2OjpWQUVTRU5DTEFTVHJyOiANCisgICAgY2FzZSBYODY6OlZBRVNFTkNybTogDQorICAgIGNhc2UgWDg2OjpWQUVTRU5DcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFFU0tFWUdFTkFTU0lTVDEyOHJyOiANCisgICAgY2FzZSBYODY6OlZBTkROUERZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFORE5QRHJtOiANCisgICAgY2FzZSBYODY6OlZBTkROUERycjogDQorICAgIGNhc2UgWDg2OjpWQU5ETlBTWXJyOiANCisgICAgY2FzZSBYODY6OlZBTkROUFNybTogDQorICAgIGNhc2UgWDg2OjpWQU5ETlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFORFBEWXJyOiANCisgICAgY2FzZSBYODY6OlZBTkRQRHJtOiANCisgICAgY2FzZSBYODY6OlZBTkRQRHJyOiANCisgICAgY2FzZSBYODY6OlZBTkRQU1lycjogDQorICAgIGNhc2UgWDg2OjpWQU5EUFNybTogDQorICAgIGNhc2UgWDg2OjpWQU5EUFNycjogDQorICAgIGNhc2UgWDg2OjpWQkxFTkRQRFlycmk6IA0KKyAgICBjYXNlIFg4Njo6VkJMRU5EUERycmk6IA0KKyAgICBjYXNlIFg4Njo6VkJMRU5EUFNZcnJpOiANCisgICAgY2FzZSBYODY6OlZCTEVORFBTcnJpOiANCisgICAgY2FzZSBYODY6OlZCTEVORFZQRFlycjogDQorICAgIGNhc2UgWDg2OjpWQkxFTkRWUERycjogDQorICAgIGNhc2UgWDg2OjpWQkxFTkRWUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkJMRU5EVlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBEWXJyaV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBEcnJpX2FsdDogDQorICAgIGNhc2UgWDg2OjpWQ01QUFNZcnJpX2FsdDogDQorICAgIGNhc2UgWDg2OjpWQ01QUFNycmlfYWx0OiANCisgICAgY2FzZSBYODY6OlZDTVBTRHJyX2FsdDogDQorICAgIGNhc2UgWDg2OjpWQ01QU1Nycl9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNEMlNTcm06IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNEMlNTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNJMlNENjRybTogDQorICAgIGNhc2UgWDg2OjpWQ1ZUU0kyU0Q2NHJyOiANCisgICAgY2FzZSBYODY6OlZDVlRTSTJTRExybTogDQorICAgIGNhc2UgWDg2OjpWQ1ZUU0kyU0RMcnI6IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNJMlNEcm06IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNJMlNEcnI6IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNJMlNTNjRybTogDQorICAgIGNhc2UgWDg2OjpWQ1ZUU0kyU1M2NHJyOiANCisgICAgY2FzZSBYODY6OlZDVlRTSTJTU3JtOiANCisgICAgY2FzZSBYODY6OlZDVlRTSTJTU3JyOiANCisgICAgY2FzZSBYODY6OlZDVlRTUzJTRHJtOiANCisgICAgY2FzZSBYODY6OlZDVlRTUzJTRHJyOiANCisgICAgY2FzZSBYODY6OlZESVZQRFlycjogDQorICAgIGNhc2UgWDg2OjpWRElWUERybTogDQorICAgIGNhc2UgWDg2OjpWRElWUERycjogDQorICAgIGNhc2UgWDg2OjpWRElWUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkRJVlBTcm06IA0KKyAgICBjYXNlIFg4Njo6VkRJVlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkRJVlNEcm06IA0KKyAgICBjYXNlIFg4Njo6VkRJVlNEcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZESVZTRHJyOiANCisgICAgY2FzZSBYODY6OlZESVZTRHJyX0ludDogDQorICAgIGNhc2UgWDg2OjpWRElWU1NybTogDQorICAgIGNhc2UgWDg2OjpWRElWU1NybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VkRJVlNTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkRJVlNTcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZEUFBEcnJpOiANCisgICAgY2FzZSBYODY6OlZEUFBTWXJyaTogDQorICAgIGNhc2UgWDg2OjpWRFBQU3JyaTogDQorICAgIGNhc2UgWDg2OjpWRVhUUkFDVEYxMjhycjogDQorICAgIGNhc2UgWDg2OjpWRVhUUkFDVFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkVYVFJBQ1RQU3JyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUERyMTMybTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQRHIxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBEcjIxM206IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUERyMjEzcjogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQRHIyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBEcjIzMXI6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUERyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUFNyMTMybTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQU3IxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBTcjIxM206IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUFNyMjEzcjogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQU3IyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBTcjIzMXI6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUFNyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMTMybTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIxM206IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMjEzcjogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIzMXI6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMTMybTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIxM206IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMjEzcjogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIzMXI6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMTMybTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIxM206IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMjEzcjogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIzMXI6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMTMybTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIxM206IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMjEzcjogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIzMXI6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUERyMTMybTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQRHIxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBEcjIxM206IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUERyMjEzcjogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQRHIyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBEcjIzMXI6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUERyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUFNyMTMybTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQU3IxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBTcjIxM206IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUFNyMjEzcjogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQU3IyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBTcjIzMXI6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUFNyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBEcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBEcjEzMnI6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQRHIyMTNtOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQRHIyMTNyOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQRHIyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUERyMjMxbTogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUERyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUERyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBTcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBTcjEzMnI6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQU3IyMTNtOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQU3IyMTNyOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQU3IyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUFNyMjMxbTogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUFNyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUFNyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBEcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBEcjEzMnI6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMTNtOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMTNyOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUERyMjMxbTogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUERyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUERyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBTcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBTcjEzMnI6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMTNtOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMTNyOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMTNyWTogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMjMxbTogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMjMxclk6IA0KKyAgICBjYXNlIFg4Njo6VkZzQU5ETlBEcm06IA0KKyAgICBjYXNlIFg4Njo6VkZzQU5ETlBEcnI6IA0KKyAgICBjYXNlIFg4Njo6VkZzQU5ETlBTcm06IA0KKyAgICBjYXNlIFg4Njo6VkZzQU5ETlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkZzQU5EUERybTogDQorICAgIGNhc2UgWDg2OjpWRnNBTkRQRHJyOiANCisgICAgY2FzZSBYODY6OlZGc0FORFBTcm06IA0KKyAgICBjYXNlIFg4Njo6VkZzQU5EUFNycjogDQorICAgIGNhc2UgWDg2OjpWRnNPUlBEcm06IA0KKyAgICBjYXNlIFg4Njo6VkZzT1JQRHJyOiANCisgICAgY2FzZSBYODY6OlZGc09SUFNybTogDQorICAgIGNhc2UgWDg2OjpWRnNPUlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkZzWE9SUERybTogDQorICAgIGNhc2UgWDg2OjpWRnNYT1JQRHJyOiANCisgICAgY2FzZSBYODY6OlZGc1hPUlBTcm06IA0KKyAgICBjYXNlIFg4Njo6VkZzWE9SUFNycjogDQorICAgIGNhc2UgWDg2OjpWSEFERFBEWXJyOiANCisgICAgY2FzZSBYODY6OlZIQUREUERybTogDQorICAgIGNhc2UgWDg2OjpWSEFERFBEcnI6IA0KKyAgICBjYXNlIFg4Njo6VkhBRERQU1lycjogDQorICAgIGNhc2UgWDg2OjpWSEFERFBTcm06IA0KKyAgICBjYXNlIFg4Njo6VkhBRERQU3JyOiANCisgICAgY2FzZSBYODY6OlZIU1VCUERZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkhTVUJQRHJtOiANCisgICAgY2FzZSBYODY6OlZIU1VCUERycjogDQorICAgIGNhc2UgWDg2OjpWSFNVQlBTWXJyOiANCisgICAgY2FzZSBYODY6OlZIU1VCUFNybTogDQorICAgIGNhc2UgWDg2OjpWSFNVQlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VklOU0VSVEYxMjhycjogDQorICAgIGNhc2UgWDg2OjpWSU5TRVJUUFNycjogDQorICAgIGNhc2UgWDg2OjpWTUFTS01PVlBEcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1BU0tNT1ZQU3JtOiANCisgICAgY2FzZSBYODY6OlZNQVhQRFlycjogDQorICAgIGNhc2UgWDg2OjpWTUFYUERZcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZNQVhQRHJtOiANCisgICAgY2FzZSBYODY6OlZNQVhQRHJtX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUFYUERycjogDQorICAgIGNhc2UgWDg2OjpWTUFYUERycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFBTWXJyOiANCisgICAgY2FzZSBYODY6OlZNQVhQU1lycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFBTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFBTcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNQVhQU3JyOiANCisgICAgY2FzZSBYODY6OlZNQVhQU3JyX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUFYU0RybTogDQorICAgIGNhc2UgWDg2OjpWTUFYU0RybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFNEcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFNEcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZNQVhTU3JtOiANCisgICAgY2FzZSBYODY6OlZNQVhTU3JtX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUFYU1NycjogDQorICAgIGNhc2UgWDg2OjpWTUFYU1Nycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlBEWXJyOiANCisgICAgY2FzZSBYODY6OlZNSU5QRFlycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlBEcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlBEcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNSU5QRHJyOiANCisgICAgY2FzZSBYODY6OlZNSU5QRHJyX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUlOUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlBTWXJyX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUlOUFNybTogDQorICAgIGNhc2UgWDg2OjpWTUlOUFNybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlBTcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZNSU5TRHJtOiANCisgICAgY2FzZSBYODY6OlZNSU5TRHJtX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUlOU0RycjogDQorICAgIGNhc2UgWDg2OjpWTUlOU0Rycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlNTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlNTcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNSU5TU3JyOiANCisgICAgY2FzZSBYODY6OlZNSU5TU3JyX0ludDogDQorICAgIGNhc2UgWDg2OjpWTU9WSExQU3JyOiANCisgICAgY2FzZSBYODY6OlZNT1ZIUERybTogDQorICAgIGNhc2UgWDg2OjpWTU9WSFBTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1PVkxIUFNycjogDQorICAgIGNhc2UgWDg2OjpWTU9WTFBEcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1PVkxQU3JtOiANCisgICAgY2FzZSBYODY6OlZNT1ZTRHJyOiANCisgICAgY2FzZSBYODY6OlZNT1ZTU3JyOiANCisgICAgY2FzZSBYODY6OlZNUFNBREJXcnJpOiANCisgICAgY2FzZSBYODY6OlZNVUxQRFlycjogDQorICAgIGNhc2UgWDg2OjpWTVVMUERybTogDQorICAgIGNhc2UgWDg2OjpWTVVMUERycjogDQorICAgIGNhc2UgWDg2OjpWTVVMUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFBTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFNEcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFNEcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNVUxTRHJyOiANCisgICAgY2FzZSBYODY6OlZNVUxTRHJyX0ludDogDQorICAgIGNhc2UgWDg2OjpWTVVMU1NybTogDQorICAgIGNhc2UgWDg2OjpWTVVMU1NybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFNTcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFNTcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZPUlBEWXJyOiANCisgICAgY2FzZSBYODY6OlZPUlBEcm06IA0KKyAgICBjYXNlIFg4Njo6Vk9SUERycjogDQorICAgIGNhc2UgWDg2OjpWT1JQU1lycjogDQorICAgIGNhc2UgWDg2OjpWT1JQU3JtOiANCisgICAgY2FzZSBYODY6OlZPUlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBQ0tTU0RXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBQ0tTU0RXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBQ0tTU1dCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBQ0tTU1dCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBQ0tVU0RXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBQ0tVU0RXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBQ0tVU1dCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBQ0tVU1dCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBRERCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBRERCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBREREcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBREREcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBRERRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBRERRcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBRERTQnJtOiANCisgICAgY2FzZSBYODY6OlZQQUREU0JycjogDQorICAgIGNhc2UgWDg2OjpWUEFERFNXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBRERTV3JyOiANCisgICAgY2FzZSBYODY6OlZQQUREVVNCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBRERVU0JycjogDQorICAgIGNhc2UgWDg2OjpWUEFERFVTV3JtOiANCisgICAgY2FzZSBYODY6OlZQQUREVVNXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBRERXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBRERXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBTElHTlIxMjhycjogDQorICAgIGNhc2UgWDg2OjpWUEFMSUdOUjY0cnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBTkROcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBTkROcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBTkRybTogDQorICAgIGNhc2UgWDg2OjpWUEFORHJyOiANCisgICAgY2FzZSBYODY6OlZQQVZHQnJtOiANCisgICAgY2FzZSBYODY6OlZQQVZHQnJyOiANCisgICAgY2FzZSBYODY6OlZQQVZHV3JtOiANCisgICAgY2FzZSBYODY6OlZQQVZHV3JyOiANCisgICAgY2FzZSBYODY6OlZQQkxFTkRWQnJyOiANCisgICAgY2FzZSBYODY6OlZQQkxFTkRXcnJpOiANCisgICAgY2FzZSBYODY6OlZQQ0xNVUxIUUhRRFFybTogDQorICAgIGNhc2UgWDg2OjpWUENMTVVMSFFIUURRcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTE1VTEhRTFFEUXJtOiANCisgICAgY2FzZSBYODY6OlZQQ0xNVUxIUUxRRFFycjogDQorICAgIGNhc2UgWDg2OjpWUENMTVVMTFFIUURRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTE1VTExRSFFEUXJyOiANCisgICAgY2FzZSBYODY6OlZQQ0xNVUxMUUxRRFFybTogDQorICAgIGNhc2UgWDg2OjpWUENMTVVMTFFMUURRcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTE1VTFFEUXJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVFCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFUUJycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEVRRHJtOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVFEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFUVFybTogDQorICAgIGNhc2UgWDg2OjpWUENNUEVRUXJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVFXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFUVdycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEVTVFJJQXJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVNUUklDcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFU1RSSU9ycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEVTVFJJU3JyOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVNUUklacnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFU1RSSXJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVNUUk0xMjhycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEdUQnJtOiANCisgICAgY2FzZSBYODY6OlZQQ01QR1RCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBHVERybTogDQorICAgIGNhc2UgWDg2OjpWUENNUEdURHJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QR1RRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBHVFFycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEdUV3JtOiANCisgICAgY2FzZSBYODY6OlZQQ01QR1RXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBJU1RSSUFycjogDQorICAgIGNhc2UgWDg2OjpWUENNUElTVFJJQ3JyOiANCisgICAgY2FzZSBYODY6OlZQQ01QSVNUUklPcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBJU1RSSVNycjogDQorICAgIGNhc2UgWDg2OjpWUENNUElTVFJJWnJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QSVNUUklycjogDQorICAgIGNhc2UgWDg2OjpWUENNUElTVFJNMTI4cnI6IA0KKyAgICBjYXNlIFg4Njo6VlBFUk0yRjEyOHJyOiANCisgICAgY2FzZSBYODY6OlZQRVJNSUxQRFlyaTogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUERZcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBFUk1JTFBEcmk6IA0KKyAgICBjYXNlIFg4Njo6VlBFUk1JTFBEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBFUk1JTFBEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBFUk1JTFBTWXJpOiANCisgICAgY2FzZSBYODY6OlZQRVJNSUxQU1lycjogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUFNyaTogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUFNybTogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUFNycjogDQorICAgIGNhc2UgWDg2OjpWUEVYVFJCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBFWFRSQnJyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBFWFRSRHJyOiANCisgICAgY2FzZSBYODY6OlZQRVhUUlFycjogDQorICAgIGNhc2UgWDg2OjpWUEVYVFJXcmk6IA0KKyAgICBjYXNlIFg4Njo6VlBIQURERHJtMTI4OiANCisgICAgY2FzZSBYODY6OlZQSEFERERybTY0OiANCisgICAgY2FzZSBYODY6OlZQSEFERERycjEyODogDQorICAgIGNhc2UgWDg2OjpWUEhBREREcnI2NDogDQorICAgIGNhc2UgWDg2OjpWUEhBRERTV3JtMTI4OiANCisgICAgY2FzZSBYODY6OlZQSEFERFNXcm02NDogDQorICAgIGNhc2UgWDg2OjpWUEhBRERTV3JyMTI4OiANCisgICAgY2FzZSBYODY6OlZQSEFERFNXcnI2NDogDQorICAgIGNhc2UgWDg2OjpWUEhBRERXcm0xMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBIQUREV3JtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBIQUREV3JyMTI4OiANCisgICAgY2FzZSBYODY6OlZQSEFERFdycjY0OiANCisgICAgY2FzZSBYODY6OlZQSFNVQkRybTEyODogDQorICAgIGNhc2UgWDg2OjpWUEhTVUJEcm02NDogDQorICAgIGNhc2UgWDg2OjpWUEhTVUJEcnIxMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBIU1VCRHJyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBIU1VCU1dybTEyODogDQorICAgIGNhc2UgWDg2OjpWUEhTVUJTV3JtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBIU1VCU1dycjEyODogDQorICAgIGNhc2UgWDg2OjpWUEhTVUJTV3JyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBIU1VCV3JtMTI4OiANCisgICAgY2FzZSBYODY6OlZQSFNVQldybTY0OiANCisgICAgY2FzZSBYODY6OlZQSFNVQldycjEyODogDQorICAgIGNhc2UgWDg2OjpWUEhTVUJXcnI2NDogDQorICAgIGNhc2UgWDg2OjpWUElOU1JCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBJTlNSRHJyOiANCisgICAgY2FzZSBYODY6OlZQSU5TUlFycjogDQorICAgIGNhc2UgWDg2OjpWUElOU1JXcnI2NGk6IA0KKyAgICBjYXNlIFg4Njo6VlBJTlNSV3JyaTogDQorICAgIGNhc2UgWDg2OjpWUE1BRERVQlNXcm0xMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBNQUREVUJTV3JtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBNQUREVUJTV3JyMTI4OiANCisgICAgY2FzZSBYODY6OlZQTUFERFVCU1dycjY0OiANCisgICAgY2FzZSBYODY6OlZQTUFERFdEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNQUREV0RycjogDQorICAgIGNhc2UgWDg2OjpWUE1BWFNCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNQVhTQnJyOiANCisgICAgY2FzZSBYODY6OlZQTUFYU0RybTogDQorICAgIGNhc2UgWDg2OjpWUE1BWFNEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNQVhTV3JtOiANCisgICAgY2FzZSBYODY6OlZQTUFYU1dycjogDQorICAgIGNhc2UgWDg2OjpWUE1BWFVCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNQVhVQnJyOiANCisgICAgY2FzZSBYODY6OlZQTUFYVURybTogDQorICAgIGNhc2UgWDg2OjpWUE1BWFVEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNQVhVV3JtOiANCisgICAgY2FzZSBYODY6OlZQTUFYVVdycjogDQorICAgIGNhc2UgWDg2OjpWUE1JTlNCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNSU5TQnJyOiANCisgICAgY2FzZSBYODY6OlZQTUlOU0RybTogDQorICAgIGNhc2UgWDg2OjpWUE1JTlNEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNSU5TV3JtOiANCisgICAgY2FzZSBYODY6OlZQTUlOU1dycjogDQorICAgIGNhc2UgWDg2OjpWUE1JTlVCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNSU5VQnJyOiANCisgICAgY2FzZSBYODY6OlZQTUlOVURybTogDQorICAgIGNhc2UgWDg2OjpWUE1JTlVEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNSU5VV3JtOiANCisgICAgY2FzZSBYODY6OlZQTUlOVVdycjogDQorICAgIGNhc2UgWDg2OjpWUE1VTERRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxEUXJyOiANCisgICAgY2FzZSBYODY6OlZQTVVMSFJTV3JtMTI4OiANCisgICAgY2FzZSBYODY6OlZQTVVMSFJTV3JtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxIUlNXcnIxMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxIUlNXcnI2NDogDQorICAgIGNhc2UgWDg2OjpWUE1VTEhVV3JtOiANCisgICAgY2FzZSBYODY6OlZQTVVMSFVXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxIV3JtOiANCisgICAgY2FzZSBYODY6OlZQTVVMSFdycjogDQorICAgIGNhc2UgWDg2OjpWUE1VTExEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxMRHJyOiANCisgICAgY2FzZSBYODY6OlZQTVVMTFdybTogDQorICAgIGNhc2UgWDg2OjpWUE1VTExXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxVRFFybTogDQorICAgIGNhc2UgWDg2OjpWUE1VTFVEUXJyOiANCisgICAgY2FzZSBYODY6OlZQT1JybTogDQorICAgIGNhc2UgWDg2OjpWUE9ScnI6IA0KKyAgICBjYXNlIFg4Njo6VlBTQURCV3JtOiANCisgICAgY2FzZSBYODY6OlZQU0FEQldycjogDQorICAgIGNhc2UgWDg2OjpWUFNIVUZCcm0xMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBTSFVGQnJtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBTSFVGQnJyMTI4OiANCisgICAgY2FzZSBYODY6OlZQU0hVRkJycjY0OiANCisgICAgY2FzZSBYODY6OlZQU0hVRkRyaTogDQorICAgIGNhc2UgWDg2OjpWUFNIVUZIV3JpOiANCisgICAgY2FzZSBYODY6OlZQU0hVRkxXcmk6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdOQnJtMTI4OiANCisgICAgY2FzZSBYODY6OlZQU0lHTkJybTY0OiANCisgICAgY2FzZSBYODY6OlZQU0lHTkJycjEyODogDQorICAgIGNhc2UgWDg2OjpWUFNJR05CcnI2NDogDQorICAgIGNhc2UgWDg2OjpWUFNJR05Ecm0xMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdORHJtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdORHJyMTI4OiANCisgICAgY2FzZSBYODY6OlZQU0lHTkRycjY0OiANCisgICAgY2FzZSBYODY6OlZQU0lHTldybTEyODogDQorICAgIGNhc2UgWDg2OjpWUFNJR05Xcm02NDogDQorICAgIGNhc2UgWDg2OjpWUFNJR05XcnIxMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdOV3JyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBTTExEUXJpOiANCisgICAgY2FzZSBYODY6OlZQU0xMRHJpOiANCisgICAgY2FzZSBYODY6OlZQU0xMRHJtOiANCisgICAgY2FzZSBYODY6OlZQU0xMRHJyOiANCisgICAgY2FzZSBYODY6OlZQU0xMUXJpOiANCisgICAgY2FzZSBYODY6OlZQU0xMUXJtOiANCisgICAgY2FzZSBYODY6OlZQU0xMUXJyOiANCisgICAgY2FzZSBYODY6OlZQU0xMV3JpOiANCisgICAgY2FzZSBYODY6OlZQU0xMV3JtOiANCisgICAgY2FzZSBYODY6OlZQU0xMV3JyOiANCisgICAgY2FzZSBYODY6OlZQU1JBRHJpOiANCisgICAgY2FzZSBYODY6OlZQU1JBRHJtOiANCisgICAgY2FzZSBYODY6OlZQU1JBRHJyOiANCisgICAgY2FzZSBYODY6OlZQU1JBV3JpOiANCisgICAgY2FzZSBYODY6OlZQU1JBV3JtOiANCisgICAgY2FzZSBYODY6OlZQU1JBV3JyOiANCisgICAgY2FzZSBYODY6OlZQU1JMRFFyaTogDQorICAgIGNhc2UgWDg2OjpWUFNSTERyaTogDQorICAgIGNhc2UgWDg2OjpWUFNSTERybTogDQorICAgIGNhc2UgWDg2OjpWUFNSTERycjogDQorICAgIGNhc2UgWDg2OjpWUFNSTFFyaTogDQorICAgIGNhc2UgWDg2OjpWUFNSTFFybTogDQorICAgIGNhc2UgWDg2OjpWUFNSTFFycjogDQorICAgIGNhc2UgWDg2OjpWUFNSTFdyaTogDQorICAgIGNhc2UgWDg2OjpWUFNSTFdybTogDQorICAgIGNhc2UgWDg2OjpWUFNSTFdycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQkJybTogDQorICAgIGNhc2UgWDg2OjpWUFNVQkJycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQkRybTogDQorICAgIGNhc2UgWDg2OjpWUFNVQkRycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQlFybTogDQorICAgIGNhc2UgWDg2OjpWUFNVQlFycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQlNCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJTQnJyOiANCisgICAgY2FzZSBYODY6OlZQU1VCU1dybTogDQorICAgIGNhc2UgWDg2OjpWUFNVQlNXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJVU0JybTogDQorICAgIGNhc2UgWDg2OjpWUFNVQlVTQnJyOiANCisgICAgY2FzZSBYODY6OlZQU1VCVVNXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJVU1dycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQldybTogDQorICAgIGNhc2UgWDg2OjpWUFNVQldycjogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLSEJXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0hCV3JyOiANCisgICAgY2FzZSBYODY6OlZQVU5QQ0tIRFFybTogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLSERRcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0hRRFFybTogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLSFFEUXJyOiANCisgICAgY2FzZSBYODY6OlZQVU5QQ0tIV0RybTogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLSFdEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0xCV3JtOiANCisgICAgY2FzZSBYODY6OlZQVU5QQ0tMQldycjogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLTERRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0xEUXJyOiANCisgICAgY2FzZSBYODY6OlZQVU5QQ0tMUURRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0xRRFFycjogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLTFdEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0xXRHJyOiANCisgICAgY2FzZSBYODY6OlZQWE9Scm06IA0KKyAgICBjYXNlIFg4Njo6VlBYT1JycjogDQorICAgIGNhc2UgWDg2OjpWUkNQU1NtOiANCisgICAgY2FzZSBYODY6OlZSQ1BTU3I6IA0KKyAgICBjYXNlIFg4Njo6VlJDUFNTcl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EUERyOiANCisgICAgY2FzZSBYODY6OlZST1VORFBEcl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EUFNyOiANCisgICAgY2FzZSBYODY6OlZST1VORFBTcl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EU0RyOiANCisgICAgY2FzZSBYODY6OlZST1VORFNEcl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EU1NyOiANCisgICAgY2FzZSBYODY6OlZST1VORFNTcl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EWVBEcjogDQorICAgIGNhc2UgWDg2OjpWUk9VTkRZUERyX0ludDogDQorICAgIGNhc2UgWDg2OjpWUk9VTkRZUFNyOiANCisgICAgY2FzZSBYODY6OlZST1VORFlQU3JfSW50OiANCisgICAgY2FzZSBYODY6OlZSU1FSVFNTbTogDQorICAgIGNhc2UgWDg2OjpWUlNRUlRTU3I6IA0KKyAgICBjYXNlIFg4Njo6VlJTUVJUU1NyX0ludDogDQorICAgIGNhc2UgWDg2OjpWU0hVRlBEWXJyaTogDQorICAgIGNhc2UgWDg2OjpWU0hVRlBEcnJpOiANCisgICAgY2FzZSBYODY6OlZTSFVGUFNZcnJpOiANCisgICAgY2FzZSBYODY6OlZTSFVGUFNycmk6IA0KKyAgICBjYXNlIFg4Njo6VlNRUlRTRG06IA0KKyAgICBjYXNlIFg4Njo6VlNRUlRTRHI6IA0KKyAgICBjYXNlIFg4Njo6VlNRUlRTRHJfSW50OiANCisgICAgY2FzZSBYODY6OlZTUVJUU1NtOiANCisgICAgY2FzZSBYODY6OlZTUVJUU1NyOiANCisgICAgY2FzZSBYODY6OlZTUVJUU1NyX0ludDogDQorICAgIGNhc2UgWDg2OjpWU1VCUERZcnI6IA0KKyAgICBjYXNlIFg4Njo6VlNVQlBEcm06IA0KKyAgICBjYXNlIFg4Njo6VlNVQlBEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlNVQlBTWXJyOiANCisgICAgY2FzZSBYODY6OlZTVUJQU3JtOiANCisgICAgY2FzZSBYODY6OlZTVUJQU3JyOiANCisgICAgY2FzZSBYODY6OlZTVUJTRHJtOiANCisgICAgY2FzZSBYODY6OlZTVUJTRHJtX0ludDogDQorICAgIGNhc2UgWDg2OjpWU1VCU0RycjogDQorICAgIGNhc2UgWDg2OjpWU1VCU0Rycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlNVQlNTcm06IA0KKyAgICBjYXNlIFg4Njo6VlNVQlNTcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZTVUJTU3JyOiANCisgICAgY2FzZSBYODY6OlZTVUJTU3JyX0ludDogDQorICAgIGNhc2UgWDg2OjpWVU5QQ0tIUERZcnI6IA0KKyAgICBjYXNlIFg4Njo6VlVOUENLSFBEcm06IA0KKyAgICBjYXNlIFg4Njo6VlVOUENLSFBEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlVOUENLSFBTWXJyOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0hQU3JtOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0hQU3JyOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0xQRFlycjogDQorICAgIGNhc2UgWDg2OjpWVU5QQ0tMUERybTogDQorICAgIGNhc2UgWDg2OjpWVU5QQ0tMUERycjogDQorICAgIGNhc2UgWDg2OjpWVU5QQ0tMUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6VlVOUENLTFBTcm06IA0KKyAgICBjYXNlIFg4Njo6VlVOUENLTFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VlhPUlBEWXJyOiANCisgICAgY2FzZSBYODY6OlZYT1JQRHJtOiANCisgICAgY2FzZSBYODY6OlZYT1JQRHJyOiANCisgICAgY2FzZSBYODY6OlZYT1JQU1lycjogDQorICAgIGNhc2UgWDg2OjpWWE9SUFNybTogDQorICAgIGNhc2UgWDg2OjpWWE9SUFNycjogcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgYnJlYWs7DQorICAgIGNhc2UgWDg2OjpNT1Y4bXJfTk9SRVg6IE8gPDwgIiAgIyBOT1JFWCI7IGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIFg4Njo6SW50X1ZDTVBTRHJtOg0KKyAgY2FzZSBYODY6OkludF9WQ01QU0RycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNNUFNTcm06DQorICBjYXNlIFg4Njo6SW50X1ZDTVBTU3JyOg0KKyAgY2FzZSBYODY6OlZDTVBQRFlybWk6DQorICBjYXNlIFg4Njo6VkNNUFBEWXJyaToNCisgIGNhc2UgWDg2OjpWQ01QUERybWk6DQorICBjYXNlIFg4Njo6VkNNUFBEcnJpOg0KKyAgY2FzZSBYODY6OlZDTVBQU1lybWk6DQorICBjYXNlIFg4Njo6VkNNUFBTWXJyaToNCisgIGNhc2UgWDg2OjpWQ01QUFNybWk6DQorICBjYXNlIFg4Njo6VkNNUFBTcnJpOg0KKyAgY2FzZSBYODY6OlZDTVBTRHJtOg0KKyAgY2FzZSBYODY6OlZDTVBTRHJyOg0KKyAgY2FzZSBYODY6OlZDTVBTU3JtOg0KKyAgY2FzZSBYODY6OlZDTVBTU3JyOg0KKyAgY2FzZSBYODY6OlZQQUxJR05SNjRybToNCisgIGNhc2UgWDg2OjpWUElOU1JCcm06DQorICBjYXNlIFg4Njo6VlBJTlNSRHJtOg0KKyAgY2FzZSBYODY6OlZQSU5TUlFybToNCisgIGNhc2UgWDg2OjpWUElOU1JXcm1pOg0KKyAgICBwcmludE9wZXJhbmQoTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIFg4Njo6VkFTVEFSVF9TQVZFX1hNTV9SRUdTOg0KKyAgY2FzZSBYODY6OlZCTEVORFBEcm1pOg0KKyAgY2FzZSBYODY6OlZCTEVORFBTcm1pOg0KKyAgY2FzZSBYODY6OlZCTEVORFZQRHJtOg0KKyAgY2FzZSBYODY6OlZCTEVORFZQU3JtOg0KKyAgY2FzZSBYODY6OlZDTVBQRFlybWlfYWx0Og0KKyAgY2FzZSBYODY6OlZDTVBQRHJtaV9hbHQ6DQorICBjYXNlIFg4Njo6VkNNUFBTWXJtaV9hbHQ6DQorICBjYXNlIFg4Njo6VkNNUFBTcm1pX2FsdDoNCisgIGNhc2UgWDg2OjpWQ01QU0RybV9hbHQ6DQorICBjYXNlIFg4Njo6VkNNUFNTcm1fYWx0Og0KKyAgY2FzZSBYODY6OlZEUFBEcm1pOg0KKyAgY2FzZSBYODY6OlZEUFBTcm1pOg0KKyAgY2FzZSBYODY6OlZJTlNFUlRGMTI4cm06DQorICBjYXNlIFg4Njo6VklOU0VSVFBTcm06DQorICBjYXNlIFg4Njo6Vk1QU0FEQldybWk6DQorICBjYXNlIFg4Njo6VlBBTElHTlIxMjhybToNCisgIGNhc2UgWDg2OjpWUEJMRU5EVkJybToNCisgIGNhc2UgWDg2OjpWUEJMRU5EV3JtaToNCisgIGNhc2UgWDg2OjpWUENMTVVMUURRcm06DQorICBjYXNlIFg4Njo6VlJPVU5EU0RtOg0KKyAgY2FzZSBYODY6OlZST1VORFNEbV9JbnQ6DQorICBjYXNlIFg4Njo6VlJPVU5EU1NtOg0KKyAgY2FzZSBYODY6OlZST1VORFNTbV9JbnQ6DQorICBjYXNlIFg4Njo6VlNIVUZQRFlybWk6DQorICBjYXNlIFg4Njo6VlNIVUZQRHJtaToNCisgIGNhc2UgWDg2OjpWU0hVRlBTWXJtaToNCisgIGNhc2UgWDg2OjpWU0hVRlBTcm1pOg0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBzd2l0Y2ggKE1JLT5nZXRPcGNvZGUoKSkgew0KKyAgICBjYXNlIFg4Njo6VkFTVEFSVF9TQVZFX1hNTV9SRUdTOiBwcmludE9wZXJhbmQoTUksIDIsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OlZCTEVORFBEcm1pOiANCisgICAgY2FzZSBYODY6OlZCTEVORFBTcm1pOiANCisgICAgY2FzZSBYODY6OlZCTEVORFZQRHJtOiANCisgICAgY2FzZSBYODY6OlZCTEVORFZQU3JtOiANCisgICAgY2FzZSBYODY6OlZDTVBQRFlybWlfYWx0OiANCisgICAgY2FzZSBYODY6OlZDTVBQRHJtaV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBTWXJtaV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBTcm1pX2FsdDogDQorICAgIGNhc2UgWDg2OjpWQ01QU0RybV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFNTcm1fYWx0OiANCisgICAgY2FzZSBYODY6OlZEUFBEcm1pOiANCisgICAgY2FzZSBYODY6OlZEUFBTcm1pOiANCisgICAgY2FzZSBYODY6OlZJTlNFUlRGMTI4cm06IA0KKyAgICBjYXNlIFg4Njo6VklOU0VSVFBTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1QU0FEQldybWk6IA0KKyAgICBjYXNlIFg4Njo6VlBBTElHTlIxMjhybTogDQorICAgIGNhc2UgWDg2OjpWUEJMRU5EVkJybTogDQorICAgIGNhc2UgWDg2OjpWUEJMRU5EV3JtaTogDQorICAgIGNhc2UgWDg2OjpWUENMTVVMUURRcm06IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EU0RtOiANCisgICAgY2FzZSBYODY6OlZST1VORFNEbV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EU1NtOiANCisgICAgY2FzZSBYODY6OlZST1VORFNTbV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlNIVUZQRFlybWk6IA0KKyAgICBjYXNlIFg4Njo6VlNIVUZQRHJtaTogDQorICAgIGNhc2UgWDg2OjpWU0hVRlBTWXJtaTogDQorICAgIGNhc2UgWDg2OjpWU0hVRlBTcm1pOiBwcmludE9wZXJhbmQoTUksIDAsIE8pOyBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuOw0KK30NCisNCisNCisvLy8gZ2V0UmVnaXN0ZXJOYW1lIC0gVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGJsZ2VuDQorLy8vIGZyb20gdGhlIHJlZ2lzdGVyIHNldCBkZXNjcmlwdGlvbi4gIFRoaXMgcmV0dXJucyB0aGUgYXNzZW1ibGVyIG5hbWUNCisvLy8gZm9yIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuDQorY29uc3QgY2hhciAqWDg2QVRUSW5zdFByaW50ZXI6OmdldFJlZ2lzdGVyTmFtZSh1bnNpZ25lZCBSZWdObykgew0KKyAgYXNzZXJ0KFJlZ05vICYmIFJlZ05vIDwgMTUzICYmICJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciEiKTsNCisNCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdBc21PZmZzZXRbXSA9IHsNCisgICAgMCwgMywgNiwgOSwgMTIsIDE1LCAxOCwgMjIsIDI1LCAyOCwgMzEsIDM1LCAzOSwgNDMsIA0KKyAgICA0NywgNTEsIDU1LCA1OSwgNjMsIDY3LCA3MCwgNzMsIDc2LCA3OSwgODMsIDg2LCA5MCwgOTQsIA0KKyAgICA5OCwgMTAyLCAxMDYsIDExMCwgMTE0LCAxMTgsIDEyMSwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0NCwgMTQ4LCANCisgICAgMTU0LCAxNTgsIDE2MiwgMTY1LCAxNjksIDE3MywgMTc3LCAxODEsIDE4NSwgMTg5LCAxOTMsIDE5NywgMjAxLCAyMDQsIA0KKyAgICAyMDcsIDIxMCwgMjE0LCAyMTgsIDIyMiwgMjI2LCAyMzAsIDIzNCwgMjM4LCAyNDIsIDI0NSwgMjQ5LCAyNTMsIDI1NywgDQorICAgIDI2MCwgMjY0LCAyNjgsIDI3MiwgMjc2LCAyODEsIDI4NiwgMjkxLCAyOTUsIDMwMCwgMzA1LCAzMTAsIDMxNCwgMzE5LCANCisgICAgMzI0LCAzMjksIDMzMywgMzM4LCAzNDMsIDM0OCwgMzUyLCAzNTcsIDM2MiwgMzY3LCAzNzEsIDM3NiwgMzgxLCAzODYsIA0KKyAgICAzOTAsIDM5NCwgMzk4LCA0MDIsIDQwNiwgNDEwLCA0MTQsIDQxOCwgNDIyLCA0MjYsIDQyOSwgNDMzLCA0MzYsIDQ0MCwgDQorICAgIDQ0MywgNDQ5LCA0NTUsIDQ2MSwgNDY3LCA0NzMsIDQ3OSwgNDg1LCA0OTEsIDQ5NiwgNTAxLCA1MDYsIDUxMSwgNTE2LCANCisgICAgNTIxLCA1MjYsIDUzMSwgNTM2LCA1NDEsIDU0NywgNTUzLCA1NTksIDU2NSwgNTcxLCA1NzcsIDU4MiwgNTg3LCA1OTIsIA0KKyAgICA1OTcsIDYwMiwgNjA3LCA2MTIsIDYxNywgNjIyLCA2MjcsIDYzMywgNjM5LCA2NDUsIDY1MSwgNjU3LCAwDQorICB9Ow0KKw0KKyAgY29uc3QgY2hhciAqQXNtU3RycyA9DQorICAgICJhaFwwMDBhbFwwMDBheFwwMDBiaFwwMDBibFwwMDBicFwwMDBicGxcMDAwYnhcMDAwY2hcMDAwY2xcMDAwY3IwXDAwMGNyMSINCisgICAgIlwwMDBjcjJcMDAwY3IzXDAwMGNyNFwwMDBjcjVcMDAwY3I2XDAwMGNyN1wwMDBjcjhcMDAwY3NcMDAwY3hcMDAwZGhcMDAwIg0KKyAgICAiZGlcMDAwZGlsXDAwMGRsXDAwMGRyMFwwMDBkcjFcMDAwZHIyXDAwMGRyM1wwMDBkcjRcMDAwZHI1XDAwMGRyNlwwMDBkcjciDQorICAgICJcMDAwZHNcMDAwZHhcMDAwZWF4XDAwMGVicFwwMDBlYnhcMDAwZWN4XDAwMGVkaVwwMDBlZHhcMDAwZmxhZ3NcMDAwZWlwXDAwMCINCisgICAgImVpelwwMDBlc1wwMDBlc2lcMDAwZXNwXDAwMGZwMFwwMDBmcDFcMDAwZnAyXDAwMGZwM1wwMDBmcDRcMDAwZnA1XDAwMGZwIg0KKyAgICAiNlwwMDBmc1wwMDBnc1wwMDBpcFwwMDBtbTBcMDAwbW0xXDAwMG1tMlwwMDBtbTNcMDAwbW00XDAwMG1tNVwwMDBtbTZcMDAwIg0KKyAgICAibW03XDAwMHI4XDAwMHI4YlwwMDByOGRcMDAwcjh3XDAwMHI5XDAwMHI5YlwwMDByOWRcMDAwcjl3XDAwMHIxMFwwMDByMTAiDQorICAgICJiXDAwMHIxMGRcMDAwcjEwd1wwMDByMTFcMDAwcjExYlwwMDByMTFkXDAwMHIxMXdcMDAwcjEyXDAwMHIxMmJcMDAwcjEyZCINCisgICAgIlwwMDByMTJ3XDAwMHIxM1wwMDByMTNiXDAwMHIxM2RcMDAwcjEzd1wwMDByMTRcMDAwcjE0YlwwMDByMTRkXDAwMHIxNHdcMDAwIg0KKyAgICAicjE1XDAwMHIxNWJcMDAwcjE1ZFwwMDByMTV3XDAwMHJheFwwMDByYnBcMDAwcmJ4XDAwMHJjeFwwMDByZGlcMDAwcmR4XDAwMCINCisgICAgInJpcFwwMDByaXpcMDAwcnNpXDAwMHJzcFwwMDBzaVwwMDBzaWxcMDAwc3BcMDAwc3BsXDAwMHNzXDAwMHN0KDApXDAwMHN0Ig0KKyAgICAiKDEpXDAwMHN0KDIpXDAwMHN0KDMpXDAwMHN0KDQpXDAwMHN0KDUpXDAwMHN0KDYpXDAwMHN0KDcpXDAwMHhtbTBcMDAweG0iDQorICAgICJtMVwwMDB4bW0yXDAwMHhtbTNcMDAweG1tNFwwMDB4bW01XDAwMHhtbTZcMDAweG1tN1wwMDB4bW04XDAwMHhtbTlcMDAweCINCisgICAgIm1tMTBcMDAweG1tMTFcMDAweG1tMTJcMDAweG1tMTNcMDAweG1tMTRcMDAweG1tMTVcMDAweW1tMFwwMDB5bW0xXDAwMHltIg0KKyAgICAibTJcMDAweW1tM1wwMDB5bW00XDAwMHltbTVcMDAweW1tNlwwMDB5bW03XDAwMHltbThcMDAweW1tOVwwMDB5bW0xMFwwMDAiDQorICAgICJ5bW0xMVwwMDB5bW0xMlwwMDB5bW0xM1wwMDB5bW0xNFwwMDB5bW0xNVwwMDAiOw0KKyAgcmV0dXJuIEFzbVN0cnMrUmVnQXNtT2Zmc2V0W1JlZ05vLTFdOw0KK30NCisNCisNCisjaWZkZWYgR0VUX0lOU1RSVUNUSU9OX05BTUUNCisjdW5kZWYgR0VUX0lOU1RSVUNUSU9OX05BTUUNCisNCisvLy8gZ2V0SW5zdHJ1Y3Rpb25OYW1lOiBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0YmxnZW4NCisvLy8gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGRlc2NyaXB0aW9uLiAgVGhpcyByZXR1cm5zIHRoZSBlbnVtIG5hbWUgb2YgdGhlDQorLy8vIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4NCitjb25zdCBjaGFyICpYODZBVFRJbnN0UHJpbnRlcjo6Z2V0SW5zdHJ1Y3Rpb25OYW1lKHVuc2lnbmVkIE9wY29kZSkgew0KKyAgYXNzZXJ0KE9wY29kZSA8IDM2NzggJiYgIkludmFsaWQgaW5zdHJ1Y3Rpb24gbnVtYmVyISIpOw0KKw0KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEluc3RBc21PZmZzZXRbXSA9IHsNCisgICAgMCwgNCwgMTQsIDI3LCAzNiwgNDUsIDUwLCA2NSwgNzksIDkyLCAxMDYsIDEyMywgMTMzLCAxNDYsIA0KKyAgICAxNTEsIDE1NywgMTY2LCAxNzUsIDE4NCwgMTkzLCAyMDEsIDIxMCwgMjE4LCAyMjYsIDIzNSwgMjQzLCAyNTEsIDI2MywgDQorICAgIDI3MiwgMjgwLCAyODksIDI5NywgMzA1LCAzMTQsIDMyMiwgMzMwLCAzNDIsIDM1MSwgMzYxLCAzNzAsIDM3OCwgMzg4LCANCisgICAgMzk3LCA0MDUsIDQxMywgNDI1LCA0MzIsIDQzOSwgNDQ2LCA0NTMsIDQ2MCwgNDY3LCA0NzgsIDQ4NywgNDk1LCA1MDQsIA0KKyAgICA1MTIsIDUyMCwgNTI5LCA1MzcsIDU0NSwgNTU3LCA1NjYsIDU3NCwgNTgzLCA1OTEsIDU5OSwgNjA4LCA2MTYsIDYyNCwgDQorICAgIDYzNiwgNjQ1LCA2NTUsIDY2NCwgNjcyLCA2ODIsIDY5MSwgNjk5LCA3MDcsIDcxOSwgNzI2LCA3MzMsIDc0MCwgNzQ3LCANCisgICAgNzU0LCA3NjEsIDc3MiwgNzgwLCA3ODgsIDc5NiwgODA0LCA4MTIsIDgyNCwgODMyLCA4NDQsIDg1MiwgODY0LCA4NzIsIA0KKyAgICA4ODQsIDg5NSwgOTA2LCA5MTcsIDkyOCwgOTM3LCA5NDYsIDk1NiwgOTY2LCA5NzcsIDk4NywgOTk2LCAxMDA2LCAxMDE1LCANCisgICAgMTAyNSwgMTAzNywgMTA0NiwgMTA1OCwgMTA3MCwgMTA4MywgMTA5NiwgMTEwOSwgMTEyMiwgMTEzNSwgMTE0OCwgMTE1OCwgMTE3NywgMTE5NiwgDQorICAgIDEyMTMsIDEyMzAsIDEyNDMsIDEyNTYsIDEyNjUsIDEyNzQsIDEyODcsIDEzMDAsIDEzMDksIDEzMTgsIDEzMjcsIDEzMzYsIDEzNTcsIDEzNzgsIA0KKyAgICAxMzg3LCAxMzk1LCAxNDA0LCAxNDEyLCAxNDIwLCAxNDI5LCAxNDM3LCAxNDQ1LCAxNDU3LCAxNDY2LCAxNDc0LCAxNDgzLCAxNDkxLCAxNDk5LCANCisgICAgMTUwOCwgMTUxNiwgMTUyNCwgMTUzNiwgMTU0NSwgMTU1NSwgMTU2NCwgMTU3MiwgMTU4MiwgMTU5MSwgMTU5OSwgMTYwNywgMTYxOSwgMTYyNiwgDQorICAgIDE2MzMsIDE2NDAsIDE2NDcsIDE2NTQsIDE2NjEsIDE2NzIsIDE2ODEsIDE2OTAsIDE2OTksIDE3MDgsIDE3MTYsIDE3MjQsIDE3MzIsIDE3NDAsIA0KKyAgICAxNzUyLCAxNzYyLCAxNzcyLCAxNzgyLCAxNzk0LCAxODAzLCAxODEzLCAxODIzLCAxODMzLCAxODQzLCAxODUzLCAxODYzLCAxODc0LCAxODg1LCANCisgICAgMTg5NiwgMTkwOSwgMTkxOSwgMTkyOCwgMTkzNywgMTk0NiwgMTk1NywgMTk2NSwgMTk3NywgMTk5MCwgMjAwMSwgMjAxMiwgMjAyMywgMjAzNCwgDQorICAgIDIwNDUsIDIwNTYsIDIwNjYsIDIwNzYsIDIwODYsIDIwOTgsIDIxMDcsIDIxMTgsIDIxMjksIDIxNDAsIDIxNTEsIDIxNjMsIDIxNzUsIDIxODcsIA0KKyAgICAyMTk5LCAyMjA3LCAyMjE1LCAyMjIzLCAyMjMxLCAyMjM5LCAyMjQ3LCAyMjU1LCAyMjYzLCAyMjcxLCAyMjc5LCAyMjg3LCAyMjk1LCAyMzA0LCANCisgICAgMjMxMywgMjMyMSwgMjMyOCwgMjMzNiwgMjM0MywgMjM1MSwgMjM1OCwgMjM2NiwgMjM3MywgMjM4MSwgMjM4OCwgMjM5NiwgMjQwMywgMjQxMiwgDQorICAgIDI0MjAsIDI0MjksIDI0MzcsIDI0NDYsIDI0NTQsIDI0NjMsIDI0NzEsIDI0ODAsIDI0ODgsIDI0OTcsIDI1MDUsIDI1MTQsIDI1MjIsIDI1MzEsIA0KKyAgICAyNTM5LCAyNTQ4LCAyNTU2LCAyNTY1LCAyNTczLCAyNTgyLCAyNTkwLCAyNTk5LCAyNjA3LCAyNjE2LCAyNjI0LCAyNjMzLCAyNjQxLCAyNjUwLCANCisgICAgMjY1OCwgMjY2NywgMjY3NSwgMjY4NCwgMjY5MiwgMjcwMSwgMjcwOSwgMjcxNywgMjcyNSwgMjczMywgMjc0NywgMjc1NSwgMjc2NywgMjc3OSwgDQorICAgIDI3ODMsIDI3ODcsIDI3OTIsIDI3OTgsIDI4MDcsIDI4MTYsIDI4MjUsIDI4MjksIDI4MzMsIDI4NDEsIDI4NDUsIDI4NTAsIDI4NTQsIDI4NjQsIA0KKyAgICAyODc0LCAyODg0LCAyODk0LCAyOTA0LCAyOTE0LCAyOTI1LCAyOTM2LCAyOTQ3LCAyOTU4LCAyOTY5LCAyOTgwLCAyOTkwLCAzMDAwLCAzMDEwLCANCisgICAgMzAyMCwgMzAzMCwgMzA0MCwgMzA1MSwgMzA2MiwgMzA3MywgMzA4NCwgMzA5NSwgMzEwNiwgMzExNSwgMzEyNywgMzEzOSwgMzE1MSwgMzE1OSwgDQorICAgIDMxNzAsIDMxODEsIDMxOTIsIDMyMDIsIDMyMTIsIDMyMjIsIDMyMzIsIDMyNDIsIDMyNTIsIDMyNjAsIDMyNzEsIDMyODIsIDMyOTMsIDMzMDMsIA0KKyAgICAzMzEzLCAzMzIzLCAzMzMzLCAzMzQzLCAzMzUzLCAzMzY0LCAzMzc1LCAzMzg2LCAzMzk3LCAzNDA4LCAzNDE5LCAzNDI5LCAzNDM5LCAzNDQ5LCANCisgICAgMzQ1OSwgMzQ2OSwgMzQ3OSwgMzQ5MCwgMzUwMSwgMzUxMiwgMzUyMywgMzUzNCwgMzU0NSwgMzU1NSwgMzU2OCwgMzU4MSwgMzU5NCwgMzYwMywgDQorICAgIDM2MTUsIDM2MjcsIDM2MzksIDM2NTAsIDM2NjEsIDM2NzIsIDM2ODMsIDM2OTQsIDM3MDUsIDM3MTQsIDM3MjYsIDM3MzgsIDM3NTAsIDM3NjEsIA0KKyAgICAzNzcyLCAzNzgzLCAzNzk0LCAzODA1LCAzODE2LCAzODI3LCAzODM4LCAzODQ5LCAzODYwLCAzODcxLCAzODgyLCAzODkxLCAzOTAzLCAzOTE1LCANCisgICAgMzkyNywgMzkzOCwgMzk0OSwgMzk2MCwgMzk3MSwgMzk4MiwgMzk5MywgNDAwMywgNDAxMywgNDAyMywgNDAzMywgNDA0MywgNDA1MywgNDA2MywgDQorICAgIDQwNzMsIDQwODMsIDQwOTMsIDQxMDMsIDQxMTMsIDQxMjEsIDQxMzIsIDQxNDMsIDQxNTQsIDQxNjQsIDQxNzQsIDQxODQsIDQxOTQsIDQyMDQsIA0KKyAgICA0MjE0LCA0MjI0LCA0MjM0LCA0MjQ0LCA0MjU0LCA0MjYzLCA0Mjc0LCA0Mjg1LCA0Mjk2LCA0MzA3LCA0MzE4LCA0MzI5LCA0MzQwLCA0MzQ5LCANCisgICAgNDM1NywgNDM2NiwgNDM3NCwgNDM4MiwgNDM5MSwgNDM5OSwgNDQwNywgNDQxOSwgNDQyOCwgNDQzNiwgNDQ0NSwgNDQ1MywgNDQ2MSwgNDQ3MCwgDQorICAgIDQ0NzgsIDQ0ODYsIDQ0OTgsIDQ1MDcsIDQ1MTcsIDQ1MjYsIDQ1MzQsIDQ1NDUsIDQ1NTUsIDQ1NjQsIDQ1NzIsIDQ1ODAsIDQ1ODcsIDQ1OTQsIA0KKyAgICA0NjAxLCA0NjA4LCA0NjE1LCA0NjIyLCA0NjMzLCA0NjQyLCA0NjU1LCA0NjY0LCA0Njc3LCA0Njg2LCA0Njk5LCA0NzA4LCA0NzIxLCA0NzI4LCANCisgICAgNDczNSwgNDc0MiwgNDc0OCwgNDc1NiwgNDc2OCwgNDc3NiwgNDc4OCwgNDc5NiwgNDgwOCwgNDgxNiwgNDgyOCwgNDgzOSwgNDg1MSwgNDg2MywgDQorICAgIDQ4NzUsIDQ4ODcsIDQ4OTksIDQ5MTEsIDQ5MjEsIDQ5MzIsIDQ5NDMsIDQ5NTIsIDQ5NjEsIDQ5NzAsIDQ5NzksIDQ5OTAsIDQ5OTksIDUwMDcsIA0KKyAgICA1MDE3LCA1MDIzLCA1MDMyLCA1MDQxLCA1MDUwLCA1MDU2LCA1MDYwLCA1MDY5LCA1MDc4LCA1MDg2LCA1MDk1LCA1MTA0LCA1MTEyLCA1MTIxLCANCisgICAgNTEyOSwgNTEzOCwgNTE0NiwgNTE1NiwgNTE2NywgNTE3OCwgNTE4OSwgNTIwMCwgNTIxMSwgNTIyMiwgNTIzMywgNTI0NCwgNTI1NSwgNTI2NiwgDQorICAgIDUyNzcsIDUyODgsIDUzMDEsIDUzMTQsIDUzMjUsIDUzMzYsIDUzNDksIDUzNjIsIDUzNzMsIDUzODQsIDUzOTcsIDU0MTAsIDU0MjEsIDU0MzIsIA0KKyAgICA1NDQzLCA1NDU0LCA1NDY3LCA1NDgwLCA1NDkxLCA1NTAyLCA1NTE0LCA1NTI2LCA1NTQwLCA1NTU0LCA1NTY2LCA1NTc4LCA1NTkyLCA1NjA2LCANCisgICAgNTYxOCwgNTYzMCwgNTYzNCwgNTYzOSwgNTY0NiwgNTY1MywgNTY2MCwgNTY2NywgNTY3NywgNTY4NywgNTY5NywgNTcwNywgNTcxNCwgNTcyMSwgDQorICAgIDU3MjcsIDU3MzMsIDU3NDAsIDU3NDcsIDU3NTQsIDU3NjEsIDU3NjgsIDU3NzUsIDU3ODEsIDU3ODcsIDU3OTUsIDU4MDMsIDU4MTEsIDU4MTksIA0KKyAgICA1ODI5LCA1ODM5LCA1ODUwLCA1ODYxLCA1ODczLCA1ODg0LCA1ODk1LCA1OTA2LCA1OTE5LCA1OTMyLCA1OTQ1LCA1OTU5LCA1OTczLCA1OTg3LCANCisgICAgNjAwMSwgNjAxNSwgNjAyOSwgNjA0MCwgNjA0OCwgNjA2MCwgNjA2OCwgNjA4MCwgNjA4OCwgNjEwMCwgNjEwOCwgNjEyMCwgNjEyOSwgNjEzOCwgDQorICAgIDYxNDgsIDYxNTgsIDYxNjksIDYxNzksIDYxODgsIDYxOTgsIDYyMDcsIDYyMTcsIDYyMjksIDYyMzgsIDYyNTAsIDYyNjIsIDYyNzUsIDYyODgsIA0KKyAgICA2MzAxLCA2MzE0LCA2MzI3LCA2MzQwLCA2MzUwLCA2MzU4LCA2MzY2LCA2Mzc0LCA2MzgyLCA2MzkyLCA2NDAyLCA2NDE0LCA2NDIwLCA2NDMwLCANCisgICAgNjQ0MiwgNjQ1NCwgNjQ2MCwgNjQ3MSwgNjQ4MiwgNjQ5MywgNjUwNCwgNjUxNCwgNjUyNCwgNjUzNCwgNjU0NCwgNjU1NCwgNjU2MywgNjU2OSwgDQorICAgIDY1NzYsIDY1ODQsIDY1OTIsIDY2MDEsIDY2MTAsIDY2MTcsIDY2MjUsIDY2MzEsIDY2NDAsIDY2NDksIDY2NTksIDY2NjksIDY2NzcsIDY2ODYsIA0KKyAgICA2Njk0LCA2NzAxLCA2NzA4LCA2NzE1LCA2NzIyLCA2NzI4LCA2NzM1LCA2NzQyLCA2NzQ3LCA2NzU3LCA2NzY2LCA2Nzc0LCA2Nzk1LCA2ODE2LCANCisgICAgNjgzNywgNjg1OCwgNjg3OSwgNjkwMCwgNjkyMSwgNjk0MiwgNjk2MywgNjk3MCwgNjk3NiwgNjk4MywgNjk4OSwgNjk5NywgNzAwNSwgNzAxMiwgDQorICAgIDcwMTksIDcwMjcsIDcwMzUsIDcwNDYsIDcwNTYsIDcwNjEsIDcwNjksIDcwNzYsIDcwODQsIDcwOTAsIDcwOTgsIDcxMTEsIDcxMjQsIDcxMzcsIA0KKyAgICA3MTUwLCA3MTYzLCA3MTc2LCA3MTg5LCA3MjAyLCA3MjE1LCA3MjI4LCA3MjQxLCA3MjU0LCA3MjY1LCA3Mjc2LCA3Mjg3LCA3Mjk4LCA3MzA4LCANCisgICAgNzMxOCwgNzMyOCwgNzMzOCwgNzM0NywgNzM1NiwgNzM2NywgNzM3OCwgNzM4OSwgNzQwMCwgNzQwOSwgNzQxOCwgNzQyNywgNzQzNiwgNzQ0NiwgDQorICAgIDc0NTYsIDc0NjYsIDc0NzYsIDc0ODcsIDc0OTcsIDc1MDYsIDc1MTUsIDc1MjQsIDc1MzMsIDc1MzcsIDc1NDYsIDc1NTUsIDc1NjQsIDc1NzMsIA0KKyAgICA3NTgxLCA3NTg5LCA3NTk3LCA3NjA1LCA3NjEzLCA3NjIxLCA3NjI4LCA3NjM1LCA3NjQ0LCA3NjUzLCA3NjYyLCA3Njc0LCA3Njg2LCA3Njk4LCANCisgICAgNzcxMCwgNzcyMiwgNzczNCwgNzc0NiwgNzc1OCwgNzc3MCwgNzc3OCwgNzc4NiwgNzc5NSwgNzgwNSwgNzgxNiwgNzgyNSwgNzgzNSwgNzg0NiwgDQorICAgIDc4NTQsIDc4NjIsIDc4NzEsIDc4ODEsIDc4OTIsIDc5MDEsIDc5MTEsIDc5MjIsIDc5MzAsIDc5MzgsIDc5NDcsIDc5NTksIDc5NzAsIDc5NzksIA0KKyAgICA3OTkxLCA4MDAyLCA4MDA5LCA4MDE2LCA4MDIxLCA4MDI4LCA4MDM1LCA4MDQwLCA4MDQ3LCA4MDU0LCA4MDU4LCA4MDY0LCA4MDcwLCA4MDc3LCANCisgICAgODA4NCwgODA5MSwgODA5OCwgODEwOCwgODExOCwgODEyOCwgODEzOCwgODE0NSwgODE1MiwgODE1OCwgODE2NCwgODE3NSwgODE4NiwgODE5MCwgDQorICAgIDgxOTUsIDgyMDAsIDgyMDUsIDgyMTIsIDgyMTksIDgyMjcsIDgyMzQsIDgyNDEsIDgyNDgsIDgyNTksIDgyNzAsIDgyODEsIDgyOTQsIDgzMDcsIA0KKyAgICA4MzIwLCA4MzMzLCA4MzQ2LCA4MzU5LCA4MzcyLCA4Mzg1LCA4Mzk4LCA4NDA3LCA4NDE2LCA4NDI2LCA4NDM2LCA4NDQ2LCA4NDU4LCA4NDcwLCANCisgICAgODQ4MiwgODQ5NCwgODUwNiwgODUxOCwgODUzMCwgODU0MiwgODU1NCwgODU2NiwgODU3OCwgODU5MCwgODYwMiwgODYxNSwgODYyOCwgODY0MSwgDQorICAgIDg2NTQsIDg2NjksIDg2ODQsIDg2OTksIDg3MTQsIDg3MjksIDg3NDQsIDg3NTksIDg3NzQsIDg3ODksIDg4MDQsIDg4MTksIDg4MzQsIDg4NDksIA0KKyAgICA4ODY0LCA4ODc5LCA4ODk0LCA4OTA5LCA4OTI0LCA4OTM5LCA4OTU0LCA4OTcxLCA4OTg4LCA5MDAzLCA5MDE4LCA5MDMzLCA5MDQ4LCA5MDY1LCANCisgICAgOTA4MiwgOTA5NywgOTExMiwgOTEyOSwgOTE0NiwgOTE2MSwgOTE3NiwgOTE5MSwgOTIwNiwgOTIyMywgOTI0MCwgOTI1NSwgOTI3MCwgOTI4NiwgDQorICAgIDkzMDIsIDkzMTgsIDkzMzQsIDkzNTAsIDkzNjYsIDkzODIsIDkzOTgsIDk0MTYsIDk0MzQsIDk0NTAsIDk0NjYsIDk0ODQsIDk1MDIsIDk1MTgsIA0KKyAgICA5NTM0LCA5NTQ5LCA5NTY5LCA5NTkxLCA5NjA1LCA5NjE5LCA5NjMzLCA5NjQ3LCA5NjYwLCA5NjczLCA5Njg2LCA5Njk5LCA5NzEzLCA5NzI3LCANCisgICAgOTc0MSwgOTc1NSwgOTc3MSwgOTc4NywgOTgwMywgOTgxOSwgOTgzNSwgOTg1MSwgOTg2NywgOTg4MywgOTg5OSwgOTkxNSwgOTkzMSwgOTk0NywgDQorICAgIDk5NjUsIDk5ODMsIDk5OTksIDEwMDE1LCAxMDAzMSwgMTAwNDcsIDEwMDY1LCAxMDA4MywgMTAwOTksIDEwMTE1LCAxMDEzMywgMTAxNTEsIDEwMTY3LCAxMDE4MywgDQorICAgIDEwMTk5LCAxMDIxNSwgMTAyMzMsIDEwMjUxLCAxMDI2NywgMTAyODMsIDEwMzAwLCAxMDMxNywgMTAzMzQsIDEwMzUxLCAxMDM3MCwgMTAzODksIDEwNDA2LCAxMDQyMywgDQorICAgIDEwNDQyLCAxMDQ2MSwgMTA0NzgsIDEwNDk1LCAxMDUxMCwgMTA1MjUsIDEwNTQwLCAxMDU1NSwgMTA1NjEsIDEwNTY3LCAxMDU3MiwgMTA1NzcsIDEwNTgzLCAxMDU4OSwgDQorICAgIDEwNTk0LCAxMDU5OSwgMTA2MDUsIDEwNjEwLCAxMDYxNSwgMTA2MjEsIDEwNjI3LCAxMDYzMiwgMTA2MzcsIDEwNjQzLCAxMDY0OSwgMTA2NTQsIDEwNjU5LCAxMDY2NiwgDQorICAgIDEwNjczLCAxMDY4MCwgMTA2OTMsIDEwNzAwLCAxMDcwNiwgMTA3MTIsIDEwNzE4LCAxMDcyNCwgMTA3MzAsIDEwNzM2LCAxMDc0MiwgMTA3NDgsIDEwNzU0LCAxMDc2MCwgDQorICAgIDEwNzY1LCAxMDc3MCwgMTA3NzUsIDEwNzgwLCAxMDc4NSwgMTA3OTAsIDEwNzk1LCAxMDgwMywgMTA4MTEsIDEwODE5LCAxMDgyNywgMTA4MzUsIDEwODQzLCAxMDg1NCwgDQorICAgIDEwODY1LCAxMDg3NiwgMTA4ODYsIDEwODk3LCAxMDkwNSwgMTA5MTMsIDEwOTIxLCAxMDkyOSwgMTA5MzUsIDEwOTQxLCAxMDk0OSwgMTA5NTcsIDEwOTY1LCAxMDk3NCwgDQorICAgIDEwOTgzLCAxMDk5MiwgMTEwMDEsIDExMDEwLCAxMTAxOSwgMTEwMjgsIDExMDM5LCAxMTA1MCwgMTEwNTksIDExMDcwLCAxMTA3OSwgMTEwODYsIDExMDkzLCAxMTEwMCwgDQorICAgIDExMTEwLCAxMTExNywgMTExMjMsIDExMTMxLCAxMTEzOSwgMTExNDcsIDExMTU0LCAxMTE2MiwgMTExNzAsIDExMTc4LCAxMTE4NCwgMTExOTIsIDExMjAwLCAxMTIwOCwgDQorICAgIDExMjE0LCAxMTIyMiwgMTEyMzAsIDExMjM4LCAxMTI0NiwgMTEyNTksIDExMjczLCAxMTI4NiwgMTEyOTksIDExMzEzLCAxMTMyNiwgMTEzNDEsIDExMzU1LCAxMTM2OCwgDQorICAgIDExMzgwLCAxMTM5MiwgMTE0MDQsIDExNDE2LCAxMTQyOCwgMTE0MzksIDExNDUxLCAxMTQ2MywgMTE0NzUsIDExNDg2LCAxMTQ5OCwgMTE1MTEsIDExNTI1LCAxMTUzOCwgDQorICAgIDExNTUxLCAxMTU2NSwgMTE1NzgsIDExNTkzLCAxMTYwNywgMTE2MjAsIDExNjMyLCAxMTY0NCwgMTE2NTAsIDExNjU2LCAxMTY2MiwgMTE2NjgsIDExNjczLCAxMTY3OSwgDQorICAgIDExNjg2LCAxMTY5MSwgMTE2OTcsIDExNzA1LCAxMTcxMywgMTE3MjEsIDExNzI5LCAxMTczNywgMTE3NDUsIDExNzUzLCAxMTc2MSwgMTE3NjksIDExNzc0LCAxMTc3OSwgDQorICAgIDExNzg3LCAxMTc5NSwgMTE4MDMsIDExODEwLCAxMTgyMSwgMTE4MzQsIDExODQyLCAxMTg1NCwgMTE4NjIsIDExODc0LCAxMTg4MiwgMTE4OTQsIDExOTAyLCAxMTkxNCwgDQorICAgIDExOTIyLCAxMTkzNCwgMTE5NDIsIDExOTU0LCAxMTk2MiwgMTE5NzQsIDExOTgyLCAxMTk5NCwgMTIwMDEsIDEyMDE0LCAxMjAyMiwgMTIwMzQsIDEyMDQyLCAxMjA1NCwgDQorICAgIDEyMDYyLCAxMjA3NCwgMTIwODIsIDEyMDk0LCAxMjEwMiwgMTIxMTQsIDEyMTIyLCAxMjEzNCwgMTIxNDIsIDEyMTU0LCAxMjE2MiwgMTIxNzQsIDEyMTg5LCAxMjIwNCwgDQorICAgIDEyMjE5LCAxMjIzNCwgMTIyNDksIDEyMjY0LCAxMjI3OSwgMTIyOTQsIDEyMzEwLCAxMjMyNiwgMTIzNDIsIDEyMzU4LCAxMjM2NywgMTIzNzcsIDEyMzkwLCAxMjQwNSwgDQorICAgIDEyNDI0LCAxMjQzOCwgMTI0NTEsIDEyNDY0LCAxMjQ3NywgMTI0OTQsIDEyNTExLCAxMjUyNSwgMTI1NDEsIDEyNTU0LCAxMjU2OCwgMTI1ODQsIDEyNTk3LCAxMjYxMCwgDQorICAgIDEyNjIzLCAxMjY0MCwgMTI2NTcsIDEyNjcyLCAxMjY4NywgMTI3MDIsIDEyNzE3LCAxMjczMiwgMTI3NDcsIDEyNzU5LCAxMjc3MSwgMTI3ODMsIDEyNzk1LCAxMjgwNywgDQorICAgIDEyODE5LCAxMjgzMiwgMTI4NDUsIDEyODU4LCAxMjg3MSwgMTI4ODUsIDEyODk5LCAxMjkxMywgMTI5MjcsIDEyOTM5LCAxMjk1MSwgMTI5NjMsIDEyOTc1LCAxMjk4NiwgDQorICAgIDEyOTk3LCAxMzAwOSwgMTMwMjEsIDEzMDMzLCAxMzA0NSwgMTMwNTksIDEzMDczLCAxMzA4NywgMTMxMDEsIDEzMTE1LCAxMzEyOSwgMTMxNDMsIDEzMTU3LCAxMzE3MSwgDQorICAgIDEzMTg1LCAxMzE5OSwgMTMyMTMsIDEzMjI2LCAxMzI0MCwgMTMyNTQsIDEzMjY4LCAxMzI4MiwgMTMyOTUsIDEzMzA4LCAxMzMyMSwgMTMzMzQsIDEzMzQ3LCAxMzM2MCwgDQorICAgIDEzMzczLCAxMzM4NiwgMTM0MDEsIDEzNDE1LCAxMzQyOSwgMTM0NDIsIDEzNDU1LCAxMzQ2OCwgMTM0ODEsIDEzNDk1LCAxMzUwOSwgMTM1MTksIDEzNTI5LCAxMzU0MiwgDQorICAgIDEzNTU1LCAxMzU2OCwgMTM1ODEsIDEzNTkzLCAxMzYwNSwgMTM2MTcsIDEzNjI5LCAxMzY0MSwgMTM2NTMsIDEzNjY1LCAxMzY3NywgMTM2ODksIDEzNzAxLCAxMzcxMywgDQorICAgIDEzNzI1LCAxMzczNywgMTM3NDksIDEzNzYxLCAxMzc3MywgMTM3ODUsIDEzNzk3LCAxMzgwOSwgMTM4MjEsIDEzODMzLCAxMzg0NSwgMTM4NTcsIDEzODY5LCAxMzg4MSwgDQorICAgIDEzODkzLCAxMzkwNSwgMTM5MTcsIDEzOTI5LCAxMzk0MSwgMTM5NTQsIDEzOTY3LCAxMzk4MCwgMTM5OTMsIDE0MDA3LCAxNDAyMSwgMTQwMzUsIDE0MDQ5LCAxNDA2MSwgDQorICAgIDE0MDczLCAxNDA4OSwgMTQxMDUsIDE0MTIxLCAxNDEzNywgMTQxNTMsIDE0MTY5LCAxNDE4NSwgMTQyMDEsIDE0MjE3LCAxNDIzMywgMTQyNDksIDE0MjY1LCAxNDI3NiwgDQorICAgIDE0Mjg3LCAxNDI5OCwgMTQzMTUsIDE0MzIzLCAxNDMzMywgMTQzNDEsIDE0MzQ5LCAxNDM1NywgMTQzNjcsIDE0Mzc1LCAxNDM4MywgMTQzOTEsIDE0Mzk5LCAxNDQxMSwgDQorICAgIDE0NDE5LCAxNDQyNywgMTQ0MzUsIDE0NDQ1LCAxNDQ1MywgMTQ0NjEsIDE0NDY5LCAxNDQ3NywgMTQ0ODgsIDE0NDk2LCAxNDUwNiwgMTQ1MTQsIDE0NTIyLCAxNDUzMCwgDQorICAgIDE0NTM4LCAxNDU0NiwgMTQ1NTcsIDE0NTY1LCAxNDU3NywgMTQ1ODgsIDE0NTk2LCAxNDYwNCwgMTQ2MTIsIDE0NjIyLCAxNDYzMiwgMTQ2NDIsIDE0NjUxLCAxNDY1OSwgDQorICAgIDE0NjY3LCAxNDY3NywgMTQ2ODUsIDE0Njk2LCAxNDcwNCwgMTQ3MTQsIDE0NzIzLCAxNDczMSwgMTQ3MzksIDE0NzQ3LCAxNDc1NSwgMTQ3NjUsIDE0Nzc4LCAxNDc5MCwgDQorICAgIDE0Nzk4LCAxNDgwOSwgMTQ4MTcsIDE0ODI5LCAxNDg0MCwgMTQ4NDgsIDE0ODU2LCAxNDg2NCwgMTQ4NzcsIDE0ODg5LCAxNDkwMSwgMTQ5MDksIDE0OTE2LCAxNDkyMywgDQorICAgIDE0OTM2LCAxNDk0NCwgMTQ5NTEsIDE0OTU4LCAxNDk2NSwgMTQ5NzgsIDE0OTg1LCAxNDk5OCwgMTUwMDksIDE1MDE4LCAxNTAyNywgMTUwMzYsIDE1MDQ1LCAxNTA1NCwgDQorICAgIDE1MDYzLCAxNTA3MywgMTUwODMsIDE1MDk1LCAxNTEwNywgMTUxMTgsIDE1MTI5LCAxNTEzOCwgMTUxNDcsIDE1MTU2LCAxNTE2NSwgMTUxNzgsIDE1MTg3LCAxNTIwMCwgDQorICAgIDE1MjEwLCAxNTIxOSwgMTUyMjgsIDE1MjM3LCAxNTI0NiwgMTUyNTYsIDE1MjY1LCAxNTI3NCwgMTUyODMsIDE1MjkyLCAxNTMwMywgMTUzMTQsIDE1MzI1LCAxNTMzNiwgDQorICAgIDE1MzQ5LCAxNTM1OSwgMTUzNzMsIDE1Mzg1LCAxNTM5NCwgMTU0MDcsIDE1NDE3LCAxNTQzMSwgMTU0NDEsIDE1NDU1LCAxNTQ2NCwgMTU0NzYsIDE1NDg4LCAxNTUwMCwgDQorICAgIDE1NTEzLCAxNTUyNSwgMTU1MzQsIDE1NTQwLCAxNTU0NiwgMTU1NTQsIDE1NTYyLCAxNTU3MCwgMTU1ODIsIDE1NTk0LCAxNTYwNSwgMTU2MTYsIDE1NjI3LCAxNTYzOCwgDQorICAgIDE1NjQ0LCAxNTY1NSwgMTU2NjYsIDE1Njc0LCAxNTY4MiwgMTU2OTAsIDE1Njk2LCAxNTcwNywgMTU3MTksIDE1NzMwLCAxNTc0MiwgMTU3NTQsIDE1NzY1LCAxNTc3NywgDQorICAgIDE1Nzg4LCAxNTgwMCwgMTU4MTIsIDE1ODIzLCAxNTgzNSwgMTU4NDcsIDE1ODU4LCAxNTg2NywgMTU4ODAsIDE1ODg5LCAxNTkwMiwgMTU5MTEsIDE1OTIwLCAxNTkzMywgDQorICAgIDE1OTQyLCAxNTk1NSwgMTU5NjQsIDE1OTc3LCAxNTk5MCwgMTYwMDYsIDE2MDIyLCAxNjAzNSwgMTYwNDgsIDE2MDU5LCAxNjA3MSwgMTYwODIsIDE2MDk0LCAxNjExMSwgDQorICAgIDE2MTI4LCAxNjE0MCwgMTYxNTEsIDE2MTYzLCAxNjE3NCwgMTYxODYsIDE2MjAwLCAxNjIxMiwgMTYyMjMsIDE2MjM2LCAxNjI0OCwgMTYyNjIsIDE2Mjc0LCAxNjI4NSwgDQorICAgIDE2Mjk4LCAxNjMwOSwgMTYzMjAsIDE2MzMxLCAxNjM0MiwgMTYzNTMsIDE2MzY0LCAxNjM3NSwgMTYzODYsIDE2Mzk3LCAxNjQwOCwgMTY0MTksIDE2NDI2LCAxNjQzMywgDQorICAgIDE2NDQwLCAxNjQ0NywgMTY0NTQsIDE2NDYxLCAxNjQ2NywgMTY0NzMsIDE2NDgxLCAxNjQ4OSwgMTY0OTcsIDE2NTA1LCAxNjUxMywgMTY1MjUsIDE2NTMzLCAxNjU0NSwgDQorICAgIDE2NTUzLCAxNjU2NSwgMTY1NzMsIDE2NTg1LCAxNjU5NCwgMTY2MDMsIDE2NjEzLCAxNjYyMywgMTY2MzQsIDE2NjQ0LCAxNjY1MywgMTY2NjMsIDE2NjcyLCAxNjY4MiwgDQorICAgIDE2Njk0LCAxNjcwMywgMTY3MTUsIDE2NzI3LCAxNjc0MCwgMTY3NTMsIDE2NzY2LCAxNjc3OSwgMTY3OTIsIDE2ODA1LCAxNjgxNSwgMTY4MjEsIDE2ODI4LCAxNjgzNSwgDQorICAgIDE2ODQyLCAxNjg0OSwgMTY4NTYsIDE2ODYzLCAxNjg2OSwgMTY4NzUsIDE2ODgwLCAxNjg4NiwgMTY4OTIsIDE2ODk5LCAxNjkwNiwgMTY5MTMsIDE2OTIwLCAxNjkyNywgDQorICAgIDE2OTM0LCAxNjk0MCwgMTY5NDYsIDE2OTU0LCAxNjk2MSwgMTY5NjksIDE2OTc2LCAxNjk4MywgMTY5OTEsIDE2OTk4LCAxNzAwNSwgMTcwMTYsIDE3MDI0LCAxNzAzMSwgDQorICAgIDE3MDM5LCAxNzA0NiwgMTcwNTMsIDE3MDYxLCAxNzA2OCwgMTcwNzUsIDE3MDg2LCAxNzA5NCwgMTcxMDMsIDE3MTExLCAxNzExOCwgMTcxMjcsIDE3MTM1LCAxNzE0MiwgDQorICAgIDE3MTQ5LCAxNzE2MCwgMTcxNjYsIDE3MTcyLCAxNzE3OCwgMTcxODQsIDE3MTkwLCAxNzE5NiwgMTcyMDYsIDE3MjEzLCAxNzIyMCwgMTcyMjcsIDE3MjM0LCAxNzI0MiwgDQorICAgIDE3MjUwLCAxNzI1OCwgMTcyNjYsIDE3MjczLCAxNzI4MCwgMTcyODYsIDE3MjkyLCAxNzI5OCwgMTczMDksIDE3MzE5LCAxNzMzMCwgMTczNDAsIDE3MzUxLCAxNzM2MSwgDQorICAgIDE3MzcyLCAxNzM4MiwgMTczOTMsIDE3NDAzLCAxNzQxNCwgMTc0MjQsIDE3NDM1LCAxNzQ0NiwgMTc0NTcsIDE3NDY4LCAxNzQ3OSwgMTc0OTAsIDE3NTAxLCAxNzUxMiwgDQorICAgIDE3NTIwLCAxNzUyOCwgMTc1MzYsIDE3NTQ0LCAxNzU1MiwgMTc1NjAsIDE3NTY5LCAxNzU3OCwgMTc1ODcsIDE3NTk2LCAxNzYwNiwgMTc2MTYsIDE3NjI2LCAxNzYzNiwgDQorICAgIDE3NjQ0LCAxNzY1MiwgMTc2NjUsIDE3Njc4LCAxNzY5MCwgMTc3MDIsIDE3NzEwLCAxNzcxOCwgMTc3MjUsIDE3NzMyLCAxNzczOCwgMTc3NDYsIDE3NzU0LCAxNzc2MiwgDQorICAgIDE3NzcwLCAxNzc4MiwgMTc3OTQsIDE3ODA1LCAxNzgxNiwgMTc4MjYsIDE3ODM2LCAxNzg0NiwgMTc4NTYsIDE3ODY2LCAxNzg3NiwgMTc4ODYsIDE3ODk2LCAxNzkwOSwgDQorICAgIDE3OTIyLCAxNzkzNSwgMTc5NDgsIDE3OTYxLCAxNzk3NCwgMTc5ODcsIDE4MDAwLCAxODAxMywgMTgwMjYsIDE4MDM4LCAxODA1MCwgMTgwNjYsIDE4MDgyLCAxODA5NywgDQorICAgIDE4MTEyLCAxODEyMiwgMTgxMzIsIDE4MTQyLCAxODE1MiwgMTgxNjIsIDE4MTcyLCAxODE4MiwgMTgxOTIsIDE4MjA1LCAxODIxOCwgMTgyMzEsIDE4MjQ0LCAxODI1NywgDQorICAgIDE4MjcwLCAxODI4MywgMTgyOTYsIDE4MzA5LCAxODMyMiwgMTgzMzQsIDE4MzQ2LCAxODM2MiwgMTgzNzgsIDE4MzkzLCAxODQwOCwgMTg0MTcsIDE4NDI2LCAxODQzNSwgDQorICAgIDE4NDQ0LCAxODQ1MywgMTg0NjIsIDE4NDcxLCAxODQ4MCwgMTg0OTIsIDE4NTAzLCAxODUxNSwgMTg1MjYsIDE4NTM5LCAxODU1MSwgMTg1NjQsIDE4NTc2LCAxODU4OCwgDQorICAgIDE4NTk5LCAxODYxMSwgMTg2MjIsIDE4NjM4LCAxODY1NCwgMTg2NjYsIDE4Njc3LCAxODY4OSwgMTg3MDAsIDE4NzEzLCAxODcyNSwgMTg3MzgsIDE4NzUwLCAxODc2MiwgDQorICAgIDE4NzczLCAxODc4NSwgMTg3OTYsIDE4ODA1LCAxODgxNCwgMTg4MjMsIDE4ODMyLCAxODg0MSwgMTg4NTAsIDE4ODYwLCAxODg3MCwgMTg4ODUsIDE4ODk5LCAxODkxNCwgDQorICAgIDE4OTI4LCAxODkzOCwgMTg5NDgsIDE4OTU3LCAxODk2NiwgMTg5NzUsIDE4OTg0LCAxODk5MywgMTkwMDIsIDE5MDExLCAxOTAyMCwgMTkwMjksIDE5MDM4LCAxOTA0NywgDQorICAgIDE5MDU2LCAxOTA2NSwgMTkwNzQsIDE5MDgzLCAxOTA5MiwgMTkxMDEsIDE5MTEwLCAxOTExOSwgMTkxMjgsIDE5MTM3LCAxOTE0NiwgMTkxNTUsIDE5MTY0LCAxOTE3NSwgDQorICAgIDE5MTg2LCAxOTE5NywgMTkyMDgsIDE5MjE5LCAxOTIzMCwgMTkyNDEsIDE5MjUyLCAxOTI2MywgMTkyNzQsIDE5Mjg1LCAxOTI5NiwgMTkzMDcsIDE5MzE4LCAxOTMyOSwgDQorICAgIDE5MzQwLCAxOTM1MSwgMTkzNjIsIDE5MzczLCAxOTM4NCwgMTkzOTUsIDE5NDA2LCAxOTQxNywgMTk0MjgsIDE5NDM5LCAxOTQ0OCwgMTk0NTcsIDE5NDcxLCAxOTQ4NCwgDQorICAgIDE5NDk4LCAxOTUxMSwgMTk1MjEsIDE5NTMxLCAxOTU0MCwgMTk1NDksIDE5NTU4LCAxOTU2NywgMTk1NzYsIDE5NTg1LCAxOTU5NSwgMTk2MDUsIDE5NjEyLCAxOTYyMSwgDQorICAgIDE5NjMwLCAxOTYzNywgMTk2NDYsIDE5NjU1LCAxOTY2MiwgMTk2NzEsIDE5NjgwLCAxOTY4NywgMTk2OTgsIDE5NzA5LCAxOTcyMCwgMTk3MzEsIDE5NzQyLCAxOTc1MywgDQorICAgIDE5NzYwLCAxOTc2NywgMTk3NzQsIDE5NzgyLCAxOTc5MCwgMTk3OTgsIDE5ODA2LCAxOTgxNCwgMTk4MjIsIDE5ODI4LCAxOTgzNCwgMTk4NDYsIDE5ODU3LCAxOTg2OCwgDQorICAgIDE5ODc5LCAxOTg4OCwgMTk4OTcsIDE5OTA5LCAxOTkyMCwgMTk5MzIsIDE5OTQzLCAxOTk1MiwgMTk5NjEsIDE5OTcxLCAxOTk4MSwgMTk5OTEsIDIwMDAxLCAyMDAxMywgDQorICAgIDIwMDI0LCAyMDAzNiwgMjAwNDcsIDIwMDU5LCAyMDA3MCwgMjAwODIsIDIwMDkzLCAyMDEwNSwgMjAxMTYsIDIwMTI4LCAyMDEzOSwgMjAxNDgsIDIwMTU2LCAyMDE2NCwgDQorICAgIDIwMTcyLCAyMDE4MCwgMjAxODgsIDIwMTk2LCAyMDIwNCwgMjAyMTIsIDIwMjIwLCAyMDIyOCwgMjAyMzYsIDIwMjQ0LCAyMDI1MiwgMjAyNjAsIDIwMjY4LCAyMDI3NywgDQorICAgIDIwMjg1LCAyMDI5MywgMjAzMDEsIDIwMzA5LCAyMDMxNywgMjAzMjUsIDIwMzMzLCAyMDM0MSwgMjAzNDksIDIwMzU3LCAyMDM2NSwgMjAzNzMsIDIwMzgxLCAyMDM4OSwgDQorICAgIDIwMzk3LCAyMDQwNiwgMjA0MTUsIDIwNDI0LCAyMDQzMywgMjA0NDMsIDIwNDUzLCAyMDQ2MywgMjA0NzMsIDIwNDgxLCAyMDQ4OSwgMjA0OTcsIDIwNTA1LCAyMDUxNywgDQorICAgIDIwNTI5LCAyMDU0MSwgMjA1NTMsIDIwNTY2LCAyMDU3OSwgMjA1OTEsIDIwNjAzLCAyMDYxNSwgMjA2MjcsIDIwNjM5LCAyMDY1MSwgMjA2NjQsIDIwNjc3LCAyMDY4OSwgDQorICAgIDIwNzAxLCAyMDcwOSwgMjA3MTksIDIwNzI5LCAyMDczNywgMjA3NDcsIDIwNzU3LCAyMDc2NywgMjA3NzcsIDIwNzg2LCAyMDc5NCwgMjA4MDQsIDIwODE0LCAyMDgyMiwgDQorICAgIDIwODMwLCAyMDgzOCwgMjA4NDYsIDIwODU1LCAyMDg2NCwgMjA4NzMsIDIwODgyLCAyMDg5MSwgMjA5MDAsIDIwOTA4LCAyMDkxNiwgMjA5MjMsIDIwOTMwLCAyMDkzNywgDQorICAgIDIwOTQ1LCAyMDk1NCwgMjA5NjIsIDIwOTcwLCAyMDk3OSwgMjA5ODcsIDIwOTk1LCAyMTAwNCwgMjEwMTIsIDIxMDIwLCAyMTAyOSwgMjEwMzcsIDIxMDQ1LCAyMTA1NCwgDQorICAgIDIxMDYyLCAyMTA3MCwgMjEwNzksIDIxMDg3LCAyMTA5NCwgMjExMDIsIDIxMTA5LCAyMTExNiwgMjExMjQsIDIxMTMxLCAyMTEzOCwgMjExNDksIDIxMTU2LCAyMTE2NywgDQorICAgIDIxMTc0LCAyMTE4NSwgMjExOTIsIDIxMjAzLCAyMTIxMSwgMjEyMjAsIDIxMjI4LCAyMTIzNiwgMjEyNDUsIDIxMjUzLCAyMTI2MSwgMjEyNzAsIDIxMjc4LCAyMTI4NiwgDQorICAgIDIxMjk1LCAyMTMwMywgMjEzMTEsIDIxMzIwLCAyMTMyOCwgMjEzMzYsIDIxMzQ1LCAyMTM1MywgMjEzNjAsIDIxMzY4LCAyMTM3NSwgMjEzODIsIDIxMzkwLCAyMTM5NywgDQorICAgIDIxNDAzLCAyMTQwOSwgMjE0MTUsIDIxNDIyLCAyMTQzNSwgMjE0NDUsIDIxNDU1LCAyMTQ2NSwgMjE0NzUsIDIxNDg2LCAyMTQ5NiwgMjE1MDYsIDIxNTE2LCAyMTUyNiwgDQorICAgIDIxNTMwLCAyMTUzNSwgMjE1NDMsIDIxNTUyLCAyMTU2MCwgMjE1NjgsIDIxNTc3LCAyMTU4NSwgMjE1OTMsIDIxNjAyLCAyMTYxMCwgMjE2MTgsIDIxNjI3LCAyMTYzNSwgDQorICAgIDIxNjQzLCAyMTY1MiwgMjE2NjAsIDIxNjY4LCAyMTY3NywgMjE2ODUsIDIxNjkyLCAyMTcwMCwgMjE3MDcsIDIxNzE0LCAyMTcyMiwgMjE3MjksIDIxNzM3LCAyMTc0NiwgDQorICAgIDIxNzU0LCAyMTc2MiwgMjE3NzEsIDIxNzc5LCAyMTc4NywgMjE3OTYsIDIxODA0LCAyMTgxMiwgMjE4MjEsIDIxODI5LCAyMTgzNywgMjE4NDYsIDIxODU0LCAyMTg2MiwgDQorICAgIDIxODcxLCAyMTg3OSwgMjE4ODYsIDIxODk0LCAyMTkwMSwgMjE5MDgsIDIxOTE2LCAyMTkyMywgMjE5MzYsIDIxOTQ5LCAyMTk2MiwgMjE5NzUsIDIxOTg4LCAyMjAwMSwgDQorICAgIDIyMDE0LCAyMjAyNywgMjIwMzEsIDIyMDQwLCAyMjA1MywgMjIwNjIsIDIyMDc1LCAyMjA4NCwgMjIwOTcsIDIyMTA2LCAyMjExOSwgMjIxMjQsIDIyMTMyLCAyMjE0MSwgDQorICAgIDIyMTQ5LCAyMjE1NywgMjIxNjYsIDIyMTc0LCAyMjE4MiwgMjIxOTEsIDIyMTk5LCAyMjIwNywgMjIyMTYsIDIyMjI0LCAyMjIzMiwgMjIyNDEsIDIyMjQ5LCAyMjI1NywgDQorICAgIDIyMjY2LCAyMjI3NCwgMjIyODEsIDIyMjg5LCAyMjI5NiwgMjIzMDMsIDIyMzExLCAyMjMxOCwgMjIzMjcsIDIyMzM1LCAyMjM0NCwgMjIzNTIsIDIyMzYwLCAyMjM2OSwgDQorICAgIDIyMzc3LCAyMjM4NSwgMjIzOTcsIDIyNDA2LCAyMjQxNCwgMjI0MjMsIDIyNDMxLCAyMjQzOSwgMjI0NDgsIDIyNDU2LCAyMjQ2NCwgMjI0NzYsIDIyNDg1LCAyMjQ5NSwgDQorICAgIDIyNTA0LCAyMjUxMiwgMjI1MjIsIDIyNTMxLCAyMjUzOSwgMjI1NDcsIDIyNTU5LCAyMjU2NiwgMjI1NzMsIDIyNTgwLCAyMjU4NywgMjI1OTQsIDIyNjAxLCAyMjYxMiwgDQorICAgIDIyNjE5LCAyMjYyNiwgMjI2MzMsIDIyNjM5LCAyMjY0NiwgMjI2NTMsIDIyNjU5LCAyMjY2NSwgMjI2NzIsIDIyNjc5LCAyMjY4OSwgMjI2OTksIDIyNzA5LCAyMjcxOCwgDQorICAgIDIyNzI0LCAyMjczMCwgMjI3MzYsIDIyNzQyLCAyMjc0OSwgMjI3NTYsIDIyNzYyLCAyMjc2OCwgMjI3NzUsIDIyNzgyLCAyMjc4OCwgMjI3OTQsIDIyODAxLCAyMjgwOCwgDQorICAgIDIyODE1LCAyMjgyMiwgMjI4MjksIDIyODM2LCAyMjg0MywgMjI4NTAsIDIyODU2LCAyMjg2MiwgMjI4NjgsIDIyODc0LCAyMjg4MCwgMjI4ODYsIDIyODkzLCAyMjg5OSwgDQorICAgIDIyOTA3LCAyMjkxNiwgMjI5MjQsIDIyOTMyLCAyMjk0MSwgMjI5NDksIDIyOTU3LCAyMjk2NiwgMjI5NzQsIDIyOTgyLCAyMjk5MSwgMjI5OTksIDIzMDA3LCAyMzAxNiwgDQorICAgIDIzMDI0LCAyMzAzMiwgMjMwNDEsIDIzMDQ5LCAyMzA1NiwgMjMwNjQsIDIzMDcxLCAyMzA3OCwgMjMwODYsIDIzMDkzLCAyMzEwNCwgMjMxMTUsIDIzMTI2LCAyMzEzNywgDQorICAgIDIzMTQ4LCAyMzE1OSwgMjMxNzAsIDIzMTgxLCAyMzE5MiwgMjMyMDMsIDIzMjE0LCAyMzIyNSwgMjMyMzMsIDIzMjQyLCAyMzI1MCwgMjMyNTgsIDIzMjY3LCAyMzI3NSwgDQorICAgIDIzMjgzLCAyMzI5MiwgMjMzMDAsIDIzMzA4LCAyMzMxNywgMjMzMjUsIDIzMzMzLCAyMzM0MiwgMjMzNTAsIDIzMzU4LCAyMzM2NywgMjMzNzUsIDIzMzgyLCAyMzM5MCwgDQorICAgIDIzMzk3LCAyMzQwNCwgMjM0MTIsIDIzNDE5LCAyMzQzMCwgMjM0NDEsIDIzNDUyLCAyMzQ2MywgMjM0NzQsIDIzNDg1LCAyMzQ5NiwgMjM1MDcsIDIzNTE4LCAyMzUyOSwgDQorICAgIDIzNTQwLCAyMzU1MSwgMjM1NjEsIDIzNTcxLCAyMzU4MSwgMjM1OTEsIDIzNTk3LCAyMzYwMywgMjM2MTIsIDIzNjIxLCAyMzYzMCwgMjM2MzgsIDIzNjQ2LCAyMzY1NCwgDQorICAgIDIzNjYyLCAyMzY3MCwgMjM2NzgsIDIzNjg2LCAyMzY5NCwgMjM3MDIsIDIzNzE0LCAyMzcyMiwgMjM3MzQsIDIzNzQyLCAyMzc1NCwgMjM3NjIsIDIzNzc0LCAyMzc4MiwgDQorICAgIDIzNzk0LCAyMzgwMiwgMjM4MTQsIDIzODIyLCAyMzgzNCwgMjM4NDIsIDIzODU0LCAyMzg2MSwgMjM4NzEsIDIzODgxLCAyMzg5MSwgMjM5MDEsIDIzOTA1LCAyMzkwOSwgDQorICAgIDIzOTEzLCAyMzkyMSwgMjM5MjcsIDIzOTMzLCAyMzkzOSwgMjM5NDUsIDIzOTUwLCAyMzk1NSwgMjM5NjMsIDIzOTcxLCAyMzk4MCwgMjM5ODksIDIzOTk4LCAyNDAwNiwgDQorICAgIDI0MDE1LCAyNDAyNCwgMjQwMzUsIDI0MDQ2LCAyNDA1NywgMjQwNjcsIDI0MDc3LCAyNDA4OSwgMjQwOTksIDI0MTExLCAyNDEyMywgMjQxMzAsIDI0MTM5LCAyNDE0NywgDQorICAgIDI0MTU2LCAyNDE2NCwgMjQxNzIsIDI0MTgxLCAyNDE4OSwgMjQxOTcsIDI0MjA5LCAyNDIxOCwgMjQyMjYsIDI0MjM1LCAyNDI0MywgMjQyNTEsIDI0MjYwLCAyNDI2OCwgDQorICAgIDI0Mjc2LCAyNDI4OCwgMjQyOTcsIDI0MzA3LCAyNDMxNiwgMjQzMjQsIDI0MzM0LCAyNDM0MywgMjQzNTEsIDI0MzU5LCAyNDM3MSwgMjQzNzgsIDI0Mzg1LCAyNDM5MiwgDQorICAgIDI0Mzk5LCAyNDQwNiwgMjQ0MTMsIDI0NDI0LCAyNDQzMiwgMjQ0NDAsIDI0NDQ4LCAyNDQ1NiwgMjQ0NjYsIDI0NDc2LCAyNDQ4NywgMjQ0OTgsIDI0NTEwLCAyNDUyMSwgDQorICAgIDI0NTMyLCAyNDU0MywgMjQ1NTYsIDI0NTY5LCAyNDU4MiwgMjQ1OTYsIDI0NjEwLCAyNDYyNCwgMjQ2MzgsIDI0NjUyLCAyNDY2NiwgMjQ2NzcsIDI0Njg1LCAyNDY5NywgDQorICAgIDI0NzA1LCAyNDcxNywgMjQ3MjUsIDI0NzM3LCAyNDc0NSwgMjQ3NTcsIDI0NzY2LCAyNDc3NSwgMjQ3ODUsIDI0Nzk1LCAyNDgwNiwgMjQ4MTYsIDI0ODI1LCAyNDgzNSwgDQorICAgIDI0ODQ0LCAyNDg1NCwgMjQ4NjYsIDI0ODc1LCAyNDg4NywgMjQ4OTksIDI0OTEyLCAyNDkyNSwgMjQ5MzgsIDI0OTUxLCAyNDk2NCwgMjQ5NzcsIDI0OTg3LCAyNDk5NCwgDQorICAgIDI1MDAyLCAyNTAxMSwgMjUwMTksIDI1MDI5LCAyNTAzNiwgMjUwNDUsIDI1MDU2LCAyNTA2NSwgMjUwNzYsIDI1MDg1LCAyNTA5NiwgMjUxMDcsIDI1MTIwLCAyNTEzMSwgDQorICAgIDI1MTQ0LCAyNTE1NSwgMjUxNjgsIDI1MTc4LCAyNTE4NywgMjUxOTYsIDI1MjA1LCAyNTIxNCwgMjUyMjQsIDI1MjMzLCAyNTI0MiwgMjUyNTEsIDI1MjYwLCAyNTI3MCwgDQorICAgIDI1MjgxLCAyNTI5MiwgMjUzMDEsIDI1MzEwLCAyNTMxOCwgMjUzMjYsIDI1MzM0LCAyNTM0MiwgMjUzNTAsIDI1MzYxLCAyNTM3MiwgMjUzODMsIDI1Mzk0LCAyNTM5OSwgDQorICAgIDI1NDA1LCAyNTQxNCwgMjU0MjMsIDI1NDMyLCAyNTQ0MiwgMjU0NTIsIDI1NDYyLCAyNTQ3MiwgMjU0ODIsIDI1NDkxLCAyNTUwMSwgMjU1MTAsIDI1NTIyLCAyNTUzNCwgDQorICAgIDI1NTQ2LCAyNTU1NywgMjU1NjgsIDI1NTc5LCAyNTU4NywgMjU1OTgsIDI1NjA5LCAyNTYyMCwgMjU2MzEsIDI1NjQyLCAyNTY1MywgMjU2NjQsIDI1Njc1LCAyNTY4NSwgDQorICAgIDI1Njk1LCAyNTcwNCwgMjU3MTMsIDI1NzIzLCAyNTczMywgMjU3NDIsIDI1NzUxLCAyNTc2MCwgMjU3NzMsIDI1NzgyLCAyNTc5NSwgMjU4MDQsIDI1ODE3LCAyNTgyNiwgDQorICAgIDI1ODM5LCAyNTg1MiwgMjU4NjUsIDI1ODc3LCAyNTg4OSwgMjU5MDIsIDI1OTE1LCAyNTkyNywgMjU5MzksIDI1OTUzLCAyNTk2NywgMjU5NzcsIDI1OTg3LCAyNjAwMSwgDQorICAgIDI2MDE1LCAyNjAyNSwgMjYwMzUsIDI2MDQ1LCAyNjA1NSwgMjYwNzcsIDI2MDk5LCAyNjExMCwgMjYxMjEsIDI2MTMxLCAyNjE0MSwgMjYxNTIsIDI2MTYzLCAyNjE3MywgDQorICAgIDI2MTgzLCAyNjE5MywgMjYyMDMsIDI2MjEyLCAyNjIyMSwgMjYyMzEsIDI2MjQxLCAyNjI1MCwgMjYyNTksIDI2MjgxLCAyNjI5NCwgMjYzMDcsIDI2MzE5LCAyNjMzMSwgDQorICAgIDI2MzQ0LCAyNjM1NywgMjYzNjksIDI2MzgxLCAyNjM5NCwgMjY0MDcsIDI2NDE5LCAyNjQzMSwgMjY0NDQsIDI2NDU3LCAyNjQ2OSwgMjY0ODEsIDI2NDk2LCAyNjUwOSwgDQorICAgIDI2NTIyLCAyNjUzNiwgMjY1NDcsIDI2NTYyLCAyNjU3MywgMjY1ODgsIDI2NTk4LCAyNjYxMiwgMjY2MjIsIDI2NjM2LCAyNjY0NywgMjY2NjIsIDI2NjczLCAyNjY4OCwgDQorICAgIDI2Njk4LCAyNjcxMiwgMjY3MjIsIDI2NzM2LCAyNjc0NSwgMjY3NTgsIDI2NzY3LCAyNjc4MCwgMjY3ODksIDI2ODAyLCAyNjgxMSwgMjY4MjQsIDI2ODM0LCAyNjg0NCwgDQorICAgIDI2ODU0LCAyNjg2NCwgMjY4NzcsIDI2ODkwLCAyNjkwMiwgMjY5MTQsIDI2OTI3LCAyNjk0MCwgMjY5NTIsIDI2OTY0LCAyNjk3OCwgMjY5OTEsIDI3MDA0LCAyNzAxNywgDQorICAgIDI3MDMwLCAyNzA0MiwgMjcwNTYsIDI3MDY5LCAyNzA4MiwgMjcwOTUsIDI3MTA4LCAyNzEyMCwgMjcxMzMsIDI3MTQ2LCAyNzE1OCwgMjcxNzAsIDI3MTgzLCAyNzE5NiwgDQorICAgIDI3MjA4LCAyNzIyMCwgMjcyMzQsIDI3MjQ4LCAyNzI2NCwgMjcyODAsIDI3MjkyLCAyNzMwNCwgMjczMTgsIDI3MzMyLCAyNzM0NSwgMjczNTgsIDI3MzcwLCAyNzM4MiwgDQorICAgIDI3Mzk2LCAyNzQxMCwgMjc0MjIsIDI3NDM0LCAyNzQ0NiwgMjc0NTgsIDI3NDcyLCAyNzQ4NiwgMjc0OTgsIDI3NTEwLCAyNzUyNSwgMjc1MzksIDI3NTUzLCAyNzU2NywgDQorICAgIDI3NTgxLCAyNzU5NCwgMjc2MDgsIDI3NjIyLCAyNzYzNSwgMjc2NDgsIDI3NjYzLCAyNzY3OCwgMjc2OTEsIDI3NzA0LCAyNzcxOSwgMjc3MzQsIDI3NzQ3LCAyNzc2MCwgDQorICAgIDI3NzcwLCAyNzc4MCwgMjc3ODksIDI3Nzk4LCAyNzgwOCwgMjc4MTgsIDI3ODI3LCAyNzgzNiwgMjc4NDUsIDI3ODU4LCAyNzg2NywgMjc4ODAsIDI3ODg5LCAyNzkwMiwgDQorICAgIDI3OTExLCAyNzkyNCwgMjc5MzMsIDI3OTQyLCAyNzk1MiwgMjc5NjIsIDI3OTcxLCAyNzk4MCwgMjc5ODYsIDI3OTkyLCAyNzk5OCwgMjgwMDQsIDI4MDE5LCAyODAzNCwgDQorICAgIDI4MDQ3LCAyODA2MCwgMjgwNzUsIDI4MDg5LCAyODEwNCwgMjgxMTgsIDI4MTMzLCAyODE0NywgMjgxNjIsIDI4MTc2LCAyODE5MSwgMjgyMDUsIDI4MjIwLCAyODIzNCwgDQorICAgIDI4MjQ5LCAyODI2MywgMjgyNzgsIDI4MjkyLCAyODMwNywgMjgzMjEsIDI4MzM2LCAyODM1MCwgMjgzNjUsIDI4Mzc5LCAyODM5NCwgMjg0MDgsIDI4NDIzLCAyODQ0MCwgDQorICAgIDI4NDU4LCAyODQ3NSwgMjg0OTMsIDI4NTEwLCAyODUyOCwgMjg1NDUsIDI4NTYzLCAyODU4MCwgMjg1OTgsIDI4NjE1LCAyODYzMywgMjg2NTAsIDI4NjY4LCAyODY4NSwgDQorICAgIDI4NzAzLCAyODcyMCwgMjg3MzgsIDI4NzU1LCAyODc3MywgMjg3OTAsIDI4ODA4LCAyODgyNSwgMjg4NDMsIDI4ODYwLCAyODg3OCwgMjg4OTUsIDI4OTEzLCAyODkzMCwgDQorICAgIDI4OTQ4LCAyODk2NSwgMjg5ODMsIDI5MDAwLCAyOTAxOCwgMjkwMzUsIDI5MDUzLCAyOTA3MCwgMjkwODgsIDI5MTA1LCAyOTEyMywgMjkxNDAsIDI5MTU4LCAyOTE3NSwgDQorICAgIDI5MTkzLCAyOTIxMCwgMjkyMjgsIDI5MjQ1LCAyOTI2MywgMjkyNzcsIDI5MjkyLCAyOTMwNiwgMjkzMjEsIDI5MzM1LCAyOTM1MCwgMjkzNjQsIDI5Mzc5LCAyOTM5MywgDQorICAgIDI5NDA4LCAyOTQyMiwgMjk0MzcsIDI5NDUxLCAyOTQ2NiwgMjk0ODAsIDI5NDk1LCAyOTUwOSwgMjk1MjQsIDI5NTM4LCAyOTU1MywgMjk1NjcsIDI5NTgyLCAyOTU5NiwgDQorICAgIDI5NjExLCAyOTYyNiwgMjk2NDIsIDI5NjU3LCAyOTY3MywgMjk2ODgsIDI5NzA0LCAyOTcxOSwgMjk3MzUsIDI5NzUwLCAyOTc2NiwgMjk3ODEsIDI5Nzk3LCAyOTgxMiwgDQorICAgIDI5ODI4LCAyOTg0MywgMjk4NTksIDI5ODc0LCAyOTg5MCwgMjk5MDUsIDI5OTIxLCAyOTkzNiwgMjk5NTIsIDI5OTY3LCAyOTk4MywgMjk5OTgsIDMwMDE0LCAzMDAyOSwgDQorICAgIDMwMDQ1LCAzMDA2MCwgMzAwNzYsIDMwMDkxLCAzMDEwNywgMzAxMjIsIDMwMTM4LCAzMDE1MywgMzAxNjksIDMwMTg0LCAzMDIwMCwgMzAyMTUsIDMwMjMxLCAzMDI0NiwgDQorICAgIDMwMjYyLCAzMDI3NywgMzAyOTMsIDMwMzA4LCAzMDMyNCwgMzAzMzksIDMwMzU1LCAzMDM2NywgMzAzNzksIDMwMzkxLCAzMDQwMywgMzA0MTQsIDMwNDI1LCAzMDQzNiwgDQorICAgIDMwNDQ3LCAzMDQ1NywgMzA0NjcsIDMwNDc3LCAzMDQ4NywgMzA0OTgsIDMwNTA5LCAzMDUyMCwgMzA1MzEsIDMwNTQyLCAzMDU1MywgMzA1NjMsIDMwNTczLCAzMDU4NCwgDQorICAgIDMwNTk1LCAzMDYwNSwgMzA2MTUsIDMwNjI2LCAzMDYzNywgMzA2NDcsIDMwNjU3LCAzMDY2OCwgMzA2NzksIDMwNjg5LCAzMDY5OSwgMzA3MTMsIDMwNzI3LCAzMDczOSwgDQorICAgIDMwNzUxLCAzMDc2MSwgMzA3NzAsIDMwNzc5LCAzMDc5MSwgMzA4MDUsIDMwODE5LCAzMDgzMywgMzA4NDYsIDMwODU5LCAzMDg3MywgMzA4ODcsIDMwOTAwLCAzMDkxMywgDQorICAgIDMwOTIzLCAzMDkzNywgMzA5NDcsIDMwOTYxLCAzMDk3MCwgMzA5ODMsIDMwOTkyLCAzMTAwNSwgMzEwMTUsIDMxMDI5LCAzMTAzOSwgMzEwNTMsIDMxMDYyLCAzMTA3NSwgDQorICAgIDMxMDg0LCAzMTA5NywgMzExMDYsIDMxMTE5LCAzMTEyOCwgMzExNDEsIDMxMTUwLCAzMTE2MywgMzExNzIsIDMxMTg1LCAzMTE5MiwgMzEyMDEsIDMxMjExLCAzMTIyNSwgDQorICAgIDMxMjM1LCAzMTI0OSwgMzEyNTgsIDMxMjcxLCAzMTI4MCwgMzEyOTMsIDMxMzAzLCAzMTMxNywgMzEzMjcsIDMxMzQxLCAzMTM1MCwgMzEzNjMsIDMxMzcyLCAzMTM4NSwgDQorICAgIDMxMzk0LCAzMTQwNywgMzE0MTYsIDMxNDI5LCAzMTQzOCwgMzE0NTEsIDMxNDYwLCAzMTQ3MywgMzE0ODIsIDMxNDkzLCAzMTUwNCwgMzE1MTUsIDMxNTI1LCAzMTUzNSwgDQorICAgIDMxNTQ1LCAzMTU1NiwgMzE1NjcsIDMxNTc4LCAzMTU4OCwgMzE1OTgsIDMxNjA4LCAzMTYyMCwgMzE2MzIsIDMxNjQzLCAzMTY1NCwgMzE2NjcsIDMxNjgwLCAzMTY5MiwgDQorICAgIDMxNzA0LCAzMTcxNSwgMzE3MjYsIDMxNzM3LCAzMTc0NywgMzE3NTcsIDMxNzY3LCAzMTc3OCwgMzE3ODksIDMxODAwLCAzMTgxMCwgMzE4MjQsIDMxODM0LCAzMTg0OCwgDQorICAgIDMxODU4LCAzMTg2OSwgMzE4NzksIDMxODg5LCAzMTg5OSwgMzE5MDksIDMxOTIwLCAzMTkzMCwgMzE5NDAsIDMxOTUwLCAzMTk2MCwgMzE5NzIsIDMxOTg3LCAzMjAwMCwgDQorICAgIDMyMDE0LCAzMjAyNiwgMzIwNDEsIDMyMDU0LCAzMjA2OCwgMzIwODAsIDMyMDkyLCAzMjEwNywgMzIxMTksIDMyMTMzLCAzMjE0NCwgMzIxNTksIDMyMTcxLCAzMjE4MiwgDQorICAgIDMyMTk3LCAzMjIwOSwgMzIyMjAsIDMyMjM1LCAzMjI0OCwgMzIyNjEsIDMyMjc0LCAzMjI4NywgMzIyOTgsIDMyMzEzLCAzMjMyNCwgMzIzMzQsIDMyMzQzLCAzMjM1MiwgDQorICAgIDMyMzYxLCAzMjM3NCwgMzIzODcsIDMyMzk5LCAzMjQxMSwgMzI0MjQsIDMyNDM3LCAzMjQ0OSwgMzI0NjEsIDMyNDczLCAzMjQ4NSwgMzI0OTQsIDMyNTAzLCAzMjUxMiwgDQorICAgIDMyNTIzLCAzMjUzNCwgMzI1NDUsIDMyNTU1LCAzMjU2OSwgMzI1NzksIDMyNTkzLCAzMjYwMywgMzI2MTQsIDMyNjI1LCAzMjYzNiwgMzI2NDYsIDMyNjYwLCAzMjY3MCwgDQorICAgIDMyNjg0LCAzMjY5NCwgMzI3MDgsIDMyNzIyLCAzMjczOSwgMzI3NTYsIDMyNzcwLCAzMjc4NCwgMzI3OTYsIDMyODA4LCAzMjgxNywgMzI4MjYsIDMyODM3LCAzMjg0OCwgDQorICAgIDMyODU5LCAzMjg3MCwgMzI4NzksIDMyODg5LCAzMjg5OSwgMzI5MDgsIDMyOTE3LCAzMjkyNywgMzI5MzcsIDMyOTQ2LCAzMjk1NSwgMzI5NjQsIDMyOTc3LCAzMjk4NiwgDQorICAgIDMyOTk5LCAzMzAwOCwgMzMwMjEsIDMzMDMwLCAzMzA0MywgMzMwNTUsIDMzMDY3LCAzMzA3OSwgMzMwOTEsIDMzMDk4LCAzMzEwNCwgMzMxMTMsIDMzMTIyLCAzMzEzMCwgDQorICAgIDMzMTM4LCAzMzE0NywgMzMxNTYsIDMzMTY0LCAzMzE3MiwgMzMxODQsIDMzMTk1LCAzMzIwNywgMzMyMTgsIDMzMjMwLCAzMzI0MSwgMzMyNTMsIDMzMjY0LCAzMzI3NiwgDQorICAgIDMzMjg3LCAzMzI5OSwgMzMzMTAsIDMzMzIyLCAzMzMzNCwgMzMzNDYsIDMzMzU4LCAzMzM3MCwgMzMzODIsIDMzMzk0LCAzMzQwNiwgMzM0MTUsIDMzNDI0LCAzMzQzMywgDQorICAgIDMzNDQyLCAzMzQ1MSwgMzM0NjAsIDMzNDcwLCAzMzQ4MCwgMzM0OTAsIDMzNTAwLCAzMzUxMSwgMzM1MjIsIDMzNTMzLCAzMzU0NCwgMzM1NTMsIDMzNTYyLCAzMzU3NiwgDQorICAgIDMzNTkwLCAzMzYwMywgMzM2MTYsIDMzNjI1LCAzMzYzNCwgMzM2NDIsIDMzNjUwLCAzMzY1OSwgMzM2NjgsIDMzNjc3LCAzMzY4NiwgMzM2OTgsIDMzNzEwLCAzMzcyMiwgDQorICAgIDMzNzM0LCAzMzc1MCwgMzM3NjYsIDMzNzgyLCAzMzc5OCwgMzM4MTQsIDMzODMwLCAzMzg0NiwgMzM4NjIsIDMzODc1LCAzMzg4OCwgMzM4OTksIDMzOTEwLCAzMzkyMSwgDQorICAgIDMzOTMyLCAzMzk0MywgMzM5NTQsIDMzOTY1LCAzMzk3NiwgMzM5OTAsIDM0MDA0LCAzNDAxOCwgMzQwMzIsIDM0MDQ2LCAzNDA2MCwgMzQwNzQsIDM0MDg4LCAzNDEwMiwgDQorICAgIDM0MTE2LCAzNDEyOSwgMzQxNDIsIDM0MTU5LCAzNDE3NiwgMzQxOTIsIDM0MjA4LCAzNDIxOSwgMzQyMzAsIDM0MjQxLCAzNDI1MiwgMzQyNjMsIDM0Mjc0LCAzNDI4NSwgDQorICAgIDM0Mjk2LCAzNDMxMCwgMzQzMjQsIDM0MzM4LCAzNDM1MiwgMzQzNjYsIDM0MzgwLCAzNDM5NCwgMzQ0MDgsIDM0NDIyLCAzNDQzNiwgMzQ0NDksIDM0NDYyLCAzNDQ3OSwgDQorICAgIDM0NDk2LCAzNDUxMiwgMzQ1MjgsIDM0NTQxLCAzNDU1NCwgMzQ1NjcsIDM0NTgwLCAzNDU5MywgMzQ2MDYsIDM0NjE4LCAzNDYzMCwgMzQ2NDIsIDM0NjU0LCAzNDY2NywgDQorICAgIDM0NjgwLCAzNDY5MywgMzQ3MDYsIDM0NzE4LCAzNDczMCwgMzQ3NDIsIDM0NzU0LCAzNDc2NCwgMzQ3NzQsIDM0Nzg2LCAzNDc5NiwgMzQ4MDYsIDM0ODE2LCAzNDgyNiwgDQorICAgIDM0ODM2LCAzNDg0NiwgMzQ4NTksIDM0ODcxLCAzNDg4NCwgMzQ4OTYsIDM0OTEwLCAzNDkyMywgMzQ5MzcsIDM0OTUwLCAzNDk2MywgMzQ5NzUsIDM0OTg4LCAzNTAwMCwgDQorICAgIDM1MDE3LCAzNTAzNCwgMzUwNDcsIDM1MDU5LCAzNTA3MiwgMzUwODQsIDM1MDk4LCAzNTExMSwgMzUxMjUsIDM1MTM4LCAzNTE1MSwgMzUxNjMsIDM1MTc2LCAzNTE4OCwgDQorICAgIDM1MTk4LCAzNTIwOCwgMzUyMTgsIDM1MjI4LCAzNTIzOCwgMzUyNDgsIDM1MjU5LCAzNTI3MiwgMzUyODMsIDM1Mjk5LCAzNTMxNCwgMzUzMzAsIDM1MzQ1LCAzNTM1NiwgDQorICAgIDM1MzY3LCAzNTM3NywgMzUzODcsIDM1Mzk3LCAzNTQwNywgMzU0MTcsIDM1NDI3LCAzNTQzNywgMzU0NDcsIDM1NDU3LCAzNTQ2NywgMzU0NzcsIDM1NDg3LCAzNTQ5NywgDQorICAgIDM1NTA3LCAzNTUxNywgMzU1MjcsIDM1NTM3LCAzNTU0NywgMzU1NTcsIDM1NTY3LCAzNTU3NywgMzU1ODcsIDM1NTk3LCAzNTYwNywgMzU2MjEsIDM1NjMzLCAzNTY0NSwgDQorICAgIDM1NjU3LCAzNTY2OSwgMzU2ODEsIDM1NjkzLCAzNTcwNSwgMzU3MTcsIDM1NzI5LCAzNTc0MSwgMzU3NTMsIDM1NzY1LCAzNTc3NywgMzU3ODksIDM1ODAxLCAzNTgxMywgDQorICAgIDM1ODI1LCAzNTgzNywgMzU4NDksIDM1ODYxLCAzNTg3MywgMzU4ODUsIDM1ODk3LCAzNTkwOSwgMzU5MjEsIDM1OTMxLCAzNTk0MSwgMzU5NTYsIDM1OTcwLCAzNTk4NSwgDQorICAgIDM1OTk5LCAzNjAxMCwgMzYwMjEsIDM2MDMxLCAzNjA0MSwgMzYwNTEsIDM2MDYxLCAzNjA3MSwgMzYwODEsIDM2MDkyLCAzNjEwMywgMzYxMTAsIDM2MTE3LCAzNjEyNywgDQorICAgIDM2MTM3LCAzNjE1MCwgMzYxNjIsIDM2MTc1LCAzNjE4NywgMzYxOTcsIDM2MjA3LCAzNjIxOCwgMzYyMjksIDM2MjQwLCAzNjI1MSwgMzYyNjQsIDM2Mjc2LCAzNjI4OSwgDQorICAgIDM2MzAxLCAzNjMxNCwgMzYzMjYsIDM2MzM5LCAzNjM1MSwgMzYzNjQsIDM2Mzc2LCAzNjM4OSwgMzY0MDEsIDM2NDExLCAzNjQyMCwgMzY0MjksIDM2NDM4LCAzNjQ0NywgDQorICAgIDM2NDU2LCAzNjQ2NSwgMzY0NzQsIDM2NDgzLCAzNjQ5MiwgMzY1MDEsIDM2NTEwLCAzNjUxOSwgMzY1MjgsIDM2NTM3LCAzNjU0NiwgMzY1NTYsIDM2NTY1LCAzNjU3NCwgDQorICAgIDM2NTgzLCAzNjU5MiwgMzY2MDEsIDM2NjEwLCAzNjYxOSwgMzY2MjgsIDM2NjM3LCAzNjY0NiwgMzY2NTUsIDM2NjY0LCAzNjY3MywgMzY2ODIsIDM2NjkxLCAzNjcwMSwgDQorICAgIDM2NzExLCAzNjcyMSwgMzY3MzEsIDM2NzQyLCAzNjc1MywgMzY3NjQsIDM2Nzc1LCAzNjc4NCwgMzY3OTMsIDM2ODAzLCAzNjgxMywgMzY4MjIsIDM2ODMxLCAzNjg0NCwgDQorICAgIDM2ODU3LCAzNjg3MCwgMzY4ODMsIDM2ODk3LCAzNjkxMSwgMzY5MjQsIDM2OTM3LCAzNjk1MCwgMzY5NjMsIDM2OTc2LCAzNjk4OSwgMzcwMDMsIDM3MDE3LCAzNzAzMCwgDQorICAgIDM3MDQzLCAzNzA1MSwgMzcwNTksIDM3MDY4LCAzNzA4MSwgMzcwOTAsIDM3MTAzLCAzNzExMSwgMzcxMjMsIDM3MTMxLCAzNzE0MywgMzcxNTEsIDM3MTYzLCAzNzE3MSwgDQorICAgIDM3MTgzLCAzNzE5MywgMzcyMDcsIDM3MjE3LCAzNzIzMSwgMzcyNDEsIDM3MjU1LCAzNzI2NSwgMzcyNzksIDM3Mjg5LCAzNzMwMywgMzczMTMsIDM3MzI3LCAzNzMzNywgDQorICAgIDM3MzUxLCAzNzM2MSwgMzczNzUsIDM3Mzg2LCAzNzQwMSwgMzc0MTIsIDM3NDI3LCAzNzQzOCwgMzc0NTMsIDM3NDY0LCAzNzQ3OSwgMzc0OTAsIDM3NTA1LCAzNzUxNiwgDQorICAgIDM3NTMxLCAzNzU0MSwgMzc1NTUsIDM3NTY1LCAzNzU3OSwgMzc1ODksIDM3NjAzLCAzNzYxMywgMzc2MjcsIDM3NjM5LCAzNzY1MSwgMzc2NjIsIDM3NjczLCAzNzY4NSwgDQorICAgIDM3Njk3LCAzNzcwOCwgMzc3MTksIDM3NzI5LCAzNzc0MywgMzc3NTMsIDM3NzY3LCAzNzc3NiwgMzc3ODksIDM3Nzk4LCAzNzgxMSwgMzc4MjEsIDM3ODM1LCAzNzg0NSwgDQorICAgIDM3ODU5LCAzNzg2OCwgMzc4ODEsIDM3ODkwLCAzNzkwMywgMzc5MTIsIDM3OTI1LCAzNzkzNCwgMzc5NDcsIDM3OTU2LCAzNzk2OSwgMzc5NzgsIDM3OTkxLCAzODAwMCwgDQorICAgIDM4MDEwLCAzODAyMCwgMzgwMjksIDM4MDM4LCAzODA0OCwgMzgwNTgsIDM4MDY3LCAzODA3NiwgMzgwODUsIDM4MDk4LCAzODEwNywgMzgxMjAsIDM4MTI5LCAzODE0MiwgDQorICAgIDM4MTUxLCAzODE2NCwgMzgxNzUsIDM4MTg2LCAzODE5NiwgMzgyMDYsIDM4MjE3LCAzODIyOCwgMzgyMzgsIDM4MjQ4LCAzODI1OSwgMzgyNzAsIDM4MjgxLCAzODI5MiwgDQorICAgIDM4MzA1LCAzODMxOCwgMzgzMzAsIDM4MzQyLCAzODM1NSwgMzgzNjgsIDM4MzgwLCAzODM5MiwgMzg0MDUsIDM4NDE4LCAzODQzMCwgMzg0NDIsIDM4NDU1LCAzODQ2OCwgDQorICAgIDM4NDgwLCAzODQ5MiwgMzg1MDIsIDM4NTEyLCAzODUyMSwgMzg1MzAsIDM4NTQwLCAzODU1MCwgMzg1NTksIDM4NTY4LCAzODU3NywgMzg1ODgsIDM4NTk3LCAzODYwNiwgDQorICAgIDM4NjE1LCAzODYyOCwgMzg2MzMsIDM4NjQwLCAzODY1MSwgMzg2NjgsIDM4Njc5LCAzODY4NSwgMzg2OTQsIDM4NzAzLCAzODcxMiwgMzg3MjEsIDM4NzMwLCAzODczOSwgDQorICAgIDM4NzQ3LCAzODc1NSwgMzg3NjQsIDM4NzczLCAzODc4MiwgMzg3OTEsIDM4ODAwLCAzODgwOSwgMzg4MTgsIDM4ODI3LCAzODgzNiwgMzg4NDQsIDM4ODUyLCAzODg1OCwgDQorICAgIDM4ODYzLCAzODg3MiwgMzg4ODAsIDM4ODg5LCAzODg5NywgMzg5MDUsIDM4OTE0LCAzODkyMiwgMzg5MzAsIDM4OTQyLCAzODk1MSwgMzg5NTksIDM4OTY4LCAzODk3NiwgDQorICAgIDM4OTg0LCAzODk5MywgMzkwMDEsIDM5MDA5LCAzOTAyMSwgMzkwMzAsIDM5MDQwLCAzOTA0OSwgMzkwNTcsIDM5MDY3LCAzOTA3NiwgMzkwODQsIDM5MDkyLCAzOTEwNCwgDQorICAgIDM5MTExLCAzOTExOCwgMzkxMjUsIDM5MTMyLCAzOTEzOSwgMzkxNDYsIDM5MTU3LCAzOTE2NSwgMzkxNzMsIDM5MTgxLCAwDQorICB9Ow0KKw0KKyAgY29uc3QgY2hhciAqU3RycyA9DQorICAgICJQSElcMDAwSU5MSU5FQVNNXDAwMFBST0xPR19MQUJFTFwwMDBFSF9MQUJFTFwwMDBHQ19MQUJFTFwwMDBLSUxMXDAwMEVYVCINCisgICAgIlJBQ1RfU1VCUkVHXDAwMElOU0VSVF9TVUJSRUdcMDAwSU1QTElDSVRfREVGXDAwMFNVQlJFR19UT19SRUdcMDAwQ09QWV9UIg0KKyAgICAiT19SRUdDTEFTU1wwMDBEQkdfVkFMVUVcMDAwUkVHX1NFUVVFTkNFXDAwMENPUFlcMDAwQUJTX0ZcMDAwQUJTX0ZwMzJcMDAwIg0KKyAgICAiQUJTX0ZwNjRcMDAwQUJTX0ZwODBcMDAwQURDMTZpMTZcMDAwQURDMTZtaVwwMDBBREMxNm1pOFwwMDBBREMxNm1yXDAwMEEiDQorICAgICJEQzE2cmlcMDAwQURDMTZyaThcMDAwQURDMTZybVwwMDBBREMxNnJyXDAwMEFEQzE2cnJfUkVWXDAwMEFEQzMyaTMyXDAwMCINCisgICAgIkFEQzMybWlcMDAwQURDMzJtaThcMDAwQURDMzJtclwwMDBBREMzMnJpXDAwMEFEQzMycmk4XDAwMEFEQzMycm1cMDAwQURDIg0KKyAgICAiMzJyclwwMDBBREMzMnJyX1JFVlwwMDBBREM2NGkzMlwwMDBBREM2NG1pMzJcMDAwQURDNjRtaThcMDAwQURDNjRtclwwMDAiDQorICAgICJBREM2NHJpMzJcMDAwQURDNjRyaThcMDAwQURDNjRybVwwMDBBREM2NHJyXDAwMEFEQzY0cnJfUkVWXDAwMEFEQzhpOFwwMDAiDQorICAgICJBREM4bWlcMDAwQURDOG1yXDAwMEFEQzhyaVwwMDBBREM4cm1cMDAwQURDOHJyXDAwMEFEQzhycl9SRVZcMDAwQUREMTZpMSINCisgICAgIjZcMDAwQUREMTZtaVwwMDBBREQxNm1pOFwwMDBBREQxNm1yXDAwMEFERDE2cmlcMDAwQUREMTZyaThcMDAwQUREMTZybVwwMDAiDQorICAgICJBREQxNnJyXDAwMEFERDE2cnJfYWx0XDAwMEFERDMyaTMyXDAwMEFERDMybWlcMDAwQUREMzJtaThcMDAwQUREMzJtclwwMDAiDQorICAgICJBREQzMnJpXDAwMEFERDMycmk4XDAwMEFERDMycm1cMDAwQUREMzJyclwwMDBBREQzMnJyX2FsdFwwMDBBREQ2NGkzMlwwMDAiDQorICAgICJBREQ2NG1pMzJcMDAwQURENjRtaThcMDAwQURENjRtclwwMDBBREQ2NHJpMzJcMDAwQURENjRyaThcMDAwQURENjRybVwwMDAiDQorICAgICJBREQ2NHJyXDAwMEFERDY0cnJfYWx0XDAwMEFERDhpOFwwMDBBREQ4bWlcMDAwQUREOG1yXDAwMEFERDhyaVwwMDBBREQ4ciINCisgICAgIm1cMDAwQUREOHJyXDAwMEFERDhycl9hbHRcMDAwQUREUERybVwwMDBBRERQRHJyXDAwMEFERFBTcm1cMDAwQUREUFNyclwwMDAiDQorICAgICJBRERTRHJtXDAwMEFERFNEcm1fSW50XDAwMEFERFNEcnJcMDAwQUREU0Rycl9JbnRcMDAwQUREU1NybVwwMDBBRERTU3JtXyINCisgICAgIkludFwwMDBBRERTU3JyXDAwMEFERFNTcnJfSW50XDAwMEFERFNVQlBEcm1cMDAwQUREU1VCUERyclwwMDBBRERTVUJQU3JtIg0KKyAgICAiXDAwMEFERFNVQlBTcnJcMDAwQUREX0YzMm1cMDAwQUREX0Y2NG1cMDAwQUREX0ZJMTZtXDAwMEFERF9GSTMybVwwMDBBREQiDQorICAgICJfRlByU1QwXDAwMEFERF9GU1QwclwwMDBBRERfRnAzMlwwMDBBRERfRnAzMm1cMDAwQUREX0ZwNjRcMDAwQUREX0ZwNjRtXDAwMCINCisgICAgIkFERF9GcDY0bTMyXDAwMEFERF9GcDgwXDAwMEFERF9GcDgwbTMyXDAwMEFERF9GcDgwbTY0XDAwMEFERF9GcEkxNm0zMlwwMDAiDQorICAgICJBRERfRnBJMTZtNjRcMDAwQUREX0ZwSTE2bTgwXDAwMEFERF9GcEkzMm0zMlwwMDBBRERfRnBJMzJtNjRcMDAwQUREX0ZwSSINCisgICAgIjMybTgwXDAwMEFERF9GclNUMFwwMDBBREpDQUxMU1RBQ0tET1dOMzJcMDAwQURKQ0FMTFNUQUNLRE9XTjY0XDAwMEFESkNBIg0KKyAgICAiTExTVEFDS1VQMzJcMDAwQURKQ0FMTFNUQUNLVVA2NFwwMDBBRVNERUNMQVNUcm1cMDAwQUVTREVDTEFTVHJyXDAwMEFFU0QiDQorICAgICJFQ3JtXDAwMEFFU0RFQ3JyXDAwMEFFU0VOQ0xBU1RybVwwMDBBRVNFTkNMQVNUcnJcMDAwQUVTRU5Dcm1cMDAwQUVTRU5DciINCisgICAgInJcMDAwQUVTSU1Dcm1cMDAwQUVTSU1DcnJcMDAwQUVTS0VZR0VOQVNTSVNUMTI4cm1cMDAwQUVTS0VZR0VOQVNTSVNUMTI4Ig0KKyAgICAicnJcMDAwQU5EMTZpMTZcMDAwQU5EMTZtaVwwMDBBTkQxNm1pOFwwMDBBTkQxNm1yXDAwMEFORDE2cmlcMDAwQU5EMTZyaTgiDQorICAgICJcMDAwQU5EMTZybVwwMDBBTkQxNnJyXDAwMEFORDE2cnJfUkVWXDAwMEFORDMyaTMyXDAwMEFORDMybWlcMDAwQU5EMzJtaSINCisgICAgIjhcMDAwQU5EMzJtclwwMDBBTkQzMnJpXDAwMEFORDMycmk4XDAwMEFORDMycm1cMDAwQU5EMzJyclwwMDBBTkQzMnJyX1JFIg0KKyAgICAiVlwwMDBBTkQ2NGkzMlwwMDBBTkQ2NG1pMzJcMDAwQU5ENjRtaThcMDAwQU5ENjRtclwwMDBBTkQ2NHJpMzJcMDAwQU5ENjQiDQorICAgICJyaThcMDAwQU5ENjRybVwwMDBBTkQ2NHJyXDAwMEFORDY0cnJfUkVWXDAwMEFORDhpOFwwMDBBTkQ4bWlcMDAwQU5EOG1yXDAwMCINCisgICAgIkFORDhyaVwwMDBBTkQ4cm1cMDAwQU5EOHJyXDAwMEFORDhycl9SRVZcMDAwQU5ETlBEcm1cMDAwQU5ETlBEcnJcMDAwQU5EIg0KKyAgICAiTlBTcm1cMDAwQU5ETlBTcnJcMDAwQU5EUERybVwwMDBBTkRQRHJyXDAwMEFORFBTcm1cMDAwQU5EUFNyclwwMDBBVE9NQUQiDQorICAgICJENjQzMlwwMDBBVE9NQU5EMTZcMDAwQVRPTUFORDMyXDAwMEFUT01BTkQ2NFwwMDBBVE9NQU5ENjQzMlwwMDBBVE9NQU5EOCINCisgICAgIlwwMDBBVE9NTUFYMTZcMDAwQVRPTU1BWDMyXDAwMEFUT01NQVg2NFwwMDBBVE9NTUlOMTZcMDAwQVRPTU1JTjMyXDAwMEFUIg0KKyAgICAiT01NSU42NFwwMDBBVE9NTkFORDE2XDAwMEFUT01OQU5EMzJcMDAwQVRPTU5BTkQ2NFwwMDBBVE9NTkFORDY0MzJcMDAwQVQiDQorICAgICJPTU5BTkQ4XDAwMEFUT01PUjE2XDAwMEFUT01PUjMyXDAwMEFUT01PUjY0XDAwMEFUT01PUjY0MzJcMDAwQVRPTU9SOFwwMDAiDQorICAgICJBVE9NU1VCNjQzMlwwMDBBVE9NU1dBUDY0MzJcMDAwQVRPTVVNQVgxNlwwMDBBVE9NVU1BWDMyXDAwMEFUT01VTUFYNjRcMDAwIg0KKyAgICAiQVRPTVVNSU4xNlwwMDBBVE9NVU1JTjMyXDAwMEFUT01VTUlONjRcMDAwQVRPTVhPUjE2XDAwMEFUT01YT1IzMlwwMDBBVE8iDQorICAgICJNWE9SNjRcMDAwQVRPTVhPUjY0MzJcMDAwQVRPTVhPUjhcMDAwQkxFTkRQRHJtaVwwMDBCTEVORFBEcnJpXDAwMEJMRU5EUCINCisgICAgIlNybWlcMDAwQkxFTkRQU3JyaVwwMDBCTEVORFZQRHJtMFwwMDBCTEVORFZQRHJyMFwwMDBCTEVORFZQU3JtMFwwMDBCTEVOIg0KKyAgICAiRFZQU3JyMFwwMDBCU0YxNnJtXDAwMEJTRjE2cnJcMDAwQlNGMzJybVwwMDBCU0YzMnJyXDAwMEJTRjY0cm1cMDAwQlNGNjQiDQorICAgICJyclwwMDBCU1IxNnJtXDAwMEJTUjE2cnJcMDAwQlNSMzJybVwwMDBCU1IzMnJyXDAwMEJTUjY0cm1cMDAwQlNSNjRyclwwMDAiDQorICAgICJCU1dBUDMyclwwMDBCU1dBUDY0clwwMDBCVDE2bWk4XDAwMEJUMTZtclwwMDBCVDE2cmk4XDAwMEJUMTZyclwwMDBCVDMybSINCisgICAgImk4XDAwMEJUMzJtclwwMDBCVDMycmk4XDAwMEJUMzJyclwwMDBCVDY0bWk4XDAwMEJUNjRtclwwMDBCVDY0cmk4XDAwMEJUIg0KKyAgICAiNjRyclwwMDBCVEMxNm1pOFwwMDBCVEMxNm1yXDAwMEJUQzE2cmk4XDAwMEJUQzE2cnJcMDAwQlRDMzJtaThcMDAwQlRDMzIiDQorICAgICJtclwwMDBCVEMzMnJpOFwwMDBCVEMzMnJyXDAwMEJUQzY0bWk4XDAwMEJUQzY0bXJcMDAwQlRDNjRyaThcMDAwQlRDNjRyciINCisgICAgIlwwMDBCVFIxNm1pOFwwMDBCVFIxNm1yXDAwMEJUUjE2cmk4XDAwMEJUUjE2cnJcMDAwQlRSMzJtaThcMDAwQlRSMzJtclwwMDAiDQorICAgICJCVFIzMnJpOFwwMDBCVFIzMnJyXDAwMEJUUjY0bWk4XDAwMEJUUjY0bXJcMDAwQlRSNjRyaThcMDAwQlRSNjRyclwwMDBCVCINCisgICAgIlMxNm1pOFwwMDBCVFMxNm1yXDAwMEJUUzE2cmk4XDAwMEJUUzE2cnJcMDAwQlRTMzJtaThcMDAwQlRTMzJtclwwMDBCVFMzIg0KKyAgICAiMnJpOFwwMDBCVFMzMnJyXDAwMEJUUzY0bWk4XDAwMEJUUzY0bXJcMDAwQlRTNjRyaThcMDAwQlRTNjRyclwwMDBDQUxMMzIiDQorICAgICJtXDAwMENBTEwzMnJcMDAwQ0FMTDY0bVwwMDBDQUxMNjRwY3JlbDMyXDAwMENBTEw2NHJcMDAwQ0FMTHBjcmVsMTZcMDAwQyINCisgICAgIkFMTHBjcmVsMzJcMDAwQ0JXXDAwMENEUVwwMDBDRFFFXDAwMENIU19GXDAwMENIU19GcDMyXDAwMENIU19GcDY0XDAwMENIIg0KKyAgICAiU19GcDgwXDAwMENMQ1wwMDBDTERcMDAwQ0xGTFVTSFwwMDBDTElcMDAwQ0xUU1wwMDBDTUNcMDAwQ01PVkExNnJtXDAwMEMiDQorICAgICJNT1ZBMTZyclwwMDBDTU9WQTMycm1cMDAwQ01PVkEzMnJyXDAwMENNT1ZBNjRybVwwMDBDTU9WQTY0cnJcMDAwQ01PVkFFMSINCisgICAgIjZybVwwMDBDTU9WQUUxNnJyXDAwMENNT1ZBRTMycm1cMDAwQ01PVkFFMzJyclwwMDBDTU9WQUU2NHJtXDAwMENNT1ZBRTY0Ig0KKyAgICAicnJcMDAwQ01PVkIxNnJtXDAwMENNT1ZCMTZyclwwMDBDTU9WQjMycm1cMDAwQ01PVkIzMnJyXDAwMENNT1ZCNjRybVwwMDAiDQorICAgICJDTU9WQjY0cnJcMDAwQ01PVkJFMTZybVwwMDBDTU9WQkUxNnJyXDAwMENNT1ZCRTMycm1cMDAwQ01PVkJFMzJyclwwMDBDTSINCisgICAgIk9WQkU2NHJtXDAwMENNT1ZCRTY0cnJcMDAwQ01PVkJFX0ZcMDAwQ01PVkJFX0ZwMzJcMDAwQ01PVkJFX0ZwNjRcMDAwQ01PIg0KKyAgICAiVkJFX0ZwODBcMDAwQ01PVkJfRlwwMDBDTU9WQl9GcDMyXDAwMENNT1ZCX0ZwNjRcMDAwQ01PVkJfRnA4MFwwMDBDTU9WRTEiDQorICAgICI2cm1cMDAwQ01PVkUxNnJyXDAwMENNT1ZFMzJybVwwMDBDTU9WRTMycnJcMDAwQ01PVkU2NHJtXDAwMENNT1ZFNjRyclwwMDAiDQorICAgICJDTU9WRV9GXDAwMENNT1ZFX0ZwMzJcMDAwQ01PVkVfRnA2NFwwMDBDTU9WRV9GcDgwXDAwMENNT1ZHMTZybVwwMDBDTU9WRyINCisgICAgIjE2cnJcMDAwQ01PVkczMnJtXDAwMENNT1ZHMzJyclwwMDBDTU9WRzY0cm1cMDAwQ01PVkc2NHJyXDAwMENNT1ZHRTE2cm1cMDAwIg0KKyAgICAiQ01PVkdFMTZyclwwMDBDTU9WR0UzMnJtXDAwMENNT1ZHRTMycnJcMDAwQ01PVkdFNjRybVwwMDBDTU9WR0U2NHJyXDAwMEMiDQorICAgICJNT1ZMMTZybVwwMDBDTU9WTDE2cnJcMDAwQ01PVkwzMnJtXDAwMENNT1ZMMzJyclwwMDBDTU9WTDY0cm1cMDAwQ01PVkw2NCINCisgICAgInJyXDAwMENNT1ZMRTE2cm1cMDAwQ01PVkxFMTZyclwwMDBDTU9WTEUzMnJtXDAwMENNT1ZMRTMycnJcMDAwQ01PVkxFNjRyIg0KKyAgICAibVwwMDBDTU9WTEU2NHJyXDAwMENNT1ZOQkVfRlwwMDBDTU9WTkJFX0ZwMzJcMDAwQ01PVk5CRV9GcDY0XDAwMENNT1ZOQkUiDQorICAgICJfRnA4MFwwMDBDTU9WTkJfRlwwMDBDTU9WTkJfRnAzMlwwMDBDTU9WTkJfRnA2NFwwMDBDTU9WTkJfRnA4MFwwMDBDTU9WTiINCisgICAgIkUxNnJtXDAwMENNT1ZORTE2cnJcMDAwQ01PVk5FMzJybVwwMDBDTU9WTkUzMnJyXDAwMENNT1ZORTY0cm1cMDAwQ01PVk5FIg0KKyAgICAiNjRyclwwMDBDTU9WTkVfRlwwMDBDTU9WTkVfRnAzMlwwMDBDTU9WTkVfRnA2NFwwMDBDTU9WTkVfRnA4MFwwMDBDTU9WTk8iDQorICAgICIxNnJtXDAwMENNT1ZOTzE2cnJcMDAwQ01PVk5PMzJybVwwMDBDTU9WTk8zMnJyXDAwMENNT1ZOTzY0cm1cMDAwQ01PVk5PNiINCisgICAgIjRyclwwMDBDTU9WTlAxNnJtXDAwMENNT1ZOUDE2cnJcMDAwQ01PVk5QMzJybVwwMDBDTU9WTlAzMnJyXDAwMENNT1ZOUDY0Ig0KKyAgICAicm1cMDAwQ01PVk5QNjRyclwwMDBDTU9WTlBfRlwwMDBDTU9WTlBfRnAzMlwwMDBDTU9WTlBfRnA2NFwwMDBDTU9WTlBfRnAiDQorICAgICI4MFwwMDBDTU9WTlMxNnJtXDAwMENNT1ZOUzE2cnJcMDAwQ01PVk5TMzJybVwwMDBDTU9WTlMzMnJyXDAwMENNT1ZOUzY0ciINCisgICAgIm1cMDAwQ01PVk5TNjRyclwwMDBDTU9WTzE2cm1cMDAwQ01PVk8xNnJyXDAwMENNT1ZPMzJybVwwMDBDTU9WTzMycnJcMDAwIg0KKyAgICAiQ01PVk82NHJtXDAwMENNT1ZPNjRyclwwMDBDTU9WUDE2cm1cMDAwQ01PVlAxNnJyXDAwMENNT1ZQMzJybVwwMDBDTU9WUDMiDQorICAgICIycnJcMDAwQ01PVlA2NHJtXDAwMENNT1ZQNjRyclwwMDBDTU9WUF9GXDAwMENNT1ZQX0ZwMzJcMDAwQ01PVlBfRnA2NFwwMDAiDQorICAgICJDTU9WUF9GcDgwXDAwMENNT1ZTMTZybVwwMDBDTU9WUzE2cnJcMDAwQ01PVlMzMnJtXDAwMENNT1ZTMzJyclwwMDBDTU9WUyINCisgICAgIjY0cm1cMDAwQ01PVlM2NHJyXDAwMENNT1ZfRlIzMlwwMDBDTU9WX0ZSNjRcMDAwQ01PVl9HUjE2XDAwMENNT1ZfR1IzMlwwMDAiDQorICAgICJDTU9WX0dSOFwwMDBDTU9WX1JGUDMyXDAwMENNT1ZfUkZQNjRcMDAwQ01PVl9SRlA4MFwwMDBDTU9WX1YxSTY0XDAwMENNTyINCisgICAgIlZfVjJGNjRcMDAwQ01PVl9WMkk2NFwwMDBDTU9WX1Y0RjMyXDAwMENNUDE2aTE2XDAwMENNUDE2bWlcMDAwQ01QMTZtaThcMDAwIg0KKyAgICAiQ01QMTZtclwwMDBDTVAxNnJpXDAwMENNUDE2cmk4XDAwMENNUDE2cm1cMDAwQ01QMTZyclwwMDBDTVAxNnJyX2FsdFwwMDAiDQorICAgICJDTVAzMmkzMlwwMDBDTVAzMm1pXDAwMENNUDMybWk4XDAwMENNUDMybXJcMDAwQ01QMzJyaVwwMDBDTVAzMnJpOFwwMDBDTSINCisgICAgIlAzMnJtXDAwMENNUDMycnJcMDAwQ01QMzJycl9hbHRcMDAwQ01QNjRpMzJcMDAwQ01QNjRtaTMyXDAwMENNUDY0bWk4XDAwMCINCisgICAgIkNNUDY0bXJcMDAwQ01QNjRtcm1yclwwMDBDTVA2NHJpMzJcMDAwQ01QNjRyaThcMDAwQ01QNjRybVwwMDBDTVA2NHJyXDAwMCINCisgICAgIkNNUDhpOFwwMDBDTVA4bWlcMDAwQ01QOG1yXDAwMENNUDhyaVwwMDBDTVA4cm1cMDAwQ01QOHJyXDAwMENNUDhycl9hbHRcMDAwIg0KKyAgICAiQ01QUERybWlcMDAwQ01QUERybWlfYWx0XDAwMENNUFBEcnJpXDAwMENNUFBEcnJpX2FsdFwwMDBDTVBQU3JtaVwwMDBDTVAiDQorICAgICJQU3JtaV9hbHRcMDAwQ01QUFNycmlcMDAwQ01QUFNycmlfYWx0XDAwMENNUFMxNlwwMDBDTVBTMzJcMDAwQ01QUzY0XDAwMCINCisgICAgIkNNUFM4XDAwMENNUFNEcm1cMDAwQ01QU0RybV9hbHRcMDAwQ01QU0RyclwwMDBDTVBTRHJyX2FsdFwwMDBDTVBTU3JtXDAwMCINCisgICAgIkNNUFNTcm1fYWx0XDAwMENNUFNTcnJcMDAwQ01QU1Nycl9hbHRcMDAwQ01QWENIRzE2QlwwMDBDTVBYQ0hHMTZybVwwMDBDIg0KKyAgICAiTVBYQ0hHMTZyclwwMDBDTVBYQ0hHMzJybVwwMDBDTVBYQ0hHMzJyclwwMDBDTVBYQ0hHNjRybVwwMDBDTVBYQ0hHNjRyclwwMDAiDQorICAgICJDTVBYQ0hHOEJcMDAwQ01QWENIRzhybVwwMDBDTVBYQ0hHOHJyXDAwMENPTUlTRHJtXDAwMENPTUlTRHJyXDAwMENPTUlTUyINCisgICAgInJtXDAwMENPTUlTU3JyXDAwMENPTVBfRlNUMHJcMDAwQ09NX0ZJUHJcMDAwQ09NX0ZJclwwMDBDT01fRlNUMHJcMDAwQ09TIg0KKyAgICAiX0ZcMDAwQ09TX0ZwMzJcMDAwQ09TX0ZwNjRcMDAwQ09TX0ZwODBcMDAwQ1BVSURcMDAwQ1FPXDAwMENSQzMybTE2XDAwMEMiDQorICAgICJSQzMybTMyXDAwMENSQzMybThcMDAwQ1JDMzJyMTZcMDAwQ1JDMzJyMzJcMDAwQ1JDMzJyOFwwMDBDUkM2NG02NFwwMDBDUiINCisgICAgIkM2NG04XDAwMENSQzY0cjY0XDAwMENSQzY0cjhcMDAwQ1NfUFJFRklYXDAwMENWVERRMlBEcm1cMDAwQ1ZURFEyUERyclwwMDAiDQorICAgICJDVlREUTJQU3JtXDAwMENWVERRMlBTcnJcMDAwQ1ZUUEQyRFFybVwwMDBDVlRQRDJEUXJyXDAwMENWVFBEMlBTcm1cMDAwQyINCisgICAgIlZUUEQyUFNyclwwMDBDVlRQUzJEUXJtXDAwMENWVFBTMkRRcnJcMDAwQ1ZUUFMyUERybVwwMDBDVlRQUzJQRHJyXDAwMENWIg0KKyAgICAiVFNEMlNJNjRybVwwMDBDVlRTRDJTSTY0cnJcMDAwQ1ZUU0QyU1NybVwwMDBDVlRTRDJTU3JyXDAwMENWVFNJMlNENjRybVwwMDAiDQorICAgICJDVlRTSTJTRDY0cnJcMDAwQ1ZUU0kyU0RybVwwMDBDVlRTSTJTRHJyXDAwMENWVFNJMlNTNjRybVwwMDBDVlRTSTJTUzY0ciINCisgICAgInJcMDAwQ1ZUU0kyU1NybVwwMDBDVlRTSTJTU3JyXDAwMENWVFNTMlNEcm1cMDAwQ1ZUU1MyU0RyclwwMDBDVlRTUzJTSTY0Ig0KKyAgICAicm1cMDAwQ1ZUU1MyU0k2NHJyXDAwMENWVFNTMlNJcm1cMDAwQ1ZUU1MyU0lyclwwMDBDVlRUUFMyRFFybVwwMDBDVlRUUFMiDQorICAgICIyRFFyclwwMDBDVlRUU0QyU0k2NHJtXDAwMENWVFRTRDJTSTY0cnJcMDAwQ1ZUVFNEMlNJcm1cMDAwQ1ZUVFNEMlNJcnJcMDAwIg0KKyAgICAiQ1ZUVFNTMlNJNjRybVwwMDBDVlRUU1MyU0k2NHJyXDAwMENWVFRTUzJTSXJtXDAwMENWVFRTUzJTSXJyXDAwMENXRFwwMDAiDQorICAgICJDV0RFXDAwMERFQzE2bVwwMDBERUMxNnJcMDAwREVDMzJtXDAwMERFQzMyclwwMDBERUM2NF8xNm1cMDAwREVDNjRfMTZyXDAwMCINCisgICAgIkRFQzY0XzMybVwwMDBERUM2NF8zMnJcMDAwREVDNjRtXDAwMERFQzY0clwwMDBERUM4bVwwMDBERUM4clwwMDBESVYxNm1cMDAwIg0KKyAgICAiRElWMTZyXDAwMERJVjMybVwwMDBESVYzMnJcMDAwRElWNjRtXDAwMERJVjY0clwwMDBESVY4bVwwMDBESVY4clwwMDBESVYiDQorICAgICJQRHJtXDAwMERJVlBEcnJcMDAwRElWUFNybVwwMDBESVZQU3JyXDAwMERJVlJfRjMybVwwMDBESVZSX0Y2NG1cMDAwRElWUiINCisgICAgIl9GSTE2bVwwMDBESVZSX0ZJMzJtXDAwMERJVlJfRlByU1QwXDAwMERJVlJfRlNUMHJcMDAwRElWUl9GcDMybVwwMDBESVZSIg0KKyAgICAiX0ZwNjRtXDAwMERJVlJfRnA2NG0zMlwwMDBESVZSX0ZwODBtMzJcMDAwRElWUl9GcDgwbTY0XDAwMERJVlJfRnBJMTZtMzIiDQorICAgICJcMDAwRElWUl9GcEkxNm02NFwwMDBESVZSX0ZwSTE2bTgwXDAwMERJVlJfRnBJMzJtMzJcMDAwRElWUl9GcEkzMm02NFwwMDAiDQorICAgICJESVZSX0ZwSTMybTgwXDAwMERJVlJfRnJTVDBcMDAwRElWU0RybVwwMDBESVZTRHJtX0ludFwwMDBESVZTRHJyXDAwMERJViINCisgICAgIlNEcnJfSW50XDAwMERJVlNTcm1cMDAwRElWU1NybV9JbnRcMDAwRElWU1NyclwwMDBESVZTU3JyX0ludFwwMDBESVZfRjMyIg0KKyAgICAibVwwMDBESVZfRjY0bVwwMDBESVZfRkkxNm1cMDAwRElWX0ZJMzJtXDAwMERJVl9GUHJTVDBcMDAwRElWX0ZTVDByXDAwMEQiDQorICAgICJJVl9GcDMyXDAwMERJVl9GcDMybVwwMDBESVZfRnA2NFwwMDBESVZfRnA2NG1cMDAwRElWX0ZwNjRtMzJcMDAwRElWX0ZwOCINCisgICAgIjBcMDAwRElWX0ZwODBtMzJcMDAwRElWX0ZwODBtNjRcMDAwRElWX0ZwSTE2bTMyXDAwMERJVl9GcEkxNm02NFwwMDBESVZfIg0KKyAgICAiRnBJMTZtODBcMDAwRElWX0ZwSTMybTMyXDAwMERJVl9GcEkzMm02NFwwMDBESVZfRnBJMzJtODBcMDAwRElWX0ZyU1QwXDAwMCINCisgICAgIkRQUERybWlcMDAwRFBQRHJyaVwwMDBEUFBTcm1pXDAwMERQUFNycmlcMDAwRFNfUFJFRklYXDAwMEVIX1JFVFVSTlwwMDBFIg0KKyAgICAiSF9SRVRVUk42NFwwMDBFTlRFUlwwMDBFU19QUkVGSVhcMDAwRVhUUkFDVFBTbXJcMDAwRVhUUkFDVFBTcnJcMDAwRjJYTTEiDQorICAgICJcMDAwRkFSQ0FMTDE2aVwwMDBGQVJDQUxMMTZtXDAwMEZBUkNBTEwzMmlcMDAwRkFSQ0FMTDMybVwwMDBGQVJDQUxMNjRcMDAwIg0KKyAgICAiRkFSSk1QMTZpXDAwMEZBUkpNUDE2bVwwMDBGQVJKTVAzMmlcMDAwRkFSSk1QMzJtXDAwMEZBUkpNUDY0XDAwMEZCTERtXDAwMCINCisgICAgIkZCU1RQbVwwMDBGQ09NMzJtXDAwMEZDT002NG1cMDAwRkNPTVAzMm1cMDAwRkNPTVA2NG1cMDAwRkNPTVBQXDAwMEZERUNTIg0KKyAgICAiVFBcMDAwRkZSRUVcMDAwRklDT00xNm1cMDAwRklDT00zMm1cMDAwRklDT01QMTZtXDAwMEZJQ09NUDMybVwwMDBGSU5DU1QiDQorICAgICJQXDAwMEZMRENXMTZtXDAwMEZMREVOVm1cMDAwRkxETDJFXDAwMEZMREwyVFwwMDBGTERMRzJcMDAwRkxETE4yXDAwMEZMRCINCisgICAgIlBJXDAwMEZOQ0xFWFwwMDBGTklOSVRcMDAwRk5PUFwwMDBGTlNUQ1cxNm1cMDAwRk5TVFNXOHJcMDAwRk5TVFNXbVwwMDBGIg0KKyAgICAiUDMyX1RPX0lOVDE2X0lOX01FTVwwMDBGUDMyX1RPX0lOVDMyX0lOX01FTVwwMDBGUDMyX1RPX0lOVDY0X0lOX01FTVwwMDAiDQorICAgICJGUDY0X1RPX0lOVDE2X0lOX01FTVwwMDBGUDY0X1RPX0lOVDMyX0lOX01FTVwwMDBGUDY0X1RPX0lOVDY0X0lOX01FTVwwMDAiDQorICAgICJGUDgwX1RPX0lOVDE2X0lOX01FTVwwMDBGUDgwX1RPX0lOVDMyX0lOX01FTVwwMDBGUDgwX1RPX0lOVDY0X0lOX01FTVwwMDAiDQorICAgICJGUEFUQU5cMDAwRlBSRU1cMDAwRlBSRU0xXDAwMEZQVEFOXDAwMEZSTkRJTlRcMDAwRlJTVE9SbVwwMDBGU0FWRW1cMDAwRiINCisgICAgIlNDQUxFXDAwMEZTSU5DT1NcMDAwRlNURU5WbVwwMDBGU19NT1YzMnJtXDAwMEZTX1BSRUZJWFwwMDBGWEFNXDAwMEZYUlNUIg0KKyAgICAiT1JcMDAwRlhTQVZFXDAwMEZYVFJBQ1RcMDAwRllMMlhcMDAwRllMMlhQMVwwMDBGcEdFVF9TVDBfMzJcMDAwRnBHRVRfU1QiDQorICAgICIwXzY0XDAwMEZwR0VUX1NUMF84MFwwMDBGcEdFVF9TVDFfMzJcMDAwRnBHRVRfU1QxXzY0XDAwMEZwR0VUX1NUMV84MFwwMDAiDQorICAgICJGcFNFVF9TVDBfMzJcMDAwRnBTRVRfU1QwXzY0XDAwMEZwU0VUX1NUMF84MFwwMDBGcFNFVF9TVDFfMzJcMDAwRnBTRVRfUyINCisgICAgIlQxXzY0XDAwMEZwU0VUX1NUMV84MFwwMDBGc0FORE5QRHJtXDAwMEZzQU5ETlBEcnJcMDAwRnNBTkROUFNybVwwMDBGc0FOIg0KKyAgICAiRE5QU3JyXDAwMEZzQU5EUERybVwwMDBGc0FORFBEcnJcMDAwRnNBTkRQU3JtXDAwMEZzQU5EUFNyclwwMDBGc0ZMRDBTRFwwMDAiDQorICAgICJGc0ZMRDBTU1wwMDBGc01PVkFQRHJtXDAwMEZzTU9WQVBEcnJcMDAwRnNNT1ZBUFNybVwwMDBGc01PVkFQU3JyXDAwMEZzTyINCisgICAgIlJQRHJtXDAwMEZzT1JQRHJyXDAwMEZzT1JQU3JtXDAwMEZzT1JQU3JyXDAwMEZzWE9SUERybVwwMDBGc1hPUlBEcnJcMDAwIg0KKyAgICAiRnNYT1JQU3JtXDAwMEZzWE9SUFNyclwwMDBHU19NT1YzMnJtXDAwMEdTX1BSRUZJWFwwMDBIQUREUERybVwwMDBIQUREUEQiDQorICAgICJyclwwMDBIQUREUFNybVwwMDBIQUREUFNyclwwMDBITFRcMDAwSFNVQlBEcm1cMDAwSFNVQlBEcnJcMDAwSFNVQlBTcm1cMDAwIg0KKyAgICAiSFNVQlBTcnJcMDAwSURJVjE2bVwwMDBJRElWMTZyXDAwMElESVYzMm1cMDAwSURJVjMyclwwMDBJRElWNjRtXDAwMElESVYiDQorICAgICI2NHJcMDAwSURJVjhtXDAwMElESVY4clwwMDBJTERfRjE2bVwwMDBJTERfRjMybVwwMDBJTERfRjY0bVwwMDBJTERfRnAxNiINCisgICAgIm0zMlwwMDBJTERfRnAxNm02NFwwMDBJTERfRnAxNm04MFwwMDBJTERfRnAzMm0zMlwwMDBJTERfRnAzMm02NFwwMDBJTERfIg0KKyAgICAiRnAzMm04MFwwMDBJTERfRnA2NG0zMlwwMDBJTERfRnA2NG02NFwwMDBJTERfRnA2NG04MFwwMDBJTVVMMTZtXDAwMElNVUwiDQorICAgICIxNnJcMDAwSU1VTDE2cm1cMDAwSU1VTDE2cm1pXDAwMElNVUwxNnJtaThcMDAwSU1VTDE2cnJcMDAwSU1VTDE2cnJpXDAwMCINCisgICAgIklNVUwxNnJyaThcMDAwSU1VTDMybVwwMDBJTVVMMzJyXDAwMElNVUwzMnJtXDAwMElNVUwzMnJtaVwwMDBJTVVMMzJybWk4Ig0KKyAgICAiXDAwMElNVUwzMnJyXDAwMElNVUwzMnJyaVwwMDBJTVVMMzJycmk4XDAwMElNVUw2NG1cMDAwSU1VTDY0clwwMDBJTVVMNjQiDQorICAgICJybVwwMDBJTVVMNjRybWkzMlwwMDBJTVVMNjRybWk4XDAwMElNVUw2NHJyXDAwMElNVUw2NHJyaTMyXDAwMElNVUw2NHJyaSINCisgICAgIjhcMDAwSU1VTDhtXDAwMElNVUw4clwwMDBJTjE2XDAwMElOMTZyaVwwMDBJTjE2cnJcMDAwSU4zMlwwMDBJTjMycmlcMDAwIg0KKyAgICAiSU4zMnJyXDAwMElOOFwwMDBJTjhyaVwwMDBJTjhyclwwMDBJTkMxNm1cMDAwSU5DMTZyXDAwMElOQzMybVwwMDBJTkMzMnIiDQorICAgICJcMDAwSU5DNjRfMTZtXDAwMElOQzY0XzE2clwwMDBJTkM2NF8zMm1cMDAwSU5DNjRfMzJyXDAwMElOQzY0bVwwMDBJTkM2NCINCisgICAgInJcMDAwSU5DOG1cMDAwSU5DOHJcMDAwSU5TRVJUUFNybVwwMDBJTlNFUlRQU3JyXDAwMElOVFwwMDBJTlQzXDAwMElOVE9cMDAwIg0KKyAgICAiSU5WRFwwMDBJTlZFUFRcMDAwSU5WTFBHXDAwMElOVlZQSURcMDAwSVJFVDE2XDAwMElSRVQzMlwwMDBJUkVUNjRcMDAwSVMiDQorICAgICJUVF9GUDE2bVwwMDBJU1RUX0ZQMzJtXDAwMElTVFRfRlA2NG1cMDAwSVNUVF9GcDE2bTMyXDAwMElTVFRfRnAxNm02NFwwMDAiDQorICAgICJJU1RUX0ZwMTZtODBcMDAwSVNUVF9GcDMybTMyXDAwMElTVFRfRnAzMm02NFwwMDBJU1RUX0ZwMzJtODBcMDAwSVNUVF9GcCINCisgICAgIjY0bTMyXDAwMElTVFRfRnA2NG02NFwwMDBJU1RUX0ZwNjRtODBcMDAwSVNUX0YxNm1cMDAwSVNUX0YzMm1cMDAwSVNUX0ZQIg0KKyAgICAiMTZtXDAwMElTVF9GUDMybVwwMDBJU1RfRlA2NG1cMDAwSVNUX0ZwMTZtMzJcMDAwSVNUX0ZwMTZtNjRcMDAwSVNUX0ZwMTYiDQorICAgICJtODBcMDAwSVNUX0ZwMzJtMzJcMDAwSVNUX0ZwMzJtNjRcMDAwSVNUX0ZwMzJtODBcMDAwSVNUX0ZwNjRtMzJcMDAwSVNUXyINCisgICAgIkZwNjRtNjRcMDAwSVNUX0ZwNjRtODBcMDAwSW50X0NNUFNEcm1cMDAwSW50X0NNUFNEcnJcMDAwSW50X0NNUFNTcm1cMDAwIg0KKyAgICAiSW50X0NNUFNTcnJcMDAwSW50X0NPTUlTRHJtXDAwMEludF9DT01JU0RyclwwMDBJbnRfQ09NSVNTcm1cMDAwSW50X0NPTUkiDQorICAgICJTU3JyXDAwMEludF9DVlREUTJQRHJtXDAwMEludF9DVlREUTJQRHJyXDAwMEludF9DVlREUTJQU3JtXDAwMEludF9DVlREUSINCisgICAgIjJQU3JyXDAwMEludF9DVlRQRDJEUXJtXDAwMEludF9DVlRQRDJEUXJyXDAwMEludF9DVlRQRDJQSXJtXDAwMEludF9DVlRQIg0KKyAgICAiRDJQSXJyXDAwMEludF9DVlRQRDJQU3JtXDAwMEludF9DVlRQRDJQU3JyXDAwMEludF9DVlRQSTJQRHJtXDAwMEludF9DVlQiDQorICAgICJQSTJQRHJyXDAwMEludF9DVlRQSTJQU3JtXDAwMEludF9DVlRQSTJQU3JyXDAwMEludF9DVlRQUzJEUXJtXDAwMEludF9DViINCisgICAgIlRQUzJEUXJyXDAwMEludF9DVlRQUzJQRHJtXDAwMEludF9DVlRQUzJQRHJyXDAwMEludF9DVlRQUzJQSXJtXDAwMEludF9DIg0KKyAgICAiVlRQUzJQSXJyXDAwMEludF9DVlRTRDJTSTY0cm1cMDAwSW50X0NWVFNEMlNJNjRyclwwMDBJbnRfQ1ZUU0QyU0lybVwwMDAiDQorICAgICJJbnRfQ1ZUU0QyU0lyclwwMDBJbnRfQ1ZUU0QyU1NybVwwMDBJbnRfQ1ZUU0QyU1NyclwwMDBJbnRfQ1ZUU0kyU0Q2NHJtXDAwMCINCisgICAgIkludF9DVlRTSTJTRDY0cnJcMDAwSW50X0NWVFNJMlNEcm1cMDAwSW50X0NWVFNJMlNEcnJcMDAwSW50X0NWVFNJMlNTNjRyIg0KKyAgICAibVwwMDBJbnRfQ1ZUU0kyU1M2NHJyXDAwMEludF9DVlRTSTJTU3JtXDAwMEludF9DVlRTSTJTU3JyXDAwMEludF9DVlRTUzIiDQorICAgICJTRHJtXDAwMEludF9DVlRTUzJTRHJyXDAwMEludF9DVlRTUzJTSTY0cm1cMDAwSW50X0NWVFNTMlNJNjRyclwwMDBJbnRfQyINCisgICAgIlZUU1MyU0lybVwwMDBJbnRfQ1ZUU1MyU0lyclwwMDBJbnRfQ1ZUVFBEMkRRcm1cMDAwSW50X0NWVFRQRDJEUXJyXDAwMEluIg0KKyAgICAidF9DVlRUUEQyUElybVwwMDBJbnRfQ1ZUVFBEMlBJcnJcMDAwSW50X0NWVFRQUzJEUXJtXDAwMEludF9DVlRUUFMyRFFyclwwMDAiDQorICAgICJJbnRfQ1ZUVFBTMlBJcm1cMDAwSW50X0NWVFRQUzJQSXJyXDAwMEludF9DVlRUU0QyU0k2NHJtXDAwMEludF9DVlRUU0QyUyINCisgICAgIkk2NHJyXDAwMEludF9DVlRUU0QyU0lybVwwMDBJbnRfQ1ZUVFNEMlNJcnJcMDAwSW50X0NWVFRTUzJTSTY0cm1cMDAwSW50Ig0KKyAgICAiX0NWVFRTUzJTSTY0cnJcMDAwSW50X0NWVFRTUzJTSXJtXDAwMEludF9DVlRUU1MyU0lyclwwMDBJbnRfTWVtQmFycmllclwwMDAiDQorICAgICJJbnRfTWVtQmFycmllck5vU1NFXDAwMEludF9NZW1CYXJyaWVyTm9TU0U2NFwwMDBJbnRfVUNPTUlTRHJtXDAwMEludF9VQyINCisgICAgIk9NSVNEcnJcMDAwSW50X1VDT01JU1NybVwwMDBJbnRfVUNPTUlTU3JyXDAwMEludF9WQ01QU0RybVwwMDBJbnRfVkNNUFNEIg0KKyAgICAicnJcMDAwSW50X1ZDTVBTU3JtXDAwMEludF9WQ01QU1NyclwwMDBJbnRfVkNPTUlTRHJtXDAwMEludF9WQ09NSVNEcnJcMDAwIg0KKyAgICAiSW50X1ZDT01JU1NybVwwMDBJbnRfVkNPTUlTU3JyXDAwMEludF9WQ1ZURFEyUERybVwwMDBJbnRfVkNWVERRMlBEcnJcMDAwIg0KKyAgICAiSW50X1ZDVlREUTJQU3JtXDAwMEludF9WQ1ZURFEyUFNyclwwMDBJbnRfVkNWVFBEMkRRcm1cMDAwSW50X1ZDVlRQRDJEUXIiDQorICAgICJyXDAwMEludF9WQ1ZUUEQyUFNybVwwMDBJbnRfVkNWVFBEMlBTcnJcMDAwSW50X1ZDVlRQUzJEUXJtXDAwMEludF9WQ1ZUUCINCisgICAgIlMyRFFyclwwMDBJbnRfVkNWVFBTMlBEcm1cMDAwSW50X1ZDVlRQUzJQRHJyXDAwMEludF9WQ1ZUU0QyU0k2NHJtXDAwMEluIg0KKyAgICAidF9WQ1ZUU0QyU0k2NHJyXDAwMEludF9WQ1ZUU0QyU0lybVwwMDBJbnRfVkNWVFNEMlNJcnJcMDAwSW50X1ZDVlRTRDJTU3IiDQorICAgICJtXDAwMEludF9WQ1ZUU0QyU1NyclwwMDBJbnRfVkNWVFNJMlNENjRybVwwMDBJbnRfVkNWVFNJMlNENjRyclwwMDBJbnRfViINCisgICAgIkNWVFNJMlNEcm1cMDAwSW50X1ZDVlRTSTJTRHJyXDAwMEludF9WQ1ZUU0kyU1M2NHJtXDAwMEludF9WQ1ZUU0kyU1M2NHJyIg0KKyAgICAiXDAwMEludF9WQ1ZUU0kyU1NybVwwMDBJbnRfVkNWVFNJMlNTcnJcMDAwSW50X1ZDVlRTUzJTRHJtXDAwMEludF9WQ1ZUU1MiDQorICAgICIyU0RyclwwMDBJbnRfVkNWVFNTMlNJNjRybVwwMDBJbnRfVkNWVFNTMlNJNjRyclwwMDBJbnRfVkNWVFNTMlNJcm1cMDAwSSINCisgICAgIm50X1ZDVlRTUzJTSXJyXDAwMEludF9WQ1ZUVFBEMkRRcm1cMDAwSW50X1ZDVlRUUEQyRFFyclwwMDBJbnRfVkNWVFRQUzJEIg0KKyAgICAiUXJtXDAwMEludF9WQ1ZUVFBTMkRRcnJcMDAwSW50X1ZDVlRUU0QyU0k2NHJtXDAwMEludF9WQ1ZUVFNEMlNJNjRyclwwMDAiDQorICAgICJJbnRfVkNWVFRTRDJTSXJtXDAwMEludF9WQ1ZUVFNEMlNJcnJcMDAwSW50X1ZDVlRUU1MyU0k2NHJtXDAwMEludF9WQ1ZUVCINCisgICAgIlNTMlNJNjRyclwwMDBJbnRfVkNWVFRTUzJTSXJtXDAwMEludF9WQ1ZUVFNTMlNJcnJcMDAwSW50X1ZVQ09NSVNEcm1cMDAwIg0KKyAgICAiSW50X1ZVQ09NSVNEcnJcMDAwSW50X1ZVQ09NSVNTcm1cMDAwSW50X1ZVQ09NSVNTcnJcMDAwSkFFXzFcMDAwSkFFXzRcMDAwIg0KKyAgICAiSkFfMVwwMDBKQV80XDAwMEpCRV8xXDAwMEpCRV80XDAwMEpCXzFcMDAwSkJfNFwwMDBKQ1haOFwwMDBKRV8xXDAwMEpFXzQiDQorICAgICJcMDAwSkdFXzFcMDAwSkdFXzRcMDAwSkdfMVwwMDBKR180XDAwMEpMRV8xXDAwMEpMRV80XDAwMEpMXzFcMDAwSkxfNFwwMDAiDQorICAgICJKTVAzMm1cMDAwSk1QMzJyXDAwMEpNUDY0bVwwMDBKTVA2NHBjcmVsMzJcMDAwSk1QNjRyXDAwMEpNUF8xXDAwMEpNUF80XDAwMCINCisgICAgIkpORV8xXDAwMEpORV80XDAwMEpOT18xXDAwMEpOT180XDAwMEpOUF8xXDAwMEpOUF80XDAwMEpOU18xXDAwMEpOU180XDAwMCINCisgICAgIkpPXzFcMDAwSk9fNFwwMDBKUF8xXDAwMEpQXzRcMDAwSlNfMVwwMDBKU180XDAwMExBSEZcMDAwTEFSMTZybVwwMDBMQVIxIg0KKyAgICAiNnJyXDAwMExBUjMycm1cMDAwTEFSMzJyclwwMDBMQVI2NHJtXDAwMExBUjY0cnJcMDAwTENNUFhDSEcxNlwwMDBMQ01QWEMiDQorICAgICJIRzMyXDAwMExDTVBYQ0hHNjRcMDAwTENNUFhDSEc4XDAwMExDTVBYQ0hHOEJcMDAwTEREUVVybVwwMDBMRE1YQ1NSXDAwMCINCisgICAgIkxEUzE2cm1cMDAwTERTMzJybVwwMDBMRF9GMFwwMDBMRF9GMVwwMDBMRF9GMzJtXDAwMExEX0Y2NG1cMDAwTERfRjgwbVwwMDAiDQorICAgICJMRF9GcDAzMlwwMDBMRF9GcDA2NFwwMDBMRF9GcDA4MFwwMDBMRF9GcDEzMlwwMDBMRF9GcDE2NFwwMDBMRF9GcDE4MFwwMDAiDQorICAgICJMRF9GcDMybVwwMDBMRF9GcDMybTY0XDAwMExEX0ZwMzJtODBcMDAwTERfRnA2NG1cMDAwTERfRnA2NG04MFwwMDBMRF9GcCINCisgICAgIjgwbVwwMDBMRF9GcnJcMDAwTEVBMTZyXDAwMExFQTMyclwwMDBMRUE2NF8zMnJcMDAwTEVBNjRyXDAwMExFQVZFXDAwMExFIg0KKyAgICAiQVZFNjRcMDAwTEVTMTZybVwwMDBMRVMzMnJtXDAwMExGRU5DRVwwMDBMRlMxNnJtXDAwMExGUzMycm1cMDAwTEZTNjRybVwwMDAiDQorICAgICJMR0RUbVwwMDBMR1MxNnJtXDAwMExHUzMycm1cMDAwTEdTNjRybVwwMDBMSURUbVwwMDBMTERUMTZtXDAwMExMRFQxNnJcMDAwIg0KKyAgICAiTE1TVzE2bVwwMDBMTVNXMTZyXDAwMExPQ0tfQUREMTZtaVwwMDBMT0NLX0FERDE2bWk4XDAwMExPQ0tfQUREMTZtclwwMDAiDQorICAgICJMT0NLX0FERDMybWlcMDAwTE9DS19BREQzMm1pOFwwMDBMT0NLX0FERDMybXJcMDAwTE9DS19BREQ2NG1pMzJcMDAwTE9DSyINCisgICAgIl9BREQ2NG1pOFwwMDBMT0NLX0FERDY0bXJcMDAwTE9DS19BREQ4bWlcMDAwTE9DS19BREQ4bXJcMDAwTE9DS19ERUMxNm1cMDAwIg0KKyAgICAiTE9DS19ERUMzMm1cMDAwTE9DS19ERUM2NG1cMDAwTE9DS19ERUM4bVwwMDBMT0NLX0lOQzE2bVwwMDBMT0NLX0lOQzMybVwwMDAiDQorICAgICJMT0NLX0lOQzY0bVwwMDBMT0NLX0lOQzhtXDAwMExPQ0tfUFJFRklYXDAwMExPQ0tfU1VCMTZtaVwwMDBMT0NLX1NVQjE2bSINCisgICAgImk4XDAwMExPQ0tfU1VCMTZtclwwMDBMT0NLX1NVQjMybWlcMDAwTE9DS19TVUIzMm1pOFwwMDBMT0NLX1NVQjMybXJcMDAwIg0KKyAgICAiTE9DS19TVUI2NG1pMzJcMDAwTE9DS19TVUI2NG1pOFwwMDBMT0NLX1NVQjY0bXJcMDAwTE9DS19TVUI4bWlcMDAwTE9DS18iDQorICAgICJTVUI4bXJcMDAwTE9EU0JcMDAwTE9EU0RcMDAwTE9EU1FcMDAwTE9EU1dcMDAwTE9PUFwwMDBMT09QRVwwMDBMT09QTkVcMDAwIg0KKyAgICAiTFJFVFwwMDBMUkVUSVwwMDBMU0wxNnJtXDAwMExTTDE2cnJcMDAwTFNMMzJybVwwMDBMU0wzMnJyXDAwMExTTDY0cm1cMDAwIg0KKyAgICAiTFNMNjRyclwwMDBMU1MxNnJtXDAwMExTUzMycm1cMDAwTFNTNjRybVwwMDBMVFJtXDAwMExUUnJcMDAwTFhBREQxNlwwMDAiDQorICAgICJMWEFERDMyXDAwMExYQURENjRcMDAwTFhBREQ4XDAwME1BU0tNT1ZEUVVcMDAwTUFTS01PVkRRVTY0XDAwME1BWFBEcm1cMDAwIg0KKyAgICAiTUFYUERybV9JbnRcMDAwTUFYUERyclwwMDBNQVhQRHJyX0ludFwwMDBNQVhQU3JtXDAwME1BWFBTcm1fSW50XDAwME1BWFAiDQorICAgICJTcnJcMDAwTUFYUFNycl9JbnRcMDAwTUFYU0RybVwwMDBNQVhTRHJtX0ludFwwMDBNQVhTRHJyXDAwME1BWFNEcnJfSW50XDAwMCINCisgICAgIk1BWFNTcm1cMDAwTUFYU1NybV9JbnRcMDAwTUFYU1NyclwwMDBNQVhTU3JyX0ludFwwMDBNRkVOQ0VcMDAwTUlOR1dfQUxMIg0KKyAgICAiT0NBXDAwME1JTlBEcm1cMDAwTUlOUERybV9JbnRcMDAwTUlOUERyclwwMDBNSU5QRHJyX0ludFwwMDBNSU5QU3JtXDAwME0iDQorICAgICJJTlBTcm1fSW50XDAwME1JTlBTcnJcMDAwTUlOUFNycl9JbnRcMDAwTUlOU0RybVwwMDBNSU5TRHJtX0ludFwwMDBNSU5TRCINCisgICAgInJyXDAwME1JTlNEcnJfSW50XDAwME1JTlNTcm1cMDAwTUlOU1NybV9JbnRcMDAwTUlOU1NyclwwMDBNSU5TU3JyX0ludFwwMDAiDQorICAgICJNTVhfQ1ZUUEQyUElybVwwMDBNTVhfQ1ZUUEQyUElyclwwMDBNTVhfQ1ZUUEkyUERybVwwMDBNTVhfQ1ZUUEkyUERyclwwMDAiDQorICAgICJNTVhfQ1ZUUEkyUFNybVwwMDBNTVhfQ1ZUUEkyUFNyclwwMDBNTVhfQ1ZUUFMyUElybVwwMDBNTVhfQ1ZUUFMyUElyclwwMDAiDQorICAgICJNTVhfQ1ZUVFBEMlBJcm1cMDAwTU1YX0NWVFRQRDJQSXJyXDAwME1NWF9DVlRUUFMyUElybVwwMDBNTVhfQ1ZUVFBTMlBJciINCisgICAgInJcMDAwTU1YX0VNTVNcMDAwTU1YX0ZFTU1TXDAwME1NWF9NQVNLTU9WUVwwMDBNTVhfTUFTS01PVlE2NFwwMDBNTVhfTU9WIg0KKyAgICAiRDY0ZnJvbTY0cnJcMDAwTU1YX01PVkQ2NGdyclwwMDBNTVhfTU9WRDY0bXJcMDAwTU1YX01PVkQ2NHJtXDAwME1NWF9NT1YiDQorICAgICJENjRyclwwMDBNTVhfTU9WRDY0cnJ2MTY0XDAwME1NWF9NT1ZENjR0bzY0cnJcMDAwTU1YX01PVkRRMlFyclwwMDBNTVhfTSINCisgICAgIk9WRlI2NDJRcnJcMDAwTU1YX01PVk5UUW1yXDAwME1NWF9NT1ZRMkRRcnJcMDAwTU1YX01PVlEyRlI2NHJyXDAwME1NWF9NIg0KKyAgICAiT1ZRNjRtclwwMDBNTVhfTU9WUTY0cm1cMDAwTU1YX01PVlE2NHJyXDAwME1NWF9NT1ZaREkyUERJcm1cMDAwTU1YX01PVloiDQorICAgICJESTJQRElyclwwMDBNTVhfUEFDS1NTRFdybVwwMDBNTVhfUEFDS1NTRFdyclwwMDBNTVhfUEFDS1NTV0JybVwwMDBNTVhfUCINCisgICAgIkFDS1NTV0JyclwwMDBNTVhfUEFDS1VTV0JybVwwMDBNTVhfUEFDS1VTV0JyclwwMDBNTVhfUEFEREJybVwwMDBNTVhfUEFEIg0KKyAgICAiREJyclwwMDBNTVhfUEFERERybVwwMDBNTVhfUEFERERyclwwMDBNTVhfUEFERFFybVwwMDBNTVhfUEFERFFyclwwMDBNTVgiDQorICAgICJfUEFERFNCcm1cMDAwTU1YX1BBRERTQnJyXDAwME1NWF9QQUREU1dybVwwMDBNTVhfUEFERFNXcnJcMDAwTU1YX1BBRERVUyINCisgICAgIkJybVwwMDBNTVhfUEFERFVTQnJyXDAwME1NWF9QQUREVVNXcm1cMDAwTU1YX1BBRERVU1dyclwwMDBNTVhfUEFERFdybVwwMDAiDQorICAgICJNTVhfUEFERFdyclwwMDBNTVhfUEFORE5ybVwwMDBNTVhfUEFORE5yclwwMDBNTVhfUEFORHJtXDAwME1NWF9QQU5EcnJcMDAwIg0KKyAgICAiTU1YX1BBVkdCcm1cMDAwTU1YX1BBVkdCcnJcMDAwTU1YX1BBVkdXcm1cMDAwTU1YX1BBVkdXcnJcMDAwTU1YX1BDTVBFUUIiDQorICAgICJybVwwMDBNTVhfUENNUEVRQnJyXDAwME1NWF9QQ01QRVFEcm1cMDAwTU1YX1BDTVBFUURyclwwMDBNTVhfUENNUEVRV3JtXDAwMCINCisgICAgIk1NWF9QQ01QRVFXcnJcMDAwTU1YX1BDTVBHVEJybVwwMDBNTVhfUENNUEdUQnJyXDAwME1NWF9QQ01QR1REcm1cMDAwTU1YIg0KKyAgICAiX1BDTVBHVERyclwwMDBNTVhfUENNUEdUV3JtXDAwME1NWF9QQ01QR1RXcnJcMDAwTU1YX1BFWFRSV3JpXDAwME1NWF9QSU4iDQorICAgICJTUldybWlcMDAwTU1YX1BJTlNSV3JyaVwwMDBNTVhfUE1BRERXRHJtXDAwME1NWF9QTUFERFdEcnJcMDAwTU1YX1BNQVhTVyINCisgICAgInJtXDAwME1NWF9QTUFYU1dyclwwMDBNTVhfUE1BWFVCcm1cMDAwTU1YX1BNQVhVQnJyXDAwME1NWF9QTUlOU1dybVwwMDBNIg0KKyAgICAiTVhfUE1JTlNXcnJcMDAwTU1YX1BNSU5VQnJtXDAwME1NWF9QTUlOVUJyclwwMDBNTVhfUE1PVk1TS0JyclwwMDBNTVhfUE0iDQorICAgICJVTEhVV3JtXDAwME1NWF9QTVVMSFVXcnJcMDAwTU1YX1BNVUxIV3JtXDAwME1NWF9QTVVMSFdyclwwMDBNTVhfUE1VTExXciINCisgICAgIm1cMDAwTU1YX1BNVUxMV3JyXDAwME1NWF9QTVVMVURRcm1cMDAwTU1YX1BNVUxVRFFyclwwMDBNTVhfUE9Scm1cMDAwTU1YIg0KKyAgICAiX1BPUnJyXDAwME1NWF9QU0FEQldybVwwMDBNTVhfUFNBREJXcnJcMDAwTU1YX1BTSFVGV21pXDAwME1NWF9QU0hVRldyaVwwMDAiDQorICAgICJNTVhfUFNMTERyaVwwMDBNTVhfUFNMTERybVwwMDBNTVhfUFNMTERyclwwMDBNTVhfUFNMTFFyaVwwMDBNTVhfUFNMTFFybSINCisgICAgIlwwMDBNTVhfUFNMTFFyclwwMDBNTVhfUFNMTFdyaVwwMDBNTVhfUFNMTFdybVwwMDBNTVhfUFNMTFdyclwwMDBNTVhfUFNSIg0KKyAgICAiQURyaVwwMDBNTVhfUFNSQURybVwwMDBNTVhfUFNSQURyclwwMDBNTVhfUFNSQVdyaVwwMDBNTVhfUFNSQVdybVwwMDBNTVgiDQorICAgICJfUFNSQVdyclwwMDBNTVhfUFNSTERyaVwwMDBNTVhfUFNSTERybVwwMDBNTVhfUFNSTERyclwwMDBNTVhfUFNSTFFyaVwwMDAiDQorICAgICJNTVhfUFNSTFFybVwwMDBNTVhfUFNSTFFyclwwMDBNTVhfUFNSTFdyaVwwMDBNTVhfUFNSTFdybVwwMDBNTVhfUFNSTFdyciINCisgICAgIlwwMDBNTVhfUFNVQkJybVwwMDBNTVhfUFNVQkJyclwwMDBNTVhfUFNVQkRybVwwMDBNTVhfUFNVQkRyclwwMDBNTVhfUFNVIg0KKyAgICAiQlFybVwwMDBNTVhfUFNVQlFyclwwMDBNTVhfUFNVQlNCcm1cMDAwTU1YX1BTVUJTQnJyXDAwME1NWF9QU1VCU1dybVwwMDAiDQorICAgICJNTVhfUFNVQlNXcnJcMDAwTU1YX1BTVUJVU0JybVwwMDBNTVhfUFNVQlVTQnJyXDAwME1NWF9QU1VCVVNXcm1cMDAwTU1YXyINCisgICAgIlBTVUJVU1dyclwwMDBNTVhfUFNVQldybVwwMDBNTVhfUFNVQldyclwwMDBNTVhfUFVOUENLSEJXcm1cMDAwTU1YX1BVTlBDIg0KKyAgICAiS0hCV3JyXDAwME1NWF9QVU5QQ0tIRFFybVwwMDBNTVhfUFVOUENLSERRcnJcMDAwTU1YX1BVTlBDS0hXRHJtXDAwME1NWF8iDQorICAgICJQVU5QQ0tIV0RyclwwMDBNTVhfUFVOUENLTEJXcm1cMDAwTU1YX1BVTlBDS0xCV3JyXDAwME1NWF9QVU5QQ0tMRFFybVwwMDAiDQorICAgICJNTVhfUFVOUENLTERRcnJcMDAwTU1YX1BVTlBDS0xXRHJtXDAwME1NWF9QVU5QQ0tMV0RyclwwMDBNTVhfUFhPUnJtXDAwMCINCisgICAgIk1NWF9QWE9ScnJcMDAwTU1YX1ZfU0VUMFwwMDBNTVhfVl9TRVRBTExPTkVTXDAwME1PTklUT1JcMDAwTU9WMTZhbzE2XDAwMCINCisgICAgIk1PVjE2bWlcMDAwTU9WMTZtclwwMDBNT1YxNm1zXDAwME1PVjE2bzE2YVwwMDBNT1YxNnIwXDAwME1PVjE2cmlcMDAwTU9WIg0KKyAgICAiMTZybVwwMDBNT1YxNnJyXDAwME1PVjE2cnJfUkVWXDAwME1PVjE2cnNcMDAwTU9WMTZzbVwwMDBNT1YxNnNyXDAwME1PVjMiDQorICAgICIyYW8zMlwwMDBNT1YzMmNyXDAwME1PVjMyZHJcMDAwTU9WMzJtaVwwMDBNT1YzMm1yXDAwME1PVjMybXJfVENcMDAwTU9WMyINCisgICAgIjJtc1wwMDBNT1YzMm8zMmFcMDAwTU9WMzJyMFwwMDBNT1YzMnJjXDAwME1PVjMycmRcMDAwTU9WMzJyaVwwMDBNT1YzMnJtIg0KKyAgICAiXDAwME1PVjMycm1fVENcMDAwTU9WMzJyclwwMDBNT1YzMnJyX1JFVlwwMDBNT1YzMnJyX1RDXDAwME1PVjMycnNcMDAwTU8iDQorICAgICJWMzJzbVwwMDBNT1YzMnNyXDAwME1PVjY0RlNybVwwMDBNT1Y2NEdTcm1cMDAwTU9WNjRhbzY0XDAwME1PVjY0YW84XDAwMCINCisgICAgIk1PVjY0Y3JcMDAwTU9WNjRkclwwMDBNT1Y2NG1pMzJcMDAwTU9WNjRtclwwMDBNT1Y2NG1yX1RDXDAwME1PVjY0bXNcMDAwIg0KKyAgICAiTU9WNjRvNjRhXDAwME1PVjY0bzhhXDAwME1PVjY0cjBcMDAwTU9WNjRyY1wwMDBNT1Y2NHJkXDAwME1PVjY0cmlcMDAwTU8iDQorICAgICJWNjRyaTMyXDAwME1PVjY0cmk2NGkzMlwwMDBNT1Y2NHJpX2FsdFwwMDBNT1Y2NHJtXDAwME1PVjY0cm1fVENcMDAwTU9WNiINCisgICAgIjRyclwwMDBNT1Y2NHJyX1JFVlwwMDBNT1Y2NHJyX1RDXDAwME1PVjY0cnNcMDAwTU9WNjRzbVwwMDBNT1Y2NHNyXDAwME1PIg0KKyAgICAiVjY0dG9QUUlyclwwMDBNT1Y2NHRvU0RybVwwMDBNT1Y2NHRvU0RyclwwMDBNT1Y4YW84XDAwME1PVjhtaVwwMDBNT1Y4bXIiDQorICAgICJcMDAwTU9WOG1yX05PUkVYXDAwME1PVjhvOGFcMDAwTU9WOHIwXDAwME1PVjhyaVwwMDBNT1Y4cm1cMDAwTU9WOHJtX05PUiINCisgICAgIkVYXDAwME1PVjhyclwwMDBNT1Y4cnJfTk9SRVhcMDAwTU9WOHJyX1JFVlwwMDBNT1ZBUERtclwwMDBNT1ZBUERybVwwMDBNIg0KKyAgICAiT1ZBUERyclwwMDBNT1ZBUFNtclwwMDBNT1ZBUFNybVwwMDBNT1ZBUFNyclwwMDBNT1ZERFVQcm1cMDAwTU9WRERVUHJyXDAwMCINCisgICAgIk1PVkRJMlBESXJtXDAwME1PVkRJMlBESXJyXDAwME1PVkRJMlNTcm1cMDAwTU9WREkyU1NyclwwMDBNT1ZEUUFtclwwMDBNIg0KKyAgICAiT1ZEUUFybVwwMDBNT1ZEUUFyclwwMDBNT1ZEUVVtclwwMDBNT1ZEUVVtcl9JbnRcMDAwTU9WRFFVcm1cMDAwTU9WRFFVcm0iDQorICAgICJfSW50XDAwME1PVkhMUFNyclwwMDBNT1ZIUERtclwwMDBNT1ZIUERybVwwMDBNT1ZIUFNtclwwMDBNT1ZIUFNybVwwMDBNTyINCisgICAgIlZMSFBTcnJcMDAwTU9WTFBEbXJcMDAwTU9WTFBEcm1cMDAwTU9WTFBTbXJcMDAwTU9WTFBTcm1cMDAwTU9WTFExMjhtclwwMDAiDQorICAgICJNT1ZNU0tQRHJyXDAwME1PVk1TS1BTcnJcMDAwTU9WTlREUUFybVwwMDBNT1ZOVERRXzY0bXJcMDAwTU9WTlREUW1yXDAwMCINCisgICAgIk1PVk5URFFtcl9JbnRcMDAwTU9WTlRJXzY0bXJcMDAwTU9WTlRJbXJcMDAwTU9WTlRJbXJfSW50XDAwME1PVk5UUERtclwwMDAiDQorICAgICJNT1ZOVFBEbXJfSW50XDAwME1PVk5UUFNtclwwMDBNT1ZOVFBTbXJfSW50XDAwME1PVlBDMzJyXDAwME1PVlBESTJESW1yXDAwMCINCisgICAgIk1PVlBESTJESXJyXDAwME1PVlBRSTJRSW1yXDAwME1PVlBRSXRvNjRyclwwMDBNT1ZRSTJQUUlybVwwMDBNT1ZReHJ4clwwMDAiDQorICAgICJNT1ZTQlwwMDBNT1ZTRFwwMDBNT1ZTRG1yXDAwME1PVlNEcm1cMDAwTU9WU0RyclwwMDBNT1ZTRHRvNjRtclwwMDBNT1ZTRCINCisgICAgInRvNjRyclwwMDBNT1ZTSERVUHJtXDAwME1PVlNIRFVQcnJcMDAwTU9WU0xEVVBybVwwMDBNT1ZTTERVUHJyXDAwME1PVlNRIg0KKyAgICAiXDAwME1PVlNTMkRJbXJcMDAwTU9WU1MyRElyclwwMDBNT1ZTU21yXDAwME1PVlNTcm1cMDAwTU9WU1NyclwwMDBNT1ZTV1wwMDAiDQorICAgICJNT1ZTWDE2cm04XDAwME1PVlNYMTZybThXXDAwME1PVlNYMTZycjhcMDAwTU9WU1gxNnJyOFdcMDAwTU9WU1gzMnJtMTZcMDAwIg0KKyAgICAiTU9WU1gzMnJtOFwwMDBNT1ZTWDMycnIxNlwwMDBNT1ZTWDMycnI4XDAwME1PVlNYNjRybTE2XDAwME1PVlNYNjRybTMyXDAwMCINCisgICAgIk1PVlNYNjRybThcMDAwTU9WU1g2NHJyMTZcMDAwTU9WU1g2NHJyMzJcMDAwTU9WU1g2NHJyOFwwMDBNT1ZVUERtclwwMDBNIg0KKyAgICAiT1ZVUERtcl9JbnRcMDAwTU9WVVBEcm1cMDAwTU9WVVBEcm1fSW50XDAwME1PVlVQRHJyXDAwME1PVlVQU21yXDAwME1PVlUiDQorICAgICJQU21yX0ludFwwMDBNT1ZVUFNybVwwMDBNT1ZVUFNybV9JbnRcMDAwTU9WVVBTcnJcMDAwTU9WWkRJMlBESXJtXDAwME1PViINCisgICAgIlpESTJQRElyclwwMDBNT1ZaUFFJTG8yUFFJcm1cMDAwTU9WWlBRSUxvMlBRSXJyXDAwME1PVlpRSTJQUUlybVwwMDBNT1ZaIg0KKyAgICAiUUkyUFFJcnJcMDAwTU9WWlgxNnJtOFwwMDBNT1ZaWDE2cm04V1wwMDBNT1ZaWDE2cnI4XDAwME1PVlpYMTZycjhXXDAwME0iDQorICAgICJPVlpYMzJfTk9SRVhybThcMDAwTU9WWlgzMl9OT1JFWHJyOFwwMDBNT1ZaWDMycm0xNlwwMDBNT1ZaWDMycm04XDAwME1PViINCisgICAgIlpYMzJycjE2XDAwME1PVlpYMzJycjhcMDAwTU9WWlg2NHJtMTZcMDAwTU9WWlg2NHJtMTZfUVwwMDBNT1ZaWDY0cm0zMlwwMDAiDQorICAgICJNT1ZaWDY0cm04XDAwME1PVlpYNjRybThfUVwwMDBNT1ZaWDY0cnIxNlwwMDBNT1ZaWDY0cnIxNl9RXDAwME1PVlpYNjRyciINCisgICAgIjMyXDAwME1PVlpYNjRycjhcMDAwTU9WWlg2NHJyOF9RXDAwME1PVl9GcDMyMzJcMDAwTU9WX0ZwMzI2NFwwMDBNT1ZfRnAzIg0KKyAgICAiMjgwXDAwME1PVl9GcDY0MzJcMDAwTU9WX0ZwNjQ2NFwwMDBNT1ZfRnA2NDgwXDAwME1PVl9GcDgwMzJcMDAwTU9WX0ZwODAiDQorICAgICI2NFwwMDBNT1ZfRnA4MDgwXDAwME1QU0FEQldybWlcMDAwTVBTQURCV3JyaVwwMDBNVUwxNm1cMDAwTVVMMTZyXDAwME1VTCINCisgICAgIjMybVwwMDBNVUwzMnJcMDAwTVVMNjRtXDAwME1VTDY0clwwMDBNVUw4bVwwMDBNVUw4clwwMDBNVUxQRHJtXDAwME1VTFBEIg0KKyAgICAicnJcMDAwTVVMUFNybVwwMDBNVUxQU3JyXDAwME1VTFNEcm1cMDAwTVVMU0RybV9JbnRcMDAwTVVMU0RyclwwMDBNVUxTRHIiDQorICAgICJyX0ludFwwMDBNVUxTU3JtXDAwME1VTFNTcm1fSW50XDAwME1VTFNTcnJcMDAwTVVMU1Nycl9JbnRcMDAwTVVMX0YzMm1cMDAwIg0KKyAgICAiTVVMX0Y2NG1cMDAwTVVMX0ZJMTZtXDAwME1VTF9GSTMybVwwMDBNVUxfRlByU1QwXDAwME1VTF9GU1QwclwwMDBNVUxfRnAiDQorICAgICIzMlwwMDBNVUxfRnAzMm1cMDAwTVVMX0ZwNjRcMDAwTVVMX0ZwNjRtXDAwME1VTF9GcDY0bTMyXDAwME1VTF9GcDgwXDAwMCINCisgICAgIk1VTF9GcDgwbTMyXDAwME1VTF9GcDgwbTY0XDAwME1VTF9GcEkxNm0zMlwwMDBNVUxfRnBJMTZtNjRcMDAwTVVMX0ZwSTE2Ig0KKyAgICAibTgwXDAwME1VTF9GcEkzMm0zMlwwMDBNVUxfRnBJMzJtNjRcMDAwTVVMX0ZwSTMybTgwXDAwME1VTF9GclNUMFwwMDBNV0EiDQorICAgICJJVFwwMDBORUcxNm1cMDAwTkVHMTZyXDAwME5FRzMybVwwMDBORUczMnJcMDAwTkVHNjRtXDAwME5FRzY0clwwMDBORUc4bSINCisgICAgIlwwMDBORUc4clwwMDBOT09QXDAwME5PT1BMXDAwME5PT1BXXDAwME5PVDE2bVwwMDBOT1QxNnJcMDAwTk9UMzJtXDAwME5PIg0KKyAgICAiVDMyclwwMDBOT1Q2NG1cMDAwTk9UNjRyXDAwME5PVDhtXDAwME5PVDhyXDAwME9SMTZpMTZcMDAwT1IxNm1pXDAwME9SMTYiDQorICAgICJtaThcMDAwT1IxNm1yXDAwME9SMTZyaVwwMDBPUjE2cmk4XDAwME9SMTZybVwwMDBPUjE2cnJcMDAwT1IxNnJyX1JFVlwwMDAiDQorICAgICJPUjMyaTMyXDAwME9SMzJtaVwwMDBPUjMybWk4XDAwME9SMzJtclwwMDBPUjMycmlcMDAwT1IzMnJpOFwwMDBPUjMycm1cMDAwIg0KKyAgICAiT1IzMnJyXDAwME9SMzJycl9SRVZcMDAwT1I2NGkzMlwwMDBPUjY0bWkzMlwwMDBPUjY0bWk4XDAwME9SNjRtclwwMDBPUjYiDQorICAgICI0cmkzMlwwMDBPUjY0cmk4XDAwME9SNjRybVwwMDBPUjY0cnJcMDAwT1I2NHJyX1JFVlwwMDBPUjhpOFwwMDBPUjhtaVwwMDAiDQorICAgICJPUjhtclwwMDBPUjhyaVwwMDBPUjhybVwwMDBPUjhyclwwMDBPUjhycl9SRVZcMDAwT1JQRHJtXDAwME9SUERyclwwMDBPUiINCisgICAgIlBTcm1cMDAwT1JQU3JyXDAwME9VVDE2aXJcMDAwT1VUMTZyclwwMDBPVVQzMmlyXDAwME9VVDMycnJcMDAwT1VUOGlyXDAwMCINCisgICAgIk9VVDhyclwwMDBPVVRTQlwwMDBPVVRTRFwwMDBPVVRTV1wwMDBQQUJTQnJtMTI4XDAwMFBBQlNCcm02NFwwMDBQQUJTQnJyIg0KKyAgICAiMTI4XDAwMFBBQlNCcnI2NFwwMDBQQUJTRHJtMTI4XDAwMFBBQlNEcm02NFwwMDBQQUJTRHJyMTI4XDAwMFBBQlNEcnI2NFwwMDAiDQorICAgICJQQUJTV3JtMTI4XDAwMFBBQlNXcm02NFwwMDBQQUJTV3JyMTI4XDAwMFBBQlNXcnI2NFwwMDBQQUNLU1NEV3JtXDAwMFBBQyINCisgICAgIktTU0RXcnJcMDAwUEFDS1NTV0JybVwwMDBQQUNLU1NXQnJyXDAwMFBBQ0tVU0RXcm1cMDAwUEFDS1VTRFdyclwwMDBQQUNLIg0KKyAgICAiVVNXQnJtXDAwMFBBQ0tVU1dCcnJcMDAwUEFEREJybVwwMDBQQUREQnJyXDAwMFBBREREcm1cMDAwUEFERERyclwwMDBQQUQiDQorICAgICJEUXJtXDAwMFBBRERRcnJcMDAwUEFERFNCcm1cMDAwUEFERFNCcnJcMDAwUEFERFNXcm1cMDAwUEFERFNXcnJcMDAwUEFERCINCisgICAgIlVTQnJtXDAwMFBBRERVU0JyclwwMDBQQUREVVNXcm1cMDAwUEFERFVTV3JyXDAwMFBBRERXcm1cMDAwUEFERFdyclwwMDBQIg0KKyAgICAiQUxJR05SMTI4cm1cMDAwUEFMSUdOUjEyOHJyXDAwMFBBTElHTlI2NHJtXDAwMFBBTElHTlI2NHJyXDAwMFBBTkROcm1cMDAwIg0KKyAgICAiUEFORE5yclwwMDBQQU5Ecm1cMDAwUEFORHJyXDAwMFBBVVNFXDAwMFBBVkdCcm1cMDAwUEFWR0JyclwwMDBQQVZHV3JtXDAwMCINCisgICAgIlBBVkdXcnJcMDAwUEJMRU5EVkJybTBcMDAwUEJMRU5EVkJycjBcMDAwUEJMRU5EV3JtaVwwMDBQQkxFTkRXcnJpXDAwMFBDIg0KKyAgICAiTVBFUUJybVwwMDBQQ01QRVFCcnJcMDAwUENNUEVRRHJtXDAwMFBDTVBFUURyclwwMDBQQ01QRVFRcm1cMDAwUENNUEVRUXIiDQorICAgICJyXDAwMFBDTVBFUVdybVwwMDBQQ01QRVFXcnJcMDAwUENNUEVTVFJJQXJtXDAwMFBDTVBFU1RSSUFyclwwMDBQQ01QRVNUUiINCisgICAgIklDcm1cMDAwUENNUEVTVFJJQ3JyXDAwMFBDTVBFU1RSSU9ybVwwMDBQQ01QRVNUUklPcnJcMDAwUENNUEVTVFJJU3JtXDAwMCINCisgICAgIlBDTVBFU1RSSVNyclwwMDBQQ01QRVNUUklacm1cMDAwUENNUEVTVFJJWnJyXDAwMFBDTVBFU1RSSXJtXDAwMFBDTVBFU1RSIg0KKyAgICAiSXJyXDAwMFBDTVBFU1RSTTEyOE1FTVwwMDBQQ01QRVNUUk0xMjhSRUdcMDAwUENNUEVTVFJNMTI4cm1cMDAwUENNUEVTVFIiDQorICAgICJNMTI4cnJcMDAwUENNUEdUQnJtXDAwMFBDTVBHVEJyclwwMDBQQ01QR1REcm1cMDAwUENNUEdURHJyXDAwMFBDTVBHVFFybSINCisgICAgIlwwMDBQQ01QR1RRcnJcMDAwUENNUEdUV3JtXDAwMFBDTVBHVFdyclwwMDBQQ01QSVNUUklBcm1cMDAwUENNUElTVFJJQXJyIg0KKyAgICAiXDAwMFBDTVBJU1RSSUNybVwwMDBQQ01QSVNUUklDcnJcMDAwUENNUElTVFJJT3JtXDAwMFBDTVBJU1RSSU9yclwwMDBQQ00iDQorICAgICJQSVNUUklTcm1cMDAwUENNUElTVFJJU3JyXDAwMFBDTVBJU1RSSVpybVwwMDBQQ01QSVNUUklacnJcMDAwUENNUElTVFJJciINCisgICAgIm1cMDAwUENNUElTVFJJcnJcMDAwUENNUElTVFJNMTI4TUVNXDAwMFBDTVBJU1RSTTEyOFJFR1wwMDBQQ01QSVNUUk0xMjhyIg0KKyAgICAibVwwMDBQQ01QSVNUUk0xMjhyclwwMDBQRVhUUkJtclwwMDBQRVhUUkJyclwwMDBQRVhUUkRtclwwMDBQRVhUUkRyclwwMDAiDQorICAgICJQRVhUUlFtclwwMDBQRVhUUlFyclwwMDBQRVhUUldtclwwMDBQRVhUUldyaVwwMDBQSEFERERybTEyOFwwMDBQSEFERERybSINCisgICAgIjY0XDAwMFBIQURERHJyMTI4XDAwMFBIQURERHJyNjRcMDAwUEhBRERTV3JtMTI4XDAwMFBIQUREU1dybTY0XDAwMFBIQUREIg0KKyAgICAiU1dycjEyOFwwMDBQSEFERFNXcnI2NFwwMDBQSEFERFdybTEyOFwwMDBQSEFERFdybTY0XDAwMFBIQUREV3JyMTI4XDAwMFAiDQorICAgICJIQUREV3JyNjRcMDAwUEhNSU5QT1NVV3JtMTI4XDAwMFBITUlOUE9TVVdycjEyOFwwMDBQSFNVQkRybTEyOFwwMDBQSFNVQiINCisgICAgIkRybTY0XDAwMFBIU1VCRHJyMTI4XDAwMFBIU1VCRHJyNjRcMDAwUEhTVUJTV3JtMTI4XDAwMFBIU1VCU1dybTY0XDAwMFBIIg0KKyAgICAiU1VCU1dycjEyOFwwMDBQSFNVQlNXcnI2NFwwMDBQSFNVQldybTEyOFwwMDBQSFNVQldybTY0XDAwMFBIU1VCV3JyMTI4XDAwMCINCisgICAgIlBIU1VCV3JyNjRcMDAwUElOU1JCcm1cMDAwUElOU1JCcnJcMDAwUElOU1JEcm1cMDAwUElOU1JEcnJcMDAwUElOU1JRcm1cMDAwIg0KKyAgICAiUElOU1JRcnJcMDAwUElOU1JXcm1pXDAwMFBJTlNSV3JyaVwwMDBQTUFERFVCU1dybTEyOFwwMDBQTUFERFVCU1dybTY0XDAwMCINCisgICAgIlBNQUREVUJTV3JyMTI4XDAwMFBNQUREVUJTV3JyNjRcMDAwUE1BRERXRHJtXDAwMFBNQUREV0RyclwwMDBQTUFYU0JybVwwMDAiDQorICAgICJQTUFYU0JyclwwMDBQTUFYU0RybVwwMDBQTUFYU0RyclwwMDBQTUFYU1dybVwwMDBQTUFYU1dyclwwMDBQTUFYVUJybVwwMDAiDQorICAgICJQTUFYVUJyclwwMDBQTUFYVURybVwwMDBQTUFYVURyclwwMDBQTUFYVVdybVwwMDBQTUFYVVdyclwwMDBQTUlOU0JybVwwMDAiDQorICAgICJQTUlOU0JyclwwMDBQTUlOU0RybVwwMDBQTUlOU0RyclwwMDBQTUlOU1dybVwwMDBQTUlOU1dyclwwMDBQTUlOVUJybVwwMDAiDQorICAgICJQTUlOVUJyclwwMDBQTUlOVURybVwwMDBQTUlOVURyclwwMDBQTUlOVVdybVwwMDBQTUlOVVdyclwwMDBQTU9WTVNLQnJyXDAwMCINCisgICAgIlBNT1ZTWEJEcm1cMDAwUE1PVlNYQkRyclwwMDBQTU9WU1hCUXJtXDAwMFBNT1ZTWEJRcnJcMDAwUE1PVlNYQldybVwwMDBQIg0KKyAgICAiTU9WU1hCV3JyXDAwMFBNT1ZTWERRcm1cMDAwUE1PVlNYRFFyclwwMDBQTU9WU1hXRHJtXDAwMFBNT1ZTWFdEcnJcMDAwUE0iDQorICAgICJPVlNYV1FybVwwMDBQTU9WU1hXUXJyXDAwMFBNT1ZaWEJEcm1cMDAwUE1PVlpYQkRyclwwMDBQTU9WWlhCUXJtXDAwMFBNTyINCisgICAgIlZaWEJRcnJcMDAwUE1PVlpYQldybVwwMDBQTU9WWlhCV3JyXDAwMFBNT1ZaWERRcm1cMDAwUE1PVlpYRFFyclwwMDBQTU9WIg0KKyAgICAiWlhXRHJtXDAwMFBNT1ZaWFdEcnJcMDAwUE1PVlpYV1FybVwwMDBQTU9WWlhXUXJyXDAwMFBNVUxEUXJtXDAwMFBNVUxEUXIiDQorICAgICJyXDAwMFBNVUxIUlNXcm0xMjhcMDAwUE1VTEhSU1dybTY0XDAwMFBNVUxIUlNXcnIxMjhcMDAwUE1VTEhSU1dycjY0XDAwMCINCisgICAgIlBNVUxIVVdybVwwMDBQTVVMSFVXcnJcMDAwUE1VTEhXcm1cMDAwUE1VTEhXcnJcMDAwUE1VTExEcm1cMDAwUE1VTExEcnJcMDAwIg0KKyAgICAiUE1VTExXcm1cMDAwUE1VTExXcnJcMDAwUE1VTFVEUXJtXDAwMFBNVUxVRFFyclwwMDBQT1AxNnJcMDAwUE9QMTZybW1cMDAwIg0KKyAgICAiUE9QMTZybXJcMDAwUE9QMzJyXDAwMFBPUDMycm1tXDAwMFBPUDMycm1yXDAwMFBPUDY0clwwMDBQT1A2NHJtbVwwMDBQT1AiDQorICAgICI2NHJtclwwMDBQT1BBMzJcMDAwUE9QQ05UMTZybVwwMDBQT1BDTlQxNnJyXDAwMFBPUENOVDMycm1cMDAwUE9QQ05UMzJyciINCisgICAgIlwwMDBQT1BDTlQ2NHJtXDAwMFBPUENOVDY0cnJcMDAwUE9QRjE2XDAwMFBPUEYzMlwwMDBQT1BGNjRcMDAwUE9QRlMxNlwwMDAiDQorICAgICJQT1BGUzMyXDAwMFBPUEZTNjRcMDAwUE9QR1MxNlwwMDBQT1BHUzMyXDAwMFBPUEdTNjRcMDAwUE9Scm1cMDAwUE9ScnJcMDAwIg0KKyAgICAiUFJFRkVUQ0hOVEFcMDAwUFJFRkVUQ0hUMFwwMDBQUkVGRVRDSFQxXDAwMFBSRUZFVENIVDJcMDAwUFNBREJXcm1cMDAwUFMiDQorICAgICJBREJXcnJcMDAwUFNIVUZCcm0xMjhcMDAwUFNIVUZCcm02NFwwMDBQU0hVRkJycjEyOFwwMDBQU0hVRkJycjY0XDAwMFBTSCINCisgICAgIlVGRG1pXDAwMFBTSFVGRHJpXDAwMFBTSFVGSFdtaVwwMDBQU0hVRkhXcmlcMDAwUFNIVUZMV21pXDAwMFBTSFVGTFdyaVwwMDAiDQorICAgICJQU0lHTkJybTEyOFwwMDBQU0lHTkJybTY0XDAwMFBTSUdOQnJyMTI4XDAwMFBTSUdOQnJyNjRcMDAwUFNJR05Ecm0xMjhcMDAwIg0KKyAgICAiUFNJR05Ecm02NFwwMDBQU0lHTkRycjEyOFwwMDBQU0lHTkRycjY0XDAwMFBTSUdOV3JtMTI4XDAwMFBTSUdOV3JtNjRcMDAwIg0KKyAgICAiUFNJR05XcnIxMjhcMDAwUFNJR05XcnI2NFwwMDBQU0xMRFFyaVwwMDBQU0xMRHJpXDAwMFBTTExEcm1cMDAwUFNMTERyclwwMDAiDQorICAgICJQU0xMUXJpXDAwMFBTTExRcm1cMDAwUFNMTFFyclwwMDBQU0xMV3JpXDAwMFBTTExXcm1cMDAwUFNMTFdyclwwMDBQU1JBRCINCisgICAgInJpXDAwMFBTUkFEcm1cMDAwUFNSQURyclwwMDBQU1JBV3JpXDAwMFBTUkFXcm1cMDAwUFNSQVdyclwwMDBQU1JMRFFyaVwwMDAiDQorICAgICJQU1JMRHJpXDAwMFBTUkxEcm1cMDAwUFNSTERyclwwMDBQU1JMUXJpXDAwMFBTUkxRcm1cMDAwUFNSTFFyclwwMDBQU1JMVyINCisgICAgInJpXDAwMFBTUkxXcm1cMDAwUFNSTFdyclwwMDBQU1VCQnJtXDAwMFBTVUJCcnJcMDAwUFNVQkRybVwwMDBQU1VCRHJyXDAwMCINCisgICAgIlBTVUJRcm1cMDAwUFNVQlFyclwwMDBQU1VCU0JybVwwMDBQU1VCU0JyclwwMDBQU1VCU1dybVwwMDBQU1VCU1dyclwwMDBQIg0KKyAgICAiU1VCVVNCcm1cMDAwUFNVQlVTQnJyXDAwMFBTVUJVU1dybVwwMDBQU1VCVVNXcnJcMDAwUFNVQldybVwwMDBQU1VCV3JyXDAwMCINCisgICAgIlBURVNUcm1cMDAwUFRFU1RyclwwMDBQVU5QQ0tIQldybVwwMDBQVU5QQ0tIQldyclwwMDBQVU5QQ0tIRFFybVwwMDBQVU5QIg0KKyAgICAiQ0tIRFFyclwwMDBQVU5QQ0tIUURRcm1cMDAwUFVOUENLSFFEUXJyXDAwMFBVTlBDS0hXRHJtXDAwMFBVTlBDS0hXRHJyXDAwMCINCisgICAgIlBVTlBDS0xCV3JtXDAwMFBVTlBDS0xCV3JyXDAwMFBVTlBDS0xEUXJtXDAwMFBVTlBDS0xEUXJyXDAwMFBVTlBDS0xRRFFyIg0KKyAgICAibVwwMDBQVU5QQ0tMUURRcnJcMDAwUFVOUENLTFdEcm1cMDAwUFVOUENLTFdEcnJcMDAwUFVTSDE2clwwMDBQVVNIMTZybW0iDQorICAgICJcMDAwUFVTSDE2cm1yXDAwMFBVU0gzMnJcMDAwUFVTSDMycm1tXDAwMFBVU0gzMnJtclwwMDBQVVNINjRpMTZcMDAwUFVTSCINCisgICAgIjY0aTMyXDAwMFBVU0g2NGk4XDAwMFBVU0g2NHJcMDAwUFVTSDY0cm1tXDAwMFBVU0g2NHJtclwwMDBQVVNIQTMyXDAwMFBVIg0KKyAgICAiU0hGMTZcMDAwUFVTSEYzMlwwMDBQVVNIRjY0XDAwMFBVU0hGUzE2XDAwMFBVU0hGUzMyXDAwMFBVU0hGUzY0XDAwMFBVU0giDQorICAgICJHUzE2XDAwMFBVU0hHUzMyXDAwMFBVU0hHUzY0XDAwMFBVU0hpMTZcMDAwUFVTSGkzMlwwMDBQVVNIaThcMDAwUFhPUnJtXDAwMCINCisgICAgIlBYT1JyclwwMDBSQ0wxNm0xXDAwMFJDTDE2bUNMXDAwMFJDTDE2bWlcMDAwUkNMMTZyMVwwMDBSQ0wxNnJDTFwwMDBSQ0wxIg0KKyAgICAiNnJpXDAwMFJDTDMybTFcMDAwUkNMMzJtQ0xcMDAwUkNMMzJtaVwwMDBSQ0wzMnIxXDAwMFJDTDMyckNMXDAwMFJDTDMycmkiDQorICAgICJcMDAwUkNMNjRtMVwwMDBSQ0w2NG1DTFwwMDBSQ0w2NG1pXDAwMFJDTDY0cjFcMDAwUkNMNjRyQ0xcMDAwUkNMNjRyaVwwMDAiDQorICAgICJSQ0w4bTFcMDAwUkNMOG1DTFwwMDBSQ0w4bWlcMDAwUkNMOHIxXDAwMFJDTDhyQ0xcMDAwUkNMOHJpXDAwMFJDUFBTbVwwMDAiDQorICAgICJSQ1BQU21fSW50XDAwMFJDUFBTclwwMDBSQ1BQU3JfSW50XDAwMFJDUFNTbVwwMDBSQ1BTU21fSW50XDAwMFJDUFNTclwwMDAiDQorICAgICJSQ1BTU3JfSW50XDAwMFJDUjE2bTFcMDAwUkNSMTZtQ0xcMDAwUkNSMTZtaVwwMDBSQ1IxNnIxXDAwMFJDUjE2ckNMXDAwMCINCisgICAgIlJDUjE2cmlcMDAwUkNSMzJtMVwwMDBSQ1IzMm1DTFwwMDBSQ1IzMm1pXDAwMFJDUjMycjFcMDAwUkNSMzJyQ0xcMDAwUkNSIg0KKyAgICAiMzJyaVwwMDBSQ1I2NG0xXDAwMFJDUjY0bUNMXDAwMFJDUjY0bWlcMDAwUkNSNjRyMVwwMDBSQ1I2NHJDTFwwMDBSQ1I2NHIiDQorICAgICJpXDAwMFJDUjhtMVwwMDBSQ1I4bUNMXDAwMFJDUjhtaVwwMDBSQ1I4cjFcMDAwUkNSOHJDTFwwMDBSQ1I4cmlcMDAwUkRNUyINCisgICAgIlJcMDAwUkRQTUNcMDAwUkRUU0NcMDAwUkRUU0NQXDAwMFJFUE5FX1BSRUZJWFwwMDBSRVBfTU9WU0JcMDAwUkVQX01PVlNEIg0KKyAgICAiXDAwMFJFUF9NT1ZTUVwwMDBSRVBfTU9WU1dcMDAwUkVQX1BSRUZJWFwwMDBSRVBfU1RPU0JcMDAwUkVQX1NUT1NEXDAwMFIiDQorICAgICJFUF9TVE9TUVwwMDBSRVBfU1RPU1dcMDAwUkVUXDAwMFJFVElcMDAwUk9MMTZtMVwwMDBST0wxNm1DTFwwMDBST0wxNm1pXDAwMCINCisgICAgIlJPTDE2cjFcMDAwUk9MMTZyQ0xcMDAwUk9MMTZyaVwwMDBST0wzMm0xXDAwMFJPTDMybUNMXDAwMFJPTDMybWlcMDAwUk9MIg0KKyAgICAiMzJyMVwwMDBST0wzMnJDTFwwMDBST0wzMnJpXDAwMFJPTDY0bTFcMDAwUk9MNjRtQ0xcMDAwUk9MNjRtaVwwMDBST0w2NHIiDQorICAgICIxXDAwMFJPTDY0ckNMXDAwMFJPTDY0cmlcMDAwUk9MOG0xXDAwMFJPTDhtQ0xcMDAwUk9MOG1pXDAwMFJPTDhyMVwwMDBSTyINCisgICAgIkw4ckNMXDAwMFJPTDhyaVwwMDBST1IxNm0xXDAwMFJPUjE2bUNMXDAwMFJPUjE2bWlcMDAwUk9SMTZyMVwwMDBST1IxNnJDIg0KKyAgICAiTFwwMDBST1IxNnJpXDAwMFJPUjMybTFcMDAwUk9SMzJtQ0xcMDAwUk9SMzJtaVwwMDBST1IzMnIxXDAwMFJPUjMyckNMXDAwMCINCisgICAgIlJPUjMycmlcMDAwUk9SNjRtMVwwMDBST1I2NG1DTFwwMDBST1I2NG1pXDAwMFJPUjY0cjFcMDAwUk9SNjRyQ0xcMDAwUk9SIg0KKyAgICAiNjRyaVwwMDBST1I4bTFcMDAwUk9SOG1DTFwwMDBST1I4bWlcMDAwUk9SOHIxXDAwMFJPUjhyQ0xcMDAwUk9SOHJpXDAwMFIiDQorICAgICJPVU5EUERtX0ludFwwMDBST1VORFBEcl9JbnRcMDAwUk9VTkRQU21fSW50XDAwMFJPVU5EUFNyX0ludFwwMDBST1VORFNEbSINCisgICAgIl9JbnRcMDAwUk9VTkRTRHJfSW50XDAwMFJPVU5EU1NtX0ludFwwMDBST1VORFNTcl9JbnRcMDAwUlNNXDAwMFJTUVJUUFNtIg0KKyAgICAiXDAwMFJTUVJUUFNtX0ludFwwMDBSU1FSVFBTclwwMDBSU1FSVFBTcl9JbnRcMDAwUlNRUlRTU21cMDAwUlNRUlRTU21fSW4iDQorICAgICJ0XDAwMFJTUVJUU1NyXDAwMFJTUVJUU1NyX0ludFwwMDBTQUhGXDAwMFNBUjE2bTFcMDAwU0FSMTZtQ0xcMDAwU0FSMTZtaSINCisgICAgIlwwMDBTQVIxNnIxXDAwMFNBUjE2ckNMXDAwMFNBUjE2cmlcMDAwU0FSMzJtMVwwMDBTQVIzMm1DTFwwMDBTQVIzMm1pXDAwMCINCisgICAgIlNBUjMycjFcMDAwU0FSMzJyQ0xcMDAwU0FSMzJyaVwwMDBTQVI2NG0xXDAwMFNBUjY0bUNMXDAwMFNBUjY0bWlcMDAwU0FSIg0KKyAgICAiNjRyMVwwMDBTQVI2NHJDTFwwMDBTQVI2NHJpXDAwMFNBUjhtMVwwMDBTQVI4bUNMXDAwMFNBUjhtaVwwMDBTQVI4cjFcMDAwIg0KKyAgICAiU0FSOHJDTFwwMDBTQVI4cmlcMDAwU0JCMTZpMTZcMDAwU0JCMTZtaVwwMDBTQkIxNm1pOFwwMDBTQkIxNm1yXDAwMFNCQjEiDQorICAgICI2cmlcMDAwU0JCMTZyaThcMDAwU0JCMTZybVwwMDBTQkIxNnJyXDAwMFNCQjE2cnJfUkVWXDAwMFNCQjMyaTMyXDAwMFNCQiINCisgICAgIjMybWlcMDAwU0JCMzJtaThcMDAwU0JCMzJtclwwMDBTQkIzMnJpXDAwMFNCQjMycmk4XDAwMFNCQjMycm1cMDAwU0JCMzJyIg0KKyAgICAiclwwMDBTQkIzMnJyX1JFVlwwMDBTQkI2NGkzMlwwMDBTQkI2NG1pMzJcMDAwU0JCNjRtaThcMDAwU0JCNjRtclwwMDBTQkIiDQorICAgICI2NHJpMzJcMDAwU0JCNjRyaThcMDAwU0JCNjRybVwwMDBTQkI2NHJyXDAwMFNCQjY0cnJfUkVWXDAwMFNCQjhpOFwwMDBTQiINCisgICAgIkI4bWlcMDAwU0JCOG1yXDAwMFNCQjhyaVwwMDBTQkI4cm1cMDAwU0JCOHJyXDAwMFNCQjhycl9SRVZcMDAwU0NBUzE2XDAwMCINCisgICAgIlNDQVMzMlwwMDBTQ0FTNjRcMDAwU0NBUzhcMDAwU0VUQUVtXDAwMFNFVEFFclwwMDBTRVRBbVwwMDBTRVRBclwwMDBTRVRCIg0KKyAgICAiRW1cMDAwU0VUQkVyXDAwMFNFVEJfQzE2clwwMDBTRVRCX0MzMnJcMDAwU0VUQl9DNjRyXDAwMFNFVEJfQzhyXDAwMFNFVEIiDQorICAgICJtXDAwMFNFVEJyXDAwMFNFVEVtXDAwMFNFVEVyXDAwMFNFVEdFbVwwMDBTRVRHRXJcMDAwU0VUR21cMDAwU0VUR3JcMDAwUyINCisgICAgIkVUTEVtXDAwMFNFVExFclwwMDBTRVRMbVwwMDBTRVRMclwwMDBTRVRORW1cMDAwU0VUTkVyXDAwMFNFVE5PbVwwMDBTRVROIg0KKyAgICAiT3JcMDAwU0VUTlBtXDAwMFNFVE5QclwwMDBTRVROU21cMDAwU0VUTlNyXDAwMFNFVE9tXDAwMFNFVE9yXDAwMFNFVFBtXDAwMCINCisgICAgIlNFVFByXDAwMFNFVFNtXDAwMFNFVFNyXDAwMFNGRU5DRVwwMDBTR0RUbVwwMDBTSEwxNm0xXDAwMFNITDE2bUNMXDAwMFNIIg0KKyAgICAiTDE2bWlcMDAwU0hMMTZyMVwwMDBTSEwxNnJDTFwwMDBTSEwxNnJpXDAwMFNITDMybTFcMDAwU0hMMzJtQ0xcMDAwU0hMMzIiDQorICAgICJtaVwwMDBTSEwzMnIxXDAwMFNITDMyckNMXDAwMFNITDMycmlcMDAwU0hMNjRtMVwwMDBTSEw2NG1DTFwwMDBTSEw2NG1pXDAwMCINCisgICAgIlNITDY0cjFcMDAwU0hMNjRyQ0xcMDAwU0hMNjRyaVwwMDBTSEw4bTFcMDAwU0hMOG1DTFwwMDBTSEw4bWlcMDAwU0hMOHIxIg0KKyAgICAiXDAwMFNITDhyQ0xcMDAwU0hMOHJpXDAwMFNITEQxNm1yQ0xcMDAwU0hMRDE2bXJpOFwwMDBTSExEMTZyckNMXDAwMFNITEQiDQorICAgICIxNnJyaThcMDAwU0hMRDMybXJDTFwwMDBTSExEMzJtcmk4XDAwMFNITEQzMnJyQ0xcMDAwU0hMRDMycnJpOFwwMDBTSExENiINCisgICAgIjRtckNMXDAwMFNITEQ2NG1yaThcMDAwU0hMRDY0cnJDTFwwMDBTSExENjRycmk4XDAwMFNIUjE2bTFcMDAwU0hSMTZtQ0xcMDAwIg0KKyAgICAiU0hSMTZtaVwwMDBTSFIxNnIxXDAwMFNIUjE2ckNMXDAwMFNIUjE2cmlcMDAwU0hSMzJtMVwwMDBTSFIzMm1DTFwwMDBTSFIiDQorICAgICIzMm1pXDAwMFNIUjMycjFcMDAwU0hSMzJyQ0xcMDAwU0hSMzJyaVwwMDBTSFI2NG0xXDAwMFNIUjY0bUNMXDAwMFNIUjY0bSINCisgICAgImlcMDAwU0hSNjRyMVwwMDBTSFI2NHJDTFwwMDBTSFI2NHJpXDAwMFNIUjhtMVwwMDBTSFI4bUNMXDAwMFNIUjhtaVwwMDBTIg0KKyAgICAiSFI4cjFcMDAwU0hSOHJDTFwwMDBTSFI4cmlcMDAwU0hSRDE2bXJDTFwwMDBTSFJEMTZtcmk4XDAwMFNIUkQxNnJyQ0xcMDAwIg0KKyAgICAiU0hSRDE2cnJpOFwwMDBTSFJEMzJtckNMXDAwMFNIUkQzMm1yaThcMDAwU0hSRDMycnJDTFwwMDBTSFJEMzJycmk4XDAwMFMiDQorICAgICJIUkQ2NG1yQ0xcMDAwU0hSRDY0bXJpOFwwMDBTSFJENjRyckNMXDAwMFNIUkQ2NHJyaThcMDAwU0hVRlBEcm1pXDAwMFNIVSINCisgICAgIkZQRHJyaVwwMDBTSFVGUFNybWlcMDAwU0hVRlBTcnJpXDAwMFNJRFRtXDAwMFNJTl9GXDAwMFNJTl9GcDMyXDAwMFNJTl9GIg0KKyAgICAicDY0XDAwMFNJTl9GcDgwXDAwMFNMRFQxNm1cMDAwU0xEVDE2clwwMDBTTERUNjRtXDAwMFNMRFQ2NHJcMDAwU01TVzE2bVwwMDAiDQorICAgICJTTVNXMTZyXDAwMFNNU1czMnJcMDAwU01TVzY0clwwMDBTUVJUUERtXDAwMFNRUlRQRG1fSW50XDAwMFNRUlRQRHJcMDAwUyINCisgICAgIlFSVFBEcl9JbnRcMDAwU1FSVFBTbVwwMDBTUVJUUFNtX0ludFwwMDBTUVJUUFNyXDAwMFNRUlRQU3JfSW50XDAwMFNRUlRTIg0KKyAgICAiRG1cMDAwU1FSVFNEbV9JbnRcMDAwU1FSVFNEclwwMDBTUVJUU0RyX0ludFwwMDBTUVJUU1NtXDAwMFNRUlRTU21fSW50XDAwMCINCisgICAgIlNRUlRTU3JcMDAwU1FSVFNTcl9JbnRcMDAwU1FSVF9GXDAwMFNRUlRfRnAzMlwwMDBTUVJUX0ZwNjRcMDAwU1FSVF9GcDgwIg0KKyAgICAiXDAwMFNTX1BSRUZJWFwwMDBTVENcMDAwU1REXDAwMFNUSVwwMDBTVE1YQ1NSXDAwMFNUT1NCXDAwMFNUT1NEXDAwMFNUT1MiDQorICAgICJRXDAwMFNUT1NXXDAwMFNUUm1cMDAwU1RSclwwMDBTVF9GMzJtXDAwMFNUX0Y2NG1cMDAwU1RfRlAzMm1cMDAwU1RfRlA2NCINCisgICAgIm1cMDAwU1RfRlA4MG1cMDAwU1RfRlByclwwMDBTVF9GcDMybVwwMDBTVF9GcDY0bVwwMDBTVF9GcDY0bTMyXDAwMFNUX0ZwIg0KKyAgICAiODBtMzJcMDAwU1RfRnA4MG02NFwwMDBTVF9GcFAzMm1cMDAwU1RfRnBQNjRtXDAwMFNUX0ZwUDY0bTMyXDAwMFNUX0ZwUDgiDQorICAgICIwbVwwMDBTVF9GcFA4MG0zMlwwMDBTVF9GcFA4MG02NFwwMDBTVF9GcnJcMDAwU1VCMTZpMTZcMDAwU1VCMTZtaVwwMDBTVSINCisgICAgIkIxNm1pOFwwMDBTVUIxNm1yXDAwMFNVQjE2cmlcMDAwU1VCMTZyaThcMDAwU1VCMTZybVwwMDBTVUIxNnJyXDAwMFNVQjE2Ig0KKyAgICAicnJfUkVWXDAwMFNVQjMyaTMyXDAwMFNVQjMybWlcMDAwU1VCMzJtaThcMDAwU1VCMzJtclwwMDBTVUIzMnJpXDAwMFNVQjMiDQorICAgICIycmk4XDAwMFNVQjMycm1cMDAwU1VCMzJyclwwMDBTVUIzMnJyX1JFVlwwMDBTVUI2NGkzMlwwMDBTVUI2NG1pMzJcMDAwUyINCisgICAgIlVCNjRtaThcMDAwU1VCNjRtclwwMDBTVUI2NHJpMzJcMDAwU1VCNjRyaThcMDAwU1VCNjRybVwwMDBTVUI2NHJyXDAwMFNVIg0KKyAgICAiQjY0cnJfUkVWXDAwMFNVQjhpOFwwMDBTVUI4bWlcMDAwU1VCOG1yXDAwMFNVQjhyaVwwMDBTVUI4cm1cMDAwU1VCOHJyXDAwMCINCisgICAgIlNVQjhycl9SRVZcMDAwU1VCUERybVwwMDBTVUJQRHJyXDAwMFNVQlBTcm1cMDAwU1VCUFNyclwwMDBTVUJSX0YzMm1cMDAwIg0KKyAgICAiU1VCUl9GNjRtXDAwMFNVQlJfRkkxNm1cMDAwU1VCUl9GSTMybVwwMDBTVUJSX0ZQclNUMFwwMDBTVUJSX0ZTVDByXDAwMFMiDQorICAgICJVQlJfRnAzMm1cMDAwU1VCUl9GcDY0bVwwMDBTVUJSX0ZwNjRtMzJcMDAwU1VCUl9GcDgwbTMyXDAwMFNVQlJfRnA4MG02NCINCisgICAgIlwwMDBTVUJSX0ZwSTE2bTMyXDAwMFNVQlJfRnBJMTZtNjRcMDAwU1VCUl9GcEkxNm04MFwwMDBTVUJSX0ZwSTMybTMyXDAwMCINCisgICAgIlNVQlJfRnBJMzJtNjRcMDAwU1VCUl9GcEkzMm04MFwwMDBTVUJSX0ZyU1QwXDAwMFNVQlNEcm1cMDAwU1VCU0RybV9JbnRcMDAwIg0KKyAgICAiU1VCU0RyclwwMDBTVUJTRHJyX0ludFwwMDBTVUJTU3JtXDAwMFNVQlNTcm1fSW50XDAwMFNVQlNTcnJcMDAwU1VCU1Nycl8iDQorICAgICJJbnRcMDAwU1VCX0YzMm1cMDAwU1VCX0Y2NG1cMDAwU1VCX0ZJMTZtXDAwMFNVQl9GSTMybVwwMDBTVUJfRlByU1QwXDAwMCINCisgICAgIlNVQl9GU1QwclwwMDBTVUJfRnAzMlwwMDBTVUJfRnAzMm1cMDAwU1VCX0ZwNjRcMDAwU1VCX0ZwNjRtXDAwMFNVQl9GcDY0Ig0KKyAgICAibTMyXDAwMFNVQl9GcDgwXDAwMFNVQl9GcDgwbTMyXDAwMFNVQl9GcDgwbTY0XDAwMFNVQl9GcEkxNm0zMlwwMDBTVUJfRnAiDQorICAgICJJMTZtNjRcMDAwU1VCX0ZwSTE2bTgwXDAwMFNVQl9GcEkzMm0zMlwwMDBTVUJfRnBJMzJtNjRcMDAwU1VCX0ZwSTMybTgwXDAwMCINCisgICAgIlNVQl9GclNUMFwwMDBTV0FQR1NcMDAwU1lTQ0FMTFwwMDBTWVNFTlRFUlwwMDBTWVNFWElUXDAwMFNZU0VYSVQ2NFwwMDBTIg0KKyAgICAiWVNSRVRcMDAwVEFJTEpNUGRcMDAwVEFJTEpNUGQ2NFwwMDBUQUlMSk1QbVwwMDBUQUlMSk1QbTY0XDAwMFRBSUxKTVByXDAwMCINCisgICAgIlRBSUxKTVByNjRcMDAwVENSRVRVUk5kaVwwMDBUQ1JFVFVSTmRpNjRcMDAwVENSRVRVUk5taVwwMDBUQ1JFVFVSTm1pNjRcMDAwIg0KKyAgICAiVENSRVRVUk5yaVwwMDBUQ1JFVFVSTnJpNjRcMDAwVEVTVDE2aTE2XDAwMFRFU1QxNm1pXDAwMFRFU1QxNnJpXDAwMFRFU1QiDQorICAgICIxNnJtXDAwMFRFU1QxNnJyXDAwMFRFU1QzMmkzMlwwMDBURVNUMzJtaVwwMDBURVNUMzJyaVwwMDBURVNUMzJybVwwMDBURSINCisgICAgIlNUMzJyclwwMDBURVNUNjRpMzJcMDAwVEVTVDY0bWkzMlwwMDBURVNUNjRyaTMyXDAwMFRFU1Q2NHJtXDAwMFRFU1Q2NHJyIg0KKyAgICAiXDAwMFRFU1Q4aThcMDAwVEVTVDhtaVwwMDBURVNUOHJpXDAwMFRFU1Q4cm1cMDAwVEVTVDhyclwwMDBUTFNDYWxsXzMyXDAwMCINCisgICAgIlRMU0NhbGxfNjRcMDAwVExTX2FkZHIzMlwwMDBUTFNfYWRkcjY0XDAwMFRSQVBcMDAwVFNUX0ZcMDAwVFNUX0ZwMzJcMDAwIg0KKyAgICAiVFNUX0ZwNjRcMDAwVFNUX0ZwODBcMDAwVUNPTUlTRHJtXDAwMFVDT01JU0RyclwwMDBVQ09NSVNTcm1cMDAwVUNPTUlTU3IiDQorICAgICJyXDAwMFVDT01fRklQclwwMDBVQ09NX0ZJclwwMDBVQ09NX0ZQUHJcMDAwVUNPTV9GUHJcMDAwVUNPTV9GcElyMzJcMDAwVSINCisgICAgIkNPTV9GcElyNjRcMDAwVUNPTV9GcElyODBcMDAwVUNPTV9GcHIzMlwwMDBVQ09NX0ZwcjY0XDAwMFVDT01fRnByODBcMDAwIg0KKyAgICAiVUNPTV9GclwwMDBVTlBDS0hQRHJtXDAwMFVOUENLSFBEcnJcMDAwVU5QQ0tIUFNybVwwMDBVTlBDS0hQU3JyXDAwMFVOUEMiDQorICAgICJLTFBEcm1cMDAwVU5QQ0tMUERyclwwMDBVTlBDS0xQU3JtXDAwMFVOUENLTFBTcnJcMDAwVkFERFBEWXJtXDAwMFZBRERQRCINCisgICAgIllyclwwMDBWQUREUERybVwwMDBWQUREUERyclwwMDBWQUREUFNZcm1cMDAwVkFERFBTWXJyXDAwMFZBRERQU3JtXDAwMFZBIg0KKyAgICAiRERQU3JyXDAwMFZBRERTRHJtXDAwMFZBRERTRHJtX0ludFwwMDBWQUREU0RyclwwMDBWQUREU0Rycl9JbnRcMDAwVkFERFMiDQorICAgICJTcm1cMDAwVkFERFNTcm1fSW50XDAwMFZBRERTU3JyXDAwMFZBRERTU3JyX0ludFwwMDBWQUREU1VCUERZcm1cMDAwVkFERCINCisgICAgIlNVQlBEWXJyXDAwMFZBRERTVUJQRHJtXDAwMFZBRERTVUJQRHJyXDAwMFZBRERTVUJQU1lybVwwMDBWQUREU1VCUFNZcnJcMDAwIg0KKyAgICAiVkFERFNVQlBTcm1cMDAwVkFERFNVQlBTcnJcMDAwVkFFU0RFQ0xBU1RybVwwMDBWQUVTREVDTEFTVHJyXDAwMFZBRVNERUMiDQorICAgICJybVwwMDBWQUVTREVDcnJcMDAwVkFFU0VOQ0xBU1RybVwwMDBWQUVTRU5DTEFTVHJyXDAwMFZBRVNFTkNybVwwMDBWQUVTRSINCisgICAgIk5DcnJcMDAwVkFFU0lNQ3JtXDAwMFZBRVNJTUNyclwwMDBWQUVTS0VZR0VOQVNTSVNUMTI4cm1cMDAwVkFFU0tFWUdFTkFTIg0KKyAgICAiU0lTVDEyOHJyXDAwMFZBTkROUERZcm1cMDAwVkFORE5QRFlyclwwMDBWQU5ETlBEcm1cMDAwVkFORE5QRHJyXDAwMFZBTkQiDQorICAgICJOUFNZcm1cMDAwVkFORE5QU1lyclwwMDBWQU5ETlBTcm1cMDAwVkFORE5QU3JyXDAwMFZBTkRQRFlybVwwMDBWQU5EUERZciINCisgICAgInJcMDAwVkFORFBEcm1cMDAwVkFORFBEcnJcMDAwVkFORFBTWXJtXDAwMFZBTkRQU1lyclwwMDBWQU5EUFNybVwwMDBWQU5EIg0KKyAgICAiUFNyclwwMDBWQVNUQVJUX1NBVkVfWE1NX1JFR1NcMDAwVkJMRU5EUERZcm1pXDAwMFZCTEVORFBEWXJyaVwwMDBWQkxFTkQiDQorICAgICJQRHJtaVwwMDBWQkxFTkRQRHJyaVwwMDBWQkxFTkRQU1lybWlcMDAwVkJMRU5EUFNZcnJpXDAwMFZCTEVORFBTcm1pXDAwMCINCisgICAgIlZCTEVORFBTcnJpXDAwMFZCTEVORFZQRFlybVwwMDBWQkxFTkRWUERZcnJcMDAwVkJMRU5EVlBEcm1cMDAwVkJMRU5EVlBEIg0KKyAgICAicnJcMDAwVkJMRU5EVlBTWXJtXDAwMFZCTEVORFZQU1lyclwwMDBWQkxFTkRWUFNybVwwMDBWQkxFTkRWUFNyclwwMDBWQlIiDQorICAgICJPQURDQVNURjEyOFwwMDBWQlJPQURDQVNUU0RcMDAwVkJST0FEQ0FTVFNTXDAwMFZCUk9BRENBU1RTU1lcMDAwVkNNUFBEWSINCisgICAgInJtaVwwMDBWQ01QUERZcm1pX2FsdFwwMDBWQ01QUERZcnJpXDAwMFZDTVBQRFlycmlfYWx0XDAwMFZDTVBQRHJtaVwwMDBWIg0KKyAgICAiQ01QUERybWlfYWx0XDAwMFZDTVBQRHJyaVwwMDBWQ01QUERycmlfYWx0XDAwMFZDTVBQU1lybWlcMDAwVkNNUFBTWXJtaV8iDQorICAgICJhbHRcMDAwVkNNUFBTWXJyaVwwMDBWQ01QUFNZcnJpX2FsdFwwMDBWQ01QUFNybWlcMDAwVkNNUFBTcm1pX2FsdFwwMDBWQyINCisgICAgIk1QUFNycmlcMDAwVkNNUFBTcnJpX2FsdFwwMDBWQ01QU0RybVwwMDBWQ01QU0RybV9hbHRcMDAwVkNNUFNEcnJcMDAwVkNNIg0KKyAgICAiUFNEcnJfYWx0XDAwMFZDTVBTU3JtXDAwMFZDTVBTU3JtX2FsdFwwMDBWQ01QU1NyclwwMDBWQ01QU1Nycl9hbHRcMDAwVkMiDQorICAgICJPTUlTRHJtXDAwMFZDT01JU0RyclwwMDBWQ09NSVNTcm1cMDAwVkNPTUlTU3JyXDAwMFZDVlREUTJQRFlybVwwMDBWQ1ZURCINCisgICAgIlEyUERZcnJcMDAwVkNWVERRMlBEcm1cMDAwVkNWVERRMlBEcnJcMDAwVkNWVERRMlBTWXJtXDAwMFZDVlREUTJQU1lyclwwMDAiDQorICAgICJWQ1ZURFEyUFNybVwwMDBWQ1ZURFEyUFNyclwwMDBWQ1ZUUEQyRFFYcllyXDAwMFZDVlRQRDJEUVhybVwwMDBWQ1ZUUEQyRCINCisgICAgIlFYcnJcMDAwVkNWVFBEMkRRWXJtXDAwMFZDVlRQRDJEUVlyclwwMDBWQ1ZUUEQyRFFyclwwMDBWQ1ZUUEQyUFNYcllyXDAwMCINCisgICAgIlZDVlRQRDJQU1hybVwwMDBWQ1ZUUEQyUFNYcnJcMDAwVkNWVFBEMlBTWXJtXDAwMFZDVlRQRDJQU1lyclwwMDBWQ1ZUUEQyIg0KKyAgICAiUFNyclwwMDBWQ1ZUUFMyRFFZcm1cMDAwVkNWVFBTMkRRWXJyXDAwMFZDVlRQUzJEUXJtXDAwMFZDVlRQUzJEUXJyXDAwMFYiDQorICAgICJDVlRQUzJQRFlybVwwMDBWQ1ZUUFMyUERZcnJcMDAwVkNWVFBTMlBEcm1cMDAwVkNWVFBTMlBEcnJcMDAwVkNWVFNEMlNJNiINCisgICAgIjRybVwwMDBWQ1ZUU0QyU0k2NHJyXDAwMFZDVlRTRDJTSV9hbHRybVwwMDBWQ1ZUU0QyU0lfYWx0cnJcMDAwVkNWVFNEMlNTIg0KKyAgICAicm1cMDAwVkNWVFNEMlNTcnJcMDAwVkNWVFNJMlNENjRybVwwMDBWQ1ZUU0kyU0Q2NHJyXDAwMFZDVlRTSTJTRExybVwwMDAiDQorICAgICJWQ1ZUU0kyU0RMcnJcMDAwVkNWVFNJMlNEcm1cMDAwVkNWVFNJMlNEcnJcMDAwVkNWVFNJMlNTNjRybVwwMDBWQ1ZUU0kyUyINCisgICAgIlM2NHJyXDAwMFZDVlRTSTJTU3JtXDAwMFZDVlRTSTJTU3JyXDAwMFZDVlRTUzJTRHJtXDAwMFZDVlRTUzJTRHJyXDAwMFZDIg0KKyAgICAiVlRTUzJTSTY0cm1cMDAwVkNWVFNTMlNJNjRyclwwMDBWQ1ZUU1MyU0lybVwwMDBWQ1ZUU1MyU0lyclwwMDBWQ1ZUVFBEMkQiDQorICAgICJRWHJZclwwMDBWQ1ZUVFBEMkRRWHJtXDAwMFZDVlRUUEQyRFFYcnJcMDAwVkNWVFRQRDJEUVlybVwwMDBWQ1ZUVFBEMkRRWSINCisgICAgInJyXDAwMFZDVlRUUEQyRFFyclwwMDBWQ1ZUVFBTMkRRWXJtXDAwMFZDVlRUUFMyRFFZcnJcMDAwVkNWVFRQUzJEUXJtXDAwMCINCisgICAgIlZDVlRUUFMyRFFyclwwMDBWQ1ZUVFNEMlNJNjRybVwwMDBWQ1ZUVFNEMlNJNjRyclwwMDBWQ1ZUVFNEMlNJcm1cMDAwVkNWIg0KKyAgICAiVFRTRDJTSXJyXDAwMFZDVlRUU1MyU0k2NHJtXDAwMFZDVlRUU1MyU0k2NHJyXDAwMFZDVlRUU1MyU0lybVwwMDBWQ1ZUVFMiDQorICAgICJTMlNJcnJcMDAwVkRJVlBEWXJtXDAwMFZESVZQRFlyclwwMDBWRElWUERybVwwMDBWRElWUERyclwwMDBWRElWUFNZcm1cMDAwIg0KKyAgICAiVkRJVlBTWXJyXDAwMFZESVZQU3JtXDAwMFZESVZQU3JyXDAwMFZESVZTRHJtXDAwMFZESVZTRHJtX0ludFwwMDBWRElWU0QiDQorICAgICJyclwwMDBWRElWU0Rycl9JbnRcMDAwVkRJVlNTcm1cMDAwVkRJVlNTcm1fSW50XDAwMFZESVZTU3JyXDAwMFZESVZTU3JyXyINCisgICAgIkludFwwMDBWRFBQRHJtaVwwMDBWRFBQRHJyaVwwMDBWRFBQU1lybWlcMDAwVkRQUFNZcnJpXDAwMFZEUFBTcm1pXDAwMFZEIg0KKyAgICAiUFBTcnJpXDAwMFZFUlJtXDAwMFZFUlJyXDAwMFZFUldtXDAwMFZFUldyXDAwMFZFWFRSQUNURjEyOG1yXDAwMFZFWFRSQUMiDQorICAgICJURjEyOHJyXDAwMFZFWFRSQUNUUFNtclwwMDBWRVhUUkFDVFBTcnJcMDAwVkVYVFJBQ1RQU3JyNjRcMDAwVkZNQUREUERyMSINCisgICAgIjMybVwwMDBWRk1BRERQRHIxMzJtWVwwMDBWRk1BRERQRHIxMzJyXDAwMFZGTUFERFBEcjEzMnJZXDAwMFZGTUFERFBEcjIxIg0KKyAgICAiM21cMDAwVkZNQUREUERyMjEzbVlcMDAwVkZNQUREUERyMjEzclwwMDBWRk1BRERQRHIyMTNyWVwwMDBWRk1BRERQRHIyMzEiDQorICAgICJtXDAwMFZGTUFERFBEcjIzMW1ZXDAwMFZGTUFERFBEcjIzMXJcMDAwVkZNQUREUERyMjMxcllcMDAwVkZNQUREUFNyMTMybSINCisgICAgIlwwMDBWRk1BRERQU3IxMzJtWVwwMDBWRk1BRERQU3IxMzJyXDAwMFZGTUFERFBTcjEzMnJZXDAwMFZGTUFERFBTcjIxM21cMDAwIg0KKyAgICAiVkZNQUREUFNyMjEzbVlcMDAwVkZNQUREUFNyMjEzclwwMDBWRk1BRERQU3IyMTNyWVwwMDBWRk1BRERQU3IyMzFtXDAwMFYiDQorICAgICJGTUFERFBTcjIzMW1ZXDAwMFZGTUFERFBTcjIzMXJcMDAwVkZNQUREUFNyMjMxcllcMDAwVkZNQUREU1VCUERyMTMybVwwMDAiDQorICAgICJWRk1BRERTVUJQRHIxMzJtWVwwMDBWRk1BRERTVUJQRHIxMzJyXDAwMFZGTUFERFNVQlBEcjEzMnJZXDAwMFZGTUFERFNVQiINCisgICAgIlBEcjIxM21cMDAwVkZNQUREU1VCUERyMjEzbVlcMDAwVkZNQUREU1VCUERyMjEzclwwMDBWRk1BRERTVUJQRHIyMTNyWVwwMDAiDQorICAgICJWRk1BRERTVUJQRHIyMzFtXDAwMFZGTUFERFNVQlBEcjIzMW1ZXDAwMFZGTUFERFNVQlBEcjIzMXJcMDAwVkZNQUREU1VCUCINCisgICAgIkRyMjMxcllcMDAwVkZNQUREU1VCUFNyMTMybVwwMDBWRk1BRERTVUJQU3IxMzJtWVwwMDBWRk1BRERTVUJQU3IxMzJyXDAwMCINCisgICAgIlZGTUFERFNVQlBTcjEzMnJZXDAwMFZGTUFERFNVQlBTcjIxM21cMDAwVkZNQUREU1VCUFNyMjEzbVlcMDAwVkZNQUREU1VCIg0KKyAgICAiUFNyMjEzclwwMDBWRk1BRERTVUJQU3IyMTNyWVwwMDBWRk1BRERTVUJQU3IyMzFtXDAwMFZGTUFERFNVQlBTcjIzMW1ZXDAwMCINCisgICAgIlZGTUFERFNVQlBTcjIzMXJcMDAwVkZNQUREU1VCUFNyMjMxcllcMDAwVkZNU1VCQUREUERyMTMybVwwMDBWRk1TVUJBRERQIg0KKyAgICAiRHIxMzJtWVwwMDBWRk1TVUJBRERQRHIxMzJyXDAwMFZGTVNVQkFERFBEcjEzMnJZXDAwMFZGTVNVQkFERFBEcjIxM21cMDAwIg0KKyAgICAiVkZNU1VCQUREUERyMjEzbVlcMDAwVkZNU1VCQUREUERyMjEzclwwMDBWRk1TVUJBRERQRHIyMTNyWVwwMDBWRk1TVUJBREQiDQorICAgICJQRHIyMzFtXDAwMFZGTVNVQkFERFBEcjIzMW1ZXDAwMFZGTVNVQkFERFBEcjIzMXJcMDAwVkZNU1VCQUREUERyMjMxcllcMDAwIg0KKyAgICAiVkZNU1VCQUREUFNyMTMybVwwMDBWRk1TVUJBRERQU3IxMzJtWVwwMDBWRk1TVUJBRERQU3IxMzJyXDAwMFZGTVNVQkFERFAiDQorICAgICJTcjEzMnJZXDAwMFZGTVNVQkFERFBTcjIxM21cMDAwVkZNU1VCQUREUFNyMjEzbVlcMDAwVkZNU1VCQUREUFNyMjEzclwwMDAiDQorICAgICJWRk1TVUJBRERQU3IyMTNyWVwwMDBWRk1TVUJBRERQU3IyMzFtXDAwMFZGTVNVQkFERFBTcjIzMW1ZXDAwMFZGTVNVQkFERCINCisgICAgIlBTcjIzMXJcMDAwVkZNU1VCQUREUFNyMjMxcllcMDAwVkZNU1VCUERyMTMybVwwMDBWRk1TVUJQRHIxMzJtWVwwMDBWRk1TIg0KKyAgICAiVUJQRHIxMzJyXDAwMFZGTVNVQlBEcjEzMnJZXDAwMFZGTVNVQlBEcjIxM21cMDAwVkZNU1VCUERyMjEzbVlcMDAwVkZNU1UiDQorICAgICJCUERyMjEzclwwMDBWRk1TVUJQRHIyMTNyWVwwMDBWRk1TVUJQRHIyMzFtXDAwMFZGTVNVQlBEcjIzMW1ZXDAwMFZGTVNVQiINCisgICAgIlBEcjIzMXJcMDAwVkZNU1VCUERyMjMxcllcMDAwVkZNU1VCUFNyMTMybVwwMDBWRk1TVUJQU3IxMzJtWVwwMDBWRk1TVUJQIg0KKyAgICAiU3IxMzJyXDAwMFZGTVNVQlBTcjEzMnJZXDAwMFZGTVNVQlBTcjIxM21cMDAwVkZNU1VCUFNyMjEzbVlcMDAwVkZNU1VCUFMiDQorICAgICJyMjEzclwwMDBWRk1TVUJQU3IyMTNyWVwwMDBWRk1TVUJQU3IyMzFtXDAwMFZGTVNVQlBTcjIzMW1ZXDAwMFZGTVNVQlBTciINCisgICAgIjIzMXJcMDAwVkZNU1VCUFNyMjMxcllcMDAwVkZOTUFERFBEcjEzMm1cMDAwVkZOTUFERFBEcjEzMm1ZXDAwMFZGTk1BRERQIg0KKyAgICAiRHIxMzJyXDAwMFZGTk1BRERQRHIxMzJyWVwwMDBWRk5NQUREUERyMjEzbVwwMDBWRk5NQUREUERyMjEzbVlcMDAwVkZOTUEiDQorICAgICJERFBEcjIxM3JcMDAwVkZOTUFERFBEcjIxM3JZXDAwMFZGTk1BRERQRHIyMzFtXDAwMFZGTk1BRERQRHIyMzFtWVwwMDBWRiINCisgICAgIk5NQUREUERyMjMxclwwMDBWRk5NQUREUERyMjMxcllcMDAwVkZOTUFERFBTcjEzMm1cMDAwVkZOTUFERFBTcjEzMm1ZXDAwMCINCisgICAgIlZGTk1BRERQU3IxMzJyXDAwMFZGTk1BRERQU3IxMzJyWVwwMDBWRk5NQUREUFNyMjEzbVwwMDBWRk5NQUREUFNyMjEzbVlcMDAwIg0KKyAgICAiVkZOTUFERFBTcjIxM3JcMDAwVkZOTUFERFBTcjIxM3JZXDAwMFZGTk1BRERQU3IyMzFtXDAwMFZGTk1BRERQU3IyMzFtWVwwMDAiDQorICAgICJWRk5NQUREUFNyMjMxclwwMDBWRk5NQUREUFNyMjMxcllcMDAwVkZOTVNVQlBEcjEzMm1cMDAwVkZOTVNVQlBEcjEzMm1ZXDAwMCINCisgICAgIlZGTk1TVUJQRHIxMzJyXDAwMFZGTk1TVUJQRHIxMzJyWVwwMDBWRk5NU1VCUERyMjEzbVwwMDBWRk5NU1VCUERyMjEzbVlcMDAwIg0KKyAgICAiVkZOTVNVQlBEcjIxM3JcMDAwVkZOTVNVQlBEcjIxM3JZXDAwMFZGTk1TVUJQRHIyMzFtXDAwMFZGTk1TVUJQRHIyMzFtWVwwMDAiDQorICAgICJWRk5NU1VCUERyMjMxclwwMDBWRk5NU1VCUERyMjMxcllcMDAwVkZOTVNVQlBTcjEzMm1cMDAwVkZOTVNVQlBTcjEzMm1ZXDAwMCINCisgICAgIlZGTk1TVUJQU3IxMzJyXDAwMFZGTk1TVUJQU3IxMzJyWVwwMDBWRk5NU1VCUFNyMjEzbVwwMDBWRk5NU1VCUFNyMjEzbVlcMDAwIg0KKyAgICAiVkZOTVNVQlBTcjIxM3JcMDAwVkZOTVNVQlBTcjIxM3JZXDAwMFZGTk1TVUJQU3IyMzFtXDAwMFZGTk1TVUJQU3IyMzFtWVwwMDAiDQorICAgICJWRk5NU1VCUFNyMjMxclwwMDBWRk5NU1VCUFNyMjMxcllcMDAwVkZzQU5ETlBEcm1cMDAwVkZzQU5ETlBEcnJcMDAwVkZzQSINCisgICAgIk5ETlBTcm1cMDAwVkZzQU5ETlBTcnJcMDAwVkZzQU5EUERybVwwMDBWRnNBTkRQRHJyXDAwMFZGc0FORFBTcm1cMDAwVkZzIg0KKyAgICAiQU5EUFNyclwwMDBWRnNPUlBEcm1cMDAwVkZzT1JQRHJyXDAwMFZGc09SUFNybVwwMDBWRnNPUlBTcnJcMDAwVkZzWE9SUEQiDQorICAgICJybVwwMDBWRnNYT1JQRHJyXDAwMFZGc1hPUlBTcm1cMDAwVkZzWE9SUFNyclwwMDBWSEFERFBEWXJtXDAwMFZIQUREUERZciINCisgICAgInJcMDAwVkhBRERQRHJtXDAwMFZIQUREUERyclwwMDBWSEFERFBTWXJtXDAwMFZIQUREUFNZcnJcMDAwVkhBRERQU3JtXDAwMCINCisgICAgIlZIQUREUFNyclwwMDBWSFNVQlBEWXJtXDAwMFZIU1VCUERZcnJcMDAwVkhTVUJQRHJtXDAwMFZIU1VCUERyclwwMDBWSFNVIg0KKyAgICAiQlBTWXJtXDAwMFZIU1VCUFNZcnJcMDAwVkhTVUJQU3JtXDAwMFZIU1VCUFNyclwwMDBWSU5TRVJURjEyOHJtXDAwMFZJTlMiDQorICAgICJFUlRGMTI4cnJcMDAwVklOU0VSVFBTcm1cMDAwVklOU0VSVFBTcnJcMDAwVkxERFFVWXJtXDAwMFZMRERRVXJtXDAwMFZMRCINCisgICAgIk1YQ1NSXDAwMFZNQVNLTU9WRFFVXDAwMFZNQVNLTU9WRFFVNjRcMDAwVk1BU0tNT1ZQRFltclwwMDBWTUFTS01PVlBEWXJtIg0KKyAgICAiXDAwMFZNQVNLTU9WUERtclwwMDBWTUFTS01PVlBEcm1cMDAwVk1BU0tNT1ZQU1ltclwwMDBWTUFTS01PVlBTWXJtXDAwMFYiDQorICAgICJNQVNLTU9WUFNtclwwMDBWTUFTS01PVlBTcm1cMDAwVk1BWFBEWXJtXDAwMFZNQVhQRFlybV9JbnRcMDAwVk1BWFBEWXJyXDAwMCINCisgICAgIlZNQVhQRFlycl9JbnRcMDAwVk1BWFBEcm1cMDAwVk1BWFBEcm1fSW50XDAwMFZNQVhQRHJyXDAwMFZNQVhQRHJyX0ludFwwMDAiDQorICAgICJWTUFYUFNZcm1cMDAwVk1BWFBTWXJtX0ludFwwMDBWTUFYUFNZcnJcMDAwVk1BWFBTWXJyX0ludFwwMDBWTUFYUFNybVwwMDAiDQorICAgICJWTUFYUFNybV9JbnRcMDAwVk1BWFBTcnJcMDAwVk1BWFBTcnJfSW50XDAwMFZNQVhTRHJtXDAwMFZNQVhTRHJtX0ludFwwMDAiDQorICAgICJWTUFYU0RyclwwMDBWTUFYU0Rycl9JbnRcMDAwVk1BWFNTcm1cMDAwVk1BWFNTcm1fSW50XDAwMFZNQVhTU3JyXDAwMFZNQSINCisgICAgIlhTU3JyX0ludFwwMDBWTUNBTExcMDAwVk1DTEVBUm1cMDAwVk1JTlBEWXJtXDAwMFZNSU5QRFlybV9JbnRcMDAwVk1JTlBEIg0KKyAgICAiWXJyXDAwMFZNSU5QRFlycl9JbnRcMDAwVk1JTlBEcm1cMDAwVk1JTlBEcm1fSW50XDAwMFZNSU5QRHJyXDAwMFZNSU5QRHIiDQorICAgICJyX0ludFwwMDBWTUlOUFNZcm1cMDAwVk1JTlBTWXJtX0ludFwwMDBWTUlOUFNZcnJcMDAwVk1JTlBTWXJyX0ludFwwMDBWTSINCisgICAgIklOUFNybVwwMDBWTUlOUFNybV9JbnRcMDAwVk1JTlBTcnJcMDAwVk1JTlBTcnJfSW50XDAwMFZNSU5TRHJtXDAwMFZNSU5TIg0KKyAgICAiRHJtX0ludFwwMDBWTUlOU0RyclwwMDBWTUlOU0Rycl9JbnRcMDAwVk1JTlNTcm1cMDAwVk1JTlNTcm1fSW50XDAwMFZNSU4iDQorICAgICJTU3JyXDAwMFZNSU5TU3JyX0ludFwwMDBWTUxBVU5DSFwwMDBWTU9WQVBEWW1yXDAwMFZNT1ZBUERZcm1cMDAwVk1PVkFQRCINCisgICAgIllyclwwMDBWTU9WQVBEbXJcMDAwVk1PVkFQRHJtXDAwMFZNT1ZBUERyclwwMDBWTU9WQVBTWW1yXDAwMFZNT1ZBUFNZcm1cMDAwIg0KKyAgICAiVk1PVkFQU1lyclwwMDBWTU9WQVBTbXJcMDAwVk1PVkFQU3JtXDAwMFZNT1ZBUFNyclwwMDBWTU9WRERVUFlybVwwMDBWTU8iDQorICAgICJWRERVUFlyclwwMDBWTU9WRERVUHJtXDAwMFZNT1ZERFVQcnJcMDAwVk1PVkRJMlBESXJtXDAwMFZNT1ZESTJQRElyclwwMDAiDQorICAgICJWTU9WREkyU1NybVwwMDBWTU9WREkyU1NyclwwMDBWTU9WRFFBWW1yXDAwMFZNT1ZEUUFZcm1cMDAwVk1PVkRRQVlyclwwMDAiDQorICAgICJWTU9WRFFBbXJcMDAwVk1PVkRRQXJtXDAwMFZNT1ZEUUFyclwwMDBWTU9WRFFVWW1yXDAwMFZNT1ZEUVVZcm1cMDAwVk1PViINCisgICAgIkRRVVlyclwwMDBWTU9WRFFVbXJcMDAwVk1PVkRRVW1yX0ludFwwMDBWTU9WRFFVcm1cMDAwVk1PVkRRVXJtX0ludFwwMDBWIg0KKyAgICAiTU9WRFFVcnJcMDAwVk1PVkhMUFNyclwwMDBWTU9WSFBEbXJcMDAwVk1PVkhQRHJtXDAwMFZNT1ZIUFNtclwwMDBWTU9WSFAiDQorICAgICJTcm1cMDAwVk1PVkxIUFNyclwwMDBWTU9WTFBEbXJcMDAwVk1PVkxQRHJtXDAwMFZNT1ZMUFNtclwwMDBWTU9WTFBTcm1cMDAwIg0KKyAgICAiVk1PVkxRMTI4bXJcMDAwVk1PVk1TS1BEWXI2NHJcMDAwVk1PVk1TS1BEWXJyXDAwMFZNT1ZNU0tQRHI2NHJcMDAwVk1PVk0iDQorICAgICJTS1BEcnJcMDAwVk1PVk1TS1BTWXI2NHJcMDAwVk1PVk1TS1BTWXJyXDAwMFZNT1ZNU0tQU3I2NHJcMDAwVk1PVk1TS1BTciINCisgICAgInJcMDAwVk1PVk5URFFBcm1cMDAwVk1PVk5URFFZXzY0bXJcMDAwVk1PVk5URFFZbXJcMDAwVk1PVk5URFFfNjRtclwwMDBWIg0KKyAgICAiTU9WTlREUW1yXDAwMFZNT1ZOVERRbXJfSW50XDAwMFZNT1ZOVFBEWW1yXDAwMFZNT1ZOVFBEbXJcMDAwVk1PVk5UUERtcl8iDQorICAgICJJbnRcMDAwVk1PVk5UUFNZbXJcMDAwVk1PVk5UUFNtclwwMDBWTU9WTlRQU21yX0ludFwwMDBWTU9WUERJMkRJbXJcMDAwViINCisgICAgIk1PVlBESTJESXJyXDAwMFZNT1ZQUUkyUUltclwwMDBWTU9WUUkyUFFJcm1cMDAwVk1PVlFkNjRyclwwMDBWTU9WUWQ2NHJyIg0KKyAgICAiX2FsdFwwMDBWTU9WUXM2NHJyXDAwMFZNT1ZReHJ4clwwMDBWTU9WU0RtclwwMDBWTU9WU0RybVwwMDBWTU9WU0RyclwwMDAiDQorICAgICJWTU9WU0hEVVBZcm1cMDAwVk1PVlNIRFVQWXJyXDAwMFZNT1ZTSERVUHJtXDAwMFZNT1ZTSERVUHJyXDAwMFZNT1ZTTERVUCINCisgICAgIllybVwwMDBWTU9WU0xEVVBZcnJcMDAwVk1PVlNMRFVQcm1cMDAwVk1PVlNMRFVQcnJcMDAwVk1PVlNTMkRJbXJcMDAwVk1PIg0KKyAgICAiVlNTMkRJcnJcMDAwVk1PVlNTbXJcMDAwVk1PVlNTcm1cMDAwVk1PVlNTcnJcMDAwVk1PVlVQRFltclwwMDBWTU9WVVBEWXIiDQorICAgICJtXDAwMFZNT1ZVUERZcnJcMDAwVk1PVlVQRG1yXDAwMFZNT1ZVUERtcl9JbnRcMDAwVk1PVlVQRHJtXDAwMFZNT1ZVUERybSINCisgICAgIl9JbnRcMDAwVk1PVlVQRHJyXDAwMFZNT1ZVUFNZbXJcMDAwVk1PVlVQU1lybVwwMDBWTU9WVVBTWXJyXDAwMFZNT1ZVUFNtIg0KKyAgICAiclwwMDBWTU9WVVBTbXJfSW50XDAwMFZNT1ZVUFNybVwwMDBWTU9WVVBTcm1fSW50XDAwMFZNT1ZVUFNyclwwMDBWTU9WWkQiDQorICAgICJJMlBESXJtXDAwMFZNT1ZaREkyUERJcnJcMDAwVk1PVlpQUUlMbzJQUUlybVwwMDBWTU9WWlBRSUxvMlBRSXJyXDAwMFZNTyINCisgICAgIlZaUUkyUFFJcm1cMDAwVk1PVlpRSTJQUUlyclwwMDBWTVBTQURCV3JtaVwwMDBWTVBTQURCV3JyaVwwMDBWTVBUUkxEbVwwMDAiDQorICAgICJWTVBUUlNUbVwwMDBWTVJFQUQzMnJtXDAwMFZNUkVBRDMycnJcMDAwVk1SRUFENjRybVwwMDBWTVJFQUQ2NHJyXDAwMFZNUiINCisgICAgIkVTVU1FXDAwMFZNVUxQRFlybVwwMDBWTVVMUERZcnJcMDAwVk1VTFBEcm1cMDAwVk1VTFBEcnJcMDAwVk1VTFBTWXJtXDAwMCINCisgICAgIlZNVUxQU1lyclwwMDBWTVVMUFNybVwwMDBWTVVMUFNyclwwMDBWTVVMU0RybVwwMDBWTVVMU0RybV9JbnRcMDAwVk1VTFNEIg0KKyAgICAicnJcMDAwVk1VTFNEcnJfSW50XDAwMFZNVUxTU3JtXDAwMFZNVUxTU3JtX0ludFwwMDBWTVVMU1NyclwwMDBWTVVMU1Nycl8iDQorICAgICJJbnRcMDAwVk1XUklURTMycm1cMDAwVk1XUklURTMycnJcMDAwVk1XUklURTY0cm1cMDAwVk1XUklURTY0cnJcMDAwVk1YTyINCisgICAgIkZGXDAwMFZNWE9OXDAwMFZPUlBEWXJtXDAwMFZPUlBEWXJyXDAwMFZPUlBEcm1cMDAwVk9SUERyclwwMDBWT1JQU1lybVwwMDAiDQorICAgICJWT1JQU1lyclwwMDBWT1JQU3JtXDAwMFZPUlBTcnJcMDAwVlBBQlNCcm0xMjhcMDAwVlBBQlNCcm02NFwwMDBWUEFCU0JyciINCisgICAgIjEyOFwwMDBWUEFCU0JycjY0XDAwMFZQQUJTRHJtMTI4XDAwMFZQQUJTRHJtNjRcMDAwVlBBQlNEcnIxMjhcMDAwVlBBQlNEIg0KKyAgICAicnI2NFwwMDBWUEFCU1dybTEyOFwwMDBWUEFCU1dybTY0XDAwMFZQQUJTV3JyMTI4XDAwMFZQQUJTV3JyNjRcMDAwVlBBQ0siDQorICAgICJTU0RXcm1cMDAwVlBBQ0tTU0RXcnJcMDAwVlBBQ0tTU1dCcm1cMDAwVlBBQ0tTU1dCcnJcMDAwVlBBQ0tVU0RXcm1cMDAwViINCisgICAgIlBBQ0tVU0RXcnJcMDAwVlBBQ0tVU1dCcm1cMDAwVlBBQ0tVU1dCcnJcMDAwVlBBRERCcm1cMDAwVlBBRERCcnJcMDAwVlBBIg0KKyAgICAiREREcm1cMDAwVlBBREREcnJcMDAwVlBBRERRcm1cMDAwVlBBRERRcnJcMDAwVlBBRERTQnJtXDAwMFZQQUREU0JyclwwMDAiDQorICAgICJWUEFERFNXcm1cMDAwVlBBRERTV3JyXDAwMFZQQUREVVNCcm1cMDAwVlBBRERVU0JyclwwMDBWUEFERFVTV3JtXDAwMFZQQSINCisgICAgIkREVVNXcnJcMDAwVlBBRERXcm1cMDAwVlBBRERXcnJcMDAwVlBBTElHTlIxMjhybVwwMDBWUEFMSUdOUjEyOHJyXDAwMFZQIg0KKyAgICAiQUxJR05SNjRybVwwMDBWUEFMSUdOUjY0cnJcMDAwVlBBTkROcm1cMDAwVlBBTkROcnJcMDAwVlBBTkRybVwwMDBWUEFORHIiDQorICAgICJyXDAwMFZQQVZHQnJtXDAwMFZQQVZHQnJyXDAwMFZQQVZHV3JtXDAwMFZQQVZHV3JyXDAwMFZQQkxFTkRWQnJtXDAwMFZQQiINCisgICAgIkxFTkRWQnJyXDAwMFZQQkxFTkRXcm1pXDAwMFZQQkxFTkRXcnJpXDAwMFZQQ0xNVUxIUUhRRFFybVwwMDBWUENMTVVMSFFIIg0KKyAgICAiUURRcnJcMDAwVlBDTE1VTEhRTFFEUXJtXDAwMFZQQ0xNVUxIUUxRRFFyclwwMDBWUENMTVVMTFFIUURRcm1cMDAwVlBDTE0iDQorICAgICJVTExRSFFEUXJyXDAwMFZQQ0xNVUxMUUxRRFFybVwwMDBWUENMTVVMTFFMUURRcnJcMDAwVlBDTE1VTFFEUXJtXDAwMFZQQyINCisgICAgIkxNVUxRRFFyclwwMDBWUENNUEVRQnJtXDAwMFZQQ01QRVFCcnJcMDAwVlBDTVBFUURybVwwMDBWUENNUEVRRHJyXDAwMFZQIg0KKyAgICAiQ01QRVFRcm1cMDAwVlBDTVBFUVFyclwwMDBWUENNUEVRV3JtXDAwMFZQQ01QRVFXcnJcMDAwVlBDTVBFU1RSSUFybVwwMDAiDQorICAgICJWUENNUEVTVFJJQXJyXDAwMFZQQ01QRVNUUklDcm1cMDAwVlBDTVBFU1RSSUNyclwwMDBWUENNUEVTVFJJT3JtXDAwMFZQQyINCisgICAgIk1QRVNUUklPcnJcMDAwVlBDTVBFU1RSSVNybVwwMDBWUENNUEVTVFJJU3JyXDAwMFZQQ01QRVNUUklacm1cMDAwVlBDTVBFIg0KKyAgICAiU1RSSVpyclwwMDBWUENNUEVTVFJJcm1cMDAwVlBDTVBFU1RSSXJyXDAwMFZQQ01QRVNUUk0xMjhNRU1cMDAwVlBDTVBFU1QiDQorICAgICJSTTEyOFJFR1wwMDBWUENNUEVTVFJNMTI4cm1cMDAwVlBDTVBFU1RSTTEyOHJyXDAwMFZQQ01QR1RCcm1cMDAwVlBDTVBHVCINCisgICAgIkJyclwwMDBWUENNUEdURHJtXDAwMFZQQ01QR1REcnJcMDAwVlBDTVBHVFFybVwwMDBWUENNUEdUUXJyXDAwMFZQQ01QR1RXIg0KKyAgICAicm1cMDAwVlBDTVBHVFdyclwwMDBWUENNUElTVFJJQXJtXDAwMFZQQ01QSVNUUklBcnJcMDAwVlBDTVBJU1RSSUNybVwwMDAiDQorICAgICJWUENNUElTVFJJQ3JyXDAwMFZQQ01QSVNUUklPcm1cMDAwVlBDTVBJU1RSSU9yclwwMDBWUENNUElTVFJJU3JtXDAwMFZQQyINCisgICAgIk1QSVNUUklTcnJcMDAwVlBDTVBJU1RSSVpybVwwMDBWUENNUElTVFJJWnJyXDAwMFZQQ01QSVNUUklybVwwMDBWUENNUElTIg0KKyAgICAiVFJJcnJcMDAwVlBDTVBJU1RSTTEyOE1FTVwwMDBWUENNUElTVFJNMTI4UkVHXDAwMFZQQ01QSVNUUk0xMjhybVwwMDBWUEMiDQorICAgICJNUElTVFJNMTI4cnJcMDAwVlBFUk0yRjEyOHJtXDAwMFZQRVJNMkYxMjhyclwwMDBWUEVSTUlMUERZbWlcMDAwVlBFUk1JTCINCisgICAgIlBEWXJpXDAwMFZQRVJNSUxQRFlybVwwMDBWUEVSTUlMUERZcnJcMDAwVlBFUk1JTFBEbWlcMDAwVlBFUk1JTFBEcmlcMDAwIg0KKyAgICAiVlBFUk1JTFBEcm1cMDAwVlBFUk1JTFBEcnJcMDAwVlBFUk1JTFBTWW1pXDAwMFZQRVJNSUxQU1lyaVwwMDBWUEVSTUlMUFMiDQorICAgICJZcm1cMDAwVlBFUk1JTFBTWXJyXDAwMFZQRVJNSUxQU21pXDAwMFZQRVJNSUxQU3JpXDAwMFZQRVJNSUxQU3JtXDAwMFZQRSINCisgICAgIlJNSUxQU3JyXDAwMFZQRVhUUkJtclwwMDBWUEVYVFJCcnJcMDAwVlBFWFRSQnJyNjRcMDAwVlBFWFRSRG1yXDAwMFZQRVhUIg0KKyAgICAiUkRyclwwMDBWUEVYVFJRbXJcMDAwVlBFWFRSUXJyXDAwMFZQRVhUUldtclwwMDBWUEVYVFJXcmlcMDAwVlBIQURERHJtMTIiDQorICAgICI4XDAwMFZQSEFERERybTY0XDAwMFZQSEFERERycjEyOFwwMDBWUEhBREREcnI2NFwwMDBWUEhBRERTV3JtMTI4XDAwMFZQSCINCisgICAgIkFERFNXcm02NFwwMDBWUEhBRERTV3JyMTI4XDAwMFZQSEFERFNXcnI2NFwwMDBWUEhBRERXcm0xMjhcMDAwVlBIQUREV3JtIg0KKyAgICAiNjRcMDAwVlBIQUREV3JyMTI4XDAwMFZQSEFERFdycjY0XDAwMFZQSE1JTlBPU1VXcm0xMjhcMDAwVlBITUlOUE9TVVdycjEiDQorICAgICIyOFwwMDBWUEhTVUJEcm0xMjhcMDAwVlBIU1VCRHJtNjRcMDAwVlBIU1VCRHJyMTI4XDAwMFZQSFNVQkRycjY0XDAwMFZQSCINCisgICAgIlNVQlNXcm0xMjhcMDAwVlBIU1VCU1dybTY0XDAwMFZQSFNVQlNXcnIxMjhcMDAwVlBIU1VCU1dycjY0XDAwMFZQSFNVQldyIg0KKyAgICAibTEyOFwwMDBWUEhTVUJXcm02NFwwMDBWUEhTVUJXcnIxMjhcMDAwVlBIU1VCV3JyNjRcMDAwVlBJTlNSQnJtXDAwMFZQSU4iDQorICAgICJTUkJyclwwMDBWUElOU1JEcm1cMDAwVlBJTlNSRHJyXDAwMFZQSU5TUlFybVwwMDBWUElOU1JRcnJcMDAwVlBJTlNSV3JtaSINCisgICAgIlwwMDBWUElOU1JXcnI2NGlcMDAwVlBJTlNSV3JyaVwwMDBWUE1BRERVQlNXcm0xMjhcMDAwVlBNQUREVUJTV3JtNjRcMDAwIg0KKyAgICAiVlBNQUREVUJTV3JyMTI4XDAwMFZQTUFERFVCU1dycjY0XDAwMFZQTUFERFdEcm1cMDAwVlBNQUREV0RyclwwMDBWUE1BWFMiDQorICAgICJCcm1cMDAwVlBNQVhTQnJyXDAwMFZQTUFYU0RybVwwMDBWUE1BWFNEcnJcMDAwVlBNQVhTV3JtXDAwMFZQTUFYU1dyclwwMDAiDQorICAgICJWUE1BWFVCcm1cMDAwVlBNQVhVQnJyXDAwMFZQTUFYVURybVwwMDBWUE1BWFVEcnJcMDAwVlBNQVhVV3JtXDAwMFZQTUFYVSINCisgICAgIldyclwwMDBWUE1JTlNCcm1cMDAwVlBNSU5TQnJyXDAwMFZQTUlOU0RybVwwMDBWUE1JTlNEcnJcMDAwVlBNSU5TV3JtXDAwMCINCisgICAgIlZQTUlOU1dyclwwMDBWUE1JTlVCcm1cMDAwVlBNSU5VQnJyXDAwMFZQTUlOVURybVwwMDBWUE1JTlVEcnJcMDAwVlBNSU5VIg0KKyAgICAiV3JtXDAwMFZQTUlOVVdyclwwMDBWUE1PVk1TS0JyNjRyXDAwMFZQTU9WTVNLQnJyXDAwMFZQTU9WU1hCRHJtXDAwMFZQTU8iDQorICAgICJWU1hCRHJyXDAwMFZQTU9WU1hCUXJtXDAwMFZQTU9WU1hCUXJyXDAwMFZQTU9WU1hCV3JtXDAwMFZQTU9WU1hCV3JyXDAwMCINCisgICAgIlZQTU9WU1hEUXJtXDAwMFZQTU9WU1hEUXJyXDAwMFZQTU9WU1hXRHJtXDAwMFZQTU9WU1hXRHJyXDAwMFZQTU9WU1hXUXJtIg0KKyAgICAiXDAwMFZQTU9WU1hXUXJyXDAwMFZQTU9WWlhCRHJtXDAwMFZQTU9WWlhCRHJyXDAwMFZQTU9WWlhCUXJtXDAwMFZQTU9WWlgiDQorICAgICJCUXJyXDAwMFZQTU9WWlhCV3JtXDAwMFZQTU9WWlhCV3JyXDAwMFZQTU9WWlhEUXJtXDAwMFZQTU9WWlhEUXJyXDAwMFZQTSINCisgICAgIk9WWlhXRHJtXDAwMFZQTU9WWlhXRHJyXDAwMFZQTU9WWlhXUXJtXDAwMFZQTU9WWlhXUXJyXDAwMFZQTVVMRFFybVwwMDBWIg0KKyAgICAiUE1VTERRcnJcMDAwVlBNVUxIUlNXcm0xMjhcMDAwVlBNVUxIUlNXcm02NFwwMDBWUE1VTEhSU1dycjEyOFwwMDBWUE1VTEgiDQorICAgICJSU1dycjY0XDAwMFZQTVVMSFVXcm1cMDAwVlBNVUxIVVdyclwwMDBWUE1VTEhXcm1cMDAwVlBNVUxIV3JyXDAwMFZQTVVMTCINCisgICAgIkRybVwwMDBWUE1VTExEcnJcMDAwVlBNVUxMV3JtXDAwMFZQTVVMTFdyclwwMDBWUE1VTFVEUXJtXDAwMFZQTVVMVURRcnJcMDAwIg0KKyAgICAiVlBPUnJtXDAwMFZQT1JyclwwMDBWUFNBREJXcm1cMDAwVlBTQURCV3JyXDAwMFZQU0hVRkJybTEyOFwwMDBWUFNIVUZCcm0iDQorICAgICI2NFwwMDBWUFNIVUZCcnIxMjhcMDAwVlBTSFVGQnJyNjRcMDAwVlBTSFVGRG1pXDAwMFZQU0hVRkRyaVwwMDBWUFNIVUZIVyINCisgICAgIm1pXDAwMFZQU0hVRkhXcmlcMDAwVlBTSFVGTFdtaVwwMDBWUFNIVUZMV3JpXDAwMFZQU0lHTkJybTEyOFwwMDBWUFNJR05CIg0KKyAgICAicm02NFwwMDBWUFNJR05CcnIxMjhcMDAwVlBTSUdOQnJyNjRcMDAwVlBTSUdORHJtMTI4XDAwMFZQU0lHTkRybTY0XDAwMFYiDQorICAgICJQU0lHTkRycjEyOFwwMDBWUFNJR05EcnI2NFwwMDBWUFNJR05Xcm0xMjhcMDAwVlBTSUdOV3JtNjRcMDAwVlBTSUdOV3JyMSINCisgICAgIjI4XDAwMFZQU0lHTldycjY0XDAwMFZQU0xMRFFyaVwwMDBWUFNMTERyaVwwMDBWUFNMTERybVwwMDBWUFNMTERyclwwMDBWIg0KKyAgICAiUFNMTFFyaVwwMDBWUFNMTFFybVwwMDBWUFNMTFFyclwwMDBWUFNMTFdyaVwwMDBWUFNMTFdybVwwMDBWUFNMTFdyclwwMDAiDQorICAgICJWUFNSQURyaVwwMDBWUFNSQURybVwwMDBWUFNSQURyclwwMDBWUFNSQVdyaVwwMDBWUFNSQVdybVwwMDBWUFNSQVdyclwwMDAiDQorICAgICJWUFNSTERRcmlcMDAwVlBTUkxEcmlcMDAwVlBTUkxEcm1cMDAwVlBTUkxEcnJcMDAwVlBTUkxRcmlcMDAwVlBTUkxRcm1cMDAwIg0KKyAgICAiVlBTUkxRcnJcMDAwVlBTUkxXcmlcMDAwVlBTUkxXcm1cMDAwVlBTUkxXcnJcMDAwVlBTVUJCcm1cMDAwVlBTVUJCcnJcMDAwIg0KKyAgICAiVlBTVUJEcm1cMDAwVlBTVUJEcnJcMDAwVlBTVUJRcm1cMDAwVlBTVUJRcnJcMDAwVlBTVUJTQnJtXDAwMFZQU1VCU0JyclwwMDAiDQorICAgICJWUFNVQlNXcm1cMDAwVlBTVUJTV3JyXDAwMFZQU1VCVVNCcm1cMDAwVlBTVUJVU0JyclwwMDBWUFNVQlVTV3JtXDAwMFZQUyINCisgICAgIlVCVVNXcnJcMDAwVlBTVUJXcm1cMDAwVlBTVUJXcnJcMDAwVlBURVNUWXJtXDAwMFZQVEVTVFlyclwwMDBWUFRFU1RybVwwMDAiDQorICAgICJWUFRFU1RyclwwMDBWUFVOUENLSEJXcm1cMDAwVlBVTlBDS0hCV3JyXDAwMFZQVU5QQ0tIRFFybVwwMDBWUFVOUENLSERRciINCisgICAgInJcMDAwVlBVTlBDS0hRRFFybVwwMDBWUFVOUENLSFFEUXJyXDAwMFZQVU5QQ0tIV0RybVwwMDBWUFVOUENLSFdEcnJcMDAwIg0KKyAgICAiVlBVTlBDS0xCV3JtXDAwMFZQVU5QQ0tMQldyclwwMDBWUFVOUENLTERRcm1cMDAwVlBVTlBDS0xEUXJyXDAwMFZQVU5QQ0siDQorICAgICJMUURRcm1cMDAwVlBVTlBDS0xRRFFyclwwMDBWUFVOUENLTFdEcm1cMDAwVlBVTlBDS0xXRHJyXDAwMFZQWE9Scm1cMDAwViINCisgICAgIlBYT1JyclwwMDBWUkNQUFNZbVwwMDBWUkNQUFNZbV9JbnRcMDAwVlJDUFBTWXJcMDAwVlJDUFBTWXJfSW50XDAwMFZSQ1BQIg0KKyAgICAiU21cMDAwVlJDUFBTbV9JbnRcMDAwVlJDUFBTclwwMDBWUkNQUFNyX0ludFwwMDBWUkNQU1NtXDAwMFZSQ1BTU21fSW50XDAwMCINCisgICAgIlZSQ1BTU3JcMDAwVlJDUFNTcl9JbnRcMDAwVlJPVU5EUERtXDAwMFZST1VORFBEbV9JbnRcMDAwVlJPVU5EUERyXDAwMFZSIg0KKyAgICAiT1VORFBEcl9JbnRcMDAwVlJPVU5EUFNtXDAwMFZST1VORFBTbV9JbnRcMDAwVlJPVU5EUFNyXDAwMFZST1VORFBTcl9JbnQiDQorICAgICJcMDAwVlJPVU5EU0RtXDAwMFZST1VORFNEbV9JbnRcMDAwVlJPVU5EU0RyXDAwMFZST1VORFNEcl9JbnRcMDAwVlJPVU5EUyINCisgICAgIlNtXDAwMFZST1VORFNTbV9JbnRcMDAwVlJPVU5EU1NyXDAwMFZST1VORFNTcl9JbnRcMDAwVlJPVU5EWVBEbVwwMDBWUk9VIg0KKyAgICAiTkRZUERtX0ludFwwMDBWUk9VTkRZUERyXDAwMFZST1VORFlQRHJfSW50XDAwMFZST1VORFlQU21cMDAwVlJPVU5EWVBTbV8iDQorICAgICJJbnRcMDAwVlJPVU5EWVBTclwwMDBWUk9VTkRZUFNyX0ludFwwMDBWUlNRUlRQU1ltXDAwMFZSU1FSVFBTWW1fSW50XDAwMCINCisgICAgIlZSU1FSVFBTWXJcMDAwVlJTUVJUUFNZcl9JbnRcMDAwVlJTUVJUUFNtXDAwMFZSU1FSVFBTbV9JbnRcMDAwVlJTUVJUUFNyIg0KKyAgICAiXDAwMFZSU1FSVFBTcl9JbnRcMDAwVlJTUVJUU1NtXDAwMFZSU1FSVFNTbV9JbnRcMDAwVlJTUVJUU1NyXDAwMFZSU1FSVFMiDQorICAgICJTcl9JbnRcMDAwVlNIVUZQRFlybWlcMDAwVlNIVUZQRFlycmlcMDAwVlNIVUZQRHJtaVwwMDBWU0hVRlBEcnJpXDAwMFZTSCINCisgICAgIlVGUFNZcm1pXDAwMFZTSFVGUFNZcnJpXDAwMFZTSFVGUFNybWlcMDAwVlNIVUZQU3JyaVwwMDBWU1FSVFBEWW1cMDAwVlNRIg0KKyAgICAiUlRQRFltX0ludFwwMDBWU1FSVFBEWXJcMDAwVlNRUlRQRFlyX0ludFwwMDBWU1FSVFBEbVwwMDBWU1FSVFBEbV9JbnRcMDAwIg0KKyAgICAiVlNRUlRQRHJcMDAwVlNRUlRQRHJfSW50XDAwMFZTUVJUUFNZbVwwMDBWU1FSVFBTWW1fSW50XDAwMFZTUVJUUFNZclwwMDAiDQorICAgICJWU1FSVFBTWXJfSW50XDAwMFZTUVJUUFNtXDAwMFZTUVJUUFNtX0ludFwwMDBWU1FSVFBTclwwMDBWU1FSVFBTcl9JbnRcMDAwIg0KKyAgICAiVlNRUlRTRG1cMDAwVlNRUlRTRG1fSW50XDAwMFZTUVJUU0RyXDAwMFZTUVJUU0RyX0ludFwwMDBWU1FSVFNTbVwwMDBWU1EiDQorICAgICJSVFNTbV9JbnRcMDAwVlNRUlRTU3JcMDAwVlNRUlRTU3JfSW50XDAwMFZTVE1YQ1NSXDAwMFZTVUJQRFlybVwwMDBWU1VCUCINCisgICAgIkRZcnJcMDAwVlNVQlBEcm1cMDAwVlNVQlBEcnJcMDAwVlNVQlBTWXJtXDAwMFZTVUJQU1lyclwwMDBWU1VCUFNybVwwMDBWIg0KKyAgICAiU1VCUFNyclwwMDBWU1VCU0RybVwwMDBWU1VCU0RybV9JbnRcMDAwVlNVQlNEcnJcMDAwVlNVQlNEcnJfSW50XDAwMFZTVUIiDQorICAgICJTU3JtXDAwMFZTVUJTU3JtX0ludFwwMDBWU1VCU1NyclwwMDBWU1VCU1Nycl9JbnRcMDAwVlRFU1RQRFlybVwwMDBWVEVTVCINCisgICAgIlBEWXJyXDAwMFZURVNUUERybVwwMDBWVEVTVFBEcnJcMDAwVlRFU1RQU1lybVwwMDBWVEVTVFBTWXJyXDAwMFZURVNUUFNyIg0KKyAgICAibVwwMDBWVEVTVFBTcnJcMDAwVlVDT01JU0RybVwwMDBWVUNPTUlTRHJyXDAwMFZVQ09NSVNTcm1cMDAwVlVDT01JU1NyclwwMDAiDQorICAgICJWVU5QQ0tIUERZcm1cMDAwVlVOUENLSFBEWXJyXDAwMFZVTlBDS0hQRHJtXDAwMFZVTlBDS0hQRHJyXDAwMFZVTlBDS0hQUyINCisgICAgIllybVwwMDBWVU5QQ0tIUFNZcnJcMDAwVlVOUENLSFBTcm1cMDAwVlVOUENLSFBTcnJcMDAwVlVOUENLTFBEWXJtXDAwMFZVIg0KKyAgICAiTlBDS0xQRFlyclwwMDBWVU5QQ0tMUERybVwwMDBWVU5QQ0tMUERyclwwMDBWVU5QQ0tMUFNZcm1cMDAwVlVOUENLTFBTWXIiDQorICAgICJyXDAwMFZVTlBDS0xQU3JtXDAwMFZVTlBDS0xQU3JyXDAwMFZYT1JQRFlybVwwMDBWWE9SUERZcnJcMDAwVlhPUlBEcm1cMDAwIg0KKyAgICAiVlhPUlBEcnJcMDAwVlhPUlBTWXJtXDAwMFZYT1JQU1lyclwwMDBWWE9SUFNybVwwMDBWWE9SUFNyclwwMDBWWkVST0FMTFwwMDAiDQorICAgICJWWkVST1VQUEVSXDAwMFZfU0VUMFBEXDAwMFZfU0VUMFBJXDAwMFZfU0VUMFBTXDAwMFZfU0VUQUxMT05FU1wwMDBXQUlUXDAwMCINCisgICAgIldCSU5WRFwwMDBXSU5DQUxMNjRtXDAwMFdJTkNBTEw2NHBjcmVsMzJcMDAwV0lOQ0FMTDY0clwwMDBXUk1TUlwwMDBYQUREIg0KKyAgICAiMTZybVwwMDBYQUREMTZyclwwMDBYQUREMzJybVwwMDBYQUREMzJyclwwMDBYQURENjRybVwwMDBYQURENjRyclwwMDBYQUQiDQorICAgICJEOHJtXDAwMFhBREQ4cnJcMDAwWENIRzE2YXJcMDAwWENIRzE2cm1cMDAwWENIRzE2cnJcMDAwWENIRzMyYXJcMDAwWENIRyINCisgICAgIjMycm1cMDAwWENIRzMycnJcMDAwWENIRzY0YXJcMDAwWENIRzY0cm1cMDAwWENIRzY0cnJcMDAwWENIRzhybVwwMDBYQ0hHIg0KKyAgICAiOHJyXDAwMFhDSF9GXDAwMFhMQVRcMDAwWE9SMTZpMTZcMDAwWE9SMTZtaVwwMDBYT1IxNm1pOFwwMDBYT1IxNm1yXDAwMFgiDQorICAgICJPUjE2cmlcMDAwWE9SMTZyaThcMDAwWE9SMTZybVwwMDBYT1IxNnJyXDAwMFhPUjE2cnJfUkVWXDAwMFhPUjMyaTMyXDAwMCINCisgICAgIlhPUjMybWlcMDAwWE9SMzJtaThcMDAwWE9SMzJtclwwMDBYT1IzMnJpXDAwMFhPUjMycmk4XDAwMFhPUjMycm1cMDAwWE9SIg0KKyAgICAiMzJyclwwMDBYT1IzMnJyX1JFVlwwMDBYT1I2NGkzMlwwMDBYT1I2NG1pMzJcMDAwWE9SNjRtaThcMDAwWE9SNjRtclwwMDAiDQorICAgICJYT1I2NHJpMzJcMDAwWE9SNjRyaThcMDAwWE9SNjRybVwwMDBYT1I2NHJyXDAwMFhPUjY0cnJfUkVWXDAwMFhPUjhpOFwwMDAiDQorICAgICJYT1I4bWlcMDAwWE9SOG1yXDAwMFhPUjhyaVwwMDBYT1I4cm1cMDAwWE9SOHJyXDAwMFhPUjhycl9SRVZcMDAwWE9SUERybSINCisgICAgIlwwMDBYT1JQRHJyXDAwMFhPUlBTcm1cMDAwWE9SUFNyclwwMDAiOw0KKyAgcmV0dXJuIFN0cnMrSW5zdEFzbU9mZnNldFtPcGNvZGVdOw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuQXNtV3JpdGVyMS5pbmMgYi9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuQXNtV3JpdGVyMS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2ODgxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5Bc21Xcml0ZXIxLmluYwpAQCAtMCwwICsxLDg3NzUgQEAKKy8vPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8NCisvLyBBc3NlbWJseSBXcml0ZXIgU291cmNlIEZyYWdtZW50DQorLy8NCisvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCENCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorLy8vIHByaW50SW5zdHJ1Y3Rpb24gLSBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0YWJsZWdlbg0KKy8vLyBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzZXQgZGVzY3JpcHRpb24uDQordm9pZCBYODZJbnRlbEluc3RQcmludGVyOjpwcmludEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHJhd19vc3RyZWFtICZPKSB7DQorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgT3BJbmZvW10gPSB7DQorICAgIDBVLAkvLyBQSEkNCisgICAgMFUsCS8vIElOTElORUFTTQ0KKyAgICAwVSwJLy8gUFJPTE9HX0xBQkVMDQorICAgIDBVLAkvLyBFSF9MQUJFTA0KKyAgICAwVSwJLy8gR0NfTEFCRUwNCisgICAgMFUsCS8vIEtJTEwNCisgICAgMFUsCS8vIEVYVFJBQ1RfU1VCUkVHDQorICAgIDBVLAkvLyBJTlNFUlRfU1VCUkVHDQorICAgIDBVLAkvLyBJTVBMSUNJVF9ERUYNCisgICAgMFUsCS8vIFNVQlJFR19UT19SRUcNCisgICAgMFUsCS8vIENPUFlfVE9fUkVHQ0xBU1MNCisgICAgMVUsCS8vIERCR19WQUxVRQ0KKyAgICAwVSwJLy8gUkVHX1NFUVVFTkNFDQorICAgIDBVLAkvLyBDT1BZDQorICAgIDExVSwJLy8gQUJTX0YNCisgICAgMFUsCS8vIEFCU19GcDMyDQorICAgIDBVLAkvLyBBQlNfRnA2NA0KKyAgICAwVSwJLy8gQUJTX0ZwODANCisgICAgMTM0MjE3NzQ0VSwJLy8gQURDMTZpMTYNCisgICAgMjcyNjI5Nzg2VSwJLy8gQURDMTZtaQ0KKyAgICAyNzI2Mjk3ODZVLAkvLyBBREMxNm1pOA0KKyAgICAyNzI2Mjk3ODZVLAkvLyBBREMxNm1yDQorICAgIDEzODU0MzEzMFUsCS8vIEFEQzE2cmkNCisgICAgMTM4NTQzMTMwVSwJLy8gQURDMTZyaTgNCisgICAgMTM4Njc0MjAyVSwJLy8gQURDMTZybQ0KKyAgICAxMzg1NDMxMzBVLAkvLyBBREMxNnJyDQorICAgIDEzODU0MzEzMFUsCS8vIEFEQzE2cnJfUkVWDQorICAgIDEzNDIxNzc1OVUsCS8vIEFEQzMyaTMyDQorICAgIDQwNjg0NzUxNFUsCS8vIEFEQzMybWkNCisgICAgNDA2ODQ3NTE0VSwJLy8gQURDMzJtaTgNCisgICAgNDA2ODQ3NTE0VSwJLy8gQURDMzJtcg0KKyAgICAxMzg1NDMxMzBVLAkvLyBBREMzMnJpDQorICAgIDEzODU0MzEzMFUsCS8vIEFEQzMycmk4DQorICAgIDEzODgwNTI3NFUsCS8vIEFEQzMycm0NCisgICAgMTM4NTQzMTMwVSwJLy8gQURDMzJycg0KKyAgICAxMzg1NDMxMzBVLAkvLyBBREMzMnJyX1JFVg0KKyAgICAxMzQyMTc3NzBVLAkvLyBBREM2NGkzMg0KKyAgICA1NDEwNjUyNDJVLAkvLyBBREM2NG1pMzINCisgICAgNTQxMDY1MjQyVSwJLy8gQURDNjRtaTgNCisgICAgNTQxMDY1MjQyVSwJLy8gQURDNjRtcg0KKyAgICAxMzg1NDMxMzBVLAkvLyBBREM2NHJpMzINCisgICAgMTM4NTQzMTMwVSwJLy8gQURDNjRyaTgNCisgICAgMTM4OTM2MzQ2VSwJLy8gQURDNjRybQ0KKyAgICAxMzg1NDMxMzBVLAkvLyBBREM2NHJyDQorICAgIDEzODU0MzEzMFUsCS8vIEFEQzY0cnJfUkVWDQorICAgIDEzNDIxNzc4MVUsCS8vIEFEQzhpOA0KKyAgICA2NzUyODI5NzBVLAkvLyBBREM4bWkNCisgICAgNjc1MjgyOTcwVSwJLy8gQURDOG1yDQorICAgIDEzODU0MzEzMFUsCS8vIEFEQzhyaQ0KKyAgICAxMzkwNjc0MThVLAkvLyBBREM4cm0NCisgICAgMTM4NTQzMTMwVSwJLy8gQURDOHJyDQorICAgIDEzODU0MzEzMFUsCS8vIEFEQzhycl9SRVYNCisgICAgMTM0MjE3NzkxVSwJLy8gQUREMTZpMTYNCisgICAgMjcyNjI5ODMzVSwJLy8gQUREMTZtaQ0KKyAgICAyNzI2Mjk4MzNVLAkvLyBBREQxNm1pOA0KKyAgICAyNzI2Mjk4MzNVLAkvLyBBREQxNm1yDQorICAgIDEzODU0MzE3N1UsCS8vIEFERDE2cmkNCisgICAgMTM4NTQzMTc3VSwJLy8gQUREMTZyaTgNCisgICAgMTM4Njc0MjQ5VSwJLy8gQUREMTZybQ0KKyAgICAxMzg1NDMxNzdVLAkvLyBBREQxNnJyDQorICAgIDEzODU0MzE3N1UsCS8vIEFERDE2cnJfYWx0DQorICAgIDEzNDIxNzgwNlUsCS8vIEFERDMyaTMyDQorICAgIDQwNjg0NzU2MVUsCS8vIEFERDMybWkNCisgICAgNDA2ODQ3NTYxVSwJLy8gQUREMzJtaTgNCisgICAgNDA2ODQ3NTYxVSwJLy8gQUREMzJtcg0KKyAgICAxMzg1NDMxNzdVLAkvLyBBREQzMnJpDQorICAgIDEzODU0MzE3N1UsCS8vIEFERDMycmk4DQorICAgIDEzODgwNTMyMVUsCS8vIEFERDMycm0NCisgICAgMTM4NTQzMTc3VSwJLy8gQUREMzJycg0KKyAgICAxMzg1NDMxNzdVLAkvLyBBREQzMnJyX2FsdA0KKyAgICAxMzQyMTc4MTdVLAkvLyBBREQ2NGkzMg0KKyAgICA1NDEwNjUyODlVLAkvLyBBREQ2NG1pMzINCisgICAgNTQxMDY1Mjg5VSwJLy8gQURENjRtaTgNCisgICAgNTQxMDY1Mjg5VSwJLy8gQURENjRtcg0KKyAgICAxMzg1NDMxNzdVLAkvLyBBREQ2NHJpMzINCisgICAgMTM4NTQzMTc3VSwJLy8gQURENjRyaTgNCisgICAgMTM4OTM2MzkzVSwJLy8gQURENjRybQ0KKyAgICAxMzg1NDMxNzdVLAkvLyBBREQ2NHJyDQorICAgIDEzODU0MzE3N1UsCS8vIEFERDY0cnJfYWx0DQorICAgIDEzNDIxNzgyOFUsCS8vIEFERDhpOA0KKyAgICA2NzUyODMwMTdVLAkvLyBBREQ4bWkNCisgICAgNjc1MjgzMDE3VSwJLy8gQUREOG1yDQorICAgIDEzODU0MzE3N1UsCS8vIEFERDhyaQ0KKyAgICAxMzkwNjc0NjVVLAkvLyBBREQ4cm0NCisgICAgMTM4NTQzMTc3VSwJLy8gQUREOHJyDQorICAgIDEzODU0MzE3N1UsCS8vIEFERDhycl9hbHQNCisgICAgMTM5MTk4NTc0VSwJLy8gQUREUERybQ0KKyAgICAxMzg1NDMyMTRVLAkvLyBBRERQRHJyDQorICAgIDEzOTE5ODU4MVUsCS8vIEFERFBTcm0NCisgICAgMTM4NTQzMjIxVSwJLy8gQUREUFNycg0KKyAgICAxMzkzMjk2NjBVLAkvLyBBRERTRHJtDQorICAgIDEzOTMyOTY2MFUsCS8vIEFERFNEcm1fSW50DQorICAgIDEzODU0MzIyOFUsCS8vIEFERFNEcnINCisgICAgMTM4NTQzMjI4VSwJLy8gQUREU0Rycl9JbnQNCisgICAgMTM5NDYwNzM5VSwJLy8gQUREU1NybQ0KKyAgICAxMzk0NjA3MzlVLAkvLyBBRERTU3JtX0ludA0KKyAgICAxMzg1NDMyMzVVLAkvLyBBRERTU3JyDQorICAgIDEzODU0MzIzNVUsCS8vIEFERFNTcnJfSW50DQorICAgIDEzOTE5ODYwMlUsCS8vIEFERFNVQlBEcm0NCisgICAgMTM4NTQzMjQyVSwJLy8gQUREU1VCUERycg0KKyAgICAxMzkxOTg2MTJVLAkvLyBBRERTVUJQU3JtDQorICAgIDEzODU0MzI1MlUsCS8vIEFERFNVQlBTcnINCisgICAgODA1MzA2NTI2VSwJLy8gQUREX0YzMm0NCisgICAgOTM5NTI0MjU0VSwJLy8gQUREX0Y2NG0NCisgICAgMjY4NDM1NjIwVSwJLy8gQUREX0ZJMTZtDQorICAgIDQwMjY1MzM0OFUsCS8vIEFERF9GSTMybQ0KKyAgICAxMzQyMTc4OTlVLAkvLyBBRERfRlByU1QwDQorICAgIDEzNDIxNzg4NlUsCS8vIEFERF9GU1Qwcg0KKyAgICAwVSwJLy8gQUREX0ZwMzINCisgICAgMFUsCS8vIEFERF9GcDMybQ0KKyAgICAwVSwJLy8gQUREX0ZwNjQNCisgICAgMFUsCS8vIEFERF9GcDY0bQ0KKyAgICAwVSwJLy8gQUREX0ZwNjRtMzINCisgICAgMFUsCS8vIEFERF9GcDgwDQorICAgIDBVLAkvLyBBRERfRnA4MG0zMg0KKyAgICAwVSwJLy8gQUREX0ZwODBtNjQNCisgICAgMFUsCS8vIEFERF9GcEkxNm0zMg0KKyAgICAwVSwJLy8gQUREX0ZwSTE2bTY0DQorICAgIDBVLAkvLyBBRERfRnBJMTZtODANCisgICAgMFUsCS8vIEFERF9GcEkzMm0zMg0KKyAgICAwVSwJLy8gQUREX0ZwSTMybTY0DQorICAgIDBVLAkvLyBBRERfRnBJMzJtODANCisgICAgMTQyNjA2NDk0VSwJLy8gQUREX0ZyU1QwDQorICAgIDE3OFUsCS8vIEFESkNBTExTVEFDS0RPV04zMg0KKyAgICAxNzhVLAkvLyBBREpDQUxMU1RBQ0tET1dONjQNCisgICAgMTk2VSwJLy8gQURKQ0FMTFNUQUNLVVAzMg0KKyAgICAxOTZVLAkvLyBBREpDQUxMU1RBQ0tVUDY0DQorICAgIDEzOTU5MTg5MlUsCS8vIEFFU0RFQ0xBU1RybQ0KKyAgICAxMzg1NDMzMTZVLAkvLyBBRVNERUNMQVNUcnINCisgICAgMTM5NTkxOTA0VSwJLy8gQUVTREVDcm0NCisgICAgMTM4NTQzMzI4VSwJLy8gQUVTREVDcnINCisgICAgMTM5NTkxOTEyVSwJLy8gQUVTRU5DTEFTVHJtDQorICAgIDEzODU0MzMzNlUsCS8vIEFFU0VOQ0xBU1Rycg0KKyAgICAxMzk1OTE5MjRVLAkvLyBBRVNFTkNybQ0KKyAgICAxMzg1NDMzNDhVLAkvLyBBRVNFTkNycg0KKyAgICAxMzk3MjMwMDRVLAkvLyBBRVNJTUNybQ0KKyAgICAxMzk4NTQwNzZVLAkvLyBBRVNJTUNycg0KKyAgICAxMzk3MjMwMTJVLAkvLyBBRVNLRVlHRU5BU1NJU1QxMjhybQ0KKyAgICAxMzk4NTQwODRVLAkvLyBBRVNLRVlHRU5BU1NJU1QxMjhycg0KKyAgICAxMzQyMTgwMDVVLAkvLyBBTkQxNmkxNg0KKyAgICAyNzI2MzAwNDdVLAkvLyBBTkQxNm1pDQorICAgIDI3MjYzMDA0N1UsCS8vIEFORDE2bWk4DQorICAgIDI3MjYzMDA0N1UsCS8vIEFORDE2bXINCisgICAgMTM4NTQzMzkxVSwJLy8gQU5EMTZyaQ0KKyAgICAxMzg1NDMzOTFVLAkvLyBBTkQxNnJpOA0KKyAgICAxMzg2NzQ0NjNVLAkvLyBBTkQxNnJtDQorICAgIDEzODU0MzM5MVUsCS8vIEFORDE2cnINCisgICAgMTM4NTQzMzkxVSwJLy8gQU5EMTZycl9SRVYNCisgICAgMTM0MjE4MDIwVSwJLy8gQU5EMzJpMzINCisgICAgNDA2ODQ3Nzc1VSwJLy8gQU5EMzJtaQ0KKyAgICA0MDY4NDc3NzVVLAkvLyBBTkQzMm1pOA0KKyAgICA0MDY4NDc3NzVVLAkvLyBBTkQzMm1yDQorICAgIDEzODU0MzM5MVUsCS8vIEFORDMycmkNCisgICAgMTM4NTQzMzkxVSwJLy8gQU5EMzJyaTgNCisgICAgMTM4ODA1NTM1VSwJLy8gQU5EMzJybQ0KKyAgICAxMzg1NDMzOTFVLAkvLyBBTkQzMnJyDQorICAgIDEzODU0MzM5MVUsCS8vIEFORDMycnJfUkVWDQorICAgIDEzNDIxODAzMVUsCS8vIEFORDY0aTMyDQorICAgIDU0MTA2NTUwM1UsCS8vIEFORDY0bWkzMg0KKyAgICA1NDEwNjU1MDNVLAkvLyBBTkQ2NG1pOA0KKyAgICA1NDEwNjU1MDNVLAkvLyBBTkQ2NG1yDQorICAgIDEzODU0MzM5MVUsCS8vIEFORDY0cmkzMg0KKyAgICAxMzg1NDMzOTFVLAkvLyBBTkQ2NHJpOA0KKyAgICAxMzg5MzY2MDdVLAkvLyBBTkQ2NHJtDQorICAgIDEzODU0MzM5MVUsCS8vIEFORDY0cnINCisgICAgMTM4NTQzMzkxVSwJLy8gQU5ENjRycl9SRVYNCisgICAgMTM0MjE4MDQyVSwJLy8gQU5EOGk4DQorICAgIDY3NTI4MzIzMVUsCS8vIEFORDhtaQ0KKyAgICA2NzUyODMyMzFVLAkvLyBBTkQ4bXINCisgICAgMTM4NTQzMzkxVSwJLy8gQU5EOHJpDQorICAgIDEzOTA2NzY3OVUsCS8vIEFORDhybQ0KKyAgICAxMzg1NDMzOTFVLAkvLyBBTkQ4cnINCisgICAgMTM4NTQzMzkxVSwJLy8gQU5EOHJyX1JFVg0KKyAgICAxMzkxOTg3ODhVLAkvLyBBTkROUERybQ0KKyAgICAxMzg1NDM0MjhVLAkvLyBBTkROUERycg0KKyAgICAxMzkxOTg3OTZVLAkvLyBBTkROUFNybQ0KKyAgICAxMzg1NDM0MzZVLAkvLyBBTkROUFNycg0KKyAgICAxMzkxOTg4MDRVLAkvLyBBTkRQRHJtDQorICAgIDEzODU0MzQ0NFUsCS8vIEFORFBEcnINCisgICAgMTM5MTk4ODExVSwJLy8gQU5EUFNybQ0KKyAgICAxMzg1NDM0NTFVLAkvLyBBTkRQU3JyDQorICAgIDM1NFUsCS8vIEFUT01BREQ2NDMyDQorICAgIDM3NVUsCS8vIEFUT01BTkQxNg0KKyAgICAzOTRVLAkvLyBBVE9NQU5EMzINCisgICAgNDEzVSwJLy8gQVRPTUFORDY0DQorICAgIDQzMlUsCS8vIEFUT01BTkQ2NDMyDQorICAgIDQ1M1UsCS8vIEFUT01BTkQ4DQorICAgIDQ3MVUsCS8vIEFUT01NQVgxNg0KKyAgICA0OTBVLAkvLyBBVE9NTUFYMzINCisgICAgNTA5VSwJLy8gQVRPTU1BWDY0DQorICAgIDUyOFUsCS8vIEFUT01NSU4xNg0KKyAgICA1NDdVLAkvLyBBVE9NTUlOMzINCisgICAgNTY2VSwJLy8gQVRPTU1JTjY0DQorICAgIDU4NVUsCS8vIEFUT01OQU5EMTYNCisgICAgNjA1VSwJLy8gQVRPTU5BTkQzMg0KKyAgICA2MjVVLAkvLyBBVE9NTkFORDY0DQorICAgIDY0NVUsCS8vIEFUT01OQU5ENjQzMg0KKyAgICA2NjdVLAkvLyBBVE9NTkFORDgNCisgICAgNjg2VSwJLy8gQVRPTU9SMTYNCisgICAgNzA0VSwJLy8gQVRPTU9SMzINCisgICAgNzIyVSwJLy8gQVRPTU9SNjQNCisgICAgNzQwVSwJLy8gQVRPTU9SNjQzMg0KKyAgICA3NjBVLAkvLyBBVE9NT1I4DQorICAgIDc3N1UsCS8vIEFUT01TVUI2NDMyDQorICAgIDc5OFUsCS8vIEFUT01TV0FQNjQzMg0KKyAgICA4MjBVLAkvLyBBVE9NVU1BWDE2DQorICAgIDg0MFUsCS8vIEFUT01VTUFYMzINCisgICAgODYwVSwJLy8gQVRPTVVNQVg2NA0KKyAgICA4ODBVLAkvLyBBVE9NVU1JTjE2DQorICAgIDkwMFUsCS8vIEFUT01VTUlOMzINCisgICAgOTIwVSwJLy8gQVRPTVVNSU42NA0KKyAgICA5NDBVLAkvLyBBVE9NWE9SMTYNCisgICAgOTU5VSwJLy8gQVRPTVhPUjMyDQorICAgIDk3OFUsCS8vIEFUT01YT1I2NA0KKyAgICA5OTdVLAkvLyBBVE9NWE9SNjQzMg0KKyAgICAxMDE4VSwJLy8gQVRPTVhPUjgNCisgICAgMTM5NTkyNzE2VSwJLy8gQkxFTkRQRHJtaQ0KKyAgICAxMzg1NDQxNDBVLAkvLyBCTEVORFBEcnJpDQorICAgIDEzOTU5MjcyNVUsCS8vIEJMRU5EUFNybWkNCisgICAgMTM4NTQ0MTQ5VSwJLy8gQkxFTkRQU3JyaQ0KKyAgICAxMzk1OTI3MzRVLAkvLyBCTEVORFZQRHJtMA0KKyAgICAxMzg1NDQxNThVLAkvLyBCTEVORFZQRHJyMA0KKyAgICAxMzk1OTI3NDRVLAkvLyBCTEVORFZQU3JtMA0KKyAgICAxMzg1NDQxNjhVLAkvLyBCTEVORFZQU3JyMA0KKyAgICAxMzk5ODU5NzBVLAkvLyBCU0YxNnJtDQorICAgIDEzOTg1NDg5OFUsCS8vIEJTRjE2cnINCisgICAgMTQwMTE3MDQyVSwJLy8gQlNGMzJybQ0KKyAgICAxMzk4NTQ4OThVLAkvLyBCU0YzMnJyDQorICAgIDE0MDI0ODExNFUsCS8vIEJTRjY0cm0NCisgICAgMTM5ODU0ODk4VSwJLy8gQlNGNjRycg0KKyAgICAxMzk5ODU5NzVVLAkvLyBCU1IxNnJtDQorICAgIDEzOTg1NDkwM1UsCS8vIEJTUjE2cnINCisgICAgMTQwMTE3MDQ3VSwJLy8gQlNSMzJybQ0KKyAgICAxMzk4NTQ5MDNVLAkvLyBCU1IzMnJyDQorICAgIDE0MDI0ODExOVUsCS8vIEJTUjY0cm0NCisgICAgMTM5ODU0OTAzVSwJLy8gQlNSNjRycg0KKyAgICAxMzQyMTg4MTJVLAkvLyBCU1dBUDMycg0KKyAgICAxMzQyMTg4MTJVLAkvLyBCU1dBUDY0cg0KKyAgICAyNzI2MzA4NTFVLAkvLyBCVDE2bWk4DQorICAgIDI3MjYzMDg1MVUsCS8vIEJUMTZtcg0KKyAgICAxMzk4NTQ5MTVVLAkvLyBCVDE2cmk4DQorICAgIDEzOTg1NDkxNVUsCS8vIEJUMTZycg0KKyAgICA0MDY4NDg1NzlVLAkvLyBCVDMybWk4DQorICAgIDQwNjg0ODU3OVUsCS8vIEJUMzJtcg0KKyAgICAxMzk4NTQ5MTVVLAkvLyBCVDMycmk4DQorICAgIDEzOTg1NDkxNVUsCS8vIEJUMzJycg0KKyAgICA1NDEwNjYzMDdVLAkvLyBCVDY0bWk4DQorICAgIDU0MTA2NjMwN1UsCS8vIEJUNjRtcg0KKyAgICAxMzk4NTQ5MTVVLAkvLyBCVDY0cmk4DQorICAgIDEzOTg1NDkxNVUsCS8vIEJUNjRycg0KKyAgICAyNzI2MzA4NTVVLAkvLyBCVEMxNm1pOA0KKyAgICAyNzI2MzA4NTVVLAkvLyBCVEMxNm1yDQorICAgIDEzOTg1NDkxOVUsCS8vIEJUQzE2cmk4DQorICAgIDEzOTg1NDkxOVUsCS8vIEJUQzE2cnINCisgICAgNDA2ODQ4NTgzVSwJLy8gQlRDMzJtaTgNCisgICAgNDA2ODQ4NTgzVSwJLy8gQlRDMzJtcg0KKyAgICAxMzk4NTQ5MTlVLAkvLyBCVEMzMnJpOA0KKyAgICAxMzk4NTQ5MTlVLAkvLyBCVEMzMnJyDQorICAgIDU0MTA2NjMxMVUsCS8vIEJUQzY0bWk4DQorICAgIDU0MTA2NjMxMVUsCS8vIEJUQzY0bXINCisgICAgMTM5ODU0OTE5VSwJLy8gQlRDNjRyaTgNCisgICAgMTM5ODU0OTE5VSwJLy8gQlRDNjRycg0KKyAgICAyNzI2MzA4NjBVLAkvLyBCVFIxNm1pOA0KKyAgICAyNzI2MzA4NjBVLAkvLyBCVFIxNm1yDQorICAgIDEzOTg1NDkyNFUsCS8vIEJUUjE2cmk4DQorICAgIDEzOTg1NDkyNFUsCS8vIEJUUjE2cnINCisgICAgNDA2ODQ4NTg4VSwJLy8gQlRSMzJtaTgNCisgICAgNDA2ODQ4NTg4VSwJLy8gQlRSMzJtcg0KKyAgICAxMzk4NTQ5MjRVLAkvLyBCVFIzMnJpOA0KKyAgICAxMzk4NTQ5MjRVLAkvLyBCVFIzMnJyDQorICAgIDU0MTA2NjMxNlUsCS8vIEJUUjY0bWk4DQorICAgIDU0MTA2NjMxNlUsCS8vIEJUUjY0bXINCisgICAgMTM5ODU0OTI0VSwJLy8gQlRSNjRyaTgNCisgICAgMTM5ODU0OTI0VSwJLy8gQlRSNjRycg0KKyAgICAyNzI2MzA4NjVVLAkvLyBCVFMxNm1pOA0KKyAgICAyNzI2MzA4NjVVLAkvLyBCVFMxNm1yDQorICAgIDEzOTg1NDkyOVUsCS8vIEJUUzE2cmk4DQorICAgIDEzOTg1NDkyOVUsCS8vIEJUUzE2cnINCisgICAgNDA2ODQ4NTkzVSwJLy8gQlRTMzJtaTgNCisgICAgNDA2ODQ4NTkzVSwJLy8gQlRTMzJtcg0KKyAgICAxMzk4NTQ5MjlVLAkvLyBCVFMzMnJpOA0KKyAgICAxMzk4NTQ5MjlVLAkvLyBCVFMzMnJyDQorICAgIDU0MTA2NjMyMVUsCS8vIEJUUzY0bWk4DQorICAgIDU0MTA2NjMyMVUsCS8vIEJUUzY0bXINCisgICAgMTM5ODU0OTI5VSwJLy8gQlRTNjRyaTgNCisgICAgMTM5ODU0OTI5VSwJLy8gQlRTNjRycg0KKyAgICA0MDI2NTQyOTRVLAkvLyBDQUxMMzJtDQorICAgIDEzNDIxODgzOFUsCS8vIENBTEwzMnINCisgICAgNTM2ODcyMDIyVSwJLy8gQ0FMTDY0bQ0KKyAgICAxMDczNzQyOTM0VSwJLy8gQ0FMTDY0cGNyZWwzMg0KKyAgICAxMzQyMTg4MzhVLAkvLyBDQUxMNjRyDQorICAgIDEwNzM3NDI5NDBVLAkvLyBDQUxMcGNyZWwxNg0KKyAgICAxMDczNzQyOTM0VSwJLy8gQ0FMTHBjcmVsMzINCisgICAgMTEyM1UsCS8vIENCVw0KKyAgICAxMTI3VSwJLy8gQ0RRDQorICAgIDExMzFVLAkvLyBDRFFFDQorICAgIDExMzZVLAkvLyBDSFNfRg0KKyAgICAwVSwJLy8gQ0hTX0ZwMzINCisgICAgMFUsCS8vIENIU19GcDY0DQorICAgIDBVLAkvLyBDSFNfRnA4MA0KKyAgICAxMTQxVSwJLy8gQ0xDDQorICAgIDExNDVVLAkvLyBDTEQNCisgICAgNjcxMDg5Nzg5VSwJLy8gQ0xGTFVTSA0KKyAgICAxMTU4VSwJLy8gQ0xJDQorICAgIDExNjJVLAkvLyBDTFRTDQorICAgIDExNjdVLAkvLyBDTUMNCisgICAgMTM4Njc1MzQ3VSwJLy8gQ01PVkExNnJtDQorICAgIDEzODU0NDI3NVUsCS8vIENNT1ZBMTZycg0KKyAgICAxMzg4MDY0MTlVLAkvLyBDTU9WQTMycm0NCisgICAgMTM4NTQ0Mjc1VSwJLy8gQ01PVkEzMnJyDQorICAgIDEzODkzNzQ5MVUsCS8vIENNT1ZBNjRybQ0KKyAgICAxMzg1NDQyNzVVLAkvLyBDTU9WQTY0cnINCisgICAgMTM4Njc1MzU0VSwJLy8gQ01PVkFFMTZybQ0KKyAgICAxMzg1NDQyODJVLAkvLyBDTU9WQUUxNnJyDQorICAgIDEzODgwNjQyNlUsCS8vIENNT1ZBRTMycm0NCisgICAgMTM4NTQ0MjgyVSwJLy8gQ01PVkFFMzJycg0KKyAgICAxMzg5Mzc0OThVLAkvLyBDTU9WQUU2NHJtDQorICAgIDEzODU0NDI4MlUsCS8vIENNT1ZBRTY0cnINCisgICAgMTM4Njc1MzYyVSwJLy8gQ01PVkIxNnJtDQorICAgIDEzODU0NDI5MFUsCS8vIENNT1ZCMTZycg0KKyAgICAxMzg4MDY0MzRVLAkvLyBDTU9WQjMycm0NCisgICAgMTM4NTQ0MjkwVSwJLy8gQ01PVkIzMnJyDQorICAgIDEzODkzNzUwNlUsCS8vIENNT1ZCNjRybQ0KKyAgICAxMzg1NDQyOTBVLAkvLyBDTU9WQjY0cnINCisgICAgMTM4Njc1MzY5VSwJLy8gQ01PVkJFMTZybQ0KKyAgICAxMzg1NDQyOTdVLAkvLyBDTU9WQkUxNnJyDQorICAgIDEzODgwNjQ0MVUsCS8vIENNT1ZCRTMycm0NCisgICAgMTM4NTQ0Mjk3VSwJLy8gQ01PVkJFMzJycg0KKyAgICAxMzg5Mzc1MTNVLAkvLyBDTU9WQkU2NHJtDQorICAgIDEzODU0NDI5N1UsCS8vIENNT1ZCRTY0cnINCisgICAgMTM0MjE4OTI5VSwJLy8gQ01PVkJFX0YNCisgICAgMFUsCS8vIENNT1ZCRV9GcDMyDQorICAgIDBVLAkvLyBDTU9WQkVfRnA2NA0KKyAgICAwVSwJLy8gQ01PVkJFX0ZwODANCisgICAgMTM0MjE4OTQ2VSwJLy8gQ01PVkJfRg0KKyAgICAwVSwJLy8gQ01PVkJfRnAzMg0KKyAgICAwVSwJLy8gQ01PVkJfRnA2NA0KKyAgICAwVSwJLy8gQ01PVkJfRnA4MA0KKyAgICAxMzg2NzU0MTBVLAkvLyBDTU9WRTE2cm0NCisgICAgMTM4NTQ0MzM4VSwJLy8gQ01PVkUxNnJyDQorICAgIDEzODgwNjQ4MlUsCS8vIENNT1ZFMzJybQ0KKyAgICAxMzg1NDQzMzhVLAkvLyBDTU9WRTMycnINCisgICAgMTM4OTM3NTU0VSwJLy8gQ01PVkU2NHJtDQorICAgIDEzODU0NDMzOFUsCS8vIENNT1ZFNjRycg0KKyAgICAxMzQyMTg5NjlVLAkvLyBDTU9WRV9GDQorICAgIDBVLAkvLyBDTU9WRV9GcDMyDQorICAgIDBVLAkvLyBDTU9WRV9GcDY0DQorICAgIDBVLAkvLyBDTU9WRV9GcDgwDQorICAgIDEzODY3NTQzM1UsCS8vIENNT1ZHMTZybQ0KKyAgICAxMzg1NDQzNjFVLAkvLyBDTU9WRzE2cnINCisgICAgMTM4ODA2NTA1VSwJLy8gQ01PVkczMnJtDQorICAgIDEzODU0NDM2MVUsCS8vIENNT1ZHMzJycg0KKyAgICAxMzg5Mzc1NzdVLAkvLyBDTU9WRzY0cm0NCisgICAgMTM4NTQ0MzYxVSwJLy8gQ01PVkc2NHJyDQorICAgIDEzODY3NTQ0MFUsCS8vIENNT1ZHRTE2cm0NCisgICAgMTM4NTQ0MzY4VSwJLy8gQ01PVkdFMTZycg0KKyAgICAxMzg4MDY1MTJVLAkvLyBDTU9WR0UzMnJtDQorICAgIDEzODU0NDM2OFUsCS8vIENNT1ZHRTMycnINCisgICAgMTM4OTM3NTg0VSwJLy8gQ01PVkdFNjRybQ0KKyAgICAxMzg1NDQzNjhVLAkvLyBDTU9WR0U2NHJyDQorICAgIDEzODY3NTQ0OFUsCS8vIENNT1ZMMTZybQ0KKyAgICAxMzg1NDQzNzZVLAkvLyBDTU9WTDE2cnINCisgICAgMTM4ODA2NTIwVSwJLy8gQ01PVkwzMnJtDQorICAgIDEzODU0NDM3NlUsCS8vIENNT1ZMMzJycg0KKyAgICAxMzg5Mzc1OTJVLAkvLyBDTU9WTDY0cm0NCisgICAgMTM4NTQ0Mzc2VSwJLy8gQ01PVkw2NHJyDQorICAgIDEzODY3NTQ1NVUsCS8vIENNT1ZMRTE2cm0NCisgICAgMTM4NTQ0MzgzVSwJLy8gQ01PVkxFMTZycg0KKyAgICAxMzg4MDY1MjdVLAkvLyBDTU9WTEUzMnJtDQorICAgIDEzODU0NDM4M1UsCS8vIENNT1ZMRTMycnINCisgICAgMTM4OTM3NTk5VSwJLy8gQ01PVkxFNjRybQ0KKyAgICAxMzg1NDQzODNVLAkvLyBDTU9WTEU2NHJyDQorICAgIDEzNDIxOTAxNVUsCS8vIENNT1ZOQkVfRg0KKyAgICAwVSwJLy8gQ01PVk5CRV9GcDMyDQorICAgIDBVLAkvLyBDTU9WTkJFX0ZwNjQNCisgICAgMFUsCS8vIENNT1ZOQkVfRnA4MA0KKyAgICAxMzQyMTkwMzNVLAkvLyBDTU9WTkJfRg0KKyAgICAwVSwJLy8gQ01PVk5CX0ZwMzINCisgICAgMFUsCS8vIENNT1ZOQl9GcDY0DQorICAgIDBVLAkvLyBDTU9WTkJfRnA4MA0KKyAgICAxMzg2NzU0OThVLAkvLyBDTU9WTkUxNnJtDQorICAgIDEzODU0NDQyNlUsCS8vIENNT1ZORTE2cnINCisgICAgMTM4ODA2NTcwVSwJLy8gQ01PVk5FMzJybQ0KKyAgICAxMzg1NDQ0MjZVLAkvLyBDTU9WTkUzMnJyDQorICAgIDEzODkzNzY0MlUsCS8vIENNT1ZORTY0cm0NCisgICAgMTM4NTQ0NDI2VSwJLy8gQ01PVk5FNjRycg0KKyAgICAxMzQyMTkwNThVLAkvLyBDTU9WTkVfRg0KKyAgICAwVSwJLy8gQ01PVk5FX0ZwMzINCisgICAgMFUsCS8vIENNT1ZORV9GcDY0DQorICAgIDBVLAkvLyBDTU9WTkVfRnA4MA0KKyAgICAxMzg2NzU1MjNVLAkvLyBDTU9WTk8xNnJtDQorICAgIDEzODU0NDQ1MVUsCS8vIENNT1ZOTzE2cnINCisgICAgMTM4ODA2NTk1VSwJLy8gQ01PVk5PMzJybQ0KKyAgICAxMzg1NDQ0NTFVLAkvLyBDTU9WTk8zMnJyDQorICAgIDEzODkzNzY2N1UsCS8vIENNT1ZOTzY0cm0NCisgICAgMTM4NTQ0NDUxVSwJLy8gQ01PVk5PNjRycg0KKyAgICAxMzg2NzU1MzFVLAkvLyBDTU9WTlAxNnJtDQorICAgIDEzODU0NDQ1OVUsCS8vIENNT1ZOUDE2cnINCisgICAgMTM4ODA2NjAzVSwJLy8gQ01PVk5QMzJybQ0KKyAgICAxMzg1NDQ0NTlVLAkvLyBDTU9WTlAzMnJyDQorICAgIDEzODkzNzY3NVUsCS8vIENNT1ZOUDY0cm0NCisgICAgMTM4NTQ0NDU5VSwJLy8gQ01PVk5QNjRycg0KKyAgICAxMzQyMTkwOTFVLAkvLyBDTU9WTlBfRg0KKyAgICAwVSwJLy8gQ01PVk5QX0ZwMzINCisgICAgMFUsCS8vIENNT1ZOUF9GcDY0DQorICAgIDBVLAkvLyBDTU9WTlBfRnA4MA0KKyAgICAxMzg2NzU1NTZVLAkvLyBDTU9WTlMxNnJtDQorICAgIDEzODU0NDQ4NFUsCS8vIENNT1ZOUzE2cnINCisgICAgMTM4ODA2NjI4VSwJLy8gQ01PVk5TMzJybQ0KKyAgICAxMzg1NDQ0ODRVLAkvLyBDTU9WTlMzMnJyDQorICAgIDEzODkzNzcwMFUsCS8vIENNT1ZOUzY0cm0NCisgICAgMTM4NTQ0NDg0VSwJLy8gQ01PVk5TNjRycg0KKyAgICAxMzg2NzU1NjRVLAkvLyBDTU9WTzE2cm0NCisgICAgMTM4NTQ0NDkyVSwJLy8gQ01PVk8xNnJyDQorICAgIDEzODgwNjYzNlUsCS8vIENNT1ZPMzJybQ0KKyAgICAxMzg1NDQ0OTJVLAkvLyBDTU9WTzMycnINCisgICAgMTM4OTM3NzA4VSwJLy8gQ01PVk82NHJtDQorICAgIDEzODU0NDQ5MlUsCS8vIENNT1ZPNjRycg0KKyAgICAxMzg2NzU1NzFVLAkvLyBDTU9WUDE2cm0NCisgICAgMTM4NTQ0NDk5VSwJLy8gQ01PVlAxNnJyDQorICAgIDEzODgwNjY0M1UsCS8vIENNT1ZQMzJybQ0KKyAgICAxMzg1NDQ0OTlVLAkvLyBDTU9WUDMycnINCisgICAgMTM4OTM3NzE1VSwJLy8gQ01PVlA2NHJtDQorICAgIDEzODU0NDQ5OVUsCS8vIENNT1ZQNjRycg0KKyAgICAxMzQyMTkxMzBVLAkvLyBDTU9WUF9GDQorICAgIDBVLAkvLyBDTU9WUF9GcDMyDQorICAgIDBVLAkvLyBDTU9WUF9GcDY0DQorICAgIDBVLAkvLyBDTU9WUF9GcDgwDQorICAgIDEzODY3NTU5NVUsCS8vIENNT1ZTMTZybQ0KKyAgICAxMzg1NDQ1MjNVLAkvLyBDTU9WUzE2cnINCisgICAgMTM4ODA2NjY3VSwJLy8gQ01PVlMzMnJtDQorICAgIDEzODU0NDUyM1UsCS8vIENNT1ZTMzJycg0KKyAgICAxMzg5Mzc3MzlVLAkvLyBDTU9WUzY0cm0NCisgICAgMTM4NTQ0NTIzVSwJLy8gQ01PVlM2NHJyDQorICAgIDE0MjZVLAkvLyBDTU9WX0ZSMzINCisgICAgMTQ0NVUsCS8vIENNT1ZfRlI2NA0KKyAgICAxNDY0VSwJLy8gQ01PVl9HUjE2DQorICAgIDE0ODRVLAkvLyBDTU9WX0dSMzINCisgICAgMTUwNFUsCS8vIENNT1ZfR1I4DQorICAgIDE1MjJVLAkvLyBDTU9WX1JGUDMyDQorICAgIDE1NDJVLAkvLyBDTU9WX1JGUDY0DQorICAgIDE1NjJVLAkvLyBDTU9WX1JGUDgwDQorICAgIDE1ODJVLAkvLyBDTU9WX1YxSTY0DQorICAgIDE2MDJVLAkvLyBDTU9WX1YyRjY0DQorICAgIDE2MjJVLAkvLyBDTU9WX1YySTY0DQorICAgIDE2NDJVLAkvLyBDTU9WX1Y0RjMyDQorICAgIDEzNDIxOTM5MFUsCS8vIENNUDE2aTE2DQorICAgIDI3MjYzMTQzMlUsCS8vIENNUDE2bWkNCisgICAgMjcyNjMxNDMyVSwJLy8gQ01QMTZtaTgNCisgICAgMjcyNjMxNDMyVSwJLy8gQ01QMTZtcg0KKyAgICAxMzk4NTU0OTZVLAkvLyBDTVAxNnJpDQorICAgIDEzOTg1NTQ5NlUsCS8vIENNUDE2cmk4DQorICAgIDEzOTk4NjU2OFUsCS8vIENNUDE2cm0NCisgICAgMTM5ODU1NDk2VSwJLy8gQ01QMTZycg0KKyAgICAxMzk4NTU0OTZVLAkvLyBDTVAxNnJyX2FsdA0KKyAgICAxMzQyMTk0MDVVLAkvLyBDTVAzMmkzMg0KKyAgICA0MDY4NDkxNjBVLAkvLyBDTVAzMm1pDQorICAgIDQwNjg0OTE2MFUsCS8vIENNUDMybWk4DQorICAgIDQwNjg0OTE2MFUsCS8vIENNUDMybXINCisgICAgMTM5ODU1NDk2VSwJLy8gQ01QMzJyaQ0KKyAgICAxMzk4NTU0OTZVLAkvLyBDTVAzMnJpOA0KKyAgICAxNDAxMTc2NDBVLAkvLyBDTVAzMnJtDQorICAgIDEzOTg1NTQ5NlUsCS8vIENNUDMycnINCisgICAgMTM5ODU1NDk2VSwJLy8gQ01QMzJycl9hbHQNCisgICAgMTM0MjE5NDE2VSwJLy8gQ01QNjRpMzINCisgICAgNTQxMDY2ODg4VSwJLy8gQ01QNjRtaTMyDQorICAgIDU0MTA2Njg4OFUsCS8vIENNUDY0bWk4DQorICAgIDU0MTA2Njg4OFUsCS8vIENNUDY0bXINCisgICAgMTM5ODU1NDk2VSwJLy8gQ01QNjRtcm1ycg0KKyAgICAxMzk4NTU0OTZVLAkvLyBDTVA2NHJpMzINCisgICAgMTM5ODU1NDk2VSwJLy8gQ01QNjRyaTgNCisgICAgMTQwMjQ4NzEyVSwJLy8gQ01QNjRybQ0KKyAgICAxMzk4NTU0OTZVLAkvLyBDTVA2NHJyDQorICAgIDEzNDIxOTQyN1UsCS8vIENNUDhpOA0KKyAgICA2NzUyODQ2MTZVLAkvLyBDTVA4bWkNCisgICAgNjc1Mjg0NjE2VSwJLy8gQ01QOG1yDQorICAgIDEzOTg1NTQ5NlUsCS8vIENNUDhyaQ0KKyAgICAxNDAzNzk3ODRVLAkvLyBDTVA4cm0NCisgICAgMTM5ODU1NDk2VSwJLy8gQ01QOHJyDQorICAgIDEzOTg1NTQ5NlUsCS8vIENNUDhycl9hbHQNCisgICAgMTIyMTMzMDYwNVUsCS8vIENNUFBEcm1pDQorICAgIDEzOTIwMDE3N1UsCS8vIENNUFBEcm1pX2FsdA0KKyAgICAxMzU0ODkyOTczVSwJLy8gQ01QUERycmkNCisgICAgMTM4NTQ0ODE3VSwJLy8gQ01QUERycmlfYWx0DQorICAgIDEyMjU1MjQ5MDlVLAkvLyBDTVBQU3JtaQ0KKyAgICAxMzkyMDAxODRVLAkvLyBDTVBQU3JtaV9hbHQNCisgICAgMTM1OTA4NzI3N1UsCS8vIENNUFBTcnJpDQorICAgIDEzODU0NDgyNFUsCS8vIENNUFBTcnJpX2FsdA0KKyAgICAxNzI3VSwJLy8gQ01QUzE2DQorICAgIDE3MjdVLAkvLyBDTVBTMzINCisgICAgMTczMlUsCS8vIENNUFM2NA0KKyAgICAxNzI3VSwJLy8gQ01QUzgNCisgICAgMTIyOTg1MDI4NVUsCS8vIENNUFNEcm0NCisgICAgMTM5MzMxMjc0VSwJLy8gQ01QU0RybV9hbHQNCisgICAgMTM2MzI4MTU4MVUsCS8vIENNUFNEcnINCisgICAgMTM4NTQ0ODQyVSwJLy8gQ01QU0Rycl9hbHQNCisgICAgMTIzNDE3NTY2MVUsCS8vIENNUFNTcm0NCisgICAgMTM5NDYyMzUzVSwJLy8gQ01QU1NybV9hbHQNCisgICAgMTM2NzQ3NTg4NVUsCS8vIENNUFNTcnINCisgICAgMTM4NTQ0ODQ5VSwJLy8gQ01QU1Nycl9hbHQNCisgICAgMTQ3NjM5Njc2MFUsCS8vIENNUFhDSEcxNkINCisgICAgMjcyNjMxNTI0VSwJLy8gQ01QWENIRzE2cm0NCisgICAgMTM5ODU1NTg4VSwJLy8gQ01QWENIRzE2cnINCisgICAgNDA2ODQ5MjUyVSwJLy8gQ01QWENIRzMycm0NCisgICAgMTM5ODU1NTg4VSwJLy8gQ01QWENIRzMycnINCisgICAgNTQxMDY2OTgwVSwJLy8gQ01QWENIRzY0cm0NCisgICAgMTM5ODU1NTg4VSwJLy8gQ01QWENIRzY0cnINCisgICAgNTM2ODcyNjg1VSwJLy8gQ01QWENIRzhCDQorICAgIDY3NTI4NDcwOFUsCS8vIENNUFhDSEc4cm0NCisgICAgMTM5ODU1NTg4VSwJLy8gQ01QWENIRzhycg0KKyAgICAxNDA1MTA5NjhVLAkvLyBDT01JU0RybQ0KKyAgICAxMzk4NTU2MDhVLAkvLyBDT01JU0Rycg0KKyAgICAxNDA1MTA5NzZVLAkvLyBDT01JU1NybQ0KKyAgICAxMzk4NTU2MTZVLAkvLyBDT01JU1Nycg0KKyAgICAxMzQyMTk1MjhVLAkvLyBDT01QX0ZTVDByDQorICAgIDEzNDIxOTUzNVUsCS8vIENPTV9GSVByDQorICAgIDEzNDIxOTU1MVUsCS8vIENPTV9GSXINCisgICAgMTM0MjE5NTY2VSwJLy8gQ09NX0ZTVDByDQorICAgIDE4NDRVLAkvLyBDT1NfRg0KKyAgICAwVSwJLy8gQ09TX0ZwMzINCisgICAgMFUsCS8vIENPU19GcDY0DQorICAgIDBVLAkvLyBDT1NfRnA4MA0KKyAgICAxODQ5VSwJLy8gQ1BVSUQNCisgICAgMTg1NVUsCS8vIENRTw0KKyAgICAxNjM5OTc0NzIzVSwJLy8gQ1JDMzJtMTYNCisgICAgMTY0NDE2OTAyN1UsCS8vIENSQzMybTMyDQorICAgIDE2NDgzNjMzMzFVLAkvLyBDUkMzMm04DQorICAgIDE2NTI1NTc2MzVVLAkvLyBDUkMzMnIxNg0KKyAgICAxNjUyNTU3NjM1VSwJLy8gQ1JDMzJyMzINCisgICAgMTY1MjU1NzYzNVUsCS8vIENSQzMycjgNCisgICAgMTY1Njc1MTkzOVUsCS8vIENSQzY0bTY0DQorICAgIDE2NDgzNjMzMzFVLAkvLyBDUkM2NG04DQorICAgIDE2NTI1NTc2MzVVLAkvLyBDUkM2NHI2NA0KKyAgICAxNjUyNTU3NjM1VSwJLy8gQ1JDNjRyOA0KKyAgICAxODY3VSwJLy8gQ1NfUFJFRklYDQorICAgIDE0MDUxMTA1NFUsCS8vIENWVERRMlBEcm0NCisgICAgMTM5ODU1Njk0VSwJLy8gQ1ZURFEyUERycg0KKyAgICAxMzk3MjQ2MzJVLAkvLyBDVlREUTJQU3JtDQorICAgIDEzOTg1NTcwNFUsCS8vIENWVERRMlBTcnINCisgICAgMTQwNTExMDc0VSwJLy8gQ1ZUUEQyRFFybQ0KKyAgICAxMzk4NTU3MTRVLAkvLyBDVlRQRDJEUXJyDQorICAgIDE0MDUxMTA4NFUsCS8vIENWVFBEMlBTcm0NCisgICAgMTM5ODU1NzI0VSwJLy8gQ1ZUUEQyUFNycg0KKyAgICAxNDA1MTEwOTRVLAkvLyBDVlRQUzJEUXJtDQorICAgIDEzOTg1NTczNFUsCS8vIENWVFBTMkRRcnINCisgICAgMTQwNjQyMTc2VSwJLy8gQ1ZUUFMyUERybQ0KKyAgICAxMzk4NTU3NDRVLAkvLyBDVlRQUzJQRHJyDQorICAgIDE5MzBVLAkvLyBDVlRTRDJTSTY0cm0NCisgICAgMTkzMFUsCS8vIENWVFNEMlNJNjRycg0KKyAgICAxNDA2NDIxOTVVLAkvLyBDVlRTRDJTU3JtDQorICAgIDEzOTg1NTc2M1UsCS8vIENWVFNEMlNTcnINCisgICAgMTQwMjQ4OTg5VSwJLy8gQ1ZUU0kyU0Q2NHJtDQorICAgIDEzOTg1NTc3M1UsCS8vIENWVFNJMlNENjRycg0KKyAgICAxNDAxMTc5MTdVLAkvLyBDVlRTSTJTRHJtDQorICAgIDEzOTg1NTc3M1UsCS8vIENWVFNJMlNEcnINCisgICAgMTQwMjQ4OTk5VSwJLy8gQ1ZUU0kyU1M2NHJtDQorICAgIDEzOTg1NTc4M1UsCS8vIENWVFNJMlNTNjRycg0KKyAgICAxNDAxMTc5MjdVLAkvLyBDVlRTSTJTU3JtDQorICAgIDEzOTg1NTc4M1UsCS8vIENWVFNJMlNTcnINCisgICAgMTQwNzczMjk3VSwJLy8gQ1ZUU1MyU0RybQ0KKyAgICAxMzk4NTU3OTNVLAkvLyBDVlRTUzJTRHJyDQorICAgIDE0MDc3MzMwN1UsCS8vIENWVFNTMlNJNjRybQ0KKyAgICAxMzk4NTU4MDNVLAkvLyBDVlRTUzJTSTY0cnINCisgICAgMTQwNzczMzA3VSwJLy8gQ1ZUU1MyU0lybQ0KKyAgICAxMzk4NTU4MDNVLAkvLyBDVlRTUzJTSXJyDQorICAgIDE0MDUxMTE3M1UsCS8vIENWVFRQUzJEUXJtDQorICAgIDEzOTg1NTgxM1UsCS8vIENWVFRQUzJEUXJyDQorICAgIDE0MDY0MjI1NlUsCS8vIENWVFRTRDJTSTY0cm0NCisgICAgMTM5ODU1ODI0VSwJLy8gQ1ZUVFNEMlNJNjRycg0KKyAgICAxNDA2NDIyNTZVLAkvLyBDVlRUU0QyU0lybQ0KKyAgICAxMzk4NTU4MjRVLAkvLyBDVlRUU0QyU0lycg0KKyAgICAxNDA3NzMzMzlVLAkvLyBDVlRUU1MyU0k2NHJtDQorICAgIDEzOTg1NTgzNVUsCS8vIENWVFRTUzJTSTY0cnINCisgICAgMTQwNzczMzM5VSwJLy8gQ1ZUVFNTMlNJcm0NCisgICAgMTM5ODU1ODM1VSwJLy8gQ1ZUVFNTMlNJcnINCisgICAgMjAyMlUsCS8vIENXRA0KKyAgICAyMDI2VSwJLy8gQ1dERQ0KKyAgICAyNjg0Mzc0ODdVLAkvLyBERUMxNm0NCisgICAgMTM0MjE5NzU5VSwJLy8gREVDMTZyDQorICAgIDQwMjY1NTIxNVUsCS8vIERFQzMybQ0KKyAgICAxMzQyMTk3NTlVLAkvLyBERUMzMnINCisgICAgMjY4NDM3NDg3VSwJLy8gREVDNjRfMTZtDQorICAgIDEzNDIxOTc1OVUsCS8vIERFQzY0XzE2cg0KKyAgICA0MDI2NTUyMTVVLAkvLyBERUM2NF8zMm0NCisgICAgMTM0MjE5NzU5VSwJLy8gREVDNjRfMzJyDQorICAgIDUzNjg3Mjk0M1UsCS8vIERFQzY0bQ0KKyAgICAxMzQyMTk3NTlVLAkvLyBERUM2NHINCisgICAgNjcxMDkwNjcxVSwJLy8gREVDOG0NCisgICAgMTM0MjE5NzU5VSwJLy8gREVDOHINCisgICAgMjY4NDM3NDkyVSwJLy8gRElWMTZtDQorICAgIDEzNDIxOTc2NFUsCS8vIERJVjE2cg0KKyAgICA0MDI2NTUyMjBVLAkvLyBESVYzMm0NCisgICAgMTM0MjE5NzY0VSwJLy8gRElWMzJyDQorICAgIDUzNjg3Mjk0OFUsCS8vIERJVjY0bQ0KKyAgICAxMzQyMTk3NjRVLAkvLyBESVY2NHINCisgICAgNjcxMDkwNjc2VSwJLy8gRElWOG0NCisgICAgMTM0MjE5NzY0VSwJLy8gRElWOHINCisgICAgMTM5MjAwNTA1VSwJLy8gRElWUERybQ0KKyAgICAxMzg1NDUxNDVVLAkvLyBESVZQRHJyDQorICAgIDEzOTIwMDUxMlUsCS8vIERJVlBTcm0NCisgICAgMTM4NTQ1MTUyVSwJLy8gRElWUFNycg0KKyAgICA4MDUzMDg0MjNVLAkvLyBESVZSX0YzMm0NCisgICAgOTM5NTI2MTUxVSwJLy8gRElWUl9GNjRtDQorICAgIDI2ODQzNzUxOFUsCS8vIERJVlJfRkkxNm0NCisgICAgNDAyNjU1MjQ2VSwJLy8gRElWUl9GSTMybQ0KKyAgICAxMzQyMTk3OThVLAkvLyBESVZSX0ZQclNUMA0KKyAgICAxMzQyMTk3ODNVLAkvLyBESVZSX0ZTVDByDQorICAgIDBVLAkvLyBESVZSX0ZwMzJtDQorICAgIDBVLAkvLyBESVZSX0ZwNjRtDQorICAgIDBVLAkvLyBESVZSX0ZwNjRtMzINCisgICAgMFUsCS8vIERJVlJfRnA4MG0zMg0KKyAgICAwVSwJLy8gRElWUl9GcDgwbTY0DQorICAgIDBVLAkvLyBESVZSX0ZwSTE2bTMyDQorICAgIDBVLAkvLyBESVZSX0ZwSTE2bTY0DQorICAgIDBVLAkvLyBESVZSX0ZwSTE2bTgwDQorICAgIDBVLAkvLyBESVZSX0ZwSTMybTMyDQorICAgIDBVLAkvLyBESVZSX0ZwSTMybTY0DQorICAgIDBVLAkvLyBESVZSX0ZwSTMybTgwDQorICAgIDE0MjYwODM5MVUsCS8vIERJVlJfRnJTVDANCisgICAgMTM5MzMxNjE0VSwJLy8gRElWU0RybQ0KKyAgICAxMzkzMzE2MTRVLAkvLyBESVZTRHJtX0ludA0KKyAgICAxMzg1NDUxODJVLAkvLyBESVZTRHJyDQorICAgIDEzODU0NTE4MlUsCS8vIERJVlNEcnJfSW50DQorICAgIDEzOTQ2MjY5M1UsCS8vIERJVlNTcm0NCisgICAgMTM5NDYyNjkzVSwJLy8gRElWU1NybV9JbnQNCisgICAgMTM4NTQ1MTg5VSwJLy8gRElWU1Nycg0KKyAgICAxMzg1NDUxODlVLAkvLyBESVZTU3JyX0ludA0KKyAgICA4MDUzMDg0NjBVLAkvLyBESVZfRjMybQ0KKyAgICA5Mzk1MjYxODhVLAkvLyBESVZfRjY0bQ0KKyAgICAyNjg0Mzc1NTRVLAkvLyBESVZfRkkxNm0NCisgICAgNDAyNjU1MjgyVSwJLy8gRElWX0ZJMzJtDQorICAgIDEzNDIxOTgzM1UsCS8vIERJVl9GUHJTVDANCisgICAgMTM0MjE5ODIwVSwJLy8gRElWX0ZTVDByDQorICAgIDBVLAkvLyBESVZfRnAzMg0KKyAgICAwVSwJLy8gRElWX0ZwMzJtDQorICAgIDBVLAkvLyBESVZfRnA2NA0KKyAgICAwVSwJLy8gRElWX0ZwNjRtDQorICAgIDBVLAkvLyBESVZfRnA2NG0zMg0KKyAgICAwVSwJLy8gRElWX0ZwODANCisgICAgMFUsCS8vIERJVl9GcDgwbTMyDQorICAgIDBVLAkvLyBESVZfRnA4MG02NA0KKyAgICAwVSwJLy8gRElWX0ZwSTE2bTMyDQorICAgIDBVLAkvLyBESVZfRnBJMTZtNjQNCisgICAgMFUsCS8vIERJVl9GcEkxNm04MA0KKyAgICAwVSwJLy8gRElWX0ZwSTMybTMyDQorICAgIDBVLAkvLyBESVZfRnBJMzJtNjQNCisgICAgMFUsCS8vIERJVl9GcEkzMm04MA0KKyAgICAxNDI2MDg0MjhVLAkvLyBESVZfRnJTVDANCisgICAgMTM5NTkzNzkyVSwJLy8gRFBQRHJtaQ0KKyAgICAxMzg1NDUyMTZVLAkvLyBEUFBEcnJpDQorICAgIDEzOTU5Mzc5OFUsCS8vIERQUFNybWkNCisgICAgMTM4NTQ1MjIyVSwJLy8gRFBQU3JyaQ0KKyAgICAyMTI0VSwJLy8gRFNfUFJFRklYDQorICAgIDEzNDIxOTg1NVUsCS8vIEVIX1JFVFVSTg0KKyAgICAxMzQyMTk4NTVVLAkvLyBFSF9SRVRVUk42NA0KKyAgICAxMzk4NTU5NzRVLAkvLyBFTlRFUg0KKyAgICAyMTU3VSwJLy8gRVNfUFJFRklYDQorICAgIDgwOTUwMjgzMlUsCS8vIEVYVFJBQ1RQU21yDQorICAgIDEzOTg1NTk4NFUsCS8vIEVYVFJBQ1RQU3JyDQorICAgIDIxNzFVLAkvLyBGMlhNMQ0KKyAgICAxMzk4NTYwMDFVLAkvLyBGQVJDQUxMMTZpDQorICAgIDE3NDQ4MzI2NDFVLAkvLyBGQVJDQUxMMTZtDQorICAgIDEzOTg1NjAwMVUsCS8vIEZBUkNBTEwzMmkNCisgICAgMTc0NDgzMjY0MVUsCS8vIEZBUkNBTEwzMm0NCisgICAgMTc0NDgzMjY0MVUsCS8vIEZBUkNBTEw2NA0KKyAgICAxMzk4NTYwMDhVLAkvLyBGQVJKTVAxNmkNCisgICAgMTc0NDgzMjY0OFUsCS8vIEZBUkpNUDE2bQ0KKyAgICAxMzk4NTYwMDhVLAkvLyBGQVJKTVAzMmkNCisgICAgMTc0NDgzMjY0OFUsCS8vIEZBUkpNUDMybQ0KKyAgICAxNzQ0ODMyNjQ4VSwJLy8gRkFSSk1QNjQNCisgICAgODA1MzA4NTU4VSwJLy8gRkJMRG0NCisgICAgODA1MzA4NTY0VSwJLy8gRkJTVFBtDQorICAgIDgwNTMwODIwNlUsCS8vIEZDT00zMm0NCisgICAgOTM5NTI1OTM0VSwJLy8gRkNPTTY0bQ0KKyAgICA4MDUzMDgxNjhVLAkvLyBGQ09NUDMybQ0KKyAgICA5Mzk1MjU4OTZVLAkvLyBGQ09NUDY0bQ0KKyAgICAyMjAzVSwJLy8gRkNPTVBQDQorICAgIDIyMTBVLAkvLyBGREVDU1RQDQorICAgIDEzNDIxOTk0NlUsCS8vIEZGUkVFDQorICAgIDI2ODQzNzY4MVUsCS8vIEZJQ09NMTZtDQorICAgIDQwMjY1NTQwOVUsCS8vIEZJQ09NMzJtDQorICAgIDI2ODQzNzY4OFUsCS8vIEZJQ09NUDE2bQ0KKyAgICA0MDI2NTU0MTZVLAkvLyBGSUNPTVAzMm0NCisgICAgMjI0MFUsCS8vIEZJTkNTVFANCisgICAgMjY4NDM3NzA0VSwJLy8gRkxEQ1cxNm0NCisgICAgODA1MzA4NjIzVSwJLy8gRkxERU5WbQ0KKyAgICAyMjYzVSwJLy8gRkxETDJFDQorICAgIDIyNzBVLAkvLyBGTERMMlQNCisgICAgMjI3N1UsCS8vIEZMRExHMg0KKyAgICAyMjg0VSwJLy8gRkxETE4yDQorICAgIDIyOTFVLAkvLyBGTERQSQ0KKyAgICAyMjk3VSwJLy8gRk5DTEVYDQorICAgIDIzMDRVLAkvLyBGTklOSVQNCisgICAgMjMxMVUsCS8vIEZOT1ANCisgICAgMjY4NDM3NzcyVSwJLy8gRk5TVENXMTZtDQorICAgIDIzMjRVLAkvLyBGTlNUU1c4cg0KKyAgICA4MDUzMDg3MDNVLAkvLyBGTlNUU1dtDQorICAgIDIzNDNVLAkvLyBGUDMyX1RPX0lOVDE2X0lOX01FTQ0KKyAgICAyMzc0VSwJLy8gRlAzMl9UT19JTlQzMl9JTl9NRU0NCisgICAgMjQwNVUsCS8vIEZQMzJfVE9fSU5UNjRfSU5fTUVNDQorICAgIDI0MzZVLAkvLyBGUDY0X1RPX0lOVDE2X0lOX01FTQ0KKyAgICAyNDY3VSwJLy8gRlA2NF9UT19JTlQzMl9JTl9NRU0NCisgICAgMjQ5OFUsCS8vIEZQNjRfVE9fSU5UNjRfSU5fTUVNDQorICAgIDI1MjlVLAkvLyBGUDgwX1RPX0lOVDE2X0lOX01FTQ0KKyAgICAyNTYwVSwJLy8gRlA4MF9UT19JTlQzMl9JTl9NRU0NCisgICAgMjU5MVUsCS8vIEZQODBfVE9fSU5UNjRfSU5fTUVNDQorICAgIDI2MjJVLAkvLyBGUEFUQU4NCisgICAgMjYyOVUsCS8vIEZQUkVNDQorICAgIDI2MzVVLAkvLyBGUFJFTTENCisgICAgMjY0MlUsCS8vIEZQVEFODQorICAgIDI2NDhVLAkvLyBGUk5ESU5UDQorICAgIDgwNTMwOTAyNFUsCS8vIEZSU1RPUm0NCisgICAgODA1MzA5MDMyVSwJLy8gRlNBVkVtDQorICAgIDI2NzJVLAkvLyBGU0NBTEUNCisgICAgMjY3OVUsCS8vIEZTSU5DT1MNCisgICAgODA1MzA5MDU1VSwJLy8gRlNURU5WbQ0KKyAgICAxODc5MDUwODg4VSwJLy8gRlNfTU9WMzJybQ0KKyAgICAyNzA2VSwJLy8gRlNfUFJFRklYDQorICAgIDI3MDlVLAkvLyBGWEFNDQorICAgIDE3NDQ4MzMxNzhVLAkvLyBGWFJTVE9SDQorICAgIDE3NDQ4MzMxODdVLAkvLyBGWFNBVkUNCisgICAgMjczMVUsCS8vIEZYVFJBQ1QNCisgICAgMjczOVUsCS8vIEZZTDJYDQorICAgIDI3NDVVLAkvLyBGWUwyWFAxDQorICAgIDBVLAkvLyBGcEdFVF9TVDBfMzINCisgICAgMFUsCS8vIEZwR0VUX1NUMF82NA0KKyAgICAwVSwJLy8gRnBHRVRfU1QwXzgwDQorICAgIDBVLAkvLyBGcEdFVF9TVDFfMzINCisgICAgMFUsCS8vIEZwR0VUX1NUMV82NA0KKyAgICAwVSwJLy8gRnBHRVRfU1QxXzgwDQorICAgIDBVLAkvLyBGcFNFVF9TVDBfMzINCisgICAgMFUsCS8vIEZwU0VUX1NUMF82NA0KKyAgICAwVSwJLy8gRnBTRVRfU1QwXzgwDQorICAgIDBVLAkvLyBGcFNFVF9TVDFfMzINCisgICAgMFUsCS8vIEZwU0VUX1NUMV82NA0KKyAgICAwVSwJLy8gRnBTRVRfU1QxXzgwDQorICAgIDEzOTE5ODc4OFUsCS8vIEZzQU5ETlBEcm0NCisgICAgMTM4NTQzNDI4VSwJLy8gRnNBTkROUERycg0KKyAgICAxMzkxOTg3OTZVLAkvLyBGc0FORE5QU3JtDQorICAgIDEzODU0MzQzNlUsCS8vIEZzQU5ETlBTcnINCisgICAgMTM5MTk4ODA0VSwJLy8gRnNBTkRQRHJtDQorICAgIDEzODU0MzQ0NFUsCS8vIEZzQU5EUERycg0KKyAgICAxMzkxOTg4MTFVLAkvLyBGc0FORFBTcm0NCisgICAgMTM4NTQzNDUxVSwJLy8gRnNBTkRQU3JyDQorICAgIDBVLAkvLyBGc0ZMRDBTRA0KKyAgICAwVSwJLy8gRnNGTEQwU1MNCisgICAgMTQwNTExOTM3VSwJLy8gRnNNT1ZBUERybQ0KKyAgICAxMzk4NTY1NzdVLAkvLyBGc01PVkFQRHJyDQorICAgIDE0MDUxMTk0NVUsCS8vIEZzTU9WQVBTcm0NCisgICAgMTM5ODU2NTg1VSwJLy8gRnNNT1ZBUFNycg0KKyAgICAxMzkyMDEyMzNVLAkvLyBGc09SUERybQ0KKyAgICAxMzg1NDU4NzNVLAkvLyBGc09SUERycg0KKyAgICAxMzkyMDEyMzlVLAkvLyBGc09SUFNybQ0KKyAgICAxMzg1NDU4NzlVLAkvLyBGc09SUFNycg0KKyAgICAxMzkyMDEyNDVVLAkvLyBGc1hPUlBEcm0NCisgICAgMTM4NTQ1ODg1VSwJLy8gRnNYT1JQRHJyDQorICAgIDEzOTIwMTI1MlUsCS8vIEZzWE9SUFNybQ0KKyAgICAxMzg1NDU4OTJVLAkvLyBGc1hPUlBTcnINCisgICAgMTg3OTA1MDk4N1UsCS8vIEdTX01PVjMycm0NCisgICAgMjgwNVUsCS8vIEdTX1BSRUZJWA0KKyAgICAxMzkyMDEyNzJVLAkvLyBIQUREUERybQ0KKyAgICAxMzg1NDU5MTJVLAkvLyBIQUREUERycg0KKyAgICAxMzkyMDEyODBVLAkvLyBIQUREUFNybQ0KKyAgICAxMzg1NDU5MjBVLAkvLyBIQUREUFNycg0KKyAgICAyODI0VSwJLy8gSExUDQorICAgIDEzOTIwMTI5MlUsCS8vIEhTVUJQRHJtDQorICAgIDEzODU0NTkzMlUsCS8vIEhTVUJQRHJyDQorICAgIDEzOTIwMTMwMFUsCS8vIEhTVUJQU3JtDQorICAgIDEzODU0NTk0MFUsCS8vIEhTVUJQU3JyDQorICAgIDI2ODQzODMwMFUsCS8vIElESVYxNm0NCisgICAgMTM0MjIwNTcyVSwJLy8gSURJVjE2cg0KKyAgICA0MDI2NTYwMjhVLAkvLyBJRElWMzJtDQorICAgIDEzNDIyMDU3MlUsCS8vIElESVYzMnINCisgICAgNTM2ODczNzU2VSwJLy8gSURJVjY0bQ0KKyAgICAxMzQyMjA1NzJVLAkvLyBJRElWNjRyDQorICAgIDY3MTA5MTQ4NFUsCS8vIElESVY4bQ0KKyAgICAxMzQyMjA1NzJVLAkvLyBJRElWOHINCisgICAgMjY4NDM4MzA2VSwJLy8gSUxEX0YxNm0NCisgICAgNDAyNjU2MDM0VSwJLy8gSUxEX0YzMm0NCisgICAgNTM2ODczNzYyVSwJLy8gSUxEX0Y2NG0NCisgICAgMFUsCS8vIElMRF9GcDE2bTMyDQorICAgIDBVLAkvLyBJTERfRnAxNm02NA0KKyAgICAwVSwJLy8gSUxEX0ZwMTZtODANCisgICAgMFUsCS8vIElMRF9GcDMybTMyDQorICAgIDBVLAkvLyBJTERfRnAzMm02NA0KKyAgICAwVSwJLy8gSUxEX0ZwMzJtODANCisgICAgMFUsCS8vIElMRF9GcDY0bTMyDQorICAgIDBVLAkvLyBJTERfRnA2NG02NA0KKyAgICAwVSwJLy8gSUxEX0ZwNjRtODANCisgICAgMjY4NDM4MzEyVSwJLy8gSU1VTDE2bQ0KKyAgICAxMzQyMjA1ODRVLAkvLyBJTVVMMTZyDQorICAgIDEzODY3NzAzMlUsCS8vIElNVUwxNnJtDQorICAgIDEzOTk4Nzc1MlUsCS8vIElNVUwxNnJtaQ0KKyAgICAxMzk5ODc3NTJVLAkvLyBJTVVMMTZybWk4DQorICAgIDEzODU0NTk2MFUsCS8vIElNVUwxNnJyDQorICAgIDEzOTg1NjY4MFUsCS8vIElNVUwxNnJyaQ0KKyAgICAxMzk4NTY2ODBVLAkvLyBJTVVMMTZycmk4DQorICAgIDQwMjY1NjA0MFUsCS8vIElNVUwzMm0NCisgICAgMTM0MjIwNTg0VSwJLy8gSU1VTDMycg0KKyAgICAxMzg4MDgxMDRVLAkvLyBJTVVMMzJybQ0KKyAgICAxNDAxMTg4MjRVLAkvLyBJTVVMMzJybWkNCisgICAgMTQwMTE4ODI0VSwJLy8gSU1VTDMycm1pOA0KKyAgICAxMzg1NDU5NjBVLAkvLyBJTVVMMzJycg0KKyAgICAxMzk4NTY2ODBVLAkvLyBJTVVMMzJycmkNCisgICAgMTM5ODU2NjgwVSwJLy8gSU1VTDMycnJpOA0KKyAgICA1MzY4NzM3NjhVLAkvLyBJTVVMNjRtDQorICAgIDEzNDIyMDU4NFUsCS8vIElNVUw2NHINCisgICAgMTM4OTM5MTc2VSwJLy8gSU1VTDY0cm0NCisgICAgMTQwMjQ5ODk2VSwJLy8gSU1VTDY0cm1pMzINCisgICAgMTQwMjQ5ODk2VSwJLy8gSU1VTDY0cm1pOA0KKyAgICAxMzg1NDU5NjBVLAkvLyBJTVVMNjRycg0KKyAgICAxMzk4NTY2ODBVLAkvLyBJTVVMNjRycmkzMg0KKyAgICAxMzk4NTY2ODBVLAkvLyBJTVVMNjRycmk4DQorICAgIDY3MTA5MTQ5NlUsCS8vIElNVUw4bQ0KKyAgICAxMzQyMjA1ODRVLAkvLyBJTVVMOHINCisgICAgMjg2MlUsCS8vIElOMTYNCisgICAgMTM0MjIwNTk0VSwJLy8gSU4xNnJpDQorICAgIDI4NzVVLAkvLyBJTjE2cnINCisgICAgMjg2MlUsCS8vIElOMzINCisgICAgMTM0MjIwNjE1VSwJLy8gSU4zMnJpDQorICAgIDI4OTdVLAkvLyBJTjMycnINCisgICAgMjg2MlUsCS8vIElOOA0KKyAgICAxMzQyMjA2MzhVLAkvLyBJTjhyaQ0KKyAgICAyOTE5VSwJLy8gSU44cnINCisgICAgMjY4NDM4Mzg3VSwJLy8gSU5DMTZtDQorICAgIDEzNDIyMDY1OVUsCS8vIElOQzE2cg0KKyAgICA0MDI2NTYxMTVVLAkvLyBJTkMzMm0NCisgICAgMTM0MjIwNjU5VSwJLy8gSU5DMzJyDQorICAgIDI2ODQzODM4N1UsCS8vIElOQzY0XzE2bQ0KKyAgICAxMzQyMjA2NTlVLAkvLyBJTkM2NF8xNnINCisgICAgNDAyNjU2MTE1VSwJLy8gSU5DNjRfMzJtDQorICAgIDEzNDIyMDY1OVUsCS8vIElOQzY0XzMycg0KKyAgICA1MzY4NzM4NDNVLAkvLyBJTkM2NG0NCisgICAgMTM0MjIwNjU5VSwJLy8gSU5DNjRyDQorICAgIDY3MTA5MTU3MVUsCS8vIElOQzhtDQorICAgIDEzNDIyMDY1OVUsCS8vIElOQzhyDQorICAgIDEzOTQ2MzU0NFUsCS8vIElOU0VSVFBTcm0NCisgICAgMTM4NTQ2MDQwVSwJLy8gSU5TRVJUUFNycg0KKyAgICAxMzQyMjA2NzRVLAkvLyBJTlQNCisgICAgMjk1MVUsCS8vIElOVDMNCisgICAgMjk1NlUsCS8vIElOVE8NCisgICAgMjk2MVUsCS8vIElOVkQNCisgICAgMjk2NlUsCS8vIElOVkVQVA0KKyAgICA2NzEwOTE2MTNVLAkvLyBJTlZMUEcNCisgICAgMjk4MVUsCS8vIElOVlZQSUQNCisgICAgMjk4OVUsCS8vIElSRVQxNg0KKyAgICAyOTg5VSwJLy8gSVJFVDMyDQorICAgIDI5ODlVLAkvLyBJUkVUNjQNCisgICAgMjY4NDM4NDUwVSwJLy8gSVNUVF9GUDE2bQ0KKyAgICA0MDI2NTYxNzhVLAkvLyBJU1RUX0ZQMzJtDQorICAgIDUzNjg3MzkwNlUsCS8vIElTVFRfRlA2NG0NCisgICAgMFUsCS8vIElTVFRfRnAxNm0zMg0KKyAgICAwVSwJLy8gSVNUVF9GcDE2bTY0DQorICAgIDBVLAkvLyBJU1RUX0ZwMTZtODANCisgICAgMFUsCS8vIElTVFRfRnAzMm0zMg0KKyAgICAwVSwJLy8gSVNUVF9GcDMybTY0DQorICAgIDBVLAkvLyBJU1RUX0ZwMzJtODANCisgICAgMFUsCS8vIElTVFRfRnA2NG0zMg0KKyAgICAwVSwJLy8gSVNUVF9GcDY0bTY0DQorICAgIDBVLAkvLyBJU1RUX0ZwNjRtODANCisgICAgMjY4NDM4NDU4VSwJLy8gSVNUX0YxNm0NCisgICAgNDAyNjU2MTg2VSwJLy8gSVNUX0YzMm0NCisgICAgMjY4NDM4NDY0VSwJLy8gSVNUX0ZQMTZtDQorICAgIDQwMjY1NjE5MlUsCS8vIElTVF9GUDMybQ0KKyAgICA1MzY4NzM5MjBVLAkvLyBJU1RfRlA2NG0NCisgICAgMFUsCS8vIElTVF9GcDE2bTMyDQorICAgIDBVLAkvLyBJU1RfRnAxNm02NA0KKyAgICAwVSwJLy8gSVNUX0ZwMTZtODANCisgICAgMFUsCS8vIElTVF9GcDMybTMyDQorICAgIDBVLAkvLyBJU1RfRnAzMm02NA0KKyAgICAwVSwJLy8gSVNUX0ZwMzJtODANCisgICAgMFUsCS8vIElTVF9GcDY0bTMyDQorICAgIDBVLAkvLyBJU1RfRnA2NG02NA0KKyAgICAwVSwJLy8gSVNUX0ZwNjRtODANCisgICAgMTIyOTg1MDI4NVUsCS8vIEludF9DTVBTRHJtDQorICAgIDEzNjMyODE1ODFVLAkvLyBJbnRfQ01QU0Rycg0KKyAgICAxMjM0MTc1NjYxVSwJLy8gSW50X0NNUFNTcm0NCisgICAgMTM2NzQ3NTg4NVUsCS8vIEludF9DTVBTU3JyDQorICAgIDE0MDUxMDk2OFUsCS8vIEludF9DT01JU0RybQ0KKyAgICAxMzk4NTU2MDhVLAkvLyBJbnRfQ09NSVNEcnINCisgICAgMTQwNTEwOTc2VSwJLy8gSW50X0NPTUlTU3JtDQorICAgIDEzOTg1NTYxNlUsCS8vIEludF9DT01JU1Nycg0KKyAgICAxNDAyNDg5MTBVLAkvLyBJbnRfQ1ZURFEyUERybQ0KKyAgICAxMzk4NTU2OTRVLAkvLyBJbnRfQ1ZURFEyUERycg0KKyAgICAxMzk3MjQ2MzJVLAkvLyBJbnRfQ1ZURFEyUFNybQ0KKyAgICAxMzk4NTU3MDRVLAkvLyBJbnRfQ1ZURFEyUFNycg0KKyAgICAxNDA1MTEwNzRVLAkvLyBJbnRfQ1ZUUEQyRFFybQ0KKyAgICAxMzk4NTU3MTRVLAkvLyBJbnRfQ1ZUUEQyRFFycg0KKyAgICAxNDA1MTIxOTlVLAkvLyBJbnRfQ1ZUUEQyUElybQ0KKyAgICAxMzk4NTY4MzlVLAkvLyBJbnRfQ1ZUUEQyUElycg0KKyAgICAxNDA1MTEwODRVLAkvLyBJbnRfQ1ZUUEQyUFNybQ0KKyAgICAxMzk4NTU3MjRVLAkvLyBJbnRfQ1ZUUEQyUFNycg0KKyAgICAxNDAyNTAwNjVVLAkvLyBJbnRfQ1ZUUEkyUERybQ0KKyAgICAxMzk4NTY4NDlVLAkvLyBJbnRfQ1ZUUEkyUERycg0KKyAgICAxMzg5MzkzNTVVLAkvLyBJbnRfQ1ZUUEkyUFNybQ0KKyAgICAxMzg1NDYxMzlVLAkvLyBJbnRfQ1ZUUEkyUFNycg0KKyAgICAxNDA1MTEwOTRVLAkvLyBJbnRfQ1ZUUFMyRFFybQ0KKyAgICAxMzk4NTU3MzRVLAkvLyBJbnRfQ1ZUUFMyRFFycg0KKyAgICAxNDA2NDIxNzZVLAkvLyBJbnRfQ1ZUUFMyUERybQ0KKyAgICAxMzk4NTU3NDRVLAkvLyBJbnRfQ1ZUUFMyUERycg0KKyAgICAxNDA2NDMzMDFVLAkvLyBJbnRfQ1ZUUFMyUElybQ0KKyAgICAxMzk4NTY4NjlVLAkvLyBJbnRfQ1ZUUFMyUElycg0KKyAgICAxNDA1MTIyMzlVLAkvLyBJbnRfQ1ZUU0QyU0k2NHJtDQorICAgIDEzOTg1Njg3OVUsCS8vIEludF9DVlRTRDJTSTY0cnINCisgICAgMTQwNTEyMjM5VSwJLy8gSW50X0NWVFNEMlNJcm0NCisgICAgMTM5ODU2ODc5VSwJLy8gSW50X0NWVFNEMlNJcnINCisgICAgMTM5MzMxNDc1VSwJLy8gSW50X0NWVFNEMlNTcm0NCisgICAgMTM4NTQ1MDQzVSwJLy8gSW50X0NWVFNEMlNTcnINCisgICAgMTM4OTM4MjY5VSwJLy8gSW50X0NWVFNJMlNENjRybQ0KKyAgICAxMzg1NDUwNTNVLAkvLyBJbnRfQ1ZUU0kyU0Q2NHJyDQorICAgIDEzODgwNzE5N1UsCS8vIEludF9DVlRTSTJTRHJtDQorICAgIDEzODU0NTA1M1UsCS8vIEludF9DVlRTSTJTRHJyDQorICAgIDEzODkzODI3OVUsCS8vIEludF9DVlRTSTJTUzY0cm0NCisgICAgMTM4NTQ1MDYzVSwJLy8gSW50X0NWVFNJMlNTNjRycg0KKyAgICAxMzg4MDcyMDdVLAkvLyBJbnRfQ1ZUU0kyU1NybQ0KKyAgICAxMzg1NDUwNjNVLAkvLyBJbnRfQ1ZUU0kyU1Nycg0KKyAgICAxMzk0NjI1NzdVLAkvLyBJbnRfQ1ZUU1MyU0RybQ0KKyAgICAxMzg1NDUwNzNVLAkvLyBJbnRfQ1ZUU1MyU0Rycg0KKyAgICAxNDA3NzMzMDdVLAkvLyBJbnRfQ1ZUU1MyU0k2NHJtDQorICAgIDEzOTg1NTgwM1UsCS8vIEludF9DVlRTUzJTSTY0cnINCisgICAgMTQwNzczMzA3VSwJLy8gSW50X0NWVFNTMlNJcm0NCisgICAgMTM5ODU1ODAzVSwJLy8gSW50X0NWVFNTMlNJcnINCisgICAgMTQwNTEyMjQ5VSwJLy8gSW50X0NWVFRQRDJEUXJtDQorICAgIDEzOTg1Njg4OVUsCS8vIEludF9DVlRUUEQyRFFycg0KKyAgICAxNDA1MTIyNjBVLAkvLyBJbnRfQ1ZUVFBEMlBJcm0NCisgICAgMTM5ODU2OTAwVSwJLy8gSW50X0NWVFRQRDJQSXJyDQorICAgIDE0MDUxMTE3M1UsCS8vIEludF9DVlRUUFMyRFFybQ0KKyAgICAxMzk4NTU4MTNVLAkvLyBJbnRfQ1ZUVFBTMkRRcnINCisgICAgMTQwNjQzMzQzVSwJLy8gSW50X0NWVFRQUzJQSXJtDQorICAgIDEzOTg1NjkxMVUsCS8vIEludF9DVlRUUFMyUElycg0KKyAgICAxNDA1MTExOTVVLAkvLyBJbnRfQ1ZUVFNEMlNJNjRybQ0KKyAgICAxMzk4NTU4MzVVLAkvLyBJbnRfQ1ZUVFNEMlNJNjRycg0KKyAgICAxNDA1MTExOTVVLAkvLyBJbnRfQ1ZUVFNEMlNJcm0NCisgICAgMTM5ODU1ODM1VSwJLy8gSW50X0NWVFRTRDJTSXJyDQorICAgIDE0MDc3MzMzOVUsCS8vIEludF9DVlRUU1MyU0k2NHJtDQorICAgIDEzOTg1NTgzNVUsCS8vIEludF9DVlRUU1MyU0k2NHJyDQorICAgIDE0MDc3MzMzOVUsCS8vIEludF9DVlRUU1MyU0lybQ0KKyAgICAxMzk4NTU4MzVVLAkvLyBJbnRfQ1ZUVFNTMlNJcnINCisgICAgMzA5OFUsCS8vIEludF9NZW1CYXJyaWVyDQorICAgIDEzNDIyMDgzOFUsCS8vIEludF9NZW1CYXJyaWVyTm9TU0UNCisgICAgMTM0MjIwODU2VSwJLy8gSW50X01lbUJhcnJpZXJOb1NTRTY0DQorICAgIDE0MDUxMjMzMFUsCS8vIEludF9VQ09NSVNEcm0NCisgICAgMTM5ODU2OTcwVSwJLy8gSW50X1VDT01JU0Rycg0KKyAgICAxNDA1MTIzMzlVLAkvLyBJbnRfVUNPTUlTU3JtDQorICAgIDEzOTg1Njk3OVUsCS8vIEludF9VQ09NSVNTcnINCisgICAgMTIzMDM3NjAyOFUsCS8vIEludF9WQ01QU0RybQ0KKyAgICAxMzY0NTkzNzU2VSwJLy8gSW50X1ZDTVBTRHJyDQorICAgIDEyMzQ1NzAzMzJVLAkvLyBJbnRfVkNNUFNTcm0NCisgICAgMTM2ODc4ODA2MFUsCS8vIEludF9WQ01QU1Nycg0KKyAgICAxNDA1MTIzNTNVLAkvLyBJbnRfVkNPTUlTRHJtDQorICAgIDEzOTg1Njk5M1UsCS8vIEludF9WQ09NSVNEcnINCisgICAgMTQwNTEyMzYyVSwJLy8gSW50X1ZDT01JU1NybQ0KKyAgICAxMzk4NTcwMDJVLAkvLyBJbnRfVkNPTUlTU3JyDQorICAgIDE0MDI1MDIyN1UsCS8vIEludF9WQ1ZURFEyUERybQ0KKyAgICAxMzk4NTcwMTFVLAkvLyBJbnRfVkNWVERRMlBEcnINCisgICAgMTM5NzI1OTUwVSwJLy8gSW50X1ZDVlREUTJQU3JtDQorICAgIDEzOTg1NzAyMlUsCS8vIEludF9WQ1ZURFEyUFNycg0KKyAgICAxNDA1MTIzOTNVLAkvLyBJbnRfVkNWVFBEMkRRcm0NCisgICAgMTM5ODU3MDMzVSwJLy8gSW50X1ZDVlRQRDJEUXJyDQorICAgIDE0MDUxMjQwNFUsCS8vIEludF9WQ1ZUUEQyUFNybQ0KKyAgICAxMzk4NTcwNDRVLAkvLyBJbnRfVkNWVFBEMlBTcnINCisgICAgMTQwNTEyNDE1VSwJLy8gSW50X1ZDVlRQUzJEUXJtDQorICAgIDEzOTg1NzA1NVUsCS8vIEludF9WQ1ZUUFMyRFFycg0KKyAgICAxNDA2NDM0OThVLAkvLyBJbnRfVkNWVFBTMlBEcm0NCisgICAgMTM5ODU3MDY2VSwJLy8gSW50X1ZDVlRQUzJQRHJyDQorICAgIDE0MDUxMjQzN1UsCS8vIEludF9WQ1ZUU0QyU0k2NHJtDQorICAgIDEzOTg1NzA3N1UsCS8vIEludF9WQ1ZUU0QyU0k2NHJyDQorICAgIDE0MDUxMjQzN1UsCS8vIEludF9WQ1ZUU0QyU0lybQ0KKyAgICAxMzk4NTcwNzdVLAkvLyBJbnRfVkNWVFNEMlNJcnINCisgICAgMTM5ODU3MDg4VSwJLy8gSW50X1ZDVlRTRDJTU3JtDQorICAgIDEzOTg1NzA4OFUsCS8vIEludF9WQ1ZUU0QyU1Nycg0KKyAgICAxMzk4NTcwOTlVLAkvLyBJbnRfVkNWVFNJMlNENjRybQ0KKyAgICAxMzk4NTcwOTlVLAkvLyBJbnRfVkNWVFNJMlNENjRycg0KKyAgICAxMzk4NTcwOTlVLAkvLyBJbnRfVkNWVFNJMlNEcm0NCisgICAgMTM5ODU3MDk5VSwJLy8gSW50X1ZDVlRTSTJTRHJyDQorICAgIDEzOTg1NzExMFUsCS8vIEludF9WQ1ZUU0kyU1M2NHJtDQorICAgIDEzOTg1NzExMFUsCS8vIEludF9WQ1ZUU0kyU1M2NHJyDQorICAgIDEzOTg1NzExMFUsCS8vIEludF9WQ1ZUU0kyU1NybQ0KKyAgICAxMzk4NTcxMTBVLAkvLyBJbnRfVkNWVFNJMlNTcnINCisgICAgMTM5ODU3MTIxVSwJLy8gSW50X1ZDVlRTUzJTRHJtDQorICAgIDEzOTg1NzEyMVUsCS8vIEludF9WQ1ZUU1MyU0Rycg0KKyAgICAxNDA3NzQ2MzZVLAkvLyBJbnRfVkNWVFNTMlNJNjRybQ0KKyAgICAxMzk4NTcxMzJVLAkvLyBJbnRfVkNWVFNTMlNJNjRycg0KKyAgICAxNDA3NzQ2MzZVLAkvLyBJbnRfVkNWVFNTMlNJcm0NCisgICAgMTM5ODU3MTMyVSwJLy8gSW50X1ZDVlRTUzJTSXJyDQorICAgIDE0MDUxMjUwM1UsCS8vIEludF9WQ1ZUVFBEMkRRcm0NCisgICAgMTM5ODU3MTQzVSwJLy8gSW50X1ZDVlRUUEQyRFFycg0KKyAgICAxNDA1MTI1MTVVLAkvLyBJbnRfVkNWVFRQUzJEUXJtDQorICAgIDEzOTg1NzE1NVUsCS8vIEludF9WQ1ZUVFBTMkRRcnINCisgICAgMTQwNTEyNTI3VSwJLy8gSW50X1ZDVlRUU0QyU0k2NHJtDQorICAgIDEzOTg1NzE2N1UsCS8vIEludF9WQ1ZUVFNEMlNJNjRycg0KKyAgICAxNDA1MTI1MjdVLAkvLyBJbnRfVkNWVFRTRDJTSXJtDQorICAgIDEzOTg1NzE2N1UsCS8vIEludF9WQ1ZUVFNEMlNJcnINCisgICAgMTQwNzc0NjcxVSwJLy8gSW50X1ZDVlRUU1MyU0k2NHJtDQorICAgIDEzOTg1NzE2N1UsCS8vIEludF9WQ1ZUVFNTMlNJNjRycg0KKyAgICAxNDA3NzQ2NzFVLAkvLyBJbnRfVkNWVFRTUzJTSXJtDQorICAgIDEzOTg1NzE2N1UsCS8vIEludF9WQ1ZUVFNTMlNJcnINCisgICAgMTQwNTEyNTM5VSwJLy8gSW50X1ZVQ09NSVNEcm0NCisgICAgMTM5ODU3MTc5VSwJLy8gSW50X1ZVQ09NSVNEcnINCisgICAgMTQwNTEyNTQ5VSwJLy8gSW50X1ZVQ09NSVNTcm0NCisgICAgMTM5ODU3MTg5VSwJLy8gSW50X1ZVQ09NSVNTcnINCisgICAgMTA3Mzc0NTE5OVUsCS8vIEpBRV8xDQorICAgIDEwNzM3NDUxOTlVLAkvLyBKQUVfNA0KKyAgICAxMDczNzQ1MjA0VSwJLy8gSkFfMQ0KKyAgICAxMDczNzQ1MjA0VSwJLy8gSkFfNA0KKyAgICAxMDczNzQ1MjA4VSwJLy8gSkJFXzENCisgICAgMTA3Mzc0NTIwOFUsCS8vIEpCRV80DQorICAgIDEwNzM3NDUyMTNVLAkvLyBKQl8xDQorICAgIDEwNzM3NDUyMTNVLAkvLyBKQl80DQorICAgIDEwNzM3NDUyMTdVLAkvLyBKQ1haOA0KKyAgICAxMDczNzQ1MjIzVSwJLy8gSkVfMQ0KKyAgICAxMDczNzQ1MjIzVSwJLy8gSkVfNA0KKyAgICAxMDczNzQ1MjI3VSwJLy8gSkdFXzENCisgICAgMTA3Mzc0NTIyN1UsCS8vIEpHRV80DQorICAgIDEwNzM3NDUyMzJVLAkvLyBKR18xDQorICAgIDEwNzM3NDUyMzJVLAkvLyBKR180DQorICAgIDEwNzM3NDUyMzZVLAkvLyBKTEVfMQ0KKyAgICAxMDczNzQ1MjM2VSwJLy8gSkxFXzQNCisgICAgMTA3Mzc0NTI0MVUsCS8vIEpMXzENCisgICAgMTA3Mzc0NTI0MVUsCS8vIEpMXzQNCisgICAgNDAyNjU2NjA1VSwJLy8gSk1QMzJtDQorICAgIDEzNDIyMTE0OVUsCS8vIEpNUDMycg0KKyAgICA1MzY4NzQzMzNVLAkvLyBKTVA2NG0NCisgICAgMTA3Mzc0NTI0NVUsCS8vIEpNUDY0cGNyZWwzMg0KKyAgICAxMzQyMjExNDlVLAkvLyBKTVA2NHINCisgICAgMTA3Mzc0NTI0NVUsCS8vIEpNUF8xDQorICAgIDEwNzM3NDUyNDVVLAkvLyBKTVBfNA0KKyAgICAxMDczNzQ1MjUwVSwJLy8gSk5FXzENCisgICAgMTA3Mzc0NTI1MFUsCS8vIEpORV80DQorICAgIDEwNzM3NDUyNTVVLAkvLyBKTk9fMQ0KKyAgICAxMDczNzQ1MjU1VSwJLy8gSk5PXzQNCisgICAgMTA3Mzc0NTI2MFUsCS8vIEpOUF8xDQorICAgIDEwNzM3NDUyNjBVLAkvLyBKTlBfNA0KKyAgICAxMDczNzQ1MjY1VSwJLy8gSk5TXzENCisgICAgMTA3Mzc0NTI2NVUsCS8vIEpOU180DQorICAgIDEwNzM3NDUyNzBVLAkvLyBKT18xDQorICAgIDEwNzM3NDUyNzBVLAkvLyBKT180DQorICAgIDEwNzM3NDUyNzRVLAkvLyBKUF8xDQorICAgIDEwNzM3NDUyNzRVLAkvLyBKUF80DQorICAgIDEwNzM3NDUyNzhVLAkvLyBKU18xDQorICAgIDEwNzM3NDUyNzhVLAkvLyBKU180DQorICAgIDM0NThVLAkvLyBMQUhGDQorICAgIDEzOTk4ODM1OVUsCS8vIExBUjE2cm0NCisgICAgMTM5ODU3Mjg3VSwJLy8gTEFSMTZycg0KKyAgICAxMzk5ODgzNTlVLAkvLyBMQVIzMnJtDQorICAgIDEzOTg1NzI4N1UsCS8vIExBUjMycnINCisgICAgMTM5OTg4MzU5VSwJLy8gTEFSNjRybQ0KKyAgICAxMzk4NTcyODdVLAkvLyBMQVI2NHJyDQorICAgIDI3MjYzMzIyOFUsCS8vIExDTVBYQ0hHMTYNCisgICAgNDA2ODUwOTU2VSwJLy8gTENNUFhDSEczMg0KKyAgICAyMDEzMjY5NDAzVSwJLy8gTENNUFhDSEc2NA0KKyAgICA2NzUyODY0MTJVLAkvLyBMQ01QWENIRzgNCisgICAgNTM2ODc0NDExVSwJLy8gTENNUFhDSEc4Qg0KKyAgICAxMzk3MjYyNjhVLAkvLyBMRERRVXJtDQorICAgIDQwMjY1NjcwN1UsCS8vIExETVhDU1INCisgICAgMTQwOTA1OTMyVSwJLy8gTERTMTZybQ0KKyAgICAxNDA5MDU5MzJVLAkvLyBMRFMzMnJtDQorICAgIDM1MzdVLAkvLyBMRF9GMA0KKyAgICAzNTQyVSwJLy8gTERfRjENCisgICAgODA1MzA5OTE1VSwJLy8gTERfRjMybQ0KKyAgICA5Mzk1Mjc2NDNVLAkvLyBMRF9GNjRtDQorICAgIDIxNDc0ODcxOTVVLAkvLyBMRF9GODBtDQorICAgIDBVLAkvLyBMRF9GcDAzMg0KKyAgICAwVSwJLy8gTERfRnAwNjQNCisgICAgMFUsCS8vIExEX0ZwMDgwDQorICAgIDBVLAkvLyBMRF9GcDEzMg0KKyAgICAwVSwJLy8gTERfRnAxNjQNCisgICAgMFUsCS8vIExEX0ZwMTgwDQorICAgIDBVLAkvLyBMRF9GcDMybQ0KKyAgICAwVSwJLy8gTERfRnAzMm02NA0KKyAgICAwVSwJLy8gTERfRnAzMm04MA0KKyAgICAwVSwJLy8gTERfRnA2NG0NCisgICAgMFUsCS8vIExEX0ZwNjRtODANCisgICAgMFUsCS8vIExEX0ZwODBtDQorICAgIDEzNDIyMTI3NVUsCS8vIExEX0Zycg0KKyAgICAxNDAxMTk1MjBVLAkvLyBMRUExNnINCisgICAgMTQwMTE5NTIwVSwJLy8gTEVBMzJyDQorICAgIDE0MDExOTUyMFUsCS8vIExFQTY0XzMycg0KKyAgICAxNDAyNTA1OTJVLAkvLyBMRUE2NHINCisgICAgMzU1N1UsCS8vIExFQVZFDQorICAgIDM1NTdVLAkvLyBMRUFWRTY0DQorICAgIDE0MDkwNTk2M1UsCS8vIExFUzE2cm0NCisgICAgMTQwOTA1OTYzVSwJLy8gTEVTMzJybQ0KKyAgICAzNTY4VSwJLy8gTEZFTkNFDQorICAgIDE0MDkwNTk3NVUsCS8vIExGUzE2cm0NCisgICAgMTQwOTA1OTc1VSwJLy8gTEZTMzJybQ0KKyAgICAxNDA5MDU5NzVVLAkvLyBMRlM2NHJtDQorICAgIDE3NDQ4MzQwNDRVLAkvLyBMR0RUbQ0KKyAgICAxNDA5MDU5ODZVLAkvLyBMR1MxNnJtDQorICAgIDE0MDkwNTk4NlUsCS8vIExHUzMycm0NCisgICAgMTQwOTA1OTg2VSwJLy8gTEdTNjRybQ0KKyAgICAxNzQ0ODM0MDU1VSwJLy8gTElEVG0NCisgICAgMjY4NDM5MDUzVSwJLy8gTExEVDE2bQ0KKyAgICAxMzQyMjEzMjVVLAkvLyBMTERUMTZyDQorICAgIDI2ODQzOTA1OVUsCS8vIExNU1cxNm0NCisgICAgMTM0MjIxMzMxVSwJLy8gTE1TVzE2cg0KKyAgICAyNzI2MzMzNjlVLAkvLyBMT0NLX0FERDE2bWkNCisgICAgMjcyNjMzMzY5VSwJLy8gTE9DS19BREQxNm1pOA0KKyAgICAyNzI2MzMzNjlVLAkvLyBMT0NLX0FERDE2bXINCisgICAgNDA2ODUxMDk3VSwJLy8gTE9DS19BREQzMm1pDQorICAgIDQwNjg1MTA5N1UsCS8vIExPQ0tfQUREMzJtaTgNCisgICAgNDA2ODUxMDk3VSwJLy8gTE9DS19BREQzMm1yDQorICAgIDU0MTA2ODgyNVUsCS8vIExPQ0tfQURENjRtaTMyDQorICAgIDU0MTA2ODgyNVUsCS8vIExPQ0tfQURENjRtaTgNCisgICAgNTQxMDY4ODI1VSwJLy8gTE9DS19BREQ2NG1yDQorICAgIDY3NTI4NjU1M1UsCS8vIExPQ0tfQUREOG1pDQorICAgIDY3NTI4NjU1M1UsCS8vIExPQ0tfQUREOG1yDQorICAgIDI2ODQzOTA3NlUsCS8vIExPQ0tfREVDMTZtDQorICAgIDQwMjY1NjgwNFUsCS8vIExPQ0tfREVDMzJtDQorICAgIDUzNjg3NDUzMlUsCS8vIExPQ0tfREVDNjRtDQorICAgIDY3MTA5MjI2MFUsCS8vIExPQ0tfREVDOG0NCisgICAgMjY4NDM5MDg3VSwJLy8gTE9DS19JTkMxNm0NCisgICAgNDAyNjU2ODE1VSwJLy8gTE9DS19JTkMzMm0NCisgICAgNTM2ODc0NTQzVSwJLy8gTE9DS19JTkM2NG0NCisgICAgNjcxMDkyMjcxVSwJLy8gTE9DS19JTkM4bQ0KKyAgICAzNjQyVSwJLy8gTE9DS19QUkVGSVgNCisgICAgMjcyNjMzNDA3VSwJLy8gTE9DS19TVUIxNm1pDQorICAgIDI3MjYzMzQwN1UsCS8vIExPQ0tfU1VCMTZtaTgNCisgICAgMjcyNjMzNDA3VSwJLy8gTE9DS19TVUIxNm1yDQorICAgIDQwNjg1MTEzNVUsCS8vIExPQ0tfU1VCMzJtaQ0KKyAgICA0MDY4NTExMzVVLAkvLyBMT0NLX1NVQjMybWk4DQorICAgIDQwNjg1MTEzNVUsCS8vIExPQ0tfU1VCMzJtcg0KKyAgICA1NDEwNjg4NjNVLAkvLyBMT0NLX1NVQjY0bWkzMg0KKyAgICA1NDEwNjg4NjNVLAkvLyBMT0NLX1NVQjY0bWk4DQorICAgIDU0MTA2ODg2M1UsCS8vIExPQ0tfU1VCNjRtcg0KKyAgICA2NzUyODY1OTFVLAkvLyBMT0NLX1NVQjhtaQ0KKyAgICA2NzUyODY1OTFVLAkvLyBMT0NLX1NVQjhtcg0KKyAgICAzNjU4VSwJLy8gTE9EU0INCisgICAgMzY2NFUsCS8vIExPRFNEDQorICAgIDM2NzBVLAkvLyBMT0RTUQ0KKyAgICAzNjc2VSwJLy8gTE9EU1cNCisgICAgMTA3Mzc0NTUwNlUsCS8vIExPT1ANCisgICAgMTA3Mzc0NTUxMlUsCS8vIExPT1BFDQorICAgIDEwNzM3NDU1MTlVLAkvLyBMT09QTkUNCisgICAgMzcwM1UsCS8vIExSRVQNCisgICAgMTM0MjIxNDM2VSwJLy8gTFJFVEkNCisgICAgMTM5OTg4NjEwVSwJLy8gTFNMMTZybQ0KKyAgICAxMzk4NTc1MzhVLAkvLyBMU0wxNnJyDQorICAgIDE0MDExOTY4MlUsCS8vIExTTDMycm0NCisgICAgMTM5ODU3NTM4VSwJLy8gTFNMMzJycg0KKyAgICAxNDAyNTA3NTRVLAkvLyBMU0w2NHJtDQorICAgIDEzOTg1NzUzOFUsCS8vIExTTDY0cnINCisgICAgMTQwOTA2MTE5VSwJLy8gTFNTMTZybQ0KKyAgICAxNDA5MDYxMTlVLAkvLyBMU1MzMnJtDQorICAgIDE0MDkwNjExOVUsCS8vIExTUzY0cm0NCisgICAgMzcyNFUsCS8vIExUUm0NCisgICAgMzcyNFUsCS8vIExUUnINCisgICAgMjI4MTcwNTEwNVUsCS8vIExYQUREMTYNCisgICAgMjQxNTkyMjgzM1UsCS8vIExYQUREMzINCisgICAgMTY1Njc1MzgwOVUsCS8vIExYQURENjQNCisgICAgMjU1MDE0MDU2MVUsCS8vIExYQUREOA0KKyAgICAxMzk4NTc1NjVVLAkvLyBNQVNLTU9WRFFVDQorICAgIDEzOTg1NzU2NVUsCS8vIE1BU0tNT1ZEUVU2NA0KKyAgICAxMzkyMDIyMTdVLAkvLyBNQVhQRHJtDQorICAgIDEzOTIwMjIxN1UsCS8vIE1BWFBEcm1fSW50DQorICAgIDEzODU0Njg1N1UsCS8vIE1BWFBEcnINCisgICAgMTM4NTQ2ODU3VSwJLy8gTUFYUERycl9JbnQNCisgICAgMTM5MjAyMjI0VSwJLy8gTUFYUFNybQ0KKyAgICAxMzkyMDIyMjRVLAkvLyBNQVhQU3JtX0ludA0KKyAgICAxMzg1NDY4NjRVLAkvLyBNQVhQU3JyDQorICAgIDEzODU0Njg2NFUsCS8vIE1BWFBTcnJfSW50DQorICAgIDEzOTMzMzMwM1UsCS8vIE1BWFNEcm0NCisgICAgMTM5MzMzMzAzVSwJLy8gTUFYU0RybV9JbnQNCisgICAgMTM4NTQ2ODcxVSwJLy8gTUFYU0Rycg0KKyAgICAxMzg1NDY4NzFVLAkvLyBNQVhTRHJyX0ludA0KKyAgICAxMzk0NjQzODJVLAkvLyBNQVhTU3JtDQorICAgIDEzOTQ2NDM4MlUsCS8vIE1BWFNTcm1fSW50DQorICAgIDEzODU0Njg3OFUsCS8vIE1BWFNTcnINCisgICAgMTM4NTQ2ODc4VSwJLy8gTUFYU1Nycl9JbnQNCisgICAgMzc4MVUsCS8vIE1GRU5DRQ0KKyAgICAzNzg4VSwJLy8gTUlOR1dfQUxMT0NBDQorICAgIDEzOTIwMjI3OVUsCS8vIE1JTlBEcm0NCisgICAgMTM5MjAyMjc5VSwJLy8gTUlOUERybV9JbnQNCisgICAgMTM4NTQ2OTE5VSwJLy8gTUlOUERycg0KKyAgICAxMzg1NDY5MTlVLAkvLyBNSU5QRHJyX0ludA0KKyAgICAxMzkyMDIyODZVLAkvLyBNSU5QU3JtDQorICAgIDEzOTIwMjI4NlUsCS8vIE1JTlBTcm1fSW50DQorICAgIDEzODU0NjkyNlUsCS8vIE1JTlBTcnINCisgICAgMTM4NTQ2OTI2VSwJLy8gTUlOUFNycl9JbnQNCisgICAgMTM5MzMzMzY1VSwJLy8gTUlOU0RybQ0KKyAgICAxMzkzMzMzNjVVLAkvLyBNSU5TRHJtX0ludA0KKyAgICAxMzg1NDY5MzNVLAkvLyBNSU5TRHJyDQorICAgIDEzODU0NjkzM1UsCS8vIE1JTlNEcnJfSW50DQorICAgIDEzOTQ2NDQ0NFUsCS8vIE1JTlNTcm0NCisgICAgMTM5NDY0NDQ0VSwJLy8gTUlOU1NybV9JbnQNCisgICAgMTM4NTQ2OTQwVSwJLy8gTUlOU1Nycg0KKyAgICAxMzg1NDY5NDBVLAkvLyBNSU5TU3JyX0ludA0KKyAgICAxNDA1MTIxOTlVLAkvLyBNTVhfQ1ZUUEQyUElybQ0KKyAgICAxMzk4NTY4MzlVLAkvLyBNTVhfQ1ZUUEQyUElycg0KKyAgICAxNDAyNTAwNjVVLAkvLyBNTVhfQ1ZUUEkyUERybQ0KKyAgICAxMzk4NTY4NDlVLAkvLyBNTVhfQ1ZUUEkyUERycg0KKyAgICAxNDAyNTAwNzVVLAkvLyBNTVhfQ1ZUUEkyUFNybQ0KKyAgICAxMzk4NTY4NTlVLAkvLyBNTVhfQ1ZUUEkyUFNycg0KKyAgICAxNDA2NDMzMDFVLAkvLyBNTVhfQ1ZUUFMyUElybQ0KKyAgICAxMzk4NTY4NjlVLAkvLyBNTVhfQ1ZUUFMyUElycg0KKyAgICAxNDA1MTIyNjBVLAkvLyBNTVhfQ1ZUVFBEMlBJcm0NCisgICAgMTM5ODU2OTAwVSwJLy8gTU1YX0NWVFRQRDJQSXJyDQorICAgIDE0MDY0MzM0M1UsCS8vIE1NWF9DVlRUUFMyUElybQ0KKyAgICAxMzk4NTY5MTFVLAkvLyBNTVhfQ1ZUVFBTMlBJcnINCisgICAgMzg0M1UsCS8vIE1NWF9FTU1TDQorICAgIDM4NDhVLAkvLyBNTVhfRkVNTVMNCisgICAgMTM5ODU3Njc4VSwJLy8gTU1YX01BU0tNT1ZRDQorICAgIDEzOTg1NzY3OFUsCS8vIE1NWF9NQVNLTU9WUTY0DQorICAgIDEzOTg1NzY4OFUsCS8vIE1NWF9NT1ZENjRmcm9tNjRycg0KKyAgICAxMzk4NTc2ODhVLAkvLyBNTVhfTU9WRDY0Z3JyDQorICAgIDQwNjg1MTM1MlUsCS8vIE1NWF9NT1ZENjRtcg0KKyAgICAxNDAxMTk4MzJVLAkvLyBNTVhfTU9WRDY0cm0NCisgICAgMTM5ODU3Njg4VSwJLy8gTU1YX01PVkQ2NHJyDQorICAgIDEzOTg1NzY4OFUsCS8vIE1NWF9NT1ZENjRycnYxNjQNCisgICAgMTM5ODU3Njg4VSwJLy8gTU1YX01PVkQ2NHRvNjRycg0KKyAgICAxMzk4NTc2OTRVLAkvLyBNTVhfTU9WRFEyUXJyDQorICAgIDEzOTg1NzY5NFUsCS8vIE1NWF9NT1ZGUjY0MlFycg0KKyAgICA1NDEwNjkwOTVVLAkvLyBNTVhfTU9WTlRRbXINCisgICAgMTM5ODU3NzExVSwJLy8gTU1YX01PVlEyRFFycg0KKyAgICAxMzk4NTc3MTFVLAkvLyBNTVhfTU9WUTJGUjY0cnINCisgICAgNTQxMDY5MTEyVSwJLy8gTU1YX01PVlE2NG1yDQorICAgIDE0MDI1MDkzNlUsCS8vIE1NWF9NT1ZRNjRybQ0KKyAgICAxMzk4NTc3MjBVLAkvLyBNTVhfTU9WUTY0cnINCisgICAgMTQwMTE5ODMyVSwJLy8gTU1YX01PVlpESTJQRElybQ0KKyAgICAxMzk4NTc2ODhVLAkvLyBNTVhfTU9WWkRJMlBESXJyDQorICAgIDEzODk0MDIyMlUsCS8vIE1NWF9QQUNLU1NEV3JtDQorICAgIDEzODU0NzAwNlUsCS8vIE1NWF9QQUNLU1NEV3JyDQorICAgIDEzODk0MDIzMlUsCS8vIE1NWF9QQUNLU1NXQnJtDQorICAgIDEzODU0NzAxNlUsCS8vIE1NWF9QQUNLU1NXQnJyDQorICAgIDEzODk0MDI0MlUsCS8vIE1NWF9QQUNLVVNXQnJtDQorICAgIDEzODU0NzAyNlUsCS8vIE1NWF9QQUNLVVNXQnJyDQorICAgIDEzODk0MDI1MlUsCS8vIE1NWF9QQUREQnJtDQorICAgIDEzODU0NzAzNlUsCS8vIE1NWF9QQUREQnJyDQorICAgIDEzODk0MDI1OVUsCS8vIE1NWF9QQURERHJtDQorICAgIDEzODU0NzA0M1UsCS8vIE1NWF9QQURERHJyDQorICAgIDEzODk0MDI2NlUsCS8vIE1NWF9QQUREUXJtDQorICAgIDEzODU0NzA1MFUsCS8vIE1NWF9QQUREUXJyDQorICAgIDEzODk0MDI3M1UsCS8vIE1NWF9QQUREU0JybQ0KKyAgICAxMzg1NDcwNTdVLAkvLyBNTVhfUEFERFNCcnINCisgICAgMTM4OTQwMjgxVSwJLy8gTU1YX1BBRERTV3JtDQorICAgIDEzODU0NzA2NVUsCS8vIE1NWF9QQUREU1dycg0KKyAgICAxMzg5NDAyODlVLAkvLyBNTVhfUEFERFVTQnJtDQorICAgIDEzODU0NzA3M1UsCS8vIE1NWF9QQUREVVNCcnINCisgICAgMTM4OTQwMjk4VSwJLy8gTU1YX1BBRERVU1dybQ0KKyAgICAxMzg1NDcwODJVLAkvLyBNTVhfUEFERFVTV3JyDQorICAgIDEzODk0MDMwN1UsCS8vIE1NWF9QQUREV3JtDQorICAgIDEzODU0NzA5MVUsCS8vIE1NWF9QQUREV3JyDQorICAgIDEzODk0MDMxNFUsCS8vIE1NWF9QQU5ETnJtDQorICAgIDEzODU0NzA5OFUsCS8vIE1NWF9QQU5ETnJyDQorICAgIDEzODk0MDMyMVUsCS8vIE1NWF9QQU5Ecm0NCisgICAgMTM4NTQ3MTA1VSwJLy8gTU1YX1BBTkRycg0KKyAgICAxMzg5NDAzMjdVLAkvLyBNTVhfUEFWR0JybQ0KKyAgICAxMzg1NDcxMTFVLAkvLyBNTVhfUEFWR0Jycg0KKyAgICAxMzg5NDAzMzRVLAkvLyBNTVhfUEFWR1dybQ0KKyAgICAxMzg1NDcxMThVLAkvLyBNTVhfUEFWR1dycg0KKyAgICAxMzg5NDAzNDFVLAkvLyBNTVhfUENNUEVRQnJtDQorICAgIDEzODU0NzEyNVUsCS8vIE1NWF9QQ01QRVFCcnINCisgICAgMTM4OTQwMzUwVSwJLy8gTU1YX1BDTVBFUURybQ0KKyAgICAxMzg1NDcxMzRVLAkvLyBNTVhfUENNUEVRRHJyDQorICAgIDEzODk0MDM1OVUsCS8vIE1NWF9QQ01QRVFXcm0NCisgICAgMTM4NTQ3MTQzVSwJLy8gTU1YX1BDTVBFUVdycg0KKyAgICAxMzg5NDAzNjhVLAkvLyBNTVhfUENNUEdUQnJtDQorICAgIDEzODU0NzE1MlUsCS8vIE1NWF9QQ01QR1RCcnINCisgICAgMTM4OTQwMzc3VSwJLy8gTU1YX1BDTVBHVERybQ0KKyAgICAxMzg1NDcxNjFVLAkvLyBNTVhfUENNUEdURHJyDQorICAgIDEzODk0MDM4NlUsCS8vIE1NWF9QQ01QR1RXcm0NCisgICAgMTM4NTQ3MTcwVSwJLy8gTU1YX1BDTVBHVFdycg0KKyAgICAxMzk4NTc4OTlVLAkvLyBNTVhfUEVYVFJXcmkNCisgICAgMTM4Njc4MjU5VSwJLy8gTU1YX1BJTlNSV3JtaQ0KKyAgICAxMzg1NDcxODdVLAkvLyBNTVhfUElOU1JXcnJpDQorICAgIDEzODk0MDQxMVUsCS8vIE1NWF9QTUFERFdEcm0NCisgICAgMTM4NTQ3MTk1VSwJLy8gTU1YX1BNQUREV0Rycg0KKyAgICAxMzg5NDA0MjBVLAkvLyBNTVhfUE1BWFNXcm0NCisgICAgMTM4NTQ3MjA0VSwJLy8gTU1YX1BNQVhTV3JyDQorICAgIDEzODk0MDQyOFUsCS8vIE1NWF9QTUFYVUJybQ0KKyAgICAxMzg1NDcyMTJVLAkvLyBNTVhfUE1BWFVCcnINCisgICAgMTM4OTQwNDM2VSwJLy8gTU1YX1BNSU5TV3JtDQorICAgIDEzODU0NzIyMFUsCS8vIE1NWF9QTUlOU1dycg0KKyAgICAxMzg5NDA0NDRVLAkvLyBNTVhfUE1JTlVCcm0NCisgICAgMTM4NTQ3MjI4VSwJLy8gTU1YX1BNSU5VQnJyDQorICAgIDEzOTg1Nzk1NlUsCS8vIE1NWF9QTU9WTVNLQnJyDQorICAgIDEzODk0MDQ2MlUsCS8vIE1NWF9QTVVMSFVXcm0NCisgICAgMTM4NTQ3MjQ2VSwJLy8gTU1YX1BNVUxIVVdycg0KKyAgICAxMzg5NDA0NzFVLAkvLyBNTVhfUE1VTEhXcm0NCisgICAgMTM4NTQ3MjU1VSwJLy8gTU1YX1BNVUxIV3JyDQorICAgIDEzODk0MDQ3OVUsCS8vIE1NWF9QTVVMTFdybQ0KKyAgICAxMzg1NDcyNjNVLAkvLyBNTVhfUE1VTExXcnINCisgICAgMTM4OTQwNDg3VSwJLy8gTU1YX1BNVUxVRFFybQ0KKyAgICAxMzg1NDcyNzFVLAkvLyBNTVhfUE1VTFVEUXJyDQorICAgIDEzODk0MDQ5NlUsCS8vIE1NWF9QT1JybQ0KKyAgICAxMzg1NDcyODBVLAkvLyBNTVhfUE9ScnINCisgICAgMTM4OTQwNTAxVSwJLy8gTU1YX1BTQURCV3JtDQorICAgIDEzODU0NzI4NVUsCS8vIE1NWF9QU0FEQldycg0KKyAgICAxNDAyNTEyMjlVLAkvLyBNTVhfUFNIVUZXbWkNCisgICAgMTM5ODU4MDEzVSwJLy8gTU1YX1BTSFVGV3JpDQorICAgIDEzODU0NzMwMVUsCS8vIE1NWF9QU0xMRHJpDQorICAgIDEzODk0MDUxN1UsCS8vIE1NWF9QU0xMRHJtDQorICAgIDEzODU0NzMwMVUsCS8vIE1NWF9QU0xMRHJyDQorICAgIDEzODU0NzMwOFUsCS8vIE1NWF9QU0xMUXJpDQorICAgIDEzODk0MDUyNFUsCS8vIE1NWF9QU0xMUXJtDQorICAgIDEzODU0NzMwOFUsCS8vIE1NWF9QU0xMUXJyDQorICAgIDEzODU0NzMxNVUsCS8vIE1NWF9QU0xMV3JpDQorICAgIDEzODk0MDUzMVUsCS8vIE1NWF9QU0xMV3JtDQorICAgIDEzODU0NzMxNVUsCS8vIE1NWF9QU0xMV3JyDQorICAgIDEzODU0NzMyMlUsCS8vIE1NWF9QU1JBRHJpDQorICAgIDEzODk0MDUzOFUsCS8vIE1NWF9QU1JBRHJtDQorICAgIDEzODU0NzMyMlUsCS8vIE1NWF9QU1JBRHJyDQorICAgIDEzODU0NzMyOVUsCS8vIE1NWF9QU1JBV3JpDQorICAgIDEzODk0MDU0NVUsCS8vIE1NWF9QU1JBV3JtDQorICAgIDEzODU0NzMyOVUsCS8vIE1NWF9QU1JBV3JyDQorICAgIDEzODU0NzMzNlUsCS8vIE1NWF9QU1JMRHJpDQorICAgIDEzODk0MDU1MlUsCS8vIE1NWF9QU1JMRHJtDQorICAgIDEzODU0NzMzNlUsCS8vIE1NWF9QU1JMRHJyDQorICAgIDEzODU0NzM0M1UsCS8vIE1NWF9QU1JMUXJpDQorICAgIDEzODk0MDU1OVUsCS8vIE1NWF9QU1JMUXJtDQorICAgIDEzODU0NzM0M1UsCS8vIE1NWF9QU1JMUXJyDQorICAgIDEzODU0NzM1MFUsCS8vIE1NWF9QU1JMV3JpDQorICAgIDEzODk0MDU2NlUsCS8vIE1NWF9QU1JMV3JtDQorICAgIDEzODU0NzM1MFUsCS8vIE1NWF9QU1JMV3JyDQorICAgIDEzODk0MDU3M1UsCS8vIE1NWF9QU1VCQnJtDQorICAgIDEzODU0NzM1N1UsCS8vIE1NWF9QU1VCQnJyDQorICAgIDEzODk0MDU4MFUsCS8vIE1NWF9QU1VCRHJtDQorICAgIDEzODU0NzM2NFUsCS8vIE1NWF9QU1VCRHJyDQorICAgIDEzODk0MDU4N1UsCS8vIE1NWF9QU1VCUXJtDQorICAgIDEzODU0NzM3MVUsCS8vIE1NWF9QU1VCUXJyDQorICAgIDEzODk0MDU5NFUsCS8vIE1NWF9QU1VCU0JybQ0KKyAgICAxMzg1NDczNzhVLAkvLyBNTVhfUFNVQlNCcnINCisgICAgMTM4OTQwNjAyVSwJLy8gTU1YX1BTVUJTV3JtDQorICAgIDEzODU0NzM4NlUsCS8vIE1NWF9QU1VCU1dycg0KKyAgICAxMzg5NDA2MTBVLAkvLyBNTVhfUFNVQlVTQnJtDQorICAgIDEzODU0NzM5NFUsCS8vIE1NWF9QU1VCVVNCcnINCisgICAgMTM4OTQwNjE5VSwJLy8gTU1YX1BTVUJVU1dybQ0KKyAgICAxMzg1NDc0MDNVLAkvLyBNTVhfUFNVQlVTV3JyDQorICAgIDEzODk0MDYyOFUsCS8vIE1NWF9QU1VCV3JtDQorICAgIDEzODU0NzQxMlUsCS8vIE1NWF9QU1VCV3JyDQorICAgIDEzODk0MDYzNVUsCS8vIE1NWF9QVU5QQ0tIQldybQ0KKyAgICAxMzg1NDc0MTlVLAkvLyBNTVhfUFVOUENLSEJXcnINCisgICAgMTM4OTQwNjQ2VSwJLy8gTU1YX1BVTlBDS0hEUXJtDQorICAgIDEzODU0NzQzMFUsCS8vIE1NWF9QVU5QQ0tIRFFycg0KKyAgICAxMzg5NDA2NTdVLAkvLyBNTVhfUFVOUENLSFdEcm0NCisgICAgMTM4NTQ3NDQxVSwJLy8gTU1YX1BVTlBDS0hXRHJyDQorICAgIDEzODk0MDY2OFUsCS8vIE1NWF9QVU5QQ0tMQldybQ0KKyAgICAxMzg1NDc0NTJVLAkvLyBNTVhfUFVOUENLTEJXcnINCisgICAgMTM4OTQwNjc5VSwJLy8gTU1YX1BVTlBDS0xEUXJtDQorICAgIDEzODU0NzQ2M1UsCS8vIE1NWF9QVU5QQ0tMRFFycg0KKyAgICAxMzg5NDA2OTBVLAkvLyBNTVhfUFVOUENLTFdEcm0NCisgICAgMTM4NTQ3NDc0VSwJLy8gTU1YX1BVTlBDS0xXRHJyDQorICAgIDEzODk0MDcwMVUsCS8vIE1NWF9QWE9Scm0NCisgICAgMTM4NTQ3NDg1VSwJLy8gTU1YX1BYT1Jycg0KKyAgICAwVSwJLy8gTU1YX1ZfU0VUMA0KKyAgICAwVSwJLy8gTU1YX1ZfU0VUQUxMT05FUw0KKyAgICA0Mzg3VSwJLy8gTU9OSVRPUg0KKyAgICAxMTI0MDc3ODY3VSwJLy8gTU9WMTZhbzE2DQorICAgIDI3MjYzNDE1NVUsCS8vIE1PVjE2bWkNCisgICAgMjcyNjM0MTU1VSwJLy8gTU9WMTZtcg0KKyAgICAyNzI2MzQxNTVVLAkvLyBNT1YxNm1zDQorICAgIDEwNzM3NDYyMjRVLAkvLyBNT1YxNm8xNmENCisgICAgMFUsCS8vIE1PVjE2cjANCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WMTZyaQ0KKyAgICAxMzk5ODkyOTFVLAkvLyBNT1YxNnJtDQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjE2cnINCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WMTZycl9SRVYNCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WMTZycw0KKyAgICAxMzk5ODkyOTFVLAkvLyBNT1YxNnNtDQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjE2c3INCisgICAgMTEyODI3MjE3MVUsCS8vIE1PVjMyYW8zMg0KKyAgICAxMzk4NTgyMTlVLAkvLyBNT1YzMmNyDQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjMyZHINCisgICAgNDA2ODUxODgzVSwJLy8gTU9WMzJtaQ0KKyAgICA0MDY4NTE4ODNVLAkvLyBNT1YzMm1yDQorICAgIDQwNjg1MTg4M1UsCS8vIE1PVjMybXJfVEMNCisgICAgNDA2ODUxODgzVSwJLy8gTU9WMzJtcw0KKyAgICAxMDczNzQ2MjM0VSwJLy8gTU9WMzJvMzJhDQorICAgIDBVLAkvLyBNT1YzMnIwDQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjMycmMNCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WMzJyZA0KKyAgICAxMzk4NTgyMTlVLAkvLyBNT1YzMnJpDQorICAgIDE0MDEyMDM2M1UsCS8vIE1PVjMycm0NCisgICAgMTQwMTIwMzYzVSwJLy8gTU9WMzJybV9UQw0KKyAgICAxMzk4NTgyMTlVLAkvLyBNT1YzMnJyDQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjMycnJfUkVWDQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjMycnJfVEMNCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WMzJycw0KKyAgICAxNDAxMjAzNjNVLAkvLyBNT1YzMnNtDQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjMyc3INCisgICAgMjY4NDM1ODk4MVUsCS8vIE1PVjY0RlNybQ0KKyAgICAyNjg0MzU4OTkxVSwJLy8gTU9WNjRHU3JtDQorICAgIDExMzI0NjY0NzVVLAkvLyBNT1Y2NGFvNjQNCisgICAgMTEzMjQ2NjQ3NVUsCS8vIE1PVjY0YW84DQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjY0Y3INCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WNjRkcg0KKyAgICA1NDEwNjk2MTFVLAkvLyBNT1Y2NG1pMzINCisgICAgNTQxMDY5NjExVSwJLy8gTU9WNjRtcg0KKyAgICA1NDEwNjk2MTFVLAkvLyBNT1Y2NG1yX1RDDQorICAgIDU0MTA2OTYxMVUsCS8vIE1PVjY0bXMNCisgICAgMTA3Mzc0NjI2NVUsCS8vIE1PVjY0bzY0YQ0KKyAgICAxMDczNzQ2MjY1VSwJLy8gTU9WNjRvOGENCisgICAgMFUsCS8vIE1PVjY0cjANCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WNjRyYw0KKyAgICAxMzk4NTgyMTlVLAkvLyBNT1Y2NHJkDQorICAgIDEzOTg1ODI3NlUsCS8vIE1PVjY0cmkNCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WNjRyaTMyDQorICAgIDBVLAkvLyBNT1Y2NHJpNjRpMzINCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WNjRyaV9hbHQNCisgICAgMTQwMjUxNDM1VSwJLy8gTU9WNjRybQ0KKyAgICAxNDAyNTE0MzVVLAkvLyBNT1Y2NHJtX1RDDQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjY0cnINCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WNjRycl9SRVYNCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WNjRycl9UQw0KKyAgICAxMzk4NTgyMTlVLAkvLyBNT1Y2NHJzDQorICAgIDE0MDI1MTQzNVUsCS8vIE1PVjY0c20NCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WNjRzcg0KKyAgICAxMzk4NTc3MjBVLAkvLyBNT1Y2NHRvUFFJcnINCisgICAgMTQwMjUwOTM2VSwJLy8gTU9WNjR0b1NEcm0NCisgICAgMTM5ODU3NzIwVSwJLy8gTU9WNjR0b1NEcnINCisgICAgMTEzNjY2MDc3OVUsCS8vIE1PVjhhbzgNCisgICAgNjc1Mjg3MzM5VSwJLy8gTU9WOG1pDQorICAgIDY3NTI4NzMzOVUsCS8vIE1PVjhtcg0KKyAgICA2NzUyODczMzlVLAkvLyBNT1Y4bXJfTk9SRVgNCisgICAgMTA3Mzc0NjI4NFUsCS8vIE1PVjhvOGENCisgICAgMFUsCS8vIE1PVjhyMA0KKyAgICAxMzk4NTgyMTlVLAkvLyBNT1Y4cmkNCisgICAgMTQwMzgyNTA3VSwJLy8gTU9WOHJtDQorICAgIDE0MDM4MjUwN1UsCS8vIE1PVjhybV9OT1JFWA0KKyAgICAxMzk4NTgyMTlVLAkvLyBNT1Y4cnINCisgICAgMTM5ODU4MjE5VSwJLy8gTU9WOHJyX05PUkVYDQorICAgIDEzOTg1ODIxOVUsCS8vIE1PVjhycl9SRVYNCisgICAgMjgxODU3NTA0MVUsCS8vIE1PVkFQRG1yDQorICAgIDE0MDUxMTkzN1UsCS8vIE1PVkFQRHJtDQorICAgIDEzOTg1NjU3N1UsCS8vIE1PVkFQRHJyDQorICAgIDI4MTg1NzUwNDlVLAkvLyBNT1ZBUFNtcg0KKyAgICAxNDA1MTE5NDVVLAkvLyBNT1ZBUFNybQ0KKyAgICAxMzk4NTY1ODVVLAkvLyBNT1ZBUFNycg0KKyAgICAxNDA2NDQ3MjZVLAkvLyBNT1ZERFVQcm0NCisgICAgMTM5ODU4Mjk0VSwJLy8gTU9WRERVUHJyDQorICAgIDE0MDExOTgzMlUsCS8vIE1PVkRJMlBESXJtDQorICAgIDEzOTg1NzY4OFUsCS8vIE1PVkRJMlBESXJyDQorICAgIDE0MDExOTgzMlUsCS8vIE1PVkRJMlNTcm0NCisgICAgMTM5ODU3Njg4VSwJLy8gTU9WREkyU1Nycg0KKyAgICAxNDgwNTkzNzkxVSwJLy8gTU9WRFFBbXINCisgICAgMTM5NzI3MjMxVSwJLy8gTU9WRFFBcm0NCisgICAgMTM5ODU4MzAzVSwJLy8gTU9WRFFBcnINCisgICAgMTQ4MDU5Mzc5OVUsCS8vIE1PVkRRVW1yDQorICAgIDE0ODA1OTM3OTlVLAkvLyBNT1ZEUVVtcl9JbnQNCisgICAgMTM5NzI3MjM5VSwJLy8gTU9WRFFVcm0NCisgICAgMTM5NzI3MjM5VSwJLy8gTU9WRFFVcm1fSW50DQorICAgIDEzODU0NzU5OVUsCS8vIE1PVkhMUFNycg0KKyAgICA5NDM3MjI5MDRVLAkvLyBNT1ZIUERtcg0KKyAgICAxMzkzMzQwNDBVLAkvLyBNT1ZIUERybQ0KKyAgICA5NDM3MjI5MTJVLAkvLyBNT1ZIUFNtcg0KKyAgICAxMzkzMzQwNDhVLAkvLyBNT1ZIUFNybQ0KKyAgICAxMzg1NDc2MjRVLAkvLyBNT1ZMSFBTcnINCisgICAgOTQzNzIyOTI5VSwJLy8gTU9WTFBEbXINCisgICAgMTM5MzM0MDY1VSwJLy8gTU9WTFBEcm0NCisgICAgOTQzNzIyOTM3VSwJLy8gTU9WTFBTbXINCisgICAgMTM5MzM0MDczVSwJLy8gTU9WTFBTcm0NCisgICAgNTQxMDY5MTEyVSwJLy8gTU9WTFExMjhtcg0KKyAgICAxMzk4NTgzNjlVLAkvLyBNT1ZNU0tQRHJyDQorICAgIDEzOTg1ODM3OVUsCS8vIE1PVk1TS1BTcnINCisgICAgMTM5NzI3MzE3VSwJLy8gTU9WTlREUUFybQ0KKyAgICAyODE4NTc2ODYzVSwJLy8gTU9WTlREUV82NG1yDQorICAgIDI4MTg1NzY4NjNVLAkvLyBNT1ZOVERRbXINCisgICAgMjgxODU3Njg2M1UsCS8vIE1PVk5URFFtcl9JbnQNCisgICAgNTQxMDY5ODAwVSwJLy8gTU9WTlRJXzY0bXINCisgICAgNDA2ODUyMDcyVSwJLy8gTU9WTlRJbXINCisgICAgNDA2ODUyMDcyVSwJLy8gTU9WTlRJbXJfSW50DQorICAgIDI4MTg1NzY4ODBVLAkvLyBNT1ZOVFBEbXINCisgICAgMTQ4MDU5MzkwNFUsCS8vIE1PVk5UUERtcl9JbnQNCisgICAgMjgxODU3Njg4OVUsCS8vIE1PVk5UUFNtcg0KKyAgICAxNDgwNTkzOTEzVSwJLy8gTU9WTlRQU21yX0ludA0KKyAgICAwVSwJLy8gTU9WUEMzMnINCisgICAgNDA2ODUxMzUyVSwJLy8gTU9WUERJMkRJbXINCisgICAgMTM5ODU3Njg4VSwJLy8gTU9WUERJMkRJcnINCisgICAgNTQxMDY5MTEyVSwJLy8gTU9WUFFJMlFJbXINCisgICAgMTM5ODU3NzIwVSwJLy8gTU9WUFFJdG82NHJyDQorICAgIDE0MDI1MDkzNlUsCS8vIE1PVlFJMlBRSXJtDQorICAgIDEzOTg1NzcyMFUsCS8vIE1PVlF4cnhyDQorICAgIDQ2MTBVLAkvLyBNT1ZTQg0KKyAgICA0NjExVSwJLy8gTU9WU0QNCisgICAgOTQzNzIzMDE3VSwJLy8gTU9WU0Rtcg0KKyAgICAxNDA2NDQ4NzNVLAkvLyBNT1ZTRHJtDQorICAgIDEzODU0NzcyMVUsCS8vIE1PVlNEcnINCisgICAgNTQxMDY5MTEyVSwJLy8gTU9WU0R0bzY0bXINCisgICAgMTM5ODU3NzIwVSwJLy8gTU9WU0R0bzY0cnINCisgICAgMTQwNTEzODA4VSwJLy8gTU9WU0hEVVBybQ0KKyAgICAxMzk4NTg0NDhVLAkvLyBNT1ZTSERVUHJyDQorICAgIDE0MDUxMzgxOFUsCS8vIE1PVlNMRFVQcm0NCisgICAgMTM5ODU4NDU4VSwJLy8gTU9WU0xEVVBycg0KKyAgICA0NjQ0VSwJLy8gTU9WU1ENCisgICAgNDA2ODUxMzUyVSwJLy8gTU9WU1MyREltcg0KKyAgICAxMzk4NTc2ODhVLAkvLyBNT1ZTUzJESXJyDQorICAgIDgwOTUwNTMyMlUsCS8vIE1PVlNTbXINCisgICAgMTQwNzc1OTc4VSwJLy8gTU9WU1NybQ0KKyAgICAxMzg1NDc3NTRVLAkvLyBNT1ZTU3JyDQorICAgIDQ2MTBVLAkvLyBNT1ZTVw0KKyAgICAwVSwJLy8gTU9WU1gxNnJtOA0KKyAgICAxNDAzODI3NjlVLAkvLyBNT1ZTWDE2cm04Vw0KKyAgICAwVSwJLy8gTU9WU1gxNnJyOA0KKyAgICAxMzk4NTg0ODFVLAkvLyBNT1ZTWDE2cnI4Vw0KKyAgICAxMzk5ODk1NTNVLAkvLyBNT1ZTWDMycm0xNg0KKyAgICAxNDAzODI3NjlVLAkvLyBNT1ZTWDMycm04DQorICAgIDEzOTg1ODQ4MVUsCS8vIE1PVlNYMzJycjE2DQorICAgIDEzOTg1ODQ4MVUsCS8vIE1PVlNYMzJycjgNCisgICAgMTM5OTg5NTUzVSwJLy8gTU9WU1g2NHJtMTYNCisgICAgMTQwMTIwNjMyVSwJLy8gTU9WU1g2NHJtMzINCisgICAgMTQwMzgyNzY5VSwJLy8gTU9WU1g2NHJtOA0KKyAgICAxMzk4NTg0ODFVLAkvLyBNT1ZTWDY0cnIxNg0KKyAgICAxMzk4NTg0ODhVLAkvLyBNT1ZTWDY0cnIzMg0KKyAgICAxMzk4NTg0ODFVLAkvLyBNT1ZTWDY0cnI4DQorICAgIDI4MTg1NzY5NjBVLAkvLyBNT1ZVUERtcg0KKyAgICAyODE4NTc2OTYwVSwJLy8gTU9WVVBEbXJfSW50DQorICAgIDE0MDUxMzg1NlUsCS8vIE1PVlVQRHJtDQorICAgIDE0MDUxMzg1NlUsCS8vIE1PVlVQRHJtX0ludA0KKyAgICAxMzk4NTg0OTZVLAkvLyBNT1ZVUERycg0KKyAgICAyODE4NTc2OTY4VSwJLy8gTU9WVVBTbXINCisgICAgMjgxODU3Njk2OFUsCS8vIE1PVlVQU21yX0ludA0KKyAgICAxNDA1MTM4NjRVLAkvLyBNT1ZVUFNybQ0KKyAgICAxNDA1MTM4NjRVLAkvLyBNT1ZVUFNybV9JbnQNCisgICAgMTM5ODU4NTA0VSwJLy8gTU9WVVBTcnINCisgICAgMTQwMTE5ODMyVSwJLy8gTU9WWkRJMlBESXJtDQorICAgIDEzOTg1NzY4OFUsCS8vIE1PVlpESTJQRElycg0KKyAgICAxMzk3MjY2NDhVLAkvLyBNT1ZaUFFJTG8yUFFJcm0NCisgICAgMTM5ODU3NzIwVSwJLy8gTU9WWlBRSUxvMlBRSXJyDQorICAgIDE0MDI1MDkzNlUsCS8vIE1PVlpRSTJQUUlybQ0KKyAgICAxMzk4NTc3MjBVLAkvLyBNT1ZaUUkyUFFJcnINCisgICAgMFUsCS8vIE1PVlpYMTZybTgNCisgICAgMTQwMzgyODAwVSwJLy8gTU9WWlgxNnJtOFcNCisgICAgMFUsCS8vIE1PVlpYMTZycjgNCisgICAgMTM5ODU4NTEyVSwJLy8gTU9WWlgxNnJyOFcNCisgICAgMTQwMzgyODAwVSwJLy8gTU9WWlgzMl9OT1JFWHJtOA0KKyAgICAxMzk4NTg1MTJVLAkvLyBNT1ZaWDMyX05PUkVYcnI4DQorICAgIDEzOTk4OTU4NFUsCS8vIE1PVlpYMzJybTE2DQorICAgIDE0MDM4MjgwMFUsCS8vIE1PVlpYMzJybTgNCisgICAgMTM5ODU4NTEyVSwJLy8gTU9WWlgzMnJyMTYNCisgICAgMTM5ODU4NTEyVSwJLy8gTU9WWlgzMnJyOA0KKyAgICAwVSwJLy8gTU9WWlg2NHJtMTYNCisgICAgMTM5OTg5NTg0VSwJLy8gTU9WWlg2NHJtMTZfUQ0KKyAgICAwVSwJLy8gTU9WWlg2NHJtMzINCisgICAgMFUsCS8vIE1PVlpYNjRybTgNCisgICAgMTQwMzgyODAwVSwJLy8gTU9WWlg2NHJtOF9RDQorICAgIDBVLAkvLyBNT1ZaWDY0cnIxNg0KKyAgICAxMzk4NTg1MTJVLAkvLyBNT1ZaWDY0cnIxNl9RDQorICAgIDBVLAkvLyBNT1ZaWDY0cnIzMg0KKyAgICAwVSwJLy8gTU9WWlg2NHJyOA0KKyAgICAxMzk4NTg1MTJVLAkvLyBNT1ZaWDY0cnI4X1ENCisgICAgMFUsCS8vIE1PVl9GcDMyMzINCisgICAgMFUsCS8vIE1PVl9GcDMyNjQNCisgICAgMFUsCS8vIE1PVl9GcDMyODANCisgICAgMFUsCS8vIE1PVl9GcDY0MzINCisgICAgMFUsCS8vIE1PVl9GcDY0NjQNCisgICAgMFUsCS8vIE1PVl9GcDY0ODANCisgICAgMFUsCS8vIE1PVl9GcDgwMzINCisgICAgMFUsCS8vIE1PVl9GcDgwNjQNCisgICAgMFUsCS8vIE1PVl9GcDgwODANCisgICAgMTM5NTk2Mzc1VSwJLy8gTVBTQURCV3JtaQ0KKyAgICAxMzg1NDc3OTlVLAkvLyBNUFNBREJXcnJpDQorICAgIDI2ODQ0MDE2MFUsCS8vIE1VTDE2bQ0KKyAgICAxMzQyMjI0MzJVLAkvLyBNVUwxNnINCisgICAgNDAyNjU3ODg4VSwJLy8gTVVMMzJtDQorICAgIDEzNDIyMjQzMlUsCS8vIE1VTDMycg0KKyAgICA1MzY4NzU2MTZVLAkvLyBNVUw2NG0NCisgICAgMTM0MjIyNDMyVSwJLy8gTVVMNjRyDQorICAgIDY3MTA5MzM0NFUsCS8vIE1VTDhtDQorICAgIDEzNDIyMjQzMlUsCS8vIE1VTDhyDQorICAgIDEzOTIwMzE3M1UsCS8vIE1VTFBEcm0NCisgICAgMTM4NTQ3ODEzVSwJLy8gTVVMUERycg0KKyAgICAxMzkyMDMxODBVLAkvLyBNVUxQU3JtDQorICAgIDEzODU0NzgyMFUsCS8vIE1VTFBTcnINCisgICAgMTM5MzM0MjU5VSwJLy8gTVVMU0RybQ0KKyAgICAxMzkzMzQyNTlVLAkvLyBNVUxTRHJtX0ludA0KKyAgICAxMzg1NDc4MjdVLAkvLyBNVUxTRHJyDQorICAgIDEzODU0NzgyN1UsCS8vIE1VTFNEcnJfSW50DQorICAgIDEzOTQ2NTMzOFUsCS8vIE1VTFNTcm0NCisgICAgMTM5NDY1MzM4VSwJLy8gTVVMU1NybV9JbnQNCisgICAgMTM4NTQ3ODM0VSwJLy8gTVVMU1Nycg0KKyAgICAxMzg1NDc4MzRVLAkvLyBNVUxTU3JyX0ludA0KKyAgICA4MDUzMTExMDVVLAkvLyBNVUxfRjMybQ0KKyAgICA5Mzk1Mjg4MzNVLAkvLyBNVUxfRjY0bQ0KKyAgICAyNjg0NDAxOTlVLAkvLyBNVUxfRkkxNm0NCisgICAgNDAyNjU3OTI3VSwJLy8gTVVMX0ZJMzJtDQorICAgIDEzNDIyMjQ3OFUsCS8vIE1VTF9GUHJTVDANCisgICAgMTM0MjIyNDY1VSwJLy8gTVVMX0ZTVDByDQorICAgIDBVLAkvLyBNVUxfRnAzMg0KKyAgICAwVSwJLy8gTVVMX0ZwMzJtDQorICAgIDBVLAkvLyBNVUxfRnA2NA0KKyAgICAwVSwJLy8gTVVMX0ZwNjRtDQorICAgIDBVLAkvLyBNVUxfRnA2NG0zMg0KKyAgICAwVSwJLy8gTVVMX0ZwODANCisgICAgMFUsCS8vIE1VTF9GcDgwbTMyDQorICAgIDBVLAkvLyBNVUxfRnA4MG02NA0KKyAgICAwVSwJLy8gTVVMX0ZwSTE2bTMyDQorICAgIDBVLAkvLyBNVUxfRnBJMTZtNjQNCisgICAgMFUsCS8vIE1VTF9GcEkxNm04MA0KKyAgICAwVSwJLy8gTVVMX0ZwSTMybTMyDQorICAgIDBVLAkvLyBNVUxfRnBJMzJtNjQNCisgICAgMFUsCS8vIE1VTF9GcEkzMm04MA0KKyAgICAxNDI2MTEwNzNVLAkvLyBNVUxfRnJTVDANCisgICAgNDc1N1UsCS8vIE1XQUlUDQorICAgIDI2ODQ0MDIxOVUsCS8vIE5FRzE2bQ0KKyAgICAxMzQyMjI0OTFVLAkvLyBORUcxNnINCisgICAgNDAyNjU3OTQ3VSwJLy8gTkVHMzJtDQorICAgIDEzNDIyMjQ5MVUsCS8vIE5FRzMycg0KKyAgICA1MzY4NzU2NzVVLAkvLyBORUc2NG0NCisgICAgMTM0MjIyNDkxVSwJLy8gTkVHNjRyDQorICAgIDY3MTA5MzQwM1UsCS8vIE5FRzhtDQorICAgIDEzNDIyMjQ5MVUsCS8vIE5FRzhyDQorICAgIDQ3NjhVLAkvLyBOT09QDQorICAgIDQwMjY1Nzk1NlUsCS8vIE5PT1BMDQorICAgIDI2ODQ0MDIyOFUsCS8vIE5PT1BXDQorICAgIDI2ODQ0MDIzM1UsCS8vIE5PVDE2bQ0KKyAgICAxMzQyMjI1MDVVLAkvLyBOT1QxNnINCisgICAgNDAyNjU3OTYxVSwJLy8gTk9UMzJtDQorICAgIDEzNDIyMjUwNVUsCS8vIE5PVDMycg0KKyAgICA1MzY4NzU2ODlVLAkvLyBOT1Q2NG0NCisgICAgMTM0MjIyNTA1VSwJLy8gTk9UNjRyDQorICAgIDY3MTA5MzQxN1UsCS8vIE5PVDhtDQorICAgIDEzNDIyMjUwNVUsCS8vIE5PVDhyDQorICAgIDEzNDIyMjUxMFUsCS8vIE9SMTZpMTYNCisgICAgMjcyNjM0NTUxVSwJLy8gT1IxNm1pDQorICAgIDI3MjYzNDU1MVUsCS8vIE9SMTZtaTgNCisgICAgMjcyNjM0NTUxVSwJLy8gT1IxNm1yDQorICAgIDEzODU0Nzg5NVUsCS8vIE9SMTZyaQ0KKyAgICAxMzg1NDc4OTVVLAkvLyBPUjE2cmk4DQorICAgIDEzODY3ODk2N1UsCS8vIE9SMTZybQ0KKyAgICAxMzg1NDc4OTVVLAkvLyBPUjE2cnINCisgICAgMTM4NTQ3ODk1VSwJLy8gT1IxNnJyX1JFVg0KKyAgICAxMzQyMjI1MjNVLAkvLyBPUjMyaTMyDQorICAgIDQwNjg1MjI3OVUsCS8vIE9SMzJtaQ0KKyAgICA0MDY4NTIyNzlVLAkvLyBPUjMybWk4DQorICAgIDQwNjg1MjI3OVUsCS8vIE9SMzJtcg0KKyAgICAxMzg1NDc4OTVVLAkvLyBPUjMycmkNCisgICAgMTM4NTQ3ODk1VSwJLy8gT1IzMnJpOA0KKyAgICAxMzg4MTAwMzlVLAkvLyBPUjMycm0NCisgICAgMTM4NTQ3ODk1VSwJLy8gT1IzMnJyDQorICAgIDEzODU0Nzg5NVUsCS8vIE9SMzJycl9SRVYNCisgICAgMTM0MjIyNTMzVSwJLy8gT1I2NGkzMg0KKyAgICA1NDEwNzAwMDdVLAkvLyBPUjY0bWkzMg0KKyAgICA1NDEwNzAwMDdVLAkvLyBPUjY0bWk4DQorICAgIDU0MTA3MDAwN1UsCS8vIE9SNjRtcg0KKyAgICAxMzg1NDc4OTVVLAkvLyBPUjY0cmkzMg0KKyAgICAxMzg1NDc4OTVVLAkvLyBPUjY0cmk4DQorICAgIDEzODk0MTExMVUsCS8vIE9SNjRybQ0KKyAgICAxMzg1NDc4OTVVLAkvLyBPUjY0cnINCisgICAgMTM4NTQ3ODk1VSwJLy8gT1I2NHJyX1JFVg0KKyAgICAxMzQyMjI1NDNVLAkvLyBPUjhpOA0KKyAgICA2NzUyODc3MzVVLAkvLyBPUjhtaQ0KKyAgICA2NzUyODc3MzVVLAkvLyBPUjhtcg0KKyAgICAxMzg1NDc4OTVVLAkvLyBPUjhyaQ0KKyAgICAxMzkwNzIxODNVLAkvLyBPUjhybQ0KKyAgICAxMzg1NDc4OTVVLAkvLyBPUjhycg0KKyAgICAxMzg1NDc4OTVVLAkvLyBPUjhycl9SRVYNCisgICAgMTM5MjAxMjMzVSwJLy8gT1JQRHJtDQorICAgIDEzODU0NTg3M1UsCS8vIE9SUERycg0KKyAgICAxMzkyMDEyMzlVLAkvLyBPUlBTcm0NCisgICAgMTM4NTQ1ODc5VSwJLy8gT1JQU3JyDQorICAgIDIwMTMzMTQxNlUsCS8vIE9VVDE2aXINCisgICAgNDgyOVUsCS8vIE9VVDE2cnINCisgICAgMjA1NTI1NzIwVSwJLy8gT1VUMzJpcg0KKyAgICA0ODQyVSwJLy8gT1VUMzJycg0KKyAgICAyMDk3MjAwMjRVLAkvLyBPVVQ4aXINCisgICAgNDg1NlUsCS8vIE9VVDhycg0KKyAgICA0ODY5VSwJLy8gT1VUU0INCisgICAgNDg3NVUsCS8vIE9VVFNEDQorICAgIDQ4ODFVLAkvLyBPVVRTVw0KKyAgICAxMzk3Mjc2MzlVLAkvLyBQQUJTQnJtMTI4DQorICAgIDE0MDI1MTkyN1UsCS8vIFBBQlNCcm02NA0KKyAgICAxMzk4NTg3MTFVLAkvLyBQQUJTQnJyMTI4DQorICAgIDEzOTg1ODcxMVUsCS8vIFBBQlNCcnI2NA0KKyAgICAxMzk3Mjc2NDZVLAkvLyBQQUJTRHJtMTI4DQorICAgIDE0MDI1MTkzNFUsCS8vIFBBQlNEcm02NA0KKyAgICAxMzk4NTg3MThVLAkvLyBQQUJTRHJyMTI4DQorICAgIDEzOTg1ODcxOFUsCS8vIFBBQlNEcnI2NA0KKyAgICAxMzk3Mjc2NTNVLAkvLyBQQUJTV3JtMTI4DQorICAgIDE0MDI1MTk0MVUsCS8vIFBBQlNXcm02NA0KKyAgICAxMzk4NTg3MjVVLAkvLyBQQUJTV3JyMTI4DQorICAgIDEzOTg1ODcyNVUsCS8vIFBBQlNXcnI2NA0KKyAgICAxMzk1OTU1ODJVLAkvLyBQQUNLU1NEV3JtDQorICAgIDEzODU0NzAwNlUsCS8vIFBBQ0tTU0RXcnINCisgICAgMTM5NTk1NTkyVSwJLy8gUEFDS1NTV0JybQ0KKyAgICAxMzg1NDcwMTZVLAkvLyBQQUNLU1NXQnJyDQorICAgIDEzOTU5NjU4OFUsCS8vIFBBQ0tVU0RXcm0NCisgICAgMTM4NTQ4MDEyVSwJLy8gUEFDS1VTRFdycg0KKyAgICAxMzk1OTU2MDJVLAkvLyBQQUNLVVNXQnJtDQorICAgIDEzODU0NzAyNlUsCS8vIFBBQ0tVU1dCcnINCisgICAgMTM5NTk1NjEyVSwJLy8gUEFEREJybQ0KKyAgICAxMzg1NDcwMzZVLAkvLyBQQUREQnJyDQorICAgIDEzOTU5NTYxOVUsCS8vIFBBREREcm0NCisgICAgMTM4NTQ3MDQzVSwJLy8gUEFERERycg0KKyAgICAxMzk1OTU2MjZVLAkvLyBQQUREUXJtDQorICAgIDEzODU0NzA1MFUsCS8vIFBBRERRcnINCisgICAgMTM5NTk1NjMzVSwJLy8gUEFERFNCcm0NCisgICAgMTM4NTQ3MDU3VSwJLy8gUEFERFNCcnINCisgICAgMTM5NTk1NjQxVSwJLy8gUEFERFNXcm0NCisgICAgMTM4NTQ3MDY1VSwJLy8gUEFERFNXcnINCisgICAgMTM5NTk1NjQ5VSwJLy8gUEFERFVTQnJtDQorICAgIDEzODU0NzA3M1UsCS8vIFBBRERVU0Jycg0KKyAgICAxMzk1OTU2NThVLAkvLyBQQUREVVNXcm0NCisgICAgMTM4NTQ3MDgyVSwJLy8gUEFERFVTV3JyDQorICAgIDEzOTU5NTY2N1UsCS8vIFBBRERXcm0NCisgICAgMTM4NTQ3MDkxVSwJLy8gUEFERFdycg0KKyAgICAxMzk1OTY1OThVLAkvLyBQQUxJR05SMTI4cm0NCisgICAgMTM4NTQ4MDIyVSwJLy8gUEFMSUdOUjEyOHJyDQorICAgIDEzODk0MTIzOFUsCS8vIFBBTElHTlI2NHJtDQorICAgIDEzODU0ODAyMlUsCS8vIFBBTElHTlI2NHJyDQorICAgIDEzOTU5NTY3NFUsCS8vIFBBTkROcm0NCisgICAgMTM4NTQ3MDk4VSwJLy8gUEFORE5ycg0KKyAgICAxMzk1OTU2ODFVLAkvLyBQQU5Ecm0NCisgICAgMTM4NTQ3MTA1VSwJLy8gUEFORHJyDQorICAgIDQ5MjdVLAkvLyBQQVVTRQ0KKyAgICAxMzk1OTU2ODdVLAkvLyBQQVZHQnJtDQorICAgIDEzODU0NzExMVUsCS8vIFBBVkdCcnINCisgICAgMTM5NTk1Njk0VSwJLy8gUEFWR1dybQ0KKyAgICAxMzg1NDcxMThVLAkvLyBQQVZHV3JyDQorICAgIDEzOTU5NjYxM1UsCS8vIFBCTEVORFZCcm0wDQorICAgIDEzODU0ODAzN1UsCS8vIFBCTEVORFZCcnIwDQorICAgIDEzOTU5NjYyM1UsCS8vIFBCTEVORFdybWkNCisgICAgMTM4NTQ4MDQ3VSwJLy8gUEJMRU5EV3JyaQ0KKyAgICAxMzk1OTU3MDFVLAkvLyBQQ01QRVFCcm0NCisgICAgMTM4NTQ3MTI1VSwJLy8gUENNUEVRQnJyDQorICAgIDEzOTU5NTcxMFUsCS8vIFBDTVBFUURybQ0KKyAgICAxMzg1NDcxMzRVLAkvLyBQQ01QRVFEcnINCisgICAgMTM5NTk2NjMyVSwJLy8gUENNUEVRUXJtDQorICAgIDEzODU0ODA1NlUsCS8vIFBDTVBFUVFycg0KKyAgICAxMzk1OTU3MTlVLAkvLyBQQ01QRVFXcm0NCisgICAgMTM4NTQ3MTQzVSwJLy8gUENNUEVRV3JyDQorICAgIDEzOTcyNzcxM1UsCS8vIFBDTVBFU1RSSUFybQ0KKyAgICAxMzk4NTg3ODVVLAkvLyBQQ01QRVNUUklBcnINCisgICAgMTM5NzI3NzEzVSwJLy8gUENNUEVTVFJJQ3JtDQorICAgIDEzOTg1ODc4NVUsCS8vIFBDTVBFU1RSSUNycg0KKyAgICAxMzk3Mjc3MTNVLAkvLyBQQ01QRVNUUklPcm0NCisgICAgMTM5ODU4Nzg1VSwJLy8gUENNUEVTVFJJT3JyDQorICAgIDEzOTcyNzcxM1UsCS8vIFBDTVBFU1RSSVNybQ0KKyAgICAxMzk4NTg3ODVVLAkvLyBQQ01QRVNUUklTcnINCisgICAgMTM5NzI3NzEzVSwJLy8gUENNUEVTVFJJWnJtDQorICAgIDEzOTg1ODc4NVUsCS8vIFBDTVBFU1RSSVpycg0KKyAgICAxMzk3Mjc3MTNVLAkvLyBQQ01QRVNUUklybQ0KKyAgICAxMzk4NTg3ODVVLAkvLyBQQ01QRVNUUklycg0KKyAgICA0OTcyVSwJLy8gUENNUEVTVFJNMTI4TUVNDQorICAgIDQ5OTVVLAkvLyBQQ01QRVNUUk0xMjhSRUcNCisgICAgMTM5NzI3NzcwVSwJLy8gUENNUEVTVFJNMTI4cm0NCisgICAgMTM5ODU4ODQyVSwJLy8gUENNUEVTVFJNMTI4cnINCisgICAgMTM5NTk1NzI4VSwJLy8gUENNUEdUQnJtDQorICAgIDEzODU0NzE1MlUsCS8vIFBDTVBHVEJycg0KKyAgICAxMzk1OTU3MzdVLAkvLyBQQ01QR1REcm0NCisgICAgMTM4NTQ3MTYxVSwJLy8gUENNUEdURHJyDQorICAgIDEzOTU5NjcwOVUsCS8vIFBDTVBHVFFybQ0KKyAgICAxMzg1NDgxMzNVLAkvLyBQQ01QR1RRcnINCisgICAgMTM5NTk1NzQ2VSwJLy8gUENNUEdUV3JtDQorICAgIDEzODU0NzE3MFUsCS8vIFBDTVBHVFdycg0KKyAgICAxMzk3Mjc3OTBVLAkvLyBQQ01QSVNUUklBcm0NCisgICAgMTM5ODU4ODYyVSwJLy8gUENNUElTVFJJQXJyDQorICAgIDEzOTcyNzc5MFUsCS8vIFBDTVBJU1RSSUNybQ0KKyAgICAxMzk4NTg4NjJVLAkvLyBQQ01QSVNUUklDcnINCisgICAgMTM5NzI3NzkwVSwJLy8gUENNUElTVFJJT3JtDQorICAgIDEzOTg1ODg2MlUsCS8vIFBDTVBJU1RSSU9ycg0KKyAgICAxMzk3Mjc3OTBVLAkvLyBQQ01QSVNUUklTcm0NCisgICAgMTM5ODU4ODYyVSwJLy8gUENNUElTVFJJU3JyDQorICAgIDEzOTcyNzc5MFUsCS8vIFBDTVBJU1RSSVpybQ0KKyAgICAxMzk4NTg4NjJVLAkvLyBQQ01QSVNUUklacnINCisgICAgMTM5NzI3NzkwVSwJLy8gUENNUElTVFJJcm0NCisgICAgMTM5ODU4ODYyVSwJLy8gUENNUElTVFJJcnINCisgICAgNTA0OVUsCS8vIFBDTVBJU1RSTTEyOE1FTQ0KKyAgICA1MDcyVSwJLy8gUENNUElTVFJNMTI4UkVHDQorICAgIDEzOTcyNzg0N1UsCS8vIFBDTVBJU1RSTTEyOHJtDQorICAgIDEzOTg1ODkxOVUsCS8vIFBDTVBJU1RSTTEyOHJyDQorICAgIDY3NTI4ODA1MFUsCS8vIFBFWFRSQm1yDQorICAgIDEzOTg1ODkzMFUsCS8vIFBFWFRSQnJyDQorICAgIDQwNjg1MjYwMlUsCS8vIFBFWFRSRG1yDQorICAgIDEzOTg1ODkzOFUsCS8vIFBFWFRSRHJyDQorICAgIDU0MTA3MDMzOFUsCS8vIFBFWFRSUW1yDQorICAgIDEzOTg1ODk0NlUsCS8vIFBFWFRSUXJyDQorICAgIDI3MjYzMzgzNVUsCS8vIFBFWFRSV21yDQorICAgIDEzOTg1Nzg5OVUsCS8vIFBFWFRSV3JpDQorICAgIDEzOTU5NjgxMFUsCS8vIFBIQURERHJtMTI4DQorICAgIDEzODk0MTQ1MFUsCS8vIFBIQURERHJtNjQNCisgICAgMTM4NTQ4MjM0VSwJLy8gUEhBREREcnIxMjgNCisgICAgMTM4NTQ4MjM0VSwJLy8gUEhBREREcnI2NA0KKyAgICAxMzk1OTY4MThVLAkvLyBQSEFERFNXcm0xMjgNCisgICAgMTM4OTQxNDU4VSwJLy8gUEhBRERTV3JtNjQNCisgICAgMTM4NTQ4MjQyVSwJLy8gUEhBRERTV3JyMTI4DQorICAgIDEzODU0ODI0MlUsCS8vIFBIQUREU1dycjY0DQorICAgIDEzOTU5NjgyN1UsCS8vIFBIQUREV3JtMTI4DQorICAgIDEzODk0MTQ2N1UsCS8vIFBIQUREV3JtNjQNCisgICAgMTM4NTQ4MjUxVSwJLy8gUEhBRERXcnIxMjgNCisgICAgMTM4NTQ4MjUxVSwJLy8gUEhBRERXcnI2NA0KKyAgICAxMzk3Mjc5MDdVLAkvLyBQSE1JTlBPU1VXcm0xMjgNCisgICAgMTM5ODU4OTc5VSwJLy8gUEhNSU5QT1NVV3JyMTI4DQorICAgIDEzOTU5Njg0N1UsCS8vIFBIU1VCRHJtMTI4DQorICAgIDEzODk0MTQ4N1UsCS8vIFBIU1VCRHJtNjQNCisgICAgMTM4NTQ4MjcxVSwJLy8gUEhTVUJEcnIxMjgNCisgICAgMTM4NTQ4MjcxVSwJLy8gUEhTVUJEcnI2NA0KKyAgICAxMzk1OTY4NTVVLAkvLyBQSFNVQlNXcm0xMjgNCisgICAgMTM4OTQxNDk1VSwJLy8gUEhTVUJTV3JtNjQNCisgICAgMTM4NTQ4Mjc5VSwJLy8gUEhTVUJTV3JyMTI4DQorICAgIDEzODU0ODI3OVUsCS8vIFBIU1VCU1dycjY0DQorICAgIDEzOTU5Njg2NFUsCS8vIFBIU1VCV3JtMTI4DQorICAgIDEzODk0MTUwNFUsCS8vIFBIU1VCV3JtNjQNCisgICAgMTM4NTQ4Mjg4VSwJLy8gUEhTVUJXcnIxMjgNCisgICAgMTM4NTQ4Mjg4VSwJLy8gUEhTVUJXcnI2NA0KKyAgICAxMzkwNzI1ODRVLAkvLyBQSU5TUkJybQ0KKyAgICAxMzg1NDgyOTZVLAkvLyBQSU5TUkJycg0KKyAgICAxMzg4MTA0NDhVLAkvLyBQSU5TUkRybQ0KKyAgICAxMzg1NDgzMDRVLAkvLyBQSU5TUkRycg0KKyAgICAxMzg5NDE1MjhVLAkvLyBQSU5TUlFybQ0KKyAgICAxMzg1NDgzMTJVLAkvLyBQSU5TUlFycg0KKyAgICAxMzg2NzgyNTlVLAkvLyBQSU5TUldybWkNCisgICAgMTM4NTQ3MTg3VSwJLy8gUElOU1JXcnJpDQorICAgIDEzOTU5Njg5NlUsCS8vIFBNQUREVUJTV3JtMTI4DQorICAgIDEzODk0MTUzNlUsCS8vIFBNQUREVUJTV3JtNjQNCisgICAgMTM4NTQ4MzIwVSwJLy8gUE1BRERVQlNXcnIxMjgNCisgICAgMTM4NTQ4MzIwVSwJLy8gUE1BRERVQlNXcnI2NA0KKyAgICAxMzk1OTU3NzFVLAkvLyBQTUFERFdEcm0NCisgICAgMTM4NTQ3MTk1VSwJLy8gUE1BRERXRHJyDQorICAgIDEzOTU5NjkwN1UsCS8vIFBNQVhTQnJtDQorICAgIDEzODU0ODMzMVUsCS8vIFBNQVhTQnJyDQorICAgIDEzOTU5NjkxNVUsCS8vIFBNQVhTRHJtDQorICAgIDEzODU0ODMzOVUsCS8vIFBNQVhTRHJyDQorICAgIDEzOTU5NTc4MFUsCS8vIFBNQVhTV3JtDQorICAgIDEzODU0NzIwNFUsCS8vIFBNQVhTV3JyDQorICAgIDEzOTU5NTc4OFUsCS8vIFBNQVhVQnJtDQorICAgIDEzODU0NzIxMlUsCS8vIFBNQVhVQnJyDQorICAgIDEzOTU5NjkyM1UsCS8vIFBNQVhVRHJtDQorICAgIDEzODU0ODM0N1UsCS8vIFBNQVhVRHJyDQorICAgIDEzOTU5NjkzMVUsCS8vIFBNQVhVV3JtDQorICAgIDEzODU0ODM1NVUsCS8vIFBNQVhVV3JyDQorICAgIDEzOTU5NjkzOVUsCS8vIFBNSU5TQnJtDQorICAgIDEzODU0ODM2M1UsCS8vIFBNSU5TQnJyDQorICAgIDEzOTU5Njk0N1UsCS8vIFBNSU5TRHJtDQorICAgIDEzODU0ODM3MVUsCS8vIFBNSU5TRHJyDQorICAgIDEzOTU5NTc5NlUsCS8vIFBNSU5TV3JtDQorICAgIDEzODU0NzIyMFUsCS8vIFBNSU5TV3JyDQorICAgIDEzOTU5NTgwNFUsCS8vIFBNSU5VQnJtDQorICAgIDEzODU0NzIyOFUsCS8vIFBNSU5VQnJyDQorICAgIDEzOTU5Njk1NVUsCS8vIFBNSU5VRHJtDQorICAgIDEzODU0ODM3OVUsCS8vIFBNSU5VRHJyDQorICAgIDEzOTU5Njk2M1UsCS8vIFBNSU5VV3JtDQorICAgIDEzODU0ODM4N1UsCS8vIFBNSU5VV3JyDQorICAgIDEzOTg1Nzk1NlUsCS8vIFBNT1ZNU0tCcnINCisgICAgMTQwMTIxMjU5VSwJLy8gUE1PVlNYQkRybQ0KKyAgICAxMzk4NTkxMTVVLAkvLyBQTU9WU1hCRHJyDQorICAgIDEzOTk5MDE5N1UsCS8vIFBNT1ZTWEJRcm0NCisgICAgMTM5ODU5MTI1VSwJLy8gUE1PVlNYQlFycg0KKyAgICAxNDAyNTIzNTFVLAkvLyBQTU9WU1hCV3JtDQorICAgIDEzOTg1OTEzNVUsCS8vIFBNT1ZTWEJXcnINCisgICAgMTQwMjUyMzYxVSwJLy8gUE1PVlNYRFFybQ0KKyAgICAxMzk4NTkxNDVVLAkvLyBQTU9WU1hEUXJyDQorICAgIDE0MDI1MjM3MVUsCS8vIFBNT1ZTWFdEcm0NCisgICAgMTM5ODU5MTU1VSwJLy8gUE1PVlNYV0Rycg0KKyAgICAxNDAxMjEzMDlVLAkvLyBQTU9WU1hXUXJtDQorICAgIDEzOTg1OTE2NVUsCS8vIFBNT1ZTWFdRcnINCisgICAgMTQwMTIxMzE5VSwJLy8gUE1PVlpYQkRybQ0KKyAgICAxMzk4NTkxNzVVLAkvLyBQTU9WWlhCRHJyDQorICAgIDEzOTk5MDI1N1UsCS8vIFBNT1ZaWEJRcm0NCisgICAgMTM5ODU5MTg1VSwJLy8gUE1PVlpYQlFycg0KKyAgICAxNDAyNTI0MTFVLAkvLyBQTU9WWlhCV3JtDQorICAgIDEzOTg1OTE5NVUsCS8vIFBNT1ZaWEJXcnINCisgICAgMTQwMjUyNDIxVSwJLy8gUE1PVlpYRFFybQ0KKyAgICAxMzk4NTkyMDVVLAkvLyBQTU9WWlhEUXJyDQorICAgIDE0MDI1MjQzMVUsCS8vIFBNT1ZaWFdEcm0NCisgICAgMTM5ODU5MjE1VSwJLy8gUE1PVlpYV0Rycg0KKyAgICAxNDAxMjEzNjlVLAkvLyBQTU9WWlhXUXJtDQorICAgIDEzOTg1OTIyNVUsCS8vIFBNT1ZaWFdRcnINCisgICAgMTM5NTk3MDkxVSwJLy8gUE1VTERRcm0NCisgICAgMTM4NTQ4NTE1VSwJLy8gUE1VTERRcnINCisgICAgMTM5NTk3MDk5VSwJLy8gUE1VTEhSU1dybTEyOA0KKyAgICAxMzg5NDE3MzlVLAkvLyBQTVVMSFJTV3JtNjQNCisgICAgMTM4NTQ4NTIzVSwJLy8gUE1VTEhSU1dycjEyOA0KKyAgICAxMzg1NDg1MjNVLAkvLyBQTVVMSFJTV3JyNjQNCisgICAgMTM5NTk1ODIyVSwJLy8gUE1VTEhVV3JtDQorICAgIDEzODU0NzI0NlUsCS8vIFBNVUxIVVdycg0KKyAgICAxMzk1OTU4MzFVLAkvLyBQTVVMSFdybQ0KKyAgICAxMzg1NDcyNTVVLAkvLyBQTVVMSFdycg0KKyAgICAxMzk1OTcxMDlVLAkvLyBQTVVMTERybQ0KKyAgICAxMzg1NDg1MzNVLAkvLyBQTVVMTERycg0KKyAgICAxMzk1OTU4MzlVLAkvLyBQTVVMTFdybQ0KKyAgICAxMzg1NDcyNjNVLAkvLyBQTVVMTFdycg0KKyAgICAxMzk1OTU4NDdVLAkvLyBQTVVMVURRcm0NCisgICAgMTM4NTQ3MjcxVSwJLy8gUE1VTFVEUXJyDQorICAgIDEzNDIyMzE2NVUsCS8vIFBPUDE2cg0KKyAgICAyNjg0NDA4OTNVLAkvLyBQT1AxNnJtbQ0KKyAgICAxMzQyMjMxNjVVLAkvLyBQT1AxNnJtcg0KKyAgICAxMzQyMjMxNjVVLAkvLyBQT1AzMnINCisgICAgNDAyNjU4NjIxVSwJLy8gUE9QMzJybW0NCisgICAgMTM0MjIzMTY1VSwJLy8gUE9QMzJybXINCisgICAgMTM0MjIzMTY1VSwJLy8gUE9QNjRyDQorICAgIDUzNjg3NjM0OVUsCS8vIFBPUDY0cm1tDQorICAgIDEzNDIyMzE2NVUsCS8vIFBPUDY0cm1yDQorICAgIDU0NDJVLAkvLyBQT1BBMzINCisgICAgMTM5OTkwMzQzVSwJLy8gUE9QQ05UMTZybQ0KKyAgICAxMzk4NTkyNzFVLAkvLyBQT1BDTlQxNnJyDQorICAgIDE0MDEyMTQxNVUsCS8vIFBPUENOVDMycm0NCisgICAgMTM5ODU5MjcxVSwJLy8gUE9QQ05UMzJycg0KKyAgICAxNDAyNTI0ODdVLAkvLyBQT1BDTlQ2NHJtDQorICAgIDEzOTg1OTI3MVUsCS8vIFBPUENOVDY0cnINCisgICAgNTQ1NVUsCS8vIFBPUEYxNg0KKyAgICA1NDYwVSwJLy8gUE9QRjMyDQorICAgIDU0NjZVLAkvLyBQT1BGNjQNCisgICAgNTQ3MlUsCS8vIFBPUEZTMTYNCisgICAgNTQ3MlUsCS8vIFBPUEZTMzINCisgICAgNTQ3MlUsCS8vIFBPUEZTNjQNCisgICAgNTQ4MFUsCS8vIFBPUEdTMTYNCisgICAgNTQ4MFUsCS8vIFBPUEdTMzINCisgICAgNTQ4MFUsCS8vIFBPUEdTNjQNCisgICAgMTM5NTk1ODU2VSwJLy8gUE9Scm0NCisgICAgMTM4NTQ3MjgwVSwJLy8gUE9ScnINCisgICAgNjcxMDk0MTI4VSwJLy8gUFJFRkVUQ0hOVEENCisgICAgNjcxMDk0MTQxVSwJLy8gUFJFRkVUQ0hUMA0KKyAgICA2NzEwOTQxNTNVLAkvLyBQUkVGRVRDSFQxDQorICAgIDY3MTA5NDE2NVUsCS8vIFBSRUZFVENIVDINCisgICAgMTM5NTk1ODYxVSwJLy8gUFNBREJXcm0NCisgICAgMTM4NTQ3Mjg1VSwJLy8gUFNBREJXcnINCisgICAgMTM5NTk3MjE3VSwJLy8gUFNIVUZCcm0xMjgNCisgICAgMTM4OTQxODU3VSwJLy8gUFNIVUZCcm02NA0KKyAgICAxMzg1NDg2NDFVLAkvLyBQU0hVRkJycjEyOA0KKyAgICAxMzg1NDg2NDFVLAkvLyBQU0hVRkJycjY0DQorICAgIDEzOTcyODI5N1UsCS8vIFBTSFVGRG1pDQorICAgIDEzOTg1OTM2OVUsCS8vIFBTSFVGRHJpDQorICAgIDEzOTcyODMwNVUsCS8vIFBTSFVGSFdtaQ0KKyAgICAxMzk4NTkzNzdVLAkvLyBQU0hVRkhXcmkNCisgICAgMTM5NzI4MzE0VSwJLy8gUFNIVUZMV21pDQorICAgIDEzOTg1OTM4NlUsCS8vIFBTSFVGTFdyaQ0KKyAgICAxMzk1OTcyNTFVLAkvLyBQU0lHTkJybTEyOA0KKyAgICAxMzg5NDE4OTFVLAkvLyBQU0lHTkJybTY0DQorICAgIDEzODU0ODY3NVUsCS8vIFBTSUdOQnJyMTI4DQorICAgIDEzODU0ODY3NVUsCS8vIFBTSUdOQnJyNjQNCisgICAgMTM5NTk3MjU5VSwJLy8gUFNJR05Ecm0xMjgNCisgICAgMTM4OTQxODk5VSwJLy8gUFNJR05Ecm02NA0KKyAgICAxMzg1NDg2ODNVLAkvLyBQU0lHTkRycjEyOA0KKyAgICAxMzg1NDg2ODNVLAkvLyBQU0lHTkRycjY0DQorICAgIDEzOTU5NzI2N1UsCS8vIFBTSUdOV3JtMTI4DQorICAgIDEzODk0MTkwN1UsCS8vIFBTSUdOV3JtNjQNCisgICAgMTM4NTQ4NjkxVSwJLy8gUFNJR05XcnIxMjgNCisgICAgMTM4NTQ4NjkxVSwJLy8gUFNJR05XcnI2NA0KKyAgICAxMzg1NDg2OTlVLAkvLyBQU0xMRFFyaQ0KKyAgICAxMzg1NDczMDFVLAkvLyBQU0xMRHJpDQorICAgIDEzOTU5NTg3N1UsCS8vIFBTTExEcm0NCisgICAgMTM4NTQ3MzAxVSwJLy8gUFNMTERycg0KKyAgICAxMzg1NDczMDhVLAkvLyBQU0xMUXJpDQorICAgIDEzOTU5NTg4NFUsCS8vIFBTTExRcm0NCisgICAgMTM4NTQ3MzA4VSwJLy8gUFNMTFFycg0KKyAgICAxMzg1NDczMTVVLAkvLyBQU0xMV3JpDQorICAgIDEzOTU5NTg5MVUsCS8vIFBTTExXcm0NCisgICAgMTM4NTQ3MzE1VSwJLy8gUFNMTFdycg0KKyAgICAxMzg1NDczMjJVLAkvLyBQU1JBRHJpDQorICAgIDEzOTU5NTg5OFUsCS8vIFBTUkFEcm0NCisgICAgMTM4NTQ3MzIyVSwJLy8gUFNSQURycg0KKyAgICAxMzg1NDczMjlVLAkvLyBQU1JBV3JpDQorICAgIDEzOTU5NTkwNVUsCS8vIFBTUkFXcm0NCisgICAgMTM4NTQ3MzI5VSwJLy8gUFNSQVdycg0KKyAgICAxMzg1NDg3MDdVLAkvLyBQU1JMRFFyaQ0KKyAgICAxMzg1NDczMzZVLAkvLyBQU1JMRHJpDQorICAgIDEzOTU5NTkxMlUsCS8vIFBTUkxEcm0NCisgICAgMTM4NTQ3MzM2VSwJLy8gUFNSTERycg0KKyAgICAxMzg1NDczNDNVLAkvLyBQU1JMUXJpDQorICAgIDEzOTU5NTkxOVUsCS8vIFBTUkxRcm0NCisgICAgMTM4NTQ3MzQzVSwJLy8gUFNSTFFycg0KKyAgICAxMzg1NDczNTBVLAkvLyBQU1JMV3JpDQorICAgIDEzOTU5NTkyNlUsCS8vIFBTUkxXcm0NCisgICAgMTM4NTQ3MzUwVSwJLy8gUFNSTFdycg0KKyAgICAxMzk1OTU5MzNVLAkvLyBQU1VCQnJtDQorICAgIDEzODU0NzM1N1UsCS8vIFBTVUJCcnINCisgICAgMTM5NTk1OTQwVSwJLy8gUFNVQkRybQ0KKyAgICAxMzg1NDczNjRVLAkvLyBQU1VCRHJyDQorICAgIDEzOTU5NTk0N1UsCS8vIFBTVUJRcm0NCisgICAgMTM4NTQ3MzcxVSwJLy8gUFNVQlFycg0KKyAgICAxMzk1OTU5NTRVLAkvLyBQU1VCU0JybQ0KKyAgICAxMzg1NDczNzhVLAkvLyBQU1VCU0Jycg0KKyAgICAxMzk1OTU5NjJVLAkvLyBQU1VCU1dybQ0KKyAgICAxMzg1NDczODZVLAkvLyBQU1VCU1dycg0KKyAgICAxMzk1OTU5NzBVLAkvLyBQU1VCVVNCcm0NCisgICAgMTM4NTQ3Mzk0VSwJLy8gUFNVQlVTQnJyDQorICAgIDEzOTU5NTk3OVUsCS8vIFBTVUJVU1dybQ0KKyAgICAxMzg1NDc0MDNVLAkvLyBQU1VCVVNXcnINCisgICAgMTM5NTk1OTg4VSwJLy8gUFNVQldybQ0KKyAgICAxMzg1NDc0MTJVLAkvLyBQU1VCV3JyDQorICAgIDE0MDUxNDc5NVUsCS8vIFBURVNUcm0NCisgICAgMTM5ODU5NDM1VSwJLy8gUFRFU1Rycg0KKyAgICAxMzk1OTU5OTVVLAkvLyBQVU5QQ0tIQldybQ0KKyAgICAxMzg1NDc0MTlVLAkvLyBQVU5QQ0tIQldycg0KKyAgICAxMzk1OTYwMDZVLAkvLyBQVU5QQ0tIRFFybQ0KKyAgICAxMzg1NDc0MzBVLAkvLyBQVU5QQ0tIRFFycg0KKyAgICAxMzk1OTcyOTlVLAkvLyBQVU5QQ0tIUURRcm0NCisgICAgMTM4NTQ4NzIzVSwJLy8gUFVOUENLSFFEUXJyDQorICAgIDEzOTU5NjAxN1UsCS8vIFBVTlBDS0hXRHJtDQorICAgIDEzODU0NzQ0MVUsCS8vIFBVTlBDS0hXRHJyDQorICAgIDEzOTU5NjAyOFUsCS8vIFBVTlBDS0xCV3JtDQorICAgIDEzODU0NzQ1MlUsCS8vIFBVTlBDS0xCV3JyDQorICAgIDEzOTU5NjAzOVUsCS8vIFBVTlBDS0xEUXJtDQorICAgIDEzODU0NzQ2M1UsCS8vIFBVTlBDS0xEUXJyDQorICAgIDEzOTU5NzMxMVUsCS8vIFBVTlBDS0xRRFFybQ0KKyAgICAxMzg1NDg3MzVVLAkvLyBQVU5QQ0tMUURRcnINCisgICAgMTM5NTk2MDUwVSwJLy8gUFVOUENLTFdEcm0NCisgICAgMTM4NTQ3NDc0VSwJLy8gUFVOUENLTFdEcnINCisgICAgMTM0MjIzMzcxVSwJLy8gUFVTSDE2cg0KKyAgICAyNjg0NDEwOTlVLAkvLyBQVVNIMTZybW0NCisgICAgMTM0MjIzMzcxVSwJLy8gUFVTSDE2cm1yDQorICAgIDEzNDIyMzM3MVUsCS8vIFBVU0gzMnINCisgICAgNDAyNjU4ODI3VSwJLy8gUFVTSDMycm1tDQorICAgIDEzNDIyMzM3MVUsCS8vIFBVU0gzMnJtcg0KKyAgICAxMzQyMjMzNzFVLAkvLyBQVVNINjRpMTYNCisgICAgMTM0MjIzMzcxVSwJLy8gUFVTSDY0aTMyDQorICAgIDEzNDIyMzM3MVUsCS8vIFBVU0g2NGk4DQorICAgIDEzNDIyMzM3MVUsCS8vIFBVU0g2NHINCisgICAgNTM2ODc2NTU1VSwJLy8gUFVTSDY0cm1tDQorICAgIDEzNDIyMzM3MVUsCS8vIFBVU0g2NHJtcg0KKyAgICA1NjQ5VSwJLy8gUFVTSEEzMg0KKyAgICA1NjU1VSwJLy8gUFVTSEYxNg0KKyAgICA1NjYxVSwJLy8gUFVTSEYzMg0KKyAgICA1NjY4VSwJLy8gUFVTSEY2NA0KKyAgICA1Njc1VSwJLy8gUFVTSEZTMTYNCisgICAgNTY3NVUsCS8vIFBVU0hGUzMyDQorICAgIDU2NzVVLAkvLyBQVVNIRlM2NA0KKyAgICA1Njg0VSwJLy8gUFVTSEdTMTYNCisgICAgNTY4NFUsCS8vIFBVU0hHUzMyDQorICAgIDU2ODRVLAkvLyBQVVNIR1M2NA0KKyAgICAxMzQyMjMzNzFVLAkvLyBQVVNIaTE2DQorICAgIDEzNDIyMzM3MVUsCS8vIFBVU0hpMzINCisgICAgMTM0MjIzMzcxVSwJLy8gUFVTSGk4DQorICAgIDEzOTU5NjA2MVUsCS8vIFBYT1JybQ0KKyAgICAxMzg1NDc0ODVVLAkvLyBQWE9ScnINCisgICAgMzQ4MTMyOTI1VSwJLy8gUkNMMTZtMQ0KKyAgICAzNTIzMjcyMjlVLAkvLyBSQ0wxNm1DTA0KKyAgICAyNzI2MzU0NTNVLAkvLyBSQ0wxNm1pDQorICAgIDIxMzkxNTE5N1UsCS8vIFJDTDE2cjENCisgICAgMjE4MTA5NTAxVSwJLy8gUkNMMTZyQ0wNCisgICAgMTM4NTQ4Nzk3VSwJLy8gUkNMMTZyaQ0KKyAgICA0ODIzNTA2NTNVLAkvLyBSQ0wzMm0xDQorICAgIDQ4NjU0NDk1N1UsCS8vIFJDTDMybUNMDQorICAgIDQwNjg1MzE4MVUsCS8vIFJDTDMybWkNCisgICAgMjEzOTE1MTk3VSwJLy8gUkNMMzJyMQ0KKyAgICAyMTgxMDk1MDFVLAkvLyBSQ0wzMnJDTA0KKyAgICAxMzg1NDg3OTdVLAkvLyBSQ0wzMnJpDQorICAgIDYxNjU2ODM4MVUsCS8vIFJDTDY0bTENCisgICAgNjIwNzYyNjg1VSwJLy8gUkNMNjRtQ0wNCisgICAgNTQxMDcwOTA5VSwJLy8gUkNMNjRtaQ0KKyAgICAyMTM5MTUxOTdVLAkvLyBSQ0w2NHIxDQorICAgIDIxODEwOTUwMVUsCS8vIFJDTDY0ckNMDQorICAgIDEzODU0ODc5N1UsCS8vIFJDTDY0cmkNCisgICAgNzUwNzg2MTA5VSwJLy8gUkNMOG0xDQorICAgIDc1NDk4MDQxM1UsCS8vIFJDTDhtQ0wNCisgICAgNjc1Mjg4NjM3VSwJLy8gUkNMOG1pDQorICAgIDIxMzkxNTE5N1UsCS8vIFJDTDhyMQ0KKyAgICAyMTgxMDk1MDFVLAkvLyBSQ0w4ckNMDQorICAgIDEzODU0ODc5N1UsCS8vIFJDTDhyaQ0KKyAgICAxNDA1MTQ4ODJVLAkvLyBSQ1BQU20NCisgICAgMTQwNTE0ODgyVSwJLy8gUkNQUFNtX0ludA0KKyAgICAxMzk4NTk1MjJVLAkvLyBSQ1BQU3INCisgICAgMTM5ODU5NTIyVSwJLy8gUkNQUFNyX0ludA0KKyAgICAxNDA3NzcwMzNVLAkvLyBSQ1BTU20NCisgICAgMTQwNzc3MDMzVSwJLy8gUkNQU1NtX0ludA0KKyAgICAxMzk4NTk1MjlVLAkvLyBSQ1BTU3INCisgICAgMTM5ODU5NTI5VSwJLy8gUkNQU1NyX0ludA0KKyAgICAzNDgxMzI5NDRVLAkvLyBSQ1IxNm0xDQorICAgIDM1MjMyNzI0OFUsCS8vIFJDUjE2bUNMDQorICAgIDI3MjYzNTQ3MlUsCS8vIFJDUjE2bWkNCisgICAgMjEzOTE1MjE2VSwJLy8gUkNSMTZyMQ0KKyAgICAyMTgxMDk1MjBVLAkvLyBSQ1IxNnJDTA0KKyAgICAxMzg1NDg4MTZVLAkvLyBSQ1IxNnJpDQorICAgIDQ4MjM1MDY3MlUsCS8vIFJDUjMybTENCisgICAgNDg2NTQ0OTc2VSwJLy8gUkNSMzJtQ0wNCisgICAgNDA2ODUzMjAwVSwJLy8gUkNSMzJtaQ0KKyAgICAyMTM5MTUyMTZVLAkvLyBSQ1IzMnIxDQorICAgIDIxODEwOTUyMFUsCS8vIFJDUjMyckNMDQorICAgIDEzODU0ODgxNlUsCS8vIFJDUjMycmkNCisgICAgNjE2NTY4NDAwVSwJLy8gUkNSNjRtMQ0KKyAgICA2MjA3NjI3MDRVLAkvLyBSQ1I2NG1DTA0KKyAgICA1NDEwNzA5MjhVLAkvLyBSQ1I2NG1pDQorICAgIDIxMzkxNTIxNlUsCS8vIFJDUjY0cjENCisgICAgMjE4MTA5NTIwVSwJLy8gUkNSNjRyQ0wNCisgICAgMTM4NTQ4ODE2VSwJLy8gUkNSNjRyaQ0KKyAgICA3NTA3ODYxMjhVLAkvLyBSQ1I4bTENCisgICAgNzU0OTgwNDMyVSwJLy8gUkNSOG1DTA0KKyAgICA2NzUyODg2NTZVLAkvLyBSQ1I4bWkNCisgICAgMjEzOTE1MjE2VSwJLy8gUkNSOHIxDQorICAgIDIxODEwOTUyMFUsCS8vIFJDUjhyQ0wNCisgICAgMTM4NTQ4ODE2VSwJLy8gUkNSOHJpDQorICAgIDU3MTdVLAkvLyBSRE1TUg0KKyAgICA1NzIzVSwJLy8gUkRQTUMNCisgICAgNTcyOVUsCS8vIFJEVFNDDQorICAgIDU3MzVVLAkvLyBSRFRTQ1ANCisgICAgNTc0MlUsCS8vIFJFUE5FX1BSRUZJWA0KKyAgICA1NzQ4VSwJLy8gUkVQX01PVlNCDQorICAgIDU3NThVLAkvLyBSRVBfTU9WU0QNCisgICAgNTc2OFUsCS8vIFJFUF9NT1ZTUQ0KKyAgICA1Nzc4VSwJLy8gUkVQX01PVlNXDQorICAgIDU3ODhVLAkvLyBSRVBfUFJFRklYDQorICAgIDU3OTJVLAkvLyBSRVBfU1RPU0INCisgICAgNTgwMlUsCS8vIFJFUF9TVE9TRA0KKyAgICA1ODEyVSwJLy8gUkVQX1NUT1NRDQorICAgIDU4MjJVLAkvLyBSRVBfU1RPU1cNCisgICAgNTgzMlUsCS8vIFJFVA0KKyAgICAxMzQyMjM1NjRVLAkvLyBSRVRJDQorICAgIDI2ODQ0MTI5N1UsCS8vIFJPTDE2bTENCisgICAgMzUyMzI3Mzc3VSwJLy8gUk9MMTZtQ0wNCisgICAgMjcyNjM1NjAxVSwJLy8gUk9MMTZtaQ0KKyAgICAxMzQyMjM1NjlVLAkvLyBST0wxNnIxDQorICAgIDIxODEwOTY0OVUsCS8vIFJPTDE2ckNMDQorICAgIDEzODU0ODk0NVUsCS8vIFJPTDE2cmkNCisgICAgNDAyNjU5MDI1VSwJLy8gUk9MMzJtMQ0KKyAgICA0ODY1NDUxMDVVLAkvLyBST0wzMm1DTA0KKyAgICA0MDY4NTMzMjlVLAkvLyBST0wzMm1pDQorICAgIDEzNDIyMzU2OVUsCS8vIFJPTDMycjENCisgICAgMjE4MTA5NjQ5VSwJLy8gUk9MMzJyQ0wNCisgICAgMTM4NTQ4OTQ1VSwJLy8gUk9MMzJyaQ0KKyAgICA1MzY4NzY3NTNVLAkvLyBST0w2NG0xDQorICAgIDYyNDk1NzEzN1UsCS8vIFJPTDY0bUNMDQorICAgIDU0MTA3MTA1N1UsCS8vIFJPTDY0bWkNCisgICAgMTM0MjIzNTY5VSwJLy8gUk9MNjRyMQ0KKyAgICAyMjIzMDM5NTNVLAkvLyBST0w2NHJDTA0KKyAgICAxMzg1NDg5NDVVLAkvLyBST0w2NHJpDQorICAgIDY3MTA5NDQ4MVUsCS8vIFJPTDhtMQ0KKyAgICA3NTQ5ODA1NjFVLAkvLyBST0w4bUNMDQorICAgIDY3NTI4ODc4NVUsCS8vIFJPTDhtaQ0KKyAgICAxMzQyMjM1NjlVLAkvLyBST0w4cjENCisgICAgMjE4MTA5NjQ5VSwJLy8gUk9MOHJDTA0KKyAgICAxMzg1NDg5NDVVLAkvLyBST0w4cmkNCisgICAgMjY4NDQxMzAyVSwJLy8gUk9SMTZtMQ0KKyAgICAzNTIzMjczODJVLAkvLyBST1IxNm1DTA0KKyAgICAyNzI2MzU2MDZVLAkvLyBST1IxNm1pDQorICAgIDEzNDIyMzU3NFUsCS8vIFJPUjE2cjENCisgICAgMjE4MTA5NjU0VSwJLy8gUk9SMTZyQ0wNCisgICAgMTM4NTQ4OTUwVSwJLy8gUk9SMTZyaQ0KKyAgICA0MDI2NTkwMzBVLAkvLyBST1IzMm0xDQorICAgIDQ4NjU0NTExMFUsCS8vIFJPUjMybUNMDQorICAgIDQwNjg1MzMzNFUsCS8vIFJPUjMybWkNCisgICAgMTM0MjIzNTc0VSwJLy8gUk9SMzJyMQ0KKyAgICAyMTgxMDk2NTRVLAkvLyBST1IzMnJDTA0KKyAgICAxMzg1NDg5NTBVLAkvLyBST1IzMnJpDQorICAgIDUzNjg3Njc1OFUsCS8vIFJPUjY0bTENCisgICAgNjI0OTU3MTQyVSwJLy8gUk9SNjRtQ0wNCisgICAgNTQxMDcxMDYyVSwJLy8gUk9SNjRtaQ0KKyAgICAxMzQyMjM1NzRVLAkvLyBST1I2NHIxDQorICAgIDIyMjMwMzk1OFUsCS8vIFJPUjY0ckNMDQorICAgIDEzODU0ODk1MFUsCS8vIFJPUjY0cmkNCisgICAgNjcxMDk0NDg2VSwJLy8gUk9SOG0xDQorICAgIDc1NDk4MDU2NlUsCS8vIFJPUjhtQ0wNCisgICAgNjc1Mjg4NzkwVSwJLy8gUk9SOG1pDQorICAgIDEzNDIyMzU3NFUsCS8vIFJPUjhyMQ0KKyAgICAyMTgxMDk2NTRVLAkvLyBST1I4ckNMDQorICAgIDEzODU0ODk1MFUsCS8vIFJPUjhyaQ0KKyAgICAxNDEwMzkzMjNVLAkvLyBST1VORFBEbV9JbnQNCisgICAgMTM5ODU5Njc1VSwJLy8gUk9VTkRQRHJfSW50DQorICAgIDE0MTAzOTMzMlUsCS8vIFJPVU5EUFNtX0ludA0KKyAgICAxMzk4NTk2ODRVLAkvLyBST1VORFBTcl9JbnQNCisgICAgMTM5MzM1NDA1VSwJLy8gUk9VTkRTRG1fSW50DQorICAgIDEzODU0ODk3M1UsCS8vIFJPVU5EU0RyX0ludA0KKyAgICAxMzk0NjY0ODZVLAkvLyBST1VORFNTbV9JbnQNCisgICAgMTM4NTQ4OTgyVSwJLy8gUk9VTkRTU3JfSW50DQorICAgIDU4ODdVLAkvLyBSU00NCisgICAgMTQwNTE1MDc1VSwJLy8gUlNRUlRQU20NCisgICAgMTQwNTE1MDc1VSwJLy8gUlNRUlRQU21fSW50DQorICAgIDEzOTg1OTcxNVUsCS8vIFJTUVJUUFNyDQorICAgIDEzOTg1OTcxNVUsCS8vIFJTUVJUUFNyX0ludA0KKyAgICAxNDA3NzcyMjhVLAkvLyBSU1FSVFNTbQ0KKyAgICAxNDA3NzcyMjhVLAkvLyBSU1FSVFNTbV9JbnQNCisgICAgMTM5ODU5NzI0VSwJLy8gUlNRUlRTU3INCisgICAgMTM5ODU5NzI0VSwJLy8gUlNRUlRTU3JfSW50DQorICAgIDU5MDlVLAkvLyBTQUhGDQorICAgIDI2ODQ0MTM3MFUsCS8vIFNBUjE2bTENCisgICAgMzUyMzI3NDUwVSwJLy8gU0FSMTZtQ0wNCisgICAgMjcyNjM1Njc0VSwJLy8gU0FSMTZtaQ0KKyAgICAxMzQyMjM2NDJVLAkvLyBTQVIxNnIxDQorICAgIDIxODEwOTcyMlUsCS8vIFNBUjE2ckNMDQorICAgIDEzODU0OTAxOFUsCS8vIFNBUjE2cmkNCisgICAgNDAyNjU5MDk4VSwJLy8gU0FSMzJtMQ0KKyAgICA0ODY1NDUxNzhVLAkvLyBTQVIzMm1DTA0KKyAgICA0MDY4NTM0MDJVLAkvLyBTQVIzMm1pDQorICAgIDEzNDIyMzY0MlUsCS8vIFNBUjMycjENCisgICAgMjE4MTA5NzIyVSwJLy8gU0FSMzJyQ0wNCisgICAgMTM4NTQ5MDE4VSwJLy8gU0FSMzJyaQ0KKyAgICA1MzY4NzY4MjZVLAkvLyBTQVI2NG0xDQorICAgIDYyNDk1NzIxMFUsCS8vIFNBUjY0bUNMDQorICAgIDU0MTA3MTEzMFUsCS8vIFNBUjY0bWkNCisgICAgMTM0MjIzNjQyVSwJLy8gU0FSNjRyMQ0KKyAgICAyMjIzMDQwMjZVLAkvLyBTQVI2NHJDTA0KKyAgICAxMzg1NDkwMThVLAkvLyBTQVI2NHJpDQorICAgIDY3MTA5NDU1NFUsCS8vIFNBUjhtMQ0KKyAgICA3NTQ5ODA2MzRVLAkvLyBTQVI4bUNMDQorICAgIDY3NTI4ODg1OFUsCS8vIFNBUjhtaQ0KKyAgICAxMzQyMjM2NDJVLAkvLyBTQVI4cjENCisgICAgMjE4MTA5NzIyVSwJLy8gU0FSOHJDTA0KKyAgICAxMzg1NDkwMThVLAkvLyBTQVI4cmkNCisgICAgMTM0MjIzNjQ3VSwJLy8gU0JCMTZpMTYNCisgICAgMjcyNjM1Njg5VSwJLy8gU0JCMTZtaQ0KKyAgICAyNzI2MzU2ODlVLAkvLyBTQkIxNm1pOA0KKyAgICAyNzI2MzU2ODlVLAkvLyBTQkIxNm1yDQorICAgIDEzODU0OTAzM1UsCS8vIFNCQjE2cmkNCisgICAgMTM4NTQ5MDMzVSwJLy8gU0JCMTZyaTgNCisgICAgMTM4NjgwMTA1VSwJLy8gU0JCMTZybQ0KKyAgICAxMzg1NDkwMzNVLAkvLyBTQkIxNnJyDQorICAgIDEzODU0OTAzM1UsCS8vIFNCQjE2cnJfUkVWDQorICAgIDEzNDIyMzY2MlUsCS8vIFNCQjMyaTMyDQorICAgIDQwNjg1MzQxN1UsCS8vIFNCQjMybWkNCisgICAgNDA2ODUzNDE3VSwJLy8gU0JCMzJtaTgNCisgICAgNDA2ODUzNDE3VSwJLy8gU0JCMzJtcg0KKyAgICAxMzg1NDkwMzNVLAkvLyBTQkIzMnJpDQorICAgIDEzODU0OTAzM1UsCS8vIFNCQjMycmk4DQorICAgIDEzODgxMTE3N1UsCS8vIFNCQjMycm0NCisgICAgMTM4NTQ5MDMzVSwJLy8gU0JCMzJycg0KKyAgICAxMzg1NDkwMzNVLAkvLyBTQkIzMnJyX1JFVg0KKyAgICAxMzQyMjM2NzNVLAkvLyBTQkI2NGkzMg0KKyAgICA1NDEwNzExNDVVLAkvLyBTQkI2NG1pMzINCisgICAgNTQxMDcxMTQ1VSwJLy8gU0JCNjRtaTgNCisgICAgNTQxMDcxMTQ1VSwJLy8gU0JCNjRtcg0KKyAgICAxMzg1NDkwMzNVLAkvLyBTQkI2NHJpMzINCisgICAgMTM4NTQ5MDMzVSwJLy8gU0JCNjRyaTgNCisgICAgMTM4OTQyMjQ5VSwJLy8gU0JCNjRybQ0KKyAgICAxMzg1NDkwMzNVLAkvLyBTQkI2NHJyDQorICAgIDEzODU0OTAzM1UsCS8vIFNCQjY0cnJfUkVWDQorICAgIDEzNDIyMzY4NFUsCS8vIFNCQjhpOA0KKyAgICA2NzUyODg4NzNVLAkvLyBTQkI4bWkNCisgICAgNjc1Mjg4ODczVSwJLy8gU0JCOG1yDQorICAgIDEzODU0OTAzM1UsCS8vIFNCQjhyaQ0KKyAgICAxMzkwNzMzMjFVLAkvLyBTQkI4cm0NCisgICAgMTM4NTQ5MDMzVSwJLy8gU0JCOHJyDQorICAgIDEzODU0OTAzM1UsCS8vIFNCQjhycl9SRVYNCisgICAgNTk2NlUsCS8vIFNDQVMxNg0KKyAgICA1OTY2VSwJLy8gU0NBUzMyDQorICAgIDU5NzFVLAkvLyBTQ0FTNjQNCisgICAgNTk2NlUsCS8vIFNDQVM4DQorICAgIDY3MTA5NDYxN1UsCS8vIFNFVEFFbQ0KKyAgICAxMzQyMjM3MDVVLAkvLyBTRVRBRXINCisgICAgNjcxMDk0NjI0VSwJLy8gU0VUQW0NCisgICAgMTM0MjIzNzEyVSwJLy8gU0VUQXINCisgICAgNjcxMDk0NjMwVSwJLy8gU0VUQkVtDQorICAgIDEzNDIyMzcxOFUsCS8vIFNFVEJFcg0KKyAgICAwVSwJLy8gU0VUQl9DMTZyDQorICAgIDBVLAkvLyBTRVRCX0MzMnINCisgICAgMFUsCS8vIFNFVEJfQzY0cg0KKyAgICAwVSwJLy8gU0VUQl9DOHINCisgICAgNjcxMDk0NjM3VSwJLy8gU0VUQm0NCisgICAgMTM0MjIzNzI1VSwJLy8gU0VUQnINCisgICAgNjcxMDk0NjQzVSwJLy8gU0VURW0NCisgICAgMTM0MjIzNzMxVSwJLy8gU0VURXINCisgICAgNjcxMDk0NjQ5VSwJLy8gU0VUR0VtDQorICAgIDEzNDIyMzczN1UsCS8vIFNFVEdFcg0KKyAgICA2NzEwOTQ2NTZVLAkvLyBTRVRHbQ0KKyAgICAxMzQyMjM3NDRVLAkvLyBTRVRHcg0KKyAgICA2NzEwOTQ2NjJVLAkvLyBTRVRMRW0NCisgICAgMTM0MjIzNzUwVSwJLy8gU0VUTEVyDQorICAgIDY3MTA5NDY2OVUsCS8vIFNFVExtDQorICAgIDEzNDIyMzc1N1UsCS8vIFNFVExyDQorICAgIDY3MTA5NDY3NVUsCS8vIFNFVE5FbQ0KKyAgICAxMzQyMjM3NjNVLAkvLyBTRVRORXINCisgICAgNjcxMDk0NjgyVSwJLy8gU0VUTk9tDQorICAgIDEzNDIyMzc3MFUsCS8vIFNFVE5Pcg0KKyAgICA2NzEwOTQ2ODlVLAkvLyBTRVROUG0NCisgICAgMTM0MjIzNzc3VSwJLy8gU0VUTlByDQorICAgIDY3MTA5NDY5NlUsCS8vIFNFVE5TbQ0KKyAgICAxMzQyMjM3ODRVLAkvLyBTRVROU3INCisgICAgNjcxMDk0NzAzVSwJLy8gU0VUT20NCisgICAgMTM0MjIzNzkxVSwJLy8gU0VUT3INCisgICAgNjcxMDk0NzA5VSwJLy8gU0VUUG0NCisgICAgMTM0MjIzNzk3VSwJLy8gU0VUUHINCisgICAgNjcxMDk0NzE1VSwJLy8gU0VUU20NCisgICAgMTM0MjIzODAzVSwJLy8gU0VUU3INCisgICAgNjA4MVUsCS8vIFNGRU5DRQ0KKyAgICAxNzQ0ODM2NTUyVSwJLy8gU0dEVG0NCisgICAgMjY4NDQxNTUwVSwJLy8gU0hMMTZtMQ0KKyAgICAzNTIzMjc2MzBVLAkvLyBTSEwxNm1DTA0KKyAgICAyNzI2MzU4NTRVLAkvLyBTSEwxNm1pDQorICAgIDEzNDIyMzgyMlUsCS8vIFNITDE2cjENCisgICAgMjE4MTA5OTAyVSwJLy8gU0hMMTZyQ0wNCisgICAgMTM4NTQ5MTk4VSwJLy8gU0hMMTZyaQ0KKyAgICA0MDI2NTkyNzhVLAkvLyBTSEwzMm0xDQorICAgIDQ4NjU0NTM1OFUsCS8vIFNITDMybUNMDQorICAgIDQwNjg1MzU4MlUsCS8vIFNITDMybWkNCisgICAgMTM0MjIzODIyVSwJLy8gU0hMMzJyMQ0KKyAgICAyMTgxMDk5MDJVLAkvLyBTSEwzMnJDTA0KKyAgICAxMzg1NDkxOThVLAkvLyBTSEwzMnJpDQorICAgIDUzNjg3NzAwNlUsCS8vIFNITDY0bTENCisgICAgNjI0OTU3MzkwVSwJLy8gU0hMNjRtQ0wNCisgICAgNTQxMDcxMzEwVSwJLy8gU0hMNjRtaQ0KKyAgICAxMzQyMjM4MjJVLAkvLyBTSEw2NHIxDQorICAgIDIyMjMwNDIwNlUsCS8vIFNITDY0ckNMDQorICAgIDEzODU0OTE5OFUsCS8vIFNITDY0cmkNCisgICAgNjcxMDk0NzM0VSwJLy8gU0hMOG0xDQorICAgIDc1NDk4MDgxNFUsCS8vIFNITDhtQ0wNCisgICAgNjc1Mjg5MDM4VSwJLy8gU0hMOG1pDQorICAgIDEzNDIyMzgyMlUsCS8vIFNITDhyMQ0KKyAgICAyMTgxMDk5MDJVLAkvLyBTSEw4ckNMDQorICAgIDEzODU0OTE5OFUsCS8vIFNITDhyaQ0KKyAgICAyNzI2MzU4NTlVLAkvLyBTSExEMTZtckNMDQorICAgIDI3MjYzNTg1OVUsCS8vIFNITEQxNm1yaTgNCisgICAgMTM4NTQ5MjAzVSwJLy8gU0hMRDE2cnJDTA0KKyAgICAxMzg1NDkyMDNVLAkvLyBTSExEMTZycmk4DQorICAgIDQwNjg1MzU4N1UsCS8vIFNITEQzMm1yQ0wNCisgICAgNDA2ODUzNTg3VSwJLy8gU0hMRDMybXJpOA0KKyAgICAxMzg1NDkyMDNVLAkvLyBTSExEMzJyckNMDQorICAgIDEzODU0OTIwM1UsCS8vIFNITEQzMnJyaTgNCisgICAgNTQxMDcxMzE1VSwJLy8gU0hMRDY0bXJDTA0KKyAgICA1NDEwNzEzMTVVLAkvLyBTSExENjRtcmk4DQorICAgIDEzODU0OTIwM1UsCS8vIFNITEQ2NHJyQ0wNCisgICAgMTM4NTQ5MjAzVSwJLy8gU0hMRDY0cnJpOA0KKyAgICAyNjg0NDE1NjFVLAkvLyBTSFIxNm0xDQorICAgIDM1MjMyNzY0MVUsCS8vIFNIUjE2bUNMDQorICAgIDI3MjYzNTg2NVUsCS8vIFNIUjE2bWkNCisgICAgMTM0MjIzODMzVSwJLy8gU0hSMTZyMQ0KKyAgICAyMTgxMDk5MTNVLAkvLyBTSFIxNnJDTA0KKyAgICAxMzg1NDkyMDlVLAkvLyBTSFIxNnJpDQorICAgIDQwMjY1OTI4OVUsCS8vIFNIUjMybTENCisgICAgNDg2NTQ1MzY5VSwJLy8gU0hSMzJtQ0wNCisgICAgNDA2ODUzNTkzVSwJLy8gU0hSMzJtaQ0KKyAgICAxMzQyMjM4MzNVLAkvLyBTSFIzMnIxDQorICAgIDIxODEwOTkxM1UsCS8vIFNIUjMyckNMDQorICAgIDEzODU0OTIwOVUsCS8vIFNIUjMycmkNCisgICAgNTM2ODc3MDE3VSwJLy8gU0hSNjRtMQ0KKyAgICA2MjQ5NTc0MDFVLAkvLyBTSFI2NG1DTA0KKyAgICA1NDEwNzEzMjFVLAkvLyBTSFI2NG1pDQorICAgIDEzNDIyMzgzM1UsCS8vIFNIUjY0cjENCisgICAgMjIyMzA0MjE3VSwJLy8gU0hSNjRyQ0wNCisgICAgMTM4NTQ5MjA5VSwJLy8gU0hSNjRyaQ0KKyAgICA2NzEwOTQ3NDVVLAkvLyBTSFI4bTENCisgICAgNzU0OTgwODI1VSwJLy8gU0hSOG1DTA0KKyAgICA2NzUyODkwNDlVLAkvLyBTSFI4bWkNCisgICAgMTM0MjIzODMzVSwJLy8gU0hSOHIxDQorICAgIDIxODEwOTkxM1UsCS8vIFNIUjhyQ0wNCisgICAgMTM4NTQ5MjA5VSwJLy8gU0hSOHJpDQorICAgIDI3MjYzNTg3MFUsCS8vIFNIUkQxNm1yQ0wNCisgICAgMjcyNjM1ODcwVSwJLy8gU0hSRDE2bXJpOA0KKyAgICAxMzg1NDkyMTRVLAkvLyBTSFJEMTZyckNMDQorICAgIDEzODU0OTIxNFUsCS8vIFNIUkQxNnJyaTgNCisgICAgNDA2ODUzNTk4VSwJLy8gU0hSRDMybXJDTA0KKyAgICA0MDY4NTM1OThVLAkvLyBTSFJEMzJtcmk4DQorICAgIDEzODU0OTIxNFUsCS8vIFNIUkQzMnJyQ0wNCisgICAgMTM4NTQ5MjE0VSwJLy8gU0hSRDMycnJpOA0KKyAgICA1NDEwNzEzMjZVLAkvLyBTSFJENjRtckNMDQorICAgIDU0MTA3MTMyNlUsCS8vIFNIUkQ2NG1yaTgNCisgICAgMTM4NTQ5MjE0VSwJLy8gU0hSRDY0cnJDTA0KKyAgICAxMzg1NDkyMTRVLAkvLyBTSFJENjRycmk4DQorICAgIDEzOTIwNDU4MFUsCS8vIFNIVUZQRHJtaQ0KKyAgICAxMzg1NDkyMjBVLAkvLyBTSFVGUERycmkNCisgICAgMTM5MjA0NTg4VSwJLy8gU0hVRlBTcm1pDQorICAgIDEzODU0OTIyOFUsCS8vIFNIVUZQU3JyaQ0KKyAgICAxNzQ0ODM2NTk2VSwJLy8gU0lEVG0NCisgICAgNjEzOFUsCS8vIFNJTl9GDQorICAgIDBVLAkvLyBTSU5fRnAzMg0KKyAgICAwVSwJLy8gU0lOX0ZwNjQNCisgICAgMFUsCS8vIFNJTl9GcDgwDQorICAgIDI2ODQ0MTU5OVUsCS8vIFNMRFQxNm0NCisgICAgMTM0MjIzODcxVSwJLy8gU0xEVDE2cg0KKyAgICAyNjg0NDE1OTlVLAkvLyBTTERUNjRtDQorICAgIDEzNDIyMzg3MVUsCS8vIFNMRFQ2NHINCisgICAgMjY4NDQxNjA1VSwJLy8gU01TVzE2bQ0KKyAgICAxMzQyMjM4NzdVLAkvLyBTTVNXMTZyDQorICAgIDEzNDIyMzg3N1UsCS8vIFNNU1czMnINCisgICAgMTM0MjIzODc3VSwJLy8gU01TVzY0cg0KKyAgICAxNDA1MTUzMzlVLAkvLyBTUVJUUERtDQorICAgIDE0MDUxNTMzOVUsCS8vIFNRUlRQRG1fSW50DQorICAgIDEzOTg1OTk3OVUsCS8vIFNRUlRQRHINCisgICAgMTM5ODU5OTc5VSwJLy8gU1FSVFBEcl9JbnQNCisgICAgMTQwNTE1MzQ3VSwJLy8gU1FSVFBTbQ0KKyAgICAxNDA1MTUzNDdVLAkvLyBTUVJUUFNtX0ludA0KKyAgICAxMzk4NTk5ODdVLAkvLyBTUVJUUFNyDQorICAgIDEzOTg1OTk4N1UsCS8vIFNRUlRQU3JfSW50DQorICAgIDE0MDY0NjQyN1UsCS8vIFNRUlRTRG0NCisgICAgMTQwNjQ2NDI3VSwJLy8gU1FSVFNEbV9JbnQNCisgICAgMTM5ODU5OTk1VSwJLy8gU1FSVFNEcg0KKyAgICAxMzk4NTk5OTVVLAkvLyBTUVJUU0RyX0ludA0KKyAgICAxNDA3Nzc1MDdVLAkvLyBTUVJUU1NtDQorICAgIDE0MDc3NzUwN1UsCS8vIFNRUlRTU21fSW50DQorICAgIDEzOTg2MDAwM1UsCS8vIFNRUlRTU3INCisgICAgMTM5ODYwMDAzVSwJLy8gU1FSVFNTcl9JbnQNCisgICAgNjE4N1UsCS8vIFNRUlRfRg0KKyAgICAwVSwJLy8gU1FSVF9GcDMyDQorICAgIDBVLAkvLyBTUVJUX0ZwNjQNCisgICAgMFUsCS8vIFNRUlRfRnA4MA0KKyAgICA2MTkzVSwJLy8gU1NfUFJFRklYDQorICAgIDYxOTZVLAkvLyBTVEMNCisgICAgNjIwMFUsCS8vIFNURA0KKyAgICA2MjA0VSwJLy8gU1RJDQorICAgIDQwMjY1OTM5MlUsCS8vIFNUTVhDU1INCisgICAgNDYxMFUsCS8vIFNUT1NCDQorICAgIDYyMTdVLAkvLyBTVE9TRA0KKyAgICA2MjIzVSwJLy8gU1RPU1ENCisgICAgNDYxMFUsCS8vIFNUT1NXDQorICAgIDYyMjlVLAkvLyBTVFJtDQorICAgIDYyMjlVLAkvLyBTVFJyDQorICAgIDgwNTMxMjYwMlUsCS8vIFNUX0YzMm0NCisgICAgOTM5NTMwMzMwVSwJLy8gU1RfRjY0bQ0KKyAgICA4MDUzMTI2MDdVLAkvLyBTVF9GUDMybQ0KKyAgICA5Mzk1MzAzMzVVLAkvLyBTVF9GUDY0bQ0KKyAgICAyMTQ3NDg5ODg3VSwJLy8gU1RfRlA4MG0NCisgICAgMTM0MjIzOTY3VSwJLy8gU1RfRlBycg0KKyAgICAwVSwJLy8gU1RfRnAzMm0NCisgICAgMFUsCS8vIFNUX0ZwNjRtDQorICAgIDBVLAkvLyBTVF9GcDY0bTMyDQorICAgIDBVLAkvLyBTVF9GcDgwbTMyDQorICAgIDBVLAkvLyBTVF9GcDgwbTY0DQorICAgIDBVLAkvLyBTVF9GcFAzMm0NCisgICAgMFUsCS8vIFNUX0ZwUDY0bQ0KKyAgICAwVSwJLy8gU1RfRnBQNjRtMzINCisgICAgMFUsCS8vIFNUX0ZwUDgwbQ0KKyAgICAwVSwJLy8gU1RfRnBQODBtMzINCisgICAgMFUsCS8vIFNUX0ZwUDgwbTY0DQorICAgIDEzNDIyMzk2MlUsCS8vIFNUX0Zycg0KKyAgICAxMzQyMjM5NzNVLAkvLyBTVUIxNmkxNg0KKyAgICAyNzI2MzYwMTVVLAkvLyBTVUIxNm1pDQorICAgIDI3MjYzNjAxNVUsCS8vIFNVQjE2bWk4DQorICAgIDI3MjYzNjAxNVUsCS8vIFNVQjE2bXINCisgICAgMTM4NTQ5MzU5VSwJLy8gU1VCMTZyaQ0KKyAgICAxMzg1NDkzNTlVLAkvLyBTVUIxNnJpOA0KKyAgICAxMzg2ODA0MzFVLAkvLyBTVUIxNnJtDQorICAgIDEzODU0OTM1OVUsCS8vIFNVQjE2cnINCisgICAgMTM4NTQ5MzU5VSwJLy8gU1VCMTZycl9SRVYNCisgICAgMTM0MjIzOTg4VSwJLy8gU1VCMzJpMzINCisgICAgNDA2ODUzNzQzVSwJLy8gU1VCMzJtaQ0KKyAgICA0MDY4NTM3NDNVLAkvLyBTVUIzMm1pOA0KKyAgICA0MDY4NTM3NDNVLAkvLyBTVUIzMm1yDQorICAgIDEzODU0OTM1OVUsCS8vIFNVQjMycmkNCisgICAgMTM4NTQ5MzU5VSwJLy8gU1VCMzJyaTgNCisgICAgMTM4ODExNTAzVSwJLy8gU1VCMzJybQ0KKyAgICAxMzg1NDkzNTlVLAkvLyBTVUIzMnJyDQorICAgIDEzODU0OTM1OVUsCS8vIFNVQjMycnJfUkVWDQorICAgIDEzNDIyMzk5OVUsCS8vIFNVQjY0aTMyDQorICAgIDU0MTA3MTQ3MVUsCS8vIFNVQjY0bWkzMg0KKyAgICA1NDEwNzE0NzFVLAkvLyBTVUI2NG1pOA0KKyAgICA1NDEwNzE0NzFVLAkvLyBTVUI2NG1yDQorICAgIDEzODU0OTM1OVUsCS8vIFNVQjY0cmkzMg0KKyAgICAxMzg1NDkzNTlVLAkvLyBTVUI2NHJpOA0KKyAgICAxMzg5NDI1NzVVLAkvLyBTVUI2NHJtDQorICAgIDEzODU0OTM1OVUsCS8vIFNVQjY0cnINCisgICAgMTM4NTQ5MzU5VSwJLy8gU1VCNjRycl9SRVYNCisgICAgMTM0MjI0MDEwVSwJLy8gU1VCOGk4DQorICAgIDY3NTI4OTE5OVUsCS8vIFNVQjhtaQ0KKyAgICA2NzUyODkxOTlVLAkvLyBTVUI4bXINCisgICAgMTM4NTQ5MzU5VSwJLy8gU1VCOHJpDQorICAgIDEzOTA3MzY0N1UsCS8vIFNVQjhybQ0KKyAgICAxMzg1NDkzNTlVLAkvLyBTVUI4cnINCisgICAgMTM4NTQ5MzU5VSwJLy8gU1VCOHJyX1JFVg0KKyAgICAxMzkyMDQ3NTZVLAkvLyBTVUJQRHJtDQorICAgIDEzODU0OTM5NlUsCS8vIFNVQlBEcnINCisgICAgMTM5MjA0NzYzVSwJLy8gU1VCUFNybQ0KKyAgICAxMzg1NDk0MDNVLAkvLyBTVUJQU3JyDQorICAgIDgwNTMxMjY3NFUsCS8vIFNVQlJfRjMybQ0KKyAgICA5Mzk1MzA0MDJVLAkvLyBTVUJSX0Y2NG0NCisgICAgMjY4NDQxNzY5VSwJLy8gU1VCUl9GSTE2bQ0KKyAgICA0MDI2NTk0OTdVLAkvLyBTVUJSX0ZJMzJtDQorICAgIDEzNDIyNDA0OVUsCS8vIFNVQlJfRlByU1QwDQorICAgIDEzNDIyNDAzNFUsCS8vIFNVQlJfRlNUMHINCisgICAgMFUsCS8vIFNVQlJfRnAzMm0NCisgICAgMFUsCS8vIFNVQlJfRnA2NG0NCisgICAgMFUsCS8vIFNVQlJfRnA2NG0zMg0KKyAgICAwVSwJLy8gU1VCUl9GcDgwbTMyDQorICAgIDBVLAkvLyBTVUJSX0ZwODBtNjQNCisgICAgMFUsCS8vIFNVQlJfRnBJMTZtMzINCisgICAgMFUsCS8vIFNVQlJfRnBJMTZtNjQNCisgICAgMFUsCS8vIFNVQlJfRnBJMTZtODANCisgICAgMFUsCS8vIFNVQlJfRnBJMzJtMzINCisgICAgMFUsCS8vIFNVQlJfRnBJMzJtNjQNCisgICAgMFUsCS8vIFNVQlJfRnBJMzJtODANCisgICAgMTQyNjEyNjQyVSwJLy8gU1VCUl9GclNUMA0KKyAgICAxMzkzMzU4NjVVLAkvLyBTVUJTRHJtDQorICAgIDEzOTMzNTg2NVUsCS8vIFNVQlNEcm1fSW50DQorICAgIDEzODU0OTQzM1UsCS8vIFNVQlNEcnINCisgICAgMTM4NTQ5NDMzVSwJLy8gU1VCU0Rycl9JbnQNCisgICAgMTM5NDY2OTQ0VSwJLy8gU1VCU1NybQ0KKyAgICAxMzk0NjY5NDRVLAkvLyBTVUJTU3JtX0ludA0KKyAgICAxMzg1NDk0NDBVLAkvLyBTVUJTU3JyDQorICAgIDEzODU0OTQ0MFUsCS8vIFNVQlNTcnJfSW50DQorICAgIDgwNTMxMjcxMVUsCS8vIFNVQl9GMzJtDQorICAgIDkzOTUzMDQzOVUsCS8vIFNVQl9GNjRtDQorICAgIDI2ODQ0MTgwNVUsCS8vIFNVQl9GSTE2bQ0KKyAgICA0MDI2NTk1MzNVLAkvLyBTVUJfRkkzMm0NCisgICAgMTM0MjI0MDg0VSwJLy8gU1VCX0ZQclNUMA0KKyAgICAxMzQyMjQwNzFVLAkvLyBTVUJfRlNUMHINCisgICAgMFUsCS8vIFNVQl9GcDMyDQorICAgIDBVLAkvLyBTVUJfRnAzMm0NCisgICAgMFUsCS8vIFNVQl9GcDY0DQorICAgIDBVLAkvLyBTVUJfRnA2NG0NCisgICAgMFUsCS8vIFNVQl9GcDY0bTMyDQorICAgIDBVLAkvLyBTVUJfRnA4MA0KKyAgICAwVSwJLy8gU1VCX0ZwODBtMzINCisgICAgMFUsCS8vIFNVQl9GcDgwbTY0DQorICAgIDBVLAkvLyBTVUJfRnBJMTZtMzINCisgICAgMFUsCS8vIFNVQl9GcEkxNm02NA0KKyAgICAwVSwJLy8gU1VCX0ZwSTE2bTgwDQorICAgIDBVLAkvLyBTVUJfRnBJMzJtMzINCisgICAgMFUsCS8vIFNVQl9GcEkzMm02NA0KKyAgICAwVSwJLy8gU1VCX0ZwSTMybTgwDQorICAgIDE0MjYxMjY3OVUsCS8vIFNVQl9GclNUMA0KKyAgICA2MzYzVSwJLy8gU1dBUEdTDQorICAgIDYzNzBVLAkvLyBTWVNDQUxMDQorICAgIDYzNzhVLAkvLyBTWVNFTlRFUg0KKyAgICA2Mzg3VSwJLy8gU1lTRVhJVA0KKyAgICA2Mzg3VSwJLy8gU1lTRVhJVDY0DQorICAgIDYzOTVVLAkvLyBTWVNSRVQNCisgICAgMTE2NjAxOTkzM1UsCS8vIFRBSUxKTVBkDQorICAgIDExNjYwMTk5MzNVLAkvLyBUQUlMSk1QZDY0DQorICAgIDQ5NDkzMTI5M1UsCS8vIFRBSUxKTVBtDQorICAgIDYyOTE0OTAyMVUsCS8vIFRBSUxKTVBtNjQNCisgICAgMFUsCS8vIFRBSUxKTVByDQorICAgIDIyNjQ5NTgzN1UsCS8vIFRBSUxKTVByNjQNCisgICAgMTE3MTY1OTAxMFUsCS8vIFRDUkVUVVJOZGkNCisgICAgMTE3MTY1OTAxMFUsCS8vIFRDUkVUVVJOZGk2NA0KKyAgICA0OTkxMjg1NzhVLAkvLyBUQ1JFVFVSTm1pDQorICAgIDYzMzM0NjMwNlUsCS8vIFRDUkVUVVJObWk2NA0KKyAgICAyMzIxMzQ5MTRVLAkvLyBUQ1JFVFVSTnJpDQorICAgIDIzMjEzNDkxNFUsCS8vIFRDUkVUVVJOcmk2NA0KKyAgICAxMzQyMjQxNDJVLAkvLyBURVNUMTZpMTYNCisgICAgMjcyNjM2MTg1VSwJLy8gVEVTVDE2bWkNCisgICAgMTM5ODYwMjQ5VSwJLy8gVEVTVDE2cmkNCisgICAgMTM5OTkxMzIxVSwJLy8gVEVTVDE2cm0NCisgICAgMTM5ODYwMjQ5VSwJLy8gVEVTVDE2cnINCisgICAgMTM0MjI0MTU5VSwJLy8gVEVTVDMyaTMyDQorICAgIDQwNjg1MzkxM1UsCS8vIFRFU1QzMm1pDQorICAgIDEzOTg2MDI0OVUsCS8vIFRFU1QzMnJpDQorICAgIDE0MDEyMjM5M1UsCS8vIFRFU1QzMnJtDQorICAgIDEzOTg2MDI0OVUsCS8vIFRFU1QzMnJyDQorICAgIDEzNDIyNDE3MVUsCS8vIFRFU1Q2NGkzMg0KKyAgICA1NDEwNzE2NDFVLAkvLyBURVNUNjRtaTMyDQorICAgIDEzOTg2MDI0OVUsCS8vIFRFU1Q2NHJpMzINCisgICAgMTQwMjUzNDY1VSwJLy8gVEVTVDY0cm0NCisgICAgMTM5ODYwMjQ5VSwJLy8gVEVTVDY0cnINCisgICAgMTM0MjI0MTgzVSwJLy8gVEVTVDhpOA0KKyAgICA2NzUyODkzNjlVLAkvLyBURVNUOG1pDQorICAgIDEzOTg2MDI0OVUsCS8vIFRFU1Q4cmkNCisgICAgMTQwMzg0NTM3VSwJLy8gVEVTVDhybQ0KKyAgICAxMzk4NjAyNDlVLAkvLyBURVNUOHJyDQorICAgIDY0NjZVLAkvLyBUTFNDYWxsXzMyDQorICAgIDY0NzlVLAkvLyBUTFNDYWxsXzY0DQorICAgIDUwMzMyMjk3MlUsCS8vIFRMU19hZGRyMzINCisgICAgNjQxNzM1MDEwVSwJLy8gVExTX2FkZHI2NA0KKyAgICA2NTE2VSwJLy8gVFJBUA0KKyAgICA2NTIwVSwJLy8gVFNUX0YNCisgICAgMFUsCS8vIFRTVF9GcDMyDQorICAgIDBVLAkvLyBUU1RfRnA2NA0KKyAgICAwVSwJLy8gVFNUX0ZwODANCisgICAgMTQwNjQzNDAyVSwJLy8gVUNPTUlTRHJtDQorICAgIDEzOTg1Njk3MFUsCS8vIFVDT01JU0Rycg0KKyAgICAxNDA3NzQ0ODNVLAkvLyBVQ09NSVNTcm0NCisgICAgMTM5ODU2OTc5VSwJLy8gVUNPTUlTU3JyDQorICAgIDEzNDIyNDI1M1UsCS8vIFVDT01fRklQcg0KKyAgICAxMzQyMjQyNzBVLAkvLyBVQ09NX0ZJcg0KKyAgICA2NTU4VSwJLy8gVUNPTV9GUFByDQorICAgIDEzNDIyNDI5NFUsCS8vIFVDT01fRlByDQorICAgIDBVLAkvLyBVQ09NX0ZwSXIzMg0KKyAgICAwVSwJLy8gVUNPTV9GcElyNjQNCisgICAgMFUsCS8vIFVDT01fRnBJcjgwDQorICAgIDBVLAkvLyBVQ09NX0ZwcjMyDQorICAgIDBVLAkvLyBVQ09NX0ZwcjY0DQorICAgIDBVLAkvLyBVQ09NX0ZwcjgwDQorICAgIDEzNDIyNDMwMlUsCS8vIFVDT01fRnINCisgICAgMTM5MjA1MDQ1VSwJLy8gVU5QQ0tIUERybQ0KKyAgICAxMzg1NDk2ODVVLAkvLyBVTlBDS0hQRHJyDQorICAgIDEzOTIwNTA1NVUsCS8vIFVOUENLSFBTcm0NCisgICAgMTM4NTQ5Njk1VSwJLy8gVU5QQ0tIUFNycg0KKyAgICAxMzkyMDUwNjVVLAkvLyBVTlBDS0xQRHJtDQorICAgIDEzODU0OTcwNVUsCS8vIFVOUENLTFBEcnINCisgICAgMTM5MjA1MDc1VSwJLy8gVU5QQ0tMUFNybQ0KKyAgICAxMzg1NDk3MTVVLAkvLyBVTlBDS0xQU3JyDQorICAgIDEzOTg2MDQ0NVUsCS8vIFZBRERQRFlybQ0KKyAgICAxMzk4NjA0NDVVLAkvLyBWQUREUERZcnINCisgICAgMTM5ODYwNDQ1VSwJLy8gVkFERFBEcm0NCisgICAgMTM5ODYwNDQ1VSwJLy8gVkFERFBEcnINCisgICAgMTM5ODYwNDUzVSwJLy8gVkFERFBTWXJtDQorICAgIDEzOTg2MDQ1M1UsCS8vIFZBRERQU1lycg0KKyAgICAxMzk4NjA0NTNVLAkvLyBWQUREUFNybQ0KKyAgICAxMzk4NjA0NTNVLAkvLyBWQUREUFNycg0KKyAgICAxMzk4NjA0NjFVLAkvLyBWQUREU0RybQ0KKyAgICAxMzk4NjA0NjFVLAkvLyBWQUREU0RybV9JbnQNCisgICAgMTM5ODYwNDYxVSwJLy8gVkFERFNEcnINCisgICAgMTM5ODYwNDYxVSwJLy8gVkFERFNEcnJfSW50DQorICAgIDEzOTg2MDQ2OVUsCS8vIFZBRERTU3JtDQorICAgIDEzOTg2MDQ2OVUsCS8vIFZBRERTU3JtX0ludA0KKyAgICAxMzk4NjA0NjlVLAkvLyBWQUREU1Nycg0KKyAgICAxMzk4NjA0NjlVLAkvLyBWQUREU1Nycl9JbnQNCisgICAgMTM5ODYwNDc3VSwJLy8gVkFERFNVQlBEWXJtDQorICAgIDEzOTg2MDQ3N1UsCS8vIFZBRERTVUJQRFlycg0KKyAgICAxMzk4NjA0NzdVLAkvLyBWQUREU1VCUERybQ0KKyAgICAxMzk4NjA0NzdVLAkvLyBWQUREU1VCUERycg0KKyAgICAxMzk4NjA0ODhVLAkvLyBWQUREU1VCUFNZcm0NCisgICAgMTM5ODYwNDg4VSwJLy8gVkFERFNVQlBTWXJyDQorICAgIDEzOTg2MDQ4OFUsCS8vIFZBRERTVUJQU3JtDQorICAgIDEzOTg2MDQ4OFUsCS8vIFZBRERTVUJQU3JyDQorICAgIDEzOTg2MDQ5OVUsCS8vIFZBRVNERUNMQVNUcm0NCisgICAgMTM5ODYwNDk5VSwJLy8gVkFFU0RFQ0xBU1Rycg0KKyAgICAxMzk4NjA1MTJVLAkvLyBWQUVTREVDcm0NCisgICAgMTM5ODYwNTEyVSwJLy8gVkFFU0RFQ3JyDQorICAgIDEzOTg2MDUyMVUsCS8vIFZBRVNFTkNMQVNUcm0NCisgICAgMTM5ODYwNTIxVSwJLy8gVkFFU0VOQ0xBU1Rycg0KKyAgICAxMzk4NjA1MzRVLAkvLyBWQUVTRU5Dcm0NCisgICAgMTM5ODYwNTM0VSwJLy8gVkFFU0VOQ3JyDQorICAgIDEzOTcyOTQ3MVUsCS8vIFZBRVNJTUNybQ0KKyAgICAxMzk4NjA1NDNVLAkvLyBWQUVTSU1DcnINCisgICAgMTM5NzI5NDgwVSwJLy8gVkFFU0tFWUdFTkFTU0lTVDEyOHJtDQorICAgIDEzOTg2MDU1MlUsCS8vIFZBRVNLRVlHRU5BU1NJU1QxMjhycg0KKyAgICAxMzk4NjA1NzBVLAkvLyBWQU5ETlBEWXJtDQorICAgIDEzOTg2MDU3MFUsCS8vIFZBTkROUERZcnINCisgICAgMTM5ODYwNTcwVSwJLy8gVkFORE5QRHJtDQorICAgIDEzOTg2MDU3MFUsCS8vIFZBTkROUERycg0KKyAgICAxMzk4NjA1NzlVLAkvLyBWQU5ETlBTWXJtDQorICAgIDEzOTg2MDU3OVUsCS8vIFZBTkROUFNZcnINCisgICAgMTM5ODYwNTc5VSwJLy8gVkFORE5QU3JtDQorICAgIDEzOTg2MDU3OVUsCS8vIFZBTkROUFNycg0KKyAgICAxMzk4NjA1ODhVLAkvLyBWQU5EUERZcm0NCisgICAgMTM5ODYwNTg4VSwJLy8gVkFORFBEWXJyDQorICAgIDEzOTg2MDU4OFUsCS8vIFZBTkRQRHJtDQorICAgIDEzOTg2MDU4OFUsCS8vIFZBTkRQRHJyDQorICAgIDEzOTg2MDU5NlUsCS8vIFZBTkRQU1lybQ0KKyAgICAxMzk4NjA1OTZVLAkvLyBWQU5EUFNZcnINCisgICAgMTM5ODYwNTk2VSwJLy8gVkFORFBTcm0NCisgICAgMTM5ODYwNTk2VSwJLy8gVkFORFBTcnINCisgICAgMTM5ODYwNjA0VSwJLy8gVkFTVEFSVF9TQVZFX1hNTV9SRUdTDQorICAgIDEzOTg2MDYyOFUsCS8vIFZCTEVORFBEWXJtaQ0KKyAgICAxMzk4NjA2MjhVLAkvLyBWQkxFTkRQRFlycmkNCisgICAgMTM5ODYwNjI4VSwJLy8gVkJMRU5EUERybWkNCisgICAgMTM5ODYwNjI4VSwJLy8gVkJMRU5EUERycmkNCisgICAgMTM5ODYwNjM4VSwJLy8gVkJMRU5EUFNZcm1pDQorICAgIDEzOTg2MDYzOFUsCS8vIFZCTEVORFBTWXJyaQ0KKyAgICAxMzk4NjA2MzhVLAkvLyBWQkxFTkRQU3JtaQ0KKyAgICAxMzk4NjA2MzhVLAkvLyBWQkxFTkRQU3JyaQ0KKyAgICAxMzk4NjA2NDhVLAkvLyBWQkxFTkRWUERZcm0NCisgICAgMTM5ODYwNjQ4VSwJLy8gVkJMRU5EVlBEWXJyDQorICAgIDEzOTg2MDY0OFUsCS8vIFZCTEVORFZQRHJtDQorICAgIDEzOTg2MDY0OFUsCS8vIFZCTEVORFZQRHJyDQorICAgIDEzOTg2MDY1OVUsCS8vIFZCTEVORFZQU1lybQ0KKyAgICAxMzk4NjA2NTlVLAkvLyBWQkxFTkRWUFNZcnINCisgICAgMTM5ODYwNjU5VSwJLy8gVkJMRU5EVlBTcm0NCisgICAgMTM5ODYwNjU5VSwJLy8gVkJMRU5EVlBTcnINCisgICAgMTQwNTE2MDMwVSwJLy8gVkJST0FEQ0FTVEYxMjgNCisgICAgMTQwNjQ3MTE4VSwJLy8gVkJST0FEQ0FTVFNEDQorICAgIDE0MDc3ODIwNFUsCS8vIFZCUk9BRENBU1RTUw0KKyAgICAxNDA3NzgyMDRVLAkvLyBWQlJPQURDQVNUU1NZDQorICAgIDEyMjE5ODc0MjBVLAkvLyBWQ01QUERZcm1pDQorICAgIDEzOTg2MDcxNFUsCS8vIFZDTVBQRFlybWlfYWx0DQorICAgIDEzNTYyMDUxNDhVLAkvLyBWQ01QUERZcnJpDQorICAgIDEzOTg2MDcxNFUsCS8vIFZDTVBQRFlycmlfYWx0DQorICAgIDEyMjE5ODc0MjBVLAkvLyBWQ01QUERybWkNCisgICAgMTM5ODYwNzE0VSwJLy8gVkNNUFBEcm1pX2FsdA0KKyAgICAxMzU2MjA1MTQ4VSwJLy8gVkNNUFBEcnJpDQorICAgIDEzOTg2MDcxNFUsCS8vIFZDTVBQRHJyaV9hbHQNCisgICAgMTIyNjE4MTcyNFUsCS8vIFZDTVBQU1lybWkNCisgICAgMTM5ODYwNzIyVSwJLy8gVkNNUFBTWXJtaV9hbHQNCisgICAgMTM2MDM5OTQ1MlUsCS8vIFZDTVBQU1lycmkNCisgICAgMTM5ODYwNzIyVSwJLy8gVkNNUFBTWXJyaV9hbHQNCisgICAgMTIyNjE4MTcyNFUsCS8vIFZDTVBQU3JtaQ0KKyAgICAxMzk4NjA3MjJVLAkvLyBWQ01QUFNybWlfYWx0DQorICAgIDEzNjAzOTk0NTJVLAkvLyBWQ01QUFNycmkNCisgICAgMTM5ODYwNzIyVSwJLy8gVkNNUFBTcnJpX2FsdA0KKyAgICAxMjMwMzc2MDI4VSwJLy8gVkNNUFNEcm0NCisgICAgMTM5ODYwNzMwVSwJLy8gVkNNUFNEcm1fYWx0DQorICAgIDEzNjQ1OTM3NTZVLAkvLyBWQ01QU0Rycg0KKyAgICAxMzk4NjA3MzBVLAkvLyBWQ01QU0Rycl9hbHQNCisgICAgMTIzNDU3MDMzMlUsCS8vIFZDTVBTU3JtDQorICAgIDEzOTg2MDczOFUsCS8vIFZDTVBTU3JtX2FsdA0KKyAgICAxMzY4Nzg4MDYwVSwJLy8gVkNNUFNTcnINCisgICAgMTM5ODYwNzM4VSwJLy8gVkNNUFNTcnJfYWx0DQorICAgIDE0MDUxMjM1M1UsCS8vIFZDT01JU0RybQ0KKyAgICAxMzk4NTY5OTNVLAkvLyBWQ09NSVNEcnINCisgICAgMTQwNTEyMzYyVSwJLy8gVkNPTUlTU3JtDQorICAgIDEzOTg1NzAwMlUsCS8vIFZDT01JU1Nycg0KKyAgICAxNDA1MTIzNzFVLAkvLyBWQ1ZURFEyUERZcm0NCisgICAgMTM5ODU3MDExVSwJLy8gVkNWVERRMlBEWXJyDQorICAgIDE0MDUxMjM3MVUsCS8vIFZDVlREUTJQRHJtDQorICAgIDEzOTg1NzAxMVUsCS8vIFZDVlREUTJQRHJyDQorICAgIDE0MTE2Nzc0MlUsCS8vIFZDVlREUTJQU1lybQ0KKyAgICAxMzk4NTcwMjJVLAkvLyBWQ1ZURFEyUFNZcnINCisgICAgMTM5NzI1OTUwVSwJLy8gVkNWVERRMlBTcm0NCisgICAgMTM5ODU3MDIyVSwJLy8gVkNWVERRMlBTcnINCisgICAgMTM5ODU3MDMzVSwJLy8gVkNWVFBEMkRRWHJZcg0KKyAgICAxNDA1MTYxMDZVLAkvLyBWQ1ZUUEQyRFFYcm0NCisgICAgMTM5ODYwNzQ2VSwJLy8gVkNWVFBEMkRRWHJyDQorICAgIDE0MTA0MDQwNlUsCS8vIFZDVlRQRDJEUVlybQ0KKyAgICAxMzk4NjA3NThVLAkvLyBWQ1ZUUEQyRFFZcnINCisgICAgMTM5ODU3MDMzVSwJLy8gVkNWVFBEMkRRcnINCisgICAgMTM5ODU3MDQ0VSwJLy8gVkNWVFBEMlBTWHJZcg0KKyAgICAxNDA1MTYxMzBVLAkvLyBWQ1ZUUEQyUFNYcm0NCisgICAgMTM5ODYwNzcwVSwJLy8gVkNWVFBEMlBTWHJyDQorICAgIDE0MTA0MDQzMFUsCS8vIFZDVlRQRDJQU1lybQ0KKyAgICAxMzk4NjA3ODJVLAkvLyBWQ1ZUUEQyUFNZcnINCisgICAgMTM5ODU3MDQ0VSwJLy8gVkNWVFBEMlBTcnINCisgICAgMTQxMDM2NzAzVSwJLy8gVkNWVFBTMkRRWXJtDQorICAgIDEzOTg1NzA1NVUsCS8vIFZDVlRQUzJEUVlycg0KKyAgICAxNDA1MTI0MTVVLAkvLyBWQ1ZUUFMyRFFybQ0KKyAgICAxMzk4NTcwNTVVLAkvLyBWQ1ZUUFMyRFFycg0KKyAgICAxNDA1MTI0MjZVLAkvLyBWQ1ZUUFMyUERZcm0NCisgICAgMTM5ODU3MDY2VSwJLy8gVkNWVFBTMlBEWXJyDQorICAgIDE0MDY0MzQ5OFUsCS8vIFZDVlRQUzJQRHJtDQorICAgIDEzOTg1NzA2NlUsCS8vIFZDVlRQUzJQRHJyDQorICAgIDE0MDY0MzUwOVUsCS8vIFZDVlRTRDJTSTY0cm0NCisgICAgMTM5ODU3MDc3VSwJLy8gVkNWVFNEMlNJNjRycg0KKyAgICAxNDA2NDM1MDlVLAkvLyBWQ1ZUU0QyU0lfYWx0cm0NCisgICAgMTM5ODU3MDc3VSwJLy8gVkNWVFNEMlNJX2FsdHJyDQorICAgIDEzOTg1NzA4OFUsCS8vIFZDVlRTRDJTU3JtDQorICAgIDEzOTg1NzA4OFUsCS8vIFZDVlRTRDJTU3JyDQorICAgIDEzOTg1NzA5OVUsCS8vIFZDVlRTSTJTRDY0cm0NCisgICAgMTM5ODU3MDk5VSwJLy8gVkNWVFNJMlNENjRycg0KKyAgICAxMzk4NTcwOTlVLAkvLyBWQ1ZUU0kyU0RMcm0NCisgICAgMTM5ODU3MDk5VSwJLy8gVkNWVFNJMlNETHJyDQorICAgIDEzOTg1NzA5OVUsCS8vIFZDVlRTSTJTRHJtDQorICAgIDEzOTg1NzA5OVUsCS8vIFZDVlRTSTJTRHJyDQorICAgIDEzOTg1NzExMFUsCS8vIFZDVlRTSTJTUzY0cm0NCisgICAgMTM5ODU3MTEwVSwJLy8gVkNWVFNJMlNTNjRycg0KKyAgICAxMzk4NTcxMTBVLAkvLyBWQ1ZUU0kyU1NybQ0KKyAgICAxMzk4NTcxMTBVLAkvLyBWQ1ZUU0kyU1Nycg0KKyAgICAxMzk4NTcxMjFVLAkvLyBWQ1ZUU1MyU0RybQ0KKyAgICAxMzk4NTcxMjFVLAkvLyBWQ1ZUU1MyU0Rycg0KKyAgICAxNDA3NzQ2MzZVLAkvLyBWQ1ZUU1MyU0k2NHJtDQorICAgIDEzOTg1NzEzMlUsCS8vIFZDVlRTUzJTSTY0cnINCisgICAgMTQwNzc0NjM2VSwJLy8gVkNWVFNTMlNJcm0NCisgICAgMTM5ODU3MTMyVSwJLy8gVkNWVFNTMlNJcnINCisgICAgMTM5ODU3MTQzVSwJLy8gVkNWVFRQRDJEUVhyWXINCisgICAgMTQwNTE2MTU0VSwJLy8gVkNWVFRQRDJEUVhybQ0KKyAgICAxMzk4NjA3OTRVLAkvLyBWQ1ZUVFBEMkRRWHJyDQorICAgIDE0MTA0MDQ1NVUsCS8vIFZDVlRUUEQyRFFZcm0NCisgICAgMTM5ODYwODA3VSwJLy8gVkNWVFRQRDJEUVlycg0KKyAgICAxMzk4NTcxNDNVLAkvLyBWQ1ZUVFBEMkRRcnINCisgICAgMTQxMDM2ODAzVSwJLy8gVkNWVFRQUzJEUVlybQ0KKyAgICAxMzk4NTcxNTVVLAkvLyBWQ1ZUVFBTMkRRWXJyDQorICAgIDE0MDUxMjUxNVUsCS8vIFZDVlRUUFMyRFFybQ0KKyAgICAxMzk4NTcxNTVVLAkvLyBWQ1ZUVFBTMkRRcnINCisgICAgMTQwNjQ3MjUyVSwJLy8gVkNWVFRTRDJTSTY0cm0NCisgICAgMTM5ODYwODIwVSwJLy8gVkNWVFRTRDJTSTY0cnINCisgICAgMTQwNjQ3MjUyVSwJLy8gVkNWVFRTRDJTSXJtDQorICAgIDEzOTg2MDgyMFUsCS8vIFZDVlRUU0QyU0lycg0KKyAgICAxNDA3NzQ2NzFVLAkvLyBWQ1ZUVFNTMlNJNjRybQ0KKyAgICAxMzk4NTcxNjdVLAkvLyBWQ1ZUVFNTMlNJNjRycg0KKyAgICAxNDA3NzQ2NzFVLAkvLyBWQ1ZUVFNTMlNJcm0NCisgICAgMTM5ODU3MTY3VSwJLy8gVkNWVFRTUzJTSXJyDQorICAgIDEzOTg2MDgzMlUsCS8vIFZESVZQRFlybQ0KKyAgICAxMzk4NjA4MzJVLAkvLyBWRElWUERZcnINCisgICAgMTM5ODYwODMyVSwJLy8gVkRJVlBEcm0NCisgICAgMTM5ODYwODMyVSwJLy8gVkRJVlBEcnINCisgICAgMTM5ODYwODQwVSwJLy8gVkRJVlBTWXJtDQorICAgIDEzOTg2MDg0MFUsCS8vIFZESVZQU1lycg0KKyAgICAxMzk4NjA4NDBVLAkvLyBWRElWUFNybQ0KKyAgICAxMzk4NjA4NDBVLAkvLyBWRElWUFNycg0KKyAgICAxMzk4NjA4NDhVLAkvLyBWRElWU0RybQ0KKyAgICAxMzk4NjA4NDhVLAkvLyBWRElWU0RybV9JbnQNCisgICAgMTM5ODYwODQ4VSwJLy8gVkRJVlNEcnINCisgICAgMTM5ODYwODQ4VSwJLy8gVkRJVlNEcnJfSW50DQorICAgIDEzOTg2MDg1NlUsCS8vIFZESVZTU3JtDQorICAgIDEzOTg2MDg1NlUsCS8vIFZESVZTU3JtX0ludA0KKyAgICAxMzk4NjA4NTZVLAkvLyBWRElWU1Nycg0KKyAgICAxMzk4NjA4NTZVLAkvLyBWRElWU1Nycl9JbnQNCisgICAgMTM5ODYwODY0VSwJLy8gVkRQUERybWkNCisgICAgMTM5ODYwODY0VSwJLy8gVkRQUERycmkNCisgICAgMTM5ODYwODcxVSwJLy8gVkRQUFNZcm1pDQorICAgIDEzOTg2MDg3MVUsCS8vIFZEUFBTWXJyaQ0KKyAgICAxMzk4NjA4NzFVLAkvLyBWRFBQU3JtaQ0KKyAgICAxMzk4NjA4NzFVLAkvLyBWRFBQU3JyaQ0KKyAgICAyNjg0NDI1MTBVLAkvLyBWRVJSbQ0KKyAgICAxMzQyMjQ3ODJVLAkvLyBWRVJScg0KKyAgICAyNjg0NDI1MTZVLAkvLyBWRVJXbQ0KKyAgICAxMzQyMjQ3ODhVLAkvLyBWRVJXcg0KKyAgICAyODI1NjU3MjQyVSwJLy8gVkVYVFJBQ1RGMTI4bXINCisgICAgMTM5ODYwODkwVSwJLy8gVkVYVFJBQ1RGMTI4cnINCisgICAgODA5NTA3NzUyVSwJLy8gVkVYVFJBQ1RQU21yDQorICAgIDEzOTg2MDkwNFUsCS8vIFZFWFRSQUNUUFNycg0KKyAgICAxMzk4NjA5MTZVLAkvLyBWRVhUUkFDVFBTcnI2NA0KKyAgICAxMzk4NjA5MjlVLAkvLyBWRk1BRERQRHIxMzJtDQorICAgIDEzOTg2MDkyOVUsCS8vIFZGTUFERFBEcjEzMm1ZDQorICAgIDEzOTg2MDkyOVUsCS8vIFZGTUFERFBEcjEzMnINCisgICAgMTM5ODYwOTI5VSwJLy8gVkZNQUREUERyMTMyclkNCisgICAgMTM5ODYwOTQyVSwJLy8gVkZNQUREUERyMjEzbQ0KKyAgICAxMzk4NjA5NDJVLAkvLyBWRk1BRERQRHIyMTNtWQ0KKyAgICAxMzk4NjA5NDJVLAkvLyBWRk1BRERQRHIyMTNyDQorICAgIDEzOTg2MDk0MlUsCS8vIFZGTUFERFBEcjIxM3JZDQorICAgIDEzOTg2MDk1NVUsCS8vIFZGTUFERFBEcjIzMW0NCisgICAgMTM5ODYwOTU1VSwJLy8gVkZNQUREUERyMjMxbVkNCisgICAgMTM5ODYwOTU1VSwJLy8gVkZNQUREUERyMjMxcg0KKyAgICAxMzk4NjA5NTVVLAkvLyBWRk1BRERQRHIyMzFyWQ0KKyAgICAxMzk4NjA5NjhVLAkvLyBWRk1BRERQU3IxMzJtDQorICAgIDEzOTg2MDk2OFUsCS8vIFZGTUFERFBTcjEzMm1ZDQorICAgIDEzOTg2MDk2OFUsCS8vIFZGTUFERFBTcjEzMnINCisgICAgMTM5ODYwOTY4VSwJLy8gVkZNQUREUFNyMTMyclkNCisgICAgMTM5ODYwOTgxVSwJLy8gVkZNQUREUFNyMjEzbQ0KKyAgICAxMzk4NjA5ODFVLAkvLyBWRk1BRERQU3IyMTNtWQ0KKyAgICAxMzk4NjA5ODFVLAkvLyBWRk1BRERQU3IyMTNyDQorICAgIDEzOTg2MDk4MVUsCS8vIFZGTUFERFBTcjIxM3JZDQorICAgIDEzOTg2MDk5NFUsCS8vIFZGTUFERFBTcjIzMW0NCisgICAgMTM5ODYwOTk0VSwJLy8gVkZNQUREUFNyMjMxbVkNCisgICAgMTM5ODYwOTk0VSwJLy8gVkZNQUREUFNyMjMxcg0KKyAgICAxMzk4NjA5OTRVLAkvLyBWRk1BRERQU3IyMzFyWQ0KKyAgICAxMzk4NjEwMDdVLAkvLyBWRk1BRERTVUJQRHIxMzJtDQorICAgIDEzOTg2MTAwN1UsCS8vIFZGTUFERFNVQlBEcjEzMm1ZDQorICAgIDEzOTg2MTAwN1UsCS8vIFZGTUFERFNVQlBEcjEzMnINCisgICAgMTM5ODYxMDA3VSwJLy8gVkZNQUREU1VCUERyMTMyclkNCisgICAgMTM5ODYxMDIzVSwJLy8gVkZNQUREU1VCUERyMjEzbQ0KKyAgICAxMzk4NjEwMjNVLAkvLyBWRk1BRERTVUJQRHIyMTNtWQ0KKyAgICAxMzk4NjEwMjNVLAkvLyBWRk1BRERTVUJQRHIyMTNyDQorICAgIDEzOTg2MTAyM1UsCS8vIFZGTUFERFNVQlBEcjIxM3JZDQorICAgIDEzOTg2MTAzOVUsCS8vIFZGTUFERFNVQlBEcjIzMW0NCisgICAgMTM5ODYxMDM5VSwJLy8gVkZNQUREU1VCUERyMjMxbVkNCisgICAgMTM5ODYxMDM5VSwJLy8gVkZNQUREU1VCUERyMjMxcg0KKyAgICAxMzk4NjEwMzlVLAkvLyBWRk1BRERTVUJQRHIyMzFyWQ0KKyAgICAxMzk4NjEwNTVVLAkvLyBWRk1BRERTVUJQU3IxMzJtDQorICAgIDEzOTg2MTA1NVUsCS8vIFZGTUFERFNVQlBTcjEzMm1ZDQorICAgIDEzOTg2MTA1NVUsCS8vIFZGTUFERFNVQlBTcjEzMnINCisgICAgMTM5ODYxMDU1VSwJLy8gVkZNQUREU1VCUFNyMTMyclkNCisgICAgMTM5ODYxMDcxVSwJLy8gVkZNQUREU1VCUFNyMjEzbQ0KKyAgICAxMzk4NjEwNzFVLAkvLyBWRk1BRERTVUJQU3IyMTNtWQ0KKyAgICAxMzk4NjEwNzFVLAkvLyBWRk1BRERTVUJQU3IyMTNyDQorICAgIDEzOTg2MTA3MVUsCS8vIFZGTUFERFNVQlBTcjIxM3JZDQorICAgIDEzOTg2MTA4N1UsCS8vIFZGTUFERFNVQlBTcjIzMW0NCisgICAgMTM5ODYxMDg3VSwJLy8gVkZNQUREU1VCUFNyMjMxbVkNCisgICAgMTM5ODYxMDg3VSwJLy8gVkZNQUREU1VCUFNyMjMxcg0KKyAgICAxMzk4NjEwODdVLAkvLyBWRk1BRERTVUJQU3IyMzFyWQ0KKyAgICAxMzk4NjExMDNVLAkvLyBWRk1TVUJBRERQRHIxMzJtDQorICAgIDEzOTg2MTEwM1UsCS8vIFZGTVNVQkFERFBEcjEzMm1ZDQorICAgIDEzOTg2MTEwM1UsCS8vIFZGTVNVQkFERFBEcjEzMnINCisgICAgMTM5ODYxMTAzVSwJLy8gVkZNU1VCQUREUERyMTMyclkNCisgICAgMTM5ODYxMTE5VSwJLy8gVkZNU1VCQUREUERyMjEzbQ0KKyAgICAxMzk4NjExMTlVLAkvLyBWRk1TVUJBRERQRHIyMTNtWQ0KKyAgICAxMzk4NjExMTlVLAkvLyBWRk1TVUJBRERQRHIyMTNyDQorICAgIDEzOTg2MTExOVUsCS8vIFZGTVNVQkFERFBEcjIxM3JZDQorICAgIDEzOTg2MTEzNVUsCS8vIFZGTVNVQkFERFBEcjIzMW0NCisgICAgMTM5ODYxMTM1VSwJLy8gVkZNU1VCQUREUERyMjMxbVkNCisgICAgMTM5ODYxMTM1VSwJLy8gVkZNU1VCQUREUERyMjMxcg0KKyAgICAxMzk4NjExMzVVLAkvLyBWRk1TVUJBRERQRHIyMzFyWQ0KKyAgICAxMzk4NjExNTFVLAkvLyBWRk1TVUJBRERQU3IxMzJtDQorICAgIDEzOTg2MTE1MVUsCS8vIFZGTVNVQkFERFBTcjEzMm1ZDQorICAgIDEzOTg2MTE1MVUsCS8vIFZGTVNVQkFERFBTcjEzMnINCisgICAgMTM5ODYxMTUxVSwJLy8gVkZNU1VCQUREUFNyMTMyclkNCisgICAgMTM5ODYxMTY3VSwJLy8gVkZNU1VCQUREUFNyMjEzbQ0KKyAgICAxMzk4NjExNjdVLAkvLyBWRk1TVUJBRERQU3IyMTNtWQ0KKyAgICAxMzk4NjExNjdVLAkvLyBWRk1TVUJBRERQU3IyMTNyDQorICAgIDEzOTg2MTE2N1UsCS8vIFZGTVNVQkFERFBTcjIxM3JZDQorICAgIDEzOTg2MTE4M1UsCS8vIFZGTVNVQkFERFBTcjIzMW0NCisgICAgMTM5ODYxMTgzVSwJLy8gVkZNU1VCQUREUFNyMjMxbVkNCisgICAgMTM5ODYxMTgzVSwJLy8gVkZNU1VCQUREUFNyMjMxcg0KKyAgICAxMzk4NjExODNVLAkvLyBWRk1TVUJBRERQU3IyMzFyWQ0KKyAgICAxMzk4NjExOTlVLAkvLyBWRk1TVUJQRHIxMzJtDQorICAgIDEzOTg2MTE5OVUsCS8vIFZGTVNVQlBEcjEzMm1ZDQorICAgIDEzOTg2MTE5OVUsCS8vIFZGTVNVQlBEcjEzMnINCisgICAgMTM5ODYxMTk5VSwJLy8gVkZNU1VCUERyMTMyclkNCisgICAgMTM5ODYxMjEyVSwJLy8gVkZNU1VCUERyMjEzbQ0KKyAgICAxMzk4NjEyMTJVLAkvLyBWRk1TVUJQRHIyMTNtWQ0KKyAgICAxMzk4NjEyMTJVLAkvLyBWRk1TVUJQRHIyMTNyDQorICAgIDEzOTg2MTIxMlUsCS8vIFZGTVNVQlBEcjIxM3JZDQorICAgIDEzOTg2MTIyNVUsCS8vIFZGTVNVQlBEcjIzMW0NCisgICAgMTM5ODYxMjI1VSwJLy8gVkZNU1VCUERyMjMxbVkNCisgICAgMTM5ODYxMjI1VSwJLy8gVkZNU1VCUERyMjMxcg0KKyAgICAxMzk4NjEyMjVVLAkvLyBWRk1TVUJQRHIyMzFyWQ0KKyAgICAxMzk4NjEyMzhVLAkvLyBWRk1TVUJQU3IxMzJtDQorICAgIDEzOTg2MTIzOFUsCS8vIFZGTVNVQlBTcjEzMm1ZDQorICAgIDEzOTg2MTIzOFUsCS8vIFZGTVNVQlBTcjEzMnINCisgICAgMTM5ODYxMjM4VSwJLy8gVkZNU1VCUFNyMTMyclkNCisgICAgMTM5ODYxMjUxVSwJLy8gVkZNU1VCUFNyMjEzbQ0KKyAgICAxMzk4NjEyNTFVLAkvLyBWRk1TVUJQU3IyMTNtWQ0KKyAgICAxMzk4NjEyNTFVLAkvLyBWRk1TVUJQU3IyMTNyDQorICAgIDEzOTg2MTI1MVUsCS8vIFZGTVNVQlBTcjIxM3JZDQorICAgIDEzOTg2MTI2NFUsCS8vIFZGTVNVQlBTcjIzMW0NCisgICAgMTM5ODYxMjY0VSwJLy8gVkZNU1VCUFNyMjMxbVkNCisgICAgMTM5ODYxMjY0VSwJLy8gVkZNU1VCUFNyMjMxcg0KKyAgICAxMzk4NjEyNjRVLAkvLyBWRk1TVUJQU3IyMzFyWQ0KKyAgICAxMzk4NjEyNzdVLAkvLyBWRk5NQUREUERyMTMybQ0KKyAgICAxMzk4NjEyNzdVLAkvLyBWRk5NQUREUERyMTMybVkNCisgICAgMTM5ODYxMjc3VSwJLy8gVkZOTUFERFBEcjEzMnINCisgICAgMTM5ODYxMjc3VSwJLy8gVkZOTUFERFBEcjEzMnJZDQorICAgIDEzOTg2MTI5MVUsCS8vIFZGTk1BRERQRHIyMTNtDQorICAgIDEzOTg2MTI5MVUsCS8vIFZGTk1BRERQRHIyMTNtWQ0KKyAgICAxMzk4NjEyOTFVLAkvLyBWRk5NQUREUERyMjEzcg0KKyAgICAxMzk4NjEyOTFVLAkvLyBWRk5NQUREUERyMjEzclkNCisgICAgMTM5ODYxMzA1VSwJLy8gVkZOTUFERFBEcjIzMW0NCisgICAgMTM5ODYxMzA1VSwJLy8gVkZOTUFERFBEcjIzMW1ZDQorICAgIDEzOTg2MTMwNVUsCS8vIFZGTk1BRERQRHIyMzFyDQorICAgIDEzOTg2MTMwNVUsCS8vIFZGTk1BRERQRHIyMzFyWQ0KKyAgICAxMzk4NjEzMTlVLAkvLyBWRk5NQUREUFNyMTMybQ0KKyAgICAxMzk4NjEzMTlVLAkvLyBWRk5NQUREUFNyMTMybVkNCisgICAgMTM5ODYxMzE5VSwJLy8gVkZOTUFERFBTcjEzMnINCisgICAgMTM5ODYxMzE5VSwJLy8gVkZOTUFERFBTcjEzMnJZDQorICAgIDEzOTg2MTMzM1UsCS8vIFZGTk1BRERQU3IyMTNtDQorICAgIDEzOTg2MTMzM1UsCS8vIFZGTk1BRERQU3IyMTNtWQ0KKyAgICAxMzk4NjEzMzNVLAkvLyBWRk5NQUREUFNyMjEzcg0KKyAgICAxMzk4NjEzMzNVLAkvLyBWRk5NQUREUFNyMjEzclkNCisgICAgMTM5ODYxMzQ3VSwJLy8gVkZOTUFERFBTcjIzMW0NCisgICAgMTM5ODYxMzQ3VSwJLy8gVkZOTUFERFBTcjIzMW1ZDQorICAgIDEzOTg2MTM0N1UsCS8vIFZGTk1BRERQU3IyMzFyDQorICAgIDEzOTg2MTM0N1UsCS8vIFZGTk1BRERQU3IyMzFyWQ0KKyAgICAxMzk4NjEzNjFVLAkvLyBWRk5NU1VCUERyMTMybQ0KKyAgICAxMzk4NjEzNjFVLAkvLyBWRk5NU1VCUERyMTMybVkNCisgICAgMTM5ODYxMzYxVSwJLy8gVkZOTVNVQlBEcjEzMnINCisgICAgMTM5ODYxMzYxVSwJLy8gVkZOTVNVQlBEcjEzMnJZDQorICAgIDEzOTg2MTM3NVUsCS8vIFZGTk1TVUJQRHIyMTNtDQorICAgIDEzOTg2MTM3NVUsCS8vIFZGTk1TVUJQRHIyMTNtWQ0KKyAgICAxMzk4NjEzNzVVLAkvLyBWRk5NU1VCUERyMjEzcg0KKyAgICAxMzk4NjEzNzVVLAkvLyBWRk5NU1VCUERyMjEzclkNCisgICAgMTM5ODYxMzg5VSwJLy8gVkZOTVNVQlBEcjIzMW0NCisgICAgMTM5ODYxMzg5VSwJLy8gVkZOTVNVQlBEcjIzMW1ZDQorICAgIDEzOTg2MTM4OVUsCS8vIFZGTk1TVUJQRHIyMzFyDQorICAgIDEzOTg2MTM4OVUsCS8vIFZGTk1TVUJQRHIyMzFyWQ0KKyAgICAxMzk4NjE0MDNVLAkvLyBWRk5NU1VCUFNyMTMybQ0KKyAgICAxMzk4NjE0MDNVLAkvLyBWRk5NU1VCUFNyMTMybVkNCisgICAgMTM5ODYxNDAzVSwJLy8gVkZOTVNVQlBTcjEzMnINCisgICAgMTM5ODYxNDAzVSwJLy8gVkZOTVNVQlBTcjEzMnJZDQorICAgIDEzOTg2MTQxN1UsCS8vIFZGTk1TVUJQU3IyMTNtDQorICAgIDEzOTg2MTQxN1UsCS8vIFZGTk1TVUJQU3IyMTNtWQ0KKyAgICAxMzk4NjE0MTdVLAkvLyBWRk5NU1VCUFNyMjEzcg0KKyAgICAxMzk4NjE0MTdVLAkvLyBWRk5NU1VCUFNyMjEzclkNCisgICAgMTM5ODYxNDMxVSwJLy8gVkZOTVNVQlBTcjIzMW0NCisgICAgMTM5ODYxNDMxVSwJLy8gVkZOTVNVQlBTcjIzMW1ZDQorICAgIDEzOTg2MTQzMVUsCS8vIFZGTk1TVUJQU3IyMzFyDQorICAgIDEzOTg2MTQzMVUsCS8vIFZGTk1TVUJQU3IyMzFyWQ0KKyAgICAxMzk4NjA1NzBVLAkvLyBWRnNBTkROUERybQ0KKyAgICAxMzk4NjA1NzBVLAkvLyBWRnNBTkROUERycg0KKyAgICAxMzk4NjA1NzlVLAkvLyBWRnNBTkROUFNybQ0KKyAgICAxMzk4NjA1NzlVLAkvLyBWRnNBTkROUFNycg0KKyAgICAxMzk4NjA1ODhVLAkvLyBWRnNBTkRQRHJtDQorICAgIDEzOTg2MDU4OFUsCS8vIFZGc0FORFBEcnINCisgICAgMTM5ODYwNTk2VSwJLy8gVkZzQU5EUFNybQ0KKyAgICAxMzk4NjA1OTZVLAkvLyBWRnNBTkRQU3JyDQorICAgIDEzOTg2MTQ0NVUsCS8vIFZGc09SUERybQ0KKyAgICAxMzk4NjE0NDVVLAkvLyBWRnNPUlBEcnINCisgICAgMTM5ODYxNDUyVSwJLy8gVkZzT1JQU3JtDQorICAgIDEzOTg2MTQ1MlUsCS8vIFZGc09SUFNycg0KKyAgICAxMzk4NjE0NTlVLAkvLyBWRnNYT1JQRHJtDQorICAgIDEzOTg2MTQ1OVUsCS8vIFZGc1hPUlBEcnINCisgICAgMTM5ODYxNDY3VSwJLy8gVkZzWE9SUFNybQ0KKyAgICAxMzk4NjE0NjdVLAkvLyBWRnNYT1JQU3JyDQorICAgIDEzOTg2MTQ3NVUsCS8vIFZIQUREUERZcm0NCisgICAgMTM5ODYxNDc1VSwJLy8gVkhBRERQRFlycg0KKyAgICAxMzk4NjE0NzVVLAkvLyBWSEFERFBEcm0NCisgICAgMTM5ODYxNDc1VSwJLy8gVkhBRERQRHJyDQorICAgIDEzOTg2MTQ4NFUsCS8vIFZIQUREUFNZcm0NCisgICAgMTM5ODYxNDg0VSwJLy8gVkhBRERQU1lycg0KKyAgICAxMzk4NjE0ODRVLAkvLyBWSEFERFBTcm0NCisgICAgMTM5ODYxNDg0VSwJLy8gVkhBRERQU3JyDQorICAgIDEzOTg2MTQ5M1UsCS8vIFZIU1VCUERZcm0NCisgICAgMTM5ODYxNDkzVSwJLy8gVkhTVUJQRFlycg0KKyAgICAxMzk4NjE0OTNVLAkvLyBWSFNVQlBEcm0NCisgICAgMTM5ODYxNDkzVSwJLy8gVkhTVUJQRHJyDQorICAgIDEzOTg2MTUwMlUsCS8vIFZIU1VCUFNZcm0NCisgICAgMTM5ODYxNTAyVSwJLy8gVkhTVUJQU1lycg0KKyAgICAxMzk4NjE1MDJVLAkvLyBWSFNVQlBTcm0NCisgICAgMTM5ODYxNTAyVSwJLy8gVkhTVUJQU3JyDQorICAgIDEzOTg2MTUxMVUsCS8vIFZJTlNFUlRGMTI4cm0NCisgICAgMTM5ODYxNTExVSwJLy8gVklOU0VSVEYxMjhycg0KKyAgICAxMzk4NjE1MjRVLAkvLyBWSU5TRVJUUFNybQ0KKyAgICAxMzk4NjE1MjRVLAkvLyBWSU5TRVJUUFNycg0KKyAgICAxNDExNzIyNTVVLAkvLyBWTEREUVVZcm0NCisgICAgMTM5NzMwNDYzVSwJLy8gVkxERFFVcm0NCisgICAgNDAyNjYwOTAzVSwJLy8gVkxETVhDU1INCisgICAgMTM5ODYxNTUzVSwJLy8gVk1BU0tNT1ZEUVUNCisgICAgMTM5ODYxNTUzVSwJLy8gVk1BU0tNT1ZEUVU2NA0KKyAgICAyOTU5ODc1NjQ2VSwJLy8gVk1BU0tNT1ZQRFltcg0KKyAgICAxMzk4NjE1NjZVLAkvLyBWTUFTS01PVlBEWXJtDQorICAgIDI4MjU2NTc5MThVLAkvLyBWTUFTS01PVlBEbXINCisgICAgMTM5ODYxNTY2VSwJLy8gVk1BU0tNT1ZQRHJtDQorICAgIDI5NTk4NzU2NThVLAkvLyBWTUFTS01PVlBTWW1yDQorICAgIDEzOTg2MTU3OFUsCS8vIFZNQVNLTU9WUFNZcm0NCisgICAgMjgyNTY1NzkzMFUsCS8vIFZNQVNLTU9WUFNtcg0KKyAgICAxMzk4NjE1NzhVLAkvLyBWTUFTS01PVlBTcm0NCisgICAgMTM5ODYxNTkwVSwJLy8gVk1BWFBEWXJtDQorICAgIDEzOTg2MTU5MFUsCS8vIFZNQVhQRFlybV9JbnQNCisgICAgMTM5ODYxNTkwVSwJLy8gVk1BWFBEWXJyDQorICAgIDEzOTg2MTU5MFUsCS8vIFZNQVhQRFlycl9JbnQNCisgICAgMTM5ODYxNTkwVSwJLy8gVk1BWFBEcm0NCisgICAgMTM5ODYxNTkwVSwJLy8gVk1BWFBEcm1fSW50DQorICAgIDEzOTg2MTU5MFUsCS8vIFZNQVhQRHJyDQorICAgIDEzOTg2MTU5MFUsCS8vIFZNQVhQRHJyX0ludA0KKyAgICAxMzk4NjE1OThVLAkvLyBWTUFYUFNZcm0NCisgICAgMTM5ODYxNTk4VSwJLy8gVk1BWFBTWXJtX0ludA0KKyAgICAxMzk4NjE1OThVLAkvLyBWTUFYUFNZcnINCisgICAgMTM5ODYxNTk4VSwJLy8gVk1BWFBTWXJyX0ludA0KKyAgICAxMzk4NjE1OThVLAkvLyBWTUFYUFNybQ0KKyAgICAxMzk4NjE1OThVLAkvLyBWTUFYUFNybV9JbnQNCisgICAgMTM5ODYxNTk4VSwJLy8gVk1BWFBTcnINCisgICAgMTM5ODYxNTk4VSwJLy8gVk1BWFBTcnJfSW50DQorICAgIDEzOTg2MTYwNlUsCS8vIFZNQVhTRHJtDQorICAgIDEzOTg2MTYwNlUsCS8vIFZNQVhTRHJtX0ludA0KKyAgICAxMzk4NjE2MDZVLAkvLyBWTUFYU0Rycg0KKyAgICAxMzk4NjE2MDZVLAkvLyBWTUFYU0Rycl9JbnQNCisgICAgMTM5ODYxNjE0VSwJLy8gVk1BWFNTcm0NCisgICAgMTM5ODYxNjE0VSwJLy8gVk1BWFNTcm1fSW50DQorICAgIDEzOTg2MTYxNFUsCS8vIFZNQVhTU3JyDQorICAgIDEzOTg2MTYxNFUsCS8vIFZNQVhTU3JyX0ludA0KKyAgICA3Nzk4VSwJLy8gVk1DQUxMDQorICAgIDUzNjg3ODcxN1UsCS8vIFZNQ0xFQVJtDQorICAgIDEzOTg2MTYzOFUsCS8vIFZNSU5QRFlybQ0KKyAgICAxMzk4NjE2MzhVLAkvLyBWTUlOUERZcm1fSW50DQorICAgIDEzOTg2MTYzOFUsCS8vIFZNSU5QRFlycg0KKyAgICAxMzk4NjE2MzhVLAkvLyBWTUlOUERZcnJfSW50DQorICAgIDEzOTg2MTYzOFUsCS8vIFZNSU5QRHJtDQorICAgIDEzOTg2MTYzOFUsCS8vIFZNSU5QRHJtX0ludA0KKyAgICAxMzk4NjE2MzhVLAkvLyBWTUlOUERycg0KKyAgICAxMzk4NjE2MzhVLAkvLyBWTUlOUERycl9JbnQNCisgICAgMTM5ODYxNjQ2VSwJLy8gVk1JTlBTWXJtDQorICAgIDEzOTg2MTY0NlUsCS8vIFZNSU5QU1lybV9JbnQNCisgICAgMTM5ODYxNjQ2VSwJLy8gVk1JTlBTWXJyDQorICAgIDEzOTg2MTY0NlUsCS8vIFZNSU5QU1lycl9JbnQNCisgICAgMTM5ODYxNjQ2VSwJLy8gVk1JTlBTcm0NCisgICAgMTM5ODYxNjQ2VSwJLy8gVk1JTlBTcm1fSW50DQorICAgIDEzOTg2MTY0NlUsCS8vIFZNSU5QU3JyDQorICAgIDEzOTg2MTY0NlUsCS8vIFZNSU5QU3JyX0ludA0KKyAgICAxMzk4NjE2NTRVLAkvLyBWTUlOU0RybQ0KKyAgICAxMzk4NjE2NTRVLAkvLyBWTUlOU0RybV9JbnQNCisgICAgMTM5ODYxNjU0VSwJLy8gVk1JTlNEcnINCisgICAgMTM5ODYxNjU0VSwJLy8gVk1JTlNEcnJfSW50DQorICAgIDEzOTg2MTY2MlUsCS8vIFZNSU5TU3JtDQorICAgIDEzOTg2MTY2MlUsCS8vIFZNSU5TU3JtX0ludA0KKyAgICAxMzk4NjE2NjJVLAkvLyBWTUlOU1Nycg0KKyAgICAxMzk4NjE2NjJVLAkvLyBWTUlOU1Nycl9JbnQNCisgICAgNzg0NlUsCS8vIFZNTEFVTkNIDQorICAgIDI5NTI3OTc4NzFVLAkvLyBWTU9WQVBEWW1yDQorICAgIDE0MTA0MTMyN1UsCS8vIFZNT1ZBUERZcm0NCisgICAgMTM5ODYxNjc5VSwJLy8gVk1PVkFQRFlycg0KKyAgICAyODE4NTgwMTQzVSwJLy8gVk1PVkFQRG1yDQorICAgIDE0MDUxNzAzOVUsCS8vIFZNT1ZBUERybQ0KKyAgICAxMzk4NjE2NzlVLAkvLyBWTU9WQVBEcnINCisgICAgMjk1Mjc5Nzg4MFUsCS8vIFZNT1ZBUFNZbXINCisgICAgMTQxMDQxMzM2VSwJLy8gVk1PVkFQU1lybQ0KKyAgICAxMzk4NjE2ODhVLAkvLyBWTU9WQVBTWXJyDQorICAgIDI4MTg1ODAxNTJVLAkvLyBWTU9WQVBTbXINCisgICAgMTQwNTE3MDQ4VSwJLy8gVk1PVkFQU3JtDQorICAgIDEzOTg2MTY4OFUsCS8vIFZNT1ZBUFNycg0KKyAgICAxNDEwNDEzNDVVLAkvLyBWTU9WRERVUFlybQ0KKyAgICAxMzk4NjE2OTdVLAkvLyBWTU9WRERVUFlycg0KKyAgICAxNDA2NDgxMjlVLAkvLyBWTU9WRERVUHJtDQorICAgIDEzOTg2MTY5N1UsCS8vIFZNT1ZERFVQcnINCisgICAgMTQwMTIzODUxVSwJLy8gVk1PVkRJMlBESXJtDQorICAgIDEzOTg2MTcwN1UsCS8vIFZNT1ZESTJQRElycg0KKyAgICAxNDAxMjM4NTFVLAkvLyBWTU9WREkyU1NybQ0KKyAgICAxMzk4NjE3MDdVLAkvLyBWTU9WREkyU1Nycg0KKyAgICAzMDg3MDE1NjM0VSwJLy8gVk1PVkRRQVltcg0KKyAgICAxNDExNzI0MzRVLAkvLyBWTU9WRFFBWXJtDQorICAgIDEzOTg2MTcxNFUsCS8vIFZNT1ZEUUFZcnINCisgICAgMTQ4MDU5NzIwMlUsCS8vIFZNT1ZEUUFtcg0KKyAgICAxMzk3MzA2NDJVLAkvLyBWTU9WRFFBcm0NCisgICAgMTM5ODYxNzE0VSwJLy8gVk1PVkRRQXJyDQorICAgIDMwODcwMTU2NDNVLAkvLyBWTU9WRFFVWW1yDQorICAgIDE0MTE3MjQ0M1UsCS8vIFZNT1ZEUVVZcm0NCisgICAgMTM5ODYxNzIzVSwJLy8gVk1PVkRRVVlycg0KKyAgICAxNDgwNTk3MjExVSwJLy8gVk1PVkRRVW1yDQorICAgIDE0ODA1OTcyMTFVLAkvLyBWTU9WRFFVbXJfSW50DQorICAgIDEzOTczMDY1MVUsCS8vIFZNT1ZEUVVybQ0KKyAgICAxMzk3MzA2NTFVLAkvLyBWTU9WRFFVcm1fSW50DQorICAgIDEzOTg2MTcyM1UsCS8vIFZNT1ZEUVVycg0KKyAgICAxMzk4NjE3MzJVLAkvLyBWTU9WSExQU3JyDQorICAgIDk0MzcyNjMxOFUsCS8vIFZNT1ZIUERtcg0KKyAgICAxMzk4NjE3NDJVLAkvLyBWTU9WSFBEcm0NCisgICAgOTQzNzI2MzI3VSwJLy8gVk1PVkhQU21yDQorICAgIDEzOTg2MTc1MVUsCS8vIFZNT1ZIUFNybQ0KKyAgICAxMzk4NjE3NjBVLAkvLyBWTU9WTEhQU3JyDQorICAgIDk0MzcyNjM0NlUsCS8vIFZNT1ZMUERtcg0KKyAgICAxMzk4NjE3NzBVLAkvLyBWTU9WTFBEcm0NCisgICAgOTQzNzI2MzU1VSwJLy8gVk1PVkxQU21yDQorICAgIDEzOTg2MTc3OVUsCS8vIFZNT1ZMUFNybQ0KKyAgICA1NDEwNzMxODBVLAkvLyBWTU9WTFExMjhtcg0KKyAgICAxMzk4NjE3OTVVLAkvLyBWTU9WTVNLUERZcjY0cg0KKyAgICAxMzk4NjE3OTVVLAkvLyBWTU9WTVNLUERZcnINCisgICAgMTM5ODYxNzk1VSwJLy8gVk1PVk1TS1BEcjY0cg0KKyAgICAxMzk4NjE3OTVVLAkvLyBWTU9WTVNLUERycg0KKyAgICAxMzk4NjE4MDZVLAkvLyBWTU9WTVNLUFNZcjY0cg0KKyAgICAxMzk4NjE4MDZVLAkvLyBWTU9WTVNLUFNZcnINCisgICAgMTM5ODYxODA2VSwJLy8gVk1PVk1TS1BTcjY0cg0KKyAgICAxMzk4NjE4MDZVLAkvLyBWTU9WTVNLUFNycg0KKyAgICAxMzk3MzA3NDVVLAkvLyBWTU9WTlREUUFybQ0KKyAgICAyOTUyNzk4MDIwVSwJLy8gVk1PVk5URFFZXzY0bXINCisgICAgMjk1Mjc5ODAyMFUsCS8vIFZNT1ZOVERRWW1yDQorICAgIDI4MTg1ODAyOTJVLAkvLyBWTU9WTlREUV82NG1yDQorICAgIDI4MTg1ODAyOTJVLAkvLyBWTU9WTlREUW1yDQorICAgIDI4MTg1ODAyOTJVLAkvLyBWTU9WTlREUW1yX0ludA0KKyAgICAyOTUyNzk4MDMwVSwJLy8gVk1PVk5UUERZbXINCisgICAgMjgxODU4MDMwMlUsCS8vIFZNT1ZOVFBEbXINCisgICAgMTQ4MDU5NzMyNlUsCS8vIFZNT1ZOVFBEbXJfSW50DQorICAgIDI5NTI3OTgwNDBVLAkvLyBWTU9WTlRQU1ltcg0KKyAgICAyODE4NTgwMzEyVSwJLy8gVk1PVk5UUFNtcg0KKyAgICAxNDgwNTk3MzM2VSwJLy8gVk1PVk5UUFNtcl9JbnQNCisgICAgNDA2ODU1MzcxVSwJLy8gVk1PVlBESTJESW1yDQorICAgIDEzOTg2MTcwN1UsCS8vIFZNT1ZQREkyRElycg0KKyAgICA1NDEwNzMxODBVLAkvLyBWTU9WUFFJMlFJbXINCisgICAgMTQwMjU1MDA0VSwJLy8gVk1PVlFJMlBRSXJtDQorICAgIDEzOTg2MTc4OFUsCS8vIFZNT1ZRZDY0cnINCisgICAgMTM5ODYxNzA3VSwJLy8gVk1PVlFkNjRycl9hbHQNCisgICAgMTM5ODYxNzg4VSwJLy8gVk1PVlFzNjRycg0KKyAgICAxMzk4NjE3ODhVLAkvLyBWTU9WUXhyeHINCisgICAgOTQzNzI2NDM0VSwJLy8gVk1PVlNEbXINCisgICAgMTQwNjQ4MjkwVSwJLy8gVk1PVlNEcm0NCisgICAgMTM5ODYxODU4VSwJLy8gVk1PVlNEcnINCisgICAgMTQxMDQxNTE0VSwJLy8gVk1PVlNIRFVQWXJtDQorICAgIDEzOTg2MTg2NlUsCS8vIFZNT1ZTSERVUFlycg0KKyAgICAxNDA1MTcyMjZVLAkvLyBWTU9WU0hEVVBybQ0KKyAgICAxMzk4NjE4NjZVLAkvLyBWTU9WU0hEVVBycg0KKyAgICAxNDEwNDE1MjVVLAkvLyBWTU9WU0xEVVBZcm0NCisgICAgMTM5ODYxODc3VSwJLy8gVk1PVlNMRFVQWXJyDQorICAgIDE0MDUxNzIzN1UsCS8vIFZNT1ZTTERVUHJtDQorICAgIDEzOTg2MTg3N1UsCS8vIFZNT1ZTTERVUHJyDQorICAgIDQwNjg1NTM3MVUsCS8vIFZNT1ZTUzJESW1yDQorICAgIDEzOTg2MTcwN1UsCS8vIFZNT1ZTUzJESXJyDQorICAgIDgwOTUwODczNlUsCS8vIFZNT1ZTU21yDQorICAgIDE0MDc3OTM5MlUsCS8vIFZNT1ZTU3JtDQorICAgIDEzOTg2MTg4OFUsCS8vIFZNT1ZTU3JyDQorICAgIDI5NTI3OTgwODhVLAkvLyBWTU9WVVBEWW1yDQorICAgIDE0MTA0MTU0NFUsCS8vIFZNT1ZVUERZcm0NCisgICAgMTM5ODYxODk2VSwJLy8gVk1PVlVQRFlycg0KKyAgICAyODE4NTgwMzYwVSwJLy8gVk1PVlVQRG1yDQorICAgIDI4MTg1ODAzNjBVLAkvLyBWTU9WVVBEbXJfSW50DQorICAgIDE0MDUxNzI1NlUsCS8vIFZNT1ZVUERybQ0KKyAgICAxNDA1MTcyNTZVLAkvLyBWTU9WVVBEcm1fSW50DQorICAgIDEzOTg2MTg5NlUsCS8vIFZNT1ZVUERycg0KKyAgICAyOTUyNzk4MDk3VSwJLy8gVk1PVlVQU1ltcg0KKyAgICAxNDEwNDE1NTNVLAkvLyBWTU9WVVBTWXJtDQorICAgIDEzOTg2MTkwNVUsCS8vIFZNT1ZVUFNZcnINCisgICAgMjgxODU4MDM2OVUsCS8vIFZNT1ZVUFNtcg0KKyAgICAyODE4NTgwMzY5VSwJLy8gVk1PVlVQU21yX0ludA0KKyAgICAxNDA1MTcyNjVVLAkvLyBWTU9WVVBTcm0NCisgICAgMTQwNTE3MjY1VSwJLy8gVk1PVlVQU3JtX0ludA0KKyAgICAxMzk4NjE5MDVVLAkvLyBWTU9WVVBTcnINCisgICAgMTQwMTIzODUxVSwJLy8gVk1PVlpESTJQRElybQ0KKyAgICAxMzk4NjE3MDdVLAkvLyBWTU9WWkRJMlBESXJyDQorICAgIDEzOTczMDcxNlUsCS8vIFZNT1ZaUFFJTG8yUFFJcm0NCisgICAgMTM5ODYxNzg4VSwJLy8gVk1PVlpQUUlMbzJQUUlycg0KKyAgICAxNDAyNTUwMDRVLAkvLyBWTU9WWlFJMlBRSXJtDQorICAgIDEzOTg2MTc4OFUsCS8vIFZNT1ZaUUkyUFFJcnINCisgICAgMTM5ODYxOTE0VSwJLy8gVk1QU0FEQldybWkNCisgICAgMTM5ODYxOTE0VSwJLy8gVk1QU0FEQldycmkNCisgICAgNTM2ODc5MDEyVSwJLy8gVk1QVFJMRG0NCisgICAgNTM2ODc5MDIxVSwJLy8gVk1QVFJTVG0NCisgICAgNDA2ODU1NjA2VSwJLy8gVk1SRUFEMzJybQ0KKyAgICAxMzk4NjE5NDJVLAkvLyBWTVJFQUQzMnJyDQorICAgIDU0MTA3MzMzNFUsCS8vIFZNUkVBRDY0cm0NCisgICAgMTM5ODYxOTQyVSwJLy8gVk1SRUFENjRycg0KKyAgICA4MTI2VSwJLy8gVk1SRVNVTUUNCisgICAgMTM5ODYxOTU5VSwJLy8gVk1VTFBEWXJtDQorICAgIDEzOTg2MTk1OVUsCS8vIFZNVUxQRFlycg0KKyAgICAxMzk4NjE5NTlVLAkvLyBWTVVMUERybQ0KKyAgICAxMzk4NjE5NTlVLAkvLyBWTVVMUERycg0KKyAgICAxMzk4NjE5NjdVLAkvLyBWTVVMUFNZcm0NCisgICAgMTM5ODYxOTY3VSwJLy8gVk1VTFBTWXJyDQorICAgIDEzOTg2MTk2N1UsCS8vIFZNVUxQU3JtDQorICAgIDEzOTg2MTk2N1UsCS8vIFZNVUxQU3JyDQorICAgIDEzOTg2MTk3NVUsCS8vIFZNVUxTRHJtDQorICAgIDEzOTg2MTk3NVUsCS8vIFZNVUxTRHJtX0ludA0KKyAgICAxMzk4NjE5NzVVLAkvLyBWTVVMU0Rycg0KKyAgICAxMzk4NjE5NzVVLAkvLyBWTVVMU0Rycl9JbnQNCisgICAgMTM5ODYxOTgzVSwJLy8gVk1VTFNTcm0NCisgICAgMTM5ODYxOTgzVSwJLy8gVk1VTFNTcm1fSW50DQorICAgIDEzOTg2MTk4M1UsCS8vIFZNVUxTU3JyDQorICAgIDEzOTg2MTk4M1UsCS8vIFZNVUxTU3JyX0ludA0KKyAgICAxNDAxMjQxMzVVLAkvLyBWTVdSSVRFMzJybQ0KKyAgICAxMzk4NjE5OTFVLAkvLyBWTVdSSVRFMzJycg0KKyAgICAxNDAyNTUyMDdVLAkvLyBWTVdSSVRFNjRybQ0KKyAgICAxMzk4NjE5OTFVLAkvLyBWTVdSSVRFNjRycg0KKyAgICA4MTc2VSwJLy8gVk1YT0ZGDQorICAgIDgxODNVLAkvLyBWTVhPTg0KKyAgICAxMzk4NjE0NDVVLAkvLyBWT1JQRFlybQ0KKyAgICAxMzk4NjE0NDVVLAkvLyBWT1JQRFlycg0KKyAgICAxMzk4NjE0NDVVLAkvLyBWT1JQRHJtDQorICAgIDEzOTg2MTQ0NVUsCS8vIFZPUlBEcnINCisgICAgMTM5ODYxNDUyVSwJLy8gVk9SUFNZcm0NCisgICAgMTM5ODYxNDUyVSwJLy8gVk9SUFNZcnINCisgICAgMTM5ODYxNDUyVSwJLy8gVk9SUFNybQ0KKyAgICAxMzk4NjE0NTJVLAkvLyBWT1JQU3JyDQorICAgIDEzOTczMDk0MlUsCS8vIFZQQUJTQnJtMTI4DQorICAgIDE0MDI1NTIzMFUsCS8vIFZQQUJTQnJtNjQNCisgICAgMTM5ODYyMDE0VSwJLy8gVlBBQlNCcnIxMjgNCisgICAgMTM5ODYyMDE0VSwJLy8gVlBBQlNCcnI2NA0KKyAgICAxMzk3MzA5NTBVLAkvLyBWUEFCU0RybTEyOA0KKyAgICAxNDAyNTUyMzhVLAkvLyBWUEFCU0RybTY0DQorICAgIDEzOTg2MjAyMlUsCS8vIFZQQUJTRHJyMTI4DQorICAgIDEzOTg2MjAyMlUsCS8vIFZQQUJTRHJyNjQNCisgICAgMTM5NzMwOTU4VSwJLy8gVlBBQlNXcm0xMjgNCisgICAgMTQwMjU1MjQ2VSwJLy8gVlBBQlNXcm02NA0KKyAgICAxMzk4NjIwMzBVLAkvLyBWUEFCU1dycjEyOA0KKyAgICAxMzk4NjIwMzBVLAkvLyBWUEFCU1dycjY0DQorICAgIDEzOTg2MjAzOFUsCS8vIFZQQUNLU1NEV3JtDQorICAgIDEzOTg2MjAzOFUsCS8vIFZQQUNLU1NEV3JyDQorICAgIDEzOTg2MjA0OVUsCS8vIFZQQUNLU1NXQnJtDQorICAgIDEzOTg2MjA0OVUsCS8vIFZQQUNLU1NXQnJyDQorICAgIDEzOTg2MjA2MFUsCS8vIFZQQUNLVVNEV3JtDQorICAgIDEzOTg2MjA2MFUsCS8vIFZQQUNLVVNEV3JyDQorICAgIDEzOTg2MjA3MVUsCS8vIFZQQUNLVVNXQnJtDQorICAgIDEzOTg2MjA3MVUsCS8vIFZQQUNLVVNXQnJyDQorICAgIDEzOTg2MjA4MlUsCS8vIFZQQUREQnJtDQorICAgIDEzOTg2MjA4MlUsCS8vIFZQQUREQnJyDQorICAgIDEzOTg2MjA5MFUsCS8vIFZQQURERHJtDQorICAgIDEzOTg2MjA5MFUsCS8vIFZQQURERHJyDQorICAgIDEzOTg2MjA5OFUsCS8vIFZQQUREUXJtDQorICAgIDEzOTg2MjA5OFUsCS8vIFZQQUREUXJyDQorICAgIDEzOTg2MjEwNlUsCS8vIFZQQUREU0JybQ0KKyAgICAxMzk4NjIxMDZVLAkvLyBWUEFERFNCcnINCisgICAgMTM5ODYyMTE1VSwJLy8gVlBBRERTV3JtDQorICAgIDEzOTg2MjExNVUsCS8vIFZQQUREU1dycg0KKyAgICAxMzk4NjIxMjRVLAkvLyBWUEFERFVTQnJtDQorICAgIDEzOTg2MjEyNFUsCS8vIFZQQUREVVNCcnINCisgICAgMTM5ODYyMTM0VSwJLy8gVlBBRERVU1dybQ0KKyAgICAxMzk4NjIxMzRVLAkvLyBWUEFERFVTV3JyDQorICAgIDEzOTg2MjE0NFUsCS8vIFZQQUREV3JtDQorICAgIDEzOTg2MjE0NFUsCS8vIFZQQUREV3JyDQorICAgIDEzOTg2MjE1MlUsCS8vIFZQQUxJR05SMTI4cm0NCisgICAgMTM5ODYyMTUyVSwJLy8gVlBBTElHTlIxMjhycg0KKyAgICAxMzk4NjIxNTJVLAkvLyBWUEFMSUdOUjY0cm0NCisgICAgMTM5ODYyMTUyVSwJLy8gVlBBTElHTlI2NHJyDQorICAgIDEzOTg2MjE2MlUsCS8vIFZQQU5ETnJtDQorICAgIDEzOTg2MjE2MlUsCS8vIFZQQU5ETnJyDQorICAgIDEzOTg2MjE3MFUsCS8vIFZQQU5Ecm0NCisgICAgMTM5ODYyMTcwVSwJLy8gVlBBTkRycg0KKyAgICAxMzk4NjIxNzdVLAkvLyBWUEFWR0JybQ0KKyAgICAxMzk4NjIxNzdVLAkvLyBWUEFWR0Jycg0KKyAgICAxMzk4NjIxODVVLAkvLyBWUEFWR1dybQ0KKyAgICAxMzk4NjIxODVVLAkvLyBWUEFWR1dycg0KKyAgICAxMzk4NjIxOTNVLAkvLyBWUEJMRU5EVkJybQ0KKyAgICAxMzk4NjIxOTNVLAkvLyBWUEJMRU5EVkJycg0KKyAgICAxMzk4NjIyMDRVLAkvLyBWUEJMRU5EV3JtaQ0KKyAgICAxMzk4NjIyMDRVLAkvLyBWUEJMRU5EV3JyaQ0KKyAgICAxMzk4NjIyMTRVLAkvLyBWUENMTVVMSFFIUURRcm0NCisgICAgMTM5ODYyMjE0VSwJLy8gVlBDTE1VTEhRSFFEUXJyDQorICAgIDEzOTg2MjIyOVUsCS8vIFZQQ0xNVUxIUUxRRFFybQ0KKyAgICAxMzk4NjIyMjlVLAkvLyBWUENMTVVMSFFMUURRcnINCisgICAgMTM5ODYyMjQ0VSwJLy8gVlBDTE1VTExRSFFEUXJtDQorICAgIDEzOTg2MjI0NFUsCS8vIFZQQ0xNVUxMUUhRRFFycg0KKyAgICAxMzk4NjIyNTlVLAkvLyBWUENMTVVMTFFMUURRcm0NCisgICAgMTM5ODYyMjU5VSwJLy8gVlBDTE1VTExRTFFEUXJyDQorICAgIDEzOTg2MjI3NFUsCS8vIFZQQ0xNVUxRRFFybQ0KKyAgICAxMzk4NjIyNzRVLAkvLyBWUENMTVVMUURRcnINCisgICAgMTM5ODYyMjg2VSwJLy8gVlBDTVBFUUJybQ0KKyAgICAxMzk4NjIyODZVLAkvLyBWUENNUEVRQnJyDQorICAgIDEzOTg2MjI5NlUsCS8vIFZQQ01QRVFEcm0NCisgICAgMTM5ODYyMjk2VSwJLy8gVlBDTVBFUURycg0KKyAgICAxMzk4NjIzMDZVLAkvLyBWUENNUEVRUXJtDQorICAgIDEzOTg2MjMwNlUsCS8vIFZQQ01QRVFRcnINCisgICAgMTM5ODYyMzE2VSwJLy8gVlBDTVBFUVdybQ0KKyAgICAxMzk4NjIzMTZVLAkvLyBWUENNUEVRV3JyDQorICAgIDEzOTczMTI1NFUsCS8vIFZQQ01QRVNUUklBcm0NCisgICAgMTM5ODYyMzI2VSwJLy8gVlBDTVBFU1RSSUFycg0KKyAgICAxMzk3MzEyNTRVLAkvLyBWUENNUEVTVFJJQ3JtDQorICAgIDEzOTg2MjMyNlUsCS8vIFZQQ01QRVNUUklDcnINCisgICAgMTM5NzMxMjU0VSwJLy8gVlBDTVBFU1RSSU9ybQ0KKyAgICAxMzk4NjIzMjZVLAkvLyBWUENNUEVTVFJJT3JyDQorICAgIDEzOTczMTI1NFUsCS8vIFZQQ01QRVNUUklTcm0NCisgICAgMTM5ODYyMzI2VSwJLy8gVlBDTVBFU1RSSVNycg0KKyAgICAxMzk3MzEyNTRVLAkvLyBWUENNUEVTVFJJWnJtDQorICAgIDEzOTg2MjMyNlUsCS8vIFZQQ01QRVNUUklacnINCisgICAgMTM5NzMxMjU0VSwJLy8gVlBDTVBFU1RSSXJtDQorICAgIDEzOTg2MjMyNlUsCS8vIFZQQ01QRVNUUklycg0KKyAgICA4NTE0VSwJLy8gVlBDTVBFU1RSTTEyOE1FTQ0KKyAgICA4NTM4VSwJLy8gVlBDTVBFU1RSTTEyOFJFRw0KKyAgICAxMzk3MzEzMTRVLAkvLyBWUENNUEVTVFJNMTI4cm0NCisgICAgMTM5ODYyMzg2VSwJLy8gVlBDTVBFU1RSTTEyOHJyDQorICAgIDEzOTg2MjM5OFUsCS8vIFZQQ01QR1RCcm0NCisgICAgMTM5ODYyMzk4VSwJLy8gVlBDTVBHVEJycg0KKyAgICAxMzk4NjI0MDhVLAkvLyBWUENNUEdURHJtDQorICAgIDEzOTg2MjQwOFUsCS8vIFZQQ01QR1REcnINCisgICAgMTM5ODYyNDE4VSwJLy8gVlBDTVBHVFFybQ0KKyAgICAxMzk4NjI0MThVLAkvLyBWUENNUEdUUXJyDQorICAgIDEzOTg2MjQyOFUsCS8vIFZQQ01QR1RXcm0NCisgICAgMTM5ODYyNDI4VSwJLy8gVlBDTVBHVFdycg0KKyAgICAxMzk3MzEzNjZVLAkvLyBWUENNUElTVFJJQXJtDQorICAgIDEzOTg2MjQzOFUsCS8vIFZQQ01QSVNUUklBcnINCisgICAgMTM5NzMxMzY2VSwJLy8gVlBDTVBJU1RSSUNybQ0KKyAgICAxMzk4NjI0MzhVLAkvLyBWUENNUElTVFJJQ3JyDQorICAgIDEzOTczMTM2NlUsCS8vIFZQQ01QSVNUUklPcm0NCisgICAgMTM5ODYyNDM4VSwJLy8gVlBDTVBJU1RSSU9ycg0KKyAgICAxMzk3MzEzNjZVLAkvLyBWUENNUElTVFJJU3JtDQorICAgIDEzOTg2MjQzOFUsCS8vIFZQQ01QSVNUUklTcnINCisgICAgMTM5NzMxMzY2VSwJLy8gVlBDTVBJU1RSSVpybQ0KKyAgICAxMzk4NjI0MzhVLAkvLyBWUENNUElTVFJJWnJyDQorICAgIDEzOTczMTM2NlUsCS8vIFZQQ01QSVNUUklybQ0KKyAgICAxMzk4NjI0MzhVLAkvLyBWUENNUElTVFJJcnINCisgICAgODYyNlUsCS8vIFZQQ01QSVNUUk0xMjhNRU0NCisgICAgODY1MFUsCS8vIFZQQ01QSVNUUk0xMjhSRUcNCisgICAgMTM5NzMxNDI2VSwJLy8gVlBDTVBJU1RSTTEyOHJtDQorICAgIDEzOTg2MjQ5OFUsCS8vIFZQQ01QSVNUUk0xMjhycg0KKyAgICAxMzk4NjI1MTBVLAkvLyBWUEVSTTJGMTI4cm0NCisgICAgMTM5ODYyNTEwVSwJLy8gVlBFUk0yRjEyOHJyDQorICAgIDE0MTA0MjE3MFUsCS8vIFZQRVJNSUxQRFltaQ0KKyAgICAxMzk4NjI1MjJVLAkvLyBWUEVSTUlMUERZcmkNCisgICAgMTM5ODYyNTIyVSwJLy8gVlBFUk1JTFBEWXJtDQorICAgIDEzOTg2MjUyMlUsCS8vIFZQRVJNSUxQRFlycg0KKyAgICAxNDA1MTc4ODJVLAkvLyBWUEVSTUlMUERtaQ0KKyAgICAxMzk4NjI1MjJVLAkvLyBWUEVSTUlMUERyaQ0KKyAgICAxMzk4NjI1MjJVLAkvLyBWUEVSTUlMUERybQ0KKyAgICAxMzk4NjI1MjJVLAkvLyBWUEVSTUlMUERycg0KKyAgICAxNDEwNDIxODFVLAkvLyBWUEVSTUlMUFNZbWkNCisgICAgMTM5ODYyNTMzVSwJLy8gVlBFUk1JTFBTWXJpDQorICAgIDEzOTg2MjUzM1UsCS8vIFZQRVJNSUxQU1lybQ0KKyAgICAxMzk4NjI1MzNVLAkvLyBWUEVSTUlMUFNZcnINCisgICAgMTQwNTE3ODkzVSwJLy8gVlBFUk1JTFBTbWkNCisgICAgMTM5ODYyNTMzVSwJLy8gVlBFUk1JTFBTcmkNCisgICAgMTM5ODYyNTMzVSwJLy8gVlBFUk1JTFBTcm0NCisgICAgMTM5ODYyNTMzVSwJLy8gVlBFUk1JTFBTcnINCisgICAgNjc1MjkxNjY0VSwJLy8gVlBFWFRSQm1yDQorICAgIDEzOTg2MjU0NFUsCS8vIFZQRVhUUkJycg0KKyAgICAxMzk4NjI1NDRVLAkvLyBWUEVYVFJCcnI2NA0KKyAgICA0MDY4NTYyMTdVLAkvLyBWUEVYVFJEbXINCisgICAgMTM5ODYyNTUzVSwJLy8gVlBFWFRSRHJyDQorICAgIDU0MTA3Mzk1NFUsCS8vIFZQRVhUUlFtcg0KKyAgICAxMzk4NjI1NjJVLAkvLyBWUEVYVFJRcnINCisgICAgMjcyNjM4NTA3VSwJLy8gVlBFWFRSV21yDQorICAgIDEzOTg2MjU3MVUsCS8vIFZQRVhUUldyaQ0KKyAgICAxMzk4NjI1ODBVLAkvLyBWUEhBREREcm0xMjgNCisgICAgMTM5ODYyNTgwVSwJLy8gVlBIQURERHJtNjQNCisgICAgMTM5ODYyNTgwVSwJLy8gVlBIQURERHJyMTI4DQorICAgIDEzOTg2MjU4MFUsCS8vIFZQSEFERERycjY0DQorICAgIDEzOTg2MjU4OVUsCS8vIFZQSEFERFNXcm0xMjgNCisgICAgMTM5ODYyNTg5VSwJLy8gVlBIQUREU1dybTY0DQorICAgIDEzOTg2MjU4OVUsCS8vIFZQSEFERFNXcnIxMjgNCisgICAgMTM5ODYyNTg5VSwJLy8gVlBIQUREU1dycjY0DQorICAgIDEzOTg2MjU5OVUsCS8vIFZQSEFERFdybTEyOA0KKyAgICAxMzk4NjI1OTlVLAkvLyBWUEhBRERXcm02NA0KKyAgICAxMzk4NjI1OTlVLAkvLyBWUEhBRERXcnIxMjgNCisgICAgMTM5ODYyNTk5VSwJLy8gVlBIQUREV3JyNjQNCisgICAgMTM5NzMxNTM2VSwJLy8gVlBITUlOUE9TVVdybTEyOA0KKyAgICAxMzk4NjI2MDhVLAkvLyBWUEhNSU5QT1NVV3JyMTI4DQorICAgIDEzOTg2MjYyMVUsCS8vIFZQSFNVQkRybTEyOA0KKyAgICAxMzk4NjI2MjFVLAkvLyBWUEhTVUJEcm02NA0KKyAgICAxMzk4NjI2MjFVLAkvLyBWUEhTVUJEcnIxMjgNCisgICAgMTM5ODYyNjIxVSwJLy8gVlBIU1VCRHJyNjQNCisgICAgMTM5ODYyNjMwVSwJLy8gVlBIU1VCU1dybTEyOA0KKyAgICAxMzk4NjI2MzBVLAkvLyBWUEhTVUJTV3JtNjQNCisgICAgMTM5ODYyNjMwVSwJLy8gVlBIU1VCU1dycjEyOA0KKyAgICAxMzk4NjI2MzBVLAkvLyBWUEhTVUJTV3JyNjQNCisgICAgMTM5ODYyNjQwVSwJLy8gVlBIU1VCV3JtMTI4DQorICAgIDEzOTg2MjY0MFUsCS8vIFZQSFNVQldybTY0DQorICAgIDEzOTg2MjY0MFUsCS8vIFZQSFNVQldycjEyOA0KKyAgICAxMzk4NjI2NDBVLAkvLyBWUEhTVUJXcnI2NA0KKyAgICAxMzk4NjI2NDlVLAkvLyBWUElOU1JCcm0NCisgICAgMTM5ODYyNjQ5VSwJLy8gVlBJTlNSQnJyDQorICAgIDEzOTg2MjY1OFUsCS8vIFZQSU5TUkRybQ0KKyAgICAxMzk4NjI2NThVLAkvLyBWUElOU1JEcnINCisgICAgMTM5ODYyNjY3VSwJLy8gVlBJTlNSUXJtDQorICAgIDEzOTg2MjY2N1UsCS8vIFZQSU5TUlFycg0KKyAgICAxMzk4NjI2NzZVLAkvLyBWUElOU1JXcm1pDQorICAgIDEzOTg2MjY3NlUsCS8vIFZQSU5TUldycjY0aQ0KKyAgICAxMzk4NjI2NzZVLAkvLyBWUElOU1JXcnJpDQorICAgIDEzOTg2MjY4NVUsCS8vIFZQTUFERFVCU1dybTEyOA0KKyAgICAxMzk4NjI2ODVVLAkvLyBWUE1BRERVQlNXcm02NA0KKyAgICAxMzk4NjI2ODVVLAkvLyBWUE1BRERVQlNXcnIxMjgNCisgICAgMTM5ODYyNjg1VSwJLy8gVlBNQUREVUJTV3JyNjQNCisgICAgMTM5ODYyNjk3VSwJLy8gVlBNQUREV0RybQ0KKyAgICAxMzk4NjI2OTdVLAkvLyBWUE1BRERXRHJyDQorICAgIDEzOTg2MjcwN1UsCS8vIFZQTUFYU0JybQ0KKyAgICAxMzk4NjI3MDdVLAkvLyBWUE1BWFNCcnINCisgICAgMTM5ODYyNzE2VSwJLy8gVlBNQVhTRHJtDQorICAgIDEzOTg2MjcxNlUsCS8vIFZQTUFYU0Rycg0KKyAgICAxMzk4NjI3MjVVLAkvLyBWUE1BWFNXcm0NCisgICAgMTM5ODYyNzI1VSwJLy8gVlBNQVhTV3JyDQorICAgIDEzOTg2MjczNFUsCS8vIFZQTUFYVUJybQ0KKyAgICAxMzk4NjI3MzRVLAkvLyBWUE1BWFVCcnINCisgICAgMTM5ODYyNzQzVSwJLy8gVlBNQVhVRHJtDQorICAgIDEzOTg2Mjc0M1UsCS8vIFZQTUFYVURycg0KKyAgICAxMzk4NjI3NTJVLAkvLyBWUE1BWFVXcm0NCisgICAgMTM5ODYyNzUyVSwJLy8gVlBNQVhVV3JyDQorICAgIDEzOTg2Mjc2MVUsCS8vIFZQTUlOU0JybQ0KKyAgICAxMzk4NjI3NjFVLAkvLyBWUE1JTlNCcnINCisgICAgMTM5ODYyNzcwVSwJLy8gVlBNSU5TRHJtDQorICAgIDEzOTg2Mjc3MFUsCS8vIFZQTUlOU0Rycg0KKyAgICAxMzk4NjI3NzlVLAkvLyBWUE1JTlNXcm0NCisgICAgMTM5ODYyNzc5VSwJLy8gVlBNSU5TV3JyDQorICAgIDEzOTg2Mjc4OFUsCS8vIFZQTUlOVUJybQ0KKyAgICAxMzk4NjI3ODhVLAkvLyBWUE1JTlVCcnINCisgICAgMTM5ODYyNzk3VSwJLy8gVlBNSU5VRHJtDQorICAgIDEzOTg2Mjc5N1UsCS8vIFZQTUlOVURycg0KKyAgICAxMzk4NjI4MDZVLAkvLyBWUE1JTlVXcm0NCisgICAgMTM5ODYyODA2VSwJLy8gVlBNSU5VV3JyDQorICAgIDEzOTg2MjgxNVUsCS8vIFZQTU9WTVNLQnI2NHINCisgICAgMTM5ODYyODE1VSwJLy8gVlBNT1ZNU0tCcnINCisgICAgMTQwMTI0OTcwVSwJLy8gVlBNT1ZTWEJEcm0NCisgICAgMTM5ODYyODI2VSwJLy8gVlBNT1ZTWEJEcnINCisgICAgMTM5OTkzOTA5VSwJLy8gVlBNT1ZTWEJRcm0NCisgICAgMTM5ODYyODM3VSwJLy8gVlBNT1ZTWEJRcnINCisgICAgMTQwMjU2MDY0VSwJLy8gVlBNT1ZTWEJXcm0NCisgICAgMTM5ODYyODQ4VSwJLy8gVlBNT1ZTWEJXcnINCisgICAgMTQwMjU2MDc1VSwJLy8gVlBNT1ZTWERRcm0NCisgICAgMTM5ODYyODU5VSwJLy8gVlBNT1ZTWERRcnINCisgICAgMTQwMjU2MDg2VSwJLy8gVlBNT1ZTWFdEcm0NCisgICAgMTM5ODYyODcwVSwJLy8gVlBNT1ZTWFdEcnINCisgICAgMTQwMTI1MDI1VSwJLy8gVlBNT1ZTWFdRcm0NCisgICAgMTM5ODYyODgxVSwJLy8gVlBNT1ZTWFdRcnINCisgICAgMTQwMTI1MDM2VSwJLy8gVlBNT1ZaWEJEcm0NCisgICAgMTM5ODYyODkyVSwJLy8gVlBNT1ZaWEJEcnINCisgICAgMTM5OTkzOTc1VSwJLy8gVlBNT1ZaWEJRcm0NCisgICAgMTM5ODYyOTAzVSwJLy8gVlBNT1ZaWEJRcnINCisgICAgMTQwMjU2MTMwVSwJLy8gVlBNT1ZaWEJXcm0NCisgICAgMTM5ODYyOTE0VSwJLy8gVlBNT1ZaWEJXcnINCisgICAgMTQwMjU2MTQxVSwJLy8gVlBNT1ZaWERRcm0NCisgICAgMTM5ODYyOTI1VSwJLy8gVlBNT1ZaWERRcnINCisgICAgMTQwMjU2MTUyVSwJLy8gVlBNT1ZaWFdEcm0NCisgICAgMTM5ODYyOTM2VSwJLy8gVlBNT1ZaWFdEcnINCisgICAgMTQwMTI1MDkxVSwJLy8gVlBNT1ZaWFdRcm0NCisgICAgMTM5ODYyOTQ3VSwJLy8gVlBNT1ZaWFdRcnINCisgICAgMTM5ODYyOTU4VSwJLy8gVlBNVUxEUXJtDQorICAgIDEzOTg2Mjk1OFUsCS8vIFZQTVVMRFFycg0KKyAgICAxMzk4NjI5NjdVLAkvLyBWUE1VTEhSU1dybTEyOA0KKyAgICAxMzk4NjI5NjdVLAkvLyBWUE1VTEhSU1dybTY0DQorICAgIDEzOTg2Mjk2N1UsCS8vIFZQTVVMSFJTV3JyMTI4DQorICAgIDEzOTg2Mjk2N1UsCS8vIFZQTVVMSFJTV3JyNjQNCisgICAgMTM5ODYyOTc4VSwJLy8gVlBNVUxIVVdybQ0KKyAgICAxMzk4NjI5NzhVLAkvLyBWUE1VTEhVV3JyDQorICAgIDEzOTg2Mjk4OFUsCS8vIFZQTVVMSFdybQ0KKyAgICAxMzk4NjI5ODhVLAkvLyBWUE1VTEhXcnINCisgICAgMTM5ODYyOTk3VSwJLy8gVlBNVUxMRHJtDQorICAgIDEzOTg2Mjk5N1UsCS8vIFZQTVVMTERycg0KKyAgICAxMzk4NjMwMDZVLAkvLyBWUE1VTExXcm0NCisgICAgMTM5ODYzMDA2VSwJLy8gVlBNVUxMV3JyDQorICAgIDEzOTg2MzAxNVUsCS8vIFZQTVVMVURRcm0NCisgICAgMTM5ODYzMDE1VSwJLy8gVlBNVUxVRFFycg0KKyAgICAxMzk4NjMwMjVVLAkvLyBWUE9Scm0NCisgICAgMTM5ODYzMDI1VSwJLy8gVlBPUnJyDQorICAgIDEzOTg2MzAzMVUsCS8vIFZQU0FEQldybQ0KKyAgICAxMzk4NjMwMzFVLAkvLyBWUFNBREJXcnINCisgICAgMTM5ODYzMDQwVSwJLy8gVlBTSFVGQnJtMTI4DQorICAgIDEzOTg2MzA0MFUsCS8vIFZQU0hVRkJybTY0DQorICAgIDEzOTg2MzA0MFUsCS8vIFZQU0hVRkJycjEyOA0KKyAgICAxMzk4NjMwNDBVLAkvLyBWUFNIVUZCcnI2NA0KKyAgICAxMzk3MzE5NzdVLAkvLyBWUFNIVUZEbWkNCisgICAgMTM5ODYzMDQ5VSwJLy8gVlBTSFVGRHJpDQorICAgIDEzOTczMTk4NlUsCS8vIFZQU0hVRkhXbWkNCisgICAgMTM5ODYzMDU4VSwJLy8gVlBTSFVGSFdyaQ0KKyAgICAxMzk3MzE5OTZVLAkvLyBWUFNIVUZMV21pDQorICAgIDEzOTg2MzA2OFUsCS8vIFZQU0hVRkxXcmkNCisgICAgMTM5ODYzMDc4VSwJLy8gVlBTSUdOQnJtMTI4DQorICAgIDEzOTg2MzA3OFUsCS8vIFZQU0lHTkJybTY0DQorICAgIDEzOTg2MzA3OFUsCS8vIFZQU0lHTkJycjEyOA0KKyAgICAxMzk4NjMwNzhVLAkvLyBWUFNJR05CcnI2NA0KKyAgICAxMzk4NjMwODdVLAkvLyBWUFNJR05Ecm0xMjgNCisgICAgMTM5ODYzMDg3VSwJLy8gVlBTSUdORHJtNjQNCisgICAgMTM5ODYzMDg3VSwJLy8gVlBTSUdORHJyMTI4DQorICAgIDEzOTg2MzA4N1UsCS8vIFZQU0lHTkRycjY0DQorICAgIDEzOTg2MzA5NlUsCS8vIFZQU0lHTldybTEyOA0KKyAgICAxMzk4NjMwOTZVLAkvLyBWUFNJR05Xcm02NA0KKyAgICAxMzk4NjMwOTZVLAkvLyBWUFNJR05XcnIxMjgNCisgICAgMTM5ODYzMDk2VSwJLy8gVlBTSUdOV3JyNjQNCisgICAgMTM5ODYzMTA1VSwJLy8gVlBTTExEUXJpDQorICAgIDEzOTg2MzExNFUsCS8vIFZQU0xMRHJpDQorICAgIDEzOTg2MzExNFUsCS8vIFZQU0xMRHJtDQorICAgIDEzOTg2MzExNFUsCS8vIFZQU0xMRHJyDQorICAgIDEzOTg2MzEyMlUsCS8vIFZQU0xMUXJpDQorICAgIDEzOTg2MzEyMlUsCS8vIFZQU0xMUXJtDQorICAgIDEzOTg2MzEyMlUsCS8vIFZQU0xMUXJyDQorICAgIDEzOTg2MzEzMFUsCS8vIFZQU0xMV3JpDQorICAgIDEzOTg2MzEzMFUsCS8vIFZQU0xMV3JtDQorICAgIDEzOTg2MzEzMFUsCS8vIFZQU0xMV3JyDQorICAgIDEzOTg2MzEzOFUsCS8vIFZQU1JBRHJpDQorICAgIDEzOTg2MzEzOFUsCS8vIFZQU1JBRHJtDQorICAgIDEzOTg2MzEzOFUsCS8vIFZQU1JBRHJyDQorICAgIDEzOTg2MzE0NlUsCS8vIFZQU1JBV3JpDQorICAgIDEzOTg2MzE0NlUsCS8vIFZQU1JBV3JtDQorICAgIDEzOTg2MzE0NlUsCS8vIFZQU1JBV3JyDQorICAgIDEzOTg2MzE1NFUsCS8vIFZQU1JMRFFyaQ0KKyAgICAxMzk4NjMxNjNVLAkvLyBWUFNSTERyaQ0KKyAgICAxMzk4NjMxNjNVLAkvLyBWUFNSTERybQ0KKyAgICAxMzk4NjMxNjNVLAkvLyBWUFNSTERycg0KKyAgICAxMzk4NjMxNzFVLAkvLyBWUFNSTFFyaQ0KKyAgICAxMzk4NjMxNzFVLAkvLyBWUFNSTFFybQ0KKyAgICAxMzk4NjMxNzFVLAkvLyBWUFNSTFFycg0KKyAgICAxMzk4NjMxNzlVLAkvLyBWUFNSTFdyaQ0KKyAgICAxMzk4NjMxNzlVLAkvLyBWUFNSTFdybQ0KKyAgICAxMzk4NjMxNzlVLAkvLyBWUFNSTFdycg0KKyAgICAxMzk4NjMxODdVLAkvLyBWUFNVQkJybQ0KKyAgICAxMzk4NjMxODdVLAkvLyBWUFNVQkJycg0KKyAgICAxMzk4NjMxOTVVLAkvLyBWUFNVQkRybQ0KKyAgICAxMzk4NjMxOTVVLAkvLyBWUFNVQkRycg0KKyAgICAxMzk4NjMyMDNVLAkvLyBWUFNVQlFybQ0KKyAgICAxMzk4NjMyMDNVLAkvLyBWUFNVQlFycg0KKyAgICAxMzk4NjMyMTFVLAkvLyBWUFNVQlNCcm0NCisgICAgMTM5ODYzMjExVSwJLy8gVlBTVUJTQnJyDQorICAgIDEzOTg2MzIyMFUsCS8vIFZQU1VCU1dybQ0KKyAgICAxMzk4NjMyMjBVLAkvLyBWUFNVQlNXcnINCisgICAgMTM5ODYzMjI5VSwJLy8gVlBTVUJVU0JybQ0KKyAgICAxMzk4NjMyMjlVLAkvLyBWUFNVQlVTQnJyDQorICAgIDEzOTg2MzIzOVUsCS8vIFZQU1VCVVNXcm0NCisgICAgMTM5ODYzMjM5VSwJLy8gVlBTVUJVU1dycg0KKyAgICAxMzk4NjMyNDlVLAkvLyBWUFNVQldybQ0KKyAgICAxMzk4NjMyNDlVLAkvLyBWUFNVQldycg0KKyAgICAxNDExNzM5NzdVLAkvLyBWUFRFU1RZcm0NCisgICAgMTM5ODYzMjU3VSwJLy8gVlBURVNUWXJyDQorICAgIDE0MDUxODYxN1UsCS8vIFZQVEVTVHJtDQorICAgIDEzOTg2MzI1N1UsCS8vIFZQVEVTVHJyDQorICAgIDEzOTg2MzI2NVUsCS8vIFZQVU5QQ0tIQldybQ0KKyAgICAxMzk4NjMyNjVVLAkvLyBWUFVOUENLSEJXcnINCisgICAgMTM5ODYzMjc3VSwJLy8gVlBVTlBDS0hEUXJtDQorICAgIDEzOTg2MzI3N1UsCS8vIFZQVU5QQ0tIRFFycg0KKyAgICAxMzk4NjMyODlVLAkvLyBWUFVOUENLSFFEUXJtDQorICAgIDEzOTg2MzI4OVUsCS8vIFZQVU5QQ0tIUURRcnINCisgICAgMTM5ODYzMzAyVSwJLy8gVlBVTlBDS0hXRHJtDQorICAgIDEzOTg2MzMwMlUsCS8vIFZQVU5QQ0tIV0Rycg0KKyAgICAxMzk4NjMzMTRVLAkvLyBWUFVOUENLTEJXcm0NCisgICAgMTM5ODYzMzE0VSwJLy8gVlBVTlBDS0xCV3JyDQorICAgIDEzOTg2MzMyNlUsCS8vIFZQVU5QQ0tMRFFybQ0KKyAgICAxMzk4NjMzMjZVLAkvLyBWUFVOUENLTERRcnINCisgICAgMTM5ODYzMzM4VSwJLy8gVlBVTlBDS0xRRFFybQ0KKyAgICAxMzk4NjMzMzhVLAkvLyBWUFVOUENLTFFEUXJyDQorICAgIDEzOTg2MzM1MVUsCS8vIFZQVU5QQ0tMV0RybQ0KKyAgICAxMzk4NjMzNTFVLAkvLyBWUFVOUENLTFdEcnINCisgICAgMTM5ODYzMzYzVSwJLy8gVlBYT1JybQ0KKyAgICAxMzk4NjMzNjNVLAkvLyBWUFhPUnJyDQorICAgIDE0MTA0MzAxOFUsCS8vIFZSQ1BQU1ltDQorICAgIDE0MTA0MzAxOFUsCS8vIFZSQ1BQU1ltX0ludA0KKyAgICAxMzk4NjMzNzBVLAkvLyBWUkNQUFNZcg0KKyAgICAxMzk4NjMzNzBVLAkvLyBWUkNQUFNZcl9JbnQNCisgICAgMTQwNTE4NzMwVSwJLy8gVlJDUFBTbQ0KKyAgICAxNDA1MTg3MzBVLAkvLyBWUkNQUFNtX0ludA0KKyAgICAxMzk4NjMzNzBVLAkvLyBWUkNQUFNyDQorICAgIDEzOTg2MzM3MFUsCS8vIFZSQ1BQU3JfSW50DQorICAgIDEzOTg2MzM3OFUsCS8vIFZSQ1BTU20NCisgICAgMTQxNDM2MjQyVSwJLy8gVlJDUFNTbV9JbnQNCisgICAgMTM5ODYzMzc4VSwJLy8gVlJDUFNTcg0KKyAgICAxNDE0MzYyNDJVLAkvLyBWUkNQU1NyX0ludA0KKyAgICAxNDA1MTg3NDZVLAkvLyBWUk9VTkRQRG0NCisgICAgMTQxMDQzMDM0VSwJLy8gVlJPVU5EUERtX0ludA0KKyAgICAxMzk4NjMzODZVLAkvLyBWUk9VTkRQRHINCisgICAgMTM5ODYzMzg2VSwJLy8gVlJPVU5EUERyX0ludA0KKyAgICAxNDA1MTg3NTZVLAkvLyBWUk9VTkRQU20NCisgICAgMTQxMDQzMDQ0VSwJLy8gVlJPVU5EUFNtX0ludA0KKyAgICAxMzk4NjMzOTZVLAkvLyBWUk9VTkRQU3INCisgICAgMTM5ODYzMzk2VSwJLy8gVlJPVU5EUFNyX0ludA0KKyAgICAxMzk4NjM0MDZVLAkvLyBWUk9VTkRTRG0NCisgICAgMTM5ODYzNDA2VSwJLy8gVlJPVU5EU0RtX0ludA0KKyAgICAxMzk4NjM0MDZVLAkvLyBWUk9VTkRTRHINCisgICAgMTM5ODYzNDA2VSwJLy8gVlJPVU5EU0RyX0ludA0KKyAgICAxMzk4NjM0MTZVLAkvLyBWUk9VTkRTU20NCisgICAgMTM5ODYzNDE2VSwJLy8gVlJPVU5EU1NtX0ludA0KKyAgICAxMzk4NjM0MTZVLAkvLyBWUk9VTkRTU3INCisgICAgMTM5ODYzNDE2VSwJLy8gVlJPVU5EU1NyX0ludA0KKyAgICAxNDEwNDMwMzRVLAkvLyBWUk9VTkRZUERtDQorICAgIDE0MTA0MzAzNFUsCS8vIFZST1VORFlQRG1fSW50DQorICAgIDEzOTg2MzM4NlUsCS8vIFZST1VORFlQRHINCisgICAgMTM5ODYzMzg2VSwJLy8gVlJPVU5EWVBEcl9JbnQNCisgICAgMTQxMDQzMDQ0VSwJLy8gVlJPVU5EWVBTbQ0KKyAgICAxNDEwNDMwNDRVLAkvLyBWUk9VTkRZUFNtX0ludA0KKyAgICAxMzk4NjMzOTZVLAkvLyBWUk9VTkRZUFNyDQorICAgIDEzOTg2MzM5NlUsCS8vIFZST1VORFlQU3JfSW50DQorICAgIDE0MTA0MzA3NFUsCS8vIFZSU1FSVFBTWW0NCisgICAgMTQxMDQzMDc0VSwJLy8gVlJTUVJUUFNZbV9JbnQNCisgICAgMTM5ODYzNDI2VSwJLy8gVlJTUVJUUFNZcg0KKyAgICAxMzk4NjM0MjZVLAkvLyBWUlNRUlRQU1lyX0ludA0KKyAgICAxNDA1MTg3ODZVLAkvLyBWUlNRUlRQU20NCisgICAgMTQwNTE4Nzg2VSwJLy8gVlJTUVJUUFNtX0ludA0KKyAgICAxMzk4NjM0MjZVLAkvLyBWUlNRUlRQU3INCisgICAgMTM5ODYzNDI2VSwJLy8gVlJTUVJUUFNyX0ludA0KKyAgICAxMzk4NjM0MzZVLAkvLyBWUlNRUlRTU20NCisgICAgMTQxNDM2MzAwVSwJLy8gVlJTUVJUU1NtX0ludA0KKyAgICAxMzk4NjM0MzZVLAkvLyBWUlNRUlRTU3INCisgICAgMTQxNDM2MzAwVSwJLy8gVlJTUVJUU1NyX0ludA0KKyAgICAxMzkyMDgwODZVLAkvLyBWU0hVRlBEWXJtaQ0KKyAgICAxMzg1NTI3MjZVLAkvLyBWU0hVRlBEWXJyaQ0KKyAgICAxMzkyMDgwODZVLAkvLyBWU0hVRlBEcm1pDQorICAgIDEzODU1MjcyNlUsCS8vIFZTSFVGUERycmkNCisgICAgMTM5ODYzNDU1VSwJLy8gVlNIVUZQU1lybWkNCisgICAgMTM5ODYzNDU1VSwJLy8gVlNIVUZQU1lycmkNCisgICAgMTM5ODYzNDU1VSwJLy8gVlNIVUZQU3JtaQ0KKyAgICAxMzk4NjM0NTVVLAkvLyBWU0hVRlBTcnJpDQorICAgIDE0MTA0MzExMlUsCS8vIFZTUVJUUERZbQ0KKyAgICAxNDEwNDMxMTJVLAkvLyBWU1FSVFBEWW1fSW50DQorICAgIDEzOTg2MzQ2NFUsCS8vIFZTUVJUUERZcg0KKyAgICAxMzk4NjM0NjRVLAkvLyBWU1FSVFBEWXJfSW50DQorICAgIDE0MDUxODgyNFUsCS8vIFZTUVJUUERtDQorICAgIDE0MDUxODgyNFUsCS8vIFZTUVJUUERtX0ludA0KKyAgICAxMzk4NjM0NjRVLAkvLyBWU1FSVFBEcg0KKyAgICAxMzk4NjM0NjRVLAkvLyBWU1FSVFBEcl9JbnQNCisgICAgMTQxMDQzMTIxVSwJLy8gVlNRUlRQU1ltDQorICAgIDE0MTA0MzEyMVUsCS8vIFZTUVJUUFNZbV9JbnQNCisgICAgMTM5ODYzNDczVSwJLy8gVlNRUlRQU1lyDQorICAgIDEzOTg2MzQ3M1UsCS8vIFZTUVJUUFNZcl9JbnQNCisgICAgMTQwNTE4ODMzVSwJLy8gVlNRUlRQU20NCisgICAgMTQwNTE4ODMzVSwJLy8gVlNRUlRQU21fSW50DQorICAgIDEzOTg2MzQ3M1UsCS8vIFZTUVJUUFNyDQorICAgIDEzOTg2MzQ3M1UsCS8vIFZTUVJUUFNyX0ludA0KKyAgICAxMzk4NjM0ODJVLAkvLyBWU1FSVFNEbQ0KKyAgICAxNDE0MzYzNDZVLAkvLyBWU1FSVFNEbV9JbnQNCisgICAgMTM5ODYzNDgyVSwJLy8gVlNRUlRTRHINCisgICAgMTQxNDM2MzQ2VSwJLy8gVlNRUlRTRHJfSW50DQorICAgIDEzOTg2MzQ5MVUsCS8vIFZTUVJUU1NtDQorICAgIDE0MTQzNjM1NVUsCS8vIFZTUVJUU1NtX0ludA0KKyAgICAxMzk4NjM0OTFVLAkvLyBWU1FSVFNTcg0KKyAgICAxNDE0MzYzNTVVLAkvLyBWU1FSVFNTcl9JbnQNCisgICAgNDAyNjYyODYwVSwJLy8gVlNUTVhDU1INCisgICAgMTM5ODYzNTEwVSwJLy8gVlNVQlBEWXJtDQorICAgIDEzOTg2MzUxMFUsCS8vIFZTVUJQRFlycg0KKyAgICAxMzk4NjM1MTBVLAkvLyBWU1VCUERybQ0KKyAgICAxMzk4NjM1MTBVLAkvLyBWU1VCUERycg0KKyAgICAxMzk4NjM1MThVLAkvLyBWU1VCUFNZcm0NCisgICAgMTM5ODYzNTE4VSwJLy8gVlNVQlBTWXJyDQorICAgIDEzOTg2MzUxOFUsCS8vIFZTVUJQU3JtDQorICAgIDEzOTg2MzUxOFUsCS8vIFZTVUJQU3JyDQorICAgIDEzOTg2MzUyNlUsCS8vIFZTVUJTRHJtDQorICAgIDEzOTg2MzUyNlUsCS8vIFZTVUJTRHJtX0ludA0KKyAgICAxMzk4NjM1MjZVLAkvLyBWU1VCU0Rycg0KKyAgICAxMzk4NjM1MjZVLAkvLyBWU1VCU0Rycl9JbnQNCisgICAgMTM5ODYzNTM0VSwJLy8gVlNVQlNTcm0NCisgICAgMTM5ODYzNTM0VSwJLy8gVlNVQlNTcm1fSW50DQorICAgIDEzOTg2MzUzNFUsCS8vIFZTVUJTU3JyDQorICAgIDEzOTg2MzUzNFUsCS8vIFZTVUJTU3JyX0ludA0KKyAgICAxNDEwNDMxOTBVLAkvLyBWVEVTVFBEWXJtDQorICAgIDEzOTg2MzU0MlUsCS8vIFZURVNUUERZcnINCisgICAgMTQwNTE4OTAyVSwJLy8gVlRFU1RQRHJtDQorICAgIDEzOTg2MzU0MlUsCS8vIFZURVNUUERycg0KKyAgICAxNDEwNDMxOTlVLAkvLyBWVEVTVFBTWXJtDQorICAgIDEzOTg2MzU1MVUsCS8vIFZURVNUUFNZcnINCisgICAgMTQwNTE4OTExVSwJLy8gVlRFU1RQU3JtDQorICAgIDEzOTg2MzU1MVUsCS8vIFZURVNUUFNycg0KKyAgICAxNDA2NDM2MTFVLAkvLyBWVUNPTUlTRHJtDQorICAgIDEzOTg1NzE3OVUsCS8vIFZVQ09NSVNEcnINCisgICAgMTQwNzc0NjkzVSwJLy8gVlVDT01JU1NybQ0KKyAgICAxMzk4NTcxODlVLAkvLyBWVUNPTUlTU3JyDQorICAgIDEzOTg2MzU2MFUsCS8vIFZVTlBDS0hQRFlybQ0KKyAgICAxMzk4NjM1NjBVLAkvLyBWVU5QQ0tIUERZcnINCisgICAgMTM5ODYzNTYwVSwJLy8gVlVOUENLSFBEcm0NCisgICAgMTM5ODYzNTYwVSwJLy8gVlVOUENLSFBEcnINCisgICAgMTM5ODYzNTcxVSwJLy8gVlVOUENLSFBTWXJtDQorICAgIDEzOTg2MzU3MVUsCS8vIFZVTlBDS0hQU1lycg0KKyAgICAxMzk4NjM1NzFVLAkvLyBWVU5QQ0tIUFNybQ0KKyAgICAxMzk4NjM1NzFVLAkvLyBWVU5QQ0tIUFNycg0KKyAgICAxMzk4NjM1ODJVLAkvLyBWVU5QQ0tMUERZcm0NCisgICAgMTM5ODYzNTgyVSwJLy8gVlVOUENLTFBEWXJyDQorICAgIDEzOTg2MzU4MlUsCS8vIFZVTlBDS0xQRHJtDQorICAgIDEzOTg2MzU4MlUsCS8vIFZVTlBDS0xQRHJyDQorICAgIDEzOTg2MzU5M1UsCS8vIFZVTlBDS0xQU1lybQ0KKyAgICAxMzk4NjM1OTNVLAkvLyBWVU5QQ0tMUFNZcnINCisgICAgMTM5ODYzNTkzVSwJLy8gVlVOUENLTFBTcm0NCisgICAgMTM5ODYzNTkzVSwJLy8gVlVOUENLTFBTcnINCisgICAgMTM5ODYxNDU5VSwJLy8gVlhPUlBEWXJtDQorICAgIDEzOTg2MTQ1OVUsCS8vIFZYT1JQRFlycg0KKyAgICAxMzk4NjE0NTlVLAkvLyBWWE9SUERybQ0KKyAgICAxMzk4NjE0NTlVLAkvLyBWWE9SUERycg0KKyAgICAxMzk4NjE0NjdVLAkvLyBWWE9SUFNZcm0NCisgICAgMTM5ODYxNDY3VSwJLy8gVlhPUlBTWXJyDQorICAgIDEzOTg2MTQ2N1UsCS8vIFZYT1JQU3JtDQorICAgIDEzOTg2MTQ2N1UsCS8vIFZYT1JQU3JyDQorICAgIDk3ODBVLAkvLyBWWkVST0FMTA0KKyAgICA5Nzg5VSwJLy8gVlpFUk9VUFBFUg0KKyAgICAwVSwJLy8gVl9TRVQwUEQNCisgICAgMFUsCS8vIFZfU0VUMFBJDQorICAgIDBVLAkvLyBWX1NFVDBQUw0KKyAgICAwVSwJLy8gVl9TRVRBTExPTkVTDQorICAgIDk4MDBVLAkvLyBXQUlUDQorICAgIDk4MDVVLAkvLyBXQklOVkQNCisgICAgNTM2ODcyMDIyVSwJLy8gV0lOQ0FMTDY0bQ0KKyAgICAxMDczNzQyOTM0VSwJLy8gV0lOQ0FMTDY0cGNyZWwzMg0KKyAgICAxMzQyMTg4MzhVLAkvLyBXSU5DQUxMNjRyDQorICAgIDk4MTJVLAkvLyBXUk1TUg0KKyAgICAyNzI2Mzk1NzhVLAkvLyBYQUREMTZybQ0KKyAgICAxMzk4NjM2NDJVLAkvLyBYQUREMTZycg0KKyAgICA0MDY4NTczMDZVLAkvLyBYQUREMzJybQ0KKyAgICAxMzk4NjM2NDJVLAkvLyBYQUREMzJycg0KKyAgICA1NDEwNzUwMzRVLAkvLyBYQURENjRybQ0KKyAgICAxMzk4NjM2NDJVLAkvLyBYQURENjRycg0KKyAgICA2NzUyOTI3NjJVLAkvLyBYQUREOHJtDQorICAgIDEzOTg2MzY0MlUsCS8vIFhBREQ4cnINCisgICAgMTM0MjI3NTUyVSwJLy8gWENIRzE2YXINCisgICAgMjI4MTcxMTIxMVUsCS8vIFhDSEcxNnJtDQorICAgIDMyMjEyMzUzMDdVLAkvLyBYQ0hHMTZycg0KKyAgICAxMzQyMjc1NjlVLAkvLyBYQ0hHMzJhcg0KKyAgICAyNDE1OTI4OTM5VSwJLy8gWENIRzMycm0NCisgICAgMzIyMTIzNTMwN1UsCS8vIFhDSEczMnJyDQorICAgIDEzNDIyNzU4MVUsCS8vIFhDSEc2NGFyDQorICAgIDMzNTU0NTMwMzVVLAkvLyBYQ0hHNjRybQ0KKyAgICAzMjIxMjM1MzA3VSwJLy8gWENIRzY0cnINCisgICAgMjU1MDE0NjY2N1UsCS8vIFhDSEc4cm0NCisgICAgMzIyMTIzNTMwN1UsCS8vIFhDSEc4cnINCisgICAgMTM0MjI3NTkzVSwJLy8gWENIX0YNCisgICAgOTg3MVUsCS8vIFhMQVQNCisgICAgMTM0MjI3NjA1VSwJLy8gWE9SMTZpMTYNCisgICAgMjcyNjM5NjQ3VSwJLy8gWE9SMTZtaQ0KKyAgICAyNzI2Mzk2NDdVLAkvLyBYT1IxNm1pOA0KKyAgICAyNzI2Mzk2NDdVLAkvLyBYT1IxNm1yDQorICAgIDEzODU1Mjk5MVUsCS8vIFhPUjE2cmkNCisgICAgMTM4NTUyOTkxVSwJLy8gWE9SMTZyaTgNCisgICAgMTM4Njg0MDYzVSwJLy8gWE9SMTZybQ0KKyAgICAxMzg1NTI5OTFVLAkvLyBYT1IxNnJyDQorICAgIDEzODU1Mjk5MVUsCS8vIFhPUjE2cnJfUkVWDQorICAgIDEzNDIyNzYyMFUsCS8vIFhPUjMyaTMyDQorICAgIDQwNjg1NzM3NVUsCS8vIFhPUjMybWkNCisgICAgNDA2ODU3Mzc1VSwJLy8gWE9SMzJtaTgNCisgICAgNDA2ODU3Mzc1VSwJLy8gWE9SMzJtcg0KKyAgICAxMzg1NTI5OTFVLAkvLyBYT1IzMnJpDQorICAgIDEzODU1Mjk5MVUsCS8vIFhPUjMycmk4DQorICAgIDEzODgxNTEzNVUsCS8vIFhPUjMycm0NCisgICAgMTM4NTUyOTkxVSwJLy8gWE9SMzJycg0KKyAgICAxMzg1NTI5OTFVLAkvLyBYT1IzMnJyX1JFVg0KKyAgICAxMzQyMjc2MzFVLAkvLyBYT1I2NGkzMg0KKyAgICA1NDEwNzUxMDNVLAkvLyBYT1I2NG1pMzINCisgICAgNTQxMDc1MTAzVSwJLy8gWE9SNjRtaTgNCisgICAgNTQxMDc1MTAzVSwJLy8gWE9SNjRtcg0KKyAgICAxMzg1NTI5OTFVLAkvLyBYT1I2NHJpMzINCisgICAgMTM4NTUyOTkxVSwJLy8gWE9SNjRyaTgNCisgICAgMTM4OTQ2MjA3VSwJLy8gWE9SNjRybQ0KKyAgICAxMzg1NTI5OTFVLAkvLyBYT1I2NHJyDQorICAgIDEzODU1Mjk5MVUsCS8vIFhPUjY0cnJfUkVWDQorICAgIDEzNDIyNzY0MlUsCS8vIFhPUjhpOA0KKyAgICA2NzUyOTI4MzFVLAkvLyBYT1I4bWkNCisgICAgNjc1MjkyODMxVSwJLy8gWE9SOG1yDQorICAgIDEzODU1Mjk5MVUsCS8vIFhPUjhyaQ0KKyAgICAxMzkwNzcyNzlVLAkvLyBYT1I4cm0NCisgICAgMTM4NTUyOTkxVSwJLy8gWE9SOHJyDQorICAgIDEzODU1Mjk5MVUsCS8vIFhPUjhycl9SRVYNCisgICAgMTM5MjAxMjQ1VSwJLy8gWE9SUERybQ0KKyAgICAxMzg1NDU4ODVVLAkvLyBYT1JQRHJyDQorICAgIDEzOTIwMTI1MlUsCS8vIFhPUlBTcm0NCisgICAgMTM4NTQ1ODkyVSwJLy8gWE9SUFNycg0KKyAgICAwVQ0KKyAgfTsNCisNCisgIGNvbnN0IGNoYXIgKkFzbVN0cnMgPSANCisgICAgIkRCR19WQUxVRVwwMDBmYWJzXDAwMGFkY1x0JWF4LCBcMDAwYWRjXHRcMDAwYWRjXHQlZWF4LCBcMDAwYWRjXHQlcmF4LCBcMDAwIg0KKyAgICAiYWRjXHQlYWwsIFwwMDBhZGRcdCVheCwgXDAwMGFkZFx0XDAwMGFkZFx0JWVheCwgXDAwMGFkZFx0JXJheCwgXDAwMGFkZFx0Ig0KKyAgICAiJWFsLCBcMDAwYWRkcGRcdFwwMDBhZGRwc1x0XDAwMGFkZHNkXHRcMDAwYWRkc3NcdFwwMDBhZGRzdWJwZFx0XDAwMGFkZHMiDQorICAgICJ1YnBzXHRcMDAwZmFkZFx0XDAwMGZpYWRkXHRcMDAwZmFkZHBcdFwwMDAjQURKQ0FMTFNUQUNLRE9XTlwwMDAjQURKQ0FMTCINCisgICAgIlNUQUNLVVBcMDAwYWVzZGVjbGFzdFx0XDAwMGFlc2RlY1x0XDAwMGFlc2VuY2xhc3RcdFwwMDBhZXNlbmNcdFwwMDBhZXNpIg0KKyAgICAibWNcdFwwMDBhZXNrZXlnZW5hc3Npc3RcdFwwMDBhbmRcdCVheCwgXDAwMGFuZFx0XDAwMGFuZFx0JWVheCwgXDAwMGFuZFx0Ig0KKyAgICAiJXJheCwgXDAwMGFuZFx0JWFsLCBcMDAwYW5kbnBkXHRcMDAwYW5kbnBzXHRcMDAwYW5kcGRcdFwwMDBhbmRwc1x0XDAwMCMiDQorICAgICJBVE9NQURENjQzMiBQU0VVRE8hXDAwMCNBVE9NQU5EMTYgUFNFVURPIVwwMDAjQVRPTUFORDMyIFBTRVVETyFcMDAwI0FUTyINCisgICAgIk1BTkQ2NCBQU0VVRE8hXDAwMCNBVE9NQU5ENjQzMiBQU0VVRE8hXDAwMCNBVE9NQU5EOCBQU0VVRE8hXDAwMCNBVE9NTUFYIg0KKyAgICAiMTYgUFNFVURPIVwwMDAjQVRPTU1BWDMyIFBTRVVETyFcMDAwI0FUT01NQVg2NCBQU0VVRE8hXDAwMCNBVE9NTUlOMTYgUFMiDQorICAgICJFVURPIVwwMDAjQVRPTU1JTjMyIFBTRVVETyFcMDAwI0FUT01NSU42NCBQU0VVRE8hXDAwMCNBVE9NTkFORDE2IFBTRVVETyINCisgICAgIiFcMDAwI0FUT01OQU5EMzIgUFNFVURPIVwwMDAjQVRPTU5BTkQ2NCBQU0VVRE8hXDAwMCNBVE9NTkFORDY0MzIgUFNFVURPIg0KKyAgICAiIVwwMDAjQVRPTU5BTkQ4IFBTRVVETyFcMDAwI0FUT01PUjE2IFBTRVVETyFcMDAwI0FUT01PUjMyIFBTRVVETyFcMDAwI0EiDQorICAgICJUT01PUjY0IFBTRVVETyFcMDAwI0FUT01PUjY0MzIgUFNFVURPIVwwMDAjQVRPTU9SOCBQU0VVRE8hXDAwMCNBVE9NU1VCNiINCisgICAgIjQzMiBQU0VVRE8hXDAwMCNBVE9NU1dBUDY0MzIgUFNFVURPIVwwMDAjQVRPTVVNQVgxNiBQU0VVRE8hXDAwMCNBVE9NVU1BIg0KKyAgICAiWDMyIFBTRVVETyFcMDAwI0FUT01VTUFYNjQgUFNFVURPIVwwMDAjQVRPTVVNSU4xNiBQU0VVRE8hXDAwMCNBVE9NVU1JTjMiDQorICAgICIyIFBTRVVETyFcMDAwI0FUT01VTUlONjQgUFNFVURPIVwwMDAjQVRPTVhPUjE2IFBTRVVETyFcMDAwI0FUT01YT1IzMiBQUyINCisgICAgIkVVRE8hXDAwMCNBVE9NWE9SNjQgUFNFVURPIVwwMDAjQVRPTVhPUjY0MzIgUFNFVURPIVwwMDAjQVRPTVhPUjggUFNFVURPIg0KKyAgICAiIVwwMDBibGVuZHBkXHRcMDAwYmxlbmRwc1x0XDAwMGJsZW5kdnBkXHRcMDAwYmxlbmR2cHNcdFwwMDBic2ZcdFwwMDBic3IiDQorICAgICJcdFwwMDBic3dhcFx0XDAwMGJ0XHRcMDAwYnRjXHRcMDAwYnRyXHRcMDAwYnRzXHRcMDAwY2FsbFx0XDAwMGNhbGx3XHRcMDAwIg0KKyAgICAiY2J3XDAwMGNkcVwwMDBjZHFlXDAwMGZjaHNcMDAwY2xjXDAwMGNsZFwwMDBjbGZsdXNoXHRcMDAwY2xpXDAwMGNsdHNcMDAwIg0KKyAgICAiY21jXDAwMGNtb3ZhXHRcMDAwY21vdmFlXHRcMDAwY21vdmJcdFwwMDBjbW92YmVcdFwwMDBmY21vdmJlXHQlU1QoMCksIFwwMDAiDQorICAgICJmY21vdmJcdCVTVCgwKSwgXDAwMGNtb3ZlXHRcMDAwZmNtb3ZlXHQlU1QoMCksIFwwMDBjbW92Z1x0XDAwMGNtb3ZnZVx0XDAwMCINCisgICAgImNtb3ZsXHRcMDAwY21vdmxlXHRcMDAwZmNtb3ZuYmVcdCVTVCgwKSwgXDAwMGZjbW92bmJcdCVTVCgwKSwgXDAwMGNtb3ZuIg0KKyAgICAiZVx0XDAwMGZjbW92bmVcdCVTVCgwKSwgXDAwMGNtb3Zub1x0XDAwMGNtb3ZucFx0XDAwMGZjbW92bnVcdCVTVCgwKSwgXDAwMCINCisgICAgImNtb3Zuc1x0XDAwMGNtb3ZvXHRcMDAwY21vdnBcdFwwMDBmY21vdnVcdCAlU1QoMCksIFwwMDBjbW92c1x0XDAwMCNDTU9WIg0KKyAgICAiX0ZSMzIgUFNFVURPIVwwMDAjQ01PVl9GUjY0IFBTRVVETyFcMDAwI0NNT1ZfR1IxNiogUFNFVURPIVwwMDAjQ01PVl9HUjMiDQorICAgICIyKiBQU0VVRE8hXDAwMCNDTU9WX0dSOCBQU0VVRE8hXDAwMCNDTU9WX1JGUDMyIFBTRVVETyFcMDAwI0NNT1ZfUkZQNjQgUCINCisgICAgIlNFVURPIVwwMDAjQ01PVl9SRlA4MCBQU0VVRE8hXDAwMCNDTU9WX1YxSTY0IFBTRVVETyFcMDAwI0NNT1ZfVjJGNjQgUFNFIg0KKyAgICAiVURPIVwwMDAjQ01PVl9WMkk2NCBQU0VVRE8hXDAwMCNDTU9WX1Y0RjMyIFBTRVVETyFcMDAwY21wXHQlYXgsIFwwMDBjbXAiDQorICAgICJcdFwwMDBjbXBcdCVlYXgsIFwwMDBjbXBcdCVyYXgsIFwwMDBjbXBcdCVhbCwgXDAwMGNtcFwwMDBjbXBwZFx0XDAwMGNtcCINCisgICAgInBzXHRcMDAwY21wc1wwMDBjbXBzcVwwMDBjbXBzZFx0XDAwMGNtcHNzXHRcMDAwY21weGNoZzE2Ylx0XDAwMGNtcHhjaGdcdCINCisgICAgIlwwMDBjbXB4Y2hnOGJcdFwwMDBjb21pc2RcdFwwMDBjb21pc3NcdFwwMDBmY29tcFx0XDAwMGZjb21pcFx0JVNUKDApLCBcMDAwIg0KKyAgICAiZmNvbWlcdCVTVCgwKSwgXDAwMGZjb21cdFwwMDBmY29zXDAwMGNwdWlkXDAwMGNxb1wwMDBjcmMzMiBcdFwwMDBjc1wwMDAiDQorICAgICJjdnRkcTJwZFx0XDAwMGN2dGRxMnBzXHRcMDAwY3Z0cGQyZHFcdFwwMDBjdnRwZDJwc1x0XDAwMGN2dHBzMmRxXHRcMDAwYyINCisgICAgInZ0cHMycGRcdFwwMDBjdnRzZDJzaVwwMDBjdnRzZDJzc1x0XDAwMGN2dHNpMnNkXHRcMDAwY3Z0c2kyc3NcdFwwMDBjdnRzIg0KKyAgICAiczJzZFx0XDAwMGN2dHNzMnNpXHRcMDAwY3Z0dHBzMmRxXHRcMDAwY3Z0dHNkMnNpXHRcMDAwY3Z0dHNzMnNpXHRcMDAwY3ciDQorICAgICJkXDAwMGN3ZGVcMDAwZGVjXHRcMDAwZGl2XHRcMDAwZGl2cGRcdFwwMDBkaXZwc1x0XDAwMGZkaXZyXHRcMDAwZmlkaXZyXHQiDQorICAgICJcMDAwZmRpdnJwXHRcMDAwZGl2c2RcdFwwMDBkaXZzc1x0XDAwMGZkaXZcdFwwMDBmaWRpdlx0XDAwMGZkaXZwXHRcMDAwZCINCisgICAgInBwZFx0XDAwMGRwcHNcdFwwMDBkc1wwMDByZXRcdCNlaF9yZXR1cm4sIGFkZHI6IFwwMDBlbnRlclx0XDAwMGVzXDAwMGV4Ig0KKyAgICAidHJhY3Rwc1x0XDAwMGYyeG0xXDAwMGxjYWxsXHRcMDAwbGptcFx0XDAwMGZibGRcdFwwMDBmYnN0cFx0XDAwMGZjb21wcFwwMDAiDQorICAgICJmZGVjc3RwXDAwMGZmcmVlXHRcMDAwZmljb21cdFwwMDBmaWNvbXBcdFwwMDBmaW5jc3RwXDAwMGZsZGN3XHRcMDAwZmxkZSINCisgICAgIm52XHRcMDAwZmxkbDJlXDAwMGZsZGwydFwwMDBmbGRsZzJcMDAwZmxkbG4yXDAwMGZsZHBpXDAwMGZuY2xleFwwMDBmbmluIg0KKyAgICAiaXRcMDAwZm5vcFwwMDBmbnN0Y3dcdFwwMDBmbnN0c3cgJWF4XDAwMGZuc3Rzd1x0XDAwMCMjRlAzMl9UT19JTlQxNl9JTl8iDQorICAgICJNRU0gUFNFVURPIVwwMDAjI0ZQMzJfVE9fSU5UMzJfSU5fTUVNIFBTRVVETyFcMDAwIyNGUDMyX1RPX0lOVDY0X0lOX01FTSINCisgICAgIiBQU0VVRE8hXDAwMCMjRlA2NF9UT19JTlQxNl9JTl9NRU0gUFNFVURPIVwwMDAjI0ZQNjRfVE9fSU5UMzJfSU5fTUVNIFBTIg0KKyAgICAiRVVETyFcMDAwIyNGUDY0X1RPX0lOVDY0X0lOX01FTSBQU0VVRE8hXDAwMCMjRlA4MF9UT19JTlQxNl9JTl9NRU0gUFNFVUQiDQorICAgICJPIVwwMDAjI0ZQODBfVE9fSU5UMzJfSU5fTUVNIFBTRVVETyFcMDAwIyNGUDgwX1RPX0lOVDY0X0lOX01FTSBQU0VVRE8hXDAwMCINCisgICAgImZwYXRhblwwMDBmcHJlbVwwMDBmcHJlbTFcMDAwZnB0YW5cMDAwZnJuZGludFwwMDBmcnN0b3JcdFwwMDBmbnNhdmVcdFwwMDAiDQorICAgICJmc2NhbGVcMDAwZnNpbmNvc1wwMDBmbnN0ZW52XHRcMDAwbW92bFx0JWZzOlwwMDBmc1wwMDBmeGFtXDAwMGZ4cnN0b3JcdCINCisgICAgIlwwMDBmeHNhdmVcdFwwMDBmeHRyYWN0XDAwMGZ5bDJ4XDAwMGZ5bDJ4cDFcMDAwbW92YXBkXHRcMDAwbW92YXBzXHRcMDAwIg0KKyAgICAib3JwZFx0XDAwMG9ycHNcdFwwMDB4b3JwZFx0XDAwMHhvcnBzXHRcMDAwbW92bFx0JWdzOlwwMDBnc1wwMDBoYWRkcGRcdFwwMDAiDQorICAgICJoYWRkcHNcdFwwMDBobHRcMDAwaHN1YnBkXHRcMDAwaHN1YnBzXHRcMDAwaWRpdlx0XDAwMGZpbGRcdFwwMDBpbXVsXHRcMDAwIg0KKyAgICAiaW5zXDAwMGluXHQlQVgsIFwwMDBpblx0JUFYLCAlRFhcMDAwaW5cdCVFQVgsIFwwMDBpblx0JUVBWCwgJURYXDAwMGluXHQiDQorICAgICIlQUwsIFwwMDBpblx0JUFMLCAlRFhcMDAwaW5jXHRcMDAwaW5zZXJ0cHNcdFwwMDBpbnRcdFwwMDBpbnQzXDAwMGludG9cMDAwIg0KKyAgICAiaW52ZFwwMDBpbnZlcHRcMDAwaW52bHBnXHRcMDAwaW52dnBpZFwwMDBpcmV0XDAwMGZpc3R0cFx0XDAwMGZpc3RcdFwwMDAiDQorICAgICJmaXN0cFx0XDAwMGN2dHBkMnBpXHRcMDAwY3Z0cGkycGRcdFwwMDBjdnRwaTJwc1x0XDAwMGN2dHBzMnBpXHRcMDAwY3Z0cyINCisgICAgImQyc2lcdFwwMDBjdnR0cGQyZHFcdFwwMDBjdnR0cGQycGlcdFwwMDBjdnR0cHMycGlcdFwwMDAjTUVNQkFSUklFUlwwMDBsIg0KKyAgICAib2NrXG5cdG9yXHQoJWVzcCksIFwwMDBsb2NrXG5cdG9yXHQoJXJzcCksIFwwMDB1Y29taXNkXHRcMDAwdWNvbWlzc1x0XDAwMCINCisgICAgInZjbXBcMDAwdmNvbWlzZFx0XDAwMHZjb21pc3NcdFwwMDB2Y3Z0ZHEycGRcdFwwMDB2Y3Z0ZHEycHNcdFwwMDB2Y3Z0cGQyIg0KKyAgICAiZHFcdFwwMDB2Y3Z0cGQycHNcdFwwMDB2Y3Z0cHMyZHFcdFwwMDB2Y3Z0cHMycGRcdFwwMDB2Y3Z0c2Qyc2lcdFwwMDB2Y3YiDQorICAgICJ0c2Qyc3NcdFwwMDB2Y3Z0c2kyc2RcdFwwMDB2Y3Z0c2kyc3NcdFwwMDB2Y3Z0c3Myc2RcdFwwMDB2Y3Z0c3Myc2lcdFwwMDAiDQorICAgICJ2Y3Z0dHBkMmRxXHRcMDAwdmN2dHRwczJkcVx0XDAwMHZjdnR0c3Myc2lcdFwwMDB2dWNvbWlzZFx0XDAwMHZ1Y29taXNzXHQiDQorICAgICJcMDAwamFlXHRcMDAwamFcdFwwMDBqYmVcdFwwMDBqYlx0XDAwMGpjeHpcdFwwMDBqZVx0XDAwMGpnZVx0XDAwMGpnXHRcMDAwIg0KKyAgICAiamxlXHRcMDAwamxcdFwwMDBqbXBcdFwwMDBqbmVcdFwwMDBqbm9cdFwwMDBqbnBcdFwwMDBqbnNcdFwwMDBqb1x0XDAwMGoiDQorICAgICJwXHRcMDAwanNcdFwwMDBsYWhmXDAwMGxhclx0XDAwMGxvY2tcblx0Y21weGNoZ1x0XDAwMGxvY2tcblx0Y21weGNoZ3FcdCINCisgICAgIlwwMDBsb2NrXG5cdGNtcHhjaGc4Ylx0XDAwMGxkZHF1XHRcMDAwbGRteGNzclx0XDAwMGxkc1x0XDAwMGZsZHpcMDAwZmxkIg0KKyAgICAiMVwwMDBmbGRcdFwwMDBsZWFcdFwwMDBsZWF2ZVwwMDBsZXNcdFwwMDBsZmVuY2VcMDAwbGZzXHRcMDAwbGdkdFx0XDAwMGwiDQorICAgICJnc1x0XDAwMGxpZHRcdFwwMDBsbGR0XHRcMDAwbG1zd1x0XDAwMGxvY2tcblx0YWRkXHRcMDAwbG9ja1xuXHRkZWNcdFwwMDAiDQorICAgICJsb2NrXG5cdGluY1x0XDAwMGxvY2tcMDAwbG9ja1xuXHRzdWJcdFwwMDBsb2RzYlwwMDBsb2RzZFwwMDBsb2RzcVwwMDBsbyINCisgICAgImRzd1wwMDBsb29wXHRcMDAwbG9vcGVcdFwwMDBsb29wbmVcdFwwMDBscmV0XDAwMGxyZXRcdFwwMDBsc2xcdFwwMDBsc3NcdCINCisgICAgIlwwMDBsdHJcdFwwMDBsb2NrXG5cdHhhZGRcdFwwMDBtYXNrbW92ZHF1XHRcMDAwbWF4cGRcdFwwMDBtYXhwc1x0XDAwMG1hIg0KKyAgICAieHNkXHRcMDAwbWF4c3NcdFwwMDBtZmVuY2VcMDAwIyBkeW5hbWljIHN0YWNrIGFsbG9jYXRpb25cMDAwbWlucGRcdFwwMDAiDQorICAgICJtaW5wc1x0XDAwMG1pbnNkXHRcMDAwbWluc3NcdFwwMDBlbW1zXDAwMGZlbW1zXDAwMG1hc2ttb3ZxXHRcMDAwbW92ZFx0XDAwMCINCisgICAgIm1vdmRxMnFcdFwwMDBtb3ZudHFcdFwwMDBtb3ZxMmRxXHRcMDAwbW92cVx0XDAwMHBhY2tzc2R3XHRcMDAwcGFja3Nzd2JcdCINCisgICAgIlwwMDBwYWNrdXN3Ylx0XDAwMHBhZGRiXHRcMDAwcGFkZGRcdFwwMDBwYWRkcVx0XDAwMHBhZGRzYlx0XDAwMHBhZGRzd1x0Ig0KKyAgICAiXDAwMHBhZGR1c2JcdFwwMDBwYWRkdXN3XHRcMDAwcGFkZHdcdFwwMDBwYW5kblx0XDAwMHBhbmRcdFwwMDBwYXZnYlx0XDAwMCINCisgICAgInBhdmd3XHRcMDAwcGNtcGVxYlx0XDAwMHBjbXBlcWRcdFwwMDBwY21wZXF3XHRcMDAwcGNtcGd0Ylx0XDAwMHBjbXBndGRcdCINCisgICAgIlwwMDBwY21wZ3R3XHRcMDAwcGV4dHJ3XHRcMDAwcGluc3J3XHRcMDAwcG1hZGR3ZFx0XDAwMHBtYXhzd1x0XDAwMHBtYXh1Ig0KKyAgICAiYlx0XDAwMHBtaW5zd1x0XDAwMHBtaW51Ylx0XDAwMHBtb3Ztc2tiXHRcMDAwcG11bGh1d1x0XDAwMHBtdWxod1x0XDAwMHAiDQorICAgICJtdWxsd1x0XDAwMHBtdWx1ZHFcdFwwMDBwb3JcdFwwMDBwc2FkYndcdFwwMDBwc2h1ZndcdFwwMDBwc2xsZFx0XDAwMHBzbCINCisgICAgImxxXHRcMDAwcHNsbHdcdFwwMDBwc3JhZFx0XDAwMHBzcmF3XHRcMDAwcHNybGRcdFwwMDBwc3JscVx0XDAwMHBzcmx3XHRcMDAwIg0KKyAgICAicHN1YmJcdFwwMDBwc3ViZFx0XDAwMHBzdWJxXHRcMDAwcHN1YnNiXHRcMDAwcHN1YnN3XHRcMDAwcHN1YnVzYlx0XDAwMHAiDQorICAgICJzdWJ1c3dcdFwwMDBwc3Vid1x0XDAwMHB1bnBja2hid1x0XDAwMHB1bnBja2hkcVx0XDAwMHB1bnBja2h3ZFx0XDAwMHB1biINCisgICAgInBja2xid1x0XDAwMHB1bnBja2xkcVx0XDAwMHB1bnBja2x3ZFx0XDAwMHB4b3JcdFwwMDBtb25pdG9yXDAwMG1vdlx0XDAwMCINCisgICAgIm1vdlx0JWF4LCBcMDAwbW92XHQlZWF4LCBcMDAwbW92cVx0JWZzOlwwMDBtb3ZxXHQlZ3M6XDAwMG1vdlx0JXJheCwgXDAwMCINCisgICAgIm1vdmFic1x0XDAwMG1vdlx0JWFsLCBcMDAwbW92ZGR1cFx0XDAwMG1vdmRxYVx0XDAwMG1vdmRxdVx0XDAwMG1vdmhscHNcdCINCisgICAgIlwwMDBtb3ZocGRcdFwwMDBtb3ZocHNcdFwwMDBtb3ZsaHBzXHRcMDAwbW92bHBkXHRcMDAwbW92bHBzXHRcMDAwbW92bXNrIg0KKyAgICAicGRcdFwwMDBtb3Ztc2twc1x0XDAwMG1vdm50ZHFhXHRcMDAwbW92bnRkcVx0XDAwMG1vdm50aVx0XDAwMG1vdm50cGRcdFwwMDAiDQorICAgICJtb3ZudHBzXHRcMDAwXDAwMG1vdnNkXDAwMG1vdnNkXHRcMDAwbW92c2hkdXBcdFwwMDBtb3ZzbGR1cFx0XDAwMG1vdnNxXDAwMCINCisgICAgIm1vdnNzXHRcMDAwbW92c3hcdFwwMDBtb3ZzeGRcdFwwMDBtb3Z1cGRcdFwwMDBtb3Z1cHNcdFwwMDBtb3Z6eFx0XDAwMG1wIg0KKyAgICAic2FkYndcdFwwMDBtdWxcdFwwMDBtdWxwZFx0XDAwMG11bHBzXHRcMDAwbXVsc2RcdFwwMDBtdWxzc1x0XDAwMGZtdWxcdFwwMDAiDQorICAgICJmaW11bFx0XDAwMGZtdWxwXHRcMDAwbXdhaXRcMDAwbmVnXHRcMDAwbm9wXDAwMG5vcFx0XDAwMG5vdFx0XDAwMG9yXHQlYSINCisgICAgIngsIFwwMDBvclx0XDAwMG9yXHQlZWF4LCBcMDAwb3JcdCVyYXgsIFwwMDBvclx0JWFsLCBcMDAwb3V0XHRcMDAwb3V0XHQlIg0KKyAgICAiRFgsICVBWFwwMDBvdXRcdCVEWCwgJUVBWFwwMDBvdXRcdCVEWCwgJUFMXDAwMG91dHNiXDAwMG91dHNkXDAwMG91dHN3XDAwMCINCisgICAgInBhYnNiXHRcMDAwcGFic2RcdFwwMDBwYWJzd1x0XDAwMHBhY2t1c2R3XHRcMDAwcGFsaWduclx0XDAwMHBhdXNlXDAwMHBiIg0KKyAgICAibGVuZHZiXHRcMDAwcGJsZW5kd1x0XDAwMHBjbXBlcXFcdFwwMDBwY21wZXN0cmlcdFwwMDAjUENNUEVTVFJNMTI4cm0gUFMiDQorICAgICJFVURPXDAwMCNQQ01QRVNUUk0xMjhyciBQU0VVRE9cMDAwcGNtcGVzdHJtXHRcMDAwcGNtcGd0cVx0XDAwMHBjbXBpc3RyaSINCisgICAgIlx0XDAwMCNQQ01QSVNUUk0xMjhybSBQU0VVRE9cMDAwI1BDTVBJU1RSTTEyOHJyIFBTRVVET1wwMDBwY21waXN0cm1cdFwwMDAiDQorICAgICJwZXh0cmJcdFwwMDBwZXh0cmRcdFwwMDBwZXh0cnFcdFwwMDBwaGFkZGRcdFwwMDBwaGFkZHN3XHRcMDAwcGhhZGR3XHRcMDAwIg0KKyAgICAicGhtaW5wb3N1d1x0XDAwMHBoc3ViZFx0XDAwMHBoc3Vic3dcdFwwMDBwaHN1YndcdFwwMDBwaW5zcmJcdFwwMDBwaW5zcmQiDQorICAgICJcdFwwMDBwaW5zcnFcdFwwMDBwbWFkZHVic3dcdFwwMDBwbWF4c2JcdFwwMDBwbWF4c2RcdFwwMDBwbWF4dWRcdFwwMDBwbSINCisgICAgImF4dXdcdFwwMDBwbWluc2JcdFwwMDBwbWluc2RcdFwwMDBwbWludWRcdFwwMDBwbWludXdcdFwwMDBwbW92c3hiZFx0XDAwMCINCisgICAgInBtb3ZzeGJxXHRcMDAwcG1vdnN4YndcdFwwMDBwbW92c3hkcVx0XDAwMHBtb3ZzeHdkXHRcMDAwcG1vdnN4d3FcdFwwMDBwIg0KKyAgICAibW92enhiZFx0XDAwMHBtb3Z6eGJxXHRcMDAwcG1vdnp4YndcdFwwMDBwbW92enhkcVx0XDAwMHBtb3Z6eHdkXHRcMDAwcG0iDQorICAgICJvdnp4d3FcdFwwMDBwbXVsZHFcdFwwMDBwbXVsaHJzd1x0XDAwMHBtdWxsZFx0XDAwMHBvcFx0XDAwMHBvcGFcMDAwcG9wYyINCisgICAgIm50XHRcMDAwcG9wZlwwMDBwb3BmZFwwMDBwb3BmcVwwMDBwb3BcdCVmc1wwMDBwb3BcdCVnc1wwMDBwcmVmZXRjaG50YVx0Ig0KKyAgICAiXDAwMHByZWZldGNodDBcdFwwMDBwcmVmZXRjaHQxXHRcMDAwcHJlZmV0Y2h0Mlx0XDAwMHBzaHVmYlx0XDAwMHBzaHVmZFx0Ig0KKyAgICAiXDAwMHBzaHVmaHdcdFwwMDBwc2h1Zmx3XHRcMDAwcHNpZ25iXHRcMDAwcHNpZ25kXHRcMDAwcHNpZ253XHRcMDAwcHNsbGQiDQorICAgICJxXHRcMDAwcHNybGRxXHRcMDAwcHRlc3QgXHRcMDAwcHVucGNraHFkcVx0XDAwMHB1bnBja2xxZHFcdFwwMDBwdXNoXHRcMDAwIg0KKyAgICAicHVzaGFcMDAwcHVzaGZcMDAwcHVzaGZkXDAwMHB1c2hmcVwwMDBwdXNoXHQlZnNcMDAwcHVzaFx0JWdzXDAwMHJjbFx0XDAwMCINCisgICAgInJjcHBzXHRcMDAwcmNwc3NcdFwwMDByY3JcdFwwMDByZG1zclwwMDByZHBtY1wwMDByZHRzY1wwMDByZHRzY3BcMDAwcmVwIg0KKyAgICAibmVcMDAwcmVwIG1vdnNiXDAwMHJlcCBtb3ZzZFwwMDByZXAgbW92c3FcMDAwcmVwIG1vdnN3XDAwMHJlcFwwMDByZXAgc3QiDQorICAgICJvc2JcMDAwcmVwIHN0b3NkXDAwMHJlcCBzdG9zcVwwMDByZXAgc3Rvc3dcMDAwcmV0XDAwMHJldFx0XDAwMHJvbFx0XDAwMCINCisgICAgInJvclx0XDAwMHJvdW5kcGRcdFwwMDByb3VuZHBzXHRcMDAwcm91bmRzZFx0XDAwMHJvdW5kc3NcdFwwMDByc21cMDAwcnNxIg0KKyAgICAicnRwc1x0XDAwMHJzcXJ0c3NcdFwwMDBzYWhmXDAwMHNhclx0XDAwMHNiYlx0JWF4LCBcMDAwc2JiXHRcMDAwc2JiXHQlZWEiDQorICAgICJ4LCBcMDAwc2JiXHQlcmF4LCBcMDAwc2JiXHQlYWwsIFwwMDBzY2FzXDAwMHNjYXNxXDAwMHNldGFlXHRcMDAwc2V0YVx0XDAwMCINCisgICAgInNldGJlXHRcMDAwc2V0Ylx0XDAwMHNldGVcdFwwMDBzZXRnZVx0XDAwMHNldGdcdFwwMDBzZXRsZVx0XDAwMHNldGxcdFwwMDAiDQorICAgICJzZXRuZVx0XDAwMHNldG5vXHRcMDAwc2V0bnBcdFwwMDBzZXRuc1x0XDAwMHNldG9cdFwwMDBzZXRwXHRcMDAwc2V0c1x0XDAwMCINCisgICAgInNmZW5jZVwwMDBzZ2R0XHRcMDAwc2hsXHRcMDAwc2hsZFx0XDAwMHNoclx0XDAwMHNocmRcdFwwMDBzaHVmcGRcdFwwMDBzIg0KKyAgICAiaHVmcHNcdFwwMDBzaWR0XHRcMDAwZnNpblwwMDBzbGR0XHRcMDAwc21zd1x0XDAwMHNxcnRwZFx0XDAwMHNxcnRwc1x0XDAwMCINCisgICAgInNxcnRzZFx0XDAwMHNxcnRzc1x0XDAwMGZzcXJ0XDAwMHNzXDAwMHN0Y1wwMDBzdGRcMDAwc3RpXDAwMHN0bXhjc3JcdFwwMDAiDQorICAgICJzdG9zZFwwMDBzdG9zcVwwMDBzdHJcdFwwMDBmc3RcdFwwMDBmc3RwXHRcMDAwc3ViXHQlYXgsIFwwMDBzdWJcdFwwMDBzdSINCisgICAgImJcdCVlYXgsIFwwMDBzdWJcdCVyYXgsIFwwMDBzdWJcdCVhbCwgXDAwMHN1YnBkXHRcMDAwc3VicHNcdFwwMDBmc3Viclx0Ig0KKyAgICAiXDAwMGZpc3Viclx0XDAwMGZzdWJycFx0XDAwMHN1YnNkXHRcMDAwc3Vic3NcdFwwMDBmc3ViXHRcMDAwZmlzdWJcdFwwMDAiDQorICAgICJmc3VicFx0XDAwMHN3YXBnc1wwMDBzeXNjYWxsXDAwMHN5c2VudGVyXDAwMHN5c2V4aXRcMDAwc3lzcmV0XDAwMCNUQ19SRSINCisgICAgIlRVUk4gXDAwMHRlc3RcdCVheCwgXDAwMHRlc3RcdFwwMDB0ZXN0XHQlZWF4LCBcMDAwdGVzdFx0JXJheCwgXDAwMHRlc3RcdCINCisgICAgIiVhbCwgXDAwMCMgVExTQ2FsbF8zMlwwMDAjIFRMU0NhbGxfNjRcMDAwbGVhbFx0XDAwMC5ieXRlXHQweDY2OyBsZWFxXHRcMDAwIg0KKyAgICAidWQyXDAwMGZ0c3RcMDAwZnVjb21pcFx0JVNUKDApLCBcMDAwZnVjb21pXHQlU1QoMCksIFwwMDBmdWNvbXBwXDAwMGZ1Y28iDQorICAgICJtcFx0XDAwMGZ1Y29tXHRcMDAwdW5wY2tocGRcdFwwMDB1bnBja2hwc1x0XDAwMHVucGNrbHBkXHRcMDAwdW5wY2tscHNcdCINCisgICAgIlwwMDB2YWRkcGRcdFwwMDB2YWRkcHNcdFwwMDB2YWRkc2RcdFwwMDB2YWRkc3NcdFwwMDB2YWRkc3VicGRcdFwwMDB2YWRkIg0KKyAgICAic3VicHNcdFwwMDB2YWVzZGVjbGFzdFx0XDAwMHZhZXNkZWNcdFwwMDB2YWVzZW5jbGFzdFx0XDAwMHZhZXNlbmNcdFwwMDAiDQorICAgICJ2YWVzaW1jXHRcMDAwdmFlc2tleWdlbmFzc2lzdFx0XDAwMHZhbmRucGRcdFwwMDB2YW5kbnBzXHRcMDAwdmFuZHBkXHRcMDAwIg0KKyAgICAidmFuZHBzXHRcMDAwI1ZBU1RBUlRfU0FWRV9YTU1fUkVHUyBcMDAwdmJsZW5kcGRcdFwwMDB2YmxlbmRwc1x0XDAwMHZibGUiDQorICAgICJuZHZwZFx0XDAwMHZibGVuZHZwc1x0XDAwMHZicm9hZGNhc3RmMTI4XHRcMDAwdmJyb2FkY2FzdHNkXHRcMDAwdmJyb2FkYyINCisgICAgImFzdHNzXHRcMDAwdmNtcHBkXHRcMDAwdmNtcHBzXHRcMDAwdmNtcHNkXHRcMDAwdmNtcHNzXHRcMDAwdmN2dHBkMmRxeFx0Ig0KKyAgICAiXDAwMHZjdnRwZDJkcXlcdFwwMDB2Y3Z0cGQycHN4XHRcMDAwdmN2dHBkMnBzeVx0XDAwMHZjdnR0cGQyZHF4XHRcMDAwdmMiDQorICAgICJ2dHRwZDJkcXlcdFwwMDB2Y3Z0dHNkMnNpXHRcMDAwdmRpdnBkXHRcMDAwdmRpdnBzXHRcMDAwdmRpdnNkXHRcMDAwdmRpdiINCisgICAgInNzXHRcMDAwdmRwcGRcdFwwMDB2ZHBwc1x0XDAwMHZlcnJcdFwwMDB2ZXJ3XHRcMDAwdmV4dHJhY3RmMTI4XHRcMDAwdmV4Ig0KKyAgICAidHJhY3Rwc1x0XDAwMHZleHRyYWN0cHMgXHRcMDAwdmZtYWRkMTMycGRcdFwwMDB2Zm1hZGQyMTNwZFx0XDAwMHZmbWFkZDIiDQorICAgICIzMXBkXHRcMDAwdmZtYWRkMTMycHNcdFwwMDB2Zm1hZGQyMTNwc1x0XDAwMHZmbWFkZDIzMXBzXHRcMDAwdmZtYWRkc3ViMSINCisgICAgIjMycGRcdFwwMDB2Zm1hZGRzdWIyMTNwZFx0XDAwMHZmbWFkZHN1YjIzMXBkXHRcMDAwdmZtYWRkc3ViMTMycHNcdFwwMDB2Ig0KKyAgICAiZm1hZGRzdWIyMTNwc1x0XDAwMHZmbWFkZHN1YjIzMXBzXHRcMDAwdmZtc3ViYWRkMTMycGRcdFwwMDB2Zm1zdWJhZGQyMTMiDQorICAgICJwZFx0XDAwMHZmbXN1YmFkZDIzMXBkXHRcMDAwdmZtc3ViYWRkMTMycHNcdFwwMDB2Zm1zdWJhZGQyMTNwc1x0XDAwMHZmbSINCisgICAgInN1YmFkZDIzMXBzXHRcMDAwdmZtc3ViMTMycGRcdFwwMDB2Zm1zdWIyMTNwZFx0XDAwMHZmbXN1YjIzMXBkXHRcMDAwdmZtIg0KKyAgICAic3ViMTMycHNcdFwwMDB2Zm1zdWIyMTNwc1x0XDAwMHZmbXN1YjIzMXBzXHRcMDAwdmZubWFkZDEzMnBkXHRcMDAwdmZubWEiDQorICAgICJkZDIxM3BkXHRcMDAwdmZubWFkZDIzMXBkXHRcMDAwdmZubWFkZDEzMnBzXHRcMDAwdmZubWFkZDIxM3BzXHRcMDAwdmZubSINCisgICAgImFkZDIzMXBzXHRcMDAwdmZubXN1YjEzMnBkXHRcMDAwdmZubXN1YjIxM3BkXHRcMDAwdmZubXN1YjIzMXBkXHRcMDAwdmZuIg0KKyAgICAibXN1YjEzMnBzXHRcMDAwdmZubXN1YjIxM3BzXHRcMDAwdmZubXN1YjIzMXBzXHRcMDAwdm9ycGRcdFwwMDB2b3Jwc1x0XDAwMCINCisgICAgInZ4b3JwZFx0XDAwMHZ4b3Jwc1x0XDAwMHZoYWRkcGRcdFwwMDB2aGFkZHBzXHRcMDAwdmhzdWJwZFx0XDAwMHZoc3VicHNcdCINCisgICAgIlwwMDB2aW5zZXJ0ZjEyOFx0XDAwMHZpbnNlcnRwc1x0XDAwMHZsZGRxdVx0XDAwMHZsZG14Y3NyXHRcMDAwdm1hc2ttb3ZkIg0KKyAgICAicXVcdFwwMDB2bWFza21vdnBkXHRcMDAwdm1hc2ttb3Zwc1x0XDAwMHZtYXhwZFx0XDAwMHZtYXhwc1x0XDAwMHZtYXhzZFx0Ig0KKyAgICAiXDAwMHZtYXhzc1x0XDAwMHZtY2FsbFwwMDB2bWNsZWFyXHRcMDAwdm1pbnBkXHRcMDAwdm1pbnBzXHRcMDAwdm1pbnNkXHQiDQorICAgICJcMDAwdm1pbnNzXHRcMDAwdm1sYXVuY2hcMDAwdm1vdmFwZFx0XDAwMHZtb3ZhcHNcdFwwMDB2bW92ZGR1cFx0XDAwMHZtbyINCisgICAgInZkXHRcMDAwdm1vdmRxYVx0XDAwMHZtb3ZkcXVcdFwwMDB2bW92aGxwc1x0XDAwMHZtb3ZocGRcdFwwMDB2bW92aHBzXHRcMDAwIg0KKyAgICAidm1vdmxocHNcdFwwMDB2bW92bHBkXHRcMDAwdm1vdmxwc1x0XDAwMHZtb3ZxXHRcMDAwdm1vdm1za3BkXHRcMDAwdm1vdm0iDQorICAgICJza3BzXHRcMDAwdm1vdm50ZHFhXHRcMDAwdm1vdm50ZHFcdFwwMDB2bW92bnRwZFx0XDAwMHZtb3ZudHBzXHRcMDAwdm1vdiINCisgICAgInNkXHRcMDAwdm1vdnNoZHVwXHRcMDAwdm1vdnNsZHVwXHRcMDAwdm1vdnNzXHRcMDAwdm1vdnVwZFx0XDAwMHZtb3Z1cHNcdCINCisgICAgIlwwMDB2bXBzYWRid1x0XDAwMHZtcHRybGRcdFwwMDB2bXB0cnN0XHRcMDAwdm1yZWFkXHRcMDAwdm1yZXN1bWVcMDAwdm11Ig0KKyAgICAibHBkXHRcMDAwdm11bHBzXHRcMDAwdm11bHNkXHRcMDAwdm11bHNzXHRcMDAwdm13cml0ZVx0XDAwMHZteG9mZlwwMDB2bXgiDQorICAgICJvblx0XDAwMHZwYWJzYlx0XDAwMHZwYWJzZFx0XDAwMHZwYWJzd1x0XDAwMHZwYWNrc3Nkd1x0XDAwMHZwYWNrc3N3Ylx0XDAwMCINCisgICAgInZwYWNrdXNkd1x0XDAwMHZwYWNrdXN3Ylx0XDAwMHZwYWRkYlx0XDAwMHZwYWRkZFx0XDAwMHZwYWRkcVx0XDAwMHZwYWRkIg0KKyAgICAic2JcdFwwMDB2cGFkZHN3XHRcMDAwdnBhZGR1c2JcdFwwMDB2cGFkZHVzd1x0XDAwMHZwYWRkd1x0XDAwMHZwYWxpZ25yXHQiDQorICAgICJcMDAwdnBhbmRuXHRcMDAwdnBhbmRcdFwwMDB2cGF2Z2JcdFwwMDB2cGF2Z3dcdFwwMDB2cGJsZW5kdmJcdFwwMDB2cGJsZSINCisgICAgIm5kd1x0XDAwMHZwY2xtdWxocWhxZHFcdFwwMDB2cGNsbXVsaHFscWRxXHRcMDAwdnBjbG11bGxxaHFkcVx0XDAwMHZwY2xtIg0KKyAgICAidWxscWxxZHFcdFwwMDB2cGNsbXVscWRxXHRcMDAwdnBjbXBlcWJcdFwwMDB2cGNtcGVxZFx0XDAwMHZwY21wZXFxXHRcMDAwIg0KKyAgICAidnBjbXBlcXdcdFwwMDB2cGNtcGVzdHJpXHRcMDAwI1ZQQ01QRVNUUk0xMjhybSBQU0VVRE9cMDAwI1ZQQ01QRVNUUk0xMjgiDQorICAgICJyciBQU0VVRE9cMDAwdnBjbXBlc3RybVx0XDAwMHZwY21wZ3RiXHRcMDAwdnBjbXBndGRcdFwwMDB2cGNtcGd0cVx0XDAwMCINCisgICAgInZwY21wZ3R3XHRcMDAwdnBjbXBpc3RyaVx0XDAwMCNWUENNUElTVFJNMTI4cm0gUFNFVURPXDAwMCNWUENNUElTVFJNMTI4Ig0KKyAgICAicnIgUFNFVURPXDAwMHZwY21waXN0cm1cdFwwMDB2cGVybTJmMTI4XHRcMDAwdnBlcm1pbHBkXHRcMDAwdnBlcm1pbHBzXHQiDQorICAgICJcMDAwdnBleHRyYlx0XDAwMHZwZXh0cmRcdFwwMDB2cGV4dHJxXHRcMDAwdnBleHRyd1x0XDAwMHZwaGFkZGRcdFwwMDB2cCINCisgICAgImhhZGRzd1x0XDAwMHZwaGFkZHdcdFwwMDB2cGhtaW5wb3N1d1x0XDAwMHZwaHN1YmRcdFwwMDB2cGhzdWJzd1x0XDAwMHZwIg0KKyAgICAiaHN1YndcdFwwMDB2cGluc3JiXHRcMDAwdnBpbnNyZFx0XDAwMHZwaW5zcnFcdFwwMDB2cGluc3J3XHRcMDAwdnBtYWRkdWIiDQorICAgICJzd1x0XDAwMHZwbWFkZHdkXHRcMDAwdnBtYXhzYlx0XDAwMHZwbWF4c2RcdFwwMDB2cG1heHN3XHRcMDAwdnBtYXh1Ylx0XDAwMCINCisgICAgInZwbWF4dWRcdFwwMDB2cG1heHV3XHRcMDAwdnBtaW5zYlx0XDAwMHZwbWluc2RcdFwwMDB2cG1pbnN3XHRcMDAwdnBtaW51Ig0KKyAgICAiYlx0XDAwMHZwbWludWRcdFwwMDB2cG1pbnV3XHRcMDAwdnBtb3Ztc2tiXHRcMDAwdnBtb3ZzeGJkXHRcMDAwdnBtb3ZzeGIiDQorICAgICJxXHRcMDAwdnBtb3ZzeGJ3XHRcMDAwdnBtb3ZzeGRxXHRcMDAwdnBtb3ZzeHdkXHRcMDAwdnBtb3ZzeHdxXHRcMDAwdnBtbyINCisgICAgInZ6eGJkXHRcMDAwdnBtb3Z6eGJxXHRcMDAwdnBtb3Z6eGJ3XHRcMDAwdnBtb3Z6eGRxXHRcMDAwdnBtb3Z6eHdkXHRcMDAwIg0KKyAgICAidnBtb3Z6eHdxXHRcMDAwdnBtdWxkcVx0XDAwMHZwbXVsaHJzd1x0XDAwMHZwbXVsaHV3XHRcMDAwdnBtdWxod1x0XDAwMHYiDQorICAgICJwbXVsbGRcdFwwMDB2cG11bGx3XHRcMDAwdnBtdWx1ZHFcdFwwMDB2cG9yXHRcMDAwdnBzYWRid1x0XDAwMHZwc2h1ZmJcdCINCisgICAgIlwwMDB2cHNodWZkXHRcMDAwdnBzaHVmaHdcdFwwMDB2cHNodWZsd1x0XDAwMHZwc2lnbmJcdFwwMDB2cHNpZ25kXHRcMDAwIg0KKyAgICAidnBzaWdud1x0XDAwMHZwc2xsZHFcdFwwMDB2cHNsbGRcdFwwMDB2cHNsbHFcdFwwMDB2cHNsbHdcdFwwMDB2cHNyYWRcdFwwMDAiDQorICAgICJ2cHNyYXdcdFwwMDB2cHNybGRxXHRcMDAwdnBzcmxkXHRcMDAwdnBzcmxxXHRcMDAwdnBzcmx3XHRcMDAwdnBzdWJiXHRcMDAwIg0KKyAgICAidnBzdWJkXHRcMDAwdnBzdWJxXHRcMDAwdnBzdWJzYlx0XDAwMHZwc3Vic3dcdFwwMDB2cHN1YnVzYlx0XDAwMHZwc3VidXMiDQorICAgICJ3XHRcMDAwdnBzdWJ3XHRcMDAwdnB0ZXN0XHRcMDAwdnB1bnBja2hid1x0XDAwMHZwdW5wY2toZHFcdFwwMDB2cHVucGNraCINCisgICAgInFkcVx0XDAwMHZwdW5wY2tod2RcdFwwMDB2cHVucGNrbGJ3XHRcMDAwdnB1bnBja2xkcVx0XDAwMHZwdW5wY2tscWRxXHRcMDAwIg0KKyAgICAidnB1bnBja2x3ZFx0XDAwMHZweG9yXHRcMDAwdnJjcHBzXHRcMDAwdnJjcHNzXHRcMDAwdnJvdW5kcGRcdFwwMDB2cm91bmQiDQorICAgICJwc1x0XDAwMHZyb3VuZHNkXHRcMDAwdnJvdW5kc3NcdFwwMDB2cnNxcnRwc1x0XDAwMHZyc3FydHNzXHRcMDAwdnNodWZwZCINCisgICAgIlx0XDAwMHZzaHVmcHNcdFwwMDB2c3FydHBkXHRcMDAwdnNxcnRwc1x0XDAwMHZzcXJ0c2RcdFwwMDB2c3FydHNzXHRcMDAwIg0KKyAgICAidnN0bXhjc3JcdFwwMDB2c3VicGRcdFwwMDB2c3VicHNcdFwwMDB2c3Vic2RcdFwwMDB2c3Vic3NcdFwwMDB2dGVzdHBkXHQiDQorICAgICJcMDAwdnRlc3Rwc1x0XDAwMHZ1bnBja2hwZFx0XDAwMHZ1bnBja2hwc1x0XDAwMHZ1bnBja2xwZFx0XDAwMHZ1bnBja2xwcyINCisgICAgIlx0XDAwMHZ6ZXJvYWxsXDAwMHZ6ZXJvdXBwZXJcMDAwd2FpdFwwMDB3YmludmRcMDAwd3Jtc3JcMDAweGFkZFx0XDAwMHhjIg0KKyAgICAiaGdcdCVheCwgXDAwMHhjaGdcdFwwMDB4Y2hnXHQlZWF4LCBcMDAweGNoZ1x0JXJheCwgXDAwMGZ4Y2hcdFwwMDB4bGF0YlwwMDAiDQorICAgICJ4b3JcdCVheCwgXDAwMHhvclx0XDAwMHhvclx0JWVheCwgXDAwMHhvclx0JXJheCwgXDAwMHhvclx0JWFsLCBcMDAwIjsNCisNCisgIE8gPDwgIlx0IjsNCisNCisgIC8vIEVtaXQgdGhlIG9wY29kZSBmb3IgdGhlIGluc3RydWN0aW9uLg0KKyAgdW5zaWduZWQgQml0cyA9IE9wSW5mb1tNSS0+Z2V0T3Bjb2RlKCldOw0KKyAgYXNzZXJ0KEJpdHMgIT0gMCAmJiAiQ2Fubm90IHByaW50IHRoaXMgaW5zdHJ1Y3Rpb24uIik7DQorICBPIDw8IEFzbVN0cnMrKEJpdHMgJiAxNjM4MyktMTsNCisNCisNCisgIC8vIEZyYWdtZW50IDAgZW5jb2RlZCBpbnRvIDUgYml0cyBmb3IgMjYgdW5pcXVlIGNvbW1hbmRzLg0KKyAgc3dpdGNoICgoQml0cyA+PiAyNykgJiAzMSkgew0KKyAgZGVmYXVsdDogICAvLyB1bnJlYWNoYWJsZS4NCisgIGNhc2UgMDoNCisgICAgLy8gREJHX1ZBTFVFLCBBQlNfRiwgQURKQ0FMTFNUQUNLRE9XTjMyLCBBREpDQUxMU1RBQ0tET1dONjQsIEFESkNBTExTVEFDSy4uLg0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAxOg0KKyAgICAvLyBBREMxNmkxNiwgQURDMTZyaSwgQURDMTZyaTgsIEFEQzE2cm0sIEFEQzE2cnIsIEFEQzE2cnJfUkVWLCBBREMzMmkzMiwgLi4uDQorICAgIHByaW50T3BlcmFuZChNSSwgMCwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMjoNCisgICAgLy8gQURDMTZtaSwgQURDMTZtaTgsIEFEQzE2bXIsIEFERDE2bWksIEFERDE2bWk4LCBBREQxNm1yLCBBRERfRkkxNm0sIEFORC4uLg0KKyAgICBwcmludGkxNm1lbShNSSwgMCwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMzoNCisgICAgLy8gQURDMzJtaSwgQURDMzJtaTgsIEFEQzMybXIsIEFERDMybWksIEFERDMybWk4LCBBREQzMm1yLCBBRERfRkkzMm0sIEFORC4uLg0KKyAgICBwcmludGkzMm1lbShNSSwgMCwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgNDoNCisgICAgLy8gQURDNjRtaTMyLCBBREM2NG1pOCwgQURDNjRtciwgQURENjRtaTMyLCBBREQ2NG1pOCwgQURENjRtciwgQU5ENjRtaTMyLC4uLg0KKyAgICBwcmludGk2NG1lbShNSSwgMCwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgNToNCisgICAgLy8gQURDOG1pLCBBREM4bXIsIEFERDhtaSwgQUREOG1yLCBBTkQ4bWksIEFORDhtciwgQ0xGTFVTSCwgQ01QOG1pLCBDTVA4bS4uLg0KKyAgICBwcmludGk4bWVtKE1JLCAwLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSA2Og0KKyAgICAvLyBBRERfRjMybSwgRElWUl9GMzJtLCBESVZfRjMybSwgRVhUUkFDVFBTbXIsIEZCTERtLCBGQlNUUG0sIEZDT00zMm0sIEZDLi4uDQorICAgIHByaW50ZjMybWVtKE1JLCAwLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSA3Og0KKyAgICAvLyBBRERfRjY0bSwgRElWUl9GNjRtLCBESVZfRjY0bSwgRkNPTTY0bSwgRkNPTVA2NG0sIExEX0Y2NG0sIE1PVkhQRG1yLCBNLi4uDQorICAgIHByaW50ZjY0bWVtKE1JLCAwLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSA4Og0KKyAgICAvLyBDQUxMNjRwY3JlbDMyLCBDQUxMcGNyZWwxNiwgQ0FMTHBjcmVsMzIsIEpBRV8xLCBKQUVfNCwgSkFfMSwgSkFfNCwgSkJFLi4uDQorICAgIHByaW50X3BjcmVsX2ltbShNSSwgMCwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgOToNCisgICAgLy8gQ01QUERybWksIENNUFBTcm1pLCBDTVBTRHJtLCBDTVBTU3JtLCBJbnRfQ01QU0RybSwgSW50X0NNUFNTcm0sIEludF9WQy4uLg0KKyAgICBwcmludFNTRUNDKE1JLCA3LCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxMDoNCisgICAgLy8gQ01QUERycmksIENNUFBTcnJpLCBDTVBTRHJyLCBDTVBTU3JyLCBJbnRfQ01QU0RyciwgSW50X0NNUFNTcnIsIEludF9WQy4uLg0KKyAgICBwcmludFNTRUNDKE1JLCAzLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxMToNCisgICAgLy8gQ01QWENIRzE2QiwgTU9WRFFBbXIsIE1PVkRRVW1yLCBNT1ZEUVVtcl9JbnQsIE1PVk5UUERtcl9JbnQsIE1PVk5UUFNtci4uLg0KKyAgICBwcmludGkxMjhtZW0oTUksIDAsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDEyOg0KKyAgICAvLyBDUkMzMm0xNiwgQ1JDMzJtMzIsIENSQzMybTgsIENSQzMycjE2LCBDUkMzMnIzMiwgQ1JDMzJyOCwgQ1JDNjRtNjQsIENSLi4uDQorICAgIHByaW50T3BlcmFuZChNSSwgMSwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMTM6DQorICAgIC8vIEZBUkNBTEwxNm0sIEZBUkNBTEwzMm0sIEZBUkNBTEw2NCwgRkFSSk1QMTZtLCBGQVJKTVAzMm0sIEZBUkpNUDY0LCBGWFIuLi4NCisgICAgcHJpbnRvcGFxdWVtZW0oTUksIDAsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMTQ6DQorICAgIC8vIEZTX01PVjMycm0sIEdTX01PVjMycm0NCisgICAgcHJpbnRpMzJtZW0oTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE1Og0KKyAgICAvLyBMQ01QWENIRzY0DQorICAgIHByaW50T3BlcmFuZChNSSwgNSwgTyk7IA0KKyAgICBPIDw8ICcsJzsgDQorICAgIHByaW50aTY0bWVtKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE2Og0KKyAgICAvLyBMRF9GODBtLCBTVF9GUDgwbQ0KKyAgICBwcmludGY4MG1lbShNSSwgMCwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAxNzoNCisgICAgLy8gTFhBREQxNiwgWENIRzE2cm0NCisgICAgcHJpbnRpMTZtZW0oTUksIDIsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAxLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE4Og0KKyAgICAvLyBMWEFERDMyLCBYQ0hHMzJybQ0KKyAgICBwcmludGkzMm1lbShNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDEsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMTk6DQorICAgIC8vIExYQUREOCwgWENIRzhybQ0KKyAgICBwcmludGk4bWVtKE1JLCAyLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMSwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyMDoNCisgICAgLy8gTU9WNjRGU3JtLCBNT1Y2NEdTcm0NCisgICAgcHJpbnRpNjRtZW0oTUksIDEsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDIxOg0KKyAgICAvLyBNT1ZBUERtciwgTU9WQVBTbXIsIE1PVk5URFFfNjRtciwgTU9WTlREUW1yLCBNT1ZOVERRbXJfSW50LCBNT1ZOVFBEbXIsLi4uDQorICAgIHByaW50ZjEyOG1lbShNSSwgMCwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDUsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDIyOg0KKyAgICAvLyBWTUFTS01PVlBEWW1yLCBWTUFTS01PVlBTWW1yLCBWTU9WQVBEWW1yLCBWTU9WQVBTWW1yLCBWTU9WTlREUVlfNjRtciwgLi4uDQorICAgIHByaW50ZjI1Nm1lbShNSSwgMCwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDUsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDIzOg0KKyAgICAvLyBWTU9WRFFBWW1yLCBWTU9WRFFVWW1yDQorICAgIHByaW50aTI1Nm1lbShNSSwgMCwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDUsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMjQ6DQorICAgIC8vIFhDSEcxNnJyLCBYQ0hHMzJyciwgWENIRzY0cnIsIFhDSEc4cnINCisgICAgcHJpbnRPcGVyYW5kKE1JLCAyLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMSwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyNToNCisgICAgLy8gWENIRzY0cm0NCisgICAgcHJpbnRpNjRtZW0oTUksIDIsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgcHJpbnRPcGVyYW5kKE1JLCAxLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICB9DQorDQorDQorICAvLyBGcmFnbWVudCAxIGVuY29kZWQgaW50byA1IGJpdHMgZm9yIDI2IHVuaXF1ZSBjb21tYW5kcy4NCisgIHN3aXRjaCAoKEJpdHMgPj4gMjIpICYgMzEpIHsNCisgIGRlZmF1bHQ6ICAgLy8gdW5yZWFjaGFibGUuDQorICBjYXNlIDA6DQorICAgIC8vIEFEQzE2aTE2LCBBREMzMmkzMiwgQURDNjRpMzIsIEFEQzhpOCwgQUREMTZpMTYsIEFERDMyaTMyLCBBREQ2NGkzMiwgQUQuLi4NCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMToNCisgICAgLy8gQURDMTZtaSwgQURDMTZtaTgsIEFEQzE2bXIsIEFEQzE2cmksIEFEQzE2cmk4LCBBREMxNnJtLCBBREMxNnJyLCBBREMxNi4uLg0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMjoNCisgICAgLy8gQUREX0ZyU1QwLCBESVZSX0ZyU1QwLCBESVZfRnJTVDAsIE1VTF9GclNUMCwgU1VCUl9GclNUMCwgU1VCX0ZyU1QwDQorICAgIE8gPDwgIiwgJVNUKDApIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDM6DQorICAgIC8vIENNUFBEcm1pLCBDTVBQRHJyaSwgVkNNUFBEWXJtaSwgVkNNUFBEWXJyaSwgVkNNUFBEcm1pLCBWQ01QUERycmkNCisgICAgTyA8PCAicGRcdCI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDQ6DQorICAgIC8vIENNUFBTcm1pLCBDTVBQU3JyaSwgVkNNUFBTWXJtaSwgVkNNUFBTWXJyaSwgVkNNUFBTcm1pLCBWQ01QUFNycmkNCisgICAgTyA8PCAicHNcdCI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDU6DQorICAgIC8vIENNUFNEcm0sIENNUFNEcnIsIEludF9DTVBTRHJtLCBJbnRfQ01QU0RyciwgSW50X1ZDTVBTRHJtLCBJbnRfVkNNUFNEcnIuLi4NCisgICAgTyA8PCAic2RcdCI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDY6DQorICAgIC8vIENNUFNTcm0sIENNUFNTcnIsIEludF9DTVBTU3JtLCBJbnRfQ01QU1NyciwgSW50X1ZDTVBTU3JtLCBJbnRfVkNNUFNTcnIuLi4NCisgICAgTyA8PCAic3NcdCI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDAsIE8pOyANCisgICAgTyA8PCAiLCAiOyANCisgICAgYnJlYWs7DQorICBjYXNlIDc6DQorICAgIC8vIENSQzMybTE2DQorICAgIHByaW50aTE2bWVtKE1JLCAyLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDg6DQorICAgIC8vIENSQzMybTMyDQorICAgIHByaW50aTMybWVtKE1JLCAyLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDk6DQorICAgIC8vIENSQzMybTgsIENSQzY0bTgNCisgICAgcHJpbnRpOG1lbShNSSwgMiwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAxMDoNCisgICAgLy8gQ1JDMzJyMTYsIENSQzMycjMyLCBDUkMzMnI4LCBDUkM2NHI2NCwgQ1JDNjRyOA0KKyAgICBwcmludE9wZXJhbmQoTUksIDIsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMTE6DQorICAgIC8vIENSQzY0bTY0LCBMWEFERDY0DQorICAgIHByaW50aTY0bWVtKE1JLCAyLCBPKTsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDEyOg0KKyAgICAvLyBNT1YxNmFvMTYNCisgICAgTyA8PCAiLCAlYXgiOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMTM6DQorICAgIC8vIE1PVjMyYW8zMg0KKyAgICBPIDw8ICIsICVlYXgiOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMTQ6DQorICAgIC8vIE1PVjY0YW82NCwgTU9WNjRhbzgNCisgICAgTyA8PCAiLCAlcmF4IjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE1Og0KKyAgICAvLyBNT1Y4YW84DQorICAgIE8gPDwgIiwgJWFsIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE2Og0KKyAgICAvLyBPVVQxNmlyDQorICAgIE8gPDwgIiwgJUFYIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE3Og0KKyAgICAvLyBPVVQzMmlyDQorICAgIE8gPDwgIiwgJUVBWCI7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAxODoNCisgICAgLy8gT1VUOGlyDQorICAgIE8gPDwgIiwgJUFMIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDE5Og0KKyAgICAvLyBSQ0wxNm0xLCBSQ0wxNnIxLCBSQ0wzMm0xLCBSQ0wzMnIxLCBSQ0w2NG0xLCBSQ0w2NHIxLCBSQ0w4bTEsIFJDTDhyMSwgLi4uDQorICAgIE8gPDwgIiwgMSI7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyMDoNCisgICAgLy8gUkNMMTZtQ0wsIFJDTDE2ckNMLCBSQ0wzMm1DTCwgUkNMMzJyQ0wsIFJDTDY0bUNMLCBSQ0w2NHJDTCwgUkNMOG1DTCwgUi4uLg0KKyAgICBPIDw8ICIsIENMIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDIxOg0KKyAgICAvLyBST0w2NG1DTCwgUk9MNjRyQ0wsIFJPUjY0bUNMLCBST1I2NHJDTCwgU0FSNjRtQ0wsIFNBUjY0ckNMLCBTSEw2NG1DTCwgLi4uDQorICAgIE8gPDwgIiwgJUNMIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDIyOg0KKyAgICAvLyBUQUlMSk1QZCwgVEFJTEpNUGQ2NCwgVEFJTEpNUG0sIFRBSUxKTVBtNjQsIFRBSUxKTVByNjQNCisgICAgTyA8PCAiICAjIFRBSUxDQUxMIjsgDQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIDIzOg0KKyAgICAvLyBUQ1JFVFVSTmRpLCBUQ1JFVFVSTmRpNjQsIFRDUkVUVVJObWksIFRDUkVUVVJObWk2NCwgVENSRVRVUk5yaSwgVENSRVRVLi4uDQorICAgIE8gPDwgJyAnOyANCisgICAgYnJlYWs7DQorICBjYXNlIDI0Og0KKyAgICAvLyBUTFNfYWRkcjMyDQorICAgIE8gPDwgIiwgJWVheDsgY2FsbFx0X19fdGxzX2dldF9hZGRyQFBMVCI7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyNToNCisgICAgLy8gVExTX2FkZHI2NA0KKyAgICBPIDw8ICIoJXJpcCksICVyZGk7IC53b3JkXHQweDY2NjY7IHJleDY0OyBjYWxsXHRfX3Rsc19nZXRfYWRkckBQTFQiOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIH0NCisNCisNCisgIC8vIEZyYWdtZW50IDIgZW5jb2RlZCBpbnRvIDUgYml0cyBmb3IgMjQgdW5pcXVlIGNvbW1hbmRzLg0KKyAgc3dpdGNoICgoQml0cyA+PiAxNykgJiAzMSkgew0KKyAgZGVmYXVsdDogICAvLyB1bnJlYWNoYWJsZS4NCisgIGNhc2UgMDoNCisgICAgLy8gQURDMTZtaSwgQURDMTZtaTgsIEFEQzE2bXIsIEFEQzMybWksIEFEQzMybWk4LCBBREMzMm1yLCBBREM2NG1pMzIsIEFEQy4uLg0KKyAgICBwcmludE9wZXJhbmQoTUksIDUsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDE6DQorICAgIC8vIEFEQzE2cmksIEFEQzE2cmk4LCBBREMxNnJyLCBBREMxNnJyX1JFViwgQURDMzJyaSwgQURDMzJyaTgsIEFEQzMycnIsIEEuLi4NCisgICAgcHJpbnRPcGVyYW5kKE1JLCAyLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAyOg0KKyAgICAvLyBBREMxNnJtLCBBREQxNnJtLCBBTkQxNnJtLCBDTU9WQTE2cm0sIENNT1ZBRTE2cm0sIENNT1ZCMTZybSwgQ01PVkJFMTZyLi4uDQorICAgIHByaW50aTE2bWVtKE1JLCAyLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAzOg0KKyAgICAvLyBBREMzMnJtLCBBREQzMnJtLCBBTkQzMnJtLCBDTU9WQTMycm0sIENNT1ZBRTMycm0sIENNT1ZCMzJybSwgQ01PVkJFMzJyLi4uDQorICAgIHByaW50aTMybWVtKE1JLCAyLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSA0Og0KKyAgICAvLyBBREM2NHJtLCBBREQ2NHJtLCBBTkQ2NHJtLCBDTU9WQTY0cm0sIENNT1ZBRTY0cm0sIENNT1ZCNjRybSwgQ01PVkJFNjRyLi4uDQorICAgIHByaW50aTY0bWVtKE1JLCAyLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSA1Og0KKyAgICAvLyBBREM4cm0sIEFERDhybSwgQU5EOHJtLCBPUjhybSwgUElOU1JCcm0sIFNCQjhybSwgU1VCOHJtLCBYT1I4cm0NCisgICAgcHJpbnRpOG1lbShNSSwgMiwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgNjoNCisgICAgLy8gQUREUERybSwgQUREUFNybSwgQUREU1VCUERybSwgQUREU1VCUFNybSwgQU5ETlBEcm0sIEFORE5QU3JtLCBBTkRQRHJtLC4uLg0KKyAgICBwcmludGYxMjhtZW0oTUksIDIsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDc6DQorICAgIC8vIEFERFNEcm0sIEFERFNEcm1fSW50LCBDTVBTRHJtLCBDTVBTRHJtX2FsdCwgRElWU0RybSwgRElWU0RybV9JbnQsIEludF8uLi4NCisgICAgcHJpbnRmNjRtZW0oTUksIDIsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDg6DQorICAgIC8vIEFERFNTcm0sIEFERFNTcm1fSW50LCBDTVBTU3JtLCBDTVBTU3JtX2FsdCwgRElWU1NybSwgRElWU1NybV9JbnQsIElOU0UuLi4NCisgICAgcHJpbnRmMzJtZW0oTUksIDIsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDk6DQorICAgIC8vIEFFU0RFQ0xBU1RybSwgQUVTREVDcm0sIEFFU0VOQ0xBU1RybSwgQUVTRU5Dcm0sIEJMRU5EUERybWksIEJMRU5EUFNybWkuLi4NCisgICAgcHJpbnRpMTI4bWVtKE1JLCAyLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxMDoNCisgICAgLy8gQUVTSU1Dcm0sIEFFU0tFWUdFTkFTU0lTVDEyOHJtLCBDVlREUTJQU3JtLCBJbnRfQ1ZURFEyUFNybSwgSW50X1ZDVlREUS4uLg0KKyAgICBwcmludGkxMjhtZW0oTUksIDEsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDExOg0KKyAgICAvLyBBRVNJTUNyciwgQUVTS0VZR0VOQVNTSVNUMTI4cnIsIEJTRjE2cnIsIEJTRjMycnIsIEJTRjY0cnIsIEJTUjE2cnIsIEJTLi4uDQorICAgIHByaW50T3BlcmFuZChNSSwgMSwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMTI6DQorICAgIC8vIEJTRjE2cm0sIEJTUjE2cm0sIENNUDE2cm0sIElNVUwxNnJtaSwgSU1VTDE2cm1pOCwgTEFSMTZybSwgTEFSMzJybSwgTEEuLi4NCisgICAgcHJpbnRpMTZtZW0oTUksIDEsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDEzOg0KKyAgICAvLyBCU0YzMnJtLCBCU1IzMnJtLCBDTVAzMnJtLCBDVlRTSTJTRHJtLCBDVlRTSTJTU3JtLCBJTVVMMzJybWksIElNVUwzMnJtLi4uDQorICAgIHByaW50aTMybWVtKE1JLCAxLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxNDoNCisgICAgLy8gQlNGNjRybSwgQlNSNjRybSwgQ01QNjRybSwgQ1ZUU0kyU0Q2NHJtLCBDVlRTSTJTUzY0cm0sIElNVUw2NHJtaTMyLCBJTS4uLg0KKyAgICBwcmludGk2NG1lbShNSSwgMSwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMTU6DQorICAgIC8vIENNUDhybSwgTU9WOHJtLCBNT1Y4cm1fTk9SRVgsIE1PVlNYMTZybThXLCBNT1ZTWDMycm04LCBNT1ZTWDY0cm04LCBNT1YuLi4NCisgICAgcHJpbnRpOG1lbShNSSwgMSwgTyk7IA0KKyAgICBicmVhazsNCisgIGNhc2UgMTY6DQorICAgIC8vIENPTUlTRHJtLCBDT01JU1NybSwgQ1ZURFEyUERybSwgQ1ZUUEQyRFFybSwgQ1ZUUEQyUFNybSwgQ1ZUUFMyRFFybSwgQ1YuLi4NCisgICAgcHJpbnRmMTI4bWVtKE1JLCAxLCBPKTsgDQorICAgIGJyZWFrOw0KKyAgY2FzZSAxNzoNCisgICAgLy8gQ1ZUUFMyUERybSwgQ1ZUU0QyU1NybSwgQ1ZUVFNEMlNJNjRybSwgQ1ZUVFNEMlNJcm0sIEludF9DVlRQUzJQRHJtLCBJbi4uLg0KKyAgICBwcmludGY2NG1lbShNSSwgMSwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAxODoNCisgICAgLy8gQ1ZUU1MyU0RybSwgQ1ZUU1MyU0k2NHJtLCBDVlRTUzJTSXJtLCBDVlRUU1MyU0k2NHJtLCBDVlRUU1MyU0lybSwgSW50Xy4uLg0KKyAgICBwcmludGYzMm1lbShNSSwgMSwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAxOToNCisgICAgLy8gTERTMTZybSwgTERTMzJybSwgTEVTMTZybSwgTEVTMzJybSwgTEZTMTZybSwgTEZTMzJybSwgTEZTNjRybSwgTEdTMTZybS4uLg0KKyAgICBwcmludG9wYXF1ZW1lbShNSSwgMSwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyMDoNCisgICAgLy8gUk9VTkRQRG1fSW50LCBST1VORFBTbV9JbnQsIFZDVlRQRDJEUVlybSwgVkNWVFBEMlBTWXJtLCBWQ1ZUUFMyRFFZcm0sIC4uLg0KKyAgICBwcmludGYyNTZtZW0oTUksIDEsIE8pOyANCisgICAgYnJlYWs7DQorICBjYXNlIDIxOg0KKyAgICAvLyBWQ1ZURFEyUFNZcm0sIFZMRERRVVlybSwgVk1PVkRRQVlybSwgVk1PVkRRVVlybSwgVlBURVNUWXJtDQorICAgIHByaW50aTI1Nm1lbShNSSwgMSwgTyk7IA0KKyAgICByZXR1cm47DQorICAgIGJyZWFrOw0KKyAgY2FzZSAyMjoNCisgICAgLy8gVkVYVFJBQ1RGMTI4bXIsIFZNQVNLTU9WUERZbXIsIFZNQVNLTU9WUERtciwgVk1BU0tNT1ZQU1ltciwgVk1BU0tNT1ZQUy4uLg0KKyAgICBwcmludE9wZXJhbmQoTUksIDYsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgMjM6DQorICAgIC8vIFZSQ1BTU21fSW50LCBWUkNQU1NyX0ludCwgVlJTUVJUU1NtX0ludCwgVlJTUVJUU1NyX0ludCwgVlNRUlRTRG1fSW50LCAuLi4NCisgICAgcHJpbnRPcGVyYW5kKE1JLCAwLCBPKTsgDQorICAgIE8gPDwgIiwgIjsgDQorICAgIGJyZWFrOw0KKyAgfQ0KKw0KKyAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsNCisgIGNhc2UgWDg2OjpBREMxNm1pOg0KKyAgY2FzZSBYODY6OkFEQzE2bWk4Og0KKyAgY2FzZSBYODY6OkFEQzE2bXI6DQorICBjYXNlIFg4Njo6QURDMTZyaToNCisgIGNhc2UgWDg2OjpBREMxNnJpODoNCisgIGNhc2UgWDg2OjpBREMxNnJtOg0KKyAgY2FzZSBYODY6OkFEQzE2cnI6DQorICBjYXNlIFg4Njo6QURDMTZycl9SRVY6DQorICBjYXNlIFg4Njo6QURDMzJtaToNCisgIGNhc2UgWDg2OjpBREMzMm1pODoNCisgIGNhc2UgWDg2OjpBREMzMm1yOg0KKyAgY2FzZSBYODY6OkFEQzMycmk6DQorICBjYXNlIFg4Njo6QURDMzJyaTg6DQorICBjYXNlIFg4Njo6QURDMzJybToNCisgIGNhc2UgWDg2OjpBREMzMnJyOg0KKyAgY2FzZSBYODY6OkFEQzMycnJfUkVWOg0KKyAgY2FzZSBYODY6OkFEQzY0bWkzMjoNCisgIGNhc2UgWDg2OjpBREM2NG1pODoNCisgIGNhc2UgWDg2OjpBREM2NG1yOg0KKyAgY2FzZSBYODY6OkFEQzY0cmkzMjoNCisgIGNhc2UgWDg2OjpBREM2NHJpODoNCisgIGNhc2UgWDg2OjpBREM2NHJtOg0KKyAgY2FzZSBYODY6OkFEQzY0cnI6DQorICBjYXNlIFg4Njo6QURDNjRycl9SRVY6DQorICBjYXNlIFg4Njo6QURDOG1pOg0KKyAgY2FzZSBYODY6OkFEQzhtcjoNCisgIGNhc2UgWDg2OjpBREM4cmk6DQorICBjYXNlIFg4Njo6QURDOHJtOg0KKyAgY2FzZSBYODY6OkFEQzhycjoNCisgIGNhc2UgWDg2OjpBREM4cnJfUkVWOg0KKyAgY2FzZSBYODY6OkFERDE2bWk6DQorICBjYXNlIFg4Njo6QUREMTZtaTg6DQorICBjYXNlIFg4Njo6QUREMTZtcjoNCisgIGNhc2UgWDg2OjpBREQxNnJpOg0KKyAgY2FzZSBYODY6OkFERDE2cmk4Og0KKyAgY2FzZSBYODY6OkFERDE2cm06DQorICBjYXNlIFg4Njo6QUREMTZycjoNCisgIGNhc2UgWDg2OjpBREQxNnJyX2FsdDoNCisgIGNhc2UgWDg2OjpBREQzMm1pOg0KKyAgY2FzZSBYODY6OkFERDMybWk4Og0KKyAgY2FzZSBYODY6OkFERDMybXI6DQorICBjYXNlIFg4Njo6QUREMzJyaToNCisgIGNhc2UgWDg2OjpBREQzMnJpODoNCisgIGNhc2UgWDg2OjpBREQzMnJtOg0KKyAgY2FzZSBYODY6OkFERDMycnI6DQorICBjYXNlIFg4Njo6QUREMzJycl9hbHQ6DQorICBjYXNlIFg4Njo6QURENjRtaTMyOg0KKyAgY2FzZSBYODY6OkFERDY0bWk4Og0KKyAgY2FzZSBYODY6OkFERDY0bXI6DQorICBjYXNlIFg4Njo6QURENjRyaTMyOg0KKyAgY2FzZSBYODY6OkFERDY0cmk4Og0KKyAgY2FzZSBYODY6OkFERDY0cm06DQorICBjYXNlIFg4Njo6QURENjRycjoNCisgIGNhc2UgWDg2OjpBREQ2NHJyX2FsdDoNCisgIGNhc2UgWDg2OjpBREQ4bWk6DQorICBjYXNlIFg4Njo6QUREOG1yOg0KKyAgY2FzZSBYODY6OkFERDhyaToNCisgIGNhc2UgWDg2OjpBREQ4cm06DQorICBjYXNlIFg4Njo6QUREOHJyOg0KKyAgY2FzZSBYODY6OkFERDhycl9hbHQ6DQorICBjYXNlIFg4Njo6QUREUERybToNCisgIGNhc2UgWDg2OjpBRERQRHJyOg0KKyAgY2FzZSBYODY6OkFERFBTcm06DQorICBjYXNlIFg4Njo6QUREUFNycjoNCisgIGNhc2UgWDg2OjpBRERTRHJtOg0KKyAgY2FzZSBYODY6OkFERFNEcm1fSW50Og0KKyAgY2FzZSBYODY6OkFERFNEcnI6DQorICBjYXNlIFg4Njo6QUREU0Rycl9JbnQ6DQorICBjYXNlIFg4Njo6QUREU1NybToNCisgIGNhc2UgWDg2OjpBRERTU3JtX0ludDoNCisgIGNhc2UgWDg2OjpBRERTU3JyOg0KKyAgY2FzZSBYODY6OkFERFNTcnJfSW50Og0KKyAgY2FzZSBYODY6OkFERFNVQlBEcm06DQorICBjYXNlIFg4Njo6QUREU1VCUERycjoNCisgIGNhc2UgWDg2OjpBRERTVUJQU3JtOg0KKyAgY2FzZSBYODY6OkFERFNVQlBTcnI6DQorICBjYXNlIFg4Njo6QUVTREVDTEFTVHJtOg0KKyAgY2FzZSBYODY6OkFFU0RFQ0xBU1RycjoNCisgIGNhc2UgWDg2OjpBRVNERUNybToNCisgIGNhc2UgWDg2OjpBRVNERUNycjoNCisgIGNhc2UgWDg2OjpBRVNFTkNMQVNUcm06DQorICBjYXNlIFg4Njo6QUVTRU5DTEFTVHJyOg0KKyAgY2FzZSBYODY6OkFFU0VOQ3JtOg0KKyAgY2FzZSBYODY6OkFFU0VOQ3JyOg0KKyAgY2FzZSBYODY6OkFFU0lNQ3JtOg0KKyAgY2FzZSBYODY6OkFFU0lNQ3JyOg0KKyAgY2FzZSBYODY6OkFORDE2bWk6DQorICBjYXNlIFg4Njo6QU5EMTZtaTg6DQorICBjYXNlIFg4Njo6QU5EMTZtcjoNCisgIGNhc2UgWDg2OjpBTkQxNnJpOg0KKyAgY2FzZSBYODY6OkFORDE2cmk4Og0KKyAgY2FzZSBYODY6OkFORDE2cm06DQorICBjYXNlIFg4Njo6QU5EMTZycjoNCisgIGNhc2UgWDg2OjpBTkQxNnJyX1JFVjoNCisgIGNhc2UgWDg2OjpBTkQzMm1pOg0KKyAgY2FzZSBYODY6OkFORDMybWk4Og0KKyAgY2FzZSBYODY6OkFORDMybXI6DQorICBjYXNlIFg4Njo6QU5EMzJyaToNCisgIGNhc2UgWDg2OjpBTkQzMnJpODoNCisgIGNhc2UgWDg2OjpBTkQzMnJtOg0KKyAgY2FzZSBYODY6OkFORDMycnI6DQorICBjYXNlIFg4Njo6QU5EMzJycl9SRVY6DQorICBjYXNlIFg4Njo6QU5ENjRtaTMyOg0KKyAgY2FzZSBYODY6OkFORDY0bWk4Og0KKyAgY2FzZSBYODY6OkFORDY0bXI6DQorICBjYXNlIFg4Njo6QU5ENjRyaTMyOg0KKyAgY2FzZSBYODY6OkFORDY0cmk4Og0KKyAgY2FzZSBYODY6OkFORDY0cm06DQorICBjYXNlIFg4Njo6QU5ENjRycjoNCisgIGNhc2UgWDg2OjpBTkQ2NHJyX1JFVjoNCisgIGNhc2UgWDg2OjpBTkQ4bWk6DQorICBjYXNlIFg4Njo6QU5EOG1yOg0KKyAgY2FzZSBYODY6OkFORDhyaToNCisgIGNhc2UgWDg2OjpBTkQ4cm06DQorICBjYXNlIFg4Njo6QU5EOHJyOg0KKyAgY2FzZSBYODY6OkFORDhycl9SRVY6DQorICBjYXNlIFg4Njo6QU5ETlBEcm06DQorICBjYXNlIFg4Njo6QU5ETlBEcnI6DQorICBjYXNlIFg4Njo6QU5ETlBTcm06DQorICBjYXNlIFg4Njo6QU5ETlBTcnI6DQorICBjYXNlIFg4Njo6QU5EUERybToNCisgIGNhc2UgWDg2OjpBTkRQRHJyOg0KKyAgY2FzZSBYODY6OkFORFBTcm06DQorICBjYXNlIFg4Njo6QU5EUFNycjoNCisgIGNhc2UgWDg2OjpCU0YxNnJtOg0KKyAgY2FzZSBYODY6OkJTRjE2cnI6DQorICBjYXNlIFg4Njo6QlNGMzJybToNCisgIGNhc2UgWDg2OjpCU0YzMnJyOg0KKyAgY2FzZSBYODY6OkJTRjY0cm06DQorICBjYXNlIFg4Njo6QlNGNjRycjoNCisgIGNhc2UgWDg2OjpCU1IxNnJtOg0KKyAgY2FzZSBYODY6OkJTUjE2cnI6DQorICBjYXNlIFg4Njo6QlNSMzJybToNCisgIGNhc2UgWDg2OjpCU1IzMnJyOg0KKyAgY2FzZSBYODY6OkJTUjY0cm06DQorICBjYXNlIFg4Njo6QlNSNjRycjoNCisgIGNhc2UgWDg2OjpCVDE2bWk4Og0KKyAgY2FzZSBYODY6OkJUMTZtcjoNCisgIGNhc2UgWDg2OjpCVDE2cmk4Og0KKyAgY2FzZSBYODY6OkJUMTZycjoNCisgIGNhc2UgWDg2OjpCVDMybWk4Og0KKyAgY2FzZSBYODY6OkJUMzJtcjoNCisgIGNhc2UgWDg2OjpCVDMycmk4Og0KKyAgY2FzZSBYODY6OkJUMzJycjoNCisgIGNhc2UgWDg2OjpCVDY0bWk4Og0KKyAgY2FzZSBYODY6OkJUNjRtcjoNCisgIGNhc2UgWDg2OjpCVDY0cmk4Og0KKyAgY2FzZSBYODY6OkJUNjRycjoNCisgIGNhc2UgWDg2OjpCVEMxNm1pODoNCisgIGNhc2UgWDg2OjpCVEMxNm1yOg0KKyAgY2FzZSBYODY6OkJUQzE2cmk4Og0KKyAgY2FzZSBYODY6OkJUQzE2cnI6DQorICBjYXNlIFg4Njo6QlRDMzJtaTg6DQorICBjYXNlIFg4Njo6QlRDMzJtcjoNCisgIGNhc2UgWDg2OjpCVEMzMnJpODoNCisgIGNhc2UgWDg2OjpCVEMzMnJyOg0KKyAgY2FzZSBYODY6OkJUQzY0bWk4Og0KKyAgY2FzZSBYODY6OkJUQzY0bXI6DQorICBjYXNlIFg4Njo6QlRDNjRyaTg6DQorICBjYXNlIFg4Njo6QlRDNjRycjoNCisgIGNhc2UgWDg2OjpCVFIxNm1pODoNCisgIGNhc2UgWDg2OjpCVFIxNm1yOg0KKyAgY2FzZSBYODY6OkJUUjE2cmk4Og0KKyAgY2FzZSBYODY6OkJUUjE2cnI6DQorICBjYXNlIFg4Njo6QlRSMzJtaTg6DQorICBjYXNlIFg4Njo6QlRSMzJtcjoNCisgIGNhc2UgWDg2OjpCVFIzMnJpODoNCisgIGNhc2UgWDg2OjpCVFIzMnJyOg0KKyAgY2FzZSBYODY6OkJUUjY0bWk4Og0KKyAgY2FzZSBYODY6OkJUUjY0bXI6DQorICBjYXNlIFg4Njo6QlRSNjRyaTg6DQorICBjYXNlIFg4Njo6QlRSNjRycjoNCisgIGNhc2UgWDg2OjpCVFMxNm1pODoNCisgIGNhc2UgWDg2OjpCVFMxNm1yOg0KKyAgY2FzZSBYODY6OkJUUzE2cmk4Og0KKyAgY2FzZSBYODY6OkJUUzE2cnI6DQorICBjYXNlIFg4Njo6QlRTMzJtaTg6DQorICBjYXNlIFg4Njo6QlRTMzJtcjoNCisgIGNhc2UgWDg2OjpCVFMzMnJpODoNCisgIGNhc2UgWDg2OjpCVFMzMnJyOg0KKyAgY2FzZSBYODY6OkJUUzY0bWk4Og0KKyAgY2FzZSBYODY6OkJUUzY0bXI6DQorICBjYXNlIFg4Njo6QlRTNjRyaTg6DQorICBjYXNlIFg4Njo6QlRTNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WQTE2cm06DQorICBjYXNlIFg4Njo6Q01PVkExNnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZBMzJybToNCisgIGNhc2UgWDg2OjpDTU9WQTMycnI6DQorICBjYXNlIFg4Njo6Q01PVkE2NHJtOg0KKyAgY2FzZSBYODY6OkNNT1ZBNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WQUUxNnJtOg0KKyAgY2FzZSBYODY6OkNNT1ZBRTE2cnI6DQorICBjYXNlIFg4Njo6Q01PVkFFMzJybToNCisgIGNhc2UgWDg2OjpDTU9WQUUzMnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZBRTY0cm06DQorICBjYXNlIFg4Njo6Q01PVkFFNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WQjE2cm06DQorICBjYXNlIFg4Njo6Q01PVkIxNnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZCMzJybToNCisgIGNhc2UgWDg2OjpDTU9WQjMycnI6DQorICBjYXNlIFg4Njo6Q01PVkI2NHJtOg0KKyAgY2FzZSBYODY6OkNNT1ZCNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WQkUxNnJtOg0KKyAgY2FzZSBYODY6OkNNT1ZCRTE2cnI6DQorICBjYXNlIFg4Njo6Q01PVkJFMzJybToNCisgIGNhc2UgWDg2OjpDTU9WQkUzMnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZCRTY0cm06DQorICBjYXNlIFg4Njo6Q01PVkJFNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WRTE2cm06DQorICBjYXNlIFg4Njo6Q01PVkUxNnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZFMzJybToNCisgIGNhc2UgWDg2OjpDTU9WRTMycnI6DQorICBjYXNlIFg4Njo6Q01PVkU2NHJtOg0KKyAgY2FzZSBYODY6OkNNT1ZFNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WRzE2cm06DQorICBjYXNlIFg4Njo6Q01PVkcxNnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZHMzJybToNCisgIGNhc2UgWDg2OjpDTU9WRzMycnI6DQorICBjYXNlIFg4Njo6Q01PVkc2NHJtOg0KKyAgY2FzZSBYODY6OkNNT1ZHNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WR0UxNnJtOg0KKyAgY2FzZSBYODY6OkNNT1ZHRTE2cnI6DQorICBjYXNlIFg4Njo6Q01PVkdFMzJybToNCisgIGNhc2UgWDg2OjpDTU9WR0UzMnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZHRTY0cm06DQorICBjYXNlIFg4Njo6Q01PVkdFNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WTDE2cm06DQorICBjYXNlIFg4Njo6Q01PVkwxNnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZMMzJybToNCisgIGNhc2UgWDg2OjpDTU9WTDMycnI6DQorICBjYXNlIFg4Njo6Q01PVkw2NHJtOg0KKyAgY2FzZSBYODY6OkNNT1ZMNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WTEUxNnJtOg0KKyAgY2FzZSBYODY6OkNNT1ZMRTE2cnI6DQorICBjYXNlIFg4Njo6Q01PVkxFMzJybToNCisgIGNhc2UgWDg2OjpDTU9WTEUzMnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZMRTY0cm06DQorICBjYXNlIFg4Njo6Q01PVkxFNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WTkUxNnJtOg0KKyAgY2FzZSBYODY6OkNNT1ZORTE2cnI6DQorICBjYXNlIFg4Njo6Q01PVk5FMzJybToNCisgIGNhc2UgWDg2OjpDTU9WTkUzMnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZORTY0cm06DQorICBjYXNlIFg4Njo6Q01PVk5FNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WTk8xNnJtOg0KKyAgY2FzZSBYODY6OkNNT1ZOTzE2cnI6DQorICBjYXNlIFg4Njo6Q01PVk5PMzJybToNCisgIGNhc2UgWDg2OjpDTU9WTk8zMnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZOTzY0cm06DQorICBjYXNlIFg4Njo6Q01PVk5PNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WTlAxNnJtOg0KKyAgY2FzZSBYODY6OkNNT1ZOUDE2cnI6DQorICBjYXNlIFg4Njo6Q01PVk5QMzJybToNCisgIGNhc2UgWDg2OjpDTU9WTlAzMnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZOUDY0cm06DQorICBjYXNlIFg4Njo6Q01PVk5QNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WTlMxNnJtOg0KKyAgY2FzZSBYODY6OkNNT1ZOUzE2cnI6DQorICBjYXNlIFg4Njo6Q01PVk5TMzJybToNCisgIGNhc2UgWDg2OjpDTU9WTlMzMnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZOUzY0cm06DQorICBjYXNlIFg4Njo6Q01PVk5TNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WTzE2cm06DQorICBjYXNlIFg4Njo6Q01PVk8xNnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZPMzJybToNCisgIGNhc2UgWDg2OjpDTU9WTzMycnI6DQorICBjYXNlIFg4Njo6Q01PVk82NHJtOg0KKyAgY2FzZSBYODY6OkNNT1ZPNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WUDE2cm06DQorICBjYXNlIFg4Njo6Q01PVlAxNnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZQMzJybToNCisgIGNhc2UgWDg2OjpDTU9WUDMycnI6DQorICBjYXNlIFg4Njo6Q01PVlA2NHJtOg0KKyAgY2FzZSBYODY6OkNNT1ZQNjRycjoNCisgIGNhc2UgWDg2OjpDTU9WUzE2cm06DQorICBjYXNlIFg4Njo6Q01PVlMxNnJyOg0KKyAgY2FzZSBYODY6OkNNT1ZTMzJybToNCisgIGNhc2UgWDg2OjpDTU9WUzMycnI6DQorICBjYXNlIFg4Njo6Q01PVlM2NHJtOg0KKyAgY2FzZSBYODY6OkNNT1ZTNjRycjoNCisgIGNhc2UgWDg2OjpDTVAxNm1pOg0KKyAgY2FzZSBYODY6OkNNUDE2bWk4Og0KKyAgY2FzZSBYODY6OkNNUDE2bXI6DQorICBjYXNlIFg4Njo6Q01QMTZyaToNCisgIGNhc2UgWDg2OjpDTVAxNnJpODoNCisgIGNhc2UgWDg2OjpDTVAxNnJtOg0KKyAgY2FzZSBYODY6OkNNUDE2cnI6DQorICBjYXNlIFg4Njo6Q01QMTZycl9hbHQ6DQorICBjYXNlIFg4Njo6Q01QMzJtaToNCisgIGNhc2UgWDg2OjpDTVAzMm1pODoNCisgIGNhc2UgWDg2OjpDTVAzMm1yOg0KKyAgY2FzZSBYODY6OkNNUDMycmk6DQorICBjYXNlIFg4Njo6Q01QMzJyaTg6DQorICBjYXNlIFg4Njo6Q01QMzJybToNCisgIGNhc2UgWDg2OjpDTVAzMnJyOg0KKyAgY2FzZSBYODY6OkNNUDMycnJfYWx0Og0KKyAgY2FzZSBYODY6OkNNUDY0bWkzMjoNCisgIGNhc2UgWDg2OjpDTVA2NG1pODoNCisgIGNhc2UgWDg2OjpDTVA2NG1yOg0KKyAgY2FzZSBYODY6OkNNUDY0bXJtcnI6DQorICBjYXNlIFg4Njo6Q01QNjRyaTMyOg0KKyAgY2FzZSBYODY6OkNNUDY0cmk4Og0KKyAgY2FzZSBYODY6OkNNUDY0cm06DQorICBjYXNlIFg4Njo6Q01QNjRycjoNCisgIGNhc2UgWDg2OjpDTVA4bWk6DQorICBjYXNlIFg4Njo6Q01QOG1yOg0KKyAgY2FzZSBYODY6OkNNUDhyaToNCisgIGNhc2UgWDg2OjpDTVA4cm06DQorICBjYXNlIFg4Njo6Q01QOHJyOg0KKyAgY2FzZSBYODY6OkNNUDhycl9hbHQ6DQorICBjYXNlIFg4Njo6Q01QUERybWk6DQorICBjYXNlIFg4Njo6Q01QUERycmk6DQorICBjYXNlIFg4Njo6Q01QUFNybWk6DQorICBjYXNlIFg4Njo6Q01QUFNycmk6DQorICBjYXNlIFg4Njo6Q01QU0RybToNCisgIGNhc2UgWDg2OjpDTVBTRHJyOg0KKyAgY2FzZSBYODY6OkNNUFNTcm06DQorICBjYXNlIFg4Njo6Q01QU1NycjoNCisgIGNhc2UgWDg2OjpDTVBYQ0hHMTZybToNCisgIGNhc2UgWDg2OjpDTVBYQ0hHMTZycjoNCisgIGNhc2UgWDg2OjpDTVBYQ0hHMzJybToNCisgIGNhc2UgWDg2OjpDTVBYQ0hHMzJycjoNCisgIGNhc2UgWDg2OjpDTVBYQ0hHNjRybToNCisgIGNhc2UgWDg2OjpDTVBYQ0hHNjRycjoNCisgIGNhc2UgWDg2OjpDTVBYQ0hHOHJtOg0KKyAgY2FzZSBYODY6OkNNUFhDSEc4cnI6DQorICBjYXNlIFg4Njo6Q09NSVNEcm06DQorICBjYXNlIFg4Njo6Q09NSVNEcnI6DQorICBjYXNlIFg4Njo6Q09NSVNTcm06DQorICBjYXNlIFg4Njo6Q09NSVNTcnI6DQorICBjYXNlIFg4Njo6Q1ZURFEyUERybToNCisgIGNhc2UgWDg2OjpDVlREUTJQRHJyOg0KKyAgY2FzZSBYODY6OkNWVERRMlBTcm06DQorICBjYXNlIFg4Njo6Q1ZURFEyUFNycjoNCisgIGNhc2UgWDg2OjpDVlRQRDJEUXJtOg0KKyAgY2FzZSBYODY6OkNWVFBEMkRRcnI6DQorICBjYXNlIFg4Njo6Q1ZUUEQyUFNybToNCisgIGNhc2UgWDg2OjpDVlRQRDJQU3JyOg0KKyAgY2FzZSBYODY6OkNWVFBTMkRRcm06DQorICBjYXNlIFg4Njo6Q1ZUUFMyRFFycjoNCisgIGNhc2UgWDg2OjpDVlRQUzJQRHJyOg0KKyAgY2FzZSBYODY6OkNWVFNEMlNTcnI6DQorICBjYXNlIFg4Njo6Q1ZUU0kyU0Q2NHJtOg0KKyAgY2FzZSBYODY6OkNWVFNJMlNENjRycjoNCisgIGNhc2UgWDg2OjpDVlRTSTJTRHJtOg0KKyAgY2FzZSBYODY6OkNWVFNJMlNEcnI6DQorICBjYXNlIFg4Njo6Q1ZUU0kyU1M2NHJtOg0KKyAgY2FzZSBYODY6OkNWVFNJMlNTNjRycjoNCisgIGNhc2UgWDg2OjpDVlRTSTJTU3JtOg0KKyAgY2FzZSBYODY6OkNWVFNJMlNTcnI6DQorICBjYXNlIFg4Njo6Q1ZUU1MyU0RycjoNCisgIGNhc2UgWDg2OjpDVlRTUzJTSTY0cnI6DQorICBjYXNlIFg4Njo6Q1ZUU1MyU0lycjoNCisgIGNhc2UgWDg2OjpDVlRUUFMyRFFybToNCisgIGNhc2UgWDg2OjpDVlRUUFMyRFFycjoNCisgIGNhc2UgWDg2OjpDVlRUU0QyU0k2NHJyOg0KKyAgY2FzZSBYODY6OkNWVFRTRDJTSXJyOg0KKyAgY2FzZSBYODY6OkNWVFRTUzJTSTY0cnI6DQorICBjYXNlIFg4Njo6Q1ZUVFNTMlNJcnI6DQorICBjYXNlIFg4Njo6RElWUERybToNCisgIGNhc2UgWDg2OjpESVZQRHJyOg0KKyAgY2FzZSBYODY6OkRJVlBTcm06DQorICBjYXNlIFg4Njo6RElWUFNycjoNCisgIGNhc2UgWDg2OjpESVZTRHJtOg0KKyAgY2FzZSBYODY6OkRJVlNEcm1fSW50Og0KKyAgY2FzZSBYODY6OkRJVlNEcnI6DQorICBjYXNlIFg4Njo6RElWU0Rycl9JbnQ6DQorICBjYXNlIFg4Njo6RElWU1NybToNCisgIGNhc2UgWDg2OjpESVZTU3JtX0ludDoNCisgIGNhc2UgWDg2OjpESVZTU3JyOg0KKyAgY2FzZSBYODY6OkRJVlNTcnJfSW50Og0KKyAgY2FzZSBYODY6OkVOVEVSOg0KKyAgY2FzZSBYODY6OkZBUkNBTEwxNmk6DQorICBjYXNlIFg4Njo6RkFSQ0FMTDMyaToNCisgIGNhc2UgWDg2OjpGQVJKTVAxNmk6DQorICBjYXNlIFg4Njo6RkFSSk1QMzJpOg0KKyAgY2FzZSBYODY6OkZzQU5ETlBEcm06DQorICBjYXNlIFg4Njo6RnNBTkROUERycjoNCisgIGNhc2UgWDg2OjpGc0FORE5QU3JtOg0KKyAgY2FzZSBYODY6OkZzQU5ETlBTcnI6DQorICBjYXNlIFg4Njo6RnNBTkRQRHJtOg0KKyAgY2FzZSBYODY6OkZzQU5EUERycjoNCisgIGNhc2UgWDg2OjpGc0FORFBTcm06DQorICBjYXNlIFg4Njo6RnNBTkRQU3JyOg0KKyAgY2FzZSBYODY6OkZzTU9WQVBEcm06DQorICBjYXNlIFg4Njo6RnNNT1ZBUERycjoNCisgIGNhc2UgWDg2OjpGc01PVkFQU3JtOg0KKyAgY2FzZSBYODY6OkZzTU9WQVBTcnI6DQorICBjYXNlIFg4Njo6RnNPUlBEcm06DQorICBjYXNlIFg4Njo6RnNPUlBEcnI6DQorICBjYXNlIFg4Njo6RnNPUlBTcm06DQorICBjYXNlIFg4Njo6RnNPUlBTcnI6DQorICBjYXNlIFg4Njo6RnNYT1JQRHJtOg0KKyAgY2FzZSBYODY6OkZzWE9SUERycjoNCisgIGNhc2UgWDg2OjpGc1hPUlBTcm06DQorICBjYXNlIFg4Njo6RnNYT1JQU3JyOg0KKyAgY2FzZSBYODY6OkhBRERQRHJtOg0KKyAgY2FzZSBYODY6OkhBRERQRHJyOg0KKyAgY2FzZSBYODY6OkhBRERQU3JtOg0KKyAgY2FzZSBYODY6OkhBRERQU3JyOg0KKyAgY2FzZSBYODY6OkhTVUJQRHJtOg0KKyAgY2FzZSBYODY6OkhTVUJQRHJyOg0KKyAgY2FzZSBYODY6OkhTVUJQU3JtOg0KKyAgY2FzZSBYODY6OkhTVUJQU3JyOg0KKyAgY2FzZSBYODY6OklNVUwxNnJtOg0KKyAgY2FzZSBYODY6OklNVUwxNnJyOg0KKyAgY2FzZSBYODY6OklNVUwzMnJtOg0KKyAgY2FzZSBYODY6OklNVUwzMnJyOg0KKyAgY2FzZSBYODY6OklNVUw2NHJtOg0KKyAgY2FzZSBYODY6OklNVUw2NHJyOg0KKyAgY2FzZSBYODY6OkludF9DTVBTRHJtOg0KKyAgY2FzZSBYODY6OkludF9DTVBTRHJyOg0KKyAgY2FzZSBYODY6OkludF9DTVBTU3JtOg0KKyAgY2FzZSBYODY6OkludF9DTVBTU3JyOg0KKyAgY2FzZSBYODY6OkludF9DT01JU0RybToNCisgIGNhc2UgWDg2OjpJbnRfQ09NSVNEcnI6DQorICBjYXNlIFg4Njo6SW50X0NPTUlTU3JtOg0KKyAgY2FzZSBYODY6OkludF9DT01JU1NycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZURFEyUERybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZURFEyUERycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZURFEyUFNybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZURFEyUFNycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEQyRFFybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEQyRFFycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEQyUElybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEQyUElycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEQyUFNybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEQyUFNycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEkyUERybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEkyUERycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEkyUFNybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUEkyUFNycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUFMyRFFybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUFMyRFFycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUFMyUERycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUUFMyUElycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUU0QyU0k2NHJtOg0KKyAgY2FzZSBYODY6OkludF9DVlRTRDJTSTY0cnI6DQorICBjYXNlIFg4Njo6SW50X0NWVFNEMlNJcm06DQorICBjYXNlIFg4Njo6SW50X0NWVFNEMlNJcnI6DQorICBjYXNlIFg4Njo6SW50X0NWVFNEMlNTcm06DQorICBjYXNlIFg4Njo6SW50X0NWVFNEMlNTcnI6DQorICBjYXNlIFg4Njo6SW50X0NWVFNJMlNENjRybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUU0kyU0Q2NHJyOg0KKyAgY2FzZSBYODY6OkludF9DVlRTSTJTRHJtOg0KKyAgY2FzZSBYODY6OkludF9DVlRTSTJTRHJyOg0KKyAgY2FzZSBYODY6OkludF9DVlRTSTJTUzY0cm06DQorICBjYXNlIFg4Njo6SW50X0NWVFNJMlNTNjRycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUU0kyU1NybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUU0kyU1NycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUU1MyU0RybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUU1MyU0RycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUU1MyU0k2NHJyOg0KKyAgY2FzZSBYODY6OkludF9DVlRTUzJTSXJyOg0KKyAgY2FzZSBYODY6OkludF9DVlRUUEQyRFFybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUVFBEMkRRcnI6DQorICBjYXNlIFg4Njo6SW50X0NWVFRQRDJQSXJtOg0KKyAgY2FzZSBYODY6OkludF9DVlRUUEQyUElycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUVFBTMkRRcm06DQorICBjYXNlIFg4Njo6SW50X0NWVFRQUzJEUXJyOg0KKyAgY2FzZSBYODY6OkludF9DVlRUUFMyUElycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUVFNEMlNJNjRybToNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUVFNEMlNJNjRycjoNCisgIGNhc2UgWDg2OjpJbnRfQ1ZUVFNEMlNJcm06DQorICBjYXNlIFg4Njo6SW50X0NWVFRTRDJTSXJyOg0KKyAgY2FzZSBYODY6OkludF9DVlRUU1MyU0k2NHJyOg0KKyAgY2FzZSBYODY6OkludF9DVlRUU1MyU0lycjoNCisgIGNhc2UgWDg2OjpJbnRfVUNPTUlTRHJtOg0KKyAgY2FzZSBYODY6OkludF9VQ09NSVNEcnI6DQorICBjYXNlIFg4Njo6SW50X1VDT01JU1NybToNCisgIGNhc2UgWDg2OjpJbnRfVUNPTUlTU3JyOg0KKyAgY2FzZSBYODY6OkludF9WQ09NSVNEcm06DQorICBjYXNlIFg4Njo6SW50X1ZDT01JU0RycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNPTUlTU3JtOg0KKyAgY2FzZSBYODY6OkludF9WQ09NSVNTcnI6DQorICBjYXNlIFg4Njo6SW50X1ZDVlREUTJQRHJtOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZURFEyUERycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVERRMlBTcm06DQorICBjYXNlIFg4Njo6SW50X1ZDVlREUTJQU3JyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUUEQyRFFybToNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFBEMkRRcnI6DQorICBjYXNlIFg4Njo6SW50X1ZDVlRQRDJQU3JtOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUUEQyUFNycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFBTMkRRcm06DQorICBjYXNlIFg4Njo6SW50X1ZDVlRQUzJEUXJyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUUFMyUERycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNEMlNJNjRybToNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNEMlNJNjRycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNEMlNJcm06DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTRDJTSXJyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUU1MyU0k2NHJyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUU1MyU0lycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFRQRDJEUXJtOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUVFBEMkRRcnI6DQorICBjYXNlIFg4Njo6SW50X1ZDVlRUUFMyRFFybToNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFRQUzJEUXJyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUVFNEMlNJNjRybToNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFRTRDJTSTY0cnI6DQorICBjYXNlIFg4Njo6SW50X1ZDVlRUU0QyU0lybToNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFRTRDJTSXJyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUVFNTMlNJNjRycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFRTUzJTSXJyOg0KKyAgY2FzZSBYODY6OkludF9WVUNPTUlTRHJtOg0KKyAgY2FzZSBYODY6OkludF9WVUNPTUlTRHJyOg0KKyAgY2FzZSBYODY6OkludF9WVUNPTUlTU3JtOg0KKyAgY2FzZSBYODY6OkludF9WVUNPTUlTU3JyOg0KKyAgY2FzZSBYODY6OkxBUjE2cm06DQorICBjYXNlIFg4Njo6TEFSMTZycjoNCisgIGNhc2UgWDg2OjpMQVIzMnJtOg0KKyAgY2FzZSBYODY6OkxBUjMycnI6DQorICBjYXNlIFg4Njo6TEFSNjRybToNCisgIGNhc2UgWDg2OjpMQVI2NHJyOg0KKyAgY2FzZSBYODY6OkxDTVBYQ0hHMTY6DQorICBjYXNlIFg4Njo6TENNUFhDSEczMjoNCisgIGNhc2UgWDg2OjpMQ01QWENIRzg6DQorICBjYXNlIFg4Njo6TEREUVVybToNCisgIGNhc2UgWDg2OjpMRUExNnI6DQorICBjYXNlIFg4Njo6TEVBMzJyOg0KKyAgY2FzZSBYODY6OkxFQTY0XzMycjoNCisgIGNhc2UgWDg2OjpMRUE2NHI6DQorICBjYXNlIFg4Njo6TE9DS19BREQxNm1pOg0KKyAgY2FzZSBYODY6OkxPQ0tfQUREMTZtaTg6DQorICBjYXNlIFg4Njo6TE9DS19BREQxNm1yOg0KKyAgY2FzZSBYODY6OkxPQ0tfQUREMzJtaToNCisgIGNhc2UgWDg2OjpMT0NLX0FERDMybWk4Og0KKyAgY2FzZSBYODY6OkxPQ0tfQUREMzJtcjoNCisgIGNhc2UgWDg2OjpMT0NLX0FERDY0bWkzMjoNCisgIGNhc2UgWDg2OjpMT0NLX0FERDY0bWk4Og0KKyAgY2FzZSBYODY6OkxPQ0tfQURENjRtcjoNCisgIGNhc2UgWDg2OjpMT0NLX0FERDhtaToNCisgIGNhc2UgWDg2OjpMT0NLX0FERDhtcjoNCisgIGNhc2UgWDg2OjpMT0NLX1NVQjE2bWk6DQorICBjYXNlIFg4Njo6TE9DS19TVUIxNm1pODoNCisgIGNhc2UgWDg2OjpMT0NLX1NVQjE2bXI6DQorICBjYXNlIFg4Njo6TE9DS19TVUIzMm1pOg0KKyAgY2FzZSBYODY6OkxPQ0tfU1VCMzJtaTg6DQorICBjYXNlIFg4Njo6TE9DS19TVUIzMm1yOg0KKyAgY2FzZSBYODY6OkxPQ0tfU1VCNjRtaTMyOg0KKyAgY2FzZSBYODY6OkxPQ0tfU1VCNjRtaTg6DQorICBjYXNlIFg4Njo6TE9DS19TVUI2NG1yOg0KKyAgY2FzZSBYODY6OkxPQ0tfU1VCOG1pOg0KKyAgY2FzZSBYODY6OkxPQ0tfU1VCOG1yOg0KKyAgY2FzZSBYODY6OkxTTDE2cm06DQorICBjYXNlIFg4Njo6TFNMMTZycjoNCisgIGNhc2UgWDg2OjpMU0wzMnJtOg0KKyAgY2FzZSBYODY6OkxTTDMycnI6DQorICBjYXNlIFg4Njo6TFNMNjRybToNCisgIGNhc2UgWDg2OjpMU0w2NHJyOg0KKyAgY2FzZSBYODY6Ok1BU0tNT1ZEUVU6DQorICBjYXNlIFg4Njo6TUFTS01PVkRRVTY0Og0KKyAgY2FzZSBYODY6Ok1BWFBEcm06DQorICBjYXNlIFg4Njo6TUFYUERybV9JbnQ6DQorICBjYXNlIFg4Njo6TUFYUERycjoNCisgIGNhc2UgWDg2OjpNQVhQRHJyX0ludDoNCisgIGNhc2UgWDg2OjpNQVhQU3JtOg0KKyAgY2FzZSBYODY6Ok1BWFBTcm1fSW50Og0KKyAgY2FzZSBYODY6Ok1BWFBTcnI6DQorICBjYXNlIFg4Njo6TUFYUFNycl9JbnQ6DQorICBjYXNlIFg4Njo6TUFYU0RybToNCisgIGNhc2UgWDg2OjpNQVhTRHJtX0ludDoNCisgIGNhc2UgWDg2OjpNQVhTRHJyOg0KKyAgY2FzZSBYODY6Ok1BWFNEcnJfSW50Og0KKyAgY2FzZSBYODY6Ok1BWFNTcm06DQorICBjYXNlIFg4Njo6TUFYU1NybV9JbnQ6DQorICBjYXNlIFg4Njo6TUFYU1NycjoNCisgIGNhc2UgWDg2OjpNQVhTU3JyX0ludDoNCisgIGNhc2UgWDg2OjpNSU5QRHJtOg0KKyAgY2FzZSBYODY6Ok1JTlBEcm1fSW50Og0KKyAgY2FzZSBYODY6Ok1JTlBEcnI6DQorICBjYXNlIFg4Njo6TUlOUERycl9JbnQ6DQorICBjYXNlIFg4Njo6TUlOUFNybToNCisgIGNhc2UgWDg2OjpNSU5QU3JtX0ludDoNCisgIGNhc2UgWDg2OjpNSU5QU3JyOg0KKyAgY2FzZSBYODY6Ok1JTlBTcnJfSW50Og0KKyAgY2FzZSBYODY6Ok1JTlNEcm06DQorICBjYXNlIFg4Njo6TUlOU0RybV9JbnQ6DQorICBjYXNlIFg4Njo6TUlOU0RycjoNCisgIGNhc2UgWDg2OjpNSU5TRHJyX0ludDoNCisgIGNhc2UgWDg2OjpNSU5TU3JtOg0KKyAgY2FzZSBYODY6Ok1JTlNTcm1fSW50Og0KKyAgY2FzZSBYODY6Ok1JTlNTcnI6DQorICBjYXNlIFg4Njo6TUlOU1Nycl9JbnQ6DQorICBjYXNlIFg4Njo6TU1YX0NWVFBEMlBJcm06DQorICBjYXNlIFg4Njo6TU1YX0NWVFBEMlBJcnI6DQorICBjYXNlIFg4Njo6TU1YX0NWVFBJMlBEcm06DQorICBjYXNlIFg4Njo6TU1YX0NWVFBJMlBEcnI6DQorICBjYXNlIFg4Njo6TU1YX0NWVFBJMlBTcm06DQorICBjYXNlIFg4Njo6TU1YX0NWVFBJMlBTcnI6DQorICBjYXNlIFg4Njo6TU1YX0NWVFBTMlBJcnI6DQorICBjYXNlIFg4Njo6TU1YX0NWVFRQRDJQSXJtOg0KKyAgY2FzZSBYODY6Ok1NWF9DVlRUUEQyUElycjoNCisgIGNhc2UgWDg2OjpNTVhfQ1ZUVFBTMlBJcnI6DQorICBjYXNlIFg4Njo6TU1YX01BU0tNT1ZROg0KKyAgY2FzZSBYODY6Ok1NWF9NQVNLTU9WUTY0Og0KKyAgY2FzZSBYODY6Ok1NWF9NT1ZENjRmcm9tNjRycjoNCisgIGNhc2UgWDg2OjpNTVhfTU9WRDY0Z3JyOg0KKyAgY2FzZSBYODY6Ok1NWF9NT1ZENjRtcjoNCisgIGNhc2UgWDg2OjpNTVhfTU9WRDY0cm06DQorICBjYXNlIFg4Njo6TU1YX01PVkQ2NHJyOg0KKyAgY2FzZSBYODY6Ok1NWF9NT1ZENjRycnYxNjQ6DQorICBjYXNlIFg4Njo6TU1YX01PVkQ2NHRvNjRycjoNCisgIGNhc2UgWDg2OjpNTVhfTU9WRFEyUXJyOg0KKyAgY2FzZSBYODY6Ok1NWF9NT1ZGUjY0MlFycjoNCisgIGNhc2UgWDg2OjpNTVhfTU9WTlRRbXI6DQorICBjYXNlIFg4Njo6TU1YX01PVlEyRFFycjoNCisgIGNhc2UgWDg2OjpNTVhfTU9WUTJGUjY0cnI6DQorICBjYXNlIFg4Njo6TU1YX01PVlE2NG1yOg0KKyAgY2FzZSBYODY6Ok1NWF9NT1ZRNjRybToNCisgIGNhc2UgWDg2OjpNTVhfTU9WUTY0cnI6DQorICBjYXNlIFg4Njo6TU1YX01PVlpESTJQRElybToNCisgIGNhc2UgWDg2OjpNTVhfTU9WWkRJMlBESXJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUNLU1NEV3JtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUNLU1NEV3JyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUNLU1NXQnJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUNLU1NXQnJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUNLVVNXQnJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUNLVVNXQnJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUREQnJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUREQnJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQURERHJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQURERHJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUREUXJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUREUXJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUREU0JybToNCisgIGNhc2UgWDg2OjpNTVhfUEFERFNCcnI6DQorICBjYXNlIFg4Njo6TU1YX1BBRERTV3JtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUREU1dycjoNCisgIGNhc2UgWDg2OjpNTVhfUEFERFVTQnJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUREVVNCcnI6DQorICBjYXNlIFg4Njo6TU1YX1BBRERVU1dybToNCisgIGNhc2UgWDg2OjpNTVhfUEFERFVTV3JyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUREV3JtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQUREV3JyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQU5ETnJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQU5ETnJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQU5Ecm06DQorICBjYXNlIFg4Njo6TU1YX1BBTkRycjoNCisgIGNhc2UgWDg2OjpNTVhfUEFWR0JybToNCisgIGNhc2UgWDg2OjpNTVhfUEFWR0JycjoNCisgIGNhc2UgWDg2OjpNTVhfUEFWR1dybToNCisgIGNhc2UgWDg2OjpNTVhfUEFWR1dycjoNCisgIGNhc2UgWDg2OjpNTVhfUENNUEVRQnJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQ01QRVFCcnI6DQorICBjYXNlIFg4Njo6TU1YX1BDTVBFUURybToNCisgIGNhc2UgWDg2OjpNTVhfUENNUEVRRHJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQ01QRVFXcm06DQorICBjYXNlIFg4Njo6TU1YX1BDTVBFUVdycjoNCisgIGNhc2UgWDg2OjpNTVhfUENNUEdUQnJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QQ01QR1RCcnI6DQorICBjYXNlIFg4Njo6TU1YX1BDTVBHVERybToNCisgIGNhc2UgWDg2OjpNTVhfUENNUEdURHJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QQ01QR1RXcm06DQorICBjYXNlIFg4Njo6TU1YX1BDTVBHVFdycjoNCisgIGNhc2UgWDg2OjpNTVhfUE1BRERXRHJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QTUFERFdEcnI6DQorICBjYXNlIFg4Njo6TU1YX1BNQVhTV3JtOg0KKyAgY2FzZSBYODY6Ok1NWF9QTUFYU1dycjoNCisgIGNhc2UgWDg2OjpNTVhfUE1BWFVCcm06DQorICBjYXNlIFg4Njo6TU1YX1BNQVhVQnJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QTUlOU1dybToNCisgIGNhc2UgWDg2OjpNTVhfUE1JTlNXcnI6DQorICBjYXNlIFg4Njo6TU1YX1BNSU5VQnJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QTUlOVUJycjoNCisgIGNhc2UgWDg2OjpNTVhfUE1PVk1TS0JycjoNCisgIGNhc2UgWDg2OjpNTVhfUE1VTEhVV3JtOg0KKyAgY2FzZSBYODY6Ok1NWF9QTVVMSFVXcnI6DQorICBjYXNlIFg4Njo6TU1YX1BNVUxIV3JtOg0KKyAgY2FzZSBYODY6Ok1NWF9QTVVMSFdycjoNCisgIGNhc2UgWDg2OjpNTVhfUE1VTExXcm06DQorICBjYXNlIFg4Njo6TU1YX1BNVUxMV3JyOg0KKyAgY2FzZSBYODY6Ok1NWF9QTVVMVURRcm06DQorICBjYXNlIFg4Njo6TU1YX1BNVUxVRFFycjoNCisgIGNhc2UgWDg2OjpNTVhfUE9Scm06DQorICBjYXNlIFg4Njo6TU1YX1BPUnJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QU0FEQldybToNCisgIGNhc2UgWDg2OjpNTVhfUFNBREJXcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTTExEcmk6DQorICBjYXNlIFg4Njo6TU1YX1BTTExEcm06DQorICBjYXNlIFg4Njo6TU1YX1BTTExEcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTTExRcmk6DQorICBjYXNlIFg4Njo6TU1YX1BTTExRcm06DQorICBjYXNlIFg4Njo6TU1YX1BTTExRcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTTExXcmk6DQorICBjYXNlIFg4Njo6TU1YX1BTTExXcm06DQorICBjYXNlIFg4Njo6TU1YX1BTTExXcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTUkFEcmk6DQorICBjYXNlIFg4Njo6TU1YX1BTUkFEcm06DQorICBjYXNlIFg4Njo6TU1YX1BTUkFEcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTUkFXcmk6DQorICBjYXNlIFg4Njo6TU1YX1BTUkFXcm06DQorICBjYXNlIFg4Njo6TU1YX1BTUkFXcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTUkxEcmk6DQorICBjYXNlIFg4Njo6TU1YX1BTUkxEcm06DQorICBjYXNlIFg4Njo6TU1YX1BTUkxEcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTUkxRcmk6DQorICBjYXNlIFg4Njo6TU1YX1BTUkxRcm06DQorICBjYXNlIFg4Njo6TU1YX1BTUkxRcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTUkxXcmk6DQorICBjYXNlIFg4Njo6TU1YX1BTUkxXcm06DQorICBjYXNlIFg4Njo6TU1YX1BTUkxXcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTVUJCcm06DQorICBjYXNlIFg4Njo6TU1YX1BTVUJCcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTVUJEcm06DQorICBjYXNlIFg4Njo6TU1YX1BTVUJEcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTVUJRcm06DQorICBjYXNlIFg4Njo6TU1YX1BTVUJRcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTVUJTQnJtOg0KKyAgY2FzZSBYODY6Ok1NWF9QU1VCU0JycjoNCisgIGNhc2UgWDg2OjpNTVhfUFNVQlNXcm06DQorICBjYXNlIFg4Njo6TU1YX1BTVUJTV3JyOg0KKyAgY2FzZSBYODY6Ok1NWF9QU1VCVVNCcm06DQorICBjYXNlIFg4Njo6TU1YX1BTVUJVU0JycjoNCisgIGNhc2UgWDg2OjpNTVhfUFNVQlVTV3JtOg0KKyAgY2FzZSBYODY6Ok1NWF9QU1VCVVNXcnI6DQorICBjYXNlIFg4Njo6TU1YX1BTVUJXcm06DQorICBjYXNlIFg4Njo6TU1YX1BTVUJXcnI6DQorICBjYXNlIFg4Njo6TU1YX1BVTlBDS0hCV3JtOg0KKyAgY2FzZSBYODY6Ok1NWF9QVU5QQ0tIQldycjoNCisgIGNhc2UgWDg2OjpNTVhfUFVOUENLSERRcm06DQorICBjYXNlIFg4Njo6TU1YX1BVTlBDS0hEUXJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QVU5QQ0tIV0RybToNCisgIGNhc2UgWDg2OjpNTVhfUFVOUENLSFdEcnI6DQorICBjYXNlIFg4Njo6TU1YX1BVTlBDS0xCV3JtOg0KKyAgY2FzZSBYODY6Ok1NWF9QVU5QQ0tMQldycjoNCisgIGNhc2UgWDg2OjpNTVhfUFVOUENLTERRcm06DQorICBjYXNlIFg4Njo6TU1YX1BVTlBDS0xEUXJyOg0KKyAgY2FzZSBYODY6Ok1NWF9QVU5QQ0tMV0RybToNCisgIGNhc2UgWDg2OjpNTVhfUFVOUENLTFdEcnI6DQorICBjYXNlIFg4Njo6TU1YX1BYT1JybToNCisgIGNhc2UgWDg2OjpNTVhfUFhPUnJyOg0KKyAgY2FzZSBYODY6Ok1PVjE2bWk6DQorICBjYXNlIFg4Njo6TU9WMTZtcjoNCisgIGNhc2UgWDg2OjpNT1YxNm1zOg0KKyAgY2FzZSBYODY6Ok1PVjE2cmk6DQorICBjYXNlIFg4Njo6TU9WMTZybToNCisgIGNhc2UgWDg2OjpNT1YxNnJyOg0KKyAgY2FzZSBYODY6Ok1PVjE2cnJfUkVWOg0KKyAgY2FzZSBYODY6Ok1PVjE2cnM6DQorICBjYXNlIFg4Njo6TU9WMTZzbToNCisgIGNhc2UgWDg2OjpNT1YxNnNyOg0KKyAgY2FzZSBYODY6Ok1PVjMyY3I6DQorICBjYXNlIFg4Njo6TU9WMzJkcjoNCisgIGNhc2UgWDg2OjpNT1YzMm1pOg0KKyAgY2FzZSBYODY6Ok1PVjMybXI6DQorICBjYXNlIFg4Njo6TU9WMzJtcl9UQzoNCisgIGNhc2UgWDg2OjpNT1YzMm1zOg0KKyAgY2FzZSBYODY6Ok1PVjMycmM6DQorICBjYXNlIFg4Njo6TU9WMzJyZDoNCisgIGNhc2UgWDg2OjpNT1YzMnJpOg0KKyAgY2FzZSBYODY6Ok1PVjMycm06DQorICBjYXNlIFg4Njo6TU9WMzJybV9UQzoNCisgIGNhc2UgWDg2OjpNT1YzMnJyOg0KKyAgY2FzZSBYODY6Ok1PVjMycnJfUkVWOg0KKyAgY2FzZSBYODY6Ok1PVjMycnJfVEM6DQorICBjYXNlIFg4Njo6TU9WMzJyczoNCisgIGNhc2UgWDg2OjpNT1YzMnNtOg0KKyAgY2FzZSBYODY6Ok1PVjMyc3I6DQorICBjYXNlIFg4Njo6TU9WNjRjcjoNCisgIGNhc2UgWDg2OjpNT1Y2NGRyOg0KKyAgY2FzZSBYODY6Ok1PVjY0bWkzMjoNCisgIGNhc2UgWDg2OjpNT1Y2NG1yOg0KKyAgY2FzZSBYODY6Ok1PVjY0bXJfVEM6DQorICBjYXNlIFg4Njo6TU9WNjRtczoNCisgIGNhc2UgWDg2OjpNT1Y2NHJjOg0KKyAgY2FzZSBYODY6Ok1PVjY0cmQ6DQorICBjYXNlIFg4Njo6TU9WNjRyaToNCisgIGNhc2UgWDg2OjpNT1Y2NHJpMzI6DQorICBjYXNlIFg4Njo6TU9WNjRyaV9hbHQ6DQorICBjYXNlIFg4Njo6TU9WNjRybToNCisgIGNhc2UgWDg2OjpNT1Y2NHJtX1RDOg0KKyAgY2FzZSBYODY6Ok1PVjY0cnI6DQorICBjYXNlIFg4Njo6TU9WNjRycl9SRVY6DQorICBjYXNlIFg4Njo6TU9WNjRycl9UQzoNCisgIGNhc2UgWDg2OjpNT1Y2NHJzOg0KKyAgY2FzZSBYODY6Ok1PVjY0c206DQorICBjYXNlIFg4Njo6TU9WNjRzcjoNCisgIGNhc2UgWDg2OjpNT1Y2NHRvUFFJcnI6DQorICBjYXNlIFg4Njo6TU9WNjR0b1NEcm06DQorICBjYXNlIFg4Njo6TU9WNjR0b1NEcnI6DQorICBjYXNlIFg4Njo6TU9WOG1pOg0KKyAgY2FzZSBYODY6Ok1PVjhtcjoNCisgIGNhc2UgWDg2OjpNT1Y4cmk6DQorICBjYXNlIFg4Njo6TU9WOHJtOg0KKyAgY2FzZSBYODY6Ok1PVjhycjoNCisgIGNhc2UgWDg2OjpNT1Y4cnJfUkVWOg0KKyAgY2FzZSBYODY6Ok1PVkFQRHJtOg0KKyAgY2FzZSBYODY6Ok1PVkFQRHJyOg0KKyAgY2FzZSBYODY6Ok1PVkFQU3JtOg0KKyAgY2FzZSBYODY6Ok1PVkFQU3JyOg0KKyAgY2FzZSBYODY6Ok1PVkREVVBycjoNCisgIGNhc2UgWDg2OjpNT1ZESTJQRElybToNCisgIGNhc2UgWDg2OjpNT1ZESTJQRElycjoNCisgIGNhc2UgWDg2OjpNT1ZESTJTU3JtOg0KKyAgY2FzZSBYODY6Ok1PVkRJMlNTcnI6DQorICBjYXNlIFg4Njo6TU9WRFFBbXI6DQorICBjYXNlIFg4Njo6TU9WRFFBcm06DQorICBjYXNlIFg4Njo6TU9WRFFBcnI6DQorICBjYXNlIFg4Njo6TU9WRFFVbXI6DQorICBjYXNlIFg4Njo6TU9WRFFVbXJfSW50Og0KKyAgY2FzZSBYODY6Ok1PVkRRVXJtOg0KKyAgY2FzZSBYODY6Ok1PVkRRVXJtX0ludDoNCisgIGNhc2UgWDg2OjpNT1ZITFBTcnI6DQorICBjYXNlIFg4Njo6TU9WSFBEbXI6DQorICBjYXNlIFg4Njo6TU9WSFBEcm06DQorICBjYXNlIFg4Njo6TU9WSFBTbXI6DQorICBjYXNlIFg4Njo6TU9WSFBTcm06DQorICBjYXNlIFg4Njo6TU9WTEhQU3JyOg0KKyAgY2FzZSBYODY6Ok1PVkxQRG1yOg0KKyAgY2FzZSBYODY6Ok1PVkxQRHJtOg0KKyAgY2FzZSBYODY6Ok1PVkxQU21yOg0KKyAgY2FzZSBYODY6Ok1PVkxQU3JtOg0KKyAgY2FzZSBYODY6Ok1PVkxRMTI4bXI6DQorICBjYXNlIFg4Njo6TU9WTVNLUERycjoNCisgIGNhc2UgWDg2OjpNT1ZNU0tQU3JyOg0KKyAgY2FzZSBYODY6Ok1PVk5URFFBcm06DQorICBjYXNlIFg4Njo6TU9WTlRJXzY0bXI6DQorICBjYXNlIFg4Njo6TU9WTlRJbXI6DQorICBjYXNlIFg4Njo6TU9WTlRJbXJfSW50Og0KKyAgY2FzZSBYODY6Ok1PVk5UUERtcl9JbnQ6DQorICBjYXNlIFg4Njo6TU9WTlRQU21yX0ludDoNCisgIGNhc2UgWDg2OjpNT1ZQREkyREltcjoNCisgIGNhc2UgWDg2OjpNT1ZQREkyRElycjoNCisgIGNhc2UgWDg2OjpNT1ZQUUkyUUltcjoNCisgIGNhc2UgWDg2OjpNT1ZQUUl0bzY0cnI6DQorICBjYXNlIFg4Njo6TU9WUUkyUFFJcm06DQorICBjYXNlIFg4Njo6TU9WUXhyeHI6DQorICBjYXNlIFg4Njo6TU9WU0RtcjoNCisgIGNhc2UgWDg2OjpNT1ZTRHJyOg0KKyAgY2FzZSBYODY6Ok1PVlNEdG82NG1yOg0KKyAgY2FzZSBYODY6Ok1PVlNEdG82NHJyOg0KKyAgY2FzZSBYODY6Ok1PVlNIRFVQcm06DQorICBjYXNlIFg4Njo6TU9WU0hEVVBycjoNCisgIGNhc2UgWDg2OjpNT1ZTTERVUHJtOg0KKyAgY2FzZSBYODY6Ok1PVlNMRFVQcnI6DQorICBjYXNlIFg4Njo6TU9WU1MyREltcjoNCisgIGNhc2UgWDg2OjpNT1ZTUzJESXJyOg0KKyAgY2FzZSBYODY6Ok1PVlNTbXI6DQorICBjYXNlIFg4Njo6TU9WU1NycjoNCisgIGNhc2UgWDg2OjpNT1ZTWDE2cm04VzoNCisgIGNhc2UgWDg2OjpNT1ZTWDE2cnI4VzoNCisgIGNhc2UgWDg2OjpNT1ZTWDMycm0xNjoNCisgIGNhc2UgWDg2OjpNT1ZTWDMycm04Og0KKyAgY2FzZSBYODY6Ok1PVlNYMzJycjE2Og0KKyAgY2FzZSBYODY6Ok1PVlNYMzJycjg6DQorICBjYXNlIFg4Njo6TU9WU1g2NHJtMTY6DQorICBjYXNlIFg4Njo6TU9WU1g2NHJtMzI6DQorICBjYXNlIFg4Njo6TU9WU1g2NHJtODoNCisgIGNhc2UgWDg2OjpNT1ZTWDY0cnIxNjoNCisgIGNhc2UgWDg2OjpNT1ZTWDY0cnIzMjoNCisgIGNhc2UgWDg2OjpNT1ZTWDY0cnI4Og0KKyAgY2FzZSBYODY6Ok1PVlVQRHJtOg0KKyAgY2FzZSBYODY6Ok1PVlVQRHJtX0ludDoNCisgIGNhc2UgWDg2OjpNT1ZVUERycjoNCisgIGNhc2UgWDg2OjpNT1ZVUFNybToNCisgIGNhc2UgWDg2OjpNT1ZVUFNybV9JbnQ6DQorICBjYXNlIFg4Njo6TU9WVVBTcnI6DQorICBjYXNlIFg4Njo6TU9WWkRJMlBESXJtOg0KKyAgY2FzZSBYODY6Ok1PVlpESTJQRElycjoNCisgIGNhc2UgWDg2OjpNT1ZaUFFJTG8yUFFJcm06DQorICBjYXNlIFg4Njo6TU9WWlBRSUxvMlBRSXJyOg0KKyAgY2FzZSBYODY6Ok1PVlpRSTJQUUlybToNCisgIGNhc2UgWDg2OjpNT1ZaUUkyUFFJcnI6DQorICBjYXNlIFg4Njo6TU9WWlgxNnJtOFc6DQorICBjYXNlIFg4Njo6TU9WWlgxNnJyOFc6DQorICBjYXNlIFg4Njo6TU9WWlgzMnJtMTY6DQorICBjYXNlIFg4Njo6TU9WWlgzMnJtODoNCisgIGNhc2UgWDg2OjpNT1ZaWDMycnIxNjoNCisgIGNhc2UgWDg2OjpNT1ZaWDMycnI4Og0KKyAgY2FzZSBYODY6Ok1PVlpYNjRybTE2X1E6DQorICBjYXNlIFg4Njo6TU9WWlg2NHJtOF9ROg0KKyAgY2FzZSBYODY6Ok1PVlpYNjRycjE2X1E6DQorICBjYXNlIFg4Njo6TU9WWlg2NHJyOF9ROg0KKyAgY2FzZSBYODY6Ok1VTFBEcm06DQorICBjYXNlIFg4Njo6TVVMUERycjoNCisgIGNhc2UgWDg2OjpNVUxQU3JtOg0KKyAgY2FzZSBYODY6Ok1VTFBTcnI6DQorICBjYXNlIFg4Njo6TVVMU0RybToNCisgIGNhc2UgWDg2OjpNVUxTRHJtX0ludDoNCisgIGNhc2UgWDg2OjpNVUxTRHJyOg0KKyAgY2FzZSBYODY6Ok1VTFNEcnJfSW50Og0KKyAgY2FzZSBYODY6Ok1VTFNTcm06DQorICBjYXNlIFg4Njo6TVVMU1NybV9JbnQ6DQorICBjYXNlIFg4Njo6TVVMU1NycjoNCisgIGNhc2UgWDg2OjpNVUxTU3JyX0ludDoNCisgIGNhc2UgWDg2OjpPUjE2bWk6DQorICBjYXNlIFg4Njo6T1IxNm1pODoNCisgIGNhc2UgWDg2OjpPUjE2bXI6DQorICBjYXNlIFg4Njo6T1IxNnJpOg0KKyAgY2FzZSBYODY6Ok9SMTZyaTg6DQorICBjYXNlIFg4Njo6T1IxNnJtOg0KKyAgY2FzZSBYODY6Ok9SMTZycjoNCisgIGNhc2UgWDg2OjpPUjE2cnJfUkVWOg0KKyAgY2FzZSBYODY6Ok9SMzJtaToNCisgIGNhc2UgWDg2OjpPUjMybWk4Og0KKyAgY2FzZSBYODY6Ok9SMzJtcjoNCisgIGNhc2UgWDg2OjpPUjMycmk6DQorICBjYXNlIFg4Njo6T1IzMnJpODoNCisgIGNhc2UgWDg2OjpPUjMycm06DQorICBjYXNlIFg4Njo6T1IzMnJyOg0KKyAgY2FzZSBYODY6Ok9SMzJycl9SRVY6DQorICBjYXNlIFg4Njo6T1I2NG1pMzI6DQorICBjYXNlIFg4Njo6T1I2NG1pODoNCisgIGNhc2UgWDg2OjpPUjY0bXI6DQorICBjYXNlIFg4Njo6T1I2NHJpMzI6DQorICBjYXNlIFg4Njo6T1I2NHJpODoNCisgIGNhc2UgWDg2OjpPUjY0cm06DQorICBjYXNlIFg4Njo6T1I2NHJyOg0KKyAgY2FzZSBYODY6Ok9SNjRycl9SRVY6DQorICBjYXNlIFg4Njo6T1I4bWk6DQorICBjYXNlIFg4Njo6T1I4bXI6DQorICBjYXNlIFg4Njo6T1I4cmk6DQorICBjYXNlIFg4Njo6T1I4cm06DQorICBjYXNlIFg4Njo6T1I4cnI6DQorICBjYXNlIFg4Njo6T1I4cnJfUkVWOg0KKyAgY2FzZSBYODY6Ok9SUERybToNCisgIGNhc2UgWDg2OjpPUlBEcnI6DQorICBjYXNlIFg4Njo6T1JQU3JtOg0KKyAgY2FzZSBYODY6Ok9SUFNycjoNCisgIGNhc2UgWDg2OjpQQUJTQnJtMTI4Og0KKyAgY2FzZSBYODY6OlBBQlNCcm02NDoNCisgIGNhc2UgWDg2OjpQQUJTQnJyMTI4Og0KKyAgY2FzZSBYODY6OlBBQlNCcnI2NDoNCisgIGNhc2UgWDg2OjpQQUJTRHJtMTI4Og0KKyAgY2FzZSBYODY6OlBBQlNEcm02NDoNCisgIGNhc2UgWDg2OjpQQUJTRHJyMTI4Og0KKyAgY2FzZSBYODY6OlBBQlNEcnI2NDoNCisgIGNhc2UgWDg2OjpQQUJTV3JtMTI4Og0KKyAgY2FzZSBYODY6OlBBQlNXcm02NDoNCisgIGNhc2UgWDg2OjpQQUJTV3JyMTI4Og0KKyAgY2FzZSBYODY6OlBBQlNXcnI2NDoNCisgIGNhc2UgWDg2OjpQQUNLU1NEV3JtOg0KKyAgY2FzZSBYODY6OlBBQ0tTU0RXcnI6DQorICBjYXNlIFg4Njo6UEFDS1NTV0JybToNCisgIGNhc2UgWDg2OjpQQUNLU1NXQnJyOg0KKyAgY2FzZSBYODY6OlBBQ0tVU0RXcm06DQorICBjYXNlIFg4Njo6UEFDS1VTRFdycjoNCisgIGNhc2UgWDg2OjpQQUNLVVNXQnJtOg0KKyAgY2FzZSBYODY6OlBBQ0tVU1dCcnI6DQorICBjYXNlIFg4Njo6UEFEREJybToNCisgIGNhc2UgWDg2OjpQQUREQnJyOg0KKyAgY2FzZSBYODY6OlBBREREcm06DQorICBjYXNlIFg4Njo6UEFERERycjoNCisgIGNhc2UgWDg2OjpQQUREUXJtOg0KKyAgY2FzZSBYODY6OlBBRERRcnI6DQorICBjYXNlIFg4Njo6UEFERFNCcm06DQorICBjYXNlIFg4Njo6UEFERFNCcnI6DQorICBjYXNlIFg4Njo6UEFERFNXcm06DQorICBjYXNlIFg4Njo6UEFERFNXcnI6DQorICBjYXNlIFg4Njo6UEFERFVTQnJtOg0KKyAgY2FzZSBYODY6OlBBRERVU0JycjoNCisgIGNhc2UgWDg2OjpQQUREVVNXcm06DQorICBjYXNlIFg4Njo6UEFERFVTV3JyOg0KKyAgY2FzZSBYODY6OlBBRERXcm06DQorICBjYXNlIFg4Njo6UEFERFdycjoNCisgIGNhc2UgWDg2OjpQQU5ETnJtOg0KKyAgY2FzZSBYODY6OlBBTkROcnI6DQorICBjYXNlIFg4Njo6UEFORHJtOg0KKyAgY2FzZSBYODY6OlBBTkRycjoNCisgIGNhc2UgWDg2OjpQQVZHQnJtOg0KKyAgY2FzZSBYODY6OlBBVkdCcnI6DQorICBjYXNlIFg4Njo6UEFWR1dybToNCisgIGNhc2UgWDg2OjpQQVZHV3JyOg0KKyAgY2FzZSBYODY6OlBDTVBFUUJybToNCisgIGNhc2UgWDg2OjpQQ01QRVFCcnI6DQorICBjYXNlIFg4Njo6UENNUEVRRHJtOg0KKyAgY2FzZSBYODY6OlBDTVBFUURycjoNCisgIGNhc2UgWDg2OjpQQ01QRVFRcm06DQorICBjYXNlIFg4Njo6UENNUEVRUXJyOg0KKyAgY2FzZSBYODY6OlBDTVBFUVdybToNCisgIGNhc2UgWDg2OjpQQ01QRVFXcnI6DQorICBjYXNlIFg4Njo6UENNUEdUQnJtOg0KKyAgY2FzZSBYODY6OlBDTVBHVEJycjoNCisgIGNhc2UgWDg2OjpQQ01QR1REcm06DQorICBjYXNlIFg4Njo6UENNUEdURHJyOg0KKyAgY2FzZSBYODY6OlBDTVBHVFFybToNCisgIGNhc2UgWDg2OjpQQ01QR1RRcnI6DQorICBjYXNlIFg4Njo6UENNUEdUV3JtOg0KKyAgY2FzZSBYODY6OlBDTVBHVFdycjoNCisgIGNhc2UgWDg2OjpQSEFERERybTEyODoNCisgIGNhc2UgWDg2OjpQSEFERERybTY0Og0KKyAgY2FzZSBYODY6OlBIQURERHJyMTI4Og0KKyAgY2FzZSBYODY6OlBIQURERHJyNjQ6DQorICBjYXNlIFg4Njo6UEhBRERTV3JtMTI4Og0KKyAgY2FzZSBYODY6OlBIQUREU1dybTY0Og0KKyAgY2FzZSBYODY6OlBIQUREU1dycjEyODoNCisgIGNhc2UgWDg2OjpQSEFERFNXcnI2NDoNCisgIGNhc2UgWDg2OjpQSEFERFdybTEyODoNCisgIGNhc2UgWDg2OjpQSEFERFdybTY0Og0KKyAgY2FzZSBYODY6OlBIQUREV3JyMTI4Og0KKyAgY2FzZSBYODY6OlBIQUREV3JyNjQ6DQorICBjYXNlIFg4Njo6UEhNSU5QT1NVV3JtMTI4Og0KKyAgY2FzZSBYODY6OlBITUlOUE9TVVdycjEyODoNCisgIGNhc2UgWDg2OjpQSFNVQkRybTEyODoNCisgIGNhc2UgWDg2OjpQSFNVQkRybTY0Og0KKyAgY2FzZSBYODY6OlBIU1VCRHJyMTI4Og0KKyAgY2FzZSBYODY6OlBIU1VCRHJyNjQ6DQorICBjYXNlIFg4Njo6UEhTVUJTV3JtMTI4Og0KKyAgY2FzZSBYODY6OlBIU1VCU1dybTY0Og0KKyAgY2FzZSBYODY6OlBIU1VCU1dycjEyODoNCisgIGNhc2UgWDg2OjpQSFNVQlNXcnI2NDoNCisgIGNhc2UgWDg2OjpQSFNVQldybTEyODoNCisgIGNhc2UgWDg2OjpQSFNVQldybTY0Og0KKyAgY2FzZSBYODY6OlBIU1VCV3JyMTI4Og0KKyAgY2FzZSBYODY6OlBIU1VCV3JyNjQ6DQorICBjYXNlIFg4Njo6UE1BRERVQlNXcm0xMjg6DQorICBjYXNlIFg4Njo6UE1BRERVQlNXcm02NDoNCisgIGNhc2UgWDg2OjpQTUFERFVCU1dycjEyODoNCisgIGNhc2UgWDg2OjpQTUFERFVCU1dycjY0Og0KKyAgY2FzZSBYODY6OlBNQUREV0RybToNCisgIGNhc2UgWDg2OjpQTUFERFdEcnI6DQorICBjYXNlIFg4Njo6UE1BWFNCcm06DQorICBjYXNlIFg4Njo6UE1BWFNCcnI6DQorICBjYXNlIFg4Njo6UE1BWFNEcm06DQorICBjYXNlIFg4Njo6UE1BWFNEcnI6DQorICBjYXNlIFg4Njo6UE1BWFNXcm06DQorICBjYXNlIFg4Njo6UE1BWFNXcnI6DQorICBjYXNlIFg4Njo6UE1BWFVCcm06DQorICBjYXNlIFg4Njo6UE1BWFVCcnI6DQorICBjYXNlIFg4Njo6UE1BWFVEcm06DQorICBjYXNlIFg4Njo6UE1BWFVEcnI6DQorICBjYXNlIFg4Njo6UE1BWFVXcm06DQorICBjYXNlIFg4Njo6UE1BWFVXcnI6DQorICBjYXNlIFg4Njo6UE1JTlNCcm06DQorICBjYXNlIFg4Njo6UE1JTlNCcnI6DQorICBjYXNlIFg4Njo6UE1JTlNEcm06DQorICBjYXNlIFg4Njo6UE1JTlNEcnI6DQorICBjYXNlIFg4Njo6UE1JTlNXcm06DQorICBjYXNlIFg4Njo6UE1JTlNXcnI6DQorICBjYXNlIFg4Njo6UE1JTlVCcm06DQorICBjYXNlIFg4Njo6UE1JTlVCcnI6DQorICBjYXNlIFg4Njo6UE1JTlVEcm06DQorICBjYXNlIFg4Njo6UE1JTlVEcnI6DQorICBjYXNlIFg4Njo6UE1JTlVXcm06DQorICBjYXNlIFg4Njo6UE1JTlVXcnI6DQorICBjYXNlIFg4Njo6UE1PVk1TS0JycjoNCisgIGNhc2UgWDg2OjpQTU9WU1hCRHJtOg0KKyAgY2FzZSBYODY6OlBNT1ZTWEJEcnI6DQorICBjYXNlIFg4Njo6UE1PVlNYQlFybToNCisgIGNhc2UgWDg2OjpQTU9WU1hCUXJyOg0KKyAgY2FzZSBYODY6OlBNT1ZTWEJXcm06DQorICBjYXNlIFg4Njo6UE1PVlNYQldycjoNCisgIGNhc2UgWDg2OjpQTU9WU1hEUXJtOg0KKyAgY2FzZSBYODY6OlBNT1ZTWERRcnI6DQorICBjYXNlIFg4Njo6UE1PVlNYV0RybToNCisgIGNhc2UgWDg2OjpQTU9WU1hXRHJyOg0KKyAgY2FzZSBYODY6OlBNT1ZTWFdRcm06DQorICBjYXNlIFg4Njo6UE1PVlNYV1FycjoNCisgIGNhc2UgWDg2OjpQTU9WWlhCRHJtOg0KKyAgY2FzZSBYODY6OlBNT1ZaWEJEcnI6DQorICBjYXNlIFg4Njo6UE1PVlpYQlFybToNCisgIGNhc2UgWDg2OjpQTU9WWlhCUXJyOg0KKyAgY2FzZSBYODY6OlBNT1ZaWEJXcm06DQorICBjYXNlIFg4Njo6UE1PVlpYQldycjoNCisgIGNhc2UgWDg2OjpQTU9WWlhEUXJtOg0KKyAgY2FzZSBYODY6OlBNT1ZaWERRcnI6DQorICBjYXNlIFg4Njo6UE1PVlpYV0RybToNCisgIGNhc2UgWDg2OjpQTU9WWlhXRHJyOg0KKyAgY2FzZSBYODY6OlBNT1ZaWFdRcm06DQorICBjYXNlIFg4Njo6UE1PVlpYV1FycjoNCisgIGNhc2UgWDg2OjpQTVVMRFFybToNCisgIGNhc2UgWDg2OjpQTVVMRFFycjoNCisgIGNhc2UgWDg2OjpQTVVMSFJTV3JtMTI4Og0KKyAgY2FzZSBYODY6OlBNVUxIUlNXcm02NDoNCisgIGNhc2UgWDg2OjpQTVVMSFJTV3JyMTI4Og0KKyAgY2FzZSBYODY6OlBNVUxIUlNXcnI2NDoNCisgIGNhc2UgWDg2OjpQTVVMSFVXcm06DQorICBjYXNlIFg4Njo6UE1VTEhVV3JyOg0KKyAgY2FzZSBYODY6OlBNVUxIV3JtOg0KKyAgY2FzZSBYODY6OlBNVUxIV3JyOg0KKyAgY2FzZSBYODY6OlBNVUxMRHJtOg0KKyAgY2FzZSBYODY6OlBNVUxMRHJyOg0KKyAgY2FzZSBYODY6OlBNVUxMV3JtOg0KKyAgY2FzZSBYODY6OlBNVUxMV3JyOg0KKyAgY2FzZSBYODY6OlBNVUxVRFFybToNCisgIGNhc2UgWDg2OjpQTVVMVURRcnI6DQorICBjYXNlIFg4Njo6UE9QQ05UMTZybToNCisgIGNhc2UgWDg2OjpQT1BDTlQxNnJyOg0KKyAgY2FzZSBYODY6OlBPUENOVDMycm06DQorICBjYXNlIFg4Njo6UE9QQ05UMzJycjoNCisgIGNhc2UgWDg2OjpQT1BDTlQ2NHJtOg0KKyAgY2FzZSBYODY6OlBPUENOVDY0cnI6DQorICBjYXNlIFg4Njo6UE9Scm06DQorICBjYXNlIFg4Njo6UE9ScnI6DQorICBjYXNlIFg4Njo6UFNBREJXcm06DQorICBjYXNlIFg4Njo6UFNBREJXcnI6DQorICBjYXNlIFg4Njo6UFNIVUZCcm0xMjg6DQorICBjYXNlIFg4Njo6UFNIVUZCcm02NDoNCisgIGNhc2UgWDg2OjpQU0hVRkJycjEyODoNCisgIGNhc2UgWDg2OjpQU0hVRkJycjY0Og0KKyAgY2FzZSBYODY6OlBTSUdOQnJtMTI4Og0KKyAgY2FzZSBYODY6OlBTSUdOQnJtNjQ6DQorICBjYXNlIFg4Njo6UFNJR05CcnIxMjg6DQorICBjYXNlIFg4Njo6UFNJR05CcnI2NDoNCisgIGNhc2UgWDg2OjpQU0lHTkRybTEyODoNCisgIGNhc2UgWDg2OjpQU0lHTkRybTY0Og0KKyAgY2FzZSBYODY6OlBTSUdORHJyMTI4Og0KKyAgY2FzZSBYODY6OlBTSUdORHJyNjQ6DQorICBjYXNlIFg4Njo6UFNJR05Xcm0xMjg6DQorICBjYXNlIFg4Njo6UFNJR05Xcm02NDoNCisgIGNhc2UgWDg2OjpQU0lHTldycjEyODoNCisgIGNhc2UgWDg2OjpQU0lHTldycjY0Og0KKyAgY2FzZSBYODY6OlBTTExEUXJpOg0KKyAgY2FzZSBYODY6OlBTTExEcmk6DQorICBjYXNlIFg4Njo6UFNMTERybToNCisgIGNhc2UgWDg2OjpQU0xMRHJyOg0KKyAgY2FzZSBYODY6OlBTTExRcmk6DQorICBjYXNlIFg4Njo6UFNMTFFybToNCisgIGNhc2UgWDg2OjpQU0xMUXJyOg0KKyAgY2FzZSBYODY6OlBTTExXcmk6DQorICBjYXNlIFg4Njo6UFNMTFdybToNCisgIGNhc2UgWDg2OjpQU0xMV3JyOg0KKyAgY2FzZSBYODY6OlBTUkFEcmk6DQorICBjYXNlIFg4Njo6UFNSQURybToNCisgIGNhc2UgWDg2OjpQU1JBRHJyOg0KKyAgY2FzZSBYODY6OlBTUkFXcmk6DQorICBjYXNlIFg4Njo6UFNSQVdybToNCisgIGNhc2UgWDg2OjpQU1JBV3JyOg0KKyAgY2FzZSBYODY6OlBTUkxEUXJpOg0KKyAgY2FzZSBYODY6OlBTUkxEcmk6DQorICBjYXNlIFg4Njo6UFNSTERybToNCisgIGNhc2UgWDg2OjpQU1JMRHJyOg0KKyAgY2FzZSBYODY6OlBTUkxRcmk6DQorICBjYXNlIFg4Njo6UFNSTFFybToNCisgIGNhc2UgWDg2OjpQU1JMUXJyOg0KKyAgY2FzZSBYODY6OlBTUkxXcmk6DQorICBjYXNlIFg4Njo6UFNSTFdybToNCisgIGNhc2UgWDg2OjpQU1JMV3JyOg0KKyAgY2FzZSBYODY6OlBTVUJCcm06DQorICBjYXNlIFg4Njo6UFNVQkJycjoNCisgIGNhc2UgWDg2OjpQU1VCRHJtOg0KKyAgY2FzZSBYODY6OlBTVUJEcnI6DQorICBjYXNlIFg4Njo6UFNVQlFybToNCisgIGNhc2UgWDg2OjpQU1VCUXJyOg0KKyAgY2FzZSBYODY6OlBTVUJTQnJtOg0KKyAgY2FzZSBYODY6OlBTVUJTQnJyOg0KKyAgY2FzZSBYODY6OlBTVUJTV3JtOg0KKyAgY2FzZSBYODY6OlBTVUJTV3JyOg0KKyAgY2FzZSBYODY6OlBTVUJVU0JybToNCisgIGNhc2UgWDg2OjpQU1VCVVNCcnI6DQorICBjYXNlIFg4Njo6UFNVQlVTV3JtOg0KKyAgY2FzZSBYODY6OlBTVUJVU1dycjoNCisgIGNhc2UgWDg2OjpQU1VCV3JtOg0KKyAgY2FzZSBYODY6OlBTVUJXcnI6DQorICBjYXNlIFg4Njo6UFRFU1RybToNCisgIGNhc2UgWDg2OjpQVEVTVHJyOg0KKyAgY2FzZSBYODY6OlBVTlBDS0hCV3JtOg0KKyAgY2FzZSBYODY6OlBVTlBDS0hCV3JyOg0KKyAgY2FzZSBYODY6OlBVTlBDS0hEUXJtOg0KKyAgY2FzZSBYODY6OlBVTlBDS0hEUXJyOg0KKyAgY2FzZSBYODY6OlBVTlBDS0hRRFFybToNCisgIGNhc2UgWDg2OjpQVU5QQ0tIUURRcnI6DQorICBjYXNlIFg4Njo6UFVOUENLSFdEcm06DQorICBjYXNlIFg4Njo6UFVOUENLSFdEcnI6DQorICBjYXNlIFg4Njo6UFVOUENLTEJXcm06DQorICBjYXNlIFg4Njo6UFVOUENLTEJXcnI6DQorICBjYXNlIFg4Njo6UFVOUENLTERRcm06DQorICBjYXNlIFg4Njo6UFVOUENLTERRcnI6DQorICBjYXNlIFg4Njo6UFVOUENLTFFEUXJtOg0KKyAgY2FzZSBYODY6OlBVTlBDS0xRRFFycjoNCisgIGNhc2UgWDg2OjpQVU5QQ0tMV0RybToNCisgIGNhc2UgWDg2OjpQVU5QQ0tMV0RycjoNCisgIGNhc2UgWDg2OjpQWE9Scm06DQorICBjYXNlIFg4Njo6UFhPUnJyOg0KKyAgY2FzZSBYODY6OlJDTDE2bWk6DQorICBjYXNlIFg4Njo6UkNMMTZyaToNCisgIGNhc2UgWDg2OjpSQ0wzMm1pOg0KKyAgY2FzZSBYODY6OlJDTDMycmk6DQorICBjYXNlIFg4Njo6UkNMNjRtaToNCisgIGNhc2UgWDg2OjpSQ0w2NHJpOg0KKyAgY2FzZSBYODY6OlJDTDhtaToNCisgIGNhc2UgWDg2OjpSQ0w4cmk6DQorICBjYXNlIFg4Njo6UkNQUFNtOg0KKyAgY2FzZSBYODY6OlJDUFBTbV9JbnQ6DQorICBjYXNlIFg4Njo6UkNQUFNyOg0KKyAgY2FzZSBYODY6OlJDUFBTcl9JbnQ6DQorICBjYXNlIFg4Njo6UkNQU1NyOg0KKyAgY2FzZSBYODY6OlJDUFNTcl9JbnQ6DQorICBjYXNlIFg4Njo6UkNSMTZtaToNCisgIGNhc2UgWDg2OjpSQ1IxNnJpOg0KKyAgY2FzZSBYODY6OlJDUjMybWk6DQorICBjYXNlIFg4Njo6UkNSMzJyaToNCisgIGNhc2UgWDg2OjpSQ1I2NG1pOg0KKyAgY2FzZSBYODY6OlJDUjY0cmk6DQorICBjYXNlIFg4Njo6UkNSOG1pOg0KKyAgY2FzZSBYODY6OlJDUjhyaToNCisgIGNhc2UgWDg2OjpST0wxNm1pOg0KKyAgY2FzZSBYODY6OlJPTDE2cmk6DQorICBjYXNlIFg4Njo6Uk9MMzJtaToNCisgIGNhc2UgWDg2OjpST0wzMnJpOg0KKyAgY2FzZSBYODY6OlJPTDY0bWk6DQorICBjYXNlIFg4Njo6Uk9MNjRyaToNCisgIGNhc2UgWDg2OjpST0w4bWk6DQorICBjYXNlIFg4Njo6Uk9MOHJpOg0KKyAgY2FzZSBYODY6OlJPUjE2bWk6DQorICBjYXNlIFg4Njo6Uk9SMTZyaToNCisgIGNhc2UgWDg2OjpST1IzMm1pOg0KKyAgY2FzZSBYODY6OlJPUjMycmk6DQorICBjYXNlIFg4Njo6Uk9SNjRtaToNCisgIGNhc2UgWDg2OjpST1I2NHJpOg0KKyAgY2FzZSBYODY6OlJPUjhtaToNCisgIGNhc2UgWDg2OjpST1I4cmk6DQorICBjYXNlIFg4Njo6UlNRUlRQU206DQorICBjYXNlIFg4Njo6UlNRUlRQU21fSW50Og0KKyAgY2FzZSBYODY6OlJTUVJUUFNyOg0KKyAgY2FzZSBYODY6OlJTUVJUUFNyX0ludDoNCisgIGNhc2UgWDg2OjpSU1FSVFNTcjoNCisgIGNhc2UgWDg2OjpSU1FSVFNTcl9JbnQ6DQorICBjYXNlIFg4Njo6U0FSMTZtaToNCisgIGNhc2UgWDg2OjpTQVIxNnJpOg0KKyAgY2FzZSBYODY6OlNBUjMybWk6DQorICBjYXNlIFg4Njo6U0FSMzJyaToNCisgIGNhc2UgWDg2OjpTQVI2NG1pOg0KKyAgY2FzZSBYODY6OlNBUjY0cmk6DQorICBjYXNlIFg4Njo6U0FSOG1pOg0KKyAgY2FzZSBYODY6OlNBUjhyaToNCisgIGNhc2UgWDg2OjpTQkIxNm1pOg0KKyAgY2FzZSBYODY6OlNCQjE2bWk4Og0KKyAgY2FzZSBYODY6OlNCQjE2bXI6DQorICBjYXNlIFg4Njo6U0JCMTZyaToNCisgIGNhc2UgWDg2OjpTQkIxNnJpODoNCisgIGNhc2UgWDg2OjpTQkIxNnJtOg0KKyAgY2FzZSBYODY6OlNCQjE2cnI6DQorICBjYXNlIFg4Njo6U0JCMTZycl9SRVY6DQorICBjYXNlIFg4Njo6U0JCMzJtaToNCisgIGNhc2UgWDg2OjpTQkIzMm1pODoNCisgIGNhc2UgWDg2OjpTQkIzMm1yOg0KKyAgY2FzZSBYODY6OlNCQjMycmk6DQorICBjYXNlIFg4Njo6U0JCMzJyaTg6DQorICBjYXNlIFg4Njo6U0JCMzJybToNCisgIGNhc2UgWDg2OjpTQkIzMnJyOg0KKyAgY2FzZSBYODY6OlNCQjMycnJfUkVWOg0KKyAgY2FzZSBYODY6OlNCQjY0bWkzMjoNCisgIGNhc2UgWDg2OjpTQkI2NG1pODoNCisgIGNhc2UgWDg2OjpTQkI2NG1yOg0KKyAgY2FzZSBYODY6OlNCQjY0cmkzMjoNCisgIGNhc2UgWDg2OjpTQkI2NHJpODoNCisgIGNhc2UgWDg2OjpTQkI2NHJtOg0KKyAgY2FzZSBYODY6OlNCQjY0cnI6DQorICBjYXNlIFg4Njo6U0JCNjRycl9SRVY6DQorICBjYXNlIFg4Njo6U0JCOG1pOg0KKyAgY2FzZSBYODY6OlNCQjhtcjoNCisgIGNhc2UgWDg2OjpTQkI4cmk6DQorICBjYXNlIFg4Njo6U0JCOHJtOg0KKyAgY2FzZSBYODY6OlNCQjhycjoNCisgIGNhc2UgWDg2OjpTQkI4cnJfUkVWOg0KKyAgY2FzZSBYODY6OlNITDE2bWk6DQorICBjYXNlIFg4Njo6U0hMMTZyaToNCisgIGNhc2UgWDg2OjpTSEwzMm1pOg0KKyAgY2FzZSBYODY6OlNITDMycmk6DQorICBjYXNlIFg4Njo6U0hMNjRtaToNCisgIGNhc2UgWDg2OjpTSEw2NHJpOg0KKyAgY2FzZSBYODY6OlNITDhtaToNCisgIGNhc2UgWDg2OjpTSEw4cmk6DQorICBjYXNlIFg4Njo6U0hSMTZtaToNCisgIGNhc2UgWDg2OjpTSFIxNnJpOg0KKyAgY2FzZSBYODY6OlNIUjMybWk6DQorICBjYXNlIFg4Njo6U0hSMzJyaToNCisgIGNhc2UgWDg2OjpTSFI2NG1pOg0KKyAgY2FzZSBYODY6OlNIUjY0cmk6DQorICBjYXNlIFg4Njo6U0hSOG1pOg0KKyAgY2FzZSBYODY6OlNIUjhyaToNCisgIGNhc2UgWDg2OjpTUVJUUERtOg0KKyAgY2FzZSBYODY6OlNRUlRQRG1fSW50Og0KKyAgY2FzZSBYODY6OlNRUlRQRHI6DQorICBjYXNlIFg4Njo6U1FSVFBEcl9JbnQ6DQorICBjYXNlIFg4Njo6U1FSVFBTbToNCisgIGNhc2UgWDg2OjpTUVJUUFNtX0ludDoNCisgIGNhc2UgWDg2OjpTUVJUUFNyOg0KKyAgY2FzZSBYODY6OlNRUlRQU3JfSW50Og0KKyAgY2FzZSBYODY6OlNRUlRTRHI6DQorICBjYXNlIFg4Njo6U1FSVFNEcl9JbnQ6DQorICBjYXNlIFg4Njo6U1FSVFNTcjoNCisgIGNhc2UgWDg2OjpTUVJUU1NyX0ludDoNCisgIGNhc2UgWDg2OjpTVUIxNm1pOg0KKyAgY2FzZSBYODY6OlNVQjE2bWk4Og0KKyAgY2FzZSBYODY6OlNVQjE2bXI6DQorICBjYXNlIFg4Njo6U1VCMTZyaToNCisgIGNhc2UgWDg2OjpTVUIxNnJpODoNCisgIGNhc2UgWDg2OjpTVUIxNnJtOg0KKyAgY2FzZSBYODY6OlNVQjE2cnI6DQorICBjYXNlIFg4Njo6U1VCMTZycl9SRVY6DQorICBjYXNlIFg4Njo6U1VCMzJtaToNCisgIGNhc2UgWDg2OjpTVUIzMm1pODoNCisgIGNhc2UgWDg2OjpTVUIzMm1yOg0KKyAgY2FzZSBYODY6OlNVQjMycmk6DQorICBjYXNlIFg4Njo6U1VCMzJyaTg6DQorICBjYXNlIFg4Njo6U1VCMzJybToNCisgIGNhc2UgWDg2OjpTVUIzMnJyOg0KKyAgY2FzZSBYODY6OlNVQjMycnJfUkVWOg0KKyAgY2FzZSBYODY6OlNVQjY0bWkzMjoNCisgIGNhc2UgWDg2OjpTVUI2NG1pODoNCisgIGNhc2UgWDg2OjpTVUI2NG1yOg0KKyAgY2FzZSBYODY6OlNVQjY0cmkzMjoNCisgIGNhc2UgWDg2OjpTVUI2NHJpODoNCisgIGNhc2UgWDg2OjpTVUI2NHJtOg0KKyAgY2FzZSBYODY6OlNVQjY0cnI6DQorICBjYXNlIFg4Njo6U1VCNjRycl9SRVY6DQorICBjYXNlIFg4Njo6U1VCOG1pOg0KKyAgY2FzZSBYODY6OlNVQjhtcjoNCisgIGNhc2UgWDg2OjpTVUI4cmk6DQorICBjYXNlIFg4Njo6U1VCOHJtOg0KKyAgY2FzZSBYODY6OlNVQjhycjoNCisgIGNhc2UgWDg2OjpTVUI4cnJfUkVWOg0KKyAgY2FzZSBYODY6OlNVQlBEcm06DQorICBjYXNlIFg4Njo6U1VCUERycjoNCisgIGNhc2UgWDg2OjpTVUJQU3JtOg0KKyAgY2FzZSBYODY6OlNVQlBTcnI6DQorICBjYXNlIFg4Njo6U1VCU0RybToNCisgIGNhc2UgWDg2OjpTVUJTRHJtX0ludDoNCisgIGNhc2UgWDg2OjpTVUJTRHJyOg0KKyAgY2FzZSBYODY6OlNVQlNEcnJfSW50Og0KKyAgY2FzZSBYODY6OlNVQlNTcm06DQorICBjYXNlIFg4Njo6U1VCU1NybV9JbnQ6DQorICBjYXNlIFg4Njo6U1VCU1NycjoNCisgIGNhc2UgWDg2OjpTVUJTU3JyX0ludDoNCisgIGNhc2UgWDg2OjpUQ1JFVFVSTmRpOg0KKyAgY2FzZSBYODY6OlRDUkVUVVJOZGk2NDoNCisgIGNhc2UgWDg2OjpUQ1JFVFVSTm1pOg0KKyAgY2FzZSBYODY6OlRDUkVUVVJObWk2NDoNCisgIGNhc2UgWDg2OjpUQ1JFVFVSTnJpOg0KKyAgY2FzZSBYODY6OlRDUkVUVVJOcmk2NDoNCisgIGNhc2UgWDg2OjpURVNUMTZtaToNCisgIGNhc2UgWDg2OjpURVNUMTZyaToNCisgIGNhc2UgWDg2OjpURVNUMTZybToNCisgIGNhc2UgWDg2OjpURVNUMTZycjoNCisgIGNhc2UgWDg2OjpURVNUMzJtaToNCisgIGNhc2UgWDg2OjpURVNUMzJyaToNCisgIGNhc2UgWDg2OjpURVNUMzJybToNCisgIGNhc2UgWDg2OjpURVNUMzJycjoNCisgIGNhc2UgWDg2OjpURVNUNjRtaTMyOg0KKyAgY2FzZSBYODY6OlRFU1Q2NHJpMzI6DQorICBjYXNlIFg4Njo6VEVTVDY0cm06DQorICBjYXNlIFg4Njo6VEVTVDY0cnI6DQorICBjYXNlIFg4Njo6VEVTVDhtaToNCisgIGNhc2UgWDg2OjpURVNUOHJpOg0KKyAgY2FzZSBYODY6OlRFU1Q4cm06DQorICBjYXNlIFg4Njo6VEVTVDhycjoNCisgIGNhc2UgWDg2OjpVQ09NSVNEcnI6DQorICBjYXNlIFg4Njo6VUNPTUlTU3JyOg0KKyAgY2FzZSBYODY6OlVOUENLSFBEcm06DQorICBjYXNlIFg4Njo6VU5QQ0tIUERycjoNCisgIGNhc2UgWDg2OjpVTlBDS0hQU3JtOg0KKyAgY2FzZSBYODY6OlVOUENLSFBTcnI6DQorICBjYXNlIFg4Njo6VU5QQ0tMUERybToNCisgIGNhc2UgWDg2OjpVTlBDS0xQRHJyOg0KKyAgY2FzZSBYODY6OlVOUENLTFBTcm06DQorICBjYXNlIFg4Njo6VU5QQ0tMUFNycjoNCisgIGNhc2UgWDg2OjpWQUVTSU1Dcm06DQorICBjYXNlIFg4Njo6VkFFU0lNQ3JyOg0KKyAgY2FzZSBYODY6OlZCUk9BRENBU1RGMTI4Og0KKyAgY2FzZSBYODY6OlZDT01JU0RybToNCisgIGNhc2UgWDg2OjpWQ09NSVNEcnI6DQorICBjYXNlIFg4Njo6VkNPTUlTU3JtOg0KKyAgY2FzZSBYODY6OlZDT01JU1NycjoNCisgIGNhc2UgWDg2OjpWQ1ZURFEyUERZcm06DQorICBjYXNlIFg4Njo6VkNWVERRMlBEWXJyOg0KKyAgY2FzZSBYODY6OlZDVlREUTJQRHJtOg0KKyAgY2FzZSBYODY6OlZDVlREUTJQRHJyOg0KKyAgY2FzZSBYODY6OlZDVlREUTJQU1lycjoNCisgIGNhc2UgWDg2OjpWQ1ZURFEyUFNybToNCisgIGNhc2UgWDg2OjpWQ1ZURFEyUFNycjoNCisgIGNhc2UgWDg2OjpWQ1ZUUEQyRFFYcllyOg0KKyAgY2FzZSBYODY6OlZDVlRQRDJEUVhybToNCisgIGNhc2UgWDg2OjpWQ1ZUUEQyRFFYcnI6DQorICBjYXNlIFg4Njo6VkNWVFBEMkRRWXJtOg0KKyAgY2FzZSBYODY6OlZDVlRQRDJEUVlycjoNCisgIGNhc2UgWDg2OjpWQ1ZUUEQyRFFycjoNCisgIGNhc2UgWDg2OjpWQ1ZUUEQyUFNYcllyOg0KKyAgY2FzZSBYODY6OlZDVlRQRDJQU1hybToNCisgIGNhc2UgWDg2OjpWQ1ZUUEQyUFNYcnI6DQorICBjYXNlIFg4Njo6VkNWVFBEMlBTWXJtOg0KKyAgY2FzZSBYODY6OlZDVlRQRDJQU1lycjoNCisgIGNhc2UgWDg2OjpWQ1ZUUEQyUFNycjoNCisgIGNhc2UgWDg2OjpWQ1ZUUFMyRFFZcm06DQorICBjYXNlIFg4Njo6VkNWVFBTMkRRWXJyOg0KKyAgY2FzZSBYODY6OlZDVlRQUzJEUXJtOg0KKyAgY2FzZSBYODY6OlZDVlRQUzJEUXJyOg0KKyAgY2FzZSBYODY6OlZDVlRQUzJQRFlybToNCisgIGNhc2UgWDg2OjpWQ1ZUUFMyUERZcnI6DQorICBjYXNlIFg4Njo6VkNWVFBTMlBEcnI6DQorICBjYXNlIFg4Njo6VkNWVFNEMlNJNjRycjoNCisgIGNhc2UgWDg2OjpWQ1ZUU0QyU0lfYWx0cnI6DQorICBjYXNlIFg4Njo6VkNWVFNTMlNJNjRycjoNCisgIGNhc2UgWDg2OjpWQ1ZUU1MyU0lycjoNCisgIGNhc2UgWDg2OjpWQ1ZUVFBEMkRRWHJZcjoNCisgIGNhc2UgWDg2OjpWQ1ZUVFBEMkRRWHJtOg0KKyAgY2FzZSBYODY6OlZDVlRUUEQyRFFYcnI6DQorICBjYXNlIFg4Njo6VkNWVFRQRDJEUVlybToNCisgIGNhc2UgWDg2OjpWQ1ZUVFBEMkRRWXJyOg0KKyAgY2FzZSBYODY6OlZDVlRUUEQyRFFycjoNCisgIGNhc2UgWDg2OjpWQ1ZUVFBTMkRRWXJtOg0KKyAgY2FzZSBYODY6OlZDVlRUUFMyRFFZcnI6DQorICBjYXNlIFg4Njo6VkNWVFRQUzJEUXJtOg0KKyAgY2FzZSBYODY6OlZDVlRUUFMyRFFycjoNCisgIGNhc2UgWDg2OjpWQ1ZUVFNEMlNJNjRycjoNCisgIGNhc2UgWDg2OjpWQ1ZUVFNEMlNJcnI6DQorICBjYXNlIFg4Njo6VkNWVFRTUzJTSTY0cnI6DQorICBjYXNlIFg4Njo6VkNWVFRTUzJTSXJyOg0KKyAgY2FzZSBYODY6OlZMRERRVXJtOg0KKyAgY2FzZSBYODY6OlZNQVNLTU9WRFFVOg0KKyAgY2FzZSBYODY6OlZNQVNLTU9WRFFVNjQ6DQorICBjYXNlIFg4Njo6Vk1PVkFQRFlybToNCisgIGNhc2UgWDg2OjpWTU9WQVBEWXJyOg0KKyAgY2FzZSBYODY6OlZNT1ZBUERybToNCisgIGNhc2UgWDg2OjpWTU9WQVBEcnI6DQorICBjYXNlIFg4Njo6Vk1PVkFQU1lybToNCisgIGNhc2UgWDg2OjpWTU9WQVBTWXJyOg0KKyAgY2FzZSBYODY6OlZNT1ZBUFNybToNCisgIGNhc2UgWDg2OjpWTU9WQVBTcnI6DQorICBjYXNlIFg4Njo6Vk1PVkREVVBZcm06DQorICBjYXNlIFg4Njo6Vk1PVkREVVBZcnI6DQorICBjYXNlIFg4Njo6Vk1PVkREVVBycjoNCisgIGNhc2UgWDg2OjpWTU9WREkyUERJcm06DQorICBjYXNlIFg4Njo6Vk1PVkRJMlBESXJyOg0KKyAgY2FzZSBYODY6OlZNT1ZESTJTU3JtOg0KKyAgY2FzZSBYODY6OlZNT1ZESTJTU3JyOg0KKyAgY2FzZSBYODY6OlZNT1ZEUUFZcnI6DQorICBjYXNlIFg4Njo6Vk1PVkRRQW1yOg0KKyAgY2FzZSBYODY6OlZNT1ZEUUFybToNCisgIGNhc2UgWDg2OjpWTU9WRFFBcnI6DQorICBjYXNlIFg4Njo6Vk1PVkRRVVlycjoNCisgIGNhc2UgWDg2OjpWTU9WRFFVbXI6DQorICBjYXNlIFg4Njo6Vk1PVkRRVW1yX0ludDoNCisgIGNhc2UgWDg2OjpWTU9WRFFVcm06DQorICBjYXNlIFg4Njo6Vk1PVkRRVXJtX0ludDoNCisgIGNhc2UgWDg2OjpWTU9WRFFVcnI6DQorICBjYXNlIFg4Njo6Vk1PVkhQRG1yOg0KKyAgY2FzZSBYODY6OlZNT1ZIUFNtcjoNCisgIGNhc2UgWDg2OjpWTU9WTFBEbXI6DQorICBjYXNlIFg4Njo6Vk1PVkxQU21yOg0KKyAgY2FzZSBYODY6OlZNT1ZMUTEyOG1yOg0KKyAgY2FzZSBYODY6OlZNT1ZNU0tQRFlyNjRyOg0KKyAgY2FzZSBYODY6OlZNT1ZNU0tQRFlycjoNCisgIGNhc2UgWDg2OjpWTU9WTVNLUERyNjRyOg0KKyAgY2FzZSBYODY6OlZNT1ZNU0tQRHJyOg0KKyAgY2FzZSBYODY6OlZNT1ZNU0tQU1lyNjRyOg0KKyAgY2FzZSBYODY6OlZNT1ZNU0tQU1lycjoNCisgIGNhc2UgWDg2OjpWTU9WTVNLUFNyNjRyOg0KKyAgY2FzZSBYODY6OlZNT1ZNU0tQU3JyOg0KKyAgY2FzZSBYODY6OlZNT1ZOVERRQXJtOg0KKyAgY2FzZSBYODY6OlZNT1ZOVFBEbXJfSW50Og0KKyAgY2FzZSBYODY6OlZNT1ZOVFBTbXJfSW50Og0KKyAgY2FzZSBYODY6OlZNT1ZQREkyREltcjoNCisgIGNhc2UgWDg2OjpWTU9WUERJMkRJcnI6DQorICBjYXNlIFg4Njo6Vk1PVlBRSTJRSW1yOg0KKyAgY2FzZSBYODY6OlZNT1ZRSTJQUUlybToNCisgIGNhc2UgWDg2OjpWTU9WUWQ2NHJyOg0KKyAgY2FzZSBYODY6OlZNT1ZRZDY0cnJfYWx0Og0KKyAgY2FzZSBYODY6OlZNT1ZRczY0cnI6DQorICBjYXNlIFg4Njo6Vk1PVlF4cnhyOg0KKyAgY2FzZSBYODY6OlZNT1ZTRG1yOg0KKyAgY2FzZSBYODY6OlZNT1ZTSERVUFlybToNCisgIGNhc2UgWDg2OjpWTU9WU0hEVVBZcnI6DQorICBjYXNlIFg4Njo6Vk1PVlNIRFVQcm06DQorICBjYXNlIFg4Njo6Vk1PVlNIRFVQcnI6DQorICBjYXNlIFg4Njo6Vk1PVlNMRFVQWXJtOg0KKyAgY2FzZSBYODY6OlZNT1ZTTERVUFlycjoNCisgIGNhc2UgWDg2OjpWTU9WU0xEVVBybToNCisgIGNhc2UgWDg2OjpWTU9WU0xEVVBycjoNCisgIGNhc2UgWDg2OjpWTU9WU1MyREltcjoNCisgIGNhc2UgWDg2OjpWTU9WU1MyRElycjoNCisgIGNhc2UgWDg2OjpWTU9WU1NtcjoNCisgIGNhc2UgWDg2OjpWTU9WVVBEWXJtOg0KKyAgY2FzZSBYODY6OlZNT1ZVUERZcnI6DQorICBjYXNlIFg4Njo6Vk1PVlVQRHJtOg0KKyAgY2FzZSBYODY6OlZNT1ZVUERybV9JbnQ6DQorICBjYXNlIFg4Njo6Vk1PVlVQRHJyOg0KKyAgY2FzZSBYODY6OlZNT1ZVUFNZcm06DQorICBjYXNlIFg4Njo6Vk1PVlVQU1lycjoNCisgIGNhc2UgWDg2OjpWTU9WVVBTcm06DQorICBjYXNlIFg4Njo6Vk1PVlVQU3JtX0ludDoNCisgIGNhc2UgWDg2OjpWTU9WVVBTcnI6DQorICBjYXNlIFg4Njo6Vk1PVlpESTJQRElybToNCisgIGNhc2UgWDg2OjpWTU9WWkRJMlBESXJyOg0KKyAgY2FzZSBYODY6OlZNT1ZaUFFJTG8yUFFJcm06DQorICBjYXNlIFg4Njo6Vk1PVlpQUUlMbzJQUUlycjoNCisgIGNhc2UgWDg2OjpWTU9WWlFJMlBRSXJtOg0KKyAgY2FzZSBYODY6OlZNT1ZaUUkyUFFJcnI6DQorICBjYXNlIFg4Njo6Vk1SRUFEMzJybToNCisgIGNhc2UgWDg2OjpWTVJFQUQzMnJyOg0KKyAgY2FzZSBYODY6OlZNUkVBRDY0cm06DQorICBjYXNlIFg4Njo6Vk1SRUFENjRycjoNCisgIGNhc2UgWDg2OjpWTVdSSVRFMzJybToNCisgIGNhc2UgWDg2OjpWTVdSSVRFMzJycjoNCisgIGNhc2UgWDg2OjpWTVdSSVRFNjRybToNCisgIGNhc2UgWDg2OjpWTVdSSVRFNjRycjoNCisgIGNhc2UgWDg2OjpWUEFCU0JybTEyODoNCisgIGNhc2UgWDg2OjpWUEFCU0JybTY0Og0KKyAgY2FzZSBYODY6OlZQQUJTQnJyMTI4Og0KKyAgY2FzZSBYODY6OlZQQUJTQnJyNjQ6DQorICBjYXNlIFg4Njo6VlBBQlNEcm0xMjg6DQorICBjYXNlIFg4Njo6VlBBQlNEcm02NDoNCisgIGNhc2UgWDg2OjpWUEFCU0RycjEyODoNCisgIGNhc2UgWDg2OjpWUEFCU0RycjY0Og0KKyAgY2FzZSBYODY6OlZQQUJTV3JtMTI4Og0KKyAgY2FzZSBYODY6OlZQQUJTV3JtNjQ6DQorICBjYXNlIFg4Njo6VlBBQlNXcnIxMjg6DQorICBjYXNlIFg4Njo6VlBBQlNXcnI2NDoNCisgIGNhc2UgWDg2OjpWUEhNSU5QT1NVV3JtMTI4Og0KKyAgY2FzZSBYODY6OlZQSE1JTlBPU1VXcnIxMjg6DQorICBjYXNlIFg4Njo6VlBNT1ZNU0tCcjY0cjoNCisgIGNhc2UgWDg2OjpWUE1PVk1TS0JycjoNCisgIGNhc2UgWDg2OjpWUE1PVlNYQkRybToNCisgIGNhc2UgWDg2OjpWUE1PVlNYQkRycjoNCisgIGNhc2UgWDg2OjpWUE1PVlNYQlFybToNCisgIGNhc2UgWDg2OjpWUE1PVlNYQlFycjoNCisgIGNhc2UgWDg2OjpWUE1PVlNYQldybToNCisgIGNhc2UgWDg2OjpWUE1PVlNYQldycjoNCisgIGNhc2UgWDg2OjpWUE1PVlNYRFFybToNCisgIGNhc2UgWDg2OjpWUE1PVlNYRFFycjoNCisgIGNhc2UgWDg2OjpWUE1PVlNYV0RybToNCisgIGNhc2UgWDg2OjpWUE1PVlNYV0RycjoNCisgIGNhc2UgWDg2OjpWUE1PVlNYV1FybToNCisgIGNhc2UgWDg2OjpWUE1PVlNYV1FycjoNCisgIGNhc2UgWDg2OjpWUE1PVlpYQkRybToNCisgIGNhc2UgWDg2OjpWUE1PVlpYQkRycjoNCisgIGNhc2UgWDg2OjpWUE1PVlpYQlFybToNCisgIGNhc2UgWDg2OjpWUE1PVlpYQlFycjoNCisgIGNhc2UgWDg2OjpWUE1PVlpYQldybToNCisgIGNhc2UgWDg2OjpWUE1PVlpYQldycjoNCisgIGNhc2UgWDg2OjpWUE1PVlpYRFFybToNCisgIGNhc2UgWDg2OjpWUE1PVlpYRFFycjoNCisgIGNhc2UgWDg2OjpWUE1PVlpYV0RybToNCisgIGNhc2UgWDg2OjpWUE1PVlpYV0RycjoNCisgIGNhc2UgWDg2OjpWUE1PVlpYV1FybToNCisgIGNhc2UgWDg2OjpWUE1PVlpYV1FycjoNCisgIGNhc2UgWDg2OjpWUFRFU1RZcnI6DQorICBjYXNlIFg4Njo6VlBURVNUcm06DQorICBjYXNlIFg4Njo6VlBURVNUcnI6DQorICBjYXNlIFg4Njo6VlJDUFBTWW06DQorICBjYXNlIFg4Njo6VlJDUFBTWW1fSW50Og0KKyAgY2FzZSBYODY6OlZSQ1BQU1lyOg0KKyAgY2FzZSBYODY6OlZSQ1BQU1lyX0ludDoNCisgIGNhc2UgWDg2OjpWUkNQUFNtOg0KKyAgY2FzZSBYODY6OlZSQ1BQU21fSW50Og0KKyAgY2FzZSBYODY6OlZSQ1BQU3I6DQorICBjYXNlIFg4Njo6VlJDUFBTcl9JbnQ6DQorICBjYXNlIFg4Njo6VlJTUVJUUFNZbToNCisgIGNhc2UgWDg2OjpWUlNRUlRQU1ltX0ludDoNCisgIGNhc2UgWDg2OjpWUlNRUlRQU1lyOg0KKyAgY2FzZSBYODY6OlZSU1FSVFBTWXJfSW50Og0KKyAgY2FzZSBYODY6OlZSU1FSVFBTbToNCisgIGNhc2UgWDg2OjpWUlNRUlRQU21fSW50Og0KKyAgY2FzZSBYODY6OlZSU1FSVFBTcjoNCisgIGNhc2UgWDg2OjpWUlNRUlRQU3JfSW50Og0KKyAgY2FzZSBYODY6OlZTUVJUUERZbToNCisgIGNhc2UgWDg2OjpWU1FSVFBEWW1fSW50Og0KKyAgY2FzZSBYODY6OlZTUVJUUERZcjoNCisgIGNhc2UgWDg2OjpWU1FSVFBEWXJfSW50Og0KKyAgY2FzZSBYODY6OlZTUVJUUERtOg0KKyAgY2FzZSBYODY6OlZTUVJUUERtX0ludDoNCisgIGNhc2UgWDg2OjpWU1FSVFBEcjoNCisgIGNhc2UgWDg2OjpWU1FSVFBEcl9JbnQ6DQorICBjYXNlIFg4Njo6VlNRUlRQU1ltOg0KKyAgY2FzZSBYODY6OlZTUVJUUFNZbV9JbnQ6DQorICBjYXNlIFg4Njo6VlNRUlRQU1lyOg0KKyAgY2FzZSBYODY6OlZTUVJUUFNZcl9JbnQ6DQorICBjYXNlIFg4Njo6VlNRUlRQU206DQorICBjYXNlIFg4Njo6VlNRUlRQU21fSW50Og0KKyAgY2FzZSBYODY6OlZTUVJUUFNyOg0KKyAgY2FzZSBYODY6OlZTUVJUUFNyX0ludDoNCisgIGNhc2UgWDg2OjpWVEVTVFBEWXJtOg0KKyAgY2FzZSBYODY6OlZURVNUUERZcnI6DQorICBjYXNlIFg4Njo6VlRFU1RQRHJtOg0KKyAgY2FzZSBYODY6OlZURVNUUERycjoNCisgIGNhc2UgWDg2OjpWVEVTVFBTWXJtOg0KKyAgY2FzZSBYODY6OlZURVNUUFNZcnI6DQorICBjYXNlIFg4Njo6VlRFU1RQU3JtOg0KKyAgY2FzZSBYODY6OlZURVNUUFNycjoNCisgIGNhc2UgWDg2OjpWVUNPTUlTRHJyOg0KKyAgY2FzZSBYODY6OlZVQ09NSVNTcnI6DQorICBjYXNlIFg4Njo6WEFERDE2cm06DQorICBjYXNlIFg4Njo6WEFERDE2cnI6DQorICBjYXNlIFg4Njo6WEFERDMycm06DQorICBjYXNlIFg4Njo6WEFERDMycnI6DQorICBjYXNlIFg4Njo6WEFERDY0cm06DQorICBjYXNlIFg4Njo6WEFERDY0cnI6DQorICBjYXNlIFg4Njo6WEFERDhybToNCisgIGNhc2UgWDg2OjpYQUREOHJyOg0KKyAgY2FzZSBYODY6OlhPUjE2bWk6DQorICBjYXNlIFg4Njo6WE9SMTZtaTg6DQorICBjYXNlIFg4Njo6WE9SMTZtcjoNCisgIGNhc2UgWDg2OjpYT1IxNnJpOg0KKyAgY2FzZSBYODY6OlhPUjE2cmk4Og0KKyAgY2FzZSBYODY6OlhPUjE2cm06DQorICBjYXNlIFg4Njo6WE9SMTZycjoNCisgIGNhc2UgWDg2OjpYT1IxNnJyX1JFVjoNCisgIGNhc2UgWDg2OjpYT1IzMm1pOg0KKyAgY2FzZSBYODY6OlhPUjMybWk4Og0KKyAgY2FzZSBYODY6OlhPUjMybXI6DQorICBjYXNlIFg4Njo6WE9SMzJyaToNCisgIGNhc2UgWDg2OjpYT1IzMnJpODoNCisgIGNhc2UgWDg2OjpYT1IzMnJtOg0KKyAgY2FzZSBYODY6OlhPUjMycnI6DQorICBjYXNlIFg4Njo6WE9SMzJycl9SRVY6DQorICBjYXNlIFg4Njo6WE9SNjRtaTMyOg0KKyAgY2FzZSBYODY6OlhPUjY0bWk4Og0KKyAgY2FzZSBYODY6OlhPUjY0bXI6DQorICBjYXNlIFg4Njo6WE9SNjRyaTMyOg0KKyAgY2FzZSBYODY6OlhPUjY0cmk4Og0KKyAgY2FzZSBYODY6OlhPUjY0cm06DQorICBjYXNlIFg4Njo6WE9SNjRycjoNCisgIGNhc2UgWDg2OjpYT1I2NHJyX1JFVjoNCisgIGNhc2UgWDg2OjpYT1I4bWk6DQorICBjYXNlIFg4Njo6WE9SOG1yOg0KKyAgY2FzZSBYODY6OlhPUjhyaToNCisgIGNhc2UgWDg2OjpYT1I4cm06DQorICBjYXNlIFg4Njo6WE9SOHJyOg0KKyAgY2FzZSBYODY6OlhPUjhycl9SRVY6DQorICBjYXNlIFg4Njo6WE9SUERybToNCisgIGNhc2UgWDg2OjpYT1JQRHJyOg0KKyAgY2FzZSBYODY6OlhPUlBTcm06DQorICBjYXNlIFg4Njo6WE9SUFNycjoNCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgWDg2OjpBRVNLRVlHRU5BU1NJU1QxMjhybToNCisgIGNhc2UgWDg2OjpBRVNLRVlHRU5BU1NJU1QxMjhycjoNCisgIGNhc2UgWDg2OjpCTEVORFBEcm1pOg0KKyAgY2FzZSBYODY6OkJMRU5EUERycmk6DQorICBjYXNlIFg4Njo6QkxFTkRQU3JtaToNCisgIGNhc2UgWDg2OjpCTEVORFBTcnJpOg0KKyAgY2FzZSBYODY6OkNNUFBEcm1pX2FsdDoNCisgIGNhc2UgWDg2OjpDTVBQRHJyaV9hbHQ6DQorICBjYXNlIFg4Njo6Q01QUFNybWlfYWx0Og0KKyAgY2FzZSBYODY6OkNNUFBTcnJpX2FsdDoNCisgIGNhc2UgWDg2OjpDTVBTRHJtX2FsdDoNCisgIGNhc2UgWDg2OjpDTVBTRHJyX2FsdDoNCisgIGNhc2UgWDg2OjpDTVBTU3JtX2FsdDoNCisgIGNhc2UgWDg2OjpDTVBTU3JyX2FsdDoNCisgIGNhc2UgWDg2OjpEUFBEcm1pOg0KKyAgY2FzZSBYODY6OkRQUERycmk6DQorICBjYXNlIFg4Njo6RFBQU3JtaToNCisgIGNhc2UgWDg2OjpEUFBTcnJpOg0KKyAgY2FzZSBYODY6OkVYVFJBQ1RQU21yOg0KKyAgY2FzZSBYODY6OkVYVFJBQ1RQU3JyOg0KKyAgY2FzZSBYODY6OklNVUwxNnJtaToNCisgIGNhc2UgWDg2OjpJTVVMMTZybWk4Og0KKyAgY2FzZSBYODY6OklNVUwxNnJyaToNCisgIGNhc2UgWDg2OjpJTVVMMTZycmk4Og0KKyAgY2FzZSBYODY6OklNVUwzMnJtaToNCisgIGNhc2UgWDg2OjpJTVVMMzJybWk4Og0KKyAgY2FzZSBYODY6OklNVUwzMnJyaToNCisgIGNhc2UgWDg2OjpJTVVMMzJycmk4Og0KKyAgY2FzZSBYODY6OklNVUw2NHJtaTMyOg0KKyAgY2FzZSBYODY6OklNVUw2NHJtaTg6DQorICBjYXNlIFg4Njo6SU1VTDY0cnJpMzI6DQorICBjYXNlIFg4Njo6SU1VTDY0cnJpODoNCisgIGNhc2UgWDg2OjpJTlNFUlRQU3JtOg0KKyAgY2FzZSBYODY6OklOU0VSVFBTcnI6DQorICBjYXNlIFg4Njo6SW50X1ZDTVBTRHJtOg0KKyAgY2FzZSBYODY6OkludF9WQ01QU0RycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNNUFNTcm06DQorICBjYXNlIFg4Njo6SW50X1ZDTVBTU3JyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUU0QyU1NybToNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNEMlNTcnI6DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTRDY0cm06DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTRDY0cnI6DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTRHJtOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUU0kyU0RycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNTNjRybToNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNTNjRycjoNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNTcm06DQorICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTU3JyOg0KKyAgY2FzZSBYODY6OkludF9WQ1ZUU1MyU0RybToNCisgIGNhc2UgWDg2OjpJbnRfVkNWVFNTMlNEcnI6DQorICBjYXNlIFg4Njo6TU1YX1BFWFRSV3JpOg0KKyAgY2FzZSBYODY6Ok1NWF9QSU5TUldybWk6DQorICBjYXNlIFg4Njo6TU1YX1BJTlNSV3JyaToNCisgIGNhc2UgWDg2OjpNTVhfUFNIVUZXbWk6DQorICBjYXNlIFg4Njo6TU1YX1BTSFVGV3JpOg0KKyAgY2FzZSBYODY6Ok1QU0FEQldybWk6DQorICBjYXNlIFg4Njo6TVBTQURCV3JyaToNCisgIGNhc2UgWDg2OjpQQUxJR05SMTI4cm06DQorICBjYXNlIFg4Njo6UEFMSUdOUjEyOHJyOg0KKyAgY2FzZSBYODY6OlBBTElHTlI2NHJtOg0KKyAgY2FzZSBYODY6OlBBTElHTlI2NHJyOg0KKyAgY2FzZSBYODY6OlBCTEVORFdybWk6DQorICBjYXNlIFg4Njo6UEJMRU5EV3JyaToNCisgIGNhc2UgWDg2OjpQQ01QRVNUUklBcm06DQorICBjYXNlIFg4Njo6UENNUEVTVFJJQXJyOg0KKyAgY2FzZSBYODY6OlBDTVBFU1RSSUNybToNCisgIGNhc2UgWDg2OjpQQ01QRVNUUklDcnI6DQorICBjYXNlIFg4Njo6UENNUEVTVFJJT3JtOg0KKyAgY2FzZSBYODY6OlBDTVBFU1RSSU9ycjoNCisgIGNhc2UgWDg2OjpQQ01QRVNUUklTcm06DQorICBjYXNlIFg4Njo6UENNUEVTVFJJU3JyOg0KKyAgY2FzZSBYODY6OlBDTVBFU1RSSVpybToNCisgIGNhc2UgWDg2OjpQQ01QRVNUUklacnI6DQorICBjYXNlIFg4Njo6UENNUEVTVFJJcm06DQorICBjYXNlIFg4Njo6UENNUEVTVFJJcnI6DQorICBjYXNlIFg4Njo6UENNUEVTVFJNMTI4cm06DQorICBjYXNlIFg4Njo6UENNUEVTVFJNMTI4cnI6DQorICBjYXNlIFg4Njo6UENNUElTVFJJQXJtOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSSUFycjoNCisgIGNhc2UgWDg2OjpQQ01QSVNUUklDcm06DQorICBjYXNlIFg4Njo6UENNUElTVFJJQ3JyOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSSU9ybToNCisgIGNhc2UgWDg2OjpQQ01QSVNUUklPcnI6DQorICBjYXNlIFg4Njo6UENNUElTVFJJU3JtOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSSVNycjoNCisgIGNhc2UgWDg2OjpQQ01QSVNUUklacm06DQorICBjYXNlIFg4Njo6UENNUElTVFJJWnJyOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSSXJtOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSSXJyOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSTTEyOHJtOg0KKyAgY2FzZSBYODY6OlBDTVBJU1RSTTEyOHJyOg0KKyAgY2FzZSBYODY6OlBFWFRSQm1yOg0KKyAgY2FzZSBYODY6OlBFWFRSQnJyOg0KKyAgY2FzZSBYODY6OlBFWFRSRG1yOg0KKyAgY2FzZSBYODY6OlBFWFRSRHJyOg0KKyAgY2FzZSBYODY6OlBFWFRSUW1yOg0KKyAgY2FzZSBYODY6OlBFWFRSUXJyOg0KKyAgY2FzZSBYODY6OlBFWFRSV21yOg0KKyAgY2FzZSBYODY6OlBFWFRSV3JpOg0KKyAgY2FzZSBYODY6OlBJTlNSQnJtOg0KKyAgY2FzZSBYODY6OlBJTlNSQnJyOg0KKyAgY2FzZSBYODY6OlBJTlNSRHJtOg0KKyAgY2FzZSBYODY6OlBJTlNSRHJyOg0KKyAgY2FzZSBYODY6OlBJTlNSUXJtOg0KKyAgY2FzZSBYODY6OlBJTlNSUXJyOg0KKyAgY2FzZSBYODY6OlBJTlNSV3JtaToNCisgIGNhc2UgWDg2OjpQSU5TUldycmk6DQorICBjYXNlIFg4Njo6UFNIVUZEbWk6DQorICBjYXNlIFg4Njo6UFNIVUZEcmk6DQorICBjYXNlIFg4Njo6UFNIVUZIV21pOg0KKyAgY2FzZSBYODY6OlBTSFVGSFdyaToNCisgIGNhc2UgWDg2OjpQU0hVRkxXbWk6DQorICBjYXNlIFg4Njo6UFNIVUZMV3JpOg0KKyAgY2FzZSBYODY6OlJPVU5EUERtX0ludDoNCisgIGNhc2UgWDg2OjpST1VORFBEcl9JbnQ6DQorICBjYXNlIFg4Njo6Uk9VTkRQU21fSW50Og0KKyAgY2FzZSBYODY6OlJPVU5EUFNyX0ludDoNCisgIGNhc2UgWDg2OjpST1VORFNEbV9JbnQ6DQorICBjYXNlIFg4Njo6Uk9VTkRTRHJfSW50Og0KKyAgY2FzZSBYODY6OlJPVU5EU1NtX0ludDoNCisgIGNhc2UgWDg2OjpST1VORFNTcl9JbnQ6DQorICBjYXNlIFg4Njo6U0hMRDE2bXJpODoNCisgIGNhc2UgWDg2OjpTSExEMTZycmk4Og0KKyAgY2FzZSBYODY6OlNITEQzMm1yaTg6DQorICBjYXNlIFg4Njo6U0hMRDMycnJpODoNCisgIGNhc2UgWDg2OjpTSExENjRtcmk4Og0KKyAgY2FzZSBYODY6OlNITEQ2NHJyaTg6DQorICBjYXNlIFg4Njo6U0hSRDE2bXJpODoNCisgIGNhc2UgWDg2OjpTSFJEMTZycmk4Og0KKyAgY2FzZSBYODY6OlNIUkQzMm1yaTg6DQorICBjYXNlIFg4Njo6U0hSRDMycnJpODoNCisgIGNhc2UgWDg2OjpTSFJENjRtcmk4Og0KKyAgY2FzZSBYODY6OlNIUkQ2NHJyaTg6DQorICBjYXNlIFg4Njo6U0hVRlBEcm1pOg0KKyAgY2FzZSBYODY6OlNIVUZQRHJyaToNCisgIGNhc2UgWDg2OjpTSFVGUFNybWk6DQorICBjYXNlIFg4Njo6U0hVRlBTcnJpOg0KKyAgY2FzZSBYODY6OlZBRERQRFlybToNCisgIGNhc2UgWDg2OjpWQUREUERZcnI6DQorICBjYXNlIFg4Njo6VkFERFBEcm06DQorICBjYXNlIFg4Njo6VkFERFBEcnI6DQorICBjYXNlIFg4Njo6VkFERFBTWXJtOg0KKyAgY2FzZSBYODY6OlZBRERQU1lycjoNCisgIGNhc2UgWDg2OjpWQUREUFNybToNCisgIGNhc2UgWDg2OjpWQUREUFNycjoNCisgIGNhc2UgWDg2OjpWQUREU0RybToNCisgIGNhc2UgWDg2OjpWQUREU0RybV9JbnQ6DQorICBjYXNlIFg4Njo6VkFERFNEcnI6DQorICBjYXNlIFg4Njo6VkFERFNEcnJfSW50Og0KKyAgY2FzZSBYODY6OlZBRERTU3JtOg0KKyAgY2FzZSBYODY6OlZBRERTU3JtX0ludDoNCisgIGNhc2UgWDg2OjpWQUREU1NycjoNCisgIGNhc2UgWDg2OjpWQUREU1Nycl9JbnQ6DQorICBjYXNlIFg4Njo6VkFERFNVQlBEWXJtOg0KKyAgY2FzZSBYODY6OlZBRERTVUJQRFlycjoNCisgIGNhc2UgWDg2OjpWQUREU1VCUERybToNCisgIGNhc2UgWDg2OjpWQUREU1VCUERycjoNCisgIGNhc2UgWDg2OjpWQUREU1VCUFNZcm06DQorICBjYXNlIFg4Njo6VkFERFNVQlBTWXJyOg0KKyAgY2FzZSBYODY6OlZBRERTVUJQU3JtOg0KKyAgY2FzZSBYODY6OlZBRERTVUJQU3JyOg0KKyAgY2FzZSBYODY6OlZBRVNERUNMQVNUcm06DQorICBjYXNlIFg4Njo6VkFFU0RFQ0xBU1RycjoNCisgIGNhc2UgWDg2OjpWQUVTREVDcm06DQorICBjYXNlIFg4Njo6VkFFU0RFQ3JyOg0KKyAgY2FzZSBYODY6OlZBRVNFTkNMQVNUcm06DQorICBjYXNlIFg4Njo6VkFFU0VOQ0xBU1RycjoNCisgIGNhc2UgWDg2OjpWQUVTRU5Dcm06DQorICBjYXNlIFg4Njo6VkFFU0VOQ3JyOg0KKyAgY2FzZSBYODY6OlZBRVNLRVlHRU5BU1NJU1QxMjhybToNCisgIGNhc2UgWDg2OjpWQUVTS0VZR0VOQVNTSVNUMTI4cnI6DQorICBjYXNlIFg4Njo6VkFORE5QRFlybToNCisgIGNhc2UgWDg2OjpWQU5ETlBEWXJyOg0KKyAgY2FzZSBYODY6OlZBTkROUERybToNCisgIGNhc2UgWDg2OjpWQU5ETlBEcnI6DQorICBjYXNlIFg4Njo6VkFORE5QU1lybToNCisgIGNhc2UgWDg2OjpWQU5ETlBTWXJyOg0KKyAgY2FzZSBYODY6OlZBTkROUFNybToNCisgIGNhc2UgWDg2OjpWQU5ETlBTcnI6DQorICBjYXNlIFg4Njo6VkFORFBEWXJtOg0KKyAgY2FzZSBYODY6OlZBTkRQRFlycjoNCisgIGNhc2UgWDg2OjpWQU5EUERybToNCisgIGNhc2UgWDg2OjpWQU5EUERycjoNCisgIGNhc2UgWDg2OjpWQU5EUFNZcm06DQorICBjYXNlIFg4Njo6VkFORFBTWXJyOg0KKyAgY2FzZSBYODY6OlZBTkRQU3JtOg0KKyAgY2FzZSBYODY6OlZBTkRQU3JyOg0KKyAgY2FzZSBYODY6OlZBU1RBUlRfU0FWRV9YTU1fUkVHUzoNCisgIGNhc2UgWDg2OjpWQ01QUERZcm1pOg0KKyAgY2FzZSBYODY6OlZDTVBQRFlycmk6DQorICBjYXNlIFg4Njo6VkNNUFBEcm1pOg0KKyAgY2FzZSBYODY6OlZDTVBQRHJyaToNCisgIGNhc2UgWDg2OjpWQ01QUFNZcm1pOg0KKyAgY2FzZSBYODY6OlZDTVBQU1lycmk6DQorICBjYXNlIFg4Njo6VkNNUFBTcm1pOg0KKyAgY2FzZSBYODY6OlZDTVBQU3JyaToNCisgIGNhc2UgWDg2OjpWQ01QU0RybToNCisgIGNhc2UgWDg2OjpWQ01QU0RycjoNCisgIGNhc2UgWDg2OjpWQ01QU1NybToNCisgIGNhc2UgWDg2OjpWQ01QU1NycjoNCisgIGNhc2UgWDg2OjpWQ1ZUU0QyU1NybToNCisgIGNhc2UgWDg2OjpWQ1ZUU0QyU1NycjoNCisgIGNhc2UgWDg2OjpWQ1ZUU0kyU0Q2NHJtOg0KKyAgY2FzZSBYODY6OlZDVlRTSTJTRDY0cnI6DQorICBjYXNlIFg4Njo6VkNWVFNJMlNETHJtOg0KKyAgY2FzZSBYODY6OlZDVlRTSTJTRExycjoNCisgIGNhc2UgWDg2OjpWQ1ZUU0kyU0RybToNCisgIGNhc2UgWDg2OjpWQ1ZUU0kyU0RycjoNCisgIGNhc2UgWDg2OjpWQ1ZUU0kyU1M2NHJtOg0KKyAgY2FzZSBYODY6OlZDVlRTSTJTUzY0cnI6DQorICBjYXNlIFg4Njo6VkNWVFNJMlNTcm06DQorICBjYXNlIFg4Njo6VkNWVFNJMlNTcnI6DQorICBjYXNlIFg4Njo6VkNWVFNTMlNEcm06DQorICBjYXNlIFg4Njo6VkNWVFNTMlNEcnI6DQorICBjYXNlIFg4Njo6VkRJVlBEWXJtOg0KKyAgY2FzZSBYODY6OlZESVZQRFlycjoNCisgIGNhc2UgWDg2OjpWRElWUERybToNCisgIGNhc2UgWDg2OjpWRElWUERycjoNCisgIGNhc2UgWDg2OjpWRElWUFNZcm06DQorICBjYXNlIFg4Njo6VkRJVlBTWXJyOg0KKyAgY2FzZSBYODY6OlZESVZQU3JtOg0KKyAgY2FzZSBYODY6OlZESVZQU3JyOg0KKyAgY2FzZSBYODY6OlZESVZTRHJtOg0KKyAgY2FzZSBYODY6OlZESVZTRHJtX0ludDoNCisgIGNhc2UgWDg2OjpWRElWU0RycjoNCisgIGNhc2UgWDg2OjpWRElWU0Rycl9JbnQ6DQorICBjYXNlIFg4Njo6VkRJVlNTcm06DQorICBjYXNlIFg4Njo6VkRJVlNTcm1fSW50Og0KKyAgY2FzZSBYODY6OlZESVZTU3JyOg0KKyAgY2FzZSBYODY6OlZESVZTU3JyX0ludDoNCisgIGNhc2UgWDg2OjpWRVhUUkFDVEYxMjhycjoNCisgIGNhc2UgWDg2OjpWRVhUUkFDVFBTbXI6DQorICBjYXNlIFg4Njo6VkVYVFJBQ1RQU3JyOg0KKyAgY2FzZSBYODY6OlZFWFRSQUNUUFNycjY0Og0KKyAgY2FzZSBYODY6OlZGTUFERFBEcjEzMm06DQorICBjYXNlIFg4Njo6VkZNQUREUERyMTMybVk6DQorICBjYXNlIFg4Njo6VkZNQUREUERyMTMycjoNCisgIGNhc2UgWDg2OjpWRk1BRERQRHIxMzJyWToNCisgIGNhc2UgWDg2OjpWRk1BRERQRHIyMTNtOg0KKyAgY2FzZSBYODY6OlZGTUFERFBEcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTUFERFBEcjIxM3I6DQorICBjYXNlIFg4Njo6VkZNQUREUERyMjEzclk6DQorICBjYXNlIFg4Njo6VkZNQUREUERyMjMxbToNCisgIGNhc2UgWDg2OjpWRk1BRERQRHIyMzFtWToNCisgIGNhc2UgWDg2OjpWRk1BRERQRHIyMzFyOg0KKyAgY2FzZSBYODY6OlZGTUFERFBEcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTUFERFBTcjEzMm06DQorICBjYXNlIFg4Njo6VkZNQUREUFNyMTMybVk6DQorICBjYXNlIFg4Njo6VkZNQUREUFNyMTMycjoNCisgIGNhc2UgWDg2OjpWRk1BRERQU3IxMzJyWToNCisgIGNhc2UgWDg2OjpWRk1BRERQU3IyMTNtOg0KKyAgY2FzZSBYODY6OlZGTUFERFBTcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTUFERFBTcjIxM3I6DQorICBjYXNlIFg4Njo6VkZNQUREUFNyMjEzclk6DQorICBjYXNlIFg4Njo6VkZNQUREUFNyMjMxbToNCisgIGNhc2UgWDg2OjpWRk1BRERQU3IyMzFtWToNCisgIGNhc2UgWDg2OjpWRk1BRERQU3IyMzFyOg0KKyAgY2FzZSBYODY6OlZGTUFERFBTcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjEzMm06DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMTMybVk6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMTMycjoNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIxMzJyWToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIyMTNtOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIxM3I6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMjEzclk6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMjMxbToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIyMzFtWToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIyMzFyOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjEzMm06DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMTMybVk6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMTMycjoNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IxMzJyWToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IyMTNtOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIxM3I6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMjEzclk6DQorICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMjMxbToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IyMzFtWToNCisgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IyMzFyOg0KKyAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjEzMm06DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMTMybVk6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMTMycjoNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIxMzJyWToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIyMTNtOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIxM3I6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMjEzclk6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMjMxbToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIyMzFtWToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIyMzFyOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjEzMm06DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMTMybVk6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMTMycjoNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IxMzJyWToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IyMTNtOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIxM3I6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMjEzclk6DQorICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMjMxbToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IyMzFtWToNCisgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IyMzFyOg0KKyAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBEcjEzMm06DQorICBjYXNlIFg4Njo6VkZNU1VCUERyMTMybVk6DQorICBjYXNlIFg4Njo6VkZNU1VCUERyMTMycjoNCisgIGNhc2UgWDg2OjpWRk1TVUJQRHIxMzJyWToNCisgIGNhc2UgWDg2OjpWRk1TVUJQRHIyMTNtOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBEcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBEcjIxM3I6DQorICBjYXNlIFg4Njo6VkZNU1VCUERyMjEzclk6DQorICBjYXNlIFg4Njo6VkZNU1VCUERyMjMxbToNCisgIGNhc2UgWDg2OjpWRk1TVUJQRHIyMzFtWToNCisgIGNhc2UgWDg2OjpWRk1TVUJQRHIyMzFyOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBEcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBTcjEzMm06DQorICBjYXNlIFg4Njo6VkZNU1VCUFNyMTMybVk6DQorICBjYXNlIFg4Njo6VkZNU1VCUFNyMTMycjoNCisgIGNhc2UgWDg2OjpWRk1TVUJQU3IxMzJyWToNCisgIGNhc2UgWDg2OjpWRk1TVUJQU3IyMTNtOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBTcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBTcjIxM3I6DQorICBjYXNlIFg4Njo6VkZNU1VCUFNyMjEzclk6DQorICBjYXNlIFg4Njo6VkZNU1VCUFNyMjMxbToNCisgIGNhc2UgWDg2OjpWRk1TVUJQU3IyMzFtWToNCisgIGNhc2UgWDg2OjpWRk1TVUJQU3IyMzFyOg0KKyAgY2FzZSBYODY6OlZGTVNVQlBTcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQRHIxMzJtOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQRHIxMzJtWToNCisgIGNhc2UgWDg2OjpWRk5NQUREUERyMTMycjoNCisgIGNhc2UgWDg2OjpWRk5NQUREUERyMTMyclk6DQorICBjYXNlIFg4Njo6VkZOTUFERFBEcjIxM206DQorICBjYXNlIFg4Njo6VkZOTUFERFBEcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQRHIyMTNyOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQRHIyMTNyWToNCisgIGNhc2UgWDg2OjpWRk5NQUREUERyMjMxbToNCisgIGNhc2UgWDg2OjpWRk5NQUREUERyMjMxbVk6DQorICBjYXNlIFg4Njo6VkZOTUFERFBEcjIzMXI6DQorICBjYXNlIFg4Njo6VkZOTUFERFBEcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQU3IxMzJtOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQU3IxMzJtWToNCisgIGNhc2UgWDg2OjpWRk5NQUREUFNyMTMycjoNCisgIGNhc2UgWDg2OjpWRk5NQUREUFNyMTMyclk6DQorICBjYXNlIFg4Njo6VkZOTUFERFBTcjIxM206DQorICBjYXNlIFg4Njo6VkZOTUFERFBTcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQU3IyMTNyOg0KKyAgY2FzZSBYODY6OlZGTk1BRERQU3IyMTNyWToNCisgIGNhc2UgWDg2OjpWRk5NQUREUFNyMjMxbToNCisgIGNhc2UgWDg2OjpWRk5NQUREUFNyMjMxbVk6DQorICBjYXNlIFg4Njo6VkZOTUFERFBTcjIzMXI6DQorICBjYXNlIFg4Njo6VkZOTUFERFBTcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQRHIxMzJtOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQRHIxMzJtWToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUERyMTMycjoNCisgIGNhc2UgWDg2OjpWRk5NU1VCUERyMTMyclk6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIxM206DQorICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMTNyOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMTNyWToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUERyMjMxbToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUERyMjMxbVk6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIzMXI6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQU3IxMzJtOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQU3IxMzJtWToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMTMycjoNCisgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMTMyclk6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIxM206DQorICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIxM21ZOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMTNyOg0KKyAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMTNyWToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMjMxbToNCisgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMjMxbVk6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIzMXI6DQorICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIzMXJZOg0KKyAgY2FzZSBYODY6OlZGc0FORE5QRHJtOg0KKyAgY2FzZSBYODY6OlZGc0FORE5QRHJyOg0KKyAgY2FzZSBYODY6OlZGc0FORE5QU3JtOg0KKyAgY2FzZSBYODY6OlZGc0FORE5QU3JyOg0KKyAgY2FzZSBYODY6OlZGc0FORFBEcm06DQorICBjYXNlIFg4Njo6VkZzQU5EUERycjoNCisgIGNhc2UgWDg2OjpWRnNBTkRQU3JtOg0KKyAgY2FzZSBYODY6OlZGc0FORFBTcnI6DQorICBjYXNlIFg4Njo6VkZzT1JQRHJtOg0KKyAgY2FzZSBYODY6OlZGc09SUERycjoNCisgIGNhc2UgWDg2OjpWRnNPUlBTcm06DQorICBjYXNlIFg4Njo6VkZzT1JQU3JyOg0KKyAgY2FzZSBYODY6OlZGc1hPUlBEcm06DQorICBjYXNlIFg4Njo6VkZzWE9SUERycjoNCisgIGNhc2UgWDg2OjpWRnNYT1JQU3JtOg0KKyAgY2FzZSBYODY6OlZGc1hPUlBTcnI6DQorICBjYXNlIFg4Njo6VkhBRERQRFlybToNCisgIGNhc2UgWDg2OjpWSEFERFBEWXJyOg0KKyAgY2FzZSBYODY6OlZIQUREUERybToNCisgIGNhc2UgWDg2OjpWSEFERFBEcnI6DQorICBjYXNlIFg4Njo6VkhBRERQU1lybToNCisgIGNhc2UgWDg2OjpWSEFERFBTWXJyOg0KKyAgY2FzZSBYODY6OlZIQUREUFNybToNCisgIGNhc2UgWDg2OjpWSEFERFBTcnI6DQorICBjYXNlIFg4Njo6VkhTVUJQRFlybToNCisgIGNhc2UgWDg2OjpWSFNVQlBEWXJyOg0KKyAgY2FzZSBYODY6OlZIU1VCUERybToNCisgIGNhc2UgWDg2OjpWSFNVQlBEcnI6DQorICBjYXNlIFg4Njo6VkhTVUJQU1lybToNCisgIGNhc2UgWDg2OjpWSFNVQlBTWXJyOg0KKyAgY2FzZSBYODY6OlZIU1VCUFNybToNCisgIGNhc2UgWDg2OjpWSFNVQlBTcnI6DQorICBjYXNlIFg4Njo6Vk1BU0tNT1ZQRFlybToNCisgIGNhc2UgWDg2OjpWTUFTS01PVlBEcm06DQorICBjYXNlIFg4Njo6Vk1BU0tNT1ZQU1lybToNCisgIGNhc2UgWDg2OjpWTUFTS01PVlBTcm06DQorICBjYXNlIFg4Njo6Vk1BWFBEWXJtOg0KKyAgY2FzZSBYODY6OlZNQVhQRFlybV9JbnQ6DQorICBjYXNlIFg4Njo6Vk1BWFBEWXJyOg0KKyAgY2FzZSBYODY6OlZNQVhQRFlycl9JbnQ6DQorICBjYXNlIFg4Njo6Vk1BWFBEcm06DQorICBjYXNlIFg4Njo6Vk1BWFBEcm1fSW50Og0KKyAgY2FzZSBYODY6OlZNQVhQRHJyOg0KKyAgY2FzZSBYODY6OlZNQVhQRHJyX0ludDoNCisgIGNhc2UgWDg2OjpWTUFYUFNZcm06DQorICBjYXNlIFg4Njo6Vk1BWFBTWXJtX0ludDoNCisgIGNhc2UgWDg2OjpWTUFYUFNZcnI6DQorICBjYXNlIFg4Njo6Vk1BWFBTWXJyX0ludDoNCisgIGNhc2UgWDg2OjpWTUFYUFNybToNCisgIGNhc2UgWDg2OjpWTUFYUFNybV9JbnQ6DQorICBjYXNlIFg4Njo6Vk1BWFBTcnI6DQorICBjYXNlIFg4Njo6Vk1BWFBTcnJfSW50Og0KKyAgY2FzZSBYODY6OlZNQVhTRHJtOg0KKyAgY2FzZSBYODY6OlZNQVhTRHJtX0ludDoNCisgIGNhc2UgWDg2OjpWTUFYU0RycjoNCisgIGNhc2UgWDg2OjpWTUFYU0Rycl9JbnQ6DQorICBjYXNlIFg4Njo6Vk1BWFNTcm06DQorICBjYXNlIFg4Njo6Vk1BWFNTcm1fSW50Og0KKyAgY2FzZSBYODY6OlZNQVhTU3JyOg0KKyAgY2FzZSBYODY6OlZNQVhTU3JyX0ludDoNCisgIGNhc2UgWDg2OjpWTUlOUERZcm06DQorICBjYXNlIFg4Njo6Vk1JTlBEWXJtX0ludDoNCisgIGNhc2UgWDg2OjpWTUlOUERZcnI6DQorICBjYXNlIFg4Njo6Vk1JTlBEWXJyX0ludDoNCisgIGNhc2UgWDg2OjpWTUlOUERybToNCisgIGNhc2UgWDg2OjpWTUlOUERybV9JbnQ6DQorICBjYXNlIFg4Njo6Vk1JTlBEcnI6DQorICBjYXNlIFg4Njo6Vk1JTlBEcnJfSW50Og0KKyAgY2FzZSBYODY6OlZNSU5QU1lybToNCisgIGNhc2UgWDg2OjpWTUlOUFNZcm1fSW50Og0KKyAgY2FzZSBYODY6OlZNSU5QU1lycjoNCisgIGNhc2UgWDg2OjpWTUlOUFNZcnJfSW50Og0KKyAgY2FzZSBYODY6OlZNSU5QU3JtOg0KKyAgY2FzZSBYODY6OlZNSU5QU3JtX0ludDoNCisgIGNhc2UgWDg2OjpWTUlOUFNycjoNCisgIGNhc2UgWDg2OjpWTUlOUFNycl9JbnQ6DQorICBjYXNlIFg4Njo6Vk1JTlNEcm06DQorICBjYXNlIFg4Njo6Vk1JTlNEcm1fSW50Og0KKyAgY2FzZSBYODY6OlZNSU5TRHJyOg0KKyAgY2FzZSBYODY6OlZNSU5TRHJyX0ludDoNCisgIGNhc2UgWDg2OjpWTUlOU1NybToNCisgIGNhc2UgWDg2OjpWTUlOU1NybV9JbnQ6DQorICBjYXNlIFg4Njo6Vk1JTlNTcnI6DQorICBjYXNlIFg4Njo6Vk1JTlNTcnJfSW50Og0KKyAgY2FzZSBYODY6OlZNT1ZITFBTcnI6DQorICBjYXNlIFg4Njo6Vk1PVkhQRHJtOg0KKyAgY2FzZSBYODY6OlZNT1ZIUFNybToNCisgIGNhc2UgWDg2OjpWTU9WTEhQU3JyOg0KKyAgY2FzZSBYODY6OlZNT1ZMUERybToNCisgIGNhc2UgWDg2OjpWTU9WTFBTcm06DQorICBjYXNlIFg4Njo6Vk1PVlNEcnI6DQorICBjYXNlIFg4Njo6Vk1PVlNTcnI6DQorICBjYXNlIFg4Njo6Vk1VTFBEWXJtOg0KKyAgY2FzZSBYODY6OlZNVUxQRFlycjoNCisgIGNhc2UgWDg2OjpWTVVMUERybToNCisgIGNhc2UgWDg2OjpWTVVMUERycjoNCisgIGNhc2UgWDg2OjpWTVVMUFNZcm06DQorICBjYXNlIFg4Njo6Vk1VTFBTWXJyOg0KKyAgY2FzZSBYODY6OlZNVUxQU3JtOg0KKyAgY2FzZSBYODY6OlZNVUxQU3JyOg0KKyAgY2FzZSBYODY6OlZNVUxTRHJtOg0KKyAgY2FzZSBYODY6OlZNVUxTRHJtX0ludDoNCisgIGNhc2UgWDg2OjpWTVVMU0RycjoNCisgIGNhc2UgWDg2OjpWTVVMU0Rycl9JbnQ6DQorICBjYXNlIFg4Njo6Vk1VTFNTcm06DQorICBjYXNlIFg4Njo6Vk1VTFNTcm1fSW50Og0KKyAgY2FzZSBYODY6OlZNVUxTU3JyOg0KKyAgY2FzZSBYODY6OlZNVUxTU3JyX0ludDoNCisgIGNhc2UgWDg2OjpWT1JQRFlybToNCisgIGNhc2UgWDg2OjpWT1JQRFlycjoNCisgIGNhc2UgWDg2OjpWT1JQRHJtOg0KKyAgY2FzZSBYODY6OlZPUlBEcnI6DQorICBjYXNlIFg4Njo6Vk9SUFNZcm06DQorICBjYXNlIFg4Njo6Vk9SUFNZcnI6DQorICBjYXNlIFg4Njo6Vk9SUFNybToNCisgIGNhc2UgWDg2OjpWT1JQU3JyOg0KKyAgY2FzZSBYODY6OlZQQUNLU1NEV3JtOg0KKyAgY2FzZSBYODY6OlZQQUNLU1NEV3JyOg0KKyAgY2FzZSBYODY6OlZQQUNLU1NXQnJtOg0KKyAgY2FzZSBYODY6OlZQQUNLU1NXQnJyOg0KKyAgY2FzZSBYODY6OlZQQUNLVVNEV3JtOg0KKyAgY2FzZSBYODY6OlZQQUNLVVNEV3JyOg0KKyAgY2FzZSBYODY6OlZQQUNLVVNXQnJtOg0KKyAgY2FzZSBYODY6OlZQQUNLVVNXQnJyOg0KKyAgY2FzZSBYODY6OlZQQUREQnJtOg0KKyAgY2FzZSBYODY6OlZQQUREQnJyOg0KKyAgY2FzZSBYODY6OlZQQURERHJtOg0KKyAgY2FzZSBYODY6OlZQQURERHJyOg0KKyAgY2FzZSBYODY6OlZQQUREUXJtOg0KKyAgY2FzZSBYODY6OlZQQUREUXJyOg0KKyAgY2FzZSBYODY6OlZQQUREU0JybToNCisgIGNhc2UgWDg2OjpWUEFERFNCcnI6DQorICBjYXNlIFg4Njo6VlBBRERTV3JtOg0KKyAgY2FzZSBYODY6OlZQQUREU1dycjoNCisgIGNhc2UgWDg2OjpWUEFERFVTQnJtOg0KKyAgY2FzZSBYODY6OlZQQUREVVNCcnI6DQorICBjYXNlIFg4Njo6VlBBRERVU1dybToNCisgIGNhc2UgWDg2OjpWUEFERFVTV3JyOg0KKyAgY2FzZSBYODY6OlZQQUREV3JtOg0KKyAgY2FzZSBYODY6OlZQQUREV3JyOg0KKyAgY2FzZSBYODY6OlZQQU5ETnJtOg0KKyAgY2FzZSBYODY6OlZQQU5ETnJyOg0KKyAgY2FzZSBYODY6OlZQQU5Ecm06DQorICBjYXNlIFg4Njo6VlBBTkRycjoNCisgIGNhc2UgWDg2OjpWUEFWR0JybToNCisgIGNhc2UgWDg2OjpWUEFWR0JycjoNCisgIGNhc2UgWDg2OjpWUEFWR1dybToNCisgIGNhc2UgWDg2OjpWUEFWR1dycjoNCisgIGNhc2UgWDg2OjpWUENMTVVMSFFIUURRcm06DQorICBjYXNlIFg4Njo6VlBDTE1VTEhRSFFEUXJyOg0KKyAgY2FzZSBYODY6OlZQQ0xNVUxIUUxRRFFybToNCisgIGNhc2UgWDg2OjpWUENMTVVMSFFMUURRcnI6DQorICBjYXNlIFg4Njo6VlBDTE1VTExRSFFEUXJtOg0KKyAgY2FzZSBYODY6OlZQQ0xNVUxMUUhRRFFycjoNCisgIGNhc2UgWDg2OjpWUENMTVVMTFFMUURRcm06DQorICBjYXNlIFg4Njo6VlBDTE1VTExRTFFEUXJyOg0KKyAgY2FzZSBYODY6OlZQQ01QRVFCcm06DQorICBjYXNlIFg4Njo6VlBDTVBFUUJycjoNCisgIGNhc2UgWDg2OjpWUENNUEVRRHJtOg0KKyAgY2FzZSBYODY6OlZQQ01QRVFEcnI6DQorICBjYXNlIFg4Njo6VlBDTVBFUVFybToNCisgIGNhc2UgWDg2OjpWUENNUEVRUXJyOg0KKyAgY2FzZSBYODY6OlZQQ01QRVFXcm06DQorICBjYXNlIFg4Njo6VlBDTVBFUVdycjoNCisgIGNhc2UgWDg2OjpWUENNUEVTVFJJQXJtOg0KKyAgY2FzZSBYODY6OlZQQ01QRVNUUklBcnI6DQorICBjYXNlIFg4Njo6VlBDTVBFU1RSSUNybToNCisgIGNhc2UgWDg2OjpWUENNUEVTVFJJQ3JyOg0KKyAgY2FzZSBYODY6OlZQQ01QRVNUUklPcm06DQorICBjYXNlIFg4Njo6VlBDTVBFU1RSSU9ycjoNCisgIGNhc2UgWDg2OjpWUENNUEVTVFJJU3JtOg0KKyAgY2FzZSBYODY6OlZQQ01QRVNUUklTcnI6DQorICBjYXNlIFg4Njo6VlBDTVBFU1RSSVpybToNCisgIGNhc2UgWDg2OjpWUENNUEVTVFJJWnJyOg0KKyAgY2FzZSBYODY6OlZQQ01QRVNUUklybToNCisgIGNhc2UgWDg2OjpWUENNUEVTVFJJcnI6DQorICBjYXNlIFg4Njo6VlBDTVBFU1RSTTEyOHJtOg0KKyAgY2FzZSBYODY6OlZQQ01QRVNUUk0xMjhycjoNCisgIGNhc2UgWDg2OjpWUENNUEdUQnJtOg0KKyAgY2FzZSBYODY6OlZQQ01QR1RCcnI6DQorICBjYXNlIFg4Njo6VlBDTVBHVERybToNCisgIGNhc2UgWDg2OjpWUENNUEdURHJyOg0KKyAgY2FzZSBYODY6OlZQQ01QR1RRcm06DQorICBjYXNlIFg4Njo6VlBDTVBHVFFycjoNCisgIGNhc2UgWDg2OjpWUENNUEdUV3JtOg0KKyAgY2FzZSBYODY6OlZQQ01QR1RXcnI6DQorICBjYXNlIFg4Njo6VlBDTVBJU1RSSUFybToNCisgIGNhc2UgWDg2OjpWUENNUElTVFJJQXJyOg0KKyAgY2FzZSBYODY6OlZQQ01QSVNUUklDcm06DQorICBjYXNlIFg4Njo6VlBDTVBJU1RSSUNycjoNCisgIGNhc2UgWDg2OjpWUENNUElTVFJJT3JtOg0KKyAgY2FzZSBYODY6OlZQQ01QSVNUUklPcnI6DQorICBjYXNlIFg4Njo6VlBDTVBJU1RSSVNybToNCisgIGNhc2UgWDg2OjpWUENNUElTVFJJU3JyOg0KKyAgY2FzZSBYODY6OlZQQ01QSVNUUklacm06DQorICBjYXNlIFg4Njo6VlBDTVBJU1RSSVpycjoNCisgIGNhc2UgWDg2OjpWUENNUElTVFJJcm06DQorICBjYXNlIFg4Njo6VlBDTVBJU1RSSXJyOg0KKyAgY2FzZSBYODY6OlZQQ01QSVNUUk0xMjhybToNCisgIGNhc2UgWDg2OjpWUENNUElTVFJNMTI4cnI6DQorICBjYXNlIFg4Njo6VlBFUk1JTFBEWW1pOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQRFlyaToNCisgIGNhc2UgWDg2OjpWUEVSTUlMUERZcm06DQorICBjYXNlIFg4Njo6VlBFUk1JTFBEWXJyOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQRG1pOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQRHJpOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQRHJtOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQRHJyOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQU1ltaToNCisgIGNhc2UgWDg2OjpWUEVSTUlMUFNZcmk6DQorICBjYXNlIFg4Njo6VlBFUk1JTFBTWXJtOg0KKyAgY2FzZSBYODY6OlZQRVJNSUxQU1lycjoNCisgIGNhc2UgWDg2OjpWUEVSTUlMUFNtaToNCisgIGNhc2UgWDg2OjpWUEVSTUlMUFNyaToNCisgIGNhc2UgWDg2OjpWUEVSTUlMUFNybToNCisgIGNhc2UgWDg2OjpWUEVSTUlMUFNycjoNCisgIGNhc2UgWDg2OjpWUEVYVFJCbXI6DQorICBjYXNlIFg4Njo6VlBFWFRSQnJyOg0KKyAgY2FzZSBYODY6OlZQRVhUUkJycjY0Og0KKyAgY2FzZSBYODY6OlZQRVhUUkRtcjoNCisgIGNhc2UgWDg2OjpWUEVYVFJEcnI6DQorICBjYXNlIFg4Njo6VlBFWFRSUW1yOg0KKyAgY2FzZSBYODY6OlZQRVhUUlFycjoNCisgIGNhc2UgWDg2OjpWUEVYVFJXbXI6DQorICBjYXNlIFg4Njo6VlBFWFRSV3JpOg0KKyAgY2FzZSBYODY6OlZQSEFERERybTEyODoNCisgIGNhc2UgWDg2OjpWUEhBREREcm02NDoNCisgIGNhc2UgWDg2OjpWUEhBREREcnIxMjg6DQorICBjYXNlIFg4Njo6VlBIQURERHJyNjQ6DQorICBjYXNlIFg4Njo6VlBIQUREU1dybTEyODoNCisgIGNhc2UgWDg2OjpWUEhBRERTV3JtNjQ6DQorICBjYXNlIFg4Njo6VlBIQUREU1dycjEyODoNCisgIGNhc2UgWDg2OjpWUEhBRERTV3JyNjQ6DQorICBjYXNlIFg4Njo6VlBIQUREV3JtMTI4Og0KKyAgY2FzZSBYODY6OlZQSEFERFdybTY0Og0KKyAgY2FzZSBYODY6OlZQSEFERFdycjEyODoNCisgIGNhc2UgWDg2OjpWUEhBRERXcnI2NDoNCisgIGNhc2UgWDg2OjpWUEhTVUJEcm0xMjg6DQorICBjYXNlIFg4Njo6VlBIU1VCRHJtNjQ6DQorICBjYXNlIFg4Njo6VlBIU1VCRHJyMTI4Og0KKyAgY2FzZSBYODY6OlZQSFNVQkRycjY0Og0KKyAgY2FzZSBYODY6OlZQSFNVQlNXcm0xMjg6DQorICBjYXNlIFg4Njo6VlBIU1VCU1dybTY0Og0KKyAgY2FzZSBYODY6OlZQSFNVQlNXcnIxMjg6DQorICBjYXNlIFg4Njo6VlBIU1VCU1dycjY0Og0KKyAgY2FzZSBYODY6OlZQSFNVQldybTEyODoNCisgIGNhc2UgWDg2OjpWUEhTVUJXcm02NDoNCisgIGNhc2UgWDg2OjpWUEhTVUJXcnIxMjg6DQorICBjYXNlIFg4Njo6VlBIU1VCV3JyNjQ6DQorICBjYXNlIFg4Njo6VlBNQUREVUJTV3JtMTI4Og0KKyAgY2FzZSBYODY6OlZQTUFERFVCU1dybTY0Og0KKyAgY2FzZSBYODY6OlZQTUFERFVCU1dycjEyODoNCisgIGNhc2UgWDg2OjpWUE1BRERVQlNXcnI2NDoNCisgIGNhc2UgWDg2OjpWUE1BRERXRHJtOg0KKyAgY2FzZSBYODY6OlZQTUFERFdEcnI6DQorICBjYXNlIFg4Njo6VlBNQVhTQnJtOg0KKyAgY2FzZSBYODY6OlZQTUFYU0JycjoNCisgIGNhc2UgWDg2OjpWUE1BWFNEcm06DQorICBjYXNlIFg4Njo6VlBNQVhTRHJyOg0KKyAgY2FzZSBYODY6OlZQTUFYU1dybToNCisgIGNhc2UgWDg2OjpWUE1BWFNXcnI6DQorICBjYXNlIFg4Njo6VlBNQVhVQnJtOg0KKyAgY2FzZSBYODY6OlZQTUFYVUJycjoNCisgIGNhc2UgWDg2OjpWUE1BWFVEcm06DQorICBjYXNlIFg4Njo6VlBNQVhVRHJyOg0KKyAgY2FzZSBYODY6OlZQTUFYVVdybToNCisgIGNhc2UgWDg2OjpWUE1BWFVXcnI6DQorICBjYXNlIFg4Njo6VlBNSU5TQnJtOg0KKyAgY2FzZSBYODY6OlZQTUlOU0JycjoNCisgIGNhc2UgWDg2OjpWUE1JTlNEcm06DQorICBjYXNlIFg4Njo6VlBNSU5TRHJyOg0KKyAgY2FzZSBYODY6OlZQTUlOU1dybToNCisgIGNhc2UgWDg2OjpWUE1JTlNXcnI6DQorICBjYXNlIFg4Njo6VlBNSU5VQnJtOg0KKyAgY2FzZSBYODY6OlZQTUlOVUJycjoNCisgIGNhc2UgWDg2OjpWUE1JTlVEcm06DQorICBjYXNlIFg4Njo6VlBNSU5VRHJyOg0KKyAgY2FzZSBYODY6OlZQTUlOVVdybToNCisgIGNhc2UgWDg2OjpWUE1JTlVXcnI6DQorICBjYXNlIFg4Njo6VlBNVUxEUXJtOg0KKyAgY2FzZSBYODY6OlZQTVVMRFFycjoNCisgIGNhc2UgWDg2OjpWUE1VTEhSU1dybTEyODoNCisgIGNhc2UgWDg2OjpWUE1VTEhSU1dybTY0Og0KKyAgY2FzZSBYODY6OlZQTVVMSFJTV3JyMTI4Og0KKyAgY2FzZSBYODY6OlZQTVVMSFJTV3JyNjQ6DQorICBjYXNlIFg4Njo6VlBNVUxIVVdybToNCisgIGNhc2UgWDg2OjpWUE1VTEhVV3JyOg0KKyAgY2FzZSBYODY6OlZQTVVMSFdybToNCisgIGNhc2UgWDg2OjpWUE1VTEhXcnI6DQorICBjYXNlIFg4Njo6VlBNVUxMRHJtOg0KKyAgY2FzZSBYODY6OlZQTVVMTERycjoNCisgIGNhc2UgWDg2OjpWUE1VTExXcm06DQorICBjYXNlIFg4Njo6VlBNVUxMV3JyOg0KKyAgY2FzZSBYODY6OlZQTVVMVURRcm06DQorICBjYXNlIFg4Njo6VlBNVUxVRFFycjoNCisgIGNhc2UgWDg2OjpWUE9Scm06DQorICBjYXNlIFg4Njo6VlBPUnJyOg0KKyAgY2FzZSBYODY6OlZQU0FEQldybToNCisgIGNhc2UgWDg2OjpWUFNBREJXcnI6DQorICBjYXNlIFg4Njo6VlBTSFVGQnJtMTI4Og0KKyAgY2FzZSBYODY6OlZQU0hVRkJybTY0Og0KKyAgY2FzZSBYODY6OlZQU0hVRkJycjEyODoNCisgIGNhc2UgWDg2OjpWUFNIVUZCcnI2NDoNCisgIGNhc2UgWDg2OjpWUFNIVUZEbWk6DQorICBjYXNlIFg4Njo6VlBTSFVGRHJpOg0KKyAgY2FzZSBYODY6OlZQU0hVRkhXbWk6DQorICBjYXNlIFg4Njo6VlBTSFVGSFdyaToNCisgIGNhc2UgWDg2OjpWUFNIVUZMV21pOg0KKyAgY2FzZSBYODY6OlZQU0hVRkxXcmk6DQorICBjYXNlIFg4Njo6VlBTSUdOQnJtMTI4Og0KKyAgY2FzZSBYODY6OlZQU0lHTkJybTY0Og0KKyAgY2FzZSBYODY6OlZQU0lHTkJycjEyODoNCisgIGNhc2UgWDg2OjpWUFNJR05CcnI2NDoNCisgIGNhc2UgWDg2OjpWUFNJR05Ecm0xMjg6DQorICBjYXNlIFg4Njo6VlBTSUdORHJtNjQ6DQorICBjYXNlIFg4Njo6VlBTSUdORHJyMTI4Og0KKyAgY2FzZSBYODY6OlZQU0lHTkRycjY0Og0KKyAgY2FzZSBYODY6OlZQU0lHTldybTEyODoNCisgIGNhc2UgWDg2OjpWUFNJR05Xcm02NDoNCisgIGNhc2UgWDg2OjpWUFNJR05XcnIxMjg6DQorICBjYXNlIFg4Njo6VlBTSUdOV3JyNjQ6DQorICBjYXNlIFg4Njo6VlBTTExEUXJpOg0KKyAgY2FzZSBYODY6OlZQU0xMRHJpOg0KKyAgY2FzZSBYODY6OlZQU0xMRHJtOg0KKyAgY2FzZSBYODY6OlZQU0xMRHJyOg0KKyAgY2FzZSBYODY6OlZQU0xMUXJpOg0KKyAgY2FzZSBYODY6OlZQU0xMUXJtOg0KKyAgY2FzZSBYODY6OlZQU0xMUXJyOg0KKyAgY2FzZSBYODY6OlZQU0xMV3JpOg0KKyAgY2FzZSBYODY6OlZQU0xMV3JtOg0KKyAgY2FzZSBYODY6OlZQU0xMV3JyOg0KKyAgY2FzZSBYODY6OlZQU1JBRHJpOg0KKyAgY2FzZSBYODY6OlZQU1JBRHJtOg0KKyAgY2FzZSBYODY6OlZQU1JBRHJyOg0KKyAgY2FzZSBYODY6OlZQU1JBV3JpOg0KKyAgY2FzZSBYODY6OlZQU1JBV3JtOg0KKyAgY2FzZSBYODY6OlZQU1JBV3JyOg0KKyAgY2FzZSBYODY6OlZQU1JMRFFyaToNCisgIGNhc2UgWDg2OjpWUFNSTERyaToNCisgIGNhc2UgWDg2OjpWUFNSTERybToNCisgIGNhc2UgWDg2OjpWUFNSTERycjoNCisgIGNhc2UgWDg2OjpWUFNSTFFyaToNCisgIGNhc2UgWDg2OjpWUFNSTFFybToNCisgIGNhc2UgWDg2OjpWUFNSTFFycjoNCisgIGNhc2UgWDg2OjpWUFNSTFdyaToNCisgIGNhc2UgWDg2OjpWUFNSTFdybToNCisgIGNhc2UgWDg2OjpWUFNSTFdycjoNCisgIGNhc2UgWDg2OjpWUFNVQkJybToNCisgIGNhc2UgWDg2OjpWUFNVQkJycjoNCisgIGNhc2UgWDg2OjpWUFNVQkRybToNCisgIGNhc2UgWDg2OjpWUFNVQkRycjoNCisgIGNhc2UgWDg2OjpWUFNVQlFybToNCisgIGNhc2UgWDg2OjpWUFNVQlFycjoNCisgIGNhc2UgWDg2OjpWUFNVQlNCcm06DQorICBjYXNlIFg4Njo6VlBTVUJTQnJyOg0KKyAgY2FzZSBYODY6OlZQU1VCU1dybToNCisgIGNhc2UgWDg2OjpWUFNVQlNXcnI6DQorICBjYXNlIFg4Njo6VlBTVUJVU0JybToNCisgIGNhc2UgWDg2OjpWUFNVQlVTQnJyOg0KKyAgY2FzZSBYODY6OlZQU1VCVVNXcm06DQorICBjYXNlIFg4Njo6VlBTVUJVU1dycjoNCisgIGNhc2UgWDg2OjpWUFNVQldybToNCisgIGNhc2UgWDg2OjpWUFNVQldycjoNCisgIGNhc2UgWDg2OjpWUFVOUENLSEJXcm06DQorICBjYXNlIFg4Njo6VlBVTlBDS0hCV3JyOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tIRFFybToNCisgIGNhc2UgWDg2OjpWUFVOUENLSERRcnI6DQorICBjYXNlIFg4Njo6VlBVTlBDS0hRRFFybToNCisgIGNhc2UgWDg2OjpWUFVOUENLSFFEUXJyOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tIV0RybToNCisgIGNhc2UgWDg2OjpWUFVOUENLSFdEcnI6DQorICBjYXNlIFg4Njo6VlBVTlBDS0xCV3JtOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tMQldycjoNCisgIGNhc2UgWDg2OjpWUFVOUENLTERRcm06DQorICBjYXNlIFg4Njo6VlBVTlBDS0xEUXJyOg0KKyAgY2FzZSBYODY6OlZQVU5QQ0tMUURRcm06DQorICBjYXNlIFg4Njo6VlBVTlBDS0xRRFFycjoNCisgIGNhc2UgWDg2OjpWUFVOUENLTFdEcm06DQorICBjYXNlIFg4Njo6VlBVTlBDS0xXRHJyOg0KKyAgY2FzZSBYODY6OlZQWE9Scm06DQorICBjYXNlIFg4Njo6VlBYT1JycjoNCisgIGNhc2UgWDg2OjpWUkNQU1NtOg0KKyAgY2FzZSBYODY6OlZSQ1BTU3I6DQorICBjYXNlIFg4Njo6VlJPVU5EUERtOg0KKyAgY2FzZSBYODY6OlZST1VORFBEbV9JbnQ6DQorICBjYXNlIFg4Njo6VlJPVU5EUERyOg0KKyAgY2FzZSBYODY6OlZST1VORFBEcl9JbnQ6DQorICBjYXNlIFg4Njo6VlJPVU5EUFNtOg0KKyAgY2FzZSBYODY6OlZST1VORFBTbV9JbnQ6DQorICBjYXNlIFg4Njo6VlJPVU5EUFNyOg0KKyAgY2FzZSBYODY6OlZST1VORFBTcl9JbnQ6DQorICBjYXNlIFg4Njo6VlJPVU5EWVBEbToNCisgIGNhc2UgWDg2OjpWUk9VTkRZUERtX0ludDoNCisgIGNhc2UgWDg2OjpWUk9VTkRZUERyOg0KKyAgY2FzZSBYODY6OlZST1VORFlQRHJfSW50Og0KKyAgY2FzZSBYODY6OlZST1VORFlQU206DQorICBjYXNlIFg4Njo6VlJPVU5EWVBTbV9JbnQ6DQorICBjYXNlIFg4Njo6VlJPVU5EWVBTcjoNCisgIGNhc2UgWDg2OjpWUk9VTkRZUFNyX0ludDoNCisgIGNhc2UgWDg2OjpWUlNRUlRTU206DQorICBjYXNlIFg4Njo6VlJTUVJUU1NyOg0KKyAgY2FzZSBYODY6OlZTUVJUU0RtOg0KKyAgY2FzZSBYODY6OlZTUVJUU0RyOg0KKyAgY2FzZSBYODY6OlZTUVJUU1NtOg0KKyAgY2FzZSBYODY6OlZTUVJUU1NyOg0KKyAgY2FzZSBYODY6OlZTVUJQRFlybToNCisgIGNhc2UgWDg2OjpWU1VCUERZcnI6DQorICBjYXNlIFg4Njo6VlNVQlBEcm06DQorICBjYXNlIFg4Njo6VlNVQlBEcnI6DQorICBjYXNlIFg4Njo6VlNVQlBTWXJtOg0KKyAgY2FzZSBYODY6OlZTVUJQU1lycjoNCisgIGNhc2UgWDg2OjpWU1VCUFNybToNCisgIGNhc2UgWDg2OjpWU1VCUFNycjoNCisgIGNhc2UgWDg2OjpWU1VCU0RybToNCisgIGNhc2UgWDg2OjpWU1VCU0RybV9JbnQ6DQorICBjYXNlIFg4Njo6VlNVQlNEcnI6DQorICBjYXNlIFg4Njo6VlNVQlNEcnJfSW50Og0KKyAgY2FzZSBYODY6OlZTVUJTU3JtOg0KKyAgY2FzZSBYODY6OlZTVUJTU3JtX0ludDoNCisgIGNhc2UgWDg2OjpWU1VCU1NycjoNCisgIGNhc2UgWDg2OjpWU1VCU1Nycl9JbnQ6DQorICBjYXNlIFg4Njo6VlVOUENLSFBEWXJtOg0KKyAgY2FzZSBYODY6OlZVTlBDS0hQRFlycjoNCisgIGNhc2UgWDg2OjpWVU5QQ0tIUERybToNCisgIGNhc2UgWDg2OjpWVU5QQ0tIUERycjoNCisgIGNhc2UgWDg2OjpWVU5QQ0tIUFNZcm06DQorICBjYXNlIFg4Njo6VlVOUENLSFBTWXJyOg0KKyAgY2FzZSBYODY6OlZVTlBDS0hQU3JtOg0KKyAgY2FzZSBYODY6OlZVTlBDS0hQU3JyOg0KKyAgY2FzZSBYODY6OlZVTlBDS0xQRFlybToNCisgIGNhc2UgWDg2OjpWVU5QQ0tMUERZcnI6DQorICBjYXNlIFg4Njo6VlVOUENLTFBEcm06DQorICBjYXNlIFg4Njo6VlVOUENLTFBEcnI6DQorICBjYXNlIFg4Njo6VlVOUENLTFBTWXJtOg0KKyAgY2FzZSBYODY6OlZVTlBDS0xQU1lycjoNCisgIGNhc2UgWDg2OjpWVU5QQ0tMUFNybToNCisgIGNhc2UgWDg2OjpWVU5QQ0tMUFNycjoNCisgIGNhc2UgWDg2OjpWWE9SUERZcm06DQorICBjYXNlIFg4Njo6VlhPUlBEWXJyOg0KKyAgY2FzZSBYODY6OlZYT1JQRHJtOg0KKyAgY2FzZSBYODY6OlZYT1JQRHJyOg0KKyAgY2FzZSBYODY6OlZYT1JQU1lybToNCisgIGNhc2UgWDg2OjpWWE9SUFNZcnI6DQorICBjYXNlIFg4Njo6VlhPUlBTcm06DQorICBjYXNlIFg4Njo6VlhPUlBTcnI6DQorICAgIE8gPDwgIiwgIjsgDQorICAgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7DQorICAgIGNhc2UgWDg2OjpBRVNLRVlHRU5BU1NJU1QxMjhybTogDQorICAgIGNhc2UgWDg2OjpFWFRSQUNUUFNtcjogDQorICAgIGNhc2UgWDg2OjpJTVVMMTZybWk6IA0KKyAgICBjYXNlIFg4Njo6SU1VTDE2cm1pODogDQorICAgIGNhc2UgWDg2OjpJTVVMMzJybWk6IA0KKyAgICBjYXNlIFg4Njo6SU1VTDMycm1pODogDQorICAgIGNhc2UgWDg2OjpJTVVMNjRybWkzMjogDQorICAgIGNhc2UgWDg2OjpJTVVMNjRybWk4OiANCisgICAgY2FzZSBYODY6Ok1NWF9QU0hVRldtaTogDQorICAgIGNhc2UgWDg2OjpQQ01QRVNUUklBcm06IA0KKyAgICBjYXNlIFg4Njo6UENNUEVTVFJJQ3JtOiANCisgICAgY2FzZSBYODY6OlBDTVBFU1RSSU9ybTogDQorICAgIGNhc2UgWDg2OjpQQ01QRVNUUklTcm06IA0KKyAgICBjYXNlIFg4Njo6UENNUEVTVFJJWnJtOiANCisgICAgY2FzZSBYODY6OlBDTVBFU1RSSXJtOiANCisgICAgY2FzZSBYODY6OlBDTVBFU1RSTTEyOHJtOiANCisgICAgY2FzZSBYODY6OlBDTVBJU1RSSUFybTogDQorICAgIGNhc2UgWDg2OjpQQ01QSVNUUklDcm06IA0KKyAgICBjYXNlIFg4Njo6UENNUElTVFJJT3JtOiANCisgICAgY2FzZSBYODY6OlBDTVBJU1RSSVNybTogDQorICAgIGNhc2UgWDg2OjpQQ01QSVNUUklacm06IA0KKyAgICBjYXNlIFg4Njo6UENNUElTVFJJcm06IA0KKyAgICBjYXNlIFg4Njo6UENNUElTVFJNMTI4cm06IA0KKyAgICBjYXNlIFg4Njo6UEVYVFJCbXI6IA0KKyAgICBjYXNlIFg4Njo6UEVYVFJEbXI6IA0KKyAgICBjYXNlIFg4Njo6UEVYVFJRbXI6IA0KKyAgICBjYXNlIFg4Njo6UEVYVFJXbXI6IA0KKyAgICBjYXNlIFg4Njo6UFNIVUZEbWk6IA0KKyAgICBjYXNlIFg4Njo6UFNIVUZIV21pOiANCisgICAgY2FzZSBYODY6OlBTSFVGTFdtaTogDQorICAgIGNhc2UgWDg2OjpST1VORFBEbV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Uk9VTkRQU21fSW50OiANCisgICAgY2FzZSBYODY6OlNITEQxNm1yaTg6IA0KKyAgICBjYXNlIFg4Njo6U0hMRDMybXJpODogDQorICAgIGNhc2UgWDg2OjpTSExENjRtcmk4OiANCisgICAgY2FzZSBYODY6OlNIUkQxNm1yaTg6IA0KKyAgICBjYXNlIFg4Njo6U0hSRDMybXJpODogDQorICAgIGNhc2UgWDg2OjpTSFJENjRtcmk4OiANCisgICAgY2FzZSBYODY6OlZBRVNLRVlHRU5BU1NJU1QxMjhybTogDQorICAgIGNhc2UgWDg2OjpWRVhUUkFDVFBTbXI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFU1RSSUFybTogDQorICAgIGNhc2UgWDg2OjpWUENNUEVTVFJJQ3JtOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVNUUklPcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFU1RSSVNybTogDQorICAgIGNhc2UgWDg2OjpWUENNUEVTVFJJWnJtOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVNUUklybTogDQorICAgIGNhc2UgWDg2OjpWUENNUEVTVFJNMTI4cm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBJU1RSSUFybTogDQorICAgIGNhc2UgWDg2OjpWUENNUElTVFJJQ3JtOiANCisgICAgY2FzZSBYODY6OlZQQ01QSVNUUklPcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBJU1RSSVNybTogDQorICAgIGNhc2UgWDg2OjpWUENNUElTVFJJWnJtOiANCisgICAgY2FzZSBYODY6OlZQQ01QSVNUUklybTogDQorICAgIGNhc2UgWDg2OjpWUENNUElTVFJNMTI4cm06IA0KKyAgICBjYXNlIFg4Njo6VlBFUk1JTFBEWW1pOiANCisgICAgY2FzZSBYODY6OlZQRVJNSUxQRG1pOiANCisgICAgY2FzZSBYODY6OlZQRVJNSUxQU1ltaTogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUFNtaTogDQorICAgIGNhc2UgWDg2OjpWUEVYVFJCbXI6IA0KKyAgICBjYXNlIFg4Njo6VlBFWFRSRG1yOiANCisgICAgY2FzZSBYODY6OlZQRVhUUlFtcjogDQorICAgIGNhc2UgWDg2OjpWUEVYVFJXbXI6IA0KKyAgICBjYXNlIFg4Njo6VlBTSFVGRG1pOiANCisgICAgY2FzZSBYODY6OlZQU0hVRkhXbWk6IA0KKyAgICBjYXNlIFg4Njo6VlBTSFVGTFdtaTogDQorICAgIGNhc2UgWDg2OjpWUk9VTkRQRG06IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EUERtX0ludDogDQorICAgIGNhc2UgWDg2OjpWUk9VTkRQU206IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EUFNtX0ludDogDQorICAgIGNhc2UgWDg2OjpWUk9VTkRZUERtOiANCisgICAgY2FzZSBYODY6OlZST1VORFlQRG1fSW50OiANCisgICAgY2FzZSBYODY6OlZST1VORFlQU206IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EWVBTbV9JbnQ6IHByaW50T3BlcmFuZChNSSwgNiwgTyk7IGJyZWFrOw0KKyAgICBjYXNlIFg4Njo6QUVTS0VZR0VOQVNTSVNUMTI4cnI6IA0KKyAgICBjYXNlIFg4Njo6RVhUUkFDVFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6SU1VTDE2cnJpOiANCisgICAgY2FzZSBYODY6OklNVUwxNnJyaTg6IA0KKyAgICBjYXNlIFg4Njo6SU1VTDMycnJpOiANCisgICAgY2FzZSBYODY6OklNVUwzMnJyaTg6IA0KKyAgICBjYXNlIFg4Njo6SU1VTDY0cnJpMzI6IA0KKyAgICBjYXNlIFg4Njo6SU1VTDY0cnJpODogDQorICAgIGNhc2UgWDg2OjpJbnRfVkNNUFNEcnI6IA0KKyAgICBjYXNlIFg4Njo6SW50X1ZDTVBTU3JyOiANCisgICAgY2FzZSBYODY6OkludF9WQ1ZUU0QyU1NycjogDQorICAgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNENjRycjogDQorICAgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNEcnI6IA0KKyAgICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTUzY0cnI6IA0KKyAgICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTU3JyOiANCisgICAgY2FzZSBYODY6OkludF9WQ1ZUU1MyU0RycjogDQorICAgIGNhc2UgWDg2OjpNTVhfUEVYVFJXcmk6IA0KKyAgICBjYXNlIFg4Njo6TU1YX1BTSFVGV3JpOiANCisgICAgY2FzZSBYODY6OlBDTVBFU1RSSUFycjogDQorICAgIGNhc2UgWDg2OjpQQ01QRVNUUklDcnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUEVTVFJJT3JyOiANCisgICAgY2FzZSBYODY6OlBDTVBFU1RSSVNycjogDQorICAgIGNhc2UgWDg2OjpQQ01QRVNUUklacnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUEVTVFJJcnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUEVTVFJNMTI4cnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUElTVFJJQXJyOiANCisgICAgY2FzZSBYODY6OlBDTVBJU1RSSUNycjogDQorICAgIGNhc2UgWDg2OjpQQ01QSVNUUklPcnI6IA0KKyAgICBjYXNlIFg4Njo6UENNUElTVFJJU3JyOiANCisgICAgY2FzZSBYODY6OlBDTVBJU1RSSVpycjogDQorICAgIGNhc2UgWDg2OjpQQ01QSVNUUklycjogDQorICAgIGNhc2UgWDg2OjpQQ01QSVNUUk0xMjhycjogDQorICAgIGNhc2UgWDg2OjpQRVhUUkJycjogDQorICAgIGNhc2UgWDg2OjpQRVhUUkRycjogDQorICAgIGNhc2UgWDg2OjpQRVhUUlFycjogDQorICAgIGNhc2UgWDg2OjpQRVhUUldyaTogDQorICAgIGNhc2UgWDg2OjpQU0hVRkRyaTogDQorICAgIGNhc2UgWDg2OjpQU0hVRkhXcmk6IA0KKyAgICBjYXNlIFg4Njo6UFNIVUZMV3JpOiANCisgICAgY2FzZSBYODY6OlJPVU5EUERyX0ludDogDQorICAgIGNhc2UgWDg2OjpST1VORFBTcl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VkFERFBEWXJyOiANCisgICAgY2FzZSBYODY6OlZBRERQRHJyOiANCisgICAgY2FzZSBYODY6OlZBRERQU1lycjogDQorICAgIGNhc2UgWDg2OjpWQUREUFNycjogDQorICAgIGNhc2UgWDg2OjpWQUREU0RycjogDQorICAgIGNhc2UgWDg2OjpWQUREU0Rycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VkFERFNTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFERFNTcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZBRERTVUJQRFlycjogDQorICAgIGNhc2UgWDg2OjpWQUREU1VCUERycjogDQorICAgIGNhc2UgWDg2OjpWQUREU1VCUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFERFNVQlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFFU0RFQ0xBU1RycjogDQorICAgIGNhc2UgWDg2OjpWQUVTREVDcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFFU0VOQ0xBU1RycjogDQorICAgIGNhc2UgWDg2OjpWQUVTRU5DcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFFU0tFWUdFTkFTU0lTVDEyOHJyOiANCisgICAgY2FzZSBYODY6OlZBTkROUERZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFORE5QRHJyOiANCisgICAgY2FzZSBYODY6OlZBTkROUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFORE5QU3JyOiANCisgICAgY2FzZSBYODY6OlZBTkRQRFlycjogDQorICAgIGNhc2UgWDg2OjpWQU5EUERycjogDQorICAgIGNhc2UgWDg2OjpWQU5EUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFORFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkFTVEFSVF9TQVZFX1hNTV9SRUdTOiANCisgICAgY2FzZSBYODY6OlZDTVBQRFlycmk6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBEcnJpOiANCisgICAgY2FzZSBYODY6OlZDTVBQU1lycmk6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBTcnJpOiANCisgICAgY2FzZSBYODY6OlZDTVBTRHJyOiANCisgICAgY2FzZSBYODY6OlZDTVBTU3JyOiANCisgICAgY2FzZSBYODY6OlZDVlRTRDJTU3JyOiANCisgICAgY2FzZSBYODY6OlZDVlRTSTJTRDY0cnI6IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNJMlNETHJyOiANCisgICAgY2FzZSBYODY6OlZDVlRTSTJTRHJyOiANCisgICAgY2FzZSBYODY6OlZDVlRTSTJTUzY0cnI6IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNJMlNTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNTMlNEcnI6IA0KKyAgICBjYXNlIFg4Njo6VkRJVlBEWXJyOiANCisgICAgY2FzZSBYODY6OlZESVZQRHJyOiANCisgICAgY2FzZSBYODY6OlZESVZQU1lycjogDQorICAgIGNhc2UgWDg2OjpWRElWUFNycjogDQorICAgIGNhc2UgWDg2OjpWRElWU0RycjogDQorICAgIGNhc2UgWDg2OjpWRElWU0Rycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VkRJVlNTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkRJVlNTcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZFWFRSQUNURjEyOHJyOiANCisgICAgY2FzZSBYODY6OlZFWFRSQUNUUFNycjogDQorICAgIGNhc2UgWDg2OjpWRVhUUkFDVFBTcnI2NDogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQRHIxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBEcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUERyMjEzclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUERyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQRHIyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQU3IxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBTcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUFNyMjEzclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUFNyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQU3IyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMjEzclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMjEzclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMjEzclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMjEzclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQRHIxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBEcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBEcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUERyMjEzclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUERyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQRHIyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQU3IxMzJyOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBTcjEzMnJZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBTcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUFNyMjEzclk6IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUFNyMjMxcjogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQU3IyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUERyMTMycjogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUERyMTMyclk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBEcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBEcjIxM3JZOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQRHIyMzFyOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQRHIyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUFNyMTMycjogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUFNyMTMyclk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBTcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBTcjIxM3JZOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQU3IyMzFyOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQU3IyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUERyMTMycjogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUERyMTMyclk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIxM3JZOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMzFyOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMTMycjogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMTMyclk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIxM3I6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIxM3JZOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMzFyOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMzFyWTogDQorICAgIGNhc2UgWDg2OjpWRnNBTkROUERycjogDQorICAgIGNhc2UgWDg2OjpWRnNBTkROUFNycjogDQorICAgIGNhc2UgWDg2OjpWRnNBTkRQRHJyOiANCisgICAgY2FzZSBYODY6OlZGc0FORFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkZzT1JQRHJyOiANCisgICAgY2FzZSBYODY6OlZGc09SUFNycjogDQorICAgIGNhc2UgWDg2OjpWRnNYT1JQRHJyOiANCisgICAgY2FzZSBYODY6OlZGc1hPUlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkhBRERQRFlycjogDQorICAgIGNhc2UgWDg2OjpWSEFERFBEcnI6IA0KKyAgICBjYXNlIFg4Njo6VkhBRERQU1lycjogDQorICAgIGNhc2UgWDg2OjpWSEFERFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VkhTVUJQRFlycjogDQorICAgIGNhc2UgWDg2OjpWSFNVQlBEcnI6IA0KKyAgICBjYXNlIFg4Njo6VkhTVUJQU1lycjogDQorICAgIGNhc2UgWDg2OjpWSFNVQlBTcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFBEWXJyOiANCisgICAgY2FzZSBYODY6OlZNQVhQRFlycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFBEcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFBEcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZNQVhQU1lycjogDQorICAgIGNhc2UgWDg2OjpWTUFYUFNZcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZNQVhQU3JyOiANCisgICAgY2FzZSBYODY6OlZNQVhQU3JyX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUFYU0RycjogDQorICAgIGNhc2UgWDg2OjpWTUFYU0Rycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFNTcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFNTcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZNSU5QRFlycjogDQorICAgIGNhc2UgWDg2OjpWTUlOUERZcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZNSU5QRHJyOiANCisgICAgY2FzZSBYODY6OlZNSU5QRHJyX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUlOUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlBTWXJyX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUlOUFNycjogDQorICAgIGNhc2UgWDg2OjpWTUlOUFNycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlNEcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlNEcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZNSU5TU3JyOiANCisgICAgY2FzZSBYODY6OlZNSU5TU3JyX0ludDogDQorICAgIGNhc2UgWDg2OjpWTU9WSExQU3JyOiANCisgICAgY2FzZSBYODY6OlZNT1ZMSFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1PVlNEcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1PVlNTcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFBEWXJyOiANCisgICAgY2FzZSBYODY6OlZNVUxQRHJyOiANCisgICAgY2FzZSBYODY6OlZNVUxQU1lycjogDQorICAgIGNhc2UgWDg2OjpWTVVMUFNycjogDQorICAgIGNhc2UgWDg2OjpWTVVMU0RycjogDQorICAgIGNhc2UgWDg2OjpWTVVMU0Rycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFNTcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFNTcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZPUlBEWXJyOiANCisgICAgY2FzZSBYODY6OlZPUlBEcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk9SUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6Vk9SUFNycjogDQorICAgIGNhc2UgWDg2OjpWUEFDS1NTRFdycjogDQorICAgIGNhc2UgWDg2OjpWUEFDS1NTV0JycjogDQorICAgIGNhc2UgWDg2OjpWUEFDS1VTRFdycjogDQorICAgIGNhc2UgWDg2OjpWUEFDS1VTV0JycjogDQorICAgIGNhc2UgWDg2OjpWUEFEREJycjogDQorICAgIGNhc2UgWDg2OjpWUEFERERycjogDQorICAgIGNhc2UgWDg2OjpWUEFERFFycjogDQorICAgIGNhc2UgWDg2OjpWUEFERFNCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBRERTV3JyOiANCisgICAgY2FzZSBYODY6OlZQQUREVVNCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBBRERVU1dycjogDQorICAgIGNhc2UgWDg2OjpWUEFERFdycjogDQorICAgIGNhc2UgWDg2OjpWUEFORE5ycjogDQorICAgIGNhc2UgWDg2OjpWUEFORHJyOiANCisgICAgY2FzZSBYODY6OlZQQVZHQnJyOiANCisgICAgY2FzZSBYODY6OlZQQVZHV3JyOiANCisgICAgY2FzZSBYODY6OlZQQ0xNVUxIUUhRRFFycjogDQorICAgIGNhc2UgWDg2OjpWUENMTVVMSFFMUURRcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTE1VTExRSFFEUXJyOiANCisgICAgY2FzZSBYODY6OlZQQ0xNVUxMUUxRRFFycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEVRQnJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVFEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFUVFycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEVRV3JyOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVNUUklBcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFU1RSSUNycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEVTVFJJT3JyOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVNUUklTcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFU1RSSVpycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEVTVFJJcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFU1RSTTEyOHJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QR1RCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBHVERycjogDQorICAgIGNhc2UgWDg2OjpWUENNUEdUUXJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QR1RXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBJU1RSSUFycjogDQorICAgIGNhc2UgWDg2OjpWUENNUElTVFJJQ3JyOiANCisgICAgY2FzZSBYODY6OlZQQ01QSVNUUklPcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBJU1RSSVNycjogDQorICAgIGNhc2UgWDg2OjpWUENNUElTVFJJWnJyOiANCisgICAgY2FzZSBYODY6OlZQQ01QSVNUUklycjogDQorICAgIGNhc2UgWDg2OjpWUENNUElTVFJNMTI4cnI6IA0KKyAgICBjYXNlIFg4Njo6VlBFUk1JTFBEWXJpOiANCisgICAgY2FzZSBYODY6OlZQRVJNSUxQRFlycjogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUERyaTogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUERycjogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUFNZcmk6IA0KKyAgICBjYXNlIFg4Njo6VlBFUk1JTFBTWXJyOiANCisgICAgY2FzZSBYODY6OlZQRVJNSUxQU3JpOiANCisgICAgY2FzZSBYODY6OlZQRVJNSUxQU3JyOiANCisgICAgY2FzZSBYODY6OlZQRVhUUkJycjogDQorICAgIGNhc2UgWDg2OjpWUEVYVFJCcnI2NDogDQorICAgIGNhc2UgWDg2OjpWUEVYVFJEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBFWFRSUXJyOiANCisgICAgY2FzZSBYODY6OlZQRVhUUldyaTogDQorICAgIGNhc2UgWDg2OjpWUEhBREREcnIxMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBIQURERHJyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBIQUREU1dycjEyODogDQorICAgIGNhc2UgWDg2OjpWUEhBRERTV3JyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBIQUREV3JyMTI4OiANCisgICAgY2FzZSBYODY6OlZQSEFERFdycjY0OiANCisgICAgY2FzZSBYODY6OlZQSFNVQkRycjEyODogDQorICAgIGNhc2UgWDg2OjpWUEhTVUJEcnI2NDogDQorICAgIGNhc2UgWDg2OjpWUEhTVUJTV3JyMTI4OiANCisgICAgY2FzZSBYODY6OlZQSFNVQlNXcnI2NDogDQorICAgIGNhc2UgWDg2OjpWUEhTVUJXcnIxMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBIU1VCV3JyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBNQUREVUJTV3JyMTI4OiANCisgICAgY2FzZSBYODY6OlZQTUFERFVCU1dycjY0OiANCisgICAgY2FzZSBYODY6OlZQTUFERFdEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNQVhTQnJyOiANCisgICAgY2FzZSBYODY6OlZQTUFYU0RycjogDQorICAgIGNhc2UgWDg2OjpWUE1BWFNXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNQVhVQnJyOiANCisgICAgY2FzZSBYODY6OlZQTUFYVURycjogDQorICAgIGNhc2UgWDg2OjpWUE1BWFVXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNSU5TQnJyOiANCisgICAgY2FzZSBYODY6OlZQTUlOU0RycjogDQorICAgIGNhc2UgWDg2OjpWUE1JTlNXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNSU5VQnJyOiANCisgICAgY2FzZSBYODY6OlZQTUlOVURycjogDQorICAgIGNhc2UgWDg2OjpWUE1JTlVXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxEUXJyOiANCisgICAgY2FzZSBYODY6OlZQTVVMSFJTV3JyMTI4OiANCisgICAgY2FzZSBYODY6OlZQTVVMSFJTV3JyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxIVVdycjogDQorICAgIGNhc2UgWDg2OjpWUE1VTEhXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxMRHJyOiANCisgICAgY2FzZSBYODY6OlZQTVVMTFdycjogDQorICAgIGNhc2UgWDg2OjpWUE1VTFVEUXJyOiANCisgICAgY2FzZSBYODY6OlZQT1JycjogDQorICAgIGNhc2UgWDg2OjpWUFNBREJXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBTSFVGQnJyMTI4OiANCisgICAgY2FzZSBYODY6OlZQU0hVRkJycjY0OiANCisgICAgY2FzZSBYODY6OlZQU0hVRkRyaTogDQorICAgIGNhc2UgWDg2OjpWUFNIVUZIV3JpOiANCisgICAgY2FzZSBYODY6OlZQU0hVRkxXcmk6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdOQnJyMTI4OiANCisgICAgY2FzZSBYODY6OlZQU0lHTkJycjY0OiANCisgICAgY2FzZSBYODY6OlZQU0lHTkRycjEyODogDQorICAgIGNhc2UgWDg2OjpWUFNJR05EcnI2NDogDQorICAgIGNhc2UgWDg2OjpWUFNJR05XcnIxMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdOV3JyNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBTTExEUXJpOiANCisgICAgY2FzZSBYODY6OlZQU0xMRHJpOiANCisgICAgY2FzZSBYODY6OlZQU0xMRHJyOiANCisgICAgY2FzZSBYODY6OlZQU0xMUXJpOiANCisgICAgY2FzZSBYODY6OlZQU0xMUXJyOiANCisgICAgY2FzZSBYODY6OlZQU0xMV3JpOiANCisgICAgY2FzZSBYODY6OlZQU0xMV3JyOiANCisgICAgY2FzZSBYODY6OlZQU1JBRHJpOiANCisgICAgY2FzZSBYODY6OlZQU1JBRHJyOiANCisgICAgY2FzZSBYODY6OlZQU1JBV3JpOiANCisgICAgY2FzZSBYODY6OlZQU1JBV3JyOiANCisgICAgY2FzZSBYODY6OlZQU1JMRFFyaTogDQorICAgIGNhc2UgWDg2OjpWUFNSTERyaTogDQorICAgIGNhc2UgWDg2OjpWUFNSTERycjogDQorICAgIGNhc2UgWDg2OjpWUFNSTFFyaTogDQorICAgIGNhc2UgWDg2OjpWUFNSTFFycjogDQorICAgIGNhc2UgWDg2OjpWUFNSTFdyaTogDQorICAgIGNhc2UgWDg2OjpWUFNSTFdycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQkJycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQkRycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQlFycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQlNCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJTV3JyOiANCisgICAgY2FzZSBYODY6OlZQU1VCVVNCcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJVU1dycjogDQorICAgIGNhc2UgWDg2OjpWUFNVQldycjogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLSEJXcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0hEUXJyOiANCisgICAgY2FzZSBYODY6OlZQVU5QQ0tIUURRcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0hXRHJyOiANCisgICAgY2FzZSBYODY6OlZQVU5QQ0tMQldycjogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLTERRcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0xRRFFycjogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLTFdEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlBYT1JycjogDQorICAgIGNhc2UgWDg2OjpWUkNQU1NyOiANCisgICAgY2FzZSBYODY6OlZST1VORFBEcjogDQorICAgIGNhc2UgWDg2OjpWUk9VTkRQRHJfSW50OiANCisgICAgY2FzZSBYODY6OlZST1VORFBTcjogDQorICAgIGNhc2UgWDg2OjpWUk9VTkRQU3JfSW50OiANCisgICAgY2FzZSBYODY6OlZST1VORFlQRHI6IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EWVBEcl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EWVBTcjogDQorICAgIGNhc2UgWDg2OjpWUk9VTkRZUFNyX0ludDogDQorICAgIGNhc2UgWDg2OjpWUlNRUlRTU3I6IA0KKyAgICBjYXNlIFg4Njo6VlNRUlRTRHI6IA0KKyAgICBjYXNlIFg4Njo6VlNRUlRTU3I6IA0KKyAgICBjYXNlIFg4Njo6VlNVQlBEWXJyOiANCisgICAgY2FzZSBYODY6OlZTVUJQRHJyOiANCisgICAgY2FzZSBYODY6OlZTVUJQU1lycjogDQorICAgIGNhc2UgWDg2OjpWU1VCUFNycjogDQorICAgIGNhc2UgWDg2OjpWU1VCU0RycjogDQorICAgIGNhc2UgWDg2OjpWU1VCU0Rycl9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlNVQlNTcnI6IA0KKyAgICBjYXNlIFg4Njo6VlNVQlNTcnJfSW50OiANCisgICAgY2FzZSBYODY6OlZVTlBDS0hQRFlycjogDQorICAgIGNhc2UgWDg2OjpWVU5QQ0tIUERycjogDQorICAgIGNhc2UgWDg2OjpWVU5QQ0tIUFNZcnI6IA0KKyAgICBjYXNlIFg4Njo6VlVOUENLSFBTcnI6IA0KKyAgICBjYXNlIFg4Njo6VlVOUENLTFBEWXJyOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0xQRHJyOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0xQU1lycjogDQorICAgIGNhc2UgWDg2OjpWVU5QQ0tMUFNycjogDQorICAgIGNhc2UgWDg2OjpWWE9SUERZcnI6IA0KKyAgICBjYXNlIFg4Njo6VlhPUlBEcnI6IA0KKyAgICBjYXNlIFg4Njo6VlhPUlBTWXJyOiANCisgICAgY2FzZSBYODY6OlZYT1JQU3JyOiBwcmludE9wZXJhbmQoTUksIDIsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OkJMRU5EUERybWk6IA0KKyAgICBjYXNlIFg4Njo6QkxFTkRQU3JtaTogDQorICAgIGNhc2UgWDg2OjpDTVBQRHJtaV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6Q01QUFNybWlfYWx0OiANCisgICAgY2FzZSBYODY6OkNNUFNEcm1fYWx0OiANCisgICAgY2FzZSBYODY6OkNNUFNTcm1fYWx0OiANCisgICAgY2FzZSBYODY6OkRQUERybWk6IA0KKyAgICBjYXNlIFg4Njo6RFBQU3JtaTogDQorICAgIGNhc2UgWDg2OjpJTlNFUlRQU3JtOiANCisgICAgY2FzZSBYODY6Ok1NWF9QSU5TUldybWk6IA0KKyAgICBjYXNlIFg4Njo6TVBTQURCV3JtaTogDQorICAgIGNhc2UgWDg2OjpQQUxJR05SMTI4cm06IA0KKyAgICBjYXNlIFg4Njo6UEFMSUdOUjY0cm06IA0KKyAgICBjYXNlIFg4Njo6UEJMRU5EV3JtaTogDQorICAgIGNhc2UgWDg2OjpQSU5TUkJybTogDQorICAgIGNhc2UgWDg2OjpQSU5TUkRybTogDQorICAgIGNhc2UgWDg2OjpQSU5TUlFybTogDQorICAgIGNhc2UgWDg2OjpQSU5TUldybWk6IA0KKyAgICBjYXNlIFg4Njo6Uk9VTkRTRG1fSW50OiANCisgICAgY2FzZSBYODY6OlJPVU5EU1NtX0ludDogDQorICAgIGNhc2UgWDg2OjpTSFVGUERybWk6IA0KKyAgICBjYXNlIFg4Njo6U0hVRlBTcm1pOiBwcmludE9wZXJhbmQoTUksIDcsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OkJMRU5EUERycmk6IA0KKyAgICBjYXNlIFg4Njo6QkxFTkRQU3JyaTogDQorICAgIGNhc2UgWDg2OjpDTVBQRHJyaV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6Q01QUFNycmlfYWx0OiANCisgICAgY2FzZSBYODY6OkNNUFNEcnJfYWx0OiANCisgICAgY2FzZSBYODY6OkNNUFNTcnJfYWx0OiANCisgICAgY2FzZSBYODY6OkRQUERycmk6IA0KKyAgICBjYXNlIFg4Njo6RFBQU3JyaTogDQorICAgIGNhc2UgWDg2OjpJTlNFUlRQU3JyOiANCisgICAgY2FzZSBYODY6Ok1NWF9QSU5TUldycmk6IA0KKyAgICBjYXNlIFg4Njo6TVBTQURCV3JyaTogDQorICAgIGNhc2UgWDg2OjpQQUxJR05SMTI4cnI6IA0KKyAgICBjYXNlIFg4Njo6UEFMSUdOUjY0cnI6IA0KKyAgICBjYXNlIFg4Njo6UEJMRU5EV3JyaTogDQorICAgIGNhc2UgWDg2OjpQSU5TUkJycjogDQorICAgIGNhc2UgWDg2OjpQSU5TUkRycjogDQorICAgIGNhc2UgWDg2OjpQSU5TUlFycjogDQorICAgIGNhc2UgWDg2OjpQSU5TUldycmk6IA0KKyAgICBjYXNlIFg4Njo6Uk9VTkRTRHJfSW50OiANCisgICAgY2FzZSBYODY6OlJPVU5EU1NyX0ludDogDQorICAgIGNhc2UgWDg2OjpTSExEMTZycmk4OiANCisgICAgY2FzZSBYODY6OlNITEQzMnJyaTg6IA0KKyAgICBjYXNlIFg4Njo6U0hMRDY0cnJpODogDQorICAgIGNhc2UgWDg2OjpTSFJEMTZycmk4OiANCisgICAgY2FzZSBYODY6OlNIUkQzMnJyaTg6IA0KKyAgICBjYXNlIFg4Njo6U0hSRDY0cnJpODogDQorICAgIGNhc2UgWDg2OjpTSFVGUERycmk6IA0KKyAgICBjYXNlIFg4Njo6U0hVRlBTcnJpOiBwcmludE9wZXJhbmQoTUksIDMsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OkludF9WQ01QU0RybTogDQorICAgIGNhc2UgWDg2OjpJbnRfVkNWVFNEMlNTcm06IA0KKyAgICBjYXNlIFg4Njo6VkFERFNEcm06IA0KKyAgICBjYXNlIFg4Njo6VkFERFNEcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZDTVBTRHJtOiANCisgICAgY2FzZSBYODY6OlZDVlRTRDJTU3JtOiANCisgICAgY2FzZSBYODY6OlZESVZTRHJtOiANCisgICAgY2FzZSBYODY6OlZESVZTRHJtX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUFYU0RybTogDQorICAgIGNhc2UgWDg2OjpWTUFYU0RybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlNEcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1JTlNEcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNT1ZIUERybTogDQorICAgIGNhc2UgWDg2OjpWTU9WSFBTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1PVkxQRHJtOiANCisgICAgY2FzZSBYODY6OlZNT1ZMUFNybTogDQorICAgIGNhc2UgWDg2OjpWTVVMU0RybTogDQorICAgIGNhc2UgWDg2OjpWTVVMU0RybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlNRUlRTRG06IA0KKyAgICBjYXNlIFg4Njo6VlNVQlNEcm06IA0KKyAgICBjYXNlIFg4Njo6VlNVQlNEcm1fSW50OiBwcmludGY2NG1lbShNSSwgMiwgTyk7IGJyZWFrOw0KKyAgICBjYXNlIFg4Njo6SW50X1ZDTVBTU3JtOiANCisgICAgY2FzZSBYODY6OkludF9WQ1ZUU1MyU0RybTogDQorICAgIGNhc2UgWDg2OjpWQUREU1NybTogDQorICAgIGNhc2UgWDg2OjpWQUREU1NybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFNTcm06IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNTMlNEcm06IA0KKyAgICBjYXNlIFg4Njo6VkRJVlNTcm06IA0KKyAgICBjYXNlIFg4Njo6VkRJVlNTcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNQVhTU3JtOiANCisgICAgY2FzZSBYODY6OlZNQVhTU3JtX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUlOU1NybTogDQorICAgIGNhc2UgWDg2OjpWTUlOU1NybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFNTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFNTcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZSQ1BTU206IA0KKyAgICBjYXNlIFg4Njo6VlJTUVJUU1NtOiANCisgICAgY2FzZSBYODY6OlZTUVJUU1NtOiANCisgICAgY2FzZSBYODY6OlZTVUJTU3JtOiANCisgICAgY2FzZSBYODY6OlZTVUJTU3JtX0ludDogcHJpbnRmMzJtZW0oTUksIDIsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OkludF9WQ1ZUU0kyU0Q2NHJtOiANCisgICAgY2FzZSBYODY6OkludF9WQ1ZUU0kyU1M2NHJtOiANCisgICAgY2FzZSBYODY6OlZDVlRTSTJTRDY0cm06IA0KKyAgICBjYXNlIFg4Njo6VkNWVFNJMlNTNjRybTogDQorICAgIGNhc2UgWDg2OjpWUEhBREREcm02NDogDQorICAgIGNhc2UgWDg2OjpWUEhBRERTV3JtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBIQUREV3JtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBIU1VCRHJtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBIU1VCU1dybTY0OiANCisgICAgY2FzZSBYODY6OlZQSFNVQldybTY0OiANCisgICAgY2FzZSBYODY6OlZQTUFERFVCU1dybTY0OiANCisgICAgY2FzZSBYODY6OlZQTVVMSFJTV3JtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBTSFVGQnJtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdOQnJtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdORHJtNjQ6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdOV3JtNjQ6IHByaW50aTY0bWVtKE1JLCAyLCBPKTsgYnJlYWs7DQorICAgIGNhc2UgWDg2OjpJbnRfVkNWVFNJMlNEcm06IA0KKyAgICBjYXNlIFg4Njo6SW50X1ZDVlRTSTJTU3JtOiANCisgICAgY2FzZSBYODY6OlZDVlRTSTJTRExybTogDQorICAgIGNhc2UgWDg2OjpWQ1ZUU0kyU0RybTogDQorICAgIGNhc2UgWDg2OjpWQ1ZUU0kyU1NybTogcHJpbnRpMzJtZW0oTUksIDIsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OlZBRERQRFlybTogDQorICAgIGNhc2UgWDg2OjpWQUREUFNZcm06IA0KKyAgICBjYXNlIFg4Njo6VkFERFNVQlBEWXJtOiANCisgICAgY2FzZSBYODY6OlZBRERTVUJQU1lybTogDQorICAgIGNhc2UgWDg2OjpWQU5ETlBEWXJtOiANCisgICAgY2FzZSBYODY6OlZBTkROUFNZcm06IA0KKyAgICBjYXNlIFg4Njo6VkFORFBEWXJtOiANCisgICAgY2FzZSBYODY6OlZBTkRQU1lybTogDQorICAgIGNhc2UgWDg2OjpWRElWUERZcm06IA0KKyAgICBjYXNlIFg4Njo6VkRJVlBTWXJtOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBEcjEzMm1ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBEcjIxM21ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBEcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBTcjEzMm1ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBTcjIxM21ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBTcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjEzMm1ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIxM21ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjEzMm1ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIxM21ZOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjEzMm1ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIxM21ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjEzMm1ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIxM21ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBEcjEzMm1ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBEcjIxM21ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBEcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBTcjEzMm1ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBTcjIxM21ZOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBTcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQRHIxMzJtWTogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUERyMjEzbVk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBEcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQU3IxMzJtWTogDQorICAgIGNhc2UgWDg2OjpWRk5NQUREUFNyMjEzbVk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTUFERFBTcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQRHIxMzJtWTogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUERyMjEzbVk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBEcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQU3IxMzJtWTogDQorICAgIGNhc2UgWDg2OjpWRk5NU1VCUFNyMjEzbVk6IA0KKyAgICBjYXNlIFg4Njo6VkZOTVNVQlBTcjIzMW1ZOiANCisgICAgY2FzZSBYODY6OlZIQUREUERZcm06IA0KKyAgICBjYXNlIFg4Njo6VkhBRERQU1lybTogDQorICAgIGNhc2UgWDg2OjpWSFNVQlBEWXJtOiANCisgICAgY2FzZSBYODY6OlZIU1VCUFNZcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1BU0tNT1ZQRFlybTogDQorICAgIGNhc2UgWDg2OjpWTUFTS01PVlBTWXJtOiANCisgICAgY2FzZSBYODY6OlZNQVhQRFlybTogDQorICAgIGNhc2UgWDg2OjpWTUFYUERZcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNQVhQU1lybTogDQorICAgIGNhc2UgWDg2OjpWTUFYUFNZcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNSU5QRFlybTogDQorICAgIGNhc2UgWDg2OjpWTUlOUERZcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNSU5QU1lybTogDQorICAgIGNhc2UgWDg2OjpWTUlOUFNZcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNVUxQRFlybTogDQorICAgIGNhc2UgWDg2OjpWTVVMUFNZcm06IA0KKyAgICBjYXNlIFg4Njo6Vk9SUERZcm06IA0KKyAgICBjYXNlIFg4Njo6Vk9SUFNZcm06IA0KKyAgICBjYXNlIFg4Njo6VlNVQlBEWXJtOiANCisgICAgY2FzZSBYODY6OlZTVUJQU1lybTogDQorICAgIGNhc2UgWDg2OjpWVU5QQ0tIUERZcm06IA0KKyAgICBjYXNlIFg4Njo6VlVOUENLSFBTWXJtOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0xQRFlybTogDQorICAgIGNhc2UgWDg2OjpWVU5QQ0tMUFNZcm06IA0KKyAgICBjYXNlIFg4Njo6VlhPUlBEWXJtOiANCisgICAgY2FzZSBYODY6OlZYT1JQU1lybTogcHJpbnRmMjU2bWVtKE1JLCAyLCBPKTsgYnJlYWs7DQorICAgIGNhc2UgWDg2OjpWQUREUERybTogDQorICAgIGNhc2UgWDg2OjpWQUREUFNybTogDQorICAgIGNhc2UgWDg2OjpWQUREU1VCUERybTogDQorICAgIGNhc2UgWDg2OjpWQUREU1VCUFNybTogDQorICAgIGNhc2UgWDg2OjpWQU5ETlBEcm06IA0KKyAgICBjYXNlIFg4Njo6VkFORE5QU3JtOiANCisgICAgY2FzZSBYODY6OlZBTkRQRHJtOiANCisgICAgY2FzZSBYODY6OlZBTkRQU3JtOiANCisgICAgY2FzZSBYODY6OlZDTVBQRFlybWk6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBEcm1pOiANCisgICAgY2FzZSBYODY6OlZDTVBQU1lybWk6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBTcm1pOiANCisgICAgY2FzZSBYODY6OlZESVZQRHJtOiANCisgICAgY2FzZSBYODY6OlZESVZQU3JtOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBEcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUERyMjEzbTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTUFERFBTcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREUFNyMjEzbTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBEcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUERyMjEzbTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTUFERFNVQlBTcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZNQUREU1VCUFNyMjEzbTogDQorICAgIGNhc2UgWDg2OjpWRk1BRERTVUJQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBEcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUERyMjEzbTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTVNVQkFERFBTcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCQUREUFNyMjEzbTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJBRERQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBEcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUERyMjEzbTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTVNVQlBTcjEzMm06IA0KKyAgICBjYXNlIFg4Njo6VkZNU1VCUFNyMjEzbTogDQorICAgIGNhc2UgWDg2OjpWRk1TVUJQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQRHIxMzJtOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQRHIyMTNtOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQU3IxMzJtOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQU3IyMTNtOiANCisgICAgY2FzZSBYODY6OlZGTk1BRERQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQRHIxMzJtOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMTNtOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQRHIyMzFtOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQU3IxMzJtOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMTNtOiANCisgICAgY2FzZSBYODY6OlZGTk1TVUJQU3IyMzFtOiANCisgICAgY2FzZSBYODY6OlZGc0FORE5QRHJtOiANCisgICAgY2FzZSBYODY6OlZGc0FORE5QU3JtOiANCisgICAgY2FzZSBYODY6OlZGc0FORFBEcm06IA0KKyAgICBjYXNlIFg4Njo6VkZzQU5EUFNybTogDQorICAgIGNhc2UgWDg2OjpWRnNPUlBEcm06IA0KKyAgICBjYXNlIFg4Njo6VkZzT1JQU3JtOiANCisgICAgY2FzZSBYODY6OlZGc1hPUlBEcm06IA0KKyAgICBjYXNlIFg4Njo6VkZzWE9SUFNybTogDQorICAgIGNhc2UgWDg2OjpWSEFERFBEcm06IA0KKyAgICBjYXNlIFg4Njo6VkhBRERQU3JtOiANCisgICAgY2FzZSBYODY6OlZIU1VCUERybTogDQorICAgIGNhc2UgWDg2OjpWSFNVQlBTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1BU0tNT1ZQRHJtOiANCisgICAgY2FzZSBYODY6OlZNQVNLTU9WUFNybTogDQorICAgIGNhc2UgWDg2OjpWTUFYUERybTogDQorICAgIGNhc2UgWDg2OjpWTUFYUERybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFBTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1BWFBTcm1fSW50OiANCisgICAgY2FzZSBYODY6OlZNSU5QRHJtOiANCisgICAgY2FzZSBYODY6OlZNSU5QRHJtX0ludDogDQorICAgIGNhc2UgWDg2OjpWTUlOUFNybTogDQorICAgIGNhc2UgWDg2OjpWTUlOUFNybV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFBEcm06IA0KKyAgICBjYXNlIFg4Njo6Vk1VTFBTcm06IA0KKyAgICBjYXNlIFg4Njo6Vk9SUERybTogDQorICAgIGNhc2UgWDg2OjpWT1JQU3JtOiANCisgICAgY2FzZSBYODY6OlZTVUJQRHJtOiANCisgICAgY2FzZSBYODY6OlZTVUJQU3JtOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0hQRHJtOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0hQU3JtOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0xQRHJtOiANCisgICAgY2FzZSBYODY6OlZVTlBDS0xQU3JtOiANCisgICAgY2FzZSBYODY6OlZYT1JQRHJtOiANCisgICAgY2FzZSBYODY6OlZYT1JQU3JtOiBwcmludGYxMjhtZW0oTUksIDIsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OlZBRVNERUNMQVNUcm06IA0KKyAgICBjYXNlIFg4Njo6VkFFU0RFQ3JtOiANCisgICAgY2FzZSBYODY6OlZBRVNFTkNMQVNUcm06IA0KKyAgICBjYXNlIFg4Njo6VkFFU0VOQ3JtOiANCisgICAgY2FzZSBYODY6OlZQQUNLU1NEV3JtOiANCisgICAgY2FzZSBYODY6OlZQQUNLU1NXQnJtOiANCisgICAgY2FzZSBYODY6OlZQQUNLVVNEV3JtOiANCisgICAgY2FzZSBYODY6OlZQQUNLVVNXQnJtOiANCisgICAgY2FzZSBYODY6OlZQQUREQnJtOiANCisgICAgY2FzZSBYODY6OlZQQURERHJtOiANCisgICAgY2FzZSBYODY6OlZQQUREUXJtOiANCisgICAgY2FzZSBYODY6OlZQQUREU0JybTogDQorICAgIGNhc2UgWDg2OjpWUEFERFNXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBRERVU0JybTogDQorICAgIGNhc2UgWDg2OjpWUEFERFVTV3JtOiANCisgICAgY2FzZSBYODY6OlZQQUREV3JtOiANCisgICAgY2FzZSBYODY6OlZQQU5ETnJtOiANCisgICAgY2FzZSBYODY6OlZQQU5Ecm06IA0KKyAgICBjYXNlIFg4Njo6VlBBVkdCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBBVkdXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTE1VTEhRSFFEUXJtOiANCisgICAgY2FzZSBYODY6OlZQQ0xNVUxIUUxRRFFybTogDQorICAgIGNhc2UgWDg2OjpWUENMTVVMTFFIUURRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTE1VTExRTFFEUXJtOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVFCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBFUURybTogDQorICAgIGNhc2UgWDg2OjpWUENNUEVRUXJtOiANCisgICAgY2FzZSBYODY6OlZQQ01QRVFXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBHVEJybTogDQorICAgIGNhc2UgWDg2OjpWUENNUEdURHJtOiANCisgICAgY2FzZSBYODY6OlZQQ01QR1RRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBDTVBHVFdybTogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUERybTogDQorICAgIGNhc2UgWDg2OjpWUEVSTUlMUFNybTogDQorICAgIGNhc2UgWDg2OjpWUEhBREREcm0xMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBIQUREU1dybTEyODogDQorICAgIGNhc2UgWDg2OjpWUEhBRERXcm0xMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBIU1VCRHJtMTI4OiANCisgICAgY2FzZSBYODY6OlZQSFNVQlNXcm0xMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBIU1VCV3JtMTI4OiANCisgICAgY2FzZSBYODY6OlZQTUFERFVCU1dybTEyODogDQorICAgIGNhc2UgWDg2OjpWUE1BRERXRHJtOiANCisgICAgY2FzZSBYODY6OlZQTUFYU0JybTogDQorICAgIGNhc2UgWDg2OjpWUE1BWFNEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNQVhTV3JtOiANCisgICAgY2FzZSBYODY6OlZQTUFYVUJybTogDQorICAgIGNhc2UgWDg2OjpWUE1BWFVEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNQVhVV3JtOiANCisgICAgY2FzZSBYODY6OlZQTUlOU0JybTogDQorICAgIGNhc2UgWDg2OjpWUE1JTlNEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNSU5TV3JtOiANCisgICAgY2FzZSBYODY6OlZQTUlOVUJybTogDQorICAgIGNhc2UgWDg2OjpWUE1JTlVEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNSU5VV3JtOiANCisgICAgY2FzZSBYODY6OlZQTVVMRFFybTogDQorICAgIGNhc2UgWDg2OjpWUE1VTEhSU1dybTEyODogDQorICAgIGNhc2UgWDg2OjpWUE1VTEhVV3JtOiANCisgICAgY2FzZSBYODY6OlZQTVVMSFdybTogDQorICAgIGNhc2UgWDg2OjpWUE1VTExEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBNVUxMV3JtOiANCisgICAgY2FzZSBYODY6OlZQTVVMVURRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBPUnJtOiANCisgICAgY2FzZSBYODY6OlZQU0FEQldybTogDQorICAgIGNhc2UgWDg2OjpWUFNIVUZCcm0xMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBTSUdOQnJtMTI4OiANCisgICAgY2FzZSBYODY6OlZQU0lHTkRybTEyODogDQorICAgIGNhc2UgWDg2OjpWUFNJR05Xcm0xMjg6IA0KKyAgICBjYXNlIFg4Njo6VlBTTExEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTTExRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTTExXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTUkFEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTUkFXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTUkxEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTUkxRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTUkxXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJEcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJTQnJtOiANCisgICAgY2FzZSBYODY6OlZQU1VCU1dybTogDQorICAgIGNhc2UgWDg2OjpWUFNVQlVTQnJtOiANCisgICAgY2FzZSBYODY6OlZQU1VCVVNXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBTVUJXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0hCV3JtOiANCisgICAgY2FzZSBYODY6OlZQVU5QQ0tIRFFybTogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLSFFEUXJtOiANCisgICAgY2FzZSBYODY6OlZQVU5QQ0tIV0RybTogDQorICAgIGNhc2UgWDg2OjpWUFVOUENLTEJXcm06IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0xEUXJtOiANCisgICAgY2FzZSBYODY6OlZQVU5QQ0tMUURRcm06IA0KKyAgICBjYXNlIFg4Njo6VlBVTlBDS0xXRHJtOiANCisgICAgY2FzZSBYODY6OlZQWE9Scm06IHByaW50aTEyOG1lbShNSSwgMiwgTyk7IGJyZWFrOw0KKyAgICBjYXNlIFg4Njo6VlBFUk1JTFBEWXJtOiANCisgICAgY2FzZSBYODY6OlZQRVJNSUxQU1lybTogcHJpbnRpMjU2bWVtKE1JLCAyLCBPKTsgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgWDg2OjpCTEVORFZQRHJtMDoNCisgIGNhc2UgWDg2OjpCTEVORFZQRHJyMDoNCisgIGNhc2UgWDg2OjpCTEVORFZQU3JtMDoNCisgIGNhc2UgWDg2OjpCTEVORFZQU3JyMDoNCisgIGNhc2UgWDg2OjpNT1Y4bXJfTk9SRVg6DQorICBjYXNlIFg4Njo6TU9WOHJtX05PUkVYOg0KKyAgY2FzZSBYODY6Ok1PVjhycl9OT1JFWDoNCisgIGNhc2UgWDg2OjpNT1ZaWDMyX05PUkVYcm04Og0KKyAgY2FzZSBYODY6Ok1PVlpYMzJfTk9SRVhycjg6DQorICBjYXNlIFg4Njo6UEJMRU5EVkJybTA6DQorICBjYXNlIFg4Njo6UEJMRU5EVkJycjA6DQorICBjYXNlIFg4Njo6U0hMRDE2bXJDTDoNCisgIGNhc2UgWDg2OjpTSExEMTZyckNMOg0KKyAgY2FzZSBYODY6OlNITEQzMm1yQ0w6DQorICBjYXNlIFg4Njo6U0hMRDMycnJDTDoNCisgIGNhc2UgWDg2OjpTSExENjRtckNMOg0KKyAgY2FzZSBYODY6OlNITEQ2NHJyQ0w6DQorICBjYXNlIFg4Njo6U0hSRDE2bXJDTDoNCisgIGNhc2UgWDg2OjpTSFJEMTZyckNMOg0KKyAgY2FzZSBYODY6OlNIUkQzMm1yQ0w6DQorICBjYXNlIFg4Njo6U0hSRDMycnJDTDoNCisgIGNhc2UgWDg2OjpTSFJENjRtckNMOg0KKyAgY2FzZSBYODY6OlNIUkQ2NHJyQ0w6DQorICBjYXNlIFg4Njo6VlJDUFNTbV9JbnQ6DQorICBjYXNlIFg4Njo6VlJDUFNTcl9JbnQ6DQorICBjYXNlIFg4Njo6VlJTUVJUU1NtX0ludDoNCisgIGNhc2UgWDg2OjpWUlNRUlRTU3JfSW50Og0KKyAgY2FzZSBYODY6OlZTUVJUU0RtX0ludDoNCisgIGNhc2UgWDg2OjpWU1FSVFNEcl9JbnQ6DQorICBjYXNlIFg4Njo6VlNRUlRTU21fSW50Og0KKyAgY2FzZSBYODY6OlZTUVJUU1NyX0ludDoNCisgICAgc3dpdGNoIChNSS0+Z2V0T3Bjb2RlKCkpIHsNCisgICAgY2FzZSBYODY6OkJMRU5EVlBEcm0wOiANCisgICAgY2FzZSBYODY6OkJMRU5EVlBEcnIwOiANCisgICAgY2FzZSBYODY6OkJMRU5EVlBTcm0wOiANCisgICAgY2FzZSBYODY6OkJMRU5EVlBTcnIwOiANCisgICAgY2FzZSBYODY6OlBCTEVORFZCcm0wOiANCisgICAgY2FzZSBYODY6OlBCTEVORFZCcnIwOiBPIDw8ICIsICV4bW0wIjsgYnJlYWs7DQorICAgIGNhc2UgWDg2OjpNT1Y4bXJfTk9SRVg6IA0KKyAgICBjYXNlIFg4Njo6TU9WOHJtX05PUkVYOiANCisgICAgY2FzZSBYODY6Ok1PVjhycl9OT1JFWDogDQorICAgIGNhc2UgWDg2OjpNT1ZaWDMyX05PUkVYcm04OiANCisgICAgY2FzZSBYODY6Ok1PVlpYMzJfTk9SRVhycjg6IE8gPDwgIiAgIyBOT1JFWCI7IGJyZWFrOw0KKyAgICBjYXNlIFg4Njo6U0hMRDE2bXJDTDogDQorICAgIGNhc2UgWDg2OjpTSExEMTZyckNMOiANCisgICAgY2FzZSBYODY6OlNITEQzMm1yQ0w6IA0KKyAgICBjYXNlIFg4Njo6U0hMRDMycnJDTDogDQorICAgIGNhc2UgWDg2OjpTSFJEMTZtckNMOiANCisgICAgY2FzZSBYODY6OlNIUkQxNnJyQ0w6IA0KKyAgICBjYXNlIFg4Njo6U0hSRDMybXJDTDogDQorICAgIGNhc2UgWDg2OjpTSFJEMzJyckNMOiBPIDw8ICIsIENMIjsgYnJlYWs7DQorICAgIGNhc2UgWDg2OjpTSExENjRtckNMOiANCisgICAgY2FzZSBYODY6OlNITEQ2NHJyQ0w6IA0KKyAgICBjYXNlIFg4Njo6U0hSRDY0bXJDTDogDQorICAgIGNhc2UgWDg2OjpTSFJENjRyckNMOiBPIDw8ICIsICVDTCI7IGJyZWFrOw0KKyAgICBjYXNlIFg4Njo6VlJDUFNTbV9JbnQ6IA0KKyAgICBjYXNlIFg4Njo6VlJTUVJUU1NtX0ludDogDQorICAgIGNhc2UgWDg2OjpWU1FSVFNTbV9JbnQ6IHByaW50ZjMybWVtKE1JLCAxLCBPKTsgYnJlYWs7DQorICAgIGNhc2UgWDg2OjpWUkNQU1NyX0ludDogDQorICAgIGNhc2UgWDg2OjpWUlNRUlRTU3JfSW50OiANCisgICAgY2FzZSBYODY6OlZTUVJUU0RyX0ludDogDQorICAgIGNhc2UgWDg2OjpWU1FSVFNTcl9JbnQ6IHByaW50T3BlcmFuZChNSSwgMSwgTyk7IGJyZWFrOw0KKyAgICBjYXNlIFg4Njo6VlNRUlRTRG1fSW50OiBwcmludGY2NG1lbShNSSwgMSwgTyk7IGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybjsNCisgICAgYnJlYWs7DQorICBjYXNlIFg4Njo6VkJMRU5EUERZcm1pOg0KKyAgY2FzZSBYODY6OlZCTEVORFBEcm1pOg0KKyAgY2FzZSBYODY6OlZCTEVORFBTWXJtaToNCisgIGNhc2UgWDg2OjpWQkxFTkRQU3JtaToNCisgIGNhc2UgWDg2OjpWQkxFTkRWUERZcm06DQorICBjYXNlIFg4Njo6VkJMRU5EVlBEcm06DQorICBjYXNlIFg4Njo6VkJMRU5EVlBTWXJtOg0KKyAgY2FzZSBYODY6OlZCTEVORFZQU3JtOg0KKyAgY2FzZSBYODY6OlZDTVBQRFlybWlfYWx0Og0KKyAgY2FzZSBYODY6OlZDTVBQRHJtaV9hbHQ6DQorICBjYXNlIFg4Njo6VkNNUFBTWXJtaV9hbHQ6DQorICBjYXNlIFg4Njo6VkNNUFBTcm1pX2FsdDoNCisgIGNhc2UgWDg2OjpWQ01QU0RybV9hbHQ6DQorICBjYXNlIFg4Njo6VkNNUFNTcm1fYWx0Og0KKyAgY2FzZSBYODY6OlZEUFBEcm1pOg0KKyAgY2FzZSBYODY6OlZEUFBTWXJtaToNCisgIGNhc2UgWDg2OjpWRFBQU3JtaToNCisgIGNhc2UgWDg2OjpWSU5TRVJURjEyOHJtOg0KKyAgY2FzZSBYODY6OlZJTlNFUlRQU3JtOg0KKyAgY2FzZSBYODY6OlZNUFNBREJXcm1pOg0KKyAgY2FzZSBYODY6OlZQQUxJR05SMTI4cm06DQorICBjYXNlIFg4Njo6VlBBTElHTlI2NHJtOg0KKyAgY2FzZSBYODY6OlZQQkxFTkRWQnJtOg0KKyAgY2FzZSBYODY6OlZQQkxFTkRXcm1pOg0KKyAgY2FzZSBYODY6OlZQQ0xNVUxRRFFybToNCisgIGNhc2UgWDg2OjpWUEVSTTJGMTI4cm06DQorICBjYXNlIFg4Njo6VlBJTlNSQnJtOg0KKyAgY2FzZSBYODY6OlZQSU5TUkRybToNCisgIGNhc2UgWDg2OjpWUElOU1JRcm06DQorICBjYXNlIFg4Njo6VlBJTlNSV3JtaToNCisgIGNhc2UgWDg2OjpWUk9VTkRTRG06DQorICBjYXNlIFg4Njo6VlJPVU5EU0RtX0ludDoNCisgIGNhc2UgWDg2OjpWUk9VTkRTU206DQorICBjYXNlIFg4Njo6VlJPVU5EU1NtX0ludDoNCisgIGNhc2UgWDg2OjpWU0hVRlBEWXJtaToNCisgIGNhc2UgWDg2OjpWU0hVRlBEcm1pOg0KKyAgY2FzZSBYODY6OlZTSFVGUFNZcm1pOg0KKyAgY2FzZSBYODY6OlZTSFVGUFNybWk6DQorICAgIE8gPDwgIiwgIjsgDQorICAgIHN3aXRjaCAoTUktPmdldE9wY29kZSgpKSB7DQorICAgIGNhc2UgWDg2OjpWQkxFTkRQRFlybWk6IA0KKyAgICBjYXNlIFg4Njo6VkJMRU5EUFNZcm1pOiANCisgICAgY2FzZSBYODY6OlZCTEVORFZQRFlybTogDQorICAgIGNhc2UgWDg2OjpWQkxFTkRWUFNZcm06IA0KKyAgICBjYXNlIFg4Njo6VkRQUFNZcm1pOiBwcmludGkyNTZtZW0oTUksIDIsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OlZCTEVORFBEcm1pOiANCisgICAgY2FzZSBYODY6OlZCTEVORFBTcm1pOiANCisgICAgY2FzZSBYODY6OlZCTEVORFZQRHJtOiANCisgICAgY2FzZSBYODY6OlZCTEVORFZQU3JtOiANCisgICAgY2FzZSBYODY6OlZEUFBEcm1pOiANCisgICAgY2FzZSBYODY6OlZEUFBTcm1pOiANCisgICAgY2FzZSBYODY6OlZNUFNBREJXcm1pOiANCisgICAgY2FzZSBYODY6OlZQQUxJR05SMTI4cm06IA0KKyAgICBjYXNlIFg4Njo6VlBCTEVORFZCcm06IA0KKyAgICBjYXNlIFg4Njo6VlBCTEVORFdybWk6IA0KKyAgICBjYXNlIFg4Njo6VlBDTE1VTFFEUXJtOiBwcmludGkxMjhtZW0oTUksIDIsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OlZDTVBQRFlybWlfYWx0OiANCisgICAgY2FzZSBYODY6OlZDTVBQRHJtaV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBTWXJtaV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6VkNNUFBTcm1pX2FsdDogDQorICAgIGNhc2UgWDg2OjpWSU5TRVJURjEyOHJtOiANCisgICAgY2FzZSBYODY6OlZTSFVGUERZcm1pOiANCisgICAgY2FzZSBYODY6OlZTSFVGUERybWk6IA0KKyAgICBjYXNlIFg4Njo6VlNIVUZQU1lybWk6IA0KKyAgICBjYXNlIFg4Njo6VlNIVUZQU3JtaTogcHJpbnRmMTI4bWVtKE1JLCAyLCBPKTsgYnJlYWs7DQorICAgIGNhc2UgWDg2OjpWQ01QU0RybV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EU0RtOiANCisgICAgY2FzZSBYODY6OlZST1VORFNEbV9JbnQ6IHByaW50ZjY0bWVtKE1JLCAyLCBPKTsgYnJlYWs7DQorICAgIGNhc2UgWDg2OjpWQ01QU1NybV9hbHQ6IA0KKyAgICBjYXNlIFg4Njo6VklOU0VSVFBTcm06IA0KKyAgICBjYXNlIFg4Njo6VlJPVU5EU1NtOiANCisgICAgY2FzZSBYODY6OlZST1VORFNTbV9JbnQ6IHByaW50ZjMybWVtKE1JLCAyLCBPKTsgYnJlYWs7DQorICAgIGNhc2UgWDg2OjpWUEFMSUdOUjY0cm06IA0KKyAgICBjYXNlIFg4Njo6VlBJTlNSUXJtOiBwcmludGk2NG1lbShNSSwgMiwgTyk7IGJyZWFrOw0KKyAgICBjYXNlIFg4Njo6VlBFUk0yRjEyOHJtOiBwcmludGYyNTZtZW0oTUksIDIsIE8pOyBicmVhazsNCisgICAgY2FzZSBYODY6OlZQSU5TUkJybTogcHJpbnRpOG1lbShNSSwgMiwgTyk7IGJyZWFrOw0KKyAgICBjYXNlIFg4Njo6VlBJTlNSRHJtOiBwcmludGkzMm1lbShNSSwgMiwgTyk7IGJyZWFrOw0KKyAgICBjYXNlIFg4Njo6VlBJTlNSV3JtaTogcHJpbnRpMTZtZW0oTUksIDIsIE8pOyBicmVhazsNCisgICAgfQ0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDcsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIGNhc2UgWDg2OjpWQkxFTkRQRFlycmk6DQorICBjYXNlIFg4Njo6VkJMRU5EUERycmk6DQorICBjYXNlIFg4Njo6VkJMRU5EUFNZcnJpOg0KKyAgY2FzZSBYODY6OlZCTEVORFBTcnJpOg0KKyAgY2FzZSBYODY6OlZCTEVORFZQRFlycjoNCisgIGNhc2UgWDg2OjpWQkxFTkRWUERycjoNCisgIGNhc2UgWDg2OjpWQkxFTkRWUFNZcnI6DQorICBjYXNlIFg4Njo6VkJMRU5EVlBTcnI6DQorICBjYXNlIFg4Njo6VkNNUFBEWXJyaV9hbHQ6DQorICBjYXNlIFg4Njo6VkNNUFBEcnJpX2FsdDoNCisgIGNhc2UgWDg2OjpWQ01QUFNZcnJpX2FsdDoNCisgIGNhc2UgWDg2OjpWQ01QUFNycmlfYWx0Og0KKyAgY2FzZSBYODY6OlZDTVBTRHJyX2FsdDoNCisgIGNhc2UgWDg2OjpWQ01QU1Nycl9hbHQ6DQorICBjYXNlIFg4Njo6VkRQUERycmk6DQorICBjYXNlIFg4Njo6VkRQUFNZcnJpOg0KKyAgY2FzZSBYODY6OlZEUFBTcnJpOg0KKyAgY2FzZSBYODY6OlZJTlNFUlRGMTI4cnI6DQorICBjYXNlIFg4Njo6VklOU0VSVFBTcnI6DQorICBjYXNlIFg4Njo6Vk1QU0FEQldycmk6DQorICBjYXNlIFg4Njo6VlBBTElHTlIxMjhycjoNCisgIGNhc2UgWDg2OjpWUEFMSUdOUjY0cnI6DQorICBjYXNlIFg4Njo6VlBCTEVORFZCcnI6DQorICBjYXNlIFg4Njo6VlBCTEVORFdycmk6DQorICBjYXNlIFg4Njo6VlBDTE1VTFFEUXJyOg0KKyAgY2FzZSBYODY6OlZQRVJNMkYxMjhycjoNCisgIGNhc2UgWDg2OjpWUElOU1JCcnI6DQorICBjYXNlIFg4Njo6VlBJTlNSRHJyOg0KKyAgY2FzZSBYODY6OlZQSU5TUlFycjoNCisgIGNhc2UgWDg2OjpWUElOU1JXcnI2NGk6DQorICBjYXNlIFg4Njo6VlBJTlNSV3JyaToNCisgIGNhc2UgWDg2OjpWUk9VTkRTRHI6DQorICBjYXNlIFg4Njo6VlJPVU5EU0RyX0ludDoNCisgIGNhc2UgWDg2OjpWUk9VTkRTU3I6DQorICBjYXNlIFg4Njo6VlJPVU5EU1NyX0ludDoNCisgIGNhc2UgWDg2OjpWU0hVRlBEWXJyaToNCisgIGNhc2UgWDg2OjpWU0hVRlBEcnJpOg0KKyAgY2FzZSBYODY6OlZTSFVGUFNZcnJpOg0KKyAgY2FzZSBYODY6OlZTSFVGUFNycmk6DQorICAgIE8gPDwgIiwgIjsgDQorICAgIHByaW50T3BlcmFuZChNSSwgMiwgTyk7IA0KKyAgICBPIDw8ICIsICI7IA0KKyAgICBwcmludE9wZXJhbmQoTUksIDMsIE8pOyANCisgICAgcmV0dXJuOw0KKyAgICBicmVhazsNCisgIH0NCisgIHJldHVybjsNCit9DQorDQorDQorLy8vIGdldFJlZ2lzdGVyTmFtZSAtIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRibGdlbg0KKy8vLyBmcm9tIHRoZSByZWdpc3RlciBzZXQgZGVzY3JpcHRpb24uICBUaGlzIHJldHVybnMgdGhlIGFzc2VtYmxlciBuYW1lDQorLy8vIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLg0KK2NvbnN0IGNoYXIgKlg4NkludGVsSW5zdFByaW50ZXI6OmdldFJlZ2lzdGVyTmFtZSh1bnNpZ25lZCBSZWdObykgew0KKyAgYXNzZXJ0KFJlZ05vICYmIFJlZ05vIDwgMTUzICYmICJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciEiKTsNCisNCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdBc21PZmZzZXRbXSA9IHsNCisgICAgMCwgMywgNiwgOSwgMTIsIDE1LCAxOCwgMjIsIDI1LCAyOCwgMzEsIDM1LCAzOSwgNDMsIA0KKyAgICA0NywgNTEsIDU1LCA1OSwgNjMsIDY3LCA3MCwgNzMsIDc2LCA3OSwgODMsIDg2LCA5MCwgOTQsIA0KKyAgICA5OCwgMTAyLCAxMDYsIDExMCwgMTE0LCAxMTgsIDEyMSwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0NCwgMTQ4LCANCisgICAgMTU0LCAxNTgsIDE2MiwgMTY1LCAxNjksIDE3MywgMTc3LCAxODEsIDE4NSwgMTg5LCAxOTMsIDE5NywgMjAxLCAyMDQsIA0KKyAgICAyMDcsIDIxMCwgMjE0LCAyMTgsIDIyMiwgMjI2LCAyMzAsIDIzNCwgMjM4LCAyNDIsIDI0NSwgMjQ5LCAyNTMsIDI1NywgDQorICAgIDI2MCwgMjY0LCAyNjgsIDI3MiwgMjc2LCAyODEsIDI4NiwgMjkxLCAyOTUsIDMwMCwgMzA1LCAzMTAsIDMxNCwgMzE5LCANCisgICAgMzI0LCAzMjksIDMzMywgMzM4LCAzNDMsIDM0OCwgMzUyLCAzNTcsIDM2MiwgMzY3LCAzNzEsIDM3NiwgMzgxLCAzODYsIA0KKyAgICAzOTAsIDM5NCwgMzk4LCA0MDIsIDQwNiwgNDEwLCA0MTQsIDQxOCwgNDIyLCA0MjYsIDQyOSwgNDMzLCA0MzYsIDQ0MCwgDQorICAgIDQ0MywgNDQ5LCA0NTUsIDQ2MSwgNDY3LCA0NzMsIDQ3OSwgNDg1LCA0OTEsIDQ5NiwgNTAxLCA1MDYsIDUxMSwgNTE2LCANCisgICAgNTIxLCA1MjYsIDUzMSwgNTM2LCA1NDEsIDU0NywgNTUzLCA1NTksIDU2NSwgNTcxLCA1NzcsIDU4MiwgNTg3LCA1OTIsIA0KKyAgICA1OTcsIDYwMiwgNjA3LCA2MTIsIDYxNywgNjIyLCA2MjcsIDYzMywgNjM5LCA2NDUsIDY1MSwgNjU3LCAwDQorICB9Ow0KKw0KKyAgY29uc3QgY2hhciAqQXNtU3RycyA9DQorICAgICJhaFwwMDBhbFwwMDBheFwwMDBiaFwwMDBibFwwMDBicFwwMDBicGxcMDAwYnhcMDAwY2hcMDAwY2xcMDAwY3IwXDAwMGNyMSINCisgICAgIlwwMDBjcjJcMDAwY3IzXDAwMGNyNFwwMDBjcjVcMDAwY3I2XDAwMGNyN1wwMDBjcjhcMDAwY3NcMDAwY3hcMDAwZGhcMDAwIg0KKyAgICAiZGlcMDAwZGlsXDAwMGRsXDAwMGRyMFwwMDBkcjFcMDAwZHIyXDAwMGRyM1wwMDBkcjRcMDAwZHI1XDAwMGRyNlwwMDBkcjciDQorICAgICJcMDAwZHNcMDAwZHhcMDAwZWF4XDAwMGVicFwwMDBlYnhcMDAwZWN4XDAwMGVkaVwwMDBlZHhcMDAwZmxhZ3NcMDAwZWlwXDAwMCINCisgICAgImVpelwwMDBlc1wwMDBlc2lcMDAwZXNwXDAwMGZwMFwwMDBmcDFcMDAwZnAyXDAwMGZwM1wwMDBmcDRcMDAwZnA1XDAwMGZwIg0KKyAgICAiNlwwMDBmc1wwMDBnc1wwMDBpcFwwMDBtbTBcMDAwbW0xXDAwMG1tMlwwMDBtbTNcMDAwbW00XDAwMG1tNVwwMDBtbTZcMDAwIg0KKyAgICAibW03XDAwMHI4XDAwMHI4YlwwMDByOGRcMDAwcjh3XDAwMHI5XDAwMHI5YlwwMDByOWRcMDAwcjl3XDAwMHIxMFwwMDByMTAiDQorICAgICJiXDAwMHIxMGRcMDAwcjEwd1wwMDByMTFcMDAwcjExYlwwMDByMTFkXDAwMHIxMXdcMDAwcjEyXDAwMHIxMmJcMDAwcjEyZCINCisgICAgIlwwMDByMTJ3XDAwMHIxM1wwMDByMTNiXDAwMHIxM2RcMDAwcjEzd1wwMDByMTRcMDAwcjE0YlwwMDByMTRkXDAwMHIxNHdcMDAwIg0KKyAgICAicjE1XDAwMHIxNWJcMDAwcjE1ZFwwMDByMTV3XDAwMHJheFwwMDByYnBcMDAwcmJ4XDAwMHJjeFwwMDByZGlcMDAwcmR4XDAwMCINCisgICAgInJpcFwwMDByaXpcMDAwcnNpXDAwMHJzcFwwMDBzaVwwMDBzaWxcMDAwc3BcMDAwc3BsXDAwMHNzXDAwMHN0KDApXDAwMHN0Ig0KKyAgICAiKDEpXDAwMHN0KDIpXDAwMHN0KDMpXDAwMHN0KDQpXDAwMHN0KDUpXDAwMHN0KDYpXDAwMHN0KDcpXDAwMHhtbTBcMDAweG0iDQorICAgICJtMVwwMDB4bW0yXDAwMHhtbTNcMDAweG1tNFwwMDB4bW01XDAwMHhtbTZcMDAweG1tN1wwMDB4bW04XDAwMHhtbTlcMDAweCINCisgICAgIm1tMTBcMDAweG1tMTFcMDAweG1tMTJcMDAweG1tMTNcMDAweG1tMTRcMDAweG1tMTVcMDAweW1tMFwwMDB5bW0xXDAwMHltIg0KKyAgICAibTJcMDAweW1tM1wwMDB5bW00XDAwMHltbTVcMDAweW1tNlwwMDB5bW03XDAwMHltbThcMDAweW1tOVwwMDB5bW0xMFwwMDAiDQorICAgICJ5bW0xMVwwMDB5bW0xMlwwMDB5bW0xM1wwMDB5bW0xNFwwMDB5bW0xNVwwMDAiOw0KKyAgcmV0dXJuIEFzbVN0cnMrUmVnQXNtT2Zmc2V0W1JlZ05vLTFdOw0KK30NCisNCisNCisjaWZkZWYgR0VUX0lOU1RSVUNUSU9OX05BTUUNCisjdW5kZWYgR0VUX0lOU1RSVUNUSU9OX05BTUUNCisNCisvLy8gZ2V0SW5zdHJ1Y3Rpb25OYW1lOiBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0YmxnZW4NCisvLy8gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGRlc2NyaXB0aW9uLiAgVGhpcyByZXR1cm5zIHRoZSBlbnVtIG5hbWUgb2YgdGhlDQorLy8vIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4NCitjb25zdCBjaGFyICpYODZJbnRlbEluc3RQcmludGVyOjpnZXRJbnN0cnVjdGlvbk5hbWUodW5zaWduZWQgT3Bjb2RlKSB7DQorICBhc3NlcnQoT3Bjb2RlIDwgMzY3OCAmJiAiSW52YWxpZCBpbnN0cnVjdGlvbiBudW1iZXIhIik7DQorDQorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW5zdEFzbU9mZnNldFtdID0gew0KKyAgICAwLCA0LCAxNCwgMjcsIDM2LCA0NSwgNTAsIDY1LCA3OSwgOTIsIDEwNiwgMTIzLCAxMzMsIDE0NiwgDQorICAgIDE1MSwgMTU3LCAxNjYsIDE3NSwgMTg0LCAxOTMsIDIwMSwgMjEwLCAyMTgsIDIyNiwgMjM1LCAyNDMsIDI1MSwgMjYzLCANCisgICAgMjcyLCAyODAsIDI4OSwgMjk3LCAzMDUsIDMxNCwgMzIyLCAzMzAsIDM0MiwgMzUxLCAzNjEsIDM3MCwgMzc4LCAzODgsIA0KKyAgICAzOTcsIDQwNSwgNDEzLCA0MjUsIDQzMiwgNDM5LCA0NDYsIDQ1MywgNDYwLCA0NjcsIDQ3OCwgNDg3LCA0OTUsIDUwNCwgDQorICAgIDUxMiwgNTIwLCA1MjksIDUzNywgNTQ1LCA1NTcsIDU2NiwgNTc0LCA1ODMsIDU5MSwgNTk5LCA2MDgsIDYxNiwgNjI0LCANCisgICAgNjM2LCA2NDUsIDY1NSwgNjY0LCA2NzIsIDY4MiwgNjkxLCA2OTksIDcwNywgNzE5LCA3MjYsIDczMywgNzQwLCA3NDcsIA0KKyAgICA3NTQsIDc2MSwgNzcyLCA3ODAsIDc4OCwgNzk2LCA4MDQsIDgxMiwgODI0LCA4MzIsIDg0NCwgODUyLCA4NjQsIDg3MiwgDQorICAgIDg4NCwgODk1LCA5MDYsIDkxNywgOTI4LCA5MzcsIDk0NiwgOTU2LCA5NjYsIDk3NywgOTg3LCA5OTYsIDEwMDYsIDEwMTUsIA0KKyAgICAxMDI1LCAxMDM3LCAxMDQ2LCAxMDU4LCAxMDcwLCAxMDgzLCAxMDk2LCAxMTA5LCAxMTIyLCAxMTM1LCAxMTQ4LCAxMTU4LCAxMTc3LCAxMTk2LCANCisgICAgMTIxMywgMTIzMCwgMTI0MywgMTI1NiwgMTI2NSwgMTI3NCwgMTI4NywgMTMwMCwgMTMwOSwgMTMxOCwgMTMyNywgMTMzNiwgMTM1NywgMTM3OCwgDQorICAgIDEzODcsIDEzOTUsIDE0MDQsIDE0MTIsIDE0MjAsIDE0MjksIDE0MzcsIDE0NDUsIDE0NTcsIDE0NjYsIDE0NzQsIDE0ODMsIDE0OTEsIDE0OTksIA0KKyAgICAxNTA4LCAxNTE2LCAxNTI0LCAxNTM2LCAxNTQ1LCAxNTU1LCAxNTY0LCAxNTcyLCAxNTgyLCAxNTkxLCAxNTk5LCAxNjA3LCAxNjE5LCAxNjI2LCANCisgICAgMTYzMywgMTY0MCwgMTY0NywgMTY1NCwgMTY2MSwgMTY3MiwgMTY4MSwgMTY5MCwgMTY5OSwgMTcwOCwgMTcxNiwgMTcyNCwgMTczMiwgMTc0MCwgDQorICAgIDE3NTIsIDE3NjIsIDE3NzIsIDE3ODIsIDE3OTQsIDE4MDMsIDE4MTMsIDE4MjMsIDE4MzMsIDE4NDMsIDE4NTMsIDE4NjMsIDE4NzQsIDE4ODUsIA0KKyAgICAxODk2LCAxOTA5LCAxOTE5LCAxOTI4LCAxOTM3LCAxOTQ2LCAxOTU3LCAxOTY1LCAxOTc3LCAxOTkwLCAyMDAxLCAyMDEyLCAyMDIzLCAyMDM0LCANCisgICAgMjA0NSwgMjA1NiwgMjA2NiwgMjA3NiwgMjA4NiwgMjA5OCwgMjEwNywgMjExOCwgMjEyOSwgMjE0MCwgMjE1MSwgMjE2MywgMjE3NSwgMjE4NywgDQorICAgIDIxOTksIDIyMDcsIDIyMTUsIDIyMjMsIDIyMzEsIDIyMzksIDIyNDcsIDIyNTUsIDIyNjMsIDIyNzEsIDIyNzksIDIyODcsIDIyOTUsIDIzMDQsIA0KKyAgICAyMzEzLCAyMzIxLCAyMzI4LCAyMzM2LCAyMzQzLCAyMzUxLCAyMzU4LCAyMzY2LCAyMzczLCAyMzgxLCAyMzg4LCAyMzk2LCAyNDAzLCAyNDEyLCANCisgICAgMjQyMCwgMjQyOSwgMjQzNywgMjQ0NiwgMjQ1NCwgMjQ2MywgMjQ3MSwgMjQ4MCwgMjQ4OCwgMjQ5NywgMjUwNSwgMjUxNCwgMjUyMiwgMjUzMSwgDQorICAgIDI1MzksIDI1NDgsIDI1NTYsIDI1NjUsIDI1NzMsIDI1ODIsIDI1OTAsIDI1OTksIDI2MDcsIDI2MTYsIDI2MjQsIDI2MzMsIDI2NDEsIDI2NTAsIA0KKyAgICAyNjU4LCAyNjY3LCAyNjc1LCAyNjg0LCAyNjkyLCAyNzAxLCAyNzA5LCAyNzE3LCAyNzI1LCAyNzMzLCAyNzQ3LCAyNzU1LCAyNzY3LCAyNzc5LCANCisgICAgMjc4MywgMjc4NywgMjc5MiwgMjc5OCwgMjgwNywgMjgxNiwgMjgyNSwgMjgyOSwgMjgzMywgMjg0MSwgMjg0NSwgMjg1MCwgMjg1NCwgMjg2NCwgDQorICAgIDI4NzQsIDI4ODQsIDI4OTQsIDI5MDQsIDI5MTQsIDI5MjUsIDI5MzYsIDI5NDcsIDI5NTgsIDI5NjksIDI5ODAsIDI5OTAsIDMwMDAsIDMwMTAsIA0KKyAgICAzMDIwLCAzMDMwLCAzMDQwLCAzMDUxLCAzMDYyLCAzMDczLCAzMDg0LCAzMDk1LCAzMTA2LCAzMTE1LCAzMTI3LCAzMTM5LCAzMTUxLCAzMTU5LCANCisgICAgMzE3MCwgMzE4MSwgMzE5MiwgMzIwMiwgMzIxMiwgMzIyMiwgMzIzMiwgMzI0MiwgMzI1MiwgMzI2MCwgMzI3MSwgMzI4MiwgMzI5MywgMzMwMywgDQorICAgIDMzMTMsIDMzMjMsIDMzMzMsIDMzNDMsIDMzNTMsIDMzNjQsIDMzNzUsIDMzODYsIDMzOTcsIDM0MDgsIDM0MTksIDM0MjksIDM0MzksIDM0NDksIA0KKyAgICAzNDU5LCAzNDY5LCAzNDc5LCAzNDkwLCAzNTAxLCAzNTEyLCAzNTIzLCAzNTM0LCAzNTQ1LCAzNTU1LCAzNTY4LCAzNTgxLCAzNTk0LCAzNjAzLCANCisgICAgMzYxNSwgMzYyNywgMzYzOSwgMzY1MCwgMzY2MSwgMzY3MiwgMzY4MywgMzY5NCwgMzcwNSwgMzcxNCwgMzcyNiwgMzczOCwgMzc1MCwgMzc2MSwgDQorICAgIDM3NzIsIDM3ODMsIDM3OTQsIDM4MDUsIDM4MTYsIDM4MjcsIDM4MzgsIDM4NDksIDM4NjAsIDM4NzEsIDM4ODIsIDM4OTEsIDM5MDMsIDM5MTUsIA0KKyAgICAzOTI3LCAzOTM4LCAzOTQ5LCAzOTYwLCAzOTcxLCAzOTgyLCAzOTkzLCA0MDAzLCA0MDEzLCA0MDIzLCA0MDMzLCA0MDQzLCA0MDUzLCA0MDYzLCANCisgICAgNDA3MywgNDA4MywgNDA5MywgNDEwMywgNDExMywgNDEyMSwgNDEzMiwgNDE0MywgNDE1NCwgNDE2NCwgNDE3NCwgNDE4NCwgNDE5NCwgNDIwNCwgDQorICAgIDQyMTQsIDQyMjQsIDQyMzQsIDQyNDQsIDQyNTQsIDQyNjMsIDQyNzQsIDQyODUsIDQyOTYsIDQzMDcsIDQzMTgsIDQzMjksIDQzNDAsIDQzNDksIA0KKyAgICA0MzU3LCA0MzY2LCA0Mzc0LCA0MzgyLCA0MzkxLCA0Mzk5LCA0NDA3LCA0NDE5LCA0NDI4LCA0NDM2LCA0NDQ1LCA0NDUzLCA0NDYxLCA0NDcwLCANCisgICAgNDQ3OCwgNDQ4NiwgNDQ5OCwgNDUwNywgNDUxNywgNDUyNiwgNDUzNCwgNDU0NSwgNDU1NSwgNDU2NCwgNDU3MiwgNDU4MCwgNDU4NywgNDU5NCwgDQorICAgIDQ2MDEsIDQ2MDgsIDQ2MTUsIDQ2MjIsIDQ2MzMsIDQ2NDIsIDQ2NTUsIDQ2NjQsIDQ2NzcsIDQ2ODYsIDQ2OTksIDQ3MDgsIDQ3MjEsIDQ3MjgsIA0KKyAgICA0NzM1LCA0NzQyLCA0NzQ4LCA0NzU2LCA0NzY4LCA0Nzc2LCA0Nzg4LCA0Nzk2LCA0ODA4LCA0ODE2LCA0ODI4LCA0ODM5LCA0ODUxLCA0ODYzLCANCisgICAgNDg3NSwgNDg4NywgNDg5OSwgNDkxMSwgNDkyMSwgNDkzMiwgNDk0MywgNDk1MiwgNDk2MSwgNDk3MCwgNDk3OSwgNDk5MCwgNDk5OSwgNTAwNywgDQorICAgIDUwMTcsIDUwMjMsIDUwMzIsIDUwNDEsIDUwNTAsIDUwNTYsIDUwNjAsIDUwNjksIDUwNzgsIDUwODYsIDUwOTUsIDUxMDQsIDUxMTIsIDUxMjEsIA0KKyAgICA1MTI5LCA1MTM4LCA1MTQ2LCA1MTU2LCA1MTY3LCA1MTc4LCA1MTg5LCA1MjAwLCA1MjExLCA1MjIyLCA1MjMzLCA1MjQ0LCA1MjU1LCA1MjY2LCANCisgICAgNTI3NywgNTI4OCwgNTMwMSwgNTMxNCwgNTMyNSwgNTMzNiwgNTM0OSwgNTM2MiwgNTM3MywgNTM4NCwgNTM5NywgNTQxMCwgNTQyMSwgNTQzMiwgDQorICAgIDU0NDMsIDU0NTQsIDU0NjcsIDU0ODAsIDU0OTEsIDU1MDIsIDU1MTQsIDU1MjYsIDU1NDAsIDU1NTQsIDU1NjYsIDU1NzgsIDU1OTIsIDU2MDYsIA0KKyAgICA1NjE4LCA1NjMwLCA1NjM0LCA1NjM5LCA1NjQ2LCA1NjUzLCA1NjYwLCA1NjY3LCA1Njc3LCA1Njg3LCA1Njk3LCA1NzA3LCA1NzE0LCA1NzIxLCANCisgICAgNTcyNywgNTczMywgNTc0MCwgNTc0NywgNTc1NCwgNTc2MSwgNTc2OCwgNTc3NSwgNTc4MSwgNTc4NywgNTc5NSwgNTgwMywgNTgxMSwgNTgxOSwgDQorICAgIDU4MjksIDU4MzksIDU4NTAsIDU4NjEsIDU4NzMsIDU4ODQsIDU4OTUsIDU5MDYsIDU5MTksIDU5MzIsIDU5NDUsIDU5NTksIDU5NzMsIDU5ODcsIA0KKyAgICA2MDAxLCA2MDE1LCA2MDI5LCA2MDQwLCA2MDQ4LCA2MDYwLCA2MDY4LCA2MDgwLCA2MDg4LCA2MTAwLCA2MTA4LCA2MTIwLCA2MTI5LCA2MTM4LCANCisgICAgNjE0OCwgNjE1OCwgNjE2OSwgNjE3OSwgNjE4OCwgNjE5OCwgNjIwNywgNjIxNywgNjIyOSwgNjIzOCwgNjI1MCwgNjI2MiwgNjI3NSwgNjI4OCwgDQorICAgIDYzMDEsIDYzMTQsIDYzMjcsIDYzNDAsIDYzNTAsIDYzNTgsIDYzNjYsIDYzNzQsIDYzODIsIDYzOTIsIDY0MDIsIDY0MTQsIDY0MjAsIDY0MzAsIA0KKyAgICA2NDQyLCA2NDU0LCA2NDYwLCA2NDcxLCA2NDgyLCA2NDkzLCA2NTA0LCA2NTE0LCA2NTI0LCA2NTM0LCA2NTQ0LCA2NTU0LCA2NTYzLCA2NTY5LCANCisgICAgNjU3NiwgNjU4NCwgNjU5MiwgNjYwMSwgNjYxMCwgNjYxNywgNjYyNSwgNjYzMSwgNjY0MCwgNjY0OSwgNjY1OSwgNjY2OSwgNjY3NywgNjY4NiwgDQorICAgIDY2OTQsIDY3MDEsIDY3MDgsIDY3MTUsIDY3MjIsIDY3MjgsIDY3MzUsIDY3NDIsIDY3NDcsIDY3NTcsIDY3NjYsIDY3NzQsIDY3OTUsIDY4MTYsIA0KKyAgICA2ODM3LCA2ODU4LCA2ODc5LCA2OTAwLCA2OTIxLCA2OTQyLCA2OTYzLCA2OTcwLCA2OTc2LCA2OTgzLCA2OTg5LCA2OTk3LCA3MDA1LCA3MDEyLCANCisgICAgNzAxOSwgNzAyNywgNzAzNSwgNzA0NiwgNzA1NiwgNzA2MSwgNzA2OSwgNzA3NiwgNzA4NCwgNzA5MCwgNzA5OCwgNzExMSwgNzEyNCwgNzEzNywgDQorICAgIDcxNTAsIDcxNjMsIDcxNzYsIDcxODksIDcyMDIsIDcyMTUsIDcyMjgsIDcyNDEsIDcyNTQsIDcyNjUsIDcyNzYsIDcyODcsIDcyOTgsIDczMDgsIA0KKyAgICA3MzE4LCA3MzI4LCA3MzM4LCA3MzQ3LCA3MzU2LCA3MzY3LCA3Mzc4LCA3Mzg5LCA3NDAwLCA3NDA5LCA3NDE4LCA3NDI3LCA3NDM2LCA3NDQ2LCANCisgICAgNzQ1NiwgNzQ2NiwgNzQ3NiwgNzQ4NywgNzQ5NywgNzUwNiwgNzUxNSwgNzUyNCwgNzUzMywgNzUzNywgNzU0NiwgNzU1NSwgNzU2NCwgNzU3MywgDQorICAgIDc1ODEsIDc1ODksIDc1OTcsIDc2MDUsIDc2MTMsIDc2MjEsIDc2MjgsIDc2MzUsIDc2NDQsIDc2NTMsIDc2NjIsIDc2NzQsIDc2ODYsIDc2OTgsIA0KKyAgICA3NzEwLCA3NzIyLCA3NzM0LCA3NzQ2LCA3NzU4LCA3NzcwLCA3Nzc4LCA3Nzg2LCA3Nzk1LCA3ODA1LCA3ODE2LCA3ODI1LCA3ODM1LCA3ODQ2LCANCisgICAgNzg1NCwgNzg2MiwgNzg3MSwgNzg4MSwgNzg5MiwgNzkwMSwgNzkxMSwgNzkyMiwgNzkzMCwgNzkzOCwgNzk0NywgNzk1OSwgNzk3MCwgNzk3OSwgDQorICAgIDc5OTEsIDgwMDIsIDgwMDksIDgwMTYsIDgwMjEsIDgwMjgsIDgwMzUsIDgwNDAsIDgwNDcsIDgwNTQsIDgwNTgsIDgwNjQsIDgwNzAsIDgwNzcsIA0KKyAgICA4MDg0LCA4MDkxLCA4MDk4LCA4MTA4LCA4MTE4LCA4MTI4LCA4MTM4LCA4MTQ1LCA4MTUyLCA4MTU4LCA4MTY0LCA4MTc1LCA4MTg2LCA4MTkwLCANCisgICAgODE5NSwgODIwMCwgODIwNSwgODIxMiwgODIxOSwgODIyNywgODIzNCwgODI0MSwgODI0OCwgODI1OSwgODI3MCwgODI4MSwgODI5NCwgODMwNywgDQorICAgIDgzMjAsIDgzMzMsIDgzNDYsIDgzNTksIDgzNzIsIDgzODUsIDgzOTgsIDg0MDcsIDg0MTYsIDg0MjYsIDg0MzYsIDg0NDYsIDg0NTgsIDg0NzAsIA0KKyAgICA4NDgyLCA4NDk0LCA4NTA2LCA4NTE4LCA4NTMwLCA4NTQyLCA4NTU0LCA4NTY2LCA4NTc4LCA4NTkwLCA4NjAyLCA4NjE1LCA4NjI4LCA4NjQxLCANCisgICAgODY1NCwgODY2OSwgODY4NCwgODY5OSwgODcxNCwgODcyOSwgODc0NCwgODc1OSwgODc3NCwgODc4OSwgODgwNCwgODgxOSwgODgzNCwgODg0OSwgDQorICAgIDg4NjQsIDg4NzksIDg4OTQsIDg5MDksIDg5MjQsIDg5MzksIDg5NTQsIDg5NzEsIDg5ODgsIDkwMDMsIDkwMTgsIDkwMzMsIDkwNDgsIDkwNjUsIA0KKyAgICA5MDgyLCA5MDk3LCA5MTEyLCA5MTI5LCA5MTQ2LCA5MTYxLCA5MTc2LCA5MTkxLCA5MjA2LCA5MjIzLCA5MjQwLCA5MjU1LCA5MjcwLCA5Mjg2LCANCisgICAgOTMwMiwgOTMxOCwgOTMzNCwgOTM1MCwgOTM2NiwgOTM4MiwgOTM5OCwgOTQxNiwgOTQzNCwgOTQ1MCwgOTQ2NiwgOTQ4NCwgOTUwMiwgOTUxOCwgDQorICAgIDk1MzQsIDk1NDksIDk1NjksIDk1OTEsIDk2MDUsIDk2MTksIDk2MzMsIDk2NDcsIDk2NjAsIDk2NzMsIDk2ODYsIDk2OTksIDk3MTMsIDk3MjcsIA0KKyAgICA5NzQxLCA5NzU1LCA5NzcxLCA5Nzg3LCA5ODAzLCA5ODE5LCA5ODM1LCA5ODUxLCA5ODY3LCA5ODgzLCA5ODk5LCA5OTE1LCA5OTMxLCA5OTQ3LCANCisgICAgOTk2NSwgOTk4MywgOTk5OSwgMTAwMTUsIDEwMDMxLCAxMDA0NywgMTAwNjUsIDEwMDgzLCAxMDA5OSwgMTAxMTUsIDEwMTMzLCAxMDE1MSwgMTAxNjcsIDEwMTgzLCANCisgICAgMTAxOTksIDEwMjE1LCAxMDIzMywgMTAyNTEsIDEwMjY3LCAxMDI4MywgMTAzMDAsIDEwMzE3LCAxMDMzNCwgMTAzNTEsIDEwMzcwLCAxMDM4OSwgMTA0MDYsIDEwNDIzLCANCisgICAgMTA0NDIsIDEwNDYxLCAxMDQ3OCwgMTA0OTUsIDEwNTEwLCAxMDUyNSwgMTA1NDAsIDEwNTU1LCAxMDU2MSwgMTA1NjcsIDEwNTcyLCAxMDU3NywgMTA1ODMsIDEwNTg5LCANCisgICAgMTA1OTQsIDEwNTk5LCAxMDYwNSwgMTA2MTAsIDEwNjE1LCAxMDYyMSwgMTA2MjcsIDEwNjMyLCAxMDYzNywgMTA2NDMsIDEwNjQ5LCAxMDY1NCwgMTA2NTksIDEwNjY2LCANCisgICAgMTA2NzMsIDEwNjgwLCAxMDY5MywgMTA3MDAsIDEwNzA2LCAxMDcxMiwgMTA3MTgsIDEwNzI0LCAxMDczMCwgMTA3MzYsIDEwNzQyLCAxMDc0OCwgMTA3NTQsIDEwNzYwLCANCisgICAgMTA3NjUsIDEwNzcwLCAxMDc3NSwgMTA3ODAsIDEwNzg1LCAxMDc5MCwgMTA3OTUsIDEwODAzLCAxMDgxMSwgMTA4MTksIDEwODI3LCAxMDgzNSwgMTA4NDMsIDEwODU0LCANCisgICAgMTA4NjUsIDEwODc2LCAxMDg4NiwgMTA4OTcsIDEwOTA1LCAxMDkxMywgMTA5MjEsIDEwOTI5LCAxMDkzNSwgMTA5NDEsIDEwOTQ5LCAxMDk1NywgMTA5NjUsIDEwOTc0LCANCisgICAgMTA5ODMsIDEwOTkyLCAxMTAwMSwgMTEwMTAsIDExMDE5LCAxMTAyOCwgMTEwMzksIDExMDUwLCAxMTA1OSwgMTEwNzAsIDExMDc5LCAxMTA4NiwgMTEwOTMsIDExMTAwLCANCisgICAgMTExMTAsIDExMTE3LCAxMTEyMywgMTExMzEsIDExMTM5LCAxMTE0NywgMTExNTQsIDExMTYyLCAxMTE3MCwgMTExNzgsIDExMTg0LCAxMTE5MiwgMTEyMDAsIDExMjA4LCANCisgICAgMTEyMTQsIDExMjIyLCAxMTIzMCwgMTEyMzgsIDExMjQ2LCAxMTI1OSwgMTEyNzMsIDExMjg2LCAxMTI5OSwgMTEzMTMsIDExMzI2LCAxMTM0MSwgMTEzNTUsIDExMzY4LCANCisgICAgMTEzODAsIDExMzkyLCAxMTQwNCwgMTE0MTYsIDExNDI4LCAxMTQzOSwgMTE0NTEsIDExNDYzLCAxMTQ3NSwgMTE0ODYsIDExNDk4LCAxMTUxMSwgMTE1MjUsIDExNTM4LCANCisgICAgMTE1NTEsIDExNTY1LCAxMTU3OCwgMTE1OTMsIDExNjA3LCAxMTYyMCwgMTE2MzIsIDExNjQ0LCAxMTY1MCwgMTE2NTYsIDExNjYyLCAxMTY2OCwgMTE2NzMsIDExNjc5LCANCisgICAgMTE2ODYsIDExNjkxLCAxMTY5NywgMTE3MDUsIDExNzEzLCAxMTcyMSwgMTE3MjksIDExNzM3LCAxMTc0NSwgMTE3NTMsIDExNzYxLCAxMTc2OSwgMTE3NzQsIDExNzc5LCANCisgICAgMTE3ODcsIDExNzk1LCAxMTgwMywgMTE4MTAsIDExODIxLCAxMTgzNCwgMTE4NDIsIDExODU0LCAxMTg2MiwgMTE4NzQsIDExODgyLCAxMTg5NCwgMTE5MDIsIDExOTE0LCANCisgICAgMTE5MjIsIDExOTM0LCAxMTk0MiwgMTE5NTQsIDExOTYyLCAxMTk3NCwgMTE5ODIsIDExOTk0LCAxMjAwMSwgMTIwMTQsIDEyMDIyLCAxMjAzNCwgMTIwNDIsIDEyMDU0LCANCisgICAgMTIwNjIsIDEyMDc0LCAxMjA4MiwgMTIwOTQsIDEyMTAyLCAxMjExNCwgMTIxMjIsIDEyMTM0LCAxMjE0MiwgMTIxNTQsIDEyMTYyLCAxMjE3NCwgMTIxODksIDEyMjA0LCANCisgICAgMTIyMTksIDEyMjM0LCAxMjI0OSwgMTIyNjQsIDEyMjc5LCAxMjI5NCwgMTIzMTAsIDEyMzI2LCAxMjM0MiwgMTIzNTgsIDEyMzY3LCAxMjM3NywgMTIzOTAsIDEyNDA1LCANCisgICAgMTI0MjQsIDEyNDM4LCAxMjQ1MSwgMTI0NjQsIDEyNDc3LCAxMjQ5NCwgMTI1MTEsIDEyNTI1LCAxMjU0MSwgMTI1NTQsIDEyNTY4LCAxMjU4NCwgMTI1OTcsIDEyNjEwLCANCisgICAgMTI2MjMsIDEyNjQwLCAxMjY1NywgMTI2NzIsIDEyNjg3LCAxMjcwMiwgMTI3MTcsIDEyNzMyLCAxMjc0NywgMTI3NTksIDEyNzcxLCAxMjc4MywgMTI3OTUsIDEyODA3LCANCisgICAgMTI4MTksIDEyODMyLCAxMjg0NSwgMTI4NTgsIDEyODcxLCAxMjg4NSwgMTI4OTksIDEyOTEzLCAxMjkyNywgMTI5MzksIDEyOTUxLCAxMjk2MywgMTI5NzUsIDEyOTg2LCANCisgICAgMTI5OTcsIDEzMDA5LCAxMzAyMSwgMTMwMzMsIDEzMDQ1LCAxMzA1OSwgMTMwNzMsIDEzMDg3LCAxMzEwMSwgMTMxMTUsIDEzMTI5LCAxMzE0MywgMTMxNTcsIDEzMTcxLCANCisgICAgMTMxODUsIDEzMTk5LCAxMzIxMywgMTMyMjYsIDEzMjQwLCAxMzI1NCwgMTMyNjgsIDEzMjgyLCAxMzI5NSwgMTMzMDgsIDEzMzIxLCAxMzMzNCwgMTMzNDcsIDEzMzYwLCANCisgICAgMTMzNzMsIDEzMzg2LCAxMzQwMSwgMTM0MTUsIDEzNDI5LCAxMzQ0MiwgMTM0NTUsIDEzNDY4LCAxMzQ4MSwgMTM0OTUsIDEzNTA5LCAxMzUxOSwgMTM1MjksIDEzNTQyLCANCisgICAgMTM1NTUsIDEzNTY4LCAxMzU4MSwgMTM1OTMsIDEzNjA1LCAxMzYxNywgMTM2MjksIDEzNjQxLCAxMzY1MywgMTM2NjUsIDEzNjc3LCAxMzY4OSwgMTM3MDEsIDEzNzEzLCANCisgICAgMTM3MjUsIDEzNzM3LCAxMzc0OSwgMTM3NjEsIDEzNzczLCAxMzc4NSwgMTM3OTcsIDEzODA5LCAxMzgyMSwgMTM4MzMsIDEzODQ1LCAxMzg1NywgMTM4NjksIDEzODgxLCANCisgICAgMTM4OTMsIDEzOTA1LCAxMzkxNywgMTM5MjksIDEzOTQxLCAxMzk1NCwgMTM5NjcsIDEzOTgwLCAxMzk5MywgMTQwMDcsIDE0MDIxLCAxNDAzNSwgMTQwNDksIDE0MDYxLCANCisgICAgMTQwNzMsIDE0MDg5LCAxNDEwNSwgMTQxMjEsIDE0MTM3LCAxNDE1MywgMTQxNjksIDE0MTg1LCAxNDIwMSwgMTQyMTcsIDE0MjMzLCAxNDI0OSwgMTQyNjUsIDE0Mjc2LCANCisgICAgMTQyODcsIDE0Mjk4LCAxNDMxNSwgMTQzMjMsIDE0MzMzLCAxNDM0MSwgMTQzNDksIDE0MzU3LCAxNDM2NywgMTQzNzUsIDE0MzgzLCAxNDM5MSwgMTQzOTksIDE0NDExLCANCisgICAgMTQ0MTksIDE0NDI3LCAxNDQzNSwgMTQ0NDUsIDE0NDUzLCAxNDQ2MSwgMTQ0NjksIDE0NDc3LCAxNDQ4OCwgMTQ0OTYsIDE0NTA2LCAxNDUxNCwgMTQ1MjIsIDE0NTMwLCANCisgICAgMTQ1MzgsIDE0NTQ2LCAxNDU1NywgMTQ1NjUsIDE0NTc3LCAxNDU4OCwgMTQ1OTYsIDE0NjA0LCAxNDYxMiwgMTQ2MjIsIDE0NjMyLCAxNDY0MiwgMTQ2NTEsIDE0NjU5LCANCisgICAgMTQ2NjcsIDE0Njc3LCAxNDY4NSwgMTQ2OTYsIDE0NzA0LCAxNDcxNCwgMTQ3MjMsIDE0NzMxLCAxNDczOSwgMTQ3NDcsIDE0NzU1LCAxNDc2NSwgMTQ3NzgsIDE0NzkwLCANCisgICAgMTQ3OTgsIDE0ODA5LCAxNDgxNywgMTQ4MjksIDE0ODQwLCAxNDg0OCwgMTQ4NTYsIDE0ODY0LCAxNDg3NywgMTQ4ODksIDE0OTAxLCAxNDkwOSwgMTQ5MTYsIDE0OTIzLCANCisgICAgMTQ5MzYsIDE0OTQ0LCAxNDk1MSwgMTQ5NTgsIDE0OTY1LCAxNDk3OCwgMTQ5ODUsIDE0OTk4LCAxNTAwOSwgMTUwMTgsIDE1MDI3LCAxNTAzNiwgMTUwNDUsIDE1MDU0LCANCisgICAgMTUwNjMsIDE1MDczLCAxNTA4MywgMTUwOTUsIDE1MTA3LCAxNTExOCwgMTUxMjksIDE1MTM4LCAxNTE0NywgMTUxNTYsIDE1MTY1LCAxNTE3OCwgMTUxODcsIDE1MjAwLCANCisgICAgMTUyMTAsIDE1MjE5LCAxNTIyOCwgMTUyMzcsIDE1MjQ2LCAxNTI1NiwgMTUyNjUsIDE1Mjc0LCAxNTI4MywgMTUyOTIsIDE1MzAzLCAxNTMxNCwgMTUzMjUsIDE1MzM2LCANCisgICAgMTUzNDksIDE1MzU5LCAxNTM3MywgMTUzODUsIDE1Mzk0LCAxNTQwNywgMTU0MTcsIDE1NDMxLCAxNTQ0MSwgMTU0NTUsIDE1NDY0LCAxNTQ3NiwgMTU0ODgsIDE1NTAwLCANCisgICAgMTU1MTMsIDE1NTI1LCAxNTUzNCwgMTU1NDAsIDE1NTQ2LCAxNTU1NCwgMTU1NjIsIDE1NTcwLCAxNTU4MiwgMTU1OTQsIDE1NjA1LCAxNTYxNiwgMTU2MjcsIDE1NjM4LCANCisgICAgMTU2NDQsIDE1NjU1LCAxNTY2NiwgMTU2NzQsIDE1NjgyLCAxNTY5MCwgMTU2OTYsIDE1NzA3LCAxNTcxOSwgMTU3MzAsIDE1NzQyLCAxNTc1NCwgMTU3NjUsIDE1Nzc3LCANCisgICAgMTU3ODgsIDE1ODAwLCAxNTgxMiwgMTU4MjMsIDE1ODM1LCAxNTg0NywgMTU4NTgsIDE1ODY3LCAxNTg4MCwgMTU4ODksIDE1OTAyLCAxNTkxMSwgMTU5MjAsIDE1OTMzLCANCisgICAgMTU5NDIsIDE1OTU1LCAxNTk2NCwgMTU5NzcsIDE1OTkwLCAxNjAwNiwgMTYwMjIsIDE2MDM1LCAxNjA0OCwgMTYwNTksIDE2MDcxLCAxNjA4MiwgMTYwOTQsIDE2MTExLCANCisgICAgMTYxMjgsIDE2MTQwLCAxNjE1MSwgMTYxNjMsIDE2MTc0LCAxNjE4NiwgMTYyMDAsIDE2MjEyLCAxNjIyMywgMTYyMzYsIDE2MjQ4LCAxNjI2MiwgMTYyNzQsIDE2Mjg1LCANCisgICAgMTYyOTgsIDE2MzA5LCAxNjMyMCwgMTYzMzEsIDE2MzQyLCAxNjM1MywgMTYzNjQsIDE2Mzc1LCAxNjM4NiwgMTYzOTcsIDE2NDA4LCAxNjQxOSwgMTY0MjYsIDE2NDMzLCANCisgICAgMTY0NDAsIDE2NDQ3LCAxNjQ1NCwgMTY0NjEsIDE2NDY3LCAxNjQ3MywgMTY0ODEsIDE2NDg5LCAxNjQ5NywgMTY1MDUsIDE2NTEzLCAxNjUyNSwgMTY1MzMsIDE2NTQ1LCANCisgICAgMTY1NTMsIDE2NTY1LCAxNjU3MywgMTY1ODUsIDE2NTk0LCAxNjYwMywgMTY2MTMsIDE2NjIzLCAxNjYzNCwgMTY2NDQsIDE2NjUzLCAxNjY2MywgMTY2NzIsIDE2NjgyLCANCisgICAgMTY2OTQsIDE2NzAzLCAxNjcxNSwgMTY3MjcsIDE2NzQwLCAxNjc1MywgMTY3NjYsIDE2Nzc5LCAxNjc5MiwgMTY4MDUsIDE2ODE1LCAxNjgyMSwgMTY4MjgsIDE2ODM1LCANCisgICAgMTY4NDIsIDE2ODQ5LCAxNjg1NiwgMTY4NjMsIDE2ODY5LCAxNjg3NSwgMTY4ODAsIDE2ODg2LCAxNjg5MiwgMTY4OTksIDE2OTA2LCAxNjkxMywgMTY5MjAsIDE2OTI3LCANCisgICAgMTY5MzQsIDE2OTQwLCAxNjk0NiwgMTY5NTQsIDE2OTYxLCAxNjk2OSwgMTY5NzYsIDE2OTgzLCAxNjk5MSwgMTY5OTgsIDE3MDA1LCAxNzAxNiwgMTcwMjQsIDE3MDMxLCANCisgICAgMTcwMzksIDE3MDQ2LCAxNzA1MywgMTcwNjEsIDE3MDY4LCAxNzA3NSwgMTcwODYsIDE3MDk0LCAxNzEwMywgMTcxMTEsIDE3MTE4LCAxNzEyNywgMTcxMzUsIDE3MTQyLCANCisgICAgMTcxNDksIDE3MTYwLCAxNzE2NiwgMTcxNzIsIDE3MTc4LCAxNzE4NCwgMTcxOTAsIDE3MTk2LCAxNzIwNiwgMTcyMTMsIDE3MjIwLCAxNzIyNywgMTcyMzQsIDE3MjQyLCANCisgICAgMTcyNTAsIDE3MjU4LCAxNzI2NiwgMTcyNzMsIDE3MjgwLCAxNzI4NiwgMTcyOTIsIDE3Mjk4LCAxNzMwOSwgMTczMTksIDE3MzMwLCAxNzM0MCwgMTczNTEsIDE3MzYxLCANCisgICAgMTczNzIsIDE3MzgyLCAxNzM5MywgMTc0MDMsIDE3NDE0LCAxNzQyNCwgMTc0MzUsIDE3NDQ2LCAxNzQ1NywgMTc0NjgsIDE3NDc5LCAxNzQ5MCwgMTc1MDEsIDE3NTEyLCANCisgICAgMTc1MjAsIDE3NTI4LCAxNzUzNiwgMTc1NDQsIDE3NTUyLCAxNzU2MCwgMTc1NjksIDE3NTc4LCAxNzU4NywgMTc1OTYsIDE3NjA2LCAxNzYxNiwgMTc2MjYsIDE3NjM2LCANCisgICAgMTc2NDQsIDE3NjUyLCAxNzY2NSwgMTc2NzgsIDE3NjkwLCAxNzcwMiwgMTc3MTAsIDE3NzE4LCAxNzcyNSwgMTc3MzIsIDE3NzM4LCAxNzc0NiwgMTc3NTQsIDE3NzYyLCANCisgICAgMTc3NzAsIDE3NzgyLCAxNzc5NCwgMTc4MDUsIDE3ODE2LCAxNzgyNiwgMTc4MzYsIDE3ODQ2LCAxNzg1NiwgMTc4NjYsIDE3ODc2LCAxNzg4NiwgMTc4OTYsIDE3OTA5LCANCisgICAgMTc5MjIsIDE3OTM1LCAxNzk0OCwgMTc5NjEsIDE3OTc0LCAxNzk4NywgMTgwMDAsIDE4MDEzLCAxODAyNiwgMTgwMzgsIDE4MDUwLCAxODA2NiwgMTgwODIsIDE4MDk3LCANCisgICAgMTgxMTIsIDE4MTIyLCAxODEzMiwgMTgxNDIsIDE4MTUyLCAxODE2MiwgMTgxNzIsIDE4MTgyLCAxODE5MiwgMTgyMDUsIDE4MjE4LCAxODIzMSwgMTgyNDQsIDE4MjU3LCANCisgICAgMTgyNzAsIDE4MjgzLCAxODI5NiwgMTgzMDksIDE4MzIyLCAxODMzNCwgMTgzNDYsIDE4MzYyLCAxODM3OCwgMTgzOTMsIDE4NDA4LCAxODQxNywgMTg0MjYsIDE4NDM1LCANCisgICAgMTg0NDQsIDE4NDUzLCAxODQ2MiwgMTg0NzEsIDE4NDgwLCAxODQ5MiwgMTg1MDMsIDE4NTE1LCAxODUyNiwgMTg1MzksIDE4NTUxLCAxODU2NCwgMTg1NzYsIDE4NTg4LCANCisgICAgMTg1OTksIDE4NjExLCAxODYyMiwgMTg2MzgsIDE4NjU0LCAxODY2NiwgMTg2NzcsIDE4Njg5LCAxODcwMCwgMTg3MTMsIDE4NzI1LCAxODczOCwgMTg3NTAsIDE4NzYyLCANCisgICAgMTg3NzMsIDE4Nzg1LCAxODc5NiwgMTg4MDUsIDE4ODE0LCAxODgyMywgMTg4MzIsIDE4ODQxLCAxODg1MCwgMTg4NjAsIDE4ODcwLCAxODg4NSwgMTg4OTksIDE4OTE0LCANCisgICAgMTg5MjgsIDE4OTM4LCAxODk0OCwgMTg5NTcsIDE4OTY2LCAxODk3NSwgMTg5ODQsIDE4OTkzLCAxOTAwMiwgMTkwMTEsIDE5MDIwLCAxOTAyOSwgMTkwMzgsIDE5MDQ3LCANCisgICAgMTkwNTYsIDE5MDY1LCAxOTA3NCwgMTkwODMsIDE5MDkyLCAxOTEwMSwgMTkxMTAsIDE5MTE5LCAxOTEyOCwgMTkxMzcsIDE5MTQ2LCAxOTE1NSwgMTkxNjQsIDE5MTc1LCANCisgICAgMTkxODYsIDE5MTk3LCAxOTIwOCwgMTkyMTksIDE5MjMwLCAxOTI0MSwgMTkyNTIsIDE5MjYzLCAxOTI3NCwgMTkyODUsIDE5Mjk2LCAxOTMwNywgMTkzMTgsIDE5MzI5LCANCisgICAgMTkzNDAsIDE5MzUxLCAxOTM2MiwgMTkzNzMsIDE5Mzg0LCAxOTM5NSwgMTk0MDYsIDE5NDE3LCAxOTQyOCwgMTk0MzksIDE5NDQ4LCAxOTQ1NywgMTk0NzEsIDE5NDg0LCANCisgICAgMTk0OTgsIDE5NTExLCAxOTUyMSwgMTk1MzEsIDE5NTQwLCAxOTU0OSwgMTk1NTgsIDE5NTY3LCAxOTU3NiwgMTk1ODUsIDE5NTk1LCAxOTYwNSwgMTk2MTIsIDE5NjIxLCANCisgICAgMTk2MzAsIDE5NjM3LCAxOTY0NiwgMTk2NTUsIDE5NjYyLCAxOTY3MSwgMTk2ODAsIDE5Njg3LCAxOTY5OCwgMTk3MDksIDE5NzIwLCAxOTczMSwgMTk3NDIsIDE5NzUzLCANCisgICAgMTk3NjAsIDE5NzY3LCAxOTc3NCwgMTk3ODIsIDE5NzkwLCAxOTc5OCwgMTk4MDYsIDE5ODE0LCAxOTgyMiwgMTk4MjgsIDE5ODM0LCAxOTg0NiwgMTk4NTcsIDE5ODY4LCANCisgICAgMTk4NzksIDE5ODg4LCAxOTg5NywgMTk5MDksIDE5OTIwLCAxOTkzMiwgMTk5NDMsIDE5OTUyLCAxOTk2MSwgMTk5NzEsIDE5OTgxLCAxOTk5MSwgMjAwMDEsIDIwMDEzLCANCisgICAgMjAwMjQsIDIwMDM2LCAyMDA0NywgMjAwNTksIDIwMDcwLCAyMDA4MiwgMjAwOTMsIDIwMTA1LCAyMDExNiwgMjAxMjgsIDIwMTM5LCAyMDE0OCwgMjAxNTYsIDIwMTY0LCANCisgICAgMjAxNzIsIDIwMTgwLCAyMDE4OCwgMjAxOTYsIDIwMjA0LCAyMDIxMiwgMjAyMjAsIDIwMjI4LCAyMDIzNiwgMjAyNDQsIDIwMjUyLCAyMDI2MCwgMjAyNjgsIDIwMjc3LCANCisgICAgMjAyODUsIDIwMjkzLCAyMDMwMSwgMjAzMDksIDIwMzE3LCAyMDMyNSwgMjAzMzMsIDIwMzQxLCAyMDM0OSwgMjAzNTcsIDIwMzY1LCAyMDM3MywgMjAzODEsIDIwMzg5LCANCisgICAgMjAzOTcsIDIwNDA2LCAyMDQxNSwgMjA0MjQsIDIwNDMzLCAyMDQ0MywgMjA0NTMsIDIwNDYzLCAyMDQ3MywgMjA0ODEsIDIwNDg5LCAyMDQ5NywgMjA1MDUsIDIwNTE3LCANCisgICAgMjA1MjksIDIwNTQxLCAyMDU1MywgMjA1NjYsIDIwNTc5LCAyMDU5MSwgMjA2MDMsIDIwNjE1LCAyMDYyNywgMjA2MzksIDIwNjUxLCAyMDY2NCwgMjA2NzcsIDIwNjg5LCANCisgICAgMjA3MDEsIDIwNzA5LCAyMDcxOSwgMjA3MjksIDIwNzM3LCAyMDc0NywgMjA3NTcsIDIwNzY3LCAyMDc3NywgMjA3ODYsIDIwNzk0LCAyMDgwNCwgMjA4MTQsIDIwODIyLCANCisgICAgMjA4MzAsIDIwODM4LCAyMDg0NiwgMjA4NTUsIDIwODY0LCAyMDg3MywgMjA4ODIsIDIwODkxLCAyMDkwMCwgMjA5MDgsIDIwOTE2LCAyMDkyMywgMjA5MzAsIDIwOTM3LCANCisgICAgMjA5NDUsIDIwOTU0LCAyMDk2MiwgMjA5NzAsIDIwOTc5LCAyMDk4NywgMjA5OTUsIDIxMDA0LCAyMTAxMiwgMjEwMjAsIDIxMDI5LCAyMTAzNywgMjEwNDUsIDIxMDU0LCANCisgICAgMjEwNjIsIDIxMDcwLCAyMTA3OSwgMjEwODcsIDIxMDk0LCAyMTEwMiwgMjExMDksIDIxMTE2LCAyMTEyNCwgMjExMzEsIDIxMTM4LCAyMTE0OSwgMjExNTYsIDIxMTY3LCANCisgICAgMjExNzQsIDIxMTg1LCAyMTE5MiwgMjEyMDMsIDIxMjExLCAyMTIyMCwgMjEyMjgsIDIxMjM2LCAyMTI0NSwgMjEyNTMsIDIxMjYxLCAyMTI3MCwgMjEyNzgsIDIxMjg2LCANCisgICAgMjEyOTUsIDIxMzAzLCAyMTMxMSwgMjEzMjAsIDIxMzI4LCAyMTMzNiwgMjEzNDUsIDIxMzUzLCAyMTM2MCwgMjEzNjgsIDIxMzc1LCAyMTM4MiwgMjEzOTAsIDIxMzk3LCANCisgICAgMjE0MDMsIDIxNDA5LCAyMTQxNSwgMjE0MjIsIDIxNDM1LCAyMTQ0NSwgMjE0NTUsIDIxNDY1LCAyMTQ3NSwgMjE0ODYsIDIxNDk2LCAyMTUwNiwgMjE1MTYsIDIxNTI2LCANCisgICAgMjE1MzAsIDIxNTM1LCAyMTU0MywgMjE1NTIsIDIxNTYwLCAyMTU2OCwgMjE1NzcsIDIxNTg1LCAyMTU5MywgMjE2MDIsIDIxNjEwLCAyMTYxOCwgMjE2MjcsIDIxNjM1LCANCisgICAgMjE2NDMsIDIxNjUyLCAyMTY2MCwgMjE2NjgsIDIxNjc3LCAyMTY4NSwgMjE2OTIsIDIxNzAwLCAyMTcwNywgMjE3MTQsIDIxNzIyLCAyMTcyOSwgMjE3MzcsIDIxNzQ2LCANCisgICAgMjE3NTQsIDIxNzYyLCAyMTc3MSwgMjE3NzksIDIxNzg3LCAyMTc5NiwgMjE4MDQsIDIxODEyLCAyMTgyMSwgMjE4MjksIDIxODM3LCAyMTg0NiwgMjE4NTQsIDIxODYyLCANCisgICAgMjE4NzEsIDIxODc5LCAyMTg4NiwgMjE4OTQsIDIxOTAxLCAyMTkwOCwgMjE5MTYsIDIxOTIzLCAyMTkzNiwgMjE5NDksIDIxOTYyLCAyMTk3NSwgMjE5ODgsIDIyMDAxLCANCisgICAgMjIwMTQsIDIyMDI3LCAyMjAzMSwgMjIwNDAsIDIyMDUzLCAyMjA2MiwgMjIwNzUsIDIyMDg0LCAyMjA5NywgMjIxMDYsIDIyMTE5LCAyMjEyNCwgMjIxMzIsIDIyMTQxLCANCisgICAgMjIxNDksIDIyMTU3LCAyMjE2NiwgMjIxNzQsIDIyMTgyLCAyMjE5MSwgMjIxOTksIDIyMjA3LCAyMjIxNiwgMjIyMjQsIDIyMjMyLCAyMjI0MSwgMjIyNDksIDIyMjU3LCANCisgICAgMjIyNjYsIDIyMjc0LCAyMjI4MSwgMjIyODksIDIyMjk2LCAyMjMwMywgMjIzMTEsIDIyMzE4LCAyMjMyNywgMjIzMzUsIDIyMzQ0LCAyMjM1MiwgMjIzNjAsIDIyMzY5LCANCisgICAgMjIzNzcsIDIyMzg1LCAyMjM5NywgMjI0MDYsIDIyNDE0LCAyMjQyMywgMjI0MzEsIDIyNDM5LCAyMjQ0OCwgMjI0NTYsIDIyNDY0LCAyMjQ3NiwgMjI0ODUsIDIyNDk1LCANCisgICAgMjI1MDQsIDIyNTEyLCAyMjUyMiwgMjI1MzEsIDIyNTM5LCAyMjU0NywgMjI1NTksIDIyNTY2LCAyMjU3MywgMjI1ODAsIDIyNTg3LCAyMjU5NCwgMjI2MDEsIDIyNjEyLCANCisgICAgMjI2MTksIDIyNjI2LCAyMjYzMywgMjI2MzksIDIyNjQ2LCAyMjY1MywgMjI2NTksIDIyNjY1LCAyMjY3MiwgMjI2NzksIDIyNjg5LCAyMjY5OSwgMjI3MDksIDIyNzE4LCANCisgICAgMjI3MjQsIDIyNzMwLCAyMjczNiwgMjI3NDIsIDIyNzQ5LCAyMjc1NiwgMjI3NjIsIDIyNzY4LCAyMjc3NSwgMjI3ODIsIDIyNzg4LCAyMjc5NCwgMjI4MDEsIDIyODA4LCANCisgICAgMjI4MTUsIDIyODIyLCAyMjgyOSwgMjI4MzYsIDIyODQzLCAyMjg1MCwgMjI4NTYsIDIyODYyLCAyMjg2OCwgMjI4NzQsIDIyODgwLCAyMjg4NiwgMjI4OTMsIDIyODk5LCANCisgICAgMjI5MDcsIDIyOTE2LCAyMjkyNCwgMjI5MzIsIDIyOTQxLCAyMjk0OSwgMjI5NTcsIDIyOTY2LCAyMjk3NCwgMjI5ODIsIDIyOTkxLCAyMjk5OSwgMjMwMDcsIDIzMDE2LCANCisgICAgMjMwMjQsIDIzMDMyLCAyMzA0MSwgMjMwNDksIDIzMDU2LCAyMzA2NCwgMjMwNzEsIDIzMDc4LCAyMzA4NiwgMjMwOTMsIDIzMTA0LCAyMzExNSwgMjMxMjYsIDIzMTM3LCANCisgICAgMjMxNDgsIDIzMTU5LCAyMzE3MCwgMjMxODEsIDIzMTkyLCAyMzIwMywgMjMyMTQsIDIzMjI1LCAyMzIzMywgMjMyNDIsIDIzMjUwLCAyMzI1OCwgMjMyNjcsIDIzMjc1LCANCisgICAgMjMyODMsIDIzMjkyLCAyMzMwMCwgMjMzMDgsIDIzMzE3LCAyMzMyNSwgMjMzMzMsIDIzMzQyLCAyMzM1MCwgMjMzNTgsIDIzMzY3LCAyMzM3NSwgMjMzODIsIDIzMzkwLCANCisgICAgMjMzOTcsIDIzNDA0LCAyMzQxMiwgMjM0MTksIDIzNDMwLCAyMzQ0MSwgMjM0NTIsIDIzNDYzLCAyMzQ3NCwgMjM0ODUsIDIzNDk2LCAyMzUwNywgMjM1MTgsIDIzNTI5LCANCisgICAgMjM1NDAsIDIzNTUxLCAyMzU2MSwgMjM1NzEsIDIzNTgxLCAyMzU5MSwgMjM1OTcsIDIzNjAzLCAyMzYxMiwgMjM2MjEsIDIzNjMwLCAyMzYzOCwgMjM2NDYsIDIzNjU0LCANCisgICAgMjM2NjIsIDIzNjcwLCAyMzY3OCwgMjM2ODYsIDIzNjk0LCAyMzcwMiwgMjM3MTQsIDIzNzIyLCAyMzczNCwgMjM3NDIsIDIzNzU0LCAyMzc2MiwgMjM3NzQsIDIzNzgyLCANCisgICAgMjM3OTQsIDIzODAyLCAyMzgxNCwgMjM4MjIsIDIzODM0LCAyMzg0MiwgMjM4NTQsIDIzODYxLCAyMzg3MSwgMjM4ODEsIDIzODkxLCAyMzkwMSwgMjM5MDUsIDIzOTA5LCANCisgICAgMjM5MTMsIDIzOTIxLCAyMzkyNywgMjM5MzMsIDIzOTM5LCAyMzk0NSwgMjM5NTAsIDIzOTU1LCAyMzk2MywgMjM5NzEsIDIzOTgwLCAyMzk4OSwgMjM5OTgsIDI0MDA2LCANCisgICAgMjQwMTUsIDI0MDI0LCAyNDAzNSwgMjQwNDYsIDI0MDU3LCAyNDA2NywgMjQwNzcsIDI0MDg5LCAyNDA5OSwgMjQxMTEsIDI0MTIzLCAyNDEzMCwgMjQxMzksIDI0MTQ3LCANCisgICAgMjQxNTYsIDI0MTY0LCAyNDE3MiwgMjQxODEsIDI0MTg5LCAyNDE5NywgMjQyMDksIDI0MjE4LCAyNDIyNiwgMjQyMzUsIDI0MjQzLCAyNDI1MSwgMjQyNjAsIDI0MjY4LCANCisgICAgMjQyNzYsIDI0Mjg4LCAyNDI5NywgMjQzMDcsIDI0MzE2LCAyNDMyNCwgMjQzMzQsIDI0MzQzLCAyNDM1MSwgMjQzNTksIDI0MzcxLCAyNDM3OCwgMjQzODUsIDI0MzkyLCANCisgICAgMjQzOTksIDI0NDA2LCAyNDQxMywgMjQ0MjQsIDI0NDMyLCAyNDQ0MCwgMjQ0NDgsIDI0NDU2LCAyNDQ2NiwgMjQ0NzYsIDI0NDg3LCAyNDQ5OCwgMjQ1MTAsIDI0NTIxLCANCisgICAgMjQ1MzIsIDI0NTQzLCAyNDU1NiwgMjQ1NjksIDI0NTgyLCAyNDU5NiwgMjQ2MTAsIDI0NjI0LCAyNDYzOCwgMjQ2NTIsIDI0NjY2LCAyNDY3NywgMjQ2ODUsIDI0Njk3LCANCisgICAgMjQ3MDUsIDI0NzE3LCAyNDcyNSwgMjQ3MzcsIDI0NzQ1LCAyNDc1NywgMjQ3NjYsIDI0Nzc1LCAyNDc4NSwgMjQ3OTUsIDI0ODA2LCAyNDgxNiwgMjQ4MjUsIDI0ODM1LCANCisgICAgMjQ4NDQsIDI0ODU0LCAyNDg2NiwgMjQ4NzUsIDI0ODg3LCAyNDg5OSwgMjQ5MTIsIDI0OTI1LCAyNDkzOCwgMjQ5NTEsIDI0OTY0LCAyNDk3NywgMjQ5ODcsIDI0OTk0LCANCisgICAgMjUwMDIsIDI1MDExLCAyNTAxOSwgMjUwMjksIDI1MDM2LCAyNTA0NSwgMjUwNTYsIDI1MDY1LCAyNTA3NiwgMjUwODUsIDI1MDk2LCAyNTEwNywgMjUxMjAsIDI1MTMxLCANCisgICAgMjUxNDQsIDI1MTU1LCAyNTE2OCwgMjUxNzgsIDI1MTg3LCAyNTE5NiwgMjUyMDUsIDI1MjE0LCAyNTIyNCwgMjUyMzMsIDI1MjQyLCAyNTI1MSwgMjUyNjAsIDI1MjcwLCANCisgICAgMjUyODEsIDI1MjkyLCAyNTMwMSwgMjUzMTAsIDI1MzE4LCAyNTMyNiwgMjUzMzQsIDI1MzQyLCAyNTM1MCwgMjUzNjEsIDI1MzcyLCAyNTM4MywgMjUzOTQsIDI1Mzk5LCANCisgICAgMjU0MDUsIDI1NDE0LCAyNTQyMywgMjU0MzIsIDI1NDQyLCAyNTQ1MiwgMjU0NjIsIDI1NDcyLCAyNTQ4MiwgMjU0OTEsIDI1NTAxLCAyNTUxMCwgMjU1MjIsIDI1NTM0LCANCisgICAgMjU1NDYsIDI1NTU3LCAyNTU2OCwgMjU1NzksIDI1NTg3LCAyNTU5OCwgMjU2MDksIDI1NjIwLCAyNTYzMSwgMjU2NDIsIDI1NjUzLCAyNTY2NCwgMjU2NzUsIDI1Njg1LCANCisgICAgMjU2OTUsIDI1NzA0LCAyNTcxMywgMjU3MjMsIDI1NzMzLCAyNTc0MiwgMjU3NTEsIDI1NzYwLCAyNTc3MywgMjU3ODIsIDI1Nzk1LCAyNTgwNCwgMjU4MTcsIDI1ODI2LCANCisgICAgMjU4MzksIDI1ODUyLCAyNTg2NSwgMjU4NzcsIDI1ODg5LCAyNTkwMiwgMjU5MTUsIDI1OTI3LCAyNTkzOSwgMjU5NTMsIDI1OTY3LCAyNTk3NywgMjU5ODcsIDI2MDAxLCANCisgICAgMjYwMTUsIDI2MDI1LCAyNjAzNSwgMjYwNDUsIDI2MDU1LCAyNjA3NywgMjYwOTksIDI2MTEwLCAyNjEyMSwgMjYxMzEsIDI2MTQxLCAyNjE1MiwgMjYxNjMsIDI2MTczLCANCisgICAgMjYxODMsIDI2MTkzLCAyNjIwMywgMjYyMTIsIDI2MjIxLCAyNjIzMSwgMjYyNDEsIDI2MjUwLCAyNjI1OSwgMjYyODEsIDI2Mjk0LCAyNjMwNywgMjYzMTksIDI2MzMxLCANCisgICAgMjYzNDQsIDI2MzU3LCAyNjM2OSwgMjYzODEsIDI2Mzk0LCAyNjQwNywgMjY0MTksIDI2NDMxLCAyNjQ0NCwgMjY0NTcsIDI2NDY5LCAyNjQ4MSwgMjY0OTYsIDI2NTA5LCANCisgICAgMjY1MjIsIDI2NTM2LCAyNjU0NywgMjY1NjIsIDI2NTczLCAyNjU4OCwgMjY1OTgsIDI2NjEyLCAyNjYyMiwgMjY2MzYsIDI2NjQ3LCAyNjY2MiwgMjY2NzMsIDI2Njg4LCANCisgICAgMjY2OTgsIDI2NzEyLCAyNjcyMiwgMjY3MzYsIDI2NzQ1LCAyNjc1OCwgMjY3NjcsIDI2NzgwLCAyNjc4OSwgMjY4MDIsIDI2ODExLCAyNjgyNCwgMjY4MzQsIDI2ODQ0LCANCisgICAgMjY4NTQsIDI2ODY0LCAyNjg3NywgMjY4OTAsIDI2OTAyLCAyNjkxNCwgMjY5MjcsIDI2OTQwLCAyNjk1MiwgMjY5NjQsIDI2OTc4LCAyNjk5MSwgMjcwMDQsIDI3MDE3LCANCisgICAgMjcwMzAsIDI3MDQyLCAyNzA1NiwgMjcwNjksIDI3MDgyLCAyNzA5NSwgMjcxMDgsIDI3MTIwLCAyNzEzMywgMjcxNDYsIDI3MTU4LCAyNzE3MCwgMjcxODMsIDI3MTk2LCANCisgICAgMjcyMDgsIDI3MjIwLCAyNzIzNCwgMjcyNDgsIDI3MjY0LCAyNzI4MCwgMjcyOTIsIDI3MzA0LCAyNzMxOCwgMjczMzIsIDI3MzQ1LCAyNzM1OCwgMjczNzAsIDI3MzgyLCANCisgICAgMjczOTYsIDI3NDEwLCAyNzQyMiwgMjc0MzQsIDI3NDQ2LCAyNzQ1OCwgMjc0NzIsIDI3NDg2LCAyNzQ5OCwgMjc1MTAsIDI3NTI1LCAyNzUzOSwgMjc1NTMsIDI3NTY3LCANCisgICAgMjc1ODEsIDI3NTk0LCAyNzYwOCwgMjc2MjIsIDI3NjM1LCAyNzY0OCwgMjc2NjMsIDI3Njc4LCAyNzY5MSwgMjc3MDQsIDI3NzE5LCAyNzczNCwgMjc3NDcsIDI3NzYwLCANCisgICAgMjc3NzAsIDI3NzgwLCAyNzc4OSwgMjc3OTgsIDI3ODA4LCAyNzgxOCwgMjc4MjcsIDI3ODM2LCAyNzg0NSwgMjc4NTgsIDI3ODY3LCAyNzg4MCwgMjc4ODksIDI3OTAyLCANCisgICAgMjc5MTEsIDI3OTI0LCAyNzkzMywgMjc5NDIsIDI3OTUyLCAyNzk2MiwgMjc5NzEsIDI3OTgwLCAyNzk4NiwgMjc5OTIsIDI3OTk4LCAyODAwNCwgMjgwMTksIDI4MDM0LCANCisgICAgMjgwNDcsIDI4MDYwLCAyODA3NSwgMjgwODksIDI4MTA0LCAyODExOCwgMjgxMzMsIDI4MTQ3LCAyODE2MiwgMjgxNzYsIDI4MTkxLCAyODIwNSwgMjgyMjAsIDI4MjM0LCANCisgICAgMjgyNDksIDI4MjYzLCAyODI3OCwgMjgyOTIsIDI4MzA3LCAyODMyMSwgMjgzMzYsIDI4MzUwLCAyODM2NSwgMjgzNzksIDI4Mzk0LCAyODQwOCwgMjg0MjMsIDI4NDQwLCANCisgICAgMjg0NTgsIDI4NDc1LCAyODQ5MywgMjg1MTAsIDI4NTI4LCAyODU0NSwgMjg1NjMsIDI4NTgwLCAyODU5OCwgMjg2MTUsIDI4NjMzLCAyODY1MCwgMjg2NjgsIDI4Njg1LCANCisgICAgMjg3MDMsIDI4NzIwLCAyODczOCwgMjg3NTUsIDI4NzczLCAyODc5MCwgMjg4MDgsIDI4ODI1LCAyODg0MywgMjg4NjAsIDI4ODc4LCAyODg5NSwgMjg5MTMsIDI4OTMwLCANCisgICAgMjg5NDgsIDI4OTY1LCAyODk4MywgMjkwMDAsIDI5MDE4LCAyOTAzNSwgMjkwNTMsIDI5MDcwLCAyOTA4OCwgMjkxMDUsIDI5MTIzLCAyOTE0MCwgMjkxNTgsIDI5MTc1LCANCisgICAgMjkxOTMsIDI5MjEwLCAyOTIyOCwgMjkyNDUsIDI5MjYzLCAyOTI3NywgMjkyOTIsIDI5MzA2LCAyOTMyMSwgMjkzMzUsIDI5MzUwLCAyOTM2NCwgMjkzNzksIDI5MzkzLCANCisgICAgMjk0MDgsIDI5NDIyLCAyOTQzNywgMjk0NTEsIDI5NDY2LCAyOTQ4MCwgMjk0OTUsIDI5NTA5LCAyOTUyNCwgMjk1MzgsIDI5NTUzLCAyOTU2NywgMjk1ODIsIDI5NTk2LCANCisgICAgMjk2MTEsIDI5NjI2LCAyOTY0MiwgMjk2NTcsIDI5NjczLCAyOTY4OCwgMjk3MDQsIDI5NzE5LCAyOTczNSwgMjk3NTAsIDI5NzY2LCAyOTc4MSwgMjk3OTcsIDI5ODEyLCANCisgICAgMjk4MjgsIDI5ODQzLCAyOTg1OSwgMjk4NzQsIDI5ODkwLCAyOTkwNSwgMjk5MjEsIDI5OTM2LCAyOTk1MiwgMjk5NjcsIDI5OTgzLCAyOTk5OCwgMzAwMTQsIDMwMDI5LCANCisgICAgMzAwNDUsIDMwMDYwLCAzMDA3NiwgMzAwOTEsIDMwMTA3LCAzMDEyMiwgMzAxMzgsIDMwMTUzLCAzMDE2OSwgMzAxODQsIDMwMjAwLCAzMDIxNSwgMzAyMzEsIDMwMjQ2LCANCisgICAgMzAyNjIsIDMwMjc3LCAzMDI5MywgMzAzMDgsIDMwMzI0LCAzMDMzOSwgMzAzNTUsIDMwMzY3LCAzMDM3OSwgMzAzOTEsIDMwNDAzLCAzMDQxNCwgMzA0MjUsIDMwNDM2LCANCisgICAgMzA0NDcsIDMwNDU3LCAzMDQ2NywgMzA0NzcsIDMwNDg3LCAzMDQ5OCwgMzA1MDksIDMwNTIwLCAzMDUzMSwgMzA1NDIsIDMwNTUzLCAzMDU2MywgMzA1NzMsIDMwNTg0LCANCisgICAgMzA1OTUsIDMwNjA1LCAzMDYxNSwgMzA2MjYsIDMwNjM3LCAzMDY0NywgMzA2NTcsIDMwNjY4LCAzMDY3OSwgMzA2ODksIDMwNjk5LCAzMDcxMywgMzA3MjcsIDMwNzM5LCANCisgICAgMzA3NTEsIDMwNzYxLCAzMDc3MCwgMzA3NzksIDMwNzkxLCAzMDgwNSwgMzA4MTksIDMwODMzLCAzMDg0NiwgMzA4NTksIDMwODczLCAzMDg4NywgMzA5MDAsIDMwOTEzLCANCisgICAgMzA5MjMsIDMwOTM3LCAzMDk0NywgMzA5NjEsIDMwOTcwLCAzMDk4MywgMzA5OTIsIDMxMDA1LCAzMTAxNSwgMzEwMjksIDMxMDM5LCAzMTA1MywgMzEwNjIsIDMxMDc1LCANCisgICAgMzEwODQsIDMxMDk3LCAzMTEwNiwgMzExMTksIDMxMTI4LCAzMTE0MSwgMzExNTAsIDMxMTYzLCAzMTE3MiwgMzExODUsIDMxMTkyLCAzMTIwMSwgMzEyMTEsIDMxMjI1LCANCisgICAgMzEyMzUsIDMxMjQ5LCAzMTI1OCwgMzEyNzEsIDMxMjgwLCAzMTI5MywgMzEzMDMsIDMxMzE3LCAzMTMyNywgMzEzNDEsIDMxMzUwLCAzMTM2MywgMzEzNzIsIDMxMzg1LCANCisgICAgMzEzOTQsIDMxNDA3LCAzMTQxNiwgMzE0MjksIDMxNDM4LCAzMTQ1MSwgMzE0NjAsIDMxNDczLCAzMTQ4MiwgMzE0OTMsIDMxNTA0LCAzMTUxNSwgMzE1MjUsIDMxNTM1LCANCisgICAgMzE1NDUsIDMxNTU2LCAzMTU2NywgMzE1NzgsIDMxNTg4LCAzMTU5OCwgMzE2MDgsIDMxNjIwLCAzMTYzMiwgMzE2NDMsIDMxNjU0LCAzMTY2NywgMzE2ODAsIDMxNjkyLCANCisgICAgMzE3MDQsIDMxNzE1LCAzMTcyNiwgMzE3MzcsIDMxNzQ3LCAzMTc1NywgMzE3NjcsIDMxNzc4LCAzMTc4OSwgMzE4MDAsIDMxODEwLCAzMTgyNCwgMzE4MzQsIDMxODQ4LCANCisgICAgMzE4NTgsIDMxODY5LCAzMTg3OSwgMzE4ODksIDMxODk5LCAzMTkwOSwgMzE5MjAsIDMxOTMwLCAzMTk0MCwgMzE5NTAsIDMxOTYwLCAzMTk3MiwgMzE5ODcsIDMyMDAwLCANCisgICAgMzIwMTQsIDMyMDI2LCAzMjA0MSwgMzIwNTQsIDMyMDY4LCAzMjA4MCwgMzIwOTIsIDMyMTA3LCAzMjExOSwgMzIxMzMsIDMyMTQ0LCAzMjE1OSwgMzIxNzEsIDMyMTgyLCANCisgICAgMzIxOTcsIDMyMjA5LCAzMjIyMCwgMzIyMzUsIDMyMjQ4LCAzMjI2MSwgMzIyNzQsIDMyMjg3LCAzMjI5OCwgMzIzMTMsIDMyMzI0LCAzMjMzNCwgMzIzNDMsIDMyMzUyLCANCisgICAgMzIzNjEsIDMyMzc0LCAzMjM4NywgMzIzOTksIDMyNDExLCAzMjQyNCwgMzI0MzcsIDMyNDQ5LCAzMjQ2MSwgMzI0NzMsIDMyNDg1LCAzMjQ5NCwgMzI1MDMsIDMyNTEyLCANCisgICAgMzI1MjMsIDMyNTM0LCAzMjU0NSwgMzI1NTUsIDMyNTY5LCAzMjU3OSwgMzI1OTMsIDMyNjAzLCAzMjYxNCwgMzI2MjUsIDMyNjM2LCAzMjY0NiwgMzI2NjAsIDMyNjcwLCANCisgICAgMzI2ODQsIDMyNjk0LCAzMjcwOCwgMzI3MjIsIDMyNzM5LCAzMjc1NiwgMzI3NzAsIDMyNzg0LCAzMjc5NiwgMzI4MDgsIDMyODE3LCAzMjgyNiwgMzI4MzcsIDMyODQ4LCANCisgICAgMzI4NTksIDMyODcwLCAzMjg3OSwgMzI4ODksIDMyODk5LCAzMjkwOCwgMzI5MTcsIDMyOTI3LCAzMjkzNywgMzI5NDYsIDMyOTU1LCAzMjk2NCwgMzI5NzcsIDMyOTg2LCANCisgICAgMzI5OTksIDMzMDA4LCAzMzAyMSwgMzMwMzAsIDMzMDQzLCAzMzA1NSwgMzMwNjcsIDMzMDc5LCAzMzA5MSwgMzMwOTgsIDMzMTA0LCAzMzExMywgMzMxMjIsIDMzMTMwLCANCisgICAgMzMxMzgsIDMzMTQ3LCAzMzE1NiwgMzMxNjQsIDMzMTcyLCAzMzE4NCwgMzMxOTUsIDMzMjA3LCAzMzIxOCwgMzMyMzAsIDMzMjQxLCAzMzI1MywgMzMyNjQsIDMzMjc2LCANCisgICAgMzMyODcsIDMzMjk5LCAzMzMxMCwgMzMzMjIsIDMzMzM0LCAzMzM0NiwgMzMzNTgsIDMzMzcwLCAzMzM4MiwgMzMzOTQsIDMzNDA2LCAzMzQxNSwgMzM0MjQsIDMzNDMzLCANCisgICAgMzM0NDIsIDMzNDUxLCAzMzQ2MCwgMzM0NzAsIDMzNDgwLCAzMzQ5MCwgMzM1MDAsIDMzNTExLCAzMzUyMiwgMzM1MzMsIDMzNTQ0LCAzMzU1MywgMzM1NjIsIDMzNTc2LCANCisgICAgMzM1OTAsIDMzNjAzLCAzMzYxNiwgMzM2MjUsIDMzNjM0LCAzMzY0MiwgMzM2NTAsIDMzNjU5LCAzMzY2OCwgMzM2NzcsIDMzNjg2LCAzMzY5OCwgMzM3MTAsIDMzNzIyLCANCisgICAgMzM3MzQsIDMzNzUwLCAzMzc2NiwgMzM3ODIsIDMzNzk4LCAzMzgxNCwgMzM4MzAsIDMzODQ2LCAzMzg2MiwgMzM4NzUsIDMzODg4LCAzMzg5OSwgMzM5MTAsIDMzOTIxLCANCisgICAgMzM5MzIsIDMzOTQzLCAzMzk1NCwgMzM5NjUsIDMzOTc2LCAzMzk5MCwgMzQwMDQsIDM0MDE4LCAzNDAzMiwgMzQwNDYsIDM0MDYwLCAzNDA3NCwgMzQwODgsIDM0MTAyLCANCisgICAgMzQxMTYsIDM0MTI5LCAzNDE0MiwgMzQxNTksIDM0MTc2LCAzNDE5MiwgMzQyMDgsIDM0MjE5LCAzNDIzMCwgMzQyNDEsIDM0MjUyLCAzNDI2MywgMzQyNzQsIDM0Mjg1LCANCisgICAgMzQyOTYsIDM0MzEwLCAzNDMyNCwgMzQzMzgsIDM0MzUyLCAzNDM2NiwgMzQzODAsIDM0Mzk0LCAzNDQwOCwgMzQ0MjIsIDM0NDM2LCAzNDQ0OSwgMzQ0NjIsIDM0NDc5LCANCisgICAgMzQ0OTYsIDM0NTEyLCAzNDUyOCwgMzQ1NDEsIDM0NTU0LCAzNDU2NywgMzQ1ODAsIDM0NTkzLCAzNDYwNiwgMzQ2MTgsIDM0NjMwLCAzNDY0MiwgMzQ2NTQsIDM0NjY3LCANCisgICAgMzQ2ODAsIDM0NjkzLCAzNDcwNiwgMzQ3MTgsIDM0NzMwLCAzNDc0MiwgMzQ3NTQsIDM0NzY0LCAzNDc3NCwgMzQ3ODYsIDM0Nzk2LCAzNDgwNiwgMzQ4MTYsIDM0ODI2LCANCisgICAgMzQ4MzYsIDM0ODQ2LCAzNDg1OSwgMzQ4NzEsIDM0ODg0LCAzNDg5NiwgMzQ5MTAsIDM0OTIzLCAzNDkzNywgMzQ5NTAsIDM0OTYzLCAzNDk3NSwgMzQ5ODgsIDM1MDAwLCANCisgICAgMzUwMTcsIDM1MDM0LCAzNTA0NywgMzUwNTksIDM1MDcyLCAzNTA4NCwgMzUwOTgsIDM1MTExLCAzNTEyNSwgMzUxMzgsIDM1MTUxLCAzNTE2MywgMzUxNzYsIDM1MTg4LCANCisgICAgMzUxOTgsIDM1MjA4LCAzNTIxOCwgMzUyMjgsIDM1MjM4LCAzNTI0OCwgMzUyNTksIDM1MjcyLCAzNTI4MywgMzUyOTksIDM1MzE0LCAzNTMzMCwgMzUzNDUsIDM1MzU2LCANCisgICAgMzUzNjcsIDM1Mzc3LCAzNTM4NywgMzUzOTcsIDM1NDA3LCAzNTQxNywgMzU0MjcsIDM1NDM3LCAzNTQ0NywgMzU0NTcsIDM1NDY3LCAzNTQ3NywgMzU0ODcsIDM1NDk3LCANCisgICAgMzU1MDcsIDM1NTE3LCAzNTUyNywgMzU1MzcsIDM1NTQ3LCAzNTU1NywgMzU1NjcsIDM1NTc3LCAzNTU4NywgMzU1OTcsIDM1NjA3LCAzNTYyMSwgMzU2MzMsIDM1NjQ1LCANCisgICAgMzU2NTcsIDM1NjY5LCAzNTY4MSwgMzU2OTMsIDM1NzA1LCAzNTcxNywgMzU3MjksIDM1NzQxLCAzNTc1MywgMzU3NjUsIDM1Nzc3LCAzNTc4OSwgMzU4MDEsIDM1ODEzLCANCisgICAgMzU4MjUsIDM1ODM3LCAzNTg0OSwgMzU4NjEsIDM1ODczLCAzNTg4NSwgMzU4OTcsIDM1OTA5LCAzNTkyMSwgMzU5MzEsIDM1OTQxLCAzNTk1NiwgMzU5NzAsIDM1OTg1LCANCisgICAgMzU5OTksIDM2MDEwLCAzNjAyMSwgMzYwMzEsIDM2MDQxLCAzNjA1MSwgMzYwNjEsIDM2MDcxLCAzNjA4MSwgMzYwOTIsIDM2MTAzLCAzNjExMCwgMzYxMTcsIDM2MTI3LCANCisgICAgMzYxMzcsIDM2MTUwLCAzNjE2MiwgMzYxNzUsIDM2MTg3LCAzNjE5NywgMzYyMDcsIDM2MjE4LCAzNjIyOSwgMzYyNDAsIDM2MjUxLCAzNjI2NCwgMzYyNzYsIDM2Mjg5LCANCisgICAgMzYzMDEsIDM2MzE0LCAzNjMyNiwgMzYzMzksIDM2MzUxLCAzNjM2NCwgMzYzNzYsIDM2Mzg5LCAzNjQwMSwgMzY0MTEsIDM2NDIwLCAzNjQyOSwgMzY0MzgsIDM2NDQ3LCANCisgICAgMzY0NTYsIDM2NDY1LCAzNjQ3NCwgMzY0ODMsIDM2NDkyLCAzNjUwMSwgMzY1MTAsIDM2NTE5LCAzNjUyOCwgMzY1MzcsIDM2NTQ2LCAzNjU1NiwgMzY1NjUsIDM2NTc0LCANCisgICAgMzY1ODMsIDM2NTkyLCAzNjYwMSwgMzY2MTAsIDM2NjE5LCAzNjYyOCwgMzY2MzcsIDM2NjQ2LCAzNjY1NSwgMzY2NjQsIDM2NjczLCAzNjY4MiwgMzY2OTEsIDM2NzAxLCANCisgICAgMzY3MTEsIDM2NzIxLCAzNjczMSwgMzY3NDIsIDM2NzUzLCAzNjc2NCwgMzY3NzUsIDM2Nzg0LCAzNjc5MywgMzY4MDMsIDM2ODEzLCAzNjgyMiwgMzY4MzEsIDM2ODQ0LCANCisgICAgMzY4NTcsIDM2ODcwLCAzNjg4MywgMzY4OTcsIDM2OTExLCAzNjkyNCwgMzY5MzcsIDM2OTUwLCAzNjk2MywgMzY5NzYsIDM2OTg5LCAzNzAwMywgMzcwMTcsIDM3MDMwLCANCisgICAgMzcwNDMsIDM3MDUxLCAzNzA1OSwgMzcwNjgsIDM3MDgxLCAzNzA5MCwgMzcxMDMsIDM3MTExLCAzNzEyMywgMzcxMzEsIDM3MTQzLCAzNzE1MSwgMzcxNjMsIDM3MTcxLCANCisgICAgMzcxODMsIDM3MTkzLCAzNzIwNywgMzcyMTcsIDM3MjMxLCAzNzI0MSwgMzcyNTUsIDM3MjY1LCAzNzI3OSwgMzcyODksIDM3MzAzLCAzNzMxMywgMzczMjcsIDM3MzM3LCANCisgICAgMzczNTEsIDM3MzYxLCAzNzM3NSwgMzczODYsIDM3NDAxLCAzNzQxMiwgMzc0MjcsIDM3NDM4LCAzNzQ1MywgMzc0NjQsIDM3NDc5LCAzNzQ5MCwgMzc1MDUsIDM3NTE2LCANCisgICAgMzc1MzEsIDM3NTQxLCAzNzU1NSwgMzc1NjUsIDM3NTc5LCAzNzU4OSwgMzc2MDMsIDM3NjEzLCAzNzYyNywgMzc2MzksIDM3NjUxLCAzNzY2MiwgMzc2NzMsIDM3Njg1LCANCisgICAgMzc2OTcsIDM3NzA4LCAzNzcxOSwgMzc3MjksIDM3NzQzLCAzNzc1MywgMzc3NjcsIDM3Nzc2LCAzNzc4OSwgMzc3OTgsIDM3ODExLCAzNzgyMSwgMzc4MzUsIDM3ODQ1LCANCisgICAgMzc4NTksIDM3ODY4LCAzNzg4MSwgMzc4OTAsIDM3OTAzLCAzNzkxMiwgMzc5MjUsIDM3OTM0LCAzNzk0NywgMzc5NTYsIDM3OTY5LCAzNzk3OCwgMzc5OTEsIDM4MDAwLCANCisgICAgMzgwMTAsIDM4MDIwLCAzODAyOSwgMzgwMzgsIDM4MDQ4LCAzODA1OCwgMzgwNjcsIDM4MDc2LCAzODA4NSwgMzgwOTgsIDM4MTA3LCAzODEyMCwgMzgxMjksIDM4MTQyLCANCisgICAgMzgxNTEsIDM4MTY0LCAzODE3NSwgMzgxODYsIDM4MTk2LCAzODIwNiwgMzgyMTcsIDM4MjI4LCAzODIzOCwgMzgyNDgsIDM4MjU5LCAzODI3MCwgMzgyODEsIDM4MjkyLCANCisgICAgMzgzMDUsIDM4MzE4LCAzODMzMCwgMzgzNDIsIDM4MzU1LCAzODM2OCwgMzgzODAsIDM4MzkyLCAzODQwNSwgMzg0MTgsIDM4NDMwLCAzODQ0MiwgMzg0NTUsIDM4NDY4LCANCisgICAgMzg0ODAsIDM4NDkyLCAzODUwMiwgMzg1MTIsIDM4NTIxLCAzODUzMCwgMzg1NDAsIDM4NTUwLCAzODU1OSwgMzg1NjgsIDM4NTc3LCAzODU4OCwgMzg1OTcsIDM4NjA2LCANCisgICAgMzg2MTUsIDM4NjI4LCAzODYzMywgMzg2NDAsIDM4NjUxLCAzODY2OCwgMzg2NzksIDM4Njg1LCAzODY5NCwgMzg3MDMsIDM4NzEyLCAzODcyMSwgMzg3MzAsIDM4NzM5LCANCisgICAgMzg3NDcsIDM4NzU1LCAzODc2NCwgMzg3NzMsIDM4NzgyLCAzODc5MSwgMzg4MDAsIDM4ODA5LCAzODgxOCwgMzg4MjcsIDM4ODM2LCAzODg0NCwgMzg4NTIsIDM4ODU4LCANCisgICAgMzg4NjMsIDM4ODcyLCAzODg4MCwgMzg4ODksIDM4ODk3LCAzODkwNSwgMzg5MTQsIDM4OTIyLCAzODkzMCwgMzg5NDIsIDM4OTUxLCAzODk1OSwgMzg5NjgsIDM4OTc2LCANCisgICAgMzg5ODQsIDM4OTkzLCAzOTAwMSwgMzkwMDksIDM5MDIxLCAzOTAzMCwgMzkwNDAsIDM5MDQ5LCAzOTA1NywgMzkwNjcsIDM5MDc2LCAzOTA4NCwgMzkwOTIsIDM5MTA0LCANCisgICAgMzkxMTEsIDM5MTE4LCAzOTEyNSwgMzkxMzIsIDM5MTM5LCAzOTE0NiwgMzkxNTcsIDM5MTY1LCAzOTE3MywgMzkxODEsIDANCisgIH07DQorDQorICBjb25zdCBjaGFyICpTdHJzID0NCisgICAgIlBISVwwMDBJTkxJTkVBU01cMDAwUFJPTE9HX0xBQkVMXDAwMEVIX0xBQkVMXDAwMEdDX0xBQkVMXDAwMEtJTExcMDAwRVhUIg0KKyAgICAiUkFDVF9TVUJSRUdcMDAwSU5TRVJUX1NVQlJFR1wwMDBJTVBMSUNJVF9ERUZcMDAwU1VCUkVHX1RPX1JFR1wwMDBDT1BZX1QiDQorICAgICJPX1JFR0NMQVNTXDAwMERCR19WQUxVRVwwMDBSRUdfU0VRVUVOQ0VcMDAwQ09QWVwwMDBBQlNfRlwwMDBBQlNfRnAzMlwwMDAiDQorICAgICJBQlNfRnA2NFwwMDBBQlNfRnA4MFwwMDBBREMxNmkxNlwwMDBBREMxNm1pXDAwMEFEQzE2bWk4XDAwMEFEQzE2bXJcMDAwQSINCisgICAgIkRDMTZyaVwwMDBBREMxNnJpOFwwMDBBREMxNnJtXDAwMEFEQzE2cnJcMDAwQURDMTZycl9SRVZcMDAwQURDMzJpMzJcMDAwIg0KKyAgICAiQURDMzJtaVwwMDBBREMzMm1pOFwwMDBBREMzMm1yXDAwMEFEQzMycmlcMDAwQURDMzJyaThcMDAwQURDMzJybVwwMDBBREMiDQorICAgICIzMnJyXDAwMEFEQzMycnJfUkVWXDAwMEFEQzY0aTMyXDAwMEFEQzY0bWkzMlwwMDBBREM2NG1pOFwwMDBBREM2NG1yXDAwMCINCisgICAgIkFEQzY0cmkzMlwwMDBBREM2NHJpOFwwMDBBREM2NHJtXDAwMEFEQzY0cnJcMDAwQURDNjRycl9SRVZcMDAwQURDOGk4XDAwMCINCisgICAgIkFEQzhtaVwwMDBBREM4bXJcMDAwQURDOHJpXDAwMEFEQzhybVwwMDBBREM4cnJcMDAwQURDOHJyX1JFVlwwMDBBREQxNmkxIg0KKyAgICAiNlwwMDBBREQxNm1pXDAwMEFERDE2bWk4XDAwMEFERDE2bXJcMDAwQUREMTZyaVwwMDBBREQxNnJpOFwwMDBBREQxNnJtXDAwMCINCisgICAgIkFERDE2cnJcMDAwQUREMTZycl9hbHRcMDAwQUREMzJpMzJcMDAwQUREMzJtaVwwMDBBREQzMm1pOFwwMDBBREQzMm1yXDAwMCINCisgICAgIkFERDMycmlcMDAwQUREMzJyaThcMDAwQUREMzJybVwwMDBBREQzMnJyXDAwMEFERDMycnJfYWx0XDAwMEFERDY0aTMyXDAwMCINCisgICAgIkFERDY0bWkzMlwwMDBBREQ2NG1pOFwwMDBBREQ2NG1yXDAwMEFERDY0cmkzMlwwMDBBREQ2NHJpOFwwMDBBREQ2NHJtXDAwMCINCisgICAgIkFERDY0cnJcMDAwQURENjRycl9hbHRcMDAwQUREOGk4XDAwMEFERDhtaVwwMDBBREQ4bXJcMDAwQUREOHJpXDAwMEFERDhyIg0KKyAgICAibVwwMDBBREQ4cnJcMDAwQUREOHJyX2FsdFwwMDBBRERQRHJtXDAwMEFERFBEcnJcMDAwQUREUFNybVwwMDBBRERQU3JyXDAwMCINCisgICAgIkFERFNEcm1cMDAwQUREU0RybV9JbnRcMDAwQUREU0RyclwwMDBBRERTRHJyX0ludFwwMDBBRERTU3JtXDAwMEFERFNTcm1fIg0KKyAgICAiSW50XDAwMEFERFNTcnJcMDAwQUREU1Nycl9JbnRcMDAwQUREU1VCUERybVwwMDBBRERTVUJQRHJyXDAwMEFERFNVQlBTcm0iDQorICAgICJcMDAwQUREU1VCUFNyclwwMDBBRERfRjMybVwwMDBBRERfRjY0bVwwMDBBRERfRkkxNm1cMDAwQUREX0ZJMzJtXDAwMEFERCINCisgICAgIl9GUHJTVDBcMDAwQUREX0ZTVDByXDAwMEFERF9GcDMyXDAwMEFERF9GcDMybVwwMDBBRERfRnA2NFwwMDBBRERfRnA2NG1cMDAwIg0KKyAgICAiQUREX0ZwNjRtMzJcMDAwQUREX0ZwODBcMDAwQUREX0ZwODBtMzJcMDAwQUREX0ZwODBtNjRcMDAwQUREX0ZwSTE2bTMyXDAwMCINCisgICAgIkFERF9GcEkxNm02NFwwMDBBRERfRnBJMTZtODBcMDAwQUREX0ZwSTMybTMyXDAwMEFERF9GcEkzMm02NFwwMDBBRERfRnBJIg0KKyAgICAiMzJtODBcMDAwQUREX0ZyU1QwXDAwMEFESkNBTExTVEFDS0RPV04zMlwwMDBBREpDQUxMU1RBQ0tET1dONjRcMDAwQURKQ0EiDQorICAgICJMTFNUQUNLVVAzMlwwMDBBREpDQUxMU1RBQ0tVUDY0XDAwMEFFU0RFQ0xBU1RybVwwMDBBRVNERUNMQVNUcnJcMDAwQUVTRCINCisgICAgIkVDcm1cMDAwQUVTREVDcnJcMDAwQUVTRU5DTEFTVHJtXDAwMEFFU0VOQ0xBU1RyclwwMDBBRVNFTkNybVwwMDBBRVNFTkNyIg0KKyAgICAiclwwMDBBRVNJTUNybVwwMDBBRVNJTUNyclwwMDBBRVNLRVlHRU5BU1NJU1QxMjhybVwwMDBBRVNLRVlHRU5BU1NJU1QxMjgiDQorICAgICJyclwwMDBBTkQxNmkxNlwwMDBBTkQxNm1pXDAwMEFORDE2bWk4XDAwMEFORDE2bXJcMDAwQU5EMTZyaVwwMDBBTkQxNnJpOCINCisgICAgIlwwMDBBTkQxNnJtXDAwMEFORDE2cnJcMDAwQU5EMTZycl9SRVZcMDAwQU5EMzJpMzJcMDAwQU5EMzJtaVwwMDBBTkQzMm1pIg0KKyAgICAiOFwwMDBBTkQzMm1yXDAwMEFORDMycmlcMDAwQU5EMzJyaThcMDAwQU5EMzJybVwwMDBBTkQzMnJyXDAwMEFORDMycnJfUkUiDQorICAgICJWXDAwMEFORDY0aTMyXDAwMEFORDY0bWkzMlwwMDBBTkQ2NG1pOFwwMDBBTkQ2NG1yXDAwMEFORDY0cmkzMlwwMDBBTkQ2NCINCisgICAgInJpOFwwMDBBTkQ2NHJtXDAwMEFORDY0cnJcMDAwQU5ENjRycl9SRVZcMDAwQU5EOGk4XDAwMEFORDhtaVwwMDBBTkQ4bXJcMDAwIg0KKyAgICAiQU5EOHJpXDAwMEFORDhybVwwMDBBTkQ4cnJcMDAwQU5EOHJyX1JFVlwwMDBBTkROUERybVwwMDBBTkROUERyclwwMDBBTkQiDQorICAgICJOUFNybVwwMDBBTkROUFNyclwwMDBBTkRQRHJtXDAwMEFORFBEcnJcMDAwQU5EUFNybVwwMDBBTkRQU3JyXDAwMEFUT01BRCINCisgICAgIkQ2NDMyXDAwMEFUT01BTkQxNlwwMDBBVE9NQU5EMzJcMDAwQVRPTUFORDY0XDAwMEFUT01BTkQ2NDMyXDAwMEFUT01BTkQ4Ig0KKyAgICAiXDAwMEFUT01NQVgxNlwwMDBBVE9NTUFYMzJcMDAwQVRPTU1BWDY0XDAwMEFUT01NSU4xNlwwMDBBVE9NTUlOMzJcMDAwQVQiDQorICAgICJPTU1JTjY0XDAwMEFUT01OQU5EMTZcMDAwQVRPTU5BTkQzMlwwMDBBVE9NTkFORDY0XDAwMEFUT01OQU5ENjQzMlwwMDBBVCINCisgICAgIk9NTkFORDhcMDAwQVRPTU9SMTZcMDAwQVRPTU9SMzJcMDAwQVRPTU9SNjRcMDAwQVRPTU9SNjQzMlwwMDBBVE9NT1I4XDAwMCINCisgICAgIkFUT01TVUI2NDMyXDAwMEFUT01TV0FQNjQzMlwwMDBBVE9NVU1BWDE2XDAwMEFUT01VTUFYMzJcMDAwQVRPTVVNQVg2NFwwMDAiDQorICAgICJBVE9NVU1JTjE2XDAwMEFUT01VTUlOMzJcMDAwQVRPTVVNSU42NFwwMDBBVE9NWE9SMTZcMDAwQVRPTVhPUjMyXDAwMEFUTyINCisgICAgIk1YT1I2NFwwMDBBVE9NWE9SNjQzMlwwMDBBVE9NWE9SOFwwMDBCTEVORFBEcm1pXDAwMEJMRU5EUERycmlcMDAwQkxFTkRQIg0KKyAgICAiU3JtaVwwMDBCTEVORFBTcnJpXDAwMEJMRU5EVlBEcm0wXDAwMEJMRU5EVlBEcnIwXDAwMEJMRU5EVlBTcm0wXDAwMEJMRU4iDQorICAgICJEVlBTcnIwXDAwMEJTRjE2cm1cMDAwQlNGMTZyclwwMDBCU0YzMnJtXDAwMEJTRjMycnJcMDAwQlNGNjRybVwwMDBCU0Y2NCINCisgICAgInJyXDAwMEJTUjE2cm1cMDAwQlNSMTZyclwwMDBCU1IzMnJtXDAwMEJTUjMycnJcMDAwQlNSNjRybVwwMDBCU1I2NHJyXDAwMCINCisgICAgIkJTV0FQMzJyXDAwMEJTV0FQNjRyXDAwMEJUMTZtaThcMDAwQlQxNm1yXDAwMEJUMTZyaThcMDAwQlQxNnJyXDAwMEJUMzJtIg0KKyAgICAiaThcMDAwQlQzMm1yXDAwMEJUMzJyaThcMDAwQlQzMnJyXDAwMEJUNjRtaThcMDAwQlQ2NG1yXDAwMEJUNjRyaThcMDAwQlQiDQorICAgICI2NHJyXDAwMEJUQzE2bWk4XDAwMEJUQzE2bXJcMDAwQlRDMTZyaThcMDAwQlRDMTZyclwwMDBCVEMzMm1pOFwwMDBCVEMzMiINCisgICAgIm1yXDAwMEJUQzMycmk4XDAwMEJUQzMycnJcMDAwQlRDNjRtaThcMDAwQlRDNjRtclwwMDBCVEM2NHJpOFwwMDBCVEM2NHJyIg0KKyAgICAiXDAwMEJUUjE2bWk4XDAwMEJUUjE2bXJcMDAwQlRSMTZyaThcMDAwQlRSMTZyclwwMDBCVFIzMm1pOFwwMDBCVFIzMm1yXDAwMCINCisgICAgIkJUUjMycmk4XDAwMEJUUjMycnJcMDAwQlRSNjRtaThcMDAwQlRSNjRtclwwMDBCVFI2NHJpOFwwMDBCVFI2NHJyXDAwMEJUIg0KKyAgICAiUzE2bWk4XDAwMEJUUzE2bXJcMDAwQlRTMTZyaThcMDAwQlRTMTZyclwwMDBCVFMzMm1pOFwwMDBCVFMzMm1yXDAwMEJUUzMiDQorICAgICIycmk4XDAwMEJUUzMycnJcMDAwQlRTNjRtaThcMDAwQlRTNjRtclwwMDBCVFM2NHJpOFwwMDBCVFM2NHJyXDAwMENBTEwzMiINCisgICAgIm1cMDAwQ0FMTDMyclwwMDBDQUxMNjRtXDAwMENBTEw2NHBjcmVsMzJcMDAwQ0FMTDY0clwwMDBDQUxMcGNyZWwxNlwwMDBDIg0KKyAgICAiQUxMcGNyZWwzMlwwMDBDQldcMDAwQ0RRXDAwMENEUUVcMDAwQ0hTX0ZcMDAwQ0hTX0ZwMzJcMDAwQ0hTX0ZwNjRcMDAwQ0giDQorICAgICJTX0ZwODBcMDAwQ0xDXDAwMENMRFwwMDBDTEZMVVNIXDAwMENMSVwwMDBDTFRTXDAwMENNQ1wwMDBDTU9WQTE2cm1cMDAwQyINCisgICAgIk1PVkExNnJyXDAwMENNT1ZBMzJybVwwMDBDTU9WQTMycnJcMDAwQ01PVkE2NHJtXDAwMENNT1ZBNjRyclwwMDBDTU9WQUUxIg0KKyAgICAiNnJtXDAwMENNT1ZBRTE2cnJcMDAwQ01PVkFFMzJybVwwMDBDTU9WQUUzMnJyXDAwMENNT1ZBRTY0cm1cMDAwQ01PVkFFNjQiDQorICAgICJyclwwMDBDTU9WQjE2cm1cMDAwQ01PVkIxNnJyXDAwMENNT1ZCMzJybVwwMDBDTU9WQjMycnJcMDAwQ01PVkI2NHJtXDAwMCINCisgICAgIkNNT1ZCNjRyclwwMDBDTU9WQkUxNnJtXDAwMENNT1ZCRTE2cnJcMDAwQ01PVkJFMzJybVwwMDBDTU9WQkUzMnJyXDAwMENNIg0KKyAgICAiT1ZCRTY0cm1cMDAwQ01PVkJFNjRyclwwMDBDTU9WQkVfRlwwMDBDTU9WQkVfRnAzMlwwMDBDTU9WQkVfRnA2NFwwMDBDTU8iDQorICAgICJWQkVfRnA4MFwwMDBDTU9WQl9GXDAwMENNT1ZCX0ZwMzJcMDAwQ01PVkJfRnA2NFwwMDBDTU9WQl9GcDgwXDAwMENNT1ZFMSINCisgICAgIjZybVwwMDBDTU9WRTE2cnJcMDAwQ01PVkUzMnJtXDAwMENNT1ZFMzJyclwwMDBDTU9WRTY0cm1cMDAwQ01PVkU2NHJyXDAwMCINCisgICAgIkNNT1ZFX0ZcMDAwQ01PVkVfRnAzMlwwMDBDTU9WRV9GcDY0XDAwMENNT1ZFX0ZwODBcMDAwQ01PVkcxNnJtXDAwMENNT1ZHIg0KKyAgICAiMTZyclwwMDBDTU9WRzMycm1cMDAwQ01PVkczMnJyXDAwMENNT1ZHNjRybVwwMDBDTU9WRzY0cnJcMDAwQ01PVkdFMTZybVwwMDAiDQorICAgICJDTU9WR0UxNnJyXDAwMENNT1ZHRTMycm1cMDAwQ01PVkdFMzJyclwwMDBDTU9WR0U2NHJtXDAwMENNT1ZHRTY0cnJcMDAwQyINCisgICAgIk1PVkwxNnJtXDAwMENNT1ZMMTZyclwwMDBDTU9WTDMycm1cMDAwQ01PVkwzMnJyXDAwMENNT1ZMNjRybVwwMDBDTU9WTDY0Ig0KKyAgICAicnJcMDAwQ01PVkxFMTZybVwwMDBDTU9WTEUxNnJyXDAwMENNT1ZMRTMycm1cMDAwQ01PVkxFMzJyclwwMDBDTU9WTEU2NHIiDQorICAgICJtXDAwMENNT1ZMRTY0cnJcMDAwQ01PVk5CRV9GXDAwMENNT1ZOQkVfRnAzMlwwMDBDTU9WTkJFX0ZwNjRcMDAwQ01PVk5CRSINCisgICAgIl9GcDgwXDAwMENNT1ZOQl9GXDAwMENNT1ZOQl9GcDMyXDAwMENNT1ZOQl9GcDY0XDAwMENNT1ZOQl9GcDgwXDAwMENNT1ZOIg0KKyAgICAiRTE2cm1cMDAwQ01PVk5FMTZyclwwMDBDTU9WTkUzMnJtXDAwMENNT1ZORTMycnJcMDAwQ01PVk5FNjRybVwwMDBDTU9WTkUiDQorICAgICI2NHJyXDAwMENNT1ZORV9GXDAwMENNT1ZORV9GcDMyXDAwMENNT1ZORV9GcDY0XDAwMENNT1ZORV9GcDgwXDAwMENNT1ZOTyINCisgICAgIjE2cm1cMDAwQ01PVk5PMTZyclwwMDBDTU9WTk8zMnJtXDAwMENNT1ZOTzMycnJcMDAwQ01PVk5PNjRybVwwMDBDTU9WTk82Ig0KKyAgICAiNHJyXDAwMENNT1ZOUDE2cm1cMDAwQ01PVk5QMTZyclwwMDBDTU9WTlAzMnJtXDAwMENNT1ZOUDMycnJcMDAwQ01PVk5QNjQiDQorICAgICJybVwwMDBDTU9WTlA2NHJyXDAwMENNT1ZOUF9GXDAwMENNT1ZOUF9GcDMyXDAwMENNT1ZOUF9GcDY0XDAwMENNT1ZOUF9GcCINCisgICAgIjgwXDAwMENNT1ZOUzE2cm1cMDAwQ01PVk5TMTZyclwwMDBDTU9WTlMzMnJtXDAwMENNT1ZOUzMycnJcMDAwQ01PVk5TNjRyIg0KKyAgICAibVwwMDBDTU9WTlM2NHJyXDAwMENNT1ZPMTZybVwwMDBDTU9WTzE2cnJcMDAwQ01PVk8zMnJtXDAwMENNT1ZPMzJyclwwMDAiDQorICAgICJDTU9WTzY0cm1cMDAwQ01PVk82NHJyXDAwMENNT1ZQMTZybVwwMDBDTU9WUDE2cnJcMDAwQ01PVlAzMnJtXDAwMENNT1ZQMyINCisgICAgIjJyclwwMDBDTU9WUDY0cm1cMDAwQ01PVlA2NHJyXDAwMENNT1ZQX0ZcMDAwQ01PVlBfRnAzMlwwMDBDTU9WUF9GcDY0XDAwMCINCisgICAgIkNNT1ZQX0ZwODBcMDAwQ01PVlMxNnJtXDAwMENNT1ZTMTZyclwwMDBDTU9WUzMycm1cMDAwQ01PVlMzMnJyXDAwMENNT1ZTIg0KKyAgICAiNjRybVwwMDBDTU9WUzY0cnJcMDAwQ01PVl9GUjMyXDAwMENNT1ZfRlI2NFwwMDBDTU9WX0dSMTZcMDAwQ01PVl9HUjMyXDAwMCINCisgICAgIkNNT1ZfR1I4XDAwMENNT1ZfUkZQMzJcMDAwQ01PVl9SRlA2NFwwMDBDTU9WX1JGUDgwXDAwMENNT1ZfVjFJNjRcMDAwQ01PIg0KKyAgICAiVl9WMkY2NFwwMDBDTU9WX1YySTY0XDAwMENNT1ZfVjRGMzJcMDAwQ01QMTZpMTZcMDAwQ01QMTZtaVwwMDBDTVAxNm1pOFwwMDAiDQorICAgICJDTVAxNm1yXDAwMENNUDE2cmlcMDAwQ01QMTZyaThcMDAwQ01QMTZybVwwMDBDTVAxNnJyXDAwMENNUDE2cnJfYWx0XDAwMCINCisgICAgIkNNUDMyaTMyXDAwMENNUDMybWlcMDAwQ01QMzJtaThcMDAwQ01QMzJtclwwMDBDTVAzMnJpXDAwMENNUDMycmk4XDAwMENNIg0KKyAgICAiUDMycm1cMDAwQ01QMzJyclwwMDBDTVAzMnJyX2FsdFwwMDBDTVA2NGkzMlwwMDBDTVA2NG1pMzJcMDAwQ01QNjRtaThcMDAwIg0KKyAgICAiQ01QNjRtclwwMDBDTVA2NG1ybXJyXDAwMENNUDY0cmkzMlwwMDBDTVA2NHJpOFwwMDBDTVA2NHJtXDAwMENNUDY0cnJcMDAwIg0KKyAgICAiQ01QOGk4XDAwMENNUDhtaVwwMDBDTVA4bXJcMDAwQ01QOHJpXDAwMENNUDhybVwwMDBDTVA4cnJcMDAwQ01QOHJyX2FsdFwwMDAiDQorICAgICJDTVBQRHJtaVwwMDBDTVBQRHJtaV9hbHRcMDAwQ01QUERycmlcMDAwQ01QUERycmlfYWx0XDAwMENNUFBTcm1pXDAwMENNUCINCisgICAgIlBTcm1pX2FsdFwwMDBDTVBQU3JyaVwwMDBDTVBQU3JyaV9hbHRcMDAwQ01QUzE2XDAwMENNUFMzMlwwMDBDTVBTNjRcMDAwIg0KKyAgICAiQ01QUzhcMDAwQ01QU0RybVwwMDBDTVBTRHJtX2FsdFwwMDBDTVBTRHJyXDAwMENNUFNEcnJfYWx0XDAwMENNUFNTcm1cMDAwIg0KKyAgICAiQ01QU1NybV9hbHRcMDAwQ01QU1NyclwwMDBDTVBTU3JyX2FsdFwwMDBDTVBYQ0hHMTZCXDAwMENNUFhDSEcxNnJtXDAwMEMiDQorICAgICJNUFhDSEcxNnJyXDAwMENNUFhDSEczMnJtXDAwMENNUFhDSEczMnJyXDAwMENNUFhDSEc2NHJtXDAwMENNUFhDSEc2NHJyXDAwMCINCisgICAgIkNNUFhDSEc4QlwwMDBDTVBYQ0hHOHJtXDAwMENNUFhDSEc4cnJcMDAwQ09NSVNEcm1cMDAwQ09NSVNEcnJcMDAwQ09NSVNTIg0KKyAgICAicm1cMDAwQ09NSVNTcnJcMDAwQ09NUF9GU1QwclwwMDBDT01fRklQclwwMDBDT01fRklyXDAwMENPTV9GU1QwclwwMDBDT1MiDQorICAgICJfRlwwMDBDT1NfRnAzMlwwMDBDT1NfRnA2NFwwMDBDT1NfRnA4MFwwMDBDUFVJRFwwMDBDUU9cMDAwQ1JDMzJtMTZcMDAwQyINCisgICAgIlJDMzJtMzJcMDAwQ1JDMzJtOFwwMDBDUkMzMnIxNlwwMDBDUkMzMnIzMlwwMDBDUkMzMnI4XDAwMENSQzY0bTY0XDAwMENSIg0KKyAgICAiQzY0bThcMDAwQ1JDNjRyNjRcMDAwQ1JDNjRyOFwwMDBDU19QUkVGSVhcMDAwQ1ZURFEyUERybVwwMDBDVlREUTJQRHJyXDAwMCINCisgICAgIkNWVERRMlBTcm1cMDAwQ1ZURFEyUFNyclwwMDBDVlRQRDJEUXJtXDAwMENWVFBEMkRRcnJcMDAwQ1ZUUEQyUFNybVwwMDBDIg0KKyAgICAiVlRQRDJQU3JyXDAwMENWVFBTMkRRcm1cMDAwQ1ZUUFMyRFFyclwwMDBDVlRQUzJQRHJtXDAwMENWVFBTMlBEcnJcMDAwQ1YiDQorICAgICJUU0QyU0k2NHJtXDAwMENWVFNEMlNJNjRyclwwMDBDVlRTRDJTU3JtXDAwMENWVFNEMlNTcnJcMDAwQ1ZUU0kyU0Q2NHJtXDAwMCINCisgICAgIkNWVFNJMlNENjRyclwwMDBDVlRTSTJTRHJtXDAwMENWVFNJMlNEcnJcMDAwQ1ZUU0kyU1M2NHJtXDAwMENWVFNJMlNTNjRyIg0KKyAgICAiclwwMDBDVlRTSTJTU3JtXDAwMENWVFNJMlNTcnJcMDAwQ1ZUU1MyU0RybVwwMDBDVlRTUzJTRHJyXDAwMENWVFNTMlNJNjQiDQorICAgICJybVwwMDBDVlRTUzJTSTY0cnJcMDAwQ1ZUU1MyU0lybVwwMDBDVlRTUzJTSXJyXDAwMENWVFRQUzJEUXJtXDAwMENWVFRQUyINCisgICAgIjJEUXJyXDAwMENWVFRTRDJTSTY0cm1cMDAwQ1ZUVFNEMlNJNjRyclwwMDBDVlRUU0QyU0lybVwwMDBDVlRUU0QyU0lyclwwMDAiDQorICAgICJDVlRUU1MyU0k2NHJtXDAwMENWVFRTUzJTSTY0cnJcMDAwQ1ZUVFNTMlNJcm1cMDAwQ1ZUVFNTMlNJcnJcMDAwQ1dEXDAwMCINCisgICAgIkNXREVcMDAwREVDMTZtXDAwMERFQzE2clwwMDBERUMzMm1cMDAwREVDMzJyXDAwMERFQzY0XzE2bVwwMDBERUM2NF8xNnJcMDAwIg0KKyAgICAiREVDNjRfMzJtXDAwMERFQzY0XzMyclwwMDBERUM2NG1cMDAwREVDNjRyXDAwMERFQzhtXDAwMERFQzhyXDAwMERJVjE2bVwwMDAiDQorICAgICJESVYxNnJcMDAwRElWMzJtXDAwMERJVjMyclwwMDBESVY2NG1cMDAwRElWNjRyXDAwMERJVjhtXDAwMERJVjhyXDAwMERJViINCisgICAgIlBEcm1cMDAwRElWUERyclwwMDBESVZQU3JtXDAwMERJVlBTcnJcMDAwRElWUl9GMzJtXDAwMERJVlJfRjY0bVwwMDBESVZSIg0KKyAgICAiX0ZJMTZtXDAwMERJVlJfRkkzMm1cMDAwRElWUl9GUHJTVDBcMDAwRElWUl9GU1QwclwwMDBESVZSX0ZwMzJtXDAwMERJVlIiDQorICAgICJfRnA2NG1cMDAwRElWUl9GcDY0bTMyXDAwMERJVlJfRnA4MG0zMlwwMDBESVZSX0ZwODBtNjRcMDAwRElWUl9GcEkxNm0zMiINCisgICAgIlwwMDBESVZSX0ZwSTE2bTY0XDAwMERJVlJfRnBJMTZtODBcMDAwRElWUl9GcEkzMm0zMlwwMDBESVZSX0ZwSTMybTY0XDAwMCINCisgICAgIkRJVlJfRnBJMzJtODBcMDAwRElWUl9GclNUMFwwMDBESVZTRHJtXDAwMERJVlNEcm1fSW50XDAwMERJVlNEcnJcMDAwRElWIg0KKyAgICAiU0Rycl9JbnRcMDAwRElWU1NybVwwMDBESVZTU3JtX0ludFwwMDBESVZTU3JyXDAwMERJVlNTcnJfSW50XDAwMERJVl9GMzIiDQorICAgICJtXDAwMERJVl9GNjRtXDAwMERJVl9GSTE2bVwwMDBESVZfRkkzMm1cMDAwRElWX0ZQclNUMFwwMDBESVZfRlNUMHJcMDAwRCINCisgICAgIklWX0ZwMzJcMDAwRElWX0ZwMzJtXDAwMERJVl9GcDY0XDAwMERJVl9GcDY0bVwwMDBESVZfRnA2NG0zMlwwMDBESVZfRnA4Ig0KKyAgICAiMFwwMDBESVZfRnA4MG0zMlwwMDBESVZfRnA4MG02NFwwMDBESVZfRnBJMTZtMzJcMDAwRElWX0ZwSTE2bTY0XDAwMERJVl8iDQorICAgICJGcEkxNm04MFwwMDBESVZfRnBJMzJtMzJcMDAwRElWX0ZwSTMybTY0XDAwMERJVl9GcEkzMm04MFwwMDBESVZfRnJTVDBcMDAwIg0KKyAgICAiRFBQRHJtaVwwMDBEUFBEcnJpXDAwMERQUFNybWlcMDAwRFBQU3JyaVwwMDBEU19QUkVGSVhcMDAwRUhfUkVUVVJOXDAwMEUiDQorICAgICJIX1JFVFVSTjY0XDAwMEVOVEVSXDAwMEVTX1BSRUZJWFwwMDBFWFRSQUNUUFNtclwwMDBFWFRSQUNUUFNyclwwMDBGMlhNMSINCisgICAgIlwwMDBGQVJDQUxMMTZpXDAwMEZBUkNBTEwxNm1cMDAwRkFSQ0FMTDMyaVwwMDBGQVJDQUxMMzJtXDAwMEZBUkNBTEw2NFwwMDAiDQorICAgICJGQVJKTVAxNmlcMDAwRkFSSk1QMTZtXDAwMEZBUkpNUDMyaVwwMDBGQVJKTVAzMm1cMDAwRkFSSk1QNjRcMDAwRkJMRG1cMDAwIg0KKyAgICAiRkJTVFBtXDAwMEZDT00zMm1cMDAwRkNPTTY0bVwwMDBGQ09NUDMybVwwMDBGQ09NUDY0bVwwMDBGQ09NUFBcMDAwRkRFQ1MiDQorICAgICJUUFwwMDBGRlJFRVwwMDBGSUNPTTE2bVwwMDBGSUNPTTMybVwwMDBGSUNPTVAxNm1cMDAwRklDT01QMzJtXDAwMEZJTkNTVCINCisgICAgIlBcMDAwRkxEQ1cxNm1cMDAwRkxERU5WbVwwMDBGTERMMkVcMDAwRkxETDJUXDAwMEZMRExHMlwwMDBGTERMTjJcMDAwRkxEIg0KKyAgICAiUElcMDAwRk5DTEVYXDAwMEZOSU5JVFwwMDBGTk9QXDAwMEZOU1RDVzE2bVwwMDBGTlNUU1c4clwwMDBGTlNUU1dtXDAwMEYiDQorICAgICJQMzJfVE9fSU5UMTZfSU5fTUVNXDAwMEZQMzJfVE9fSU5UMzJfSU5fTUVNXDAwMEZQMzJfVE9fSU5UNjRfSU5fTUVNXDAwMCINCisgICAgIkZQNjRfVE9fSU5UMTZfSU5fTUVNXDAwMEZQNjRfVE9fSU5UMzJfSU5fTUVNXDAwMEZQNjRfVE9fSU5UNjRfSU5fTUVNXDAwMCINCisgICAgIkZQODBfVE9fSU5UMTZfSU5fTUVNXDAwMEZQODBfVE9fSU5UMzJfSU5fTUVNXDAwMEZQODBfVE9fSU5UNjRfSU5fTUVNXDAwMCINCisgICAgIkZQQVRBTlwwMDBGUFJFTVwwMDBGUFJFTTFcMDAwRlBUQU5cMDAwRlJORElOVFwwMDBGUlNUT1JtXDAwMEZTQVZFbVwwMDBGIg0KKyAgICAiU0NBTEVcMDAwRlNJTkNPU1wwMDBGU1RFTlZtXDAwMEZTX01PVjMycm1cMDAwRlNfUFJFRklYXDAwMEZYQU1cMDAwRlhSU1QiDQorICAgICJPUlwwMDBGWFNBVkVcMDAwRlhUUkFDVFwwMDBGWUwyWFwwMDBGWUwyWFAxXDAwMEZwR0VUX1NUMF8zMlwwMDBGcEdFVF9TVCINCisgICAgIjBfNjRcMDAwRnBHRVRfU1QwXzgwXDAwMEZwR0VUX1NUMV8zMlwwMDBGcEdFVF9TVDFfNjRcMDAwRnBHRVRfU1QxXzgwXDAwMCINCisgICAgIkZwU0VUX1NUMF8zMlwwMDBGcFNFVF9TVDBfNjRcMDAwRnBTRVRfU1QwXzgwXDAwMEZwU0VUX1NUMV8zMlwwMDBGcFNFVF9TIg0KKyAgICAiVDFfNjRcMDAwRnBTRVRfU1QxXzgwXDAwMEZzQU5ETlBEcm1cMDAwRnNBTkROUERyclwwMDBGc0FORE5QU3JtXDAwMEZzQU4iDQorICAgICJETlBTcnJcMDAwRnNBTkRQRHJtXDAwMEZzQU5EUERyclwwMDBGc0FORFBTcm1cMDAwRnNBTkRQU3JyXDAwMEZzRkxEMFNEXDAwMCINCisgICAgIkZzRkxEMFNTXDAwMEZzTU9WQVBEcm1cMDAwRnNNT1ZBUERyclwwMDBGc01PVkFQU3JtXDAwMEZzTU9WQVBTcnJcMDAwRnNPIg0KKyAgICAiUlBEcm1cMDAwRnNPUlBEcnJcMDAwRnNPUlBTcm1cMDAwRnNPUlBTcnJcMDAwRnNYT1JQRHJtXDAwMEZzWE9SUERyclwwMDAiDQorICAgICJGc1hPUlBTcm1cMDAwRnNYT1JQU3JyXDAwMEdTX01PVjMycm1cMDAwR1NfUFJFRklYXDAwMEhBRERQRHJtXDAwMEhBRERQRCINCisgICAgInJyXDAwMEhBRERQU3JtXDAwMEhBRERQU3JyXDAwMEhMVFwwMDBIU1VCUERybVwwMDBIU1VCUERyclwwMDBIU1VCUFNybVwwMDAiDQorICAgICJIU1VCUFNyclwwMDBJRElWMTZtXDAwMElESVYxNnJcMDAwSURJVjMybVwwMDBJRElWMzJyXDAwMElESVY2NG1cMDAwSURJViINCisgICAgIjY0clwwMDBJRElWOG1cMDAwSURJVjhyXDAwMElMRF9GMTZtXDAwMElMRF9GMzJtXDAwMElMRF9GNjRtXDAwMElMRF9GcDE2Ig0KKyAgICAibTMyXDAwMElMRF9GcDE2bTY0XDAwMElMRF9GcDE2bTgwXDAwMElMRF9GcDMybTMyXDAwMElMRF9GcDMybTY0XDAwMElMRF8iDQorICAgICJGcDMybTgwXDAwMElMRF9GcDY0bTMyXDAwMElMRF9GcDY0bTY0XDAwMElMRF9GcDY0bTgwXDAwMElNVUwxNm1cMDAwSU1VTCINCisgICAgIjE2clwwMDBJTVVMMTZybVwwMDBJTVVMMTZybWlcMDAwSU1VTDE2cm1pOFwwMDBJTVVMMTZyclwwMDBJTVVMMTZycmlcMDAwIg0KKyAgICAiSU1VTDE2cnJpOFwwMDBJTVVMMzJtXDAwMElNVUwzMnJcMDAwSU1VTDMycm1cMDAwSU1VTDMycm1pXDAwMElNVUwzMnJtaTgiDQorICAgICJcMDAwSU1VTDMycnJcMDAwSU1VTDMycnJpXDAwMElNVUwzMnJyaThcMDAwSU1VTDY0bVwwMDBJTVVMNjRyXDAwMElNVUw2NCINCisgICAgInJtXDAwMElNVUw2NHJtaTMyXDAwMElNVUw2NHJtaThcMDAwSU1VTDY0cnJcMDAwSU1VTDY0cnJpMzJcMDAwSU1VTDY0cnJpIg0KKyAgICAiOFwwMDBJTVVMOG1cMDAwSU1VTDhyXDAwMElOMTZcMDAwSU4xNnJpXDAwMElOMTZyclwwMDBJTjMyXDAwMElOMzJyaVwwMDAiDQorICAgICJJTjMycnJcMDAwSU44XDAwMElOOHJpXDAwMElOOHJyXDAwMElOQzE2bVwwMDBJTkMxNnJcMDAwSU5DMzJtXDAwMElOQzMyciINCisgICAgIlwwMDBJTkM2NF8xNm1cMDAwSU5DNjRfMTZyXDAwMElOQzY0XzMybVwwMDBJTkM2NF8zMnJcMDAwSU5DNjRtXDAwMElOQzY0Ig0KKyAgICAiclwwMDBJTkM4bVwwMDBJTkM4clwwMDBJTlNFUlRQU3JtXDAwMElOU0VSVFBTcnJcMDAwSU5UXDAwMElOVDNcMDAwSU5UT1wwMDAiDQorICAgICJJTlZEXDAwMElOVkVQVFwwMDBJTlZMUEdcMDAwSU5WVlBJRFwwMDBJUkVUMTZcMDAwSVJFVDMyXDAwMElSRVQ2NFwwMDBJUyINCisgICAgIlRUX0ZQMTZtXDAwMElTVFRfRlAzMm1cMDAwSVNUVF9GUDY0bVwwMDBJU1RUX0ZwMTZtMzJcMDAwSVNUVF9GcDE2bTY0XDAwMCINCisgICAgIklTVFRfRnAxNm04MFwwMDBJU1RUX0ZwMzJtMzJcMDAwSVNUVF9GcDMybTY0XDAwMElTVFRfRnAzMm04MFwwMDBJU1RUX0ZwIg0KKyAgICAiNjRtMzJcMDAwSVNUVF9GcDY0bTY0XDAwMElTVFRfRnA2NG04MFwwMDBJU1RfRjE2bVwwMDBJU1RfRjMybVwwMDBJU1RfRlAiDQorICAgICIxNm1cMDAwSVNUX0ZQMzJtXDAwMElTVF9GUDY0bVwwMDBJU1RfRnAxNm0zMlwwMDBJU1RfRnAxNm02NFwwMDBJU1RfRnAxNiINCisgICAgIm04MFwwMDBJU1RfRnAzMm0zMlwwMDBJU1RfRnAzMm02NFwwMDBJU1RfRnAzMm04MFwwMDBJU1RfRnA2NG0zMlwwMDBJU1RfIg0KKyAgICAiRnA2NG02NFwwMDBJU1RfRnA2NG04MFwwMDBJbnRfQ01QU0RybVwwMDBJbnRfQ01QU0RyclwwMDBJbnRfQ01QU1NybVwwMDAiDQorICAgICJJbnRfQ01QU1NyclwwMDBJbnRfQ09NSVNEcm1cMDAwSW50X0NPTUlTRHJyXDAwMEludF9DT01JU1NybVwwMDBJbnRfQ09NSSINCisgICAgIlNTcnJcMDAwSW50X0NWVERRMlBEcm1cMDAwSW50X0NWVERRMlBEcnJcMDAwSW50X0NWVERRMlBTcm1cMDAwSW50X0NWVERRIg0KKyAgICAiMlBTcnJcMDAwSW50X0NWVFBEMkRRcm1cMDAwSW50X0NWVFBEMkRRcnJcMDAwSW50X0NWVFBEMlBJcm1cMDAwSW50X0NWVFAiDQorICAgICJEMlBJcnJcMDAwSW50X0NWVFBEMlBTcm1cMDAwSW50X0NWVFBEMlBTcnJcMDAwSW50X0NWVFBJMlBEcm1cMDAwSW50X0NWVCINCisgICAgIlBJMlBEcnJcMDAwSW50X0NWVFBJMlBTcm1cMDAwSW50X0NWVFBJMlBTcnJcMDAwSW50X0NWVFBTMkRRcm1cMDAwSW50X0NWIg0KKyAgICAiVFBTMkRRcnJcMDAwSW50X0NWVFBTMlBEcm1cMDAwSW50X0NWVFBTMlBEcnJcMDAwSW50X0NWVFBTMlBJcm1cMDAwSW50X0MiDQorICAgICJWVFBTMlBJcnJcMDAwSW50X0NWVFNEMlNJNjRybVwwMDBJbnRfQ1ZUU0QyU0k2NHJyXDAwMEludF9DVlRTRDJTSXJtXDAwMCINCisgICAgIkludF9DVlRTRDJTSXJyXDAwMEludF9DVlRTRDJTU3JtXDAwMEludF9DVlRTRDJTU3JyXDAwMEludF9DVlRTSTJTRDY0cm1cMDAwIg0KKyAgICAiSW50X0NWVFNJMlNENjRyclwwMDBJbnRfQ1ZUU0kyU0RybVwwMDBJbnRfQ1ZUU0kyU0RyclwwMDBJbnRfQ1ZUU0kyU1M2NHIiDQorICAgICJtXDAwMEludF9DVlRTSTJTUzY0cnJcMDAwSW50X0NWVFNJMlNTcm1cMDAwSW50X0NWVFNJMlNTcnJcMDAwSW50X0NWVFNTMiINCisgICAgIlNEcm1cMDAwSW50X0NWVFNTMlNEcnJcMDAwSW50X0NWVFNTMlNJNjRybVwwMDBJbnRfQ1ZUU1MyU0k2NHJyXDAwMEludF9DIg0KKyAgICAiVlRTUzJTSXJtXDAwMEludF9DVlRTUzJTSXJyXDAwMEludF9DVlRUUEQyRFFybVwwMDBJbnRfQ1ZUVFBEMkRRcnJcMDAwSW4iDQorICAgICJ0X0NWVFRQRDJQSXJtXDAwMEludF9DVlRUUEQyUElyclwwMDBJbnRfQ1ZUVFBTMkRRcm1cMDAwSW50X0NWVFRQUzJEUXJyXDAwMCINCisgICAgIkludF9DVlRUUFMyUElybVwwMDBJbnRfQ1ZUVFBTMlBJcnJcMDAwSW50X0NWVFRTRDJTSTY0cm1cMDAwSW50X0NWVFRTRDJTIg0KKyAgICAiSTY0cnJcMDAwSW50X0NWVFRTRDJTSXJtXDAwMEludF9DVlRUU0QyU0lyclwwMDBJbnRfQ1ZUVFNTMlNJNjRybVwwMDBJbnQiDQorICAgICJfQ1ZUVFNTMlNJNjRyclwwMDBJbnRfQ1ZUVFNTMlNJcm1cMDAwSW50X0NWVFRTUzJTSXJyXDAwMEludF9NZW1CYXJyaWVyXDAwMCINCisgICAgIkludF9NZW1CYXJyaWVyTm9TU0VcMDAwSW50X01lbUJhcnJpZXJOb1NTRTY0XDAwMEludF9VQ09NSVNEcm1cMDAwSW50X1VDIg0KKyAgICAiT01JU0RyclwwMDBJbnRfVUNPTUlTU3JtXDAwMEludF9VQ09NSVNTcnJcMDAwSW50X1ZDTVBTRHJtXDAwMEludF9WQ01QU0QiDQorICAgICJyclwwMDBJbnRfVkNNUFNTcm1cMDAwSW50X1ZDTVBTU3JyXDAwMEludF9WQ09NSVNEcm1cMDAwSW50X1ZDT01JU0RyclwwMDAiDQorICAgICJJbnRfVkNPTUlTU3JtXDAwMEludF9WQ09NSVNTcnJcMDAwSW50X1ZDVlREUTJQRHJtXDAwMEludF9WQ1ZURFEyUERyclwwMDAiDQorICAgICJJbnRfVkNWVERRMlBTcm1cMDAwSW50X1ZDVlREUTJQU3JyXDAwMEludF9WQ1ZUUEQyRFFybVwwMDBJbnRfVkNWVFBEMkRRciINCisgICAgInJcMDAwSW50X1ZDVlRQRDJQU3JtXDAwMEludF9WQ1ZUUEQyUFNyclwwMDBJbnRfVkNWVFBTMkRRcm1cMDAwSW50X1ZDVlRQIg0KKyAgICAiUzJEUXJyXDAwMEludF9WQ1ZUUFMyUERybVwwMDBJbnRfVkNWVFBTMlBEcnJcMDAwSW50X1ZDVlRTRDJTSTY0cm1cMDAwSW4iDQorICAgICJ0X1ZDVlRTRDJTSTY0cnJcMDAwSW50X1ZDVlRTRDJTSXJtXDAwMEludF9WQ1ZUU0QyU0lyclwwMDBJbnRfVkNWVFNEMlNTciINCisgICAgIm1cMDAwSW50X1ZDVlRTRDJTU3JyXDAwMEludF9WQ1ZUU0kyU0Q2NHJtXDAwMEludF9WQ1ZUU0kyU0Q2NHJyXDAwMEludF9WIg0KKyAgICAiQ1ZUU0kyU0RybVwwMDBJbnRfVkNWVFNJMlNEcnJcMDAwSW50X1ZDVlRTSTJTUzY0cm1cMDAwSW50X1ZDVlRTSTJTUzY0cnIiDQorICAgICJcMDAwSW50X1ZDVlRTSTJTU3JtXDAwMEludF9WQ1ZUU0kyU1NyclwwMDBJbnRfVkNWVFNTMlNEcm1cMDAwSW50X1ZDVlRTUyINCisgICAgIjJTRHJyXDAwMEludF9WQ1ZUU1MyU0k2NHJtXDAwMEludF9WQ1ZUU1MyU0k2NHJyXDAwMEludF9WQ1ZUU1MyU0lybVwwMDBJIg0KKyAgICAibnRfVkNWVFNTMlNJcnJcMDAwSW50X1ZDVlRUUEQyRFFybVwwMDBJbnRfVkNWVFRQRDJEUXJyXDAwMEludF9WQ1ZUVFBTMkQiDQorICAgICJRcm1cMDAwSW50X1ZDVlRUUFMyRFFyclwwMDBJbnRfVkNWVFRTRDJTSTY0cm1cMDAwSW50X1ZDVlRUU0QyU0k2NHJyXDAwMCINCisgICAgIkludF9WQ1ZUVFNEMlNJcm1cMDAwSW50X1ZDVlRUU0QyU0lyclwwMDBJbnRfVkNWVFRTUzJTSTY0cm1cMDAwSW50X1ZDVlRUIg0KKyAgICAiU1MyU0k2NHJyXDAwMEludF9WQ1ZUVFNTMlNJcm1cMDAwSW50X1ZDVlRUU1MyU0lyclwwMDBJbnRfVlVDT01JU0RybVwwMDAiDQorICAgICJJbnRfVlVDT01JU0RyclwwMDBJbnRfVlVDT01JU1NybVwwMDBJbnRfVlVDT01JU1NyclwwMDBKQUVfMVwwMDBKQUVfNFwwMDAiDQorICAgICJKQV8xXDAwMEpBXzRcMDAwSkJFXzFcMDAwSkJFXzRcMDAwSkJfMVwwMDBKQl80XDAwMEpDWFo4XDAwMEpFXzFcMDAwSkVfNCINCisgICAgIlwwMDBKR0VfMVwwMDBKR0VfNFwwMDBKR18xXDAwMEpHXzRcMDAwSkxFXzFcMDAwSkxFXzRcMDAwSkxfMVwwMDBKTF80XDAwMCINCisgICAgIkpNUDMybVwwMDBKTVAzMnJcMDAwSk1QNjRtXDAwMEpNUDY0cGNyZWwzMlwwMDBKTVA2NHJcMDAwSk1QXzFcMDAwSk1QXzRcMDAwIg0KKyAgICAiSk5FXzFcMDAwSk5FXzRcMDAwSk5PXzFcMDAwSk5PXzRcMDAwSk5QXzFcMDAwSk5QXzRcMDAwSk5TXzFcMDAwSk5TXzRcMDAwIg0KKyAgICAiSk9fMVwwMDBKT180XDAwMEpQXzFcMDAwSlBfNFwwMDBKU18xXDAwMEpTXzRcMDAwTEFIRlwwMDBMQVIxNnJtXDAwMExBUjEiDQorICAgICI2cnJcMDAwTEFSMzJybVwwMDBMQVIzMnJyXDAwMExBUjY0cm1cMDAwTEFSNjRyclwwMDBMQ01QWENIRzE2XDAwMExDTVBYQyINCisgICAgIkhHMzJcMDAwTENNUFhDSEc2NFwwMDBMQ01QWENIRzhcMDAwTENNUFhDSEc4QlwwMDBMRERRVXJtXDAwMExETVhDU1JcMDAwIg0KKyAgICAiTERTMTZybVwwMDBMRFMzMnJtXDAwMExEX0YwXDAwMExEX0YxXDAwMExEX0YzMm1cMDAwTERfRjY0bVwwMDBMRF9GODBtXDAwMCINCisgICAgIkxEX0ZwMDMyXDAwMExEX0ZwMDY0XDAwMExEX0ZwMDgwXDAwMExEX0ZwMTMyXDAwMExEX0ZwMTY0XDAwMExEX0ZwMTgwXDAwMCINCisgICAgIkxEX0ZwMzJtXDAwMExEX0ZwMzJtNjRcMDAwTERfRnAzMm04MFwwMDBMRF9GcDY0bVwwMDBMRF9GcDY0bTgwXDAwMExEX0ZwIg0KKyAgICAiODBtXDAwMExEX0ZyclwwMDBMRUExNnJcMDAwTEVBMzJyXDAwMExFQTY0XzMyclwwMDBMRUE2NHJcMDAwTEVBVkVcMDAwTEUiDQorICAgICJBVkU2NFwwMDBMRVMxNnJtXDAwMExFUzMycm1cMDAwTEZFTkNFXDAwMExGUzE2cm1cMDAwTEZTMzJybVwwMDBMRlM2NHJtXDAwMCINCisgICAgIkxHRFRtXDAwMExHUzE2cm1cMDAwTEdTMzJybVwwMDBMR1M2NHJtXDAwMExJRFRtXDAwMExMRFQxNm1cMDAwTExEVDE2clwwMDAiDQorICAgICJMTVNXMTZtXDAwMExNU1cxNnJcMDAwTE9DS19BREQxNm1pXDAwMExPQ0tfQUREMTZtaThcMDAwTE9DS19BREQxNm1yXDAwMCINCisgICAgIkxPQ0tfQUREMzJtaVwwMDBMT0NLX0FERDMybWk4XDAwMExPQ0tfQUREMzJtclwwMDBMT0NLX0FERDY0bWkzMlwwMDBMT0NLIg0KKyAgICAiX0FERDY0bWk4XDAwMExPQ0tfQURENjRtclwwMDBMT0NLX0FERDhtaVwwMDBMT0NLX0FERDhtclwwMDBMT0NLX0RFQzE2bVwwMDAiDQorICAgICJMT0NLX0RFQzMybVwwMDBMT0NLX0RFQzY0bVwwMDBMT0NLX0RFQzhtXDAwMExPQ0tfSU5DMTZtXDAwMExPQ0tfSU5DMzJtXDAwMCINCisgICAgIkxPQ0tfSU5DNjRtXDAwMExPQ0tfSU5DOG1cMDAwTE9DS19QUkVGSVhcMDAwTE9DS19TVUIxNm1pXDAwMExPQ0tfU1VCMTZtIg0KKyAgICAiaThcMDAwTE9DS19TVUIxNm1yXDAwMExPQ0tfU1VCMzJtaVwwMDBMT0NLX1NVQjMybWk4XDAwMExPQ0tfU1VCMzJtclwwMDAiDQorICAgICJMT0NLX1NVQjY0bWkzMlwwMDBMT0NLX1NVQjY0bWk4XDAwMExPQ0tfU1VCNjRtclwwMDBMT0NLX1NVQjhtaVwwMDBMT0NLXyINCisgICAgIlNVQjhtclwwMDBMT0RTQlwwMDBMT0RTRFwwMDBMT0RTUVwwMDBMT0RTV1wwMDBMT09QXDAwMExPT1BFXDAwMExPT1BORVwwMDAiDQorICAgICJMUkVUXDAwMExSRVRJXDAwMExTTDE2cm1cMDAwTFNMMTZyclwwMDBMU0wzMnJtXDAwMExTTDMycnJcMDAwTFNMNjRybVwwMDAiDQorICAgICJMU0w2NHJyXDAwMExTUzE2cm1cMDAwTFNTMzJybVwwMDBMU1M2NHJtXDAwMExUUm1cMDAwTFRSclwwMDBMWEFERDE2XDAwMCINCisgICAgIkxYQUREMzJcMDAwTFhBREQ2NFwwMDBMWEFERDhcMDAwTUFTS01PVkRRVVwwMDBNQVNLTU9WRFFVNjRcMDAwTUFYUERybVwwMDAiDQorICAgICJNQVhQRHJtX0ludFwwMDBNQVhQRHJyXDAwME1BWFBEcnJfSW50XDAwME1BWFBTcm1cMDAwTUFYUFNybV9JbnRcMDAwTUFYUCINCisgICAgIlNyclwwMDBNQVhQU3JyX0ludFwwMDBNQVhTRHJtXDAwME1BWFNEcm1fSW50XDAwME1BWFNEcnJcMDAwTUFYU0Rycl9JbnRcMDAwIg0KKyAgICAiTUFYU1NybVwwMDBNQVhTU3JtX0ludFwwMDBNQVhTU3JyXDAwME1BWFNTcnJfSW50XDAwME1GRU5DRVwwMDBNSU5HV19BTEwiDQorICAgICJPQ0FcMDAwTUlOUERybVwwMDBNSU5QRHJtX0ludFwwMDBNSU5QRHJyXDAwME1JTlBEcnJfSW50XDAwME1JTlBTcm1cMDAwTSINCisgICAgIklOUFNybV9JbnRcMDAwTUlOUFNyclwwMDBNSU5QU3JyX0ludFwwMDBNSU5TRHJtXDAwME1JTlNEcm1fSW50XDAwME1JTlNEIg0KKyAgICAicnJcMDAwTUlOU0Rycl9JbnRcMDAwTUlOU1NybVwwMDBNSU5TU3JtX0ludFwwMDBNSU5TU3JyXDAwME1JTlNTcnJfSW50XDAwMCINCisgICAgIk1NWF9DVlRQRDJQSXJtXDAwME1NWF9DVlRQRDJQSXJyXDAwME1NWF9DVlRQSTJQRHJtXDAwME1NWF9DVlRQSTJQRHJyXDAwMCINCisgICAgIk1NWF9DVlRQSTJQU3JtXDAwME1NWF9DVlRQSTJQU3JyXDAwME1NWF9DVlRQUzJQSXJtXDAwME1NWF9DVlRQUzJQSXJyXDAwMCINCisgICAgIk1NWF9DVlRUUEQyUElybVwwMDBNTVhfQ1ZUVFBEMlBJcnJcMDAwTU1YX0NWVFRQUzJQSXJtXDAwME1NWF9DVlRUUFMyUElyIg0KKyAgICAiclwwMDBNTVhfRU1NU1wwMDBNTVhfRkVNTVNcMDAwTU1YX01BU0tNT1ZRXDAwME1NWF9NQVNLTU9WUTY0XDAwME1NWF9NT1YiDQorICAgICJENjRmcm9tNjRyclwwMDBNTVhfTU9WRDY0Z3JyXDAwME1NWF9NT1ZENjRtclwwMDBNTVhfTU9WRDY0cm1cMDAwTU1YX01PViINCisgICAgIkQ2NHJyXDAwME1NWF9NT1ZENjRycnYxNjRcMDAwTU1YX01PVkQ2NHRvNjRyclwwMDBNTVhfTU9WRFEyUXJyXDAwME1NWF9NIg0KKyAgICAiT1ZGUjY0MlFyclwwMDBNTVhfTU9WTlRRbXJcMDAwTU1YX01PVlEyRFFyclwwMDBNTVhfTU9WUTJGUjY0cnJcMDAwTU1YX00iDQorICAgICJPVlE2NG1yXDAwME1NWF9NT1ZRNjRybVwwMDBNTVhfTU9WUTY0cnJcMDAwTU1YX01PVlpESTJQRElybVwwMDBNTVhfTU9WWiINCisgICAgIkRJMlBESXJyXDAwME1NWF9QQUNLU1NEV3JtXDAwME1NWF9QQUNLU1NEV3JyXDAwME1NWF9QQUNLU1NXQnJtXDAwME1NWF9QIg0KKyAgICAiQUNLU1NXQnJyXDAwME1NWF9QQUNLVVNXQnJtXDAwME1NWF9QQUNLVVNXQnJyXDAwME1NWF9QQUREQnJtXDAwME1NWF9QQUQiDQorICAgICJEQnJyXDAwME1NWF9QQURERHJtXDAwME1NWF9QQURERHJyXDAwME1NWF9QQUREUXJtXDAwME1NWF9QQUREUXJyXDAwME1NWCINCisgICAgIl9QQUREU0JybVwwMDBNTVhfUEFERFNCcnJcMDAwTU1YX1BBRERTV3JtXDAwME1NWF9QQUREU1dyclwwMDBNTVhfUEFERFVTIg0KKyAgICAiQnJtXDAwME1NWF9QQUREVVNCcnJcMDAwTU1YX1BBRERVU1dybVwwMDBNTVhfUEFERFVTV3JyXDAwME1NWF9QQUREV3JtXDAwMCINCisgICAgIk1NWF9QQUREV3JyXDAwME1NWF9QQU5ETnJtXDAwME1NWF9QQU5ETnJyXDAwME1NWF9QQU5Ecm1cMDAwTU1YX1BBTkRyclwwMDAiDQorICAgICJNTVhfUEFWR0JybVwwMDBNTVhfUEFWR0JyclwwMDBNTVhfUEFWR1dybVwwMDBNTVhfUEFWR1dyclwwMDBNTVhfUENNUEVRQiINCisgICAgInJtXDAwME1NWF9QQ01QRVFCcnJcMDAwTU1YX1BDTVBFUURybVwwMDBNTVhfUENNUEVRRHJyXDAwME1NWF9QQ01QRVFXcm1cMDAwIg0KKyAgICAiTU1YX1BDTVBFUVdyclwwMDBNTVhfUENNUEdUQnJtXDAwME1NWF9QQ01QR1RCcnJcMDAwTU1YX1BDTVBHVERybVwwMDBNTVgiDQorICAgICJfUENNUEdURHJyXDAwME1NWF9QQ01QR1RXcm1cMDAwTU1YX1BDTVBHVFdyclwwMDBNTVhfUEVYVFJXcmlcMDAwTU1YX1BJTiINCisgICAgIlNSV3JtaVwwMDBNTVhfUElOU1JXcnJpXDAwME1NWF9QTUFERFdEcm1cMDAwTU1YX1BNQUREV0RyclwwMDBNTVhfUE1BWFNXIg0KKyAgICAicm1cMDAwTU1YX1BNQVhTV3JyXDAwME1NWF9QTUFYVUJybVwwMDBNTVhfUE1BWFVCcnJcMDAwTU1YX1BNSU5TV3JtXDAwME0iDQorICAgICJNWF9QTUlOU1dyclwwMDBNTVhfUE1JTlVCcm1cMDAwTU1YX1BNSU5VQnJyXDAwME1NWF9QTU9WTVNLQnJyXDAwME1NWF9QTSINCisgICAgIlVMSFVXcm1cMDAwTU1YX1BNVUxIVVdyclwwMDBNTVhfUE1VTEhXcm1cMDAwTU1YX1BNVUxIV3JyXDAwME1NWF9QTVVMTFdyIg0KKyAgICAibVwwMDBNTVhfUE1VTExXcnJcMDAwTU1YX1BNVUxVRFFybVwwMDBNTVhfUE1VTFVEUXJyXDAwME1NWF9QT1JybVwwMDBNTVgiDQorICAgICJfUE9ScnJcMDAwTU1YX1BTQURCV3JtXDAwME1NWF9QU0FEQldyclwwMDBNTVhfUFNIVUZXbWlcMDAwTU1YX1BTSFVGV3JpXDAwMCINCisgICAgIk1NWF9QU0xMRHJpXDAwME1NWF9QU0xMRHJtXDAwME1NWF9QU0xMRHJyXDAwME1NWF9QU0xMUXJpXDAwME1NWF9QU0xMUXJtIg0KKyAgICAiXDAwME1NWF9QU0xMUXJyXDAwME1NWF9QU0xMV3JpXDAwME1NWF9QU0xMV3JtXDAwME1NWF9QU0xMV3JyXDAwME1NWF9QU1IiDQorICAgICJBRHJpXDAwME1NWF9QU1JBRHJtXDAwME1NWF9QU1JBRHJyXDAwME1NWF9QU1JBV3JpXDAwME1NWF9QU1JBV3JtXDAwME1NWCINCisgICAgIl9QU1JBV3JyXDAwME1NWF9QU1JMRHJpXDAwME1NWF9QU1JMRHJtXDAwME1NWF9QU1JMRHJyXDAwME1NWF9QU1JMUXJpXDAwMCINCisgICAgIk1NWF9QU1JMUXJtXDAwME1NWF9QU1JMUXJyXDAwME1NWF9QU1JMV3JpXDAwME1NWF9QU1JMV3JtXDAwME1NWF9QU1JMV3JyIg0KKyAgICAiXDAwME1NWF9QU1VCQnJtXDAwME1NWF9QU1VCQnJyXDAwME1NWF9QU1VCRHJtXDAwME1NWF9QU1VCRHJyXDAwME1NWF9QU1UiDQorICAgICJCUXJtXDAwME1NWF9QU1VCUXJyXDAwME1NWF9QU1VCU0JybVwwMDBNTVhfUFNVQlNCcnJcMDAwTU1YX1BTVUJTV3JtXDAwMCINCisgICAgIk1NWF9QU1VCU1dyclwwMDBNTVhfUFNVQlVTQnJtXDAwME1NWF9QU1VCVVNCcnJcMDAwTU1YX1BTVUJVU1dybVwwMDBNTVhfIg0KKyAgICAiUFNVQlVTV3JyXDAwME1NWF9QU1VCV3JtXDAwME1NWF9QU1VCV3JyXDAwME1NWF9QVU5QQ0tIQldybVwwMDBNTVhfUFVOUEMiDQorICAgICJLSEJXcnJcMDAwTU1YX1BVTlBDS0hEUXJtXDAwME1NWF9QVU5QQ0tIRFFyclwwMDBNTVhfUFVOUENLSFdEcm1cMDAwTU1YXyINCisgICAgIlBVTlBDS0hXRHJyXDAwME1NWF9QVU5QQ0tMQldybVwwMDBNTVhfUFVOUENLTEJXcnJcMDAwTU1YX1BVTlBDS0xEUXJtXDAwMCINCisgICAgIk1NWF9QVU5QQ0tMRFFyclwwMDBNTVhfUFVOUENLTFdEcm1cMDAwTU1YX1BVTlBDS0xXRHJyXDAwME1NWF9QWE9Scm1cMDAwIg0KKyAgICAiTU1YX1BYT1JyclwwMDBNTVhfVl9TRVQwXDAwME1NWF9WX1NFVEFMTE9ORVNcMDAwTU9OSVRPUlwwMDBNT1YxNmFvMTZcMDAwIg0KKyAgICAiTU9WMTZtaVwwMDBNT1YxNm1yXDAwME1PVjE2bXNcMDAwTU9WMTZvMTZhXDAwME1PVjE2cjBcMDAwTU9WMTZyaVwwMDBNT1YiDQorICAgICIxNnJtXDAwME1PVjE2cnJcMDAwTU9WMTZycl9SRVZcMDAwTU9WMTZyc1wwMDBNT1YxNnNtXDAwME1PVjE2c3JcMDAwTU9WMyINCisgICAgIjJhbzMyXDAwME1PVjMyY3JcMDAwTU9WMzJkclwwMDBNT1YzMm1pXDAwME1PVjMybXJcMDAwTU9WMzJtcl9UQ1wwMDBNT1YzIg0KKyAgICAiMm1zXDAwME1PVjMybzMyYVwwMDBNT1YzMnIwXDAwME1PVjMycmNcMDAwTU9WMzJyZFwwMDBNT1YzMnJpXDAwME1PVjMycm0iDQorICAgICJcMDAwTU9WMzJybV9UQ1wwMDBNT1YzMnJyXDAwME1PVjMycnJfUkVWXDAwME1PVjMycnJfVENcMDAwTU9WMzJyc1wwMDBNTyINCisgICAgIlYzMnNtXDAwME1PVjMyc3JcMDAwTU9WNjRGU3JtXDAwME1PVjY0R1NybVwwMDBNT1Y2NGFvNjRcMDAwTU9WNjRhbzhcMDAwIg0KKyAgICAiTU9WNjRjclwwMDBNT1Y2NGRyXDAwME1PVjY0bWkzMlwwMDBNT1Y2NG1yXDAwME1PVjY0bXJfVENcMDAwTU9WNjRtc1wwMDAiDQorICAgICJNT1Y2NG82NGFcMDAwTU9WNjRvOGFcMDAwTU9WNjRyMFwwMDBNT1Y2NHJjXDAwME1PVjY0cmRcMDAwTU9WNjRyaVwwMDBNTyINCisgICAgIlY2NHJpMzJcMDAwTU9WNjRyaTY0aTMyXDAwME1PVjY0cmlfYWx0XDAwME1PVjY0cm1cMDAwTU9WNjRybV9UQ1wwMDBNT1Y2Ig0KKyAgICAiNHJyXDAwME1PVjY0cnJfUkVWXDAwME1PVjY0cnJfVENcMDAwTU9WNjRyc1wwMDBNT1Y2NHNtXDAwME1PVjY0c3JcMDAwTU8iDQorICAgICJWNjR0b1BRSXJyXDAwME1PVjY0dG9TRHJtXDAwME1PVjY0dG9TRHJyXDAwME1PVjhhbzhcMDAwTU9WOG1pXDAwME1PVjhtciINCisgICAgIlwwMDBNT1Y4bXJfTk9SRVhcMDAwTU9WOG84YVwwMDBNT1Y4cjBcMDAwTU9WOHJpXDAwME1PVjhybVwwMDBNT1Y4cm1fTk9SIg0KKyAgICAiRVhcMDAwTU9WOHJyXDAwME1PVjhycl9OT1JFWFwwMDBNT1Y4cnJfUkVWXDAwME1PVkFQRG1yXDAwME1PVkFQRHJtXDAwME0iDQorICAgICJPVkFQRHJyXDAwME1PVkFQU21yXDAwME1PVkFQU3JtXDAwME1PVkFQU3JyXDAwME1PVkREVVBybVwwMDBNT1ZERFVQcnJcMDAwIg0KKyAgICAiTU9WREkyUERJcm1cMDAwTU9WREkyUERJcnJcMDAwTU9WREkyU1NybVwwMDBNT1ZESTJTU3JyXDAwME1PVkRRQW1yXDAwME0iDQorICAgICJPVkRRQXJtXDAwME1PVkRRQXJyXDAwME1PVkRRVW1yXDAwME1PVkRRVW1yX0ludFwwMDBNT1ZEUVVybVwwMDBNT1ZEUVVybSINCisgICAgIl9JbnRcMDAwTU9WSExQU3JyXDAwME1PVkhQRG1yXDAwME1PVkhQRHJtXDAwME1PVkhQU21yXDAwME1PVkhQU3JtXDAwME1PIg0KKyAgICAiVkxIUFNyclwwMDBNT1ZMUERtclwwMDBNT1ZMUERybVwwMDBNT1ZMUFNtclwwMDBNT1ZMUFNybVwwMDBNT1ZMUTEyOG1yXDAwMCINCisgICAgIk1PVk1TS1BEcnJcMDAwTU9WTVNLUFNyclwwMDBNT1ZOVERRQXJtXDAwME1PVk5URFFfNjRtclwwMDBNT1ZOVERRbXJcMDAwIg0KKyAgICAiTU9WTlREUW1yX0ludFwwMDBNT1ZOVElfNjRtclwwMDBNT1ZOVEltclwwMDBNT1ZOVEltcl9JbnRcMDAwTU9WTlRQRG1yXDAwMCINCisgICAgIk1PVk5UUERtcl9JbnRcMDAwTU9WTlRQU21yXDAwME1PVk5UUFNtcl9JbnRcMDAwTU9WUEMzMnJcMDAwTU9WUERJMkRJbXJcMDAwIg0KKyAgICAiTU9WUERJMkRJcnJcMDAwTU9WUFFJMlFJbXJcMDAwTU9WUFFJdG82NHJyXDAwME1PVlFJMlBRSXJtXDAwME1PVlF4cnhyXDAwMCINCisgICAgIk1PVlNCXDAwME1PVlNEXDAwME1PVlNEbXJcMDAwTU9WU0RybVwwMDBNT1ZTRHJyXDAwME1PVlNEdG82NG1yXDAwME1PVlNEIg0KKyAgICAidG82NHJyXDAwME1PVlNIRFVQcm1cMDAwTU9WU0hEVVByclwwMDBNT1ZTTERVUHJtXDAwME1PVlNMRFVQcnJcMDAwTU9WU1EiDQorICAgICJcMDAwTU9WU1MyREltclwwMDBNT1ZTUzJESXJyXDAwME1PVlNTbXJcMDAwTU9WU1NybVwwMDBNT1ZTU3JyXDAwME1PVlNXXDAwMCINCisgICAgIk1PVlNYMTZybThcMDAwTU9WU1gxNnJtOFdcMDAwTU9WU1gxNnJyOFwwMDBNT1ZTWDE2cnI4V1wwMDBNT1ZTWDMycm0xNlwwMDAiDQorICAgICJNT1ZTWDMycm04XDAwME1PVlNYMzJycjE2XDAwME1PVlNYMzJycjhcMDAwTU9WU1g2NHJtMTZcMDAwTU9WU1g2NHJtMzJcMDAwIg0KKyAgICAiTU9WU1g2NHJtOFwwMDBNT1ZTWDY0cnIxNlwwMDBNT1ZTWDY0cnIzMlwwMDBNT1ZTWDY0cnI4XDAwME1PVlVQRG1yXDAwME0iDQorICAgICJPVlVQRG1yX0ludFwwMDBNT1ZVUERybVwwMDBNT1ZVUERybV9JbnRcMDAwTU9WVVBEcnJcMDAwTU9WVVBTbXJcMDAwTU9WVSINCisgICAgIlBTbXJfSW50XDAwME1PVlVQU3JtXDAwME1PVlVQU3JtX0ludFwwMDBNT1ZVUFNyclwwMDBNT1ZaREkyUERJcm1cMDAwTU9WIg0KKyAgICAiWkRJMlBESXJyXDAwME1PVlpQUUlMbzJQUUlybVwwMDBNT1ZaUFFJTG8yUFFJcnJcMDAwTU9WWlFJMlBRSXJtXDAwME1PVloiDQorICAgICJRSTJQUUlyclwwMDBNT1ZaWDE2cm04XDAwME1PVlpYMTZybThXXDAwME1PVlpYMTZycjhcMDAwTU9WWlgxNnJyOFdcMDAwTSINCisgICAgIk9WWlgzMl9OT1JFWHJtOFwwMDBNT1ZaWDMyX05PUkVYcnI4XDAwME1PVlpYMzJybTE2XDAwME1PVlpYMzJybThcMDAwTU9WIg0KKyAgICAiWlgzMnJyMTZcMDAwTU9WWlgzMnJyOFwwMDBNT1ZaWDY0cm0xNlwwMDBNT1ZaWDY0cm0xNl9RXDAwME1PVlpYNjRybTMyXDAwMCINCisgICAgIk1PVlpYNjRybThcMDAwTU9WWlg2NHJtOF9RXDAwME1PVlpYNjRycjE2XDAwME1PVlpYNjRycjE2X1FcMDAwTU9WWlg2NHJyIg0KKyAgICAiMzJcMDAwTU9WWlg2NHJyOFwwMDBNT1ZaWDY0cnI4X1FcMDAwTU9WX0ZwMzIzMlwwMDBNT1ZfRnAzMjY0XDAwME1PVl9GcDMiDQorICAgICIyODBcMDAwTU9WX0ZwNjQzMlwwMDBNT1ZfRnA2NDY0XDAwME1PVl9GcDY0ODBcMDAwTU9WX0ZwODAzMlwwMDBNT1ZfRnA4MCINCisgICAgIjY0XDAwME1PVl9GcDgwODBcMDAwTVBTQURCV3JtaVwwMDBNUFNBREJXcnJpXDAwME1VTDE2bVwwMDBNVUwxNnJcMDAwTVVMIg0KKyAgICAiMzJtXDAwME1VTDMyclwwMDBNVUw2NG1cMDAwTVVMNjRyXDAwME1VTDhtXDAwME1VTDhyXDAwME1VTFBEcm1cMDAwTVVMUEQiDQorICAgICJyclwwMDBNVUxQU3JtXDAwME1VTFBTcnJcMDAwTVVMU0RybVwwMDBNVUxTRHJtX0ludFwwMDBNVUxTRHJyXDAwME1VTFNEciINCisgICAgInJfSW50XDAwME1VTFNTcm1cMDAwTVVMU1NybV9JbnRcMDAwTVVMU1NyclwwMDBNVUxTU3JyX0ludFwwMDBNVUxfRjMybVwwMDAiDQorICAgICJNVUxfRjY0bVwwMDBNVUxfRkkxNm1cMDAwTVVMX0ZJMzJtXDAwME1VTF9GUHJTVDBcMDAwTVVMX0ZTVDByXDAwME1VTF9GcCINCisgICAgIjMyXDAwME1VTF9GcDMybVwwMDBNVUxfRnA2NFwwMDBNVUxfRnA2NG1cMDAwTVVMX0ZwNjRtMzJcMDAwTVVMX0ZwODBcMDAwIg0KKyAgICAiTVVMX0ZwODBtMzJcMDAwTVVMX0ZwODBtNjRcMDAwTVVMX0ZwSTE2bTMyXDAwME1VTF9GcEkxNm02NFwwMDBNVUxfRnBJMTYiDQorICAgICJtODBcMDAwTVVMX0ZwSTMybTMyXDAwME1VTF9GcEkzMm02NFwwMDBNVUxfRnBJMzJtODBcMDAwTVVMX0ZyU1QwXDAwME1XQSINCisgICAgIklUXDAwME5FRzE2bVwwMDBORUcxNnJcMDAwTkVHMzJtXDAwME5FRzMyclwwMDBORUc2NG1cMDAwTkVHNjRyXDAwME5FRzhtIg0KKyAgICAiXDAwME5FRzhyXDAwME5PT1BcMDAwTk9PUExcMDAwTk9PUFdcMDAwTk9UMTZtXDAwME5PVDE2clwwMDBOT1QzMm1cMDAwTk8iDQorICAgICJUMzJyXDAwME5PVDY0bVwwMDBOT1Q2NHJcMDAwTk9UOG1cMDAwTk9UOHJcMDAwT1IxNmkxNlwwMDBPUjE2bWlcMDAwT1IxNiINCisgICAgIm1pOFwwMDBPUjE2bXJcMDAwT1IxNnJpXDAwME9SMTZyaThcMDAwT1IxNnJtXDAwME9SMTZyclwwMDBPUjE2cnJfUkVWXDAwMCINCisgICAgIk9SMzJpMzJcMDAwT1IzMm1pXDAwME9SMzJtaThcMDAwT1IzMm1yXDAwME9SMzJyaVwwMDBPUjMycmk4XDAwME9SMzJybVwwMDAiDQorICAgICJPUjMycnJcMDAwT1IzMnJyX1JFVlwwMDBPUjY0aTMyXDAwME9SNjRtaTMyXDAwME9SNjRtaThcMDAwT1I2NG1yXDAwME9SNiINCisgICAgIjRyaTMyXDAwME9SNjRyaThcMDAwT1I2NHJtXDAwME9SNjRyclwwMDBPUjY0cnJfUkVWXDAwME9SOGk4XDAwME9SOG1pXDAwMCINCisgICAgIk9SOG1yXDAwME9SOHJpXDAwME9SOHJtXDAwME9SOHJyXDAwME9SOHJyX1JFVlwwMDBPUlBEcm1cMDAwT1JQRHJyXDAwME9SIg0KKyAgICAiUFNybVwwMDBPUlBTcnJcMDAwT1VUMTZpclwwMDBPVVQxNnJyXDAwME9VVDMyaXJcMDAwT1VUMzJyclwwMDBPVVQ4aXJcMDAwIg0KKyAgICAiT1VUOHJyXDAwME9VVFNCXDAwME9VVFNEXDAwME9VVFNXXDAwMFBBQlNCcm0xMjhcMDAwUEFCU0JybTY0XDAwMFBBQlNCcnIiDQorICAgICIxMjhcMDAwUEFCU0JycjY0XDAwMFBBQlNEcm0xMjhcMDAwUEFCU0RybTY0XDAwMFBBQlNEcnIxMjhcMDAwUEFCU0RycjY0XDAwMCINCisgICAgIlBBQlNXcm0xMjhcMDAwUEFCU1dybTY0XDAwMFBBQlNXcnIxMjhcMDAwUEFCU1dycjY0XDAwMFBBQ0tTU0RXcm1cMDAwUEFDIg0KKyAgICAiS1NTRFdyclwwMDBQQUNLU1NXQnJtXDAwMFBBQ0tTU1dCcnJcMDAwUEFDS1VTRFdybVwwMDBQQUNLVVNEV3JyXDAwMFBBQ0siDQorICAgICJVU1dCcm1cMDAwUEFDS1VTV0JyclwwMDBQQUREQnJtXDAwMFBBRERCcnJcMDAwUEFERERybVwwMDBQQURERHJyXDAwMFBBRCINCisgICAgIkRRcm1cMDAwUEFERFFyclwwMDBQQUREU0JybVwwMDBQQUREU0JyclwwMDBQQUREU1dybVwwMDBQQUREU1dyclwwMDBQQUREIg0KKyAgICAiVVNCcm1cMDAwUEFERFVTQnJyXDAwMFBBRERVU1dybVwwMDBQQUREVVNXcnJcMDAwUEFERFdybVwwMDBQQUREV3JyXDAwMFAiDQorICAgICJBTElHTlIxMjhybVwwMDBQQUxJR05SMTI4cnJcMDAwUEFMSUdOUjY0cm1cMDAwUEFMSUdOUjY0cnJcMDAwUEFORE5ybVwwMDAiDQorICAgICJQQU5ETnJyXDAwMFBBTkRybVwwMDBQQU5EcnJcMDAwUEFVU0VcMDAwUEFWR0JybVwwMDBQQVZHQnJyXDAwMFBBVkdXcm1cMDAwIg0KKyAgICAiUEFWR1dyclwwMDBQQkxFTkRWQnJtMFwwMDBQQkxFTkRWQnJyMFwwMDBQQkxFTkRXcm1pXDAwMFBCTEVORFdycmlcMDAwUEMiDQorICAgICJNUEVRQnJtXDAwMFBDTVBFUUJyclwwMDBQQ01QRVFEcm1cMDAwUENNUEVRRHJyXDAwMFBDTVBFUVFybVwwMDBQQ01QRVFRciINCisgICAgInJcMDAwUENNUEVRV3JtXDAwMFBDTVBFUVdyclwwMDBQQ01QRVNUUklBcm1cMDAwUENNUEVTVFJJQXJyXDAwMFBDTVBFU1RSIg0KKyAgICAiSUNybVwwMDBQQ01QRVNUUklDcnJcMDAwUENNUEVTVFJJT3JtXDAwMFBDTVBFU1RSSU9yclwwMDBQQ01QRVNUUklTcm1cMDAwIg0KKyAgICAiUENNUEVTVFJJU3JyXDAwMFBDTVBFU1RSSVpybVwwMDBQQ01QRVNUUklacnJcMDAwUENNUEVTVFJJcm1cMDAwUENNUEVTVFIiDQorICAgICJJcnJcMDAwUENNUEVTVFJNMTI4TUVNXDAwMFBDTVBFU1RSTTEyOFJFR1wwMDBQQ01QRVNUUk0xMjhybVwwMDBQQ01QRVNUUiINCisgICAgIk0xMjhyclwwMDBQQ01QR1RCcm1cMDAwUENNUEdUQnJyXDAwMFBDTVBHVERybVwwMDBQQ01QR1REcnJcMDAwUENNUEdUUXJtIg0KKyAgICAiXDAwMFBDTVBHVFFyclwwMDBQQ01QR1RXcm1cMDAwUENNUEdUV3JyXDAwMFBDTVBJU1RSSUFybVwwMDBQQ01QSVNUUklBcnIiDQorICAgICJcMDAwUENNUElTVFJJQ3JtXDAwMFBDTVBJU1RSSUNyclwwMDBQQ01QSVNUUklPcm1cMDAwUENNUElTVFJJT3JyXDAwMFBDTSINCisgICAgIlBJU1RSSVNybVwwMDBQQ01QSVNUUklTcnJcMDAwUENNUElTVFJJWnJtXDAwMFBDTVBJU1RSSVpyclwwMDBQQ01QSVNUUklyIg0KKyAgICAibVwwMDBQQ01QSVNUUklyclwwMDBQQ01QSVNUUk0xMjhNRU1cMDAwUENNUElTVFJNMTI4UkVHXDAwMFBDTVBJU1RSTTEyOHIiDQorICAgICJtXDAwMFBDTVBJU1RSTTEyOHJyXDAwMFBFWFRSQm1yXDAwMFBFWFRSQnJyXDAwMFBFWFRSRG1yXDAwMFBFWFRSRHJyXDAwMCINCisgICAgIlBFWFRSUW1yXDAwMFBFWFRSUXJyXDAwMFBFWFRSV21yXDAwMFBFWFRSV3JpXDAwMFBIQURERHJtMTI4XDAwMFBIQURERHJtIg0KKyAgICAiNjRcMDAwUEhBREREcnIxMjhcMDAwUEhBREREcnI2NFwwMDBQSEFERFNXcm0xMjhcMDAwUEhBRERTV3JtNjRcMDAwUEhBREQiDQorICAgICJTV3JyMTI4XDAwMFBIQUREU1dycjY0XDAwMFBIQUREV3JtMTI4XDAwMFBIQUREV3JtNjRcMDAwUEhBRERXcnIxMjhcMDAwUCINCisgICAgIkhBRERXcnI2NFwwMDBQSE1JTlBPU1VXcm0xMjhcMDAwUEhNSU5QT1NVV3JyMTI4XDAwMFBIU1VCRHJtMTI4XDAwMFBIU1VCIg0KKyAgICAiRHJtNjRcMDAwUEhTVUJEcnIxMjhcMDAwUEhTVUJEcnI2NFwwMDBQSFNVQlNXcm0xMjhcMDAwUEhTVUJTV3JtNjRcMDAwUEgiDQorICAgICJTVUJTV3JyMTI4XDAwMFBIU1VCU1dycjY0XDAwMFBIU1VCV3JtMTI4XDAwMFBIU1VCV3JtNjRcMDAwUEhTVUJXcnIxMjhcMDAwIg0KKyAgICAiUEhTVUJXcnI2NFwwMDBQSU5TUkJybVwwMDBQSU5TUkJyclwwMDBQSU5TUkRybVwwMDBQSU5TUkRyclwwMDBQSU5TUlFybVwwMDAiDQorICAgICJQSU5TUlFyclwwMDBQSU5TUldybWlcMDAwUElOU1JXcnJpXDAwMFBNQUREVUJTV3JtMTI4XDAwMFBNQUREVUJTV3JtNjRcMDAwIg0KKyAgICAiUE1BRERVQlNXcnIxMjhcMDAwUE1BRERVQlNXcnI2NFwwMDBQTUFERFdEcm1cMDAwUE1BRERXRHJyXDAwMFBNQVhTQnJtXDAwMCINCisgICAgIlBNQVhTQnJyXDAwMFBNQVhTRHJtXDAwMFBNQVhTRHJyXDAwMFBNQVhTV3JtXDAwMFBNQVhTV3JyXDAwMFBNQVhVQnJtXDAwMCINCisgICAgIlBNQVhVQnJyXDAwMFBNQVhVRHJtXDAwMFBNQVhVRHJyXDAwMFBNQVhVV3JtXDAwMFBNQVhVV3JyXDAwMFBNSU5TQnJtXDAwMCINCisgICAgIlBNSU5TQnJyXDAwMFBNSU5TRHJtXDAwMFBNSU5TRHJyXDAwMFBNSU5TV3JtXDAwMFBNSU5TV3JyXDAwMFBNSU5VQnJtXDAwMCINCisgICAgIlBNSU5VQnJyXDAwMFBNSU5VRHJtXDAwMFBNSU5VRHJyXDAwMFBNSU5VV3JtXDAwMFBNSU5VV3JyXDAwMFBNT1ZNU0tCcnJcMDAwIg0KKyAgICAiUE1PVlNYQkRybVwwMDBQTU9WU1hCRHJyXDAwMFBNT1ZTWEJRcm1cMDAwUE1PVlNYQlFyclwwMDBQTU9WU1hCV3JtXDAwMFAiDQorICAgICJNT1ZTWEJXcnJcMDAwUE1PVlNYRFFybVwwMDBQTU9WU1hEUXJyXDAwMFBNT1ZTWFdEcm1cMDAwUE1PVlNYV0RyclwwMDBQTSINCisgICAgIk9WU1hXUXJtXDAwMFBNT1ZTWFdRcnJcMDAwUE1PVlpYQkRybVwwMDBQTU9WWlhCRHJyXDAwMFBNT1ZaWEJRcm1cMDAwUE1PIg0KKyAgICAiVlpYQlFyclwwMDBQTU9WWlhCV3JtXDAwMFBNT1ZaWEJXcnJcMDAwUE1PVlpYRFFybVwwMDBQTU9WWlhEUXJyXDAwMFBNT1YiDQorICAgICJaWFdEcm1cMDAwUE1PVlpYV0RyclwwMDBQTU9WWlhXUXJtXDAwMFBNT1ZaWFdRcnJcMDAwUE1VTERRcm1cMDAwUE1VTERRciINCisgICAgInJcMDAwUE1VTEhSU1dybTEyOFwwMDBQTVVMSFJTV3JtNjRcMDAwUE1VTEhSU1dycjEyOFwwMDBQTVVMSFJTV3JyNjRcMDAwIg0KKyAgICAiUE1VTEhVV3JtXDAwMFBNVUxIVVdyclwwMDBQTVVMSFdybVwwMDBQTVVMSFdyclwwMDBQTVVMTERybVwwMDBQTVVMTERyclwwMDAiDQorICAgICJQTVVMTFdybVwwMDBQTVVMTFdyclwwMDBQTVVMVURRcm1cMDAwUE1VTFVEUXJyXDAwMFBPUDE2clwwMDBQT1AxNnJtbVwwMDAiDQorICAgICJQT1AxNnJtclwwMDBQT1AzMnJcMDAwUE9QMzJybW1cMDAwUE9QMzJybXJcMDAwUE9QNjRyXDAwMFBPUDY0cm1tXDAwMFBPUCINCisgICAgIjY0cm1yXDAwMFBPUEEzMlwwMDBQT1BDTlQxNnJtXDAwMFBPUENOVDE2cnJcMDAwUE9QQ05UMzJybVwwMDBQT1BDTlQzMnJyIg0KKyAgICAiXDAwMFBPUENOVDY0cm1cMDAwUE9QQ05UNjRyclwwMDBQT1BGMTZcMDAwUE9QRjMyXDAwMFBPUEY2NFwwMDBQT1BGUzE2XDAwMCINCisgICAgIlBPUEZTMzJcMDAwUE9QRlM2NFwwMDBQT1BHUzE2XDAwMFBPUEdTMzJcMDAwUE9QR1M2NFwwMDBQT1JybVwwMDBQT1JyclwwMDAiDQorICAgICJQUkVGRVRDSE5UQVwwMDBQUkVGRVRDSFQwXDAwMFBSRUZFVENIVDFcMDAwUFJFRkVUQ0hUMlwwMDBQU0FEQldybVwwMDBQUyINCisgICAgIkFEQldyclwwMDBQU0hVRkJybTEyOFwwMDBQU0hVRkJybTY0XDAwMFBTSFVGQnJyMTI4XDAwMFBTSFVGQnJyNjRcMDAwUFNIIg0KKyAgICAiVUZEbWlcMDAwUFNIVUZEcmlcMDAwUFNIVUZIV21pXDAwMFBTSFVGSFdyaVwwMDBQU0hVRkxXbWlcMDAwUFNIVUZMV3JpXDAwMCINCisgICAgIlBTSUdOQnJtMTI4XDAwMFBTSUdOQnJtNjRcMDAwUFNJR05CcnIxMjhcMDAwUFNJR05CcnI2NFwwMDBQU0lHTkRybTEyOFwwMDAiDQorICAgICJQU0lHTkRybTY0XDAwMFBTSUdORHJyMTI4XDAwMFBTSUdORHJyNjRcMDAwUFNJR05Xcm0xMjhcMDAwUFNJR05Xcm02NFwwMDAiDQorICAgICJQU0lHTldycjEyOFwwMDBQU0lHTldycjY0XDAwMFBTTExEUXJpXDAwMFBTTExEcmlcMDAwUFNMTERybVwwMDBQU0xMRHJyXDAwMCINCisgICAgIlBTTExRcmlcMDAwUFNMTFFybVwwMDBQU0xMUXJyXDAwMFBTTExXcmlcMDAwUFNMTFdybVwwMDBQU0xMV3JyXDAwMFBTUkFEIg0KKyAgICAicmlcMDAwUFNSQURybVwwMDBQU1JBRHJyXDAwMFBTUkFXcmlcMDAwUFNSQVdybVwwMDBQU1JBV3JyXDAwMFBTUkxEUXJpXDAwMCINCisgICAgIlBTUkxEcmlcMDAwUFNSTERybVwwMDBQU1JMRHJyXDAwMFBTUkxRcmlcMDAwUFNSTFFybVwwMDBQU1JMUXJyXDAwMFBTUkxXIg0KKyAgICAicmlcMDAwUFNSTFdybVwwMDBQU1JMV3JyXDAwMFBTVUJCcm1cMDAwUFNVQkJyclwwMDBQU1VCRHJtXDAwMFBTVUJEcnJcMDAwIg0KKyAgICAiUFNVQlFybVwwMDBQU1VCUXJyXDAwMFBTVUJTQnJtXDAwMFBTVUJTQnJyXDAwMFBTVUJTV3JtXDAwMFBTVUJTV3JyXDAwMFAiDQorICAgICJTVUJVU0JybVwwMDBQU1VCVVNCcnJcMDAwUFNVQlVTV3JtXDAwMFBTVUJVU1dyclwwMDBQU1VCV3JtXDAwMFBTVUJXcnJcMDAwIg0KKyAgICAiUFRFU1RybVwwMDBQVEVTVHJyXDAwMFBVTlBDS0hCV3JtXDAwMFBVTlBDS0hCV3JyXDAwMFBVTlBDS0hEUXJtXDAwMFBVTlAiDQorICAgICJDS0hEUXJyXDAwMFBVTlBDS0hRRFFybVwwMDBQVU5QQ0tIUURRcnJcMDAwUFVOUENLSFdEcm1cMDAwUFVOUENLSFdEcnJcMDAwIg0KKyAgICAiUFVOUENLTEJXcm1cMDAwUFVOUENLTEJXcnJcMDAwUFVOUENLTERRcm1cMDAwUFVOUENLTERRcnJcMDAwUFVOUENLTFFEUXIiDQorICAgICJtXDAwMFBVTlBDS0xRRFFyclwwMDBQVU5QQ0tMV0RybVwwMDBQVU5QQ0tMV0RyclwwMDBQVVNIMTZyXDAwMFBVU0gxNnJtbSINCisgICAgIlwwMDBQVVNIMTZybXJcMDAwUFVTSDMyclwwMDBQVVNIMzJybW1cMDAwUFVTSDMycm1yXDAwMFBVU0g2NGkxNlwwMDBQVVNIIg0KKyAgICAiNjRpMzJcMDAwUFVTSDY0aThcMDAwUFVTSDY0clwwMDBQVVNINjRybW1cMDAwUFVTSDY0cm1yXDAwMFBVU0hBMzJcMDAwUFUiDQorICAgICJTSEYxNlwwMDBQVVNIRjMyXDAwMFBVU0hGNjRcMDAwUFVTSEZTMTZcMDAwUFVTSEZTMzJcMDAwUFVTSEZTNjRcMDAwUFVTSCINCisgICAgIkdTMTZcMDAwUFVTSEdTMzJcMDAwUFVTSEdTNjRcMDAwUFVTSGkxNlwwMDBQVVNIaTMyXDAwMFBVU0hpOFwwMDBQWE9Scm1cMDAwIg0KKyAgICAiUFhPUnJyXDAwMFJDTDE2bTFcMDAwUkNMMTZtQ0xcMDAwUkNMMTZtaVwwMDBSQ0wxNnIxXDAwMFJDTDE2ckNMXDAwMFJDTDEiDQorICAgICI2cmlcMDAwUkNMMzJtMVwwMDBSQ0wzMm1DTFwwMDBSQ0wzMm1pXDAwMFJDTDMycjFcMDAwUkNMMzJyQ0xcMDAwUkNMMzJyaSINCisgICAgIlwwMDBSQ0w2NG0xXDAwMFJDTDY0bUNMXDAwMFJDTDY0bWlcMDAwUkNMNjRyMVwwMDBSQ0w2NHJDTFwwMDBSQ0w2NHJpXDAwMCINCisgICAgIlJDTDhtMVwwMDBSQ0w4bUNMXDAwMFJDTDhtaVwwMDBSQ0w4cjFcMDAwUkNMOHJDTFwwMDBSQ0w4cmlcMDAwUkNQUFNtXDAwMCINCisgICAgIlJDUFBTbV9JbnRcMDAwUkNQUFNyXDAwMFJDUFBTcl9JbnRcMDAwUkNQU1NtXDAwMFJDUFNTbV9JbnRcMDAwUkNQU1NyXDAwMCINCisgICAgIlJDUFNTcl9JbnRcMDAwUkNSMTZtMVwwMDBSQ1IxNm1DTFwwMDBSQ1IxNm1pXDAwMFJDUjE2cjFcMDAwUkNSMTZyQ0xcMDAwIg0KKyAgICAiUkNSMTZyaVwwMDBSQ1IzMm0xXDAwMFJDUjMybUNMXDAwMFJDUjMybWlcMDAwUkNSMzJyMVwwMDBSQ1IzMnJDTFwwMDBSQ1IiDQorICAgICIzMnJpXDAwMFJDUjY0bTFcMDAwUkNSNjRtQ0xcMDAwUkNSNjRtaVwwMDBSQ1I2NHIxXDAwMFJDUjY0ckNMXDAwMFJDUjY0ciINCisgICAgImlcMDAwUkNSOG0xXDAwMFJDUjhtQ0xcMDAwUkNSOG1pXDAwMFJDUjhyMVwwMDBSQ1I4ckNMXDAwMFJDUjhyaVwwMDBSRE1TIg0KKyAgICAiUlwwMDBSRFBNQ1wwMDBSRFRTQ1wwMDBSRFRTQ1BcMDAwUkVQTkVfUFJFRklYXDAwMFJFUF9NT1ZTQlwwMDBSRVBfTU9WU0QiDQorICAgICJcMDAwUkVQX01PVlNRXDAwMFJFUF9NT1ZTV1wwMDBSRVBfUFJFRklYXDAwMFJFUF9TVE9TQlwwMDBSRVBfU1RPU0RcMDAwUiINCisgICAgIkVQX1NUT1NRXDAwMFJFUF9TVE9TV1wwMDBSRVRcMDAwUkVUSVwwMDBST0wxNm0xXDAwMFJPTDE2bUNMXDAwMFJPTDE2bWlcMDAwIg0KKyAgICAiUk9MMTZyMVwwMDBST0wxNnJDTFwwMDBST0wxNnJpXDAwMFJPTDMybTFcMDAwUk9MMzJtQ0xcMDAwUk9MMzJtaVwwMDBST0wiDQorICAgICIzMnIxXDAwMFJPTDMyckNMXDAwMFJPTDMycmlcMDAwUk9MNjRtMVwwMDBST0w2NG1DTFwwMDBST0w2NG1pXDAwMFJPTDY0ciINCisgICAgIjFcMDAwUk9MNjRyQ0xcMDAwUk9MNjRyaVwwMDBST0w4bTFcMDAwUk9MOG1DTFwwMDBST0w4bWlcMDAwUk9MOHIxXDAwMFJPIg0KKyAgICAiTDhyQ0xcMDAwUk9MOHJpXDAwMFJPUjE2bTFcMDAwUk9SMTZtQ0xcMDAwUk9SMTZtaVwwMDBST1IxNnIxXDAwMFJPUjE2ckMiDQorICAgICJMXDAwMFJPUjE2cmlcMDAwUk9SMzJtMVwwMDBST1IzMm1DTFwwMDBST1IzMm1pXDAwMFJPUjMycjFcMDAwUk9SMzJyQ0xcMDAwIg0KKyAgICAiUk9SMzJyaVwwMDBST1I2NG0xXDAwMFJPUjY0bUNMXDAwMFJPUjY0bWlcMDAwUk9SNjRyMVwwMDBST1I2NHJDTFwwMDBST1IiDQorICAgICI2NHJpXDAwMFJPUjhtMVwwMDBST1I4bUNMXDAwMFJPUjhtaVwwMDBST1I4cjFcMDAwUk9SOHJDTFwwMDBST1I4cmlcMDAwUiINCisgICAgIk9VTkRQRG1fSW50XDAwMFJPVU5EUERyX0ludFwwMDBST1VORFBTbV9JbnRcMDAwUk9VTkRQU3JfSW50XDAwMFJPVU5EU0RtIg0KKyAgICAiX0ludFwwMDBST1VORFNEcl9JbnRcMDAwUk9VTkRTU21fSW50XDAwMFJPVU5EU1NyX0ludFwwMDBSU01cMDAwUlNRUlRQU20iDQorICAgICJcMDAwUlNRUlRQU21fSW50XDAwMFJTUVJUUFNyXDAwMFJTUVJUUFNyX0ludFwwMDBSU1FSVFNTbVwwMDBSU1FSVFNTbV9JbiINCisgICAgInRcMDAwUlNRUlRTU3JcMDAwUlNRUlRTU3JfSW50XDAwMFNBSEZcMDAwU0FSMTZtMVwwMDBTQVIxNm1DTFwwMDBTQVIxNm1pIg0KKyAgICAiXDAwMFNBUjE2cjFcMDAwU0FSMTZyQ0xcMDAwU0FSMTZyaVwwMDBTQVIzMm0xXDAwMFNBUjMybUNMXDAwMFNBUjMybWlcMDAwIg0KKyAgICAiU0FSMzJyMVwwMDBTQVIzMnJDTFwwMDBTQVIzMnJpXDAwMFNBUjY0bTFcMDAwU0FSNjRtQ0xcMDAwU0FSNjRtaVwwMDBTQVIiDQorICAgICI2NHIxXDAwMFNBUjY0ckNMXDAwMFNBUjY0cmlcMDAwU0FSOG0xXDAwMFNBUjhtQ0xcMDAwU0FSOG1pXDAwMFNBUjhyMVwwMDAiDQorICAgICJTQVI4ckNMXDAwMFNBUjhyaVwwMDBTQkIxNmkxNlwwMDBTQkIxNm1pXDAwMFNCQjE2bWk4XDAwMFNCQjE2bXJcMDAwU0JCMSINCisgICAgIjZyaVwwMDBTQkIxNnJpOFwwMDBTQkIxNnJtXDAwMFNCQjE2cnJcMDAwU0JCMTZycl9SRVZcMDAwU0JCMzJpMzJcMDAwU0JCIg0KKyAgICAiMzJtaVwwMDBTQkIzMm1pOFwwMDBTQkIzMm1yXDAwMFNCQjMycmlcMDAwU0JCMzJyaThcMDAwU0JCMzJybVwwMDBTQkIzMnIiDQorICAgICJyXDAwMFNCQjMycnJfUkVWXDAwMFNCQjY0aTMyXDAwMFNCQjY0bWkzMlwwMDBTQkI2NG1pOFwwMDBTQkI2NG1yXDAwMFNCQiINCisgICAgIjY0cmkzMlwwMDBTQkI2NHJpOFwwMDBTQkI2NHJtXDAwMFNCQjY0cnJcMDAwU0JCNjRycl9SRVZcMDAwU0JCOGk4XDAwMFNCIg0KKyAgICAiQjhtaVwwMDBTQkI4bXJcMDAwU0JCOHJpXDAwMFNCQjhybVwwMDBTQkI4cnJcMDAwU0JCOHJyX1JFVlwwMDBTQ0FTMTZcMDAwIg0KKyAgICAiU0NBUzMyXDAwMFNDQVM2NFwwMDBTQ0FTOFwwMDBTRVRBRW1cMDAwU0VUQUVyXDAwMFNFVEFtXDAwMFNFVEFyXDAwMFNFVEIiDQorICAgICJFbVwwMDBTRVRCRXJcMDAwU0VUQl9DMTZyXDAwMFNFVEJfQzMyclwwMDBTRVRCX0M2NHJcMDAwU0VUQl9DOHJcMDAwU0VUQiINCisgICAgIm1cMDAwU0VUQnJcMDAwU0VURW1cMDAwU0VURXJcMDAwU0VUR0VtXDAwMFNFVEdFclwwMDBTRVRHbVwwMDBTRVRHclwwMDBTIg0KKyAgICAiRVRMRW1cMDAwU0VUTEVyXDAwMFNFVExtXDAwMFNFVExyXDAwMFNFVE5FbVwwMDBTRVRORXJcMDAwU0VUTk9tXDAwMFNFVE4iDQorICAgICJPclwwMDBTRVROUG1cMDAwU0VUTlByXDAwMFNFVE5TbVwwMDBTRVROU3JcMDAwU0VUT21cMDAwU0VUT3JcMDAwU0VUUG1cMDAwIg0KKyAgICAiU0VUUHJcMDAwU0VUU21cMDAwU0VUU3JcMDAwU0ZFTkNFXDAwMFNHRFRtXDAwMFNITDE2bTFcMDAwU0hMMTZtQ0xcMDAwU0giDQorICAgICJMMTZtaVwwMDBTSEwxNnIxXDAwMFNITDE2ckNMXDAwMFNITDE2cmlcMDAwU0hMMzJtMVwwMDBTSEwzMm1DTFwwMDBTSEwzMiINCisgICAgIm1pXDAwMFNITDMycjFcMDAwU0hMMzJyQ0xcMDAwU0hMMzJyaVwwMDBTSEw2NG0xXDAwMFNITDY0bUNMXDAwMFNITDY0bWlcMDAwIg0KKyAgICAiU0hMNjRyMVwwMDBTSEw2NHJDTFwwMDBTSEw2NHJpXDAwMFNITDhtMVwwMDBTSEw4bUNMXDAwMFNITDhtaVwwMDBTSEw4cjEiDQorICAgICJcMDAwU0hMOHJDTFwwMDBTSEw4cmlcMDAwU0hMRDE2bXJDTFwwMDBTSExEMTZtcmk4XDAwMFNITEQxNnJyQ0xcMDAwU0hMRCINCisgICAgIjE2cnJpOFwwMDBTSExEMzJtckNMXDAwMFNITEQzMm1yaThcMDAwU0hMRDMycnJDTFwwMDBTSExEMzJycmk4XDAwMFNITEQ2Ig0KKyAgICAiNG1yQ0xcMDAwU0hMRDY0bXJpOFwwMDBTSExENjRyckNMXDAwMFNITEQ2NHJyaThcMDAwU0hSMTZtMVwwMDBTSFIxNm1DTFwwMDAiDQorICAgICJTSFIxNm1pXDAwMFNIUjE2cjFcMDAwU0hSMTZyQ0xcMDAwU0hSMTZyaVwwMDBTSFIzMm0xXDAwMFNIUjMybUNMXDAwMFNIUiINCisgICAgIjMybWlcMDAwU0hSMzJyMVwwMDBTSFIzMnJDTFwwMDBTSFIzMnJpXDAwMFNIUjY0bTFcMDAwU0hSNjRtQ0xcMDAwU0hSNjRtIg0KKyAgICAiaVwwMDBTSFI2NHIxXDAwMFNIUjY0ckNMXDAwMFNIUjY0cmlcMDAwU0hSOG0xXDAwMFNIUjhtQ0xcMDAwU0hSOG1pXDAwMFMiDQorICAgICJIUjhyMVwwMDBTSFI4ckNMXDAwMFNIUjhyaVwwMDBTSFJEMTZtckNMXDAwMFNIUkQxNm1yaThcMDAwU0hSRDE2cnJDTFwwMDAiDQorICAgICJTSFJEMTZycmk4XDAwMFNIUkQzMm1yQ0xcMDAwU0hSRDMybXJpOFwwMDBTSFJEMzJyckNMXDAwMFNIUkQzMnJyaThcMDAwUyINCisgICAgIkhSRDY0bXJDTFwwMDBTSFJENjRtcmk4XDAwMFNIUkQ2NHJyQ0xcMDAwU0hSRDY0cnJpOFwwMDBTSFVGUERybWlcMDAwU0hVIg0KKyAgICAiRlBEcnJpXDAwMFNIVUZQU3JtaVwwMDBTSFVGUFNycmlcMDAwU0lEVG1cMDAwU0lOX0ZcMDAwU0lOX0ZwMzJcMDAwU0lOX0YiDQorICAgICJwNjRcMDAwU0lOX0ZwODBcMDAwU0xEVDE2bVwwMDBTTERUMTZyXDAwMFNMRFQ2NG1cMDAwU0xEVDY0clwwMDBTTVNXMTZtXDAwMCINCisgICAgIlNNU1cxNnJcMDAwU01TVzMyclwwMDBTTVNXNjRyXDAwMFNRUlRQRG1cMDAwU1FSVFBEbV9JbnRcMDAwU1FSVFBEclwwMDBTIg0KKyAgICAiUVJUUERyX0ludFwwMDBTUVJUUFNtXDAwMFNRUlRQU21fSW50XDAwMFNRUlRQU3JcMDAwU1FSVFBTcl9JbnRcMDAwU1FSVFMiDQorICAgICJEbVwwMDBTUVJUU0RtX0ludFwwMDBTUVJUU0RyXDAwMFNRUlRTRHJfSW50XDAwMFNRUlRTU21cMDAwU1FSVFNTbV9JbnRcMDAwIg0KKyAgICAiU1FSVFNTclwwMDBTUVJUU1NyX0ludFwwMDBTUVJUX0ZcMDAwU1FSVF9GcDMyXDAwMFNRUlRfRnA2NFwwMDBTUVJUX0ZwODAiDQorICAgICJcMDAwU1NfUFJFRklYXDAwMFNUQ1wwMDBTVERcMDAwU1RJXDAwMFNUTVhDU1JcMDAwU1RPU0JcMDAwU1RPU0RcMDAwU1RPUyINCisgICAgIlFcMDAwU1RPU1dcMDAwU1RSbVwwMDBTVFJyXDAwMFNUX0YzMm1cMDAwU1RfRjY0bVwwMDBTVF9GUDMybVwwMDBTVF9GUDY0Ig0KKyAgICAibVwwMDBTVF9GUDgwbVwwMDBTVF9GUHJyXDAwMFNUX0ZwMzJtXDAwMFNUX0ZwNjRtXDAwMFNUX0ZwNjRtMzJcMDAwU1RfRnAiDQorICAgICI4MG0zMlwwMDBTVF9GcDgwbTY0XDAwMFNUX0ZwUDMybVwwMDBTVF9GcFA2NG1cMDAwU1RfRnBQNjRtMzJcMDAwU1RfRnBQOCINCisgICAgIjBtXDAwMFNUX0ZwUDgwbTMyXDAwMFNUX0ZwUDgwbTY0XDAwMFNUX0ZyclwwMDBTVUIxNmkxNlwwMDBTVUIxNm1pXDAwMFNVIg0KKyAgICAiQjE2bWk4XDAwMFNVQjE2bXJcMDAwU1VCMTZyaVwwMDBTVUIxNnJpOFwwMDBTVUIxNnJtXDAwMFNVQjE2cnJcMDAwU1VCMTYiDQorICAgICJycl9SRVZcMDAwU1VCMzJpMzJcMDAwU1VCMzJtaVwwMDBTVUIzMm1pOFwwMDBTVUIzMm1yXDAwMFNVQjMycmlcMDAwU1VCMyINCisgICAgIjJyaThcMDAwU1VCMzJybVwwMDBTVUIzMnJyXDAwMFNVQjMycnJfUkVWXDAwMFNVQjY0aTMyXDAwMFNVQjY0bWkzMlwwMDBTIg0KKyAgICAiVUI2NG1pOFwwMDBTVUI2NG1yXDAwMFNVQjY0cmkzMlwwMDBTVUI2NHJpOFwwMDBTVUI2NHJtXDAwMFNVQjY0cnJcMDAwU1UiDQorICAgICJCNjRycl9SRVZcMDAwU1VCOGk4XDAwMFNVQjhtaVwwMDBTVUI4bXJcMDAwU1VCOHJpXDAwMFNVQjhybVwwMDBTVUI4cnJcMDAwIg0KKyAgICAiU1VCOHJyX1JFVlwwMDBTVUJQRHJtXDAwMFNVQlBEcnJcMDAwU1VCUFNybVwwMDBTVUJQU3JyXDAwMFNVQlJfRjMybVwwMDAiDQorICAgICJTVUJSX0Y2NG1cMDAwU1VCUl9GSTE2bVwwMDBTVUJSX0ZJMzJtXDAwMFNVQlJfRlByU1QwXDAwMFNVQlJfRlNUMHJcMDAwUyINCisgICAgIlVCUl9GcDMybVwwMDBTVUJSX0ZwNjRtXDAwMFNVQlJfRnA2NG0zMlwwMDBTVUJSX0ZwODBtMzJcMDAwU1VCUl9GcDgwbTY0Ig0KKyAgICAiXDAwMFNVQlJfRnBJMTZtMzJcMDAwU1VCUl9GcEkxNm02NFwwMDBTVUJSX0ZwSTE2bTgwXDAwMFNVQlJfRnBJMzJtMzJcMDAwIg0KKyAgICAiU1VCUl9GcEkzMm02NFwwMDBTVUJSX0ZwSTMybTgwXDAwMFNVQlJfRnJTVDBcMDAwU1VCU0RybVwwMDBTVUJTRHJtX0ludFwwMDAiDQorICAgICJTVUJTRHJyXDAwMFNVQlNEcnJfSW50XDAwMFNVQlNTcm1cMDAwU1VCU1NybV9JbnRcMDAwU1VCU1NyclwwMDBTVUJTU3JyXyINCisgICAgIkludFwwMDBTVUJfRjMybVwwMDBTVUJfRjY0bVwwMDBTVUJfRkkxNm1cMDAwU1VCX0ZJMzJtXDAwMFNVQl9GUHJTVDBcMDAwIg0KKyAgICAiU1VCX0ZTVDByXDAwMFNVQl9GcDMyXDAwMFNVQl9GcDMybVwwMDBTVUJfRnA2NFwwMDBTVUJfRnA2NG1cMDAwU1VCX0ZwNjQiDQorICAgICJtMzJcMDAwU1VCX0ZwODBcMDAwU1VCX0ZwODBtMzJcMDAwU1VCX0ZwODBtNjRcMDAwU1VCX0ZwSTE2bTMyXDAwMFNVQl9GcCINCisgICAgIkkxNm02NFwwMDBTVUJfRnBJMTZtODBcMDAwU1VCX0ZwSTMybTMyXDAwMFNVQl9GcEkzMm02NFwwMDBTVUJfRnBJMzJtODBcMDAwIg0KKyAgICAiU1VCX0ZyU1QwXDAwMFNXQVBHU1wwMDBTWVNDQUxMXDAwMFNZU0VOVEVSXDAwMFNZU0VYSVRcMDAwU1lTRVhJVDY0XDAwMFMiDQorICAgICJZU1JFVFwwMDBUQUlMSk1QZFwwMDBUQUlMSk1QZDY0XDAwMFRBSUxKTVBtXDAwMFRBSUxKTVBtNjRcMDAwVEFJTEpNUHJcMDAwIg0KKyAgICAiVEFJTEpNUHI2NFwwMDBUQ1JFVFVSTmRpXDAwMFRDUkVUVVJOZGk2NFwwMDBUQ1JFVFVSTm1pXDAwMFRDUkVUVVJObWk2NFwwMDAiDQorICAgICJUQ1JFVFVSTnJpXDAwMFRDUkVUVVJOcmk2NFwwMDBURVNUMTZpMTZcMDAwVEVTVDE2bWlcMDAwVEVTVDE2cmlcMDAwVEVTVCINCisgICAgIjE2cm1cMDAwVEVTVDE2cnJcMDAwVEVTVDMyaTMyXDAwMFRFU1QzMm1pXDAwMFRFU1QzMnJpXDAwMFRFU1QzMnJtXDAwMFRFIg0KKyAgICAiU1QzMnJyXDAwMFRFU1Q2NGkzMlwwMDBURVNUNjRtaTMyXDAwMFRFU1Q2NHJpMzJcMDAwVEVTVDY0cm1cMDAwVEVTVDY0cnIiDQorICAgICJcMDAwVEVTVDhpOFwwMDBURVNUOG1pXDAwMFRFU1Q4cmlcMDAwVEVTVDhybVwwMDBURVNUOHJyXDAwMFRMU0NhbGxfMzJcMDAwIg0KKyAgICAiVExTQ2FsbF82NFwwMDBUTFNfYWRkcjMyXDAwMFRMU19hZGRyNjRcMDAwVFJBUFwwMDBUU1RfRlwwMDBUU1RfRnAzMlwwMDAiDQorICAgICJUU1RfRnA2NFwwMDBUU1RfRnA4MFwwMDBVQ09NSVNEcm1cMDAwVUNPTUlTRHJyXDAwMFVDT01JU1NybVwwMDBVQ09NSVNTciINCisgICAgInJcMDAwVUNPTV9GSVByXDAwMFVDT01fRklyXDAwMFVDT01fRlBQclwwMDBVQ09NX0ZQclwwMDBVQ09NX0ZwSXIzMlwwMDBVIg0KKyAgICAiQ09NX0ZwSXI2NFwwMDBVQ09NX0ZwSXI4MFwwMDBVQ09NX0ZwcjMyXDAwMFVDT01fRnByNjRcMDAwVUNPTV9GcHI4MFwwMDAiDQorICAgICJVQ09NX0ZyXDAwMFVOUENLSFBEcm1cMDAwVU5QQ0tIUERyclwwMDBVTlBDS0hQU3JtXDAwMFVOUENLSFBTcnJcMDAwVU5QQyINCisgICAgIktMUERybVwwMDBVTlBDS0xQRHJyXDAwMFVOUENLTFBTcm1cMDAwVU5QQ0tMUFNyclwwMDBWQUREUERZcm1cMDAwVkFERFBEIg0KKyAgICAiWXJyXDAwMFZBRERQRHJtXDAwMFZBRERQRHJyXDAwMFZBRERQU1lybVwwMDBWQUREUFNZcnJcMDAwVkFERFBTcm1cMDAwVkEiDQorICAgICJERFBTcnJcMDAwVkFERFNEcm1cMDAwVkFERFNEcm1fSW50XDAwMFZBRERTRHJyXDAwMFZBRERTRHJyX0ludFwwMDBWQUREUyINCisgICAgIlNybVwwMDBWQUREU1NybV9JbnRcMDAwVkFERFNTcnJcMDAwVkFERFNTcnJfSW50XDAwMFZBRERTVUJQRFlybVwwMDBWQUREIg0KKyAgICAiU1VCUERZcnJcMDAwVkFERFNVQlBEcm1cMDAwVkFERFNVQlBEcnJcMDAwVkFERFNVQlBTWXJtXDAwMFZBRERTVUJQU1lyclwwMDAiDQorICAgICJWQUREU1VCUFNybVwwMDBWQUREU1VCUFNyclwwMDBWQUVTREVDTEFTVHJtXDAwMFZBRVNERUNMQVNUcnJcMDAwVkFFU0RFQyINCisgICAgInJtXDAwMFZBRVNERUNyclwwMDBWQUVTRU5DTEFTVHJtXDAwMFZBRVNFTkNMQVNUcnJcMDAwVkFFU0VOQ3JtXDAwMFZBRVNFIg0KKyAgICAiTkNyclwwMDBWQUVTSU1Dcm1cMDAwVkFFU0lNQ3JyXDAwMFZBRVNLRVlHRU5BU1NJU1QxMjhybVwwMDBWQUVTS0VZR0VOQVMiDQorICAgICJTSVNUMTI4cnJcMDAwVkFORE5QRFlybVwwMDBWQU5ETlBEWXJyXDAwMFZBTkROUERybVwwMDBWQU5ETlBEcnJcMDAwVkFORCINCisgICAgIk5QU1lybVwwMDBWQU5ETlBTWXJyXDAwMFZBTkROUFNybVwwMDBWQU5ETlBTcnJcMDAwVkFORFBEWXJtXDAwMFZBTkRQRFlyIg0KKyAgICAiclwwMDBWQU5EUERybVwwMDBWQU5EUERyclwwMDBWQU5EUFNZcm1cMDAwVkFORFBTWXJyXDAwMFZBTkRQU3JtXDAwMFZBTkQiDQorICAgICJQU3JyXDAwMFZBU1RBUlRfU0FWRV9YTU1fUkVHU1wwMDBWQkxFTkRQRFlybWlcMDAwVkJMRU5EUERZcnJpXDAwMFZCTEVORCINCisgICAgIlBEcm1pXDAwMFZCTEVORFBEcnJpXDAwMFZCTEVORFBTWXJtaVwwMDBWQkxFTkRQU1lycmlcMDAwVkJMRU5EUFNybWlcMDAwIg0KKyAgICAiVkJMRU5EUFNycmlcMDAwVkJMRU5EVlBEWXJtXDAwMFZCTEVORFZQRFlyclwwMDBWQkxFTkRWUERybVwwMDBWQkxFTkRWUEQiDQorICAgICJyclwwMDBWQkxFTkRWUFNZcm1cMDAwVkJMRU5EVlBTWXJyXDAwMFZCTEVORFZQU3JtXDAwMFZCTEVORFZQU3JyXDAwMFZCUiINCisgICAgIk9BRENBU1RGMTI4XDAwMFZCUk9BRENBU1RTRFwwMDBWQlJPQURDQVNUU1NcMDAwVkJST0FEQ0FTVFNTWVwwMDBWQ01QUERZIg0KKyAgICAicm1pXDAwMFZDTVBQRFlybWlfYWx0XDAwMFZDTVBQRFlycmlcMDAwVkNNUFBEWXJyaV9hbHRcMDAwVkNNUFBEcm1pXDAwMFYiDQorICAgICJDTVBQRHJtaV9hbHRcMDAwVkNNUFBEcnJpXDAwMFZDTVBQRHJyaV9hbHRcMDAwVkNNUFBTWXJtaVwwMDBWQ01QUFNZcm1pXyINCisgICAgImFsdFwwMDBWQ01QUFNZcnJpXDAwMFZDTVBQU1lycmlfYWx0XDAwMFZDTVBQU3JtaVwwMDBWQ01QUFNybWlfYWx0XDAwMFZDIg0KKyAgICAiTVBQU3JyaVwwMDBWQ01QUFNycmlfYWx0XDAwMFZDTVBTRHJtXDAwMFZDTVBTRHJtX2FsdFwwMDBWQ01QU0RyclwwMDBWQ00iDQorICAgICJQU0Rycl9hbHRcMDAwVkNNUFNTcm1cMDAwVkNNUFNTcm1fYWx0XDAwMFZDTVBTU3JyXDAwMFZDTVBTU3JyX2FsdFwwMDBWQyINCisgICAgIk9NSVNEcm1cMDAwVkNPTUlTRHJyXDAwMFZDT01JU1NybVwwMDBWQ09NSVNTcnJcMDAwVkNWVERRMlBEWXJtXDAwMFZDVlREIg0KKyAgICAiUTJQRFlyclwwMDBWQ1ZURFEyUERybVwwMDBWQ1ZURFEyUERyclwwMDBWQ1ZURFEyUFNZcm1cMDAwVkNWVERRMlBTWXJyXDAwMCINCisgICAgIlZDVlREUTJQU3JtXDAwMFZDVlREUTJQU3JyXDAwMFZDVlRQRDJEUVhyWXJcMDAwVkNWVFBEMkRRWHJtXDAwMFZDVlRQRDJEIg0KKyAgICAiUVhyclwwMDBWQ1ZUUEQyRFFZcm1cMDAwVkNWVFBEMkRRWXJyXDAwMFZDVlRQRDJEUXJyXDAwMFZDVlRQRDJQU1hyWXJcMDAwIg0KKyAgICAiVkNWVFBEMlBTWHJtXDAwMFZDVlRQRDJQU1hyclwwMDBWQ1ZUUEQyUFNZcm1cMDAwVkNWVFBEMlBTWXJyXDAwMFZDVlRQRDIiDQorICAgICJQU3JyXDAwMFZDVlRQUzJEUVlybVwwMDBWQ1ZUUFMyRFFZcnJcMDAwVkNWVFBTMkRRcm1cMDAwVkNWVFBTMkRRcnJcMDAwViINCisgICAgIkNWVFBTMlBEWXJtXDAwMFZDVlRQUzJQRFlyclwwMDBWQ1ZUUFMyUERybVwwMDBWQ1ZUUFMyUERyclwwMDBWQ1ZUU0QyU0k2Ig0KKyAgICAiNHJtXDAwMFZDVlRTRDJTSTY0cnJcMDAwVkNWVFNEMlNJX2FsdHJtXDAwMFZDVlRTRDJTSV9hbHRyclwwMDBWQ1ZUU0QyU1MiDQorICAgICJybVwwMDBWQ1ZUU0QyU1NyclwwMDBWQ1ZUU0kyU0Q2NHJtXDAwMFZDVlRTSTJTRDY0cnJcMDAwVkNWVFNJMlNETHJtXDAwMCINCisgICAgIlZDVlRTSTJTRExyclwwMDBWQ1ZUU0kyU0RybVwwMDBWQ1ZUU0kyU0RyclwwMDBWQ1ZUU0kyU1M2NHJtXDAwMFZDVlRTSTJTIg0KKyAgICAiUzY0cnJcMDAwVkNWVFNJMlNTcm1cMDAwVkNWVFNJMlNTcnJcMDAwVkNWVFNTMlNEcm1cMDAwVkNWVFNTMlNEcnJcMDAwVkMiDQorICAgICJWVFNTMlNJNjRybVwwMDBWQ1ZUU1MyU0k2NHJyXDAwMFZDVlRTUzJTSXJtXDAwMFZDVlRTUzJTSXJyXDAwMFZDVlRUUEQyRCINCisgICAgIlFYcllyXDAwMFZDVlRUUEQyRFFYcm1cMDAwVkNWVFRQRDJEUVhyclwwMDBWQ1ZUVFBEMkRRWXJtXDAwMFZDVlRUUEQyRFFZIg0KKyAgICAicnJcMDAwVkNWVFRQRDJEUXJyXDAwMFZDVlRUUFMyRFFZcm1cMDAwVkNWVFRQUzJEUVlyclwwMDBWQ1ZUVFBTMkRRcm1cMDAwIg0KKyAgICAiVkNWVFRQUzJEUXJyXDAwMFZDVlRUU0QyU0k2NHJtXDAwMFZDVlRUU0QyU0k2NHJyXDAwMFZDVlRUU0QyU0lybVwwMDBWQ1YiDQorICAgICJUVFNEMlNJcnJcMDAwVkNWVFRTUzJTSTY0cm1cMDAwVkNWVFRTUzJTSTY0cnJcMDAwVkNWVFRTUzJTSXJtXDAwMFZDVlRUUyINCisgICAgIlMyU0lyclwwMDBWRElWUERZcm1cMDAwVkRJVlBEWXJyXDAwMFZESVZQRHJtXDAwMFZESVZQRHJyXDAwMFZESVZQU1lybVwwMDAiDQorICAgICJWRElWUFNZcnJcMDAwVkRJVlBTcm1cMDAwVkRJVlBTcnJcMDAwVkRJVlNEcm1cMDAwVkRJVlNEcm1fSW50XDAwMFZESVZTRCINCisgICAgInJyXDAwMFZESVZTRHJyX0ludFwwMDBWRElWU1NybVwwMDBWRElWU1NybV9JbnRcMDAwVkRJVlNTcnJcMDAwVkRJVlNTcnJfIg0KKyAgICAiSW50XDAwMFZEUFBEcm1pXDAwMFZEUFBEcnJpXDAwMFZEUFBTWXJtaVwwMDBWRFBQU1lycmlcMDAwVkRQUFNybWlcMDAwVkQiDQorICAgICJQUFNycmlcMDAwVkVSUm1cMDAwVkVSUnJcMDAwVkVSV21cMDAwVkVSV3JcMDAwVkVYVFJBQ1RGMTI4bXJcMDAwVkVYVFJBQyINCisgICAgIlRGMTI4cnJcMDAwVkVYVFJBQ1RQU21yXDAwMFZFWFRSQUNUUFNyclwwMDBWRVhUUkFDVFBTcnI2NFwwMDBWRk1BRERQRHIxIg0KKyAgICAiMzJtXDAwMFZGTUFERFBEcjEzMm1ZXDAwMFZGTUFERFBEcjEzMnJcMDAwVkZNQUREUERyMTMycllcMDAwVkZNQUREUERyMjEiDQorICAgICIzbVwwMDBWRk1BRERQRHIyMTNtWVwwMDBWRk1BRERQRHIyMTNyXDAwMFZGTUFERFBEcjIxM3JZXDAwMFZGTUFERFBEcjIzMSINCisgICAgIm1cMDAwVkZNQUREUERyMjMxbVlcMDAwVkZNQUREUERyMjMxclwwMDBWRk1BRERQRHIyMzFyWVwwMDBWRk1BRERQU3IxMzJtIg0KKyAgICAiXDAwMFZGTUFERFBTcjEzMm1ZXDAwMFZGTUFERFBTcjEzMnJcMDAwVkZNQUREUFNyMTMycllcMDAwVkZNQUREUFNyMjEzbVwwMDAiDQorICAgICJWRk1BRERQU3IyMTNtWVwwMDBWRk1BRERQU3IyMTNyXDAwMFZGTUFERFBTcjIxM3JZXDAwMFZGTUFERFBTcjIzMW1cMDAwViINCisgICAgIkZNQUREUFNyMjMxbVlcMDAwVkZNQUREUFNyMjMxclwwMDBWRk1BRERQU3IyMzFyWVwwMDBWRk1BRERTVUJQRHIxMzJtXDAwMCINCisgICAgIlZGTUFERFNVQlBEcjEzMm1ZXDAwMFZGTUFERFNVQlBEcjEzMnJcMDAwVkZNQUREU1VCUERyMTMycllcMDAwVkZNQUREU1VCIg0KKyAgICAiUERyMjEzbVwwMDBWRk1BRERTVUJQRHIyMTNtWVwwMDBWRk1BRERTVUJQRHIyMTNyXDAwMFZGTUFERFNVQlBEcjIxM3JZXDAwMCINCisgICAgIlZGTUFERFNVQlBEcjIzMW1cMDAwVkZNQUREU1VCUERyMjMxbVlcMDAwVkZNQUREU1VCUERyMjMxclwwMDBWRk1BRERTVUJQIg0KKyAgICAiRHIyMzFyWVwwMDBWRk1BRERTVUJQU3IxMzJtXDAwMFZGTUFERFNVQlBTcjEzMm1ZXDAwMFZGTUFERFNVQlBTcjEzMnJcMDAwIg0KKyAgICAiVkZNQUREU1VCUFNyMTMycllcMDAwVkZNQUREU1VCUFNyMjEzbVwwMDBWRk1BRERTVUJQU3IyMTNtWVwwMDBWRk1BRERTVUIiDQorICAgICJQU3IyMTNyXDAwMFZGTUFERFNVQlBTcjIxM3JZXDAwMFZGTUFERFNVQlBTcjIzMW1cMDAwVkZNQUREU1VCUFNyMjMxbVlcMDAwIg0KKyAgICAiVkZNQUREU1VCUFNyMjMxclwwMDBWRk1BRERTVUJQU3IyMzFyWVwwMDBWRk1TVUJBRERQRHIxMzJtXDAwMFZGTVNVQkFERFAiDQorICAgICJEcjEzMm1ZXDAwMFZGTVNVQkFERFBEcjEzMnJcMDAwVkZNU1VCQUREUERyMTMycllcMDAwVkZNU1VCQUREUERyMjEzbVwwMDAiDQorICAgICJWRk1TVUJBRERQRHIyMTNtWVwwMDBWRk1TVUJBRERQRHIyMTNyXDAwMFZGTVNVQkFERFBEcjIxM3JZXDAwMFZGTVNVQkFERCINCisgICAgIlBEcjIzMW1cMDAwVkZNU1VCQUREUERyMjMxbVlcMDAwVkZNU1VCQUREUERyMjMxclwwMDBWRk1TVUJBRERQRHIyMzFyWVwwMDAiDQorICAgICJWRk1TVUJBRERQU3IxMzJtXDAwMFZGTVNVQkFERFBTcjEzMm1ZXDAwMFZGTVNVQkFERFBTcjEzMnJcMDAwVkZNU1VCQUREUCINCisgICAgIlNyMTMycllcMDAwVkZNU1VCQUREUFNyMjEzbVwwMDBWRk1TVUJBRERQU3IyMTNtWVwwMDBWRk1TVUJBRERQU3IyMTNyXDAwMCINCisgICAgIlZGTVNVQkFERFBTcjIxM3JZXDAwMFZGTVNVQkFERFBTcjIzMW1cMDAwVkZNU1VCQUREUFNyMjMxbVlcMDAwVkZNU1VCQUREIg0KKyAgICAiUFNyMjMxclwwMDBWRk1TVUJBRERQU3IyMzFyWVwwMDBWRk1TVUJQRHIxMzJtXDAwMFZGTVNVQlBEcjEzMm1ZXDAwMFZGTVMiDQorICAgICJVQlBEcjEzMnJcMDAwVkZNU1VCUERyMTMycllcMDAwVkZNU1VCUERyMjEzbVwwMDBWRk1TVUJQRHIyMTNtWVwwMDBWRk1TVSINCisgICAgIkJQRHIyMTNyXDAwMFZGTVNVQlBEcjIxM3JZXDAwMFZGTVNVQlBEcjIzMW1cMDAwVkZNU1VCUERyMjMxbVlcMDAwVkZNU1VCIg0KKyAgICAiUERyMjMxclwwMDBWRk1TVUJQRHIyMzFyWVwwMDBWRk1TVUJQU3IxMzJtXDAwMFZGTVNVQlBTcjEzMm1ZXDAwMFZGTVNVQlAiDQorICAgICJTcjEzMnJcMDAwVkZNU1VCUFNyMTMycllcMDAwVkZNU1VCUFNyMjEzbVwwMDBWRk1TVUJQU3IyMTNtWVwwMDBWRk1TVUJQUyINCisgICAgInIyMTNyXDAwMFZGTVNVQlBTcjIxM3JZXDAwMFZGTVNVQlBTcjIzMW1cMDAwVkZNU1VCUFNyMjMxbVlcMDAwVkZNU1VCUFNyIg0KKyAgICAiMjMxclwwMDBWRk1TVUJQU3IyMzFyWVwwMDBWRk5NQUREUERyMTMybVwwMDBWRk5NQUREUERyMTMybVlcMDAwVkZOTUFERFAiDQorICAgICJEcjEzMnJcMDAwVkZOTUFERFBEcjEzMnJZXDAwMFZGTk1BRERQRHIyMTNtXDAwMFZGTk1BRERQRHIyMTNtWVwwMDBWRk5NQSINCisgICAgIkREUERyMjEzclwwMDBWRk5NQUREUERyMjEzcllcMDAwVkZOTUFERFBEcjIzMW1cMDAwVkZOTUFERFBEcjIzMW1ZXDAwMFZGIg0KKyAgICAiTk1BRERQRHIyMzFyXDAwMFZGTk1BRERQRHIyMzFyWVwwMDBWRk5NQUREUFNyMTMybVwwMDBWRk5NQUREUFNyMTMybVlcMDAwIg0KKyAgICAiVkZOTUFERFBTcjEzMnJcMDAwVkZOTUFERFBTcjEzMnJZXDAwMFZGTk1BRERQU3IyMTNtXDAwMFZGTk1BRERQU3IyMTNtWVwwMDAiDQorICAgICJWRk5NQUREUFNyMjEzclwwMDBWRk5NQUREUFNyMjEzcllcMDAwVkZOTUFERFBTcjIzMW1cMDAwVkZOTUFERFBTcjIzMW1ZXDAwMCINCisgICAgIlZGTk1BRERQU3IyMzFyXDAwMFZGTk1BRERQU3IyMzFyWVwwMDBWRk5NU1VCUERyMTMybVwwMDBWRk5NU1VCUERyMTMybVlcMDAwIg0KKyAgICAiVkZOTVNVQlBEcjEzMnJcMDAwVkZOTVNVQlBEcjEzMnJZXDAwMFZGTk1TVUJQRHIyMTNtXDAwMFZGTk1TVUJQRHIyMTNtWVwwMDAiDQorICAgICJWRk5NU1VCUERyMjEzclwwMDBWRk5NU1VCUERyMjEzcllcMDAwVkZOTVNVQlBEcjIzMW1cMDAwVkZOTVNVQlBEcjIzMW1ZXDAwMCINCisgICAgIlZGTk1TVUJQRHIyMzFyXDAwMFZGTk1TVUJQRHIyMzFyWVwwMDBWRk5NU1VCUFNyMTMybVwwMDBWRk5NU1VCUFNyMTMybVlcMDAwIg0KKyAgICAiVkZOTVNVQlBTcjEzMnJcMDAwVkZOTVNVQlBTcjEzMnJZXDAwMFZGTk1TVUJQU3IyMTNtXDAwMFZGTk1TVUJQU3IyMTNtWVwwMDAiDQorICAgICJWRk5NU1VCUFNyMjEzclwwMDBWRk5NU1VCUFNyMjEzcllcMDAwVkZOTVNVQlBTcjIzMW1cMDAwVkZOTVNVQlBTcjIzMW1ZXDAwMCINCisgICAgIlZGTk1TVUJQU3IyMzFyXDAwMFZGTk1TVUJQU3IyMzFyWVwwMDBWRnNBTkROUERybVwwMDBWRnNBTkROUERyclwwMDBWRnNBIg0KKyAgICAiTkROUFNybVwwMDBWRnNBTkROUFNyclwwMDBWRnNBTkRQRHJtXDAwMFZGc0FORFBEcnJcMDAwVkZzQU5EUFNybVwwMDBWRnMiDQorICAgICJBTkRQU3JyXDAwMFZGc09SUERybVwwMDBWRnNPUlBEcnJcMDAwVkZzT1JQU3JtXDAwMFZGc09SUFNyclwwMDBWRnNYT1JQRCINCisgICAgInJtXDAwMFZGc1hPUlBEcnJcMDAwVkZzWE9SUFNybVwwMDBWRnNYT1JQU3JyXDAwMFZIQUREUERZcm1cMDAwVkhBRERQRFlyIg0KKyAgICAiclwwMDBWSEFERFBEcm1cMDAwVkhBRERQRHJyXDAwMFZIQUREUFNZcm1cMDAwVkhBRERQU1lyclwwMDBWSEFERFBTcm1cMDAwIg0KKyAgICAiVkhBRERQU3JyXDAwMFZIU1VCUERZcm1cMDAwVkhTVUJQRFlyclwwMDBWSFNVQlBEcm1cMDAwVkhTVUJQRHJyXDAwMFZIU1UiDQorICAgICJCUFNZcm1cMDAwVkhTVUJQU1lyclwwMDBWSFNVQlBTcm1cMDAwVkhTVUJQU3JyXDAwMFZJTlNFUlRGMTI4cm1cMDAwVklOUyINCisgICAgIkVSVEYxMjhyclwwMDBWSU5TRVJUUFNybVwwMDBWSU5TRVJUUFNyclwwMDBWTEREUVVZcm1cMDAwVkxERFFVcm1cMDAwVkxEIg0KKyAgICAiTVhDU1JcMDAwVk1BU0tNT1ZEUVVcMDAwVk1BU0tNT1ZEUVU2NFwwMDBWTUFTS01PVlBEWW1yXDAwMFZNQVNLTU9WUERZcm0iDQorICAgICJcMDAwVk1BU0tNT1ZQRG1yXDAwMFZNQVNLTU9WUERybVwwMDBWTUFTS01PVlBTWW1yXDAwMFZNQVNLTU9WUFNZcm1cMDAwViINCisgICAgIk1BU0tNT1ZQU21yXDAwMFZNQVNLTU9WUFNybVwwMDBWTUFYUERZcm1cMDAwVk1BWFBEWXJtX0ludFwwMDBWTUFYUERZcnJcMDAwIg0KKyAgICAiVk1BWFBEWXJyX0ludFwwMDBWTUFYUERybVwwMDBWTUFYUERybV9JbnRcMDAwVk1BWFBEcnJcMDAwVk1BWFBEcnJfSW50XDAwMCINCisgICAgIlZNQVhQU1lybVwwMDBWTUFYUFNZcm1fSW50XDAwMFZNQVhQU1lyclwwMDBWTUFYUFNZcnJfSW50XDAwMFZNQVhQU3JtXDAwMCINCisgICAgIlZNQVhQU3JtX0ludFwwMDBWTUFYUFNyclwwMDBWTUFYUFNycl9JbnRcMDAwVk1BWFNEcm1cMDAwVk1BWFNEcm1fSW50XDAwMCINCisgICAgIlZNQVhTRHJyXDAwMFZNQVhTRHJyX0ludFwwMDBWTUFYU1NybVwwMDBWTUFYU1NybV9JbnRcMDAwVk1BWFNTcnJcMDAwVk1BIg0KKyAgICAiWFNTcnJfSW50XDAwMFZNQ0FMTFwwMDBWTUNMRUFSbVwwMDBWTUlOUERZcm1cMDAwVk1JTlBEWXJtX0ludFwwMDBWTUlOUEQiDQorICAgICJZcnJcMDAwVk1JTlBEWXJyX0ludFwwMDBWTUlOUERybVwwMDBWTUlOUERybV9JbnRcMDAwVk1JTlBEcnJcMDAwVk1JTlBEciINCisgICAgInJfSW50XDAwMFZNSU5QU1lybVwwMDBWTUlOUFNZcm1fSW50XDAwMFZNSU5QU1lyclwwMDBWTUlOUFNZcnJfSW50XDAwMFZNIg0KKyAgICAiSU5QU3JtXDAwMFZNSU5QU3JtX0ludFwwMDBWTUlOUFNyclwwMDBWTUlOUFNycl9JbnRcMDAwVk1JTlNEcm1cMDAwVk1JTlMiDQorICAgICJEcm1fSW50XDAwMFZNSU5TRHJyXDAwMFZNSU5TRHJyX0ludFwwMDBWTUlOU1NybVwwMDBWTUlOU1NybV9JbnRcMDAwVk1JTiINCisgICAgIlNTcnJcMDAwVk1JTlNTcnJfSW50XDAwMFZNTEFVTkNIXDAwMFZNT1ZBUERZbXJcMDAwVk1PVkFQRFlybVwwMDBWTU9WQVBEIg0KKyAgICAiWXJyXDAwMFZNT1ZBUERtclwwMDBWTU9WQVBEcm1cMDAwVk1PVkFQRHJyXDAwMFZNT1ZBUFNZbXJcMDAwVk1PVkFQU1lybVwwMDAiDQorICAgICJWTU9WQVBTWXJyXDAwMFZNT1ZBUFNtclwwMDBWTU9WQVBTcm1cMDAwVk1PVkFQU3JyXDAwMFZNT1ZERFVQWXJtXDAwMFZNTyINCisgICAgIlZERFVQWXJyXDAwMFZNT1ZERFVQcm1cMDAwVk1PVkREVVByclwwMDBWTU9WREkyUERJcm1cMDAwVk1PVkRJMlBESXJyXDAwMCINCisgICAgIlZNT1ZESTJTU3JtXDAwMFZNT1ZESTJTU3JyXDAwMFZNT1ZEUUFZbXJcMDAwVk1PVkRRQVlybVwwMDBWTU9WRFFBWXJyXDAwMCINCisgICAgIlZNT1ZEUUFtclwwMDBWTU9WRFFBcm1cMDAwVk1PVkRRQXJyXDAwMFZNT1ZEUVVZbXJcMDAwVk1PVkRRVVlybVwwMDBWTU9WIg0KKyAgICAiRFFVWXJyXDAwMFZNT1ZEUVVtclwwMDBWTU9WRFFVbXJfSW50XDAwMFZNT1ZEUVVybVwwMDBWTU9WRFFVcm1fSW50XDAwMFYiDQorICAgICJNT1ZEUVVyclwwMDBWTU9WSExQU3JyXDAwMFZNT1ZIUERtclwwMDBWTU9WSFBEcm1cMDAwVk1PVkhQU21yXDAwMFZNT1ZIUCINCisgICAgIlNybVwwMDBWTU9WTEhQU3JyXDAwMFZNT1ZMUERtclwwMDBWTU9WTFBEcm1cMDAwVk1PVkxQU21yXDAwMFZNT1ZMUFNybVwwMDAiDQorICAgICJWTU9WTFExMjhtclwwMDBWTU9WTVNLUERZcjY0clwwMDBWTU9WTVNLUERZcnJcMDAwVk1PVk1TS1BEcjY0clwwMDBWTU9WTSINCisgICAgIlNLUERyclwwMDBWTU9WTVNLUFNZcjY0clwwMDBWTU9WTVNLUFNZcnJcMDAwVk1PVk1TS1BTcjY0clwwMDBWTU9WTVNLUFNyIg0KKyAgICAiclwwMDBWTU9WTlREUUFybVwwMDBWTU9WTlREUVlfNjRtclwwMDBWTU9WTlREUVltclwwMDBWTU9WTlREUV82NG1yXDAwMFYiDQorICAgICJNT1ZOVERRbXJcMDAwVk1PVk5URFFtcl9JbnRcMDAwVk1PVk5UUERZbXJcMDAwVk1PVk5UUERtclwwMDBWTU9WTlRQRG1yXyINCisgICAgIkludFwwMDBWTU9WTlRQU1ltclwwMDBWTU9WTlRQU21yXDAwMFZNT1ZOVFBTbXJfSW50XDAwMFZNT1ZQREkyREltclwwMDBWIg0KKyAgICAiTU9WUERJMkRJcnJcMDAwVk1PVlBRSTJRSW1yXDAwMFZNT1ZRSTJQUUlybVwwMDBWTU9WUWQ2NHJyXDAwMFZNT1ZRZDY0cnIiDQorICAgICJfYWx0XDAwMFZNT1ZRczY0cnJcMDAwVk1PVlF4cnhyXDAwMFZNT1ZTRG1yXDAwMFZNT1ZTRHJtXDAwMFZNT1ZTRHJyXDAwMCINCisgICAgIlZNT1ZTSERVUFlybVwwMDBWTU9WU0hEVVBZcnJcMDAwVk1PVlNIRFVQcm1cMDAwVk1PVlNIRFVQcnJcMDAwVk1PVlNMRFVQIg0KKyAgICAiWXJtXDAwMFZNT1ZTTERVUFlyclwwMDBWTU9WU0xEVVBybVwwMDBWTU9WU0xEVVByclwwMDBWTU9WU1MyREltclwwMDBWTU8iDQorICAgICJWU1MyRElyclwwMDBWTU9WU1NtclwwMDBWTU9WU1NybVwwMDBWTU9WU1NyclwwMDBWTU9WVVBEWW1yXDAwMFZNT1ZVUERZciINCisgICAgIm1cMDAwVk1PVlVQRFlyclwwMDBWTU9WVVBEbXJcMDAwVk1PVlVQRG1yX0ludFwwMDBWTU9WVVBEcm1cMDAwVk1PVlVQRHJtIg0KKyAgICAiX0ludFwwMDBWTU9WVVBEcnJcMDAwVk1PVlVQU1ltclwwMDBWTU9WVVBTWXJtXDAwMFZNT1ZVUFNZcnJcMDAwVk1PVlVQU20iDQorICAgICJyXDAwMFZNT1ZVUFNtcl9JbnRcMDAwVk1PVlVQU3JtXDAwMFZNT1ZVUFNybV9JbnRcMDAwVk1PVlVQU3JyXDAwMFZNT1ZaRCINCisgICAgIkkyUERJcm1cMDAwVk1PVlpESTJQRElyclwwMDBWTU9WWlBRSUxvMlBRSXJtXDAwMFZNT1ZaUFFJTG8yUFFJcnJcMDAwVk1PIg0KKyAgICAiVlpRSTJQUUlybVwwMDBWTU9WWlFJMlBRSXJyXDAwMFZNUFNBREJXcm1pXDAwMFZNUFNBREJXcnJpXDAwMFZNUFRSTERtXDAwMCINCisgICAgIlZNUFRSU1RtXDAwMFZNUkVBRDMycm1cMDAwVk1SRUFEMzJyclwwMDBWTVJFQUQ2NHJtXDAwMFZNUkVBRDY0cnJcMDAwVk1SIg0KKyAgICAiRVNVTUVcMDAwVk1VTFBEWXJtXDAwMFZNVUxQRFlyclwwMDBWTVVMUERybVwwMDBWTVVMUERyclwwMDBWTVVMUFNZcm1cMDAwIg0KKyAgICAiVk1VTFBTWXJyXDAwMFZNVUxQU3JtXDAwMFZNVUxQU3JyXDAwMFZNVUxTRHJtXDAwMFZNVUxTRHJtX0ludFwwMDBWTVVMU0QiDQorICAgICJyclwwMDBWTVVMU0Rycl9JbnRcMDAwVk1VTFNTcm1cMDAwVk1VTFNTcm1fSW50XDAwMFZNVUxTU3JyXDAwMFZNVUxTU3JyXyINCisgICAgIkludFwwMDBWTVdSSVRFMzJybVwwMDBWTVdSSVRFMzJyclwwMDBWTVdSSVRFNjRybVwwMDBWTVdSSVRFNjRyclwwMDBWTVhPIg0KKyAgICAiRkZcMDAwVk1YT05cMDAwVk9SUERZcm1cMDAwVk9SUERZcnJcMDAwVk9SUERybVwwMDBWT1JQRHJyXDAwMFZPUlBTWXJtXDAwMCINCisgICAgIlZPUlBTWXJyXDAwMFZPUlBTcm1cMDAwVk9SUFNyclwwMDBWUEFCU0JybTEyOFwwMDBWUEFCU0JybTY0XDAwMFZQQUJTQnJyIg0KKyAgICAiMTI4XDAwMFZQQUJTQnJyNjRcMDAwVlBBQlNEcm0xMjhcMDAwVlBBQlNEcm02NFwwMDBWUEFCU0RycjEyOFwwMDBWUEFCU0QiDQorICAgICJycjY0XDAwMFZQQUJTV3JtMTI4XDAwMFZQQUJTV3JtNjRcMDAwVlBBQlNXcnIxMjhcMDAwVlBBQlNXcnI2NFwwMDBWUEFDSyINCisgICAgIlNTRFdybVwwMDBWUEFDS1NTRFdyclwwMDBWUEFDS1NTV0JybVwwMDBWUEFDS1NTV0JyclwwMDBWUEFDS1VTRFdybVwwMDBWIg0KKyAgICAiUEFDS1VTRFdyclwwMDBWUEFDS1VTV0JybVwwMDBWUEFDS1VTV0JyclwwMDBWUEFEREJybVwwMDBWUEFEREJyclwwMDBWUEEiDQorICAgICJERERybVwwMDBWUEFERERyclwwMDBWUEFERFFybVwwMDBWUEFERFFyclwwMDBWUEFERFNCcm1cMDAwVlBBRERTQnJyXDAwMCINCisgICAgIlZQQUREU1dybVwwMDBWUEFERFNXcnJcMDAwVlBBRERVU0JybVwwMDBWUEFERFVTQnJyXDAwMFZQQUREVVNXcm1cMDAwVlBBIg0KKyAgICAiRERVU1dyclwwMDBWUEFERFdybVwwMDBWUEFERFdyclwwMDBWUEFMSUdOUjEyOHJtXDAwMFZQQUxJR05SMTI4cnJcMDAwVlAiDQorICAgICJBTElHTlI2NHJtXDAwMFZQQUxJR05SNjRyclwwMDBWUEFORE5ybVwwMDBWUEFORE5yclwwMDBWUEFORHJtXDAwMFZQQU5EciINCisgICAgInJcMDAwVlBBVkdCcm1cMDAwVlBBVkdCcnJcMDAwVlBBVkdXcm1cMDAwVlBBVkdXcnJcMDAwVlBCTEVORFZCcm1cMDAwVlBCIg0KKyAgICAiTEVORFZCcnJcMDAwVlBCTEVORFdybWlcMDAwVlBCTEVORFdycmlcMDAwVlBDTE1VTEhRSFFEUXJtXDAwMFZQQ0xNVUxIUUgiDQorICAgICJRRFFyclwwMDBWUENMTVVMSFFMUURRcm1cMDAwVlBDTE1VTEhRTFFEUXJyXDAwMFZQQ0xNVUxMUUhRRFFybVwwMDBWUENMTSINCisgICAgIlVMTFFIUURRcnJcMDAwVlBDTE1VTExRTFFEUXJtXDAwMFZQQ0xNVUxMUUxRRFFyclwwMDBWUENMTVVMUURRcm1cMDAwVlBDIg0KKyAgICAiTE1VTFFEUXJyXDAwMFZQQ01QRVFCcm1cMDAwVlBDTVBFUUJyclwwMDBWUENNUEVRRHJtXDAwMFZQQ01QRVFEcnJcMDAwVlAiDQorICAgICJDTVBFUVFybVwwMDBWUENNUEVRUXJyXDAwMFZQQ01QRVFXcm1cMDAwVlBDTVBFUVdyclwwMDBWUENNUEVTVFJJQXJtXDAwMCINCisgICAgIlZQQ01QRVNUUklBcnJcMDAwVlBDTVBFU1RSSUNybVwwMDBWUENNUEVTVFJJQ3JyXDAwMFZQQ01QRVNUUklPcm1cMDAwVlBDIg0KKyAgICAiTVBFU1RSSU9yclwwMDBWUENNUEVTVFJJU3JtXDAwMFZQQ01QRVNUUklTcnJcMDAwVlBDTVBFU1RSSVpybVwwMDBWUENNUEUiDQorICAgICJTVFJJWnJyXDAwMFZQQ01QRVNUUklybVwwMDBWUENNUEVTVFJJcnJcMDAwVlBDTVBFU1RSTTEyOE1FTVwwMDBWUENNUEVTVCINCisgICAgIlJNMTI4UkVHXDAwMFZQQ01QRVNUUk0xMjhybVwwMDBWUENNUEVTVFJNMTI4cnJcMDAwVlBDTVBHVEJybVwwMDBWUENNUEdUIg0KKyAgICAiQnJyXDAwMFZQQ01QR1REcm1cMDAwVlBDTVBHVERyclwwMDBWUENNUEdUUXJtXDAwMFZQQ01QR1RRcnJcMDAwVlBDTVBHVFciDQorICAgICJybVwwMDBWUENNUEdUV3JyXDAwMFZQQ01QSVNUUklBcm1cMDAwVlBDTVBJU1RSSUFyclwwMDBWUENNUElTVFJJQ3JtXDAwMCINCisgICAgIlZQQ01QSVNUUklDcnJcMDAwVlBDTVBJU1RSSU9ybVwwMDBWUENNUElTVFJJT3JyXDAwMFZQQ01QSVNUUklTcm1cMDAwVlBDIg0KKyAgICAiTVBJU1RSSVNyclwwMDBWUENNUElTVFJJWnJtXDAwMFZQQ01QSVNUUklacnJcMDAwVlBDTVBJU1RSSXJtXDAwMFZQQ01QSVMiDQorICAgICJUUklyclwwMDBWUENNUElTVFJNMTI4TUVNXDAwMFZQQ01QSVNUUk0xMjhSRUdcMDAwVlBDTVBJU1RSTTEyOHJtXDAwMFZQQyINCisgICAgIk1QSVNUUk0xMjhyclwwMDBWUEVSTTJGMTI4cm1cMDAwVlBFUk0yRjEyOHJyXDAwMFZQRVJNSUxQRFltaVwwMDBWUEVSTUlMIg0KKyAgICAiUERZcmlcMDAwVlBFUk1JTFBEWXJtXDAwMFZQRVJNSUxQRFlyclwwMDBWUEVSTUlMUERtaVwwMDBWUEVSTUlMUERyaVwwMDAiDQorICAgICJWUEVSTUlMUERybVwwMDBWUEVSTUlMUERyclwwMDBWUEVSTUlMUFNZbWlcMDAwVlBFUk1JTFBTWXJpXDAwMFZQRVJNSUxQUyINCisgICAgIllybVwwMDBWUEVSTUlMUFNZcnJcMDAwVlBFUk1JTFBTbWlcMDAwVlBFUk1JTFBTcmlcMDAwVlBFUk1JTFBTcm1cMDAwVlBFIg0KKyAgICAiUk1JTFBTcnJcMDAwVlBFWFRSQm1yXDAwMFZQRVhUUkJyclwwMDBWUEVYVFJCcnI2NFwwMDBWUEVYVFJEbXJcMDAwVlBFWFQiDQorICAgICJSRHJyXDAwMFZQRVhUUlFtclwwMDBWUEVYVFJRcnJcMDAwVlBFWFRSV21yXDAwMFZQRVhUUldyaVwwMDBWUEhBREREcm0xMiINCisgICAgIjhcMDAwVlBIQURERHJtNjRcMDAwVlBIQURERHJyMTI4XDAwMFZQSEFERERycjY0XDAwMFZQSEFERFNXcm0xMjhcMDAwVlBIIg0KKyAgICAiQUREU1dybTY0XDAwMFZQSEFERFNXcnIxMjhcMDAwVlBIQUREU1dycjY0XDAwMFZQSEFERFdybTEyOFwwMDBWUEhBRERXcm0iDQorICAgICI2NFwwMDBWUEhBRERXcnIxMjhcMDAwVlBIQUREV3JyNjRcMDAwVlBITUlOUE9TVVdybTEyOFwwMDBWUEhNSU5QT1NVV3JyMSINCisgICAgIjI4XDAwMFZQSFNVQkRybTEyOFwwMDBWUEhTVUJEcm02NFwwMDBWUEhTVUJEcnIxMjhcMDAwVlBIU1VCRHJyNjRcMDAwVlBIIg0KKyAgICAiU1VCU1dybTEyOFwwMDBWUEhTVUJTV3JtNjRcMDAwVlBIU1VCU1dycjEyOFwwMDBWUEhTVUJTV3JyNjRcMDAwVlBIU1VCV3IiDQorICAgICJtMTI4XDAwMFZQSFNVQldybTY0XDAwMFZQSFNVQldycjEyOFwwMDBWUEhTVUJXcnI2NFwwMDBWUElOU1JCcm1cMDAwVlBJTiINCisgICAgIlNSQnJyXDAwMFZQSU5TUkRybVwwMDBWUElOU1JEcnJcMDAwVlBJTlNSUXJtXDAwMFZQSU5TUlFyclwwMDBWUElOU1JXcm1pIg0KKyAgICAiXDAwMFZQSU5TUldycjY0aVwwMDBWUElOU1JXcnJpXDAwMFZQTUFERFVCU1dybTEyOFwwMDBWUE1BRERVQlNXcm02NFwwMDAiDQorICAgICJWUE1BRERVQlNXcnIxMjhcMDAwVlBNQUREVUJTV3JyNjRcMDAwVlBNQUREV0RybVwwMDBWUE1BRERXRHJyXDAwMFZQTUFYUyINCisgICAgIkJybVwwMDBWUE1BWFNCcnJcMDAwVlBNQVhTRHJtXDAwMFZQTUFYU0RyclwwMDBWUE1BWFNXcm1cMDAwVlBNQVhTV3JyXDAwMCINCisgICAgIlZQTUFYVUJybVwwMDBWUE1BWFVCcnJcMDAwVlBNQVhVRHJtXDAwMFZQTUFYVURyclwwMDBWUE1BWFVXcm1cMDAwVlBNQVhVIg0KKyAgICAiV3JyXDAwMFZQTUlOU0JybVwwMDBWUE1JTlNCcnJcMDAwVlBNSU5TRHJtXDAwMFZQTUlOU0RyclwwMDBWUE1JTlNXcm1cMDAwIg0KKyAgICAiVlBNSU5TV3JyXDAwMFZQTUlOVUJybVwwMDBWUE1JTlVCcnJcMDAwVlBNSU5VRHJtXDAwMFZQTUlOVURyclwwMDBWUE1JTlUiDQorICAgICJXcm1cMDAwVlBNSU5VV3JyXDAwMFZQTU9WTVNLQnI2NHJcMDAwVlBNT1ZNU0tCcnJcMDAwVlBNT1ZTWEJEcm1cMDAwVlBNTyINCisgICAgIlZTWEJEcnJcMDAwVlBNT1ZTWEJRcm1cMDAwVlBNT1ZTWEJRcnJcMDAwVlBNT1ZTWEJXcm1cMDAwVlBNT1ZTWEJXcnJcMDAwIg0KKyAgICAiVlBNT1ZTWERRcm1cMDAwVlBNT1ZTWERRcnJcMDAwVlBNT1ZTWFdEcm1cMDAwVlBNT1ZTWFdEcnJcMDAwVlBNT1ZTWFdRcm0iDQorICAgICJcMDAwVlBNT1ZTWFdRcnJcMDAwVlBNT1ZaWEJEcm1cMDAwVlBNT1ZaWEJEcnJcMDAwVlBNT1ZaWEJRcm1cMDAwVlBNT1ZaWCINCisgICAgIkJRcnJcMDAwVlBNT1ZaWEJXcm1cMDAwVlBNT1ZaWEJXcnJcMDAwVlBNT1ZaWERRcm1cMDAwVlBNT1ZaWERRcnJcMDAwVlBNIg0KKyAgICAiT1ZaWFdEcm1cMDAwVlBNT1ZaWFdEcnJcMDAwVlBNT1ZaWFdRcm1cMDAwVlBNT1ZaWFdRcnJcMDAwVlBNVUxEUXJtXDAwMFYiDQorICAgICJQTVVMRFFyclwwMDBWUE1VTEhSU1dybTEyOFwwMDBWUE1VTEhSU1dybTY0XDAwMFZQTVVMSFJTV3JyMTI4XDAwMFZQTVVMSCINCisgICAgIlJTV3JyNjRcMDAwVlBNVUxIVVdybVwwMDBWUE1VTEhVV3JyXDAwMFZQTVVMSFdybVwwMDBWUE1VTEhXcnJcMDAwVlBNVUxMIg0KKyAgICAiRHJtXDAwMFZQTVVMTERyclwwMDBWUE1VTExXcm1cMDAwVlBNVUxMV3JyXDAwMFZQTVVMVURRcm1cMDAwVlBNVUxVRFFyclwwMDAiDQorICAgICJWUE9Scm1cMDAwVlBPUnJyXDAwMFZQU0FEQldybVwwMDBWUFNBREJXcnJcMDAwVlBTSFVGQnJtMTI4XDAwMFZQU0hVRkJybSINCisgICAgIjY0XDAwMFZQU0hVRkJycjEyOFwwMDBWUFNIVUZCcnI2NFwwMDBWUFNIVUZEbWlcMDAwVlBTSFVGRHJpXDAwMFZQU0hVRkhXIg0KKyAgICAibWlcMDAwVlBTSFVGSFdyaVwwMDBWUFNIVUZMV21pXDAwMFZQU0hVRkxXcmlcMDAwVlBTSUdOQnJtMTI4XDAwMFZQU0lHTkIiDQorICAgICJybTY0XDAwMFZQU0lHTkJycjEyOFwwMDBWUFNJR05CcnI2NFwwMDBWUFNJR05Ecm0xMjhcMDAwVlBTSUdORHJtNjRcMDAwViINCisgICAgIlBTSUdORHJyMTI4XDAwMFZQU0lHTkRycjY0XDAwMFZQU0lHTldybTEyOFwwMDBWUFNJR05Xcm02NFwwMDBWUFNJR05XcnIxIg0KKyAgICAiMjhcMDAwVlBTSUdOV3JyNjRcMDAwVlBTTExEUXJpXDAwMFZQU0xMRHJpXDAwMFZQU0xMRHJtXDAwMFZQU0xMRHJyXDAwMFYiDQorICAgICJQU0xMUXJpXDAwMFZQU0xMUXJtXDAwMFZQU0xMUXJyXDAwMFZQU0xMV3JpXDAwMFZQU0xMV3JtXDAwMFZQU0xMV3JyXDAwMCINCisgICAgIlZQU1JBRHJpXDAwMFZQU1JBRHJtXDAwMFZQU1JBRHJyXDAwMFZQU1JBV3JpXDAwMFZQU1JBV3JtXDAwMFZQU1JBV3JyXDAwMCINCisgICAgIlZQU1JMRFFyaVwwMDBWUFNSTERyaVwwMDBWUFNSTERybVwwMDBWUFNSTERyclwwMDBWUFNSTFFyaVwwMDBWUFNSTFFybVwwMDAiDQorICAgICJWUFNSTFFyclwwMDBWUFNSTFdyaVwwMDBWUFNSTFdybVwwMDBWUFNSTFdyclwwMDBWUFNVQkJybVwwMDBWUFNVQkJyclwwMDAiDQorICAgICJWUFNVQkRybVwwMDBWUFNVQkRyclwwMDBWUFNVQlFybVwwMDBWUFNVQlFyclwwMDBWUFNVQlNCcm1cMDAwVlBTVUJTQnJyXDAwMCINCisgICAgIlZQU1VCU1dybVwwMDBWUFNVQlNXcnJcMDAwVlBTVUJVU0JybVwwMDBWUFNVQlVTQnJyXDAwMFZQU1VCVVNXcm1cMDAwVlBTIg0KKyAgICAiVUJVU1dyclwwMDBWUFNVQldybVwwMDBWUFNVQldyclwwMDBWUFRFU1RZcm1cMDAwVlBURVNUWXJyXDAwMFZQVEVTVHJtXDAwMCINCisgICAgIlZQVEVTVHJyXDAwMFZQVU5QQ0tIQldybVwwMDBWUFVOUENLSEJXcnJcMDAwVlBVTlBDS0hEUXJtXDAwMFZQVU5QQ0tIRFFyIg0KKyAgICAiclwwMDBWUFVOUENLSFFEUXJtXDAwMFZQVU5QQ0tIUURRcnJcMDAwVlBVTlBDS0hXRHJtXDAwMFZQVU5QQ0tIV0RyclwwMDAiDQorICAgICJWUFVOUENLTEJXcm1cMDAwVlBVTlBDS0xCV3JyXDAwMFZQVU5QQ0tMRFFybVwwMDBWUFVOUENLTERRcnJcMDAwVlBVTlBDSyINCisgICAgIkxRRFFybVwwMDBWUFVOUENLTFFEUXJyXDAwMFZQVU5QQ0tMV0RybVwwMDBWUFVOUENLTFdEcnJcMDAwVlBYT1JybVwwMDBWIg0KKyAgICAiUFhPUnJyXDAwMFZSQ1BQU1ltXDAwMFZSQ1BQU1ltX0ludFwwMDBWUkNQUFNZclwwMDBWUkNQUFNZcl9JbnRcMDAwVlJDUFAiDQorICAgICJTbVwwMDBWUkNQUFNtX0ludFwwMDBWUkNQUFNyXDAwMFZSQ1BQU3JfSW50XDAwMFZSQ1BTU21cMDAwVlJDUFNTbV9JbnRcMDAwIg0KKyAgICAiVlJDUFNTclwwMDBWUkNQU1NyX0ludFwwMDBWUk9VTkRQRG1cMDAwVlJPVU5EUERtX0ludFwwMDBWUk9VTkRQRHJcMDAwVlIiDQorICAgICJPVU5EUERyX0ludFwwMDBWUk9VTkRQU21cMDAwVlJPVU5EUFNtX0ludFwwMDBWUk9VTkRQU3JcMDAwVlJPVU5EUFNyX0ludCINCisgICAgIlwwMDBWUk9VTkRTRG1cMDAwVlJPVU5EU0RtX0ludFwwMDBWUk9VTkRTRHJcMDAwVlJPVU5EU0RyX0ludFwwMDBWUk9VTkRTIg0KKyAgICAiU21cMDAwVlJPVU5EU1NtX0ludFwwMDBWUk9VTkRTU3JcMDAwVlJPVU5EU1NyX0ludFwwMDBWUk9VTkRZUERtXDAwMFZST1UiDQorICAgICJORFlQRG1fSW50XDAwMFZST1VORFlQRHJcMDAwVlJPVU5EWVBEcl9JbnRcMDAwVlJPVU5EWVBTbVwwMDBWUk9VTkRZUFNtXyINCisgICAgIkludFwwMDBWUk9VTkRZUFNyXDAwMFZST1VORFlQU3JfSW50XDAwMFZSU1FSVFBTWW1cMDAwVlJTUVJUUFNZbV9JbnRcMDAwIg0KKyAgICAiVlJTUVJUUFNZclwwMDBWUlNRUlRQU1lyX0ludFwwMDBWUlNRUlRQU21cMDAwVlJTUVJUUFNtX0ludFwwMDBWUlNRUlRQU3IiDQorICAgICJcMDAwVlJTUVJUUFNyX0ludFwwMDBWUlNRUlRTU21cMDAwVlJTUVJUU1NtX0ludFwwMDBWUlNRUlRTU3JcMDAwVlJTUVJUUyINCisgICAgIlNyX0ludFwwMDBWU0hVRlBEWXJtaVwwMDBWU0hVRlBEWXJyaVwwMDBWU0hVRlBEcm1pXDAwMFZTSFVGUERycmlcMDAwVlNIIg0KKyAgICAiVUZQU1lybWlcMDAwVlNIVUZQU1lycmlcMDAwVlNIVUZQU3JtaVwwMDBWU0hVRlBTcnJpXDAwMFZTUVJUUERZbVwwMDBWU1EiDQorICAgICJSVFBEWW1fSW50XDAwMFZTUVJUUERZclwwMDBWU1FSVFBEWXJfSW50XDAwMFZTUVJUUERtXDAwMFZTUVJUUERtX0ludFwwMDAiDQorICAgICJWU1FSVFBEclwwMDBWU1FSVFBEcl9JbnRcMDAwVlNRUlRQU1ltXDAwMFZTUVJUUFNZbV9JbnRcMDAwVlNRUlRQU1lyXDAwMCINCisgICAgIlZTUVJUUFNZcl9JbnRcMDAwVlNRUlRQU21cMDAwVlNRUlRQU21fSW50XDAwMFZTUVJUUFNyXDAwMFZTUVJUUFNyX0ludFwwMDAiDQorICAgICJWU1FSVFNEbVwwMDBWU1FSVFNEbV9JbnRcMDAwVlNRUlRTRHJcMDAwVlNRUlRTRHJfSW50XDAwMFZTUVJUU1NtXDAwMFZTUSINCisgICAgIlJUU1NtX0ludFwwMDBWU1FSVFNTclwwMDBWU1FSVFNTcl9JbnRcMDAwVlNUTVhDU1JcMDAwVlNVQlBEWXJtXDAwMFZTVUJQIg0KKyAgICAiRFlyclwwMDBWU1VCUERybVwwMDBWU1VCUERyclwwMDBWU1VCUFNZcm1cMDAwVlNVQlBTWXJyXDAwMFZTVUJQU3JtXDAwMFYiDQorICAgICJTVUJQU3JyXDAwMFZTVUJTRHJtXDAwMFZTVUJTRHJtX0ludFwwMDBWU1VCU0RyclwwMDBWU1VCU0Rycl9JbnRcMDAwVlNVQiINCisgICAgIlNTcm1cMDAwVlNVQlNTcm1fSW50XDAwMFZTVUJTU3JyXDAwMFZTVUJTU3JyX0ludFwwMDBWVEVTVFBEWXJtXDAwMFZURVNUIg0KKyAgICAiUERZcnJcMDAwVlRFU1RQRHJtXDAwMFZURVNUUERyclwwMDBWVEVTVFBTWXJtXDAwMFZURVNUUFNZcnJcMDAwVlRFU1RQU3IiDQorICAgICJtXDAwMFZURVNUUFNyclwwMDBWVUNPTUlTRHJtXDAwMFZVQ09NSVNEcnJcMDAwVlVDT01JU1NybVwwMDBWVUNPTUlTU3JyXDAwMCINCisgICAgIlZVTlBDS0hQRFlybVwwMDBWVU5QQ0tIUERZcnJcMDAwVlVOUENLSFBEcm1cMDAwVlVOUENLSFBEcnJcMDAwVlVOUENLSFBTIg0KKyAgICAiWXJtXDAwMFZVTlBDS0hQU1lyclwwMDBWVU5QQ0tIUFNybVwwMDBWVU5QQ0tIUFNyclwwMDBWVU5QQ0tMUERZcm1cMDAwVlUiDQorICAgICJOUENLTFBEWXJyXDAwMFZVTlBDS0xQRHJtXDAwMFZVTlBDS0xQRHJyXDAwMFZVTlBDS0xQU1lybVwwMDBWVU5QQ0tMUFNZciINCisgICAgInJcMDAwVlVOUENLTFBTcm1cMDAwVlVOUENLTFBTcnJcMDAwVlhPUlBEWXJtXDAwMFZYT1JQRFlyclwwMDBWWE9SUERybVwwMDAiDQorICAgICJWWE9SUERyclwwMDBWWE9SUFNZcm1cMDAwVlhPUlBTWXJyXDAwMFZYT1JQU3JtXDAwMFZYT1JQU3JyXDAwMFZaRVJPQUxMXDAwMCINCisgICAgIlZaRVJPVVBQRVJcMDAwVl9TRVQwUERcMDAwVl9TRVQwUElcMDAwVl9TRVQwUFNcMDAwVl9TRVRBTExPTkVTXDAwMFdBSVRcMDAwIg0KKyAgICAiV0JJTlZEXDAwMFdJTkNBTEw2NG1cMDAwV0lOQ0FMTDY0cGNyZWwzMlwwMDBXSU5DQUxMNjRyXDAwMFdSTVNSXDAwMFhBREQiDQorICAgICIxNnJtXDAwMFhBREQxNnJyXDAwMFhBREQzMnJtXDAwMFhBREQzMnJyXDAwMFhBREQ2NHJtXDAwMFhBREQ2NHJyXDAwMFhBRCINCisgICAgIkQ4cm1cMDAwWEFERDhyclwwMDBYQ0hHMTZhclwwMDBYQ0hHMTZybVwwMDBYQ0hHMTZyclwwMDBYQ0hHMzJhclwwMDBYQ0hHIg0KKyAgICAiMzJybVwwMDBYQ0hHMzJyclwwMDBYQ0hHNjRhclwwMDBYQ0hHNjRybVwwMDBYQ0hHNjRyclwwMDBYQ0hHOHJtXDAwMFhDSEciDQorICAgICI4cnJcMDAwWENIX0ZcMDAwWExBVFwwMDBYT1IxNmkxNlwwMDBYT1IxNm1pXDAwMFhPUjE2bWk4XDAwMFhPUjE2bXJcMDAwWCINCisgICAgIk9SMTZyaVwwMDBYT1IxNnJpOFwwMDBYT1IxNnJtXDAwMFhPUjE2cnJcMDAwWE9SMTZycl9SRVZcMDAwWE9SMzJpMzJcMDAwIg0KKyAgICAiWE9SMzJtaVwwMDBYT1IzMm1pOFwwMDBYT1IzMm1yXDAwMFhPUjMycmlcMDAwWE9SMzJyaThcMDAwWE9SMzJybVwwMDBYT1IiDQorICAgICIzMnJyXDAwMFhPUjMycnJfUkVWXDAwMFhPUjY0aTMyXDAwMFhPUjY0bWkzMlwwMDBYT1I2NG1pOFwwMDBYT1I2NG1yXDAwMCINCisgICAgIlhPUjY0cmkzMlwwMDBYT1I2NHJpOFwwMDBYT1I2NHJtXDAwMFhPUjY0cnJcMDAwWE9SNjRycl9SRVZcMDAwWE9SOGk4XDAwMCINCisgICAgIlhPUjhtaVwwMDBYT1I4bXJcMDAwWE9SOHJpXDAwMFhPUjhybVwwMDBYT1I4cnJcMDAwWE9SOHJyX1JFVlwwMDBYT1JQRHJtIg0KKyAgICAiXDAwMFhPUlBEcnJcMDAwWE9SUFNybVwwMDBYT1JQU3JyXDAwMCI7DQorICByZXR1cm4gU3RycytJbnN0QXNtT2Zmc2V0W09wY29kZV07DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5DYWxsaW5nQ29udi5pbmMgYi9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuQ2FsbGluZ0NvbnYuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmQ0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuQ2FsbGluZ0NvbnYuaW5jCkBAIC0wLDAgKzEsMTA1OCBAQAorLy89PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8NCisvLw0KKy8vIENhbGxpbmcgQ29udmVudGlvbiBJbXBsZW1lbnRhdGlvbiBGcmFnbWVudA0KKy8vDQorLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK3N0YXRpYyBib29sIENDX1g4Nl8zMl9DKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIENDX1g4Nl8zMl9Db21tb24odW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIENDX1g4Nl8zMl9GYXN0Q0ModW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIENDX1g4Nl8zMl9GYXN0Q2FsbCh1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIENDX1g4Nl8zMl9HSEModW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIENDX1g4Nl8zMl9UaGlzQ2FsbCh1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIENDX1g4Nl82NF9DKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIENDX1g4Nl82NF9HSEModW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIENDX1g4Nl9XaW42NF9DKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIFJldENDX1g4Nih1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIFJldENDX1g4NkNvbW1vbih1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIFJldENDX1g4Nl8zMih1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIFJldENDX1g4Nl8zMl9DKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIFJldENDX1g4Nl8zMl9GYXN0KHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIFJldENDX1g4Nl82NCh1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIFJldENDX1g4Nl82NF9DKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KK3N0YXRpYyBib29sIFJldENDX1g4Nl9XaW42NF9DKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOw0KKw0KKw0KK3N0YXRpYyBib29sIENDX1g4Nl8zMl9DKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpIHsNCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6Omk4IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjppMTYpIHsNCisgICAgTG9jVlQgPSBNVlQ6OmkzMjsNCisgICAgaWYgKEFyZ0ZsYWdzLmlzU0V4dCgpKQ0KKyAgICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpTRXh0Ow0KKyAgICBlbHNlIGlmIChBcmdGbGFncy5pc1pFeHQoKSkNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6WkV4dDsNCisgICAgZWxzZQ0KKyAgICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpBRXh0Ow0KKyAgfQ0KKw0KKyAgaWYgKEFyZ0ZsYWdzLmlzTmVzdCgpKSB7DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhYODY6OkVDWCkpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmICghU3RhdGUuaXNWYXJBcmcoKSkgew0KKyAgICBpZiAoQXJnRmxhZ3MuaXNJblJlZygpKSB7DQorICAgICAgaWYgKExvY1ZUID09IE1WVDo6aTMyKSB7DQorICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDFbXSA9IHsNCisgICAgICAgICAgWDg2OjpFQVgsIFg4Njo6RURYLCBYODY6OkVDWA0KKyAgICAgICAgfTsNCisgICAgICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0MSwgMykpIHsNCisgICAgICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmICghQ0NfWDg2XzMyX0NvbW1vbihWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBBcmdGbGFncywgU3RhdGUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICByZXR1cm4gdHJ1ZTsgIC8vIENDIGRpZG4ndCBtYXRjaC4NCit9DQorDQorDQorc3RhdGljIGJvb2wgQ0NfWDg2XzMyX0NvbW1vbih1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzLCBDQ1N0YXRlICZTdGF0ZSkgew0KKw0KKyAgaWYgKEFyZ0ZsYWdzLmlzQnlWYWwoKSkgew0KKyAgICBTdGF0ZS5IYW5kbGVCeVZhbChWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCA0LCA0LCBBcmdGbGFncyk7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIGlmICghU3RhdGUuaXNWYXJBcmcoKSkgew0KKyAgICBpZiAoQXJnRmxhZ3MuaXNJblJlZygpKSB7DQorICAgICAgaWYgKExvY1ZUID09IE1WVDo6ZjMyIHx8DQorICAgICAgICAgIExvY1ZUID09IE1WVDo6ZjY0KSB7DQorICAgICAgICBpZiAoU3RhdGUuZ2V0VGFyZ2V0KCkuZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5oYXNTU0UyKCkpIHsNCisgICAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3QxW10gPSB7DQorICAgICAgICAgICAgWDg2OjpYTU0wLCBYODY6OlhNTTEsIFg4Njo6WE1NMg0KKyAgICAgICAgICB9Ow0KKyAgICAgICAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDEsIDMpKSB7DQorICAgICAgICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBpZiAoIVN0YXRlLmlzVmFyQXJnKCkpIHsNCisgICAgaWYgKExvY1ZUID09IE1WVDo6djhpOCB8fA0KKyAgICAgICAgTG9jVlQgPT0gTVZUOjp2NGkxNiB8fA0KKyAgICAgICAgTG9jVlQgPT0gTVZUOjp2MmkzMikgew0KKyAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0MltdID0gew0KKyAgICAgICAgWDg2OjpNTTAsIFg4Njo6TU0xLCBYODY6Ok1NMg0KKyAgICAgIH07DQorICAgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3QyLCAzKSkgew0KKyAgICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OmYzMikgew0KKyAgICB1bnNpZ25lZCBPZmZzZXQzID0gU3RhdGUuQWxsb2NhdGVTdGFjayg0LCA0KTsNCisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQzLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjpmNjQpIHsNCisgICAgdW5zaWduZWQgT2Zmc2V0NCA9IFN0YXRlLkFsbG9jYXRlU3RhY2soOCwgNCk7DQorICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0TWVtKFZhbE5vLCBWYWxWVCwgT2Zmc2V0NCwgTG9jVlQsIExvY0luZm8pKTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6ZjgwKSB7DQorICAgIHVuc2lnbmVkIE9mZnNldDUgPSBTdGF0ZS5BbGxvY2F0ZVN0YWNrKA0KKyAgICAgIFN0YXRlLmdldFRhcmdldCgpLmdldFRhcmdldERhdGEoKS0+Z2V0VHlwZUFsbG9jU2l6ZShMb2NWVC5nZXRUeXBlRm9yRVZUKFN0YXRlLmdldENvbnRleHQoKSkpLCA0KTsNCisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQ1LCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoIVN0YXRlLmlzVmFyQXJnKCkpIHsNCisgICAgaWYgKExvY1ZUID09IE1WVDo6djE2aTggfHwNCisgICAgICAgIExvY1ZUID09IE1WVDo6djhpMTYgfHwNCisgICAgICAgIExvY1ZUID09IE1WVDo6djRpMzIgfHwNCisgICAgICAgIExvY1ZUID09IE1WVDo6djJpNjQgfHwNCisgICAgICAgIExvY1ZUID09IE1WVDo6djRmMzIgfHwNCisgICAgICAgIExvY1ZUID09IE1WVDo6djJmNjQpIHsNCisgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDZbXSA9IHsNCisgICAgICAgIFg4Njo6WE1NMCwgWDg2OjpYTU0xLCBYODY6OlhNTTIsIFg4Njo6WE1NMw0KKyAgICAgIH07DQorICAgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3Q2LCA0KSkgew0KKyAgICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBpZiAoIVN0YXRlLmlzVmFyQXJnKCkpIHsNCisgICAgaWYgKExvY1ZUID09IE1WVDo6djMyaTggfHwNCisgICAgICAgIExvY1ZUID09IE1WVDo6djE2aTE2IHx8DQorICAgICAgICBMb2NWVCA9PSBNVlQ6OnY4aTMyIHx8DQorICAgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTY0IHx8DQorICAgICAgICBMb2NWVCA9PSBNVlQ6OnY4ZjMyIHx8DQorICAgICAgICBMb2NWVCA9PSBNVlQ6OnY0ZjY0KSB7DQorICAgICAgaWYgKFN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaGFzQVZYKCkpIHsNCisgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0N1tdID0gew0KKyAgICAgICAgICBYODY6OllNTTAsIFg4Njo6WU1NMSwgWDg2OjpZTU0yLCBYODY6OllNTTMNCisgICAgICAgIH07DQorICAgICAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDcsIDQpKSB7DQorICAgICAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjp2MTZpOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djhpMTYgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2Mmk2NCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRmMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYyZjY0KSB7DQorICAgIHVuc2lnbmVkIE9mZnNldDggPSBTdGF0ZS5BbGxvY2F0ZVN0YWNrKDE2LCAxNik7DQorICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0TWVtKFZhbE5vLCBWYWxWVCwgT2Zmc2V0OCwgTG9jVlQsIExvY0luZm8pKTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6djMyaTggfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYxNmkxNiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djhpMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTY0IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2OGYzMiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRmNjQpIHsNCisgICAgdW5zaWduZWQgT2Zmc2V0OSA9IFN0YXRlLkFsbG9jYXRlU3RhY2soMzIsIDMyKTsNCisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQ5LCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjp2OGk4IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2NGkxNiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djJpMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYxaTY0KSB7DQorICAgIHVuc2lnbmVkIE9mZnNldDEwID0gU3RhdGUuQWxsb2NhdGVTdGFjayg4LCA0KTsNCisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQxMCwgTG9jVlQsIExvY0luZm8pKTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIHRydWU7ICAvLyBDQyBkaWRuJ3QgbWF0Y2guDQorfQ0KKw0KKw0KK3N0YXRpYyBib29sIENDX1g4Nl8zMl9GYXN0Q0ModW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpIHsNCisNCisgIGlmIChBcmdGbGFncy5pc0J5VmFsKCkpIHsNCisgICAgU3RhdGUuSGFuZGxlQnlWYWwoVmFsTm8sIFZhbFZULCBMb2NWVCwgTG9jSW5mbywgNCwgNCwgQXJnRmxhZ3MpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6aTE2KSB7DQorICAgIExvY1ZUID0gTVZUOjppMzI7DQorICAgIGlmIChBcmdGbGFncy5pc1NFeHQoKSkNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6U0V4dDsNCisgICAgZWxzZSBpZiAoQXJnRmxhZ3MuaXNaRXh0KCkpDQorICAgICAgICBMb2NJbmZvID0gQ0NWYWxBc3NpZ246OlpFeHQ7DQorICAgIGVsc2UNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6QUV4dDsNCisgIH0NCisNCisgIGlmIChBcmdGbGFncy5pc05lc3QoKSkgew0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoWDg2OjpFQVgpKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppMzIpIHsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3QxW10gPSB7DQorICAgICAgWDg2OjpFQ1gsIFg4Njo6RURYDQorICAgIH07DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0MSwgMikpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmICghU3RhdGUuaXNWYXJBcmcoKSkgew0KKyAgICBpZiAoTG9jVlQgPT0gTVZUOjpmMzIgfHwNCisgICAgICAgIExvY1ZUID09IE1WVDo6ZjY0KSB7DQorICAgICAgaWYgKFN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaGFzU1NFMigpKSB7DQorICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDJbXSA9IHsNCisgICAgICAgICAgWDg2OjpYTU0wLCBYODY6OlhNTTEsIFg4Njo6WE1NMg0KKyAgICAgICAgfTsNCisgICAgICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0MiwgMykpIHsNCisgICAgICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OmY2NCkgew0KKyAgICB1bnNpZ25lZCBPZmZzZXQzID0gU3RhdGUuQWxsb2NhdGVTdGFjayg4LCA4KTsNCisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQzLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoIUNDX1g4Nl8zMl9Db21tb24oVmFsTm8sIFZhbFZULCBMb2NWVCwgTG9jSW5mbywgQXJnRmxhZ3MsIFN0YXRlKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgcmV0dXJuIHRydWU7ICAvLyBDQyBkaWRuJ3QgbWF0Y2guDQorfQ0KKw0KKw0KK3N0YXRpYyBib29sIENDX1g4Nl8zMl9GYXN0Q2FsbCh1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpIHsNCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6Omk4IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjppMTYpIHsNCisgICAgTG9jVlQgPSBNVlQ6OmkzMjsNCisgICAgaWYgKEFyZ0ZsYWdzLmlzU0V4dCgpKQ0KKyAgICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpTRXh0Ow0KKyAgICBlbHNlIGlmIChBcmdGbGFncy5pc1pFeHQoKSkNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6WkV4dDsNCisgICAgZWxzZQ0KKyAgICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpBRXh0Ow0KKyAgfQ0KKw0KKyAgaWYgKEFyZ0ZsYWdzLmlzTmVzdCgpKSB7DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhYODY6OkVBWCkpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OmkzMikgew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDFbXSA9IHsNCisgICAgICBYODY6OkVDWCwgWDg2OjpFRFgNCisgICAgfTsNCisgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3QxLCAyKSkgew0KKyAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKCFDQ19YODZfMzJfQ29tbW9uKFZhbE5vLCBWYWxWVCwgTG9jVlQsIExvY0luZm8sIEFyZ0ZsYWdzLCBTdGF0ZSkpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIHJldHVybiB0cnVlOyAgLy8gQ0MgZGlkbid0IG1hdGNoLg0KK30NCisNCisNCitzdGF0aWMgYm9vbCBDQ19YODZfMzJfR0hDKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKSB7DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6aTE2KSB7DQorICAgIExvY1ZUID0gTVZUOjppMzI7DQorICAgIGlmIChBcmdGbGFncy5pc1NFeHQoKSkNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6U0V4dDsNCisgICAgZWxzZSBpZiAoQXJnRmxhZ3MuaXNaRXh0KCkpDQorICAgICAgICBMb2NJbmZvID0gQ0NWYWxBc3NpZ246OlpFeHQ7DQorICAgIGVsc2UNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6QUV4dDsNCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OmkzMikgew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDFbXSA9IHsNCisgICAgICBYODY6OkVCWCwgWDg2OjpFQlAsIFg4Njo6RURJLCBYODY6OkVTSQ0KKyAgICB9Ow0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDEsIDQpKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICByZXR1cm4gdHJ1ZTsgIC8vIENDIGRpZG4ndCBtYXRjaC4NCit9DQorDQorDQorc3RhdGljIGJvb2wgQ0NfWDg2XzMyX1RoaXNDYWxsKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzLCBDQ1N0YXRlICZTdGF0ZSkgew0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6aTggfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OmkxNikgew0KKyAgICBMb2NWVCA9IE1WVDo6aTMyOw0KKyAgICBpZiAoQXJnRmxhZ3MuaXNTRXh0KCkpDQorICAgICAgICBMb2NJbmZvID0gQ0NWYWxBc3NpZ246OlNFeHQ7DQorICAgIGVsc2UgaWYgKEFyZ0ZsYWdzLmlzWkV4dCgpKQ0KKyAgICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpaRXh0Ow0KKyAgICBlbHNlDQorICAgICAgICBMb2NJbmZvID0gQ0NWYWxBc3NpZ246OkFFeHQ7DQorICB9DQorDQorICBpZiAoQXJnRmxhZ3MuaXNOZXN0KCkpIHsNCisgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFg4Njo6RUFYKSkgew0KKyAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6aTMyKSB7DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhYODY6OkVDWCkpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmICghQ0NfWDg2XzMyX0NvbW1vbihWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBBcmdGbGFncywgU3RhdGUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICByZXR1cm4gdHJ1ZTsgIC8vIENDIGRpZG4ndCBtYXRjaC4NCit9DQorDQorDQorc3RhdGljIGJvb2wgQ0NfWDg2XzY0X0ModW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwNCisgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzLCBDQ1N0YXRlICZTdGF0ZSkgew0KKw0KKyAgaWYgKEFyZ0ZsYWdzLmlzQnlWYWwoKSkgew0KKyAgICBTdGF0ZS5IYW5kbGVCeVZhbChWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCA4LCA4LCBBcmdGbGFncyk7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6Omk4IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjppMTYpIHsNCisgICAgTG9jVlQgPSBNVlQ6OmkzMjsNCisgICAgaWYgKEFyZ0ZsYWdzLmlzU0V4dCgpKQ0KKyAgICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpTRXh0Ow0KKyAgICBlbHNlIGlmIChBcmdGbGFncy5pc1pFeHQoKSkNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6WkV4dDsNCisgICAgZWxzZQ0KKyAgICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpBRXh0Ow0KKyAgfQ0KKw0KKyAgaWYgKEFyZ0ZsYWdzLmlzTmVzdCgpKSB7DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhYODY6OlIxMCkpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OnYxaTY0KSB7DQorICAgIGlmIChTdGF0ZS5nZXRUYXJnZXQoKS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmlzVGFyZ2V0RGFyd2luKCkpIHsNCisgICAgICBMb2NWVCA9IE1WVDo6aTY0Ow0KKyAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6QkN2dDsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6aTMyKSB7DQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0MVtdID0gew0KKyAgICAgIFg4Njo6RURJLCBYODY6OkVTSSwgWDg2OjpFRFgsIFg4Njo6RUNYLCBYODY6OlI4RCwgWDg2OjpSOUQNCisgICAgfTsNCisgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3QxLCA2KSkgew0KKyAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6aTY0KSB7DQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0MltdID0gew0KKyAgICAgIFg4Njo6UkRJLCBYODY6OlJTSSwgWDg2OjpSRFgsIFg4Njo6UkNYLCBYODY6OlI4LCBYODY6OlI5DQorICAgIH07DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0MiwgNikpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OnY4aTggfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTE2IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2MmkzMikgew0KKyAgICBpZiAoU3RhdGUuZ2V0VGFyZ2V0KCkuZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5pc1RhcmdldERhcndpbigpKSB7DQorICAgICAgaWYgKFN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaGFzU1NFMigpKSB7DQorICAgICAgICBMb2NWVCA9IE1WVDo6djJpNjQ7DQorICAgICAgICBpZiAoQXJnRmxhZ3MuaXNTRXh0KCkpDQorICAgICAgICAgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6U0V4dDsNCisgICAgICAgIGVsc2UgaWYgKEFyZ0ZsYWdzLmlzWkV4dCgpKQ0KKyAgICAgICAgICAgICAgICBMb2NJbmZvID0gQ0NWYWxBc3NpZ246OlpFeHQ7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6QUV4dDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OmYzMiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6ZjY0IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2MTZpOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djhpMTYgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2Mmk2NCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRmMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYyZjY0KSB7DQorICAgIGlmIChTdGF0ZS5nZXRUYXJnZXQoKS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmhhc1NTRTEoKSkgew0KKyAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0M1tdID0gew0KKyAgICAgICAgWDg2OjpYTU0wLCBYODY6OlhNTTEsIFg4Njo6WE1NMiwgWDg2OjpYTU0zLCBYODY6OlhNTTQsIFg4Njo6WE1NNSwgWDg2OjpYTU02LCBYODY6OlhNTTcNCisgICAgICB9Ow0KKyAgICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0MywgOCkpIHsNCisgICAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6djMyaTggfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYxNmkxNiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djhpMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTY0IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2OGYzMiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRmNjQpIHsNCisgICAgaWYgKFN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaGFzQVZYKCkpIHsNCisgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDRbXSA9IHsNCisgICAgICAgIFg4Njo6WU1NMCwgWDg2OjpZTU0xLCBYODY6OllNTTIsIFg4Njo6WU1NMywgWDg2OjpZTU00LCBYODY6OllNTTUsIFg4Njo6WU1NNiwgWDg2OjpZTU03DQorICAgICAgfTsNCisgICAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDQsIDgpKSB7DQorICAgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OmkzMiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6aTY0IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjpmMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OmY2NCkgew0KKyAgICB1bnNpZ25lZCBPZmZzZXQ1ID0gU3RhdGUuQWxsb2NhdGVTdGFjayg4LCA4KTsNCisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQ1LCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjpmODApIHsNCisgICAgdW5zaWduZWQgT2Zmc2V0NiA9IFN0YXRlLkFsbG9jYXRlU3RhY2soDQorICAgICAgU3RhdGUuZ2V0VGFyZ2V0KCkuZ2V0VGFyZ2V0RGF0YSgpLT5nZXRUeXBlQWxsb2NTaXplKExvY1ZULmdldFR5cGVGb3JFVlQoU3RhdGUuZ2V0Q29udGV4dCgpKSksIA0KKyAgICAgIFN0YXRlLmdldFRhcmdldCgpLmdldFRhcmdldERhdGEoKS0+Z2V0QUJJVHlwZUFsaWdubWVudChMb2NWVC5nZXRUeXBlRm9yRVZUKFN0YXRlLmdldENvbnRleHQoKSkpKTsNCisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQ2LCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjp2MTZpOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djhpMTYgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2Mmk2NCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRmMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYyZjY0KSB7DQorICAgIHVuc2lnbmVkIE9mZnNldDcgPSBTdGF0ZS5BbGxvY2F0ZVN0YWNrKDE2LCAxNik7DQorICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0TWVtKFZhbE5vLCBWYWxWVCwgT2Zmc2V0NywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6djMyaTggfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYxNmkxNiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djhpMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTY0IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2OGYzMiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRmNjQpIHsNCisgICAgdW5zaWduZWQgT2Zmc2V0OCA9IFN0YXRlLkFsbG9jYXRlU3RhY2soMzIsIDMyKTsNCisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQ4LCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjp2OGk4IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2NGkxNiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djJpMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYxaTY0KSB7DQorICAgIHVuc2lnbmVkIE9mZnNldDkgPSBTdGF0ZS5BbGxvY2F0ZVN0YWNrKDgsIDgpOw0KKyAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldE1lbShWYWxObywgVmFsVlQsIE9mZnNldDksIExvY1ZULCBMb2NJbmZvKSk7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIHJldHVybiB0cnVlOyAgLy8gQ0MgZGlkbid0IG1hdGNoLg0KK30NCisNCisNCitzdGF0aWMgYm9vbCBDQ19YODZfNjRfR0hDKHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKSB7DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6aTE2IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjppMzIpIHsNCisgICAgTG9jVlQgPSBNVlQ6Omk2NDsNCisgICAgaWYgKEFyZ0ZsYWdzLmlzU0V4dCgpKQ0KKyAgICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpTRXh0Ow0KKyAgICBlbHNlIGlmIChBcmdGbGFncy5pc1pFeHQoKSkNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6WkV4dDsNCisgICAgZWxzZQ0KKyAgICAgICAgTG9jSW5mbyA9IENDVmFsQXNzaWduOjpBRXh0Ow0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6aTY0KSB7DQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0MVtdID0gew0KKyAgICAgIFg4Njo6UjEzLCBYODY6OlJCUCwgWDg2OjpSMTIsIFg4Njo6UkJYLCBYODY6OlIxNCwgWDg2OjpSU0ksIFg4Njo6UkRJLCBYODY6OlI4LCBYODY6OlI5LCBYODY6OlIxNQ0KKyAgICB9Ow0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDEsIDEwKSkgew0KKyAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6ZjMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjpmNjQgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYxNmk4IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2OGkxNiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRpMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYyaTY0IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2NGYzMiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djJmNjQpIHsNCisgICAgaWYgKFN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaGFzU1NFMSgpKSB7DQorICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3QyW10gPSB7DQorICAgICAgICBYODY6OlhNTTEsIFg4Njo6WE1NMiwgWDg2OjpYTU0zLCBYODY6OlhNTTQsIFg4Njo6WE1NNSwgWDg2OjpYTU02DQorICAgICAgfTsNCisgICAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDIsIDYpKSB7DQorICAgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIHJldHVybiB0cnVlOyAgLy8gQ0MgZGlkbid0IG1hdGNoLg0KK30NCisNCisNCitzdGF0aWMgYm9vbCBDQ19YODZfV2luNjRfQyh1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKSB7DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6aTE2KSB7DQorICAgIExvY1ZUID0gTVZUOjppMzI7DQorICAgIGlmIChBcmdGbGFncy5pc1NFeHQoKSkNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6U0V4dDsNCisgICAgZWxzZSBpZiAoQXJnRmxhZ3MuaXNaRXh0KCkpDQorICAgICAgICBMb2NJbmZvID0gQ0NWYWxBc3NpZ246OlpFeHQ7DQorICAgIGVsc2UNCisgICAgICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6QUV4dDsNCisgIH0NCisNCisgIGlmIChBcmdGbGFncy5pc05lc3QoKSkgew0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoWDg2OjpSMTApKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjp2MTZpOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djhpMTYgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2Mmk2NCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRmMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYyZjY0KSB7DQorICAgIExvY1ZUID0gTVZUOjppNjQ7DQorICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6SW5kaXJlY3Q7DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjp2OGk4IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2NGkxNiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djJpMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYxaTY0KSB7DQorICAgIExvY1ZUID0gTVZUOjppNjQ7DQorICAgIExvY0luZm8gPSBDQ1ZhbEFzc2lnbjo6QkN2dDsNCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OmkzMikgew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDFbXSA9IHsNCisgICAgICBYODY6OkVDWCwgWDg2OjpFRFgsIFg4Njo6UjhELCBYODY6OlI5RA0KKyAgICB9Ow0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDJbXSA9IHsNCisgICAgICBYODY6OlhNTTAsIFg4Njo6WE1NMSwgWDg2OjpYTU0yLCBYODY6OlhNTTMNCisgICAgfTsNCisgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3QxLCBSZWdMaXN0MiwgNCkpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6Omk2NCkgew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDNbXSA9IHsNCisgICAgICBYODY6OlJDWCwgWDg2OjpSRFgsIFg4Njo6UjgsIFg4Njo6UjkNCisgICAgfTsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3Q0W10gPSB7DQorICAgICAgWDg2OjpYTU0wLCBYODY6OlhNTTEsIFg4Njo6WE1NMiwgWDg2OjpYTU0zDQorICAgIH07DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0MywgUmVnTGlzdDQsIDQpKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjpmMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OmY2NCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djE2aTggfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY4aTE2IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2NGkzMiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djJpNjQgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0ZjMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2MmY2NCkgew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDVbXSA9IHsNCisgICAgICBYODY6OlhNTTAsIFg4Njo6WE1NMSwgWDg2OjpYTU0yLCBYODY6OlhNTTMNCisgICAgfTsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3Q2W10gPSB7DQorICAgICAgWDg2OjpSQ1gsIFg4Njo6UkRYLCBYODY6OlI4LCBYODY6OlI5DQorICAgIH07DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0NSwgUmVnTGlzdDYsIDQpKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6Omk2NCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6ZjMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjpmNjQpIHsNCisgICAgdW5zaWduZWQgT2Zmc2V0NyA9IFN0YXRlLkFsbG9jYXRlU3RhY2soOCwgOCk7DQorICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0TWVtKFZhbE5vLCBWYWxWVCwgT2Zmc2V0NywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6ZjgwKSB7DQorICAgIHVuc2lnbmVkIE9mZnNldDggPSBTdGF0ZS5BbGxvY2F0ZVN0YWNrKA0KKyAgICAgIFN0YXRlLmdldFRhcmdldCgpLmdldFRhcmdldERhdGEoKS0+Z2V0VHlwZUFsbG9jU2l6ZShMb2NWVC5nZXRUeXBlRm9yRVZUKFN0YXRlLmdldENvbnRleHQoKSkpLCANCisgICAgICBTdGF0ZS5nZXRUYXJnZXQoKS5nZXRUYXJnZXREYXRhKCktPmdldEFCSVR5cGVBbGlnbm1lbnQoTG9jVlQuZ2V0VHlwZUZvckVWVChTdGF0ZS5nZXRDb250ZXh0KCkpKSk7DQorICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0TWVtKFZhbE5vLCBWYWxWVCwgT2Zmc2V0OCwgTG9jVlQsIExvY0luZm8pKTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6djhpOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRpMTYgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYyaTMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2MWk2NCkgew0KKyAgICB1bnNpZ25lZCBPZmZzZXQ5ID0gU3RhdGUuQWxsb2NhdGVTdGFjayg4LCA4KTsNCisgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQ5LCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICByZXR1cm4gdHJ1ZTsgIC8vIENDIGRpZG4ndCBtYXRjaC4NCit9DQorDQorDQorc3RhdGljIGJvb2wgUmV0Q0NfWDg2KHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzLCBDQ1N0YXRlICZTdGF0ZSkgew0KKw0KKyAgaWYgKFN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXM2NEJpdCgpKSB7DQorICAgIGlmICghUmV0Q0NfWDg2XzY0KFZhbE5vLCBWYWxWVCwgTG9jVlQsIExvY0luZm8sIEFyZ0ZsYWdzLCBTdGF0ZSkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgaWYgKCFSZXRDQ19YODZfMzIoVmFsTm8sIFZhbFZULCBMb2NWVCwgTG9jSW5mbywgQXJnRmxhZ3MsIFN0YXRlKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgcmV0dXJuIHRydWU7ICAvLyBDQyBkaWRuJ3QgbWF0Y2guDQorfQ0KKw0KKw0KK3N0YXRpYyBib29sIFJldENDX1g4NkNvbW1vbih1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpIHsNCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6Omk4KSB7DQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0MVtdID0gew0KKyAgICAgIFg4Njo6QUwsIFg4Njo6REwNCisgICAgfTsNCisgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3QxLCAyKSkgew0KKyAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6aTE2KSB7DQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0MltdID0gew0KKyAgICAgIFg4Njo6QVgsIFg4Njo6RFgNCisgICAgfTsNCisgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3QyLCAyKSkgew0KKyAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6aTMyKSB7DQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0M1tdID0gew0KKyAgICAgIFg4Njo6RUFYLCBYODY6OkVEWA0KKyAgICB9Ow0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDMsIDIpKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppNjQpIHsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3Q0W10gPSB7DQorICAgICAgWDg2OjpSQVgsIFg4Njo6UkRYDQorICAgIH07DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0NCwgMikpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OnYxNmk4IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2OGkxNiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRpMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYyaTY0IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2NGYzMiB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djJmNjQpIHsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3Q1W10gPSB7DQorICAgICAgWDg2OjpYTU0wLCBYODY6OlhNTTEsIFg4Njo6WE1NMiwgWDg2OjpYTU0zDQorICAgIH07DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0NSwgNCkpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OnYzMmk4IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2MTZpMTYgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY4aTMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2NGk2NCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djhmMzIgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0ZjY0KSB7DQorICAgIGlmIChTdGF0ZS5nZXRUYXJnZXQoKS5nZXRTdWJ0YXJnZXQ8WDg2U3VidGFyZ2V0PigpLmhhc0FWWCgpKSB7DQorICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3Q2W10gPSB7DQorICAgICAgICBYODY6OllNTTAsIFg4Njo6WU1NMSwgWDg2OjpZTU0yLCBYODY6OllNTTMNCisgICAgICB9Ow0KKyAgICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0NiwgNCkpIHsNCisgICAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6djhpOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRpMTYgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYyaTMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2MWk2NCkgew0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoWDg2OjpNTTApKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjpmODApIHsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3Q3W10gPSB7DQorICAgICAgWDg2OjpTVDAsIFg4Njo6U1QxDQorICAgIH07DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0NywgMikpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIHJldHVybiB0cnVlOyAgLy8gQ0MgZGlkbid0IG1hdGNoLg0KK30NCisNCisNCitzdGF0aWMgYm9vbCBSZXRDQ19YODZfMzIodW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKSB7DQorDQorICBpZiAoU3RhdGUuZ2V0Q2FsbGluZ0NvbnYoKSA9PSBDYWxsaW5nQ29udjo6RmFzdCkgew0KKyAgICBpZiAoIVJldENDX1g4Nl8zMl9GYXN0KFZhbE5vLCBWYWxWVCwgTG9jVlQsIExvY0luZm8sIEFyZ0ZsYWdzLCBTdGF0ZSkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgaWYgKCFSZXRDQ19YODZfMzJfQyhWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBBcmdGbGFncywgU3RhdGUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICByZXR1cm4gdHJ1ZTsgIC8vIENDIGRpZG4ndCBtYXRjaC4NCit9DQorDQorDQorc3RhdGljIGJvb2wgUmV0Q0NfWDg2XzMyX0ModW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzLCBDQ1N0YXRlICZTdGF0ZSkgew0KKw0KKyAgaWYgKEFyZ0ZsYWdzLmlzSW5SZWcoKSkgew0KKyAgICBpZiAoU3RhdGUuZ2V0VGFyZ2V0KCkuZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5oYXNTU0UyKCkpIHsNCisgICAgICBpZiAoTG9jVlQgPT0gTVZUOjpmMzIgfHwNCisgICAgICAgICAgTG9jVlQgPT0gTVZUOjpmNjQpIHsNCisgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0MVtdID0gew0KKyAgICAgICAgICBYODY6OlhNTTAsIFg4Njo6WE1NMSwgWDg2OjpYTU0yDQorICAgICAgICB9Ow0KKyAgICAgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3QxLCAzKSkgew0KKyAgICAgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6ZjMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjpmNjQpIHsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3QyW10gPSB7DQorICAgICAgWDg2OjpTVDAsIFg4Njo6U1QxDQorICAgIH07DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0MiwgMikpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmICghUmV0Q0NfWDg2Q29tbW9uKFZhbE5vLCBWYWxWVCwgTG9jVlQsIExvY0luZm8sIEFyZ0ZsYWdzLCBTdGF0ZSkpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIHJldHVybiB0cnVlOyAgLy8gQ0MgZGlkbid0IG1hdGNoLg0KK30NCisNCisNCitzdGF0aWMgYm9vbCBSZXRDQ19YODZfMzJfRmFzdCh1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKSB7DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjpmMzIpIHsNCisgICAgaWYgKFN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaGFzU1NFMigpKSB7DQorICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3QxW10gPSB7DQorICAgICAgICBYODY6OlhNTTAsIFg4Njo6WE1NMSwgWDg2OjpYTU0yDQorICAgICAgfTsNCisgICAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDEsIDMpKSB7DQorICAgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OmY2NCkgew0KKyAgICBpZiAoU3RhdGUuZ2V0VGFyZ2V0KCkuZ2V0U3VidGFyZ2V0PFg4NlN1YnRhcmdldD4oKS5oYXNTU0UyKCkpIHsNCisgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDJbXSA9IHsNCisgICAgICAgIFg4Njo6WE1NMCwgWDg2OjpYTU0xLCBYODY6OlhNTTINCisgICAgICB9Ow0KKyAgICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0MiwgMykpIHsNCisgICAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6aTgpIHsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3QzW10gPSB7DQorICAgICAgWDg2OjpBTCwgWDg2OjpETCwgWDg2OjpDTA0KKyAgICB9Ow0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDMsIDMpKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppMTYpIHsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3Q0W10gPSB7DQorICAgICAgWDg2OjpBWCwgWDg2OjpEWCwgWDg2OjpDWA0KKyAgICB9Ow0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDQsIDMpKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjppMzIpIHsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3Q1W10gPSB7DQorICAgICAgWDg2OjpFQVgsIFg4Njo6RURYLCBYODY6OkVDWA0KKyAgICB9Ow0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDUsIDMpKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoIVJldENDX1g4NkNvbW1vbihWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBBcmdGbGFncywgU3RhdGUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICByZXR1cm4gdHJ1ZTsgIC8vIENDIGRpZG4ndCBtYXRjaC4NCit9DQorDQorDQorc3RhdGljIGJvb2wgUmV0Q0NfWDg2XzY0KHVuc2lnbmVkIFZhbE5vLCBFVlQgVmFsVlQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzLCBDQ1N0YXRlICZTdGF0ZSkgew0KKw0KKyAgaWYgKFN0YXRlLmdldFRhcmdldCgpLmdldFN1YnRhcmdldDxYODZTdWJ0YXJnZXQ+KCkuaXNUYXJnZXRXaW42NCgpKSB7DQorICAgIGlmICghUmV0Q0NfWDg2X1dpbjY0X0MoVmFsTm8sIFZhbFZULCBMb2NWVCwgTG9jSW5mbywgQXJnRmxhZ3MsIFN0YXRlKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoIVJldENDX1g4Nl82NF9DKFZhbE5vLCBWYWxWVCwgTG9jVlQsIExvY0luZm8sIEFyZ0ZsYWdzLCBTdGF0ZSkpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIHJldHVybiB0cnVlOyAgLy8gQ0MgZGlkbid0IG1hdGNoLg0KK30NCisNCisNCitzdGF0aWMgYm9vbCBSZXRDQ19YODZfNjRfQyh1bnNpZ25lZCBWYWxObywgRVZUIFZhbFZULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgQXJnRmxhZ3MsIENDU3RhdGUgJlN0YXRlKSB7DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjpmMzIpIHsNCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlZ0xpc3QxW10gPSB7DQorICAgICAgWDg2OjpYTU0wLCBYODY6OlhNTTENCisgICAgfTsNCisgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFJlZ0xpc3QxLCAyKSkgew0KKyAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6ZjY0KSB7DQorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZWdMaXN0MltdID0gew0KKyAgICAgIFg4Njo6WE1NMCwgWDg2OjpYTU0xDQorICAgIH07DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhSZWdMaXN0MiwgMikpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OnYxaTY0KSB7DQorICAgIGlmICh1bnNpZ25lZCBSZWcgPSBTdGF0ZS5BbGxvY2F0ZVJlZyhYODY6OlJBWCkpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OnY4aTggfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnY0aTE2IHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2MmkzMikgew0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVnTGlzdDNbXSA9IHsNCisgICAgICBYODY6OlhNTTAsIFg4Njo6WE1NMQ0KKyAgICB9Ow0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoUmVnTGlzdDMsIDIpKSB7DQorICAgICAgU3RhdGUuYWRkTG9jKENDVmFsQXNzaWduOjpnZXRSZWcoVmFsTm8sIFZhbFZULCBSZWcsIExvY1ZULCBMb2NJbmZvKSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoIVJldENDX1g4NkNvbW1vbihWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBBcmdGbGFncywgU3RhdGUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICByZXR1cm4gdHJ1ZTsgIC8vIENDIGRpZG4ndCBtYXRjaC4NCit9DQorDQorDQorc3RhdGljIGJvb2wgUmV0Q0NfWDg2X1dpbjY0X0ModW5zaWduZWQgVmFsTm8sIEVWVCBWYWxWVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzLCBDQ1N0YXRlICZTdGF0ZSkgew0KKw0KKyAgaWYgKExvY1ZUID09IE1WVDo6djhpOCB8fA0KKyAgICAgIExvY1ZUID09IE1WVDo6djRpMTYgfHwNCisgICAgICBMb2NWVCA9PSBNVlQ6OnYyaTMyIHx8DQorICAgICAgTG9jVlQgPT0gTVZUOjp2MWk2NCkgew0KKyAgICBMb2NWVCA9IE1WVDo6aTY0Ow0KKyAgICBMb2NJbmZvID0gQ0NWYWxBc3NpZ246OkJDdnQ7DQorICB9DQorDQorICBpZiAoTG9jVlQgPT0gTVZUOjpmMzIpIHsNCisgICAgaWYgKHVuc2lnbmVkIFJlZyA9IFN0YXRlLkFsbG9jYXRlUmVnKFg4Njo6WE1NMCkpIHsNCisgICAgICBTdGF0ZS5hZGRMb2MoQ0NWYWxBc3NpZ246OmdldFJlZyhWYWxObywgVmFsVlQsIFJlZywgTG9jVlQsIExvY0luZm8pKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChMb2NWVCA9PSBNVlQ6OmY2NCkgew0KKyAgICBpZiAodW5zaWduZWQgUmVnID0gU3RhdGUuQWxsb2NhdGVSZWcoWDg2OjpYTU0wKSkgew0KKyAgICAgIFN0YXRlLmFkZExvYyhDQ1ZhbEFzc2lnbjo6Z2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnLCBMb2NWVCwgTG9jSW5mbykpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKCFSZXRDQ19YODZfNjRfQyhWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBBcmdGbGFncywgU3RhdGUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICByZXR1cm4gdHJ1ZTsgIC8vIENDIGRpZG4ndCBtYXRjaC4NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIveDg2L1g4NkdlbkRBR0lTZWwuaW5jIGIvc3JjL0xMVk0vd2luMzIveDg2L1g4NkdlbkRBR0lTZWwuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGIxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuREFHSVNlbC5pbmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL0xMVk0vd2luMzIveDg2L1g4NkdlbkZhc3RJU2VsLmluYyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5GYXN0SVNlbC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4YTVlZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5GYXN0SVNlbC5pbmMKQEAgLTAsMCArMSwzNDMwIEBACisvLz09PS0gVGFibGVHZW4nZXJhdGVkIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLw0KKy8vDQorLy8gIkZhc3QiIEluc3RydWN0aW9uIFNlbGVjdG9yIGZvciB0aGUgWDg2IHRhcmdldA0KKy8vDQorLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpDb25zdGFudC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQ29uc3RhbnRfTVZUX2k4X2koTVZUIFJldFZULCB1aW50NjRfdCBpbW0wKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X2koWDg2OjpNT1Y4cmksIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgaW1tMCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9Db25zdGFudF9NVlRfaTE2X2koTVZUIFJldFZULCB1aW50NjRfdCBpbW0wKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMTYpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9pKFg4Njo6TU9WMTZyaSwgWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcywgaW1tMCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9Db25zdGFudF9NVlRfaTMyX2koTVZUIFJldFZULCB1aW50NjRfdCBpbW0wKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9pKFg4Njo6TU9WMzJyaSwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgaW1tMCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9Db25zdGFudF9NVlRfaTY0X2koTVZUIFJldFZULCB1aW50NjRfdCBpbW0wKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppNjQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9pKFg4Njo6TU9WNjRyaSwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgaW1tMCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9Db25zdGFudF9pKE1WVCBWVCwgTVZUIFJldFZULCB1aW50NjRfdCBpbW0wKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfQ29uc3RhbnRfTVZUX2k4X2koUmV0VlQsIGltbTApOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9Db25zdGFudF9NVlRfaTE2X2koUmV0VlQsIGltbTApOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9Db25zdGFudF9NVlRfaTMyX2koUmV0VlQsIGltbTApOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9Db25zdGFudF9NVlRfaTY0X2koUmV0VlQsIGltbTApOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIFRvcC1sZXZlbCBGYXN0RW1pdCBmdW5jdGlvbi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9pKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQ2NF90IGltbTApIHsNCisgIHN3aXRjaCAoT3Bjb2RlKSB7DQorICBjYXNlIElTRDo6Q29uc3RhbnQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQ29uc3RhbnRfaShWVCwgUmV0VlQsIGltbTApOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpBTllfRVhURU5ELg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BTllfRVhURU5EX01WVF9pOF9NVlRfaTE2X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU9WWlgxNnJyOCwgWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQU5ZX0VYVEVORF9NVlRfaThfTVZUX2kzMl9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1PVlpYMzJycjgsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FOWV9FWFRFTkRfTVZUX2k4X01WVF9pNjRfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1ZaWDY0cnI4LCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BTllfRVhURU5EX01WVF9pOF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KK3N3aXRjaCAoUmV0VlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMTY6IHJldHVybiBGYXN0RW1pdF9JU0RfQU5ZX0VYVEVORF9NVlRfaThfTVZUX2kxNl9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfQU5ZX0VYVEVORF9NVlRfaThfTVZUX2kzMl9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQU5ZX0VYVEVORF9NVlRfaThfTVZUX2k2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FOWV9FWFRFTkRfTVZUX2kxNl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTY0KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1PVlpYNjRycjE2LCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BTllfRVhURU5EX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9BTllfRVhURU5EX01WVF9pOF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX0FOWV9FWFRFTkRfTVZUX2kxNl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkJJVF9DT05WRVJULg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfaTMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpWTU9WREkyU1NyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU9WREkyU1NyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfaTY0X01WVF9mNjRfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1Y2NHRvU0RyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfaTY0X01WVF92OGk4X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU1YX01PVkQ2NHRvNjRyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2k2NF9NVlRfdjRpMTZfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNTVhfTU9WRDY0dG82NHJyLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfaTY0X01WVF92MmkzMl9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1NWF9NT1ZENjR0bzY0cnIsIFg4Njo6VlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF9pNjRfTVZUX3YxaTY0X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU1YX01PVkQ2NHRvNjRyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2k2NF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KK3N3aXRjaCAoUmV0VlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjpmNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2k2NF9NVlRfZjY0X3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY4aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2k2NF9NVlRfdjhpOF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfaTY0X01WVF92NGkxNl9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfaTY0X01WVF92MmkzMl9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MWk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfaTY0X01WVF92MWk2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF9mMzJfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlZNT1ZTUzJESXJyLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1ZTUzJESXJyLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF9mNjRfTVZUX2k2NF9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1PVlNEdG82NHJyLCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF9mNjRfTVZUX3Y4aThfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNTVhfTU9WRlI2NDJRcnIsIFg4Njo6VlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF9mNjRfTVZUX3Y0aTE2X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU1YX01PVkZSNjQyUXJyLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfZjY0X01WVF92MmkzMl9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1NWF9NT1ZGUjY0MlFyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2Y2NF9NVlRfdjFpNjRfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNTVhfTU9WRlI2NDJRcnIsIFg4Njo6VlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF9mNjRfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCitzd2l0Y2ggKFJldFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF9mNjRfTVZUX2k2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2OGk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF9mNjRfTVZUX3Y4aThfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djRpMTY6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2Y2NF9NVlRfdjRpMTZfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djJpMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2Y2NF9NVlRfdjJpMzJfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djFpNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2Y2NF9NVlRfdjFpNjRfcihPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCit9DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjhpOF9NVlRfaTY0X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU1YX01PVkQ2NGZyb202NHJyLCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjhpOF9NVlRfZjY0X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU1YX01PVlEyRlI2NHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjhpOF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KK3N3aXRjaCAoUmV0VlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX3Y4aThfTVZUX2k2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX3Y4aThfTVZUX2Y2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF92NGkxNl9NVlRfaTY0X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU1YX01PVkQ2NGZyb202NHJyLCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjRpMTZfTVZUX2Y2NF9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1NWF9NT1ZRMkZSNjRyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX3Y0aTE2X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjRpMTZfTVZUX2k2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX3Y0aTE2X01WVF9mNjRfcihPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCit9DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjJpMzJfTVZUX2k2NF9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1NWF9NT1ZENjRmcm9tNjRyciwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX3YyaTMyX01WVF9mNjRfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNTVhfTU9WUTJGUjY0cnIsIFg4Njo6RlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF92MmkzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KK3N3aXRjaCAoUmV0VlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX3YyaTMyX01WVF9pNjRfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF92MmkzMl9NVlRfZjY0X3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorfQ0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX3YxaTY0X01WVF9pNjRfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNTVhfTU9WRDY0ZnJvbTY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF92MWk2NF9NVlRfZjY0X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU1YX01PVlEyRlI2NHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjFpNjRfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCitzd2l0Y2ggKFJldFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF92MWk2NF9NVlRfaTY0X3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjFpNjRfTVZUX2Y2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2kzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF9pNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfZjMyX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX2Y2NF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djhpODogcmV0dXJuIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjhpOF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djRpMTY6IHJldHVybiBGYXN0RW1pdF9JU0RfQklUX0NPTlZFUlRfTVZUX3Y0aTE2X3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9NVlRfdjJpMzJfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYxaTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0JJVF9DT05WRVJUX01WVF92MWk2NF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkJSSU5ELg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CUklORF9NVlRfaTMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppc1ZvaWQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5pczY0Qml0KCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkpNUDMyciwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CUklORF9NVlRfaTY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppc1ZvaWQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmlzNjRCaXQoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6Sk1QNjRyLCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JSSU5EX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfQlJJTkRfTVZUX2kzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0JSSU5EX01WVF9pNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpCU1dBUC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQlNXQVBfTVZUX2kzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkJTV0FQMzJyLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9CU1dBUF9NVlRfaTY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppNjQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6QlNXQVA2NHIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0JTV0FQX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfQlNXQVBfTVZUX2kzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0JTV0FQX01WVF9pNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpGQUJTLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GQUJTX01WVF9mMzJfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKCFTdWJ0YXJnZXQtPmhhc1NTRTEoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6QUJTX0ZwMzIsIFg4Njo6UkZQMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZBQlNfTVZUX2Y2NF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoIVN1YnRhcmdldC0+aGFzU1NFMigpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpBQlNfRnA2NCwgWDg2OjpSRlA2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRkFCU19NVlRfZjgwX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmODApDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6QUJTX0ZwODAsIFg4Njo6UkZQODBSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GQUJTX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjpmMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfRkFCU19NVlRfZjMyX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfRkFCU19NVlRfZjY0X3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmODA6IHJldHVybiBGYXN0RW1pdF9JU0RfRkFCU19NVlRfZjgwX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6RkNPUy4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRkNPU19NVlRfZjMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5oYXNTU0UxKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkNPU19GcDMyLCBYODY6OlJGUDMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GQ09TX01WVF9mNjRfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKCFTdWJ0YXJnZXQtPmhhc1NTRTIoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6Q09TX0ZwNjQsIFg4Njo6UkZQNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZDT1NfTVZUX2Y4MF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjgwKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkNPU19GcDgwLCBYODY6OlJGUDgwUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRkNPU19yKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6ZjMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZDT1NfTVZUX2YzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZDT1NfTVZUX2Y2NF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjgwOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZDT1NfTVZUX2Y4MF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkZORUcuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZORUdfTVZUX2YzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoIVN1YnRhcmdldC0+aGFzU1NFMSgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpDSFNfRnAzMiwgWDg2OjpSRlAzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRk5FR19NVlRfZjY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5oYXNTU0UyKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkNIU19GcDY0LCBYODY6OlJGUDY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GTkVHX01WVF9mODBfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmY4MCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpDSFNfRnA4MCwgWDg2OjpSRlA4MFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZORUdfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GTkVHX01WVF9mMzJfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GTkVHX01WVF9mNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY4MDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GTkVHX01WVF9mODBfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpGUF9FWFRFTkQuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZQX0VYVEVORF9NVlRfZjMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6Q1ZUU1MyU0RyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GUF9FWFRFTkRfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GUF9FWFRFTkRfTVZUX2YzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkZQX1JPVU5ELg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GUF9ST1VORF9NVlRfZjY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6Q1ZUU0QyU1NyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GUF9ST1VORF9yKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6ZjY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZQX1JPVU5EX01WVF9mNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpGUF9UT19TSU5ULg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF9mMzJfTVZUX2kzMl9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6VkNWVFRTUzJTSXJyLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpDVlRUU1MyU0lyciwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF9mMzJfTVZUX2k2NF9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6VkNWVFRTUzJTSTY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkNWVFRTUzJTSTY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRlBfVE9fU0lOVF9NVlRfZjMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF9mMzJfTVZUX2kzMl9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfRlBfVE9fU0lOVF9NVlRfZjMyX01WVF9pNjRfcihPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCit9DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF9mNjRfTVZUX2kzMl9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6VkNWVFRTRDJTSXJyLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpDVlRUU0QyU0lyciwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF9mNjRfTVZUX2k2NF9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6VkNWVFRTRDJTSTY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkNWVFRTRDJTSTY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRlBfVE9fU0lOVF9NVlRfZjY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF9mNjRfTVZUX2kzMl9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfRlBfVE9fU0lOVF9NVlRfZjY0X01WVF9pNjRfcihPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCit9DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF92NGYzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRpMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6SW50X0NWVFRQUzJEUXJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF92MmY2NF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djJpMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6SW50X0NWVFRQRDJQSXJyLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZQX1RPX1NJTlRfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF9mMzJfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF9mNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY0ZjMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZQX1RPX1NJTlRfTVZUX3Y0ZjMyX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GUF9UT19TSU5UX01WVF92MmY2NF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkZTSU4uDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZTSU5fTVZUX2YzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoIVN1YnRhcmdldC0+aGFzU1NFMSgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpTSU5fRnAzMiwgWDg2OjpSRlAzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRlNJTl9NVlRfZjY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5oYXNTU0UyKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlNJTl9GcDY0LCBYODY6OlJGUDY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GU0lOX01WVF9mODBfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmY4MCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpTSU5fRnA4MCwgWDg2OjpSRlA4MFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZTSU5fcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU0lOX01WVF9mMzJfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU0lOX01WVF9mNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY4MDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU0lOX01WVF9mODBfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpGU1FSVC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRlNRUlRfTVZUX2YzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoIVN1YnRhcmdldC0+aGFzU1NFMSgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpTUVJUX0ZwMzIsIFg4Njo6UkZQMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpTUVJUU1NyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZTUVJUX01WVF9mNjRfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKCFTdWJ0YXJnZXQtPmhhc1NTRTIoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6U1FSVF9GcDY0LCBYODY6OlJGUDY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6U1FSVFNEciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GU1FSVF9NVlRfZjgwX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmODApDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6U1FSVF9GcDgwLCBYODY6OlJGUDgwUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRlNRUlRfTVZUX3Y0ZjMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlZTUVJUUFNyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6U1FSVFBTciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRlNRUlRfTVZUX3Y4ZjMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2OGYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlZTUVJUUFNZciwgWDg2OjpWUjI1NlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRlNRUlRfTVZUX3YyZjY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2MmY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlZTUVJUUERyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6U1FSVFBEciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRlNRUlRfTVZUX3Y0ZjY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlZTUVJUUERZciwgWDg2OjpWUjI1NlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRlNRUlRfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU1FSVF9NVlRfZjMyX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfRlNRUlRfTVZUX2Y2NF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjgwOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZTUVJUX01WVF9mODBfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY0ZjMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZTUVJUX01WVF92NGYzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djhmMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfRlNRUlRfTVZUX3Y4ZjMyX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU1FSVF9NVlRfdjJmNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY0ZjY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZTUVJUX01WVF92NGY2NF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OlNDQUxBUl9UT19WRUNUT1IuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NDQUxBUl9UT19WRUNUT1JfTVZUX2kzMl9NVlRfdjJpMzJfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzTU1YKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1NWF9NT1ZENjRyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TQ0FMQVJfVE9fVkVDVE9SX01WVF9pMzJfTVZUX3Y0aTMyX3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpWTU9WREkyUERJcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1ZESTJQRElyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0NBTEFSX1RPX1ZFQ1RPUl9NVlRfaTMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OnYyaTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX1NDQUxBUl9UT19WRUNUT1JfTVZUX2kzMl9NVlRfdjJpMzJfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djRpMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfU0NBTEFSX1RPX1ZFQ1RPUl9NVlRfaTMyX01WVF92NGkzMl9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NDQUxBUl9UT19WRUNUT1JfTVZUX2k2NF9NVlRfdjFpNjRfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzTU1YKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1NWF9NT1ZENjRycnYxNjQsIFg4Njo6VlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0NBTEFSX1RPX1ZFQ1RPUl9NVlRfaTY0X01WVF92Mmk2NF9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1PVjY0dG9QUUlyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0NBTEFSX1RPX1ZFQ1RPUl9NVlRfaTY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OnYxaTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NDQUxBUl9UT19WRUNUT1JfTVZUX2k2NF9NVlRfdjFpNjRfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djJpNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfU0NBTEFSX1RPX1ZFQ1RPUl9NVlRfaTY0X01WVF92Mmk2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NDQUxBUl9UT19WRUNUT1JfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TQ0FMQVJfVE9fVkVDVE9SX01WVF9pMzJfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9TQ0FMQVJfVE9fVkVDVE9SX01WVF9pNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpTSUdOX0VYVEVORC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0lHTl9FWFRFTkRfTVZUX2k4X01WVF9pMTZfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1ZTWDE2cnI4LCBYODY6OkdSMTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TSUdOX0VYVEVORF9NVlRfaThfTVZUX2kzMl9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1PVlNYMzJycjgsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NJR05fRVhURU5EX01WVF9pOF9NVlRfaTY0X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU9WU1g2NHJyOCwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0lHTl9FWFRFTkRfTVZUX2k4X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSUdOX0VYVEVORF9NVlRfaThfTVZUX2kxNl9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfU0lHTl9FWFRFTkRfTVZUX2k4X01WVF9pMzJfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NJR05fRVhURU5EX01WVF9pOF9NVlRfaTY0X3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorfQ0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0lHTl9FWFRFTkRfTVZUX2kxNl9NVlRfaTMyX3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU9WU1gzMnJyMTYsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NJR05fRVhURU5EX01WVF9pMTZfTVZUX2k2NF9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1PVlNYNjRycjE2LCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TSUdOX0VYVEVORF9NVlRfaTE2X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSUdOX0VYVEVORF9NVlRfaTE2X01WVF9pMzJfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NJR05fRVhURU5EX01WVF9pMTZfTVZUX2k2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NJR05fRVhURU5EX01WVF9pMzJfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk2NCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1ZTWDY0cnIzMiwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0lHTl9FWFRFTkRfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NJR05fRVhURU5EX01WVF9pOF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NJR05fRVhURU5EX01WVF9pMTZfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSUdOX0VYVEVORF9NVlRfaTMyX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6U0lOVF9UT19GUC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0lOVF9UT19GUF9NVlRfaTMyX01WVF9mMzJfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpDVlRTSTJTU3JyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NJTlRfVE9fRlBfTVZUX2kzMl9NVlRfZjY0X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6Q1ZUU0kyU0RyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TSU5UX1RPX0ZQX01WVF9pMzJfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCitzd2l0Y2ggKFJldFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6ZjMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX1NJTlRfVE9fRlBfTVZUX2kzMl9NVlRfZjMyX3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSU5UX1RPX0ZQX01WVF9pMzJfTVZUX2Y2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NJTlRfVE9fRlBfTVZUX2k2NF9NVlRfZjMyX3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6Q1ZUU0kyU1M2NHJyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NJTlRfVE9fRlBfTVZUX2k2NF9NVlRfZjY0X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6Q1ZUU0kyU0Q2NHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NJTlRfVE9fRlBfTVZUX2k2NF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KK3N3aXRjaCAoUmV0VlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjpmMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfU0lOVF9UT19GUF9NVlRfaTY0X01WVF9mMzJfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NJTlRfVE9fRlBfTVZUX2k2NF9NVlRfZjY0X3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorfQ0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0lOVF9UT19GUF9NVlRfdjJpMzJfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYyZjY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkludF9DVlRQSTJQRHJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TSU5UX1RPX0ZQX01WVF92NGkzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6SW50X0NWVERRMlBTcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NJTlRfVE9fRlBfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSU5UX1RPX0ZQX01WVF9pMzJfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSU5UX1RPX0ZQX01WVF9pNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYyaTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX1NJTlRfVE9fRlBfTVZUX3YyaTMyX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSU5UX1RPX0ZQX01WVF92NGkzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OlRSVU5DQVRFLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTE2X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aXM2NEJpdCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X2V4dHJhY3RzdWJyZWcoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBYODY6OnN1Yl84Yml0KTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfVFJVTkNBVEVfTVZUX2kzMl9NVlRfaThfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoKFN1YnRhcmdldC0+aXM2NEJpdCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X2V4dHJhY3RzdWJyZWcoTVZUOjppOCwgT3AwLCBPcDBJc0tpbGwsIFg4Njo6c3ViXzhiaXQpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTMyX01WVF9pMTZfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X2V4dHJhY3RzdWJyZWcoTVZUOjppMTYsIE9wMCwgT3AwSXNLaWxsLCBYODY6OnN1Yl8xNmJpdCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX1RSVU5DQVRFX01WVF9pMzJfTVZUX2k4X3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTMyX01WVF9pMTZfcihPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCit9DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTY0X01WVF9pOF9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfZXh0cmFjdHN1YnJlZyhNVlQ6Omk4LCBPcDAsIE9wMElzS2lsbCwgWDg2OjpzdWJfOGJpdCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTY0X01WVF9pMTZfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X2V4dHJhY3RzdWJyZWcoTVZUOjppMTYsIE9wMCwgT3AwSXNLaWxsLCBYODY6OnN1Yl8xNmJpdCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTY0X01WVF9pMzJfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X2V4dHJhY3RzdWJyZWcoTVZUOjppMzIsIE9wMCwgT3AwSXNLaWxsLCBYODY6OnN1Yl8zMmJpdCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorc3dpdGNoIChSZXRWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX1RSVU5DQVRFX01WVF9pNjRfTVZUX2k4X3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTY0X01WVF9pMTZfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX1RSVU5DQVRFX01WVF9pNjRfTVZUX2kzMl9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1RSVU5DQVRFX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMTY6IHJldHVybiBGYXN0RW1pdF9JU0RfVFJVTkNBVEVfTVZUX2kxNl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX1RSVU5DQVRFX01WVF9pMzJfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9UUlVOQ0FURV9NVlRfaTY0X3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6WkVST19FWFRFTkQuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1pFUk9fRVhURU5EX01WVF9pOF9NVlRfaTE2X3IodW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU9WWlgxNnJyOCwgWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfWkVST19FWFRFTkRfTVZUX2k4X01WVF9pMzJfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1ZaWDMycnI4LCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9aRVJPX0VYVEVORF9NVlRfaThfTVZUX2k2NF9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1PVlpYNjRycjgsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1pFUk9fRVhURU5EX01WVF9pOF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KK3N3aXRjaCAoUmV0VlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMTY6IHJldHVybiBGYXN0RW1pdF9JU0RfWkVST19FWFRFTkRfTVZUX2k4X01WVF9pMTZfcihPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX1pFUk9fRVhURU5EX01WVF9pOF9NVlRfaTMyX3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9aRVJPX0VYVEVORF9NVlRfaThfTVZUX2k2NF9yKE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KK30NCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1pFUk9fRVhURU5EX01WVF9pMTZfTVZUX2kzMl9yKHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1PVlpYMzJycjE2LCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9aRVJPX0VYVEVORF9NVlRfaTE2X01WVF9pNjRfcih1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1ZaWDY0cnIxNiwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfWkVST19FWFRFTkRfTVZUX2kxNl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KK3N3aXRjaCAoUmV0VlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfWkVST19FWFRFTkRfTVZUX2kxNl9NVlRfaTMyX3IoT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9aRVJPX0VYVEVORF9NVlRfaTE2X01WVF9pNjRfcihPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCit9DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9aRVJPX0VYVEVORF9NVlRfaTMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppNjQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6TU9WWlg2NHJyMzIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1pFUk9fRVhURU5EX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9aRVJPX0VYVEVORF9NVlRfaThfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9aRVJPX0VYVEVORF9NVlRfaTE2X3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfWkVST19FWFRFTkRfTVZUX2kzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OkNBTEwuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NBTExfTVZUX2kzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aXNWb2lkKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkNBTEwzMnIsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NBTExfTVZUX2k2NF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aXNWb2lkKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoIVN1YnRhcmdldC0+aXNUYXJnZXRXaW42NCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpDQUxMNjRyLCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aXNUYXJnZXRXaW42NCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpXSU5DQUxMNjRyLCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NBTExfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9DQUxMX01WVF9pMzJfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9DQUxMX01WVF9pNjRfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgWDg2SVNEOjpFSF9SRVRVUk4uDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0VIX1JFVFVSTl9NVlRfaTMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppc1ZvaWQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6RUhfUkVUVVJOLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9FSF9SRVRVUk5fTVZUX2k2NF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aXNWb2lkKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkVIX1JFVFVSTjY0LCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9FSF9SRVRVUk5fcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9FSF9SRVRVUk5fTVZUX2kzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0VIX1JFVFVSTl9NVlRfaTY0X3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIFg4NklTRDo6RlJDUC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRlJDUF9NVlRfZjMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6UkNQU1NyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZSQ1BfTVZUX3Y0ZjMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlZSQ1BQU3IsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpSQ1BQU3IsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZSQ1BfTVZUX3Y4ZjMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2OGYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlZSQ1BQU1lyLCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9GUkNQX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjpmMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRlJDUF9NVlRfZjMyX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGYzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GUkNQX01WVF92NGYzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djhmMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRlJDUF9NVlRfdjhmMzJfcihSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgWDg2SVNEOjpGUlNRUlQuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZSU1FSVF9NVlRfZjMyX3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6UlNRUlRTU3IsIFg4Njo6RlIzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRlJTUVJUX01WVF92NGYzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpWUlNRUlRQU3IsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpSU1FSVFBTciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRlJTUVJUX01WVF92OGYzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djhmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpWUlNRUlRQU1lyLCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9GUlNRUlRfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GUlNRUlRfTVZUX2YzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djRmMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRlJTUVJUX01WVF92NGYzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIE1WVDo6djhmMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRlJTUVJUX01WVF92OGYzMl9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6Ok1FTUJBUlJJRVIuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX01FTUJBUlJJRVJfTVZUX2kzMl9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aXNWb2lkKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoIVN1YnRhcmdldC0+aXM2NEJpdCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpJbnRfTWVtQmFycmllck5vU1NFLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX01FTUJBUlJJRVJfTVZUX2k2NF9yKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aXNWb2lkKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5pczY0Qml0KCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OkludF9NZW1CYXJyaWVyTm9TU0U2NCwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9NRU1CQVJSSUVSX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfTUVNQkFSUklFUl9NVlRfaTMyX3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfTUVNQkFSUklFUl9NVlRfaTY0X3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIFg4NklTRDo6TU9WUTJEUS4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfTU9WUTJEUV9NVlRfdjFpNjRfcihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYyaTY0KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6Ok1NWF9NT1ZRMkRRcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9NT1ZRMkRRX3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjp2MWk2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9NT1ZRMkRRX01WVF92MWk2NF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OlZaRVhUX01PVkwuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1ZaRVhUX01PVkxfTVZUX3YyaTY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2Mmk2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlZNT1ZaUFFJTG8yUFFJcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1ZaUFFJTG8yUFFJcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1ZaRVhUX01PVkxfTVZUX3YyZjY0X3IoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2MmY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNT1ZaUFFJTG8yUFFJcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1ZaRVhUX01PVkxfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OnYyaTY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1ZaRVhUX01PVkxfTVZUX3YyaTY0X3IoUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MmY2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9WWkVYVF9NT1ZMX01WVF92MmY2NF9yKFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gVG9wLWxldmVsIEZhc3RFbWl0IGZ1bmN0aW9uLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X3IoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wY29kZSwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCkgew0KKyAgc3dpdGNoIChPcGNvZGUpIHsNCisgIGNhc2UgSVNEOjpBTllfRVhURU5EOiByZXR1cm4gRmFzdEVtaXRfSVNEX0FOWV9FWFRFTkRfcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpCSVRfQ09OVkVSVDogcmV0dXJuIEZhc3RFbWl0X0lTRF9CSVRfQ09OVkVSVF9yKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OkJSSU5EOiByZXR1cm4gRmFzdEVtaXRfSVNEX0JSSU5EX3IoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIElTRDo6QlNXQVA6IHJldHVybiBGYXN0RW1pdF9JU0RfQlNXQVBfcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpGQUJTOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZBQlNfcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpGQ09TOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZDT1NfcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpGTkVHOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZORUdfcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpGUF9FWFRFTkQ6IHJldHVybiBGYXN0RW1pdF9JU0RfRlBfRVhURU5EX3IoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIElTRDo6RlBfUk9VTkQ6IHJldHVybiBGYXN0RW1pdF9JU0RfRlBfUk9VTkRfcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpGUF9UT19TSU5UOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZQX1RPX1NJTlRfcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpGU0lOOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZTSU5fcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpGU1FSVDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU1FSVF9yKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OlNDQUxBUl9UT19WRUNUT1I6IHJldHVybiBGYXN0RW1pdF9JU0RfU0NBTEFSX1RPX1ZFQ1RPUl9yKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OlNJR05fRVhURU5EOiByZXR1cm4gRmFzdEVtaXRfSVNEX1NJR05fRVhURU5EX3IoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIElTRDo6U0lOVF9UT19GUDogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSU5UX1RPX0ZQX3IoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIElTRDo6VFJVTkNBVEU6IHJldHVybiBGYXN0RW1pdF9JU0RfVFJVTkNBVEVfcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpaRVJPX0VYVEVORDogcmV0dXJuIEZhc3RFbWl0X0lTRF9aRVJPX0VYVEVORF9yKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBYODZJU0Q6OkNBTEw6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfQ0FMTF9yKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwpOw0KKyAgY2FzZSBYODZJU0Q6OkVIX1JFVFVSTjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9FSF9SRVRVUk5fcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpGUkNQOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZSQ1BfcihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpGUlNRUlQ6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRlJTUVJUX3IoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6TUVNQkFSUklFUjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9NRU1CQVJSSUVSX3IoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6TU9WUTJEUTogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9NT1ZRMkRRX3IoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6VlpFWFRfTU9WTDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9WWkVYVF9NT1ZMX3IoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkFERC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQUREX01WVF9pOF9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpBREQ4cmksIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQUREX01WVF9pMTZfcmkoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMTYpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yaShYODY6OkFERDE2cmksIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FERF9NVlRfaTMyX3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpBREQzMnJpLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BRERfcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9BRERfTVZUX2k4X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX0FERF9NVlRfaTE2X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0FERF9NVlRfaTMyX3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkFEREMuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FERENfTVZUX2kzMl9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6QUREMzJyaSwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQUREQ19yaShNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9BRERDX01WVF9pMzJfcmkoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6QURERS4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQURERV9NVlRfaThfcmkoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6QURDOHJpLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FEREVfTVZUX2kxNl9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkxNikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6QURDMTZyaSwgWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQURERV9NVlRfaTMyX3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpBREMzMnJpLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BRERFX3JpKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfQURERV9NVlRfaThfcmkoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGNhc2UgTVZUOjppMTY6IHJldHVybiBGYXN0RW1pdF9JU0RfQURERV9NVlRfaTE2X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0FEREVfTVZUX2kzMl9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpBTkQuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FORF9NVlRfaThfcmkoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6QU5EOHJpLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FORF9NVlRfaTE2X3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTE2KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpBTkQxNnJpLCBYODY6OkdSMTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BTkRfTVZUX2kzMl9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6QU5EMzJyaSwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQU5EX3JpKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfQU5EX01WVF9pOF9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9BTkRfTVZUX2kxNl9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9BTkRfTVZUX2kzMl9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpNVUwuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX01VTF9NVlRfaTE2X3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTE2KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpJTVVMMTZycmksIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX01VTF9NVlRfaTMyX3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpJTVVMMzJycmksIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX01VTF9yaShNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9NVUxfTVZUX2kxNl9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9NVUxfTVZUX2kzMl9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpPUi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfT1JfTVZUX2k4X3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTgpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yaShYODY6Ok9SOHJpLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX09SX01WVF9pMTZfcmkoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMTYpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yaShYODY6Ok9SMTZyaSwgWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfT1JfTVZUX2kzMl9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6T1IzMnJpLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9PUl9yaShNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX09SX01WVF9pOF9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9PUl9NVlRfaTE2X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX09SX01WVF9pMzJfcmkoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6Uk9UTC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfUk9UTF9NVlRfaThfcmkoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6Uk9MOHJpLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1JPVExfcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9ST1RMX01WVF9pOF9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpST1RSLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9ST1RSX01WVF9pOF9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpST1I4cmksIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfUk9UUl9yaShNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX1JPVFJfTVZUX2k4X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OlNITC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0hMX01WVF9pOF9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpTSEw4cmksIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0hMX3JpKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfU0hMX01WVF9pOF9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpTUkEuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NSQV9NVlRfaThfcmkoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6U0FSOHJpLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NSQV9yaShNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NSQV9NVlRfaThfcmkoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6U1JMLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TUkxfTVZUX2k4X3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTgpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yaShYODY6OlNIUjhyaSwgWDg2OjpHUjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TUkxfcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9TUkxfTVZUX2k4X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OlNVQi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCX01WVF9pOF9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpTVUI4cmksIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCX01WVF9pMTZfcmkoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMTYpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yaShYODY6OlNVQjE2cmksIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQl9NVlRfaTMyX3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpTVUIzMnJpLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJfcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJfTVZUX2k4X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQl9NVlRfaTE2X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQl9NVlRfaTMyX3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OlNVQkMuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQkNfTVZUX2kzMl9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6U1VCMzJyaSwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCQ19NVlRfaTY0X3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTY0KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpTVUI2NHJpMzIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQkNfcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfU1VCQ19NVlRfaTMyX3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQkNfTVZUX2k2NF9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpTVUJFLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJFX01WVF9pOF9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpTQkI4cmksIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCRV9NVlRfaTE2X3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTE2KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpTQkIxNnJpLCBYODY6OkdSMTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJFX01WVF9pMzJfcmkoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yaShYODY6OlNCQjMycmksIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQkVfcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJFX01WVF9pOF9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJFX01WVF9pMTZfcmkoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfU1VCRV9NVlRfaTMyX3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OlhPUi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfWE9SX01WVF9pOF9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpYT1I4cmksIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfWE9SX01WVF9pMTZfcmkoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMTYpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yaShYODY6OlhPUjE2cmksIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1hPUl9NVlRfaTMyX3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpYT1IzMnJpLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9YT1JfcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9YT1JfTVZUX2k4X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX1hPUl9NVlRfaTE2X3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX1hPUl9NVlRfaTMyX3JpKFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OkNNUC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfQ01QX01WVF9pOF9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6Q01QOHJpLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NNUF9NVlRfaTE2X3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcmkoWDg2OjpDTVAxNnJpLCBYODY6OkdSMTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9DTVBfTVZUX2kzMl9yaShNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6Q01QMzJyaSwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfQ01QX3JpKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBpbW0xKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTg6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfQ01QX01WVF9pOF9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9DTVBfTVZUX2kxNl9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9DTVBfTVZUX2kzMl9yaShSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgWDg2SVNEOjpUQ19SRVRVUk4uDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1RDX1JFVFVSTl9NVlRfaTMyX3JpKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aXNWb2lkKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoIVN1YnRhcmdldC0+aXM2NEJpdCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JpKFg4Njo6VENSRVRVUk5yaSwgWDg2OjpHUjMyX1RDUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9UQ19SRVRVUk5fcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IGltbTEpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfVENfUkVUVVJOX01WVF9pMzJfcmkoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBUb3AtbGV2ZWwgRmFzdEVtaXQgZnVuY3Rpb24uDQorDQordW5zaWduZWQgRmFzdEVtaXRfcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wY29kZSwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdWludDY0X3QgaW1tMSkgew0KKyAgc3dpdGNoIChPcGNvZGUpIHsNCisgIGNhc2UgSVNEOjpBREQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQUREX3JpKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBJU0Q6OkFEREM6IHJldHVybiBGYXN0RW1pdF9JU0RfQUREQ19yaShWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGNhc2UgSVNEOjpBRERFOiByZXR1cm4gRmFzdEVtaXRfSVNEX0FEREVfcmkoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIElTRDo6QU5EOiByZXR1cm4gRmFzdEVtaXRfSVNEX0FORF9yaShWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGNhc2UgSVNEOjpNVUw6IHJldHVybiBGYXN0RW1pdF9JU0RfTVVMX3JpKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBJU0Q6Ok9SOiByZXR1cm4gRmFzdEVtaXRfSVNEX09SX3JpKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBJU0Q6OlJPVEw6IHJldHVybiBGYXN0RW1pdF9JU0RfUk9UTF9yaShWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGNhc2UgSVNEOjpST1RSOiByZXR1cm4gRmFzdEVtaXRfSVNEX1JPVFJfcmkoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIElTRDo6U0hMOiByZXR1cm4gRmFzdEVtaXRfSVNEX1NITF9yaShWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGNhc2UgSVNEOjpTUkE6IHJldHVybiBGYXN0RW1pdF9JU0RfU1JBX3JpKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBJU0Q6OlNSTDogcmV0dXJuIEZhc3RFbWl0X0lTRF9TUkxfcmkoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIElTRDo6U1VCOiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQl9yaShWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGNhc2UgSVNEOjpTVUJDOiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQkNfcmkoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIElTRDo6U1VCRTogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJFX3JpKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgY2FzZSBJU0Q6OlhPUjogcmV0dXJuIEZhc3RFbWl0X0lTRF9YT1JfcmkoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgaW1tMSk7DQorICBjYXNlIFg4NklTRDo6Q01QOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0NNUF9yaShWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBpbW0xKTsNCisgIGNhc2UgWDg2SVNEOjpUQ19SRVRVUk46IHJldHVybiBGYXN0RW1pdF9YODZJU0RfVENfUkVUVVJOX3JpKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIGltbTEpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpBREQuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FERF9NVlRfaThfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6QUREOHJyLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BRERfTVZUX2kxNl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkxNikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6QUREMTZyciwgWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FERF9NVlRfaTMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpBREQzMnJyLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQUREX01WVF9pNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppNjQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkFERDY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BRERfTVZUX3Y4aThfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2OGk4KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNNTVgoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1NWF9QQUREQnJyLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BRERfTVZUX3YxNmk4X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djE2aTgpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlBBRERCcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBBRERCcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BRERfTVZUX3Y0aTE2X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRpMTYpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc01NWCgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TU1YX1BBRERXcnIsIFg4Njo6VlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FERF9NVlRfdjhpMTZfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2OGkxNikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWUEFERFdyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6UEFERFdyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FERF9NVlRfdjJpMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2MmkzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzTU1YKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpNTVhfUEFERERyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQUREX01WVF92NGkzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY0aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZQQURERHJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpQQURERHJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQUREX01WVF92MWk2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYxaTY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNNTVgoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1NWF9QQUREUXJyLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BRERfTVZUX3YyaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djJpNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlBBRERRcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBBRERRcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BRERfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9BRERfTVZUX2k4X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9BRERfTVZUX2kxNl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfQUREX01WVF9pMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0FERF9NVlRfaTY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY4aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfQUREX01WVF92OGk4X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYxNmk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX0FERF9NVlRfdjE2aThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djRpMTY6IHJldHVybiBGYXN0RW1pdF9JU0RfQUREX01WVF92NGkxNl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2OGkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9BRERfTVZUX3Y4aTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYyaTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0FERF9NVlRfdjJpMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djRpMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfQUREX01WVF92NGkzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MWk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9BRERfTVZUX3YxaTY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYyaTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0FERF9NVlRfdjJpNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkFEREMuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FERENfTVZUX2kzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6QUREMzJyciwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FERENfTVZUX2k2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk2NCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6QURENjRyciwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FERENfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfQUREQ19NVlRfaTMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9BRERDX01WVF9pNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkFEREUuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FEREVfTVZUX2k4X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTgpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkFEQzhyciwgWDg2OjpHUjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQURERV9NVlRfaTE2X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTE2KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpBREMxNnJyLCBYODY6OkdSMTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQURERV9NVlRfaTMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpBREMzMnJyLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQURERV9NVlRfaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTY0KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpBREM2NHJyLCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQURERV9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX0FEREVfTVZUX2k4X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9BRERFX01WVF9pMTZfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0FEREVfTVZUX2kzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQURERV9NVlRfaTY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpBTkQuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FORF9NVlRfaThfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6QU5EOHJyLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BTkRfTVZUX2kxNl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkxNikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6QU5EMTZyciwgWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FORF9NVlRfaTMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpBTkQzMnJyLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQU5EX01WVF9pNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppNjQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkFORDY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9BTkRfTVZUX3YxaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djFpNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc01NWCgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TU1YX1BBTkRyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfQU5EX01WVF92Mmk2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYyaTY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZQQU5EcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkFORFBTcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBBTkRyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0FORF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX0FORF9NVlRfaThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX0FORF9NVlRfaTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9BTkRfTVZUX2kzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQU5EX01WVF9pNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djFpNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQU5EX01WVF92MWk2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2Mmk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9BTkRfTVZUX3YyaTY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpGQURELg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GQUREX01WVF9mMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5oYXNTU0UxKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpBRERfRnAzMiwgWDg2OjpSRlAzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWQUREU1NyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpBRERTU3JyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GQUREX01WVF9mNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5oYXNTU0UyKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpBRERfRnA2NCwgWDg2OjpSRlA2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWQUREU0RyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpBRERTRHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GQUREX01WVF9mODBfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmODApDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkFERF9GcDgwLCBYODY6OlJGUDgwUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZBRERfTVZUX3Y0ZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VkFERFBTcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkFERFBTcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GQUREX01WVF92OGYzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY4ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZBRERQU1lyciwgWDg2OjpWUjI1NlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZBRERfTVZUX3YyZjY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djJmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VkFERFBEcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkFERFBEcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GQUREX01WVF92NGY2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY0ZjY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZBRERQRFlyciwgWDg2OjpWUjI1NlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZBRERfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjpmMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfRkFERF9NVlRfZjMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GQUREX01WVF9mNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjgwOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZBRERfTVZUX2Y4MF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GQUREX01WVF92NGYzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2OGYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GQUREX01WVF92OGYzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GQUREX01WVF92MmY2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GQUREX01WVF92NGY2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6RkRJVi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoIVN1YnRhcmdldC0+aGFzU1NFMSgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6RElWX0ZwMzIsIFg4Njo6UkZQMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VkRJVlNTcnIsIFg4Njo6RlIzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6RElWU1NyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfZjY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoIVN1YnRhcmdldC0+aGFzU1NFMigpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6RElWX0ZwNjQsIFg4Njo6UkZQNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VkRJVlNEcnIsIFg4Njo6RlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6RElWU0RyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfZjgwX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjgwKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpESVZfRnA4MCwgWDg2OjpSRlA4MFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GRElWX01WVF92NGYzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY0ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZESVZQU3JyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpESVZQU3JyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfdjhmMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2OGYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWRElWUFNZcnIsIFg4Njo6VlIyNTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GRElWX01WVF92MmY2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYyZjY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZESVZQRHJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpESVZQRHJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfdjRmNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWRElWUERZcnIsIFg4Njo6VlIyNTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GRElWX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6ZjMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZESVZfTVZUX2YzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfZjY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY4MDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GRElWX01WVF9mODBfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djRmMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfdjRmMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djhmMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfdjhmMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djJmNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfdjJmNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djRmNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfRkRJVl9NVlRfdjRmNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OkZNVUwuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX2YzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKCFTdWJ0YXJnZXQtPmhhc1NTRTEoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1VTF9GcDMyLCBYODY6OlJGUDMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZNVUxTU3JyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1VTFNTcnIsIFg4Njo6RlIzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX2Y2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKCFTdWJ0YXJnZXQtPmhhc1NTRTIoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1VTF9GcDY0LCBYODY6OlJGUDY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZNVUxTRHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1VTFNEcnIsIFg4Njo6RlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX2Y4MF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmY4MCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TVVMX0ZwODAsIFg4Njo6UkZQODBSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRk1VTF9NVlRfdjRmMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWTVVMUFNyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TVVMUFNyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX3Y4ZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djhmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6Vk1VTFBTWXJyLCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRk1VTF9NVlRfdjJmNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2MmY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWTVVMUERyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TVVMUERyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX3Y0ZjY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6Vk1VTFBEWXJyLCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfRk1VTF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GTVVMX01WVF9mMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX2Y2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmODA6IHJldHVybiBGYXN0RW1pdF9JU0RfRk1VTF9NVlRfZjgwX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY0ZjMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX3Y0ZjMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY4ZjMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX3Y4ZjMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYyZjY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX3YyZjY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY0ZjY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZNVUxfTVZUX3Y0ZjY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpGU1VCLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GU1VCX01WVF9mMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5oYXNTU0UxKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpTVUJfRnAzMiwgWDg2OjpSRlAzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWU1VCU1NyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpTVUJTU3JyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GU1VCX01WVF9mNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5oYXNTU0UyKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpTVUJfRnA2NCwgWDg2OjpSRlA2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWU1VCU0RyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpTVUJTRHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GU1VCX01WVF9mODBfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmODApDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlNVQl9GcDgwLCBYODY6OlJGUDgwUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZTVUJfTVZUX3Y0ZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlNVQlBTcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlNVQlBTcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GU1VCX01WVF92OGYzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY4ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZTVUJQU1lyciwgWDg2OjpWUjI1NlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZTVUJfTVZUX3YyZjY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djJmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlNVQlBEcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlNVQlBEcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9GU1VCX01WVF92NGY2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY0ZjY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZTVUJQRFlyciwgWDg2OjpWUjI1NlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX0ZTVUJfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjpmMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfRlNVQl9NVlRfZjMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU1VCX01WVF9mNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjgwOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZTVUJfTVZUX2Y4MF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU1VCX01WVF92NGYzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2OGYzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU1VCX01WVF92OGYzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MmY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU1VCX01WVF92MmY2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGY2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU1VCX01WVF92NGY2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6TVVMLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9NVUxfTVZUX2k4X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTgpDQorICAgIHJldHVybiAwOw0KKyAgQnVpbGRNSSgqRnVuY0luZm8uTUJCLCBGdW5jSW5mby5JbnNlcnRQdCwgREwsIFRJSS5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgWDg2OjpBTCkuYWRkUmVnKE9wMCk7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpNVUw4ciwgWDg2OjpHUjhSZWdpc3RlckNsYXNzLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9NVUxfTVZUX2kxNl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkxNikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6SU1VTDE2cnIsIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9NVUxfTVZUX2kzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6SU1VTDMycnIsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9NVUxfTVZUX2k2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk2NCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6SU1VTDY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9NVUxfTVZUX3Y0aTE2X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRpMTYpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc01NWCgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TU1YX1BNVUxMV3JyLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9NVUxfTVZUX3Y4aTE2X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djhpMTYpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlBNVUxMV3JyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpQTVVMTFdyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX01VTF9NVlRfdjRpMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGkzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWUE1VTExEcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTQxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpQTVVMTERyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX01VTF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX01VTF9NVlRfaThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX01VTF9NVlRfaTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9NVUxfTVZUX2kzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfTVVMX01WVF9pNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djRpMTY6IHJldHVybiBGYXN0RW1pdF9JU0RfTVVMX01WVF92NGkxNl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2OGkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9NVUxfTVZUX3Y4aTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY0aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX01VTF9NVlRfdjRpMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6Ok9SLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9PUl9NVlRfaThfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6T1I4cnIsIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX09SX01WVF9pMTZfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMTYpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok9SMTZyciwgWDg2OjpHUjE2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX09SX01WVF9pMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok9SMzJyciwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX09SX01WVF9pNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppNjQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok9SNjRyciwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX09SX01WVF92MWk2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYxaTY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNNTVgoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1NWF9QT1JyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfT1JfTVZUX3YyaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djJpNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlBPUnJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpPUlBTcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBPUnJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfT1JfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9PUl9NVlRfaThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX09SX01WVF9pMTZfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX09SX01WVF9pMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX09SX01WVF9pNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djFpNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfT1JfTVZUX3YxaTY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYyaTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX09SX01WVF92Mmk2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6Uk9UTC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfUk9UTF9NVlRfaThfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICBCdWlsZE1JKCpGdW5jSW5mby5NQkIsIEZ1bmNJbmZvLkluc2VydFB0LCBETCwgVElJLmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLCBYODY6OkNMKS5hZGRSZWcoT3AxKTsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlJPTDhyQ0wsIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfUk9UTF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX1JPVExfTVZUX2k4X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpST1RSLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9ST1RSX01WVF9pOF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIEJ1aWxkTUkoKkZ1bmNJbmZvLk1CQiwgRnVuY0luZm8uSW5zZXJ0UHQsIERMLCBUSUkuZ2V0KFRhcmdldE9wY29kZTo6Q09QWSksIFg4Njo6Q0wpLmFkZFJlZyhPcDEpOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6Uk9SOHJDTCwgWDg2OjpHUjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9ST1RSX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfUk9UUl9NVlRfaThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OlNITC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU0hMX01WVF9pOF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIEJ1aWxkTUkoKkZ1bmNJbmZvLk1CQiwgRnVuY0luZm8uSW5zZXJ0UHQsIERMLCBUSUkuZ2V0KFRhcmdldE9wY29kZTo6Q09QWSksIFg4Njo6Q0wpLmFkZFJlZyhPcDEpOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9yKFg4Njo6U0hMOHJDTCwgWDg2OjpHUjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TSExfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjppODogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSExfTVZUX2k4X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgSVNEOjpTUkEuDQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NSQV9NVlRfaThfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICBCdWlsZE1JKCpGdW5jSW5mby5NQkIsIEZ1bmNJbmZvLkluc2VydFB0LCBETCwgVElJLmdldChUYXJnZXRPcGNvZGU6OkNPUFkpLCBYODY6OkNMKS5hZGRSZWcoT3AxKTsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcihYODY6OlNBUjhyQ0wsIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1JBX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfU1JBX01WVF9pOF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6U1JMLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TUkxfTVZUX2k4X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTgpDQorICAgIHJldHVybiAwOw0KKyAgQnVpbGRNSSgqRnVuY0luZm8uTUJCLCBGdW5jSW5mby5JbnNlcnRQdCwgREwsIFRJSS5nZXQoVGFyZ2V0T3Bjb2RlOjpDT1BZKSwgWDg2OjpDTCkuYWRkUmVnKE9wMSk7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3IoWDg2OjpTSFI4ckNMLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NSTF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NSTF9NVlRfaThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OlNVQi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCX01WVF9pOF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpTVUI4cnIsIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQl9NVlRfaTE2X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTE2KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpTVUIxNnJyLCBYODY6OkdSMTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCX01WVF9pMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlNVQjMycnIsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJfTVZUX2k2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk2NCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6U1VCNjRyciwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQl9NVlRfdjhpOF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY4aTgpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc01NWCgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TU1YX1BTVUJCcnIsIFg4Njo6VlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQl9NVlRfdjE2aThfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2MTZpOCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWUFNVQkJyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6UFNVQkJyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQl9NVlRfdjRpMTZfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGkxNikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzTU1YKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpNTVhfUFNVQldyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCX01WVF92OGkxNl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY4aTE2KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZQU1VCV3JyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpQU1VCV3JyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCX01WVF92MmkzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYyaTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNNTVgoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1NWF9QU1VCRHJyLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJfTVZUX3Y0aTMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRpMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlBTVUJEcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBTVUJEcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJfTVZUX3YxaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djFpNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc01NWCgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TU1YX1BTVUJRcnIsIFg4Njo6VlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQl9NVlRfdjJpNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2Mmk2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWUFNVQlFyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6UFNVQlFyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1NVQl9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQl9NVlRfaThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQl9NVlRfaTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJfTVZUX2kzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfU1VCX01WVF9pNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djhpODogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJfTVZUX3Y4aThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djE2aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfU1VCX01WVF92MTZpOF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGkxNjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJfTVZUX3Y0aTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY4aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQl9NVlRfdjhpMTZfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djJpMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfU1VCX01WVF92MmkzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJfTVZUX3Y0aTMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYxaTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQl9NVlRfdjFpNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djJpNjQ6IHJldHVybiBGYXN0RW1pdF9JU0RfU1VCX01WVF92Mmk2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6U1VCQy4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCQ19NVlRfaTMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpTVUIzMnJyLCBYODY6OkdSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCQ19NVlRfaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTY0KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpTVUI2NHJyLCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCQ19ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJDX01WVF9pMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQkNfTVZUX2k2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIElTRDo6U1VCRS4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfU1VCRV9NVlRfaThfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6U0JCOHJyLCBYODY6OkdSOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJFX01WVF9pMTZfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMTYpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlNCQjE2cnIsIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJFX01WVF9pMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlNCQjMycnIsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJFX01WVF9pNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppNjQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlNCQjY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9TVUJFX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfU1VCRV9NVlRfaThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfSVNEX1NVQkVfTVZUX2kxNl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppMzI6IHJldHVybiBGYXN0RW1pdF9JU0RfU1VCRV9NVlRfaTMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJFX01WVF9pNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBJU0Q6OlhPUi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfWE9SX01WVF9pOF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk4KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpYT1I4cnIsIFg4Njo6R1I4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1hPUl9NVlRfaTE2X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTE2KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpYT1IxNnJyLCBYODY6OkdSMTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfWE9SX01WVF9pMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlhPUjMycnIsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9YT1JfTVZUX2k2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6Omk2NCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6WE9SNjRyciwgWDg2OjpHUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfSVNEX1hPUl9NVlRfdjFpNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2MWk2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzTU1YKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpNTVhfUFhPUnJyLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X0lTRF9YT1JfTVZUX3YyaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djJpNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlBYT1JyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6WE9SUFNyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6UFhPUnJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9JU0RfWE9SX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6aTg6IHJldHVybiBGYXN0RW1pdF9JU0RfWE9SX01WVF9pOF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppMTY6IHJldHVybiBGYXN0RW1pdF9JU0RfWE9SX01WVF9pMTZfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTMyOiByZXR1cm4gRmFzdEVtaXRfSVNEX1hPUl9NVlRfaTMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9YT1JfTVZUX2k2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MWk2NDogcmV0dXJuIEZhc3RFbWl0X0lTRF9YT1JfTVZUX3YxaTY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYyaTY0OiByZXR1cm4gRmFzdEVtaXRfSVNEX1hPUl9NVlRfdjJpNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OkJULg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9CVF9NVlRfaTE2X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpCVDE2cnIsIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9CVF9NVlRfaTMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpCVDMycnIsIFg4Njo6R1IzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9CVF9NVlRfaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpCVDY0cnIsIFg4Njo6R1I2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9CVF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmkxNjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9CVF9NVlRfaTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9CVF9NVlRfaTMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6Omk2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9CVF9NVlRfaTY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgWDg2SVNEOjpDTVAuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NNUF9NVlRfaThfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkNNUDhyciwgWDg2OjpHUjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfQ01QX01WVF9pMTZfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkNNUDE2cnIsIFg4Njo6R1IxNlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9DTVBfTVZUX2kzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6Q01QMzJyciwgWDg2OjpHUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NNUF9NVlRfaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpDTVA2NHJyLCBYODY6OkdSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfQ01QX01WVF9mMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5oYXNTU0UxKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpVQ09NX0ZwSXIzMiwgWDg2OjpSRlAzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWVUNPTUlTU3JyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlVDT01JU1NyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfQ01QX01WVF9mNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKCghU3VidGFyZ2V0LT5oYXNTU0UyKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpVQ09NX0ZwSXI2NCwgWDg2OjpSRlA2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWVUNPTUlTRHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlVDT01JU0RyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfQ01QX01WVF9mODBfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlVDT01fRnBJcjgwLCBYODY6OlJGUDgwUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NNUF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6Omk4OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0NNUF9NVlRfaThfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6aTE2OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0NNUF9NVlRfaTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmkzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9DTVBfTVZUX2kzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjppNjQ6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfQ01QX01WVF9pNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjMyOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0NNUF9NVlRfZjMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9DTVBfTVZUX2Y2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmODA6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfQ01QX01WVF9mODBfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OkNPTUkuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NPTUlfTVZUX3Y0ZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkludF9WQ09NSVNTcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkludF9DT01JU1NyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NPTUlfTVZUX3YyZjY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkludF9WQ09NSVNEcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkludF9DT01JU0RyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0NPTUlfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjp2NGYzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9DT01JX01WVF92NGYzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MmY2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9DT01JX01WVF92MmY2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIFg4NklTRDo6RkFORC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRkFORF9NVlRfZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZGc0FORFBTcnIsIFg4Njo6RlIzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6RnNBTkRQU3JyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9GQU5EX01WVF9mNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VkZzQU5EUERyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpGc0FORFBEcnIsIFg4Njo6RlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZBTkRfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjpmMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRkFORF9NVlRfZjMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OmY2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GQU5EX01WVF9mNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OkZNQVguDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZNQVhfTVZUX2YzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWTUFYU1NyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpNQVhTU3JyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9GTUFYX01WVF9mNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6Vk1BWFNEcnIsIFg4Njo6RlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TUFYU0RyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRk1BWF9NVlRfdjRmMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWTUFYUFNyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TUFYUFNyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZNQVhfTVZUX3Y4ZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djhmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6Vk1BWFBTWXJyLCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRk1BWF9NVlRfdjJmNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2MmY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWTUFYUERyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TUFYUERyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZNQVhfTVZUX3Y0ZjY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6Vk1BWFBEWXJyLCBYODY6OlZSMjU2UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRk1BWF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GTUFYX01WVF9mMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZNQVhfTVZUX2Y2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGYzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GTUFYX01WVF92NGYzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2OGYzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GTUFYX01WVF92OGYzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MmY2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GTUFYX01WVF92MmY2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGY2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GTUFYX01WVF92NGY2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIFg4NklTRDo6Rk1JTi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRk1JTl9NVlRfZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZNSU5TU3JyLCBYODY6OkZSMzJSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1JTlNTcnIsIFg4Njo6RlIzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZNSU5fTVZUX2Y2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWTUlOU0RyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpNSU5TRHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9GTUlOX01WVF92NGYzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY0ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZNSU5QU3JyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpNSU5QU3JyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRk1JTl9NVlRfdjhmMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2OGYzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWTUlOUFNZcnIsIFg4Njo6VlIyNTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9GTUlOX01WVF92MmY2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYyZjY0KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZNSU5QRHJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UyKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpNSU5QRHJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRk1JTl9NVlRfdjRmNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWTUlOUERZcnIsIFg4Njo6VlIyNTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9GTUlOX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6ZjMyOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZNSU5fTVZUX2YzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjpmNjQ6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRk1JTl9NVlRfZjY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY0ZjMyOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZNSU5fTVZUX3Y0ZjMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY4ZjMyOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZNSU5fTVZUX3Y4ZjMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYyZjY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZNSU5fTVZUX3YyZjY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY0ZjY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZNSU5fTVZUX3Y0ZjY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgWDg2SVNEOjpGT1IuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZPUl9NVlRfZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6ZjMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZGc09SUFNyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpGc09SUFNyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRk9SX01WVF9mNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmNjQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VkZzT1JQRHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkZzT1JQRHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9GT1JfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjpmMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRk9SX01WVF9mMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZPUl9NVlRfZjY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgWDg2SVNEOjpGWE9SLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9GWE9SX01WVF9mMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjpmMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VkZzWE9SUFNyciwgWDg2OjpGUjMyUmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU0UxKCkgJiYgIVN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpGc1hPUlBTcnIsIFg4Njo6RlIzMlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX0ZYT1JfTVZUX2Y2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmY2NCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWRnNYT1JQRHJyLCBYODY6OkZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc1NTRTIoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OkZzWE9SUERyciwgWDg2OjpGUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfRlhPUl9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OmYzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GWE9SX01WVF9mMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6ZjY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZYT1JfTVZUX2Y2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIFg4NklTRDo6UENNUEVRQi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfUENNUEVRQl9NVlRfdjhpOF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY4aTgpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1NWF9QQ01QRVFCcnIsIFg4Njo6VlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QQ01QRVFCX01WVF92MTZpOF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYxNmk4KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpQQ01QRVFCcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfUENNUEVRQl9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OnY4aTg6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUENNUEVRQl9NVlRfdjhpOF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2MTZpODogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QQ01QRVFCX01WVF92MTZpOF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIFg4NklTRDo6UENNUEVRRC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfUENNUEVRRF9NVlRfdjJpMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2MmkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TU1YX1BDTVBFUURyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1BDTVBFUURfTVZUX3Y0aTMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRpMzIpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBDTVBFUURyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QQ01QRVFEX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6djJpMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUENNUEVRRF9NVlRfdjJpMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djRpMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUENNUEVRRF9NVlRfdjRpMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OlBDTVBFUVEuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1BDTVBFUVFfTVZUX3YyaTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djJpNjQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBDTVBFUVFyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QQ01QRVFRX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6djJpNjQ6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUENNUEVRUV9NVlRfdjJpNjRfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OlBDTVBFUVcuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1BDTVBFUVdfTVZUX3Y0aTE2X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djRpMTYpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6Ok1NWF9QQ01QRVFXcnIsIFg4Njo6VlI2NFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QQ01QRVFXX01WVF92OGkxNl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnY4aTE2KQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpQQ01QRVFXcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfUENNUEVRV19ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OnY0aTE2OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1BDTVBFUVdfTVZUX3Y0aTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY4aTE2OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1BDTVBFUVdfTVZUX3Y4aTE2X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgWDg2SVNEOjpQQ01QR1RCLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QQ01QR1RCX01WVF92OGk4X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djhpOCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TU1YX1BDTVBHVEJyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1BDTVBHVEJfTVZUX3YxNmk4X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djE2aTgpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBDTVBHVEJyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QQ01QR1RCX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6djhpODogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QQ01QR1RCX01WVF92OGk4X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYxNmk4OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1BDTVBHVEJfTVZUX3YxNmk4X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgWDg2SVNEOjpQQ01QR1RELg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QQ01QR1REX01WVF92MmkzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYyaTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpNTVhfUENNUEdURHJyLCBYODY6OlZSNjRSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfUENNUEdURF9NVlRfdjRpMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGkzMikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6UENNUEdURHJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1BDTVBHVERfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjp2MmkzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QQ01QR1REX01WVF92MmkzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGkzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QQ01QR1REX01WVF92NGkzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIFg4NklTRDo6UENNUEdUUS4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfUENNUEdUUV9NVlRfdjJpNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2Mmk2NCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6UENNUEdUUXJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1BDTVBHVFFfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjp2Mmk2NDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QQ01QR1RRX01WVF92Mmk2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIFg4NklTRDo6UENNUEdUVy4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfUENNUEdUV19NVlRfdjRpMTZfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjp2NGkxNikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6TU1YX1BDTVBHVFdyciwgWDg2OjpWUjY0UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1BDTVBHVFdfTVZUX3Y4aTE2X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6djhpMTYpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBDTVBHVFdyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QQ01QR1RXX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6djRpMTY6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUENNUEdUV19NVlRfdjRpMTZfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djhpMTY6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUENNUEdUV19NVlRfdjhpMTZfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OlBTSFVGQi4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfUFNIVUZCX01WVF92MTZpOF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OnYxNmk4KQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNTU1NFMygpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6UFNIVUZCcnIxMjgsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QU0hVRkJfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsNCisgIGNhc2UgTVZUOjp2MTZpODogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QU0hVRkJfTVZUX3YxNmk4X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgZGVmYXVsdDogcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKy8vIEZhc3RFbWl0IGZ1bmN0aW9ucyBmb3IgWDg2SVNEOjpQVEVTVC4NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfUFRFU1RfTVZUX3Y0aTY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZQVEVTVFlyciwgWDg2OjpWUjI1NlJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1BURVNUX01WVF92NGYzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpWUFRFU1RyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFNDEoKSAmJiAhU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlBURVNUcnIsIFg4Njo6VlIxMjhSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9QVEVTVF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OnY0aTY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1BURVNUX01WVF92NGk2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2NGYzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QVEVTVF9NVlRfdjRmMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLy8gRmFzdEVtaXQgZnVuY3Rpb25zIGZvciBYODZJU0Q6OlRFU1RQLg0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9URVNUUF9NVlRfdjRmMzJfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlRFU1RQU3JyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfVEVTVFBfTVZUX3Y4ZjMyX3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZURVNUUFNZcnIsIFg4Njo6VlIyNTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9URVNUUF9NVlRfdjJmNjRfcnIoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBpZiAoUmV0VlQuU2ltcGxlVHkgIT0gTVZUOjppMzIpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKChTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6VlRFU1RQRHJyLCBYODY6OlZSMTI4UmVnaXN0ZXJDbGFzcywgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit1bnNpZ25lZCBGYXN0RW1pdF9YODZJU0RfVEVTVFBfTVZUX3Y0ZjY0X3JyKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgaWYgKFJldFZULlNpbXBsZVR5ICE9IE1WVDo6aTMyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICgoU3VidGFyZ2V0LT5oYXNBVlgoKSkpIHsNCisgICAgcmV0dXJuIEZhc3RFbWl0SW5zdF9ycihYODY6OlZURVNUUERZcnIsIFg4Njo6VlIyNTZSZWdpc3RlckNsYXNzLCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3Vuc2lnbmVkIEZhc3RFbWl0X1g4NklTRF9URVNUUF9ycihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChWVC5TaW1wbGVUeSkgew0KKyAgY2FzZSBNVlQ6OnY0ZjMyOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1RFU1RQX01WVF92NGYzMl9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgTVZUOjp2OGYzMjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9URVNUUF9NVlRfdjhmMzJfcnIoUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIE1WVDo6djJmNjQ6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfVEVTVFBfTVZUX3YyZjY0X3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnY0ZjY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1RFU1RQX01WVF92NGY2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBGYXN0RW1pdCBmdW5jdGlvbnMgZm9yIFg4NklTRDo6VUNPTUkuDQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1VDT01JX01WVF92NGYzMl9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpJbnRfVlVDT01JU1NyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMSgpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6SW50X1VDT01JU1NyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1VDT01JX01WVF92MmY2NF9ycihNVlQgUmV0VlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpIHsNCisgIGlmIChSZXRWVC5TaW1wbGVUeSAhPSBNVlQ6OmkzMikNCisgICAgcmV0dXJuIDA7DQorICBpZiAoKFN1YnRhcmdldC0+aGFzQVZYKCkpKSB7DQorICAgIHJldHVybiBGYXN0RW1pdEluc3RfcnIoWDg2OjpJbnRfVlVDT01JU0RyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICBpZiAoKFN1YnRhcmdldC0+aGFzU1NFMigpICYmICFTdWJ0YXJnZXQtPmhhc0FWWCgpKSkgew0KKyAgICByZXR1cm4gRmFzdEVtaXRJbnN0X3JyKFg4Njo6SW50X1VDT01JU0RyciwgWDg2OjpWUjEyOFJlZ2lzdGVyQ2xhc3MsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordW5zaWduZWQgRmFzdEVtaXRfWDg2SVNEX1VDT01JX3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKSB7DQorICBzd2l0Y2ggKFZULlNpbXBsZVR5KSB7DQorICBjYXNlIE1WVDo6djRmMzI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfVUNPTUlfTVZUX3Y0ZjMyX3JyKFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBNVlQ6OnYyZjY0OiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1VDT01JX01WVF92MmY2NF9ycihSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisvLyBUb3AtbGV2ZWwgRmFzdEVtaXQgZnVuY3Rpb24uDQorDQordW5zaWduZWQgRmFzdEVtaXRfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wY29kZSwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCkgew0KKyAgc3dpdGNoIChPcGNvZGUpIHsNCisgIGNhc2UgSVNEOjpBREQ6IHJldHVybiBGYXN0RW1pdF9JU0RfQUREX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpBRERDOiByZXR1cm4gRmFzdEVtaXRfSVNEX0FERENfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OkFEREU6IHJldHVybiBGYXN0RW1pdF9JU0RfQURERV9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIElTRDo6QU5EOiByZXR1cm4gRmFzdEVtaXRfSVNEX0FORF9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIElTRDo6RkFERDogcmV0dXJuIEZhc3RFbWl0X0lTRF9GQUREX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpGRElWOiByZXR1cm4gRmFzdEVtaXRfSVNEX0ZESVZfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OkZNVUw6IHJldHVybiBGYXN0RW1pdF9JU0RfRk1VTF9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIElTRDo6RlNVQjogcmV0dXJuIEZhc3RFbWl0X0lTRF9GU1VCX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpNVUw6IHJldHVybiBGYXN0RW1pdF9JU0RfTVVMX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpPUjogcmV0dXJuIEZhc3RFbWl0X0lTRF9PUl9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIElTRDo6Uk9UTDogcmV0dXJuIEZhc3RFbWl0X0lTRF9ST1RMX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpST1RSOiByZXR1cm4gRmFzdEVtaXRfSVNEX1JPVFJfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OlNITDogcmV0dXJuIEZhc3RFbWl0X0lTRF9TSExfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OlNSQTogcmV0dXJuIEZhc3RFbWl0X0lTRF9TUkFfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OlNSTDogcmV0dXJuIEZhc3RFbWl0X0lTRF9TUkxfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OlNVQjogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBJU0Q6OlNVQkM6IHJldHVybiBGYXN0RW1pdF9JU0RfU1VCQ19ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIElTRDo6U1VCRTogcmV0dXJuIEZhc3RFbWl0X0lTRF9TVUJFX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgSVNEOjpYT1I6IHJldHVybiBGYXN0RW1pdF9JU0RfWE9SX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpCVDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9CVF9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6Q01QOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0NNUF9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6Q09NSTogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9DT01JX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpGQU5EOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZBTkRfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBYODZJU0Q6OkZNQVg6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRk1BWF9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6Rk1JTjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9GTUlOX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpGT1I6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfRk9SX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpGWE9SOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX0ZYT1JfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBYODZJU0Q6OlBDTVBFUUI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUENNUEVRQl9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6UENNUEVRRDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QQ01QRVFEX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpQQ01QRVFROiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1BDTVBFUVFfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBYODZJU0Q6OlBDTVBFUVc6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUENNUEVRV19ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6UENNUEdUQjogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QQ01QR1RCX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpQQ01QR1REOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1BDTVBHVERfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBYODZJU0Q6OlBDTVBHVFE6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUENNUEdUUV9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6UENNUEdUVzogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QQ01QR1RXX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpQU0hVRkI6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfUFNIVUZCX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGNhc2UgWDg2SVNEOjpQVEVTVDogcmV0dXJuIEZhc3RFbWl0X1g4NklTRF9QVEVTVF9ycihWVCwgUmV0VlQsIE9wMCwgT3AwSXNLaWxsLCBPcDEsIE9wMUlzS2lsbCk7DQorICBjYXNlIFg4NklTRDo6VEVTVFA6IHJldHVybiBGYXN0RW1pdF9YODZJU0RfVEVTVFBfcnIoVlQsIFJldFZULCBPcDAsIE9wMElzS2lsbCwgT3AxLCBPcDFJc0tpbGwpOw0KKyAgY2FzZSBYODZJU0Q6OlVDT01JOiByZXR1cm4gRmFzdEVtaXRfWDg2SVNEX1VDT01JX3JyKFZULCBSZXRWVCwgT3AwLCBPcDBJc0tpbGwsIE9wMSwgT3AxSXNLaWxsKTsNCisgIGRlZmF1bHQ6IHJldHVybiAwOw0KKyAgfQ0KK30NCisNCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuSW5zdHJJbmZvLmluYyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5JbnN0ckluZm8uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTVlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuSW5zdHJJbmZvLmluYwpAQCAtMCwwICsxLDQwMjUgQEAKKy8vPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQorLy8NCisvLyBUYXJnZXQgSW5zdHJ1Y3Rpb24gRGVzY3JpcHRvcnMNCisvLw0KKy8vIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0IQ0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCituYW1lc3BhY2UgbGx2bSB7DQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDFbXSA9IHsgWDg2OjpFRkxBR1MsIDAgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogQmFycmllcnMxW10gPSB7ICZYODY6OkNDUlJlZ0NsYXNzLCBOVUxMIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDJbXSA9IHsgWDg2OjpFU1AsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0M1tdID0geyBYODY6OkVTUCwgWDg2OjpFRkxBR1MsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0NFtdID0geyBYODY6OlJTUCwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3Q1W10gPSB7IFg4Njo6UlNQLCBYODY6OkVGTEFHUywgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3Q2W10gPSB7IFg4Njo6RUFYLCBYODY6OkVCWCwgWDg2OjpFQ1gsIFg4Njo6RURYLCAwIH07DQorc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIEJhcnJpZXJzMltdID0geyAmWDg2OjpDQ1JSZWdDbGFzcywgJlg4Njo6R1IzMl9BQkNEUmVnQ2xhc3MsICZYODY6OkdSMzJfQURSZWdDbGFzcywgJlg4Njo6R1IzMl9UQ1JlZ0NsYXNzLCBOVUxMIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDdbXSA9IHsgWDg2OjpFRkxBR1MsIFg4Njo6RUFYLCBYODY6OkVCWCwgWDg2OjpFQ1gsIFg4Njo6RURYLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDhbXSA9IHsgWDg2OjpYTU0wLCAwIH07DQorc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIEJhcnJpZXJzM1tdID0geyAmWDg2OjpDQ1JSZWdDbGFzcywgJlg4Njo6RlIzMlJlZ0NsYXNzLCAmWDg2OjpGUjY0UmVnQ2xhc3MsICZYODY6OkdSMzJfQURSZWdDbGFzcywgJlg4Njo6R1IzMl9UQ1JlZ0NsYXNzLCAmWDg2OjpSRlAzMlJlZ0NsYXNzLCAmWDg2OjpSRlA2NFJlZ0NsYXNzLCAmWDg2OjpSRlA4MFJlZ0NsYXNzLCAmWDg2OjpWUjEyOFJlZ0NsYXNzLCAmWDg2OjpWUjY0UmVnQ2xhc3MsIE5VTEwgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0OVtdID0geyBYODY6OkVBWCwgWDg2OjpFQ1gsIFg4Njo6RURYLCBYODY6OkZQMCwgWDg2OjpGUDEsIFg4Njo6RlAyLCBYODY6OkZQMywgWDg2OjpGUDQsIFg4Njo6RlA1LCBYODY6OkZQNiwgWDg2OjpTVDAsIFg4Njo6TU0wLCBYODY6Ok1NMSwgWDg2OjpNTTIsIFg4Njo6TU0zLCBYODY6Ok1NNCwgWDg2OjpNTTUsIFg4Njo6TU02LCBYODY6Ok1NNywgWDg2OjpYTU0wLCBYODY6OlhNTTEsIFg4Njo6WE1NMiwgWDg2OjpYTU0zLCBYODY6OlhNTTQsIFg4Njo6WE1NNSwgWDg2OjpYTU02LCBYODY6OlhNTTcsIFg4Njo6WE1NOCwgWDg2OjpYTU05LCBYODY6OlhNTTEwLCBYODY6OlhNTTExLCBYODY6OlhNTTEyLCBYODY6OlhNTTEzLCBYODY6OlhNTTE0LCBYODY6OlhNTTE1LCBYODY6OkVGTEFHUywgMCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBCYXJyaWVyczRbXSA9IHsgJlg4Njo6Q0NSUmVnQ2xhc3MsICZYODY6OkZSMzJSZWdDbGFzcywgJlg4Njo6RlI2NFJlZ0NsYXNzLCAmWDg2OjpHUjY0X1RDUmVnQ2xhc3MsICZYODY6OlJGUDMyUmVnQ2xhc3MsICZYODY6OlJGUDY0UmVnQ2xhc3MsICZYODY6OlJGUDgwUmVnQ2xhc3MsICZYODY6OlZSMTI4UmVnQ2xhc3MsICZYODY6OlZSNjRSZWdDbGFzcywgTlVMTCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QxMFtdID0geyBYODY6OlJBWCwgWDg2OjpSQ1gsIFg4Njo6UkRYLCBYODY6OlJTSSwgWDg2OjpSREksIFg4Njo6UjgsIFg4Njo6UjksIFg4Njo6UjEwLCBYODY6OlIxMSwgWDg2OjpGUDAsIFg4Njo6RlAxLCBYODY6OkZQMiwgWDg2OjpGUDMsIFg4Njo6RlA0LCBYODY6OkZQNSwgWDg2OjpGUDYsIFg4Njo6U1QwLCBYODY6OlNUMSwgWDg2OjpNTTAsIFg4Njo6TU0xLCBYODY6Ok1NMiwgWDg2OjpNTTMsIFg4Njo6TU00LCBYODY6Ok1NNSwgWDg2OjpNTTYsIFg4Njo6TU03LCBYODY6OlhNTTAsIFg4Njo6WE1NMSwgWDg2OjpYTU0yLCBYODY6OlhNTTMsIFg4Njo6WE1NNCwgWDg2OjpYTU01LCBYODY6OlhNTTYsIFg4Njo6WE1NNywgWDg2OjpYTU04LCBYODY6OlhNTTksIFg4Njo6WE1NMTAsIFg4Njo6WE1NMTEsIFg4Njo6WE1NMTIsIFg4Njo6WE1NMTMsIFg4Njo6WE1NMTQsIFg4Njo6WE1NMTUsIFg4Njo6RUZMQUdTLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDExW10gPSB7IFg4Njo6QUwsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0MTJbXSA9IHsgWDg2OjpBWCwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QxM1tdID0geyBYODY6OkVBWCwgMCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBCYXJyaWVyczVbXSA9IHsgJlg4Njo6R1IzMl9BRFJlZ0NsYXNzLCBOVUxMIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDE0W10gPSB7IFg4Njo6RUFYLCBYODY6OkVEWCwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QxNVtdID0geyBYODY6OlJBWCwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QxNltdID0geyBYODY6OlJBWCwgWDg2OjpSQlgsIFg4Njo6UkNYLCBYODY6OlJEWCwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QxN1tdID0geyBYODY6OlJBWCwgWDg2OjpSRFgsIFg4Njo6RUZMQUdTLCAwIH07DQorc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqIEJhcnJpZXJzNltdID0geyAmWDg2OjpDQ1JSZWdDbGFzcywgJlg4Njo6R1IzMl9BRFJlZ0NsYXNzLCBOVUxMIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDE4W10gPSB7IFg4Njo6RUFYLCBYODY6OkVEWCwgWDg2OjpFRkxBR1MsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0MTlbXSA9IHsgWDg2OjpSQVgsIFg4Njo6UkRYLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDIwW10gPSB7IFg4Njo6QVgsIFg4Njo6RFgsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0MjFbXSA9IHsgWDg2OjpBWCwgWDg2OjpEWCwgWDg2OjpFRkxBR1MsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0MjJbXSA9IHsgWDg2OjpBTCwgWDg2OjpFRkxBR1MsIFg4Njo6QVgsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0MjNbXSA9IHsgWDg2OjpTVDAsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0MjRbXSA9IHsgWDg2OjpTVDEsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0MjVbXSA9IHsgWDg2OjpEWCwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QyNltdID0geyBYODY6OkVDWCwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QyN1tdID0geyBYODY6OkFILCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDI4W10gPSB7IFg4Njo6QVgsIFg4Njo6RUZMQUdTLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDI5W10gPSB7IFg4Njo6RUFYLCBYODY6OkVGTEFHUywgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QzMFtdID0geyBYODY6OlJBWCwgWDg2OjpFRkxBR1MsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0MzFbXSA9IHsgWDg2OjpBTCwgWDg2OjpFRkxBR1MsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0MzJbXSA9IHsgWDg2OjpFQlAsIFg4Njo6RVNQLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDMzW10gPSB7IFg4Njo6UkJQLCBYODY6OlJTUCwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QzNFtdID0geyBYODY6OkVESSwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QzNVtdID0geyBYODY6OlJESSwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QzNltdID0geyBYODY6OkVESSwgWDg2OjpFU0ksIFg4Njo6RUZMQUdTLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDM3W10gPSB7IFg4Njo6RURJLCBYODY6OkVTSSwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3QzOFtdID0geyBYODY6OkRYLCBYODY6OkFYLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDM5W10gPSB7IFg4Njo6RFgsIFg4Njo6RUFYLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDQwW10gPSB7IFg4Njo6RFgsIFg4Njo6QUwsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0NDFbXSA9IHsgWDg2OjpFQ1gsIFg4Njo6RUZMQUdTLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDQyW10gPSB7IFg4Njo6WE1NMCwgWDg2OjpFRkxBR1MsIDAgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogQmFycmllcnM3W10gPSB7ICZYODY6OkdSMzJfQUJDRFJlZ0NsYXNzLCAmWDg2OjpHUjMyX0FEUmVnQ2xhc3MsICZYODY6OkdSMzJfTk9SRVhSZWdDbGFzcywgJlg4Njo6R1IzMl9UQ1JlZ0NsYXNzLCBOVUxMIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDQzW10gPSB7IFg4Njo6RURJLCBYODY6OkVTSSwgWDg2OjpFQlAsIFg4Njo6RUJYLCBYODY6OkVEWCwgWDg2OjpFQ1gsIFg4Njo6RUFYLCBYODY6OkVTUCwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3Q0NFtdID0geyBYODY6OkNMLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDQ1W10gPSB7IFg4Njo6UkFYLCBYODY6OlJDWCwgWDg2OjpSRFgsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0NDZbXSA9IHsgWDg2OjpFQ1gsIFg4Njo6RURJLCBYODY6OkVTSSwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3Q0N1tdID0geyBYODY6OlJDWCwgWDg2OjpSREksIFg4Njo6UlNJLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDQ4W10gPSB7IFg4Njo6QUwsIFg4Njo6RUNYLCBYODY6OkVESSwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3Q0OVtdID0geyBYODY6OkVDWCwgWDg2OjpFREksIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0NTBbXSA9IHsgWDg2OjpFQVgsIFg4Njo6RUNYLCBYODY6OkVESSwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3Q1MVtdID0geyBYODY6OlJBWCwgWDg2OjpSQ1gsIFg4Njo6UkRJLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDUyW10gPSB7IFg4Njo6UkNYLCBYODY6OlJESSwgMCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3Q1M1tdID0geyBYODY6OkFYLCBYODY6OkVDWCwgWDg2OjpFREksIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0NTRbXSA9IHsgWDg2OjpBTCwgWDg2OjpFREksIFg4Njo6RUZMQUdTLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDU1W10gPSB7IFg4Njo6RUFYLCBYODY6OkVESSwgWDg2OjpFRkxBR1MsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0NTZbXSA9IHsgWDg2OjpSQVgsIFg4Njo6UkNYLCBYODY6OlJESSwgWDg2OjpFRkxBR1MsIDAgfTsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSW1wbGljaXRMaXN0NTdbXSA9IHsgWDg2OjpBWCwgWDg2OjpFREksIFg4Njo6RUZMQUdTLCAwIH07DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEltcGxpY2l0TGlzdDU4W10gPSB7IFg4Njo6RUFYLCBYODY6OkVDWCwgMCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBCYXJyaWVyczhbXSA9IHsgJlg4Njo6Q0NSUmVnQ2xhc3MsICZYODY6OlJGUDMyUmVnQ2xhc3MsICZYODY6OlJGUDY0UmVnQ2xhc3MsICZYODY6OlJGUDgwUmVnQ2xhc3MsICZYODY6OlZSNjRSZWdDbGFzcywgTlVMTCB9Ow0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJbXBsaWNpdExpc3Q1OVtdID0geyBYODY6OlJBWCwgWDg2OjpSQ1gsIFg4Njo6UkRYLCBYODY6OlI4LCBYODY6OlI5LCBYODY6OlIxMCwgWDg2OjpSMTEsIFg4Njo6RlAwLCBYODY6OkZQMSwgWDg2OjpGUDIsIFg4Njo6RlAzLCBYODY6OkZQNCwgWDg2OjpGUDUsIFg4Njo6RlA2LCBYODY6OlNUMCwgWDg2OjpTVDEsIFg4Njo6TU0wLCBYODY6Ok1NMSwgWDg2OjpNTTIsIFg4Njo6TU0zLCBYODY6Ok1NNCwgWDg2OjpNTTUsIFg4Njo6TU02LCBYODY6Ok1NNywgWDg2OjpYTU0wLCBYODY6OlhNTTEsIFg4Njo6WE1NMiwgWDg2OjpYTU0zLCBYODY6OlhNTTQsIFg4Njo6WE1NNSwgWDg2OjpFRkxBR1MsIDAgfTsNCisNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yW10gPSB7IHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8zW10gPSB7IHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNFtdID0geyB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm81W10gPSB7IHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm82W10gPSB7IHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzdbXSA9IHsgeyBYODY6OlJGUDMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6UkZQMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvOFtdID0geyB7IFg4Njo6UkZQNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpSRlA2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm85W10gPSB7IHsgWDg2OjpSRlA4MFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDgwUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzEwW10gPSB7IHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTFbXSA9IHsgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzEyW10gPSB7IHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTNbXSA9IHsgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE0W10gPSB7IHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNVtdID0geyB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTZbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xN1tdID0geyB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMThbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE5W10gPSB7IHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMFtdID0geyB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIxW10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMltdID0geyB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjNbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0W10gPSB7IHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6R1I4UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI1W10gPSB7IHsgWDg2OjpHUjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjhSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI2W10gPSB7IHsgWDg2OjpHUjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjhSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjdbXSA9IHsgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IFg4Njo6R1I4UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI4W10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI5W10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8zMFtdID0geyB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMzFbXSA9IHsgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzMyW10gPSB7IHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8zM1tdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMzRbXSA9IHsgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMzVbXSA9IHsgeyBYODY6OlJTVFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8zNltdID0geyB7IFg4Njo6UkZQMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpSRlAzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzM3W10gPSB7IHsgWDg2OjpSRlAzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8zOFtdID0geyB7IFg4Njo6UkZQNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpSRlA2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzM5W10gPSB7IHsgWDg2OjpSRlA2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm80MFtdID0geyB7IFg4Njo6UkZQODBSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpSRlA4MFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDgwUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzQxW10gPSB7IHsgWDg2OjpSRlA4MFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDgwUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm80MltdID0geyB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzQzW10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzQ0W10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm80NVtdID0geyB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzQ2W10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgKCgxIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNDdbXSA9IHsgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzQ4W10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm80OVtdID0geyB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNTBbXSA9IHsgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjhSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm81MVtdID0geyB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzUyW10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzUzW10gPSB7IHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm81NFtdID0geyB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNTVbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzU2W10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm81N1tdID0geyB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNThbXSA9IHsgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzU5W10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzYwW10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzYxW10gPSB7IHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNjJbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm82M1tdID0geyB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzY0W10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzY1W10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzY2W10gPSB7IHsgWDg2OjpSRlAzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDMyUmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpSRlAzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm82N1tdID0geyB7IFg4Njo6UkZQNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpSRlA2NFJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IFg4Njo6UkZQNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNjhbXSA9IHsgeyBYODY6OlJGUDgwUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6UkZQODBSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OlJGUDgwUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzY5W10gPSB7IHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm83MFtdID0geyB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNzFbXSA9IHsgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzcyW10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm83M1tdID0geyB7IFg4Njo6R1I4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNzRbXSA9IHsgeyBYODY6OlJGUDMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6UkZQMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpSRlAzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzc1W10gPSB7IHsgWDg2OjpSRlA2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6UkZQNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm83NltdID0geyB7IFg4Njo6UkZQODBSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpSRlA4MFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDgwUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvNzdbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzc4W10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm83OVtdID0geyB7IFg4Njo6R1I4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvODBbXSA9IHsgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvODFbXSA9IHsgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm84MltdID0geyB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm84M1tdID0geyB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm84NFtdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm84NVtdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm84NltdID0geyB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvODdbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpHUjhSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvODhbXSA9IHsgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpHUjhSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvODlbXSA9IHsgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm85MFtdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvOTFbXSA9IHsgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzkyW10gPSB7IHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm85M1tdID0geyB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvOTRbXSA9IHsgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzk1W10gPSB7IHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm85NltdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvOTdbXSA9IHsgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzk4W10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm85OVtdID0geyB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTAwW10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMDFbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzEwMltdID0geyB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMDNbXSA9IHsgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzEwNFtdID0geyB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMDVbXSA9IHsgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMDZbXSA9IHsgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzEwN1tdID0geyB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTA4W10gPSB7IHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6UkZQMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTA5W10gPSB7IHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6UkZQNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTEwW10gPSB7IHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6UkZQODBSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTExW10gPSB7IHsgWDg2OjpSRlAzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMTJbXSA9IHsgeyBYODY6OlJGUDY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzExM1tdID0geyB7IFg4Njo6UkZQODBSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTE0W10gPSB7IHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzExNVtdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMTZbXSA9IHsgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzExN1tdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTE4W10gPSB7IHsgWDg2OjpSRlAzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTE5W10gPSB7IHsgWDg2OjpSRlA2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTIwW10gPSB7IHsgWDg2OjpSRlA4MFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTIxW10gPSB7IHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzEyMltdID0geyB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMjNbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTI0W10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzEyNVtdID0geyB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMjZbXSA9IHsgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTI3W10gPSB7IHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMjhbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMjlbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMzBbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTMxW10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTMyW10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzEzM1tdID0geyB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMzRbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTM1W10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMzZbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xMzdbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzEzOFtdID0geyB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTM5W10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNDBbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjMyX05PU1BSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE0MVtdID0geyB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTQyW10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNDNbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE0NFtdID0geyB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTQ1W10gPSB7IHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNDZbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE0N1tdID0geyB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTQ4W10gPSB7IHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNDlbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE1MFtdID0geyB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTUxW10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE1MltdID0geyB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNTNbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTU0W10gPSB7IHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE1NVtdID0geyB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNTZbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNTdbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTU4W10gPSB7IHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6U0VHTUVOVF9SRUdSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTU5W10gPSB7IHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6U0VHTUVOVF9SRUdSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTYwW10gPSB7IHsgWDg2OjpTRUdNRU5UX1JFR1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTYxW10gPSB7IHsgWDg2OjpTRUdNRU5UX1JFR1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTYyW10gPSB7IHsgWDg2OjpDT05UUk9MX1JFR1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTYzW10gPSB7IHsgWDg2OjpERUJVR19SRUdSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE2NFtdID0geyB7IFg4Njo6R1IzMl9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6R1IzMl9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjMyX1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE2NVtdID0geyB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkNPTlRST0xfUkVHUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE2NltdID0geyB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkRFQlVHX1JFR1JlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNjdbXSA9IHsgeyBYODY6OkdSMzJfVENSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyX1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjMyX1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNjhbXSA9IHsgeyBYODY6OkdSMzJfVENSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyX1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE2OVtdID0geyB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlNFR01FTlRfUkVHUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE3MFtdID0geyB7IFg4Njo6U0VHTUVOVF9SRUdSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE3MVtdID0geyB7IFg4Njo6Q09OVFJPTF9SRUdSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE3MltdID0geyB7IFg4Njo6REVCVUdfUkVHUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNzNbXSA9IHsgeyBYODY6OkdSNjRfVENSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OkdSNjRfVENSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6R1I2NF9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNzRbXSA9IHsgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpDT05UUk9MX1JFR1JlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNzVbXSA9IHsgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpERUJVR19SRUdSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTc2W10gPSB7IHsgWDg2OjpHUjY0X1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NF9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6R1I2NF9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTc3W10gPSB7IHsgWDg2OjpHUjY0X1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NF9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNzhbXSA9IHsgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpTRUdNRU5UX1JFR1JlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xNzlbXSA9IHsgeyBYODY6OlNFR01FTlRfUkVHUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xODBbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xODFbXSA9IHsgeyBYODY6OkdSNjRfTk9SRVhSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OkdSNjRfTk9SRVhfTk9TUFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjhfTk9SRVhSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTgyW10gPSB7IHsgWDg2OjpHUjhfTk9SRVhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0X05PUkVYUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjY0X05PUkVYX05PU1BSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE4M1tdID0geyB7IFg4Njo6R1I4X05PUkVYUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I4X05PUkVYUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE4NFtdID0geyB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE4NVtdID0geyB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE4NltdID0geyB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTg3W10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE4OFtdID0geyB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTg5W10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE5MFtdID0geyB7IFg4Njo6R1IxNlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xOTFbXSA9IHsgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE5MltdID0geyB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xOTNbXSA9IHsgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE5NFtdID0geyB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xOTVbXSA9IHsgeyBYODY6OkdSMzJfTk9SRVhSZWdDbGFzc0lELCAwLCAwIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE5NltdID0geyB7IFg4Njo6R1IzMl9OT1JFWFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8xOTdbXSA9IHsgeyBYODY6OlJGUDY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6UkZQMzJSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMTk4W10gPSB7IHsgWDg2OjpSRlA4MFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzE5OVtdID0geyB7IFg4Njo6UkZQMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpSRlA2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMDBbXSA9IHsgeyBYODY6OlJGUDgwUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6UkZQNjRSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjAxW10gPSB7IHsgWDg2OjpSRlAzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlJGUDgwUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIwMltdID0geyB7IFg4Njo6UkZQNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpSRlA4MFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMDNbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjA0W10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMDVbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMDZbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OkdSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMDdbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIwOFtdID0geyB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMDlbXSA9IHsgeyBYODY6OkdSMTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgKCgwIDw8IDE2KSB8ICgxIDw8IFRPSTo6VElFRF9UTykpIH0sIHsgWDg2OjpHUjE2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjEwW10gPSB7IHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIxMVtdID0geyB7IFg4Njo6R1IzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAoKDAgPDwgMTYpIHwgKDEgPDwgVE9JOjpUSUVEX1RPKSkgfSwgeyBYODY6OkdSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMTJbXSA9IHsgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjEzW10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsICgoMCA8PCAxNikgfCAoMSA8PCBUT0k6OlRJRURfVE8pKSB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIxNFtdID0geyB7IFg4Njo6R1IzMl9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6R1IzMl9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjE1W10gPSB7IHsgWDg2OjpHUjY0X1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpHUjY0X1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMTZbXSA9IHsgeyBYODY6OkdSMzJfVENSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjE3W10gPSB7IHsgWDg2OjpHUjY0X1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIxOFtdID0geyB7IFg4Njo6R1IzMl9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6R1IzMl9UQ1JlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMTlbXSA9IHsgeyBYODY6OkdSNjRfVENSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OkdSNjRfVENSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjIwW10gPSB7IHsgWDg2OjpHUjMyX1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjIxW10gPSB7IHsgWDg2OjpHUjY0X1RDUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjIyW10gPSB7IHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMjNbXSA9IHsgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMjRbXSA9IHsgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMjVbXSA9IHsgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMjZbXSA9IHsgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMjdbXSA9IHsgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMjhbXSA9IHsgeyBYODY6OkdSOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjI5W10gPSB7IHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIzMFtdID0geyB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjMxW10gPSB7IHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIzMltdID0geyB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjMzW10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIzNFtdID0geyB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjM1W10gPSB7IHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjM2W10gPSB7IHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMzdbXSA9IHsgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzIzOFtdID0geyB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yMzlbXSA9IHsgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjQwW10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0MVtdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0MltdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0M1tdID0geyB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0NFtdID0geyB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0NVtdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0NltdID0geyB7IFg4Njo6RlIzMlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0N1tdID0geyB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0OFtdID0geyB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OkZSMzJSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI0OVtdID0geyB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjUwW10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjUxW10gPSB7IHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yNTJbXSA9IHsgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI1M1tdID0geyB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjU0W10gPSB7IHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjU1W10gPSB7IHsgWDg2OjpHUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjU2W10gPSB7IHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjU3W10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6RlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yNThbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpGUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI1OVtdID0geyB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgMCwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IDEsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjYwW10gPSB7IHsgWDg2OjpWUjI1NlJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAwLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgMSwgMHwoMTw8VE9JOjpMb29rdXBQdHJSZWdDbGFzcyksIDAgfSwgeyAtMSwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yNjFbXSA9IHsgeyBYODY6OlZSMjU2UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIyNTZSZWdDbGFzc0lELCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yNjJbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IDAsIDB8KDE8PFRPSTo6TG9va3VwUHRyUmVnQ2xhc3MpLCAwIH0sIHsgLTEsIDAsIDAgfSwgeyAxLCAwfCgxPDxUT0k6Okxvb2t1cFB0clJlZ0NsYXNzKSwgMCB9LCB7IC0xLCAwLCAwIH0sIHsgLTEsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yNjNbXSA9IHsgeyBYODY6OlZSNjRSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpWUjY0UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlI2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgfTsNCitzdGF0aWMgY29uc3QgVGFyZ2V0T3BlcmFuZEluZm8gT3BlcmFuZEluZm8yNjRbXSA9IHsgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIHsgWDg2OjpHUjMyUmVnQ2xhc3NJRCwgMCwgMCB9LCB7IC0xLCAwLCAwIH0sIH07DQorc3RhdGljIGNvbnN0IFRhcmdldE9wZXJhbmRJbmZvIE9wZXJhbmRJbmZvMjY1W10gPSB7IHsgWDg2OjpWUjEyOFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyBYODY6OlZSMTI4UmVnQ2xhc3NJRCwgMCwgMCB9LCB7IFg4Njo6R1I2NFJlZ0NsYXNzSUQsIDAsIDAgfSwgeyAtMSwgMCwgMCB9LCB9Ow0KK3N0YXRpYyBjb25zdCBUYXJnZXRPcGVyYW5kSW5mbyBPcGVyYW5kSW5mbzI2NltdID0geyB7IFg4Njo6VlIxMjhSZWdDbGFzc0lELCAwLCAwIH0sIH07DQorDQorc3RhdGljIGNvbnN0IFRhcmdldEluc3RyRGVzYyBYODZJbnN0c1tdID0gew0KKyAgeyAwLAkwLAkwLAkwLAkiUEhJIiwgMHwoMTw8VElEOjpWYXJpYWRpYyl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzAgPSBQSEkNCisgIHsgMSwJMCwJMCwJMCwJIklOTElORUFTTSIsIDB8KDE8PFRJRDo6VmFyaWFkaWMpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxID0gSU5MSU5FQVNNDQorICB7IDIsCTEsCTAsCTAsCSJQUk9MT0dfTEFCRUwiLCAwfCgxPDxUSUQ6Ok5vdER1cGxpY2FibGUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzIgPSBQUk9MT0dfTEFCRUwNCisgIHsgMywJMSwJMCwJMCwJIkVIX0xBQkVMIiwgMHwoMTw8VElEOjpOb3REdXBsaWNhYmxlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMzID0gRUhfTEFCRUwNCisgIHsgNCwJMSwJMCwJMCwJIkdDX0xBQkVMIiwgMHwoMTw8VElEOjpOb3REdXBsaWNhYmxlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICM0ID0gR0NfTEFCRUwNCisgIHsgNSwJMCwJMCwJMCwJIktJTEwiLCAwfCgxPDxUSUQ6OlZhcmlhZGljKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM1ID0gS0lMTA0KKyAgeyA2LAkzLAkxLAkwLAkiRVhUUkFDVF9TVUJSRUciLCAwLCAweDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMyB9LCAgLy8gSW5zdCAjNiA9IEVYVFJBQ1RfU1VCUkVHDQorICB7IDcsCTQsCTEsCTAsCSJJTlNFUlRfU1VCUkVHIiwgMCwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQgfSwgIC8vIEluc3QgIzcgPSBJTlNFUlRfU1VCUkVHDQorICB7IDgsCTEsCTEsCTAsCSJJTVBMSUNJVF9ERUYiLCAwfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpfCgxPDxUSUQ6OkNoZWFwQXNBTW92ZSksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICM4ID0gSU1QTElDSVRfREVGDQorICB7IDksCTQsCTEsCTAsCSJTVUJSRUdfVE9fUkVHIiwgMCwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUgfSwgIC8vIEluc3QgIzkgPSBTVUJSRUdfVE9fUkVHDQorICB7IDEwLAkzLAkxLAkwLAkiQ09QWV9UT19SRUdDTEFTUyIsIDB8KDE8PFRJRDo6Q2hlYXBBc0FNb3ZlKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMgfSwgIC8vIEluc3QgIzEwID0gQ09QWV9UT19SRUdDTEFTUw0KKyAgeyAxMSwJMCwJMCwJMCwJIkRCR19WQUxVRSIsIDB8KDE8PFRJRDo6VmFyaWFkaWMpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKXwoMTw8VElEOjpDaGVhcEFzQU1vdmUpLCAweDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzExID0gREJHX1ZBTFVFDQorICB7IDEyLAkxLAkxLAkwLAkiUkVHX1NFUVVFTkNFIiwgMHwoMTw8VElEOjpWYXJpYWRpYyl8KDE8PFRJRDo6Q2hlYXBBc0FNb3ZlKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEyID0gUkVHX1NFUVVFTkNFDQorICB7IDEzLAkyLAkxLAkwLAkiQ09QWSIsIDB8KDE8PFRJRDo6Q2hlYXBBc0FNb3ZlKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzYgfSwgIC8vIEluc3QgIzEzID0gQ09QWQ0KKyAgeyAxNCwJMCwJMCwJMCwJIkFCU19GIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTEwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzE0ID0gQUJTX0YNCisgIHsgMTUsCTIsCTEsCTAsCSJBQlNfRnAzMiIsIDAsIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNyB9LCAgLy8gSW5zdCAjMTUgPSBBQlNfRnAzMg0KKyAgeyAxNiwJMiwJMSwJMCwJIkFCU19GcDY0IiwgMCwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84IH0sICAvLyBJbnN0ICMxNiA9IEFCU19GcDY0DQorICB7IDE3LAkyLAkxLAkwLAkiQUJTX0ZwODAiLCAwLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkgfSwgIC8vIEluc3QgIzE3ID0gQUJTX0ZwODANCisgIHsgMTgsCTEsCTAsCTAsCSJBREMxNmkxNiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1MDA2MDQxVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTggPSBBREMxNmkxNg0KKyAgeyAxOSwJNiwJMCwJMCwJIkFEQzE2bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MTAwNjA1YVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxOSA9IEFEQzE2bWkNCisgIHsgMjAsCTYsCTAsCTAsCSJBREMxNm1pOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgzMDAyMDVhVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIwID0gQURDMTZtaTgNCisgIHsgMjEsCTYsCTAsCTAsCSJBREMxNm1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTEwMDAwNDRVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjMjEgPSBBREMxNm1yDQorICB7IDIyLAkzLAkxLAkwLAkiQURDMTZyaSIsIDAsIDB4ODEwMDYwNTJVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMiB9LCAgLy8gSW5zdCAjMjIgPSBBREMxNnJpDQorICB7IDIzLAkzLAkxLAkwLAkiQURDMTZyaTgiLCAwLCAweDgzMDAyMDUyVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIgfSwgIC8vIEluc3QgIzIzID0gQURDMTZyaTgNCisgIHsgMjQsCTcsCTEsCTAsCSJBREMxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMzAwMDA0NlVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICMyNCA9IEFEQzE2cm0NCisgIHsgMjUsCTMsCTEsCTAsCSJBREMxNnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgxMTAwMDA0M1VMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMyNSA9IEFEQzE2cnINCisgIHsgMjYsCTMsCTEsCTAsCSJBREMxNnJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEzMDAwMDQ1VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzI2ID0gQURDMTZycl9SRVYNCisgIHsgMjcsCTEsCTAsCTAsCSJBREMzMmkzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1MDBhMDAxVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMjcgPSBBREMzMmkzMg0KKyAgeyAyOCwJNiwJMCwJMCwJIkFEQzMybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MTAwYTAxYVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyOCA9IEFEQzMybWkNCisgIHsgMjksCTYsCTAsCTAsCSJBREMzMm1pOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgzMDAyMDFhVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzI5ID0gQURDMzJtaTgNCisgIHsgMzAsCTYsCTAsCTAsCSJBREMzMm1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTEwMDAwMDRVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNSB9LCAgLy8gSW5zdCAjMzAgPSBBREMzMm1yDQorICB7IDMxLAkzLAkxLAkwLAkiQURDMzJyaSIsIDAsIDB4ODEwMGEwMTJVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjMzEgPSBBREMzMnJpDQorICB7IDMyLAkzLAkxLAkwLAkiQURDMzJyaTgiLCAwLCAweDgzMDAyMDEyVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTYgfSwgIC8vIEluc3QgIzMyID0gQURDMzJyaTgNCisgIHsgMzMsCTcsCTEsCTAsCSJBREMzMnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMzAwMDAwNlVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICMzMyA9IEFEQzMycm0NCisgIHsgMzQsCTMsCTEsCTAsCSJBREMzMnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgxMTAwMDAwM1VMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICMzNCA9IEFEQzMycnINCisgIHsgMzUsCTMsCTEsCTAsCSJBREMzMnJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEzMDAwMDA1VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzM1ID0gQURDMzJycl9SRVYNCisgIHsgMzYsCTEsCTAsCTAsCSJBREM2NGkzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1MDBiMDAxVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMzYgPSBBREM2NGkzMg0KKyAgeyAzNywJNiwJMCwJMCwJIkFEQzY0bWkzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgxMDBiMDFhVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzM3ID0gQURDNjRtaTMyDQorICB7IDM4LAk2LAkwLAkwLAkiQURDNjRtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MzAwMzAxYVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMzOCA9IEFEQzY0bWk4DQorICB7IDM5LAk2LAkwLAkwLAkiQURDNjRtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDExMDAxMDA0VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTkgfSwgIC8vIEluc3QgIzM5ID0gQURDNjRtcg0KKyAgeyA0MCwJMywJMSwJMCwJIkFEQzY0cmkzMiIsIDAsIDB4ODEwMGIwMTJVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMCB9LCAgLy8gSW5zdCAjNDAgPSBBREM2NHJpMzINCisgIHsgNDEsCTMsCTEsCTAsCSJBREM2NHJpOCIsIDAsIDB4ODMwMDMwMTJVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMCB9LCAgLy8gSW5zdCAjNDEgPSBBREM2NHJpOA0KKyAgeyA0MiwJNywJMSwJMCwJIkFEQzY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEzMDAxMDA2VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjEgfSwgIC8vIEluc3QgIzQyID0gQURDNjRybQ0KKyAgeyA0MywJMywJMSwJMCwJIkFEQzY0cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDExMDAxMDAzVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzQzID0gQURDNjRycg0KKyAgeyA0NCwJMywJMSwJMCwJIkFEQzY0cnJfUkVWIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTMwMDEwMDVVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMyB9LCAgLy8gSW5zdCAjNDQgPSBBREM2NHJyX1JFVg0KKyAgeyA0NSwJMSwJMCwJMCwJIkFEQzhpOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE0MDAyMDAxVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjNDUgPSBBREM4aTgNCisgIHsgNDYsCTYsCTAsCTAsCSJBREM4bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MDAwMjAxYVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICM0NiA9IEFEQzhtaQ0KKyAgeyA0NywJNiwJMCwJMCwJIkFEQzhtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDEwMDAwMDA0VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjQgfSwgIC8vIEluc3QgIzQ3ID0gQURDOG1yDQorICB7IDQ4LAkzLAkxLAkwLAkiQURDOHJpIiwgMCwgMHg4MDAwMjAxMlVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI1IH0sICAvLyBJbnN0ICM0OCA9IEFEQzhyaQ0KKyAgeyA0OSwJNywJMSwJMCwJIkFEQzhybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTIwMDAwMDZVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNiB9LCAgLy8gSW5zdCAjNDkgPSBBREM4cm0NCisgIHsgNTAsCTMsCTEsCTAsCSJBREM4cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDEwMDAwMDAzVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjcgfSwgIC8vIEluc3QgIzUwID0gQURDOHJyDQorICB7IDUxLAkzLAkxLAkwLAkiQURDOHJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEyMDAwMDA1VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjcgfSwgIC8vIEluc3QgIzUxID0gQURDOHJyX1JFVg0KKyAgeyA1MiwJMSwJMCwJMCwJIkFERDE2aTE2IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTAwNjA0MVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzUyID0gQUREMTZpMTYNCisgIHsgNTMsCTYsCTAsCTAsCSJBREQxNm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODEwMDYwNThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjNTMgPSBBREQxNm1pDQorICB7IDU0LAk2LAkwLAkwLAkiQUREMTZtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MzAwMjA1OFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICM1NCA9IEFERDE2bWk4DQorICB7IDU1LAk2LAkwLAkwLAkiQUREMTZtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDEwMDAwNDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjNTUgPSBBREQxNm1yDQorICB7IDU2LAkzLAkxLAkwLAkiQUREMTZyaSIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKSwgMHg4MTAwNjA1MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyIH0sICAvLyBJbnN0ICM1NiA9IEFERDE2cmkNCisgIHsgNTcsCTMsCTEsCTAsCSJBREQxNnJpOCIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKSwgMHg4MzAwMjA1MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyIH0sICAvLyBJbnN0ICM1NyA9IEFERDE2cmk4DQorICB7IDU4LAk3LAkxLAkwLAkiQUREMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDA0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICM1OCA9IEFERDE2cm0NCisgIHsgNTksCTMsCTEsCTAsCSJBREQxNnJyIiwgMHwoMTw8VElEOjpDb252ZXJ0aWJsZVRvM0FkZHIpfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDEwMDAwNDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjNTkgPSBBREQxNnJyDQorICB7IDYwLAkzLAkxLAkwLAkiQUREMTZycl9hbHQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzMDAwMDQ1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzYwID0gQUREMTZycl9hbHQNCisgIHsgNjEsCTEsCTAsCTAsCSJBREQzMmkzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUwMGEwMDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICM2MSA9IEFERDMyaTMyDQorICB7IDYyLAk2LAkwLAkwLAkiQUREMzJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgxMDBhMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzYyID0gQUREMzJtaQ0KKyAgeyA2MywJNiwJMCwJMCwJIkFERDMybWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODMwMDIwMThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjNjMgPSBBREQzMm1pOA0KKyAgeyA2NCwJNiwJMCwJMCwJIkFERDMybXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxMDAwMDA0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTUgfSwgIC8vIEluc3QgIzY0ID0gQUREMzJtcg0KKyAgeyA2NSwJMywJMSwJMCwJIkFERDMycmkiLCAwfCgxPDxUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkciksIDB4ODEwMGEwMTBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjNjUgPSBBREQzMnJpDQorICB7IDY2LAkzLAkxLAkwLAkiQUREMzJyaTgiLCAwfCgxPDxUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkciksIDB4ODMwMDIwMTBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjNjYgPSBBREQzMnJpOA0KKyAgeyA2NywJNywJMSwJMCwJIkFERDMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjNjcgPSBBREQzMnJtDQorICB7IDY4LAkzLAkxLAkwLAkiQUREMzJyciIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKXwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgxMDAwMDAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzY4ID0gQUREMzJycg0KKyAgeyA2OSwJMywJMSwJMCwJIkFERDMycnJfYWx0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzAwMDAwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICM2OSA9IEFERDMycnJfYWx0DQorICB7IDcwLAkxLAkwLAkwLAkiQURENjRpMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1MDBiMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjNzAgPSBBREQ2NGkzMg0KKyAgeyA3MSwJNiwJMCwJMCwJIkFERDY0bWkzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgxMDBiMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzcxID0gQURENjRtaTMyDQorICB7IDcyLAk2LAkwLAkwLAkiQURENjRtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MzAwMzAxOFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICM3MiA9IEFERDY0bWk4DQorICB7IDczLAk2LAkwLAkwLAkiQURENjRtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDEwMDEwMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOSB9LCAgLy8gSW5zdCAjNzMgPSBBREQ2NG1yDQorICB7IDc0LAkzLAkxLAkwLAkiQURENjRyaTMyIiwgMHwoMTw8VElEOjpDb252ZXJ0aWJsZVRvM0FkZHIpLCAweDgxMDBiMDEwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjAgfSwgIC8vIEluc3QgIzc0ID0gQURENjRyaTMyDQorICB7IDc1LAkzLAkxLAkwLAkiQURENjRyaTgiLCAwfCgxPDxUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkciksIDB4ODMwMDMwMTBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMCB9LCAgLy8gSW5zdCAjNzUgPSBBREQ2NHJpOA0KKyAgeyA3NiwJNywJMSwJMCwJIkFERDY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDEwMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjNzYgPSBBREQ2NHJtDQorICB7IDc3LAkzLAkxLAkwLAkiQURENjRyciIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKXwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgxMDAxMDAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzc3ID0gQURENjRycg0KKyAgeyA3OCwJMywJMSwJMCwJIkFERDY0cnJfYWx0IiwgMHwoMTw8VElEOjpDb252ZXJ0aWJsZVRvM0FkZHIpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzMDAxMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzc4ID0gQURENjRycl9hbHQNCisgIHsgNzksCTEsCTAsCTAsCSJBREQ4aTgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg0MDAyMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjNzkgPSBBREQ4aTgNCisgIHsgODAsCTYsCTAsCTAsCSJBREQ4bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MDAwMjAxOFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICM4MCA9IEFERDhtaQ0KKyAgeyA4MSwJNiwJMCwJMCwJIkFERDhtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNCB9LCAgLy8gSW5zdCAjODEgPSBBREQ4bXINCisgIHsgODIsCTMsCTEsCTAsCSJBREQ4cmkiLCAwLCAweDgwMDAyMDEwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjUgfSwgIC8vIEluc3QgIzgyID0gQUREOHJpDQorICB7IDgzLAk3LAkxLAkwLAkiQUREOHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyMDAwMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjYgfSwgIC8vIEluc3QgIzgzID0gQUREOHJtDQorICB7IDg0LAkzLAkxLAkwLAkiQUREOHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjcgfSwgIC8vIEluc3QgIzg0ID0gQUREOHJyDQorICB7IDg1LAkzLAkxLAkwLAkiQUREOHJyX2FsdCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDIwMDAwMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNyB9LCAgLy8gSW5zdCAjODUgPSBBREQ4cnJfYWx0DQorICB7IDg2LAk3LAkxLAkwLAkiQUREUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTg4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzg2ID0gQUREUERybQ0KKyAgeyA4NywJMywJMSwJMCwJIkFERFBEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU4ODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICM4NyA9IEFERFBEcnINCisgIHsgODgsCTcsCTEsCTAsCSJBRERQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ODQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjODggPSBBRERQU3JtDQorICB7IDg5LAkzLAkxLAkwLAkiQUREUFNyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTg0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzg5ID0gQUREUFNycg0KKyAgeyA5MCwJNywJMSwJMCwJIkFERFNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU4MDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMwIH0sICAvLyBJbnN0ICM5MCA9IEFERFNEcm0NCisgIHsgOTEsCTcsCTEsCTAsCSJBRERTRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTgwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzkxID0gQUREU0RybV9JbnQNCisgIHsgOTIsCTMsCTEsCTAsCSJBRERTRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ODAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMSB9LCAgLy8gSW5zdCAjOTIgPSBBRERTRHJyDQorICB7IDkzLAkzLAkxLAkwLAkiQUREU0Rycl9JbnQiLCAwLCAweDU4MDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICM5MyA9IEFERFNEcnJfSW50DQorICB7IDk0LAk3LAkxLAkwLAkiQUREU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTgwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzIgfSwgIC8vIEluc3QgIzk0ID0gQUREU1NybQ0KKyAgeyA5NSwJNywJMSwJMCwJIkFERFNTcm1fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ODAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjOTUgPSBBRERTU3JtX0ludA0KKyAgeyA5NiwJMywJMSwJMCwJIkFERFNTcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU4MDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMzIH0sICAvLyBJbnN0ICM5NiA9IEFERFNTcnINCisgIHsgOTcsCTMsCTEsCTAsCSJBRERTU3JyX0ludCIsIDAsIDB4NTgwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzk3ID0gQUREU1Nycl9JbnQNCisgIHsgOTgsCTcsCTEsCTAsCSJBRERTVUJQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkMDgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjOTggPSBBRERTVUJQRHJtDQorICB7IDk5LAkzLAkxLAkwLAkiQUREU1VCUERyciIsIDAsIDB4ZDA4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzk5ID0gQUREU1VCUERycg0KKyAgeyAxMDAsCTcsCTEsCTAsCSJBRERTVUJQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkMDgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTAwID0gQUREU1VCUFNybQ0KKyAgeyAxMDEsCTMsCTEsCTAsCSJBRERTVUJQU3JyIiwgMCwgMHhkMDgwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTAxID0gQUREU1VCUFNycg0KKyAgeyAxMDIsCTUsCTAsCTAsCSJBRERfRjMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQ4MDAwMDE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMDIgPSBBRERfRjMybQ0KKyAgeyAxMDMsCTUsCTAsCTAsCSJBRERfRjY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRjMDAwMDE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMDMgPSBBRERfRjY0bQ0KKyAgeyAxMDQsCTUsCTAsCTAsCSJBRERfRkkxNm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkZTAwMDAxOFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTA0ID0gQUREX0ZJMTZtDQorICB7IDEwNSwJNSwJMCwJMCwJIkFERF9GSTMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRhMDAwMDE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMDUgPSBBRERfRkkzMm0NCisgIHsgMTA2LAkxLAkwLAkwLAkiQUREX0ZQclNUMCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMwMDAwOTAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICMxMDYgPSBBRERfRlByU1QwDQorICB7IDEwNywJMSwJMCwJMCwJIkFERF9GU1QwciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMwMDAwMzAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICMxMDcgPSBBRERfRlNUMHINCisgIHsgMTA4LAkzLAkxLAkwLAkiQUREX0ZwMzIiLCAwLCAweDQwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM2IH0sICAvLyBJbnN0ICMxMDggPSBBRERfRnAzMg0KKyAgeyAxMDksCTcsCTEsCTAsCSJBRERfRnAzMm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM3IH0sICAvLyBJbnN0ICMxMDkgPSBBRERfRnAzMm0NCisgIHsgMTEwLAkzLAkxLAkwLAkiQUREX0ZwNjQiLCAwLCAweDQwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM4IH0sICAvLyBJbnN0ICMxMTAgPSBBRERfRnA2NA0KKyAgeyAxMTEsCTcsCTEsCTAsCSJBRERfRnA2NG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICMxMTEgPSBBRERfRnA2NG0NCisgIHsgMTEyLAk3LAkxLAkwLAkiQUREX0ZwNjRtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICMxMTIgPSBBRERfRnA2NG0zMg0KKyAgeyAxMTMsCTMsCTEsCTAsCSJBRERfRnA4MCIsIDAsIDB4NDAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDAgfSwgIC8vIEluc3QgIzExMyA9IEFERF9GcDgwDQorICB7IDExNCwJNywJMSwJMCwJIkFERF9GcDgwbTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MSB9LCAgLy8gSW5zdCAjMTE0ID0gQUREX0ZwODBtMzINCisgIHsgMTE1LAk3LAkxLAkwLAkiQUREX0ZwODBtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICMxMTUgPSBBRERfRnA4MG02NA0KKyAgeyAxMTYsCTcsCTEsCTAsCSJBRERfRnBJMTZtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM3IH0sICAvLyBJbnN0ICMxMTYgPSBBRERfRnBJMTZtMzINCisgIHsgMTE3LAk3LAkxLAkwLAkiQUREX0ZwSTE2bTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zOSB9LCAgLy8gSW5zdCAjMTE3ID0gQUREX0ZwSTE2bTY0DQorICB7IDExOCwJNywJMSwJMCwJIkFERF9GcEkxNm04MCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDEgfSwgIC8vIEluc3QgIzExOCA9IEFERF9GcEkxNm04MA0KKyAgeyAxMTksCTcsCTEsCTAsCSJBRERfRnBJMzJtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM3IH0sICAvLyBJbnN0ICMxMTkgPSBBRERfRnBJMzJtMzINCisgIHsgMTIwLAk3LAkxLAkwLAkiQUREX0ZwSTMybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zOSB9LCAgLy8gSW5zdCAjMTIwID0gQUREX0ZwSTMybTY0DQorICB7IDEyMSwJNywJMSwJMCwJIkFERF9GcEkzMm04MCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDEgfSwgIC8vIEluc3QgIzEyMSA9IEFERF9GcEkzMm04MA0KKyAgeyAxMjIsCTEsCTAsCTAsCSJBRERfRnJTVDAiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMDAwMDcwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMTIyID0gQUREX0ZyU1QwDQorICB7IDEyMywJMSwJMCwJMCwJIkFESkNBTExTVEFDS0RPV04zMiIsIDAsIDB4MFVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0MywgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEyMyA9IEFESkNBTExTVEFDS0RPV04zMg0KKyAgeyAxMjQsCTEsCTAsCTAsCSJBREpDQUxMU1RBQ0tET1dONjQiLCAwLCAweDBVTEwsIEltcGxpY2l0TGlzdDQsIEltcGxpY2l0TGlzdDUsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMjQgPSBBREpDQUxMU1RBQ0tET1dONjQNCisgIHsgMTI1LAkyLAkwLAkwLAkiQURKQ0FMTFNUQUNLVVAzMiIsIDAsIDB4MFVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0MywgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYgfSwgIC8vIEluc3QgIzEyNSA9IEFESkNBTExTVEFDS1VQMzINCisgIHsgMTI2LAkyLAkwLAkwLAkiQURKQ0FMTFNUQUNLVVA2NCIsIDAsIDB4MFVMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0NSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYgfSwgIC8vIEluc3QgIzEyNiA9IEFESkNBTExTVEFDS1VQNjQNCisgIHsgMTI3LAk3LAkxLAkwLAkiQUVTREVDTEFTVHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkZmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTI3ID0gQUVTREVDTEFTVHJtDQorICB7IDEyOCwJMywJMSwJMCwJIkFFU0RFQ0xBU1RyciIsIDAsIDB4ZGZjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzEyOCA9IEFFU0RFQ0xBU1Rycg0KKyAgeyAxMjksCTcsCTEsCTAsCSJBRVNERUNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZGVjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzEyOSA9IEFFU0RFQ3JtDQorICB7IDEzMCwJMywJMSwJMCwJIkFFU0RFQ3JyIiwgMCwgMHhkZWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTMwID0gQUVTREVDcnINCisgIHsgMTMxLAk3LAkxLAkwLAkiQUVTRU5DTEFTVHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkZGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTMxID0gQUVTRU5DTEFTVHJtDQorICB7IDEzMiwJMywJMSwJMCwJIkFFU0VOQ0xBU1RyciIsIDAsIDB4ZGRjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzEzMiA9IEFFU0VOQ0xBU1Rycg0KKyAgeyAxMzMsCTcsCTEsCTAsCSJBRVNFTkNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZGNjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzEzMyA9IEFFU0VOQ3JtDQorICB7IDEzNCwJMywJMSwJMCwJIkFFU0VOQ3JyIiwgMCwgMHhkY2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTM0ID0gQUVTRU5DcnINCisgIHsgMTM1LAk2LAkxLAkwLAkiQUVTSU1Dcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGRiYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxMzUgPSBBRVNJTUNybQ0KKyAgeyAxMzYsCTIsCTEsCTAsCSJBRVNJTUNyciIsIDAsIDB4ZGJjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzEzNiA9IEFFU0lNQ3JyDQorICB7IDEzNywJNywJMSwJMCwJIkFFU0tFWUdFTkFTU0lTVDEyOHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkZmMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMTM3ID0gQUVTS0VZR0VOQVNTSVNUMTI4cm0NCisgIHsgMTM4LAkzLAkxLAkwLAkiQUVTS0VZR0VOQVNTSVNUMTI4cnIiLCAwLCAweGRmYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMxMzggPSBBRVNLRVlHRU5BU1NJU1QxMjhycg0KKyAgeyAxMzksCTEsCTAsCTAsCSJBTkQxNmkxNiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDI1MDA2MDQxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTM5ID0gQU5EMTZpMTYNCisgIHsgMTQwLAk2LAkwLAkwLAkiQU5EMTZtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgxMDA2MDVjVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzE0MCA9IEFORDE2bWkNCisgIHsgMTQxLAk2LAkwLAkwLAkiQU5EMTZtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MzAwMjA1Y1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxNDEgPSBBTkQxNm1pOA0KKyAgeyAxNDIsCTYsCTAsCTAsCSJBTkQxNm1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4MjEwMDAwNDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjMTQyID0gQU5EMTZtcg0KKyAgeyAxNDMsCTMsCTEsCTAsCSJBTkQxNnJpIiwgMCwgMHg4MTAwNjA1NFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyIH0sICAvLyBJbnN0ICMxNDMgPSBBTkQxNnJpDQorICB7IDE0NCwJMywJMSwJMCwJIkFORDE2cmk4IiwgMCwgMHg4MzAwMjA1NFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyIH0sICAvLyBJbnN0ICMxNDQgPSBBTkQxNnJpOA0KKyAgeyAxNDUsCTcsCTEsCTAsCSJBTkQxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyMzAwMDA0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICMxNDUgPSBBTkQxNnJtDQorICB7IDE0NiwJMywJMSwJMCwJIkFORDE2cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDIxMDAwMDQzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzE0NiA9IEFORDE2cnINCisgIHsgMTQ3LAkzLAkxLAkwLAkiQU5EMTZycl9SRVYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyMzAwMDA0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMxNDcgPSBBTkQxNnJyX1JFVg0KKyAgeyAxNDgsCTEsCTAsCTAsCSJBTkQzMmkzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDI1MDBhMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTQ4ID0gQU5EMzJpMzINCisgIHsgMTQ5LAk2LAkwLAkwLAkiQU5EMzJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgxMDBhMDFjVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzE0OSA9IEFORDMybWkNCisgIHsgMTUwLAk2LAkwLAkwLAkiQU5EMzJtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MzAwMjAxY1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxNTAgPSBBTkQzMm1pOA0KKyAgeyAxNTEsCTYsCTAsCTAsCSJBTkQzMm1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4MjEwMDAwMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNSB9LCAgLy8gSW5zdCAjMTUxID0gQU5EMzJtcg0KKyAgeyAxNTIsCTMsCTEsCTAsCSJBTkQzMnJpIiwgMCwgMHg4MTAwYTAxNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE2IH0sICAvLyBJbnN0ICMxNTIgPSBBTkQzMnJpDQorICB7IDE1MywJMywJMSwJMCwJIkFORDMycmk4IiwgMCwgMHg4MzAwMjAxNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE2IH0sICAvLyBJbnN0ICMxNTMgPSBBTkQzMnJpOA0KKyAgeyAxNTQsCTcsCTEsCTAsCSJBTkQzMnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyMzAwMDAwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICMxNTQgPSBBTkQzMnJtDQorICB7IDE1NSwJMywJMSwJMCwJIkFORDMycnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDIxMDAwMDAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzE1NSA9IEFORDMycnINCisgIHsgMTU2LAkzLAkxLAkwLAkiQU5EMzJycl9SRVYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyMzAwMDAwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICMxNTYgPSBBTkQzMnJyX1JFVg0KKyAgeyAxNTcsCTEsCTAsCTAsCSJBTkQ2NGkzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDI1MDBiMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTU3ID0gQU5ENjRpMzINCisgIHsgMTU4LAk2LAkwLAkwLAkiQU5ENjRtaTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODEwMGIwMWNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTU4ID0gQU5ENjRtaTMyDQorICB7IDE1OSwJNiwJMCwJMCwJIkFORDY0bWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODMwMDMwMWNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTU5ID0gQU5ENjRtaTgNCisgIHsgMTYwLAk2LAkwLAkwLAkiQU5ENjRtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDIxMDAxMDA0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTkgfSwgIC8vIEluc3QgIzE2MCA9IEFORDY0bXINCisgIHsgMTYxLAkzLAkxLAkwLAkiQU5ENjRyaTMyIiwgMCwgMHg4MTAwYjAxNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIwIH0sICAvLyBJbnN0ICMxNjEgPSBBTkQ2NHJpMzINCisgIHsgMTYyLAkzLAkxLAkwLAkiQU5ENjRyaTgiLCAwLCAweDgzMDAzMDE0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjAgfSwgIC8vIEluc3QgIzE2MiA9IEFORDY0cmk4DQorICB7IDE2MywJNywJMSwJMCwJIkFORDY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDIzMDAxMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjEgfSwgIC8vIEluc3QgIzE2MyA9IEFORDY0cm0NCisgIHsgMTY0LAkzLAkxLAkwLAkiQU5ENjRyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4MjEwMDEwMDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMTY0ID0gQU5ENjRycg0KKyAgeyAxNjUsCTMsCTEsCTAsCSJBTkQ2NHJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDIzMDAxMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzE2NSA9IEFORDY0cnJfUkVWDQorICB7IDE2NiwJMSwJMCwJMCwJIkFORDhpOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDI0MDAyMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTY2ID0gQU5EOGk4DQorICB7IDE2NywJNiwJMCwJMCwJIkFORDhtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgwMDAyMDFjVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzE2NyA9IEFORDhtaQ0KKyAgeyAxNjgsCTYsCTAsCTAsCSJBTkQ4bXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMDAwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI0IH0sICAvLyBJbnN0ICMxNjggPSBBTkQ4bXINCisgIHsgMTY5LAkzLAkxLAkwLAkiQU5EOHJpIiwgMCwgMHg4MDAwMjAxNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI1IH0sICAvLyBJbnN0ICMxNjkgPSBBTkQ4cmkNCisgIHsgMTcwLAk3LAkxLAkwLAkiQU5EOHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyMjAwMDAwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI2IH0sICAvLyBJbnN0ICMxNzAgPSBBTkQ4cm0NCisgIHsgMTcxLAkzLAkxLAkwLAkiQU5EOHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgyMDAwMDAwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI3IH0sICAvLyBJbnN0ICMxNzEgPSBBTkQ4cnINCisgIHsgMTcyLAkzLAkxLAkwLAkiQU5EOHJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDIyMDAwMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjcgfSwgIC8vIEluc3QgIzE3MiA9IEFORDhycl9SRVYNCisgIHsgMTczLAk3LAkxLAkwLAkiQU5ETlBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNzMgPSBBTkROUERybQ0KKyAgeyAxNzQsCTMsCTEsCTAsCSJBTkROUERyciIsIDAsIDB4NTU4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE3NCA9IEFORE5QRHJyDQorICB7IDE3NSwJNywJMSwJMCwJIkFORE5QU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTc1ID0gQU5ETlBTcm0NCisgIHsgMTc2LAkzLAkxLAkwLAkiQU5ETlBTcnIiLCAwLCAweDU1NDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNzYgPSBBTkROUFNycg0KKyAgeyAxNzcsCTcsCTEsCTAsCSJBTkRQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NDgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTc3ID0gQU5EUERybQ0KKyAgeyAxNzgsCTMsCTEsCTAsCSJBTkRQRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NDgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTc4ID0gQU5EUERycg0KKyAgeyAxNzksCTcsCTEsCTAsCSJBTkRQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NDQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTc5ID0gQU5EUFNybQ0KKyAgeyAxODAsCTMsCTEsCTAsCSJBTkRQU3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NDQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTgwID0gQU5EUFNycg0KKyAgeyAxODEsCTksCTIsCTAsCSJBVE9NQURENjQzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDBVTEwsIEltcGxpY2l0TGlzdDYsIEltcGxpY2l0TGlzdDcsIEJhcnJpZXJzMiwgT3BlcmFuZEluZm80NiB9LCAgLy8gSW5zdCAjMTgxID0gQVRPTUFERDY0MzINCisgIHsgMTgyLAk3LAkxLAkwLAkiQVRPTUFORDE2IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDcgfSwgIC8vIEluc3QgIzE4MiA9IEFUT01BTkQxNg0KKyAgeyAxODMsCTcsCTEsCTAsCSJBVE9NQU5EMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80OCB9LCAgLy8gSW5zdCAjMTgzID0gQVRPTUFORDMyDQorICB7IDE4NCwJNywJMSwJMCwJIkFUT01BTkQ2NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ5IH0sICAvLyBJbnN0ICMxODQgPSBBVE9NQU5ENjQNCisgIHsgMTg1LAk5LAkyLAkwLAkiQVRPTUFORDY0MzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBJbXBsaWNpdExpc3Q2LCBJbXBsaWNpdExpc3Q3LCBCYXJyaWVyczIsIE9wZXJhbmRJbmZvNDYgfSwgIC8vIEluc3QgIzE4NSA9IEFUT01BTkQ2NDMyDQorICB7IDE4NiwJNywJMSwJMCwJIkFUT01BTkQ4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTAgfSwgIC8vIEluc3QgIzE4NiA9IEFUT01BTkQ4DQorICB7IDE4NywJNywJMSwJMCwJIkFUT01NQVgxNiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ3IH0sICAvLyBJbnN0ICMxODcgPSBBVE9NTUFYMTYNCisgIHsgMTg4LAk3LAkxLAkwLAkiQVRPTU1BWDMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDggfSwgIC8vIEluc3QgIzE4OCA9IEFUT01NQVgzMg0KKyAgeyAxODksCTcsCTEsCTAsCSJBVE9NTUFYNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80OSB9LCAgLy8gSW5zdCAjMTg5ID0gQVRPTU1BWDY0DQorICB7IDE5MCwJNywJMSwJMCwJIkFUT01NSU4xNiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ3IH0sICAvLyBJbnN0ICMxOTAgPSBBVE9NTUlOMTYNCisgIHsgMTkxLAk3LAkxLAkwLAkiQVRPTU1JTjMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDggfSwgIC8vIEluc3QgIzE5MSA9IEFUT01NSU4zMg0KKyAgeyAxOTIsCTcsCTEsCTAsCSJBVE9NTUlONjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80OSB9LCAgLy8gSW5zdCAjMTkyID0gQVRPTU1JTjY0DQorICB7IDE5MywJNywJMSwJMCwJIkFUT01OQU5EMTYiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NyB9LCAgLy8gSW5zdCAjMTkzID0gQVRPTU5BTkQxNg0KKyAgeyAxOTQsCTcsCTEsCTAsCSJBVE9NTkFORDMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDggfSwgIC8vIEluc3QgIzE5NCA9IEFUT01OQU5EMzINCisgIHsgMTk1LAk3LAkxLAkwLAkiQVRPTU5BTkQ2NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ5IH0sICAvLyBJbnN0ICMxOTUgPSBBVE9NTkFORDY0DQorICB7IDE5NiwJOSwJMiwJMCwJIkFUT01OQU5ENjQzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDBVTEwsIEltcGxpY2l0TGlzdDYsIEltcGxpY2l0TGlzdDcsIEJhcnJpZXJzMiwgT3BlcmFuZEluZm80NiB9LCAgLy8gSW5zdCAjMTk2ID0gQVRPTU5BTkQ2NDMyDQorICB7IDE5NywJNywJMSwJMCwJIkFUT01OQU5EOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzUwIH0sICAvLyBJbnN0ICMxOTcgPSBBVE9NTkFORDgNCisgIHsgMTk4LAk3LAkxLAkwLAkiQVRPTU9SMTYiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NyB9LCAgLy8gSW5zdCAjMTk4ID0gQVRPTU9SMTYNCisgIHsgMTk5LAk3LAkxLAkwLAkiQVRPTU9SMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80OCB9LCAgLy8gSW5zdCAjMTk5ID0gQVRPTU9SMzINCisgIHsgMjAwLAk3LAkxLAkwLAkiQVRPTU9SNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80OSB9LCAgLy8gSW5zdCAjMjAwID0gQVRPTU9SNjQNCisgIHsgMjAxLAk5LAkyLAkwLAkiQVRPTU9SNjQzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDBVTEwsIEltcGxpY2l0TGlzdDYsIEltcGxpY2l0TGlzdDcsIEJhcnJpZXJzMiwgT3BlcmFuZEluZm80NiB9LCAgLy8gSW5zdCAjMjAxID0gQVRPTU9SNjQzMg0KKyAgeyAyMDIsCTcsCTEsCTAsCSJBVE9NT1I4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTAgfSwgIC8vIEluc3QgIzIwMiA9IEFUT01PUjgNCisgIHsgMjAzLAk5LAkyLAkwLAkiQVRPTVNVQjY0MzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBJbXBsaWNpdExpc3Q2LCBJbXBsaWNpdExpc3Q3LCBCYXJyaWVyczIsIE9wZXJhbmRJbmZvNDYgfSwgIC8vIEluc3QgIzIwMyA9IEFUT01TVUI2NDMyDQorICB7IDIwNCwJOSwJMiwJMCwJIkFUT01TV0FQNjQzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDBVTEwsIEltcGxpY2l0TGlzdDYsIEltcGxpY2l0TGlzdDcsIEJhcnJpZXJzMiwgT3BlcmFuZEluZm80NiB9LCAgLy8gSW5zdCAjMjA0ID0gQVRPTVNXQVA2NDMyDQorICB7IDIwNSwJNywJMSwJMCwJIkFUT01VTUFYMTYiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NyB9LCAgLy8gSW5zdCAjMjA1ID0gQVRPTVVNQVgxNg0KKyAgeyAyMDYsCTcsCTEsCTAsCSJBVE9NVU1BWDMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDggfSwgIC8vIEluc3QgIzIwNiA9IEFUT01VTUFYMzINCisgIHsgMjA3LAk3LAkxLAkwLAkiQVRPTVVNQVg2NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ5IH0sICAvLyBJbnN0ICMyMDcgPSBBVE9NVU1BWDY0DQorICB7IDIwOCwJNywJMSwJMCwJIkFUT01VTUlOMTYiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NyB9LCAgLy8gSW5zdCAjMjA4ID0gQVRPTVVNSU4xNg0KKyAgeyAyMDksCTcsCTEsCTAsCSJBVE9NVU1JTjMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDggfSwgIC8vIEluc3QgIzIwOSA9IEFUT01VTUlOMzINCisgIHsgMjEwLAk3LAkxLAkwLAkiQVRPTVVNSU42NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ5IH0sICAvLyBJbnN0ICMyMTAgPSBBVE9NVU1JTjY0DQorICB7IDIxMSwJNywJMSwJMCwJIkFUT01YT1IxNiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ3IH0sICAvLyBJbnN0ICMyMTEgPSBBVE9NWE9SMTYNCisgIHsgMjEyLAk3LAkxLAkwLAkiQVRPTVhPUjMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDggfSwgIC8vIEluc3QgIzIxMiA9IEFUT01YT1IzMg0KKyAgeyAyMTMsCTcsCTEsCTAsCSJBVE9NWE9SNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80OSB9LCAgLy8gSW5zdCAjMjEzID0gQVRPTVhPUjY0DQorICB7IDIxNCwJOSwJMiwJMCwJIkFUT01YT1I2NDMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MFVMTCwgSW1wbGljaXRMaXN0NiwgSW1wbGljaXRMaXN0NywgQmFycmllcnMyLCBPcGVyYW5kSW5mbzQ2IH0sICAvLyBJbnN0ICMyMTQgPSBBVE9NWE9SNjQzMg0KKyAgeyAyMTUsCTcsCTEsCTAsCSJBVE9NWE9SOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzUwIH0sICAvLyBJbnN0ICMyMTUgPSBBVE9NWE9SOA0KKyAgeyAyMTYsCTgsCTEsCTAsCSJCTEVORFBEcm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUxIH0sICAvLyBJbnN0ICMyMTYgPSBCTEVORFBEcm1pDQorICB7IDIxNywJNCwJMSwJMCwJIkJMRU5EUERycmkiLCAwLCAweGRjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTIgfSwgIC8vIEluc3QgIzIxNyA9IEJMRU5EUERycmkNCisgIHsgMjE4LAk4LAkxLAkwLAkiQkxFTkRQU3JtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4Y2MwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MSB9LCAgLy8gSW5zdCAjMjE4ID0gQkxFTkRQU3JtaQ0KKyAgeyAyMTksCTQsCTEsCTAsCSJCTEVORFBTcnJpIiwgMCwgMHhjYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUyIH0sICAvLyBJbnN0ICMyMTkgPSBCTEVORFBTcnJpDQorICB7IDIyMCwJNywJMSwJMCwJIkJMRU5EVlBEcm0wIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNWMwMGQ0NlVMTCwgSW1wbGljaXRMaXN0OCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMjIwID0gQkxFTkRWUERybTANCisgIHsgMjIxLAkzLAkxLAkwLAkiQkxFTkRWUERycjAiLCAwLCAweDE1YzAwZDQ1VUxMLCBJbXBsaWNpdExpc3Q4LCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMyMjEgPSBCTEVORFZQRHJyMA0KKyAgeyAyMjIsCTcsCTEsCTAsCSJCTEVORFZQU3JtMCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTRjMDBkNDZVTEwsIEltcGxpY2l0TGlzdDgsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzIyMiA9IEJMRU5EVlBTcm0wDQorICB7IDIyMywJMywJMSwJMCwJIkJMRU5EVlBTcnIwIiwgMCwgMHgxNGMwMGQ0NVVMTCwgSW1wbGljaXRMaXN0OCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMjIzID0gQkxFTkRWUFNycjANCisgIHsgMjI0LAk2LAkxLAkwLAkiQlNGMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YmMwMDAxNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81MyB9LCAgLy8gSW5zdCAjMjI0ID0gQlNGMTZybQ0KKyAgeyAyMjUsCTIsCTEsCTAsCSJCU0YxNnJyIiwgMCwgMHhiYzAwMDE0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU0IH0sICAvLyBJbnN0ICMyMjUgPSBCU0YxNnJyDQorICB7IDIyNiwJNiwJMSwJMCwJIkJTRjMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGJjMDAwMTA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzIyNiA9IEJTRjMycm0NCisgIHsgMjI3LAkyLAkxLAkwLAkiQlNGMzJyciIsIDAsIDB4YmMwMDAxMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NiB9LCAgLy8gSW5zdCAjMjI3ID0gQlNGMzJycg0KKyAgeyAyMjgsCTYsCTEsCTAsCSJCU0Y2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiYzAwMTEwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMyMjggPSBCU0Y2NHJtDQorICB7IDIyOSwJMiwJMSwJMCwJIkJTRjY0cnIiLCAwLCAweGJjMDAxMTA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTggfSwgIC8vIEluc3QgIzIyOSA9IEJTRjY0cnINCisgIHsgMjMwLAk2LAkxLAkwLAkiQlNSMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YmQwMDAxNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81MyB9LCAgLy8gSW5zdCAjMjMwID0gQlNSMTZybQ0KKyAgeyAyMzEsCTIsCTEsCTAsCSJCU1IxNnJyIiwgMCwgMHhiZDAwMDE0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU0IH0sICAvLyBJbnN0ICMyMzEgPSBCU1IxNnJyDQorICB7IDIzMiwJNiwJMSwJMCwJIkJTUjMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGJkMDAwMTA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzIzMiA9IEJTUjMycm0NCisgIHsgMjMzLAkyLAkxLAkwLAkiQlNSMzJyciIsIDAsIDB4YmQwMDAxMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NiB9LCAgLy8gSW5zdCAjMjMzID0gQlNSMzJycg0KKyAgeyAyMzQsCTYsCTEsCTAsCSJCU1I2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiZDAwMTEwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMyMzQgPSBCU1I2NHJtDQorICB7IDIzNSwJMiwJMSwJMCwJIkJTUjY0cnIiLCAwLCAweGJkMDAxMTA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTggfSwgIC8vIEluc3QgIzIzNSA9IEJTUjY0cnINCisgIHsgMjM2LAkyLAkxLAkwLAkiQlNXQVAzMnIiLCAwLCAweGM4MDAwMTAyVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICMyMzYgPSBCU1dBUDMycg0KKyAgeyAyMzcsCTIsCTEsCTAsCSJCU1dBUDY0ciIsIDAsIDB4YzgwMDExMDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjAgfSwgIC8vIEluc3QgIzIzNyA9IEJTV0FQNjRyDQorICB7IDIzOCwJNiwJMCwJMCwJIkJUMTZtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGJhMDAyMTVjVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIzOCA9IEJUMTZtaTgNCisgIHsgMjM5LAk2LAkwLAkwLAkiQlQxNm1yIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTMwMDAxNDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjMjM5ID0gQlQxNm1yDQorICB7IDI0MCwJMiwJMCwJMCwJIkJUMTZyaTgiLCAwLCAweGJhMDAyMTU0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNjEgfSwgIC8vIEluc3QgIzI0MCA9IEJUMTZyaTgNCisgIHsgMjQxLAkyLAkwLAkwLAkiQlQxNnJyIiwgMCwgMHhhMzAwMDE0M1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU0IH0sICAvLyBJbnN0ICMyNDEgPSBCVDE2cnINCisgIHsgMjQyLAk2LAkwLAkwLAkiQlQzMm1pOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YmEwMDIxMWNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjQyID0gQlQzMm1pOA0KKyAgeyAyNDMsCTYsCTAsCTAsCSJCVDMybXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhMzAwMDEwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMyNDMgPSBCVDMybXINCisgIHsgMjQ0LAkyLAkwLAkwLAkiQlQzMnJpOCIsIDAsIDB4YmEwMDIxMTRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MiB9LCAgLy8gSW5zdCAjMjQ0ID0gQlQzMnJpOA0KKyAgeyAyNDUsCTIsCTAsCTAsCSJCVDMycnIiLCAwLCAweGEzMDAwMTAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTYgfSwgIC8vIEluc3QgIzI0NSA9IEJUMzJycg0KKyAgeyAyNDYsCTYsCTAsCTAsCSJCVDY0bWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiYTAwMjExY1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyNDYgPSBCVDY0bWk4DQorICB7IDI0NywJNiwJMCwJMCwJIkJUNjRtciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGEzMDAxMTA0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTkgfSwgIC8vIEluc3QgIzI0NyA9IEJUNjRtcg0KKyAgeyAyNDgsCTIsCTAsCTAsCSJCVDY0cmk4IiwgMCwgMHhiYTAwMzExNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYzIH0sICAvLyBJbnN0ICMyNDggPSBCVDY0cmk4DQorICB7IDI0OSwJMiwJMCwJMCwJIkJUNjRyciIsIDAsIDB4YTMwMDExMDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81OCB9LCAgLy8gSW5zdCAjMjQ5ID0gQlQ2NHJyDQorICB7IDI1MCwJNiwJMCwJMCwJIkJUQzE2bWk4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YmEwMDIxNWZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjUwID0gQlRDMTZtaTgNCisgIHsgMjUxLAk2LAkwLAkwLAkiQlRDMTZtciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGJiMDAwMTQ0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTEgfSwgIC8vIEluc3QgIzI1MSA9IEJUQzE2bXINCisgIHsgMjUyLAkyLAkwLAkwLAkiQlRDMTZyaTgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiYTAwMjE1N1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYxIH0sICAvLyBJbnN0ICMyNTIgPSBCVEMxNnJpOA0KKyAgeyAyNTMsCTIsCTAsCTAsCSJCVEMxNnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YmIwMDAxNDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NCB9LCAgLy8gSW5zdCAjMjUzID0gQlRDMTZycg0KKyAgeyAyNTQsCTYsCTAsCTAsCSJCVEMzMm1pOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGJhMDAyMTFmVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzI1NCA9IEJUQzMybWk4DQorICB7IDI1NSwJNiwJMCwJMCwJIkJUQzMybXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiYjAwMDEwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMyNTUgPSBCVEMzMm1yDQorICB7IDI1NiwJMiwJMCwJMCwJIkJUQzMycmk4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YmEwMDIxMTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MiB9LCAgLy8gSW5zdCAjMjU2ID0gQlRDMzJyaTgNCisgIHsgMjU3LAkyLAkwLAkwLAkiQlRDMzJyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGJiMDAwMTAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTYgfSwgIC8vIEluc3QgIzI1NyA9IEJUQzMycnINCisgIHsgMjU4LAk2LAkwLAkwLAkiQlRDNjRtaTgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiYTAwMzExZlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyNTggPSBCVEM2NG1pOA0KKyAgeyAyNTksCTYsCTAsCTAsCSJCVEM2NG1yIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YmIwMDExMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOSB9LCAgLy8gSW5zdCAjMjU5ID0gQlRDNjRtcg0KKyAgeyAyNjAsCTIsCTAsCTAsCSJCVEM2NHJpOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGJhMDAzMTE3VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNjMgfSwgIC8vIEluc3QgIzI2MCA9IEJUQzY0cmk4DQorICB7IDI2MSwJMiwJMCwJMCwJIkJUQzY0cnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiYjAwMTEwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICMyNjEgPSBCVEM2NHJyDQorICB7IDI2MiwJNiwJMCwJMCwJIkJUUjE2bWk4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YmEwMDIxNWVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjYyID0gQlRSMTZtaTgNCisgIHsgMjYzLAk2LAkwLAkwLAkiQlRSMTZtciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGIzMDAwMTQ0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTEgfSwgIC8vIEluc3QgIzI2MyA9IEJUUjE2bXINCisgIHsgMjY0LAkyLAkwLAkwLAkiQlRSMTZyaTgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiYTAwMjE1NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYxIH0sICAvLyBJbnN0ICMyNjQgPSBCVFIxNnJpOA0KKyAgeyAyNjUsCTIsCTAsCTAsCSJCVFIxNnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjMwMDAxNDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NCB9LCAgLy8gSW5zdCAjMjY1ID0gQlRSMTZycg0KKyAgeyAyNjYsCTYsCTAsCTAsCSJCVFIzMm1pOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGJhMDAyMTFlVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzI2NiA9IEJUUjMybWk4DQorICB7IDI2NywJNiwJMCwJMCwJIkJUUjMybXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiMzAwMDEwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMyNjcgPSBCVFIzMm1yDQorICB7IDI2OCwJMiwJMCwJMCwJIkJUUjMycmk4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YmEwMDIxMTZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MiB9LCAgLy8gSW5zdCAjMjY4ID0gQlRSMzJyaTgNCisgIHsgMjY5LAkyLAkwLAkwLAkiQlRSMzJyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGIzMDAwMTAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTYgfSwgIC8vIEluc3QgIzI2OSA9IEJUUjMycnINCisgIHsgMjcwLAk2LAkwLAkwLAkiQlRSNjRtaTgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiYTAwMzExZVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyNzAgPSBCVFI2NG1pOA0KKyAgeyAyNzEsCTYsCTAsCTAsCSJCVFI2NG1yIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjMwMDExMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOSB9LCAgLy8gSW5zdCAjMjcxID0gQlRSNjRtcg0KKyAgeyAyNzIsCTIsCTAsCTAsCSJCVFI2NHJpOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGJhMDAzMTE2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNjMgfSwgIC8vIEluc3QgIzI3MiA9IEJUUjY0cmk4DQorICB7IDI3MywJMiwJMCwJMCwJIkJUUjY0cnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiMzAwMTEwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICMyNzMgPSBCVFI2NHJyDQorICB7IDI3NCwJNiwJMCwJMCwJIkJUUzE2bWk4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YmEwMDIxNWRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjc0ID0gQlRTMTZtaTgNCisgIHsgMjc1LAk2LAkwLAkwLAkiQlRTMTZtciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFiMDAwMTQ0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTEgfSwgIC8vIEluc3QgIzI3NSA9IEJUUzE2bXINCisgIHsgMjc2LAkyLAkwLAkwLAkiQlRTMTZyaTgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiYTAwMjE1NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYxIH0sICAvLyBJbnN0ICMyNzYgPSBCVFMxNnJpOA0KKyAgeyAyNzcsCTIsCTAsCTAsCSJCVFMxNnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YWIwMDAxNDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NCB9LCAgLy8gSW5zdCAjMjc3ID0gQlRTMTZycg0KKyAgeyAyNzgsCTYsCTAsCTAsCSJCVFMzMm1pOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGJhMDAyMTFkVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzI3OCA9IEJUUzMybWk4DQorICB7IDI3OSwJNiwJMCwJMCwJIkJUUzMybXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhYjAwMDEwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMyNzkgPSBCVFMzMm1yDQorICB7IDI4MCwJMiwJMCwJMCwJIkJUUzMycmk4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YmEwMDIxMTVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MiB9LCAgLy8gSW5zdCAjMjgwID0gQlRTMzJyaTgNCisgIHsgMjgxLAkyLAkwLAkwLAkiQlRTMzJyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFiMDAwMTAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTYgfSwgIC8vIEluc3QgIzI4MSA9IEJUUzMycnINCisgIHsgMjgyLAk2LAkwLAkwLAkiQlRTNjRtaTgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiYTAwMzExZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyODIgPSBCVFM2NG1pOA0KKyAgeyAyODMsCTYsCTAsCTAsCSJCVFM2NG1yIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YWIwMDExMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOSB9LCAgLy8gSW5zdCAjMjgzID0gQlRTNjRtcg0KKyAgeyAyODQsCTIsCTAsCTAsCSJCVFM2NHJpOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGJhMDAzMTE1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNjMgfSwgIC8vIEluc3QgIzI4NCA9IEJUUzY0cmk4DQorICB7IDI4NSwJMiwJMCwJMCwJIkJUUzY0cnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhYjAwMTEwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICMyODUgPSBCVFM2NHJyDQorICB7IDI4NiwJNSwJMCwJMCwJIkNBTEwzMm0iLCAwfCgxPDxUSUQ6OkNhbGwpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlZhcmlhZGljKSwgMHhmZjAwMDAxYVVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0OSwgQmFycmllcnMzLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyODYgPSBDQUxMMzJtDQorICB7IDI4NywJMSwJMCwJMCwJIkNBTEwzMnIiLCAwfCgxPDxUSUQ6OkNhbGwpfCgxPDxUSUQ6OlZhcmlhZGljKSwgMHhmZjAwMDAxMlVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0OSwgQmFycmllcnMzLCBPcGVyYW5kSW5mbzY0IH0sICAvLyBJbnN0ICMyODcgPSBDQUxMMzJyDQorICB7IDI4OCwJNSwJMCwJMCwJIkNBTEw2NG0iLCAwfCgxPDxUSUQ6OkNhbGwpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlZhcmlhZGljKSwgMHhmZjAwMDAxYVVMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0MTAsIEJhcnJpZXJzNCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjg4ID0gQ0FMTDY0bQ0KKyAgeyAyODksCTEsCTAsCTAsCSJDQUxMNjRwY3JlbDMyIiwgMHwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpWYXJpYWRpYyl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGU4MDBjMDAxVUxMLCBJbXBsaWNpdExpc3Q0LCBJbXBsaWNpdExpc3QxMCwgQmFycmllcnM0LCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzI4OSA9IENBTEw2NHBjcmVsMzINCisgIHsgMjkwLAkxLAkwLAkwLAkiQ0FMTDY0ciIsIDB8KDE8PFRJRDo6Q2FsbCl8KDE8PFRJRDo6VmFyaWFkaWMpLCAweGZmMDAwMDEyVUxMLCBJbXBsaWNpdExpc3Q0LCBJbXBsaWNpdExpc3QxMCwgQmFycmllcnM0LCBPcGVyYW5kSW5mbzY1IH0sICAvLyBJbnN0ICMyOTAgPSBDQUxMNjRyDQorICB7IDI5MSwJMSwJMCwJMCwJIkNBTExwY3JlbDE2IiwgMHwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpWYXJpYWRpYyl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGU4MDA4MDQxVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3Q5LCBCYXJyaWVyczMsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMjkxID0gQ0FMTHBjcmVsMTYNCisgIHsgMjkyLAkxLAkwLAkwLAkiQ0FMTHBjcmVsMzIiLCAwfCgxPDxUSUQ6OkNhbGwpfCgxPDxUSUQ6OlZhcmlhZGljKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTgwMGMwMDFVTEwsIEltcGxpY2l0TGlzdDIsIEltcGxpY2l0TGlzdDksIEJhcnJpZXJzMywgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMyOTIgPSBDQUxMcGNyZWwzMg0KKyAgeyAyOTMsCTAsCTAsCTAsCSJDQlciLCAwLCAweDk4MDAwMDQxVUxMLCBJbXBsaWNpdExpc3QxMSwgSW1wbGljaXRMaXN0MTIsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzI5MyA9IENCVw0KKyAgeyAyOTQsCTAsCTAsCTAsCSJDRFEiLCAwLCAweDk5MDAwMDAxVUxMLCBJbXBsaWNpdExpc3QxMywgSW1wbGljaXRMaXN0MTQsIEJhcnJpZXJzNSwgMCB9LCAgLy8gSW5zdCAjMjk0ID0gQ0RRDQorICB7IDI5NSwJMCwJMCwJMCwJIkNEUUUiLCAwLCAweDk4MDAxMDAxVUxMLCBJbXBsaWNpdExpc3QxMywgSW1wbGljaXRMaXN0MTUsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzI5NSA9IENEUUUNCisgIHsgMjk2LAkwLAkwLAkwLAkiQ0hTX0YiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlMDAwMDQwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjk2ID0gQ0hTX0YNCisgIHsgMjk3LAkyLAkxLAkwLAkiQ0hTX0ZwMzIiLCAwLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzcgfSwgIC8vIEluc3QgIzI5NyA9IENIU19GcDMyDQorICB7IDI5OCwJMiwJMSwJMCwJIkNIU19GcDY0IiwgMCwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84IH0sICAvLyBJbnN0ICMyOTggPSBDSFNfRnA2NA0KKyAgeyAyOTksCTIsCTEsCTAsCSJDSFNfRnA4MCIsIDAsIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOSB9LCAgLy8gSW5zdCAjMjk5ID0gQ0hTX0ZwODANCisgIHsgMzAwLAkwLAkwLAkwLAkiQ0xDIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjgwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzMwMCA9IENMQw0KKyAgeyAzMDEsCTAsCTAsCTAsCSJDTEQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmYzAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMzAxID0gQ0xEDQorICB7IDMwMiwJNSwJMCwJMCwJIkNMRkxVU0giLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YWUwMDAxMWZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzMwMiA9IENMRkxVU0gNCisgIHsgMzAzLAkwLAkwLAkwLAkiQ0xJIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmEwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzMwMyA9IENMSQ0KKyAgeyAzMDQsCTAsCTAsCTAsCSJDTFRTIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NjAwMDEwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMzA0ID0gQ0xUUw0KKyAgeyAzMDUsCTAsCTAsCTAsCSJDTUMiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNTAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMzA1ID0gQ01DDQorICB7IDMwNiwJNywJMSwJMCwJIkNNT1ZBMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NDcwMDAxNDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTMgfSwgIC8vIEluc3QgIzMwNiA9IENNT1ZBMTZybQ0KKyAgeyAzMDcsCTMsCTEsCTAsCSJDTU9WQTE2cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQ3MDAwMTQ1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMzMDcgPSBDTU9WQTE2cnINCisgIHsgMzA4LAk3LAkxLAkwLAkiQ01PVkEzMnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0NzAwMDEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjMzA4ID0gQ01PVkEzMnJtDQorICB7IDMwOSwJMywJMSwJMCwJIkNNT1ZBMzJyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NDcwMDAxMDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzMwOSA9IENNT1ZBMzJycg0KKyAgeyAzMTAsCTcsCTEsCTAsCSJDTU9WQTY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQ3MDAxMTA2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIxIH0sICAvLyBJbnN0ICMzMTAgPSBDTU9WQTY0cm0NCisgIHsgMzExLAkzLAkxLAkwLAkiQ01PVkE2NHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0NzAwMTEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMzExID0gQ01PVkE2NHJyDQorICB7IDMxMiwJNywJMSwJMCwJIkNNT1ZBRTE2cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQzMDAwMTQ2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICMzMTIgPSBDTU9WQUUxNnJtDQorICB7IDMxMywJMywJMSwJMCwJIkNNT1ZBRTE2cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQzMDAwMTQ1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMzMTMgPSBDTU9WQUUxNnJyDQorICB7IDMxNCwJNywJMSwJMCwJIkNNT1ZBRTMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQzMDAwMTA2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICMzMTQgPSBDTU9WQUUzMnJtDQorICB7IDMxNSwJMywJMSwJMCwJIkNNT1ZBRTMycnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQzMDAwMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICMzMTUgPSBDTU9WQUUzMnJyDQorICB7IDMxNiwJNywJMSwJMCwJIkNNT1ZBRTY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQzMDAxMTA2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIxIH0sICAvLyBJbnN0ICMzMTYgPSBDTU9WQUU2NHJtDQorICB7IDMxNywJMywJMSwJMCwJIkNNT1ZBRTY0cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQzMDAxMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyIH0sICAvLyBJbnN0ICMzMTcgPSBDTU9WQUU2NHJyDQorICB7IDMxOCwJNywJMSwJMCwJIkNNT1ZCMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NDIwMDAxNDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTMgfSwgIC8vIEluc3QgIzMxOCA9IENNT1ZCMTZybQ0KKyAgeyAzMTksCTMsCTEsCTAsCSJDTU9WQjE2cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQyMDAwMTQ1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMzMTkgPSBDTU9WQjE2cnINCisgIHsgMzIwLAk3LAkxLAkwLAkiQ01PVkIzMnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0MjAwMDEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjMzIwID0gQ01PVkIzMnJtDQorICB7IDMyMSwJMywJMSwJMCwJIkNNT1ZCMzJyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NDIwMDAxMDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzMyMSA9IENNT1ZCMzJycg0KKyAgeyAzMjIsCTcsCTEsCTAsCSJDTU9WQjY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQyMDAxMTA2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIxIH0sICAvLyBJbnN0ICMzMjIgPSBDTU9WQjY0cm0NCisgIHsgMzIzLAkzLAkxLAkwLAkiQ01PVkI2NHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0MjAwMTEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMzIzID0gQ01PVkI2NHJyDQorICB7IDMyNCwJNywJMSwJMCwJIkNNT1ZCRTE2cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQ2MDAwMTQ2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICMzMjQgPSBDTU9WQkUxNnJtDQorICB7IDMyNSwJMywJMSwJMCwJIkNNT1ZCRTE2cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQ2MDAwMTQ1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMzMjUgPSBDTU9WQkUxNnJyDQorICB7IDMyNiwJNywJMSwJMCwJIkNNT1ZCRTMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQ2MDAwMTA2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICMzMjYgPSBDTU9WQkUzMnJtDQorICB7IDMyNywJMywJMSwJMCwJIkNNT1ZCRTMycnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQ2MDAwMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICMzMjcgPSBDTU9WQkUzMnJyDQorICB7IDMyOCwJNywJMSwJMCwJIkNNT1ZCRTY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQ2MDAxMTA2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIxIH0sICAvLyBJbnN0ICMzMjggPSBDTU9WQkU2NHJtDQorICB7IDMyOSwJMywJMSwJMCwJIkNNT1ZCRTY0cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQ2MDAxMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyIH0sICAvLyBJbnN0ICMzMjkgPSBDTU9WQkU2NHJyDQorICB7IDMzMCwJMSwJMSwJMCwJIkNNT1ZCRV9GIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDAwMDA1MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzMzMCA9IENNT1ZCRV9GDQorICB7IDMzMSwJMywJMSwJMCwJIkNNT1ZCRV9GcDMyIiwgMCwgMHg2MDAwMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NiB9LCAgLy8gSW5zdCAjMzMxID0gQ01PVkJFX0ZwMzINCisgIHsgMzMyLAkzLAkxLAkwLAkiQ01PVkJFX0ZwNjQiLCAwLCAweDYwMDAwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzY3IH0sICAvLyBJbnN0ICMzMzIgPSBDTU9WQkVfRnA2NA0KKyAgeyAzMzMsCTMsCTEsCTAsCSJDTU9WQkVfRnA4MCIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjggfSwgIC8vIEluc3QgIzMzMyA9IENNT1ZCRV9GcDgwDQorICB7IDMzNCwJMSwJMSwJMCwJIkNNT1ZCX0YiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMDAwMDUwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMzM0ID0gQ01PVkJfRg0KKyAgeyAzMzUsCTMsCTEsCTAsCSJDTU9WQl9GcDMyIiwgMCwgMHg2MDAwMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NiB9LCAgLy8gSW5zdCAjMzM1ID0gQ01PVkJfRnAzMg0KKyAgeyAzMzYsCTMsCTEsCTAsCSJDTU9WQl9GcDY0IiwgMCwgMHg2MDAwMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NyB9LCAgLy8gSW5zdCAjMzM2ID0gQ01PVkJfRnA2NA0KKyAgeyAzMzcsCTMsCTEsCTAsCSJDTU9WQl9GcDgwIiwgMCwgMHg2MDAwMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82OCB9LCAgLy8gSW5zdCAjMzM3ID0gQ01PVkJfRnA4MA0KKyAgeyAzMzgsCTcsCTEsCTAsCSJDTU9WRTE2cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQ0MDAwMTQ2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICMzMzggPSBDTU9WRTE2cm0NCisgIHsgMzM5LAkzLAkxLAkwLAkiQ01PVkUxNnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0NDAwMDE0NVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjMzM5ID0gQ01PVkUxNnJyDQorICB7IDM0MCwJNywJMSwJMCwJIkNNT1ZFMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NDQwMDAxMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTcgfSwgIC8vIEluc3QgIzM0MCA9IENNT1ZFMzJybQ0KKyAgeyAzNDEsCTMsCTEsCTAsCSJDTU9WRTMycnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQ0MDAwMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICMzNDEgPSBDTU9WRTMycnINCisgIHsgMzQyLAk3LAkxLAkwLAkiQ01PVkU2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0NDAwMTEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjMzQyID0gQ01PVkU2NHJtDQorICB7IDM0MywJMywJMSwJMCwJIkNNT1ZFNjRyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NDQwMDExMDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzM0MyA9IENNT1ZFNjRycg0KKyAgeyAzNDQsCTEsCTEsCTAsCSJDTU9WRV9GIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzgwMDA1MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzM0NCA9IENNT1ZFX0YNCisgIHsgMzQ1LAkzLAkxLAkwLAkiQ01PVkVfRnAzMiIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjYgfSwgIC8vIEluc3QgIzM0NSA9IENNT1ZFX0ZwMzINCisgIHsgMzQ2LAkzLAkxLAkwLAkiQ01PVkVfRnA2NCIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjcgfSwgIC8vIEluc3QgIzM0NiA9IENNT1ZFX0ZwNjQNCisgIHsgMzQ3LAkzLAkxLAkwLAkiQ01PVkVfRnA4MCIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjggfSwgIC8vIEluc3QgIzM0NyA9IENNT1ZFX0ZwODANCisgIHsgMzQ4LAk3LAkxLAkwLAkiQ01PVkcxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0ZjAwMDE0NlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMyB9LCAgLy8gSW5zdCAjMzQ4ID0gQ01PVkcxNnJtDQorICB7IDM0OSwJMywJMSwJMCwJIkNNT1ZHMTZyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NGYwMDAxNDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzM0OSA9IENNT1ZHMTZycg0KKyAgeyAzNTAsCTcsCTEsCTAsCSJDTU9WRzMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDRmMDAwMTA2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICMzNTAgPSBDTU9WRzMycm0NCisgIHsgMzUxLAkzLAkxLAkwLAkiQ01PVkczMnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0ZjAwMDEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMzUxID0gQ01PVkczMnJyDQorICB7IDM1MiwJNywJMSwJMCwJIkNNT1ZHNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGYwMDExMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjEgfSwgIC8vIEluc3QgIzM1MiA9IENNT1ZHNjRybQ0KKyAgeyAzNTMsCTMsCTEsCTAsCSJDTU9WRzY0cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDRmMDAxMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyIH0sICAvLyBJbnN0ICMzNTMgPSBDTU9WRzY0cnINCisgIHsgMzU0LAk3LAkxLAkwLAkiQ01PVkdFMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGQwMDAxNDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTMgfSwgIC8vIEluc3QgIzM1NCA9IENNT1ZHRTE2cm0NCisgIHsgMzU1LAkzLAkxLAkwLAkiQ01PVkdFMTZyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NGQwMDAxNDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzM1NSA9IENNT1ZHRTE2cnINCisgIHsgMzU2LAk3LAkxLAkwLAkiQ01PVkdFMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGQwMDAxMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTcgfSwgIC8vIEluc3QgIzM1NiA9IENNT1ZHRTMycm0NCisgIHsgMzU3LAkzLAkxLAkwLAkiQ01PVkdFMzJyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NGQwMDAxMDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzM1NyA9IENNT1ZHRTMycnINCisgIHsgMzU4LAk3LAkxLAkwLAkiQ01PVkdFNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGQwMDExMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjEgfSwgIC8vIEluc3QgIzM1OCA9IENNT1ZHRTY0cm0NCisgIHsgMzU5LAkzLAkxLAkwLAkiQ01PVkdFNjRyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NGQwMDExMDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzM1OSA9IENNT1ZHRTY0cnINCisgIHsgMzYwLAk3LAkxLAkwLAkiQ01PVkwxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0YzAwMDE0NlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMyB9LCAgLy8gSW5zdCAjMzYwID0gQ01PVkwxNnJtDQorICB7IDM2MSwJMywJMSwJMCwJIkNNT1ZMMTZyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NGMwMDAxNDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzM2MSA9IENNT1ZMMTZycg0KKyAgeyAzNjIsCTcsCTEsCTAsCSJDTU9WTDMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDRjMDAwMTA2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICMzNjIgPSBDTU9WTDMycm0NCisgIHsgMzYzLAkzLAkxLAkwLAkiQ01PVkwzMnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0YzAwMDEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMzYzID0gQ01PVkwzMnJyDQorICB7IDM2NCwJNywJMSwJMCwJIkNNT1ZMNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGMwMDExMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjEgfSwgIC8vIEluc3QgIzM2NCA9IENNT1ZMNjRybQ0KKyAgeyAzNjUsCTMsCTEsCTAsCSJDTU9WTDY0cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDRjMDAxMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyIH0sICAvLyBJbnN0ICMzNjUgPSBDTU9WTDY0cnINCisgIHsgMzY2LAk3LAkxLAkwLAkiQ01PVkxFMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGUwMDAxNDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTMgfSwgIC8vIEluc3QgIzM2NiA9IENNT1ZMRTE2cm0NCisgIHsgMzY3LAkzLAkxLAkwLAkiQ01PVkxFMTZyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NGUwMDAxNDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzM2NyA9IENNT1ZMRTE2cnINCisgIHsgMzY4LAk3LAkxLAkwLAkiQ01PVkxFMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGUwMDAxMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTcgfSwgIC8vIEluc3QgIzM2OCA9IENNT1ZMRTMycm0NCisgIHsgMzY5LAkzLAkxLAkwLAkiQ01PVkxFMzJyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NGUwMDAxMDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzM2OSA9IENNT1ZMRTMycnINCisgIHsgMzcwLAk3LAkxLAkwLAkiQ01PVkxFNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGUwMDExMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjEgfSwgIC8vIEluc3QgIzM3MCA9IENNT1ZMRTY0cm0NCisgIHsgMzcxLAkzLAkxLAkwLAkiQ01PVkxFNjRyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NGUwMDExMDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzM3MSA9IENNT1ZMRTY0cnINCisgIHsgMzcyLAkxLAkxLAkwLAkiQ01PVk5CRV9GIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDAwMDA2MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzM3MiA9IENNT1ZOQkVfRg0KKyAgeyAzNzMsCTMsCTEsCTAsCSJDTU9WTkJFX0ZwMzIiLCAwLCAweDYwMDAwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzY2IH0sICAvLyBJbnN0ICMzNzMgPSBDTU9WTkJFX0ZwMzINCisgIHsgMzc0LAkzLAkxLAkwLAkiQ01PVk5CRV9GcDY0IiwgMCwgMHg2MDAwMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NyB9LCAgLy8gSW5zdCAjMzc0ID0gQ01PVk5CRV9GcDY0DQorICB7IDM3NSwJMywJMSwJMCwJIkNNT1ZOQkVfRnA4MCIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjggfSwgIC8vIEluc3QgIzM3NSA9IENNT1ZOQkVfRnA4MA0KKyAgeyAzNzYsCTEsCTEsCTAsCSJDTU9WTkJfRiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMwMDAwNjAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICMzNzYgPSBDTU9WTkJfRg0KKyAgeyAzNzcsCTMsCTEsCTAsCSJDTU9WTkJfRnAzMiIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjYgfSwgIC8vIEluc3QgIzM3NyA9IENNT1ZOQl9GcDMyDQorICB7IDM3OCwJMywJMSwJMCwJIkNNT1ZOQl9GcDY0IiwgMCwgMHg2MDAwMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NyB9LCAgLy8gSW5zdCAjMzc4ID0gQ01PVk5CX0ZwNjQNCisgIHsgMzc5LAkzLAkxLAkwLAkiQ01PVk5CX0ZwODAiLCAwLCAweDYwMDAwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzY4IH0sICAvLyBJbnN0ICMzNzkgPSBDTU9WTkJfRnA4MA0KKyAgeyAzODAsCTcsCTEsCTAsCSJDTU9WTkUxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0NTAwMDE0NlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMyB9LCAgLy8gSW5zdCAjMzgwID0gQ01PVk5FMTZybQ0KKyAgeyAzODEsCTMsCTEsCTAsCSJDTU9WTkUxNnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0NTAwMDE0NVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjMzgxID0gQ01PVk5FMTZycg0KKyAgeyAzODIsCTcsCTEsCTAsCSJDTU9WTkUzMnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0NTAwMDEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjMzgyID0gQ01PVk5FMzJybQ0KKyAgeyAzODMsCTMsCTEsCTAsCSJDTU9WTkUzMnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0NTAwMDEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMzgzID0gQ01PVk5FMzJycg0KKyAgeyAzODQsCTcsCTEsCTAsCSJDTU9WTkU2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0NTAwMTEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjMzg0ID0gQ01PVk5FNjRybQ0KKyAgeyAzODUsCTMsCTEsCTAsCSJDTU9WTkU2NHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0NTAwMTEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMzg1ID0gQ01PVk5FNjRycg0KKyAgeyAzODYsCTEsCTEsCTAsCSJDTU9WTkVfRiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGM4MDAwNjAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICMzODYgPSBDTU9WTkVfRg0KKyAgeyAzODcsCTMsCTEsCTAsCSJDTU9WTkVfRnAzMiIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjYgfSwgIC8vIEluc3QgIzM4NyA9IENNT1ZORV9GcDMyDQorICB7IDM4OCwJMywJMSwJMCwJIkNNT1ZORV9GcDY0IiwgMCwgMHg2MDAwMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NyB9LCAgLy8gSW5zdCAjMzg4ID0gQ01PVk5FX0ZwNjQNCisgIHsgMzg5LAkzLAkxLAkwLAkiQ01PVk5FX0ZwODAiLCAwLCAweDYwMDAwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzY4IH0sICAvLyBJbnN0ICMzODkgPSBDTU9WTkVfRnA4MA0KKyAgeyAzOTAsCTcsCTEsCTAsCSJDTU9WTk8xNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0MTAwMDE0NlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMyB9LCAgLy8gSW5zdCAjMzkwID0gQ01PVk5PMTZybQ0KKyAgeyAzOTEsCTMsCTEsCTAsCSJDTU9WTk8xNnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0MTAwMDE0NVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjMzkxID0gQ01PVk5PMTZycg0KKyAgeyAzOTIsCTcsCTEsCTAsCSJDTU9WTk8zMnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0MTAwMDEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjMzkyID0gQ01PVk5PMzJybQ0KKyAgeyAzOTMsCTMsCTEsCTAsCSJDTU9WTk8zMnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0MTAwMDEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMzkzID0gQ01PVk5PMzJycg0KKyAgeyAzOTQsCTcsCTEsCTAsCSJDTU9WTk82NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0MTAwMTEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjMzk0ID0gQ01PVk5PNjRybQ0KKyAgeyAzOTUsCTMsCTEsCTAsCSJDTU9WTk82NHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0MTAwMTEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMzk1ID0gQ01PVk5PNjRycg0KKyAgeyAzOTYsCTcsCTEsCTAsCSJDTU9WTlAxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0YjAwMDE0NlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMyB9LCAgLy8gSW5zdCAjMzk2ID0gQ01PVk5QMTZybQ0KKyAgeyAzOTcsCTMsCTEsCTAsCSJDTU9WTlAxNnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0YjAwMDE0NVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjMzk3ID0gQ01PVk5QMTZycg0KKyAgeyAzOTgsCTcsCTEsCTAsCSJDTU9WTlAzMnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0YjAwMDEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjMzk4ID0gQ01PVk5QMzJybQ0KKyAgeyAzOTksCTMsCTEsCTAsCSJDTU9WTlAzMnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0YjAwMDEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMzk5ID0gQ01PVk5QMzJycg0KKyAgeyA0MDAsCTcsCTEsCTAsCSJDTU9WTlA2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0YjAwMTEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjNDAwID0gQ01PVk5QNjRybQ0KKyAgeyA0MDEsCTMsCTEsCTAsCSJDTU9WTlA2NHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0YjAwMTEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjNDAxID0gQ01PVk5QNjRycg0KKyAgeyA0MDIsCTEsCTEsCTAsCSJDTU9WTlBfRiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQ4MDAwNjAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICM0MDIgPSBDTU9WTlBfRg0KKyAgeyA0MDMsCTMsCTEsCTAsCSJDTU9WTlBfRnAzMiIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjYgfSwgIC8vIEluc3QgIzQwMyA9IENNT1ZOUF9GcDMyDQorICB7IDQwNCwJMywJMSwJMCwJIkNNT1ZOUF9GcDY0IiwgMCwgMHg2MDAwMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NyB9LCAgLy8gSW5zdCAjNDA0ID0gQ01PVk5QX0ZwNjQNCisgIHsgNDA1LAkzLAkxLAkwLAkiQ01PVk5QX0ZwODAiLCAwLCAweDYwMDAwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzY4IH0sICAvLyBJbnN0ICM0MDUgPSBDTU9WTlBfRnA4MA0KKyAgeyA0MDYsCTcsCTEsCTAsCSJDTU9WTlMxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0OTAwMDE0NlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMyB9LCAgLy8gSW5zdCAjNDA2ID0gQ01PVk5TMTZybQ0KKyAgeyA0MDcsCTMsCTEsCTAsCSJDTU9WTlMxNnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0OTAwMDE0NVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjNDA3ID0gQ01PVk5TMTZycg0KKyAgeyA0MDgsCTcsCTEsCTAsCSJDTU9WTlMzMnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0OTAwMDEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjNDA4ID0gQ01PVk5TMzJybQ0KKyAgeyA0MDksCTMsCTEsCTAsCSJDTU9WTlMzMnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0OTAwMDEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjNDA5ID0gQ01PVk5TMzJycg0KKyAgeyA0MTAsCTcsCTEsCTAsCSJDTU9WTlM2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0OTAwMTEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjNDEwID0gQ01PVk5TNjRybQ0KKyAgeyA0MTEsCTMsCTEsCTAsCSJDTU9WTlM2NHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0OTAwMTEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjNDExID0gQ01PVk5TNjRycg0KKyAgeyA0MTIsCTcsCTEsCTAsCSJDTU9WTzE2cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQwMDAwMTQ2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICM0MTIgPSBDTU9WTzE2cm0NCisgIHsgNDEzLAkzLAkxLAkwLAkiQ01PVk8xNnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0MDAwMDE0NVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjNDEzID0gQ01PVk8xNnJyDQorICB7IDQxNCwJNywJMSwJMCwJIkNNT1ZPMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NDAwMDAxMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTcgfSwgIC8vIEluc3QgIzQxNCA9IENNT1ZPMzJybQ0KKyAgeyA0MTUsCTMsCTEsCTAsCSJDTU9WTzMycnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQwMDAwMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICM0MTUgPSBDTU9WTzMycnINCisgIHsgNDE2LAk3LAkxLAkwLAkiQ01PVk82NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0MDAwMTEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjNDE2ID0gQ01PVk82NHJtDQorICB7IDQxNywJMywJMSwJMCwJIkNNT1ZPNjRyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NDAwMDExMDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzQxNyA9IENNT1ZPNjRycg0KKyAgeyA0MTgsCTcsCTEsCTAsCSJDTU9WUDE2cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDRhMDAwMTQ2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICM0MTggPSBDTU9WUDE2cm0NCisgIHsgNDE5LAkzLAkxLAkwLAkiQ01PVlAxNnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0YTAwMDE0NVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjNDE5ID0gQ01PVlAxNnJyDQorICB7IDQyMCwJNywJMSwJMCwJIkNNT1ZQMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGEwMDAxMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTcgfSwgIC8vIEluc3QgIzQyMCA9IENNT1ZQMzJybQ0KKyAgeyA0MjEsCTMsCTEsCTAsCSJDTU9WUDMycnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDRhMDAwMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICM0MjEgPSBDTU9WUDMycnINCisgIHsgNDIyLAk3LAkxLAkwLAkiQ01PVlA2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0YTAwMTEwNlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjNDIyID0gQ01PVlA2NHJtDQorICB7IDQyMywJMywJMSwJMCwJIkNNT1ZQNjRyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NGEwMDExMDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzQyMyA9IENNT1ZQNjRycg0KKyAgeyA0MjQsCTEsCTEsCTAsCSJDTU9WUF9GIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDgwMDA1MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzQyNCA9IENNT1ZQX0YNCisgIHsgNDI1LAkzLAkxLAkwLAkiQ01PVlBfRnAzMiIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjYgfSwgIC8vIEluc3QgIzQyNSA9IENNT1ZQX0ZwMzINCisgIHsgNDI2LAkzLAkxLAkwLAkiQ01PVlBfRnA2NCIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjcgfSwgIC8vIEluc3QgIzQyNiA9IENNT1ZQX0ZwNjQNCisgIHsgNDI3LAkzLAkxLAkwLAkiQ01PVlBfRnA4MCIsIDAsIDB4NjAwMDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjggfSwgIC8vIEluc3QgIzQyNyA9IENNT1ZQX0ZwODANCisgIHsgNDI4LAk3LAkxLAkwLAkiQ01PVlMxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0ODAwMDE0NlVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMyB9LCAgLy8gSW5zdCAjNDI4ID0gQ01PVlMxNnJtDQorICB7IDQyOSwJMywJMSwJMCwJIkNNT1ZTMTZyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NDgwMDAxNDVVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzQyOSA9IENNT1ZTMTZycg0KKyAgeyA0MzAsCTcsCTEsCTAsCSJDTU9WUzMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQ4MDAwMTA2VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICM0MzAgPSBDTU9WUzMycm0NCisgIHsgNDMxLAkzLAkxLAkwLAkiQ01PVlMzMnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0ODAwMDEwNVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjNDMxID0gQ01PVlMzMnJyDQorICB7IDQzMiwJNywJMSwJMCwJIkNNT1ZTNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NDgwMDExMDZVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjEgfSwgIC8vIEluc3QgIzQzMiA9IENNT1ZTNjRybQ0KKyAgeyA0MzMsCTMsCTEsCTAsCSJDTU9WUzY0cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDQ4MDAxMTA1VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyIH0sICAvLyBJbnN0ICM0MzMgPSBDTU9WUzY0cnINCisgIHsgNDM0LAk0LAkxLAkwLAkiQ01PVl9GUjMyIiwgMHwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjkgfSwgIC8vIEluc3QgIzQzNCA9IENNT1ZfRlIzMg0KKyAgeyA0MzUsCTQsCTEsCTAsCSJDTU9WX0ZSNjQiLCAwfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83MCB9LCAgLy8gSW5zdCAjNDM1ID0gQ01PVl9GUjY0DQorICB7IDQzNiwJNCwJMSwJMCwJIkNNT1ZfR1IxNiIsIDB8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNzEgfSwgIC8vIEluc3QgIzQzNiA9IENNT1ZfR1IxNg0KKyAgeyA0MzcsCTQsCTEsCTAsCSJDTU9WX0dSMzIiLCAwfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzcyIH0sICAvLyBJbnN0ICM0MzcgPSBDTU9WX0dSMzINCisgIHsgNDM4LAk0LAkxLAkwLAkiQ01PVl9HUjgiLCAwfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzczIH0sICAvLyBJbnN0ICM0MzggPSBDTU9WX0dSOA0KKyAgeyA0MzksCTQsCTEsCTAsCSJDTU9WX1JGUDMyIiwgMHwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm83NCB9LCAgLy8gSW5zdCAjNDM5ID0gQ01PVl9SRlAzMg0KKyAgeyA0NDAsCTQsCTEsCTAsCSJDTU9WX1JGUDY0IiwgMHwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm83NSB9LCAgLy8gSW5zdCAjNDQwID0gQ01PVl9SRlA2NA0KKyAgeyA0NDEsCTQsCTEsCTAsCSJDTU9WX1JGUDgwIiwgMHwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm83NiB9LCAgLy8gSW5zdCAjNDQxID0gQ01PVl9SRlA4MA0KKyAgeyA0NDIsCTQsCTEsCTAsCSJDTU9WX1YxSTY0IiwgMHwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNzcgfSwgIC8vIEluc3QgIzQ0MiA9IENNT1ZfVjFJNjQNCisgIHsgNDQzLAk0LAkxLAkwLAkiQ01PVl9WMkY2NCIsIDB8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICM0NDMgPSBDTU9WX1YyRjY0DQorICB7IDQ0NCwJNCwJMSwJMCwJIkNNT1ZfVjJJNjQiLCAwfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjNDQ0ID0gQ01PVl9WMkk2NA0KKyAgeyA0NDUsCTQsCTEsCTAsCSJDTU9WX1Y0RjMyIiwgMHwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNzggfSwgIC8vIEluc3QgIzQ0NSA9IENNT1ZfVjRGMzINCisgIHsgNDQ2LAkxLAkwLAkwLAkiQ01QMTZpMTYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzZDAwNjA0MVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzQ0NiA9IENNUDE2aTE2DQorICB7IDQ0NywJNiwJMCwJMCwJIkNNUDE2bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDgxMDA2MDVmVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzQ0NyA9IENNUDE2bWkNCisgIHsgNDQ4LAk2LAkwLAkwLAkiQ01QMTZtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDgzMDAyMDVmVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzQ0OCA9IENNUDE2bWk4DQorICB7IDQ0OSwJNiwJMCwJMCwJIkNNUDE2bXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDM5MDAwMDQ0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTEgfSwgIC8vIEluc3QgIzQ0OSA9IENNUDE2bXINCisgIHsgNDUwLAkyLAkwLAkwLAkiQ01QMTZyaSIsIDAsIDB4ODEwMDYwNTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MSB9LCAgLy8gSW5zdCAjNDUwID0gQ01QMTZyaQ0KKyAgeyA0NTEsCTIsCTAsCTAsCSJDTVAxNnJpOCIsIDAsIDB4ODMwMDIwNTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MSB9LCAgLy8gSW5zdCAjNDUxID0gQ01QMTZyaTgNCisgIHsgNDUyLAk2LAkwLAkwLAkiQ01QMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4M2IwMDAwNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81MyB9LCAgLy8gSW5zdCAjNDUyID0gQ01QMTZybQ0KKyAgeyA0NTMsCTIsCTAsCTAsCSJDTVAxNnJyIiwgMCwgMHgzOTAwMDA0M1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU0IH0sICAvLyBJbnN0ICM0NTMgPSBDTVAxNnJyDQorICB7IDQ1NCwJMiwJMCwJMCwJIkNNUDE2cnJfYWx0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4M2IwMDAwNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NCB9LCAgLy8gSW5zdCAjNDU0ID0gQ01QMTZycl9hbHQNCisgIHsgNDU1LAkxLAkwLAkwLAkiQ01QMzJpMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzZDAwYTAwMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzQ1NSA9IENNUDMyaTMyDQorICB7IDQ1NiwJNiwJMCwJMCwJIkNNUDMybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDgxMDBhMDFmVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzQ1NiA9IENNUDMybWkNCisgIHsgNDU3LAk2LAkwLAkwLAkiQ01QMzJtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDgzMDAyMDFmVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzQ1NyA9IENNUDMybWk4DQorICB7IDQ1OCwJNiwJMCwJMCwJIkNNUDMybXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDM5MDAwMDA0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTUgfSwgIC8vIEluc3QgIzQ1OCA9IENNUDMybXINCisgIHsgNDU5LAkyLAkwLAkwLAkiQ01QMzJyaSIsIDAsIDB4ODEwMGEwMTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MiB9LCAgLy8gSW5zdCAjNDU5ID0gQ01QMzJyaQ0KKyAgeyA0NjAsCTIsCTAsCTAsCSJDTVAzMnJpOCIsIDAsIDB4ODMwMDIwMTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MiB9LCAgLy8gSW5zdCAjNDYwID0gQ01QMzJyaTgNCisgIHsgNDYxLAk2LAkwLAkwLAkiQ01QMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4M2IwMDAwMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NSB9LCAgLy8gSW5zdCAjNDYxID0gQ01QMzJybQ0KKyAgeyA0NjIsCTIsCTAsCTAsCSJDTVAzMnJyIiwgMCwgMHgzOTAwMDAwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU2IH0sICAvLyBJbnN0ICM0NjIgPSBDTVAzMnJyDQorICB7IDQ2MywJMiwJMCwJMCwJIkNNUDMycnJfYWx0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4M2IwMDAwMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NiB9LCAgLy8gSW5zdCAjNDYzID0gQ01QMzJycl9hbHQNCisgIHsgNDY0LAkxLAkwLAkwLAkiQ01QNjRpMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzZDAwYjAwMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzQ2NCA9IENNUDY0aTMyDQorICB7IDQ2NSwJNiwJMCwJMCwJIkNNUDY0bWkzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ODEwMGIwMWZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjNDY1ID0gQ01QNjRtaTMyDQorICB7IDQ2NiwJNiwJMCwJMCwJIkNNUDY0bWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg4MzAwMzAxZlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICM0NjYgPSBDTVA2NG1pOA0KKyAgeyA0NjcsCTYsCTAsCTAsCSJDTVA2NG1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzOTAwMTAwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE5IH0sICAvLyBJbnN0ICM0NjcgPSBDTVA2NG1yDQorICB7IDQ2OCwJMiwJMCwJMCwJIkNNUDY0bXJtcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzYjAwMTAwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICM0NjggPSBDTVA2NG1ybXJyDQorICB7IDQ2OSwJMiwJMCwJMCwJIkNNUDY0cmkzMiIsIDAsIDB4ODEwMGIwMTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MyB9LCAgLy8gSW5zdCAjNDY5ID0gQ01QNjRyaTMyDQorICB7IDQ3MCwJMiwJMCwJMCwJIkNNUDY0cmk4IiwgMCwgMHg4MzAwMzAxN1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYzIH0sICAvLyBJbnN0ICM0NzAgPSBDTVA2NHJpOA0KKyAgeyA0NzEsCTYsCTAsCTAsCSJDTVA2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzYjAwMTAwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICM0NzEgPSBDTVA2NHJtDQorICB7IDQ3MiwJMiwJMCwJMCwJIkNNUDY0cnIiLCAwLCAweDM5MDAxMDAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTggfSwgIC8vIEluc3QgIzQ3MiA9IENNUDY0cnINCisgIHsgNDczLAkxLAkwLAkwLAkiQ01QOGk4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4M2MwMDIwMDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICM0NzMgPSBDTVA4aTgNCisgIHsgNDc0LAk2LAkwLAkwLAkiQ01QOG1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg4MDAwMjAxZlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICM0NzQgPSBDTVA4bWkNCisgIHsgNDc1LAk2LAkwLAkwLAkiQ01QOG1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzODAwMDAwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI0IH0sICAvLyBJbnN0ICM0NzUgPSBDTVA4bXINCisgIHsgNDc2LAkyLAkwLAkwLAkiQ01QOHJpIiwgMCwgMHg4MDAwMjAxN1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzc5IH0sICAvLyBJbnN0ICM0NzYgPSBDTVA4cmkNCisgIHsgNDc3LAk2LAkwLAkwLAkiQ01QOHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzYTAwMDAwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzgwIH0sICAvLyBJbnN0ICM0NzcgPSBDTVA4cm0NCisgIHsgNDc4LAkyLAkwLAkwLAkiQ01QOHJyIiwgMCwgMHgzODAwMDAwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzgxIH0sICAvLyBJbnN0ICM0NzggPSBDTVA4cnINCisgIHsgNDc5LAkyLAkwLAkwLAkiQ01QOHJyX2FsdCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDNhMDAwMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvODEgfSwgIC8vIEluc3QgIzQ3OSA9IENNUDhycl9hbHQNCisgIHsgNDgwLAk4LAkxLAkwLAkiQ01QUERybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGMyODAyMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUxIH0sICAvLyBJbnN0ICM0ODAgPSBDTVBQRHJtaQ0KKyAgeyA0ODEsCTgsCTEsCTAsCSJDTVBQRHJtaV9hbHQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMjgwMjE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MSB9LCAgLy8gSW5zdCAjNDgxID0gQ01QUERybWlfYWx0DQorICB7IDQ4MiwJNCwJMSwJMCwJIkNNUFBEcnJpIiwgMCwgMHhjMjgwMjE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MiB9LCAgLy8gSW5zdCAjNDgyID0gQ01QUERycmkNCisgIHsgNDgzLAk0LAkxLAkwLAkiQ01QUERycmlfYWx0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzI4MDIxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTIgfSwgIC8vIEluc3QgIzQ4MyA9IENNUFBEcnJpX2FsdA0KKyAgeyA0ODQsCTgsCTEsCTAsCSJDTVBQU3JtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YzI0MDIxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTEgfSwgIC8vIEluc3QgIzQ4NCA9IENNUFBTcm1pDQorICB7IDQ4NSwJOCwJMSwJMCwJIkNNUFBTcm1pX2FsdCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMyNDAyMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUxIH0sICAvLyBJbnN0ICM0ODUgPSBDTVBQU3JtaV9hbHQNCisgIHsgNDg2LAk0LAkxLAkwLAkiQ01QUFNycmkiLCAwLCAweGMyNDAyMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUyIH0sICAvLyBJbnN0ICM0ODYgPSBDTVBQU3JyaQ0KKyAgeyA0ODcsCTQsCTEsCTAsCSJDTVBQU3JyaV9hbHQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMjQwMjEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MiB9LCAgLy8gSW5zdCAjNDg3ID0gQ01QUFNycmlfYWx0DQorICB7IDQ4OCwJMCwJMCwJMCwJIkNNUFMxNiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGE3MDAwMDQxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM0ODggPSBDTVBTMTYNCisgIHsgNDg5LAkwLAkwLAkwLAkiQ01QUzMyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTcwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzQ4OSA9IENNUFMzMg0KKyAgeyA0OTAsCTAsCTAsCTAsCSJDTVBTNjQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhNzAwMTAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNDkwID0gQ01QUzY0DQorICB7IDQ5MSwJMCwJMCwJMCwJIkNNUFM4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTYwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzQ5MSA9IENNUFM4DQorICB7IDQ5MiwJOCwJMSwJMCwJIkNNUFNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGMyMDAyYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzgyIH0sICAvLyBJbnN0ICM0OTIgPSBDTVBTRHJtDQorICB7IDQ5MywJOCwJMSwJMCwJIkNNUFNEcm1fYWx0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhjMjAwMmIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84MiB9LCAgLy8gSW5zdCAjNDkzID0gQ01QU0RybV9hbHQNCisgIHsgNDk0LAk0LAkxLAkwLAkiQ01QU0RyciIsIDAsIDB4YzIwMDJiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODMgfSwgIC8vIEluc3QgIzQ5NCA9IENNUFNEcnINCisgIHsgNDk1LAk0LAkxLAkwLAkiQ01QU0Rycl9hbHQiLCAwLCAweGMyMDAyYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzgzIH0sICAvLyBJbnN0ICM0OTUgPSBDTVBTRHJyX2FsdA0KKyAgeyA0OTYsCTgsCTEsCTAsCSJDTVBTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhjMjAwMmMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84NCB9LCAgLy8gSW5zdCAjNDk2ID0gQ01QU1NybQ0KKyAgeyA0OTcsCTgsCTEsCTAsCSJDTVBTU3JtX2FsdCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YzIwMDJjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODQgfSwgIC8vIEluc3QgIzQ5NyA9IENNUFNTcm1fYWx0DQorICB7IDQ5OCwJNCwJMSwJMCwJIkNNUFNTcnIiLCAwLCAweGMyMDAyYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzg1IH0sICAvLyBJbnN0ICM0OTggPSBDTVBTU3JyDQorICB7IDQ5OSwJNCwJMSwJMCwJIkNNUFNTcnJfYWx0IiwgMCwgMHhjMjAwMmMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84NSB9LCAgLy8gSW5zdCAjNDk5ID0gQ01QU1Nycl9hbHQNCisgIHsgNTAwLAk1LAkwLAkwLAkiQ01QWENIRzE2QiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGM3MDAxMTE5VUxMLCBJbXBsaWNpdExpc3QxNiwgSW1wbGljaXRMaXN0MTcsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNTAwID0gQ01QWENIRzE2Qg0KKyAgeyA1MDEsCTYsCTAsCTAsCSJDTVBYQ0hHMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiMTAwMDE0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjNTAxID0gQ01QWENIRzE2cm0NCisgIHsgNTAyLAkyLAkxLAkwLAkiQ01QWENIRzE2cnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiMTAwMDE0M1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NCB9LCAgLy8gSW5zdCAjNTAyID0gQ01QWENIRzE2cnINCisgIHsgNTAzLAk2LAkwLAkwLAkiQ01QWENIRzMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjEwMDAxMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUgfSwgIC8vIEluc3QgIzUwMyA9IENNUFhDSEczMnJtDQorICB7IDUwNCwJMiwJMSwJMCwJIkNNUFhDSEczMnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjEwMDAxMDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTYgfSwgIC8vIEluc3QgIzUwNCA9IENNUFhDSEczMnJyDQorICB7IDUwNSwJNiwJMCwJMCwJIkNNUFhDSEc2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGIxMDAxMTA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE5IH0sICAvLyBJbnN0ICM1MDUgPSBDTVBYQ0hHNjRybQ0KKyAgeyA1MDYsCTIsCTEsCTAsCSJDTVBYQ0hHNjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGIxMDAxMTAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICM1MDYgPSBDTVBYQ0hHNjRycg0KKyAgeyA1MDcsCTUsCTAsCTAsCSJDTVBYQ0hHOEIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjNzAwMDExOVVMTCwgSW1wbGljaXRMaXN0NiwgSW1wbGljaXRMaXN0MTgsIEJhcnJpZXJzNiwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNTA3ID0gQ01QWENIRzhCDQorICB7IDUwOCwJNiwJMCwJMCwJIkNNUFhDSEc4cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjAwMDAxMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjQgfSwgIC8vIEluc3QgIzUwOCA9IENNUFhDSEc4cm0NCisgIHsgNTA5LAkyLAkxLAkwLAkiQ01QWENIRzhyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGIwMDAwMTAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzgxIH0sICAvLyBJbnN0ICM1MDkgPSBDTVBYQ0hHOHJyDQorICB7IDUxMCwJNiwJMCwJMCwJIkNPTUlTRHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MmY4MDAxNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjNTEwID0gQ09NSVNEcm0NCisgIHsgNTExLAkyLAkwLAkwLAkiQ09NSVNEcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyZjgwMDE0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM1MTEgPSBDT01JU0Rycg0KKyAgeyA1MTIsCTYsCTAsCTAsCSJDT01JU1NybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDJmNDAwMTA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzUxMiA9IENPTUlTU3JtDQorICB7IDUxMywJMiwJMCwJMCwJIkNPTUlTU3JyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MmY0MDAxMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjNTEzID0gQ09NSVNTcnINCisgIHsgNTE0LAkxLAkwLAkwLAkiQ09NUF9GU1QwciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQ4MDAwMzAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICM1MTQgPSBDT01QX0ZTVDByDQorICB7IDUxNSwJMSwJMCwJMCwJIkNPTV9GSVByIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjAwMDBhMDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzUxNSA9IENPTV9GSVByDQorICB7IDUxNiwJMSwJMCwJMCwJIkNPTV9GSXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmMDAwMDYwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjNTE2ID0gQ09NX0ZJcg0KKyAgeyA1MTcsCTEsCTAsCTAsCSJDT01fRlNUMHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMDAwMDMwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjNTE3ID0gQ09NX0ZTVDByDQorICB7IDUxOCwJMCwJMCwJMCwJIkNPU19GIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmYwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzUxOCA9IENPU19GDQorICB7IDUxOSwJMiwJMSwJMCwJIkNPU19GcDMyIiwgMCwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83IH0sICAvLyBJbnN0ICM1MTkgPSBDT1NfRnAzMg0KKyAgeyA1MjAsCTIsCTEsCTAsCSJDT1NfRnA2NCIsIDAsIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOCB9LCAgLy8gSW5zdCAjNTIwID0gQ09TX0ZwNjQNCisgIHsgNTIxLAkyLAkxLAkwLAkiQ09TX0ZwODAiLCAwLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkgfSwgIC8vIEluc3QgIzUyMSA9IENPU19GcDgwDQorICB7IDUyMiwJMCwJMCwJMCwJIkNQVUlEIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTIwMDAxMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzUyMiA9IENQVUlEDQorICB7IDUyMywJMCwJMCwJMCwJIkNRTyIsIDAsIDB4OTkwMDEwMDFVTEwsIEltcGxpY2l0TGlzdDE1LCBJbXBsaWNpdExpc3QxOSwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNTIzID0gQ1FPDQorICB7IDUyNCwJNywJMSwJMCwJIkNSQzMybTE2IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmMTAwMGY0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjNTI0ID0gQ1JDMzJtMTYNCisgIHsgNTI1LAk3LAkxLAkwLAkiQ1JDMzJtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGYxMDAwZjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICM1MjUgPSBDUkMzMm0zMg0KKyAgeyA1MjYsCTcsCTEsCTAsCSJDUkMzMm04IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmMDAwMGYwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjNTI2ID0gQ1JDMzJtOA0KKyAgeyA1MjcsCTMsCTEsCTAsCSJDUkMzMnIxNiIsIDAsIDB4ZjEwMDBmNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODYgfSwgIC8vIEluc3QgIzUyNyA9IENSQzMycjE2DQorICB7IDUyOCwJMywJMSwJMCwJIkNSQzMycjMyIiwgMCwgMHhmMTAwMGYwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjNTI4ID0gQ1JDMzJyMzINCisgIHsgNTI5LAkzLAkxLAkwLAkiQ1JDMzJyOCIsIDAsIDB4ZjAwMDBmMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODcgfSwgIC8vIEluc3QgIzUyOSA9IENSQzMycjgNCisgIHsgNTMwLAk3LAkxLAkwLAkiQ1JDNjRtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGYxMDAxZjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIxIH0sICAvLyBJbnN0ICM1MzAgPSBDUkM2NG02NA0KKyAgeyA1MzEsCTcsCTEsCTAsCSJDUkM2NG04IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmMDAwMWYwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjNTMxID0gQ1JDNjRtOA0KKyAgeyA1MzIsCTMsCTEsCTAsCSJDUkM2NHI2NCIsIDAsIDB4ZjEwMDFmMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzUzMiA9IENSQzY0cjY0DQorICB7IDUzMywJMywJMSwJMCwJIkNSQzY0cjgiLCAwLCAweGYwMDAxZjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzg4IH0sICAvLyBJbnN0ICM1MzMgPSBDUkM2NHI4DQorICB7IDUzNCwJMCwJMCwJMCwJIkNTX1BSRUZJWCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDJlMDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM1MzQgPSBDU19QUkVGSVgNCisgIHsgNTM1LAk2LAkxLAkwLAkiQ1ZURFEyUERybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGU2NDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM1MzUgPSBDVlREUTJQRHJtDQorICB7IDUzNiwJMiwJMSwJMCwJIkNWVERRMlBEcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlNjQwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjNTM2ID0gQ1ZURFEyUERycg0KKyAgeyA1MzcsCTYsCTEsCTAsCSJDVlREUTJQU3JtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWI0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzUzNyA9IENWVERRMlBTcm0NCisgIHsgNTM4LAkyLAkxLAkwLAkiQ1ZURFEyUFNyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM1MzggPSBDVlREUTJQU3JyDQorICB7IDUzOSwJNiwJMSwJMCwJIkNWVFBEMkRRcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlNjgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjNTM5ID0gQ1ZUUEQyRFFybQ0KKyAgeyA1NDAsCTIsCTEsCTAsCSJDVlRQRDJEUXJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTY4MDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzU0MCA9IENWVFBEMkRRcnINCisgIHsgNTQxLAk2LAkxLAkwLAkiQ1ZUUEQyUFNybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM1NDEgPSBDVlRQRDJQU3JtDQorICB7IDU0MiwJMiwJMSwJMCwJIkNWVFBEMlBTcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1YTgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjNTQyID0gQ1ZUUEQyUFNycg0KKyAgeyA1NDMsCTYsCTEsCTAsCSJDVlRQUzJEUXJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWI4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzU0MyA9IENWVFBTMkRRcm0NCisgIHsgNTQ0LAkyLAkxLAkwLAkiQ1ZUUFMyRFFyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM1NDQgPSBDVlRQUzJEUXJyDQorICB7IDU0NSwJNiwJMSwJMCwJIkNWVFBTMlBEcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1YTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjNTQ1ID0gQ1ZUUFMyUERybQ0KKyAgeyA1NDYsCTIsCTEsCTAsCSJDVlRQUzJQRHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWEwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzU0NiA9IENWVFBTMlBEcnINCisgIHsgNTQ3LAk2LAkxLAkwLAkiQ1ZUU0QyU0k2NHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MmQwMDFiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzU0NyA9IENWVFNEMlNJNjRybQ0KKyAgeyA1NDgsCTIsCTEsCTAsCSJDVlRTRDJTSTY0cnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyZDAwMWIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84OSB9LCAgLy8gSW5zdCAjNTQ4ID0gQ1ZUU0QyU0k2NHJyDQorICB7IDU0OSwJNiwJMSwJMCwJIkNWVFNEMlNTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVhMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkwIH0sICAvLyBJbnN0ICM1NDkgPSBDVlRTRDJTU3JtDQorICB7IDU1MCwJMiwJMSwJMCwJIkNWVFNEMlNTcnIiLCAwLCAweDVhMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkxIH0sICAvLyBJbnN0ICM1NTAgPSBDVlRTRDJTU3JyDQorICB7IDU1MSwJNiwJMSwJMCwJIkNWVFNJMlNENjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmEwMDFiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOTIgfSwgIC8vIEluc3QgIzU1MSA9IENWVFNJMlNENjRybQ0KKyAgeyA1NTIsCTIsCTEsCTAsCSJDVlRTSTJTRDY0cnIiLCAwLCAweDJhMDAxYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkzIH0sICAvLyBJbnN0ICM1NTIgPSBDVlRTSTJTRDY0cnINCisgIHsgNTUzLAk2LAkxLAkwLAkiQ1ZUU0kyU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmEwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOTIgfSwgIC8vIEluc3QgIzU1MyA9IENWVFNJMlNEcm0NCisgIHsgNTU0LAkyLAkxLAkwLAkiQ1ZUU0kyU0RyciIsIDAsIDB4MmEwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOTQgfSwgIC8vIEluc3QgIzU1NCA9IENWVFNJMlNEcnINCisgIHsgNTU1LAk2LAkxLAkwLAkiQ1ZUU0kyU1M2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYTAwMWMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85MCB9LCAgLy8gSW5zdCAjNTU1ID0gQ1ZUU0kyU1M2NHJtDQorICB7IDU1NiwJMiwJMSwJMCwJIkNWVFNJMlNTNjRyciIsIDAsIDB4MmEwMDFjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOTUgfSwgIC8vIEluc3QgIzU1NiA9IENWVFNJMlNTNjRycg0KKyAgeyA1NTcsCTYsCTEsCTAsCSJDVlRTSTJTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYTAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85MCB9LCAgLy8gSW5zdCAjNTU3ID0gQ1ZUU0kyU1NybQ0KKyAgeyA1NTgsCTIsCTEsCTAsCSJDVlRTSTJTU3JyIiwgMCwgMHgyYTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85NiB9LCAgLy8gSW5zdCAjNTU4ID0gQ1ZUU0kyU1Nycg0KKyAgeyA1NTksCTYsCTEsCTAsCSJDVlRTUzJTRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YTAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85MiB9LCAgLy8gSW5zdCAjNTU5ID0gQ1ZUU1MyU0RybQ0KKyAgeyA1NjAsCTIsCTEsCTAsCSJDVlRTUzJTRHJyIiwgMCwgMHg1YTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85NyB9LCAgLy8gSW5zdCAjNTYwID0gQ1ZUU1MyU0Rycg0KKyAgeyA1NjEsCTYsCTEsCTAsCSJDVlRTUzJTSTY0cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyZDAwMWMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjNTYxID0gQ1ZUU1MyU0k2NHJtDQorICB7IDU2MiwJMiwJMSwJMCwJIkNWVFNTMlNJNjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDJkMDAxYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzk4IH0sICAvLyBJbnN0ICM1NjIgPSBDVlRTUzJTSTY0cnINCisgIHsgNTYzLAk2LAkxLAkwLAkiQ1ZUU1MyU0lybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDJkMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICM1NjMgPSBDVlRTUzJTSXJtDQorICB7IDU2NCwJMiwJMSwJMCwJIkNWVFNTMlNJcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyZDAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85OSB9LCAgLy8gSW5zdCAjNTY0ID0gQ1ZUU1MyU0lycg0KKyAgeyA1NjUsCTYsCTEsCTAsCSJDVlRUUFMyRFFybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM1NjUgPSBDVlRUUFMyRFFybQ0KKyAgeyA1NjYsCTIsCTEsCTAsCSJDVlRUUFMyRFFyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM1NjYgPSBDVlRUUFMyRFFycg0KKyAgeyA1NjcsCTYsCTEsCTAsCSJDVlRUU0QyU0k2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYzAwMWIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjNTY3ID0gQ1ZUVFNEMlNJNjRybQ0KKyAgeyA1NjgsCTIsCTEsCTAsCSJDVlRUU0QyU0k2NHJyIiwgMCwgMHgyYzAwMWIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDAgfSwgIC8vIEluc3QgIzU2OCA9IENWVFRTRDJTSTY0cnINCisgIHsgNTY5LAk2LAkxLAkwLAkiQ1ZUVFNEMlNJcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJjMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICM1NjkgPSBDVlRUU0QyU0lybQ0KKyAgeyA1NzAsCTIsCTEsCTAsCSJDVlRUU0QyU0lyciIsIDAsIDB4MmMwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTAxIH0sICAvLyBJbnN0ICM1NzAgPSBDVlRUU0QyU0lycg0KKyAgeyA1NzEsCTYsCTEsCTAsCSJDVlRUU1MyU0k2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYzAwMWMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjNTcxID0gQ1ZUVFNTMlNJNjRybQ0KKyAgeyA1NzIsCTIsCTEsCTAsCSJDVlRUU1MyU0k2NHJyIiwgMCwgMHgyYzAwMWMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85OCB9LCAgLy8gSW5zdCAjNTcyID0gQ1ZUVFNTMlNJNjRycg0KKyAgeyA1NzMsCTYsCTEsCTAsCSJDVlRUU1MyU0lybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmMwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzU3MyA9IENWVFRTUzJTSXJtDQorICB7IDU3NCwJMiwJMSwJMCwJIkNWVFRTUzJTSXJyIiwgMCwgMHgyYzAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85OSB9LCAgLy8gSW5zdCAjNTc0ID0gQ1ZUVFNTMlNJcnINCisgIHsgNTc1LAkwLAkwLAkwLAkiQ1dEIiwgMCwgMHg5OTAwMDA0MVVMTCwgSW1wbGljaXRMaXN0MTIsIEltcGxpY2l0TGlzdDIwLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM1NzUgPSBDV0QNCisgIHsgNTc2LAkwLAkwLAkwLAkiQ1dERSIsIDAsIDB4OTgwMDAwMDFVTEwsIEltcGxpY2l0TGlzdDEyLCBJbXBsaWNpdExpc3QxMywgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNTc2ID0gQ1dERQ0KKyAgeyA1NzcsCTUsCTAsCTAsCSJERUMxNm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmZjAwMDA1OVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM1NzcgPSBERUMxNm0NCisgIHsgNTc4LAkyLAkxLAkwLAkiREVDMTZyIiwgMHwoMTw8VElEOjpDb252ZXJ0aWJsZVRvM0FkZHIpLCAweDQ4MDAwMDQyVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAyIH0sICAvLyBJbnN0ICM1NzggPSBERUMxNnINCisgIHsgNTc5LAk1LAkwLAkwLAkiREVDMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZmYwMDAwMTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNTc5ID0gREVDMzJtDQorICB7IDU4MCwJMiwJMSwJMCwJIkRFQzMyciIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKSwgMHg0ODAwMDAwMlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICM1ODAgPSBERUMzMnINCisgIHsgNTgxLAk1LAkwLAkwLAkiREVDNjRfMTZtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZmYwMDAwNTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNTgxID0gREVDNjRfMTZtDQorICB7IDU4MiwJMiwJMSwJMCwJIkRFQzY0XzE2ciIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKSwgMHhmZjAwMDA1MVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMiB9LCAgLy8gSW5zdCAjNTgyID0gREVDNjRfMTZyDQorICB7IDU4MywJNSwJMCwJMCwJIkRFQzY0XzMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGZmMDAwMDE5VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzU4MyA9IERFQzY0XzMybQ0KKyAgeyA1ODQsCTIsCTEsCTAsCSJERUM2NF8zMnIiLCAwfCgxPDxUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkciksIDB4ZmYwMDAwMTFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81OSB9LCAgLy8gSW5zdCAjNTg0ID0gREVDNjRfMzJyDQorICB7IDU4NSwJNSwJMCwJMCwJIkRFQzY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGZmMDAxMDE5VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzU4NSA9IERFQzY0bQ0KKyAgeyA1ODYsCTIsCTEsCTAsCSJERUM2NHIiLCAwfCgxPDxUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkciksIDB4ZmYwMDEwMTFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MCB9LCAgLy8gSW5zdCAjNTg2ID0gREVDNjRyDQorICB7IDU4NywJNSwJMCwJMCwJIkRFQzhtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZmUwMDAwMTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNTg3ID0gREVDOG0NCisgIHsgNTg4LAkyLAkxLAkwLAkiREVDOHIiLCAwLCAweGZlMDAwMDExVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAzIH0sICAvLyBJbnN0ICM1ODggPSBERUM4cg0KKyAgeyA1ODksCTUsCTAsCTAsCSJESVYxNm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNzAwMDA1ZVVMTCwgSW1wbGljaXRMaXN0MjAsIEltcGxpY2l0TGlzdDIxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzU4OSA9IERJVjE2bQ0KKyAgeyA1OTAsCTEsCTAsCTAsCSJESVYxNnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNzAwMDA1NlVMTCwgSW1wbGljaXRMaXN0MjAsIEltcGxpY2l0TGlzdDIxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTA0IH0sICAvLyBJbnN0ICM1OTAgPSBESVYxNnINCisgIHsgNTkxLAk1LAkwLAkwLAkiRElWMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjcwMDAwMWVVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3QxOCwgQmFycmllcnM2LCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM1OTEgPSBESVYzMm0NCisgIHsgNTkyLAkxLAkwLAkwLAkiRElWMzJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjcwMDAwMTZVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3QxOCwgQmFycmllcnM2LCBPcGVyYW5kSW5mbzY0IH0sICAvLyBJbnN0ICM1OTIgPSBESVYzMnINCisgIHsgNTkzLAk1LAkwLAkwLAkiRElWNjRtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjcwMDEwMWVVTEwsIEltcGxpY2l0TGlzdDE5LCBJbXBsaWNpdExpc3QxNywgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM1OTMgPSBESVY2NG0NCisgIHsgNTk0LAkxLAkwLAkwLAkiRElWNjRyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjcwMDEwMTZVTEwsIEltcGxpY2l0TGlzdDE5LCBJbXBsaWNpdExpc3QxNywgQmFycmllcnMxLCBPcGVyYW5kSW5mbzY1IH0sICAvLyBJbnN0ICM1OTQgPSBESVY2NHINCisgIHsgNTk1LAk1LAkwLAkwLAkiRElWOG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNjAwMDAxZVVMTCwgSW1wbGljaXRMaXN0MTIsIEltcGxpY2l0TGlzdDIyLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzU5NSA9IERJVjhtDQorICB7IDU5NiwJMSwJMCwJMCwJIkRJVjhyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjYwMDAwMTZVTEwsIEltcGxpY2l0TGlzdDEyLCBJbXBsaWNpdExpc3QyMiwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwNSB9LCAgLy8gSW5zdCAjNTk2ID0gRElWOHINCisgIHsgNTk3LAk3LAkxLAkwLAkiRElWUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWU4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzU5NyA9IERJVlBEcm0NCisgIHsgNTk4LAkzLAkxLAkwLAkiRElWUERyciIsIDAsIDB4NWU4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzU5OCA9IERJVlBEcnINCisgIHsgNTk5LAk3LAkxLAkwLAkiRElWUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWU0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzU5OSA9IERJVlBTcm0NCisgIHsgNjAwLAkzLAkxLAkwLAkiRElWUFNyciIsIDAsIDB4NWU0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzYwMCA9IERJVlBTcnINCisgIHsgNjAxLAk1LAkwLAkwLAkiRElWUl9GMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDgwMDAwMWZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzYwMSA9IERJVlJfRjMybQ0KKyAgeyA2MDIsCTUsCTAsCTAsCSJESVZSX0Y2NG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkYzAwMDAxZlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjAyID0gRElWUl9GNjRtDQorICB7IDYwMywJNSwJMCwJMCwJIkRJVlJfRkkxNm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkZTAwMDAxZlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjAzID0gRElWUl9GSTE2bQ0KKyAgeyA2MDQsCTUsCTAsCTAsCSJESVZSX0ZJMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGEwMDAwMWZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzYwNCA9IERJVlJfRkkzMm0NCisgIHsgNjA1LAkxLAkwLAkwLAkiRElWUl9GUHJTVDAiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmMDAwMDkwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjNjA1ID0gRElWUl9GUHJTVDANCisgIHsgNjA2LAkxLAkwLAkwLAkiRElWUl9GU1QwciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGY4MDAwMzAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICM2MDYgPSBESVZSX0ZTVDByDQorICB7IDYwNywJNywJMSwJMCwJIkRJVlJfRnAzMm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM3IH0sICAvLyBJbnN0ICM2MDcgPSBESVZSX0ZwMzJtDQorICB7IDYwOCwJNywJMSwJMCwJIkRJVlJfRnA2NG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICM2MDggPSBESVZSX0ZwNjRtDQorICB7IDYwOSwJNywJMSwJMCwJIkRJVlJfRnA2NG0zMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzkgfSwgIC8vIEluc3QgIzYwOSA9IERJVlJfRnA2NG0zMg0KKyAgeyA2MTAsCTcsCTEsCTAsCSJESVZSX0ZwODBtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICM2MTAgPSBESVZSX0ZwODBtMzINCisgIHsgNjExLAk3LAkxLAkwLAkiRElWUl9GcDgwbTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MSB9LCAgLy8gSW5zdCAjNjExID0gRElWUl9GcDgwbTY0DQorICB7IDYxMiwJNywJMSwJMCwJIkRJVlJfRnBJMTZtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM3IH0sICAvLyBJbnN0ICM2MTIgPSBESVZSX0ZwSTE2bTMyDQorICB7IDYxMywJNywJMSwJMCwJIkRJVlJfRnBJMTZtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICM2MTMgPSBESVZSX0ZwSTE2bTY0DQorICB7IDYxNCwJNywJMSwJMCwJIkRJVlJfRnBJMTZtODAiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICM2MTQgPSBESVZSX0ZwSTE2bTgwDQorICB7IDYxNSwJNywJMSwJMCwJIkRJVlJfRnBJMzJtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM3IH0sICAvLyBJbnN0ICM2MTUgPSBESVZSX0ZwSTMybTMyDQorICB7IDYxNiwJNywJMSwJMCwJIkRJVlJfRnBJMzJtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICM2MTYgPSBESVZSX0ZwSTMybTY0DQorICB7IDYxNywJNywJMSwJMCwJIkRJVlJfRnBJMzJtODAiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICM2MTcgPSBESVZSX0ZwSTMybTgwDQorICB7IDYxOCwJMSwJMCwJMCwJIkRJVlJfRnJTVDAiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmMDAwMDcwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjNjE4ID0gRElWUl9GclNUMA0KKyAgeyA2MTksCTcsCTEsCTAsCSJESVZTRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZTAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMCB9LCAgLy8gSW5zdCAjNjE5ID0gRElWU0RybQ0KKyAgeyA2MjAsCTcsCTEsCTAsCSJESVZTRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWUwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzYyMCA9IERJVlNEcm1fSW50DQorICB7IDYyMSwJMywJMSwJMCwJIkRJVlNEcnIiLCAwLCAweDVlMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMxIH0sICAvLyBJbnN0ICM2MjEgPSBESVZTRHJyDQorICB7IDYyMiwJMywJMSwJMCwJIkRJVlNEcnJfSW50IiwgMCwgMHg1ZTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjNjIyID0gRElWU0Rycl9JbnQNCisgIHsgNjIzLAk3LAkxLAkwLAkiRElWU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWUwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzIgfSwgIC8vIEluc3QgIzYyMyA9IERJVlNTcm0NCisgIHsgNjI0LAk3LAkxLAkwLAkiRElWU1NybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVlMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICM2MjQgPSBESVZTU3JtX0ludA0KKyAgeyA2MjUsCTMsCTEsCTAsCSJESVZTU3JyIiwgMCwgMHg1ZTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMyB9LCAgLy8gSW5zdCAjNjI1ID0gRElWU1Nycg0KKyAgeyA2MjYsCTMsCTEsCTAsCSJESVZTU3JyX0ludCIsIDAsIDB4NWUwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzYyNiA9IERJVlNTcnJfSW50DQorICB7IDYyNywJNSwJMCwJMCwJIkRJVl9GMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDgwMDAwMWVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzYyNyA9IERJVl9GMzJtDQorICB7IDYyOCwJNSwJMCwJMCwJIkRJVl9GNjRtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGMwMDAwMWVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzYyOCA9IERJVl9GNjRtDQorICB7IDYyOSwJNSwJMCwJMCwJIkRJVl9GSTE2bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRlMDAwMDFlVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM2MjkgPSBESVZfRkkxNm0NCisgIHsgNjMwLAk1LAkwLAkwLAkiRElWX0ZJMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGEwMDAwMWVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzYzMCA9IERJVl9GSTMybQ0KKyAgeyA2MzEsCTEsCTAsCTAsCSJESVZfRlByU1QwIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjgwMDA5MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzYzMSA9IERJVl9GUHJTVDANCisgIHsgNjMyLAkxLAkwLAkwLAkiRElWX0ZTVDByIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjAwMDAzMDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzYzMiA9IERJVl9GU1Qwcg0KKyAgeyA2MzMsCTMsCTEsCTAsCSJESVZfRnAzMiIsIDAsIDB4NDAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzYgfSwgIC8vIEluc3QgIzYzMyA9IERJVl9GcDMyDQorICB7IDYzNCwJNywJMSwJMCwJIkRJVl9GcDMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzcgfSwgIC8vIEluc3QgIzYzNCA9IERJVl9GcDMybQ0KKyAgeyA2MzUsCTMsCTEsCTAsCSJESVZfRnA2NCIsIDAsIDB4NDAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzggfSwgIC8vIEluc3QgIzYzNSA9IERJVl9GcDY0DQorICB7IDYzNiwJNywJMSwJMCwJIkRJVl9GcDY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzkgfSwgIC8vIEluc3QgIzYzNiA9IERJVl9GcDY0bQ0KKyAgeyA2MzcsCTcsCTEsCTAsCSJESVZfRnA2NG0zMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzkgfSwgIC8vIEluc3QgIzYzNyA9IERJVl9GcDY0bTMyDQorICB7IDYzOCwJMywJMSwJMCwJIkRJVl9GcDgwIiwgMCwgMHg0MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MCB9LCAgLy8gSW5zdCAjNjM4ID0gRElWX0ZwODANCisgIHsgNjM5LAk3LAkxLAkwLAkiRElWX0ZwODBtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICM2MzkgPSBESVZfRnA4MG0zMg0KKyAgeyA2NDAsCTcsCTEsCTAsCSJESVZfRnA4MG02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDEgfSwgIC8vIEluc3QgIzY0MCA9IERJVl9GcDgwbTY0DQorICB7IDY0MSwJNywJMSwJMCwJIkRJVl9GcEkxNm0zMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzcgfSwgIC8vIEluc3QgIzY0MSA9IERJVl9GcEkxNm0zMg0KKyAgeyA2NDIsCTcsCTEsCTAsCSJESVZfRnBJMTZtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICM2NDIgPSBESVZfRnBJMTZtNjQNCisgIHsgNjQzLAk3LAkxLAkwLAkiRElWX0ZwSTE2bTgwIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MSB9LCAgLy8gSW5zdCAjNjQzID0gRElWX0ZwSTE2bTgwDQorICB7IDY0NCwJNywJMSwJMCwJIkRJVl9GcEkzMm0zMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzcgfSwgIC8vIEluc3QgIzY0NCA9IERJVl9GcEkzMm0zMg0KKyAgeyA2NDUsCTcsCTEsCTAsCSJESVZfRnBJMzJtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICM2NDUgPSBESVZfRnBJMzJtNjQNCisgIHsgNjQ2LAk3LAkxLAkwLAkiRElWX0ZwSTMybTgwIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MSB9LCAgLy8gSW5zdCAjNjQ2ID0gRElWX0ZwSTMybTgwDQorICB7IDY0NywJMSwJMCwJMCwJIkRJVl9GclNUMCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGY4MDAwNzAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICM2NDcgPSBESVZfRnJTVDANCisgIHsgNjQ4LAk4LAkxLAkwLAkiRFBQRHJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NDFjMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTEgfSwgIC8vIEluc3QgIzY0OCA9IERQUERybWkNCisgIHsgNjQ5LAk0LAkxLAkwLAkiRFBQRHJyaSIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NDFjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTIgfSwgIC8vIEluc3QgIzY0OSA9IERQUERycmkNCisgIHsgNjUwLAk4LAkxLAkwLAkiRFBQU3JtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NDBjMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTEgfSwgIC8vIEluc3QgIzY1MCA9IERQUFNybWkNCisgIHsgNjUxLAk0LAkxLAkwLAkiRFBQU3JyaSIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NDBjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTIgfSwgIC8vIEluc3QgIzY1MSA9IERQUFNycmkNCisgIHsgNjUyLAkwLAkwLAkwLAkiRFNfUFJFRklYIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4M2UwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzY1MiA9IERTX1BSRUZJWA0KKyAgeyA2NTMsCTEsCTAsCTAsCSJFSF9SRVRVUk4iLCAwfCgxPDxUSUQ6OlJldHVybil8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6VGVybWluYXRvciksIDB4YzMwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjQgfSwgIC8vIEluc3QgIzY1MyA9IEVIX1JFVFVSTg0KKyAgeyA2NTQsCTEsCTAsCTAsCSJFSF9SRVRVUk42NCIsIDB8KDE8PFRJRDo6UmV0dXJuKXwoMTw8VElEOjpCYXJyaWVyKXwoMTw8VElEOjpUZXJtaW5hdG9yKSwgMHhjMzAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NSB9LCAgLy8gSW5zdCAjNjU0ID0gRUhfUkVUVVJONjQNCisgIHsgNjU1LAkyLAkwLAkwLAkiRU5URVIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjODAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82IH0sICAvLyBJbnN0ICM2NTUgPSBFTlRFUg0KKyAgeyA2NTYsCTAsCTAsCTAsCSJFU19QUkVGSVgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyNjAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNjU2ID0gRVNfUFJFRklYDQorICB7IDY1NywJNywJMCwJMCwJIkVYVFJBQ1RQU21yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTdjMDJlNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA2IH0sICAvLyBJbnN0ICM2NTcgPSBFWFRSQUNUUFNtcg0KKyAgeyA2NTgsCTMsCTEsCTAsCSJFWFRSQUNUUFNyciIsIDAsIDB4MTdjMDJlNDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA3IH0sICAvLyBJbnN0ICM2NTggPSBFWFRSQUNUUFNycg0KKyAgeyA2NTksCTAsCTAsCTAsCSJGMlhNMSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGYwMDAwNDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM2NTkgPSBGMlhNMQ0KKyAgeyA2NjAsCTIsCTAsCTAsCSJGQVJDQUxMMTZpIiwgMHwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4OWEwMDAwNDFVTEwsIEltcGxpY2l0TGlzdDIsIEltcGxpY2l0TGlzdDksIEJhcnJpZXJzMywgT3BlcmFuZEluZm82IH0sICAvLyBJbnN0ICM2NjAgPSBGQVJDQUxMMTZpDQorICB7IDY2MSwJNSwJMCwJMCwJIkZBUkNBTEwxNm0iLCAwfCgxPDxUSUQ6OkNhbGwpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmZjAwMDA1YlVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0OSwgQmFycmllcnMzLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM2NjEgPSBGQVJDQUxMMTZtDQorICB7IDY2MiwJMiwJMCwJMCwJIkZBUkNBTEwzMmkiLCAwfCgxPDxUSUQ6OkNhbGwpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg5YTAwMDAwMVVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0OSwgQmFycmllcnMzLCBPcGVyYW5kSW5mbzYgfSwgIC8vIEluc3QgIzY2MiA9IEZBUkNBTEwzMmkNCisgIHsgNjYzLAk1LAkwLAkwLAkiRkFSQ0FMTDMybSIsIDB8KDE8PFRJRDo6Q2FsbCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZmMDAwMDFiVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3Q5LCBCYXJyaWVyczMsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzY2MyA9IEZBUkNBTEwzMm0NCisgIHsgNjY0LAk1LAkwLAkwLAkiRkFSQ0FMTDY0IiwgMHwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmYwMDEwMWJVTEwsIEltcGxpY2l0TGlzdDQsIEltcGxpY2l0TGlzdDEwLCBCYXJyaWVyczQsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzY2NCA9IEZBUkNBTEw2NA0KKyAgeyA2NjUsCTIsCTAsCTAsCSJGQVJKTVAxNmkiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6SW5kaXJlY3RCcmFuY2gpfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlYTAwMDA0MVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82IH0sICAvLyBJbnN0ICM2NjUgPSBGQVJKTVAxNmkNCisgIHsgNjY2LAk1LAkwLAkwLAkiRkFSSk1QMTZtIiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OkluZGlyZWN0QnJhbmNoKXwoMTw8VElEOjpCYXJyaWVyKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmYwMDAwNWRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzY2NiA9IEZBUkpNUDE2bQ0KKyAgeyA2NjcsCTIsCTAsCTAsCSJGQVJKTVAzMmkiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6SW5kaXJlY3RCcmFuY2gpfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlYTAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82IH0sICAvLyBJbnN0ICM2NjcgPSBGQVJKTVAzMmkNCisgIHsgNjY4LAk1LAkwLAkwLAkiRkFSSk1QMzJtIiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OkluZGlyZWN0QnJhbmNoKXwoMTw8VElEOjpCYXJyaWVyKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmYwMDAwMWRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzY2OCA9IEZBUkpNUDMybQ0KKyAgeyA2NjksCTUsCTAsCTAsCSJGQVJKTVA2NCIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpJbmRpcmVjdEJyYW5jaCl8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZmMDAxMDFkVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM2NjkgPSBGQVJKTVA2NA0KKyAgeyA2NzAsCTUsCTAsCTAsCSJGQkxEbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRmMDAwMDFjVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM2NzAgPSBGQkxEbQ0KKyAgeyA2NzEsCTUsCTEsCTAsCSJGQlNUUG0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkZjAwMDAxZVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjcxID0gRkJTVFBtDQorICB7IDY3MiwJNSwJMCwJMCwJIkZDT00zMm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkODAwMDAxYVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjcyID0gRkNPTTMybQ0KKyAgeyA2NzMsCTUsCTAsCTAsCSJGQ09NNjRtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGMwMDAwMWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzY3MyA9IEZDT002NG0NCisgIHsgNjc0LAk1LAkwLAkwLAkiRkNPTVAzMm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkODAwMDAxYlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjc0ID0gRkNPTVAzMm0NCisgIHsgNjc1LAk1LAkwLAkwLAkiRkNPTVA2NG0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkYzAwMDAxYlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjc1ID0gRkNPTVA2NG0NCisgIHsgNjc2LAkwLAkwLAkwLAkiRkNPTVBQIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDkwMDA5MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzY3NiA9IEZDT01QUA0KKyAgeyA2NzcsCTAsCTAsCTAsCSJGREVDU1RQIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjYwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzY3NyA9IEZERUNTVFANCisgIHsgNjc4LAkxLAkwLAkwLAkiRkZSRUUiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMDAwMDgwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjNjc4ID0gRkZSRUUNCisgIHsgNjc5LAk1LAkwLAkwLAkiRklDT00xNm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkZTAwMDAxYVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjc5ID0gRklDT00xNm0NCisgIHsgNjgwLAk1LAkwLAkwLAkiRklDT00zMm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkYTAwMDAxYVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjgwID0gRklDT00zMm0NCisgIHsgNjgxLAk1LAkwLAkwLAkiRklDT01QMTZtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGUwMDAwMWJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzY4MSA9IEZJQ09NUDE2bQ0KKyAgeyA2ODIsCTUsCTAsCTAsCSJGSUNPTVAzMm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkYTAwMDAxYlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjgyID0gRklDT01QMzJtDQorICB7IDY4MywJMCwJMCwJMCwJIkZJTkNTVFAiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNzAwMDQwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNjgzID0gRklOQ1NUUA0KKyAgeyA2ODQsCTUsCTAsCTAsCSJGTERDVzE2bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQ5MDAwMDFkVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM2ODQgPSBGTERDVzE2bQ0KKyAgeyA2ODUsCTUsCTAsCTAsCSJGTERFTlZtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDkwMDAwMWNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzY4NSA9IEZMREVOVm0NCisgIHsgNjg2LAkwLAkwLAkwLAkiRkxETDJFIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZWEwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzY4NiA9IEZMREwyRQ0KKyAgeyA2ODcsCTAsCTAsCTAsCSJGTERMMlQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlOTAwMDQwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNjg3ID0gRkxETDJUDQorICB7IDY4OCwJMCwJMCwJMCwJIkZMRExHMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGVjMDAwNDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM2ODggPSBGTERMRzINCisgIHsgNjg5LAkwLAkwLAkwLAkiRkxETE4yIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZWQwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzY4OSA9IEZMRExOMg0KKyAgeyA2OTAsCTAsCTAsCTAsCSJGTERQSSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGViMDAwNDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM2OTAgPSBGTERQSQ0KKyAgeyA2OTEsCTAsCTAsCTAsCSJGTkNMRVgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlMjAwMDYwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNjkxID0gRk5DTEVYDQorICB7IDY5MiwJMCwJMCwJMCwJIkZOSU5JVCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGUzMDAwNjAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM2OTIgPSBGTklOSVQNCisgIHsgNjkzLAkwLAkwLAkwLAkiRk5PUCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQwMDAwNDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM2OTMgPSBGTk9QDQorICB7IDY5NCwJNSwJMCwJMCwJIkZOU1RDVzE2bSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkOTAwMDAxZlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNjk0ID0gRk5TVENXMTZtDQorICB7IDY5NSwJMCwJMCwJMCwJIkZOU1RTVzhyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTAwMDBhMDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEyLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM2OTUgPSBGTlNUU1c4cg0KKyAgeyA2OTYsCTUsCTEsCTAsCSJGTlNUU1dtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGQwMDAwMWZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzY5NiA9IEZOU1RTV20NCisgIHsgNjk3LAk2LAkwLAkwLAkiRlAzMl9UT19JTlQxNl9JTl9NRU0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA4IH0sICAvLyBJbnN0ICM2OTcgPSBGUDMyX1RPX0lOVDE2X0lOX01FTQ0KKyAgeyA2OTgsCTYsCTAsCTAsCSJGUDMyX1RPX0lOVDMyX0lOX01FTSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDggfSwgIC8vIEluc3QgIzY5OCA9IEZQMzJfVE9fSU5UMzJfSU5fTUVNDQorICB7IDY5OSwJNiwJMCwJMCwJIkZQMzJfVE9fSU5UNjRfSU5fTUVNIiwgMHwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwOCB9LCAgLy8gSW5zdCAjNjk5ID0gRlAzMl9UT19JTlQ2NF9JTl9NRU0NCisgIHsgNzAwLAk2LAkwLAkwLAkiRlA2NF9UT19JTlQxNl9JTl9NRU0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA5IH0sICAvLyBJbnN0ICM3MDAgPSBGUDY0X1RPX0lOVDE2X0lOX01FTQ0KKyAgeyA3MDEsCTYsCTAsCTAsCSJGUDY0X1RPX0lOVDMyX0lOX01FTSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDkgfSwgIC8vIEluc3QgIzcwMSA9IEZQNjRfVE9fSU5UMzJfSU5fTUVNDQorICB7IDcwMiwJNiwJMCwJMCwJIkZQNjRfVE9fSU5UNjRfSU5fTUVNIiwgMHwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwOSB9LCAgLy8gSW5zdCAjNzAyID0gRlA2NF9UT19JTlQ2NF9JTl9NRU0NCisgIHsgNzAzLAk2LAkwLAkwLAkiRlA4MF9UT19JTlQxNl9JTl9NRU0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTEwIH0sICAvLyBJbnN0ICM3MDMgPSBGUDgwX1RPX0lOVDE2X0lOX01FTQ0KKyAgeyA3MDQsCTYsCTAsCTAsCSJGUDgwX1RPX0lOVDMyX0lOX01FTSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzcwNCA9IEZQODBfVE9fSU5UMzJfSU5fTUVNDQorICB7IDcwNSwJNiwJMCwJMCwJIkZQODBfVE9fSU5UNjRfSU5fTUVNIiwgMHwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExMCB9LCAgLy8gSW5zdCAjNzA1ID0gRlA4MF9UT19JTlQ2NF9JTl9NRU0NCisgIHsgNzA2LAkwLAkwLAkwLAkiRlBBVEFOIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjMwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzcwNiA9IEZQQVRBTg0KKyAgeyA3MDcsCTAsCTAsCTAsCSJGUFJFTSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGY4MDAwNDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM3MDcgPSBGUFJFTQ0KKyAgeyA3MDgsCTAsCTAsCTAsCSJGUFJFTTEiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNTAwMDQwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNzA4ID0gRlBSRU0xDQorICB7IDcwOSwJMCwJMCwJMCwJIkZQVEFOIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjIwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzcwOSA9IEZQVEFODQorICB7IDcxMCwJMCwJMCwJMCwJIkZSTkRJTlQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmYzAwMDQwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNzEwID0gRlJORElOVA0KKyAgeyA3MTEsCTUsCTEsCTAsCSJGUlNUT1JtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGQwMDAwMWNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzcxMSA9IEZSU1RPUm0NCisgIHsgNzEyLAk1LAkxLAkwLAkiRlNBVkVtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGQwMDAwMWVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzcxMiA9IEZTQVZFbQ0KKyAgeyA3MTMsCTAsCTAsCTAsCSJGU0NBTEUiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmZDAwMDQwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNzEzID0gRlNDQUxFDQorICB7IDcxNCwJMCwJMCwJMCwJIkZTSU5DT1MiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmYjAwMDQwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNzE0ID0gRlNJTkNPUw0KKyAgeyA3MTUsCTUsCTEsCTAsCSJGU1RFTlZtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDkwMDAwMWVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzcxNSA9IEZTVEVOVm0NCisgIHsgNzE2LAk2LAkxLAkwLAkiRlNfTU9WMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4OGIxMDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzcxNiA9IEZTX01PVjMycm0NCisgIHsgNzE3LAkwLAkwLAkwLAkiRlNfUFJFRklYIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NjQwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzcxNyA9IEZTX1BSRUZJWA0KKyAgeyA3MTgsCTAsCTAsCTAsCSJGWEFNIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTUwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzcxOCA9IEZYQU0NCisgIHsgNzE5LAk1LAkwLAkwLAkiRlhSU1RPUiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFlMDAwMTE5VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM3MTkgPSBGWFJTVE9SDQorICB7IDcyMCwJNSwJMSwJMCwJIkZYU0FWRSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFlMDAwMTE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM3MjAgPSBGWFNBVkUNCisgIHsgNzIxLAkwLAkwLAkwLAkiRlhUUkFDVCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGY0MDAwNDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM3MjEgPSBGWFRSQUNUDQorICB7IDcyMiwJMCwJMCwJMCwJIkZZTDJYIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjEwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzcyMiA9IEZZTDJYDQorICB7IDcyMywJMCwJMCwJMCwJIkZZTDJYUDEiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmOTAwMDQwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNzIzID0gRllMMlhQMQ0KKyAgeyA3MjQsCTEsCTEsCTAsCSJGcEdFVF9TVDBfMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTEgfSwgIC8vIEluc3QgIzcyNCA9IEZwR0VUX1NUMF8zMg0KKyAgeyA3MjUsCTEsCTEsCTAsCSJGcEdFVF9TVDBfNjQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTIgfSwgIC8vIEluc3QgIzcyNSA9IEZwR0VUX1NUMF82NA0KKyAgeyA3MjYsCTEsCTEsCTAsCSJGcEdFVF9TVDBfODAiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTMgfSwgIC8vIEluc3QgIzcyNiA9IEZwR0VUX1NUMF84MA0KKyAgeyA3MjcsCTEsCTEsCTAsCSJGcEdFVF9TVDFfMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTEgfSwgIC8vIEluc3QgIzcyNyA9IEZwR0VUX1NUMV8zMg0KKyAgeyA3MjgsCTEsCTEsCTAsCSJGcEdFVF9TVDFfNjQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTIgfSwgIC8vIEluc3QgIzcyOCA9IEZwR0VUX1NUMV82NA0KKyAgeyA3MjksCTEsCTEsCTAsCSJGcEdFVF9TVDFfODAiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTMgfSwgIC8vIEluc3QgIzcyOSA9IEZwR0VUX1NUMV84MA0KKyAgeyA3MzAsCTEsCTAsCTAsCSJGcFNFVF9TVDBfMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3MDAwMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MjMsIE5VTEwsIE9wZXJhbmRJbmZvMTExIH0sICAvLyBJbnN0ICM3MzAgPSBGcFNFVF9TVDBfMzINCisgIHsgNzMxLAkxLAkwLAkwLAkiRnBTRVRfU1QwXzY0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzAwMDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDIzLCBOVUxMLCBPcGVyYW5kSW5mbzExMiB9LCAgLy8gSW5zdCAjNzMxID0gRnBTRVRfU1QwXzY0DQorICB7IDczMiwJMSwJMCwJMCwJIkZwU0VUX1NUMF84MCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDcwMDAwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QyMywgTlVMTCwgT3BlcmFuZEluZm8xMTMgfSwgIC8vIEluc3QgIzczMiA9IEZwU0VUX1NUMF84MA0KKyAgeyA3MzMsCTEsCTAsCTAsCSJGcFNFVF9TVDFfMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3MDAwMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MjQsIE5VTEwsIE9wZXJhbmRJbmZvMTExIH0sICAvLyBJbnN0ICM3MzMgPSBGcFNFVF9TVDFfMzINCisgIHsgNzM0LAkxLAkwLAkwLAkiRnBTRVRfU1QxXzY0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzAwMDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDI0LCBOVUxMLCBPcGVyYW5kSW5mbzExMiB9LCAgLy8gSW5zdCAjNzM0ID0gRnBTRVRfU1QxXzY0DQorICB7IDczNSwJMSwJMCwJMCwJIkZwU0VUX1NUMV84MCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDcwMDAwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QyNCwgTlVMTCwgT3BlcmFuZEluZm8xMTMgfSwgIC8vIEluc3QgIzczNSA9IEZwU0VUX1NUMV84MA0KKyAgeyA3MzYsCTcsCTEsCTAsCSJGc0FORE5QRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMCB9LCAgLy8gSW5zdCAjNzM2ID0gRnNBTkROUERybQ0KKyAgeyA3MzcsCTMsCTEsCTAsCSJGc0FORE5QRHJyIiwgMCwgMHg1NTgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMSB9LCAgLy8gSW5zdCAjNzM3ID0gRnNBTkROUERycg0KKyAgeyA3MzgsCTcsCTEsCTAsCSJGc0FORE5QU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMiB9LCAgLy8gSW5zdCAjNzM4ID0gRnNBTkROUFNybQ0KKyAgeyA3MzksCTMsCTEsCTAsCSJGc0FORE5QU3JyIiwgMCwgMHg1NTQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMyB9LCAgLy8gSW5zdCAjNzM5ID0gRnNBTkROUFNycg0KKyAgeyA3NDAsCTcsCTEsCTAsCSJGc0FORFBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU0ODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMwIH0sICAvLyBJbnN0ICM3NDAgPSBGc0FORFBEcm0NCisgIHsgNzQxLAkzLAkxLAkwLAkiRnNBTkRQRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NDgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMSB9LCAgLy8gSW5zdCAjNzQxID0gRnNBTkRQRHJyDQorICB7IDc0MiwJNywJMSwJMCwJIkZzQU5EUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTQ0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzIgfSwgIC8vIEluc3QgIzc0MiA9IEZzQU5EUFNybQ0KKyAgeyA3NDMsCTMsCTEsCTAsCSJGc0FORFBTcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU0NDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMzIH0sICAvLyBJbnN0ICM3NDMgPSBGc0FORFBTcnINCisgIHsgNzQ0LAkxLAkxLAkwLAkiRnNGTEQwU0QiLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKXwoMTw8VElEOjpDaGVhcEFzQU1vdmUpLCAweGVmMDAwMTYwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExNCB9LCAgLy8gSW5zdCAjNzQ0ID0gRnNGTEQwU0QNCisgIHsgNzQ1LAkxLAkxLAkwLAkiRnNGTEQwU1MiLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKXwoMTw8VElEOjpDaGVhcEFzQU1vdmUpLCAweGVmMDAwMTYwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExNSB9LCAgLy8gSW5zdCAjNzQ1ID0gRnNGTEQwU1MNCisgIHsgNzQ2LAk2LAkxLAkwLAkiRnNNT1ZBUERybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDI4ODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkyIH0sICAvLyBJbnN0ICM3NDYgPSBGc01PVkFQRHJtDQorICB7IDc0NywJMiwJMSwJMCwJIkZzTU9WQVBEcnIiLCAwLCAweDI4ODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExNiB9LCAgLy8gSW5zdCAjNzQ3ID0gRnNNT1ZBUERycg0KKyAgeyA3NDgsCTYsCTEsCTAsCSJGc01PVkFQU3JtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4Mjg0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOTAgfSwgIC8vIEluc3QgIzc0OCA9IEZzTU9WQVBTcm0NCisgIHsgNzQ5LAkyLAkxLAkwLAkiRnNNT1ZBUFNyciIsIDAsIDB4Mjg0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTE3IH0sICAvLyBJbnN0ICM3NDkgPSBGc01PVkFQU3JyDQorICB7IDc1MCwJNywJMSwJMCwJIkZzT1JQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NjgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMCB9LCAgLy8gSW5zdCAjNzUwID0gRnNPUlBEcm0NCisgIHsgNzUxLAkzLAkxLAkwLAkiRnNPUlBEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU2ODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMxIH0sICAvLyBJbnN0ICM3NTEgPSBGc09SUERycg0KKyAgeyA3NTIsCTcsCTEsCTAsCSJGc09SUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTY0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzIgfSwgIC8vIEluc3QgIzc1MiA9IEZzT1JQU3JtDQorICB7IDc1MywJMywJMSwJMCwJIkZzT1JQU3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NjQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMyB9LCAgLy8gSW5zdCAjNzUzID0gRnNPUlBTcnINCisgIHsgNzU0LAk3LAkxLAkwLAkiRnNYT1JQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NzgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMCB9LCAgLy8gSW5zdCAjNzU0ID0gRnNYT1JQRHJtDQorICB7IDc1NSwJMywJMSwJMCwJIkZzWE9SUERyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTc4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzEgfSwgIC8vIEluc3QgIzc1NSA9IEZzWE9SUERycg0KKyAgeyA3NTYsCTcsCTEsCTAsCSJGc1hPUlBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU3NDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMyIH0sICAvLyBJbnN0ICM3NTYgPSBGc1hPUlBTcm0NCisgIHsgNzU3LAkzLAkxLAkwLAkiRnNYT1JQU3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NzQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMyB9LCAgLy8gSW5zdCAjNzU3ID0gRnNYT1JQU3JyDQorICB7IDc1OCwJNiwJMSwJMCwJIkdTX01PVjMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDhiMjAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICM3NTggPSBHU19NT1YzMnJtDQorICB7IDc1OSwJMCwJMCwJMCwJIkdTX1BSRUZJWCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDY1MDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM3NTkgPSBHU19QUkVGSVgNCisgIHsgNzYwLAk3LAkxLAkwLAkiSEFERFBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDdjODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICM3NjAgPSBIQUREUERybQ0KKyAgeyA3NjEsCTMsCTEsCTAsCSJIQUREUERyciIsIDAsIDB4N2M4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzc2MSA9IEhBRERQRHJyDQorICB7IDc2MiwJNywJMSwJMCwJIkhBRERQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg3YzgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjNzYyID0gSEFERFBTcm0NCisgIHsgNzYzLAkzLAkxLAkwLAkiSEFERFBTcnIiLCAwLCAweDdjODAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICM3NjMgPSBIQUREUFNycg0KKyAgeyA3NjQsCTAsCTAsCTAsCSJITFQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNDAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjNzY0ID0gSExUDQorICB7IDc2NSwJNywJMSwJMCwJIkhTVUJQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg3ZDgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjNzY1ID0gSFNVQlBEcm0NCisgIHsgNzY2LAkzLAkxLAkwLAkiSFNVQlBEcnIiLCAwLCAweDdkODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICM3NjYgPSBIU1VCUERycg0KKyAgeyA3NjcsCTcsCTEsCTAsCSJIU1VCUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4N2Q4MDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzc2NyA9IEhTVUJQU3JtDQorICB7IDc2OCwJMywJMSwJMCwJIkhTVUJQU3JyIiwgMCwgMHg3ZDgwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjNzY4ID0gSFNVQlBTcnINCisgIHsgNzY5LAk1LAkwLAkwLAkiSURJVjE2bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGY3MDAwMDVmVUxMLCBJbXBsaWNpdExpc3QyMCwgSW1wbGljaXRMaXN0MjEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNzY5ID0gSURJVjE2bQ0KKyAgeyA3NzAsCTEsCTAsCTAsCSJJRElWMTZyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjcwMDAwNTdVTEwsIEltcGxpY2l0TGlzdDIwLCBJbXBsaWNpdExpc3QyMSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwNCB9LCAgLy8gSW5zdCAjNzcwID0gSURJVjE2cg0KKyAgeyA3NzEsCTUsCTAsCTAsCSJJRElWMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjcwMDAwMWZVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3QxOCwgQmFycmllcnM2LCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM3NzEgPSBJRElWMzJtDQorICB7IDc3MiwJMSwJMCwJMCwJIklESVYzMnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNzAwMDAxN1VMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDE4LCBCYXJyaWVyczYsIE9wZXJhbmRJbmZvNjQgfSwgIC8vIEluc3QgIzc3MiA9IElESVYzMnINCisgIHsgNzczLAk1LAkwLAkwLAkiSURJVjY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGY3MDAxMDFmVUxMLCBJbXBsaWNpdExpc3QxOSwgSW1wbGljaXRMaXN0MTcsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNzczID0gSURJVjY0bQ0KKyAgeyA3NzQsCTEsCTAsCTAsCSJJRElWNjRyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjcwMDEwMTdVTEwsIEltcGxpY2l0TGlzdDE5LCBJbXBsaWNpdExpc3QxNywgQmFycmllcnMxLCBPcGVyYW5kSW5mbzY1IH0sICAvLyBJbnN0ICM3NzQgPSBJRElWNjRyDQorICB7IDc3NSwJNSwJMCwJMCwJIklESVY4bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGY2MDAwMDFmVUxMLCBJbXBsaWNpdExpc3QxMiwgSW1wbGljaXRMaXN0MjIsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjNzc1ID0gSURJVjhtDQorICB7IDc3NiwJMSwJMCwJMCwJIklESVY4ciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGY2MDAwMDE3VUxMLCBJbXBsaWNpdExpc3QxMiwgSW1wbGljaXRMaXN0MjIsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzc3NiA9IElESVY4cg0KKyAgeyA3NzcsCTUsCTAsCTAsCSJJTERfRjE2bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRmMDAwMDE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM3NzcgPSBJTERfRjE2bQ0KKyAgeyA3NzgsCTUsCTAsCTAsCSJJTERfRjMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRiMDAwMDE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM3NzggPSBJTERfRjMybQ0KKyAgeyA3NzksCTUsCTAsCTAsCSJJTERfRjY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRmMDAwMDFkVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM3NzkgPSBJTERfRjY0bQ0KKyAgeyA3ODAsCTYsCTEsCTAsCSJJTERfRnAxNm0zMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTE4IH0sICAvLyBJbnN0ICM3ODAgPSBJTERfRnAxNm0zMg0KKyAgeyA3ODEsCTYsCTEsCTAsCSJJTERfRnAxNm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTE5IH0sICAvLyBJbnN0ICM3ODEgPSBJTERfRnAxNm02NA0KKyAgeyA3ODIsCTYsCTEsCTAsCSJJTERfRnAxNm04MCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTIwIH0sICAvLyBJbnN0ICM3ODIgPSBJTERfRnAxNm04MA0KKyAgeyA3ODMsCTYsCTEsCTAsCSJJTERfRnAzMm0zMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTE4IH0sICAvLyBJbnN0ICM3ODMgPSBJTERfRnAzMm0zMg0KKyAgeyA3ODQsCTYsCTEsCTAsCSJJTERfRnAzMm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTE5IH0sICAvLyBJbnN0ICM3ODQgPSBJTERfRnAzMm02NA0KKyAgeyA3ODUsCTYsCTEsCTAsCSJJTERfRnAzMm04MCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTIwIH0sICAvLyBJbnN0ICM3ODUgPSBJTERfRnAzMm04MA0KKyAgeyA3ODYsCTYsCTEsCTAsCSJJTERfRnA2NG0zMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTE4IH0sICAvLyBJbnN0ICM3ODYgPSBJTERfRnA2NG0zMg0KKyAgeyA3ODcsCTYsCTEsCTAsCSJJTERfRnA2NG02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTE5IH0sICAvLyBJbnN0ICM3ODcgPSBJTERfRnA2NG02NA0KKyAgeyA3ODgsCTYsCTEsCTAsCSJJTERfRnA2NG04MCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTIwIH0sICAvLyBJbnN0ICM3ODggPSBJTERfRnA2NG04MA0KKyAgeyA3ODksCTUsCTAsCTAsCSJJTVVMMTZtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmNzAwMDA1ZFVMTCwgSW1wbGljaXRMaXN0MTIsIEltcGxpY2l0TGlzdDIxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzc4OSA9IElNVUwxNm0NCisgIHsgNzkwLAkxLAkwLAkwLAkiSU1VTDE2ciIsIDAsIDB4ZjcwMDAwNTVVTEwsIEltcGxpY2l0TGlzdDEyLCBJbXBsaWNpdExpc3QyMSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwNCB9LCAgLy8gSW5zdCAjNzkwID0gSU1VTDE2cg0KKyAgeyA3OTEsCTcsCTEsCTAsCSJJTVVMMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YWYwMDAxNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMyB9LCAgLy8gSW5zdCAjNzkxID0gSU1VTDE2cm0NCisgIHsgNzkyLAk3LAkxLAkwLAkiSU1VTDE2cm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2OTAwNjA0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyMSB9LCAgLy8gSW5zdCAjNzkyID0gSU1VTDE2cm1pDQorICB7IDc5MywJNywJMSwJMCwJIklNVUwxNnJtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDZiMDAyMDQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIxIH0sICAvLyBJbnN0ICM3OTMgPSBJTVVMMTZybWk4DQorICB7IDc5NCwJMywJMSwJMCwJIklNVUwxNnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhhZjAwMDE0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICM3OTQgPSBJTVVMMTZycg0KKyAgeyA3OTUsCTMsCTEsCTAsCSJJTVVMMTZycmkiLCAwLCAweDY5MDA2MDQ1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIyIH0sICAvLyBJbnN0ICM3OTUgPSBJTVVMMTZycmkNCisgIHsgNzk2LAkzLAkxLAkwLAkiSU1VTDE2cnJpOCIsIDAsIDB4NmIwMDIwNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMjIgfSwgIC8vIEluc3QgIzc5NiA9IElNVUwxNnJyaTgNCisgIHsgNzk3LAk1LAkwLAkwLAkiSU1VTDMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZjcwMDAwMWRVTEwsIEltcGxpY2l0TGlzdDEzLCBJbXBsaWNpdExpc3QxOCwgQmFycmllcnM2LCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM3OTcgPSBJTVVMMzJtDQorICB7IDc5OCwJMSwJMCwJMCwJIklNVUwzMnIiLCAwLCAweGY3MDAwMDE1VUxMLCBJbXBsaWNpdExpc3QxMywgSW1wbGljaXRMaXN0MTgsIEJhcnJpZXJzNiwgT3BlcmFuZEluZm82NCB9LCAgLy8gSW5zdCAjNzk4ID0gSU1VTDMycg0KKyAgeyA3OTksCTcsCTEsCTAsCSJJTVVMMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YWYwMDAxMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjNzk5ID0gSU1VTDMycm0NCisgIHsgODAwLAk3LAkxLAkwLAkiSU1VTDMycm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2OTAwYTAwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyMyB9LCAgLy8gSW5zdCAjODAwID0gSU1VTDMycm1pDQorICB7IDgwMSwJNywJMSwJMCwJIklNVUwzMnJtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDZiMDAyMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIzIH0sICAvLyBJbnN0ICM4MDEgPSBJTVVMMzJybWk4DQorICB7IDgwMiwJMywJMSwJMCwJIklNVUwzMnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhhZjAwMDEwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICM4MDIgPSBJTVVMMzJycg0KKyAgeyA4MDMsCTMsCTEsCTAsCSJJTVVMMzJycmkiLCAwLCAweDY5MDBhMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTI0IH0sICAvLyBJbnN0ICM4MDMgPSBJTVVMMzJycmkNCisgIHsgODA0LAkzLAkxLAkwLAkiSU1VTDMycnJpOCIsIDAsIDB4NmIwMDIwMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMjQgfSwgIC8vIEluc3QgIzgwNCA9IElNVUwzMnJyaTgNCisgIHsgODA1LAk1LAkwLAkwLAkiSU1VTDY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZjcwMDEwMWRVTEwsIEltcGxpY2l0TGlzdDE1LCBJbXBsaWNpdExpc3QxNywgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM4MDUgPSBJTVVMNjRtDQorICB7IDgwNiwJMSwJMCwJMCwJIklNVUw2NHIiLCAwLCAweGY3MDAxMDE1VUxMLCBJbXBsaWNpdExpc3QxNSwgSW1wbGljaXRMaXN0MTcsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82NSB9LCAgLy8gSW5zdCAjODA2ID0gSU1VTDY0cg0KKyAgeyA4MDcsCTcsCTEsCTAsCSJJTVVMNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YWYwMDExMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjODA3ID0gSU1VTDY0cm0NCisgIHsgODA4LAk3LAkxLAkwLAkiSU1VTDY0cm1pMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDY5MDBiMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTI1IH0sICAvLyBJbnN0ICM4MDggPSBJTVVMNjRybWkzMg0KKyAgeyA4MDksCTcsCTEsCTAsCSJJTVVMNjRybWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2YjAwMzAwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyNSB9LCAgLy8gSW5zdCAjODA5ID0gSU1VTDY0cm1pOA0KKyAgeyA4MTAsCTMsCTEsCTAsCSJJTVVMNjRyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4YWYwMDExMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjODEwID0gSU1VTDY0cnINCisgIHsgODExLAkzLAkxLAkwLAkiSU1VTDY0cnJpMzIiLCAwLCAweDY5MDBiMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTI2IH0sICAvLyBJbnN0ICM4MTEgPSBJTVVMNjRycmkzMg0KKyAgeyA4MTIsCTMsCTEsCTAsCSJJTVVMNjRycmk4IiwgMCwgMHg2YjAwMzAwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyNiB9LCAgLy8gSW5zdCAjODEyID0gSU1VTDY0cnJpOA0KKyAgeyA4MTMsCTUsCTAsCTAsCSJJTVVMOG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGY2MDAwMDFkVUxMLCBJbXBsaWNpdExpc3QxMSwgSW1wbGljaXRMaXN0MjIsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjODEzID0gSU1VTDhtDQorICB7IDgxNCwJMSwJMCwJMCwJIklNVUw4ciIsIDAsIDB4ZjYwMDAwMTVVTEwsIEltcGxpY2l0TGlzdDExLCBJbXBsaWNpdExpc3QyMiwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwNSB9LCAgLy8gSW5zdCAjODE0ID0gSU1VTDhyDQorICB7IDgxNSwJMCwJMCwJMCwJIklOMTYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg2ZDAwMDA0MVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjODE1ID0gSU4xNg0KKyAgeyA4MTYsCTEsCTAsCTAsCSJJTjE2cmkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlNTAwMjA0MVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MTIsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjODE2ID0gSU4xNnJpDQorICB7IDgxNywJMCwJMCwJMCwJIklOMTZyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGVkMDAwMDQxVUxMLCBJbXBsaWNpdExpc3QyNSwgSW1wbGljaXRMaXN0MTIsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzgxNyA9IElOMTZycg0KKyAgeyA4MTgsCTAsCTAsCTAsCSJJTjMyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NmQwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzgxOCA9IElOMzINCisgIHsgODE5LAkxLAkwLAkwLAkiSU4zMnJpIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTUwMDIwMDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEzLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzgxOSA9IElOMzJyaQ0KKyAgeyA4MjAsCTAsCTAsCTAsCSJJTjMycnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlZDAwMDAwMVVMTCwgSW1wbGljaXRMaXN0MjUsIEltcGxpY2l0TGlzdDEzLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM4MjAgPSBJTjMycnINCisgIHsgODIxLAkwLAkwLAkwLAkiSU44IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NmMwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzgyMSA9IElOOA0KKyAgeyA4MjIsCTEsCTAsCTAsCSJJTjhyaSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGU0MDAyMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxMSwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICM4MjIgPSBJTjhyaQ0KKyAgeyA4MjMsCTAsCTAsCTAsCSJJTjhyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGVjMDAwMDAxVUxMLCBJbXBsaWNpdExpc3QyNSwgSW1wbGljaXRMaXN0MTEsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzgyMyA9IElOOHJyDQorICB7IDgyNCwJNSwJMCwJMCwJIklOQzE2bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGZmMDAwMDU4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzgyNCA9IElOQzE2bQ0KKyAgeyA4MjUsCTIsCTEsCTAsCSJJTkMxNnIiLCAwfCgxPDxUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkciksIDB4NDAwMDAwNDJVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDIgfSwgIC8vIEluc3QgIzgyNSA9IElOQzE2cg0KKyAgeyA4MjYsCTUsCTAsCTAsCSJJTkMzMm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmZjAwMDAxOFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM4MjYgPSBJTkMzMm0NCisgIHsgODI3LAkyLAkxLAkwLAkiSU5DMzJyIiwgMHwoMTw8VElEOjpDb252ZXJ0aWJsZVRvM0FkZHIpLCAweDQwMDAwMDAyVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTkgfSwgIC8vIEluc3QgIzgyNyA9IElOQzMycg0KKyAgeyA4MjgsCTUsCTAsCTAsCSJJTkM2NF8xNm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmZjAwMDA1OFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM4MjggPSBJTkM2NF8xNm0NCisgIHsgODI5LAkyLAkxLAkwLAkiSU5DNjRfMTZyIiwgMHwoMTw8VElEOjpDb252ZXJ0aWJsZVRvM0FkZHIpLCAweGZmMDAwMDUwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAyIH0sICAvLyBJbnN0ICM4MjkgPSBJTkM2NF8xNnINCisgIHsgODMwLAk1LAkwLAkwLAkiSU5DNjRfMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZmYwMDAwMThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjODMwID0gSU5DNjRfMzJtDQorICB7IDgzMSwJMiwJMSwJMCwJIklOQzY0XzMyciIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKSwgMHhmZjAwMDAxMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICM4MzEgPSBJTkM2NF8zMnINCisgIHsgODMyLAk1LAkwLAkwLAkiSU5DNjRtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZmYwMDEwMThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjODMyID0gSU5DNjRtDQorICB7IDgzMywJMiwJMSwJMCwJIklOQzY0ciIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKSwgMHhmZjAwMTAxMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYwIH0sICAvLyBJbnN0ICM4MzMgPSBJTkM2NHINCisgIHsgODM0LAk1LAkwLAkwLAkiSU5DOG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmZTAwMDAxOFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM4MzQgPSBJTkM4bQ0KKyAgeyA4MzUsCTIsCTEsCTAsCSJJTkM4ciIsIDAsIDB4ZmUwMDAwMTBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDMgfSwgIC8vIEluc3QgIzgzNSA9IElOQzhyDQorICB7IDgzNiwJOCwJMSwJMCwJIklOU0VSVFBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDIxYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUxIH0sICAvLyBJbnN0ICM4MzYgPSBJTlNFUlRQU3JtDQorICB7IDgzNywJNCwJMSwJMCwJIklOU0VSVFBTcnIiLCAwLCAweDIxYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUyIH0sICAvLyBJbnN0ICM4MzcgPSBJTlNFUlRQU3JyDQorICB7IDgzOCwJMSwJMCwJMCwJIklOVCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGNkMDAyMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzgzOCA9IElOVA0KKyAgeyA4MzksCTAsCTAsCTAsCSJJTlQzIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4Y2MwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzgzOSA9IElOVDMNCisgIHsgODQwLAkwLAkwLAkwLAkiSU5UTyIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGNlMDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM4NDAgPSBJTlRPDQorICB7IDg0MSwJMCwJMCwJMCwJIklOVkQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4MDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM4NDEgPSBJTlZEDQorICB7IDg0MiwJMCwJMCwJMCwJIklOVkVQVCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDgwMDAwZDQxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM4NDIgPSBJTlZFUFQNCisgIHsgODQzLAk1LAkwLAkwLAkiSU5WTFBHIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTAwMDExZlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjODQzID0gSU5WTFBHDQorICB7IDg0NCwJMCwJMCwJMCwJIklOVlZQSUQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4MTAwMGQ0MVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjODQ0ID0gSU5WVlBJRA0KKyAgeyA4NDUsCTAsCTAsCTAsCSJJUkVUMTYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjZjAwMDA0MVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjODQ1ID0gSVJFVDE2DQorICB7IDg0NiwJMCwJMCwJMCwJIklSRVQzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGNmMDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM4NDYgPSBJUkVUMzINCisgIHsgODQ3LAkwLAkwLAkwLAkiSVJFVDY0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4Y2YwMDEwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzg0NyA9IElSRVQ2NA0KKyAgeyA4NDgsCTUsCTAsCTAsCSJJU1RUX0ZQMTZtIiwgMHwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRmMDAwMDE5VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICM4NDggPSBJU1RUX0ZQMTZtDQorICB7IDg0OSwJNSwJMCwJMCwJIklTVFRfRlAzMm0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGIwMDAwMTlVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzg0OSA9IElTVFRfRlAzMm0NCisgIHsgODUwLAk1LAkwLAkwLAkiSVNUVF9GUDY0bSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkZDAwMDAxOVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjODUwID0gSVNUVF9GUDY0bQ0KKyAgeyA4NTEsCTYsCTAsCTAsCSJJU1RUX0ZwMTZtMzIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDggfSwgIC8vIEluc3QgIzg1MSA9IElTVFRfRnAxNm0zMg0KKyAgeyA4NTIsCTYsCTAsCTAsCSJJU1RUX0ZwMTZtNjQiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDkgfSwgIC8vIEluc3QgIzg1MiA9IElTVFRfRnAxNm02NA0KKyAgeyA4NTMsCTYsCTAsCTAsCSJJU1RUX0ZwMTZtODAiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzg1MyA9IElTVFRfRnAxNm04MA0KKyAgeyA4NTQsCTYsCTAsCTAsCSJJU1RUX0ZwMzJtMzIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDggfSwgIC8vIEluc3QgIzg1NCA9IElTVFRfRnAzMm0zMg0KKyAgeyA4NTUsCTYsCTAsCTAsCSJJU1RUX0ZwMzJtNjQiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDkgfSwgIC8vIEluc3QgIzg1NSA9IElTVFRfRnAzMm02NA0KKyAgeyA4NTYsCTYsCTAsCTAsCSJJU1RUX0ZwMzJtODAiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzg1NiA9IElTVFRfRnAzMm04MA0KKyAgeyA4NTcsCTYsCTAsCTAsCSJJU1RUX0ZwNjRtMzIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDggfSwgIC8vIEluc3QgIzg1NyA9IElTVFRfRnA2NG0zMg0KKyAgeyA4NTgsCTYsCTAsCTAsCSJJU1RUX0ZwNjRtNjQiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDkgfSwgIC8vIEluc3QgIzg1OCA9IElTVFRfRnA2NG02NA0KKyAgeyA4NTksCTYsCTAsCTAsCSJJU1RUX0ZwNjRtODAiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzg1OSA9IElTVFRfRnA2NG04MA0KKyAgeyA4NjAsCTUsCTAsCTAsCSJJU1RfRjE2bSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkZjAwMDAxYVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjODYwID0gSVNUX0YxNm0NCisgIHsgODYxLAk1LAkwLAkwLAkiSVNUX0YzMm0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGIwMDAwMWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzg2MSA9IElTVF9GMzJtDQorICB7IDg2MiwJNSwJMCwJMCwJIklTVF9GUDE2bSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkZjAwMDAxYlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjODYyID0gSVNUX0ZQMTZtDQorICB7IDg2MywJNSwJMCwJMCwJIklTVF9GUDMybSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkYjAwMDAxYlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjODYzID0gSVNUX0ZQMzJtDQorICB7IDg2NCwJNSwJMCwJMCwJIklTVF9GUDY0bSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkZjAwMDAxZlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjODY0ID0gSVNUX0ZQNjRtDQorICB7IDg2NSwJNiwJMCwJMCwJIklTVF9GcDE2bTMyIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MjAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA4IH0sICAvLyBJbnN0ICM4NjUgPSBJU1RfRnAxNm0zMg0KKyAgeyA4NjYsCTYsCTAsCTAsCSJJU1RfRnAxNm02NCIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDIwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwOSB9LCAgLy8gSW5zdCAjODY2ID0gSVNUX0ZwMTZtNjQNCisgIHsgODY3LAk2LAkwLAkwLAkiSVNUX0ZwMTZtODAiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzg2NyA9IElTVF9GcDE2bTgwDQorICB7IDg2OCwJNiwJMCwJMCwJIklTVF9GcDMybTMyIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MjAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA4IH0sICAvLyBJbnN0ICM4NjggPSBJU1RfRnAzMm0zMg0KKyAgeyA4NjksCTYsCTAsCTAsCSJJU1RfRnAzMm02NCIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDIwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwOSB9LCAgLy8gSW5zdCAjODY5ID0gSVNUX0ZwMzJtNjQNCisgIHsgODcwLAk2LAkwLAkwLAkiSVNUX0ZwMzJtODAiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzg3MCA9IElTVF9GcDMybTgwDQorICB7IDg3MSwJNiwJMCwJMCwJIklTVF9GcDY0bTMyIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MjAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA4IH0sICAvLyBJbnN0ICM4NzEgPSBJU1RfRnA2NG0zMg0KKyAgeyA4NzIsCTYsCTAsCTAsCSJJU1RfRnA2NG02NCIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDIwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwOSB9LCAgLy8gSW5zdCAjODcyID0gSVNUX0ZwNjRtNjQNCisgIHsgODczLAk2LAkwLAkwLAkiSVNUX0ZwNjRtODAiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzg3MyA9IElTVF9GcDY0bTgwDQorICB7IDg3NCwJOCwJMSwJMCwJIkludF9DTVBTRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhjMjAwMmIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MSB9LCAgLy8gSW5zdCAjODc0ID0gSW50X0NNUFNEcm0NCisgIHsgODc1LAk0LAkxLAkwLAkiSW50X0NNUFNEcnIiLCAwLCAweGMyMDAyYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUyIH0sICAvLyBJbnN0ICM4NzUgPSBJbnRfQ01QU0Rycg0KKyAgeyA4NzYsCTgsCTEsCTAsCSJJbnRfQ01QU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YzIwMDJjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTEgfSwgIC8vIEluc3QgIzg3NiA9IEludF9DTVBTU3JtDQorICB7IDg3NywJNCwJMSwJMCwJIkludF9DTVBTU3JyIiwgMCwgMHhjMjAwMmMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MiB9LCAgLy8gSW5zdCAjODc3ID0gSW50X0NNUFNTcnINCisgIHsgODc4LAk2LAkwLAkwLAkiSW50X0NPTUlTRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyZjgwMDE0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM4NzggPSBJbnRfQ09NSVNEcm0NCisgIHsgODc5LAkyLAkwLAkwLAkiSW50X0NPTUlTRHJyIiwgMCwgMHgyZjgwMDE0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM4NzkgPSBJbnRfQ09NSVNEcnINCisgIHsgODgwLAk2LAkwLAkwLAkiSW50X0NPTUlTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyZjQwMDEwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM4ODAgPSBJbnRfQ09NSVNTcm0NCisgIHsgODgxLAkyLAkwLAkwLAkiSW50X0NPTUlTU3JyIiwgMCwgMHgyZjQwMDEwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM4ODEgPSBJbnRfQ09NSVNTcnINCisgIHsgODgyLAk2LAkxLAkwLAkiSW50X0NWVERRMlBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGU2MDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM4ODIgPSBJbnRfQ1ZURFEyUERybQ0KKyAgeyA4ODMsCTIsCTEsCTAsCSJJbnRfQ1ZURFEyUERyciIsIDAsIDB4ZTYwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzg4MyA9IEludF9DVlREUTJQRHJyDQorICB7IDg4NCwJNiwJMSwJMCwJIkludF9DVlREUTJQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YjAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjODg0ID0gSW50X0NWVERRMlBTcm0NCisgIHsgODg1LAkyLAkxLAkwLAkiSW50X0NWVERRMlBTcnIiLCAwLCAweDViMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM4ODUgPSBJbnRfQ1ZURFEyUFNycg0KKyAgeyA4ODYsCTYsCTEsCTAsCSJJbnRfQ1ZUUEQyRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZTYwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzg4NiA9IEludF9DVlRQRDJEUXJtDQorICB7IDg4NywJMiwJMSwJMCwJIkludF9DVlRQRDJEUXJyIiwgMCwgMHhlNjAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjODg3ID0gSW50X0NWVFBEMkRRcnINCisgIHsgODg4LAk2LAkxLAkwLAkiSW50X0NWVFBEMlBJcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJkODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyNyB9LCAgLy8gSW5zdCAjODg4ID0gSW50X0NWVFBEMlBJcm0NCisgIHsgODg5LAkyLAkxLAkwLAkiSW50X0NWVFBEMlBJcnIiLCAwLCAweDJkODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyOCB9LCAgLy8gSW5zdCAjODg5ID0gSW50X0NWVFBEMlBJcnINCisgIHsgODkwLAk2LAkxLAkwLAkiSW50X0NWVFBEMlBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVhODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM4OTAgPSBJbnRfQ1ZUUEQyUFNybQ0KKyAgeyA4OTEsCTIsCTEsCTAsCSJJbnRfQ1ZUUEQyUFNyciIsIDAsIDB4NWE4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzg5MSA9IEludF9DVlRQRDJQU3JyDQorICB7IDg5MiwJNiwJMSwJMCwJIkludF9DVlRQSTJQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjODkyID0gSW50X0NWVFBJMlBEcm0NCisgIHsgODkzLAkyLAkxLAkwLAkiSW50X0NWVFBJMlBEcnIiLCAwLCAweDJhODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyOSB9LCAgLy8gSW5zdCAjODkzID0gSW50X0NWVFBJMlBEcnINCisgIHsgODk0LAk3LAkxLAkwLAkiSW50X0NWVFBJMlBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJhNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICM4OTQgPSBJbnRfQ1ZUUEkyUFNybQ0KKyAgeyA4OTUsCTMsCTEsCTAsCSJJbnRfQ1ZUUEkyUFNyciIsIDAsIDB4MmE0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTMwIH0sICAvLyBJbnN0ICM4OTUgPSBJbnRfQ1ZUUEkyUFNycg0KKyAgeyA4OTYsCTYsCTEsCTAsCSJJbnRfQ1ZUUFMyRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWI4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzg5NiA9IEludF9DVlRQUzJEUXJtDQorICB7IDg5NywJMiwJMSwJMCwJIkludF9DVlRQUzJEUXJyIiwgMCwgMHg1YjgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjODk3ID0gSW50X0NWVFBTMkRRcnINCisgIHsgODk4LAk2LAkxLAkwLAkiSW50X0NWVFBTMlBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVhMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM4OTggPSBJbnRfQ1ZUUFMyUERybQ0KKyAgeyA4OTksCTIsCTEsCTAsCSJJbnRfQ1ZUUFMyUERyciIsIDAsIDB4NWEwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzg5OSA9IEludF9DVlRQUzJQRHJyDQorICB7IDkwMCwJNiwJMSwJMCwJIkludF9DVlRQUzJQSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyZDQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjcgfSwgIC8vIEluc3QgIzkwMCA9IEludF9DVlRQUzJQSXJtDQorICB7IDkwMSwJMiwJMSwJMCwJIkludF9DVlRQUzJQSXJyIiwgMCwgMHgyZDQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjggfSwgIC8vIEluc3QgIzkwMSA9IEludF9DVlRQUzJQSXJyDQorICB7IDkwMiwJNiwJMSwJMCwJIkludF9DVlRTRDJTSTY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJkMDAxYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICM5MDIgPSBJbnRfQ1ZUU0QyU0k2NHJtDQorICB7IDkwMywJMiwJMSwJMCwJIkludF9DVlRTRDJTSTY0cnIiLCAwLCAweDJkMDAxYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzg5IH0sICAvLyBJbnN0ICM5MDMgPSBJbnRfQ1ZUU0QyU0k2NHJyDQorICB7IDkwNCwJNiwJMSwJMCwJIkludF9DVlRTRDJTSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyZDAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NSB9LCAgLy8gSW5zdCAjOTA0ID0gSW50X0NWVFNEMlNJcm0NCisgIHsgOTA1LAkyLAkxLAkwLAkiSW50X0NWVFNEMlNJcnIiLCAwLCAweDJkMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzMSB9LCAgLy8gSW5zdCAjOTA1ID0gSW50X0NWVFNEMlNJcnINCisgIHsgOTA2LAk3LAkxLAkwLAkiSW50X0NWVFNEMlNTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVhMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICM5MDYgPSBJbnRfQ1ZUU0QyU1NybQ0KKyAgeyA5MDcsCTMsCTEsCTAsCSJJbnRfQ1ZUU0QyU1NyciIsIDAsIDB4NWEwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzkwNyA9IEludF9DVlRTRDJTU3JyDQorICB7IDkwOCwJNywJMSwJMCwJIkludF9DVlRTSTJTRDY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJhMDAxYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICM5MDggPSBJbnRfQ1ZUU0kyU0Q2NHJtDQorICB7IDkwOSwJMywJMSwJMCwJIkludF9DVlRTSTJTRDY0cnIiLCAwLCAweDJhMDAxYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzMiB9LCAgLy8gSW5zdCAjOTA5ID0gSW50X0NWVFNJMlNENjRycg0KKyAgeyA5MTAsCTcsCTEsCTAsCSJJbnRfQ1ZUU0kyU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmEwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzkxMCA9IEludF9DVlRTSTJTRHJtDQorICB7IDkxMSwJMywJMSwJMCwJIkludF9DVlRTSTJTRHJyIiwgMCwgMHgyYTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzMgfSwgIC8vIEluc3QgIzkxMSA9IEludF9DVlRTSTJTRHJyDQorICB7IDkxMiwJNywJMSwJMCwJIkludF9DVlRTSTJTUzY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJhMDAxYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICM5MTIgPSBJbnRfQ1ZUU0kyU1M2NHJtDQorICB7IDkxMywJMywJMSwJMCwJIkludF9DVlRTSTJTUzY0cnIiLCAwLCAweDJhMDAxYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzMiB9LCAgLy8gSW5zdCAjOTEzID0gSW50X0NWVFNJMlNTNjRycg0KKyAgeyA5MTQsCTcsCTEsCTAsCSJJbnRfQ1ZUU0kyU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmEwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzkxNCA9IEludF9DVlRTSTJTU3JtDQorICB7IDkxNSwJMywJMSwJMCwJIkludF9DVlRTSTJTU3JyIiwgMCwgMHgyYTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzMgfSwgIC8vIEluc3QgIzkxNSA9IEludF9DVlRTSTJTU3JyDQorICB7IDkxNiwJNywJMSwJMCwJIkludF9DVlRTUzJTRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YTAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjOTE2ID0gSW50X0NWVFNTMlNEcm0NCisgIHsgOTE3LAkzLAkxLAkwLAkiSW50X0NWVFNTMlNEcnIiLCAwLCAweDVhMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICM5MTcgPSBJbnRfQ1ZUU1MyU0Rycg0KKyAgeyA5MTgsCTYsCTEsCTAsCSJJbnRfQ1ZUU1MyU0k2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyZDAwMWMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjOTE4ID0gSW50X0NWVFNTMlNJNjRybQ0KKyAgeyA5MTksCTIsCTEsCTAsCSJJbnRfQ1ZUU1MyU0k2NHJyIiwgMCwgMHgyZDAwMWMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84OSB9LCAgLy8gSW5zdCAjOTE5ID0gSW50X0NWVFNTMlNJNjRycg0KKyAgeyA5MjAsCTYsCTEsCTAsCSJJbnRfQ1ZUU1MyU0lybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmQwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzkyMCA9IEludF9DVlRTUzJTSXJtDQorICB7IDkyMSwJMiwJMSwJMCwJIkludF9DVlRTUzJTSXJyIiwgMCwgMHgyZDAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzEgfSwgIC8vIEluc3QgIzkyMSA9IEludF9DVlRTUzJTSXJyDQorICB7IDkyMiwJNiwJMSwJMCwJIkludF9DVlRUUEQyRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZTY4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzkyMiA9IEludF9DVlRUUEQyRFFybQ0KKyAgeyA5MjMsCTIsCTEsCTAsCSJJbnRfQ1ZUVFBEMkRRcnIiLCAwLCAweGU2ODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM5MjMgPSBJbnRfQ1ZUVFBEMkRRcnINCisgIHsgOTI0LAk2LAkxLAkwLAkiSW50X0NWVFRQRDJQSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYzgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjcgfSwgIC8vIEluc3QgIzkyNCA9IEludF9DVlRUUEQyUElybQ0KKyAgeyA5MjUsCTIsCTEsCTAsCSJJbnRfQ1ZUVFBEMlBJcnIiLCAwLCAweDJjODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyOCB9LCAgLy8gSW5zdCAjOTI1ID0gSW50X0NWVFRQRDJQSXJyDQorICB7IDkyNiwJNiwJMSwJMCwJIkludF9DVlRUUFMyRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWIwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzkyNiA9IEludF9DVlRUUFMyRFFybQ0KKyAgeyA5MjcsCTIsCTEsCTAsCSJJbnRfQ1ZUVFBTMkRRcnIiLCAwLCAweDViMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM5MjcgPSBJbnRfQ1ZUVFBTMkRRcnINCisgIHsgOTI4LAk2LAkxLAkwLAkiSW50X0NWVFRQUzJQSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYzQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjcgfSwgIC8vIEluc3QgIzkyOCA9IEludF9DVlRUUFMyUElybQ0KKyAgeyA5MjksCTIsCTEsCTAsCSJJbnRfQ1ZUVFBTMlBJcnIiLCAwLCAweDJjNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyOCB9LCAgLy8gSW5zdCAjOTI5ID0gSW50X0NWVFRQUzJQSXJyDQorICB7IDkzMCwJNiwJMSwJMCwJIkludF9DVlRUU0QyU0k2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYzAwMWIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjOTMwID0gSW50X0NWVFRTRDJTSTY0cm0NCisgIHsgOTMxLAkyLAkxLAkwLAkiSW50X0NWVFRTRDJTSTY0cnIiLCAwLCAweDJjMDAxYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzg5IH0sICAvLyBJbnN0ICM5MzEgPSBJbnRfQ1ZUVFNEMlNJNjRycg0KKyAgeyA5MzIsCTYsCTEsCTAsCSJJbnRfQ1ZUVFNEMlNJcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJjMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICM5MzIgPSBJbnRfQ1ZUVFNEMlNJcm0NCisgIHsgOTMzLAkyLAkxLAkwLAkiSW50X0NWVFRTRDJTSXJyIiwgMCwgMHgyYzAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzEgfSwgIC8vIEluc3QgIzkzMyA9IEludF9DVlRUU0QyU0lycg0KKyAgeyA5MzQsCTYsCTEsCTAsCSJJbnRfQ1ZUVFNTMlNJNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmMwMDFjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzkzNCA9IEludF9DVlRUU1MyU0k2NHJtDQorICB7IDkzNSwJMiwJMSwJMCwJIkludF9DVlRUU1MyU0k2NHJyIiwgMCwgMHgyYzAwMWMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84OSB9LCAgLy8gSW5zdCAjOTM1ID0gSW50X0NWVFRTUzJTSTY0cnINCisgIHsgOTM2LAk2LAkxLAkwLAkiSW50X0NWVFRTUzJTSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYzAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NSB9LCAgLy8gSW5zdCAjOTM2ID0gSW50X0NWVFRTUzJTSXJtDQorICB7IDkzNywJMiwJMSwJMCwJIkludF9DVlRUU1MyU0lyciIsIDAsIDB4MmMwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTMxIH0sICAvLyBJbnN0ICM5MzcgPSBJbnRfQ1ZUVFNTMlNJcnINCisgIHsgOTM4LAkwLAkwLAkwLAkiSW50X01lbUJhcnJpZXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICM5MzggPSBJbnRfTWVtQmFycmllcg0KKyAgeyA5MzksCTEsCTAsCTAsCSJJbnRfTWVtQmFycmllck5vU1NFIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4OTA4MDAxMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MiwgTlVMTCwgT3BlcmFuZEluZm82NCB9LCAgLy8gSW5zdCAjOTM5ID0gSW50X01lbUJhcnJpZXJOb1NTRQ0KKyAgeyA5NDAsCTEsCTAsCTAsCSJJbnRfTWVtQmFycmllck5vU1NFNjQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg5MDgxMDExVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QyLCBOVUxMLCBPcGVyYW5kSW5mbzY1IH0sICAvLyBJbnN0ICM5NDAgPSBJbnRfTWVtQmFycmllck5vU1NFNjQNCisgIHsgOTQxLAk2LAkwLAkwLAkiSW50X1VDT01JU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmU4MDAxNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjOTQxID0gSW50X1VDT01JU0RybQ0KKyAgeyA5NDIsCTIsCTAsCTAsCSJJbnRfVUNPTUlTRHJyIiwgMCwgMHgyZTgwMDE0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM5NDIgPSBJbnRfVUNPTUlTRHJyDQorICB7IDk0MywJNiwJMCwJMCwJIkludF9VQ09NSVNTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJlNDAwMTA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzk0MyA9IEludF9VQ09NSVNTcm0NCisgIHsgOTQ0LAkyLAkwLAkwLAkiSW50X1VDT01JU1NyciIsIDAsIDB4MmU0MDAxMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjOTQ0ID0gSW50X1VDT01JU1Nycg0KKyAgeyA5NDUsCTgsCTEsCTAsCSJJbnRfVkNNUFNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVjMjAwMmIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzQgfSwgIC8vIEluc3QgIzk0NSA9IEludF9WQ01QU0RybQ0KKyAgeyA5NDYsCTQsCTEsCTAsCSJJbnRfVkNNUFNEcnIiLCAwLCAweDVjMjAwMmIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjOTQ2ID0gSW50X1ZDTVBTRHJyDQorICB7IDk0NywJOCwJMSwJMCwJIkludF9WQ01QU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWMyMDAyYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjOTQ3ID0gSW50X1ZDTVBTU3JtDQorICB7IDk0OCwJNCwJMSwJMCwJIkludF9WQ01QU1NyciIsIDAsIDB4NWMyMDAyYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICM5NDggPSBJbnRfVkNNUFNTcnINCisgIHsgOTQ5LAk2LAkwLAkwLAkiSW50X1ZDT01JU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTJmODAwMDQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzk0OSA9IEludF9WQ09NSVNEcm0NCisgIHsgOTUwLAkyLAkwLAkwLAkiSW50X1ZDT01JU0RyciIsIDAsIDB4MTJmODAwMDQ1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzk1MCA9IEludF9WQ09NSVNEcnINCisgIHsgOTUxLAk2LAkwLAkwLAkiSW50X1ZDT01JU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTJmNDAwMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzk1MSA9IEludF9WQ09NSVNTcm0NCisgIHsgOTUyLAkyLAkwLAkwLAkiSW50X1ZDT01JU1NyciIsIDAsIDB4MTJmNDAwMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzk1MiA9IEludF9WQ09NSVNTcnINCisgIHsgOTUzLAk2LAkxLAkwLAkiSW50X1ZDVlREUTJQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxZTYwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzk1MyA9IEludF9WQ1ZURFEyUERybQ0KKyAgeyA5NTQsCTIsCTEsCTAsCSJJbnRfVkNWVERRMlBEcnIiLCAwLCAweDFlNjAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjOTU0ID0gSW50X1ZDVlREUTJQRHJyDQorICB7IDk1NSwJNiwJMSwJMCwJIkludF9WQ1ZURFEyUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTViMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM5NTUgPSBJbnRfVkNWVERRMlBTcm0NCisgIHsgOTU2LAkyLAkxLAkwLAkiSW50X1ZDVlREUTJQU3JyIiwgMCwgMHgxNWIwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzk1NiA9IEludF9WQ1ZURFEyUFNycg0KKyAgeyA5NTcsCTYsCTEsCTAsCSJJbnRfVkNWVFBEMkRRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDFlNjAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjOTU3ID0gSW50X1ZDVlRQRDJEUXJtDQorICB7IDk1OCwJMiwJMSwJMCwJIkludF9WQ1ZUUEQyRFFyciIsIDAsIDB4MWU2MDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM5NTggPSBJbnRfVkNWVFBEMkRRcnINCisgIHsgOTU5LAk2LAkxLAkwLAkiSW50X1ZDVlRQRDJQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YTgwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjOTU5ID0gSW50X1ZDVlRQRDJQU3JtDQorICB7IDk2MCwJMiwJMSwJMCwJIkludF9WQ1ZUUEQyUFNyciIsIDAsIDB4NWE4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzk2MCA9IEludF9WQ1ZUUEQyUFNycg0KKyAgeyA5NjEsCTYsCTEsCTAsCSJJbnRfVkNWVFBTMkRRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE1YjgwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjOTYxID0gSW50X1ZDVlRQUzJEUXJtDQorICB7IDk2MiwJMiwJMSwJMCwJIkludF9WQ1ZUUFMyRFFyciIsIDAsIDB4MTViODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM5NjIgPSBJbnRfVkNWVFBTMkRRcnINCisgIHsgOTYzLAk2LAkxLAkwLAkiSW50X1ZDVlRQUzJQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNWEwMDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzk2MyA9IEludF9WQ1ZUUFMyUERybQ0KKyAgeyA5NjQsCTIsCTEsCTAsCSJJbnRfVkNWVFBTMlBEcnIiLCAwLCAweDE1YTAwMDAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjOTY0ID0gSW50X1ZDVlRQUzJQRHJyDQorICB7IDk2NSwJNiwJMSwJMCwJIkludF9WQ1ZUU0QyU0k2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMmQwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzk2NSA9IEludF9WQ1ZUU0QyU0k2NHJtDQorICB7IDk2NiwJMiwJMSwJMCwJIkludF9WQ1ZUU0QyU0k2NHJyIiwgMCwgMHgzMmQwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODkgfSwgIC8vIEluc3QgIzk2NiA9IEludF9WQ1ZUU0QyU0k2NHJyDQorICB7IDk2NywJNiwJMSwJMCwJIkludF9WQ1ZUU0QyU0lybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTJkMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICM5NjcgPSBJbnRfVkNWVFNEMlNJcm0NCisgIHsgOTY4LAkyLAkxLAkwLAkiSW50X1ZDVlRTRDJTSXJyIiwgMCwgMHgxMmQwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTMxIH0sICAvLyBJbnN0ICM5NjggPSBJbnRfVkNWVFNEMlNJcnINCisgIHsgOTY5LAk3LAkxLAkwLAkiSW50X1ZDVlRTRDJTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWEwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICM5NjkgPSBJbnRfVkNWVFNEMlNTcm0NCisgIHsgOTcwLAkzLAkxLAkwLAkiSW50X1ZDVlRTRDJTU3JyIiwgMCwgMHg1NWEwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICM5NzAgPSBJbnRfVkNWVFNEMlNTcnINCisgIHsgOTcxLAk3LAkxLAkwLAkiSW50X1ZDVlRTSTJTRDY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDcyYTAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzk3MSA9IEludF9WQ1ZUU0kyU0Q2NHJtDQorICB7IDk3MiwJMywJMSwJMCwJIkludF9WQ1ZUU0kyU0Q2NHJyIiwgMCwgMHg3MmEwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM3IH0sICAvLyBJbnN0ICM5NzIgPSBJbnRfVkNWVFNJMlNENjRycg0KKyAgeyA5NzMsCTcsCTEsCTAsCSJJbnRfVkNWVFNJMlNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUyYTAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzk3MyA9IEludF9WQ1ZUU0kyU0RybQ0KKyAgeyA5NzQsCTMsCTEsCTAsCSJJbnRfVkNWVFNJMlNEcnIiLCAwLCAweDUyYTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzggfSwgIC8vIEluc3QgIzk3NCA9IEludF9WQ1ZUU0kyU0Rycg0KKyAgeyA5NzUsCTcsCTEsCTAsCSJJbnRfVkNWVFNJMlNTNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NzJhMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjOTc1ID0gSW50X1ZDVlRTSTJTUzY0cm0NCisgIHsgOTc2LAkzLAkxLAkwLAkiSW50X1ZDVlRTSTJTUzY0cnIiLCAwLCAweDcyYTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzcgfSwgIC8vIEluc3QgIzk3NiA9IEludF9WQ1ZUU0kyU1M2NHJyDQorICB7IDk3NywJNywJMSwJMCwJIkludF9WQ1ZUU0kyU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTJhMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjOTc3ID0gSW50X1ZDVlRTSTJTU3JtDQorICB7IDk3OCwJMywJMSwJMCwJIkludF9WQ1ZUU0kyU1NyciIsIDAsIDB4NTJhMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzOCB9LCAgLy8gSW5zdCAjOTc4ID0gSW50X1ZDVlRTSTJTU3JyDQorICB7IDk3OSwJNywJMSwJMCwJIkludF9WQ1ZUU1MyU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVhMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjOTc5ID0gSW50X1ZDVlRTUzJTRHJtDQorICB7IDk4MCwJMywJMSwJMCwJIkludF9WQ1ZUU1MyU0RyciIsIDAsIDB4NTVhMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjOTgwID0gSW50X1ZDVlRTUzJTRHJyDQorICB7IDk4MSwJNiwJMSwJMCwJIkludF9WQ1ZUU1MyU0k2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMmQwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzk4MSA9IEludF9WQ1ZUU1MyU0k2NHJtDQorICB7IDk4MiwJMiwJMSwJMCwJIkludF9WQ1ZUU1MyU0k2NHJyIiwgMCwgMHgzMmQwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODkgfSwgIC8vIEluc3QgIzk4MiA9IEludF9WQ1ZUU1MyU0k2NHJyDQorICB7IDk4MywJNiwJMSwJMCwJIkludF9WQ1ZUU1MyU0lybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTJkMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICM5ODMgPSBJbnRfVkNWVFNTMlNJcm0NCisgIHsgOTg0LAkyLAkxLAkwLAkiSW50X1ZDVlRTUzJTSXJyIiwgMCwgMHgxMmQwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTMxIH0sICAvLyBJbnN0ICM5ODQgPSBJbnRfVkNWVFNTMlNJcnINCisgIHsgOTg1LAk2LAkxLAkwLAkiSW50X1ZDVlRUUEQyRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MWU2ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM5ODUgPSBJbnRfVkNWVFRQRDJEUXJtDQorICB7IDk4NiwJMiwJMSwJMCwJIkludF9WQ1ZUVFBEMkRRcnIiLCAwLCAweDFlNjgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjOTg2ID0gSW50X1ZDVlRUUEQyRFFycg0KKyAgeyA5ODcsCTYsCTEsCTAsCSJJbnRfVkNWVFRQUzJEUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNWIwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzk4NyA9IEludF9WQ1ZUVFBTMkRRcm0NCisgIHsgOTg4LAkyLAkxLAkwLAkiSW50X1ZDVlRUUFMyRFFyciIsIDAsIDB4MTViMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICM5ODggPSBJbnRfVkNWVFRQUzJEUXJyDQorICB7IDk4OSwJNiwJMSwJMCwJIkludF9WQ1ZUVFNEMlNJNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzJjMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICM5ODkgPSBJbnRfVkNWVFRTRDJTSTY0cm0NCisgIHsgOTkwLAkyLAkxLAkwLAkiSW50X1ZDVlRUU0QyU0k2NHJyIiwgMCwgMHgzMmMwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODkgfSwgIC8vIEluc3QgIzk5MCA9IEludF9WQ1ZUVFNEMlNJNjRycg0KKyAgeyA5OTEsCTYsCTEsCTAsCSJJbnRfVkNWVFRTRDJTSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMmMwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzk5MSA9IEludF9WQ1ZUVFNEMlNJcm0NCisgIHsgOTkyLAkyLAkxLAkwLAkiSW50X1ZDVlRUU0QyU0lyciIsIDAsIDB4MTJjMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzMSB9LCAgLy8gSW5zdCAjOTkyID0gSW50X1ZDVlRUU0QyU0lycg0KKyAgeyA5OTMsCTYsCTEsCTAsCSJJbnRfVkNWVFRTUzJTSTY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMyYzAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjOTkzID0gSW50X1ZDVlRUU1MyU0k2NHJtDQorICB7IDk5NCwJMiwJMSwJMCwJIkludF9WQ1ZUVFNTMlNJNjRyciIsIDAsIDB4MzJjMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzg5IH0sICAvLyBJbnN0ICM5OTQgPSBJbnRfVkNWVFRTUzJTSTY0cnINCisgIHsgOTk1LAk2LAkxLAkwLAkiSW50X1ZDVlRUU1MyU0lybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTJjMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICM5OTUgPSBJbnRfVkNWVFRTUzJTSXJtDQorICB7IDk5NiwJMiwJMSwJMCwJIkludF9WQ1ZUVFNTMlNJcnIiLCAwLCAweDEyYzAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzEgfSwgIC8vIEluc3QgIzk5NiA9IEludF9WQ1ZUVFNTMlNJcnINCisgIHsgOTk3LAk2LAkwLAkwLAkiSW50X1ZVQ09NSVNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEyZTgwMDA0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICM5OTcgPSBJbnRfVlVDT01JU0RybQ0KKyAgeyA5OTgsCTIsCTAsCTAsCSJJbnRfVlVDT01JU0RyciIsIDAsIDB4MTJlODAwMDQ1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzk5OCA9IEludF9WVUNPTUlTRHJyDQorICB7IDk5OSwJNiwJMCwJMCwJIkludF9WVUNPTUlTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMmU0MDAwMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjOTk5ID0gSW50X1ZVQ09NSVNTcm0NCisgIHsgMTAwMCwJMiwJMCwJMCwJIkludF9WVUNPTUlTU3JyIiwgMCwgMHgxMmU0MDAwMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTAwMCA9IEludF9WVUNPTUlTU3JyDQorICB7IDEwMDEsCTEsCTAsCTAsCSJKQUVfMSIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzMwMDQwMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAwMSA9IEpBRV8xDQorICB7IDEwMDIsCTEsCTAsCTAsCSJKQUVfNCIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKSwgMHg4MzAwYzEwMVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMDAyID0gSkFFXzQNCisgIHsgMTAwMywJMSwJMCwJMCwJIkpBXzEiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc3MDA0MDAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMDMgPSBKQV8xDQorICB7IDEwMDQsCTEsCTAsCTAsCSJKQV80IiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpLCAweDg3MDBjMTAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMDQgPSBKQV80DQorICB7IDEwMDUsCTEsCTAsCTAsCSJKQkVfMSIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzYwMDQwMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAwNSA9IEpCRV8xDQorICB7IDEwMDYsCTEsCTAsCTAsCSJKQkVfNCIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKSwgMHg4NjAwYzEwMVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMDA2ID0gSkJFXzQNCisgIHsgMTAwNywJMSwJMCwJMCwJIkpCXzEiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDcyMDA0MDAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMDcgPSBKQl8xDQorICB7IDEwMDgsCTEsCTAsCTAsCSJKQl80IiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpLCAweDgyMDBjMTAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMDggPSBKQl80DQorICB7IDEwMDksCTEsCTAsCTAsCSJKQ1haOCIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTMwMDQwMDFVTEwsIEltcGxpY2l0TGlzdDI2LCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMDkgPSBKQ1haOA0KKyAgeyAxMDEwLAkxLAkwLAkwLAkiSkVfMSIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzQwMDQwMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAxMCA9IEpFXzENCisgIHsgMTAxMSwJMSwJMCwJMCwJIkpFXzQiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvciksIDB4ODQwMGMxMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAxMSA9IEpFXzQNCisgIHsgMTAxMiwJMSwJMCwJMCwJIkpHRV8xIiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3ZDAwNDAwMVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMDEyID0gSkdFXzENCisgIHsgMTAxMywJMSwJMCwJMCwJIkpHRV80IiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpLCAweDhkMDBjMTAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMTMgPSBKR0VfNA0KKyAgeyAxMDE0LAkxLAkwLAkwLAkiSkdfMSIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2YwMDQwMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAxNCA9IEpHXzENCisgIHsgMTAxNSwJMSwJMCwJMCwJIkpHXzQiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvciksIDB4OGYwMGMxMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAxNSA9IEpHXzQNCisgIHsgMTAxNiwJMSwJMCwJMCwJIkpMRV8xIiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3ZTAwNDAwMVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMDE2ID0gSkxFXzENCisgIHsgMTAxNywJMSwJMCwJMCwJIkpMRV80IiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpLCAweDhlMDBjMTAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMTcgPSBKTEVfNA0KKyAgeyAxMDE4LAkxLAkwLAkwLAkiSkxfMSIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2MwMDQwMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAxOCA9IEpMXzENCisgIHsgMTAxOSwJMSwJMCwJMCwJIkpMXzQiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvciksIDB4OGMwMGMxMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAxOSA9IEpMXzQNCisgIHsgMTAyMCwJNSwJMCwJMCwJIkpNUDMybSIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpJbmRpcmVjdEJyYW5jaCl8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VGVybWluYXRvciksIDB4ZmYwMDAwMWNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzEwMjAgPSBKTVAzMm0NCisgIHsgMTAyMSwJMSwJMCwJMCwJIkpNUDMyciIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpJbmRpcmVjdEJyYW5jaCl8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6VGVybWluYXRvciksIDB4ZmYwMDAwMTRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjQgfSwgIC8vIEluc3QgIzEwMjEgPSBKTVAzMnINCisgIHsgMTAyMiwJNSwJMCwJMCwJIkpNUDY0bSIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpJbmRpcmVjdEJyYW5jaCl8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VGVybWluYXRvciksIDB4ZmYwMDAwMWNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzEwMjIgPSBKTVA2NG0NCisgIHsgMTAyMywJMSwJMCwJMCwJIkpNUDY0cGNyZWwzMiIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpJbmRpcmVjdEJyYW5jaCl8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGU5MDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMjMgPSBKTVA2NHBjcmVsMzINCisgIHsgMTAyNCwJMSwJMCwJMCwJIkpNUDY0ciIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpJbmRpcmVjdEJyYW5jaCl8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6VGVybWluYXRvciksIDB4ZmYwMDAwMTRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjUgfSwgIC8vIEluc3QgIzEwMjQgPSBKTVA2NHINCisgIHsgMTAyNSwJMSwJMCwJMCwJIkpNUF8xIiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlYjAwNDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMDI1ID0gSk1QXzENCisgIHsgMTAyNiwJMSwJMCwJMCwJIkpNUF80IiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpLCAweGU5MDBjMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMjYgPSBKTVBfNA0KKyAgeyAxMDI3LAkxLAkwLAkwLAkiSk5FXzEiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc1MDA0MDAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMjcgPSBKTkVfMQ0KKyAgeyAxMDI4LAkxLAkwLAkwLAkiSk5FXzQiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvciksIDB4ODUwMGMxMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAyOCA9IEpORV80DQorICB7IDEwMjksCTEsCTAsCTAsCSJKTk9fMSIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzEwMDQwMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAyOSA9IEpOT18xDQorICB7IDEwMzAsCTEsCTAsCTAsCSJKTk9fNCIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKSwgMHg4MTAwYzEwMVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMDMwID0gSk5PXzQNCisgIHsgMTAzMSwJMSwJMCwJMCwJIkpOUF8xIiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3YjAwNDAwMVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMDMxID0gSk5QXzENCisgIHsgMTAzMiwJMSwJMCwJMCwJIkpOUF80IiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpLCAweDhiMDBjMTAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMzIgPSBKTlBfNA0KKyAgeyAxMDMzLAkxLAkwLAkwLAkiSk5TXzEiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5MDA0MDAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMzMgPSBKTlNfMQ0KKyAgeyAxMDM0LAkxLAkwLAkwLAkiSk5TXzQiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvciksIDB4ODkwMGMxMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAzNCA9IEpOU180DQorICB7IDEwMzUsCTEsCTAsCTAsCSJKT18xIiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3MDAwNDAwMVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMDM1ID0gSk9fMQ0KKyAgeyAxMDM2LAkxLAkwLAkwLAkiSk9fNCIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKSwgMHg4MDAwYzEwMVVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMDM2ID0gSk9fNA0KKyAgeyAxMDM3LAkxLAkwLAkwLAkiSlBfMSIsIDB8KDE8PFRJRDo6QnJhbmNoKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2EwMDQwMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAzNyA9IEpQXzENCisgIHsgMTAzOCwJMSwJMCwJMCwJIkpQXzQiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvciksIDB4OGEwMGMxMDFVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTAzOCA9IEpQXzQNCisgIHsgMTAzOSwJMSwJMCwJMCwJIkpTXzEiLCAwfCgxPDxUSUQ6OkJyYW5jaCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc4MDA0MDAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwMzkgPSBKU18xDQorICB7IDEwNDAsCTEsCTAsCTAsCSJKU180IiwgMHwoMTw8VElEOjpCcmFuY2gpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpLCAweDg4MDBjMTAxVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEwNDAgPSBKU180DQorICB7IDEwNDEsCTAsCTAsCTAsCSJMQUhGIiwgMCwgMHg5ZjAwMDAwMVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MjcsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzEwNDEgPSBMQUhGDQorICB7IDEwNDIsCTYsCTEsCTAsCSJMQVIxNnJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MjAwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MyB9LCAgLy8gSW5zdCAjMTA0MiA9IExBUjE2cm0NCisgIHsgMTA0MywJMiwJMSwJMCwJIkxBUjE2cnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyMDAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU0IH0sICAvLyBJbnN0ICMxMDQzID0gTEFSMTZycg0KKyAgeyAxMDQ0LAk2LAkxLAkwLAkiTEFSMzJybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDIwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzEwNDQgPSBMQVIzMnJtDQorICB7IDEwNDUsCTIsCTEsCTAsCSJMQVIzMnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MjAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NiB9LCAgLy8gSW5zdCAjMTA0NSA9IExBUjMycnINCisgIHsgMTA0NiwJNiwJMSwJMCwJIkxBUjY0cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyMDAxMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMxMDQ2ID0gTEFSNjRybQ0KKyAgeyAxMDQ3LAkyLAkxLAkwLAkiTEFSNjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDIwMDExMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM5IH0sICAvLyBJbnN0ICMxMDQ3ID0gTEFSNjRycg0KKyAgeyAxMDQ4LAk2LAkwLAkwLAkiTENNUFhDSEcxNiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGIxMDgwMTQ0VUxMLCBJbXBsaWNpdExpc3QxMiwgSW1wbGljaXRMaXN0MjgsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjMTA0OCA9IExDTVBYQ0hHMTYNCisgIHsgMTA0OSwJNiwJMCwJMCwJIkxDTVBYQ0hHMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhiMTA4MDEwNFVMTCwgSW1wbGljaXRMaXN0MTMsIEltcGxpY2l0TGlzdDI5LCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTUgfSwgIC8vIEluc3QgIzEwNDkgPSBMQ01QWENIRzMyDQorICB7IDEwNTAsCTYsCTAsCTAsCSJMQ01QWENIRzY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YjEwODExMDRVTEwsIEltcGxpY2l0TGlzdDE1LCBJbXBsaWNpdExpc3QzMCwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE5IH0sICAvLyBJbnN0ICMxMDUwID0gTENNUFhDSEc2NA0KKyAgeyAxMDUxLAk2LAkwLAkwLAkiTENNUFhDSEc4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YjAwODAxMDRVTEwsIEltcGxpY2l0TGlzdDExLCBJbXBsaWNpdExpc3QzMSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI0IH0sICAvLyBJbnN0ICMxMDUxID0gTENNUFhDSEc4DQorICB7IDEwNTIsCTUsCTAsCTAsCSJMQ01QWENIRzhCIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YzcwODAxMTlVTEwsIEltcGxpY2l0TGlzdDYsIEltcGxpY2l0TGlzdDE4LCBCYXJyaWVyczYsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzEwNTIgPSBMQ01QWENIRzhCDQorICB7IDEwNTMsCTYsCTEsCTAsCSJMRERRVXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmMDgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMTA1MyA9IExERFFVcm0NCisgIHsgMTA1NCwJNSwJMCwJMCwJIkxETVhDU1IiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YWU0MDAxMWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzEwNTQgPSBMRE1YQ1NSDQorICB7IDEwNTUsCTYsCTEsCTAsCSJMRFMxNnJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzUwMDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTMgfSwgIC8vIEluc3QgIzEwNTUgPSBMRFMxNnJtDQorICB7IDEwNTYsCTYsCTEsCTAsCSJMRFMzMnJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzUwMDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzEwNTYgPSBMRFMzMnJtDQorICB7IDEwNTcsCTAsCTAsCTAsCSJMRF9GMCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGVlMDAwNDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxMDU3ID0gTERfRjANCisgIHsgMTA1OCwJMCwJMCwJMCwJIkxEX0YxIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTgwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzEwNTggPSBMRF9GMQ0KKyAgeyAxMDU5LAk1LAkwLAkwLAkiTERfRjMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQ5MDAwMDE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMDU5ID0gTERfRjMybQ0KKyAgeyAxMDYwLAk1LAkwLAkwLAkiTERfRjY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRkMDAwMDE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMDYwID0gTERfRjY0bQ0KKyAgeyAxMDYxLAk1LAkwLAkwLAkiTERfRjgwbSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRiMDAwMDFkVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMDYxID0gTERfRjgwbQ0KKyAgeyAxMDYyLAkxLAkxLAkwLAkiTERfRnAwMzIiLCAwfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDEwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExMSB9LCAgLy8gSW5zdCAjMTA2MiA9IExEX0ZwMDMyDQorICB7IDEwNjMsCTEsCTEsCTAsCSJMRF9GcDA2NCIsIDB8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTEyIH0sICAvLyBJbnN0ICMxMDYzID0gTERfRnAwNjQNCisgIHsgMTA2NCwJMSwJMSwJMCwJIkxEX0ZwMDgwIiwgMHwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKSwgMHgxMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTMgfSwgIC8vIEluc3QgIzEwNjQgPSBMRF9GcDA4MA0KKyAgeyAxMDY1LAkxLAkxLAkwLAkiTERfRnAxMzIiLCAwfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDEwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExMSB9LCAgLy8gSW5zdCAjMTA2NSA9IExEX0ZwMTMyDQorICB7IDEwNjYsCTEsCTEsCTAsCSJMRF9GcDE2NCIsIDB8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTEyIH0sICAvLyBJbnN0ICMxMDY2ID0gTERfRnAxNjQNCisgIHsgMTA2NywJMSwJMSwJMCwJIkxEX0ZwMTgwIiwgMHwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKSwgMHgxMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTMgfSwgIC8vIEluc3QgIzEwNjcgPSBMRF9GcDE4MA0KKyAgeyAxMDY4LAk2LAkxLAkwLAkiTERfRnAzMm0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTggfSwgIC8vIEluc3QgIzEwNjggPSBMRF9GcDMybQ0KKyAgeyAxMDY5LAk2LAkxLAkwLAkiTERfRnAzMm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTE5IH0sICAvLyBJbnN0ICMxMDY5ID0gTERfRnAzMm02NA0KKyAgeyAxMDcwLAk2LAkxLAkwLAkiTERfRnAzMm04MCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTIwIH0sICAvLyBJbnN0ICMxMDcwID0gTERfRnAzMm04MA0KKyAgeyAxMDcxLAk2LAkxLAkwLAkiTERfRnA2NG0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKSwgMHgxMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTkgfSwgIC8vIEluc3QgIzEwNzEgPSBMRF9GcDY0bQ0KKyAgeyAxMDcyLAk2LAkxLAkwLAkiTERfRnA2NG04MCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTIwIH0sICAvLyBJbnN0ICMxMDcyID0gTERfRnA2NG04MA0KKyAgeyAxMDczLAk2LAkxLAkwLAkiTERfRnA4MG0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjAgfSwgIC8vIEluc3QgIzEwNzMgPSBMRF9GcDgwbQ0KKyAgeyAxMDc0LAkxLAkwLAkwLAkiTERfRnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzAwMDA0MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzEwNzQgPSBMRF9GcnINCisgIHsgMTA3NSwJNiwJMSwJMCwJIkxFQTE2ciIsIDAsIDB4OGQwMDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTMgfSwgIC8vIEluc3QgIzEwNzUgPSBMRUExNnINCisgIHsgMTA3NiwJNiwJMSwJMCwJIkxFQTMyciIsIDB8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4OGQwMDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzEwNzYgPSBMRUEzMnINCisgIHsgMTA3NywJNiwJMSwJMCwJIkxFQTY0XzMyciIsIDAsIDB4OGQwMDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQwIH0sICAvLyBJbnN0ICMxMDc3ID0gTEVBNjRfMzJyDQorICB7IDEwNzgsCTYsCTEsCTAsCSJMRUE2NHIiLCAwfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDhkMDAxMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMxMDc4ID0gTEVBNjRyDQorICB7IDEwNzksCTAsCTAsCTAsCSJMRUFWRSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YzkwMDAwMDFVTEwsIEltcGxpY2l0TGlzdDMyLCBJbXBsaWNpdExpc3QzMiwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMTA3OSA9IExFQVZFDQorICB7IDEwODAsCTAsCTAsCTAsCSJMRUFWRTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhjOTAwMDAwMVVMTCwgSW1wbGljaXRMaXN0MzMsIEltcGxpY2l0TGlzdDMzLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxMDgwID0gTEVBVkU2NA0KKyAgeyAxMDgxLAk2LAkxLAkwLAkiTEVTMTZybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGM0MDAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUzIH0sICAvLyBJbnN0ICMxMDgxID0gTEVTMTZybQ0KKyAgeyAxMDgyLAk2LAkxLAkwLAkiTEVTMzJybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGM0MDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICMxMDgyID0gTEVTMzJybQ0KKyAgeyAxMDgzLAkwLAkwLAkwLAkiTEZFTkNFIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFlMDAwMTI3VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxMDgzID0gTEZFTkNFDQorICB7IDEwODQsCTYsCTEsCTAsCSJMRlMxNnJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjQwMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTMgfSwgIC8vIEluc3QgIzEwODQgPSBMRlMxNnJtDQorICB7IDEwODUsCTYsCTEsCTAsCSJMRlMzMnJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjQwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzEwODUgPSBMRlMzMnJtDQorICB7IDEwODYsCTYsCTEsCTAsCSJMRlM2NHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjQwMDExMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzEwODYgPSBMRlM2NHJtDQorICB7IDEwODcsCTUsCTAsCTAsCSJMR0RUbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwMDAxMWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzEwODcgPSBMR0RUbQ0KKyAgeyAxMDg4LAk2LAkxLAkwLAkiTEdTMTZybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI1MDAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUzIH0sICAvLyBJbnN0ICMxMDg4ID0gTEdTMTZybQ0KKyAgeyAxMDg5LAk2LAkxLAkwLAkiTEdTMzJybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI1MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICMxMDg5ID0gTEdTMzJybQ0KKyAgeyAxMDkwLAk2LAkxLAkwLAkiTEdTNjRybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI1MDAxMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMxMDkwID0gTEdTNjRybQ0KKyAgeyAxMDkxLAk1LAkwLAkwLAkiTElEVG0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDAwMTFiVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMDkxID0gTElEVG0NCisgIHsgMTA5MiwJNSwJMCwJMCwJIkxMRFQxNm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzEwOTIgPSBMTERUMTZtDQorICB7IDEwOTMsCTEsCTAsCTAsCSJMTERUMTZyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTEyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNCB9LCAgLy8gSW5zdCAjMTA5MyA9IExMRFQxNnINCisgIHsgMTA5NCwJNSwJMCwJMCwJIkxNU1cxNm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDAwMTFlVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMDk0ID0gTE1TVzE2bQ0KKyAgeyAxMDk1LAkxLAkwLAkwLAkiTE1TVzE2ciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwMDAxMTZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA0IH0sICAvLyBJbnN0ICMxMDk1ID0gTE1TVzE2cg0KKyAgeyAxMDk2LAk2LAkwLAkwLAkiTE9DS19BREQxNm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDgxMDg2MDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzEwOTYgPSBMT0NLX0FERDE2bWkNCisgIHsgMTA5NywJNiwJMCwJMCwJIkxPQ0tfQUREMTZtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ODMwODIwNThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTA5NyA9IExPQ0tfQUREMTZtaTgNCisgIHsgMTA5OCwJNiwJMCwJMCwJIkxPQ0tfQUREMTZtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDgwMDQ0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTEgfSwgIC8vIEluc3QgIzEwOTggPSBMT0NLX0FERDE2bXINCisgIHsgMTA5OSwJNiwJMCwJMCwJIkxPQ0tfQUREMzJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4MTA4YTAxOFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxMDk5ID0gTE9DS19BREQzMm1pDQorICB7IDExMDAsCTYsCTAsCTAsCSJMT0NLX0FERDMybWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDgzMDgyMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzExMDAgPSBMT0NLX0FERDMybWk4DQorICB7IDExMDEsCTYsCTAsCTAsCSJMT0NLX0FERDMybXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTA4MDAwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMxMTAxID0gTE9DS19BREQzMm1yDQorICB7IDExMDIsCTYsCTAsCTAsCSJMT0NLX0FERDY0bWkzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4MTA4YjAxOFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxMTAyID0gTE9DS19BREQ2NG1pMzINCisgIHsgMTEwMywJNiwJMCwJMCwJIkxPQ0tfQURENjRtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ODMwODMwMThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTEwMyA9IExPQ0tfQURENjRtaTgNCisgIHsgMTEwNCwJNiwJMCwJMCwJIkxPQ0tfQURENjRtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzMDgxMDA0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTkgfSwgIC8vIEluc3QgIzExMDQgPSBMT0NLX0FERDY0bXINCisgIHsgMTEwNSwJNiwJMCwJMCwJIkxPQ0tfQUREOG1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDgwMDgyMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzExMDUgPSBMT0NLX0FERDhtaQ0KKyAgeyAxMTA2LAk2LAkwLAkwLAkiTE9DS19BREQ4bXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ODAwMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNCB9LCAgLy8gSW5zdCAjMTEwNiA9IExPQ0tfQUREOG1yDQorICB7IDExMDcsCTUsCTAsCTAsCSJMT0NLX0RFQzE2bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmZjA4MDA1OVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMTA3ID0gTE9DS19ERUMxNm0NCisgIHsgMTEwOCwJNSwJMCwJMCwJIkxPQ0tfREVDMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZmMDgwMDE5VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzExMDggPSBMT0NLX0RFQzMybQ0KKyAgeyAxMTA5LAk1LAkwLAkwLAkiTE9DS19ERUM2NG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmYwODEwMTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTEwOSA9IExPQ0tfREVDNjRtDQorICB7IDExMTAsCTUsCTAsCTAsCSJMT0NLX0RFQzhtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZlMDgwMDE5VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzExMTAgPSBMT0NLX0RFQzhtDQorICB7IDExMTEsCTUsCTAsCTAsCSJMT0NLX0lOQzE2bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmZjA4MDA1OFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxMTExID0gTE9DS19JTkMxNm0NCisgIHsgMTExMiwJNSwJMCwJMCwJIkxPQ0tfSU5DMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZmMDgwMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzExMTIgPSBMT0NLX0lOQzMybQ0KKyAgeyAxMTEzLAk1LAkwLAkwLAkiTE9DS19JTkM2NG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmYwODEwMThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTExMyA9IExPQ0tfSU5DNjRtDQorICB7IDExMTQsCTUsCTAsCTAsCSJMT0NLX0lOQzhtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZlMDgwMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzExMTQgPSBMT0NLX0lOQzhtDQorICB7IDExMTUsCTAsCTAsCTAsCSJMT0NLX1BSRUZJWCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGYwMDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxMTE1ID0gTE9DS19QUkVGSVgNCisgIHsgMTExNiwJNiwJMCwJMCwJIkxPQ0tfU1VCMTZtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4MTA4NjA1ZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxMTE2ID0gTE9DS19TVUIxNm1pDQorICB7IDExMTcsCTYsCTAsCTAsCSJMT0NLX1NVQjE2bWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDgzMDgyMDVkVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzExMTcgPSBMT0NLX1NVQjE2bWk4DQorICB7IDExMTgsCTYsCTAsCTAsCSJMT0NLX1NVQjE2bXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MjkwODAwNDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjMTExOCA9IExPQ0tfU1VCMTZtcg0KKyAgeyAxMTE5LAk2LAkwLAkwLAkiTE9DS19TVUIzMm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDgxMDhhMDFkVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzExMTkgPSBMT0NLX1NVQjMybWkNCisgIHsgMTEyMCwJNiwJMCwJMCwJIkxPQ0tfU1VCMzJtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ODMwODIwMWRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTEyMCA9IExPQ0tfU1VCMzJtaTgNCisgIHsgMTEyMSwJNiwJMCwJMCwJIkxPQ0tfU1VCMzJtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyOTA4MDAwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMxMTIxID0gTE9DS19TVUIzMm1yDQorICB7IDExMjIsCTYsCTAsCTAsCSJMT0NLX1NVQjY0bWkzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4MTA4YjAxZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxMTIyID0gTE9DS19TVUI2NG1pMzINCisgIHsgMTEyMywJNiwJMCwJMCwJIkxPQ0tfU1VCNjRtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ODMwODMwMWRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTEyMyA9IExPQ0tfU1VCNjRtaTgNCisgIHsgMTEyNCwJNiwJMCwJMCwJIkxPQ0tfU1VCNjRtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyOTA4MTAwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE5IH0sICAvLyBJbnN0ICMxMTI0ID0gTE9DS19TVUI2NG1yDQorICB7IDExMjUsCTYsCTAsCTAsCSJMT0NLX1NVQjhtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4MDA4MjAxZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxMTI1ID0gTE9DS19TVUI4bWkNCisgIHsgMTEyNiwJNiwJMCwJMCwJIkxPQ0tfU1VCOG1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDI4MDgwMDA0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjQgfSwgIC8vIEluc3QgIzExMjYgPSBMT0NLX1NVQjhtcg0KKyAgeyAxMTI3LAkwLAkwLAkwLAkiTE9EU0IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhYzAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMTEyNyA9IExPRFNCDQorICB7IDExMjgsCTAsCTAsCTAsCSJMT0RTRCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFkMDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxMTI4ID0gTE9EU0QNCisgIHsgMTEyOSwJMCwJMCwJMCwJIkxPRFNRIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YWQwMDEwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzExMjkgPSBMT0RTUQ0KKyAgeyAxMTMwLAkwLAkwLAkwLAkiTE9EU1ciLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhZDAwMDA0MVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMTEzMCA9IExPRFNXDQorICB7IDExMzEsCTEsCTAsCTAsCSJMT09QIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTIwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTEzMSA9IExPT1ANCisgIHsgMTEzMiwJMSwJMCwJMCwJIkxPT1BFIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTEwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTEzMiA9IExPT1BFDQorICB7IDExMzMsCTEsCTAsCTAsCSJMT09QTkUiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlMDAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMTMzID0gTE9PUE5FDQorICB7IDExMzQsCTAsCTAsCTAsCSJMUkVUIiwgMHwoMTw8VElEOjpSZXR1cm4pfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjYjA3MDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMTEzNCA9IExSRVQNCisgIHsgMTEzNSwJMSwJMCwJMCwJIkxSRVRJIiwgMHwoMTw8VElEOjpSZXR1cm4pfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjYTA3NjAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMTM1ID0gTFJFVEkNCisgIHsgMTEzNiwJNiwJMSwJMCwJIkxTTDE2cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzMDAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUzIH0sICAvLyBJbnN0ICMxMTM2ID0gTFNMMTZybQ0KKyAgeyAxMTM3LAkyLAkxLAkwLAkiTFNMMTZyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDMwMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTQgfSwgIC8vIEluc3QgIzExMzcgPSBMU0wxNnJyDQorICB7IDExMzgsCTYsCTEsCTAsCSJMU0wzMnJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NSB9LCAgLy8gSW5zdCAjMTEzOCA9IExTTDMycm0NCisgIHsgMTEzOSwJMiwJMSwJMCwJIkxTTDMycnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU2IH0sICAvLyBJbnN0ICMxMTM5ID0gTFNMMzJycg0KKyAgeyAxMTQwLAk2LAkxLAkwLAkiTFNMNjRybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDMwMDExMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzExNDAgPSBMU0w2NHJtDQorICB7IDExNDEsCTIsCTEsCTAsCSJMU0w2NHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzAwMTEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81OCB9LCAgLy8gSW5zdCAjMTE0MSA9IExTTDY0cnINCisgIHsgMTE0MiwJNiwJMSwJMCwJIkxTUzE2cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiMjAwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MyB9LCAgLy8gSW5zdCAjMTE0MiA9IExTUzE2cm0NCisgIHsgMTE0MywJNiwJMSwJMCwJIkxTUzMycm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiMjAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NSB9LCAgLy8gSW5zdCAjMTE0MyA9IExTUzMycm0NCisgIHsgMTE0NCwJNiwJMSwJMCwJIkxTUzY0cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiMjAwMTEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjMTE0NCA9IExTUzY0cm0NCisgIHsgMTE0NSwJNSwJMCwJMCwJIkxUUm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMWJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzExNDUgPSBMVFJtDQorICB7IDExNDYsCTEsCTAsCTAsCSJMVFJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTEzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNCB9LCAgLy8gSW5zdCAjMTE0NiA9IExUUnINCisgIHsgMTE0NywJNywJMSwJMCwJIkxYQUREMTYiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhjMTA4MDE0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICMxMTQ3ID0gTFhBREQxNg0KKyAgeyAxMTQ4LAk3LAkxLAkwLAkiTFhBREQzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMxMDgwMTA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTcgfSwgIC8vIEluc3QgIzExNDggPSBMWEFERDMyDQorICB7IDExNDksCTcsCTEsCTAsCSJMWEFERDY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YzEwODExMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjMTE0OSA9IExYQURENjQNCisgIHsgMTE1MCwJNywJMSwJMCwJIkxYQUREOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMwMDgwMTA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjYgfSwgIC8vIEluc3QgIzExNTAgPSBMWEFERDgNCisgIHsgMTE1MSwJMiwJMCwJMCwJIk1BU0tNT1ZEUVUiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjdjMDAxNDVVTEwsIEltcGxpY2l0TGlzdDM0LCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMxMTUxID0gTUFTS01PVkRRVQ0KKyAgeyAxMTUyLAkyLAkwLAkwLAkiTUFTS01PVkRRVTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGY3YzAwMTQ1VUxMLCBJbXBsaWNpdExpc3QzNSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTE1MiA9IE1BU0tNT1ZEUVU2NA0KKyAgeyAxMTUzLAk3LAkxLAkwLAkiTUFYUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWY4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNTMgPSBNQVhQRHJtDQorICB7IDExNTQsCTcsCTEsCTAsCSJNQVhQRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWY4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNTQgPSBNQVhQRHJtX0ludA0KKyAgeyAxMTU1LAkzLAkxLAkwLAkiTUFYUERyciIsIDAsIDB4NWY4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNTUgPSBNQVhQRHJyDQorICB7IDExNTYsCTMsCTEsCTAsCSJNQVhQRHJyX0ludCIsIDAsIDB4NWY4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNTYgPSBNQVhQRHJyX0ludA0KKyAgeyAxMTU3LAk3LAkxLAkwLAkiTUFYUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWY0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNTcgPSBNQVhQU3JtDQorICB7IDExNTgsCTcsCTEsCTAsCSJNQVhQU3JtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWY0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNTggPSBNQVhQU3JtX0ludA0KKyAgeyAxMTU5LAkzLAkxLAkwLAkiTUFYUFNyciIsIDAsIDB4NWY0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNTkgPSBNQVhQU3JyDQorICB7IDExNjAsCTMsCTEsCTAsCSJNQVhQU3JyX0ludCIsIDAsIDB4NWY0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNjAgPSBNQVhQU3JyX0ludA0KKyAgeyAxMTYxLAk3LAkxLAkwLAkiTUFYU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWYwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzAgfSwgIC8vIEluc3QgIzExNjEgPSBNQVhTRHJtDQorICB7IDExNjIsCTcsCTEsCTAsCSJNQVhTRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWYwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNjIgPSBNQVhTRHJtX0ludA0KKyAgeyAxMTYzLAkzLAkxLAkwLAkiTUFYU0RyciIsIDAsIDB4NWYwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzEgfSwgIC8vIEluc3QgIzExNjMgPSBNQVhTRHJyDQorICB7IDExNjQsCTMsCTEsCTAsCSJNQVhTRHJyX0ludCIsIDAsIDB4NWYwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNjQgPSBNQVhTRHJyX0ludA0KKyAgeyAxMTY1LAk3LAkxLAkwLAkiTUFYU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWYwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzIgfSwgIC8vIEluc3QgIzExNjUgPSBNQVhTU3JtDQorICB7IDExNjYsCTcsCTEsCTAsCSJNQVhTU3JtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWYwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNjYgPSBNQVhTU3JtX0ludA0KKyAgeyAxMTY3LAkzLAkxLAkwLAkiTUFYU1NyciIsIDAsIDB4NWYwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzMgfSwgIC8vIEluc3QgIzExNjcgPSBNQVhTU3JyDQorICB7IDExNjgsCTMsCTEsCTAsCSJNQVhTU3JyX0ludCIsIDAsIDB4NWYwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNjggPSBNQVhTU3JyX0ludA0KKyAgeyAxMTY5LAkwLAkwLAkwLAkiTUZFTkNFIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFlMDAwMTI4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxMTY5ID0gTUZFTkNFDQorICB7IDExNzAsCTAsCTAsCTAsCSJNSU5HV19BTExPQ0EiLCAwfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMTE3MCA9IE1JTkdXX0FMTE9DQQ0KKyAgeyAxMTcxLAk3LAkxLAkwLAkiTUlOUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQ4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNzEgPSBNSU5QRHJtDQorICB7IDExNzIsCTcsCTEsCTAsCSJNSU5QRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQ4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNzIgPSBNSU5QRHJtX0ludA0KKyAgeyAxMTczLAkzLAkxLAkwLAkiTUlOUERyciIsIDAsIDB4NWQ4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNzMgPSBNSU5QRHJyDQorICB7IDExNzQsCTMsCTEsCTAsCSJNSU5QRHJyX0ludCIsIDAsIDB4NWQ4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNzQgPSBNSU5QRHJyX0ludA0KKyAgeyAxMTc1LAk3LAkxLAkwLAkiTUlOUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQ0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNzUgPSBNSU5QU3JtDQorICB7IDExNzYsCTcsCTEsCTAsCSJNSU5QU3JtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQ0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExNzYgPSBNSU5QU3JtX0ludA0KKyAgeyAxMTc3LAkzLAkxLAkwLAkiTUlOUFNyciIsIDAsIDB4NWQ0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNzcgPSBNSU5QU3JyDQorICB7IDExNzgsCTMsCTEsCTAsCSJNSU5QU3JyX0ludCIsIDAsIDB4NWQ0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExNzggPSBNSU5QU3JyX0ludA0KKyAgeyAxMTc5LAk3LAkxLAkwLAkiTUlOU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzAgfSwgIC8vIEluc3QgIzExNzkgPSBNSU5TRHJtDQorICB7IDExODAsCTcsCTEsCTAsCSJNSU5TRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExODAgPSBNSU5TRHJtX0ludA0KKyAgeyAxMTgxLAkzLAkxLAkwLAkiTUlOU0RyciIsIDAsIDB4NWQwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzEgfSwgIC8vIEluc3QgIzExODEgPSBNSU5TRHJyDQorICB7IDExODIsCTMsCTEsCTAsCSJNSU5TRHJyX0ludCIsIDAsIDB4NWQwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExODIgPSBNSU5TRHJyX0ludA0KKyAgeyAxMTgzLAk3LAkxLAkwLAkiTUlOU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzIgfSwgIC8vIEluc3QgIzExODMgPSBNSU5TU3JtDQorICB7IDExODQsCTcsCTEsCTAsCSJNSU5TU3JtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzExODQgPSBNSU5TU3JtX0ludA0KKyAgeyAxMTg1LAkzLAkxLAkwLAkiTUlOU1NyciIsIDAsIDB4NWQwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzMgfSwgIC8vIEluc3QgIzExODUgPSBNSU5TU3JyDQorICB7IDExODYsCTMsCTEsCTAsCSJNSU5TU3JyX0ludCIsIDAsIDB4NWQwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzExODYgPSBNSU5TU3JyX0ludA0KKyAgeyAxMTg3LAk2LAkxLAkwLAkiTU1YX0NWVFBEMlBJcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJkMDAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyNyB9LCAgLy8gSW5zdCAjMTE4NyA9IE1NWF9DVlRQRDJQSXJtDQorICB7IDExODgsCTIsCTEsCTAsCSJNTVhfQ1ZUUEQyUElyciIsIDAsIDB4MmQwMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTI4IH0sICAvLyBJbnN0ICMxMTg4ID0gTU1YX0NWVFBEMlBJcnINCisgIHsgMTE4OSwJNiwJMSwJMCwJIk1NWF9DVlRQSTJQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYTAwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMTE4OSA9IE1NWF9DVlRQSTJQRHJtDQorICB7IDExOTAsCTIsCTEsCTAsCSJNTVhfQ1ZUUEkyUERyciIsIDAsIDB4MmEwMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTI5IH0sICAvLyBJbnN0ICMxMTkwID0gTU1YX0NWVFBJMlBEcnINCisgIHsgMTE5MSwJNiwJMSwJMCwJIk1NWF9DVlRQSTJQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMTE5MSA9IE1NWF9DVlRQSTJQU3JtDQorICB7IDExOTIsCTIsCTEsCTAsCSJNTVhfQ1ZUUEkyUFNyciIsIDAsIDB4MmEwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTI5IH0sICAvLyBJbnN0ICMxMTkyID0gTU1YX0NWVFBJMlBTcnINCisgIHsgMTE5MywJNiwJMSwJMCwJIk1NWF9DVlRQUzJQSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyZDAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjcgfSwgIC8vIEluc3QgIzExOTMgPSBNTVhfQ1ZUUFMyUElybQ0KKyAgeyAxMTk0LAkyLAkxLAkwLAkiTU1YX0NWVFBTMlBJcnIiLCAwLCAweDJkMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyOCB9LCAgLy8gSW5zdCAjMTE5NCA9IE1NWF9DVlRQUzJQSXJyDQorICB7IDExOTUsCTYsCTEsCTAsCSJNTVhfQ1ZUVFBEMlBJcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJjMDAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyNyB9LCAgLy8gSW5zdCAjMTE5NSA9IE1NWF9DVlRUUEQyUElybQ0KKyAgeyAxMTk2LAkyLAkxLAkwLAkiTU1YX0NWVFRQRDJQSXJyIiwgMCwgMHgyYzAwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjggfSwgIC8vIEluc3QgIzExOTYgPSBNTVhfQ1ZUVFBEMlBJcnINCisgIHsgMTE5NywJNiwJMSwJMCwJIk1NWF9DVlRUUFMyUElybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmMwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTI3IH0sICAvLyBJbnN0ICMxMTk3ID0gTU1YX0NWVFRQUzJQSXJtDQorICB7IDExOTgsCTIsCTEsCTAsCSJNTVhfQ1ZUVFBTMlBJcnIiLCAwLCAweDJjMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyOCB9LCAgLy8gSW5zdCAjMTE5OCA9IE1NWF9DVlRUUFMyUElycg0KKyAgeyAxMTk5LAkwLAkwLAkwLAkiTU1YX0VNTVMiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzcwMDAxMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzExOTkgPSBNTVhfRU1NUw0KKyAgeyAxMjAwLAkwLAkwLAkwLAkiTU1YX0ZFTU1TIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGUwMDAxMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzEyMDAgPSBNTVhfRkVNTVMNCisgIHsgMTIwMSwJMiwJMCwJMCwJIk1NWF9NQVNLTU9WUSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNzAwMDEwNVVMTCwgSW1wbGljaXRMaXN0MzQsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQxIH0sICAvLyBJbnN0ICMxMjAxID0gTU1YX01BU0tNT1ZRDQorICB7IDEyMDIsCTIsCTAsCTAsCSJNTVhfTUFTS01PVlE2NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmNzAwMDEwNVVMTCwgSW1wbGljaXRMaXN0MzUsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQxIH0sICAvLyBJbnN0ICMxMjAyID0gTU1YX01BU0tNT1ZRNjQNCisgIHsgMTIwMywJMiwJMSwJMCwJIk1NWF9NT1ZENjRmcm9tNjRyciIsIDAsIDB4N2UwMDExMDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQyIH0sICAvLyBJbnN0ICMxMjAzID0gTU1YX01PVkQ2NGZyb202NHJyDQorICB7IDEyMDQsCTIsCTAsCTAsCSJNTVhfTU9WRDY0Z3JyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2UwMDAxMDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQzIH0sICAvLyBJbnN0ICMxMjA0ID0gTU1YX01PVkQ2NGdycg0KKyAgeyAxMjA1LAk2LAkwLAkwLAkiTU1YX01PVkQ2NG1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdlMDAwMTA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0NCB9LCAgLy8gSW5zdCAjMTIwNSA9IE1NWF9NT1ZENjRtcg0KKyAgeyAxMjA2LAk2LAkxLAkwLAkiTU1YX01PVkQ2NHJtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4NmUwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTI3IH0sICAvLyBJbnN0ICMxMjA2ID0gTU1YX01PVkQ2NHJtDQorICB7IDEyMDcsCTIsCTEsCTAsCSJNTVhfTU9WRDY0cnIiLCAwLCAweDZlMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0NSB9LCAgLy8gSW5zdCAjMTIwNyA9IE1NWF9NT1ZENjRycg0KKyAgeyAxMjA4LAkyLAkxLAkwLAkiTU1YX01PVkQ2NHJydjE2NCIsIDAsIDB4NmUwMDExMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ2IH0sICAvLyBJbnN0ICMxMjA4ID0gTU1YX01PVkQ2NHJydjE2NA0KKyAgeyAxMjA5LAkyLAkxLAkwLAkiTU1YX01PVkQ2NHRvNjRyciIsIDAsIDB4NmUwMDExMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ2IH0sICAvLyBJbnN0ICMxMjA5ID0gTU1YX01PVkQ2NHRvNjRycg0KKyAgeyAxMjEwLAkyLAkxLAkwLAkiTU1YX01PVkRRMlFyciIsIDAsIDB4ZDYwMDJiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTI4IH0sICAvLyBJbnN0ICMxMjEwID0gTU1YX01PVkRRMlFycg0KKyAgeyAxMjExLAkyLAkxLAkwLAkiTU1YX01PVkZSNjQyUXJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDYwMDJiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ3IH0sICAvLyBJbnN0ICMxMjExID0gTU1YX01PVkZSNjQyUXJyDQorICB7IDEyMTIsCTYsCTAsCTAsCSJNTVhfTU9WTlRRbXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTcwMDAxMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ0IH0sICAvLyBJbnN0ICMxMjEyID0gTU1YX01PVk5UUW1yDQorICB7IDEyMTMsCTIsCTEsCTAsCSJNTVhfTU9WUTJEUXJyIiwgMCwgMHhkNjAwMmMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjkgfSwgIC8vIEluc3QgIzEyMTMgPSBNTVhfTU9WUTJEUXJyDQorICB7IDEyMTQsCTIsCTEsCTAsCSJNTVhfTU9WUTJGUjY0cnIiLCAwLCAweGQ2MDAyYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OCB9LCAgLy8gSW5zdCAjMTIxNCA9IE1NWF9NT1ZRMkZSNjRycg0KKyAgeyAxMjE1LAk2LAkwLAkwLAkiTU1YX01PVlE2NG1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4N2YwMDAxMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ0IH0sICAvLyBJbnN0ICMxMjE1ID0gTU1YX01PVlE2NG1yDQorICB7IDEyMTYsCTYsCTEsCTAsCSJNTVhfTU9WUTY0cm0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKSwgMHg2ZjAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjcgfSwgIC8vIEluc3QgIzEyMTYgPSBNTVhfTU9WUTY0cm0NCisgIHsgMTIxNywJMiwJMSwJMCwJIk1NWF9NT1ZRNjRyciIsIDAsIDB4NmYwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQxIH0sICAvLyBJbnN0ICMxMjE3ID0gTU1YX01PVlE2NHJyDQorICB7IDEyMTgsCTYsCTEsCTAsCSJNTVhfTU9WWkRJMlBESXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2ZTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMjcgfSwgIC8vIEluc3QgIzEyMTggPSBNTVhfTU9WWkRJMlBESXJtDQorICB7IDEyMTksCTIsCTEsCTAsCSJNTVhfTU9WWkRJMlBESXJyIiwgMCwgMHg2ZTAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDUgfSwgIC8vIEluc3QgIzEyMTkgPSBNTVhfTU9WWkRJMlBESXJyDQorICB7IDEyMjAsCTcsCTEsCTAsCSJNTVhfUEFDS1NTRFdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NmIwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMjIwID0gTU1YX1BBQ0tTU0RXcm0NCisgIHsgMTIyMSwJMywJMSwJMCwJIk1NWF9QQUNLU1NEV3JyIiwgMCwgMHg2YjAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEyMjEgPSBNTVhfUEFDS1NTRFdycg0KKyAgeyAxMjIyLAk3LAkxLAkwLAkiTU1YX1BBQ0tTU1dCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDYzMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTIyMiA9IE1NWF9QQUNLU1NXQnJtDQorICB7IDEyMjMsCTMsCTEsCTAsCSJNTVhfUEFDS1NTV0JyciIsIDAsIDB4NjMwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjIzID0gTU1YX1BBQ0tTU1dCcnINCisgIHsgMTIyNCwJNywJMSwJMCwJIk1NWF9QQUNLVVNXQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2NzAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEyMjQgPSBNTVhfUEFDS1VTV0JybQ0KKyAgeyAxMjI1LAkzLAkxLAkwLAkiTU1YX1BBQ0tVU1dCcnIiLCAwLCAweDY3MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTIyNSA9IE1NWF9QQUNLVVNXQnJyDQorICB7IDEyMjYsCTcsCTEsCTAsCSJNTVhfUEFEREJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZmMwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMjI2ID0gTU1YX1BBRERCcm0NCisgIHsgMTIyNywJMywJMSwJMCwJIk1NWF9QQUREQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhmYzAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEyMjcgPSBNTVhfUEFEREJycg0KKyAgeyAxMjI4LAk3LAkxLAkwLAkiTU1YX1BBREREcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGZlMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTIyOCA9IE1NWF9QQURERHJtDQorICB7IDEyMjksCTMsCTEsCTAsCSJNTVhfUEFERERyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZmUwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjI5ID0gTU1YX1BBREREcnINCisgIHsgMTIzMCwJNywJMSwJMCwJIk1NWF9QQUREUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkNDAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEyMzAgPSBNTVhfUEFERFFybQ0KKyAgeyAxMjMxLAkzLAkxLAkwLAkiTU1YX1BBRERRcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGQ0MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTIzMSA9IE1NWF9QQUREUXJyDQorICB7IDEyMzIsCTcsCTEsCTAsCSJNTVhfUEFERFNCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGVjMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTIzMiA9IE1NWF9QQUREU0JybQ0KKyAgeyAxMjMzLAkzLAkxLAkwLAkiTU1YX1BBRERTQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhlYzAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEyMzMgPSBNTVhfUEFERFNCcnINCisgIHsgMTIzNCwJNywJMSwJMCwJIk1NWF9QQUREU1dybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZWQwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMjM0ID0gTU1YX1BBRERTV3JtDQorICB7IDEyMzUsCTMsCTEsCTAsCSJNTVhfUEFERFNXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGVkMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTIzNSA9IE1NWF9QQUREU1dycg0KKyAgeyAxMjM2LAk3LAkxLAkwLAkiTU1YX1BBRERVU0JybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZGMwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMjM2ID0gTU1YX1BBRERVU0JybQ0KKyAgeyAxMjM3LAkzLAkxLAkwLAkiTU1YX1BBRERVU0JyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZGMwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjM3ID0gTU1YX1BBRERVU0Jycg0KKyAgeyAxMjM4LAk3LAkxLAkwLAkiTU1YX1BBRERVU1dybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZGQwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMjM4ID0gTU1YX1BBRERVU1dybQ0KKyAgeyAxMjM5LAkzLAkxLAkwLAkiTU1YX1BBRERVU1dyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZGQwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjM5ID0gTU1YX1BBRERVU1dycg0KKyAgeyAxMjQwLAk3LAkxLAkwLAkiTU1YX1BBRERXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGZkMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI0MCA9IE1NWF9QQUREV3JtDQorICB7IDEyNDEsCTMsCTEsCTAsCSJNTVhfUEFERFdyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZmQwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjQxID0gTU1YX1BBRERXcnINCisgIHsgMTI0MiwJNywJMSwJMCwJIk1NWF9QQU5ETnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkZjAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEyNDIgPSBNTVhfUEFORE5ybQ0KKyAgeyAxMjQzLAkzLAkxLAkwLAkiTU1YX1BBTkROcnIiLCAwLCAweGRmMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI0MyA9IE1NWF9QQU5ETnJyDQorICB7IDEyNDQsCTcsCTEsCTAsCSJNTVhfUEFORHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkYjAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEyNDQgPSBNTVhfUEFORHJtDQorICB7IDEyNDUsCTMsCTEsCTAsCSJNTVhfUEFORHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhkYjAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEyNDUgPSBNTVhfUEFORHJyDQorICB7IDEyNDYsCTcsCTEsCTAsCSJNTVhfUEFWR0JybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZTAwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMjQ2ID0gTU1YX1BBVkdCcm0NCisgIHsgMTI0NywJMywJMSwJMCwJIk1NWF9QQVZHQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhlMDAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEyNDcgPSBNTVhfUEFWR0Jycg0KKyAgeyAxMjQ4LAk3LAkxLAkwLAkiTU1YX1BBVkdXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGUzMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI0OCA9IE1NWF9QQVZHV3JtDQorICB7IDEyNDksCTMsCTEsCTAsCSJNTVhfUEFWR1dyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZTMwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjQ5ID0gTU1YX1BBVkdXcnINCisgIHsgMTI1MCwJNywJMSwJMCwJIk1NWF9QQ01QRVFCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDc0MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI1MCA9IE1NWF9QQ01QRVFCcm0NCisgIHsgMTI1MSwJMywJMSwJMCwJIk1NWF9QQ01QRVFCcnIiLCAwLCAweDc0MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI1MSA9IE1NWF9QQ01QRVFCcnINCisgIHsgMTI1MiwJNywJMSwJMCwJIk1NWF9QQ01QRVFEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDc2MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI1MiA9IE1NWF9QQ01QRVFEcm0NCisgIHsgMTI1MywJMywJMSwJMCwJIk1NWF9QQ01QRVFEcnIiLCAwLCAweDc2MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI1MyA9IE1NWF9QQ01QRVFEcnINCisgIHsgMTI1NCwJNywJMSwJMCwJIk1NWF9QQ01QRVFXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDc1MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI1NCA9IE1NWF9QQ01QRVFXcm0NCisgIHsgMTI1NSwJMywJMSwJMCwJIk1NWF9QQ01QRVFXcnIiLCAwLCAweDc1MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI1NSA9IE1NWF9QQ01QRVFXcnINCisgIHsgMTI1NiwJNywJMSwJMCwJIk1NWF9QQ01QR1RCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDY0MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI1NiA9IE1NWF9QQ01QR1RCcm0NCisgIHsgMTI1NywJMywJMSwJMCwJIk1NWF9QQ01QR1RCcnIiLCAwLCAweDY0MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI1NyA9IE1NWF9QQ01QR1RCcnINCisgIHsgMTI1OCwJNywJMSwJMCwJIk1NWF9QQ01QR1REcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDY2MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI1OCA9IE1NWF9QQ01QR1REcm0NCisgIHsgMTI1OSwJMywJMSwJMCwJIk1NWF9QQ01QR1REcnIiLCAwLCAweDY2MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI1OSA9IE1NWF9QQ01QR1REcnINCisgIHsgMTI2MCwJNywJMSwJMCwJIk1NWF9QQ01QR1RXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDY1MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI2MCA9IE1NWF9QQ01QR1RXcm0NCisgIHsgMTI2MSwJMywJMSwJMCwJIk1NWF9QQ01QR1RXcnIiLCAwLCAweDY1MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI2MSA9IE1NWF9QQ01QR1RXcnINCisgIHsgMTI2MiwJMywJMSwJMCwJIk1NWF9QRVhUUldyaSIsIDAsIDB4YzUwMDIxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUxIH0sICAvLyBJbnN0ICMxMjYyID0gTU1YX1BFWFRSV3JpDQorICB7IDEyNjMsCTgsCTEsCTAsCSJNTVhfUElOU1JXcm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhjNDAwMjEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTIgfSwgIC8vIEluc3QgIzEyNjMgPSBNTVhfUElOU1JXcm1pDQorICB7IDEyNjQsCTQsCTEsCTAsCSJNTVhfUElOU1JXcnJpIiwgMCwgMHhjNDAwMjEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTMgfSwgIC8vIEluc3QgIzEyNjQgPSBNTVhfUElOU1JXcnJpDQorICB7IDEyNjUsCTcsCTEsCTAsCSJNTVhfUE1BRERXRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmNTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEyNjUgPSBNTVhfUE1BRERXRHJtDQorICB7IDEyNjYsCTMsCTEsCTAsCSJNTVhfUE1BRERXRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhmNTAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEyNjYgPSBNTVhfUE1BRERXRHJyDQorICB7IDEyNjcsCTcsCTEsCTAsCSJNTVhfUE1BWFNXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGVlMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI2NyA9IE1NWF9QTUFYU1dybQ0KKyAgeyAxMjY4LAkzLAkxLAkwLAkiTU1YX1BNQVhTV3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhlZTAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEyNjggPSBNTVhfUE1BWFNXcnINCisgIHsgMTI2OSwJNywJMSwJMCwJIk1NWF9QTUFYVUJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZGUwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMjY5ID0gTU1YX1BNQVhVQnJtDQorICB7IDEyNzAsCTMsCTEsCTAsCSJNTVhfUE1BWFVCcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGRlMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI3MCA9IE1NWF9QTUFYVUJycg0KKyAgeyAxMjcxLAk3LAkxLAkwLAkiTU1YX1BNSU5TV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlYTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEyNzEgPSBNTVhfUE1JTlNXcm0NCisgIHsgMTI3MiwJMywJMSwJMCwJIk1NWF9QTUlOU1dyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZWEwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjcyID0gTU1YX1BNSU5TV3JyDQorICB7IDEyNzMsCTcsCTEsCTAsCSJNTVhfUE1JTlVCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGRhMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI3MyA9IE1NWF9QTUlOVUJybQ0KKyAgeyAxMjc0LAkzLAkxLAkwLAkiTU1YX1BNSU5VQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhkYTAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEyNzQgPSBNTVhfUE1JTlVCcnINCisgIHsgMTI3NSwJMiwJMSwJMCwJIk1NWF9QTU9WTVNLQnJyIiwgMCwgMHhkNzAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDMgfSwgIC8vIEluc3QgIzEyNzUgPSBNTVhfUE1PVk1TS0Jycg0KKyAgeyAxMjc2LAk3LAkxLAkwLAkiTU1YX1BNVUxIVVdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZTQwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMjc2ID0gTU1YX1BNVUxIVVdybQ0KKyAgeyAxMjc3LAkzLAkxLAkwLAkiTU1YX1BNVUxIVVdyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZTQwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjc3ID0gTU1YX1BNVUxIVVdycg0KKyAgeyAxMjc4LAk3LAkxLAkwLAkiTU1YX1BNVUxIV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlNTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEyNzggPSBNTVhfUE1VTEhXcm0NCisgIHsgMTI3OSwJMywJMSwJMCwJIk1NWF9QTVVMSFdyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZTUwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjc5ID0gTU1YX1BNVUxIV3JyDQorICB7IDEyODAsCTcsCTEsCTAsCSJNTVhfUE1VTExXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGQ1MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI4MCA9IE1NWF9QTVVMTFdybQ0KKyAgeyAxMjgxLAkzLAkxLAkwLAkiTU1YX1BNVUxMV3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhkNTAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEyODEgPSBNTVhfUE1VTExXcnINCisgIHsgMTI4MiwJNywJMSwJMCwJIk1NWF9QTVVMVURRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGY0MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI4MiA9IE1NWF9QTVVMVURRcm0NCisgIHsgMTI4MywJMywJMSwJMCwJIk1NWF9QTVVMVURRcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGY0MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI4MyA9IE1NWF9QTVVMVURRcnINCisgIHsgMTI4NCwJNywJMSwJMCwJIk1NWF9QT1JybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZWIwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMjg0ID0gTU1YX1BPUnJtDQorICB7IDEyODUsCTMsCTEsCTAsCSJNTVhfUE9ScnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGViMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTI4NSA9IE1NWF9QT1Jycg0KKyAgeyAxMjg2LAk3LAkxLAkwLAkiTU1YX1BTQURCV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmNjAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEyODYgPSBNTVhfUFNBREJXcm0NCisgIHsgMTI4NywJMywJMSwJMCwJIk1NWF9QU0FEQldyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZjYwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjg3ID0gTU1YX1BTQURCV3JyDQorICB7IDEyODgsCTcsCTEsCTAsCSJNTVhfUFNIVUZXbWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDcwMDAyMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1NCB9LCAgLy8gSW5zdCAjMTI4OCA9IE1NWF9QU0hVRldtaQ0KKyAgeyAxMjg5LAkzLAkxLAkwLAkiTU1YX1BTSFVGV3JpIiwgMCwgMHg3MDAwMjEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTUgfSwgIC8vIEluc3QgIzEyODkgPSBNTVhfUFNIVUZXcmkNCisgIHsgMTI5MCwJMywJMSwJMCwJIk1NWF9QU0xMRHJpIiwgMCwgMHg3MjAwMjExNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTYgfSwgIC8vIEluc3QgIzEyOTAgPSBNTVhfUFNMTERyaQ0KKyAgeyAxMjkxLAk3LAkxLAkwLAkiTU1YX1BTTExEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGYyMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI5MSA9IE1NWF9QU0xMRHJtDQorICB7IDEyOTIsCTMsCTEsCTAsCSJNTVhfUFNMTERyciIsIDAsIDB4ZjIwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjkyID0gTU1YX1BTTExEcnINCisgIHsgMTI5MywJMywJMSwJMCwJIk1NWF9QU0xMUXJpIiwgMCwgMHg3MzAwMjExNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTYgfSwgIC8vIEluc3QgIzEyOTMgPSBNTVhfUFNMTFFyaQ0KKyAgeyAxMjk0LAk3LAkxLAkwLAkiTU1YX1BTTExRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGYzMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI5NCA9IE1NWF9QU0xMUXJtDQorICB7IDEyOTUsCTMsCTEsCTAsCSJNTVhfUFNMTFFyciIsIDAsIDB4ZjMwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjk1ID0gTU1YX1BTTExRcnINCisgIHsgMTI5NiwJMywJMSwJMCwJIk1NWF9QU0xMV3JpIiwgMCwgMHg3MTAwMjExNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTYgfSwgIC8vIEluc3QgIzEyOTYgPSBNTVhfUFNMTFdyaQ0KKyAgeyAxMjk3LAk3LAkxLAkwLAkiTU1YX1BTTExXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGYxMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTI5NyA9IE1NWF9QU0xMV3JtDQorICB7IDEyOTgsCTMsCTEsCTAsCSJNTVhfUFNMTFdyciIsIDAsIDB4ZjEwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMjk4ID0gTU1YX1BTTExXcnINCisgIHsgMTI5OSwJMywJMSwJMCwJIk1NWF9QU1JBRHJpIiwgMCwgMHg3MjAwMjExNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTYgfSwgIC8vIEluc3QgIzEyOTkgPSBNTVhfUFNSQURyaQ0KKyAgeyAxMzAwLAk3LAkxLAkwLAkiTU1YX1BTUkFEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGUyMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTMwMCA9IE1NWF9QU1JBRHJtDQorICB7IDEzMDEsCTMsCTEsCTAsCSJNTVhfUFNSQURyciIsIDAsIDB4ZTIwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzAxID0gTU1YX1BTUkFEcnINCisgIHsgMTMwMiwJMywJMSwJMCwJIk1NWF9QU1JBV3JpIiwgMCwgMHg3MTAwMjExNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTYgfSwgIC8vIEluc3QgIzEzMDIgPSBNTVhfUFNSQVdyaQ0KKyAgeyAxMzAzLAk3LAkxLAkwLAkiTU1YX1BTUkFXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGUxMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTMwMyA9IE1NWF9QU1JBV3JtDQorICB7IDEzMDQsCTMsCTEsCTAsCSJNTVhfUFNSQVdyciIsIDAsIDB4ZTEwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzA0ID0gTU1YX1BTUkFXcnINCisgIHsgMTMwNSwJMywJMSwJMCwJIk1NWF9QU1JMRHJpIiwgMCwgMHg3MjAwMjExMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTYgfSwgIC8vIEluc3QgIzEzMDUgPSBNTVhfUFNSTERyaQ0KKyAgeyAxMzA2LAk3LAkxLAkwLAkiTU1YX1BTUkxEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGQyMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTMwNiA9IE1NWF9QU1JMRHJtDQorICB7IDEzMDcsCTMsCTEsCTAsCSJNTVhfUFNSTERyciIsIDAsIDB4ZDIwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzA3ID0gTU1YX1BTUkxEcnINCisgIHsgMTMwOCwJMywJMSwJMCwJIk1NWF9QU1JMUXJpIiwgMCwgMHg3MzAwMjExMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTYgfSwgIC8vIEluc3QgIzEzMDggPSBNTVhfUFNSTFFyaQ0KKyAgeyAxMzA5LAk3LAkxLAkwLAkiTU1YX1BTUkxRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGQzMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTMwOSA9IE1NWF9QU1JMUXJtDQorICB7IDEzMTAsCTMsCTEsCTAsCSJNTVhfUFNSTFFyciIsIDAsIDB4ZDMwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzEwID0gTU1YX1BTUkxRcnINCisgIHsgMTMxMSwJMywJMSwJMCwJIk1NWF9QU1JMV3JpIiwgMCwgMHg3MTAwMjExMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTYgfSwgIC8vIEluc3QgIzEzMTEgPSBNTVhfUFNSTFdyaQ0KKyAgeyAxMzEyLAk3LAkxLAkwLAkiTU1YX1BTUkxXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGQxMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTMxMiA9IE1NWF9QU1JMV3JtDQorICB7IDEzMTMsCTMsCTEsCTAsCSJNTVhfUFNSTFdyciIsIDAsIDB4ZDEwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzEzID0gTU1YX1BTUkxXcnINCisgIHsgMTMxNCwJNywJMSwJMCwJIk1NWF9QU1VCQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmODAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEzMTQgPSBNTVhfUFNVQkJybQ0KKyAgeyAxMzE1LAkzLAkxLAkwLAkiTU1YX1BTVUJCcnIiLCAwLCAweGY4MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTMxNSA9IE1NWF9QU1VCQnJyDQorICB7IDEzMTYsCTcsCTEsCTAsCSJNTVhfUFNVQkRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZmEwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMzE2ID0gTU1YX1BTVUJEcm0NCisgIHsgMTMxNywJMywJMSwJMCwJIk1NWF9QU1VCRHJyIiwgMCwgMHhmYTAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEzMTcgPSBNTVhfUFNVQkRycg0KKyAgeyAxMzE4LAk3LAkxLAkwLAkiTU1YX1BTVUJRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGZiMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTMxOCA9IE1NWF9QU1VCUXJtDQorICB7IDEzMTksCTMsCTEsCTAsCSJNTVhfUFNVQlFyciIsIDAsIDB4ZmIwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzE5ID0gTU1YX1BTVUJRcnINCisgIHsgMTMyMCwJNywJMSwJMCwJIk1NWF9QU1VCU0JybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZTgwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMzIwID0gTU1YX1BTVUJTQnJtDQorICB7IDEzMjEsCTMsCTEsCTAsCSJNTVhfUFNVQlNCcnIiLCAwLCAweGU4MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTMyMSA9IE1NWF9QU1VCU0Jycg0KKyAgeyAxMzIyLAk3LAkxLAkwLAkiTU1YX1BTVUJTV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlOTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEzMjIgPSBNTVhfUFNVQlNXcm0NCisgIHsgMTMyMywJMywJMSwJMCwJIk1NWF9QU1VCU1dyciIsIDAsIDB4ZTkwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzIzID0gTU1YX1BTVUJTV3JyDQorICB7IDEzMjQsCTcsCTEsCTAsCSJNTVhfUFNVQlVTQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkODAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEzMjQgPSBNTVhfUFNVQlVTQnJtDQorICB7IDEzMjUsCTMsCTEsCTAsCSJNTVhfUFNVQlVTQnJyIiwgMCwgMHhkODAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEzMjUgPSBNTVhfUFNVQlVTQnJyDQorICB7IDEzMjYsCTcsCTEsCTAsCSJNTVhfUFNVQlVTV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkOTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEzMjYgPSBNTVhfUFNVQlVTV3JtDQorICB7IDEzMjcsCTMsCTEsCTAsCSJNTVhfUFNVQlVTV3JyIiwgMCwgMHhkOTAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEzMjcgPSBNTVhfUFNVQlVTV3JyDQorICB7IDEzMjgsCTcsCTEsCTAsCSJNTVhfUFNVQldybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZjkwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMzI4ID0gTU1YX1BTVUJXcm0NCisgIHsgMTMyOSwJMywJMSwJMCwJIk1NWF9QU1VCV3JyIiwgMCwgMHhmOTAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEzMjkgPSBNTVhfUFNVQldycg0KKyAgeyAxMzMwLAk3LAkxLAkwLAkiTU1YX1BVTlBDS0hCV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2ODAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEzMzAgPSBNTVhfUFVOUENLSEJXcm0NCisgIHsgMTMzMSwJMywJMSwJMCwJIk1NWF9QVU5QQ0tIQldyciIsIDAsIDB4NjgwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzMxID0gTU1YX1BVTlBDS0hCV3JyDQorICB7IDEzMzIsCTcsCTEsCTAsCSJNTVhfUFVOUENLSERRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDZhMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTMzMiA9IE1NWF9QVU5QQ0tIRFFybQ0KKyAgeyAxMzMzLAkzLAkxLAkwLAkiTU1YX1BVTlBDS0hEUXJyIiwgMCwgMHg2YTAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEzMzMgPSBNTVhfUFVOUENLSERRcnINCisgIHsgMTMzNCwJNywJMSwJMCwJIk1NWF9QVU5QQ0tIV0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NjkwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMzM0ID0gTU1YX1BVTlBDS0hXRHJtDQorICB7IDEzMzUsCTMsCTEsCTAsCSJNTVhfUFVOUENLSFdEcnIiLCAwLCAweDY5MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTMzNSA9IE1NWF9QVU5QQ0tIV0Rycg0KKyAgeyAxMzM2LAk3LAkxLAkwLAkiTU1YX1BVTlBDS0xCV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2MDAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzEzMzYgPSBNTVhfUFVOUENLTEJXcm0NCisgIHsgMTMzNywJMywJMSwJMCwJIk1NWF9QVU5QQ0tMQldyciIsIDAsIDB4NjAwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzM3ID0gTU1YX1BVTlBDS0xCV3JyDQorICB7IDEzMzgsCTcsCTEsCTAsCSJNTVhfUFVOUENLTERRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDYyMDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTMzOCA9IE1NWF9QVU5QQ0tMRFFybQ0KKyAgeyAxMzM5LAkzLAkxLAkwLAkiTU1YX1BVTlBDS0xEUXJyIiwgMCwgMHg2MjAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzEzMzkgPSBNTVhfUFVOUENLTERRcnINCisgIHsgMTM0MCwJNywJMSwJMCwJIk1NWF9QVU5QQ0tMV0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NjEwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMzQwID0gTU1YX1BVTlBDS0xXRHJtDQorICB7IDEzNDEsCTMsCTEsCTAsCSJNTVhfUFVOUENLTFdEcnIiLCAwLCAweDYxMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTM0MSA9IE1NWF9QVU5QQ0tMV0Rycg0KKyAgeyAxMzQyLAk3LAkxLAkwLAkiTU1YX1BYT1JybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZWYwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxMzQyID0gTU1YX1BYT1JybQ0KKyAgeyAxMzQzLAkzLAkxLAkwLAkiTU1YX1BYT1JyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZWYwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxMzQzID0gTU1YX1BYT1Jycg0KKyAgeyAxMzQ0LAkxLAkxLAkwLAkiTU1YX1ZfU0VUMCIsIDB8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4ZWYwMDAxMjBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTU3IH0sICAvLyBJbnN0ICMxMzQ0ID0gTU1YX1ZfU0VUMA0KKyAgeyAxMzQ1LAkxLAkxLAkwLAkiTU1YX1ZfU0VUQUxMT05FUyIsIDB8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4NzYwMDAxMjBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTU3IH0sICAvLyBJbnN0ICMxMzQ1ID0gTU1YX1ZfU0VUQUxMT05FUw0KKyAgeyAxMzQ2LAkwLAkwLAkwLAkiTU9OSVRPUiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDAwMTI1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxMzQ2ID0gTU9OSVRPUg0KKyAgeyAxMzQ3LAkxLAkxLAkwLAkiTU9WMTZhbzE2IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTMwMGEwNDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTM0NyA9IE1PVjE2YW8xNg0KKyAgeyAxMzQ4LAk2LAkwLAkwLAkiTU9WMTZtaSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGM3MDA2MDU4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxMzQ4ID0gTU9WMTZtaQ0KKyAgeyAxMzQ5LAk2LAkwLAkwLAkiTU9WMTZtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDg5MDAwMDQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExIH0sICAvLyBJbnN0ICMxMzQ5ID0gTU9WMTZtcg0KKyAgeyAxMzUwLAk2LAkxLAkwLAkiTU9WMTZtcyIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDhjMDAwMDQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1OCB9LCAgLy8gSW5zdCAjMTM1MCA9IE1PVjE2bXMNCisgIHsgMTM1MSwJMSwJMCwJMCwJIk1PVjE2bzE2YSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGExMDBhMDQxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEzNTEgPSBNT1YxNm8xNmENCisgIHsgMTM1MiwJMSwJMSwJMCwJIk1PVjE2cjAiLCAwfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpfCgxPDxUSUQ6OkNoZWFwQXNBTW92ZSksIDB4MzEwMDAwNjBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDQgfSwgIC8vIEluc3QgIzEzNTIgPSBNT1YxNnIwDQorICB7IDEzNTMsCTIsCTEsCTAsCSJNT1YxNnJpIiwgMHwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKXwoMTw8VElEOjpDaGVhcEFzQU1vdmUpLCAweGI4MDA2MDQyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzYxIH0sICAvLyBJbnN0ICMxMzUzID0gTU9WMTZyaQ0KKyAgeyAxMzU0LAk2LAkxLAkwLAkiTU9WMTZybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDhiMDAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUzIH0sICAvLyBJbnN0ICMxMzU0ID0gTU9WMTZybQ0KKyAgeyAxMzU1LAkyLAkxLAkwLAkiTU9WMTZyciIsIDAsIDB4ODkwMDAwNDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTQgfSwgIC8vIEluc3QgIzEzNTUgPSBNT1YxNnJyDQorICB7IDEzNTYsCTIsCTEsCTAsCSJNT1YxNnJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDhiMDAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU0IH0sICAvLyBJbnN0ICMxMzU2ID0gTU9WMTZycl9SRVYNCisgIHsgMTM1NywJMiwJMSwJMCwJIk1PVjE2cnMiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4YzAwMDA0M1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTkgfSwgIC8vIEluc3QgIzEzNTcgPSBNT1YxNnJzDQorICB7IDEzNTgsCTYsCTEsCTAsCSJNT1YxNnNtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4OGUwMDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTYwIH0sICAvLyBJbnN0ICMxMzU4ID0gTU9WMTZzbQ0KKyAgeyAxMzU5LAkyLAkxLAkwLAkiTU9WMTZzciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDhlMDAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE2MSB9LCAgLy8gSW5zdCAjMTM1OSA9IE1PVjE2c3INCisgIHsgMTM2MCwJMSwJMSwJMCwJIk1PVjMyYW8zMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGEzMDBhMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEzNjAgPSBNT1YzMmFvMzINCisgIHsgMTM2MSwJMiwJMSwJMCwJIk1PVjMyY3IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyMjAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNjIgfSwgIC8vIEluc3QgIzEzNjEgPSBNT1YzMmNyDQorICB7IDEzNjIsCTIsCTEsCTAsCSJNT1YzMmRyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MjMwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTYzIH0sICAvLyBJbnN0ICMxMzYyID0gTU9WMzJkcg0KKyAgeyAxMzYzLAk2LAkwLAkwLAkiTU9WMzJtaSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGM3MDBhMDE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxMzYzID0gTU9WMzJtaQ0KKyAgeyAxMzY0LAk2LAkwLAkwLAkiTU9WMzJtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDg5MDAwMDA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMxMzY0ID0gTU9WMzJtcg0KKyAgeyAxMzY1LAk2LAkwLAkwLAkiTU9WMzJtcl9UQyIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4OTAwMDAwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNjQgfSwgIC8vIEluc3QgIzEzNjUgPSBNT1YzMm1yX1RDDQorICB7IDEzNjYsCTYsCTEsCTAsCSJNT1YzMm1zIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4OGMwMDAwMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTU4IH0sICAvLyBJbnN0ICMxMzY2ID0gTU9WMzJtcw0KKyAgeyAxMzY3LAkxLAkwLAkwLAkiTU9WMzJvMzJhIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTEwMGEwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTM2NyA9IE1PVjMybzMyYQ0KKyAgeyAxMzY4LAkxLAkxLAkwLAkiTU9WMzJyMCIsIDB8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSl8KDE8PFRJRDo6Q2hlYXBBc0FNb3ZlKSwgMHgzMTAwMDAyMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzY0IH0sICAvLyBJbnN0ICMxMzY4ID0gTU9WMzJyMA0KKyAgeyAxMzY5LAkyLAkxLAkwLAkiTU9WMzJyYyIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDIwMDAwMTAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE2NSB9LCAgLy8gSW5zdCAjMTM2OSA9IE1PVjMycmMNCisgIHsgMTM3MCwJMiwJMSwJMCwJIk1PVjMycmQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyMTAwMDEwM1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNjYgfSwgIC8vIEluc3QgIzEzNzAgPSBNT1YzMnJkDQorICB7IDEzNzEsCTIsCTEsCTAsCSJNT1YzMnJpIiwgMHwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKXwoMTw8VElEOjpDaGVhcEFzQU1vdmUpLCAweGI4MDBhMDAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzYyIH0sICAvLyBJbnN0ICMxMzcxID0gTU9WMzJyaQ0KKyAgeyAxMzcyLAk2LAkxLAkwLAkiTU9WMzJybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDhiMDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICMxMzcyID0gTU9WMzJybQ0KKyAgeyAxMzczLAk2LAkxLAkwLAkiTU9WMzJybV9UQyIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4YjAwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNjcgfSwgIC8vIEluc3QgIzEzNzMgPSBNT1YzMnJtX1RDDQorICB7IDEzNzQsCTIsCTEsCTAsCSJNT1YzMnJyIiwgMCwgMHg4OTAwMDAwM1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NiB9LCAgLy8gSW5zdCAjMTM3NCA9IE1PVjMycnINCisgIHsgMTM3NSwJMiwJMSwJMCwJIk1PVjMycnJfUkVWIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4OGIwMDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTYgfSwgIC8vIEluc3QgIzEzNzUgPSBNT1YzMnJyX1JFVg0KKyAgeyAxMzc2LAkyLAkxLAkwLAkiTU9WMzJycl9UQyIsIDAsIDB4ODkwMDAwMDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTY4IH0sICAvLyBJbnN0ICMxMzc2ID0gTU9WMzJycl9UQw0KKyAgeyAxMzc3LAkyLAkxLAkwLAkiTU9WMzJycyIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDhjMDAwMDAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE2OSB9LCAgLy8gSW5zdCAjMTM3NyA9IE1PVjMycnMNCisgIHsgMTM3OCwJNiwJMSwJMCwJIk1PVjMyc20iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4ZTAwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNjAgfSwgIC8vIEluc3QgIzEzNzggPSBNT1YzMnNtDQorICB7IDEzNzksCTIsCTEsCTAsCSJNT1YzMnNyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4OGUwMDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTcwIH0sICAvLyBJbnN0ICMxMzc5ID0gTU9WMzJzcg0KKyAgeyAxMzgwLAk2LAkxLAkwLAkiTU9WNjRGU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg4YjEwMTAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjMTM4MCA9IE1PVjY0RlNybQ0KKyAgeyAxMzgxLAk2LAkxLAkwLAkiTU9WNjRHU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg4YjIwMTAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjMTM4MSA9IE1PVjY0R1NybQ0KKyAgeyAxMzgyLAkxLAkxLAkwLAkiTU9WNjRhbzY0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTMwMGIwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTM4MiA9IE1PVjY0YW82NA0KKyAgeyAxMzgzLAkxLAkxLAkwLAkiTU9WNjRhbzgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhMjAwMzAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxMzgzID0gTU9WNjRhbzgNCisgIHsgMTM4NCwJMiwJMSwJMCwJIk1PVjY0Y3IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyMjAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNzEgfSwgIC8vIEluc3QgIzEzODQgPSBNT1Y2NGNyDQorICB7IDEzODUsCTIsCTEsCTAsCSJNT1Y2NGRyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MjMwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTcyIH0sICAvLyBJbnN0ICMxMzg1ID0gTU9WNjRkcg0KKyAgeyAxMzg2LAk2LAkwLAkwLAkiTU9WNjRtaTMyIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4YzcwMGIwMThVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzEzODYgPSBNT1Y2NG1pMzINCisgIHsgMTM4NywJNiwJMCwJMCwJIk1PVjY0bXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4OTAwMTAwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOSB9LCAgLy8gSW5zdCAjMTM4NyA9IE1PVjY0bXINCisgIHsgMTM4OCwJNiwJMCwJMCwJIk1PVjY0bXJfVEMiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ODkwMDEwMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTczIH0sICAvLyBJbnN0ICMxMzg4ID0gTU9WNjRtcl9UQw0KKyAgeyAxMzg5LAk2LAkxLAkwLAkiTU9WNjRtcyIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDhjMDAxMDA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1OCB9LCAgLy8gSW5zdCAjMTM4OSA9IE1PVjY0bXMNCisgIHsgMTM5MCwJMSwJMCwJMCwJIk1PVjY0bzY0YSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGExMDBiMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzEzOTAgPSBNT1Y2NG82NGENCisgIHsgMTM5MSwJMSwJMCwJMCwJIk1PVjY0bzhhIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTAwMDMwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTM5MSA9IE1PVjY0bzhhDQorICB7IDEzOTIsCTEsCTEsCTAsCSJNT1Y2NHIwIiwgMHwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKXwoMTw8VElEOjpDaGVhcEFzQU1vdmUpLCAweDMxMDAwMDIwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNjUgfSwgIC8vIEluc3QgIzEzOTIgPSBNT1Y2NHIwDQorICB7IDEzOTMsCTIsCTEsCTAsCSJNT1Y2NHJjIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MjAwMDAxMDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTc0IH0sICAvLyBJbnN0ICMxMzkzID0gTU9WNjRyYw0KKyAgeyAxMzk0LAkyLAkxLAkwLAkiTU9WNjRyZCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDIxMDAwMTAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE3NSB9LCAgLy8gSW5zdCAjMTM5NCA9IE1PVjY0cmQNCisgIHsgMTM5NSwJMiwJMSwJMCwJIk1PVjY0cmkiLCAwfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpfCgxPDxUSUQ6OkNoZWFwQXNBTW92ZSksIDB4YjgwMGYwMDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjMgfSwgIC8vIEluc3QgIzEzOTUgPSBNT1Y2NHJpDQorICB7IDEzOTYsCTIsCTEsCTAsCSJNT1Y2NHJpMzIiLCAwfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpfCgxPDxUSUQ6OkNoZWFwQXNBTW92ZSksIDB4YzcwMGIwMTBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjMgfSwgIC8vIEluc3QgIzEzOTYgPSBNT1Y2NHJpMzINCisgIHsgMTM5NywJMiwJMSwJMCwJIk1PVjY0cmk2NGkzMiIsIDB8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSl8KDE8PFRJRDo6Q2hlYXBBc0FNb3ZlKSwgMHhiODAwYTAwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82MyB9LCAgLy8gSW5zdCAjMTM5NyA9IE1PVjY0cmk2NGkzMg0KKyAgeyAxMzk4LAkyLAkxLAkwLAkiTU9WNjRyaV9hbHQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiODAwZjAwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82MyB9LCAgLy8gSW5zdCAjMTM5OCA9IE1PVjY0cmlfYWx0DQorICB7IDEzOTksCTYsCTEsCTAsCSJNT1Y2NHJtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4OGIwMDEwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzEzOTkgPSBNT1Y2NHJtDQorICB7IDE0MDAsCTYsCTEsCTAsCSJNT1Y2NHJtX1RDIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDhiMDAxMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE3NiB9LCAgLy8gSW5zdCAjMTQwMCA9IE1PVjY0cm1fVEMNCisgIHsgMTQwMSwJMiwJMSwJMCwJIk1PVjY0cnIiLCAwLCAweDg5MDAxMDAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICMxNDAxID0gTU9WNjRycg0KKyAgeyAxNDAyLAkyLAkxLAkwLAkiTU9WNjRycl9SRVYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4YjAwMTAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81OCB9LCAgLy8gSW5zdCAjMTQwMiA9IE1PVjY0cnJfUkVWDQorICB7IDE0MDMsCTIsCTEsCTAsCSJNT1Y2NHJyX1RDIiwgMCwgMHg4OTAwMTAwM1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNzcgfSwgIC8vIEluc3QgIzE0MDMgPSBNT1Y2NHJyX1RDDQorICB7IDE0MDQsCTIsCTEsCTAsCSJNT1Y2NHJzIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4OGMwMDEwMDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTc4IH0sICAvLyBJbnN0ICMxNDA0ID0gTU9WNjRycw0KKyAgeyAxNDA1LAk2LAkxLAkwLAkiTU9WNjRzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDhlMDAxMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE2MCB9LCAgLy8gSW5zdCAjMTQwNSA9IE1PVjY0c20NCisgIHsgMTQwNiwJMiwJMSwJMCwJIk1PVjY0c3IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4ZTAwMTAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNzkgfSwgIC8vIEluc3QgIzE0MDYgPSBNT1Y2NHNyDQorICB7IDE0MDcsCTIsCTEsCTAsCSJNT1Y2NHRvUFFJcnIiLCAwLCAweDZlODAxMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4MCB9LCAgLy8gSW5zdCAjMTQwNyA9IE1PVjY0dG9QUUlycg0KKyAgeyAxNDA4LAk2LAkxLAkwLAkiTU9WNjR0b1NEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDdlNDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkyIH0sICAvLyBJbnN0ICMxNDA4ID0gTU9WNjR0b1NEcm0NCisgIHsgMTQwOSwJMiwJMSwJMCwJIk1PVjY0dG9TRHJyIiwgMCwgMHg2ZTgwMTE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85MyB9LCAgLy8gSW5zdCAjMTQwOSA9IE1PVjY0dG9TRHJyDQorICB7IDE0MTAsCTEsCTEsCTAsCSJNT1Y4YW84IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTIwMGEwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTQxMCA9IE1PVjhhbzgNCisgIHsgMTQxMSwJNiwJMCwJMCwJIk1PVjhtaSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGM2MDAyMDE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxNDExID0gTU9WOG1pDQorICB7IDE0MTIsCTYsCTAsCTAsCSJNT1Y4bXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4ODAwMDAwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNCB9LCAgLy8gSW5zdCAjMTQxMiA9IE1PVjhtcg0KKyAgeyAxNDEzLAk2LAkwLAkwLAkiTU9WOG1yX05PUkVYIiwgMHwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDg4MDAwMDA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4MSB9LCAgLy8gSW5zdCAjMTQxMyA9IE1PVjhtcl9OT1JFWA0KKyAgeyAxNDE0LAkxLAkwLAkwLAkiTU9WOG84YSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGEwMDBhMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzE0MTQgPSBNT1Y4bzhhDQorICB7IDE0MTUsCTEsCTEsCTAsCSJNT1Y4cjAiLCAwfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpfCgxPDxUSUQ6OkNoZWFwQXNBTW92ZSksIDB4MzAwMDAwMjBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzE0MTUgPSBNT1Y4cjANCisgIHsgMTQxNiwJMiwJMSwJMCwJIk1PVjhyaSIsIDB8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSl8KDE8PFRJRDo6Q2hlYXBBc0FNb3ZlKSwgMHhiMDAwMjAwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83OSB9LCAgLy8gSW5zdCAjMTQxNiA9IE1PVjhyaQ0KKyAgeyAxNDE3LAk2LAkxLAkwLAkiTU9WOHJtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4OGEwMDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODAgfSwgIC8vIEluc3QgIzE0MTcgPSBNT1Y4cm0NCisgIHsgMTQxOCwJNiwJMSwJMCwJIk1PVjhybV9OT1JFWCIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg4YTAwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODIgfSwgIC8vIEluc3QgIzE0MTggPSBNT1Y4cm1fTk9SRVgNCisgIHsgMTQxOSwJMiwJMSwJMCwJIk1PVjhyciIsIDAsIDB4ODgwMDAwMDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODEgfSwgIC8vIEluc3QgIzE0MTkgPSBNT1Y4cnINCisgIHsgMTQyMCwJMiwJMSwJMCwJIk1PVjhycl9OT1JFWCIsIDAsIDB4ODgwMDAwMDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTgzIH0sICAvLyBJbnN0ICMxNDIwID0gTU9WOHJyX05PUkVYDQorICB7IDE0MjEsCTIsCTEsCTAsCSJNT1Y4cnJfUkVWIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4OGEwMDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODEgfSwgIC8vIEluc3QgIzE0MjEgPSBNT1Y4cnJfUkVWDQorICB7IDE0MjIsCTYsCTAsCTAsCSJNT1ZBUERtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDI5ODAwMTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTQyMiA9IE1PVkFQRG1yDQorICB7IDE0MjMsCTYsCTEsCTAsCSJNT1ZBUERybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDI4ODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNDIzID0gTU9WQVBEcm0NCisgIHsgMTQyNCwJMiwJMSwJMCwJIk1PVkFQRHJyIiwgMCwgMHgyODgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTQyNCA9IE1PVkFQRHJyDQorICB7IDE0MjUsCTYsCTAsCTAsCSJNT1ZBUFNtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDI5NDAwMTA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTQyNSA9IE1PVkFQU21yDQorICB7IDE0MjYsCTYsCTEsCTAsCSJNT1ZBUFNybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDI4NDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNDI2ID0gTU9WQVBTcm0NCisgIHsgMTQyNywJMiwJMSwJMCwJIk1PVkFQU3JyIiwgMCwgMHgyODQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTQyNyA9IE1PVkFQU3JyDQorICB7IDE0MjgsCTYsCTEsCTAsCSJNT1ZERFVQcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEyODAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNDI4ID0gTU9WRERVUHJtDQorICB7IDE0MjksCTIsCTEsCTAsCSJNT1ZERFVQcnIiLCAwLCAweDEyODAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMxNDI5ID0gTU9WRERVUHJyDQorICB7IDE0MzAsCTYsCTEsCTAsCSJNT1ZESTJQRElybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NmU4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE0MzAgPSBNT1ZESTJQRElybQ0KKyAgeyAxNDMxLAkyLAkxLAkwLAkiTU9WREkyUERJcnIiLCAwLCAweDZlODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NSB9LCAgLy8gSW5zdCAjMTQzMSA9IE1PVkRJMlBESXJyDQorICB7IDE0MzIsCTYsCTEsCTAsCSJNT1ZESTJTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2ZTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85MCB9LCAgLy8gSW5zdCAjMTQzMiA9IE1PVkRJMlNTcm0NCisgIHsgMTQzMywJMiwJMSwJMCwJIk1PVkRJMlNTcnIiLCAwLCAweDZlODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzk2IH0sICAvLyBJbnN0ICMxNDMzID0gTU9WREkyU1Nycg0KKyAgeyAxNDM0LAk2LAkwLAkwLAkiTU9WRFFBbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2ZjMDAxNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMxNDM0ID0gTU9WRFFBbXINCisgIHsgMTQzNSwJNiwJMSwJMCwJIk1PVkRRQXJtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDZmYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNDM1ID0gTU9WRFFBcm0NCisgIHsgMTQzNiwJMiwJMSwJMCwJIk1PVkRRQXJyIiwgMCwgMHg2ZmMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTQzNiA9IE1PVkRRQXJyDQorICB7IDE0MzcsCTYsCTAsCTAsCSJNT1ZEUVVtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3ZmMwMGMwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzE0MzcgPSBNT1ZEUVVtcg0KKyAgeyAxNDM4LAk2LAkwLAkwLAkiTU9WRFFVbXJfSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdmYzAwYzA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTQzOCA9IE1PVkRRVW1yX0ludA0KKyAgeyAxNDM5LAk2LAkxLAkwLAkiTU9WRFFVcm0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NmZjMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE0MzkgPSBNT1ZEUVVybQ0KKyAgeyAxNDQwLAk2LAkxLAkwLAkiTU9WRFFVcm1fSW50IiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCksIDB4NmZjMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE0NDAgPSBNT1ZEUVVybV9JbnQNCisgIHsgMTQ0MSwJMywJMSwJMCwJIk1PVkhMUFNyciIsIDAsIDB4MTI0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE0NDEgPSBNT1ZITFBTcnINCisgIHsgMTQ0MiwJNiwJMCwJMCwJIk1PVkhQRG1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTc4MDAxNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMxNDQyID0gTU9WSFBEbXINCisgIHsgMTQ0MywJNywJMSwJMCwJIk1PVkhQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNjgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTQ0MyA9IE1PVkhQRHJtDQorICB7IDE0NDQsCTYsCTAsCTAsCSJNT1ZIUFNtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDE3NDAwMTA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTQ0NCA9IE1PVkhQU21yDQorICB7IDE0NDUsCTcsCTEsCTAsCSJNT1ZIUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTY0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE0NDUgPSBNT1ZIUFNybQ0KKyAgeyAxNDQ2LAkzLAkxLAkwLAkiTU9WTEhQU3JyIiwgMCwgMHgxNjQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTQ0NiA9IE1PVkxIUFNycg0KKyAgeyAxNDQ3LAk2LAkwLAkwLAkiTU9WTFBEbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxMzgwMDE0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzE0NDcgPSBNT1ZMUERtcg0KKyAgeyAxNDQ4LAk3LAkxLAkwLAkiTU9WTFBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEyODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNDQ4ID0gTU9WTFBEcm0NCisgIHsgMTQ0OSwJNiwJMCwJMCwJIk1PVkxQU21yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTM0MDAxMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMxNDQ5ID0gTU9WTFBTbXINCisgIHsgMTQ1MCwJNywJMSwJMCwJIk1PVkxQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMjQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTQ1MCA9IE1PVkxQU3JtDQorICB7IDE0NTEsCTYsCTAsCTAsCSJNT1ZMUTEyOG1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQ2ODAwMTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTQ1MSA9IE1PVkxRMTI4bXINCisgIHsgMTQ1MiwJMiwJMSwJMCwJIk1PVk1TS1BEcnIiLCAwLCAweDUwODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzMSB9LCAgLy8gSW5zdCAjMTQ1MiA9IE1PVk1TS1BEcnINCisgIHsgMTQ1MywJMiwJMSwJMCwJIk1PVk1TS1BTcnIiLCAwLCAweDUwNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzMSB9LCAgLy8gSW5zdCAjMTQ1MyA9IE1PVk1TS1BTcnINCisgIHsgMTQ1NCwJNiwJMSwJMCwJIk1PVk5URFFBcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJhYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNDU0ID0gTU9WTlREUUFybQ0KKyAgeyAxNDU1LAk2LAkwLAkwLAkiTU9WTlREUV82NG1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZTc4MDAxNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMxNDU1ID0gTU9WTlREUV82NG1yDQorICB7IDE0NTYsCTYsCTAsCTAsCSJNT1ZOVERRbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhlN2MwMDE0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzE0NTYgPSBNT1ZOVERRbXINCisgIHsgMTQ1NywJNiwJMCwJMCwJIk1PVk5URFFtcl9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTdjMDAxNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMxNDU3ID0gTU9WTlREUW1yX0ludA0KKyAgeyAxNDU4LAk2LAkwLAkwLAkiTU9WTlRJXzY0bXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhjMzAwMTEwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOSB9LCAgLy8gSW5zdCAjMTQ1OCA9IE1PVk5USV82NG1yDQorICB7IDE0NTksCTYsCTAsCTAsCSJNT1ZOVEltciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMzMDAwMTA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMxNDU5ID0gTU9WTlRJbXINCisgIHsgMTQ2MCwJNiwJMCwJMCwJIk1PVk5USW1yX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMzAwMDEwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNSB9LCAgLy8gSW5zdCAjMTQ2MCA9IE1PVk5USW1yX0ludA0KKyAgeyAxNDYxLAk2LAkwLAkwLAkiTU9WTlRQRG1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MmI4MDAxNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMxNDYxID0gTU9WTlRQRG1yDQorICB7IDE0NjIsCTYsCTAsCTAsCSJNT1ZOVFBEbXJfSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDJiODAwMTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTQ2MiA9IE1PVk5UUERtcl9JbnQNCisgIHsgMTQ2MywJNiwJMCwJMCwJIk1PVk5UUFNtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDJiNDAwMTA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTQ2MyA9IE1PVk5UUFNtcg0KKyAgeyAxNDY0LAk2LAkwLAkwLAkiTU9WTlRQU21yX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyYjQwMDEwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzE0NjQgPSBNT1ZOVFBTbXJfSW50DQorICB7IDE0NjUsCTIsCTEsCTAsCSJNT1ZQQzMyciIsIDB8KDE8PFRJRDo6Tm90RHVwbGljYWJsZSksIDB4ZTgwMGEwMDBVTEwsIEltcGxpY2l0TGlzdDIsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjIgfSwgIC8vIEluc3QgIzE0NjUgPSBNT1ZQQzMycg0KKyAgeyAxNDY2LAk2LAkwLAkwLAkiTU9WUERJMkRJbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg3ZTgwMDE0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzE0NjYgPSBNT1ZQREkyREltcg0KKyAgeyAxNDY3LAkyLAkxLAkwLAkiTU9WUERJMkRJcnIiLCAwLCAweDdlODAwMTQzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzMSB9LCAgLy8gSW5zdCAjMTQ2NyA9IE1PVlBESTJESXJyDQorICB7IDE0NjgsCTYsCTAsCTAsCSJNT1ZQUUkyUUltciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQ2ODAwMTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTQ2OCA9IE1PVlBRSTJRSW1yDQorICB7IDE0NjksCTIsCTEsCTAsCSJNT1ZQUUl0bzY0cnIiLCAwLCAweDdlODAxMTQzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzg5IH0sICAvLyBJbnN0ICMxNDY5ID0gTU9WUFFJdG82NHJyDQorICB7IDE0NzAsCTYsCTEsCTAsCSJNT1ZRSTJQUUlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4N2UwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE0NzAgPSBNT1ZRSTJQUUlybQ0KKyAgeyAxNDcxLAkyLAkxLAkwLAkiTU9WUXhyeHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3ZTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTQ3MSA9IE1PVlF4cnhyDQorICB7IDE0NzIsCTAsCTAsCTAsCSJNT1ZTQiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGE0MDAwMDAxVUxMLCBJbXBsaWNpdExpc3QzNiwgSW1wbGljaXRMaXN0MzcsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzE0NzIgPSBNT1ZTQg0KKyAgeyAxNDczLAkwLAkwLAkwLAkiTU9WU0QiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhNTAwMDAwMVVMTCwgSW1wbGljaXRMaXN0MzYsIEltcGxpY2l0TGlzdDM3LCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxNDczID0gTU9WU0QNCisgIHsgMTQ3NCwJNiwJMCwJMCwJIk1PVlNEbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxMTAwMGIwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODYgfSwgIC8vIEluc3QgIzE0NzQgPSBNT1ZTRG1yDQorICB7IDE0NzUsCTYsCTEsCTAsCSJNT1ZTRHJtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4MTAwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOTIgfSwgIC8vIEluc3QgIzE0NzUgPSBNT1ZTRHJtDQorICB7IDE0NzYsCTMsCTEsCTAsCSJNT1ZTRHJyIiwgMCwgMHgxMDAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODcgfSwgIC8vIEluc3QgIzE0NzYgPSBNT1ZTRHJyDQorICB7IDE0NzcsCTYsCTAsCTAsCSJNT1ZTRHRvNjRtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDdlODAxMTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NiB9LCAgLy8gSW5zdCAjMTQ3NyA9IE1PVlNEdG82NG1yDQorICB7IDE0NzgsCTIsCTEsCTAsCSJNT1ZTRHRvNjRyciIsIDAsIDB4N2U4MDExNDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTAwIH0sICAvLyBJbnN0ICMxNDc4ID0gTU9WU0R0bzY0cnINCisgIHsgMTQ3OSwJNiwJMSwJMCwJIk1PVlNIRFVQcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE2NDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNDc5ID0gTU9WU0hEVVBybQ0KKyAgeyAxNDgwLAkyLAkxLAkwLAkiTU9WU0hEVVByciIsIDAsIDB4MTY0MDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE0ODAgPSBNT1ZTSERVUHJyDQorICB7IDE0ODEsCTYsCTEsCTAsCSJNT1ZTTERVUHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMjQwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMTQ4MSA9IE1PVlNMRFVQcm0NCisgIHsgMTQ4MiwJMiwJMSwJMCwJIk1PVlNMRFVQcnIiLCAwLCAweDEyNDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMxNDgyID0gTU9WU0xEVVBycg0KKyAgeyAxNDgzLAkwLAkwLAkwLAkiTU9WU1EiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhNTAwMTAwMVVMTCwgSW1wbGljaXRMaXN0MzYsIEltcGxpY2l0TGlzdDM3LCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxNDgzID0gTU9WU1ENCisgIHsgMTQ4NCwJNiwJMCwJMCwJIk1PVlNTMkRJbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg3ZTgwMDE0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODggfSwgIC8vIEluc3QgIzE0ODQgPSBNT1ZTUzJESW1yDQorICB7IDE0ODUsCTIsCTEsCTAsCSJNT1ZTUzJESXJyIiwgMCwgMHg3ZTgwMDE0M1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85OSB9LCAgLy8gSW5zdCAjMTQ4NSA9IE1PVlNTMkRJcnINCisgIHsgMTQ4NiwJNiwJMCwJMCwJIk1PVlNTbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxMTAwMGMwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODggfSwgIC8vIEluc3QgIzE0ODYgPSBNT1ZTU21yDQorICB7IDE0ODcsCTYsCTEsCTAsCSJNT1ZTU3JtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4MTAwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOTAgfSwgIC8vIEluc3QgIzE0ODcgPSBNT1ZTU3JtDQorICB7IDE0ODgsCTMsCTEsCTAsCSJNT1ZTU3JyIiwgMCwgMHgxMDAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODkgfSwgIC8vIEluc3QgIzE0ODggPSBNT1ZTU3JyDQorICB7IDE0ODksCTAsCTAsCTAsCSJNT1ZTVyIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGE1MDAwMDQxVUxMLCBJbXBsaWNpdExpc3QzNiwgSW1wbGljaXRMaXN0MzcsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzE0ODkgPSBNT1ZTVw0KKyAgeyAxNDkwLAk2LAkxLAkwLAkiTU9WU1gxNnJtOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YmUwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTMgfSwgIC8vIEluc3QgIzE0OTAgPSBNT1ZTWDE2cm04DQorICB7IDE0OTEsCTYsCTEsCTAsCSJNT1ZTWDE2cm04VyIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGJlMDAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUzIH0sICAvLyBJbnN0ICMxNDkxID0gTU9WU1gxNnJtOFcNCisgIHsgMTQ5MiwJMiwJMSwJMCwJIk1PVlNYMTZycjgiLCAwLCAweGJlMDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE5MCB9LCAgLy8gSW5zdCAjMTQ5MiA9IE1PVlNYMTZycjgNCisgIHsgMTQ5MywJMiwJMSwJMCwJIk1PVlNYMTZycjhXIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YmUwMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTkwIH0sICAvLyBJbnN0ICMxNDkzID0gTU9WU1gxNnJyOFcNCisgIHsgMTQ5NCwJNiwJMSwJMCwJIk1PVlNYMzJybTE2IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiZjAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NSB9LCAgLy8gSW5zdCAjMTQ5NCA9IE1PVlNYMzJybTE2DQorICB7IDE0OTUsCTYsCTEsCTAsCSJNT1ZTWDMycm04IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiZTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NSB9LCAgLy8gSW5zdCAjMTQ5NSA9IE1PVlNYMzJybTgNCisgIHsgMTQ5NiwJMiwJMSwJMCwJIk1PVlNYMzJycjE2IiwgMCwgMHhiZjAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTEgfSwgIC8vIEluc3QgIzE0OTYgPSBNT1ZTWDMycnIxNg0KKyAgeyAxNDk3LAkyLAkxLAkwLAkiTU9WU1gzMnJyOCIsIDAsIDB4YmUwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTkyIH0sICAvLyBJbnN0ICMxNDk3ID0gTU9WU1gzMnJyOA0KKyAgeyAxNDk4LAk2LAkxLAkwLAkiTU9WU1g2NHJtMTYiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGJmMDAxMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMxNDk4ID0gTU9WU1g2NHJtMTYNCisgIHsgMTQ5OSwJNiwJMSwJMCwJIk1PVlNYNjRybTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2MzAwMTAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjMTQ5OSA9IE1PVlNYNjRybTMyDQorICB7IDE1MDAsCTYsCTEsCTAsCSJNT1ZTWDY0cm04IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiZTAwMTEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjMTUwMCA9IE1PVlNYNjRybTgNCisgIHsgMTUwMSwJMiwJMSwJMCwJIk1PVlNYNjRycjE2IiwgMCwgMHhiZjAwMTEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTMgfSwgIC8vIEluc3QgIzE1MDEgPSBNT1ZTWDY0cnIxNg0KKyAgeyAxNTAyLAkyLAkxLAkwLAkiTU9WU1g2NHJyMzIiLCAwLCAweDYzMDAxMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzOSB9LCAgLy8gSW5zdCAjMTUwMiA9IE1PVlNYNjRycjMyDQorICB7IDE1MDMsCTIsCTEsCTAsCSJNT1ZTWDY0cnI4IiwgMCwgMHhiZTAwMTEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTQgfSwgIC8vIEluc3QgIzE1MDMgPSBNT1ZTWDY0cnI4DQorICB7IDE1MDQsCTYsCTAsCTAsCSJNT1ZVUERtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDExODAwMTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTUwNCA9IE1PVlVQRG1yDQorICB7IDE1MDUsCTYsCTAsCTAsCSJNT1ZVUERtcl9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTE4MDAxNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMxNTA1ID0gTU9WVVBEbXJfSW50DQorICB7IDE1MDYsCTYsCTEsCTAsCSJNT1ZVUERybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEwODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNTA2ID0gTU9WVVBEcm0NCisgIHsgMTUwNywJNiwJMSwJMCwJIk1PVlVQRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTA4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE1MDcgPSBNT1ZVUERybV9JbnQNCisgIHsgMTUwOCwJMiwJMSwJMCwJIk1PVlVQRHJyIiwgMCwgMHgxMDgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTUwOCA9IE1PVlVQRHJyDQorICB7IDE1MDksCTYsCTAsCTAsCSJNT1ZVUFNtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDExNDAwMTA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMTUwOSA9IE1PVlVQU21yDQorICB7IDE1MTAsCTYsCTAsCTAsCSJNT1ZVUFNtcl9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTE0MDAxMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMxNTEwID0gTU9WVVBTbXJfSW50DQorICB7IDE1MTEsCTYsCTEsCTAsCSJNT1ZVUFNybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDEwNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNTExID0gTU9WVVBTcm0NCisgIHsgMTUxMiwJNiwJMSwJMCwJIk1PVlVQU3JtX0ludCIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDEwNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNTEyID0gTU9WVVBTcm1fSW50DQorICB7IDE1MTMsCTIsCTEsCTAsCSJNT1ZVUFNyciIsIDAsIDB4MTA0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE1MTMgPSBNT1ZVUFNycg0KKyAgeyAxNTE0LAk2LAkxLAkwLAkiTU9WWkRJMlBESXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2ZTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMTUxNCA9IE1PVlpESTJQRElybQ0KKyAgeyAxNTE1LAkyLAkxLAkwLAkiTU9WWkRJMlBESXJyIiwgMCwgMHg2ZTgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODUgfSwgIC8vIEluc3QgIzE1MTUgPSBNT1ZaREkyUERJcnINCisgIHsgMTUxNiwJNiwJMSwJMCwJIk1PVlpQUUlMbzJQUUlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4N2UwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE1MTYgPSBNT1ZaUFFJTG8yUFFJcm0NCisgIHsgMTUxNywJMiwJMSwJMCwJIk1PVlpQUUlMbzJQUUlyciIsIDAsIDB4N2UwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE1MTcgPSBNT1ZaUFFJTG8yUFFJcnINCisgIHsgMTUxOCwJNiwJMSwJMCwJIk1PVlpRSTJQUUlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4N2UwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE1MTggPSBNT1ZaUUkyUFFJcm0NCisgIHsgMTUxOSwJMiwJMSwJMCwJIk1PVlpRSTJQUUlyciIsIDAsIDB4NmU4MDExNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTgwIH0sICAvLyBJbnN0ICMxNTE5ID0gTU9WWlFJMlBRSXJyDQorICB7IDE1MjAsCTYsCTEsCTAsCSJNT1ZaWDE2cm04IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiNjAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MyB9LCAgLy8gSW5zdCAjMTUyMCA9IE1PVlpYMTZybTgNCisgIHsgMTUyMSwJNiwJMSwJMCwJIk1PVlpYMTZybThXIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjYwMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTMgfSwgIC8vIEluc3QgIzE1MjEgPSBNT1ZaWDE2cm04Vw0KKyAgeyAxNTIyLAkyLAkxLAkwLAkiTU9WWlgxNnJyOCIsIDAsIDB4YjYwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTkwIH0sICAvLyBJbnN0ICMxNTIyID0gTU9WWlgxNnJyOA0KKyAgeyAxNTIzLAkyLAkxLAkwLAkiTU9WWlgxNnJyOFciLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiNjAwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTAgfSwgIC8vIEluc3QgIzE1MjMgPSBNT1ZaWDE2cnI4Vw0KKyAgeyAxNTI0LAk2LAkxLAkwLAkiTU9WWlgzMl9OT1JFWHJtOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI2MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE5NSB9LCAgLy8gSW5zdCAjMTUyNCA9IE1PVlpYMzJfTk9SRVhybTgNCisgIHsgMTUyNSwJMiwJMSwJMCwJIk1PVlpYMzJfTk9SRVhycjgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiNjAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTYgfSwgIC8vIEluc3QgIzE1MjUgPSBNT1ZaWDMyX05PUkVYcnI4DQorICB7IDE1MjYsCTYsCTEsCTAsCSJNT1ZaWDMycm0xNiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YjcwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzE1MjYgPSBNT1ZaWDMycm0xNg0KKyAgeyAxNTI3LAk2LAkxLAkwLAkiTU9WWlgzMnJtOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YjYwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzE1MjcgPSBNT1ZaWDMycm04DQorICB7IDE1MjgsCTIsCTEsCTAsCSJNT1ZaWDMycnIxNiIsIDAsIDB4YjcwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTkxIH0sICAvLyBJbnN0ICMxNTI4ID0gTU9WWlgzMnJyMTYNCisgIHsgMTUyOSwJMiwJMSwJMCwJIk1PVlpYMzJycjgiLCAwLCAweGI2MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE5MiB9LCAgLy8gSW5zdCAjMTUyOSA9IE1PVlpYMzJycjgNCisgIHsgMTUzMCwJNiwJMSwJMCwJIk1PVlpYNjRybTE2IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiNzAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjMTUzMCA9IE1PVlpYNjRybTE2DQorICB7IDE1MzEsCTYsCTEsCTAsCSJNT1ZaWDY0cm0xNl9RIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjcwMDExMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzE1MzEgPSBNT1ZaWDY0cm0xNl9RDQorICB7IDE1MzIsCTYsCTEsCTAsCSJNT1ZaWDY0cm0zMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4OGIwMDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzE1MzIgPSBNT1ZaWDY0cm0zMg0KKyAgeyAxNTMzLAk2LAkxLAkwLAkiTU9WWlg2NHJtOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YjYwMDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzE1MzMgPSBNT1ZaWDY0cm04DQorICB7IDE1MzQsCTYsCTEsCTAsCSJNT1ZaWDY0cm04X1EiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiNjAwMTEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjMTUzNCA9IE1PVlpYNjRybThfUQ0KKyAgeyAxNTM1LAkyLAkxLAkwLAkiTU9WWlg2NHJyMTYiLCAwLCAweGI3MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE5MyB9LCAgLy8gSW5zdCAjMTUzNSA9IE1PVlpYNjRycjE2DQorICB7IDE1MzYsCTIsCTEsCTAsCSJNT1ZaWDY0cnIxNl9RIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjcwMDExMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTkzIH0sICAvLyBJbnN0ICMxNTM2ID0gTU9WWlg2NHJyMTZfUQ0KKyAgeyAxNTM3LAkyLAkxLAkwLAkiTU9WWlg2NHJyMzIiLCAwLCAweDg5MDAwMDAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzOSB9LCAgLy8gSW5zdCAjMTUzNyA9IE1PVlpYNjRycjMyDQorICB7IDE1MzgsCTIsCTEsCTAsCSJNT1ZaWDY0cnI4IiwgMCwgMHhiNjAwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTQgfSwgIC8vIEluc3QgIzE1MzggPSBNT1ZaWDY0cnI4DQorICB7IDE1MzksCTIsCTEsCTAsCSJNT1ZaWDY0cnI4X1EiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhiNjAwMTEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTQgfSwgIC8vIEluc3QgIzE1MzkgPSBNT1ZaWDY0cnI4X1ENCisgIHsgMTU0MCwJMiwJMSwJMCwJIk1PVl9GcDMyMzIiLCAwLCAweDcwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzcgfSwgIC8vIEluc3QgIzE1NDAgPSBNT1ZfRnAzMjMyDQorICB7IDE1NDEsCTIsCTEsCTAsCSJNT1ZfRnAzMjY0IiwgMCwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTcgfSwgIC8vIEluc3QgIzE1NDEgPSBNT1ZfRnAzMjY0DQorICB7IDE1NDIsCTIsCTEsCTAsCSJNT1ZfRnAzMjgwIiwgMCwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTggfSwgIC8vIEluc3QgIzE1NDIgPSBNT1ZfRnAzMjgwDQorICB7IDE1NDMsCTIsCTEsCTAsCSJNT1ZfRnA2NDMyIiwgMCwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOTkgfSwgIC8vIEluc3QgIzE1NDMgPSBNT1ZfRnA2NDMyDQorICB7IDE1NDQsCTIsCTEsCTAsCSJNT1ZfRnA2NDY0IiwgMCwgMHg3MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84IH0sICAvLyBJbnN0ICMxNTQ0ID0gTU9WX0ZwNjQ2NA0KKyAgeyAxNTQ1LAkyLAkxLAkwLAkiTU9WX0ZwNjQ4MCIsIDAsIDB4NzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjAwIH0sICAvLyBJbnN0ICMxNTQ1ID0gTU9WX0ZwNjQ4MA0KKyAgeyAxNTQ2LAkyLAkxLAkwLAkiTU9WX0ZwODAzMiIsIDAsIDB4NzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjAxIH0sICAvLyBJbnN0ICMxNTQ2ID0gTU9WX0ZwODAzMg0KKyAgeyAxNTQ3LAkyLAkxLAkwLAkiTU9WX0ZwODA2NCIsIDAsIDB4NzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjAyIH0sICAvLyBJbnN0ICMxNTQ3ID0gTU9WX0ZwODA2NA0KKyAgeyAxNTQ4LAkyLAkxLAkwLAkiTU9WX0ZwODA4MCIsIDAsIDB4NzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOSB9LCAgLy8gSW5zdCAjMTU0OCA9IE1PVl9GcDgwODANCisgIHsgMTU0OSwJOCwJMSwJMCwJIk1QU0FEQldybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQyYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUxIH0sICAvLyBJbnN0ICMxNTQ5ID0gTVBTQURCV3JtaQ0KKyAgeyAxNTUwLAk0LAkxLAkwLAkiTVBTQURCV3JyaSIsIDAsIDB4NDJjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTIgfSwgIC8vIEluc3QgIzE1NTAgPSBNUFNBREJXcnJpDQorICB7IDE1NTEsCTUsCTAsCTAsCSJNVUwxNm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGY3MDAwMDVjVUxMLCBJbXBsaWNpdExpc3QxMiwgSW1wbGljaXRMaXN0MjEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTU1MSA9IE1VTDE2bQ0KKyAgeyAxNTUyLAkxLAkwLAkwLAkiTVVMMTZyIiwgMCwgMHhmNzAwMDA1NFVMTCwgSW1wbGljaXRMaXN0MTIsIEltcGxpY2l0TGlzdDIxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTA0IH0sICAvLyBJbnN0ICMxNTUyID0gTVVMMTZyDQorICB7IDE1NTMsCTUsCTAsCTAsCSJNVUwzMm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGY3MDAwMDFjVUxMLCBJbXBsaWNpdExpc3QxMywgSW1wbGljaXRMaXN0MTgsIEJhcnJpZXJzNiwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTU1MyA9IE1VTDMybQ0KKyAgeyAxNTU0LAkxLAkwLAkwLAkiTVVMMzJyIiwgMCwgMHhmNzAwMDAxNFVMTCwgSW1wbGljaXRMaXN0MTMsIEltcGxpY2l0TGlzdDE4LCBCYXJyaWVyczYsIE9wZXJhbmRJbmZvNjQgfSwgIC8vIEluc3QgIzE1NTQgPSBNVUwzMnINCisgIHsgMTU1NSwJNSwJMCwJMCwJIk1VTDY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZjcwMDEwMWNVTEwsIEltcGxpY2l0TGlzdDE1LCBJbXBsaWNpdExpc3QxNywgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxNTU1ID0gTVVMNjRtDQorICB7IDE1NTYsCTEsCTAsCTAsCSJNVUw2NHIiLCAwLCAweGY3MDAxMDE0VUxMLCBJbXBsaWNpdExpc3QxNSwgSW1wbGljaXRMaXN0MTcsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82NSB9LCAgLy8gSW5zdCAjMTU1NiA9IE1VTDY0cg0KKyAgeyAxNTU3LAk1LAkwLAkwLAkiTVVMOG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGY2MDAwMDFjVUxMLCBJbXBsaWNpdExpc3QxMSwgSW1wbGljaXRMaXN0MjIsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTU1NyA9IE1VTDhtDQorICB7IDE1NTgsCTEsCTAsCTAsCSJNVUw4ciIsIDAsIDB4ZjYwMDAwMTRVTEwsIEltcGxpY2l0TGlzdDExLCBJbXBsaWNpdExpc3QyMiwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwNSB9LCAgLy8gSW5zdCAjMTU1OCA9IE1VTDhyDQorICB7IDE1NTksCTcsCTEsCTAsCSJNVUxQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1OTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTU1OSA9IE1VTFBEcm0NCisgIHsgMTU2MCwJMywJMSwJMCwJIk1VTFBEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU5ODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNTYwID0gTVVMUERycg0KKyAgeyAxNTYxLAk3LAkxLAkwLAkiTVVMUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTk0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE1NjEgPSBNVUxQU3JtDQorICB7IDE1NjIsCTMsCTEsCTAsCSJNVUxQU3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1OTQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTU2MiA9IE1VTFBTcnINCisgIHsgMTU2MywJNywJMSwJMCwJIk1VTFNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU5MDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMwIH0sICAvLyBJbnN0ICMxNTYzID0gTVVMU0RybQ0KKyAgeyAxNTY0LAk3LAkxLAkwLAkiTVVMU0RybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU5MDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNTY0ID0gTVVMU0RybV9JbnQNCisgIHsgMTU2NSwJMywJMSwJMCwJIk1VTFNEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU5MDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMxIH0sICAvLyBJbnN0ICMxNTY1ID0gTVVMU0Rycg0KKyAgeyAxNTY2LAkzLAkxLAkwLAkiTVVMU0Rycl9JbnQiLCAwLCAweDU5MDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNTY2ID0gTVVMU0Rycl9JbnQNCisgIHsgMTU2NywJNywJMSwJMCwJIk1VTFNTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU5MDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMyIH0sICAvLyBJbnN0ICMxNTY3ID0gTVVMU1NybQ0KKyAgeyAxNTY4LAk3LAkxLAkwLAkiTVVMU1NybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU5MDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNTY4ID0gTVVMU1NybV9JbnQNCisgIHsgMTU2OSwJMywJMSwJMCwJIk1VTFNTcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU5MDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzMzIH0sICAvLyBJbnN0ICMxNTY5ID0gTVVMU1Nycg0KKyAgeyAxNTcwLAkzLAkxLAkwLAkiTVVMU1Nycl9JbnQiLCAwLCAweDU5MDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNTcwID0gTVVMU1Nycl9JbnQNCisgIHsgMTU3MSwJNSwJMCwJMCwJIk1VTF9GMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDgwMDAwMTlVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzE1NzEgPSBNVUxfRjMybQ0KKyAgeyAxNTcyLAk1LAkwLAkwLAkiTVVMX0Y2NG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkYzAwMDAxOVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTU3MiA9IE1VTF9GNjRtDQorICB7IDE1NzMsCTUsCTAsCTAsCSJNVUxfRkkxNm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkZTAwMDAxOVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTU3MyA9IE1VTF9GSTE2bQ0KKyAgeyAxNTc0LAk1LAkwLAkwLAkiTVVMX0ZJMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGEwMDAwMTlVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzE1NzQgPSBNVUxfRkkzMm0NCisgIHsgMTU3NSwJMSwJMCwJMCwJIk1VTF9GUHJTVDAiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjODAwMDkwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMTU3NSA9IE1VTF9GUHJTVDANCisgIHsgMTU3NiwJMSwJMCwJMCwJIk1VTF9GU1QwciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGM4MDAwMzAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICMxNTc2ID0gTVVMX0ZTVDByDQorICB7IDE1NzcsCTMsCTEsCTAsCSJNVUxfRnAzMiIsIDAsIDB4NDAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzYgfSwgIC8vIEluc3QgIzE1NzcgPSBNVUxfRnAzMg0KKyAgeyAxNTc4LAk3LAkxLAkwLAkiTVVMX0ZwMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNyB9LCAgLy8gSW5zdCAjMTU3OCA9IE1VTF9GcDMybQ0KKyAgeyAxNTc5LAkzLAkxLAkwLAkiTVVMX0ZwNjQiLCAwLCAweDQwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM4IH0sICAvLyBJbnN0ICMxNTc5ID0gTVVMX0ZwNjQNCisgIHsgMTU4MCwJNywJMSwJMCwJIk1VTF9GcDY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzkgfSwgIC8vIEluc3QgIzE1ODAgPSBNVUxfRnA2NG0NCisgIHsgMTU4MSwJNywJMSwJMCwJIk1VTF9GcDY0bTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zOSB9LCAgLy8gSW5zdCAjMTU4MSA9IE1VTF9GcDY0bTMyDQorICB7IDE1ODIsCTMsCTEsCTAsCSJNVUxfRnA4MCIsIDAsIDB4NDAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDAgfSwgIC8vIEluc3QgIzE1ODIgPSBNVUxfRnA4MA0KKyAgeyAxNTgzLAk3LAkxLAkwLAkiTVVMX0ZwODBtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICMxNTgzID0gTVVMX0ZwODBtMzINCisgIHsgMTU4NCwJNywJMSwJMCwJIk1VTF9GcDgwbTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MSB9LCAgLy8gSW5zdCAjMTU4NCA9IE1VTF9GcDgwbTY0DQorICB7IDE1ODUsCTcsCTEsCTAsCSJNVUxfRnBJMTZtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM3IH0sICAvLyBJbnN0ICMxNTg1ID0gTVVMX0ZwSTE2bTMyDQorICB7IDE1ODYsCTcsCTEsCTAsCSJNVUxfRnBJMTZtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICMxNTg2ID0gTVVMX0ZwSTE2bTY0DQorICB7IDE1ODcsCTcsCTEsCTAsCSJNVUxfRnBJMTZtODAiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICMxNTg3ID0gTVVMX0ZwSTE2bTgwDQorICB7IDE1ODgsCTcsCTEsCTAsCSJNVUxfRnBJMzJtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM3IH0sICAvLyBJbnN0ICMxNTg4ID0gTVVMX0ZwSTMybTMyDQorICB7IDE1ODksCTcsCTEsCTAsCSJNVUxfRnBJMzJtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICMxNTg5ID0gTVVMX0ZwSTMybTY0DQorICB7IDE1OTAsCTcsCTEsCTAsCSJNVUxfRnBJMzJtODAiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICMxNTkwID0gTVVMX0ZwSTMybTgwDQorICB7IDE1OTEsCTEsCTAsCTAsCSJNVUxfRnJTVDAiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjODAwMDcwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMTU5MSA9IE1VTF9GclNUMA0KKyAgeyAxNTkyLAkwLAkwLAkwLAkiTVdBSVQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTAwMDEyNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMTU5MiA9IE1XQUlUDQorICB7IDE1OTMsCTUsCTAsCTAsCSJORUcxNm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmNzAwMDA1YlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxNTkzID0gTkVHMTZtDQorICB7IDE1OTQsCTIsCTEsCTAsCSJORUcxNnIiLCAwLCAweGY3MDAwMDUzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAyIH0sICAvLyBJbnN0ICMxNTk0ID0gTkVHMTZyDQorICB7IDE1OTUsCTUsCTAsCTAsCSJORUczMm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmNzAwMDAxYlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxNTk1ID0gTkVHMzJtDQorICB7IDE1OTYsCTIsCTEsCTAsCSJORUczMnIiLCAwLCAweGY3MDAwMDEzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTkgfSwgIC8vIEluc3QgIzE1OTYgPSBORUczMnINCisgIHsgMTU5NywJNSwJMCwJMCwJIk5FRzY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGY3MDAxMDFiVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzE1OTcgPSBORUc2NG0NCisgIHsgMTU5OCwJMiwJMSwJMCwJIk5FRzY0ciIsIDAsIDB4ZjcwMDEwMTNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MCB9LCAgLy8gSW5zdCAjMTU5OCA9IE5FRzY0cg0KKyAgeyAxNTk5LAk1LAkwLAkwLAkiTkVHOG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmNjAwMDAxYlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxNTk5ID0gTkVHOG0NCisgIHsgMTYwMCwJMiwJMSwJMCwJIk5FRzhyIiwgMCwgMHhmNjAwMDAxM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMyB9LCAgLy8gSW5zdCAjMTYwMCA9IE5FRzhyDQorICB7IDE2MDEsCTAsCTAsCTAsCSJOT09QIiwgMCwgMHg5MDAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMTYwMSA9IE5PT1ANCisgIHsgMTYwMiwJNSwJMCwJMCwJIk5PT1BMIiwgMCwgMHgxZjAwMDExOFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTYwMiA9IE5PT1BMDQorICB7IDE2MDMsCTUsCTAsCTAsCSJOT09QVyIsIDAsIDB4MWYwMDAxNThVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzE2MDMgPSBOT09QVw0KKyAgeyAxNjA0LAk1LAkwLAkwLAkiTk9UMTZtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZjcwMDAwNWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzE2MDQgPSBOT1QxNm0NCisgIHsgMTYwNSwJMiwJMSwJMCwJIk5PVDE2ciIsIDAsIDB4ZjcwMDAwNTJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTAyIH0sICAvLyBJbnN0ICMxNjA1ID0gTk9UMTZyDQorICB7IDE2MDYsCTUsCTAsCTAsCSJOT1QzMm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmNzAwMDAxYVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTYwNiA9IE5PVDMybQ0KKyAgeyAxNjA3LAkyLAkxLAkwLAkiTk9UMzJyIiwgMCwgMHhmNzAwMDAxMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81OSB9LCAgLy8gSW5zdCAjMTYwNyA9IE5PVDMycg0KKyAgeyAxNjA4LAk1LAkwLAkwLAkiTk9UNjRtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZjcwMDEwMWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzE2MDggPSBOT1Q2NG0NCisgIHsgMTYwOSwJMiwJMSwJMCwJIk5PVDY0ciIsIDAsIDB4ZjcwMDEwMTJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjAgfSwgIC8vIEluc3QgIzE2MDkgPSBOT1Q2NHINCisgIHsgMTYxMCwJNSwJMCwJMCwJIk5PVDhtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZjYwMDAwMWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzE2MTAgPSBOT1Q4bQ0KKyAgeyAxNjExLAkyLAkxLAkwLAkiTk9UOHIiLCAwLCAweGY2MDAwMDEyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwMyB9LCAgLy8gSW5zdCAjMTYxMSA9IE5PVDhyDQorICB7IDE2MTIsCTEsCTAsCTAsCSJPUjE2aTE2IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDAwNjA0MVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzE2MTIgPSBPUjE2aTE2DQorICB7IDE2MTMsCTYsCTAsCTAsCSJPUjE2bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MTAwNjA1OVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxNjEzID0gT1IxNm1pDQorICB7IDE2MTQsCTYsCTAsCTAsCSJPUjE2bWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODMwMDIwNTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTYxNCA9IE9SMTZtaTgNCisgIHsgMTYxNSwJNiwJMCwJMCwJIk9SMTZtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDkwMDAwNDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjMTYxNSA9IE9SMTZtcg0KKyAgeyAxNjE2LAkzLAkxLAkwLAkiT1IxNnJpIiwgMCwgMHg4MTAwNjA1MVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyIH0sICAvLyBJbnN0ICMxNjE2ID0gT1IxNnJpDQorICB7IDE2MTcsCTMsCTEsCTAsCSJPUjE2cmk4IiwgMCwgMHg4MzAwMjA1MVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyIH0sICAvLyBJbnN0ICMxNjE3ID0gT1IxNnJpOA0KKyAgeyAxNjE4LAk3LAkxLAkwLAkiT1IxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiMDAwMDQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTMgfSwgIC8vIEluc3QgIzE2MTggPSBPUjE2cm0NCisgIHsgMTYxOSwJMywJMSwJMCwJIk9SMTZyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4OTAwMDA0M1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMxNjE5ID0gT1IxNnJyDQorICB7IDE2MjAsCTMsCTEsCTAsCSJPUjE2cnJfUkVWIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YjAwMDA0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMxNjIwID0gT1IxNnJyX1JFVg0KKyAgeyAxNjIxLAkxLAkwLAkwLAkiT1IzMmkzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQwMGEwMDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxNjIxID0gT1IzMmkzMg0KKyAgeyAxNjIyLAk2LAkwLAkwLAkiT1IzMm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODEwMGEwMTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTYyMiA9IE9SMzJtaQ0KKyAgeyAxNjIzLAk2LAkwLAkwLAkiT1IzMm1pOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgzMDAyMDE5VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzE2MjMgPSBPUjMybWk4DQorICB7IDE2MjQsCTYsCTAsCTAsCSJPUjMybXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5MDAwMDA0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTUgfSwgIC8vIEluc3QgIzE2MjQgPSBPUjMybXINCisgIHsgMTYyNSwJMywJMSwJMCwJIk9SMzJyaSIsIDAsIDB4ODEwMGEwMTFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjMTYyNSA9IE9SMzJyaQ0KKyAgeyAxNjI2LAkzLAkxLAkwLAkiT1IzMnJpOCIsIDAsIDB4ODMwMDIwMTFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjMTYyNiA9IE9SMzJyaTgNCisgIHsgMTYyNywJNywJMSwJMCwJIk9SMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YjAwMDAwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICMxNjI3ID0gT1IzMnJtDQorICB7IDE2MjgsCTMsCTEsCTAsCSJPUjMycnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDkwMDAwMDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMTYyOCA9IE9SMzJycg0KKyAgeyAxNjI5LAkzLAkxLAkwLAkiT1IzMnJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGIwMDAwMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMTYyOSA9IE9SMzJycl9SRVYNCisgIHsgMTYzMCwJMSwJMCwJMCwJIk9SNjRpMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMDBiMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTYzMCA9IE9SNjRpMzINCisgIHsgMTYzMSwJNiwJMCwJMCwJIk9SNjRtaTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODEwMGIwMTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTYzMSA9IE9SNjRtaTMyDQorICB7IDE2MzIsCTYsCTAsCTAsCSJPUjY0bWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODMwMDMwMTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMTYzMiA9IE9SNjRtaTgNCisgIHsgMTYzMywJNiwJMCwJMCwJIk9SNjRtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDkwMDEwMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOSB9LCAgLy8gSW5zdCAjMTYzMyA9IE9SNjRtcg0KKyAgeyAxNjM0LAkzLAkxLAkwLAkiT1I2NHJpMzIiLCAwLCAweDgxMDBiMDExVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjAgfSwgIC8vIEluc3QgIzE2MzQgPSBPUjY0cmkzMg0KKyAgeyAxNjM1LAkzLAkxLAkwLAkiT1I2NHJpOCIsIDAsIDB4ODMwMDMwMTFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMCB9LCAgLy8gSW5zdCAjMTYzNSA9IE9SNjRyaTgNCisgIHsgMTYzNiwJNywJMSwJMCwJIk9SNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YjAwMTAwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIxIH0sICAvLyBJbnN0ICMxNjM2ID0gT1I2NHJtDQorICB7IDE2MzcsCTMsCTEsCTAsCSJPUjY0cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDkwMDEwMDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMTYzNyA9IE9SNjRycg0KKyAgeyAxNjM4LAkzLAkxLAkwLAkiT1I2NHJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGIwMDEwMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMTYzOCA9IE9SNjRycl9SRVYNCisgIHsgMTYzOSwJMSwJMCwJMCwJIk9SOGk4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzAwMjAwMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzE2MzkgPSBPUjhpOA0KKyAgeyAxNjQwLAk2LAkwLAkwLAkiT1I4bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MDAwMjAxOVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMxNjQwID0gT1I4bWkNCisgIHsgMTY0MSwJNiwJMCwJMCwJIk9SOG1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODAwMDAwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI0IH0sICAvLyBJbnN0ICMxNjQxID0gT1I4bXINCisgIHsgMTY0MiwJMywJMSwJMCwJIk9SOHJpIiwgMCwgMHg4MDAwMjAxMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI1IH0sICAvLyBJbnN0ICMxNjQyID0gT1I4cmkNCisgIHsgMTY0MywJNywJMSwJMCwJIk9SOHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhhMDAwMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjYgfSwgIC8vIEluc3QgIzE2NDMgPSBPUjhybQ0KKyAgeyAxNjQ0LAkzLAkxLAkwLAkiT1I4cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDgwMDAwMDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNyB9LCAgLy8gSW5zdCAjMTY0NCA9IE9SOHJyDQorICB7IDE2NDUsCTMsCTEsCTAsCSJPUjhycl9SRVYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhMDAwMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjcgfSwgIC8vIEluc3QgIzE2NDUgPSBPUjhycl9SRVYNCisgIHsgMTY0NiwJNywJMSwJMCwJIk9SUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTY4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE2NDYgPSBPUlBEcm0NCisgIHsgMTY0NywJMywJMSwJMCwJIk9SUERyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTY4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE2NDcgPSBPUlBEcnINCisgIHsgMTY0OCwJNywJMSwJMCwJIk9SUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTY0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE2NDggPSBPUlBTcm0NCisgIHsgMTY0OSwJMywJMSwJMCwJIk9SUFNyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTY0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE2NDkgPSBPUlBTcnINCisgIHsgMTY1MCwJMSwJMCwJMCwJIk9VVDE2aXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlNzAwMjA0MVVMTCwgSW1wbGljaXRMaXN0MTIsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTY1MCA9IE9VVDE2aXINCisgIHsgMTY1MSwJMCwJMCwJMCwJIk9VVDE2cnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlZjAwMDA0MVVMTCwgSW1wbGljaXRMaXN0MzgsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzE2NTEgPSBPVVQxNnJyDQorICB7IDE2NTIsCTEsCTAsCTAsCSJPVVQzMmlyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTcwMDIwMDFVTEwsIEltcGxpY2l0TGlzdDEzLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzE2NTIgPSBPVVQzMmlyDQorICB7IDE2NTMsCTAsCTAsCTAsCSJPVVQzMnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZWYwMDAwMDFVTEwsIEltcGxpY2l0TGlzdDM5LCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxNjUzID0gT1VUMzJycg0KKyAgeyAxNjU0LAkxLAkwLAkwLAkiT1VUOGlyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTYwMDIwMDFVTEwsIEltcGxpY2l0TGlzdDExLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzE2NTQgPSBPVVQ4aXINCisgIHsgMTY1NSwJMCwJMCwJMCwJIk9VVDhyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGVlMDAwMDAxVUxMLCBJbXBsaWNpdExpc3Q0MCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMTY1NSA9IE9VVDhycg0KKyAgeyAxNjU2LAkwLAkwLAkwLAkiT1VUU0IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg2ZTAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMTY1NiA9IE9VVFNCDQorICB7IDE2NTcsCTAsCTAsCTAsCSJPVVRTRCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDZmMDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxNjU3ID0gT1VUU0QNCisgIHsgMTY1OCwJMCwJMCwJMCwJIk9VVFNXIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NmYwMDAwNDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzE2NTggPSBPVVRTVw0KKyAgeyAxNjU5LAk2LAkxLAkwLAkiUEFCU0JybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MWNjMDJkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE2NTkgPSBQQUJTQnJtMTI4DQorICB7IDE2NjAsCTYsCTEsCTAsCSJQQUJTQnJtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDFjYzAyZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyNyB9LCAgLy8gSW5zdCAjMTY2MCA9IFBBQlNCcm02NA0KKyAgeyAxNjYxLAkyLAkxLAkwLAkiUEFCU0JycjEyOCIsIDAsIDB4MWNjMDJkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE2NjEgPSBQQUJTQnJyMTI4DQorICB7IDE2NjIsCTIsCTEsCTAsCSJQQUJTQnJyNjQiLCAwLCAweDFjYzAyZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0MSB9LCAgLy8gSW5zdCAjMTY2MiA9IFBBQlNCcnI2NA0KKyAgeyAxNjYzLAk2LAkxLAkwLAkiUEFCU0RybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MWVjMDJkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE2NjMgPSBQQUJTRHJtMTI4DQorICB7IDE2NjQsCTYsCTEsCTAsCSJQQUJTRHJtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDFlYzAyZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyNyB9LCAgLy8gSW5zdCAjMTY2NCA9IFBBQlNEcm02NA0KKyAgeyAxNjY1LAkyLAkxLAkwLAkiUEFCU0RycjEyOCIsIDAsIDB4MWVjMDJkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE2NjUgPSBQQUJTRHJyMTI4DQorICB7IDE2NjYsCTIsCTEsCTAsCSJQQUJTRHJyNjQiLCAwLCAweDFlYzAyZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0MSB9LCAgLy8gSW5zdCAjMTY2NiA9IFBBQlNEcnI2NA0KKyAgeyAxNjY3LAk2LAkxLAkwLAkiUEFCU1dybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MWRjMDJkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE2NjcgPSBQQUJTV3JtMTI4DQorICB7IDE2NjgsCTYsCTEsCTAsCSJQQUJTV3JtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDFkYzAyZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEyNyB9LCAgLy8gSW5zdCAjMTY2OCA9IFBBQlNXcm02NA0KKyAgeyAxNjY5LAkyLAkxLAkwLAkiUEFCU1dycjEyOCIsIDAsIDB4MWRjMDJkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE2NjkgPSBQQUJTV3JyMTI4DQorICB7IDE2NzAsCTIsCTEsCTAsCSJQQUJTV3JyNjQiLCAwLCAweDFkYzAyZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0MSB9LCAgLy8gSW5zdCAjMTY3MCA9IFBBQlNXcnI2NA0KKyAgeyAxNjcxLAk3LAkxLAkwLAkiUEFDS1NTRFdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NmJjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE2NzEgPSBQQUNLU1NEV3JtDQorICB7IDE2NzIsCTMsCTEsCTAsCSJQQUNLU1NEV3JyIiwgMCwgMHg2YmMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTY3MiA9IFBBQ0tTU0RXcnINCisgIHsgMTY3MywJNywJMSwJMCwJIlBBQ0tTU1dCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDYzYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNjczID0gUEFDS1NTV0JybQ0KKyAgeyAxNjc0LAkzLAkxLAkwLAkiUEFDS1NTV0JyciIsIDAsIDB4NjNjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE2NzQgPSBQQUNLU1NXQnJyDQorICB7IDE2NzUsCTcsCTEsCTAsCSJQQUNLVVNEV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyYmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTY3NSA9IFBBQ0tVU0RXcm0NCisgIHsgMTY3NiwJMywJMSwJMCwJIlBBQ0tVU0RXcnIiLCAwLCAweDJiYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNjc2ID0gUEFDS1VTRFdycg0KKyAgeyAxNjc3LAk3LAkxLAkwLAkiUEFDS1VTV0JybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NjdjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE2NzcgPSBQQUNLVVNXQnJtDQorICB7IDE2NzgsCTMsCTEsCTAsCSJQQUNLVVNXQnJyIiwgMCwgMHg2N2MwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTY3OCA9IFBBQ0tVU1dCcnINCisgIHsgMTY3OSwJNywJMSwJMCwJIlBBRERCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGZjYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNjc5ID0gUEFEREJybQ0KKyAgeyAxNjgwLAkzLAkxLAkwLAkiUEFEREJyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZmNjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE2ODAgPSBQQUREQnJyDQorICB7IDE2ODEsCTcsCTEsCTAsCSJQQURERHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmZWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTY4MSA9IFBBREREcm0NCisgIHsgMTY4MiwJMywJMSwJMCwJIlBBREREcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGZlYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNjgyID0gUEFERERycg0KKyAgeyAxNjgzLAk3LAkxLAkwLAkiUEFERFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZDRjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE2ODMgPSBQQUREUXJtDQorICB7IDE2ODQsCTMsCTEsCTAsCSJQQUREUXJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhkNGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTY4NCA9IFBBRERRcnINCisgIHsgMTY4NSwJNywJMSwJMCwJIlBBRERTQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlY2MwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTY4NSA9IFBBRERTQnJtDQorICB7IDE2ODYsCTMsCTEsCTAsCSJQQUREU0JyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZWNjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE2ODYgPSBQQUREU0Jycg0KKyAgeyAxNjg3LAk3LAkxLAkwLAkiUEFERFNXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGVkYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNjg3ID0gUEFERFNXcm0NCisgIHsgMTY4OCwJMywJMSwJMCwJIlBBRERTV3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhlZGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTY4OCA9IFBBRERTV3JyDQorICB7IDE2ODksCTcsCTEsCTAsCSJQQUREVVNCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGRjYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNjg5ID0gUEFERFVTQnJtDQorICB7IDE2OTAsCTMsCTEsCTAsCSJQQUREVVNCcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGRjYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNjkwID0gUEFERFVTQnJyDQorICB7IDE2OTEsCTcsCTEsCTAsCSJQQUREVVNXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGRkYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNjkxID0gUEFERFVTV3JtDQorICB7IDE2OTIsCTMsCTEsCTAsCSJQQUREVVNXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGRkYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNjkyID0gUEFERFVTV3JyDQorICB7IDE2OTMsCTcsCTEsCTAsCSJQQUREV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmZGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTY5MyA9IFBBRERXcm0NCisgIHsgMTY5NCwJMywJMSwJMCwJIlBBRERXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGZkYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNjk0ID0gUEFERFdycg0KKyAgeyAxNjk1LAk4LAkxLAkwLAkiUEFMSUdOUjEyOHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MSB9LCAgLy8gSW5zdCAjMTY5NSA9IFBBTElHTlIxMjhybQ0KKyAgeyAxNjk2LAk0LAkxLAkwLAkiUEFMSUdOUjEyOHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MiB9LCAgLy8gSW5zdCAjMTY5NiA9IFBBTElHTlIxMjhycg0KKyAgeyAxNjk3LAk4LAkxLAkwLAkiUEFMSUdOUjY0cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmYzAyZTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MiB9LCAgLy8gSW5zdCAjMTY5NyA9IFBBTElHTlI2NHJtDQorICB7IDE2OTgsCTQsCTEsCTAsCSJQQUxJR05SNjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZjMDJlMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjAzIH0sICAvLyBJbnN0ICMxNjk4ID0gUEFMSUdOUjY0cnINCisgIHsgMTY5OSwJNywJMSwJMCwJIlBBTkROcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGRmYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNjk5ID0gUEFORE5ybQ0KKyAgeyAxNzAwLAkzLAkxLAkwLAkiUEFORE5yciIsIDAsIDB4ZGZjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE3MDAgPSBQQU5ETnJyDQorICB7IDE3MDEsCTcsCTEsCTAsCSJQQU5Ecm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGRiYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNzAxID0gUEFORHJtDQorICB7IDE3MDIsCTMsCTEsCTAsCSJQQU5EcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGRiYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNzAyID0gUEFORHJyDQorICB7IDE3MDMsCTAsCTAsCTAsCSJQQVVTRSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDkwMDAwMjAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxNzAzID0gUEFVU0UNCisgIHsgMTcwNCwJNywJMSwJMCwJIlBBVkdCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGUwYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNzA0ID0gUEFWR0JybQ0KKyAgeyAxNzA1LAkzLAkxLAkwLAkiUEFWR0JyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZTBjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE3MDUgPSBQQVZHQnJyDQorICB7IDE3MDYsCTcsCTEsCTAsCSJQQVZHV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlM2MwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTcwNiA9IFBBVkdXcm0NCisgIHsgMTcwNywJMywJMSwJMCwJIlBBVkdXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGUzYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNzA3ID0gUEFWR1dycg0KKyAgeyAxNzA4LAk3LAkxLAkwLAkiUEJMRU5EVkJybTAiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEwYzAwZDQ2VUxMLCBJbXBsaWNpdExpc3Q4LCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNzA4ID0gUEJMRU5EVkJybTANCisgIHsgMTcwOSwJMywJMSwJMCwJIlBCTEVORFZCcnIwIiwgMCwgMHgxMGMwMGQ0NVVMTCwgSW1wbGljaXRMaXN0OCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTcwOSA9IFBCTEVORFZCcnIwDQorICB7IDE3MTAsCTgsCTEsCTAsCSJQQkxFTkRXcm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUxIH0sICAvLyBJbnN0ICMxNzEwID0gUEJMRU5EV3JtaQ0KKyAgeyAxNzExLAk0LAkxLAkwLAkiUEJMRU5EV3JyaSIsIDAsIDB4ZWMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MiB9LCAgLy8gSW5zdCAjMTcxMSA9IFBCTEVORFdycmkNCisgIHsgMTcxMiwJNywJMSwJMCwJIlBDTVBFUUJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NzRjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE3MTIgPSBQQ01QRVFCcm0NCisgIHsgMTcxMywJMywJMSwJMCwJIlBDTVBFUUJyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NzRjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE3MTMgPSBQQ01QRVFCcnINCisgIHsgMTcxNCwJNywJMSwJMCwJIlBDTVBFUURybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NzZjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE3MTQgPSBQQ01QRVFEcm0NCisgIHsgMTcxNSwJMywJMSwJMCwJIlBDTVBFUURyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NzZjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE3MTUgPSBQQ01QRVFEcnINCisgIHsgMTcxNiwJNywJMSwJMCwJIlBDTVBFUVFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MjljMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE3MTYgPSBQQ01QRVFRcm0NCisgIHsgMTcxNywJMywJMSwJMCwJIlBDTVBFUVFyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4MjljMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE3MTcgPSBQQ01QRVFRcnINCisgIHsgMTcxOCwJNywJMSwJMCwJIlBDTVBFUVdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NzVjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE3MTggPSBQQ01QRVFXcm0NCisgIHsgMTcxOSwJMywJMSwJMCwJIlBDTVBFUVdyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NzVjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE3MTkgPSBQQ01QRVFXcnINCisgIHsgMTcyMCwJNywJMCwJMCwJIlBDTVBFU1RSSUFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NjFjMDJlNDZVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMxNzIwID0gUENNUEVTVFJJQXJtDQorICB7IDE3MjEsCTMsCTAsCTAsCSJQQ01QRVNUUklBcnIiLCAwLCAweDYxYzAyZTQ1VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMTcyMSA9IFBDTVBFU1RSSUFycg0KKyAgeyAxNzIyLAk3LAkwLAkwLAkiUENNUEVTVFJJQ3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2MWMwMmU0NlVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzE3MjIgPSBQQ01QRVNUUklDcm0NCisgIHsgMTcyMywJMywJMCwJMCwJIlBDTVBFU1RSSUNyciIsIDAsIDB4NjFjMDJlNDVVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMxNzIzID0gUENNUEVTVFJJQ3JyDQorICB7IDE3MjQsCTcsCTAsCTAsCSJQQ01QRVNUUklPcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDYxYzAyZTQ2VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMTcyNCA9IFBDTVBFU1RSSU9ybQ0KKyAgeyAxNzI1LAkzLAkwLAkwLAkiUENNUEVTVFJJT3JyIiwgMCwgMHg2MWMwMmU0NVVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzE3MjUgPSBQQ01QRVNUUklPcnINCisgIHsgMTcyNiwJNywJMCwJMCwJIlBDTVBFU1RSSVNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NjFjMDJlNDZVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMxNzI2ID0gUENNUEVTVFJJU3JtDQorICB7IDE3MjcsCTMsCTAsCTAsCSJQQ01QRVNUUklTcnIiLCAwLCAweDYxYzAyZTQ1VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMTcyNyA9IFBDTVBFU1RSSVNycg0KKyAgeyAxNzI4LAk3LAkwLAkwLAkiUENNUEVTVFJJWnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2MWMwMmU0NlVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzE3MjggPSBQQ01QRVNUUklacm0NCisgIHsgMTcyOSwJMywJMCwJMCwJIlBDTVBFU1RSSVpyciIsIDAsIDB4NjFjMDJlNDVVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMxNzI5ID0gUENNUEVTVFJJWnJyDQorICB7IDE3MzAsCTcsCTAsCTAsCSJQQ01QRVNUUklybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NjFjMDJlNDZVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMxNzMwID0gUENNUEVTVFJJcm0NCisgIHsgMTczMSwJMywJMCwJMCwJIlBDTVBFU1RSSXJyIiwgMCwgMHg2MWMwMmU0NVVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzE3MzEgPSBQQ01QRVNUUklycg0KKyAgeyAxNzMyLAk4LAkxLAkwLAkiUENNUEVTVFJNMTI4TUVNIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDIwMDBVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTM0IH0sICAvLyBJbnN0ICMxNzMyID0gUENNUEVTVFJNMTI4TUVNDQorICB7IDE3MzMsCTQsCTEsCTAsCSJQQ01QRVNUUk0xMjhSRUciLCAwfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MjAwMFVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjMTczMyA9IFBDTVBFU1RSTTEyOFJFRw0KKyAgeyAxNzM0LAk3LAkwLAkwLAkiUENNUEVTVFJNMTI4cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg2MGMwMmU0NlVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDQyLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzE3MzQgPSBQQ01QRVNUUk0xMjhybQ0KKyAgeyAxNzM1LAkzLAkwLAkwLAkiUENNUEVTVFJNMTI4cnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg2MGMwMmU0NVVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDQyLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzE3MzUgPSBQQ01QRVNUUk0xMjhycg0KKyAgeyAxNzM2LAk3LAkxLAkwLAkiUENNUEdUQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2NGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTczNiA9IFBDTVBHVEJybQ0KKyAgeyAxNzM3LAkzLAkxLAkwLAkiUENNUEdUQnJyIiwgMCwgMHg2NGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTczNyA9IFBDTVBHVEJycg0KKyAgeyAxNzM4LAk3LAkxLAkwLAkiUENNUEdURHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2NmMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTczOCA9IFBDTVBHVERybQ0KKyAgeyAxNzM5LAkzLAkxLAkwLAkiUENNUEdURHJyIiwgMCwgMHg2NmMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTczOSA9IFBDTVBHVERycg0KKyAgeyAxNzQwLAk3LAkxLAkwLAkiUENNUEdUUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTc0MCA9IFBDTVBHVFFybQ0KKyAgeyAxNzQxLAkzLAkxLAkwLAkiUENNUEdUUXJyIiwgMCwgMHgzN2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTc0MSA9IFBDTVBHVFFycg0KKyAgeyAxNzQyLAk3LAkxLAkwLAkiUENNUEdUV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2NWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTc0MiA9IFBDTVBHVFdybQ0KKyAgeyAxNzQzLAkzLAkxLAkwLAkiUENNUEdUV3JyIiwgMCwgMHg2NWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTc0MyA9IFBDTVBHVFdycg0KKyAgeyAxNzQ0LAk3LAkwLAkwLAkiUENNUElTVFJJQXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2M2MwMmU0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMTc0NCA9IFBDTVBJU1RSSUFybQ0KKyAgeyAxNzQ1LAkzLAkwLAkwLAkiUENNUElTVFJJQXJyIiwgMCwgMHg2M2MwMmU0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMTc0NSA9IFBDTVBJU1RSSUFycg0KKyAgeyAxNzQ2LAk3LAkwLAkwLAkiUENNUElTVFJJQ3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2M2MwMmU0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMTc0NiA9IFBDTVBJU1RSSUNybQ0KKyAgeyAxNzQ3LAkzLAkwLAkwLAkiUENNUElTVFJJQ3JyIiwgMCwgMHg2M2MwMmU0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMTc0NyA9IFBDTVBJU1RSSUNycg0KKyAgeyAxNzQ4LAk3LAkwLAkwLAkiUENNUElTVFJJT3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2M2MwMmU0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMTc0OCA9IFBDTVBJU1RSSU9ybQ0KKyAgeyAxNzQ5LAkzLAkwLAkwLAkiUENNUElTVFJJT3JyIiwgMCwgMHg2M2MwMmU0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMTc0OSA9IFBDTVBJU1RSSU9ycg0KKyAgeyAxNzUwLAk3LAkwLAkwLAkiUENNUElTVFJJU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2M2MwMmU0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMTc1MCA9IFBDTVBJU1RSSVNybQ0KKyAgeyAxNzUxLAkzLAkwLAkwLAkiUENNUElTVFJJU3JyIiwgMCwgMHg2M2MwMmU0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMTc1MSA9IFBDTVBJU1RSSVNycg0KKyAgeyAxNzUyLAk3LAkwLAkwLAkiUENNUElTVFJJWnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2M2MwMmU0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMTc1MiA9IFBDTVBJU1RSSVpybQ0KKyAgeyAxNzUzLAkzLAkwLAkwLAkiUENNUElTVFJJWnJyIiwgMCwgMHg2M2MwMmU0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMTc1MyA9IFBDTVBJU1RSSVpycg0KKyAgeyAxNzU0LAk3LAkwLAkwLAkiUENNUElTVFJJcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDYzYzAyZTQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMxNzU0ID0gUENNUElTVFJJcm0NCisgIHsgMTc1NSwJMywJMCwJMCwJIlBDTVBJU1RSSXJyIiwgMCwgMHg2M2MwMmU0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMTc1NSA9IFBDTVBJU1RSSXJyDQorICB7IDE3NTYsCTgsCTEsCTAsCSJQQ01QSVNUUk0xMjhNRU0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MjAwMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMTc1NiA9IFBDTVBJU1RSTTEyOE1FTQ0KKyAgeyAxNzU3LAk0LAkxLAkwLAkiUENNUElTVFJNMTI4UkVHIiwgMHwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDIwMDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjMTc1NyA9IFBDTVBJU1RSTTEyOFJFRw0KKyAgeyAxNzU4LAk3LAkwLAkwLAkiUENNUElTVFJNMTI4cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg2MmMwMmU0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDIsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMTc1OCA9IFBDTVBJU1RSTTEyOHJtDQorICB7IDE3NTksCTMsCTAsCTAsCSJQQ01QSVNUUk0xMjhyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDYyYzAyZTQ1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3Q0MiwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMxNzU5ID0gUENNUElTVFJNMTI4cnINCisgIHsgMTc2MCwJNywJMCwJMCwJIlBFWFRSQm1yIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTRjMDJlNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA2IH0sICAvLyBJbnN0ICMxNzYwID0gUEVYVFJCbXINCisgIHsgMTc2MSwJMywJMSwJMCwJIlBFWFRSQnJyIiwgMCwgMHgxNGMwMmU0M1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDcgfSwgIC8vIEluc3QgIzE3NjEgPSBQRVhUUkJycg0KKyAgeyAxNzYyLAk3LAkwLAkwLAkiUEVYVFJEbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxNmMwMmU0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDYgfSwgIC8vIEluc3QgIzE3NjIgPSBQRVhUUkRtcg0KKyAgeyAxNzYzLAkzLAkxLAkwLAkiUEVYVFJEcnIiLCAwLCAweDE2YzAyZTQzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNyB9LCAgLy8gSW5zdCAjMTc2MyA9IFBFWFRSRHJyDQorICB7IDE3NjQsCTcsCTAsCTAsCSJQRVhUUlFtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDE2YzAzZTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNiB9LCAgLy8gSW5zdCAjMTc2NCA9IFBFWFRSUW1yDQorICB7IDE3NjUsCTMsCTEsCTAsCSJQRVhUUlFyciIsIDAsIDB4MTZjMDNlNDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA0IH0sICAvLyBJbnN0ICMxNzY1ID0gUEVYVFJRcnINCisgIHsgMTc2NiwJNywJMCwJMCwJIlBFWFRSV21yIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTVjMDJlNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA2IH0sICAvLyBJbnN0ICMxNzY2ID0gUEVYVFJXbXINCisgIHsgMTc2NywJMywJMSwJMCwJIlBFWFRSV3JpIiwgMCwgMHhjNWMwMjE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDcgfSwgIC8vIEluc3QgIzE3NjcgPSBQRVhUUldyaQ0KKyAgeyAxNzY4LAk3LAkxLAkwLAkiUEhBREREcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE3NjggPSBQSEFERERybTEyOA0KKyAgeyAxNzY5LAk3LAkxLAkwLAkiUEhBREREcm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmMwMGQwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzE3NjkgPSBQSEFERERybTY0DQorICB7IDE3NzAsCTMsCTEsCTAsCSJQSEFERERycjEyOCIsIDAsIDB4MmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTc3MCA9IFBIQURERHJyMTI4DQorICB7IDE3NzEsCTMsCTEsCTAsCSJQSEFERERycjY0IiwgMCwgMHgyYzAwZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTc3MSA9IFBIQURERHJyNjQNCisgIHsgMTc3MiwJNywJMSwJMCwJIlBIQUREU1dybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4M2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTc3MiA9IFBIQUREU1dybTEyOA0KKyAgeyAxNzczLAk3LAkxLAkwLAkiUEhBRERTV3JtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDNjMDBkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxNzczID0gUEhBRERTV3JtNjQNCisgIHsgMTc3NCwJMywJMSwJMCwJIlBIQUREU1dycjEyOCIsIDAsIDB4M2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTc3NCA9IFBIQUREU1dycjEyOA0KKyAgeyAxNzc1LAkzLAkxLAkwLAkiUEhBRERTV3JyNjQiLCAwLCAweDNjMDBkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxNzc1ID0gUEhBRERTV3JyNjQNCisgIHsgMTc3NiwJNywJMSwJMCwJIlBIQUREV3JtMTI4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNzc2ID0gUEhBRERXcm0xMjgNCisgIHsgMTc3NywJNywJMSwJMCwJIlBIQUREV3JtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDFjMDBkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxNzc3ID0gUEhBRERXcm02NA0KKyAgeyAxNzc4LAkzLAkxLAkwLAkiUEhBRERXcnIxMjgiLCAwLCAweDFjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE3NzggPSBQSEFERFdycjEyOA0KKyAgeyAxNzc5LAkzLAkxLAkwLAkiUEhBRERXcnI2NCIsIDAsIDB4MWMwMGQwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzE3NzkgPSBQSEFERFdycjY0DQorICB7IDE3ODAsCTYsCTEsCTAsCSJQSE1JTlBPU1VXcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQxYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxNzgwID0gUEhNSU5QT1NVV3JtMTI4DQorICB7IDE3ODEsCTIsCTEsCTAsCSJQSE1JTlBPU1VXcnIxMjgiLCAwLCAweDQxYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMxNzgxID0gUEhNSU5QT1NVV3JyMTI4DQorICB7IDE3ODIsCTcsCTEsCTAsCSJQSFNVQkRybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTc4MiA9IFBIU1VCRHJtMTI4DQorICB7IDE3ODMsCTcsCTEsCTAsCSJQSFNVQkRybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2YzAwZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTc4MyA9IFBIU1VCRHJtNjQNCisgIHsgMTc4NCwJMywJMSwJMCwJIlBIU1VCRHJyMTI4IiwgMCwgMHg2YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNzg0ID0gUEhTVUJEcnIxMjgNCisgIHsgMTc4NSwJMywJMSwJMCwJIlBIU1VCRHJyNjQiLCAwLCAweDZjMDBkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxNzg1ID0gUEhTVUJEcnI2NA0KKyAgeyAxNzg2LAk3LAkxLAkwLAkiUEhTVUJTV3JtMTI4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg3YzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxNzg2ID0gUEhTVUJTV3JtMTI4DQorICB7IDE3ODcsCTcsCTEsCTAsCSJQSFNVQlNXcm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4N2MwMGQwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzE3ODcgPSBQSFNVQlNXcm02NA0KKyAgeyAxNzg4LAkzLAkxLAkwLAkiUEhTVUJTV3JyMTI4IiwgMCwgMHg3YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxNzg4ID0gUEhTVUJTV3JyMTI4DQorICB7IDE3ODksCTMsCTEsCTAsCSJQSFNVQlNXcnI2NCIsIDAsIDB4N2MwMGQwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzE3ODkgPSBQSFNVQlNXcnI2NA0KKyAgeyAxNzkwLAk3LAkxLAkwLAkiUEhTVUJXcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE3OTAgPSBQSFNVQldybTEyOA0KKyAgeyAxNzkxLAk3LAkxLAkwLAkiUEhTVUJXcm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWMwMGQwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzE3OTEgPSBQSFNVQldybTY0DQorICB7IDE3OTIsCTMsCTEsCTAsCSJQSFNVQldycjEyOCIsIDAsIDB4NWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTc5MiA9IFBIU1VCV3JyMTI4DQorICB7IDE3OTMsCTMsCTEsCTAsCSJQSFNVQldycjY0IiwgMCwgMHg1YzAwZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTc5MyA9IFBIU1VCV3JyNjQNCisgIHsgMTc5NCwJOCwJMSwJMCwJIlBJTlNSQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyMGMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MSB9LCAgLy8gSW5zdCAjMTc5NCA9IFBJTlNSQnJtDQorICB7IDE3OTUsCTQsCTEsCTAsCSJQSU5TUkJyciIsIDAsIDB4MjBjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA1IH0sICAvLyBJbnN0ICMxNzk1ID0gUElOU1JCcnINCisgIHsgMTc5NiwJOCwJMSwJMCwJIlBJTlNSRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyMmMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MSB9LCAgLy8gSW5zdCAjMTc5NiA9IFBJTlNSRHJtDQorICB7IDE3OTcsCTQsCTEsCTAsCSJQSU5TUkRyciIsIDAsIDB4MjJjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA1IH0sICAvLyBJbnN0ICMxNzk3ID0gUElOU1JEcnINCisgIHsgMTc5OCwJOCwJMSwJMCwJIlBJTlNSUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyMmMwM2U0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MSB9LCAgLy8gSW5zdCAjMTc5OCA9IFBJTlNSUXJtDQorICB7IDE3OTksCTQsCTEsCTAsCSJQSU5TUlFyciIsIDAsIDB4MjJjMDNlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA2IH0sICAvLyBJbnN0ICMxNzk5ID0gUElOU1JRcnINCisgIHsgMTgwMCwJOCwJMSwJMCwJIlBJTlNSV3JtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YzRjMDIxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTEgfSwgIC8vIEluc3QgIzE4MDAgPSBQSU5TUldybWkNCisgIHsgMTgwMSwJNCwJMSwJMCwJIlBJTlNSV3JyaSIsIDAsIDB4YzRjMDIxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA1IH0sICAvLyBJbnN0ICMxODAxID0gUElOU1JXcnJpDQorICB7IDE4MDIsCTcsCTEsCTAsCSJQTUFERFVCU1dybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTgwMiA9IFBNQUREVUJTV3JtMTI4DQorICB7IDE4MDMsCTcsCTEsCTAsCSJQTUFERFVCU1dybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg0YzAwZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTgwMyA9IFBNQUREVUJTV3JtNjQNCisgIHsgMTgwNCwJMywJMSwJMCwJIlBNQUREVUJTV3JyMTI4IiwgMCwgMHg0YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxODA0ID0gUE1BRERVQlNXcnIxMjgNCisgIHsgMTgwNSwJMywJMSwJMCwJIlBNQUREVUJTV3JyNjQiLCAwLCAweDRjMDBkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxODA1ID0gUE1BRERVQlNXcnI2NA0KKyAgeyAxODA2LAk3LAkxLAkwLAkiUE1BRERXRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmNWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTgwNiA9IFBNQUREV0RybQ0KKyAgeyAxODA3LAkzLAkxLAkwLAkiUE1BRERXRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhmNWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTgwNyA9IFBNQUREV0Rycg0KKyAgeyAxODA4LAk3LAkxLAkwLAkiUE1BWFNCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDNjYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxODA4ID0gUE1BWFNCcm0NCisgIHsgMTgwOSwJMywJMSwJMCwJIlBNQVhTQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgzY2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTgwOSA9IFBNQVhTQnJyDQorICB7IDE4MTAsCTcsCTEsCTAsCSJQTUFYU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4M2RjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE4MTAgPSBQTUFYU0RybQ0KKyAgeyAxODExLAkzLAkxLAkwLAkiUE1BWFNEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDNkYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxODExID0gUE1BWFNEcnINCisgIHsgMTgxMiwJNywJMSwJMCwJIlBNQVhTV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlZWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTgxMiA9IFBNQVhTV3JtDQorICB7IDE4MTMsCTMsCTEsCTAsCSJQTUFYU1dyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZWVjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE4MTMgPSBQTUFYU1dycg0KKyAgeyAxODE0LAk3LAkxLAkwLAkiUE1BWFVCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGRlYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxODE0ID0gUE1BWFVCcm0NCisgIHsgMTgxNSwJMywJMSwJMCwJIlBNQVhVQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhkZWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTgxNSA9IFBNQVhVQnJyDQorICB7IDE4MTYsCTcsCTEsCTAsCSJQTUFYVURybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4M2ZjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE4MTYgPSBQTUFYVURybQ0KKyAgeyAxODE3LAkzLAkxLAkwLAkiUE1BWFVEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDNmYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxODE3ID0gUE1BWFVEcnINCisgIHsgMTgxOCwJNywJMSwJMCwJIlBNQVhVV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzZWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTgxOCA9IFBNQVhVV3JtDQorICB7IDE4MTksCTMsCTEsCTAsCSJQTUFYVVdyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4M2VjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE4MTkgPSBQTUFYVVdycg0KKyAgeyAxODIwLAk3LAkxLAkwLAkiUE1JTlNCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDM4YzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxODIwID0gUE1JTlNCcm0NCisgIHsgMTgyMSwJMywJMSwJMCwJIlBNSU5TQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgzOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTgyMSA9IFBNSU5TQnJyDQorICB7IDE4MjIsCTcsCTEsCTAsCSJQTUlOU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzljMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE4MjIgPSBQTUlOU0RybQ0KKyAgeyAxODIzLAkzLAkxLAkwLAkiUE1JTlNEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDM5YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxODIzID0gUE1JTlNEcnINCisgIHsgMTgyNCwJNywJMSwJMCwJIlBNSU5TV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlYWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTgyNCA9IFBNSU5TV3JtDQorICB7IDE4MjUsCTMsCTEsCTAsCSJQTUlOU1dyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZWFjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE4MjUgPSBQTUlOU1dycg0KKyAgeyAxODI2LAk3LAkxLAkwLAkiUE1JTlVCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGRhYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxODI2ID0gUE1JTlVCcm0NCisgIHsgMTgyNywJMywJMSwJMCwJIlBNSU5VQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhkYWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTgyNyA9IFBNSU5VQnJyDQorICB7IDE4MjgsCTcsCTEsCTAsCSJQTUlOVURybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4M2JjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE4MjggPSBQTUlOVURybQ0KKyAgeyAxODI5LAkzLAkxLAkwLAkiUE1JTlVEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDNiYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxODI5ID0gUE1JTlVEcnINCisgIHsgMTgzMCwJNywJMSwJMCwJIlBNSU5VV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTgzMCA9IFBNSU5VV3JtDQorICB7IDE4MzEsCTMsCTEsCTAsCSJQTUlOVVdyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4M2FjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE4MzEgPSBQTUlOVVdycg0KKyAgeyAxODMyLAkyLAkxLAkwLAkiUE1PVk1TS0JyciIsIDAsIDB4ZDdjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTMxIH0sICAvLyBJbnN0ICMxODMyID0gUE1PVk1TS0Jycg0KKyAgeyAxODMzLAk2LAkxLAkwLAkiUE1PVlNYQkRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MjFjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE4MzMgPSBQTU9WU1hCRHJtDQorICB7IDE4MzQsCTIsCTEsCTAsCSJQTU9WU1hCRHJyIiwgMCwgMHgyMWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTgzNCA9IFBNT1ZTWEJEcnINCisgIHsgMTgzNSwJNiwJMSwJMCwJIlBNT1ZTWEJRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDIyYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxODM1ID0gUE1PVlNYQlFybQ0KKyAgeyAxODM2LAkyLAkxLAkwLAkiUE1PVlNYQlFyciIsIDAsIDB4MjJjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE4MzYgPSBQTU9WU1hCUXJyDQorICB7IDE4MzcsCTYsCTEsCTAsCSJQTU9WU1hCV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyMGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMTgzNyA9IFBNT1ZTWEJXcm0NCisgIHsgMTgzOCwJMiwJMSwJMCwJIlBNT1ZTWEJXcnIiLCAwLCAweDIwYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMxODM4ID0gUE1PVlNYQldycg0KKyAgeyAxODM5LAk2LAkxLAkwLAkiUE1PVlNYRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MjVjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE4MzkgPSBQTU9WU1hEUXJtDQorICB7IDE4NDAsCTIsCTEsCTAsCSJQTU9WU1hEUXJyIiwgMCwgMHgyNWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTg0MCA9IFBNT1ZTWERRcnINCisgIHsgMTg0MSwJNiwJMSwJMCwJIlBNT1ZTWFdEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDIzYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxODQxID0gUE1PVlNYV0RybQ0KKyAgeyAxODQyLAkyLAkxLAkwLAkiUE1PVlNYV0RyciIsIDAsIDB4MjNjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE4NDIgPSBQTU9WU1hXRHJyDQorICB7IDE4NDMsCTYsCTEsCTAsCSJQTU9WU1hXUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyNGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMTg0MyA9IFBNT1ZTWFdRcm0NCisgIHsgMTg0NCwJMiwJMSwJMCwJIlBNT1ZTWFdRcnIiLCAwLCAweDI0YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMxODQ0ID0gUE1PVlNYV1Fycg0KKyAgeyAxODQ1LAk2LAkxLAkwLAkiUE1PVlpYQkRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzFjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE4NDUgPSBQTU9WWlhCRHJtDQorICB7IDE4NDYsCTIsCTEsCTAsCSJQTU9WWlhCRHJyIiwgMCwgMHgzMWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTg0NiA9IFBNT1ZaWEJEcnINCisgIHsgMTg0NywJNiwJMSwJMCwJIlBNT1ZaWEJRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMyYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxODQ3ID0gUE1PVlpYQlFybQ0KKyAgeyAxODQ4LAkyLAkxLAkwLAkiUE1PVlpYQlFyciIsIDAsIDB4MzJjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE4NDggPSBQTU9WWlhCUXJyDQorICB7IDE4NDksCTYsCTEsCTAsCSJQTU9WWlhCV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMTg0OSA9IFBNT1ZaWEJXcm0NCisgIHsgMTg1MCwJMiwJMSwJMCwJIlBNT1ZaWEJXcnIiLCAwLCAweDMwYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMxODUwID0gUE1PVlpYQldycg0KKyAgeyAxODUxLAk2LAkxLAkwLAkiUE1PVlpYRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzVjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE4NTEgPSBQTU9WWlhEUXJtDQorICB7IDE4NTIsCTIsCTEsCTAsCSJQTU9WWlhEUXJyIiwgMCwgMHgzNWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMTg1MiA9IFBNT1ZaWERRcnINCisgIHsgMTg1MywJNiwJMSwJMCwJIlBNT1ZaWFdEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMzYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMxODUzID0gUE1PVlpYV0RybQ0KKyAgeyAxODU0LAkyLAkxLAkwLAkiUE1PVlpYV0RyciIsIDAsIDB4MzNjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzE4NTQgPSBQTU9WWlhXRHJyDQorICB7IDE4NTUsCTYsCTEsCTAsCSJQTU9WWlhXUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzNGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMTg1NSA9IFBNT1ZaWFdRcm0NCisgIHsgMTg1NiwJMiwJMSwJMCwJIlBNT1ZaWFdRcnIiLCAwLCAweDM0YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMxODU2ID0gUE1PVlpYV1Fycg0KKyAgeyAxODU3LAk3LAkxLAkwLAkiUE1VTERRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDI4YzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxODU3ID0gUE1VTERRcm0NCisgIHsgMTg1OCwJMywJMSwJMCwJIlBNVUxEUXJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgyOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTg1OCA9IFBNVUxEUXJyDQorICB7IDE4NTksCTcsCTEsCTAsCSJQTVVMSFJTV3JtMTI4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxODU5ID0gUE1VTEhSU1dybTEyOA0KKyAgeyAxODYwLAk3LAkxLAkwLAkiUE1VTEhSU1dybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhiYzAwZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTg2MCA9IFBNVUxIUlNXcm02NA0KKyAgeyAxODYxLAkzLAkxLAkwLAkiUE1VTEhSU1dycjEyOCIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4YmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTg2MSA9IFBNVUxIUlNXcnIxMjgNCisgIHsgMTg2MiwJMywJMSwJMCwJIlBNVUxIUlNXcnI2NCIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4YmMwMGQwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzE4NjIgPSBQTVVMSFJTV3JyNjQNCisgIHsgMTg2MywJNywJMSwJMCwJIlBNVUxIVVdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZTRjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE4NjMgPSBQTVVMSFVXcm0NCisgIHsgMTg2NCwJMywJMSwJMCwJIlBNVUxIVVdyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZTRjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE4NjQgPSBQTVVMSFVXcnINCisgIHsgMTg2NSwJNywJMSwJMCwJIlBNVUxIV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlNWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTg2NSA9IFBNVUxIV3JtDQorICB7IDE4NjYsCTMsCTEsCTAsCSJQTVVMSFdyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZTVjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE4NjYgPSBQTVVMSFdycg0KKyAgeyAxODY3LAk3LAkxLAkwLAkiUE1VTExEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDQwYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxODY3ID0gUE1VTExEcm0NCisgIHsgMTg2OCwJMywJMSwJMCwJIlBNVUxMRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg0MGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTg2OCA9IFBNVUxMRHJyDQorICB7IDE4NjksCTcsCTEsCTAsCSJQTVVMTFdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZDVjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE4NjkgPSBQTVVMTFdybQ0KKyAgeyAxODcwLAkzLAkxLAkwLAkiUE1VTExXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGQ1YzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxODcwID0gUE1VTExXcnINCisgIHsgMTg3MSwJNywJMSwJMCwJIlBNVUxVRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZjRjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE4NzEgPSBQTVVMVURRcm0NCisgIHsgMTg3MiwJMywJMSwJMCwJIlBNVUxVRFFyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZjRjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE4NzIgPSBQTVVMVURRcnINCisgIHsgMTg3MywJMSwJMSwJMCwJIlBPUDE2ciIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTgwMDAwNDJVTEwsIEltcGxpY2l0TGlzdDIsIEltcGxpY2l0TGlzdDIsIE5VTEwsIE9wZXJhbmRJbmZvMTA0IH0sICAvLyBJbnN0ICMxODczID0gUE9QMTZyDQorICB7IDE4NzQsCTUsCTEsCTAsCSJQT1AxNnJtbSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4OGYwMDAwNThVTEwsIEltcGxpY2l0TGlzdDIsIEltcGxpY2l0TGlzdDIsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzE4NzQgPSBQT1AxNnJtbQ0KKyAgeyAxODc1LAkxLAkxLAkwLAkiUE9QMTZybXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDhmMDAwMDUwVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3QyLCBOVUxMLCBPcGVyYW5kSW5mbzEwNCB9LCAgLy8gSW5zdCAjMTg3NSA9IFBPUDE2cm1yDQorICB7IDE4NzYsCTEsCTEsCTAsCSJQT1AzMnIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU4MDAwMDAyVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3QyLCBOVUxMLCBPcGVyYW5kSW5mbzY0IH0sICAvLyBJbnN0ICMxODc2ID0gUE9QMzJyDQorICB7IDE4NzcsCTUsCTEsCTAsCSJQT1AzMnJtbSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4OGYwMDAwMThVTEwsIEltcGxpY2l0TGlzdDIsIEltcGxpY2l0TGlzdDIsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzE4NzcgPSBQT1AzMnJtbQ0KKyAgeyAxODc4LAkxLAkxLAkwLAkiUE9QMzJybXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDhmMDAwMDEwVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3QyLCBOVUxMLCBPcGVyYW5kSW5mbzY0IH0sICAvLyBJbnN0ICMxODc4ID0gUE9QMzJybXINCisgIHsgMTg3OSwJMSwJMSwJMCwJIlBPUDY0ciIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTgwMDAwMDJVTEwsIEltcGxpY2l0TGlzdDQsIEltcGxpY2l0TGlzdDQsIE5VTEwsIE9wZXJhbmRJbmZvNjUgfSwgIC8vIEluc3QgIzE4NzkgPSBQT1A2NHINCisgIHsgMTg4MCwJNSwJMSwJMCwJIlBPUDY0cm1tIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg4ZjAwMDAxOFVMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0NCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTg4MCA9IFBPUDY0cm1tDQorICB7IDE4ODEsCTEsCTEsCTAsCSJQT1A2NHJtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4OGYwMDAwMTBVTEwsIEltcGxpY2l0TGlzdDQsIEltcGxpY2l0TGlzdDQsIE5VTEwsIE9wZXJhbmRJbmZvNjUgfSwgIC8vIEluc3QgIzE4ODEgPSBQT1A2NHJtcg0KKyAgeyAxODgyLAkwLAkwLAkwLAkiUE9QQTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2MTAwMDAwMVVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0NDMsIEJhcnJpZXJzNywgMCB9LCAgLy8gSW5zdCAjMTg4MiA9IFBPUEEzMg0KKyAgeyAxODgzLAk2LAkxLAkwLAkiUE9QQ05UMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI4MDAwYzQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUzIH0sICAvLyBJbnN0ICMxODgzID0gUE9QQ05UMTZybQ0KKyAgeyAxODg0LAkyLAkxLAkwLAkiUE9QQ05UMTZyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI4MDAwYzQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU0IH0sICAvLyBJbnN0ICMxODg0ID0gUE9QQ05UMTZycg0KKyAgeyAxODg1LAk2LAkxLAkwLAkiUE9QQ05UMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI4MDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICMxODg1ID0gUE9QQ05UMzJybQ0KKyAgeyAxODg2LAkyLAkxLAkwLAkiUE9QQ05UMzJyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI4MDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU2IH0sICAvLyBJbnN0ICMxODg2ID0gUE9QQ05UMzJycg0KKyAgeyAxODg3LAk2LAkxLAkwLAkiUE9QQ05UNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI4MDAxYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMxODg3ID0gUE9QQ05UNjRybQ0KKyAgeyAxODg4LAkyLAkxLAkwLAkiUE9QQ05UNjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGI4MDAxYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICMxODg4ID0gUE9QQ05UNjRycg0KKyAgeyAxODg5LAkwLAkwLAkwLAkiUE9QRjE2IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg5ZDAwMDA0MVVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0MywgQmFycmllcnMxLCAwIH0sICAvLyBJbnN0ICMxODg5ID0gUE9QRjE2DQorICB7IDE4OTAsCTAsCTAsCTAsCSJQT1BGMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDlkMDAwMDAxVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3QzLCBCYXJyaWVyczEsIDAgfSwgIC8vIEluc3QgIzE4OTAgPSBQT1BGMzINCisgIHsgMTg5MSwJMCwJMCwJMCwJIlBPUEY2NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4OWQwMDAwMDFVTEwsIEltcGxpY2l0TGlzdDQsIEltcGxpY2l0TGlzdDUsIEJhcnJpZXJzMSwgMCB9LCAgLy8gSW5zdCAjMTg5MSA9IFBPUEY2NA0KKyAgeyAxODkyLAkwLAkwLAkwLAkiUE9QRlMxNiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGExMDAwMTQxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxODkyID0gUE9QRlMxNg0KKyAgeyAxODkzLAkwLAkwLAkwLAkiUE9QRlMzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGExMDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxODkzID0gUE9QRlMzMg0KKyAgeyAxODk0LAkwLAkwLAkwLAkiUE9QRlM2NCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGExMDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxODk0ID0gUE9QRlM2NA0KKyAgeyAxODk1LAkwLAkwLAkwLAkiUE9QR1MxNiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGE5MDAwMTQxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxODk1ID0gUE9QR1MxNg0KKyAgeyAxODk2LAkwLAkwLAkwLAkiUE9QR1MzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGE5MDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxODk2ID0gUE9QR1MzMg0KKyAgeyAxODk3LAkwLAkwLAkwLAkiUE9QR1M2NCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGE5MDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMxODk3ID0gUE9QR1M2NA0KKyAgeyAxODk4LAk3LAkxLAkwLAkiUE9Scm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGViYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxODk4ID0gUE9Scm0NCisgIHsgMTg5OSwJMywJMSwJMCwJIlBPUnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhlYmMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTg5OSA9IFBPUnJyDQorICB7IDE5MDAsCTUsCTAsCTAsCSJQUkVGRVRDSE5UQSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDE4NDAwMTE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxOTAwID0gUFJFRkVUQ0hOVEENCisgIHsgMTkwMSwJNSwJMCwJMCwJIlBSRUZFVENIVDAiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxODQwMDExOVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTkwMSA9IFBSRUZFVENIVDANCisgIHsgMTkwMiwJNSwJMCwJMCwJIlBSRUZFVENIVDEiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxODQwMDExYVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTkwMiA9IFBSRUZFVENIVDENCisgIHsgMTkwMywJNSwJMCwJMCwJIlBSRUZFVENIVDIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxODQwMDExYlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMTkwMyA9IFBSRUZFVENIVDINCisgIHsgMTkwNCwJNywJMSwJMCwJIlBTQURCV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmNmMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTkwNCA9IFBTQURCV3JtDQorICB7IDE5MDUsCTMsCTEsCTAsCSJQU0FEQldyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ZjZjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5MDUgPSBQU0FEQldycg0KKyAgeyAxOTA2LAk3LAkxLAkwLAkiUFNIVUZCcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTkwNiA9IFBTSFVGQnJtMTI4DQorICB7IDE5MDcsCTcsCTEsCTAsCSJQU0hVRkJybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhjMDBkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxOTA3ID0gUFNIVUZCcm02NA0KKyAgeyAxOTA4LAkzLAkxLAkwLAkiUFNIVUZCcnIxMjgiLCAwLCAweGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTkwOCA9IFBTSFVGQnJyMTI4DQorICB7IDE5MDksCTMsCTEsCTAsCSJQU0hVRkJycjY0IiwgMCwgMHhjMDBkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxOTA5ID0gUFNIVUZCcnI2NA0KKyAgeyAxOTEwLAk3LAkxLAkwLAkiUFNIVUZEbWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDcwYzAyMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMxOTEwID0gUFNIVUZEbWkNCisgIHsgMTkxMSwJMywJMSwJMCwJIlBTSFVGRHJpIiwgMCwgMHg3MGMwMjE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMTkxMSA9IFBTSFVGRHJpDQorICB7IDE5MTIsCTcsCTEsCTAsCSJQU0hVRkhXbWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDcwYzAyYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMxOTEyID0gUFNIVUZIV21pDQorICB7IDE5MTMsCTMsCTEsCTAsCSJQU0hVRkhXcmkiLCAwLCAweDcwYzAyYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMxOTEzID0gUFNIVUZIV3JpDQorICB7IDE5MTQsCTcsCTEsCTAsCSJQU0hVRkxXbWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDcwYzAyYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMxOTE0ID0gUFNIVUZMV21pDQorICB7IDE5MTUsCTMsCTEsCTAsCSJQU0hVRkxXcmkiLCAwLCAweDcwYzAyYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMxOTE1ID0gUFNIVUZMV3JpDQorICB7IDE5MTYsCTcsCTEsCTAsCSJQU0lHTkJybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4OGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTkxNiA9IFBTSUdOQnJtMTI4DQorICB7IDE5MTcsCTcsCTEsCTAsCSJQU0lHTkJybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg4YzAwZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE0OSB9LCAgLy8gSW5zdCAjMTkxNyA9IFBTSUdOQnJtNjQNCisgIHsgMTkxOCwJMywJMSwJMCwJIlBTSUdOQnJyMTI4IiwgMCwgMHg4YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxOTE4ID0gUFNJR05CcnIxMjgNCisgIHsgMTkxOSwJMywJMSwJMCwJIlBTSUdOQnJyNjQiLCAwLCAweDhjMDBkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUwIH0sICAvLyBJbnN0ICMxOTE5ID0gUFNJR05CcnI2NA0KKyAgeyAxOTIwLAk3LAkxLAkwLAkiUFNJR05Ecm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGFjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5MjAgPSBQU0lHTkRybTEyOA0KKyAgeyAxOTIxLAk3LAkxLAkwLAkiUFNJR05Ecm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YWMwMGQwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNDkgfSwgIC8vIEluc3QgIzE5MjEgPSBQU0lHTkRybTY0DQorICB7IDE5MjIsCTMsCTEsCTAsCSJQU0lHTkRycjEyOCIsIDAsIDB4YWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTkyMiA9IFBTSUdORHJyMTI4DQorICB7IDE5MjMsCTMsCTEsCTAsCSJQU0lHTkRycjY0IiwgMCwgMHhhYzAwZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1MCB9LCAgLy8gSW5zdCAjMTkyMyA9IFBTSUdORHJyNjQNCisgIHsgMTkyNCwJNywJMSwJMCwJIlBTSUdOV3JtMTI4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg5YzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxOTI0ID0gUFNJR05Xcm0xMjgNCisgIHsgMTkyNSwJNywJMSwJMCwJIlBTSUdOV3JtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDljMDBkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQ5IH0sICAvLyBJbnN0ICMxOTI1ID0gUFNJR05Xcm02NA0KKyAgeyAxOTI2LAkzLAkxLAkwLAkiUFNJR05XcnIxMjgiLCAwLCAweDljMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5MjYgPSBQU0lHTldycjEyOA0KKyAgeyAxOTI3LAkzLAkxLAkwLAkiUFNJR05XcnI2NCIsIDAsIDB4OWMwMGQwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xNTAgfSwgIC8vIEluc3QgIzE5MjcgPSBQU0lHTldycjY0DQorICB7IDE5MjgsCTMsCTEsCTAsCSJQU0xMRFFyaSIsIDAsIDB4NzNjMDIxNTdVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA3IH0sICAvLyBJbnN0ICMxOTI4ID0gUFNMTERRcmkNCisgIHsgMTkyOSwJMywJMSwJMCwJIlBTTExEcmkiLCAwLCAweDcyYzAyMTU2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIwNyB9LCAgLy8gSW5zdCAjMTkyOSA9IFBTTExEcmkNCisgIHsgMTkzMCwJNywJMSwJMCwJIlBTTExEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGYyYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxOTMwID0gUFNMTERybQ0KKyAgeyAxOTMxLAkzLAkxLAkwLAkiUFNMTERyciIsIDAsIDB4ZjJjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5MzEgPSBQU0xMRHJyDQorICB7IDE5MzIsCTMsCTEsCTAsCSJQU0xMUXJpIiwgMCwgMHg3M2MwMjE1NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMDcgfSwgIC8vIEluc3QgIzE5MzIgPSBQU0xMUXJpDQorICB7IDE5MzMsCTcsCTEsCTAsCSJQU0xMUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmM2MwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTkzMyA9IFBTTExRcm0NCisgIHsgMTkzNCwJMywJMSwJMCwJIlBTTExRcnIiLCAwLCAweGYzYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxOTM0ID0gUFNMTFFycg0KKyAgeyAxOTM1LAkzLAkxLAkwLAkiUFNMTFdyaSIsIDAsIDB4NzFjMDIxNTZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA3IH0sICAvLyBJbnN0ICMxOTM1ID0gUFNMTFdyaQ0KKyAgeyAxOTM2LAk3LAkxLAkwLAkiUFNMTFdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZjFjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5MzYgPSBQU0xMV3JtDQorICB7IDE5MzcsCTMsCTEsCTAsCSJQU0xMV3JyIiwgMCwgMHhmMWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTkzNyA9IFBTTExXcnINCisgIHsgMTkzOCwJMywJMSwJMCwJIlBTUkFEcmkiLCAwLCAweDcyYzAyMTU0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIwNyB9LCAgLy8gSW5zdCAjMTkzOCA9IFBTUkFEcmkNCisgIHsgMTkzOSwJNywJMSwJMCwJIlBTUkFEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGUyYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxOTM5ID0gUFNSQURybQ0KKyAgeyAxOTQwLAkzLAkxLAkwLAkiUFNSQURyciIsIDAsIDB4ZTJjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5NDAgPSBQU1JBRHJyDQorICB7IDE5NDEsCTMsCTEsCTAsCSJQU1JBV3JpIiwgMCwgMHg3MWMwMjE1NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMDcgfSwgIC8vIEluc3QgIzE5NDEgPSBQU1JBV3JpDQorICB7IDE5NDIsCTcsCTEsCTAsCSJQU1JBV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlMWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTk0MiA9IFBTUkFXcm0NCisgIHsgMTk0MywJMywJMSwJMCwJIlBTUkFXcnIiLCAwLCAweGUxYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxOTQzID0gUFNSQVdycg0KKyAgeyAxOTQ0LAkzLAkxLAkwLAkiUFNSTERRcmkiLCAwLCAweDczYzAyMTUzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIwNyB9LCAgLy8gSW5zdCAjMTk0NCA9IFBTUkxEUXJpDQorICB7IDE5NDUsCTMsCTEsCTAsCSJQU1JMRHJpIiwgMCwgMHg3MmMwMjE1MlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMDcgfSwgIC8vIEluc3QgIzE5NDUgPSBQU1JMRHJpDQorICB7IDE5NDYsCTcsCTEsCTAsCSJQU1JMRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkMmMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTk0NiA9IFBTUkxEcm0NCisgIHsgMTk0NywJMywJMSwJMCwJIlBTUkxEcnIiLCAwLCAweGQyYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxOTQ3ID0gUFNSTERycg0KKyAgeyAxOTQ4LAkzLAkxLAkwLAkiUFNSTFFyaSIsIDAsIDB4NzNjMDIxNTJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA3IH0sICAvLyBJbnN0ICMxOTQ4ID0gUFNSTFFyaQ0KKyAgeyAxOTQ5LAk3LAkxLAkwLAkiUFNSTFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZDNjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5NDkgPSBQU1JMUXJtDQorICB7IDE5NTAsCTMsCTEsCTAsCSJQU1JMUXJyIiwgMCwgMHhkM2MwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTk1MCA9IFBTUkxRcnINCisgIHsgMTk1MSwJMywJMSwJMCwJIlBTUkxXcmkiLCAwLCAweDcxYzAyMTUyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIwNyB9LCAgLy8gSW5zdCAjMTk1MSA9IFBTUkxXcmkNCisgIHsgMTk1MiwJNywJMSwJMCwJIlBTUkxXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGQxYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxOTUyID0gUFNSTFdybQ0KKyAgeyAxOTUzLAkzLAkxLAkwLAkiUFNSTFdyciIsIDAsIDB4ZDFjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5NTMgPSBQU1JMV3JyDQorICB7IDE5NTQsCTcsCTEsCTAsCSJQU1VCQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhmOGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTk1NCA9IFBTVUJCcm0NCisgIHsgMTk1NSwJMywJMSwJMCwJIlBTVUJCcnIiLCAwLCAweGY4YzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxOTU1ID0gUFNVQkJycg0KKyAgeyAxOTU2LAk3LAkxLAkwLAkiUFNVQkRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZmFjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5NTYgPSBQU1VCRHJtDQorICB7IDE5NTcsCTMsCTEsCTAsCSJQU1VCRHJyIiwgMCwgMHhmYWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTk1NyA9IFBTVUJEcnINCisgIHsgMTk1OCwJNywJMSwJMCwJIlBTVUJRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGZiYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxOTU4ID0gUFNVQlFybQ0KKyAgeyAxOTU5LAkzLAkxLAkwLAkiUFNVQlFyciIsIDAsIDB4ZmJjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5NTkgPSBQU1VCUXJyDQorICB7IDE5NjAsCTcsCTEsCTAsCSJQU1VCU0JybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZThjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5NjAgPSBQU1VCU0JybQ0KKyAgeyAxOTYxLAkzLAkxLAkwLAkiUFNVQlNCcnIiLCAwLCAweGU4YzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxOTYxID0gUFNVQlNCcnINCisgIHsgMTk2MiwJNywJMSwJMCwJIlBTVUJTV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhlOWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTk2MiA9IFBTVUJTV3JtDQorICB7IDE5NjMsCTMsCTEsCTAsCSJQU1VCU1dyciIsIDAsIDB4ZTljMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5NjMgPSBQU1VCU1dycg0KKyAgeyAxOTY0LAk3LAkxLAkwLAkiUFNVQlVTQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkOGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTk2NCA9IFBTVUJVU0JybQ0KKyAgeyAxOTY1LAkzLAkxLAkwLAkiUFNVQlVTQnJyIiwgMCwgMHhkOGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTk2NSA9IFBTVUJVU0Jycg0KKyAgeyAxOTY2LAk3LAkxLAkwLAkiUFNVQlVTV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkOWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTk2NiA9IFBTVUJVU1dybQ0KKyAgeyAxOTY3LAkzLAkxLAkwLAkiUFNVQlVTV3JyIiwgMCwgMHhkOWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTk2NyA9IFBTVUJVU1dycg0KKyAgeyAxOTY4LAk3LAkxLAkwLAkiUFNVQldybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZjljMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5NjggPSBQU1VCV3JtDQorICB7IDE5NjksCTMsCTEsCTAsCSJQU1VCV3JyIiwgMCwgMHhmOWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTk2OSA9IFBTVUJXcnINCisgIHsgMTk3MCwJNiwJMCwJMCwJIlBURVNUcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE3YzAwZDQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzE5NzAgPSBQVEVTVHJtDQorICB7IDE5NzEsCTIsCTAsCTAsCSJQVEVTVHJyIiwgMCwgMHgxN2MwMGQ0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMxOTcxID0gUFRFU1Rycg0KKyAgeyAxOTcyLAk3LAkxLAkwLAkiUFVOUENLSEJXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDY4YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxOTcyID0gUFVOUENLSEJXcm0NCisgIHsgMTk3MywJMywJMSwJMCwJIlBVTlBDS0hCV3JyIiwgMCwgMHg2OGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTk3MyA9IFBVTlBDS0hCV3JyDQorICB7IDE5NzQsCTcsCTEsCTAsCSJQVU5QQ0tIRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NmFjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5NzQgPSBQVU5QQ0tIRFFybQ0KKyAgeyAxOTc1LAkzLAkxLAkwLAkiUFVOUENLSERRcnIiLCAwLCAweDZhYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxOTc1ID0gUFVOUENLSERRcnINCisgIHsgMTk3NiwJNywJMSwJMCwJIlBVTlBDS0hRRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NmRjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5NzYgPSBQVU5QQ0tIUURRcm0NCisgIHsgMTk3NywJMywJMSwJMCwJIlBVTlBDS0hRRFFyciIsIDAsIDB4NmRjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5NzcgPSBQVU5QQ0tIUURRcnINCisgIHsgMTk3OCwJNywJMSwJMCwJIlBVTlBDS0hXRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2OWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTk3OCA9IFBVTlBDS0hXRHJtDQorICB7IDE5NzksCTMsCTEsCTAsCSJQVU5QQ0tIV0RyciIsIDAsIDB4NjljMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5NzkgPSBQVU5QQ0tIV0Rycg0KKyAgeyAxOTgwLAk3LAkxLAkwLAkiUFVOUENLTEJXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDYwYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMxOTgwID0gUFVOUENLTEJXcm0NCisgIHsgMTk4MSwJMywJMSwJMCwJIlBVTlBDS0xCV3JyIiwgMCwgMHg2MGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMTk4MSA9IFBVTlBDS0xCV3JyDQorICB7IDE5ODIsCTcsCTEsCTAsCSJQVU5QQ0tMRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NjJjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5ODIgPSBQVU5QQ0tMRFFybQ0KKyAgeyAxOTgzLAkzLAkxLAkwLAkiUFVOUENLTERRcnIiLCAwLCAweDYyYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMxOTgzID0gUFVOUENLTERRcnINCisgIHsgMTk4NCwJNywJMSwJMCwJIlBVTlBDS0xRRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NmNjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzE5ODQgPSBQVU5QQ0tMUURRcm0NCisgIHsgMTk4NSwJMywJMSwJMCwJIlBVTlBDS0xRRFFyciIsIDAsIDB4NmNjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5ODUgPSBQVU5QQ0tMUURRcnINCisgIHsgMTk4NiwJNywJMSwJMCwJIlBVTlBDS0xXRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg2MWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMTk4NiA9IFBVTlBDS0xXRHJtDQorICB7IDE5ODcsCTMsCTEsCTAsCSJQVU5QQ0tMV0RyciIsIDAsIDB4NjFjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzE5ODcgPSBQVU5QQ0tMV0Rycg0KKyAgeyAxOTg4LAkxLAkwLAkwLAkiUFVTSDE2ciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDUwMDAwMDQyVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3QyLCBOVUxMLCBPcGVyYW5kSW5mbzEwNCB9LCAgLy8gSW5zdCAjMTk4OCA9IFBVU0gxNnINCisgIHsgMTk4OSwJNSwJMCwJMCwJIlBVU0gxNnJtbSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGZmMDAwMDVlVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3QyLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxOTg5ID0gUFVTSDE2cm1tDQorICB7IDE5OTAsCTEsCTAsCTAsCSJQVVNIMTZybXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmZjAwMDA1NlVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0MiwgTlVMTCwgT3BlcmFuZEluZm8xMDQgfSwgIC8vIEluc3QgIzE5OTAgPSBQVVNIMTZybXINCisgIHsgMTk5MSwJMSwJMCwJMCwJIlBVU0gzMnIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg1MDAwMDAwMlVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0MiwgTlVMTCwgT3BlcmFuZEluZm82NCB9LCAgLy8gSW5zdCAjMTk5MSA9IFBVU0gzMnINCisgIHsgMTk5MiwJNSwJMCwJMCwJIlBVU0gzMnJtbSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGZmMDAwMDFlVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3QyLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxOTkyID0gUFVTSDMycm1tDQorICB7IDE5OTMsCTEsCTAsCTAsCSJQVVNIMzJybXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmZjAwMDAxNlVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0MiwgTlVMTCwgT3BlcmFuZEluZm82NCB9LCAgLy8gSW5zdCAjMTk5MyA9IFBVU0gzMnJtcg0KKyAgeyAxOTk0LAkxLAkwLAkwLAkiUFVTSDY0aTE2IiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4NjgwMDYwMDFVTEwsIEltcGxpY2l0TGlzdDQsIEltcGxpY2l0TGlzdDQsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTk5NCA9IFBVU0g2NGkxNg0KKyAgeyAxOTk1LAkxLAkwLAkwLAkiUFVTSDY0aTMyIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4NjgwMGEwMDFVTEwsIEltcGxpY2l0TGlzdDQsIEltcGxpY2l0TGlzdDQsIE5VTEwsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMTk5NSA9IFBVU0g2NGkzMg0KKyAgeyAxOTk2LAkxLAkwLAkwLAkiUFVTSDY0aTgiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg2YTAwMjAwMVVMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0NCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMxOTk2ID0gUFVTSDY0aTgNCisgIHsgMTk5NywJMSwJMCwJMCwJIlBVU0g2NHIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg1MDAwMDAwMlVMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0NCwgTlVMTCwgT3BlcmFuZEluZm82NSB9LCAgLy8gSW5zdCAjMTk5NyA9IFBVU0g2NHINCisgIHsgMTk5OCwJNSwJMCwJMCwJIlBVU0g2NHJtbSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGZmMDAwMDFlVUxMLCBJbXBsaWNpdExpc3Q0LCBJbXBsaWNpdExpc3Q0LCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMxOTk4ID0gUFVTSDY0cm1tDQorICB7IDE5OTksCTEsCTAsCTAsCSJQVVNINjRybXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhmZjAwMDAxNlVMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0NCwgTlVMTCwgT3BlcmFuZEluZm82NSB9LCAgLy8gSW5zdCAjMTk5OSA9IFBVU0g2NHJtcg0KKyAgeyAyMDAwLAkwLAkwLAkwLAkiUFVTSEEzMiIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDYwMDAwMDAxVUxMLCBJbXBsaWNpdExpc3Q0MywgSW1wbGljaXRMaXN0MiwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjAwMCA9IFBVU0hBMzINCisgIHsgMjAwMSwJMCwJMCwJMCwJIlBVU0hGMTYiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5YzAwMDA0MVVMTCwgSW1wbGljaXRMaXN0MywgSW1wbGljaXRMaXN0MiwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjAwMSA9IFBVU0hGMTYNCisgIHsgMjAwMiwJMCwJMCwJMCwJIlBVU0hGMzIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5YzAwMDAwMVVMTCwgSW1wbGljaXRMaXN0MywgSW1wbGljaXRMaXN0MiwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjAwMiA9IFBVU0hGMzINCisgIHsgMjAwMywJMCwJMCwJMCwJIlBVU0hGNjQiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5YzAwMDAwMVVMTCwgSW1wbGljaXRMaXN0NSwgSW1wbGljaXRMaXN0NCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjAwMyA9IFBVU0hGNjQNCisgIHsgMjAwNCwJMCwJMCwJMCwJIlBVU0hGUzE2IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTAwMDAxNDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIwMDQgPSBQVVNIRlMxNg0KKyAgeyAyMDA1LAkwLAkwLAkwLAkiUFVTSEZTMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhMDAwMDEwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjAwNSA9IFBVU0hGUzMyDQorICB7IDIwMDYsCTAsCTAsCTAsCSJQVVNIRlM2NCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGEwMDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMDA2ID0gUFVTSEZTNjQNCisgIHsgMjAwNywJMCwJMCwJMCwJIlBVU0hHUzE2IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTgwMDAxNDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIwMDcgPSBQVVNIR1MxNg0KKyAgeyAyMDA4LAkwLAkwLAkwLAkiUFVTSEdTMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhODAwMDEwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjAwOCA9IFBVU0hHUzMyDQorICB7IDIwMDksCTAsCTAsCTAsCSJQVVNIR1M2NCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGE4MDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMDA5ID0gUFVTSEdTNjQNCisgIHsgMjAxMCwJMSwJMCwJMCwJIlBVU0hpMTYiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg2ODAwNjA0MVVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0MiwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMyMDEwID0gUFVTSGkxNg0KKyAgeyAyMDExLAkxLAkwLAkwLAkiUFVTSGkzMiIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDY4MDBhMDAxVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3QyLCBOVUxMLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzIwMTEgPSBQVVNIaTMyDQorICB7IDIwMTIsCTEsCTAsCTAsCSJQVVNIaTgiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg2YTAwMjAwMVVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0MiwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMyMDEyID0gUFVTSGk4DQorICB7IDIwMTMsCTcsCTEsCTAsCSJQWE9Scm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGVmYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMyMDEzID0gUFhPUnJtDQorICB7IDIwMTQsCTMsCTEsCTAsCSJQWE9ScnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGVmYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMyMDE0ID0gUFhPUnJyDQorICB7IDIwMTUsCTUsCTAsCTAsCSJSQ0wxNm0xIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDEwMDAwNWFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjAxNSA9IFJDTDE2bTENCisgIHsgMjAxNiwJNSwJMCwJMCwJIlJDTDE2bUNMIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDMwMDAwNWFVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIwMTYgPSBSQ0wxNm1DTA0KKyAgeyAyMDE3LAk2LAkwLAkwLAkiUkNMMTZtaSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMxMDAyMDVhVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIwMTcgPSBSQ0wxNm1pDQorICB7IDIwMTgsCTIsCTEsCTAsCSJSQ0wxNnIxIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDEwMDAwNTJVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDIgfSwgIC8vIEluc3QgIzIwMTggPSBSQ0wxNnIxDQorICB7IDIwMTksCTIsCTEsCTAsCSJSQ0wxNnJDTCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQzMDAwMDUyVUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMiB9LCAgLy8gSW5zdCAjMjAxOSA9IFJDTDE2ckNMDQorICB7IDIwMjAsCTMsCTEsCTAsCSJSQ0wxNnJpIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzEwMDIwNTJVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMiB9LCAgLy8gSW5zdCAjMjAyMCA9IFJDTDE2cmkNCisgIHsgMjAyMSwJNSwJMCwJMCwJIlJDTDMybTEiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMTAwMDAxYVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMDIxID0gUkNMMzJtMQ0KKyAgeyAyMDIyLAk1LAkwLAkwLAkiUkNMMzJtQ0wiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMzAwMDAxYVVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjAyMiA9IFJDTDMybUNMDQorICB7IDIwMjMsCTYsCTAsCTAsCSJSQ0wzMm1pIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzEwMDIwMWFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjAyMyA9IFJDTDMybWkNCisgIHsgMjAyNCwJMiwJMSwJMCwJIlJDTDMycjEiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMTAwMDAxMlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICMyMDI0ID0gUkNMMzJyMQ0KKyAgeyAyMDI1LAkyLAkxLAkwLAkiUkNMMzJyQ0wiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMzAwMDAxMlVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81OSB9LCAgLy8gSW5zdCAjMjAyNSA9IFJDTDMyckNMDQorICB7IDIwMjYsCTMsCTEsCTAsCSJSQ0wzMnJpIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzEwMDIwMTJVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjMjAyNiA9IFJDTDMycmkNCisgIHsgMjAyNywJNSwJMCwJMCwJIlJDTDY0bTEiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMTAwMTAxYVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMDI3ID0gUkNMNjRtMQ0KKyAgeyAyMDI4LAk1LAkwLAkwLAkiUkNMNjRtQ0wiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMzAwMTAxYVVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjAyOCA9IFJDTDY0bUNMDQorICB7IDIwMjksCTYsCTAsCTAsCSJSQ0w2NG1pIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzEwMDMwMWFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjAyOSA9IFJDTDY0bWkNCisgIHsgMjAzMCwJMiwJMSwJMCwJIlJDTDY0cjEiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMTAwMTAxMlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYwIH0sICAvLyBJbnN0ICMyMDMwID0gUkNMNjRyMQ0KKyAgeyAyMDMxLAkyLAkxLAkwLAkiUkNMNjRyQ0wiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMzAwMTAxMlVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MCB9LCAgLy8gSW5zdCAjMjAzMSA9IFJDTDY0ckNMDQorICB7IDIwMzIsCTMsCTEsCTAsCSJSQ0w2NHJpIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzEwMDMwMTJVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMCB9LCAgLy8gSW5zdCAjMjAzMiA9IFJDTDY0cmkNCisgIHsgMjAzMywJNSwJMCwJMCwJIlJDTDhtMSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQwMDAwMDFhVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIwMzMgPSBSQ0w4bTENCisgIHsgMjAzNCwJNSwJMCwJMCwJIlJDTDhtQ0wiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMjAwMDAxYVVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjAzNCA9IFJDTDhtQ0wNCisgIHsgMjAzNSwJNiwJMCwJMCwJIlJDTDhtaSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMwMDAyMDFhVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIwMzUgPSBSQ0w4bWkNCisgIHsgMjAzNiwJMiwJMSwJMCwJIlJDTDhyMSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQwMDAwMDEyVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAzIH0sICAvLyBJbnN0ICMyMDM2ID0gUkNMOHIxDQorICB7IDIwMzcsCTIsCTEsCTAsCSJSQ0w4ckNMIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDIwMDAwMTJVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAzIH0sICAvLyBJbnN0ICMyMDM3ID0gUkNMOHJDTA0KKyAgeyAyMDM4LAkzLAkxLAkwLAkiUkNMOHJpIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzAwMDIwMTJVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNSB9LCAgLy8gSW5zdCAjMjAzOCA9IFJDTDhyaQ0KKyAgeyAyMDM5LAk2LAkxLAkwLAkiUkNQUFNtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MzQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjAzOSA9IFJDUFBTbQ0KKyAgeyAyMDQwLAk2LAkxLAkwLAkiUkNQUFNtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTM0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzIwNDAgPSBSQ1BQU21fSW50DQorICB7IDIwNDEsCTIsCTEsCTAsCSJSQ1BQU3IiLCAwLCAweDUzNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyMDQxID0gUkNQUFNyDQorICB7IDIwNDIsCTIsCTEsCTAsCSJSQ1BQU3JfSW50IiwgMCwgMHg1MzQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjA0MiA9IFJDUFBTcl9JbnQNCisgIHsgMjA0MywJNiwJMSwJMCwJIlJDUFNTbSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTMwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOTAgfSwgIC8vIEluc3QgIzIwNDMgPSBSQ1BTU20NCisgIHsgMjA0NCwJNiwJMSwJMCwJIlJDUFNTbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUzMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyMDQ0ID0gUkNQU1NtX0ludA0KKyAgeyAyMDQ1LAkyLAkxLAkwLAkiUkNQU1NyIiwgMCwgMHg1MzAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTcgfSwgIC8vIEluc3QgIzIwNDUgPSBSQ1BTU3INCisgIHsgMjA0NiwJMiwJMSwJMCwJIlJDUFNTcl9JbnQiLCAwLCAweDUzMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyMDQ2ID0gUkNQU1NyX0ludA0KKyAgeyAyMDQ3LAk1LAkwLAkwLAkiUkNSMTZtMSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQxMDAwMDViVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIwNDcgPSBSQ1IxNm0xDQorICB7IDIwNDgsCTUsCTAsCTAsCSJSQ1IxNm1DTCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQzMDAwMDViVUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMDQ4ID0gUkNSMTZtQ0wNCisgIHsgMjA0OSwJNiwJMCwJMCwJIlJDUjE2bWkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMTAwMjA1YlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMDQ5ID0gUkNSMTZtaQ0KKyAgeyAyMDUwLAkyLAkxLAkwLAkiUkNSMTZyMSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQxMDAwMDUzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAyIH0sICAvLyBJbnN0ICMyMDUwID0gUkNSMTZyMQ0KKyAgeyAyMDUxLAkyLAkxLAkwLAkiUkNSMTZyQ0wiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMzAwMDA1M1VMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDIgfSwgIC8vIEluc3QgIzIwNTEgPSBSQ1IxNnJDTA0KKyAgeyAyMDUyLAkzLAkxLAkwLAkiUkNSMTZyaSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMxMDAyMDUzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIgfSwgIC8vIEluc3QgIzIwNTIgPSBSQ1IxNnJpDQorICB7IDIwNTMsCTUsCTAsCTAsCSJSQ1IzMm0xIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDEwMDAwMWJVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjA1MyA9IFJDUjMybTENCisgIHsgMjA1NCwJNSwJMCwJMCwJIlJDUjMybUNMIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDMwMDAwMWJVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIwNTQgPSBSQ1IzMm1DTA0KKyAgeyAyMDU1LAk2LAkwLAkwLAkiUkNSMzJtaSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMxMDAyMDFiVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIwNTUgPSBSQ1IzMm1pDQorICB7IDIwNTYsCTIsCTEsCTAsCSJSQ1IzMnIxIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDEwMDAwMTNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81OSB9LCAgLy8gSW5zdCAjMjA1NiA9IFJDUjMycjENCisgIHsgMjA1NywJMiwJMSwJMCwJIlJDUjMyckNMIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDMwMDAwMTNVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTkgfSwgIC8vIEluc3QgIzIwNTcgPSBSQ1IzMnJDTA0KKyAgeyAyMDU4LAkzLAkxLAkwLAkiUkNSMzJyaSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMxMDAyMDEzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTYgfSwgIC8vIEluc3QgIzIwNTggPSBSQ1IzMnJpDQorICB7IDIwNTksCTUsCTAsCTAsCSJSQ1I2NG0xIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDEwMDEwMWJVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjA1OSA9IFJDUjY0bTENCisgIHsgMjA2MCwJNSwJMCwJMCwJIlJDUjY0bUNMIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDMwMDEwMWJVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIwNjAgPSBSQ1I2NG1DTA0KKyAgeyAyMDYxLAk2LAkwLAkwLAkiUkNSNjRtaSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMxMDAzMDFiVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIwNjEgPSBSQ1I2NG1pDQorICB7IDIwNjIsCTIsCTEsCTAsCSJSQ1I2NHIxIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDEwMDEwMTNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MCB9LCAgLy8gSW5zdCAjMjA2MiA9IFJDUjY0cjENCisgIHsgMjA2MywJMiwJMSwJMCwJIlJDUjY0ckNMIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDMwMDEwMTNVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNjAgfSwgIC8vIEluc3QgIzIwNjMgPSBSQ1I2NHJDTA0KKyAgeyAyMDY0LAkzLAkxLAkwLAkiUkNSNjRyaSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMxMDAzMDEzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjAgfSwgIC8vIEluc3QgIzIwNjQgPSBSQ1I2NHJpDQorICB7IDIwNjUsCTUsCTAsCTAsCSJSQ1I4bTEiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMDAwMDAxYlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMDY1ID0gUkNSOG0xDQorICB7IDIwNjYsCTUsCTAsCTAsCSJSQ1I4bUNMIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDIwMDAwMWJVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIwNjYgPSBSQ1I4bUNMDQorICB7IDIwNjcsCTYsCTAsCTAsCSJSQ1I4bWkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMDAwMjAxYlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMDY3ID0gUkNSOG1pDQorICB7IDIwNjgsCTIsCTEsCTAsCSJSQ1I4cjEiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMDAwMDAxM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMyB9LCAgLy8gSW5zdCAjMjA2OCA9IFJDUjhyMQ0KKyAgeyAyMDY5LAkyLAkxLAkwLAkiUkNSOHJDTCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQyMDAwMDEzVUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMyB9LCAgLy8gSW5zdCAjMjA2OSA9IFJDUjhyQ0wNCisgIHsgMjA3MCwJMywJMSwJMCwJIlJDUjhyaSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMwMDAyMDEzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjUgfSwgIC8vIEluc3QgIzIwNzAgPSBSQ1I4cmkNCisgIHsgMjA3MSwJMCwJMCwJMCwJIlJETVNSIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzIwMDAxMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIwNzEgPSBSRE1TUg0KKyAgeyAyMDcyLAkwLAkwLAkwLAkiUkRQTUMiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzMzAwMDEwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjA3MiA9IFJEUE1DDQorICB7IDIwNzMsCTAsCTAsCTAsCSJSRFRTQyIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDMxMDAwMTAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxOSwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjA3MyA9IFJEVFNDDQorICB7IDIwNzQsCTAsCTAsCTAsCSJSRFRTQ1AiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDAwMTJhVUxMLCBOVUxMLCBJbXBsaWNpdExpc3Q0NSwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjA3NCA9IFJEVFNDUA0KKyAgeyAyMDc1LAkwLAkwLAkwLAkiUkVQTkVfUFJFRklYIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZjIwMDAwMDFVTEwsIEltcGxpY2l0TGlzdDQxLCBJbXBsaWNpdExpc3QyNiwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjA3NSA9IFJFUE5FX1BSRUZJWA0KKyAgeyAyMDc2LAkwLAkwLAkwLAkiUkVQX01PVlNCIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YTQwMDAyMDFVTEwsIEltcGxpY2l0TGlzdDQ2LCBJbXBsaWNpdExpc3Q0NiwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjA3NiA9IFJFUF9NT1ZTQg0KKyAgeyAyMDc3LAkwLAkwLAkwLAkiUkVQX01PVlNEIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YTUwMDAyMDFVTEwsIEltcGxpY2l0TGlzdDQ2LCBJbXBsaWNpdExpc3Q0NiwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjA3NyA9IFJFUF9NT1ZTRA0KKyAgeyAyMDc4LAkwLAkwLAkwLAkiUkVQX01PVlNRIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YTUwMDEyMDFVTEwsIEltcGxpY2l0TGlzdDQ3LCBJbXBsaWNpdExpc3Q0NywgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjA3OCA9IFJFUF9NT1ZTUQ0KKyAgeyAyMDc5LAkwLAkwLAkwLAkiUkVQX01PVlNXIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YTUwMDAyNDFVTEwsIEltcGxpY2l0TGlzdDQ2LCBJbXBsaWNpdExpc3Q0NiwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjA3OSA9IFJFUF9NT1ZTVw0KKyAgeyAyMDgwLAkwLAkwLAkwLAkiUkVQX1BSRUZJWCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGYzMDAwMDAxVUxMLCBJbXBsaWNpdExpc3Q0MSwgSW1wbGljaXRMaXN0MjYsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIwODAgPSBSRVBfUFJFRklYDQorICB7IDIwODEsCTAsCTAsCTAsCSJSRVBfU1RPU0IiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhhYTAwMDIwMVVMTCwgSW1wbGljaXRMaXN0NDgsIEltcGxpY2l0TGlzdDQ5LCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMDgxID0gUkVQX1NUT1NCDQorICB7IDIwODIsCTAsCTAsCTAsCSJSRVBfU1RPU0QiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhhYjAwMDIwMVVMTCwgSW1wbGljaXRMaXN0NTAsIEltcGxpY2l0TGlzdDQ5LCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMDgyID0gUkVQX1NUT1NEDQorICB7IDIwODMsCTAsCTAsCTAsCSJSRVBfU1RPU1EiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhhYjAwMTIwMVVMTCwgSW1wbGljaXRMaXN0NTEsIEltcGxpY2l0TGlzdDUyLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMDgzID0gUkVQX1NUT1NRDQorICB7IDIwODQsCTAsCTAsCTAsCSJSRVBfU1RPU1ciLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhhYjAwMDI0MVVMTCwgSW1wbGljaXRMaXN0NTMsIEltcGxpY2l0TGlzdDQ5LCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMDg0ID0gUkVQX1NUT1NXDQorICB7IDIwODUsCTAsCTAsCTAsCSJSRVQiLCAwfCgxPDxUSUQ6OlJldHVybil8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VmFyaWFkaWMpLCAweGMzMDcwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMDg1ID0gUkVUDQorICB7IDIwODYsCTEsCTAsCTAsCSJSRVRJIiwgMHwoMTw8VElEOjpSZXR1cm4pfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlZhcmlhZGljKSwgMHhjMjA3NjAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMyMDg2ID0gUkVUSQ0KKyAgeyAyMDg3LAk1LAkwLAkwLAkiUk9MMTZtMSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQxMDAwMDU4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIwODcgPSBST0wxNm0xDQorICB7IDIwODgsCTUsCTAsCTAsCSJST0wxNm1DTCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQzMDAwMDU4VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMDg4ID0gUk9MMTZtQ0wNCisgIHsgMjA4OSwJNiwJMCwJMCwJIlJPTDE2bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhjMTAwMjA1OFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMDg5ID0gUk9MMTZtaQ0KKyAgeyAyMDkwLAkyLAkxLAkwLAkiUk9MMTZyMSIsIDAsIDB4ZDEwMDAwNTBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDIgfSwgIC8vIEluc3QgIzIwOTAgPSBST0wxNnIxDQorICB7IDIwOTEsCTIsCTEsCTAsCSJST0wxNnJDTCIsIDAsIDB4ZDMwMDAwNTBVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAyIH0sICAvLyBJbnN0ICMyMDkxID0gUk9MMTZyQ0wNCisgIHsgMjA5MiwJMywJMSwJMCwJIlJPTDE2cmkiLCAwLCAweGMxMDAyMDUwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIgfSwgIC8vIEluc3QgIzIwOTIgPSBST0wxNnJpDQorICB7IDIwOTMsCTUsCTAsCTAsCSJST0wzMm0xIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDEwMDAwMThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjA5MyA9IFJPTDMybTENCisgIHsgMjA5NCwJNSwJMCwJMCwJIlJPTDMybUNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDMwMDAwMThVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIwOTQgPSBST0wzMm1DTA0KKyAgeyAyMDk1LAk2LAkwLAkwLAkiUk9MMzJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMxMDAyMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIwOTUgPSBST0wzMm1pDQorICB7IDIwOTYsCTIsCTEsCTAsCSJST0wzMnIxIiwgMCwgMHhkMTAwMDAxMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICMyMDk2ID0gUk9MMzJyMQ0KKyAgeyAyMDk3LAkyLAkxLAkwLAkiUk9MMzJyQ0wiLCAwLCAweGQzMDAwMDEwVUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICMyMDk3ID0gUk9MMzJyQ0wNCisgIHsgMjA5OCwJMywJMSwJMCwJIlJPTDMycmkiLCAwLCAweGMxMDAyMDEwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTYgfSwgIC8vIEluc3QgIzIwOTggPSBST0wzMnJpDQorICB7IDIwOTksCTUsCTAsCTAsCSJST0w2NG0xIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDEwMDEwMThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjA5OSA9IFJPTDY0bTENCisgIHsgMjEwMCwJNSwJMCwJMCwJIlJPTDY0bUNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDMwMDEwMThVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIxMDAgPSBST0w2NG1DTA0KKyAgeyAyMTAxLAk2LAkwLAkwLAkiUk9MNjRtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMxMDAzMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIxMDEgPSBST0w2NG1pDQorICB7IDIxMDIsCTIsCTEsCTAsCSJST0w2NHIxIiwgMCwgMHhkMTAwMTAxMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYwIH0sICAvLyBJbnN0ICMyMTAyID0gUk9MNjRyMQ0KKyAgeyAyMTAzLAkyLAkxLAkwLAkiUk9MNjRyQ0wiLCAwLCAweGQzMDAxMDEwVUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYwIH0sICAvLyBJbnN0ICMyMTAzID0gUk9MNjRyQ0wNCisgIHsgMjEwNCwJMywJMSwJMCwJIlJPTDY0cmkiLCAwLCAweGMxMDAzMDEwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjAgfSwgIC8vIEluc3QgIzIxMDQgPSBST0w2NHJpDQorICB7IDIxMDUsCTUsCTAsCTAsCSJST0w4bTEiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMDAwMDAxOFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMTA1ID0gUk9MOG0xDQorICB7IDIxMDYsCTUsCTAsCTAsCSJST0w4bUNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDIwMDAwMThVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIxMDYgPSBST0w4bUNMDQorICB7IDIxMDcsCTYsCTAsCTAsCSJST0w4bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhjMDAwMjAxOFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMTA3ID0gUk9MOG1pDQorICB7IDIxMDgsCTIsCTEsCTAsCSJST0w4cjEiLCAwLCAweGQwMDAwMDEwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAzIH0sICAvLyBJbnN0ICMyMTA4ID0gUk9MOHIxDQorICB7IDIxMDksCTIsCTEsCTAsCSJST0w4ckNMIiwgMCwgMHhkMjAwMDAxMFVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDMgfSwgIC8vIEluc3QgIzIxMDkgPSBST0w4ckNMDQorICB7IDIxMTAsCTMsCTEsCTAsCSJST0w4cmkiLCAwLCAweGMwMDAyMDEwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjUgfSwgIC8vIEluc3QgIzIxMTAgPSBST0w4cmkNCisgIHsgMjExMSwJNSwJMCwJMCwJIlJPUjE2bTEiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMTAwMDA1OVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMTExID0gUk9SMTZtMQ0KKyAgeyAyMTEyLAk1LAkwLAkwLAkiUk9SMTZtQ0wiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMzAwMDA1OVVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjExMiA9IFJPUjE2bUNMDQorICB7IDIxMTMsCTYsCTAsCTAsCSJST1IxNm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YzEwMDIwNTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjExMyA9IFJPUjE2bWkNCisgIHsgMjExNCwJMiwJMSwJMCwJIlJPUjE2cjEiLCAwLCAweGQxMDAwMDUxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAyIH0sICAvLyBJbnN0ICMyMTE0ID0gUk9SMTZyMQ0KKyAgeyAyMTE1LAkyLAkxLAkwLAkiUk9SMTZyQ0wiLCAwLCAweGQzMDAwMDUxVUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMiB9LCAgLy8gSW5zdCAjMjExNSA9IFJPUjE2ckNMDQorICB7IDIxMTYsCTMsCTEsCTAsCSJST1IxNnJpIiwgMCwgMHhjMTAwMjA1MVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyIH0sICAvLyBJbnN0ICMyMTE2ID0gUk9SMTZyaQ0KKyAgeyAyMTE3LAk1LAkwLAkwLAkiUk9SMzJtMSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQxMDAwMDE5VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIxMTcgPSBST1IzMm0xDQorICB7IDIxMTgsCTUsCTAsCTAsCSJST1IzMm1DTCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQzMDAwMDE5VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMTE4ID0gUk9SMzJtQ0wNCisgIHsgMjExOSwJNiwJMCwJMCwJIlJPUjMybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhjMTAwMjAxOVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMTE5ID0gUk9SMzJtaQ0KKyAgeyAyMTIwLAkyLAkxLAkwLAkiUk9SMzJyMSIsIDAsIDB4ZDEwMDAwMTFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81OSB9LCAgLy8gSW5zdCAjMjEyMCA9IFJPUjMycjENCisgIHsgMjEyMSwJMiwJMSwJMCwJIlJPUjMyckNMIiwgMCwgMHhkMzAwMDAxMVVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81OSB9LCAgLy8gSW5zdCAjMjEyMSA9IFJPUjMyckNMDQorICB7IDIxMjIsCTMsCTEsCTAsCSJST1IzMnJpIiwgMCwgMHhjMTAwMjAxMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE2IH0sICAvLyBJbnN0ICMyMTIyID0gUk9SMzJyaQ0KKyAgeyAyMTIzLAk1LAkwLAkwLAkiUk9SNjRtMSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQxMDAxMDE5VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIxMjMgPSBST1I2NG0xDQorICB7IDIxMjQsCTUsCTAsCTAsCSJST1I2NG1DTCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQzMDAxMDE5VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMTI0ID0gUk9SNjRtQ0wNCisgIHsgMjEyNSwJNiwJMCwJMCwJIlJPUjY0bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhjMTAwMzAxOVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMTI1ID0gUk9SNjRtaQ0KKyAgeyAyMTI2LAkyLAkxLAkwLAkiUk9SNjRyMSIsIDAsIDB4ZDEwMDEwMTFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MCB9LCAgLy8gSW5zdCAjMjEyNiA9IFJPUjY0cjENCisgIHsgMjEyNywJMiwJMSwJMCwJIlJPUjY0ckNMIiwgMCwgMHhkMzAwMTAxMVVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MCB9LCAgLy8gSW5zdCAjMjEyNyA9IFJPUjY0ckNMDQorICB7IDIxMjgsCTMsCTEsCTAsCSJST1I2NHJpIiwgMCwgMHhjMTAwMzAxMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIwIH0sICAvLyBJbnN0ICMyMTI4ID0gUk9SNjRyaQ0KKyAgeyAyMTI5LAk1LAkwLAkwLAkiUk9SOG0xIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDAwMDAwMTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjEyOSA9IFJPUjhtMQ0KKyAgeyAyMTMwLAk1LAkwLAkwLAkiUk9SOG1DTCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQyMDAwMDE5VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMTMwID0gUk9SOG1DTA0KKyAgeyAyMTMxLAk2LAkwLAkwLAkiUk9SOG1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YzAwMDIwMTlVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjEzMSA9IFJPUjhtaQ0KKyAgeyAyMTMyLAkyLAkxLAkwLAkiUk9SOHIxIiwgMCwgMHhkMDAwMDAxMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMyB9LCAgLy8gSW5zdCAjMjEzMiA9IFJPUjhyMQ0KKyAgeyAyMTMzLAkyLAkxLAkwLAkiUk9SOHJDTCIsIDAsIDB4ZDIwMDAwMTFVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAzIH0sICAvLyBJbnN0ICMyMTMzID0gUk9SOHJDTA0KKyAgeyAyMTM0LAkzLAkxLAkwLAkiUk9SOHJpIiwgMCwgMHhjMDAwMjAxMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI1IH0sICAvLyBJbnN0ICMyMTM0ID0gUk9SOHJpDQorICB7IDIxMzUsCTcsCTEsCTAsCSJST1VORFBEbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDljMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzIxMzUgPSBST1VORFBEbV9JbnQNCisgIHsgMjEzNiwJMywJMSwJMCwJIlJPVU5EUERyX0ludCIsIDAsIDB4OWMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMjEzNiA9IFJPVU5EUERyX0ludA0KKyAgeyAyMTM3LAk3LAkxLAkwLAkiUk9VTkRQU21fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg4MDAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMyMTM3ID0gUk9VTkRQU21fSW50DQorICB7IDIxMzgsCTMsCTEsCTAsCSJST1VORFBTcl9JbnQiLCAwLCAweDhjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzIxMzggPSBST1VORFBTcl9JbnQNCisgIHsgMjEzOSwJOCwJMSwJMCwJIlJPVU5EU0RtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YmMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MSB9LCAgLy8gSW5zdCAjMjEzOSA9IFJPVU5EU0RtX0ludA0KKyAgeyAyMTQwLAk0LAkxLAkwLAkiUk9VTkRTRHJfSW50IiwgMCwgMHhiYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzUyIH0sICAvLyBJbnN0ICMyMTQwID0gUk9VTkRTRHJfSW50DQorICB7IDIxNDEsCTgsCTEsCTAsCSJST1VORFNTbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGFjMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTEgfSwgIC8vIEluc3QgIzIxNDEgPSBST1VORFNTbV9JbnQNCisgIHsgMjE0MiwJNCwJMSwJMCwJIlJPVU5EU1NyX0ludCIsIDAsIDB4YWMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MiB9LCAgLy8gSW5zdCAjMjE0MiA9IFJPVU5EU1NyX0ludA0KKyAgeyAyMTQzLAkwLAkwLAkwLAkiUlNNIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YWEwMDAxMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIxNDMgPSBSU00NCisgIHsgMjE0NCwJNiwJMSwJMCwJIlJTUVJUUFNtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MjQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjE0NCA9IFJTUVJUUFNtDQorICB7IDIxNDUsCTYsCTEsCTAsCSJSU1FSVFBTbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUyNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyMTQ1ID0gUlNRUlRQU21fSW50DQorICB7IDIxNDYsCTIsCTEsCTAsCSJSU1FSVFBTciIsIDAsIDB4NTI0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzIxNDYgPSBSU1FSVFBTcg0KKyAgeyAyMTQ3LAkyLAkxLAkwLAkiUlNRUlRQU3JfSW50IiwgMCwgMHg1MjQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjE0NyA9IFJTUVJUUFNyX0ludA0KKyAgeyAyMTQ4LAk2LAkxLAkwLAkiUlNRUlRTU20iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUyMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkwIH0sICAvLyBJbnN0ICMyMTQ4ID0gUlNRUlRTU20NCisgIHsgMjE0OSwJNiwJMSwJMCwJIlJTUVJUU1NtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTIwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzIxNDkgPSBSU1FSVFNTbV9JbnQNCisgIHsgMjE1MCwJMiwJMSwJMCwJIlJTUVJUU1NyIiwgMCwgMHg1MjAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTcgfSwgIC8vIEluc3QgIzIxNTAgPSBSU1FSVFNTcg0KKyAgeyAyMTUxLAkyLAkxLAkwLAkiUlNRUlRTU3JfSW50IiwgMCwgMHg1MjAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjE1MSA9IFJTUVJUU1NyX0ludA0KKyAgeyAyMTUyLAkwLAkwLAkwLAkiU0FIRiIsIDAsIDB4OWUwMDAwMDFVTEwsIEltcGxpY2l0TGlzdDI3LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIDAgfSwgIC8vIEluc3QgIzIxNTIgPSBTQUhGDQorICB7IDIxNTMsCTUsCTAsCTAsCSJTQVIxNm0xIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDEwMDAwNWZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjE1MyA9IFNBUjE2bTENCisgIHsgMjE1NCwJNSwJMCwJMCwJIlNBUjE2bUNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDMwMDAwNWZVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIxNTQgPSBTQVIxNm1DTA0KKyAgeyAyMTU1LAk2LAkwLAkwLAkiU0FSMTZtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMxMDAyMDVmVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIxNTUgPSBTQVIxNm1pDQorICB7IDIxNTYsCTIsCTEsCTAsCSJTQVIxNnIxIiwgMCwgMHhkMTAwMDA1N1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMiB9LCAgLy8gSW5zdCAjMjE1NiA9IFNBUjE2cjENCisgIHsgMjE1NywJMiwJMSwJMCwJIlNBUjE2ckNMIiwgMCwgMHhkMzAwMDA1N1VMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDIgfSwgIC8vIEluc3QgIzIxNTcgPSBTQVIxNnJDTA0KKyAgeyAyMTU4LAkzLAkxLAkwLAkiU0FSMTZyaSIsIDAsIDB4YzEwMDIwNTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMiB9LCAgLy8gSW5zdCAjMjE1OCA9IFNBUjE2cmkNCisgIHsgMjE1OSwJNSwJMCwJMCwJIlNBUjMybTEiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMTAwMDAxZlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMTU5ID0gU0FSMzJtMQ0KKyAgeyAyMTYwLAk1LAkwLAkwLAkiU0FSMzJtQ0wiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMzAwMDAxZlVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjE2MCA9IFNBUjMybUNMDQorICB7IDIxNjEsCTYsCTAsCTAsCSJTQVIzMm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YzEwMDIwMWZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjE2MSA9IFNBUjMybWkNCisgIHsgMjE2MiwJMiwJMSwJMCwJIlNBUjMycjEiLCAwLCAweGQxMDAwMDE3VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTkgfSwgIC8vIEluc3QgIzIxNjIgPSBTQVIzMnIxDQorICB7IDIxNjMsCTIsCTEsCTAsCSJTQVIzMnJDTCIsIDAsIDB4ZDMwMDAwMTdVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTkgfSwgIC8vIEluc3QgIzIxNjMgPSBTQVIzMnJDTA0KKyAgeyAyMTY0LAkzLAkxLAkwLAkiU0FSMzJyaSIsIDAsIDB4YzEwMDIwMTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjMjE2NCA9IFNBUjMycmkNCisgIHsgMjE2NSwJNSwJMCwJMCwJIlNBUjY0bTEiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMTAwMTAxZlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMTY1ID0gU0FSNjRtMQ0KKyAgeyAyMTY2LAk1LAkwLAkwLAkiU0FSNjRtQ0wiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMzAwMTAxZlVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjE2NiA9IFNBUjY0bUNMDQorICB7IDIxNjcsCTYsCTAsCTAsCSJTQVI2NG1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YzEwMDMwMWZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjE2NyA9IFNBUjY0bWkNCisgIHsgMjE2OCwJMiwJMSwJMCwJIlNBUjY0cjEiLCAwLCAweGQxMDAxMDE3VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNjAgfSwgIC8vIEluc3QgIzIxNjggPSBTQVI2NHIxDQorICB7IDIxNjksCTIsCTEsCTAsCSJTQVI2NHJDTCIsIDAsIDB4ZDMwMDEwMTdVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNjAgfSwgIC8vIEluc3QgIzIxNjkgPSBTQVI2NHJDTA0KKyAgeyAyMTcwLAkzLAkxLAkwLAkiU0FSNjRyaSIsIDAsIDB4YzEwMDMwMTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMCB9LCAgLy8gSW5zdCAjMjE3MCA9IFNBUjY0cmkNCisgIHsgMjE3MSwJNSwJMCwJMCwJIlNBUjhtMSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQwMDAwMDFmVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIxNzEgPSBTQVI4bTENCisgIHsgMjE3MiwJNSwJMCwJMCwJIlNBUjhtQ0wiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMjAwMDAxZlVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjE3MiA9IFNBUjhtQ0wNCisgIHsgMjE3MywJNiwJMCwJMCwJIlNBUjhtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMwMDAyMDFmVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIxNzMgPSBTQVI4bWkNCisgIHsgMjE3NCwJMiwJMSwJMCwJIlNBUjhyMSIsIDAsIDB4ZDAwMDAwMTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDMgfSwgIC8vIEluc3QgIzIxNzQgPSBTQVI4cjENCisgIHsgMjE3NSwJMiwJMSwJMCwJIlNBUjhyQ0wiLCAwLCAweGQyMDAwMDE3VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMyB9LCAgLy8gSW5zdCAjMjE3NSA9IFNBUjhyQ0wNCisgIHsgMjE3NiwJMywJMSwJMCwJIlNBUjhyaSIsIDAsIDB4YzAwMDIwMTdVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNSB9LCAgLy8gSW5zdCAjMjE3NiA9IFNBUjhyaQ0KKyAgeyAyMTc3LAkxLAkwLAkwLAkiU0JCMTZpMTYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZDAwNjA0MVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzIxNzcgPSBTQkIxNmkxNg0KKyAgeyAyMTc4LAk2LAkwLAkwLAkiU0JCMTZtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgxMDA2MDViVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIxNzggPSBTQkIxNm1pDQorICB7IDIxNzksCTYsCTAsCTAsCSJTQkIxNm1pOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgzMDAyMDViVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIxNzkgPSBTQkIxNm1pOA0KKyAgeyAyMTgwLAk2LAkwLAkwLAkiU0JCMTZtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDE5MDAwMDQ0VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTEgfSwgIC8vIEluc3QgIzIxODAgPSBTQkIxNm1yDQorICB7IDIxODEsCTMsCTEsCTAsCSJTQkIxNnJpIiwgMCwgMHg4MTAwNjA1M1VMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyIH0sICAvLyBJbnN0ICMyMTgxID0gU0JCMTZyaQ0KKyAgeyAyMTgyLAkzLAkxLAkwLAkiU0JCMTZyaTgiLCAwLCAweDgzMDAyMDUzVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIgfSwgIC8vIEluc3QgIzIxODIgPSBTQkIxNnJpOA0KKyAgeyAyMTgzLAk3LAkxLAkwLAkiU0JCMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MWIwMDAwNDZVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMyB9LCAgLy8gSW5zdCAjMjE4MyA9IFNCQjE2cm0NCisgIHsgMjE4NCwJMywJMSwJMCwJIlNCQjE2cnIiLCAwLCAweDE5MDAwMDQzVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzIxODQgPSBTQkIxNnJyDQorICB7IDIxODUsCTMsCTEsCTAsCSJTQkIxNnJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFiMDAwMDQ1VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzIxODUgPSBTQkIxNnJyX1JFVg0KKyAgeyAyMTg2LAkxLAkwLAkwLAkiU0JCMzJpMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZDAwYTAwMVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzIxODYgPSBTQkIzMmkzMg0KKyAgeyAyMTg3LAk2LAkwLAkwLAkiU0JCMzJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgxMDBhMDFiVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIxODcgPSBTQkIzMm1pDQorICB7IDIxODgsCTYsCTAsCTAsCSJTQkIzMm1pOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgzMDAyMDFiVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIxODggPSBTQkIzMm1pOA0KKyAgeyAyMTg5LAk2LAkwLAkwLAkiU0JCMzJtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDE5MDAwMDA0VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTUgfSwgIC8vIEluc3QgIzIxODkgPSBTQkIzMm1yDQorICB7IDIxOTAsCTMsCTEsCTAsCSJTQkIzMnJpIiwgMCwgMHg4MTAwYTAxM1VMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE2IH0sICAvLyBJbnN0ICMyMTkwID0gU0JCMzJyaQ0KKyAgeyAyMTkxLAkzLAkxLAkwLAkiU0JCMzJyaTgiLCAwLCAweDgzMDAyMDEzVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTYgfSwgIC8vIEluc3QgIzIxOTEgPSBTQkIzMnJpOA0KKyAgeyAyMTkyLAk3LAkxLAkwLAkiU0JCMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MWIwMDAwMDZVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNyB9LCAgLy8gSW5zdCAjMjE5MiA9IFNCQjMycm0NCisgIHsgMjE5MywJMywJMSwJMCwJIlNCQjMycnIiLCAwLCAweDE5MDAwMDAzVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzIxOTMgPSBTQkIzMnJyDQorICB7IDIxOTQsCTMsCTEsCTAsCSJTQkIzMnJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFiMDAwMDA1VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzIxOTQgPSBTQkIzMnJyX1JFVg0KKyAgeyAyMTk1LAkxLAkwLAkwLAkiU0JCNjRpMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZDAwYjAwMVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzIxOTUgPSBTQkI2NGkzMg0KKyAgeyAyMTk2LAk2LAkwLAkwLAkiU0JCNjRtaTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODEwMGIwMWJVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjE5NiA9IFNCQjY0bWkzMg0KKyAgeyAyMTk3LAk2LAkwLAkwLAkiU0JCNjRtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MzAwMzAxYlVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMTk3ID0gU0JCNjRtaTgNCisgIHsgMjE5OCwJNiwJMCwJMCwJIlNCQjY0bXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxOTAwMTAwNFVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE5IH0sICAvLyBJbnN0ICMyMTk4ID0gU0JCNjRtcg0KKyAgeyAyMTk5LAkzLAkxLAkwLAkiU0JCNjRyaTMyIiwgMCwgMHg4MTAwYjAxM1VMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIwIH0sICAvLyBJbnN0ICMyMTk5ID0gU0JCNjRyaTMyDQorICB7IDIyMDAsCTMsCTEsCTAsCSJTQkI2NHJpOCIsIDAsIDB4ODMwMDMwMTNVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMCB9LCAgLy8gSW5zdCAjMjIwMCA9IFNCQjY0cmk4DQorICB7IDIyMDEsCTcsCTEsCTAsCSJTQkI2NHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxYjAwMTAwNlVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIxIH0sICAvLyBJbnN0ICMyMjAxID0gU0JCNjRybQ0KKyAgeyAyMjAyLAkzLAkxLAkwLAkiU0JCNjRyciIsIDAsIDB4MTkwMDEwMDNVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMjIwMiA9IFNCQjY0cnINCisgIHsgMjIwMywJMywJMSwJMCwJIlNCQjY0cnJfUkVWIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MWIwMDEwMDVVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMjIwMyA9IFNCQjY0cnJfUkVWDQorICB7IDIyMDQsCTEsCTAsCTAsCSJTQkI4aTgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxYzAwMjAwMVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzIyMDQgPSBTQkI4aTgNCisgIHsgMjIwNSwJNiwJMCwJMCwJIlNCQjhtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgwMDAyMDFiVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIyMDUgPSBTQkI4bWkNCisgIHsgMjIwNiwJNiwJMCwJMCwJIlNCQjhtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDE4MDAwMDA0VUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjQgfSwgIC8vIEluc3QgIzIyMDYgPSBTQkI4bXINCisgIHsgMjIwNywJMywJMSwJMCwJIlNCQjhyaSIsIDAsIDB4ODAwMDIwMTNVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNSB9LCAgLy8gSW5zdCAjMjIwNyA9IFNCQjhyaQ0KKyAgeyAyMjA4LAk3LAkxLAkwLAkiU0JCOHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxYTAwMDAwNlVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI2IH0sICAvLyBJbnN0ICMyMjA4ID0gU0JCOHJtDQorICB7IDIyMDksCTMsCTEsCTAsCSJTQkI4cnIiLCAwLCAweDE4MDAwMDAzVUxMLCBJbXBsaWNpdExpc3QxLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjcgfSwgIC8vIEluc3QgIzIyMDkgPSBTQkI4cnINCisgIHsgMjIxMCwJMywJMSwJMCwJIlNCQjhycl9SRVYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxYTAwMDAwNVVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI3IH0sICAvLyBJbnN0ICMyMjEwID0gU0JCOHJyX1JFVg0KKyAgeyAyMjExLAkwLAkwLAkwLAkiU0NBUzE2IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YWYwMDAwNDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIyMTEgPSBTQ0FTMTYNCisgIHsgMjIxMiwJMCwJMCwJMCwJIlNDQVMzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFmMDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMjEyID0gU0NBUzMyDQorICB7IDIyMTMsCTAsCTAsCTAsCSJTQ0FTNjQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhZjAwMTAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjIxMyA9IFNDQVM2NA0KKyAgeyAyMjE0LAkwLAkwLAkwLAkiU0NBUzgiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhZTAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjIxNCA9IFNDQVM4DQorICB7IDIyMTUsCTUsCTAsCTAsCSJTRVRBRW0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5MzAwMDExOFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjIxNSA9IFNFVEFFbQ0KKyAgeyAyMjE2LAkxLAkxLAkwLAkiU0VUQUVyIiwgMCwgMHg5MzAwMDExMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzIyMTYgPSBTRVRBRXINCisgIHsgMjIxNywJNSwJMCwJMCwJIlNFVEFtIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4OTcwMDAxMThVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyMTcgPSBTRVRBbQ0KKyAgeyAyMjE4LAkxLAkxLAkwLAkiU0VUQXIiLCAwLCAweDk3MDAwMTEwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNSB9LCAgLy8gSW5zdCAjMjIxOCA9IFNFVEFyDQorICB7IDIyMTksCTUsCTAsCTAsCSJTRVRCRW0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5NjAwMDExOFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjIxOSA9IFNFVEJFbQ0KKyAgeyAyMjIwLAkxLAkxLAkwLAkiU0VUQkVyIiwgMCwgMHg5NjAwMDExMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzIyMjAgPSBTRVRCRXINCisgIHsgMjIyMSwJMSwJMSwJMCwJIlNFVEJfQzE2ciIsIDAsIDB4MTkwMDAwNjBVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDQgfSwgIC8vIEluc3QgIzIyMjEgPSBTRVRCX0MxNnINCisgIHsgMjIyMiwJMSwJMSwJMCwJIlNFVEJfQzMyciIsIDAsIDB4MTkwMDAwMjBVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82NCB9LCAgLy8gSW5zdCAjMjIyMiA9IFNFVEJfQzMycg0KKyAgeyAyMjIzLAkxLAkxLAkwLAkiU0VUQl9DNjRyIiwgMCwgMHgxOTAwMTAyMFVMTCwgSW1wbGljaXRMaXN0MSwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzY1IH0sICAvLyBJbnN0ICMyMjIzID0gU0VUQl9DNjRyDQorICB7IDIyMjQsCTEsCTEsCTAsCSJTRVRCX0M4ciIsIDAsIDB4MTgwMDAwMjBVTEwsIEltcGxpY2l0TGlzdDEsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzIyMjQgPSBTRVRCX0M4cg0KKyAgeyAyMjI1LAk1LAkwLAkwLAkiU0VUQm0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5MjAwMDExOFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjIyNSA9IFNFVEJtDQorICB7IDIyMjYsCTEsCTEsCTAsCSJTRVRCciIsIDAsIDB4OTIwMDAxMTBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA1IH0sICAvLyBJbnN0ICMyMjI2ID0gU0VUQnINCisgIHsgMjIyNywJNSwJMCwJMCwJIlNFVEVtIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4OTQwMDAxMThVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyMjcgPSBTRVRFbQ0KKyAgeyAyMjI4LAkxLAkxLAkwLAkiU0VURXIiLCAwLCAweDk0MDAwMTEwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNSB9LCAgLy8gSW5zdCAjMjIyOCA9IFNFVEVyDQorICB7IDIyMjksCTUsCTAsCTAsCSJTRVRHRW0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5ZDAwMDExOFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjIyOSA9IFNFVEdFbQ0KKyAgeyAyMjMwLAkxLAkxLAkwLAkiU0VUR0VyIiwgMCwgMHg5ZDAwMDExMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzIyMzAgPSBTRVRHRXINCisgIHsgMjIzMSwJNSwJMCwJMCwJIlNFVEdtIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4OWYwMDAxMThVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyMzEgPSBTRVRHbQ0KKyAgeyAyMjMyLAkxLAkxLAkwLAkiU0VUR3IiLCAwLCAweDlmMDAwMTEwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNSB9LCAgLy8gSW5zdCAjMjIzMiA9IFNFVEdyDQorICB7IDIyMzMsCTUsCTAsCTAsCSJTRVRMRW0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5ZTAwMDExOFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjIzMyA9IFNFVExFbQ0KKyAgeyAyMjM0LAkxLAkxLAkwLAkiU0VUTEVyIiwgMCwgMHg5ZTAwMDExMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzIyMzQgPSBTRVRMRXINCisgIHsgMjIzNSwJNSwJMCwJMCwJIlNFVExtIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4OWMwMDAxMThVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyMzUgPSBTRVRMbQ0KKyAgeyAyMjM2LAkxLAkxLAkwLAkiU0VUTHIiLCAwLCAweDljMDAwMTEwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNSB9LCAgLy8gSW5zdCAjMjIzNiA9IFNFVExyDQorICB7IDIyMzcsCTUsCTAsCTAsCSJTRVRORW0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5NTAwMDExOFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjIzNyA9IFNFVE5FbQ0KKyAgeyAyMjM4LAkxLAkxLAkwLAkiU0VUTkVyIiwgMCwgMHg5NTAwMDExMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzIyMzggPSBTRVRORXINCisgIHsgMjIzOSwJNSwJMCwJMCwJIlNFVE5PbSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDkxMDAwMTE4VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMjM5ID0gU0VUTk9tDQorICB7IDIyNDAsCTEsCTEsCTAsCSJTRVROT3IiLCAwLCAweDkxMDAwMTEwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNSB9LCAgLy8gSW5zdCAjMjI0MCA9IFNFVE5Pcg0KKyAgeyAyMjQxLAk1LAkwLAkwLAkiU0VUTlBtIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4OWIwMDAxMThVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyNDEgPSBTRVROUG0NCisgIHsgMjI0MiwJMSwJMSwJMCwJIlNFVE5QciIsIDAsIDB4OWIwMDAxMTBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA1IH0sICAvLyBJbnN0ICMyMjQyID0gU0VUTlByDQorICB7IDIyNDMsCTUsCTAsCTAsCSJTRVROU20iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5OTAwMDExOFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjI0MyA9IFNFVE5TbQ0KKyAgeyAyMjQ0LAkxLAkxLAkwLAkiU0VUTlNyIiwgMCwgMHg5OTAwMDExMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzIyNDQgPSBTRVROU3INCisgIHsgMjI0NSwJNSwJMCwJMCwJIlNFVE9tIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4OTAwMDAxMThVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyNDUgPSBTRVRPbQ0KKyAgeyAyMjQ2LAkxLAkxLAkwLAkiU0VUT3IiLCAwLCAweDkwMDAwMTEwVUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNSB9LCAgLy8gSW5zdCAjMjI0NiA9IFNFVE9yDQorICB7IDIyNDcsCTUsCTAsCTAsCSJTRVRQbSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDlhMDAwMTE4VUxMLCBJbXBsaWNpdExpc3QxLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMjQ3ID0gU0VUUG0NCisgIHsgMjI0OCwJMSwJMSwJMCwJIlNFVFByIiwgMCwgMHg5YTAwMDExMFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDUgfSwgIC8vIEluc3QgIzIyNDggPSBTRVRQcg0KKyAgeyAyMjQ5LAk1LAkwLAkwLAkiU0VUU20iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg5ODAwMDExOFVMTCwgSW1wbGljaXRMaXN0MSwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjI0OSA9IFNFVFNtDQorICB7IDIyNTAsCTEsCTEsCTAsCSJTRVRTciIsIDAsIDB4OTgwMDAxMTBVTEwsIEltcGxpY2l0TGlzdDEsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA1IH0sICAvLyBJbnN0ICMyMjUwID0gU0VUU3INCisgIHsgMjI1MSwJMCwJMCwJMCwJIlNGRU5DRSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhZTAwMDEyOVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjI1MSA9IFNGRU5DRQ0KKyAgeyAyMjUyLAk1LAkxLAkwLAkiU0dEVG0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDAwMTE4VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMjUyID0gU0dEVG0NCisgIHsgMjI1MywJNSwJMCwJMCwJIlNITDE2bTEiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMTAwMDA1Y1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMjUzID0gU0hMMTZtMQ0KKyAgeyAyMjU0LAk1LAkwLAkwLAkiU0hMMTZtQ0wiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMzAwMDA1Y1VMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjI1NCA9IFNITDE2bUNMDQorICB7IDIyNTUsCTYsCTAsCTAsCSJTSEwxNm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YzEwMDIwNWNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjI1NSA9IFNITDE2bWkNCisgIHsgMjI1NiwJMiwJMSwJMCwJIlNITDE2cjEiLCAwfCgxPDxUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQxMDAwMDU0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAyIH0sICAvLyBJbnN0ICMyMjU2ID0gU0hMMTZyMQ0KKyAgeyAyMjU3LAkyLAkxLAkwLAkiU0hMMTZyQ0wiLCAwLCAweGQzMDAwMDU0VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMiB9LCAgLy8gSW5zdCAjMjI1NyA9IFNITDE2ckNMDQorICB7IDIyNTgsCTMsCTEsCTAsCSJTSEwxNnJpIiwgMHwoMTw8VElEOjpDb252ZXJ0aWJsZVRvM0FkZHIpLCAweGMxMDAyMDU0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIgfSwgIC8vIEluc3QgIzIyNTggPSBTSEwxNnJpDQorICB7IDIyNTksCTUsCTAsCTAsCSJTSEwzMm0xIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDEwMDAwMWNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjI1OSA9IFNITDMybTENCisgIHsgMjI2MCwJNSwJMCwJMCwJIlNITDMybUNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDMwMDAwMWNVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyNjAgPSBTSEwzMm1DTA0KKyAgeyAyMjYxLAk2LAkwLAkwLAkiU0hMMzJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMxMDAyMDFjVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIyNjEgPSBTSEwzMm1pDQorICB7IDIyNjIsCTIsCTEsCTAsCSJTSEwzMnIxIiwgMHwoMTw8VElEOjpDb252ZXJ0aWJsZVRvM0FkZHIpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMTAwMDAxNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICMyMjYyID0gU0hMMzJyMQ0KKyAgeyAyMjYzLAkyLAkxLAkwLAkiU0hMMzJyQ0wiLCAwLCAweGQzMDAwMDE0VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICMyMjYzID0gU0hMMzJyQ0wNCisgIHsgMjI2NCwJMywJMSwJMCwJIlNITDMycmkiLCAwfCgxPDxUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkciksIDB4YzEwMDIwMTRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjMjI2NCA9IFNITDMycmkNCisgIHsgMjI2NSwJNSwJMCwJMCwJIlNITDY0bTEiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMTAwMTAxY1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMjY1ID0gU0hMNjRtMQ0KKyAgeyAyMjY2LAk1LAkwLAkwLAkiU0hMNjRtQ0wiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMzAwMTAxY1VMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjI2NiA9IFNITDY0bUNMDQorICB7IDIyNjcsCTYsCTAsCTAsCSJTSEw2NG1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YzEwMDMwMWNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjI2NyA9IFNITDY0bWkNCisgIHsgMjI2OCwJMiwJMSwJMCwJIlNITDY0cjEiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhkMTAwMTAxNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYwIH0sICAvLyBJbnN0ICMyMjY4ID0gU0hMNjRyMQ0KKyAgeyAyMjY5LAkyLAkxLAkwLAkiU0hMNjRyQ0wiLCAwLCAweGQzMDAxMDE0VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYwIH0sICAvLyBJbnN0ICMyMjY5ID0gU0hMNjRyQ0wNCisgIHsgMjI3MCwJMywJMSwJMCwJIlNITDY0cmkiLCAwfCgxPDxUSUQ6OkNvbnZlcnRpYmxlVG8zQWRkciksIDB4YzEwMDMwMTRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMCB9LCAgLy8gSW5zdCAjMjI3MCA9IFNITDY0cmkNCisgIHsgMjI3MSwJNSwJMCwJMCwJIlNITDhtMSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQwMDAwMDFjVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyNzEgPSBTSEw4bTENCisgIHsgMjI3MiwJNSwJMCwJMCwJIlNITDhtQ0wiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMjAwMDAxY1VMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjI3MiA9IFNITDhtQ0wNCisgIHsgMjI3MywJNiwJMCwJMCwJIlNITDhtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMwMDAyMDFjVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIyNzMgPSBTSEw4bWkNCisgIHsgMjI3NCwJMiwJMSwJMCwJIlNITDhyMSIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDAwMDAwMTRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDMgfSwgIC8vIEluc3QgIzIyNzQgPSBTSEw4cjENCisgIHsgMjI3NSwJMiwJMSwJMCwJIlNITDhyQ0wiLCAwLCAweGQyMDAwMDE0VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwMyB9LCAgLy8gSW5zdCAjMjI3NSA9IFNITDhyQ0wNCisgIHsgMjI3NiwJMywJMSwJMCwJIlNITDhyaSIsIDAsIDB4YzAwMDIwMTRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNSB9LCAgLy8gSW5zdCAjMjI3NiA9IFNITDhyaQ0KKyAgeyAyMjc3LAk2LAkwLAkwLAkiU0hMRDE2bXJDTCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGE1MDAwMTQ0VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzExIH0sICAvLyBJbnN0ICMyMjc3ID0gU0hMRDE2bXJDTA0KKyAgeyAyMjc4LAk3LAkwLAkwLAkiU0hMRDE2bXJpOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGE0MDAyMTQ0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjA4IH0sICAvLyBJbnN0ICMyMjc4ID0gU0hMRDE2bXJpOA0KKyAgeyAyMjc5LAkzLAkxLAkwLAkiU0hMRDE2cnJDTCIsIDAsIDB4YTUwMDAxNDNVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzIyNzkgPSBTSExEMTZyckNMDQorICB7IDIyODAsCTQsCTEsCTAsCSJTSExEMTZycmk4IiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhhNDAwMjE0M1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIwOSB9LCAgLy8gSW5zdCAjMjI4MCA9IFNITEQxNnJyaTgNCisgIHsgMjI4MSwJNiwJMCwJMCwJIlNITEQzMm1yQ0wiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhhNTAwMDEwNFVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNSB9LCAgLy8gSW5zdCAjMjI4MSA9IFNITEQzMm1yQ0wNCisgIHsgMjI4MiwJNywJMCwJMCwJIlNITEQzMm1yaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhhNDAwMjEwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIxMCB9LCAgLy8gSW5zdCAjMjI4MiA9IFNITEQzMm1yaTgNCisgIHsgMjI4MywJMywJMSwJMCwJIlNITEQzMnJyQ0wiLCAwLCAweGE1MDAwMTAzVUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICMyMjgzID0gU0hMRDMycnJDTA0KKyAgeyAyMjg0LAk0LAkxLAkwLAkiU0hMRDMycnJpOCIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4YTQwMDIxMDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMTEgfSwgIC8vIEluc3QgIzIyODQgPSBTSExEMzJycmk4DQorICB7IDIyODUsCTYsCTAsCTAsCSJTSExENjRtckNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YTUwMDExMDRVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTkgfSwgIC8vIEluc3QgIzIyODUgPSBTSExENjRtckNMDQorICB7IDIyODYsCTcsCTAsCTAsCSJTSExENjRtcmk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YTQwMDMxMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMTIgfSwgIC8vIEluc3QgIzIyODYgPSBTSExENjRtcmk4DQorICB7IDIyODcsCTMsCTEsCTAsCSJTSExENjRyckNMIiwgMCwgMHhhNTAwMTEwM1VMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMiB9LCAgLy8gSW5zdCAjMjI4NyA9IFNITEQ2NHJyQ0wNCisgIHsgMjI4OCwJNCwJMSwJMCwJIlNITEQ2NHJyaTgiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGE0MDAzMTAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjEzIH0sICAvLyBJbnN0ICMyMjg4ID0gU0hMRDY0cnJpOA0KKyAgeyAyMjg5LAk1LAkwLAkwLAkiU0hSMTZtMSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQxMDAwMDVkVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyODkgPSBTSFIxNm0xDQorICB7IDIyOTAsCTUsCTAsCTAsCSJTSFIxNm1DTCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGQzMDAwMDVkVUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMjkwID0gU0hSMTZtQ0wNCisgIHsgMjI5MSwJNiwJMCwJMCwJIlNIUjE2bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhjMTAwMjA1ZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMjkxID0gU0hSMTZtaQ0KKyAgeyAyMjkyLAkyLAkxLAkwLAkiU0hSMTZyMSIsIDAsIDB4ZDEwMDAwNTVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDIgfSwgIC8vIEluc3QgIzIyOTIgPSBTSFIxNnIxDQorICB7IDIyOTMsCTIsCTEsCTAsCSJTSFIxNnJDTCIsIDAsIDB4ZDMwMDAwNTVVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAyIH0sICAvLyBJbnN0ICMyMjkzID0gU0hSMTZyQ0wNCisgIHsgMjI5NCwJMywJMSwJMCwJIlNIUjE2cmkiLCAwLCAweGMxMDAyMDU1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIgfSwgIC8vIEluc3QgIzIyOTQgPSBTSFIxNnJpDQorICB7IDIyOTUsCTUsCTAsCTAsCSJTSFIzMm0xIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDEwMDAwMWRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjI5NSA9IFNIUjMybTENCisgIHsgMjI5NiwJNSwJMCwJMCwJIlNIUjMybUNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDMwMDAwMWRVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIyOTYgPSBTSFIzMm1DTA0KKyAgeyAyMjk3LAk2LAkwLAkwLAkiU0hSMzJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMxMDAyMDFkVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIyOTcgPSBTSFIzMm1pDQorICB7IDIyOTgsCTIsCTEsCTAsCSJTSFIzMnIxIiwgMCwgMHhkMTAwMDAxNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICMyMjk4ID0gU0hSMzJyMQ0KKyAgeyAyMjk5LAkyLAkxLAkwLAkiU0hSMzJyQ0wiLCAwLCAweGQzMDAwMDE1VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzU5IH0sICAvLyBJbnN0ICMyMjk5ID0gU0hSMzJyQ0wNCisgIHsgMjMwMCwJMywJMSwJMCwJIlNIUjMycmkiLCAwLCAweGMxMDAyMDE1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTYgfSwgIC8vIEluc3QgIzIzMDAgPSBTSFIzMnJpDQorICB7IDIzMDEsCTUsCTAsCTAsCSJTSFI2NG0xIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDEwMDEwMWRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjMwMSA9IFNIUjY0bTENCisgIHsgMjMwMiwJNSwJMCwJMCwJIlNIUjY0bUNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDMwMDEwMWRVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIzMDIgPSBTSFI2NG1DTA0KKyAgeyAyMzAzLAk2LAkwLAkwLAkiU0hSNjRtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGMxMDAzMDFkVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzIzMDMgPSBTSFI2NG1pDQorICB7IDIzMDQsCTIsCTEsCTAsCSJTSFI2NHIxIiwgMCwgMHhkMTAwMTAxNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYwIH0sICAvLyBJbnN0ICMyMzA0ID0gU0hSNjRyMQ0KKyAgeyAyMzA1LAkyLAkxLAkwLAkiU0hSNjRyQ0wiLCAwLCAweGQzMDAxMDE1VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYwIH0sICAvLyBJbnN0ICMyMzA1ID0gU0hSNjRyQ0wNCisgIHsgMjMwNiwJMywJMSwJMCwJIlNIUjY0cmkiLCAwLCAweGMxMDAzMDE1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjAgfSwgIC8vIEluc3QgIzIzMDYgPSBTSFI2NHJpDQorICB7IDIzMDcsCTUsCTAsCTAsCSJTSFI4bTEiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhkMDAwMDAxZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMzA3ID0gU0hSOG0xDQorICB7IDIzMDgsCTUsCTAsCTAsCSJTSFI4bUNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ZDIwMDAwMWRVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIzMDggPSBTSFI4bUNMDQorICB7IDIzMDksCTYsCTAsCTAsCSJTSFI4bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhjMDAwMjAxZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMzA5ID0gU0hSOG1pDQorICB7IDIzMTAsCTIsCTEsCTAsCSJTSFI4cjEiLCAwLCAweGQwMDAwMDE1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAzIH0sICAvLyBJbnN0ICMyMzEwID0gU0hSOHIxDQorICB7IDIzMTEsCTIsCTEsCTAsCSJTSFI4ckNMIiwgMCwgMHhkMjAwMDAxNVVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMDMgfSwgIC8vIEluc3QgIzIzMTEgPSBTSFI4ckNMDQorICB7IDIzMTIsCTMsCTEsCTAsCSJTSFI4cmkiLCAwLCAweGMwMDAyMDE1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjUgfSwgIC8vIEluc3QgIzIzMTIgPSBTSFI4cmkNCisgIHsgMjMxMywJNiwJMCwJMCwJIlNIUkQxNm1yQ0wiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhhZDAwMDE0NFVMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjMjMxMyA9IFNIUkQxNm1yQ0wNCisgIHsgMjMxNCwJNywJMCwJMCwJIlNIUkQxNm1yaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHhhYzAwMjE0NFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIwOCB9LCAgLy8gSW5zdCAjMjMxNCA9IFNIUkQxNm1yaTgNCisgIHsgMjMxNSwJMywJMSwJMCwJIlNIUkQxNnJyQ0wiLCAwLCAweGFkMDAwMTQzVUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMyMzE1ID0gU0hSRDE2cnJDTA0KKyAgeyAyMzE2LAk0LAkxLAkwLAkiU0hSRDE2cnJpOCIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4YWMwMDIxNDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMDkgfSwgIC8vIEluc3QgIzIzMTYgPSBTSFJEMTZycmk4DQorICB7IDIzMTcsCTYsCTAsCTAsCSJTSFJEMzJtckNMIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YWQwMDAxMDRVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTUgfSwgIC8vIEluc3QgIzIzMTcgPSBTSFJEMzJtckNMDQorICB7IDIzMTgsCTcsCTAsCTAsCSJTSFJEMzJtcmk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4YWMwMDIxMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMTAgfSwgIC8vIEluc3QgIzIzMTggPSBTSFJEMzJtcmk4DQorICB7IDIzMTksCTMsCTEsCTAsCSJTSFJEMzJyckNMIiwgMCwgMHhhZDAwMDEwM1VMTCwgSW1wbGljaXRMaXN0NDQsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMjMxOSA9IFNIUkQzMnJyQ0wNCisgIHsgMjMyMCwJNCwJMSwJMCwJIlNIUkQzMnJyaTgiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweGFjMDAyMTAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjExIH0sICAvLyBJbnN0ICMyMzIwID0gU0hSRDMycnJpOA0KKyAgeyAyMzIxLAk2LAkwLAkwLAkiU0hSRDY0bXJDTCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGFkMDAxMTA0VUxMLCBJbXBsaWNpdExpc3Q0NCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE5IH0sICAvLyBJbnN0ICMyMzIxID0gU0hSRDY0bXJDTA0KKyAgeyAyMzIyLAk3LAkwLAkwLAkiU0hSRDY0bXJpOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweGFjMDAzMTA0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjEyIH0sICAvLyBJbnN0ICMyMzIyID0gU0hSRDY0bXJpOA0KKyAgeyAyMzIzLAkzLAkxLAkwLAkiU0hSRDY0cnJDTCIsIDAsIDB4YWQwMDExMDNVTEwsIEltcGxpY2l0TGlzdDQ0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzIzMjMgPSBTSFJENjRyckNMDQorICB7IDIzMjQsCTQsCTEsCTAsCSJTSFJENjRycmk4IiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHhhYzAwMzEwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIxMyB9LCAgLy8gSW5zdCAjMjMyNCA9IFNIUkQ2NHJyaTgNCisgIHsgMjMyNSwJOCwJMSwJMCwJIlNIVUZQRHJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YzY4MDIxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTEgfSwgIC8vIEluc3QgIzIzMjUgPSBTSFVGUERybWkNCisgIHsgMjMyNiwJNCwJMSwJMCwJIlNIVUZQRHJyaSIsIDAsIDB4YzY4MDIxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTIgfSwgIC8vIEluc3QgIzIzMjYgPSBTSFVGUERycmkNCisgIHsgMjMyNywJOCwJMSwJMCwJIlNIVUZQU3JtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4YzY0MDIxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTEgfSwgIC8vIEluc3QgIzIzMjcgPSBTSFVGUFNybWkNCisgIHsgMjMyOCwJNCwJMSwJMCwJIlNIVUZQU3JyaSIsIDB8KDE8PFRJRDo6Q29udmVydGlibGVUbzNBZGRyKSwgMHhjNjQwMjEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81MiB9LCAgLy8gSW5zdCAjMjMyOCA9IFNIVUZQU3JyaQ0KKyAgeyAyMzI5LAk1LAkxLAkwLAkiU0lEVG0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDAwMTE5VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMzI5ID0gU0lEVG0NCisgIHsgMjMzMCwJMCwJMCwJMCwJIlNJTl9GIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmUwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIzMzAgPSBTSU5fRg0KKyAgeyAyMzMxLAkyLAkxLAkwLAkiU0lOX0ZwMzIiLCAwLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzcgfSwgIC8vIEluc3QgIzIzMzEgPSBTSU5fRnAzMg0KKyAgeyAyMzMyLAkyLAkxLAkwLAkiU0lOX0ZwNjQiLCAwLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzggfSwgIC8vIEluc3QgIzIzMzIgPSBTSU5fRnA2NA0KKyAgeyAyMzMzLAkyLAkxLAkwLAkiU0lOX0ZwODAiLCAwLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkgfSwgIC8vIEluc3QgIzIzMzMgPSBTSU5fRnA4MA0KKyAgeyAyMzM0LAk1LAkxLAkwLAkiU0xEVDE2bSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDExOFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjMzNCA9IFNMRFQxNm0NCisgIHsgMjMzNSwJMSwJMSwJMCwJIlNMRFQxNnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMTBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA0IH0sICAvLyBJbnN0ICMyMzM1ID0gU0xEVDE2cg0KKyAgeyAyMzM2LAk1LAkxLAkwLAkiU0xEVDY0bSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDExMThVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIzMzYgPSBTTERUNjRtDQorICB7IDIzMzcsCTEsCTEsCTAsCSJTTERUNjRyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTExMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NSB9LCAgLy8gSW5zdCAjMjMzNyA9IFNMRFQ2NHINCisgIHsgMjMzOCwJNSwJMSwJMCwJIlNNU1cxNm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDAwMTFjVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMzM4ID0gU01TVzE2bQ0KKyAgeyAyMzM5LAkxLAkxLAkwLAkiU01TVzE2ciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwMDAxNTRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA0IH0sICAvLyBJbnN0ICMyMzM5ID0gU01TVzE2cg0KKyAgeyAyMzQwLAkxLAkxLAkwLAkiU01TVzMyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwMDAxMTRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjQgfSwgIC8vIEluc3QgIzIzNDAgPSBTTVNXMzJyDQorICB7IDIzNDEsCTEsCTEsCTAsCSJTTVNXNjRyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTAwMTExNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NSB9LCAgLy8gSW5zdCAjMjM0MSA9IFNNU1c2NHINCisgIHsgMjM0MiwJNiwJMSwJMCwJIlNRUlRQRG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUxODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyMzQyID0gU1FSVFBEbQ0KKyAgeyAyMzQzLAk2LAkxLAkwLAkiU1FSVFBEbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUxODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyMzQzID0gU1FSVFBEbV9JbnQNCisgIHsgMjM0NCwJMiwJMSwJMCwJIlNRUlRQRHIiLCAwLCAweDUxODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyMzQ0ID0gU1FSVFBEcg0KKyAgeyAyMzQ1LAkyLAkxLAkwLAkiU1FSVFBEcl9JbnQiLCAwLCAweDUxODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyMzQ1ID0gU1FSVFBEcl9JbnQNCisgIHsgMjM0NiwJNiwJMSwJMCwJIlNRUlRQU20iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUxNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyMzQ2ID0gU1FSVFBTbQ0KKyAgeyAyMzQ3LAk2LAkxLAkwLAkiU1FSVFBTbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUxNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyMzQ3ID0gU1FSVFBTbV9JbnQNCisgIHsgMjM0OCwJMiwJMSwJMCwJIlNRUlRQU3IiLCAwLCAweDUxNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyMzQ4ID0gU1FSVFBTcg0KKyAgeyAyMzQ5LAkyLAkxLAkwLAkiU1FSVFBTcl9JbnQiLCAwLCAweDUxNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyMzQ5ID0gU1FSVFBTcl9JbnQNCisgIHsgMjM1MCwJNiwJMSwJMCwJIlNRUlRTRG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUxMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkyIH0sICAvLyBJbnN0ICMyMzUwID0gU1FSVFNEbQ0KKyAgeyAyMzUxLAk2LAkxLAkwLAkiU1FSVFNEbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUxMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyMzUxID0gU1FSVFNEbV9JbnQNCisgIHsgMjM1MiwJMiwJMSwJMCwJIlNRUlRTRHIiLCAwLCAweDUxMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExNiB9LCAgLy8gSW5zdCAjMjM1MiA9IFNRUlRTRHINCisgIHsgMjM1MywJMiwJMSwJMCwJIlNRUlRTRHJfSW50IiwgMCwgMHg1MTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjM1MyA9IFNRUlRTRHJfSW50DQorICB7IDIzNTQsCTYsCTEsCTAsCSJTUVJUU1NtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MTAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85MCB9LCAgLy8gSW5zdCAjMjM1NCA9IFNRUlRTU20NCisgIHsgMjM1NSwJNiwJMSwJMCwJIlNRUlRTU21fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MTAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjM1NSA9IFNRUlRTU21fSW50DQorICB7IDIzNTYsCTIsCTEsCTAsCSJTUVJUU1NyIiwgMCwgMHg1MTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTcgfSwgIC8vIEluc3QgIzIzNTYgPSBTUVJUU1NyDQorICB7IDIzNTcsCTIsCTEsCTAsCSJTUVJUU1NyX0ludCIsIDAsIDB4NTEwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzIzNTcgPSBTUVJUU1NyX0ludA0KKyAgeyAyMzU4LAkwLAkwLAkwLAkiU1FSVF9GIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmEwMDA0MDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIzNTggPSBTUVJUX0YNCisgIHsgMjM1OSwJMiwJMSwJMCwJIlNRUlRfRnAzMiIsIDAsIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNyB9LCAgLy8gSW5zdCAjMjM1OSA9IFNRUlRfRnAzMg0KKyAgeyAyMzYwLAkyLAkxLAkwLAkiU1FSVF9GcDY0IiwgMCwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm84IH0sICAvLyBJbnN0ICMyMzYwID0gU1FSVF9GcDY0DQorICB7IDIzNjEsCTIsCTEsCTAsCSJTUVJUX0ZwODAiLCAwLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzkgfSwgIC8vIEluc3QgIzIzNjEgPSBTUVJUX0ZwODANCisgIHsgMjM2MiwJMCwJMCwJMCwJIlNTX1BSRUZJWCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDM2MDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMzYyID0gU1NfUFJFRklYDQorICB7IDIzNjMsCTAsCTAsCTAsCSJTVEMiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmOTAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjM2MyA9IFNUQw0KKyAgeyAyMzY0LAkwLAkwLAkwLAkiU1REIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZmQwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIzNjQgPSBTVEQNCisgIHsgMjM2NSwJMCwJMCwJMCwJIlNUSSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZiMDAwMDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMzY1ID0gU1RJDQorICB7IDIzNjYsCTUsCTAsCTAsCSJTVE1YQ1NSIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFlNDAwMTFiVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMzY2ID0gU1RNWENTUg0KKyAgeyAyMzY3LAkwLAkwLAkwLAkiU1RPU0IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhYTAwMDAwMVVMTCwgSW1wbGljaXRMaXN0NTQsIEltcGxpY2l0TGlzdDM0LCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMzY3ID0gU1RPU0INCisgIHsgMjM2OCwJMCwJMCwJMCwJIlNUT1NEIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YWIwMDAwMDFVTEwsIEltcGxpY2l0TGlzdDU1LCBJbXBsaWNpdExpc3QzNCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjM2OCA9IFNUT1NEDQorICB7IDIzNjksCTAsCTAsCTAsCSJTVE9TUSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGFiMDAxMDAxVUxMLCBJbXBsaWNpdExpc3Q1NiwgSW1wbGljaXRMaXN0NTIsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzIzNjkgPSBTVE9TUQ0KKyAgeyAyMzcwLAkwLAkwLAkwLAkiU1RPU1ciLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhYjAwMDA0MVVMTCwgSW1wbGljaXRMaXN0NTcsIEltcGxpY2l0TGlzdDM0LCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyMzcwID0gU1RPU1cNCisgIHsgMjM3MSwJNSwJMSwJMCwJIlNUUm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMTlVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIzNzEgPSBTVFJtDQorICB7IDIzNzIsCTEsCTEsCTAsCSJTVFJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTExVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNCB9LCAgLy8gSW5zdCAjMjM3MiA9IFNUUnINCisgIHsgMjM3MywJNSwJMCwJMCwJIlNUX0YzMm0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDkwMDAwMWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIzNzMgPSBTVF9GMzJtDQorICB7IDIzNzQsCTUsCTAsCTAsCSJTVF9GNjRtIiwgMHwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRkMDAwMDFhVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyMzc0ID0gU1RfRjY0bQ0KKyAgeyAyMzc1LAk1LAkwLAkwLAkiU1RfRlAzMm0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDkwMDAwMWJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIzNzUgPSBTVF9GUDMybQ0KKyAgeyAyMzc2LAk1LAkwLAkwLAkiU1RfRlA2NG0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGQwMDAwMWJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIzNzYgPSBTVF9GUDY0bQ0KKyAgeyAyMzc3LAk1LAkwLAkwLAkiU1RfRlA4MG0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGIwMDAwMWZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzIzNzcgPSBTVF9GUDgwbQ0KKyAgeyAyMzc4LAkxLAkwLAkwLAkiU1RfRlByciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQ4MDAwODAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICMyMzc4ID0gU1RfRlBycg0KKyAgeyAyMzc5LAk2LAkwLAkwLAkiU1RfRnAzMm0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDggfSwgIC8vIEluc3QgIzIzNzkgPSBTVF9GcDMybQ0KKyAgeyAyMzgwLAk2LAkwLAkwLAkiU1RfRnA2NG0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDkgfSwgIC8vIEluc3QgIzIzODAgPSBTVF9GcDY0bQ0KKyAgeyAyMzgxLAk2LAkwLAkwLAkiU1RfRnA2NG0zMiIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDIwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwOSB9LCAgLy8gSW5zdCAjMjM4MSA9IFNUX0ZwNjRtMzINCisgIHsgMjM4MiwJNiwJMCwJMCwJIlNUX0ZwODBtMzIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzIzODIgPSBTVF9GcDgwbTMyDQorICB7IDIzODMsCTYsCTAsCTAsCSJTVF9GcDgwbTY0IiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MjAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTEwIH0sICAvLyBJbnN0ICMyMzgzID0gU1RfRnA4MG02NA0KKyAgeyAyMzg0LAk2LAkwLAkwLAkiU1RfRnBQMzJtIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MjAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA4IH0sICAvLyBJbnN0ICMyMzg0ID0gU1RfRnBQMzJtDQorICB7IDIzODUsCTYsCTAsCTAsCSJTVF9GcFA2NG0iLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDkgfSwgIC8vIEluc3QgIzIzODUgPSBTVF9GcFA2NG0NCisgIHsgMjM4NiwJNiwJMCwJMCwJIlNUX0ZwUDY0bTMyIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MjAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA5IH0sICAvLyBJbnN0ICMyMzg2ID0gU1RfRnBQNjRtMzINCisgIHsgMjM4NywJNiwJMCwJMCwJIlNUX0ZwUDgwbSIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDIwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExMCB9LCAgLy8gSW5zdCAjMjM4NyA9IFNUX0ZwUDgwbQ0KKyAgeyAyMzg4LAk2LAkwLAkwLAkiU1RfRnBQODBtMzIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzIzODggPSBTVF9GcFA4MG0zMg0KKyAgeyAyMzg5LAk2LAkwLAkwLAkiU1RfRnBQODBtNjQiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTAgfSwgIC8vIEluc3QgIzIzODkgPSBTVF9GcFA4MG02NA0KKyAgeyAyMzkwLAkxLAkwLAkwLAkiU1RfRnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDAwMDA4MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzIzOTAgPSBTVF9GcnINCisgIHsgMjM5MSwJMSwJMCwJMCwJIlNVQjE2aTE2IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MmQwMDYwNDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMyMzkxID0gU1VCMTZpMTYNCisgIHsgMjM5MiwJNiwJMCwJMCwJIlNVQjE2bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MTAwNjA1ZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMzkyID0gU1VCMTZtaQ0KKyAgeyAyMzkzLAk2LAkwLAkwLAkiU1VCMTZtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MzAwMjA1ZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyMzkzID0gU1VCMTZtaTgNCisgIHsgMjM5NCwJNiwJMCwJMCwJIlNVQjE2bXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyOTAwMDA0NFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzExIH0sICAvLyBJbnN0ICMyMzk0ID0gU1VCMTZtcg0KKyAgeyAyMzk1LAkzLAkxLAkwLAkiU1VCMTZyaSIsIDAsIDB4ODEwMDYwNTVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMiB9LCAgLy8gSW5zdCAjMjM5NSA9IFNVQjE2cmkNCisgIHsgMjM5NiwJMywJMSwJMCwJIlNVQjE2cmk4IiwgMCwgMHg4MzAwMjA1NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEyIH0sICAvLyBJbnN0ICMyMzk2ID0gU1VCMTZyaTgNCisgIHsgMjM5NywJNywJMSwJMCwJIlNVQjE2cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJiMDAwMDQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTMgfSwgIC8vIEluc3QgIzIzOTcgPSBTVUIxNnJtDQorICB7IDIzOTgsCTMsCTEsCTAsCSJTVUIxNnJyIiwgMCwgMHgyOTAwMDA0M1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMyMzk4ID0gU1VCMTZycg0KKyAgeyAyMzk5LAkzLAkxLAkwLAkiU1VCMTZycl9SRVYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyYjAwMDA0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE0IH0sICAvLyBJbnN0ICMyMzk5ID0gU1VCMTZycl9SRVYNCisgIHsgMjQwMCwJMSwJMCwJMCwJIlNVQjMyaTMyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MmQwMGEwMDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMyNDAwID0gU1VCMzJpMzINCisgIHsgMjQwMSwJNiwJMCwJMCwJIlNVQjMybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MTAwYTAxZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyNDAxID0gU1VCMzJtaQ0KKyAgeyAyNDAyLAk2LAkwLAkwLAkiU1VCMzJtaTgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MzAwMjAxZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyNDAyID0gU1VCMzJtaTgNCisgIHsgMjQwMywJNiwJMCwJMCwJIlNVQjMybXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyOTAwMDAwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMyNDAzID0gU1VCMzJtcg0KKyAgeyAyNDA0LAkzLAkxLAkwLAkiU1VCMzJyaSIsIDAsIDB4ODEwMGEwMTVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjMjQwNCA9IFNVQjMycmkNCisgIHsgMjQwNSwJMywJMSwJMCwJIlNVQjMycmk4IiwgMCwgMHg4MzAwMjAxNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE2IH0sICAvLyBJbnN0ICMyNDA1ID0gU1VCMzJyaTgNCisgIHsgMjQwNiwJNywJMSwJMCwJIlNVQjMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDJiMDAwMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTcgfSwgIC8vIEluc3QgIzI0MDYgPSBTVUIzMnJtDQorICB7IDI0MDcsCTMsCTEsCTAsCSJTVUIzMnJyIiwgMCwgMHgyOTAwMDAwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICMyNDA3ID0gU1VCMzJycg0KKyAgeyAyNDA4LAkzLAkxLAkwLAkiU1VCMzJycl9SRVYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgyYjAwMDAwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE4IH0sICAvLyBJbnN0ICMyNDA4ID0gU1VCMzJycl9SRVYNCisgIHsgMjQwOSwJMSwJMCwJMCwJIlNVQjY0aTMyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MmQwMGIwMDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMyNDA5ID0gU1VCNjRpMzINCisgIHsgMjQxMCwJNiwJMCwJMCwJIlNVQjY0bWkzMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgxMDBiMDFkVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzI0MTAgPSBTVUI2NG1pMzINCisgIHsgMjQxMSwJNiwJMCwJMCwJIlNVQjY0bWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODMwMDMwMWRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjQxMSA9IFNVQjY0bWk4DQorICB7IDI0MTIsCTYsCTAsCTAsCSJTVUI2NG1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4MjkwMDEwMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOSB9LCAgLy8gSW5zdCAjMjQxMiA9IFNVQjY0bXINCisgIHsgMjQxMywJMywJMSwJMCwJIlNVQjY0cmkzMiIsIDAsIDB4ODEwMGIwMTVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMCB9LCAgLy8gSW5zdCAjMjQxMyA9IFNVQjY0cmkzMg0KKyAgeyAyNDE0LAkzLAkxLAkwLAkiU1VCNjRyaTgiLCAwLCAweDgzMDAzMDE1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjAgfSwgIC8vIEluc3QgIzI0MTQgPSBTVUI2NHJpOA0KKyAgeyAyNDE1LAk3LAkxLAkwLAkiU1VCNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmIwMDEwMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMSB9LCAgLy8gSW5zdCAjMjQxNSA9IFNVQjY0cm0NCisgIHsgMjQxNiwJMywJMSwJMCwJIlNVQjY0cnIiLCAwLCAweDI5MDAxMDAzVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzI0MTYgPSBTVUI2NHJyDQorICB7IDI0MTcsCTMsCTEsCTAsCSJTVUI2NHJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDJiMDAxMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzI0MTcgPSBTVUI2NHJyX1JFVg0KKyAgeyAyNDE4LAkxLAkwLAkwLAkiU1VCOGk4IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MmMwMDIwMDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMyNDE4ID0gU1VCOGk4DQorICB7IDI0MTksCTYsCTAsCTAsCSJTVUI4bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MDAwMjAxZFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMyNDE5ID0gU1VCOG1pDQorICB7IDI0MjAsCTYsCTAsCTAsCSJTVUI4bXIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgyODAwMDAwNFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI0IH0sICAvLyBJbnN0ICMyNDIwID0gU1VCOG1yDQorICB7IDI0MjEsCTMsCTEsCTAsCSJTVUI4cmkiLCAwLCAweDgwMDAyMDE1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjUgfSwgIC8vIEluc3QgIzI0MjEgPSBTVUI4cmkNCisgIHsgMjQyMiwJNywJMSwJMCwJIlNVQjhybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmEwMDAwMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNiB9LCAgLy8gSW5zdCAjMjQyMiA9IFNVQjhybQ0KKyAgeyAyNDIzLAkzLAkxLAkwLAkiU1VCOHJyIiwgMCwgMHgyODAwMDAwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI3IH0sICAvLyBJbnN0ICMyNDIzID0gU1VCOHJyDQorICB7IDI0MjQsCTMsCTEsCTAsCSJTVUI4cnJfUkVWIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MmEwMDAwMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNyB9LCAgLy8gSW5zdCAjMjQyNCA9IFNVQjhycl9SRVYNCisgIHsgMjQyNSwJNywJMSwJMCwJIlNVQlBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVjODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMyNDI1ID0gU1VCUERybQ0KKyAgeyAyNDI2LAkzLAkxLAkwLAkiU1VCUERyciIsIDAsIDB4NWM4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzI0MjYgPSBTVUJQRHJyDQorICB7IDI0MjcsCTcsCTEsCTAsCSJTVUJQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMjQyNyA9IFNVQlBTcm0NCisgIHsgMjQyOCwJMywJMSwJMCwJIlNVQlBTcnIiLCAwLCAweDVjNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMyNDI4ID0gU1VCUFNycg0KKyAgeyAyNDI5LAk1LAkwLAkwLAkiU1VCUl9GMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDgwMDAwMWRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzI0MjkgPSBTVUJSX0YzMm0NCisgIHsgMjQzMCwJNSwJMCwJMCwJIlNVQlJfRjY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRjMDAwMDFkVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyNDMwID0gU1VCUl9GNjRtDQorICB7IDI0MzEsCTUsCTAsCTAsCSJTVUJSX0ZJMTZtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGUwMDAwMWRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzI0MzEgPSBTVUJSX0ZJMTZtDQorICB7IDI0MzIsCTUsCTAsCTAsCSJTVUJSX0ZJMzJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGEwMDAwMWRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzI0MzIgPSBTVUJSX0ZJMzJtDQorICB7IDI0MzMsCTEsCTAsCTAsCSJTVUJSX0ZQclNUMCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGUwMDAwOTAyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM1IH0sICAvLyBJbnN0ICMyNDMzID0gU1VCUl9GUHJTVDANCisgIHsgMjQzNCwJMSwJMCwJMCwJIlNVQlJfRlNUMHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlODAwMDMwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMjQzNCA9IFNVQlJfRlNUMHINCisgIHsgMjQzNSwJNywJMSwJMCwJIlNVQlJfRnAzMm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM3IH0sICAvLyBJbnN0ICMyNDM1ID0gU1VCUl9GcDMybQ0KKyAgeyAyNDM2LAk3LAkxLAkwLAkiU1VCUl9GcDY0bSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzkgfSwgIC8vIEluc3QgIzI0MzYgPSBTVUJSX0ZwNjRtDQorICB7IDI0MzcsCTcsCTEsCTAsCSJTVUJSX0ZwNjRtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICMyNDM3ID0gU1VCUl9GcDY0bTMyDQorICB7IDI0MzgsCTcsCTEsCTAsCSJTVUJSX0ZwODBtMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICMyNDM4ID0gU1VCUl9GcDgwbTMyDQorICB7IDI0MzksCTcsCTEsCTAsCSJTVUJSX0ZwODBtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQxIH0sICAvLyBJbnN0ICMyNDM5ID0gU1VCUl9GcDgwbTY0DQorICB7IDI0NDAsCTcsCTEsCTAsCSJTVUJSX0ZwSTE2bTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNyB9LCAgLy8gSW5zdCAjMjQ0MCA9IFNVQlJfRnBJMTZtMzINCisgIHsgMjQ0MSwJNywJMSwJMCwJIlNVQlJfRnBJMTZtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICMyNDQxID0gU1VCUl9GcEkxNm02NA0KKyAgeyAyNDQyLAk3LAkxLAkwLAkiU1VCUl9GcEkxNm04MCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDEgfSwgIC8vIEluc3QgIzI0NDIgPSBTVUJSX0ZwSTE2bTgwDQorICB7IDI0NDMsCTcsCTEsCTAsCSJTVUJSX0ZwSTMybTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNyB9LCAgLy8gSW5zdCAjMjQ0MyA9IFNVQlJfRnBJMzJtMzINCisgIHsgMjQ0NCwJNywJMSwJMCwJIlNVQlJfRnBJMzJtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICMyNDQ0ID0gU1VCUl9GcEkzMm02NA0KKyAgeyAyNDQ1LAk3LAkxLAkwLAkiU1VCUl9GcEkzMm04MCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDEgfSwgIC8vIEluc3QgIzI0NDUgPSBTVUJSX0ZwSTMybTgwDQorICB7IDI0NDYsCTEsCTAsCTAsCSJTVUJSX0ZyU1QwIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTAwMDA3MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzI0NDYgPSBTVUJSX0ZyU1QwDQorICB7IDI0NDcsCTcsCTEsCTAsCSJTVUJTRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMCB9LCAgLy8gSW5zdCAjMjQ0NyA9IFNVQlNEcm0NCisgIHsgMjQ0OCwJNywJMSwJMCwJIlNVQlNEcm1fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMjQ0OCA9IFNVQlNEcm1fSW50DQorICB7IDI0NDksCTMsCTEsCTAsCSJTVUJTRHJyIiwgMCwgMHg1YzAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMSB9LCAgLy8gSW5zdCAjMjQ0OSA9IFNVQlNEcnINCisgIHsgMjQ1MCwJMywJMSwJMCwJIlNVQlNEcnJfSW50IiwgMCwgMHg1YzAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMjQ1MCA9IFNVQlNEcnJfSW50DQorICB7IDI0NTEsCTcsCTEsCTAsCSJTVUJTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMiB9LCAgLy8gSW5zdCAjMjQ1MSA9IFNVQlNTcm0NCisgIHsgMjQ1MiwJNywJMSwJMCwJIlNVQlNTcm1fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMjQ1MiA9IFNVQlNTcm1fSW50DQorICB7IDI0NTMsCTMsCTEsCTAsCSJTVUJTU3JyIiwgMCwgMHg1YzAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zMyB9LCAgLy8gSW5zdCAjMjQ1MyA9IFNVQlNTcnINCisgIHsgMjQ1NCwJMywJMSwJMCwJIlNVQlNTcnJfSW50IiwgMCwgMHg1YzAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMjQ1NCA9IFNVQlNTcnJfSW50DQorICB7IDI0NTUsCTUsCTAsCTAsCSJTVUJfRjMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGQ4MDAwMDFjVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyNDU1ID0gU1VCX0YzMm0NCisgIHsgMjQ1NiwJNSwJMCwJMCwJIlNVQl9GNjRtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGMwMDAwMWNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzI0NTYgPSBTVUJfRjY0bQ0KKyAgeyAyNDU3LAk1LAkwLAkwLAkiU1VCX0ZJMTZtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZGUwMDAwMWNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzI0NTcgPSBTVUJfRkkxNm0NCisgIHsgMjQ1OCwJNSwJMCwJMCwJIlNVQl9GSTMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGRhMDAwMDFjVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyNDU4ID0gU1VCX0ZJMzJtDQorICB7IDI0NTksCTEsCTAsCTAsCSJTVUJfRlByU1QwIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTgwMDA5MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzI0NTkgPSBTVUJfRlByU1QwDQorICB7IDI0NjAsCTEsCTAsCTAsCSJTVUJfRlNUMHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlMDAwMDMwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMjQ2MCA9IFNVQl9GU1Qwcg0KKyAgeyAyNDYxLAkzLAkxLAkwLAkiU1VCX0ZwMzIiLCAwLCAweDQwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM2IH0sICAvLyBJbnN0ICMyNDYxID0gU1VCX0ZwMzINCisgIHsgMjQ2MiwJNywJMSwJMCwJIlNVQl9GcDMybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzcgfSwgIC8vIEluc3QgIzI0NjIgPSBTVUJfRnAzMm0NCisgIHsgMjQ2MywJMywJMSwJMCwJIlNVQl9GcDY0IiwgMCwgMHg0MDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zOCB9LCAgLy8gSW5zdCAjMjQ2MyA9IFNVQl9GcDY0DQorICB7IDI0NjQsCTcsCTEsCTAsCSJTVUJfRnA2NG0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM5IH0sICAvLyBJbnN0ICMyNDY0ID0gU1VCX0ZwNjRtDQorICB7IDI0NjUsCTcsCTEsCTAsCSJTVUJfRnA2NG0zMiIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzkgfSwgIC8vIEluc3QgIzI0NjUgPSBTVUJfRnA2NG0zMg0KKyAgeyAyNDY2LAkzLAkxLAkwLAkiU1VCX0ZwODAiLCAwLCAweDQwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQwIH0sICAvLyBJbnN0ICMyNDY2ID0gU1VCX0ZwODANCisgIHsgMjQ2NywJNywJMSwJMCwJIlNVQl9GcDgwbTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MSB9LCAgLy8gSW5zdCAjMjQ2NyA9IFNVQl9GcDgwbTMyDQorICB7IDI0NjgsCTcsCTEsCTAsCSJTVUJfRnA4MG02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDEgfSwgIC8vIEluc3QgIzI0NjggPSBTVUJfRnA4MG02NA0KKyAgeyAyNDY5LAk3LAkxLAkwLAkiU1VCX0ZwSTE2bTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNyB9LCAgLy8gSW5zdCAjMjQ2OSA9IFNVQl9GcEkxNm0zMg0KKyAgeyAyNDcwLAk3LAkxLAkwLAkiU1VCX0ZwSTE2bTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zOSB9LCAgLy8gSW5zdCAjMjQ3MCA9IFNVQl9GcEkxNm02NA0KKyAgeyAyNDcxLAk3LAkxLAkwLAkiU1VCX0ZwSTE2bTgwIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MSB9LCAgLy8gSW5zdCAjMjQ3MSA9IFNVQl9GcEkxNm04MA0KKyAgeyAyNDcyLAk3LAkxLAkwLAkiU1VCX0ZwSTMybTMyIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNyB9LCAgLy8gSW5zdCAjMjQ3MiA9IFNVQl9GcEkzMm0zMg0KKyAgeyAyNDczLAk3LAkxLAkwLAkiU1VCX0ZwSTMybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zOSB9LCAgLy8gSW5zdCAjMjQ3MyA9IFNVQl9GcEkzMm02NA0KKyAgeyAyNDc0LAk3LAkxLAkwLAkiU1VCX0ZwSTMybTgwIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MSB9LCAgLy8gSW5zdCAjMjQ3NCA9IFNVQl9GcEkzMm04MA0KKyAgeyAyNDc1LAkxLAkwLAkwLAkiU1VCX0ZyU1QwIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTgwMDA3MDJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzI0NzUgPSBTVUJfRnJTVDANCisgIHsgMjQ3NiwJMCwJMCwJMCwJIlNXQVBHUyIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwMDAxMjlVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzI0NzYgPSBTV0FQR1MNCisgIHsgMjQ3NywJMCwJMCwJMCwJIlNZU0NBTEwiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1MDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyNDc3ID0gU1lTQ0FMTA0KKyAgeyAyNDc4LAkwLAkwLAkwLAkiU1lTRU5URVIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzNDAwMDEwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjQ3OCA9IFNZU0VOVEVSDQorICB7IDI0NzksCTAsCTAsCTAsCSJTWVNFWElUIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzUwMDAxMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzI0NzkgPSBTWVNFWElUDQorICB7IDI0ODAsCTAsCTAsCTAsCSJTWVNFWElUNjQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzNTAwMTEwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjQ4MCA9IFNZU0VYSVQ2NA0KKyAgeyAyNDgxLAkwLAkwLAkwLAkiU1lTUkVUIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzAwMDEwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMjQ4MSA9IFNZU1JFVA0KKyAgeyAyNDgyLAkxLAkwLAkwLAkiVEFJTEpNUGQiLCAwfCgxPDxUSUQ6OlJldHVybil8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6Q2FsbCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VmFyaWFkaWMpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlOTAwYzAwMVVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0OSwgQmFycmllcnMzLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzI0ODIgPSBUQUlMSk1QZA0KKyAgeyAyNDgzLAkxLAkwLAkwLAkiVEFJTEpNUGQ2NCIsIDB8KDE8PFRJRDo6UmV0dXJuKXwoMTw8VElEOjpCYXJyaWVyKXwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpWYXJpYWRpYyl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGU5MDBjMDAxVUxMLCBJbXBsaWNpdExpc3Q0LCBJbXBsaWNpdExpc3QxMCwgQmFycmllcnM0LCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzI0ODMgPSBUQUlMSk1QZDY0DQorICB7IDI0ODQsCTUsCTAsCTAsCSJUQUlMSk1QbSIsIDB8KDE8PFRJRDo6UmV0dXJuKXwoMTw8VElEOjpCYXJyaWVyKXwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpWYXJpYWRpYyl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZmMDAwMDFjVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3Q5LCBCYXJyaWVyczMsIE9wZXJhbmRJbmZvMjE0IH0sICAvLyBJbnN0ICMyNDg0ID0gVEFJTEpNUG0NCisgIHsgMjQ4NSwJNSwJMCwJMCwJIlRBSUxKTVBtNjQiLCAwfCgxPDxUSUQ6OlJldHVybil8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6Q2FsbCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VmFyaWFkaWMpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmZjAwMDAxY1VMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0MTAsIEJhcnJpZXJzNCwgT3BlcmFuZEluZm8yMTUgfSwgIC8vIEluc3QgIzI0ODUgPSBUQUlMSk1QbTY0DQorICB7IDI0ODYsCTEsCTAsCTAsCSJUQUlMSk1QciIsIDB8KDE8PFRJRDo6UmV0dXJuKXwoMTw8VElEOjpCYXJyaWVyKXwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpUZXJtaW5hdG9yKXwoMTw8VElEOjpWYXJpYWRpYyl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGZmMDAwMDE0VUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3Q5LCBCYXJyaWVyczMsIE9wZXJhbmRJbmZvMjE2IH0sICAvLyBJbnN0ICMyNDg2ID0gVEFJTEpNUHINCisgIHsgMjQ4NywJMSwJMCwJMCwJIlRBSUxKTVByNjQiLCAwfCgxPDxUSUQ6OlJldHVybil8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6Q2FsbCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VmFyaWFkaWMpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhmZjAwMDAxNFVMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0MTAsIEJhcnJpZXJzNCwgT3BlcmFuZEluZm8yMTcgfSwgIC8vIEluc3QgIzI0ODcgPSBUQUlMSk1QcjY0DQorICB7IDI0ODgsCTIsCTAsCTAsCSJUQ1JFVFVSTmRpIiwgMHwoMTw8VElEOjpSZXR1cm4pfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OkNhbGwpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlZhcmlhZGljKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MFVMTCwgSW1wbGljaXRMaXN0MiwgSW1wbGljaXRMaXN0OSwgQmFycmllcnMzLCBPcGVyYW5kSW5mbzYgfSwgIC8vIEluc3QgIzI0ODggPSBUQ1JFVFVSTmRpDQorICB7IDI0ODksCTIsCTAsCTAsCSJUQ1JFVFVSTmRpNjQiLCAwfCgxPDxUSUQ6OlJldHVybil8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6Q2FsbCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VmFyaWFkaWMpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBJbXBsaWNpdExpc3Q0LCBJbXBsaWNpdExpc3QxMCwgQmFycmllcnM0LCBPcGVyYW5kSW5mbzYgfSwgIC8vIEluc3QgIzI0ODkgPSBUQ1JFVFVSTmRpNjQNCisgIHsgMjQ5MCwJNiwJMCwJMCwJIlRDUkVUVVJObWkiLCAwfCgxPDxUSUQ6OlJldHVybil8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6Q2FsbCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VmFyaWFkaWMpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3Q5LCBCYXJyaWVyczMsIE9wZXJhbmRJbmZvMjE4IH0sICAvLyBJbnN0ICMyNDkwID0gVENSRVRVUk5taQ0KKyAgeyAyNDkxLAk2LAkwLAkwLAkiVENSRVRVUk5taTY0IiwgMHwoMTw8VElEOjpSZXR1cm4pfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OkNhbGwpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlZhcmlhZGljKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MFVMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0MTAsIEJhcnJpZXJzNCwgT3BlcmFuZEluZm8yMTkgfSwgIC8vIEluc3QgIzI0OTEgPSBUQ1JFVFVSTm1pNjQNCisgIHsgMjQ5MiwJMiwJMCwJMCwJIlRDUkVUVVJOcmkiLCAwfCgxPDxUSUQ6OlJldHVybil8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6Q2FsbCl8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VmFyaWFkaWMpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3Q5LCBCYXJyaWVyczMsIE9wZXJhbmRJbmZvMjIwIH0sICAvLyBJbnN0ICMyNDkyID0gVENSRVRVUk5yaQ0KKyAgeyAyNDkzLAkyLAkwLAkwLAkiVENSRVRVUk5yaTY0IiwgMHwoMTw8VElEOjpSZXR1cm4pfCgxPDxUSUQ6OkJhcnJpZXIpfCgxPDxUSUQ6OkNhbGwpfCgxPDxUSUQ6OlRlcm1pbmF0b3IpfCgxPDxUSUQ6OlZhcmlhZGljKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MFVMTCwgSW1wbGljaXRMaXN0NCwgSW1wbGljaXRMaXN0MTAsIEJhcnJpZXJzNCwgT3BlcmFuZEluZm8yMjEgfSwgIC8vIEluc3QgIzI0OTMgPSBUQ1JFVFVSTnJpNjQNCisgIHsgMjQ5NCwJMSwJMCwJMCwJIlRFU1QxNmkxNiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGE5MDA2MDQxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMjQ5NCA9IFRFU1QxNmkxNg0KKyAgeyAyNDk1LAk2LAkwLAkwLAkiVEVTVDE2bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGY3MDA2MDU4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzI0OTUgPSBURVNUMTZtaQ0KKyAgeyAyNDk2LAkyLAkwLAkwLAkiVEVTVDE2cmkiLCAwLCAweGY3MDA2MDUwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNjEgfSwgIC8vIEluc3QgIzI0OTYgPSBURVNUMTZyaQ0KKyAgeyAyNDk3LAk2LAkwLAkwLAkiVEVTVDE2cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDg1MDAwMDQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTMgfSwgIC8vIEluc3QgIzI0OTcgPSBURVNUMTZybQ0KKyAgeyAyNDk4LAkyLAkwLAkwLAkiVEVTVDE2cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDg1MDAwMDQ1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTQgfSwgIC8vIEluc3QgIzI0OTggPSBURVNUMTZycg0KKyAgeyAyNDk5LAkxLAkwLAkwLAkiVEVTVDMyaTMyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YTkwMGEwMDFVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yIH0sICAvLyBJbnN0ICMyNDk5ID0gVEVTVDMyaTMyDQorICB7IDI1MDAsCTYsCTAsCTAsCSJURVNUMzJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZjcwMGEwMThVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMjUwMCA9IFRFU1QzMm1pDQorICB7IDI1MDEsCTIsCTAsCTAsCSJURVNUMzJyaSIsIDAsIDB4ZjcwMGEwMTBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm82MiB9LCAgLy8gSW5zdCAjMjUwMSA9IFRFU1QzMnJpDQorICB7IDI1MDIsCTYsCTAsCTAsCSJURVNUMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ODUwMDAwMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NSB9LCAgLy8gSW5zdCAjMjUwMiA9IFRFU1QzMnJtDQorICB7IDI1MDMsCTIsCTAsCTAsCSJURVNUMzJyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4ODUwMDAwMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm81NiB9LCAgLy8gSW5zdCAjMjUwMyA9IFRFU1QzMnJyDQorICB7IDI1MDQsCTEsCTAsCTAsCSJURVNUNjRpMzIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhhOTAwYjAwMVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzI1MDQgPSBURVNUNjRpMzINCisgIHsgMjUwNSwJNiwJMCwJMCwJIlRFU1Q2NG1pMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGY3MDBiMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzI1MDUgPSBURVNUNjRtaTMyDQorICB7IDI1MDYsCTIsCTAsCTAsCSJURVNUNjRyaTMyIiwgMCwgMHhmNzAwYjAxMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzYzIH0sICAvLyBJbnN0ICMyNTA2ID0gVEVTVDY0cmkzMg0KKyAgeyAyNTA3LAk2LAkwLAkwLAkiVEVTVDY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDg1MDAxMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTcgfSwgIC8vIEluc3QgIzI1MDcgPSBURVNUNjRybQ0KKyAgeyAyNTA4LAkyLAkwLAkwLAkiVEVTVDY0cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDg1MDAxMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNTggfSwgIC8vIEluc3QgIzI1MDggPSBURVNUNjRycg0KKyAgeyAyNTA5LAkxLAkwLAkwLAkiVEVTVDhpOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGE4MDAyMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMjUwOSA9IFRFU1Q4aTgNCisgIHsgMjUxMCwJNiwJMCwJMCwJIlRFU1Q4bWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGY2MDAyMDE4VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzI1MTAgPSBURVNUOG1pDQorICB7IDI1MTEsCTIsCTAsCTAsCSJURVNUOHJpIiwgMCwgMHhmNjAwMjAxMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzc5IH0sICAvLyBJbnN0ICMyNTExID0gVEVTVDhyaQ0KKyAgeyAyNTEyLAk2LAkwLAkwLAkiVEVTVDhybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ODQwMDAwMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm84MCB9LCAgLy8gSW5zdCAjMjUxMiA9IFRFU1Q4cm0NCisgIHsgMjUxMywJMiwJMCwJMCwJIlRFU1Q4cnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDg0MDAwMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvODEgfSwgIC8vIEluc3QgIzI1MTMgPSBURVNUOHJyDQorICB7IDI1MTQsCTUsCTAsCTAsCSJUTFNDYWxsXzMyIiwgMHwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDBVTEwsIEltcGxpY2l0TGlzdDIsIEltcGxpY2l0TGlzdDU4LCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyNTE0ID0gVExTQ2FsbF8zMg0KKyAgeyAyNTE1LAk1LAkwLAkwLAkiVExTQ2FsbF82NCIsIDB8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgwVUxMLCBJbXBsaWNpdExpc3QzNSwgSW1wbGljaXRMaXN0MTUsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzI1MTUgPSBUTFNDYWxsXzY0DQorICB7IDI1MTYsCTUsCTAsCTAsCSJUTFNfYWRkcjMyIiwgMCwgMHgwVUxMLCBJbXBsaWNpdExpc3QyLCBJbXBsaWNpdExpc3Q5LCBCYXJyaWVyczMsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzI1MTYgPSBUTFNfYWRkcjMyDQorICB7IDI1MTcsCTUsCTAsCTAsCSJUTFNfYWRkcjY0IiwgMCwgMHgwVUxMLCBJbXBsaWNpdExpc3Q0LCBJbXBsaWNpdExpc3QxMCwgQmFycmllcnM0LCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyNTE3ID0gVExTX2FkZHI2NA0KKyAgeyAyNTE4LAkwLAkwLAkwLAkiVFJBUCIsIDB8KDE8PFRJRDo6QmFycmllcil8KDE8PFRJRDo6VGVybWluYXRvcil8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGIwMDAxMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzI1MTggPSBUUkFQDQorICB7IDI1MTksCTAsCTAsCTAsCSJUU1RfRiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGU0MDAwNDAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyNTE5ID0gVFNUX0YNCisgIHsgMjUyMCwJMSwJMCwJMCwJIlRTVF9GcDMyIiwgMCwgMHgyMDAwMFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMTEgfSwgIC8vIEluc3QgIzI1MjAgPSBUU1RfRnAzMg0KKyAgeyAyNTIxLAkxLAkwLAkwLAkiVFNUX0ZwNjQiLCAwLCAweDIwMDAwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExMiB9LCAgLy8gSW5zdCAjMjUyMSA9IFRTVF9GcDY0DQorICB7IDI1MjIsCTEsCTAsCTAsCSJUU1RfRnA4MCIsIDAsIDB4MjAwMDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTEzIH0sICAvLyBJbnN0ICMyNTIyID0gVFNUX0ZwODANCisgIHsgMjUyMywJNiwJMCwJMCwJIlVDT01JU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MmU4MDAxNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm85MiB9LCAgLy8gSW5zdCAjMjUyMyA9IFVDT01JU0RybQ0KKyAgeyAyNTI0LAkyLAkwLAkwLAkiVUNPTUlTRHJyIiwgMCwgMHgyZTgwMDE0NVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzExNiB9LCAgLy8gSW5zdCAjMjUyNCA9IFVDT01JU0Rycg0KKyAgeyAyNTI1LAk2LAkwLAkwLAkiVUNPTUlTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgyZTQwMDEwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzkwIH0sICAvLyBJbnN0ICMyNTI1ID0gVUNPTUlTU3JtDQorICB7IDI1MjYsCTIsCTAsCTAsCSJVQ09NSVNTcnIiLCAwLCAweDJlNDAwMTA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTE3IH0sICAvLyBJbnN0ICMyNTI2ID0gVUNPTUlTU3JyDQorICB7IDI1MjcsCTEsCTAsCTAsCSJVQ09NX0ZJUHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlODAwMGEwMlVMTCwgSW1wbGljaXRMaXN0MjMsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMjUyNyA9IFVDT01fRklQcg0KKyAgeyAyNTI4LAkxLAkwLAkwLAkiVUNPTV9GSXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlODAwMDYwMlVMTCwgSW1wbGljaXRMaXN0MjMsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMjUyOCA9IFVDT01fRklyDQorICB7IDI1MjksCTAsCTAsCTAsCSJVQ09NX0ZQUHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlOTAwMDUwMVVMTCwgSW1wbGljaXRMaXN0MjMsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgMCB9LCAgLy8gSW5zdCAjMjUyOSA9IFVDT01fRlBQcg0KKyAgeyAyNTMwLAkxLAkwLAkwLAkiVUNPTV9GUHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhlODAwMDgwMlVMTCwgSW1wbGljaXRMaXN0MjMsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMjUzMCA9IFVDT01fRlByDQorICB7IDI1MzEsCTIsCTAsCTAsCSJVQ09NX0ZwSXIzMiIsIDAsIDB4NTAwMDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm83IH0sICAvLyBJbnN0ICMyNTMxID0gVUNPTV9GcElyMzINCisgIHsgMjUzMiwJMiwJMCwJMCwJIlVDT01fRnBJcjY0IiwgMCwgMHg1MDAwMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzggfSwgIC8vIEluc3QgIzI1MzIgPSBVQ09NX0ZwSXI2NA0KKyAgeyAyNTMzLAkyLAkwLAkwLAkiVUNPTV9GcElyODAiLCAwLCAweDUwMDAwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvOSB9LCAgLy8gSW5zdCAjMjUzMyA9IFVDT01fRnBJcjgwDQorICB7IDI1MzQsCTIsCTAsCTAsCSJVQ09NX0ZwcjMyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTAwMDBVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm83IH0sICAvLyBJbnN0ICMyNTM0ID0gVUNPTV9GcHIzMg0KKyAgeyAyNTM1LAkyLAkwLAkwLAkiVUNPTV9GcHI2NCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUwMDAwVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvOCB9LCAgLy8gSW5zdCAjMjUzNSA9IFVDT01fRnByNjQNCisgIHsgMjUzNiwJMiwJMCwJMCwJIlVDT01fRnByODAiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1MDAwMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzkgfSwgIC8vIEluc3QgIzI1MzYgPSBVQ09NX0ZwcjgwDQorICB7IDI1MzcsCTEsCTAsCTAsCSJVQ09NX0ZyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZTAwMDA4MDJVTEwsIEltcGxpY2l0TGlzdDIzLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMzUgfSwgIC8vIEluc3QgIzI1MzcgPSBVQ09NX0ZyDQorICB7IDI1MzgsCTcsCTEsCTAsCSJVTlBDS0hQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMjUzOCA9IFVOUENLSFBEcm0NCisgIHsgMjUzOSwJMywJMSwJMCwJIlVOUENLSFBEcnIiLCAwLCAweDE1ODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMyNTM5ID0gVU5QQ0tIUERycg0KKyAgeyAyNTQwLAk3LAkxLAkwLAkiVU5QQ0tIUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTU0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzI1NDAgPSBVTlBDS0hQU3JtDQorICB7IDI1NDEsCTMsCTEsCTAsCSJVTlBDS0hQU3JyIiwgMCwgMHgxNTQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMjU0MSA9IFVOUENLSFBTcnINCisgIHsgMjU0MiwJNywJMSwJMCwJIlVOUENLTFBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE0ODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI4IH0sICAvLyBJbnN0ICMyNTQyID0gVU5QQ0tMUERybQ0KKyAgeyAyNTQzLAkzLAkxLAkwLAkiVU5QQ0tMUERyciIsIDAsIDB4MTQ4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjkgfSwgIC8vIEluc3QgIzI1NDMgPSBVTlBDS0xQRHJyDQorICB7IDI1NDQsCTcsCTEsCTAsCSJVTlBDS0xQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNDQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMjU0NCA9IFVOUENLTFBTcm0NCisgIHsgMjU0NSwJMywJMSwJMCwJIlVOUENLTFBTcnIiLCAwLCAweDE0NDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMyNTQ1ID0gVU5QQ0tMUFNycg0KKyAgeyAyNTQ2LAk3LAkxLAkwLAkiVkFERFBEWXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTg4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMyNTQ2ID0gVkFERFBEWXJtDQorICB7IDI1NDcsCTMsCTEsCTAsCSJWQUREUERZcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU1ODgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI1NDcgPSBWQUREUERZcnINCisgIHsgMjU0OCwJNywJMSwJMCwJIlZBRERQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTg4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyNTQ4ID0gVkFERFBEcm0NCisgIHsgMjU0OSwJMywJMSwJMCwJIlZBRERQRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NTg4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyNTQ5ID0gVkFERFBEcnINCisgIHsgMjU1MCwJNywJMSwJMCwJIlZBRERQU1lybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTU4NDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjU1MCA9IFZBRERQU1lybQ0KKyAgeyAyNTUxLAkzLAkxLAkwLAkiVkFERFBTWXJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NTg0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyNTUxID0gVkFERFBTWXJyDQorICB7IDI1NTIsCTcsCTEsCTAsCSJWQUREUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTU4NDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjU1MiA9IFZBRERQU3JtDQorICB7IDI1NTMsCTMsCTEsCTAsCSJWQUREUFNyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTU4NDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjU1MyA9IFZBRERQU3JyDQorICB7IDI1NTQsCTcsCTEsCTAsCSJWQUREU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTU4MDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNCB9LCAgLy8gSW5zdCAjMjU1NCA9IFZBRERTRHJtDQorICB7IDI1NTUsCTcsCTEsCTAsCSJWQUREU0RybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ODAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI1NTUgPSBWQUREU0RybV9JbnQNCisgIHsgMjU1NiwJMywJMSwJMCwJIlZBRERTRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NTgwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI1IH0sICAvLyBJbnN0ICMyNTU2ID0gVkFERFNEcnINCisgIHsgMjU1NywJMywJMSwJMCwJIlZBRERTRHJyX0ludCIsIDAsIDB4NTU4MDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjU1NyA9IFZBRERTRHJyX0ludA0KKyAgeyAyNTU4LAk3LAkxLAkwLAkiVkFERFNTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ODAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjYgfSwgIC8vIEluc3QgIzI1NTggPSBWQUREU1NybQ0KKyAgeyAyNTU5LAk3LAkxLAkwLAkiVkFERFNTcm1fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTgwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyNTU5ID0gVkFERFNTcm1fSW50DQorICB7IDI1NjAsCTMsCTEsCTAsCSJWQUREU1NyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTU4MDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNyB9LCAgLy8gSW5zdCAjMjU2MCA9IFZBRERTU3JyDQorICB7IDI1NjEsCTMsCTEsCTAsCSJWQUREU1Nycl9JbnQiLCAwLCAweDU1ODAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI1NjEgPSBWQUREU1Nycl9JbnQNCisgIHsgMjU2MiwJNywJMSwJMCwJIlZBRERTVUJQRFlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQwODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjU2MiA9IFZBRERTVUJQRFlybQ0KKyAgeyAyNTYzLAkzLAkxLAkwLAkiVkFERFNVQlBEWXJyIiwgMCwgMHg1ZDA4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyNTYzID0gVkFERFNVQlBEWXJyDQorICB7IDI1NjQsCTcsCTEsCTAsCSJWQUREU1VCUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQwODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjU2NCA9IFZBRERTVUJQRHJtDQorICB7IDI1NjUsCTMsCTEsCTAsCSJWQUREU1VCUERyciIsIDAsIDB4NWQwODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjU2NSA9IFZBRERTVUJQRHJyDQorICB7IDI1NjYsCTcsCTEsCTAsCSJWQUREU1VCUFNZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVkMDgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI1NjYgPSBWQUREU1VCUFNZcm0NCisgIHsgMjU2NywJMywJMSwJMCwJIlZBRERTVUJQU1lyciIsIDAsIDB4NWQwODAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjU2NyA9IFZBRERTVUJQU1lycg0KKyAgeyAyNTY4LAk3LAkxLAkwLAkiVkFERFNVQlBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVkMDgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI1NjggPSBWQUREU1VCUFNybQ0KKyAgeyAyNTY5LAkzLAkxLAkwLAkiVkFERFNVQlBTcnIiLCAwLCAweDVkMDgwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI1NjkgPSBWQUREU1VCUFNycg0KKyAgeyAyNTcwLAk3LAkxLAkwLAkiVkFFU0RFQ0xBU1RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWRmYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjU3MCA9IFZBRVNERUNMQVNUcm0NCisgIHsgMjU3MSwJMywJMSwJMCwJIlZBRVNERUNMQVNUcnIiLCAwLCAweDVkZmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI1NzEgPSBWQUVTREVDTEFTVHJyDQorICB7IDI1NzIsCTcsCTEsCTAsCSJWQUVTREVDcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVkZWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI1NzIgPSBWQUVTREVDcm0NCisgIHsgMjU3MywJMywJMSwJMCwJIlZBRVNERUNyciIsIDAsIDB4NWRlYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjU3MyA9IFZBRVNERUNycg0KKyAgeyAyNTc0LAk3LAkxLAkwLAkiVkFFU0VOQ0xBU1RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWRkYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjU3NCA9IFZBRVNFTkNMQVNUcm0NCisgIHsgMjU3NSwJMywJMSwJMCwJIlZBRVNFTkNMQVNUcnIiLCAwLCAweDVkZGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI1NzUgPSBWQUVTRU5DTEFTVHJyDQorICB7IDI1NzYsCTcsCTEsCTAsCSJWQUVTRU5Dcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVkY2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI1NzYgPSBWQUVTRU5Dcm0NCisgIHsgMjU3NywJMywJMSwJMCwJIlZBRVNFTkNyciIsIDAsIDB4NWRjYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjU3NyA9IFZBRVNFTkNycg0KKyAgeyAyNTc4LAk2LAkxLAkwLAkiVkFFU0lNQ3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxZGJjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzI1NzggPSBWQUVTSU1Dcm0NCisgIHsgMjU3OSwJMiwJMSwJMCwJIlZBRVNJTUNyciIsIDAsIDB4MWRiYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyNTc5ID0gVkFFU0lNQ3JyDQorICB7IDI1ODAsCTcsCTEsCTAsCSJWQUVTS0VZR0VOQVNTSVNUMTI4cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDFkZmMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMjU4MCA9IFZBRVNLRVlHRU5BU1NJU1QxMjhybQ0KKyAgeyAyNTgxLAkzLAkxLAkwLAkiVkFFU0tFWUdFTkFTU0lTVDEyOHJyIiwgMCwgMHgxZGZjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzI1ODEgPSBWQUVTS0VZR0VOQVNTSVNUMTI4cnINCisgIHsgMjU4MiwJNywJMSwJMCwJIlZBTkROUERZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTU4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMyNTgyID0gVkFORE5QRFlybQ0KKyAgeyAyNTgzLAkzLAkxLAkwLAkiVkFORE5QRFlyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1NTgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI1ODMgPSBWQU5ETlBEWXJyDQorICB7IDI1ODQsCTcsCTEsCTAsCSJWQU5ETlBEcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTU4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyNTg0ID0gVkFORE5QRHJtDQorICB7IDI1ODUsCTMsCTEsCTAsCSJWQU5ETlBEcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTU4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyNTg1ID0gVkFORE5QRHJyDQorICB7IDI1ODYsCTcsCTEsCTAsCSJWQU5ETlBTWXJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU1NDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjU4NiA9IFZBTkROUFNZcm0NCisgIHsgMjU4NywJMywJMSwJMCwJIlZBTkROUFNZcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTU0MDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyNTg3ID0gVkFORE5QU1lycg0KKyAgeyAyNTg4LAk3LAkxLAkwLAkiVkFORE5QU3JtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU1NDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjU4OCA9IFZBTkROUFNybQ0KKyAgeyAyNTg5LAkzLAkxLAkwLAkiVkFORE5QU3JyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU1NDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjU4OSA9IFZBTkROUFNycg0KKyAgeyAyNTkwLAk3LAkxLAkwLAkiVkFORFBEWXJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU0ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjU5MCA9IFZBTkRQRFlybQ0KKyAgeyAyNTkxLAkzLAkxLAkwLAkiVkFORFBEWXJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU0ODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjU5MSA9IFZBTkRQRFlycg0KKyAgeyAyNTkyLAk3LAkxLAkwLAkiVkFORFBEcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTQ4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyNTkyID0gVkFORFBEcm0NCisgIHsgMjU5MywJMywJMSwJMCwJIlZBTkRQRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU0ODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjU5MyA9IFZBTkRQRHJyDQorICB7IDI1OTQsCTcsCTEsCTAsCSJWQU5EUFNZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTQ0MDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMyNTk0ID0gVkFORFBTWXJtDQorICB7IDI1OTUsCTMsCTEsCTAsCSJWQU5EUFNZcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTQ0MDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyNTk1ID0gVkFORFBTWXJyDQorICB7IDI1OTYsCTcsCTEsCTAsCSJWQU5EUFNybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1NDQwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI1OTYgPSBWQU5EUFNybQ0KKyAgeyAyNTk3LAkzLAkxLAkwLAkiVkFORFBTcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTQ0MDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyNTk3ID0gVkFORFBTcnINCisgIHsgMjU5OCwJMywJMCwJMCwJIlZBU1RBUlRfU0FWRV9YTU1fUkVHUyIsIDB8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKXwoMTw8VElEOjpWYXJpYWRpYyksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjggfSwgIC8vIEluc3QgIzI1OTggPSBWQVNUQVJUX1NBVkVfWE1NX1JFR1MNCisgIHsgMjU5OSwJOCwJMSwJMCwJIlZCTEVORFBEWXJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTBkYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyOSB9LCAgLy8gSW5zdCAjMjU5OSA9IFZCTEVORFBEWXJtaQ0KKyAgeyAyNjAwLAk0LAkxLAkwLAkiVkJMRU5EUERZcnJpIiwgMCwgMHg1MGRjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjMwIH0sICAvLyBJbnN0ICMyNjAwID0gVkJMRU5EUERZcnJpDQorICB7IDI2MDEsCTgsCTEsCTAsCSJWQkxFTkRQRHJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTBkYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMjYwMSA9IFZCTEVORFBEcm1pDQorICB7IDI2MDIsCTQsCTEsCTAsCSJWQkxFTkRQRHJyaSIsIDAsIDB4NTBkYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMyNjAyID0gVkJMRU5EUERycmkNCisgIHsgMjYwMywJOCwJMSwJMCwJIlZCTEVORFBTWXJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTBjYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyOSB9LCAgLy8gSW5zdCAjMjYwMyA9IFZCTEVORFBTWXJtaQ0KKyAgeyAyNjA0LAk0LAkxLAkwLAkiVkJMRU5EUFNZcnJpIiwgMCwgMHg1MGNjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjMwIH0sICAvLyBJbnN0ICMyNjA0ID0gVkJMRU5EUFNZcnJpDQorICB7IDI2MDUsCTgsCTEsCTAsCSJWQkxFTkRQU3JtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTBjYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMjYwNSA9IFZCTEVORFBTcm1pDQorICB7IDI2MDYsCTQsCTEsCTAsCSJWQkxFTkRQU3JyaSIsIDAsIDB4NTBjYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMyNjA2ID0gVkJMRU5EUFNycmkNCisgIHsgMjYwNywJOCwJMSwJMCwJIlZCTEVORFZQRFlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZDRiYzAwZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzMSB9LCAgLy8gSW5zdCAjMjYwNyA9IFZCTEVORFZQRFlybQ0KKyAgeyAyNjA4LAk0LAkxLAkwLAkiVkJMRU5EVlBEWXJyIiwgMCwgMHhkNGJjMDBlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjMyIH0sICAvLyBJbnN0ICMyNjA4ID0gVkJMRU5EVlBEWXJyDQorICB7IDI2MDksCTgsCTEsCTAsCSJWQkxFTkRWUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4ZDRiYzAwZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzMyB9LCAgLy8gSW5zdCAjMjYwOSA9IFZCTEVORFZQRHJtDQorICB7IDI2MTAsCTQsCTEsCTAsCSJWQkxFTkRWUERyciIsIDAsIDB4ZDRiYzAwZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzNCB9LCAgLy8gSW5zdCAjMjYxMCA9IFZCTEVORFZQRHJyDQorICB7IDI2MTEsCTgsCTEsCTAsCSJWQkxFTkRWUFNZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGQ0YWMwMGU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzEgfSwgIC8vIEluc3QgIzI2MTEgPSBWQkxFTkRWUFNZcm0NCisgIHsgMjYxMiwJNCwJMSwJMCwJIlZCTEVORFZQU1lyciIsIDAsIDB4ZDRhYzAwZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzMiB9LCAgLy8gSW5zdCAjMjYxMiA9IFZCTEVORFZQU1lycg0KKyAgeyAyNjEzLAk4LAkxLAkwLAkiVkJMRU5EVlBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweGQ0YWMwMGU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzMgfSwgIC8vIEluc3QgIzI2MTMgPSBWQkxFTkRWUFNybQ0KKyAgeyAyNjE0LAk0LAkxLAkwLAkiVkJMRU5EVlBTcnIiLCAwLCAweGQ0YWMwMGU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzQgfSwgIC8vIEluc3QgIzI2MTQgPSBWQkxFTkRWUFNycg0KKyAgeyAyNjE1LAk2LAkxLAkwLAkiVkJST0FEQ0FTVEYxMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDExYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzUgfSwgIC8vIEluc3QgIzI2MTUgPSBWQlJPQURDQVNURjEyOA0KKyAgeyAyNjE2LAk2LAkxLAkwLAkiVkJST0FEQ0FTVFNEIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMTljMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMyNjE2ID0gVkJST0FEQ0FTVFNEDQorICB7IDI2MTcsCTYsCTEsCTAsCSJWQlJPQURDQVNUU1MiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDExOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjYxNyA9IFZCUk9BRENBU1RTUw0KKyAgeyAyNjE4LAk2LAkxLAkwLAkiVkJST0FEQ0FTVFNTWSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTE4YzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzNSB9LCAgLy8gSW5zdCAjMjYxOCA9IFZCUk9BRENBU1RTU1kNCisgIHsgMjYxOSwJOCwJMSwJMCwJIlZDTVBQRFlybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVjMjgwMjA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjkgfSwgIC8vIEluc3QgIzI2MTkgPSBWQ01QUERZcm1pDQorICB7IDI2MjAsCTgsCTEsCTAsCSJWQ01QUERZcm1pX2FsdCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVjMjgwMjA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjkgfSwgIC8vIEluc3QgIzI2MjAgPSBWQ01QUERZcm1pX2FsdA0KKyAgeyAyNjIxLAk0LAkxLAkwLAkiVkNNUFBEWXJyaSIsIDAsIDB4NWMyODAyMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzMCB9LCAgLy8gSW5zdCAjMjYyMSA9IFZDTVBQRFlycmkNCisgIHsgMjYyMiwJNCwJMSwJMCwJIlZDTVBQRFlycmlfYWx0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWMyODAyMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzMCB9LCAgLy8gSW5zdCAjMjYyMiA9IFZDTVBQRFlycmlfYWx0DQorICB7IDI2MjMsCTgsCTEsCTAsCSJWQ01QUERybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVjMjgwMjA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzQgfSwgIC8vIEluc3QgIzI2MjMgPSBWQ01QUERybWkNCisgIHsgMjYyNCwJOCwJMSwJMCwJIlZDTVBQRHJtaV9hbHQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1YzI4MDIwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM0IH0sICAvLyBJbnN0ICMyNjI0ID0gVkNNUFBEcm1pX2FsdA0KKyAgeyAyNjI1LAk0LAkxLAkwLAkiVkNNUFBEcnJpIiwgMCwgMHg1YzI4MDIwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNzggfSwgIC8vIEluc3QgIzI2MjUgPSBWQ01QUERycmkNCisgIHsgMjYyNiwJNCwJMSwJMCwJIlZDTVBQRHJyaV9hbHQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1YzI4MDIwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNzggfSwgIC8vIEluc3QgIzI2MjYgPSBWQ01QUERycmlfYWx0DQorICB7IDI2MjcsCTgsCTEsCTAsCSJWQ01QUFNZcm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzI0MDIwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI5IH0sICAvLyBJbnN0ICMyNjI3ID0gVkNNUFBTWXJtaQ0KKyAgeyAyNjI4LAk4LAkxLAkwLAkiVkNNUFBTWXJtaV9hbHQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1YzI0MDIwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI5IH0sICAvLyBJbnN0ICMyNjI4ID0gVkNNUFBTWXJtaV9hbHQNCisgIHsgMjYyOSwJNCwJMSwJMCwJIlZDTVBQU1lycmkiLCAwLCAweDVjMjQwMjAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzAgfSwgIC8vIEluc3QgIzI2MjkgPSBWQ01QUFNZcnJpDQorICB7IDI2MzAsCTQsCTEsCTAsCSJWQ01QUFNZcnJpX2FsdCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVjMjQwMjAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzAgfSwgIC8vIEluc3QgIzI2MzAgPSBWQ01QUFNZcnJpX2FsdA0KKyAgeyAyNjMxLAk4LAkxLAkwLAkiVkNNUFBTcm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzI0MDIwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM0IH0sICAvLyBJbnN0ICMyNjMxID0gVkNNUFBTcm1pDQorICB7IDI2MzIsCTgsCTEsCTAsCSJWQ01QUFNybWlfYWx0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWMyNDAyMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMjYzMiA9IFZDTVBQU3JtaV9hbHQNCisgIHsgMjYzMywJNCwJMSwJMCwJIlZDTVBQU3JyaSIsIDAsIDB4NWMyNDAyMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMyNjMzID0gVkNNUFBTcnJpDQorICB7IDI2MzQsCTQsCTEsCTAsCSJWQ01QUFNycmlfYWx0IiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWMyNDAyMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMyNjM0ID0gVkNNUFBTcnJpX2FsdA0KKyAgeyAyNjM1LAk4LAkxLAkwLAkiVkNNUFNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVjMjAwMmIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzYgfSwgIC8vIEluc3QgIzI2MzUgPSBWQ01QU0RybQ0KKyAgeyAyNjM2LAk4LAkxLAkwLAkiVkNNUFNEcm1fYWx0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzIwMDJiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM2IH0sICAvLyBJbnN0ICMyNjM2ID0gVkNNUFNEcm1fYWx0DQorICB7IDI2MzcsCTQsCTEsCTAsCSJWQ01QU0RyciIsIDAsIDB4NWMyMDAyYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzcwIH0sICAvLyBJbnN0ICMyNjM3ID0gVkNNUFNEcnINCisgIHsgMjYzOCwJNCwJMSwJMCwJIlZDTVBTRHJyX2FsdCIsIDAsIDB4NWMyMDAyYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzcwIH0sICAvLyBJbnN0ICMyNjM4ID0gVkNNUFNEcnJfYWx0DQorICB7IDI2MzksCTgsCTEsCTAsCSJWQ01QU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWMyMDAyYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzNyB9LCAgLy8gSW5zdCAjMjYzOSA9IFZDTVBTU3JtDQorICB7IDI2NDAsCTgsCTEsCTAsCSJWQ01QU1NybV9hbHQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVjMjAwMmMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzcgfSwgIC8vIEluc3QgIzI2NDAgPSBWQ01QU1NybV9hbHQNCisgIHsgMjY0MSwJNCwJMSwJMCwJIlZDTVBTU3JyIiwgMCwgMHg1YzIwMDJjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjkgfSwgIC8vIEluc3QgIzI2NDEgPSBWQ01QU1Nycg0KKyAgeyAyNjQyLAk0LAkxLAkwLAkiVkNNUFNTcnJfYWx0IiwgMCwgMHg1YzIwMDJjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNjkgfSwgIC8vIEluc3QgIzI2NDIgPSBWQ01QU1Nycl9hbHQNCisgIHsgMjY0MywJNiwJMCwJMCwJIlZDT01JU0RybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEyZjgwMDA0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyNjQzID0gVkNPTUlTRHJtDQorICB7IDI2NDQsCTIsCTAsCTAsCSJWQ09NSVNEcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMmY4MDAwNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjY0NCA9IFZDT01JU0Rycg0KKyAgeyAyNjQ1LAk2LAkwLAkwLAkiVkNPTUlTU3JtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTJmNDAwMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzI2NDUgPSBWQ09NSVNTcm0NCisgIHsgMjY0NiwJMiwJMCwJMCwJIlZDT01JU1NyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEyZjQwMDAwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyNjQ2ID0gVkNPTUlTU3JyDQorICB7IDI2NDcsCTYsCTEsCTAsCSJWQ1ZURFEyUERZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZTY0MDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMyNjQ3ID0gVkNWVERRMlBEWXJtDQorICB7IDI2NDgsCTIsCTEsCTAsCSJWQ1ZURFEyUERZcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZTY0MDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM4IH0sICAvLyBJbnN0ICMyNjQ4ID0gVkNWVERRMlBEWXJyDQorICB7IDI2NDksCTYsCTEsCTAsCSJWQ1ZURFEyUERybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFlNjQwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjY0OSA9IFZDVlREUTJQRHJtDQorICB7IDI2NTAsCTIsCTEsCTAsCSJWQ1ZURFEyUERyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFlNjQwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjY1MCA9IFZDVlREUTJQRHJyDQorICB7IDI2NTEsCTYsCTEsCTAsCSJWQ1ZURFEyUFNZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNWI0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMyNjUxID0gVkNWVERRMlBTWXJtDQorICB7IDI2NTIsCTIsCTEsCTAsCSJWQ1ZURFEyUFNZcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNWI0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM5IH0sICAvLyBJbnN0ICMyNjUyID0gVkNWVERRMlBTWXJyDQorICB7IDI2NTMsCTYsCTEsCTAsCSJWQ1ZURFEyUFNybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YjQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjY1MyA9IFZDVlREUTJQU3JtDQorICB7IDI2NTQsCTIsCTEsCTAsCSJWQ1ZURFEyUFNyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YjQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjY1NCA9IFZDVlREUTJQU3JyDQorICB7IDI2NTUsCTIsCTEsCTAsCSJWQ1ZUUEQyRFFYcllyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MWU2ODAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI0MCB9LCAgLy8gSW5zdCAjMjY1NSA9IFZDVlRQRDJEUVhyWXINCisgIHsgMjY1NiwJNiwJMSwJMCwJIlZDVlRQRDJEUVhybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFlNjgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjY1NiA9IFZDVlRQRDJEUVhybQ0KKyAgeyAyNjU3LAkyLAkxLAkwLAkiVkNWVFBEMkRRWHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MWU2ODAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyNjU3ID0gVkNWVFBEMkRRWHJyDQorICB7IDI2NTgsCTYsCTEsCTAsCSJWQ1ZUUEQyRFFZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMWU2ODAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyNjU4ID0gVkNWVFBEMkRRWXJtDQorICB7IDI2NTksCTIsCTEsCTAsCSJWQ1ZUUEQyRFFZcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZTY4MDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjQwIH0sICAvLyBJbnN0ICMyNjU5ID0gVkNWVFBEMkRRWXJyDQorICB7IDI2NjAsCTIsCTEsCTAsCSJWQ1ZUUEQyRFFyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFlNjgwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjY2MCA9IFZDVlRQRDJEUXJyDQorICB7IDI2NjEsCTIsCTEsCTAsCSJWQ1ZUUEQyUFNYcllyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTVhODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI0MCB9LCAgLy8gSW5zdCAjMjY2MSA9IFZDVlRQRDJQU1hyWXINCisgIHsgMjY2MiwJNiwJMSwJMCwJIlZDVlRQRDJQU1hybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YTgwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjY2MiA9IFZDVlRQRDJQU1hybQ0KKyAgeyAyNjYzLAkyLAkxLAkwLAkiVkNWVFBEMlBTWHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTVhODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyNjYzID0gVkNWVFBEMlBTWHJyDQorICB7IDI2NjQsCTYsCTEsCTAsCSJWQ1ZUUEQyUFNZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMTVhODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyNjY0ID0gVkNWVFBEMlBTWXJtDQorICB7IDI2NjUsCTIsCTEsCTAsCSJWQ1ZUUEQyUFNZcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNWE4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjQwIH0sICAvLyBJbnN0ICMyNjY1ID0gVkNWVFBEMlBTWXJyDQorICB7IDI2NjYsCTIsCTEsCTAsCSJWQ1ZUUEQyUFNyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YTgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjY2NiA9IFZDVlRQRDJQU3JyDQorICB7IDI2NjcsCTYsCTEsCTAsCSJWQ1ZUUFMyRFFZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNWI4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMyNjY3ID0gVkNWVFBTMkRRWXJtDQorICB7IDI2NjgsCTIsCTEsCTAsCSJWQ1ZUUFMyRFFZcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNWI4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM5IH0sICAvLyBJbnN0ICMyNjY4ID0gVkNWVFBTMkRRWXJyDQorICB7IDI2NjksCTYsCTEsCTAsCSJWQ1ZUUFMyRFFybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YjgwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjY2OSA9IFZDVlRQUzJEUXJtDQorICB7IDI2NzAsCTIsCTEsCTAsCSJWQ1ZUUFMyRFFyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YjgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjY3MCA9IFZDVlRQUzJEUXJyDQorICB7IDI2NzEsCTYsCTEsCTAsCSJWQ1ZUUFMyUERZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNWEwMDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMyNjcxID0gVkNWVFBTMlBEWXJtDQorICB7IDI2NzIsCTIsCTEsCTAsCSJWQ1ZUUFMyUERZcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNWEwMDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM4IH0sICAvLyBJbnN0ICMyNjcyID0gVkNWVFBTMlBEWXJyDQorICB7IDI2NzMsCTYsCTEsCTAsCSJWQ1ZUUFMyUERybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YTAwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjY3MyA9IFZDVlRQUzJQRHJtDQorICB7IDI2NzQsCTIsCTEsCTAsCSJWQ1ZUUFMyUERyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YTAwMDAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjY3NCA9IFZDVlRQUzJQRHJyDQorICB7IDI2NzUsCTYsCTEsCTAsCSJWQ1ZUU0QyU0k2NHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzJkMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMyNjc1ID0gVkNWVFNEMlNJNjRybQ0KKyAgeyAyNjc2LAkyLAkxLAkwLAkiVkNWVFNEMlNJNjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDMyZDAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDAgfSwgIC8vIEluc3QgIzI2NzYgPSBWQ1ZUU0QyU0k2NHJyDQorICB7IDI2NzcsCTYsCTEsCTAsCSJWQ1ZUU0QyU0lfYWx0cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMmQwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzI2NzcgPSBWQ1ZUU0QyU0lfYWx0cm0NCisgIHsgMjY3OCwJMiwJMSwJMCwJIlZDVlRTRDJTSV9hbHRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEyZDAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDEgfSwgIC8vIEluc3QgIzI2NzggPSBWQ1ZUU0QyU0lfYWx0cnINCisgIHsgMjY3OSwJNywJMSwJMCwJIlZDVlRTRDJTU3JtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTVhMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI0MSB9LCAgLy8gSW5zdCAjMjY3OSA9IFZDVlRTRDJTU3JtDQorICB7IDI2ODAsCTMsCTEsCTAsCSJWQ1ZUU0QyU1NyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1YTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNDIgfSwgIC8vIEluc3QgIzI2ODAgPSBWQ1ZUU0QyU1Nycg0KKyAgeyAyNjgxLAk3LAkxLAkwLAkiVkNWVFNJMlNENjRybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDcyYTAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjQgfSwgIC8vIEluc3QgIzI2ODEgPSBWQ1ZUU0kyU0Q2NHJtDQorICB7IDI2ODIsCTMsCTEsCTAsCSJWQ1ZUU0kyU0Q2NHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzJhMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI0MyB9LCAgLy8gSW5zdCAjMjY4MiA9IFZDVlRTSTJTRDY0cnINCisgIHsgMjY4MywJNywJMSwJMCwJIlZDVlRTSTJTRExybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUyYTAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjQgfSwgIC8vIEluc3QgIzI2ODMgPSBWQ1ZUU0kyU0RMcm0NCisgIHsgMjY4NCwJMywJMSwJMCwJIlZDVlRTSTJTRExyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUyYTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNDQgfSwgIC8vIEluc3QgIzI2ODQgPSBWQ1ZUU0kyU0RMcnINCisgIHsgMjY4NSwJNywJMSwJMCwJIlZDVlRTSTJTRHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTJhMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNCB9LCAgLy8gSW5zdCAjMjY4NSA9IFZDVlRTSTJTRHJtDQorICB7IDI2ODYsCTMsCTEsCTAsCSJWQ1ZUU0kyU0RyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUyYTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNDQgfSwgIC8vIEluc3QgIzI2ODYgPSBWQ1ZUU0kyU0Rycg0KKyAgeyAyNjg3LAk3LAkxLAkwLAkiVkNWVFNJMlNTNjRybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDcyYTAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjYgfSwgIC8vIEluc3QgIzI2ODcgPSBWQ1ZUU0kyU1M2NHJtDQorICB7IDI2ODgsCTMsCTEsCTAsCSJWQ1ZUU0kyU1M2NHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzJhMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI0NSB9LCAgLy8gSW5zdCAjMjY4OCA9IFZDVlRTSTJTUzY0cnINCisgIHsgMjY4OSwJNywJMSwJMCwJIlZDVlRTSTJTU3JtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTJhMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNiB9LCAgLy8gSW5zdCAjMjY4OSA9IFZDVlRTSTJTU3JtDQorICB7IDI2OTAsCTMsCTEsCTAsCSJWQ1ZUU0kyU1NyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUyYTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNDYgfSwgIC8vIEluc3QgIzI2OTAgPSBWQ1ZUU0kyU1Nycg0KKyAgeyAyNjkxLAk3LAkxLAkwLAkiVkNWVFNTMlNEcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NWEwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjQ3IH0sICAvLyBJbnN0ICMyNjkxID0gVkNWVFNTMlNEcm0NCisgIHsgMjY5MiwJMywJMSwJMCwJIlZDVlRTUzJTRHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTVhMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI0OCB9LCAgLy8gSW5zdCAjMjY5MiA9IFZDVlRTUzJTRHJyDQorICB7IDI2OTMsCTYsCTEsCTAsCSJWQ1ZUU1MyU0k2NHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzJkMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMyNjkzID0gVkNWVFNTMlNJNjRybQ0KKyAgeyAyNjk0LAkyLAkxLAkwLAkiVkNWVFNTMlNJNjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDMyZDAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85OCB9LCAgLy8gSW5zdCAjMjY5NCA9IFZDVlRTUzJTSTY0cnINCisgIHsgMjY5NSwJNiwJMSwJMCwJIlZDVlRTUzJTSXJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTJkMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICMyNjk1ID0gVkNWVFNTMlNJcm0NCisgIHsgMjY5NiwJMiwJMSwJMCwJIlZDVlRTUzJTSXJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTJkMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzk5IH0sICAvLyBJbnN0ICMyNjk2ID0gVkNWVFNTMlNJcnINCisgIHsgMjY5NywJMiwJMSwJMCwJIlZDVlRUUEQyRFFYcllyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MWU2ODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI0MCB9LCAgLy8gSW5zdCAjMjY5NyA9IFZDVlRUUEQyRFFYcllyDQorICB7IDI2OTgsCTYsCTEsCTAsCSJWQ1ZUVFBEMkRRWHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MWU2ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyNjk4ID0gVkNWVFRQRDJEUVhybQ0KKyAgeyAyNjk5LAkyLAkxLAkwLAkiVkNWVFRQRDJEUVhyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFlNjgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjY5OSA9IFZDVlRUUEQyRFFYcnINCisgIHsgMjcwMCwJNiwJMSwJMCwJIlZDVlRUUEQyRFFZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMWU2ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMyNzAwID0gVkNWVFRQRDJEUVlybQ0KKyAgeyAyNzAxLAkyLAkxLAkwLAkiVkNWVFRQRDJEUVlyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFlNjgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNDAgfSwgIC8vIEluc3QgIzI3MDEgPSBWQ1ZUVFBEMkRRWXJyDQorICB7IDI3MDIsCTIsCTEsCTAsCSJWQ1ZUVFBEMkRRcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZTY4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzI3MDIgPSBWQ1ZUVFBEMkRRcnINCisgIHsgMjcwMywJNiwJMSwJMCwJIlZDVlRUUFMyRFFZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNWIwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMyNzAzID0gVkNWVFRQUzJEUVlybQ0KKyAgeyAyNzA0LAkyLAkxLAkwLAkiVkNWVFRQUzJEUVlyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YjAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzI3MDQgPSBWQ1ZUVFBTMkRRWXJyDQorICB7IDI3MDUsCTYsCTEsCTAsCSJWQ1ZUVFBTMkRRcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNWIwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzI3MDUgPSBWQ1ZUVFBTMkRRcm0NCisgIHsgMjcwNiwJMiwJMSwJMCwJIlZDVlRUUFMyRFFyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1YjAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjcwNiA9IFZDVlRUUFMyRFFycg0KKyAgeyAyNzA3LAk2LAkxLAkwLAkiVkNWVFRTRDJTSTY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMyYzAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjMjcwNyA9IFZDVlRUU0QyU0k2NHJtDQorICB7IDI3MDgsCTIsCTEsCTAsCSJWQ1ZUVFNEMlNJNjRyciIsIDAsIDB4MzJjMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwMCB9LCAgLy8gSW5zdCAjMjcwOCA9IFZDVlRUU0QyU0k2NHJyDQorICB7IDI3MDksCTYsCTEsCTAsCSJWQ1ZUVFNEMlNJcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEyYzAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NSB9LCAgLy8gSW5zdCAjMjcwOSA9IFZDVlRUU0QyU0lybQ0KKyAgeyAyNzEwLAkyLAkxLAkwLAkiVkNWVFRTRDJTSXJyIiwgMCwgMHgxMmMwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTAxIH0sICAvLyBJbnN0ICMyNzEwID0gVkNWVFRTRDJTSXJyDQorICB7IDI3MTEsCTYsCTEsCTAsCSJWQ1ZUVFNTMlNJNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MzJjMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU3IH0sICAvLyBJbnN0ICMyNzExID0gVkNWVFRTUzJTSTY0cm0NCisgIHsgMjcxMiwJMiwJMSwJMCwJIlZDVlRUU1MyU0k2NHJyIiwgMCwgMHgzMmMwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvOTggfSwgIC8vIEluc3QgIzI3MTIgPSBWQ1ZUVFNTMlNJNjRycg0KKyAgeyAyNzEzLAk2LAkxLAkwLAkiVkNWVFRTUzJTSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMmMwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTUgfSwgIC8vIEluc3QgIzI3MTMgPSBWQ1ZUVFNTMlNJcm0NCisgIHsgMjcxNCwJMiwJMSwJMCwJIlZDVlRUU1MyU0lyciIsIDAsIDB4MTJjMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzk5IH0sICAvLyBJbnN0ICMyNzE0ID0gVkNWVFRTUzJTSXJyDQorICB7IDI3MTUsCTcsCTEsCTAsCSJWRElWUERZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3MTUgPSBWRElWUERZcm0NCisgIHsgMjcxNiwJMywJMSwJMCwJIlZESVZQRFlyciIsIDAsIDB4NTVlODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjcxNiA9IFZESVZQRFlycg0KKyAgeyAyNzE3LAk3LAkxLAkwLAkiVkRJVlBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3MTcgPSBWRElWUERybQ0KKyAgeyAyNzE4LAkzLAkxLAkwLAkiVkRJVlBEcnIiLCAwLCAweDU1ZTgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3MTggPSBWRElWUERycg0KKyAgeyAyNzE5LAk3LAkxLAkwLAkiVkRJVlBTWXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWU0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMyNzE5ID0gVkRJVlBTWXJtDQorICB7IDI3MjAsCTMsCTEsCTAsCSJWRElWUFNZcnIiLCAwLCAweDU1ZTQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3MjAgPSBWRElWUFNZcnINCisgIHsgMjcyMSwJNywJMSwJMCwJIlZESVZQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWU0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyNzIxID0gVkRJVlBTcm0NCisgIHsgMjcyMiwJMywJMSwJMCwJIlZESVZQU3JyIiwgMCwgMHg1NWU0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyNzIyID0gVkRJVlBTcnINCisgIHsgMjcyMywJNywJMSwJMCwJIlZESVZTRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWUwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI0IH0sICAvLyBJbnN0ICMyNzIzID0gVkRJVlNEcm0NCisgIHsgMjcyNCwJNywJMSwJMCwJIlZESVZTRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVlMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjcyNCA9IFZESVZTRHJtX0ludA0KKyAgeyAyNzI1LAkzLAkxLAkwLAkiVkRJVlNEcnIiLCAwLCAweDU1ZTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjUgfSwgIC8vIEluc3QgIzI3MjUgPSBWRElWU0Rycg0KKyAgeyAyNzI2LAkzLAkxLAkwLAkiVkRJVlNEcnJfSW50IiwgMCwgMHg1NWUwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyNzI2ID0gVkRJVlNEcnJfSW50DQorICB7IDI3MjcsCTcsCTEsCTAsCSJWRElWU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVlMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNiB9LCAgLy8gSW5zdCAjMjcyNyA9IFZESVZTU3JtDQorICB7IDI3MjgsCTcsCTEsCTAsCSJWRElWU1NybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZTAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3MjggPSBWRElWU1NybV9JbnQNCisgIHsgMjcyOSwJMywJMSwJMCwJIlZESVZTU3JyIiwgMCwgMHg1NWUwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI3IH0sICAvLyBJbnN0ICMyNzI5ID0gVkRJVlNTcnINCisgIHsgMjczMCwJMywJMSwJMCwJIlZESVZTU3JyX0ludCIsIDAsIDB4NTVlMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjczMCA9IFZESVZTU3JyX0ludA0KKyAgeyAyNzMxLAk4LAkxLAkwLAkiVkRQUERybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU0MWMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzQgfSwgIC8vIEluc3QgIzI3MzEgPSBWRFBQRHJtaQ0KKyAgeyAyNzMyLAk0LAkxLAkwLAkiVkRQUERycmkiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU0MWMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjMjczMiA9IFZEUFBEcnJpDQorICB7IDI3MzMsCTgsCTEsCTAsCSJWRFBQU1lybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU0MGMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjkgfSwgIC8vIEluc3QgIzI3MzMgPSBWRFBQU1lybWkNCisgIHsgMjczNCwJNCwJMSwJMCwJIlZEUFBTWXJyaSIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTQwYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzMCB9LCAgLy8gSW5zdCAjMjczNCA9IFZEUFBTWXJyaQ0KKyAgeyAyNzM1LAk4LAkxLAkwLAkiVkRQUFNybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU0MGMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzQgfSwgIC8vIEluc3QgIzI3MzUgPSBWRFBQU3JtaQ0KKyAgeyAyNzM2LAk0LAkxLAkwLAkiVkRQUFNycmkiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU0MGMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjMjczNiA9IFZEUFBTcnJpDQorICB7IDI3MzcsCTUsCTAsCTAsCSJWRVJSbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDExY1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMjczNyA9IFZFUlJtDQorICB7IDI3MzgsCTEsCTAsCTAsCSJWRVJSciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDExNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDQgfSwgIC8vIEluc3QgIzI3MzggPSBWRVJScg0KKyAgeyAyNzM5LAk1LAkwLAkwLAkiVkVSV20iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMWRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzI3MzkgPSBWRVJXbQ0KKyAgeyAyNzQwLAkxLAkwLAkwLAkiVkVSV3IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMTVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA0IH0sICAvLyBJbnN0ICMyNzQwID0gVkVSV3INCisgIHsgMjc0MSwJNywJMCwJMCwJIlZFWFRSQUNURjEyOG1yIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTE5YzAyZTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI0OSB9LCAgLy8gSW5zdCAjMjc0MSA9IFZFWFRSQUNURjEyOG1yDQorICB7IDI3NDIsCTMsCTEsCTAsCSJWRVhUUkFDVEYxMjhyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDExOWMwMmU0M1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNTAgfSwgIC8vIEluc3QgIzI3NDIgPSBWRVhUUkFDVEYxMjhycg0KKyAgeyAyNzQzLAk3LAkwLAkwLAkiVkVYVFJBQ1RQU21yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTE3YzAyZTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNiB9LCAgLy8gSW5zdCAjMjc0MyA9IFZFWFRSQUNUUFNtcg0KKyAgeyAyNzQ0LAkzLAkxLAkwLAkiVkVYVFJBQ1RQU3JyIiwgMCwgMHgxMTdjMDJlNDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA3IH0sICAvLyBJbnN0ICMyNzQ0ID0gVkVYVFJBQ1RQU3JyDQorICB7IDI3NDUsCTMsCTEsCTAsCSJWRVhUUkFDVFBTcnI2NCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDExN2MwMmU0M1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMDQgfSwgIC8vIEluc3QgIzI3NDUgPSBWRVhUUkFDVFBTcnI2NA0KKyAgeyAyNzQ2LAk3LAkxLAkwLAkiVkZNQUREUERyMTMybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5OGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3NDYgPSBWRk1BRERQRHIxMzJtDQorICB7IDI3NDcsCTcsCTEsCTAsCSJWRk1BRERQRHIxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5OGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3NDcgPSBWRk1BRERQRHIxMzJtWQ0KKyAgeyAyNzQ4LAkzLAkxLAkwLAkiVkZNQUREUERyMTMyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5OGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3NDggPSBWRk1BRERQRHIxMzJyDQorICB7IDI3NDksCTMsCTEsCTAsCSJWRk1BRERQRHIxMzJyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5OGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3NDkgPSBWRk1BRERQRHIxMzJyWQ0KKyAgeyAyNzUwLAk3LAkxLAkwLAkiVkZNQUREUERyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3NTAgPSBWRk1BRERQRHIyMTNtDQorICB7IDI3NTEsCTcsCTEsCTAsCSJWRk1BRERQRHIyMTNtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3NTEgPSBWRk1BRERQRHIyMTNtWQ0KKyAgeyAyNzUyLAkzLAkxLAkwLAkiVkZNQUREUERyMjEzciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3NTIgPSBWRk1BRERQRHIyMTNyDQorICB7IDI3NTMsCTMsCTEsCTAsCSJWRk1BRERQRHIyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3NTMgPSBWRk1BRERQRHIyMTNyWQ0KKyAgeyAyNzU0LAk3LAkxLAkwLAkiVkZNQUREUERyMjMxbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3NTQgPSBWRk1BRERQRHIyMzFtDQorICB7IDI3NTUsCTcsCTEsCTAsCSJWRk1BRERQRHIyMzFtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3NTUgPSBWRk1BRERQRHIyMzFtWQ0KKyAgeyAyNzU2LAkzLAkxLAkwLAkiVkZNQUREUERyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3NTYgPSBWRk1BRERQRHIyMzFyDQorICB7IDI3NTcsCTMsCTEsCTAsCSJWRk1BRERQRHIyMzFyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3NTcgPSBWRk1BRERQRHIyMzFyWQ0KKyAgeyAyNzU4LAk3LAkxLAkwLAkiVkZNQUREUFNyMTMybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5OGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3NTggPSBWRk1BRERQU3IxMzJtDQorICB7IDI3NTksCTcsCTEsCTAsCSJWRk1BRERQU3IxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5OGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3NTkgPSBWRk1BRERQU3IxMzJtWQ0KKyAgeyAyNzYwLAkzLAkxLAkwLAkiVkZNQUREUFNyMTMyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5OGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3NjAgPSBWRk1BRERQU3IxMzJyDQorICB7IDI3NjEsCTMsCTEsCTAsCSJWRk1BRERQU3IxMzJyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5OGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3NjEgPSBWRk1BRERQU3IxMzJyWQ0KKyAgeyAyNzYyLAk3LAkxLAkwLAkiVkZNQUREUFNyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3NjIgPSBWRk1BRERQU3IyMTNtDQorICB7IDI3NjMsCTcsCTEsCTAsCSJWRk1BRERQU3IyMTNtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3NjMgPSBWRk1BRERQU3IyMTNtWQ0KKyAgeyAyNzY0LAkzLAkxLAkwLAkiVkZNQUREUFNyMjEzciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3NjQgPSBWRk1BRERQU3IyMTNyDQorICB7IDI3NjUsCTMsCTEsCTAsCSJWRk1BRERQU3IyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3NjUgPSBWRk1BRERQU3IyMTNyWQ0KKyAgeyAyNzY2LAk3LAkxLAkwLAkiVkZNQUREUFNyMjMxbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3NjYgPSBWRk1BRERQU3IyMzFtDQorICB7IDI3NjcsCTcsCTEsCTAsCSJWRk1BRERQU3IyMzFtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3NjcgPSBWRk1BRERQU3IyMzFtWQ0KKyAgeyAyNzY4LAkzLAkxLAkwLAkiVkZNQUREUFNyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3NjggPSBWRk1BRERQU3IyMzFyDQorICB7IDI3NjksCTMsCTEsCTAsCSJWRk1BRERQU3IyMzFyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViOGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3NjkgPSBWRk1BRERQU3IyMzFyWQ0KKyAgeyAyNzcwLAk3LAkxLAkwLAkiVkZNQUREU1VCUERyMTMybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5NmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3NzAgPSBWRk1BRERTVUJQRHIxMzJtDQorICB7IDI3NzEsCTcsCTEsCTAsCSJWRk1BRERTVUJQRHIxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5NmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3NzEgPSBWRk1BRERTVUJQRHIxMzJtWQ0KKyAgeyAyNzcyLAkzLAkxLAkwLAkiVkZNQUREU1VCUERyMTMyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5NmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3NzIgPSBWRk1BRERTVUJQRHIxMzJyDQorICB7IDI3NzMsCTMsCTEsCTAsCSJWRk1BRERTVUJQRHIxMzJyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5NmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3NzMgPSBWRk1BRERTVUJQRHIxMzJyWQ0KKyAgeyAyNzc0LAk3LAkxLAkwLAkiVkZNQUREU1VCUERyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhNmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3NzQgPSBWRk1BRERTVUJQRHIyMTNtDQorICB7IDI3NzUsCTcsCTEsCTAsCSJWRk1BRERTVUJQRHIyMTNtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhNmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3NzUgPSBWRk1BRERTVUJQRHIyMTNtWQ0KKyAgeyAyNzc2LAkzLAkxLAkwLAkiVkZNQUREU1VCUERyMjEzciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhNmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3NzYgPSBWRk1BRERTVUJQRHIyMTNyDQorICB7IDI3NzcsCTMsCTEsCTAsCSJWRk1BRERTVUJQRHIyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhNmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3NzcgPSBWRk1BRERTVUJQRHIyMTNyWQ0KKyAgeyAyNzc4LAk3LAkxLAkwLAkiVkZNQUREU1VCUERyMjMxbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiNmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3NzggPSBWRk1BRERTVUJQRHIyMzFtDQorICB7IDI3NzksCTcsCTEsCTAsCSJWRk1BRERTVUJQRHIyMzFtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiNmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3NzkgPSBWRk1BRERTVUJQRHIyMzFtWQ0KKyAgeyAyNzgwLAkzLAkxLAkwLAkiVkZNQUREU1VCUERyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiNmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3ODAgPSBWRk1BRERTVUJQRHIyMzFyDQorICB7IDI3ODEsCTMsCTEsCTAsCSJWRk1BRERTVUJQRHIyMzFyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiNmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3ODEgPSBWRk1BRERTVUJQRHIyMzFyWQ0KKyAgeyAyNzgyLAk3LAkxLAkwLAkiVkZNQUREU1VCUFNyMTMybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5NmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3ODIgPSBWRk1BRERTVUJQU3IxMzJtDQorICB7IDI3ODMsCTcsCTEsCTAsCSJWRk1BRERTVUJQU3IxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5NmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3ODMgPSBWRk1BRERTVUJQU3IxMzJtWQ0KKyAgeyAyNzg0LAkzLAkxLAkwLAkiVkZNQUREU1VCUFNyMTMyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5NmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3ODQgPSBWRk1BRERTVUJQU3IxMzJyDQorICB7IDI3ODUsCTMsCTEsCTAsCSJWRk1BRERTVUJQU3IxMzJyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5NmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3ODUgPSBWRk1BRERTVUJQU3IxMzJyWQ0KKyAgeyAyNzg2LAk3LAkxLAkwLAkiVkZNQUREU1VCUFNyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhNmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3ODYgPSBWRk1BRERTVUJQU3IyMTNtDQorICB7IDI3ODcsCTcsCTEsCTAsCSJWRk1BRERTVUJQU3IyMTNtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhNmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3ODcgPSBWRk1BRERTVUJQU3IyMTNtWQ0KKyAgeyAyNzg4LAkzLAkxLAkwLAkiVkZNQUREU1VCUFNyMjEzciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhNmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3ODggPSBWRk1BRERTVUJQU3IyMTNyDQorICB7IDI3ODksCTMsCTEsCTAsCSJWRk1BRERTVUJQU3IyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhNmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3ODkgPSBWRk1BRERTVUJQU3IyMTNyWQ0KKyAgeyAyNzkwLAk3LAkxLAkwLAkiVkZNQUREU1VCUFNyMjMxbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViNmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3OTAgPSBWRk1BRERTVUJQU3IyMzFtDQorICB7IDI3OTEsCTcsCTEsCTAsCSJWRk1BRERTVUJQU3IyMzFtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViNmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3OTEgPSBWRk1BRERTVUJQU3IyMzFtWQ0KKyAgeyAyNzkyLAkzLAkxLAkwLAkiVkZNQUREU1VCUFNyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViNmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3OTIgPSBWRk1BRERTVUJQU3IyMzFyDQorICB7IDI3OTMsCTMsCTEsCTAsCSJWRk1BRERTVUJQU3IyMzFyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViNmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3OTMgPSBWRk1BRERTVUJQU3IyMzFyWQ0KKyAgeyAyNzk0LAk3LAkxLAkwLAkiVkZNU1VCQUREUERyMTMybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5N2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3OTQgPSBWRk1TVUJBRERQRHIxMzJtDQorICB7IDI3OTUsCTcsCTEsCTAsCSJWRk1TVUJBRERQRHIxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5N2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3OTUgPSBWRk1TVUJBRERQRHIxMzJtWQ0KKyAgeyAyNzk2LAkzLAkxLAkwLAkiVkZNU1VCQUREUERyMTMyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5N2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI3OTYgPSBWRk1TVUJBRERQRHIxMzJyDQorICB7IDI3OTcsCTMsCTEsCTAsCSJWRk1TVUJBRERQRHIxMzJyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5N2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI3OTcgPSBWRk1TVUJBRERQRHIxMzJyWQ0KKyAgeyAyNzk4LAk3LAkxLAkwLAkiVkZNU1VCQUREUERyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI3OTggPSBWRk1TVUJBRERQRHIyMTNtDQorICB7IDI3OTksCTcsCTEsCTAsCSJWRk1TVUJBRERQRHIyMTNtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI3OTkgPSBWRk1TVUJBRERQRHIyMTNtWQ0KKyAgeyAyODAwLAkzLAkxLAkwLAkiVkZNU1VCQUREUERyMjEzciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhN2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MDAgPSBWRk1TVUJBRERQRHIyMTNyDQorICB7IDI4MDEsCTMsCTEsCTAsCSJWRk1TVUJBRERQRHIyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhN2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MDEgPSBWRk1TVUJBRERQRHIyMTNyWQ0KKyAgeyAyODAyLAk3LAkxLAkwLAkiVkZNU1VCQUREUERyMjMxbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MDIgPSBWRk1TVUJBRERQRHIyMzFtDQorICB7IDI4MDMsCTcsCTEsCTAsCSJWRk1TVUJBRERQRHIyMzFtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MDMgPSBWRk1TVUJBRERQRHIyMzFtWQ0KKyAgeyAyODA0LAkzLAkxLAkwLAkiVkZNU1VCQUREUERyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiN2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MDQgPSBWRk1TVUJBRERQRHIyMzFyDQorICB7IDI4MDUsCTMsCTEsCTAsCSJWRk1TVUJBRERQRHIyMzFyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiN2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MDUgPSBWRk1TVUJBRERQRHIyMzFyWQ0KKyAgeyAyODA2LAk3LAkxLAkwLAkiVkZNU1VCQUREUFNyMTMybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5N2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MDYgPSBWRk1TVUJBRERQU3IxMzJtDQorICB7IDI4MDcsCTcsCTEsCTAsCSJWRk1TVUJBRERQU3IxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5N2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MDcgPSBWRk1TVUJBRERQU3IxMzJtWQ0KKyAgeyAyODA4LAkzLAkxLAkwLAkiVkZNU1VCQUREUFNyMTMyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5N2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MDggPSBWRk1TVUJBRERQU3IxMzJyDQorICB7IDI4MDksCTMsCTEsCTAsCSJWRk1TVUJBRERQU3IxMzJyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5N2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MDkgPSBWRk1TVUJBRERQU3IxMzJyWQ0KKyAgeyAyODEwLAk3LAkxLAkwLAkiVkZNU1VCQUREUFNyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MTAgPSBWRk1TVUJBRERQU3IyMTNtDQorICB7IDI4MTEsCTcsCTEsCTAsCSJWRk1TVUJBRERQU3IyMTNtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MTEgPSBWRk1TVUJBRERQU3IyMTNtWQ0KKyAgeyAyODEyLAkzLAkxLAkwLAkiVkZNU1VCQUREUFNyMjEzciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhN2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MTIgPSBWRk1TVUJBRERQU3IyMTNyDQorICB7IDI4MTMsCTMsCTEsCTAsCSJWRk1TVUJBRERQU3IyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhN2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MTMgPSBWRk1TVUJBRERQU3IyMTNyWQ0KKyAgeyAyODE0LAk3LAkxLAkwLAkiVkZNU1VCQUREUFNyMjMxbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MTQgPSBWRk1TVUJBRERQU3IyMzFtDQorICB7IDI4MTUsCTcsCTEsCTAsCSJWRk1TVUJBRERQU3IyMzFtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MTUgPSBWRk1TVUJBRERQU3IyMzFtWQ0KKyAgeyAyODE2LAkzLAkxLAkwLAkiVkZNU1VCQUREUFNyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViN2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MTYgPSBWRk1TVUJBRERQU3IyMzFyDQorICB7IDI4MTcsCTMsCTEsCTAsCSJWRk1TVUJBRERQU3IyMzFyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViN2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MTcgPSBWRk1TVUJBRERQU3IyMzFyWQ0KKyAgeyAyODE4LAk3LAkxLAkwLAkiVkZNU1VCUERyMTMybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5YWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MTggPSBWRk1TVUJQRHIxMzJtDQorICB7IDI4MTksCTcsCTEsCTAsCSJWRk1TVUJQRHIxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5YWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MTkgPSBWRk1TVUJQRHIxMzJtWQ0KKyAgeyAyODIwLAkzLAkxLAkwLAkiVkZNU1VCUERyMTMyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5YWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MjAgPSBWRk1TVUJQRHIxMzJyDQorICB7IDI4MjEsCTMsCTEsCTAsCSJWRk1TVUJQRHIxMzJyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5YWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MjEgPSBWRk1TVUJQRHIxMzJyWQ0KKyAgeyAyODIyLAk3LAkxLAkwLAkiVkZNU1VCUERyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MjIgPSBWRk1TVUJQRHIyMTNtDQorICB7IDI4MjMsCTcsCTEsCTAsCSJWRk1TVUJQRHIyMTNtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MjMgPSBWRk1TVUJQRHIyMTNtWQ0KKyAgeyAyODI0LAkzLAkxLAkwLAkiVkZNU1VCUERyMjEzciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhYWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MjQgPSBWRk1TVUJQRHIyMTNyDQorICB7IDI4MjUsCTMsCTEsCTAsCSJWRk1TVUJQRHIyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhYWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MjUgPSBWRk1TVUJQRHIyMTNyWQ0KKyAgeyAyODI2LAk3LAkxLAkwLAkiVkZNU1VCUERyMjMxbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MjYgPSBWRk1TVUJQRHIyMzFtDQorICB7IDI4MjcsCTcsCTEsCTAsCSJWRk1TVUJQRHIyMzFtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MjcgPSBWRk1TVUJQRHIyMzFtWQ0KKyAgeyAyODI4LAkzLAkxLAkwLAkiVkZNU1VCUERyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiYWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MjggPSBWRk1TVUJQRHIyMzFyDQorICB7IDI4MjksCTMsCTEsCTAsCSJWRk1TVUJQRHIyMzFyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiYWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MjkgPSBWRk1TVUJQRHIyMzFyWQ0KKyAgeyAyODMwLAk3LAkxLAkwLAkiVkZNU1VCUFNyMTMybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5YWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MzAgPSBWRk1TVUJQU3IxMzJtDQorICB7IDI4MzEsCTcsCTEsCTAsCSJWRk1TVUJQU3IxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5YWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MzEgPSBWRk1TVUJQU3IxMzJtWQ0KKyAgeyAyODMyLAkzLAkxLAkwLAkiVkZNU1VCUFNyMTMyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5YWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MzIgPSBWRk1TVUJQU3IxMzJyDQorICB7IDI4MzMsCTMsCTEsCTAsCSJWRk1TVUJQU3IxMzJyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5YWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MzMgPSBWRk1TVUJQU3IxMzJyWQ0KKyAgeyAyODM0LAk3LAkxLAkwLAkiVkZNU1VCUFNyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MzQgPSBWRk1TVUJQU3IyMTNtDQorICB7IDI4MzUsCTcsCTEsCTAsCSJWRk1TVUJQU3IyMTNtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MzUgPSBWRk1TVUJQU3IyMTNtWQ0KKyAgeyAyODM2LAkzLAkxLAkwLAkiVkZNU1VCUFNyMjEzciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhYWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4MzYgPSBWRk1TVUJQU3IyMTNyDQorICB7IDI4MzcsCTMsCTEsCTAsCSJWRk1TVUJQU3IyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhYWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4MzcgPSBWRk1TVUJQU3IyMTNyWQ0KKyAgeyAyODM4LAk3LAkxLAkwLAkiVkZNU1VCUFNyMjMxbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4MzggPSBWRk1TVUJQU3IyMzFtDQorICB7IDI4MzksCTcsCTEsCTAsCSJWRk1TVUJQU3IyMzFtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4MzkgPSBWRk1TVUJQU3IyMzFtWQ0KKyAgeyAyODQwLAkzLAkxLAkwLAkiVkZNU1VCUFNyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViYWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4NDAgPSBWRk1TVUJQU3IyMzFyDQorICB7IDI4NDEsCTMsCTEsCTAsCSJWRk1TVUJQU3IyMzFyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViYWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4NDEgPSBWRk1TVUJQU3IyMzFyWQ0KKyAgeyAyODQyLAk3LAkxLAkwLAkiVkZOTUFERFBEcjEzMm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3OWNjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyODQyID0gVkZOTUFERFBEcjEzMm0NCisgIHsgMjg0MywJNywJMSwJMCwJIlZGTk1BRERQRHIxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5Y2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4NDMgPSBWRk5NQUREUERyMTMybVkNCisgIHsgMjg0NCwJMywJMSwJMCwJIlZGTk1BRERQRHIxMzJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzljYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjg0NCA9IFZGTk1BRERQRHIxMzJyDQorICB7IDI4NDUsCTMsCTEsCTAsCSJWRk5NQUREUERyMTMyclkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3OWNjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyODQ1ID0gVkZOTUFERFBEcjEzMnJZDQorICB7IDI4NDYsCTcsCTEsCTAsCSJWRk5NQUREUERyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhY2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4NDYgPSBWRk5NQUREUERyMjEzbQ0KKyAgeyAyODQ3LAk3LAkxLAkwLAkiVkZOTUFERFBEcjIxM21ZIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2FjYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjg0NyA9IFZGTk1BRERQRHIyMTNtWQ0KKyAgeyAyODQ4LAkzLAkxLAkwLAkiVkZOTUFERFBEcjIxM3IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3YWNjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyODQ4ID0gVkZOTUFERFBEcjIxM3INCisgIHsgMjg0OSwJMywJMSwJMCwJIlZGTk1BRERQRHIyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhY2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4NDkgPSBWRk5NQUREUERyMjEzclkNCisgIHsgMjg1MCwJNywJMSwJMCwJIlZGTk1BRERQRHIyMzFtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2JjYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjg1MCA9IFZGTk1BRERQRHIyMzFtDQorICB7IDI4NTEsCTcsCTEsCTAsCSJWRk5NQUREUERyMjMxbVkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3YmNjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMyODUxID0gVkZOTUFERFBEcjIzMW1ZDQorICB7IDI4NTIsCTMsCTEsCTAsCSJWRk5NQUREUERyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiY2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4NTIgPSBWRk5NQUREUERyMjMxcg0KKyAgeyAyODUzLAkzLAkxLAkwLAkiVkZOTUFERFBEcjIzMXJZIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2JjYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjg1MyA9IFZGTk1BRERQRHIyMzFyWQ0KKyAgeyAyODU0LAk3LAkxLAkwLAkiVkZOTUFERFBTcjEzMm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1OWNjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyODU0ID0gVkZOTUFERFBTcjEzMm0NCisgIHsgMjg1NSwJNywJMSwJMCwJIlZGTk1BRERQU3IxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5Y2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4NTUgPSBWRk5NQUREUFNyMTMybVkNCisgIHsgMjg1NiwJMywJMSwJMCwJIlZGTk1BRERQU3IxMzJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTljYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjg1NiA9IFZGTk1BRERQU3IxMzJyDQorICB7IDI4NTcsCTMsCTEsCTAsCSJWRk5NQUREUFNyMTMyclkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1OWNjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyODU3ID0gVkZOTUFERFBTcjEzMnJZDQorICB7IDI4NTgsCTcsCTEsCTAsCSJWRk5NQUREUFNyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhY2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4NTggPSBWRk5NQUREUFNyMjEzbQ0KKyAgeyAyODU5LAk3LAkxLAkwLAkiVkZOTUFERFBTcjIxM21ZIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWFjYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjg1OSA9IFZGTk1BRERQU3IyMTNtWQ0KKyAgeyAyODYwLAkzLAkxLAkwLAkiVkZOTUFERFBTcjIxM3IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1YWNjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyODYwID0gVkZOTUFERFBTcjIxM3INCisgIHsgMjg2MSwJMywJMSwJMCwJIlZGTk1BRERQU3IyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhY2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4NjEgPSBWRk5NQUREUFNyMjEzclkNCisgIHsgMjg2MiwJNywJMSwJMCwJIlZGTk1BRERQU3IyMzFtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWJjYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjg2MiA9IFZGTk1BRERQU3IyMzFtDQorICB7IDI4NjMsCTcsCTEsCTAsCSJWRk5NQUREUFNyMjMxbVkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1YmNjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMyODYzID0gVkZOTUFERFBTcjIzMW1ZDQorICB7IDI4NjQsCTMsCTEsCTAsCSJWRk5NQUREUFNyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViY2MwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4NjQgPSBWRk5NQUREUFNyMjMxcg0KKyAgeyAyODY1LAkzLAkxLAkwLAkiVkZOTUFERFBTcjIzMXJZIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWJjYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjg2NSA9IFZGTk1BRERQU3IyMzFyWQ0KKyAgeyAyODY2LAk3LAkxLAkwLAkiVkZOTVNVQlBEcjEzMm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3OWVjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyODY2ID0gVkZOTVNVQlBEcjEzMm0NCisgIHsgMjg2NywJNywJMSwJMCwJIlZGTk1TVUJQRHIxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5ZWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4NjcgPSBWRk5NU1VCUERyMTMybVkNCisgIHsgMjg2OCwJMywJMSwJMCwJIlZGTk1TVUJQRHIxMzJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzllYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjg2OCA9IFZGTk1TVUJQRHIxMzJyDQorICB7IDI4NjksCTMsCTEsCTAsCSJWRk5NU1VCUERyMTMyclkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3OWVjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyODY5ID0gVkZOTVNVQlBEcjEzMnJZDQorICB7IDI4NzAsCTcsCTEsCTAsCSJWRk5NU1VCUERyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhZWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4NzAgPSBWRk5NU1VCUERyMjEzbQ0KKyAgeyAyODcxLAk3LAkxLAkwLAkiVkZOTVNVQlBEcjIxM21ZIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2FlYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjg3MSA9IFZGTk1TVUJQRHIyMTNtWQ0KKyAgeyAyODcyLAkzLAkxLAkwLAkiVkZOTVNVQlBEcjIxM3IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3YWVjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyODcyID0gVkZOTVNVQlBEcjIxM3INCisgIHsgMjg3MywJMywJMSwJMCwJIlZGTk1TVUJQRHIyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdhZWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4NzMgPSBWRk5NU1VCUERyMjEzclkNCisgIHsgMjg3NCwJNywJMSwJMCwJIlZGTk1TVUJQRHIyMzFtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2JlYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjg3NCA9IFZGTk1TVUJQRHIyMzFtDQorICB7IDI4NzUsCTcsCTEsCTAsCSJWRk5NU1VCUERyMjMxbVkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3YmVjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMyODc1ID0gVkZOTVNVQlBEcjIzMW1ZDQorICB7IDI4NzYsCTMsCTEsCTAsCSJWRk5NU1VCUERyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDdiZWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4NzYgPSBWRk5NU1VCUERyMjMxcg0KKyAgeyAyODc3LAkzLAkxLAkwLAkiVkZOTVNVQlBEcjIzMXJZIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4N2JlYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjg3NyA9IFZGTk1TVUJQRHIyMzFyWQ0KKyAgeyAyODc4LAk3LAkxLAkwLAkiVkZOTVNVQlBTcjEzMm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1OWVjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyODc4ID0gVkZOTVNVQlBTcjEzMm0NCisgIHsgMjg3OSwJNywJMSwJMCwJIlZGTk1TVUJQU3IxMzJtWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU5ZWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI4NzkgPSBWRk5NU1VCUFNyMTMybVkNCisgIHsgMjg4MCwJMywJMSwJMCwJIlZGTk1TVUJQU3IxMzJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTllYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjg4MCA9IFZGTk1TVUJQU3IxMzJyDQorICB7IDI4ODEsCTMsCTEsCTAsCSJWRk5NU1VCUFNyMTMyclkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1OWVjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyODgxID0gVkZOTVNVQlBTcjEzMnJZDQorICB7IDI4ODIsCTcsCTEsCTAsCSJWRk5NU1VCUFNyMjEzbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhZWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI4ODIgPSBWRk5NU1VCUFNyMjEzbQ0KKyAgeyAyODgzLAk3LAkxLAkwLAkiVkZOTVNVQlBTcjIxM21ZIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWFlYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjg4MyA9IFZGTk1TVUJQU3IyMTNtWQ0KKyAgeyAyODg0LAkzLAkxLAkwLAkiVkZOTVNVQlBTcjIxM3IiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1YWVjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyODg0ID0gVkZOTVNVQlBTcjIxM3INCisgIHsgMjg4NSwJMywJMSwJMCwJIlZGTk1TVUJQU3IyMTNyWSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDVhZWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI4ODUgPSBWRk5NU1VCUFNyMjEzclkNCisgIHsgMjg4NiwJNywJMSwJMCwJIlZGTk1TVUJQU3IyMzFtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWJlYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjg4NiA9IFZGTk1TVUJQU3IyMzFtDQorICB7IDI4ODcsCTcsCTEsCTAsCSJWRk5NU1VCUFNyMjMxbVkiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1YmVjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMyODg3ID0gVkZOTVNVQlBTcjIzMW1ZDQorICB7IDI4ODgsCTMsCTEsCTAsCSJWRk5NU1VCUFNyMjMxciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDViZWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI4ODggPSBWRk5NU1VCUFNyMjMxcg0KKyAgeyAyODg5LAkzLAkxLAkwLAkiVkZOTVNVQlBTcjIzMXJZIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWJlYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjg4OSA9IFZGTk1TVUJQU3IyMzFyWQ0KKyAgeyAyODkwLAk3LAkxLAkwLAkiVkZzQU5ETlBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1NTgwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjQgfSwgIC8vIEluc3QgIzI4OTAgPSBWRnNBTkROUERybQ0KKyAgeyAyODkxLAkzLAkxLAkwLAkiVkZzQU5ETlBEcnIiLCAwLCAweDU1NTgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjUgfSwgIC8vIEluc3QgIzI4OTEgPSBWRnNBTkROUERycg0KKyAgeyAyODkyLAk3LAkxLAkwLAkiVkZzQU5ETlBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1NTQwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjYgfSwgIC8vIEluc3QgIzI4OTIgPSBWRnNBTkROUFNybQ0KKyAgeyAyODkzLAkzLAkxLAkwLAkiVkZzQU5ETlBTcnIiLCAwLCAweDU1NTQwMDAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjcgfSwgIC8vIEluc3QgIzI4OTMgPSBWRnNBTkROUFNycg0KKyAgeyAyODk0LAk3LAkxLAkwLAkiVkZzQU5EUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTU0ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNCB9LCAgLy8gSW5zdCAjMjg5NCA9IFZGc0FORFBEcm0NCisgIHsgMjg5NSwJMywJMSwJMCwJIlZGc0FORFBEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU1NDgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjUgfSwgIC8vIEluc3QgIzI4OTUgPSBWRnNBTkRQRHJyDQorICB7IDI4OTYsCTcsCTEsCTAsCSJWRnNBTkRQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTQ0MDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI2IH0sICAvLyBJbnN0ICMyODk2ID0gVkZzQU5EUFNybQ0KKyAgeyAyODk3LAkzLAkxLAkwLAkiVkZzQU5EUFNyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTU0NDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNyB9LCAgLy8gSW5zdCAjMjg5NyA9IFZGc0FORFBTcnINCisgIHsgMjg5OCwJNywJMSwJMCwJIlZGc09SUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTU2ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNCB9LCAgLy8gSW5zdCAjMjg5OCA9IFZGc09SUERybQ0KKyAgeyAyODk5LAkzLAkxLAkwLAkiVkZzT1JQRHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NTY4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI1IH0sICAvLyBJbnN0ICMyODk5ID0gVkZzT1JQRHJyDQorICB7IDI5MDAsCTcsCTEsCTAsCSJWRnNPUlBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1NjQwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjYgfSwgIC8vIEluc3QgIzI5MDAgPSBWRnNPUlBTcm0NCisgIHsgMjkwMSwJMywJMSwJMCwJIlZGc09SUFNyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTU2NDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNyB9LCAgLy8gSW5zdCAjMjkwMSA9IFZGc09SUFNycg0KKyAgeyAyOTAyLAk3LAkxLAkwLAkiVkZzWE9SUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTU3ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNCB9LCAgLy8gSW5zdCAjMjkwMiA9IFZGc1hPUlBEcm0NCisgIHsgMjkwMywJMywJMSwJMCwJIlZGc1hPUlBEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU1NzgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjUgfSwgIC8vIEluc3QgIzI5MDMgPSBWRnNYT1JQRHJyDQorICB7IDI5MDQsCTcsCTEsCTAsCSJWRnNYT1JQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTc0MDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI2IH0sICAvLyBJbnN0ICMyOTA0ID0gVkZzWE9SUFNybQ0KKyAgeyAyOTA1LAkzLAkxLAkwLAkiVkZzWE9SUFNyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTU3NDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNyB9LCAgLy8gSW5zdCAjMjkwNSA9IFZGc1hPUlBTcnINCisgIHsgMjkwNiwJNywJMSwJMCwJIlZIQUREUERZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU3YzgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI5MDYgPSBWSEFERFBEWXJtDQorICB7IDI5MDcsCTMsCTEsCTAsCSJWSEFERFBEWXJyIiwgMCwgMHg1N2M4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyOTA3ID0gVkhBRERQRFlycg0KKyAgeyAyOTA4LAk3LAkxLAkwLAkiVkhBRERQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1N2M4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyOTA4ID0gVkhBRERQRHJtDQorICB7IDI5MDksCTMsCTEsCTAsCSJWSEFERFBEcnIiLCAwLCAweDU3YzgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI5MDkgPSBWSEFERFBEcnINCisgIHsgMjkxMCwJNywJMSwJMCwJIlZIQUREUFNZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU3YzgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI5MTAgPSBWSEFERFBTWXJtDQorICB7IDI5MTEsCTMsCTEsCTAsCSJWSEFERFBTWXJyIiwgMCwgMHg1N2M4MDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyOTExID0gVkhBRERQU1lycg0KKyAgeyAyOTEyLAk3LAkxLAkwLAkiVkhBRERQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1N2M4MDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyOTEyID0gVkhBRERQU3JtDQorICB7IDI5MTMsCTMsCTEsCTAsCSJWSEFERFBTcnIiLCAwLCAweDU3YzgwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI5MTMgPSBWSEFERFBTcnINCisgIHsgMjkxNCwJNywJMSwJMCwJIlZIU1VCUERZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU3ZDgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI5MTQgPSBWSFNVQlBEWXJtDQorICB7IDI5MTUsCTMsCTEsCTAsCSJWSFNVQlBEWXJyIiwgMCwgMHg1N2Q4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyOTE1ID0gVkhTVUJQRFlycg0KKyAgeyAyOTE2LAk3LAkxLAkwLAkiVkhTVUJQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1N2Q4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyOTE2ID0gVkhTVUJQRHJtDQorICB7IDI5MTcsCTMsCTEsCTAsCSJWSFNVQlBEcnIiLCAwLCAweDU3ZDgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI5MTcgPSBWSFNVQlBEcnINCisgIHsgMjkxOCwJNywJMSwJMCwJIlZIU1VCUFNZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU3ZDgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI5MTggPSBWSFNVQlBTWXJtDQorICB7IDI5MTksCTMsCTEsCTAsCSJWSFNVQlBTWXJyIiwgMCwgMHg1N2Q4MDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMyOTE5ID0gVkhTVUJQU1lycg0KKyAgeyAyOTIwLAk3LAkxLAkwLAkiVkhTVUJQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1N2Q4MDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyOTIwID0gVkhTVUJQU3JtDQorICB7IDI5MjEsCTMsCTEsCTAsCSJWSFNVQlBTcnIiLCAwLCAweDU3ZDgwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI5MjEgPSBWSFNVQlBTcnINCisgIHsgMjkyMiwJOCwJMSwJMCwJIlZJTlNFUlRGMTI4cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1MThjMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI5IH0sICAvLyBJbnN0ICMyOTIyID0gVklOU0VSVEYxMjhybQ0KKyAgeyAyOTIzLAk0LAkxLAkwLAkiVklOU0VSVEYxMjhyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUxOGMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNTEgfSwgIC8vIEluc3QgIzI5MjMgPSBWSU5TRVJURjEyOHJyDQorICB7IDI5MjQsCTgsCTEsCTAsCSJWSU5TRVJUUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTIxYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMjkyNCA9IFZJTlNFUlRQU3JtDQorICB7IDI5MjUsCTQsCTEsCTAsCSJWSU5TRVJUUFNyciIsIDAsIDB4NTIxYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMyOTI1ID0gVklOU0VSVFBTcnINCisgIHsgMjkyNiwJNiwJMSwJMCwJIlZMRERRVVlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MWYwODAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzNSB9LCAgLy8gSW5zdCAjMjkyNiA9IFZMRERRVVlybQ0KKyAgeyAyOTI3LAk2LAkxLAkwLAkiVkxERFFVcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDFmMDgwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMjkyNyA9IFZMRERRVXJtDQorICB7IDI5MjgsCTUsCTAsCTAsCSJWTERNWENTUiIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxYWU0MDAwMWFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzI5MjggPSBWTERNWENTUg0KKyAgeyAyOTI5LAkyLAkwLAkwLAkiVk1BU0tNT1ZEUVUiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MWY3YzAwMDQ1VUxMLCBJbXBsaWNpdExpc3QzNCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMjkyOSA9IFZNQVNLTU9WRFFVDQorICB7IDI5MzAsCTIsCTAsCTAsCSJWTUFTS01PVkRRVTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFmN2MwMDA0NVVMTCwgSW1wbGljaXRMaXN0MzUsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzI5MzAgPSBWTUFTS01PVkRRVTY0DQorICB7IDI5MzEsCTcsCTAsCTAsCSJWTUFTS01PVlBEWW1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUyZmMwMGQ0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNTIgfSwgIC8vIEluc3QgIzI5MzEgPSBWTUFTS01PVlBEWW1yDQorICB7IDI5MzIsCTcsCTEsCTAsCSJWTUFTS01PVlBEWXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MmRjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMyOTMyID0gVk1BU0tNT1ZQRFlybQ0KKyAgeyAyOTMzLAk3LAkwLAkwLAkiVk1BU0tNT1ZQRG1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUyZmMwMGQ0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNTMgfSwgIC8vIEluc3QgIzI5MzMgPSBWTUFTS01PVlBEbXINCisgIHsgMjkzNCwJNywJMSwJMCwJIlZNQVNLTU9WUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTJkYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjkzNCA9IFZNQVNLTU9WUERybQ0KKyAgeyAyOTM1LAk3LAkwLAkwLAkiVk1BU0tNT1ZQU1ltciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1MmVjMDBkNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjUyIH0sICAvLyBJbnN0ICMyOTM1ID0gVk1BU0tNT1ZQU1ltcg0KKyAgeyAyOTM2LAk3LAkxLAkwLAkiVk1BU0tNT1ZQU1lybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTJjYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjkzNiA9IFZNQVNLTU9WUFNZcm0NCisgIHsgMjkzNywJNywJMCwJMCwJIlZNQVNLTU9WUFNtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1MmVjMDBkNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjUzIH0sICAvLyBJbnN0ICMyOTM3ID0gVk1BU0tNT1ZQU21yDQorICB7IDI5MzgsCTcsCTEsCTAsCSJWTUFTS01PVlBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUyY2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI5MzggPSBWTUFTS01PVlBTcm0NCisgIHsgMjkzOSwJNywJMSwJMCwJIlZNQVhQRFlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVmODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjkzOSA9IFZNQVhQRFlybQ0KKyAgeyAyOTQwLAk3LAkxLAkwLAkiVk1BWFBEWXJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVmODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjk0MCA9IFZNQVhQRFlybV9JbnQNCisgIHsgMjk0MSwJMywJMSwJMCwJIlZNQVhQRFlyciIsIDAsIDB4NTVmODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjk0MSA9IFZNQVhQRFlycg0KKyAgeyAyOTQyLAkzLAkxLAkwLAkiVk1BWFBEWXJyX0ludCIsIDAsIDB4NTVmODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjk0MiA9IFZNQVhQRFlycl9JbnQNCisgIHsgMjk0MywJNywJMSwJMCwJIlZNQVhQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWY4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyOTQzID0gVk1BWFBEcm0NCisgIHsgMjk0NCwJNywJMSwJMCwJIlZNQVhQRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVmODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjk0NCA9IFZNQVhQRHJtX0ludA0KKyAgeyAyOTQ1LAkzLAkxLAkwLAkiVk1BWFBEcnIiLCAwLCAweDU1ZjgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI5NDUgPSBWTUFYUERycg0KKyAgeyAyOTQ2LAkzLAkxLAkwLAkiVk1BWFBEcnJfSW50IiwgMCwgMHg1NWY4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyOTQ2ID0gVk1BWFBEcnJfSW50DQorICB7IDI5NDcsCTcsCTEsCTAsCSJWTUFYUFNZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZjQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI5NDcgPSBWTUFYUFNZcm0NCisgIHsgMjk0OCwJNywJMSwJMCwJIlZNQVhQU1lybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZjQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI5NDggPSBWTUFYUFNZcm1fSW50DQorICB7IDI5NDksCTMsCTEsCTAsCSJWTUFYUFNZcnIiLCAwLCAweDU1ZjQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI5NDkgPSBWTUFYUFNZcnINCisgIHsgMjk1MCwJMywJMSwJMCwJIlZNQVhQU1lycl9JbnQiLCAwLCAweDU1ZjQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI5NTAgPSBWTUFYUFNZcnJfSW50DQorICB7IDI5NTEsCTcsCTEsCTAsCSJWTUFYUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVmNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjk1MSA9IFZNQVhQU3JtDQorICB7IDI5NTIsCTcsCTEsCTAsCSJWTUFYUFNybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZjQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI5NTIgPSBWTUFYUFNybV9JbnQNCisgIHsgMjk1MywJMywJMSwJMCwJIlZNQVhQU3JyIiwgMCwgMHg1NWY0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyOTUzID0gVk1BWFBTcnINCisgIHsgMjk1NCwJMywJMSwJMCwJIlZNQVhQU3JyX0ludCIsIDAsIDB4NTVmNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjk1NCA9IFZNQVhQU3JyX0ludA0KKyAgeyAyOTU1LAk3LAkxLAkwLAkiVk1BWFNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZjAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjQgfSwgIC8vIEluc3QgIzI5NTUgPSBWTUFYU0RybQ0KKyAgeyAyOTU2LAk3LAkxLAkwLAkiVk1BWFNEcm1fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWYwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyOTU2ID0gVk1BWFNEcm1fSW50DQorICB7IDI5NTcsCTMsCTEsCTAsCSJWTUFYU0RyciIsIDAsIDB4NTVmMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNSB9LCAgLy8gSW5zdCAjMjk1NyA9IFZNQVhTRHJyDQorICB7IDI5NTgsCTMsCTEsCTAsCSJWTUFYU0Rycl9JbnQiLCAwLCAweDU1ZjAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI5NTggPSBWTUFYU0Rycl9JbnQNCisgIHsgMjk1OSwJNywJMSwJMCwJIlZNQVhTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWYwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI2IH0sICAvLyBJbnN0ICMyOTU5ID0gVk1BWFNTcm0NCisgIHsgMjk2MCwJNywJMSwJMCwJIlZNQVhTU3JtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVmMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjk2MCA9IFZNQVhTU3JtX0ludA0KKyAgeyAyOTYxLAkzLAkxLAkwLAkiVk1BWFNTcnIiLCAwLCAweDU1ZjAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjcgfSwgIC8vIEluc3QgIzI5NjEgPSBWTUFYU1Nycg0KKyAgeyAyOTYyLAkzLAkxLAkwLAkiVk1BWFNTcnJfSW50IiwgMCwgMHg1NWYwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyOTYyID0gVk1BWFNTcnJfSW50DQorICB7IDI5NjMsCTAsCTAsCTAsCSJWTUNBTEwiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDAwMTIxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMyOTYzID0gVk1DQUxMDQorICB7IDI5NjQsCTUsCTAsCTAsCSJWTUNMRUFSbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGM3MDAwMTVlVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMyOTY0ID0gVk1DTEVBUm0NCisgIHsgMjk2NSwJNywJMSwJMCwJIlZNSU5QRFlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVkODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjk2NSA9IFZNSU5QRFlybQ0KKyAgeyAyOTY2LAk3LAkxLAkwLAkiVk1JTlBEWXJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVkODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMjk2NiA9IFZNSU5QRFlybV9JbnQNCisgIHsgMjk2NywJMywJMSwJMCwJIlZNSU5QRFlyciIsIDAsIDB4NTVkODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjk2NyA9IFZNSU5QRFlycg0KKyAgeyAyOTY4LAkzLAkxLAkwLAkiVk1JTlBEWXJyX0ludCIsIDAsIDB4NTVkODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMjk2OCA9IFZNSU5QRFlycl9JbnQNCisgIHsgMjk2OSwJNywJMSwJMCwJIlZNSU5QRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWQ4MDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyOTY5ID0gVk1JTlBEcm0NCisgIHsgMjk3MCwJNywJMSwJMCwJIlZNSU5QRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVkODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjk3MCA9IFZNSU5QRHJtX0ludA0KKyAgeyAyOTcxLAkzLAkxLAkwLAkiVk1JTlBEcnIiLCAwLCAweDU1ZDgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI5NzEgPSBWTUlOUERycg0KKyAgeyAyOTcyLAkzLAkxLAkwLAkiVk1JTlBEcnJfSW50IiwgMCwgMHg1NWQ4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyOTcyID0gVk1JTlBEcnJfSW50DQorICB7IDI5NzMsCTcsCTEsCTAsCSJWTUlOUFNZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZDQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI5NzMgPSBWTUlOUFNZcm0NCisgIHsgMjk3NCwJNywJMSwJMCwJIlZNSU5QU1lybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZDQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzI5NzQgPSBWTUlOUFNZcm1fSW50DQorICB7IDI5NzUsCTMsCTEsCTAsCSJWTUlOUFNZcnIiLCAwLCAweDU1ZDQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI5NzUgPSBWTUlOUFNZcnINCisgIHsgMjk3NiwJMywJMSwJMCwJIlZNSU5QU1lycl9JbnQiLCAwLCAweDU1ZDQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzI5NzYgPSBWTUlOUFNZcnJfSW50DQorICB7IDI5NzcsCTcsCTEsCTAsCSJWTUlOUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVkNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjk3NyA9IFZNSU5QU3JtDQorICB7IDI5NzgsCTcsCTEsCTAsCSJWTUlOUFNybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZDQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzI5NzggPSBWTUlOUFNybV9JbnQNCisgIHsgMjk3OSwJMywJMSwJMCwJIlZNSU5QU3JyIiwgMCwgMHg1NWQ0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyOTc5ID0gVk1JTlBTcnINCisgIHsgMjk4MCwJMywJMSwJMCwJIlZNSU5QU3JyX0ludCIsIDAsIDB4NTVkNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMjk4MCA9IFZNSU5QU3JyX0ludA0KKyAgeyAyOTgxLAk3LAkxLAkwLAkiVk1JTlNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1ZDAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjQgfSwgIC8vIEluc3QgIzI5ODEgPSBWTUlOU0RybQ0KKyAgeyAyOTgyLAk3LAkxLAkwLAkiVk1JTlNEcm1fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWQwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMyOTgyID0gVk1JTlNEcm1fSW50DQorICB7IDI5ODMsCTMsCTEsCTAsCSJWTUlOU0RyciIsIDAsIDB4NTVkMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNSB9LCAgLy8gSW5zdCAjMjk4MyA9IFZNSU5TRHJyDQorICB7IDI5ODQsCTMsCTEsCTAsCSJWTUlOU0Rycl9JbnQiLCAwLCAweDU1ZDAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzI5ODQgPSBWTUlOU0Rycl9JbnQNCisgIHsgMjk4NSwJNywJMSwJMCwJIlZNSU5TU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWQwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI2IH0sICAvLyBJbnN0ICMyOTg1ID0gVk1JTlNTcm0NCisgIHsgMjk4NiwJNywJMSwJMCwJIlZNSU5TU3JtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVkMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMjk4NiA9IFZNSU5TU3JtX0ludA0KKyAgeyAyOTg3LAkzLAkxLAkwLAkiVk1JTlNTcnIiLCAwLCAweDU1ZDAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjcgfSwgIC8vIEluc3QgIzI5ODcgPSBWTUlOU1Nycg0KKyAgeyAyOTg4LAkzLAkxLAkwLAkiVk1JTlNTcnJfSW50IiwgMCwgMHg1NWQwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMyOTg4ID0gVk1JTlNTcnJfSW50DQorICB7IDI5ODksCTAsCTAsCTAsCSJWTUxBVU5DSCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwMDAxMjJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzI5ODkgPSBWTUxBVU5DSA0KKyAgeyAyOTkwLAk2LAkwLAkwLAkiVk1PVkFQRFltciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDEyOTgwMDA0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNTQgfSwgIC8vIEluc3QgIzI5OTAgPSBWTU9WQVBEWW1yDQorICB7IDI5OTEsCTYsCTEsCTAsCSJWTU9WQVBEWXJtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4MTI4ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzNSB9LCAgLy8gSW5zdCAjMjk5MSA9IFZNT1ZBUERZcm0NCisgIHsgMjk5MiwJMiwJMSwJMCwJIlZNT1ZBUERZcnIiLCAwLCAweDEyODgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzI5OTIgPSBWTU9WQVBEWXJyDQorICB7IDI5OTMsCTYsCTAsCTAsCSJWTU9WQVBEbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxMjk4MDAwNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMyOTkzID0gVk1PVkFQRG1yDQorICB7IDI5OTQsCTYsCTEsCTAsCSJWTU9WQVBEcm0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKSwgMHgxMjg4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzI5OTQgPSBWTU9WQVBEcm0NCisgIHsgMjk5NSwJMiwJMSwJMCwJIlZNT1ZBUERyciIsIDAsIDB4MTI4ODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMyOTk1ID0gVk1PVkFQRHJyDQorICB7IDI5OTYsCTYsCTAsCTAsCSJWTU9WQVBTWW1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTI5NDAwMDA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI1NCB9LCAgLy8gSW5zdCAjMjk5NiA9IFZNT1ZBUFNZbXINCisgIHsgMjk5NywJNiwJMSwJMCwJIlZNT1ZBUFNZcm0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKSwgMHgxMjg0MDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMyOTk3ID0gVk1PVkFQU1lybQ0KKyAgeyAyOTk4LAkyLAkxLAkwLAkiVk1PVkFQU1lyciIsIDAsIDB4MTI4NDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzOSB9LCAgLy8gSW5zdCAjMjk5OCA9IFZNT1ZBUFNZcnINCisgIHsgMjk5OSwJNiwJMCwJMCwJIlZNT1ZBUFNtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDEyOTQwMDAwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzI5OTkgPSBWTU9WQVBTbXINCisgIHsgMzAwMCwJNiwJMSwJMCwJIlZNT1ZBUFNybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDEyODQwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzAwMCA9IFZNT1ZBUFNybQ0KKyAgeyAzMDAxLAkyLAkxLAkwLAkiVk1PVkFQU3JyIiwgMCwgMHgxMjg0MDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMwMDEgPSBWTU9WQVBTcnINCisgIHsgMzAwMiwJNiwJMSwJMCwJIlZNT1ZERFVQWXJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTEyODAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzNSB9LCAgLy8gSW5zdCAjMzAwMiA9IFZNT1ZERFVQWXJtDQorICB7IDMwMDMsCTIsCTEsCTAsCSJWTU9WRERVUFlyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDExMjgwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzMwMDMgPSBWTU9WRERVUFlycg0KKyAgeyAzMDA0LAk2LAkxLAkwLAkiVk1PVkREVVBybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTEyODAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMDA0ID0gVk1PVkREVVBybQ0KKyAgeyAzMDA1LAkyLAkxLAkwLAkiVk1PVkREVVByciIsIDAsIDB4MTEyODAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzMDA1ID0gVk1PVkREVVBycg0KKyAgeyAzMDA2LAk2LAkxLAkwLAkiVk1PVkRJMlBESXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNmU4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzMwMDYgPSBWTU9WREkyUERJcm0NCisgIHsgMzAwNywJMiwJMSwJMCwJIlZNT1ZESTJQRElyciIsIDAsIDB4MTZlODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NSB9LCAgLy8gSW5zdCAjMzAwNyA9IFZNT1ZESTJQRElycg0KKyAgeyAzMDA4LAk2LAkxLAkwLAkiVk1PVkRJMlNTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE2ZTgwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85MCB9LCAgLy8gSW5zdCAjMzAwOCA9IFZNT1ZESTJTU3JtDQorICB7IDMwMDksCTIsCTEsCTAsCSJWTU9WREkyU1NyciIsIDAsIDB4MTZlODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzk2IH0sICAvLyBJbnN0ICMzMDA5ID0gVk1PVkRJMlNTcnINCisgIHsgMzAxMCwJNiwJMCwJMCwJIlZNT1ZEUUFZbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTdmYzAwMDQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI1NCB9LCAgLy8gSW5zdCAjMzAxMCA9IFZNT1ZEUUFZbXINCisgIHsgMzAxMSwJNiwJMSwJMCwJIlZNT1ZEUUFZcm0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTZmYzAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzNSB9LCAgLy8gSW5zdCAjMzAxMSA9IFZNT1ZEUUFZcm0NCisgIHsgMzAxMiwJMiwJMSwJMCwJIlZNT1ZEUUFZcnIiLCAwLCAweDE2ZmMwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzMwMTIgPSBWTU9WRFFBWXJyDQorICB7IDMwMTMsCTYsCTAsCTAsCSJWTU9WRFFBbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTdmYzAwMDQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMzAxMyA9IFZNT1ZEUUFtcg0KKyAgeyAzMDE0LAk2LAkxLAkwLAkiVk1PVkRRQXJtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE2ZmMwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzAxNCA9IFZNT1ZEUUFybQ0KKyAgeyAzMDE1LAkyLAkxLAkwLAkiVk1PVkRRQXJyIiwgMCwgMHgxNmZjMDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMwMTUgPSBWTU9WRFFBcnINCisgIHsgMzAxNiwJNiwJMCwJMCwJIlZNT1ZEUVVZbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTdmYzAwYzA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI1NCB9LCAgLy8gSW5zdCAjMzAxNiA9IFZNT1ZEUVVZbXINCisgIHsgMzAxNywJNiwJMSwJMCwJIlZNT1ZEUVVZcm0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTZmYzAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzNSB9LCAgLy8gSW5zdCAjMzAxNyA9IFZNT1ZEUVVZcm0NCisgIHsgMzAxOCwJMiwJMSwJMCwJIlZNT1ZEUVVZcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNmZjMDBjNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM5IH0sICAvLyBJbnN0ICMzMDE4ID0gVk1PVkRRVVlycg0KKyAgeyAzMDE5LAk2LAkwLAkwLAkiVk1PVkRRVW1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE3ZmMwMGMwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzMwMTkgPSBWTU9WRFFVbXINCisgIHsgMzAyMCwJNiwJMCwJMCwJIlZNT1ZEUVVtcl9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTdmYzAwYzA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMzAyMCA9IFZNT1ZEUVVtcl9JbnQNCisgIHsgMzAyMSwJNiwJMSwJMCwJIlZNT1ZEUVVybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNmZjMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzMwMjEgPSBWTU9WRFFVcm0NCisgIHsgMzAyMiwJNiwJMSwJMCwJIlZNT1ZEUVVybV9JbnQiLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNmZjMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzMwMjIgPSBWTU9WRFFVcm1fSW50DQorICB7IDMwMjMsCTIsCTEsCTAsCSJWTU9WRFFVcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNmZjMDBjNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMwMjMgPSBWTU9WRFFVcnINCisgIHsgMzAyNCwJMywJMSwJMCwJIlZNT1ZITFBTcnIiLCAwLCAweDUxMjQwMDAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMwMjQgPSBWTU9WSExQU3JyDQorICB7IDMwMjUsCTYsCTAsCTAsCSJWTU9WSFBEbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxMTc4MDAwNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMzMDI1ID0gVk1PVkhQRG1yDQorICB7IDMwMjYsCTcsCTEsCTAsCSJWTU9WSFBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUxNjgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMwMjYgPSBWTU9WSFBEcm0NCisgIHsgMzAyNywJNiwJMCwJMCwJIlZNT1ZIUFNtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDExNzQwMDAwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzMwMjcgPSBWTU9WSFBTbXINCisgIHsgMzAyOCwJNywJMSwJMCwJIlZNT1ZIUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTE2NDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzAyOCA9IFZNT1ZIUFNybQ0KKyAgeyAzMDI5LAkzLAkxLAkwLAkiVk1PVkxIUFNyciIsIDAsIDB4NTE2NDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzAyOSA9IFZNT1ZMSFBTcnINCisgIHsgMzAzMCwJNiwJMCwJMCwJIlZNT1ZMUERtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDExMzgwMDA0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzMwMzAgPSBWTU9WTFBEbXINCisgIHsgMzAzMSwJNywJMSwJMCwJIlZNT1ZMUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTEyODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzAzMSA9IFZNT1ZMUERybQ0KKyAgeyAzMDMyLAk2LAkwLAkwLAkiVk1PVkxQU21yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTEzNDAwMDA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMzAzMiA9IFZNT1ZMUFNtcg0KKyAgeyAzMDMzLAk3LAkxLAkwLAkiVk1PVkxQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MTI0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMDMzID0gVk1PVkxQU3JtDQorICB7IDMwMzQsCTYsCTAsCTAsCSJWTU9WTFExMjhtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZDY4MDAwNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMzMDM0ID0gVk1PVkxRMTI4bXINCisgIHsgMzAzNSwJMiwJMSwJMCwJIlZNT1ZNU0tQRFlyNjRyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTUwODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI1NSB9LCAgLy8gSW5zdCAjMzAzNSA9IFZNT1ZNU0tQRFlyNjRyDQorICB7IDMwMzYsCTIsCTEsCTAsCSJWTU9WTVNLUERZcnIiLCAwLCAweDE1MDgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNTYgfSwgIC8vIEluc3QgIzMwMzYgPSBWTU9WTVNLUERZcnINCisgIHsgMzAzNywJMiwJMSwJMCwJIlZNT1ZNU0tQRHI2NHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNTA4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODkgfSwgIC8vIEluc3QgIzMwMzcgPSBWTU9WTVNLUERyNjRyDQorICB7IDMwMzgsCTIsCTEsCTAsCSJWTU9WTVNLUERyciIsIDAsIDB4MTUwODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzMSB9LCAgLy8gSW5zdCAjMzAzOCA9IFZNT1ZNU0tQRHJyDQorICB7IDMwMzksCTIsCTEsCTAsCSJWTU9WTVNLUFNZcjY0ciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE1MDQwMDAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNTUgfSwgIC8vIEluc3QgIzMwMzkgPSBWTU9WTVNLUFNZcjY0cg0KKyAgeyAzMDQwLAkyLAkxLAkwLAkiVk1PVk1TS1BTWXJyIiwgMCwgMHgxNTA0MDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjU2IH0sICAvLyBJbnN0ICMzMDQwID0gVk1PVk1TS1BTWXJyDQorICB7IDMwNDEsCTIsCTEsCTAsCSJWTU9WTVNLUFNyNjRyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTUwNDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzg5IH0sICAvLyBJbnN0ICMzMDQxID0gVk1PVk1TS1BTcjY0cg0KKyAgeyAzMDQyLAkyLAkxLAkwLAkiVk1PVk1TS1BTcnIiLCAwLCAweDE1MDQwMDAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzEgfSwgIC8vIEluc3QgIzMwNDIgPSBWTU9WTVNLUFNycg0KKyAgeyAzMDQzLAk2LAkxLAkwLAkiVk1PVk5URFFBcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEyYWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzA0MyA9IFZNT1ZOVERRQXJtDQorICB7IDMwNDQsCTYsCTAsCTAsCSJWTU9WTlREUVlfNjRtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDFlNzgwMDA0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNTQgfSwgIC8vIEluc3QgIzMwNDQgPSBWTU9WTlREUVlfNjRtcg0KKyAgeyAzMDQ1LAk2LAkwLAkwLAkiVk1PVk5URFFZbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxZTdjMDAwNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjU0IH0sICAvLyBJbnN0ICMzMDQ1ID0gVk1PVk5URFFZbXINCisgIHsgMzA0NiwJNiwJMCwJMCwJIlZNT1ZOVERRXzY0bXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxZTc4MDAwNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMzMDQ2ID0gVk1PVk5URFFfNjRtcg0KKyAgeyAzMDQ3LAk2LAkwLAkwLAkiVk1PVk5URFFtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDFlN2MwMDA0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzMwNDcgPSBWTU9WTlREUW1yDQorICB7IDMwNDgsCTYsCTAsCTAsCSJWTU9WTlREUW1yX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZTdjMDAwNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMzMDQ4ID0gVk1PVk5URFFtcl9JbnQNCisgIHsgMzA0OSwJNiwJMCwJMCwJIlZNT1ZOVFBEWW1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTJiODAwMDQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI1NCB9LCAgLy8gSW5zdCAjMzA0OSA9IFZNT1ZOVFBEWW1yDQorICB7IDMwNTAsCTYsCTAsCTAsCSJWTU9WTlRQRG1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTJiODAwMDQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMzA1MCA9IFZNT1ZOVFBEbXINCisgIHsgMzA1MSwJNiwJMCwJMCwJIlZNT1ZOVFBEbXJfSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEyYjgwMDA0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzMwNTEgPSBWTU9WTlRQRG1yX0ludA0KKyAgeyAzMDUyLAk2LAkwLAkwLAkiVk1PVk5UUFNZbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxMmI0MDAwMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjU0IH0sICAvLyBJbnN0ICMzMDUyID0gVk1PVk5UUFNZbXINCisgIHsgMzA1MywJNiwJMCwJMCwJIlZNT1ZOVFBTbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxMmI0MDAwMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMzMDUzID0gVk1PVk5UUFNtcg0KKyAgeyAzMDU0LAk2LAkwLAkwLAkiVk1PVk5UUFNtcl9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTJiNDAwMDA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMzA1NCA9IFZNT1ZOVFBTbXJfSW50DQorICB7IDMwNTUsCTYsCTAsCTAsCSJWTU9WUERJMkRJbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxN2U4MDAwNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMzMDU1ID0gVk1PVlBESTJESW1yDQorICB7IDMwNTYsCTIsCTEsCTAsCSJWTU9WUERJMkRJcnIiLCAwLCAweDE3ZTgwMDA0M1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzEgfSwgIC8vIEluc3QgIzMwNTYgPSBWTU9WUERJMkRJcnINCisgIHsgMzA1NywJNiwJMCwJMCwJIlZNT1ZQUUkyUUltciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDFkNjgwMDA0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzMwNTcgPSBWTU9WUFFJMlFJbXINCisgIHsgMzA1OCwJNiwJMSwJMCwJIlZNT1ZRSTJQUUlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTdlMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMDU4ID0gVk1PVlFJMlBRSXJtDQorICB7IDMwNTksCTIsCTEsCTAsCSJWTU9WUWQ2NHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzdlODAwMDQzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzg5IH0sICAvLyBJbnN0ICMzMDU5ID0gVk1PVlFkNjRycg0KKyAgeyAzMDYwLAkyLAkxLAkwLAkiVk1PVlFkNjRycl9hbHQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzN2U4MDAwNDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODkgfSwgIC8vIEluc3QgIzMwNjAgPSBWTU9WUWQ2NHJyX2FsdA0KKyAgeyAzMDYxLAkyLAkxLAkwLAkiVk1PVlFzNjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDM2ZTgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODAgfSwgIC8vIEluc3QgIzMwNjEgPSBWTU9WUXM2NHJyDQorICB7IDMwNjIsCTIsCTEsCTAsCSJWTU9WUXhyeHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxN2UwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMwNjIgPSBWTU9WUXhyeHINCisgIHsgMzA2MywJNiwJMCwJMCwJIlZNT1ZTRG1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTExMDAwYjA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NiB9LCAgLy8gSW5zdCAjMzA2MyA9IFZNT1ZTRG1yDQorICB7IDMwNjQsCTYsCTEsCTAsCSJWTU9WU0RybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDExMDAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85MiB9LCAgLy8gSW5zdCAjMzA2NCA9IFZNT1ZTRHJtDQorICB7IDMwNjUsCTMsCTEsCTAsCSJWTU9WU0RyciIsIDAsIDB4NTEwMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI1NyB9LCAgLy8gSW5zdCAjMzA2NSA9IFZNT1ZTRHJyDQorICB7IDMwNjYsCTYsCTEsCTAsCSJWTU9WU0hEVVBZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMTY0MDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMzMDY2ID0gVk1PVlNIRFVQWXJtDQorICB7IDMwNjcsCTIsCTEsCTAsCSJWTU9WU0hEVVBZcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMTY0MDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM5IH0sICAvLyBJbnN0ICMzMDY3ID0gVk1PVlNIRFVQWXJyDQorICB7IDMwNjgsCTYsCTEsCTAsCSJWTU9WU0hEVVBybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTE2NDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMDY4ID0gVk1PVlNIRFVQcm0NCisgIHsgMzA2OSwJMiwJMSwJMCwJIlZNT1ZTSERVUHJyIiwgMCwgMHgxMTY0MDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMwNjkgPSBWTU9WU0hEVVBycg0KKyAgeyAzMDcwLAk2LAkxLAkwLAkiVk1PVlNMRFVQWXJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTEyNDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzNSB9LCAgLy8gSW5zdCAjMzA3MCA9IFZNT1ZTTERVUFlybQ0KKyAgeyAzMDcxLAkyLAkxLAkwLAkiVk1PVlNMRFVQWXJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTEyNDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzOSB9LCAgLy8gSW5zdCAjMzA3MSA9IFZNT1ZTTERVUFlycg0KKyAgeyAzMDcyLAk2LAkxLAkwLAkiVk1PVlNMRFVQcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDExMjQwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzA3MiA9IFZNT1ZTTERVUHJtDQorICB7IDMwNzMsCTIsCTEsCTAsCSJWTU9WU0xEVVByciIsIDAsIDB4MTEyNDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzMDczID0gVk1PVlNMRFVQcnINCisgIHsgMzA3NCwJNiwJMCwJMCwJIlZNT1ZTUzJESW1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTdlODAwMDQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4OCB9LCAgLy8gSW5zdCAjMzA3NCA9IFZNT1ZTUzJESW1yDQorICB7IDMwNzUsCTIsCTEsCTAsCSJWTU9WU1MyRElyciIsIDAsIDB4MTdlODAwMDQzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzk5IH0sICAvLyBJbnN0ICMzMDc1ID0gVk1PVlNTMkRJcnINCisgIHsgMzA3NiwJNiwJMCwJMCwJIlZNT1ZTU21yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTExMDAwYzA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4OCB9LCAgLy8gSW5zdCAjMzA3NiA9IFZNT1ZTU21yDQorICB7IDMwNzcsCTYsCTEsCTAsCSJWTU9WU1NybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDExMDAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm85MCB9LCAgLy8gSW5zdCAjMzA3NyA9IFZNT1ZTU3JtDQorICB7IDMwNzgsCTMsCTEsCTAsCSJWTU9WU1NyciIsIDAsIDB4NTEwMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI1OCB9LCAgLy8gSW5zdCAjMzA3OCA9IFZNT1ZTU3JyDQorICB7IDMwNzksCTYsCTAsCTAsCSJWTU9WVVBEWW1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTExODAwMDQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI1NCB9LCAgLy8gSW5zdCAjMzA3OSA9IFZNT1ZVUERZbXINCisgIHsgMzA4MCwJNiwJMSwJMCwJIlZNT1ZVUERZcm0iLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMTA4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMzMDgwID0gVk1PVlVQRFlybQ0KKyAgeyAzMDgxLAkyLAkxLAkwLAkiVk1PVlVQRFlyciIsIDAsIDB4MTEwODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzOSB9LCAgLy8gSW5zdCAjMzA4MSA9IFZNT1ZVUERZcnINCisgIHsgMzA4MiwJNiwJMCwJMCwJIlZNT1ZVUERtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDExMTgwMDA0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODQgfSwgIC8vIEluc3QgIzMwODIgPSBWTU9WVVBEbXINCisgIHsgMzA4MywJNiwJMCwJMCwJIlZNT1ZVUERtcl9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTExODAwMDQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMzA4MyA9IFZNT1ZVUERtcl9JbnQNCisgIHsgMzA4NCwJNiwJMSwJMCwJIlZNT1ZVUERybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDExMDgwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzA4NCA9IFZNT1ZVUERybQ0KKyAgeyAzMDg1LAk2LAkxLAkwLAkiVk1PVlVQRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTEwODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMDg1ID0gVk1PVlVQRHJtX0ludA0KKyAgeyAzMDg2LAkyLAkxLAkwLAkiVk1PVlVQRHJyIiwgMCwgMHgxMTA4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMwODYgPSBWTU9WVVBEcnINCisgIHsgMzA4NywJNiwJMCwJMCwJIlZNT1ZVUFNZbXIiLCAwfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHgxMTE0MDAwMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjU0IH0sICAvLyBJbnN0ICMzMDg3ID0gVk1PVlVQU1ltcg0KKyAgeyAzMDg4LAk2LAkxLAkwLAkiVk1PVlVQU1lybSIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpLCAweDExMDQwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzUgfSwgIC8vIEluc3QgIzMwODggPSBWTU9WVVBTWXJtDQorICB7IDMwODksCTIsCTEsCTAsCSJWTU9WVVBTWXJyIiwgMCwgMHgxMTA0MDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM5IH0sICAvLyBJbnN0ICMzMDg5ID0gVk1PVlVQU1lycg0KKyAgeyAzMDkwLAk2LAkwLAkwLAkiVk1PVlVQU21yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MTExNDAwMDA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE4NCB9LCAgLy8gSW5zdCAjMzA5MCA9IFZNT1ZVUFNtcg0KKyAgeyAzMDkxLAk2LAkwLAkwLAkiVk1PVlVQU21yX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMTE0MDAwMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTg0IH0sICAvLyBJbnN0ICMzMDkxID0gVk1PVlVQU21yX0ludA0KKyAgeyAzMDkyLAk2LAkxLAkwLAkiVk1PVlVQU3JtIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4MTEwNDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMDkyID0gVk1PVlVQU3JtDQorICB7IDMwOTMsCTYsCTEsCTAsCSJWTU9WVVBTcm1fSW50IiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSksIDB4MTEwNDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMDkzID0gVk1PVlVQU3JtX0ludA0KKyAgeyAzMDk0LAkyLAkxLAkwLAkiVk1PVlVQU3JyIiwgMCwgMHgxMTA0MDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMwOTQgPSBWTU9WVVBTcnINCisgIHsgMzA5NSwJNiwJMSwJMCwJIlZNT1ZaREkyUERJcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE2ZTgwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzA5NSA9IFZNT1ZaREkyUERJcm0NCisgIHsgMzA5NiwJMiwJMSwJMCwJIlZNT1ZaREkyUERJcnIiLCAwLCAweDE2ZTgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xODUgfSwgIC8vIEluc3QgIzMwOTYgPSBWTU9WWkRJMlBESXJyDQorICB7IDMwOTcsCTYsCTEsCTAsCSJWTU9WWlBRSUxvMlBRSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxN2UwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzMwOTcgPSBWTU9WWlBRSUxvMlBRSXJtDQorICB7IDMwOTgsCTIsCTEsCTAsCSJWTU9WWlBRSUxvMlBRSXJyIiwgMCwgMHgxN2UwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMwOTggPSBWTU9WWlBRSUxvMlBRSXJyDQorICB7IDMwOTksCTYsCTEsCTAsCSJWTU9WWlFJMlBRSXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxN2UwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzMwOTkgPSBWTU9WWlFJMlBRSXJtDQorICB7IDMxMDAsCTIsCTEsCTAsCSJWTU9WWlFJMlBRSXJyIiwgMCwgMHgzNmU4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTgwIH0sICAvLyBJbnN0ICMzMTAwID0gVk1PVlpRSTJQUUlycg0KKyAgeyAzMTAxLAk4LAkxLAkwLAkiVk1QU0FEQldybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU0MmMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzQgfSwgIC8vIEluc3QgIzMxMDEgPSBWTVBTQURCV3JtaQ0KKyAgeyAzMTAyLAk0LAkxLAkwLAkiVk1QU0FEQldycmkiLCAwLCAweDU0MmMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjMzEwMiA9IFZNUFNBREJXcnJpDQorICB7IDMxMDMsCTUsCTAsCTAsCSJWTVBUUkxEbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGM3MDAwMTFlVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzM0IH0sICAvLyBJbnN0ICMzMTAzID0gVk1QVFJMRG0NCisgIHsgMzEwNCwJNSwJMSwJMCwJIlZNUFRSU1RtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzcwMDAxMWZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzMxMDQgPSBWTVBUUlNUbQ0KKyAgeyAzMTA1LAk2LAkxLAkwLAkiVk1SRUFEMzJybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc4MDAwMTA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE1IH0sICAvLyBJbnN0ICMzMTA1ID0gVk1SRUFEMzJybQ0KKyAgeyAzMTA2LAkyLAkxLAkwLAkiVk1SRUFEMzJyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc4MDAwMTAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU2IH0sICAvLyBJbnN0ICMzMTA2ID0gVk1SRUFEMzJycg0KKyAgeyAzMTA3LAk2LAkxLAkwLAkiVk1SRUFENjRybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc4MDAwMTA0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE5IH0sICAvLyBJbnN0ICMzMTA3ID0gVk1SRUFENjRybQ0KKyAgeyAzMTA4LAkyLAkxLAkwLAkiVk1SRUFENjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc4MDAwMTAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICMzMTA4ID0gVk1SRUFENjRycg0KKyAgeyAzMTA5LAkwLAkwLAkwLAkiVk1SRVNVTUUiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDAwMTIzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMzMTA5ID0gVk1SRVNVTUUNCisgIHsgMzExMCwJNywJMSwJMCwJIlZNVUxQRFlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTU5ODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMzExMCA9IFZNVUxQRFlybQ0KKyAgeyAzMTExLAkzLAkxLAkwLAkiVk1VTFBEWXJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NTk4MDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMzMTExID0gVk1VTFBEWXJyDQorICB7IDMxMTIsCTcsCTEsCTAsCSJWTVVMUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTU5ODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzExMiA9IFZNVUxQRHJtDQorICB7IDMxMTMsCTMsCTEsCTAsCSJWTVVMUERyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTU5ODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzExMyA9IFZNVUxQRHJyDQorICB7IDMxMTQsCTcsCTEsCTAsCSJWTVVMUFNZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1OTQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzMxMTQgPSBWTVVMUFNZcm0NCisgIHsgMzExNSwJMywJMSwJMCwJIlZNVUxQU1lyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTU5NDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMzExNSA9IFZNVUxQU1lycg0KKyAgeyAzMTE2LAk3LAkxLAkwLAkiVk1VTFBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1OTQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxMTYgPSBWTVVMUFNybQ0KKyAgeyAzMTE3LAkzLAkxLAkwLAkiVk1VTFBTcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU1OTQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxMTcgPSBWTVVMUFNycg0KKyAgeyAzMTE4LAk3LAkxLAkwLAkiVk1VTFNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1OTAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjQgfSwgIC8vIEluc3QgIzMxMTggPSBWTVVMU0RybQ0KKyAgeyAzMTE5LAk3LAkxLAkwLAkiVk1VTFNEcm1fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTkwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMTE5ID0gVk1VTFNEcm1fSW50DQorICB7IDMxMjAsCTMsCTEsCTAsCSJWTVVMU0RyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTU5MDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNSB9LCAgLy8gSW5zdCAjMzEyMCA9IFZNVUxTRHJyDQorICB7IDMxMjEsCTMsCTEsCTAsCSJWTVVMU0Rycl9JbnQiLCAwLCAweDU1OTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxMjEgPSBWTVVMU0Rycl9JbnQNCisgIHsgMzEyMiwJNywJMSwJMCwJIlZNVUxTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTkwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI2IH0sICAvLyBJbnN0ICMzMTIyID0gVk1VTFNTcm0NCisgIHsgMzEyMywJNywJMSwJMCwJIlZNVUxTU3JtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTU5MDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzEyMyA9IFZNVUxTU3JtX0ludA0KKyAgeyAzMTI0LAkzLAkxLAkwLAkiVk1VTFNTcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU1OTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjcgfSwgIC8vIEluc3QgIzMxMjQgPSBWTVVMU1Nycg0KKyAgeyAzMTI1LAkzLAkxLAkwLAkiVk1VTFNTcnJfSW50IiwgMCwgMHg1NTkwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMTI1ID0gVk1VTFNTcnJfSW50DQorICB7IDMxMjYsCTYsCTEsCTAsCSJWTVdSSVRFMzJybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5MDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU1IH0sICAvLyBJbnN0ICMzMTI2ID0gVk1XUklURTMycm0NCisgIHsgMzEyNywJMiwJMSwJMCwJIlZNV1JJVEUzMnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NzkwMDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTYgfSwgIC8vIEluc3QgIzMxMjcgPSBWTVdSSVRFMzJycg0KKyAgeyAzMTI4LAk2LAkxLAkwLAkiVk1XUklURTY0cm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg3OTAwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NyB9LCAgLy8gSW5zdCAjMzEyOCA9IFZNV1JJVEU2NHJtDQorICB7IDMxMjksCTIsCTEsCTAsCSJWTVdSSVRFNjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDc5MDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICMzMTI5ID0gVk1XUklURTY0cnINCisgIHsgMzEzMCwJMCwJMCwJMCwJIlZNWE9GRiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwMDAxMjRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzMxMzAgPSBWTVhPRkYNCisgIHsgMzEzMSwJNSwJMCwJMCwJIlZNWE9OIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzcwMDBjMWVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzMxMzEgPSBWTVhPTg0KKyAgeyAzMTMyLAk3LAkxLAkwLAkiVk9SUERZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTY4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMzMTMyID0gVk9SUERZcm0NCisgIHsgMzEzMywJMywJMSwJMCwJIlZPUlBEWXJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU2ODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMzEzMyA9IFZPUlBEWXJyDQorICB7IDMxMzQsCTcsCTEsCTAsCSJWT1JQRHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU2ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzEzNCA9IFZPUlBEcm0NCisgIHsgMzEzNSwJMywJMSwJMCwJIlZPUlBEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTY4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMTM1ID0gVk9SUERycg0KKyAgeyAzMTM2LAk3LAkxLAkwLAkiVk9SUFNZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTY0MDAwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMzMTM2ID0gVk9SUFNZcm0NCisgIHsgMzEzNywJMywJMSwJMCwJIlZPUlBTWXJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU2NDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMzEzNyA9IFZPUlBTWXJyDQorICB7IDMxMzgsCTcsCTEsCTAsCSJWT1JQU3JtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU2NDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzEzOCA9IFZPUlBTcm0NCisgIHsgMzEzOSwJMywJMSwJMCwJIlZPUlBTcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTY0MDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMTM5ID0gVk9SUFNycg0KKyAgeyAzMTQwLAk2LAkxLAkwLAkiVlBBQlNCcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDExY2MwMmQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzE0MCA9IFZQQUJTQnJtMTI4DQorICB7IDMxNDEsCTYsCTEsCTAsCSJWUEFCU0JybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMWNjMDJkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTI3IH0sICAvLyBJbnN0ICMzMTQxID0gVlBBQlNCcm02NA0KKyAgeyAzMTQyLAkyLAkxLAkwLAkiVlBBQlNCcnIxMjgiLCAwLCAweDExY2MwMmQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzE0MiA9IFZQQUJTQnJyMTI4DQorICB7IDMxNDMsCTIsCTEsCTAsCSJWUEFCU0JycjY0IiwgMCwgMHgxMWNjMDJkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQxIH0sICAvLyBJbnN0ICMzMTQzID0gVlBBQlNCcnI2NA0KKyAgeyAzMTQ0LAk2LAkxLAkwLAkiVlBBQlNEcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDExZWMwMmQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzE0NCA9IFZQQUJTRHJtMTI4DQorICB7IDMxNDUsCTYsCTEsCTAsCSJWUEFCU0RybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMWVjMDJkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTI3IH0sICAvLyBJbnN0ICMzMTQ1ID0gVlBBQlNEcm02NA0KKyAgeyAzMTQ2LAkyLAkxLAkwLAkiVlBBQlNEcnIxMjgiLCAwLCAweDExZWMwMmQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzE0NiA9IFZQQUJTRHJyMTI4DQorICB7IDMxNDcsCTIsCTEsCTAsCSJWUEFCU0RycjY0IiwgMCwgMHgxMWVjMDJkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQxIH0sICAvLyBJbnN0ICMzMTQ3ID0gVlBBQlNEcnI2NA0KKyAgeyAzMTQ4LAk2LAkxLAkwLAkiVlBBQlNXcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDExZGMwMmQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzE0OCA9IFZQQUJTV3JtMTI4DQorICB7IDMxNDksCTYsCTEsCTAsCSJWUEFCU1dybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMWRjMDJkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTI3IH0sICAvLyBJbnN0ICMzMTQ5ID0gVlBBQlNXcm02NA0KKyAgeyAzMTUwLAkyLAkxLAkwLAkiVlBBQlNXcnIxMjgiLCAwLCAweDExZGMwMmQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzE1MCA9IFZQQUJTV3JyMTI4DQorICB7IDMxNTEsCTIsCTEsCTAsCSJWUEFCU1dycjY0IiwgMCwgMHgxMWRjMDJkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQxIH0sICAvLyBJbnN0ICMzMTUxID0gVlBBQlNXcnI2NA0KKyAgeyAzMTUyLAk3LAkxLAkwLAkiVlBBQ0tTU0RXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU2YmMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxNTIgPSBWUEFDS1NTRFdybQ0KKyAgeyAzMTUzLAkzLAkxLAkwLAkiVlBBQ0tTU0RXcnIiLCAwLCAweDU2YmMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxNTMgPSBWUEFDS1NTRFdycg0KKyAgeyAzMTU0LAk3LAkxLAkwLAkiVlBBQ0tTU1dCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU2M2MwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxNTQgPSBWUEFDS1NTV0JybQ0KKyAgeyAzMTU1LAkzLAkxLAkwLAkiVlBBQ0tTU1dCcnIiLCAwLCAweDU2M2MwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxNTUgPSBWUEFDS1NTV0Jycg0KKyAgeyAzMTU2LAk3LAkxLAkwLAkiVlBBQ0tVU0RXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUyYmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxNTYgPSBWUEFDS1VTRFdybQ0KKyAgeyAzMTU3LAkzLAkxLAkwLAkiVlBBQ0tVU0RXcnIiLCAwLCAweDUyYmMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxNTcgPSBWUEFDS1VTRFdycg0KKyAgeyAzMTU4LAk3LAkxLAkwLAkiVlBBQ0tVU1dCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU2N2MwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxNTggPSBWUEFDS1VTV0JybQ0KKyAgeyAzMTU5LAkzLAkxLAkwLAkiVlBBQ0tVU1dCcnIiLCAwLCAweDU2N2MwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxNTkgPSBWUEFDS1VTV0Jycg0KKyAgeyAzMTYwLAk3LAkxLAkwLAkiVlBBRERCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVmY2MwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxNjAgPSBWUEFEREJybQ0KKyAgeyAzMTYxLAkzLAkxLAkwLAkiVlBBRERCcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDVmY2MwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxNjEgPSBWUEFEREJycg0KKyAgeyAzMTYyLAk3LAkxLAkwLAkiVlBBREREcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVmZWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxNjIgPSBWUEFERERybQ0KKyAgeyAzMTYzLAkzLAkxLAkwLAkiVlBBREREcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDVmZWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxNjMgPSBWUEFERERycg0KKyAgeyAzMTY0LAk3LAkxLAkwLAkiVlBBRERRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVkNGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxNjQgPSBWUEFERFFybQ0KKyAgeyAzMTY1LAkzLAkxLAkwLAkiVlBBRERRcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDVkNGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxNjUgPSBWUEFERFFycg0KKyAgeyAzMTY2LAk3LAkxLAkwLAkiVlBBRERTQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZWNjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMTY2ID0gVlBBRERTQnJtDQorICB7IDMxNjcsCTMsCTEsCTAsCSJWUEFERFNCcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDVlY2MwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxNjcgPSBWUEFERFNCcnINCisgIHsgMzE2OCwJNywJMSwJMCwJIlZQQUREU1dybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWVkYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzE2OCA9IFZQQUREU1dybQ0KKyAgeyAzMTY5LAkzLAkxLAkwLAkiVlBBRERTV3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZWRjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMTY5ID0gVlBBRERTV3JyDQorICB7IDMxNzAsCTcsCTEsCTAsCSJWUEFERFVTQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZGNjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMTcwID0gVlBBRERVU0JybQ0KKyAgeyAzMTcxLAkzLAkxLAkwLAkiVlBBRERVU0JyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NWRjYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzE3MSA9IFZQQUREVVNCcnINCisgIHsgMzE3MiwJNywJMSwJMCwJIlZQQUREVVNXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVkZGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxNzIgPSBWUEFERFVTV3JtDQorICB7IDMxNzMsCTMsCTEsCTAsCSJWUEFERFVTV3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZGRjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMTczID0gVlBBRERVU1dycg0KKyAgeyAzMTc0LAk3LAkxLAkwLAkiVlBBRERXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVmZGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxNzQgPSBWUEFERFdybQ0KKyAgeyAzMTc1LAkzLAkxLAkwLAkiVlBBRERXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDVmZGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxNzUgPSBWUEFERFdycg0KKyAgeyAzMTc2LAk4LAkxLAkwLAkiVlBBTElHTlIxMjhybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUwZmMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzQgfSwgIC8vIEluc3QgIzMxNzYgPSBWUEFMSUdOUjEyOHJtDQorICB7IDMxNzcsCTQsCTEsCTAsCSJWUEFMSUdOUjEyOHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTBmYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMzMTc3ID0gVlBBTElHTlIxMjhycg0KKyAgeyAzMTc4LAk4LAkxLAkwLAkiVlBBTElHTlI2NHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTBmYzAyZTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI1OSB9LCAgLy8gSW5zdCAjMzE3OCA9IFZQQUxJR05SNjRybQ0KKyAgeyAzMTc5LAk0LAkxLAkwLAkiVlBBTElHTlI2NHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTBmYzAyZTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc3IH0sICAvLyBJbnN0ICMzMTc5ID0gVlBBTElHTlI2NHJyDQorICB7IDMxODAsCTcsCTEsCTAsCSJWUEFORE5ybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWRmYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzE4MCA9IFZQQU5ETnJtDQorICB7IDMxODEsCTMsCTEsCTAsCSJWUEFORE5yciIsIDAsIDB4NWRmYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzE4MSA9IFZQQU5ETnJyDQorICB7IDMxODIsCTcsCTEsCTAsCSJWUEFORHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZGJjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMTgyID0gVlBBTkRybQ0KKyAgeyAzMTgzLAkzLAkxLAkwLAkiVlBBTkRyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NWRiYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzE4MyA9IFZQQU5EcnINCisgIHsgMzE4NCwJNywJMSwJMCwJIlZQQVZHQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZTBjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMTg0ID0gVlBBVkdCcm0NCisgIHsgMzE4NSwJMywJMSwJMCwJIlZQQVZHQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZTBjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMTg1ID0gVlBBVkdCcnINCisgIHsgMzE4NiwJNywJMSwJMCwJIlZQQVZHV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZTNjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMTg2ID0gVlBBVkdXcm0NCisgIHsgMzE4NywJMywJMSwJMCwJIlZQQVZHV3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZTNjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMTg3ID0gVlBBVkdXcnINCisgIHsgMzE4OCwJOCwJMSwJMCwJIlZQQkxFTkRWQnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHhkNGNjMDBlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjMzIH0sICAvLyBJbnN0ICMzMTg4ID0gVlBCTEVORFZCcm0NCisgIHsgMzE4OSwJNCwJMSwJMCwJIlZQQkxFTkRWQnJyIiwgMCwgMHhkNGNjMDBlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM0IH0sICAvLyBJbnN0ICMzMTg5ID0gVlBCTEVORFZCcnINCisgIHsgMzE5MCwJOCwJMSwJMCwJIlZQQkxFTkRXcm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MGVjMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM0IH0sICAvLyBJbnN0ICMzMTkwID0gVlBCTEVORFdybWkNCisgIHsgMzE5MSwJNCwJMSwJMCwJIlZQQkxFTkRXcnJpIiwgMCwgMHg1MGVjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNzggfSwgIC8vIEluc3QgIzMxOTEgPSBWUEJMRU5EV3JyaQ0KKyAgeyAzMTkyLAk3LAkxLAkwLAkiVlBDTE1VTEhRSFFEUXJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxOTIgPSBWUENMTVVMSFFIUURRcm0NCisgIHsgMzE5MywJMywJMSwJMCwJIlZQQ0xNVUxIUUhRRFFyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMTkzID0gVlBDTE1VTEhRSFFEUXJyDQorICB7IDMxOTQsCTcsCTEsCTAsCSJWUENMTVVMSFFMUURRcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzE5NCA9IFZQQ0xNVUxIUUxRRFFybQ0KKyAgeyAzMTk1LAkzLAkxLAkwLAkiVlBDTE1VTEhRTFFEUXJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMxOTUgPSBWUENMTVVMSFFMUURRcnINCisgIHsgMzE5NiwJNywJMSwJMCwJIlZQQ0xNVUxMUUhRRFFybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMTk2ID0gVlBDTE1VTExRSFFEUXJtDQorICB7IDMxOTcsCTMsCTEsCTAsCSJWUENMTVVMTFFIUURRcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzE5NyA9IFZQQ0xNVUxMUUhRRFFycg0KKyAgeyAzMTk4LAk3LAkxLAkwLAkiVlBDTE1VTExRTFFEUXJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMxOTggPSBWUENMTVVMTFFMUURRcm0NCisgIHsgMzE5OSwJMywJMSwJMCwJIlZQQ0xNVUxMUUxRRFFyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMTk5ID0gVlBDTE1VTExRTFFEUXJyDQorICB7IDMyMDAsCTgsCTEsCTAsCSJWUENMTVVMUURRcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NDRjMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM0IH0sICAvLyBJbnN0ICMzMjAwID0gVlBDTE1VTFFEUXJtDQorICB7IDMyMDEsCTQsCTEsCTAsCSJWUENMTVVMUURRcnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NDRjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNzggfSwgIC8vIEluc3QgIzMyMDEgPSBWUENMTVVMUURRcnINCisgIHsgMzIwMiwJNywJMSwJMCwJIlZQQ01QRVFCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU3NGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMyMDIgPSBWUENNUEVRQnJtDQorICB7IDMyMDMsCTMsCTEsCTAsCSJWUENNUEVRQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NzRjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMjAzID0gVlBDTVBFUUJycg0KKyAgeyAzMjA0LAk3LAkxLAkwLAkiVlBDTVBFUURybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTc2YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzIwNCA9IFZQQ01QRVFEcm0NCisgIHsgMzIwNSwJMywJMSwJMCwJIlZQQ01QRVFEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU3NmMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMyMDUgPSBWUENNUEVRRHJyDQorICB7IDMyMDYsCTcsCTEsCTAsCSJWUENNUEVRUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MjljMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMjA2ID0gVlBDTVBFUVFybQ0KKyAgeyAzMjA3LAkzLAkxLAkwLAkiVlBDTVBFUVFyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTI5YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzIwNyA9IFZQQ01QRVFRcnINCisgIHsgMzIwOCwJNywJMSwJMCwJIlZQQ01QRVFXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU3NWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMyMDggPSBWUENNUEVRV3JtDQorICB7IDMyMDksCTMsCTEsCTAsCSJWUENNUEVRV3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NzVjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMjA5ID0gVlBDTVBFUVdycg0KKyAgeyAzMjEwLAk3LAkwLAkwLAkiVlBDTVBFU1RSSUFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTYxYzAyZTQ2VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMzIxMCA9IFZQQ01QRVNUUklBcm0NCisgIHsgMzIxMSwJMywJMCwJMCwJIlZQQ01QRVNUUklBcnIiLCAwLCAweDE2MWMwMmU0NVVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMyMTEgPSBWUENNUEVTVFJJQXJyDQorICB7IDMyMTIsCTcsCTAsCTAsCSJWUENNUEVTVFJJQ3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNjFjMDJlNDZVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMzMjEyID0gVlBDTVBFU1RSSUNybQ0KKyAgeyAzMjEzLAkzLAkwLAkwLAkiVlBDTVBFU1RSSUNyciIsIDAsIDB4MTYxYzAyZTQ1VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMzIxMyA9IFZQQ01QRVNUUklDcnINCisgIHsgMzIxNCwJNywJMCwJMCwJIlZQQ01QRVNUUklPcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE2MWMwMmU0NlVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzMyMTQgPSBWUENNUEVTVFJJT3JtDQorICB7IDMyMTUsCTMsCTAsCTAsCSJWUENNUEVTVFJJT3JyIiwgMCwgMHgxNjFjMDJlNDVVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzMjE1ID0gVlBDTVBFU1RSSU9ycg0KKyAgeyAzMjE2LAk3LAkwLAkwLAkiVlBDTVBFU1RSSVNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTYxYzAyZTQ2VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMzIxNiA9IFZQQ01QRVNUUklTcm0NCisgIHsgMzIxNywJMywJMCwJMCwJIlZQQ01QRVNUUklTcnIiLCAwLCAweDE2MWMwMmU0NVVMTCwgSW1wbGljaXRMaXN0MTQsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMyMTcgPSBWUENNUEVTVFJJU3JyDQorICB7IDMyMTgsCTcsCTAsCTAsCSJWUENNUEVTVFJJWnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNjFjMDJlNDZVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMzMjE4ID0gVlBDTVBFU1RSSVpybQ0KKyAgeyAzMjE5LAkzLAkwLAkwLAkiVlBDTVBFU1RSSVpyciIsIDAsIDB4MTYxYzAyZTQ1VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMzIxOSA9IFZQQ01QRVNUUklacnINCisgIHsgMzIyMCwJNywJMCwJMCwJIlZQQ01QRVNUUklybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTYxYzAyZTQ2VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMzIyMCA9IFZQQ01QRVNUUklybQ0KKyAgeyAzMjIxLAkzLAkwLAkwLAkiVlBDTVBFU1RSSXJyIiwgMCwgMHgxNjFjMDJlNDVVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3Q0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzMjIxID0gVlBDTVBFU1RSSXJyDQorICB7IDMyMjIsCTgsCTEsCTAsCSJWUENNUEVTVFJNMTI4TUVNIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpLCAweDIwMDBVTEwsIEltcGxpY2l0TGlzdDE0LCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTM0IH0sICAvLyBJbnN0ICMzMjIyID0gVlBDTVBFU1RSTTEyOE1FTQ0KKyAgeyAzMjIzLAk0LAkxLAkwLAkiVlBDTVBFU1RSTTEyOFJFRyIsIDB8KDE8PFRJRDo6VXNlc0N1c3RvbUluc2VydGVyKSwgMHgyMDAwVUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMzMjIzID0gVlBDTVBFU1RSTTEyOFJFRw0KKyAgeyAzMjI0LAk3LAkwLAkwLAkiVlBDTVBFU1RSTTEyOHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTYwYzAyZTQ2VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDIsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMzIyNCA9IFZQQ01QRVNUUk0xMjhybQ0KKyAgeyAzMjI1LAkzLAkwLAkwLAkiVlBDTVBFU1RSTTEyOHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTYwYzAyZTQ1VUxMLCBJbXBsaWNpdExpc3QxNCwgSW1wbGljaXRMaXN0NDIsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMzIyNSA9IFZQQ01QRVNUUk0xMjhycg0KKyAgeyAzMjI2LAk3LAkxLAkwLAkiVlBDTVBHVEJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTY0YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzIyNiA9IFZQQ01QR1RCcm0NCisgIHsgMzIyNywJMywJMSwJMCwJIlZQQ01QR1RCcnIiLCAwLCAweDU2NGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMyMjcgPSBWUENNUEdUQnJyDQorICB7IDMyMjgsCTcsCTEsCTAsCSJWUENNUEdURHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NjZjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMjI4ID0gVlBDTVBHVERybQ0KKyAgeyAzMjI5LAkzLAkxLAkwLAkiVlBDTVBHVERyciIsIDAsIDB4NTY2YzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzIyOSA9IFZQQ01QR1REcnINCisgIHsgMzIzMCwJNywJMSwJMCwJIlZQQ01QR1RRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUzN2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMyMzAgPSBWUENNUEdUUXJtDQorICB7IDMyMzEsCTMsCTEsCTAsCSJWUENNUEdUUXJyIiwgMCwgMHg1MzdjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMjMxID0gVlBDTVBHVFFycg0KKyAgeyAzMjMyLAk3LAkxLAkwLAkiVlBDTVBHVFdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTY1YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzIzMiA9IFZQQ01QR1RXcm0NCisgIHsgMzIzMywJMywJMSwJMCwJIlZQQ01QR1RXcnIiLCAwLCAweDU2NWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMyMzMgPSBWUENNUEdUV3JyDQorICB7IDMyMzQsCTcsCTAsCTAsCSJWUENNUElTVFJJQXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNjNjMDJlNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzMyMzQgPSBWUENNUElTVFJJQXJtDQorICB7IDMyMzUsCTMsCTAsCTAsCSJWUENNUElTVFJJQXJyIiwgMCwgMHgxNjNjMDJlNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMyMzUgPSBWUENNUElTVFJJQXJyDQorICB7IDMyMzYsCTcsCTAsCTAsCSJWUENNUElTVFJJQ3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNjNjMDJlNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzMyMzYgPSBWUENNUElTVFJJQ3JtDQorICB7IDMyMzcsCTMsCTAsCTAsCSJWUENNUElTVFJJQ3JyIiwgMCwgMHgxNjNjMDJlNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMyMzcgPSBWUENNUElTVFJJQ3JyDQorICB7IDMyMzgsCTcsCTAsCTAsCSJWUENNUElTVFJJT3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNjNjMDJlNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzMyMzggPSBWUENNUElTVFJJT3JtDQorICB7IDMyMzksCTMsCTAsCTAsCSJWUENNUElTVFJJT3JyIiwgMCwgMHgxNjNjMDJlNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMyMzkgPSBWUENNUElTVFJJT3JyDQorICB7IDMyNDAsCTcsCTAsCTAsCSJWUENNUElTVFJJU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNjNjMDJlNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzMyNDAgPSBWUENNUElTVFJJU3JtDQorICB7IDMyNDEsCTMsCTAsCTAsCSJWUENNUElTVFJJU3JyIiwgMCwgMHgxNjNjMDJlNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMyNDEgPSBWUENNUElTVFJJU3JyDQorICB7IDMyNDIsCTcsCTAsCTAsCSJWUENNUElTVFJJWnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNjNjMDJlNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzMyNDIgPSBWUENNUElTVFJJWnJtDQorICB7IDMyNDMsCTMsCTAsCTAsCSJWUENNUElTVFJJWnJyIiwgMCwgMHgxNjNjMDJlNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMyNDMgPSBWUENNUElTVFJJWnJyDQorICB7IDMyNDQsCTcsCTAsCTAsCSJWUENNUElTVFJJcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE2M2MwMmU0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0NDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMzI0NCA9IFZQQ01QSVNUUklybQ0KKyAgeyAzMjQ1LAkzLAkwLAkwLAkiVlBDTVBJU1RSSXJyIiwgMCwgMHgxNjNjMDJlNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMyNDUgPSBWUENNUElTVFJJcnINCisgIHsgMzI0NiwJOCwJMSwJMCwJIlZQQ01QSVNUUk0xMjhNRU0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MjAwMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMzI0NiA9IFZQQ01QSVNUUk0xMjhNRU0NCisgIHsgMzI0NywJNCwJMSwJMCwJIlZQQ01QSVNUUk0xMjhSRUciLCAwfCgxPDxUSUQ6OlVzZXNDdXN0b21JbnNlcnRlciksIDB4MjAwMFVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMzMjQ3ID0gVlBDTVBJU1RSTTEyOFJFRw0KKyAgeyAzMjQ4LAk3LAkwLAkwLAkiVlBDTVBJU1RSTTEyOHJtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTYyYzAyZTQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3Q0MiwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMzMjQ4ID0gVlBDTVBJU1RSTTEyOHJtDQorICB7IDMyNDksCTMsCTAsCTAsCSJWUENNUElTVFJNMTI4cnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxNjJjMDJlNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDQyLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMyNDkgPSBWUENNUElTVFJNMTI4cnINCisgIHsgMzI1MCwJOCwJMSwJMCwJIlZQRVJNMkYxMjhybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUwNmMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjkgfSwgIC8vIEluc3QgIzMyNTAgPSBWUEVSTTJGMTI4cm0NCisgIHsgMzI1MSwJNCwJMSwJMCwJIlZQRVJNMkYxMjhyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUwNmMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzAgfSwgIC8vIEluc3QgIzMyNTEgPSBWUEVSTTJGMTI4cnINCisgIHsgMzI1MiwJNywJMSwJMCwJIlZQRVJNSUxQRFltaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTA1YzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MCB9LCAgLy8gSW5zdCAjMzI1MiA9IFZQRVJNSUxQRFltaQ0KKyAgeyAzMjUzLAkzLAkxLAkwLAkiVlBFUk1JTFBEWXJpIiwgMCwgMHgxMDVjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYxIH0sICAvLyBJbnN0ICMzMjUzID0gVlBFUk1JTFBEWXJpDQorICB7IDMyNTQsCTcsCTEsCTAsCSJWUEVSTUlMUERZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwZGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzMyNTQgPSBWUEVSTUlMUERZcm0NCisgIHsgMzI1NSwJMywJMSwJMCwJIlZQRVJNSUxQRFlyciIsIDAsIDB4NTBkYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMzI1NSA9IFZQRVJNSUxQRFlycg0KKyAgeyAzMjU2LAk3LAkxLAkwLAkiVlBFUk1JTFBEbWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEwNWMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMzI1NiA9IFZQRVJNSUxQRG1pDQorICB7IDMyNTcsCTMsCTEsCTAsCSJWUEVSTUlMUERyaSIsIDAsIDB4MTA1YzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzMjU3ID0gVlBFUk1JTFBEcmkNCisgIHsgMzI1OCwJNywJMSwJMCwJIlZQRVJNSUxQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MGRjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMjU4ID0gVlBFUk1JTFBEcm0NCisgIHsgMzI1OSwJMywJMSwJMCwJIlZQRVJNSUxQRHJyIiwgMCwgMHg1MGRjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMjU5ID0gVlBFUk1JTFBEcnINCisgIHsgMzI2MCwJNywJMSwJMCwJIlZQRVJNSUxQU1ltaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTA0YzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MCB9LCAgLy8gSW5zdCAjMzI2MCA9IFZQRVJNSUxQU1ltaQ0KKyAgeyAzMjYxLAkzLAkxLAkwLAkiVlBFUk1JTFBTWXJpIiwgMCwgMHgxMDRjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYxIH0sICAvLyBJbnN0ICMzMjYxID0gVlBFUk1JTFBTWXJpDQorICB7IDMyNjIsCTcsCTEsCTAsCSJWUEVSTUlMUFNZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwY2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzMyNjIgPSBWUEVSTUlMUFNZcm0NCisgIHsgMzI2MywJMywJMSwJMCwJIlZQRVJNSUxQU1lyciIsIDAsIDB4NTBjYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMzI2MyA9IFZQRVJNSUxQU1lycg0KKyAgeyAzMjY0LAk3LAkxLAkwLAkiVlBFUk1JTFBTbWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEwNGMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMzI2NCA9IFZQRVJNSUxQU21pDQorICB7IDMyNjUsCTMsCTEsCTAsCSJWUEVSTUlMUFNyaSIsIDAsIDB4MTA0YzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzMjY1ID0gVlBFUk1JTFBTcmkNCisgIHsgMzI2NiwJNywJMSwJMCwJIlZQRVJNSUxQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MGNjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMjY2ID0gVlBFUk1JTFBTcm0NCisgIHsgMzI2NywJMywJMSwJMCwJIlZQRVJNSUxQU3JyIiwgMCwgMHg1MGNjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMjY3ID0gVlBFUk1JTFBTcnINCisgIHsgMzI2OCwJNywJMCwJMCwJIlZQRVhUUkJtciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDExNGMwMmU0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDYgfSwgIC8vIEluc3QgIzMyNjggPSBWUEVYVFJCbXINCisgIHsgMzI2OSwJMywJMSwJMCwJIlZQRVhUUkJyciIsIDAsIDB4MTE0YzAyZTQzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNyB9LCAgLy8gSW5zdCAjMzI2OSA9IFZQRVhUUkJycg0KKyAgeyAzMjcwLAkzLAkxLAkwLAkiVlBFWFRSQnJyNjQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMTRjMDJlNDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA0IH0sICAvLyBJbnN0ICMzMjcwID0gVlBFWFRSQnJyNjQNCisgIHsgMzI3MSwJNywJMCwJMCwJIlZQRVhUUkRtciIsIDB8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDExNmMwMmU0NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDYgfSwgIC8vIEluc3QgIzMyNzEgPSBWUEVYVFJEbXINCisgIHsgMzI3MiwJMywJMSwJMCwJIlZQRVhUUkRyciIsIDAsIDB4MTE2YzAyZTQzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNyB9LCAgLy8gSW5zdCAjMzI3MiA9IFZQRVhUUkRycg0KKyAgeyAzMjczLAk3LAkwLAkwLAkiVlBFWFRSUW1yIiwgMHwoMTw8VElEOjpNYXlTdG9yZSksIDB4MzE2YzAzZTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNiB9LCAgLy8gSW5zdCAjMzI3MyA9IFZQRVhUUlFtcg0KKyAgeyAzMjc0LAkzLAkxLAkwLAkiVlBFWFRSUXJyIiwgMCwgMHgzMTZjMDNlNDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjA0IH0sICAvLyBJbnN0ICMzMjc0ID0gVlBFWFRSUXJyDQorICB7IDMyNzUsCTcsCTAsCTAsCSJWUEVYVFJXbXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMTVjMDJlNDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTA2IH0sICAvLyBJbnN0ICMzMjc1ID0gVlBFWFRSV21yDQorICB7IDMyNzYsCTMsCTEsCTAsCSJWUEVYVFJXcmkiLCAwLCAweDFjNWMwMjA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMDcgfSwgIC8vIEluc3QgIzMyNzYgPSBWUEVYVFJXcmkNCisgIHsgMzI3NywJNywJMSwJMCwJIlZQSEFERERybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTAyYzAyZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzI3NyA9IFZQSEFERERybTEyOA0KKyAgeyAzMjc4LAk3LAkxLAkwLAkiVlBIQURERHJtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwMmMwMmQwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjIgfSwgIC8vIEluc3QgIzMyNzggPSBWUEhBREREcm02NA0KKyAgeyAzMjc5LAkzLAkxLAkwLAkiVlBIQURERHJyMTI4IiwgMCwgMHg1MDJjMDJkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMjc5ID0gVlBIQURERHJyMTI4DQorICB7IDMyODAsCTMsCTEsCTAsCSJWUEhBREREcnI2NCIsIDAsIDB4NTAyYzAyZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MyB9LCAgLy8gSW5zdCAjMzI4MCA9IFZQSEFERERycjY0DQorICB7IDMyODEsCTcsCTEsCTAsCSJWUEhBRERTV3JtMTI4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MDNjMDJkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMjgxID0gVlBIQUREU1dybTEyOA0KKyAgeyAzMjgyLAk3LAkxLAkwLAkiVlBIQUREU1dybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MDNjMDJkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYyIH0sICAvLyBJbnN0ICMzMjgyID0gVlBIQUREU1dybTY0DQorICB7IDMyODMsCTMsCTEsCTAsCSJWUEhBRERTV3JyMTI4IiwgMCwgMHg1MDNjMDJkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMjgzID0gVlBIQUREU1dycjEyOA0KKyAgeyAzMjg0LAkzLAkxLAkwLAkiVlBIQUREU1dycjY0IiwgMCwgMHg1MDNjMDJkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYzIH0sICAvLyBJbnN0ICMzMjg0ID0gVlBIQUREU1dycjY0DQorICB7IDMyODUsCTcsCTEsCTAsCSJWUEhBRERXcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwMWMwMmQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMyODUgPSBWUEhBRERXcm0xMjgNCisgIHsgMzI4NiwJNywJMSwJMCwJIlZQSEFERFdybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MDFjMDJkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYyIH0sICAvLyBJbnN0ICMzMjg2ID0gVlBIQUREV3JtNjQNCisgIHsgMzI4NywJMywJMSwJMCwJIlZQSEFERFdycjEyOCIsIDAsIDB4NTAxYzAyZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzI4NyA9IFZQSEFERFdycjEyOA0KKyAgeyAzMjg4LAkzLAkxLAkwLAkiVlBIQUREV3JyNjQiLCAwLCAweDUwMWMwMmQwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjMgfSwgIC8vIEluc3QgIzMyODggPSBWUEhBRERXcnI2NA0KKyAgeyAzMjg5LAk2LAkxLAkwLAkiVlBITUlOUE9TVVdybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTQxYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMjg5ID0gVlBITUlOUE9TVVdybTEyOA0KKyAgeyAzMjkwLAkyLAkxLAkwLAkiVlBITUlOUE9TVVdycjEyOCIsIDAsIDB4MTQxYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzMjkwID0gVlBITUlOUE9TVVdycjEyOA0KKyAgeyAzMjkxLAk3LAkxLAkwLAkiVlBIU1VCRHJtMTI4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MDZjMDJkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMjkxID0gVlBIU1VCRHJtMTI4DQorICB7IDMyOTIsCTcsCTEsCTAsCSJWUEhTVUJEcm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTA2YzAyZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MiB9LCAgLy8gSW5zdCAjMzI5MiA9IFZQSFNVQkRybTY0DQorICB7IDMyOTMsCTMsCTEsCTAsCSJWUEhTVUJEcnIxMjgiLCAwLCAweDUwNmMwMmQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMyOTMgPSBWUEhTVUJEcnIxMjgNCisgIHsgMzI5NCwJMywJMSwJMCwJIlZQSFNVQkRycjY0IiwgMCwgMHg1MDZjMDJkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYzIH0sICAvLyBJbnN0ICMzMjk0ID0gVlBIU1VCRHJyNjQNCisgIHsgMzI5NSwJNywJMSwJMCwJIlZQSFNVQlNXcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwN2MwMmQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMyOTUgPSBWUEhTVUJTV3JtMTI4DQorICB7IDMyOTYsCTcsCTEsCTAsCSJWUEhTVUJTV3JtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwN2MwMmQwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjIgfSwgIC8vIEluc3QgIzMyOTYgPSBWUEhTVUJTV3JtNjQNCisgIHsgMzI5NywJMywJMSwJMCwJIlZQSFNVQlNXcnIxMjgiLCAwLCAweDUwN2MwMmQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMyOTcgPSBWUEhTVUJTV3JyMTI4DQorICB7IDMyOTgsCTMsCTEsCTAsCSJWUEhTVUJTV3JyNjQiLCAwLCAweDUwN2MwMmQwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjMgfSwgIC8vIEluc3QgIzMyOTggPSBWUEhTVUJTV3JyNjQNCisgIHsgMzI5OSwJNywJMSwJMCwJIlZQSFNVQldybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTA1YzAyZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzI5OSA9IFZQSFNVQldybTEyOA0KKyAgeyAzMzAwLAk3LAkxLAkwLAkiVlBIU1VCV3JtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwNWMwMmQwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjIgfSwgIC8vIEluc3QgIzMzMDAgPSBWUEhTVUJXcm02NA0KKyAgeyAzMzAxLAkzLAkxLAkwLAkiVlBIU1VCV3JyMTI4IiwgMCwgMHg1MDVjMDJkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzAxID0gVlBIU1VCV3JyMTI4DQorICB7IDMzMDIsCTMsCTEsCTAsCSJWUEhTVUJXcnI2NCIsIDAsIDB4NTA1YzAyZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MyB9LCAgLy8gSW5zdCAjMzMwMiA9IFZQSFNVQldycjY0DQorICB7IDMzMDMsCTgsCTEsCTAsCSJWUElOU1JCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUyMGMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzQgfSwgIC8vIEluc3QgIzMzMDMgPSBWUElOU1JCcm0NCisgIHsgMzMwNCwJNCwJMSwJMCwJIlZQSU5TUkJyciIsIDAsIDB4NTIwYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2NCB9LCAgLy8gSW5zdCAjMzMwNCA9IFZQSU5TUkJycg0KKyAgeyAzMzA1LAk4LAkxLAkwLAkiVlBJTlNSRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MjJjMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM0IH0sICAvLyBJbnN0ICMzMzA1ID0gVlBJTlNSRHJtDQorICB7IDMzMDYsCTQsCTEsCTAsCSJWUElOU1JEcnIiLCAwLCAweDUyMmMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjQgfSwgIC8vIEluc3QgIzMzMDYgPSBWUElOU1JEcnINCisgIHsgMzMwNywJOCwJMSwJMCwJIlZQSU5TUlFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NzIyYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMzMwNyA9IFZQSU5TUlFybQ0KKyAgeyAzMzA4LAk0LAkxLAkwLAkiVlBJTlNSUXJyIiwgMCwgMHg3MjJjMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjY1IH0sICAvLyBJbnN0ICMzMzA4ID0gVlBJTlNSUXJyDQorICB7IDMzMDksCTgsCTEsCTAsCSJWUElOU1JXcm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzRjMDIwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM0IH0sICAvLyBJbnN0ICMzMzA5ID0gVlBJTlNSV3JtaQ0KKyAgeyAzMzEwLAk0LAkxLAkwLAkiVlBJTlNSV3JyNjRpIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NWM0YzAyMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2NSB9LCAgLy8gSW5zdCAjMzMxMCA9IFZQSU5TUldycjY0aQ0KKyAgeyAzMzExLAk0LAkxLAkwLAkiVlBJTlNSV3JyaSIsIDAsIDB4NWM0YzAyMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2NCB9LCAgLy8gSW5zdCAjMzMxMSA9IFZQSU5TUldycmkNCisgIHsgMzMxMiwJNywJMSwJMCwJIlZQTUFERFVCU1dybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTA0YzAyZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzMxMiA9IFZQTUFERFVCU1dybTEyOA0KKyAgeyAzMzEzLAk3LAkxLAkwLAkiVlBNQUREVUJTV3JtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwNGMwMmQwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjIgfSwgIC8vIEluc3QgIzMzMTMgPSBWUE1BRERVQlNXcm02NA0KKyAgeyAzMzE0LAkzLAkxLAkwLAkiVlBNQUREVUJTV3JyMTI4IiwgMCwgMHg1MDRjMDJkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzE0ID0gVlBNQUREVUJTV3JyMTI4DQorICB7IDMzMTUsCTMsCTEsCTAsCSJWUE1BRERVQlNXcnI2NCIsIDAsIDB4NTA0YzAyZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MyB9LCAgLy8gSW5zdCAjMzMxNSA9IFZQTUFERFVCU1dycjY0DQorICB7IDMzMTYsCTcsCTEsCTAsCSJWUE1BRERXRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZjVjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMzE2ID0gVlBNQUREV0RybQ0KKyAgeyAzMzE3LAkzLAkxLAkwLAkiVlBNQUREV0RyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NWY1YzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzMxNyA9IFZQTUFERFdEcnINCisgIHsgMzMxOCwJNywJMSwJMCwJIlZQTUFYU0JybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTNjYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzMxOCA9IFZQTUFYU0JybQ0KKyAgeyAzMzE5LAkzLAkxLAkwLAkiVlBNQVhTQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1M2NjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzE5ID0gVlBNQVhTQnJyDQorICB7IDMzMjAsCTcsCTEsCTAsCSJWUE1BWFNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUzZGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzMjAgPSBWUE1BWFNEcm0NCisgIHsgMzMyMSwJMywJMSwJMCwJIlZQTUFYU0RyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTNkYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzMyMSA9IFZQTUFYU0Rycg0KKyAgeyAzMzIyLAk3LAkxLAkwLAkiVlBNQVhTV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZWVjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMzIyID0gVlBNQVhTV3JtDQorICB7IDMzMjMsCTMsCTEsCTAsCSJWUE1BWFNXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDVlZWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMzMjMgPSBWUE1BWFNXcnINCisgIHsgMzMyNCwJNywJMSwJMCwJIlZQTUFYVUJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWRlYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzMyNCA9IFZQTUFYVUJybQ0KKyAgeyAzMzI1LAkzLAkxLAkwLAkiVlBNQVhVQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZGVjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzI1ID0gVlBNQVhVQnJyDQorICB7IDMzMjYsCTcsCTEsCTAsCSJWUE1BWFVEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUzZmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzMjYgPSBWUE1BWFVEcm0NCisgIHsgMzMyNywJMywJMSwJMCwJIlZQTUFYVURyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTNmYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzMyNyA9IFZQTUFYVURycg0KKyAgeyAzMzI4LAk3LAkxLAkwLAkiVlBNQVhVV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1M2VjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMzI4ID0gVlBNQVhVV3JtDQorICB7IDMzMjksCTMsCTEsCTAsCSJWUE1BWFVXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDUzZWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMzMjkgPSBWUE1BWFVXcnINCisgIHsgMzMzMCwJNywJMSwJMCwJIlZQTUlOU0JybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTM4YzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzMzMCA9IFZQTUlOU0JybQ0KKyAgeyAzMzMxLAkzLAkxLAkwLAkiVlBNSU5TQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1MzhjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzMxID0gVlBNSU5TQnJyDQorICB7IDMzMzIsCTcsCTEsCTAsCSJWUE1JTlNEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUzOWMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzMzIgPSBWUE1JTlNEcm0NCisgIHsgMzMzMywJMywJMSwJMCwJIlZQTUlOU0RyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTM5YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzMzMyA9IFZQTUlOU0Rycg0KKyAgeyAzMzM0LAk3LAkxLAkwLAkiVlBNSU5TV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZWFjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMzM0ID0gVlBNSU5TV3JtDQorICB7IDMzMzUsCTMsCTEsCTAsCSJWUE1JTlNXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDVlYWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMzMzUgPSBWUE1JTlNXcnINCisgIHsgMzMzNiwJNywJMSwJMCwJIlZQTUlOVUJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWRhYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzMzNiA9IFZQTUlOVUJybQ0KKyAgeyAzMzM3LAkzLAkxLAkwLAkiVlBNSU5VQnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZGFjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzM3ID0gVlBNSU5VQnJyDQorICB7IDMzMzgsCTcsCTEsCTAsCSJWUE1JTlVEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUzYmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzMzggPSBWUE1JTlVEcm0NCisgIHsgMzMzOSwJMywJMSwJMCwJIlZQTUlOVURyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTNiYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzMzOSA9IFZQTUlOVURycg0KKyAgeyAzMzQwLAk3LAkxLAkwLAkiVlBNSU5VV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1M2FjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMzQwID0gVlBNSU5VV3JtDQorICB7IDMzNDEsCTMsCTEsCTAsCSJWUE1JTlVXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDUzYWMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMzNDEgPSBWUE1JTlVXcnINCisgIHsgMzM0MiwJMiwJMSwJMCwJIlZQTU9WTVNLQnI2NHIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxZDdjMDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODkgfSwgIC8vIEluc3QgIzMzNDIgPSBWUE1PVk1TS0JyNjRyDQorICB7IDMzNDMsCTIsCTEsCTAsCSJWUE1PVk1TS0JyciIsIDAsIDB4MWQ3YzAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzMSB9LCAgLy8gSW5zdCAjMzM0MyA9IFZQTU9WTVNLQnJyDQorICB7IDMzNDQsCTYsCTEsCTAsCSJWUE1PVlNYQkRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTIxYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMzQ0ID0gVlBNT1ZTWEJEcm0NCisgIHsgMzM0NSwJMiwJMSwJMCwJIlZQTU9WU1hCRHJyIiwgMCwgMHgxMjFjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMzNDUgPSBWUE1PVlNYQkRycg0KKyAgeyAzMzQ2LAk2LAkxLAkwLAkiVlBNT1ZTWEJRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEyMmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzM0NiA9IFZQTU9WU1hCUXJtDQorICB7IDMzNDcsCTIsCTEsCTAsCSJWUE1PVlNYQlFyciIsIDAsIDB4MTIyYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzMzQ3ID0gVlBNT1ZTWEJRcnINCisgIHsgMzM0OCwJNiwJMSwJMCwJIlZQTU9WU1hCV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMjBjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzMzNDggPSBWUE1PVlNYQldybQ0KKyAgeyAzMzQ5LAkyLAkxLAkwLAkiVlBNT1ZTWEJXcnIiLCAwLCAweDEyMGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzM0OSA9IFZQTU9WU1hCV3JyDQorICB7IDMzNTAsCTYsCTEsCTAsCSJWUE1PVlNYRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTI1YzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMzUwID0gVlBNT1ZTWERRcm0NCisgIHsgMzM1MSwJMiwJMSwJMCwJIlZQTU9WU1hEUXJyIiwgMCwgMHgxMjVjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMzNTEgPSBWUE1PVlNYRFFycg0KKyAgeyAzMzUyLAk2LAkxLAkwLAkiVlBNT1ZTWFdEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEyM2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzM1MiA9IFZQTU9WU1hXRHJtDQorICB7IDMzNTMsCTIsCTEsCTAsCSJWUE1PVlNYV0RyciIsIDAsIDB4MTIzYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzMzUzID0gVlBNT1ZTWFdEcnINCisgIHsgMzM1NCwJNiwJMSwJMCwJIlZQTU9WU1hXUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMjRjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzMzNTQgPSBWUE1PVlNYV1FybQ0KKyAgeyAzMzU1LAkyLAkxLAkwLAkiVlBNT1ZTWFdRcnIiLCAwLCAweDEyNGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzM1NSA9IFZQTU9WU1hXUXJyDQorICB7IDMzNTYsCTYsCTEsCTAsCSJWUE1PVlpYQkRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTMxYzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMzU2ID0gVlBNT1ZaWEJEcm0NCisgIHsgMzM1NywJMiwJMSwJMCwJIlZQTU9WWlhCRHJyIiwgMCwgMHgxMzFjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMzNTcgPSBWUE1PVlpYQkRycg0KKyAgeyAzMzU4LAk2LAkxLAkwLAkiVlBNT1ZaWEJRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEzMmMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzM1OCA9IFZQTU9WWlhCUXJtDQorICB7IDMzNTksCTIsCTEsCTAsCSJWUE1PVlpYQlFyciIsIDAsIDB4MTMyYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzMzU5ID0gVlBNT1ZaWEJRcnINCisgIHsgMzM2MCwJNiwJMSwJMCwJIlZQTU9WWlhCV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMzBjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzMzNjAgPSBWUE1PVlpYQldybQ0KKyAgeyAzMzYxLAkyLAkxLAkwLAkiVlBNT1ZaWEJXcnIiLCAwLCAweDEzMGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzM2MSA9IFZQTU9WWlhCV3JyDQorICB7IDMzNjIsCTYsCTEsCTAsCSJWUE1PVlpYRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTM1YzAwZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzMzYyID0gVlBNT1ZaWERRcm0NCisgIHsgMzM2MywJMiwJMSwJMCwJIlZQTU9WWlhEUXJyIiwgMCwgMHgxMzVjMDBkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzMzNjMgPSBWUE1PVlpYRFFycg0KKyAgeyAzMzY0LAk2LAkxLAkwLAkiVlBNT1ZaWFdEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEzM2MwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzM2NCA9IFZQTU9WWlhXRHJtDQorICB7IDMzNjUsCTIsCTEsCTAsCSJWUE1PVlpYV0RyciIsIDAsIDB4MTMzYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzMzY1ID0gVlBNT1ZaWFdEcnINCisgIHsgMzM2NiwJNiwJMSwJMCwJIlZQTU9WWlhXUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMzRjMDBkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzMzNjYgPSBWUE1PVlpYV1FybQ0KKyAgeyAzMzY3LAkyLAkxLAkwLAkiVlBNT1ZaWFdRcnIiLCAwLCAweDEzNGMwMGQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzM2NyA9IFZQTU9WWlhXUXJyDQorICB7IDMzNjgsCTcsCTEsCTAsCSJWUE1VTERRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUyOGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzNjggPSBWUE1VTERRcm0NCisgIHsgMzM2OSwJMywJMSwJMCwJIlZQTVVMRFFyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTI4YzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzM2OSA9IFZQTVVMRFFycg0KKyAgeyAzMzcwLAk3LAkxLAkwLAkiVlBNVUxIUlNXcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwYmMwMmQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzNzAgPSBWUE1VTEhSU1dybTEyOA0KKyAgeyAzMzcxLAk3LAkxLAkwLAkiVlBNVUxIUlNXcm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTBiYzAyZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MiB9LCAgLy8gSW5zdCAjMzM3MSA9IFZQTVVMSFJTV3JtNjQNCisgIHsgMzM3MiwJMywJMSwJMCwJIlZQTVVMSFJTV3JyMTI4IiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1MGJjMDJkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzcyID0gVlBNVUxIUlNXcnIxMjgNCisgIHsgMzM3MywJMywJMSwJMCwJIlZQTVVMSFJTV3JyNjQiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDUwYmMwMmQwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjMgfSwgIC8vIEluc3QgIzMzNzMgPSBWUE1VTEhSU1dycjY0DQorICB7IDMzNzQsCTcsCTEsCTAsCSJWUE1VTEhVV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZTRjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMzc0ID0gVlBNVUxIVVdybQ0KKyAgeyAzMzc1LAkzLAkxLAkwLAkiVlBNVUxIVVdyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NWU0YzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzM3NSA9IFZQTVVMSFVXcnINCisgIHsgMzM3NiwJNywJMSwJMCwJIlZQTVVMSFdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWU1YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzM3NiA9IFZQTVVMSFdybQ0KKyAgeyAzMzc3LAkzLAkxLAkwLAkiVlBNVUxIV3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZTVjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzc3ID0gVlBNVUxIV3JyDQorICB7IDMzNzgsCTcsCTEsCTAsCSJWUE1VTExEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU0MGMwMGQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzNzggPSBWUE1VTExEcm0NCisgIHsgMzM3OSwJMywJMSwJMCwJIlZQTVVMTERyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4NTQwYzAwZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzM3OSA9IFZQTVVMTERycg0KKyAgeyAzMzgwLAk3LAkxLAkwLAkiVlBNVUxMV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZDVjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMzgwID0gVlBNVUxMV3JtDQorICB7IDMzODEsCTMsCTEsCTAsCSJWUE1VTExXcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDVkNWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMzODEgPSBWUE1VTExXcnINCisgIHsgMzM4MiwJNywJMSwJMCwJIlZQTVVMVURRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVmNGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzODIgPSBWUE1VTFVEUXJtDQorICB7IDMzODMsCTMsCTEsCTAsCSJWUE1VTFVEUXJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZjRjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzgzID0gVlBNVUxVRFFycg0KKyAgeyAzMzg0LAk3LAkxLAkwLAkiVlBPUnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZWJjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzMzg0ID0gVlBPUnJtDQorICB7IDMzODUsCTMsCTEsCTAsCSJWUE9ScnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDVlYmMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzMzODUgPSBWUE9ScnINCisgIHsgMzM4NiwJNywJMSwJMCwJIlZQU0FEQldybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWY2YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzM4NiA9IFZQU0FEQldybQ0KKyAgeyAzMzg3LAkzLAkxLAkwLAkiVlBTQURCV3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZjZjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzMzg3ID0gVlBTQURCV3JyDQorICB7IDMzODgsCTcsCTEsCTAsCSJWUFNIVUZCcm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwMGMwMmQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzODggPSBWUFNIVUZCcm0xMjgNCisgIHsgMzM4OSwJNywJMSwJMCwJIlZQU0hVRkJybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MDBjMDJkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYyIH0sICAvLyBJbnN0ICMzMzg5ID0gVlBTSFVGQnJtNjQNCisgIHsgMzM5MCwJMywJMSwJMCwJIlZQU0hVRkJycjEyOCIsIDAsIDB4NTAwYzAyZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzM5MCA9IFZQU0hVRkJycjEyOA0KKyAgeyAzMzkxLAkzLAkxLAkwLAkiVlBTSFVGQnJyNjQiLCAwLCAweDUwMGMwMmQwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjMgfSwgIC8vIEluc3QgIzMzOTEgPSBWUFNIVUZCcnI2NA0KKyAgeyAzMzkyLAk3LAkxLAkwLAkiVlBTSFVGRG1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNzBjMDIwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzMzOTIgPSBWUFNIVUZEbWkNCisgIHsgMzM5MywJMywJMSwJMCwJIlZQU0hVRkRyaSIsIDAsIDB4MTcwYzAyMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzMzkzID0gVlBTSFVGRHJpDQorICB7IDMzOTQsCTcsCTEsCTAsCSJWUFNIVUZIV21pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNzBjMDJjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzMzOTQgPSBWUFNIVUZIV21pDQorICB7IDMzOTUsCTMsCTEsCTAsCSJWUFNIVUZIV3JpIiwgMCwgMHgxNzBjMDJjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMzOTUgPSBWUFNIVUZIV3JpDQorICB7IDMzOTYsCTcsCTEsCTAsCSJWUFNIVUZMV21pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNzBjMDJiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzMzOTYgPSBWUFNIVUZMV21pDQorICB7IDMzOTcsCTMsCTEsCTAsCSJWUFNIVUZMV3JpIiwgMCwgMHgxNzBjMDJiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzMzOTcgPSBWUFNIVUZMV3JpDQorICB7IDMzOTgsCTcsCTEsCTAsCSJWUFNJR05Ccm0xMjgiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwOGMwMmQ0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzMzOTggPSBWUFNJR05Ccm0xMjgNCisgIHsgMzM5OSwJNywJMSwJMCwJIlZQU0lHTkJybTY0IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MDhjMDJkMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYyIH0sICAvLyBJbnN0ICMzMzk5ID0gVlBTSUdOQnJtNjQNCisgIHsgMzQwMCwJMywJMSwJMCwJIlZQU0lHTkJycjEyOCIsIDAsIDB4NTA4YzAyZDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQwMCA9IFZQU0lHTkJycjEyOA0KKyAgeyAzNDAxLAkzLAkxLAkwLAkiVlBTSUdOQnJyNjQiLCAwLCAweDUwOGMwMmQwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjMgfSwgIC8vIEluc3QgIzM0MDEgPSBWUFNJR05CcnI2NA0KKyAgeyAzNDAyLAk3LAkxLAkwLAkiVlBTSUdORHJtMTI4IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MGFjMDJkNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNDAyID0gVlBTSUdORHJtMTI4DQorICB7IDM0MDMsCTcsCTEsCTAsCSJWUFNJR05Ecm02NCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTBhYzAyZDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MiB9LCAgLy8gSW5zdCAjMzQwMyA9IFZQU0lHTkRybTY0DQorICB7IDM0MDQsCTMsCTEsCTAsCSJWUFNJR05EcnIxMjgiLCAwLCAweDUwYWMwMmQ0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM0MDQgPSBWUFNJR05EcnIxMjgNCisgIHsgMzQwNSwJMywJMSwJMCwJIlZQU0lHTkRycjY0IiwgMCwgMHg1MGFjMDJkMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYzIH0sICAvLyBJbnN0ICMzNDA1ID0gVlBTSUdORHJyNjQNCisgIHsgMzQwNiwJNywJMSwJMCwJIlZQU0lHTldybTEyOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTA5YzAyZDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQwNiA9IFZQU0lHTldybTEyOA0KKyAgeyAzNDA3LAk3LAkxLAkwLAkiVlBTSUdOV3JtNjQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUwOWMwMmQwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjIgfSwgIC8vIEluc3QgIzM0MDcgPSBWUFNJR05Xcm02NA0KKyAgeyAzNDA4LAkzLAkxLAkwLAkiVlBTSUdOV3JyMTI4IiwgMCwgMHg1MDljMDJkNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNDA4ID0gVlBTSUdOV3JyMTI4DQorICB7IDM0MDksCTMsCTEsCTAsCSJWUFNJR05XcnI2NCIsIDAsIDB4NTA5YzAyZDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MyB9LCAgLy8gSW5zdCAjMzQwOSA9IFZQU0lHTldycjY0DQorICB7IDM0MTAsCTMsCTEsCTAsCSJWUFNMTERRcmkiLCAwLCAweDU3M2MwMjE1N1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMzQxMCA9IFZQU0xMRFFyaQ0KKyAgeyAzNDExLAkzLAkxLAkwLAkiVlBTTExEcmkiLCAwLCAweDU3MmMwMjE1NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMzQxMSA9IFZQU0xMRHJpDQorICB7IDM0MTIsCTcsCTEsCTAsCSJWUFNMTERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWYyYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQxMiA9IFZQU0xMRHJtDQorICB7IDM0MTMsCTMsCTEsCTAsCSJWUFNMTERyciIsIDAsIDB4NWYyYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQxMyA9IFZQU0xMRHJyDQorICB7IDM0MTQsCTMsCTEsCTAsCSJWUFNMTFFyaSIsIDAsIDB4NTczYzAyMTU2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzNDE0ID0gVlBTTExRcmkNCisgIHsgMzQxNSwJNywJMSwJMCwJIlZQU0xMUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZjNjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNDE1ID0gVlBTTExRcm0NCisgIHsgMzQxNiwJMywJMSwJMCwJIlZQU0xMUXJyIiwgMCwgMHg1ZjNjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNDE2ID0gVlBTTExRcnINCisgIHsgMzQxNywJMywJMSwJMCwJIlZQU0xMV3JpIiwgMCwgMHg1NzFjMDIxNTZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzM0MTcgPSBWUFNMTFdyaQ0KKyAgeyAzNDE4LAk3LAkxLAkwLAkiVlBTTExXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVmMWMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM0MTggPSBWUFNMTFdybQ0KKyAgeyAzNDE5LAkzLAkxLAkwLAkiVlBTTExXcnIiLCAwLCAweDVmMWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM0MTkgPSBWUFNMTFdycg0KKyAgeyAzNDIwLAkzLAkxLAkwLAkiVlBTUkFEcmkiLCAwLCAweDU3MmMwMjE1NFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMzQyMCA9IFZQU1JBRHJpDQorICB7IDM0MjEsCTcsCTEsCTAsCSJWUFNSQURybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWUyYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQyMSA9IFZQU1JBRHJtDQorICB7IDM0MjIsCTMsCTEsCTAsCSJWUFNSQURyciIsIDAsIDB4NWUyYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQyMiA9IFZQU1JBRHJyDQorICB7IDM0MjMsCTMsCTEsCTAsCSJWUFNSQVdyaSIsIDAsIDB4NTcxYzAyMTU0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzNDIzID0gVlBTUkFXcmkNCisgIHsgMzQyNCwJNywJMSwJMCwJIlZQU1JBV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZTFjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNDI0ID0gVlBTUkFXcm0NCisgIHsgMzQyNSwJMywJMSwJMCwJIlZQU1JBV3JyIiwgMCwgMHg1ZTFjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNDI1ID0gVlBTUkFXcnINCisgIHsgMzQyNiwJMywJMSwJMCwJIlZQU1JMRFFyaSIsIDAsIDB4NTczYzAyMTUzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzNDI2ID0gVlBTUkxEUXJpDQorICB7IDM0MjcsCTMsCTEsCTAsCSJWUFNSTERyaSIsIDAsIDB4NTcyYzAyMTUyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzNDI3ID0gVlBTUkxEcmkNCisgIHsgMzQyOCwJNywJMSwJMCwJIlZQU1JMRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZDJjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNDI4ID0gVlBTUkxEcm0NCisgIHsgMzQyOSwJMywJMSwJMCwJIlZQU1JMRHJyIiwgMCwgMHg1ZDJjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNDI5ID0gVlBTUkxEcnINCisgIHsgMzQzMCwJMywJMSwJMCwJIlZQU1JMUXJpIiwgMCwgMHg1NzNjMDIxNTJVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzM0MzAgPSBWUFNSTFFyaQ0KKyAgeyAzNDMxLAk3LAkxLAkwLAkiVlBTUkxRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVkM2MwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM0MzEgPSBWUFNSTFFybQ0KKyAgeyAzNDMyLAkzLAkxLAkwLAkiVlBTUkxRcnIiLCAwLCAweDVkM2MwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM0MzIgPSBWUFNSTFFycg0KKyAgeyAzNDMzLAkzLAkxLAkwLAkiVlBTUkxXcmkiLCAwLCAweDU3MWMwMjE1MlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMzQzMyA9IFZQU1JMV3JpDQorICB7IDM0MzQsCTcsCTEsCTAsCSJWUFNSTFdybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQxYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQzNCA9IFZQU1JMV3JtDQorICB7IDM0MzUsCTMsCTEsCTAsCSJWUFNSTFdyciIsIDAsIDB4NWQxYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQzNSA9IFZQU1JMV3JyDQorICB7IDM0MzYsCTcsCTEsCTAsCSJWUFNVQkJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWY4YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQzNiA9IFZQU1VCQnJtDQorICB7IDM0MzcsCTMsCTEsCTAsCSJWUFNVQkJyciIsIDAsIDB4NWY4YzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQzNyA9IFZQU1VCQnJyDQorICB7IDM0MzgsCTcsCTEsCTAsCSJWUFNVQkRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWZhYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQzOCA9IFZQU1VCRHJtDQorICB7IDM0MzksCTMsCTEsCTAsCSJWUFNVQkRyciIsIDAsIDB4NWZhYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQzOSA9IFZQU1VCRHJyDQorICB7IDM0NDAsCTcsCTEsCTAsCSJWUFNVQlFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWZiYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQ0MCA9IFZQU1VCUXJtDQorICB7IDM0NDEsCTMsCTEsCTAsCSJWUFNVQlFyciIsIDAsIDB4NWZiYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQ0MSA9IFZQU1VCUXJyDQorICB7IDM0NDIsCTcsCTEsCTAsCSJWUFNVQlNCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVlOGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM0NDIgPSBWUFNVQlNCcm0NCisgIHsgMzQ0MywJMywJMSwJMCwJIlZQU1VCU0JyciIsIDAsIDB4NWU4YzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQ0MyA9IFZQU1VCU0Jycg0KKyAgeyAzNDQ0LAk3LAkxLAkwLAkiVlBTVUJTV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1ZTljMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNDQ0ID0gVlBTVUJTV3JtDQorICB7IDM0NDUsCTMsCTEsCTAsCSJWUFNVQlNXcnIiLCAwLCAweDVlOWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM0NDUgPSBWUFNVQlNXcnINCisgIHsgMzQ0NiwJNywJMSwJMCwJIlZQU1VCVVNCcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVkOGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM0NDYgPSBWUFNVQlVTQnJtDQorICB7IDM0NDcsCTMsCTEsCTAsCSJWUFNVQlVTQnJyIiwgMCwgMHg1ZDhjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNDQ3ID0gVlBTVUJVU0Jycg0KKyAgeyAzNDQ4LAk3LAkxLAkwLAkiVlBTVUJVU1dybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWQ5YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQ0OCA9IFZQU1VCVVNXcm0NCisgIHsgMzQ0OSwJMywJMSwJMCwJIlZQU1VCVVNXcnIiLCAwLCAweDVkOWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM0NDkgPSBWUFNVQlVTV3JyDQorICB7IDM0NTAsCTcsCTEsCTAsCSJWUFNVQldybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWY5YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQ1MCA9IFZQU1VCV3JtDQorICB7IDM0NTEsCTMsCTEsCTAsCSJWUFNVQldyciIsIDAsIDB4NWY5YzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQ1MSA9IFZQU1VCV3JyDQorICB7IDM0NTIsCTYsCTAsCTAsCSJWUFRFU1RZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDExN2MwMGQ0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIzNSB9LCAgLy8gSW5zdCAjMzQ1MiA9IFZQVEVTVFlybQ0KKyAgeyAzNDUzLAkyLAkwLAkwLAkiVlBURVNUWXJyIiwgMCwgMHgxMTdjMDBkNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzM0NTMgPSBWUFRFU1RZcnINCisgIHsgMzQ1NCwJNiwJMCwJMCwJIlZQVEVTVHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMTdjMDBkNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzQ1NCA9IFZQVEVTVHJtDQorICB7IDM0NTUsCTIsCTAsCTAsCSJWUFRFU1RyciIsIDAsIDB4MTE3YzAwZDQ1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzM0NTUgPSBWUFRFU1Rycg0KKyAgeyAzNDU2LAk3LAkxLAkwLAkiVlBVTlBDS0hCV3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NjhjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNDU2ID0gVlBVTlBDS0hCV3JtDQorICB7IDM0NTcsCTMsCTEsCTAsCSJWUFVOUENLSEJXcnIiLCAwLCAweDU2OGMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM0NTcgPSBWUFVOUENLSEJXcnINCisgIHsgMzQ1OCwJNywJMSwJMCwJIlZQVU5QQ0tIRFFybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTZhYzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQ1OCA9IFZQVU5QQ0tIRFFybQ0KKyAgeyAzNDU5LAkzLAkxLAkwLAkiVlBVTlBDS0hEUXJyIiwgMCwgMHg1NmFjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNDU5ID0gVlBVTlBDS0hEUXJyDQorICB7IDM0NjAsCTcsCTEsCTAsCSJWUFVOUENLSFFEUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NmRjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNDYwID0gVlBVTlBDS0hRRFFybQ0KKyAgeyAzNDYxLAkzLAkxLAkwLAkiVlBVTlBDS0hRRFFyciIsIDAsIDB4NTZkYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQ2MSA9IFZQVU5QQ0tIUURRcnINCisgIHsgMzQ2MiwJNywJMSwJMCwJIlZQVU5QQ0tIV0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTY5YzAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzQ2MiA9IFZQVU5QQ0tIV0RybQ0KKyAgeyAzNDYzLAkzLAkxLAkwLAkiVlBVTlBDS0hXRHJyIiwgMCwgMHg1NjljMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNDYzID0gVlBVTlBDS0hXRHJyDQorICB7IDM0NjQsCTcsCTEsCTAsCSJWUFVOUENLTEJXcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU2MGMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM0NjQgPSBWUFVOUENLTEJXcm0NCisgIHsgMzQ2NSwJMywJMSwJMCwJIlZQVU5QQ0tMQldyciIsIDAsIDB4NTYwYzAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzQ2NSA9IFZQVU5QQ0tMQldycg0KKyAgeyAzNDY2LAk3LAkxLAkwLAkiVlBVTlBDS0xEUXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NjJjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNDY2ID0gVlBVTlBDS0xEUXJtDQorICB7IDM0NjcsCTMsCTEsCTAsCSJWUFVOUENLTERRcnIiLCAwLCAweDU2MmMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM0NjcgPSBWUFVOUENLTERRcnINCisgIHsgMzQ2OCwJNywJMSwJMCwJIlZQVU5QQ0tMUURRcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU2Y2MwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM0NjggPSBWUFVOUENLTFFEUXJtDQorICB7IDM0NjksCTMsCTEsCTAsCSJWUFVOUENLTFFEUXJyIiwgMCwgMHg1NmNjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNDY5ID0gVlBVTlBDS0xRRFFycg0KKyAgeyAzNDcwLAk3LAkxLAkwLAkiVlBVTlBDS0xXRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NjFjMDAxNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNDcwID0gVlBVTlBDS0xXRHJtDQorICB7IDM0NzEsCTMsCTEsCTAsCSJWUFVOUENLTFdEcnIiLCAwLCAweDU2MWMwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM0NzEgPSBWUFVOUENLTFdEcnINCisgIHsgMzQ3MiwJNywJMSwJMCwJIlZQWE9Scm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVlZmMwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM0NzIgPSBWUFhPUnJtDQorICB7IDM0NzMsCTMsCTEsCTAsCSJWUFhPUnJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1ZWZjMDAxNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNDczID0gVlBYT1Jycg0KKyAgeyAzNDc0LAk2LAkxLAkwLAkiVlJDUFBTWW0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE1MzQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzUgfSwgIC8vIEluc3QgIzM0NzQgPSBWUkNQUFNZbQ0KKyAgeyAzNDc1LAk2LAkxLAkwLAkiVlJDUFBTWW1fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNTM0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMzNDc1ID0gVlJDUFBTWW1fSW50DQorICB7IDM0NzYsCTIsCTEsCTAsCSJWUkNQUFNZciIsIDAsIDB4MTUzNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzOSB9LCAgLy8gSW5zdCAjMzQ3NiA9IFZSQ1BQU1lyDQorICB7IDM0NzcsCTIsCTEsCTAsCSJWUkNQUFNZcl9JbnQiLCAwLCAweDE1MzQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzM0NzcgPSBWUkNQUFNZcl9JbnQNCisgIHsgMzQ3OCwJNiwJMSwJMCwJIlZSQ1BQU20iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE1MzQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzQ3OCA9IFZSQ1BQU20NCisgIHsgMzQ3OSwJNiwJMSwJMCwJIlZSQ1BQU21fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNTM0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzM0NzkgPSBWUkNQUFNtX0ludA0KKyAgeyAzNDgwLAkyLAkxLAkwLAkiVlJDUFBTciIsIDAsIDB4MTUzNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzNDgwID0gVlJDUFBTcg0KKyAgeyAzNDgxLAkyLAkxLAkwLAkiVlJDUFBTcl9JbnQiLCAwLCAweDE1MzQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzQ4MSA9IFZSQ1BQU3JfSW50DQorICB7IDM0ODIsCTcsCTEsCTAsCSJWUkNQU1NtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTUzMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNiB9LCAgLy8gSW5zdCAjMzQ4MiA9IFZSQ1BTU20NCisgIHsgMzQ4MywJNiwJMSwJMCwJIlZSQ1BTU21fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTMwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzM0ODMgPSBWUkNQU1NtX0ludA0KKyAgeyAzNDg0LAkzLAkxLAkwLAkiVlJDUFNTciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1MzAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjcgfSwgIC8vIEluc3QgIzM0ODQgPSBWUkNQU1NyDQorICB7IDM0ODUsCTIsCTEsCTAsCSJWUkNQU1NyX0ludCIsIDAsIDB4NTUzMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzNDg1ID0gVlJDUFNTcl9JbnQNCisgIHsgMzQ4NiwJNywJMSwJMCwJIlZST1VORFBEbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwOWMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMzQ4NiA9IFZST1VORFBEbQ0KKyAgeyAzNDg3LAk3LAkxLAkwLAkiVlJPVU5EUERtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTA5YzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ0IH0sICAvLyBJbnN0ICMzNDg3ID0gVlJPVU5EUERtX0ludA0KKyAgeyAzNDg4LAkzLAkxLAkwLAkiVlJPVU5EUERyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTA5YzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzNDg4ID0gVlJPVU5EUERyDQorICB7IDM0ODksCTMsCTEsCTAsCSJWUk9VTkRQRHJfSW50IiwgMCwgMHgxMDljMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDUgfSwgIC8vIEluc3QgIzM0ODkgPSBWUk9VTkRQRHJfSW50DQorICB7IDM0OTAsCTcsCTEsCTAsCSJWUk9VTkRQU20iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDgwMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDQgfSwgIC8vIEluc3QgIzM0OTAgPSBWUk9VTkRQU20NCisgIHsgMzQ5MSwJNywJMSwJMCwJIlZST1VORFBTbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEwODAwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NCB9LCAgLy8gSW5zdCAjMzQ5MSA9IFZST1VORFBTbV9JbnQNCisgIHsgMzQ5MiwJMywJMSwJMCwJIlZST1VORFBTciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwOGMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80NSB9LCAgLy8gSW5zdCAjMzQ5MiA9IFZST1VORFBTcg0KKyAgeyAzNDkzLAkzLAkxLAkwLAkiVlJPVU5EUFNyX0ludCIsIDAsIDB4MTA4YzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQ1IH0sICAvLyBJbnN0ICMzNDkzID0gVlJPVU5EUFNyX0ludA0KKyAgeyAzNDk0LAk4LAkxLAkwLAkiVlJPVU5EU0RtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTBiYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMzQ5NCA9IFZST1VORFNEbQ0KKyAgeyAzNDk1LAk4LAkxLAkwLAkiVlJPVU5EU0RtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTBiYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMzQ5NSA9IFZST1VORFNEbV9JbnQNCisgIHsgMzQ5NiwJNCwJMSwJMCwJIlZST1VORFNEciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUwYmMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjMzQ5NiA9IFZST1VORFNEcg0KKyAgeyAzNDk3LAk0LAkxLAkwLAkiVlJPVU5EU0RyX0ludCIsIDAsIDB4NTBiYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMzNDk3ID0gVlJPVU5EU0RyX0ludA0KKyAgeyAzNDk4LAk4LAkxLAkwLAkiVlJPVU5EU1NtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTBhYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMzQ5OCA9IFZST1VORFNTbQ0KKyAgeyAzNDk5LAk4LAkxLAkwLAkiVlJPVU5EU1NtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTBhYzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMzQ5OSA9IFZST1VORFNTbV9JbnQNCisgIHsgMzUwMCwJNCwJMSwJMCwJIlZST1VORFNTciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDUwYWMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjMzUwMCA9IFZST1VORFNTcg0KKyAgeyAzNTAxLAk0LAkxLAkwLAkiVlJPVU5EU1NyX0ludCIsIDAsIDB4NTBhYzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzc4IH0sICAvLyBJbnN0ICMzNTAxID0gVlJPVU5EU1NyX0ludA0KKyAgeyAzNTAyLAk3LAkxLAkwLAkiVlJPVU5EWVBEbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwOWMwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjAgfSwgIC8vIEluc3QgIzM1MDIgPSBWUk9VTkRZUERtDQorICB7IDM1MDMsCTcsCTEsCTAsCSJWUk9VTkRZUERtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTA5YzAyZTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MCB9LCAgLy8gSW5zdCAjMzUwMyA9IFZST1VORFlQRG1fSW50DQorICB7IDM1MDQsCTMsCTEsCTAsCSJWUk9VTkRZUERyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTA5YzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MSB9LCAgLy8gSW5zdCAjMzUwNCA9IFZST1VORFlQRHINCisgIHsgMzUwNSwJMywJMSwJMCwJIlZST1VORFlQRHJfSW50IiwgMCwgMHgxMDljMDJlNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYxIH0sICAvLyBJbnN0ICMzNTA1ID0gVlJPVU5EWVBEcl9JbnQNCisgIHsgMzUwNiwJNywJMSwJMCwJIlZST1VORFlQU20iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgxMDgwMDJlNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjYwIH0sICAvLyBJbnN0ICMzNTA2ID0gVlJPVU5EWVBTbQ0KKyAgeyAzNTA3LAk3LAkxLAkwLAkiVlJPVU5EWVBTbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDEwODAwMmU0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjAgfSwgIC8vIEluc3QgIzM1MDcgPSBWUk9VTkRZUFNtX0ludA0KKyAgeyAzNTA4LAkzLAkxLAkwLAkiVlJPVU5EWVBTciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDEwOGMwMmU0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjEgfSwgIC8vIEluc3QgIzM1MDggPSBWUk9VTkRZUFNyDQorICB7IDM1MDksCTMsCTEsCTAsCSJWUk9VTkRZUFNyX0ludCIsIDAsIDB4MTA4YzAyZTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2MSB9LCAgLy8gSW5zdCAjMzUwOSA9IFZST1VORFlQU3JfSW50DQorICB7IDM1MTAsCTYsCTEsCTAsCSJWUlNRUlRQU1ltIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNTI0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMzNTEwID0gVlJTUVJUUFNZbQ0KKyAgeyAzNTExLAk2LAkxLAkwLAkiVlJTUVJUUFNZbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE1MjQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzUgfSwgIC8vIEluc3QgIzM1MTEgPSBWUlNRUlRQU1ltX0ludA0KKyAgeyAzNTEyLAkyLAkxLAkwLAkiVlJTUVJUUFNZciIsIDAsIDB4MTUyNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIzOSB9LCAgLy8gSW5zdCAjMzUxMiA9IFZSU1FSVFBTWXINCisgIHsgMzUxMywJMiwJMSwJMCwJIlZSU1FSVFBTWXJfSW50IiwgMCwgMHgxNTI0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjM5IH0sICAvLyBJbnN0ICMzNTEzID0gVlJTUVJUUFNZcl9JbnQNCisgIHsgMzUxNCwJNiwJMSwJMCwJIlZSU1FSVFBTbSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTUyNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzNTE0ID0gVlJTUVJUUFNtDQorICB7IDM1MTUsCTYsCTEsCTAsCSJWUlNRUlRQU21fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxNTI0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzM1MTUgPSBWUlNRUlRQU21fSW50DQorICB7IDM1MTYsCTIsCTEsCTAsCSJWUlNRUlRQU3IiLCAwLCAweDE1MjQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzUxNiA9IFZSU1FSVFBTcg0KKyAgeyAzNTE3LAkyLAkxLAkwLAkiVlJTUVJUUFNyX0ludCIsIDAsIDB4MTUyNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzNTE3ID0gVlJTUVJUUFNyX0ludA0KKyAgeyAzNTE4LAk3LAkxLAkwLAkiVlJTUVJUU1NtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTUyMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNiB9LCAgLy8gSW5zdCAjMzUxOCA9IFZSU1FSVFNTbQ0KKyAgeyAzNTE5LAk2LAkxLAkwLAkiVlJTUVJUU1NtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTUyMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzNTE5ID0gVlJTUVJUU1NtX0ludA0KKyAgeyAzNTIwLAkzLAkxLAkwLAkiVlJTUVJUU1NyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTUyMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNyB9LCAgLy8gSW5zdCAjMzUyMCA9IFZSU1FSVFNTcg0KKyAgeyAzNTIxLAkyLAkxLAkwLAkiVlJTUVJUU1NyX0ludCIsIDAsIDB4NTUyMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzNTIxID0gVlJTUVJUU1NyX0ludA0KKyAgeyAzNTIyLAk4LAkxLAkwLAkiVlNIVUZQRFlybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVjNjgwMjA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjkgfSwgIC8vIEluc3QgIzM1MjIgPSBWU0hVRlBEWXJtaQ0KKyAgeyAzNTIzLAk0LAkxLAkwLAkiVlNIVUZQRFlycmkiLCAwLCAweDVjNjgwMjA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzAgfSwgIC8vIEluc3QgIzM1MjMgPSBWU0hVRlBEWXJyaQ0KKyAgeyAzNTI0LAk4LAkxLAkwLAkiVlNIVUZQRHJtaSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NWM2ODAyMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNCB9LCAgLy8gSW5zdCAjMzUyNCA9IFZTSFVGUERybWkNCisgIHsgMzUyNSwJNCwJMSwJMCwJIlZTSFVGUERycmkiLCAwLCAweDVjNjgwMjA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm83OCB9LCAgLy8gSW5zdCAjMzUyNSA9IFZTSFVGUERycmkNCisgIHsgMzUyNiwJOCwJMSwJMCwJIlZTSFVGUFNZcm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1YzY0MDIwMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI5IH0sICAvLyBJbnN0ICMzNTI2ID0gVlNIVUZQU1lybWkNCisgIHsgMzUyNywJNCwJMSwJMCwJIlZTSFVGUFNZcnJpIiwgMCwgMHg1YzY0MDIwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjMwIH0sICAvLyBJbnN0ICMzNTI3ID0gVlNIVUZQU1lycmkNCisgIHsgMzUyOCwJOCwJMSwJMCwJIlZTSFVGUFNybWkiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDVjNjQwMjAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzQgfSwgIC8vIEluc3QgIzM1MjggPSBWU0hVRlBTcm1pDQorICB7IDM1MjksCTQsCTEsCTAsCSJWU0hVRlBTcnJpIiwgMCwgMHg1YzY0MDIwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNzggfSwgIC8vIEluc3QgIzM1MjkgPSBWU0hVRlBTcnJpDQorICB7IDM1MzAsCTYsCTEsCTAsCSJWU1FSVFBEWW0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE1MTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzUgfSwgIC8vIEluc3QgIzM1MzAgPSBWU1FSVFBEWW0NCisgIHsgMzUzMSwJNiwJMSwJMCwJIlZTUVJUUERZbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE1MTgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzUgfSwgIC8vIEluc3QgIzM1MzEgPSBWU1FSVFBEWW1fSW50DQorICB7IDM1MzIsCTIsCTEsCTAsCSJWU1FSVFBEWXIiLCAwLCAweDE1MTgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzM1MzIgPSBWU1FSVFBEWXINCisgIHsgMzUzMywJMiwJMSwJMCwJIlZTUVJUUERZcl9JbnQiLCAwLCAweDE1MTgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzM1MzMgPSBWU1FSVFBEWXJfSW50DQorICB7IDM1MzQsCTYsCTEsCTAsCSJWU1FSVFBEbSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTUxODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzNTM0ID0gVlNRUlRQRG0NCisgIHsgMzUzNSwJNiwJMSwJMCwJIlZTUVJUUERtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTUxODAwMTQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzNTM1ID0gVlNRUlRQRG1fSW50DQorICB7IDM1MzYsCTIsCTEsCTAsCSJWU1FSVFBEciIsIDAsIDB4MTUxODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzNTM2ID0gVlNRUlRQRHINCisgIHsgMzUzNywJMiwJMSwJMCwJIlZTUVJUUERyX0ludCIsIDAsIDB4MTUxODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzNTM3ID0gVlNRUlRQRHJfSW50DQorICB7IDM1MzgsCTYsCTEsCTAsCSJWU1FSVFBTWW0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE1MTQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzUgfSwgIC8vIEluc3QgIzM1MzggPSBWU1FSVFBTWW0NCisgIHsgMzUzOSwJNiwJMSwJMCwJIlZTUVJUUFNZbV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDE1MTQwMDEwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzUgfSwgIC8vIEluc3QgIzM1MzkgPSBWU1FSVFBTWW1fSW50DQorICB7IDM1NDAsCTIsCTEsCTAsCSJWU1FSVFBTWXIiLCAwLCAweDE1MTQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzM1NDAgPSBWU1FSVFBTWXINCisgIHsgMzU0MSwJMiwJMSwJMCwJIlZTUVJUUFNZcl9JbnQiLCAwLCAweDE1MTQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMzkgfSwgIC8vIEluc3QgIzM1NDEgPSBWU1FSVFBTWXJfSW50DQorICB7IDM1NDIsCTYsCTEsCTAsCSJWU1FSVFBTbSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTUxNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzNTQyID0gVlNRUlRQU20NCisgIHsgMzU0MywJNiwJMSwJMCwJIlZTUVJUUFNtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTUxNDAwMTA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzNTQzID0gVlNRUlRQU21fSW50DQorICB7IDM1NDQsCTIsCTEsCTAsCSJWU1FSVFBTciIsIDAsIDB4MTUxNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzNTQ0ID0gVlNRUlRQU3INCisgIHsgMzU0NSwJMiwJMSwJMCwJIlZTUVJUUFNyX0ludCIsIDAsIDB4MTUxNDAwMTA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQzIH0sICAvLyBJbnN0ICMzNTQ1ID0gVlNRUlRQU3JfSW50DQorICB7IDM1NDYsCTcsCTEsCTAsCSJWU1FSVFNEbSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1MTAwMGIwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjQgfSwgIC8vIEluc3QgIzM1NDYgPSBWU1FSVFNEbQ0KKyAgeyAzNTQ3LAk2LAkxLAkwLAkiVlNRUlRTRG1fSW50IiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NTEwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDIgfSwgIC8vIEluc3QgIzM1NDcgPSBWU1FSVFNEbV9JbnQNCisgIHsgMzU0OCwJMywJMSwJMCwJIlZTUVJUU0RyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTUxMDAwYjA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNSB9LCAgLy8gSW5zdCAjMzU0OCA9IFZTUVJUU0RyDQorICB7IDM1NDksCTIsCTEsCTAsCSJWU1FSVFNEcl9JbnQiLCAwLCAweDU1MTAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzU0OSA9IFZTUVJUU0RyX0ludA0KKyAgeyAzNTUwLAk3LAkxLAkwLAkiVlNRUlRTU20iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTEwMDBjMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI2IH0sICAvLyBJbnN0ICMzNTUwID0gVlNRUlRTU20NCisgIHsgMzU1MSwJNiwJMSwJMCwJIlZTUVJUU1NtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTUxMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzQyIH0sICAvLyBJbnN0ICMzNTUxID0gVlNRUlRTU21fSW50DQorICB7IDM1NTIsCTMsCTEsCTAsCSJWU1FSVFNTciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1MTAwMGMwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjcgfSwgIC8vIEluc3QgIzM1NTIgPSBWU1FSVFNTcg0KKyAgeyAzNTUzLAkyLAkxLAkwLAkiVlNRUlRTU3JfSW50IiwgMCwgMHg1NTEwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNDMgfSwgIC8vIEluc3QgIzM1NTMgPSBWU1FSVFNTcl9JbnQNCisgIHsgMzU1NCwJNSwJMCwJMCwJIlZTVE1YQ1NSIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDFhZTQwMDAxYlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNCB9LCAgLy8gSW5zdCAjMzU1NCA9IFZTVE1YQ1NSDQorICB7IDM1NTUsCTcsCTEsCTAsCSJWU1VCUERZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1YzgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzM1NTUgPSBWU1VCUERZcm0NCisgIHsgMzU1NiwJMywJMSwJMCwJIlZTVUJQRFlyciIsIDAsIDB4NTVjODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMzU1NiA9IFZTVUJQRFlycg0KKyAgeyAzNTU3LAk3LAkxLAkwLAkiVlNVQlBEcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1YzgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM1NTcgPSBWU1VCUERybQ0KKyAgeyAzNTU4LAkzLAkxLAkwLAkiVlNVQlBEcnIiLCAwLCAweDU1YzgwMDE0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM1NTggPSBWU1VCUERycg0KKyAgeyAzNTU5LAk3LAkxLAkwLAkiVlNVQlBTWXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWM0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMzNTU5ID0gVlNVQlBTWXJtDQorICB7IDM1NjAsCTMsCTEsCTAsCSJWU1VCUFNZcnIiLCAwLCAweDU1YzQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzM1NjAgPSBWU1VCUFNZcnINCisgIHsgMzU2MSwJNywJMSwJMCwJIlZTVUJQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWM0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNTYxID0gVlNVQlBTcm0NCisgIHsgMzU2MiwJMywJMSwJMCwJIlZTVUJQU3JyIiwgMCwgMHg1NWM0MDAxMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNTYyID0gVlNVQlBTcnINCisgIHsgMzU2MywJNywJMSwJMCwJIlZTVUJTRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NWMwMDBiMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI0IH0sICAvLyBJbnN0ICMzNTYzID0gVlNVQlNEcm0NCisgIHsgMzU2NCwJNywJMSwJMCwJIlZTVUJTRHJtX0ludCIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVjMDAwYjA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzU2NCA9IFZTVUJTRHJtX0ludA0KKyAgeyAzNTY1LAkzLAkxLAkwLAkiVlNVQlNEcnIiLCAwLCAweDU1YzAwMGIwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjUgfSwgIC8vIEluc3QgIzM1NjUgPSBWU1VCU0Rycg0KKyAgeyAzNTY2LAkzLAkxLAkwLAkiVlNVQlNEcnJfSW50IiwgMCwgMHg1NWMwMDBiMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNTY2ID0gVlNVQlNEcnJfSW50DQorICB7IDM1NjcsCTcsCTEsCTAsCSJWU1VCU1NybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTVjMDAwYzA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyNiB9LCAgLy8gSW5zdCAjMzU2NyA9IFZTVUJTU3JtDQorICB7IDM1NjgsCTcsCTEsCTAsCSJWU1VCU1NybV9JbnQiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDU1YzAwMGMwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM1NjggPSBWU1VCU1NybV9JbnQNCisgIHsgMzU2OSwJMywJMSwJMCwJIlZTVUJTU3JyIiwgMCwgMHg1NWMwMDBjMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjI3IH0sICAvLyBJbnN0ICMzNTY5ID0gVlNVQlNTcnINCisgIHsgMzU3MCwJMywJMSwJMCwJIlZTVUJTU3JyX0ludCIsIDAsIDB4NTVjMDAwYzA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzU3MCA9IFZTVUJTU3JyX0ludA0KKyAgeyAzNTcxLAk2LAkwLAkwLAkiVlRFU1RQRFlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTBmYzAwZDQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMzNTcxID0gVlRFU1RQRFlybQ0KKyAgeyAzNTcyLAkyLAkwLAkwLAkiVlRFU1RQRFlyciIsIDAsIDB4MTBmYzAwZDQ1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjM5IH0sICAvLyBJbnN0ICMzNTcyID0gVlRFU1RQRFlycg0KKyAgeyAzNTczLAk2LAkwLAkwLAkiVlRFU1RQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMGZjMDBkNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzU3MyA9IFZURVNUUERybQ0KKyAgeyAzNTc0LAkyLAkwLAkwLAkiVlRFU1RQRHJyIiwgMCwgMHgxMGZjMDBkNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzU3NCA9IFZURVNUUERycg0KKyAgeyAzNTc1LAk2LAkwLAkwLAkiVlRFU1RQU1lybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTBlYzAwZDQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjM1IH0sICAvLyBJbnN0ICMzNTc1ID0gVlRFU1RQU1lybQ0KKyAgeyAzNTc2LAkyLAkwLAkwLAkiVlRFU1RQU1lyciIsIDAsIDB4MTBlYzAwZDQ1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjM5IH0sICAvLyBJbnN0ICMzNTc2ID0gVlRFU1RQU1lycg0KKyAgeyAzNTc3LAk2LAkwLAkwLAkiVlRFU1RQU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMGVjMDBkNDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MiB9LCAgLy8gSW5zdCAjMzU3NyA9IFZURVNUUFNybQ0KKyAgeyAzNTc4LAkyLAkwLAkwLAkiVlRFU1RQU3JyIiwgMCwgMHgxMGVjMDBkNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm80MyB9LCAgLy8gSW5zdCAjMzU3OCA9IFZURVNUUFNycg0KKyAgeyAzNTc5LAk2LAkwLAkwLAkiVlVDT01JU0RybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4MTJlODAwMDQ2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvOTIgfSwgIC8vIEluc3QgIzM1NzkgPSBWVUNPTUlTRHJtDQorICB7IDM1ODAsCTIsCTAsCTAsCSJWVUNPTUlTRHJyIiwgMCwgMHgxMmU4MDAwNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMTYgfSwgIC8vIEluc3QgIzM1ODAgPSBWVUNPTUlTRHJyDQorICB7IDM1ODEsCTYsCTAsCTAsCSJWVUNPTUlTU3JtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgxMmU0MDAwMDZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm85MCB9LCAgLy8gSW5zdCAjMzU4MSA9IFZVQ09NSVNTcm0NCisgIHsgMzU4MiwJMiwJMCwJMCwJIlZVQ09NSVNTcnIiLCAwLCAweDEyZTQwMDAwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzExNyB9LCAgLy8gSW5zdCAjMzU4MiA9IFZVQ09NSVNTcnINCisgIHsgMzU4MywJNywJMSwJMCwJIlZVTlBDS0hQRFlybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTE1ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMzU4MyA9IFZVTlBDS0hQRFlybQ0KKyAgeyAzNTg0LAkzLAkxLAkwLAkiVlVOUENLSFBEWXJyIiwgMCwgMHg1MTU4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMzNTg0ID0gVlVOUENLSFBEWXJyDQorICB7IDM1ODUsCTcsCTEsCTAsCSJWVU5QQ0tIUERybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTE1ODAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzU4NSA9IFZVTlBDS0hQRHJtDQorICB7IDM1ODYsCTMsCTEsCTAsCSJWVU5QQ0tIUERyciIsIDAsIDB4NTE1ODAwMDQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzU4NiA9IFZVTlBDS0hQRHJyDQorICB7IDM1ODcsCTcsCTEsCTAsCSJWVU5QQ0tIUFNZcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUxNTQwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzM1ODcgPSBWVU5QQ0tIUFNZcm0NCisgIHsgMzU4OCwJMywJMSwJMCwJIlZVTlBDS0hQU1lyciIsIDAsIDB4NTE1NDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMyB9LCAgLy8gSW5zdCAjMzU4OCA9IFZVTlBDS0hQU1lycg0KKyAgeyAzNTg5LAk3LAkxLAkwLAkiVlVOUENLSFBTcm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDUxNTQwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM1ODkgPSBWVU5QQ0tIUFNybQ0KKyAgeyAzNTkwLAkzLAkxLAkwLAkiVlVOUENLSFBTcnIiLCAwLCAweDUxNTQwMDAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM1OTAgPSBWVU5QQ0tIUFNycg0KKyAgeyAzNTkxLAk3LAkxLAkwLAkiVlVOUENLTFBEWXJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MTQ4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMzNTkxID0gVlVOUENLTFBEWXJtDQorICB7IDM1OTIsCTMsCTEsCTAsCSJWVU5QQ0tMUERZcnIiLCAwLCAweDUxNDgwMDA0NVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzM1OTIgPSBWVU5QQ0tMUERZcnINCisgIHsgMzU5MywJNywJMSwJMCwJIlZVTlBDS0xQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1MTQ4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM1IH0sICAvLyBJbnN0ICMzNTkzID0gVlVOUENLTFBEcm0NCisgIHsgMzU5NCwJMywJMSwJMCwJIlZVTlBDS0xQRHJyIiwgMCwgMHg1MTQ4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNTk0ID0gVlVOUENLTFBEcnINCisgIHsgMzU5NSwJNywJMSwJMCwJIlZVTlBDS0xQU1lybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTE0NDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIyMiB9LCAgLy8gSW5zdCAjMzU5NSA9IFZVTlBDS0xQU1lybQ0KKyAgeyAzNTk2LAkzLAkxLAkwLAkiVlVOUENLTFBTWXJyIiwgMCwgMHg1MTQ0MDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMzNTk2ID0gVlVOUENLTFBTWXJyDQorICB7IDM1OTcsCTcsCTEsCTAsCSJWVU5QQ0tMUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTE0NDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzU5NyA9IFZVTlBDS0xQU3JtDQorICB7IDM1OTgsCTMsCTEsCTAsCSJWVU5QQ0tMUFNyciIsIDAsIDB4NTE0NDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNiB9LCAgLy8gSW5zdCAjMzU5OCA9IFZVTlBDS0xQU3JyDQorICB7IDM1OTksCTcsCTEsCTAsCSJWWE9SUERZcm0iLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTc4MDAwNDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIyIH0sICAvLyBJbnN0ICMzNTk5ID0gVlhPUlBEWXJtDQorICB7IDM2MDAsCTMsCTEsCTAsCSJWWE9SUERZcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTc4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIzIH0sICAvLyBJbnN0ICMzNjAwID0gVlhPUlBEWXJyDQorICB7IDM2MDEsCTcsCTEsCTAsCSJWWE9SUERybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1NzgwMDA0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzUgfSwgIC8vIEluc3QgIzM2MDEgPSBWWE9SUERybQ0KKyAgeyAzNjAyLAkzLAkxLAkwLAkiVlhPUlBEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg1NTc4MDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTM2IH0sICAvLyBJbnN0ICMzNjAyID0gVlhPUlBEcnINCisgIHsgMzYwMywJNywJMSwJMCwJIlZYT1JQU1lybSIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1NzQwMDAwNlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjIgfSwgIC8vIEluc3QgIzM2MDMgPSBWWE9SUFNZcm0NCisgIHsgMzYwNCwJMywJMSwJMCwJIlZYT1JQU1lyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1NzQwMDAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yMjMgfSwgIC8vIEluc3QgIzM2MDQgPSBWWE9SUFNZcnINCisgIHsgMzYwNSwJNywJMSwJMCwJIlZYT1JQU3JtIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4NTU3NDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzNSB9LCAgLy8gSW5zdCAjMzYwNSA9IFZYT1JQU3JtDQorICB7IDM2MDYsCTMsCTEsCTAsCSJWWE9SUFNyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDU1NzQwMDAwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xMzYgfSwgIC8vIEluc3QgIzM2MDYgPSBWWE9SUFNycg0KKyAgeyAzNjA3LAkwLAkwLAkwLAkiVlpFUk9BTEwiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MTE3NzAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMzYwNyA9IFZaRVJPQUxMDQorICB7IDM2MDgsCTAsCTAsCTAsCSJWWkVST1VQUEVSIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDE3NzAwMDAwMVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAgLy8gSW5zdCAjMzYwOCA9IFZaRVJPVVBQRVINCisgIHsgMzYwOSwJMSwJMSwJMCwJIlZfU0VUMFBEIiwgMHwoMTw8VElEOjpGb2xkYWJsZUFzTG9hZCl8KDE8PFRJRDo6UmVtYXRlcmlhbGl6YWJsZSl8KDE8PFRJRDo6Q2hlYXBBc0FNb3ZlKSwgMHg1NzgwMDE2MFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yNjYgfSwgIC8vIEluc3QgIzM2MDkgPSBWX1NFVDBQRA0KKyAgeyAzNjEwLAkxLAkxLAkwLAkiVl9TRVQwUEkiLCAwfCgxPDxUSUQ6OkZvbGRhYmxlQXNMb2FkKXwoMTw8VElEOjpSZW1hdGVyaWFsaXphYmxlKXwoMTw8VElEOjpDaGVhcEFzQU1vdmUpLCAweGVmYzAwMTYwVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2NiB9LCAgLy8gSW5zdCAjMzYxMCA9IFZfU0VUMFBJDQorICB7IDM2MTEsCTEsCTEsCTAsCSJWX1NFVDBQUyIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpfCgxPDxUSUQ6OkNoZWFwQXNBTW92ZSksIDB4NTc0MDAxMjBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjY2IH0sICAvLyBJbnN0ICMzNjExID0gVl9TRVQwUFMNCisgIHsgMzYxMiwJMSwJMSwJMCwJIlZfU0VUQUxMT05FUyIsIDB8KDE8PFRJRDo6Rm9sZGFibGVBc0xvYWQpfCgxPDxUSUQ6OlJlbWF0ZXJpYWxpemFibGUpfCgxPDxUSUQ6OkNoZWFwQXNBTW92ZSksIDB4NzZjMDAxNjBVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjY2IH0sICAvLyBJbnN0ICMzNjEyID0gVl9TRVRBTExPTkVTDQorICB7IDM2MTMsCTAsCTAsCTAsCSJXQUlUIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4OWIwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzM2MTMgPSBXQUlUDQorICB7IDM2MTQsCTAsCTAsCTAsCSJXQklOVkQiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg5MDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMzNjE0ID0gV0JJTlZEDQorICB7IDM2MTUsCTUsCTAsCTAsCSJXSU5DQUxMNjRtIiwgMHwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpWYXJpYWRpYyksIDB4ZmYwMDAwMWFVTEwsIEltcGxpY2l0TGlzdDQsIEltcGxpY2l0TGlzdDU5LCBCYXJyaWVyczgsIE9wZXJhbmRJbmZvMzQgfSwgIC8vIEluc3QgIzM2MTUgPSBXSU5DQUxMNjRtDQorICB7IDM2MTYsCTEsCTAsCTAsCSJXSU5DQUxMNjRwY3JlbDMyIiwgMHwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpWYXJpYWRpYyl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGU4MDBjMDAxVUxMLCBJbXBsaWNpdExpc3Q0LCBJbXBsaWNpdExpc3Q1OSwgQmFycmllcnM4LCBPcGVyYW5kSW5mbzIgfSwgIC8vIEluc3QgIzM2MTYgPSBXSU5DQUxMNjRwY3JlbDMyDQorICB7IDM2MTcsCTEsCTAsCTAsCSJXSU5DQUxMNjRyIiwgMHwoMTw8VElEOjpDYWxsKXwoMTw8VElEOjpWYXJpYWRpYyksIDB4ZmYwMDAwMTJVTEwsIEltcGxpY2l0TGlzdDQsIEltcGxpY2l0TGlzdDU5LCBCYXJyaWVyczgsIE9wZXJhbmRJbmZvNjUgfSwgIC8vIEluc3QgIzM2MTcgPSBXSU5DQUxMNjRyDQorICB7IDM2MTgsCTAsCTAsCTAsCSJXUk1TUiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDMwMDAwMTAxVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH0sICAvLyBJbnN0ICMzNjE4ID0gV1JNU1INCisgIHsgMzYxOSwJNiwJMCwJMCwJIlhBREQxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSl8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMxMDAwMTQ0VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzExIH0sICAvLyBJbnN0ICMzNjE5ID0gWEFERDE2cm0NCisgIHsgMzYyMCwJMiwJMSwJMCwJIlhBREQxNnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzEwMDAxNDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvNTQgfSwgIC8vIEluc3QgIzM2MjAgPSBYQUREMTZycg0KKyAgeyAzNjIxLAk2LAkwLAkwLAkiWEFERDMycm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzEwMDAxMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTUgfSwgIC8vIEluc3QgIzM2MjEgPSBYQUREMzJybQ0KKyAgeyAzNjIyLAkyLAkxLAkwLAkiWEFERDMycnIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMTAwMDEwM1VMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm81NiB9LCAgLy8gSW5zdCAjMzYyMiA9IFhBREQzMnJyDQorICB7IDM2MjMsCTYsCTAsCTAsCSJYQURENjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjMTAwMTEwNFVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8xOSB9LCAgLy8gSW5zdCAjMzYyMyA9IFhBREQ2NHJtDQorICB7IDM2MjQsCTIsCTEsCTAsCSJYQURENjRyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweGMxMDAxMTAzVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzU4IH0sICAvLyBJbnN0ICMzNjI0ID0gWEFERDY0cnINCisgIHsgMzYyNSwJNiwJMCwJMCwJIlhBREQ4cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKXwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzAwMDAxMDRVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjQgfSwgIC8vIEluc3QgIzM2MjUgPSBYQUREOHJtDQorICB7IDM2MjYsCTIsCTEsCTAsCSJYQUREOHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4YzAwMDAxMDNVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvODEgfSwgIC8vIEluc3QgIzM2MjYgPSBYQUREOHJyDQorICB7IDM2MjcsCTEsCTAsCTAsCSJYQ0hHMTZhciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDkwMDAwMDQyVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEwNCB9LCAgLy8gSW5zdCAjMzYyNyA9IFhDSEcxNmFyDQorICB7IDM2MjgsCTcsCTEsCTAsCSJYQ0hHMTZybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDg3MDAwMDQ2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICMzNjI4ID0gWENIRzE2cm0NCisgIHsgMzYyOSwJMywJMSwJMCwJIlhDSEcxNnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ODcwMDAwNDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTQgfSwgIC8vIEluc3QgIzM2MjkgPSBYQ0hHMTZycg0KKyAgeyAzNjMwLAkxLAkwLAkwLAkiWENIRzMyYXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg5MDAwMDAwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NCB9LCAgLy8gSW5zdCAjMzYzMCA9IFhDSEczMmFyDQorICB7IDM2MzEsCTcsCTEsCTAsCSJYQ0hHMzJybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDg3MDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICMzNjMxID0gWENIRzMycm0NCisgIHsgMzYzMiwJMywJMSwJMCwJIlhDSEczMnJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ODcwMDAwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMTggfSwgIC8vIEluc3QgIzM2MzIgPSBYQ0hHMzJycg0KKyAgeyAzNjMzLAkxLAkwLAkwLAkiWENIRzY0YXIiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHg5MDAwMTAwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm82NSB9LCAgLy8gSW5zdCAjMzYzMyA9IFhDSEc2NGFyDQorICB7IDM2MzQsCTcsCTEsCTAsCSJYQ0hHNjRybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDg3MDAxMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzIxIH0sICAvLyBJbnN0ICMzNjM0ID0gWENIRzY0cm0NCisgIHsgMzYzNSwJMywJMSwJMCwJIlhDSEc2NHJyIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ODcwMDEwMDVVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjIgfSwgIC8vIEluc3QgIzM2MzUgPSBYQ0hHNjRycg0KKyAgeyAzNjM2LAk3LAkxLAkwLAkiWENIRzhybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDg2MDAwMDA2VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI2IH0sICAvLyBJbnN0ICMzNjM2ID0gWENIRzhybQ0KKyAgeyAzNjM3LAkzLAkxLAkwLAkiWENIRzhyciIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDg2MDAwMDA1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI3IH0sICAvLyBJbnN0ICMzNjM3ID0gWENIRzhycg0KKyAgeyAzNjM4LAkxLAkwLAkwLAkiWENIX0YiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHhjODAwMDQwMlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8zNSB9LCAgLy8gSW5zdCAjMzYzOCA9IFhDSF9GDQorICB7IDM2MzksCTAsCTAsCTAsCSJYTEFUIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4ZDcwMDAwMDFVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgIC8vIEluc3QgIzM2MzkgPSBYTEFUDQorICB7IDM2NDAsCTEsCTAsCTAsCSJYT1IxNmkxNiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDM1MDA2MDQxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMzY0MCA9IFhPUjE2aTE2DQorICB7IDM2NDEsCTYsCTAsCTAsCSJYT1IxNm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODEwMDYwNWVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMzY0MSA9IFhPUjE2bWkNCisgIHsgMzY0MiwJNiwJMCwJMCwJIlhPUjE2bWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODMwMDIwNWVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMzY0MiA9IFhPUjE2bWk4DQorICB7IDM2NDMsCTYsCTAsCTAsCSJYT1IxNm1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4MzEwMDAwNDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMSB9LCAgLy8gSW5zdCAjMzY0MyA9IFhPUjE2bXINCisgIHsgMzY0NCwJMywJMSwJMCwJIlhPUjE2cmkiLCAwLCAweDgxMDA2MDU2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTIgfSwgIC8vIEluc3QgIzM2NDQgPSBYT1IxNnJpDQorICB7IDM2NDUsCTMsCTEsCTAsCSJYT1IxNnJpOCIsIDAsIDB4ODMwMDIwNTZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMiB9LCAgLy8gSW5zdCAjMzY0NSA9IFhPUjE2cmk4DQorICB7IDM2NDYsCTcsCTEsCTAsCSJYT1IxNnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMzAwMDA0NlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEzIH0sICAvLyBJbnN0ICMzNjQ2ID0gWE9SMTZybQ0KKyAgeyAzNjQ3LAkzLAkxLAkwLAkiWE9SMTZyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4MzEwMDAwNDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjMzY0NyA9IFhPUjE2cnINCisgIHsgMzY0OCwJMywJMSwJMCwJIlhPUjE2cnJfUkVWIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzMwMDAwNDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNCB9LCAgLy8gSW5zdCAjMzY0OCA9IFhPUjE2cnJfUkVWDQorICB7IDM2NDksCTEsCTAsCTAsCSJYT1IzMmkzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDM1MDBhMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMzY0OSA9IFhPUjMyaTMyDQorICB7IDM2NTAsCTYsCTAsCTAsCSJYT1IzMm1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODEwMGEwMWVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMzY1MCA9IFhPUjMybWkNCisgIHsgMzY1MSwJNiwJMCwJMCwJIlhPUjMybWk4IiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODMwMDIwMWVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMzY1MSA9IFhPUjMybWk4DQorICB7IDM2NTIsCTYsCTAsCTAsCSJYT1IzMm1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4MzEwMDAwMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNSB9LCAgLy8gSW5zdCAjMzY1MiA9IFhPUjMybXINCisgIHsgMzY1MywJMywJMSwJMCwJIlhPUjMycmkiLCAwLCAweDgxMDBhMDE2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTYgfSwgIC8vIEluc3QgIzM2NTMgPSBYT1IzMnJpDQorICB7IDM2NTQsCTMsCTEsCTAsCSJYT1IzMnJpOCIsIDAsIDB4ODMwMDIwMTZVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xNiB9LCAgLy8gSW5zdCAjMzY1NCA9IFhPUjMycmk4DQorICB7IDM2NTUsCTcsCTEsCTAsCSJYT1IzMnJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHgzMzAwMDAwNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzE3IH0sICAvLyBJbnN0ICMzNjU1ID0gWE9SMzJybQ0KKyAgeyAzNjU2LAkzLAkxLAkwLAkiWE9SMzJyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4MzEwMDAwMDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMzY1NiA9IFhPUjMycnINCisgIHsgMzY1NywJMywJMSwJMCwJIlhPUjMycnJfUkVWIiwgMHwoMTw8VElEOjpVbm1vZGVsZWRTaWRlRWZmZWN0cyksIDB4MzMwMDAwMDVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xOCB9LCAgLy8gSW5zdCAjMzY1NyA9IFhPUjMycnJfUkVWDQorICB7IDM2NTgsCTEsCTAsCTAsCSJYT1I2NGkzMiIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDM1MDBiMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMzY1OCA9IFhPUjY0aTMyDQorICB7IDM2NTksCTYsCTAsCTAsCSJYT1I2NG1pMzIiLCAwfCgxPDxUSUQ6Ok1heUxvYWQpfCgxPDxUSUQ6Ok1heVN0b3JlKSwgMHg4MTAwYjAxZVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzEwIH0sICAvLyBJbnN0ICMzNjU5ID0gWE9SNjRtaTMyDQorICB7IDM2NjAsCTYsCTAsCTAsCSJYT1I2NG1pOCIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDgzMDAzMDFlVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTAgfSwgIC8vIEluc3QgIzM2NjAgPSBYT1I2NG1pOA0KKyAgeyAzNjYxLAk2LAkwLAkwLAkiWE9SNjRtciIsIDB8KDE8PFRJRDo6TWF5TG9hZCl8KDE8PFRJRDo6TWF5U3RvcmUpLCAweDMxMDAxMDA0VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMTkgfSwgIC8vIEluc3QgIzM2NjEgPSBYT1I2NG1yDQorICB7IDM2NjIsCTMsCTEsCTAsCSJYT1I2NHJpMzIiLCAwLCAweDgxMDBiMDE2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjAgfSwgIC8vIEluc3QgIzM2NjIgPSBYT1I2NHJpMzINCisgIHsgMzY2MywJMywJMSwJMCwJIlhPUjY0cmk4IiwgMCwgMHg4MzAwMzAxNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIwIH0sICAvLyBJbnN0ICMzNjYzID0gWE9SNjRyaTgNCisgIHsgMzY2NCwJNywJMSwJMCwJIlhPUjY0cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMzMDAxMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjEgfSwgIC8vIEluc3QgIzM2NjQgPSBYT1I2NHJtDQorICB7IDM2NjUsCTMsCTEsCTAsCSJYT1I2NHJyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHgzMTAwMTAwM1VMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIyIH0sICAvLyBJbnN0ICMzNjY1ID0gWE9SNjRycg0KKyAgeyAzNjY2LAkzLAkxLAkwLAkiWE9SNjRycl9SRVYiLCAwfCgxPDxUSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKSwgMHgzMzAwMTAwNVVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzIyIH0sICAvLyBJbnN0ICMzNjY2ID0gWE9SNjRycl9SRVYNCisgIHsgMzY2NywJMSwJMCwJMCwJIlhPUjhpOCIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDM0MDAyMDAxVUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMiB9LCAgLy8gSW5zdCAjMzY2NyA9IFhPUjhpOA0KKyAgeyAzNjY4LAk2LAkwLAkwLAkiWE9SOG1pIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4ODAwMDIwMWVVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8xMCB9LCAgLy8gSW5zdCAjMzY2OCA9IFhPUjhtaQ0KKyAgeyAzNjY5LAk2LAkwLAkwLAkiWE9SOG1yIiwgMHwoMTw8VElEOjpNYXlMb2FkKXwoMTw8VElEOjpNYXlTdG9yZSksIDB4MzAwMDAwMDRVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNCB9LCAgLy8gSW5zdCAjMzY2OSA9IFhPUjhtcg0KKyAgeyAzNjcwLAkzLAkxLAkwLAkiWE9SOHJpIiwgMCwgMHg4MDAwMjAxNlVMTCwgTlVMTCwgSW1wbGljaXRMaXN0MSwgQmFycmllcnMxLCBPcGVyYW5kSW5mbzI1IH0sICAvLyBJbnN0ICMzNjcwID0gWE9SOHJpDQorICB7IDM2NzEsCTcsCTEsCTAsCSJYT1I4cm0iLCAwfCgxPDxUSUQ6Ok1heUxvYWQpLCAweDMyMDAwMDA2VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjYgfSwgIC8vIEluc3QgIzM2NzEgPSBYT1I4cm0NCisgIHsgMzY3MiwJMywJMSwJMCwJIlhPUjhyciIsIDB8KDE8PFRJRDo6Q29tbXV0YWJsZSksIDB4MzAwMDAwMDNVTEwsIE5VTEwsIEltcGxpY2l0TGlzdDEsIEJhcnJpZXJzMSwgT3BlcmFuZEluZm8yNyB9LCAgLy8gSW5zdCAjMzY3MiA9IFhPUjhycg0KKyAgeyAzNjczLAkzLAkxLAkwLAkiWE9SOHJyX1JFViIsIDB8KDE8PFRJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpLCAweDMyMDAwMDA1VUxMLCBOVUxMLCBJbXBsaWNpdExpc3QxLCBCYXJyaWVyczEsIE9wZXJhbmRJbmZvMjcgfSwgIC8vIEluc3QgIzM2NzMgPSBYT1I4cnJfUkVWDQorICB7IDM2NzQsCTcsCTEsCTAsCSJYT1JQRHJtIiwgMHwoMTw8VElEOjpNYXlMb2FkKSwgMHg1NzgwMDE0NlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOCB9LCAgLy8gSW5zdCAjMzY3NCA9IFhPUlBEcm0NCisgIHsgMzY3NSwJMywJMSwJMCwJIlhPUlBEcnIiLCAwfCgxPDxUSUQ6OkNvbW11dGFibGUpLCAweDU3ODAwMTQ1VUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBPcGVyYW5kSW5mbzI5IH0sICAvLyBJbnN0ICMzNjc1ID0gWE9SUERycg0KKyAgeyAzNjc2LAk3LAkxLAkwLAkiWE9SUFNybSIsIDB8KDE8PFRJRDo6TWF5TG9hZCksIDB4NTc0MDAxMDZVTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE9wZXJhbmRJbmZvMjggfSwgIC8vIEluc3QgIzM2NzYgPSBYT1JQU3JtDQorICB7IDM2NzcsCTMsCTEsCTAsCSJYT1JQU3JyIiwgMHwoMTw8VElEOjpDb21tdXRhYmxlKSwgMHg1NzQwMDEwNVVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgT3BlcmFuZEluZm8yOSB9LCAgLy8gSW5zdCAjMzY3NyA9IFhPUlBTcnINCit9Ow0KK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlIA0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5JbnN0ck5hbWVzLmluYyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5JbnN0ck5hbWVzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGNiNGRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIveDg2L1g4Nkdlbkluc3RyTmFtZXMuaW5jCkBAIC0wLDAgKzEsMzY5NCBAQAorLy89PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8NCisvLw0KKy8vIFRhcmdldCBJbnN0cnVjdGlvbiBFbnVtIFZhbHVlcw0KKy8vDQorLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhDQorLy8NCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKw0KK25hbWVzcGFjZSBsbHZtIHsNCisNCituYW1lc3BhY2UgWDg2IHsNCisgIGVudW0gew0KKyAgICBQSEkJPSAwLA0KKyAgICBJTkxJTkVBU00JPSAxLA0KKyAgICBQUk9MT0dfTEFCRUwJPSAyLA0KKyAgICBFSF9MQUJFTAk9IDMsDQorICAgIEdDX0xBQkVMCT0gNCwNCisgICAgS0lMTAk9IDUsDQorICAgIEVYVFJBQ1RfU1VCUkVHCT0gNiwNCisgICAgSU5TRVJUX1NVQlJFRwk9IDcsDQorICAgIElNUExJQ0lUX0RFRgk9IDgsDQorICAgIFNVQlJFR19UT19SRUcJPSA5LA0KKyAgICBDT1BZX1RPX1JFR0NMQVNTCT0gMTAsDQorICAgIERCR19WQUxVRQk9IDExLA0KKyAgICBSRUdfU0VRVUVOQ0UJPSAxMiwNCisgICAgQ09QWQk9IDEzLA0KKyAgICBBQlNfRgk9IDE0LA0KKyAgICBBQlNfRnAzMgk9IDE1LA0KKyAgICBBQlNfRnA2NAk9IDE2LA0KKyAgICBBQlNfRnA4MAk9IDE3LA0KKyAgICBBREMxNmkxNgk9IDE4LA0KKyAgICBBREMxNm1pCT0gMTksDQorICAgIEFEQzE2bWk4CT0gMjAsDQorICAgIEFEQzE2bXIJPSAyMSwNCisgICAgQURDMTZyaQk9IDIyLA0KKyAgICBBREMxNnJpOAk9IDIzLA0KKyAgICBBREMxNnJtCT0gMjQsDQorICAgIEFEQzE2cnIJPSAyNSwNCisgICAgQURDMTZycl9SRVYJPSAyNiwNCisgICAgQURDMzJpMzIJPSAyNywNCisgICAgQURDMzJtaQk9IDI4LA0KKyAgICBBREMzMm1pOAk9IDI5LA0KKyAgICBBREMzMm1yCT0gMzAsDQorICAgIEFEQzMycmkJPSAzMSwNCisgICAgQURDMzJyaTgJPSAzMiwNCisgICAgQURDMzJybQk9IDMzLA0KKyAgICBBREMzMnJyCT0gMzQsDQorICAgIEFEQzMycnJfUkVWCT0gMzUsDQorICAgIEFEQzY0aTMyCT0gMzYsDQorICAgIEFEQzY0bWkzMgk9IDM3LA0KKyAgICBBREM2NG1pOAk9IDM4LA0KKyAgICBBREM2NG1yCT0gMzksDQorICAgIEFEQzY0cmkzMgk9IDQwLA0KKyAgICBBREM2NHJpOAk9IDQxLA0KKyAgICBBREM2NHJtCT0gNDIsDQorICAgIEFEQzY0cnIJPSA0MywNCisgICAgQURDNjRycl9SRVYJPSA0NCwNCisgICAgQURDOGk4CT0gNDUsDQorICAgIEFEQzhtaQk9IDQ2LA0KKyAgICBBREM4bXIJPSA0NywNCisgICAgQURDOHJpCT0gNDgsDQorICAgIEFEQzhybQk9IDQ5LA0KKyAgICBBREM4cnIJPSA1MCwNCisgICAgQURDOHJyX1JFVgk9IDUxLA0KKyAgICBBREQxNmkxNgk9IDUyLA0KKyAgICBBREQxNm1pCT0gNTMsDQorICAgIEFERDE2bWk4CT0gNTQsDQorICAgIEFERDE2bXIJPSA1NSwNCisgICAgQUREMTZyaQk9IDU2LA0KKyAgICBBREQxNnJpOAk9IDU3LA0KKyAgICBBREQxNnJtCT0gNTgsDQorICAgIEFERDE2cnIJPSA1OSwNCisgICAgQUREMTZycl9hbHQJPSA2MCwNCisgICAgQUREMzJpMzIJPSA2MSwNCisgICAgQUREMzJtaQk9IDYyLA0KKyAgICBBREQzMm1pOAk9IDYzLA0KKyAgICBBREQzMm1yCT0gNjQsDQorICAgIEFERDMycmkJPSA2NSwNCisgICAgQUREMzJyaTgJPSA2NiwNCisgICAgQUREMzJybQk9IDY3LA0KKyAgICBBREQzMnJyCT0gNjgsDQorICAgIEFERDMycnJfYWx0CT0gNjksDQorICAgIEFERDY0aTMyCT0gNzAsDQorICAgIEFERDY0bWkzMgk9IDcxLA0KKyAgICBBREQ2NG1pOAk9IDcyLA0KKyAgICBBREQ2NG1yCT0gNzMsDQorICAgIEFERDY0cmkzMgk9IDc0LA0KKyAgICBBREQ2NHJpOAk9IDc1LA0KKyAgICBBREQ2NHJtCT0gNzYsDQorICAgIEFERDY0cnIJPSA3NywNCisgICAgQURENjRycl9hbHQJPSA3OCwNCisgICAgQUREOGk4CT0gNzksDQorICAgIEFERDhtaQk9IDgwLA0KKyAgICBBREQ4bXIJPSA4MSwNCisgICAgQUREOHJpCT0gODIsDQorICAgIEFERDhybQk9IDgzLA0KKyAgICBBREQ4cnIJPSA4NCwNCisgICAgQUREOHJyX2FsdAk9IDg1LA0KKyAgICBBRERQRHJtCT0gODYsDQorICAgIEFERFBEcnIJPSA4NywNCisgICAgQUREUFNybQk9IDg4LA0KKyAgICBBRERQU3JyCT0gODksDQorICAgIEFERFNEcm0JPSA5MCwNCisgICAgQUREU0RybV9JbnQJPSA5MSwNCisgICAgQUREU0Rycgk9IDkyLA0KKyAgICBBRERTRHJyX0ludAk9IDkzLA0KKyAgICBBRERTU3JtCT0gOTQsDQorICAgIEFERFNTcm1fSW50CT0gOTUsDQorICAgIEFERFNTcnIJPSA5NiwNCisgICAgQUREU1Nycl9JbnQJPSA5NywNCisgICAgQUREU1VCUERybQk9IDk4LA0KKyAgICBBRERTVUJQRHJyCT0gOTksDQorICAgIEFERFNVQlBTcm0JPSAxMDAsDQorICAgIEFERFNVQlBTcnIJPSAxMDEsDQorICAgIEFERF9GMzJtCT0gMTAyLA0KKyAgICBBRERfRjY0bQk9IDEwMywNCisgICAgQUREX0ZJMTZtCT0gMTA0LA0KKyAgICBBRERfRkkzMm0JPSAxMDUsDQorICAgIEFERF9GUHJTVDAJPSAxMDYsDQorICAgIEFERF9GU1Qwcgk9IDEwNywNCisgICAgQUREX0ZwMzIJPSAxMDgsDQorICAgIEFERF9GcDMybQk9IDEwOSwNCisgICAgQUREX0ZwNjQJPSAxMTAsDQorICAgIEFERF9GcDY0bQk9IDExMSwNCisgICAgQUREX0ZwNjRtMzIJPSAxMTIsDQorICAgIEFERF9GcDgwCT0gMTEzLA0KKyAgICBBRERfRnA4MG0zMgk9IDExNCwNCisgICAgQUREX0ZwODBtNjQJPSAxMTUsDQorICAgIEFERF9GcEkxNm0zMgk9IDExNiwNCisgICAgQUREX0ZwSTE2bTY0CT0gMTE3LA0KKyAgICBBRERfRnBJMTZtODAJPSAxMTgsDQorICAgIEFERF9GcEkzMm0zMgk9IDExOSwNCisgICAgQUREX0ZwSTMybTY0CT0gMTIwLA0KKyAgICBBRERfRnBJMzJtODAJPSAxMjEsDQorICAgIEFERF9GclNUMAk9IDEyMiwNCisgICAgQURKQ0FMTFNUQUNLRE9XTjMyCT0gMTIzLA0KKyAgICBBREpDQUxMU1RBQ0tET1dONjQJPSAxMjQsDQorICAgIEFESkNBTExTVEFDS1VQMzIJPSAxMjUsDQorICAgIEFESkNBTExTVEFDS1VQNjQJPSAxMjYsDQorICAgIEFFU0RFQ0xBU1RybQk9IDEyNywNCisgICAgQUVTREVDTEFTVHJyCT0gMTI4LA0KKyAgICBBRVNERUNybQk9IDEyOSwNCisgICAgQUVTREVDcnIJPSAxMzAsDQorICAgIEFFU0VOQ0xBU1RybQk9IDEzMSwNCisgICAgQUVTRU5DTEFTVHJyCT0gMTMyLA0KKyAgICBBRVNFTkNybQk9IDEzMywNCisgICAgQUVTRU5DcnIJPSAxMzQsDQorICAgIEFFU0lNQ3JtCT0gMTM1LA0KKyAgICBBRVNJTUNycgk9IDEzNiwNCisgICAgQUVTS0VZR0VOQVNTSVNUMTI4cm0JPSAxMzcsDQorICAgIEFFU0tFWUdFTkFTU0lTVDEyOHJyCT0gMTM4LA0KKyAgICBBTkQxNmkxNgk9IDEzOSwNCisgICAgQU5EMTZtaQk9IDE0MCwNCisgICAgQU5EMTZtaTgJPSAxNDEsDQorICAgIEFORDE2bXIJPSAxNDIsDQorICAgIEFORDE2cmkJPSAxNDMsDQorICAgIEFORDE2cmk4CT0gMTQ0LA0KKyAgICBBTkQxNnJtCT0gMTQ1LA0KKyAgICBBTkQxNnJyCT0gMTQ2LA0KKyAgICBBTkQxNnJyX1JFVgk9IDE0NywNCisgICAgQU5EMzJpMzIJPSAxNDgsDQorICAgIEFORDMybWkJPSAxNDksDQorICAgIEFORDMybWk4CT0gMTUwLA0KKyAgICBBTkQzMm1yCT0gMTUxLA0KKyAgICBBTkQzMnJpCT0gMTUyLA0KKyAgICBBTkQzMnJpOAk9IDE1MywNCisgICAgQU5EMzJybQk9IDE1NCwNCisgICAgQU5EMzJycgk9IDE1NSwNCisgICAgQU5EMzJycl9SRVYJPSAxNTYsDQorICAgIEFORDY0aTMyCT0gMTU3LA0KKyAgICBBTkQ2NG1pMzIJPSAxNTgsDQorICAgIEFORDY0bWk4CT0gMTU5LA0KKyAgICBBTkQ2NG1yCT0gMTYwLA0KKyAgICBBTkQ2NHJpMzIJPSAxNjEsDQorICAgIEFORDY0cmk4CT0gMTYyLA0KKyAgICBBTkQ2NHJtCT0gMTYzLA0KKyAgICBBTkQ2NHJyCT0gMTY0LA0KKyAgICBBTkQ2NHJyX1JFVgk9IDE2NSwNCisgICAgQU5EOGk4CT0gMTY2LA0KKyAgICBBTkQ4bWkJPSAxNjcsDQorICAgIEFORDhtcgk9IDE2OCwNCisgICAgQU5EOHJpCT0gMTY5LA0KKyAgICBBTkQ4cm0JPSAxNzAsDQorICAgIEFORDhycgk9IDE3MSwNCisgICAgQU5EOHJyX1JFVgk9IDE3MiwNCisgICAgQU5ETlBEcm0JPSAxNzMsDQorICAgIEFORE5QRHJyCT0gMTc0LA0KKyAgICBBTkROUFNybQk9IDE3NSwNCisgICAgQU5ETlBTcnIJPSAxNzYsDQorICAgIEFORFBEcm0JPSAxNzcsDQorICAgIEFORFBEcnIJPSAxNzgsDQorICAgIEFORFBTcm0JPSAxNzksDQorICAgIEFORFBTcnIJPSAxODAsDQorICAgIEFUT01BREQ2NDMyCT0gMTgxLA0KKyAgICBBVE9NQU5EMTYJPSAxODIsDQorICAgIEFUT01BTkQzMgk9IDE4MywNCisgICAgQVRPTUFORDY0CT0gMTg0LA0KKyAgICBBVE9NQU5ENjQzMgk9IDE4NSwNCisgICAgQVRPTUFORDgJPSAxODYsDQorICAgIEFUT01NQVgxNgk9IDE4NywNCisgICAgQVRPTU1BWDMyCT0gMTg4LA0KKyAgICBBVE9NTUFYNjQJPSAxODksDQorICAgIEFUT01NSU4xNgk9IDE5MCwNCisgICAgQVRPTU1JTjMyCT0gMTkxLA0KKyAgICBBVE9NTUlONjQJPSAxOTIsDQorICAgIEFUT01OQU5EMTYJPSAxOTMsDQorICAgIEFUT01OQU5EMzIJPSAxOTQsDQorICAgIEFUT01OQU5ENjQJPSAxOTUsDQorICAgIEFUT01OQU5ENjQzMgk9IDE5NiwNCisgICAgQVRPTU5BTkQ4CT0gMTk3LA0KKyAgICBBVE9NT1IxNgk9IDE5OCwNCisgICAgQVRPTU9SMzIJPSAxOTksDQorICAgIEFUT01PUjY0CT0gMjAwLA0KKyAgICBBVE9NT1I2NDMyCT0gMjAxLA0KKyAgICBBVE9NT1I4CT0gMjAyLA0KKyAgICBBVE9NU1VCNjQzMgk9IDIwMywNCisgICAgQVRPTVNXQVA2NDMyCT0gMjA0LA0KKyAgICBBVE9NVU1BWDE2CT0gMjA1LA0KKyAgICBBVE9NVU1BWDMyCT0gMjA2LA0KKyAgICBBVE9NVU1BWDY0CT0gMjA3LA0KKyAgICBBVE9NVU1JTjE2CT0gMjA4LA0KKyAgICBBVE9NVU1JTjMyCT0gMjA5LA0KKyAgICBBVE9NVU1JTjY0CT0gMjEwLA0KKyAgICBBVE9NWE9SMTYJPSAyMTEsDQorICAgIEFUT01YT1IzMgk9IDIxMiwNCisgICAgQVRPTVhPUjY0CT0gMjEzLA0KKyAgICBBVE9NWE9SNjQzMgk9IDIxNCwNCisgICAgQVRPTVhPUjgJPSAyMTUsDQorICAgIEJMRU5EUERybWkJPSAyMTYsDQorICAgIEJMRU5EUERycmkJPSAyMTcsDQorICAgIEJMRU5EUFNybWkJPSAyMTgsDQorICAgIEJMRU5EUFNycmkJPSAyMTksDQorICAgIEJMRU5EVlBEcm0wCT0gMjIwLA0KKyAgICBCTEVORFZQRHJyMAk9IDIyMSwNCisgICAgQkxFTkRWUFNybTAJPSAyMjIsDQorICAgIEJMRU5EVlBTcnIwCT0gMjIzLA0KKyAgICBCU0YxNnJtCT0gMjI0LA0KKyAgICBCU0YxNnJyCT0gMjI1LA0KKyAgICBCU0YzMnJtCT0gMjI2LA0KKyAgICBCU0YzMnJyCT0gMjI3LA0KKyAgICBCU0Y2NHJtCT0gMjI4LA0KKyAgICBCU0Y2NHJyCT0gMjI5LA0KKyAgICBCU1IxNnJtCT0gMjMwLA0KKyAgICBCU1IxNnJyCT0gMjMxLA0KKyAgICBCU1IzMnJtCT0gMjMyLA0KKyAgICBCU1IzMnJyCT0gMjMzLA0KKyAgICBCU1I2NHJtCT0gMjM0LA0KKyAgICBCU1I2NHJyCT0gMjM1LA0KKyAgICBCU1dBUDMycgk9IDIzNiwNCisgICAgQlNXQVA2NHIJPSAyMzcsDQorICAgIEJUMTZtaTgJPSAyMzgsDQorICAgIEJUMTZtcgk9IDIzOSwNCisgICAgQlQxNnJpOAk9IDI0MCwNCisgICAgQlQxNnJyCT0gMjQxLA0KKyAgICBCVDMybWk4CT0gMjQyLA0KKyAgICBCVDMybXIJPSAyNDMsDQorICAgIEJUMzJyaTgJPSAyNDQsDQorICAgIEJUMzJycgk9IDI0NSwNCisgICAgQlQ2NG1pOAk9IDI0NiwNCisgICAgQlQ2NG1yCT0gMjQ3LA0KKyAgICBCVDY0cmk4CT0gMjQ4LA0KKyAgICBCVDY0cnIJPSAyNDksDQorICAgIEJUQzE2bWk4CT0gMjUwLA0KKyAgICBCVEMxNm1yCT0gMjUxLA0KKyAgICBCVEMxNnJpOAk9IDI1MiwNCisgICAgQlRDMTZycgk9IDI1MywNCisgICAgQlRDMzJtaTgJPSAyNTQsDQorICAgIEJUQzMybXIJPSAyNTUsDQorICAgIEJUQzMycmk4CT0gMjU2LA0KKyAgICBCVEMzMnJyCT0gMjU3LA0KKyAgICBCVEM2NG1pOAk9IDI1OCwNCisgICAgQlRDNjRtcgk9IDI1OSwNCisgICAgQlRDNjRyaTgJPSAyNjAsDQorICAgIEJUQzY0cnIJPSAyNjEsDQorICAgIEJUUjE2bWk4CT0gMjYyLA0KKyAgICBCVFIxNm1yCT0gMjYzLA0KKyAgICBCVFIxNnJpOAk9IDI2NCwNCisgICAgQlRSMTZycgk9IDI2NSwNCisgICAgQlRSMzJtaTgJPSAyNjYsDQorICAgIEJUUjMybXIJPSAyNjcsDQorICAgIEJUUjMycmk4CT0gMjY4LA0KKyAgICBCVFIzMnJyCT0gMjY5LA0KKyAgICBCVFI2NG1pOAk9IDI3MCwNCisgICAgQlRSNjRtcgk9IDI3MSwNCisgICAgQlRSNjRyaTgJPSAyNzIsDQorICAgIEJUUjY0cnIJPSAyNzMsDQorICAgIEJUUzE2bWk4CT0gMjc0LA0KKyAgICBCVFMxNm1yCT0gMjc1LA0KKyAgICBCVFMxNnJpOAk9IDI3NiwNCisgICAgQlRTMTZycgk9IDI3NywNCisgICAgQlRTMzJtaTgJPSAyNzgsDQorICAgIEJUUzMybXIJPSAyNzksDQorICAgIEJUUzMycmk4CT0gMjgwLA0KKyAgICBCVFMzMnJyCT0gMjgxLA0KKyAgICBCVFM2NG1pOAk9IDI4MiwNCisgICAgQlRTNjRtcgk9IDI4MywNCisgICAgQlRTNjRyaTgJPSAyODQsDQorICAgIEJUUzY0cnIJPSAyODUsDQorICAgIENBTEwzMm0JPSAyODYsDQorICAgIENBTEwzMnIJPSAyODcsDQorICAgIENBTEw2NG0JPSAyODgsDQorICAgIENBTEw2NHBjcmVsMzIJPSAyODksDQorICAgIENBTEw2NHIJPSAyOTAsDQorICAgIENBTExwY3JlbDE2CT0gMjkxLA0KKyAgICBDQUxMcGNyZWwzMgk9IDI5MiwNCisgICAgQ0JXCT0gMjkzLA0KKyAgICBDRFEJPSAyOTQsDQorICAgIENEUUUJPSAyOTUsDQorICAgIENIU19GCT0gMjk2LA0KKyAgICBDSFNfRnAzMgk9IDI5NywNCisgICAgQ0hTX0ZwNjQJPSAyOTgsDQorICAgIENIU19GcDgwCT0gMjk5LA0KKyAgICBDTEMJPSAzMDAsDQorICAgIENMRAk9IDMwMSwNCisgICAgQ0xGTFVTSAk9IDMwMiwNCisgICAgQ0xJCT0gMzAzLA0KKyAgICBDTFRTCT0gMzA0LA0KKyAgICBDTUMJPSAzMDUsDQorICAgIENNT1ZBMTZybQk9IDMwNiwNCisgICAgQ01PVkExNnJyCT0gMzA3LA0KKyAgICBDTU9WQTMycm0JPSAzMDgsDQorICAgIENNT1ZBMzJycgk9IDMwOSwNCisgICAgQ01PVkE2NHJtCT0gMzEwLA0KKyAgICBDTU9WQTY0cnIJPSAzMTEsDQorICAgIENNT1ZBRTE2cm0JPSAzMTIsDQorICAgIENNT1ZBRTE2cnIJPSAzMTMsDQorICAgIENNT1ZBRTMycm0JPSAzMTQsDQorICAgIENNT1ZBRTMycnIJPSAzMTUsDQorICAgIENNT1ZBRTY0cm0JPSAzMTYsDQorICAgIENNT1ZBRTY0cnIJPSAzMTcsDQorICAgIENNT1ZCMTZybQk9IDMxOCwNCisgICAgQ01PVkIxNnJyCT0gMzE5LA0KKyAgICBDTU9WQjMycm0JPSAzMjAsDQorICAgIENNT1ZCMzJycgk9IDMyMSwNCisgICAgQ01PVkI2NHJtCT0gMzIyLA0KKyAgICBDTU9WQjY0cnIJPSAzMjMsDQorICAgIENNT1ZCRTE2cm0JPSAzMjQsDQorICAgIENNT1ZCRTE2cnIJPSAzMjUsDQorICAgIENNT1ZCRTMycm0JPSAzMjYsDQorICAgIENNT1ZCRTMycnIJPSAzMjcsDQorICAgIENNT1ZCRTY0cm0JPSAzMjgsDQorICAgIENNT1ZCRTY0cnIJPSAzMjksDQorICAgIENNT1ZCRV9GCT0gMzMwLA0KKyAgICBDTU9WQkVfRnAzMgk9IDMzMSwNCisgICAgQ01PVkJFX0ZwNjQJPSAzMzIsDQorICAgIENNT1ZCRV9GcDgwCT0gMzMzLA0KKyAgICBDTU9WQl9GCT0gMzM0LA0KKyAgICBDTU9WQl9GcDMyCT0gMzM1LA0KKyAgICBDTU9WQl9GcDY0CT0gMzM2LA0KKyAgICBDTU9WQl9GcDgwCT0gMzM3LA0KKyAgICBDTU9WRTE2cm0JPSAzMzgsDQorICAgIENNT1ZFMTZycgk9IDMzOSwNCisgICAgQ01PVkUzMnJtCT0gMzQwLA0KKyAgICBDTU9WRTMycnIJPSAzNDEsDQorICAgIENNT1ZFNjRybQk9IDM0MiwNCisgICAgQ01PVkU2NHJyCT0gMzQzLA0KKyAgICBDTU9WRV9GCT0gMzQ0LA0KKyAgICBDTU9WRV9GcDMyCT0gMzQ1LA0KKyAgICBDTU9WRV9GcDY0CT0gMzQ2LA0KKyAgICBDTU9WRV9GcDgwCT0gMzQ3LA0KKyAgICBDTU9WRzE2cm0JPSAzNDgsDQorICAgIENNT1ZHMTZycgk9IDM0OSwNCisgICAgQ01PVkczMnJtCT0gMzUwLA0KKyAgICBDTU9WRzMycnIJPSAzNTEsDQorICAgIENNT1ZHNjRybQk9IDM1MiwNCisgICAgQ01PVkc2NHJyCT0gMzUzLA0KKyAgICBDTU9WR0UxNnJtCT0gMzU0LA0KKyAgICBDTU9WR0UxNnJyCT0gMzU1LA0KKyAgICBDTU9WR0UzMnJtCT0gMzU2LA0KKyAgICBDTU9WR0UzMnJyCT0gMzU3LA0KKyAgICBDTU9WR0U2NHJtCT0gMzU4LA0KKyAgICBDTU9WR0U2NHJyCT0gMzU5LA0KKyAgICBDTU9WTDE2cm0JPSAzNjAsDQorICAgIENNT1ZMMTZycgk9IDM2MSwNCisgICAgQ01PVkwzMnJtCT0gMzYyLA0KKyAgICBDTU9WTDMycnIJPSAzNjMsDQorICAgIENNT1ZMNjRybQk9IDM2NCwNCisgICAgQ01PVkw2NHJyCT0gMzY1LA0KKyAgICBDTU9WTEUxNnJtCT0gMzY2LA0KKyAgICBDTU9WTEUxNnJyCT0gMzY3LA0KKyAgICBDTU9WTEUzMnJtCT0gMzY4LA0KKyAgICBDTU9WTEUzMnJyCT0gMzY5LA0KKyAgICBDTU9WTEU2NHJtCT0gMzcwLA0KKyAgICBDTU9WTEU2NHJyCT0gMzcxLA0KKyAgICBDTU9WTkJFX0YJPSAzNzIsDQorICAgIENNT1ZOQkVfRnAzMgk9IDM3MywNCisgICAgQ01PVk5CRV9GcDY0CT0gMzc0LA0KKyAgICBDTU9WTkJFX0ZwODAJPSAzNzUsDQorICAgIENNT1ZOQl9GCT0gMzc2LA0KKyAgICBDTU9WTkJfRnAzMgk9IDM3NywNCisgICAgQ01PVk5CX0ZwNjQJPSAzNzgsDQorICAgIENNT1ZOQl9GcDgwCT0gMzc5LA0KKyAgICBDTU9WTkUxNnJtCT0gMzgwLA0KKyAgICBDTU9WTkUxNnJyCT0gMzgxLA0KKyAgICBDTU9WTkUzMnJtCT0gMzgyLA0KKyAgICBDTU9WTkUzMnJyCT0gMzgzLA0KKyAgICBDTU9WTkU2NHJtCT0gMzg0LA0KKyAgICBDTU9WTkU2NHJyCT0gMzg1LA0KKyAgICBDTU9WTkVfRgk9IDM4NiwNCisgICAgQ01PVk5FX0ZwMzIJPSAzODcsDQorICAgIENNT1ZORV9GcDY0CT0gMzg4LA0KKyAgICBDTU9WTkVfRnA4MAk9IDM4OSwNCisgICAgQ01PVk5PMTZybQk9IDM5MCwNCisgICAgQ01PVk5PMTZycgk9IDM5MSwNCisgICAgQ01PVk5PMzJybQk9IDM5MiwNCisgICAgQ01PVk5PMzJycgk9IDM5MywNCisgICAgQ01PVk5PNjRybQk9IDM5NCwNCisgICAgQ01PVk5PNjRycgk9IDM5NSwNCisgICAgQ01PVk5QMTZybQk9IDM5NiwNCisgICAgQ01PVk5QMTZycgk9IDM5NywNCisgICAgQ01PVk5QMzJybQk9IDM5OCwNCisgICAgQ01PVk5QMzJycgk9IDM5OSwNCisgICAgQ01PVk5QNjRybQk9IDQwMCwNCisgICAgQ01PVk5QNjRycgk9IDQwMSwNCisgICAgQ01PVk5QX0YJPSA0MDIsDQorICAgIENNT1ZOUF9GcDMyCT0gNDAzLA0KKyAgICBDTU9WTlBfRnA2NAk9IDQwNCwNCisgICAgQ01PVk5QX0ZwODAJPSA0MDUsDQorICAgIENNT1ZOUzE2cm0JPSA0MDYsDQorICAgIENNT1ZOUzE2cnIJPSA0MDcsDQorICAgIENNT1ZOUzMycm0JPSA0MDgsDQorICAgIENNT1ZOUzMycnIJPSA0MDksDQorICAgIENNT1ZOUzY0cm0JPSA0MTAsDQorICAgIENNT1ZOUzY0cnIJPSA0MTEsDQorICAgIENNT1ZPMTZybQk9IDQxMiwNCisgICAgQ01PVk8xNnJyCT0gNDEzLA0KKyAgICBDTU9WTzMycm0JPSA0MTQsDQorICAgIENNT1ZPMzJycgk9IDQxNSwNCisgICAgQ01PVk82NHJtCT0gNDE2LA0KKyAgICBDTU9WTzY0cnIJPSA0MTcsDQorICAgIENNT1ZQMTZybQk9IDQxOCwNCisgICAgQ01PVlAxNnJyCT0gNDE5LA0KKyAgICBDTU9WUDMycm0JPSA0MjAsDQorICAgIENNT1ZQMzJycgk9IDQyMSwNCisgICAgQ01PVlA2NHJtCT0gNDIyLA0KKyAgICBDTU9WUDY0cnIJPSA0MjMsDQorICAgIENNT1ZQX0YJPSA0MjQsDQorICAgIENNT1ZQX0ZwMzIJPSA0MjUsDQorICAgIENNT1ZQX0ZwNjQJPSA0MjYsDQorICAgIENNT1ZQX0ZwODAJPSA0MjcsDQorICAgIENNT1ZTMTZybQk9IDQyOCwNCisgICAgQ01PVlMxNnJyCT0gNDI5LA0KKyAgICBDTU9WUzMycm0JPSA0MzAsDQorICAgIENNT1ZTMzJycgk9IDQzMSwNCisgICAgQ01PVlM2NHJtCT0gNDMyLA0KKyAgICBDTU9WUzY0cnIJPSA0MzMsDQorICAgIENNT1ZfRlIzMgk9IDQzNCwNCisgICAgQ01PVl9GUjY0CT0gNDM1LA0KKyAgICBDTU9WX0dSMTYJPSA0MzYsDQorICAgIENNT1ZfR1IzMgk9IDQzNywNCisgICAgQ01PVl9HUjgJPSA0MzgsDQorICAgIENNT1ZfUkZQMzIJPSA0MzksDQorICAgIENNT1ZfUkZQNjQJPSA0NDAsDQorICAgIENNT1ZfUkZQODAJPSA0NDEsDQorICAgIENNT1ZfVjFJNjQJPSA0NDIsDQorICAgIENNT1ZfVjJGNjQJPSA0NDMsDQorICAgIENNT1ZfVjJJNjQJPSA0NDQsDQorICAgIENNT1ZfVjRGMzIJPSA0NDUsDQorICAgIENNUDE2aTE2CT0gNDQ2LA0KKyAgICBDTVAxNm1pCT0gNDQ3LA0KKyAgICBDTVAxNm1pOAk9IDQ0OCwNCisgICAgQ01QMTZtcgk9IDQ0OSwNCisgICAgQ01QMTZyaQk9IDQ1MCwNCisgICAgQ01QMTZyaTgJPSA0NTEsDQorICAgIENNUDE2cm0JPSA0NTIsDQorICAgIENNUDE2cnIJPSA0NTMsDQorICAgIENNUDE2cnJfYWx0CT0gNDU0LA0KKyAgICBDTVAzMmkzMgk9IDQ1NSwNCisgICAgQ01QMzJtaQk9IDQ1NiwNCisgICAgQ01QMzJtaTgJPSA0NTcsDQorICAgIENNUDMybXIJPSA0NTgsDQorICAgIENNUDMycmkJPSA0NTksDQorICAgIENNUDMycmk4CT0gNDYwLA0KKyAgICBDTVAzMnJtCT0gNDYxLA0KKyAgICBDTVAzMnJyCT0gNDYyLA0KKyAgICBDTVAzMnJyX2FsdAk9IDQ2MywNCisgICAgQ01QNjRpMzIJPSA0NjQsDQorICAgIENNUDY0bWkzMgk9IDQ2NSwNCisgICAgQ01QNjRtaTgJPSA0NjYsDQorICAgIENNUDY0bXIJPSA0NjcsDQorICAgIENNUDY0bXJtcnIJPSA0NjgsDQorICAgIENNUDY0cmkzMgk9IDQ2OSwNCisgICAgQ01QNjRyaTgJPSA0NzAsDQorICAgIENNUDY0cm0JPSA0NzEsDQorICAgIENNUDY0cnIJPSA0NzIsDQorICAgIENNUDhpOAk9IDQ3MywNCisgICAgQ01QOG1pCT0gNDc0LA0KKyAgICBDTVA4bXIJPSA0NzUsDQorICAgIENNUDhyaQk9IDQ3NiwNCisgICAgQ01QOHJtCT0gNDc3LA0KKyAgICBDTVA4cnIJPSA0NzgsDQorICAgIENNUDhycl9hbHQJPSA0NzksDQorICAgIENNUFBEcm1pCT0gNDgwLA0KKyAgICBDTVBQRHJtaV9hbHQJPSA0ODEsDQorICAgIENNUFBEcnJpCT0gNDgyLA0KKyAgICBDTVBQRHJyaV9hbHQJPSA0ODMsDQorICAgIENNUFBTcm1pCT0gNDg0LA0KKyAgICBDTVBQU3JtaV9hbHQJPSA0ODUsDQorICAgIENNUFBTcnJpCT0gNDg2LA0KKyAgICBDTVBQU3JyaV9hbHQJPSA0ODcsDQorICAgIENNUFMxNgk9IDQ4OCwNCisgICAgQ01QUzMyCT0gNDg5LA0KKyAgICBDTVBTNjQJPSA0OTAsDQorICAgIENNUFM4CT0gNDkxLA0KKyAgICBDTVBTRHJtCT0gNDkyLA0KKyAgICBDTVBTRHJtX2FsdAk9IDQ5MywNCisgICAgQ01QU0Rycgk9IDQ5NCwNCisgICAgQ01QU0Rycl9hbHQJPSA0OTUsDQorICAgIENNUFNTcm0JPSA0OTYsDQorICAgIENNUFNTcm1fYWx0CT0gNDk3LA0KKyAgICBDTVBTU3JyCT0gNDk4LA0KKyAgICBDTVBTU3JyX2FsdAk9IDQ5OSwNCisgICAgQ01QWENIRzE2Qgk9IDUwMCwNCisgICAgQ01QWENIRzE2cm0JPSA1MDEsDQorICAgIENNUFhDSEcxNnJyCT0gNTAyLA0KKyAgICBDTVBYQ0hHMzJybQk9IDUwMywNCisgICAgQ01QWENIRzMycnIJPSA1MDQsDQorICAgIENNUFhDSEc2NHJtCT0gNTA1LA0KKyAgICBDTVBYQ0hHNjRycgk9IDUwNiwNCisgICAgQ01QWENIRzhCCT0gNTA3LA0KKyAgICBDTVBYQ0hHOHJtCT0gNTA4LA0KKyAgICBDTVBYQ0hHOHJyCT0gNTA5LA0KKyAgICBDT01JU0RybQk9IDUxMCwNCisgICAgQ09NSVNEcnIJPSA1MTEsDQorICAgIENPTUlTU3JtCT0gNTEyLA0KKyAgICBDT01JU1Nycgk9IDUxMywNCisgICAgQ09NUF9GU1Qwcgk9IDUxNCwNCisgICAgQ09NX0ZJUHIJPSA1MTUsDQorICAgIENPTV9GSXIJPSA1MTYsDQorICAgIENPTV9GU1Qwcgk9IDUxNywNCisgICAgQ09TX0YJPSA1MTgsDQorICAgIENPU19GcDMyCT0gNTE5LA0KKyAgICBDT1NfRnA2NAk9IDUyMCwNCisgICAgQ09TX0ZwODAJPSA1MjEsDQorICAgIENQVUlECT0gNTIyLA0KKyAgICBDUU8JPSA1MjMsDQorICAgIENSQzMybTE2CT0gNTI0LA0KKyAgICBDUkMzMm0zMgk9IDUyNSwNCisgICAgQ1JDMzJtOAk9IDUyNiwNCisgICAgQ1JDMzJyMTYJPSA1MjcsDQorICAgIENSQzMycjMyCT0gNTI4LA0KKyAgICBDUkMzMnI4CT0gNTI5LA0KKyAgICBDUkM2NG02NAk9IDUzMCwNCisgICAgQ1JDNjRtOAk9IDUzMSwNCisgICAgQ1JDNjRyNjQJPSA1MzIsDQorICAgIENSQzY0cjgJPSA1MzMsDQorICAgIENTX1BSRUZJWAk9IDUzNCwNCisgICAgQ1ZURFEyUERybQk9IDUzNSwNCisgICAgQ1ZURFEyUERycgk9IDUzNiwNCisgICAgQ1ZURFEyUFNybQk9IDUzNywNCisgICAgQ1ZURFEyUFNycgk9IDUzOCwNCisgICAgQ1ZUUEQyRFFybQk9IDUzOSwNCisgICAgQ1ZUUEQyRFFycgk9IDU0MCwNCisgICAgQ1ZUUEQyUFNybQk9IDU0MSwNCisgICAgQ1ZUUEQyUFNycgk9IDU0MiwNCisgICAgQ1ZUUFMyRFFybQk9IDU0MywNCisgICAgQ1ZUUFMyRFFycgk9IDU0NCwNCisgICAgQ1ZUUFMyUERybQk9IDU0NSwNCisgICAgQ1ZUUFMyUERycgk9IDU0NiwNCisgICAgQ1ZUU0QyU0k2NHJtCT0gNTQ3LA0KKyAgICBDVlRTRDJTSTY0cnIJPSA1NDgsDQorICAgIENWVFNEMlNTcm0JPSA1NDksDQorICAgIENWVFNEMlNTcnIJPSA1NTAsDQorICAgIENWVFNJMlNENjRybQk9IDU1MSwNCisgICAgQ1ZUU0kyU0Q2NHJyCT0gNTUyLA0KKyAgICBDVlRTSTJTRHJtCT0gNTUzLA0KKyAgICBDVlRTSTJTRHJyCT0gNTU0LA0KKyAgICBDVlRTSTJTUzY0cm0JPSA1NTUsDQorICAgIENWVFNJMlNTNjRycgk9IDU1NiwNCisgICAgQ1ZUU0kyU1NybQk9IDU1NywNCisgICAgQ1ZUU0kyU1Nycgk9IDU1OCwNCisgICAgQ1ZUU1MyU0RybQk9IDU1OSwNCisgICAgQ1ZUU1MyU0Rycgk9IDU2MCwNCisgICAgQ1ZUU1MyU0k2NHJtCT0gNTYxLA0KKyAgICBDVlRTUzJTSTY0cnIJPSA1NjIsDQorICAgIENWVFNTMlNJcm0JPSA1NjMsDQorICAgIENWVFNTMlNJcnIJPSA1NjQsDQorICAgIENWVFRQUzJEUXJtCT0gNTY1LA0KKyAgICBDVlRUUFMyRFFycgk9IDU2NiwNCisgICAgQ1ZUVFNEMlNJNjRybQk9IDU2NywNCisgICAgQ1ZUVFNEMlNJNjRycgk9IDU2OCwNCisgICAgQ1ZUVFNEMlNJcm0JPSA1NjksDQorICAgIENWVFRTRDJTSXJyCT0gNTcwLA0KKyAgICBDVlRUU1MyU0k2NHJtCT0gNTcxLA0KKyAgICBDVlRUU1MyU0k2NHJyCT0gNTcyLA0KKyAgICBDVlRUU1MyU0lybQk9IDU3MywNCisgICAgQ1ZUVFNTMlNJcnIJPSA1NzQsDQorICAgIENXRAk9IDU3NSwNCisgICAgQ1dERQk9IDU3NiwNCisgICAgREVDMTZtCT0gNTc3LA0KKyAgICBERUMxNnIJPSA1NzgsDQorICAgIERFQzMybQk9IDU3OSwNCisgICAgREVDMzJyCT0gNTgwLA0KKyAgICBERUM2NF8xNm0JPSA1ODEsDQorICAgIERFQzY0XzE2cgk9IDU4MiwNCisgICAgREVDNjRfMzJtCT0gNTgzLA0KKyAgICBERUM2NF8zMnIJPSA1ODQsDQorICAgIERFQzY0bQk9IDU4NSwNCisgICAgREVDNjRyCT0gNTg2LA0KKyAgICBERUM4bQk9IDU4NywNCisgICAgREVDOHIJPSA1ODgsDQorICAgIERJVjE2bQk9IDU4OSwNCisgICAgRElWMTZyCT0gNTkwLA0KKyAgICBESVYzMm0JPSA1OTEsDQorICAgIERJVjMycgk9IDU5MiwNCisgICAgRElWNjRtCT0gNTkzLA0KKyAgICBESVY2NHIJPSA1OTQsDQorICAgIERJVjhtCT0gNTk1LA0KKyAgICBESVY4cgk9IDU5NiwNCisgICAgRElWUERybQk9IDU5NywNCisgICAgRElWUERycgk9IDU5OCwNCisgICAgRElWUFNybQk9IDU5OSwNCisgICAgRElWUFNycgk9IDYwMCwNCisgICAgRElWUl9GMzJtCT0gNjAxLA0KKyAgICBESVZSX0Y2NG0JPSA2MDIsDQorICAgIERJVlJfRkkxNm0JPSA2MDMsDQorICAgIERJVlJfRkkzMm0JPSA2MDQsDQorICAgIERJVlJfRlByU1QwCT0gNjA1LA0KKyAgICBESVZSX0ZTVDByCT0gNjA2LA0KKyAgICBESVZSX0ZwMzJtCT0gNjA3LA0KKyAgICBESVZSX0ZwNjRtCT0gNjA4LA0KKyAgICBESVZSX0ZwNjRtMzIJPSA2MDksDQorICAgIERJVlJfRnA4MG0zMgk9IDYxMCwNCisgICAgRElWUl9GcDgwbTY0CT0gNjExLA0KKyAgICBESVZSX0ZwSTE2bTMyCT0gNjEyLA0KKyAgICBESVZSX0ZwSTE2bTY0CT0gNjEzLA0KKyAgICBESVZSX0ZwSTE2bTgwCT0gNjE0LA0KKyAgICBESVZSX0ZwSTMybTMyCT0gNjE1LA0KKyAgICBESVZSX0ZwSTMybTY0CT0gNjE2LA0KKyAgICBESVZSX0ZwSTMybTgwCT0gNjE3LA0KKyAgICBESVZSX0ZyU1QwCT0gNjE4LA0KKyAgICBESVZTRHJtCT0gNjE5LA0KKyAgICBESVZTRHJtX0ludAk9IDYyMCwNCisgICAgRElWU0Rycgk9IDYyMSwNCisgICAgRElWU0Rycl9JbnQJPSA2MjIsDQorICAgIERJVlNTcm0JPSA2MjMsDQorICAgIERJVlNTcm1fSW50CT0gNjI0LA0KKyAgICBESVZTU3JyCT0gNjI1LA0KKyAgICBESVZTU3JyX0ludAk9IDYyNiwNCisgICAgRElWX0YzMm0JPSA2MjcsDQorICAgIERJVl9GNjRtCT0gNjI4LA0KKyAgICBESVZfRkkxNm0JPSA2MjksDQorICAgIERJVl9GSTMybQk9IDYzMCwNCisgICAgRElWX0ZQclNUMAk9IDYzMSwNCisgICAgRElWX0ZTVDByCT0gNjMyLA0KKyAgICBESVZfRnAzMgk9IDYzMywNCisgICAgRElWX0ZwMzJtCT0gNjM0LA0KKyAgICBESVZfRnA2NAk9IDYzNSwNCisgICAgRElWX0ZwNjRtCT0gNjM2LA0KKyAgICBESVZfRnA2NG0zMgk9IDYzNywNCisgICAgRElWX0ZwODAJPSA2MzgsDQorICAgIERJVl9GcDgwbTMyCT0gNjM5LA0KKyAgICBESVZfRnA4MG02NAk9IDY0MCwNCisgICAgRElWX0ZwSTE2bTMyCT0gNjQxLA0KKyAgICBESVZfRnBJMTZtNjQJPSA2NDIsDQorICAgIERJVl9GcEkxNm04MAk9IDY0MywNCisgICAgRElWX0ZwSTMybTMyCT0gNjQ0LA0KKyAgICBESVZfRnBJMzJtNjQJPSA2NDUsDQorICAgIERJVl9GcEkzMm04MAk9IDY0NiwNCisgICAgRElWX0ZyU1QwCT0gNjQ3LA0KKyAgICBEUFBEcm1pCT0gNjQ4LA0KKyAgICBEUFBEcnJpCT0gNjQ5LA0KKyAgICBEUFBTcm1pCT0gNjUwLA0KKyAgICBEUFBTcnJpCT0gNjUxLA0KKyAgICBEU19QUkVGSVgJPSA2NTIsDQorICAgIEVIX1JFVFVSTgk9IDY1MywNCisgICAgRUhfUkVUVVJONjQJPSA2NTQsDQorICAgIEVOVEVSCT0gNjU1LA0KKyAgICBFU19QUkVGSVgJPSA2NTYsDQorICAgIEVYVFJBQ1RQU21yCT0gNjU3LA0KKyAgICBFWFRSQUNUUFNycgk9IDY1OCwNCisgICAgRjJYTTEJPSA2NTksDQorICAgIEZBUkNBTEwxNmkJPSA2NjAsDQorICAgIEZBUkNBTEwxNm0JPSA2NjEsDQorICAgIEZBUkNBTEwzMmkJPSA2NjIsDQorICAgIEZBUkNBTEwzMm0JPSA2NjMsDQorICAgIEZBUkNBTEw2NAk9IDY2NCwNCisgICAgRkFSSk1QMTZpCT0gNjY1LA0KKyAgICBGQVJKTVAxNm0JPSA2NjYsDQorICAgIEZBUkpNUDMyaQk9IDY2NywNCisgICAgRkFSSk1QMzJtCT0gNjY4LA0KKyAgICBGQVJKTVA2NAk9IDY2OSwNCisgICAgRkJMRG0JPSA2NzAsDQorICAgIEZCU1RQbQk9IDY3MSwNCisgICAgRkNPTTMybQk9IDY3MiwNCisgICAgRkNPTTY0bQk9IDY3MywNCisgICAgRkNPTVAzMm0JPSA2NzQsDQorICAgIEZDT01QNjRtCT0gNjc1LA0KKyAgICBGQ09NUFAJPSA2NzYsDQorICAgIEZERUNTVFAJPSA2NzcsDQorICAgIEZGUkVFCT0gNjc4LA0KKyAgICBGSUNPTTE2bQk9IDY3OSwNCisgICAgRklDT00zMm0JPSA2ODAsDQorICAgIEZJQ09NUDE2bQk9IDY4MSwNCisgICAgRklDT01QMzJtCT0gNjgyLA0KKyAgICBGSU5DU1RQCT0gNjgzLA0KKyAgICBGTERDVzE2bQk9IDY4NCwNCisgICAgRkxERU5WbQk9IDY4NSwNCisgICAgRkxETDJFCT0gNjg2LA0KKyAgICBGTERMMlQJPSA2ODcsDQorICAgIEZMRExHMgk9IDY4OCwNCisgICAgRkxETE4yCT0gNjg5LA0KKyAgICBGTERQSQk9IDY5MCwNCisgICAgRk5DTEVYCT0gNjkxLA0KKyAgICBGTklOSVQJPSA2OTIsDQorICAgIEZOT1AJPSA2OTMsDQorICAgIEZOU1RDVzE2bQk9IDY5NCwNCisgICAgRk5TVFNXOHIJPSA2OTUsDQorICAgIEZOU1RTV20JPSA2OTYsDQorICAgIEZQMzJfVE9fSU5UMTZfSU5fTUVNCT0gNjk3LA0KKyAgICBGUDMyX1RPX0lOVDMyX0lOX01FTQk9IDY5OCwNCisgICAgRlAzMl9UT19JTlQ2NF9JTl9NRU0JPSA2OTksDQorICAgIEZQNjRfVE9fSU5UMTZfSU5fTUVNCT0gNzAwLA0KKyAgICBGUDY0X1RPX0lOVDMyX0lOX01FTQk9IDcwMSwNCisgICAgRlA2NF9UT19JTlQ2NF9JTl9NRU0JPSA3MDIsDQorICAgIEZQODBfVE9fSU5UMTZfSU5fTUVNCT0gNzAzLA0KKyAgICBGUDgwX1RPX0lOVDMyX0lOX01FTQk9IDcwNCwNCisgICAgRlA4MF9UT19JTlQ2NF9JTl9NRU0JPSA3MDUsDQorICAgIEZQQVRBTgk9IDcwNiwNCisgICAgRlBSRU0JPSA3MDcsDQorICAgIEZQUkVNMQk9IDcwOCwNCisgICAgRlBUQU4JPSA3MDksDQorICAgIEZSTkRJTlQJPSA3MTAsDQorICAgIEZSU1RPUm0JPSA3MTEsDQorICAgIEZTQVZFbQk9IDcxMiwNCisgICAgRlNDQUxFCT0gNzEzLA0KKyAgICBGU0lOQ09TCT0gNzE0LA0KKyAgICBGU1RFTlZtCT0gNzE1LA0KKyAgICBGU19NT1YzMnJtCT0gNzE2LA0KKyAgICBGU19QUkVGSVgJPSA3MTcsDQorICAgIEZYQU0JPSA3MTgsDQorICAgIEZYUlNUT1IJPSA3MTksDQorICAgIEZYU0FWRQk9IDcyMCwNCisgICAgRlhUUkFDVAk9IDcyMSwNCisgICAgRllMMlgJPSA3MjIsDQorICAgIEZZTDJYUDEJPSA3MjMsDQorICAgIEZwR0VUX1NUMF8zMgk9IDcyNCwNCisgICAgRnBHRVRfU1QwXzY0CT0gNzI1LA0KKyAgICBGcEdFVF9TVDBfODAJPSA3MjYsDQorICAgIEZwR0VUX1NUMV8zMgk9IDcyNywNCisgICAgRnBHRVRfU1QxXzY0CT0gNzI4LA0KKyAgICBGcEdFVF9TVDFfODAJPSA3MjksDQorICAgIEZwU0VUX1NUMF8zMgk9IDczMCwNCisgICAgRnBTRVRfU1QwXzY0CT0gNzMxLA0KKyAgICBGcFNFVF9TVDBfODAJPSA3MzIsDQorICAgIEZwU0VUX1NUMV8zMgk9IDczMywNCisgICAgRnBTRVRfU1QxXzY0CT0gNzM0LA0KKyAgICBGcFNFVF9TVDFfODAJPSA3MzUsDQorICAgIEZzQU5ETlBEcm0JPSA3MzYsDQorICAgIEZzQU5ETlBEcnIJPSA3MzcsDQorICAgIEZzQU5ETlBTcm0JPSA3MzgsDQorICAgIEZzQU5ETlBTcnIJPSA3MzksDQorICAgIEZzQU5EUERybQk9IDc0MCwNCisgICAgRnNBTkRQRHJyCT0gNzQxLA0KKyAgICBGc0FORFBTcm0JPSA3NDIsDQorICAgIEZzQU5EUFNycgk9IDc0MywNCisgICAgRnNGTEQwU0QJPSA3NDQsDQorICAgIEZzRkxEMFNTCT0gNzQ1LA0KKyAgICBGc01PVkFQRHJtCT0gNzQ2LA0KKyAgICBGc01PVkFQRHJyCT0gNzQ3LA0KKyAgICBGc01PVkFQU3JtCT0gNzQ4LA0KKyAgICBGc01PVkFQU3JyCT0gNzQ5LA0KKyAgICBGc09SUERybQk9IDc1MCwNCisgICAgRnNPUlBEcnIJPSA3NTEsDQorICAgIEZzT1JQU3JtCT0gNzUyLA0KKyAgICBGc09SUFNycgk9IDc1MywNCisgICAgRnNYT1JQRHJtCT0gNzU0LA0KKyAgICBGc1hPUlBEcnIJPSA3NTUsDQorICAgIEZzWE9SUFNybQk9IDc1NiwNCisgICAgRnNYT1JQU3JyCT0gNzU3LA0KKyAgICBHU19NT1YzMnJtCT0gNzU4LA0KKyAgICBHU19QUkVGSVgJPSA3NTksDQorICAgIEhBRERQRHJtCT0gNzYwLA0KKyAgICBIQUREUERycgk9IDc2MSwNCisgICAgSEFERFBTcm0JPSA3NjIsDQorICAgIEhBRERQU3JyCT0gNzYzLA0KKyAgICBITFQJPSA3NjQsDQorICAgIEhTVUJQRHJtCT0gNzY1LA0KKyAgICBIU1VCUERycgk9IDc2NiwNCisgICAgSFNVQlBTcm0JPSA3NjcsDQorICAgIEhTVUJQU3JyCT0gNzY4LA0KKyAgICBJRElWMTZtCT0gNzY5LA0KKyAgICBJRElWMTZyCT0gNzcwLA0KKyAgICBJRElWMzJtCT0gNzcxLA0KKyAgICBJRElWMzJyCT0gNzcyLA0KKyAgICBJRElWNjRtCT0gNzczLA0KKyAgICBJRElWNjRyCT0gNzc0LA0KKyAgICBJRElWOG0JPSA3NzUsDQorICAgIElESVY4cgk9IDc3NiwNCisgICAgSUxEX0YxNm0JPSA3NzcsDQorICAgIElMRF9GMzJtCT0gNzc4LA0KKyAgICBJTERfRjY0bQk9IDc3OSwNCisgICAgSUxEX0ZwMTZtMzIJPSA3ODAsDQorICAgIElMRF9GcDE2bTY0CT0gNzgxLA0KKyAgICBJTERfRnAxNm04MAk9IDc4MiwNCisgICAgSUxEX0ZwMzJtMzIJPSA3ODMsDQorICAgIElMRF9GcDMybTY0CT0gNzg0LA0KKyAgICBJTERfRnAzMm04MAk9IDc4NSwNCisgICAgSUxEX0ZwNjRtMzIJPSA3ODYsDQorICAgIElMRF9GcDY0bTY0CT0gNzg3LA0KKyAgICBJTERfRnA2NG04MAk9IDc4OCwNCisgICAgSU1VTDE2bQk9IDc4OSwNCisgICAgSU1VTDE2cgk9IDc5MCwNCisgICAgSU1VTDE2cm0JPSA3OTEsDQorICAgIElNVUwxNnJtaQk9IDc5MiwNCisgICAgSU1VTDE2cm1pOAk9IDc5MywNCisgICAgSU1VTDE2cnIJPSA3OTQsDQorICAgIElNVUwxNnJyaQk9IDc5NSwNCisgICAgSU1VTDE2cnJpOAk9IDc5NiwNCisgICAgSU1VTDMybQk9IDc5NywNCisgICAgSU1VTDMycgk9IDc5OCwNCisgICAgSU1VTDMycm0JPSA3OTksDQorICAgIElNVUwzMnJtaQk9IDgwMCwNCisgICAgSU1VTDMycm1pOAk9IDgwMSwNCisgICAgSU1VTDMycnIJPSA4MDIsDQorICAgIElNVUwzMnJyaQk9IDgwMywNCisgICAgSU1VTDMycnJpOAk9IDgwNCwNCisgICAgSU1VTDY0bQk9IDgwNSwNCisgICAgSU1VTDY0cgk9IDgwNiwNCisgICAgSU1VTDY0cm0JPSA4MDcsDQorICAgIElNVUw2NHJtaTMyCT0gODA4LA0KKyAgICBJTVVMNjRybWk4CT0gODA5LA0KKyAgICBJTVVMNjRycgk9IDgxMCwNCisgICAgSU1VTDY0cnJpMzIJPSA4MTEsDQorICAgIElNVUw2NHJyaTgJPSA4MTIsDQorICAgIElNVUw4bQk9IDgxMywNCisgICAgSU1VTDhyCT0gODE0LA0KKyAgICBJTjE2CT0gODE1LA0KKyAgICBJTjE2cmkJPSA4MTYsDQorICAgIElOMTZycgk9IDgxNywNCisgICAgSU4zMgk9IDgxOCwNCisgICAgSU4zMnJpCT0gODE5LA0KKyAgICBJTjMycnIJPSA4MjAsDQorICAgIElOOAk9IDgyMSwNCisgICAgSU44cmkJPSA4MjIsDQorICAgIElOOHJyCT0gODIzLA0KKyAgICBJTkMxNm0JPSA4MjQsDQorICAgIElOQzE2cgk9IDgyNSwNCisgICAgSU5DMzJtCT0gODI2LA0KKyAgICBJTkMzMnIJPSA4MjcsDQorICAgIElOQzY0XzE2bQk9IDgyOCwNCisgICAgSU5DNjRfMTZyCT0gODI5LA0KKyAgICBJTkM2NF8zMm0JPSA4MzAsDQorICAgIElOQzY0XzMycgk9IDgzMSwNCisgICAgSU5DNjRtCT0gODMyLA0KKyAgICBJTkM2NHIJPSA4MzMsDQorICAgIElOQzhtCT0gODM0LA0KKyAgICBJTkM4cgk9IDgzNSwNCisgICAgSU5TRVJUUFNybQk9IDgzNiwNCisgICAgSU5TRVJUUFNycgk9IDgzNywNCisgICAgSU5UCT0gODM4LA0KKyAgICBJTlQzCT0gODM5LA0KKyAgICBJTlRPCT0gODQwLA0KKyAgICBJTlZECT0gODQxLA0KKyAgICBJTlZFUFQJPSA4NDIsDQorICAgIElOVkxQRwk9IDg0MywNCisgICAgSU5WVlBJRAk9IDg0NCwNCisgICAgSVJFVDE2CT0gODQ1LA0KKyAgICBJUkVUMzIJPSA4NDYsDQorICAgIElSRVQ2NAk9IDg0NywNCisgICAgSVNUVF9GUDE2bQk9IDg0OCwNCisgICAgSVNUVF9GUDMybQk9IDg0OSwNCisgICAgSVNUVF9GUDY0bQk9IDg1MCwNCisgICAgSVNUVF9GcDE2bTMyCT0gODUxLA0KKyAgICBJU1RUX0ZwMTZtNjQJPSA4NTIsDQorICAgIElTVFRfRnAxNm04MAk9IDg1MywNCisgICAgSVNUVF9GcDMybTMyCT0gODU0LA0KKyAgICBJU1RUX0ZwMzJtNjQJPSA4NTUsDQorICAgIElTVFRfRnAzMm04MAk9IDg1NiwNCisgICAgSVNUVF9GcDY0bTMyCT0gODU3LA0KKyAgICBJU1RUX0ZwNjRtNjQJPSA4NTgsDQorICAgIElTVFRfRnA2NG04MAk9IDg1OSwNCisgICAgSVNUX0YxNm0JPSA4NjAsDQorICAgIElTVF9GMzJtCT0gODYxLA0KKyAgICBJU1RfRlAxNm0JPSA4NjIsDQorICAgIElTVF9GUDMybQk9IDg2MywNCisgICAgSVNUX0ZQNjRtCT0gODY0LA0KKyAgICBJU1RfRnAxNm0zMgk9IDg2NSwNCisgICAgSVNUX0ZwMTZtNjQJPSA4NjYsDQorICAgIElTVF9GcDE2bTgwCT0gODY3LA0KKyAgICBJU1RfRnAzMm0zMgk9IDg2OCwNCisgICAgSVNUX0ZwMzJtNjQJPSA4NjksDQorICAgIElTVF9GcDMybTgwCT0gODcwLA0KKyAgICBJU1RfRnA2NG0zMgk9IDg3MSwNCisgICAgSVNUX0ZwNjRtNjQJPSA4NzIsDQorICAgIElTVF9GcDY0bTgwCT0gODczLA0KKyAgICBJbnRfQ01QU0RybQk9IDg3NCwNCisgICAgSW50X0NNUFNEcnIJPSA4NzUsDQorICAgIEludF9DTVBTU3JtCT0gODc2LA0KKyAgICBJbnRfQ01QU1Nycgk9IDg3NywNCisgICAgSW50X0NPTUlTRHJtCT0gODc4LA0KKyAgICBJbnRfQ09NSVNEcnIJPSA4NzksDQorICAgIEludF9DT01JU1NybQk9IDg4MCwNCisgICAgSW50X0NPTUlTU3JyCT0gODgxLA0KKyAgICBJbnRfQ1ZURFEyUERybQk9IDg4MiwNCisgICAgSW50X0NWVERRMlBEcnIJPSA4ODMsDQorICAgIEludF9DVlREUTJQU3JtCT0gODg0LA0KKyAgICBJbnRfQ1ZURFEyUFNycgk9IDg4NSwNCisgICAgSW50X0NWVFBEMkRRcm0JPSA4ODYsDQorICAgIEludF9DVlRQRDJEUXJyCT0gODg3LA0KKyAgICBJbnRfQ1ZUUEQyUElybQk9IDg4OCwNCisgICAgSW50X0NWVFBEMlBJcnIJPSA4ODksDQorICAgIEludF9DVlRQRDJQU3JtCT0gODkwLA0KKyAgICBJbnRfQ1ZUUEQyUFNycgk9IDg5MSwNCisgICAgSW50X0NWVFBJMlBEcm0JPSA4OTIsDQorICAgIEludF9DVlRQSTJQRHJyCT0gODkzLA0KKyAgICBJbnRfQ1ZUUEkyUFNybQk9IDg5NCwNCisgICAgSW50X0NWVFBJMlBTcnIJPSA4OTUsDQorICAgIEludF9DVlRQUzJEUXJtCT0gODk2LA0KKyAgICBJbnRfQ1ZUUFMyRFFycgk9IDg5NywNCisgICAgSW50X0NWVFBTMlBEcm0JPSA4OTgsDQorICAgIEludF9DVlRQUzJQRHJyCT0gODk5LA0KKyAgICBJbnRfQ1ZUUFMyUElybQk9IDkwMCwNCisgICAgSW50X0NWVFBTMlBJcnIJPSA5MDEsDQorICAgIEludF9DVlRTRDJTSTY0cm0JPSA5MDIsDQorICAgIEludF9DVlRTRDJTSTY0cnIJPSA5MDMsDQorICAgIEludF9DVlRTRDJTSXJtCT0gOTA0LA0KKyAgICBJbnRfQ1ZUU0QyU0lycgk9IDkwNSwNCisgICAgSW50X0NWVFNEMlNTcm0JPSA5MDYsDQorICAgIEludF9DVlRTRDJTU3JyCT0gOTA3LA0KKyAgICBJbnRfQ1ZUU0kyU0Q2NHJtCT0gOTA4LA0KKyAgICBJbnRfQ1ZUU0kyU0Q2NHJyCT0gOTA5LA0KKyAgICBJbnRfQ1ZUU0kyU0RybQk9IDkxMCwNCisgICAgSW50X0NWVFNJMlNEcnIJPSA5MTEsDQorICAgIEludF9DVlRTSTJTUzY0cm0JPSA5MTIsDQorICAgIEludF9DVlRTSTJTUzY0cnIJPSA5MTMsDQorICAgIEludF9DVlRTSTJTU3JtCT0gOTE0LA0KKyAgICBJbnRfQ1ZUU0kyU1Nycgk9IDkxNSwNCisgICAgSW50X0NWVFNTMlNEcm0JPSA5MTYsDQorICAgIEludF9DVlRTUzJTRHJyCT0gOTE3LA0KKyAgICBJbnRfQ1ZUU1MyU0k2NHJtCT0gOTE4LA0KKyAgICBJbnRfQ1ZUU1MyU0k2NHJyCT0gOTE5LA0KKyAgICBJbnRfQ1ZUU1MyU0lybQk9IDkyMCwNCisgICAgSW50X0NWVFNTMlNJcnIJPSA5MjEsDQorICAgIEludF9DVlRUUEQyRFFybQk9IDkyMiwNCisgICAgSW50X0NWVFRQRDJEUXJyCT0gOTIzLA0KKyAgICBJbnRfQ1ZUVFBEMlBJcm0JPSA5MjQsDQorICAgIEludF9DVlRUUEQyUElycgk9IDkyNSwNCisgICAgSW50X0NWVFRQUzJEUXJtCT0gOTI2LA0KKyAgICBJbnRfQ1ZUVFBTMkRRcnIJPSA5MjcsDQorICAgIEludF9DVlRUUFMyUElybQk9IDkyOCwNCisgICAgSW50X0NWVFRQUzJQSXJyCT0gOTI5LA0KKyAgICBJbnRfQ1ZUVFNEMlNJNjRybQk9IDkzMCwNCisgICAgSW50X0NWVFRTRDJTSTY0cnIJPSA5MzEsDQorICAgIEludF9DVlRUU0QyU0lybQk9IDkzMiwNCisgICAgSW50X0NWVFRTRDJTSXJyCT0gOTMzLA0KKyAgICBJbnRfQ1ZUVFNTMlNJNjRybQk9IDkzNCwNCisgICAgSW50X0NWVFRTUzJTSTY0cnIJPSA5MzUsDQorICAgIEludF9DVlRUU1MyU0lybQk9IDkzNiwNCisgICAgSW50X0NWVFRTUzJTSXJyCT0gOTM3LA0KKyAgICBJbnRfTWVtQmFycmllcgk9IDkzOCwNCisgICAgSW50X01lbUJhcnJpZXJOb1NTRQk9IDkzOSwNCisgICAgSW50X01lbUJhcnJpZXJOb1NTRTY0CT0gOTQwLA0KKyAgICBJbnRfVUNPTUlTRHJtCT0gOTQxLA0KKyAgICBJbnRfVUNPTUlTRHJyCT0gOTQyLA0KKyAgICBJbnRfVUNPTUlTU3JtCT0gOTQzLA0KKyAgICBJbnRfVUNPTUlTU3JyCT0gOTQ0LA0KKyAgICBJbnRfVkNNUFNEcm0JPSA5NDUsDQorICAgIEludF9WQ01QU0Rycgk9IDk0NiwNCisgICAgSW50X1ZDTVBTU3JtCT0gOTQ3LA0KKyAgICBJbnRfVkNNUFNTcnIJPSA5NDgsDQorICAgIEludF9WQ09NSVNEcm0JPSA5NDksDQorICAgIEludF9WQ09NSVNEcnIJPSA5NTAsDQorICAgIEludF9WQ09NSVNTcm0JPSA5NTEsDQorICAgIEludF9WQ09NSVNTcnIJPSA5NTIsDQorICAgIEludF9WQ1ZURFEyUERybQk9IDk1MywNCisgICAgSW50X1ZDVlREUTJQRHJyCT0gOTU0LA0KKyAgICBJbnRfVkNWVERRMlBTcm0JPSA5NTUsDQorICAgIEludF9WQ1ZURFEyUFNycgk9IDk1NiwNCisgICAgSW50X1ZDVlRQRDJEUXJtCT0gOTU3LA0KKyAgICBJbnRfVkNWVFBEMkRRcnIJPSA5NTgsDQorICAgIEludF9WQ1ZUUEQyUFNybQk9IDk1OSwNCisgICAgSW50X1ZDVlRQRDJQU3JyCT0gOTYwLA0KKyAgICBJbnRfVkNWVFBTMkRRcm0JPSA5NjEsDQorICAgIEludF9WQ1ZUUFMyRFFycgk9IDk2MiwNCisgICAgSW50X1ZDVlRQUzJQRHJtCT0gOTYzLA0KKyAgICBJbnRfVkNWVFBTMlBEcnIJPSA5NjQsDQorICAgIEludF9WQ1ZUU0QyU0k2NHJtCT0gOTY1LA0KKyAgICBJbnRfVkNWVFNEMlNJNjRycgk9IDk2NiwNCisgICAgSW50X1ZDVlRTRDJTSXJtCT0gOTY3LA0KKyAgICBJbnRfVkNWVFNEMlNJcnIJPSA5NjgsDQorICAgIEludF9WQ1ZUU0QyU1NybQk9IDk2OSwNCisgICAgSW50X1ZDVlRTRDJTU3JyCT0gOTcwLA0KKyAgICBJbnRfVkNWVFNJMlNENjRybQk9IDk3MSwNCisgICAgSW50X1ZDVlRTSTJTRDY0cnIJPSA5NzIsDQorICAgIEludF9WQ1ZUU0kyU0RybQk9IDk3MywNCisgICAgSW50X1ZDVlRTSTJTRHJyCT0gOTc0LA0KKyAgICBJbnRfVkNWVFNJMlNTNjRybQk9IDk3NSwNCisgICAgSW50X1ZDVlRTSTJTUzY0cnIJPSA5NzYsDQorICAgIEludF9WQ1ZUU0kyU1NybQk9IDk3NywNCisgICAgSW50X1ZDVlRTSTJTU3JyCT0gOTc4LA0KKyAgICBJbnRfVkNWVFNTMlNEcm0JPSA5NzksDQorICAgIEludF9WQ1ZUU1MyU0Rycgk9IDk4MCwNCisgICAgSW50X1ZDVlRTUzJTSTY0cm0JPSA5ODEsDQorICAgIEludF9WQ1ZUU1MyU0k2NHJyCT0gOTgyLA0KKyAgICBJbnRfVkNWVFNTMlNJcm0JPSA5ODMsDQorICAgIEludF9WQ1ZUU1MyU0lycgk9IDk4NCwNCisgICAgSW50X1ZDVlRUUEQyRFFybQk9IDk4NSwNCisgICAgSW50X1ZDVlRUUEQyRFFycgk9IDk4NiwNCisgICAgSW50X1ZDVlRUUFMyRFFybQk9IDk4NywNCisgICAgSW50X1ZDVlRUUFMyRFFycgk9IDk4OCwNCisgICAgSW50X1ZDVlRUU0QyU0k2NHJtCT0gOTg5LA0KKyAgICBJbnRfVkNWVFRTRDJTSTY0cnIJPSA5OTAsDQorICAgIEludF9WQ1ZUVFNEMlNJcm0JPSA5OTEsDQorICAgIEludF9WQ1ZUVFNEMlNJcnIJPSA5OTIsDQorICAgIEludF9WQ1ZUVFNTMlNJNjRybQk9IDk5MywNCisgICAgSW50X1ZDVlRUU1MyU0k2NHJyCT0gOTk0LA0KKyAgICBJbnRfVkNWVFRTUzJTSXJtCT0gOTk1LA0KKyAgICBJbnRfVkNWVFRTUzJTSXJyCT0gOTk2LA0KKyAgICBJbnRfVlVDT01JU0RybQk9IDk5NywNCisgICAgSW50X1ZVQ09NSVNEcnIJPSA5OTgsDQorICAgIEludF9WVUNPTUlTU3JtCT0gOTk5LA0KKyAgICBJbnRfVlVDT01JU1Nycgk9IDEwMDAsDQorICAgIEpBRV8xCT0gMTAwMSwNCisgICAgSkFFXzQJPSAxMDAyLA0KKyAgICBKQV8xCT0gMTAwMywNCisgICAgSkFfNAk9IDEwMDQsDQorICAgIEpCRV8xCT0gMTAwNSwNCisgICAgSkJFXzQJPSAxMDA2LA0KKyAgICBKQl8xCT0gMTAwNywNCisgICAgSkJfNAk9IDEwMDgsDQorICAgIEpDWFo4CT0gMTAwOSwNCisgICAgSkVfMQk9IDEwMTAsDQorICAgIEpFXzQJPSAxMDExLA0KKyAgICBKR0VfMQk9IDEwMTIsDQorICAgIEpHRV80CT0gMTAxMywNCisgICAgSkdfMQk9IDEwMTQsDQorICAgIEpHXzQJPSAxMDE1LA0KKyAgICBKTEVfMQk9IDEwMTYsDQorICAgIEpMRV80CT0gMTAxNywNCisgICAgSkxfMQk9IDEwMTgsDQorICAgIEpMXzQJPSAxMDE5LA0KKyAgICBKTVAzMm0JPSAxMDIwLA0KKyAgICBKTVAzMnIJPSAxMDIxLA0KKyAgICBKTVA2NG0JPSAxMDIyLA0KKyAgICBKTVA2NHBjcmVsMzIJPSAxMDIzLA0KKyAgICBKTVA2NHIJPSAxMDI0LA0KKyAgICBKTVBfMQk9IDEwMjUsDQorICAgIEpNUF80CT0gMTAyNiwNCisgICAgSk5FXzEJPSAxMDI3LA0KKyAgICBKTkVfNAk9IDEwMjgsDQorICAgIEpOT18xCT0gMTAyOSwNCisgICAgSk5PXzQJPSAxMDMwLA0KKyAgICBKTlBfMQk9IDEwMzEsDQorICAgIEpOUF80CT0gMTAzMiwNCisgICAgSk5TXzEJPSAxMDMzLA0KKyAgICBKTlNfNAk9IDEwMzQsDQorICAgIEpPXzEJPSAxMDM1LA0KKyAgICBKT180CT0gMTAzNiwNCisgICAgSlBfMQk9IDEwMzcsDQorICAgIEpQXzQJPSAxMDM4LA0KKyAgICBKU18xCT0gMTAzOSwNCisgICAgSlNfNAk9IDEwNDAsDQorICAgIExBSEYJPSAxMDQxLA0KKyAgICBMQVIxNnJtCT0gMTA0MiwNCisgICAgTEFSMTZycgk9IDEwNDMsDQorICAgIExBUjMycm0JPSAxMDQ0LA0KKyAgICBMQVIzMnJyCT0gMTA0NSwNCisgICAgTEFSNjRybQk9IDEwNDYsDQorICAgIExBUjY0cnIJPSAxMDQ3LA0KKyAgICBMQ01QWENIRzE2CT0gMTA0OCwNCisgICAgTENNUFhDSEczMgk9IDEwNDksDQorICAgIExDTVBYQ0hHNjQJPSAxMDUwLA0KKyAgICBMQ01QWENIRzgJPSAxMDUxLA0KKyAgICBMQ01QWENIRzhCCT0gMTA1MiwNCisgICAgTEREUVVybQk9IDEwNTMsDQorICAgIExETVhDU1IJPSAxMDU0LA0KKyAgICBMRFMxNnJtCT0gMTA1NSwNCisgICAgTERTMzJybQk9IDEwNTYsDQorICAgIExEX0YwCT0gMTA1NywNCisgICAgTERfRjEJPSAxMDU4LA0KKyAgICBMRF9GMzJtCT0gMTA1OSwNCisgICAgTERfRjY0bQk9IDEwNjAsDQorICAgIExEX0Y4MG0JPSAxMDYxLA0KKyAgICBMRF9GcDAzMgk9IDEwNjIsDQorICAgIExEX0ZwMDY0CT0gMTA2MywNCisgICAgTERfRnAwODAJPSAxMDY0LA0KKyAgICBMRF9GcDEzMgk9IDEwNjUsDQorICAgIExEX0ZwMTY0CT0gMTA2NiwNCisgICAgTERfRnAxODAJPSAxMDY3LA0KKyAgICBMRF9GcDMybQk9IDEwNjgsDQorICAgIExEX0ZwMzJtNjQJPSAxMDY5LA0KKyAgICBMRF9GcDMybTgwCT0gMTA3MCwNCisgICAgTERfRnA2NG0JPSAxMDcxLA0KKyAgICBMRF9GcDY0bTgwCT0gMTA3MiwNCisgICAgTERfRnA4MG0JPSAxMDczLA0KKyAgICBMRF9GcnIJPSAxMDc0LA0KKyAgICBMRUExNnIJPSAxMDc1LA0KKyAgICBMRUEzMnIJPSAxMDc2LA0KKyAgICBMRUE2NF8zMnIJPSAxMDc3LA0KKyAgICBMRUE2NHIJPSAxMDc4LA0KKyAgICBMRUFWRQk9IDEwNzksDQorICAgIExFQVZFNjQJPSAxMDgwLA0KKyAgICBMRVMxNnJtCT0gMTA4MSwNCisgICAgTEVTMzJybQk9IDEwODIsDQorICAgIExGRU5DRQk9IDEwODMsDQorICAgIExGUzE2cm0JPSAxMDg0LA0KKyAgICBMRlMzMnJtCT0gMTA4NSwNCisgICAgTEZTNjRybQk9IDEwODYsDQorICAgIExHRFRtCT0gMTA4NywNCisgICAgTEdTMTZybQk9IDEwODgsDQorICAgIExHUzMycm0JPSAxMDg5LA0KKyAgICBMR1M2NHJtCT0gMTA5MCwNCisgICAgTElEVG0JPSAxMDkxLA0KKyAgICBMTERUMTZtCT0gMTA5MiwNCisgICAgTExEVDE2cgk9IDEwOTMsDQorICAgIExNU1cxNm0JPSAxMDk0LA0KKyAgICBMTVNXMTZyCT0gMTA5NSwNCisgICAgTE9DS19BREQxNm1pCT0gMTA5NiwNCisgICAgTE9DS19BREQxNm1pOAk9IDEwOTcsDQorICAgIExPQ0tfQUREMTZtcgk9IDEwOTgsDQorICAgIExPQ0tfQUREMzJtaQk9IDEwOTksDQorICAgIExPQ0tfQUREMzJtaTgJPSAxMTAwLA0KKyAgICBMT0NLX0FERDMybXIJPSAxMTAxLA0KKyAgICBMT0NLX0FERDY0bWkzMgk9IDExMDIsDQorICAgIExPQ0tfQURENjRtaTgJPSAxMTAzLA0KKyAgICBMT0NLX0FERDY0bXIJPSAxMTA0LA0KKyAgICBMT0NLX0FERDhtaQk9IDExMDUsDQorICAgIExPQ0tfQUREOG1yCT0gMTEwNiwNCisgICAgTE9DS19ERUMxNm0JPSAxMTA3LA0KKyAgICBMT0NLX0RFQzMybQk9IDExMDgsDQorICAgIExPQ0tfREVDNjRtCT0gMTEwOSwNCisgICAgTE9DS19ERUM4bQk9IDExMTAsDQorICAgIExPQ0tfSU5DMTZtCT0gMTExMSwNCisgICAgTE9DS19JTkMzMm0JPSAxMTEyLA0KKyAgICBMT0NLX0lOQzY0bQk9IDExMTMsDQorICAgIExPQ0tfSU5DOG0JPSAxMTE0LA0KKyAgICBMT0NLX1BSRUZJWAk9IDExMTUsDQorICAgIExPQ0tfU1VCMTZtaQk9IDExMTYsDQorICAgIExPQ0tfU1VCMTZtaTgJPSAxMTE3LA0KKyAgICBMT0NLX1NVQjE2bXIJPSAxMTE4LA0KKyAgICBMT0NLX1NVQjMybWkJPSAxMTE5LA0KKyAgICBMT0NLX1NVQjMybWk4CT0gMTEyMCwNCisgICAgTE9DS19TVUIzMm1yCT0gMTEyMSwNCisgICAgTE9DS19TVUI2NG1pMzIJPSAxMTIyLA0KKyAgICBMT0NLX1NVQjY0bWk4CT0gMTEyMywNCisgICAgTE9DS19TVUI2NG1yCT0gMTEyNCwNCisgICAgTE9DS19TVUI4bWkJPSAxMTI1LA0KKyAgICBMT0NLX1NVQjhtcgk9IDExMjYsDQorICAgIExPRFNCCT0gMTEyNywNCisgICAgTE9EU0QJPSAxMTI4LA0KKyAgICBMT0RTUQk9IDExMjksDQorICAgIExPRFNXCT0gMTEzMCwNCisgICAgTE9PUAk9IDExMzEsDQorICAgIExPT1BFCT0gMTEzMiwNCisgICAgTE9PUE5FCT0gMTEzMywNCisgICAgTFJFVAk9IDExMzQsDQorICAgIExSRVRJCT0gMTEzNSwNCisgICAgTFNMMTZybQk9IDExMzYsDQorICAgIExTTDE2cnIJPSAxMTM3LA0KKyAgICBMU0wzMnJtCT0gMTEzOCwNCisgICAgTFNMMzJycgk9IDExMzksDQorICAgIExTTDY0cm0JPSAxMTQwLA0KKyAgICBMU0w2NHJyCT0gMTE0MSwNCisgICAgTFNTMTZybQk9IDExNDIsDQorICAgIExTUzMycm0JPSAxMTQzLA0KKyAgICBMU1M2NHJtCT0gMTE0NCwNCisgICAgTFRSbQk9IDExNDUsDQorICAgIExUUnIJPSAxMTQ2LA0KKyAgICBMWEFERDE2CT0gMTE0NywNCisgICAgTFhBREQzMgk9IDExNDgsDQorICAgIExYQURENjQJPSAxMTQ5LA0KKyAgICBMWEFERDgJPSAxMTUwLA0KKyAgICBNQVNLTU9WRFFVCT0gMTE1MSwNCisgICAgTUFTS01PVkRRVTY0CT0gMTE1MiwNCisgICAgTUFYUERybQk9IDExNTMsDQorICAgIE1BWFBEcm1fSW50CT0gMTE1NCwNCisgICAgTUFYUERycgk9IDExNTUsDQorICAgIE1BWFBEcnJfSW50CT0gMTE1NiwNCisgICAgTUFYUFNybQk9IDExNTcsDQorICAgIE1BWFBTcm1fSW50CT0gMTE1OCwNCisgICAgTUFYUFNycgk9IDExNTksDQorICAgIE1BWFBTcnJfSW50CT0gMTE2MCwNCisgICAgTUFYU0RybQk9IDExNjEsDQorICAgIE1BWFNEcm1fSW50CT0gMTE2MiwNCisgICAgTUFYU0Rycgk9IDExNjMsDQorICAgIE1BWFNEcnJfSW50CT0gMTE2NCwNCisgICAgTUFYU1NybQk9IDExNjUsDQorICAgIE1BWFNTcm1fSW50CT0gMTE2NiwNCisgICAgTUFYU1Nycgk9IDExNjcsDQorICAgIE1BWFNTcnJfSW50CT0gMTE2OCwNCisgICAgTUZFTkNFCT0gMTE2OSwNCisgICAgTUlOR1dfQUxMT0NBCT0gMTE3MCwNCisgICAgTUlOUERybQk9IDExNzEsDQorICAgIE1JTlBEcm1fSW50CT0gMTE3MiwNCisgICAgTUlOUERycgk9IDExNzMsDQorICAgIE1JTlBEcnJfSW50CT0gMTE3NCwNCisgICAgTUlOUFNybQk9IDExNzUsDQorICAgIE1JTlBTcm1fSW50CT0gMTE3NiwNCisgICAgTUlOUFNycgk9IDExNzcsDQorICAgIE1JTlBTcnJfSW50CT0gMTE3OCwNCisgICAgTUlOU0RybQk9IDExNzksDQorICAgIE1JTlNEcm1fSW50CT0gMTE4MCwNCisgICAgTUlOU0Rycgk9IDExODEsDQorICAgIE1JTlNEcnJfSW50CT0gMTE4MiwNCisgICAgTUlOU1NybQk9IDExODMsDQorICAgIE1JTlNTcm1fSW50CT0gMTE4NCwNCisgICAgTUlOU1Nycgk9IDExODUsDQorICAgIE1JTlNTcnJfSW50CT0gMTE4NiwNCisgICAgTU1YX0NWVFBEMlBJcm0JPSAxMTg3LA0KKyAgICBNTVhfQ1ZUUEQyUElycgk9IDExODgsDQorICAgIE1NWF9DVlRQSTJQRHJtCT0gMTE4OSwNCisgICAgTU1YX0NWVFBJMlBEcnIJPSAxMTkwLA0KKyAgICBNTVhfQ1ZUUEkyUFNybQk9IDExOTEsDQorICAgIE1NWF9DVlRQSTJQU3JyCT0gMTE5MiwNCisgICAgTU1YX0NWVFBTMlBJcm0JPSAxMTkzLA0KKyAgICBNTVhfQ1ZUUFMyUElycgk9IDExOTQsDQorICAgIE1NWF9DVlRUUEQyUElybQk9IDExOTUsDQorICAgIE1NWF9DVlRUUEQyUElycgk9IDExOTYsDQorICAgIE1NWF9DVlRUUFMyUElybQk9IDExOTcsDQorICAgIE1NWF9DVlRUUFMyUElycgk9IDExOTgsDQorICAgIE1NWF9FTU1TCT0gMTE5OSwNCisgICAgTU1YX0ZFTU1TCT0gMTIwMCwNCisgICAgTU1YX01BU0tNT1ZRCT0gMTIwMSwNCisgICAgTU1YX01BU0tNT1ZRNjQJPSAxMjAyLA0KKyAgICBNTVhfTU9WRDY0ZnJvbTY0cnIJPSAxMjAzLA0KKyAgICBNTVhfTU9WRDY0Z3JyCT0gMTIwNCwNCisgICAgTU1YX01PVkQ2NG1yCT0gMTIwNSwNCisgICAgTU1YX01PVkQ2NHJtCT0gMTIwNiwNCisgICAgTU1YX01PVkQ2NHJyCT0gMTIwNywNCisgICAgTU1YX01PVkQ2NHJydjE2NAk9IDEyMDgsDQorICAgIE1NWF9NT1ZENjR0bzY0cnIJPSAxMjA5LA0KKyAgICBNTVhfTU9WRFEyUXJyCT0gMTIxMCwNCisgICAgTU1YX01PVkZSNjQyUXJyCT0gMTIxMSwNCisgICAgTU1YX01PVk5UUW1yCT0gMTIxMiwNCisgICAgTU1YX01PVlEyRFFycgk9IDEyMTMsDQorICAgIE1NWF9NT1ZRMkZSNjRycgk9IDEyMTQsDQorICAgIE1NWF9NT1ZRNjRtcgk9IDEyMTUsDQorICAgIE1NWF9NT1ZRNjRybQk9IDEyMTYsDQorICAgIE1NWF9NT1ZRNjRycgk9IDEyMTcsDQorICAgIE1NWF9NT1ZaREkyUERJcm0JPSAxMjE4LA0KKyAgICBNTVhfTU9WWkRJMlBESXJyCT0gMTIxOSwNCisgICAgTU1YX1BBQ0tTU0RXcm0JPSAxMjIwLA0KKyAgICBNTVhfUEFDS1NTRFdycgk9IDEyMjEsDQorICAgIE1NWF9QQUNLU1NXQnJtCT0gMTIyMiwNCisgICAgTU1YX1BBQ0tTU1dCcnIJPSAxMjIzLA0KKyAgICBNTVhfUEFDS1VTV0JybQk9IDEyMjQsDQorICAgIE1NWF9QQUNLVVNXQnJyCT0gMTIyNSwNCisgICAgTU1YX1BBRERCcm0JPSAxMjI2LA0KKyAgICBNTVhfUEFEREJycgk9IDEyMjcsDQorICAgIE1NWF9QQURERHJtCT0gMTIyOCwNCisgICAgTU1YX1BBREREcnIJPSAxMjI5LA0KKyAgICBNTVhfUEFERFFybQk9IDEyMzAsDQorICAgIE1NWF9QQUREUXJyCT0gMTIzMSwNCisgICAgTU1YX1BBRERTQnJtCT0gMTIzMiwNCisgICAgTU1YX1BBRERTQnJyCT0gMTIzMywNCisgICAgTU1YX1BBRERTV3JtCT0gMTIzNCwNCisgICAgTU1YX1BBRERTV3JyCT0gMTIzNSwNCisgICAgTU1YX1BBRERVU0JybQk9IDEyMzYsDQorICAgIE1NWF9QQUREVVNCcnIJPSAxMjM3LA0KKyAgICBNTVhfUEFERFVTV3JtCT0gMTIzOCwNCisgICAgTU1YX1BBRERVU1dycgk9IDEyMzksDQorICAgIE1NWF9QQUREV3JtCT0gMTI0MCwNCisgICAgTU1YX1BBRERXcnIJPSAxMjQxLA0KKyAgICBNTVhfUEFORE5ybQk9IDEyNDIsDQorICAgIE1NWF9QQU5ETnJyCT0gMTI0MywNCisgICAgTU1YX1BBTkRybQk9IDEyNDQsDQorICAgIE1NWF9QQU5EcnIJPSAxMjQ1LA0KKyAgICBNTVhfUEFWR0JybQk9IDEyNDYsDQorICAgIE1NWF9QQVZHQnJyCT0gMTI0NywNCisgICAgTU1YX1BBVkdXcm0JPSAxMjQ4LA0KKyAgICBNTVhfUEFWR1dycgk9IDEyNDksDQorICAgIE1NWF9QQ01QRVFCcm0JPSAxMjUwLA0KKyAgICBNTVhfUENNUEVRQnJyCT0gMTI1MSwNCisgICAgTU1YX1BDTVBFUURybQk9IDEyNTIsDQorICAgIE1NWF9QQ01QRVFEcnIJPSAxMjUzLA0KKyAgICBNTVhfUENNUEVRV3JtCT0gMTI1NCwNCisgICAgTU1YX1BDTVBFUVdycgk9IDEyNTUsDQorICAgIE1NWF9QQ01QR1RCcm0JPSAxMjU2LA0KKyAgICBNTVhfUENNUEdUQnJyCT0gMTI1NywNCisgICAgTU1YX1BDTVBHVERybQk9IDEyNTgsDQorICAgIE1NWF9QQ01QR1REcnIJPSAxMjU5LA0KKyAgICBNTVhfUENNUEdUV3JtCT0gMTI2MCwNCisgICAgTU1YX1BDTVBHVFdycgk9IDEyNjEsDQorICAgIE1NWF9QRVhUUldyaQk9IDEyNjIsDQorICAgIE1NWF9QSU5TUldybWkJPSAxMjYzLA0KKyAgICBNTVhfUElOU1JXcnJpCT0gMTI2NCwNCisgICAgTU1YX1BNQUREV0RybQk9IDEyNjUsDQorICAgIE1NWF9QTUFERFdEcnIJPSAxMjY2LA0KKyAgICBNTVhfUE1BWFNXcm0JPSAxMjY3LA0KKyAgICBNTVhfUE1BWFNXcnIJPSAxMjY4LA0KKyAgICBNTVhfUE1BWFVCcm0JPSAxMjY5LA0KKyAgICBNTVhfUE1BWFVCcnIJPSAxMjcwLA0KKyAgICBNTVhfUE1JTlNXcm0JPSAxMjcxLA0KKyAgICBNTVhfUE1JTlNXcnIJPSAxMjcyLA0KKyAgICBNTVhfUE1JTlVCcm0JPSAxMjczLA0KKyAgICBNTVhfUE1JTlVCcnIJPSAxMjc0LA0KKyAgICBNTVhfUE1PVk1TS0Jycgk9IDEyNzUsDQorICAgIE1NWF9QTVVMSFVXcm0JPSAxMjc2LA0KKyAgICBNTVhfUE1VTEhVV3JyCT0gMTI3NywNCisgICAgTU1YX1BNVUxIV3JtCT0gMTI3OCwNCisgICAgTU1YX1BNVUxIV3JyCT0gMTI3OSwNCisgICAgTU1YX1BNVUxMV3JtCT0gMTI4MCwNCisgICAgTU1YX1BNVUxMV3JyCT0gMTI4MSwNCisgICAgTU1YX1BNVUxVRFFybQk9IDEyODIsDQorICAgIE1NWF9QTVVMVURRcnIJPSAxMjgzLA0KKyAgICBNTVhfUE9Scm0JPSAxMjg0LA0KKyAgICBNTVhfUE9ScnIJPSAxMjg1LA0KKyAgICBNTVhfUFNBREJXcm0JPSAxMjg2LA0KKyAgICBNTVhfUFNBREJXcnIJPSAxMjg3LA0KKyAgICBNTVhfUFNIVUZXbWkJPSAxMjg4LA0KKyAgICBNTVhfUFNIVUZXcmkJPSAxMjg5LA0KKyAgICBNTVhfUFNMTERyaQk9IDEyOTAsDQorICAgIE1NWF9QU0xMRHJtCT0gMTI5MSwNCisgICAgTU1YX1BTTExEcnIJPSAxMjkyLA0KKyAgICBNTVhfUFNMTFFyaQk9IDEyOTMsDQorICAgIE1NWF9QU0xMUXJtCT0gMTI5NCwNCisgICAgTU1YX1BTTExRcnIJPSAxMjk1LA0KKyAgICBNTVhfUFNMTFdyaQk9IDEyOTYsDQorICAgIE1NWF9QU0xMV3JtCT0gMTI5NywNCisgICAgTU1YX1BTTExXcnIJPSAxMjk4LA0KKyAgICBNTVhfUFNSQURyaQk9IDEyOTksDQorICAgIE1NWF9QU1JBRHJtCT0gMTMwMCwNCisgICAgTU1YX1BTUkFEcnIJPSAxMzAxLA0KKyAgICBNTVhfUFNSQVdyaQk9IDEzMDIsDQorICAgIE1NWF9QU1JBV3JtCT0gMTMwMywNCisgICAgTU1YX1BTUkFXcnIJPSAxMzA0LA0KKyAgICBNTVhfUFNSTERyaQk9IDEzMDUsDQorICAgIE1NWF9QU1JMRHJtCT0gMTMwNiwNCisgICAgTU1YX1BTUkxEcnIJPSAxMzA3LA0KKyAgICBNTVhfUFNSTFFyaQk9IDEzMDgsDQorICAgIE1NWF9QU1JMUXJtCT0gMTMwOSwNCisgICAgTU1YX1BTUkxRcnIJPSAxMzEwLA0KKyAgICBNTVhfUFNSTFdyaQk9IDEzMTEsDQorICAgIE1NWF9QU1JMV3JtCT0gMTMxMiwNCisgICAgTU1YX1BTUkxXcnIJPSAxMzEzLA0KKyAgICBNTVhfUFNVQkJybQk9IDEzMTQsDQorICAgIE1NWF9QU1VCQnJyCT0gMTMxNSwNCisgICAgTU1YX1BTVUJEcm0JPSAxMzE2LA0KKyAgICBNTVhfUFNVQkRycgk9IDEzMTcsDQorICAgIE1NWF9QU1VCUXJtCT0gMTMxOCwNCisgICAgTU1YX1BTVUJRcnIJPSAxMzE5LA0KKyAgICBNTVhfUFNVQlNCcm0JPSAxMzIwLA0KKyAgICBNTVhfUFNVQlNCcnIJPSAxMzIxLA0KKyAgICBNTVhfUFNVQlNXcm0JPSAxMzIyLA0KKyAgICBNTVhfUFNVQlNXcnIJPSAxMzIzLA0KKyAgICBNTVhfUFNVQlVTQnJtCT0gMTMyNCwNCisgICAgTU1YX1BTVUJVU0Jycgk9IDEzMjUsDQorICAgIE1NWF9QU1VCVVNXcm0JPSAxMzI2LA0KKyAgICBNTVhfUFNVQlVTV3JyCT0gMTMyNywNCisgICAgTU1YX1BTVUJXcm0JPSAxMzI4LA0KKyAgICBNTVhfUFNVQldycgk9IDEzMjksDQorICAgIE1NWF9QVU5QQ0tIQldybQk9IDEzMzAsDQorICAgIE1NWF9QVU5QQ0tIQldycgk9IDEzMzEsDQorICAgIE1NWF9QVU5QQ0tIRFFybQk9IDEzMzIsDQorICAgIE1NWF9QVU5QQ0tIRFFycgk9IDEzMzMsDQorICAgIE1NWF9QVU5QQ0tIV0RybQk9IDEzMzQsDQorICAgIE1NWF9QVU5QQ0tIV0Rycgk9IDEzMzUsDQorICAgIE1NWF9QVU5QQ0tMQldybQk9IDEzMzYsDQorICAgIE1NWF9QVU5QQ0tMQldycgk9IDEzMzcsDQorICAgIE1NWF9QVU5QQ0tMRFFybQk9IDEzMzgsDQorICAgIE1NWF9QVU5QQ0tMRFFycgk9IDEzMzksDQorICAgIE1NWF9QVU5QQ0tMV0RybQk9IDEzNDAsDQorICAgIE1NWF9QVU5QQ0tMV0Rycgk9IDEzNDEsDQorICAgIE1NWF9QWE9Scm0JPSAxMzQyLA0KKyAgICBNTVhfUFhPUnJyCT0gMTM0MywNCisgICAgTU1YX1ZfU0VUMAk9IDEzNDQsDQorICAgIE1NWF9WX1NFVEFMTE9ORVMJPSAxMzQ1LA0KKyAgICBNT05JVE9SCT0gMTM0NiwNCisgICAgTU9WMTZhbzE2CT0gMTM0NywNCisgICAgTU9WMTZtaQk9IDEzNDgsDQorICAgIE1PVjE2bXIJPSAxMzQ5LA0KKyAgICBNT1YxNm1zCT0gMTM1MCwNCisgICAgTU9WMTZvMTZhCT0gMTM1MSwNCisgICAgTU9WMTZyMAk9IDEzNTIsDQorICAgIE1PVjE2cmkJPSAxMzUzLA0KKyAgICBNT1YxNnJtCT0gMTM1NCwNCisgICAgTU9WMTZycgk9IDEzNTUsDQorICAgIE1PVjE2cnJfUkVWCT0gMTM1NiwNCisgICAgTU9WMTZycwk9IDEzNTcsDQorICAgIE1PVjE2c20JPSAxMzU4LA0KKyAgICBNT1YxNnNyCT0gMTM1OSwNCisgICAgTU9WMzJhbzMyCT0gMTM2MCwNCisgICAgTU9WMzJjcgk9IDEzNjEsDQorICAgIE1PVjMyZHIJPSAxMzYyLA0KKyAgICBNT1YzMm1pCT0gMTM2MywNCisgICAgTU9WMzJtcgk9IDEzNjQsDQorICAgIE1PVjMybXJfVEMJPSAxMzY1LA0KKyAgICBNT1YzMm1zCT0gMTM2NiwNCisgICAgTU9WMzJvMzJhCT0gMTM2NywNCisgICAgTU9WMzJyMAk9IDEzNjgsDQorICAgIE1PVjMycmMJPSAxMzY5LA0KKyAgICBNT1YzMnJkCT0gMTM3MCwNCisgICAgTU9WMzJyaQk9IDEzNzEsDQorICAgIE1PVjMycm0JPSAxMzcyLA0KKyAgICBNT1YzMnJtX1RDCT0gMTM3MywNCisgICAgTU9WMzJycgk9IDEzNzQsDQorICAgIE1PVjMycnJfUkVWCT0gMTM3NSwNCisgICAgTU9WMzJycl9UQwk9IDEzNzYsDQorICAgIE1PVjMycnMJPSAxMzc3LA0KKyAgICBNT1YzMnNtCT0gMTM3OCwNCisgICAgTU9WMzJzcgk9IDEzNzksDQorICAgIE1PVjY0RlNybQk9IDEzODAsDQorICAgIE1PVjY0R1NybQk9IDEzODEsDQorICAgIE1PVjY0YW82NAk9IDEzODIsDQorICAgIE1PVjY0YW84CT0gMTM4MywNCisgICAgTU9WNjRjcgk9IDEzODQsDQorICAgIE1PVjY0ZHIJPSAxMzg1LA0KKyAgICBNT1Y2NG1pMzIJPSAxMzg2LA0KKyAgICBNT1Y2NG1yCT0gMTM4NywNCisgICAgTU9WNjRtcl9UQwk9IDEzODgsDQorICAgIE1PVjY0bXMJPSAxMzg5LA0KKyAgICBNT1Y2NG82NGEJPSAxMzkwLA0KKyAgICBNT1Y2NG84YQk9IDEzOTEsDQorICAgIE1PVjY0cjAJPSAxMzkyLA0KKyAgICBNT1Y2NHJjCT0gMTM5MywNCisgICAgTU9WNjRyZAk9IDEzOTQsDQorICAgIE1PVjY0cmkJPSAxMzk1LA0KKyAgICBNT1Y2NHJpMzIJPSAxMzk2LA0KKyAgICBNT1Y2NHJpNjRpMzIJPSAxMzk3LA0KKyAgICBNT1Y2NHJpX2FsdAk9IDEzOTgsDQorICAgIE1PVjY0cm0JPSAxMzk5LA0KKyAgICBNT1Y2NHJtX1RDCT0gMTQwMCwNCisgICAgTU9WNjRycgk9IDE0MDEsDQorICAgIE1PVjY0cnJfUkVWCT0gMTQwMiwNCisgICAgTU9WNjRycl9UQwk9IDE0MDMsDQorICAgIE1PVjY0cnMJPSAxNDA0LA0KKyAgICBNT1Y2NHNtCT0gMTQwNSwNCisgICAgTU9WNjRzcgk9IDE0MDYsDQorICAgIE1PVjY0dG9QUUlycgk9IDE0MDcsDQorICAgIE1PVjY0dG9TRHJtCT0gMTQwOCwNCisgICAgTU9WNjR0b1NEcnIJPSAxNDA5LA0KKyAgICBNT1Y4YW84CT0gMTQxMCwNCisgICAgTU9WOG1pCT0gMTQxMSwNCisgICAgTU9WOG1yCT0gMTQxMiwNCisgICAgTU9WOG1yX05PUkVYCT0gMTQxMywNCisgICAgTU9WOG84YQk9IDE0MTQsDQorICAgIE1PVjhyMAk9IDE0MTUsDQorICAgIE1PVjhyaQk9IDE0MTYsDQorICAgIE1PVjhybQk9IDE0MTcsDQorICAgIE1PVjhybV9OT1JFWAk9IDE0MTgsDQorICAgIE1PVjhycgk9IDE0MTksDQorICAgIE1PVjhycl9OT1JFWAk9IDE0MjAsDQorICAgIE1PVjhycl9SRVYJPSAxNDIxLA0KKyAgICBNT1ZBUERtcgk9IDE0MjIsDQorICAgIE1PVkFQRHJtCT0gMTQyMywNCisgICAgTU9WQVBEcnIJPSAxNDI0LA0KKyAgICBNT1ZBUFNtcgk9IDE0MjUsDQorICAgIE1PVkFQU3JtCT0gMTQyNiwNCisgICAgTU9WQVBTcnIJPSAxNDI3LA0KKyAgICBNT1ZERFVQcm0JPSAxNDI4LA0KKyAgICBNT1ZERFVQcnIJPSAxNDI5LA0KKyAgICBNT1ZESTJQRElybQk9IDE0MzAsDQorICAgIE1PVkRJMlBESXJyCT0gMTQzMSwNCisgICAgTU9WREkyU1NybQk9IDE0MzIsDQorICAgIE1PVkRJMlNTcnIJPSAxNDMzLA0KKyAgICBNT1ZEUUFtcgk9IDE0MzQsDQorICAgIE1PVkRRQXJtCT0gMTQzNSwNCisgICAgTU9WRFFBcnIJPSAxNDM2LA0KKyAgICBNT1ZEUVVtcgk9IDE0MzcsDQorICAgIE1PVkRRVW1yX0ludAk9IDE0MzgsDQorICAgIE1PVkRRVXJtCT0gMTQzOSwNCisgICAgTU9WRFFVcm1fSW50CT0gMTQ0MCwNCisgICAgTU9WSExQU3JyCT0gMTQ0MSwNCisgICAgTU9WSFBEbXIJPSAxNDQyLA0KKyAgICBNT1ZIUERybQk9IDE0NDMsDQorICAgIE1PVkhQU21yCT0gMTQ0NCwNCisgICAgTU9WSFBTcm0JPSAxNDQ1LA0KKyAgICBNT1ZMSFBTcnIJPSAxNDQ2LA0KKyAgICBNT1ZMUERtcgk9IDE0NDcsDQorICAgIE1PVkxQRHJtCT0gMTQ0OCwNCisgICAgTU9WTFBTbXIJPSAxNDQ5LA0KKyAgICBNT1ZMUFNybQk9IDE0NTAsDQorICAgIE1PVkxRMTI4bXIJPSAxNDUxLA0KKyAgICBNT1ZNU0tQRHJyCT0gMTQ1MiwNCisgICAgTU9WTVNLUFNycgk9IDE0NTMsDQorICAgIE1PVk5URFFBcm0JPSAxNDU0LA0KKyAgICBNT1ZOVERRXzY0bXIJPSAxNDU1LA0KKyAgICBNT1ZOVERRbXIJPSAxNDU2LA0KKyAgICBNT1ZOVERRbXJfSW50CT0gMTQ1NywNCisgICAgTU9WTlRJXzY0bXIJPSAxNDU4LA0KKyAgICBNT1ZOVEltcgk9IDE0NTksDQorICAgIE1PVk5USW1yX0ludAk9IDE0NjAsDQorICAgIE1PVk5UUERtcgk9IDE0NjEsDQorICAgIE1PVk5UUERtcl9JbnQJPSAxNDYyLA0KKyAgICBNT1ZOVFBTbXIJPSAxNDYzLA0KKyAgICBNT1ZOVFBTbXJfSW50CT0gMTQ2NCwNCisgICAgTU9WUEMzMnIJPSAxNDY1LA0KKyAgICBNT1ZQREkyREltcgk9IDE0NjYsDQorICAgIE1PVlBESTJESXJyCT0gMTQ2NywNCisgICAgTU9WUFFJMlFJbXIJPSAxNDY4LA0KKyAgICBNT1ZQUUl0bzY0cnIJPSAxNDY5LA0KKyAgICBNT1ZRSTJQUUlybQk9IDE0NzAsDQorICAgIE1PVlF4cnhyCT0gMTQ3MSwNCisgICAgTU9WU0IJPSAxNDcyLA0KKyAgICBNT1ZTRAk9IDE0NzMsDQorICAgIE1PVlNEbXIJPSAxNDc0LA0KKyAgICBNT1ZTRHJtCT0gMTQ3NSwNCisgICAgTU9WU0Rycgk9IDE0NzYsDQorICAgIE1PVlNEdG82NG1yCT0gMTQ3NywNCisgICAgTU9WU0R0bzY0cnIJPSAxNDc4LA0KKyAgICBNT1ZTSERVUHJtCT0gMTQ3OSwNCisgICAgTU9WU0hEVVBycgk9IDE0ODAsDQorICAgIE1PVlNMRFVQcm0JPSAxNDgxLA0KKyAgICBNT1ZTTERVUHJyCT0gMTQ4MiwNCisgICAgTU9WU1EJPSAxNDgzLA0KKyAgICBNT1ZTUzJESW1yCT0gMTQ4NCwNCisgICAgTU9WU1MyRElycgk9IDE0ODUsDQorICAgIE1PVlNTbXIJPSAxNDg2LA0KKyAgICBNT1ZTU3JtCT0gMTQ4NywNCisgICAgTU9WU1Nycgk9IDE0ODgsDQorICAgIE1PVlNXCT0gMTQ4OSwNCisgICAgTU9WU1gxNnJtOAk9IDE0OTAsDQorICAgIE1PVlNYMTZybThXCT0gMTQ5MSwNCisgICAgTU9WU1gxNnJyOAk9IDE0OTIsDQorICAgIE1PVlNYMTZycjhXCT0gMTQ5MywNCisgICAgTU9WU1gzMnJtMTYJPSAxNDk0LA0KKyAgICBNT1ZTWDMycm04CT0gMTQ5NSwNCisgICAgTU9WU1gzMnJyMTYJPSAxNDk2LA0KKyAgICBNT1ZTWDMycnI4CT0gMTQ5NywNCisgICAgTU9WU1g2NHJtMTYJPSAxNDk4LA0KKyAgICBNT1ZTWDY0cm0zMgk9IDE0OTksDQorICAgIE1PVlNYNjRybTgJPSAxNTAwLA0KKyAgICBNT1ZTWDY0cnIxNgk9IDE1MDEsDQorICAgIE1PVlNYNjRycjMyCT0gMTUwMiwNCisgICAgTU9WU1g2NHJyOAk9IDE1MDMsDQorICAgIE1PVlVQRG1yCT0gMTUwNCwNCisgICAgTU9WVVBEbXJfSW50CT0gMTUwNSwNCisgICAgTU9WVVBEcm0JPSAxNTA2LA0KKyAgICBNT1ZVUERybV9JbnQJPSAxNTA3LA0KKyAgICBNT1ZVUERycgk9IDE1MDgsDQorICAgIE1PVlVQU21yCT0gMTUwOSwNCisgICAgTU9WVVBTbXJfSW50CT0gMTUxMCwNCisgICAgTU9WVVBTcm0JPSAxNTExLA0KKyAgICBNT1ZVUFNybV9JbnQJPSAxNTEyLA0KKyAgICBNT1ZVUFNycgk9IDE1MTMsDQorICAgIE1PVlpESTJQRElybQk9IDE1MTQsDQorICAgIE1PVlpESTJQRElycgk9IDE1MTUsDQorICAgIE1PVlpQUUlMbzJQUUlybQk9IDE1MTYsDQorICAgIE1PVlpQUUlMbzJQUUlycgk9IDE1MTcsDQorICAgIE1PVlpRSTJQUUlybQk9IDE1MTgsDQorICAgIE1PVlpRSTJQUUlycgk9IDE1MTksDQorICAgIE1PVlpYMTZybTgJPSAxNTIwLA0KKyAgICBNT1ZaWDE2cm04Vwk9IDE1MjEsDQorICAgIE1PVlpYMTZycjgJPSAxNTIyLA0KKyAgICBNT1ZaWDE2cnI4Vwk9IDE1MjMsDQorICAgIE1PVlpYMzJfTk9SRVhybTgJPSAxNTI0LA0KKyAgICBNT1ZaWDMyX05PUkVYcnI4CT0gMTUyNSwNCisgICAgTU9WWlgzMnJtMTYJPSAxNTI2LA0KKyAgICBNT1ZaWDMycm04CT0gMTUyNywNCisgICAgTU9WWlgzMnJyMTYJPSAxNTI4LA0KKyAgICBNT1ZaWDMycnI4CT0gMTUyOSwNCisgICAgTU9WWlg2NHJtMTYJPSAxNTMwLA0KKyAgICBNT1ZaWDY0cm0xNl9RCT0gMTUzMSwNCisgICAgTU9WWlg2NHJtMzIJPSAxNTMyLA0KKyAgICBNT1ZaWDY0cm04CT0gMTUzMywNCisgICAgTU9WWlg2NHJtOF9RCT0gMTUzNCwNCisgICAgTU9WWlg2NHJyMTYJPSAxNTM1LA0KKyAgICBNT1ZaWDY0cnIxNl9RCT0gMTUzNiwNCisgICAgTU9WWlg2NHJyMzIJPSAxNTM3LA0KKyAgICBNT1ZaWDY0cnI4CT0gMTUzOCwNCisgICAgTU9WWlg2NHJyOF9RCT0gMTUzOSwNCisgICAgTU9WX0ZwMzIzMgk9IDE1NDAsDQorICAgIE1PVl9GcDMyNjQJPSAxNTQxLA0KKyAgICBNT1ZfRnAzMjgwCT0gMTU0MiwNCisgICAgTU9WX0ZwNjQzMgk9IDE1NDMsDQorICAgIE1PVl9GcDY0NjQJPSAxNTQ0LA0KKyAgICBNT1ZfRnA2NDgwCT0gMTU0NSwNCisgICAgTU9WX0ZwODAzMgk9IDE1NDYsDQorICAgIE1PVl9GcDgwNjQJPSAxNTQ3LA0KKyAgICBNT1ZfRnA4MDgwCT0gMTU0OCwNCisgICAgTVBTQURCV3JtaQk9IDE1NDksDQorICAgIE1QU0FEQldycmkJPSAxNTUwLA0KKyAgICBNVUwxNm0JPSAxNTUxLA0KKyAgICBNVUwxNnIJPSAxNTUyLA0KKyAgICBNVUwzMm0JPSAxNTUzLA0KKyAgICBNVUwzMnIJPSAxNTU0LA0KKyAgICBNVUw2NG0JPSAxNTU1LA0KKyAgICBNVUw2NHIJPSAxNTU2LA0KKyAgICBNVUw4bQk9IDE1NTcsDQorICAgIE1VTDhyCT0gMTU1OCwNCisgICAgTVVMUERybQk9IDE1NTksDQorICAgIE1VTFBEcnIJPSAxNTYwLA0KKyAgICBNVUxQU3JtCT0gMTU2MSwNCisgICAgTVVMUFNycgk9IDE1NjIsDQorICAgIE1VTFNEcm0JPSAxNTYzLA0KKyAgICBNVUxTRHJtX0ludAk9IDE1NjQsDQorICAgIE1VTFNEcnIJPSAxNTY1LA0KKyAgICBNVUxTRHJyX0ludAk9IDE1NjYsDQorICAgIE1VTFNTcm0JPSAxNTY3LA0KKyAgICBNVUxTU3JtX0ludAk9IDE1NjgsDQorICAgIE1VTFNTcnIJPSAxNTY5LA0KKyAgICBNVUxTU3JyX0ludAk9IDE1NzAsDQorICAgIE1VTF9GMzJtCT0gMTU3MSwNCisgICAgTVVMX0Y2NG0JPSAxNTcyLA0KKyAgICBNVUxfRkkxNm0JPSAxNTczLA0KKyAgICBNVUxfRkkzMm0JPSAxNTc0LA0KKyAgICBNVUxfRlByU1QwCT0gMTU3NSwNCisgICAgTVVMX0ZTVDByCT0gMTU3NiwNCisgICAgTVVMX0ZwMzIJPSAxNTc3LA0KKyAgICBNVUxfRnAzMm0JPSAxNTc4LA0KKyAgICBNVUxfRnA2NAk9IDE1NzksDQorICAgIE1VTF9GcDY0bQk9IDE1ODAsDQorICAgIE1VTF9GcDY0bTMyCT0gMTU4MSwNCisgICAgTVVMX0ZwODAJPSAxNTgyLA0KKyAgICBNVUxfRnA4MG0zMgk9IDE1ODMsDQorICAgIE1VTF9GcDgwbTY0CT0gMTU4NCwNCisgICAgTVVMX0ZwSTE2bTMyCT0gMTU4NSwNCisgICAgTVVMX0ZwSTE2bTY0CT0gMTU4NiwNCisgICAgTVVMX0ZwSTE2bTgwCT0gMTU4NywNCisgICAgTVVMX0ZwSTMybTMyCT0gMTU4OCwNCisgICAgTVVMX0ZwSTMybTY0CT0gMTU4OSwNCisgICAgTVVMX0ZwSTMybTgwCT0gMTU5MCwNCisgICAgTVVMX0ZyU1QwCT0gMTU5MSwNCisgICAgTVdBSVQJPSAxNTkyLA0KKyAgICBORUcxNm0JPSAxNTkzLA0KKyAgICBORUcxNnIJPSAxNTk0LA0KKyAgICBORUczMm0JPSAxNTk1LA0KKyAgICBORUczMnIJPSAxNTk2LA0KKyAgICBORUc2NG0JPSAxNTk3LA0KKyAgICBORUc2NHIJPSAxNTk4LA0KKyAgICBORUc4bQk9IDE1OTksDQorICAgIE5FRzhyCT0gMTYwMCwNCisgICAgTk9PUAk9IDE2MDEsDQorICAgIE5PT1BMCT0gMTYwMiwNCisgICAgTk9PUFcJPSAxNjAzLA0KKyAgICBOT1QxNm0JPSAxNjA0LA0KKyAgICBOT1QxNnIJPSAxNjA1LA0KKyAgICBOT1QzMm0JPSAxNjA2LA0KKyAgICBOT1QzMnIJPSAxNjA3LA0KKyAgICBOT1Q2NG0JPSAxNjA4LA0KKyAgICBOT1Q2NHIJPSAxNjA5LA0KKyAgICBOT1Q4bQk9IDE2MTAsDQorICAgIE5PVDhyCT0gMTYxMSwNCisgICAgT1IxNmkxNgk9IDE2MTIsDQorICAgIE9SMTZtaQk9IDE2MTMsDQorICAgIE9SMTZtaTgJPSAxNjE0LA0KKyAgICBPUjE2bXIJPSAxNjE1LA0KKyAgICBPUjE2cmkJPSAxNjE2LA0KKyAgICBPUjE2cmk4CT0gMTYxNywNCisgICAgT1IxNnJtCT0gMTYxOCwNCisgICAgT1IxNnJyCT0gMTYxOSwNCisgICAgT1IxNnJyX1JFVgk9IDE2MjAsDQorICAgIE9SMzJpMzIJPSAxNjIxLA0KKyAgICBPUjMybWkJPSAxNjIyLA0KKyAgICBPUjMybWk4CT0gMTYyMywNCisgICAgT1IzMm1yCT0gMTYyNCwNCisgICAgT1IzMnJpCT0gMTYyNSwNCisgICAgT1IzMnJpOAk9IDE2MjYsDQorICAgIE9SMzJybQk9IDE2MjcsDQorICAgIE9SMzJycgk9IDE2MjgsDQorICAgIE9SMzJycl9SRVYJPSAxNjI5LA0KKyAgICBPUjY0aTMyCT0gMTYzMCwNCisgICAgT1I2NG1pMzIJPSAxNjMxLA0KKyAgICBPUjY0bWk4CT0gMTYzMiwNCisgICAgT1I2NG1yCT0gMTYzMywNCisgICAgT1I2NHJpMzIJPSAxNjM0LA0KKyAgICBPUjY0cmk4CT0gMTYzNSwNCisgICAgT1I2NHJtCT0gMTYzNiwNCisgICAgT1I2NHJyCT0gMTYzNywNCisgICAgT1I2NHJyX1JFVgk9IDE2MzgsDQorICAgIE9SOGk4CT0gMTYzOSwNCisgICAgT1I4bWkJPSAxNjQwLA0KKyAgICBPUjhtcgk9IDE2NDEsDQorICAgIE9SOHJpCT0gMTY0MiwNCisgICAgT1I4cm0JPSAxNjQzLA0KKyAgICBPUjhycgk9IDE2NDQsDQorICAgIE9SOHJyX1JFVgk9IDE2NDUsDQorICAgIE9SUERybQk9IDE2NDYsDQorICAgIE9SUERycgk9IDE2NDcsDQorICAgIE9SUFNybQk9IDE2NDgsDQorICAgIE9SUFNycgk9IDE2NDksDQorICAgIE9VVDE2aXIJPSAxNjUwLA0KKyAgICBPVVQxNnJyCT0gMTY1MSwNCisgICAgT1VUMzJpcgk9IDE2NTIsDQorICAgIE9VVDMycnIJPSAxNjUzLA0KKyAgICBPVVQ4aXIJPSAxNjU0LA0KKyAgICBPVVQ4cnIJPSAxNjU1LA0KKyAgICBPVVRTQgk9IDE2NTYsDQorICAgIE9VVFNECT0gMTY1NywNCisgICAgT1VUU1cJPSAxNjU4LA0KKyAgICBQQUJTQnJtMTI4CT0gMTY1OSwNCisgICAgUEFCU0JybTY0CT0gMTY2MCwNCisgICAgUEFCU0JycjEyOAk9IDE2NjEsDQorICAgIFBBQlNCcnI2NAk9IDE2NjIsDQorICAgIFBBQlNEcm0xMjgJPSAxNjYzLA0KKyAgICBQQUJTRHJtNjQJPSAxNjY0LA0KKyAgICBQQUJTRHJyMTI4CT0gMTY2NSwNCisgICAgUEFCU0RycjY0CT0gMTY2NiwNCisgICAgUEFCU1dybTEyOAk9IDE2NjcsDQorICAgIFBBQlNXcm02NAk9IDE2NjgsDQorICAgIFBBQlNXcnIxMjgJPSAxNjY5LA0KKyAgICBQQUJTV3JyNjQJPSAxNjcwLA0KKyAgICBQQUNLU1NEV3JtCT0gMTY3MSwNCisgICAgUEFDS1NTRFdycgk9IDE2NzIsDQorICAgIFBBQ0tTU1dCcm0JPSAxNjczLA0KKyAgICBQQUNLU1NXQnJyCT0gMTY3NCwNCisgICAgUEFDS1VTRFdybQk9IDE2NzUsDQorICAgIFBBQ0tVU0RXcnIJPSAxNjc2LA0KKyAgICBQQUNLVVNXQnJtCT0gMTY3NywNCisgICAgUEFDS1VTV0Jycgk9IDE2NzgsDQorICAgIFBBRERCcm0JPSAxNjc5LA0KKyAgICBQQUREQnJyCT0gMTY4MCwNCisgICAgUEFERERybQk9IDE2ODEsDQorICAgIFBBREREcnIJPSAxNjgyLA0KKyAgICBQQUREUXJtCT0gMTY4MywNCisgICAgUEFERFFycgk9IDE2ODQsDQorICAgIFBBRERTQnJtCT0gMTY4NSwNCisgICAgUEFERFNCcnIJPSAxNjg2LA0KKyAgICBQQUREU1dybQk9IDE2ODcsDQorICAgIFBBRERTV3JyCT0gMTY4OCwNCisgICAgUEFERFVTQnJtCT0gMTY4OSwNCisgICAgUEFERFVTQnJyCT0gMTY5MCwNCisgICAgUEFERFVTV3JtCT0gMTY5MSwNCisgICAgUEFERFVTV3JyCT0gMTY5MiwNCisgICAgUEFERFdybQk9IDE2OTMsDQorICAgIFBBRERXcnIJPSAxNjk0LA0KKyAgICBQQUxJR05SMTI4cm0JPSAxNjk1LA0KKyAgICBQQUxJR05SMTI4cnIJPSAxNjk2LA0KKyAgICBQQUxJR05SNjRybQk9IDE2OTcsDQorICAgIFBBTElHTlI2NHJyCT0gMTY5OCwNCisgICAgUEFORE5ybQk9IDE2OTksDQorICAgIFBBTkROcnIJPSAxNzAwLA0KKyAgICBQQU5Ecm0JPSAxNzAxLA0KKyAgICBQQU5EcnIJPSAxNzAyLA0KKyAgICBQQVVTRQk9IDE3MDMsDQorICAgIFBBVkdCcm0JPSAxNzA0LA0KKyAgICBQQVZHQnJyCT0gMTcwNSwNCisgICAgUEFWR1dybQk9IDE3MDYsDQorICAgIFBBVkdXcnIJPSAxNzA3LA0KKyAgICBQQkxFTkRWQnJtMAk9IDE3MDgsDQorICAgIFBCTEVORFZCcnIwCT0gMTcwOSwNCisgICAgUEJMRU5EV3JtaQk9IDE3MTAsDQorICAgIFBCTEVORFdycmkJPSAxNzExLA0KKyAgICBQQ01QRVFCcm0JPSAxNzEyLA0KKyAgICBQQ01QRVFCcnIJPSAxNzEzLA0KKyAgICBQQ01QRVFEcm0JPSAxNzE0LA0KKyAgICBQQ01QRVFEcnIJPSAxNzE1LA0KKyAgICBQQ01QRVFRcm0JPSAxNzE2LA0KKyAgICBQQ01QRVFRcnIJPSAxNzE3LA0KKyAgICBQQ01QRVFXcm0JPSAxNzE4LA0KKyAgICBQQ01QRVFXcnIJPSAxNzE5LA0KKyAgICBQQ01QRVNUUklBcm0JPSAxNzIwLA0KKyAgICBQQ01QRVNUUklBcnIJPSAxNzIxLA0KKyAgICBQQ01QRVNUUklDcm0JPSAxNzIyLA0KKyAgICBQQ01QRVNUUklDcnIJPSAxNzIzLA0KKyAgICBQQ01QRVNUUklPcm0JPSAxNzI0LA0KKyAgICBQQ01QRVNUUklPcnIJPSAxNzI1LA0KKyAgICBQQ01QRVNUUklTcm0JPSAxNzI2LA0KKyAgICBQQ01QRVNUUklTcnIJPSAxNzI3LA0KKyAgICBQQ01QRVNUUklacm0JPSAxNzI4LA0KKyAgICBQQ01QRVNUUklacnIJPSAxNzI5LA0KKyAgICBQQ01QRVNUUklybQk9IDE3MzAsDQorICAgIFBDTVBFU1RSSXJyCT0gMTczMSwNCisgICAgUENNUEVTVFJNMTI4TUVNCT0gMTczMiwNCisgICAgUENNUEVTVFJNMTI4UkVHCT0gMTczMywNCisgICAgUENNUEVTVFJNMTI4cm0JPSAxNzM0LA0KKyAgICBQQ01QRVNUUk0xMjhycgk9IDE3MzUsDQorICAgIFBDTVBHVEJybQk9IDE3MzYsDQorICAgIFBDTVBHVEJycgk9IDE3MzcsDQorICAgIFBDTVBHVERybQk9IDE3MzgsDQorICAgIFBDTVBHVERycgk9IDE3MzksDQorICAgIFBDTVBHVFFybQk9IDE3NDAsDQorICAgIFBDTVBHVFFycgk9IDE3NDEsDQorICAgIFBDTVBHVFdybQk9IDE3NDIsDQorICAgIFBDTVBHVFdycgk9IDE3NDMsDQorICAgIFBDTVBJU1RSSUFybQk9IDE3NDQsDQorICAgIFBDTVBJU1RSSUFycgk9IDE3NDUsDQorICAgIFBDTVBJU1RSSUNybQk9IDE3NDYsDQorICAgIFBDTVBJU1RSSUNycgk9IDE3NDcsDQorICAgIFBDTVBJU1RSSU9ybQk9IDE3NDgsDQorICAgIFBDTVBJU1RSSU9ycgk9IDE3NDksDQorICAgIFBDTVBJU1RSSVNybQk9IDE3NTAsDQorICAgIFBDTVBJU1RSSVNycgk9IDE3NTEsDQorICAgIFBDTVBJU1RSSVpybQk9IDE3NTIsDQorICAgIFBDTVBJU1RSSVpycgk9IDE3NTMsDQorICAgIFBDTVBJU1RSSXJtCT0gMTc1NCwNCisgICAgUENNUElTVFJJcnIJPSAxNzU1LA0KKyAgICBQQ01QSVNUUk0xMjhNRU0JPSAxNzU2LA0KKyAgICBQQ01QSVNUUk0xMjhSRUcJPSAxNzU3LA0KKyAgICBQQ01QSVNUUk0xMjhybQk9IDE3NTgsDQorICAgIFBDTVBJU1RSTTEyOHJyCT0gMTc1OSwNCisgICAgUEVYVFJCbXIJPSAxNzYwLA0KKyAgICBQRVhUUkJycgk9IDE3NjEsDQorICAgIFBFWFRSRG1yCT0gMTc2MiwNCisgICAgUEVYVFJEcnIJPSAxNzYzLA0KKyAgICBQRVhUUlFtcgk9IDE3NjQsDQorICAgIFBFWFRSUXJyCT0gMTc2NSwNCisgICAgUEVYVFJXbXIJPSAxNzY2LA0KKyAgICBQRVhUUldyaQk9IDE3NjcsDQorICAgIFBIQURERHJtMTI4CT0gMTc2OCwNCisgICAgUEhBREREcm02NAk9IDE3NjksDQorICAgIFBIQURERHJyMTI4CT0gMTc3MCwNCisgICAgUEhBREREcnI2NAk9IDE3NzEsDQorICAgIFBIQUREU1dybTEyOAk9IDE3NzIsDQorICAgIFBIQUREU1dybTY0CT0gMTc3MywNCisgICAgUEhBRERTV3JyMTI4CT0gMTc3NCwNCisgICAgUEhBRERTV3JyNjQJPSAxNzc1LA0KKyAgICBQSEFERFdybTEyOAk9IDE3NzYsDQorICAgIFBIQUREV3JtNjQJPSAxNzc3LA0KKyAgICBQSEFERFdycjEyOAk9IDE3NzgsDQorICAgIFBIQUREV3JyNjQJPSAxNzc5LA0KKyAgICBQSE1JTlBPU1VXcm0xMjgJPSAxNzgwLA0KKyAgICBQSE1JTlBPU1VXcnIxMjgJPSAxNzgxLA0KKyAgICBQSFNVQkRybTEyOAk9IDE3ODIsDQorICAgIFBIU1VCRHJtNjQJPSAxNzgzLA0KKyAgICBQSFNVQkRycjEyOAk9IDE3ODQsDQorICAgIFBIU1VCRHJyNjQJPSAxNzg1LA0KKyAgICBQSFNVQlNXcm0xMjgJPSAxNzg2LA0KKyAgICBQSFNVQlNXcm02NAk9IDE3ODcsDQorICAgIFBIU1VCU1dycjEyOAk9IDE3ODgsDQorICAgIFBIU1VCU1dycjY0CT0gMTc4OSwNCisgICAgUEhTVUJXcm0xMjgJPSAxNzkwLA0KKyAgICBQSFNVQldybTY0CT0gMTc5MSwNCisgICAgUEhTVUJXcnIxMjgJPSAxNzkyLA0KKyAgICBQSFNVQldycjY0CT0gMTc5MywNCisgICAgUElOU1JCcm0JPSAxNzk0LA0KKyAgICBQSU5TUkJycgk9IDE3OTUsDQorICAgIFBJTlNSRHJtCT0gMTc5NiwNCisgICAgUElOU1JEcnIJPSAxNzk3LA0KKyAgICBQSU5TUlFybQk9IDE3OTgsDQorICAgIFBJTlNSUXJyCT0gMTc5OSwNCisgICAgUElOU1JXcm1pCT0gMTgwMCwNCisgICAgUElOU1JXcnJpCT0gMTgwMSwNCisgICAgUE1BRERVQlNXcm0xMjgJPSAxODAyLA0KKyAgICBQTUFERFVCU1dybTY0CT0gMTgwMywNCisgICAgUE1BRERVQlNXcnIxMjgJPSAxODA0LA0KKyAgICBQTUFERFVCU1dycjY0CT0gMTgwNSwNCisgICAgUE1BRERXRHJtCT0gMTgwNiwNCisgICAgUE1BRERXRHJyCT0gMTgwNywNCisgICAgUE1BWFNCcm0JPSAxODA4LA0KKyAgICBQTUFYU0Jycgk9IDE4MDksDQorICAgIFBNQVhTRHJtCT0gMTgxMCwNCisgICAgUE1BWFNEcnIJPSAxODExLA0KKyAgICBQTUFYU1dybQk9IDE4MTIsDQorICAgIFBNQVhTV3JyCT0gMTgxMywNCisgICAgUE1BWFVCcm0JPSAxODE0LA0KKyAgICBQTUFYVUJycgk9IDE4MTUsDQorICAgIFBNQVhVRHJtCT0gMTgxNiwNCisgICAgUE1BWFVEcnIJPSAxODE3LA0KKyAgICBQTUFYVVdybQk9IDE4MTgsDQorICAgIFBNQVhVV3JyCT0gMTgxOSwNCisgICAgUE1JTlNCcm0JPSAxODIwLA0KKyAgICBQTUlOU0Jycgk9IDE4MjEsDQorICAgIFBNSU5TRHJtCT0gMTgyMiwNCisgICAgUE1JTlNEcnIJPSAxODIzLA0KKyAgICBQTUlOU1dybQk9IDE4MjQsDQorICAgIFBNSU5TV3JyCT0gMTgyNSwNCisgICAgUE1JTlVCcm0JPSAxODI2LA0KKyAgICBQTUlOVUJycgk9IDE4MjcsDQorICAgIFBNSU5VRHJtCT0gMTgyOCwNCisgICAgUE1JTlVEcnIJPSAxODI5LA0KKyAgICBQTUlOVVdybQk9IDE4MzAsDQorICAgIFBNSU5VV3JyCT0gMTgzMSwNCisgICAgUE1PVk1TS0Jycgk9IDE4MzIsDQorICAgIFBNT1ZTWEJEcm0JPSAxODMzLA0KKyAgICBQTU9WU1hCRHJyCT0gMTgzNCwNCisgICAgUE1PVlNYQlFybQk9IDE4MzUsDQorICAgIFBNT1ZTWEJRcnIJPSAxODM2LA0KKyAgICBQTU9WU1hCV3JtCT0gMTgzNywNCisgICAgUE1PVlNYQldycgk9IDE4MzgsDQorICAgIFBNT1ZTWERRcm0JPSAxODM5LA0KKyAgICBQTU9WU1hEUXJyCT0gMTg0MCwNCisgICAgUE1PVlNYV0RybQk9IDE4NDEsDQorICAgIFBNT1ZTWFdEcnIJPSAxODQyLA0KKyAgICBQTU9WU1hXUXJtCT0gMTg0MywNCisgICAgUE1PVlNYV1Fycgk9IDE4NDQsDQorICAgIFBNT1ZaWEJEcm0JPSAxODQ1LA0KKyAgICBQTU9WWlhCRHJyCT0gMTg0NiwNCisgICAgUE1PVlpYQlFybQk9IDE4NDcsDQorICAgIFBNT1ZaWEJRcnIJPSAxODQ4LA0KKyAgICBQTU9WWlhCV3JtCT0gMTg0OSwNCisgICAgUE1PVlpYQldycgk9IDE4NTAsDQorICAgIFBNT1ZaWERRcm0JPSAxODUxLA0KKyAgICBQTU9WWlhEUXJyCT0gMTg1MiwNCisgICAgUE1PVlpYV0RybQk9IDE4NTMsDQorICAgIFBNT1ZaWFdEcnIJPSAxODU0LA0KKyAgICBQTU9WWlhXUXJtCT0gMTg1NSwNCisgICAgUE1PVlpYV1Fycgk9IDE4NTYsDQorICAgIFBNVUxEUXJtCT0gMTg1NywNCisgICAgUE1VTERRcnIJPSAxODU4LA0KKyAgICBQTVVMSFJTV3JtMTI4CT0gMTg1OSwNCisgICAgUE1VTEhSU1dybTY0CT0gMTg2MCwNCisgICAgUE1VTEhSU1dycjEyOAk9IDE4NjEsDQorICAgIFBNVUxIUlNXcnI2NAk9IDE4NjIsDQorICAgIFBNVUxIVVdybQk9IDE4NjMsDQorICAgIFBNVUxIVVdycgk9IDE4NjQsDQorICAgIFBNVUxIV3JtCT0gMTg2NSwNCisgICAgUE1VTEhXcnIJPSAxODY2LA0KKyAgICBQTVVMTERybQk9IDE4NjcsDQorICAgIFBNVUxMRHJyCT0gMTg2OCwNCisgICAgUE1VTExXcm0JPSAxODY5LA0KKyAgICBQTVVMTFdycgk9IDE4NzAsDQorICAgIFBNVUxVRFFybQk9IDE4NzEsDQorICAgIFBNVUxVRFFycgk9IDE4NzIsDQorICAgIFBPUDE2cgk9IDE4NzMsDQorICAgIFBPUDE2cm1tCT0gMTg3NCwNCisgICAgUE9QMTZybXIJPSAxODc1LA0KKyAgICBQT1AzMnIJPSAxODc2LA0KKyAgICBQT1AzMnJtbQk9IDE4NzcsDQorICAgIFBPUDMycm1yCT0gMTg3OCwNCisgICAgUE9QNjRyCT0gMTg3OSwNCisgICAgUE9QNjRybW0JPSAxODgwLA0KKyAgICBQT1A2NHJtcgk9IDE4ODEsDQorICAgIFBPUEEzMgk9IDE4ODIsDQorICAgIFBPUENOVDE2cm0JPSAxODgzLA0KKyAgICBQT1BDTlQxNnJyCT0gMTg4NCwNCisgICAgUE9QQ05UMzJybQk9IDE4ODUsDQorICAgIFBPUENOVDMycnIJPSAxODg2LA0KKyAgICBQT1BDTlQ2NHJtCT0gMTg4NywNCisgICAgUE9QQ05UNjRycgk9IDE4ODgsDQorICAgIFBPUEYxNgk9IDE4ODksDQorICAgIFBPUEYzMgk9IDE4OTAsDQorICAgIFBPUEY2NAk9IDE4OTEsDQorICAgIFBPUEZTMTYJPSAxODkyLA0KKyAgICBQT1BGUzMyCT0gMTg5MywNCisgICAgUE9QRlM2NAk9IDE4OTQsDQorICAgIFBPUEdTMTYJPSAxODk1LA0KKyAgICBQT1BHUzMyCT0gMTg5NiwNCisgICAgUE9QR1M2NAk9IDE4OTcsDQorICAgIFBPUnJtCT0gMTg5OCwNCisgICAgUE9ScnIJPSAxODk5LA0KKyAgICBQUkVGRVRDSE5UQQk9IDE5MDAsDQorICAgIFBSRUZFVENIVDAJPSAxOTAxLA0KKyAgICBQUkVGRVRDSFQxCT0gMTkwMiwNCisgICAgUFJFRkVUQ0hUMgk9IDE5MDMsDQorICAgIFBTQURCV3JtCT0gMTkwNCwNCisgICAgUFNBREJXcnIJPSAxOTA1LA0KKyAgICBQU0hVRkJybTEyOAk9IDE5MDYsDQorICAgIFBTSFVGQnJtNjQJPSAxOTA3LA0KKyAgICBQU0hVRkJycjEyOAk9IDE5MDgsDQorICAgIFBTSFVGQnJyNjQJPSAxOTA5LA0KKyAgICBQU0hVRkRtaQk9IDE5MTAsDQorICAgIFBTSFVGRHJpCT0gMTkxMSwNCisgICAgUFNIVUZIV21pCT0gMTkxMiwNCisgICAgUFNIVUZIV3JpCT0gMTkxMywNCisgICAgUFNIVUZMV21pCT0gMTkxNCwNCisgICAgUFNIVUZMV3JpCT0gMTkxNSwNCisgICAgUFNJR05Ccm0xMjgJPSAxOTE2LA0KKyAgICBQU0lHTkJybTY0CT0gMTkxNywNCisgICAgUFNJR05CcnIxMjgJPSAxOTE4LA0KKyAgICBQU0lHTkJycjY0CT0gMTkxOSwNCisgICAgUFNJR05Ecm0xMjgJPSAxOTIwLA0KKyAgICBQU0lHTkRybTY0CT0gMTkyMSwNCisgICAgUFNJR05EcnIxMjgJPSAxOTIyLA0KKyAgICBQU0lHTkRycjY0CT0gMTkyMywNCisgICAgUFNJR05Xcm0xMjgJPSAxOTI0LA0KKyAgICBQU0lHTldybTY0CT0gMTkyNSwNCisgICAgUFNJR05XcnIxMjgJPSAxOTI2LA0KKyAgICBQU0lHTldycjY0CT0gMTkyNywNCisgICAgUFNMTERRcmkJPSAxOTI4LA0KKyAgICBQU0xMRHJpCT0gMTkyOSwNCisgICAgUFNMTERybQk9IDE5MzAsDQorICAgIFBTTExEcnIJPSAxOTMxLA0KKyAgICBQU0xMUXJpCT0gMTkzMiwNCisgICAgUFNMTFFybQk9IDE5MzMsDQorICAgIFBTTExRcnIJPSAxOTM0LA0KKyAgICBQU0xMV3JpCT0gMTkzNSwNCisgICAgUFNMTFdybQk9IDE5MzYsDQorICAgIFBTTExXcnIJPSAxOTM3LA0KKyAgICBQU1JBRHJpCT0gMTkzOCwNCisgICAgUFNSQURybQk9IDE5MzksDQorICAgIFBTUkFEcnIJPSAxOTQwLA0KKyAgICBQU1JBV3JpCT0gMTk0MSwNCisgICAgUFNSQVdybQk9IDE5NDIsDQorICAgIFBTUkFXcnIJPSAxOTQzLA0KKyAgICBQU1JMRFFyaQk9IDE5NDQsDQorICAgIFBTUkxEcmkJPSAxOTQ1LA0KKyAgICBQU1JMRHJtCT0gMTk0NiwNCisgICAgUFNSTERycgk9IDE5NDcsDQorICAgIFBTUkxRcmkJPSAxOTQ4LA0KKyAgICBQU1JMUXJtCT0gMTk0OSwNCisgICAgUFNSTFFycgk9IDE5NTAsDQorICAgIFBTUkxXcmkJPSAxOTUxLA0KKyAgICBQU1JMV3JtCT0gMTk1MiwNCisgICAgUFNSTFdycgk9IDE5NTMsDQorICAgIFBTVUJCcm0JPSAxOTU0LA0KKyAgICBQU1VCQnJyCT0gMTk1NSwNCisgICAgUFNVQkRybQk9IDE5NTYsDQorICAgIFBTVUJEcnIJPSAxOTU3LA0KKyAgICBQU1VCUXJtCT0gMTk1OCwNCisgICAgUFNVQlFycgk9IDE5NTksDQorICAgIFBTVUJTQnJtCT0gMTk2MCwNCisgICAgUFNVQlNCcnIJPSAxOTYxLA0KKyAgICBQU1VCU1dybQk9IDE5NjIsDQorICAgIFBTVUJTV3JyCT0gMTk2MywNCisgICAgUFNVQlVTQnJtCT0gMTk2NCwNCisgICAgUFNVQlVTQnJyCT0gMTk2NSwNCisgICAgUFNVQlVTV3JtCT0gMTk2NiwNCisgICAgUFNVQlVTV3JyCT0gMTk2NywNCisgICAgUFNVQldybQk9IDE5NjgsDQorICAgIFBTVUJXcnIJPSAxOTY5LA0KKyAgICBQVEVTVHJtCT0gMTk3MCwNCisgICAgUFRFU1Rycgk9IDE5NzEsDQorICAgIFBVTlBDS0hCV3JtCT0gMTk3MiwNCisgICAgUFVOUENLSEJXcnIJPSAxOTczLA0KKyAgICBQVU5QQ0tIRFFybQk9IDE5NzQsDQorICAgIFBVTlBDS0hEUXJyCT0gMTk3NSwNCisgICAgUFVOUENLSFFEUXJtCT0gMTk3NiwNCisgICAgUFVOUENLSFFEUXJyCT0gMTk3NywNCisgICAgUFVOUENLSFdEcm0JPSAxOTc4LA0KKyAgICBQVU5QQ0tIV0Rycgk9IDE5NzksDQorICAgIFBVTlBDS0xCV3JtCT0gMTk4MCwNCisgICAgUFVOUENLTEJXcnIJPSAxOTgxLA0KKyAgICBQVU5QQ0tMRFFybQk9IDE5ODIsDQorICAgIFBVTlBDS0xEUXJyCT0gMTk4MywNCisgICAgUFVOUENLTFFEUXJtCT0gMTk4NCwNCisgICAgUFVOUENLTFFEUXJyCT0gMTk4NSwNCisgICAgUFVOUENLTFdEcm0JPSAxOTg2LA0KKyAgICBQVU5QQ0tMV0Rycgk9IDE5ODcsDQorICAgIFBVU0gxNnIJPSAxOTg4LA0KKyAgICBQVVNIMTZybW0JPSAxOTg5LA0KKyAgICBQVVNIMTZybXIJPSAxOTkwLA0KKyAgICBQVVNIMzJyCT0gMTk5MSwNCisgICAgUFVTSDMycm1tCT0gMTk5MiwNCisgICAgUFVTSDMycm1yCT0gMTk5MywNCisgICAgUFVTSDY0aTE2CT0gMTk5NCwNCisgICAgUFVTSDY0aTMyCT0gMTk5NSwNCisgICAgUFVTSDY0aTgJPSAxOTk2LA0KKyAgICBQVVNINjRyCT0gMTk5NywNCisgICAgUFVTSDY0cm1tCT0gMTk5OCwNCisgICAgUFVTSDY0cm1yCT0gMTk5OSwNCisgICAgUFVTSEEzMgk9IDIwMDAsDQorICAgIFBVU0hGMTYJPSAyMDAxLA0KKyAgICBQVVNIRjMyCT0gMjAwMiwNCisgICAgUFVTSEY2NAk9IDIwMDMsDQorICAgIFBVU0hGUzE2CT0gMjAwNCwNCisgICAgUFVTSEZTMzIJPSAyMDA1LA0KKyAgICBQVVNIRlM2NAk9IDIwMDYsDQorICAgIFBVU0hHUzE2CT0gMjAwNywNCisgICAgUFVTSEdTMzIJPSAyMDA4LA0KKyAgICBQVVNIR1M2NAk9IDIwMDksDQorICAgIFBVU0hpMTYJPSAyMDEwLA0KKyAgICBQVVNIaTMyCT0gMjAxMSwNCisgICAgUFVTSGk4CT0gMjAxMiwNCisgICAgUFhPUnJtCT0gMjAxMywNCisgICAgUFhPUnJyCT0gMjAxNCwNCisgICAgUkNMMTZtMQk9IDIwMTUsDQorICAgIFJDTDE2bUNMCT0gMjAxNiwNCisgICAgUkNMMTZtaQk9IDIwMTcsDQorICAgIFJDTDE2cjEJPSAyMDE4LA0KKyAgICBSQ0wxNnJDTAk9IDIwMTksDQorICAgIFJDTDE2cmkJPSAyMDIwLA0KKyAgICBSQ0wzMm0xCT0gMjAyMSwNCisgICAgUkNMMzJtQ0wJPSAyMDIyLA0KKyAgICBSQ0wzMm1pCT0gMjAyMywNCisgICAgUkNMMzJyMQk9IDIwMjQsDQorICAgIFJDTDMyckNMCT0gMjAyNSwNCisgICAgUkNMMzJyaQk9IDIwMjYsDQorICAgIFJDTDY0bTEJPSAyMDI3LA0KKyAgICBSQ0w2NG1DTAk9IDIwMjgsDQorICAgIFJDTDY0bWkJPSAyMDI5LA0KKyAgICBSQ0w2NHIxCT0gMjAzMCwNCisgICAgUkNMNjRyQ0wJPSAyMDMxLA0KKyAgICBSQ0w2NHJpCT0gMjAzMiwNCisgICAgUkNMOG0xCT0gMjAzMywNCisgICAgUkNMOG1DTAk9IDIwMzQsDQorICAgIFJDTDhtaQk9IDIwMzUsDQorICAgIFJDTDhyMQk9IDIwMzYsDQorICAgIFJDTDhyQ0wJPSAyMDM3LA0KKyAgICBSQ0w4cmkJPSAyMDM4LA0KKyAgICBSQ1BQU20JPSAyMDM5LA0KKyAgICBSQ1BQU21fSW50CT0gMjA0MCwNCisgICAgUkNQUFNyCT0gMjA0MSwNCisgICAgUkNQUFNyX0ludAk9IDIwNDIsDQorICAgIFJDUFNTbQk9IDIwNDMsDQorICAgIFJDUFNTbV9JbnQJPSAyMDQ0LA0KKyAgICBSQ1BTU3IJPSAyMDQ1LA0KKyAgICBSQ1BTU3JfSW50CT0gMjA0NiwNCisgICAgUkNSMTZtMQk9IDIwNDcsDQorICAgIFJDUjE2bUNMCT0gMjA0OCwNCisgICAgUkNSMTZtaQk9IDIwNDksDQorICAgIFJDUjE2cjEJPSAyMDUwLA0KKyAgICBSQ1IxNnJDTAk9IDIwNTEsDQorICAgIFJDUjE2cmkJPSAyMDUyLA0KKyAgICBSQ1IzMm0xCT0gMjA1MywNCisgICAgUkNSMzJtQ0wJPSAyMDU0LA0KKyAgICBSQ1IzMm1pCT0gMjA1NSwNCisgICAgUkNSMzJyMQk9IDIwNTYsDQorICAgIFJDUjMyckNMCT0gMjA1NywNCisgICAgUkNSMzJyaQk9IDIwNTgsDQorICAgIFJDUjY0bTEJPSAyMDU5LA0KKyAgICBSQ1I2NG1DTAk9IDIwNjAsDQorICAgIFJDUjY0bWkJPSAyMDYxLA0KKyAgICBSQ1I2NHIxCT0gMjA2MiwNCisgICAgUkNSNjRyQ0wJPSAyMDYzLA0KKyAgICBSQ1I2NHJpCT0gMjA2NCwNCisgICAgUkNSOG0xCT0gMjA2NSwNCisgICAgUkNSOG1DTAk9IDIwNjYsDQorICAgIFJDUjhtaQk9IDIwNjcsDQorICAgIFJDUjhyMQk9IDIwNjgsDQorICAgIFJDUjhyQ0wJPSAyMDY5LA0KKyAgICBSQ1I4cmkJPSAyMDcwLA0KKyAgICBSRE1TUgk9IDIwNzEsDQorICAgIFJEUE1DCT0gMjA3MiwNCisgICAgUkRUU0MJPSAyMDczLA0KKyAgICBSRFRTQ1AJPSAyMDc0LA0KKyAgICBSRVBORV9QUkVGSVgJPSAyMDc1LA0KKyAgICBSRVBfTU9WU0IJPSAyMDc2LA0KKyAgICBSRVBfTU9WU0QJPSAyMDc3LA0KKyAgICBSRVBfTU9WU1EJPSAyMDc4LA0KKyAgICBSRVBfTU9WU1cJPSAyMDc5LA0KKyAgICBSRVBfUFJFRklYCT0gMjA4MCwNCisgICAgUkVQX1NUT1NCCT0gMjA4MSwNCisgICAgUkVQX1NUT1NECT0gMjA4MiwNCisgICAgUkVQX1NUT1NRCT0gMjA4MywNCisgICAgUkVQX1NUT1NXCT0gMjA4NCwNCisgICAgUkVUCT0gMjA4NSwNCisgICAgUkVUSQk9IDIwODYsDQorICAgIFJPTDE2bTEJPSAyMDg3LA0KKyAgICBST0wxNm1DTAk9IDIwODgsDQorICAgIFJPTDE2bWkJPSAyMDg5LA0KKyAgICBST0wxNnIxCT0gMjA5MCwNCisgICAgUk9MMTZyQ0wJPSAyMDkxLA0KKyAgICBST0wxNnJpCT0gMjA5MiwNCisgICAgUk9MMzJtMQk9IDIwOTMsDQorICAgIFJPTDMybUNMCT0gMjA5NCwNCisgICAgUk9MMzJtaQk9IDIwOTUsDQorICAgIFJPTDMycjEJPSAyMDk2LA0KKyAgICBST0wzMnJDTAk9IDIwOTcsDQorICAgIFJPTDMycmkJPSAyMDk4LA0KKyAgICBST0w2NG0xCT0gMjA5OSwNCisgICAgUk9MNjRtQ0wJPSAyMTAwLA0KKyAgICBST0w2NG1pCT0gMjEwMSwNCisgICAgUk9MNjRyMQk9IDIxMDIsDQorICAgIFJPTDY0ckNMCT0gMjEwMywNCisgICAgUk9MNjRyaQk9IDIxMDQsDQorICAgIFJPTDhtMQk9IDIxMDUsDQorICAgIFJPTDhtQ0wJPSAyMTA2LA0KKyAgICBST0w4bWkJPSAyMTA3LA0KKyAgICBST0w4cjEJPSAyMTA4LA0KKyAgICBST0w4ckNMCT0gMjEwOSwNCisgICAgUk9MOHJpCT0gMjExMCwNCisgICAgUk9SMTZtMQk9IDIxMTEsDQorICAgIFJPUjE2bUNMCT0gMjExMiwNCisgICAgUk9SMTZtaQk9IDIxMTMsDQorICAgIFJPUjE2cjEJPSAyMTE0LA0KKyAgICBST1IxNnJDTAk9IDIxMTUsDQorICAgIFJPUjE2cmkJPSAyMTE2LA0KKyAgICBST1IzMm0xCT0gMjExNywNCisgICAgUk9SMzJtQ0wJPSAyMTE4LA0KKyAgICBST1IzMm1pCT0gMjExOSwNCisgICAgUk9SMzJyMQk9IDIxMjAsDQorICAgIFJPUjMyckNMCT0gMjEyMSwNCisgICAgUk9SMzJyaQk9IDIxMjIsDQorICAgIFJPUjY0bTEJPSAyMTIzLA0KKyAgICBST1I2NG1DTAk9IDIxMjQsDQorICAgIFJPUjY0bWkJPSAyMTI1LA0KKyAgICBST1I2NHIxCT0gMjEyNiwNCisgICAgUk9SNjRyQ0wJPSAyMTI3LA0KKyAgICBST1I2NHJpCT0gMjEyOCwNCisgICAgUk9SOG0xCT0gMjEyOSwNCisgICAgUk9SOG1DTAk9IDIxMzAsDQorICAgIFJPUjhtaQk9IDIxMzEsDQorICAgIFJPUjhyMQk9IDIxMzIsDQorICAgIFJPUjhyQ0wJPSAyMTMzLA0KKyAgICBST1I4cmkJPSAyMTM0LA0KKyAgICBST1VORFBEbV9JbnQJPSAyMTM1LA0KKyAgICBST1VORFBEcl9JbnQJPSAyMTM2LA0KKyAgICBST1VORFBTbV9JbnQJPSAyMTM3LA0KKyAgICBST1VORFBTcl9JbnQJPSAyMTM4LA0KKyAgICBST1VORFNEbV9JbnQJPSAyMTM5LA0KKyAgICBST1VORFNEcl9JbnQJPSAyMTQwLA0KKyAgICBST1VORFNTbV9JbnQJPSAyMTQxLA0KKyAgICBST1VORFNTcl9JbnQJPSAyMTQyLA0KKyAgICBSU00JPSAyMTQzLA0KKyAgICBSU1FSVFBTbQk9IDIxNDQsDQorICAgIFJTUVJUUFNtX0ludAk9IDIxNDUsDQorICAgIFJTUVJUUFNyCT0gMjE0NiwNCisgICAgUlNRUlRQU3JfSW50CT0gMjE0NywNCisgICAgUlNRUlRTU20JPSAyMTQ4LA0KKyAgICBSU1FSVFNTbV9JbnQJPSAyMTQ5LA0KKyAgICBSU1FSVFNTcgk9IDIxNTAsDQorICAgIFJTUVJUU1NyX0ludAk9IDIxNTEsDQorICAgIFNBSEYJPSAyMTUyLA0KKyAgICBTQVIxNm0xCT0gMjE1MywNCisgICAgU0FSMTZtQ0wJPSAyMTU0LA0KKyAgICBTQVIxNm1pCT0gMjE1NSwNCisgICAgU0FSMTZyMQk9IDIxNTYsDQorICAgIFNBUjE2ckNMCT0gMjE1NywNCisgICAgU0FSMTZyaQk9IDIxNTgsDQorICAgIFNBUjMybTEJPSAyMTU5LA0KKyAgICBTQVIzMm1DTAk9IDIxNjAsDQorICAgIFNBUjMybWkJPSAyMTYxLA0KKyAgICBTQVIzMnIxCT0gMjE2MiwNCisgICAgU0FSMzJyQ0wJPSAyMTYzLA0KKyAgICBTQVIzMnJpCT0gMjE2NCwNCisgICAgU0FSNjRtMQk9IDIxNjUsDQorICAgIFNBUjY0bUNMCT0gMjE2NiwNCisgICAgU0FSNjRtaQk9IDIxNjcsDQorICAgIFNBUjY0cjEJPSAyMTY4LA0KKyAgICBTQVI2NHJDTAk9IDIxNjksDQorICAgIFNBUjY0cmkJPSAyMTcwLA0KKyAgICBTQVI4bTEJPSAyMTcxLA0KKyAgICBTQVI4bUNMCT0gMjE3MiwNCisgICAgU0FSOG1pCT0gMjE3MywNCisgICAgU0FSOHIxCT0gMjE3NCwNCisgICAgU0FSOHJDTAk9IDIxNzUsDQorICAgIFNBUjhyaQk9IDIxNzYsDQorICAgIFNCQjE2aTE2CT0gMjE3NywNCisgICAgU0JCMTZtaQk9IDIxNzgsDQorICAgIFNCQjE2bWk4CT0gMjE3OSwNCisgICAgU0JCMTZtcgk9IDIxODAsDQorICAgIFNCQjE2cmkJPSAyMTgxLA0KKyAgICBTQkIxNnJpOAk9IDIxODIsDQorICAgIFNCQjE2cm0JPSAyMTgzLA0KKyAgICBTQkIxNnJyCT0gMjE4NCwNCisgICAgU0JCMTZycl9SRVYJPSAyMTg1LA0KKyAgICBTQkIzMmkzMgk9IDIxODYsDQorICAgIFNCQjMybWkJPSAyMTg3LA0KKyAgICBTQkIzMm1pOAk9IDIxODgsDQorICAgIFNCQjMybXIJPSAyMTg5LA0KKyAgICBTQkIzMnJpCT0gMjE5MCwNCisgICAgU0JCMzJyaTgJPSAyMTkxLA0KKyAgICBTQkIzMnJtCT0gMjE5MiwNCisgICAgU0JCMzJycgk9IDIxOTMsDQorICAgIFNCQjMycnJfUkVWCT0gMjE5NCwNCisgICAgU0JCNjRpMzIJPSAyMTk1LA0KKyAgICBTQkI2NG1pMzIJPSAyMTk2LA0KKyAgICBTQkI2NG1pOAk9IDIxOTcsDQorICAgIFNCQjY0bXIJPSAyMTk4LA0KKyAgICBTQkI2NHJpMzIJPSAyMTk5LA0KKyAgICBTQkI2NHJpOAk9IDIyMDAsDQorICAgIFNCQjY0cm0JPSAyMjAxLA0KKyAgICBTQkI2NHJyCT0gMjIwMiwNCisgICAgU0JCNjRycl9SRVYJPSAyMjAzLA0KKyAgICBTQkI4aTgJPSAyMjA0LA0KKyAgICBTQkI4bWkJPSAyMjA1LA0KKyAgICBTQkI4bXIJPSAyMjA2LA0KKyAgICBTQkI4cmkJPSAyMjA3LA0KKyAgICBTQkI4cm0JPSAyMjA4LA0KKyAgICBTQkI4cnIJPSAyMjA5LA0KKyAgICBTQkI4cnJfUkVWCT0gMjIxMCwNCisgICAgU0NBUzE2CT0gMjIxMSwNCisgICAgU0NBUzMyCT0gMjIxMiwNCisgICAgU0NBUzY0CT0gMjIxMywNCisgICAgU0NBUzgJPSAyMjE0LA0KKyAgICBTRVRBRW0JPSAyMjE1LA0KKyAgICBTRVRBRXIJPSAyMjE2LA0KKyAgICBTRVRBbQk9IDIyMTcsDQorICAgIFNFVEFyCT0gMjIxOCwNCisgICAgU0VUQkVtCT0gMjIxOSwNCisgICAgU0VUQkVyCT0gMjIyMCwNCisgICAgU0VUQl9DMTZyCT0gMjIyMSwNCisgICAgU0VUQl9DMzJyCT0gMjIyMiwNCisgICAgU0VUQl9DNjRyCT0gMjIyMywNCisgICAgU0VUQl9DOHIJPSAyMjI0LA0KKyAgICBTRVRCbQk9IDIyMjUsDQorICAgIFNFVEJyCT0gMjIyNiwNCisgICAgU0VURW0JPSAyMjI3LA0KKyAgICBTRVRFcgk9IDIyMjgsDQorICAgIFNFVEdFbQk9IDIyMjksDQorICAgIFNFVEdFcgk9IDIyMzAsDQorICAgIFNFVEdtCT0gMjIzMSwNCisgICAgU0VUR3IJPSAyMjMyLA0KKyAgICBTRVRMRW0JPSAyMjMzLA0KKyAgICBTRVRMRXIJPSAyMjM0LA0KKyAgICBTRVRMbQk9IDIyMzUsDQorICAgIFNFVExyCT0gMjIzNiwNCisgICAgU0VUTkVtCT0gMjIzNywNCisgICAgU0VUTkVyCT0gMjIzOCwNCisgICAgU0VUTk9tCT0gMjIzOSwNCisgICAgU0VUTk9yCT0gMjI0MCwNCisgICAgU0VUTlBtCT0gMjI0MSwNCisgICAgU0VUTlByCT0gMjI0MiwNCisgICAgU0VUTlNtCT0gMjI0MywNCisgICAgU0VUTlNyCT0gMjI0NCwNCisgICAgU0VUT20JPSAyMjQ1LA0KKyAgICBTRVRPcgk9IDIyNDYsDQorICAgIFNFVFBtCT0gMjI0NywNCisgICAgU0VUUHIJPSAyMjQ4LA0KKyAgICBTRVRTbQk9IDIyNDksDQorICAgIFNFVFNyCT0gMjI1MCwNCisgICAgU0ZFTkNFCT0gMjI1MSwNCisgICAgU0dEVG0JPSAyMjUyLA0KKyAgICBTSEwxNm0xCT0gMjI1MywNCisgICAgU0hMMTZtQ0wJPSAyMjU0LA0KKyAgICBTSEwxNm1pCT0gMjI1NSwNCisgICAgU0hMMTZyMQk9IDIyNTYsDQorICAgIFNITDE2ckNMCT0gMjI1NywNCisgICAgU0hMMTZyaQk9IDIyNTgsDQorICAgIFNITDMybTEJPSAyMjU5LA0KKyAgICBTSEwzMm1DTAk9IDIyNjAsDQorICAgIFNITDMybWkJPSAyMjYxLA0KKyAgICBTSEwzMnIxCT0gMjI2MiwNCisgICAgU0hMMzJyQ0wJPSAyMjYzLA0KKyAgICBTSEwzMnJpCT0gMjI2NCwNCisgICAgU0hMNjRtMQk9IDIyNjUsDQorICAgIFNITDY0bUNMCT0gMjI2NiwNCisgICAgU0hMNjRtaQk9IDIyNjcsDQorICAgIFNITDY0cjEJPSAyMjY4LA0KKyAgICBTSEw2NHJDTAk9IDIyNjksDQorICAgIFNITDY0cmkJPSAyMjcwLA0KKyAgICBTSEw4bTEJPSAyMjcxLA0KKyAgICBTSEw4bUNMCT0gMjI3MiwNCisgICAgU0hMOG1pCT0gMjI3MywNCisgICAgU0hMOHIxCT0gMjI3NCwNCisgICAgU0hMOHJDTAk9IDIyNzUsDQorICAgIFNITDhyaQk9IDIyNzYsDQorICAgIFNITEQxNm1yQ0wJPSAyMjc3LA0KKyAgICBTSExEMTZtcmk4CT0gMjI3OCwNCisgICAgU0hMRDE2cnJDTAk9IDIyNzksDQorICAgIFNITEQxNnJyaTgJPSAyMjgwLA0KKyAgICBTSExEMzJtckNMCT0gMjI4MSwNCisgICAgU0hMRDMybXJpOAk9IDIyODIsDQorICAgIFNITEQzMnJyQ0wJPSAyMjgzLA0KKyAgICBTSExEMzJycmk4CT0gMjI4NCwNCisgICAgU0hMRDY0bXJDTAk9IDIyODUsDQorICAgIFNITEQ2NG1yaTgJPSAyMjg2LA0KKyAgICBTSExENjRyckNMCT0gMjI4NywNCisgICAgU0hMRDY0cnJpOAk9IDIyODgsDQorICAgIFNIUjE2bTEJPSAyMjg5LA0KKyAgICBTSFIxNm1DTAk9IDIyOTAsDQorICAgIFNIUjE2bWkJPSAyMjkxLA0KKyAgICBTSFIxNnIxCT0gMjI5MiwNCisgICAgU0hSMTZyQ0wJPSAyMjkzLA0KKyAgICBTSFIxNnJpCT0gMjI5NCwNCisgICAgU0hSMzJtMQk9IDIyOTUsDQorICAgIFNIUjMybUNMCT0gMjI5NiwNCisgICAgU0hSMzJtaQk9IDIyOTcsDQorICAgIFNIUjMycjEJPSAyMjk4LA0KKyAgICBTSFIzMnJDTAk9IDIyOTksDQorICAgIFNIUjMycmkJPSAyMzAwLA0KKyAgICBTSFI2NG0xCT0gMjMwMSwNCisgICAgU0hSNjRtQ0wJPSAyMzAyLA0KKyAgICBTSFI2NG1pCT0gMjMwMywNCisgICAgU0hSNjRyMQk9IDIzMDQsDQorICAgIFNIUjY0ckNMCT0gMjMwNSwNCisgICAgU0hSNjRyaQk9IDIzMDYsDQorICAgIFNIUjhtMQk9IDIzMDcsDQorICAgIFNIUjhtQ0wJPSAyMzA4LA0KKyAgICBTSFI4bWkJPSAyMzA5LA0KKyAgICBTSFI4cjEJPSAyMzEwLA0KKyAgICBTSFI4ckNMCT0gMjMxMSwNCisgICAgU0hSOHJpCT0gMjMxMiwNCisgICAgU0hSRDE2bXJDTAk9IDIzMTMsDQorICAgIFNIUkQxNm1yaTgJPSAyMzE0LA0KKyAgICBTSFJEMTZyckNMCT0gMjMxNSwNCisgICAgU0hSRDE2cnJpOAk9IDIzMTYsDQorICAgIFNIUkQzMm1yQ0wJPSAyMzE3LA0KKyAgICBTSFJEMzJtcmk4CT0gMjMxOCwNCisgICAgU0hSRDMycnJDTAk9IDIzMTksDQorICAgIFNIUkQzMnJyaTgJPSAyMzIwLA0KKyAgICBTSFJENjRtckNMCT0gMjMyMSwNCisgICAgU0hSRDY0bXJpOAk9IDIzMjIsDQorICAgIFNIUkQ2NHJyQ0wJPSAyMzIzLA0KKyAgICBTSFJENjRycmk4CT0gMjMyNCwNCisgICAgU0hVRlBEcm1pCT0gMjMyNSwNCisgICAgU0hVRlBEcnJpCT0gMjMyNiwNCisgICAgU0hVRlBTcm1pCT0gMjMyNywNCisgICAgU0hVRlBTcnJpCT0gMjMyOCwNCisgICAgU0lEVG0JPSAyMzI5LA0KKyAgICBTSU5fRgk9IDIzMzAsDQorICAgIFNJTl9GcDMyCT0gMjMzMSwNCisgICAgU0lOX0ZwNjQJPSAyMzMyLA0KKyAgICBTSU5fRnA4MAk9IDIzMzMsDQorICAgIFNMRFQxNm0JPSAyMzM0LA0KKyAgICBTTERUMTZyCT0gMjMzNSwNCisgICAgU0xEVDY0bQk9IDIzMzYsDQorICAgIFNMRFQ2NHIJPSAyMzM3LA0KKyAgICBTTVNXMTZtCT0gMjMzOCwNCisgICAgU01TVzE2cgk9IDIzMzksDQorICAgIFNNU1czMnIJPSAyMzQwLA0KKyAgICBTTVNXNjRyCT0gMjM0MSwNCisgICAgU1FSVFBEbQk9IDIzNDIsDQorICAgIFNRUlRQRG1fSW50CT0gMjM0MywNCisgICAgU1FSVFBEcgk9IDIzNDQsDQorICAgIFNRUlRQRHJfSW50CT0gMjM0NSwNCisgICAgU1FSVFBTbQk9IDIzNDYsDQorICAgIFNRUlRQU21fSW50CT0gMjM0NywNCisgICAgU1FSVFBTcgk9IDIzNDgsDQorICAgIFNRUlRQU3JfSW50CT0gMjM0OSwNCisgICAgU1FSVFNEbQk9IDIzNTAsDQorICAgIFNRUlRTRG1fSW50CT0gMjM1MSwNCisgICAgU1FSVFNEcgk9IDIzNTIsDQorICAgIFNRUlRTRHJfSW50CT0gMjM1MywNCisgICAgU1FSVFNTbQk9IDIzNTQsDQorICAgIFNRUlRTU21fSW50CT0gMjM1NSwNCisgICAgU1FSVFNTcgk9IDIzNTYsDQorICAgIFNRUlRTU3JfSW50CT0gMjM1NywNCisgICAgU1FSVF9GCT0gMjM1OCwNCisgICAgU1FSVF9GcDMyCT0gMjM1OSwNCisgICAgU1FSVF9GcDY0CT0gMjM2MCwNCisgICAgU1FSVF9GcDgwCT0gMjM2MSwNCisgICAgU1NfUFJFRklYCT0gMjM2MiwNCisgICAgU1RDCT0gMjM2MywNCisgICAgU1RECT0gMjM2NCwNCisgICAgU1RJCT0gMjM2NSwNCisgICAgU1RNWENTUgk9IDIzNjYsDQorICAgIFNUT1NCCT0gMjM2NywNCisgICAgU1RPU0QJPSAyMzY4LA0KKyAgICBTVE9TUQk9IDIzNjksDQorICAgIFNUT1NXCT0gMjM3MCwNCisgICAgU1RSbQk9IDIzNzEsDQorICAgIFNUUnIJPSAyMzcyLA0KKyAgICBTVF9GMzJtCT0gMjM3MywNCisgICAgU1RfRjY0bQk9IDIzNzQsDQorICAgIFNUX0ZQMzJtCT0gMjM3NSwNCisgICAgU1RfRlA2NG0JPSAyMzc2LA0KKyAgICBTVF9GUDgwbQk9IDIzNzcsDQorICAgIFNUX0ZQcnIJPSAyMzc4LA0KKyAgICBTVF9GcDMybQk9IDIzNzksDQorICAgIFNUX0ZwNjRtCT0gMjM4MCwNCisgICAgU1RfRnA2NG0zMgk9IDIzODEsDQorICAgIFNUX0ZwODBtMzIJPSAyMzgyLA0KKyAgICBTVF9GcDgwbTY0CT0gMjM4MywNCisgICAgU1RfRnBQMzJtCT0gMjM4NCwNCisgICAgU1RfRnBQNjRtCT0gMjM4NSwNCisgICAgU1RfRnBQNjRtMzIJPSAyMzg2LA0KKyAgICBTVF9GcFA4MG0JPSAyMzg3LA0KKyAgICBTVF9GcFA4MG0zMgk9IDIzODgsDQorICAgIFNUX0ZwUDgwbTY0CT0gMjM4OSwNCisgICAgU1RfRnJyCT0gMjM5MCwNCisgICAgU1VCMTZpMTYJPSAyMzkxLA0KKyAgICBTVUIxNm1pCT0gMjM5MiwNCisgICAgU1VCMTZtaTgJPSAyMzkzLA0KKyAgICBTVUIxNm1yCT0gMjM5NCwNCisgICAgU1VCMTZyaQk9IDIzOTUsDQorICAgIFNVQjE2cmk4CT0gMjM5NiwNCisgICAgU1VCMTZybQk9IDIzOTcsDQorICAgIFNVQjE2cnIJPSAyMzk4LA0KKyAgICBTVUIxNnJyX1JFVgk9IDIzOTksDQorICAgIFNVQjMyaTMyCT0gMjQwMCwNCisgICAgU1VCMzJtaQk9IDI0MDEsDQorICAgIFNVQjMybWk4CT0gMjQwMiwNCisgICAgU1VCMzJtcgk9IDI0MDMsDQorICAgIFNVQjMycmkJPSAyNDA0LA0KKyAgICBTVUIzMnJpOAk9IDI0MDUsDQorICAgIFNVQjMycm0JPSAyNDA2LA0KKyAgICBTVUIzMnJyCT0gMjQwNywNCisgICAgU1VCMzJycl9SRVYJPSAyNDA4LA0KKyAgICBTVUI2NGkzMgk9IDI0MDksDQorICAgIFNVQjY0bWkzMgk9IDI0MTAsDQorICAgIFNVQjY0bWk4CT0gMjQxMSwNCisgICAgU1VCNjRtcgk9IDI0MTIsDQorICAgIFNVQjY0cmkzMgk9IDI0MTMsDQorICAgIFNVQjY0cmk4CT0gMjQxNCwNCisgICAgU1VCNjRybQk9IDI0MTUsDQorICAgIFNVQjY0cnIJPSAyNDE2LA0KKyAgICBTVUI2NHJyX1JFVgk9IDI0MTcsDQorICAgIFNVQjhpOAk9IDI0MTgsDQorICAgIFNVQjhtaQk9IDI0MTksDQorICAgIFNVQjhtcgk9IDI0MjAsDQorICAgIFNVQjhyaQk9IDI0MjEsDQorICAgIFNVQjhybQk9IDI0MjIsDQorICAgIFNVQjhycgk9IDI0MjMsDQorICAgIFNVQjhycl9SRVYJPSAyNDI0LA0KKyAgICBTVUJQRHJtCT0gMjQyNSwNCisgICAgU1VCUERycgk9IDI0MjYsDQorICAgIFNVQlBTcm0JPSAyNDI3LA0KKyAgICBTVUJQU3JyCT0gMjQyOCwNCisgICAgU1VCUl9GMzJtCT0gMjQyOSwNCisgICAgU1VCUl9GNjRtCT0gMjQzMCwNCisgICAgU1VCUl9GSTE2bQk9IDI0MzEsDQorICAgIFNVQlJfRkkzMm0JPSAyNDMyLA0KKyAgICBTVUJSX0ZQclNUMAk9IDI0MzMsDQorICAgIFNVQlJfRlNUMHIJPSAyNDM0LA0KKyAgICBTVUJSX0ZwMzJtCT0gMjQzNSwNCisgICAgU1VCUl9GcDY0bQk9IDI0MzYsDQorICAgIFNVQlJfRnA2NG0zMgk9IDI0MzcsDQorICAgIFNVQlJfRnA4MG0zMgk9IDI0MzgsDQorICAgIFNVQlJfRnA4MG02NAk9IDI0MzksDQorICAgIFNVQlJfRnBJMTZtMzIJPSAyNDQwLA0KKyAgICBTVUJSX0ZwSTE2bTY0CT0gMjQ0MSwNCisgICAgU1VCUl9GcEkxNm04MAk9IDI0NDIsDQorICAgIFNVQlJfRnBJMzJtMzIJPSAyNDQzLA0KKyAgICBTVUJSX0ZwSTMybTY0CT0gMjQ0NCwNCisgICAgU1VCUl9GcEkzMm04MAk9IDI0NDUsDQorICAgIFNVQlJfRnJTVDAJPSAyNDQ2LA0KKyAgICBTVUJTRHJtCT0gMjQ0NywNCisgICAgU1VCU0RybV9JbnQJPSAyNDQ4LA0KKyAgICBTVUJTRHJyCT0gMjQ0OSwNCisgICAgU1VCU0Rycl9JbnQJPSAyNDUwLA0KKyAgICBTVUJTU3JtCT0gMjQ1MSwNCisgICAgU1VCU1NybV9JbnQJPSAyNDUyLA0KKyAgICBTVUJTU3JyCT0gMjQ1MywNCisgICAgU1VCU1Nycl9JbnQJPSAyNDU0LA0KKyAgICBTVUJfRjMybQk9IDI0NTUsDQorICAgIFNVQl9GNjRtCT0gMjQ1NiwNCisgICAgU1VCX0ZJMTZtCT0gMjQ1NywNCisgICAgU1VCX0ZJMzJtCT0gMjQ1OCwNCisgICAgU1VCX0ZQclNUMAk9IDI0NTksDQorICAgIFNVQl9GU1Qwcgk9IDI0NjAsDQorICAgIFNVQl9GcDMyCT0gMjQ2MSwNCisgICAgU1VCX0ZwMzJtCT0gMjQ2MiwNCisgICAgU1VCX0ZwNjQJPSAyNDYzLA0KKyAgICBTVUJfRnA2NG0JPSAyNDY0LA0KKyAgICBTVUJfRnA2NG0zMgk9IDI0NjUsDQorICAgIFNVQl9GcDgwCT0gMjQ2NiwNCisgICAgU1VCX0ZwODBtMzIJPSAyNDY3LA0KKyAgICBTVUJfRnA4MG02NAk9IDI0NjgsDQorICAgIFNVQl9GcEkxNm0zMgk9IDI0NjksDQorICAgIFNVQl9GcEkxNm02NAk9IDI0NzAsDQorICAgIFNVQl9GcEkxNm04MAk9IDI0NzEsDQorICAgIFNVQl9GcEkzMm0zMgk9IDI0NzIsDQorICAgIFNVQl9GcEkzMm02NAk9IDI0NzMsDQorICAgIFNVQl9GcEkzMm04MAk9IDI0NzQsDQorICAgIFNVQl9GclNUMAk9IDI0NzUsDQorICAgIFNXQVBHUwk9IDI0NzYsDQorICAgIFNZU0NBTEwJPSAyNDc3LA0KKyAgICBTWVNFTlRFUgk9IDI0NzgsDQorICAgIFNZU0VYSVQJPSAyNDc5LA0KKyAgICBTWVNFWElUNjQJPSAyNDgwLA0KKyAgICBTWVNSRVQJPSAyNDgxLA0KKyAgICBUQUlMSk1QZAk9IDI0ODIsDQorICAgIFRBSUxKTVBkNjQJPSAyNDgzLA0KKyAgICBUQUlMSk1QbQk9IDI0ODQsDQorICAgIFRBSUxKTVBtNjQJPSAyNDg1LA0KKyAgICBUQUlMSk1Qcgk9IDI0ODYsDQorICAgIFRBSUxKTVByNjQJPSAyNDg3LA0KKyAgICBUQ1JFVFVSTmRpCT0gMjQ4OCwNCisgICAgVENSRVRVUk5kaTY0CT0gMjQ4OSwNCisgICAgVENSRVRVUk5taQk9IDI0OTAsDQorICAgIFRDUkVUVVJObWk2NAk9IDI0OTEsDQorICAgIFRDUkVUVVJOcmkJPSAyNDkyLA0KKyAgICBUQ1JFVFVSTnJpNjQJPSAyNDkzLA0KKyAgICBURVNUMTZpMTYJPSAyNDk0LA0KKyAgICBURVNUMTZtaQk9IDI0OTUsDQorICAgIFRFU1QxNnJpCT0gMjQ5NiwNCisgICAgVEVTVDE2cm0JPSAyNDk3LA0KKyAgICBURVNUMTZycgk9IDI0OTgsDQorICAgIFRFU1QzMmkzMgk9IDI0OTksDQorICAgIFRFU1QzMm1pCT0gMjUwMCwNCisgICAgVEVTVDMycmkJPSAyNTAxLA0KKyAgICBURVNUMzJybQk9IDI1MDIsDQorICAgIFRFU1QzMnJyCT0gMjUwMywNCisgICAgVEVTVDY0aTMyCT0gMjUwNCwNCisgICAgVEVTVDY0bWkzMgk9IDI1MDUsDQorICAgIFRFU1Q2NHJpMzIJPSAyNTA2LA0KKyAgICBURVNUNjRybQk9IDI1MDcsDQorICAgIFRFU1Q2NHJyCT0gMjUwOCwNCisgICAgVEVTVDhpOAk9IDI1MDksDQorICAgIFRFU1Q4bWkJPSAyNTEwLA0KKyAgICBURVNUOHJpCT0gMjUxMSwNCisgICAgVEVTVDhybQk9IDI1MTIsDQorICAgIFRFU1Q4cnIJPSAyNTEzLA0KKyAgICBUTFNDYWxsXzMyCT0gMjUxNCwNCisgICAgVExTQ2FsbF82NAk9IDI1MTUsDQorICAgIFRMU19hZGRyMzIJPSAyNTE2LA0KKyAgICBUTFNfYWRkcjY0CT0gMjUxNywNCisgICAgVFJBUAk9IDI1MTgsDQorICAgIFRTVF9GCT0gMjUxOSwNCisgICAgVFNUX0ZwMzIJPSAyNTIwLA0KKyAgICBUU1RfRnA2NAk9IDI1MjEsDQorICAgIFRTVF9GcDgwCT0gMjUyMiwNCisgICAgVUNPTUlTRHJtCT0gMjUyMywNCisgICAgVUNPTUlTRHJyCT0gMjUyNCwNCisgICAgVUNPTUlTU3JtCT0gMjUyNSwNCisgICAgVUNPTUlTU3JyCT0gMjUyNiwNCisgICAgVUNPTV9GSVByCT0gMjUyNywNCisgICAgVUNPTV9GSXIJPSAyNTI4LA0KKyAgICBVQ09NX0ZQUHIJPSAyNTI5LA0KKyAgICBVQ09NX0ZQcgk9IDI1MzAsDQorICAgIFVDT01fRnBJcjMyCT0gMjUzMSwNCisgICAgVUNPTV9GcElyNjQJPSAyNTMyLA0KKyAgICBVQ09NX0ZwSXI4MAk9IDI1MzMsDQorICAgIFVDT01fRnByMzIJPSAyNTM0LA0KKyAgICBVQ09NX0ZwcjY0CT0gMjUzNSwNCisgICAgVUNPTV9GcHI4MAk9IDI1MzYsDQorICAgIFVDT01fRnIJPSAyNTM3LA0KKyAgICBVTlBDS0hQRHJtCT0gMjUzOCwNCisgICAgVU5QQ0tIUERycgk9IDI1MzksDQorICAgIFVOUENLSFBTcm0JPSAyNTQwLA0KKyAgICBVTlBDS0hQU3JyCT0gMjU0MSwNCisgICAgVU5QQ0tMUERybQk9IDI1NDIsDQorICAgIFVOUENLTFBEcnIJPSAyNTQzLA0KKyAgICBVTlBDS0xQU3JtCT0gMjU0NCwNCisgICAgVU5QQ0tMUFNycgk9IDI1NDUsDQorICAgIFZBRERQRFlybQk9IDI1NDYsDQorICAgIFZBRERQRFlycgk9IDI1NDcsDQorICAgIFZBRERQRHJtCT0gMjU0OCwNCisgICAgVkFERFBEcnIJPSAyNTQ5LA0KKyAgICBWQUREUFNZcm0JPSAyNTUwLA0KKyAgICBWQUREUFNZcnIJPSAyNTUxLA0KKyAgICBWQUREUFNybQk9IDI1NTIsDQorICAgIFZBRERQU3JyCT0gMjU1MywNCisgICAgVkFERFNEcm0JPSAyNTU0LA0KKyAgICBWQUREU0RybV9JbnQJPSAyNTU1LA0KKyAgICBWQUREU0Rycgk9IDI1NTYsDQorICAgIFZBRERTRHJyX0ludAk9IDI1NTcsDQorICAgIFZBRERTU3JtCT0gMjU1OCwNCisgICAgVkFERFNTcm1fSW50CT0gMjU1OSwNCisgICAgVkFERFNTcnIJPSAyNTYwLA0KKyAgICBWQUREU1Nycl9JbnQJPSAyNTYxLA0KKyAgICBWQUREU1VCUERZcm0JPSAyNTYyLA0KKyAgICBWQUREU1VCUERZcnIJPSAyNTYzLA0KKyAgICBWQUREU1VCUERybQk9IDI1NjQsDQorICAgIFZBRERTVUJQRHJyCT0gMjU2NSwNCisgICAgVkFERFNVQlBTWXJtCT0gMjU2NiwNCisgICAgVkFERFNVQlBTWXJyCT0gMjU2NywNCisgICAgVkFERFNVQlBTcm0JPSAyNTY4LA0KKyAgICBWQUREU1VCUFNycgk9IDI1NjksDQorICAgIFZBRVNERUNMQVNUcm0JPSAyNTcwLA0KKyAgICBWQUVTREVDTEFTVHJyCT0gMjU3MSwNCisgICAgVkFFU0RFQ3JtCT0gMjU3MiwNCisgICAgVkFFU0RFQ3JyCT0gMjU3MywNCisgICAgVkFFU0VOQ0xBU1RybQk9IDI1NzQsDQorICAgIFZBRVNFTkNMQVNUcnIJPSAyNTc1LA0KKyAgICBWQUVTRU5Dcm0JPSAyNTc2LA0KKyAgICBWQUVTRU5DcnIJPSAyNTc3LA0KKyAgICBWQUVTSU1Dcm0JPSAyNTc4LA0KKyAgICBWQUVTSU1DcnIJPSAyNTc5LA0KKyAgICBWQUVTS0VZR0VOQVNTSVNUMTI4cm0JPSAyNTgwLA0KKyAgICBWQUVTS0VZR0VOQVNTSVNUMTI4cnIJPSAyNTgxLA0KKyAgICBWQU5ETlBEWXJtCT0gMjU4MiwNCisgICAgVkFORE5QRFlycgk9IDI1ODMsDQorICAgIFZBTkROUERybQk9IDI1ODQsDQorICAgIFZBTkROUERycgk9IDI1ODUsDQorICAgIFZBTkROUFNZcm0JPSAyNTg2LA0KKyAgICBWQU5ETlBTWXJyCT0gMjU4NywNCisgICAgVkFORE5QU3JtCT0gMjU4OCwNCisgICAgVkFORE5QU3JyCT0gMjU4OSwNCisgICAgVkFORFBEWXJtCT0gMjU5MCwNCisgICAgVkFORFBEWXJyCT0gMjU5MSwNCisgICAgVkFORFBEcm0JPSAyNTkyLA0KKyAgICBWQU5EUERycgk9IDI1OTMsDQorICAgIFZBTkRQU1lybQk9IDI1OTQsDQorICAgIFZBTkRQU1lycgk9IDI1OTUsDQorICAgIFZBTkRQU3JtCT0gMjU5NiwNCisgICAgVkFORFBTcnIJPSAyNTk3LA0KKyAgICBWQVNUQVJUX1NBVkVfWE1NX1JFR1MJPSAyNTk4LA0KKyAgICBWQkxFTkRQRFlybWkJPSAyNTk5LA0KKyAgICBWQkxFTkRQRFlycmkJPSAyNjAwLA0KKyAgICBWQkxFTkRQRHJtaQk9IDI2MDEsDQorICAgIFZCTEVORFBEcnJpCT0gMjYwMiwNCisgICAgVkJMRU5EUFNZcm1pCT0gMjYwMywNCisgICAgVkJMRU5EUFNZcnJpCT0gMjYwNCwNCisgICAgVkJMRU5EUFNybWkJPSAyNjA1LA0KKyAgICBWQkxFTkRQU3JyaQk9IDI2MDYsDQorICAgIFZCTEVORFZQRFlybQk9IDI2MDcsDQorICAgIFZCTEVORFZQRFlycgk9IDI2MDgsDQorICAgIFZCTEVORFZQRHJtCT0gMjYwOSwNCisgICAgVkJMRU5EVlBEcnIJPSAyNjEwLA0KKyAgICBWQkxFTkRWUFNZcm0JPSAyNjExLA0KKyAgICBWQkxFTkRWUFNZcnIJPSAyNjEyLA0KKyAgICBWQkxFTkRWUFNybQk9IDI2MTMsDQorICAgIFZCTEVORFZQU3JyCT0gMjYxNCwNCisgICAgVkJST0FEQ0FTVEYxMjgJPSAyNjE1LA0KKyAgICBWQlJPQURDQVNUU0QJPSAyNjE2LA0KKyAgICBWQlJPQURDQVNUU1MJPSAyNjE3LA0KKyAgICBWQlJPQURDQVNUU1NZCT0gMjYxOCwNCisgICAgVkNNUFBEWXJtaQk9IDI2MTksDQorICAgIFZDTVBQRFlybWlfYWx0CT0gMjYyMCwNCisgICAgVkNNUFBEWXJyaQk9IDI2MjEsDQorICAgIFZDTVBQRFlycmlfYWx0CT0gMjYyMiwNCisgICAgVkNNUFBEcm1pCT0gMjYyMywNCisgICAgVkNNUFBEcm1pX2FsdAk9IDI2MjQsDQorICAgIFZDTVBQRHJyaQk9IDI2MjUsDQorICAgIFZDTVBQRHJyaV9hbHQJPSAyNjI2LA0KKyAgICBWQ01QUFNZcm1pCT0gMjYyNywNCisgICAgVkNNUFBTWXJtaV9hbHQJPSAyNjI4LA0KKyAgICBWQ01QUFNZcnJpCT0gMjYyOSwNCisgICAgVkNNUFBTWXJyaV9hbHQJPSAyNjMwLA0KKyAgICBWQ01QUFNybWkJPSAyNjMxLA0KKyAgICBWQ01QUFNybWlfYWx0CT0gMjYzMiwNCisgICAgVkNNUFBTcnJpCT0gMjYzMywNCisgICAgVkNNUFBTcnJpX2FsdAk9IDI2MzQsDQorICAgIFZDTVBTRHJtCT0gMjYzNSwNCisgICAgVkNNUFNEcm1fYWx0CT0gMjYzNiwNCisgICAgVkNNUFNEcnIJPSAyNjM3LA0KKyAgICBWQ01QU0Rycl9hbHQJPSAyNjM4LA0KKyAgICBWQ01QU1NybQk9IDI2MzksDQorICAgIFZDTVBTU3JtX2FsdAk9IDI2NDAsDQorICAgIFZDTVBTU3JyCT0gMjY0MSwNCisgICAgVkNNUFNTcnJfYWx0CT0gMjY0MiwNCisgICAgVkNPTUlTRHJtCT0gMjY0MywNCisgICAgVkNPTUlTRHJyCT0gMjY0NCwNCisgICAgVkNPTUlTU3JtCT0gMjY0NSwNCisgICAgVkNPTUlTU3JyCT0gMjY0NiwNCisgICAgVkNWVERRMlBEWXJtCT0gMjY0NywNCisgICAgVkNWVERRMlBEWXJyCT0gMjY0OCwNCisgICAgVkNWVERRMlBEcm0JPSAyNjQ5LA0KKyAgICBWQ1ZURFEyUERycgk9IDI2NTAsDQorICAgIFZDVlREUTJQU1lybQk9IDI2NTEsDQorICAgIFZDVlREUTJQU1lycgk9IDI2NTIsDQorICAgIFZDVlREUTJQU3JtCT0gMjY1MywNCisgICAgVkNWVERRMlBTcnIJPSAyNjU0LA0KKyAgICBWQ1ZUUEQyRFFYcllyCT0gMjY1NSwNCisgICAgVkNWVFBEMkRRWHJtCT0gMjY1NiwNCisgICAgVkNWVFBEMkRRWHJyCT0gMjY1NywNCisgICAgVkNWVFBEMkRRWXJtCT0gMjY1OCwNCisgICAgVkNWVFBEMkRRWXJyCT0gMjY1OSwNCisgICAgVkNWVFBEMkRRcnIJPSAyNjYwLA0KKyAgICBWQ1ZUUEQyUFNYcllyCT0gMjY2MSwNCisgICAgVkNWVFBEMlBTWHJtCT0gMjY2MiwNCisgICAgVkNWVFBEMlBTWHJyCT0gMjY2MywNCisgICAgVkNWVFBEMlBTWXJtCT0gMjY2NCwNCisgICAgVkNWVFBEMlBTWXJyCT0gMjY2NSwNCisgICAgVkNWVFBEMlBTcnIJPSAyNjY2LA0KKyAgICBWQ1ZUUFMyRFFZcm0JPSAyNjY3LA0KKyAgICBWQ1ZUUFMyRFFZcnIJPSAyNjY4LA0KKyAgICBWQ1ZUUFMyRFFybQk9IDI2NjksDQorICAgIFZDVlRQUzJEUXJyCT0gMjY3MCwNCisgICAgVkNWVFBTMlBEWXJtCT0gMjY3MSwNCisgICAgVkNWVFBTMlBEWXJyCT0gMjY3MiwNCisgICAgVkNWVFBTMlBEcm0JPSAyNjczLA0KKyAgICBWQ1ZUUFMyUERycgk9IDI2NzQsDQorICAgIFZDVlRTRDJTSTY0cm0JPSAyNjc1LA0KKyAgICBWQ1ZUU0QyU0k2NHJyCT0gMjY3NiwNCisgICAgVkNWVFNEMlNJX2FsdHJtCT0gMjY3NywNCisgICAgVkNWVFNEMlNJX2FsdHJyCT0gMjY3OCwNCisgICAgVkNWVFNEMlNTcm0JPSAyNjc5LA0KKyAgICBWQ1ZUU0QyU1Nycgk9IDI2ODAsDQorICAgIFZDVlRTSTJTRDY0cm0JPSAyNjgxLA0KKyAgICBWQ1ZUU0kyU0Q2NHJyCT0gMjY4MiwNCisgICAgVkNWVFNJMlNETHJtCT0gMjY4MywNCisgICAgVkNWVFNJMlNETHJyCT0gMjY4NCwNCisgICAgVkNWVFNJMlNEcm0JPSAyNjg1LA0KKyAgICBWQ1ZUU0kyU0Rycgk9IDI2ODYsDQorICAgIFZDVlRTSTJTUzY0cm0JPSAyNjg3LA0KKyAgICBWQ1ZUU0kyU1M2NHJyCT0gMjY4OCwNCisgICAgVkNWVFNJMlNTcm0JPSAyNjg5LA0KKyAgICBWQ1ZUU0kyU1Nycgk9IDI2OTAsDQorICAgIFZDVlRTUzJTRHJtCT0gMjY5MSwNCisgICAgVkNWVFNTMlNEcnIJPSAyNjkyLA0KKyAgICBWQ1ZUU1MyU0k2NHJtCT0gMjY5MywNCisgICAgVkNWVFNTMlNJNjRycgk9IDI2OTQsDQorICAgIFZDVlRTUzJTSXJtCT0gMjY5NSwNCisgICAgVkNWVFNTMlNJcnIJPSAyNjk2LA0KKyAgICBWQ1ZUVFBEMkRRWHJZcgk9IDI2OTcsDQorICAgIFZDVlRUUEQyRFFYcm0JPSAyNjk4LA0KKyAgICBWQ1ZUVFBEMkRRWHJyCT0gMjY5OSwNCisgICAgVkNWVFRQRDJEUVlybQk9IDI3MDAsDQorICAgIFZDVlRUUEQyRFFZcnIJPSAyNzAxLA0KKyAgICBWQ1ZUVFBEMkRRcnIJPSAyNzAyLA0KKyAgICBWQ1ZUVFBTMkRRWXJtCT0gMjcwMywNCisgICAgVkNWVFRQUzJEUVlycgk9IDI3MDQsDQorICAgIFZDVlRUUFMyRFFybQk9IDI3MDUsDQorICAgIFZDVlRUUFMyRFFycgk9IDI3MDYsDQorICAgIFZDVlRUU0QyU0k2NHJtCT0gMjcwNywNCisgICAgVkNWVFRTRDJTSTY0cnIJPSAyNzA4LA0KKyAgICBWQ1ZUVFNEMlNJcm0JPSAyNzA5LA0KKyAgICBWQ1ZUVFNEMlNJcnIJPSAyNzEwLA0KKyAgICBWQ1ZUVFNTMlNJNjRybQk9IDI3MTEsDQorICAgIFZDVlRUU1MyU0k2NHJyCT0gMjcxMiwNCisgICAgVkNWVFRTUzJTSXJtCT0gMjcxMywNCisgICAgVkNWVFRTUzJTSXJyCT0gMjcxNCwNCisgICAgVkRJVlBEWXJtCT0gMjcxNSwNCisgICAgVkRJVlBEWXJyCT0gMjcxNiwNCisgICAgVkRJVlBEcm0JPSAyNzE3LA0KKyAgICBWRElWUERycgk9IDI3MTgsDQorICAgIFZESVZQU1lybQk9IDI3MTksDQorICAgIFZESVZQU1lycgk9IDI3MjAsDQorICAgIFZESVZQU3JtCT0gMjcyMSwNCisgICAgVkRJVlBTcnIJPSAyNzIyLA0KKyAgICBWRElWU0RybQk9IDI3MjMsDQorICAgIFZESVZTRHJtX0ludAk9IDI3MjQsDQorICAgIFZESVZTRHJyCT0gMjcyNSwNCisgICAgVkRJVlNEcnJfSW50CT0gMjcyNiwNCisgICAgVkRJVlNTcm0JPSAyNzI3LA0KKyAgICBWRElWU1NybV9JbnQJPSAyNzI4LA0KKyAgICBWRElWU1Nycgk9IDI3MjksDQorICAgIFZESVZTU3JyX0ludAk9IDI3MzAsDQorICAgIFZEUFBEcm1pCT0gMjczMSwNCisgICAgVkRQUERycmkJPSAyNzMyLA0KKyAgICBWRFBQU1lybWkJPSAyNzMzLA0KKyAgICBWRFBQU1lycmkJPSAyNzM0LA0KKyAgICBWRFBQU3JtaQk9IDI3MzUsDQorICAgIFZEUFBTcnJpCT0gMjczNiwNCisgICAgVkVSUm0JPSAyNzM3LA0KKyAgICBWRVJScgk9IDI3MzgsDQorICAgIFZFUldtCT0gMjczOSwNCisgICAgVkVSV3IJPSAyNzQwLA0KKyAgICBWRVhUUkFDVEYxMjhtcgk9IDI3NDEsDQorICAgIFZFWFRSQUNURjEyOHJyCT0gMjc0MiwNCisgICAgVkVYVFJBQ1RQU21yCT0gMjc0MywNCisgICAgVkVYVFJBQ1RQU3JyCT0gMjc0NCwNCisgICAgVkVYVFJBQ1RQU3JyNjQJPSAyNzQ1LA0KKyAgICBWRk1BRERQRHIxMzJtCT0gMjc0NiwNCisgICAgVkZNQUREUERyMTMybVkJPSAyNzQ3LA0KKyAgICBWRk1BRERQRHIxMzJyCT0gMjc0OCwNCisgICAgVkZNQUREUERyMTMyclkJPSAyNzQ5LA0KKyAgICBWRk1BRERQRHIyMTNtCT0gMjc1MCwNCisgICAgVkZNQUREUERyMjEzbVkJPSAyNzUxLA0KKyAgICBWRk1BRERQRHIyMTNyCT0gMjc1MiwNCisgICAgVkZNQUREUERyMjEzclkJPSAyNzUzLA0KKyAgICBWRk1BRERQRHIyMzFtCT0gMjc1NCwNCisgICAgVkZNQUREUERyMjMxbVkJPSAyNzU1LA0KKyAgICBWRk1BRERQRHIyMzFyCT0gMjc1NiwNCisgICAgVkZNQUREUERyMjMxclkJPSAyNzU3LA0KKyAgICBWRk1BRERQU3IxMzJtCT0gMjc1OCwNCisgICAgVkZNQUREUFNyMTMybVkJPSAyNzU5LA0KKyAgICBWRk1BRERQU3IxMzJyCT0gMjc2MCwNCisgICAgVkZNQUREUFNyMTMyclkJPSAyNzYxLA0KKyAgICBWRk1BRERQU3IyMTNtCT0gMjc2MiwNCisgICAgVkZNQUREUFNyMjEzbVkJPSAyNzYzLA0KKyAgICBWRk1BRERQU3IyMTNyCT0gMjc2NCwNCisgICAgVkZNQUREUFNyMjEzclkJPSAyNzY1LA0KKyAgICBWRk1BRERQU3IyMzFtCT0gMjc2NiwNCisgICAgVkZNQUREUFNyMjMxbVkJPSAyNzY3LA0KKyAgICBWRk1BRERQU3IyMzFyCT0gMjc2OCwNCisgICAgVkZNQUREUFNyMjMxclkJPSAyNzY5LA0KKyAgICBWRk1BRERTVUJQRHIxMzJtCT0gMjc3MCwNCisgICAgVkZNQUREU1VCUERyMTMybVkJPSAyNzcxLA0KKyAgICBWRk1BRERTVUJQRHIxMzJyCT0gMjc3MiwNCisgICAgVkZNQUREU1VCUERyMTMyclkJPSAyNzczLA0KKyAgICBWRk1BRERTVUJQRHIyMTNtCT0gMjc3NCwNCisgICAgVkZNQUREU1VCUERyMjEzbVkJPSAyNzc1LA0KKyAgICBWRk1BRERTVUJQRHIyMTNyCT0gMjc3NiwNCisgICAgVkZNQUREU1VCUERyMjEzclkJPSAyNzc3LA0KKyAgICBWRk1BRERTVUJQRHIyMzFtCT0gMjc3OCwNCisgICAgVkZNQUREU1VCUERyMjMxbVkJPSAyNzc5LA0KKyAgICBWRk1BRERTVUJQRHIyMzFyCT0gMjc4MCwNCisgICAgVkZNQUREU1VCUERyMjMxclkJPSAyNzgxLA0KKyAgICBWRk1BRERTVUJQU3IxMzJtCT0gMjc4MiwNCisgICAgVkZNQUREU1VCUFNyMTMybVkJPSAyNzgzLA0KKyAgICBWRk1BRERTVUJQU3IxMzJyCT0gMjc4NCwNCisgICAgVkZNQUREU1VCUFNyMTMyclkJPSAyNzg1LA0KKyAgICBWRk1BRERTVUJQU3IyMTNtCT0gMjc4NiwNCisgICAgVkZNQUREU1VCUFNyMjEzbVkJPSAyNzg3LA0KKyAgICBWRk1BRERTVUJQU3IyMTNyCT0gMjc4OCwNCisgICAgVkZNQUREU1VCUFNyMjEzclkJPSAyNzg5LA0KKyAgICBWRk1BRERTVUJQU3IyMzFtCT0gMjc5MCwNCisgICAgVkZNQUREU1VCUFNyMjMxbVkJPSAyNzkxLA0KKyAgICBWRk1BRERTVUJQU3IyMzFyCT0gMjc5MiwNCisgICAgVkZNQUREU1VCUFNyMjMxclkJPSAyNzkzLA0KKyAgICBWRk1TVUJBRERQRHIxMzJtCT0gMjc5NCwNCisgICAgVkZNU1VCQUREUERyMTMybVkJPSAyNzk1LA0KKyAgICBWRk1TVUJBRERQRHIxMzJyCT0gMjc5NiwNCisgICAgVkZNU1VCQUREUERyMTMyclkJPSAyNzk3LA0KKyAgICBWRk1TVUJBRERQRHIyMTNtCT0gMjc5OCwNCisgICAgVkZNU1VCQUREUERyMjEzbVkJPSAyNzk5LA0KKyAgICBWRk1TVUJBRERQRHIyMTNyCT0gMjgwMCwNCisgICAgVkZNU1VCQUREUERyMjEzclkJPSAyODAxLA0KKyAgICBWRk1TVUJBRERQRHIyMzFtCT0gMjgwMiwNCisgICAgVkZNU1VCQUREUERyMjMxbVkJPSAyODAzLA0KKyAgICBWRk1TVUJBRERQRHIyMzFyCT0gMjgwNCwNCisgICAgVkZNU1VCQUREUERyMjMxclkJPSAyODA1LA0KKyAgICBWRk1TVUJBRERQU3IxMzJtCT0gMjgwNiwNCisgICAgVkZNU1VCQUREUFNyMTMybVkJPSAyODA3LA0KKyAgICBWRk1TVUJBRERQU3IxMzJyCT0gMjgwOCwNCisgICAgVkZNU1VCQUREUFNyMTMyclkJPSAyODA5LA0KKyAgICBWRk1TVUJBRERQU3IyMTNtCT0gMjgxMCwNCisgICAgVkZNU1VCQUREUFNyMjEzbVkJPSAyODExLA0KKyAgICBWRk1TVUJBRERQU3IyMTNyCT0gMjgxMiwNCisgICAgVkZNU1VCQUREUFNyMjEzclkJPSAyODEzLA0KKyAgICBWRk1TVUJBRERQU3IyMzFtCT0gMjgxNCwNCisgICAgVkZNU1VCQUREUFNyMjMxbVkJPSAyODE1LA0KKyAgICBWRk1TVUJBRERQU3IyMzFyCT0gMjgxNiwNCisgICAgVkZNU1VCQUREUFNyMjMxclkJPSAyODE3LA0KKyAgICBWRk1TVUJQRHIxMzJtCT0gMjgxOCwNCisgICAgVkZNU1VCUERyMTMybVkJPSAyODE5LA0KKyAgICBWRk1TVUJQRHIxMzJyCT0gMjgyMCwNCisgICAgVkZNU1VCUERyMTMyclkJPSAyODIxLA0KKyAgICBWRk1TVUJQRHIyMTNtCT0gMjgyMiwNCisgICAgVkZNU1VCUERyMjEzbVkJPSAyODIzLA0KKyAgICBWRk1TVUJQRHIyMTNyCT0gMjgyNCwNCisgICAgVkZNU1VCUERyMjEzclkJPSAyODI1LA0KKyAgICBWRk1TVUJQRHIyMzFtCT0gMjgyNiwNCisgICAgVkZNU1VCUERyMjMxbVkJPSAyODI3LA0KKyAgICBWRk1TVUJQRHIyMzFyCT0gMjgyOCwNCisgICAgVkZNU1VCUERyMjMxclkJPSAyODI5LA0KKyAgICBWRk1TVUJQU3IxMzJtCT0gMjgzMCwNCisgICAgVkZNU1VCUFNyMTMybVkJPSAyODMxLA0KKyAgICBWRk1TVUJQU3IxMzJyCT0gMjgzMiwNCisgICAgVkZNU1VCUFNyMTMyclkJPSAyODMzLA0KKyAgICBWRk1TVUJQU3IyMTNtCT0gMjgzNCwNCisgICAgVkZNU1VCUFNyMjEzbVkJPSAyODM1LA0KKyAgICBWRk1TVUJQU3IyMTNyCT0gMjgzNiwNCisgICAgVkZNU1VCUFNyMjEzclkJPSAyODM3LA0KKyAgICBWRk1TVUJQU3IyMzFtCT0gMjgzOCwNCisgICAgVkZNU1VCUFNyMjMxbVkJPSAyODM5LA0KKyAgICBWRk1TVUJQU3IyMzFyCT0gMjg0MCwNCisgICAgVkZNU1VCUFNyMjMxclkJPSAyODQxLA0KKyAgICBWRk5NQUREUERyMTMybQk9IDI4NDIsDQorICAgIFZGTk1BRERQRHIxMzJtWQk9IDI4NDMsDQorICAgIFZGTk1BRERQRHIxMzJyCT0gMjg0NCwNCisgICAgVkZOTUFERFBEcjEzMnJZCT0gMjg0NSwNCisgICAgVkZOTUFERFBEcjIxM20JPSAyODQ2LA0KKyAgICBWRk5NQUREUERyMjEzbVkJPSAyODQ3LA0KKyAgICBWRk5NQUREUERyMjEzcgk9IDI4NDgsDQorICAgIFZGTk1BRERQRHIyMTNyWQk9IDI4NDksDQorICAgIFZGTk1BRERQRHIyMzFtCT0gMjg1MCwNCisgICAgVkZOTUFERFBEcjIzMW1ZCT0gMjg1MSwNCisgICAgVkZOTUFERFBEcjIzMXIJPSAyODUyLA0KKyAgICBWRk5NQUREUERyMjMxclkJPSAyODUzLA0KKyAgICBWRk5NQUREUFNyMTMybQk9IDI4NTQsDQorICAgIFZGTk1BRERQU3IxMzJtWQk9IDI4NTUsDQorICAgIFZGTk1BRERQU3IxMzJyCT0gMjg1NiwNCisgICAgVkZOTUFERFBTcjEzMnJZCT0gMjg1NywNCisgICAgVkZOTUFERFBTcjIxM20JPSAyODU4LA0KKyAgICBWRk5NQUREUFNyMjEzbVkJPSAyODU5LA0KKyAgICBWRk5NQUREUFNyMjEzcgk9IDI4NjAsDQorICAgIFZGTk1BRERQU3IyMTNyWQk9IDI4NjEsDQorICAgIFZGTk1BRERQU3IyMzFtCT0gMjg2MiwNCisgICAgVkZOTUFERFBTcjIzMW1ZCT0gMjg2MywNCisgICAgVkZOTUFERFBTcjIzMXIJPSAyODY0LA0KKyAgICBWRk5NQUREUFNyMjMxclkJPSAyODY1LA0KKyAgICBWRk5NU1VCUERyMTMybQk9IDI4NjYsDQorICAgIFZGTk1TVUJQRHIxMzJtWQk9IDI4NjcsDQorICAgIFZGTk1TVUJQRHIxMzJyCT0gMjg2OCwNCisgICAgVkZOTVNVQlBEcjEzMnJZCT0gMjg2OSwNCisgICAgVkZOTVNVQlBEcjIxM20JPSAyODcwLA0KKyAgICBWRk5NU1VCUERyMjEzbVkJPSAyODcxLA0KKyAgICBWRk5NU1VCUERyMjEzcgk9IDI4NzIsDQorICAgIFZGTk1TVUJQRHIyMTNyWQk9IDI4NzMsDQorICAgIFZGTk1TVUJQRHIyMzFtCT0gMjg3NCwNCisgICAgVkZOTVNVQlBEcjIzMW1ZCT0gMjg3NSwNCisgICAgVkZOTVNVQlBEcjIzMXIJPSAyODc2LA0KKyAgICBWRk5NU1VCUERyMjMxclkJPSAyODc3LA0KKyAgICBWRk5NU1VCUFNyMTMybQk9IDI4NzgsDQorICAgIFZGTk1TVUJQU3IxMzJtWQk9IDI4NzksDQorICAgIFZGTk1TVUJQU3IxMzJyCT0gMjg4MCwNCisgICAgVkZOTVNVQlBTcjEzMnJZCT0gMjg4MSwNCisgICAgVkZOTVNVQlBTcjIxM20JPSAyODgyLA0KKyAgICBWRk5NU1VCUFNyMjEzbVkJPSAyODgzLA0KKyAgICBWRk5NU1VCUFNyMjEzcgk9IDI4ODQsDQorICAgIFZGTk1TVUJQU3IyMTNyWQk9IDI4ODUsDQorICAgIFZGTk1TVUJQU3IyMzFtCT0gMjg4NiwNCisgICAgVkZOTVNVQlBTcjIzMW1ZCT0gMjg4NywNCisgICAgVkZOTVNVQlBTcjIzMXIJPSAyODg4LA0KKyAgICBWRk5NU1VCUFNyMjMxclkJPSAyODg5LA0KKyAgICBWRnNBTkROUERybQk9IDI4OTAsDQorICAgIFZGc0FORE5QRHJyCT0gMjg5MSwNCisgICAgVkZzQU5ETlBTcm0JPSAyODkyLA0KKyAgICBWRnNBTkROUFNycgk9IDI4OTMsDQorICAgIFZGc0FORFBEcm0JPSAyODk0LA0KKyAgICBWRnNBTkRQRHJyCT0gMjg5NSwNCisgICAgVkZzQU5EUFNybQk9IDI4OTYsDQorICAgIFZGc0FORFBTcnIJPSAyODk3LA0KKyAgICBWRnNPUlBEcm0JPSAyODk4LA0KKyAgICBWRnNPUlBEcnIJPSAyODk5LA0KKyAgICBWRnNPUlBTcm0JPSAyOTAwLA0KKyAgICBWRnNPUlBTcnIJPSAyOTAxLA0KKyAgICBWRnNYT1JQRHJtCT0gMjkwMiwNCisgICAgVkZzWE9SUERycgk9IDI5MDMsDQorICAgIFZGc1hPUlBTcm0JPSAyOTA0LA0KKyAgICBWRnNYT1JQU3JyCT0gMjkwNSwNCisgICAgVkhBRERQRFlybQk9IDI5MDYsDQorICAgIFZIQUREUERZcnIJPSAyOTA3LA0KKyAgICBWSEFERFBEcm0JPSAyOTA4LA0KKyAgICBWSEFERFBEcnIJPSAyOTA5LA0KKyAgICBWSEFERFBTWXJtCT0gMjkxMCwNCisgICAgVkhBRERQU1lycgk9IDI5MTEsDQorICAgIFZIQUREUFNybQk9IDI5MTIsDQorICAgIFZIQUREUFNycgk9IDI5MTMsDQorICAgIFZIU1VCUERZcm0JPSAyOTE0LA0KKyAgICBWSFNVQlBEWXJyCT0gMjkxNSwNCisgICAgVkhTVUJQRHJtCT0gMjkxNiwNCisgICAgVkhTVUJQRHJyCT0gMjkxNywNCisgICAgVkhTVUJQU1lybQk9IDI5MTgsDQorICAgIFZIU1VCUFNZcnIJPSAyOTE5LA0KKyAgICBWSFNVQlBTcm0JPSAyOTIwLA0KKyAgICBWSFNVQlBTcnIJPSAyOTIxLA0KKyAgICBWSU5TRVJURjEyOHJtCT0gMjkyMiwNCisgICAgVklOU0VSVEYxMjhycgk9IDI5MjMsDQorICAgIFZJTlNFUlRQU3JtCT0gMjkyNCwNCisgICAgVklOU0VSVFBTcnIJPSAyOTI1LA0KKyAgICBWTEREUVVZcm0JPSAyOTI2LA0KKyAgICBWTEREUVVybQk9IDI5MjcsDQorICAgIFZMRE1YQ1NSCT0gMjkyOCwNCisgICAgVk1BU0tNT1ZEUVUJPSAyOTI5LA0KKyAgICBWTUFTS01PVkRRVTY0CT0gMjkzMCwNCisgICAgVk1BU0tNT1ZQRFltcgk9IDI5MzEsDQorICAgIFZNQVNLTU9WUERZcm0JPSAyOTMyLA0KKyAgICBWTUFTS01PVlBEbXIJPSAyOTMzLA0KKyAgICBWTUFTS01PVlBEcm0JPSAyOTM0LA0KKyAgICBWTUFTS01PVlBTWW1yCT0gMjkzNSwNCisgICAgVk1BU0tNT1ZQU1lybQk9IDI5MzYsDQorICAgIFZNQVNLTU9WUFNtcgk9IDI5MzcsDQorICAgIFZNQVNLTU9WUFNybQk9IDI5MzgsDQorICAgIFZNQVhQRFlybQk9IDI5MzksDQorICAgIFZNQVhQRFlybV9JbnQJPSAyOTQwLA0KKyAgICBWTUFYUERZcnIJPSAyOTQxLA0KKyAgICBWTUFYUERZcnJfSW50CT0gMjk0MiwNCisgICAgVk1BWFBEcm0JPSAyOTQzLA0KKyAgICBWTUFYUERybV9JbnQJPSAyOTQ0LA0KKyAgICBWTUFYUERycgk9IDI5NDUsDQorICAgIFZNQVhQRHJyX0ludAk9IDI5NDYsDQorICAgIFZNQVhQU1lybQk9IDI5NDcsDQorICAgIFZNQVhQU1lybV9JbnQJPSAyOTQ4LA0KKyAgICBWTUFYUFNZcnIJPSAyOTQ5LA0KKyAgICBWTUFYUFNZcnJfSW50CT0gMjk1MCwNCisgICAgVk1BWFBTcm0JPSAyOTUxLA0KKyAgICBWTUFYUFNybV9JbnQJPSAyOTUyLA0KKyAgICBWTUFYUFNycgk9IDI5NTMsDQorICAgIFZNQVhQU3JyX0ludAk9IDI5NTQsDQorICAgIFZNQVhTRHJtCT0gMjk1NSwNCisgICAgVk1BWFNEcm1fSW50CT0gMjk1NiwNCisgICAgVk1BWFNEcnIJPSAyOTU3LA0KKyAgICBWTUFYU0Rycl9JbnQJPSAyOTU4LA0KKyAgICBWTUFYU1NybQk9IDI5NTksDQorICAgIFZNQVhTU3JtX0ludAk9IDI5NjAsDQorICAgIFZNQVhTU3JyCT0gMjk2MSwNCisgICAgVk1BWFNTcnJfSW50CT0gMjk2MiwNCisgICAgVk1DQUxMCT0gMjk2MywNCisgICAgVk1DTEVBUm0JPSAyOTY0LA0KKyAgICBWTUlOUERZcm0JPSAyOTY1LA0KKyAgICBWTUlOUERZcm1fSW50CT0gMjk2NiwNCisgICAgVk1JTlBEWXJyCT0gMjk2NywNCisgICAgVk1JTlBEWXJyX0ludAk9IDI5NjgsDQorICAgIFZNSU5QRHJtCT0gMjk2OSwNCisgICAgVk1JTlBEcm1fSW50CT0gMjk3MCwNCisgICAgVk1JTlBEcnIJPSAyOTcxLA0KKyAgICBWTUlOUERycl9JbnQJPSAyOTcyLA0KKyAgICBWTUlOUFNZcm0JPSAyOTczLA0KKyAgICBWTUlOUFNZcm1fSW50CT0gMjk3NCwNCisgICAgVk1JTlBTWXJyCT0gMjk3NSwNCisgICAgVk1JTlBTWXJyX0ludAk9IDI5NzYsDQorICAgIFZNSU5QU3JtCT0gMjk3NywNCisgICAgVk1JTlBTcm1fSW50CT0gMjk3OCwNCisgICAgVk1JTlBTcnIJPSAyOTc5LA0KKyAgICBWTUlOUFNycl9JbnQJPSAyOTgwLA0KKyAgICBWTUlOU0RybQk9IDI5ODEsDQorICAgIFZNSU5TRHJtX0ludAk9IDI5ODIsDQorICAgIFZNSU5TRHJyCT0gMjk4MywNCisgICAgVk1JTlNEcnJfSW50CT0gMjk4NCwNCisgICAgVk1JTlNTcm0JPSAyOTg1LA0KKyAgICBWTUlOU1NybV9JbnQJPSAyOTg2LA0KKyAgICBWTUlOU1Nycgk9IDI5ODcsDQorICAgIFZNSU5TU3JyX0ludAk9IDI5ODgsDQorICAgIFZNTEFVTkNICT0gMjk4OSwNCisgICAgVk1PVkFQRFltcgk9IDI5OTAsDQorICAgIFZNT1ZBUERZcm0JPSAyOTkxLA0KKyAgICBWTU9WQVBEWXJyCT0gMjk5MiwNCisgICAgVk1PVkFQRG1yCT0gMjk5MywNCisgICAgVk1PVkFQRHJtCT0gMjk5NCwNCisgICAgVk1PVkFQRHJyCT0gMjk5NSwNCisgICAgVk1PVkFQU1ltcgk9IDI5OTYsDQorICAgIFZNT1ZBUFNZcm0JPSAyOTk3LA0KKyAgICBWTU9WQVBTWXJyCT0gMjk5OCwNCisgICAgVk1PVkFQU21yCT0gMjk5OSwNCisgICAgVk1PVkFQU3JtCT0gMzAwMCwNCisgICAgVk1PVkFQU3JyCT0gMzAwMSwNCisgICAgVk1PVkREVVBZcm0JPSAzMDAyLA0KKyAgICBWTU9WRERVUFlycgk9IDMwMDMsDQorICAgIFZNT1ZERFVQcm0JPSAzMDA0LA0KKyAgICBWTU9WRERVUHJyCT0gMzAwNSwNCisgICAgVk1PVkRJMlBESXJtCT0gMzAwNiwNCisgICAgVk1PVkRJMlBESXJyCT0gMzAwNywNCisgICAgVk1PVkRJMlNTcm0JPSAzMDA4LA0KKyAgICBWTU9WREkyU1Nycgk9IDMwMDksDQorICAgIFZNT1ZEUUFZbXIJPSAzMDEwLA0KKyAgICBWTU9WRFFBWXJtCT0gMzAxMSwNCisgICAgVk1PVkRRQVlycgk9IDMwMTIsDQorICAgIFZNT1ZEUUFtcgk9IDMwMTMsDQorICAgIFZNT1ZEUUFybQk9IDMwMTQsDQorICAgIFZNT1ZEUUFycgk9IDMwMTUsDQorICAgIFZNT1ZEUVVZbXIJPSAzMDE2LA0KKyAgICBWTU9WRFFVWXJtCT0gMzAxNywNCisgICAgVk1PVkRRVVlycgk9IDMwMTgsDQorICAgIFZNT1ZEUVVtcgk9IDMwMTksDQorICAgIFZNT1ZEUVVtcl9JbnQJPSAzMDIwLA0KKyAgICBWTU9WRFFVcm0JPSAzMDIxLA0KKyAgICBWTU9WRFFVcm1fSW50CT0gMzAyMiwNCisgICAgVk1PVkRRVXJyCT0gMzAyMywNCisgICAgVk1PVkhMUFNycgk9IDMwMjQsDQorICAgIFZNT1ZIUERtcgk9IDMwMjUsDQorICAgIFZNT1ZIUERybQk9IDMwMjYsDQorICAgIFZNT1ZIUFNtcgk9IDMwMjcsDQorICAgIFZNT1ZIUFNybQk9IDMwMjgsDQorICAgIFZNT1ZMSFBTcnIJPSAzMDI5LA0KKyAgICBWTU9WTFBEbXIJPSAzMDMwLA0KKyAgICBWTU9WTFBEcm0JPSAzMDMxLA0KKyAgICBWTU9WTFBTbXIJPSAzMDMyLA0KKyAgICBWTU9WTFBTcm0JPSAzMDMzLA0KKyAgICBWTU9WTFExMjhtcgk9IDMwMzQsDQorICAgIFZNT1ZNU0tQRFlyNjRyCT0gMzAzNSwNCisgICAgVk1PVk1TS1BEWXJyCT0gMzAzNiwNCisgICAgVk1PVk1TS1BEcjY0cgk9IDMwMzcsDQorICAgIFZNT1ZNU0tQRHJyCT0gMzAzOCwNCisgICAgVk1PVk1TS1BTWXI2NHIJPSAzMDM5LA0KKyAgICBWTU9WTVNLUFNZcnIJPSAzMDQwLA0KKyAgICBWTU9WTVNLUFNyNjRyCT0gMzA0MSwNCisgICAgVk1PVk1TS1BTcnIJPSAzMDQyLA0KKyAgICBWTU9WTlREUUFybQk9IDMwNDMsDQorICAgIFZNT1ZOVERRWV82NG1yCT0gMzA0NCwNCisgICAgVk1PVk5URFFZbXIJPSAzMDQ1LA0KKyAgICBWTU9WTlREUV82NG1yCT0gMzA0NiwNCisgICAgVk1PVk5URFFtcgk9IDMwNDcsDQorICAgIFZNT1ZOVERRbXJfSW50CT0gMzA0OCwNCisgICAgVk1PVk5UUERZbXIJPSAzMDQ5LA0KKyAgICBWTU9WTlRQRG1yCT0gMzA1MCwNCisgICAgVk1PVk5UUERtcl9JbnQJPSAzMDUxLA0KKyAgICBWTU9WTlRQU1ltcgk9IDMwNTIsDQorICAgIFZNT1ZOVFBTbXIJPSAzMDUzLA0KKyAgICBWTU9WTlRQU21yX0ludAk9IDMwNTQsDQorICAgIFZNT1ZQREkyREltcgk9IDMwNTUsDQorICAgIFZNT1ZQREkyRElycgk9IDMwNTYsDQorICAgIFZNT1ZQUUkyUUltcgk9IDMwNTcsDQorICAgIFZNT1ZRSTJQUUlybQk9IDMwNTgsDQorICAgIFZNT1ZRZDY0cnIJPSAzMDU5LA0KKyAgICBWTU9WUWQ2NHJyX2FsdAk9IDMwNjAsDQorICAgIFZNT1ZRczY0cnIJPSAzMDYxLA0KKyAgICBWTU9WUXhyeHIJPSAzMDYyLA0KKyAgICBWTU9WU0Rtcgk9IDMwNjMsDQorICAgIFZNT1ZTRHJtCT0gMzA2NCwNCisgICAgVk1PVlNEcnIJPSAzMDY1LA0KKyAgICBWTU9WU0hEVVBZcm0JPSAzMDY2LA0KKyAgICBWTU9WU0hEVVBZcnIJPSAzMDY3LA0KKyAgICBWTU9WU0hEVVBybQk9IDMwNjgsDQorICAgIFZNT1ZTSERVUHJyCT0gMzA2OSwNCisgICAgVk1PVlNMRFVQWXJtCT0gMzA3MCwNCisgICAgVk1PVlNMRFVQWXJyCT0gMzA3MSwNCisgICAgVk1PVlNMRFVQcm0JPSAzMDcyLA0KKyAgICBWTU9WU0xEVVBycgk9IDMwNzMsDQorICAgIFZNT1ZTUzJESW1yCT0gMzA3NCwNCisgICAgVk1PVlNTMkRJcnIJPSAzMDc1LA0KKyAgICBWTU9WU1Ntcgk9IDMwNzYsDQorICAgIFZNT1ZTU3JtCT0gMzA3NywNCisgICAgVk1PVlNTcnIJPSAzMDc4LA0KKyAgICBWTU9WVVBEWW1yCT0gMzA3OSwNCisgICAgVk1PVlVQRFlybQk9IDMwODAsDQorICAgIFZNT1ZVUERZcnIJPSAzMDgxLA0KKyAgICBWTU9WVVBEbXIJPSAzMDgyLA0KKyAgICBWTU9WVVBEbXJfSW50CT0gMzA4MywNCisgICAgVk1PVlVQRHJtCT0gMzA4NCwNCisgICAgVk1PVlVQRHJtX0ludAk9IDMwODUsDQorICAgIFZNT1ZVUERycgk9IDMwODYsDQorICAgIFZNT1ZVUFNZbXIJPSAzMDg3LA0KKyAgICBWTU9WVVBTWXJtCT0gMzA4OCwNCisgICAgVk1PVlVQU1lycgk9IDMwODksDQorICAgIFZNT1ZVUFNtcgk9IDMwOTAsDQorICAgIFZNT1ZVUFNtcl9JbnQJPSAzMDkxLA0KKyAgICBWTU9WVVBTcm0JPSAzMDkyLA0KKyAgICBWTU9WVVBTcm1fSW50CT0gMzA5MywNCisgICAgVk1PVlVQU3JyCT0gMzA5NCwNCisgICAgVk1PVlpESTJQRElybQk9IDMwOTUsDQorICAgIFZNT1ZaREkyUERJcnIJPSAzMDk2LA0KKyAgICBWTU9WWlBRSUxvMlBRSXJtCT0gMzA5NywNCisgICAgVk1PVlpQUUlMbzJQUUlycgk9IDMwOTgsDQorICAgIFZNT1ZaUUkyUFFJcm0JPSAzMDk5LA0KKyAgICBWTU9WWlFJMlBRSXJyCT0gMzEwMCwNCisgICAgVk1QU0FEQldybWkJPSAzMTAxLA0KKyAgICBWTVBTQURCV3JyaQk9IDMxMDIsDQorICAgIFZNUFRSTERtCT0gMzEwMywNCisgICAgVk1QVFJTVG0JPSAzMTA0LA0KKyAgICBWTVJFQUQzMnJtCT0gMzEwNSwNCisgICAgVk1SRUFEMzJycgk9IDMxMDYsDQorICAgIFZNUkVBRDY0cm0JPSAzMTA3LA0KKyAgICBWTVJFQUQ2NHJyCT0gMzEwOCwNCisgICAgVk1SRVNVTUUJPSAzMTA5LA0KKyAgICBWTVVMUERZcm0JPSAzMTEwLA0KKyAgICBWTVVMUERZcnIJPSAzMTExLA0KKyAgICBWTVVMUERybQk9IDMxMTIsDQorICAgIFZNVUxQRHJyCT0gMzExMywNCisgICAgVk1VTFBTWXJtCT0gMzExNCwNCisgICAgVk1VTFBTWXJyCT0gMzExNSwNCisgICAgVk1VTFBTcm0JPSAzMTE2LA0KKyAgICBWTVVMUFNycgk9IDMxMTcsDQorICAgIFZNVUxTRHJtCT0gMzExOCwNCisgICAgVk1VTFNEcm1fSW50CT0gMzExOSwNCisgICAgVk1VTFNEcnIJPSAzMTIwLA0KKyAgICBWTVVMU0Rycl9JbnQJPSAzMTIxLA0KKyAgICBWTVVMU1NybQk9IDMxMjIsDQorICAgIFZNVUxTU3JtX0ludAk9IDMxMjMsDQorICAgIFZNVUxTU3JyCT0gMzEyNCwNCisgICAgVk1VTFNTcnJfSW50CT0gMzEyNSwNCisgICAgVk1XUklURTMycm0JPSAzMTI2LA0KKyAgICBWTVdSSVRFMzJycgk9IDMxMjcsDQorICAgIFZNV1JJVEU2NHJtCT0gMzEyOCwNCisgICAgVk1XUklURTY0cnIJPSAzMTI5LA0KKyAgICBWTVhPRkYJPSAzMTMwLA0KKyAgICBWTVhPTgk9IDMxMzEsDQorICAgIFZPUlBEWXJtCT0gMzEzMiwNCisgICAgVk9SUERZcnIJPSAzMTMzLA0KKyAgICBWT1JQRHJtCT0gMzEzNCwNCisgICAgVk9SUERycgk9IDMxMzUsDQorICAgIFZPUlBTWXJtCT0gMzEzNiwNCisgICAgVk9SUFNZcnIJPSAzMTM3LA0KKyAgICBWT1JQU3JtCT0gMzEzOCwNCisgICAgVk9SUFNycgk9IDMxMzksDQorICAgIFZQQUJTQnJtMTI4CT0gMzE0MCwNCisgICAgVlBBQlNCcm02NAk9IDMxNDEsDQorICAgIFZQQUJTQnJyMTI4CT0gMzE0MiwNCisgICAgVlBBQlNCcnI2NAk9IDMxNDMsDQorICAgIFZQQUJTRHJtMTI4CT0gMzE0NCwNCisgICAgVlBBQlNEcm02NAk9IDMxNDUsDQorICAgIFZQQUJTRHJyMTI4CT0gMzE0NiwNCisgICAgVlBBQlNEcnI2NAk9IDMxNDcsDQorICAgIFZQQUJTV3JtMTI4CT0gMzE0OCwNCisgICAgVlBBQlNXcm02NAk9IDMxNDksDQorICAgIFZQQUJTV3JyMTI4CT0gMzE1MCwNCisgICAgVlBBQlNXcnI2NAk9IDMxNTEsDQorICAgIFZQQUNLU1NEV3JtCT0gMzE1MiwNCisgICAgVlBBQ0tTU0RXcnIJPSAzMTUzLA0KKyAgICBWUEFDS1NTV0JybQk9IDMxNTQsDQorICAgIFZQQUNLU1NXQnJyCT0gMzE1NSwNCisgICAgVlBBQ0tVU0RXcm0JPSAzMTU2LA0KKyAgICBWUEFDS1VTRFdycgk9IDMxNTcsDQorICAgIFZQQUNLVVNXQnJtCT0gMzE1OCwNCisgICAgVlBBQ0tVU1dCcnIJPSAzMTU5LA0KKyAgICBWUEFEREJybQk9IDMxNjAsDQorICAgIFZQQUREQnJyCT0gMzE2MSwNCisgICAgVlBBREREcm0JPSAzMTYyLA0KKyAgICBWUEFERERycgk9IDMxNjMsDQorICAgIFZQQUREUXJtCT0gMzE2NCwNCisgICAgVlBBRERRcnIJPSAzMTY1LA0KKyAgICBWUEFERFNCcm0JPSAzMTY2LA0KKyAgICBWUEFERFNCcnIJPSAzMTY3LA0KKyAgICBWUEFERFNXcm0JPSAzMTY4LA0KKyAgICBWUEFERFNXcnIJPSAzMTY5LA0KKyAgICBWUEFERFVTQnJtCT0gMzE3MCwNCisgICAgVlBBRERVU0Jycgk9IDMxNzEsDQorICAgIFZQQUREVVNXcm0JPSAzMTcyLA0KKyAgICBWUEFERFVTV3JyCT0gMzE3MywNCisgICAgVlBBRERXcm0JPSAzMTc0LA0KKyAgICBWUEFERFdycgk9IDMxNzUsDQorICAgIFZQQUxJR05SMTI4cm0JPSAzMTc2LA0KKyAgICBWUEFMSUdOUjEyOHJyCT0gMzE3NywNCisgICAgVlBBTElHTlI2NHJtCT0gMzE3OCwNCisgICAgVlBBTElHTlI2NHJyCT0gMzE3OSwNCisgICAgVlBBTkROcm0JPSAzMTgwLA0KKyAgICBWUEFORE5ycgk9IDMxODEsDQorICAgIFZQQU5Ecm0JPSAzMTgyLA0KKyAgICBWUEFORHJyCT0gMzE4MywNCisgICAgVlBBVkdCcm0JPSAzMTg0LA0KKyAgICBWUEFWR0Jycgk9IDMxODUsDQorICAgIFZQQVZHV3JtCT0gMzE4NiwNCisgICAgVlBBVkdXcnIJPSAzMTg3LA0KKyAgICBWUEJMRU5EVkJybQk9IDMxODgsDQorICAgIFZQQkxFTkRWQnJyCT0gMzE4OSwNCisgICAgVlBCTEVORFdybWkJPSAzMTkwLA0KKyAgICBWUEJMRU5EV3JyaQk9IDMxOTEsDQorICAgIFZQQ0xNVUxIUUhRRFFybQk9IDMxOTIsDQorICAgIFZQQ0xNVUxIUUhRRFFycgk9IDMxOTMsDQorICAgIFZQQ0xNVUxIUUxRRFFybQk9IDMxOTQsDQorICAgIFZQQ0xNVUxIUUxRRFFycgk9IDMxOTUsDQorICAgIFZQQ0xNVUxMUUhRRFFybQk9IDMxOTYsDQorICAgIFZQQ0xNVUxMUUhRRFFycgk9IDMxOTcsDQorICAgIFZQQ0xNVUxMUUxRRFFybQk9IDMxOTgsDQorICAgIFZQQ0xNVUxMUUxRRFFycgk9IDMxOTksDQorICAgIFZQQ0xNVUxRRFFybQk9IDMyMDAsDQorICAgIFZQQ0xNVUxRRFFycgk9IDMyMDEsDQorICAgIFZQQ01QRVFCcm0JPSAzMjAyLA0KKyAgICBWUENNUEVRQnJyCT0gMzIwMywNCisgICAgVlBDTVBFUURybQk9IDMyMDQsDQorICAgIFZQQ01QRVFEcnIJPSAzMjA1LA0KKyAgICBWUENNUEVRUXJtCT0gMzIwNiwNCisgICAgVlBDTVBFUVFycgk9IDMyMDcsDQorICAgIFZQQ01QRVFXcm0JPSAzMjA4LA0KKyAgICBWUENNUEVRV3JyCT0gMzIwOSwNCisgICAgVlBDTVBFU1RSSUFybQk9IDMyMTAsDQorICAgIFZQQ01QRVNUUklBcnIJPSAzMjExLA0KKyAgICBWUENNUEVTVFJJQ3JtCT0gMzIxMiwNCisgICAgVlBDTVBFU1RSSUNycgk9IDMyMTMsDQorICAgIFZQQ01QRVNUUklPcm0JPSAzMjE0LA0KKyAgICBWUENNUEVTVFJJT3JyCT0gMzIxNSwNCisgICAgVlBDTVBFU1RSSVNybQk9IDMyMTYsDQorICAgIFZQQ01QRVNUUklTcnIJPSAzMjE3LA0KKyAgICBWUENNUEVTVFJJWnJtCT0gMzIxOCwNCisgICAgVlBDTVBFU1RSSVpycgk9IDMyMTksDQorICAgIFZQQ01QRVNUUklybQk9IDMyMjAsDQorICAgIFZQQ01QRVNUUklycgk9IDMyMjEsDQorICAgIFZQQ01QRVNUUk0xMjhNRU0JPSAzMjIyLA0KKyAgICBWUENNUEVTVFJNMTI4UkVHCT0gMzIyMywNCisgICAgVlBDTVBFU1RSTTEyOHJtCT0gMzIyNCwNCisgICAgVlBDTVBFU1RSTTEyOHJyCT0gMzIyNSwNCisgICAgVlBDTVBHVEJybQk9IDMyMjYsDQorICAgIFZQQ01QR1RCcnIJPSAzMjI3LA0KKyAgICBWUENNUEdURHJtCT0gMzIyOCwNCisgICAgVlBDTVBHVERycgk9IDMyMjksDQorICAgIFZQQ01QR1RRcm0JPSAzMjMwLA0KKyAgICBWUENNUEdUUXJyCT0gMzIzMSwNCisgICAgVlBDTVBHVFdybQk9IDMyMzIsDQorICAgIFZQQ01QR1RXcnIJPSAzMjMzLA0KKyAgICBWUENNUElTVFJJQXJtCT0gMzIzNCwNCisgICAgVlBDTVBJU1RSSUFycgk9IDMyMzUsDQorICAgIFZQQ01QSVNUUklDcm0JPSAzMjM2LA0KKyAgICBWUENNUElTVFJJQ3JyCT0gMzIzNywNCisgICAgVlBDTVBJU1RSSU9ybQk9IDMyMzgsDQorICAgIFZQQ01QSVNUUklPcnIJPSAzMjM5LA0KKyAgICBWUENNUElTVFJJU3JtCT0gMzI0MCwNCisgICAgVlBDTVBJU1RSSVNycgk9IDMyNDEsDQorICAgIFZQQ01QSVNUUklacm0JPSAzMjQyLA0KKyAgICBWUENNUElTVFJJWnJyCT0gMzI0MywNCisgICAgVlBDTVBJU1RSSXJtCT0gMzI0NCwNCisgICAgVlBDTVBJU1RSSXJyCT0gMzI0NSwNCisgICAgVlBDTVBJU1RSTTEyOE1FTQk9IDMyNDYsDQorICAgIFZQQ01QSVNUUk0xMjhSRUcJPSAzMjQ3LA0KKyAgICBWUENNUElTVFJNMTI4cm0JPSAzMjQ4LA0KKyAgICBWUENNUElTVFJNMTI4cnIJPSAzMjQ5LA0KKyAgICBWUEVSTTJGMTI4cm0JPSAzMjUwLA0KKyAgICBWUEVSTTJGMTI4cnIJPSAzMjUxLA0KKyAgICBWUEVSTUlMUERZbWkJPSAzMjUyLA0KKyAgICBWUEVSTUlMUERZcmkJPSAzMjUzLA0KKyAgICBWUEVSTUlMUERZcm0JPSAzMjU0LA0KKyAgICBWUEVSTUlMUERZcnIJPSAzMjU1LA0KKyAgICBWUEVSTUlMUERtaQk9IDMyNTYsDQorICAgIFZQRVJNSUxQRHJpCT0gMzI1NywNCisgICAgVlBFUk1JTFBEcm0JPSAzMjU4LA0KKyAgICBWUEVSTUlMUERycgk9IDMyNTksDQorICAgIFZQRVJNSUxQU1ltaQk9IDMyNjAsDQorICAgIFZQRVJNSUxQU1lyaQk9IDMyNjEsDQorICAgIFZQRVJNSUxQU1lybQk9IDMyNjIsDQorICAgIFZQRVJNSUxQU1lycgk9IDMyNjMsDQorICAgIFZQRVJNSUxQU21pCT0gMzI2NCwNCisgICAgVlBFUk1JTFBTcmkJPSAzMjY1LA0KKyAgICBWUEVSTUlMUFNybQk9IDMyNjYsDQorICAgIFZQRVJNSUxQU3JyCT0gMzI2NywNCisgICAgVlBFWFRSQm1yCT0gMzI2OCwNCisgICAgVlBFWFRSQnJyCT0gMzI2OSwNCisgICAgVlBFWFRSQnJyNjQJPSAzMjcwLA0KKyAgICBWUEVYVFJEbXIJPSAzMjcxLA0KKyAgICBWUEVYVFJEcnIJPSAzMjcyLA0KKyAgICBWUEVYVFJRbXIJPSAzMjczLA0KKyAgICBWUEVYVFJRcnIJPSAzMjc0LA0KKyAgICBWUEVYVFJXbXIJPSAzMjc1LA0KKyAgICBWUEVYVFJXcmkJPSAzMjc2LA0KKyAgICBWUEhBREREcm0xMjgJPSAzMjc3LA0KKyAgICBWUEhBREREcm02NAk9IDMyNzgsDQorICAgIFZQSEFERERycjEyOAk9IDMyNzksDQorICAgIFZQSEFERERycjY0CT0gMzI4MCwNCisgICAgVlBIQUREU1dybTEyOAk9IDMyODEsDQorICAgIFZQSEFERFNXcm02NAk9IDMyODIsDQorICAgIFZQSEFERFNXcnIxMjgJPSAzMjgzLA0KKyAgICBWUEhBRERTV3JyNjQJPSAzMjg0LA0KKyAgICBWUEhBRERXcm0xMjgJPSAzMjg1LA0KKyAgICBWUEhBRERXcm02NAk9IDMyODYsDQorICAgIFZQSEFERFdycjEyOAk9IDMyODcsDQorICAgIFZQSEFERFdycjY0CT0gMzI4OCwNCisgICAgVlBITUlOUE9TVVdybTEyOAk9IDMyODksDQorICAgIFZQSE1JTlBPU1VXcnIxMjgJPSAzMjkwLA0KKyAgICBWUEhTVUJEcm0xMjgJPSAzMjkxLA0KKyAgICBWUEhTVUJEcm02NAk9IDMyOTIsDQorICAgIFZQSFNVQkRycjEyOAk9IDMyOTMsDQorICAgIFZQSFNVQkRycjY0CT0gMzI5NCwNCisgICAgVlBIU1VCU1dybTEyOAk9IDMyOTUsDQorICAgIFZQSFNVQlNXcm02NAk9IDMyOTYsDQorICAgIFZQSFNVQlNXcnIxMjgJPSAzMjk3LA0KKyAgICBWUEhTVUJTV3JyNjQJPSAzMjk4LA0KKyAgICBWUEhTVUJXcm0xMjgJPSAzMjk5LA0KKyAgICBWUEhTVUJXcm02NAk9IDMzMDAsDQorICAgIFZQSFNVQldycjEyOAk9IDMzMDEsDQorICAgIFZQSFNVQldycjY0CT0gMzMwMiwNCisgICAgVlBJTlNSQnJtCT0gMzMwMywNCisgICAgVlBJTlNSQnJyCT0gMzMwNCwNCisgICAgVlBJTlNSRHJtCT0gMzMwNSwNCisgICAgVlBJTlNSRHJyCT0gMzMwNiwNCisgICAgVlBJTlNSUXJtCT0gMzMwNywNCisgICAgVlBJTlNSUXJyCT0gMzMwOCwNCisgICAgVlBJTlNSV3JtaQk9IDMzMDksDQorICAgIFZQSU5TUldycjY0aQk9IDMzMTAsDQorICAgIFZQSU5TUldycmkJPSAzMzExLA0KKyAgICBWUE1BRERVQlNXcm0xMjgJPSAzMzEyLA0KKyAgICBWUE1BRERVQlNXcm02NAk9IDMzMTMsDQorICAgIFZQTUFERFVCU1dycjEyOAk9IDMzMTQsDQorICAgIFZQTUFERFVCU1dycjY0CT0gMzMxNSwNCisgICAgVlBNQUREV0RybQk9IDMzMTYsDQorICAgIFZQTUFERFdEcnIJPSAzMzE3LA0KKyAgICBWUE1BWFNCcm0JPSAzMzE4LA0KKyAgICBWUE1BWFNCcnIJPSAzMzE5LA0KKyAgICBWUE1BWFNEcm0JPSAzMzIwLA0KKyAgICBWUE1BWFNEcnIJPSAzMzIxLA0KKyAgICBWUE1BWFNXcm0JPSAzMzIyLA0KKyAgICBWUE1BWFNXcnIJPSAzMzIzLA0KKyAgICBWUE1BWFVCcm0JPSAzMzI0LA0KKyAgICBWUE1BWFVCcnIJPSAzMzI1LA0KKyAgICBWUE1BWFVEcm0JPSAzMzI2LA0KKyAgICBWUE1BWFVEcnIJPSAzMzI3LA0KKyAgICBWUE1BWFVXcm0JPSAzMzI4LA0KKyAgICBWUE1BWFVXcnIJPSAzMzI5LA0KKyAgICBWUE1JTlNCcm0JPSAzMzMwLA0KKyAgICBWUE1JTlNCcnIJPSAzMzMxLA0KKyAgICBWUE1JTlNEcm0JPSAzMzMyLA0KKyAgICBWUE1JTlNEcnIJPSAzMzMzLA0KKyAgICBWUE1JTlNXcm0JPSAzMzM0LA0KKyAgICBWUE1JTlNXcnIJPSAzMzM1LA0KKyAgICBWUE1JTlVCcm0JPSAzMzM2LA0KKyAgICBWUE1JTlVCcnIJPSAzMzM3LA0KKyAgICBWUE1JTlVEcm0JPSAzMzM4LA0KKyAgICBWUE1JTlVEcnIJPSAzMzM5LA0KKyAgICBWUE1JTlVXcm0JPSAzMzQwLA0KKyAgICBWUE1JTlVXcnIJPSAzMzQxLA0KKyAgICBWUE1PVk1TS0JyNjRyCT0gMzM0MiwNCisgICAgVlBNT1ZNU0tCcnIJPSAzMzQzLA0KKyAgICBWUE1PVlNYQkRybQk9IDMzNDQsDQorICAgIFZQTU9WU1hCRHJyCT0gMzM0NSwNCisgICAgVlBNT1ZTWEJRcm0JPSAzMzQ2LA0KKyAgICBWUE1PVlNYQlFycgk9IDMzNDcsDQorICAgIFZQTU9WU1hCV3JtCT0gMzM0OCwNCisgICAgVlBNT1ZTWEJXcnIJPSAzMzQ5LA0KKyAgICBWUE1PVlNYRFFybQk9IDMzNTAsDQorICAgIFZQTU9WU1hEUXJyCT0gMzM1MSwNCisgICAgVlBNT1ZTWFdEcm0JPSAzMzUyLA0KKyAgICBWUE1PVlNYV0Rycgk9IDMzNTMsDQorICAgIFZQTU9WU1hXUXJtCT0gMzM1NCwNCisgICAgVlBNT1ZTWFdRcnIJPSAzMzU1LA0KKyAgICBWUE1PVlpYQkRybQk9IDMzNTYsDQorICAgIFZQTU9WWlhCRHJyCT0gMzM1NywNCisgICAgVlBNT1ZaWEJRcm0JPSAzMzU4LA0KKyAgICBWUE1PVlpYQlFycgk9IDMzNTksDQorICAgIFZQTU9WWlhCV3JtCT0gMzM2MCwNCisgICAgVlBNT1ZaWEJXcnIJPSAzMzYxLA0KKyAgICBWUE1PVlpYRFFybQk9IDMzNjIsDQorICAgIFZQTU9WWlhEUXJyCT0gMzM2MywNCisgICAgVlBNT1ZaWFdEcm0JPSAzMzY0LA0KKyAgICBWUE1PVlpYV0Rycgk9IDMzNjUsDQorICAgIFZQTU9WWlhXUXJtCT0gMzM2NiwNCisgICAgVlBNT1ZaWFdRcnIJPSAzMzY3LA0KKyAgICBWUE1VTERRcm0JPSAzMzY4LA0KKyAgICBWUE1VTERRcnIJPSAzMzY5LA0KKyAgICBWUE1VTEhSU1dybTEyOAk9IDMzNzAsDQorICAgIFZQTVVMSFJTV3JtNjQJPSAzMzcxLA0KKyAgICBWUE1VTEhSU1dycjEyOAk9IDMzNzIsDQorICAgIFZQTVVMSFJTV3JyNjQJPSAzMzczLA0KKyAgICBWUE1VTEhVV3JtCT0gMzM3NCwNCisgICAgVlBNVUxIVVdycgk9IDMzNzUsDQorICAgIFZQTVVMSFdybQk9IDMzNzYsDQorICAgIFZQTVVMSFdycgk9IDMzNzcsDQorICAgIFZQTVVMTERybQk9IDMzNzgsDQorICAgIFZQTVVMTERycgk9IDMzNzksDQorICAgIFZQTVVMTFdybQk9IDMzODAsDQorICAgIFZQTVVMTFdycgk9IDMzODEsDQorICAgIFZQTVVMVURRcm0JPSAzMzgyLA0KKyAgICBWUE1VTFVEUXJyCT0gMzM4MywNCisgICAgVlBPUnJtCT0gMzM4NCwNCisgICAgVlBPUnJyCT0gMzM4NSwNCisgICAgVlBTQURCV3JtCT0gMzM4NiwNCisgICAgVlBTQURCV3JyCT0gMzM4NywNCisgICAgVlBTSFVGQnJtMTI4CT0gMzM4OCwNCisgICAgVlBTSFVGQnJtNjQJPSAzMzg5LA0KKyAgICBWUFNIVUZCcnIxMjgJPSAzMzkwLA0KKyAgICBWUFNIVUZCcnI2NAk9IDMzOTEsDQorICAgIFZQU0hVRkRtaQk9IDMzOTIsDQorICAgIFZQU0hVRkRyaQk9IDMzOTMsDQorICAgIFZQU0hVRkhXbWkJPSAzMzk0LA0KKyAgICBWUFNIVUZIV3JpCT0gMzM5NSwNCisgICAgVlBTSFVGTFdtaQk9IDMzOTYsDQorICAgIFZQU0hVRkxXcmkJPSAzMzk3LA0KKyAgICBWUFNJR05Ccm0xMjgJPSAzMzk4LA0KKyAgICBWUFNJR05Ccm02NAk9IDMzOTksDQorICAgIFZQU0lHTkJycjEyOAk9IDM0MDAsDQorICAgIFZQU0lHTkJycjY0CT0gMzQwMSwNCisgICAgVlBTSUdORHJtMTI4CT0gMzQwMiwNCisgICAgVlBTSUdORHJtNjQJPSAzNDAzLA0KKyAgICBWUFNJR05EcnIxMjgJPSAzNDA0LA0KKyAgICBWUFNJR05EcnI2NAk9IDM0MDUsDQorICAgIFZQU0lHTldybTEyOAk9IDM0MDYsDQorICAgIFZQU0lHTldybTY0CT0gMzQwNywNCisgICAgVlBTSUdOV3JyMTI4CT0gMzQwOCwNCisgICAgVlBTSUdOV3JyNjQJPSAzNDA5LA0KKyAgICBWUFNMTERRcmkJPSAzNDEwLA0KKyAgICBWUFNMTERyaQk9IDM0MTEsDQorICAgIFZQU0xMRHJtCT0gMzQxMiwNCisgICAgVlBTTExEcnIJPSAzNDEzLA0KKyAgICBWUFNMTFFyaQk9IDM0MTQsDQorICAgIFZQU0xMUXJtCT0gMzQxNSwNCisgICAgVlBTTExRcnIJPSAzNDE2LA0KKyAgICBWUFNMTFdyaQk9IDM0MTcsDQorICAgIFZQU0xMV3JtCT0gMzQxOCwNCisgICAgVlBTTExXcnIJPSAzNDE5LA0KKyAgICBWUFNSQURyaQk9IDM0MjAsDQorICAgIFZQU1JBRHJtCT0gMzQyMSwNCisgICAgVlBTUkFEcnIJPSAzNDIyLA0KKyAgICBWUFNSQVdyaQk9IDM0MjMsDQorICAgIFZQU1JBV3JtCT0gMzQyNCwNCisgICAgVlBTUkFXcnIJPSAzNDI1LA0KKyAgICBWUFNSTERRcmkJPSAzNDI2LA0KKyAgICBWUFNSTERyaQk9IDM0MjcsDQorICAgIFZQU1JMRHJtCT0gMzQyOCwNCisgICAgVlBTUkxEcnIJPSAzNDI5LA0KKyAgICBWUFNSTFFyaQk9IDM0MzAsDQorICAgIFZQU1JMUXJtCT0gMzQzMSwNCisgICAgVlBTUkxRcnIJPSAzNDMyLA0KKyAgICBWUFNSTFdyaQk9IDM0MzMsDQorICAgIFZQU1JMV3JtCT0gMzQzNCwNCisgICAgVlBTUkxXcnIJPSAzNDM1LA0KKyAgICBWUFNVQkJybQk9IDM0MzYsDQorICAgIFZQU1VCQnJyCT0gMzQzNywNCisgICAgVlBTVUJEcm0JPSAzNDM4LA0KKyAgICBWUFNVQkRycgk9IDM0MzksDQorICAgIFZQU1VCUXJtCT0gMzQ0MCwNCisgICAgVlBTVUJRcnIJPSAzNDQxLA0KKyAgICBWUFNVQlNCcm0JPSAzNDQyLA0KKyAgICBWUFNVQlNCcnIJPSAzNDQzLA0KKyAgICBWUFNVQlNXcm0JPSAzNDQ0LA0KKyAgICBWUFNVQlNXcnIJPSAzNDQ1LA0KKyAgICBWUFNVQlVTQnJtCT0gMzQ0NiwNCisgICAgVlBTVUJVU0Jycgk9IDM0NDcsDQorICAgIFZQU1VCVVNXcm0JPSAzNDQ4LA0KKyAgICBWUFNVQlVTV3JyCT0gMzQ0OSwNCisgICAgVlBTVUJXcm0JPSAzNDUwLA0KKyAgICBWUFNVQldycgk9IDM0NTEsDQorICAgIFZQVEVTVFlybQk9IDM0NTIsDQorICAgIFZQVEVTVFlycgk9IDM0NTMsDQorICAgIFZQVEVTVHJtCT0gMzQ1NCwNCisgICAgVlBURVNUcnIJPSAzNDU1LA0KKyAgICBWUFVOUENLSEJXcm0JPSAzNDU2LA0KKyAgICBWUFVOUENLSEJXcnIJPSAzNDU3LA0KKyAgICBWUFVOUENLSERRcm0JPSAzNDU4LA0KKyAgICBWUFVOUENLSERRcnIJPSAzNDU5LA0KKyAgICBWUFVOUENLSFFEUXJtCT0gMzQ2MCwNCisgICAgVlBVTlBDS0hRRFFycgk9IDM0NjEsDQorICAgIFZQVU5QQ0tIV0RybQk9IDM0NjIsDQorICAgIFZQVU5QQ0tIV0Rycgk9IDM0NjMsDQorICAgIFZQVU5QQ0tMQldybQk9IDM0NjQsDQorICAgIFZQVU5QQ0tMQldycgk9IDM0NjUsDQorICAgIFZQVU5QQ0tMRFFybQk9IDM0NjYsDQorICAgIFZQVU5QQ0tMRFFycgk9IDM0NjcsDQorICAgIFZQVU5QQ0tMUURRcm0JPSAzNDY4LA0KKyAgICBWUFVOUENLTFFEUXJyCT0gMzQ2OSwNCisgICAgVlBVTlBDS0xXRHJtCT0gMzQ3MCwNCisgICAgVlBVTlBDS0xXRHJyCT0gMzQ3MSwNCisgICAgVlBYT1JybQk9IDM0NzIsDQorICAgIFZQWE9ScnIJPSAzNDczLA0KKyAgICBWUkNQUFNZbQk9IDM0NzQsDQorICAgIFZSQ1BQU1ltX0ludAk9IDM0NzUsDQorICAgIFZSQ1BQU1lyCT0gMzQ3NiwNCisgICAgVlJDUFBTWXJfSW50CT0gMzQ3NywNCisgICAgVlJDUFBTbQk9IDM0NzgsDQorICAgIFZSQ1BQU21fSW50CT0gMzQ3OSwNCisgICAgVlJDUFBTcgk9IDM0ODAsDQorICAgIFZSQ1BQU3JfSW50CT0gMzQ4MSwNCisgICAgVlJDUFNTbQk9IDM0ODIsDQorICAgIFZSQ1BTU21fSW50CT0gMzQ4MywNCisgICAgVlJDUFNTcgk9IDM0ODQsDQorICAgIFZSQ1BTU3JfSW50CT0gMzQ4NSwNCisgICAgVlJPVU5EUERtCT0gMzQ4NiwNCisgICAgVlJPVU5EUERtX0ludAk9IDM0ODcsDQorICAgIFZST1VORFBEcgk9IDM0ODgsDQorICAgIFZST1VORFBEcl9JbnQJPSAzNDg5LA0KKyAgICBWUk9VTkRQU20JPSAzNDkwLA0KKyAgICBWUk9VTkRQU21fSW50CT0gMzQ5MSwNCisgICAgVlJPVU5EUFNyCT0gMzQ5MiwNCisgICAgVlJPVU5EUFNyX0ludAk9IDM0OTMsDQorICAgIFZST1VORFNEbQk9IDM0OTQsDQorICAgIFZST1VORFNEbV9JbnQJPSAzNDk1LA0KKyAgICBWUk9VTkRTRHIJPSAzNDk2LA0KKyAgICBWUk9VTkRTRHJfSW50CT0gMzQ5NywNCisgICAgVlJPVU5EU1NtCT0gMzQ5OCwNCisgICAgVlJPVU5EU1NtX0ludAk9IDM0OTksDQorICAgIFZST1VORFNTcgk9IDM1MDAsDQorICAgIFZST1VORFNTcl9JbnQJPSAzNTAxLA0KKyAgICBWUk9VTkRZUERtCT0gMzUwMiwNCisgICAgVlJPVU5EWVBEbV9JbnQJPSAzNTAzLA0KKyAgICBWUk9VTkRZUERyCT0gMzUwNCwNCisgICAgVlJPVU5EWVBEcl9JbnQJPSAzNTA1LA0KKyAgICBWUk9VTkRZUFNtCT0gMzUwNiwNCisgICAgVlJPVU5EWVBTbV9JbnQJPSAzNTA3LA0KKyAgICBWUk9VTkRZUFNyCT0gMzUwOCwNCisgICAgVlJPVU5EWVBTcl9JbnQJPSAzNTA5LA0KKyAgICBWUlNRUlRQU1ltCT0gMzUxMCwNCisgICAgVlJTUVJUUFNZbV9JbnQJPSAzNTExLA0KKyAgICBWUlNRUlRQU1lyCT0gMzUxMiwNCisgICAgVlJTUVJUUFNZcl9JbnQJPSAzNTEzLA0KKyAgICBWUlNRUlRQU20JPSAzNTE0LA0KKyAgICBWUlNRUlRQU21fSW50CT0gMzUxNSwNCisgICAgVlJTUVJUUFNyCT0gMzUxNiwNCisgICAgVlJTUVJUUFNyX0ludAk9IDM1MTcsDQorICAgIFZSU1FSVFNTbQk9IDM1MTgsDQorICAgIFZSU1FSVFNTbV9JbnQJPSAzNTE5LA0KKyAgICBWUlNRUlRTU3IJPSAzNTIwLA0KKyAgICBWUlNRUlRTU3JfSW50CT0gMzUyMSwNCisgICAgVlNIVUZQRFlybWkJPSAzNTIyLA0KKyAgICBWU0hVRlBEWXJyaQk9IDM1MjMsDQorICAgIFZTSFVGUERybWkJPSAzNTI0LA0KKyAgICBWU0hVRlBEcnJpCT0gMzUyNSwNCisgICAgVlNIVUZQU1lybWkJPSAzNTI2LA0KKyAgICBWU0hVRlBTWXJyaQk9IDM1MjcsDQorICAgIFZTSFVGUFNybWkJPSAzNTI4LA0KKyAgICBWU0hVRlBTcnJpCT0gMzUyOSwNCisgICAgVlNRUlRQRFltCT0gMzUzMCwNCisgICAgVlNRUlRQRFltX0ludAk9IDM1MzEsDQorICAgIFZTUVJUUERZcgk9IDM1MzIsDQorICAgIFZTUVJUUERZcl9JbnQJPSAzNTMzLA0KKyAgICBWU1FSVFBEbQk9IDM1MzQsDQorICAgIFZTUVJUUERtX0ludAk9IDM1MzUsDQorICAgIFZTUVJUUERyCT0gMzUzNiwNCisgICAgVlNRUlRQRHJfSW50CT0gMzUzNywNCisgICAgVlNRUlRQU1ltCT0gMzUzOCwNCisgICAgVlNRUlRQU1ltX0ludAk9IDM1MzksDQorICAgIFZTUVJUUFNZcgk9IDM1NDAsDQorICAgIFZTUVJUUFNZcl9JbnQJPSAzNTQxLA0KKyAgICBWU1FSVFBTbQk9IDM1NDIsDQorICAgIFZTUVJUUFNtX0ludAk9IDM1NDMsDQorICAgIFZTUVJUUFNyCT0gMzU0NCwNCisgICAgVlNRUlRQU3JfSW50CT0gMzU0NSwNCisgICAgVlNRUlRTRG0JPSAzNTQ2LA0KKyAgICBWU1FSVFNEbV9JbnQJPSAzNTQ3LA0KKyAgICBWU1FSVFNEcgk9IDM1NDgsDQorICAgIFZTUVJUU0RyX0ludAk9IDM1NDksDQorICAgIFZTUVJUU1NtCT0gMzU1MCwNCisgICAgVlNRUlRTU21fSW50CT0gMzU1MSwNCisgICAgVlNRUlRTU3IJPSAzNTUyLA0KKyAgICBWU1FSVFNTcl9JbnQJPSAzNTUzLA0KKyAgICBWU1RNWENTUgk9IDM1NTQsDQorICAgIFZTVUJQRFlybQk9IDM1NTUsDQorICAgIFZTVUJQRFlycgk9IDM1NTYsDQorICAgIFZTVUJQRHJtCT0gMzU1NywNCisgICAgVlNVQlBEcnIJPSAzNTU4LA0KKyAgICBWU1VCUFNZcm0JPSAzNTU5LA0KKyAgICBWU1VCUFNZcnIJPSAzNTYwLA0KKyAgICBWU1VCUFNybQk9IDM1NjEsDQorICAgIFZTVUJQU3JyCT0gMzU2MiwNCisgICAgVlNVQlNEcm0JPSAzNTYzLA0KKyAgICBWU1VCU0RybV9JbnQJPSAzNTY0LA0KKyAgICBWU1VCU0Rycgk9IDM1NjUsDQorICAgIFZTVUJTRHJyX0ludAk9IDM1NjYsDQorICAgIFZTVUJTU3JtCT0gMzU2NywNCisgICAgVlNVQlNTcm1fSW50CT0gMzU2OCwNCisgICAgVlNVQlNTcnIJPSAzNTY5LA0KKyAgICBWU1VCU1Nycl9JbnQJPSAzNTcwLA0KKyAgICBWVEVTVFBEWXJtCT0gMzU3MSwNCisgICAgVlRFU1RQRFlycgk9IDM1NzIsDQorICAgIFZURVNUUERybQk9IDM1NzMsDQorICAgIFZURVNUUERycgk9IDM1NzQsDQorICAgIFZURVNUUFNZcm0JPSAzNTc1LA0KKyAgICBWVEVTVFBTWXJyCT0gMzU3NiwNCisgICAgVlRFU1RQU3JtCT0gMzU3NywNCisgICAgVlRFU1RQU3JyCT0gMzU3OCwNCisgICAgVlVDT01JU0RybQk9IDM1NzksDQorICAgIFZVQ09NSVNEcnIJPSAzNTgwLA0KKyAgICBWVUNPTUlTU3JtCT0gMzU4MSwNCisgICAgVlVDT01JU1Nycgk9IDM1ODIsDQorICAgIFZVTlBDS0hQRFlybQk9IDM1ODMsDQorICAgIFZVTlBDS0hQRFlycgk9IDM1ODQsDQorICAgIFZVTlBDS0hQRHJtCT0gMzU4NSwNCisgICAgVlVOUENLSFBEcnIJPSAzNTg2LA0KKyAgICBWVU5QQ0tIUFNZcm0JPSAzNTg3LA0KKyAgICBWVU5QQ0tIUFNZcnIJPSAzNTg4LA0KKyAgICBWVU5QQ0tIUFNybQk9IDM1ODksDQorICAgIFZVTlBDS0hQU3JyCT0gMzU5MCwNCisgICAgVlVOUENLTFBEWXJtCT0gMzU5MSwNCisgICAgVlVOUENLTFBEWXJyCT0gMzU5MiwNCisgICAgVlVOUENLTFBEcm0JPSAzNTkzLA0KKyAgICBWVU5QQ0tMUERycgk9IDM1OTQsDQorICAgIFZVTlBDS0xQU1lybQk9IDM1OTUsDQorICAgIFZVTlBDS0xQU1lycgk9IDM1OTYsDQorICAgIFZVTlBDS0xQU3JtCT0gMzU5NywNCisgICAgVlVOUENLTFBTcnIJPSAzNTk4LA0KKyAgICBWWE9SUERZcm0JPSAzNTk5LA0KKyAgICBWWE9SUERZcnIJPSAzNjAwLA0KKyAgICBWWE9SUERybQk9IDM2MDEsDQorICAgIFZYT1JQRHJyCT0gMzYwMiwNCisgICAgVlhPUlBTWXJtCT0gMzYwMywNCisgICAgVlhPUlBTWXJyCT0gMzYwNCwNCisgICAgVlhPUlBTcm0JPSAzNjA1LA0KKyAgICBWWE9SUFNycgk9IDM2MDYsDQorICAgIFZaRVJPQUxMCT0gMzYwNywNCisgICAgVlpFUk9VUFBFUgk9IDM2MDgsDQorICAgIFZfU0VUMFBECT0gMzYwOSwNCisgICAgVl9TRVQwUEkJPSAzNjEwLA0KKyAgICBWX1NFVDBQUwk9IDM2MTEsDQorICAgIFZfU0VUQUxMT05FUwk9IDM2MTIsDQorICAgIFdBSVQJPSAzNjEzLA0KKyAgICBXQklOVkQJPSAzNjE0LA0KKyAgICBXSU5DQUxMNjRtCT0gMzYxNSwNCisgICAgV0lOQ0FMTDY0cGNyZWwzMgk9IDM2MTYsDQorICAgIFdJTkNBTEw2NHIJPSAzNjE3LA0KKyAgICBXUk1TUgk9IDM2MTgsDQorICAgIFhBREQxNnJtCT0gMzYxOSwNCisgICAgWEFERDE2cnIJPSAzNjIwLA0KKyAgICBYQUREMzJybQk9IDM2MjEsDQorICAgIFhBREQzMnJyCT0gMzYyMiwNCisgICAgWEFERDY0cm0JPSAzNjIzLA0KKyAgICBYQURENjRycgk9IDM2MjQsDQorICAgIFhBREQ4cm0JPSAzNjI1LA0KKyAgICBYQUREOHJyCT0gMzYyNiwNCisgICAgWENIRzE2YXIJPSAzNjI3LA0KKyAgICBYQ0hHMTZybQk9IDM2MjgsDQorICAgIFhDSEcxNnJyCT0gMzYyOSwNCisgICAgWENIRzMyYXIJPSAzNjMwLA0KKyAgICBYQ0hHMzJybQk9IDM2MzEsDQorICAgIFhDSEczMnJyCT0gMzYzMiwNCisgICAgWENIRzY0YXIJPSAzNjMzLA0KKyAgICBYQ0hHNjRybQk9IDM2MzQsDQorICAgIFhDSEc2NHJyCT0gMzYzNSwNCisgICAgWENIRzhybQk9IDM2MzYsDQorICAgIFhDSEc4cnIJPSAzNjM3LA0KKyAgICBYQ0hfRgk9IDM2MzgsDQorICAgIFhMQVQJPSAzNjM5LA0KKyAgICBYT1IxNmkxNgk9IDM2NDAsDQorICAgIFhPUjE2bWkJPSAzNjQxLA0KKyAgICBYT1IxNm1pOAk9IDM2NDIsDQorICAgIFhPUjE2bXIJPSAzNjQzLA0KKyAgICBYT1IxNnJpCT0gMzY0NCwNCisgICAgWE9SMTZyaTgJPSAzNjQ1LA0KKyAgICBYT1IxNnJtCT0gMzY0NiwNCisgICAgWE9SMTZycgk9IDM2NDcsDQorICAgIFhPUjE2cnJfUkVWCT0gMzY0OCwNCisgICAgWE9SMzJpMzIJPSAzNjQ5LA0KKyAgICBYT1IzMm1pCT0gMzY1MCwNCisgICAgWE9SMzJtaTgJPSAzNjUxLA0KKyAgICBYT1IzMm1yCT0gMzY1MiwNCisgICAgWE9SMzJyaQk9IDM2NTMsDQorICAgIFhPUjMycmk4CT0gMzY1NCwNCisgICAgWE9SMzJybQk9IDM2NTUsDQorICAgIFhPUjMycnIJPSAzNjU2LA0KKyAgICBYT1IzMnJyX1JFVgk9IDM2NTcsDQorICAgIFhPUjY0aTMyCT0gMzY1OCwNCisgICAgWE9SNjRtaTMyCT0gMzY1OSwNCisgICAgWE9SNjRtaTgJPSAzNjYwLA0KKyAgICBYT1I2NG1yCT0gMzY2MSwNCisgICAgWE9SNjRyaTMyCT0gMzY2MiwNCisgICAgWE9SNjRyaTgJPSAzNjYzLA0KKyAgICBYT1I2NHJtCT0gMzY2NCwNCisgICAgWE9SNjRycgk9IDM2NjUsDQorICAgIFhPUjY0cnJfUkVWCT0gMzY2NiwNCisgICAgWE9SOGk4CT0gMzY2NywNCisgICAgWE9SOG1pCT0gMzY2OCwNCisgICAgWE9SOG1yCT0gMzY2OSwNCisgICAgWE9SOHJpCT0gMzY3MCwNCisgICAgWE9SOHJtCT0gMzY3MSwNCisgICAgWE9SOHJyCT0gMzY3MiwNCisgICAgWE9SOHJyX1JFVgk9IDM2NzMsDQorICAgIFhPUlBEcm0JPSAzNjc0LA0KKyAgICBYT1JQRHJyCT0gMzY3NSwNCisgICAgWE9SUFNybQk9IDM2NzYsDQorICAgIFhPUlBTcnIJPSAzNjc3LA0KKyAgICBJTlNUUlVDVElPTl9MSVNUX0VORCA9IDM2NzgNCisgIH07DQorfQ0KK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlIA0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5SZWdpc3RlckluZm8uaC5pbmMgYi9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuUmVnaXN0ZXJJbmZvLmguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTc0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuUmVnaXN0ZXJJbmZvLmguaW5jCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5SZWdpc3RlckluZm8uaW5jIGIvc3JjL0xMVk0vd2luMzIveDg2L1g4NkdlblJlZ2lzdGVySW5mby5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxZWEyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5SZWdpc3RlckluZm8uaW5jCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5SZWdpc3Rlck5hbWVzLmluYyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5SZWdpc3Rlck5hbWVzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmY4MThkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIveDg2L1g4NkdlblJlZ2lzdGVyTmFtZXMuaW5jCkBAIC0wLDAgKzEsMTg0IEBACisvLz09PS0gVGFibGVHZW4nZXJhdGVkIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLw0KKy8vDQorLy8gVGFyZ2V0IFJlZ2lzdGVyIEVudW0gVmFsdWVzDQorLy8NCisvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCENCisvLw0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorDQorbmFtZXNwYWNlIGxsdm0gew0KKw0KK25hbWVzcGFjZSBYODYgew0KK2VudW0gew0KKyAgTm9SZWdpc3RlciwNCisgIEFILCAJLy8gMQ0KKyAgQUwsIAkvLyAyDQorICBBWCwgCS8vIDMNCisgIEJILCAJLy8gNA0KKyAgQkwsIAkvLyA1DQorICBCUCwgCS8vIDYNCisgIEJQTCwgCS8vIDcNCisgIEJYLCAJLy8gOA0KKyAgQ0gsIAkvLyA5DQorICBDTCwgCS8vIDEwDQorICBDUjAsIAkvLyAxMQ0KKyAgQ1IxLCAJLy8gMTINCisgIENSMiwgCS8vIDEzDQorICBDUjMsIAkvLyAxNA0KKyAgQ1I0LCAJLy8gMTUNCisgIENSNSwgCS8vIDE2DQorICBDUjYsIAkvLyAxNw0KKyAgQ1I3LCAJLy8gMTgNCisgIENSOCwgCS8vIDE5DQorICBDUywgCS8vIDIwDQorICBDWCwgCS8vIDIxDQorICBESCwgCS8vIDIyDQorICBESSwgCS8vIDIzDQorICBESUwsIAkvLyAyNA0KKyAgREwsIAkvLyAyNQ0KKyAgRFIwLCAJLy8gMjYNCisgIERSMSwgCS8vIDI3DQorICBEUjIsIAkvLyAyOA0KKyAgRFIzLCAJLy8gMjkNCisgIERSNCwgCS8vIDMwDQorICBEUjUsIAkvLyAzMQ0KKyAgRFI2LCAJLy8gMzINCisgIERSNywgCS8vIDMzDQorICBEUywgCS8vIDM0DQorICBEWCwgCS8vIDM1DQorICBFQVgsIAkvLyAzNg0KKyAgRUJQLCAJLy8gMzcNCisgIEVCWCwgCS8vIDM4DQorICBFQ1gsIAkvLyAzOQ0KKyAgRURJLCAJLy8gNDANCisgIEVEWCwgCS8vIDQxDQorICBFRkxBR1MsIAkvLyA0Mg0KKyAgRUlQLCAJLy8gNDMNCisgIEVJWiwgCS8vIDQ0DQorICBFUywgCS8vIDQ1DQorICBFU0ksIAkvLyA0Ng0KKyAgRVNQLCAJLy8gNDcNCisgIEZQMCwgCS8vIDQ4DQorICBGUDEsIAkvLyA0OQ0KKyAgRlAyLCAJLy8gNTANCisgIEZQMywgCS8vIDUxDQorICBGUDQsIAkvLyA1Mg0KKyAgRlA1LCAJLy8gNTMNCisgIEZQNiwgCS8vIDU0DQorICBGUywgCS8vIDU1DQorICBHUywgCS8vIDU2DQorICBJUCwgCS8vIDU3DQorICBNTTAsIAkvLyA1OA0KKyAgTU0xLCAJLy8gNTkNCisgIE1NMiwgCS8vIDYwDQorICBNTTMsIAkvLyA2MQ0KKyAgTU00LCAJLy8gNjINCisgIE1NNSwgCS8vIDYzDQorICBNTTYsIAkvLyA2NA0KKyAgTU03LCAJLy8gNjUNCisgIFI4LCAJLy8gNjYNCisgIFI4QiwgCS8vIDY3DQorICBSOEQsIAkvLyA2OA0KKyAgUjhXLCAJLy8gNjkNCisgIFI5LCAJLy8gNzANCisgIFI5QiwgCS8vIDcxDQorICBSOUQsIAkvLyA3Mg0KKyAgUjlXLCAJLy8gNzMNCisgIFIxMCwgCS8vIDc0DQorICBSMTBCLCAJLy8gNzUNCisgIFIxMEQsIAkvLyA3Ng0KKyAgUjEwVywgCS8vIDc3DQorICBSMTEsIAkvLyA3OA0KKyAgUjExQiwgCS8vIDc5DQorICBSMTFELCAJLy8gODANCisgIFIxMVcsIAkvLyA4MQ0KKyAgUjEyLCAJLy8gODINCisgIFIxMkIsIAkvLyA4Mw0KKyAgUjEyRCwgCS8vIDg0DQorICBSMTJXLCAJLy8gODUNCisgIFIxMywgCS8vIDg2DQorICBSMTNCLCAJLy8gODcNCisgIFIxM0QsIAkvLyA4OA0KKyAgUjEzVywgCS8vIDg5DQorICBSMTQsIAkvLyA5MA0KKyAgUjE0QiwgCS8vIDkxDQorICBSMTRELCAJLy8gOTINCisgIFIxNFcsIAkvLyA5Mw0KKyAgUjE1LCAJLy8gOTQNCisgIFIxNUIsIAkvLyA5NQ0KKyAgUjE1RCwgCS8vIDk2DQorICBSMTVXLCAJLy8gOTcNCisgIFJBWCwgCS8vIDk4DQorICBSQlAsIAkvLyA5OQ0KKyAgUkJYLCAJLy8gMTAwDQorICBSQ1gsIAkvLyAxMDENCisgIFJESSwgCS8vIDEwMg0KKyAgUkRYLCAJLy8gMTAzDQorICBSSVAsIAkvLyAxMDQNCisgIFJJWiwgCS8vIDEwNQ0KKyAgUlNJLCAJLy8gMTA2DQorICBSU1AsIAkvLyAxMDcNCisgIFNJLCAJLy8gMTA4DQorICBTSUwsIAkvLyAxMDkNCisgIFNQLCAJLy8gMTEwDQorICBTUEwsIAkvLyAxMTENCisgIFNTLCAJLy8gMTEyDQorICBTVDAsIAkvLyAxMTMNCisgIFNUMSwgCS8vIDExNA0KKyAgU1QyLCAJLy8gMTE1DQorICBTVDMsIAkvLyAxMTYNCisgIFNUNCwgCS8vIDExNw0KKyAgU1Q1LCAJLy8gMTE4DQorICBTVDYsIAkvLyAxMTkNCisgIFNUNywgCS8vIDEyMA0KKyAgWE1NMCwgCS8vIDEyMQ0KKyAgWE1NMSwgCS8vIDEyMg0KKyAgWE1NMiwgCS8vIDEyMw0KKyAgWE1NMywgCS8vIDEyNA0KKyAgWE1NNCwgCS8vIDEyNQ0KKyAgWE1NNSwgCS8vIDEyNg0KKyAgWE1NNiwgCS8vIDEyNw0KKyAgWE1NNywgCS8vIDEyOA0KKyAgWE1NOCwgCS8vIDEyOQ0KKyAgWE1NOSwgCS8vIDEzMA0KKyAgWE1NMTAsIAkvLyAxMzENCisgIFhNTTExLCAJLy8gMTMyDQorICBYTU0xMiwgCS8vIDEzMw0KKyAgWE1NMTMsIAkvLyAxMzQNCisgIFhNTTE0LCAJLy8gMTM1DQorICBYTU0xNSwgCS8vIDEzNg0KKyAgWU1NMCwgCS8vIDEzNw0KKyAgWU1NMSwgCS8vIDEzOA0KKyAgWU1NMiwgCS8vIDEzOQ0KKyAgWU1NMywgCS8vIDE0MA0KKyAgWU1NNCwgCS8vIDE0MQ0KKyAgWU1NNSwgCS8vIDE0Mg0KKyAgWU1NNiwgCS8vIDE0Mw0KKyAgWU1NNywgCS8vIDE0NA0KKyAgWU1NOCwgCS8vIDE0NQ0KKyAgWU1NOSwgCS8vIDE0Ng0KKyAgWU1NMTAsIAkvLyAxNDcNCisgIFlNTTExLCAJLy8gMTQ4DQorICBZTU0xMiwgCS8vIDE0OQ0KKyAgWU1NMTMsIAkvLyAxNTANCisgIFlNTTE0LCAJLy8gMTUxDQorICBZTU0xNSwgCS8vIDE1Mg0KKyAgTlVNX1RBUkdFVF9SRUdTIAkvLyAxNTMNCit9Ow0KK30NCisNCisvLyBTdWJyZWdpc3RlciBpbmRpY2VzDQorbmFtZXNwYWNlIFg4NiB7DQorZW51bSB7DQorICBOb1N1YlJlZ2lzdGVyLA0KKyAgc3ViXzhiaXQsCS8vIDENCisgIHN1Yl84Yml0X2hpLAkvLyAyDQorICBzdWJfMTZiaXQsCS8vIDMNCisgIHN1Yl8zMmJpdCwJLy8gNA0KKyAgc3ViX3NkLAkvLyA1DQorICBzdWJfc3MsCS8vIDYNCisgIHN1Yl94bW0sCS8vIDcNCisgIE5VTV9UQVJHRVRfU1VCUkVHUyA9IDgNCit9Ow0KK30NCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZSANCmRpZmYgLS1naXQgYS9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuU3VidGFyZ2V0LmluYyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni9YODZHZW5TdWJ0YXJnZXQuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzcwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTExWTS93aW4zMi94ODYvWDg2R2VuU3VidGFyZ2V0LmluYwpAQCAtMCwwICsxLDE1NSBAQAorLy89PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8NCisvLw0KKy8vIFN1YnRhcmdldCBFbnVtZXJhdGlvbiBTb3VyY2UgRnJhZ21lbnQNCisvLw0KKy8vIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0IQ0KKy8vDQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisNCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiDQorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIg0KKyNpbmNsdWRlICJsbHZtL1RhcmdldC9TdWJ0YXJnZXRGZWF0dXJlLmgiDQorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEluc3RySXRpbmVyYXJpZXMuaCINCisNCitlbnVtIHsNCisgIEZlYXR1cmUzRE5vdyA9ICAxIDw8IDAsDQorICBGZWF0dXJlM0ROb3dBID0gIDEgPDwgMSwNCisgIEZlYXR1cmU2NEJpdCA9ICAxIDw8IDIsDQorICBGZWF0dXJlQUVTID0gIDEgPDwgMywNCisgIEZlYXR1cmVBVlggPSAgMSA8PCA0LA0KKyAgRmVhdHVyZUNMTVVMID0gIDEgPDwgNSwNCisgIEZlYXR1cmVDTU9WID0gIDEgPDwgNiwNCisgIEZlYXR1cmVGTUEzID0gIDEgPDwgNywNCisgIEZlYXR1cmVGTUE0ID0gIDEgPDwgOCwNCisgIEZlYXR1cmVGYXN0VUFNZW0gPSAgMSA8PCA5LA0KKyAgRmVhdHVyZU1NWCA9ICAxIDw8IDEwLA0KKyAgRmVhdHVyZVNTRTEgPSAgMSA8PCAxMSwNCisgIEZlYXR1cmVTU0UyID0gIDEgPDwgMTIsDQorICBGZWF0dXJlU1NFMyA9ICAxIDw8IDEzLA0KKyAgRmVhdHVyZVNTRTQxID0gIDEgPDwgMTQsDQorICBGZWF0dXJlU1NFNDIgPSAgMSA8PCAxNSwNCisgIEZlYXR1cmVTU0U0QSA9ICAxIDw8IDE2LA0KKyAgRmVhdHVyZVNTU0UzID0gIDEgPDwgMTcsDQorICBGZWF0dXJlU2xvd0JUTWVtID0gIDEgPDwgMTgsDQorICBGZWF0dXJlVmVjdG9yVUFNZW0gPSAgMSA8PCAxOQ0KK307DQorDQorLy8gU29ydGVkIChieSBrZXkpIGFycmF5IG9mIHZhbHVlcyBmb3IgQ1BVIGZlYXR1cmVzLg0KK3N0YXRpYyBjb25zdCBsbHZtOjpTdWJ0YXJnZXRGZWF0dXJlS1YgRmVhdHVyZUtWW10gPSB7DQorICB7ICIzZG5vdyIsICJFbmFibGUgM0ROb3chIGluc3RydWN0aW9ucyIsIEZlYXR1cmUzRE5vdywgMCB9LA0KKyAgeyAiM2Rub3dhIiwgIkVuYWJsZSAzRE5vdyEgQXRobG9uIGluc3RydWN0aW9ucyIsIEZlYXR1cmUzRE5vd0EsIEZlYXR1cmUzRE5vdyB9LA0KKyAgeyAiNjRiaXQiLCAiU3VwcG9ydCA2NC1iaXQgaW5zdHJ1Y3Rpb25zIiwgRmVhdHVyZTY0Qml0LCBGZWF0dXJlQ01PViB9LA0KKyAgeyAiYWVzIiwgIkVuYWJsZSBBRVMgaW5zdHJ1Y3Rpb25zIiwgRmVhdHVyZUFFUywgMCB9LA0KKyAgeyAiYXZ4IiwgIkVuYWJsZSBBVlggaW5zdHJ1Y3Rpb25zIiwgRmVhdHVyZUFWWCwgMCB9LA0KKyAgeyAiY2xtdWwiLCAiRW5hYmxlIGNhcnJ5LWxlc3MgbXVsdGlwbGljYXRpb24gaW5zdHJ1Y3Rpb25zIiwgRmVhdHVyZUNMTVVMLCAwIH0sDQorICB7ICJjbW92IiwgIkVuYWJsZSBjb25kaXRpb25hbCBtb3ZlIGluc3RydWN0aW9ucyIsIEZlYXR1cmVDTU9WLCAwIH0sDQorICB7ICJmYXN0LXVuYWxpZ25lZC1tZW0iLCAiRmFzdCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyIsIEZlYXR1cmVGYXN0VUFNZW0sIDAgfSwNCisgIHsgImZtYTMiLCAiRW5hYmxlIHRocmVlLW9wZXJhbmQgZnVzZWQgbXVsdGlwbGUtYWRkIiwgRmVhdHVyZUZNQTMsIDAgfSwNCisgIHsgImZtYTQiLCAiRW5hYmxlIGZvdXItb3BlcmFuZCBmdXNlZCBtdWx0aXBsZS1hZGQiLCBGZWF0dXJlRk1BNCwgMCB9LA0KKyAgeyAibW14IiwgIkVuYWJsZSBNTVggaW5zdHJ1Y3Rpb25zIiwgRmVhdHVyZU1NWCwgMCB9LA0KKyAgeyAic2xvdy1idC1tZW0iLCAiQml0IHRlc3Rpbmcgb2YgbWVtb3J5IGlzIHNsb3ciLCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJzc2UiLCAiRW5hYmxlIFNTRSBpbnN0cnVjdGlvbnMiLCBGZWF0dXJlU1NFMSwgRmVhdHVyZU1NWCB8IEZlYXR1cmVDTU9WIH0sDQorICB7ICJzc2UyIiwgIkVuYWJsZSBTU0UyIGluc3RydWN0aW9ucyIsIEZlYXR1cmVTU0UyLCBGZWF0dXJlU1NFMSB9LA0KKyAgeyAic3NlMyIsICJFbmFibGUgU1NFMyBpbnN0cnVjdGlvbnMiLCBGZWF0dXJlU1NFMywgRmVhdHVyZVNTRTIgfSwNCisgIHsgInNzZTQxIiwgIkVuYWJsZSBTU0UgNC4xIGluc3RydWN0aW9ucyIsIEZlYXR1cmVTU0U0MSwgRmVhdHVyZVNTU0UzIH0sDQorICB7ICJzc2U0MiIsICJFbmFibGUgU1NFIDQuMiBpbnN0cnVjdGlvbnMiLCBGZWF0dXJlU1NFNDIsIEZlYXR1cmVTU0U0MSB9LA0KKyAgeyAic3NlNGEiLCAiU3VwcG9ydCBTU0UgNGEgaW5zdHJ1Y3Rpb25zIiwgRmVhdHVyZVNTRTRBLCAwIH0sDQorICB7ICJzc3NlMyIsICJFbmFibGUgU1NTRTMgaW5zdHJ1Y3Rpb25zIiwgRmVhdHVyZVNTU0UzLCBGZWF0dXJlU1NFMyB9LA0KKyAgeyAidmVjdG9yLXVuYWxpZ25lZC1tZW0iLCAiQWxsb3cgdW5hbGlnbmVkIG1lbW9yeSBvcGVyYW5kcyBvbiB2ZWN0b3IvU0lNRCBpbnN0cnVjdGlvbnMiLCBGZWF0dXJlVmVjdG9yVUFNZW0sIDAgfQ0KK307DQorDQorZW51bSB7DQorICBGZWF0dXJlS1ZTaXplID0gc2l6ZW9mKEZlYXR1cmVLVikvc2l6ZW9mKGxsdm06OlN1YnRhcmdldEZlYXR1cmVLVikNCit9Ow0KKw0KKy8vIFNvcnRlZCAoYnkga2V5KSBhcnJheSBvZiB2YWx1ZXMgZm9yIENQVSBzdWJ0eXBlLg0KK3N0YXRpYyBjb25zdCBsbHZtOjpTdWJ0YXJnZXRGZWF0dXJlS1YgU3ViVHlwZUtWW10gPSB7DQorICB7ICJhbWRmYW0xMCIsICJTZWxlY3QgdGhlIGFtZGZhbTEwIHByb2Nlc3NvciIsIEZlYXR1cmVTU0UzIHwgRmVhdHVyZVNTRTRBIHwgRmVhdHVyZTNETm93QSB8IEZlYXR1cmU2NEJpdCB8IEZlYXR1cmVTbG93QlRNZW0sIDAgfSwNCisgIHsgImF0aGxvbiIsICJTZWxlY3QgdGhlIGF0aGxvbiBwcm9jZXNzb3IiLCBGZWF0dXJlTU1YIHwgRmVhdHVyZTNETm93QSB8IEZlYXR1cmVTbG93QlRNZW0sIDAgfSwNCisgIHsgImF0aGxvbi00IiwgIlNlbGVjdCB0aGUgYXRobG9uLTQgcHJvY2Vzc29yIiwgRmVhdHVyZVNTRTEgfCBGZWF0dXJlM0ROb3dBIHwgRmVhdHVyZVNsb3dCVE1lbSwgMCB9LA0KKyAgeyAiYXRobG9uLWZ4IiwgIlNlbGVjdCB0aGUgYXRobG9uLWZ4IHByb2Nlc3NvciIsIEZlYXR1cmVTU0UyIHwgRmVhdHVyZTNETm93QSB8IEZlYXR1cmU2NEJpdCB8IEZlYXR1cmVTbG93QlRNZW0sIDAgfSwNCisgIHsgImF0aGxvbi1tcCIsICJTZWxlY3QgdGhlIGF0aGxvbi1tcCBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFMSB8IEZlYXR1cmUzRE5vd0EgfCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJhdGhsb24tdGJpcmQiLCAiU2VsZWN0IHRoZSBhdGhsb24tdGJpcmQgcHJvY2Vzc29yIiwgRmVhdHVyZU1NWCB8IEZlYXR1cmUzRE5vd0EgfCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJhdGhsb24teHAiLCAiU2VsZWN0IHRoZSBhdGhsb24teHAgcHJvY2Vzc29yIiwgRmVhdHVyZVNTRTEgfCBGZWF0dXJlM0ROb3dBIHwgRmVhdHVyZVNsb3dCVE1lbSwgMCB9LA0KKyAgeyAiYXRobG9uNjQiLCAiU2VsZWN0IHRoZSBhdGhsb242NCBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFMiB8IEZlYXR1cmUzRE5vd0EgfCBGZWF0dXJlNjRCaXQgfCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJhdGhsb242NC1zc2UzIiwgIlNlbGVjdCB0aGUgYXRobG9uNjQtc3NlMyBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFMyB8IEZlYXR1cmUzRE5vd0EgfCBGZWF0dXJlNjRCaXQgfCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJhdG9tIiwgIlNlbGVjdCB0aGUgYXRvbSBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFMyB8IEZlYXR1cmU2NEJpdCB8IEZlYXR1cmVTbG93QlRNZW0sIDAgfSwNCisgIHsgImJhcmNlbG9uYSIsICJTZWxlY3QgdGhlIGJhcmNlbG9uYSBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFMyB8IEZlYXR1cmVTU0U0QSB8IEZlYXR1cmUzRE5vd0EgfCBGZWF0dXJlNjRCaXQgfCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJjMyIsICJTZWxlY3QgdGhlIGMzIHByb2Nlc3NvciIsIEZlYXR1cmVNTVggfCBGZWF0dXJlM0ROb3csIDAgfSwNCisgIHsgImMzLTIiLCAiU2VsZWN0IHRoZSBjMy0yIHByb2Nlc3NvciIsIEZlYXR1cmVTU0UxLCAwIH0sDQorICB7ICJjb3JlMiIsICJTZWxlY3QgdGhlIGNvcmUyIHByb2Nlc3NvciIsIEZlYXR1cmVTU1NFMyB8IEZlYXR1cmU2NEJpdCB8IEZlYXR1cmVTbG93QlRNZW0sIDAgfSwNCisgIHsgImNvcmVpNyIsICJTZWxlY3QgdGhlIGNvcmVpNyBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFNDIgfCBGZWF0dXJlNjRCaXQgfCBGZWF0dXJlU2xvd0JUTWVtIHwgRmVhdHVyZUZhc3RVQU1lbSB8IEZlYXR1cmVBRVMsIDAgfSwNCisgIHsgImdlbmVyaWMiLCAiU2VsZWN0IHRoZSBnZW5lcmljIHByb2Nlc3NvciIsIDAsIDAgfSwNCisgIHsgImkzODYiLCAiU2VsZWN0IHRoZSBpMzg2IHByb2Nlc3NvciIsIDAsIDAgfSwNCisgIHsgImk0ODYiLCAiU2VsZWN0IHRoZSBpNDg2IHByb2Nlc3NvciIsIDAsIDAgfSwNCisgIHsgImk1ODYiLCAiU2VsZWN0IHRoZSBpNTg2IHByb2Nlc3NvciIsIDAsIDAgfSwNCisgIHsgImk2ODYiLCAiU2VsZWN0IHRoZSBpNjg2IHByb2Nlc3NvciIsIDAsIDAgfSwNCisgIHsgImlzdGFuYnVsIiwgIlNlbGVjdCB0aGUgaXN0YW5idWwgcHJvY2Vzc29yIiwgRmVhdHVyZTNETm93QSB8IEZlYXR1cmU2NEJpdCB8IEZlYXR1cmVTU0U0QSB8IEZlYXR1cmUzRE5vd0EsIDAgfSwNCisgIHsgIms2IiwgIlNlbGVjdCB0aGUgazYgcHJvY2Vzc29yIiwgRmVhdHVyZU1NWCwgMCB9LA0KKyAgeyAiazYtMiIsICJTZWxlY3QgdGhlIGs2LTIgcHJvY2Vzc29yIiwgRmVhdHVyZU1NWCB8IEZlYXR1cmUzRE5vdywgMCB9LA0KKyAgeyAiazYtMyIsICJTZWxlY3QgdGhlIGs2LTMgcHJvY2Vzc29yIiwgRmVhdHVyZU1NWCB8IEZlYXR1cmUzRE5vdywgMCB9LA0KKyAgeyAiazgiLCAiU2VsZWN0IHRoZSBrOCBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFMiB8IEZlYXR1cmUzRE5vd0EgfCBGZWF0dXJlNjRCaXQgfCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJrOC1zc2UzIiwgIlNlbGVjdCB0aGUgazgtc3NlMyBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFMyB8IEZlYXR1cmUzRE5vd0EgfCBGZWF0dXJlNjRCaXQgfCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJuZWhhbGVtIiwgIlNlbGVjdCB0aGUgbmVoYWxlbSBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFNDIgfCBGZWF0dXJlNjRCaXQgfCBGZWF0dXJlU2xvd0JUTWVtIHwgRmVhdHVyZUZhc3RVQU1lbSwgMCB9LA0KKyAgeyAibm9jb25hIiwgIlNlbGVjdCB0aGUgbm9jb25hIHByb2Nlc3NvciIsIEZlYXR1cmVTU0UzIHwgRmVhdHVyZTY0Qml0IHwgRmVhdHVyZVNsb3dCVE1lbSwgMCB9LA0KKyAgeyAib3B0ZXJvbiIsICJTZWxlY3QgdGhlIG9wdGVyb24gcHJvY2Vzc29yIiwgRmVhdHVyZVNTRTIgfCBGZWF0dXJlM0ROb3dBIHwgRmVhdHVyZTY0Qml0IHwgRmVhdHVyZVNsb3dCVE1lbSwgMCB9LA0KKyAgeyAib3B0ZXJvbi1zc2UzIiwgIlNlbGVjdCB0aGUgb3B0ZXJvbi1zc2UzIHByb2Nlc3NvciIsIEZlYXR1cmVTU0UzIHwgRmVhdHVyZTNETm93QSB8IEZlYXR1cmU2NEJpdCB8IEZlYXR1cmVTbG93QlRNZW0sIDAgfSwNCisgIHsgInBlbnJ5biIsICJTZWxlY3QgdGhlIHBlbnJ5biBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFNDEgfCBGZWF0dXJlNjRCaXQgfCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJwZW50aXVtIiwgIlNlbGVjdCB0aGUgcGVudGl1bSBwcm9jZXNzb3IiLCAwLCAwIH0sDQorICB7ICJwZW50aXVtLW0iLCAiU2VsZWN0IHRoZSBwZW50aXVtLW0gcHJvY2Vzc29yIiwgRmVhdHVyZVNTRTIgfCBGZWF0dXJlU2xvd0JUTWVtLCAwIH0sDQorICB7ICJwZW50aXVtLW1teCIsICJTZWxlY3QgdGhlIHBlbnRpdW0tbW14IHByb2Nlc3NvciIsIEZlYXR1cmVNTVgsIDAgfSwNCisgIHsgInBlbnRpdW0yIiwgIlNlbGVjdCB0aGUgcGVudGl1bTIgcHJvY2Vzc29yIiwgRmVhdHVyZU1NWCB8IEZlYXR1cmVDTU9WLCAwIH0sDQorICB7ICJwZW50aXVtMyIsICJTZWxlY3QgdGhlIHBlbnRpdW0zIHByb2Nlc3NvciIsIEZlYXR1cmVTU0UxLCAwIH0sDQorICB7ICJwZW50aXVtNCIsICJTZWxlY3QgdGhlIHBlbnRpdW00IHByb2Nlc3NvciIsIEZlYXR1cmVTU0UyLCAwIH0sDQorICB7ICJwZW50aXVtcHJvIiwgIlNlbGVjdCB0aGUgcGVudGl1bXBybyBwcm9jZXNzb3IiLCBGZWF0dXJlQ01PViwgMCB9LA0KKyAgeyAicHJlc2NvdHQiLCAiU2VsZWN0IHRoZSBwcmVzY290dCBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFMyB8IEZlYXR1cmVTbG93QlRNZW0sIDAgfSwNCisgIHsgInNhbmR5YnJpZGdlIiwgIlNlbGVjdCB0aGUgc2FuZHlicmlkZ2UgcHJvY2Vzc29yIiwgRmVhdHVyZVNTRTQyIHwgRmVhdHVyZUFWWCB8IEZlYXR1cmU2NEJpdCwgMCB9LA0KKyAgeyAic2hhbmdoYWkiLCAiU2VsZWN0IHRoZSBzaGFuZ2hhaSBwcm9jZXNzb3IiLCBGZWF0dXJlM0ROb3dBIHwgRmVhdHVyZTY0Qml0IHwgRmVhdHVyZVNTRTRBIHwgRmVhdHVyZTNETm93QSwgMCB9LA0KKyAgeyAid2VzdG1lcmUiLCAiU2VsZWN0IHRoZSB3ZXN0bWVyZSBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFNDIgfCBGZWF0dXJlNjRCaXQgfCBGZWF0dXJlU2xvd0JUTWVtIHwgRmVhdHVyZUZhc3RVQU1lbSB8IEZlYXR1cmVBRVMsIDAgfSwNCisgIHsgIndpbmNoaXAtYzYiLCAiU2VsZWN0IHRoZSB3aW5jaGlwLWM2IHByb2Nlc3NvciIsIEZlYXR1cmVNTVgsIDAgfSwNCisgIHsgIndpbmNoaXAyIiwgIlNlbGVjdCB0aGUgd2luY2hpcDIgcHJvY2Vzc29yIiwgRmVhdHVyZU1NWCB8IEZlYXR1cmUzRE5vdywgMCB9LA0KKyAgeyAieDg2LTY0IiwgIlNlbGVjdCB0aGUgeDg2LTY0IHByb2Nlc3NvciIsIEZlYXR1cmVTU0UyIHwgRmVhdHVyZTY0Qml0IHwgRmVhdHVyZVNsb3dCVE1lbSwgMCB9LA0KKyAgeyAieW9uYWgiLCAiU2VsZWN0IHRoZSB5b25haCBwcm9jZXNzb3IiLCBGZWF0dXJlU1NFMyB8IEZlYXR1cmVTbG93QlRNZW0sIDAgfQ0KK307DQorDQorZW51bSB7DQorICBTdWJUeXBlS1ZTaXplID0gc2l6ZW9mKFN1YlR5cGVLVikvc2l6ZW9mKGxsdm06OlN1YnRhcmdldEZlYXR1cmVLVikNCit9Ow0KKw0KKw0KK2VudW0gew0KKyAgSXRpbkNsYXNzZXNTaXplID0gMQ0KK307DQorDQorLy8gUGFyc2VTdWJ0YXJnZXRGZWF0dXJlcyAtIFBhcnNlcyBmZWF0dXJlcyBzdHJpbmcgc2V0dGluZyBzcGVjaWZpZWQNCisvLyBzdWJ0YXJnZXQgb3B0aW9ucy4NCitzdGQ6OnN0cmluZyBsbHZtOjpYODZTdWJ0YXJnZXQ6OlBhcnNlU3VidGFyZ2V0RmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcgJkZTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQ1BVKSB7DQorICBERUJVRyhkYmdzKCkgPDwgIlxuRmVhdHVyZXM6IiA8PCBGUyk7DQorICBERUJVRyhkYmdzKCkgPDwgIlxuQ1BVOiIgPDwgQ1BVKTsNCisgIFN1YnRhcmdldEZlYXR1cmVzIEZlYXR1cmVzKEZTKTsNCisgIEZlYXR1cmVzLnNldENQVUlmTm9uZShDUFUpOw0KKyAgdWludDMyX3QgQml0cyA9ICBGZWF0dXJlcy5nZXRCaXRzKFN1YlR5cGVLViwgU3ViVHlwZUtWU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlS1YsIEZlYXR1cmVLVlNpemUpOw0KKyAgaWYgKChCaXRzICYgRmVhdHVyZTNETm93KSAhPSAwICYmIFg4NjNETm93TGV2ZWwgPCBUaHJlZUROb3cpIFg4NjNETm93TGV2ZWwgPSBUaHJlZUROb3c7DQorICBpZiAoKEJpdHMgJiBGZWF0dXJlM0ROb3dBKSAhPSAwICYmIFg4NjNETm93TGV2ZWwgPCBUaHJlZUROb3dBKSBYODYzRE5vd0xldmVsID0gVGhyZWVETm93QTsNCisgIGlmICgoQml0cyAmIEZlYXR1cmU2NEJpdCkgIT0gMCkgSGFzWDg2XzY0ID0gdHJ1ZTsNCisgIGlmICgoQml0cyAmIEZlYXR1cmVBRVMpICE9IDApIEhhc0FFUyA9IHRydWU7DQorICBpZiAoKEJpdHMgJiBGZWF0dXJlQVZYKSAhPSAwKSBIYXNBVlggPSB0cnVlOw0KKyAgaWYgKChCaXRzICYgRmVhdHVyZUNMTVVMKSAhPSAwKSBIYXNDTE1VTCA9IHRydWU7DQorICBpZiAoKEJpdHMgJiBGZWF0dXJlQ01PVikgIT0gMCkgSGFzQ01vdiA9IHRydWU7DQorICBpZiAoKEJpdHMgJiBGZWF0dXJlRk1BMykgIT0gMCkgSGFzRk1BMyA9IHRydWU7DQorICBpZiAoKEJpdHMgJiBGZWF0dXJlRk1BNCkgIT0gMCkgSGFzRk1BNCA9IHRydWU7DQorICBpZiAoKEJpdHMgJiBGZWF0dXJlRmFzdFVBTWVtKSAhPSAwKSBJc1VBTWVtRmFzdCA9IHRydWU7DQorICBpZiAoKEJpdHMgJiBGZWF0dXJlTU1YKSAhPSAwICYmIFg4NlNTRUxldmVsIDwgTU1YKSBYODZTU0VMZXZlbCA9IE1NWDsNCisgIGlmICgoQml0cyAmIEZlYXR1cmVTU0UxKSAhPSAwICYmIFg4NlNTRUxldmVsIDwgU1NFMSkgWDg2U1NFTGV2ZWwgPSBTU0UxOw0KKyAgaWYgKChCaXRzICYgRmVhdHVyZVNTRTIpICE9IDAgJiYgWDg2U1NFTGV2ZWwgPCBTU0UyKSBYODZTU0VMZXZlbCA9IFNTRTI7DQorICBpZiAoKEJpdHMgJiBGZWF0dXJlU1NFMykgIT0gMCAmJiBYODZTU0VMZXZlbCA8IFNTRTMpIFg4NlNTRUxldmVsID0gU1NFMzsNCisgIGlmICgoQml0cyAmIEZlYXR1cmVTU0U0MSkgIT0gMCAmJiBYODZTU0VMZXZlbCA8IFNTRTQxKSBYODZTU0VMZXZlbCA9IFNTRTQxOw0KKyAgaWYgKChCaXRzICYgRmVhdHVyZVNTRTQyKSAhPSAwICYmIFg4NlNTRUxldmVsIDwgU1NFNDIpIFg4NlNTRUxldmVsID0gU1NFNDI7DQorICBpZiAoKEJpdHMgJiBGZWF0dXJlU1NFNEEpICE9IDApIEhhc1NTRTRBID0gdHJ1ZTsNCisgIGlmICgoQml0cyAmIEZlYXR1cmVTU1NFMykgIT0gMCAmJiBYODZTU0VMZXZlbCA8IFNTU0UzKSBYODZTU0VMZXZlbCA9IFNTU0UzOw0KKyAgaWYgKChCaXRzICYgRmVhdHVyZVNsb3dCVE1lbSkgIT0gMCkgSXNCVE1lbVNsb3cgPSB0cnVlOw0KKyAgaWYgKChCaXRzICYgRmVhdHVyZVZlY3RvclVBTWVtKSAhPSAwKSBIYXNWZWN0b3JVQU1lbSA9IHRydWU7DQorICByZXR1cm4gRmVhdHVyZXMuZ2V0Q1BVKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL3g4Ni94ODYudmN4cHJvaiBiL3NyYy9MTFZNL3dpbjMyL3g4Ni94ODYudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTUxMmJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0xMVk0vd2luMzIveDg2L3g4Ni52Y3hwcm9qCkBAIC0wLDAgKzEsNDkyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlByb2ZpbGV8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlByb2ZpbGV8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5Qcm9maWxlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPnsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9PC9Qcm9qZWN0R3VpZD4NCisgICAgPFJvb3ROYW1lc3BhY2U+eDg2PC9Sb290TmFtZXNwYWNlPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uOy4uXC4uXGluY2x1ZGU7Li47Li5cLi5cbGliXFRhcmdldFxYODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtfREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+LjsuLlwuLlxpbmNsdWRlOy4uOy4uXC4uXGxpYlxUYXJnZXRcWDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7X0RFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uOy4uXC4uXGluY2x1ZGU7Li47Li5cLi5cbGliXFRhcmdldFxYODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+LjsuLlwuLlxpbmNsdWRlOy4uOy4uXC4uXGxpYlxUYXJnZXRcWDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lOMzI7TkRFQlVHO19MSUI7X19TVERDX0xJTUlUX01BQ1JPUztfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFJ1bnRpbWVUeXBlSW5mbz50cnVlPC9SdW50aW1lVHlwZUluZm8+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQzNTU7NDE0Njs0ODAwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uOy4uXC4uXGluY2x1ZGU7Li47Li5cLi5cbGliXFRhcmdldFxYODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19TQ0xfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU4zMjtOREVCVUc7X0xJQjtfX1NURENfTElNSVRfTUFDUk9TO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UnVudGltZVR5cGVJbmZvPnRydWU8L1J1bnRpbWVUeXBlSW5mbz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChQcm9qZWN0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDM1NTs0MTQ2OzQ4MDA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+ZmFsc2U8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi47Li5cLi5caW5jbHVkZTsuLjsuLlwuLlxsaWJcVGFyZ2V0XFg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X1NDTF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjMyO05ERUJVRztfTElCO19fU1REQ19MSU1JVF9NQUNST1M7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxSdW50aW1lVHlwZUluZm8+dHJ1ZTwvUnVudGltZVR5cGVJbmZvPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFByb2plY3ROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MzU1OzQxNDY7NDgwMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcU1NFRG9tYWluRml4LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZBc21CYWNrZW5kLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZDb2RlRW1pdHRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZGbG9hdGluZ1BvaW50LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZJbnN0ckluZm8uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NklTZWxEQUdUb0RBRy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2SVNlbExvd2VyaW5nLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZKSVRJbmZvLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZNQ0FzbUluZm8uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Nk1DQ29kZUVtaXR0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NlJlZ2lzdGVySW5mby5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2U2VsZWN0aW9uREFHSW5mby5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2U3VidGFyZ2V0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZUYXJnZXRNYWNoaW5lLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxUYXJnZXRJbmZvXFg4NlRhcmdldEluZm8uY3BwIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q3VzdG9tQnVpbGQgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2LnRkIj4NCisgICAgICA8TWVzc2FnZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+UGVyZm9ybWluZyBUYWJsZUdlbiBTdGVwPC9NZXNzYWdlPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5lY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIHJlZ2lzdGVyIG5hbWVzIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tcmVnaXN0ZXItZW51bXMgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblJlZ2lzdGVyTmFtZXMuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSByZWdpc3RlciBpbmZvcm1hdGlvbiBoZWFkZXIgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1yZWdpc3Rlci1kZXNjLWhlYWRlciAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuUmVnaXN0ZXJJbmZvLmguaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSByZWdpc3RlciBpbmZvcm1hdGlvbiBpbXBsZW1lbnRhdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLXJlZ2lzdGVyLWRlc2MgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblJlZ2lzdGVySW5mby5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGluc3RydWN0aW9uIG5hbWVzIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4taW5zdHItZW51bXMgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4Nkdlbkluc3RyTmFtZXMuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWluc3RyLWRlc2MgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4Nkdlbkluc3RySW5mby5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGFzc2VtYmx5IHdyaXRlciB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWFzbS13cml0ZXIgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkFzbVdyaXRlci5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGFzc2VtYmx5IHdyaXRlciAjMSB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWFzbS13cml0ZXIgLWFzbXdyaXRlcm51bT0xIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5Bc21Xcml0ZXIxLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgaW1wbGVtZW50YXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1kYWctaXNlbCAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuREFHSVNlbC5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIHN1YnRhcmdldCBpbmZvcm1hdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLXN1YnRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuU3VidGFyZ2V0LmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgY2FsbGluZyBjb252ZW50aW9uIGluZm9ybWF0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tY2FsbGluZ2NvbnYgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkNhbGxpbmdDb252LmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgRmFzdCBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1mYXN0LWlzZWwgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkZhc3RJU2VsLmluYw0KKzwvQ29tbWFuZD4NCisgICAgICA8QWRkaXRpb25hbElucHV0cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShSb290RGlyKSUoRGlyZWN0b3J5KVg4Nkluc3RySW5mby50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2UmVnaXN0ZXJJbmZvLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZJbnN0ckZQU3RhY2sudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4Nkluc3RyTU1YLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZJbnN0clNTRS50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2Q2FsbGluZ0NvbnYudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KS4uXFRhcmdldC50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpLi5cVGFyZ2V0U2NoZWR1bGUudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KS4uXFRhcmdldFNjaGVkdWxlREFHLnRkOyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZTwvQWRkaXRpb25hbElucHV0cz4NCisgICAgICA8T3V0cHV0cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+WDg2R2VuUmVnaXN0ZXJOYW1lcy5pbmM7WDg2R2VuUmVnaXN0ZXJJbmZvLmguaW5jO1g4NkdlblJlZ2lzdGVySW5mby5pbmM7WDg2R2VuSW5zdHJOYW1lcy5pbmM7WDg2R2VuSW5zdHJJbmZvLmluYztYODZHZW5Bc21Xcml0ZXIuaW5jO1g4NkdlbkFzbVdyaXRlcjEuaW5jO1g4NkdlbkRBR0lTZWwuaW5jO1g4NkdlblN1YnRhcmdldC5pbmM7WDg2R2VuQ2FsbGluZ0NvbnYuaW5jO1g4NkdlbkZhc3RJU2VsLmluYzslKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICAgIDxNZXNzYWdlIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+UGVyZm9ybWluZyBUYWJsZUdlbiBTdGVwPC9NZXNzYWdlPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSByZWdpc3RlciBuYW1lcyB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLXJlZ2lzdGVyLWVudW1zIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5SZWdpc3Rlck5hbWVzLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaGVhZGVyIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tcmVnaXN0ZXItZGVzYy1oZWFkZXIgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblJlZ2lzdGVySW5mby5oLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaW1wbGVtZW50YXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1yZWdpc3Rlci1kZXNjIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5SZWdpc3RlckluZm8uaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBpbnN0cnVjdGlvbiBuYW1lcyB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWluc3RyLWVudW1zIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5JbnN0ck5hbWVzLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1pbnN0ci1kZXNjIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5JbnN0ckluZm8uaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBhc3NlbWJseSB3cml0ZXIgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1hc20td3JpdGVyIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5Bc21Xcml0ZXIuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBhc3NlbWJseSB3cml0ZXIgIzEgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1hc20td3JpdGVyIC1hc213cml0ZXJudW09MSAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuQXNtV3JpdGVyMS5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGluc3RydWN0aW9uIHNlbGVjdG9yIGltcGxlbWVudGF0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tZGFnLWlzZWwgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkRBR0lTZWwuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBzdWJ0YXJnZXQgaW5mb3JtYXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1zdWJ0YXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblN1YnRhcmdldC5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGNhbGxpbmcgY29udmVudGlvbiBpbmZvcm1hdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWNhbGxpbmdjb252IC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5DYWxsaW5nQ29udi5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIEZhc3QgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tZmFzdC1pc2VsIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5GYXN0SVNlbC5pbmMNCis8L0NvbW1hbmQ+DQorICAgICAgPEFkZGl0aW9uYWxJbnB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2SW5zdHJJbmZvLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZSZWdpc3RlckluZm8udGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4Nkluc3RyRlBTdGFjay50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2SW5zdHJNTVgudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4Nkluc3RyU1NFLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZDYWxsaW5nQ29udi50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpLi5cVGFyZ2V0LnRkOyUoUm9vdERpciklKERpcmVjdG9yeSkuLlxUYXJnZXRTY2hlZHVsZS50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpLi5cVGFyZ2V0U2NoZWR1bGVEQUcudGQ7JChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlPC9BZGRpdGlvbmFsSW5wdXRzPg0KKyAgICAgIDxPdXRwdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+WDg2R2VuUmVnaXN0ZXJOYW1lcy5pbmM7WDg2R2VuUmVnaXN0ZXJJbmZvLmguaW5jO1g4NkdlblJlZ2lzdGVySW5mby5pbmM7WDg2R2VuSW5zdHJOYW1lcy5pbmM7WDg2R2VuSW5zdHJJbmZvLmluYztYODZHZW5Bc21Xcml0ZXIuaW5jO1g4NkdlbkFzbVdyaXRlcjEuaW5jO1g4NkdlbkRBR0lTZWwuaW5jO1g4NkdlblN1YnRhcmdldC5pbmM7WDg2R2VuQ2FsbGluZ0NvbnYuaW5jO1g4NkdlbkZhc3RJU2VsLmluYzslKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICAgIDxNZXNzYWdlIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPlBlcmZvcm1pbmcgVGFibGVHZW4gU3RlcDwvTWVzc2FnZT4NCisgICAgICA8TWVzc2FnZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj5QZXJmb3JtaW5nIFRhYmxlR2VuIFN0ZXA8L01lc3NhZ2U+DQorICAgICAgPENvbW1hbmQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSByZWdpc3RlciBuYW1lcyB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLXJlZ2lzdGVyLWVudW1zIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5SZWdpc3Rlck5hbWVzLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaGVhZGVyIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tcmVnaXN0ZXItZGVzYy1oZWFkZXIgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblJlZ2lzdGVySW5mby5oLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaW1wbGVtZW50YXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1yZWdpc3Rlci1kZXNjIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5SZWdpc3RlckluZm8uaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBpbnN0cnVjdGlvbiBuYW1lcyB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWluc3RyLWVudW1zIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5JbnN0ck5hbWVzLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1pbnN0ci1kZXNjIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5JbnN0ckluZm8uaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBhc3NlbWJseSB3cml0ZXIgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1hc20td3JpdGVyIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5Bc21Xcml0ZXIuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBhc3NlbWJseSB3cml0ZXIgIzEgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1hc20td3JpdGVyIC1hc213cml0ZXJudW09MSAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuQXNtV3JpdGVyMS5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGluc3RydWN0aW9uIHNlbGVjdG9yIGltcGxlbWVudGF0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tZGFnLWlzZWwgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkRBR0lTZWwuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBzdWJ0YXJnZXQgaW5mb3JtYXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1zdWJ0YXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblN1YnRhcmdldC5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGNhbGxpbmcgY29udmVudGlvbiBpbmZvcm1hdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWNhbGxpbmdjb252IC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5DYWxsaW5nQ29udi5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIEZhc3QgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tZmFzdC1pc2VsIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5GYXN0SVNlbC5pbmMNCis8L0NvbW1hbmQ+DQorICAgICAgPENvbW1hbmQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+ZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSByZWdpc3RlciBuYW1lcyB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLXJlZ2lzdGVyLWVudW1zIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5SZWdpc3Rlck5hbWVzLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaGVhZGVyIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tcmVnaXN0ZXItZGVzYy1oZWFkZXIgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblJlZ2lzdGVySW5mby5oLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaW1wbGVtZW50YXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1yZWdpc3Rlci1kZXNjIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5SZWdpc3RlckluZm8uaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBpbnN0cnVjdGlvbiBuYW1lcyB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWluc3RyLWVudW1zIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5JbnN0ck5hbWVzLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1pbnN0ci1kZXNjIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5JbnN0ckluZm8uaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBhc3NlbWJseSB3cml0ZXIgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1hc20td3JpdGVyIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5Bc21Xcml0ZXIuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBhc3NlbWJseSB3cml0ZXIgIzEgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1hc20td3JpdGVyIC1hc213cml0ZXJudW09MSAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuQXNtV3JpdGVyMS5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGluc3RydWN0aW9uIHNlbGVjdG9yIGltcGxlbWVudGF0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tZGFnLWlzZWwgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkRBR0lTZWwuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBzdWJ0YXJnZXQgaW5mb3JtYXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1zdWJ0YXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblN1YnRhcmdldC5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGNhbGxpbmcgY29udmVudGlvbiBpbmZvcm1hdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWNhbGxpbmdjb252IC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5DYWxsaW5nQ29udi5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIEZhc3QgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tZmFzdC1pc2VsIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5GYXN0SVNlbC5pbmMNCis8L0NvbW1hbmQ+DQorICAgICAgPEFkZGl0aW9uYWxJbnB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShSb290RGlyKSUoRGlyZWN0b3J5KVg4Nkluc3RySW5mby50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2UmVnaXN0ZXJJbmZvLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZJbnN0ckZQU3RhY2sudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4Nkluc3RyTU1YLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZJbnN0clNTRS50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2Q2FsbGluZ0NvbnYudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KS4uXFRhcmdldC50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpLi5cVGFyZ2V0U2NoZWR1bGUudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KS4uXFRhcmdldFNjaGVkdWxlREFHLnRkOyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZTwvQWRkaXRpb25hbElucHV0cz4NCisgICAgICA8QWRkaXRpb25hbElucHV0cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4lKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2SW5zdHJJbmZvLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZSZWdpc3RlckluZm8udGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4Nkluc3RyRlBTdGFjay50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2SW5zdHJNTVgudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4Nkluc3RyU1NFLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZDYWxsaW5nQ29udi50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpLi5cVGFyZ2V0LnRkOyUoUm9vdERpciklKERpcmVjdG9yeSkuLlxUYXJnZXRTY2hlZHVsZS50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpLi5cVGFyZ2V0U2NoZWR1bGVEQUcudGQ7JChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlPC9BZGRpdGlvbmFsSW5wdXRzPg0KKyAgICAgIDxPdXRwdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPlg4NkdlblJlZ2lzdGVyTmFtZXMuaW5jO1g4NkdlblJlZ2lzdGVySW5mby5oLmluYztYODZHZW5SZWdpc3RlckluZm8uaW5jO1g4Nkdlbkluc3RyTmFtZXMuaW5jO1g4Nkdlbkluc3RySW5mby5pbmM7WDg2R2VuQXNtV3JpdGVyLmluYztYODZHZW5Bc21Xcml0ZXIxLmluYztYODZHZW5EQUdJU2VsLmluYztYODZHZW5TdWJ0YXJnZXQuaW5jO1g4NkdlbkNhbGxpbmdDb252LmluYztYODZHZW5GYXN0SVNlbC5pbmM7JShPdXRwdXRzKTwvT3V0cHV0cz4NCisgICAgICA8T3V0cHV0cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj5YODZHZW5SZWdpc3Rlck5hbWVzLmluYztYODZHZW5SZWdpc3RlckluZm8uaC5pbmM7WDg2R2VuUmVnaXN0ZXJJbmZvLmluYztYODZHZW5JbnN0ck5hbWVzLmluYztYODZHZW5JbnN0ckluZm8uaW5jO1g4NkdlbkFzbVdyaXRlci5pbmM7WDg2R2VuQXNtV3JpdGVyMS5pbmM7WDg2R2VuREFHSVNlbC5pbmM7WDg2R2VuU3VidGFyZ2V0LmluYztYODZHZW5DYWxsaW5nQ29udi5pbmM7WDg2R2VuRmFzdElTZWwuaW5jOyUoT3V0cHV0cyk8L091dHB1dHM+DQorICAgICAgPE1lc3NhZ2UgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPlBlcmZvcm1pbmcgVGFibGVHZW4gU3RlcDwvTWVzc2FnZT4NCisgICAgICA8TWVzc2FnZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+UGVyZm9ybWluZyBUYWJsZUdlbiBTdGVwPC9NZXNzYWdlPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5lY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIHJlZ2lzdGVyIG5hbWVzIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tcmVnaXN0ZXItZW51bXMgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblJlZ2lzdGVyTmFtZXMuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSByZWdpc3RlciBpbmZvcm1hdGlvbiBoZWFkZXIgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1yZWdpc3Rlci1kZXNjLWhlYWRlciAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuUmVnaXN0ZXJJbmZvLmguaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSByZWdpc3RlciBpbmZvcm1hdGlvbiBpbXBsZW1lbnRhdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLXJlZ2lzdGVyLWRlc2MgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblJlZ2lzdGVySW5mby5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGluc3RydWN0aW9uIG5hbWVzIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4taW5zdHItZW51bXMgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4Nkdlbkluc3RyTmFtZXMuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWluc3RyLWRlc2MgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4Nkdlbkluc3RySW5mby5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGFzc2VtYmx5IHdyaXRlciB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWFzbS13cml0ZXIgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkFzbVdyaXRlci5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGFzc2VtYmx5IHdyaXRlciAjMSB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWFzbS13cml0ZXIgLWFzbXdyaXRlcm51bT0xIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5Bc21Xcml0ZXIxLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgaW1wbGVtZW50YXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1kYWctaXNlbCAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuREFHSVNlbC5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIHN1YnRhcmdldCBpbmZvcm1hdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLXN1YnRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuU3VidGFyZ2V0LmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgY2FsbGluZyBjb252ZW50aW9uIGluZm9ybWF0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tY2FsbGluZ2NvbnYgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkNhbGxpbmdDb252LmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgRmFzdCBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1mYXN0LWlzZWwgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkZhc3RJU2VsLmluYw0KKzwvQ29tbWFuZD4NCisgICAgICA8Q29tbWFuZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+ZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSByZWdpc3RlciBuYW1lcyB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLXJlZ2lzdGVyLWVudW1zIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5SZWdpc3Rlck5hbWVzLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaGVhZGVyIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tcmVnaXN0ZXItZGVzYy1oZWFkZXIgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblJlZ2lzdGVySW5mby5oLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaW1wbGVtZW50YXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1yZWdpc3Rlci1kZXNjIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5SZWdpc3RlckluZm8uaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBpbnN0cnVjdGlvbiBuYW1lcyB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWluc3RyLWVudW1zIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5JbnN0ck5hbWVzLmluYw0KK2VjaG8gQnVpbGRpbmcgJShGaWxlbmFtZSklKEV4dGVuc2lvbikgaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1pbnN0ci1kZXNjIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5JbnN0ckluZm8uaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBhc3NlbWJseSB3cml0ZXIgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1hc20td3JpdGVyIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5Bc21Xcml0ZXIuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBhc3NlbWJseSB3cml0ZXIgIzEgd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1hc20td3JpdGVyIC1hc213cml0ZXJudW09MSAtSSAuLlwuLlxsaWJcVGFyZ2V0IC1JIC4uXC4uXGxpYlxUYXJnZXRcWDg2IC1JIC4uXC4uXGluY2x1ZGUgJShGdWxsUGF0aCkgLW8gWDg2R2VuQXNtV3JpdGVyMS5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGluc3RydWN0aW9uIHNlbGVjdG9yIGltcGxlbWVudGF0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tZGFnLWlzZWwgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlbkRBR0lTZWwuaW5jDQorZWNobyBCdWlsZGluZyAlKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKSBzdWJ0YXJnZXQgaW5mb3JtYXRpb24gd2l0aCB0YmxnZW4NCiskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGUgLWdlbi1zdWJ0YXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldCAtSSAuLlwuLlxsaWJcVGFyZ2V0XFg4NiAtSSAuLlwuLlxpbmNsdWRlICUoRnVsbFBhdGgpIC1vIFg4NkdlblN1YnRhcmdldC5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIGNhbGxpbmcgY29udmVudGlvbiBpbmZvcm1hdGlvbiB3aXRoIHRibGdlbg0KKyQoUHJvamVjdERpcikuLlxUYWJsZUdlblwkKENvbmZpZ3VyYXRpb24pXFRhYmxlR2VuLmV4ZSAtZ2VuLWNhbGxpbmdjb252IC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5DYWxsaW5nQ29udi5pbmMNCitlY2hvIEJ1aWxkaW5nICUoRmlsZW5hbWUpJShFeHRlbnNpb24pIEZhc3QgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHdpdGggdGJsZ2VuDQorJChQcm9qZWN0RGlyKS4uXFRhYmxlR2VuXCQoQ29uZmlndXJhdGlvbilcVGFibGVHZW4uZXhlIC1nZW4tZmFzdC1pc2VsIC1JIC4uXC4uXGxpYlxUYXJnZXQgLUkgLi5cLi5cbGliXFRhcmdldFxYODYgLUkgLi5cLi5caW5jbHVkZSAlKEZ1bGxQYXRoKSAtbyBYODZHZW5GYXN0SVNlbC5pbmMNCis8L0NvbW1hbmQ+DQorICAgICAgPEFkZGl0aW9uYWxJbnB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoUm9vdERpciklKERpcmVjdG9yeSlYODZJbnN0ckluZm8udGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4NlJlZ2lzdGVySW5mby50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2SW5zdHJGUFN0YWNrLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZJbnN0ck1NWC50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2SW5zdHJTU0UudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4NkNhbGxpbmdDb252LnRkOyUoUm9vdERpciklKERpcmVjdG9yeSkuLlxUYXJnZXQudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KS4uXFRhcmdldFNjaGVkdWxlLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSkuLlxUYXJnZXRTY2hlZHVsZURBRy50ZDskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGU8L0FkZGl0aW9uYWxJbnB1dHM+DQorICAgICAgPEFkZGl0aW9uYWxJbnB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPiUoUm9vdERpciklKERpcmVjdG9yeSlYODZJbnN0ckluZm8udGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4NlJlZ2lzdGVySW5mby50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2SW5zdHJGUFN0YWNrLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSlYODZJbnN0ck1NWC50ZDslKFJvb3REaXIpJShEaXJlY3RvcnkpWDg2SW5zdHJTU0UudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KVg4NkNhbGxpbmdDb252LnRkOyUoUm9vdERpciklKERpcmVjdG9yeSkuLlxUYXJnZXQudGQ7JShSb290RGlyKSUoRGlyZWN0b3J5KS4uXFRhcmdldFNjaGVkdWxlLnRkOyUoUm9vdERpciklKERpcmVjdG9yeSkuLlxUYXJnZXRTY2hlZHVsZURBRy50ZDskKFByb2plY3REaXIpLi5cVGFibGVHZW5cJChDb25maWd1cmF0aW9uKVxUYWJsZUdlbi5leGU8L0FkZGl0aW9uYWxJbnB1dHM+DQorICAgICAgPE91dHB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPlg4NkdlblJlZ2lzdGVyTmFtZXMuaW5jO1g4NkdlblJlZ2lzdGVySW5mby5oLmluYztYODZHZW5SZWdpc3RlckluZm8uaW5jO1g4Nkdlbkluc3RyTmFtZXMuaW5jO1g4Nkdlbkluc3RySW5mby5pbmM7WDg2R2VuQXNtV3JpdGVyLmluYztYODZHZW5Bc21Xcml0ZXIxLmluYztYODZHZW5EQUdJU2VsLmluYztYODZHZW5TdWJ0YXJnZXQuaW5jO1g4NkdlbkNhbGxpbmdDb252LmluYztYODZHZW5GYXN0SVNlbC5pbmM7JShPdXRwdXRzKTwvT3V0cHV0cz4NCisgICAgICA8T3V0cHV0cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+WDg2R2VuUmVnaXN0ZXJOYW1lcy5pbmM7WDg2R2VuUmVnaXN0ZXJJbmZvLmguaW5jO1g4NkdlblJlZ2lzdGVySW5mby5pbmM7WDg2R2VuSW5zdHJOYW1lcy5pbmM7WDg2R2VuSW5zdHJJbmZvLmluYztYODZHZW5Bc21Xcml0ZXIuaW5jO1g4NkdlbkFzbVdyaXRlcjEuaW5jO1g4NkdlbkRBR0lTZWwuaW5jO1g4NkdlblN1YnRhcmdldC5pbmM7WDg2R2VuQ2FsbGluZ0NvbnYuaW5jO1g4NkdlbkZhc3RJU2VsLmluYzslKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICA8L0N1c3RvbUJ1aWxkPg0KKyAgICA8Q3VzdG9tQnVpbGQgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2Q29tcGlsYXRpb25DYWxsYmFja19XaW42NC5hc20iPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+bWw2NC5leGUgL2MgL25vbG9nbyAvRm8gIiQoSW50RGlyKVg4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfV2luNjQub2JqIiAvWmkgJShGdWxsUGF0aCkNCis8L0NvbW1hbmQ+DQorICAgICAgPE91dHB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKEludERpcilYODZDb21waWxhdGlvbkNhbGxiYWNrX1dpbjY0Lm9iajslKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5tbDY0LmV4ZSAvYyAvbm9sb2dvIC9GbyAiJChJbnREaXIpWDg2Q29tcGlsYXRpb25DYWxsYmFja19XaW42NC5vYmoiIC9aaSAlKEZ1bGxQYXRoKQ0KKzwvQ29tbWFuZD4NCisgICAgICA8Q29tbWFuZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+bWw2NC5leGUgL2MgL25vbG9nbyAvRm8gIiQoSW50RGlyKVg4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfV2luNjQub2JqIiAvWmkgJShGdWxsUGF0aCkNCis8L0NvbW1hbmQ+DQorICAgICAgPE91dHB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiQoSW50RGlyKVg4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfV2luNjQub2JqOyUoT3V0cHV0cyk8L091dHB1dHM+DQorICAgICAgPE91dHB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPiQoSW50RGlyKVg4NkNvbXBpbGF0aW9uQ2FsbGJhY2tfV2luNjQub2JqOyUoT3V0cHV0cyk8L091dHB1dHM+DQorICAgIDwvQ3VzdG9tQnVpbGQ+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Nkluc3RyRm9ybWF0cy50ZCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2Q2FsbGluZ0NvbnYudGQiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Nkluc3RyRlBTdGFjay50ZCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2SW5zdHJJbmZvLnRkIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZJbnN0ck1NWC50ZCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2SW5zdHJTU0UudGQiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NlJlZ2lzdGVySW5mby50ZCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iWDg2R2VuQXNtV3JpdGVyLmluYyIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iWDg2R2VuQXNtV3JpdGVyMS5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ilg4NkdlbkRBR0lTZWwuaW5jIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5GYXN0SVNlbC5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ilg4Nkdlbkluc3RySW5mby5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ilg4Nkdlbkluc3RyTmFtZXMuaW5jIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5SZWdpc3RlckluZm8uaC5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ilg4NkdlblJlZ2lzdGVySW5mby5pbmMiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9Ilg4NkdlblJlZ2lzdGVyTmFtZXMuaW5jIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5TdWJ0YXJnZXQuaW5jIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Ni5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NkFzbVByaW50ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZDT0ZGTWFjaGluZU1vZHVsZUluZm8uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZFTEZXcml0ZXJJbmZvLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2Rml4dXBLaW5kcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Nkluc3RyQnVpbGRlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Nkluc3RySW5mby5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NklTZWxMb3dlcmluZy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NkpJVEluZm8uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZNYWNoaW5lRnVuY3Rpb25JbmZvLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2TUNBc21JbmZvLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2TUNJbnN0TG93ZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZSZWdpc3RlckluZm8uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZSZWxvY2F0aW9ucy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NlNlbGVjdGlvbkRBR0luZm8uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZTdWJ0YXJnZXQuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZUYXJnZXRNYWNoaW5lLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2VGFyZ2V0T2JqZWN0RmlsZS5oIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9MTFZNL3dpbjMyL3g4Ni94ODYudmN4cHJvai5maWx0ZXJzIGIvc3JjL0xMVk0vd2luMzIveDg2L3g4Ni52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwOGRiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9MTFZNL3dpbjMyL3g4Ni94ODYudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMTg2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzXFRhcmdldEluZm8iPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnthZTIxMDQ5Mi00YTdhLTQ0NTItYjAwZi05ZGE4MGI2OTI0NDN9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iR2VuZXJhdGVkIFRhYmxlZ2VuIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NzU2YWMwZDctYWQ1OS00OTdlLWFkMWUtZDcwZmYyZjhjM2E0fTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgPC9GaWx0ZXI+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcU1NFRG9tYWluRml4LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2QXNtQmFja2VuZC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NkNvZGVFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2RmxvYXRpbmdQb2ludC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Nkluc3RySW5mby5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NklTZWxEQUdUb0RBRy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NklTZWxMb3dlcmluZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NkpJVEluZm8uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZNQ0FzbUluZm8uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZNQ0NvZGVFbWl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2UmVnaXN0ZXJJbmZvLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2U2VsZWN0aW9uREFHSW5mby5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NlN1YnRhcmdldC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NlRhcmdldE1hY2hpbmUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxUYXJnZXRJbmZvXFg4NlRhcmdldEluZm8uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xUYXJnZXRJbmZvPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZJbnN0ckZvcm1hdHMudGQiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2Q2FsbGluZ0NvbnYudGQiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2SW5zdHJGUFN0YWNrLnRkIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Nkluc3RySW5mby50ZCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZJbnN0ck1NWC50ZCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZJbnN0clNTRS50ZCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZSZWdpc3RlckluZm8udGQiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iWDg2R2VuQXNtV3JpdGVyLmluYyI+DQorICAgICAgPEZpbHRlcj5HZW5lcmF0ZWQgVGFibGVnZW4gRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5Bc21Xcml0ZXIxLmluYyI+DQorICAgICAgPEZpbHRlcj5HZW5lcmF0ZWQgVGFibGVnZW4gRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5EQUdJU2VsLmluYyI+DQorICAgICAgPEZpbHRlcj5HZW5lcmF0ZWQgVGFibGVnZW4gRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5GYXN0SVNlbC5pbmMiPg0KKyAgICAgIDxGaWx0ZXI+R2VuZXJhdGVkIFRhYmxlZ2VuIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iWDg2R2VuSW5zdHJJbmZvLmluYyI+DQorICAgICAgPEZpbHRlcj5HZW5lcmF0ZWQgVGFibGVnZW4gRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5JbnN0ck5hbWVzLmluYyI+DQorICAgICAgPEZpbHRlcj5HZW5lcmF0ZWQgVGFibGVnZW4gRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5SZWdpc3RlckluZm8uaC5pbmMiPg0KKyAgICAgIDxGaWx0ZXI+R2VuZXJhdGVkIFRhYmxlZ2VuIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iWDg2R2VuUmVnaXN0ZXJJbmZvLmluYyI+DQorICAgICAgPEZpbHRlcj5HZW5lcmF0ZWQgVGFibGVnZW4gRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5SZWdpc3Rlck5hbWVzLmluYyI+DQorICAgICAgPEZpbHRlcj5HZW5lcmF0ZWQgVGFibGVnZW4gRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJYODZHZW5TdWJ0YXJnZXQuaW5jIj4NCisgICAgICA8RmlsdGVyPkdlbmVyYXRlZCBUYWJsZWdlbiBGaWxlczwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2LmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NkFzbVByaW50ZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2Q09GRk1hY2hpbmVNb2R1bGVJbmZvLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NkVMRldyaXRlckluZm8uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2Rml4dXBLaW5kcy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZJbnN0ckJ1aWxkZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2SW5zdHJJbmZvLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NklTZWxMb3dlcmluZy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZKSVRJbmZvLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Nk1hY2hpbmVGdW5jdGlvbkluZm8uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cbGliXFRhcmdldFxYODZcWDg2TUNBc21JbmZvLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4Nk1DSW5zdExvd2VyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NlJlZ2lzdGVySW5mby5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZSZWxvY2F0aW9ucy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZTZWxlY3Rpb25EQUdJbmZvLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NlN1YnRhcmdldC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZUYXJnZXRNYWNoaW5lLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGxpYlxUYXJnZXRcWDg2XFg4NlRhcmdldE9iamVjdEZpbGUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDdXN0b21CdWlsZCBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODYudGQiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ3VzdG9tQnVpbGQ+DQorICAgIDxDdXN0b21CdWlsZCBJbmNsdWRlPSIuLlwuLlxsaWJcVGFyZ2V0XFg4NlxYODZDb21waWxhdGlvbkNhbGxiYWNrX1dpbjY0LmFzbSI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DdXN0b21CdWlsZD4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvTWFpbi9DUkMuY3BwIGIvc3JjL01haW4vQ1JDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI4OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL01haW4vQ1JDLmNwcApAQCAtMCwwICsxLDIzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgY3JjLmMKKyAqIAorICogRGVzY3JpcHRpb246IFNsb3cgYW5kIGZhc3QgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBDUkMgc3RhbmRhcmRzLgorICoKKyAqIE5vdGVzOiAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgZWFjaCBzdXBwb3J0ZWQgQ1JDIHN0YW5kYXJkIGFyZQorICoJCQkJZGVmaW5lZCBpbiB0aGUgaGVhZGVyIGZpbGUgY3JjLmguICBUaGUgaW1wbGVtZW50YXRpb25zCisgKgkJCQloZXJlIHNob3VsZCBzdGFuZCB1cCB0byBmdXJ0aGVyIGFkZGl0aW9ucyB0byB0aGF0IGxpc3QuCisgKgorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgYnkgTWljaGFlbCBCYXJyLiAgVGhpcyBzb2Z0d2FyZSBpcyBwbGFjZWQgaW50bworICogdGhlIHB1YmxpYyBkb21haW4gYW5kIG1heSBiZSB1c2VkIGZvciBhbnkgcHVycG9zZS4gIEhvd2V2ZXIsIHRoaXMKKyAqIG5vdGljZSBtdXN0IG5vdCBiZSBjaGFuZ2VkIG9yIHJlbW92ZWQgYW5kIG5vIHdhcnJhbnR5IGlzIGVpdGhlcgorICogZXhwcmVzc2VkIG9yIGltcGxpZWQgYnkgaXRzIHB1YmxpY2F0aW9uIG9yIGRpc3RyaWJ1dGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorI2luY2x1ZGUgImNyYy5oIgorCisKKy8qCisgKiBEZXJpdmUgcGFyYW1ldGVycyBmcm9tIHRoZSBzdGFuZGFyZC1zcGVjaWZpYyBwYXJhbWV0ZXJzIGluIGNyYy5oLgorICovCisjZGVmaW5lIFdJRFRIICAgICg4ICogc2l6ZW9mKGNyYykpCisjZGVmaW5lIFRPUEJJVCAgICgxIDw8IChXSURUSCAtIDEpKQorCisjaWYgKFJFRkxFQ1RfREFUQSA9PSBUUlVFKQorI3VuZGVmICBSRUZMRUNUX0RBVEEKKyNkZWZpbmUgUkVGTEVDVF9EQVRBKFgpCQkJKCh1bnNpZ25lZCBjaGFyKSByZWZsZWN0KChYKSwgOCkpCisjZWxzZQorI3VuZGVmICBSRUZMRUNUX0RBVEEKKyNkZWZpbmUgUkVGTEVDVF9EQVRBKFgpCQkJKFgpCisjZW5kaWYKKworI2lmIChSRUZMRUNUX1JFTUFJTkRFUiA9PSBUUlVFKQorI3VuZGVmICBSRUZMRUNUX1JFTUFJTkRFUgorI2RlZmluZSBSRUZMRUNUX1JFTUFJTkRFUihYKQkoKGNyYykgcmVmbGVjdCgoWCksIFdJRFRIKSkKKyNlbHNlCisjdW5kZWYgIFJFRkxFQ1RfUkVNQUlOREVSCisjZGVmaW5lIFJFRkxFQ1RfUkVNQUlOREVSKFgpCShYKQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZ1bmN0aW9uOiAgICByZWZsZWN0KCkKKyAqIAorICogRGVzY3JpcHRpb246IFJlb3JkZXIgdGhlIGJpdHMgb2YgYSBiaW5hcnkgc2VxdWVuY2UsIGJ5IHJlZmxlY3RpbmcKKyAqCQkJCXRoZW0gYWJvdXQgdGhlIG1pZGRsZSBwb3NpdGlvbi4KKyAqCisgKiBOb3RlczoJCU5vIGNoZWNraW5nIGlzIGRvbmUgdGhhdCBuQml0cyA8PSAzMi4KKyAqCisgKiBSZXR1cm5zOgkJVGhlIHJlZmxlY3Rpb24gb2YgdGhlIG9yaWdpbmFsIGRhdGEuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCityZWZsZWN0KHVuc2lnbmVkIGxvbmcgZGF0YSwgdW5zaWduZWQgY2hhciBuQml0cykKK3sKKwl1bnNpZ25lZCBsb25nICByZWZsZWN0aW9uID0gMHgwMDAwMDAwMDsKKwl1bnNpZ25lZCBjaGFyICBiaXQ7CisKKwkvKgorCSAqIFJlZmxlY3QgdGhlIGRhdGEgYWJvdXQgdGhlIGNlbnRlciBiaXQuCisJICovCisJZm9yIChiaXQgPSAwOyBiaXQgPCBuQml0czsgKytiaXQpCisJeworCQkvKgorCQkgKiBJZiB0aGUgTFNCIGJpdCBpcyBzZXQsIHNldCB0aGUgcmVmbGVjdGlvbiBvZiBpdC4KKwkJICovCisJCWlmIChkYXRhICYgMHgwMSkKKwkJeworCQkJcmVmbGVjdGlvbiB8PSAoMSA8PCAoKG5CaXRzIC0gMSkgLSBiaXQpKTsKKwkJfQorCisJCWRhdGEgPSAoZGF0YSA+PiAxKTsKKwl9CisKKwlyZXR1cm4gKHJlZmxlY3Rpb24pOworCit9CS8qIHJlZmxlY3QoKSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGdW5jdGlvbjogICAgY3JjU2xvdygpCisgKiAKKyAqIERlc2NyaXB0aW9uOiBDb21wdXRlIHRoZSBDUkMgb2YgYSBnaXZlbiBtZXNzYWdlLgorICoKKyAqIE5vdGVzOgkJCisgKgorICogUmV0dXJuczoJCVRoZSBDUkMgb2YgdGhlIG1lc3NhZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NyYworY3JjU2xvdyh1bnNpZ25lZCBjaGFyIGNvbnN0IG1lc3NhZ2VbXSwgaW50IG5CeXRlcykKK3sKKyAgICBjcmMgICAgICAgICAgICByZW1haW5kZXIgPSBJTklUSUFMX1JFTUFJTkRFUjsKKwlpbnQgICAgICAgICAgICBieXRlOworCXVuc2lnbmVkIGNoYXIgIGJpdDsKKworCisgICAgLyoKKyAgICAgKiBQZXJmb3JtIG1vZHVsby0yIGRpdmlzaW9uLCBhIGJ5dGUgYXQgYSB0aW1lLgorICAgICAqLworICAgIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBuQnl0ZXM7ICsrYnl0ZSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJyaW5nIHRoZSBuZXh0IGJ5dGUgaW50byB0aGUgcmVtYWluZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcmVtYWluZGVyIF49IChSRUZMRUNUX0RBVEEobWVzc2FnZVtieXRlXSkgPDwgKFdJRFRIIC0gOCkpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFBlcmZvcm0gbW9kdWxvLTIgZGl2aXNpb24sIGEgYml0IGF0IGEgdGltZS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoYml0ID0gODsgYml0ID4gMDsgLS1iaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUcnkgdG8gZGl2aWRlIHRoZSBjdXJyZW50IGRhdGEgYml0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocmVtYWluZGVyICYgVE9QQklUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IChyZW1haW5kZXIgPDwgMSkgXiBQT0xZTk9NSUFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IChyZW1haW5kZXIgPDwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBmaW5hbCByZW1haW5kZXIgaXMgdGhlIENSQyByZXN1bHQuCisgICAgICovCisgICAgcmV0dXJuIChSRUZMRUNUX1JFTUFJTkRFUihyZW1haW5kZXIpIF4gRklOQUxfWE9SX1ZBTFVFKTsKKworfSAgIC8qIGNyY1Nsb3coKSAqLworCisKK2NyYyAgY3JjVGFibGVbMjU2XTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVuY3Rpb246ICAgIGNyY0luaXQoKQorICogCisgKiBEZXNjcmlwdGlvbjogUG9wdWxhdGUgdGhlIHBhcnRpYWwgQ1JDIGxvb2t1cCB0YWJsZS4KKyAqCisgKiBOb3RlczoJCVRoaXMgZnVuY3Rpb24gbXVzdCBiZSByZXJ1biBhbnkgdGltZSB0aGUgQ1JDIHN0YW5kYXJkCisgKgkJCQlpcyBjaGFuZ2VkLiAgSWYgZGVzaXJlZCwgaXQgY2FuIGJlIHJ1biAib2ZmbGluZSIgYW5kCisgKgkJCQl0aGUgdGFibGUgcmVzdWx0cyBzdG9yZWQgaW4gYW4gZW1iZWRkZWQgc3lzdGVtJ3MgUk9NLgorICoKKyAqIFJldHVybnM6CQlOb25lIGRlZmluZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2NyY0luaXQodm9pZCkKK3sKKyAgICBjcmMJCQkgICByZW1haW5kZXI7CisJaW50CQkJICAgZGl2aWRlbmQ7CisJdW5zaWduZWQgY2hhciAgYml0OworCisKKyAgICAvKgorICAgICAqIENvbXB1dGUgdGhlIHJlbWFpbmRlciBvZiBlYWNoIHBvc3NpYmxlIGRpdmlkZW5kLgorICAgICAqLworICAgIGZvciAoZGl2aWRlbmQgPSAwOyBkaXZpZGVuZCA8IDI1NjsgKytkaXZpZGVuZCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFN0YXJ0IHdpdGggdGhlIGRpdmlkZW5kIGZvbGxvd2VkIGJ5IHplcm9zLgorICAgICAgICAgKi8KKyAgICAgICAgcmVtYWluZGVyID0gZGl2aWRlbmQgPDwgKFdJRFRIIC0gOCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUGVyZm9ybSBtb2R1bG8tMiBkaXZpc2lvbiwgYSBiaXQgYXQgYSB0aW1lLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChiaXQgPSA4OyBiaXQgPiAwOyAtLWJpdCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRyeSB0byBkaXZpZGUgdGhlIGN1cnJlbnQgZGF0YSBiaXQuCisgICAgICAgICAgICAgKi8JCQkKKyAgICAgICAgICAgIGlmIChyZW1haW5kZXIgJiBUT1BCSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gKHJlbWFpbmRlciA8PCAxKSBeIFBPTFlOT01JQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gKHJlbWFpbmRlciA8PCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN0b3JlIHRoZSByZXN1bHQgaW50byB0aGUgdGFibGUuCisgICAgICAgICAqLworICAgICAgICBjcmNUYWJsZVtkaXZpZGVuZF0gPSByZW1haW5kZXI7CisgICAgfQorCit9ICAgLyogY3JjSW5pdCgpICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZ1bmN0aW9uOiAgICBjcmNGYXN0KCkKKyAqIAorICogRGVzY3JpcHRpb246IENvbXB1dGUgdGhlIENSQyBvZiBhIGdpdmVuIG1lc3NhZ2UuCisgKgorICogTm90ZXM6CQljcmNJbml0KCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QuCisgKgorICogUmV0dXJuczoJCVRoZSBDUkMgb2YgdGhlIG1lc3NhZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NyYworY3JjRmFzdCh1bnNpZ25lZCBjaGFyIGNvbnN0IG1lc3NhZ2VbXSwgaW50IG5CeXRlcykKK3sKKyAgICBjcmMJICAgICAgICAgICByZW1haW5kZXIgPSBJTklUSUFMX1JFTUFJTkRFUjsKKyAgICB1bnNpZ25lZCBjaGFyICBkYXRhOworCWludCAgICAgICAgICAgIGJ5dGU7CisKKworICAgIC8qCisgICAgICogRGl2aWRlIHRoZSBtZXNzYWdlIGJ5IHRoZSBwb2x5bm9taWFsLCBhIGJ5dGUgYXQgYSB0aW1lLgorICAgICAqLworICAgIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBuQnl0ZXM7ICsrYnl0ZSkKKyAgICB7CisgICAgICAgIGRhdGEgPSBSRUZMRUNUX0RBVEEobWVzc2FnZVtieXRlXSkgXiAocmVtYWluZGVyID4+IChXSURUSCAtIDgpKTsKKyAgCQlyZW1haW5kZXIgPSBjcmNUYWJsZVtkYXRhXSBeIChyZW1haW5kZXIgPDwgOCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgZmluYWwgcmVtYWluZGVyIGlzIHRoZSBDUkMuCisgICAgICovCisgICAgcmV0dXJuIChSRUZMRUNUX1JFTUFJTkRFUihyZW1haW5kZXIpIF4gRklOQUxfWE9SX1ZBTFVFKTsKKworfSAgIC8qIGNyY0Zhc3QoKSAqLwpkaWZmIC0tZ2l0IGEvc3JjL01haW4vQ29uZmlnLmNwcCBiL3NyYy9NYWluL0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwYTRjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL0NvbmZpZy5jcHAKQEAgLTAsMCArMSw3NCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKworI2luY2x1ZGUgIlRocmVhZC5ocHAiCisjaW5jbHVkZSAiVGltZXIuaHBwIgorCisjaWYgUEVSRl9QUk9GSUxFCitQcm9maWxlciBwcm9maWxlcjsKKworUHJvZmlsZXI6OlByb2ZpbGVyKCkKK3sKKwlyZXNldCgpOworfQorCit2b2lkIFByb2ZpbGVyOjpyZXNldCgpCit7CisJZnJhbWVzU2VjID0gMDsKKwlmcmFtZXNUb3RhbCA9IDA7CisJRlBTID0gMDsKKwkKKwlmb3IoaW50IGkgPSAwOyBpIDwgUEVSRl9USU1FUlM7IGkrKykKKwl7CisJCWN5Y2xlc1tpXSA9IDA7CisJfQorCisJcm9wT3BlcmF0aW9ucyA9IDA7CisJcm9wT3BlcmF0aW9uc1RvdGFsID0gMDsKKwlyb3BPcGVyYXRpb25zRnJhbWUgPSAwOworCQorCXRleE9wZXJhdGlvbnMgPSAwOworCXRleE9wZXJhdGlvbnNUb3RhbCA9IDA7CisJdGV4T3BlcmF0aW9uc0ZyYW1lID0gMDsKKwkKKwljb21wcmVzc2VkVGV4ID0gMDsKKwljb21wcmVzc2VkVGV4VG90YWwgPSAwOworCWNvbXByZXNzZWRUZXhGcmFtZSA9IDA7Cit9OworCit2b2lkIFByb2ZpbGVyOjpuZXh0RnJhbWUoKQoreworCXJvcE9wZXJhdGlvbnNGcmFtZSA9IHN3OjphdG9taWNFeGNoYW5nZSgmcm9wT3BlcmF0aW9ucywgMCk7CisJdGV4T3BlcmF0aW9uc0ZyYW1lID0gc3c6OmF0b21pY0V4Y2hhbmdlKCZ0ZXhPcGVyYXRpb25zLCAwKTsKKwljb21wcmVzc2VkVGV4RnJhbWUgPSBzdzo6YXRvbWljRXhjaGFuZ2UoJmNvbXByZXNzZWRUZXgsIDApOworCisJcm9wT3BlcmF0aW9uc1RvdGFsICs9IHJvcE9wZXJhdGlvbnNGcmFtZTsKKwl0ZXhPcGVyYXRpb25zVG90YWwgKz0gdGV4T3BlcmF0aW9uc0ZyYW1lOworCWNvbXByZXNzZWRUZXhUb3RhbCArPSBjb21wcmVzc2VkVGV4RnJhbWU7CisKKwlzdGF0aWMgZG91YmxlIGZwc1RpbWUgPSBzdzo6VGltZXI6OnNlY29uZHMoKTsKKworCWRvdWJsZSB0aW1lID0gc3c6OlRpbWVyOjpzZWNvbmRzKCk7CisJZG91YmxlIGRlbHRhID0gdGltZSAtIGZwc1RpbWU7CisJZnJhbWVzU2VjKys7CisKKwlpZihkZWx0YSA+IDEuMCkKKwl7CisJCUZQUyA9IGZyYW1lc1NlYyAvIGRlbHRhOworCisJCWZwc1RpbWUgPSB0aW1lOworCQlmcmFtZXNUb3RhbCArPSBmcmFtZXNTZWM7CisJCWZyYW1lc1NlYyA9IDA7CisJfQorfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL01haW4vQ29uZmlnLmhwcCBiL3NyYy9NYWluL0NvbmZpZy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1Y2I3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL0NvbmZpZy5ocHAKQEAgLTAsMCArMSw2OCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgc3dfQ29uZmlnX2hwcA0KKyNkZWZpbmUgc3dfQ29uZmlnX2hwcA0KKw0KKyNpbmNsdWRlICJDb21tb24vVHlwZXMuaHBwIg0KKw0KKyNkZWZpbmUgUEVSRl9IVUQgMCAgICAgICAvLyBEaXNwbGF5IHRpbWUgc3BlbnQgb24gdmVydGV4LCBzZXR1cCBhbmQgcGl4ZWwgcHJvY2Vzc2luZyBmb3IgZWFjaCB0aHJlYWQNCisjZGVmaW5lIFBFUkZfUFJPRklMRSAwICAgLy8gUHJvZmlsZSB2YXJpb3VzIHBpcGVsaW5lIHN0YWdlcyBhbmQgZGlzcGxheSB0aGUgdGltaW5nIGluIFN3aWZ0Q29uZmlnDQorI2RlZmluZSBTM1RDX1NVUFBPUlQgMA0KKw0KKyNpZiBQRVJGX1BST0ZJTEUNCitlbnVtDQorew0KKwlQRVJGX1BJWEVMLA0KKwlQRVJGX1BJUEUsDQorCVBFUkZfSU5URVJQLA0KKwlQRVJGX1NIQURFUiwNCisJUEVSRl9URVgsDQorCVBFUkZfUk9QLA0KKw0KKwlQRVJGX1RJTUVSUw0KK307DQorDQorc3RydWN0IFByb2ZpbGVyDQorew0KKwlQcm9maWxlcigpOw0KKw0KKwl2b2lkIHJlc2V0KCk7DQorCXZvaWQgbmV4dEZyYW1lKCk7DQorDQorCWludCBmcmFtZXNTZWM7DQorCWludCBmcmFtZXNUb3RhbDsNCisJZG91YmxlIEZQUzsNCisJZG91YmxlIGN5Y2xlc1tQRVJGX1RJTUVSU107DQorDQorCWludDY0X3Qgcm9wT3BlcmF0aW9uczsNCisJaW50NjRfdCByb3BPcGVyYXRpb25zVG90YWw7DQorCWludDY0X3Qgcm9wT3BlcmF0aW9uc0ZyYW1lOw0KKw0KKwlpbnQ2NF90IHRleE9wZXJhdGlvbnM7DQorCWludDY0X3QgdGV4T3BlcmF0aW9uc1RvdGFsOw0KKwlpbnQ2NF90IHRleE9wZXJhdGlvbnNGcmFtZTsNCisJDQorCWludDY0X3QgY29tcHJlc3NlZFRleDsNCisJaW50NjRfdCBjb21wcmVzc2VkVGV4VG90YWw7DQorCWludDY0X3QgY29tcHJlc3NlZFRleEZyYW1lOw0KK307DQorDQorZXh0ZXJuIFByb2ZpbGVyIHByb2ZpbGVyOw0KKyNlbmRpZg0KKw0KK2VudW0NCit7DQorCU9VVExJTkVfUkVTT0xVVElPTiA9IDQwOTYsICAgLy8gTWF4aW11bSB2ZXJ0aWNhbCByZXNvbHV0aW9uIG9mIHRoZSByZW5kZXIgdGFyZ2V0DQorCU1JUE1BUF9MRVZFTFMgPSAxNA0KK307DQorDQorI2VuZGlmICAgLy8gc3dfQ29uZmlnX2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9NYWluL0ZyYW1lQnVmZmVyLmNwcCBiL3NyYy9NYWluL0ZyYW1lQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTNmZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL01haW4vRnJhbWVCdWZmZXIuY3BwCkBAIC0wLDAgKzEsNTcwIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlci5ocHAiCisKKyNpbmNsdWRlICJUaW1lci5ocHAiCisjaW5jbHVkZSAiQ1BVSUQuaHBwIgorI2luY2x1ZGUgInNlcmlhbHZhbGlkLmgiCisjaW5jbHVkZSAiU3VyZmFjZS5ocHAiCisjaW5jbHVkZSAiUmVnaXN0ZXIuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKyNpbmNsdWRlICJSZWFjdG9yL1NoZWxsLmhwcCIKKyNpbmNsdWRlICJDb21tb24vQ29uZmlndXJhdG9yLmhwcCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2V4dGVybiBjb25zdCBpbnQgbG9nb1dpZHRoOworZXh0ZXJuIGNvbnN0IGludCBsb2dvSGVpZ2h0OworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBsb2dvRGF0YVtdOworCisjZGVmaW5lIERJU1BMQVlfTE9HTyBOREVCVUcgJiAxCisKK25hbWVzcGFjZSBzdworeworCWV4dGVybiBib29sIGZvcmNlV2luZG93ZWQ7CisKKwlTdXJmYWNlICpGcmFtZUJ1ZmZlcjo6bG9nbzsKKwl1bnNpZ25lZCBpbnQgKkZyYW1lQnVmZmVyOjpsb2dvSW1hZ2U7CisJdm9pZCAqRnJhbWVCdWZmZXI6OmN1cnNvcjsKKwlpbnQgRnJhbWVCdWZmZXI6OmN1cnNvcldpZHRoID0gMDsKKwlpbnQgRnJhbWVCdWZmZXI6OmN1cnNvckhlaWdodCA9IDA7CisJaW50IEZyYW1lQnVmZmVyOjpjdXJzb3JIb3RzcG90WDsKKwlpbnQgRnJhbWVCdWZmZXI6OmN1cnNvckhvdHNwb3RZOworCWludCBGcmFtZUJ1ZmZlcjo6Y3Vyc29yUG9zaXRpb25YOworCWludCBGcmFtZUJ1ZmZlcjo6Y3Vyc29yUG9zaXRpb25ZOworCWludCBGcmFtZUJ1ZmZlcjo6Y3Vyc29yWDsKKwlpbnQgRnJhbWVCdWZmZXI6OmN1cnNvclk7CisKKwlGcmFtZUJ1ZmZlcjo6RnJhbWVCdWZmZXIoSFdORCB3aW5kb3dIYW5kbGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBmdWxsc2NyZWVuKQorCXsKKwkJbG9ja2VkID0gMDsKKworCQl0aGlzLT53aW5kb3dIYW5kbGUgPSB3aW5kb3dIYW5kbGU7CisJCXRoaXMtPndpZHRoID0gd2lkdGg7CisJCXRoaXMtPmhlaWdodCA9IGhlaWdodDsKKwkJYml0RGVwdGggPSAzMjsKKwkJSERSZGlzcGxheSA9IGZhbHNlOworCQlzdHJpZGUgPSAwOworCisJCWlmKGZvcmNlV2luZG93ZWQpCisJCXsKKwkJCWZ1bGxzY3JlZW4gPSBmYWxzZTsKKwkJfQorCisJCXdpbmRvd2VkID0gIWZ1bGxzY3JlZW47CisKKwkJaWYoIXdpbmRvd2VkKQorCQl7CisJCQkvLyBGb3JjZSBmdWxsc2NyZWVuIHdpbmRvdyBzdHlsZSAobm8gYm9yZGVycykKKwkJCW9yaWdpbmFsV2luZG93U3R5bGUgPSBHZXRXaW5kb3dMb25nKHdpbmRvd0hhbmRsZSwgR1dMX1NUWUxFKTsKKwkJCVNldFdpbmRvd0xvbmcod2luZG93SGFuZGxlLCBHV0xfU1RZTEUsIFdTX1BPUFVQKTsKKwkJfQorCisJCUhJTlNUQU5DRSBpbnN0YW5jZSA9IChISU5TVEFOQ0UpR2V0V2luZG93TG9uZ1B0cih3aW5kb3dIYW5kbGUsIEdXTFBfSElOU1RBTkNFKTsKKwkJdW5zaWduZWQgY2hhciBvbmVbMzIgKiAzMiAvIHNpemVvZih1bnNpZ25lZCBjaGFyKV07CisJCW1lbXNldChvbmUsIDB4RkZGRkZGRkYsIHNpemVvZihvbmUpKTsKKwkJdW5zaWduZWQgY2hhciB6ZXJvWzMyICogMzIgLyBzaXplb2YodW5zaWduZWQgY2hhcildID0gezB9OworCQludWxsQ3Vyc29yID0gQ3JlYXRlQ3Vyc29yKGluc3RhbmNlLCAwLCAwLCAzMiwgMzIsIG9uZSwgemVybyk7CisJCXdpbjMyQ3Vyc29yID0gR2V0Q3Vyc29yKCk7CisKKwkJYmxpdEZ1bmN0aW9uID0gMDsKKwkJYmxpdFJvdXRpbmUgPSAwOworCisJCWJsaXRTdGF0ZS53aWR0aCA9IDA7CisJCWJsaXRTdGF0ZS5oZWlnaHQgPSAwOworCQlibGl0U3RhdGUuZGVwdGggPSAwOworCQlibGl0U3RhdGUuY3Vyc29yV2lkdGggPSAwOworCQlibGl0U3RhdGUuY3Vyc29ySGVpZ2h0ID0gMDsKKworCQlsb2dvID0gMDsKKworCQlzeW5jRXZlbnQgPSBDcmVhdGVFdmVudCgwLCBGQUxTRSwgRkFMU0UsIDApOworCQlibGl0RXZlbnQgPSBDcmVhdGVFdmVudCgwLCBGQUxTRSwgRkFMU0UsIDApOworCQlGcmFtZUJ1ZmZlciAqcGFyYW1ldGVycyA9IHRoaXM7CisKKwkJdGVybWluYXRlID0gZmFsc2U7CisJCWJsaXRUaHJlYWQgPSBDcmVhdGVUaHJlYWQoMCwgMTAyNCAqIDEwMjQsIHRocmVhZEZ1bmN0aW9uLCAmcGFyYW1ldGVycywgMCwgMCk7CisJCVdhaXRGb3JTaW5nbGVPYmplY3Qoc3luY0V2ZW50LCBJTkZJTklURSk7CisJfQorCisJRnJhbWVCdWZmZXI6On5GcmFtZUJ1ZmZlcigpCisJeworCQl0ZXJtaW5hdGUgPSB0cnVlOworCQlTZXRFdmVudChibGl0RXZlbnQpOworCQlXYWl0Rm9yU2luZ2xlT2JqZWN0KGJsaXRUaHJlYWQsIElORklOSVRFKTsKKwkJQ2xvc2VIYW5kbGUoYmxpdFRocmVhZCk7CisJCUNsb3NlSGFuZGxlKGJsaXRFdmVudCk7CisJCUNsb3NlSGFuZGxlKHN5bmNFdmVudCk7CisKKwkJZGVsZXRlIGJsaXRSb3V0aW5lOworCisJCWlmKCF3aW5kb3dlZCAmJiBHZXRXaW5kb3dMb25nKHdpbmRvd0hhbmRsZSwgR1dMX1NUWUxFKSA9PSBXU19QT1BVUCkKKwkJeworCQkJU2V0V2luZG93TG9uZyh3aW5kb3dIYW5kbGUsIEdXTF9TVFlMRSwgb3JpZ2luYWxXaW5kb3dTdHlsZSk7CisJCX0KKwl9CisKKwl2b2lkIEZyYW1lQnVmZmVyOjp1cGRhdGVCb3VuZHMoSFdORCB3aW5kb3dPdmVycmlkZSkKKwl7CisJCUhXTkQgd2luZG93ID0gd2luZG93T3ZlcnJpZGUgPyB3aW5kb3dPdmVycmlkZSA6IHdpbmRvd0hhbmRsZTsKKworCQlpZih3aW5kb3dlZCkKKwkJeworCQkJR2V0Q2xpZW50UmVjdCh3aW5kb3csICZib3VuZHMpOworCQkJQ2xpZW50VG9TY3JlZW4od2luZG93LCAoUE9JTlQqKSZib3VuZHMpOworCQkJQ2xpZW50VG9TY3JlZW4od2luZG93LCAoUE9JTlQqKSZib3VuZHMgKyAxKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVNldFJlY3QoJmJvdW5kcywgMCwgMCwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTiksIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pKTsKKwkJfQorCX0KKworCXZvaWQgRnJhbWVCdWZmZXI6OmdyYWNlZnVsRXhpdChjb25zdCBjaGFyICplcnJvck1lc3NhZ2UsIGxvbmcgcmVzdWx0KQorCXsKKwkJY2hhciBlcnJvclsyNTZdOworCisJCXNwcmludGZfcyhlcnJvciwgMjU2LCAiJXNcbihGcmFtZUJ1ZmZlciBlcnJvciBjb2RlIDB4JTAuOFgpIiwgZXJyb3JNZXNzYWdlLCByZXN1bHQpOworCisJCU1lc3NhZ2VCb3goMCwgZXJyb3IsIDAsIE1CX0lDT05FUlJPUik7CisKKwkJZXhpdCgwKTsKKwl9CisKKwlpbnQgRnJhbWVCdWZmZXI6OmdldFdpZHRoKCkgY29uc3QKKwl7CisJCXJldHVybiB3aWR0aDsKKwl9CisKKwlpbnQgRnJhbWVCdWZmZXI6OmdldEhlaWdodCgpIGNvbnN0CisJeworCQlyZXR1cm4gaGVpZ2h0OworCX0KKworCWludCBGcmFtZUJ1ZmZlcjo6Z2V0U3RyaWRlKCkgY29uc3QKKwl7CisJCXJldHVybiBzdHJpZGU7CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlcjo6c2V0Q3Vyc29ySW1hZ2Uoc3c6OlN1cmZhY2UgKmN1cnNvckltYWdlKQorCXsKKwkJaWYoY3Vyc29ySW1hZ2UpCisJCXsKKwkJCWN1cnNvciA9IGN1cnNvckltYWdlLT5sb2NrRXh0ZXJuYWwoMCwgMCwgMCwgc3c6OkxPQ0tfUkVBRE9OTFksIHN3OjpQVUJMSUMpOworCQkJY3Vyc29ySW1hZ2UtPnVubG9ja0V4dGVybmFsKCk7CisKKwkJCWN1cnNvcldpZHRoID0gY3Vyc29ySW1hZ2UtPmdldEV4dGVybmFsV2lkdGgoKTsKKwkJCWN1cnNvckhlaWdodCA9IGN1cnNvckltYWdlLT5nZXRFeHRlcm5hbEhlaWdodCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJY3Vyc29yV2lkdGggPSAwOworCQkJY3Vyc29ySGVpZ2h0ID0gMDsKKwkJfQorCX0KKworCXZvaWQgRnJhbWVCdWZmZXI6OnNldEN1cnNvck9yaWdpbihpbnQgeDAsIGludCB5MCkKKwl7CisJCWN1cnNvckhvdHNwb3RYID0geDA7CisJCWN1cnNvckhvdHNwb3RZID0geTA7CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlcjo6c2V0Q3Vyc29yUG9zaXRpb24oaW50IHgsIGludCB5KQorCXsKKwkJY3Vyc29yUG9zaXRpb25YID0geDsKKwkJY3Vyc29yUG9zaXRpb25ZID0geTsKKwl9CisKKwl2b2lkIEZyYW1lQnVmZmVyOjpjb3B5KEhXTkQgd2luZG93T3ZlcnJpZGUsIHZvaWQgKnNvdXJjZSwgYm9vbCBIRFIpCisJeworCQlpZighc291cmNlKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQl1cGRhdGVCb3VuZHMod2luZG93T3ZlcnJpZGUpOworCisJCWlmKCFsb2NrKCkpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCXRhcmdldCA9IHNvdXJjZTsKKwkJSERSZGlzcGxheSA9IEhEUjsKKworCQlpZihjdXJzb3IpCisJCXsKKwkJCWN1cnNvclggPSBjdXJzb3JQb3NpdGlvblggLSBjdXJzb3JIb3RzcG90WDsKKwkJCWN1cnNvclkgPSBjdXJzb3JQb3NpdGlvblkgLSBjdXJzb3JIb3RzcG90WTsKKworCQkJSENVUlNPUiBvbGRDdXJzb3IgPSBTZXRDdXJzb3IobnVsbEN1cnNvcik7CisJCQkKKwkJCWlmKG9sZEN1cnNvciAhPSBudWxsQ3Vyc29yKQorCQkJeworCQkJCXdpbjMyQ3Vyc29yID0gb2xkQ3Vyc29yOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoR2V0Q3Vyc29yKCkgPT0gbnVsbEN1cnNvcikKKwkJCXsKKwkJCQlTZXRDdXJzb3Iod2luMzJDdXJzb3IpOworCQkJfQorCQl9CisKKwkJU2V0RXZlbnQoYmxpdEV2ZW50KTsKKwkJV2FpdEZvclNpbmdsZU9iamVjdChzeW5jRXZlbnQsIElORklOSVRFKTsKKwkKKwkJdW5sb2NrKCk7CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlcjo6Y29weUxvY2tlZCgpCisJeworCQlCbGl0U3RhdGUgdXBkYXRlOworCisJCXVwZGF0ZS53aWR0aCA9IHdpZHRoOworCQl1cGRhdGUuaGVpZ2h0ID0gaGVpZ2h0OworCQl1cGRhdGUuZGVwdGggPSBiaXREZXB0aDsKKwkJdXBkYXRlLnN0cmlkZSA9IHN0cmlkZTsKKwkJdXBkYXRlLkhEUiA9IEhEUmRpc3BsYXk7CisJCXVwZGF0ZS5jdXJzb3JXaWR0aCA9IGN1cnNvcldpZHRoOworCQl1cGRhdGUuY3Vyc29ySGVpZ2h0ID0gY3Vyc29ySGVpZ2h0OworCisJCWlmKG1lbWNtcCgmYmxpdFN0YXRlLCAmdXBkYXRlLCBzaXplb2YoQmxpdFN0YXRlKSkgIT0gMCkKKwkJeworCQkJYmxpdFN0YXRlID0gdXBkYXRlOworCQkJZGVsZXRlIGJsaXRSb3V0aW5lOworCisJCQlibGl0Um91dGluZSA9IGNvcHlSb3V0aW5lKGJsaXRTdGF0ZSk7CisJCQlibGl0RnVuY3Rpb24gPSAodm9pZChfX2NkZWNsKikodm9pZCosIHZvaWQqKSlibGl0Um91dGluZS0+Z2V0RW50cnkoKTsKKwkJfQorCisJCWJsaXRGdW5jdGlvbihsb2NrZWQsIHRhcmdldCk7CisKKwkJI2lmbmRlZiBfTV9BTUQ2NAorCQkJX19hc20gZW1tcworCQkjZW5kaWYKKwl9CisKKwlSb3V0aW5lICpGcmFtZUJ1ZmZlcjo6Y29weVJvdXRpbmUoY29uc3QgQmxpdFN0YXRlICZzdGF0ZSkKKwl7CisJCWluaXRpYWxpemVMb2dvKCk7CisKKwkJY29uc3QgaW50IHdpZHRoID0gc3RhdGUud2lkdGg7CisJCWNvbnN0IGludCBoZWlnaHQgPSBzdGF0ZS5oZWlnaHQ7CisJCWNvbnN0IGludCB3aWR0aDIgPSAoc3RhdGUud2lkdGggKyAxKSAmIH4xOworCQljb25zdCBpbnQgZEJ5dGVzID0gc3RhdGUuZGVwdGggLyA4OworCQljb25zdCBpbnQgZFN0cmlkZSA9IHN0YXRlLnN0cmlkZTsKKwkJY29uc3QgaW50IHNCeXRlcyA9IHN0YXRlLkhEUiA/IDggOiA0OworCQljb25zdCBpbnQgc1N0cmlkZSA9IHNCeXRlcyAqIHdpZHRoMjsKKworCS8vCWNoYXIgY29tcGFyZUFwcFszMl0gPSBTQ1JBTUJMRTMxKHZhbGlkYXRpb25BcHAsIEFQUE5BTUVfU0NSQU1CTEUpOworCS8vCWJvb2wgdmFsaWRBcHAgPSBzdHJjbXAoY29tcGFyZUFwcCwgcmVnaXN0ZXJlZEFwcCkgPT0gMDsKKwkJYm9vbCB2YWxpZEtleSA9IFZhbGlkYXRlU2VyaWFsTnVtYmVyKHZhbGlkYXRpb25LZXksIENIRUNLU1VNX0tFWSwgU0VSSUFMX1BSRUZJWCk7CisKKwkJRnVuY3Rpb248Vm9pZCwgUG9pbnRlcjxCeXRlPiwgUG9pbnRlcjxCeXRlPj4gZnVuY3Rpb247CisJCXsKKwkJCVBvaW50ZXI8Qnl0ZT4gZHN0KGZ1bmN0aW9uLmFyZygwKSk7CisJCQlQb2ludGVyPEJ5dGU+IHNyYyhmdW5jdGlvbi5hcmcoMSkpOworCisJCQlGb3IoSW50IHkgPSAwLCB5IDwgaGVpZ2h0LCB5KyspCisJCQl7CisJCQkJUG9pbnRlcjxCeXRlPiBkID0gZHN0ICsgeSAqIGRTdHJpZGU7CisJCQkJUG9pbnRlcjxCeXRlPiBzID0gc3JjICsgeSAqIHNTdHJpZGU7CisKKwkJCQlJbnQgeDAgPSAwOworCisJCQkJI2lmIERJU1BMQVlfTE9HTworCQkJCQlJZighQm9vbCh2YWxpZEtleSkvKiB8fCAhQm9vbCh2YWxpZEFwcCkqLykKKwkJCQkJeworCQkJCQkJSWYoeSA+IGhlaWdodCAtIGxvZ29IZWlnaHQpCisJCQkJCQl7CisJCQkJCQkJeDAgPSBsb2dvV2lkdGg7CisJCQkJCQkJcyArPSBsb2dvV2lkdGggKiBzQnl0ZXM7CisJCQkJCQkJZCArPSBsb2dvV2lkdGggKiBkQnl0ZXM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkjZW5kaWYKKworCQkJCWlmKHN0YXRlLmRlcHRoID09IDMyKQorCQkJCXsKKwkJCQkJaWYod2lkdGgyICUgNCA9PSAwICYmICFzdGF0ZS5IRFIpCisJCQkJCXsKKwkJCQkJCUZvcihJbnQgeCA9IHgwLCB4IDwgd2lkdGgyLCB4ICs9IDQpCisJCQkJCQl7CisJCQkJCQkJKlBvaW50ZXI8SW50ND4oZCwgMSkgPSAqUG9pbnRlcjxJbnQ0PihzLCAxNik7CisKKwkJCQkJCQlzICs9IDQgKiBzQnl0ZXM7CisJCQkJCQkJZCArPSA0ICogZEJ5dGVzOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJRm9yKEludCB4ID0geDAsIHggPCB3aWR0aDIsIHggKz0gMikKKwkJCQkJCXsKKwkJCQkJCQlJbnQyIGMwMTsKKworCQkJCQkJCWlmKCFzdGF0ZS5IRFIpCisJCQkJCQkJeworCQkJCQkJCQljMDEgPSAqUG9pbnRlcjxJbnQyPihzKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJVVNob3J0NCBjMCA9IEFzPFVTaG9ydDQ+KFN3aXp6bGUoKlBvaW50ZXI8U2hvcnQ0PihzICsgMCksIDB4QzYpKSA+PiA4OworCQkJCQkJCQlVU2hvcnQ0IGMxID0gQXM8VVNob3J0ND4oU3dpenpsZSgqUG9pbnRlcjxTaG9ydDQ+KHMgKyA4KSwgMHhDNikpID4+IDg7CisJCQkJCQkJCQkKKwkJCQkJCQkJYzAxID0gQXM8SW50Mj4oUGFjayhjMCwgYzEpKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkqUG9pbnRlcjxJbnQyPihkKSA9IGMwMTsKKworCQkJCQkJCXMgKz0gMiAqIHNCeXRlczsKKwkJCQkJCQlkICs9IDIgKiBkQnl0ZXM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihzdGF0ZS5kZXB0aCA9PSAyNCkKKwkJCQl7CisJCQkJCUZvcihJbnQgeCA9IHgwLCB4IDwgd2lkdGgsIHgrKykKKwkJCQkJeworCQkJCQkJaWYoIXN0YXRlLkhEUikKKwkJCQkJCXsKKwkJCQkJCQkqUG9pbnRlcjxCeXRlPihkICsgMCkgPSAqUG9pbnRlcjxCeXRlPihzICsgMCk7CisJCQkJCQkJKlBvaW50ZXI8Qnl0ZT4oZCArIDEpID0gKlBvaW50ZXI8Qnl0ZT4ocyArIDEpOworCQkJCQkJCSpQb2ludGVyPEJ5dGU+KGQgKyAyKSA9ICpQb2ludGVyPEJ5dGU+KHMgKyAyKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQkqUG9pbnRlcjxCeXRlPihkICsgMCkgPSAqUG9pbnRlcjxCeXRlPihzICsgNSk7CisJCQkJCQkJKlBvaW50ZXI8Qnl0ZT4oZCArIDEpID0gKlBvaW50ZXI8Qnl0ZT4ocyArIDMpOworCQkJCQkJCSpQb2ludGVyPEJ5dGU+KGQgKyAyKSA9ICpQb2ludGVyPEJ5dGU+KHMgKyAxKTsKKwkJCQkJCX0KKworCQkJCQkJcyArPSBzQnl0ZXM7CisJCQkJCQlkICs9IGRCeXRlczsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKHN0YXRlLmRlcHRoID09IDE2KQorCQkJCXsKKwkJCQkJRm9yKEludCB4ID0geDAsIHggPCB3aWR0aCwgeCsrKQorCQkJCQl7CisJCQkJCQlJbnQgYzsKKwkJCQkJCQkKKwkJCQkJCWlmKCFzdGF0ZS5IRFIpCisJCQkJCQl7CisJCQkJCQkJYyA9ICpQb2ludGVyPEludD4ocyk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVVNob3J0NCBjYyA9IEFzPFVTaG9ydDQ+KFN3aXp6bGUoKlBvaW50ZXI8U2hvcnQ0PihzICsgMCksIDB4QzYpKSA+PiA4OworCisJCQkJCQkJYyA9IEludChBczxJbnQyPihQYWNrKGNjLCBjYykpKTsKKwkJCQkJCX0KKworCQkJCQkJKlBvaW50ZXI8U2hvcnQ+KGQpID0gU2hvcnQoKGMgJiAweDAwRjgwMDAwKSA+PiA4IHwKKwkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIChjICYgMHgwMDAwRkMwMCkgPj4gNSB8CisJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyAmIDB4MDAwMDAwRjgpID4+IDMpOworCisJCQkJCQlzICs9IHNCeXRlczsKKwkJCQkJCWQgKz0gZEJ5dGVzOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwkJCX0KKworCQkJI2lmIERJU1BMQVlfTE9HTworCQkJCUlmKCFCb29sKHZhbGlkS2V5KS8qIHx8ICFCb29sKHZhbGlkQXBwKSovKQorCQkJCXsKKwkJCQkJVUludCBoYXNoID0gVUludCgweDBCMDIwQzA0KSArIFVJbnQoMHhDMEYwOTBFMCk7ICAgLy8gSW5pdGlhbCB2YWx1ZQorCQkJCQlVSW50IGltYWdlSGFzaCA9IFMzVENfU1VQUE9SVCA/IFVJbnQoMHgwMTAxMDYwMCkgKyBVSW50KDB4QzAzMDIwMTApIDogVUludCgweDBEMDMwRTBCKSArIFVJbnQoMHhCMEQwMTA0MCk7CisKKwkJCQkJV2hpbGUoaGFzaCAhPSBpbWFnZUhhc2gpCisJCQkJCXsKKwkJCQkJCUZvcih5ID0gKGhlaWdodCAtIDEpLCBoZWlnaHQgLSAxIC0geSA8IGxvZ29IZWlnaHQsIHktLSkKKwkJCQkJCXsKKwkJCQkJCQlQb2ludGVyPEJ5dGU+IGxvZ28gPSAqUG9pbnRlcjxQb2ludGVyPEJ5dGU+PigmbG9nb0ltYWdlKSArIDQgKiAobG9nb0hlaWdodCAtIGhlaWdodCArIHkpICogbG9nb1dpZHRoOworCQkJCQkJCVBvaW50ZXI8Qnl0ZT4gcyA9IHNyYyArIHkgKiBzU3RyaWRlOworCQkJCQkJCVBvaW50ZXI8Qnl0ZT4gZCA9IGRzdCArIHkgKiBkU3RyaWRlOworCisJCQkJCQkJRm9yKEludCB4ID0gMCwgeCA8IGxvZ29XaWR0aCwgeCsrKQorCQkJCQkJCXsKKwkJCQkJCQkJaGFzaCAqPSAxNjc3NzYxOTsKKwkJCQkJCQkJaGFzaCBePSAqUG9pbnRlcjxVSW50Pihsb2dvKTsKKworCQkJCQkJCQlJZih5ID49IDAgJiYgeCA8IHdpZHRoKQorCQkJCQkJCQl7CisJCQkJCQkJCQlibGVuZChzdGF0ZSwgZCwgcywgbG9nbyk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlsb2dvICs9IDQ7CisJCQkJCQkJCXMgKz0gc0J5dGVzOworCQkJCQkJCQlkICs9IGRCeXRlczsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkjZW5kaWYKKworCQkJSW50IHgwID0gKlBvaW50ZXI8SW50PigmY3Vyc29yWCk7CisJCQlJbnQgeTAgPSAqUG9pbnRlcjxJbnQ+KCZjdXJzb3JZKTsKKworCQkJRm9yKEludCB5MSA9IDAsIHkxIDwgY3Vyc29ySGVpZ2h0LCB5MSsrKQorCQkJeworCQkJCUludCB5ID0geTAgKyB5MTsKKworCQkJCUlmKHkgPj0gMCAmJiB5IDwgaGVpZ2h0KQorCQkJCXsKKwkJCQkJUG9pbnRlcjxCeXRlPiBkID0gZHN0ICsgeSAqIGRTdHJpZGUgKyB4MCAqIGRCeXRlczsKKwkJCQkJUG9pbnRlcjxCeXRlPiBzID0gc3JjICsgeSAqIHNTdHJpZGUgKyB4MCAqIHNCeXRlczsKKwkJCQkJUG9pbnRlcjxCeXRlPiBjID0gKlBvaW50ZXI8UG9pbnRlcjxCeXRlPj4oJmN1cnNvcikgKyB5MSAqIGN1cnNvcldpZHRoICogNDsKKworCQkJCQlGb3IoSW50IHgxID0gMCwgeDEgPCBjdXJzb3JXaWR0aCwgeDErKykKKwkJCQkJeworCQkJCQkJSW50IHggPSB4MCArIHgxOworCisJCQkJCQlJZih4ID49IDAgJiYgeCA8IHdpZHRoKQorCQkJCQkJeworCQkJCQkJCWJsZW5kKHN0YXRlLCBkLCBzLCBjKTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJYyArPSA0OworCQkJCQkJcyArPSBzQnl0ZXM7CisJCQkJCQlkICs9IGRCeXRlczsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJUmV0dXJuKCk7CisJCX0KKworCQlyZXR1cm4gZnVuY3Rpb24oTCJGcmFtZUJ1ZmZlciIpOworCX0KKworCXZvaWQgRnJhbWVCdWZmZXI6OmJsZW5kKGNvbnN0IEJsaXRTdGF0ZSAmc3RhdGUsIGNvbnN0IFBvaW50ZXI8Qnl0ZT4gJmQsIGNvbnN0IFBvaW50ZXI8Qnl0ZT4gJnMsIGNvbnN0IFBvaW50ZXI8Qnl0ZT4gJmMpCisJeworCQlTaG9ydDQgYzE7CisJCVNob3J0NCBjMjsKKworCQljMSA9IFVucGFja0xvdyhBczxCeXRlOD4oYzEpLCAqUG9pbnRlcjxCeXRlOD4oYykpOworCQkKKwkJaWYoIXN0YXRlLkhEUikKKwkJeworCQkJYzIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KGMyKSwgKlBvaW50ZXI8Qnl0ZTg+KHMpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWMyID0gU3dpenpsZSgqUG9pbnRlcjxTaG9ydDQ+KHMgKyAwKSwgMHhDNik7CisJCX0KKworCQljMSA9IEFzPFNob3J0ND4oQXM8VVNob3J0ND4oYzEpID4+IDkpOworCQljMiA9IEFzPFNob3J0ND4oQXM8VVNob3J0ND4oYzIpID4+IDkpOworCisJCVNob3J0NCBhbHBoYSA9IFN3aXp6bGUoYzEsIDB4RkYpICYgU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCk7CisKKwkJYzEgPSAoYzEgLSBjMikgKiBhbHBoYTsKKwkJYzEgPSBjMSA+PiA3OworCQljMSA9IGMxICsgYzI7CisJCWMxID0gYzEgKyBjMTsKKworCQljMSA9IEFzPFNob3J0ND4oUGFjayhBczxVU2hvcnQ0PihjMSksIEFzPFVTaG9ydDQ+KGMxKSkpOworCisJCWlmKHN0YXRlLmRlcHRoID09IDMyKQorCQl7CisJCQkqUG9pbnRlcjxVSW50PihkKSA9IFVJbnQoQXM8TG9uZz4oYzEpKTsKKwkJfQorCQllbHNlIGlmKHN0YXRlLmRlcHRoID09IDI0KQorCQl7CisJCQlJbnQgYyA9IEludChBczxJbnQyPihjMSkpOworCisJCQkqUG9pbnRlcjxCeXRlPihkICsgMCkgPSBCeXRlKGMgPj4gMCk7CisJCQkqUG9pbnRlcjxCeXRlPihkICsgMSkgPSBCeXRlKGMgPj4gOCk7CisJCQkqUG9pbnRlcjxCeXRlPihkICsgMikgPSBCeXRlKGMgPj4gMTYpOworCQl9CisJCWVsc2UgaWYoc3RhdGUuZGVwdGggPT0gMTYpCisJCXsKKwkJCUludCBjID0gSW50KEFzPEludDI+KGMxKSk7CisKKwkJCSpQb2ludGVyPFNob3J0PihkKSA9IFNob3J0KChjICYgMHgwMEY4MDAwMCkgPj4gOCB8CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyAmIDB4MDAwMEZDMDApID4+IDUgfAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgJiAweDAwMDAwMEY4KSA+PiAzKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgRnJhbWVCdWZmZXI6OnRocmVhZEZ1bmN0aW9uKHZvaWQgKnBhcmFtZXRlcnMpCisJeworCQlGcmFtZUJ1ZmZlciAqZnJhbWVCdWZmZXIgPSAqc3RhdGljX2Nhc3Q8RnJhbWVCdWZmZXIqKj4ocGFyYW1ldGVycyk7CisKKwkJU2V0RXZlbnQoZnJhbWVCdWZmZXItPnN5bmNFdmVudCk7ICAgLy8gUmVjZWl2ZWQgcGFyYW1ldGVycworCisJCXdoaWxlKCFmcmFtZUJ1ZmZlci0+dGVybWluYXRlKQorCQl7CisJCQlXYWl0Rm9yU2luZ2xlT2JqZWN0KGZyYW1lQnVmZmVyLT5ibGl0RXZlbnQsIElORklOSVRFKTsKKworCQkJaWYoIWZyYW1lQnVmZmVyLT50ZXJtaW5hdGUpCisJCQl7CisJCQkJZnJhbWVCdWZmZXItPmNvcHlMb2NrZWQoKTsKKworCQkJCVNldEV2ZW50KGZyYW1lQnVmZmVyLT5zeW5jRXZlbnQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlcjo6aW5pdGlhbGl6ZUxvZ28oKQorCXsKKwkJI2lmIERJU1BMQVlfTE9HTworCQkJaWYoIWxvZ28pCisJCQl7CisJCQkJI2lmIFMzVENfU1VQUE9SVAorCQkJCQlsb2dvID0gbmV3IFN1cmZhY2UoMCwgbG9nb1dpZHRoLCBsb2dvSGVpZ2h0LCAxLCBGT1JNQVRfRFhUNSwgdHJ1ZSwgZmFsc2UpOworCQkJCQl2b2lkICpkYXRhID0gbG9nby0+bG9ja0V4dGVybmFsKDAsIDAsIDAsIExPQ0tfV1JJVEVPTkxZLCBzdzo6UFVCTElDKTsKKwkJCQkJbWVtY3B5KGRhdGEsIGxvZ29EYXRhLCBsb2dvV2lkdGggKiBsb2dvSGVpZ2h0KTsKKwkJCQkJbG9nby0+dW5sb2NrRXh0ZXJuYWwoKTsKKwkJCQkjZWxzZQorCQkJCQlsb2dvID0gbmV3IFN1cmZhY2UoMCwgbG9nb1dpZHRoLCBsb2dvSGVpZ2h0LCAxLCBGT1JNQVRfQThSOEc4QjgsIHRydWUsIGZhbHNlKTsKKwkJCQkJdm9pZCAqZGF0YSA9IGxvZ28tPmxvY2tFeHRlcm5hbCgwLCAwLCAwLCBMT0NLX1dSSVRFT05MWSwgc3c6OlBVQkxJQyk7CisJCQkJCW1lbWNweShkYXRhLCBsb2dvRGF0YSwgbG9nb1dpZHRoICogbG9nb0hlaWdodCAqIDQpOworCQkJCQlsb2dvLT51bmxvY2tFeHRlcm5hbCgpOworCQkJCSNlbmRpZgorCisJCQkJbG9nb0ltYWdlID0gKHVuc2lnbmVkIGludCopbG9nby0+bG9ja0ludGVybmFsKDAsIDAsIDAsIExPQ0tfUkVBRE9OTFksIHN3OjpQVUJMSUMpOworCQkJCWxvZ28tPnVubG9ja0ludGVybmFsKCk7CisJCQl9CisJCSNlbmRpZgorCX0KK30KKworI2luY2x1ZGUgIkZyYW1lQnVmZmVyREQuaHBwIgorI2luY2x1ZGUgIkZyYW1lQnVmZmVyR0RJLmhwcCIKKworZXh0ZXJuICJDIgoreworCXN3OjpGcmFtZUJ1ZmZlciAqY3JlYXRlRnJhbWVCdWZmZXIoSFdORCB3aW5kb3dIYW5kbGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBmdWxsc2NyZWVuKQorCXsKKwkJc3c6OkNvbmZpZ3VyYXRvciBpbmkoIlN3aWZ0U2hhZGVyLmluaSIpOworCQlpbnQgYXBpID0gaW5pLmdldEludGVnZXIoIlRlc3RpbmciLCAiRnJhbWVCdWZmZXJBUEkiLCAwKTsKKworCQlpZihhcGkgPT0gMCkKKwkJeworCQkJcmV0dXJuIG5ldyBzdzo6RnJhbWVCdWZmZXJERCh3aW5kb3dIYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGZ1bGxzY3JlZW4pOworCQl9CisJCWVsc2UgaWYoYXBpID09IDEpCisJCXsKKwkJCXJldHVybiBuZXcgc3c6OkZyYW1lQnVmZmVyR0RJKHdpbmRvd0hhbmRsZSwgd2lkdGgsIGhlaWdodCwgZnVsbHNjcmVlbik7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCisJCXJldHVybiAwOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvTWFpbi9GcmFtZUJ1ZmZlci5ocHAgYi9zcmMvTWFpbi9GcmFtZUJ1ZmZlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNWI4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL0ZyYW1lQnVmZmVyLmhwcApAQCAtMCwwICsxLDEyOSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmCXN3X0ZyYW1lQnVmZmVyX2hwcAorI2RlZmluZQlzd19GcmFtZUJ1ZmZlcl9ocHAKKworI2luY2x1ZGUgIlJlYWN0b3IvTnVjbGV1cy5ocHAiCisjaW5jbHVkZSAiUmVuZGVyZXIvU3VyZmFjZS5ocHAiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBzdworeworCWNsYXNzIFN1cmZhY2U7CisKKwlzdHJ1Y3QgR2FtbWFSYW1wCisJeworCQlzaG9ydCByZWRbMjU2XTsKKwkJc2hvcnQgZ3JlZW5bMjU2XTsKKwkJc2hvcnQgYmx1ZVsyNTZdOworCX07CisKKwlzdHJ1Y3QgQmxpdFN0YXRlCisJeworCQlpbnQgd2lkdGg7CisJCWludCBoZWlnaHQ7CisJCWludCBkZXB0aDsgICAvLyBEaXNwbGF5IGJpdCBkZXB0aDsgMzIgPSBYOFI4RzhCOCwgMjQgPSBSOEc4QjgsIDE2ID0gUjVHNkI1CisJCWludCBzdHJpZGU7CisJCWJvb2wgSERSOyAgICAvLyBBMTZCMTZHMTZSMTYgc291cmNlIGNvbG9yIGJ1ZmZlcgorCQlpbnQgY3Vyc29yV2lkdGg7CisJCWludCBjdXJzb3JIZWlnaHQ7CisJfTsKKworCWNsYXNzIEZyYW1lQnVmZmVyCisJeworCXB1YmxpYzoKKwkJRnJhbWVCdWZmZXIoSFdORCB3aW5kb3dIYW5kbGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBmdWxsc2NyZWVuKTsKKworCQl2aXJ0dWFsIH5GcmFtZUJ1ZmZlcigpOworCisJCWludCBnZXRXaWR0aCgpIGNvbnN0OworCQlpbnQgZ2V0SGVpZ2h0KCkgY29uc3Q7CisJCWludCBnZXRTdHJpZGUoKSBjb25zdDsKKworCQl2aXJ0dWFsIHZvaWQgKmxvY2soKSA9IDA7CisJCXZpcnR1YWwgdm9pZCB1bmxvY2soKSA9IDA7CisKKwkJdmlydHVhbCB2b2lkIGZsaXAoSFdORCB3aW5kb3dPdmVycmlkZSwgdm9pZCAqc291cmNlLCBib29sIEhEUikgPSAwOworCQl2aXJ0dWFsIHZvaWQgYmxpdChIV05EIHdpbmRvd092ZXJyaWRlLCB2b2lkICpzb3VyY2UsIGNvbnN0IFJlY3QgKnNvdXJjZVJlY3QsIGNvbnN0IFJlY3QgKmRlc3RSZWN0LCBib29sIEhEUikgPSAwOworCisJCXZpcnR1YWwgdm9pZCBzZXRHYW1tYVJhbXAoR2FtbWFSYW1wICpnYW1tYVJhbXAsIGJvb2wgY2FsaWJyYXRlKSA9IDA7CisJCXZpcnR1YWwgdm9pZCBnZXRHYW1tYVJhbXAoR2FtbWFSYW1wICpnYW1tYVJhbXApID0gMDsKKworCQl2aXJ0dWFsIHZvaWQgc2NyZWVuc2hvdCh2b2lkICpkZXN0QnVmZmVyKSA9IDA7CisJCXZpcnR1YWwgYm9vbCBnZXRTY2FubGluZShib29sICZpblZlcnRpY2FsQmxhbmssIHVuc2lnbmVkIGludCAmc2NhbmxpbmUpID0gMDsKKworCQlzdGF0aWMgdm9pZCBzZXRDdXJzb3JJbWFnZShzdzo6U3VyZmFjZSAqY3Vyc29yKTsKKwkJc3RhdGljIHZvaWQgc2V0Q3Vyc29yT3JpZ2luKGludCB4MCwgaW50IHkwKTsKKwkJc3RhdGljIHZvaWQgc2V0Q3Vyc29yUG9zaXRpb24oaW50IHgsIGludCB5KTsKKworCQlzdGF0aWMgUm91dGluZSAqY29weVJvdXRpbmUoY29uc3QgQmxpdFN0YXRlICZzdGF0ZSk7CisKKwlwcm90ZWN0ZWQ6CisJCXZvaWQgdXBkYXRlQm91bmRzKEhXTkQgd2luZG93T3ZlcnJpZGUpOworCQl2b2lkIGdyYWNlZnVsRXhpdChjb25zdCBjaGFyICplcnJvck1lc3NhZ2UsIGxvbmcgcmVzdWx0KTsKKworCQl2b2lkIGNvcHkoSFdORCB3aW5kb3dPdmVycmlkZSwgdm9pZCAqc291cmNlLCBib29sIEhEUik7CisJCXZvaWQgY29weUxvY2tlZCgpOworCisJCXN0YXRpYyB1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCB0aHJlYWRGdW5jdGlvbih2b2lkICpwYXJhbWV0ZXJzKTsKKworCQl2b2lkICpsb2NrZWQ7ICAgLy8gVmlkZW8gbWVtb3J5IGJhY2sgYnVmZmVyCisJCXZvaWQgKnRhcmdldDsgICAvLyBSZW5kZXIgdGFyZ2V0IGJ1ZmZlcgorCisJCWludCB3aWR0aDsKKwkJaW50IGhlaWdodDsKKwkJaW50IHN0cmlkZTsKKwkJaW50IGJpdERlcHRoOworCQlib29sIEhEUmRpc3BsYXk7CisKKwkJSFdORCB3aW5kb3dIYW5kbGU7CisJCURXT1JEIG9yaWdpbmFsV2luZG93U3R5bGU7CisJCVJFQ1QgYm91bmRzOworCQlib29sIHdpbmRvd2VkOworCisJCUhDVVJTT1IgbnVsbEN1cnNvcjsKKwkJSENVUlNPUiB3aW4zMkN1cnNvcjsKKworCQl2b2lkIChfX2NkZWNsICpibGl0RnVuY3Rpb24pKHZvaWQgKmRzdCwgdm9pZCAqc3JjKTsKKwkJUm91dGluZSAqYmxpdFJvdXRpbmU7CisJCUJsaXRTdGF0ZSBibGl0U3RhdGU7CisKKwkJc3RhdGljIHZvaWQgYmxlbmQoY29uc3QgQmxpdFN0YXRlICZzdGF0ZSwgY29uc3QgUG9pbnRlcjxCeXRlPiAmZCwgY29uc3QgUG9pbnRlcjxCeXRlPiAmcywgY29uc3QgUG9pbnRlcjxCeXRlPiAmYyk7CisJCXN0YXRpYyB2b2lkIGluaXRpYWxpemVMb2dvKCk7CisKKwkJc3RhdGljIFN1cmZhY2UgKmxvZ287CisJCXN0YXRpYyB1bnNpZ25lZCBpbnQgKmxvZ29JbWFnZTsKKworCQlzdGF0aWMgdm9pZCAqY3Vyc29yOworCQlzdGF0aWMgaW50IGN1cnNvcldpZHRoOworCQlzdGF0aWMgaW50IGN1cnNvckhlaWdodDsKKwkJc3RhdGljIGludCBjdXJzb3JIb3RzcG90WDsKKwkJc3RhdGljIGludCBjdXJzb3JIb3RzcG90WTsKKwkJc3RhdGljIGludCBjdXJzb3JQb3NpdGlvblg7CisJCXN0YXRpYyBpbnQgY3Vyc29yUG9zaXRpb25ZOworCQlzdGF0aWMgaW50IGN1cnNvclg7CisJCXN0YXRpYyBpbnQgY3Vyc29yWTsKKworCQlIQU5ETEUgYmxpdFRocmVhZDsKKwkJSEFORExFIHN5bmNFdmVudDsKKwkJSEFORExFIGJsaXRFdmVudDsKKwkJdm9sYXRpbGUgYm9vbCB0ZXJtaW5hdGU7CisJfTsKK30KKworZXh0ZXJuICJDIgoreworCXN3OjpGcmFtZUJ1ZmZlciAqY3JlYXRlRnJhbWVCdWZmZXIoSFdORCB3aW5kb3dIYW5kbGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBmdWxsc2NyZWVuKTsKK30KKworI2VuZGlmCSAvLwlzd19GcmFtZUJ1ZmZlcl9ocHAKZGlmZiAtLWdpdCBhL3NyYy9NYWluL0ZyYW1lQnVmZmVyREQuY3BwIGIvc3JjL01haW4vRnJhbWVCdWZmZXJERC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjMmQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL0ZyYW1lQnVmZmVyREQuY3BwCkBAIC0wLDAgKzEsNDg4IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlckRELmhwcCIKKworI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJZXh0ZXJuIGJvb2wgZm9yY2VXaW5kb3dlZDsKKworCUdVSUQgc2Vjb25kYXJ5RGlzcGxheSA9IHswfTsKKworCWludCBfX3N0ZGNhbGwgZW51bURpc3BsYXlDYWxsYmFjayhHVUlEKiBndWlkLCBjaGFyICpkcml2ZXJEZXNjcmlwdGlvbiwgY2hhciAqZHJpdmVyTmFtZSwgdm9pZCAqY29udGV4dCwgSE1PTklUT1IgbW9uaXRvcikKKwl7CisJCWlmKHN0cmNtcChkcml2ZXJOYW1lLCAiXFxcXC5cXERJU1BMQVkyIikgPT0gMCkKKwkJeworCQkJc2Vjb25kYXJ5RGlzcGxheSA9ICpndWlkOworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJRnJhbWVCdWZmZXJERDo6RnJhbWVCdWZmZXJERChIV05EIHdpbmRvd0hhbmRsZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGZ1bGxzY3JlZW4pIDogRnJhbWVCdWZmZXIod2luZG93SGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBmdWxsc2NyZWVuKQorCXsKKwkJZGlyZWN0RHJhdyA9IDA7CisJCWZyb250QnVmZmVyID0gMDsKKwkJYmFja0J1ZmZlciA9IDA7CisKKwkJbG9ja2VkID0gMDsKKworCQlkZHJhdyA9IExvYWRMaWJyYXJ5KCJkZHJhdy5kbGwiKTsKKwkJRGlyZWN0RHJhd0NyZWF0ZSA9IChESVJFQ1REUkFXQ1JFQVRFKUdldFByb2NBZGRyZXNzKGRkcmF3LCAiRGlyZWN0RHJhd0NyZWF0ZSIpOworCQlEaXJlY3REcmF3RW51bWVyYXRlRXhBID0gKERJUkVDVERSQVdFTlVNRVJBVEVFWEEpR2V0UHJvY0FkZHJlc3MoZGRyYXcsICJEaXJlY3REcmF3RW51bWVyYXRlRXhBIik7CisKKwkJaWYoIXdpbmRvd2VkKQorCQl7CisJCQlpbml0RnVsbHNjcmVlbigpOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5pdFdpbmRvd2VkKCk7CisJCX0KKwl9CisKKwlGcmFtZUJ1ZmZlckREOjp+RnJhbWVCdWZmZXJERCgpCisJeworCQlyZWxlYXNlQWxsKCk7CisKKwkJRnJlZUxpYnJhcnkoZGRyYXcpOworCX0KKworCXZvaWQgRnJhbWVCdWZmZXJERDo6Y3JlYXRlU3VyZmFjZXMoKQorCXsKKwkJaWYoYmFja0J1ZmZlcikKKwkJeworCQkJYmFja0J1ZmZlci0+UmVsZWFzZSgpOworCQkJYmFja0J1ZmZlciA9IDA7CisJCX0KKworCQlpZihmcm9udEJ1ZmZlcikKKwkJeworCQkJZnJvbnRCdWZmZXItPlJlbGVhc2UoKTsKKwkJCWZyb250QnVmZmVyID0gMDsKKwkJfQorCisJCWlmKCF3aW5kb3dlZCkKKwkJeworCQkJRERTVVJGQUNFREVTQyBzdXJmYWNlRGVzY3JpcHRpb24gPSB7MH07CisJCQlzdXJmYWNlRGVzY3JpcHRpb24uZHdTaXplID0gc2l6ZW9mKHN1cmZhY2VEZXNjcmlwdGlvbik7CisJCQlzdXJmYWNlRGVzY3JpcHRpb24uZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfQkFDS0JVRkZFUkNPVU5UOworCQkJc3VyZmFjZURlc2NyaXB0aW9uLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19QUklNQVJZU1VSRkFDRSB8IEREU0NBUFNfRkxJUCB8IEREU0NBUFNfQ09NUExFWDsKKwkJCXN1cmZhY2VEZXNjcmlwdGlvbi5kd0JhY2tCdWZmZXJDb3VudCA9IDE7CisJCQlsb25nIHJlc3VsdCA9IGRpcmVjdERyYXctPkNyZWF0ZVN1cmZhY2UoJnN1cmZhY2VEZXNjcmlwdGlvbiwgJmZyb250QnVmZmVyLCAwKTsKKworCQkJaWYoZnJvbnRCdWZmZXIpCisJCQl7CisJCQkJRERTQ0FQUyBzdXJmYWNlQ2FwYWJpbHRpZXMgPSB7MH07CisJCQkJc3VyZmFjZUNhcGFiaWx0aWVzLmR3Q2FwcyA9IEREU0NBUFNfQkFDS0JVRkZFUjsKKwkJCQlmcm9udEJ1ZmZlci0+R2V0QXR0YWNoZWRTdXJmYWNlKCZzdXJmYWNlQ2FwYWJpbHRpZXMsICZiYWNrQnVmZmVyKTsKKwkJCQliYWNrQnVmZmVyLT5BZGRSZWYoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUlEaXJlY3REcmF3Q2xpcHBlciAqY2xpcHBlcjsKKwkJCQorCQkJRERTVVJGQUNFREVTQyBkZHNkID0gezB9OworCQkJZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CisJCQlkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFM7CisJCQlkZHNkLmRkc0NhcHMuZHdDYXBzCT0gRERTQ0FQU19QUklNQVJZU1VSRkFDRTsKKworCQkJbG9uZyByZXN1bHQgPSBkaXJlY3REcmF3LT5DcmVhdGVTdXJmYWNlKCZkZHNkLCAmZnJvbnRCdWZmZXIsIDApOworCQkJZGlyZWN0RHJhdy0+R2V0RGlzcGxheU1vZGUoJmRkc2QpOworCQkJYml0RGVwdGggPSBkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JHQkJpdENvdW50OworCisJCQlpZigocmVzdWx0ICE9IEREX09LICYmIHJlc3VsdCAhPSBEREVSUl9QUklNQVJZU1VSRkFDRUFMUkVBRFlFWElTVFMpIHx8IChiaXREZXB0aCAhPSAzMiAmJiBiaXREZXB0aCAhPSAyNCAmJiBiaXREZXB0aCAhPSAxNikpCisJCQl7CisJCQkJZ3JhY2VmdWxFeGl0KCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncmFwaGljczogaW5jb21wYXRpYmxlIGRpc3BsYXkgbW9kZS4gQWJvcnRpbmcgYXBwbGljYXRpb24uIiwgcmVzdWx0KTsKKwkJCX0KKworCQkJZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUOwkgICAKKwkJCWRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX09GRlNDUkVFTlBMQUlOOworCQkJZGRzZC5kd1dpZHRoID0gd2lkdGg7CisJCQlkZHNkLmR3SGVpZ2h0ID0gaGVpZ2h0OworCisJCQlkaXJlY3REcmF3LT5DcmVhdGVTdXJmYWNlKCZkZHNkLCAmYmFja0J1ZmZlciwgMCk7CisKKwkJCWRpcmVjdERyYXctPkNyZWF0ZUNsaXBwZXIoMCwgJmNsaXBwZXIsIDApOworCQkJY2xpcHBlci0+U2V0SFduZCgwLCB3aW5kb3dIYW5kbGUpOworCQkJZnJvbnRCdWZmZXItPlNldENsaXBwZXIoY2xpcHBlcik7CisJCQljbGlwcGVyLT5SZWxlYXNlKCk7CisJCX0KKwl9CisKKwlib29sIEZyYW1lQnVmZmVyREQ6OnJlYWR5U3VyZmFjZXMoKQorCXsKKwkJaWYoIWZyb250QnVmZmVyIHx8ICFiYWNrQnVmZmVyKQorCQl7CisJCQljcmVhdGVTdXJmYWNlcygpOworCQl9CisKKwkJaWYoZnJvbnRCdWZmZXIgJiYgYmFja0J1ZmZlcikKKwkJeworCQkJaWYoZnJvbnRCdWZmZXItPklzTG9zdCgpIHx8IGJhY2tCdWZmZXItPklzTG9zdCgpKQorCQkJeworCQkJCXJlc3RvcmVTdXJmYWNlcygpOworCQkJfQorCisJCQlpZihmcm9udEJ1ZmZlciAmJiBiYWNrQnVmZmVyKQorCQkJeworCQkJCWlmKCFmcm9udEJ1ZmZlci0+SXNMb3N0KCkgJiYgIWJhY2tCdWZmZXItPklzTG9zdCgpKQorCQkJCXsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXZvaWQgRnJhbWVCdWZmZXJERDo6dXBkYXRlQ2xpcHBlcihIV05EIHdpbmRvd092ZXJyaWRlKQorCXsKKwkJaWYod2luZG93ZWQpCisJCXsKKwkJCWlmKGZyb250QnVmZmVyKQorCQkJeworCQkJCUhXTkQgd2luZG93ID0gd2luZG93T3ZlcnJpZGUgPyB3aW5kb3dPdmVycmlkZSA6IHdpbmRvd0hhbmRsZTsKKworCQkJCUlEaXJlY3REcmF3Q2xpcHBlciAqY2xpcHBlcjsKKwkJCQlmcm9udEJ1ZmZlci0+R2V0Q2xpcHBlcigmY2xpcHBlcik7CisJCQkJY2xpcHBlci0+U2V0SFduZCgwLCB3aW5kb3cpOworCQkJCWNsaXBwZXItPlJlbGVhc2UoKTsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgRnJhbWVCdWZmZXJERDo6cmVzdG9yZVN1cmZhY2VzKCkKKwl7CisJCWxvbmcgcmVzdWx0MSA9IGZyb250QnVmZmVyLT5SZXN0b3JlKCk7CisJCWxvbmcgcmVzdWx0MiA9IGJhY2tCdWZmZXItPlJlc3RvcmUoKTsKKworCQlpZihyZXN1bHQxICE9IEREX09LIHx8IHJlc3VsdDIgIT0gRERfT0spICAgLy8gU3VyZmFjZXMgY291bGQgbm90IGJlIHJlc3RvcmVkOyByZWNyZWF0ZSB0aGVtCisJCXsKKwkJCWNyZWF0ZVN1cmZhY2VzKCk7CisJCX0KKwl9CisKKwl2b2lkIEZyYW1lQnVmZmVyREQ6OmluaXRGdWxsc2NyZWVuKCkKKwl7CisJCXJlbGVhc2VBbGwoKTsKKworCQlpZih0cnVlKSAgIC8vIFJlbmRlciB0byBwcmltYXJ5IGRpc3BsYXkKKwkJeworCQkJRGlyZWN0RHJhd0NyZWF0ZSgwLCAmZGlyZWN0RHJhdywgMCk7CisJCX0KKwkJZWxzZSAgIC8vIFJlbmRlciB0byBzZWNvbmRhcnkgZGlzcGxheQorCQl7CisJCQlEaXJlY3REcmF3RW51bWVyYXRlRXgoJmVudW1EaXNwbGF5Q2FsbGJhY2ssIDAsIERERU5VTV9BVFRBQ0hFRFNFQ09OREFSWURFVklDRVMpOworCQkJRGlyZWN0RHJhd0NyZWF0ZSgmc2Vjb25kYXJ5RGlzcGxheSwgJmRpcmVjdERyYXcsIDApOworCQl9CisKKwkJZGlyZWN0RHJhdy0+U2V0Q29vcGVyYXRpdmVMZXZlbCh3aW5kb3dIYW5kbGUsIEREU0NMX0VYQ0xVU0lWRSB8IEREU0NMX0ZVTExTQ1JFRU4pOworCisJCWxvbmcgcmVzdWx0OworCisJCWRvCisJCXsKKwkJCWJpdERlcHRoID0gMzI7CisJCQlyZXN1bHQgPSBkaXJlY3REcmF3LT5TZXREaXNwbGF5TW9kZSh3aWR0aCwgaGVpZ2h0LCBiaXREZXB0aCk7CisKKwkJCWlmKHJlc3VsdCA9PSBEREVSUl9JTlZBTElETU9ERSkKKwkJCXsKKwkJCQliaXREZXB0aCA9IDE2OworCQkJCXJlc3VsdCA9IGRpcmVjdERyYXctPlNldERpc3BsYXlNb2RlKHdpZHRoLCBoZWlnaHQsIGJpdERlcHRoKTsKKworCQkJCWlmKHJlc3VsdCA9PSBEREVSUl9JTlZBTElETU9ERSkKKwkJCQl7CisJCQkJCWJpdERlcHRoID0gMjQ7CisJCQkJCXJlc3VsdCA9IGRpcmVjdERyYXctPlNldERpc3BsYXlNb2RlKHdpZHRoLCBoZWlnaHQsIGJpdERlcHRoKTsKKworCQkJCQlpZihyZXN1bHQgPT0gRERFUlJfSU5WQUxJRE1PREUpCisJCQkJCXsKKwkJCQkJCWdyYWNlZnVsRXhpdCgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JhcGhpY3M6IGRpc3BsYXkgbW9kZSB1bnN1cHBvcnRlZC4gQWJvcnRpbmcgYXBwbGljYXRpb24uIiwgcmVzdWx0KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYocmVzdWx0ICE9IEREX09LKQorCQkJeworCQkJCVNsZWVwKDEpOworCQkJfQorCQl9CisJCXdoaWxlKHJlc3VsdCAhPSBERF9PSyk7CisKKwkJY3JlYXRlU3VyZmFjZXMoKTsKKworCQl1cGRhdGVCb3VuZHMod2luZG93SGFuZGxlKTsKKwl9CisKKwl2b2lkIEZyYW1lQnVmZmVyREQ6OmluaXRXaW5kb3dlZCgpCisJeworCQlyZWxlYXNlQWxsKCk7CisKKwkJRGlyZWN0RHJhd0NyZWF0ZSgwLCAmZGlyZWN0RHJhdywgMCk7CisJCWRpcmVjdERyYXctPlNldENvb3BlcmF0aXZlTGV2ZWwod2luZG93SGFuZGxlLCBERFNDTF9OT1JNQUwpOworCisJCWNyZWF0ZVN1cmZhY2VzKCk7CisKKwkJdXBkYXRlQm91bmRzKHdpbmRvd0hhbmRsZSk7CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlckREOjpmbGlwKEhXTkQgd2luZG93T3ZlcnJpZGUsIHZvaWQgKnNvdXJjZSwgYm9vbCBIRFIpCisJeworCQl1cGRhdGVDbGlwcGVyKHdpbmRvd092ZXJyaWRlKTsKKworCQljb3B5KHdpbmRvd092ZXJyaWRlLCBzb3VyY2UsIEhEUik7CisKKwkJaWYoIXJlYWR5U3VyZmFjZXMoKSkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJd2hpbGUodHJ1ZSkKKwkJeworCQkJbG9uZyByZXN1bHQ7CisKKwkJCWlmKHdpbmRvd2VkKQorCQkJeworCQkJCXJlc3VsdCA9IGZyb250QnVmZmVyLT5CbHQoJmJvdW5kcywgYmFja0J1ZmZlciwgMCwgRERCTFRfV0FJVCwgMCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmVzdWx0ID0gZnJvbnRCdWZmZXItPkZsaXAoMCwgRERGTElQX05PVlNZTkMpOworCQkJfQorCisJCQlpZihyZXN1bHQgIT0gRERFUlJfV0FTU1RJTExEUkFXSU5HKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCisJCQlTbGVlcCgwKTsKKwkJfQorCX0KKworCXZvaWQgRnJhbWVCdWZmZXJERDo6YmxpdChIV05EIHdpbmRvd092ZXJyaWRlLCB2b2lkICpzb3VyY2UsIGNvbnN0IFJlY3QgKnNvdXJjZVJlY3QsIGNvbnN0IFJlY3QgKmRlc3RSZWN0LCBib29sIEhEUikKKwl7CisJCXVwZGF0ZUNsaXBwZXIod2luZG93T3ZlcnJpZGUpOworCisJCWNvcHkod2luZG93T3ZlcnJpZGUsIHNvdXJjZSwgSERSKTsKKworCQlpZighcmVhZHlTdXJmYWNlcygpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlSRUNUIGRSZWN0OworCisJCWlmKGRlc3RSZWN0KQorCQl7CisJCQlkUmVjdC5ib3R0b20gPSBib3VuZHMudG9wICsgZGVzdFJlY3QtPmJvdHRvbTsKKwkJCWRSZWN0LmxlZnQgPSBib3VuZHMubGVmdCArIGRlc3RSZWN0LT5sZWZ0OworCQkJZFJlY3QucmlnaHQgPSBib3VuZHMubGVmdCArIGRlc3RSZWN0LT5yaWdodDsKKwkJCWRSZWN0LnRvcCA9IGJvdW5kcy50b3AgKyBkZXN0UmVjdC0+dG9wOworCQl9CisJCWVsc2UKKwkJeworCQkJZFJlY3QuYm90dG9tID0gYm91bmRzLnRvcCArIGhlaWdodDsKKwkJCWRSZWN0LmxlZnQgPSBib3VuZHMubGVmdCArIDA7CisJCQlkUmVjdC5yaWdodCA9IGJvdW5kcy5sZWZ0ICsgd2lkdGg7CisJCQlkUmVjdC50b3AgPSBib3VuZHMudG9wICsgMDsKKwkJfQorCisJCXdoaWxlKHRydWUpCisJCXsKKwkJCWxvbmcgcmVzdWx0ID0gZnJvbnRCdWZmZXItPkJsdCgmZFJlY3QsIGJhY2tCdWZmZXIsIChMUFJFQ1Qpc291cmNlUmVjdCwgRERCTFRfV0FJVCwgMCk7CisKKwkJCWlmKHJlc3VsdCAhPSBEREVSUl9XQVNTVElMTERSQVdJTkcpCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCVNsZWVwKDApOworCQl9CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlckREOjpzY3JlZW5zaG90KHZvaWQgKmRlc3RCdWZmZXIpCisJeworCQlpZighcmVhZHlTdXJmYWNlcygpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlERFNVUkZBQ0VERVNDIEREU0Q7CisJCUREU0QuZHdTaXplID0gc2l6ZW9mKEREU0QpOworCisJCWxvbmcgcmVzdWx0ID0gZnJvbnRCdWZmZXItPkxvY2soMCwgJkREU0QsIERETE9DS19XQUlULCAwKTsKKworCQlpZihyZXN1bHQgPT0gRERfT0spCisJCXsKKwkJCWludCB3aWR0aCA9IEREU0QuZHdXaWR0aDsKKwkJCWludCBoZWlnaHQgPSBERFNELmR3SGVpZ2h0OworCQkJaW50IGJpdERlcHRoID0gRERTRC5kZHBmUGl4ZWxGb3JtYXQuZHdSR0JCaXRDb3VudDsKKwkJCWludCBzdHJpZGUgPSBERFNELmxQaXRjaDsKKworCQkJdm9pZCAqc291cmNlQnVmZmVyID0gRERTRC5scFN1cmZhY2U7CisKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCXsKKwkJCQltZW1jcHkoZGVzdEJ1ZmZlciwgc291cmNlQnVmZmVyLCB3aWR0aCAqIDQpOyAgIC8vIEZJWE1FOiBBc3N1bWVzIDMyLWJpdCBidWZmZXIKKworCQkJCShjaGFyKiYpc291cmNlQnVmZmVyICs9IHN0cmlkZTsKKwkJCQkoY2hhciomKWRlc3RCdWZmZXIgKz0gNCAqIHdpZHRoOworCQkJfQorCisJCQlmcm9udEJ1ZmZlci0+VW5sb2NrKDApOworCQl9CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlckREOjpzZXRHYW1tYVJhbXAoR2FtbWFSYW1wICpnYW1tYVJhbXAsIGJvb2wgY2FsaWJyYXRlKQorCXsKKwkJSURpcmVjdERyYXdHYW1tYUNvbnRyb2wgKmdhbW1hQ29udHJvbCA9IDA7CisKKwkJaWYoZnJvbnRCdWZmZXIpCisJCXsKKwkJCWZyb250QnVmZmVyLT5RdWVyeUludGVyZmFjZShJSURfSURpcmVjdERyYXdHYW1tYUNvbnRyb2wsICh2b2lkKiopJmdhbW1hQ29udHJvbCk7IAorCisJCQlpZihnYW1tYUNvbnRyb2wpCisJCQl7CisJCQkJZ2FtbWFDb250cm9sLT5TZXRHYW1tYVJhbXAoY2FsaWJyYXRlID8gRERTR1JfQ0FMSUJSQVRFIDogMCwgKERER0FNTUFSQU1QKilnYW1tYVJhbXApOworCisJCQkJZ2FtbWFDb250cm9sLT5SZWxlYXNlKCk7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIEZyYW1lQnVmZmVyREQ6OmdldEdhbW1hUmFtcChHYW1tYVJhbXAgKmdhbW1hUmFtcCkKKwl7CisJCUlEaXJlY3REcmF3R2FtbWFDb250cm9sICpnYW1tYUNvbnRyb2wgPSAwOworCisJCWlmKGZyb250QnVmZmVyKQorCQl7CisJCQlmcm9udEJ1ZmZlci0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3REcmF3R2FtbWFDb250cm9sLCAodm9pZCoqKSZnYW1tYUNvbnRyb2wpOyAKKworCQkJaWYoZ2FtbWFDb250cm9sKQorCQkJeworCQkJCWdhbW1hQ29udHJvbC0+R2V0R2FtbWFSYW1wKDAsIChEREdBTU1BUkFNUCopZ2FtbWFSYW1wKTsKKworCQkJCWdhbW1hQ29udHJvbC0+UmVsZWFzZSgpOworCQkJfQorCQl9CisJfQorCisJdm9pZCAqRnJhbWVCdWZmZXJERDo6bG9jaygpCisJeworCQlpZihsb2NrZWQpCisJCXsKKwkJCXJldHVybiBsb2NrZWQ7CisJCX0KKwkJCisJCWlmKCFyZWFkeVN1cmZhY2VzKCkpCisJCXsKKwkJCXJldHVybiAwOworCQl9CisKKwkJRERTVVJGQUNFREVTQyBERFNEOworCQlERFNELmR3U2l6ZSA9IHNpemVvZihERFNEKTsKKworCQlsb25nIHJlc3VsdCA9IGJhY2tCdWZmZXItPkxvY2soMCwgJkREU0QsIERETE9DS19XQUlULCAwKTsKKworCQlpZihyZXN1bHQgPT0gRERfT0spCisJCXsKKwkJCXdpZHRoID0gRERTRC5kd1dpZHRoOworCQkJaGVpZ2h0ID0gRERTRC5kd0hlaWdodDsKKwkJCWludCBiaXREZXB0aCA9IEREU0QuZGRwZlBpeGVsRm9ybWF0LmR3UkdCQml0Q291bnQ7CisJCQlzdHJpZGUgPSBERFNELmxQaXRjaDsKKworCQkJbG9ja2VkID0gRERTRC5scFN1cmZhY2U7CisKKwkJCXJldHVybiBsb2NrZWQ7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwl2b2lkIEZyYW1lQnVmZmVyREQ6OnVubG9jaygpCisJeworCQlpZighbG9ja2VkIHx8ICFiYWNrQnVmZmVyKSByZXR1cm47CisKKwkJYmFja0J1ZmZlci0+VW5sb2NrKDApOworCisJCWxvY2tlZCA9IDA7CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlckREOjpkcmF3VGV4dChpbnQgeCwgaW50IHksIGNvbnN0IGNoYXIgKnN0cmluZywgLi4uKQorCXsKKwkJY2hhciBidWZmZXJbMjU2XTsKKwkJdmFfbGlzdCBhcmdsaXN0OworCisJCXZhX3N0YXJ0KGFyZ2xpc3QsIHN0cmluZyk7CisJCXZzcHJpbnRmKGJ1ZmZlciwgc3RyaW5nLCBhcmdsaXN0KTsKKwkJdmFfZW5kKGFyZ2xpc3QpOworCisJCUhEQyBoZGM7CisKKwkJYmFja0J1ZmZlci0+R2V0REMoJmhkYyk7CisKKwkJU2V0QmtDb2xvcihoZGMsIFJHQigwLCAwLCAyNTUpKTsKKwkJU2V0VGV4dENvbG9yKGhkYywgUkdCKDI1NSwgMjU1LCAyNTUpKTsKKworCQlUZXh0T3V0KGhkYywgeCwgeSwgYnVmZmVyLCBsc3RybGVuKGJ1ZmZlcikpOworCisJCWJhY2tCdWZmZXItPlJlbGVhc2VEQyhoZGMpOworCX0KKworCWJvb2wgRnJhbWVCdWZmZXJERDo6Z2V0U2NhbmxpbmUoYm9vbCAmaW5WZXJ0aWNhbEJsYW5rLCB1bnNpZ25lZCBpbnQgJnNjYW5saW5lKQorCXsKKwkJSFJFU1VMVCByZXN1bHQgPSBkaXJlY3REcmF3LT5HZXRTY2FuTGluZSgodW5zaWduZWQgbG9uZyopJnNjYW5saW5lKTsKKworCQlpZihyZXN1bHQgPT0gRERfT0spCisJCXsKKwkJCWluVmVydGljYWxCbGFuayA9IGZhbHNlOworCQl9CisJCWVsc2UgaWYocmVzdWx0ID09IERERVJSX1ZFUlRJQ0FMQkxBTktJTlBST0dSRVNTKQorCQl7CisJCQlpblZlcnRpY2FsQmxhbmsgPSB0cnVlOworCQl9CisJCWVsc2UgaWYocmVzdWx0ID09IERERVJSX1VOU1VQUE9SVEVEKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCisJCXJldHVybiB0cnVlOworCX0KKworCXZvaWQgRnJhbWVCdWZmZXJERDo6cmVsZWFzZUFsbCgpCisJeworCQl1bmxvY2soKTsKKworCQlpZihiYWNrQnVmZmVyKQorCQl7CisJCQliYWNrQnVmZmVyLT5SZWxlYXNlKCk7CisJCQliYWNrQnVmZmVyID0gMDsKKwkJfQorCisJCWlmKGZyb250QnVmZmVyKQorCQl7CisJCQlmcm9udEJ1ZmZlci0+UmVsZWFzZSgpOworCQkJZnJvbnRCdWZmZXIgPSAwOworCQl9CisKKwkJaWYoZGlyZWN0RHJhdykKKwkJeworCQkJZGlyZWN0RHJhdy0+U2V0Q29vcGVyYXRpdmVMZXZlbCgwLCBERFNDTF9OT1JNQUwpOworCQkJZGlyZWN0RHJhdy0+UmVsZWFzZSgpOworCQkJZGlyZWN0RHJhdyA9IDA7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvTWFpbi9GcmFtZUJ1ZmZlckRELmhwcCBiL3NyYy9NYWluL0ZyYW1lQnVmZmVyREQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzZlODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFpbi9GcmFtZUJ1ZmZlckRELmhwcApAQCAtMCwwICsxLDYyIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZglzd19GcmFtZUJ1ZmZlckREX2hwcA0KKyNkZWZpbmUJc3dfRnJhbWVCdWZmZXJERF9ocHANCisNCisjaW5jbHVkZSAiRnJhbWVCdWZmZXIuaHBwIg0KKw0KKyNpbmNsdWRlIDxkZHJhdy5oPg0KKw0KK25hbWVzcGFjZSBzdw0KK3sNCisJY2xhc3MgRnJhbWVCdWZmZXJERCA6IHB1YmxpYyBGcmFtZUJ1ZmZlcg0KKwl7DQorCXB1YmxpYzoNCisJCUZyYW1lQnVmZmVyREQoSFdORCB3aW5kb3dIYW5kbGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBmdWxsc2NyZWVuKTsNCisNCisJCXZpcnR1YWwgfkZyYW1lQnVmZmVyREQoKTsNCisNCisJCXZvaWQgKmxvY2soKTsNCisJCXZvaWQgdW5sb2NrKCk7DQorDQorCQl2b2lkIGZsaXAoSFdORCB3aW5kb3dPdmVycmlkZSwgdm9pZCAqc291cmNlLCBib29sIEhEUik7DQorCQl2b2lkIGJsaXQoSFdORCB3aW5kb3dPdmVycmlkZSwgdm9pZCAqc291cmNlLCBjb25zdCBSZWN0ICpzb3VyY2VSZWN0LCBjb25zdCBSZWN0ICpkZXN0UmVjdCwgYm9vbCBIRFIpOw0KKw0KKwkJdm9pZCBzY3JlZW5zaG90KHZvaWQgKmRlc3RCdWZmZXIpOw0KKwkJdm9pZCBzZXRHYW1tYVJhbXAoR2FtbWFSYW1wICpnYW1tYVJhbXAsIGJvb2wgY2FsaWJyYXRlKTsNCisJCXZvaWQgZ2V0R2FtbWFSYW1wKEdhbW1hUmFtcCAqZ2FtbWFSYW1wKTsNCisNCisJCXZvaWQgZHJhd1RleHQoaW50IHgsIGludCB5LCBjb25zdCBjaGFyICpzdHJpbmcsIC4uLik7DQorCQlib29sIGdldFNjYW5saW5lKGJvb2wgJmluVmVydGljYWxCbGFuaywgdW5zaWduZWQgaW50ICZzY2FubGluZSk7DQorDQorCXByaXZhdGU6DQorCQl2b2lkIGluaXRGdWxsc2NyZWVuKCk7DQorCQl2b2lkIGluaXRXaW5kb3dlZCgpOw0KKwkJdm9pZCBjcmVhdGVTdXJmYWNlcygpOw0KKwkJYm9vbCByZWFkeVN1cmZhY2VzKCk7DQorCQl2b2lkIHVwZGF0ZUNsaXBwZXIoSFdORCB3aW5kb3dPdmVycmlkZSk7DQorCQl2b2lkIHJlc3RvcmVTdXJmYWNlcygpOw0KKwkJdm9pZCByZWxlYXNlQWxsKCk7DQorDQorCQlITU9EVUxFIGRkcmF3Ow0KKwkJdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkgKkRJUkVDVERSQVdDUkVBVEUpKCBHVUlEIEZBUiAqbHBHVUlELCBMUERJUkVDVERSQVcgRkFSICpscGxwREQsIElVbmtub3duIEZBUiAqcFVua091dGVyICk7DQorCQlIUkVTVUxUIChXSU5BUEkgKkRpcmVjdERyYXdDcmVhdGUpKCBHVUlEIEZBUiAqbHBHVUlELCBMUERJUkVDVERSQVcgRkFSICpscGxwREQsIElVbmtub3duIEZBUiAqcFVua091dGVyICk7DQorCQl0eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSAqRElSRUNURFJBV0VOVU1FUkFURUVYQSkoIExQRERFTlVNQ0FMTEJBQ0tFWEEgbHBDYWxsYmFjaywgTFBWT0lEIGxwQ29udGV4dCwgRFdPUkQgZHdGbGFncyk7DQorCQlIUkVTVUxUIChXSU5BUEkgKkRpcmVjdERyYXdFbnVtZXJhdGVFeEEpKCBMUERERU5VTUNBTExCQUNLRVhBIGxwQ2FsbGJhY2ssIExQVk9JRCBscENvbnRleHQsIERXT1JEIGR3RmxhZ3MpOw0KKw0KKwkJSURpcmVjdERyYXcgKmRpcmVjdERyYXc7DQorCQlJRGlyZWN0RHJhd1N1cmZhY2UgKmZyb250QnVmZmVyOw0KKwkJSURpcmVjdERyYXdTdXJmYWNlICpiYWNrQnVmZmVyOw0KKwl9Ow0KK30NCisNCisjZW5kaWYJIC8vCXN3X0ZyYW1lQnVmZmVyRERfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL01haW4vRnJhbWVCdWZmZXJHREkuY3BwIGIvc3JjL01haW4vRnJhbWVCdWZmZXJHREkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NWI0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFpbi9GcmFtZUJ1ZmZlckdESS5jcHAKQEAgLTAsMCArMSwxNDcgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkZyYW1lQnVmZmVyR0RJLmhwcCIKKworI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJZXh0ZXJuIGJvb2wgZm9yY2VXaW5kb3dlZDsKKworCUZyYW1lQnVmZmVyR0RJOjpGcmFtZUJ1ZmZlckdESShIV05EIHdpbmRvd0hhbmRsZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGZ1bGxzY3JlZW4pIDogRnJhbWVCdWZmZXIod2luZG93SGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBmdWxsc2NyZWVuKQorCXsKKwkJaWYoIXdpbmRvd2VkKQorCQl7CisJCQlTZXRXaW5kb3dQb3Mod2luZG93SGFuZGxlLCBIV05EX1RPUE1PU1QsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIFNXUF9TSE9XV0lORE9XKTsKKworCQkJREVWTU9ERSBkZXZpY2VNb2RlOworCQkJZGV2aWNlTW9kZS5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7CisJCQlkZXZpY2VNb2RlLmRtUGVsc1dpZHRoPSB3aWR0aDsKKwkJCWRldmljZU1vZGUuZG1QZWxzSGVpZ2h0ID0gaGVpZ2h0OworCQkJZGV2aWNlTW9kZS5kbUZpZWxkcyA9IERNX1BFTFNXSURUSCB8IERNX1BFTFNIRUlHSFQ7CQorCisJCQlDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoJmRldmljZU1vZGUsIENEU19GVUxMU0NSRUVOKTsKKwkJfQorCisJCWluaXQodGhpcy0+d2luZG93SGFuZGxlKTsKKworCQliaXREZXB0aCA9IDMyOworCX0KKworCUZyYW1lQnVmZmVyR0RJOjp+RnJhbWVCdWZmZXJHREkoKQorCXsKKwkJcmVsZWFzZSgpOworCisJCWlmKCF3aW5kb3dlZCkKKwkJeworCQkJQ2hhbmdlRGlzcGxheVNldHRpbmdzKDAsIDApOworCisJCQlSRUNUIGNsaWVudFJlY3Q7CisJCQlSRUNUIHdpbmRvd1JlY3Q7CisJCQlHZXRDbGllbnRSZWN0KHdpbmRvd0hhbmRsZSwgJmNsaWVudFJlY3QpOworCQkJR2V0V2luZG93UmVjdCh3aW5kb3dIYW5kbGUsICZ3aW5kb3dSZWN0KTsKKwkJCWludCB3aW5kb3dXaWR0aCA9IHdpZHRoICsgKHdpbmRvd1JlY3QucmlnaHQgLSB3aW5kb3dSZWN0LmxlZnQpIC0gKGNsaWVudFJlY3QucmlnaHQgLSBjbGllbnRSZWN0LmxlZnQpOworCQkJaW50IHdpbmRvd0hlaWdodCA9IGhlaWdodCArICh3aW5kb3dSZWN0LmJvdHRvbSAtIHdpbmRvd1JlY3QudG9wKSAtIChjbGllbnRSZWN0LmJvdHRvbSAtIGNsaWVudFJlY3QudG9wKTsKKwkJCWludCBkZXNrdG9wV2lkdGggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKKwkJCWludCBkZXNrdG9wSGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CisJCQlTZXRXaW5kb3dQb3Mod2luZG93SGFuZGxlLCBIV05EX1RPUCwgZGVza3RvcFdpZHRoIC8gMiAtIHdpbmRvd1dpZHRoIC8gMiwgZGVza3RvcEhlaWdodCAvIDIgLSB3aW5kb3dIZWlnaHQgLyAyLCB3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0LCBTV1BfU0hPV1dJTkRPVyk7CisJCX0KKwl9CisKKwl2b2lkICpGcmFtZUJ1ZmZlckdESTo6bG9jaygpCisJeworCQlzdHJpZGUgPSB3aWR0aCAqIDQ7CisKKwkJcmV0dXJuIGxvY2tlZDsKKwl9CisKKwl2b2lkIEZyYW1lQnVmZmVyR0RJOjp1bmxvY2soKQorCXsKKwl9CisKKwl2b2lkIEZyYW1lQnVmZmVyR0RJOjpmbGlwKEhXTkQgd2luZG93T3ZlcnJpZGUsIHZvaWQgKnNvdXJjZSwgYm9vbCBIRFIpCisJeworCQlibGl0KHdpbmRvd092ZXJyaWRlLCBzb3VyY2UsIDAsIDAsIEhEUik7CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlckdESTo6YmxpdChIV05EIHdpbmRvd092ZXJyaWRlLCB2b2lkICpzb3VyY2UsIGNvbnN0IFJlY3QgKnNvdXJjZVJlY3QsIGNvbnN0IFJlY3QgKmRlc3RSZWN0LCBib29sIEhEUikKKwl7CisJCWlmKHdpbmRvd2VkICYmIHdpbmRvd092ZXJyaWRlICE9IDAgJiYgd2luZG93T3ZlcnJpZGUgIT0gYml0bWFwV2luZG93KQorCQl7CisJCQlyZWxlYXNlKCk7CisJCQlpbml0KHdpbmRvd092ZXJyaWRlKTsKKwkJfQorCisJCWNvcHkod2luZG93T3ZlcnJpZGUsIHNvdXJjZSwgSERSKTsKKworCQlpbnQgc291cmNlTGVmdCA9IHNvdXJjZVJlY3QgPyBzb3VyY2VSZWN0LT5sZWZ0IDogMDsKKwkJaW50IHNvdXJjZVRvcCA9IHNvdXJjZVJlY3QgPyBzb3VyY2VSZWN0LT50b3AgOiAwOworCQlpbnQgc291cmNlV2lkdGggPSBzb3VyY2VSZWN0ID8gc291cmNlUmVjdC0+cmlnaHQgLSBzb3VyY2VSZWN0LT5sZWZ0IDogd2lkdGg7CisJCWludCBzb3VyY2VIZWlnaHQgPSBzb3VyY2VSZWN0ID8gc291cmNlUmVjdC0+Ym90dG9tIC0gc291cmNlUmVjdC0+dG9wIDogaGVpZ2h0OworCQlpbnQgZGVzdExlZnQgPSBkZXN0UmVjdCA/IGRlc3RSZWN0LT5sZWZ0IDogMDsKKwkJaW50IGRlc3RUb3AgPSBkZXN0UmVjdCA/IGRlc3RSZWN0LT50b3AgOiAwOworCQlpbnQgZGVzdFdpZHRoID0gZGVzdFJlY3QgPyBkZXN0UmVjdC0+cmlnaHQgLSBkZXN0UmVjdC0+bGVmdCA6IGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0OworCQlpbnQgZGVzdEhlaWdodCA9IGRlc3RSZWN0ID8gZGVzdFJlY3QtPmJvdHRvbSAtIGRlc3RSZWN0LT50b3AgOiBib3VuZHMuYm90dG9tIC0gYm91bmRzLnRvcDsKKworCQlTdHJldGNoQmx0KHdpbmRvd0NvbnRleHQsIGRlc3RMZWZ0LCBkZXN0VG9wLCBkZXN0V2lkdGgsIGRlc3RIZWlnaHQsIGJpdG1hcENvbnRleHQsIHNvdXJjZUxlZnQsIHNvdXJjZVRvcCwgc291cmNlV2lkdGgsIHNvdXJjZUhlaWdodCwgU1JDQ09QWSk7CisJfQorCisJdm9pZCBGcmFtZUJ1ZmZlckdESTo6c2V0R2FtbWFSYW1wKEdhbW1hUmFtcCAqZ2FtbWFSYW1wLCBib29sIGNhbGlicmF0ZSkKKwl7CisJCVNldERldmljZUdhbW1hUmFtcCh3aW5kb3dDb250ZXh0LCBnYW1tYVJhbXApOworCX0KKworCXZvaWQgRnJhbWVCdWZmZXJHREk6OmdldEdhbW1hUmFtcChHYW1tYVJhbXAgKmdhbW1hUmFtcCkKKwl7CisJCUdldERldmljZUdhbW1hUmFtcCh3aW5kb3dDb250ZXh0LCBnYW1tYVJhbXApOworCX0KKworCXZvaWQgRnJhbWVCdWZmZXJHREk6OnNjcmVlbnNob3Qodm9pZCAqZGVzdEJ1ZmZlcikKKwl7CisJCVVOSU1QTEVNRU5URUQoKTsKKwl9CisKKwlib29sIEZyYW1lQnVmZmVyR0RJOjpnZXRTY2FubGluZShib29sICZpblZlcnRpY2FsQmxhbmssIHVuc2lnbmVkIGludCAmc2NhbmxpbmUpCisJeworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXZvaWQgRnJhbWVCdWZmZXJHREk6OmluaXQoSFdORCB3aW5kb3cpCisJeworCQliaXRtYXBXaW5kb3cgPSB3aW5kb3c7CisKKwkJd2luZG93Q29udGV4dCA9IEdldERDKHdpbmRvdyk7CisJCWJpdG1hcENvbnRleHQgPSBDcmVhdGVDb21wYXRpYmxlREMod2luZG93Q29udGV4dCk7CisKKwkJQklUTUFQSU5GTyBiaXRtYXBJbmZvOworCQltZW1zZXQoJmJpdG1hcEluZm8sIDAsIHNpemVvZihCSVRNQVBJTkZPKSk7CisJCWJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPKTsKKwkJYml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDMyOworCQliaXRtYXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7CisJCWJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0ID0gLWhlaWdodDsKKwkJYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCA9IHdpZHRoOworCQliaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOworCQkKKwkJYml0bWFwID0gQ3JlYXRlRElCU2VjdGlvbihiaXRtYXBDb250ZXh0LCAmYml0bWFwSW5mbywgRElCX1JHQl9DT0xPUlMsICZsb2NrZWQsIDAsIDApOworCQlTZWxlY3RPYmplY3QoYml0bWFwQ29udGV4dCwgYml0bWFwKTsKKwl9CisKKwl2b2lkIEZyYW1lQnVmZmVyR0RJOjpyZWxlYXNlKCkKKwl7CisJCVNlbGVjdE9iamVjdChiaXRtYXBDb250ZXh0LCAwKTsKKwkJRGVsZXRlT2JqZWN0KGJpdG1hcCk7CisJCURlbGV0ZURDKHdpbmRvd0NvbnRleHQpOworCQlEZWxldGVEQyhiaXRtYXBDb250ZXh0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvTWFpbi9GcmFtZUJ1ZmZlckdESS5ocHAgYi9zcmMvTWFpbi9GcmFtZUJ1ZmZlckdESS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyYWY3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL0ZyYW1lQnVmZmVyR0RJLmhwcApAQCAtMCwwICsxLDUwIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZglzd19GcmFtZUJ1ZmZlckdESV9ocHANCisjZGVmaW5lCXN3X0ZyYW1lQnVmZmVyR0RJX2hwcA0KKw0KKyNpbmNsdWRlICJGcmFtZUJ1ZmZlci5ocHAiDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwljbGFzcyBGcmFtZUJ1ZmZlckdESSA6IHB1YmxpYyBGcmFtZUJ1ZmZlcg0KKwl7DQorCXB1YmxpYzoNCisJCUZyYW1lQnVmZmVyR0RJKEhXTkQgd2luZG93SGFuZGxlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgZnVsbHNjcmVlbik7DQorDQorCQl2aXJ0dWFsIH5GcmFtZUJ1ZmZlckdESSgpOw0KKw0KKwkJdm9pZCAqbG9jaygpOw0KKwkJdm9pZCB1bmxvY2soKTsNCisNCisJCXZvaWQgZmxpcChIV05EIHdpbmRvd092ZXJyaWRlLCB2b2lkICpzb3VyY2UsIGJvb2wgSERSKTsNCisJCXZvaWQgYmxpdChIV05EIHdpbmRvd092ZXJyaWRlLCB2b2lkICpzb3VyY2UsIGNvbnN0IFJlY3QgKnNvdXJjZVJlY3QsIGNvbnN0IFJlY3QgKmRlc3RSZWN0LCBib29sIEhEUik7DQorDQorCQl2b2lkIHNldEdhbW1hUmFtcChHYW1tYVJhbXAgKmdhbW1hUmFtcCwgYm9vbCBjYWxpYnJhdGUpOw0KKwkJdm9pZCBnZXRHYW1tYVJhbXAoR2FtbWFSYW1wICpnYW1tYVJhbXApOw0KKw0KKwkJdm9pZCBzY3JlZW5zaG90KHZvaWQgKmRlc3RCdWZmZXIpOw0KKwkJYm9vbCBnZXRTY2FubGluZShib29sICZpblZlcnRpY2FsQmxhbmssIHVuc2lnbmVkIGludCAmc2NhbmxpbmUpOw0KKw0KKwlwcml2YXRlOg0KKwkJdm9pZCBpbml0KEhXTkQgYml0bWFwV2luZG93KTsNCisJCXZvaWQgcmVsZWFzZSgpOw0KKw0KKwkJSERDIHdpbmRvd0NvbnRleHQ7DQorCQlIREMgYml0bWFwQ29udGV4dDsNCisJCUhXTkQgYml0bWFwV2luZG93Ow0KKwkJDQorCQlIQklUTUFQIGJpdG1hcDsNCisJfTsNCit9DQorDQorI2VuZGlmCSAvLwlzd19GcmFtZUJ1ZmZlckdESV9ocHANCmRpZmYgLS1naXQgYS9zcmMvTWFpbi9Mb2dvLmNwcCBiL3NyYy9NYWluL0xvZ28uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2M4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFpbi9Mb2dvLmNwcApAQCAtMCwwICsxLDE4MCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKworZXh0ZXJuIGNvbnN0IGludCBsb2dvV2lkdGggPSAzOTY7CitleHRlcm4gY29uc3QgaW50IGxvZ29IZWlnaHQgPSAxMjQ7CisKKyNpZiBTM1RDX1NVUFBPUlQKKwlleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IGxvZ29EYXRhW2xvZ29XaWR0aCAqIGxvZ29IZWlnaHQgLyA0XSA9CisJeworCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEVGOUVGRkZGLCAweDQwMDAwMDAwLCAweDZEQjYxMTA1LCAweDI2MERCNkRCLCAweEQ3MURGRkZGLCAweDU1MDAwMDAwLCAweDZEQjYwQjAyLCAweEQ4MURCNkRCLCAweEQ3MURGRkZGLCAweDA1MDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZEQjY4NzA2LCAweDJDNkRCNkRCLCAweDNDRUJGRkZGLCAweDc4MDAwMDAwLCAweDZEQjZDOTA2LCAweDI0REIxODVCLCAweDI0ODlGN0RFLCAweDU1NUU4MDAwLCAweDVCQzkwMEU1LCAweDM1MkM5MjZBLCAweDE0ODlERjdDLCAweDE1RDU1NzYwLCAweDMwMDE3NDAwLCAweDAzNjAzNjAwLCAweDJDRUJGRkZGLCAweDAwMDAwMzA5LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAKKwkJMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2REI2RkYwNCwgMHgxQjZEQjZEQiwgMHhFNzdFRkZGRiwgMHg0MDAwMDAwMCwgMHg2REI2QzQwMCwgMHgyNEIzNTA2MywgMHgxQjE1RkZERiwgMHhENzU4QzAwMCwgMHg0OUI5MEFEQSwgMHg0OTI0OTI0OSwgMHgxMzU2QTZCRCwgMHhGRkZENTU1OCwgMHgzRDcxOUFEMywgMHg4RTM3MUM4RSwgMHgxQjE1MjRCOSwgMHgyQTgwQUI1NSwgMHgyM0FCNEJEOSwgMHg0RDI0OUE2OSwgMHgyMzE0MkM5OSwgMHgwMDAwN0VCNSwgMHg1REIyQzEwMywgMHgyNDk4NDkwQSwgMHgxQjc2RUY5RSwgMHg1RjU1MzUwMiwgMHg2REI2QUIwOSwgMHhDMTFEODBEQiwgMHgyQjU1RkZGRiwgMHgwRDAyMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2REI2NUQwNSwgMHgyQzZEQjZEQiwgMHg3NThGRkZGRiwgMHg3ODAwMDAwMCwgMHg2REI2QzIwMCwgMHgyNERCMTAwMywgMHg0RDBBRkZGRiwgMHg1NTVDODAwMCwgMHgyNjA2QkUwMCwgMHgyNDkyNDkzNiwgMHgzNEM3RTdCQywgMHhGN0RENTdFMCwgMHgzNEU3NzBENCwgMHg0RDM2OUE0RCwgMHgzNEM5NURBOSwgMHg4MEFBRkQ1NywgMHgzNkQzNjREQSwgMHgyRDM2RDM0RCwgMHgyNDg4NEQyOSwgMHhCODcwRUFGQSwgMHg1QzI5QzAwNCwgMHhEQjZEQjNEOSwgMHgyNDg5RkZGRiwgMHgwMDAzMDkyNSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgCisJCTB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjgzNkMyMDAsIDB4MjRBMjU4MzAsIDB4MjMzNUZGREYsIDB4NTc1NDcwNjAsIDB4OTNDOUJEREQsIDB4Mjc5RTRGRTcsIDB4MUIzNTJDREEsIDB4ODM4MTA5MDUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MjNENzI0OTksIDB4NUU3RUY4QTAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MUI5NjI0MzgsIDB4NTdGRkVFMjAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MjM5NTI0NTgsIDB4RkRCRjJCMDIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MjQxODJDREEsIDB4MkQyRjBCQzIsIDB4MjM5QTAwRUQsIDB4NDlBNjkzQ0QsIDB4MUI1NUNGNUUsIDB4NTc1N0Q1MTUsIDB4MERCNjk4MDAsIDB4RDkxMDAyMDAsIDB4MzM3NUZGRkYsIDB4MDkwMzAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NkRCNjM2MEMsIDB4MjM2REI2REIsIDB4OTYxM0ZGRkYsIDB4NzAwMDAwMDAsIDB4NkRCNkJCMDAsIDB4MjRDOEMwMUIsIDB4NTUwOUZGRkYsIDB4NTU3ODAwMDAsIDB4QTQzNkNBMDAsIDB4QTY5MjREQjEsIDB4NENFNkVGQkMsIDB4RkZENTVFODAsIDB4MjRFOTUxRDgsIDB4NDkyNjlBNDksIDB4NENDOTdERTgsIDB4MDAyMEE5RDcsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NUQ0OTZERTgsIDB4MDAwMEFCRkQsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NjVBOTZERTgsIDB4ODhBMDhBRTUsIDB4OTI0OUJGRTMsIDB4MjQ5MjQ5MjQsIDB4M0NDOTY1RTksIDB4N0FFOEU4QTAsIDB4OTE0OUMwMDAsIDB4MDAzRDkxQ0EsIDB4M0NFQUY3REUsIDB4MDEwRDI1MTUsIDB4NkRCNkFGMDMsIDB4MzU4NDM2REIsIDB4QjZBQUZGRkYsIDB4NTdFMDAwMDAsIDB4NkRCNkMxMDEsIDB4MjQ5QjIzMDAsIDB4QjZBQkZGRkYsIDB4RkY1NUE4MDAsIDB4MERCNkMyMDAsIDB4MjQ5OTJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NTJBMDAsIDB4NkRCNkJEMDUsIDB4MTI5RDkyREIsIDB4QkVBQkZGRkYsIDB4RDcwRDAwMDAsIDB4NkRCNjg0MDAsIDB4MjgwODM2MUIsIDB4QjZBQkZGRkYsIDB4NzA2MDgwMDAsIDB4MERCNkM0MEEsIDB4MjQ5QjZDMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMDAsIDB4MTA5MEFEMDAsIDB4QkVBQkZGRkYsIDB4OUYxNTBBMDAsIDB4NkRCNkI2MDAsIDB4MkMwODg2MDMsIDB4QkVBQkZGRkYsIDB4RDg1MDgwMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMDAsIDB4Q0M5MDI1MDAsIDB4QkVDQ0ZGRkYsIDB4MzczNTBBMDAsIDB4NkRCNkI1MDAsIDB4MzAwODg2MDMsIDB4QjY4OEZGRkYsIDB4RDg1MDgwMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkJGMDIsIDB4NTQ5MEVEMDAsIDB4QkVBQkZGRkYsIDB4REY5NTBBMDAsIDB4MERCNkMzMDAsIDB4MjRCQjYyMDAsIDB4QkVBQ0ZGRkYsIDB4RjU1NUE4MDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMEIsIDB4MjQ5QjJEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkJDMDIsIDB4MzQ5NEE1QzAsIDB4QjZBQUZGRkYsIDB4NTdGNTBBMDAsIDB4MERCNkMzMDAsIDB4MjQ5OTYzNDAsIDB4QjZBQUZGRkYsIDB4RkY1NUE4MDAsIDB4MERCNkMyMDAsIDB4MjQ5NzI1MDAsIDB4QjZBQUZGRkYsIDB4RkY1NTJBMDAsIDB4NkRCNkFEMDAsIDB4MEUxMDAyREIsIDB4QkVBQkZGRkYsIDB4OTUwQjAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRUZGRkYsIDB4MDMwMDAwMDAsIDB4NkRCNkMyMDgsIDB4MzU2QjA2MDMsIDB4QkVBQkZGRkYsIDB4REM1OEEwMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMzMDAsIDB4MDE5MDE1MDAsIDB4QjY4OUZGRkYsIDB4MjcwRDAyMDAsIDB4NkRCNkMyMDAsIDB4MzUwQUM2NDMsIDB4QkVBQkZGRkYsIDB4RDg1OEEwMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkQ0MDAsIDB4MDE5MDE0MDAsIDB4QjY4OUZGRkYsIDB4MjcwNTAyMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NkRCNkVFMDAsIDB4QjYwOTEwNDAsIDB4QkVBQkZGRkYsIDB4RjQ1NEEwMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RUY1NUFBMDAsIDB4MERCNkM2MDAsIDB4ODQ5NTZEMDEsIDB4QkVBQkZGRkYsIDB4N0Y1NTJBMDAsIDB4NkRCNjBDMDMsIDB4REIxREIwREIsIDB4RDc1NUZGRkYsIDB4MDEwMjAwMDAsIDB4NkRCNkMzMDAsIDB4MzAwQUM2MDMsIDB4QjZBQUZGRkYsIDB4RDg1MDgwMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RUY1NUFBMDAsIDB4MERCNkMzMDAsIDB4MjQ5OTZEMDEsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4NkRCNkJBMEQsIDB4NTI5QzAzREIsIDB4QkVBQkZGRkYsIDB4RDcyRDAwMDAsIDB4NkRCNkZGMDQsIDB4REIwREI2REIsIDB4RUZCQkZGRkYsIDB4MDEwMDAwMDAsIDB4NkRCNkMwMDAsIDB4MzAwQTg2MDMsIDB4QjZBOUZGRkYsIDB4RDA1MDgwMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RUY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RUY1NUFBMDAsIDB4MERCNkMwMDEsIDB4QTQ5OTZEMDEsIDB4QkVBQkZGRkYsIDB4N0Y1NUFBMDAsIDB4NkRCNkMxMDAsIDB4MzAyQUMwMDMsIDB4QkVBQkZGRkYsIDB4RDk1MkEwMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RUY1NUFBMDAsIDB4MERCNkMyMTIsIDB4MjQ5QjZEMDAsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkMyMDEsIDB4MjQ5OTZEMDEsIDB4QkVBQkZGRkYsIDB4RkY1NUFBMDAsIDB4MERCNkIzMDAsIDB4NTA5MDEzMDAsIDB4QjZBQUZGRkYsIDB4RDcyRDAwMDAsIDB4NkRCNkZGMDYsIDB4REIwREI2REIsIDB4RUY5QUZGRkYsIDB4MDEwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIAorCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYxQjZCOTAzLCAweDJCNkEzNjVCLCAweDFBRjRGRkRGLCAweDYwNDBDMDgwLCAweEM3MTk4REQ4LCAweDcxQjZFMzhELCAweDFCNzYyMkY0LCAweERGREZERUZDLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDFCNzUyQzk5LCAweEQ1QjU4RDgxLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDFCOTYyNDE3LCAweDdFN0U3OEY4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDFCNTYyMzk2LCAweEZFRkVCQUE4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDFCNzYyM0Q3LCAweEJEQjUzRDJGLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDFCNTYyQ0I5LCAweDdGRUIyQjJCLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDFCNTUyNDU4LCAweDc1NTU1NzU0LCAweDlEQTFCQzAwLCAweDE0OTBDOUNBLCAweDFCMzVGRkZGLCAweDk1MzUyNTBELCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZEQjZGRjE2LCAweDFCNkRCNkRCLCAweEFFNzVGRkZGLCAweDQwMDAwMDAwLCAweDZEQjZDMzA1LCAweDI2MzY4NkRCLCAweDU0QTdGN0RFLCAweDU3RTAwMDAwLCAweDAwMzZDMTAwLCAweDI0OTI0REIxLCAweDVDRTdGN0RDLCAweEFGRDU1ODgwLCAweDI0RjEzM0Q3LCAweDQ5MjQ5MjQ5LCAweDU0RThDNkNDLCAweEE4ODJCNTU2LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDY1Njk5RTI5LCAweEE4QTA4MEFELCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDc2MDg5NUU5LCAweDdGREZGNzc4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDc1RTg3RTA4LCAweEZBRUU2RjdFLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDZFMDk3NUU4LCAweDAyQTIyMjJBLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDVENDk2REU4LCAweDc4RTBDMDgwLCAweEE4OTIwN0U2LCAweEU3MjNEQTJELCAweDQ0RThFRkJDLCAweDA1MzU5NTU3LCAweDA2MDBDMDAwLCAweDI0QzI2MjJELCAweEE2NDhGN0RELCAweDZGQkZGOEUyLCAweEI2RTE4NkQ0LCAweDZEQjZEQjZELCAweDAzOTZDNkYwLCAweDU3NTg4MDAwLCAweEUzRjZCM0Q2LCAweEQ3NkJBRURCLCAweDAzOTZENzJFLCAweDU1NTU1N0EwLCAweDVERjlCMUQ2LCAweEQ3NUI3NTNGLCAweDAzOTdCNjhFLCAweDU1NTVENTAwLCAweDYyRTM5REQxLCAweDMxQzlFQjhGLCAweDBCQjVDNkVGLCAweEQ1MjUwMjAwLCAweEE3Q0UwNUQ3LCAweDQ5MjU1MjdBLCAweEI2QUFFNzc4LCAweERCRDY1NzczLCAweEQyN0RCMUQ3LCAweEJCRUI3REQ0LCAweDAzOTZENzEwLCAweDVDNUM1ODIwLCAweDRENzZBMUQzLCAweDMyNDMxQ0YyLCAweDAzOTZBRTZDLCAweDk1OTVENTAwLCAweDlEMDlDMjAwLCAweDBBOTA4OUNDLCAweEJFQUJGRkZGLCAweDM3MTcxRjlGLCAweDAzMDZDMDAxLCAweDM1NjM1MDMwLCAweEI2QUFGRkZGLCAweEQ0RENEOEQ4LCAweDYyN0RCMEQxLCAweEI2RkI2RUI3LCAweDBCQjZERjRDLCAweDU2NTY1NEE4LCAweDREQjZBNkQyLCAweERBNEZBNDM2LCAweDAzOTdBRTZELCAweDM1MTUxNTAwLCAweDlDODlCRjA1LCAweEMyMUMyOUNBLCAweEJFQUNGRkZGLCAweDI3MjczNzM3LCAweDYzMDZCRjBCLCAweDM1NjM1NjMwLCAweEJFQUJGRkZGLCAweEQ0RENEQ0Q4LCAweEUzQ0NBRkNFLCAweEIyRTkyRUIyLCAweDAzOTZENzJDLCAweDU2NTY1NDI4LCAweDNCQjZBNENGLCAweDg2NEJEQ0Q2LCAweDAzOTZCNjhELCAweDM1MzUxNTAwLCAweDQzRURBRkQwLCAweEIzRDk3NUJCLCAweDAzQjVERjUxLCAweDVDNTg1OEEwLCAweDVGQkVBN0Q3LCAweDM2NTMyQ0Y2LCAweDAzOTdBRTZDLCAweEQ1RDU1NTAwLCAweDIyRDIxN0QyLCAweDM1MjM0MjMxLCAweEJFQUJENzM0LCAweERBNUI5MTUzLCAweDc2RDE1RkQ3LCAweDRENTRERDZELCAweDEzRDZDNkNFLCAweDYwNDA0MDAwLCAweDUyNDlCMUQ3LCAweEQ3NUI3NUQ3LCAweDAzOTdBNjZELCAweDU1NTU1NTAwLCAweDUyNDlCMUQ3LCAweEQ3NUI3NUQ3LCAweDAzOTdBNjZELCAweDU1NTU1NTAwLCAweDUyNDlCMUQ3LCAweEQ3NUI3NUQ3LCAweDAzOTdBNjZELCAweDU1NTU1NTAwLCAweDUyNDlCMUQ3LCAweEQ3NUI3NUQ3LCAweDAzOTdBNjZELCAweDU1NTU1NTAwLCAweDM5QjZBNENFLCAweDg2M0JEQ0JBLCAweDAzOTZCRUFELCAweDM1MzUxNTAwLCAweEQyNkRCMUQwLCAweEI3REI3REJBLCAweDBCQjVERjMxLCAweDU4NTg1MEEwLCAweDUyNDlCMUQ3LCAweEQ3NUI3NUQ3LCAweDAzOTdBNjZELCAweDU1NTU1NTAwLCAweDUyNDlCMUQ3LCAweEQ3NUI3NUQ3LCAweDAzOTdBNjZELCAweDU1NTU1NTAwLCAweDUyNDlCMUQ3LCAweEQ3NUI3NUQ3LCAweDAzOTdBNjZELCAweDU1NTU1NTAwLCAweDUyNDlCMUQ3LCAweEQ3NUI3NUQ3LCAweDAzOTdBNjZELCAweDU1NTU1NTAwLCAweERGQzlCMEQ2LCAweEQ2REI3NUQ2LCAweDBCQjdCNjhFLCAweDE1MTU5NTAwLCAweEZGRjdCOUQ4LCAweEZCRkZGRTNGLCAweDhEQzhENzMyLCAweDU1NUNFMDBBLCAweEUzQjVCNENGLCAweEI2REI2REJCLCAweDhEQzlENzMwLCAweDU1NTU1NUE4LCAweDVCQjdCM0QxLCAweEI3NUI2RDNGLCAweDhEQzlDRjBGLCAweDU1NTVENTBBLCAweDNGMTI2MUQxLCAweDREMjREQTY5LCAweDhEQzhDRjExLCAweDk1MjUwMkEwLCAweDREQjJDMTAwLCAweDEwOUNBOTAxLCAweEI2QUFGRkRFLCAweERGMzcwNTAzLCAweDYzNDZCQjI0LCAweDI0NjM0NjI0LCAweEJFQ0NGRkZGLCAweERDRENEQ0RDLCAweEYyNEVCMEQzLCAweEI2RkI2RkI2LCAweDhEQzlCNkFCLCAweDU3NTY1NjAwLCAweDQ5QkVBOUNGLCAweEJFNDg2NDg2LCAweDg1QzhDRjBGLCAweDM1MzUzNTJBLCAweDkwMTlCQzA0LCAweEMxOTAyMTAxLCAweEI2ODlGN0RFLCAweDI3MjcyNzI3LCAweDYzNDZDMTE4LCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweEQ4RDhEOEQ4LCAweEYyNEVCMUQ1LCAweEI2RkJBRkI2LCAweDhEQzlCRUNCLCAweDU2NTY1NjIwLCAweDRCQkZBQUQwLCAweEE2NEJFNEE2LCAweDhEQzhDRUVGLCAweDE1MTUzNTJBLCAweDEwMTlCQzAyLCAweDAyMTAxOTAyLCAweEI2ODlGRkZGLCAweDI3MDcyNzI3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweEY0OTkwMkQxLCAweDQ5NzQxRjA5LCAweEFFNDhFNzc3LCAweDRGNkNFQ0VDLCAweEUyNDlCMUQ2LCAweEJBREQ3NUI2LCAweDg1QzlCNkFCLCAweDU1NTU1NTAwLCAweDMyOUM4M0NGLCAweDhFMkNBM0NFLCAweDhEQzdENzMxLCAweDhEOEQ4OThBLCAweDJEQjAyQzEzLCAweERCMURCNERCLCAweEJFQ0RGRkZGLCAweDAxMDEwMzAzLCAweDYzMDZDMjA1LCAweDMzNjMwNjMzLCAweEI2QUFGRkZGLCAweEQwRDhEOEQ4LCAweENGRkNBRUNCLCAweDkyQzkyQzkyLCAweDg1QzlDRUVFLCAweDU0NTQ1NEE4LCAweDUyNDlCMUQ5LCAweERBRUJBRUQ3LCAweDhEQzlCNkFCLCAweDU1NTU1NTAwLCAweDUyNDlCMUQ5LCAweERBRUJBRUQ3LCAweDhEQzlCNkFCLCAweDU1NTU1NTAwLCAweDVEODlCMkQ0LCAweEJBRUI2REZCLCAweDhEQzlDRjBFLCAweDU1NTU1NTJBLCAweDUzMUM5QkQzLCAweEIxQzk2MzcyLCAweDg1QzhENzMxLCAweEQ1QjUwQjgwLCAweDlEODNDMDA2LCAweDQ0OTBDOTAxLCAweEJFQUJGN0RFLCAweDVGOTcyNTA5LCAweDAyQzZDOTAwLCAweEIwMDJDMDMwLCAweEI2QTlGN0RELCAweEQwRDBEMEQwLCAweDYyNERCMUQ4LCAweEJCNkQ3REJCLCAweDhEQzhDRUVFLCAweDU0NTQ1NEE4LCAweDUyNDlCMUQ5LCAweERBRUJBRUQ3LCAweDhEQzlCNkFCLCAweDU1NTU1NTAwLCAweDUyNDlCMUQ5LCAweERBRUJBRUQ3LCAweDhEQzlCNkFCLCAweDU1NTU1NTAwLCAweDUyNDlCMUQ5LCAweERBRUJBRUQ3LCAweDhEQzlCNjhCLCAweDU1NTU1NTAwLCAweDUyNDlCMUQ5LCAweERBRUJBRUQ3LCAweDhEQzlCNkFCLCAweDU1NTU1NTAwLCAweEQzMkVBNEQ2LCAweDMwQ0YwQzMwLCAweDhEQzdENzMyLCAweDhEOEQ4RDhBLCAweEY1MEYwQkNGLCAweDEwRjUwRjEwLCAweEI2ODlERjc2LCAweDkzOTM5MTkzLCAweEUzRkRBRkNFLCAweEIyRTk2REIyLCAweDhEQzlDRjBFLCAweDU2NTY1NkE4LCAweDUyNDlCMUQ5LCAweERBRUJBRUQ3LCAweDhEQzlCNkFCLCAweDU1NTU1NTAwLCAweDUyNDlCMUQ5LCAweERBRUJBRUQ3LCAweDhEQzlCNkFBLCAweDU1NTU1NTAwLCAweDZEQzlCM0Q1LCAweEQ3NkJBREZCLCAweDhEQzlCRUNDLCAweDU1NTU1NTA4LCAweEQzMjRBMkQxLCAweEIxQzk2NDhFLCAweDg1QTdENzExLCAweEQ1MzUwQjgwLCAweDUwMDNEOTAwLCAweDU0RDRFRDAyLCAweEI2ODlGRkZFLCAweDdGOUYzNzBELCAweDZEQjZGRjAzLCAweERCMERCNkRCLCAweEVGQkJGRkZGLCAweDAxMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAKKwkJMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MkY2QzEwMywgMHgzNDYzNzYzMywgMHgxQjE1RjdCRSwgMHg1MDUwNzA3MCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgxQjU1MUI3NSwgMHhCRkZGRkZGRiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgxM0I2MUI1NSwgMHg1RkU4QTIyMCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwQkY3MUI5NiwgMHg1RkZBODBBMCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwNDE3MUI5NiwgMHhGN0ZCQUEwMCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwQkY3MUI5NiwgMHhENUFGMkEyOCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgxM0Q3MjM1NSwgMHhGREFGMkEyMywgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgxQjU1MUI3NiwgMHhFOEZFRjdGRiwgMHgyMjkyMUFENiwgMHhBOTJDMTJFOSwgMHgxMzU1NjUxOSwgMHhERDVEOTUxRCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MjM2NzAwMCwgMHg5QjBCODAyMCwgMHg0Qzg4RkZGRiwgMHhDMEMwQzA0MCwgMHg5M0NGQkRENywgMHhFNzkzQ0ZFNywgMHg2NTA3RUY3MSwgMHg4RDBEMkRCNSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHhBNjI4REYwRiwgMHg3QUZBRThFMCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4NjA4QjY2QSwgMHhERDVGNThFMCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3RTA4OEUyOCwgMHhFRUZFRkU3RiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3RTA4ODYwOSwgMHg3QUZGNzY1RiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3NUU4N0UwOCwgMHhDOEU4QUFFQSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3NjA4N0RDOSwgMHgyRkJERkZGRiwgMHg5MjQ5QzEyOCwgMHhDODkxNDlBNCwgMHg0NEU3RTdCOSwgMHgzNUQ3NUY3RiwgMHgyODA0QzAwMCwgMHgzNTgzMDZBRiwgMHg1NTAzRjdEQSwgMHhBOEE4QTJBMSwgMHhGRkY5QkFENSwgMHhGQjlGQ0ZGRiwgMHgwQkI2RDczMCwgMHg1NjVDNTg2MCwgMHhDOTI0QTVEMCwgMHhGNjQ4RTQ5MSwgMHgwMzk3NzU2RSwgMHgxNTU1NTU1NSwgMHhEOTY1QTdEOCwgMHg5NkUyNEVCMiwgMHgwMzk2RDcyRiwgMHgwMEFGNTU1NSwgMHg0OTI0QTJENCwgMHhBNjQ5NDk5MiwgMHgwMzk2RDcwRSwgMHg2MDVFNTU1NSwgMHhGM0ZGQkJENywgMHhGRkZGRkZGRiwgMHgwMzk3MEJCNiwgMHg1NTU3NzU5NSwgMHg2OEUxOUVEMywgMHg4Q0M5M0M3MywgMHgwMzc1Q0YxMSwgMHgwOTA5MDMwMiwgMHgxRDhFQjdEMywgMHhEQjFEQjlEQiwgMHgwMzk3QkVDRCwgMHg1NjU2NTQ1NCwgMHg0MzY0QTZEMywgMHhBNjRBNjREQSwgMHgwMzk3QkVBRCwgMHgzNTM1MTUxNSwgMHg5Q0E5QzAwMCwgMHgwMTlDMjFEQSwgMHhCRUFCRkZGRiwgMHgyNzA3MjczNywgMHgxNEYxMDBERSwgMHg0QTE0QTk0QiwgMHhCNkFCRkZGRiwgMHg3NkY2RDRENCwgMHg3REE5QjRENSwgMHhEQUZENzFCQiwgMHgwMzk3NzU4RiwgMHg1NzU3NTY1NCwgMHg0QkU0QTFENywgMHg4NjQ4NjQ4NiwgMHgwMzk2Q0YwRiwgMHgyNTI1MzUzNSwgMHg5REExQzAwMiwgMHhEOTVEOTFEOSwgMHhCNkFBRkZGRiwgMHgwRDBEMDcwNywgMHg5NEIxMDBENCwgMHgwQTc0QTE0QSwgMHhCNjhBRUZCQiwgMHg2NkY2QjRGNCwgMHg3RDcxQjRENSwgMHhEQjdENzdCQiwgMHgwMzk3NjUzMCwgMHg1NTU3NTY1NCwgMHg0ODY0QTJENSwgMHg5RUM5RUM4NiwgMHgwQkI2REY1MSwgMHgyNTI1MjUzNSwgMHhFQkJEQjREMiwgMHhCQjdCN0VENCwgMHgwM0I2RDczMCwgMHg1NjU0NUM1QywgMHg0RjI0QTBENSwgMHhEQTRGMjQzMiwgMHgwMzk3QjY4QiwgMHgxNTE1OTU5NSwgMHgwRjkyMTdDRCwgMHhBNThBNUFDNSwgMHhCNkFBRDczMywgMHg3NDc0NkM1QywgMHhFOUExQUFEMiwgMHg5QUM5QTU5QSwgMHgwMzk2Q0VGMCwgMHg1MDcwNzA2MCwgMHg2REI2QjZENywgMHgzQjZGQjZEQiwgMHgwMzk3MTNENiwgMHg5NUQ1NTU1NSwgMHhCNkRCOEFENiwgMHg2RERCQjE2RCwgMHgwMzk2QzZFRiwgMHgwMEFCNTU1NSwgMHhEQjZEQTdEQiwgMHhCNkQyNDlCMiwgMHgwMzk2Q0VGMCwgMHgwMEFBNTU1NSwgMHhEQjZEQTdEQiwgMHhCNkQyNDlCMiwgMHgwMzk2Q0VGMCwgMHgwMEFBNTU1NSwgMHhDODY0QTJEOSwgMHhCMkM5Qjk4NiwgMHgwMzk1Q0YxMSwgMHgwMDBBMjUyNSwgMHg1Qjc1QThEQSwgMHhCNkQyN0RCNywgMHgwMzk1Q0YxMSwgMHgwMEE4NUM1OCwgMHhEQjY1QTVEQiwgMHhCMkMyNDlCMiwgMHgwMzk2Q0VGMCwgMHgwMEFBNTU1NSwgMHgzNjlBNzZEMiwgMHg0RDQ2OTk0RCwgMHgwMzk3OUUyQywgMHg1NDU2NTU1NSwgMHhCNkRCODhENCwgMHg5NUIyREI2RCwgMHgwMzk3QjY4QiwgMHgzNTk1NTU1NSwgMHhEQjY1QTdEOSwgMHg5NjVBNDlCMiwgMHgwMzk2QzZFRiwgMHgwMEFBNTU1NSwgMHg5M0NGQkRENywgMHhFNzkzQ0ZFNywgMHgwMzk1Q0VFOCwgMHhBOEFBQjVCNSwgMHg1QjZEQUZEOCwgMHgzNzVCNkRENywgMHg4NUE5ODVDOCwgMHgxRkZGQkJBQSwgMHg0OTJDQTdENSwgMHg5MkZFNEVCNiwgMHg4NUE4Q0YxMCwgMHgwMkFENTU1NSwgMHhDOTI0QThEMiwgMHhEQTQ5Qjk5MiwgMHg4NUM4RDcxMSwgMHg2MDVFNTU1NSwgMHg2M0I2QjZEOCwgMHhEQjZERjZEQiwgMHg4NUE5ODVDOSwgMHhGN0ZCQkJBQSwgMHgzMjkyNDRDRSwgMHg0OUE0OTI4OSwgMHg4NUE2RDczMCwgMHgwRDhEODFBMiwgMHhGNEY5MDBFNCwgMHg0RjU0QkU0RiwgMHhCRUFCRTc3OSwgMHg5NTk5OUI5OCwgMHgxREIxQjZENCwgMHhEQjFEQjFEQiwgMHg4NUE5QTY0QSwgMHg1NDU0NzQ1NCwgMHg0ODY0QTlEMCwgMHg4NjQ4NjQ4NiwgMHg4NUE4Q0VFRiwgMHgzNTM1MzUzNSwgMHg5MDE5QkMwNCwgMHhDMTkwMjEwMSwgMHhCNjg5RjdERSwgMHgyNzI3MjcyNywgMHg2MzQ2QzExOCwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEOEQ4RDhEOCwgMHg5RkY5QkFERCwgMHhGQzlGRjlGRiwgMHg4NUE5QUU4QSwgMHg1NDU0NzQ1NCwgMHhEQTZEQUNENiwgMHhBNkRDNjVBNiwgMHg4NUE4QzZFRiwgMHgzNTE1MzUzNSwgMHgxMDE5QkMwMiwgMHgwMjEwMTkwMiwgMHhCNjhBRkZGRiwgMHgyNzA3MjcyNywgMHg2REI2MDYwMywgMHgzQjYxQjZEQiwgMHhGN0JDRkZGRiwgMHhDMEMwODAwMCwgMHg3NDk5M0REOSwgMHg0OUQ2OTc2OSwgMHg4REM3RDczMSwgMHg2MjRBNDJDQSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4NUE5OERDOSwgMHg3N0Y3RUVFQSwgMHhDRDBDQThENCwgMHg5N0RCN0NCMCwgMHg4NUE3Q0VGMCwgMHgwRDBEMEQwOSwgMHg0REI0NjcwMCwgMHgwMDFEOTUwMCwgMHhCNjhBRkZGRiwgMHgwOTA5MDkwMSwgMHg2MzA2QzIwNSwgMHgzMzYzMDYzMywgMHhCNkFBRkZGRiwgMHhEMEQ4RDhEOCwgMHhFQkJFQjlDOSwgMHhCQkVCQkVCNCwgMHg4NUM5QzZDRSwgMHg1NDU0NTQ1NCwgMHhDOTI0OThEOSwgMHhEMjQzNjQ5MSwgMHg4NUM5QkVDQywgMHgxNUQ1NTU1NSwgMHhFQkFEQUZEOSwgMHhCNzUyNDlENiwgMHg4NUM4RDczMiwgMHgwMEZGNTU1NSwgMHhEQjZEQURENSwgMHhGQURCOEZCNiwgMHg4NUM4RDczMSwgMHg2MDVGNTU1NSwgMHg5M0NGQkRENywgMHhGQ0YzQ0ZFNywgMHg4NUE5ODVDOSwgMHhGRkZGQkJBQSwgMHhCMkREOEZEMywgMHg3NUI3MjM4RSwgMHg4NUM3RDczMSwgMHgzNTA1OEQ4QiwgMHhFNTRGMDBFQSwgMHg1N0I3N0M1NCwgMHhCNkFBRjdCRCwgMHhENURERDlEMywgMHhEQjdEQjdDQSwgMHhCNERCN0RCNywgMHg4NUE5QzZFRiwgMHg1NDc0NTQ1NCwgMHhDOTI0OTREQiwgMHhGMUMzMjQ3MSwgMHg4NUE5QUU2OSwgMHgxNURENTU3NSwgMHhEQjZEQURENywgMHhCNkQzQzlCNiwgMHg4NUE4RDcxMiwgMHgwMEZGNTU1NSwgMHhFQkFEQUZEOSwgMHhCNkQyNDlENiwgMHg4NUE4RDcxMiwgMHgwMEZGNTU1NSwgMHhFQkFEQUZEOSwgMHhCNkQyNDlENiwgMHg4NUE4RDcxMiwgMHgwMEZGNTU1NSwgMHhEMzdEQTZENiwgMHgzMkMzMzczMCwgMHg4REM2RDczMiwgMHg4MDhCOEQ4RCwgMHhGNTBGMENDRiwgMHgxMEY1MEYxMCwgMHhCNjhBREY3NiwgMHg5MzkxOTM5MywgMHg5REI5QjlDRSwgMHhEQjlEQkZEQiwgMHg4NUE5QkVBRCwgMHg1NEQ0NTQ1NCwgMHhDOTI0OUVENCwgMHg5OUMzQTQ3MSwgMHg4NUE5QzZDRCwgMHgxNUY1NTU1NSwgMHhFQkFEQUZEOSwgMHhCNkQyNDlENiwgMHg4NUE4RDczMiwgMHgwMEZGNTU1NSwgMHhEQjJEQUREMywgMHhGNkRCQ0ZCNiwgMHg4NUE4RDcxMSwgMHhDMDdGNTU1NSwgMHg5MjQ5QkZFMywgMHgyNDkyNDkyNCwgMHg4NUE5ODVDOCwgMHg3N0ZCQkJFQSwgMHgyRUQ0ODdDRCwgMHg1MUE2REI2QSwgMHg4REM4RDczMSwgMHgyNTI1OEQ4MSwgMHgzREIyQTAwMSwgMHgwMTEwMDVDMCwgMHhCNkFBRkZGRiwgMHgwRDBEMDkwMywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgCisJCTB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDM0NkJFMDAsIDB4MzAwMzQwMzQsIDB4MjMzNUVGQkUsIDB4NTA1MDUwNTAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MTNCNjFCNTUsIDB4NUU3OEU4QzgsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDQzODFCOTYsIDB4NUU3RUVBQTgsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MEJGNzBDNzgsIDB4MDIyQkJGRjUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDRCOTBDMTgsIDB4NzdGRkFBMDgsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MEJGNzBDOTksIDB4QTBBOEZCNUYsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDQ1ODEzQjYsIDB4QjVCRkFCMEEsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MTNGNzIzNTUsIDB4N0RCRjJCMEIsIDB4MkU5MjVFRDMsIDB4MjkyMjlBRTksIDB4MDQ3ODMyRDQsIDB4RURBN0FGQUUsIDB4NkRCMEZGMDEsIDB4REI2REI2REIsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjFCNjY0NDAsIDB4M0I2N0I2NUIsIDB4ODU4RUZGRkYsIDB4NDA0MDQwNDAsIDB4OUU3OUJERDcsIDB4RTc5M0NGRTcsIDB4NzU0OEQ2RUQsIDB4MEQwRDBEMEQsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OEUyOENFQ0MsIDB4NTY1NDU4NzAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OEUwODhFMjgsIDB4RThFRUVFRUUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4ODYwODhFMjgsIDB4RkFFQUZBRkYsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4N0UyODg2MDgsIDB4MDJBMjIwMkEsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4N0UwODk2MEEsIDB4OERCN0Q1NTUsIDB4QTQ5MjQ2RDksIDB4MjlBNjkyNjksIDB4NDRDOTg1RTksIDB4OUM3MEUwODAsIDB4NTAyMUMyMDAsIDB4MUI2MDMyMDAsIDB4NEQwQUZGRkYsIDB4MDAwMzA5MDUsIDB4NzRBOTAwRTMsIDB4NDlGNkE3NEEsIDB4OUUyQUVGQjYsIDB4NkY2RUVFQkMsIDB4N0RCMUI5RDAsIDB4REI2REY3REIsIDB4MDM5NzNDOTIsIDB4NTU1NTU3NTQsIDB4QzlFNEE0RDIsIDB4QjBDOTBDOTcsIDB4MDM3NkM2RUYsIDB4MDkwRDBEMjUsIDB4REI2OUNGMDAsIDB4REIzMDEzNDksIDB4QkVBQkZGREUsIDB4MDEwOTU1NUYsIDB4NjYxMjJEQ0EsIDB4NDExNDk5NDksIDB4NzU2QkQ3NTAsIDB4NEFDQUNBNDIsIDB4OTNDRkJERDcsIDB4RTc5M0NGRTcsIDB4MDM5NjAzOTcsIDB4ODg4QThBODgsIDB4QzkwQ0EwRDMsIDB4OTNDOTNDOEMsIDB4MEJCNENGMTEsIDB4MDkwOTA5MEQsIDB4N0RCMUI1RDUsIDB4REI3RDcxREIsIDB4MDM5NzVEMTAsIDB4NTU1NzU2NTQsIDB4NDg2NEE0RDQsIDB4OUVDODZDODYsIDB4MEJCNkNGMTAsIDB4MDUyNTI1MzUsIDB4MUQ5OUJEMDEsIDB4RDg1RDk1RDksIDB4QzZDREZGRkYsIDB4MEQwRDA1MDUsIDB4OTRBMTE2RDgsIDB4NDk2NDlGNDksIDB4NzU2Q0Q3NTAsIDB4NEE0QUNBODgsIDB4RkZGOUJCRDYsIDB4RkZGRkZGRkYsIDB4MDM5NzEzRDYsIDB4NTU1NTU1NTQsIDB4QzlFQ0E2RDEsIDB4OTBDOTdDOUIsIDB4MEJCNUNGMTAsIDB4MEQwRDA1MjUsIDB4NUQ5MTk4MDMsIDB4MTgzREI1RDgsIDB4QkVBQUZGRkYsIDB4ODEwOTA5MDksIDB4OTRBMTFGRDksIDB4Njk2NDk3NDksIDB4NTRFQ0RGMzEsIDB4NDI0QUMyODgsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4QTg4ODhBOEEsIDB4QzlCNEEzRDUsIDB4OTBDOTBDOTAsIDB4MEJCNUNGMTEsIDB4MDkwRDBEMDUsIDB4N0JCN0I0RDMsIDB4RDc3QkE5RDcsIDB4MDM5NzhERUUsIDB4NTc1NjU0NTQsIDB4NEJFNEEzRDMsIDB4ODY0OUU0ODYsIDB4MDM5NkM2RUYsIDB4MjUzNTM1MzUsIDB4Mjg2QTFDREQsIDB4NUZCN0ZBNjcsIDB4QjY4OUQ3MzMsIDB4REZGRTdFRjQsIDB4RUJCREI0RDIsIDB4RDRFQjREREIsIDB4MDNCNkQ3MzEsIDB4NUM1ODU4NTAsIDB4Q0YyQ0E0RDksIDB4MzJDMzY1MzIsIDB4MDM5Nzc1OEQsIDB4MTU5NTk1RDUsIDB4OUI0OUMyMkYsIDB4QzI5Qzg5NEMsIDB4QkVBQ0ZGREUsIDB4MzcxRjVGNUQsIDB4QTI0OUIyMDksIDB4REI2MUI2NDksIDB4QkVBQ0ZGRkYsIDB4MDAwMDU1NTUsIDB4QTI0OUIyMDksIDB4REI2MUI2NDksIDB4QkVBQ0ZGRkYsIDB4MDAwMDU1NTUsIDB4QTI0OUIyMDksIDB4REI2MUI2NDksIDB4QkVBQ0ZGRkYsIDB4MDAwMDU1NTUsIDB4QTI0OUIyMDksIDB4REI2MUI2NDksIDB4QkVBQ0ZGRkYsIDB4MDAwMDU1NTUsIDB4RTA5MjA2Q0QsIDB4NDI5MEIxNEEsIDB4QjY4OUU3OTksIDB4QjRGNEI1QkYsIDB4RkI3N0IzRDIsIDB4QkFGQjY5RDYsIDB4MDM5Nzg1Q0UsIDB4NTc1NjU2NTQsIDB4NDg2NEEzRDYsIDB4ODZDODY0ODYsIDB4MDM5NkNGMEYsIDB4MjUyNTM1MzUsIDB4QTQ5MjJBRDAsIDB4MTBCNTNBNTIsIDB4QjY4OUQ3MTIsIDB4M0YxNjM2M0MsIDB4RURCRUI4RDMsIDB4RkI5REIxREIsIDB4ODVBOUNGMEYsIDB4NTY1NjU2NTQsIDB4REZBNUE4RDgsIDB4QTY1ODZDREUsIDB4ODVBOENFRUYsIDB4MTUzNTM1OTUsIDB4MUI0OUMxMDMsIDB4RDk5MDE5MEUsIDB4QjY4QUZGRkUsIDB4MDcyN0Q3N0YsIDB4MjI0REMyMDQsIDB4MjVFMzVFMjYsIDB4QkVBQkY3REUsIDB4RENGNEY1N0QsIDB4MURCN0I3RDYsIDB4REI3REI3RkIsIDB4N0Q4OTk1RTgsIDB4NzRGRUZDRkYsIDB4NDlGNUFERDIsIDB4QkY0OUVEQTcsIDB4ODVBOEQ3MzIsIDB4MjUzNTI1MjUsIDB4QzRDQzMyRDcsIDB4NENDNEZDNEYsIDB4QUU4OEQ3MzMsIDB4MzczNzM3MzcsIDB4MURCMUI2RDQsIDB4REIxREIxREIsIDB4NzU2OEE2MkEsIDB4RkNGQ0ZDRkMsIDB4NDg2NEE5RDAsIDB4ODY0ODY0ODYsIDB4ODVBOENFRUYsIDB4MzUzNTM1MzUsIDB4OTAxOUJDMDQsIDB4QzE5MDIxMDEsIDB4QjY4OUY3REUsIDB4MjcyNzI3MjcsIDB4NjM0NkMxMTgsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RDhEOEQ4RDgsIDB4OUZGOUJBREQsIDB4RkM5RkY5RkYsIDB4ODVBOUFFNkEsIDB4NTQ1NDU0NTQsIDB4REE2REFDRDYsIDB4QTZEQzY1QTYsIDB4ODVBOENFRUYsIDB4MTUxNTM1MTUsIDB4MTAxOUJDMDIsIDB4MDIxMDE5MDIsIDB4QjY4OUZGRkYsIDB4MjcwNzI3MjcsIDB4NjFCNjJCMEIsIDB4M0I2OUI2NUIsIDB4QzcwRkZGRkYsIDB4NDBDMEMwODAsIDB4RjZEMTg1Q0YsIDB4NkRDNEQ1NkQsIDB4ODVBN0Q3MzEsIDB4NzI3MjYyNjIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NzU4ODg1QTksIDB4QUEyODgwMDAsIDB4NUJCREFCRDcsIDB4QTZEQTZEQkIsIDB4ODVBOEQ3MzIsIDB4MjUyNTI1MjUsIDB4NUQ4NEFEMEMsIDB4RDkxRDk1QzAsIDB4QkVBQkZGRkYsIDB4MDUwRDBEMEQsIDB4NjMwNkMyMDUsIDB4MzM2MzA2MzMsIDB4QjZBQUZGRkYsIDB4RDBEOEQ4RDgsIDB4RUJCRUI5QzksIDB4QkJFQkJFQjQsIDB4ODVBOUM2Q0UsIDB4NTQ1NDU0NTQsIDB4RTNGNkI1RDQsIDB4MjZFM0Y2M0UsIDB4ODVBOEM2Q0QsIDB4MTUxNTE1MTUsIDB4MUI0OUMyMTQsIDB4QzIxREExNEEsIDB4QkVBQkZGRkYsIDB4MzcyNzU3NTcsIDB4QUE2REQ5MDAsIDB4MzEwQjUwMzUsIDB4QkVBQkZGRkUsIDB4RDhEQ0Y1N0QsIDB4OUI2RkI0Q0YsIDB4QjZGQjc3QkEsIDB4ODVBOUFFNkEsIDB4NTQ1NDU0NTcsIDB4NUE2NUE4RDcsIDB4QTZEQTY1QTYsIDB4ODVBOENGMTEsIDB4MzUzNTM1MzUsIDB4Qjc4QjNFRTIsIDB4NUZCN0JCNUYsIDB4QjY4OUNGMTEsIDB4MTYxNDM2MTYsIDB4REI3REI3Q0EsIDB4QjREQjdEQjcsIDB4ODVBOUM2RUYsIDB4NTQ1NDU0NTQsIDB4QzM2NEE4RDMsIDB4MzJDMzY0MzIsIDB4ODVBOUFFNjksIDB4MTUxNTE1MTUsIDB4OUE0OUJDMUQsIDB4QzI5QzI5MEEsIDB4QkVDQ0ZGRkYsIDB4MTcxNzU3NTcsIDB4MjI0OUFEMDAsIDB4MDAwMDAwNDksIDB4QkVBQ0ZGRkYsIDB4MDAwMDU1NTUsIDB4MjI0OUFEMDAsIDB4MDAwMDAwNDksIDB4QkVBQ0ZGRkYsIDB4MDAwMDU1NTUsIDB4Mjg0OUFDMDAsIDB4MDAwMDAwNDksIDB4QkVBQ0ZGRkYsIDB4MDAwMDU1NTUsIDB4MDMwMkJCMDAsIDB4MzAwMzQwMzQsIDB4QjY4QUZGRkYsIDB4RDhEOERBREIsIDB4OURCOUI5Q0UsIDB4REI5REJGREIsIDB4ODVBOUJFQUQsIDB4NTQ1NDU0NTQsIDB4NkU3NkI0RDcsIDB4RTc2RTZFQzcsIDB4N0Q4OEM2Q0YsIDB4MzUzRDM1MUQsIDB4OUE2OUM1MDAsIDB4Qzk5MDE5NDksIDB4QjZBQkZGRkYsIDB4MjcyNzU3NTcsIDB4QTI0REM4MDAsIDB4MzQ2MzUwMzUsIDB4QkVBQkZGRkYsIDB4REM5Q0Q1RjUsIDB4OUI2RkIzQ0QsIDB4QjI5QjY5OTYsIDB4ODVBOUFFNEEsIDB4NTQ1NDU0NTcsIDB4QzlFNEE1RDAsIDB4OUU0OUU0OUQsIDB4ODVBOEQ3MTEsIDB4MTUzNTM1MzUsIDB4MUQ5MUMwMDQsIDB4RDk5MDExQzEsIDB4QjY4OUZGREUsIDB4MDcwNzA3MDcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIAorCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYyRjZDNDBBLCAweDdCNkJCNkFCLCAweDFBRjRGRkZGLCAweEMwNjA3MDcwLCAweDkzQ0ZCREQ3LCAweEU3OTNDRkU3LCAweDA0MTgxQjc2LCAweDc4N0NGOEU4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDA0OTkwQkY3LCAweDVFNUFGQUU4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDA1MUIwQzc5LCAweDVGRkFFQUE4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDA1M0IwQ0I5LCAweDU1REZBQTg4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDA0OTkwRDNCLCAweEUwRUFGRjVGLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDA0MTgwQ0RBLCAweEU4RThGRTdFLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDBDMTc0NURDLCAweEUzQURGNUQ1LCAweDkwNDlDMjEzLCAweENBOUNDOTE0LCAweDEzNzZFN0JGLCAweDM1MTU5N0Q3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDY5QjZFQzAyLCAweEE4NkEzNjgzLCAweDZEMDlGRkZGLCAweDcwNzA0MDQwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDc1NjhDNkFCLCAweDgzMDkwOTBELCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDk2MjhBNjQ5LCAweDVGNzc1Rjc0LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDhFMDg5NjI4LCAweDgwQTBFOEU4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDg2MDg5NjI5LCAweEZBRUVFRUVFLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDg2MDg5RTI5LCAweDI3OUY3NzU3LCAweDZEQjZCNkQ4LCAweDNCNkRGNkRCLCAweDRDQzg5NjA5LCAweDcwRTA4MDAwLCAweDlEMDlDMDAwLCAweERCM0Q5NURBLCAweDRDQzhGN0RFLCAweDAzMDkwNTE3LCAweDZEQjYxMTAyLCAweDNCNjlCNjFCLCAweERGNTZGRkZGLCAweDQwNDA4MDgwLCAweDc0OTkzQUQ1LCAweDQ5NTY5NjQ5LCAweDFCRjRDNkNFLCAweDQwNDBDMEMwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweDhBMjA4QTg4LCAweDM4QUE3N0QxLCAweDI5Q0NBMzhFLCAweDBCQjVDNkVFLCAweDAzMDEwOTA5LCAweDQxQjEyQTAxLCAweDlCMjVCMjVCLCAweENGMTJGRkZGLCAweDQyQzM4MTgxLCAweEY2OTk0QkRCLCAweDZENTRENjY5LCAweDFCRjRDNkNFLCAweDQwNDBDMEMwLCAweDkzQ0ZCREQ3LCAweDNDRjNDRkU3LCAweDAzOTYwMzk3LCAweDg4Mjg4QTg4LCAweDZCMzVBM0QxLCAweEFFMUIyMUIzLCAweDFCRjJENzEwLCAweEMzQzM4MTg5LCAweDlFNzlCREQ3LCAweEU3OTNDRkU3LCAweDAzOTcwQkI2LCAweDU1NTU1Nzc2LCAweEM5N0NBMkQ4LCAweEQwQ0IwQzk0LCAweDAzOTZDRUVGLCAweDA5MEQwRDBELCAweDUwMDE3RDAwLCAweDVCMzVCNDQwLCAweEFFODlGN0ZFLCAweEMzODM4MTgxLCAweEU2OUY0OURDLCAweDZENTRENTY5LCAweDEzRDVDNkVFLCAweDYwNDA0MEMwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweDhBMjA4QTg4LCAweEI2RUI4NkQxLCAweDJBNENFQjhFLCAweDBCQjZDNkNFLCAweDAxMDEwOTA5LCAweDQxQjEzODA3LCAweDlCMjdCMjVCLCAweEJFQ0VGRkZGLCAweDQyQzNDMzgxLCAweDc2OTk2NEQ2LCAweDREQzY5RDZELCAweDAzQjZDNkNFLCAweDYwNDA0MEMwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweEE4ODg4QTg4LCAweEQ4Q0NBNUNELCAweEIyN0IzNjhGLCAweDEzRDRDRjEwLCAweDgzODEwOTA5LCAweDdEQjFCNkQzLCAweERCNkRCNkQ3LCAweDAzOTcyNDM0LCAweDU1NTU1NzU0LCAweEM5RUNBNUQzLCAweDkwQzlCQzlFLCAweDAzOTZDRUYwLCAweDBEMEQwNTI1LCAweEM1QkIwRERELCAweDRDRDUzQzU0LCAweEI2QUFENzM0LCAweDE1MTk5NURCLCAweEVEOEVCNkQyLCAweEQ3MURCRkQ0LCAweDBCQjZDNkVGLCAweDU2NTQ1NDVDLCAweDQzMjRBNUQyLCAweEE2NERBNEY2LCAweDAzQjZCRUNDLCAweDM1MTUxNTk1LCAweDlDODlCRDAwLCAweDAyMTAyMTAyLCAweEJFQUNGRkZGLCAweDI3MjcyNzM3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGREVGRkZGLCAweDgwODAwMDAwLCAweDc0QTEwQ0Q0LCAweDQ5NzQxRjRBLCAweDdENjlENzMxLCAweDQyQ0E4ODg4LCAweDlGRjlCQURDLCAweEZGRkZGRkZGLCAweDAzOTcxQkY1LCAweDU1NTU1NzU0LCAweDQ5RUNBM0QyLCAweDkwQzc3QzlCLCAweDBCQjZDRjEwLCAweDBEMEQwNTI1LCAweEM0RkIwM0QxLCAweDRDRDRDQzEzLCAweEI2QUFFNzc3LCAweDkxOTE5RDk5LCAweDlEQjlCOEQ0LCAweEZCOURCOURCLCAweDdEODlCRUFDLCAweDU0NTQ1NDU0LCAweERBNkRBOERDLCAweEE2REE2REE2LCAweDdEODhDRjEwLCAweDM1MzUzNTM1LCAweDlEOTlCQzAzLCAweEQ5OUQ5OUQ5LCAweEI2ODlGRkZFLCAweDA3MDcwNzA3LCAweDYyNDZDMDNFLCAweDI0NjI0NjM0LCAweEM2Q0RGRkZGLCAweEQ0RDRENEQ0LCAweDkyNDlCRUUzLCAweDI0OUU0OTI0LCAweDdEODk5NUU4LCAweDU2NTQ3NkRDLCAweDVBNzVCMUQzLCAweEE3NUE3NUE3LCAweDdEODhENzExLCAweDI1MjUyNTI1LCAweEM0RkMyQ0Q4LCAweDRGQzRGQzRGLCAweEFFODhENzMzLCAweDM3MzczNzM3LCAweDFEQjFCNkQ0LCAweERCMURCMURCLCAweDdEODlBNjJBLCAweDU0NzQ1NDc0LCAweDQ4NjRBOUQwLCAweDg2NDg2NDg2LCAweDdEODhDRUVGLCAweDM1MzUzNTM1LCAweDkwMTlCQzA0LCAweEMxOTAyMTAxLCAweEI2ODlGN0RFLCAweDI3MjcyNzI3LCAweDYzNDZDMTE4LCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweEQ4RDhEOEQ4LCAweDlGRjlCQURELCAweEZDOUZGOUZGLCAweDdEODlBRTZBLCAweDU0NTQ3NDU0LCAweERBNkRBQ0Q2LCAweEE2REM2NUE2LCAweDdEODhDRUVGLCAweDE1MzUzNTM1LCAweDEwMTlCQzAyLCAweDAyMTAxOTAyLCAweEI2OEFGRkZGLCAweDI3MDcyNzI3LCAweDY5QjY3MTAwLCAweDIwNkEzNjlCLCAweEFFODhGRkZGLCAweDYwNDA0MEMwLCAweDdERjFCNUQyLCAweERGNkRGNUJGLCAweDdEQThENzExLCAweDU4NTA3MDcyLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDdEODk3REE4LCAweDc3RkZGRUFFLCAweDQ5RTRBN0QwLCAweEJBNDlFNDlFLCAweDdEODhDRjExLCAweDM1MzUzNTI1LCAweDEwMTFDMzAwLCAweDAxOTAxOTAxLCAweEI2ODlGRkZGLCAweDI3MjcwNzA3LCAweDYzMDZDMjA1LCAweDMzNjMwNjMzLCAweEI2QUFGRkZGLCAweEQwRDhEOEQ4LCAweEVCQkVCOUM5LCAweEJCRUJCRUI0LCAweDdEODlDNkNFLCAweDU0NUM1NDU0LCAweEUzRjZCNUQ0LCAweDI2RTNGNjNFLCAweDdEQThDNkNELCAweDE1MTUxNTE1LCAweDFDMjFDMDEyLCAweERBMUMyMUMyLCAweEI2OEFGRkZGLCAweDI3MjcyNzI3LCAweDYzNDZDMDFCLCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweEQ4RDhEQ0Q4LCAweDFEQjFCN0QxLCAweERCMURCMURCLCAweDdEODlBRTZBLCAweDU0NTQ3NDU0LCAweDVBNjRBOUQzLCAweEE2NEE2Q0E2LCAweDdEODhDRjEwLCAweDM1MzUzNTM1LCAweEI3Q0I1NERDLCAweDdDQjdDQjdDLCAweEI2ODlDRjExLCAweDE0MTYzNjE0LCAweERCN0RCN0NBLCAweEI0REI3REI3LCAweDdEODlDNkVGLCAweDU0NzQ1NDU0LCAweEMzNjRBOEQzLCAweDMyQzM2NDMyLCAweDdEODlBRTY5LCAweDE1MTUxRDE1LCAweDlDMjlCRTFGLCAweEMyOUMyOUMyLCAweEJFQ0RGRkZGLCAweDE3MTcxNzE3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYzMDZCQjA2LCAweDM0NjMwNjM0LCAweEI2QUFGRkZGLCAweEQ4RDhEOEQ4LCAweDlEQjlCOUNFLCAweERCOURCRkRCLCAweDdEODlCRUFELCAweDU0NTQ1NDU0LCAweDZFNzZCNEQ3LCAweEU3NkU2RUM3LCAweDdEODhDNkVGLCAweDM1MTUzNTM1LCAweDkwMTlCRDA0LCAweDAxOUMyMTAxLCAweEI2OEFGRkZGLCAweDI3MjcwNzI3LCAweDYzNDZCRjE2LCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweERDRENEQ0RDLCAweDFEQjFCNEQ2LCAweEJCMURCMUQ3LCAweDdEODlBRTRBLCAweDU0NTQ3NDU0LCAweDQ5RENBNENGLCAweDg1QzdFMzlFLCAweDdEODhDRjExLCAweDM1MzUzNTM1LCAweDUwMTVFOTAwLCAweDAxRDAxNTAxLCAweEI2ODlGRkZFLCAweDA3MDcwNzA3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAKKwkJMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MUI2RkYwQywgMHhEQjZEQjZEQiwgMHhDNkJDRkZGRiwgMHgwMDAwMDA0MCwgMHhCMjREQzEwNSwgMHgzMzYyNjYyNCwgMHgxM0Q3RkZCRiwgMHg1ODU0NTc1NSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwNERBMEM1OCwgMHg3ODc4NzhFOCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwNTdDMENEQSwgMHg3QTc4RkFFOCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwNTVCMERERCwgMHgwM0FCRkY3NSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwNTFCMTU5QywgMHgzODc4NUE3RiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwNEI5NTVGQywgMHgwRkZENTdENSwgMHhCNkRCNkNERCwgMHgyREI2OUI2RCwgMHgwMzk2M0Q1QiwgMHg3ODYwRkJGOCwgMHgxQzIxQkIwNiwgMHhEQjZEQjNDMCwgMHgxQjc1RjdERiwgMHgwMDAzMDkwNSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MzM2QkYwMCwgMHgyNjgyNTAzNCwgMHg3NTI4RjdERSwgMHhENDVDNTA1MCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4REU4QjY4QSwgMHhCQUJBRTNBMSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg5NjQ5OUUyOCwgMHhBQUFBMjJBQSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg5NjI4OUUyOSwgMHg1Rjc2NTc1NywgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4RTA5OUUyOCwgMHgzRUZFRkY3RSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg2RDY4QTY0OSwgMHg3MEUwODIwQSwgMHg5ODQ5QkYwMCwgMHgwMTEwQTkxMCwgMHg1RDA4RkZGRSwgMHgwRDM1OTc1NywgMHg2REIwRkYwMiwgMHhEQjZEQjZEQiwgMHhGN0RFRkZGRiwgMHgwMDAwMDAwMSwgMHg2N0I2NEUwMiwgMHgyMzZBMzY3QiwgMHhCNjhBRkZGRiwgMHg2MDQwQzBDMCwgMHhFNzE5OTFEMCwgMHg3MUM3MUQ2RCwgMHgwQkI1Q0YwRiwgMHg3MDcwNjA2MCwgMHhGRTc5QkREQywgMHgyNzkyNzkzQywgMHgwMzk3MEJCNywgMHg5NUQ1NTU1RCwgMHgzQTkzMTlENywgMHgyRDNFOTNDOSwgMHg0NEFGQ0VFRiwgMHgwMjAzMDMwMSwgMHgwNjAwNUMwMCwgMHgyMDBBMDA4MCwgMHhCNkFBRkZGRiwgMHg2MDQwNDBDMCwgMHhGOTYxOURENCwgMHhGREM5NjU3NSwgMHgwQkI1Q0VFRiwgMHhFMDcwNjA2MCwgMHhCNkRCOThDRiwgMHhGRkZBREI2RCwgMHgwMzk3NTRGMCwgMHgyQUQ1NTU1NSwgMHg3QjE5QTJDRiwgMHg5NUQ5MjZCMiwgMHgwQkI0RDcxMCwgMHg2MDYwNDI0MiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHhBODg4OEE4OCwgMHhCOEEyNjNDRiwgMHgyOTRDOUJBOSwgMHgxM0Q1QzZDRSwgMHgwMzAxMDEwOSwgMHgyNjAyNjYwMCwgMHgyODBBMDA4MCwgMHhCNjg5RkZERSwgMHg2MDQyNDJDMywgMHg3OUExQTZENCwgMHg5QUM5NjU5QSwgMHgwMzk2Q0VFRiwgMHg1MDcwNjA2MCwgMHg5MjQ5QkZFMywgMHgyNDkyNDkyNCwgMHgwMzk2MDM5NywgMHg4QTIwOEE4OCwgMHgzQTkzMTdEOCwgMHhFOTNFOTNBOSwgMHg0NEIwQ0VFRiwgMHgwMzAzMDEwMSwgMHgwNjAwNzIwMCwgMHgyMzBBODA4MCwgMHhCNkFBRkZGRiwgMHg3MDYwNDA0MiwgMHg2OUExQUNDRiwgMHg5NkM5QTU5QSwgMHgwMzk2QzZGMCwgMHg1MDcwNzA2MCwgMHhFREY3QjhEOSwgMHgzQkVGRjdGQiwgMHgwMzk3MEJCNiwgMHgxNUQ1NTU1RCwgMHg5QUU3QTBDRiwgMHg5MjZBRTdBRCwgMHgyNDExRDcxMSwgMHg0MjQyQzNDMywgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHg4ODg4OEE4OCwgMHhCOEZCOTdEMywgMHgyRjRDRjQ4RiwgMHgwQkI1Q0VFRiwgMHgwMTA5MDkwRCwgMHg3MEZFMTNDRSwgMHg0MjkwQjE0QiwgMHhCNjg5RDczMywgMHhBNkE2M0YzRiwgMHg5RDc3QjREMywgMHhENzdENzdCQSwgMHgwMzk3N0RBRSwgMHg1NzU2NTY1NCwgMHg0ODY0QTNEMywgMHg5RUM4NjQ4NiwgMHgwMzk2RDczMCwgMHgyNTI1MjUzNSwgMHgxMDE5QzIwMCwgMHgxOTUwMTUwMSwgMHhCRUFCRkZGRSwgMHgwOTBEMEQwNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MUI2MTgwMiwgMHgzQjY3QjY1QiwgMHhDRjEyRkZGRiwgMHg0MEMwODA4MCwgMHg3Njk5NDNEQiwgMHg0RDU0RDY2OSwgMHgxQzE0QzZDRSwgMHg0MDQwQzBDMCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHg4ODg4OEE4OCwgMHhCNkVBODdDRCwgMHgyQTRDQUI4QSwgMHgwQkI1QzZFRSwgMHgwMTA5MDkwOSwgMHhGNTBFMDBFOSwgMHg1MDk1M0Y1MCwgMHhCRUFCRUY5QSwgMHg5MEQyOTNEMywgMHg5REI5QjhENCwgMHhGQjlEQjlEQiwgMHg3RDg5QkVBQywgMHg1NDU0NTQ1NCwgMHhEQTZEQThEQywgMHhBNkRBNkRBNiwgMHg3RDg4Q0YxMCwgMHgxNTM1MzUzNSwgMHg5RDk5QkMwMywgMHhEOTlEOTlEOSwgMHhCNjg5RkZGRSwgMHgwNzA3MDcwNywgMHg2MjQ2QzAzRSwgMHgyNDYyNDYzNCwgMHhDNkNERkZGRiwgMHhENEQ0RDRENCwgMHg5MjQ5QkVFMCwgMHgyNDkyNDlFNCwgMHg3NTY5OERDOCwgMHg3NEZDRkNGQywgMHg0QkVEQUVEMSwgMHhBNkQ4NkRCRiwgMHg3RDg4Q0YxMiwgMHgzNTI1MjUyNSwgMHhDNEZDMkNEOCwgMHg0RkM0RkM0RiwgMHhCNjg4RDczMywgMHgzNzM1MzczNywgMHgxREIxQjZENCwgMHhEQjFEQjFEQiwgMHg3RDg5QTYyQSwgMHg1NDU0NTQ1NCwgMHg0ODY0QTlEMCwgMHg4NjQ4NjQ4NiwgMHg3RDg4Q0VFRiwgMHgzNTM1MzUzNSwgMHg5MDE5QkMwNCwgMHhDMTkwMjEwMSwgMHhCNjg5RjdERSwgMHgyNzI3MjcyNywgMHg2MzQ2QzExOCwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEOEQ4RDhEOCwgMHg5RkY5QkFERCwgMHhGQzlGRjlGRiwgMHg3RDg5QUU2QSwgMHg1NDU0NTQ1NCwgMHhEQTZEQUNENiwgMHhBNkRDNjVBNiwgMHg3NTY4QzZFRiwgMHgzNTM1M0QzNSwgMHgxMDE5QkMwMiwgMHgwMjEwMTkwMiwgMHhCNjhBRkZGRiwgMHgyNzA3MjcyNywgMHg2QTM2QjIwRCwgMHgyQjZBQjZBMywgMHhCRUFCRkZGRiwgMHg3MDYwNzA2MCwgMHhFREJFQjZEMywgMHhEOEVEQkVEOCwgMHg3RDg4RDczMiwgMHg1QzVDNTg1OCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3NTY4N0Q4OSwgMHhFQUE4MDgwMCwgMHg0QkU0QTlEMCwgMHgzMjRENjREQSwgMHg3RDg5QzZDQywgMHg5NTE1MTUzNSwgMHgxQzIxQzEwQSwgMHhDQTlDMjlDMiwgMHhCNkFCRkZGRiwgMHgzNzM3MzcyNywgMHg2MzA2QzIwNSwgMHgzMzYzMDYzMywgMHhCNkFBRkZGRiwgMHhEMEQ4RDhEOCwgMHhFQkJFQjlDOSwgMHhCQkVCQkVCNCwgMHg3RDg5QzZDRSwgMHg1NDU0NTQ1NCwgMHhFM0Y2QjVENCwgMHgyNkUzRjYzRSwgMHg3RDg5QzZDRCwgMHgxNTE1MTUxNSwgMHgxQzIxQzAxMiwgMHhEQTFDMjFDMiwgMHhCNjhBRkZGRiwgMHgyNzI3MjcyNywgMHg2MzQ2QzAxQiwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEOEQ4RENEOCwgMHgxREIxQjdEMSwgMHhEQjFEQjFEQiwgMHg3RDg5QUU2QSwgMHg1NDU0NTQ1NCwgMHg1QTY0QTlEMywgMHhBNjRBNkNBNiwgMHg3RDg4Q0YxMCwgMHgzNTM1MzUzNSwgMHhCN0NCNTREQywgMHg3Q0I3Q0I3QywgMHhCNjg5Q0YxMSwgMHgxNjE0MzYxNCwgMHhEQjdEQjdDQSwgMHhCNERCN0RCNywgMHg3RDg5QzZFRiwgMHg1NDU0NTQ1NCwgMHhDMzY0QThEMywgMHgzMkMzNjQzMiwgMHg3RDg5QUU2OSwgMHg5NTE1MTUxNSwgMHg5QzI5QkUxRiwgMHhDMjlDMjlDMiwgMHhCRUNERkZGRiwgMHgxNzE3MTcxNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MzA2QkIwNiwgMHgzNDYzMDYzNCwgMHhCNkFBRkZGRiwgMHhEOEQ4RDhEOCwgMHg5REI5QjlDRSwgMHhEQjlEQkZEQiwgMHg3RDg5QkVBRCwgMHg1NDU0NTQ1NCwgMHg2RTc2QjRENywgMHhFNzZFNkVDNywgMHg3RDg4QzZFRiwgMHgxNTE1MzUxNSwgMHg5MDE5QkQwNCwgMHgwMTlDMjEwMSwgMHhCNjhBRkZGRiwgMHgyNzI3MDcyNywgMHg2MzQ2QkYxNiwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEQ0RDRENEQywgMHgxREIxQjRENiwgMHhCQjFEQjFENywgMHg3RDg5QUU0QSwgMHg1NDU0NTQ1NCwgMHg0OURDQTRDRiwgMHg4NUM3RTM5RSwgMHg3RDg4Q0YxMSwgMHgzNTM1MzUzNSwgMHg1MDE1RTkwMCwgMHgwMUQwMTUwMSwgMHhCNjg5RkZERSwgMHgwNzA3MDcwNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgCisJCTB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjIzNjhGMEQsIDB4REI2REI2MUIsIDB4MTM5NkZGRkYsIDB4MDAwMDgwNjAsIDB4QzI0OUJFMDAsIDB4NjgwMjU4MjQsIDB4MDNGOERGOUUsIDB4RTA1Q0Q1NzUsIDB4NDkyNEE3RDEsIDB4OTIxOTI0OTIsIDB4MDQzODBEOUMsIDB4QkQyQjBBMkEsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDU3QzRFM0QsIDB4RDUwQjBGRUYsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDREQTRFMUQsIDB4NUU2MEMwMEEsIDB4MzZEQjEyRjksIDB4MzlCOERCNEQsIDB4MDQ1OUI3NUUsIDB4MzU1RkZGRkYsIDB4OTEwOUMxMDAsIDB4MDAwMDAyMDEsIDB4MTQxN0ZGRkYsIDB4MDAwMzI1OTcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NkRCNjlBMDEsIDB4MjM2N0I2MUIsIDB4NkNFQUZGRkYsIDB4NjBDMDAwMDAsIDB4NTQ5MTI0RDgsIDB4NDkyNDkyNDksIDB4NkNFODlFMEEsIDB4MkQyRDI1MjQsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OUUwOUE2NDksIDB4QUQyMjhBQTIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OUUyOTlFNDksIDB4NkVGQTZFRkUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OTYyOEFFNjksIDB4M0ZENzc1NTcsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OERFN0JFQUIsIDB4NjBDMkVGQkYsIDB4OTI0OUMwMTUsIDB4Q0E5MTQ5ODQsIDB4NjUwN0ZGRkMsIDB4MzU5NzVGNUYsIDB4MDAwMTU3MDAsIDB4MDAwMDAwMDAsIDB4NkQ2RUZGRkYsIDB4MDAwMDAyMDEsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjgzNjlDMDcsIDB4MkI2QUI2QTMsIDB4QkVBQkZGRkYsIDB4NTA3MDcwNjAsIDB4NkM3NkI3Q0YsIDB4QjhERDhFQTcsIDB4MDNCNkNGMTAsIDB4NTg1ODUwNzAsIDB4Q0IyNEEzRDcsIDB4MzJDMzI0RjIsIDB4MDM5NzVEMTAsIDB4MTU5NUQ1NTUsIDB4OTE0REMwMDAsIDB4Q0M5MTA5MTAsIDB4QjY4QUY3QkIsIDB4M0YxRjFGOTksIDB4NjJCNjcwMDAsIDB4MDAwNjA2MjMsIDB4QjZBQUZGRkYsIDB4MDA2MDYwNjAsIDB4MzREMjAwRUIsIDB4M0M5QjZENjksIDB4QjZBQUY3QkIsIDB4MDA1NUZGRkYsIDB4MjQ5MjExRDQsIDB4ODQ5OTZENDEsIDB4QjY4QUY3QkIsIDB4NzA3NUZGRkYsIDB4NUJFREI0RDAsIDB4QkY1QkVFQTcsIDB4MDM5NkNGMTEsIDB4NTA3MDcwNjAsIDB4RURGN0I4RDksIDB4M0JFRkY3RkIsIDB4MDM5NzBCRDUsIDB4OTVENTU1NTUsIDB4M0M5MzA4REMsIDB4MkQzRTkzRTksIDB4NjUyQkQ3MzEsIDB4MjIwMzIxODEsIDB4MEEwMEI2MDAsIDB4MkMwQTgwQTgsIDB4QjY4OUZGRkUsIDB4RDA3MDcwNjAsIDB4REJCNUIzQ0YsIDB4QjREQjdEQkIsIDB4MEJCNkQ3MzEsIDB4NUM1ODU4NTAsIDB4REI2NUE4RDgsIDB4MzY1RjZDRjIsIDB4MDM5NzQ0QjEsIDB4MTU5NUQ1NTUsIDB4MkVEMzAwREMsIDB4MzUyMzEyMkQsIDB4OUU0NkVGOTksIDB4M0EzQjNCQjksIDB4NjhCNkI5MDIsIDB4MkM2MkI2QUIsIDB4QjZBQUZGRkYsIDB4NTA1MDcwNzAsIDB4REJCNUIzRDEsIDB4QjdEQjREQkIsIDB4MDM5NkQ3MzEsIDB4NUM1ODU4NTgsIDB4Q0QyNEEyRDgsIDB4MzJDMzI0RjIsIDB4MDM5NzZENkQsIDB4MTU5NUQ1RDUsIDB4RUJBOUIwRDAsIDB4OUVEQkFEQkUsIDB4MDM5NUNGMTEsIDB4NzA2MDYwNjAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4QTg4ODhBODgsIDB4Mzg5MjJGQ0YsIDB4MjkzRTEzQzksIDB4MzQ3MkM2RUUsIDB4MDMwMzAxMDEsIDB4OTRBMTEyRDQsIDB4NDk3NDlGNDksIDB4NzU2QUQ3MzEsIDB4NEFDQTg4OEEsIDB4RUI2RkI3Q0EsIDB4QjZEQjZEQjYsIDB4MDM5NzEzRDYsIDB4NTU1NzU3NTQsIDB4QzlBQ0ExRDMsIDB4OTBDOTNDOTcsIDB4MDM5NkM2RjAsIDB4MDkwRDBEMDUsIDB4NTAwMTg4MDAsIDB4MDAzMDA0MDAsIDB4QjY4OUZGRkYsIDB4MDMwMTAxMDksIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjdCNjVBMDAsIDB4MjAwQTA2ODMsIDB4QjZBQkZGRkYsIDB4NjA0MDQwQzAsIDB4NjkyMTlDRDMsIDB4OTI0OTVENzYsIDB4MDM5NkNFRUYsIDB4NzA3MDYwNjAsIDB4OTNDRkJERDcsIDB4M0NGM0NGRTcsIDB4MDM5NjAzOTcsIDB4QTg4ODhBODgsIDB4Mzg5MjEyRDIsIDB4RTkzRTgzQTksIDB4MjQzMUM2RUYsIDB4MDIwMzAzMDEsIDB4MEIwMERDMDAsIDB4MzAwQjA2MzEsIDB4QkVBQkZGRkYsIDB4RDhEOEQ4REEsIDB4OURCOUI4RDQsIDB4RkI5REI5REIsIDB4NzU2OUI2OEMsIDB4NTQ1NDU0NTQsIDB4REE2REE4REMsIDB4QTZEQTZEQTYsIDB4NzU2OENGMTEsIDB4MzUzNTM1MzUsIDB4OUQ5OUJDMDMsIDB4RDk5RDk5RDksIDB4QjY4OUZGREUsIDB4MDcwNzA3MDcsIDB4NjM1RUNBMDIsIDB4NDg2QjEwMjUsIDB4QkVDREZGRkUsIDB4NTA1Q0Q0RDQsIDB4MjY5QTIxRDgsIDB4Mjc5NkRCNDksIDB4OUUwN0Q3MzIsIDB4RUFBQTAwNTcsIDB4MjQ5QTE2RDksIDB4RkZGNkRCNDksIDB4OUUyN0Q3MTIsIDB4QUFBQTAwMjUsIDB4QzRGNDE4RTIsIDB4NEY5NEZENEYsIDB4QjY4OUQ3MzMsIDB4M0EzNTM1MzcsIDB4MURCMUI2RDQsIDB4REIxREIxREIsIDB4NzU2OEE2MkEsIDB4NTQ1NDc0NTQsIDB4NDg2NEE5RDAsIDB4ODY0ODY0ODYsIDB4NzU2OENFRUYsIDB4MzUzNTM1MzUsIDB4OTAxOUJDMDQsIDB4QzE5MDIxMDEsIDB4QjY4OUY3REUsIDB4MjcyNzI3MjcsIDB4NjM0NkMxMTgsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RDhEOEQ4RDgsIDB4OUZGOUJBREQsIDB4RkM5RkY5RkYsIDB4NzU2OUFFNkEsIDB4NTQ1NDc0NTQsIDB4REE2REFDRDYsIDB4QTZEQzY1QTYsIDB4NzU2OEM2RUYsIDB4MzUzNTM1MzUsIDB4MTAxOUJDMDIsIDB4MDIxMDE5MDIsIDB4QjY4QUZGRkYsIDB4MjcwNzI3MjcsIDB4NkFCNkRBMDAsIDB4QjAwMkMwQUMsIDB4QkVBQkZGRkYsIDB4RDhEMEQwNTAsIDB4RUQ4RUI2RDUsIDB4REJGRDhFREIsIDB4NzU2OEQ3MTEsIDB4NTQ1NDVDNUMsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NzU2OTdEODgsIDB4NzdGN0ZGRUIsIDB4NEYyNEE2RDEsIDB4RjI0RjI0RjIsIDB4NzU2OUFFNDksIDB4OTU5NUI1MTUsIDB4OTBBOUMwMDAsIDB4MEM5MEM5MDgsIDB4QjZBQkZGRkYsIDB4OTc5RjFGMTcsIDB4NjMwNkMyMDUsIDB4MzM2MzA2MzMsIDB4QjZBQUZGRkYsIDB4RDBEOEQ4RDgsIDB4RUJCRUI5QzksIDB4QkJFQkJFQjQsIDB4NzU2OUM2Q0UsIDB4NTQ1QzU0NTQsIDB4RTNGNkI1RDQsIDB4MjZFM0Y2M0UsIDB4NzU4OUM2Q0QsIDB4MTUxNTE1MTUsIDB4MUMyMUMwMTIsIDB4REExQzIxQzIsIDB4QjZBQUZGRkYsIDB4MjczNzI3MjcsIDB4NjM0NkMwMUIsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RDhEOERDRDgsIDB4MURCMUI3RDEsIDB4REIxREIxREIsIDB4NzU2OUFFNkEsIDB4NTQ1NDU0NTQsIDB4NUE2NEE5RDMsIDB4QTY0QTZDQTYsIDB4NzU2OENGMTAsIDB4MzUzNTM1MzUsIDB4QjdDQjU0REMsIDB4N0NCN0NCN0MsIDB4QjY4OUNGMTEsIDB4MTQxNjM2MTQsIDB4REI3REI3Q0EsIDB4QjREQjdEQjcsIDB4NzU4OUM2RUYsIDB4NTQ1NDU0NTQsIDB4QzM2NEE4RDMsIDB4MzJDMzY0MzIsIDB4NzU2OUFFNjksIDB4MTUzNTE1MTUsIDB4OUMyOUJFMUYsIDB4QzI5QzI5QzIsIDB4QkVDREZGRkYsIDB4MTcxNzE3MTcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjMwNkJCMDYsIDB4MzQ2MzA2MzQsIDB4QjZBQUZGRkYsIDB4RDhEOEQ4RDgsIDB4OURCOUI5Q0UsIDB4REI5REJGREIsIDB4NzU2OUJFQUQsIDB4NTQ1NDU0NTQsIDB4NkU3NkI0RDcsIDB4RTc2RTZFQzcsIDB4NzU2OEM2Q0YsIDB4MTUzNTM1MzUsIDB4OTAxOUJEMDQsIDB4MDE5QzIxMDEsIDB4QjY4QUZGRkYsIDB4MjcyNzA3MjcsIDB4NjM0NkJGMTYsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RENEQ0RDREMsIDB4MURCMUI0RDYsIDB4QkIxREIxRDcsIDB4NzU2OUE2NEEsIDB4NTQ1NDU0NTQsIDB4NDlEQ0E0Q0YsIDB4ODVDN0UzOUUsIDB4NzU2OEQ3MTEsIDB4MzUzNTM1MzUsIDB4NTAxNUU5MDAsIDB4MDFEMDE1MDEsIDB4QjY4OUZGREUsIDB4MDcwNzA3MDcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIAorCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYzNUFBNjAyLCAweERCNkRCNjFCLCAweDE0NThGRkZGLCAweDAwMDA4MDVFLCAweDAyNDlDMDE4LCAweERCNkRCNjA4LCAweDE0OTlGRkZGLCAweDAwMDBGRjU1LCAweDI5NDlCQTAzLCAweERCNkMwNjAwLCAweDE0NThGRkZGLCAweDAwMDAyQjU1LCAweDZEODEzNzBBLCAweERCNkRCNkRCLCAweDc1OUFGRkZGLCAweDAwMDAwMDA5LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYzMDZDOTAxLCAweDAwMDAwMDhDLCAweDVDQTlGRkZGLCAweDAwMDA1ODcwLCAweEQyNDlDMDA1LCAweEMwMDY4MDI0LCAweDY0RTdGRkZGLCAweDAwRkE1NTc1LCAweDkyNDlDMjA3LCAweDAzNjM2NDI0LCAweDY0RTVFRjlCLCAweDgwNTdGREZGLCAweDI0OTIyOEQ2LCAweDlCMTQ5MjQ5LCAweDVDQzk5RTJBLCAweDc4RkQyQTAwLCAweDQ5MjQ5RkQ1LCAweDkzMThFNDkyLCAweDY0RThBRTY5LCAweDU1RUZBQTAwLCAweDI0OTIyMkQzLCAweDJDMjY5MjQ4LCAweDVDRThBRTRDLCAweDE1NUY3RUUwLCAweDQwMTlCOTAwLCAweDFCNjAzMjAwLCAweDY1MkJGRkZGLCAweDAwMDIwOTA1LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZBQjZEODAwLCAweDMwMEFDMEFDLCAweEJFQUJGRkZGLCAweERDNThEODUwLCAweEVCQkRCNEQyLCAweERCRUI3RUQ0LCAweDAzOTZDRUYxLCAweDU0NUM1QzU4LCAweDQzMjRBM0Q0LCAweERBNEY2NDMyLCAweDAzQjdCRUFCLCAweDE1MTU5NTk1LCAweDkwODlCRDA0LCAweERBOUNBOUNBLCAweEJFQ0NGRkZGLCAweDM3MjczNzE3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZBQjZCODAwLCAweDJDNjJCNkFCLCAweEI2QUJGRkZGLCAweDUwNTA3MDcwLCAweEREQjZCNEQzLCAweEI4REJCRUI4LCAweDAzOTZENzMxLCAweDVDNTg1ODU4LCAweDREMkNBNEQ4LCAweDMyQzMyNUY2LCAweDAzOTc3NThELCAweDE1OTVENUQ1LCAweDkxMERDNzAwLCAweDA4OTBFOTEwLCAweEJFQUJGRkZGLCAweDE3MUY5RjlELCAweDAyQzZDMjAwLCAweDM1MDMwMDMwLCAweEI2OEFGRkZGLCAweERDRENEOEQwLCAweEVEOEVCN0Q0LCAweERCOUQ4RUQ4LCAweDAzOTZDNkQwLCAweDU0NTQ1QzVDLCAweDQzMjRBMkQ2LCAweEY2NEY2NDMyLCAweDAzOTdCNkFBLCAweDE1OTU5NTk1LCAweDlDQzlDMDA3LCAweDAyOUMyOUM4LCAweEM2Q0RGRkZGLCAweDM3MzcxNzE3LCAweDAyQzZCRjAwLCAweDM1NjMxMDMwLCAweEI2QUFGRkZGLCAweERDRENEOEQ4LCAweDU5N0RCMkNDLCAweDk2RUIzNkIzLCAweDAzOTZDNkVGLCAweDU2NTQ1NDVDLCAweDQzMjRBMkQzLCAweEJBNERBNEYyLCAweDAzOTdCNjhDLCAweDM1MTUxNTk1LCAweEVERjZCNUQ3LCAweEQ4RURCRUM3LCAweDAzOTZENzMyLCAweDU4NTg1MDcwLCAweDQ5MUNBNkNFLCAweEYxQ0QyM0FFLCAweDAzOTcyQzUzLCAweDE1OTVENTU1LCAweDJFOTMwQkQ3LCAweEY1MkYxMjJELCAweDk2MDdENzMxLCAweDMyQTJBM0ExLCAweDc2OTk0RERBLCAweDRERDY5NjZELCAweDBCQjVDNkNFLCAweDQwNDBDMEMwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweDg4QTg4QTg4LCAweDM2QTI3NUNDLCAweDI5Q0M5QkFBLCAweDEzRDVDNkVFLCAweDAxMDEwOTA5LCAweDREQjEyODA1LCAweERCMERCMkRCLCAweEM3MTFGRkZGLCAweDAyMDMwMzAxLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDY4MzZBMTBBLCAweDJCNjJCNkEzLCAweEI2QUFGRkZGLCAweDUwNzA3MDYwLCAweERCQjVCNENELCAweEI0REJCNUJCLCAweDBCQjZENzMxLCAweDU4NTg1ODUwLCAweDVCNkRBOUQ5LCAweDM2REY2REY2LCAweDAzOTc0NEIxLCAweDE1OTVENTU1LCAweEQ1NERDNzAwLCAweDBFOUQwOUQ0LCAweEE2MjVFRjk5LCAweDNBM0IzQkI5LCAweDAzNDZCODAyLCAweDM0MDM0MDM0LCAweEJFQUFGRkZGLCAweEQ4RDhEOEQ4LCAweDlEQjlCOEQ0LCAweEZCOURCOURCLCAweDc1NjhCNkFDLCAweDU0NTQ1NDU0LCAweERBNkRBOERDLCAweEE2REE2REE2LCAweDc1NjhDRjExLCAweDM1MzUzNTM1LCAweDlEOTlCQzAzLCAweEQ5OUQ5OUQ5LCAweEI2ODlGRkZFLCAweDA3MDcwNzA3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZEQjBGRjAxLCAweERCNkRCNkRCLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZEQjBGRjAxLCAweERCNkRCNkRCLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYzNDZCQjI0LCAweDI0NjM0NjI0LCAweEJFQ0NGRkZGLCAweERDRENEQ0RDLCAweDFEQjFCNkQ0LCAweERCMURCMURCLCAweDc1Njg5RTJBLCAweDU0NTQ1NDU0LCAweDQ4NjRBOUQwLCAweDg2NDg2NDg2LCAweDc1NjhDRUVGLCAweDM1MzUzNTM1LCAweDkwMTlCQzA0LCAweEMxOTAyMTAxLCAweEI2ODlGN0RFLCAweDI3MjcyNzI3LCAweDYzNDZDMTE4LCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweEQ4RDhEOEQ4LCAweDlGRjlCQURELCAweEZDOUZGOUZGLCAweDc1NjlBRTZBLCAweDU0NTQ1NDU0LCAweERBNkRBQ0Q2LCAweEE2REM2NUE2LCAweDZENDhDRUVGLCAweDM1MzUzNTM1LCAweDEwMTlCQzAyLCAweDAyMTAxOTAyLCAweEI2ODlGRkZGLCAweDI3MDcyNzI3LCAweDYzMDZCQzBELCAweDI1NjM1NjM0LCAweEJFQUJGRkZGLCAweERDRENEOEQ4LCAweDFCQjZCNUQwLCAweEJBRkI3N0Q3LCAweDc1NjhCNkFDLCAweDU2NTY1NDU0LCAweDI0OTI2Q0NGLCAweDVEQTU1MjRELCAweDc1NjlBNjUwLCAweDQ1NTU1NTU1LCAweDUzNzZCMkQ5LCAweEY3NjNBRTNCLCAweDZENDk4NUE4LCAweEY3RjczRjNGLCAweDIzNTIwMEQ5LCAweEVEMkYxMkYxLCAweEI2QUFERjU3LCAweDkxOTkxQjFCLCAweDYzMDZDMjA1LCAweDMzNjMwNjMzLCAweEI2QUFGRkZGLCAweEQwRDhEOEQ4LCAweEVCQkVCOUM5LCAweEJCRUJCRUI0LCAweDc1NjlDNkNFLCAweDU0NTQ1NDU0LCAweEUzRjZCNUQ0LCAweDI2RTNGNjNFLCAweDZENDhCRUFELCAweDM1MzUzNTM1LCAweDFDMjFDMDEyLCAweERBMUMyMUMyLCAweEI2QUFGRkZGLCAweDI3MzcyNzI3LCAweDYzNDZDMDFCLCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweEQ4RDhEQ0Q4LCAweDFEQjFCN0QxLCAweERCMURCMURCLCAweDc1NjlBRTZBLCAweDU0NTQ1NDU0LCAweDVBNjRBOUQzLCAweEE2NEE2Q0E2LCAweDc1NjhDRjEwLCAweDM1MzUzNTM1LCAweEI3Q0I1NERDLCAweDdDQjdDQjdDLCAweEI2ODlDRjExLCAweDE2MTQzNjE0LCAweERCN0RCN0NBLCAweEI0REI3REI3LCAweDc1NjlDNkVGLCAweDU0NTQ1NDU0LCAweEMzNjRBOEQzLCAweDMyQzM2NDMyLCAweDc1NjlBRTQ5LCAweDE1MTUxNTE1LCAweDlDMjlCRTFGLCAweEMyOUMyOUMyLCAweEJFQ0RGRkZGLCAweDE3MTcxNzE3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYzMDZCQjA2LCAweDM0NjMwNjM0LCAweEI2QUFGRkZGLCAweERDRDhEOEQ4LCAweDlEQjlCOUNFLCAweERCOURCRkRCLCAweDc1NjlCRUFELCAweDU0NTQ1NDU0LCAweDZFNzZCNEQ3LCAweEU3NkU2RUM3LCAweDZENDhDNkVGLCAweDM1MzUzNTM1LCAweDkwMTlCRDA0LCAweDAxOUMyMTAxLCAweEI2OEFGRkZGLCAweDI3MjcwNzI3LCAweDYzNDZCRjE2LCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweERDRENEQ0RDLCAweDFEQjFCNEQ2LCAweEJCMURCMUQ3LCAweDc1NjlBNjRBLCAweDU0NTQ1NDU0LCAweDQ5RENBNENGLCAweDg1QzdFMzlFLCAweDc1NjhDRjExLCAweDM1MzUzNTM1LCAweDUwMTVFOTAwLCAweDAxRDAxNTAxLCAweEI2ODlGRkRFLCAweDA3MDcwNzA3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAKKwkJMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2REI2OTYwNywgMHg4NTZDMzZEQiwgMHg0NDY3RkZGRiwgMHhEODAwMDAwMCwgMHg2REI2MTUwMSwgMHhEODFEQjZEQiwgMHhDRUY4RkZGRiwgMHgwOTAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MjM2MDMwMSwgMHhEQjZEQjZEQiwgMHhFRkJERkZGRiwgMHgwMDAwMDA2MCwgMHg2MzEwNDYwOCwgMHhEQjZEQjZEQiwgMHg3RDZFRkZGRiwgMHgwMDAwMDA3RSwgMHg2MENEODUwMywgMHhEQjZEQjZDMywgMHg1Q0VBRkZGRiwgMHgwMDAwMDAzNSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MzE2QkUwMywgMHgyNUUzNTYzNSwgMHhCRUFDRkZGRiwgMHhGNEQ0RDREQywgMHg5Qjc2QjRDRiwgMHhCNjlCNzdCNiwgMHgwMzk3QTY0RCwgMHg1NjU2NTQ1NCwgMHhDQkU0QTRENiwgMHg4NkM4NjQ4NiwgMHgwMzk2Q0YwRiwgMHgyNTI1MzUzNSwgMHg5REExQzUwMCwgMHhEOTVEOTFEOSwgMHhCRUFCRkZGRSwgMHgwRDBEMDcwNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMzA2QkUwMCwgMHgzNTYzMTAzMCwgMHhCNjhBRkZGRiwgMHg5Q0RDRDhEOCwgMHhGRDhFQjZEMywgMHhEQjdEQkZEQiwgMHgwMzk2QzZDRiwgMHg1NjU0NTQ1QywgMHg0MzI0QTRENSwgMHhCRTRGQTRGNiwgMHgwMzk3QjZBQywgMHgzNTE1MTU5NSwgMHg5MEE5QzMwMCwgMHhEQTFEQTlDQSwgMHhCRUFCRkZGRiwgMHgyNzI3MjczNywgMHgwMzUwQkUwMCwgMHgyNTgyNTgyNSwgMHhCRUFCRkZGRiwgMHhGNkY2RDRENCwgMHg3QkE5QjREMSwgMHhCQUZENjlCNywgMHgwMzk3ODVBRiwgMHg1NzU2NTQ1NCwgMHg0REVDQTVENywgMHhBNkM4NjVBNiwgMHgwMzk2QzZFRiwgMHgyNTM1MzUzNSwgMHgxMDIxQzIwMCwgMHhEOTFEOTkwMiwgMHhCNkFBRkZERSwgMHgwNzA3MDcwNywgMHgxNEYxMDBEQywgMHg0QTk0QTk0QiwgMHhCRUFCRjdERCwgMHhGNkQ0RjRENCwgMHg3RDcxQjRENSwgMHhENzdEQTlCQiwgMHgwMzk3NzU4RiwgMHg1NzU2NTY1NCwgMHhDQTY0QTRENiwgMHg4NkM4NjQ4NiwgMHgwMzk2RDczMCwgMHgyNTI1MzUzNSwgMHhEQkJFQjREMywgMHhCQkVCQkVENCwgMHgwMzk2Q0YxMSwgMHg1NDVDNUM1OCwgMHg0MzI0QTFENiwgMHhGNjQzMjQzMiwgMHgwMzk3OTYwQywgMHgxNTE1OTU5NSwgMHgyRjkyMUFEMiwgMHhDNUFERDJGRCwgMHhCNjhBRDczMywgMHg3QzdDNjhEQSwgMHg2NzU5OUNEMiwgMHg3NjQ3NUM3NiwgMHgwMzk2Q0VFRiwgMHg3MDcwNjA2MCwgMHhGRkZGQkJENywgMHgzRkZGRkZGRiwgMHgwMzk3MDNCNiwgMHhENzc1NTU1RCwgMHgzQzkzMUVERSwgMHgyRDNFRDNDRCwgMHg1RDBFQ0YwRiwgMHgwMjAzODE4MSwgMHg2REIwRkYwMiwgMHhEQjZEQjZEQiwgMHhGN0RFRkZGRiwgMHgwMDAwMDIwMywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwQUM2QzIwMCwgMHgzMTAzMDAyQywgMHhCNjg5RkZERSwgMHhEOEQ4RDBEMCwgMHhFRDhFQjVENCwgMHhCQkZEQkVENCwgMHgwMzk2Q0VGMCwgMHg1NDVDNUM1QywgMHg0MzJDQTNEOSwgMHhGQTRGNjUzNiwgMHgwMzk3QTY2QiwgMHgxNTE1OTU5NSwgMHg5Qzg5QzIxMCwgMHhEQTlDQTlDQSwgMHhCRUFCRkZGRiwgMHgyNzM3MzcxRiwgMHgwMzQ2QkUwMCwgMHgzMDAzMDAzNCwgMHhCRUFBRkZGRiwgMHhEOEQ4RDhEOCwgMHg3REIxQjZEMywgMHhEQkZEQkVEQiwgMHg2RDQ4QkVBRCwgMHg1QzU0NTQ1NCwgMHg1QTY1QThENywgMHhGNjRCRURBNiwgMHg2RDQ4Q0YwRiwgMHhENTM1MzUzNSwgMHg5RDk5QzAwNCwgMHgyNDlCNDk0OSwgMHhCRUFCRkZGRiwgMHhGRjU3RjUwNywgMHgyREI2QzAwMCwgMHgyNDk3MjUwMCwgMHhCRUFDRkZGRiwgMHg3RjU1MjMwMCwgMHg2REI2QUQwMCwgMHgwRTEwMDJEQiwgMHhCNkFBRkZGRiwgMHhCNTBCMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MzQ2QkIyNCwgMHgyNDYzNDYyNCwgMHhCRUNDRkZGRiwgMHhEQ0RDRENEQywgMHgxREIxQjZENCwgMHhEQjFEQjFEQiwgMHg2RDQ4OUUyQSwgMHg1NDU0NTQ1NCwgMHg0ODY0QTlEMCwgMHg4NjQ4NjQ4NiwgMHg2RDQ4Q0VFRiwgMHgzNTM1MzUzNSwgMHg5MDE5QkMwNCwgMHhDMTkwMjEwMSwgMHhCNjg5RjdGRSwgMHgzNzI3MjcyNywgMHg2MzQ2QzExOCwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEOEQ4RDhEOCwgMHg5RkY5QkFERCwgMHhGQzlGRjlGRiwgMHg2RDQ5QUU2QSwgMHg1NDU0NTQ1NCwgMHhEQTZEQUNENiwgMHhBNkRDNjVBNiwgMHg2RDQ4Q0VFRiwgMHgzNTM1MzUzNSwgMHgxMDE5QkMwMiwgMHgwMjEwMTkwMiwgMHhCNjhBRkZGRiwgMHgyNzA3MjcyNywgMHg5NEIxMDBENSwgMHg0QTE0QTk0QSwgMHhCNjg5RkZGRiwgMHhGNkY0RjRGQywgMHg3REIxQjVENCwgMHhENzdEQjdENywgMHg2RDQ5OERFOSwgMHg1NzU2NzY1NCwgMHhBNTUyMTREMCwgMHg0NjIwNTg1OSwgMHg2RDQ5RUZCRCwgMHg0RDQ1NkQ3NSwgMHg5M0NGQkRENywgMHhGQ0YzQ0ZFNywgMHg2RDQ5NzU2OCwgMHg1NUY3N0ZCQiwgMHgzMkQyMUVDRSwgMHhDOTJFOTJFOCwgMHg5RTA2RDczMSwgMHhDOUUxQTNBMywgMHg5NTA5MDBDRSwgMHg1MDk1MDkxMCwgMHhCNkFBRkZGRiwgMHhEOEQ4RDhEOCwgMHhFQkJFQjlDOSwgMHhCQkVCQkVCNCwgMHg2RDQ5QzZDRSwgMHg1NDVDNTQ1NCwgMHhFM0Y2QjVENCwgMHgyNkUzRjYzRSwgMHg2RDY5QzZDRCwgMHgxNTE1MTUxNSwgMHgxQzIxQzAxMiwgMHhEQTFDMjFDMiwgMHhCNkFBRkZGRiwgMHgyNzM3MjcyNywgMHg2MzQ2QzAxQiwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEOEQ4RENEOCwgMHgxREIxQjdEMSwgMHhEQjFEQjFEQiwgMHg2RDQ5QUU2QiwgMHg1NDU0NTQ1NCwgMHg1QTY0QTlEMywgMHhBNjRBNkNBNiwgMHg2RDQ4Q0YxMCwgMHgzNTM1MzUzNSwgMHhCN0NCNTREQywgMHg3Q0I3Q0I3QywgMHhCNjg5Q0YxMSwgMHgxNjE0MzYxNCwgMHhEQjdEQjdDQSwgMHhCNERCN0RCNywgMHg2RDY5QzZFRiwgMHg1NDU0NTQ1NCwgMHhDMzY0QThEMywgMHgzMkMzNjQzMiwgMHg2RDQ5QUU0OSwgMHgxNTE1MzUxNSwgMHg5QzI5QkUxRiwgMHhDMjlDMjlDMiwgMHhCRUNERkZGRiwgMHgxNzE3MTcxNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MzA2QkIwNiwgMHgzNDYzMDYzNCwgMHhCNkFBRkZGRiwgMHhEOEQ4RDhEOCwgMHg5REI5QjlDRSwgMHhEQjlEQkZEQiwgMHg2RDQ4QkVBRCwgMHg1NDU0NTQ1NCwgMHg2RTc2QjRENywgMHhFNzZFNkVDNywgMHg2RDQ4QzZFRiwgMHgzNTE1MzUzNSwgMHg5MDE5QkQwNCwgMHgwMTlDMjEwMSwgMHhCNjhBRkZGRiwgMHgyNzI3MDcyNywgMHg2MzQ2QkYxNiwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEQ0RDRENEQywgMHgxREIxQjRENiwgMHhCQjFEQjFENywgMHg2RDQ5QTY0QSwgMHg1NDU0NTQ1NCwgMHg0OURDQTRDRiwgMHg4NUM3RTM5RSwgMHg2RDQ4Q0YxMSwgMHgzNTM1MzUzNSwgMHg1MDE1RTkwMCwgMHgwMUQwMTUwMSwgMHhCNjg5RkZGRSwgMHgwNzA3MDcwNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgCisJCTB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NkRCNkMxMDUsIDB4MkY2N0I2MUIsIDB4NjUwQUZGRkYsIDB4NzA0MDgwMDAsIDB4NDQ5RjAwREQsIDB4NDkyNDkyNDksIDB4NUNFN0RGMzIsIDB4MEIyREY1NTQsIDB4MjNBMzA4REUsIDB4NDkyNDkyNDksIDB4NkQyOUVGNzEsIDB4MjBFODU3QjUsIDB4RERCMEMxMDYsIDB4MjQ5MjQ5NEQsIDB4NkQyN0Y3QkEsIDB4RUE1N0Y1MDAsIDB4MkRCNkQ3MDAsIDB4MzQ5QjZEMDgsIDB4NkQwN0ZGRkUsIDB4RkY1NUFCMDAsIDB4MERCNkMxMUIsIDB4MjQ5MjQ5NjgsIDB4NkNFNkY3REUsIDB4RkY1NUZFMDAsIDB4Q0RDOTAwRTAsIDB4QTkyQTkyNjksIDB4NkNFOUU3OUMsIDB4NTc1NTU1RTAsIDB4M0RCMTA3MDEsIDB4REI2REIwREIsIDB4RDcxOUZGRkYsIDB4MDAwMjAzMDEsIDB4NkRCNjBGMDYsIDB4M0I2MUI2REIsIDB4REY1QUZGRkYsIDB4NDBDMDgwMDAsIDB4MkRCNkMyMDYsIDB4MjREQjREMDAsIDB4NjRDOEZGRkYsIDB4RjU1NUFGMDAsIDB4NkRCNkMyMDUsIDB4MjQ5MERDREIsIDB4NkQwOEY3REUsIDB4NTdCNTAwMDAsIDB4NkRCNkE2MDAsIDB4NzQ5MDAwREIsIDB4NkNFOUZGRkYsIDB4RDUwMjAwMDAsIDB4NkRCNjNDMDMsIDB4MEExREI2REIsIDB4OTVEMEZGRkYsIDB4QUQwMDAwMDAsIDB4NkRCNkZGMDEsIDB4REIwREI2REIsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MTRBOTA1RDIsIDB4NDlGNDIxNEEsIDB4OUUyN0U3OTcsIDB4NkVFRUVDQUMsIDB4OUZGOUJBREQsIDB4RkZGRkY5RkYsIDB4MDM5NzNDOTIsIDB4NTU1NzU2NTQsIDB4NDlFQ0E1RDMsIDB4QjBDOTdDOUYsIDB4MEJCNkNGMTAsIDB4MEQwRDA1MjUsIDB4NUQ5MUEzMDIsIDB4RDgzREI1RDgsIDB4QjZBQUZGRkYsIDB4MDEwOTA5MDksIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MTBGMTAwRDIsIDB4NEExMEE5NEIsIDB4QkVBQkZGRkYsIDB4RDZGNkQ0RDQsIDB4N0RCMUI1RDUsIDB4REI3RDcxREIsIDB4MDM5Nzg1QUUsIDB4NTc1NzU2NTQsIDB4Q0E2NEE1RDYsIDB4ODZDODZDODYsIDB4MDNCNkQ3MzAsIDB4MjUyNTM1MzUsIDB4OUMxOUMwMDQsIDB4RDg1RDkxRDksIDB4QkVBQkZGRkYsIDB4MEQwRDA1MDcsIDB4NzRBMTA0RDIsIDB4NDFFNDlGNDIsIDB4N0Q4OUQ3MzIsIDB4NEFDQTg4ODgsIDB4RkZCOUI4REEsIDB4RkY3REY3RkIsIDB4MDM5NzFDMTUsIDB4NTU1NTU3NTQsIDB4NDg2Q0E3RDQsIDB4QjRDOUJDODcsIDB4MEJCNkQ3MTAsIDB4MEQwNTI1MjUsIDB4MUQ5MUE2MDAsIDB4MDA0MDA1MDAsIDB4QkVBQkZGRkUsIDB4ODEwOTA5MEQsIDB4OTRBMTExRDMsIDB4NDk2NDFGNDksIDB4NkQ2OURGNTEsIDB4NEFDQUNBODgsIDB4OTNDOUJEREMsIDB4M0NGRTc5M0MsIDB4MDM5NzEzRDYsIDB4NTU1NTU3NTQsIDB4QzlFQ0EzRDQsIDB4OTBDOTdDOTcsIDB4MDM5NkNGMTEsIDB4MEQwRDBEMDUsIDB4N0Q3RUI0RDIsIDB4RDc3QkE5RDcsIDB4MDM5N0E2NEUsIDB4NTY1NjU0NTQsIDB4NERBNEEzRDQsIDB4ODY0QkU0QkUsIDB4MDM5NkJFQ0UsIDB4MjUzNTM1MTUsIDB4QUE2MjEzREYsIDB4N0ZBOUYyOUUsIDB4QjY4OUQ3MzMsIDB4REU2RUY0NjQsIDB4NUJCNUIzRDAsIDB4QjREQjdEQkYsIDB4MEJCNkQ3MzEsIDB4NTg1ODU4NTAsIDB4Q0QyQ0E1RDgsIDB4MzJDMzY1RjIsIDB4MDM5NzY1MkYsIDB4MTU5NUQ1RDUsIDB4RDUyREREMDAsIDB4MDhEMEVERDAsIDB4QkVBQkZGRkUsIDB4MTcxRjlEOUQsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjM1NkMzMDQsIDB4MjU4MzU2MzUsIDB4QjZBQkZGRkUsIDB4RjRENEQ0REMsIDB4N0JCN0I0RDIsIDB4Qjc3QkE5RDcsIDB4MDM5N0FFNkQsIDB4NTc1NjU2NTQsIDB4NEJFNEEzRDQsIDB4ODY0ODY0QkUsIDB4MDM5NkM2RUYsIDB4MjUzNTM1MzUsIDB4MTAyMUMyMDAsIDB4RDkxRDk5MDIsIDB4QkVBQ0ZGRkYsIDB4MDUwNzA3MjcsIDB4MDJDNkJEMDAsIDB4N0IwODgwMjgsIDB4QkVBQkZGRkYsIDB4NDA2MDUwRDAsIDB4NDkzNEFBRDAsIDB4RDYxOUFDOTMsIDB4NkQyN0Q3MzEsIDB4NDI3ODU4NUMsIDB4OTNDRkJERDcsIDB4RkNGM0NGRTcsIDB4NjUyODZENDksIDB4RUVDQUFBMDgsIDB4NjNDOUI2RDYsIDB4REI2REI2REIsIDB4NkQ0OUE2MkEsIDB4NTU1NTU1MEIsIDB4NUJCMUIzRDEsIDB4Qjc1QjZEM0YsIDB4NjUyOENGMTAsIDB4NTU1NUY1MEEsIDB4QjMxMjYzRDQsIDB4NkQyNERBNDksIDB4NkQ0N0Q3MzEsIDB4OTUyNTAyQTAsIDB4NERCMkMwMDIsIDB4MEM5Q0ExRDksIDB4QjZBQUZGRkUsIDB4REYzNzA1MDMsIDB4NjM0NkJCMjQsIDB4MjQ2MzQ2MjQsIDB4QkVDQ0ZGRkYsIDB4RENEQ0RDREMsIDB4MURCMUI2RDQsIDB4REIxREIxREIsIDB4NkQ0ODlFMkEsIDB4NTQ1NDU0NTQsIDB4NDg2NEE5RDAsIDB4ODY0ODY0ODYsIDB4NkQ0OENFRUYsIDB4MzUzNTM1MzUsIDB4OTAxOUJDMDQsIDB4QzE5MDIxMDEsIDB4QjY4OUY3REUsIDB4MjcyNzI3MjcsIDB4NjM0NkMxMTgsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RDhEOEQ4RDgsIDB4OUZGOUJBREQsIDB4RkM5RkY5RkYsIDB4NjU0OUFFNkEsIDB4NTQ1NDU0NTQsIDB4REE2REFDRDYsIDB4QTZEQzY1QTYsIDB4NjUyOEM2RUYsIDB4MzUzNTM1MzUsIDB4MTAxOUJDMDIsIDB4MDIxMDE5MDIsIDB4QjY4QUZGRkYsIDB4MjcwNzI3MjcsIDB4OTRBMTA5RDIsIDB4NDE3NDlGNDEsIDB4QTYyN0VGOTgsIDB4NkU2RUVDRUMsIDB4OTNDOUJEREQsIDB4Mjc5RTRGRTcsIDB4NjUyODZENDksIDB4RUVBQUE4ODAsIDB4ODVFQTAwQ0YsIDB4N0Y4NjdBNjYsIDB4NkQ0OEVGQkMsIDB4QzlDOTQ5NDksIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NjUyODZENDksIDB4QkVBQThBMDAsIDB4MzI5MzUyQ0UsIDB4QTlBQzkyQzksIDB4NzU4N0Q3MTAsIDB4ODk4MTg5ODMsIDB4OTUwOTAxRDEsIDB4NTBGNTBGNTAsIDB4QjZBQUVGQkIsIDB4RDNEMkQyRDIsIDB4RUJCRUI5QzksIDB4QkJFQkJFQjQsIDB4NkQ0OUM2Q0UsIDB4NTQ1NDU0NTQsIDB4RTNGNkI1RDQsIDB4MjZFM0Y2M0UsIDB4NkQ0OUM2Q0QsIDB4MTUxNTE1MTUsIDB4MUMyMUMwMTIsIDB4REExQzIxQzIsIDB4QjY4QUZGRkYsIDB4MjcyNzI3MjcsIDB4NjM0NkMwMUIsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RDhEOERDRDgsIDB4MURCMUI3RDEsIDB4REIxREIxREIsIDB4NkQ0OUFFNkEsIDB4NTQ1NDU0NTQsIDB4NUE2NEE5RDMsIDB4QTY0QTZDQTYsIDB4NkQ0OENGMTAsIDB4MzUzNTM1MzUsIDB4QjdDQjU0REMsIDB4N0NCN0NCN0MsIDB4QjY4OUNGMTEsIDB4MTYxNDM2MTQsIDB4REI3REI3Q0EsIDB4QjREQjdEQjcsIDB4NkQ0OUM2RUYsIDB4NTQ1NDU0NTQsIDB4QzM2NEE4RDMsIDB4MzJDMzY0MzIsIDB4NkQ0OUFFNDksIDB4MTUxNTE1MTUsIDB4OUMyOUJFMUYsIDB4QzI5QzI5QzIsIDB4QkVDREZGRkYsIDB4MTcxNzE3MTcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjMwNkJCMDYsIDB4MzQ2MzA2MzQsIDB4QjZBQUZGRkYsIDB4RDhEOEQ4RDgsIDB4OURCOUI5Q0UsIDB4REI5REJGREIsIDB4NkQ0OUJFQUQsIDB4NTQ1NDU0NTQsIDB4NkU3NkI0RDcsIDB4RTc2RTZFQzcsIDB4NjUyOEM2Q0YsIDB4MzUzNTM1MzUsIDB4OTAxOUJEMDQsIDB4MDE5QzIxMDEsIDB4QjY4QUZGRkYsIDB4MjcyNzA3MjcsIDB4NjM0NkJGMTYsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RENEQ0RDREMsIDB4MURCMUI0RDYsIDB4QkIxREIxRDcsIDB4NkQ0OUE2NEEsIDB4NTQ1NDU0NTQsIDB4NDlEQ0E0Q0YsIDB4ODVDN0UzOUUsIDB4NkQ0OENGMTEsIDB4MzUzNTM1MzUsIDB4NTAxNUU5MDAsIDB4MDFEMDE1MDEsIDB4QjY4OUZGRkUsIDB4MDcwNzA3MDcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIAorCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZEQjY1QTAwLCAweDIzNjFCNkRCLCAweDc1NkVGRkZGLCAweDQwODAwMDAwLCAweDgyNDZCRTE2LCAweDI0OTI0QzI2LCAweDVEMDdFRjk3LCAweEFEQjVENjU4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDk2MjhFNzJGLCAweDVGN0VBMjhCLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDk2MjhENkVELCAweDU1NTVGRTAwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDlFMjhENkVELCAweDU1NTU1RkE4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDk2MjhBRTZBLCAweEZGRUZGRjcwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDlERTlBNjQ5LCAweDg4ODA4MDdGLCAweDJDOTIwMERGLCAweDJEMjJEMkU5LCAweDY0RTVFNzc5LCAweDE3OUY5RkRGLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDY1QjY4MjAwLCAweDM4MEI4NjgzLCAweDdEMkNGRkZGLCAweDQwNDBDMEMwLCAweEZGRjlCQkQ2LCAweEZGRkZGRkZGLCAweDdEMjhFRjUyLCAweDA5MDkwRDJELCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweEE2MkFFNzUxLCAweDdFRkFFODdDLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDdENjhCNkFCLCAweEFBQUFBODVGLCAweEIzNjM5M0QwLCAweDZEQjZEQjZELCAweDZEMDg5RTI5LCAweDAwQThGQTU1LCAweDIzQjQxQ0Q0LCAweDQ4MjQ5MjQ5LCAweDVDRTZBRTZFLCAweEVBRkU1RjJELCAweDEwMDA5MzAwLCAweDAwRjAyMTE5LCAweDY0RTlGRkZGLCAweDI1MDUwOTAyLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZEQjYwODA0LCAweDNCNjFCNkRCLCAweEU3OTlGRkZGLCAweDQwNDAwMDAwLCAweEY2OTkyRkRCLCAweDY5NjY5NzQ5LCAweDM0NTNDNkNFLCAweDQwQzBDMDgwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweDg4ODg4QTg4LCAweDM2RUI4RENFLCAweDJFNENFQjhCLCAweDEzRDVDRUVFLCAweDAxMDkwOTBELCAweDREQjEzRTBDLCAweERCMERCMkRCLCAweEM2RUZGRkZGLCAweDAyMDMwMTAxLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZEQjZGRjAxLCAweDFCNkRCNkRCLCAweEY3RERGRkZGLCAweDQwODAwMDAwLCAweEY0QTExMUQ1LCAweDQ5NjQ5RjQ5LCAweDZENkFERjUxLCAweDRBNEFDQTg4LCAweEZGRjlCQkQ2LCAweEZGRkZGRkZGLCAweDAzOTcxM0Q2LCAweDU1NTU1NzU0LCAweDQ5QUNBMkQxLCAweDkwQzkzQzk3LCAweDAzOTZDRUYwLCAweDBEMEQwRDA1LCAweDUwMDE5RjAwLCAweDQwMzAwNDAwLCAweEJFQUJGRkZGLCAweEMxODE4OTA5LCAweDc2OTkzQ0RBLCAweDZENTQ5NjY5LCAweDFCRjRDNkNFLCAweDQwNDBDMEMwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweEE4ODg4QTg4LCAweEM4RkI5Q0QxLCAweDMzNENGQjkzLCAweDBCQjVDRjBGLCAweDA5MDkwOTBELCAweDQwMDE0RjAwLCAweDYwMjQwMzQwLCAweEFFODlGRkZFLCAweEMyQzM4MzAxLCAweDc2OTE0QUQ4LCAweDRENTY5NjRELCAweDEzRDVDNkNFLCAweDQwNDBDMEMwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweDg4ODg4QTg4LCAweEI2Q0JBMkNCLCAweDhFRThGQzhDLCAweDEzRDRENzMwLCAweDgxODkwOTA5LCAweEVCNjlCM0QyLCAweEI2RUQ2RkJBLCAweDAzOTczQzcyLCAweDU1NTc1NjU0LCAweDQ4NjRBMkQzLCAweDk3NDlCNDlFLCAweDAzOTZDRjEwLCAweDBEMDUyNTI1LCAweEI1OEExQkQ0LCAweDUwRDU0QjU4LCAweEI2QUFDRjEyLCAweDFEMTk5N0QzLCAweERCN0RCM0NGLCAweEI3N0I3REI0LCAweDBCQjZENzMwLCAweDU2NTQ1QzVDLCAweDQzMjRBM0Q2LCAweERFNEY2NDM2LCAweDAzOTdBRTZDLCAweDM1MTUxNTk1LCAweDlDODlCRTA2LCAweDAyMTAyOUNBLCAweEJFQ0NGRkZGLCAweDI3MzczNzM3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDc0MjkwMEQxLCAweDQxRjQ5RjRBLCAweDk2MDdFNzk1LCAweDZFRUVBQ0FDLCAweDdEQjFCNkQ0LCAweERCNkRCNkRCLCAweDAzOTcyQzUzLCAweDU1NTc1NzU0LCAweEM4NjRBNEQyLCAweDk3QzlCNDlFLCAweDBCQjZDRUYwLCAweDBEMDUwNTI1LCAweDFEOTFBODAwLCAweDAwNDAwNTAwLCAweEJFQ0JGRkZGLCAweDA5MDkwRDBELCAweDYxQjZGRjBBLCAweERCNkRCNkRCLCAweEU3NzhGRkZGLCAweDAwMDAwMDQwLCAweEFBNkJENTAwLCAweDQwMEFDNjM1LCAweEJFQ0NGRkZGLCAweDYwNUNENzc1LCAweDI0OTM1OUNGLCAweDRFOTQ5MjZELCAweDZENDZENzMwLCAweDhBMDBGODU3LCAweDlCQUVCMUQ5LCAweERBRUZDRUU0LCAweDZENDhENzMxLCAweDAwODg1NTU1LCAweEVCNkRCMEQ0LCAweERFREI4OUI2LCAweDY1MjhDRjEwLCAweDYwNUU1NTU1LCAweDYzQjZCNUQ2LCAweEQ3NkRCNkRCLCAweDY1Mjk3NTY4LCAweDU1NzU1NTNGLCAweDIyRDIyQUNFLCAweDQ5MjY5MkMxLCAweDZENDZENzMxLCAweDg5ODk4M0EyLCAweDk0QjkwMERCLCAweDRGRTRCRjRGLCAweEJFQUNGRkZGLCAweDlEREZERURDLCAweDFEQjFCNkQ0LCAweERCMURCMURCLCAweDY1Mjg5RTJBLCAweDU0NTQ1NDU0LCAweDQ4NjRBOUQwLCAweDg2NDg2NDg2LCAweDY1MjhDRUVGLCAweDM1MzUzNTM1LCAweDkwMTlCQzA0LCAweEMxOTAyMTAxLCAweEI2ODlGN0RFLCAweDI3MjcyNzI3LCAweDYzNDZDMTE4LCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweEQ4RDhEOEQ4LCAweDlGRjlCQURELCAweEZDOUZGOUZGLCAweDY1MjlBRTZBLCAweDU0NTQ1NDU0LCAweERBNkRBQ0Q2LCAweEE2REM2NUE2LCAweDY1MjhDRUVGLCAweDM1MzUzNTM1LCAweDcwMjk4QTAwLCAweDA5RjAyOTAyLCAweEI2OEFGRkZGLCAweDg3MjcyNzI3LCAweEY2OTkzQ0RDLCAweDRENjQ5RTY5LCAweDZENjdDRjBGLCAweDQyNDI0MkMwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDY1Mjg2RDQ5LCAweDU1RDVGRkZCLCAweEJCOEI3MENDLCAweDQ5MzY5QjY5LCAweDdEODhERjUxLCAweEM5QzlDOTZELCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDY1Mjk2NTQ5LCAweDU1N0ZERkVFLCAweDQzMkM5QUQ0LCAweDkzNEFGQkVGLCAweDZENDdERjUxLCAweDhEOEQ4RDg5LCAweEY1MEYwNkQwLCAweDUwRTUwRjE0LCAweEI2QUFFRjlBLCAweEQxRDFEM0QzLCAweEVCQkVCOUM5LCAweEJCRUJCRUI0LCAweDY1MjlDNkNFLCAweDU0NUM1NDU0LCAweEUzRjZCNUQ0LCAweDI2RTNGNjNFLCAweDZENDlDNkNELCAweDE1MTUxNTE1LCAweDFDMjFDMDEyLCAweERBMUMyMUMyLCAweEI2QUFGRkZGLCAweDI3MzcyNzI3LCAweDYzNDZDMDFCLCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweEQ4RDhEQ0Q4LCAweDFEQjFCN0QxLCAweERCMURCMURCLCAweDY1MjhBRTRCLCAweDU0NTQ1NDU0LCAweDVBNjRBOUQzLCAweEE2NEE2Q0E2LCAweDY1MjhDRjEwLCAweDM1MzUzNTM1LCAweEI3Q0I1NERDLCAweDdDQjdDQjdDLCAweEI2ODlDRjExLCAweDE2MzQxNjE0LCAweERCN0RCN0NBLCAweEI0REI3REI3LCAweDY1NDlDNkVGLCAweDU0NTQ1NDU0LCAweEMzNjRBOEQzLCAweDMyQzM2NDMyLCAweDY1MjlBNjQ5LCAweDE1MzUxNTE1LCAweDlDMjlCRTFGLCAweEMyOUMyOUMyLCAweEJFQ0RGRkZGLCAweDE3MTcxNzE3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYzMDZCQjA2LCAweDM0NjMwNjM0LCAweEI2QUFGRkZGLCAweERDRDhEOEQ4LCAweDlEQjlCOUNFLCAweERCOURCRkRCLCAweDY1MjhCRUFELCAweDU0NTQ1NDU0LCAweDZFNzZCNEQ3LCAweEU3NkU2RUM3LCAweDY1MjhDNkVGLCAweDM1MTUzNTM1LCAweDkwMTlCRDA0LCAweDAxOUMyMTAxLCAweEI2OEFGRkZGLCAweDI3MjcwNzI3LCAweDYzNDZCRjE2LCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweERDRENEQ0RDLCAweDFEQjFCNEQ2LCAweEJCMURCMUQ3LCAweDY1MjlBNjJBLCAweDU0NTQ1NDU0LCAweDQ5RENBNENGLCAweDg1QzdFMzlFLCAweDY1MjhENzExLCAweDM1MzUzNTM1LCAweDUwMTVFOTAwLCAweDAxRDAxNTAxLCAweEI2ODlGRkZFLCAweDA3MDcwNzA3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAKKwkJMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2REI2RkYwNSwgMHgxQjZEQjZEQiwgMHhERjVCRkZGRiwgMHg0MDAwMDAwMCwgMHg2MkI2QkYwNiwgMHgyNEMyNjgzNSwgMHg1NEU4RkZGRSwgMHhGNUQ2NTg3MCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg2RDg4QTY2QSwgMHhCQUFBODIwOSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4RTA4OTY0OSwgMHhERkY3REZGQywgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4RTA5OTYyOCwgMHgyQTBBMEEwOCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg5NjI4OUU0OSwgMHg3NUZGRjVCRiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg5RTI4OUU0OSwgMHhGN0FCRUZBQSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg5RTA5QTY0OSwgMHg2QTYyRTJDOCwgMHg5MTA5QkYwMCwgMHhDODlDQzkwQywgMHg2RDA2RjdCRCwgMHgyNzM3MzcxNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2QTM2QzYwOCwgMHgyQjYyQjZBMywgMHg2RDA5RkZERiwgMHg3MDcwNjA0MCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4NUE5RDcwRiwgMHhFRkFCQTkwOSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg5RTI4QjZBQiwgMHg1RERGNzc3QywgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg5RTI4QTY0OSwgMHg3RkZFRUVFQSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg5NjI4OUU0OSwgMHhENzdFN0VFRSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3REM4QTY0OSwgMHgwQTBBMkE2QSwgMHg5Q0M5QkYwMywgMHg4NDk0NDlENCwgMHg1Q0U3RkZEOSwgMHg1RURFOTczNywgMHg2REI2RkYwNCwgMHhEQjBEQjZEQiwgMHhFRkJERkZGRiwgMHgwMTAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2N0I2MzgwMCwgMHgyMDZBMzY3QiwgMHhCRUFDRkZGRiwgMHg0MDQwQzBDMCwgMHhFNkQ5N0VEMywgMHg2REM2REQ2RCwgMHgwQkQ1Q0VFRSwgMHg2MDYwNjA0MCwgMHg5M0NGQkRENywgMHgzQ0YzQ0ZFNywgMHgwMzk2MDM5NywgMHg4ODg4OEE4OCwgMHgzQTkzMjdENCwgMHgyOTNFOTNDOSwgMHgyNDEyQzZFRSwgMHgwMjAzMDMwMSwgMHgwREIxMDUwMSwgMHhEQjZEQjBEQiwgMHhFRkJCRkZGRiwgMHgwMDAwMDIwMSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MUI2MUMwMywgMHgzQjY5QjY1QiwgMHhDNkYxRkZGRiwgMHg0MEMwQzAwMCwgMHg2NjkxNDdENCwgMHg0OTU0RDU0OSwgMHgxM0Y1QzZFRSwgMHg2MDQwNDBDMCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHhBODg4OEE4OCwgMHhCOEFBN0NEMSwgMHgyRENDRTM4QSwgMHgwMzk2QzZFRSwgMHgwMzAxMDkwOSwgMHgyN0I0NTYwMSwgMHgyMDBBMzI3OCwgMHhCNkFCRkZGRiwgMHg2MjQyNDNDMywgMHhGOTE5OThEMiwgMHg3NUM3MUQ3NSwgMHgwQkI2Q0YwRiwgMHg3MDcwNjA2MCwgMHg5M0NGQkRENywgMHgzQ0YzQ0ZFNywgMHgwMzk2MDM5NywgMHg4ODg4OEE4OCwgMHgzODlBMzdEMSwgMHgyOTNFOTNBOSwgMHgyQzMzQzZFRSwgMHgwMzAzMDEwMSwgMHg2N0IyNUUwMCwgMHgyMDBBMzA5QiwgMHhCRUFCRkZGRiwgMHg2MDQwNDI0MiwgMHhENzFGOTlDRCwgMHg3MUI3MUM3MSwgMHgwMzk2Q0VFRiwgMHg3MDcwNjA2MCwgMHhGRTc5QkRERCwgMHgyNzkyNzlFNCwgMHgwMzk3MDNCNiwgMHhENzU1Nzc1NSwgMHgxQjI3QTNDRiwgMHhCMTlCMTlBRSwgMHgzNDcwRDcxMiwgMHg0MjQzQzM4MSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk3MDNCNywgMHg1NTVENTdERCwgMHhDOTdDQTJENCwgMHhGM0NCMEM5MCwgMHgwM0I1Q0YwRiwgMHgwOTA5MEQwRCwgMHhGNENEMUVDRSwgMHgwQjc0QkYwRiwgMHhCNjg5RDczMywgMHgyNzM2M0QzRiwgMHg5QkI3QjREMywgMHhENzdCQTlCQSwgMHgwMzk3OTYwRSwgMHg1NzU2NTQ1NCwgMHg0QkU0QTBENSwgMHg5RTQ4NjQ5RSwgMHgwMzk2Q0YwRiwgMHgyNTI1MzUzNSwgMHg5MDE5Q0QwMCwgMHg0OUQwMTUwMSwgMHhCRUNDRkZGRiwgMHhGNTA1MDUyNywgMHg2REI2MkEyOSwgMHgwNDFEQjZEQiwgMHhDRjEyRkZGRiwgMHg1NTAwMDAwMCwgMHg2REI2MkEyOSwgMHgwNDFEQjZEQiwgMHhDRjEyRkZGRiwgMHg1NTAwMDAwMCwgMHg2REI2MjkwQiwgMHhDMDlEQjZEQiwgMHhDRjEyRkZGRiwgMHgzNTAwMDAwMCwgMHg2REI2MEQwMywgMHgzQjY1QjYxQiwgMHhENzM0RkZGRiwgMHg0MEMwODAwMCwgMHg5Njk5M0VERCwgMHg2OTY2OUU2OSwgMHgyQzMzQzZDRSwgMHg0MDQwQzA4MCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHg4ODg4OEE4OCwgMHhCNkZCOTlEMCwgMHhFRjRDRkI4RiwgMHgwQkI1Q0VFRiwgMHgwOTA5MDkwRCwgMHg0REIxNEYxMywgMHhEQjBEQjJEQiwgMHhCRUNERkZGRiwgMHgwMzAzMDEwMSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMzE4NTIwMCwgMHgwMDAwMDAwMCwgMHhCNkFCRkZGRiwgMHgwMDAwODA1RSwgMHgwMjZEODkwNiwgMHhEQjZEODY0MCwgMHhCNkFBRkZGRiwgMHgwMDAwRkU1NSwgMHg3NDkyMTBEMSwgMHg0OTk0MTk0OSwgMHg4NUE1RDczMiwgMHhDOEM4Q0E0MiwgMHg5M0NGQkRENywgMHhFNzkzQ0ZFNywgMHg1RDA4NjUyOSwgMHhGRkFBQUE4MCwgMHhDRDBEQUJENCwgMHhCN0NCN0RCNCwgMHg2NTI3Q0VGMCwgMHgwRDBEMEQwRCwgMHhGNkNGMjBFRSwgMHg2RkU2Q0U1MywgMHhCNjg5RDczNCwgMHgzRDExMzkzMSwgMHgxREIxQjZENCwgMHhEQjFEQjFEQiwgMHg1RDI4OUUwQSwgMHg1NDU0NTQ1NCwgMHg0ODY0QTlEMCwgMHg4NjQ4NjQ4NiwgMHg1RDI4Q0VFRiwgMHgzNTM1MzUzNSwgMHg5MDE5QkQwMywgMHg0QTFDOTkwMSwgMHhCNjg5RkZERSwgMHhGNzI3MjcyNywgMHg2MzQ2QzAxNiwgMHgzNTIzNDYzNCwgMHhCRUFCRkZGRiwgMHhEN0Q4RDhEOCwgMHg5RkY5QkFERCwgMHhGQzlGRjlGRiwgMHg1RDI5QTY2QSwgMHg1NDU0NTQ1NCwgMHhEQTZEQUNENiwgMHhBNkRDNjVBNiwgMHg1RDA4Q0VFRiwgMHgzNTM1MzUzNSwgMHhBMjY4MDVDQywgMHhEQTJFNjhFNiwgMHhCNjhBRUZCQSwgMHg3Nzg3MDc4NywgMHhGNkQ5ODREMywgMHg2REQ2REQ2RCwgMHg2NTI3REYzMCwgMHg3MDYyNjI2MiwgMHg5M0NGQkRENywgMHgzQ0YzQ0ZFNywgMHg1RDA5NjUyOCwgMHhCRkFBQUEwOCwgMHgxRDI5QThENCwgMHhCMjFCNjFEMiwgMHg5NUU3RDczMywgMHg4MzgxODFDMSwgMHg3RkZGQjlEQiwgMHhGQjlERjlGRiwgMHg1RDA4NkQ0OSwgMHhGQ0ZFRkVGQiwgMHhDQjBEQUFENCwgMHg5RjRCN0RCNCwgMHg2NTI4Q0VGMCwgMHgwNTA1MEQwRCwgMHhENTBFMDdEMCwgMHgxN0M1MEM1MCwgMHhCNkE5REY1NywgMHg5RDk5OTk5MSwgMHhFQkJFQjlDOSwgMHhCQkVCQkVCNCwgMHg2NTI5QzZDRSwgMHg1NDU0NTQ1NCwgMHhFM0Y2QjVENCwgMHgyNkUzRjYzRSwgMHg2NTI5QzZDRCwgMHgxNTE1MTUxNSwgMHgxQzIxQzAxMiwgMHhEQTFDMjFDMiwgMHhCNkFBRkZGRiwgMHgyNzM3MjcyNywgMHg2MzQ2QzAxQiwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEOEQ4RENEOCwgMHgxREIxQjdEMSwgMHhEQjFEQjFEQiwgMHg2NTI4QTY0QiwgMHg1NDU0NTQ1NCwgMHg1QTY0QTlEMywgMHhBNjRBNkNBNiwgMHg2NTI4Q0YxMCwgMHgzNTM1MzUzNSwgMHhCNUNBNENENywgMHg1QkE1Q0E1QywgMHhCNjg5Q0YxMSwgMHgxNjM0MTYxNCwgMHhEQjdEQjdDQSwgMHhCNERCN0RCNywgMHg2NTI5QzZFRiwgMHg1NDU0NTQ1NCwgMHhDMzY0QThEMywgMHgzMkMzNjQzMiwgMHg2NTI5QTY0OSwgMHgxNTE1MTUxNSwgMHg5QzI5QkQxRiwgMHg0RTlDMjlDMiwgMHhCRUNDRkZGRiwgMHhENzE3MTcxNywgMHg2REI2MzkzOCwgMHgwNDlEQjZEQiwgMHhDRjExRkZGRiwgMHg1NTAwMDAwMCwgMHg2REI2MzkzOCwgMHgwNDlEQjZEQiwgMHhDRjExRkZGRiwgMHg1NTAwMDAwMCwgMHg2REI2MzkzOCwgMHgwNDlEQjZEQiwgMHhDRjExRkZGRiwgMHg1NTAwMDAwMCwgMHgwMzQ2QjYwMCwgMHgzNUIzMDAzNCwgMHhCNjhBRkZGRiwgMHhERkQ4RDhEOCwgMHg5REI5QjlDRSwgMHhEQjlEQkZEQiwgMHg2NTI4QkVBRCwgMHg1NDU0NTQ1NCwgMHg2RTc2QjRENywgMHhFNzZFNkVDNywgMHg1RDA4QzZFRiwgMHgzNTM1MzUzNSwgMHg5MDE5QkUwMiwgMHg2QTEwMjEwMSwgMHhCNjhBRkZGRiwgMHhGNzI3MDcyNywgMHg2MzQ2QkUxOCwgMHgzNUEzNDYzNCwgMHhCRUFCRkZGRiwgMHhEN0RDRENEQywgMHgxREIxQjRENiwgMHhENzFEQjFENywgMHg1RDI5QTYyQSwgMHg1NDU0NTQ1NCwgMHg0OURDQTRDRiwgMHg4NUM3RTM5RSwgMHg2NTI4RDcxMSwgMHgzNTM1MzUzNSwgMHg1MDE1RTkwMCwgMHgwMUQwMTUwMSwgMHhCNjg5RkZGRSwgMHgwNzA3MDcwNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgCisJCTB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjYzNkJGMDAsIDB4MjY4MzUwMjgsIDB4NENFOEZGRkYsIDB4RDY1ODcwNDAsIDB4OTI0OUJGRTMsIDB4MjQ5MjQ5MjQsIDB4NUQwOTg2MDgsIDB4MDIwODAzMDksIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4ODYwODg2MjgsIDB4NzdEREY1RjcsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4ODYwODhFMjgsIDB4RUZBRkFCQUUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OEUyODk2MDgsIDB4RUZGRkZCRkYsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OEUyODlFMjksIDB4RkZFRkFGQUIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OTYyOEE2NEEsIDB4QjVGN0ZERkYsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OERDOEFFNkIsIDB4Nzg2ODYyRUEsIDB4OTAwOUJDMDAsIDB4MDE5MDIxMDIsIDB4NkQyOUZGRkYsIDB4MEQwNTA1MjUsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjJGNkMwMDAsIDB4MjQwMzQwMzQsIDB4NkQyOUZGRkYsIDB4RDg1ODUwNTAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OUUyOUFFNEMsIDB4NThFMkMyODEsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OTYyOEE2NDksIDB4RkZFRUVFRUEsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OTYyOTlFNDgsIDB4Nzc3RUZGRkEsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OTYyODlFMjksIDB4NTU1Nzc3N0UsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4OEUwOEFFNkEsIDB4ODUyRjg3MEYsIDB4NzNGN0I4REIsIDB4RkY3REY3RkYsIDB4NUQwNkRGMzEsIDB4QzI2MjcwNzgsIDB4NEQ4MkMzMDEsIDB4REExRDkxQzAsIDB4NUQwQUZGRkYsIDB4MDUwRDAxMDMsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjIzNjRBMDAsIDB4QTAwMjAwMjAsIDB4QjZBQkZGRkYsIDB4NDA0MDQwNDAsIDB4NTlBNkFBRDAsIDB4OUUxOUU2OUUsIDB4MEJCNUNGMEYsIDB4NjA3MDcwNzAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4ODg4ODhBODgsIDB4NDI5MzNFRDQsIDB4NkQyNEEyNjksIDB4MEJCNUM2RUYsIDB4QjUwOTAzMDIsIDB4QjNDRjAwREIsIDB4NEQyNDkyOEQsIDB4OTVFOEY3RDgsIDB4RjVBQUZGMkEsIDB4NDAwMEMyMDAsIDB4MjQ5NzQ5QzksIDB4QkVDQ0ZGRkYsIDB4N0Q1NzM1MDIsIDB4NjVCNjhFMDAsIDB4QTExODMyNjMsIDB4QjY4QUZGRkUsIDB4NkQ0MzQwQzAsIDB4Njk2MUEzRDIsIDB4OTY0OTY1OTYsIDB4MDM5NkM2RUYsIDB4NzA3MDYwNjAsIDB4RkU3OUJEREMsIDB4Mjc5Mjc5M0MsIDB4MDM5NzAzQjYsIDB4RDc1NTc3NTUsIDB4NEM5QjNEREUsIDB4MkQ0MkQzRUQsIDB4M0M5MEM2RUYsIDB4MDIwMzAzMDEsIDB4MDgwMDlDMDAsIDB4MkIwMkIwQTgsIDB4QkVBQkZGRkYsIDB4NTA3MDcwNjIsIDB4NUJBREIzQ0QsIDB4QjdEQkI1QkIsIDB4MDM5NkNGMTEsIDB4NTg1ODUwNzAsIDB4Qzk2NUFBRDQsIDB4MzJDRDY1RDIsIDB4MDM5NzJDMzMsIDB4MTU5NTU1NTUsIDB4M0VEMzAwRTMsIDB4MzUyMkQzRUQsIDB4OUUyOEVGQjgsIDB4M0IzQkI5QjksIDB4NjgzNkFFMEMsIDB4MkI2QUI2QTMsIDB4QkVBQkZGRkYsIDB4NTA3MDcwNzAsIDB4RUM3NkI2RDMsIDB4REJFRDhFRDgsIDB4MDM5NkNFRjEsIDB4NTg1ODUwNTAsIDB4REI2NUE3RDksIDB4MzY1MzZDRjIsIDB4MDM5NzU0RjAsIDB4MTU5NUQ1NTUsIDB4Nzk2MUE4RDAsIDB4OUE0OTY1QjYsIDB4MTNENUQ3MTAsIDB4NzA2MDYwNDIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4QTg4ODhBODgsIDB4MjQxMjAwQ0IsIDB4MUZENTJCMDksIDB4MjQxNERGNTAsIDB4NjNFMTA5MDksIDB4NDkyREE1RDQsIDB4OTI0M0JFRDIsIDB4MEJCNUNGMTAsIDB4NTVGRjAwMDAsIDB4N0RCMUI2RDYsIDB4REI2REI3REIsIDB4MDM5NzI0MzQsIDB4NTU1NzU3NTQsIDB4NDlBQzlCRDgsIDB4OTI0QTc0OUYsIDB4MEJCNkU3NkUsIDB4NTVGNTI1MjUsIDB4REZGRUIxRDcsIDB4QkFFMjQ5RDYsIDB4MEJENUNGMEYsIDB4NTVGRjAwMDAsIDB4NUZGRkIxRDgsIDB4QkFFMjQ5RDcsIDB4MEJENUNGMEYsIDB4NTVGRjAwMDAsIDB4NERCNkE5RDUsIDB4MzJDM0ZGQjIsIDB4MEJCNENFRUYsIDB4RDVCQjAwMDAsIDB4MjMxMjAwRDIsIDB4MzAyMzEyMkMsIDB4QkVBQkU3OUEsIDB4MUYxOTFBMTcsIDB4NjVCNjRBMDcsIDB4M0I2OUI2N0IsIDB4QkVDREZGRkYsIDB4NjA0MDQwQzAsIDB4NjZEMTg1Q0UsIDB4NERCNkQ1NTEsIDB4MEJCNkM2RUYsIDB4NzA2MDYwNDAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4QTg4ODhBODgsIDB4Mzg5QTM5RDEsIDB4MjkzRTkzQTksIDB4MjQzM0M2RUUsIDB4MDMwMzAxMDEsIDB4M0RCMTBBMDEsIDB4REI2REIwREIsIDB4REY3N0ZGRkYsIDB4MDAwMjAyMDEsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTQ5OTEzRDIsIDB4NDk5NDk5NDksIDB4QTY0OUQ3MzMsIDB4NEM0ODRDNEMsIDB4OTNDRkJERDcsIDB4RTc5M0NGRTcsIDB4NUQwODVEMjksIDB4NTVGNzc3QkUsIDB4REI4RUIwREIsIDB4RDhEQjhFRDgsIDB4NUQwN0NGMTIsIDB4MEQwRDBEMEQsIDB4REI3NkFFRDMsIDB4QjZGM0ZGQjYsIDB4NjUwN0NGMTAsIDB4NTdGRTAwMDAsIDB4NThFNTlDRDQsIDB4OEU0OTE5NzIsIDB4NUQwODlFMEEsIDB4NTU1NzU0NTQsIDB4QzlFNEEzRDcsIDB4OTJDM0U0QTYsIDB4NUQwOEM2RUUsIDB4NTVGNTM1MzUsIDB4NUZGRUIyRDksIDB4REI2MjQ5RDcsIDB4NjUyN0RGMzIsIDB4NTVGRjAwODgsIDB4REJCNkFGRDUsIDB4QjZEMjQ5QjYsIDB4NjUyN0Q3MzEsIDB4NTVGRjAwMDgsIDB4RDZEQzk2RDEsIDB4NkRCNkQ5NkQsIDB4NUQwOUE2NkEsIDB4NTU1NzU0NTQsIDB4MzZEQjAwRkQsIDB4MzUzQjFCNkQsIDB4NUQwOEU3NzIsIDB4MzU5NUI1QjUsIDB4MjREMjA4RTMsIDB4NDk5NkRENDksIDB4NkQ0N0Q3MzEsIDB4NTRGRTAwODgsIDB4REJBREFBRDcsIDB4QjZEOUNGQkEsIDB4NUQwOENGMTAsIDB4NTU1RjcwNzAsIDB4NUQ2REFGRDcsIDB4QkFEMzZERjcsIDB4NUQwOTY1MjksIDB4NTUzNTM3QkYsIDB4NjkxRTk3RDYsIDB4OEU0RjY5OEUsIDB4NUQyN0Q3MTEsIDB4NTVGRjAyMDIsIDB4RkI2RUFBREIsIDB4QjZEQjY5QjYsIDB4NUQwOTc1ODgsIDB4NTU1Njc0NTQsIDB4Q0JFREE4RDcsIDB4QTZDQkVEOUUsIDB4NUQyOEQ3MzIsIDB4MzUyNTI1MjUsIDB4QjE0QjFCQ0IsIDB4NTNBMTdBMTQsIDB4QUU4OENGMTAsIDB4MzYxRjFGMzcsIDB4RUJCRUI5QzksIDB4QkJFQkJFQjQsIDB4NUQyOUM2Q0UsIDB4NTQ1NDU0NTQsIDB4RTNGNkI1RDQsIDB4MjZFM0Y2M0UsIDB4NjUyOUM2Q0QsIDB4MTUxNTE1MTUsIDB4MUMyMUMwMTIsIDB4REExQzIxQzIsIDB4QjY4QUZGRkYsIDB4MjcyNzI3MjcsIDB4NjM0NkMwMUIsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RDhEOERDRDgsIDB4MURCMUI3RDEsIDB4REIxREIxREIsIDB4NUQwOEE2NEIsIDB4NTQ1NDU0NTQsIDB4MzZEQTAzRjIsIDB4MzUzQjVBNkQsIDB4NUQwOERGNTIsIDB4MzVCNUI1MzUsIDB4NTlBREE4RDcsIDB4QjI5RkI5QjYsIDB4NjUyOENGMTEsIDB4NTVGRjAwMDAsIDB4QzkyQ0EyRDMsIDB4OTI0OTI5OTIsIDB4NUQyOEM2RUUsIDB4NTU1NzU0NTQsIDB4NEQyNDk5REEsIDB4OTI0MzI0RjIsIDB4NUQwOUE2NDksIDB4NTU5NTE1MTUsIDB4REZBREFFRDUsIDB4QjZERTc5QjYsIDB4NjUyN0Q3MzEsIDB4NTVGRjAwMjAsIDB4REZGRkIxRDcsIDB4QkFFMjQ5QjYsIDB4NjUyN0RGNTEsIDB4NTVGRjAwOEEsIDB4REZGRkIxRDcsIDB4QkFFMjQ5QjYsIDB4NUQyN0Q3MzEsIDB4NTVGRjAwODgsIDB4MjQ5MjA4RDIsIDB4MjYyQjFBMDgsIDB4NzU2N0Q3MzEsIDB4MDVBRjAwQTIsIDB4NDk2REExRDYsIDB4OTIxREI3OTIsIDB4NjUyN0RGMzIsIDB4NTVGRjAwMjIsIDB4NTZEQzlCQ0YsIDB4NzFCNkU3NkUsIDB4NUQwOEJFQUMsIDB4NTU1NzU0NTQsIDB4NEI2NEEyRDMsIDB4OTI0M0E0QkEsIDB4NUQwOEM2Q0UsIDB4NTVENTM1MzUsIDB4NUZGRUIyRDksIDB4REI2MjQ5RDcsIDB4NjUyN0RGMzIsIDB4NTVGRjAwODgsIDB4REI3NkIwRDAsIDB4QjJEQkIxQjYsIDB4NUQwOENGMTAsIDB4NTU1RkMwMDAsIDB4NkRCMUI5RDAsIDB4REI2REJFREIsIDB4NUQwOThEQzksIDB4NTU1NTU1NTQsIDB4Q0E2REFBRDYsIDB4QjREQkI1ODYsIDB4NjUyOEQ3MzEsIDB4MEQyNTI1MzUsIDB4NTAxMUJFMDAsIDB4MDAzMDE1MDEsIDB4QkVBQkZGRkYsIDB4MEQwRDA1MDUsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIAorCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYxQjZDMDAwLCAweDM1MDI4NjYzLCAweDQ0RTlGN0RGLCAweDU4NjBDMDAwLCAweEM2RDk3RkQ4LCAweDZEQjZEQjZELCAweDRDQzk3NUU4LCAweDBBMEIyREJELCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDc1RTg3RTA4LCAweEFCQUVBQTBCLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDdFMDg4NjA5LCAweEZEQjVBRkFGLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDg2MDg4RTI4LCAweDc1RjVCREZGLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDg2MDg4RTI4LCAweEJCQUZCQUE4LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDhFMDg5NjI5LCAweEJGQUZBRjJBLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDk2MjlENkVGLCAweEMzRURGNUQ1LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDY1MDdBRTZBLCAweDdFRjhFOEUwLCAweDFEOTlCQzAwLCAweDAwNUQ4NUQ5LCAweDVDQzhGRkZGLCAweDAxMDkwOTBELCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweEUyNTZCRjAwLCAweDI2MDI1RTI1LCAweDY1MDdGRkZFLCAweEQ2RDREQ0RDLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDk2MDhBNjZCLCAweEZERkRFRkZBLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDk2MjhBNjQ5LCAweDU1Nzc1N0ZGLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDhFMjg5NjI5LCAweEU4ODAwMDAwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDhFMDk5NjI4LCAweDdFRUFFOEEwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDg2MDhBRTZBLCAweEI3QkRBNzI3LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDlFMDlDRUYwLCAweEFGOEY4QjQzLCAweDlDQTlDMDBCLCAweDY0OTE0OUNDLCAweDY1NDlGRkZGLCAweDU3OTcxNTM1LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYyMzYyNzAwLCAweDAwMDAwMDYwLCAweEJFQ0VGRkZGLCAweDAwODBDMDQwLCAweDU0OTMxNEQ2LCAweDRBOTQ5RTY5LCAweDJDMzNDNkVFLCAweDA4MDBDMDQwLCAweEM2REI5OUQwLCAweDlCQzZFNzZELCAweDAzOTdDNkVDLCAweDc4NTc1NTU1LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweDg4ODg4QTg4LCAweDczRjdCOERCLCAweEZGN0RGN0ZGLCAweDAzOTcwQkI2LCAweDU3NTU3NTNELCAweERCOEVBN0Q5LCAweEIyREYyQzNFLCAweDAzOTZDNkNFLCAweDU1NTUxNTBCLCAweDJBNUEyQUNGLCAweDQxMzQ5MzkwLCAweDVEMEFENzJGLCAweDg5ODIyMEE4LCAweEVERjZCNkQzLCAweEQ4RUQ4RUQ4LCAweDAzOTZENzExLCAweDU4NTg1ODUwLCAweENCNjVBNkQ4LCAweDMyQzM2NUYyLCAweDAzOTc1NEYwLCAweDE1OTVENTU1LCAweDk1NERCRjAwLCAweDBDOTEwOTEwLCAweEJFQUJGN0RELCAweDFGMUY5RDlELCAweDBBODZEQzAwLCAweEIwMDJDMEFDLCAweEI2ODlGRkZGLCAweEQ4RDhEOEQwLCAweEVCQkVCNEQ0LCAweEQ3RUQ0RURCLCAweDAzOTZDRjExLCAweDU0NUM1QzU4LCAweEMzNjVBNERBLCAweDM2QzM2NTMyLCAweDAzOTdBRTZCLCAweDE1OTU5NUQ1LCAweDkwQzlDMDAyLCAweENBOUM4OUNDLCAweEJFQUJGRkZGLCAweDM3MzcxNzFGLCAweDYyQzZDMDAxLCAweDMxMDMwMDJDLCAweEI2QUFGRkZGLCAweERDRDhEOEQ4LCAweERCNERCM0NFLCAweEI3NkI3REI3LCAweDAzOTZDNkYwLCAweDU0NTQ1QzVDLCAweDQzMjRBM0Q2LCAweERBNEY2NDM2LCAweDAzOTdBRTZCLCAweDE1MTU5NTk1LCAweDVCRURCNENGLCAweEJCREJCNUE3LCAweDAzQjZENzMyLCAweDU4NTA1MDcwLCAweDM3MUM5QkQzLCAweDJFM0IxQzhFLCAweDAzOTcwQkQ2LCAweDE1OTU1NTU1LCAweDIyQjJDMjBELCAweEIwMjMzMDJGLCAweDBCQjZGRkZELCAweDUyNzI2MjcyLCAweDQ5MjRBM0Q2LCAweEE3RTkyQzkyLCAweDAzOTcyNDE0LCAweDYwNTU1NTU1LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweEE4ODg4QTg4LCAweDQ5MjRBN0QxLCAweEZGRDkyNDkyLCAweDAzOTcyNDE0LCAweDAxNTU1NTU1LCAweERCNkRBRUQ4LCAweDI0OUI2REJBLCAweDAzOTcxQzE0LCAweDAwNTU1NTU1LCAweERCNkRBRUQ4LCAweDI0OUI2REJBLCAweDAzOTcxQzE0LCAweDAwNTU1NTU1LCAweEMzMjRBM0Q4LCAweEZGRTMyQzMyLCAweDAzOTc5RTJDLCAweDM3MTU5NTk1LCAweDlDQzlDMDBGLCAweEMyOUMyOUM4LCAweEJFQUJGRkZGLCAweDM3MzczNzFGLCAweDY4MzY5ODA5LCAweDJCNjIzNjgzLCAweEI2QUFGRkZGLCAweDcwNzA2MDYwLCAweDVCRUVCNENFLCAweEI0REJCNUJGLCAweDBCQjZDRUYwLCAweDU4NTA1MDcwLCAweDQ5MjRBOEQwLCAweEYyNEQyNEIyLCAweDAzOTcyNDM0LCAweDE1OTVENTU1LCAweDNFOTMwMEUwLCAweDMxMjMxMkVELCAweDlFMjhGN0Q5LCAweDNCQkJCOUY5LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDk0OTkxM0QyLCAweDQ5OTQ5OTQ5LCAweEE2NDlENzMzLCAweDRDNEM0ODRDLCAweDkzQ0ZCREQ3LCAweEU3OTNDRkU3LCAweDU0RTg1RDA5LCAweEVGRUFBQTg4LCAweEVEOEVCMURDLCAweEQ4RUQ4RUQ4LCAweDU0RTdDRjExLCAweDBEMEQwRDBELCAweEZCNkZBRkQ2LCAweEU3OUI2RkI2LCAweDU1MDg4NUE5LCAweERDNTQ1NDU0LCAweERCNjVCMENGLCAweDk2RkIyQ0IyLCAweDU0RTk1RDA4LCAweEVDRUFBRTgwLCAweDZEQjZCNERDLCAweDI3NkRCNkRCLCAweDU0RTg2NTI5LCAweDNGRkZGRkVGLCAweERCNjVCMENGLCAweDNDRkIyQ0IyLCAweDU0RTk2NTI4LCAweDgwRkZGRkZCLCAweERCNjVCMENGLCAweDNDRkIyQ0IyLCAweDU0RTg2NTI5LCAweDAwRkZGRkJGLCAweDZEQjZCM0RBLCAweERCMURBRURCLCAweDU0RTk1RDI4LCAweEZFRkZGRkVFLCAweDlEMDlDMDJELCAweDEwOUNDOUQwLCAweDU0RThGRkZELCAweEI1MzUzNTM1LCAweEUyNjZDNDMzLCAweEI2ODI2NjI2LCAweDU0RThGN0RELCAweDVFNUM1QzVDLCAweDZEQjZCM0RCLCAweERCOURCNkRCLCAweDU0RTg1RDI5LCAweEY4RkZGRkVFLCAweERCNkRCMUQxLCAweEY2REI2REI2LCAweDU0RTk1RDA4LCAweDNCQUVBQTg4LCAweEM5NjVCMENFLCAweDNDRjk2NUIyLCAweDU0RTg2NTI5LCAweDAwRkZGRkVGLCAweDZEQjZCM0RBLCAweERCOURBRURCLCAweDU0RTg1RDI5LCAweEY4RkZCRkVGLCAweDQ5RTRBOUNGLCAweEJBNDg2NEJFLCAweDVEMDhDRUVGLCAweDE1MzUzNTM1LCAweEE1OEI0QURBLCAweDVCMjVCQTdCLCAweEI2ODlERjM0LCAweDk0QjYxNjk2LCAweEVCQkVCOUM5LCAweEJCRUJCRUI0LCAweDVEMDlDNkNFLCAweDU0NTQ1NDU0LCAweEUzRjZCNUQ0LCAweDI2RTNGNjNFLCAweDU0RThCRUFELCAweDE1MzUzNTM1LCAweDFDMjFDMDEyLCAweERBMUMyMUMyLCAweEI2QUFGRkZGLCAweDI3MzcyNzI3LCAweDYzNDZDMDFCLCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweEQ4RDhEQ0Q4LCAweDFEQjFCN0QxLCAweERCMURCMURCLCAweDU1MDhBNjRCLCAweDU0NTQ1NDU0LCAweEEzNTIwMEU5LCAweEY1QTM1MjM1LCAweDU1MDhGRkZFLCAweEI1MzUzNTM1LCAweDE5MjdBMUQ0LCAweEQ3MTkyNzkyLCAweDU0RTg2RDZBLCAweEE4NzQ3NDdDLCAweDZEQjZCNERDLCAweEQ4OURCNkRCLCAweDU0RTg2NTI5LCAweEZDRkZGRkVGLCAweEVEQUVCMURBLCAweDM3NkRBRUJBLCAweDU0RTg1RDI5LCAweEJGRkZGRkVFLCAweEM5NjVCMENFLCAweDNDRjk2NUIyLCAweDU0RTk2NTI4LCAweDAwRkZGRkZCLCAweERCNjVCMENGLCAweDNDRkIyQ0IyLCAweDU0RTk2NTI4LCAweDAwRkZGRkVGLCAweERCNjVCMENGLCAweDNDRkIyQ0IyLCAweDU0RTk2NTI4LCAweDA4RkZGRkZCLCAweDEwMjFCRDAwLCAweDZFMTFBOTAyLCAweDU0RTdGRkZELCAweEFEMEQwRDBELCAweDk2RDk5OUQxLCAweEI2OTZEOTcxLCAweDU1MDg3RDhCLCAweEE4NTQ1NDU0LCAweEM5MjRBNUQwLCAweDkyNzhFNDkxLCAweDU0RTk2RDQ4LCAweDVDRjc3N0ZGLCAweERCNzVCMEQ4LCAweDNFREJBRUJBLCAweDU0RTk1RDA4LCAweDJGRUFBRTgwLCAweEM5NjVCMENFLCAweDNDRjk2NUIyLCAweDU0RTk1RDI4LCAweDg4RkZGRkVFLCAweDVCNkRCMUNGLCAweDk3RkI2RDk2LCAweDU0RTk2NTA4LCAweEYwRkZCQkVFLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDU0RTg1RDA5LCAweEJCRUVBQTgwLCAweERDRTU5MkNELCAweDZFMzZFMzI5LCAweDZENDhERjUxLCAweDI1OEQ4MTg5LCAweDJEQjM3QjA0LCAweEMwMURCNERCLCAweEI2QUJGRkZGLCAweDBEMDkwMzAxLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAKKwkJMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2REI2QUUwMCwgMHgyODY2MzYxQiwgMHgzNDg4RkZGRiwgMHg2MEMwMDAwMCwgMHhENkUxMDBGQiwgMHg2REI0RDM2OSwgMHgzQ0M3QkYxMywgMHhGREZERjVENCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg2REE5NzYwOCwgMHhBQThBQUIyOSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3NjA4N0RFOCwgMHhFQkJFRkJGQiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3NUU3OEUyQSwgMHgwQkVGRkZCRiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4NjA4QTY0QiwgMHhBQTBCRDU1NSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg2RDg4OUU0QSwgMHg3RTAwMDBBQSwgMHg0OTI0QTBENiwgMHgzNjQ5MjQ5MiwgMHg1NEU4QUU2QSwgMHg1N0ZBODAwQSwgMHg5MjQ5QzAwRSwgMHhEOTM5NDkyNCwgMHg1RDA4RjdCOCwgMHgyRDU1NTdGQSwgMHg5MjQ5QzEwQywgMHhEQjZEODI0RSwgMHg2NTA5RkZGRiwgMHgwMDBCRDU1NSwgMHgwMDAxNkQwMCwgMHgwMDAwMDAwMCwgMHg1NEM5RkZGRiwgMHgwMDAwMDAwMSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHhBMjY4QzAwMCwgMHgzMDYyNjgyNiwgMHg1Q0U4RjdERSwgMHg1ODU2RDZENiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3NTY4OTYyOCwgMHgyRDBCMDIwMiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4RTA4OTYyOSwgMHhGRUFBQTg4MCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4RTA5OTYyOCwgMHhGRkZFRUVBOCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4RTA4OEUyOSwgMHhGRUVBRUJGRSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4NjA4OTYyOSwgMHg3NzVGRkYzRSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg4RTA3QzZBRiwgMHhGREJGQkUyRiwgMHg0MzFDOUNENCwgMHg5MUM3MjM4RSwgMHg0NEM3QUU4RCwgMHhFMEUwNzg3OCwgMHgzRDgwQkUwNSwgMHhDMTFEODVEQiwgMHg0NEM5RkZGRiwgMHgwRDA5MDMwMiwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMzEwQkEwMCwgMHhEODY0MzA2OCwgMHhCRUNDRkZGRiwgMHgwMEMwNTg1NCwgMHgyNjkyMDBEMiwgMHhCRjk0RUU0MSwgMHg5NjI2RjdCOSwgMHhGOEZGQUI3QSwgMHgyNkRDNTdDQiwgMHhCN0Y0OTI0OSwgMHgyQzMzQzZDRSwgMHgwMDAwMDA1NywgMHg1NkREOTNEMywgMHhBRTFEMUI5RiwgMHgwMzk2QzZFRiwgMHg4MEMwNzg1NSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHhBODA4OEE4OCwgMHhDOTNEQTBENywgMHg5MEM5MEM5MCwgMHgwQkI1RDczMSwgMHgwOTA5MDkwOSwgMHhEQjREQjRDRiwgMHhCNzZCNEVCNywgMHgwMzk2QzZGMCwgMHg1NDU0NUM1QywgMHg0MzI0QTNEMywgMHhEQTRGMjQzMiwgMHgwMzk3QjY4QiwgMHgxNTE1OTU5NSwgMHg5MDg5QzQwMCwgMHgwMjFDQTkwQSwgMHhCRUFCRkZGRSwgMHgyNzI3MzcxRiwgMHg2MzU2QkYwMSwgMHgyNTgyNTYzNSwgMHhCRUFCRkZGRSwgMHhENEQ0RDREQywgMHhGQjc3QjNDRiwgMHhCNkZCNjlCNiwgMHgwMzk3OTYyRSwgMHg1NjU2NTQ1NCwgMHg0RkFDQTZENiwgMHg4NkNBNjVERSwgMHgwMzk2QzZDRSwgMHgzNTM1MzUxNSwgMHgxMDI5QzIwMCwgMHhEOTkxQTEwMiwgMHhCRUFCRkZGRiwgMHgwNzA3MjcyNywgMHg2MzUwQzAwMCwgMHgyNTgyNTgzNSwgMHhCRUFCRkZGRiwgMHhGNkQ0RDREQywgMHgxREIxQjZENiwgMHhEQjFEQjFEQiwgMHgwMzk3OUU0RCwgMHg1NzU2NTY1NCwgMHhDQkU0QTJEOCwgMHg4NkM4NjRCRSwgMHgwMzk2Q0YwRiwgMHgyNTM1MzUzNSwgMHhEQkJEQjREMSwgMHhCQkVCNERENCwgMHgwMzk2Q0YxMiwgMHg1QzVDNTg1OCwgMHg0MzI0OUZEOCwgMHhGMjQzMjRGMiwgMHgwMzk3OERFQywgMHgxNTk1OTVENSwgMHgyNEQzMkREOCwgMHhFNUE5NTI0OSwgMHhCNjg5RDczMywgMHg3QzVDMDJGRiwgMHgyNjVCODZDQywgMHg2REI0RDQ2RCwgMHgwMzk1Q0VFRiwgMHg3MDYwNjA2MCwgMHg5MjQ5QkZFMywgMHgyNDkyNDkyNCwgMHgwMzk2MDM5NywgMHg4ODI4OEE4OCwgMHgzNDlCMzdEMywgMHgyRDNBOTM0OSwgMHgzQzcyQzZDRiwgMHgwMjAzMDEwMSwgMHgyNDkyMTJENSwgMHgyNDk5MjQ0OSwgMHhCNjg5RDczMywgMHgwMDU1MDhGRiwgMHgyNDkyMTJENSwgMHgyNDk5MjQ0OSwgMHhCNjg5RDczMywgMHgwMDU1MjBGRiwgMHgyNDkyMTJENCwgMHgyNDk5MjQ0OSwgMHhCNjg5RDczMywgMHgwMDVEMDhCRiwgMHg1MDI1REUwMCwgMHhEQjBEOTQwMiwgMHhCRUFCRkZGRiwgMHgwMzA1MjcyNywgMHg2QUI2QkYwMywgMHgzMDYyQzYyRiwgMHhCNkFCRkZGRiwgMHhEOEQ4NTA1MCwgMHhFRDhFQjVENCwgMHhCQkVEOEVCQiwgMHgwMzk2Q0YxMSwgMHg1QzVDNUM1OCwgMHg0MzI0QTJENywgMHhGNjQzMkMzMiwgMHgwMzk3OERDRCwgMHgxNTE1OTU5NSwgMHg5MEM5QzAwMywgMHhDQTlDODlDQywgMHhCRUFCRkZERSwgMHgzNzNGMTcxRiwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5NDk5MTNEMiwgMHg0OTk0OTk0OSwgMHhBNjQ5RDczNCwgMHg0QzQ4NEM0QywgMHg5M0NGQkRENywgMHhFNzkzQ0ZFNywgMHg1NEU4NTUwQSwgMHg1NUY3RkZGQiwgMHhFQjhEQjBEOSwgMHhENEVEOERCOCwgMHg1NEU3Q0YxMSwgMHgwRDBEMEQwRCwgMHgyNDkyMjlENiwgMHg0Q0Y0RUM0OSwgMHhCNjg5RDczMywgMHgxRDM1MDBGRiwgMHg1OEU3OUNEMywgMHg3MjQ4RTQ4RSwgMHg1NEU5OUUyQSwgMHg1NDU0NTQ1NCwgMHg0QzY0QTFENiwgMHg5QTQ5QTQ5QSwgMHg1NEU4RDcxMCwgMHgzNTM1MzVCNSwgMHgyNDkyMENENiwgMHgyNzI5MjI0OSwgMHhCNjg5RDczMywgMHgwNjU2MDBGRiwgMHgyNDkyMTFENCwgMHg0QzkwRTQ0OSwgMHhCNjg5RDczMywgMHgxODFEMDhGRiwgMHg0OEUxOUVEMCwgMHg4RTQ3MjQ2RSwgMHg1NEU4QUU2QSwgMHg1NDU0NTQ1NCwgMHhDMjY0QTJEMiwgMHhCQTRCQTQ5RCwgMHg1NEU4QzZDRSwgMHgzNTM1MzUzNSwgMHhBNkRCNjBEOSwgMHg1Q0E3NkI0OSwgMHhCNkFBRDczMywgMHg5Njk2MDBERiwgMHhCOENFOUNEMiwgMHg4RTQ4RTQ4RSwgMHg1NEU4QzZDRSwgMHg1QzU0NUM1QywgMHhDMzI0OTlENywgMHhCOUNCMjREMSwgMHg1NEU4QkVBQiwgMHgzNTE1MTU5NSwgMHhBNEQzNDZEQiwgMHg2NzI3NjI0OSwgMHhCNjg5RDczMywgMHhENDk0MDBGRiwgMHg0OTM3QThEMSwgMHg5MzQ5MkM5MywgMHg1NEU4RDcxMSwgMHg1QzVDNUM1RSwgMHhDRjZEQUFENiwgMHgzNkNGNkQzNiwgMHg1NEU5QkVBQiwgMHg5NTE1MTUxNSwgMHhBNDcyNzFDRSwgMHg1RTI0NjI0NiwgMHhCNkE5RDczMywgMHg5QzlDOTQ5NCwgMHhFQkJFQjlDOSwgMHhCQkVCQkVCNCwgMHg1NTA5QzZDRSwgMHg1NDU0NTQ1NCwgMHhFM0Y2QjVENCwgMHgyNkUzRjYzRSwgMHg1NTA5QzZDRCwgMHgxNTE1MTUxNSwgMHgxQzIxQzAxMiwgMHhEQTFDMjFDMiwgMHhCNjhBRkZGRiwgMHgyNzI3MjcyNywgMHg2MzQ2QzAxQiwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEOEQ4RENEOCwgMHgxREIxQjdEMSwgMHhEQjFEQjFEQiwgMHg1NEU4QTY0QiwgMHg1NDU0NTQ1NCwgMHhDQTVCOEZENywgMHg5NjM3OUI5OSwgMHg1NEU4Q0YwRiwgMHgzNTM1MzUzNSwgMHgyNjlCNEVEQywgMHg0NEI3NkI0RCwgMHhCNjg5RDczMywgMHg5Njk2MDBGRiwgMHg0OTBGQTFENiwgMHg5MzQ5MzQ5MywgMHg1NEU4Q0YxMCwgMHg1QzVDNUM1RSwgMHg0MzFDOTJEQSwgMHhEMUNEMjNEMiwgMHg1NEU4QTY0OSwgMHgxNTE1MTUxNSwgMHgyNDkyMEVEMiwgMHgzREFCMTIwOCwgMHhCNjg4RDczMywgMHgxQzVDMDBGRiwgMHgyNDkyMERENSwgMHgyNDk5MjQ0OSwgMHhCNjg5RDczMywgMHgwMDU1MDhGRiwgMHgyNDkyMERENSwgMHgyNDk5MjQ0OSwgMHhCNjg5RDczMywgMHgwMDU1MDBGRiwgMHgyNDkyMDRENSwgMHgyNzlCMjQwOSwgMHhCNjg5RDczNCwgMHgwMDU1ODBCRiwgMHgyNDkyMDZENCwgMHg1Mzk0RUQ0OCwgMHhCNjg5RTc3OSwgMHg5MDk1QUFGRiwgMHg0NkUxQTFDRCwgMHg2RTQ2RTQ2RSwgMHg1NEU4QjY4QywgMHg1NDU0NTQ1NCwgMHgzM0UzOUZEMCwgMHg5OUM5QTM5NiwgMHg1NEU4QkVDRCwgMHgzNTM1MzUzNSwgMHgyNDkyMDdENCwgMHgzRUE5MUE0OCwgMHhCNjg5RDczMywgMHgyNjU0MjBGRiwgMHgyNEQyMTJENiwgMHg0Qjk0OUM0OSwgMHg3NTY0RDczMSwgMHgyODBBODA3QSwgMHg2QkFFQjRENCwgMHhENzdCQTlEQiwgMHg1NEU5OERFOSwgMHg1NDU2NTU1NSwgMHhEQkY1QUJEQSwgMHhBNkRBNkRBNiwgMHg1NEU4RDczMSwgMHgzNTM1MjUyNSwgMHgxRDk1QkUwMCwgMHhEOTkwMTFEOSwgMHhCNkFCRkZGRSwgMHgwNTA3MDUwRCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgCisJCTB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NkRCNjQ2MDIsIDB4M0I2MUI2REIsIDB4NzVCMUZGRkYsIDB4NDA4MDAwMDAsIDB4MDM1NkJGMDIsIDB4MjQ5MjRDMjYsIDB4M0NFOERGN0IsIDB4RjVENTU0NTgsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NUQ2OTZERTgsIDB4MjI4MjBCMEQsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NkRFODg2MEEsIDB4MkRCNTVERjUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NjU2ODg2MEEsIDB4NUE4MDAwMjIsIDB4QzhFMzlBRDMsIDB4MzIzOEUzNzEsIDB4NENFODhFMkEsIDB4NTVGRUEwMDAsIDB4OTI0OUMxMTAsIDB4RDkzNzQ5MjQsIDB4NENFN0VGOUEsIDB4MkY1NTU3RkYsIDB4OTI0OUMxMDAsIDB4RDgwRDgyNTIsIDB4NUQyQUZGRkYsIDB4MDAwQkQ1NTUsIDB4MDBBMTlCMDQsIDB4REI2QzMwMDAsIDB4NTRFQUZGRkYsIDB4MDAwMDAyQTUsIDB4NkRCMEZGMDEsIDB4REI2REI2REIsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjIzNjczMDQsIDB4REI2REI2MDMsIDB4NjUyQkZGRkYsIDB4MDAwMDgwNjAsIDB4QzI0OUMxMDQsIDB4MkMwMjVFMjQsIDB4NUQwN0ZGRkUsIDB4NTA1NkQ1RjUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NkQ0ODhFMDgsIDB4MkQwMzAwMDAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4ODYwODhFMjgsIDB4N0ZGRkVFRUEsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4N0UwODhFMjgsIDB4N0ZGRUVFRUEsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4N0UwODhFMjgsIDB4NTc3NzVGRkUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4N0UwOEE2NEEsIDB4MTVBNThEODksIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4ODVDOEFFNkMsIDB4QUFFQUNBNjIsIDB4OURBOUMxMDAsIDB4NDQ5MTA5QzgsIDB4NTUwOUZGRkYsIDB4RDcxNzM1MjUsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjIzNjAyMDEsIDB4REI2REI2REIsIDB4RUZCQ0ZGRkYsIDB4MDAwMDAwNDAsIDB4NjM2MjFCMDMsIDB4OUI2NUI2REIsIDB4Q0YxMkZGRkYsIDB4QzBDMDgwNUUsIDB4OTY5OTQ3REMsIDB4NEQ2NkQ2NjksIDB4MjQxNEM2Q0UsIDB4NDA0MEMwQzAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4Mjg4ODhBODgsIDB4RTkwREE3RDQsIDB4OTI5QjM3OTMsIDB4MjQxM0Q3MzIsIDB4MDMwMTA5MDksIDB4RkI2OUIzQ0YsIDB4QjZGQjY5QjYsIDB4MDM5NzlFMkQsIDB4NTc1NjU2NTQsIDB4NEJFNEExRDUsIDB4OUU0ODY0OUUsIDB4MDM5NkNGMEYsIDB4MjUzNTM1MzUsIDB4OTAyMUMzMDEsIDB4MDExMDExMDEsIDB4QjY4OUZGRkUsIDB4MEQwRjA3MDcsIDB4MTRBOTA1RDMsIDB4NDFGNEE3MEEsIDB4OUUyN0U3NzYsIDB4NEVFRUFDQUMsIDB4RkJBOUI0RDIsIDB4QkFFRDc2RDYsIDB4MDM5NzM0NzMsIDB4NTU1NzU3NTQsIDB4NDg2NEEyRDQsIDB4OUI0OUFDODYsIDB4MEJCNkNFRjAsIDB4MDUwNTI1MjUsIDB4NUQ5MUJEMDgsIDB4QzA0RDg1RDksIDB4QjZBQUZGRkYsIDB4MDkwOTBEMDcsIDB4NzRBOTA3RDMsIDB4NDlGNDlGNDIsIDB4OTVFOEVGQjcsIDB4NkJFRUVFQUMsIDB4RkI2RkI3QzksIDB4QjZEQjZEQjYsIDB4MDM5NzI0MzQsIDB4NTU1NTU3NTQsIDB4NDg2Q0E3RDQsIDB4QjRDOUJDOUYsIDB4MEJCNUQ3MzEsIDB4MEQwNTA1MjUsIDB4OUQ4RUI3RDIsIDB4REIxREIxREIsIDB4MDNCN0JFQ0UsIDB4NTY1NjU0NTQsIDB4NDMyNEE0RDIsIDB4ODY0QkU0REEsIDB4MDM5NkM2RUQsIDB4MzUzNTE1MTUsIDB4MkE1QTBBRTUsIDB4N0YyOUVBQTYsIDB4QjY4OUQ3MzQsIDB4REU0NDc0NkMsIDB4NkM3NkI2RDIsIDB4RDhFREJFQzcsIDB4MDNCNkNFRjAsIDB4NTg1MDUwNzAsIDB4NUI2NUE3RDgsIDB4MzY1RjJDRDYsIDB4MDM5NzNDOTEsIDB4MTU5NUQ1NTUsIDB4MkU5MjAwQ0QsIDB4MzEwMzEyMkMsIDB4OUUyNkY3QkEsIDB4M0EzQkJCQjksIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDMwNkMxMDAsIDB4MjU4MzUwMzUsIDB4QkVBQkZGRkYsIDB4RDRENERDREMsIDB4NkI3RUIzRDAsIDB4QjZGQjY5QjcsIDB4MDM5N0FFNkUsIDB4NTY1NjU0NTQsIDB4NEY2NEE0RDQsIDB4ODY0QkU0REUsIDB4MDM5N0JFQUUsIDB4MzUzNTM1MTUsIDB4MTAyOUMxMDAsIDB4RDk5MDIxMDIsIDB4QkVBQkZGRkYsIDB4MDcwNzI3MjcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTQ5OTEzRDIsIDB4NDk5NDk5NDksIDB4QTYyOUQ3NTMsIDB4NEM0QzRDNEMsIDB4OTNDRkJERDcsIDB4RTc5M0NGRTcsIDB4NENFODU0QzksIDB4RkRERkZERDUsIDB4REI0REFGRDIsIDB4QjREQjREQjQsIDB4NENFN0NFRjAsIDB4MEQwRDBEMEQsIDB4RTRDRTIyQ0UsIDB4NENFMENGNEMsIDB4QjY4OUQ3MzMsIDB4MzkzMTM5MTEsIDB4OUZCOUI5RDQsIDB4RkI5RkI5RkIsIDB4NENFOTlFMkEsIDB4NTQ1NDU0NTQsIDB4NkM3NkIyREMsIDB4Qzc2Qzc2QzcsIDB4NENFOENGMTAsIDB4MzUzNTM1MzUsIDB4MUQ5OUMwMDcsIDB4RDk5RDk5QzEsIDB4QjY4OUY3REUsIDB4MDcwNzA3MDcsIDB4MEI0NkQ0MDAsIDB4MzEwMzA2MzEsIDB4QkVBQUZGRkYsIDB4RDhEOEQ4RDgsIDB4OUZCOUI5RDMsIDB4REY5RkI5REYsIDB4NENFOUFFNkIsIDB4NTQ1NDU0NTQsIDB4REE2REFDRDYsIDB4QTZEQzY1QTYsIDB4NENFOEM2RUYsIDB4MzUzNTM1MzUsIDB4QjU4QTYzRDgsIDB4NTNCNzNBNTQsIDB4QjY4OUQ3MzMsIDB4MzYzRTE2MzYsIDB4N0RCMUI2RDUsIDB4REIxREIxREIsIDB4NENFOEE2NkIsIDB4NTY1NDU0NTQsIDB4NUE2REE5RDgsIDB4QTY1QTZEQkUsIDB4NENFOENFRUYsIDB4MjUzNTM1MzUsIDB4QTVFMjA4RDEsIDB4ODcyNjcyN0UsIDB4QjY4OURGNzYsIDB4NDc2NzY2RDYsIDB4REI0REI0Q0YsIDB4QkJEQkJEQjcsIDB4NTRFOEQ3MTEsIDB4NTA1ODU4NTgsIDB4Q0YyNEE1RDAsIDB4RjFDRDI0RjEsIDB4NENFOTk1RTksIDB4RDU5NTk1MTUsIDB4QjY2MzgwRDUsIDB4NzlCNzlCN0QsIDB4QjZBOUQ3MzMsIDB4OTM5QTlBOUMsIDB4RUJCRUI5QzksIDB4QkJFQkJFQjQsIDB4NTRFOUJFQ0UsIDB4NTQ1NDU0NTQsIDB4RTNGNkI1RDQsIDB4MjZFM0Y2M0UsIDB4NTRFOEM2Q0QsIDB4MTUxNTE1MTUsIDB4MUMyMUMwMTIsIDB4REExQzIxQzIsIDB4QjY4QUZGRkYsIDB4MjcyNzI3MjcsIDB4NjM0NkMwMUIsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RDhEOERDRDgsIDB4MURCMUI3RDEsIDB4REIxREIxREIsIDB4NENFOEE2NEEsIDB4NTQ1NDU0NTQsIDB4NUE2NEE5RDMsIDB4QTY0QTZDQTYsIDB4NENFOENGMTAsIDB4MzUzNTM1MzUsIDB4QjY0QjU3REMsIDB4NjRCNjRCNjQsIDB4QjY4OUM2RUYsIDB4MUMxNDFDMzQsIDB4RUI0REIyRDMsIDB4RDRFQjRERDQsIDB4NENFOENGMTAsIDB4NUM1QzVDNUMsIDB4QzM2NEE4RDMsIDB4MzJDMzY0MzIsIDB4NENFOEE2NDksIDB4MTUxNTE1MTUsIDB4OUMyOUJFMUYsIDB4QzI5QzI5QzIsIDB4QkVDREZGRkYsIDB4MTcxNzE3MTcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjMwNkJCMDYsIDB4MzQ2MzA2MzQsIDB4QjZBQUZGRkYsIDB4RENEOEQ4RDgsIDB4OURCOUI5Q0UsIDB4REI5REJGREIsIDB4NENFOEI2OEQsIDB4NTQ1NDU0NTQsIDB4REM2REFGRDQsIDB4QzZEQzZEQzYsIDB4NENDOEM2Q0UsIDB4MzUzNTM1MzUsIDB4MUMxOUM2MEUsIDB4QzE5QzE5REEsIDB4QjZBQUZGRkYsIDB4MzczNzM3MzcsIDB4NjM0NkJDMjEsIDB4MzQ2MzQ2MjQsIDB4QkVBQ0ZGRkYsIDB4RENEQ0RDREMsIDB4OURGMUI4RDgsIDB4RkI5REYxRkIsIDB4NENFODk1RUEsIDB4NTQ1NDU0NTQsIDB4NDlEQ0E0Q0YsIDB4ODVDN0UzOUUsIDB4NTRFOEQ3MTEsIDB4MzUzNTM1MzUsIDB4NTAxNUU5MDAsIDB4MDFEMDE1MDEsIDB4QjY4OUZGREUsIDB4MDcwNzA3MDcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIAorCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZEQjZGRjAxLCAweDFCNkRCNkRCLCAweEY3REVGRkZGLCAweDQwMDAwMDAwLCAweDYyQjZCRjAwLCAweDI0QzI2MDM1LCAweDM0QzlGN0RFLCAweDU1NTQ1ODcwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDQ1MDk1REE4LCAweDVEQUQyRDJELCAweEI2REI5M0QxLCAweEYxQjZEQjZELCAweDQ0Qzk2REU5LCAweDU3RUEyQTgwLCAweDkyNDlCRjAxLCAweDAxMzc0OTI0LCAweDQ0RTdGN0RCLCAweDJGNTU1N0ZGLCAweDkyNDlDMjAxLCAweDAwNjAwMjRFLCAweDREMDlGRkZGLCAweDAwMEJENTU1LCAweDAwQTE5NzA2LCAweERCNkRCNkMwLCAweDU1MENGRkZGLCAweDAwMDAwMjM1LCAweDZEQjBGRjAxLCAweERCNkRCNkRCLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYyMzY1MTAwLCAweDAwMDAwMDAwLCAweDg1QjBGRkZGLCAweDAwMDAwMDQwLCAweEIyNDlDMzAwLCAweEFDNjM1ODI2LCAweDU0RTdFRkJELCAweDcwNUNEN0Y1LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDVEMjg4NjA4LCAweEFEMEIwMjAwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDdFMDg4NjA5LCAweDU3NzdGRUZBLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDc1RTg3RTA4LCAweEVBODhBMDgwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDc1RTg4RTI5LCAweDc3NzdGRjNGLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDdERTg5RTJBLCAweDg5QTI4MDgwLCAweDMyRDI3M0QxLCAweDREMjY5QTY5LCAweDNDQzg4RTBBLCAweEEwNjA3MDc4LCAweDIwMDBCQTAwLCAweDI0OTRENERCLCAweDY1NDFGN0RDLCAweEFCQTkwMjAwLCAweDZEQjZCQTM3LCAweDI0OTAwMERCLCAweEM2Q0VGRkZGLCAweDU1NTUwMDAwLCAweDZEQjZCODAwLCAweDU0OTA5M0RCLCAweEM2Q0RGRkZGLCAweEQ1QjUwMDAwLCAweDY3QjY0RDAyLCAweDIzNkEzNjdCLCAweEI2OEFGRkZGLCAweDQwNDBDMEMwLCAweDY2RDE4QkNDLCAweDUxMzREQzZELCAweDBCQjVDRjBGLCAweDcwNzA2MDYwLCAweDZEQjZCNEQ5LCAweDNCNkRCNkRCLCAweDAzOTcxM0Q1LCAweDE1RDU1NTU1LCAweDE5MTlBMkQxLCAweEIyNkFFNzkyLCAweDY1MkJENzMzLCAweEMyODI4MzAxLCAweDlGRjlCQURELCAweEZGRkZGRkZGLCAweDAzOTcyNDM0LCAweDU1NTU1NzU0LCAweEM4NjRBNUQwLCAweDkwQzk3QzdFLCAweDAzOTZDRjEwLCAweDBEMEQwNTI1LCAweDVEOTFBNDAwLCAweDAwNDAwNTAwLCAweEJFQUJGRkZGLCAweEMxODkwRDA5LCAweDk2OTkzN0RCLCAweDY5NjY5NjY5LCAweDM0NTJDNkVFLCAweDQwNDJDMDgwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweEEyMjA4QTg4LCAweEM5M0NBNEQwLCAweEVDQ0IwQzkwLCAweDAzOTVDRUVGLCAweDA5MDkwRDBELCAweDREQjE3MDAyLCAweDVCMzAwMzE4LCAweEJFQ0NGRkZGLCAweEMzODE4MTA5LCAweDc2OTkzOERELCAweDRENTY5RTY5LCAweDFDMTRDNkNFLCAweDQwNDBDMEMwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweEE4ODgwQTg4LCAweEM5M0NBMEQ2LCAweEIzRDkzQzkwLCAweDBCQjVENzExLCAweDAxMDkwOTBELCAweDdEQTlCNEQ0LCAweEJBRkJCN0Q3LCAweDAzOTc1RDEwLCAweDU1NTc1NjU0LCAweDQ4NjRBM0Q0LCAweDlFQzlFQzg2LCAweDBCQjZENzEwLCAweDA1MjUyNTM1LCAweEE1RjIxNUNELCAweDUwQjU4QjVCLCAweEI2ODhDNkYwLCAweDEzMzNCNkUwLCAweEVCQkRCNEQyLCAweEQ3RUJCREQ0LCAweDAzOTZDRjExLCAweDU0NUM1QzU4LCAweEMzMjRBNEQ2LCAweEY2NDM2NDMyLCAweDAzOTc5RTRCLCAweDE1MTU5NTk1LCAweDlDODlDMTBGLCAweEMyOUMyOUM4LCAweEJFQUJGRkZGLCAweDI3MzczNzFGLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDk0QTkwMEQzLCAweDQ5RjRBNzBBLCAweDlFMjZFNzk3LCAweEVFRUVBQ0FDLCAweDdCQTlCNEQzLCAweEQ3NkJBRkQ3LCAweDAzOTc0Q0IyLCAweDU1NTc1NjU0LCAweDQ4NjRBMkQ0LCAweDlCNDlFQzlFLCAweDBCQjZENzEwLCAweDA1MjUyNTI1LCAweDFDMTFCODA0LCAweEMwNEQ4NUQ5LCAweEI2QUFGRkZGLCAweDA5MDkwRDBGLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDZEQjY4RTAwLCAweDM1ODAwNkRCLCAweEI2ODlGRkZGLCAweDVDODAwMDAwLCAweDZEQjY4NzA5LCAweDI0OTAwMERCLCAweEI2ODlGRkZFLCAweDU1ODAwMDAwLCAweDZEQjY4NTA1LCAweDI0OTAwMERCLCAweEI2ODlGRkZFLCAweDU1ODAwMDAwLCAweDZEQjYyNTAxLCAweERCMURCMERCLCAweEM2RUZGRkZGLCAweDAxMDAwMDAwLCAweDk0OTkxM0QyLCAweDQ5OTQ5OTQ5LCAweEE2MjlENzMzLCAweDQ4NEM0ODRDLCAweDkzQ0ZCREQ3LCAweEU3OTNDRkU3LCAweDQ0Qzg0Q0U5LCAweDdGRkVFRUE4LCAweERCNERBRkQyLCAweEI0REI0REI0LCAweDRDQzdDRUYwLCAweDBEMEQwRDBELCAweEU0Q0UyMkNFLCAweDRDRTBDRjRDLCAweEI2ODlENzMzLCAweDM5MzEzOTExLCAweDlGQjlCOUQ0LCAweEZCOUZCOUZCLCAweDRDQzk5RTBBLCAweDU0NTQ1NDU0LCAweDZDNzZCMkRDLCAweEM3NkM3NkM3LCAweDRDQzhDRjEwLCAweDM1MzUzNTM1LCAweDFEOTlDMDA3LCAweEQ5OUQ5OUMxLCAweEI2ODlGN0RFLCAweDA3MDcwNzA3LCAweDBCNDZENDAwLCAweDMxMDMwNjMxLCAweEJFQUFGRkZGLCAweEQ4RDhEOEQ4LCAweDlGQjlCOUQzLCAweERGOUZCOURGLCAweDRDQzhBRTZCLCAweDU0NTQ1NDU0LCAweERBNkRBQ0Q2LCAweEE2REM2NUE2LCAweDQ0QzhDRUVGLCAweDM1MzUzNTM1LCAweEE2Q0I3NkQzLCAweDZCMjZCQjRGLCAweEI2ODlENzM0LCAweENFQTZBNjM2LCAweDlERjFCOERBLCAweEZCRkZCOUZCLCAweDQ0Qzg3REE5LCAweDU3NTY3NjU0LCAweEM4NkNBQkQxLCAweDlGNTg2Qzg2LCAweDRDRThENzMxLCAweDA1MjUyNTI1LCAweDU4MTFCNDAwLCAweDYwNTYxNTYxLCAweEI2ODlGN0RELCAweEM5Q0Q0RDQ3LCAweDU5QUNCMENDLCAweEJBMTlBNjlFLCAweDQ0QzdDRUYwLCAweDYwNzA3MDcwLCAweDYzQjZCNUQ5LCAweERCNkZCNkZCLCAweDQ0Qzg1RDA5LCAweERERjdCNzNGLCAweDc4NjVBNUQ2LCAweEIyNzlBNzlFLCAweEE2NDdENzMyLCAweEExMzMzMzMyLCAweEVCQkVCOUM5LCAweEJCRUJCRUI0LCAweDRDRTlDNkNFLCAweDU0NTQ1NDU0LCAweEUzRjZCNUQ0LCAweDI2RTNGNjNFLCAweDRDQzhCRUNELCAweDE1MzUxNTM1LCAweDFDMjFDMDEyLCAweERBMUMyMUMyLCAweEI2OEFGRkZGLCAweDI3MjcyNzI3LCAweDYzNDZDMDFCLCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweEQ4RDhEQ0Q4LCAweDFEQjFCN0QxLCAweERCMURCMURCLCAweDRDQzhBNjRBLCAweDU0NTQ1NDU0LCAweDVBNjRBOUQzLCAweEE2NEE2Q0E2LCAweDRDRThDRjEwLCAweDM1MzUzNTM1LCAweEI2NEI1N0RDLCAweDY0QjY0QjY0LCAweEI2ODlDNkVGLCAweDM0MUMxNDM0LCAweEVCNERCMkQzLCAweEQ0RUI0REQ0LCAweDQ0QzhDRjEwLCAweDVDNUM1QzVDLCAweEMzNjRBOEQzLCAweDMyQzM2NDMyLCAweDRDQzhBNjQ5LCAweDE1MTUxNTE1LCAweDlDMjlCRTFGLCAweEMyOUMyOUMyLCAweEJFQ0RGRkZGLCAweDE3MTcxNzE3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYzMDZCQjA2LCAweDM0NjMwNjM0LCAweEI2QUFGRkZGLCAweEQ4RDhEOEQ4LCAweDlEQjlCOUNFLCAweERCOURCRkRCLCAweDRDRThCNjhELCAweDU0NTQ1NDU0LCAweERDNkRBRkQ0LCAweEM2REM2REM2LCAweDQ0QzhDNkNFLCAweDM1MzUzNTM1LCAweDFDMTlDNjBFLCAweEMxOUMxOURBLCAweEI2QUFGRkZGLCAweDM3MzczNzM3LCAweDYzNDZCQzIxLCAweDM0NjM0NjI0LCAweEJFQUNGRkZGLCAweERDRENEQ0RDLCAweDlERjFCOEQ4LCAweEZCOURGMUZCLCAweDRDQzg5NUVBLCAweDU0NTQ1NDU0LCAweDQ5RENBNENGLCAweDg1QzdFMzlFLCAweDRDRThENzExLCAweDM1MzUzNTM1LCAweDUwMTVFOTAwLCAweDAxRDAxNTAxLCAweEI2ODlGRkZFLCAweDA3MDcwNzA3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAKKwkJMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2NjM2QzUwMCwgMHhBNjAzNDBBOCwgMHgxNDg5RjdERSwgMHg1NDU4NjBDMCwgMHg5MjQ5QzAwNCwgMHhEOTM3NDkyNCwgMHgyNEE5REY3QywgMHgwRjU1NTU1NSwgMHg5MjQ5QzAwMCwgMHgwMDYwMDI0RSwgMHgzQ0VBRkZGRiwgMHgwMDBCRDU1NSwgMHgwMEExOTcwMywgMHhEQjZEQjAwMCwgMHg0NTBCRkZGRiwgMHgwMDAwMDIyNSwgMHg2REIwRkYwMSwgMHhEQjZEQjZEQiwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MjM2MzEwMSwgMHhEQjZEQjZEQiwgMHg3REIwRkZGRiwgMHgwMDAwMDA0MCwgMHhBMjREQkQxNywgMHhBMzYzNTYyNiwgMHg0Q0M3RjdERSwgMHg2MDVDRDdGNSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg1NTA5N0UwOCwgMHhBRDBCMEEwMCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3NUU4N0UwOCwgMHhGRkZGRUVFQSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg2REU5N0UwOCwgMHg3RkVGRkVFQSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3NUU4OTYyQSwgMHhENTE1MjUwRCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg3REM5OUUyQSwgMHgzQTNBQUU3QSwgMHhFRDc1QjBEOSwgMHhENzVCQjUyNiwgMHgwMzc1QzZGMCwgMHg3MDcwRTAwMCwgMHhGQjZEQURENywgMHgzNkRGNkQzQywgMHgwQkI1Q0YxMSwgMHg1NTU1RkYwMCwgMHgyRTgyMDBDRiwgMHgzMDJFRDJFOSwgMHhBRTY5RUZCOSwgMHgxQjk5QjlGQSwgMHg2ODM2OUIwOSwgMHgyQjZBQjZBMywgMHhCNjg5RkZGRiwgMHg3MDcwNjA2MCwgMHhFQzc2QjZEMywgMHhEQkVEOEVERiwgMHgwMzk2Q0YxMCwgMHg1ODU4NTA3MCwgMHg0RjJDQTNEOSwgMHgzNkMzMjVGNiwgMHgwMzk3N0RBRCwgMHgxNTk1OTVENSwgMHhFRjZGQjRDRCwgMHhGQURGNkQzNiwgMHgxQkYzQ0YxMiwgMHg0MDQwQzBDMCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHhBODg4OEE4OCwgMHhCOEYzOTJENSwgMHgyRUNDRjRBRiwgMHgwQkI1Q0YwRSwgMHgwMTA5MDkwRCwgMHg0NDAxNDMwMCwgMHgyMDI4MDM4MCwgMHhCRUNDRkZGRiwgMHg2MjQzNDNDMSwgMHg2NEQ3N0NDQywgMHg0RDM0RDQ0RCwgMHgwQkI2Q0VFRSwgMHg3MDYwNjA0MCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHg4ODg4OEE4OCwgMHhCOEEyNTZEMiwgMHgyOTRFOTNBOSwgMHgwQkI1QzZDRSwgMHgwMzAzMDEwMSwgMHgyNzgyNEQwMSwgMHgyMzBBMzA3QiwgMHhCNjhBRkZERSwgMHg0MDQwQzJDMiwgMHg2NkQ3ODlDQiwgMHg0RDM1MTQ0RCwgMHgwQkI1Q0YwRiwgMHg3MDcwNjA2MCwgMHg5M0NGQkRENywgMHgzQ0YzQ0ZFNywgMHgwMzk2MDM5NywgMHg4ODg4OEE4OCwgMHg3QUVFQTBDRCwgMHhBRDlBREY4RSwgMHgzQzcwRDczMiwgMHg0M0MzQzE4OSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHhBODg4OEE4QSwgMHhDOTdDQTFENSwgMHhEMEM5MEM5MywgMHgwMzk2Q0VFRiwgMHgwOTBEMEQwRCwgMHhENTBEMUREQiwgMHg0QkY0RkY1MCwgMHhCNkFBRDczMywgMHgzNzM3MUQxRCwgMHgxREJGQjZEMiwgMHhEQTlEQjFENywgMHgwMzk3QUU2RCwgMHg1NjU2NTQ1NCwgMHg0REE0QTJENiwgMHg4NjQ4NjRCRSwgMHgwMzk2QzZFRiwgMHgyNTM1MzUxNSwgMHgxMDIxQzAwMCwgMHgwMTEwMTkwMiwgMHhCNkFBRkZGRiwgMHgwRDA3MDcyNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2REI2MDcwMSwgMHgzQjY1QjYxQiwgMHhFNzc4RkZGRiwgMHg0MDAwODAwMCwgMHhGNkExMkNERCwgMHg2OTY0RDc0OSwgMHgyQzUyQzZFRSwgMHg0MkMwQzA4MCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2MDM5NywgMHhBODg4OEE4OCwgMHhDOTNDQTFEMiwgMHhEM0NCMEM5MywgMHgwMzk2Q0VFRiwgMHgwOTA5MEQwRCwgMHg1MDAxNjkwMCwgMHhEODJEQjQwMywgMHhCRUFCRkZGRiwgMHgwMzAxMDEwMSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgxNEExMDBEMSwgMHg0QTE0QTEwQSwgMHhCNkFBRkZGRSwgMHg3NEY0RjRGNCwgMHg5REI2QjdEMiwgMHhEQjFEQjEzQywgMHg0Q0U4RDczMSwgMHg1NTU1QUEwMCwgMHg2QjJDQjFDQywgMHhCNENCNERCNywgMHg0NEE3Q0YxMSwgMHgwRDBEMDIwMCwgMHgxRDgxNUYwNCwgMHhDMDFEODFEOCwgMHhCNjhBRkZGRiwgMHgwOTA5MDkwOSwgMHg5NDk5MTNEMiwgMHg0OTk0OTk0OSwgMHhBNjI5RDczMywgMHg0ODRDNDg0QywgMHg5M0NGQkRENywgMHhFNzkzQ0ZFNywgMHg0NEM5NENDOCwgMHg1NTU3NzdGRiwgMHhEQjREQUZEMiwgMHhCNERCNERCNCwgMHg0NEM3Q0VGMCwgMHgwRDBEMEQwRCwgMHhFNENFMjJDRSwgMHg0Q0UwQ0Y0QywgMHhCNjg5RDczMywgMHgzOTMxMzkxMSwgMHg5RkI5QjlENCwgMHhGQjlGQjlGQiwgMHg0NEM5OUUwQSwgMHg1NDU0NTQ1NCwgMHg2Qzc2QjJEQywgMHhDNzZDNzZDNywgMHg0NEM4Q0YxMCwgMHgzNTM1MzUzNSwgMHgxRDk5QzAwNywgMHhEOTlEOTlDMSwgMHhCNjg5RjdERSwgMHgwNzA3MDcwNywgMHgwQjQ2RDQwMCwgMHgzMTAzMDYzMSwgMHhCRUFBRkZGRiwgMHhEOEQ4RDhEOCwgMHg5RkI5QjlEMywgMHhERjlGQjlERiwgMHg0NEM5QUU2QiwgMHg1NDU0NTQ1NCwgMHhEQTZEQUNENiwgMHhBNkRDNjVBNiwgMHg0NEM4Q0VFRiwgMHgzNTM1MzUzNSwgMHhDQjBDOUZENCwgMHhCMjQ5MkNBRiwgMHg5RTA3Q0YxMSwgMHg0OEM4Qzg4OCwgMHg5RTc5QkRENywgMHhFNzkzQ0ZFNywgMHg0NEM4NENFOCwgMHg1NTU1NzY3NCwgMHhDQjdEQTlENSwgMHhCNENCN0RCNCwgMHg0NEM3Q0YxMCwgMHgwRDBEMEQwRCwgMHg1NjAxNzEwMiwgMHgxODQ1ODQ1OSwgMHhCNjhBRkZGRSwgMHg4MTgxOERDOSwgMHg1NEQ0N0NDRCwgMHg0RDE2RDc0RCwgMHg1NEU3REY1MSwgMHg2MjYyNjI3MiwgMHg5M0NGQkRENywgMHhGQ0YzQ0ZFNywgMHg0NEM4NDRDOSwgMHhFRUVCQUVFRSwgMHg5QjY5QUJEOCwgMHhCNzdCNjlCNiwgMHg3NTY3Q0YxMSwgMHgwMTAxMDMwMywgMHhFQkJFQjlDOSwgMHhCQkVCQkVCNCwgMHg0NEM5QzZDRSwgMHg1NDU0NTQ1NCwgMHhFM0Y2QjVENCwgMHgyNkUzRjYzRSwgMHg0Q0U4QzZDRCwgMHgxNTE1MTUxNSwgMHgxQzIxQzAxMiwgMHhEQTFDMjFDMiwgMHhCNkFBRkZGRiwgMHgyNzM3MjcyNywgMHg2MzQ2QzAxQiwgMHgzNDYzNDYzNCwgMHhCRUFCRkZGRiwgMHhEOEQ4RENEOCwgMHgxREIxQjdEMSwgMHhEQjFEQjFEQiwgMHg0NEM4QTY0QSwgMHg1NDU0NTQ1NCwgMHg1QTY0QTlEMywgMHhBNjRBNkNBNiwgMHg0NEM4Q0YxMCwgMHgzNTM1MzUzNSwgMHhCNjRCNTdEQywgMHg2NEI2NEI2NCwgMHhCNjg5QzZFRiwgMHgxNDNDMTQzNCwgMHhFQjREQjJEMywgMHhENEVCNERENCwgMHg0NEM4Q0YxMCwgMHg1QzVDNUM1QywgMHhDMzY0QThEMywgMHgzMkMzNjQzMiwgMHg0NEM4QTY0OSwgMHgxNTE1MTUxNSwgMHg5QzI5QkUxRiwgMHhDMjlDMjlDMiwgMHhCRUNERkZGRiwgMHgxNzE3MTcxNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MzA2QkIwNiwgMHgzNDYzMDYzNCwgMHhCNkFBRkZGRiwgMHhEQ0Q4RDhEOCwgMHg5REI5QjlDRSwgMHhEQjlEQkZEQiwgMHg0NEM4QjY4RCwgMHg1NDU0NTQ1NCwgMHhEQzZEQUZENCwgMHhDNkRDNkRDNiwgMHg0NEM4QzZDRSwgMHgxNTM1MzUzNSwgMHgxQzE5QzYwRSwgMHhDMTlDMTlEQSwgMHhCNkFBRkZGRiwgMHgzNzM3MzczNywgMHg2MzQ2QkMyMSwgMHgzNDYzNDYyNCwgMHhCRUFDRkZGRiwgMHhEQ0RDRENEQywgMHg5REYxQjhEOCwgMHhGQjlERjFGQiwgMHg0NEM4OTVFQSwgMHg1NDU0NTQ1NCwgMHg0OURDQTRDRiwgMHg4NUM3RTM5RSwgMHg0Q0M4RDcxMSwgMHgzNTM1MzUzNSwgMHg1MDE1RTkwMCwgMHgwMUQwMTUwMSwgMHhCNjg5RkZERSwgMHgwNzA3MDcwNywgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgCisJCTB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDBDQzU4MDIsIDB4REI2REI2QzAsIDB4NDU0RUZGRkYsIDB4MDAwMDAwMzUsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjFCNkZGMTksIDB4REI2REI2REIsIDB4QkVEN0ZGRkYsIDB4MDAwMDAwNDAsIDB4ODI0REJGMDYsIDB4ODM2MzQwMjYsIDB4NEQwOUY3REYsIDB4NjA1ODU2RDUsIDB4OTNDRkJERDcsIDB4RTc5M0NGRTcsIDB4NENFOTc1RTgsIDB4QUQyQjAyMDAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NkRFODc1RTksIDB4Nzc3RkZFRUEsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NjVDODZERTksIDB4RUE4OEEwMDAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4NzVFOUJFQUIsIDB4MzUzNUI1QkYsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MEJCNkQ3MzEsIDB4NUM1ODU4NTAsIDB4NEYyNEEyRDcsIDB4RjY0MzI0MzYsIDB4MDM5NzlFMkIsIDB4MTU5NTk1RDUsIDB4OUQwOUMxMDQsIDB4Q0E5MDg5MDgsIDB4QkVBQkY3REUsIDB4MzczNzFGMUYsIDB4NjJCNkJDMDAsIDB4MzAwMkMwMkMsIDB4QjZBQUZGRkUsIDB4RENEODUwNTAsIDB4REI0REIzRDEsIDB4RDdEQjREQjcsIDB4MDM5NkNGMTEsIDB4NTQ1QzVDNTgsIDB4NDMyNEE1RDMsIDB4QTY0REU0RjYsIDB4MDM5N0JFQ0MsIDB4MzUzNTE1OTUsIDB4NURFRUI0RDMsIDB4QTc1REVFQTcsIDB4MEJCNUQ3MzMsIDB4NzA3MDYwNjAsIDB4OTNDRkJERDcsIDB4M0NGM0NGRTcsIDB4MDM5NjAzOTcsIDB4ODg4OEFBODgsIDB4Mzg5MjJERDAsIDB4MjgzQzkzQzksIDB4MzQ3MkM2RUUsIDB4MDMwMzAxMDEsIDB4MDgwMDk0MDAsIDB4MjgwQTgwQTAsIDB4QjZBQUZGRkYsIDB4NzA3MDYwNjIsIDB4NURFRkI1RDEsIDB4QjhEREY2QTcsIDB4MDM5NkNGMTAsIDB4NTg1MDUwNzAsIDB4NUI2REIzRDEsIDB4M0FERDZERDcsIDB4MDM5NzEzRjUsIDB4MTVENTU1NTUsIDB4M0M5MzAyREMsIDB4MkQyRUQzRTksIDB4NzU4OERGNTIsIDB4MjIyMzIxQTEsIDB4NjgzNjlDMDksIDB4MkI2QUI2QTMsIDB4QjY4OUZGRkYsIDB4NzA3MDYwNjAsIDB4NUE2RUI0Q0UsIDB4QjdEQkJEQkIsIDB4MDM5NkNGMTAsIDB4NTg1ODUwNzAsIDB4NDkyNEE2RDEsIDB4MzI0RDI0QjIsIDB4MDM5NzM0NzMsIDB4MTVENUQ1NTUsIDB4NzkxOUE1Q0QsIDB4NzY0OTVFQjIsIDB4MTNGNERGNTAsIDB4NjA2MjYyNDIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4ODg4ODhBODgsIDB4QjhBMjY0Q0YsIDB4Mjk0QzlCQTksIDB4MTNENUM2RUUsIDB4MDMwMTAxMDksIDB4OTRCNzBGRDUsIDB4NEE3NDIxNEEsIDB4QUU4OUQ3MzMsIDB4NEVFRjg2QTcsIDB4N0RCMUI1RDQsIDB4RDc2REI3RDcsIDB4MDM5NzQ0OTIsIDB4NTU1NzU2NTQsIDB4NDg2Q0E3RDQsIDB4QjRDOUY0OUYsIDB4MEJCNkNGMTAsIDB4MEQwNTI1MjUsIDB4MTAxMUE4MDAsIDB4MDA0MDA1MDAsIDB4QjZBQkZGRkYsIDB4MDkwOTA5MEQsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjVCNjMwMDAsIDB4MjMwQjg2ODMsIDB4QjY4QUZGRkYsIDB4NDBDMEMwODAsIDB4NjREMTc0Q0YsIDB4NEQ0NEQ1NkQsIDB4MEJCNkM2Q0UsIDB4NjA2MDQwNDAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4OEE4ODhBODgsIDB4QjhBMjU1RDMsIDB4Mjk0RTkzQTksIDB4MEJENUM2Q0UsIDB4MDMwMzAxMDEsIDB4M0RCMTEzMDEsIDB4REIwREIyRDgsIDB4RDczM0ZGRkYsIDB4MDAwMjAyMDEsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MTRBMTAyRDUsIDB4NEExNEExNEEsIDB4QjZBQUZGRkUsIDB4RjRGNDc0RjQsIDB4OUZCOUI4REIsIDB4RkI5RkI5RkIsIDB4M0NBOTU1MjgsIDB4NTQ3NDc0RjQsIDB4Q0I0REIyQ0MsIDB4QjhDQjREQjQsIDB4M0M4N0NFRjAsIDB4MEQwRDBEMEQsIDB4MUQ4MTVFMDksIDB4RDgxRDgxRDgsIDB4QjY4QUZGRkYsIDB4MDkwOTA5MDksIDB4OTQ5OTEzRDIsIDB4NDk5NDk5NDksIDB4QTYyOUQ3MzMsIDB4NDg0QzQ4NEMsIDB4OTNDRkJERDcsIDB4RTc5M0NGRTcsIDB4M0NBOTQ0QzgsIDB4RjZFQUFBQUEsIDB4REI0REFGRDIsIDB4QjREQjREQjQsIDB4NDRBN0NFRjAsIDB4MEQwRDBEMEQsIDB4RTRDRTIyQ0UsIDB4NENFMENGNEMsIDB4QjY4OUQ3MzMsIDB4MzkzMTM5MTEsIDB4OUZCOUI5RDQsIDB4RkI5RkI5RkIsIDB4M0NDOTlFMEEsIDB4NTQ1NDU0NTQsIDB4NkM3NkIyREMsIDB4Qzc2Qzc2QzcsIDB4NDRDOENGMTAsIDB4MzUzNTM1MzUsIDB4MUQ5OUMwMDcsIDB4RDk5RDk5QzEsIDB4QjY4OUY3REUsIDB4MDcwNzA3MDcsIDB4MEI0NkQ0MDAsIDB4MzEwMzA2MzEsIDB4QkVBQUZGRkYsIDB4RDhEOEQ4RDgsIDB4OUZCOUI5RDMsIDB4REY5RkI5REYsIDB4M0NDOEFFNkIsIDB4NTQ1NDU0NTQsIDB4REE2REFDRDYsIDB4QTZEQzY1QTYsIDB4M0NBOENFRUYsIDB4MzUzNTM1MzUsIDB4NjNCNkI2RDQsIDB4RkI2M0I2RkIsIDB4NTUwN0NGMTAsIDB4NDA0MEMwQzAsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4M0NBOTQ0QzgsIDB4RUZFRUFBQTgsIDB4MzhBQTg4Q0QsIDB4MkUzRUEzQUUsIDB4NENFN0Q3MzAsIDB4ODE4OTBEODksIDB4NTAwMTMyMDAsIDB4MUIzMUI0MDMsIDB4QjZBQkZGRkUsIDB4MDEwMzAxMDEsIDB4NjQ5NjMyRDUsIDB4NDk5Njk3NDksIDB4NUQyN0NGMEYsIDB4QzBDODQwNDIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4M0NBOTQ0QzgsIDB4RUZCQUFBQUEsIDB4NkI3MUFCRDcsIDB4QjREQjdEQjcsIDB4NDRFN0Q3MzIsIDB4MDkwOTA5MDEsIDB4RUJCRUI5QzksIDB4QkJFQkJFQjQsIDB4NDRDOUM2Q0UsIDB4NTQ1NDU0NTQsIDB4RTNGNkI1RDQsIDB4MjZFM0Y2M0UsIDB4NDRDOEJFQ0QsIDB4MTUxNTE1MTUsIDB4MUMyMUMwMTIsIDB4REExQzIxQzIsIDB4QjZBQUZGRkYsIDB4MjczNzI3MjcsIDB4NjM0NkMwMUIsIDB4MzQ2MzQ2MzQsIDB4QkVBQkZGRkYsIDB4RDhEOERDRDgsIDB4MURCMUI3RDEsIDB4REIxREIxREIsIDB4M0NDOEE2NEEsIDB4NTQ1NDU0NTQsIDB4NUE2NEE5RDMsIDB4QTY0QTZDQTYsIDB4NDRDOENGMTAsIDB4MzUzNTM1MzUsIDB4QjY0QjU3REMsIDB4NjRCNjRCNjQsIDB4QjY4OUM2RUYsIDB4MUMzNDFDMzQsIDB4RUI0REIyRDMsIDB4RDRFQjRERDQsIDB4M0NBOENGMTAsIDB4NUM1QzVDNUMsIDB4QzM2NEE4RDMsIDB4MzJDMzY0MzIsIDB4M0NDOEE2NDksIDB4MTUxNTE1MTUsIDB4OUMyOUJFMUYsIDB4QzI5QzI5QzIsIDB4QkVDREZGRkYsIDB4MTcxNzE3MTcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjMwNkJCMDYsIDB4MzQ2MzA2MzQsIDB4QjZBQUZGRkYsIDB4RDhEOEQ4RDgsIDB4OURCOUI5Q0UsIDB4REI5REJGREIsIDB4NDRDOEI2OEQsIDB4NTQ1NDU0NTQsIDB4REM2REFGRDQsIDB4QzZEQzZEQzYsIDB4M0NBOEM2Q0UsIDB4MzUzNTM1MzUsIDB4MUMxOUM2MEUsIDB4QzE5QzE5REEsIDB4QjZBQUZGRkYsIDB4MzczNzM3MzcsIDB4NjM0NkJDMjEsIDB4MzQ2MzQ2MjQsIDB4QkVBQ0ZGRkYsIDB4RENEQ0RDREMsIDB4OURGMUI4RDgsIDB4RkI5REYxRkIsIDB4M0NDODhERUEsIDB4NTQ1NDU0NTQsIDB4NDlEQ0E0Q0YsIDB4ODVDN0UzOUUsIDB4NDRDOEQ3MTEsIDB4MzUzNTM1MzUsIDB4NTAxNUU5MDAsIDB4MDFEMDE1MDEsIDB4QjY4OUZGREUsIDB4MDcwNzA3MDcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIAorCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYxQjZGRjA5LCAweERCNkRCNkRCLCAweEU3OURGRkZGLCAweDAwMDAwMDQwLCAweDAyNENDMDAzLCAweDdCNjMwMDI2LCAweDU1MEFFRkRFLCAweDQwNTA1NDU1LCAweEZGRkZCQkQ3LCAweEZGOUZGRkZGLCAweDNDQzk2REU4LCAweEJEMkIwQTAyLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDY1Qzk2REU5LCAweDVEN0ZGRkVBLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDY1RThENzExLCAweDM1MzUzNUI1LCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTZDRjBGLCAweDU2NTQ1QzVDLCAweDRGNjRBN0QwLCAweDlFNEE2NEZBLCAweDAzQjZCRUNELCAweDM1MzUxNTE1LCAweDEwMjlDMzAwLCAweDAxOTAyMTAyLCAweEI2QUJGRkZGLCAweDA3MDcyNzI3LCAweDAzNDZCRTAzLCAweDI1ODM1NjM1LCAweEJFQ0NGRkZGLCAweEQ2RDRENERDLCAweDFEQjFCNkQ2LCAweERCMURCMURCLCAweDAzOTdDNkVDLCAweDU3NTY1NjU0LCAweDQ4NjRBNEQ0LCAweDlFQzg2Qzg2LCAweDAzQjZENzMwLCAweDI1MjUyNTM1LCAweEVDNzZCNkQzLCAweEQ4RUJGRURGLCAweDAzOTZENzExLCAweDU4NTg1MDcwLCAweEM5MjRBNUQwLCAweEYxQ0QyNEIxLCAweDAzOTcyQzUzLCAweDE1OTVENTU1LCAweDJFOTIwMUNFLCAweDMwMjMwMkVELCAweDlFMjdFRjk4LCAweDNBM0IzQkI5LCAweDZBQjZDMTA2LCAweDMwNjJDNjJCLCAweEJFQUJGRkZGLCAweERDRDg1MDUwLCAweERCQkVCNEQ0LCAweEQ3RUI4RUQ0LCAweDAzOTZDRUYxLCAweDVDNUM1ODU4LCAweDRGMkNBM0Q5LCAweDMyQzMyNTM2LCAweDAzOTc4NUNELCAweDE1OTU5NUQ1LCAweDkxMDlDMTAwLCAweDBBOUNDOTBDLCAweEI2ODlGN0RFLCAweDNFM0YxRjFGLCAweDAyODZCQjAwLCAweDMxMDMwMDJDLCAweEI2QUFGN0RFLCAweERDRDBEMDUwLCAweERCNERCM0QxLCAweEI3REI0REI3LCAweDAzOTZDRjExLCAweDU0NUM1QzU4LCAweDQzMjRBMUQ3LCAweEY2NDMyNDMyLCAweDAzOTdCNjhBLCAweDE1OTU5NUQ1LCAweERCRUVCM0NGLCAweEJCNUJFREJFLCAweDBCQjVENzEyLCAweDUwNzA3MDcwLCAweDZEQjZCNkQ3LCAweDNCNkZCNkRCLCAweDAzOTcxM0Q2LCAweDE1NTU1NTU1LCAweDNDOTMwOUQ5LCAweEVEMjI5M0M5LCAweDU1MERDNkVGLCAweDAyMDIwMzAxLCAweDk2OTkyRkQ5LCAweDQ5NjY5NzQ5LCAweDI0MzNDNkNFLCAweDQwQzBDMDgwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDAzOTYwMzk3LCAweDg4ODg4QTg4LCAweEI5M0M5RkQyLCAweDMzQ0IzQ0FDLCAweDBCQjVDRjBGLCAweDA5MDkwRDBELCAweDUwMDE1MDAwLCAweDAwMjAwMzAzLCAweEI2QUFGRkZGLCAweDAzMDMwMzAxLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDY4MzY4NDAyLCAweDI4NkEzNjgzLCAweEI2ODlGRkZGLCAweDcwNjA2MDQwLCAweDZERTlCNUQwLCAweEI4RERGNkE3LCAweDBCQjZDRUYwLCAweDUwNTA3MDcwLCAweDZEQjZCNEQ5LCAweDNCNkRCNkRCLCAweDAzOTcxM0Q1LCAweDE1RDU1NTU1LCAweDNDOTMwM0RELCAweDMxMkVEM0U5LCAweDZENjlENzMyLCAweDIyMjMyMzgxLCAweDZEQjBGRjAxLCAweERCNkRCNkRCLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDE0QTEwMkQ1LCAweDRBMTRBMTRBLCAweEI2QUFGRkZFLCAweEY0RjQ3NEY0LCAweDlGQjlCOERCLCAweEZCOUZCOUZCLCAweDNDQTk1NTA4LCAweDU0NTQ1NDc0LCAweENCNERCMkNELCAweEI4REI0REI4LCAweDM0ODdDRUYwLCAweDBEMEQwRDBELCAweDFEODE2MDA3LCAweEQ4MUQ4MUQ4LCAweEI2OEFGRkZGLCAweDA5MDkwOTA5LCAweDk0OTkwREQxLCAweDQxRjQ5OTQxLCAweEE2MjlENzU0LCAweDRDNEM0QzRDLCAweDkzQ0ZCREQ3LCAweEU3OTNDRkU3LCAweDM0QzkzQ0E4LCAweDhBQTJBMEFCLCAweERCNERBRkQyLCAweEI0REI0REI0LCAweDNDQTdDRUYwLCAweDBEMEQwRDBELCAweEU0Q0UyMkNFLCAweDRDRTBDRjRDLCAweEI2ODlENzMzLCAweDM5MzEzOTExLCAweDlGQjlCOUQ0LCAweEZCOUZCOUZCLCAweDNDQTk5RTBBLCAweDU0NTQ1NDU0LCAweDZDNzZCMkRDLCAweEM3NkM3NkM3LCAweDNDQThDRjEwLCAweDM1MzUzNTM1LCAweDFEOTlDMDA3LCAweEQ5OUQ5OUMxLCAweEI2ODlGN0RFLCAweDA3MDcwNzA3LCAweDBCNDZENDAwLCAweDMxMDMwNjMxLCAweEJFQUFGRkZGLCAweEQ4RDhEOEQ4LCAweDlGQjlCOUQzLCAweERGOUZCOURGLCAweDNDQThBRTZCLCAweDU0NTQ1NDU0LCAweERBNkRBQ0Q2LCAweEE2REM2NUE2LCAweDNDQThDRUVGLCAweDM1MzUzNTM1LCAweDZGQjZCN0QxLCAweERFRUM3NkM3LCAweDQ0QzdENzMyLCAweDcwNjA2MDYwLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDM0QzgzQ0E5LCAweEEyMkFBQUFBLCAweDNBOUE0NEQxLCAweDI5M0U5M0M5LCAweDVEMjZDRjBGLCAweDgzODM4MTgxLCAweDREQjExMDAzLCAweERCMERCMkRCLCAweERGNTZGRkZGLCAweDAyMDMwMTAxLCAweEY0OTcwMkQyLCAweDRBMTQxOTQ5LCAweEE2MjdFRjk4LCAweEVDRUM2QzZFLCAweEVEQjZCOUQxLCAweERGMURCN0ZCLCAweDNDQTg0NEU5LCAweDc0NTdERDc3LCAweERCNERBQkRBLCAweEI0REI0REI0LCAweDNDQTdENzEyLCAweDBEMEQwOTA5LCAweEVCQkVCOUM5LCAweEJCRUJCRUI0LCAweDNDQzhCRUNFLCAweDU0NTQ1NDU0LCAweEUzRjZCNUQ0LCAweDI2RTNGNjNFLCAweDQ0QzhCRUNELCAweDE1MTUxNTE1LCAweDFDMjFDMDEyLCAweERBMUMyMUMyLCAweEI2QUFGRkZGLCAweDI3MzcyNzI3LCAweDYzNDZCRjE5LCAweDM0NjM0NjM0LCAweEJFQUJGRkZGLCAweERDRDhEQ0Q4LCAweDFEQjFCN0QxLCAweERCMURCMURCLCAweDNDQTg5RTRBLCAweDU0NTQ1NDU0LCAweDVBNjRBOUQzLCAweEE2NEE2Q0E2LCAweDNDQThDRjEwLCAweDM1MzUzNTM1LCAweEI2NEI1N0RDLCAweDY0QjY0QjY0LCAweEI2ODlDNkVGLCAweDM0MUMxNDM0LCAweEVCNERCMkQzLCAweEQ0RUI0REQ0LCAweDNDQThDRjEwLCAweDVDNUM1QzVDLCAweEMzNjRBOEQzLCAweDMyQzM2NDMyLCAweDNDQThBNjI5LCAweDE1MTUxNTE1LCAweDlDMjlCRTFGLCAweEMyOUMyOUMyLCAweEJFQ0RGRkZGLCAweDE3MTcxNzE3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYzMDZCQjA2LCAweDM0NjMwNjM0LCAweEI2QUFGRkZGLCAweEQ4RDhEOEQ4LCAweDlEQjlCOUNFLCAweERCOURCRkRCLCAweDNDQThCNjhELCAweDU0NTQ1NDU0LCAweERDNkRBRkQ0LCAweEM2REM2REM2LCAweDM0QThDNkNFLCAweDM1MzUzNTM1LCAweDFDMTlDNjBFLCAweEMxOUMxOURBLCAweEI2QUFGRkZGLCAweDM3MzczNzM3LCAweDYzNDZCQzIxLCAweDM0NjM0NjI0LCAweEJFQUNGRkZGLCAweERDRENEQ0RDLCAweDlERjFCOEQ4LCAweEZCOURGMUZCLCAweDNDQTg4REVBLCAweDU0NTQ1NDU0LCAweDQ4NjRBN0QyLCAweDlFNDg2NDg2LCAweDNDQzhENzExLCAweDM1MzUzNTM1LCAweDkwMTFCRjAyLCAweDA5OTAxMUQ5LCAweEI2OEFGRkZFLCAweEI3MDcwNzA3LCAweDZEQjZGRjA0LCAweERCMERCNkRCLCAweEVGQkJGRkZGLCAweDAxMDAwMDAwLCAKKwkJMHg2REI2RkYwMSwgMHhEQjBEQjZEQiwgMHhGRkRFRkZGRiwgMHgwMjAyMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MUI2RkYwMywgMHhEQjZEQjZEQiwgMHhFRjlERkZGRiwgMHgwMDAwMDA0MCwgMHg4MjRCQzQwMywgMHg1QjYyRjYzNSwgMHg0NTBBRjdERiwgMHhDMDcwNTQ1NSwgMHg2REI2QjREQywgMHhEQjFEQjZEQiwgMHgzNENBNjVDOCwgMHhBRDJCMEEwMiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHg2NUM4RDczMSwgMHgzNTM1MjUyNSwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgwMzk2QjY4RSwgMHg1QzU0NTQ1NCwgMHg2REY2QjlDRCwgMHhEQjYzQjZEQiwgMHgwMzk2Q0YwQiwgMHg1NUQ1OTUzNSwgMHhBM0UyMTFFMiwgMHg0REE0OTM2OSwgMHgyQzMxQ0YxMCwgMHhGRDAyODAwMCwgMHgzNkExNTZEQSwgMHg0RDM2OUE0RCwgMHgwM0I2QzZDRiwgMHg1NzcwQzAwMCwgMHhFREI3QjlEMSwgMHgzQkVEQjZGQiwgMHgwMzk3MUMxNSwgMHhENTU1NTU1NCwgMHgzNzMzOUFEMSwgMHgzMUU4RUQ3MywgMHgwMzk1QzZFRiwgMHgwMjAzMEQwRCwgMHhDOTNDQUFEMSwgMHg4NkM5N0NCMywgMHgwMzk2RDczMCwgMHg3MDU4NTg1OCwgMHg1MzY1QUJENCwgMHhCNjU5NjVCNiwgMHgwMzk3MjQzNCwgMHg1NTU1NTUxNSwgMHg1MzEzNkREMSwgMHg2REE2RTM0OSwgMHgwMzk2QzZDRiwgMHhENTA5MDIwMCwgMHhBNEU5NTdEQSwgMHg2OUI0RDM2OSwgMHgwQkI2QzZDRiwgMHg1NTYwMDAwMCwgMHg5RTQ5QkREQywgMHgzQ0ZFNzkzQywgMHgwMzk3OTYwRiwgMHg1NTU1NTc1NCwgMHg0MzI0OUVENiwgMHg4RTQ5MjREMiwgMHgwMzk3NzU4RSwgMHg1NTU1RDUxNSwgMHgzMzEyNTdEMCwgMHg0RDI0REI0OSwgMHgwMzc2QzZFRiwgMHhENTBCMDAwMCwgMHgyNEFGNDREMywgMHg0OUE0OTI0OSwgMHgwQkI2QzZDRiwgMHg1NzYwMDAwMCwgMHhGRkY5QkJENSwgMHhGRkZGRkZGRiwgMHgwMzk3ODVDRiwgMHg1NTU1NTc1NCwgMHhDREU0QTdENCwgMHg5M0Q5RjRBNiwgMHgwQkI1Q0YxMCwgMHgwOTA1MzUxNSwgMHhEQkY2QjREMywgMHhCQkRENEVENCwgMHgwQkI2REY1MiwgMHg1QzVDNTg1OCwgMHhDRDI0QTJEOCwgMHgzMjQzNjRGMiwgMHgwMzk3NzU4RCwgMHgxNTk1RDVENSwgMHgyMzEyMEZEMiwgMHhERDJGODJGMSwgMHhCNjhBRDcxMiwgMHg3ODk4RjJGMywgMHhFNkQxNzZEMywgMHg0REM2RDU2RCwgMHgwQkI2QzZDRSwgMHg2MDYwNDA0MCwgMHg5M0NGQkRENywgMHgzQ0YzQ0ZFNywgMHgwMzk2MDM5NywgMHhBODg4OEE4OCwgMHgzODlBM0FEMSwgMHgyOTNDOTNBOSwgMHgyNDMzQzZFRSwgMHgwMzAzMDEwMSwgMHgyREIxMEMwMSwgMHhEQjZEQjBEQiwgMHhFNzk5RkZGRiwgMHgwMDAwMDEwMSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2QUI2QkEwMCwgMHgyQzAyQzYyQiwgMHhCNjg5RjdERSwgMHhEMEQwNzA3MCwgMHhEREJFQjRENCwgMHhCQkRENEVENCwgMHgwMzk2RDczMSwgMHg1QzVDNTg1OCwgMHg1RjZEQTdEQiwgMHgzNjUzNkQzNiwgMHgwMzk3ODVBRCwgMHgxNTk1OTVENSwgMHg5MTA5QzIwMCwgMHhDQTlDQzkwQywgMHhCNjg5RkZGRiwgMHgzRjNGMUY5RiwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHhFMjYwQzIwMywgMHgzNTYzNTgyNSwgMHhCRUFCRkZGRiwgMHhEQ0Q0NzRGNCwgMHgxREI3QjZENywgMHhEQkZEQjFEQiwgMHgzNEE4QUU2QiwgMHg1NDU2NTc1NywgMHg2QkZEQjBEOCwgMHhENzVGQURDNywgMHgzQ0E4REYzMSwgMHg1NUQ1MzUwNSwgMHgzMjdCM0VFMSwgMHg2REI0RDM2RCwgMHg1RDI3RDczMCwgMHg1NTAyMjA4QSwgMHgyNjlGNzVDRiwgMHg0RDI0OUI0RCwgMHg0NEM4RDcxMCwgMHg1NTU4NDBDMiwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgzNEE4M0NBOSwgMHg1NTU1RkZGRSwgMHgzNEUyNzlEMSwgMHgyOUNBQTM4QSwgMHgzQ0E2RDcxMCwgMHgwMzg5MDkwRCwgMHhFNENFMEVFMCwgMHg0Rjk0Q0Y0QywgMHhCNjg4RDczMywgMHgzMjEzMzExMSwgMHg5RkI5QjlENCwgMHhGQjlGQjlGQiwgMHgzNEE5OTYwQSwgMHg1NDU0NTQ1NCwgMHg2Qzc2QjJEQywgMHhDNzZDNzZDNywgMHgzNEE4Q0YxMCwgMHgzNTM1MzUzNSwgMHgxRDk5QzAwNywgMHhEOTlEOTlDMSwgMHhCNjg5RjdERSwgMHgwNzA3MDcwNywgMHgwQjQ2RDQwMCwgMHgzMTAzMDYzMSwgMHhCRUFBRkZGRiwgMHhEOEQ4RDhEOCwgMHg5RkI5QjlEMywgMHhERjlGQjlERiwgMHgzNEE4QUU2QiwgMHg1NDU0NTQ1NCwgMHhEQTZEQUNENiwgMHhBNkRDNjVBNiwgMHgzNEE4Q0VFRiwgMHgzNTM1MzUzNSwgMHg2Qzc2QjZENCwgMHhERjZERjZDNywgMHgzQ0M4RDcxMiwgMHg1MDcwNzA3MCwgMHg2REI2QjZENiwgMHgzQjZGQjZEQiwgMHgzNEE4M0NDOSwgMHgxNUQ1RDU3RiwgMHgyRTkyMTJDQywgMHgyRDJFQzJFOSwgMHg5NjI3RDczMiwgMHhCM0EzRTFFMSwgMHgwREIxMDIwMSwgMHhEQjZEQjZEQiwgMHhGN0RERkZGRiwgMHgwMDAwMDEwMSwgMHg4MjYwQzIwMCwgMHgzNTYyNTgyNSwgMHhCNkFCRkZGRSwgMHhGQ0Q0RjRGNCwgMHg3QjZFQjNEMiwgMHhCQUZCNjlENywgMHgzNEE4N0RBOSwgMHg1NDU2NTY1NywgMHhEQkJEQUVEMywgMHhBNkRCRjVCOCwgMHgzNEE3REY1MywgMHgyNTI1MDUyRCwgMHhFQkJFQjlDOSwgMHhCQkVCQkVCNCwgMHgzQ0E4QkVDRSwgMHg1NDU0NTQ1NCwgMHhDQjY0QTREMSwgMHhGMjQzNjRCNSwgMHgzQ0E4QkVBQywgMHhENTE1MzUxNSwgMHhBM0VBNEREOSwgMHg2RDM0OUE2OSwgMHg1NTI4Q0YxMCwgMHg1NTAwMDA4OCwgMHgyNkIxNEZEOSwgMHg0RDM0RDM0RCwgMHgzQ0E3QzZFRiwgMHg1N0UwMDAwMCwgMHg5RkY5QkFEQywgMHhGRkZGRkZGRiwgMHgzNEE5N0RBOSwgMHg1NTU1NTc1NCwgMHhEQTY1QThENywgMHhCN0Q4NkM4NiwgMHgzNEE4RDcxMSwgMHgwRDI1MjUzNSwgMHhBMUIyMTJEMSwgMHg1NEM1QkI1NywgMHhCNjg5QzZFRiwgMHgwMTBBM0UxNCwgMHhFQjREQjJEMywgMHhENEVCNERENCwgMHgzNEE4Q0YxMCwgMHg1QzVDNUM1QywgMHg0RDFDOUFENSwgMHhGMUMzMjNEMiwgMHgzNEE4QTYyOSwgMHhENTE1MTUxNSwgMHgyMjVBNDdENiwgMHg2REI0OTI2OSwgMHg2RDQ3RDczMSwgMHg1NTAwODBBOCwgMHgyM0M5NDJENSwgMHg0RDM0OTI0RCwgMHg2NTQ4QzZFRiwgMHg1NTAwMDAwMCwgMHgyM0M5NDJENSwgMHg0RDM0OTI0RCwgMHg2NTQ4QzZFRiwgMHg1NTAwMDAwMCwgMHhCM0NGM0RERiwgMHg0REI2OTI2RCwgMHg3REE3RDcxMCwgMHgwNTAwODgyMiwgMHhFNzA5MDBGNywgMHg3MEU3M0U3MCwgMHhCNjg5REY3NywgMHg5OTk5OTk5MCwgMHg5REI5QjlDRSwgMHhEQjlEQkZEQiwgMHgzNEE4QjY4RCwgMHg1NDU0NTQ1NCwgMHhEQzZEQUZENCwgMHhDNkRDNkRDNiwgMHgzNEE4QzZDRSwgMHgxNTM1MzUzNSwgMHgxQzE5QzYwRSwgMHhDMTlDMTlEQSwgMHhCNkFBRkZGRiwgMHgzNzM3MzczNywgMHg2MzU2QkQwMSwgMHgzMzYzMTAzNCwgMHhCRUFCRkZGRiwgMHhEOEQ4RDhEQywgMHgxQjZGQjREMCwgMHhCNERCN0VENywgMHgzNEE4Q0VFRSwgMHg1QzU0NTY1NiwgMHhFRTc2QjJEQSwgMHhCQUVEQjYzQSwgMHgzNEE4QkVBQywgMHg1NTU1OTUzNSwgMHgzM0EyNzZEMiwgMHg2RDM2REI2OSwgMHgzQ0E3RDczMCwgMHg1NTI5MDBBMCwgMHgxRDk0QzYwMywgMHg1NEQ1MDkwQSwgMHhCNkFCRkZGRiwgMHg1RERGOTcwRCwgCisJCTB4NkRCMEZGMDEsIDB4REIwREIwREIsIDB4RjdERUZGRkYsIDB4MDIwMzAyMDIsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjI0QUJBMUMsIDB4MUI2QTM2MjQsIDB4M0NFQUZGRkYsIDB4QzA3MDVDRDcsIDB4QzkyNEEyRDgsIDB4OTI5OTI0QjIsIDB4MkNFQkFFQUIsIDB4RjVCRDJGMkYsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDNCNENGMEYsIDB4MDJDMDcwNTgsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NzZEOEQsIDB4NUM1NTU1NTUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4ODg4ODhBODgsIDB4REI2REFBREEsIDB4M0VEQjZEQjYsIDB4MDM5NzdEQUUsIDB4MzU1NTU1NTUsIDB4QzM2NEE3RDIsIDB4MzI1OTNGQkUsIDB4MDM5NkM2RUYsIDB4MDAwQjI1OTUsIDB4OTc0OUMxMDksIDB4REIzMTk5NEUsIDB4QkVBQkY3REUsIDB4MDlBNTU3NUYsIDB4MzREMjE2RDUsIDB4NEE5NDk2NjksIDB4MUJGM0M2RUYsIDB4MDAwMEMwNjAsIDB4NDkyNDlDRDYsIDB4QkZDOTI5OEUsIDB4MDM5N0M2Q0MsIDB4Nzg1NjU1NTUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4OEFBMDhBODgsIDB4MzhFNEE1Q0YsIDB4RkE0NzFDOTIsIDB4MDM5NzRDRDAsIDB4MzU1NTU1NTUsIDB4NTk2NUE5RDYsIDB4QjZGM0NEM0UsIDB4MEJCNkQ3MkUsIDB4MDJBRDU1NTUsIDB4QzkyNEE0RDYsIDB4QkNEQjI3OTIsIDB4MDM5N0FFOEMsIDB4Nzg1NzU1NTUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MDM5NjAzOTcsIDB4OEE4ODhBODgsIDB4NUJBRUIxRDksIDB4M0FFQkFFRDcsIDB4MDM5NzI0MzQsIDB4MTU1NTU1NTUsIDB4NEIyNEE3RDMsIDB4OTMxQkZDMzYsIDB4MEJCNkM2RUYsIDB4MEEyNUQ1NTUsIDB4MzY5QzY2RDYsIDB4NTRDNzFBNEQsIDB4NzU2OUQ3MzEsIDB4MkEyODAyMDksIDB4NkI0REI0RDAsIDB4RDc3Qjc3RDcsIDB4MDM5NkM2Q0YsIDB4NTY1NDU0NUMsIDB4QzMyNEE1RDUsIDB4QTY0REE0MzYsIDB4MDM5N0JFQUMsIDB4MzUxNTE1OTUsIDB4MkM1QTFDRTUsIDB4ODZBQTYyQzYsIDB4QjY4QUQ3MzMsIDB4NTQ0NDdDNkMsIDB4NkJFRkI0RDAsIDB4QkZEQkI1QTcsIDB4MEJCNkNGMTAsIDB4NTg1MDcwNzAsIDB4NUI2REFDRDUsIDB4MzY1RjZEQjYsIDB4MDM5NzJDNTMsIDB4MTVENTU1NTUsIDB4MkM5MjAwQ0QsIDB4MzEyMkMyRTksIDB4OTVFNkVGQjcsIDB4M0IzQkJCQTksIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjMwNkMwMEQsIDB4MzU2MzQ2MzAsIDB4QjZBQkZGRkYsIDB4RDREQ0Q4REMsIDB4NkQ0RUI1RDAsIDB4Qjc3RDcxQkIsIDB4MDM5N0M2RUUsIDB4NTY1NjU0NUMsIDB4NDMyNEE1RDIsIDB4ODY0QkU0RjYsIDB4MDM5NkM2Q0MsIDB4MzUzNTE1OTUsIDB4OUNBOUMwMDIsIDB4REExMDIxQzIsIDB4QkVBQ0ZGRkYsIDB4MDcyNzI3MzcsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjMwNkJGMDMsIDB4MUI2N0I2QUIsIDB4QjZBQkZGRkYsIDB4ODA0MDcwRDgsIDB4QTQ5QTVGRDQsIDB4NDk5NkQzNEQsIDB4M0NBN0NGMTAsIDB4MDJDMDcwNUMsIDB4RURBRUIzRDYsIDB4RDg5RDc2QkEsIDB4MzRBODlFMkEsIDB4NUM1NTU1NTUsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MkM4ODM0QTksIDB4RkJFRUFBOEEsIDB4NkRCNkI1RDYsIDB4Mzc2REI2REIsIDB4MkM4ODNDQzksIDB4MzdGRkZGRkYsIDB4NUQ2REE5RDgsIDB4QjcxQTdEM0EsIDB4M0NBOEQ3MzAsIDB4MEIyNTk1NTUsIDB4OTQ0REMzMDcsIDB4MDE1Q0E5NTAsIDB4QkVBQkZGRkYsIDB4MzU5NzVGNUQsIDB4NjM0NkJEMEQsIDB4MzU2MzQ2MzUsIDB4QkVBQ0ZGRkYsIDB4RENEOERDREUsIDB4OUZCOUI5RDQsIDB4RkI5RkI5RkIsIDB4MzRBODk2MEEsIDB4NTQ1NDU0NTQsIDB4NkM3NkIyREMsIDB4Qzc2Qzc2QzcsIDB4MzRBOENGMTAsIDB4MzUzNTM1MzUsIDB4MUQ5OUMwMDcsIDB4RDk5RDk5QzEsIDB4QjY4OUY3REUsIDB4MDcwNzA3MDcsIDB4MEI0NkQ0MDAsIDB4MzEwMzA2MzEsIDB4QkVBQUZGRkYsIDB4RDhEOEQ4RDgsIDB4OUZCOUI5RDMsIDB4REY5RkI5REYsIDB4MzRBOEFFNEIsIDB4NTQ1NDU0NTQsIDB4REE2REFDRDYsIDB4QTZEQzY1QTYsIDB4MkM4OENFRUYsIDB4MzUzNTM1MzUsIDB4REJGNUI0RDEsIDB4RDREQjREQkIsIDB4MzRBOERGNTMsIDB4NTg1ODU4NTgsIDB4REQ2REE5REIsIDB4MzZEMzZERjYsIDB4MzRBODdEODgsIDB4MTU5NUQ1RDUsIDB4MkYxMjAwRDAsIDB4MzUwMzUyMzAsIDB4QjY4OURGNzcsIDB4MUUxQjFCOUIsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjM1NkJGMDQsIDB4MzA2MzQ2MzUsIDB4QkVBQkZGRkYsIDB4RDhEOEQ4REMsIDB4OUI2RkIyQ0YsIDB4Qjc2QjZFQjYsIDB4MzRBOEJFQUQsIDB4NTQ1NDU2NTYsIDB4NDlFNEExRDUsIDB4QTY0OUE0OUUsIDB4MzRBOEQ3MTAsIDB4MzUzNTI1MjUsIDB4NkQ3RUI0RDMsIDB4QkI5RDdFQkIsIDB4MzRBOEJFQUQsIDB4NTQ1NDU0NTQsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MkNBODM0ODksIDB4RkZFRUZGRkYsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MkM4ODM0QTksIDB4RkJBRUFBQTIsIDB4OTNDRkJERDcsIDB4M0NGM0NGRTcsIDB4MkM4OTM0QTgsIDB4RkVBQUFBOEEsIDB4NDkyNEE1RDQsIDB4QTdERjY0QjIsIDB4MzRBOEM2Q0MsIDB4MjVENTU1NTUsIDB4MjQ5QTBGRDQsIDB4MzUyQzkyNjEsIDB4NDRDNkNFRUYsIDB4MDA4MDAzMDksIDB4MjJDM0JFMDksIDB4MkY2MkYwMkYsIDB4QUU2OEY3REUsIDB4RjBGMkYzRjksIDB4RUI0REIyRDMsIDB4RDRFQjRERDQsIDB4MkM4OENGMTAsIDB4NUM1QzVDNUMsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MkM4ODM0QTksIDB4RUZFQUFBMjIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MkM4ODM0QTksIDB4RUZBRUFBMjIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MkM4ODM0QTksIDB4RUVBRUFBQTIsIDB4MDAwMEJGQkYsIDB4MDAwMDAwMDAsIDB4MkNBODM0ODksIDB4QkZGRkJGRkYsIDB4Q0I0Q0IxQ0IsIDB4QjRDQjRDQjQsIDB4MkM4N0NFRjAsIDB4MEQwRDBEMEQsIDB4RDUwRDAzRDIsIDB4NTBEMTBENEMsIDB4QjZBQURGMzUsIDB4OTk5OTE5OTksIDB4OURCOUI5Q0UsIDB4REI5REJGREIsIDB4MzRBOEI2OEQsIDB4NTQ1NDU0NTQsIDB4REM2REFGRDQsIDB4QzZEQzZEQzYsIDB4MkM4OEM2Q0UsIDB4MzUzNTM1MzUsIDB4MUMxOUM2MEUsIDB4QzE5QzE5REEsIDB4QjZBQUZGRkYsIDB4MzczNzM3MzcsIDB4NjhCNkZGMDAsIDB4MDAwNDA2ODMsIDB4QkVBQkZGRkYsIDB4ODA0MDYwNzAsIDB4MjQ5MjRCRDIsIDB4NDk5NjkzNEQsIDB4NDRDN0Q3MTAsIDB4MDJDMDcwNTgsIDB4REI2REFGRDYsIDB4RDg5QjZFQjYsIDB4MzRBOEE2NEEsIDB4NUM1NTU1NTUsIDB4OTNDRkJERDcsIDB4M0NGM0NGRTcsIDB4MkM4OTM0QTgsIDB4RUVBRUE4OEEsIDB4MzJDMzI1Q0EsIDB4MjgzMkMzMjgsIDB4QTY2OEQ3MTIsIDB4RTFFMUUxRTEsIAorCQkweDZEQjBGRjAxLCAweERCNkRCNkRCLCAweEZGRkVGRkZGLCAweDAwMDAwMjAxLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYyNkFDMzBBLCAweDFCNjgzNjM0LCAweDJDQ0FGRkZGLCAweDgwNjA1OEQ3LCAweEI2REI4NkQ4LCAweDZEOTcxQjZELCAweDI0RUJDRjEwLCAweEQ1RkRBRjBCLCAweDAwMDBCRkJGLCAweDAwMDAwMDAwLCAweDQ1NDlDRjEwLCAweEZEMEEwMDc4LCAweDUzNkRBOUQ4LCAweEI2NUI2REI2LCAweDI0NTBDNkVFLCAweEFBMDAwMEQ1LCAweDI0OTMwQUQ5LCAweDNGREIxQTQ5LCAweDc1NjhFRkIzLCAweDJCQkE4QUFELCAweEQ3MDlDMzAyLCAweEMwMDAwMkM5LCAweEI2QUFGRkZGLCAweDAwMEJCNTVGLCAweDZEQjBGRjA5LCAweERCNkRCNkRCLCAweERGNzdGRkZGLCAweDAwMDAwMDAxLCAweDAzMTBBRTAwLCAweDAzNjFCMDY4LCAweEI2QUJGRkZGLCAweDAwODA3MDU0LCAweDM2OTIwMERELCAweERDOTcyRjQ5LCAweEJFQUNGRkZGLCAweDc4NTVGNTdGLCAweDI3MUM0QkQyLCAweDNDOTQ5MjQ5LCAweDY1MkRDRjBGLCAweEFBMDAwMDU3LCAweDI0OTMwMkRBLCAweDNGNkFEQTQ5LCAweDdEODhENzUyLCAweDBBQUEwMEFELCAweDVCNERENjAwLCAweDAwNjAwMzhFLCAweEJFQUJGRkZGLCAweDAwRUQ1NURGLCAweDI0ODIwMkNGLCAweERDOTRFNjQ5LCAweDlFMjZGN0I5LCAweEY4RkZBQjdBLCAweEE4RTQ0OERELCAweEZGOTREMzY5LCAweDRDQ0ZDRjBFLCAweEFBMDAwMDU3LCAweDI0REIxNUQ4LCAweDNGNTg5MjQ5LCAweDZENENENzMwLCAweDJBQTAwMkI1LCAweDlBNDlCRjA0LCAweEMzMDAxNDUyLCAweEJFQUJGRkZGLCAweDAyMjU1NzdGLCAweDgzNTNDQTA1LCAweDZDNjM1RTM1LCAweEJFQUJGRkZGLCAweDVDRDRENkQ1LCAweEE4RTM2M0Q0LCAweDI0OTREMzY5LCAweDM0NzJDNkNFLCAweDAwMDAwMDU2LCAweDM1MUI1RkQxLCAweDI0OTQ5MjRELCAweDNDOEZENzJGLCAweEFBMDAwODM1LCAweDI3RUEwM0Q2LCAweERDRTVGQTdCLCAweEJFQUJFNzk5LCAweDYxNUQ1Nzc3LCAweDM5MUE2MEQ3LCAweDI0OTY5QTRELCAweDNDOEVENzJGLCAweEFBMDA4MDU4LCAweEI5MUM2M0Q2LCAweDI0OTY5QTY5LCAweDM0NzJDNkNFLCAweDAwMDAwMEQ1LCAweDkwQzlDMTAxLCAweDAxQzBBOTBDLCAweEI2QUFGN0ZFLCAweDI1MzcxRjFGLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDk0QjEwMEQyLCAweEI3OTRBOTRBLCAweEI2ODlFRkJCLCAweDVDRjRCNDlDLCAweEE4RTM1RkQ1LCAweEU0OTY5MzY5LCAweDQ0QjBENzBFLCAweEEyMDAyMDU3LCAweEI3MjQ2MkRBLCAweDI0OTZEMzY5LCAweDQ0QUZENzBGLCAweEEyMDAwODM1LCAweDFEOTlDMTBCLCAweERCM0Q4NUQ5LCAweEM2Q0RGRkZGLCAweDA5MEQwNTA1LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAzNjBCNjAwLCAweEQ4MDQwMEFDLCAweEI2QUJGRkZGLCAweDAwRTA1OEQ3LCAweDI2OTIwMERFLCAweERDOTRFNjQ5LCAweDhERTVGN0I3LCAweEY4QkZBQTdBLCAweDI0RDM1NkNCLCAweERCOTA5MjY5LCAweDRDRTZDRjBGLCAweEEyMDAwMDU1LCAweDI0RDIxNENELCAweDNCNTY5MDQxLCAweDZENjZENzMwLCAweDJBQTAwMkI1LCAweDlBNDlDMTAwLCAweDAwMDAxNDUyLCAweEI2QUJGRkZGLCAweDBCMzU1NzdGLCAweDBEODEzOTA5LCAweERCNkRCNkRCLCAweEFFOEFGRkZGLCAweDAwMDAwMjA5LCAweDYzNTZDMDAxLCAweDY4NjM0NjM1LCAweEJFQUJGRkZFLCAweDUwRDhEQ0RDLCAweEE3MUI1NkQ3LCAweDI0OTY5MzY5LCAweDVEMjdDRjBGLCAweEFBMDAwMDU2LCAweEI3MUM1MERELCAweDNGOTZEQTQ5LCAweDY1MjZDRjEwLCAweEFBMDAwMDM1LCAweDlEOTlDMjAwLCAweDAxMzAxNUQ5LCAweEI2ODlGRkZFLCAweDBEMDUwNzA3LCAweDAzNDZDMzAwLCAweDY4MDM0NjMxLCAweEI2QUFGRkZGLCAweDUwRDhEOEQ4LCAweEE2REE0RUQzLCAweEU3OTQ5MjY5LCAweDY1NDdDRjBGLCAweEFBMDAwMDU2LCAweEE3MUM1OEQ5LCAweDI0OTREMzRELCAweDY1NDZDRjEwLCAweEFBMDAyMDM1LCAweEE4REI0OUU0LCAweEU3OTY5QjZELCAweDY1NDZDRjEwLCAweEFBMDAwMDU4LCAweEI5MjQ1OEUxLCAweDI0OTY5QjZELCAweDY1NDdDRjBGLCAweEFBMDAwMEQ1LCAweDlDRUREOTAwLCAweDAxM0NBNUNBLCAweEJFQUNGRkZFLCAweDM1MTcxRjE3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAzMDZDNDAwLCAweDYzMEFDMDJDLCAweEJFQUJGRkZGLCAweDYwNTBEMEQwLCAweEE4RTM1QURBLCAweDI0OTZEMzRELCAweDVEMjZDRjBGLCAweEFBMDAwMDU0LCAweEI2REM0RkRGLCAweDI3OTY5QTRELCAweDY1NDZDRjEwLCAweEFBMDAwMDM1LCAweEE4RTM1M0RELCAweDNDOTREMzZELCAweDY1NDdDRjBGLCAweEFBMDAwMDU0LCAweEE2REI1NEQxLCAweDI0OTQ5MjQ5LCAweDY1NDdDRjBGLCAweEFBMDAwMDU1LCAweEE2REI1NEQxLCAweDI0OTQ5MjQ5LCAweDY1NDdDRjBGLCAweEFBMDAwMDU1LCAweDI2REIzNkQ1LCAweDNGNzQ5MjQ5LCAweDY1NjdDRjBGLCAweEFBMDAwMEQ1LCAweDkyNERCRDA2LCAweDAxMjRFMUE0LCAweEE2NDZGN0JBLCAweDJGREZGQUFELCAweDNDQTFCOTAyLCAweEMwMEMwMEMwLCAweEFFODhGRkZFLCAweDAwMDIwRDM3LCAweDYyRjZDNTE4LCAweDQzNjJCNjJCLCAweEI2ODlGRkZGLCAweDYwRDBGMEYwLCAweDI2REE0QUQyLCAweDNDRjQ5MjQ5LCAweDY1NDZDRjEwLCAweEFBMDAwMDVDLCAweEE2REI1NEQxLCAweDI0OTQ5MjQ5LCAweDVENDdDRjBGLCAweEFBMDAwMDU1LCAweEE2REI1NEQxLCAweDI0OTQ5MjQ5LCAweDVENDdDRjBGLCAweEFBMDAwMDU1LCAweEE2REI1NEQxLCAweDI0OTQ5MjQ5LCAweDVENDdDRjBGLCAweEFBMDAwMDU1LCAweEE2REI1NEQxLCAweDI0OTQ5MjQ5LCAweDVEMjdDRjBGLCAweEFBMDAwMDU1LCAweDI0QTM0QUQ3LCAweDNGRjY5QTY5LCAweDY1NDVDRjEwLCAweEFBMDAwODBELCAweEQxMEQwNEQxLCAweEJDRjUwRTUwLCAweEI2OEFFRkJDLCAweDczRDlEOTlELCAweEE4RTM1N0RBLCAweDI0OTREMzY5LCAweDY1NDdDRjBGLCAweEFBMDAwMDU2LCAweEE1MUI1MUQ1LCAweDNDOTREMjQ5LCAweDVEMjZDRjBGLCAweEFBMDAwMDM1LCAweDkwMjFDMzAwLCAweDAxMzAxOUM5LCAweEI2OEFGRkZFLCAweDI1MjcyNzM3LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAzNThEMzAwLCAweEMwMDQwMDg4LCAweEJFQUJGRkZGLCAweDAwRTA1OEQ2LCAweDI0OTIwMEQzLCAweEZGOTRFRTQ4LCAweDlFMjZFRkJBLCAweEU4RkZBQjdBLCAweDI2REI0QkQ2LCAweERDOTQ5MzRELCAweDU0RTZDRjBGLCAweEEyMDAwMDU3LCAweDk1NERDODEwLCAweEQ5MzBBMTEwLCAweEI2QUJGRkZGLCAweDI1OTc1RjVELCAKKwkJMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMjYwQzAwMCwgMHgwMDA4MDAzMCwgMHgyQ0VDRkZGRiwgMHgwMDYwNTg1NiwgMHhCNkRCNkZERSwgMHg2RDk2REI2RCwgMHgxQ0NCNERBRCwgMHhBNUE5MjIwOCwgMHgwMDAwQkZCRiwgMHgwMDAwMDAwMCwgMHgyNEU5NDU4OSwgMHhFQUU4NzA2MCwgMHg1REI0QzMwMSwgMHhDQTkwMTlEOSwgMHgxNEE5RjdGRiwgMHgyNTBEMDkwMSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2REI2RkYwMywgMHgxQjZEQjZEQiwgMHhFRkJERkZGRiwgMHg0MDAwMDAwMCwgMHg2REI2QTAwMCwgMHgyNEIwMDZEQiwgMHg0Q0VCRkZGRiwgMHg1NzAwMDAwMCwgMHgwMDAwNUEwMCwgMHgxOTEwMDAwMCwgMHg3NUIwRjdERSwgMHgwMTAwMDAyMCwgMHgwMDAwN0UwMCwgMHgzMDAwMDAwMCwgMHg1NTRDRkZGRiwgMHg3MDAwMDAwMCwgMHg2REI2QTUwMCwgMHg3NDkwMDBEQiwgMHg0RDBCRkZGRiwgMHhENTAwMDAwMCwgMHg2MUI2MEEwMSwgMHhEQjFEQjZEQiwgMHhFNzlDRkZGRiwgMHgwMTAwMDAwMCwgMHgwMDAwOUIwMCwgMHgyNDgwMDAwMCwgMHg0RDBCRjdERCwgMHg1NDAwMDA4MCwgMHgwMDAwOTgwMCwgMHgxNDkwMDAwMCwgMHg0RDBCRjdERSwgMHgxNTAwMDAwMCwgMHg2REI2OUQwMSwgMHgyNEQwMDBEQiwgMHg0RDBCRkZGRiwgMHg1NTAwMDAwMCwgMHg2MDM2OTkwMCwgMHg0NDkwMDAwMCwgMHg0RDBCRkZERSwgMHhENTAwMDAwMCwgMHgwMDAwOTkwMCwgMHgwQ0QwMDAwMCwgMHg1NTJDRjdERCwgMHgyNTAwMDAyMCwgMHgwMDAwOTcwMCwgMHg2Q0MwMDAwMCwgMHg0RDBDRjdERCwgMHhBNTAwMDAyMCwgMHgwMDAwOTcwMCwgMHg2MjEwMDAwMCwgMHg1RDJERkZGRSwgMHhDNTAwMDAwMCwgMHgwMDAwOUEwMCwgMHgwMjkwMDAwMCwgMHg0Q0VCRjdERCwgMHgwNTAwMDA4MCwgMHg2MDAwMzQwNiwgMHgzQjYxQjZEQiwgMHhBRTkzRkZGRiwgMHg0MDAwMDBBQSwgMHgwMDAwOTYwMCwgMHgwMDEwMDIwMCwgMHg0NEVCRkZGRSwgMHgwMTAyMDAwMCwgMHg2REI2RkYxOCwgMHgxQjZEQjZEQiwgMHhERjdCRkZGRiwgMHg0MDAwMDAwMCwgMHg2REI2OUQwMSwgMHhBNDkwMDBEQiwgMHg0Q0VCRkZGRiwgMHg1NTAwMDAwMCwgMHg2REI2NzYwNCwgMHhEOTlEQjZEQiwgMHg1NTJDRkZGRiwgMHgwOTAwMDAwMCwgMHg2REI2OTYwMCwgMHgyNjgwMDZEQiwgMHg0Q0VCRkZGRiwgMHg1QzAwMDAwMCwgMHgwMDA2OUEwMCwgMHg2NDkwMDAwMCwgMHg0NTBCRjdERSwgMHg5NTAwMDAwMCwgMHg2MDQxMDgwNywgMHhEQjZEQjZEQiwgMHhERjc3RkZGRiwgMHgwMDAwMDA3NywgMHgwNDEwNEIwMSwgMHgyMzZEQjZEQiwgMHg4RTBGRkZGRiwgMHg0MDAwMDA4QSwgMHgwMDAwQTEwMCwgMHg2NDkwMDAwMCwgMHg0RDBCRkZGRiwgMHhENTAwMDAwMCwgMHg2REI2ODUwMCwgMHgyMDAxQjZEQiwgMHg1NTRDRkZGRiwgMHg0MDAwMDAwMCwgMHg2REI2OUEwMSwgMHhBNDlDMDBEQiwgMHg0RDBCRkZGRiwgMHg1NTAwMDAwMCwgMHg2REI2M0YwNCwgMHhEODFEQjZEQiwgMHhBNjk1RkZGRiwgMHgwOTAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MUI2OUMwMiwgMHgyNTZDMzZEQiwgMHg0RDBCRkZGRiwgMHg1ODAwMDAwMCwgMHgwMDgwQjAwMCwgMHg1MkQwMDBEOCwgMHg0RDBDRjdERCwgMHhCNTAwMDAyMCwgMHg2MDAyNkMwMCwgMHgyMzYwMzYwMywgMHg4NUYwRkZGRiwgMHg0MDAwMDAwMiwgMHg2REI2OTkwMSwgMHgyNDkwMDBEQiwgMHg0Q0VCRkZGRiwgMHg1NTAwMDAwMCwgMHg2REI2QTAwNCwgMHg2MTExQjZEQiwgMHg0NEVBRkZGRiwgMHg4OTAwMDAwMCwgMHg2MDM2NTUwMCwgMHgwMDEwMDAwMCwgMHg4REYxRkZGRiwgMHgwMTAwMDA4MCwgMHg2MDAwNzUwNSwgMHgzMzZEQjZEQiwgMHg1NTJERjdERCwgMHg2MDAwMDAyMCwgMHgwMDgwNjEwMCwgMHgyMDQwMDAxOCwgMHg4NjEwRkZGRiwgMHg0MzAwMDA4QSwgMHgwMDAwOTcwMCwgMHhBNDkwMDAwMCwgMHg0NEVCRkZGRSwgMHg1NTAwMDAwMCwgMHg2MUI2NTIwMiwgMHhDMDFEQjZDMywgMHg4RTMyRkZGRiwgMHgwOTAwMDA4MCwgMHgwMDAwOUQwMCwgMHgyNjAwMDAwMCwgMHg1NTJDRjdERCwgMHg1ODAwMDAyMCwgMHgwMDAwOUIwMCwgMHg4NDkwMDAwMCwgMHg0RDBCRjdERCwgMHhENTAwMDAyMCwgMHgwMDAwREMwMCwgMHhCMDAwMDAwMCwgMHg0Q0VCRjdERCwgMHg1MDAwMDA4MCwgMHgwMDAwOUUwMCwgMHg3NDkwMDAwMCwgMHg0RDBCRjdERCwgMHg5NTAwMDAyMCwgMHgwMDAwNTMwMCwgMHgyMDAwMDAwMCwgMHg4RTMxRkZGRiwgMHg0MDAwMDAwMiwgMHg2REI2OTAwMCwgMHg0MjEwMDBEQiwgMHg1NTJDRkZGRiwgMHgwNTAwMDAwMCwgMHg2MUI2NzUwMCwgMHgwMDEwMDAwMywgMHg2NTZFRkZGRSwgMHgwMTAwMDAwMCwgMHg2MDAwNzEwNiwgMHgyRjZEQjZEQiwgMHg2REFGRkZERSwgMHg2MDAwMDA4OCwgMHgwMDgwNUQwMCwgMHgwMDEwMDAwMCwgMHg4RTBGRkZGRiwgMHgwMTAwMDA4QSwgMHgwMDAwOEQwMCwgMHgzMTAwMDAwMCwgMHg0Q0VCRjdERCwgMHg3MDAwMDA4MCwgMHgwMDAwQUMwMCwgMHg3NDkwMDAwMCwgMHg0RDBDRjdERCwgMHg5NTAwMDAyMCwgMHg2MDQxMDcwNiwgMHhEQjFEQjZEQiwgMHhERjc4RkZGRiwgMHgwMjAwMDA3NywgMHg2MTY5MDcwMiwgMHhEQjZEQjZEQiwgMHhERjc4RkZGRiwgMHgwMDAwMDBGNywgMHg2REIwRkYwMSwgMHhEQjZEQjZEQiwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MUI2RkYwMywgMHhEQjZEQjZEQiwgMHhFRjlBRkZGRiwgMHgwMDAwMDA0MCwgMHg2MDQxMDcwNiwgMHhEQjZEQjZEQiwgMHhERjc3RkZGRiwgMHgwMDAwMDA3NywgMHg2MDQxMDcwNiwgMHhEQjZEQjZEQiwgMHhERjc3RkZGRiwgMHgwMDAwMDA3NywgMHg2MDQxMDcwNiwgMHhEQjZEQjZEQiwgMHhERjc3RkZGRiwgMHgwMDAwMDA3NywgMHg2MDQxMDcwNiwgMHhEQjZEQjZEQiwgMHhERjc3RkZGRiwgMHgwMDAwMDA3NywgMHg2MDQxMDcwNiwgMHhEQjZEQjZEQiwgMHhERjc3RkZGRiwgMHgwMDAwMDA3NywgMHg2MDYxMDcwNSwgMHhEQjZEQjZEQiwgMHhERjc3RkZGRiwgMHgwMDAwMDA3NywgMHg2MjMwMDUwMSwgMHhEQjZEQjZEQiwgMHhFNzk5RkZGRiwgMHgwMDAwMDA0MiwgMHg2MDQxMDcwNiwgMHhEQjZEQjZEQiwgMHhERjc3RkZGRiwgMHgwMDAwMDA3NywgMHg2MDQxMDcwNiwgMHhEQjZEQjZEQiwgMHhERjc3RkZGRiwgMHgwMDAwMDA3NywgMHg2RDgxMDYwMSwgMHhEQjZEQjZEQiwgMHhFNzk5RkZGRiwgMHgwMDAwMDAwOSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZFRkZGRiwgMHgwMDAwMDBDMCwgMHg2MzUwMEMwMiwgMHhEQjZEQjZEQiwgMHhERjc4RkZGRiwgMHgwMDAwMDA3NiwgMHg2RDgxMEQwMywgMHhEQjZEQjZEQiwgMHhENzU1RkZGRiwgMHgwMDAwMDAwOSwgCisJCTB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDI1OEMwMDAsIDB4MDAwNjAwMkMsIDB4MTRBQUZGRkYsIDB4MDBDMDcwRDYsIDB4MjQ5MjNFRDUsIDB4NDk5NDkyNDksIDB4MTRBODREQUYsIDB4RTRFREZBRUEsIDB4OUNDOUMwMEUsIDB4QTQ5NjQ5MTQsIDB4MTRBOUY3QkYsIDB4NTVENTk1MzUsIDB4NkRCNkZGMDgsIDB4REIwREI2REIsIDB4QjZGOUZGRkYsIDB4MDEwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjYzNkMzMDAsIDB4QTMwMjgwMjAsIDB4MzRBOEY3REUsIDB4NDA0MDQwQzAsIDB4OTI0OUMxMDQsIDB4NTI5RDkxNjksIDB4MzRBOUZGRkYsIDB4QjUwOUVENTUsIDB4NURBMUMzMDAsIDB4OUIwNUIwRDksIDB4M0NDOUY3REUsIDB4QzA4MDA5MDUsIDB4QzI2OEMwMDAsIDB4MDIxMDg5NjQsIDB4M0NDOUZGRkYsIDB4MDUzNUQ1NTYsIDB4MjI0OUMxMDAsIDB4MDAwNDAwMkQsIDB4MzRBOEZGRkYsIDB4MDA4MDdBNTUsIDB4OTAwNUNBMDIsIDB4RDZDQ0NEMDIsIDB4M0NDQUZGREYsIDB4MTczNTA1MDksIDB4MTQ5MTA4REEsIDB4QTkxRTkxQzksIDB4M0NBOUY3REUsIDB4RDQ5NEQ0NTQsIDB4MDU0OUM2MTMsIDB4QzEyREI2MDksIDB4M0NDOUZGRkYsIDB4MEEwMDhBRDUsIDB4MDI0OUMwMjQsIDB4MkY2MkY2MzAsIDB4M0NDOUZGRkYsIDB4NjA3MDdBNTUsIDB4NTQ0OUJGMDAsIDB4MDA0MUI0MDksIDB4M0NDQUZGRkYsIDB4MDEwMTI5OTUsIDB4QTEwQ0MyMDEsIDB4QTU2NjY4NDQsIDB4MzRBOUY3REUsIDB4NUNENDk2MTcsIDB4OTkxNjAwRTcsIDB4NEY5NEE5NjksIDB4M0NDOUY3REUsIDB4NTg1QzU0NTcsIDB4NTk5OUJGMDIsIDB4MzQyMkY0MjgsIDB4M0NDQUY3QkUsIDB4NTI3MzYxQ0QsIDB4NURBMUM4MDYsIDB4REIzRDg0RDksIDB4MzRBOUZGREYsIDB4MDIwMTA5MEQsIDB4NkEzNkMxMDAsIDB4QTUwMzQwMjgsIDB4M0NDOUY3REUsIDB4NTg1MDYwNDAsIDB4OUQ5OUMyMEQsIDB4MTRCQ0NEREEsIDB4MzRBOUY3REUsIDB4OTczNTA1MDksIDB4NjFCNkZGMjIsIDB4MUI2MUI2MUIsIDB4RDc1QkZGRkYsIDB4NDA0MDQwNDAsIDB4REI0REQ5MDAsIDB4NDJEQ0E5NkEsIDB4MzRBOEZGRkYsIDB4QTUyNUE1NTUsIDB4RDBBREQ2MDAsIDB4MTBDMTZBMTAsIDB4NDRDQUZGRkYsIDB4MTU5NjE1MzUsIDB4RTI1RUJGNUYsIDB4ODVFMDVFNDUsIDB4MzQ4OEY3REUsIDB4NUNEQ0RDNUMsIDB4MjY0OUMzMDgsIDB4Q0U0REI2MDksIDB4MzRBOUZGRkYsIDB4M0YwMDIyRDUsIDB4NkRCMEZGMDEsIDB4REI2REI2REIsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDMwNkI5MDAsIDB4MDAwMDAwMkMsIDB4MzRBOEZGRkYsIDB4MDA4MDcwNzAsIDB4MjI0OUMyMDAsIDB4MzVBMjgwMzAsIDB4M0NDOUZGRkYsIDB4NUU2MDdCNTUsIDB4MTIwM0IyMDEsIDB4MjMzMjMxMjMsIDB4NDRFQUZGRkYsIDB4NDM0MTQxNDMsIDB4OTI0OUJGMDAsIDB4MDExMDExODksIDB4M0NBOUZGRkYsIDB4MEQwREVENTUsIDB4OTAyMUMyMDEsIDB4NjZFMDRCMTAsIDB4MzRBOUVGQkQsIDB4OTQ5NzM1MEQsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjI0NkM2MjIsIDB4QTQ2QTQ2QTQsIDB4MzRBOUZGRkYsIDB4NTA1ODUwNTgsIDB4MjI0OUMxMEEsIDB4MzEwMkIwMzUsIDB4M0NBOUY3REUsIDB4NUE2MjVBNTUsIDB4NUJCM0EzMDAsIDB4QTA1QTAxQTAsIDB4MjQ0N0Y3REUsIDB4QzNDMUMzQzIsIDB4OTI0OUMwMjUsIDB4NzI5RDk5MDEsIDB4MzRBOEZGRkYsIDB4RjUwRDJENTUsIDB4MjU5OUJCMTIsIDB4NUIzNUI2NTgsIDB4NDRDQUZGRkYsIDB4ODM4MDhBOEQsIDB4OTAxOUNBMDAsIDB4MjY5NzQ5MEUsIDB4MzRBOUZGRkYsIDB4NTVENTM1MEQsIDB4NjMwNkMxMDEsIDB4MzczMzMwMzQsIDB4M0NDOUY3REUsIDB4NTM1MDUwNTAsIDB4MDNCMDg2NUUsIDB4M0IwM0IwM0IsIDB4NkQ4RkZGRkYsIDB4NDM0MzQzNDMsIDB4OTI0OUJGMjcsIDB4RDk5RDk5NjEsIDB4MzQ4OEZGREYsIDB4MEQwREVENTUsIDB4RENBOUMwMDIsIDB4ODY2NjRBRDQsIDB4M0NBOUY3REUsIDB4RDRENjM1MjUsIDB4NjI0NkMwNjMsIDB4ODQ2NjQ2NjQsIDB4M0NDQUZGRkYsIDB4NUM1ODVDNUMsIDB4Mjg0OUMyMDIsIDB4MTI0REI2NDksIDB4M0NDOUZGRkYsIDB4M0YwMDhBNTUsIDB4NjI1MEM0MDAsIDB4MjQ2MzUwMjQsIDB4MzRBOUVGQkUsIDB4NTA1MDUwNTAsIDB4MjI0OUMwMTIsIDB4MzAyMkIwMzEsIDB4M0NDOUY3REUsIDB4N0E2MjVCNTUsIDB4NTlCM0IxMDAsIDB4OTg1OTkxQTAsIDB4NDRFQUZGRkYsIDB4QzFDOUMxQzMsIDB4OTFBMUMzMTEsIDB4MTk5MUExMTksIDB4NDRFQUY3REUsIDB4MDUwNTA1MDUsIDB4RDAyMUNEMDAsIDB4MjY5NjY5RDAsIDB4MzRBOEVGQkQsIDB4NTU1NTM1MEQsIDB4NjJGNkJEMDAsIDB4MzM0MkMwMzAsIDB4MkM4OEY3REUsIDB4NzM3MDcwNzAsIDB4NURCNUI2MDksIDB4MjM1OUI1NUIsIDB4MzRBOUY3REUsIDB4NDM0MzgzMDMsIDB4OTI2QUMyMTAsIDB4RDkxQzIxNTQsIDB4M0NDOUZGRkYsIDB4MDkwNUQ1NTcsIDB4MjI0OUMzMDQsIDB4NERBNDM2QUQsIDB4MzRBOUZGRkYsIDB4QUE4MDdBNTUsIDB4NTAwMThDMDEsIDB4RDk0RDgwQzMsIDB4NTUyREZGRkYsIDB4MEEwMDAxMDksIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIAorCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYyNThCQzAwLCAweERCNjVCNjJCLCAweDE0QUJGRkZGLCAweDAwQzA3MDVDLCAweDI0OTIyM0QzLCAweDQ5OTA5MzQ4LCAweDBDODk1REIxLCAweDc0NUQ1RjVGLCAweDVEODJDMzA0LCAweEMyMUQ5MURCLCAweDBDODlGRkZGLCAweDA1MDkwOTAzLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDY5QjY0OTAyLCAweDNCNkRCNjAzLCAweDg1RjFGRkZGLCAweDQwMDAwMEMwLCAweDgzNERDRTAwLCAweDYwMzYwMEI1LCAweDNDQzlFRkJELCAweEMzQzA1QzU1LCAweDE5OTRCQjAwLCAweDQyOTYwOTgyLCAweDM0QTlFRkJELCAweDA1QzVDRENCLCAweDFEOTlCRjE1LCAweDU0REMyOURBLCAweDM0QTlGRkZGLCAweDk1MjUwRDBELCAweDZEQjY4MTAyLCAweDJCMDFCNkRCLCAweDVENERGRkZGLCAweDYwMDAwMDAwLCAweEIxNEJDMTA3LCAweENBOTBDREQ0LCAweDQ0RUFGRkZGLCAweDI1MTUxNzE3LCAweDE0OTEwQUQ5LCAweEU5MUU5MTg5LCAweDNDQTlFRkJELCAweDk0OTQ1NDU0LCAweDRDMDlDMzEzLCAweERCNkRCNkMyLCAweDM0QTlGRkZGLCAweDAwMDAyRjI1LCAweDYyMzZCRjY2LCAweDIzNjIzNjIzLCAweDQ0Q0FGRkZGLCAweDcwNjA3MDcwLCAweDFEODE3RjAxLCAweERCMUQ4MURCLCAweDQ0RUJGRkZGLCAweDAxMDEwMTAxLCAweDAzNDZCRjAwLCAweDlCMEE4MDMwLCAweDM0QTlGRkZGLCAweEMwNjA3MDUwLCAweEM0QkYyRkQ2LCAweDI1MkI1MjQ5LCAweDM0QThCNkI3LCAweDA1RjU1NzVBLCAweDM2QjUwMEUxLCAweDMxMkVEMkFBLCAweDM0QTlGN0RFLCAweDM1OTVENTVCLCAweDZEQjAzNjA2LCAweDNCNjFCNkRCLCAweDlFNTRGRkZGLCAweDQwMDAwMDAyLCAweDZBQTEwMEUyLCAweEQ5MjQ5NDg5LCAweDNDQTlFNzlELCAweEI1NTVENkQ0LCAweENBOTkwMEUwLCAweDUzNjQ5MjY5LCAweDM0QTlFNzdDLCAweDdBNTU1N0Q0LCAweDA1QjZCMzAyLCAweDQwMTVCNDQwLCAweDREMEJGRkZGLCAweDg5ODMwMjgwLCAweEE0RDIwNkU2LCAweEZEQTg1QTU1LCAweDM0QTlCRUY4LCAweDA1QzU1NTU1LCAweDFDQTlDMTA1LCAweENDOURBOUMxLCAweDNDQTlGN0RFLCAweDM1MDUwOTI1LCAweEUyNUVCRjYxLCAweDA1RTA1RTY1LCAweDJDODhGN0RFLCAweERDRENEQzVDLCAweDNENDlDODA2LCAweDQxMEMwNjA5LCAweDQ0Q0FGRkZGLCAweDJBMDAyQTE1LCAweDZEQjZGRjA1LCAweERCMERCNkRCLCAweEY3REVGRkZGLCAweDA5MDAwMDAwLCAweDZEQjY3MDFGLCAweDIzNkRCNkRCLCAweDY1NkVGRkZGLCAweDYwMDAwMDAwLCAweDBBNEJDMjA1LCAweEE4MEJCMDMxLCAweDNDQTlGN0RFLCAweDYwNDA3QTU3LCAweDVBMzJEMTAwLCAweDIxMUExNUEwLCAweDNDQ0FGRkZGLCAweDQ5NDk0OTQyLCAweDFEODFDNDIyLCAweDQxMUQ4MUQ5LCAweDNDQ0FGRkZGLCAweENEMEQwRDBELCAweDlBOTkwMENCLCAweDMxMkU4NkExLCAweDM0QTlFRkJELCAweDM1OTY5NDk0LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDYyNDZDNTIxLCAweEE0NkE0NkE0LCAweDM0QTlGRkZGLCAweDUwNTg1MDU4LCAweDU0OTIwN0QxLCAweDRCOTY5RkUxLCAweDNDQzlDNkY4LCAweDUwNTQ5NTU1LCAweDAzODI4ODA0LCAweDNCNDNCMDNCLCAweDc1QjBGRkZGLCAweDQxNDA0MDQzLCAweDEyNDlCRDEzLCAweDAyMUQ5OTRFLCAweDM0QTlGRkZGLCAweEFEMERBNTU1LCAweDM3QjFBMzA2LCAweDQwMjdCNjVCLCAweDU1MkNGRkZGLCAweDhBODA4MjgxLCAweEZFNEY2MjAwLCAweEM4RkRCOTg4LCAweDM0QTlGRkRGLCAweDI1MDVFNTc1LCAweEE1MzIwMEUzLCAweDRBOTQ5NTRELCAweDM0QTlFRjlELCAweDVDNTc1NTVELCAweDAzQjA4NjVFLCAweDNCMDNCMDNCLCAweDZEOEZGRkZGLCAweDQzNDM0MzQzLCAweDlEOTlCRDE3LCAweDQyMUQ5OUQ5LCAweDJDODhGRkZGLCAweEVEMEQwRDBELCAweDZBNUVCRjA1LCAweDE0RDY2QTg2LCAweDM0QTlGRkZGLCAweDk1RDZEQ0RDLCAweDYyNDZDMDY0LCAweDY0NjQ0Njg0LCAweDNDQ0FGRkZGLCAweDVDNTg1QzVDLCAweDMxNDlDQzAwLCAweDQxMjAwNjBELCAweDNDQzlGRkZGLCAweEFBMDAyQTE1LCAweDBBNDZEQTAwLCAweEI1MEE0NkI1LCAweDM0QTlFRkJELCAweDUwNTA1MDUwLCAweDU0MTIxNkNELCAweDQ4OTYyMUM5LCAweDNDQTlENzNBLCAweDUwNUU5NTU1LCAweDYzQjM3NjBCLCAweDNCNTNCMDNCLCAweDdERDFGRkZGLCAweDQxNDI0MDQzLCAweDkxQTFDMzExLCAweDE5OTFBMTE5LCAweDQ0RUFGN0RFLCAweDA1MDUwNTA1LCAweDkyODlCRTIwLCAweEMwOUMwOTAwLCAweDM0QTlGN0RFLCAweDI1MjVFNTc1LCAweDM1NkEwMEU5LCAweDRGMTQ5NzUxLCAweDM0QTlGRkZGLCAweDVDNTc1NTVELCAweDUyODRDRDAwLCAweDYwNEEwNEEzLCAweDNDQTlGN0RFLCAweDgzNDM2MzQzLCAweDFEOTVDQzAwLCAweDBFOURBNTE5LCAweDM0QTlGRkZGLCAweEI1MEQwOTA5LCAweDQyNERDMTAxLCAweEFCNkJCNjMyLCAweDM0QTlGN0RFLCAweDYwNDA3RjU1LCAweDFEODFCRjQ1LCAweEQ4MUQ4MUQ4LCAweDM0QThGRkZGLCAweDA5MDkwOTA5LCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAKKwkJMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MzQ2QzExMCwgMHhEQjYwMzZBMywgMHgxNEFCRkZGRiwgMHgwMDgwNjA1OCwgMHg5MEFERDUwMCwgMHg2NjI1NkNEMCwgMHgwQzg5RUZCRCwgMHg1Njk1MTUyNSwgMHg2REI2RkYwMSwgMHhEQjBEQjZEQiwgMHhFRkJERkZGRiwgMHgwMTAwMDAwMCwgMHg2MkI2QjMwMiwgMHhEQjYxQjY3QiwgMHgzQ0E4RkZGRiwgMHgwMDAwQzA2MCwgMHhEMzY5QkYwRCwgMHhEQjYwOTAyNCwgMHgzQ0M5RkZGRiwgMHgwMEFBNTU1NSwgMHg0REExQzQwMCwgMHhEQjZEQjZEQiwgMHgzNDg4RkZGRiwgMHgwMDAwMEIwRCwgMHg2MjRBQzAwMCwgMHhEQjY1QjZCMSwgMHgzQ0NBRkZGRiwgMHgwMDgwNTg1NywgMHg5MzZEQ0EwMCwgMHhEQjBDOTI4NiwgMHgzQ0NBRkZGRiwgMHgwMDJBNTU1NSwgMHgwRDkxQjUyRCwgMHhEQjZEQjZEQiwgMHgzQ0E5RkZGRiwgMHgwMDAwMDIwRCwgMHg4NDQ4QkIwMCwgMHgwMDAwMDA1NCwgMHgzQ0NBRkZGRiwgMHgwMDA4OTQ5NCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MzM2QkEwMCwgMHgwMDAwMDYyRiwgMHg0NEVCRkZGRiwgMHgwMDAwNzA3MCwgMHg1RDgxN0UwMSwgMHhEQjZEODBEOCwgMHg0RDBDRkZGRiwgMHgwMDAwMDEwMSwgMHg2M0I2MkMwNCwgMHhEQjZEQjYxQiwgMHhBRTk2RkZGRiwgMHgwMDAwMDA0MCwgMHg1MUE5QzEwMiwgMHgwMDAwMDIwMSwgMHg0NEVBRkZGRiwgMHgwMDAzMEQwNSwgMHhBQzhEQkUwMywgMHhDMDBDMTAwMiwgMHg0NEVBRkZGRiwgMHgwMDBDMDczNSwgMHg2QTM2QTQwMCwgMHgwMDAwMDAyOCwgMHg0NEVCRkZGRiwgMHgwMDAwNjA0MCwgMHg1MDIxQzMwMCwgMHgwMzYwMDIwMSwgMHgzNDg4RkZGRiwgMHgwMDAyMDkwRCwgMHg2MjM2QjAwNCwgMHgxQjYxQjY2MCwgMHg0NENBRkZGRiwgMHgwMDAwQzA0MCwgMHhENDE5QzgwMCwgMHgwMDAwMDA0MiwgMHg0NEVBRkZGRiwgMHgwMDAyMjU4RCwgMHg1MDJERTgwMCwgMHgwMDAwMDAwMiwgMHgzQ0NBRkZGRiwgMHgwMDAwMjUyNSwgMHg4NDRCQzEwMywgMHhEODZDMDA3NiwgMHgzQ0M5RjdERSwgMHgwMDIwRDQ5NywgMHgwMjY2QzAwMCwgMHgwMDAwMDBBNiwgMHgzQ0NBRkZGRiwgMHgwMDAwNUM1QywgMHhEQTQ5QkIwMCwgMHgwMDAwMDA5NCwgMHgzQ0M5RkZGRiwgMHgwMDAwRDU1NSwgMHgwREIxMEMwMSwgMHhEQjZEQjZEQiwgMHhERjdCRkZGRiwgMHgwMDAwMDAwMSwgMHg2MzQ2QzUwNiwgMHhEQjYxQjY4QiwgMHgzQ0NBRkZGRiwgMHgwMDAwNjA1MCwgMHg5MjY1QkYwNSwgMHhDMzYwMTJBNCwgMHgzQ0NBRkZGRiwgMHgwMDJBNTU1NSwgMHgyMjAxQTUwMCwgMHgwMzYwMzYyMywgMHg1NTBCRkZGRiwgMHgwMDAwNDI0OSwgMHhEMzRERDUwMCwgMHhEQjBEQjA5NiwgMHgzQ0NBRkZGRiwgMHgwMDAwNTU1NSwgMHgzMDI5QkEwMywgMHhEQjZEQjZEQiwgMHgzNEE5RkZGRiwgMHgwMDAwMDMyRCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg2MjU2QzEwMCwgMHgwMDYwMDZCNSwgMHg0NENBRkZGRiwgMHgwMDIwNTA1OCwgMHgwQUMwRkYwMCwgMHgwMDAwMDA4MCwgMHgzQ0M5RjdERiwgMHgwMDAwNDI3MiwgMHhEQjkxQjUwMCwgMHgwMDAwMDA5OSwgMHgzQ0M5RkZGRiwgMHgwMDAwQ0RDOSwgMHhEMzQ5QzkwMCwgMHgwMDAwMDBCNiwgMHgzQ0NBRkZGRiwgMHgwMDAwNTU1NSwgMHhENDJERTIwMCwgMHgwMDYwMDY0MSwgMHgzQ0NBRkZGRiwgMHgwMDAwOERBNSwgMHg5MDI5QkIwMCwgMHgwMDYwMzAwMiwgMHg0NENBRkZGRiwgMHgwMDAwMDUyNSwgMHgwMzA2QkIwMCwgMHhEQjYxQjY5QiwgMHgyQzg3RkZGRiwgMHgwMDAwQzA3MCwgMHg1M0I1N0MwMCwgMHhEQjBEQjIzQiwgMHg3NUIwRkZGRiwgMHgwMDAyNDM0MywgMHg5MjQ5QkMwMCwgMHhEQjZEODZBNiwgMHgzQ0NBRkZGRiwgMHgwMDAwNTU1NSwgMHgzQ0E5QkQwNywgMHhEQjZEODBEOCwgMHg0NEVBRkZGRiwgMHgwMDAwMEIyNSwgMHhFMjY2QkEwMCwgMHgwMDAwMDBBNSwgMHg0NENBRkZGRiwgMHgwMDAwNTg1QywgMHhEMjQ5QkIwMCwgMHgwMDBDMDBCNCwgMHg0NENBRkZGRiwgMHgwMDAwNTU1NSwgMHgwMjQyQkMwMCwgMHhEQjZEQjZBNSwgMHgzQ0NBRjdERSwgMHgwMDIwNTA1MiwgMHgwMkYyQzcwNiwgMHgxQjYxQjY5QiwgMHgzQ0NBRjdERiwgMHgwMDAwNDI3MiwgMHg1ODExQkEwMCwgMHgxODAxQjA5QSwgMHgzQ0NBRjdERSwgMHgwMDAwQ0RDOSwgMHhEMDFERUEwMCwgMHgwMzYwMzYwMSwgMHg0NENBRjdERiwgMHgwMDAwMEQwNSwgMHg5Qzg5QjcwMiwgMHhEQjZEODBDQSwgMHgzQ0NBRjdERSwgMHgwMDAwMjUyNSwgMHg2MkY2QkEwMywgMHhEQjZEQjY3QiwgMHg0NEVBRkZGRiwgMHgwMDAwQzA3MCwgMHgxMUIxOEYwMSwgMHhEQjZEQjJEQiwgMHg2RDhGRkZGRiwgMHgwMDAyMDEwMSwgMHg4QjZCREUwMCwgMHhDMDY0MzZCMSwgMHgzNEE5RkZERiwgMHgwMDgwNTg1NywgMHg5MjZEQzEwMCwgMHhEQjBDOTJCNCwgMHg0NENBRkZGRiwgMHgwMDJBNTU1NSwgMHgyRDk5QjQwMCwgMHhEODBEODBEQiwgMHgyQ0E4RkZGRiwgMHgwMDAwMDIwOSwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHg5MjQ5MDBGRiwgMHgyNDkyNDkyNCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgCisJCTB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4NjM0NkE5MDQsIDB4REI2MUI2QTAsIDB4MDQ0OEY3REYsIDB4MDAwMEMwNTgsIDB4MURCMjVFMDUsIDB4RDgwRDgxREIsIDB4NDU0RUZGRkYsIDB4MDIwOTAxMDMsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4OTI0OTAwRkYsIDB4MjQ5MjQ5MjQsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIAorCQkweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEY3REVGRkZGLCAweDQwMDAwMDAwLCAweDZEQjYwNTAxLCAweEQ4MURCNkRCLCAweEY3REVGRkZGLCAweDA1MDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDkyNDkwMEZGLCAweDI0OTI0OTI0LCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAKKwl9OworI2Vsc2UKKwlleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IGxvZ29EYXRhW2xvZ29XaWR0aCAqIGxvZ29IZWlnaHRdID0KKwl7CisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGQ0ZFRkQsIDB4MDRDRkU5REIsIDB4MjI4MkM3QTMsIDB4NUQxOTk3NTUsIDB4NzYxODk2NTUsIDB4MDlCOURGQ0MsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZFLCAweDAzRTRGMkVBLCAweDFDQTJEM0I3LCAweDU1MzlBMjY3LCAweDkxMEY5MDRBLCAweEI3MDU4RTQ2LCAweEFEMDE4QzQ1LCAweDI0ODVDN0E1LCAweDAwRkVGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY0RjlGNiwgMHgxNkE0RDNCNiwgMHg0OTU4QUU3OSwgMHg4QTI1OTY1MSwgMHhCMzE5OTE0NiwgMHhCRjE5OTI0NiwgMHhCRjE2OTA0NiwgMHhCQTBDOEY0NiwgMHg0NTU2QjI4MywgMHgwMUZBRkRGQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBFREYyRjgsIDB4MDVEOUU0RjAsIDB4MEREOUUzRjAsIDB4MTFEOUU0RjAsIDB4MTBEOUUzRUYsIDB4MEJEOUU0RjAsIDB4MDJEOUUzRjAsIDB4MDBGN0ZBRkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGMUY4RjMsIDB4MTBCRkRGQ0EsIDB4NDE3N0JCOEQsIDB4ODAzOTlENTksIDB4QUUyNTk0NDYsIDB4QkQyNzk2NDYsIDB4QkYyODk3NDcsIDB4QkYyNTk2NDYsIDB4QkYxRjk0NDcsIDB4QkUxNzkwNDUsIDB4NkIzM0EwNjQsIDB4MDJFMUYxRTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZFLCAweDA1Q0ZEQ0VDLCAweDIxODNBNUNELCAweDUzNDY3QUI2LCAweDdFMzI2REFGLCAweDlDMUU2MEE4LCAweEE5MUM2MUE5LCAweEFGMUM2MUE5LCAweEFEMUM2MUE5LCAweEE3MUM2MUE5LCAweDk1MUM1RkE4LCAweDc1M0U3NkI0LCAweDQ0NEE3REI4LCAweDE3OTZCM0Q2LCAweDAyRTdFREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjBGN0YyLCAweDBFQkZERkM4LCAweDM2NzdCQThCLCAweDc4NDA5RjVCLCAweEFCMkM5NTQ2LCAweEJFMzI5OTQ3LCAweEJGMzY5QzQ3LCAweEJGMzc5RTQ4LCAweEJGMzU5RDQ3LCAweEJGMzE5QzQ4LCAweEJGMkE5ODQ3LCAweEJGMjA5NDQ3LCAweDkwMUI5MjRDLCAweDBDQkVFMENELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOEQzREZFRCwgMHg0MDY4OTFDMiwgMHg4RDIxNjFBOCwgMHhCNjFENjFBOSwgMHhCRjFDNjdBRCwgMHhCRjFDNkZCMywgMHhCRjFGNzhCQSwgMHhCRjFGN0VCRiwgMHhCRjIwODJDMSwgMHhCRjIwODFDMSwgMHhCRjIwN0VCRSwgMHhCRjFENzZCOCwgMHhCRjFDNkRCMiwgMHhCRTFCNjVBQiwgMHhCMDFFNjFBOSwgMHg3QjJDNjhBQywgMHgyQzdGQTJDQywgMHgwM0VDRjFGNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY4RkNGOSwgMHgwQUQ2RUFEQiwgMHgzMDc3Qjk4OSwgMHg2RTQxOUU1OCwgMHhBNDMyOTc0NiwgMHhCRDM4OUI0NiwgMHhCRjNGQTA0NywgMHhCRjQzQTM0NywgMHhCRjQ2QTU0OCwgMHhCRjQ1QTU0NywgMHhCRjQyQTQ0OCwgMHhCRjNEQTI0NywgMHhCRjM1OUQ0OCwgMHhCRjI5OTc0NiwgMHhBQTFCOTE0OCwgMHgxREFGRDhDMCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGOEZBRkQsIDB4MkE5NkIzRDUsIDB4OEYzMDZCQUUsIDB4QkMxQzYyQTksIDB4QkYxRTZGQjQsIDB4QkYyMTg2QzUsIDB4QkYyNDk1RDEsIDB4QkYyNTk3RDIsIDB4QkYyNTk1RDEsIDB4QkYyNjkzQ0UsIDB4QkYyNjkyQ0UsIDB4QkYyNTkyQ0UsIDB4QkYyNTk0RDAsIDB4QkYyNjk2RDEsIDB4QkYyNjk4RDMsIDB4QkYyNDkyQ0YsIDB4QkYyMTgxQzEsIDB4QkYxRDZBQjAsIDB4QjgxRDYzQUEsIDB4NzYzRjc2QjQsIDB4MTdCRUQwRTUsIDB4MDBGQ0ZDRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGREZFRkQsIDB4MDZFQkY0RUQsIDB4Mjc5MUM2OUUsIDB4NjQ1NUE3NjcsIDB4OUUzNzk3NDcsIDB4QkMzRDlDNDcsIDB4QkY0NEExNDYsIDB4QkY0QkE1NDcsIDB4QkY0RUE5NDcsIDB4QkY1MUFDNDgsIDB4QkY1M0FFNDcsIDB4QkY1M0FFNDgsIDB4QkY0RkFDNDcsIDB4QkY0OUE4NDgsIDB4QkYzRUEyNDcsIDB4QkYzMzlDNDgsIDB4QjgyMjkzNDYsIDB4M0Q2QUI3ODksIDB4MDBGQUZERkIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RUFGMEY2LCAweDU1NTM4MkJBLCAweEIzMUY2MUE5LCAweEJGMUQ2OEFFLCAweEJGMjI4NkM1LCAweEJGMjc5QkQ1LCAweEJGMjQ5N0QyLCAweEJGMjQ5MkNFLCAweEJGMjQ4RUNBLCAweEJGMjI4Q0M5LCAweEJGMjI4OUM4LCAweEJGMjI4OUM4LCAweEJGMjI4OUM3LCAweEJGMjM4QkM5LCAweEJGMjM4Q0NBLCAweEJGMjU5MENDLCAweEJGMjU5M0NGLCAweEJGMjU5OUQ0LCAweEJGMjY5QUQ0LCAweEJGMjA3RUJGLCAweEJFMUM2NUFDLCAweEE1MjA2M0FBLCAweDM2N0VBMUNDLCAweDAxRjlGQUZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkFGQ0ZBLCAweDAzRTZGMkU5LCAweDIxQUJEMkIyLCAweDVCNkFCMDc3LCAweDk3M0Q5OTRBLCAweEI4M0Y5QjQ2LCAweEJGNDhBMTQ2LCAweEJGNERBNTQ2LCAweEJGNTRBQTQ3LCAweEJGNTdBRDQ2LCAweEJGNUFCMTQ3LCAweEJGNUJCMzQ2LCAweEJGNUNCNTQ3LCAweEJGNUJCNTQ3LCAweEJGNThCMzQ3LCAweEJGNTJBRTQ3LCAweEJGNDlBODQ4LCAweEJGM0M5RjQ3LCAweEJEMkI5NjQ2LCAweDYzM0RBMDYxLCAweDAyRTNGMUU5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwN0M1RDRFNywgMHg2RTJFNjlBQywgMHhCQzFFNjNBQiwgMHhCRjFDNkFBRiwgMHhCRjI1OTJDRiwgMHhCRjI2OURENywgMHhCRjI1OTZEMSwgMHhCRjI0OTBDQywgMHhCRjI1OEJDOSwgMHhCRjIxODdDNiwgMHhCRjIyODVDNCwgMHhCRjIxODNDMiwgMHhCRjIyODJDMiwgMHhCRjIxODJDMSwgMHhCRjIxODRDMywgMHhCRjIxODVDNCwgMHhCRjIyODlDNywgMHhCRjI0OENDQSwgMHhCRjI1OTNDRiwgMHhCRjI2OThEMywgMHhCRjI4OUZEOSwgMHhCRjIyODZDNSwgMHhCRjFDNjhBRSwgMHhCNDFENjJBQSwgMHg0QTQ4N0FCNiwgMHgwMUU2RURGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkVGRCwgMHgwM0U0RjFFNiwgMHgxQUE5RDFCMCwgMHg1MjU1QTQ2MSwgMHg5MDQyOUE0QywgMHhCNzQyOUM0NiwgMHhCRTRFQTI0NiwgMHhCRjYxQUI0NywgMHhCRjYyQUU0NiwgMHhCRjVDQUY0NywgMHhCRjVFQjE0NiwgMHhCRjYxQjU0NiwgMHhCRjYzQjg0NiwgMHhCRjY0QkE0NywgMHhCRjYzQkI0NiwgMHhCRjYzQkM0NywgMHhCRjYwQkE0NywgMHhCRjU5QjQ0NywgMHhCRjUxQUQ0NywgMHhCRjQ1QTU0OCwgMHhCRjM0OUI0NywgMHg4ODMwOTg1MSwgMHgwOEUxRjBFNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDRFQ0YxRjcsIDB4NkU0OTdDQjcsIDB4QkQxRDYzQUEsIDB4QkYxQTY4QUUsIDB4QkYyMjg2QzUsIDB4QkYyNjlFRDgsIDB4QkYyMzk1RDEsIDB4QkYyMzhGQ0MsIDB4QkYyMjg5QzcsIDB4QkYyMTg1QzQsIDB4QkYyMTgxQzEsIDB4QkYyMTdFQkYsIDB4QkYyMDdDQkQsIDB4QkYyMDdDQkQsIDB4QkYxRTdCQkQsIDB4QkYyMDdEQkUsIDB4QkYyMTdFQkYsIDB4QkYyMjgyQzIsIDB4QkYyMDg2QzUsIDB4QkYyNDhCQzksIDB4QkYyNDkxQ0QsIDB4QkYyNDk4RDMsIDB4QkYyN0EwREEsIDB4QkYxRTc5QkIsIDB4QkYxQjY3QUQsIDB4QjcxRTYyQUEsIDB4NDQ3NTlCQzgsIDB4MDFGQkZDRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGMkY4RjMsIDB4MTVDMUREQzUsIDB4NDk2OUFENzIsIDB4ODg0NTlCNEQsIDB4QjM0MjlBNDUsIDB4QkU0RkExNDYsIDB4QkY2M0FCNDcsIDB4QkY3OEI2NDcsIDB4QkY3M0I2NDcsIDB4QkY2NEIzNDYsIDB4QkY2NEI1NDUsIDB4QkY2N0I4NDYsIDB4QkY2OUJCNDUsIDB4QkY2OUJENDYsIDB4QkY2OEJDNDYsIDB4QkY2N0JENDYsIDB4QkY2NUJDNDYsIDB4QkY2NEJDNDcsIDB4QkY1RkI4NDYsIDB4QkY1OEIxNDcsIDB4QkY0REE5NDcsIDB4QkYzRDlGNDcsIDB4QTUzMDk3NEIsIDB4MTlCMUQ4QkYsIDB4MDBGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MDBGREZFRkEsIDB4MDNFQkY0RDYsIDB4MDdFQ0Y1RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MDhFQkY0RDUsIDB4MDZFQ0Y0RDYsIDB4MDFGM0Y4RTcsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGMUY3RTIsIDB4MDlFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MDhFQkY0RDYsIDB4MDFGQkZERjcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGQUZDRjQsIDB4MDdFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y1RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MDRFQ0Y0RDgsIDB4MDBGRUZGRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGNkZBRUMsIDB4MDhFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MDlFQkY0RDUsIDB4MDNGNEY5RTgsIDB4MDBGRkZGRkYsIDB4MDFGOEZCRjEsIDB4MDdFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDUsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MEFFQkY0RDYsIDB4MEFFQ0Y0RDYsIDB4MDVFQkY0RDYsIDB4MDBGQ0ZERjgsIDB4MDBGRUZGRkUsIDB4MDFGRUZFRkIsIDB4MDVFRUY1RDUsIDB4MERFREY1RDQsIDB4MTFFREY0RDQsIDB4MEZFREY1RDQsIDB4MEJFREY0RDQsIDB4MDRFRUY2RDksIDB4MDBGRUZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MDhGMUY3REIsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MEZFREY1RDUsIDB4MDFGN0ZBRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDdGM0Y4RTEsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MEZFREY1RDUsIDB4MDFGNEY5RTcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGOEZCRUUsIDB4MTFFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTFFREY1RDQsIDB4MDJGNkZBRUIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGNkZBRTgsIDB4MTBFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MEVFREY1RDQsIDB4MDVFREY0RDYsIDB4MDBGREZFRkIsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGOEZCRUMsIDB4MEZFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MDdFRkY2REIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkUsIDB4MDNGM0Y4RTAsIDB4MTFFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MTNFREY1RDQsIDB4MTNFREY0RDQsIDB4MTNFREY1RDQsIDB4MTJFREY0RDQsIDB4MEZFREY1RDQsIDB4MDdFQ0Y0RDQsIDB4MDFGQkZERjYsIDB4MDBGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkFGQkZELCAweDUyNTA4MEI5LCAweEJDMUU2M0FBLCAweEJGMUE2OEFFLCAweEJGMUI2REIxLCAweEJGMjc5OUQ0LCAweEJGMjQ5OUQ0LCAweEJGMjU5MENELCAweEJGMjI4QUM5LCAweEJGMjA4NEMzLCAweEJGMjI4MEMwLCAweEJGMjE3Q0JELCAweEJGMUU3OUJCLCAweEJGMUU3N0JBLCAweEJGMjA3N0JBLCAweEJGMUU3NkI5LCAweEJGMUY3OEJCLCAweEJGMUU3OUJCLCAweEJGMjI3REJFLCAweEJGMjI4MEMwLCAweEJGMjE4NkM1LCAweEJGMjI4QkM5LCAweEJGMjY5NEQwLCAweEJGMjU5QkQ2LCAweEJGMjU4RkNELCAweEJGMUI2QUFGLCAweEJGMUM2OEFFLCAweEIyMUU2MkE5LCAweDJDODVBOENGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkNGRUZELCAweDBGQzFEREM0LCAweDNFODBCQTg2LCAweDdFNEY5RTU0LCAweEFGNDU5QTQ1LCAweEJENEVBMDQ1LCAweEJGNjRBQjQ3LCAweEJGN0NCNjQ4LCAweEJGOEFCRTQ4LCAweEJGN0RCQjQ3LCAweEJGNkNCNzQ2LCAweEJGNkFCOTQ1LCAweEJGNkRCQzQ1LCAweEJGNkVCRDQ1LCAweEJGNkVCRTQ2LCAweEJGNkRCRTQ1LCAweEJGNkJCRTQ2LCAweEJGNjlCRDQ1LCAweEJGNjlCRDQ2LCAweEJGNjdCQzQ2LCAweEJGNjVCQjQ2LCAweEJGNURCNDQ2LCAweEJGNTNBQzQ3LCAweEJGNDRBMzQ3LCAweEI2MzA5NzQ3LCAweDM2NzZCQThDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjVGOUVBLCAweDBCRTFFRUJELCAweDIzQzhFMDgzLCAweDQ5QkJEODVGLCAweDZBQjRENDRCLCAweDgzQjdENTRFLCAweDkyQjhENjUwLCAweDkzQkFENjUyLCAweDhEQjhENTRGLCAweDdFQjdENTRELCAweDYxQjdENjU0LCAweDNCQkREOTY2LCAweDE0RDRFN0ExLCAweDAzRjJGOEUzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA2RUNGNUQ2LCAweDQ1QjZENTU2LCAweDhDQjhENTRELCAweDkzQjhENjRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjRGLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjhENTRGLCAweDhBQjdENTRELCAweDMzQzBEQjZGLCAweDAwRkJGREY3LCAweDAwRkZGRkZGLCAweDAwRkVGRUZDLCAweDFFQzZERjgxLCAweDc0QjVENDRCLCAweDkzQjhENjUwLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjUwLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENjRGLCAweDkzQjhENjRGLCAweDcxQjZENDRELCAweDEwREFFQUFDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRjhGQkYwLCAweDI1QkNEOTZBLCAweDdBQjZENDRCLCAweDkzQjhENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjUwLCAweDkzQjhENjRGLCAweDkzQjhENjRGLCAweDkzQjhENjRGLCAweDkzQjhENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjRGLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENjRGLCAweDkzQjhENjRGLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjRGLCAweDkxQjhENTRGLCAweDU3QkJEODVDLCAweDA1RUJGNEQ1LCAweDFEQzFEQzc3LCAweDczQjVENDRCLCAweDkzQjlENjUwLCAweDkzQjhENjRGLCAweDkzQjhENjUwLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENjRGLCAweDkzQjhENjRGLCAweDkzQjhENTRGLCAweDkzQjlENjRGLCAweDkzQjhENjRGLCAweDkzQjlENjUwLCAweDkzQjhENjRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjUwLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENjRGLCAweDkzQjhENjRGLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENjRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjUwLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjRGLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjRGLCAweDkzQjhENjRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjhENjRGLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDkzQjhENTRGLCAweDkzQjlENjUwLCAweDc5QjZENDRDLCAweDI2QzhFMDdGLCAweDJGQ0NFMTgyLCAweDU2QkREOTVDLCAweDcyQjZENDRBLCAweDg3QjhENTRDLCAweDkwQjhENjRFLCAweDhDQjlENjRFLCAweDgyQjdENTRCLCAweDZEQjdENTRDLCAweDRCQkREOTVGLCAweDI2Q0VFMzhDLCAweDBBRTVGMEM2LCAweDAxRkVGRUZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBDRTZGMEMwLCAweDY1QjhENjRELCAweDk1QjlENjUxLCAweDk3QkFENzUzLCAweDk3QkFENjUzLCAweDk3QkJENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkFENzUzLCAweDk3QkFENjUzLCAweDg1QjhENTRELCAweDJBQkVEQTZFLCAweDAxRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA3RUVGNUQ2LCAweDVCQkFENzUyLCAweDk0QjlENjUwLCAweDk3QkFENzUzLCAweDk3QkFENjUzLCAweDk3QkJENzUzLCAweDk3QkFENjUyLCAweDk3QkFENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDg1QjdENTRDLCAweDJBQkNEOTY5LCAweDAxRkJGREY2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkNGREY3LCAweDM5QzNEQzZBLCAweDhDQjhENjRELCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENzUzLCAweDk3QkJENzUzLCAweDk3QkFENjUyLCAweDhEQjlENjRFLCAweDM5QkREOTY3LCAweDAzRjNGOEU1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkNGREY2LCAweDNCQzJEQjY2LCAweDhDQjhENTRDLCAweDk3QkFENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENzUzLCAweDk3QkFENzUzLCAweDk1QjlENjUwLCAweDg5QjhENjRELCAweDcwQjZENTRCLCAweDRBQkREOTYwLCAweDIwRDNFNjlBLCAweDA3RUZGNkRCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZBLCAweDJGQzdERTcyLCAweDg3QjhENTRCLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENzUyLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkFENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENjUzLCAweDk3QkFENjUzLCAweDk3QkFENjUyLCAweDk2QkFENzUyLCAweDYwQjZENTRGLCAweDBEREVFQ0I3LCAweDAyRkFGQ0YzLCAweDQ0QkJENzU1LCAweDkwQjhENTRFLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENjUzLCAweDk3QkFENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk3QkFENjUyLCAweDk3QkJENzUzLCAweDk2QkFENjUxLCAweDhDQjlENjRFLCAweDc2QjZENDRBLCAweDUzQkNEODVCLCAweDI4Q0ZFNDkwLCAweDBBRThGMkNELCAweDAwRkVGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZDRkRGRCwgMHgyODg5QTlDRiwgMHhCMjFFNjFBOSwgMHhCRjFCNjdBRCwgMHhCRjFBNjlBRiwgMHhCRjFENkZCMywgMHhCRjI0OTlENCwgMHhCRjI1OTRDRiwgMHhCRjI0OENDQSwgMHhCRjIxODZDNSwgMHhCRjIyODBDMCwgMHhCRjIwN0JCRCwgMHhCRjFFNzdCOSwgMHhCRjFENzVCOCwgMHhCRjFCNzJCNiwgMHhCRjFCNzJCNiwgMHhCRjFCNzJCNiwgMHhCRjFENzRCOCwgMHhCRjFENzVCOCwgMHhCRjFGNzhCQiwgMHhCRjFGN0NCRCwgMHhCRjIxODJDMiwgMHhCRjIyODdDNiwgMHhCRjI1OEZDQiwgMHhCRjI1OTZEMiwgMHhCRjI2OTNDRiwgMHhCRjE5NkFBRiwgMHhCRjFCNkFBRiwgMHhCRjFCNjZBQywgMHg5QTI3NjdBQywgMHgwREM1RDVFOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEVFRjVFRSwgMHgwQ0JGREJDMSwgMHgzNjk2QzQ5OSwgMHg3NjVEQTU1RiwgMHhBODQ4OUE0NSwgMHhCRDUxQTA0NSwgMHhCRjYyQTk0NSwgMHhCRjdBQjU0NywgMHhCRjhDQkQ0OCwgMHhCRjkxQzE0OSwgMHhCRjgyQkU0NiwgMHhCRjczQkI0NSwgMHhCRjcxQkM0NCwgMHhCRjcyQkU0NCwgMHhCRjcxQkU0NCwgMHhCRjcxQkY0NSwgMHhCRjZGQkU0NCwgMHhCRjZGQkU0NSwgMHhCRjZEQkU0NSwgMHhCRjZDQkU0NiwgMHhCRjZCQkQ0NiwgMHhCRjZBQkQ0NiwgMHhCRjY3QkM0NiwgMHhCRjYxQjg0NiwgMHhCRjU3QUY0NiwgMHhCRjRCQTU0NywgMHhCRDM3OUE0NiwgMHg1QjUxQTc2QiwgMHgwMUY5RkNGQSwgMHgwMEZGRkZGRiwgMHgwMUY0RjlFOSwgMHgxMkQxRTU5QSwgMHg0MEI3RDY1OSwgMHg3RkI2RDU0QywgMHhBOUJFRDg1QywgMHhCQUM5REY3QSwgMHhCRkQxRTM5MSwgMHhCRkQ1RTY5RSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ1RTY5RCwgMHhCRUQwRTI4RSwgMHhCOUM3REU3NCwgMHhBMEJDRDc1NiwgMHg2M0I3RDY1MywgMHgxQkNDRTI4RSwgMHgwMkY1RkFFQSwgMHgwMEZGRkZGRiwgMHgxOEM5RTA4OSwgMHg4OEI2RDU0QiwgMHhCRkQzRTQ5NSwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQyRTQ5NCwgMHg3QUI3RDU0RSwgMHgwNEVDRjREOCwgMHgwMEZGRkZGRiwgMHgwMkYyRjdFMywgMHg0QUI2RDY1NSwgMHhCN0M0REM2QywgMHhCRkQ4RTdBMywgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ4RTdBNCwgMHhCOUM1REM2RiwgMHgzN0NDRTI4NiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUYyRjhFNCwgMHg1NkI0RDQ0RSwgMHhCQkM3REQ3NSwgMHhCRkQ4RTdBMywgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ5RTdBNywgMHhCRkQ3RTZBMywgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTZBMSwgMHhBNkJERDg1QiwgMHgxOUM3REY4NCwgMHg0OUI1RDU1NCwgMHhCN0M0REI2QiwgMHhCRkQ4RTdBMywgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ4RTdBNSwgMHhCRkQ3RTdBMywgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMCwgMHhCRkQ0RTU5OCwgMHhCREMyREI2NywgMHhBMEI4RDU0QiwgMHhBQkJGRDk1RiwgMHhCQkNBREY3QywgMHhCRkQxRTM5MSwgMHhCRkQ1RTU5RCwgMHhCRkQ2RTZBMCwgMHhCRkQ2RTZBMCwgMHhCRkQ0RTU5QiwgMHhCRkQwRTM4RiwgMHhCOEM3REQ3NSwgMHhBNUJERDg1OSwgMHg3NkI2RDQ0QSwgMHgzN0MzREQ3MywgMHgwQUU1RjBDNywgMHgwMEZERkVGQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNEQ4RThBMSwgMHhBNUJDRDc1NywgMHhCRkQ2RTZBMCwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMywgMHhCRENCRTA3RSwgMHg1M0I0RDQ0RiwgMHgwNkU5RjJDRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEUzRUZCQywgMHg5OEJBRDY1MSwgMHhCRkQ1RTU5RCwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTdBMywgMHhCRUNCREY3RSwgMHg1N0IzRDQ0RSwgMHgwNkVCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUY5RkJGMCwgMHg3M0I3RDU0QywgMHhCRUNGRTI4QSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTZBMiwgMHhCRkQwRTI4RiwgMHg3MkI1RDQ0RCwgMHgwQ0Q3RTlBQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNEVFRjVEOCwgMHg2Q0I1RDQ0OSwgMHhCRUNFRTE4OCwgMHhCRkQ3RTdBMywgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ2RTY5RiwgMHhCRUQwRTI5MCwgMHhCOEM3REQ3MywgMHg5RUJCRDc1NCwgMHg2NkI3RDU0RiwgMHgyNENBRTE4NywgMHgwNEYxRjdFMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkY1RjlFNiwgMHg1RUI2RDU0QiwgMHhCRENCREY3RiwgMHhCRkQ4RTdBNCwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTZBMSwgMHhBMkJDRDc1NywgMHgyMkJBRDg2QSwgMHgwOEU1RjBCRiwgMHg3Q0I3RDU0QiwgMHhCRUQwRTI4RiwgMHhCRkQ3RTdBMywgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ2RTZBMSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMiwgMHhCRkQ3RTZBMSwgMHhCRkQ2RTZBMCwgMHhCRkQyRTM5MywgMHhCQkM5REY3QiwgMHhBNUJERDg1OSwgMHg3MkI2RDU0QywgMHgyREM1REU3QiwgMHgwNkVCRjREMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDZDQ0Q5RUEsIDB4OEIyMTVGQTgsIDB4QkYxQjY1QUIsIDB4QkYxQjZBQUYsIDB4QkYxQjZBQUYsIDB4QkYxQzZDQjEsIDB4QkYyNDkxQ0UsIDB4QkYyNTkxQ0QsIDB4QkYyMjg5QzcsIDB4QkYyMTgzQzMsIDB4QkYyMTdEQkUsIDB4QkYxRjc4QkEsIDB4QkYxRTc0QjgsIDB4QkYxQzcyQjcsIDB4QkYxQzcwQjUsIDB4QkYxQzZGQjUsIDB4QkYxQzZGQjQsIDB4QkYxQzcxQjUsIDB4QkYxQjczQjcsIDB4QkYxRTc1QjksIDB4QkYxRTc5QkIsIDB4QkYyMzdGQkYsIDB4QkYyMTg0QzMsIDB4QkYyNDhDQ0EsIDB4QkYyNjk0RDAsIDB4QkYyMzg5QzgsIDB4QkYxQTZBQUYsIDB4QkYxQjZCQjAsIDB4QkYxQTY5QUYsIDB4QkYxQzY1QUMsIDB4NUU1Nzg3QkQsIDB4MDFGQ0ZERkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGN0ZCRjcsIDB4MDlENUU3RDUsIDB4MkU5N0M1OTgsIDB4NkM1NTlGNTQsIDB4QTU0QjlBNDUsIDB4QkM1MjlGNDUsIDB4QkY2NUE5NDYsIDB4QkY3QkI1NDgsIDB4QkY4QkJFNDksIDB4QkY5M0MxNDksIDB4QkY5NEMyNEEsIDB4QkY4OEMwNDcsIDB4QkY3OUJGNDUsIDB4QkY3NkJGNDQsIDB4QkY3N0MxNDQsIDB4QkY3NUMwNDQsIDB4QkY3NUMwNDUsIDB4QkY3M0JGNDQsIDB4QkY3MkMwNDUsIDB4QkY3MEJGNDQsIDB4QkY3MEJGNDUsIDB4QkY2RUJFNDUsIDB4QkY2REJFNDYsIDB4QkY2QkJFNDUsIDB4QkY2QkJFNDYsIDB4QkY2NkJBNDUsIDB4QkY1REIyNDcsIDB4QkY1MEE4NDcsIDB4QkYzRjlFNDcsIDB4ODE0MTlFNTksIDB4MDhFMUYwRTYsIDB4MDBGRUZFRkQsIDB4MEFFMEVFQkIsIDB4MzlCN0Q2NUIsIDB4ODdCOEQ1NEQsIDB4QjVDNERDNkMsIDB4QkZENEU1OTgsIDB4QkZEOEU3QTQsIDB4QkZEMkU0OTQsIDB4QkNCRkQ5N0YsIDB4QkFBRUQwNzIsIDB4QjJBOUNENjksIDB4QjJBOUNENjgsIDB4QjRBQkNFNkIsIDB4QjlCNkQ0NzEsIDB4QkJDOURGN0YsIDB4QkZENEU1OTgsIDB4QkZEOEU3QTQsIDB4QkVDRkUyODgsIDB4OUZCQ0Q3NTcsIDB4NDJCRkRCNjksIDB4MDVFOEYyQ0UsIDB4MjVDNkRGN0YsIDB4OUNCQkQ3NTMsIDB4QkZEOEU3QTQsIDB4QjlCREQ4NkQsIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QUZCMEQxNjQsIDB4QkVDQ0UwODAsIDB4QkZEM0U0OTUsIDB4NkZCNkQ1NEQsIDB4MDNFQ0Y1RDgsIDB4MDBGRkZGRkYsIDB4MDdFN0YxQ0MsIDB4NjFCNUQ0NEIsIDB4QkNDQ0UwODMsIDB4QkZEMEUzOEUsIDB4QjNBRENGNjYsIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjRCQ0Q3NjEsIDB4QkZENkU2QTAsIDB4QjVDNERCNkIsIDB4MkNDQ0UyODksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEJEREVDQjUsIDB4NkVCNUQ1NEIsIDB4QkVDRkUyOEMsIDB4QkZDREUxODYsIDB4QjFBQkNFNjgsIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENkEsIDB4QjFBOUNENjksIDB4QjFBQkNFNjksIDB4QjhDMkRBNjYsIDB4QkZEQkU5QjAsIDB4QkRDQURGODEsIDB4QjJBQkNFNjgsIDB4QjFBOUNDNjksIDB4QjJBOUNENkEsIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjBBQkNFNjgsIDB4QkFDMkRCNkEsIDB4QkZEOEU3QTQsIDB4OURCQ0Q4NTcsIDB4MUFCNUQ1NUUsIDB4NjBCNUQ1NEMsIDB4QkRDQ0UwODIsIDB4QkZEMEUzOEUsIDB4QjJBQ0NGNjcsIDB4QjJBOUNENkEsIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENkEsIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOENENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjBBQ0NGNjcsIDB4QkFDM0RCNkMsIDB4QkZEQkVBQUYsIDB4QkVDRUUxOEIsIDB4QjNBQ0NGNjgsIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENkEsIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOENENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNFNkEsIDB4QjFBOUNENjksIDB4QjJBOUNENjksIDB4QjFBOUNENjksIDB4QjJBOUNENkEsIDB4QjFBOUNENjksIDB4QjJBOUNENkEsIDB4QjhCN0Q1NUYsIDB4QkZCRkQ5NUYsIDB4QkZDN0RENzMsIDB4QkZENUU1OUEsIDB4QkZEN0U3QTQsIDB4QkZEMkU0OTEsIDB4QkNDNkRDNzksIDB4QkNCREQ3NjYsIDB4QjVCOUQ1NUQsIDB4QjhCQUQ2NUYsIDB4QkNCREQ3NjgsIDB4QkNDOURFN0QsIDB4QkZEM0U0OTYsIDB4QkZEOUU4QTUsIDB4QkVEMEUzOEUsIDB4QUFCRkQ5NUUsIDB4NjhCNUQ0NEMsIDB4MURDRUUzOTAsIDB4MDFGOUZDRjMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjdEOEU4QTEsIDB4QTlCREQ5NUEsIDB4QkZEN0U2QTMsIDB4QjhCRUQ4NjEsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjFCQUQ2NTgsIDB4QkVDRUUxODgsIDB4QkVDRUUxODYsIDB4NTZCM0Q0NEUsIDB4MDhEQkVCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QkFDMURBNjYsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTcsIDB4QjFCOEQ0NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjFCOUQ2NTcsIDB4QkVDRUUxODcsIDB4QkZDRUUyODgsIDB4NUJCNEQ0NEUsIDB4MDhFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MENFNkYwQzAsIDB4ODdCN0Q1NEMsIDB4QkZENUU2OUQsIDB4QkJDNkRDNzMsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QkFDNkRDNkYsIDB4QkZENkU2OUYsIDB4ODRCOEQ1NEYsIDB4MTNEOEU5QUEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDVFRkY2RDgsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDQkUwN0YsIDB4QjJCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCN0Q1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCN0Q1NTcsIDB4QjJCOEQ1NTgsIDB4QjJCOEQ1NUIsIDB4QkFCREQ3NjUsIDB4QkNDOURFN0QsIDB4QkZENUU1OUEsIDB4QkZEOEU3QTQsIDB4QkRDQ0UwODEsIDB4OUFCQUQ3NTMsIDB4NDlCQkQ4NUQsIDB4MEJEREVDQjUsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGNUY5RTcsIDB4NjFCNkQ1NEIsIDB4QkVDRUUyODksIDB4QkZDRUUxODYsIDB4QjJCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ0NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjZCRUQ4NjAsIDB4QkZEOEU3QTMsIDB4QTdCRUQ4NUIsIDB4MjRCQkQ5NkEsIDB4MEFFMkVFQjYsIDB4N0ZCN0Q1NEMsIDB4QkZENEU1OTksIDB4QkRDOERENzYsIDB4QjJCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTcsIDB4QjFCOEQ1NTcsIDB4QjJCOEQ1NTgsIDB4QjJCOEQ1NUEsIDB4QjlCQkQ2NjIsIDB4QkNDNURDNzcsIDB4QkZEM0U0OTUsIDB4QkZEOEU3QTUsIDB4QkVDRkUyOEEsIDB4QTNCQ0Q3NTcsIDB4NTRCOUQ3NTYsIDB4MEZENEU3QTEsIDB4MDBGRUZFRkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZFLCAweDM4NjM4REMwLCAweEJCMUU2MkE5LCAweEJGMUE2OEFFLCAweEJGMUI2QkIwLCAweEJGMUI2QUFGLCAweEJGMUI2QUFGLCAweEJGMUY3REJELCAweEJGMjU4RkNCLCAweEJGMjA4NkM1LCAweEJGMjE4MEMwLCAweEJGMUY3OUJCLCAweEJGMUY3NkI5LCAweEJGMUE3MkI2LCAweEJGMUM2RkI0LCAweEJGMUM2REIyLCAweEJGMUM2REIzLCAweEJGMUI2REIyLCAweEJGMUM2RUIzLCAweEJGMUE3MEI0LCAweEJGMUM3M0I3LCAweEJGMUY3N0I5LCAweEJGMjE3Q0JFLCAweEJGMjE4MkMxLCAweEJGMjM4OUM4LCAweEJGMjU5MENDLCAweEJGMUU3NEI2LCAweEJGMUI2QUFGLCAweEJGMUI2QkIwLCAweEJGMUE2QUFGLCAweEJGMUI2OEFFLCAweEFDMUQ2MUE5LCAweDE2QkZEMUU2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkNGREZDLCAweDA3RThGMkU4LCAweDI2QUNDRkFDLCAweDYzNjRBNzYyLCAweDlDNEQ5OTQ1LCAweEJCNTY5RjQ1LCAweEJGNjZBODQ2LCAweEJGODJCNzRCLCAweEJGOTVDMDRDLCAweEJGOURDNTRELCAweEJGOUJDNDRDLCAweEJGOThDNDRCLCAweEJGOENDMjQ3LCAweEJGN0VDMTQ0LCAweEJGNzlDMDQzLCAweEJGN0FDMTQ0LCAweEJGNzhDMDQzLCAweEJGNzdDMDQ0LCAweEJGNzZDMDQ0LCAweEJGNzZDMDQ0LCAweEJGNzRCRjQ0LCAweEJGNzRDMDQ1LCAweEJGNzFCRTQ0LCAweEJGNzFCRjQ1LCAweEJGNkZCRTQ1LCAweEJGNkVCRTQ1LCAweEJGNkNCRDQ1LCAweEJGNkFCQzQ2LCAweEJGNjBCNDQ2LCAweEJGNTZBQjQ3LCAweEJGNDRBMDQ2LCAweEEwMzY5ODRCLCAweDE0QjBEN0JDLCAweDAxRkNGREY4LCAweDE1RDVFN0EyLCAweDYxQjVENDRELCAweEFDQkZEOTVFLCAweEJGRDNFNDk2LCAweEJGRDdFNkExLCAweEJFQkZEOTgyLCAweEJBN0VCNTdGLCAweEJBM0M5Mjk3LCAweEI5MTc3RUFCLCAweEJDMDQ3NEI5LCAweEJGMDE3MkJCLCAweEJGMDE3MkJCLCAweEJDMDM3M0I5LCAweEI1MTI3QkIwLCAweEIxMzA4QjlBLCAweEFBNkRBRDc5LCAweEIwQjNEMjY2LCAweEJFRDFFMzkwLCAweEJGRDdFNkEyLCAweEIzQzNEQjY5LCAweDUzQjVENTUzLCAweDM4QjhENjVELCAweEFBQkZEODVFLCAweEJGRDdFN0EyLCAweEI0NzNBRjdELCAweEJGMDE3MkJCLCAweEJFMDE3MkJBLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEE1NEM5Qjg4LCAweEJEQ0RFMTg1LCAweEJFQ0RFMTg1LCAweDU0QkJEODVFLCAweDAwRkFGQ0Y1LCAweDAwRkZGRkZGLCAweDBFREJFQkIzLCAweDc2QjZENTRBLCAweEJGRDFFMzkyLCAweEJCQzBEQTdELCAweEI5MUE3RkE5LCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MkJBLCAweEJDMDQ3NEI5LCAweEE3OURDNjYxLCAweEJGRDdFN0EyLCAweEE3QkVEOTVELCAweDFCQ0VFMzkxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE0RDdFOUE5LCAweDg0QjdENTRCLCAweEJGRDRFNTlCLCAweEJBQkFENjcyLCAweEJDMEE3N0I0LCAweEJGMDE3MkJCLCAweEJFMDE3MkJBLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEI1MTI3QkIwLCAweEFEQkFENjYxLCAweEJGRENFQUIxLCAweEI4QUFDRTc3LCAweEJCMEI3OEI1LCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MUJBLCAweEJGMDE3MkJCLCAweEFGMUM4MEE4LCAweEIzQjlENjY3LCAweEJGRDZFNkEwLCAweDg3QjlENjUxLCAweDE3Q0RFMzkyLCAweDc2QjZENTRBLCAweEJFRDFFMzkyLCAweEJCQzVEQzdBLCAweEJBMTc3RUFCLCAweEJGMDE3MkJCLCAweEJFMDE3MUJBLCAweEJGMDE3MkJCLCAweEJFMDE3MkJBLCAweEJGMDE3MkJCLCAweEJFMDE3MkJBLCAweEJGMDE3MkJCLCAweEJFMDE3MkJBLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MkJBLCAweEJGMDE3MkJCLCAweEJFMDE3MUJBLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEFGMjQ4NUE0LCAweEI0QkVEOTY5LCAweEJGRENFQUIyLCAweEJDQkNENzc5LCAweEI4MTI3QkIwLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MUJBLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDE3M0JCLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MUJBLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDE3MkJCLCAweEJFMDE3MkJCLCAweEJGMDQ3NEJBLCAweEJDOTFDMDc4LCAweEJGRDNFNDk2LCAweEJGRDZFNkEwLCAweEJEQzVEQzc3LCAweEI4QTlDQjUyLCAweEJBOTRCRjQ2LCAweEI5OENCQjQ1LCAweEJEODhCODQ2LCAweEJFODlCQTQ3LCAweEJGODlCQTQ3LCAweEJCODdCODQ1LCAweEI3OTBCRDQ1LCAweEI0OUJDMjQ3LCAweEI2QjREMTVBLCAweEJEQ0RFMDg3LCAweEJGRDhFN0E1LCAweEJCQzlERTdCLCAweDg0QjdENTRDLCAweDI4QkNEOTY4LCAweDAyRjJGOEU0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI2RDdFOEExLCAweEE5QkREODVBLCAweEJGRDdFNkEyLCAweEI2QTdDOTRFLCAweEJFODlCQTQ3LCAweEJGODlCQTQ4LCAweEJGODlCQTQ3LCAweEJGODlCQjQ4LCAweEJFODlCQTQ3LCAweEFCOUJDNTQ1LCAweEJEQ0NFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjNENDRFLCAweDA4REJFQkIzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RTNFRUJDLCAweDlBQkJENzUzLCAweEJGRDdFNkEzLCAweEI4QjJEMjU2LCAweEJFODlCQTQ3LCAweEJGODlCQjQ3LCAweEJGODlCQTQ3LCAweEJGODlCQjQ3LCAweEJFODlCQTQ3LCAweEFEOTNCRTQzLCAweEJCQ0JERjgwLCAweEJGQ0VFMTg4LCAweDVBQjREMzRELCAweDA4RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RTBFREI0LCAweDk0QjlENjRGLCAweEJGRDdFN0EyLCAweEJBQjNEMTVELCAweEJEODlCQTQ3LCAweEJFODlCQTQ3LCAweEJGODlCQjQ4LCAweEJGODlCQTQ3LCAweEJDOEFCQjQ3LCAweEFCQkJENzVBLCAweEJGRDdFN0EzLCAweDkzQkFENjUyLCAweDE5Q0RFMzkyLCAweDAwRkZGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RUVGNUQ4LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQzc1LCAweEJBOEFCQTQ2LCAweEJGODlCQjQ3LCAweEJGODlCQTQ3LCAweEJGODlCQjQ3LCAweEJFODhCQTQ3LCAweEJGODlCQjQ3LCAweEJGODlCQTQ3LCAweEJGODlCQjQ3LCAweEJFODhCQTQ3LCAweEJGODlCQjQ3LCAweEJGODlCQTQ3LCAweEJGODlCQjQ3LCAweEJFODlCQTQ3LCAweEJEODlCOTQ3LCAweEI4OTBCRDQ1LCAweEI1QTBDNjRBLCAweEI4QkNENjY1LCAweEJGRDRFNDk4LCAweEJGRDVFNjlGLCAweEIwQzFEQTYzLCAweDVFQjZENTRGLCAweDBGRERFQ0I0LCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAzRjRGOUU2LCAweDYxQjZENTRCLCAweEJFQ0VFMTg5LCAweEJGQ0FERjdFLCAweEI5OEJCOTQ0LCAweEJGODlCQjQ3LCAweEJGODlCQTQ3LCAweEJGODlCQjQ4LCAweEJFODlCQTQ3LCAweEJGODlCQjQ3LCAweEJGODlCQTQ3LCAweEJGODlCQjQ3LCAweEJFODlCQTQ3LCAweEJGODlCQjQ3LCAweEJGODlCQTQ3LCAweEJGODlCQjQ3LCAweEJFODlCQTQ3LCAweEJGODlCQjQ3LCAweEJGODlCQTQ3LCAweEJGODlCQjQ3LCAweEJFODhCQTQ3LCAweEJGODlCQjQ3LCAweEJGODlCQTQ3LCAweEJEODlCQTQ3LCAweEE3QUJDQjRELCAweEJGRDdFN0EyLCAweEE3QkREODVCLCAweDI0QkFEODZBLCAweDA5RTJFRUI2LCAweDdGQjdENTRDLCAweEJGRDRFNTk5LCAweEJBQkRENjZBLCAweEJDOEFCQTQ2LCAweEJGODlCQjQ4LCAweEJGODlCQTQ3LCAweEJGODlCQTQ3LCAweEJFODhCQTQ3LCAweEJGODlCQjQ4LCAweEJGODlCQTQ3LCAweEJGODlCQTQ3LCAweEJFODlCQTQ3LCAweEJGOEFCQjQ3LCAweEJGODlCQTQ3LCAweEJGODlCQjQ3LCAweEJFODlCQTQ3LCAweEJFODdCOTQ2LCAweEI4OENCQjQ1LCAweEI2OTlDMTQ3LCAweEI3QjZEMjVDLCAweEJFRDFFMzkwLCAweEJGRDdFNkEyLCAweEI0QzREQzZBLCAweDY3QjVENDRDLCAweDEyRDJFNjlCLCAweDAwRkRGRUZCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNEUyRUFGNCwgMHg4NTIxNUZBNywgMHhCRjFDNjZBRCwgMHhCRjFCNkFBRiwgMHhCRjFCNkJCMCwgMHhCRjFBNkFCMCwgMHhCRjFCNkJCMCwgMHhCRjFCNkJCMCwgMHhCRjIxODBDMCwgMHhCRjIxODVDNSwgMHhCRjIyN0ZCRiwgMHhCRjFFNzhCQiwgMHhCRjFENzRCOCwgMHhCRjFCNzFCNSwgMHhCRjFDNkVCNCwgMHhCRjFCNkNCMiwgMHhCRjFCNkNCMiwgMHhCRjFBNkJCMiwgMHhCRjFDNkRCMywgMHhCRjFDNkVCNCwgMHhCRjFCNzJCNywgMHhCRjFENzZCOSwgMHhCRjFGN0JCRCwgMHhCRjIxODFDMSwgMHhCRjIzODhDNiwgMHhCRjFGNzlCQiwgMHhCRjFCNkJCMCwgMHhCRjFCNkFBRiwgMHhCRjFCNkJCMCwgMHhCRjFCNkFBRiwgMHhCRjE5NkNCMCwgMHhCRjE4NjdBRCwgMHg1ODU2ODZCRCwgMHgwMEZDRkRGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZDRkRGQywgMHgwNEU1RUZFNCwgMHgxRkFEQ0ZBQiwgMHg1OTc1QUU2RiwgMHg5NjUxOUE0NywgMHhCOTU2OUU0NCwgMHhCRjY2QTg0NiwgMHhCRjg0QjY0QywgMHhCRkE4Qzk1QiwgMHhCRkJCRDI2MiwgMHhCRkIxQ0U1OCwgMHhCRkE1Qzk1MCwgMHhCRkEyQzg1MCwgMHhCRjk5QzU0QywgMHhCRjg2QzM0NiwgMHhCRjdEQzI0MywgMHhCRjdDQzI0MywgMHhCRjdCQzE0MywgMHhCRjdBQzE0NCwgMHhCRjc5QzE0MywgMHhCRjc4QzE0NCwgMHhCRjc3QzA0NCwgMHhCRjc3QzA0NCwgMHhCRjc1QzA0NCwgMHhCRjc0QzA0NSwgMHhCRjcyQkY0NCwgMHhCRjcyQkY0NSwgMHhCRjcwQkY0NCwgMHhCRjZGQkY0NSwgMHhCRjZEQkQ0NSwgMHhCRjY2Qjc0NiwgMHhCRjVDQUY0NywgMHhCRjRCQTM0NywgMHhCNDM2OTc0NiwgMHgyRjgyQkY5MywgMHgwMUY3RkFFRSwgMHgxQ0MxREM3NiwgMHg3N0I1RDQ0QiwgMHhCOUM3REU3NCwgMHhCRkQ4RTdBNSwgMHhCRUM3REQ4OSwgMHhCQjZEQUM4NSwgMHhCRDE5N0ZBQywgMHhCRjAxNzJCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAxNzJCQiwgMHhCMjE4N0VBQywgMHhBNDc5QjM3MSwgMHhCOUM2REQ3NywgMHhCRkQ4RTdBNSwgMHhCM0MzREI2OSwgMHg2Q0I1RDQ0OSwgMHhCNUM0REM2QywgMHhCRkQ1RTU5QiwgMHhCNzUzOUU4QSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAxNzJCQywgMHhBNDZGQUU3NCwgMHhCRkQyRTQ5NCwgMHhCOEM4REU3NSwgMHgzQkJERDk2NiwgMHgwMEZGRkZGRSwgMHgwMEZGRkZGRiwgMHgxOUNDRTI5MCwgMHg4QkI4RDY0RCwgMHhCRkQ2RTY5RSwgMHhCQkFEQ0Y3NSwgMHhCQjA3NzVCNywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCNTExN0JCMiwgMHhBREFFRDA2NCwgMHhCRkQ4RTdBMywgMHg5NEJBRDY1NCwgMHgxMEU2RjFDNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyMEM1REU3RSwgMHg5NkJBRDc1MSwgMHhCRkQ3RTZBMiwgMHhCNjlCQzY3NywgMHhCRDA0NzNCOSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBQjI5ODhBMSwgMHhCN0MyREE2RSwgMHhCRkRDRUFCMiwgMHhCODk0QzI3NCwgMHhCRTAyNzNCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBQTMzOEQ5OSwgMHhCOUM3REQ3MywgMHhCRkQzRTQ5NiwgMHg2RkI2RDU0RSwgMHgxQkJBRDg2QSwgMHg4QUI4RDU0QywgMHhCRkQ1RTU5RCwgMHhCOEFDQ0Y3OCwgMHhCQjBBNzdCNCwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhBODM4OTA5NiwgMHhCOUM4REU3OCwgMHhCRkRDRUFCMiwgMHhCOEFCQ0U3MCwgMHhCRTA0NzRCQSwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjA4NzZCQiwgMHhCRkMyREJBOSwgMHhCRkNERTE4NywgMHhCRUE4Q0E1MSwgMHhCQzhEQkI0NiwgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg3Qjk0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRDg4Qjk0NywgMHhCMzk3QzA0NSwgMHhCN0JERDc2NCwgMHhCRkQ2RTZBMCwgMHhCRENGRTI4OSwgMHg4N0I3RDU0RCwgMHgyM0M1REU3RCwgMHgwMUZDRkRGOSwgMHgwMEZGRkZGRiwgMHgyNkQ4RThBMSwgMHhBOUJFRDg1QSwgMHhCRkQ2RTZBMiwgMHhCNkE3Qzk0RiwgMHhCRjg3Qjk0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg5QkE0OCwgMHhCRjg4Qjk0NywgMHhBQjlBQzU0NiwgMHhCRUNDRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkI0RDQ0RSwgMHgwOERDRUJCNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCOEIxRDE1NiwgMHhCRjg3QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhBRDkzQkU0MywgMHhCQkNCRTA4MSwgMHhCRkNGRTI4OCwgMHg1QUI0RDQ0RCwgMHgwOEVCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyMERGRURCMSwgMHhBMkJDRDc1NiwgMHhCRkQ4RTdBNCwgMHhCN0FFQ0Y1NCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRDg5QkE0NywgMHhBQ0FGQ0Y1MSwgMHhCRkQ4RTdBNCwgMHhBMUJERDg1OSwgMHgyMUJEREE2RiwgMHgwMEZGRkZGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUVFRjVEOCwgMHg2RkI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REM3NSwgMHhCQTg5Qjk0NiwgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg5QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCQThBQkE0NiwgMHhCNEE0Qzk0QywgMHhCQ0NBREY3RSwgMHhCRkQ4RTdBNiwgMHhCNUMzREI2OSwgMHg1QkI2RDU1MCwgMHgwQkRERUNCNSwgMHgwMEZGRkZGRiwgMHgwM0Y1RjlFNywgMHg2MUI2RDU0QiwgMHhCRUNGRTI4OSwgMHhCRkNBREY3RSwgMHhCOThBQjk0NSwgMHhCRjg4QkE0OCwgMHhCRjg4Qjk0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg5QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg4Qjk0NywgMHhCRjg5QkE0OCwgMHhCRjg4Qjk0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRTg4QkE0NywgMHhBN0FBQ0I0RCwgMHhCRkQ3RTdBMiwgMHhBN0JFRDg1QiwgMHgyNEJCRDk2QSwgMHgwOUUyRUVCNiwgMHg3RkI3RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUJERDY2QiwgMHhCQzg5Qjk0NiwgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg3Qjk0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4QkE0NywgMHhCRjg5QkI0OCwgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0NywgMHhCRjg4QkE0OCwgMHhCRjg4Qjk0NywgMHhCRjg4QkE0OCwgMHhCQzg4Qjg0NiwgMHhCNDlFQzQ0OCwgMHhCQ0M2REM3NiwgMHhCRkQ4RTdBNiwgMHhCN0M1REM2RSwgMHg1RkI2RDU0RSwgMHgwQ0Q5RUFBRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUE5OEI0RDYsIDB4QjQxRDYwQTgsIDB4QkYxQzY4QUUsIDB4QkYxQTZBQUYsIDB4QkYxQjZCQUYsIDB4QkYxQTZBQUYsIDB4QkYxQjZCQjAsIDB4QkYxQTZBQUYsIDB4QkYxQTZCQjAsIDB4QkYxRDc1QjgsIDB4QkYyMTdEQkUsIDB4QkYxRTc4QkEsIDB4QkYxRDc0QjgsIDB4QkYxQTcwQjUsIDB4QkYxQzZGQjMsIDB4QkYxQTZEQjIsIDB4QkYxODZDQjIsIDB4QkYxODZDQjIsIDB4QkYxQTZFQjMsIDB4QkYxQjZGQjQsIDB4QkYxQzcyQjYsIDB4QkYxRTc1QjksIDB4QkYyMDdCQkQsIDB4QkYyMTdEQkUsIDB4QkYxRDcyQjUsIDB4QkYxQTZBQUYsIDB4QkYxQjZCQjAsIDB4QkYxQTZBQUYsIDB4QkYxQjZCQjAsIDB4QkYxQTZBQUYsIDB4QkYxQjZCQjAsIDB4QkYxNDZFQjIsIDB4OTYxRTYxQTksIDB4MDZEMkRGRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGOUZDRjksIDB4MTZBQUNEQTksIDB4NTA3M0FDNkUsIDB4OEQ1Mjk5NDcsIDB4QjY1NzlDNDMsIDB4QkU2NkE0NDQsIDB4QkY4M0I1NEMsIDB4QkZBOEM4NUEsIDB4QkZDOEQ5NkQsIDB4QkZEM0RGNzUsIDB4QkZDMkQ2NjMsIDB4QkZCMENDNTQsIDB4QkZBRENDNTIsIDB4QkZBNkM5NEYsIDB4QkY5MkM2NDksIDB4QkY4MUMyNDMsIDB4QkY4MEMyNDMsIDB4QkY3RUMyNDMsIDB4QkY3REMyNDMsIDB4QkY3Q0MxNDMsIDB4QkY3QkMxNDMsIDB4QkY3QUMxNDMsIDB4QkY3OUMxNDQsIDB4QkY3OEMwNDQsIDB4QkY3N0MwNDQsIDB4QkY3NkMwNDMsIDB4QkY3NUMwNDQsIDB4QkY3M0JGNDQsIDB4QkY3MkJGNDQsIDB4QkY3MUJFNDQsIDB4QkY3MEJFNDUsIDB4QkY2OUI5NDUsIDB4QkY2N0I0NDgsIDB4QkY1OEE5NDcsIDB4QkMzRDlBNDYsIDB4NTI1RUFCNzIsIDB4MDFGOEZCRjcsIDB4MTdDQUUxOEQsIDB4NzdCNkQ1NEIsIDB4QkJDOURFN0EsIDB4QkZEOEU3QTQsIDB4QkRBN0NDN0UsIDB4QkMyQzhBQTEsIDB4QkUwMTcxQkEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkMwNDczQjksIDB4QTA2NEE3N0EsIDB4QjlDNkRENzYsIDB4QkZEN0U2QTIsIDB4QUVCQ0Q3NTYsIDB4QkRDQURGN0MsIDB4QkZDRkUyOEUsIDB4QjUzNzhGOTcsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkQwMjczQkEsIDB4QTM4N0JBNkEsIDB4QkZENkU2OUYsIDB4QUZDMkRBNjUsIDB4MjVDRkUzOEYsIDB4MDBGRUZFRkUsIDB4MDBGRUZFRkMsIDB4MjRDNURFN0UsIDB4OUNCQkQ3NTMsIDB4QkZEN0U2QTMsIDB4QjY5NUMzNzMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QUYyMzg1QTQsIDB4QjNDMURBNjksIDB4QkZENUU2OUQsIDB4N0VCN0Q1NEUsIDB4MDZFNkYxQ0EsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MkVCRURBNkIsIDB4QTZCREQ4NTksIDB4QkZEN0U2QTMsIDB4Qjg3RkI2NzksIDB4QkUwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QTU0OTk5OEIsIDB4QkNDQURGN0UsIDB4QkZEOUU4QUIsIDB4QjQ3M0FGN0QsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTQ0QzlCODgsIDB4QkRDREUxODQsIDB4QkRDREUxODYsIDB4NTRCREQ5NUYsIDB4MjVDNERFN0QsIDB4OUNCQkQ3NTMsIDB4QkZEN0U3QTMsIDB4Qjk5NEMyNzUsIDB4QkQwMTcyQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTU1OEEyODIsIDB4QkRDRUUxODgsIDB4QkZEQkU5QUQsIDB4QjU4N0JCNzgsIDB4QkYwMTcyQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYxQjgwQjgsIDB4QkZCRUQ4NzgsIDB4QkY5N0MxNEEsIDB4QkY4N0I5NDcsIDB4QkY4N0JBNDcsIDB4QkY4N0I5NDcsIDB4QkY4N0JBNDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4NkI5NDcsIDB4QjY4Q0JCNDUsIDB4QjVCMkQwNTcsIDB4QkZENUU2OUQsIDB4QkNDQ0UwODMsIDB4NzVCNkQ1NEMsIDB4MTNEMEU1OUEsIDB4MDBGRkZGRkYsIDB4MjZEOEU4QTEsIDB4QTlCREQ4NUEsIDB4QkZENkU2QTIsIDB4QjZBNkM5NEYsIDB4QkU4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4NkI5NDcsIDB4QkY4OEJBNDgsIDB4QkY4N0I5NDcsIDB4QUI5OUM0NDUsIDB4QkRDQkUwODEsIDB4QkVDRUUxODYsIDB4NTZCM0Q0NEUsIDB4MDdEQkVCQjMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTMsIDB4QkZEN0U2QTIsIDB4QjhCMkQyNTYsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDgsIDB4QkY4N0I5NDcsIDB4QUM5MkJFNDMsIDB4QkFDQkRGODAsIDB4QkZDRUUxODgsIDB4NUFCNEQ0NEQsIDB4MDdFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MkRDOERGNzcsIDB4QUNDMEQ5NjAsIDB4QkZEN0U2QTEsIDB4QjVBMUM3NEQsIDB4QkY4N0I5NDcsIDB4QkY4NkI5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkU4N0I5NDcsIDB4QURBN0NBNEIsIDB4QkZEN0U2QTAsIDB4QUNDMEQ5NjEsIDB4MkNCRERBNkQsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDVFRUY1RDgsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERDNzUsIDB4QkE4OEI5NDYsIDB4QkY4N0JBNDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0JBNDcsIDB4QkY4N0I5NDcsIDB4QkY4OEJBNDcsIDB4QkY4N0I5NDcsIDB4QkU4N0I5NDcsIDB4QjI5QUMzNDYsIDB4QkJDN0RENzYsIDB4QkZEN0U3QTQsIDB4QURDMEQ5NjAsIDB4M0ZCQUQ3NUYsIDB4MDNGMEY3RTAsIDB4MDNGNEY5RTYsIDB4NjFCNUQ0NEEsIDB4QkVDRUUxODgsIDB4QkZDOURFN0UsIDB4Qjk4QUI5NDUsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0JBNDgsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0JBNDgsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I4NDYsIDB4QkY4N0JBNDgsIDB4QkY4N0I5NDcsIDB4QkY4OEI5NDcsIDB4QkY4N0I5NDcsIDB4QkU4N0I5NDcsIDB4QTdBQUNCNEQsIDB4QkZEN0U2QTIsIDB4QTZCREQ4NUIsIDB4MjRCQkQ5NkEsIDB4MDlFMkVFQjYsIDB4N0ZCN0Q1NEMsIDB4QkZEM0U0OTgsIDB4QkFCQ0Q2NkEsIDB4QkM4OEI5NDYsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0JBNDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0JBNDcsIDB4QkY4N0I5NDcsIDB4QkY4N0JBNDgsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0JBNDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QkY4N0I5NDcsIDB4QjQ5M0JFNDQsIDB4QkJDNERCNzAsIDB4QkZEOEU3QTUsIDB4QUVDMURBNjIsIDB4NDFCNkQ1NTcsIDB4MDNFRkY2REUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDQ3NEQ3RUI4LCAweEJFMUI2NEFCLCAweEJGMUM2QUFGLCAweEJGMUI2QkIwLCAweEJGMUI2QkIwLCAweEJGMUE2QkFGLCAweEJGMUI2QkIwLCAweEJGMUE2QUFGLCAweEJGMUI2QkIwLCAweEJGMUE2QkIwLCAweEJGMUE2RUIyLCAweEJGMUI3NEI2LCAweEJGMUI3NkI5LCAweEJGMTc3NUI4LCAweEJGMTc3NEI3LCAweEJGMTU3MkI2LCAweEJGMTY3MkI2LCAweEJGMTQ3MUI2LCAweEJGMTY3M0I3LCAweEJGMTg3M0I3LCAweEJGMUE3NUI4LCAweEJGMUQ3NUI4LCAweEJGMUU3MkI1LCAweEJGMUE2Q0IxLCAweEJGMUI2QkIwLCAweEJGMUI2QkFGLCAweEJGMUI2QkIwLCAweEJGMUI2QUIwLCAweEJGMUI2QkFGLCAweEJGMUE2QUFGLCAweEJGMUM2QkIwLCAweEJGMTE3NEI3LCAweEI1MUQ2MkFBLCAweDFFODlBQUQwLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjJGOEYyLCAweDc1NTc5QjUyLCAweEJGNTU5QTQ0LCAweEJGNjJBMjQ0LCAweEJGOERCOTRFLCAweEJGQzdEODZELCAweEJGREJFNDdFLCAweEJGRTBFNjgyLCAweEJGQ0ZERDZGLCAweEJGQkFEMTU4LCAweEJGQjZEMDU1LCAweEJGQjNDRjU1LCAweEJGQTRDQjRGLCAweEJGOEFDNTQ1LCAweEJGODRDNDQzLCAweEJGODJDMzQzLCAweEJGODFDMzQzLCAweEJGN0ZDMjQzLCAweEJGN0ZDMzQ0LCAweEJGN0RDMjQzLCAweEJGN0NDMjQzLCAweEJGN0FDMTQzLCAweEJGN0FDMTQ0LCAweEJGNzlDMTQ0LCAweEJGNzhDMTQ0LCAweEJGNzZDMDQ0LCAweEJGNzZDMDQ1LCAweEJGNzRDMDQ0LCAweEJGNzNDMDQ0LCAweEJGNzJCRjQ0LCAweEJGNkZCRDQ1LCAweEJGNzFCODRBLCAweEJGNjRBRjRBLCAweEJFNDQ5RTQ2LCAweDc5NEFBMTVELCAweDA1REZFRUUzLCAweDBDREFFQUFFLCAweDYxQjVENDRDLCAweEI5QzdERTczLCAweEJGRDhFN0E0LCAweEJEOUZDODdCLCAweEJEMTY3REFELCAweEJGMDE3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJCMDU3NEI4LCAweEEwODNCOTZCLCAweEJGRDFFMzkwLCAweEJGQ0ZFMjhBLCAweEJGRDFFMzkwLCAweEJFQzdERDdELCAweEI4MTk3RkFCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJDMDc3NUI4LCAweEE3QTlDRDVGLCAweEJGRDhFN0E0LCAweEEwQkREODU5LCAweDE1RDdFOEE1LCAweDAwRkZGRkZGLCAweDAxRkNGREY3LCAweDM1QjZENTU5LCAweEFCQzBEOTVFLCAweEJGRDdFNkEyLCAweEI2NzFBRjgwLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEE3M0I5Mjk1LCAweEI5QzlERTc5LCAweEJGRDJFNDkyLCAweDY1QjlENzU2LCAweDAyRkNGREY3LCAweDAwRkZGRkZGLCAweDAxRjVGQUU5LCAweDQwQjhENjVBLCAweEIzQzNEQjY4LCAweEJGRDVFNTlELCAweEI1NUVBNDg1LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEEzNjBBNjdELCAweEJFRDFFMzkwLCAweEJGRDZFNjlGLCAweEI3NTQ5Rjg5LCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDE3MkJDLCAweEE0NzBBRTczLCAweEJGRDNFNDk0LCAweEI4QzhERTc2LCAweDNDQjdENjU5LCAweDM0QkFEODYzLCAweEFCQzBEOTVFLCAweEJGRDdFN0EyLCAweEI0NzRCMTdELCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJCLCAweEEyNzVCMTcyLCAweEJGRDNFNDk4LCAweEJGRDhFN0E1LCAweEI4NkJBQzdGLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMzA4QjlGLCAweEJGOTBCRDQ4LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODZCOTQ4LCAweEJGODZCOTQ3LCAweEJGODZCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ4LCAweEJGODdCOTQ4LCAweEI2OEFCOTQ1LCAweEI1QjlENTVELCAweEJGRDhFN0E0LCAweEI0QzREQzZBLCAweDQ5QjVENTUzLCAweDA1RTlGM0NGLCAweDI3RDhFOEExLCAweEE5QkREODVBLCAweEJGRDdFNkEyLCAweEI2QTdDOTRGLCAweEJGODVCODQ3LCAweEJGODdCOTQ3LCAweEJGODZCODQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEFCOTlDNDQ1LCAweEJFQ0NFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjRENDRGLCAweDA4RENFQkI0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzU0LCAweEJGRDdFNkEzLCAweEI4QjJEMjU2LCAweEJGODdCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCODQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEFEOTJCRTQzLCAweEJCQ0JFMDgwLCAweEJGQ0VFMjg4LCAweDVCQjRENDRFLCAweDA4RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDNFQzZERTc0LCAweEI0QzREQzZCLCAweEJGRDVFNTlCLCAweEI5OUFDMzQ4LCAweEJGODdCQTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCODQ3LCAweEJGODdCOTQ4LCAweEE4QTVDQTQ3LCAweEJGRDVFNTlBLCAweEI0QzVEQzZELCAweDM5QjdENzVDLCAweDAxRjRGOUU5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RUZGNkQ4LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzVEQzc2LCAweEJBODhCOTQ2LCAweEJGODdCOTQ3LCAweEJGODZCOTQ3LCAweEJGODZCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODZCOTQ4LCAweEJGODZCOTQ3LCAweEJGODZCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODZCOTQ3LCAweEJFODZCOTQ3LCAweEIxOUNDNDQ3LCAweEJEQ0NFMDgzLCAweEJGRDVFNTlCLCAweDhFQjlENjRGLCAweDFEQ0JFMjhDLCAweDAzRjVGOUU2LCAweDYxQjZENTRCLCAweEJFQ0VFMTg5LCAweEJGQ0FERjdFLCAweEJBODlCOTQ1LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODZCOTQ4LCAweEJGODZCODQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODZCOTQ4LCAweEJGODZCODQ3LCAweEJGODZCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCODQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJFODdCOTQ3LCAweEE4QUFDQjRFLCAweEJGRDdFN0EyLCAweEE3QkREODVCLCAweDI0QkJEOTZBLCAweDBBRTJFRUI2LCAweDdGQjdENTRDLCAweEJGRDRFNTk5LCAweEJBQkRENjZCLCAweEJDODdCOTQ2LCAweEJGODZCOTQ3LCAweEJGODZCOTQ3LCAweEJGODdCOTQ3LCAweEJGODZCOTQ3LCAweEJGODdCOTQ3LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCODQ3LCAweEJGODZCOTQ4LCAweEJGODZCOTQ3LCAweEJGODdCOTQ4LCAweEJGODZCOTQ3LCAweEJGODZCOTQ4LCAweEJGODZCOTQ3LCAweEJGODZCOTQ3LCAweEJGODZCODQ3LCAweEIzOTdDMDQ2LCAweEJEQ0JERjgxLCAweEJGRDVFNTlCLCAweDhDQjlENjRGLCAweDFBQ0FFMThBLCAweDAwRkVGRkZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkVGRiwgMHg3MjQ5N0NCOCwgMHhCRjFCNjZBQywgMHhCRjFCNkJCMCwgMHhCRjFCNkFBRiwgMHhCRjFCNkJCMCwgMHhCRjFBNkFBRiwgMHhCRjFBNkJBRiwgMHhCRjFCNkFBRiwgMHhCRjFCNkNCMSwgMHhCRjE4NkVCMiwgMHhCRjE3NzBCNCwgMHhCRjE0NzFCNCwgMHhCRjEyNzNCNiwgMHhCRjExNzRCNywgMHhCRjEyNzZCOCwgMHhCRjEyNzZCOCwgMHhCRjEzNzZCOSwgMHhCRjEwNzZCOCwgMHhCRjExNzZCOSwgMHhCRjEyNzVCNywgMHhCRjE0NzRCNiwgMHhCRjE1NzJCNSwgMHhCRjE3NzBCNCwgMHhCRjE3NkVCMiwgMHhCRjFCNkRCMSwgMHhCRjFBNkJBRiwgMHhCRjFCNkFBRiwgMHhCRjFCNkFBRiwgMHhCRjFCNkJCMCwgMHhCRjFCNkFBRiwgMHhCRjFCNkFCMCwgMHhCRjBBNzhCQSwgMHhCRTFDNjVBQywgMHgzRjU4ODZCRCwgMHgwMEZFRkVGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg2NTdDQjA3NSwgMHhCRjVFQTA0MywgMHhCRjg5QjY0QiwgMHhCRkQ1REY3NiwgMHhCRkY1RjJBQSwgMHhCRkUwRTY4NCwgMHhCRkM4RDc2MywgMHhCRkJFRDM1OSwgMHhCRkJDRDI1OCwgMHhCRkI3RDA1NiwgMHhCRjlEQzk0QiwgMHhCRjg4QzQ0NCwgMHhCRjg2QzM0MywgMHhCRjg1QzQ0NCwgMHhCRjgzQzM0MiwgMHhCRjgzQzM0MywgMHhCRjgwQzI0MiwgMHhCRjgwQzM0MywgMHhCRjdEQzI0MywgMHhCRjdEQzI0MywgMHhCRjdDQzE0MywgMHhCRjdCQzE0MywgMHhCRjc5QzE0MywgMHhCRjc5QzE0NCwgMHhCRjc4QzA0NCwgMHhCRjc2QzA0NCwgMHhCRjc1QkY0MywgMHhCRjc0QzA0NSwgMHhCRjczQkU0NSwgMHhCRjdBQkI0QiwgMHhCRjZFQjM0QiwgMHhCRjRDQTI0NywgMHg5OTM5OTc0QSwgMHgxMEI0RDhCRCwgMHgwMUY3RkFFRSwgMHgzQkI5RDc1RSwgMHhBOUJFRDg1QiwgMHhCRkQ4RTdBNSwgMHhCREFCQ0U3RSwgMHhCRDE3N0VBRSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRTAwNzFCQiwgMHhCRjAxNzJCQiwgMHhCQjAyNzJCQSwgMHhCRjAxNzJCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBQzI2ODZBMywgMHhCMEJDRDc2NSwgMHhCRkQ4RTdBNSwgMHhCRkQ3RTZBMCwgMHhCOEI2RDQ3NCwgMHhCRDBBNzdCNCwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCMzEzN0NCMCwgMHhBRkI4RDU2NCwgMHhCRkQ3RTdBMiwgMHg4Q0I4RDU1MCwgMHgwQkU2RjFDOCwgMHgwMEZGRkZGRiwgMHgwMkZCRkRGNywgMHg0NUI2RDU1NiwgMHhCN0M1REM2QywgMHhCRkQ0RTU5QSwgMHhCNzU1QTA4OCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhBNTVDQTQ3RiwgMHhCRUNFRTI4OSwgMHhCQ0NDRTA4MSwgMHg0QUI3RDY1OCwgMHgwMUZERkVGQSwgMHgwMEZGRkZGRiwgMHgwNUVFRjZEQywgMHg1NEI0RDQ0RCwgMHhCQUM5REU3OCwgMHhCRUQxRTM5MiwgMHhCNzNFOTM5NCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRTAwNzFCQiwgMHhBNTg0Qjk2QSwgMHhCRkQ2RTZBMCwgMHhCRkNGRTI4RiwgMHhCNTM1OEU5OSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRTAyNzNCQiwgMHhBMjg3QkE2QSwgMHhCRkQ2RTY5RiwgMHhBRkMxREE2NSwgMHgyOENCRTI4OSwgMHg0NkI0RDQ1MSwgMHhCNUM0REM2QywgMHhCRUQ0RTQ5QSwgMHhCODU0OUY4OSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRTAwNzFCQiwgMHhCRjAxNzJCQywgMHhCRTAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRTAwNzFCQiwgMHhCRjAxNzJCQywgMHhCRTAwNzFCQiwgMHhCRjAwNzJCQiwgMHhCRTAwNzFCQiwgMHhCRjAxNzJCQiwgMHhCRTAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRDAyNzJCQSwgMHhBNTkzQzE2NiwgMHhCRkQ3RTdBNCwgMHhCRkQzRTQ5NywgMHhCNDQ5OTk4RCwgMHhCRjAxNzJCQywgMHhCRTAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRTAwNzFCQiwgMHhCRjAxNzJCQywgMHhCRTAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRTAwNzFCQiwgMHhCRjAwNzJCQiwgMHhCRTAwNzFCQiwgMHhCRjAxNzJCQiwgMHhCRjAwNzJCQiwgMHhCRjAxNzJCQywgMHhCRjAxNzJCQSwgMHhCRjRDOTg3NiwgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRTg1Qjg0NywgMHhCRDgzQjU0NSwgMHhCRTg1Qjc0NywgMHhCRTg1Qjg0NywgMHhCRjg2Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg2Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCMTkxQkQ0NCwgMHhCQUM4REU3NiwgMHhCRkQ1RTY5RCwgMHg4REI4RDY0RiwgMHgxQUM2REY4MywgMHgyNkQ4RThBMCwgMHhBOUJERDg1QSwgMHhCRkQ3RTZBMiwgMHhCNkE2Qzk0RSwgMHhCRTg0Qjc0NiwgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhBQjk5QzQ0NSwgMHhCRENDRTA4MSwgMHhCRUNERTE4NiwgMHg1NkIzRDM0RSwgMHgwOERCRUJCMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEUzRUVCQywgMHg5QUJCRDc1MywgMHhCRkQ3RTZBMywgMHhCOEIxRDE1NiwgMHhCRjg1Qjg0NywgMHhCRjg2Qjk0OCwgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhBRDkxQkQ0MywgMHhCQkNCREY4MCwgMHhCRkNFRTE4OCwgMHg1QUI0RDQ0RCwgMHgwOEVCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkRGOSwgMHg0REMzREM2QSwgMHhCQkM4REU3NywgMHhCRkQxRTQ5MiwgMHhCNjk2QzE0NiwgMHhCRjg2Qjk0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjk0OCwgMHhCRjg1Qjg0NywgMHhCRjg2Qjk0NywgMHhBQjlBQzM0NSwgMHhCRkQxRTM5MSwgMHhCQUM4REU3OCwgMHg0N0IzRDQ1MSwgMHgwM0VFRjVEQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNEVFRjVEOCwgMHg2RUI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REM3NSwgMHhCQTg3Qjg0NiwgMHhCRjg2Qjg0OCwgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg2Qjk0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRTg1Qjg0NywgMHhCRjg1Qjk0OCwgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRDg2Qjk0NywgMHhBRkFCQ0M0RSwgMHhCRkQ2RTY5RSwgMHhCOUM3REQ3MywgMHg0RUI1RDU1MiwgMHgwN0UyRUZDMCwgMHg2MUI2RDU0QiwgMHhCRUNFRTE4OSwgMHhCRkM5REU3RSwgMHhCOTg5Qjg0NSwgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg2Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg2Qjg0OCwgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRTg1Qjg0NywgMHhCRjg2Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRTg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRTg1Qjg0NywgMHhCRjg2Qjg0NywgMHhCRjg1Qjg0NywgMHhCRDg2Qjg0NywgMHhBN0FBQ0I0RCwgMHhCRkQ3RTdBMiwgMHhBN0JERDg1QiwgMHgyNEJCRDk2QSwgMHgwOUUyRUVCNiwgMHg3RkI3RDU0QywgMHhCRkQ0RTQ5OSwgMHhCQUJDRDU2QSwgMHhCQzg2Qjg0NiwgMHhCRjg1Qjg0OCwgMHhCRjg1Qjg0NywgMHhCRjg2Qjg0NywgMHhCRjg1Qjc0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRTg1Qjg0NiwgMHhCRjg2Qjk0OCwgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRTg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg1Qjg0NywgMHhCRjg2Qjg0NywgMHhCRjg1Qjg0NywgMHhCRTg1Qjg0NiwgMHhCMUFBQ0I0RCwgMHhCRkQ2RTZBMCwgMHhCN0M2REQ3MSwgMHg0OUI2RDU1NCwgMHgwM0VFRjZEQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJERkU4RjIsIDB4OEMyMzYyQTksIDB4QkYxQTY3QUQsIDB4QkYxQjZCQjAsIDB4QkYxQjZBQUYsIDB4QkYxQjZCQjAsIDB4QkYxQjZCQUYsIDB4QkYxQjZDQjAsIDB4QkYxQTZEQjEsIDB4QkYxODcwQjQsIDB4QkYxMzcyQjUsIDB4QkYxMTc1QjcsIDB4QkYxMDc2QjgsIDB4QkYwRTc4QjksIDB4QkYwRTc4QkEsIDB4QkYwRTdBQkIsIDB4QkYwRDdBQkIsIDB4QkYwRDdCQkMsIDB4QkYwRDdBQkEsIDB4QkYwRDdBQkIsIDB4QkYwRjc5QjksIDB4QkYwRjc4QkEsIDB4QkYxMDc2QjgsIDB4QkYxMjc1QjcsIDB4QkYxMzcyQjUsIDB4QkYxNzcxQjQsIDB4QkYxODZFQjIsIDB4QkYxQTZDQjEsIDB4QkYxQTZBQUYsIDB4QkYxQTZCQjAsIDB4QkYxQjZCQjAsIDB4QkYxQjZCQjAsIDB4QkYwQTdDQkQsIDB4QkYxQTY4QUUsIDB4NUIzNzcwQjAsIDB4MDBGRUZFRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NTI3REIxNzUsIDB4QkY2MkEyNDQsIDB4QkZBOUM2NTUsIDB4QkZFNEU5OEMsIDB4QkZFOEVCOTIsIDB4QkZDQkQ5NjMsIDB4QkZDNEQ1NUIsIDB4QkZDMkQ0NUIsIDB4QkZCQUQxNTcsIDB4QkY5OEM4NEEsIDB4QkY4OUM0NDQsIDB4QkY4OUM1NDUsIDB4QkY4N0M0NDQsIDB4QkY4N0M0NDQsIDB4QkY4NEMzNDMsIDB4QkY4M0M0NDMsIDB4QkY4MkMzNDMsIDB4QkY4MEMzNDMsIDB4QkY3RkMyNDMsIDB4QkY3RUMzNDMsIDB4QkY3REMyNDMsIDB4QkY3QkMyNDMsIDB4QkY3QUMxNDMsIDB4QkY3QUMxNDQsIDB4QkY3OEMwNDQsIDB4QkY3N0MxNDQsIDB4QkY3NkMwNDQsIDB4QkY3OEMwNDYsIDB4QkY4MEJENEIsIDB4QkY3OEI4NEMsIDB4QkY1NEE1NDYsIDB4QjAzRDk4NDYsIDB4Mjg4RkMzOUIsIDB4MDBGRkZGRkYsIDB4MTNEN0U4QTgsIDB4N0RCNkQ1NEEsIDB4QkVEMEUzOEYsIDB4QkZDQkUwOEQsIDB4QkIzNjhGOUIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkUwMjcyQkEsIDB4QjAyNzg3QTEsIDB4QTY2NkE5N0EsIDB4QTc5M0MyNjcsIDB4QThBNkNCNUUsIDB4QTI5M0MxNjUsIDB4QTI1MzlFODUsIDB4QjcwQzc4QjUsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkMwNDc0QkEsIDB4QTI5NkMzNjMsIDB4QkZEN0U3QTEsIDB4QkZEOUU4QTcsIDB4Qjg5N0MzNzcsIDB4QkQwMzczQjksIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QUEzMDhDOUQsIDB4QjlDM0RCNkYsIDB4QkZENEU1OTksIDB4NzNCNkQ1NEQsIDB4MDVGMUY4RTEsIDB4MDBGRkZGRkYsIDB4MDZFNkYxQzksIDB4NUJCNUQ0NEMsIDB4QkNDQkUwN0YsIDB4QkZDRkUyOEMsIDB4QjUzMjhEOUMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QTM3NUIyNzMsIDB4QkZEM0U1OTgsIDB4QjdDNkRENkYsIDB4MzFDNURENzgsIDB4MDBGRUZGRkQsIDB4MDBGRkZGRkYsIDB4MDlFMEVFQkMsIDB4NjhCNUQ0NEIsIDB4QkZDRkUyODksIDB4QkRDOERFODUsIDB4QjgyNjg3QTIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkEwNjc0QjgsIDB4QTc5OUM1NjYsIDB4QkZEQUU5QUMsIDB4QkVDOERFN0QsIDB4QjgxOTdGQUIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkMwNjc1QjgsIDB4QTdBOUNENUYsIDB4QkZEOEU3QTQsIDB4QTFCQ0Q4NTksIDB4MUJCRkRCNzIsIDB4NUFCNUQ0NEUsIDB4QkRDQkRGN0QsIDB4QkVDRkUxOEUsIDB4QjYzNzkwOTksIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkQwMjczQkEsIDB4ODk2MUE3N0QsIDB4QTM3NkIyNzIsIDB4QTY3N0IyNzQsIDB4QTY3N0IyNzMsIDB4QTY3N0IyNzQsIDB4QTY3N0IyNzMsIDB4QTY3N0IyNzQsIDB4QTY3N0IyNzQsIDB4QTY3N0IyNzQsIDB4QTY3N0IyNzMsIDB4QTY3N0IyNzQsIDB4QTY3N0IyNzMsIDB4QTY3N0IyNzQsIDB4QTY3OEIyNzIsIDB4QjFCOUQ2NUUsIDB4QkZEQUU5QUQsIDB4QkZDRkUyOEEsIDB4QUE4QkJENjYsIDB4QTY3N0IyNzQsIDB4QTY3N0IyNzMsIDB4QTY3N0IyNzMsIDB4QTY3NkIyNzMsIDB4QTY3N0IyNzQsIDB4QTM3NkIxNzMsIDB4N0I2M0E4N0UsIDB4QjUwMjczQkEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QjcwQjc4QjYsIDB4ODk2RUFENzUsIDB4QTU3N0IyNzQsIDB4QTY3NkIyNzMsIDB4QUI3QUI0NzIsIDB4QkI4NkJBNzgsIDB4QkY5QUM1QUMsIDB4QkU3RkI1NzMsIDB4QkY4MEI1NEEsIDB4QkY4NEI3NDcsIDB4QkY4NUI4NDcsIDB4QkY4NEI3NDcsIDB4QkY4NEI4NDgsIDB4QkY4NEI3NDcsIDB4QjY4OEI4NDYsIDB4QTk5OUMxNDQsIDB4QThCMUQwNEYsIDB4QUZCNkQzNTYsIDB4QUJCM0QyNTIsIDB4QUM5RUM0NDcsIDB4Qjc4OUI5NDUsIDB4QkY4NEI3NDcsIDB4QkY4NEI4NDcsIDB4QkY4NEI4NDcsIDB4QkY4NUI4NDgsIDB4QkY4NEI4NDcsIDB4QkU4NUI4NDcsIDB4QUVBQUNCNEQsIDB4QkZENkU2QTAsIDB4QjRDNERCNkEsIDB4M0VCNkQ1NTgsIDB4MjlDRkU0OEYsIDB4QTlCREQ5NUEsIDB4QkZEN0U3QTIsIDB4QjZBNkM5NEYsIDB4QkY4NEI3NDcsIDB4QkY4NUI4NDgsIDB4QkY4NEI4NDcsIDB4QkY4NUI4NDgsIDB4QkY4NEI3NDcsIDB4QUI5OEMzNDUsIDB4QkVDQ0UwODIsIDB4QkVDRUUxODYsIDB4NTZCM0Q0NEYsIDB4MDhEQkVCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTQsIDB4QkZEN0U2QTMsIDB4QjhCMUQxNTYsIDB4QkY4NEI4NDcsIDB4QkY4NUI4NDgsIDB4QkY4NEI4NDcsIDB4QkY4NEI4NDgsIDB4QkY4NEI3NDcsIDB4QUQ5MUJENDMsIDB4QkJDQkUwODAsIDB4QkZDRUUyODgsIDB4NUFCNEQ0NEUsIDB4MDhFQ0Y0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGNkY5RTgsIDB4NjBCNkQ1NEIsIDB4QkVDREUxODYsIDB4QkZDQ0UwODQsIDB4Qjc4QkJCNDYsIDB4QkY4NEI4NDcsIDB4QkY4NEI3NDcsIDB4QkY4NUI4NDgsIDB4QkY4NUI4NDcsIDB4QkY4NUI4NDcsIDB4QUY5M0JGNDQsIDB4QkRDREUxODUsIDB4QkVDREUxODUsIDB4NTZCNUQ0NEYsIDB4MDZFRUY1REIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDVFRUY1RDgsIDB4NkZCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERDNzUsIDB4QkE4N0I4NDYsIDB4QkY4NUI4NDgsIDB4QkY4NEI4NDcsIDB4QkY4NUI4NDgsIDB4QkY4NEI4NDcsIDB4QjY4N0I5NDcsIDB4OTU5RkM2NDYsIDB4QUZBMkM4NDksIDB4QUZBMUM3NDgsIDB4QjBBMkM4NDksIDB4QUZBMkM3NDksIDB4QjBBMkM4NDksIDB4QUQ5REM1NDcsIDB4Qjc4QkJCNDYsIDB4QkY4NEI4NDcsIDB4QkY4NEI4NDcsIDB4QkY4NEI3NDcsIDB4QkY4NUI4NDgsIDB4QkY4NEI4NDcsIDB4QkY4NEI4NDgsIDB4QjI4RUJDNDUsIDB4QkFDNkRENzQsIDB4QkZENUU1OUMsIDB4ODRCOEQ2NEUsIDB4MTVDOEUwODYsIDB4NjFCNkQ1NEIsIDB4QkVDRUUxODksIDB4QkZDOURGN0UsIDB4Qjk4OEI4NDUsIDB4QkY4NUI4NDgsIDB4QkY4NEI3NDcsIDB4QkY4NUI4NDcsIDB4QkY4NEI4NDcsIDB4QkQ4NUI4NDcsIDB4OTI5NkJGNDQsIDB4QURBMEM2NDcsIDB4QUZBMEM1NDgsIDB4QjBBMUM2NDgsIDB4QUZBMEM2NDgsIDB4QjBBMEM2NDgsIDB4QUZBMEM1NDgsIDB4QjBBMEM2NDgsIDB4QUZBMEM1NDgsIDB4QjBBMEM1NDgsIDB4QUY5RkM1NDcsIDB4QjBBMEM2NDgsIDB4QUZBMEM0NDgsIDB4QUZBMEM1NDgsIDB4QUZCNkQzNTMsIDB4QkZEN0U3QTIsIDB4QTdCREQ4NUIsIDB4MjRCQkQ5NkEsIDB4MDlFMkVFQjYsIDB4N0ZCN0Q1NEMsIDB4QkZENEU1OTksIDB4QkFCQ0Q2NkIsIDB4QkM4NkI3NDYsIDB4QkY4NUI4NDgsIDB4QkY4NEI4NDcsIDB4QkY4NUI4NDcsIDB4QkY4NEI4NDcsIDB4QUI4OUI4NDYsIDB4OUY5REMzNDQsIDB4QjA5RkM0NDcsIDB4QUY5RkM0NDcsIDB4QjBBMEM0NDgsIDB4QUY5RkM0NDcsIDB4QjA5RkM0NDgsIDB4QUQ5RUM0NDcsIDB4QjA5M0JFNDUsIDB4QkQ4NUI3NDYsIDB4QkY4NEI4NDcsIDB4QkY4NEI4NDcsIDB4QkY4NUI4NDgsIDB4QkY4NEI3NDcsIDB4QkY4NUI4NDcsIDB4QjQ4REJCNDQsIDB4QkJDOERFNzgsIDB4QkZENEU1OTgsIDB4N0NCN0Q1NEQsIDB4MTBENkU4QTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA3REJFNEYwLCAweDlCMUQ1RkE3LCAweEJGMUI2N0FELCAweEJGMUE2QkIwLCAweEJGMUI2QUFGLCAweEJGMUI2QkIwLCAweEJGMTk2QkIwLCAweEJGMTg2RkIzLCAweEJGMTQ3MUI0LCAweEJGMTE3NEI2LCAweEJGMEM3NUI3LCAweEJGMEM3OUJBLCAweEJGMEE3QUJBLCAweEJGMEI3Q0JDLCAweEJGMDk3REJELCAweEJGMDg3RkJFLCAweEJGMDY3RUJFLCAweEJGMDY3RkJGLCAweEJGMDQ3RkJFLCAweEJGMDg3RkJFLCAweEJGMEE3REJELCAweEJGMDk3Q0JELCAweEJGMEI3QUJCLCAweEJGMEM3OUJBLCAweEJGMEU3NkI4LCAweEJGMTE3NEI3LCAweEJGMTM3MUI0LCAweEJGMTg2RkIzLCAweEJGMUE2Q0IwLCAweEJGMUI2QkIwLCAweEJGMUI2QUFGLCAweEJGMTg2Q0IwLCAweEJGMDc3RUJGLCAweEJGMTk2OUFGLCAweDZGMzY3MEIxLCAweDAwRkVGRUZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDQ1N0RCMDc0LCAweEJFNjVBMzQzLCAweEJGQTJDNDUyLCAweEJGREZFNjgwLCAweEJGRDZFMDczLCAweEJGQ0FEODVGLCAweEJGQzdENjVELCAweEJGQzBEMzU5LCAweEJGOTZDNzQ4LCAweEJGOENDNDQ1LCAweEJGOEJDNTQ0LCAweEJGOEFDNDQ1LCAweEJGODhDNDQ0LCAweEJGODdDNDQ0LCAweEJGODVDNDQzLCAweEJGODVDMzQzLCAweEJGODNDMzQyLCAweEJGODJDMzQzLCAweEJGODBDMjQyLCAweEJGN0ZDMjQzLCAweEJGN0RDMjQzLCAweEJGN0NDMjQzLCAweEJGN0JDMTQzLCAweEJGN0FDMTQzLCAweEJGNzhDMDQzLCAweEJGNzhDMTQ0LCAweEJGN0JDMDQ1LCAweEJGODVCRTRBLCAweEJGN0ZCQTRCLCAweEJGNUNBOTQ3LCAweEJBNDM5QjQ1LCAweDQ5NzhCNzg0LCAweDAwRjdGQkY4LCAweDAxRkJGREY3LCAweDM2QjlENzVGLCAweEFBQkVEOTVDLCAweEJGRDhFN0E0LCAweEJCODlCQzdELCAweEJFMDI3MkJBLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEI5MEI3N0I0LCAweEE5NzFBRjc1LCAweEI3QzBEOTcwLCAweEJFRDJFMzkzLCAweEJGRDdFNkExLCAweEJGRDdFNkEzLCAweEJGRDZFNkExLCAweEJDQ0JERjgwLCAweEEzOTFDMDY2LCAweEI1MEY3OUIxLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweDlGNkZBRDc0LCAweEJGRDJFNDk0LCAweEJGRDhFN0E3LCAweEI3N0RCNTc5LCAweEJFMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEE1NDc5ODhDLCAweEJDQ0JERjgwLCAweEJGQ0ZFMjhBLCAweDU5QkJENzVCLCAweDAxRjhGQkYwLCAweDAwRkZGRkZGLCAweDBDRTNFRkMzLCAweDcxQjVENDRBLCAweEJFRDFFMzkwLCAweEJCQzdERDdDLCAweEJBMUI4MEE5LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDE3MkJBLCAweEE1OThDNDYzLCAweEJGRDZFNkExLCAweEFCQzBEQTYwLCAweDFFQ0ZFNDkzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRDRFN0ExLCAweDdEQjZENDRBLCAweEJGRDNFNDk4LCAweEJDQkJENjc3LCAweEI4MEU3OUIzLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEI3MEY3QUIxLCAweEFDQjVEMzYxLCAweEJGREJFOUIxLCAweEI4QjVENDc1LCAweEJDMEI3N0IzLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEIyMTQ3Q0FGLCAweEFGQjdENDY0LCAweEJGRDdFN0EyLCAweDhDQjlENjUxLCAweDE4QkZEQjc1LCAweDcwQjVENDQ5LCAweEJFRDBFMzhGLCAweEJEQzdERDdELCAweEI4MTk3RkFCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEI2MEM3OEIzLCAweEE5QjNEMjVELCAweEJGRDRFNTlBLCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDZFNjlFLCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDZFNjlFLCAweEJGRDVFNTlFLCAweEJGRDZFNkEwLCAweEJGREJFOUIwLCAweEJGRDhFOEE2LCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlELCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDRFNTlBLCAweEFEQTRDQTY3LCAweEJEMDM3M0I5LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEFFMUY4MkE3LCAweEIxQkVEODYyLCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGQzhERTc4LCAweEJGQzhERTc4LCAweEJGRDRFNTk3LCAweEJGOThDMTRBLCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODRCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEFFOENCQTQ0LCAweEFDQjREMjU0LCAweEJEQ0VFMTg4LCAweEJGRDdFN0EzLCAweEJGRDdFNkEyLCAweEJGRDhFN0E0LCAweEJFRDJFMzk0LCAweEI1QkFENTVGLCAweEI1OENCOTQ0LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODRCNzQ3LCAweEJGODNCNzQ2LCAweEJGODRCNzQ3LCAweEFEOTJCRTQ0LCAweEJEQ0NFMDgxLCAweEJFQ0ZFMjhELCAweDY3QjVENTRFLCAweDJGQjdENjVDLCAweEE5QkREODVBLCAweEJGRDZFNkExLCAweEI2QTVDODRFLCAweEJFODNCNjQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEFCOThDMzQ1LCAweEJEQ0NFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjNEMzRFLCAweDA3REJFQkIzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzUzLCAweEJGRDdFNkEyLCAweEI4QjFEMTU2LCAweEJGODNCNjQ3LCAweEJGODNCNzQ3LCAweEJGODNCNjQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEFDOTBCRDQzLCAweEJBQ0JERjgwLCAweEJGQ0VFMTg4LCAweDVBQjRENDRELCAweDA3RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA2RjVGOUU4LCAweDc0QjZENTRBLCAweEJFRDFFMzkzLCAweEJEQzZERDc1LCAweEJCODZCODQ1LCAweEJGODRCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEFEOTFCRjQ1LCAweEJBQzlERTc4LCAweEJGRDFFMjkwLCAweDY4QjVENDRELCAweDA5RTBFRUJGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RUVGNUQ4LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQzc1LCAweEJBODZCODQ2LCAweEJGODRCNzQ3LCAweEJGODNCNzQ3LCAweEJGODRCODQ3LCAweEJGODNCNjQ3LCAweEI3ODhCOTQ2LCAweEFGQkZEOTVGLCAweEJGRDVFNjlELCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlELCAweEJGRDZFNjlFLCAweEJGRDJFMzk0LCAweEI2QkVEODY0LCAweEIwOTRDMDQ2LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJDODRCNzQ2LCAweEFFQjJEMDUzLCAweEJGRDdFNkE0LCAweEE2QkVEOTVELCAweDI5QjJEMzU1LCAweDYxQjVENDRBLCAweEJFQ0VFMTg5LCAweEJGQzlERjdFLCAweEI5ODdCODQ1LCAweEJGODRCNzQ3LCAweEJGODNCNjQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJDODRCNzQ3LCAweEEyQUJDQzRBLCAweEJGRDJFNDk0LCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlELCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDVFNTlFLCAweEJGRDlFOEE5LCAweEE1QkRENzVBLCAweDIzQkJEOTZBLCAweDA5RTJFRUI2LCAweDdGQjdENTRDLCAweEJGRDRFNDk5LCAweEJBQkNENjZCLCAweEJDODVCNzQ2LCAweEJGODNCNzQ3LCAweEJGODNCNjQ2LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEFGOEZCQjQzLCAweEI5QzZEQzcwLCAweEJGRDZFNjlGLCAweEJGRDVFNTlFLCAweEJGRDZFNjlFLCAweEJGRDVFNTlFLCAweEJGRDVFNjlFLCAweEJGRDRFNTlCLCAweEJDQ0JERjdFLCAweEIyQTRDNzRBLCAweEJEODRCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJGODNCNzQ3LCAweEJCODNCNjQ2LCAweEIxQjVEMjU3LCAweEJGRDdFN0E0LCAweDlGQkREODU4LCAweDIwQzdERjg0LCAweDAwRkVGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOERCRTVGMCwgMHhBMDFENjBBOCwgMHhCRjFBNjhBRSwgMHhCRjFBNkJCMCwgMHhCRjFBNkJBRiwgMHhCRjE5NkNCMSwgMHhCRjE3NkZCMywgMHhCRjE0NzNCNSwgMHhCRjEwNzVCNywgMHhCRjBGNzhCOSwgMHhCRjBDN0FCQiwgMHhCRjA5N0RCRCwgMHhCRjA1N0ZCRSwgMHhCRjA0ODFDMCwgMHhCRjAyODJDMSwgMHhCRjA3ODRDMiwgMHhCRjA0ODRDMywgMHhCRjA0ODRDMywgMHhCRjAzODRDMiwgMHhCRjA3ODRDMiwgMHhCRjAzODJDMSwgMHhCRjA0ODFDMCwgMHhCRjA0N0ZCRiwgMHhCRjA5N0RCRSwgMHhCRjBCN0JCQiwgMHhCRjBFNzlCQSwgMHhCRjBENzVCNywgMHhCRjEzNzNCNiwgMHhCRjE3NkZCMywgMHhCRjFCNkNCMSwgMHhCRjFBNkFBRiwgMHhCRjE2NkZCMywgMHhCRjA3ODBDMSwgMHhCRjE5NkFBRiwgMHg3ODM2NzBCMSwgMHgwMUZFRkVGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg0MjgwQjI3NSwgMHhCRTY4QTQ0NCwgMHhCRjk3QzA0RCwgMHhCRkRERTQ3QywgMHhCRkQyREM2NywgMHhCRkNEREE2MSwgMHhCRkNBRDg1RiwgMHhCRkEwQ0E0QywgMHhCRjhFQzU0NSwgMHhCRjhFQzU0NSwgMHhCRjhDQzQ0NSwgMHhCRjhCQzU0NSwgMHhCRjhBQzQ0NCwgMHhCRjg5QzQ0NCwgMHhCRjg3QzQ0MywgMHhCRjg2QzQ0NCwgMHhCRjg0QzM0MywgMHhCRjgzQzQ0MywgMHhCRjgxQzM0MywgMHhCRjgwQzM0MywgMHhCRjdFQzI0MywgMHhCRjdEQzI0NCwgMHhCRjdDQzI0MywgMHhCRjdBQzI0NCwgMHhCRjc5QzE0MywgMHhCRjdFQzE0NiwgMHhCRjg4QzA0QiwgMHhCRjg1QkQ0QiwgMHhCRjY2QUY0OCwgMHhCRjQ5OUY0NiwgMHg3MDRFQTA1QywgMHgwM0VERjZFRiwgMHgwMEZGRkZGRiwgMHgwN0U3RjJDQiwgMHg1RUI1RDQ0RCwgMHhCQ0NCRTA3RSwgMHhCRkQxRTM5MSwgMHhCQTNCOTI5OCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRTAyNzNCQSwgMHhBODc4QjM3MiwgMHhCRENFRTE4OCwgMHhCRkQ4RTdBMywgMHhCQkNBREY3RSwgMHhBQkMwREE2MCwgMHg5RkJDRDg1NywgMHhCMkMzREM2OSwgMHhCRkQ1RTU5QywgMHhCRUNGRTI4QSwgMHhBNzY0QTg3RCwgMHhCRjAxNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMDVGQTU3RSwgMHhCRkQwRTM4RSwgMHhCRkQ2RTZBMSwgMHhCNTU5QTI4OCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNDY3QTk3OSwgMHhCRUQxRTM5MSwgMHhCQkM5REY3OSwgMHg0MEMxREI2RCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkNFRTQ5NCwgMHg4NUI3RDU0QiwgMHhCRkQ1RTY5QywgMHhCOUIwRDE3OCwgMHhCQjBENzlCMywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCNjBCNzdCNSwgMHhBQkFDQ0Y2MiwgMHhCRkQ3RTdBMywgMHg5QUJDRDg1NiwgMHgxMkRCRUJBRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxREQyRTY5QSwgMHg5MkI5RDY0RiwgMHhCRkQ3RTdBMSwgMHhCN0E2Q0I3MiwgMHhCRjAzNzNCQSwgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhBRTIxODNBNiwgMHhCNEMyREI2QSwgMHhCRkRCRTlCMiwgMHhCODk4QzQ3NywgMHhCRDA0NzNCOSwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhBQjJGOEI5RCwgMHhCOEMyREI2RiwgMHhCRkQ1RTU5QSwgMHg3NUI2RDU0RSwgMHgxQUMxREM3OCwgMHg4NUI3RDU0QiwgMHhCRkQ1RTY5QywgMHhCOEI2RDQ3NCwgMHhCRDBDNzhCNCwgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBQzI1ODZBMywgMHhCNkJGRDk2QiwgMHhCRkQ2RTY5RiwgMHhCNEMyREI2NiwgMHhBREMxREE2MywgMHhBRUMxREE2NCwgMHhBREMxREE2MywgMHhBRUMxREE2NCwgMHhBREMxREE2MywgMHhBRUMyREI2NCwgMHhBREMxREE2MywgMHhBRUMyREE2NCwgMHhBREMxREE2MywgMHhBRUMyREE2NCwgMHhBREMxREE2MywgMHhBRUMxREE2NCwgMHhBREMxREE2MywgMHhBRUMyREI2NCwgMHhBREMxREE2MywgMHhBRUMyREE2NCwgMHhBREMxREE2MywgMHhBRUMxREE2NCwgMHhBRUMxREE2MywgMHhCQ0M2REQ2RiwgMHhCRkQ4RTdBNCwgMHhCNzg1QkE3QSwgMHhCRTAxNzJCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNzNGOTQ5MywgMHhCQ0M4REU3OCwgMHhCRkQzRTQ5NiwgMHhCMkMxREE2NCwgMHhCOUJDRDc1NSwgMHhCRkQwRTM4RiwgMHhCRkM5REU3RCwgMHhCRThBQkE0NSwgMHhCRjgzQjc0NywgMHhCRjgyQjY0NywgMHhCRjgzQjc0OCwgMHhCRjgyQjY0NywgMHhCQTg1Qjc0NiwgMHhBQkIxRDA1MSwgMHhCRkQ2RTY5RSwgMHhCRUQxRTM5MSwgMHhBQkMwREE2MiwgMHg5NEJBRDY1NCwgMHhBNUJFRDk1QSwgMHhCQ0NDRTA4MywgMHhCRkQ4RTdBNCwgMHhCNUI2RDI1QiwgMHhCQzgzQjY0NiwgMHhCRjgyQjY0NywgMHhCRjgzQjc0NywgMHhCRjgyQjY0NywgMHhCRjgzQjc0OCwgMHhCODg1QjY0NSwgMHhCM0MxREE2NSwgMHhCRkQ2RTY5RiwgMHg4NkI4RDY0RiwgMHgzQUI0RDQ1MywgMHhBOUJERDg1QSwgMHhCRkQ3RTZBMiwgMHhCNkE2Qzk0RiwgMHhCRjgyQjY0NywgMHhCRjgzQjc0NywgMHhCRjgyQjc0NywgMHhCRjgzQjc0NywgMHhCRjgyQjc0NywgMHhBQjk3QzM0NiwgMHhCRUNDRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkI0RDQ0RiwgMHgwOERCRUJCNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCOEIxRDE1NiwgMHhCRjgyQjY0NywgMHhCRjgyQjc0NywgMHhCRjgyQjY0NywgMHhCRjgzQjc0OCwgMHhCRjgyQjY0NywgMHhBRDhGQkQ0NCwgMHhCQkNCRTA4MSwgMHhCRkNGRTI4OCwgMHg1QkI0RDQ0RSwgMHgwOEVCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQUVCRjNDQywgMHg4N0I4RDY0QywgMHhCRkQ1RTU5QywgMHhCN0MwRDk2OCwgMHhCRDg0Qjg0NiwgMHhCRjgzQjc0NywgMHhCRjgyQjY0NywgMHhCRjgzQjc0NywgMHhCRjgyQjY0NywgMHhCRjgzQjc0OCwgMHhCMDhBQkE0NiwgMHhCOUMyREI2QSwgMHhCRkQ0RTU5QSwgMHg3QUI3RDU0RSwgMHgwRUQzRTZBMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUVGRjZEOCwgMHg2RUI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM1REM3NiwgMHhCQTg1Qjg0NiwgMHhCRjgzQjc0OCwgMHhCRjgyQjc0NywgMHhCRjgzQjc0OCwgMHhCRjgyQjY0NywgMHhCOTg4Qjk0NiwgMHhCNUMzREI2OSwgMHhCRkQ2RTY5RSwgMHhCNEMyREE2NSwgMHhBRUMxREE2NCwgMHhBREMxREE2MywgMHhBRkMyREI2NSwgMHhCQkNCRTA4MCwgMHhCRkQ4RThBNiwgMHhCQUMzREI2RiwgMHhCNzhFQkQ0NiwgMHhCRjgyQjc0NywgMHhCRjgzQjc0OCwgMHhCRjgyQjY0NywgMHhCRjgzQjc0OCwgMHhCRjgyQjY0NywgMHhBOUE0Qzk0OCwgMHhCRkQ0RTU5OSwgMHhCNkM2REQ2RiwgMHgzRUIzRDQ1MiwgMHg2MkI2RDU0QiwgMHhCRUNFRTE4OSwgMHhCRkNBREY3RSwgMHhCQTg2Qjg0NSwgMHhCRjgzQjc0OCwgMHhCRjgyQjc0NywgMHhCRjgzQjc0NywgMHhCRjgzQjY0NywgMHhCRDgzQjc0NywgMHhBOEFDQ0Q0RCwgMHhCRkQ4RTdBMywgMHhCQUM2REQ3MSwgMHhBRUMxREE2NCwgMHhBREMxREE2MywgMHhBRUMyREE2NCwgMHhBRUMxREE2MywgMHhBRUMxREE2MywgMHhBREMxREE2MywgMHhBRUMyREI2NCwgMHhBREMxREE2MywgMHhBRUMxREE2NCwgMHhBREMxREE2MywgMHhBRUMyREE2NCwgMHhBRUMxREE2MywgMHhBREMxREE2MiwgMHg3NEI2RDU0RSwgMHgxOEM3RTA4NiwgMHgwQUUzRUVCNiwgMHg3RkI3RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUJERDY2QiwgMHhCQzg0Qjc0NiwgMHhCRjgzQjc0NywgMHhCRjgyQjc0NywgMHhCRjgzQjc0OCwgMHhCRjgzQjc0NywgMHhCMzhFQkI0MywgMHhCQkNBREY3RSwgMHhCRkQyRTQ5MSwgMHhCMUMxREE2NCwgMHhBRUMxREE2NCwgMHhBREMxREE2MywgMHhBRUMxREE2NCwgMHhCNUM1REM2RCwgMHhCRkQ1RTY5RCwgMHhCRENERTE4NiwgMHhCNTk0QkY0NiwgMHhCRjgzQjc0NywgMHhCRjgzQjc0NywgMHhCRjgyQjc0NywgMHhCRjgzQjc0OCwgMHhCRjgzQjc0NywgMHhBQ0E0Qzg0QSwgMHhCRkQ1RTY5RiwgMHhCMkMzREI2NywgMHgzMUI0RDU1QSwgMHgwMUZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDdEQkU0RjAsIDB4OUQxRDVGQTgsIDB4QkYxOTY3QUQsIDB4QkYxQjZCQjAsIDB4QkYxOTZCQjAsIDB4QkYxODZGQjMsIDB4QkYxNDcyQjUsIDB4QkYxMjc1QjcsIDB4QkYwQzc4QjksIDB4QkYwQjdDQkMsIDB4QkYwODdFQkUsIDB4QkYwOTgxQzAsIDB4QkYwNDgzQzIsIDB4QkYwNTg1QzQsIDB4QkYwNzg2QzQsIDB4QkYwNjg4QzUsIDB4QkYwNjg4QzYsIDB4QkYwODg5QzYsIDB4QkYwQTg5QzYsIDB4QkYwODg4QzYsIDB4QkYwNzg3QzQsIDB4QkYwODg2QzQsIDB4QkYwNTgzQzIsIDB4QkYwODgxQzAsIDB4QkYwODdFQkUsIDB4QkYwQjdDQkQsIDB4QkYwQzc4QjksIDB4QkYxMjc2QjgsIDB4QkYxMzcyQjUsIDB4QkYxODZGQjMsIDB4QkYxQTZCQjAsIDB4QkYxMDc2QjgsIDB4QkYwNTgwQzEsIDB4QkYxOTY5QUYsIDB4NzIzNjcwQjEsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NDU4MEIxNzUsIDB4QkU2QUE1NDMsIDB4QkY5MkJENEEsIDB4QkZEQUUyNzQsIDB4QkZEMkRDNjQsIDB4QkZDRkRBNjIsIDB4QkZCN0QyNTYsIDB4QkY5MEM2NDYsIDB4QkY5MEM1NDUsIDB4QkY4RkM1NDUsIDB4QkY4REM0NDQsIDB4QkY4REM0NDUsIDB4QkY4QkM0NDQsIDB4QkY4QUM1NDQsIDB4QkY4OEM0NDQsIDB4QkY4N0M0NDMsIDB4QkY4NkM0NDMsIDB4QkY4NEMzNDMsIDB4QkY4MkMyNDIsIDB4QkY4MEMzNDMsIDB4QkY3RkMyNDIsIDB4QkY3RUMyNDMsIDB4QkY3Q0MxNDIsIDB4QkY3Q0MyNDMsIDB4QkY4MEMxNDUsIDB4QkY4Q0MyNEEsIDB4QkY4OEJFNEEsIDB4QkY3MUIzNDgsIDB4QkY1MEExNDUsIDB4OTQzRjk4NDksIDB4MENEN0U5REIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJEN0U4QTcsIDB4N0VCNkQ1NEIsIDB4QkZENEU1OTgsIDB4QkFCQkQ3N0EsIDB4QkMxMjdCQUYsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QUQyNjg2QTIsIDB4QjZCRUQ5NkIsIDB4QkZEN0U2QTIsIDB4QTVCRUQ4NUIsIDB4NUJCNUQ0NEUsIDB4MzNCQkQ4NjIsIDB4MkJDMURDNzIsIDB4NTFCNkQ1NTAsIDB4QUFCRUQ4NUQsIDB4QkZEOEU3QTUsIDB4QUY5NUMyNkYsIDB4QkUwMjcyQkEsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QTE2OEFBNzgsIDB4QkZEM0U0OTUsIDB4QkVEMEUzOTIsIDB4QjgzRjk0OTMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkQwMTcyQkIsIDB4QTU4NEI5NkIsIDB4QkZENUU1OUMsIDB4QjJDM0RCNjksIDB4MkFDMkRDNzQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjJDOUUwODYsIDB4OThCOUQ2NTEsIDB4QkZEN0U3QTMsIDB4Qjk5QUM1NzIsIDB4QkUwMjcyQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QUYxRjgyQTYsIDB4QjRCQ0Q3NjgsIDB4QkZENUU1OUYsIDB4ODRCOEQ2NTAsIDB4MDhFOUYzRDAsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkQsIDB4MkJCQkQ4NjUsIDB4QTJCQ0Q3NTYsIDB4QkZEN0U3QTQsIDB4QjU4MkI4N0EsIDB4QkYwMTcyQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTY0MDk0OTEsIDB4QkNDOURFN0EsIDB4QkZEQUU4QUQsIDB4Qjc3REI1N0EsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTU0Njk4OEQsIDB4QkJDQkUwODAsIDB4QkZDRkUyOEEsIDB4NUFCOUQ2NTcsIDB4MjNCOUQ3NjQsIDB4OTdCOUQ2NTAsIDB4QkZEN0U3QTIsIDB4Qjc5NkMzNzcsIDB4QkQwNDc0QkEsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTczRjkzOTEsIDB4QkJDOURGNzksIDB4QkVEMUUzOEYsIDB4NkZCN0Q1NEUsIDB4M0JCOUQ3NUYsIDB4M0JCQUQ3NUYsIDB4M0FCOUQ3NUYsIDB4M0JCQUQ4NjAsIDB4M0JCOUQ3NUYsIDB4M0JCQUQ3NjAsIDB4M0FCOUQ3NUYsIDB4M0JCQUQ4NjAsIDB4M0JCOUQ3NUYsIDB4M0JCQUQ3NjAsIDB4M0FCOUQ3NUYsIDB4M0JCQUQ4NjAsIDB4M0JCOUQ3NUYsIDB4M0JCQUQ4NUYsIDB4M0FCQUQ3NUYsIDB4M0JCQUQ4NjAsIDB4M0JCQUQ3NUYsIDB4M0JCOEQ3NUMsIDB4NEZCNEQ0NEUsIDB4QjBDMURBNjMsIDB4QkZENkU2QTAsIDB4Qjc2QUFCODAsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTQ1OEEyODIsIDB4QkVDRUUxOEEsIDB4QkRDQ0UwODEsIDB4NjRCNUQ0NEMsIDB4OTRCN0Q1NEMsIDB4QkZENEU1OUEsIDB4QkVCRUQ3NkEsIDB4QkQ4MUI0NDUsIDB4QkY4MUI2NDcsIDB4QkY4MUI1NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QUE5MkJFNDUsIDB4QkJDOURFNzksIDB4QkZENEU1OTgsIDB4ODdCN0Q1NEYsIDB4MzFCNEQ1NTksIDB4MUFDNkRGODMsIDB4MjhCQkQ4NjcsIDB4N0JCNkQ0NEIsIDB4QkVDRkUyOEIsIDB4QkRDREUxODgsIDB4Qjc4RkJENDUsIDB4QkY4MUI1NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MkI2NDcsIDB4QkE4M0I2NDYsIDB4QUVCNkQzNTgsIDB4QkZEN0U2QTMsIDB4OTRCQUQ3NTQsIDB4M0ZCM0Q0NTIsIDB4QTlCREQ4NUEsIDB4QkZEN0U2QTIsIDB4QjZBNUM4NEUsIDB4QkU4MUI1NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QUI5N0MyNDUsIDB4QkRDQ0UwODEsIDB4QkVDREUxODYsIDB4NTZCM0QzNEUsIDB4MDhEQkVCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThFM0VFQkMsIDB4OUFCQkQ3NTMsIDB4QkZEN0U2QTIsIDB4QjhCMEQxNTYsIDB4QkY4MUI1NDYsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QUQ4RkJDNDMsIDB4QkJDQkRGODAsIDB4QkZDRUUxODgsIDB4NUFCNEQzNEQsIDB4MDhFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTREQ0VCQUIsIDB4OTVCOUQ2NEYsIDB4QkZENkU2QTEsIDB4QjlCMkQxNUUsIDB4QkQ4MkI2NDYsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MkI2NDcsIDB4Qjk4NEI2NDYsIDB4QjNCQ0Q3NjAsIDB4QkZENkU2QTAsIDB4ODlCOUQ2NTEsIDB4MTREM0U2QTAsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDRFRUY1RDgsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERCNzUsIDB4QkE4NEI3NDYsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MUI1NDcsIDB4Qjk4N0I5NDYsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4N0FCNkQ0NEQsIDB4MkZCNkQ2NUQsIDB4MkFCN0Q3NjIsIDB4MkVCN0Q3NjAsIDB4NjhCNUQ0NEIsIDB4QjhDN0RENzIsIDB4QkZENkU2QTEsIDB4QjVBOENCNEYsIDB4QkU4MUI2NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QTk5OEMyNDUsIDB4QkVEMEUyOEUsIDB4QkJDOURGN0EsIDB4NEFCM0Q0NTAsIDB4NjRCNUQ0NEIsIDB4QkVDRUUxODksIDB4QkZDOURGN0UsIDB4Qjk4NUI3NDUsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI1NDcsIDB4QkQ4M0I3NDcsIDB4QThBQ0NENEQsIDB4QkZEN0U3QTIsIDB4QTNCREQ4NUIsIDB4MzdCNEQ0NTYsIDB4MkFCOEQ2NjIsIDB4MkJCOEQ3NjIsIDB4MkFCN0Q2NjIsIDB4MkJCOEQ3NjIsIDB4MkFCN0Q2NjIsIDB4MkJCOEQ3NjIsIDB4MkFCN0Q2NjIsIDB4MkJCOEQ3NjIsIDB4MkFCN0Q3NjIsIDB4MkJCOEQ3NjIsIDB4MkFCN0Q2NjIsIDB4MkFCOEQ3NjMsIDB4MUFCQkQ5NkQsIDB4MDRFRkY2REUsIDB4MDlFMkVFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZENEU0OTksIDB4QkFCQ0Q2NkIsIDB4QkM4M0I2NDUsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MkI2NDcsIDB4QkY4MUI2NDcsIDB4QjM4RUJCNDMsIDB4QkJDQURGN0UsIDB4QkZDRkUyODksIDB4NUVCNEQ0NEQsIDB4MkRCN0Q2NUYsIDB4MkFCN0Q2NjIsIDB4MkJCOEQ3NjIsIDB4NDlCNkQ1NTMsIDB4QUZDMERBNjAsIDB4QkZEOEU3QTQsIDB4QjVBNkM4NTEsIDB4QkU4MUI2NDcsIDB4QkY4MkI3NDgsIDB4QkY4MUI2NDcsIDB4QkY4MUI2NDcsIDB4QkY4MUI2NDcsIDB4QUE5QUMxNDUsIDB4QkZEM0U0OTYsIDB4QjlDNkRENzEsIDB4M0FCNUQ1NTcsIDB4MDJGQUZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRERFNkYxLCAweDkxMjA2MEE4LCAweEJGMUE2N0FELCAweEJGMUI2QkIwLCAweEJGMTg2RUIxLCAweEJGMTU3MkI1LCAweEJGMEY3NUI3LCAweEJGMEY3OUJBLCAweEJGMEE3Q0JDLCAweEJGMDc4MEJGLCAweEJGMDQ4MkMxLCAweEJGMDk4NkMzLCAweEJGMDc4OEM1LCAweEJGMDY4QUM3LCAweEJGMDY4Q0M4LCAweEJGMDc4RUM5LCAweEJGMDc4RUM5LCAweEJGMDg4RkNBLCAweEJGMDc4RUM5LCAweEJGMDc4RUM5LCAweEJGMDY4Q0M4LCAweEJGMEE4QkM3LCAweEJGMDk4OEM1LCAweEJGMDk4NkM0LCAweEJGMDQ4M0MxLCAweEJGMDg4MEMwLCAweEJGMEE3Q0JDLCAweEJGMEY3OUJBLCAweEJGMTA3NUI3LCAweEJGMTQ3M0I2LCAweEJGMTg2RkIzLCAweEJGMEU4M0MyLCAweEJGMDY3RkMwLCAweEJGMTk2OEFFLCAweDYxMzY3MEIxLCAweDAwRkVGRUZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDUxODBCMjc1LCAweEJGNkRBNjQ0LCAweEJGOTJCRDQ5LCAweEJGRDdERjZDLCAweEJGRDJEQjYzLCAweEJGQ0VEQTYxLCAweEJGOUJDOTQ5LCAweEJGOTJDNjQ2LCAweEJGOTFDNTQ1LCAweEJGOTBDNTQ2LCAweEJGOEVDNDQ1LCAweEJGOERDNTQ1LCAweEJGOENDNDQ0LCAweEJGOEJDNTQ1LCAweEJGODlDNDQ0LCAweEJGODhDNTQ0LCAweEJGODZDNDQzLCAweEJGODVDNDQzLCAweEJGODNDMzQzLCAweEJGODJDMzQzLCAweEJGODBDMzQyLCAweEJGN0ZDMzQzLCAweEJGN0RDMjQzLCAweEJGODNDMzQ1LCAweEJGOEZDMzRBLCAweEJGOENDMTRBLCAweEJGN0NCODQ4LCAweEJGNTdBNTQ2LCAweEFDNDA5ODQ1LCAweDIyOUFDOUEzLCAweDAwRkVGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFGQzdFMDgzLCAweDkzQjhENjRGLCAweEJGRDdFN0EyLCAweEI5OUZDODc1LCAweEJDMDU3NEI5LCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE2NDg5ODhCLCAweEJDQ0NFMDgyLCAweEJFQ0ZFMjhBLCAweDVFQjhENjU0LCAweDA4RTJFRkMyLCAweDAxRkRGRUZCLCAweDAwRkNGRUZBLCAweDI5QjlEODYzLCAweDlFQkJENzU0LCAweEJGRDhFN0E0LCAweEI0OERCRTc2LCAweEJGMDI3MkJCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEE0ODdCQTY5LCAweEJGRDZFNkExLCAweEJFQzdERDgzLCAweEI2MjI4NEE2LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJCMDY3NUI3LCAweEE2OUVDNzY0LCAweEJGRDdFN0EzLCAweEE0QkVEOTVDLCAweDE5REFFQUFDLCAweDAwRkZGRkZGLCAweDAwRkFGQ0Y1LCAweDMxQkJEODY1LCAweEE4QkVEODVCLCAweEJGRDhFN0EzLCAweEI1NzhCMzdDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE5MzU4RTk4LCAweEI5QzhERTc2LCAweEJGRDJFNDk0LCAweDZCQjhENjUyLCAweDAyRjFGN0UwLCAweDAwRkZGRkZGLCAweDAwRkRGRUZCLCAweDNCQkJEODYyLCAweEIxQzFEQTYzLCAweEJGRDdFNkEwLCAweEI3NjdBOTgxLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEEzNUJBMjgwLCAweEJGRDBFMjhDLCAweEJGRDdFNkEyLCAweEI1NUFBMjg4LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEE1NjZBOTdBLCAweEJFRDFFMzkwLCAweEJCQzlERjdBLCAweDQwQkVEQTY4LCAweDMwQzJERDc1LCAweEE4QkVEODVBLCAweEJGRDhFN0EzLCAweEI2N0RCNTc5LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEEzNTlBMjgxLCAweEJFQ0ZFMjhDLCAweEJEQ0JERjdFLCAweDQ5QzFEQjZBLCAweDAwRkRGRUZDLCAweDAxRkVGRUZDLCAweDAwRkRGRUZCLCAweDAxRkVGRkZDLCAweDAwRkRGRUZDLCAweDAxRkVGRUZDLCAweDAwRkRGRUZCLCAweDAxRkVGRkZDLCAweDAwRkRGRUZDLCAweDAxRkVGRUZDLCAweDAwRkRGRUZCLCAweDAxRkVGRkZDLCAweDAwRkRGRUZDLCAweDAxRkVGRUZDLCAweDAwRkRGRUZCLCAweDAxRkVGRkZDLCAweDAwRkRGRUZDLCAweDA0RUFGNEQzLCAweDRFQjRENDRFLCAweEI4QzdERDczLCAweEJGRDNFNDk2LCAweEI1NDc5ODkwLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEEzNzlCMzcxLCAweEJGRDRFNTk5LCAweEI3QzZERDZGLCAweDNGQjVENDUwLCAweDg4QjhENTRDLCAweEJGRDVFNTlFLCAweEJBQkJENjY0LCAweEJEN0ZCMzQ1LCAweEJGODFCNjQ4LCAweEJGODFCNTQ3LCAweEJGODFCNjQ3LCAweEJGODBCNTQ3LCAweEE4OTlDMjQ0LCAweEJGRDBFMjhELCAweEJDQ0FERjdDLCAweDRCQjRENDUyLCAweDA2RTNFRkMzLCAweDAwRkVGRkZELCAweDAxRkFGQ0Y1LCAweDQ0QkVEOTYzLCAweEI3QzdERDcyLCAweEJGRDNFNDk2LCAweEJEOTJCRDQ1LCAweEJGODBCNTQ3LCAweEJGODFCNjQ3LCAweEJGODFCNjQ3LCAweEJGODFCNjQ3LCAweEJCODFCNTQ2LCAweEIxQjBDRTU1LCAweEJGRDdFN0EzLCAweDk2QkJENzU0LCAweDQwQjRENDUyLCAweEE5QkVEODVBLCAweEJGRDdFNkEyLCAweEI2QTVDODRGLCAweEJGODBCNTQ3LCAweEJGODFCNjQ3LCAweEJGODFCNTQ3LCAweEJGODFCNjQ3LCAweEJGODBCNTQ3LCAweEFCOTZDMjQ1LCAweEJFQ0NFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjRENDRGLCAweDA4RENFQ0I0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzU0LCAweEJGRDdFNkEzLCAweEI4QjBEMTU2LCAweEJGODBCNTQ3LCAweEJGODFCNjQ3LCAweEJGODBCNTQ3LCAweEJGODFCNjQ4LCAweEJGODBCNTQ3LCAweEFEOEZCRDQzLCAweEJCQ0JFMDgwLCAweEJGQ0VFMjg4LCAweDVBQjRENDRELCAweDA4RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIwRENFQkFBLCAweEEyQkNEODU2LCAweEJGRDdFN0EzLCAweEJBQUJDRDU0LCAweEJGODBCNTQ3LCAweEJGODFCNjQ4LCAweEJGODBCNTQ3LCAweEJGODFCNjQ3LCAweEJGODBCNjQ3LCAweEJGODFCNjQ3LCAweEJEODFCNjQ2LCAweEFCQjlENTU3LCAweEJGRDdFN0EzLCAweDk5QkJENzU1LCAweDFCQ0FFMThDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RUVGNUQ4LCAweDZGQjZENTRCLCAweEJGRDFFMzkxLCAweEJFQzREQzc1LCAweEJBODNCNzQ2LCAweEJGODFCNjQ4LCAweEJGODBCNTQ3LCAweEJGODFCNjQ3LCAweEJGODBCNTQ3LCAweEI5ODZCOTQ2LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREVFREI5LCAweDAwRkRGRUZDLCAweDAxRkJGREY2LCAweDIwRDNFNTk5LCAweDlFQkJENzU0LCAweEJGRDdFNkEzLCAweEI3QUZDRjU2LCAweEJFODFCNTQ3LCAweEJGODFCNjQ4LCAweEJGODFCNjQ3LCAweEJGODFCNjQ3LCAweEJGODFCNTQ3LCAweEE4OTdDMjQ0LCAweEJEQ0VFMjhBLCAweEJCQ0FERjdFLCAweDRCQjNENDUxLCAweDY1QjVENTRCLCAweEJFQ0VFMTg5LCAweEJGQ0FERjdGLCAweEI5ODVCNzQ2LCAweEJGODFCNjQ4LCAweEJGODBCNTQ3LCAweEJGODFCNjQ3LCAweEJGODBCNTQ3LCAweEJEODFCNjQ4LCAweEE5QUNDRDRELCAweEJGRDdFN0EzLCAweEEyQkVEODVDLCAweDIxQkREQTcwLCAweDAwRkRGRUZCLCAweDAxRkVGRUZDLCAweDAwRkRGRUZCLCAweDAxRkVGRkZDLCAweDAwRkRGRUZDLCAweDAxRkVGRUZDLCAweDAwRkRGRUZCLCAweDAxRkVGRkZDLCAweDAwRkRGRUZDLCAweDAxRkVGRUZDLCAweDAwRkRGRUZCLCAweDAxRkVGRkZDLCAweDAwRkVGRUZDLCAweDAwRkZGRkZGLCAweDA5RTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNTk5LCAweEJBQkNENjZCLCAweEJDODJCNjQ2LCAweEJGODFCNjQ3LCAweEJGODBCNTQ3LCAweEJGODFCNjQ4LCAweEJGODFCNTQ3LCAweEIzOERCQjQzLCAweEJCQ0FERjdFLCAweEJGQ0ZFMjg5LCAweDU3QjRENDRGLCAweDA3RUNGNUQ2LCAweDAwRkRGRUZDLCAweDAxRkVGRUZDLCAweDE5RDNFNTkzLCAweDlFQkJENzU0LCAweEJGRDdFN0EzLCAweEI0QUJDQjU1LCAweEJFODBCNTQ3LCAweEJGODBCNjQ4LCAweEJGODBCNTQ3LCAweEJGODFCNjQ3LCAweEJGODBCNTQ3LCAweEE5OTlDMTQ0LCAweEJGRDFFMzkxLCAweEJBQzdERTc0LCAweDNCQjVENTU4LCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkVGRSwgMHg3OTQ3N0JCNiwgMHhCRjFBNjZBQywgMHhCRjFBNkNCMSwgMHhCRjE3NzBCMywgMHhCRjEwNzRCNywgMHhCRjBDNzdCOSwgMHhCRjBDN0NCRCwgMHhCRjA3N0ZCRiwgMHhCRjA1ODNDMiwgMHhCRjA2ODZDMywgMHhCRjA2OEFDNiwgMHhCRjA3OENDOCwgMHhCRjA1OEVDQSwgMHhCRjA0OTBDQiwgMHhCRjA2OTJDRCwgMHhCRjA0OTNDRCwgMHhCRjA0OTNDRSwgMHhCRjAzOTNDRCwgMHhCRjA1OTJDRCwgMHhCRjAzOTFDQiwgMHhCRjA4OEZDQSwgMHhCRjA1OENDOCwgMHhCRjA3OEFDNywgMHhCRjA1ODZDNCwgMHhCRjA0ODNDMiwgMHhCRjA2N0ZCRiwgMHhCRjBDN0RCRCwgMHhCRjBFNzhCOSwgMHhCRjEyNzVCNywgMHhCRjEzN0NCQywgMHhCRjA4OERDOSwgMHhCRjA4N0RCRiwgMHhCRjFCNjVBQiwgMHg0NjRGODBCOSwgMHgwMEZFRkVGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg2NDgzQjM3NSwgMHhCRjcwQTg0NCwgMHhCRjk0QkU0QSwgMHhCRkQyREM2NSwgMHhCRkQwREE2MiwgMHhCRkJCRDM1NywgMHhCRjkzQzY0NSwgMHhCRjkzQzY0NiwgMHhCRjkxQzU0NSwgMHhCRjkxQzY0NiwgMHhCRjhGQzU0NSwgMHhCRjhFQzU0NSwgMHhCRjhDQzM0NCwgMHhCRjhDQzU0NSwgMHhCRjhBQzU0NCwgMHhCRjg5QzQ0NCwgMHhCRjg3QzM0MywgMHhCRjg2QzQ0NCwgMHhCRjg0QzM0MywgMHhCRjgyQzM0MywgMHhCRjgxQzI0MiwgMHhCRjgwQzM0MywgMHhCRjgyQzI0NCwgMHhCRjkyQzQ0QiwgMHhCRjkwQzI0QSwgMHhCRjg1QkM0OCwgMHhCRjVGQTk0NSwgMHhCOTQ4OUM0NSwgMHg0Mjc2QjU4MCwgMHgwMUY3RkJGOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZDRkRGOSwgMHgyQ0MxREM3NCwgMHhBNEJDRDg1NywgMHhCRkQ3RTdBMywgMHhCNjg0Qjk3NywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNDY5QUI3NywgMHhCRkQxRTM5MSwgMHhCOUM4REU3OCwgMHgzRkJCRDk2MiwgMHgwMEZFRkVGRCwgMHgwMEZGRkZGRiwgMHgwMEZERkVGQywgMHgzN0JBRDg2MSwgMHhBREJGRDk1RiwgMHhCRkQ3RTZBMSwgMHhCNzZFQUQ3RSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCQTA2NzVCOCwgMHhBNzlFQzc2MiwgMHhCRkRBRTlBQywgMHhCQUJDRDc3MywgMHhCQjBCNzhCNCwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCNjBGNzlCMSwgMHhBQ0I5RDY2MCwgMHhCRkQ3RTZBMiwgMHg5MkJBRDY1MiwgMHgwQ0RCRUFCMCwgMHgwMEZGRkZGRiwgMHgwMUY4RkJGMSwgMHg0MkI1RDU1NCwgMHhCM0MzREI2OCwgMHhCRkQ1RTY5RCwgMHhCNzU5QTI4NiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNTUyOUU4NSwgMHhCRENERTE4NywgMHhCQ0NDRTA4NCwgMHg1MUJCRDg1RCwgMHgwMEZFRkVGQywgMHgwMEZGRkZGRiwgMHgwM0VCRjNENCwgMHg0RkI1RDU0RiwgMHhCOEM3REQ3NCwgMHhCRkQzRTQ5NSwgMHhCNDQ1OTY5MCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMzc4QjM3MCwgMHhCRkQ1RTU5RCwgMHhCRUQxRTM5MywgMHhCODQwOTQ5MywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRDAxNzJCQSwgMHhBNDgyQjg2QiwgMHhCRkQ1RTU5QywgMHhCMkMzREM2OSwgMHgyQ0JCRDk2NywgMHg0MkI0RDQ1MiwgMHhCMkMyREI2OCwgMHhCRkQ1RTY5RCwgMHhCNTU4QTE4NywgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRTAxNzJCQiwgMHhBNDdBQjQ2RSwgMHhCRkQ0RTU5OSwgMHhCNUM1REM2RSwgMHgzMkMwREI2RiwgMHgwMEZFRkZGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOEVBRjREMywgMHg2MkI0RDQ0QiwgMHhCRENDRTA4MywgMHhCRENDRTA4OCwgMHhCOTJFOEE5RCwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQzAyNzNCQSwgMHhBNjk1QzI2NCwgMHhCRkQ2RTZBMSwgMHhBQkMwREE2MSwgMHgyREJDRDk2NiwgMHg4OUI4RDU0QywgMHhCRkQ1RTU5RSwgMHhCOEJBRDY2MiwgMHhCRDdFQjI0NSwgMHhCRjgwQjU0NywgMHhCRjdGQjQ0NywgMHhCRjgwQjU0NywgMHhCRjdGQjQ0NiwgMHhBNzk4QzE0NCwgMHhCRUQwRTI4RSwgMHhCQkM5REY3OCwgMHg0OEI1RDU1NSwgMHgwMkZCRkRGNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg0MEMyREM2QywgMHhCNUM2REQ3MSwgMHhCRkQyRTQ5NSwgMHhCRDkxQkQ0NSwgMHhCRjdGQjU0NywgMHhCRjgwQjU0NywgMHhCRjdGQjU0NywgMHhCRjgwQjU0NywgMHhCQjgwQjU0NiwgMHhCMUFGQ0U1NCwgMHhCRkQ3RTZBMywgMHg5NkJCRDc1NCwgMHgzRkIzRDQ1MiwgMHhBOUJERDg1OSwgMHhCRkQ2RTZBMSwgMHhCNkE0Qzg0RiwgMHhCRTdGQjQ0NiwgMHhCRjgwQjU0NywgMHhCRjdGQjQ0NiwgMHhCRjgwQjU0NywgMHhCRjgwQjU0NywgMHhBQjk1QzE0NSwgMHhCRENCRTA4MSwgMHhCRUNERTE4NiwgMHg1NkIzRDQ0RSwgMHgwN0RCRUJCMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJCRDc1MywgMHhCRkQ3RTZBMiwgMHhCOEIwRDE1NiwgMHhCRjdGQjU0NywgMHhCRjgwQjU0NywgMHhCRjdGQjQ0NywgMHhCRjgwQjU0NywgMHhCRjdGQjU0NywgMHhBQzhFQkM0MywgMHhCQUNCRTA4MCwgMHhCRkNFRTE4OCwgMHg1QUI0RDQ0RCwgMHgwN0VCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyQkNCRTE4MCwgMHhBRUMwRDk2MCwgMHhCRkQ2RTZBMSwgMHhCNUEzQzg0RSwgMHhCRjdGQjQ0NywgMHhCRjgwQjU0NywgMHhCRjdGQjU0NywgMHhCRjgwQjU0NywgMHhCRjdGQjU0NiwgMHhCRjgwQjU0NywgMHhCRTgwQjU0NywgMHhBQUFEQ0Y1MCwgMHhCRkQ3RTZBMiwgMHhBNkJFRDg1QywgMHgyM0I5RDc2NiwgMHgwMEZFRkZGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUVFRjVEOCwgMHg2RUI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REM3NiwgMHhCQTgzQjY0NiwgMHhCRjgwQjU0NywgMHhCRjdGQjQ0NiwgMHhCRjgwQjU0NywgMHhCRjdGQjU0NywgMHhCODg2Qjg0NiwgMHhCNUMzREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkUwRURCNCwgMHg5Q0JCRDc1MywgMHhCRkQ3RTZBMiwgMHhCN0FGQ0Y1NiwgMHhCRTgwQjU0NiwgMHhCRjdGQjU0NywgMHhCRjdGQjQ0NywgMHhCRjgwQjU0NywgMHhCRjgwQjU0NywgMHhBODk2QzI0NCwgMHhCRENFRTE4QSwgMHhCQkNBREY3RSwgMHg0QkIzRDQ1MSwgMHg2NEI1RDQ0QiwgMHhCRUNFRTE4OCwgMHhCRkM5REY3RSwgMHhCOTg0QjY0NSwgMHhCRjdGQjU0NywgMHhCRjdGQjQ0NywgMHhCRjgwQjU0OCwgMHhCRjdGQjQ0NywgMHhCRDgwQjU0NywgMHhBOEFDQ0Q0RCwgMHhCRkQ3RTZBMiwgMHhBMkJERDg1QywgMHgyMEJEREE3MCwgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQzRTQ5OSwgMHhCQUJDRDY2QiwgMHhCQzgxQjU0NSwgMHhCRjgwQjU0NywgMHhCRjdGQjU0NywgMHhCRjgwQjU0NywgMHhCRjdGQjQ0NiwgMHhCMjhEQkE0MywgMHhCQkNBREY3RSwgMHhCRkNGRTI4QSwgMHg1N0I0RDQ0RiwgMHgwN0VERjVEOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEQ0RTY5MywgMHg5RUJCRDc1MywgMHhCRkQ3RTZBMywgMHhCNEFBQ0I1NSwgMHhCRTgwQjU0NywgMHhCRjgwQjU0NywgMHhCRjdGQjQ0NywgMHhCRjgwQjU0NywgMHhCRjgwQjU0NywgMHhBODk5QzA0MywgMHhCRUQxRTM5MSwgMHhCQUM3REQ3NSwgMHgzQkI1RDU1NywgMHgwMkZBRkNGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NTI0OTdDQjcsIDB4QkYxQjY1QUIsIDB4QkYxODZGQjIsIDB4QkYxMjczQjYsIDB4QkYwRjc3QjksIDB4QkYwQzdCQkIsIDB4QkYwOTdGQkYsIDB4QkYwNTgzQzIsIDB4QkYwODg3QzUsIDB4QkYwNjhBQzYsIDB4QkYwNzhFQ0EsIDB4QkYwNDkxQ0IsIDB4QkYwMzkzQ0UsIDB4QkYwMjk1RDAsIDB4QkYwMzk3RDIsIDB4QkYwNDk4RDIsIDB4QkYwNDk5RDMsIDB4QkYwMjk4RDIsIDB4QkYwMzk4RDIsIDB4QkYwMjk2RDAsIDB4QkYwNDk0Q0YsIDB4QkYwMzkxQ0MsIDB4QkYwNThGQ0EsIDB4QkYwNDhCQzcsIDB4QkYwNzg4QzUsIDB4QkYwMzgzQzIsIDB4QkYwNzgwQkYsIDB4QkYwQzdCQkMsIDB4QkYxMTc5QkEsIDB4QkYxRTk1Q0UsIDB4QkYwNTkxQ0IsIDB4QkYwQzc5QkIsIDB4QjgxQzYyQUEsIDB4MjU4NEE2Q0UsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGNUY5RjQsIDB4Nzg2QkE0NTcsIDB4QkY3NUFCNDQsIDB4QkY5OUMxNEIsIDB4QkZEMERCNjEsIDB4QkZDRERBNjAsIDB4QkZBM0NCNEMsIDB4QkY5NkM3NDYsIDB4QkY5NUM3NDcsIDB4QkY5M0M2NDYsIDB4QkY5M0M2NDYsIDB4QkY5MUM1NDUsIDB4QkY5MEM1NDYsIDB4QkY4RUM0NDUsIDB4QkY4REM0NDUsIDB4QkY4QkM1NDUsIDB4QkY4QUM1NDUsIDB4QkY4OEM0NDQsIDB4QkY4N0M1NDQsIDB4QkY4NUM0NDMsIDB4QkY4NEMzNDMsIDB4QkY4MkMzNDMsIDB4QkY4M0M0NDQsIDB4QkY5NEM1NEEsIDB4QkY5NUM0NEIsIDB4QkY4REJGNDksIDB4QkY2OEFFNDYsIDB4QkU0RTlGNDUsIDB4Njg1NEEyNUQsIDB4MDJGNEY5RjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGN0ZCRUYsIDB4M0VCNUQ1NTQsIDB4QjBDMkRBNjUsIDB4QkZENkU2OUYsIDB4QjU2MEE1ODQsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkUwMjczQkIsIDB4QTM4M0I4NkMsIDB4QkZENkU2OUUsIDB4QjFDM0RCNjgsIDB4MjlDQ0UyODksIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDJGMEY3RTAsIDB4NEFCN0Q2NTUsIDB4QjdDNURDNkYsIDB4QkZENEU1OTksIDB4QjQ0RjlDOEMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjUxNDdDQjAsIDB4QUVCM0QyNjQsIDB4QkZEQkU5QUYsIDB4QjU5RkM4NzUsIDB4QkUwNTc0QjksIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QUIyNTg2QTMsIDB4QjZDMURBNkMsIDB4QkZENUU1OUMsIDB4N0FCN0Q2NEYsIDB4MDZGM0Y4RTUsIDB4MDBGRkZGRkYsIDB4MDRFOEYyQ0YsIDB4NTZCNUQ1NTAsIDB4QkNDOURFNzksIDB4QkZEMUUzOTEsIDB4QjUzRDkyOTUsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMTcyQkMsIDB4QTM3MUFGNzMsIDB4QkZEM0U0OTUsIDB4QjhDN0RENzQsIDB4MzhDMkRDNzAsIDB4MDBGRUZFRkQsIDB4MDBGRkZGRkYsIDB4MDhFQUYzRDIsIDB4NjVCNUQ1NEMsIDB4QkRDREUxODUsIDB4QkVDREUxODgsIDB4QjkyQzg5OUUsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkMwNDc0QkEsIDB4QTY5N0M0NjQsIDB4QkZEOUU4QUEsIDB4QkVDOERFODMsIDB4QjYyMjg0QTYsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkMwNTc1QjgsIDB4QTc5RUM3NjQsIDB4QkZEOEU3QTMsIDB4QTVCRUQ5NUMsIDB4MURDREUzOTAsIDB4NTVCNUQ0NEUsIDB4QkJDOERFNzgsIDB4QkZEMUUzOTMsIDB4QjczRjk0OTMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkMwNDc0QjksIDB4QTQ5M0MxNjYsIDB4QkZEN0U3QTIsIDB4QUFDMEQ5NjAsIDB4MUZEOUU5QTcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTBEMkU2OUUsIDB4NzhCNkQ0NEEsIDB4QkZEMkU0OTMsIDB4QkNCREQ4N0MsIDB4QjgxNzdFQUQsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjcwRDc4QjMsIDB4QUJBQUNENjQsIDB4QkZEN0U3QTMsIDB4OUFCQ0Q4NTYsIDB4MjBDRkUzOEYsIDB4ODlCOEQ1NEQsIDB4QkZENUU2OUYsIDB4QjhCQUQ2NjIsIDB4QkQ3RUIyNDYsIDB4QkY3RkI1NDcsIDB4QkY3RkI0NDcsIDB4QkY3RkI1NDgsIDB4QkY3RkI0NDcsIDB4QTg5OEMxNDQsIDB4QkZEMEUzOEUsIDB4QkJDOURGNzksIDB4NDlCNkQ1NTUsIDB4MDJGQkZERjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NDBDM0RDNkMsIDB4QjZDNkRENzEsIDB4QkZEMkU0OTUsIDB4QkQ5MUJENDUsIDB4QkY3RkI1NDcsIDB4QkY3RkI1NDcsIDB4QkY3RUI0NDcsIDB4QkY3RkI1NDcsIDB4QkM3RkI0NDYsIDB4QjFBRkNFNTQsIDB4QkZEN0U3QTMsIDB4OTZCQkQ3NTUsIDB4NDBCNEQ0NTIsIDB4QTlCREQ4NUEsIDB4QkZEN0U2QTIsIDB4QjZBNEM4NEYsIDB4QkY3RUI0NDcsIDB4QkY3RkI1NDcsIDB4QkY3RkI1NDcsIDB4QkY3RkI1NDcsIDB4QkY3RUI0NDcsIDB4QUI5NUMxNDUsIDB4QkVDQ0UwODIsIDB4QkVDRUUxODYsIDB4NTZCNEQ0NEYsIDB4MDhEQ0VCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjhCMEQxNTYsIDB4QkY3RkI1NDcsIDB4QkY3RkI1NDgsIDB4QkY3RUI0NDcsIDB4QkY3RkI1NDgsIDB4QkY3RkI0NDcsIDB4QUQ4RUJDNDQsIDB4QkJDQkUwODEsIDB4QkZDRUUyODgsIDB4NUJCNEQ0NEUsIDB4MDhFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4M0RDMkRCNkEsIDB4QjRDNERDNkMsIDB4QkZENEU1OUIsIDB4Qjg5NkMxNDksIDB4QkY3RUI0NDcsIDB4QkY3RkI1NDgsIDB4QkY3RkI0NDcsIDB4QkY3RkI1NDgsIDB4QkY3RkI0NDcsIDB4QkY3RkI1NDcsIDB4QkY3RkI0NDcsIDB4QURBNENBNEIsIDB4QkZENkU1OUUsIDB4QjFDMkRCNjYsIDB4MzBCQUQ4NjUsIDB4MDFGRUZGRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDVFRkY2RDgsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERDNzYsIDB4QkE4MkI2NDYsIDB4QkY3RkI1NDgsIDB4QkY3RUI0NDcsIDB4QkY3RkI1NDgsIDB4QkY3RkI0NDcsIDB4Qjk4NUI4NDYsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjUsIDB4OURCQkQ3NTQsIDB4QkZEN0U2QTMsIDB4QjdBRUNGNTYsIDB4QkU3RkI0NDcsIDB4QkY3RkI1NDcsIDB4QkY3RUI0NDcsIDB4QkY3RkI1NDcsIDB4QkY3RkI0NDcsIDB4QTg5NkMyNDQsIDB4QkRDRUUyOEIsIDB4QkNDQkUwN0UsIDB4NENCM0Q0NTEsIDB4NjVCNUQ1NEIsIDB4QkVDRUUxODksIDB4QkZDQURGN0YsIDB4QkE4NEI2NDYsIDB4QkY3RkI1NDcsIDB4QkY3RUI0NDcsIDB4QkY3RkI1NDcsIDB4QkY3RkI0NDcsIDB4QkQ4MEI1NDcsIDB4QThBQ0NENEUsIDB4QkZEN0U3QTMsIDB4QTJCRUQ4NUMsIDB4MjFCRURBNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEFFM0VFQjcsIDB4N0ZCOEQ1NEMsIDB4QkZENEU1OTksIDB4QkFCQ0Q2NkIsIDB4QkM4MUI1NDYsIDB4QkY3RkI1NDcsIDB4QkY3RUI0NDcsIDB4QkY3RkI1NDgsIDB4QkY3RkI0NDcsIDB4QjM4Q0JBNDMsIDB4QkJDQURGN0UsIDB4QkZDRkUyOEEsIDB4NTdCNUQ0NTAsIDB4MDdFREY1RDksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENEU2OTQsIDB4OUVCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjRBQkNCNTUsIDB4QkY3RkI1NDcsIDB4QkY3RkI1NDgsIDB4QkY3RkI0NDcsIDB4QkY3RkI1NDgsIDB4QkY3RkI0NDcsIDB4QTk5OUMwNDQsIDB4QkZEMUUzOTEsIDB4QkFDOERFNzUsIDB4M0JCNUQ1NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIzNzc5Q0M4LCAweEI5MUI2M0FBLCAweEJGMTU2RkIzLCAweEJGMTE3NUI2LCAweEJGMEQ3OUJCLCAweEJGMDg3REJELCAweEJGMDc4MUMxLCAweEJGMDU4NkM0LCAweEJGMDg4QUM3LCAweEJGMDg4REM5LCAweEJGMDg5MkNDLCAweEJGMDM5NENGLCAweEJGMDM5OEQyLCAweEJGMDM5QUQzLCAweEJGMDU5Q0Q1LCAweEJGMDc5Q0Q1LCAweEJGMDY5REQ2LCAweEJGMDg5REQ2LCAweEJGMDU5Q0Q1LCAweEJGMDU5QUQzLCAweEJGMDU5OEQyLCAweEJGMDE5NUQwLCAweEJGMDM5MkNDLCAweEJGMDY4RUM5LCAweEJGMDg4QkM3LCAweEJGMDc4NkM0LCAweEJGMDc4M0MxLCAweEJGMDc3REJELCAweEJGMjU5M0NCLCAweEJGMjQ5RkQ1LCAweEJGMDU5MkNDLCAweEJGMTE3MkI1LCAweEEwMUQ2MEE4LCAweDBBQjFDN0UwLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA2RUVGNUVELCAweDk2NUY5QzQ1LCAweEJGN0FBRTQ0LCAweEJGQTJDNTRFLCAweEJGQ0REQTYxLCAweEJGQzFENTVBLCAweEJGOTlDNzQ2LCAweEJGOTdDNzQ2LCAweEJGOTZDNzQ2LCAweEJGOTRDNjQ2LCAweEJGOTRDNjQ2LCAweEJGOTFDNTQ1LCAweEJGOTBDNTQ1LCAweEJGOEZDNDQ1LCAweEJGOEVDNDQ1LCAweEJGOENDNDQ0LCAweEJGOEJDNTQ1LCAweEJGODlDNDQ0LCAweEJGODhDNDQ0LCAweEJGODZDMzQzLCAweEJGODVDNDQzLCAweEJGODRDMzQzLCAweEJGOTVDNjRBLCAweEJGOTdDNTRCLCAweEJGOTJDMjQ5LCAweEJGNzJCMjQ2LCAweEJGNTVBMjQ1LCAweDhENDc5QTRDLCAweDBBRERFRERGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRjFGN0UyLCAweDUwQjVENTUwLCAweEJBQzdERDc0LCAweEJGRDJFNDk1LCAweEI3NDY5NzhGLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJEMDU3NEI5LCAweEE2QTVDQTYwLCAweEJGRDhFN0EzLCAweEEzQkVEODVCLCAweDE3RDVFN0ExLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA3RThGMkNGLCAweDVGQjVENDRCLCAweEJCQ0JERjgwLCAweEJFQ0ZFMjhBLCAweEI4MzA4QjlDLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEFFMjY4NkEyLCAweEI0QzREQjZCLCAweEJGREFFOEFDLCAweEI4ODFCNzc5LCAweEJFMDE3MkJCLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE2NDM5NjhFLCAweEJEQ0FERjdDLCAweEJFRDBFMjhFLCAweDYwQjVENDRFLCAweDAxRjRGOUU5LCAweDAwRkZGRkZGLCAweDBBREVFREJBLCAweDZDQjVENDRBLCAweEJEQ0ZFMjhDLCAweEJFQ0FERjgwLCAweEI3MUU4MkE4LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJFMDI3M0JCLCAweEEzOERCRTY3LCAweEJGRDdFNkEwLCAweEFFQzFEQTYzLCAweDIzRDRFNjlDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEwRDJFNTlELCAweDc5QjZENTRBLCAweEJGRDJFMzk0LCAweEJDQkREODdDLCAweEI3MTU3REFELCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEI3MEU3OUIzLCAweEFCQUFDRDYzLCAweEJGRENFQUIyLCAweEJBQkNENzc0LCAweEJDMEM3OEI0LCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEI1MEU3OUIyLCAweEFDQjhENTYxLCAweEJGRDdFNkEzLCAweDkzQkFENzUyLCAweDE3QkFEODZBLCAweDZCQjVENDRCLCAweEJFQ0ZFMjhBLCAweEJFQzhERTgzLCAweEI2MjE4M0E1LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJBMEI3N0I1LCAweEFBQjFEMTVGLCAweEJGRDhFN0EzLCAweDk5QkJENzU1LCAweDExREFFQUFELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFBRDFFNTk5LCAweDhDQjdENTRDLCAweEJGRDZFNjlGLCAweEJBQUVDRjcxLCAweEJDMDU3NEI4LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEIxMUI4MEE5LCAweEIxQzBEQTY2LCAweEJGRDZFNjlGLCAweDg1QjhENjRGLCAweDE1Q0VFMzkwLCAweDg5QjhENTRELCAweEJGRDVFNjlGLCAweEI4QkFENTYxLCAweEJEN0RCMjQ1LCAweEJGN0VCNDQ4LCAweEJGN0RCMzQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ3LCAweEE3OThDMTQ0LCAweEJGRDBFMzhFLCAweEJCQzlERTc4LCAweDQ4QjVENTU1LCAweDAyRkJGREY2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDQwQzJEQzZCLCAweEI2QzZERDcxLCAweEJGRDNFNDk1LCAweEJEOTBCQzQ1LCAweEJGN0RCMzQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ3LCAweEJGN0VCNDQ3LCAweEJCN0VCMzQ2LCAweEIxQUZDRTU1LCAweEJGRDdFN0EzLCAweDk2QkJENzU0LCAweDNGQjNENDUyLCAweEE5QkREODVBLCAweEJGRDdFNkEyLCAweEI2QTRDODRFLCAweEJFN0RCMzQ2LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ2LCAweEFCOTRDMTQ1LCAweEJEQ0NFMDgxLCAweEJFQ0RFMTg2LCAweDU2QjNENDRFLCAweDA4REJFQkI0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RTNFRUJDLCAweDlBQkJENzU0LCAweEJGRDdFNkEyLCAweEI4QUZEMDU2LCAweEJGN0RCMzQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ3LCAweEFEOERCQzQ0LCAweEJCQ0JERjgwLCAweEJGQ0VFMTg4LCAweDVBQjRENDRELCAweDA4RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDRFQzJEQjY5LCAweEJBQzlERTc4LCAweEJFRDFFMzkxLCAweEJBOTFCRjQ2LCAweEJGN0RCNDQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ3LCAweEJGN0VCNDQ3LCAweEJGN0VCNDQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ3LCAweEE5QTBDNzQ3LCAweEJGRDNFNDk2LCAweEI3QzZERDcxLCAweDNFQjZENTU5LCAweDAxRjNGOEU1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RUVGNUQ4LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQzc1LCAweEJBODFCNTQ2LCAweEJGN0VCNDQ3LCAweEJGN0VCMzQ3LCAweEJGN0RCNDQ3LCAweEJGN0RCNDQ3LCAweEI5ODVCODQ2LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCREZFREI0LCAweDlEQkJENzU0LCAweEJGRDdFNkEyLCAweEI3QUVDRjU2LCAweEJFN0RCMzQ2LCAweEJGN0VCNDQ3LCAweEJGN0RCNDQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCNDQ3LCAweEE4OTVDMTQ0LCAweEJEQ0VFMThBLCAweEJCQ0FERjdELCAweDRCQjNENDUxLCAweDY1QjVENTRCLCAweEJFQ0VFMTg5LCAweEJGQzlERTdFLCAweEI5ODNCNTQ1LCAweEJGN0VCNDQ3LCAweEJGN0RCNDQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCNDQ3LCAweEJEN0ZCNTQ3LCAweEE4QUNDRDRFLCAweEJGRDdFN0EyLCAweEEyQkREODVCLCAweDIwQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTJFRUI3LCAweDdGQjdENTRDLCAweEJGRDNFNTk5LCAweEJBQkNENTZCLCAweEJDN0ZCNDQ2LCAweEJGN0VCNDQ3LCAweEJGN0RCNDQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ3LCAweEIzOEJCQTQzLCAweEJCQ0FERjdFLCAweEJGQ0ZFMjhBLCAweDU3QjRENDRGLCAweDA3RURGNUQ4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE3RDRFNTk0LCAweDlFQkJENzUzLCAweEJGRDdFNkEyLCAweEIzQUFDQjU1LCAweEJFN0VCMzQ2LCAweEJGN0VCNDQ3LCAweEJGN0RCNDQ3LCAweEJGN0VCNDQ3LCAweEJGN0RCMzQ2LCAweEE5OThDMDQ0LCAweEJGRDFFMzkxLCAweEJBQzdERTc1LCAweDNCQjVENTU4LCAweDAyRkFGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkMxRDJFNiwgMHg5MzFDNjFBOSwgMHhCRjE2NkVCMiwgMHhCRjBGNzZCOCwgMHhCRjBEN0NCQywgMHhCRjA1N0ZCRiwgMHhCRjA5ODRDMywgMHhCRjA3ODhDNSwgMHhCRjA4OERDOSwgMHhCRjA0OTFDQywgMHhCRjA2OTVEMCwgMHhCRjAyOThEMiwgMHhCRjA3OUNENSwgMHhCRjAzOUVENywgMHhCRjA2QTFEOSwgMHhCRjA0QTJEOSwgMHhCRjA0QTNEQSwgMHhCRjA0QTJEOSwgMHhCRjAyQTFEOSwgMHhCRjAyOUZENywgMHhCRjA2OURENiwgMHhCRjA1OTlEMywgMHhCRjA1OTZEMCwgMHhCRjA1OTFDQywgMHhCRjA2OEVDQSwgMHhCRjA2ODlDNiwgMHhCRjA3ODVDMywgMHhCRjIwOTJDQiwgMHhCRjNFQUJEQywgMHhCRjIyOUZENSwgMHhCRjA4OEVDOSwgMHhCRjE2NkFBRiwgMHg2ODMxNkNBRiwgMHgwMEVCRjBGNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxM0JDRDVCNiwgMHhBRjY0OUU0NCwgMHhCRjgwQjI0NSwgMHhCRkFEQ0E1MiwgMHhCRkM5RDc1RiwgMHhCRkFDQ0Q0RiwgMHhCRjk5Qzc0NiwgMHhCRjk4Qzc0NiwgMHhCRjk3Qzc0NywgMHhCRjk1Qzc0NiwgMHhCRjk0Qzc0NiwgMHhCRjkyQzY0NSwgMHhCRjkyQzY0NiwgMHhCRjkwQzU0NSwgMHhCRjhGQzU0NSwgMHhCRjhEQzQ0NSwgMHhCRjhDQzU0NSwgMHhCRjhBQzU0NCwgMHhCRjg5QzQ0NCwgMHhCRjg3QzQ0MywgMHhCRjg2QzQ0NCwgMHhCRjkzQzY0NywgMHhCRjlDQzc0QiwgMHhCRjk2QzM0QSwgMHhCRjdGQjg0NywgMHhCRjVCQTY0NSwgMHhBODRBOUI0OSwgMHgxQ0FERDJCMiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOURERUNCNiwgMHg2NkI1RDQ0QiwgMHhCRENERTE4NiwgMHhCRkNCRTA4NSwgMHhCNTI1ODVBMywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCNDExN0JCMSwgMHhBRUI1RDQ2MywgMHhCRkQ4RTdBMywgMHg5MEJBRDY1MiwgMHgwREUzRUZDMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwRERBRUFCMCwgMHg3NEI2RDU0QiwgMHhCRkQxRTM5MCwgMHhCQ0MyREI3RiwgMHhCOTFDODFBOCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhBNzQxOTU5MSwgMHhCQkM5REY3QiwgMHhCRkQ4RTdBNCwgMHhCNTYzQTc4MywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMjVDQTQ3RiwgMHhCRUQwRTM4RSwgMHhCRENBREY3RCwgMHg0NUM0REQ3MSwgMHgwMEZERkVGQywgMHgwMEZGRkZGRiwgMHgxM0RBRUFBRiwgMHg4MkI3RDU0QiwgMHhCRkQ0RTU5OSwgMHhCOUJBRDY3NiwgMHhCQzBGNzlCMSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCQjA2NzVCOCwgMHhBOEFDQ0Y1RiwgMHhCRkQ4RTdBNCwgMHg5RUJDRDc1NywgMHgxNEQzRTY5RiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQUQwRTQ5NywgMHg4RUI4RDU0RSwgMHhCRkQ2RTY5RiwgMHhCQUFEQ0Y3MiwgMHhCRDA0NzRCOSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCMTFFODJBOSwgMHhCMUMxREE2NiwgMHhCRkRDRUFCMiwgMHhCNjlGQzc3NiwgMHhCRTA1NzRCOCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBQzI1ODVBMywgMHhCNkMwREE2QywgMHhCRkQ1RTU5QywgMHg3QkI3RDU0RSwgMHgxOUNERTM5MiwgMHg4MUI3RDU0QiwgMHhCRkQ0RTU5OSwgMHhCQkJERDg3NCwgMHhCQjBCNzhCNCwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBRjFDODFBQSwgMHhCMkJFRDg2OCwgMHhCRkQ2RTY5RiwgMHg4M0I3RDU0RSwgMHgwOEU4RjJDQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkVGRCwgMHgyNkM0REU3QiwgMHg5RUJCRDc1MywgMHhCRkQ4RTdBNCwgMHhCNDkwQkY3NiwgMHhCRjAxNzJCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhBODMzOEQ5OSwgMHhCOUM3REU3NSwgMHhCRkQyRTQ5NSwgMHg2Q0I4RDY1MiwgMHgxMEU0RUZCRiwgMHg4OUI4RDY0RCwgMHhCRkQ2RTY5RiwgMHhCOEJBRDU2MiwgMHhCRDdDQjE0NSwgMHhCRjdEQjQ0NywgMHhCRjdEQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdDQjM0NywgMHhBODk3QzE0NCwgMHhCRkQwRTM4RSwgMHhCQkM5REY3OSwgMHg0OUI2RDU1NiwgMHgwM0ZCRkRGNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg0MEMzREM2QywgMHhCNkM2REQ3MSwgMHhCRkQzRTQ5NSwgMHhCRDkwQkM0NSwgMHhCRjdDQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdEQjM0NywgMHhCRjdEQjM0NywgMHhCQjdEQjM0NiwgMHhCMUFGQ0U1NSwgMHhCRkQ3RTdBMywgMHg5NkJCRDc1NCwgMHg0MEI0RDQ1MiwgMHhBOUJFRDg1QSwgMHhCRkQ3RTZBMiwgMHhCNkE0Qzg0RiwgMHhCRjdDQjM0NywgMHhCRjdEQjQ0OCwgMHhCRjdEQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdDQjM0NywgMHhBQjk0QzE0NSwgMHhCRUNDRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkI0RDQ0RiwgMHgwOERCRUJCNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCOEFGRDA1NiwgMHhCRjdDQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdEQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdDQjM0NywgMHhBRDhEQkI0NCwgMHhCQkNCRTA4MCwgMHhCRkNGRTI4OCwgMHg1QUI0RDQ0RSwgMHgwOEVCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkY0RjlFNCwgMHg1RkI3RDY0RSwgMHhCRkNFRTE4NiwgMHhCRENCRTA4NSwgMHhCNzg5QkE0NiwgMHhCRjdEQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdEQjM0NywgMHhCRjdEQjQ0OCwgMHhCRjdEQjM0NywgMHhCRjdEQjM0NywgMHhCRjdEQjM0NywgMHhBQzk1QzE0NiwgMHhCRUQwRTI4QywgMHhCQkNCRTA3RSwgMHg0REIzRDQ1MCwgMHgwNEVCRjREMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUVFRjVEOCwgMHg2RkI2RDU0QiwgMHhCRkQxRTM5MSwgMHhCRUM0REM3NiwgMHhCQTgxQjU0NiwgMHhCRjdEQjQ0OCwgMHhCRjdEQjQ0NywgMHhCRjdEQjQ0NywgMHhCRjdDQjM0NywgMHhCOTg0Qjc0NiwgMHhCNUMzREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCN0FFQ0Y1NiwgMHhCRTdEQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdDQjM0NywgMHhCRjdEQjM0NywgMHhCRjdEQjM0NywgMHhBODk1QzE0NCwgMHhCRENFRTE4QSwgMHhCQkNBREY3RCwgMHg0QkIzRDQ1MSwgMHg2NUI1RDU0QywgMHhCRUNGRTI4OSwgMHhCRkM5REY3RSwgMHhCOTgyQjU0NiwgMHhCRjdEQjQ0NywgMHhCRjdDQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdDQjM0NywgMHhCRDdFQjQ0NywgMHhBOUFDQ0Q0RSwgMHhCRkQ3RTdBMiwgMHhBMkJERDg1QywgMHgyMUJEREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUJDRDY2QiwgMHhCQzdGQjQ0NiwgMHhCRjdEQjQ0NywgMHhCRjdEQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdEQjM0NywgMHhCMzhCQjk0MywgMHhCQkNCREY3RSwgMHhCRkNGRTI4QSwgMHg1N0I0RDQ0RiwgMHgwN0VERjVEOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEQ0RTY5NCwgMHg5RUJCRDc1MywgMHhCRkQ3RTdBMywgMHhCNEFBQ0I1NSwgMHhCRTdDQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdDQjM0NywgMHhCRjdEQjQ0NywgMHhCRjdDQjM0NywgMHhBOTk4QzA0NCwgMHhCRkQxRTM5MiwgMHhCQUM3REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGQkZDRkQsIDB4NEE1NDg4QkQsIDB4QkUxNjZDQjAsIDB4QkYwRTc2QjgsIDB4QkYwQjdEQkQsIDB4QkYwNTgxQzAsIDB4QkYwNzg2QzQsIDB4QkYwNjhBQzcsIDB4QkYwNjkwQ0EsIDB4QkYwMzkzQ0UsIDB4QkYwMzk4RDIsIDB4QkYwMzlDRDQsIDB4QkYwNDlGRDcsIDB4QkYwMUEyRDksIDB4QkYwM0E1REMsIDB4QkYwMkE2REQsIDB4QkYwM0E3REUsIDB4QkYwMUE2REQsIDB4QkYwMkE1REMsIDB4QkYwM0EzREEsIDB4QkYwNEEwRDgsIDB4QkYwMzlDRDUsIDB4QkYwNTk5RDMsIDB4QkYwMjk0Q0YsIDB4QkYwNjkwQ0IsIDB4QkYwNThCQzcsIDB4QkYyMjk3Q0YsIDB4QkY0REI0RTEsIDB4QkYzQkFCREIsIDB4QkYxOTlCRDMsIDB4QkYwQzdGQkYsIDB4QjQxODY2QUMsIDB4MjI4REFGRDMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MzRBRENDQTQsIDB4QkM2QkEzNDQsIDB4QkY4NUI2NDUsIDB4QkZCN0NGNTYsIDB4QkZDMEQ0NUEsIDB4QkY5REM4NDcsIDB4QkY5QUM4NDYsIDB4QkY5OUM3NDYsIDB4QkY5N0M3NDYsIDB4QkY5NkM2NDYsIDB4QkY5NUM3NDYsIDB4QkY5M0M2NDUsIDB4QkY5MkM2NDYsIDB4QkY5MEM1NDUsIDB4QkY4RkM1NDUsIDB4QkY4REM0NDQsIDB4QkY4Q0M0NDUsIDB4QkY4QUM0NDQsIDB4QkY4QUM1NDQsIDB4QkY4N0M0NDMsIDB4QkY5MEM1NDUsIDB4QkY5REM3NDksIDB4QkY5QkM2NEEsIDB4QkY4OUJDNDcsIDB4QkY2M0E5NDUsIDB4QjY0QjlCNDQsIDB4M0E3Q0I2ODIsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTBEREVDQjYsIDB4N0NCNkQ1NEEsIDB4QkVEM0U0OTYsIDB4QkFDMURBNzYsIDB4QkMxMDdBQjAsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QUMyQTg4QTAsIDB4QjdDMURBNkQsIDB4QkZENUU1OUIsIDB4NzhCNkQ0NEQsIDB4MDVGMEY2REQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTdDRUUzOTMsIDB4ODhCN0Q1NEMsIDB4QkZENUU1OUMsIDB4QkJBRkQwNzUsIDB4QkEwNzc1QjYsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkUwMDcxQkIsIDB4QTM2MUE3N0MsIDB4QkZEMEUyOEUsIDB4QkZEM0U0OTYsIDB4QjY0MTk1OTIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTQ3RkI2NkMsIDB4QkZENUU1OUIsIDB4QjRDNERCNkMsIDB4MkVDNERFNzksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUZDNEREN0QsIDB4OTRCOUQ2NEYsIDB4QkZEN0U2QTEsIDB4Qjg5REM2NzYsIDB4QkMwNDczQjgsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjAxODdGQUQsIDB4QjFCN0Q0NjYsIDB4QkZEN0U2QTEsIDB4ODhCOEQ1NTAsIDB4MEJFQUYzQ0YsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkQsIDB4MjdDNEREN0IsIDB4OUZCQ0Q3NTUsIDB4QkZEN0U2QTMsIDB4QjU4REJFNzcsIDB4QkUwMDcyQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QTkzNThFOTksIDB4QjlDN0RENzYsIDB4QkZEQkU5QUYsIDB4Qjc4M0I4NzgsIDB4QkUwMTcyQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTY0Mzk1OEYsIDB4QkNDOURGN0IsIDB4QkVEMEUyOEUsIDB4NjFCNUQ0NEQsIDB4MUZCNkQ2NjAsIDB4OTRCOUQ2NEYsIDB4QkZENkU2QTEsIDB4QjY5RkM4NzUsIDB4QkQwNDc0QjgsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTgzQTkxOTYsIDB4QkJDNkRDNzQsIDB4QkZEMkU0OTQsIDB4NjlCNUQ0NEQsIDB4MDNGNEY5RTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGREZERkEsIDB4MzZCOUQ3NUUsIDB4QUNCRkQ5NUUsIDB4QkZEN0U2QTIsIDB4Qjc2RUFEN0UsIDB4QkYwMDcyQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QTQ1NTlGODMsIDB4QkVDREUxODUsIDB4QkNDREUwODUsIDB4NTFCNkQ1NTMsIDB4MEVFN0YxQzYsIDB4ODlCOEQ1NEMsIDB4QkZENUU1OUUsIDB4QjhCQUQ1NjIsIDB4QkQ3QkIwNDUsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QTc5NkMwNDQsIDB4QkVEMEUyOEUsIDB4QkJDOURFNzgsIDB4NDhCNUQ1NTUsIDB4MDJGQkZERjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NDBDMkRDNkMsIDB4QjVDNkRENzEsIDB4QkZEMkU0OTUsIDB4QkQ4RkJCNDUsIDB4QkY3Q0IzNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDYsIDB4QkY3Q0IzNDcsIDB4QkI3Q0IyNDYsIDB4QjFBRkNFNTQsIDB4QkZEN0U2QTIsIDB4OTZCQkQ3NTQsIDB4M0ZCM0Q0NTIsIDB4QTlCREQ4NTksIDB4QkZENkU2QTIsIDB4QjZBNEM4NEYsIDB4QkU3QkIyNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QUI5M0MwNDUsIDB4QkRDQ0UwODEsIDB4QkVDRUUxODYsIDB4NTZCM0Q0NEUsIDB4MDdEQkVCQjMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTMsIDB4QkZENkU2QTIsIDB4QjhBRkQwNTYsIDB4QkY3QkIyNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDYsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QUM4Q0JCNDQsIDB4QkFDQkRGODAsIDB4QkZDRUUyODgsIDB4NUFCNEQ0NEUsIDB4MDdFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDdGMkY3RTAsIDB4NzJCNkQ0NDksIDB4QkZEMkUzOTIsIDB4QkRDNURDNzYsIDB4QkE4MEI1NDYsIDB4QkY3QkIyNDYsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDYsIDB4QkY3Q0IzNDcsIDB4QkY3Q0IzNDcsIDB4QjA4REJDNDUsIDB4QkJDQkRGODAsIDB4QkVDRkUyOEEsIDB4NUNCNEQ0NEUsIDB4MDhFQUYzRDMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDVFRUY1RDgsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERDNzUsIDB4QkE4MEI0NDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDYsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4Qjg4M0I2NDYsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJFMEVEQjQsIDB4OUNCQUQ3NTMsIDB4QkZEN0U2QTIsIDB4QjdBRUNGNTYsIDB4QkU3Q0IyNDYsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QTg5NUMxNDQsIDB4QkRDRUUxOEEsIDB4QkJDQkRGN0UsIDB4NEJCM0Q0NTEsIDB4NjRCNUQ0NEIsIDB4QkVDRUUxODgsIDB4QkZDOURFN0UsIDB4Qjk4MUI1NDUsIDB4QkY3QkIzNDcsIDB4QkY3QkIyNDYsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QkQ3REIzNDcsIDB4QThBQ0NENEQsIDB4QkZEN0U2QTIsIDB4QTJCREQ4NUMsIDB4MjBCRERBNzAsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFM0VFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZEM0U0OTksIDB4QkFCQ0Q2NkIsIDB4QkM3RUIzNDYsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QjI4QUI5NDMsIDB4QkJDQURGN0QsIDB4QkZDRUUyODksIDB4NTdCNEQ0NEYsIDB4MDdFREY1RDgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENEU2OTQsIDB4OUVCQkQ3NTMsIDB4QkZEN0U2QTIsIDB4QjRBQUNBNTUsIDB4QkU3Q0IzNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QkY3Q0IzNDcsIDB4QkY3QkIyNDcsIDB4QTg5OEMwNDMsIDB4QkVEMUUzOTEsIDB4QkFDN0RFNzQsIDB4M0JCNUQ1NTgsIDB4MDJGQUZDRjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBDQzNENkU4LCAweDlEMTg2OUFFLCAweEJGMEU3NEI2LCAweEJGMDk3RUJFLCAweEJGMDM4M0MyLCAweEJGMDg4OUM2LCAweEJGMDQ4REM5LCAweEJGMDU5MkNELCAweEJGMDM5NkQwLCAweEJGMDU5QkQ1LCAweEJGMDI5RkQ3LCAweEJGMDRBM0RBLCAweEJGMDNBNkRELCAweEJGMDVBQUUxLCAweEJGMDNBQkUyLCAweEJGMDVBQ0UzLCAweEJGMDNBQkUxLCAweEJGMDVBQUUxLCAweEJGMDVBN0RELCAweEJGMDZBNERCLCAweEJGMDI5RkQ3LCAweEJGMDU5Q0Q1LCAweEJGMDQ5N0QxLCAweEJGMDY5M0NELCAweEJGMjc5REQzLCAweEJGNDNBQ0RELCAweEJGMjk5QUQxLCAweEJGMTQ4OUM2LCAweEJGMEM3Q0JDLCAweEJGMTE3MEI0LCAweDc1MkM3MkIzLCAweDAyRURGM0Y4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGREZDLCAweDY5N0FBQzY4LCAweEJGNzVBOTQ1LCAweEJGOTBCQzQ4LCAweEJGQkZEMzU5LCAweEJGQUZDRTUwLCAweEJGOUNDODQ2LCAweEJGOUNDODQ3LCAweEJGOUJDNzQ2LCAweEJGOTlDNzQ3LCAweEJGOTdDNzQ2LCAweEJGOTZDNzQ3LCAweEJGOTRDNjQ2LCAweEJGOTNDNjQ3LCAweEJGOTFDNTQ1LCAweEJGOTFDNjQ2LCAweEJGOEZDNTQ1LCAweEJGOEVDNDQ1LCAweEJGOEJDNDQ0LCAweEJGOEFDNTQ1LCAweEJGOENDNTQ1LCAweEJGOUZDODQ5LCAweEJGOUVDNzQ5LCAweEJGOTNDMTQ5LCAweEJGNkJBRDQ1LCAweEJFNTU5RjQ1LCAweDYwNURBNTYyLCAweDAyRjdGQkY4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCQzhFMDg3LCAweDhGQjlENjRFLCAweEJGRDdFNkEwLCAweEI3QTVDQjc3LCAweEJDMDc3NUI2LCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEE2NDM5NzhGLCAweEJCQ0FERjdELCAweEJGRDBFMzhELCAweDVFQkFENzU4LCAweDAyRjZGQUVELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIzQ0NFMjhELCAweDlCQkJENzUzLCAweEJGRDdFN0EzLCAweEI2OTlDNDcyLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEEzN0JCNTcwLCAweEJGRDVFNjlFLCAweEJEQ0FERjg4LCAweEI3MkE4ODlGLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJCMDU3NUI5LCAweEE2OTZDMjY2LCAweEJGRDdFN0EzLCAweEE3QkZEOTVFLCAweDFFRDBFNTk1LCAweDAwRkZGRkZGLCAweDAwRkVGRkZELCAweDJDQzNERDc4LCAweEE1QkREODU5LCAweEJGRDhFN0E0LCAweEI3ODRCOTc3LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEFCMzM4RDlCLCAweEI5QzVEQzcxLCAweEJGRDNFNTk3LCAweDcxQjZENTRELCAweDA0RUVGNkRBLCAweDAwRkZGRkZGLCAweDAxRkRGRUZBLCAweDM3QjhENjVDLCAweEFEQzBEQTYwLCAweEJGRDZFNkExLCAweEI3NkVBRDgwLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE0NThBMjgyLCAweEJGQ0VFMTg3LCAweEJGRDhFN0E2LCAweEI1NjNBNzgzLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEE0NUJBMzdGLCAweEJFRDBFMzhFLCAweEJEQ0FERjdELCAweDQ2QzFEQjZCLCAweDJEQkNEOTY4LCAweEEzQkREODU4LCAweEJGRDhFN0E0LCAweEI4ODNCOTc5LCAweEJFMDE3MkJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEE0NTI5RTg2LCAweEJEQ0RFMTg3LCAweEJFQ0RFMTg0LCAweDRGQkJEODVFLCAweDAxRjlGQ0YyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRjNGOEU2LCAweDQ5QjdENjU3LCAweEI3QzVEQzZFLCAweEJGRDRFNTk5LCAweEI1NTA5RDhCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEEyNkRBRDc2LCAweEJGRDNFNDk2LCAweEI5QzdERDczLCAweDM3QzhFMDdELCAweDBFRUJGM0NFLCAweDg5QjhENTRELCAweEJGRDVFNTlGLCAweEI4QkFENTYyLCAweEJEN0FCMDQ1LCAweEJGN0JCMzQ3LCAweEJGN0FCMjQ3LCAweEJGN0NCMzQ3LCAweEJGN0JCMjQ3LCAweEE4OTZDMDQ0LCAweEJGRDBFMjhFLCAweEJCQzlERjc5LCAweDQ5QjZENTU2LCAweDAyRkJGREY2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDQwQzNEQzZDLCAweEI2QzZERDcxLCAweEJGRDNFNDk1LCAweEJEOEVCQjQ1LCAweEJGN0JCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0FCMjQ3LCAweEJGN0JCMzQ4LCAweEJDN0NCMjQ2LCAweEIxQUZDRTU1LCAweEJGRDdFN0EzLCAweDk2QkJENzU1LCAweDQwQjRENDUyLCAweEE5QkVEODVBLCAweEJGRDZFNkEyLCAweEI2QTRDODRGLCAweEJGN0JCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0JCMjQ3LCAweEJGN0JCMzQ4LCAweEJGN0JCMjQ3LCAweEFCOTJDMDQ1LCAweEJFQ0NFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjRENDRGLCAweDA4REJFQkI0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzU0LCAweEJGRDdFNkEzLCAweEI4QUZEMDU2LCAweEJGN0JCMjQ3LCAweEJGN0JCMzQ4LCAweEJGN0JCMjQ3LCAweEJGN0JCMzQ4LCAweEJGN0FCMjQ3LCAweEFEOENCQjQ0LCAweEJCQ0JFMDgwLCAweEJGQ0VFMjg4LCAweDVCQjRENDRFLCAweDA4RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBDRjBGNkRBLCAweDg1QjdENTRCLCAweEJGRDVFNjlELCAweEI5QkZEOTY4LCAweEJFN0RCNDQ3LCAweEJGN0FCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0FCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0JCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0JCMjQ3LCAweEIwOEFCQjQ2LCAweEI4QzdERDczLCAweEJGRDNFNDk1LCAweDZGQjVENDRELCAweDBCREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RUZGNkQ4LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzVEQzc2LCAweEJBN0ZCNDQ3LCAweEJGN0JCMzQ3LCAweEJGN0JCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0JCMjQ3LCAweEI5ODJCNjQ2LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI1LCAweDlEQkJENzU0LCAweEJGRDdFN0EzLCAweEI3QUVDRjU2LCAweEJFN0JCMjQ3LCAweEJGN0JCMjQ3LCAweEJGN0FCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0JCMjQ3LCAweEE4OTRDMTQ0LCAweEJEQ0VFMjhBLCAweEJDQ0JFMDdFLCAweDRDQjNENDUxLCAweDY1QjZENDRDLCAweEJFQ0VFMTg5LCAweEJGQ0FERjdFLCAweEJBODFCNTQ2LCAweEJGN0JCMzQ3LCAweEJGN0FCMjQ3LCAweEJGN0JCMjQ3LCAweEJGN0JCMjQ3LCAweEJEN0NCMzQ3LCAweEE4QUNDRDRFLCAweEJGRDhFN0EzLCAweEEyQkVEOTVDLCAweDIxQkVEQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBBRTNFRUI3LCAweDdGQjhENTRDLCAweEJGRDRFNTk5LCAweEJBQkNENjZCLCAweEJDN0RCMzQ2LCAweEJGN0JCMjQ3LCAweEJGN0FCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0JCMjQ3LCAweEIzOEFCOTQzLCAweEJCQ0FERjdFLCAweEJGQ0ZFMjhBLCAweDU3QjRENDRGLCAweDA3RURGNUQ5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RDRFNjk0LCAweDlFQkJENzUzLCAweEJGRDdFN0EzLCAweEI0QUFDQjU1LCAweEJGN0JCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0JCMjQ3LCAweEJGN0JCMzQ3LCAweEJGN0JCMjQ3LCAweEE5OThDMDQ0LCAweEJGRDFFMzkxLCAweEJBQzhERTc1LCAweDNCQjVENTU4LCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZBRkNGRCwgMHgzRTY5OURDQSwgMHhCOTBDNkZCMiwgMHhCRjA3N0NCQywgMHhCRjA1ODRDMywgMHhCRjA4ODlDNywgMHhCRjA2OEVDOSwgMHhCRjA3OTRDRSwgMHhCRjAxOThEMiwgMHhCRjA1OURENiwgMHhCRjA0QTFEOCwgMHhCRjA0QTZERCwgMHhCRjAzQTlFMCwgMHhCRjA1QURFMywgMHhCRjA1QUZFNSwgMHhCRjA1QjFFNiwgMHhCRjAzQjBFNSwgMHhCRjA1QUVFMywgMHhCRjAzQUFFMSwgMHhCRjAyQTdERSwgMHhCRjAyQTJEOSwgMHhCRjA0OUVENiwgMHhCRjA0OThEMiwgMHhCRjA3OTVDRiwgMHhCRjBBOTBDQiwgMHhCRjA4OEFDNywgMHhCRjBDOEFDNiwgMHhCRjBGOERDOSwgMHhCRjA5N0VCRSwgMHhBQjEyNkNCMCwgMHgxOUEzQzFERSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRURFMCwgMHg5RTYyOUM0NCwgMHhCRjdGQUY0NSwgMHhCRjlGQzQ0RCwgMHhCRkI5RDA1NSwgMHhCRkExQ0E0OCwgMHhCRjlEQzg0NywgMHhCRjlDQzg0NywgMHhCRjlCQzc0NiwgMHhCRjlBQzg0NiwgMHhCRjk4QzY0NiwgMHhCRjk3Qzc0NiwgMHhCRjk1QzY0NiwgMHhCRjk0QzY0NiwgMHhCRjkyQzY0NiwgMHhCRjkxQzU0NiwgMHhCRjhGQzU0NSwgMHhCRjhFQzU0NSwgMHhCRjhDQzQ0NCwgMHhCRjhCQzU0NSwgMHhCRjlEQzg0NywgMHhCRkEyQzk0OSwgMHhCRjlCQzQ0OCwgMHhCRjc0QjI0NSwgMHhCRTVCQTI0NCwgMHg4NjU1OUY1NCwgMHgwOERDRUJERCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyOEMzREQ3OCwgMHhBMUJDRDc1NiwgMHhCRkQ3RTdBMywgMHhCOThDQkQ3NiwgMHhCRTAxNzJCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNDYwQTY3RCwgMHhCRUQwRTI4RSwgMHhCQ0NBREY3QywgMHg0NEJGREE2OSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZDRkVGOSwgMHgzMkI3RDY1QywgMHhBOUJGRDk1RCwgMHhCRkQ3RTZBMiwgMHhCNjczQjA3RiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQzAyNzNCQSwgMHhBNjlFQzc2MSwgMHhCRkQ4RTdBOCwgMHhCREJERDg3QSwgMHhCNzEwN0FCMSwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCODBFNzlCMiwgMHhBQkIxRDE2MSwgMHhCRkQ4RTdBMywgMHg5NkJBRDc1NCwgMHgwRkRFRURCNywgMHgwMEZGRkZGRiwgMHgwMkY2RkFFQiwgMHgzRUI0RDQ1MiwgMHhCMEMyREI2NSwgMHhCRkQ2RTY5RSwgMHhCNTYwQTY4NSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNTQ5OTk4QSwgMHhCQ0NDRTA4MiwgMHhCRkNFRTI4OCwgMHg1NkJDRDg1RSwgMHgwMEZBRkRGNSwgMHgwMEZGRkZGRiwgMHgwMkY0RjlFNywgMHg0OUI3RDU1NiwgMHhCOEM2REQ3MCwgMHhCRkQzRTQ5OCwgMHhCNTRGOUM4QywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBMzZGQUU3NSwgMHhCRkQzRTQ5OSwgMHhCRkQzRTU5NywgMHhCNjQzOTY5MSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAxNzJCQiwgMHhBNDdGQjY2QywgMHhCRkQ0RTU5QiwgMHhCNUM0REM2QywgMHgzMEJDRDk2OCwgMHgzREJBRDc2MSwgMHhCMUMyREI2NSwgMHhCRkQ2RTY5RiwgMHhCNTYzQTc4MywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNDczQjA3MywgMHhCRUQzRTQ5NiwgMHhCOEM3REQ3MiwgMHgzNkM0REQ3NSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkU2RjFDQiwgMHg1RUI0RDQ0QiwgMHhCQkNCREY4MCwgMHhCRkNGRTI4QSwgMHhCNzMwOEI5QywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRTAxNzJCQiwgMHhBNDkxQzA2NSwgMHhCRkQ2RTZBMCwgMHhBRUMxREE2MywgMHgyM0NCRTI4QSwgMHgwREVCRjNEMCwgMHg4OUI4RDU0RCwgMHhCRkQ1RTY5RiwgMHhCOEI5RDU2MiwgMHhCRDc5QUY0NSwgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhBNzk2QkY0NCwgMHhCRkQwRTI4RSwgMHhCQkM5REU3OCwgMHg0OEI1RDU1NSwgMHgwMkZCRkRGNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg0MEMyREM2QiwgMHhCNkM2REQ3MSwgMHhCRkQzRTQ5NSwgMHhCRDhFQkI0NSwgMHhCRjdBQjI0NywgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhCRjdBQjI0NywgMHhCQjdCQjI0NiwgMHhCMUFGQ0U1NSwgMHhCRkQ3RTZBMywgMHg5NkJCRDc1NCwgMHgzRkIzRDQ1MiwgMHhBOUJERDg1QSwgMHhCRkQ2RTZBMiwgMHhCNkEzQzc0RiwgMHhCRTc5QjE0NiwgMHhCRjdBQjI0NywgMHhCRjdBQjE0NywgMHhCRjc5QjE0NywgMHhCRjc5QjE0NiwgMHhBQjkxQzA0NSwgMHhCRENCRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkIzRDQ0RSwgMHgwOERCRUJCMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEUzRUVCQywgMHg5QUJCRDc1MywgMHhCRkQ3RTZBMywgMHhCOEFGRDA1NiwgMHhCRjdBQjE0NiwgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhBRDhCQkI0NCwgMHhCQkNCRTA4MCwgMHhCRkNFRTE4OCwgMHg1QUIzRDQ0RCwgMHgwOEVCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNERBRTlBMiwgMHg5NEI5RDY0RiwgMHhCRkQ3RTZBMiwgMHhCNkIzRDE1RCwgMHhCRTdCQjI0NywgMHhCRjc5QjE0NiwgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhCRjdBQjI0NywgMHhCRjdBQjI0NywgMHhCRjdBQjI0NywgMHhCRjc5QjE0NiwgMHhCMjgzQjc0NywgMHhCNkMwRDk2NiwgMHhCRkQ1RTY5RCwgMHg3RkI2RDU0RSwgMHgxMENGRTQ5OSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNEVFRjVEOCwgMHg2RUI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REI3NSwgMHhCQTdFQjM0NiwgMHhCRjdBQjI0NywgMHhCRjdBQjE0NiwgMHhCRjdBQjI0NywgMHhCRjc5QjE0NiwgMHhCOTgyQjY0NiwgMHhCNUMzREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkRGRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0FEQ0U1NiwgMHhCRTdBQjE0NiwgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhCRjdBQjI0NywgMHhCRjdBQjE0NywgMHhBODk0QzE0NCwgMHhCRENFRTE4QSwgMHhCQkNBREY3RCwgMHg0QkIzRDQ1MSwgMHg2NUI1RDU0QiwgMHhCRUNFRTE4OSwgMHhCRkM5REY3RSwgMHhCOTgwQjQ0NiwgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhCRDdCQjI0NywgMHhBOEFCQ0Q0RSwgMHhCRkQ3RTdBMiwgMHhBMkJFRDg1QywgMHgyMEJEREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQ0RTQ5OSwgMHhCQUJDRDY2QiwgMHhCQzdDQjI0NSwgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhCRjdBQjI0NywgMHhCRjdBQjE0NywgMHhCMzg4Qjg0MywgMHhCQkNBREY3RSwgMHhCRkNGRTE4OSwgMHg1N0I0RDQ0RiwgMHgwN0VERjVEOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxN0Q0RTU5NCwgMHg5RUJCRDc1MywgMHhCRkQ3RTZBMywgMHhCM0E5Q0E1NSwgMHhCRTc5QjE0NiwgMHhCRjdBQjI0NywgMHhCRjdBQjI0NywgMHhCRjdBQjI0NywgMHhCRjc5QjE0NywgMHhBOTk3QkY0NCwgMHhCRkQxRTM5MiwgMHhCQUM3REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZBRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNFM0VDRjUsIDB4NkYzMzgwQkEsIDB4QkUwODc2QjgsIDB4QkYwNDgyQzEsIDB4QkYwQThCQzcsIDB4QkYwNjkwQ0EsIDB4QkYwNTk1Q0YsIDB4QkYwMTk5RDMsIDB4QkYwNzlFRDYsIDB4QkYwM0EyREEsIDB4QkYwNEE4REUsIDB4QkYwM0FDRTMsIDB4QkYwNkIwRTYsIDB4QkYwNEI0RTksIDB4QkYwN0I3RUIsIDB4QkYwN0I1RUEsIDB4QkYwNUIxRTcsIDB4QkYwNEFERTQsIDB4QkYwMkE5RTEsIDB4QkYwMUE0REIsIDB4QkYwNTlGRDgsIDB4QkYwNDlBRDQsIDB4QkYyM0EzRDgsIDB4QkYzOEFBREMsIDB4QkYzRkFEREUsIDB4QkYzMUE5REMsIDB4QkYxMzk3RDAsIDB4QkEwQzcyQjUsIDB4NDU1Qjk3QzcsIDB4MDBGOEZBRkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MzQ5QkJGOEUsIDB4QkM2RUEzNDUsIDB4QkY4OEI1NDYsIDB4QkZBRUNCNTIsIDB4QkZBOENCNEMsIDB4QkY5RkM5NDgsIDB4QkY5RUM5NDcsIDB4QkY5REM5NDcsIDB4QkY5Q0M4NDYsIDB4QkY5QkM4NDcsIDB4QkY5OUM3NDYsIDB4QkY5OEM3NDYsIDB4QkY5NUM3NDYsIDB4QkY5NUM3NDYsIDB4QkY5M0M2NDYsIDB4QkY5MkM2NDYsIDB4QkY5MEM1NDUsIDB4QkY4RkM1NDUsIDB4QkY4REM0NDQsIDB4QkY5QkM3NDcsIDB4QkZBNEM5NDcsIDB4QkY5RkM3NDksIDB4QkY3RkI2NDUsIDB4QkY2MUE2NDQsIDB4QTM0RDk5NDYsIDB4MTdBRUQxQjAsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGOEZCRUYsIDB4MzlCOEQ3NUQsIDB4QUVDMURBNjIsIDB4QkZENkU2QTAsIDB4QjU2QUFCODEsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkUwMTcyQkIsIDB4QTQ3RkI3NkQsIDB4QkZENEU1OUIsIDB4QjRDNURDNkMsIDB4MkVDMERCNkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGQkZERjcsIDB4NDRCN0Q2NTksIDB4QjZDNERDNkIsIDB4QkZENEU1OUIsIDB4Qjc1OUEyODcsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QjUwRTc5QjIsIDB4QURBRENGNjQsIDB4QkZEQUU5QUUsIDB4QjhBQ0NGNzEsIDB4QkUwMzczQjksIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QUYxRTgyQTgsIDB4QjJDMURBNjgsIDB4QkZENkU2OUUsIDB4ODFCOEQ1NEYsIDB4MDdFN0YyQ0MsIDB4MDBGRkZGRkYsIDB4MDRGNUY5RTksIDB4NTBCNUQ0NEYsIDB4QkJDOERFNzUsIDB4QkVEMkUzOTUsIDB4Qjc0Njk4OTAsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QTU2QkFDNzcsIDB4QkVEMUUzOTIsIDB4QkFDOURFNzcsIDB4M0RCREQ5NjcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDhFN0YyQ0EsIDB4NUZCNEQ0NEIsIDB4QkNDQ0UwODIsIDB4QkVDRUUxODksIDB4QjcyRjhCOUUsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkUwMDcyQkIsIDB4QTU5NUMyNjQsIDB4QkZEOEU3QTcsIDB4QkVDQUUwODgsIDB4QjcyQTg4OUYsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkMwNTc1QjksIDB4QTY5NUMyNjYsIDB4QkZEOEU3QTIsIDB4QThCRkQ5NUYsIDB4MjFDNkRGN0YsIDB4NTFCNEQ0NEQsIDB4QjlDOERFNzUsIDB4QkZEMkU0OTQsIDB4Qjc0Mzk2OTIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkMwMjczQkEsIDB4QTU4RUJGNjgsIDB4QkZENkU2QTAsIDB4QURDMURBNjMsIDB4MjNDQ0UyOEMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEREREVDQjcsIDB4NzNCNkQ1NEEsIDB4QkVEMUUzOTAsIDB4QkJDNERDN0YsIDB4QjkxQzgxQTgsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QjgwOTc2QjYsIDB4QTlBNENCNjMsIDB4QkZEOEU3QTQsIDB4OUVCQ0Q4NTgsIDB4MTVERUVEQjUsIDB4MEVFQ0Y0RDAsIDB4ODlCOEQ2NEQsIDB4QkZENkU2OUYsIDB4QjhCQUQ1NjIsIDB4QkQ3OUFGNDUsIDB4QkY3QUIyNDgsIDB4QkY3OUIxNDcsIDB4QkY3OUIxNDcsIDB4QkY3OEIxNDcsIDB4QTg5NkJGNDQsIDB4QkZEMEUyOEUsIDB4QkJDOURGNzgsIDB4NDlCNkQ1NTYsIDB4MDNGQkZERjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NDBDM0RDNkMsIDB4QjZDNkRENzEsIDB4QkZEM0U0OTUsIDB4QkQ4REJBNDUsIDB4QkY3OEIxNDcsIDB4QkY3OUIyNDcsIDB4QkY3OUIxNDcsIDB4QkY3OUIxNDcsIDB4QkI3QUIxNDYsIDB4QjFBRkNFNTUsIDB4QkZEN0U3QTMsIDB4OTZCQkQ3NTQsIDB4NDBCM0Q0NTIsIDB4QTlCRUQ5NUEsIDB4QkZEN0U2QTIsIDB4QjZBMkM3NEYsIDB4QkY3OUIxNDcsIDB4QkY3OUIyNDgsIDB4QkY3OEIxNDcsIDB4QkY3OUIyNDcsIDB4QkY3OEIxNDYsIDB4QUI5MUJGNDUsIDB4QkVDQ0UwODEsIDB4QkVDRUUxODYsIDB4NTZCM0Q0NEUsIDB4MDhEQkVCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTQsIDB4QkZEN0U2QTMsIDB4QjhBRkQwNTYsIDB4QkY3OEIxNDcsIDB4QkY3OUIyNDcsIDB4QkY3OUIxNDcsIDB4QkY3OUIxNDcsIDB4QkY3OEIxNDcsIDB4QUQ4QkJCNDQsIDB4QkJDQkUwODAsIDB4QkZDRUUyODgsIDB4NUFCNEQ0NEUsIDB4MDhFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjBEOUU5QTIsIDB4QTFCQ0Q3NTYsIDB4QkZEOEU3QTQsIDB4QkFBN0NCNTUsIDB4QkY3QUIyNDcsIDB4QkY3OUIxNDcsIDB4QkY3OUIyNDcsIDB4QkY3OEIxNDcsIDB4QkY3OUIxNDcsIDB4QkY3OEIxNDcsIDB4QkY3OUIyNDcsIDB4QkY3OEIxNDcsIDB4QkE3Q0IzNDcsIDB4QjJCOUQ1NUMsIDB4QkZEN0U3QTIsIDB4OEZCOUQ2NTIsIDB4MTdEMEU1OTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDVFRUY1RDgsIDB4NkZCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERDNzYsIDB4QkE3RUIzNDcsIDB4QkY3OUIyNDcsIDB4QkY3OEIxNDcsIDB4QkY3OUIxNDcsIDB4QkY3OUIxNDcsIDB4Qjk4MUI1NDcsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjQsIDB4OURCQkQ3NTQsIDB4QkZEN0U2QTMsIDB4QjdBRENGNTYsIDB4QkU3OUIxNDYsIDB4QkY3OUIxNDcsIDB4QkY3OUIxNDcsIDB4QkY3OUIyNDcsIDB4QkY3OEIxNDcsIDB4QTg5NEMxNDQsIDB4QkRDRkUyOEIsIDB4QkJDQkRGN0UsIDB4NEJCM0Q0NTEsIDB4NjVCNUQ1NEIsIDB4QkVDRkUyODksIDB4QkZDOURFN0UsIDB4Qjk3RkI0NDUsIDB4QkY3OUIyNDcsIDB4QkY3OEIxNDcsIDB4QkY3OUIxNDcsIDB4QkY3OEIxNDYsIDB4QkQ3QUIyNDcsIDB4QTlBQ0NENEUsIDB4QkZEN0U3QTIsIDB4QTJCRUQ4NUMsIDB4MjFCRERBNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFM0VFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZENEU1OTksIDB4QkFCQ0Q2NkIsIDB4QkM3QkIyNDYsIDB4QkY3QUIyNDgsIDB4QkY3OUIxNDcsIDB4QkY3OUIxNDcsIDB4QkY3OUIxNDcsIDB4QjM4OEI4NDMsIDB4QkJDQURGN0UsIDB4QkZDRkUyOEEsIDB4NTdCNEQ0NTAsIDB4MDdFREY1RDksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENEU2OTQsIDB4OUVCQkQ3NTMsIDB4QkZEN0U3QTMsIDB4QjRBOUNBNTUsIDB4QkU3OUIxNDcsIDB4QkY3OUIyNDcsIDB4QkY3OUIxNDcsIDB4QkY3OUIxNDcsIDB4QkY3OEIxNDcsIDB4QTk5N0JGNDQsIDB4QkZEMUUzOTIsIDB4QkFDOERFNzUsIDB4M0JCNUQ1NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBCQzdEQ0VDLCAweDhCMEU3MkI0LCAweEJFMDM3QUJCLCAweEJGMDk4OUM2LCAweEJGMDU5MENCLCAweEJGMDU5NUNGLCAweEJGMDI5OUQzLCAweEJGMDU5RUQ3LCAweEJGMDNBM0RCLCAweEJGMDJBOUUxLCAweEJGMDRBREU0LCAweEJGMDlCMUU3LCAweEJGMEFCN0VCLCAweEJGMEJCQ0VGLCAweEJGMERCOUVELCAweEJGMDVCM0U5LCAweEJGMDZBRUU1LCAweEJGMDRBOUUyLCAweEJGMjJBREUwLCAweEJGMjBBN0RDLCAweEJGMTlBM0Q5LCAweEJGNTZCREU5LCAweEJGNEJCN0U0LCAweEJGMzhBRURGLCAweEJGMTk5RUQ1LCAweEJEMDc3QUJCLCAweDYzMkE3Q0I4LCAweDAzREJFOEYyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRTlGMUU2LCAweDdFNjc5RTRFLCAweEJGNzhBOTQ1LCAweEJGOTZCRDQ5LCAweEJGQUJDQjRGLCAweEJGQTFDOTQ3LCAweEJGQTBDOTQ4LCAweEJGOUVDODQ3LCAweEJGOUVDOTQ3LCAweEJGOUNDODQ3LCAweEJGOUJDODQ3LCAweEJGOTlDNzQ2LCAweEJGOThDNzQ2LCAweEJGOTZDNjQ2LCAweEJGOTVDNzQ2LCAweEJGOTNDNjQ2LCAweEJGOTNDNjQ2LCAweEJGOTBDNTQ1LCAweEJGOEZDNDQ1LCAweEJGOTlDNzQ1LCAweEJGQThDQTQ4LCAweEJGQTNDODQ4LCAweEJGOEFCQjQ2LCAweEJGNjZBODQ0LCAweEI1NTE5QjQ0LCAweDMyODdCQTg4LCAweDAwRkVGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRjRGOUU4LCAweDRCQjRENDRGLCAweEI4QzZERDcxLCAweEJFRDNFNDk3LCAweEI3NEI5QThELCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJDMDQ3NEI4LCAweEE2OTlDNDY2LCAweEJGRDdFNkEyLCAweEE3QkZEOTVFLCAweDFCRDhFOEE2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA2RTVGMUM5LCAweDU5QjRENDRDLCAweEJCQ0FERjdELCAweEJGRDBFMjhELCAweEEzNjdBOTc4LCAweEEyM0M5MjkzLCAweEEzM0Q5MjkzLCAweEEyM0M5MjkzLCAweEEyM0Q5MjkzLCAweDlCNTI5RTg0LCAweEI1QzBEQTY5LCAweEJGREFFOEFELCAweEI2ODdCQjc5LCAweEJFMDE3MkJBLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEE3M0I5Mjk1LCAweEJCQzdERDc3LCAweEJFRDJFNDkzLCAweDY2QjZENDRGLCAweDAzRjhGQkYwLCAweDAwRkZGRkZGLCAweDA5RENFQkI0LCAweDY2QjRENDRCLCAweEJFQ0VFMTg3LCAweEJFQzlERjg1LCAweEI2MjY4NkEzLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJEMDE3MkJBLCAweEE0ODRCOTZDLCAweEJGRDVFNTlFLCAweEIwQzNEQjY4LCAweDI3Q0VFMzhGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBEREVFQ0I4LCAweDc0QjVENDRBLCAweEJGRDFFMzkxLCAweEJCQzJEQTdELCAweEJBMUE4MEE5LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEI3MDk3NkI1LCAweEFBQTdDQzYzLCAweEJGREJFOUFGLCAweEJEQkVEOTc5LCAweEI4MTA3QUIwLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEI5MEQ3OUIzLCAweEFBQjFEMTYwLCAweEJGRDdFN0EzLCAweDk3QkFENjU0LCAweDE4QzVERTgxLCAweDY1QjVENDRCLCAweEJFQ0RFMTg1LCAweEJEQzlERTg3LCAweEI3MkE4ODlGLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEI5MEE3NkI1LCAweEE5QTdDQzYyLCAweEJGRDhFN0EzLCAweDlEQkNEODU4LCAweDEzREVFQ0I0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE3Q0NFMjkwLCAweDg3QjdENTRDLCAweEJGRDVFNTlDLCAweEJCQUZEMDc3LCAweEI5MDk3NkI1LCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEIyMUE4MEFCLCAweEIwQjlENjY1LCAweEJGRDdFNkExLCAweDhBQjhENTUwLCAweDBBRTZGMUM4LCAweDBERUNGM0QwLCAweDg5QjhENTRDLCAweEJGRDVFNTlFLCAweEI4QkFENTYyLCAweEJENzdBRjQ1LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEJGNzdCMDQ3LCAweEJGNzdCMDQ3LCAweEE3OTVCRjQ0LCAweEJFRDBFMjhFLCAweEJCQzlERTc4LCAweDQ4QjZENTU1LCAweDAyRkJGREY2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDQwQzJEQzZDLCAweEI1QzZERDcxLCAweEJGRDJFNDk1LCAweEJEOENCQTQ0LCAweEJFNzdCMDQ2LCAweEJFNzhCMDQ3LCAweEJFNzdCMDQ2LCAweEJGNzhCMDQ3LCAweEJCNzlCMDQ2LCAweEIwQUZDRDU0LCAweEJGRDdFNkEzLCAweDk2QkJENzU0LCAweDNGQjNENDUyLCAweEE5QkREODU5LCAweEJGRDZFNkEyLCAweEI2QTJDNzRGLCAweEJFNzdCMDQ3LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEJGNzdCMTQ3LCAweEJGNzhCMTQ3LCAweEFCOTBCRjQ1LCAweEJEQ0JFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjRENDRFLCAweDA3REJFQkIzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzUzLCAweEJGRDdFNkEyLCAweEI4QUVEMDU2LCAweEJGNzdCMDQ3LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ3LCAweEFDOEFCQTQ0LCAweEJBQ0JERjgwLCAweEJGQ0VFMTg4LCAweDVBQjREMzRELCAweDA3RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZFLCAweDJCRDFFNDhFLCAweEFEQkZEOTVFLCAweEJGRDdFNkExLCAweEI2QTFDODRELCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEJGNzhCMTQ3LCAweEJGNzhCMDQ3LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ3LCAweEJFNzlCMTQ3LCAweEFCQjREMzUzLCAweEJGRDhFN0E0LCAweDlEQkNENzU3LCAweDFGQzhFMDg3LCAweDAwRkVGRUZELCAweDAwRkZGRkZGLCAweDA1RUVGNUQ4LCAweDZFQjZENDRBLCAweEJGRDFFMzkxLCAweEJFQzREQzc2LCAweEJBN0NCMzQ3LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ3LCAweEI4ODBCNTQ2LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCRTBFREI0LCAweDlDQkJENzUzLCAweEJGRDdFNkEyLCAweEI3QURDRjU2LCAweEJFNzhCMDQ3LCAweEJGNzhCMDQ3LCAweEJGNzdCMTQ2LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEE4OTNDMDQ0LCAweEJEQ0VFMThBLCAweEJCQ0FERjdELCAweDRCQjNENDUxLCAweDY0QjVENDRCLCAweEJFQ0VFMTg4LCAweEJGQzlERjdFLCAweEI5N0ZCNDQ1LCAweEJGNzdCMTQ3LCAweEJGNzdCMDQ3LCAweEJGNzhCMTQ3LCAweEJGNzhCMDQ2LCAweEJENzlCMTQ3LCAweEE4QUJDQzRELCAweEJGRDdFN0EyLCAweEEyQkREODVDLCAweDIwQkREQTcxLCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDNFNDk4LCAweEJBQkNENTZCLCAweEJDN0JCMTQ1LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEIyODdCNzQzLCAweEJCQ0FERjdELCAweEJGQ0ZFMjg5LCAweDU3QjRENDRGLCAweDA3RURGNUQ4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RDRFNjk0LCAweDlFQkJENzUzLCAweEJGRDdFNkEzLCAweEI0QTlDQTU1LCAweEJFNzhCMDQ3LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ2LCAweEJGNzhCMTQ3LCAweEJGNzdCMDQ3LCAweEE4OTZCRjQ0LCAweEJFRDFFMzkxLCAweEJBQzdERDc1LCAweDNCQjVENTU4LCAweDAyRkFGQ0Y1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkFCQ0NFNCwgMHg4RjBFNzZCNywgMHhCRjA2ODBCRiwgMHhCRjA2OTBDQiwgMHhCRjA1OTlENCwgMHhCRjAxOUFENCwgMHhCRjA0OUZENywgMHhCRjAyQTNEQiwgMHhCRjAyQTlFMSwgMHhCRjA3QURFNCwgMHhCRjBBQjRFOSwgMHhCRjBCQkJFRSwgMHhCRjE2QkZGMCwgMHhCRjEyQkRFRSwgMHhCRjBGQjhFQywgMHhCRjI3QjZFOSwgMHhCRjREQkZFRCwgMHhCRjRCQkNFOSwgMHhCRjA5QTJEOSwgMHhCRjQ2QjZFNSwgMHhCRjRCQjlFNiwgMHhCRjNBQjBFMCwgMHhCRjFDQTJENywgMHhCRDA0N0ZCRiwgMHg2QjI2ODBCQiwgMHgwNUQ3RTZGMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNDlBQkY4RSwgMHhCNDY4OUY0NSwgMHhCRjg0QjI0NywgMHhCRkEwQzQ0RCwgMHhCRkEyQzg0QSwgMHhCRkEyQzk0OCwgMHhCRkExQzk0OCwgMHhCRkEwQzk0OCwgMHhCRjlGQzk0NywgMHhCRjlEQzg0NywgMHhCRjlDQzg0NywgMHhCRjlCQzg0NywgMHhCRjk5Qzg0NywgMHhCRjk3Qzc0NiwgMHhCRjk2Qzc0NywgMHhCRjk0Qzc0NiwgMHhCRjkzQzY0NiwgMHhCRjkxQzY0NiwgMHhCRjlDQzg0NywgMHhCRkE5Q0I0NywgMHhCRkE3Qzk0NywgMHhCRjk1QzA0NiwgMHhCRjZEQUM0NCwgMHhCQzU3OUU0NCwgMHg1NzZCQUE2QiwgMHgwMUY2RkFGNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwN0U0RjBDNSwgMHg2MEI0RDQ0QywgMHhCRUNDRTE4MiwgMHhCRUNDRTA4QSwgMHhCNzMwOEM5RCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCNzBDNzhCMywgMHhBQkI3RDQ1RiwgMHhCRkQ3RTdBMywgMHg5NkJCRDc1MywgMHgwRUQ5RTlBQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQ0U1RjBDNywgMHg2RkI1RDQ0QSwgMHhCRUQwRTM4RSwgMHhCRkQzRTQ5NSwgMHhCQ0M5REY3OCwgMHhCQkM4REU3NywgMHhCQkM5REY3OCwgMHhCQkM4REU3OCwgMHhCQkM5REY3OCwgMHhCQkM4REU3NywgMHhCRkQxRTM4RiwgMHhCRkQ4RTdBNiwgMHhCODZDQUM3RiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhBNDU4QTI4MiwgMHhCRUNFRTI4OSwgMHhCRENDRTA4MiwgMHg0QkJBRDc1QywgMHgwMUZBRkRGNSwgMHgwMEZGRkZGRiwgMHgxMURCRUJCMSwgMHg3Q0I2RDQ0QSwgMHhCRkQ0RTU5NywgMHhCQkMwREE3NiwgMHhCQjEwN0FCMSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQzA1NzRCOCwgMHhBN0E1Q0I2MSwgMHhCRkQ3RTdBMywgMHhBM0JFRDk1QSwgMHgxN0Q3RThBNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOENDRTI4RiwgMHg4OEI3RDU0QiwgMHhCRkQ2RTY5RCwgMHhCQkFEQ0Y3NiwgMHhCQTA5NzZCNiwgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCMTFDODBBOSwgMHhCMUJCRDc2NiwgMHhCRkRDRUFCMywgMHhCOEFCQ0U3MiwgMHhCRTA0NzRCOCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhBRjFFODJBOSwgMHhCMkMwRDk2OCwgMHhCRkQ2RTY5RiwgMHg4MUI4RDU0RiwgMHgxOEMzREQ3QiwgMHg3QUI2RDQ0QSwgMHhCRkQzRTQ5NiwgMHhCREJFRDg3OSwgMHhCOTExN0JCMSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCMzE2N0VBRCwgMHhBRkJFRDk2NCwgMHhCRkQ3RTZBMCwgMHg4QUI5RDY1MCwgMHgwOUU0RjBDNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyM0NERTI4RSwgMHg5QUJCRDc1MiwgMHhCRkQ3RTdBMywgMHhCNzlCQzY3MiwgMHhCRjAwNzJCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBQjJEOEE5RSwgMHhCN0M2REQ3MSwgMHhCRkQ0RTU5OCwgMHg3MkI3RDU0RiwgMHgwNEVDRjRENSwgMHgwRUVDRjREMCwgMHg4OUI4RDU0RCwgMHhCRkQ2RTY5RiwgMHhCOEJBRDU2MiwgMHhCRDc2QUU0NiwgMHhCRjc3QjA0NywgMHhCRjc2QjA0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhBODk1QkY0NCwgMHhCRkQwRTI4RSwgMHhCQkM5REY3OSwgMHg0OUI2RDU1NiwgMHgwMkZCRkRGNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg0MEMzREM2QywgMHhCNkM2REQ3MSwgMHhCRkQzRTQ5NiwgMHhCNEFBQ0I0RCwgMHhCMEEwQzU0QiwgMHhCMEExQzU0QiwgMHhCMEEwQzU0QSwgMHhCMEExQzU0QiwgMHhBRkExQzU0QSwgMHhCNkJCRDY1QywgMHhCRkQ3RTZBMywgMHg5NkJCRDc1NSwgMHg0MEI0RDQ1MiwgMHhBOUJFRDk1QSwgMHhCRkQ3RTZBMiwgMHhCNkEzQzc0RiwgMHhCRjc2QjA0NywgMHhCRjc3QjE0NywgMHhCRjc2QjA0NywgMHhCRjc3QjE0OCwgMHhCRjc2QjA0NywgMHhBQjkwQkY0NSwgMHhCRUNDRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkI0RDQ0RiwgMHgwOERCRUJCNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCOEFFRDA1NiwgMHhCRjc3QjA0NywgMHhCRjc3QjE0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhBRDhBQkE0NCwgMHhCQkNCRTA4MCwgMHhCRkNGRTI4OCwgMHg1QkI0RDQ0RSwgMHgwOEVCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRSwgMHgzQ0MwREE2MiwgMHhCNEM0REI2QiwgMHhCRkQ1RTY5QywgMHhCNjkzQzA0OSwgMHhCRjc3QjA0NywgMHhCRjc2QjA0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhCRjc3QjE0NywgMHhCRjc2QjA0NywgMHhCRjc3QjE0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhBOUFBQ0M0RSwgMHhCRkQ3RTdBMiwgMHhBOUJGRDk1RiwgMHgyOEI3RDc2MSwgMHgwMEZERkVGQSwgMHgwMEZGRkZGRiwgMHgwNUVGRjZEOCwgMHg2RUI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REM3NiwgMHhCQTdDQjI0NywgMHhCRjc3QjE0NywgMHhCRjc2QjA0NywgMHhCRjc3QjA0NywgMHhCRjc2QjA0NywgMHhCOTdGQjQ0NywgMHhCNUMzREI2OSwgMHhCRkQ1RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0FEQ0Y1NiwgMHhCRTc3QjA0NywgMHhCRjc3QjE0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhBODkzQzA0NCwgMHhCRENFRTE4QiwgMHhCQ0NCRTA3RSwgMHg0Q0I0RDQ1MSwgMHg2NUI1RDQ0QywgMHhCRUNFRTE4OSwgMHhCRkNBREY3RiwgMHhCQTdFQjQ0NiwgMHhCRjc3QjE0NywgMHhCRjc2QjA0NywgMHhCRjc3QjA0NywgMHhCRjc2QjA0NywgMHhCRDc4QjE0NywgMHhBOEFCQ0Q0RSwgMHhCRkQ3RTdBMywgMHhBMkJFRDg1QywgMHgyMUJEREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUJDRDY2QiwgMHhCQzdBQjE0NiwgMHhCRjc3QjE0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhCRjc2QjA0NywgMHhCMzg3Qjc0MywgMHhCQkNBREY3RSwgMHhCRkNGRTI4QSwgMHg1N0I0RDQ1MCwgMHgwN0VERjVEOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEQ0RTY5NCwgMHg5RUJCRDc1MywgMHhCRkQ3RTZBMywgMHhCNEE5Q0E1NSwgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhCRjc3QjA0NywgMHhBOTk2QkY0NCwgMHhCRkQxRTM5MiwgMHhCQUM3REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEZBQkNERTQsIDB4N0MwRTc5QjksIDB4QkMwNjgwQkYsIDB4QkYwNDhGQ0MsIDB4QkYwMTlERDcsIDB4QkYwNEE0REMsIDB4QkYwM0E3REUsIDB4QkYwNEFCRTIsIDB4QkYwQkFFRTUsIDB4QkYxNkI1RTksIDB4QkYyOEJERUUsIDB4QkY0OEMzRjAsIDB4QkY1N0M2RjAsIDB4QkY1RkM3RjAsIDB4QkY1RkM1RjAsIDB4QkY1NUMxRUUsIDB4QkYxM0E3REQsIDB4QkYyOEFEREYsIDB4QkY0M0I3RTQsIDB4QkYzMEFFREYsIDB4QkYxNTk5RDEsIDB4QjYwMzdFQkUsIDB4NTkyMjgyQkQsIDB4MDVEN0U4RjMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJFN0VGRTQsIDB4Nzk2NTlDNEQsIDB4QkY3NEE2NDUsIDB4QkY4Q0I3NDgsIDB4QkY5QUMyNDksIDB4QkZBMkM4NDksIDB4QkZBM0M5NDgsIDB4QkZBMkM5NDgsIDB4QkZBMEM5NDcsIDB4QkY5RkM5NDcsIDB4QkY5REM4NDcsIDB4QkY5REM4NDcsIDB4QkY5QkM3NDYsIDB4QkY5QUM3NDYsIDB4QkY5OEM2NDYsIDB4QkY5N0M3NDcsIDB4QkY5NUM2NDYsIDB4QkY5NEM2NDYsIDB4QkY5RkM5NDYsIDB4QkZBQ0NENDgsIDB4QkZBOUNBNDYsIDB4QkY5RkM0NDYsIDB4QkY3NEFGNDMsIDB4QkY1RUEyNDQsIDB4N0U1QTlGNTYsIDB4MDZEQUVBREIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEZEOUVBQUUsIDB4NzZCNUQ0NDksIDB4QkZEMkU0OTMsIDB4QkRDMkRCNzksIDB4QjgxMzdDQUYsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QUQyMDgzQTYsIDB4QjRCRkQ5NkEsIDB4QkZENUU1OUQsIDB4N0ZCOEQ1NEYsIDB4MDdGMUY3REYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MERFNUYxQzcsIDB4NkNCNUQ0NEIsIDB4QkNDOERFNzYsIDB4QkVEMEUyOEUsIDB4QkZEMEUzOEUsIDB4QkZEMEUyOEUsIDB4QkZEMEUzOEUsIDB4QkVEMEUyOEUsIDB4QkZEMUUzOEUsIDB4QkZEMEUyOEUsIDB4QkZENUU1OUMsIDB4QkZEM0U0OTgsIDB4QjU0OTk5OEYsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTQ3NUIxNzIsIDB4QkVEM0U0OTgsIDB4QjhDNkRENzAsIDB4MzJDOUUwODAsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNDQ0UyOEYsIDB4OEZCOEQ1NEQsIDB4QkZEN0U2QTAsIDB4QjZBNENBNzUsIDB4QkQwNzc1QjcsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjMxMTdCQjAsIDB4QUVCOEQ1NjIsIDB4QkZENkU2QTIsIDB4OTBCQUQ3NTIsIDB4MENEQ0VDQjQsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkQsIDB4MjRDN0UwODMsIDB4OUJCQUQ2NTIsIDB4QkZEN0U3QTMsIDB4Qjc5N0MzNzIsIDB4QkYwMTcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QUEyRThCOUMsIDB4QjdDNkRENzEsIDB4QkZEQUU5QUYsIDB4QjY4OEJCN0EsIDB4QkUwMTcyQkEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTgzQzkyOTUsIDB4QkJDN0RENzYsIDB4QkZEMkU0OTMsIDB4NjdCNUQ0NEUsIDB4MUVDN0UwODQsIDB4OEZCOEQ1NEQsIDB4QkZENkU2QTAsIDB4QjdBQkNFNzAsIDB4QkUwNDc0QjksIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTkzMDhCOUIsIDB4QjhDNURDNzIsIDB4QkVEM0U0OTcsIDB4NzFCN0Q1NEYsIDB4MDNGN0ZBRUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGQ0ZERjgsIDB4MzJCOEQ3NUYsIDB4QThCRUQ5NUMsIDB4QkZEN0U2QTIsIDB4QjU3NUIxN0UsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTU0QzlCODksIDB4QkRDQkUwODEsIDB4QkVDRkUyOEEsIDB4NTdCOEQ2NTYsIDB4MDFGQ0ZFRjksIDB4MERFQkYzRDAsIDB4ODlCOEQ1NEQsIDB4QkZENUU2OUYsIDB4QjhCOUQ1NjIsIDB4QkQ3NUFENDUsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4QkY3NUIwNDcsIDB4QkY3NUFGNDYsIDB4QTc5NEJGNDQsIDB4QkZEMEUyOEUsIDB4QkJDOURFNzgsIDB4NDhCNUQ1NTYsIDB4MDJGQkZERjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4M0ZDMkRDNkMsIDB4QjVDNURDNkUsIDB4QkZEOUU4QTksIDB4QkZENkU2QTEsIDB4QkZENkU2QTAsIDB4QkZEN0U2QTEsIDB4QkZENkU2QTEsIDB4QkZENkU2QTEsIDB4QkZENkU2QTAsIDB4QkZEN0U3QTIsIDB4QkZEOEU3QTUsIDB4OTVCQUQ3NTQsIDB4M0ZCM0Q0NTIsIDB4QTlCREQ4NUEsIDB4QkZENkU2QTIsIDB4QjZBMkM3NEYsIDB4QkU3NUFGNDYsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4QkY3NUFGNDcsIDB4QkY3NUFGNDYsIDB4QUI4RkJFNDUsIDB4QkRDQkUwODEsIDB4QkVDRUUxODYsIDB4NTZCM0Q0NEUsIDB4MDhEQkVCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThFM0VFQkMsIDB4OUFCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjhBRUQwNTYsIDB4QkY3NUFGNDYsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDYsIDB4QUQ4OUJBNDQsIDB4QkJDQkUwODAsIDB4QkZDRUUyODgsIDB4NUFCNEQ0NEQsIDB4MDhFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4NEVCRURBNjAsIDB4QjlDOERFNzgsIDB4QkZEMUUzOTEsIDB4QkE4QUJBNDYsIDB4QkY3NUIwNDcsIDB4QkY3NUFGNDcsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDYsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4QkY3NkFGNDcsIDB4QkY3NUFGNDYsIDB4QkY3NkIwNDcsIDB4QUM5RUM2NDksIDB4QkZENUU1OUMsIDB4QjNDM0RCNjgsIDB4MzRCOEQ3NUUsIDB4MDBGQ0ZERkEsIDB4MDBGRkZGRkYsIDB4MDRFRUY1RDgsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERCNzYsIDB4QkE3QkIyNDcsIDB4QkY3NkIwNDcsIDB4QkY3NkFGNDcsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4Qjk3RkI0NDYsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ0NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJERkVEQjQsIDB4OURCQkQ3NTQsIDB4QkZEN0U2QTIsIDB4QjdBQ0NFNTYsIDB4QkU3NkFGNDYsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4QTg5MkMwNDQsIDB4QkRDRUUxOEIsIDB4QkJDQURGN0UsIDB4NEJCM0Q0NTEsIDB4NjVCNUQ1NEIsIDB4QkVDRUUxODksIDB4QkZDOURFN0UsIDB4Qjk3REIzNDUsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4QkY3NUIwNDcsIDB4QkY3NUFGNDYsIDB4QkQ3N0IwNDcsIDB4QThBQkNENEUsIDB4QkZEN0U3QTIsIDB4QTJCREQ4NUMsIDB4MjBCRERBNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFMkVFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZENEU0OTksIDB4QkFCQkQ1NkIsIDB4QkM3OEIwNDUsIDB4QkY3NkIwNDcsIDB4QkY3NkFGNDYsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4QjM4NkI3NDMsIDB4QkJDQURGN0UsIDB4QkZDRkUxODksIDB4NTdCNEQ0NEYsIDB4MDdFREY1RDksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTdENEU1OTQsIDB4OUVCQkQ3NTMsIDB4QkZEN0U2QTMsIDB4QjNBOENBNTUsIDB4QkU3NUFGNDYsIDB4QkY3NkIwNDcsIDB4QkY3NUFGNDcsIDB4QkY3NkFGNDcsIDB4QkY3NUFGNDYsIDB4QTk5NUJFNDMsIDB4QkZEMUUzOTIsIDB4QkFDN0RENzUsIDB4M0JCNUQ1NTgsIDB4MDJGQUZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA2RDZFOEYzLCAweDREM0I5M0M2LCAweEFCMDU3RUJFLCAweEJGMDY4QUM3LCAweEJGMDU5OEQyLCAweEJGMDNBM0RCLCAweEJGMDVBQ0UzLCAweEJGMEFCMkU4LCAweEJGMUVCOEVCLCAweEJGMzlCREVELCAweEJGNEFDMUVGLCAweEJGNEVDMUVGLCAweEJGNEJDMEVGLCAweEJGNDZCREVDLCAweEJGMjRBRkUzLCAweEJGMENBNERCLCAweEJGMkRBRkUwLCAweEJGMTk5RUQ1LCAweEJFMEQ4OUM2LCAweDk5MEM3RUJDLCAweDMyNjRBOEQxLCAweDAxRUJGM0Y5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDMxOUJCRThFLCAweEI4Njc5RDQ1LCAweEJGN0JBQjQ2LCAweEJGOEVCODQ4LCAweEJGOUFDMTQ5LCAweEJGQTJDODQ5LCAweEJGQTNDOTQ4LCAweEJGQTNDOTQ4LCAweEJGQTFDOTQ4LCAweEJGQTBDOTQ4LCAweEJGOUVDOTQ3LCAweEJGOURDODQ3LCAweEJGOUJDODQ3LCAweEJGOUFDODQ3LCAweEJGOThDNzQ2LCAweEJGOTdDNzQ3LCAweEJGOThDODQ2LCAweEJGQUNDRTRELCAweEJGQzNENzVGLCAweEJGQkRENDVBLCAweEJGQTVDNzQ2LCAweEJGN0VCNTQ0LCAweEJGNjRBNTQzLCAweDlFNTY5RDRDLCAweDEyREJFQURCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RDVFOEEzLCAweDhCQjhENTRDLCAweEJGRDZFNjlGLCAweEI3QUVEMDczLCAweEJFMDg3NkI3LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE3NDA5NDkxLCAweEJDQzlERjc5LCAweEJFRDFFMzkxLCAweDY1QjZENTRFLCAweDAyRjNGOEU2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRjJGOEUyLCAweDMyQkFEODYxLCAweDYxQjZENTRELCAweDY5QjZENDRDLCAweDY5QjZENTRELCAweDY5QjZENDRDLCAweDY5QjZENTRDLCAweDY5QjZENDRDLCAweDY5QjZENTRELCAweDgxQjZENDQ3LCAweEJFQ0RFMTgzLCAweEJEQ0RFMTg5LCAweEI5MkY4QjlELCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJEMDI3MkJBLCAweEE2OTRDMjY0LCAweEJGRDZFNkExLCAweEFDQzFEQTYyLCAweDIwQ0RFMjhELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDJBQzFEQzczLCAweEExQkNENzU1LCAweEJGRDhFN0E0LCAweEI3ODlCQjc3LCAweEJFMDI3M0JCLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEFCMkE4OUEwLCAweEI4QzJEQTZFLCAweEJGRDRFNTlBLCAweDc4QjdENTRGLCAweDA1RjJGOEUyLCAweDAwRkZGRkZGLCAweDAwRkFGQ0Y2LCAweDM0QjZENjU5LCAweEE5QkZEOTVELCAweEJGRDdFN0EzLCAweEI0NzNCMDdFLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE1NEU5Qzg4LCAweEJEQ0RFMTgzLCAweEJGRDhFN0E4LCAweEI3NkRBQzdGLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE0NTdBMTgzLCAweEJFQ0VFMTg4LCAweEJFQ0RFMTgyLCAweDRDQjdENjU2LCAweDJBQjRENTU4LCAweEEwQkNENzU1LCAweEJGRDhFN0E0LCAweEI2ODhCQjc5LCAweEJGMDI3M0JCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE0NEY5Qzg3LCAweEJFQ0RFMTgyLCAweEJFQ0VFMTg4LCAweDU2QjVENTUwLCAweDAxRjdGQkVGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRkNGREY3LCAweDQzQjdENjU3LCAweEI2QzREQzZBLCAweEJGRDRFNTlDLCAweEI3NUFBMzg2LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEEzNkFBQjc4LCAweEJGRDJFMzkyLCAweEJBQzlERjc4LCAweDNEQkNEOTYzLCAweDAxRkRGRUZCLCAweDBFRUNGNEQwLCAweDg5QjhENjRELCAweEJGRDZFNjlGLCAweEI4QjlENTYyLCAweEJENzRBRDQ1LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ2LCAweEE4OTRCRjQ1LCAweEJGRDBFMzhFLCAweEJCQzlERjc5LCAweDQ5QjZENTU1LCAweDAzRkJGREY2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIzQ0ZFNDkxLCAweDhDQjlENjRGLCAweEE3QkZEOTVFLCAweEE4QkZEOTVFLCAweEE3QkZEOTVFLCAweEE4QkZEOTVFLCAweEE3QkZEOTVFLCAweEE4QkZEOTVFLCAweEE3QkZEOTVELCAweEE4QkZEOTVFLCAweEE2QkVEODVCLCAweDY1QjVENDRFLCAweDM4QjNENDUzLCAweEE5QkVEODVBLCAweEJGRDdFNkEyLCAweEI2QTFDNzRGLCAweEJGNzRBRjQ2LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ3LCAweEJGNzVCMDQ3LCAweEJGNzRBRjQ3LCAweEFCOEZCRTQ1LCAweEJFQ0NFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjNENDRFLCAweDA4RENFQ0I0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzU0LCAweEJGRDdFNkEzLCAweEI4QUVDRjU2LCAweEJGNzRBRjQ3LCAweEJGNzVCMDQ3LCAweEJGNzRBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ2LCAweEFEODlCQTQ0LCAweEJCQ0JFMDgwLCAweEJGQ0ZFMjg4LCAweDVBQjRENDRFLCAweDA4RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkNGREY3LCAweDYxQkVEOTVDLCAweEJFQ0RFMTg1LCAweEJEQ0RFMTg1LCAweEI4ODRCNzQ1LCAweEJGNzVBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ3LCAweEJGNzVCMDQ3LCAweEJGNzRBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ3LCAweEJGNzVCMDQ3LCAweEE5OTlDMzQ2LCAweEJGRDJFNDkzLCAweEI5QzhERTc2LCAweDQ0QjZENjU2LCAweDAyRjFGN0UxLCAweDAwRkZGRkZGLCAweDA1RUZGNUQ4LCAweDZGQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQzc2LCAweEJBN0FCMTQ3LCAweEJGNzVBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzVCMDQ3LCAweEJGNzRBRjQ3LCAweEI5N0VCNDQ3LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI0LCAweDlEQkJENzU0LCAweEJGRDdFN0EzLCAweEI3QURDRTU2LCAweEJFNzVBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ3LCAweEE4OTJCRjQ0LCAweEJEQ0VFMThCLCAweEJCQ0FERjdFLCAweDRCQjNENDUxLCAweDY1QjVENTRDLCAweEJFQ0ZFMTg5LCAweEJGQ0FERjdFLCAweEI5N0NCMzQ2LCAweEJGNzVCMDQ3LCAweEJGNzRBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ3LCAweEJENzZCMDQ3LCAweEE5QUJDRDRFLCAweEJGRDdFN0EyLCAweEEyQkVEODVDLCAweDIxQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTNFRUI3LCAweDdGQjhENTRELCAweEJGRDRFNTk5LCAweEJBQkNENjZCLCAweEJDNzhCMDQ2LCAweEJGNzVCMDQ4LCAweEJGNzVBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ2LCAweEIzODZCNzQzLCAweEJCQ0JERjdFLCAweEJGQ0ZFMjg5LCAweDU3QjRENDRGLCAweDA3RURGNUQ5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RDRFNjk0LCAweDlFQkJENzUzLCAweEJGRDhFN0EzLCAweEI0QThDQTU1LCAweEJFNzVBRjQ3LCAweEJGNzVBRjQ3LCAweEJGNzRBRjQ3LCAweEJGNzRBRjQ3LCAweEJGNzRBRjQ3LCAweEE5OTVCRTQ0LCAweEJGRDFFMzkyLCAweEJBQzdERTc1LCAweDNCQjVENTU4LCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZBRkNGRCwgMHgxOEIxRDRFOSwgMHg2NzNDOTlDQSwgMHhBQTA1ODRDMiwgMHhCRDA1OERDOSwgMHhCRjAzOTdEMiwgMHhCRjA0QTBEOSwgMHhCRjA2QThFMCwgMHhCRjA1QUVFNCwgMHhCRjBGQjJFNywgMHhCRjE3QjJFNiwgMHhCRjFFQjJFNiwgMHhCRjFCQUJFMCwgMHhCRjA2OUNENSwgMHhCRjA3OTVEMCwgMHhCQjA3OEJDOCwgMHg5RDBGODRDMSwgMHg1MTU3QTREMCwgMHgwQkNFRTRGMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQkRFRUFEQSwgMHg5NjYzOUE0QiwgMHhCRjZEQTA0NSwgMHhCRjdEQUI0NiwgMHhCRjhBQjU0NywgMHhCRjk0QkQ0OCwgMHhCRjlDQzM0QSwgMHhCRjlGQzY0OSwgMHhCRkExQzg0OSwgMHhCRkEwQzg0OCwgMHhCRkEwQzk0OCwgMHhCRjlFQzg0NywgMHhCRjlEQzg0NywgMHhCRjlCQzc0NywgMHhCRjlCQzg0NywgMHhCRjlBQzc0NiwgMHhCRkEzQ0E0NiwgMHhCRkFGQ0Q0OCwgMHhCRkM2RDg2MiwgMHhCRkMxRDY1RCwgMHhCRkFFQ0I0QSwgMHhCRjg4Qjk0NCwgMHhCRjZCQTk0NCwgMHhCMTU1OUE0MywgMHgyQkE4Q0NBNywgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNkJGREI3MCwgMHg5Q0JBRDY1MiwgMHhCRkQ4RTdBNCwgMHhCNzhFQkU3OCwgMHhCRTAyNzNCQSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMzU2QTA4MiwgMHhCRUNGRTI4QiwgMHhCRENCRTA4MCwgMHg0OUMxREI2QiwgMHgwMEZDRkRGQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY2RjlFQiwgMHgwQUYyRjdFMSwgMHgwQUYxRjdFMCwgMHgwQUYyRjdFMCwgMHgwQUYxRjdFMCwgMHgwQUYyRjdFMCwgMHgwQUYxRjdFMCwgMHgxN0NCRTI4QywgMHg3NkI1RDQ0OSwgMHhCRkQyRTQ5MiwgMHhCQkJFRDg3RCwgMHhCODE4N0VBQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCNzBCNzdCMywgMHhBQUE4Q0M2NCwgMHhCRkQ3RTZBMywgMHg5QkJDRDg1NywgMHgxMkUzRUZCRiwgMHgwMEZGRkZGRiwgMHgwMEY4RkJGMSwgMHgzOUJCRDg2MiwgMHhBRUMxREE2MiwgMHhCRkQ3RTZBMCwgMHhCNTY5QUE4MCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNTQ1OTY4RCwgMHhCQ0NCRTA3RSwgMHhCRUNGRTI4QiwgMHg1REI2RDU1MSwgMHgwMUYzRjhFNiwgMHgwMEZGRkZGRiwgMHgwMUZBRkNGNiwgMHg0NEI2RDY1NiwgMHhCNUM0REI2QSwgMHhCRkQ1RTU5QiwgMHhCNzU2QTA4NywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMzZCQUI3NiwgMHhCRkQzRTQ5NSwgMHhCRkQ0RTU5QSwgMHhCNTQ5OTk4RiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhBNDc0QjE3MywgMHhCRUQzRTQ5OCwgMHhCOEM2REQ3MCwgMHgzM0M2REU3QiwgMHgzOEJCRDk2NCwgMHhBRkMwRDk2MSwgMHhCRkQ3RTZBMSwgMHhCNjZDQUM3RSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMzY4QUE3OCwgMHhCRkQyRTM5MywgMHhCQUM3REQ3NiwgMHgzQkM1REU3NiwgMHgwMEZERkVGQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUU3RjJDQywgMHg1OEI0RDQ0RCwgMHhCQkNBREY3QywgMHhCRkQwRTI4RSwgMHhCNTM3OEY5OSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRTAwNzFCQiwgMHhBMzg2QkE2QSwgMHhCRkQ1RTU5RSwgMHhCMkMyREI2NywgMHgyNkQwRTQ5MiwgMHgwMEZGRkZGRiwgMHgwREVDRjNEMCwgMHg4OUI4RDU0RCwgMHhCRkQ1RTU5RSwgMHhCOEI5RDU2MiwgMHhCRDczQUM0NSwgMHhCRjc0QUY0NywgMHhCRjczQUU0NiwgMHhCRjc0QUY0NywgMHhCRjczQUU0NiwgMHhBNzkzQkU0NCwgMHhCRUQwRTI4RSwgMHhCQkM5REY3OSwgMHg0OEI1RDU1NSwgMHgwMkZCRkRGNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkY1RjlFQSwgMHgxQUMyREQ3QiwgMHgyN0JCRDk2QiwgMHgyOEJDRDk2QywgMHgyN0JCRDk2QiwgMHgyOEJCRDk2QywgMHgyN0JCRDg2QiwgMHgyOEJCRDk2QywgMHgyN0JCRDk2QiwgMHgyOEJCRDk2QywgMHgyNUJCRDg2QiwgMHgxNkMyREQ3QywgMHgyOENFRTM4QiwgMHhBOUJERDg1QSwgMHhCRkQ2RTZBMSwgMHhCNkExQzY0RiwgMHhCRTczQUU0NiwgMHhCRjczQUU0NywgMHhCRjczQUU0NiwgMHhCRjczQUY0NywgMHhCRjczQUU0NywgMHhBQjhFQkQ0NSwgMHhCRENCRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkI0RDQ0RSwgMHgwN0RCRUJCMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJBRDc1MywgMHhCRkQ3RTZBMywgMHhCOEFEQ0Y1NiwgMHhCRjczQUU0NywgMHhCRjc0QUY0NywgMHhCRjczQUU0NiwgMHhCRjc0QUY0NywgMHhCRjczQUU0NiwgMHhBQzg4Qjk0NCwgMHhCQUNCREY4MCwgMHhCRkNFRTE4OCwgMHg1QUI0RDQ0RCwgMHgwN0VCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkVFRjVENiwgMHg3MkI2RDU0OSwgMHhCRkQxRTM5MSwgMHhCREM1REM3NywgMHhCODdCQjI0NiwgMHhCRjc0QUY0NywgMHhCRjczQUU0NywgMHhCRjc0QUY0NywgMHhCRjczQUU0NywgMHhCRjczQUY0NywgMHhCRjczQUU0NiwgMHhCRjc0QUY0NywgMHhCRjczQUU0NiwgMHhCRjczQUU0NywgMHhBQThFQkQ0NiwgMHhCRUNFRTE4NywgMHhCQ0NDRTA4MywgMHg1NEI0RDQ0RiwgMHgwNEU2RjFDQSwgMHgwMEZGRkZGRiwgMHgwNUVFRjVEOCwgMHg2RUI2RDQ0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REI3NiwgMHhCQTc5QjE0NywgMHhCRjczQUU0NywgMHhCRjczQUU0NiwgMHhCRjc0QUY0NywgMHhCRjczQUU0NywgMHhCODdDQjM0NiwgMHhCNUMyREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkUwRURCNCwgMHg5Q0JBRDc1MywgMHhCRkQ2RTZBMiwgMHhCN0FEQ0U1NiwgMHhCRTc0QUU0NiwgMHhCRjczQUU0NywgMHhCRjczQUU0NiwgMHhCRjc0QUY0NywgMHhCRjczQUU0NywgMHhBODkxQkY0NCwgMHhCRENFRTE4QSwgMHhCQkNCREY3RCwgMHg0QkIzRDQ1MSwgMHg2NEI1RDQ0QiwgMHhCRUNFRTE4OCwgMHhCRkM5REY3RSwgMHhCOTdCQjI0NiwgMHhCRjczQUY0NywgMHhCRjczQUU0NiwgMHhCRjc0QUY0NywgMHhCRjczQUU0NywgMHhCRDc1QjA0NywgMHhBOEFCQ0Q0RSwgMHhCRkQ3RTZBMiwgMHhBMkJFRDg1QywgMHgyMEJEREE3MSwgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQzRTQ5OSwgMHhCQUJDRDY2QiwgMHhCQzc3QjA0NSwgMHhCRjczQUY0NywgMHhCRjczQUU0NiwgMHhCRjczQUY0NywgMHhCRjczQUU0NywgMHhCMjg0QjY0MywgMHhCQkNBREY3RSwgMHhCRkNGRTI4QSwgMHg1N0I0RDQ0RiwgMHgwN0VERjVEOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEQ0RTY5NCwgMHg5RUJCRDc1MywgMHhCRkQ3RTZBMiwgMHhCNEE4Qzk1NSwgMHhCRTczQUU0NiwgMHhCRjczQUY0NywgMHhCRjczQUU0NiwgMHhCRjc0QUY0NywgMHhCRjczQUU0NiwgMHhBODk0QkU0MywgMHhCRUQxRTM5MSwgMHhCQUM3REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZBRkNGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGQ0ZERkUsIDB4MTNCMkQ2RUEsIDB4NDU1RUFCRDQsIDB4N0UxQjhDQzYsIDB4QTMwNjg4QzUsIDB4QjUwMzhFQ0EsIDB4QjkwNzkxQ0MsIDB4QkMwNzk0Q0UsIDB4QkIwODkzQ0UsIDB4QjkwNzkwQ0MsIDB4QjIwNjhCQzcsIDB4OUIwQTg3QzQsIDB4NzAyNThFQzYsIDB4Mzc3NEI0RDksIDB4MEFEMkU3RjMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGN0ZBRjYsIDB4NjU3REFCNkMsIDB4QkU1Rjk3NDQsIDB4QkY2QjlFNDUsIDB4QkY3NkE2NDUsIDB4QkY4MEFENDcsIDB4QkY4OEI0NDcsIDB4QkY4RkI5NDcsIDB4QkY5M0JDNDcsIDB4QkY5N0MwNDgsIDB4QkY5OEMxNDgsIDB4QkY5OUMzNDgsIDB4QkY5OUM0NDgsIDB4QkY5QUM2NDgsIDB4QkY5RUM3NDcsIDB4QkZBN0NCNDcsIDB4QkZBRkNENDgsIDB4QkZCMkNFNDcsIDB4QkZCMENENDcsIDB4QkZBRkNENDgsIDB4QkZBM0M2NDUsIDB4QkY4OUJBNDQsIDB4QkY2RkFCNDMsIDB4QkM1QjlFNDQsIDB4NTA3NkFFNzIsIDB4MDFGNkZBRjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkMsIDB4MzVCRkRCNkMsIDB4QUJCRkQ5NUUsIDB4QkZEOEU3QTIsIDB4Qjc3M0IwN0MsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMTcyQkMsIDB4QTQ3QkI0NkUsIDB4QkZENUU1OTksIDB4QjZDNkRDNkYsIDB4MzNDM0RENzUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlEMEU1OTgsIDB4OEFCN0Q1NEMsIDB4QkZENkU2OUYsIDB4QkFBRkQwNzMsIDB4QkMwNjc1QjgsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QjIxQjgwQTksIDB4QjFDMEQ5NjUsIDB4QkZENkU2OUYsIDB4ODdCOEQ2NEYsIDB4MDhFMkVGQzEsIDB4MDBGRkZGRkYsIDB4MDNGMkY4RTMsIDB4NERCNUQ0NEYsIDB4QjdDNkRENzEsIDB4QkZENEU1OTgsIDB4Qjc0OTk5OEUsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QTQ2MEE2N0MsIDB4QkZEMUUzOTAsIDB4QkNDQURGN0IsIDB4NDNDMkRDNkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDVFN0YyQ0QsIDB4NTlCNUQ1NEUsIDB4QkJDQURGN0QsIDB4QkZEMEUzOEUsIDB4QjQzNjhGOTksIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMTcyQkMsIDB4QTM4OEJCNkEsIDB4QkZEOEU4QTUsIDB4QkRDRUUxOEEsIDB4QjkzMDhDOUMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkMwMzczQjksIDB4QTY5M0MyNjUsIDB4QkZEN0U2QTEsIDB4QUNDMURBNjIsIDB4MjRCOUQ3NjQsIDB4NERCNkQ2NTMsIDB4QjdDNkRENzEsIDB4QkZEM0U0OTcsIDB4QjQ0OTk5OEUsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMTcyQkIsIDB4QTU4QkJENjcsIDB4QkZENkU2OUYsIDB4QjBDMkRBNjYsIDB4MjdDOEUwODEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MENFM0YwQzMsIDB4NkVCNUQ0NEEsIDB4QkVEMEUzOEUsIDB4QkNDOURFN0UsIDB4QkExRTgyQTgsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkIwNDczQjksIDB4QThBN0NDNjAsIDB4QkZEN0U3QTMsIDB4QTNCRUQ5NUEsIDB4MTdEMUU1OUEsIDB4MDBGRkZGRkYsIDB4MEVFQ0Y0RDEsIDB4ODlCOEQ1NEQsIDB4QkZENkU2OUYsIDB4QjhCOUQ1NjIsIDB4QkQ3MkFDNDUsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FGNDcsIDB4QkY3MkFFNDcsIDB4QTg5M0JFNDQsIDB4QkZEMEUyOEUsIDB4QkJDOURGNzksIDB4NDlCNkQ1NTYsIDB4MDJGQkZERjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkUsIDB4MDFGRkZGRkYsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkUsIDB4MDFGRkZGRkYsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MjdEOEU4QTEsIDB4QTlCRUQ4NUEsIDB4QkZENkU2QTIsIDB4QjZBMUM3NEYsIDB4QkY3MkFFNDYsIDB4QkY3MkFFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QUI4RUJFNDUsIDB4QkVDQ0UwODEsIDB4QkVDRUUyODcsIDB4NTZCNEQ0NEYsIDB4MDhEQkVCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTMsIDB4QkZEN0U3QTMsIDB4QjhBRENGNTYsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FGNDcsIDB4QkY3MkFFNDYsIDB4QUQ4N0I5NDQsIDB4QkJDQkUwODAsIDB4QkZDRkUxODgsIDB4NUJCNEQ0NEUsIDB4MDhFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MENFRUY1RDYsIDB4ODRCOEQ1NEIsIDB4QkZENUU1OUMsIDB4QkNCRUQ4NjksIDB4QkM3NUFGNDYsIDB4QkY3M0FGNDcsIDB4QkY3MkFFNDYsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QjA4NUI3NDUsIDB4QkJDQURGN0MsIDB4QkVEMUUzOEUsIDB4NjNCNUQ1NEUsIDB4MDlFNkYxQ0EsIDB4MDBGRkZGRkYsIDB4MDVFRkY2RDgsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERDNzYsIDB4QkE3OUIxNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FGNDcsIDB4QkY3MkFFNDcsIDB4Qjk3Q0IzNDcsIDB4QjVDM0RCNjksIDB4QkZENUU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjQsIDB4OURCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjdBQ0NFNTcsIDB4QkU3M0FFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QTg5MUJGNDQsIDB4QkRDRUUyOEEsIDB4QkNDQkUwN0UsIDB4NENCNEQ0NTEsIDB4NjVCNkQ1NEMsIDB4QkVDRUUxODksIDB4QkZDQURGN0YsIDB4QkE3QkIyNDYsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkQ3NEFGNDcsIDB4QThBQkNENEUsIDB4QkZEN0U3QTMsIDB4QTJCRUQ4NUMsIDB4MjFCRERCNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEFFM0VFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZENEU0OTksIDB4QkFCQ0Q2NkIsIDB4QkM3NkFGNDYsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QjM4NEI2NDMsIDB4QkJDQURGN0UsIDB4QkZDRkUyOEEsIDB4NTdCNEQ0NTAsIDB4MDdFREY1RDksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENEU2OTQsIDB4OUVCQkQ3NTMsIDB4QkZEN0U3QTMsIDB4QjRBOENBNTUsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QkY3M0FFNDcsIDB4QkY3MkFFNDcsIDB4QTk5NEJFNDQsIDB4QkZEMUUzOTIsIDB4QkFDOERFNzUsIDB4M0JCNUQ1NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZFLCAweDAxRjFGOEZCLCAweDA4QkNEQ0VELCAweDE4NzlCQURDLCAweDI3NjRCMEQ3LCAweDMwNjZCMkQ5LCAweDJFNjVCMkQ4LCAweDI0NjRCMEQ4LCAweDEzOTBDNUUyLCAweDA2QzRERkVGLCAweDAwRkJGREZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBEQzhEQkMxLCAweDY4NjM5QTRGLCAweDhCNjU5QjRGLCAweEE0NjA5ODQ1LCAweEI0NjU5QjQ0LCAweEJCNkNBMDQ1LCAweEJFNzJBNDQ1LCAweEJGNzdBODQ1LCAweEJGN0NBQzQ1LCAweEJGODJCMDQ2LCAweEJGODRCMzQ1LCAweEJGODhCNjQ2LCAweEJGODlCODQ1LCAweEJGOEVCQjQ2LCAweEJGOTdCRjQ1LCAweEJGOUJDMjQ2LCAweEJGOUNDMzQ1LCAweEJGOUJDMzQ1LCAweEJGOTVDMTQ0LCAweEJGOENCRDQ0LCAweEJGN0ZCNTQzLCAweEJGNzJBRDQ0LCAweEJFNjBBMTQzLCAweDc2NUM5RjU0LCAweDA0RDlFOUQ5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRjBGNkRGLCAweDQ4QjRENDUwLCAweEI1QzREQzZELCAweEJGRDVFNTlCLCAweEI1NTA5QzhCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJDMDQ3NEI5LCAweEE1OTFDMDY2LCAweEJGRDdFNkExLCAweEFBQzBEOTYwLCAweDIwRDZFOEEyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZELCAweDI1QzdERjgyLCAweDlEQkJENzUzLCAweEJGRDhFN0E0LCAweEI1OTFDMDc1LCAweEJGMDE3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE5MzE4QzlBLCAweEI4QzdERDczLCAweEJFRDJFNDk1LCAweDZFQjhENjUxLCAweDAzRjRGOUU3LCAweDAwRkZGRkZGLCAweDA3RTdGMUNDLCAweDYxQjVENDRELCAweEJFQ0NFMDgyLCAweEJFQ0NFMDhBLCAweEI3MkY4QjlDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJFMDE3MkJCLCAweEEzODNCODZBLCAweEJGRDVFNTlDLCAweEIzQzNEQjZBLCAweDJEQzNERDc1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBCRTJFRkMxLCAweDcwQjZENTRBLCAweEJFRDBFMjhFLCAweEJEQzhERTdELCAweEJBMUI4MEE4LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJCMDU3NEI5LCAweEE4QThDQzVGLCAweEJGREFFOUFFLCAweEJDQkZEOTdELCAweEI3MTg3RkFDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEI4MEI3N0I0LCAweEFBQTdDQzY0LCAweEJGRDdFNkEzLCAweDlDQkNEODU3LCAweDFBQ0RFMzkxLCAweDYxQjVENDRCLCAweEJDQ0NFMDgyLCAweEJFQ0VFMTg5LCAweEI4MkY4QjlCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEI5MDg3NkI2LCAweEE3OUZDNzYzLCAweEJGRDhFN0E0LCAweEExQkREODVBLCAweDE3REJFQkFELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE0RDBFNDk3LCAweDgzQjZENTRBLCAweEJGRDRFNTlBLCAweEI5QjNEMjc5LCAweEJCMEU3QUIyLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEIyMTQ3Q0FFLCAweEFGQjNEMjY1LCAweEJGRDdFNkEyLCAweDhGQkFENzUzLCAweDBDRUFGM0NGLCAweDAwRkZGRkZGLCAweDBERUJGM0QwLCAweDg5QjhENTRELCAweEJGRDVFNTlGLCAweEI4QjlENTYxLCAweEJENzFBQjQ1LCAweEJGNzJBRTQ3LCAweEJGNzFBRDQ2LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ2LCAweEE3OTNCRTQ0LCAweEJGRDBFMjhFLCAweEJCQzlERTc4LCAweDQ4QjVENTU1LCAweDAyRkJGREY2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI2RDhFOEExLCAweEE5QkREODU5LCAweEJGRDZFNkEyLCAweEI2QTFDNjRGLCAweEJFNzFBRDQ2LCAweEJGNzJBRTQ3LCAweEJGNzFBRDQ3LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ2LCAweEFCOENCRDQ1LCAweEJEQ0NFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjNENDRFLCAweDA4REJFQkIzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RTNFRUJDLCAweDlBQkJENzUzLCAweEJGRDdFN0EzLCAweEI4QURDRjU2LCAweEJGNzFBRDQ2LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ2LCAweEJGNzFBRDQ3LCAweEJGNzFBRDQ2LCAweEFEODdCOTQ0LCAweEJCQ0JERjgwLCAweEJGQ0VFMTg4LCAweDVBQjRENDRELCAweDA4RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEzRTRFRkJFLCAweDk1QjlENjUwLCAweEJGRDZFNkExLCAweEI2QjVEMzVFLCAweEJFNzJBRDQ2LCAweEJGNzJBRTQ3LCAweEJGNzFBRDQ2LCAweEJGNzFBRDQ3LCAweEJGNzFBRDQ2LCAweEJCNzNBRTQ3LCAweEJGNzFBRDQ2LCAweEJGNzFBRDQ3LCAweEJGNzFBRDQ2LCAweEJGNzFBRTQ3LCAweEIyN0ZCNTQ2LCAweEI2QzVERDZGLCAweEJGRDRFNDk4LCAweDc1QjZENTRELCAweDBEREJFQkI0LCAweDAwRkZGRkZGLCAweDA0RUVGNUQ4LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQjc2LCAweEJBNzdCMDQ3LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ2LCAweEJGNzFBRDQ3LCAweEJGNzFBRDQ3LCAweEI5N0JCMjQ3LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENDRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCRTBFREI0LCAweDlEQkJENzU0LCAweEJGRDdFNkEzLCAweEI3QUNDRTU2LCAweEJFNzFBRDQ2LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ2LCAweEJGNzFBRDQ3LCAweEJGNzFBRDQ2LCAweEE4OTFCRjQ0LCAweEJEQ0VFMThBLCAweEJCQ0FERjdELCAweDRCQjNENDUwLCAweDY1QjVENTRCLCAweEJFQ0VFMTg5LCAweEJGQzlERTdFLCAweEI5NzlCMTQ1LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ3LCAweEJGNzFBRDQ3LCAweEJGNzFBRDQ2LCAweEJENzNBRTQ3LCAweEE4QUJDRDRFLCAweEJGRDdFN0EyLCAweEEyQkVEODVDLCAweDIwQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTJFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNDk5LCAweEJBQkJENTZCLCAweEJDNzRBRTQ1LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ3LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ2LCAweEIzODNCNTQzLCAweEJCQ0FERjdFLCAweEJGQ0ZFMjg5LCAweDU3QjRENDRGLCAweDA3RURGNUQ4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE3RDRFNTkzLCAweDlFQkJENzUzLCAweEJGRDdFN0EzLCAweEIzQThDOTU1LCAweEJFNzFBRDQ2LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ2LCAweEJGNzFBRTQ3LCAweEJGNzFBRDQ2LCAweEE5OTRCRTQ0LCAweEJGRDFFMzkxLCAweEJBQzdERDc0LCAweDNCQjVENTU4LCAweDAyRkFGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkVGRCwgMHgwMUZCRkNGQSwgMHgwMkZBRkNGOSwgMHgwOUQwRTFDQSwgMHgxN0NCRERDNCwgMHgyRjlFQzE5MSwgMHg0QjkzQkE4MywgMHg2OTg0QjE3MSwgMHg4NzY2OUQ0QiwgMHhBMzY5QTA0QSwgMHhCMzY3OUY0NCwgMHhCQzZCQTI0NCwgMHhCRTZGQTU0NCwgMHhCRjczQTk0NSwgMHhCRjc2QUI0NCwgMHhCRjc5QUU0NSwgMHhCRjdCQjA0NCwgMHhCRjdEQjI0NCwgMHhCRjdDQjE0NCwgMHhCRjc5QjA0NCwgMHhCRjcwQUI0NCwgMHhCRjYzQTI0MywgMHg5NjUyOTg0NSwgMHgwRkQ0RTZEMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkVGRjZERCwgMHg1Q0I1RDU0RCwgMHhCRENCREY3RSwgMHhCRUNGRTI4RSwgMHhCODM2OEY5NywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCQTBDNzhCNSwgMHhBOUFFRDA2MCwgMHhCRkQ4RTdBNCwgMHg5QUJCRDc1NSwgMHgxMURERUNCNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZDRkRGQSwgMHgzNUI4RDc1RSwgMHhBQkJGRDk1RSwgMHhCRkQ3RTdBMywgMHhCNjcwQUY3RSwgMHhCRjAxNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNTUyOUU4NSwgMHhCRUNERTE4NCwgMHhCRENERTE4NywgMHg1M0I3RDY1NCwgMHgwMUZCRkNGNiwgMHgwMEZGRkZGRiwgMHgwRkQ3RThBOCwgMHg3N0I2RDU0QSwgMHhCRkQyRTQ5MywgMHhCRUMxREE3QiwgMHhCNzEzN0NBRiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCQzA2NzVCOSwgMHhBNjk4QzQ2NiwgMHhCRkQ4RTdBMywgMHhBNkJFRDg1RCwgMHgxQkRDRUJBRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNEQwRTQ5OCwgMHg4NEI4RDU0QywgMHhCRkQ1RTU5QiwgMHhCOUIzRDI3OCwgMHhCQTBFNzlCMiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCMjE1N0RBRSwgMHhCMEI0RDM2NSwgMHhCRkRDRUFCMywgMHhCQUIxRDE3MSwgMHhCRDA1NzRCOSwgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCMjFBODBBQSwgMHhCMEMwREE2NCwgMHhCRkQ2RTY5RiwgMHg4N0I4RDY1MCwgMHgxN0JCRDk2QywgMHg3NkI2RDU0QSwgMHhCRkQxRTM5MiwgMHhCQ0JGRDk3RSwgMHhCODE4N0VBQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCNTE1N0RBRSwgMHhBRUI4RDU2MiwgMHhCRkQ3RTdBMiwgMHg4RUI5RDY1MiwgMHgwQ0UyRUZCRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyMUM5RTE4NywgMHg5NUI5RDY1MCwgMHhCRkQ4RTdBMiwgMHhCOTlEQzc3MywgMHhCRDAzNzNCQSwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBQzJCODk5RiwgMHhCN0M0REM2RSwgMHhCRkQ0RTU5QSwgMHg3OEI3RDU0RSwgMHgwNUVBRjNEMywgMHgwMEZGRkZGRiwgMHgwRUVDRjREMCwgMHg4OUI4RDY0RCwgMHhCRkQ1RTY5RiwgMHhCOEI5RDU2MiwgMHhCRDcwQUI0NSwgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NiwgMHhBODkyQkU0NCwgMHhCRkQwRTI4RSwgMHhCQkM5REY3OSwgMHg0OUI1RDU1NiwgMHgwM0ZCRkRGNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNkQ4RThBMSwgMHhBOUJERDg1QSwgMHhCRkQ3RTZBMiwgMHhCNkEwQzY0RiwgMHhCRjcwQUM0NiwgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcwQUQ0NywgMHhBQjhDQkQ0NSwgMHhCRUNDRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkIzRDQ0RSwgMHgwOERCRUJCNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCOEFEQ0Y1NiwgMHhCRjcwQUQ0NiwgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcxQUQ0NywgMHhCRjcwQUM0NiwgMHhBRDg2Qjk0NCwgMHhCQkNCRTA4MSwgMHhCRkNFRTI4OCwgMHg1QUI0RDQ0RCwgMHgwOEVCRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxRkQ0RTY5OCwgMHhBMUJDRDg1NiwgMHhCRkQ4RTdBMywgMHhCOEE3Q0I1NiwgMHhCRTcwQUQ0NiwgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcxQUQ0NywgMHhCRTcxQUQ0NywgMHg5Qzc2QUY0QSwgMHhCRjcwQUQ0NywgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcxQUQ0NywgMHhCNDc5QjE0NywgMHhCNUJFRDg2MywgMHhCRkQ2RTY5RiwgMHg4NkI4RDY1MCwgMHgxMkNCRTI5MCwgMHgwMEZGRkZGRiwgMHgwNUVFRjVEOCwgMHg2RkI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REM3NiwgMHhCQTc3QjA0NywgMHhCRjcwQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcwQUM0NiwgMHhCOTdBQjI0NywgMHhCNUMzREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0FDQ0U1NywgMHhCRTcxQUQ0NywgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NiwgMHhCRjcwQUQ0NywgMHhCRjcwQUQ0NiwgMHhBODkxQkY0NSwgMHhCRENGRTI4QiwgMHhCQkNBRTA3RSwgMHg0QkI0RDQ1MSwgMHg2NUI1RDU0QiwgMHhCRUNFRTE4OSwgMHhCRkM5REY3RSwgMHhCOTc5QjI0NiwgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcwQUM0NywgMHhCRDcyQUU0NywgMHhBOUFCQ0Q0RSwgMHhCRkQ3RTdBMywgMHhBMkJFRDg1QywgMHgyMUJEREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUJCRDY2QiwgMHhCQzc0QUU0NSwgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcwQUQ0NiwgMHhCMzgzQjU0MywgMHhCQkNCREY3RSwgMHhCRkNGRTI4OSwgMHg1N0I0RDQ0RiwgMHgwN0VERjVEOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEQ0RTY5NCwgMHg5RUJCRDc1MywgMHhCRkQ3RTdBMywgMHhCNEE4Qzk1NSwgMHhCRTcwQUQ0NiwgMHhCRjcxQUQ0NywgMHhCRjcwQUQ0NywgMHhCRjcxQUQ0NywgMHhCRjcwQUM0NiwgMHhBOTk0QkU0NCwgMHhCRkQxRTM5MiwgMHhCQUM4REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGQ0ZERkMsIDB4MDJGNkY5RjUsIDB4MDdFQkYyRTksIDB4MTZDMkQ4QkIsIDB4MkNBN0M4OUQsIDB4NEE4N0I1N0EsIDB4Njc3OEFCNjgsIDB4ODQ1QzlBNDcsIDB4OUY1RTlCNDQsIDB4QjA1RjlENDMsIDB4QkI2MkEwNDMsIDB4QkU2NEExNDMsIDB4QkY2NUEyNDMsIDB4QkY1RTlGNDMsIDB4QUY1NTk5NDUsIDB4MjVBQ0NEQTksIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MENENkU4QTcsIDB4NzFCNUQ0NEEsIDB4QkVEMEUyOEUsIDB4QkRDNERCN0YsIDB4QjYxQjgwQTksIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjAxQTgwQUEsIDB4QjFCRUQ4NjUsIDB4QkZEN0U2QTAsIDB4ODRCOEQ1NEYsIDB4MDhFNEYwQzUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGNkZBRUMsIDB4NDdCN0Q2NTcsIDB4QjZDNERDNkMsIDB4QkZENUU1OUEsIDB4QjU1MzlFODksIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTI2Q0FDNzYsIDB4QkZEMkU0OTUsIDB4QjlDN0RENzQsIDB4MzhDNURENzYsIDB4MDBGREZFRkIsIDB4MDBGRkZGRkYsIDB4MThDRkU0OTYsIDB4OENCOEQ1NEQsIDB4QkZENUU1OUUsIDB4QjhCMEQxNzIsIDB4QkQwNjc0QjcsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjgwRTc5QjMsIDB4QUJCN0Q0NUYsIDB4QkZEOEU3QTMsIDB4OTRCQUQ2NTMsIDB4MEVEQ0VCQjIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjBDOEUwODQsIDB4OTdCQUQ2NTAsIDB4QkZEN0U2QTIsIDB4QkE5Q0M2NzQsIDB4QkQwMjczQkEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QUIyRDhBOUUsIDB4QjdDM0RCNkUsIDB4QkZEQkU5QjEsIDB4QjQ5MUMwNzUsIDB4QkYwMTcyQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QTkzMDhCOUIsIDB4QjhDNkRENzMsIDB4QkVEMkU0OTUsIDB4NkVCOEQ2NTEsIDB4MUJDQUUxOEEsIDB4OEFCOEQ1NEMsIDB4QkZENUU1OUUsIDB4QkFCMUQxNzIsIDB4QkIwNTc0QjgsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QUMyNzg3QTIsIDB4QjVDNERCNkQsIDB4QkZENEU1OUEsIDB4NzZCN0Q1NTAsIDB4MDVGMUY3RTEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGQkZDRjYsIDB4MkVCQ0Q5NjgsIDB4QTVCREQ4NTksIDB4QkZEN0U3QTMsIDB4QjU3RUI2NzksIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QTY0MTk1OEYsIDB4QkJDQkRGN0UsIDB4QkVDRkUyOEMsIDB4NUVCQkQ4NUIsIDB4MDBGQ0ZERkEsIDB4MDBGRkZGRkYsIDB4MERFQ0YzRDAsIDB4ODlCOEQ1NEMsIDB4QkZENUU1OUYsIDB4QjhCOUQ1NjEsIDB4QkQ2RkFBNDUsIDB4QkY2RkFDNDcsIDB4QkY2RUFDNDYsIDB4QkY2RkFDNDcsIDB4QkY2RkFDNDYsIDB4QTc5MUJENDQsIDB4QkVEMEUyOEUsIDB4QkJDOURFNzgsIDB4NDhCNUQ1NTYsIDB4MDJGQkZERjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjZEOEU4QTEsIDB4QTlCREQ4NTksIDB4QkZENkU2QTIsIDB4QjZBMEM2NEYsIDB4QkU2RkFDNDYsIDB4QkY2RkFENDcsIDB4QkY2RUFDNDYsIDB4QkY2RkFENDcsIDB4QkY2RkFDNDYsIDB4QUI4QkJDNDUsIDB4QkRDQkUwODEsIDB4QkVDRUUxODYsIDB4NTZCM0Q0NEUsIDB4MDdEQkVCQjMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTMsIDB4QkZENkU2QTIsIDB4QjhBQ0NGNTYsIDB4QkY2RkFDNDYsIDB4QkY2RkFDNDcsIDB4QkY2RkFDNDYsIDB4QkY2RkFDNDcsIDB4QkY2RkFDNDcsIDB4QUM4NUI4NDQsIDB4QkFDQkRGODAsIDB4QkZDRUUxODgsIDB4NUFCNEQ0NEQsIDB4MDdFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MkJENEU2OTcsIDB4QUNCRkQ5NUYsIDB4QkZENkU2QTEsIDB4Qjk5REM2NEUsIDB4QkY2RkFDNDYsIDB4QkY2RkFDNDcsIDB4QkY2RkFDNDYsIDB4QkY3MEFDNDcsIDB4Qjk3MEFDNDcsIDB4NzZBMkM5ODUsIDB4QkY2RkFDNDYsIDB4QkY2RkFENDcsIDB4QkY2RkFDNDYsIDB4QkY2RkFDNDcsIDB4QkE3MkFENDcsIDB4QjFCNUQzNUEsIDB4QkZEN0U3QTMsIDB4OTRCQUQ2NTQsIDB4MThDQkUyOEUsIDB4MDBGRkZGRkYsIDB4MDVFRUY1RDgsIDB4NkVCNkQ0NEEsIDB4QkZEMUUzOTAsIDB4QkVDNERCNzYsIDB4QkE3NkFGNDcsIDB4QkY2RkFDNDcsIDB4QkY2RUFDNDYsIDB4QkY2RkFDNDcsIDB4QkY2RkFDNDYsIDB4Qjg3OUIxNDcsIDB4QjVDMkRBNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJFMEVEQjQsIDB4OUNCQUQ3NTMsIDB4QkZEN0U2QTMsIDB4QjdBQkNFNTYsIDB4QkU2RkFDNDYsIDB4QkY2RkFENDcsIDB4QkY2RkFDNDYsIDB4QkY2RkFDNDcsIDB4QkY2RkFDNDYsIDB4QTg5MEJFNDUsIDB4QkRDRUUxOEEsIDB4QkJDQURGN0QsIDB4NEJCM0Q0NTEsIDB4NjRCNUQ0NEIsIDB4QkVDRUUxODksIDB4QkZDOURGN0UsIDB4Qjk3OEIxNDUsIDB4QkY2RkFDNDcsIDB4QkY2RUFDNDcsIDB4QkY2RkFDNDcsIDB4QkY2RkFDNDYsIDB4QkQ3MUFENDcsIDB4QThBQUNDNEUsIDB4QkZEN0U3QTIsIDB4QTJCRUQ4NUMsIDB4MjBCRERBNzEsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFM0VFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZEM0U0OTksIDB4QkFCQkQ1NkIsIDB4QkM3MkFENDUsIDB4QkY2RkFDNDcsIDB4QkY2RUFDNDYsIDB4QkY2RkFENDcsIDB4QkY2RkFDNDYsIDB4QjI4MkI1NDMsIDB4QkJDQURGN0QsIDB4QkZDRkUyOEEsIDB4NTdCNEQ0NEYsIDB4MDdFREY1RDgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENEU2OTQsIDB4OUVCQkQ3NTMsIDB4QkZEN0U2QTMsIDB4QjRBN0M5NTUsIDB4QkU2RkFDNDYsIDB4QkY2RkFDNDcsIDB4QkY2RkFDNDYsIDB4QkY2RkFDNDcsIDB4QkY2RkFDNDYsIDB4QTg5M0JENDMsIDB4QkVEMUUzOTEsIDB4QkFDN0RENzQsIDB4M0JCNUQ1NTgsIDB4MDJGQUZDRjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkJGQ0ZBLCAweDAzRjJGN0YxLCAweDA4Q0ZFMkNDLCAweDE1QjhEM0IzLCAweDI5OUFDMTkzLCAweDQ1N0JBRTcxLCAweDY1NkFBNTYwLCAweDgxNEU5NTQ0LCAweDQyOEFCOTg2LCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDVFN0EzLCAweDg2QjdENTRDLCAweEJGRDVFNTlDLCAweEJCQjZENDcyLCAweEJDMDg3NkI2LCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEE5MzY4Rjk4LCAweEJBQzZERDc0LCAweEJGRDNFNDk2LCAweDZCQjZENTRFLCAweDA0RjdGQkVFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA2RTZGMUNBLCAweDVEQjVENDRDLCAweEJCQ0JERjdGLCAweEJGRDBFMzhDLCAweEI2MzI4RDlCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDE3MkJDLCAweEE0OEVCRjY2LCAweEJGRDZFNkEwLCAweEFGQzFEQTY0LCAweDI0Q0RFMzhDLCAweDAwRkZGRkZGLCAweDAxRkZGRkZGLCAweDI2QkREOTZCLCAweDlEQkJENzU0LCAweEJGRDdFN0EzLCAweEI2OEVCRjc5LCAweEJFMDI3M0JBLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEFFMjI4NEE2LCAweEI0QzBEOTZBLCAweEJGRDZFNjlFLCAweDdEQjhENTRGLCAweDA3RjRGOUU2LCAweDAwRkZGRkZGLCAweDAxRkJGREY3LCAweDJGQkNEOTY4LCAweEE3QkVEOTVCLCAweEJGRDdFN0EzLCAweEI1N0VCNjc5LCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE2NDQ5NjhFLCAweEJCQ0JFMDgwLCAweEJGREFFOUFBLCAweEI3NzJBRjdFLCAweEJGMDE3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEEzNTM5Rjg1LCAweEJGQ0RFMTg0LCAweEJEQ0VFMTg3LCAweDUzQjVENTUxLCAweDI2QkREOTZDLCAweDlEQkNENzU0LCAweEJGRDhFN0EzLCAweEI1OTJDMTc2LCAweEJGMDE3MkJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE3NDg5OThELCAweEJEQ0FERjdFLCAweEJFRDBFMzhELCAweDVDQjZENTUyLCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRjlGQkYxLCAweDQwQjVENTU0LCAweEIxQzJEQTY2LCAweEJGRDZFNjlGLCAweEI2NUVBNDg1LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE0NjRBODdBLCAweEJGRDFFMzhGLCAweEJBQ0FERjdDLCAweDQ0QkJEODVGLCAweDAwRkVGRUZDLCAweDAwRkZGRkZGLCAweDBFRUNGNEQxLCAweDg5QjhENTRELCAweEJGRDVFNjlGLCAweEI4QjlENTYyLCAweEJENkVBQjQ1LCAweEJGNkZBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkZBQzQ3LCAweEJGNkVBQzQ3LCAweEE4OTFCRDQ0LCAweEJGRDBFMzhFLCAweEJCQzlERjc5LCAweDQ5QjZENTU2LCAweDAyRkJGREY2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI3RDhFOEExLCAweEE5QkREODVBLCAweEJGRDdFNkEyLCAweEI2QTBDNjRGLCAweEJGNkVBQjQ3LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkZBQzQ3LCAweEJGNkVBQzQ3LCAweEFCOEJCRDQ1LCAweEJFQ0NFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjRENDRFLCAweDA4REJFQkI0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzU0LCAweEJGRDdFN0EzLCAweEI4QUNDRjU2LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkZBQzQ3LCAweEJGNkVBQzQ3LCAweEFEODVCODQ0LCAweEJCQ0JFMDgwLCAweEJGQ0ZFMjg4LCAweDVCQjRENDRFLCAweDA4RUJGNEQ1LCAweDAwRkZGRkZGLCAweDAxRkZGRkZFLCAweDNBQzZERTczLCAweEI2QzREQzZCLCAweEJGRDRFNTlCLCAweEI1OTNDMDRBLCAweEJGNkVBQjQ3LCAweEJGNkZBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkZBQzQ3LCAweEFENzBBQzQ3LCAweDYwQTZDQjg5LCAweEJGNkVBQjQ3LCAweEJGNkZBQzQ3LCAweEJGNkVBQzQ2LCAweEJGNkZBQzQ3LCAweEJFNkZBQzQ3LCAweEFDQjBEMTUxLCAweEJGRDhFN0EzLCAweEEyQkVEOTVBLCAweDIyQzZERjgyLCAweDAxRkVGRkZELCAweDA1RUZGNkQ4LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQzc2LCAweEJBNzVBRjQ3LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEI5NzhCMTQ3LCAweEI1QzNEQjY5LCAweEJGRDVFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI1LCAweDlEQkJENzU0LCAweEJGRDdFNkEzLCAweEI3QUNDRTU3LCAweEJFNkZBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkZBQzQ3LCAweEJGNkVBQzQ2LCAweEE4OTBCRTQ1LCAweEJEQ0VFMThBLCAweEJDQ0JFMDdFLCAweDRDQjRENDUxLCAweDY1QjZENTRCLCAweEJFQ0VFMTg5LCAweEJGQ0FERjdGLCAweEJBNzhCMDQ2LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ2LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJENzBBRDQ3LCAweEE4QUJDRDRFLCAweEJGRDhFN0EyLCAweEEyQkVEOTVDLCAweDIxQkREQjcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBBRTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNDk5LCAweEJBQkJENjZCLCAweEJDNzJBRDQ1LCAweEJGNkVBQzQ3LCAweEJGNkVBQjQ2LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEIzODFCNTQzLCAweEJCQ0FERjdFLCAweEJGQ0ZFMjhBLCAweDU3QjRENDUwLCAweDA3RURGNUQ5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RDRFNjk0LCAweDlFQkJENzUzLCAweEJGRDdFN0EzLCAweEI0QTdDOTU1LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEJGNkVBQzQ3LCAweEE5OTNCRTQ0LCAweEJGRDFFMzkxLCAweEJBQzhERTc1LCAweDNCQjVENTU4LCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEY3RkFGNywgMHgwMUVCRjNFQSwgMHgwMUY4RkJGOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRSwgMHgyMkJFREE2RiwgMHg5OUJBRDc1MSwgMHhCRkQ3RTdBMywgMHhCNTk4QzQ3NiwgMHhCRTAyNzNCOSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhBNDU0OUY4NCwgMHhCRUNERTE4NSwgMHhCRUNERTE4NSwgMHg1MEI4RDY1OCwgMHgwMUY5RkNGMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQ0UwRUVCRSwgMHg3MkI2RDU0QSwgMHhCRUQwRTI4RiwgMHhCQkM1REM3RiwgMHhCQTFDODFBNywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCOTA4NzZCNywgMHhBOUE0Q0E2MiwgMHhCRkQ4RTdBNCwgMHg5RUJDRDc1OCwgMHgxNkRCRUJBRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgzNUJERDk2OSwgMHhBQ0JGRDk1RSwgMHhCRkQ3RTZBMSwgMHhCNzc0QjA3RCwgMHhCRTAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNjQyOTY5MCwgMHhCQ0M4REU3OSwgMHhCRkQxRTM5MSwgMHg2M0I1RDQ0RSwgMHgwM0Y2RkFFQiwgMHgwMEZGRkZGRiwgMHgwMkY4RkJGMCwgMHg0MEI0RDQ1MywgMHhCM0MzREI2NywgMHhCRkQ1RTU5RCwgMHhCNzVCQTM4NywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRTAwNzFCQiwgMHhBNDY3QUE3OSwgMHhCRUQxRTM5MSwgMHhCRkQ1RTY5RSwgMHhCNTUzOUU4OSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMjZCQUI3NywgMHhCRkQyRTQ5NCwgMHhCOUM3REQ3NCwgMHgzQUM4REY3QiwgMHgzNUI4RDY1RCwgMHhBQkJGRDk1RSwgMHhCRkQ3RTZBMiwgMHhCNjcyQUY3RSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBMjYzQTc3QiwgMHhCRUQwRTI4RSwgMHhCQkNBREY3QiwgMHg0MUJBRDc1RSwgMHgwMEZCRkRGNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwM0YzRjhFNiwgMHg1MkI1RDU1MSwgMHhCQkM4REU3NiwgMHhCRkQxRTM5MywgMHhCNTQxOTU5MSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRTAxNzJCQiwgMHhBMzdDQjU2RSwgMHhCRkQ1RTU5QiwgMHhCM0M0REM2QiwgMHgyQ0M5RTA4MSwgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHgwREVCRjNEMCwgMHg4N0I4RDU0QywgMHhCRkQ1RTY5RSwgMHhCQkI5RDU2MywgMHhCRDZEQUE0NSwgMHhCRjZEQUI0NywgMHhCRjZDQUI0NiwgMHhCRjZEQUI0NywgMHhCRjZDQUI0NiwgMHhBODkwQkQ0NCwgMHhCRkQwRTI4RCwgMHhCQ0NBREY3QiwgMHg1QkI1RDQ0RSwgMHgyNEQ1RTc5QSwgMHgxQUQ3RTc5RSwgMHgxNERCRUFBQiwgMHgwQ0YwRjZEQywgMHgwNUYxRjdERiwgMHgwMEZFRkZGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNkQ4RThBMSwgMHhBOUJERDg1QSwgMHhCRkQ2RTZBMiwgMHhCNjlGQzY0RiwgMHhCRTZEQUI0NiwgMHhCRjZEQUM0NywgMHhCRjZEQUI0NiwgMHhCRjZEQUI0NywgMHhCRjZEQUI0NiwgMHhBQjhBQkM0NSwgMHhCRENDRTA4MSwgMHhCRUNERTE4NiwgMHg1NkIzRDM0RSwgMHgwOERCRUJCMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEUzRUVCQywgMHg5QUJCRDc1MywgMHhCRkQ3RTZBMywgMHhCOEFDQ0U1NiwgMHhCRjZDQUE0NiwgMHhCRjZEQUI0NywgMHhCRjZDQUI0NywgMHhCRjZEQUI0NywgMHhCRjZEQUI0NiwgMHhBRDg0Qjc0NCwgMHhCQkNCREY4MCwgMHhCRkNFRTE4OCwgMHg1QUI0RDQ0RCwgMHgwOEVCRjRENSwgMHgwMEZGRkZGRiwgMHgwMUZFRkVGQywgMHg0REJCRDc1OSwgMHhCQUM5REY3OSwgMHhCRkQxRTM5MSwgMHhCOTg0Qjg0NywgMHhCRjZDQUI0NiwgMHhCRjZEQUM0NywgMHhCRjZEQUI0NiwgMHhCRjZEQUI0NywgMHg5RjgzQjc2MSwgMHg0MEJERDhBOCwgMHhCRTZDQUI0NiwgMHhCRjZEQUI0NywgMHhCRjZDQUI0NiwgMHhCRjZEQUI0NywgMHhCRjZEQUI0NiwgMHhBOEE2Q0I0RCwgMHhCRkQ2RTU5RiwgMHhBREMxREE2MywgMHgyQkI0RDU1QiwgMHgwMUZCRkRGNiwgMHgwNEVFRjVEOCwgMHg2RUI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REI3NiwgMHhCQTc0QUU0NywgMHhCRjZEQUM0NywgMHhCRjZEQUI0NywgMHhCRjZEQUI0NywgMHhCRjZDQUI0NiwgMHhCOTc4QjE0NywgMHhCNUMzREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDQ0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkUwRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCN0FCQ0Q1NiwgMHhCRTZEQUI0NiwgMHhCRjZEQUI0NywgMHhCRjZEQUI0NywgMHhCRjZEQUI0NywgMHhCRjZEQUI0NiwgMHhBODhGQkU0NSwgMHhCRENFRTE4QSwgMHhCQkNBREY3RCwgMHg0QkIzRDQ1MSwgMHg2NUI1RDU0QiwgMHhCRUNFRTE4OSwgMHhCRkM5REY3RSwgMHhCOTc2QjA0NiwgMHhCRjZEQUI0NywgMHhCRjZEQUI0NywgMHhCRjZEQUI0NywgMHhCRjZDQUI0NiwgMHhCRDZGQUM0NywgMHhBOEFBQ0Q0RSwgMHhCRkQ3RTdBMiwgMHhBMkJERDg1QiwgMHgyMEJEREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUJCRDU2QiwgMHhCQzcxQUQ0NSwgMHhCRjZEQUI0NywgMHhCRjZEQUI0NiwgMHhCRjZEQUI0NywgMHhCRjZDQUI0NiwgMHhCMzgxQjU0MywgMHhCQkNBREY3RSwgMHhCRkNGRTI4OSwgMHg1N0I0RDQ0RiwgMHgwN0VERjVEOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxN0Q0RTU5NCwgMHg5RUJCRDc1MywgMHhCRkQ3RTZBMywgMHhCM0E3Qzk1NSwgMHhCRTZEQUI0NiwgMHhCRjZEQUI0NywgMHhCRjZDQUI0NiwgMHhCRjZEQUM0NywgMHhCRjZEQUI0NiwgMHhBOTkzQkQ0NCwgMHhCRkQxRTM5MiwgMHhCQUM3REU3NCwgMHgzQkI1RDU1OCwgMHgwMkZBRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MDdFNUYwRTQsIDB4MDBGQ0ZERkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkUsIDB4MzFCQ0Q5NjYsIDB4QTlCRUQ5NUIsIDB4QkZEN0U3QTMsIDB4Qjg3QUI0N0MsIDB4QkUwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkMsIDB4QTQ2RkFFNzYsIDB4QkZEM0U0OTYsIDB4QjlDN0RENzIsIDB4MzZDN0RGN0MsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZDQkUyOEUsIDB4ODZCN0Q2NEMsIDB4QkZENUU1OUMsIDB4QkJCMEQxNzgsIDB4QjkwQjc3QjQsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjMxOTdGQUMsIDB4QjBCN0Q1NjUsIDB4QkZEN0U3QTEsIDB4OEJCOUQ2NTEsIDB4MEJFN0YyQ0EsIDB4MDBGRkZGRkYsIDB4MDJGMEY3RTAsIDB4NDhCNUQ0NTIsIDB4QjZDNURENkUsIDB4QkZENEU1OTksIDB4QjU1MDlEOEMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QTQ1OUEyODIsIDB4QkVDRkUyOEIsIDB4QkRDQkUwN0YsIDB4NDhCREQ5NjMsIDB4MDFGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDRGNEY5RTgsIDB4NTNCNUQ0NTAsIDB4QkNDOURGNzgsIDB4QkZEMUUzOTIsIDB4QjY0MTk0OTIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkUwMTcyQkIsIDB4QTQ3RkI3NkYsIDB4QkZENkU2QTEsIDB4QkZEMEUzOEUsIDB4QjYzMjhEOUIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMTcyQkMsIDB4QTQ5MEJGNjUsIDB4QkZEN0U2QTAsIDB4QUZDMURBNjQsIDB4MjZCRURBNkQsIDB4NDZCNkQ1NTYsIDB4QjdDNURDNkQsIDB4QkZENEU0OUEsIDB4QjY1NDlGOEEsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QTM4MkI4NkMsIDB4QkZENUU1OUMsIDB4QjRDNERDNkEsIDB4MkJDQ0UyODksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEFERkVEQkEsIDB4NjlCNUQ1NEIsIDB4QkRDRUUxODksIDB4QkZDQkRGODIsIDB4QjYyMjgzQTUsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkUwMzczQkEsIDB4QTY5RkM4NjIsIDB4QkZEN0U3QTMsIDB4QTdCRUQ4NUQsIDB4MUFENEU3OUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEJFQkY0RDEsIDB4ODFCN0Q1NEIsIDB4QkZENUU1OUIsIDB4QkRCQ0Q3NkEsIDB4QkI2REFBNDUsIDB4QkY2Q0FCNDcsIDB4QkY2QkFCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDYsIDB4QjA4MUI1NDUsIDB4QkNDOERFNzksIDB4QkZENkU2QTAsIDB4QjRDNERCNkIsIDB4QTRCREQ4NTksIDB4OURCQkQ3NTQsIDB4OTZCQUQ2NTEsIDB4ODZCN0Q1NEMsIDB4NkNCN0Q1NEQsIDB4NEFDMERBNjUsIDB4MjREMUU1OTMsIDB4MDlFOUYyQ0QsIDB4MDFGRUZGRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjZEOEU4QTEsIDB4QTlCRUQ5NUEsIDB4QkZEN0U2QTIsIDB4QjY5RkM2NEYsIDB4QkY2Q0FCNDYsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FBNDYsIDB4QUI4QUJDNDUsIDB4QkVDQ0UwODEsIDB4QkVDRUUxODYsIDB4NTZCM0QzNEUsIDB4MDhEQ0VCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjhBQ0NFNTYsIDB4QkY2Q0FCNDYsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QUQ4NEI4NDUsIDB4QkJDQkUwODAsIDB4QkZDRUUyODgsIDB4NUFCNEQ0NEUsIDB4MDhFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MDFGRUZGRkMsIDB4NjFCQ0Q4NTgsIDB4QkRDRUUxODYsIDB4QkRDREUxODUsIDB4QkE3RUI1NDUsIDB4QkY2QkFCNDYsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDYsIDB4QkY2Q0FCNDcsIDB4OTI4NkI5NjQsIDB4MjJEOEU4Q0MsIDB4QkU2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDYsIDB4QkY2REFCNDcsIDB4QkY2Q0FCNDcsIDB4QUM5OUMzNDksIDB4QkZEM0U0OTksIDB4QjdDNURDNkUsIDB4MzhCNUQ1NTksIDB4MDJGQkZERjYsIDB4MDVFRUY1RDgsIDB4NkZCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERCNzYsIDB4QkE3M0FFNDcsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2QkFBNDYsIDB4Qjk3N0IwNDcsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjQsIDB4OURCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjdBQkNENTcsIDB4QkU2REFCNDYsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDYsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDYsIDB4QTg4RkJFNDUsIDB4QkRDRUUyOEIsIDB4QkJDQkUwN0UsIDB4NEJCNEQ0NTEsIDB4NjVCNUQ1NEMsIDB4QkVDRkUxODksIDB4QkZDOURGN0UsIDB4Qjk3NUFGNDYsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDYsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FBNDYsIDB4QkQ2RUFDNDcsIDB4QTlBQUNENEUsIDB4QkZEN0U2QTIsIDB4QTJCRUQ4NUMsIDB4MjFCRURBNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFM0VFQjcsIDB4N0ZCOEQ1NEMsIDB4QkZENEU1OTksIDB4QkFCQkQ2NkIsIDB4QkM3MEFDNDUsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDcsIDB4QkY2QkFCNDYsIDB4QjM4MEI0NDMsIDB4QkJDQkRGN0UsIDB4QkZDRkUyODksIDB4NTdCNEQ0NEYsIDB4MDdFREY1RDksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENEU2OTQsIDB4OUVCQkQ3NTMsIDB4QkZEOEU3QTMsIDB4QjRBN0M5NTUsIDB4QkU2Q0FCNDYsIDB4QkY2Q0FCNDcsIDB4QkY2Q0FCNDYsIDB4QkY2Q0FCNDcsIDB4QkY2QkFBNDYsIDB4QTk5MkJENDQsIDB4QkZEMUUzOTIsIDB4QkFDN0RFNzUsIDB4M0JCNUQ1NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRkZFLCAweDI3QURDRUFCLCAweDkzNEU5NTQ2LCAweDUzNzdBRDZGLCAweDE1Q0JFMEM4LCAweDAxRjNGOEYyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjZGQUVDLCAweDQyQjhENjVCLCAweEI0QzNEQzZBLCAweEJGRDVFNTlDLCAweEI1NUFBMzg2LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJEMDE3MkJBLCAweEE1OTBCRjY2LCAweEJGRDZFNkEwLCAweEFFQzFEQTY0LCAweDIzQzlFMDg2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZFLCAweDIyQzlFMDg3LCAweDk5QkFENjUxLCAweEJGRDdFNkEyLCAweEI4OURDNjcyLCAweEJFMDA3MkJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEFCMkQ4QTlFLCAweEI2QzVEQzZGLCAweEJGRDRFNTk5LCAweDc0QjZENTRFLCAweDA0RTlGM0QwLCAweDAwRkZGRkZGLCAweDA2RUVGNURBLCAweDVDQjRENDRDLCAweEJDQ0JFMDdFLCAweEJEQ0ZFMjhDLCAweEI5MzU4RTk5LCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJCLCAweEE0N0JCNDZGLCAweEJFRDRFNDk5LCAweEI2QzVERDZFLCAweDMwQzVERTdBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBBREVFREI4LCAweDZBQjRENDRBLCAweEJFQ0ZFMjhBLCAweEJFQ0FERjgxLCAweEI3MjA4M0E3LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJEMDM3M0I5LCAweEE1QTJDOTYxLCAweEJGRDlFOEFCLCAweEJDQzREQzgwLCAweEI5MUU4MUE2LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEI4MDg3NkI3LCAweEE5QTJDOTYzLCAweEJGRDhFN0EzLCAweDlGQkRENzU5LCAweDFDQkZEQjcyLCAweDVCQjREMzRCLCAweEJCQ0JFMDdGLCAweEJFQ0ZFMjhDLCAweEI2MzM4RDlCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJCMDM3M0I5LCAweEE3OUZDODYyLCAweEJGRDdFN0EyLCAweEE1QkVEOTVDLCAweDFBQ0VFMzkyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDExRENFQkIzLCAweDdGQjdENTRCLCAweEJFRDNFNDk3LCAweEI5QkNEODc3LCAweEJDMTA3QUIwLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEI1MEU3OUIzLCAweEFDQjJEMjYxLCAweEJGRDhFN0EzLCAweDkzQkFENjUzLCAweDBGRTBFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA2RURGNUQ2LCAweDczQjdENTRDLCAweEJGRDFFMzkxLCAweEJDQzVEQzc4LCAweEI3NzVBRjQ0LCAweEJGNkJBQTQ2LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ3LCAweEJENkRBQjQ2LCAweEIxOUFDMjQ5LCAweEJEQzlERjdELCAweEJGRDVFNTlELCAweEJGRDdFN0EzLCAweEJGRDdFNkEzLCAweEJGRDhFN0EzLCAweEJGRDVFNTlFLCAweEJGRDBFMzhFLCAweEI4QzdERDc0LCAweEE0QkREODU4LCAweDc1QjZENDRCLCAweDM2QzZERTdBLCAweDA5RThGMkNFLCAweDAwRkRGRUZCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI2RDhFOEEwLCAweEE5QkREODU5LCAweEJGRDZFNkEyLCAweEI2OUZDNTRGLCAweEJFNkJBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkJBQTQ2LCAweEFCODlCQjQ1LCAweEJEQ0JFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjNEMzRFLCAweDA3REJFQkIzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzUzLCAweEJGRDZFNkEyLCAweEI4QUJDRTU2LCAweEJGNkFBQTQ2LCAweEJGNkFBQTQ2LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEFDODNCNzQ0LCAweEJBQ0JERjgwLCAweEJGQ0VFMjg4LCAweDVBQjRENDRFLCAweDA3RUJGNEQ1LCAweDAwRkZGRkZGLCAweDA1RUVGNUQ2LCAweDcyQjdENTRDLCAweEJGRDJFMzkyLCAweEJCQzVEQzc3LCAweEI5NzZCMDQ2LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweDc0OERCQzZDLCAweDE1RUZGNkVBLCAweEJCNkRBQjQ4LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEFCOTJDMDQ2LCAweEJGRDBFMjhFLCAweEJCQzlERjdBLCAweDQ4QjVENTU1LCAweDAzRjhGQkYwLCAweDA1RUVGNUQ4LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQjc2LCAweEJBNzJBRTQ3LCAweEJGNkJBQTQ2LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEI4NzZBRjQ3LCAweEI1QzJEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCRTBFREI0LCAweDlDQkJENzUzLCAweEJGRDdFNkEzLCAweEI3QUJDRDU3LCAweEJFNkJBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEJGNkJBQjQ3LCAweEJGNkFBQTQ2LCAweEE4OEVCRDQ0LCAweEJEQ0VFMThBLCAweEJCQ0FERjdELCAweDRCQjNENDUxLCAweDY0QjVENDRCLCAweEJFQ0VFMTg4LCAweEJGQzlERjdGLCAweEI5NzVBRjQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEJENkNBQjQ3LCAweEE4QUFDQzRFLCAweEJGRDdFN0EyLCAweEEyQkVEODVDLCAweDIwQkREQTcwLCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDNFNDk5LCAweEJBQkJENTZCLCAweEJDNkVBQzQ1LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEIyN0ZCMzQzLCAweEJCQ0FERjdFLCAweEJGQ0ZFMjg5LCAweDU3QjRENDRGLCAweDA3RURGNUQ4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RDRFNjk0LCAweDlFQkJENzUzLCAweEJGRDdFNkEzLCAweEI0QTZDOTU1LCAweEJFNkJBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ2LCAweEJGNkJBQTQ3LCAweEJGNkFBQTQ3LCAweEE4OTFCRDQzLCAweEJFRDFFMzkxLCAweEJBQzdERTc1LCAweDNCQjVENTU4LCAweDAyRkFGQ0Y1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxM0RCRUFEQSwgMHg5QzUzOTk0OCwgMHhCRjVCOUQ0NCwgMHhCRTVEOUU0MywgMHhBRTVCOUM0NCwgMHg3QTY3QTM1NywgMHgzRTkzQkQ4OSwgMHgxMkNBREVDNSwgMHgwNEYxRjdGMCwgMHgwMEY5RkJGOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkVGRSwgMHgwMUYyRjdGMCwgMHgwN0YwRjVFRSwgMHgyMkJFRDVCNiwgMHg0OTg2QjA3NywgMHgwN0Q1RTREMCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkVDRjVENywgMHg1N0I0RDQ0QywgMHhCQkM5REY3QiwgMHhCRUQxRTM5MCwgMHhCODNBOTE5NywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCODBBNzdCNSwgMHhBQUE0Q0E2NSwgMHhCRkQ3RTdBMywgMHg5RkJERDg1OSwgMHgxNUUxRUVCQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZCRkRGNiwgMHgzMUI2RDU1OSwgMHhBOEJGRDk1QywgMHhCRkQ3RTdBMywgMHhCNTc4QjM3RCwgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhBNjQ4OTk4QywgMHhCQ0NCRTA4MCwgMHhCRUNGRTI4QiwgMHg1OUI5RDc1OCwgMHgwMUZERkVGQSwgMHgwMEZGRkZGRiwgMHgwREQ5RUFBRSwgMHg3MUI1RDQ0QSwgMHhCRkQxRTM4RiwgMHhCQ0MyREI4MCwgMHhCNzFDODFBOSwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQjA0NzNCOSwgMHhBNjk0QzI2NiwgMHhCRkQ3RTZBMSwgMHhBQUMwREE2MSwgMHgxRkQwRTQ5NSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkRDRUNCMywgMHg3RkI2RDU0QSwgMHhCRkQ0RTU5OSwgMHhCOUJCRDc3NSwgMHhCRDBGN0FCMiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCNTBFNzlCMiwgMHhBREI0RDM2MiwgMHhCRkRCRTlCMSwgMHhCQkIyRDI3OCwgMHhCOTBBNzdCNSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCMzE5N0ZBQywgMHhBRkI5RDU2NCwgMHhCRkQ3RTdBMiwgMHg4Q0I5RDY1MSwgMHgxN0NCRTI4RSwgMHg3MUI1RDQ0QSwgMHhCRkQxRTM4RiwgMHhCQkM0REM3RiwgMHhCQTFFODJBNywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCNDExN0JCMCwgMHhBRUIwRDE2NSwgMHhCRkQ3RTdBMywgMHg5M0JBRDc1NCwgMHgwRUU2RjFDNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxREM1REU3RSwgMHg5MUI5RDY0RSwgMHhCRkQ2RTZBMCwgMHhCOEExQzk3NywgMHhCQzA2NzVCNywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhBRDI2ODZBMywgMHhCNkJGRDk2QiwgMHhCRkQ2RTY5RCwgMHg3REI3RDU0RiwgMHgwN0VFRjZEQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZFRkVGRCwgMHg1OEJERDk1QywgMHhCQkNBREY3RSwgMHhCRkQxRTQ5MSwgMHhCNzg1QjY0NSwgMHhCRjZBQUE0NywgMHhCRjY5QUE0NywgMHhCRjZBQUE0NywgMHhCRjZBQTk0NywgMHhCRjZBQUE0NywgMHhCRTZBQUE0NiwgMHhCODdDQjI0NSwgMHhCNjk0QzA0QSwgMHhCOTlEQzQ1MSwgMHhCN0ExQzY1NCwgMHhCNUFGQ0Y1QiwgMHhCOUJERDc2NywgMHhCREM5REU3RiwgMHhCRkQzRTQ5OCwgMHhCRkQ4RTdBNSwgMHhCRUQwRTM4RCwgMHhBQkJGRDk1RSwgMHg2N0I1RDQ0QywgMHgxQ0QwRTU5NiwgMHgwMUZCRkRGNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyN0Q4RThBMSwgMHhBOUJERDg1QSwgMHhCRkQ2RTZBMiwgMHhCNjlGQzY0RiwgMHhCRjZBQUE0NywgMHhCRjZBQUE0NywgMHhCRjZBQUE0NiwgMHhCRjZBQUE0NywgMHhCRjY5QUE0NywgMHhBQjg4QkI0NSwgMHhCRUNDRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkI0RDQ0RiwgMHgwOERCRUJCNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCOEFCQ0U1NiwgMHhCRjZBQTk0NiwgMHhCRjZBQUE0NywgMHhCRjZBQTk0NiwgMHhCRjZBQUE0NywgMHhCRjZBQUE0NywgMHhBRDgzQjc0NCwgMHhCQkNCRTA4MCwgMHhCRkNGRTI4OCwgMHg1QkI0RDQ0RSwgMHgwOEVCRjRENSwgMHgwMEZGRkZGRiwgMHgwREVCRjNDRCwgMHg4M0I3RDU0QiwgMHhCRkQ1RTY5QywgMHhCQ0JDRDc2QSwgMHhCQzZFQUM0NywgMHhCRjZBQTk0NywgMHhCRjZBQUE0NywgMHhCRjY5QTk0NiwgMHhCRjZBQUE0NywgMHg1QkI3RDVBNSwgMHgxMUYwRjZFQiwgMHhCMzZEQUI0OSwgMHhCRjZBQUE0NywgMHhCRjZBQUE0NywgMHhCRjZBQUE0NywgMHhCRjY5QUE0NiwgMHhBQjg4QkE0NywgMHhCRUNDRTA4MiwgMHhCRENFRTE4OCwgMHg1OUI0RDQ0RSwgMHgwN0UyRUZDMiwgMHgwNUVGRjZEOCwgMHg2RUI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REM3NiwgMHhCQTcyQUU0OCwgMHhCRjZBQUE0NywgMHhCRjY5QUE0NiwgMHhCRjZBQUE0NywgMHhCRjY5QTk0NiwgMHhCOTc1QjA0NywgMHhCNUMzREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNSwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0FCQ0Q1NywgMHhCRTZCQUE0NywgMHhCRjZBQUE0NywgMHhCRjZBQUE0NywgMHhCRjZBQUE0NywgMHhCRjZBQUE0NywgMHhBODhFQkU0NSwgMHhCRENGRTI4QiwgMHhCQ0NCRTA3RSwgMHg0Q0IzRDQ1MSwgMHg2NUI1RDU0QiwgMHhCRUNFRTE4OSwgMHhCRkNBREY3RiwgMHhCQTc0QUY0NiwgMHhCRjZBQUE0NywgMHhCRjZBQTk0NiwgMHhCRjZBQUE0NywgMHhCRjY5QUE0NiwgMHhCRDZDQUI0NywgMHhBOEFBQ0Q0RSwgMHhCRkQ4RTdBMywgMHhBMkJFRDg1QywgMHgyMUJEREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUJCRDY2QiwgMHhCQzZFQUM0NiwgMHhCRjZBQUE0NywgMHhCRjY5QUE0NywgMHhCRjZBQUE0NywgMHhCRjY5QTk0NiwgMHhCMzdGQjQ0MywgMHhCQkNBREY3RSwgMHhCRkNGRTI4QSwgMHg1N0I0RDQ1MCwgMHgwN0VERjVEOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEQ0RTY5NCwgMHg5RUJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCNEE2Qzk1NSwgMHhCRjZBQUE0NywgMHhCRjZBQUE0NywgMHhCRjZBQUE0NiwgMHhCRjZBQUE0NywgMHhCRjZBQUE0NywgMHhBOTkxQkQ0NCwgMHhCRkQxRTM5MiwgMHhCQUM4REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDdEQUU5REEsIDB4ODE1RkEwNTUsIDB4QkU1RTlGNDMsIDB4QkY3OUFFNDksIDB4QkY5NUJDNTEsIDB4QkY5MkJBNTAsIDB4QkY3OUFENDcsIDB4QkU2OUE0NDQsIDB4QjE2MjlGNDQsIDB4OTA2MDlENDYsIDB4Njk3NUFBNjMsIDB4NEI4OEI1NzgsIDB4MzA4NkIzNzgsIDB4MjE5RUMzOTMsIDB4MTlDMUQ4QjksIDB4MTVDMUQ4QkEsIDB4MTdDMUQ4QjksIDB4MUNCNkQxQUQsIDB4MjY4OEIzNzgsIDB4Mzk4QUI0NzksIDB4NTc4OEIyNzUsIDB4Nzg2MzlBNDksIDB4OUU2Mjk5NDcsIDB4Qjk1Rjk3NDUsIDB4OTM1OTkzNDMsIDB4MDRFM0VEREYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGOEZBRjcsIDB4MjM5NkJCODksIDB4MUNCMUNDQTYsIDB4MENDM0Q4QkEsIDB4MDRFMUVCREMsIDB4MDFGNkY5RjUsIDB4MDBGQUZDRjksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEFFMkVGQzEsIDB4NkNCNUQ0NEEsIDB4QkZDRkUyOEIsIDB4QkNDNkREODMsIDB4QjgyNDg1QTMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjMxODdFQUIsIDB4QUZCREQ4NjMsIDB4QkZENkU2QTAsIDB4OEFCOUQ2NTAsIDB4MDlFMEVFQkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGQkZERjYsIDB4NDJCNkQ1NTYsIDB4QjVDM0RCNjksIDB4QkZENUU1OUMsIDB4Qjg1QkEzODYsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkUwMDcxQkIsIDB4QTQ2OEFBNzgsIDB4QkZEMUUzOTAsIDB4QkFDOURFNzksIDB4M0ZCOUQ3NUQsIDB4MDBGREZFRkIsIDB4MDBGRkZGRkYsIDB4MTdEM0U2OUUsIDB4ODZCNkQ0NEIsIDB4QkZENUU1OUQsIDB4QkJCNUQzNzIsIDB4QkIwNzc1QjcsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjcwRDc4QjMsIDB4QUFBREQwNjIsIDB4QkZEN0U3QTMsIDB4OTlCQkQ3NTUsIDB4MTBERkVEQjgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUVDNERFN0QsIDB4OTJCOEQ1NEUsIDB4QkZEN0U2QTEsIDB4Qjg5RUM3NzcsIDB4QkMwNTc0QjgsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QUIyNzg3QTEsIDB4QjZDMERBNkMsIDB4QkZEQ0VBQjIsIDB4Qjg5Q0M2NzIsIDB4QkUwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QUMyQjg5OUYsIDB4QjZDNURDNkYsIDB4QkZENEU0OTgsIDB4NzRCN0Q1NTAsIDB4MUFCQkQ5NkMsIDB4ODVCN0Q0NEIsIDB4QkZENUU1OUMsIDB4QkFCMEQxNzYsIDB4QjkwQjc4QjUsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QUUyNTg2QTMsIDB4QjRDM0RDNkEsIDB4QkZENUU1OUMsIDB4N0RCN0Q2NEYsIDB4MDVFNkYxQ0EsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkUsIDB4MkFDNEREN0EsIDB4QTNCREQ4NTcsIDB4QkZEN0U2QTMsIDB4Qjg4OUJDNzYsIDB4QkUwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QTgzRDkzOTMsIDB4QkFDOURFNzksIDB4QkZEMUUzOTAsIDB4NjNCOEQ2NTUsIDB4MDJGNEY5RTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkQsIDB4MzBDNkRFNzgsIDB4QUNDMEQ5NUYsIDB4QkZEOEU3QTQsIDB4QjVBOENBNTQsIDB4QkU2QUE5NDYsIDB4QkY2OEE5NDYsIDB4QkY2OEE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDcsIDB4QkU2OUE5NDYsIDB4QkY2OUE5NDcsIDB4QkM2QUE4NDUsIDB4Qjc3N0IwNDQsIDB4QjQ4Q0JCNDcsIDB4QjdCMENGNUIsIDB4QkRDREUxODcsIDB4QkZEOEU3QTUsIDB4QkJDOURFN0EsIDB4ODJCN0Q1NEQsIDB4MjRCRERBNkQsIDB4MDFGNkZBRUIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjZEOEU4QTEsIDB4QTlCREQ4NUEsIDB4QkZEN0U2QTIsIDB4QjY5RUM1NEYsIDB4QkU2OEE5NDYsIDB4QkY2OUFBNDcsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QUI4OEJCNDUsIDB4QkRDQ0UwODEsIDB4QkVDREUxODYsIDB4NTZCM0Q0NEUsIDB4MDhEQkVCQjMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThFM0VFQkMsIDB4OUFCQkQ3NTMsIDB4QkZEN0U2QTMsIDB4QjhBQUNFNTYsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QUQ4MkI3NDQsIDB4QkJDQkRGODAsIDB4QkZDRUUxODgsIDB4NUFCNEQ0NEQsIDB4MDhFQkY0RDUsIDB4MDBGRkZGRkYsIDB4MTRFOUYyQ0EsIDB4OTRCOUQ2NEYsIDB4QkZEN0U3QTIsIDB4QjdCNEQzNUQsIDB4QkY2OUFBNDYsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDcsIDB4NERCOUQ2QTUsIDB4MDlGMUY3RUMsIDB4QTI2RkFDNEIsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUFBNDcsIDB4QkY2OUE5NDYsIDB4QjE3Q0IzNDcsIDB4QjlDN0RENzYsIDB4QkZEMkU0OTMsIDB4NjlCNUQ0NEQsIDB4MEFFMkVGQzEsIDB4MDRFRUY1RDgsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERCNzYsIDB4QkE3MUFENDcsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDYsIDB4QkY2OEE5NDYsIDB4Qjk3NEFGNDcsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJFMEVEQjQsIDB4OURCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjdBQUNENTYsIDB4QkU2OUE5NDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDYsIDB4QkY2OEE5NDYsIDB4QTg4REJENDUsIDB4QkRDRUUxOEEsIDB4QkJDQURGN0UsIDB4NEJCM0Q0NTEsIDB4NjVCNUQ1NEIsIDB4QkVDRUUxODksIDB4QkZDOURGN0UsIDB4Qjk3M0FFNDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkQ2QkFBNDcsIDB4QThBQUNDNEUsIDB4QkZEN0U2QTIsIDB4QTJCRUQ4NUIsIDB4MjBCRERBNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFMkVFQjcsIDB4N0ZCOEQ1NEMsIDB4QkZEM0U0OTksIDB4QkFCQkQ1NkIsIDB4QkM2Q0FCNDUsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OUFBNDcsIDB4QkY2OEE5NDcsIDB4QjM3RUIzNDMsIDB4QkJDQURGN0UsIDB4QkZDRkUyODksIDB4NTdCNEQ0NEYsIDB4MDdFREY1RDgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTdENEU1OTQsIDB4OUVCQkQ3NTMsIDB4QkZEN0U2QTMsIDB4QjNBNkM5NTUsIDB4QkU2OEE5NDYsIDB4QkY2OUE5NDcsIDB4QkY2OEE5NDYsIDB4QkY2OEE5NDcsIDB4QkY2OEE5NDYsIDB4QTk5MUJENDQsIDB4QkZEMUUzOTEsIDB4QkFDN0RFNzQsIDB4M0JCNUQ1NTgsIDB4MDJGQUZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRjZGQUY2LCAweDYwNkFBNzY0LCAweEJFNURBMDQ0LCAweEJGN0NCMTQ5LCAweEJGQkZEMzY0LCAweEJGREJFMzgwLCAweEJGRTdFQThGLCAweEJGRDJEQzZGLCAweEJGQkREMTVGLCAweEJGQTZDNTU2LCAweEJGOTFCQTRGLCAweEJGODBCMDQ5LCAweEJGNzZBQTQ2LCAweEJDNkZBNjQ1LCAweEJCNkNBMzQ0LCAweEI2NkFBMTQ0LCAweEIzNkJBMTQ1LCAweEI0NkNBMTQ0LCAweEI5NkZBMzQ1LCAweEJCNzJBNTQ3LCAweEJENzlBQTQ5LCAweEJGNzlBOTQ4LCAweEJGNzVBNTQ2LCAweEJGNzFBMjQ1LCAweEJGNjk5QzQ1LCAweDc2NzBBMjVCLCAweDAxRjZGOUY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA2RUNGM0VBLCAweDlBNUQ5NjQ1LCAweEI3NjQ5OTQ0LCAweEE4Njc5QzQ1LCAweDkxNjc5QzQ4LCAweDc1Njc5RDRCLCAweDU3N0JBQTY1LCAweDNCOTJCQTgxLCAweDFGQkFEM0IwLCAweDBEQ0JERUM0LCAweDAzRjdGQUY2LCAweDAxRkFGQ0Y5LCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE0RDJFNjlCLCAweDgxQjZENTRBLCAweEJGRDVFNTk5LCAweEJDQjhENTc3LCAweEI5MEM3OEI0LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEFBMkM4OTlFLCAweEI3QzZERDcxLCAweEJGRDRFNTk4LCAweDcyQjhENjUwLCAweDAzRjFGN0UyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RUFGM0QzLCAweDU2QjVENDRFLCAweEJDQ0FERjdCLCAweEJGRDFFMzhGLCAweEI1M0E5MTk3LCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJCLCAweEE0ODNCOTZELCAweEJGRDVFNjlELCAweEIzQzNEQjY4LCAweDI4RDBFNDkxLCAweDAwRkZGRkZGLCAweDAwRkVGRUZELCAweDIyQzJERDc4LCAweDk5QkFENjUxLCAweEJGRDdFN0EzLCAweEI1OThDNDc0LCAweEJGMDI3M0JCLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEIwMUM4MEE5LCAweEIyQzBEQTY2LCAweEJGRDZFNTlGLCAweDg0QjlENjUwLCAweDA3RTdGMUNCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZFLCAweDJDQzRERTc5LCAweEEzQkNEODU3LCAweEJGRDhFN0E0LCAweEI3ODZCQTc3LCAweEJGMDE3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE3M0Y5NDkxLCAweEJCQ0FERjdCLCAweEJGREFFOEFDLCAweEI1NzhCMzdELCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE2NDk5QThDLCAweEJDQ0JFMDgwLCAweEJFQ0ZFMjhCLCAweDU5QjhENjU1LCAweDIzQ0FFMTg3LCAweDk5QkFENjUxLCAweEJGRDdFN0EzLCAweEI3OUNDNjcyLCAweEJGMDE3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE3M0M5MjkzLCAweEJBQ0FERjdCLCAweEJFRDFFMzkwLCAweDY0QkFENzU2LCAweDAxRkNGREY4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjZGQUVDLCAweDNCQjRENDUzLCAweEFGQzFEQTY0LCAweEJGRDZFNkEwLCAweEI1NjVBODgzLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEE1NUFBMzgxLCAweEJEQ0ZFMjhCLCAweEJEQ0JFMDdGLCAweDQ5QkVEOTY1LCAweDAxRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEwRERFQ0IzLCAweDgwQjdENTRDLCAweEJGRDJFNDk0LCAweEJEQ0NFMDg1LCAweEI0ODhCODQ2LCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBOTQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ3LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ3LCAweEJGNjhBOTQ3LCAweEJGNjdBOTQ3LCAweEJGNjdBOTQ3LCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjhBOTQ3LCAweEJENkFBOTQ2LCAweEI0ODZCNzQ1LCAweEI5QkJENjY1LCAweEJGRDdFNkEwLCAweEJEQ0VFMTg1LCAweDgwQjdENTRDLCAweDFDQ0VFNDkzLCAweDAwRkRGRUZCLCAweDAwRkZGRkZGLCAweDI2RDhFOEExLCAweEE5QkREODVBLCAweEJGRDdFNkEyLCAweEI2OUVDNTRGLCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ2LCAweEFCODdCQTQ1LCAweEJFQ0NFMDgxLCAweEJFQ0VFMTg2LCAweDU2QjNENDRGLCAweDA4RENFQ0I0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzU0LCAweEJGRDdFNkEzLCAweEI4QUJDRTU2LCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ2LCAweEFEODFCNjQ0LCAweEJCQ0JFMDgwLCAweEJGQ0VFMjg4LCAweDVBQjRENDRFLCAweDA4RUNGNEQ1LCAweDAwRkZGRkZGLCAweDFGRDJFNTkxLCAweEExQkJENzU1LCAweEJGRDhFN0EzLCAweEI2QTZDQTU2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBOTQ2LCAweEJGNjhBOTQ3LCAweDJFQ0FERkJBLCAweDAxRkZGRkZGLCAweDkwOENCRDcyLCAweEJGNjhBOTQ3LCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBOTQ2LCAweEI2NzVCMDQ3LCAweEI0QzNEQjZBLCAweEJGRDVFNjlCLCAweDdCQjZENTRELCAweDBGRDlFQUFFLCAweDA1RUVGNUQ4LCAweDZGQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQjc2LCAweEJBNzBBQzQ4LCAweEJGNjdBOTQ3LCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ2LCAweEI5NzRBRjQ3LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI0LCAweDlEQkJENzU0LCAweEJGRDdFN0EzLCAweEI3QUFDRDU3LCAweEJFNjhBOTQ3LCAweEJGNjdBOTQ3LCAweEJGNjdBOTQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBOTQ2LCAweEE4OERCRDQ1LCAweEJEQ0ZFMjhCLCAweEJCQ0JERjdFLCAweDRCQjRENDUxLCAweDY1QjVENTRCLCAweEJFQ0VFMTg5LCAweEJGQzlERjdFLCAweEI5NzJBRTQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ2LCAweEJENjlBQTQ3LCAweEE5QUFDRDRFLCAweEJGRDdFN0EyLCAweEEyQkVEODVDLCAweDIxQkVEQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTNFRUI3LCAweDdGQjhENTRDLCAweEJGRDRFNDk5LCAweEJBQkJENTZCLCAweEJDNkJBQTQ1LCAweEJGNjhBOTQ3LCAweEJGNjdBOTQ3LCAweEJGNjhBOTQ3LCAweEJGNjdBOTQ2LCAweEIzN0VCMzQzLCAweEJCQ0JERjdFLCAweEJGQ0ZFMjg5LCAweDU3QjRENDRGLCAweDA3RURGNUQ5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RDRFNjk0LCAweDlFQkJENzUzLCAweEJGRDdFN0EzLCAweEI0QTZDOTU1LCAweEJFNjhBODQ2LCAweEJGNjhBOTQ3LCAweEJGNjdBODQ3LCAweEJGNjdBOTQ3LCAweEJGNjdBODQ2LCAweEE5OTBCQzQ0LCAweEJGRDFFMzkyLCAweEJBQzdERDc1LCAweDNCQjVENTU4LCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkVGRSwgMHgzRjg1Qjg4MywgMHhCODU4OUM0MywgMHhCRjc0QUU0NywgMHhCRkI1Q0U1RSwgMHhCRkRFRTU3RiwgMHhCRkYxRjA5RCwgMHhCRkVCRUQ5MSwgMHhCRkUyRTc4MiwgMHhCRkRGRTU3RCwgMHhCRkQ5RTE3NCwgMHhCRkQzREQ2RCwgMHhCRkM5RDc2NSwgMHhCRkJGRDI2MCwgMHhCRkI1Q0Q1QywgMHhCRkFFQ0E1QSwgMHhCRkE5Qzc1NywgMHhCRkE1QzY1NiwgMHhCRkExQzQ1NSwgMHhCRjlDQzI1MiwgMHhCRjk0QkM0QywgMHhCRjhFQjg0OCwgMHhCRjhBQjQ0NywgMHhCRjg1QjA0OCwgMHhCRjdDQTk0NiwgMHhCRjZEOUY0NSwgMHg1NjdBQTg2NSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwRkRDRThENywgMHhBRjY0OUI0NiwgMHhCRjczQTM0NSwgMHhCRjhCQjE0RiwgMHhCRjk0Qjc1MiwgMHhCRjg4QjE0RCwgMHhCRTdCQTk0NywgMHhCRDczQTY0NSwgMHhCODZDQTE0NCwgMHhBQTY4OUY0NSwgMHg5NDZCQTE0RSwgMHg3NjY3OUY0RSwgMHg1ODkwQjk4MSwgMHgzQjk1QkQ4OSwgMHgyMUFDQ0JBNCwgMHgwRkNGRTFDQSwgMHgwM0VDRjNFQiwgMHgwMUZDRkRGQywgMHgwMEZERkVGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkVGRSwgMHgxRkNCRTI4QiwgMHg5NEI5RDY0RiwgMHhCRkQ3RTdBMiwgMHhCN0EzQzk3MSwgMHhCRjAyNzNCQSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNTRFOUM4OCwgMHhCRUNDRTA4MSwgMHhCRENFRTE4OSwgMHg1N0I2RDU1MiwgMHgwMUY5RkNGMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQkUyRUZDMSwgMHg2Q0I1RDQ0OSwgMHhCRUNGRTI4QywgMHhCRENBREY3RSwgMHhCOTFGODJBNywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQjAzNzNCOSwgMHhBNkE2Q0M1RiwgMHhCRkQ3RTZBMywgMHhBNEJFRDg1QiwgMHgxOEQwRTQ5NywgMHgwMEZGRkZGRiwgMHgwMEZERkVGQywgMHgzMkJBRDg2MywgMHhBOEJFRDg1QiwgMHhCRkQ3RTdBMywgMHhCNjc3QjI3QywgMHhCRjAxNzJCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBODM2OEY5OCwgMHhCQUM3REQ3NSwgMHhCRUQyRTM5NCwgMHg2QUI3RDU1MCwgMHgwM0Y4RkJGMSwgMHgwMEZGRkZGRiwgMHgwMUY1RjlFQSwgMHgzREI1RDU1NCwgMHhBRkMxREE2NCwgMHhCRkQ2RTY5RiwgMHhCNDYyQTY4MywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNDVCQTM3RiwgMHhCRUQwRTM4RCwgMHhCRkQ2RTZBMSwgMHhCODVDQTM4NiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBMzY3QUE3OSwgMHhCRkQwRTM5MCwgMHhCQUM5REY3QSwgMHgzRkJBRDc1RiwgMHgzMUI1RDU1OCwgMHhBN0JERDg1QSwgMHhCRkQ4RTdBMywgMHhCNDc4QjI3QywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMzVGQTU3RCwgMHhCRkNGRTI4QiwgMHhCQkNCREY4MCwgMHg0OEI4RDY1OSwgMHgwMEZDRkRGOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNEY2RkFFQiwgMHg0REI0RDQ0RiwgMHhCOUM3REQ3MiwgMHhCRUQyRTM5NiwgMHhCNzRBOTk4RSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRTAwNzJCQiwgMHhBNDdBQjQ2RiwgMHhCRkQzRTQ5OCwgMHhCNkM2REM2RiwgMHgzMkJERDk2OSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY5RkNGMiwgMHgzQkJCRDg2MCwgMHhBQ0JGRDk1RiwgMHhCRkQ4RTdBNCwgMHhCQUMyREE2RiwgMHhCNDgxQjQ0NCwgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NiwgMHhCRjY2QTk0NywgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NywgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NywgMHhCRjY2QTg0NiwgMHhCRjY3QTg0NywgMHhCRjY2QTg0NiwgMHhCRjY3QTg0NywgMHhCRjY2QTg0NiwgMHhCNzczQUQ0NSwgMHhCNkIxRDA1OSwgMHhCRkQ3RTdBMSwgMHhCQUM4REU3OCwgMHg2MkI1RDQ0RCwgMHgwQURDRUJCNSwgMHgwMEZGRkZGRiwgMHgyNkQ4RThBMSwgMHhBOUJERDg1OSwgMHhCRkQ2RTZBMiwgMHhCNjlEQzU0RiwgMHhCRTY2QTg0NiwgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NywgMHhCRjY2QTg0NiwgMHhBQjg2QkE0NCwgMHhCRENCRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkIzRDM0RSwgMHgwN0RCRUJCMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJCRDc1MywgMHhCRkQ3RTZBMiwgMHhCOEFBQ0U1NiwgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NywgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NywgMHhCRjY2QTc0NiwgMHhBQzgxQjY0NCwgMHhCQUNCREY4MCwgMHhCRkNFRTE4OCwgMHg1QUI0RDQ0RCwgMHgwN0VCRjRENSwgMHgwMEZGRkZGRiwgMHgyQ0QxRTQ4RSwgMHhBQkJGRDk1RSwgMHhCRkQ3RTZBMSwgMHhCOTk4QzI0RSwgMHhCRjY3QTg0NywgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NiwgMHhCRjY2QTc0NiwgMHhCRDY4QTk0NywgMHgxRkQ5RTlCQSwgMHgwQ0VCRjNDRSwgMHg4OThBQkI2OSwgMHhCRjY3QTg0NywgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NywgMHhCRjY2QTg0NiwgMHhCNzZGQUQ0NywgMHhCMUJCRDY2MCwgMHhCRkQ3RTZBMSwgMHg4QkI4RDU1MCwgMHgxNUM3REY4NywgMHgwNUVFRjVEOCwgMHg2RUI2RDQ0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REI3NiwgMHhCQTZGQUM0OCwgMHhCRjY2QTg0NywgMHhCRjY2QTg0NiwgMHhCRjY3QTg0NywgMHhCRjY2QTg0NiwgMHhCODcyQUU0NywgMHhCNUMyREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkUwRURCNCwgMHg5Q0JBRDc1MywgMHhCRkQ3RTZBMiwgMHhCN0FBQ0Q1NywgMHhCRTY3QTg0NiwgMHhCRjY2QTg0NywgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NywgMHhCRjY2QTg0NiwgMHhBODhDQkM0NSwgMHhCRENFRTE4QSwgMHhCQkNBREY3RCwgMHg0QkIzRDQ1MSwgMHg2NEI1RDQ0QiwgMHhCRUNFRTE4OCwgMHhCRkM5REY3RSwgMHhCOTcxQUQ0NiwgMHhCRjY2QTg0NiwgMHhCRjY2QTg0NiwgMHhCRjY3QTg0NywgMHhCRjY2QTg0NiwgMHhCRDY4QTk0NywgMHhBOEE5Q0M0RSwgMHhCRkQ3RTZBMiwgMHhBMkJFRDg1QywgMHgyMEJEREE3MSwgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQzRTQ5OCwgMHhCQUJCRDU2QiwgMHhCQzZBQUE0NSwgMHhCRjY2QTg0NywgMHhCRjY2QTg0NiwgMHhCRjY3QTg0NywgMHhCRjY2QTg0NiwgMHhCMjdEQjI0MywgMHhCQkNBREY3RCwgMHhCRkNGRTI4OSwgMHg1N0I0RDQ0RiwgMHgwN0VERjVEOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEQ0RTY5NCwgMHg5RUJCRDc1MywgMHhCRkQ3RTZBMywgMHhCNEE1Qzg1NSwgMHhCRTY3QTg0NiwgMHhCRjY2QTg0NiwgMHhCRjY2QTc0NiwgMHhCRjY3QTg0NywgMHhCRjY2QTg0NiwgMHhBODkwQkM0MywgMHhCRUQxRTM5MSwgMHhCQUM3REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZBRkNGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjRBRUQwQUQsIDB4QUQ1NTlDNDcsIDB4QkY2QkE5NDUsIDB4QkZBQUNBNUEsIDB4QkZEOEUyNzksIDB4QkZERkU2N0YsIDB4QkZEMkRFNkQsIDB4QkZEMERDNjgsIDB4QkZENERFNjksIDB4QkZEN0UwNkIsIDB4QkZENkRGNkIsIDB4QkZEMkRENjksIDB4QkZDQkRBNjUsIDB4QkZDNkQ4NjIsIDB4QkZCRUQ0NUYsIDB4QkZCNUQwNUEsIDB4QkZBQkNDNTQsIDB4QkZBM0M3NEYsIDB4QkY5REM0NEEsIDB4QkY5Q0MzNEEsIDB4QkY5REMzNDksIDB4QkY5Q0MzNEEsIDB4QkY5OUJGNDksIDB4QkY5MUI5NDgsIDB4QkY4M0FFNDcsIDB4QkU2RkEwNDUsIDB4Mzg5QkJFOEMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjVCNENGQTksIDB4QkI2QzlGNDYsIDB4QkY5OEI5NTQsIDB4QkZEN0RFNzgsIDB4QkZFNkU5OTEsIDB4QkZFMEU1ODQsIDB4QkZDQkQ4NzEsIDB4QkZCN0NENjUsIDB4QkZBNkM0NUIsIDB4QkY5N0JDNTMsIDB4QkY4QUI0NEQsIDB4QkY3RkFGNDgsIDB4QkY3NkE5NDUsIDB4QkQ2RkE2NDUsIDB4Qjc2OEEyNDQsIDB4QUM2MjlFNDQsIDB4OTc2NkExNEQsIDB4N0M2N0EyNTMsIDB4NUM4MkIzNzUsIDB4NDE5QUMyOTEsIDB4MjNCM0QxQUUsIDB4MEVEN0U3RDYsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGREZFRkIsIDB4MkVCOUQ4NjEsIDB4QTRCREQ4NTgsIDB4QkZEOEU3QTMsIDB4QjU3RkI2N0EsIDB4QkYwMTcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QTM2N0E5NzksIDB4QkZEMkU0OTIsIDB4QkFDOERFNzcsIDB4M0RDM0RENzEsIDB4MDBGREZFRkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTREM0U2OUYsIDB4ODJCN0Q1NEIsIDB4QkZENEU1OTksIDB4QjlCNUQ0NzgsIDB4QkIxMDdBQjEsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjMxMjdCQjAsIDB4QUZCMkQyNjUsIDB4QkZEN0U2QTIsIDB4OTFCQUQ3NTMsIDB4MERFOUYyQ0QsIDB4MDBGRkZGRkYsIDB4MDFGOUZCRjIsIDB4NDNCOUQ3NUQsIDB4QjVDNERCNkEsIDB4QkZENUU2OUMsIDB4QjU1OUEyODYsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QTQ1NkEwODMsIDB4QkZDRUUxODYsIDB4QkRDREUxODQsIDB4NTBCNkQ1NTIsIDB4MDFGOUZCRjIsIDB4MDBGRkZGRkYsIDB4MDNGNEY5RTksIDB4NEZCNUQ1NTAsIDB4QjlDN0RENzMsIDB4QkZEM0U0OTYsIDB4Qjg0Njk3OEYsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMTcyQkIsIDB4QTQ3QkI1NkUsIDB4QkZENUU2OUUsIDB4QkZEMUUzOTEsIDB4QjUzQjkxOTcsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QTM4M0I5NkQsIDB4QkZENUU1OUQsIDB4QjRDM0RCNjksIDB4MkFDQkUxODgsIDB4NDJCN0Q2NTgsIDB4QjVDM0RCNjgsIDB4QkZENkU2OUQsIDB4Qjg1Q0EzODUsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMTcyQkMsIDB4QTM3N0IyNzEsIDB4QkZENEU1OUEsIDB4QjZDNURDNkUsIDB4MzBDRUUzOEMsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDhFNkYxQ0EsIDB4NjNCNUQ0NEMsIDB4QkVDREUxODQsIDB4QkVDQkUwODgsIDB4QjYyQjg5QTAsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkQwMzczQkEsIDB4QTU5M0MyNjcsIDB4QkZEN0U2QTEsIDB4QUJDMERBNjAsIDB4MUVENkU3QTAsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEFFNUYwQzcsIDB4NjBCNUQ1NEQsIDB4QjdDNURDNkUsIDB4QkZEOEU3QTUsIDB4QkJDNkRDNzYsIDB4QjI5NkMxNDgsIDB4Qjc2RkFCNDQsIDB4QkY2NkE4NDYsIDB4QkY2NUE4NDcsIDB4QkY2NkE4NDcsIDB4QkY2NUE4NDcsIDB4QkY2NUE4NDcsIDB4QkY2NUE4NDcsIDB4QkY2NkE4NDcsIDB4QkY2NUE3NDYsIDB4QkY2NkE4NDcsIDB4QkY2NUE3NDYsIDB4QkY2NkE4NDcsIDB4QkY2NUE4NDcsIDB4QkY2NkE4NDcsIDB4QjU3NUFGNDUsIDB4QjhCRUQ4NjcsIDB4QkZEOEU3QTQsIDB4QTZCRUQ5NUIsIDB4MkRCREQ5NkIsIDB4MDFGQ0ZERjcsIDB4MjdEOEU4QTEsIDB4QTlCRUQ4NUEsIDB4QkZEN0U2QTIsIDB4QjY5REM1NEYsIDB4QkY2NUE3NDYsIDB4QkY2NkE4NDcsIDB4QkY2NUE3NDYsIDB4QkY2NUE4NDcsIDB4QkY2NUE4NDcsIDB4QUI4NUJBNDUsIDB4QkVDQ0UwODEsIDB4QkVDRUUxODYsIDB4NTZCNEQ0NEYsIDB4MDhEQkVCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjhBQUNFNTYsIDB4QkY2NUE4NDcsIDB4QkY2NkE4NDcsIDB4QkY2NUE3NDcsIDB4QkY2NUE4NDcsIDB4QkY2NUE3NDYsIDB4QUQ4MEI2NDQsIDB4QkJDQkUwODAsIDB4QkZDRkUyODgsIDB4NUJCNEQ0NEUsIDB4MDhFQkY0RDUsIDB4MDBGRUZFRkQsIDB4MzlDQ0UxODAsIDB4QjVDM0RDNkEsIDB4QkZENUU2OUMsIDB4QjY4RkJFNDksIDB4QkY2NkE4NDcsIDB4QkY2NUE4NDcsIDB4QkY2NkE4NDcsIDB4QkY2NUE3NDYsIDB4Qjc2QkFBNDgsIDB4NzJBRUNGNDksIDB4ODJCN0Q1NEIsIDB4OTk4M0I3NDksIDB4QkY2NkE4NDcsIDB4QkY2NUE4NDcsIDB4QkY2NUE4NDcsIDB4QkY2NUE3NDYsIDB4QkI2QUFBNDgsIDB4QjBCMUQxNTcsIDB4QkZEOEU3QTQsIDB4OUFCQkQ3NTUsIDB4MUNDOEUwODYsIDB4MDVFRkY2RDgsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDNERDNzYsIDB4QkE2RUFDNDgsIDB4QkY2NUE4NDcsIDB4QkY2NUE3NDYsIDB4QkY2NUE4NDcsIDB4QkY2NUE3NDYsIDB4Qjk3MkFFNDcsIDB4QjVDM0RCNjksIDB4QkZENUU1OUEsIDB4NzZCNkQ1NEYsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjUsIDB4OURCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjdBQUNENTcsIDB4QkU2NkE4NDYsIDB4QkY2NkE4NDcsIDB4QkY2NUE4NDcsIDB4QkY2NkE4NDcsIDB4QkY2NUE3NDYsIDB4QTg4Q0JDNDUsIDB4QkRDRUUyOEIsIDB4QkNDQkUwN0UsIDB4NENCM0Q0NTEsIDB4NjVCNUQ0NEIsIDB4QkVDRUUxODksIDB4QkZDOURGN0YsIDB4QkE3MEFENDYsIDB4QkY2NUE4NDcsIDB4QkY2NUE3NDYsIDB4QkY2NkE4NDcsIDB4QkY2NUE3NDYsIDB4QkQ2N0E5NDcsIDB4QThBOUNENEUsIDB4QkZEN0U3QTMsIDB4QTJCRUQ4NUMsIDB4MjFCRURBNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEFFM0VFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZENEU1OTksIDB4QkFCQkQ2NkIsIDB4QkM2OUE5NDUsIDB4QkY2NUE4NDcsIDB4QkY2NUE3NDYsIDB4QkY2NUE4NDcsIDB4QkY2NUE3NDYsIDB4QjM3Q0IzNDMsIDB4QkJDQURGN0UsIDB4QkZDRkUyOEEsIDB4NTdCNEQ0NTAsIDB4MDdFREY1RDksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENEU2OTQsIDB4OUVCQkQ3NTMsIDB4QkZEN0U3QTMsIDB4QjRBNUM5NTUsIDB4QkY2NUE3NDYsIDB4QkY2NUE4NDcsIDB4QkY2NUE3NDYsIDB4QkY2NkE4NDcsIDB4QkY2NUE4NDcsIDB4QTk5MEJDNDQsIDB4QkZEMUUzOTIsIDB4QkFDOERFNzUsIDB4M0JCNUQ2NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDExQjdENkI4LCAweDk4NEY5OTQ2LCAweEJGNjRBNjQ1LCAweEJGOUJDMjUzLCAweEJGRDFERTc0LCAweEJGRDVFMDc1LCAweEJGQzZEODY0LCAweEJGQzhEOTYzLCAweEJGQkZENjVELCAweEJGQUVDRjUzLCAweEJGQTlDRTRGLCAweEJGQTdDQzRFLCAweEJGQTZDQzRELCAweEJGQTNDQjRCLCAweEJGQTFDQTQ5LCAweEJGOUZDOTQ4LCAweEJGOUZDOTQ3LCAweEJGOUZDODQ3LCAweEJGQTFDOTQ4LCAweEJGQTJDOTQ4LCAweEJGQTNDOTQ4LCAweEJGQTRDOTQ4LCAweEJGQTVDOTQ5LCAweEJGOUZDNTRBLCAweEJGOTVCQzQ4LCAweEJGODRBRjQ2LCAweEI3NkNBMDQ1LCAweDFGQjJDREE3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDQxOTZCQjg2LCAweEJFNzJBMjQ1LCAweEJGQUZDNzVGLCAweEJGRTZFOTk3LCAweEJGRjFGNUQ0LCAweEJGRUNFRDkzLCAweEJGRERFMzgwLCAweEJGQzhENzZFLCAweEJGQzFENDZBLCAweEJGQkFEMTY4LCAweEJGQjJDRDY1LCAweEJGQUFDQTYxLCAweEJGQTFDNTVBLCAweEJGOERCQTQ5LCAweEJGODNCNDQ0LCAweEJGN0VCMTQ0LCAweEJGNzhBRDQ0LCAweEJGNzFBQTQ0LCAweEJGNkJBNTQzLCAweEJFNjRBMTQ0LCAweEI5NUI5QzQzLCAweDlDNTE5NzQ1LCAweDBGQzBEOUJFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZCLCAweDNFQkFENzVFLCAweEIyQzFEQTY1LCAweEJGRDZFNjlGLCAweEI3NjNBNzgyLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJCLCAweEEzOEFCRDY3LCAweEJGRDZFNjlGLCAweEIxQzJEQTY2LCAweDI3Q0JFMjg4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFGQzhFMDg1LCAweDk0QjhENTRGLCAweEJGRDdFN0EyLCAweEI5OUVDNzc0LCAweEJEMDM3M0I5LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEFDMkE4ODlGLCAweEI3QzNEQjZELCAweEJGRDRFNTlCLCAweDc5QjdENTRFLCAweDA1RUFGM0QyLCAweDAwRkZGRkZGLCAweDA1RTlGM0QxLCAweDU4QjRENDRDLCAweEJBQzlERTdCLCAweEJGRDFFMzkwLCAweEI2Mzg5MDk3LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEEyNkZBRTc0LCAweEJGRDNFNTk3LCAweEI5QzZERDcyLCAweDM1QzdERjdDLCAweDAwRkVGRUZELCAweDAwRkZGRkZGLCAweDA4RERFQ0I2LCAweDY0QjVENDRDLCAweEJFQ0RFMDg1LCAweEJFQ0JFMDg3LCAweEI1Mjg4N0ExLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJEMDQ3NEI5LCAweEE0OTRDMjY2LCAweEJGRDlFOEFCLCAweEJDQzlERTdGLCAweEJBMjA4M0E2LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJCMDQ3NEI5LCAweEE3QTNDQTYwLCAweEJGRDdFNkEzLCAweEE0QkVEODVCLCAweDFEQjRENTVDLCAweDU2QjVENTRFLCAweEJCQzlERTdBLCAweEJGRDFFMzkwLCAweEI0M0E5MTk2LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJFMDI3M0JCLCAweEE0OUNDNjYxLCAweEJGRDdFN0EyLCAweEFBQkZEOTVFLCAweDFERDBFNDk0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEwREJFQkIxLCAweDc4QjVENDRBLCAweEJGRDJFNDk1LCAweEJDQzJEQjc3LCAweEJBMTI3QkIwLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEI5MDk3NkI1LCAweEFBQjNEMzVGLCAweEJGRDdFN0EzLCAweDk5QkJENzU1LCAweDEwRDdFOEE3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZDLCAweDEyRDNFNjlFLCAweDY2QjVENDRDLCAweEI0QzREQjY5LCAweEJGRDZFNkEwLCAweEJGRDJFNDk1LCAweEI3QkRENzY2LCAweEFGOUVDNTRCLCAweEFDODZCODQ0LCAweEIzNzVBRTQzLCAweEIxNzNBRjQ1LCAweEIxNzJBRTQ2LCAweEI2NkFBODQ1LCAweEJENjVBNjQ2LCAweEJGNjRBNzQ2LCAweEJGNjRBODQ3LCAweEJGNjRBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjNBNjQ2LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEFGOEVCQzQ2LCAweEJFRDBFMjhELCAweEJEQ0VFMTg3LCAweDYzQjRENDRELCAweDA5RTJFRkMxLCAweDI2RDhFOEExLCAweEE5QkREODVBLCAweEJGRDdFNkEyLCAweEI2OURDNTRGLCAweEJFNjRBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjNBNzQ2LCAweEFCODVCQTQ1LCAweEJEQ0NFMDgxLCAweEJFQ0RFMTg2LCAweDU2QjNEMzRFLCAweDA4REJFQkI0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RTNFRUJDLCAweDlBQkJENzU0LCAweEJGRDdFNkEyLCAweEI4QUFDRTU2LCAweEJGNjRBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjNBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEFEN0ZCNTQ0LCAweEJCQ0JFMDgwLCAweEJGQ0VFMTg4LCAweDVBQjRENDRELCAweDA4RUJGNEQ1LCAweDAxRkNGREY4LCAweDRCQkFENzUzLCAweEJBQzhERTc3LCAweEJGRDFFNDkxLCAweEI2N0ZCNTQ3LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEJGNjVBNzQ3LCAweEJGNjRBNzQ2LCAweEIyNzFBRTQ3LCAweEIyQkNENzVFLCAweEJGRDFFMzhELCAweEIxOTFCRjQ5LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEJFNjZBODQ3LCAweEFCQUFDRDRGLCAweEJGRDdFN0EzLCAweEE2QkVEODVDLCAweDI2QzRERTdDLCAweDA1RURGNEQ1LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQjc2LCAweEJBNkRBQjQ4LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjNBNzQ2LCAweEI5NzFBRDQ3LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENDRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCRTBFREI0LCAweDlEQkJENzU0LCAweEJGRDdFNkEzLCAweEI3QTlDQzU3LCAweEJFNjVBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjNBNjQ2LCAweEE4OEJCQzQ1LCAweEJEQ0VFMThBLCAweEJCQ0FERjdELCAweDRCQjNENDUxLCAweDY1QjVENDRCLCAweEJFQ0VFMTg5LCAweEJGQzlERTdFLCAweEI5NkZBQzQ2LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEJGNjVBNzQ2LCAweEJGNjNBNzQ2LCAweEJENjZBODQ3LCAweEE4QTlDQzRFLCAweEJGRDdFN0EyLCAweEEyQkVEODVDLCAweDIwQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNDk5LCAweEJBQkJENTZCLCAweEJDNjhBOTQ1LCAweEJGNjRBNzQ3LCAweEJGNjNBNzQ2LCAweEJGNjRBNzQ2LCAweEJGNjRBNjQ2LCAweEIzN0JCMjQzLCAweEJCQ0FERjdFLCAweEJGQ0VFMjg5LCAweDU3QjRENDRGLCAweDA3RURGNUQ4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE3RDRFNTk0LCAweDlFQkJENzUzLCAweEJGRDdFNkEzLCAweEIzQTVDODU1LCAweEJFNjRBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEJGNjRBNzQ3LCAweEJGNjRBNzQ2LCAweEE5OTBCQzQ0LCAweEJGRDFFMzkyLCAweEJBQzdERDc0LCAweDNCQjVENTU4LCAweDAyRkFGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkRCRUFEQywgMHg3RDVCQTE1NywgMHhCRTVEQTI0NCwgMHhCRjhEQkQ0RiwgMHhCRkM2RDg2QywgMHhCRkNBREI2RCwgMHhCRkJDRDQ1RiwgMHhCRkJFRDU1RiwgMHhCRkEyQ0I0RiwgMHhCRjkyQzY0NiwgMHhCRjkzQzY0NSwgMHhCRjk2Qzc0NywgMHhCRjk3Qzc0NiwgMHhCRjk5Qzc0NywgMHhCRjlBQzc0NiwgMHhCRjlDQzg0NywgMHhCRjlEQzg0NywgMHhCRjlFQzk0OCwgMHhCRjlGQzk0NywgMHhCRkExQ0E0OCwgMHhCRkEyQzk0OCwgMHhCRkE0Q0E0OCwgMHhCRkE0Q0E0OSwgMHhCRkE2Q0I0OSwgMHhCRkEyQzc0OSwgMHhCRjk3QkU0OSwgMHhCRjgyQUY0NiwgMHhBOTY4OUU0NSwgMHgwRENFREZDNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg2MDdFQUM2OCwgMHhCRjc5QTg0NiwgMHhCRkJFRDA2NywgMHhCRkVBRUM4RiwgMHhCRkVCRUM5MiwgMHhCRkRDRTI3RCwgMHhCRkNERDk3MCwgMHhCRkM2RDc2QywgMHhCRkI4RDE1RiwgMHhCRkFDQ0Q1NSwgMHhCRkE2Q0E1MCwgMHhCRkExQzk0QywgMHhCRjlCQzY0OCwgMHhCRjk4QzQ0OCwgMHhCRjk1QzE0NiwgMHhCRjkxQkY0NiwgMHhCRjhEQkQ0NSwgMHhCRjg4QkE0NCwgMHhCRjgxQjU0MywgMHhCRjc5QjA0NCwgMHhCRjZEQTg0MywgMHhCRTVFOUY0MywgMHg0RjZFQTg2NywgMHgwMUZCRkRGQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNEVCRjRENSwgMHg1MkI1RDU1MCwgMHhCOUM4REU3NiwgMHhCRkQyRTQ5MywgMHhCNDQwOTQ5MywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCQTA3NzVCOCwgMHhBOEEwQzg2MiwgMHhCRkQ4RTdBNCwgMHhBMkJERDg1QSwgMHgxOEQ4RTlBNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZCRkRGOCwgMHgyREJGREI2RSwgMHhBNEJERDg1OSwgMHhCRkQ4RTdBNCwgMHhCNjgyQjg3OCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhBNzNGOTQ5MCwgMHhCQkNCRTA3RSwgMHhCRkQwRTI4RCwgMHg2MEJCRDg1QiwgMHgwMUZCRkRGNiwgMHgwMEZGRkZGRiwgMHgwQUU1RjFDOCwgMHg2REI2RDU0QiwgMHhCRUNGRTI4QiwgMHhCREM3REU4MywgMHhCOTIyODRBMywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRTAyNzJCQiwgMHhBNTkyQzE2NCwgMHhCRkQ3RTZBMCwgMHhBREMxREE2MywgMHgyMkM5RTA4NSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMERBRUFBRiwgMHg3QUI2RDU0QSwgMHhCRUQyRTQ5NSwgMHhCREMxREE3NywgMHhCQTEwN0FCMSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCOTBCNzhCNSwgMHhBQUIzRDI1RiwgMHhCRkRDRUFCMSwgMHhCOUI2RDQ3OSwgMHhCQTEwN0FCMSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCMzEyN0JBRiwgMHhBRkIyRDI2NSwgMHhCRkQ3RTZBMiwgMHg5MUJBRDc1MywgMHgxOEM5RTA4OCwgMHg2REI1RDQ0QSwgMHhCRUNGRTI4QywgMHhCRENBREY3RiwgMHhCOTFGODJBNywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCNjBDNzhCNCwgMHhBQkFDQ0Y2MiwgMHhCRkQ4RTdBNCwgMHg5OEJCRDc1NSwgMHgxMURERUNCMiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQUNFRTQ5MywgMHg4REI4RDU0RCwgMHhCRkQ2RTdBMCwgMHhCNkE5Q0Q3NSwgMHhCRDA4NzZCNiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBRTFDODFBOSwgMHhCM0JDRDg2OCwgMHhCRkQ2RTY5RiwgMHg4NEI4RDY0RiwgMHgwOEVFRjVEOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZFRkVGQywgMHgxMEQzRTZBMSwgMHg0RkI4RDY1NywgMHg5Q0JCRDc1NCwgMHhCQ0NDRTA4MCwgMHhCRkQ3RTZBMSwgMHhCRkQ3RTdBMCwgMHhCRUNGRTI4QiwgMHhCOUM4REU3NywgMHhCNEM0REI2QSwgMHhCNEMwRDk2NCwgMHhCNUI4RDQ1RiwgMHhCMEFEQ0U1NCwgMHhCMDhBQkE0NSwgMHhCQzY4QTg0NiwgMHhCRjYzQTY0NiwgMHhCRjY0QTc0NywgMHhCRjYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTc0NiwgMHhCODZDQUE0NSwgMHhCNEJERDc2NCwgMHhCRkQ3RTdBMywgMHg5MkI5RDY1MiwgMHgxOUM4RTA4OCwgMHgyNkQ4RThBMSwgMHhBOUJFRDk1QSwgMHhCRkQ3RTZBMiwgMHhCNjlDQzQ0RiwgMHhCRjYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhBQjg1Qjk0NSwgMHhCRUNDRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkI0RDQ0RSwgMHgwOERDRUNCNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUUzRUZCQywgMHg5QUJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCOEFBQ0U1NiwgMHhCRjYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhCRjYzQTY0NywgMHhCRjYzQTY0NiwgMHhBRDdGQjU0NCwgMHhCQkNCRTA4MCwgMHhCRkNFRTI4OCwgMHg1QUI0RDQ0RCwgMHgwOEVCRjRENSwgMHgwMkZDRkRGOCwgMHg2MEI5RDc1MiwgMHhCQ0NERTE4NiwgMHhCRUNERTE4NCwgMHhCQjc1QjA0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTc0NiwgMHhCMTc4QjI0NiwgMHhCN0M2REQ3MCwgMHhCRkQ5RThBNywgMHhCNzlCQzQ0RSwgMHhCRjY0QTc0NywgMHhCRjYzQTc0NywgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhCRjYzQTc0NywgMHhBODlGQzc0QiwgMHhCRkQ2RTY5RSwgMHhCMEMyREI2NiwgMHgzMUI0RDU1NywgMHgwNkU3RjJDOSwgMHg2RkI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REI3NiwgMHhCQTZEQUI0OCwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhCOTcwQUQ0NywgMHhCNUMzREI2OSwgMHhCRkQ1RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCN0E5Q0Q1NywgMHhCRTYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhBODhCQkM0NSwgMHhCRENFRTI4QiwgMHhCQkNBRTA3RSwgMHg0QkIzRDQ1MSwgMHg2NUI1RDU0QywgMHhCRUNFRTI4OSwgMHhCRkM5REY3RiwgMHhCOTZGQUM0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTc0NywgMHhCRjYzQTc0NiwgMHhCRjYzQTY0NiwgMHhCRDY1QTg0NiwgMHhBOUFBQ0Q0RSwgMHhCRkQ3RTdBMiwgMHhBMkJFRDg1QiwgMHgyMUJFREI3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI4RDU0QywgMHhCRkQ0RTQ5OSwgMHhCQUJBRDU2QiwgMHhCQzY3QTg0NSwgMHhCRjYzQTc0NywgMHhCRjYyQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhCMzdCQjI0MywgMHhCQkNCREY3RSwgMHhCRkNGRTI4QSwgMHg1N0I0RDQ0RiwgMHgwN0VERjVEOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEQ0RTY5NCwgMHg5RUJCRDc1MywgMHhCRkQ4RTdBMywgMHhCNEE1Qzg1NSwgMHhCRTYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYzQTY0NiwgMHhCRjYzQTc0NywgMHhCRjYyQTY0NiwgMHhBOThGQkM0NCwgMHhCRkQxRTM5MiwgMHhCQUM4REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGNkZBRjcsIDB4NUE2RkFENkYsIDB4QkQ1NzlGNDQsIDB4QkY3RUI1NEIsIDB4QkZCN0QyNjMsIDB4QkZCQ0Q0NjQsIDB4QkZCNUQxNUQsIDB4QkZBRUNGNTgsIDB4QkY5NUM3NDgsIDB4QkY4RkM1NDUsIDB4QkY5MkM2NDYsIDB4QkY5M0M2NDYsIDB4QkY5NUM3NDYsIDB4QkY5NkM2NDYsIDB4QkY5OEM3NDYsIDB4QkY5OUM3NDYsIDB4QkY5QkM4NDcsIDB4QkY5Q0M4NDcsIDB4QkY5RUM5NDcsIDB4QkY5RUM5NDcsIDB4QkZBMEM5NDgsIDB4QkZBMEM4NDcsIDB4QkZBM0NBNDgsIDB4QkZBM0M5NDgsIDB4QkZBNENBNDgsIDB4QkZBMUM3NDksIDB4QkY5NUJFNDgsIDB4QkY4MEFENDYsIDB4OTE2NDlDNDUsIDB4MDVFQUYyRTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGM0Y3RjIsIDB4N0U3MkE0NTcsIDB4QkY3RkFDNDcsIDB4QkZDN0Q2NkQsIDB4QkZFOUVCOEIsIDB4QkZFM0U2ODQsIDB4QkZDRERBNzEsIDB4QkZDMkQ1NjcsIDB4QkZBQUNDNEYsIDB4QkZBMkM5NDcsIDB4QkZBMUM5NDgsIDB4QkZBMEM5NDcsIDB4QkY5RkM5NDgsIDB4QkY5RUM4NDcsIDB4QkY5REM4NDcsIDB4QkY5QkM3NDYsIDB4QkY5QUM3NDcsIDB4QkY5N0M1NDYsIDB4QkY5NEMzNDYsIDB4QkY4RUMwNDQsIDB4QkY4NkJCNDMsIDB4QkY3QUIyNDMsIDB4QkY2QUE3NDMsIDB4OUI1NDk5NDQsIDB4MEFDMURBQzAsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDhFN0YyQ0QsIDB4NjhCNUQ0NEIsIDB4QkRDRUUxODgsIDB4QkRDQkUwODQsIDB4QjkyNjg2QTEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QjQxNTdEQUUsIDB4QUZCNEQzNjQsIDB4QkZEN0U3QTIsIDB4OEVCOUQ2NTEsIDB4MENFNUYwQzYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGOEZCRjAsIDB4M0VCNUQ1NTQsIDB4QjBDMkRBNjUsIDB4QkZENkU2OUYsIDB4QjU1RkE1ODQsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTM2M0E3N0EsIDB4QkVEMEUzOEUsIDB4QkFDQURGN0QsIDB4NDZCQkQ4NjAsIDB4MDBGRUZFRkQsIDB4MDBGRkZGRkYsIDB4MTRDRUUzOTUsIDB4ODFCN0Q1NEIsIDB4QkZENEU0OTksIDB4QkJCNkQ0NzgsIDB4QjgwRDc4QjIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjgwQTc3QjUsIDB4QUFBNENBNjQsIDB4QkZEOEU3QTMsIDB4OURCQ0Q3NTcsIDB4MTRERUVEQjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUFDRUUzOTMsIDB4OEZCOEQ2NEQsIDB4QkZENkU2OUYsIDB4QjZBOENENzUsIDB4QkQwNjc1QjYsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QUYxRDgyQTksIDB4QjNCQ0Q3NjgsIDB4QkZEQ0VBQjMsIDB4QjlBMEM4NzMsIDB4QkQwMzczQkEsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QUQyODg3QTAsIDB4QjZDM0RCNkMsIDB4QkZENEU1OUIsIDB4N0FCN0Q1NEUsIDB4MThDMERDNzgsIDB4ODFCN0Q1NEIsIDB4QkZENEU0OTksIDB4QjlCNkQ0NzksIDB4QkEwRjdBQjAsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QUYyMjg0QTYsIDB4QjNCREQ4NjgsIDB4QkZENkU2OUYsIDB4ODJCN0Q1NEYsIDB4MDhFQUYzRDEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjhDMURDNzMsIDB4OUVCQkQ3NTMsIDB4QkZEOEU3QTQsIDB4Qjc4Q0JENzcsIDB4QkUwMjcyQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTgzQTkxOTQsIDB4QkJDN0RENzUsIDB4QkVEMUUzOTMsIDB4NkFCNkQ1NEQsIDB4MDNGMUY3RTIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDZFQUYzRDMsIDB4MjRDM0REN0IsIDB4NURCNUQ1NEYsIDB4OTNCOUQ2NTEsIDB4QjJDM0RCNjcsIDB4QkJDQkRGODEsIDB4QkZEMkUzOTIsIDB4QkZENEU1OUEsIDB4QkZENkU2OUUsIDB4QkZENkU2QTAsIDB4QkZEOEU3QTQsIDB4QkVDRkUyOEIsIDB4QjNBM0M3NEYsIDB4QkM2NUE3NDUsIDB4QkY2MkE2NDcsIDB4QkY2MUE2NDYsIDB4QkY2MkE2NDYsIDB4QkY2MUE1NDYsIDB4QkU2MkE2NDYsIDB4QUNBNEM5NEQsIDB4QkZEN0U3QTMsIDB4QUNDMEQ5NjIsIDB4MkRCRERBNkIsIDB4MjdEM0U2OTcsIDB4QTlCREQ4NTksIDB4QkZENkU2QTIsIDB4QjY5Q0M0NEYsIDB4QkU2MUE2NDYsIDB4QkY2MkE2NDcsIDB4QkY2MUE2NDYsIDB4QkY2MkE2NDYsIDB4QkY2MkE2NDYsIDB4QUI4M0I4NDUsIDB4QkRDQkUwODEsIDB4QkVDREUxODYsIDB4NTZCM0QzNEUsIDB4MDdEQkVCQjMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTMsIDB4QkZEN0U2QTIsIDB4QjhBOUNENTYsIDB4QkY2MUE2NDYsIDB4QkY2MkE2NDYsIDB4QkY2MUE1NDYsIDB4QkY2MkE2NDcsIDB4QkY2MUE1NDYsIDB4QUM3RUI0NDQsIDB4QkFDQkRGODAsIDB4QkZDRUUyODgsIDB4NUFCNEQ0NEQsIDB4MDdFQkY0RDUsIDB4MDNGMkY3RTAsIDB4NzNCOEQ2NEYsIDB4QkVEMUUzOTEsIDB4QkFDNkRENzcsIDB4QkE2RUFDNDUsIDB4QkY2MkE2NDYsIDB4QkY2MUE2NDYsIDB4QkY2MkE2NDYsIDB4QkY2MkE2NDYsIDB4QUY3REI0NDYsIDB4QkJDQURGN0QsIDB4QkZEQUU5QUUsIDB4QjhBMkM4NTUsIDB4QkY2MkE2NDcsIDB4QkY2MUE2NDYsIDB4QkY2MUE2NDcsIDB4QkY2MUE2NDYsIDB4QkY2MkE2NDcsIDB4QUM5MkJGNDgsIDB4QkZEM0U0OTYsIDB4QjhDNkRDNzAsIDB4M0RCNEQ1NTUsIDB4MDdFN0YxQzksIDB4NkVCNkQ0NEEsIDB4QkZEMUUzOTEsIDB4QkVDM0RCNzYsIDB4QkE2QkFBNDgsIDB4QkY2MkE2NDcsIDB4QkY2MUE2NDYsIDB4QkY2MkE2NDcsIDB4QkY2MkE2NDYsIDB4Qjg2RkFDNDcsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ0NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJFMEVEQjQsIDB4OUNCQkQ3NTQsIDB4QkZEN0U2QTIsIDB4QjdBOUNDNTcsIDB4QkU2M0E2NDYsIDB4QkY2MkE2NDcsIDB4QkY2MUE2NDYsIDB4QkY2MkE2NDcsIDB4QkY2MUE2NDYsIDB4QTg4QUJCNDUsIDB4QkRDRUUxOEEsIDB4QkJDQURGN0QsIDB4NEJCM0Q0NTEsIDB4NjRCNUQ1NEIsIDB4QkVDRUUxODgsIDB4QkZDOURFN0UsIDB4Qjk2RUFDNDYsIDB4QkY2MkE2NDcsIDB4QkY2MUE1NDYsIDB4QkY2MkE2NDYsIDB4QkY2MUE2NDYsIDB4QkQ2NEE3NDYsIDB4QThBOUNDNEUsIDB4QkZEN0U3QTIsIDB4QTJCRUQ4NUIsIDB4MjBCRERBNzAsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFMkVFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZEM0U0OTksIDB4QkFCQkQ1NkIsIDB4QkM2N0E4NDUsIDB4QkY2MkE2NDYsIDB4QkY2MUE2NDYsIDB4QkY2MkE2NDcsIDB4QkY2MkE2NDYsIDB4QjI3QUIyNDMsIDB4QkJDQURGN0QsIDB4QkZDRkUyODksIDB4NTdCNEQ0NEYsIDB4MDdFREY1RDgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENEU2OTQsIDB4OUVCQkQ3NTMsIDB4QkZEN0U2QTIsIDB4QjRBNEM4NTUsIDB4QkU2MkE2NDYsIDB4QkY2MkE2NDYsIDB4QkY2MkE2NDYsIDB4QkY2MkE2NDcsIDB4QkY2MUE2NDYsIDB4QTg4RUJCNDMsIDB4QkVEMUUzOTEsIDB4QkFDN0RFNzUsIDB4M0JCNUQ1NTcsIDB4MDJGQUZDRjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkJGREZCLCAweDNBN0FCNDdDLCAweEI3NTE5QzQ0LCAweEJGNzNCMDQ5LCAweEJGQTNDODU4LCAweEJGQUVDRjVFLCAweEJGQUNDRTU5LCAweEJGQTBDQjUyLCAweEJGOERDNDQ1LCAweEJGOEVDNTQ1LCAweEJGOEZDNDQ1LCAweEJGOTJDNjQ2LCAweEJGOTJDNjQ2LCAweEJGOTRDNzQ2LCAweEJGOTVDNzQ2LCAweEJGOTdDNzQ3LCAweEJGOThDNzQ2LCAweEJGOUFDODQ3LCAweEJGOUJDODQ2LCAweEJGOURDOTQ3LCAweEJGOUVDOTQ3LCAweEJGOUZDOTQ4LCAweEJGQTBDOTQ3LCAweEJGQTJDQTQ4LCAweEJGQTJDOTQ4LCAweEJGQTNDQTQ4LCAweEJGOUZDNjQ5LCAweEJGOTNCQzQ4LCAweEJGN0JBQjQ1LCAweDc3NkZBNDU3LCAweDAxRjNGN0YxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA3RTVFRUUxLCAweDk5NjQ5QzQ0LCAweEJGODdCMjRBLCAweEJGQzVENTZELCAweEJGRTJFNzg1LCAweEJGRDJERDc3LCAweEJGQzFENTY2LCAweEJGQTZDQTRBLCAweEJGQTNDQTQ4LCAweEJGQTFDOTQ4LCAweEJGQTFDQTQ4LCAweEJGOUZDOTQ3LCAweEJGOUZDOTQ4LCAweEJGOURDODQ3LCAweEJGOURDOTQ3LCAweEJGOUJDNzQ3LCAweEJGOUFDODQ3LCAweEJGOThDNzQ2LCAweEJGOTdDNzQ3LCAweEJGOTRDNjQ2LCAweEJGOEZDMjQ1LCAweEJGODhCQjQ0LCAweEJGN0FCMjQ1LCAweEJENUZBMDQzLCAweDQyN0JCMjc2LCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDExRDNFNkExLCAweDdEQjdENTRCLCAweEJGRDNFNDk2LCAweEJCQkFENzdCLCAweEI4MTM3Q0FFLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEFEMjg4N0ExLCAweEI1QzREQzZDLCAweEJGRDVFNTlBLCAweDc4QjhENjUwLCAweDA1RUZGNkRCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRjZGQUVDLCAweDUxQjVENTUxLCAweEJCQzhERTc1LCAweEJGRDJFNDk0LCAweEI2NDQ5NjkwLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDE3MkJCLCAweEEzN0JCNDZGLCAweEJGRDVFNTlCLCAweEI0QzREQzZDLCAweDJFQzZERTdBLCAweDAwRkVGRkZFLCAweDAwRkZGRkZGLCAweDFGQ0RFMzkxLCAweDk2QkFENzUwLCAweEJGRDdFN0EyLCAweEI4QTJDQTcyLCAweEJFMDE3MkJBLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEIzMUE4MEFCLCAweEIwQkREODY0LCAweEJGRDdFNkExLCAweDg5QjhENTUwLCAweDBBRTNGMEMzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI4QzBEQjcxLCAweDlGQkNENzU1LCAweEJGRDhFN0E0LCAweEI4OEJCRDc4LCAweEJFMDE3MkJBLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE4M0M5Mzk0LCAweEJCQzdERTc2LCAweEJGREJFQUFGLCAweEI1ODNCODc4LCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEE3M0U5NDkxLCAweEJCQ0FERjdELCAweEJFRDBFMjhFLCAweDYxQkFENzU4LCAweDIwQzJERDc4LCAweDk0QjlENjRGLCAweEJGRDdFN0EyLCAweEI5QTBDODc1LCAweEJDMDM3M0I5LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEE5Mzc5MDk3LCAweEI5QzhERTc3LCAweEJGRDJFNDkzLCAweDY5QjhENjUzLCAweDAyRjJGOEUzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRjlGQ0YzLCAweDM3QkNEOTY1LCAweEFEQzBEOTYwLCAweEJGRDdFN0ExLCAweEI2NkZBRDdFLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE0NTE5RTg2LCAweEJEQ0VFMjg4LCAweEJFQ0RFMDgzLCAweDRGQkZEQTY2LCAweDAwRkNGREY4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZELCAweDA4RTdGMkNCLCAweDFBQ0NFMjkwLCAweDM2QjhENzVGLCAweDUyQjNENDRGLCAweDZBQjZENTRELCAweDc4QjZENTRELCAweDdEQjhENjUwLCAweDg3QjhENTRGLCAweEE4QkZEOTVELCAweEJFRDNFNDk1LCAweEJFQ0ZFMjhCLCAweEI0ODNCNzQ1LCAweEJGNjFBNjQ3LCAweEJGNjFBNjQ2LCAweEJGNjFBNjQ3LCAweEJGNjBBNTQ2LCAweEJGNjFBNjQ3LCAweEFDOEVCQzQ1LCAweEJGRDNFNTk4LCAweEI4QzZERDcyLCAweDNGQjRENTU0LCAweDI5Q0VFMzhELCAweEE5QkVEODVBLCAweEJGRDdFNkEyLCAweEI2OUNDNDRGLCAweEJGNjFBNTQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNTQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNjQ3LCAweEFCODNCOTQ1LCAweEJFQ0NFMDgxLCAweEJFQ0VFMjg2LCAweDU2QjRENDRFLCAweDA4RENFQkI0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5RTNFRkJDLCAweDlBQkJENzU0LCAweEJGRDdFNkEzLCAweEI4QTlDRDU2LCAweEJGNjFBNjQ3LCAweEJGNjFBNjQ3LCAweEJGNjBBNTQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNjQ3LCAweEFEN0RCNTQ1LCAweEJCQ0JFMDgwLCAweEJGQ0VFMjg4LCAweDVCQjRENDRFLCAweDA4RUJGNEQ1LCAweDBCRTZGMUMzLCAweDg0QjdENTRCLCAweEJGRDVFNTlCLCAweEJCQkJENjZDLCAweEJCNjdBODQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNTQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNjQ2LCAweEE3OEJCQzQ2LCAweEJFQ0ZFMjhBLCAweEJGREJFOUFELCAweEI0QUZEMDVDLCAweEJGNjJBNjQ3LCAweEJGNjFBNjQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNTQ2LCAweEJGNjFBNjQ3LCAweEFCODlCQjQ2LCAweEJGRDBFMjhCLCAweEJDQ0JERjdFLCAweDRFQjVENTUyLCAweDA4RTZGMUM1LCAweDZFQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzREQzc3LCAweEJBNkJBQTQ4LCAweEJGNjFBNjQ2LCAweEJGNjBBNTQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNTQ2LCAweEI5NkVBQzQ3LCAweEI1QzNEQjY5LCAweEJGRDVFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI1LCAweDlEQkJENzU0LCAweEJGRDdFNkEzLCAweEI3QTlDQzU3LCAweEJFNjJBNjQ3LCAweEJGNjFBNjQ3LCAweEJGNjBBNTQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNTQ2LCAweEE4OEFCQjQ1LCAweEJEQ0VFMjhBLCAweEJDQ0JFMDdFLCAweDRDQjRENDUxLCAweDY1QjVENTRCLCAweEJFQ0VFMTg5LCAweEJGQzlERjdGLCAweEJBNkRBQzQ2LCAweEJGNjFBNjQ3LCAweEJGNjBBNTQ2LCAweEJGNjFBNjQ3LCAweEJGNjBBNTQ2LCAweEJENjNBNzQ3LCAweEE4QTlDQzRFLCAweEJGRDdFN0EzLCAweEEyQkVEODVDLCAweDIxQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBBRTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNDk5LCAweEJBQkJENTZCLCAweEJDNjVBNzQ1LCAweEJGNjFBNjQ3LCAweEJGNjFBNTQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNjQ3LCAweEIzN0FCMTQzLCAweEJCQ0JERjdFLCAweEJGQ0ZFMjhBLCAweDU3QjRENDUwLCAweDA3RURGNUQ5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RDRFNjk0LCAweDlFQkJENzUzLCAweEJGRDdFN0EzLCAweEI0QTVDODU1LCAweEJGNjFBNjQ3LCAweEJGNjFBNjQ3LCAweEJGNjFBNTQ2LCAweEJGNjFBNjQ3LCAweEJGNjFBNTQ2LCAweEE5OEVCQjQ0LCAweEJGRDFFMzkyLCAweEJBQzhERTc1LCAweDNCQjVENTU4LCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkZGRSwgMHgyMEFERDFCMCwgMHhBQTRDOUI0NiwgMHhCRjY3QTk0NywgMHhCRjk0QzM1MiwgMHhCRjlGQzg1NSwgMHhCRkEyQ0I1NiwgMHhCRjkyQzY0QSwgMHhCRjhBQzU0NCwgMHhCRjhDQzQ0NCwgMHhCRjhEQzQ0NSwgMHhCRjhGQzQ0NSwgMHhCRjkxQzU0NSwgMHhCRjkxQzU0NSwgMHhCRjk0Qzc0NiwgMHhCRjk0QzY0NiwgMHhCRjk2Qzc0NywgMHhCRjk4QzY0NiwgMHhCRjk5Qzc0NywgMHhCRjlBQzc0NiwgMHhCRjlDQzg0NywgMHhCRjlDQzg0NiwgMHhCRjlFQzk0OCwgMHhCRjlGQzg0NywgMHhCRkEwQzk0NywgMHhCRkExQzk0NywgMHhCRkEyQzk0OCwgMHhCRjlEQzU0OSwgMHhCRjhGQjk0NywgMHhCRTc1QTc0NSwgMHg1OTgzQjA3MCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkJCRDRCMywgMHhBRDY4OUU0NCwgMHhCRjkwQjc0RSwgMHhCRkJGRDM2QSwgMHhCRkMxRDU2QiwgMHhCRkMxRDQ2QSwgMHhCRkFBQ0M1MCwgMHhCRkEyQzk0OCwgMHhCRkEyQzk0OCwgMHhCRkExQzk0NywgMHhCRkEwQzk0OCwgMHhCRjlFQzg0NywgMHhCRjlFQzk0NywgMHhCRjlDQzg0NiwgMHhCRjlDQzg0NywgMHhCRjlBQzc0NiwgMHhCRjk5Qzc0NiwgMHhCRjk3Qzc0NiwgMHhCRjk2Qzc0NiwgMHhCRjk0QzY0NiwgMHhCRjk0QzY0NywgMHhCRkE1Qzk0RCwgMHhCRjk3QzE0RSwgMHhCRjY5QTg0MywgMHg5MzUzOUE0NywgMHgwNkRBRTlEOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0NERTM5MSwgMHg5MEI5RDY0RSwgMHhCRkQ2RTZBMCwgMHhCQUE4Q0Q3MiwgMHhCQzAzNzNCOSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNjQ0OTY4RiwgMHhCQkNBREY3RCwgMHhCRUQwRTM4RSwgMHg1REI4RDY1NSwgMHgwMUZDRkRGOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOURFRUNCOSwgMHg2N0I1RDQ0QiwgMHhCRENFRTE4NywgMHhCRkNCRTA4NCwgMHhCNTIzODRBNSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRDAzNzNCQSwgMHhBNTlDQzY2MywgMHhCRkQ3RTdBMywgMHhBOEJFRDg1RCwgMHgxQkQ0RTc5RiwgMHgwMEZGRkZGRiwgMHgwMUZERkVGQSwgMHgyREI3RDY1RSwgMHhBNUJERDg1OSwgMHhCRkQ3RTZBMywgMHhCNTdGQjY3QiwgMHhCRjAwNzJCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBQjJEOEE5RCwgMHhCN0M2REM3MSwgMHhCRkQzRTU5NywgMHg3MEI4RDU1MSwgMHgwM0Y0RjlFOCwgMHgwMEZGRkZGRiwgMHgwMUZBRkNGNCwgMHgzOEJDRDk2NSwgMHhBRUMwREE2MSwgMHhCRkQ2RTZBMCwgMHhCNTZFQUQ3RiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNDUzOUY4NCwgMHhCRENFRTE4OSwgMHhCRkQ3RTdBNCwgMHhCNjYwQTU4NCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMzYyQTc3QiwgMHhCRkQwRTI4RCwgMHhCQkNBREY3RSwgMHg0NkI4RDY1OCwgMHgyREMwREI3MSwgMHhBNEJERDg1OSwgMHhCRkQ3RTdBMywgMHhCNTgyQjg3OCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNTU2QTA4MywgMHhCRENERTE4NywgMHhCRENERTE4NCwgMHg0RUJBRDg1RCwgMHgwMUZFRkZGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwM0YxRjdFMywgMHg0QUI0RDQ0RiwgMHhCNkM1REM2RSwgMHhCRkQ0RTU5OSwgMHhCNTREOUI4QywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhBNDcyQjA3MiwgMHhCRkQzRTQ5NywgMHhCN0M2REQ3MiwgMHgzNkMxREM3MCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkVGRSwgMHgwMUZCRkRGNiwgMHgwNEU4RjJDRSwgMHgwQUU4RjJDRiwgMHgwREQ1RThBNywgMHgwRkNERTM5NSwgMHgxMkNERTM5NCwgMHgzREI5RDc1QywgMHhBQkJGRDk1RCwgMHhCRkQ4RTdBNCwgMHhCODlFQzQ1MSwgMHhCRjYwQTU0NiwgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NywgMHhBRDg0QjY0MywgMHhCRUQwRTI4RCwgMHhCRENBREY3QiwgMHg0N0I0RDQ1MiwgMHgyQUNFRTM4QywgMHhBOUJERDg1QSwgMHhCRkQ3RTZBMiwgMHhCNjlCQzQ0RSwgMHhCRTVGQTU0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhCRjVGQTU0NywgMHhCRjVGQTU0NiwgMHhBQjgyQjg0NSwgMHhCRENDRTA4MSwgMHhCRUNFRTE4NiwgMHg1NkIzRDM0RSwgMHgwOERCRUJCMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOEUzRUZCQywgMHg5QUJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCOEE5Q0Q1NiwgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NiwgMHhCRjYwQTU0NywgMHhBRDdEQjQ0NCwgMHhCQkNCRTA4MCwgMHhCRkNFRTE4OCwgMHg1QUI0RDQ0RCwgMHgwOEVCRjRENSwgMHgxNEU2RjBDMywgMHg5M0I5RDY0RiwgMHhCRkQ2RTZBMSwgMHhCQkIyRDE1RiwgMHhCRTYxQTU0NiwgMHhCRjVGQTU0NywgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhBQTk0QzE0NywgMHhCRkQyRTQ5NSwgMHhCRkRBRTlBQiwgMHhCNkJBRDY2MywgMHhCRTYzQTY0NywgMHhCRjVGQTQ0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NywgMHhBOTdFQjU0NiwgMHhCRUNCRTA3RSwgMHhCRENGRTI4QiwgMHg2MEI0RDQ0RSwgMHgwQ0NERTM5MiwgMHg2RUI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUMzREI3NiwgMHhCQTY5QTk0OCwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhCOTZEQUM0NywgMHhCNUMyREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDQ0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkRGRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0E4Q0M1NywgMHhCRTYwQTU0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTQ0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTQ0NiwgMHhBODg5QkI0NSwgMHhCRENFRTE4QSwgMHhCQkNBREY3RCwgMHg0QkIzRDQ1MSwgMHg2NUI1RDQ0QiwgMHhCRUNFRTE4OSwgMHhCRkM5REU3RSwgMHhCOTZDQUI0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NiwgMHhCRjVGQTU0NiwgMHhCRDYyQTY0NiwgMHhBOEE5Q0M0RSwgMHhCRkQ3RTZBMiwgMHhBMkJERDg1QywgMHgyMEJEREE3MCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUyRUVCNywgMHg3RkI4RDU0QywgMHhCRkQzRTQ5OSwgMHhCQUJBRDU2QiwgMHhCQzY0QTc0NSwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTQ0NiwgMHhCMzc5QjE0MywgMHhCQkNBREY3RSwgMHhCRkNGRTI4OSwgMHg1N0I0RDQ0RiwgMHgwN0VERjVEOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxN0Q0RTU5NCwgMHg5RUJCRDc1MywgMHhCRkQ3RTdBMywgMHhCM0E0Qzg1NSwgMHhCRTVGQTQ0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTU0NiwgMHhCRjYwQTU0NywgMHhCRjVGQTQ0NiwgMHhBOThFQkI0NCwgMHhCRkQxRTM5MiwgMHhCQUM3REU3NCwgMHgzQkI1RDU1NywgMHgwMkZBRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEZEOEU5REEsIDB4OTU0Nzk5NDgsIDB4QkY1RkE3NDcsIDB4QkY4RUJGNTEsIDB4QkY5OEM2NTQsIDB4QkY5NkM3NTAsIDB4QkY4OUM1NDYsIDB4QkY4OEM0NDQsIDB4QkY4QUM1NDQsIDB4QkY4QkM0NDQsIDB4QkY4REM0NDUsIDB4QkY4RUM1NDUsIDB4QkY5MEM1NDYsIDB4QkY5MUM1NDUsIDB4QkY5M0M2NDYsIDB4QkY5M0M2NDYsIDB4QkY5NUM3NDYsIDB4QkY5NkM3NDYsIDB4QkY5OEM3NDcsIDB4QkY5OUM3NDYsIDB4QkY5QkM4NDcsIDB4QkY5Q0M4NDYsIDB4QkY5REM5NDcsIDB4QkY5RUM5NDcsIDB4QkY5RkM5NDgsIDB4QkZBMEM5NDcsIDB4QkZBMUM5NDgsIDB4QkY5QUMzNDgsIDB4QkY4QUI3NDYsIDB4QkQ2RkE0NDQsIDB4Mzk5M0JCODQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjZBQkM5QTAsIDB4Qjk2REEyNDQsIDB4QkY5OEJENTMsIDB4QkZCOEQwNjcsIDB4QkZCQUQxNjgsIDB4QkZCNkQwNjIsIDB4QkZBM0NBNDgsIDB4QkZBMUM5NDgsIDB4QkZBMUNBNDgsIDB4QkY5RkM5NDgsIDB4QkY5RkM5NDgsIDB4QkY5REM4NDcsIDB4QkY5REM5NDcsIDB4QkY5Q0M4NDYsIDB4QkY5QkM4NDcsIDB4QkY5OUM3NDYsIDB4QkY5OEM3NDcsIDB4QkY5NkM3NDYsIDB4QkY5NUM3NDcsIDB4QkY5M0M2NDYsIDB4QkZBMUNBNEEsIDB4QkZBRkNENTEsIDB4QkZCRUQ2NkUsIDB4QkY3N0IxNDQsIDB4QkM1Q0EwNDQsIDB4MzY5RkM3OUMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkIsIDB4MjlCRURBNkUsIDB4QTFCQ0Q4NTYsIDB4QkZEN0U3QTMsIDB4QjU4OUJDNzgsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QTQ2NEE4N0IsIDB4QkZEMEUyOEQsIDB4QkJDQkRGN0QsIDB4NDNCOEQ2NTksIDB4MDFGQ0ZFRjksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTFEREVDQjYsIDB4N0RCN0Q1NEIsIDB4QkVEM0U0OTcsIDB4QkFCRkQ5NzcsIDB4QkMxMDdBQjAsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjYwRDc5QjQsIDB4QUNCMkQyNjAsIDB4QkZEOEU3QTQsIDB4OTVCQUQ3NTQsIDB4MEZEREVDQjMsIDB4MDBGRkZGRkYsIDB4MDFGQ0ZFRjgsIDB4M0VCN0Q2NUEsIDB4QjNDMkRCNjUsIDB4QkZENUU2OUUsIDB4Qjg2M0E3ODMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTU1MDlEODcsIDB4QkRDQ0UwODIsIDB4QkVDRkUyODksIDB4NTZCN0Q2NTQsIDB4MDFGQkZERjcsIDB4MDBGRkZGRkYsIDB4MDNGMUY4RTEsIDB4NEJCNEQ0NEUsIDB4QjdDNkRENzAsIDB4QkZEM0U0OTgsIDB4Qjc0QjlCOEUsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTU3NkIyNzEsIDB4QkZENEU1OUEsIDB4QkZEM0U0OTYsIDB4QjY0NDk3OTAsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMTcyQkMsIDB4QTM3QUI0NzAsIDB4QkZENUU1OUIsIDB4QjVDNERDNkMsIDB4MkZDNURFNzgsIDB4M0VCNEQ0NTMsIDB4QjFDMkRCNjYsIDB4QkZENkU2OUYsIDB4QjY2MEE2ODUsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkUwMDcxQkIsIDB4QTM3NEIxNzMsIDB4QkZEM0U0OTYsIDB4QjdDN0RENzMsIDB4MzZDMkRDNzIsIDB4MDFGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDZFOUYzRDAsIDB4NUVCNUQ1NEQsIDB4QkRDQkRGN0YsIDB4QkVDRUUxOEQsIDB4QjczNThFOTksIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkQwMzczQkEsIDB4QTQ4Q0JENjgsIDB4QkZEN0U2QTAsIDB4QURDMURBNjMsIDB4MjNEM0U2OUEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThEOEU5QTIsIDB4OThCQUQ2NTIsIDB4QkZEOEU3QTMsIDB4QkFBM0M3NTcsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QUY4MkI1NDMsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0QsIDB4NEJCNEQ0NTIsIDB4MkJDRUUzOEQsIDB4QTlCRUQ4NUEsIDB4QkZEN0U3QTIsIDB4QjY5QkM0NEYsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE1NDYsIDB4QUI4MkI4NDUsIDB4QkVDQ0UwODEsIDB4QkVDRUUxODYsIDB4NTZCNEQ0NEUsIDB4MDhEQ0VCQjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFM0VGQkMsIDB4OUFCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjhBOUNENTYsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RkE0NDcsIDB4QUQ3Q0I0NDUsIDB4QkJDQkUwODEsIDB4QkZDRUUyODgsIDB4NUFCNEQ0NEUsIDB4MDhFQkY0RDUsIDB4MURENkU3OUEsIDB4QTJCQ0Q4NTYsIDB4QkZEN0U3QTMsIDB4QjZBNkNCNTYsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDYsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QUE5REM2NEIsIDB4QkZENUU2OUUsIDB4QkZEOUU4QTUsIDB4QkRDMEQ5NkQsIDB4QkI2NkE4NDgsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RkE1NDcsIDB4QkY1RkE1NDcsIDB4QjE3M0FFNDcsIDB4QjlDNkRENzIsIDB4QkZEM0U0OTYsIDB4NzBCNkQ1NEUsIDB4MTBDREUzOTEsIDB4NkZCNkQ1NEIsIDB4QkZEMUUzOTEsIDB4QkVDM0RCNzYsIDB4QkE2OUE5NDgsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4Qjk2REFDNDcsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjQsIDB4OURCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjdBOUNDNTcsIDB4QkU1RkE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDYsIDB4QkY1RUE0NDYsIDB4QTg4OUJCNDUsIDB4QkRDRUUyOEIsIDB4QkJDQkRGN0QsIDB4NEJCM0Q0NTEsIDB4NjVCNkQ1NEIsIDB4QkVDRUUxODksIDB4QkZDOURGN0YsIDB4Qjk2QkFCNDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QkY1RUE1NDcsIDB4QkY1RUE0NDYsIDB4QkQ2MUE2NDcsIDB4QTlBOUNDNEUsIDB4QkZEN0U3QTIsIDB4QTJCRUQ4NUMsIDB4MjFCRURCNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFM0VFQjcsIDB4N0ZCOEQ1NEMsIDB4QkZENEU1OTksIDB4QkFCQUQ1NkIsIDB4QkM2M0E2NDUsIDB4QkY1RkE1NDcsIDB4QkY1RkE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QjM3OEIxNDMsIDB4QkJDQURGN0UsIDB4QkZDRkUyODksIDB4NTdCNEQ0NEYsIDB4MDdFREY1RDksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENEU1OTIsIDB4OUVCQkQ3NTMsIDB4QkZEN0U3QTMsIDB4QjRBNEM4NTUsIDB4QkU1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QkY1RkE1NDcsIDB4QkY1RUE0NDYsIDB4QTk4RUJCNDQsIDB4QkZEMkUzOTIsIDB4QkFDN0RFNzUsIDB4M0JCNUQ1NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1REJFQkRELCAweDc4NTRBMTU5LCAweEJFNTVBMTQ1LCAweEJGODZCQzRGLCAweEJGOTVDNDUzLCAweEJGOERDNDRCLCAweEJGODRDMzQzLCAweEJGODVDMzQzLCAweEJGODZDMzQzLCAweEJGODlDNTQ0LCAweEJGOEFDNTQ0LCAweEJGOENDNDQ1LCAweEJGOERDNDQ0LCAweEJGOEZDNTQ1LCAweEJGOTBDNTQ1LCAweEJGOTJDNjQ2LCAweEJGOTNDNjQ2LCAweEJGOTVDNzQ2LCAweEJGOTVDNzQ2LCAweEJGOTdDNzQ2LCAweEJGOTdDNjQ2LCAweEJGOUFDNzQ2LCAweEJGOUFDNzQ2LCAweEJGOUNDODQ3LCAweEJGOUNDODQ2LCAweEJGOUVDOTQ3LCAweEJGOUVDOTQ3LCAweEJGOUZDODQ4LCAweEJGOTZDMTQ3LCAweEJGODVCNDQ1LCAweEI3NjlBMTQ0LCAweDIwQkFENEIxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDQwOUJDMDhFLCAweEJFNzFBNTQ0LCAweEJGOURDMTU3LCAweEJGQjFDRDY0LCAweEJGQjNDRTY1LCAweEJGQUNDQzU5LCAweEJGQTFDOTQ4LCAweEJGQTBDOTQ3LCAweEJGOUZDOTQ3LCAweEJGOUVDODQ3LCAweEJGOURDOTQ3LCAweEJGOUNDODQ2LCAweEJGOUJDODQ3LCAweEJGOUFDNzQ2LCAweEJGOUFDNzQ3LCAweEJGOTdDNjQ2LCAweEJGOTdDNzQ3LCAweEJGOTVDNzQ2LCAweEJGOTRDNzQ2LCAweEJGOTJDNTQ1LCAweEJGQUFDQzRDLCAweEJGQjBDRTUxLCAweEJGRDBFMDgwLCAweEJGOTNCRjRGLCAweEJGNjZBNjQzLCAweDg2NURBMDU0LCAweDA0RjBGNkYwLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkNGREY4LCAweDM4QjZENTU5LCAweEFFQzBEQTYxLCAweEJGRDZFNkEwLCAweEI2NjlBQTgxLCAweEJFMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJCLCAweEEyN0NCNTZFLCAweEJGRDRFNTlBLCAweEI1QzREQzZCLCAweDJCQ0RFMjhDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDQzVERTdGLCAweDkwQjhENjRFLCAweEJGRDZFNkEwLCAweEI3QTNDQTc2LCAweEJDMDY3NUI2LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEFEMjQ4NUE1LCAweEI1QkREODZBLCAweEJGRDZFNjlFLCAweDdGQjdENTRFLCAweDA3RUZGNkRCLCAweDAwRkZGRkZGLCAweDA0RTdGMkNDLCAweDUyQjRENDRFLCAweEJBQzhERTc3LCAweEJGRDFFMzkyLCAweEI0NDE5NTkzLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJCLCAweEEzNjlBQTc5LCAweEJGRDFFMzkyLCAweEJBQzhERTc3LCAweDNCQzVERDc2LCAweDAwRkVGRUZDLCAweDAwRkZGRkZGLCAweDA3RTlGM0QxLCAweDVFQjRENDRDLCAweEJFQ0NFMDgxLCAweEJEQ0NFMDhCLCAweEI4MzM4RDlBLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJDMDI3M0I5LCAweEE1OERCRTY4LCAweEJGRDhFN0E3LCAweEJFQ0NFMDg0LCAweEI2MjM4NUE0LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJFMDI3M0JBLCAweEE1OURDNjYxLCAweEJGRDdFN0EzLCAweEE5QkVEOTVELCAweDNCQkREQTY3LCAweDU4QjRENDRELCAweEJCQzhERTc1LCAweEJFRDFFMzkzLCAweEI3NDQ5NzkwLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDE3MkJBLCAweEE0OEZCRjY3LCAweEJGRDZFNkEwLCAweEFGQzFEQTYyLCAweDNEQzBEQjZCLCAweDJBRDBFNDk0LCAweDI5Q0ZFNDkzLCAweDJBRDBFNDk0LCAweDI5Q0ZFNDkzLCAweDJBRDBFNDk0LCAweDI5Q0ZFNDkzLCAweDJBRDBFNDk0LCAweDI5RDBFNDkzLCAweDJBRDBFNDk0LCAweDI5Q0ZFNDkzLCAweDJBRDBFNDk0LCAweDI2Q0ZFNDkzLCAweDBCRERFQ0I1LCAweDAwRkVGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBERDZFOEE3LCAweDc0QjZENTRBLCAweEJFRDFFMzkwLCAweEJFQzNEQjdELCAweEI2MTc3RUFDLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJBMDk3N0I2LCAweEE4QUFDRDYxLCAweEJGRDhFN0E0LCAweDlEQkJENzU3LCAweDE0RENFQkIwLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE0LCAweDk2QkFENjUxLCAweEJGRDdFN0EzLCAweEI5QTJDNjU3LCAweEJFNUVBNDQ2LCAweEJGNURBNDQ2LCAweEJGNURBNDQ3LCAweEJGNURBMzQ2LCAweEJGNURBNDQ3LCAweEFGODFCNTQzLCAweEJFQ0ZFMjhBLCAweEJEQ0FERjdDLCAweDVFQjVENDRELCAweDRCQkZEQTY0LCAweEE5QkREODU5LCAweEJGRDZFNkEyLCAweEI2OUFDMzRGLCAweEJFNURBMzQ2LCAweEJGNURBNDQ2LCAweEJGNURBMzQ2LCAweEJGNUVBNDQ3LCAweEJGNURBNDQ2LCAweEFCODFCNzQ0LCAweEJEQ0JFMDgxLCAweEJFQ0VFMTg2LCAweDY2QjRENDRBLCAweDNDQzRERDczLCAweDM4RDFFNDkwLCAweDM5RDJFNTkxLCAweDQzQzZERTc2LCAweDlDQkJENzUzLCAweEJGRDdFNkEyLCAweEI4QThDRDU2LCAweEJGNURBNDQ2LCAweEJGNUVBNDQ2LCAweEJGNURBNDQ2LCAweEJGNURBNDQ3LCAweEJGNURBNDQ2LCAweEFDN0JCMzQ0LCAweEJBQ0JERjgwLCAweEJGQ0VFMTg4LCAweDZBQjRENDRBLCAweDNDQ0FFMTgwLCAweDRBQkVEOTYwLCAweEFCQkZEQTVGLCAweEJGRDdFNkExLCAweEI4OTVDMTRGLCAweEJGNURBNDQ2LCAweEJGNURBNDQ2LCAweEJGNURBNDQ2LCAweEJGNURBNDQ3LCAweEJFNUVBNDQ2LCAweEE4QURDRjUxLCAweEJGRDdFNkEyLCAweEJGRDZFNTlELCAweEJDQzVEQzc5LCAweEI4NkNBQjQ3LCAweEJGNURBNDQ2LCAweEJGNUVBNDQ2LCAweEJGNURBNDQ2LCAweEJGNURBNDQ2LCAweEI4NjlBQTQ3LCAweEIyQzJEQTY2LCAweEJGRDVFNTlELCAweDgwQjdENTRFLCAweDE2QzZERTgxLCAweDZFQjZENDRBLCAweEJGRDFFMzkwLCAweEJFQzNEQjc2LCAweEJBNjdBODQ4LCAweEJGNURBNDQ3LCAweEJGNURBNDQ2LCAweEJGNURBNDQ3LCAweEJGNURBNDQ2LCAweEI4NkNBQjQ3LCAweEI1QzJEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCRTBFREI0LCAweDlDQkJENzU0LCAweEJGRDdFNkEyLCAweEI3QThDQzU3LCAweEJFNUVBNDQ2LCAweEJGNURBNDQ3LCAweEJGNURBMzQ2LCAweEJGNUVBNDQ3LCAweEJGNURBNDQ2LCAweEE4ODhCQTQ1LCAweEJEQ0VFMThBLCAweEJCQ0FERjdELCAweDVFQjVENDRDLCAweDZFQjVENDQ5LCAweEJFQ0VFMTg4LCAweEJGQzlERTdFLCAweEI5NkFBQTQ2LCAweEJGNURBNDQ2LCAweEJGNURBMzQ2LCAweEJGNURBNDQ2LCAweEJGNURBNDQ2LCAweEJENUZBNTQ2LCAweEE4QThDQzRFLCAweEJGRDdFN0EyLCAweEE0QkREODVCLCAweDQ2QjlENzVBLCAweDM4RDFFNDkwLCAweDM5RDJFNTkxLCAweDM5RDJFNDkwLCAweDM5RDJFNTkwLCAweDM4RDFFNDkwLCAweDM5RDJFNTkxLCAweDM5RDFFNDkwLCAweDM5RDJFNTkxLCAweDM4RDFFNDkwLCAweDM5RDJFNTkxLCAweDM5RDFFNDkwLCAweDM5RDJFNTkxLCAweDM4RDFFNDkwLCAweDM5RDJFNTkxLCAweDNDQzdERTc0LCAweDgzQjdENTRCLCAweEJGRDNFNDk5LCAweEJBQkFENTZCLCAweEJDNjJBNjQ1LCAweEJGNURBNDQ2LCAweEJGNURBMzQ2LCAweEJGNUVBNDQ2LCAweEJGNURBNDQ2LCAweEIyNzdCMDQzLCAweEJCQ0FERjdELCAweEJGQ0ZFMjhBLCAweDY3QjVENDRCLCAweDNCQ0JFMTgxLCAweDM4RDFFNDkwLCAweDM5RDFFNThGLCAweDRDQkFENjUzLCAweEE3QkREODU3LCAweEJGRDdFNkEzLCAweEI2QTJDNjU1LCAweEJFNURBNDQ2LCAweEJGNURBNDQ3LCAweEJGNURBMzQ2LCAweEJGNUVBNDQ2LCAweEJGNURBNDQ2LCAweEE4OERCQTQ0LCAweEJFRDFFMzkyLCAweEJBQzdERTc0LCAweDNCQjVENTU4LCAweDAyRkFGQ0Y1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY3RkJGNywgMHg1NjVCQTU2MiwgMHhCRDRGOUY0NiwgMHhCRjdFQjc0RCwgMHhCRjkyQzM1MSwgMHhCRjg0QzE0NywgMHhCRjgyQzM0MywgMHhCRjgzQzM0MywgMHhCRjg1QzQ0MywgMHhCRjg2QzQ0NCwgMHhCRjg4QzU0NCwgMHhCRjg5QzQ0NCwgMHhCRjhCQzU0NSwgMHhCRjhDQzQ0NCwgMHhCRjhFQzU0NiwgMHhCRjhGQzU0NSwgMHhCRjkxQzU0NiwgMHhCRjkyQzY0NiwgMHhCRjk0Qzc0NywgMHhCRjk1Qzc0NiwgMHhCRjk2Qzc0NywgMHhCRjk3Qzc0NiwgMHhCRjk5Qzc0NywgMHhCRjk5Qzc0NiwgMHhCRjlCQzg0NywgMHhCRjlDQzc0NiwgMHhCRjlEQzk0NywgMHhCRjlGQzk0QywgMHhCRkEwQzk1MywgMHhCRjkzQkY0NiwgMHhCRjgwQjI0NSwgMHhBQjY1OUY0NiwgMHgwRERBRThENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg1RTcyQTY1RSwgMHhCRjc2QTg0NSwgMHhCRkExQzU1QiwgMHhCRkFDQ0I2MiwgMHhCRkFEQ0M2MywgMHhCRkEzQ0E0RiwgMHhCRkEwQ0E0OCwgMHhCRjlGQzk0NywgMHhCRjlFQzk0NywgMHhCRjlEQzg0NywgMHhCRjlEQzg0NywgMHhCRjlDQzg0NywgMHhCRjlCQzg0NywgMHhCRjk5Qzc0NiwgMHhCRjk5Qzc0NiwgMHhCRjk3Qzc0NiwgMHhCRjk2Qzc0NywgMHhCRjk0QzY0NiwgMHhCRjkzQzc0NiwgMHhCRjkzQzY0NiwgMHhCRkFEQ0Q0RCwgMHhCRkFGQ0Q1MCwgMHhCRkQ3RTQ4NCwgMHhCRkI3RDM2OCwgMHhCRjcyQUY0NSwgMHhCNzU3OUU0NCwgMHgyQjlFQzg5RiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkZDRkRGOCwgMHg0NEI3RDY1OCwgMHhCN0M0REM2QiwgMHhCRkQ0RTU5QSwgMHhCNTVEQTQ4MywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHg5RjgwQjg2QywgMHhCRkQ0RTU5QSwgMHhCN0M2REQ3MCwgMHg0MUJFREE2OSwgMHgxNEQzRTY5RSwgMHgxMEQzRTY5RSwgMHgwQ0UyRUZCRiwgMHgwNkVERjVEQSwgMHgwMkYwRjdERSwgMHgwMEZGRkZGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyOUM0REU3QSwgMHhBMkJDRDg1NiwgMHhCRkQ4RTdBNCwgMHhCOThBQkM3NywgMHhCRTAwNzJCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBODNEOTM5MywgMHhCQkM4REU3OCwgMHhCRkQxRTM5MSwgMHg2NUI3RDY1MiwgMHgwMkYzRjhFNCwgMHgwMEZGRkZGRiwgMHgwQUU2RjFDOSwgMHg2OEI1RDQ0QSwgMHhCRUNFRTI4OSwgMHhCRENDRTA4MywgMHhCQTI1ODZBMywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhBNDhCQkQ2OSwgMHhCRkQ2RTY5RSwgMHhCMUMyREI2NiwgMHgyNkNERTM4RCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwRkQ2RThBNywgMHg3NEI1RDQ0QSwgMHhCRkQyRTQ5MiwgMHhCREMxREE3QywgMHhCNzE2N0VBRCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCQTBBNzdCNSwgMHhBOUFDQ0Y2MSwgMHhCRkRCRTlCMCwgMHhCQUJGRDk3NywgMHhCQzEyN0JBRiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCNjBENzhCNCwgMHhBQ0IxRDE2MiwgMHhCRkQ4RTdBNiwgMHhCREM3REQ3MywgMHhCN0M0REM2QSwgMHhCOEM0REM2QSwgMHhCRkQyRTQ5MiwgMHhCRkNCRTA4MywgMHhCNjI1ODVBNCwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCOTA3NzVCNywgMHhBOUFERDA1RiwgMHhCRkQ4RTdBNSwgMHhCRUM4REU3NiwgMHhCN0MzREI2QSwgMHhCN0M0REM2QSwgMHhCN0MzREI2OSwgMHhCN0M0REM2QSwgMHhCN0M0REI2QSwgMHhCN0M0REM2QSwgMHhCN0M0REI2QSwgMHhCN0M0REM2QSwgMHhCN0M0REI2QSwgMHhCN0M0REM2QSwgMHhCN0M0REI2QSwgMHhCN0M0REM2QSwgMHhCNEMyREI2NiwgMHg2RkI3RDU0RiwgMHgwNUVDRjRENiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxN0Q3RThBNywgMHg4OUI4RDY0RCwgMHhCRkQ1RTY5RCwgMHhCOUI0RDM3MiwgMHhCRDA3NzVCNywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCMzE2N0VBRCwgMHhBRkJERDg2NCwgMHhCRkQ3RTZBMSwgMHg4OUI5RDY1MCwgMHgwQUUxRUZCRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNSwgMHg5NkJBRDY1MSwgMHhCRkQ4RTdBMywgMHhCQUEzQzY1NywgMHhCRjVEQTQ0NiwgMHhCRjVDQTM0NiwgMHhCRjVDQTQ0NywgMHhCRjVDQTQ0NiwgMHhCRjVEQTQ0NywgMHhBRjgxQjU0MywgMHhCRUNGRTI4QiwgMHhCRkQwRTI4QywgMHhCOUM0REM2QiwgMHhCOEM0REI2QSwgMHhCREM4REU3NiwgMHhCRkQ3RTZBMywgMHhCNjlCQzQ0RiwgMHhCRjVDQTM0NiwgMHhCRjVEQTQ0NywgMHhCRjVDQTM0NiwgMHhCRjVDQTQ0NywgMHhCRjVDQTQ0NywgMHhBQjgwQjg0NSwgMHhCRUNDRTA4MSwgMHhCRkQyRTQ5MiwgMHhCOUM0REI2QSwgMHhCOEM0REI2QSwgMHhCN0MzREI2QSwgMHhCOEM0REM2QSwgMHhCOEM0REM2QSwgMHhCQ0M3REQ3MiwgMHhCRkQ4RTdBNSwgMHhCOEE4Q0Q1NiwgMHhCRjVDQTQ0NywgMHhCRjVEQTQ0NywgMHhCRjVDQTM0NiwgMHhCRjVDQTQ0NywgMHhCRjVDQTM0NiwgMHhBRDdCQjM0NCwgMHhCQkNCRTA4MCwgMHhCRkQzRTQ5NCwgMHhCOUM0REM2QSwgMHhCOEM0REM2QSwgMHhCOEM0REI2OSwgMHhCRUNCRTA3RiwgMHhCRkQ1RTU5QywgMHhCOThCQkM0QSwgMHhCRjVDQTM0NiwgMHhCRjVEQTQ0NywgMHhCRjVDQTM0NiwgMHhCRjVDQTQ0NywgMHhCQzYxQTU0NywgMHhBQ0I2RDQ1OCwgMHhCRkQ4RTdBNSwgMHhCRkQ1RTU5QSwgMHhCRENDRTA4NCwgMHhCNzc0QjE0NSwgMHhCRjVDQTM0NiwgMHhCRjVDQTQ0NywgMHhCRjVDQTM0NiwgMHhCRjVEQTQ0NywgMHhCOTY0QTc0NiwgMHhBRkJBRDY1RCwgMHhCRkQ3RTZBMiwgMHg5MUJBRDc1MiwgMHgxQ0IyRDQ1NywgMHg2RUI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUM0REI3NywgMHhCQTY3QTg0OCwgMHhCRjVDQTQ0NywgMHhCRjVDQTQ0NiwgMHhCRjVDQTQ0NywgMHhCRjVDQTM0NiwgMHhCOTZCQUE0NywgMHhCNUMzREI2OSwgMHhCRkQ1RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNSwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0E4Q0M1NywgMHhCRTVFQTQ0NywgMHhCRjVDQTQ0NywgMHhCRjVDQTM0NiwgMHhCRjVEQTQ0NywgMHhCRjVDQTQ0NywgMHhBODg4QkE0NSwgMHhCRENFRTE4QiwgMHhCRkQwRTM4RCwgMHhCOEM0REM2QSwgMHhCOUM0REM2QSwgMHhCRkQyRTQ5NCwgMHhCRkM5REY3RSwgMHhCQTZBQUE0NiwgMHhCRjVDQTQ0NywgMHhCRjVDQTM0NiwgMHhCRjVEQTQ0NywgMHhCRjVDQTM0NiwgMHhCRDVGQTU0NywgMHhBOEE4Q0M0RSwgMHhCRkQ3RTdBMywgMHhCREM4REU3NiwgMHhCOEM0REM2QSwgMHhCN0MzREI2OSwgMHhCOEM0REM2QSwgMHhCOEM0REI2QSwgMHhCOEM0REM2QSwgMHhCN0M0REI2QSwgMHhCOEM0REM2QSwgMHhCOEMzREM2QSwgMHhCOEM0REM2QSwgMHhCN0MzREI2OSwgMHhCOEM0REM2QSwgMHhCOEMzREM2QSwgMHhCOEM0REM2QSwgMHhCN0MzREI2OSwgMHhCOEM0REM2QSwgMHhCOEMzREI2OSwgMHhCQkM1REM2QywgMHhCRkQ2RTY5RiwgMHhCQUJBRDU2QiwgMHhCQzYxQTY0NSwgMHhCRjVEQTQ0NywgMHhCRjVDQTM0NiwgMHhCRjVDQTQ0NywgMHhCRjVDQTQ0NiwgMHhCMzc3QjA0MywgMHhCQkNCREY3RSwgMHhCRkQzRTQ5NSwgMHhCOUM0REI2QSwgMHhCOEM0REM2QSwgMHhCN0MzREI2OSwgMHhCOEM0REM2QSwgMHhCOUM3REQ3NCwgMHhCRkQ0RTU5OCwgMHhCRkQyRTQ5NCwgMHhCQTg4Qjk0OSwgMHhCRjVDQTQ0NiwgMHhCRjVEQTQ0NywgMHhCRjVDQTM0NiwgMHhCRjVEQTQ0NywgMHhCRjVDQTM0NiwgMHhBQTkyQkU0NiwgMHhCRkQ0RTU5QSwgMHhCNkM1REM2QywgMHgzNkI1RDU1OSwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4Mzc5M0M0OTksIDB4QjU0ODlCNDUsIDB4QkY3NUIzNEMsIDB4QkY4QUJGNEUsIDB4QkY3REJFNDUsIDB4QkY3RUMxNDIsIDB4QkY4MUMyNDIsIDB4QkY4MkMyNDIsIDB4QkY4NEM0NDMsIDB4QkY4NUMzNDMsIDB4QkY4N0M0NDQsIDB4QkY4OUM0NDQsIDB4QkY4QUM1NDUsIDB4QkY4QkM0NDUsIDB4QkY4REM0NDUsIDB4QkY4RUM0NDUsIDB4QkY5MEM1NDUsIDB4QkY5MUM1NDYsIDB4QkY5MkM2NDYsIDB4QkY5M0M2NDYsIDB4QkY5NUM3NDYsIDB4QkY5NkM3NDYsIDB4QkY5OEM3NDYsIDB4QkY5OEM3NDYsIDB4QkY5QUM3NDYsIDB4QkY5QUM3NDYsIDB4QkY5RkM5NEQsIDB4QkZBNUNCNTksIDB4QkY5RkM4NTIsIDB4QkY4RUJDNDUsIDB4QkY3QUFFNDUsIDB4OTM2MDlENDcsIDB4MDVGMUY3RjAsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGOEZBRjcsIDB4ODA2RkE1NTksIDB4QkY3QUFDNDUsIDB4QkZBNkM4NUYsIDB4QkZBQkNBNjIsIDB4QkZBQUNCNUUsIDB4QkY5RkM5NDgsIDB4QkY5RUM4NDcsIDB4QkY5REM4NDcsIDB4QkY5REM4NDcsIDB4QkY5Q0M4NDYsIDB4QkY5QkM4NDcsIDB4QkY5QUM3NDYsIDB4QkY5OUM3NDYsIDB4QkY5OEM3NDYsIDB4QkY5N0M3NDYsIDB4QkY5NUM2NDYsIDB4QkY5NUM3NDcsIDB4QkY5M0M2NDYsIDB4QkY5MkM2NDYsIDB4QkY5MkM1NDYsIDB4QkZBRENDNEQsIDB4QkZBRENDNEYsIDB4QkZEMEUwN0UsIDB4QkZENEUxODQsIDB4QkY4OUJDNEIsIDB4QkY2MkE1NDMsIDB4N0E1ODlGNTQsIDB4MDJFREY1RUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGQ0ZERjgsIDB4NDhCN0Q2NTgsIDB4QjlDNkRENzAsIDB4QkZEM0U0OTYsIDB4QjI1OEExODQsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4OUY1NkEwODQsIDB4QkJDOURFN0EsIDB4QkZENkU2OUYsIDB4QjNDM0RCNkEsIDB4OUZCQ0Q3NTcsIDB4OTlCQkQ3NTUsIDB4OTVCQUQ3NTIsIDB4ODRCN0Q1NEUsIDB4NjVCNUQ1NEYsIDB4M0JCRURBNjgsIDB4MTNENkU4QTYsIDB4MDJGM0Y4RTcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGNkZBRUMsIDB4M0FCNUQ1NTcsIDB4QUVDMURBNjMsIDB4QkZENkU2QTAsIDB4QjU2OEFBODIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTU1N0ExODMsIDB4QkRDRUUxOEEsIDB4QkRDQ0UwODAsIDB4NEFCRkRBNjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTFEN0U5QTksIDB4N0NCNkQ0NEEsIDB4QkZEM0U0OTcsIDB4QjlCQUQ2N0EsIDB4QkExMzdDQUUsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjkwNTc0QjgsIDB4QThBNENBNjEsIDB4QkZEN0U2QTMsIDB4QTJCRUQ4NUEsIDB4MTdEMUU1OUEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MThENkU4QTYsIDB4ODlCN0Q1NEMsIDB4QkZENkU2OUUsIDB4QjdCMkQyNzAsIDB4QkUwNzc1QjcsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjExNzdFQUMsIDB4QjBCRUQ4NjUsIDB4QkZEQkU5QjEsIDB4QjhBM0NBNzcsIDB4QkIwNzc1QjcsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QTkyNDg1QTUsIDB4QThCOEQ1NUMsIDB4QkZEM0U0OTcsIDB4QkZEM0U0OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QjdCQUQ2NkQsIDB4QkIxMTdCQjAsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkMsIDB4QUMxNzdFQUQsIDB4QTZCNEQzNUEsIDB4QkZEM0U0OTUsIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENEU1OTksIDB4QkZEM0U0OTksIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENEU1OTksIDB4QkZEM0U0OTgsIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENUU2OUMsIDB4QkZEOEU3QTYsIDB4OTVCQUQ3NTMsIDB4MEVFQkYzRDEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjRDMERCNzMsIDB4OUFCQUQ3NTIsIDB4QkZEN0U2QTMsIDB4QjY5M0MxNzcsIDB4QkUwMjczQjksIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QUEzMDhCOUMsIDB4QjlDNERCNzEsIDB4QkZEM0U1OTgsIDB4NzBCNkQ1NEUsIDB4MDRGNkZBRUIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUU5QTQsIDB4OTZCOUQ2NTEsIDB4QkZEOEU3QTMsIDB4QjlBMkM2NTcsIDB4QkU1Q0EzNDYsIDB4QkY1QUEyNDYsIDB4QkY1QkEzNDYsIDB4QkY1QkEyNDYsIDB4QkY1QkEzNDcsIDB4QUY3RkI1NDMsIDB4QkVDRkUyOEIsIDB4QkZEOUU4QUIsIDB4QkZENEU1OUEsIDB4QkZEM0U0OTksIDB4QkZENEU1OTksIDB4QkVEMEUyOEUsIDB4QUY5OEMyNEEsIDB4QkU1QkEzNDYsIDB4QkY1QkEzNDcsIDB4QkY1QkEzNDYsIDB4QkY1Q0EzNDcsIDB4QkY1QUEzNDYsIDB4QTQ4MEI3NDYsIDB4QkFDNURDNkYsIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZEMkUzOTMsIDB4QUZBNUNCNEYsIDB4QkY1QUEyNDYsIDB4QkY1QkEzNDcsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDcsIDB4QkY1QUEyNDYsIDB4QTk3QUIzNDUsIDB4QjhDNURDNkUsIDB4QkZENEU1OTksIDB4QkZEM0U0OTgsIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkRDQkRGN0YsIDB4QjM3Q0I0NDcsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDcsIDB4QkY1QUEyNDYsIDB4QkY1QkEzNDcsIDB4QjQ2NUE3NDcsIDB4QThCNkQ0NTUsIDB4QkZEMkUzOTUsIDB4QkZENEU1OUEsIDB4QkJDOERENzYsIDB4QjE3QUIzNDUsIDB4QkY1QUEzNDYsIDB4QkY1QkEzNDcsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDYsIDB4QkM1RUE0NDYsIDB4QUZBRENFNTUsIDB4QkZEN0U3QTQsIDB4OUZCQ0Q4NTgsIDB4MjRCMkQ0NTUsIDB4NkVCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDM0RCNzYsIDB4QkE2NkE3NDgsIDB4QkY1QkEzNDcsIDB4QkY1QUEzNDYsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDYsIDB4Qjk2QUFBNDcsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJERkVEQjQsIDB4OURCQUQ3NTMsIDB4QkZEN0U3QTMsIDB4QjdBOENDNTcsIDB4QkU1Q0EzNDYsIDB4QkY1QkEzNDcsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDYsIDB4QTE4NkJBNDYsIDB4QkJDOERENzYsIDB4QkZENEU1OUEsIDB4QkZEM0U0OTksIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkJDM0RCNkQsIDB4Qjc2OEE5NDYsIDB4QkY1QkEzNDcsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDcsIDB4QkY1QkEyNDYsIDB4QkM1REE0NDcsIDB4QTBBNkNCNEIsIDB4QkZEMEUzOEUsIDB4QkZEM0U0OTksIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZENEU1OTksIDB4QkZEM0U0OTksIDB4QkZENEU1OTksIDB4QkZEM0U0OTgsIDB4QjRCNEQyNUUsIDB4QkE2MEE1NDUsIDB4QkY1QkEzNDcsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDYsIDB4QUQ3NkIwNDQsIDB4QjhDNURDNkQsIDB4QkZENEU1OTksIDB4QkZEM0U0OTksIDB4QkZENEU1OTksIDB4QkZENEU0OTksIDB4QkZENEU1OTksIDB4QkZEMkUzOTMsIDB4QkRDOERFN0QsIDB4QkI5N0MxNTEsIDB4QkU1RUE0NDYsIDB4QkY1QkEzNDYsIDB4QkY1QkEzNDcsIDB4QkY1QUEzNDYsIDB4QkY1QkEzNDYsIDB4QkQ1Q0EyNDUsIDB4QUFBOUNENEYsIDB4QkZEN0U2QTIsIDB4QThCRkQ5NUYsIDB4MjhCNEQ0NUIsIDB4MDFGQUZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFEQUNEMkIyLCAweEE4NDY5QjQ5LCAweEJGNjlBRDQ5LCAweEJGN0ZCQjRDLCAweEJGNzZCQjQzLCAweEJGN0RDMjQzLCAweEJGN0VDMjQzLCAweEJGODBDMzQzLCAweEJGODFDMzQzLCAweEJGODNDMzQzLCAweEJGODRDNDQzLCAweEJGODZDNDQ0LCAweEJGODdDNDQ0LCAweEJGOEFDNTQ0LCAweEJGOEJDNDQ0LCAweEJGOENDNTQ1LCAweEJGOERDNDQ1LCAweEJGOEZDNTQ1LCAweEJGOTBDNTQ1LCAweEJGOTJDNjQ2LCAweEJGOTJDNjQ2LCAweEJGOTRDNzQ2LCAweEJGOTVDNzQ2LCAweEJGOTZDNzQ2LCAweEJGOTdDNzQ3LCAweEJGOTlDNzQ3LCAweEJGOUJDODQ4LCAweEJGQThDQzU5LCAweEJGQTdDQzVBLCAweEJGOUNDNjRELCAweEJGOEFCQTQ1LCAweEJGNzVBQTQ0LCAweDc3NzNBODVGLCAweDAxRjhGQkY3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1REFFOEQ3LCAweDk5NjA5QzQ0LCAweEJGODBCMDQ4LCAweEJGQTlDQTYxLCAweEJGQUJDQjYyLCAweEJGQTNDQTUxLCAweEJGOURDOTQ3LCAweEJGOURDOTQ3LCAweEJGOUNDODQ3LCAweEJGOUNDODQ3LCAweEJGOUJDODQ2LCAweEJGOUFDODQ3LCAweEJGOTlDNzQ2LCAweEJGOThDNzQ2LCAweEJGOTdDNzQ3LCAweEJGOTZDNzQ3LCAweEJGOTRDNjQ2LCAweEJGOTRDNzQ3LCAweEJGOTJDNjQ2LCAweEJGOTFDNjQ2LCAweEJGOTFDNTQ1LCAweEJGQUNDQzRELCAweEJGQUNDQzRFLCAweEJGQzREQTczLCAweEJGRUFGMUM3LCAweEJGQTlDQzVGLCAweEJGNkRBRDQ0LCAweEI0NTM5QzQ0LCAweDIyOUVDNzlGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRkNGRUY4LCAweDQ2QjdENjU4LCAweEI3QzREQzZCLCAweEJGRDRFNTlCLCAweEIxNjJBNzgwLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEI3MEM3OEI0LCAweEEyODZCQTZCLCAweEJDQ0FERjdFLCAweEJGRDZFNjlGLCAweEJGRDhFN0EzLCAweEJGRDdFN0EzLCAweEJGRDhFN0EzLCAweEJGRDZFNjlGLCAweEJGRDFFMzkxLCAweEI4QzdERDc0LCAweDlFQkNENzU2LCAweDU4QjdENjU1LCAweDEyRDVFN0EzLCAweDAwRkRGRUZDLCAweDA0RjVGQUVBLCAweDRDQjRENDRGLCAweEI5QzZERDcxLCAweEJFRDNFNDk3LCAweEI4NEE5QThFLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MkJCLCAweEE0NzlCMzZGLCAweEJGRDRFNDk4LCAweEI2QzZERDcxLCAweDMzQkVEQTZBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFEQ0JFMjhDLCAweDkwQjhENTRFLCAweEJGRDdFN0ExLCAweEJBQTZDQjczLCAweEJDMDU3NEI5LCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEIyMTY3REFELCAweEIwQjVEMzY2LCAweEJGRDdFNkEyLCAweDhFQkFENjUyLCAweDBDRTdGMkNCLCAweDAwRkZGRkZGLCAweDAwRkVGRkZFLCAweDI1QzFEQzc0LCAweDlCQkFENzUzLCAweEJGRDhFN0EzLCAweEI2OTBCRjc4LCAweEJFMDM3M0JBLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE4MzM4RDlBLCAweEJBQzVERDcyLCAweEJGREFFOUIwLCAweEI4OEJCRDc2LCAweEJFMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweDhCMzQ4RTlFLCAweDVDQjVENDRELCAweDdGQUREMDUyLCAweEFDNjRBNzdELCAweEIxNUZBNTgxLCAweEIxNUVBNTgwLCAweEIxNUZBNTgxLCAweEE1NEY5Qzg5LCAweEJDMDQ3NEJBLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEFFMTg3RUFFLCAweDk3NURBNTgxLCAweEIxNUZBNTgwLCAweEIxNUZBNTgxLCAweEIxNUZBNTgwLCAweEIxNUZBNTgxLCAweEIxNUZBNTgwLCAweEIxNUZBNTgxLCAweEIxNUZBNTgwLCAweEIxNUZBNTgxLCAweEIxNUZBNTgwLCAweEIxNUZBNTgwLCAweEIxNUZBNTgwLCAweEIxNUZBNTgxLCAweEE4NzVCMTcyLCAweEJBQzREQzY5LCAweEJGRDVFNTlFLCAweDgxQjhENjRGLCAweDA3RUFGM0QyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDMyQkREQTY5LCAweEFBQkZEOTVDLCAweEJGRDdFNkEyLCAweEI4NzhCMzdCLCAweEJGMDA3MkJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE1NEY5Qzg4LCAweEJEQ0NFMDgyLCAweEJFQ0ZFMjg4LCAweDU1QjdENTU0LCAweDAxRjdGQkVFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE0LCAweDk2QjlENjUxLCAweEJGRDhFN0EzLCAweEJBQTJDNjU4LCAweEJGNUJBMzQ2LCAweEJGNTlBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMzQ2LCAweEJGNUFBMzQ3LCAweEFGN0ZCNTQzLCAweEJFRDBFMjhDLCAweEJGRDRFNDlBLCAweEIyOUZDNzRBLCAweEIxOEFCQzQ3LCAweEIxOEJCRDQ4LCAweEFFOEFCQzQ3LCAweDlGNzhCMjQ3LCAweEJGNUFBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMjQ2LCAweEE3NkRBRDQ5LCAweEEzODlCQzQ2LCAweEIxOEFCRDQ4LCAweEIxOEFCQzQ3LCAweEIxOEFCRDQ4LCAweEIxOEFCRDQ4LCAweEIxOEJCRDQ4LCAweEIxOEFCQzQ3LCAweEIxOEFCRDQ4LCAweEFGOEFCQzQ3LCAweDlBN0VCNzQ4LCAweEJGNUFBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNTlBMjQ2LCAweDhGNzdCMTQ5LCAweDVGQjVENDRFLCAweDcxQjZENTRGLCAweEE0OTNDMTQ5LCAweEIxOEJCRDQ4LCAweEIxOEFCQzQ4LCAweEIxOEJCRDQ4LCAweEE4ODlCQzQ2LCAweEIzNjVBODQ3LCAweEJGNTlBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMjQ2LCAweEJGNUJBMzQ3LCAweEFGNjJBNjQ4LCAweDk2ODhCQjQ4LCAweEIwOEFCQzQ3LCAweEIxOEFCRDQ4LCAweEE1ODlCQzQ2LCAweEE3NkNBQzQ5LCAweEJGNTlBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMjQ2LCAweEJGNUFBMzQ3LCAweEJFNUJBMzQ2LCAweEFDQTVDQTRFLCAweEJGRDdFNkExLCAweEFBQzBEQTYwLCAweDJGQjNENDU0LCAweDZGQjZENTRBLCAweEJGRDFFMzkxLCAweEJFQzNEQjc2LCAweEJBNjVBNzQ4LCAweEJGNUFBMzQ3LCAweEJGNUFBMzQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMjQ2LCAweEI5NjlBQTQ3LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI0LCAweDlEQkJENzU0LCAweEJGRDdFN0EzLCAweEI3QThDQzU3LCAweEJFNUJBMzQ3LCAweEJGNUFBMzQ3LCAweEJGNUFBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNTlBMjQ2LCAweDc5ODBCNjRDLCAweDYzQjVENDRELCAweEE5OTFDMDQ5LCAweEIxOEFCQzQ3LCAweEIxOEFCRDQ4LCAweEIxOEFCQzQ3LCAweEEyODhCQzQ3LCAweEI2NjBBNTQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMzQ2LCAweEJGNUFBMzQ3LCAweEJGNTlBMjQ2LCAweEJENUJBMzQ3LCAweDk2N0VCNjQ3LCAweEFGOEFCQzQ3LCAweEIxOEFCQzQ4LCAweEIxOEFCRDQ4LCAweEIxOEFCQzQ3LCAweEIxOEFCRDQ4LCAweEIxOEFCQzQ3LCAweEIxOEJCRDQ4LCAweEIxOEFCQzQ4LCAweEIxOEJCRDQ4LCAweEIxOEFCQzQ3LCAweEIxOEJCRDQ4LCAweEIxOEFCQzQ3LCAweEIxOEFCRDQ4LCAweDlBOThDMzQ5LCAweDcxQjZENTRGLCAweDcxQjZENTRFLCAweEE1OTNDMTQ5LCAweEIxOEFCQzQ4LCAweEIxOEJCRDQ4LCAweEIxOEFCQzQ3LCAweDlFODFCNzQ3LCAweEJBNUJBMzQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNTlBMjQ2LCAweEFFNjhBOTQ3LCAweEEyODlCQzQ2LCAweEIxOEJCRDQ4LCAweEIxOEFCQzQ4LCAweEIxOEJCRDQ4LCAweEIxOEFCRDQ4LCAweEIxOEFCQzQ4LCAweEI2N0FCMTQ2LCAweEJDNjlBOTQ1LCAweEJFNUJBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNTlBMjQ2LCAweEJGNUFBMzQ3LCAweEJGNUFBMjQ2LCAweEJGNUFBMzQ3LCAweEI0NjhBODQ0LCAweEI1QkVEODY1LCAweEJGRDZFNkExLCAweDhEQjlENjUyLCAweDE5QzZERjg1LCAweDAwRkZGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQ0RDRUNERiwgMHg4RjQzOUE0RCwgMHhCRjU4QTU0NywgMHhCRjZFQjI0NywgMHhCRjcxQjk0NCwgMHhCRjc5QkY0MywgMHhCRjdDQzI0MywgMHhCRjdEQzI0MiwgMHhCRjdGQzM0MywgMHhCRjgwQzM0MiwgMHhCRjgyQzM0MywgMHhCRjgzQzI0MiwgMHhCRjg1QzQ0NCwgMHhCRjg2QzQ0MywgMHhCRjg4QzQ0NCwgMHhCRjg5QzQ0NCwgMHhCRjhCQzU0NSwgMHhCRjhDQzQ0NCwgMHhCRjhEQzQ0NSwgMHhCRjhFQzQ0NSwgMHhCRjkwQzU0NSwgMHhCRjkxQzU0NSwgMHhCRjkyQzY0NiwgMHhCRjkzQzY0NiwgMHhCRjk1Qzc0NiwgMHhCRjk1Qzc0NiwgMHhCRjk3Qzc0NiwgMHhCRkEyQ0E1MSwgMHhCRkFBQ0Q1QiwgMHhCRkE3Q0I1OSwgMHhCRjk2QzM0OSwgMHhCRjg2QjY0MywgMHhCRjZFQTY0NCwgMHg1Nzg3QjU3OSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMUQ0RTREMCwgMHhBRTYzOUU0NCwgMHhCRjg2QjU0QiwgMHhCRkFBQ0I2MywgMHhCRkE3Q0E1QywgMHhCRjlEQzg0NywgMHhCRjlCQzc0NiwgMHhCRjlDQzg0NiwgMHhCRjlCQzc0NiwgMHhCRjlBQzc0NiwgMHhCRjk5Qzc0NiwgMHhCRjk5Qzc0NiwgMHhCRjk3Qzc0NiwgMHhCRjk2Qzc0NiwgMHhCRjk1Qzc0NiwgMHhCRjk0Qzc0NiwgMHhCRjkyQzY0NSwgMHhCRjkyQzY0NiwgMHhCRjkxQzU0NSwgMHhCRjkwQzU0NSwgMHhCRjhFQzQ0NSwgMHhCRkE4Q0I0QywgMHhCRkFDQ0M0RCwgMHhCRkI4RDM2MiwgMHhCRkRFRTc4RSwgMHhCRkM0RDk3NCwgMHhCRjgwQjc0OCwgMHhCRjVFQTQ0NCwgMHg2RDUyOUM1MSwgMHgwMUVDRjRFQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZDRkRGOCwgMHgzOUI3RDU1OSwgMHhBQ0MwRDk1RiwgMHhCRkQ3RTdBMiwgMHhBRDg1QkE3MSwgMHhCRTAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCOTA4NzZCNiwgMHhBRDQxOTU5MSwgMHhBRjcxQUY3OCwgMHhCMjgyQjg3OCwgMHhCMThCQkM3MywgMHhCMUExQzg2QiwgMHhCNkIzRDI2RCwgMHhCQkM3REU3RCwgMHhCRkQzRTQ5OCwgMHhCRkQ4RTdBMywgMHhCQ0NCREY4MCwgMHg4RkI5RDY1MSwgMHgyOEM1REU3RCwgMHgwOEUwRUVCRSwgMHg2MEI0RDQ0QywgMHhCRUNDRTE4MywgMHhCRUNCRTA4OSwgMHhCNTJFOEI5RCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCQzAzNzNCOSwgMHhBNTkxQzA2OCwgMHhCRkQ3RTZBMSwgMHhBQkMwREE2MSwgMHgxRkQyRTU5QSwgMHgwMEZGRkZGRiwgMHgwMEZERkRGQSwgMHgyQUMyREM3NSwgMHhBMUJDRDc1NiwgMHhCRkQ4RTdBNCwgMHhCNTg5QkI3NiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhBQzJBODg5RSwgMHhCNkM1REM2RSwgMHhCRkQ0RTU5OSwgMHg3N0I3RDU0RSwgMHgwNEU5RjJEMCwgMHgwMEZGRkZGRiwgMHgwMEZFRkVGRSwgMHgzNEJERDk2OCwgMHhBQUJFRDg1QywgMHhCRkQ3RTdBMiwgMHhCNzc1QjE3QywgMHhCRjAwNzJCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNTRGOUM4NywgMHhCRUNERTE4NCwgMHhCRkQ4RTdBNywgMHhCNDY3QTk4MiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHg1QzRCOUJDNywgMHgwQ0RGRURCOSwgMHgyQUE5Q0ZBMiwgMHhCOTAxNzJCQSwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNzM5OTA5NCwgMHhCQUM5REU3OCwgMHhCRkQxRTM5MSwgMHg2N0I5RDY1NCwgMHgwMUYzRjhFNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkYxRjdFMiwgMHg0NUI1RDU1NCwgMHhCNUM0REM2QiwgMHhCRkQ0RTU5QiwgMHhCNDU1QTA4OSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhBMzY4QUE3OSwgMHhCRUQxRTM5MywgMHhCQkM4REU3NSwgMHgzQkM1REU3OCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNCwgMHg5NkI5RDY1MSwgMHhCRkQ4RTdBMywgMHhCOUEyQzY1NywgMHhCRTU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NywgMHhBRjdFQjQ0MywgMHhCRUNGRTI4QiwgMHhCRUQzRTQ5OSwgMHhCNjgyQjc0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU4QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NywgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHg3RTg0Qjk2QywgMHgwN0RGRURCQiwgMHgwQkQzRTdBMiwgMHg5QTcxQjA1OCwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhBODk5QzQ0OSwgMHhCRUQ0RTU5QiwgMHhCM0M0REM2QSwgMHgzQUIzRDQ1MiwgMHg2RkI1RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUMzREI3NiwgMHhCQTYzQTY0OCwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCODY3QTk0NywgMHhCNUMyREE2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDQ0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkUwRURCNCwgMHg5Q0JBRDc1MywgMHhCRkQ3RTZBMywgMHhCN0E3Q0I1NywgMHhCRTVBQTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHg2MDhEQkQ3NCwgMHgwOURERUNCOCwgMHhBNzZBQUI1MSwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU4QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU4QTI0NiwgMHg3RjdDQjM1RCwgMHgwQkQzRTZBMiwgMHgwQkQyRTZBMSwgMHg5RDcwQUY1OCwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU4QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTI0NiwgMHhCRjU5QTI0NywgMHhCRjU4QTE0NiwgMHhCRjU5QTI0NiwgMHhBQjhEQkM0NSwgMHhCRUQwRTM4RSwgMHhCRENERTE4NiwgMHg1RUI0RDQ0RSwgMHgwQkQ1RThBNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDRFMEVGRTMsIDB4NzM0RUEwNUEsIDB4QkU0QjlGNDUsIDB4QkY1RkFDNDYsIDB4QkY2Q0I2NDQsIDB4QkY3OEJGNDQsIDB4QkY3QUMxNDMsIDB4QkY3Q0MyNDQsIDB4QkY3Q0MyNDMsIDB4QkY3RkMyNDMsIDB4QkY3RkMzNDMsIDB4QkY4MUMzNDMsIDB4QkY4MkMzNDMsIDB4QkY4NEM0NDQsIDB4QkY4NUM0NDMsIDB4QkY4N0M0NDQsIDB4QkY4OEM0NDQsIDB4QkY4QkM2NDUsIDB4QkY4QkM1NDUsIDB4QkY4REM0NDUsIDB4QkY4RUM0NDUsIDB4QkY4RkM1NDYsIDB4QkY5MEM1NDUsIDB4QkY5MUM2NDYsIDB4QkY5MkM2NDYsIDB4QkY5NEM3NDcsIDB4QkY5NEM3NDYsIDB4QkY5QUM5NEEsIDB4QkZBQ0NFNUEsIDB4QkZBQ0NFNUIsIDB4QkZBNkNCNTcsIDB4QkY5MEMwNDYsIDB4QkY4MEIzNDQsIDB4QkU2OEEzNDQsIDB4Mzk4QUI3N0UsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjY5RkM0OTYsIDB4Qjk2N0ExNDQsIDB4QkY4RUJBNTAsIDB4QkZBQUNCNjIsIDB4QkY5REM4NEIsIDB4QkY5Q0M4NDcsIDB4QkY5QkM4NDYsIDB4QkY5QkM4NDcsIDB4QkY5QUM3NDYsIDB4QkY5OUM3NDcsIDB4QkY5OEM3NDYsIDB4QkY5OEM3NDcsIDB4QkY5NkM3NDYsIDB4QkY5NUM3NDcsIDB4QkY5NEM2NDYsIDB4QkY5NEM3NDcsIDB4QkY5MkM2NDYsIDB4QkY5MkM2NDYsIDB4QkY5MEM1NDUsIDB4QkY4RkM1NDYsIDB4QkY4REM0NDUsIDB4QkZBMUM5NEEsIDB4QkZBQ0NDNEQsIDB4QkZBRUNFNTQsIDB4QkZDRERGODAsIDB4QkZEN0UzODQsIDB4QkY5Q0M1NTQsIDB4QkY2OEFCNDUsIDB4QUU0RTlCNDQsIDB4MThBMkNBQTUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkIsIDB4MjdDMERCNzEsIDB4OTdCQUQ3NTEsIDB4QkZEN0U2QTIsIDB4QjVCNkQ0NkQsIDB4QjMxNzdFQUMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMTcyQkMsIDB4QkYwMTcyQkIsIDB4QkYwMjczQkIsIDB4QjcwQjc4QjQsIDB4QjIyRThCOUQsIDB4QUE2RkFFNzcsIDB4QjRCOUQ2NkEsIDB4QkZENEU1OTksIDB4QkZENEU1OTgsIDB4OUVCQ0Q3NTYsIDB4MzJCM0Q0NTQsIDB4NzdCNkQ0NEEsIDB4QkZEMkU0OTQsIDB4QkRDM0RCNzgsIDB4QjkxMzdDQjAsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QjkwOTc2QjUsIDB4QTlCMUQyNUYsIDB4QkZEOEU3QTQsIDB4OUJCQ0Q3NTYsIDB4MTFEOEU5QTksIDB4MDBGRkZGRkYsIDB4MDFGQUZDRjUsIDB4M0JCNkQ1NTcsIDB4QUVDMURBNjIsIDB4QkZEN0U3QTEsIDB4QjY2NkE5ODIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTY0Mzk2OEUsIDB4QkNDQkUwN0YsIDB4QkVDRkUyOEMsIDB4NUNCQUQ4NTksIDB4MDFGREZFRkEsIDB4MDBGRkZGRkYsIDB4MDJGMUY3RTIsIDB4NDZCNkQ2NTUsIDB4QjVDNERDNkMsIDB4QkZENUU1OUIsIDB4QjQ1MzlFOEEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QTM2QkFCNzcsIDB4QkZEM0U1OTcsIDB4QkZENEU0OUEsIDB4Qjg0QjlCOEQsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkUwMDcxQkIsIDB4M0VBMENBRTYsIDB4MDBGRkZGRkYsIDB4MzI3QkI2REMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QTU1N0ExODEsIDB4QkVDRkUyODksIDB4QkNDQ0UwODIsIDB4NENCQ0Q5NUYsIDB4MDBGRUZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDZFRUY2REEsIDB4NTlCNEQ0NEMsIDB4QkNDQURGN0MsIDB4QkVEMEUzOEYsIDB4QjkzODkwOTcsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkQwMTcyQkIsIDB4QTU4QkJENjgsIDB4QkZENkU2OUYsIDB4QjBDM0RCNjcsIDB4MjdDNkRGN0YsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUVBQTUsIDB4OTZCQUQ2NTEsIDB4QkZEOEU3QTMsIDB4QkFBMkM2NTcsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QUY3RUI0NDMsIDB4QkVDRkUyOEIsIDB4QkVEM0U1OTksIDB4QjY4MkI3NDcsIDB4QkY1OEExNDYsIDB4QkY1OEEyNDYsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0EyNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDYsIDB4QkY1OEEyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEExNDcsIDB4QkY1OEExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEEyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0EyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4N0U4OEJCNzUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4OTg3OUI1NkMsIDB4QkY1OEExNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEEyNDcsIDB4QkY1OEEyNDYsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDYsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEExNDcsIDB4QkY1OEExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEEyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QUQ4QUJCNDgsIDB4QkVEMUUzOTMsIDB4QkJDOERFNzYsIDB4NDdCNEQ0NTEsIDB4NzFCNkQ1NEEsIDB4QkZEMUUzOTEsIDB4QkVDM0RCNzYsIDB4QkE2M0E2NDgsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEExNDYsIDB4Qjk2N0E5NDcsIDB4QjVDM0RCNjksIDB4QkZENUU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjUsIDB4OURCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjdBOENCNTcsIDB4QkU1OUEyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEExNDYsIDB4NjA5MUMwN0UsIDB4MDFGRUZFRkUsIDB4QTY2RkFFNUMsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0EyNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEEyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0EyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDcsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0EyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4N0I4N0I5NzYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4OUI3OEI0NkEsIDB4QkY1OEEyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEEyNDcsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEExNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDYsIDB4QkY1N0ExNDYsIDB4QkY1OEEyNDcsIDB4QkY1OEEyNDYsIDB4QkY1OEEyNDcsIDB4QkY1N0ExNDYsIDB4QUY2REFCNDQsIDB4QjRCREQ4NjMsIDB4QkZEOEU4QTUsIDB4QTVCRUQ4NUMsIDB4MkRCN0Q3NjEsIDB4MDJGN0ZBRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjdGQkY4LCAweDUwNzNCNTdGLCAweEJDNDY5QzQ1LCAweEJGNUFBODQ1LCAweEJGNjlCNDQ1LCAweEJGNzNCQzQzLCAweEJGNzhDMTQzLCAweEJGNzlDMDQzLCAweEJGN0JDMTQzLCAweEJGN0JDMTQzLCAweEJGN0RDMjQzLCAweEJGN0VDMjQzLCAweEJGODBDMzQzLCAweEJGODFDMjQyLCAweEJGODNDMzQzLCAweEJGODRDMzQzLCAweEJGODZDNDQ0LCAweEJGODdDNDQzLCAweEJGODlDNTQ0LCAweEJGOEFDNDQ0LCAweEJGOEJDNDQ1LCAweEJGOENDNDQ1LCAweEJGOEVDNDQ1LCAweEJGOEVDNDQ0LCAweEJGOTBDNTQ2LCAweEJGOTFDNTQ1LCAweEJGOTNDNjQ2LCAweEJGOTRDNjQ2LCAweEJGQTlDRTU4LCAweEJGQURDRjVDLCAweEJGQUNDRTVCLCAweEJGQTBDODUyLCAweEJGOEFCQzQ0LCAweEJGNzlBRjQ0LCAweEI5NjE5RTQzLCAweDFFQkVEN0I5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRkZFLCAweDQxOEJCNzdFLCAweEJGNjlBNDQzLCAweEJGOTVCRTU1LCAweEJGOUVDNzUyLCAweEJGOTlDNzQ2LCAweEJGOUFDODQ3LCAweEJGOTlDNzQ2LCAweEJGOTlDNzQ3LCAweEJGOThDNjQ2LCAweEJGOTdDNzQ2LCAweEJGOTZDNzQ2LCAweEJGOTZDNzQ2LCAweEJGOTRDNjQ2LCAweEJGOTRDNzQ2LCAweEJGOTNDNjQ2LCAweEJGOTJDNjQ2LCAweEJGOTBDNTQ1LCAweEJGOTBDNTQ2LCAweEJGOEVDNDQ1LCAweEJGOEVDNDQ1LCAweEJGOENDNDQ0LCAweEJGOThDODQ4LCAweEJGQUJDQzRELCAweEJGQTlDQjRFLCAweEJGQzBENzcyLCAweEJGQ0FERDdFLCAweEJGQjFEMDY3LCAweEJGN0JCNTQ3LCAweEJFNUFBMTQ0LCAweDYwNjdBOTY4LCAweDAwRkRGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDExRDZFOEE2LCAweDZGQjZENDRCLCAweEJEQ0RFMDg2LCAweEJFRDFFMzkwLCAweEE0NzJBRjc0LCAweEJEMDI3M0JBLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJBLCAweEFGMjI4NEE1LCAweEE3OUJDNTYyLCAweEJFRDBFMzhGLCAweEJFRDJFNDk1LCAweDhDQjlENjRFLCAweDhEQjdENTRDLCAweEJGRDZFNjlGLCAweEI2QUNDRTczLCAweEJEMDg3NkI2LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEFGMUE3RkFBLCAweEIyQkNENzY3LCAweEJGRDZFNjlGLCAweDg1QjhENjRGLCAweDA4RUFGM0QyLCAweDAwRkZGRkZGLCAweDAyRjFGN0UyLCAweDRDQjZENTUzLCAweEI5QzdERDcyLCAweEJGRDNFNDk3LCAweEI2NEE5QThELCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEEzNjZBOTc5LCAweEJGRDBFMzhGLCAweEJBQzlERTdCLCAweDQyQkFEODVFLCAweDAwRkRGRUZCLCAweDAwRkZGRkZGLCAweDA1RUNGNEQ4LCAweDVCQjVENDRDLCAweEJCQ0FERjdELCAweEJFRDBFMjhFLCAweEI4MzY4Rjk4LCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJFMDE3MkJCLCAweEE0OERCRTY1LCAweEJGRDdFN0E1LCAweEJFQ0NFMDg5LCAweEI1MkU4QjlFLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJCMDA3MUJCLCAweDIxQTBDQUU2LCAweDAwRkZGRkZGLCAweDUxN0FCNkRDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDE3MkJDLCAweEEzNzVCMTcxLCAweEJGRDRFNDk4LCAweEI2QzVEQzcxLCAweDM0QzRERTc2LCAweDAwRkVGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBCREJFQkIxLCAweDZFQjVENDRBLCAweEJGRDBFMjhDLCAweEJDQzREQzgxLCAweEI3MjA4M0E2LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEI5MDc3NUI2LCAweEE4OUZDODY1LCAweEJGRDdFNkEzLCAweEEyQkREODVCLCAweDE3REZFREI2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE0LCAweDk2QjlENjUxLCAweEJGRDhFN0EzLCAweEI5QTFDNjU3LCAweEJFNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEFGN0VCNDQzLCAweEJFQ0ZFMjhCLCAweEJFRDNFNDk5LCAweEI2ODJCNjQ3LCAweEJGNTZBMDQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMDQ2LCAweEJGNTdBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMDQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMDQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweDdFODdCQjc1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDk4NzhCNDZCLCAweEJGNTZBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ3LCAweEJGNTZBMDQ2LCAweEFEODBCNzQ2LCAweEJEQ0RFMTg2LCAweEJFQ0RFMTgzLCAweDU3QjRENDRFLCAweDcyQjZENTRCLCAweEJGRDFFMzkxLCAweEJFQzNEQjc2LCAweEJBNjFBNjQ3LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMDQ2LCAweEI5NjZBODQ3LCAweEI1QzJEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENDRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCRTBFREI0LCAweDlEQkJENzU0LCAweEJGRDdFNkEzLCAweEI3QTdDQjU2LCAweEJFNTdBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMDQ2LCAweDYwOTFDMDdFLCAweDAxRkVGRUZELCAweEE1NkRBRDVDLCAweEJGNTZBMDQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMDQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMDQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMjQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ3LCAweEJGNTZBMDQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweDdCODZCOTc1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDlCNzdCMzZBLCAweEJGNTZBMDQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMDQ2LCAweEJGNTdBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMDQ2LCAweEJGNTZBMTQ3LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTdBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEJGNTZBMTQ2LCAweEE4NzdCMDQzLCAweEJCQzZEQzc3LCAweEJGRDZFNkEwLCAweDk0QjlENjUwLCAweDFGQzZERjgyLCAweDAwRkVGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkZGRSwgMHgzMTlBQ0FBNCwgMHhCNDQwOUE0NiwgMHhCRjU1QTY0NiwgMHhCRjYzQjE0NSwgMHhCRjcwQkE0NSwgMHhCRjc2QkY0NCwgMHhCRjc4QzE0NCwgMHhCRjc4QzA0MywgMHhCRjdBQzE0MywgMHhCRjdCQzE0MywgMHhCRjdDQzI0MywgMHhCRjdEQzI0MywgMHhCRjdGQzM0NCwgMHhCRjgwQzI0MiwgMHhCRjgyQzM0MywgMHhCRjgzQzM0MywgMHhCRjg1QzQ0NCwgMHhCRjg2QzM0MywgMHhCRjg4QzQ0NCwgMHhCRjg5QzQ0NCwgMHhCRjhCQzU0NSwgMHhCRjhCQzQ0NCwgMHhCRjhEQzQ0NSwgMHhCRjhEQzQ0NSwgMHhCRjhGQzU0NSwgMHhCRjkwQzU0NSwgMHhCRjkxQzY0NiwgMHhCRkE2Q0M1NCwgMHhCRkI3RDM2MiwgMHhCRkFGQ0Y1QywgMHhCRkFDQ0U1QywgMHhCRjkzQzE0QSwgMHhCRjgyQjc0NCwgMHhCRjcxQUE0NCwgMHhBQTVBOUI0NCwgMHgwQ0MxRDlCQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkVGRCwgMHg2MDY1QTE1NSwgMHhCRjZEQTY0NCwgMHhCRjhFQkM0QywgMHhCRjkzQzM0NiwgMHhCRjk4QzY0NiwgMHhCRjk4Qzc0NywgMHhCRjk3Qzc0NiwgMHhCRjk3Qzc0NiwgMHhCRjk2Qzc0NiwgMHhCRjk2Qzc0NywgMHhCRjk1Qzc0NiwgMHhCRjk0Qzc0NywgMHhCRjkzQzY0NiwgMHhCRjkzQzY0NiwgMHhCRjkyQzY0NSwgMHhCRjkxQzY0NiwgMHhCRjkwQzU0NSwgMHhCRjhGQzU0NSwgMHhCRjhEQzQ0NSwgMHhCRjhDQzQ0NSwgMHhCRjhCQzQ0NCwgMHhCRjhGQzY0NiwgMHhCRkFBQ0I0RCwgMHhCRkE5Q0I0RiwgMHhCRkIyRDA1RSwgMHhCRkM1REE3QywgMHhCRkJCRDU3NSwgMHhCRjk0QzI0RiwgMHhCRjYyQTg0NCwgMHhBOTUwOUU0QiwgMHgxMEQ5RUFEQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwM0VFRjZEQiwgMHgzRUI2RDY1NiwgMHhBNUJERDg1OCwgMHhCRkQ4RTdBNCwgMHhCOEM0REM3NCwgMHg5RjVDQTQ4MSwgMHhCQjAzNzNCOSwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCMjE4N0VBQywgMHhBNkEzQ0E2MCwgMHhCRkQ2RTY5RCwgMHhCQUM4REU3NiwgMHhBQkJCRDY1MSwgMHhCRkQ4RTdBMywgMHhCNzhEQkU3OCwgMHhCRTAzNzNCQSwgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBODM5OTE5NiwgMHhCQkM2REQ3NCwgMHhCRkQyRTQ5NSwgMHg2Q0I2RDU0RSwgMHgwM0YyRjhFNCwgMHgwMEZGRkZGRiwgMHgwOEUxRUVCRiwgMHg2MkI1RDQ0QiwgMHhCRENERTA4NCwgMHhCRkNERTE4NywgMHhCNTI5ODhBMCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAxNzJCQywgMHhBMjdGQjY2RSwgMHhCRkQ1RTY5RCwgMHhCNEMzREI2OSwgMHgyQkQxRTU5MywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQkRCRUJCMiwgMHg3MEI2RDU0QiwgMHhCRkQwRTI4RCwgMHhCREMzREM4MiwgMHhCNzFEODFBNywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCOTA5NzdCNywgMHhBOEExQzg2NCwgMHhCRkRCRTlBRiwgMHhCQ0M0REI3OCwgMHhCQjEzN0NCMCwgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCMzA2NzVCRCwgMHgwQkQ1RThGNCwgMHgwMEZFRkVGRiwgMHg2RTQxOTZDRCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRTAzNzNCQSwgMHhBNDkyQzA2NiwgMHhCRkQ3RTZBMSwgMHhBQ0MwRDk2MSwgMHgyMEQ1RTc5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNUQzRTc5RiwgMHg4M0I2RDU0QiwgMHhCRkQ1RTU5QiwgMHhCQkI3RDQ3NCwgMHhCQTBBNzdCNiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCNTE0N0NBRSwgMHhBRUJCRDc2MiwgMHhCRkQ3RTZBMiwgMHg4RkI5RDY1MiwgMHgwQkRGRURCOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNSwgMHg5NkJBRDY1MSwgMHhCRkQ4RTdBMywgMHhCQUExQzY1OCwgMHhCRjU2QTE0NiwgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTA0NywgMHhBRjdEQjM0MywgMHhCRUNGRTI4QywgMHhCRkQzRTU5QSwgMHhCNjgxQjY0NywgMHhCRjU1QTE0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NiwgMHhCRjU1QTE0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHg3RTg2QkE3NSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg5ODc3QjM2QywgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhBQjc2QjI0NywgMHhCREM5REU3OSwgMHhCRkQxRTM5MCwgMHg2OEI1RDQ0QywgMHg3MkI2RDU0QiwgMHhCRkQxRTM5MSwgMHhCRUMzREI3NiwgMHhCQTYxQTU0OCwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCOTY1QTg0NywgMHhCNUMzREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0E3Q0I1NywgMHhCRTU2QTE0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NiwgMHhCRjU1QTA0NiwgMHg2MDkwQzA3RSwgMHgwMUZFRkVGRSwgMHhBNjZEQUQ1QywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTE0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NiwgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHg3Qjg2Qjg3NSwgMHgwMUZFRkZGRCwgMHgwMEZERkVGQiwgMHg5Qjc2QjM2OSwgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU1QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NiwgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NywgMHhCRjU1QTA0NiwgMHhCRjU2QTE0NiwgMHhCMzlCQzQ0RCwgMHhCRkQ2RTY5RSwgMHhCOEM2REQ3MiwgMHg0OUI1RDU1MywgMHgwM0VERjVEOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUFBQkQzQjUsIDB4QTQzRjk5NDksIDB4QkY0RkEzNDUsIDB4QkY1RkFGNDYsIDB4QkY2QkI4NDQsIDB4QkY3NEJGNDQsIDB4QkY3NUMwNDMsIDB4QkY3N0MwNDQsIDB4QkY3N0MwNDMsIDB4QkY3OUMxNDQsIDB4QkY3QUMxNDMsIDB4QkY3Q0MyNDMsIDB4QkY3Q0MyNDMsIDB4QkY3RUMyNDMsIDB4QkY3RUMyNDMsIDB4QkY4MEMzNDMsIDB4QkY4MkMzNDMsIDB4QkY4NEM0NDMsIDB4QkY4NEMzNDMsIDB4QkY4N0M0NDQsIDB4QkY4N0M0NDMsIDB4QkY4OUM0NDQsIDB4QkY4OUM1NDQsIDB4QkY4QkM1NDUsIDB4QkY4Q0M0NDQsIDB4QkY4REM0NDUsIDB4QkY5MEM1NDYsIDB4QkZBREQwNUEsIDB4QkZEMkUwNzYsIDB4QkZEM0UwNzcsIDB4QkZBQ0NDNUIsIDB4QkY5NUMxNEUsIDB4QkY3RkI1NDMsIDB4QkY3NEFENDQsIDB4QkY2NUEzNDMsIDB4OTQ1QTlCNEEsIDB4MDNGMkY3RjEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFFMkVERTAsIDB4N0Y1QzlCNEEsIDB4QkY2RUE3NDQsIDB4QkY4M0I3NDQsIDB4QkY5MkMyNDYsIDB4QkY5NkM2NDYsIDB4QkY5NkM3NDcsIDB4QkY5NUM3NDYsIDB4QkY5NUM3NDYsIDB4QkY5NEM3NDYsIDB4QkY5NEM2NDYsIDB4QkY5M0M2NDYsIDB4QkY5M0M2NDYsIDB4QkY5MkM2NDUsIDB4QkY5MUM2NDUsIDB4QkY5MEM1NDUsIDB4QkY4RkM1NDYsIDB4QkY4RUM0NDUsIDB4QkY4REM0NDUsIDB4QkY4Q0MzNDQsIDB4QkY4QkM1NDUsIDB4QkY4QUM0NDQsIDB4QkY4OUM1NDQsIDB4QkZBMkNBNEIsIDB4QkZBOUNCNEYsIDB4QkZBN0NBNTAsIDB4QkZCRkQ3NzUsIDB4QkZCQ0Q2NzgsIDB4QkZBN0NCNUUsIDB4QkY3M0IyNDcsIDB4QkU1M0EwNDUsIDB4NTM3QkI1N0UsIDB4MDBGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkQsIDB4MTVDRUU0OTUsIDB4NjJCNUQ0NEMsIDB4QjZDNURDNkQsIDB4QkZEOEU3QTUsIDB4QjlDNURENzQsIDB4OUQ4MkI4NkEsIDB4QTgyNjg3QTIsIDB4QkMwMjcyQkEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkUwMDcxQkIsIDB4QTM0NDk2OEYsIDB4QjhDNkRDNzIsIDB4QkZENUU1OUIsIDB4QkVDMkRBNjUsIDB4QkZEN0U3QTIsIDB4QjY3MkFGN0MsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QTQ0RjlDODYsIDB4QkRDRUUxODYsIDB4QkVDREUwODQsIDB4NTFCREQ5NjIsIDB4MDBGQUZDRjQsIDB4MDBGRkZGRkYsIDB4MEVFMUVFQkUsIDB4NzhCNkQ0NEEsIDB4QkVEMkUzOTMsIDB4QkFDMkRCNzksIDB4QkIxNTdEQUQsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkQwMzczQkEsIDB4QTZBMkM5NUYsIDB4QkZEOEU3QTMsIDB4QTVCRUQ4NUMsIDB4MUFEMUU1OTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTVEMkU1OUMsIDB4ODRCN0Q1NEIsIDB4QkZENEU1OUIsIDB4QkNCNkQ0NzQsIDB4QkEwODc2QjYsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QjUxNTdEQUUsIDB4QUVCQUQ2NjIsIDB4QkZEQ0VBQjIsIDB4QjdBQkNFNzUsIDB4QkQwODc2QjYsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4OUUwRDc4QjcsIDB4MjRDNkRGOTgsIDB4MjVEMEU0OTYsIDB4ODgzODkwQTUsIDB4QUUxRDgxQTgsIDB4QUYxRTgyQTksIDB4QUQxRDgxQTgsIDB4QTIwRjdBQjIsIDB4QkMwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkEwMzczQkEsIDB4QUExOTdGQUIsIDB4QUUxRTgyQTgsIDB4QUUxRDgxQTgsIDB4QUYxRTgyQTksIDB4QUUxRDgxQTgsIDB4QUUxRTgyQTgsIDB4QUUxRDgxQTgsIDB4QUYxRTgyQTksIDB4QUUxRDgxQTgsIDB4QUUxRTgyQTgsIDB4QUUxRDgxQTgsIDB4QUYxRTgyQTgsIDB4QUUxRDgxQTgsIDB4QUIyNDg1QTQsIDB4QThCMUQxNUQsIDB4QkZEOEU3QTQsIDB4OUJCQkQ3NTUsIDB4MTJENEU3QTEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MjBDREUyOEYsIDB4OTZCOUQ2NTAsIDB4QkZEN0U2QTIsIDB4QjU5RUM2NzMsIDB4QkYwMjczQkEsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QUIyNjg2QTEsIDB4QjZDNERCNkUsIDB4QkZENEU1OUEsIDB4NzdCN0Q2NEYsIDB4MDRFRUY1REIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUU5QTQsIDB4OTZCOUQ2NTEsIDB4QkZEOEU3QTMsIDB4QjlBMUM2NTcsIDB4QkU1NUEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NDlGNDYsIDB4QkY1NEEwNDYsIDB4QUY3Q0IzNDMsIDB4QkVDRkUyOEIsIDB4QkVEM0U0OTksIDB4QUY4OEI5NDYsIDB4QjI2MEE0NDUsIDB4QjI2MEE1NDUsIDB4QjI2MEE0NDUsIDB4QjM1Q0EzNDYsIDB4QkU1NEEwNDYsIDB4QkY1NEEwNDcsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4Qjc1OUEyNDYsIDB4QjE2MEE1NDUsIDB4QjM2MUE2NDYsIDB4QjI2MEE1NDUsIDB4QjI2MUE2NDUsIDB4QjI2MUE1NDUsIDB4QjM2MUE2NDYsIDB4QjI2MUE2NDUsIDB4QjI2MkE2NDYsIDB4QjI2MUE2NDUsIDB4QjE1RkE0NDYsIDB4QkU1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4ODM3QUIzNUEsIDB4MjlEM0U1OTMsIDB4MzNEM0U2OTMsIDB4OTg3OEIzNTUsIDB4QjI2MkE3NDYsIDB4QjI2MUE2NDYsIDB4QjE2MkE3NDcsIDB4QjY1QUEyNDYsIDB4QkY1NEEwNDYsIDB4QkY1M0EwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QjM1REE0NDYsIDB4QjI2M0E3NDcsIDB4QjI2MkE3NDYsIDB4QjI2M0E3NDcsIDB4QjI2MkE2NDYsIDB4QjE2MkE3NDcsIDB4QkM1NkExNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDcsIDB4QkY1M0EwNDYsIDB4QjM2N0E5NDcsIDB4QjdDMkRBNkMsIDB4QkZENEU1OTksIDB4NzhCNkQ0NEQsIDB4NzJCNkQ0NEEsIDB4QkZEMUUzOTEsIDB4QkVDM0RCNzYsIDB4QkE1RkE1NDcsIDB4QkY1NEEwNDYsIDB4QkY1NDlGNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4Qjg2NEE3NDcsIDB4QjVDMkRCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJFMEVEQjQsIDB4OUNCQUQ3NTMsIDB4QkZEN0U2QTIsIDB4QjdBNkNCNTcsIDB4QkU1NUEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NDlGNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4Njg4NEI4NUUsIDB4MkNEMkU0OTIsIDB4QTE3M0IwNEYsIDB4QjI2MkE3NDYsIDB4QjI2MkE3NDYsIDB4QjI2MkE2NDYsIDB4QjE2MkE3NDcsIDB4Qjc1OEEyNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkU1NUEwNDYsIDB4QUY1RUE0NDYsIDB4QjI2MkE2NDYsIDB4QjI2MUE2NDYsIDB4QjI2MkE2NDYsIDB4QjI2MUE2NDUsIDB4QjM2MUE2NDYsIDB4QjI2MUE2NDUsIDB4QjI2MUE2NDYsIDB4QjI2MUE1NDUsIDB4QjM2MUE2NDUsIDB4QjI2MUE1NDUsIDB4QjI2MUE2NDUsIDB4QjI2MEE1NDUsIDB4QjM2MUE2NDYsIDB4ODQ4NEI3NTksIDB4M0FDNkRFNzIsIDB4NDZCQUQ3NTcsIDB4OUM3Q0I1NDksIDB4QjA2REFENDQsIDB4QjA2REFENDUsIDB4QUY2REFENDUsIDB4QTk2OUFCNDcsIDB4QkM1NUEwNDYsIDB4QkY1NEEwNDcsIDB4QkY1MzlGNDYsIDB4QkY1NEEwNDcsIDB4QkY1M0EwNDYsIDB4Qjk1N0ExNDYsIDB4QUY1RkE0NDUsIDB4QjI2MEE1NDUsIDB4QjI2MEE0NDQsIDB4QjI2MEE0NDUsIDB4QjI2MEE0NDQsIDB4QjM2MEE0NDUsIDB4QjY1Q0EyNDUsIDB4QkU1NUEwNDYsIDB4QkY1NDlGNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1NEEwNDYsIDB4QkY1M0EwNDYsIDB4QkY1NUEwNDcsIDB4QjU2QUFBNDQsIDB4QkFDN0RENzcsIDB4QkVEM0U0OTYsIDB4NzlCNkQ1NEQsIDB4MEVENEU3QTQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBCRDNFOEQ4LCAweDhDMzg5NzQ5LCAweEJGNEFBMTQ2LCAweEJGNUJBQzQ2LCAweEJGNjhCNjQ2LCAweEJGNzFCRDQ0LCAweEJGNzRDMDQ0LCAweEJGNzVDMDQ0LCAweEJGNzdDMTQ0LCAweEJGNzdDMDQ0LCAweEJGNzlDMTQ0LCAweEJGNzlDMTQzLCAweEJGN0JDMjQzLCAweEJGN0NDMjQzLCAweEJGN0RDMjQ0LCAweEJGN0VDMjQzLCAweEJGODBDMzQzLCAweEJGODFDMzQyLCAweEJGODNDMzQzLCAweEJGODNDMzQzLCAweEJGODVDNDQzLCAweEJGODZDMzQ0LCAweEJGODhDNDQ0LCAweEJGODhDNDQ0LCAweEJGOEFDNTQ1LCAweEJGOEZDNjQ3LCAweEJGOUVDQTUwLCAweEJGQUVDRjVBLCAweEJGQzBENjY5LCAweEJGQkVENDY5LCAweEJGOUVDNTU2LCAweEJGODFCNjQ4LCAweEJGNzVBRjQ0LCAweEJGNkJBODQzLCAweEJGNjJBMTQzLCAweEJCNTY5OTQzLCAweDZENTM5ODRCLCAweDAxRjZGQUY2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RDBFM0NELCAweDlBNTY5OTQzLCAweEJGNkRBODQ0LCAweEJGODFCNjQ0LCAweEJGOEZDMTQ2LCAweEJGOTVDNzQ2LCAweEJGOTVDNzQ3LCAweEJGOTRDNzQ2LCAweEJGOTVDNzQ3LCAweEJGOTNDNjQ2LCAweEJGOTNDNjQ2LCAweEJGOTJDNjQ1LCAweEJGOTJDNjQ2LCAweEJGOTFDNTQ2LCAweEJGOTBDNTQ2LCAweEJGOEZDNTQ1LCAweEJGOEVDNTQ2LCAweEJGOERDNDQ1LCAweEJGOENDNDQ1LCAweEJGOEJDNDQ0LCAweEJGOEFDNTQ1LCAweEJGODlDNDQ0LCAweEJGODhDNTQ0LCAweEJGOTRDNzQ4LCAweEJGQUFDQzRGLCAweEJGQTZDQTRGLCAweEJGQjFEMDYyLCAweEJGQkJENTc3LCAweEJGQjFEMTZELCAweEJGOENCRTRDLCAweEJGNURBNzQ1LCAweDlFNDU5ODQ1LCAweDBDQzNERUM3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjdGQkVELCAweDI0QkREQTZELCAweDZFQjZENTRDLCAweEI1QzREQjZCLCAweEJGRDhFN0EzLCAweEJFRDJFNDkyLCAweEIyQkNEODY4LCAweEEwOTBDMDY2LCAweEExNUZBNTdGLCAweEE0MzU4RTk4LCAweEFEMjg4N0EyLCAweEIwMUI4MEFBLCAweEIyMTI3QkIxLCAweEJDMDI3MkJBLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEI1MEU3OUIzLCAweEE4QURDRjVGLCAweEJGRDhFN0E0LCAweEJGQ0NFMDgxLCAweEJGRDVFNTlBLCAweEI1NEY5QzhDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEE0NzJBRjczLCAweEJGRDNFNTk2LCAweEI4QzdERDczLCAweDM4QzNERDcyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFBQzlFMTg5LCAweDhDQjhENTRELCAweEJGRDVFNjlFLCAweEI5QThDRDc4LCAweEJCMDg3NkI2LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEI0MTA3QUIyLCAweEFEQjFEMTYzLCAweEJGRDhFN0EzLCAweDkzQkFENzUzLCAweDBGRTBFRUJBLCAweDAwRkZGRkZGLCAweDAxRkZGRkZFLCAweDIxQzRERTdDLCAweDk4QkFENjUxLCAweEJGRDdFNkEyLCAweEI2OURDNjc0LCAweEJGMDI3MkJBLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEFCMkE4OEEwLCAweEI2QzREQzZFLCAweEJGRENFQUIxLCAweEI4OEVCRjc3LCAweEJFMDI3M0JBLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEEyMzY4Rjk5LCAweEEyQkJENzU2LCAweEI2QzNEQjY4LCAweEI4QkVEOTZELCAweEI4QkNENzZELCAweEI5QkREODZFLCAweEI1QkJENzZBLCAweDg4OENCRTY3LCAweEI4MDQ3NEI5LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE2MkE4OUExLCAweEEwQUZEMTU4LCAweEI4QkREODZELCAweEI4QkNENzZELCAweEI5QkREODZFLCAweEI4QkNENzZELCAweEI5QkREODZELCAweEI4QkNENzZELCAweEI5QkREODZFLCAweEI4QkNEODZELCAweEI5QkREODZFLCAweEI4QkNENzZELCAweEI5QkREODZFLCAweEI4QkNENzZELCAweEI5QkREODZELCAweEJEQzlERTc5LCAweEJGRDdFN0ExLCAweDg1QjhENjUwLCAweDBBRURGNUQ2LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZELCAweDJGQkFEODYzLCAweEE2QkREODU5LCAweEJGRDhFN0E0LCAweEI2N0JCNDdDLCAweEJGMDE3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE1NDk5OThDLCAweEJFQ0JFMDdFLCAweEJFRDBFMjhELCAweDVDQjZENTUxLCAweDAyRjhGQkYxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE1LCAweDk2QkFENjUxLCAweEJGRDhFN0EzLCAweEJBQTFDNjU4LCAweEJGNTRBMDQ2LCAweEJGNTNBMDQ2LCAweEJGNTNBMDQ3LCAweEJGNTM5RjQ2LCAweEJGNTNBMDQ3LCAweEFGN0NCMzQzLCAweEJFQ0ZFMjhDLCAweEJGRDZFNkEwLCAweEJDQzJEQTZCLCAweEJBQkVEODY4LCAweEJBQkVEODY4LCAweEI3QkRENzY0LCAweEEwOTVDMDQ3LCAweEJFNTM5RjQ2LCAweEJGNTNBMDQ3LCAweEJGNTNBMDQ2LCAweEJGNTRBMDQ3LCAweEJGNTM5RjQ2LCAweEEwN0JCMzQ1LCAweEFEQjhENTU4LCAweEJBQkZEOTY5LCAweEJBQkVEODY4LCAweEJBQkZEOTY5LCAweEJBQkVEODY4LCAweEJBQkZEODY5LCAweEJBQkVEODY4LCAweEJBQkZEODY5LCAweEI4QkREODY2LCAweDlFQTNDOTRCLCAweEJCNTVBMDQ2LCAweEJGNTNBMDQ3LCAweEJGNTM5RjQ2LCAweEJGNTNBMDQ3LCAweEJGNTNBMDQ2LCAweEExNzVCMDQ2LCAweEEzQkJENzU0LCAweEI2QzREQzY5LCAweEI5QkZEOTY4LCAweEJBQkZEOTY5LCAweEJBQkZEOTY4LCAweEFEQjlENjU5LCAweDlFN0JCNTQ3LCAweEJGNTNBMDQ3LCAweEJGNTI5RjQ2LCAweEJGNTNBMDQ3LCAweEJGNTM5RjQ2LCAweEJFNTRBMDQ3LCAweDk4OUVDNjQ4LCAweEI3QkVEODY1LCAweEJBQkZEOTY5LCAweEJBQkZEOTY5LCAweEJBQkZEOTY4LCAweEFCQjZENDU3LCAweEIzNjRBODQ3LCAweEJGNTNBMDQ3LCAweEJGNTI5RjQ2LCAweEJGNTNBMDQ3LCAweEJGNTNBMDQ2LCAweEJBNUZBNTQ3LCAweEIxQkVEODYyLCAweEJGRDdFN0EwLCAweDg4QjhENTRFLCAweDc0QjZENTRCLCAweEJGRDFFMzkxLCAweEJFQzNEQjc2LCAweEJBNUVBNTQ4LCAweEJGNTNBMDQ3LCAweEJGNTM5RjQ2LCAweEJGNTNBMDQ3LCAweEJGNTNBMDQ2LCAweEI5NjNBNzQ3LCAweEI1QzNEQjY5LCAweEJGRDVFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI1LCAweDlEQkJENzU0LCAweEJGRDdFN0EzLCAweEI3QTdDQzU3LCAweEJFNTRBMDQ2LCAweEJGNTNBMDQ3LCAweEJGNTI5RjQ2LCAweEJGNTNBMDQ3LCAweEJGNTM5RjQ2LCAweDkzODJCODQ3LCAweEE4QkREODU3LCAweEJBQzBEOTY5LCAweEJBQkZEOTY5LCAweEJBQkZEOTY5LCAweEJBQkZEODY4LCAweEFDQjlENTU4LCAweEEyNzVCMjQ3LCAweEJGNTNBMDQ3LCAweEJGNTNBMDQ2LCAweEJGNTRBMDQ3LCAweEJGNTI5RjQ2LCAweEJDNTZBMTQ3LCAweDhFOUZDNzQ3LCAweEI3QkREODYzLCAweEJBQkZEODY4LCAweEJBQkZEOTY5LCAweEJBQkVEODY4LCAweEJBQkZEOTY5LCAweEJBQkVEODY4LCAweEJBQkVEODY4LCAweEJBQkVEODY4LCAweEJBQkZEOTY5LCAweEJBQkVEODY4LCAweEJBQkZEOTY5LCAweEJBQkVEODY4LCAweEJBQkZEOTY5LCAweEI4QzBEOTY4LCAweEI4QzVEQzZDLCAweEI5QzZERDcyLCAweEI5QzdERTczLCAweEI5QzdERDczLCAweEI5QzdERTczLCAweEI5QzZERDcxLCAweEE0QUVDRTUwLCAweEI5NThBMjQ2LCAweEJGNTNBMDQ2LCAweEJGNTNBMDQ2LCAweEJGNTNBMDQ2LCAweEJGNTNBMDQ2LCAweEE2NkRBRDQ3LCAweDlFQjVEMzUwLCAweEJBQkZEODY4LCAweEJBQkVEODY4LCAweEJBQkVEODY4LCAweEJBQkVENzY4LCAweEJBQkVEODY4LCAweEI1QkFENjYyLCAweEFDQTBDNzRELCAweEI3NjNBNzQ0LCAweEJGNTNBMDQ3LCAweEJGNTM5RjQ2LCAweEJGNTNBMDQ3LCAweEJGNTM5RjQ2LCAweEJGNTNBMDQ3LCAweEJCNTdBMDQ1LCAweEIzQjFEMDU5LCAweEJGRDdFN0E0LCAweDlCQkNEODU2LCAweDFEQ0JFMjhDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwM0U4RjNFQiwgMHg2RTQ5QTA1QywgMHhCRTQ0OUU0NiwgMHhCRjU3QUE0NiwgMHhCRjYzQjM0NSwgMHhCRjZFQkM0NSwgMHhCRjcxQkU0NCwgMHhCRjczQkY0NCwgMHhCRjc0QzA0NCwgMHhCRjc2QzA0NCwgMHhCRjc2QzA0NCwgMHhCRjc4QzE0NCwgMHhCRjc4QzE0MywgMHhCRjdBQzE0MywgMHhCRjdCQzE0MywgMHhCRjdDQzI0MywgMHhCRjdEQzI0MywgMHhCRjdFQzM0MywgMHhCRjdFQzI0MiwgMHhCRjgzQzM0NCwgMHhCRjg5QzQ0NywgMHhCRjkyQzg0QiwgMHhCRjk5Qzk0RiwgMHhCRkExQ0I1MywgMHhCRkE1Q0Q1NiwgMHhCRkFEQ0Y1QSwgMHhCRkIxQ0Y1QywgMHhCRkFDQ0M1QSwgMHhCRjlEQzQ1NCwgMHhCRjhBQkE0QywgMHhCRjc2QjA0NiwgMHhCRjZDQTk0NCwgMHhCRjYzQTM0MywgMHhCQjVCOUU0NCwgMHg5RTUxOTg0MywgMHg2OTZCQTc2MywgMHgyREFCQ0NBOCwgMHgwOEU1RjBFNSwgMHgwMEZERkVGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkFFQ0VBQiwgMHhBRjU0OTg0MywgMHhCRjY4QTU0NCwgMHhCRjdCQjI0NCwgMHhCRjg5QkQ0NCwgMHhCRjkxQzQ0NSwgMHhCRjk0QzY0NiwgMHhCRjkyQzU0NiwgMHhCRjkzQzY0NiwgMHhCRjkxQzU0NSwgMHhCRjkxQzY0NiwgMHhCRjkwQzU0NSwgMHhCRjkwQzU0NSwgMHhCRjhGQzQ0NSwgMHhCRjhFQzU0NSwgMHhCRjhEQzQ0NSwgMHhCRjhEQzQ0NSwgMHhCRjhCQzQ0NCwgMHhCRjhCQzU0NSwgMHhCRjg5QzQ0NCwgMHhCRjg5QzQ0NCwgMHhCRjg3QzQ0MywgMHhCRjg2QzQ0NCwgMHhCRjg3QzQ0MywgMHhCRkE2Q0I0RSwgMHhCRkE2Q0E0RiwgMHhCRkE1Q0E1MiwgMHhCRkI3RDM3MSwgMHhCRkI0RDI3MiwgMHhCRjlEQzY1NiwgMHhCRjZEQjA0NywgMHhCQzRGOUY0NSwgMHg0Njc5QjU4MCwgMHgwMEZERkRGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY0RjhFNywgMHgyMkMzREQ3OCwgMHg1REI1RDQ0RCwgMHhBMUJDRDc1NiwgMHhCRENDRTA4MywgMHhCRkQ4RTdBMywgMHhCRkQ2RTY5RiwgMHhCRUNGRTI4QiwgMHhCOEM4REU3OCwgMHhCNUM0REM2QywgMHhCM0JBRDY2OCwgMHhBREIxRDE2NiwgMHhBMzk5QzQ2MywgMHhBMjQ5OTk4QywgMHhCQzAzNzNCOSwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRTAxNzJCQiwgMHhBMDk2QzI2MiwgMHhCRkQ2RTZBMCwgMHhCRkQyRTM5NCwgMHhCRUNFRTE4RCwgMHhCNzM1OEU5OCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRDAzNzNCQSwgMHhBNThCQkQ2OCwgMHhCRkQ2RTY5RiwgMHhBRUMxREE2NCwgMHgyNEQwRTQ5MywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNkM3REY4MiwgMHg5RUJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCODkxQzA3NSwgMHhCRTAwNzJCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBQzI4ODdBMiwgMHhCNkMwRDk2QiwgMHhCRkQ1RTY5RCwgMHg3Q0I3RDU0RSwgMHgwNkVDRjRENSwgMHgwMEZGRkZGRiwgMHgwMEZFRkVGQywgMHgzMEI5RDc2MSwgMHhBN0JFRDk1QiwgMHhCRkQ3RTdBMywgMHhCNjdBQjQ3RCwgMHhCRTAwNzJCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNjRBOUE4QiwgMHhCRENBREY3RiwgMHhCRkQ5RThBQSwgMHhCNTczQUY3QywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNDRFOUM4NywgMHhCRENERTE4NSwgMHhCRkQ3RTZBMiwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ1RTY5QywgMHhCRkQ5RTdBOCwgMHhCNzhEQkU3NywgMHhCRDAyNzJCQSwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNTQ3OTg4QywgMHhCQ0NBREY3RSwgMHhCRkQ4RTdBNSwgMHhCRkQ0RTQ5OSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTQ5OSwgMHhCRkQ1RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5OSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5OSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkNERTE4NSwgMHg2OUI1RDQ0RCwgMHgwM0VGRjZEQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZBRkNGNSwgMHg0MEJBRDc1RSwgMHhCM0MyREE2NywgMHhCRkQ2RTY5RCwgMHhCNjVGQTU4MywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBMzYxQTY3QywgMHhCRkQxRTM4RiwgMHhCQkM5REY3QSwgMHg0MkMwREI2QiwgMHgwMEZDRkRGOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNCwgMHg5NkI5RDY1MSwgMHhCRkQ4RTdBMywgMHhCOUEwQzU1NywgMHhCRTUyOUY0NiwgMHhCRjUxOUY0NiwgMHhCRjUyOUY0NiwgMHhCRjUxOUY0NiwgMHhCRjUyOUY0NiwgMHhBRjdCQjM0MywgMHhCRUNGRTI4QiwgMHhCRkQ3RTdBNCwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5OSwgMHhCRkQ1RTU5QywgMHhCRkQ4RTdBNiwgMHhCODlFQzU1NSwgMHhCRTUyOUY0NiwgMHhCRjUyOUY0NiwgMHhCRjUxOUY0NiwgMHhCRjUyOUY0NiwgMHhCRjUxOUY0NiwgMHhBRjdFQjU0NCwgMHhCRUNFRTE4OSwgMHhCRkQ3RTdBMiwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5OSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTQ5OSwgMHhCRkQ1RTU5QiwgMHhCRkQ5RThBOSwgMHhCOUFFQ0Y1QiwgMHhCQjU1QTA0NiwgMHhCRjUxOUY0NiwgMHhCRjUxOUY0NiwgMHhCRjUxOUY0NiwgMHhCRjUxOUU0NiwgMHhBQzc1QjE0NCwgMHhCQUNCREY3RiwgMHhCRkQ4RThBNiwgMHhCRkQ0RTQ5OSwgMHhCRkQ1RTU5QSwgMHhCRkQ4RTdBNCwgMHhCRkNFRTE4OCwgMHhCNTZFQUQ0NiwgMHhCRjUyOUY0NiwgMHhCRjUxOUY0NiwgMHhCRjUyOUY0NywgMHhCRjUxOUY0NiwgMHhCRDU2QTE0NiwgMHhBOUI1RDM1NiwgMHhCRkQ5RTdBNiwgMHhCRkQ1RTU5QiwgMHhCRkQ0RTU5QSwgMHhCRkQ3RTZBMiwgMHhCRUNFRTE4OSwgMHhCNTcyQjA0NCwgMHhCRjUyOUY0NywgMHhCRjUxOUY0NiwgMHhCRjUyOUY0NiwgMHhCRjUxOUY0NiwgMHhCQjU3QTI0NiwgMHhBQ0I2RDQ1OSwgMHhCRkQ4RTdBMywgMHg5N0JBRDY1MywgMHg3NkI2RDU0QSwgMHhCRkQxRTM5MSwgMHhCRUMyREI3NiwgMHhCQTVEQTQ0NywgMHhCRjUyOUY0NiwgMHhCRjUxOUY0NiwgMHhCRjUxOUY0NywgMHhCRjUxOUY0NiwgMHhCOTYyQTc0NiwgMHhCNUMyREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkRGRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0E2Q0I1NywgMHhCRTUzOUY0NiwgMHhCRjUyQTA0NywgMHhCRjUxOUY0NiwgMHhCRjUyOUY0NiwgMHhCRjUxOUY0NiwgMHhBNzgyQjg0NSwgMHhCRENFRTE4OSwgMHhCRkQ4RTdBMywgMHhCRkQ0RTU5OSwgMHhCRkQ0RTU5QSwgMHhCRkQ3RTZBMiwgMHhCRUNGRTI4QiwgMHhCMjc2QjI0NSwgMHhCRjUyOUY0NiwgMHhCRjUxOUY0NiwgMHhCRjUxOUY0NiwgMHhCRjUxOUY0NiwgMHhCRDU0QTA0NiwgMHhBOEE2Q0I0RSwgMHhCRkQ4RTdBNCwgMHhCRkQ1RTU5QywgMHhCRkQ1RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTQ5OSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTQ5OSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5OSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTQ5OSwgMHhCRkQ0RTU5QSwgMHhCRkQyRTQ5NCwgMHhCRkQyRTQ5MiwgMHhCRkQxRTM5MiwgMHhCRkQyRTQ5MywgMHhCRkQ4RTdBNywgMHhCOUI5RDQ2QSwgMHhCQzU4QTE0NSwgMHhCRjUyQTA0NywgMHhCRjUyOUY0NiwgMHhCRjUyOUY0NiwgMHhCRjUxOUU0NiwgMHhBRjZEQUU0NSwgMHhCOUM2REQ3MiwgMHhCRkQ5RThBNywgMHhCRkQ0RTQ5OSwgMHhCRkQ1RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ0RTU5QSwgMHhCRkQ2RTZBMSwgMHhCRkQ1RTY5RCwgMHhCNEFFQ0U1OSwgMHhCQjU5QTI0NSwgMHhCRjUxOUY0NiwgMHhCRjUyQTA0NywgMHhCRjUyOUY0NiwgMHhCRjUyOUY0NiwgMHhCRjUxOUY0NiwgMHhBQjlFQzY0QywgMHhCRkQ2RTZBMSwgMHhBREMxREE2MiwgMHgyQkI3RDc2MSwgMHgwMUZCRkRGNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGOEZCRjksIDB4NEI3M0I2ODMsIDB4QkIzRTlCNDYsIDB4QkY1MkE3NDYsIDB4QkY2MEIyNDcsIDB4QkY2QUJBNDUsIDB4QkY2RkJGNDUsIDB4QkY3MEJGNDQsIDB4QkY3MkJGNDQsIDB4QkY3M0MwNDQsIDB4QkY3NUMwNDUsIDB4QkY3NkMwNDQsIDB4QkY3OEMxNDUsIDB4QkY3OEMwNDQsIDB4QkY3OUMxNDQsIDB4QkY3QUMxNDMsIDB4QkY3Q0MyNDQsIDB4QkY4MEMyNDYsIDB4QkY4QkM2NEMsIDB4QkY5NkM4NTEsIDB4QkZBMENCNTcsIDB4QkZBNUNDNTksIDB4QkZBQUNFNUIsIDB4QkZBQkNENUIsIDB4QkZBN0NDNTksIDB4QkY5QUM1NTIsIDB4QkY4QUJFNEMsIDB4QkY3QkI1NDcsIDB4QkY3MEFGNDUsIDB4QkY2OEE5NDQsIDB4QkY2MUEzNDQsIDB4QkE1OTlENDMsIDB4QTA1MTk5NDQsIDB4NkE2MEExNUEsIDB4MzA5OEMyOTUsIDB4MEFENEU2RDMsIDB4MDBGOUZCRjksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlDM0RCQzEsIDB4ODM1RDlFNTMsIDB4QkU1RTlGNDQsIDB4QkY2RkFCNDQsIDB4QkY4MEI3NDMsIDB4QkY4QUJGNDQsIDB4QkY5MUM1NDYsIDB4QkY5MUM1NDUsIDB4QkY5MUM2NDYsIDB4QkY5MEM1NDUsIDB4QkY5MEM1NDYsIDB4QkY4RkM1NDUsIDB4QkY4RkM1NDUsIDB4QkY4RUM0NDUsIDB4QkY4REM0NDUsIDB4QkY4Q0M1NDUsIDB4QkY4QkM1NDUsIDB4QkY4QUM1NDQsIDB4QkY4QUM1NDQsIDB4QkY4OEM0NDQsIDB4QkY4N0M1NDQsIDB4QkY4NUM0NDMsIDB4QkY4NUM0NDQsIDB4QkY4M0MzNDMsIDB4QkY5OEM4NEEsIDB4QkZBNkNBNEYsIDB4QkZBM0NBNTAsIDB4QkZBQkNENjAsIDB4QkZCNEQyNzMsIDB4QkZBN0NCNjQsIDB4QkY4NEJDNEIsIDB4QkY1OUE2NDUsIDB4OTU0Mzk4NDgsIDB4MDhENEU3RDcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkIsIDB4MTFEQUVBQUQsIDB4M0JCOEQ2NTksIDB4NkFCNkQ0NEIsIDB4OTdCQkQ3NTQsIDB4QjJDM0RCNjksIDB4QkNDQ0UwODIsIDB4QkZEMUUzOTIsIDB4QkZENUU2OUIsIDB4QkZENkU2OUUsIDB4QkZEN0U3QTMsIDB4QkZENkU2QTEsIDB4QjhDM0RCNkYsIDB4QTg0MTk1OTAsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMTcyQkMsIDB4QTE4OUJDNjcsIDB4QkZENkU2OUUsIDB4QkZENkU2OUYsIDB4QkVDM0RCN0YsIDB4QjYxOTdGQUEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkIwOTc3QjYsIDB4QThBNkNCNjIsIDB4QkZEOEU3QTQsIDB4OUZCQ0Q4NTgsIDB4MTVEQ0VDQjEsIDB4MDBGRkZGRkYsIDB4MDFGOUZDRjIsIDB4MzZCN0Q2NUMsIDB4QUNDMERBNjAsIDB4QkZEN0U2QTIsIDB4QjQ2RkFFN0UsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QTczRDkzOTMsIDB4QkFDOURGN0IsIDB4QkZEMUUzOEYsIDB4NjJCOUQ2NTUsIDB4MDJGNUY5RTgsIDB4MDBGRkZGRkYsIDB4MDFGQkZERjcsIDB4NDFCOUQ3NUQsIDB4QjVDM0RCNjksIDB4QkZENUU1OUQsIDB4QjY1REE0ODYsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTI2NEE4N0MsIDB4QkZEMUUzOTIsIDB4QkZENUU2OUUsIDB4QjY0RjlDOEMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMTcyQkMsIDB4QTQ3MUFGNzMsIDB4QkZEM0U0OTUsIDB4QjlDN0RENzUsIDB4ODNCN0Q1NEIsIDB4ODBCNkQ1NEIsIDB4QjRDMURBNjIsIDB4QkZEN0U2QTIsIDB4QjY3NEIwN0QsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QTQ2NEE4N0IsIDB4QkVEMUUzOTEsIDB4QkNDQURGN0IsIDB4ODRCN0Q1NEIsIDB4N0RCN0Q1NEMsIDB4N0NCNkQ1NEMsIDB4N0RCN0Q1NEQsIDB4N0NCN0Q1NEMsIDB4N0RCN0Q1NEMsIDB4N0NCN0Q1NEMsIDB4N0RCN0Q1NEMsIDB4N0NCNkQ1NEMsIDB4N0RCN0Q1NEMsIDB4N0NCNkQ1NEMsIDB4N0RCN0Q1NEMsIDB4N0NCN0Q1NEMsIDB4NzNCN0Q1NEMsIDB4MkJCRkRCNkYsIDB4MDFGQ0ZFRjksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDRFOUYzRDEsIDB4NTVCNEQ0NEQsIDB4QjlDOURFNzgsIDB4QkZEMkUzOTIsIDB4QjUzRDkyOTUsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMTcyQkMsIDB4QTQ4MkI4NkIsIDB4QkZENUU2OUQsIDB4QjNDM0RCNjksIDB4MkJDQUUxODQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUU5QTQsIDB4OTZCOUQ2NTEsIDB4QkZEOEU3QTMsIDB4QkFBMEM2NTcsIDB4QkY1MjlGNDYsIDB4QkY1MDlFNDYsIDB4QkY1MTlGNDYsIDB4QkY1MDlGNDYsIDB4QkY1MTlGNDcsIDB4QUY3QkIzNDMsIDB4QkVDRkUyOEEsIDB4QkVDQkUwN0UsIDB4ODNCN0Q1NEIsIDB4NzlCNkQ0NEMsIDB4QUNCREQ4NTcsIDB4QkZEN0U2QTIsIDB4Qjg5RkM1NTUsIDB4QkU1MTlGNDYsIDB4QkY1MTlGNDYsIDB4QkY1MDlGNDYsIDB4QkY1MTlGNDcsIDB4QkY1MDlGNDYsIDB4QjA3RUI1NDQsIDB4QkVDRkUyOEIsIDB4QkVDQkUwN0UsIDB4ODBCNkQ1NEIsIDB4NzZCNkQ1NEQsIDB4NzZCNkQ0NEQsIDB4NzZCNkQ1NEQsIDB4NzhCNkQ1NEMsIDB4QTNCQUQ3NTEsIDB4QkZEN0U2QTIsIDB4QkFBRUNGNUMsIDB4QkM1NEEwNDYsIDB4QkY1MTlGNDcsIDB4QkY1MDlFNDYsIDB4QkY1MTlGNDYsIDB4QkY1MDlFNDYsIDB4QUQ3NEIwNDQsIDB4QkJDQkRGODAsIDB4QkZDRkUyODksIDB4OEJCNkQ0NEEsIDB4OTJCN0Q1NEEsIDB4QkVEMEUyOEQsIDB4QkZDQURGN0QsIDB4QkE2MUE2NDYsIDB4QkY1MTlGNDcsIDB4QkY1MDlGNDYsIDB4QkY1MDlGNDYsIDB4QkY1MDlGNDYsIDB4Qjk1QkEzNDcsIDB4QjFCQkQ3NUYsIDB4QkZEN0U2QTEsIDB4OUVCQUQ2NTEsIDB4ODNCN0Q1NEIsIDB4QkFDN0RENzQsIDB4QkZEM0U0OTYsIDB4Qjk3QkI0NDcsIDB4QkY1MTlGNDcsIDB4QkY1MDlFNDYsIDB4QkY1MTlGNDcsIDB4QkY1MDlFNDYsIDB4QkQ1NEExNDcsIDB4QUVBN0NCNTIsIDB4QkZEOEU3QTMsIDB4QTRCREQ4NUEsIDB4NzhCNkQ1NDksIDB4QkZEMUUzOTEsIDB4QkVDM0RCNzYsIDB4QkE1Q0E0NDcsIDB4QkY1MTlGNDcsIDB4QkY1MDlFNDYsIDB4QkY1MDlGNDYsIDB4QkY1MDlGNDYsIDB4Qjk2MUE2NDcsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjQsIDB4OURCQkQ3NTQsIDB4QkZEN0U2QTMsIDB4QjdBNkNCNTYsIDB4QkU1MjlGNDYsIDB4QkY1MDlGNDcsIDB4QkY1MDlGNDYsIDB4QkY1MTlGNDYsIDB4QkY1MDlFNDYsIDB4QTg4MkI4NDUsIDB4QkRDRUUxOEEsIDB4QkRDQkUwN0YsIDB4ODNCNkQ1NEIsIDB4ODdCN0Q1NEEsIDB4QkVDQURGN0MsIDB4QkVEMEUzOEQsIDB4QjI3NkIyNDUsIDB4QkY1MTlGNDcsIDB4QkY1MDlFNDYsIDB4QkY1MDlGNDYsIDB4QkY1MDlFNDYsIDB4QkQ1M0EwNDcsIDB4QTlBNkNCNEUsIDB4QkZEN0U3QTIsIDB4QUVCRkQ5NUQsIDB4NzhCNkQ1NEQsIDB4NzZCNkQ1NEQsIDB4NzZCNkQ1NEQsIDB4NzVCNkQ0NEQsIDB4NzZCNkQ1NEQsIDB4NzZCNkQ1NEQsIDB4NzZCNkQ1NEQsIDB4NzVCNkQ1NEQsIDB4NzZCNkQ1NEQsIDB4NzZCNkQ1NEQsIDB4NzZCNkQ1NEQsIDB4NzVCNkQ0NEQsIDB4NzZCNkQ1NEQsIDB4NkJCNUQ0NEQsIDB4NjZCNUQ1NEUsIDB4NjdCNUQ0NEQsIDB4OTNCOEQ1NEIsIDB4QkZENEU0OTksIDB4QkFCOUQ1NkIsIDB4QkM1NkExNDUsIDB4QkY1MTlGNDcsIDB4QkY1MDlGNDYsIDB4QkY1MDlGNDYsIDB4QkY1MDlFNDYsIDB4QUY2Q0FFNDUsIDB4QjlDN0RENzQsIDB4QkZEMkU0OTMsIDB4OTBCN0Q1NEEsIDB4NzZCNkQ1NEQsIDB4NzZCNkQ1NEQsIDB4NzdCNkQ1NEQsIDB4OTNCOUQ2NTEsIDB4QkVEMEUyOEMsIDB4QkVEMEUzOEYsIDB4QjU3QUIyNDYsIDB4QkY1MDlFNDYsIDB4QkY1MTlGNDcsIDB4QkY1MDlGNDYsIDB4QkY1MDlGNDYsIDB4QkY1MDlFNDYsIDB4QUQ4QkJBNDYsIDB4QkZENEU1OUEsIDB4QjZDNERDNkMsIDB4MzZCNUQ1NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZFLCAweDJEQTJDRkFFLCAweEIxMzY5NzQ1LCAweEJGNERBNDQ2LCAweEJGNUJBRTQ2LCAweEJGNjZCODQ1LCAweEJGNkNCRDQ1LCAweEJGNkZCRTQ1LCAweEJGNkZCRTQ0LCAweEJGNzFCRjQ0LCAweEJGNzJCRjQ0LCAweEJGNzRDMDQ1LCAweEJGNzVCRjQ0LCAweEJGNzZDMDQ0LCAweEJGNzdDMDQzLCAweEJGN0FDMTQ1LCAweEJGODNDMjQ5LCAweEJGOEVDNjUxLCAweEJGOTZDODU0LCAweEJGOUNDOTU3LCAweEJGOURDOTU2LCAweEJGQTBDOTU3LCAweEJGOUFDNzU1LCAweEJGOEZDMTRGLCAweEJGN0VCOTQ4LCAweEJGNzNCMzQ1LCAweEJGNkJBRDQzLCAweEJGNjVBOTQ0LCAweEJFNUVBMzQ0LCAweEJBNTY5RTQ0LCAweEEwNTY5RDRCLCAweDY4NUZBMjVBLCAweDJEOTdDMjk1LCAweDA5RDRFNkQzLCAweDAwRkJGQ0ZCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBCREFFOUQ4LCAweDdDNUQ5RjU0LCAweEJENUU5RjQzLCAweEJGNzFBQzQzLCAweEJGODBCNzQyLCAweEJGODlCRjQzLCAweEJGOEVDNDQ1LCAweEJGOEZDNTQ1LCAweEJGOEVDNDQ1LCAweEJGOEVDNDQ1LCAweEJGOERDNDQ0LCAweEJGOERDNDQ1LCAweEJGOENDNDQ0LCAweEJGOEJDNTQ1LCAweEJGOEFDNDQ0LCAweEJGOEFDNTQ0LCAweEJGODhDNDQ0LCAweEJGODdDNDQ0LCAweEJGODZDNDQzLCAweEJGODZDNDQ0LCAweEJGODRDMzQzLCAweEJGODNDNDQzLCAweEJGODJDMjQyLCAweEJGODdDNDQ1LCAweEJGQTRDQTRGLCAweEJGQTNDOTUwLCAweEJGQTFDODUxLCAweEJGQUZEMDZDLCAweEJGQUJDRTZELCAweEJGOTZDMzUyLCAweEJGNjZBRDQ2LCAweEJDNEI5RDQ1LCAweDNBNzdCNTgwLCAweDAwRkRGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZFLCAweDAyRjJGOEU0LCAweDEyREJFQUFGLCAweDJCQkNEOTY4LCAweDQ0QjdENjU3LCAweDVFQjZENDRELCAweDcwQjZENDRCLCAweDdEQjdENTRELCAweDg0QjdENTRELCAweDk0QkFENzUyLCAweEI5QzhERTc2LCAweEJGRDZFNjlGLCAweEFFNzBBRTdCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDE3MkJCLCAweEEzOTVDMjY0LCAweEJGRDdFNkExLCAweEJGRDhFN0E1LCAweEJBQjVENDcyLCAweEJDMDc3NUI2LCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEIzMTU3REFFLCAweEFFQkNENzYzLCAweEJGRDdFNkExLCAweDhCQjhENTUwLCAweDBBREVFREI4LCAweDAwRkZGRkZGLCAweDAzRjhGQkVGLCAweDQ4QjRENDUxLCAweEI3QzVEQzZELCAweEJFRDRFNTk5LCAweEI4NTE5RDhBLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEE1NUVBNTdFLCAweEJFQ0ZFMjhDLCAweEJDQ0JFMDgwLCAweDQ4QkNEODYwLCAweDAwRkVGRkZFLCAweDAwRkZGRkZGLCAweDA1RTlGM0QwLCAweDU1QjRENDRDLCAweEJBQzlERjdBLCAweEJFRDFFMzkwLCAweEI2M0I5MTk3LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJCLCAweEE0ODVCQTZCLCAweEJFRDZFNkExLCAweEJFQ0VFMjhFLCAweEI3MzY4Rjk3LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJEMDI3M0JBLCAweEE0ODlCQzY5LCAweEJGRDdFNjlGLCAweEFFQzFEQTY0LCAweDMxQkZEQjZELCAweDRDQjRENDRFLCAweEI2QzVEQzZFLCAweEJGRDRFNDk5LCAweEI2NEU5QzhDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJEMDE3MkJCLCAweEE1ODRCOTZBLCAweEJGRDVFNTlDLCAweEIyQzNEQjY5LCAweDM0QkJEODY1LCAweDE1RDNFNjlGLCAweDE1RDNFNjlFLCAweDE1RDNFNjlGLCAweDE1RDNFNjlFLCAweDE1RDNFNzlGLCAweDE1RDNFNjlFLCAweDE1RDNFNjlGLCAweDE1RDNFNjlFLCAweDE1RDNFNzlGLCAweDE1RDNFNjlFLCAweDE1RDNFNjlFLCAweDE1RDNFNjlFLCAweDEwRDhFOUFBLCAweDAxRjZGQUVCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTZGMUNCLCAweDZBQjVENDRCLCAweEJEQ0VFMTg5LCAweEJEQzlERjg0LCAweEI5MjU4NUExLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJBMDU3NEI5LCAweEE3OUJDNTYzLCAweEJGRDdFN0EzLCAweEE1QkVEODVDLCAweDFCRDRFNzlGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE0LCAweDk2QjlENjUxLCAweEJGRDhFN0EzLCAweEI5OUZDNTU3LCAweEJFNTA5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEFGN0FCMjQzLCAweEJFQ0ZFMjhBLCAweEJEQ0FERjdDLCAweDRCQjRENDUxLCAweDI3QkZEQTZELCAweDlGQkJENzU0LCAweEJGRDdFNkEyLCAweEI4OUVDNTU1LCAweEJFNTA5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEIwN0NCNDQ0LCAweEJFQ0ZFMThCLCAweEJEQ0FERjdDLCAweDQ1QjNENDUyLCAweDExQ0VFNDk4LCAweDBFRDJFNTlGLCAweDBGRDJFNkEwLCAweDFEQzdERjgxLCAweDkwQjlENjRGLCAweEJGRDdFNkExLCAweEJBQUVDRjVDLCAweEJCNTI5RjQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RjQ2LCAweEJGNEU5RTQ2LCAweEFDNzNCMDQ0LCAweEJBQ0JERjgwLCAweEJGQ0VFMTg4LCAweDVGQjRENDRELCAweDdEQjZENTRBLCAweEJFRDNFNDk3LCAweEJBQzREQzcwLCAweEJENTlBMzQ1LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RjQ3LCAweEJGNEY5RTQ2LCAweEIxNjJBODQ2LCAweEI3QzBEOTY5LCAweEJGRDVFNjlDLCAweDc5QjZENTRFLCAweDQzQjRENDUxLCAweEIxQzJEQTY2LCAweEJGRDZFNjlFLCAweEI1ODhCQTRCLCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJFNTA5RjQ3LCAweEFBOUNDNjRCLCAweEJGRDZFNjlGLCAweEFEQzFEQTY0LCAweDdBQjVENDQ4LCAweEJGRDFFMzkxLCAweEJFQzJEQjc2LCAweEJBNUJBMzQ3LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RjQ2LCAweEJGNEY5RTQ2LCAweEI4NUZBNTQ2LCAweEI1QzJEQTY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCRTBFREI0LCAweDlDQkJENzU0LCAweEJGRDdFNkEyLCAweEI3QTVDQjU2LCAweEJFNTA5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNTA5RjQ2LCAweEJGNEU5RTQ2LCAweEE4ODFCODQ0LCAweEJEQ0VFMThBLCAweEJCQ0FERjdELCAweDQ5QjNENDUxLCAweDU4QjRENDRELCAweEJFQzlERTdBLCAweEJFRDBFMjhELCAweEIyNzVCMjQ0LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJENTJBMDQ2LCAweEE4QTZDQjRFLCAweEJGRDdFN0EyLCAweEEyQkREODVDLCAweDI1QjZENjYyLCAweDBFRDJFNjlGLCAweDBGRDJFNkEwLCAweDBGRDJFNkEwLCAweDBGRDJFNkEwLCAweDBFRDJFNUEwLCAweDBGRDJFNkEwLCAweDBGRDJFNkEwLCAweDBGRDJFNkEwLCAweDBFRDJFNUEwLCAweDBGRDJFNkEwLCAweDBGRDJFNkEwLCAweDBGRDJFNkEwLCAweDBCRDZFOEE5LCAweDA5RUVGNURBLCAweDExRDdFOEExLCAweDdGQjdENTRDLCAweEJGRDNFNDk4LCAweEJBQjlENTZCLCAweEJDNTVBMTQ1LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNTA5RTQ3LCAweEJGNEY5RTQ2LCAweEFGNkJBRDQ1LCAweEI5QzdERDczLCAweEJGRDJFNDkyLCAweDY4QjRENDRDLCAweDE3QkVEQjc3LCAweDBFRDJFNkEwLCAweDBGRDJFNkEwLCAweDM1QzFEQjZELCAweEFEQzBEQTYwLCAweEJGRDZFNkExLCAweEI4OTBCRDRELCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEU5RTQ2LCAweEJGNEY5RTQ2LCAweEJGNEY5RTQ2LCAweEE4ODhCOTQ0LCAweEJFRDJFMzkzLCAweEJBQzdERDczLCAweDNCQjVENTU4LCAweDAyRkFGQ0Y1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxN0FCRDRCNywgMHhBMjM2OTg0QSwgMHhCRjQ2QTE0NiwgMHhCRjU3QUQ0NywgMHhCRjYxQjU0NiwgMHhCRjZBQkQ0NiwgMHhCRjZDQkU0NSwgMHhCRjZFQkU0NiwgMHhCRjZGQkU0NSwgMHhCRjcxQkY0NSwgMHhCRjcxQkY0NCwgMHhCRjczQzA0NSwgMHhCRjc0QkY0NCwgMHhCRjc4QzE0NywgMHhCRjgxQzE0QywgMHhCRjhCQzQ1MiwgMHhCRjkwQzU1NCwgMHhCRjkzQzY1NSwgMHhCRjk1QzY1NCwgMHhCRjk0QzU1MywgMHhCRjg3QkY0RSwgMHhCRjc4Qjg0OCwgMHhCRjZEQjI0NSwgMHhCRjY3QUQ0NSwgMHhCRjYxQTg0NCwgMHhCRjVCQTM0NSwgMHhCOTUzOUQ0NCwgMHg5RTRFOUE0OCwgMHg2NjVFQTM1RCwgMHgyREFERDBBRCwgMHgwOEUyRUVFMywgMHgwMUZERkVGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOURCRUFEQSwgMHg3MzVEOUY1NSwgMHhCRTVFQTA0NCwgMHhCRjcwQUM0MywgMHhCRjdGQjc0MywgMHhCRjg3QkU0MywgMHhCRjhEQzQ0NSwgMHhCRjhEQzQ0NSwgMHhCRjhEQzQ0NSwgMHhCRjhDQzQ0NCwgMHhCRjhDQzU0NSwgMHhCRjhCQzQ0NCwgMHhCRjhBQzU0NCwgMHhCRjg5QzQ0NCwgMHhCRjg5QzU0NSwgMHhCRjg3QzQ0NCwgMHhCRjg2QzQ0NCwgMHhCRjg1QzQ0MywgMHhCRjg1QzQ0NCwgMHhCRjgzQzM0MywgMHhCRjgyQzM0MywgMHhCRjgwQzM0MiwgMHhCRjgwQzM0MywgMHhCRjk5Qzc0QywgMHhCRkEzQzk1MCwgMHhCRkExQzg1MCwgMHhCRkEzQ0E1OSwgMHhCRkFCQ0U2RCwgMHhCRjlGQzg1RCwgMHhCRjdFQjk0QiwgMHhCRjU1QTU0NiwgMHg4QjNGOTc0NywgMHgwNUQxRTdENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZFRkZGRCwgMHgwMkYyRjhFNCwgMHgwOEVCRjREMiwgMHgwRkRFRUNCNiwgMHgxNUQwRTU5NywgMHgxQUNFRTM5MywgMHg0N0I2RDU1MywgMHhCMUMxREE2NCwgMHhCRkQ2RTY5RiwgMHhCNzYyQTY4MywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCOTA4NzZCNywgMHhBOUE5Q0Q2MCwgMHhCRkQ4RTdBNSwgMHhCRkQ4RTdBNiwgMHhCNTk2QzM3NywgMHhCRTAzNzNCQSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBQTJFOEI5RSwgMHhCOEM0REI3MCwgMHhCRkQ0RTU5OSwgMHg3MkI3RDU0RiwgMHgwNUY2RkFFQywgMHgwMEZGRkZGRiwgMHgwNkU1RjBDNiwgMHg1Q0I1RDQ0RCwgMHhCRENDRTA3RiwgMHhCRUNFRTE4QywgMHhCNTMzOEQ5QywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRTAxNzJCQiwgMHhBNDc5QjM3MCwgMHhCRkQ0RTU5OSwgMHhCNkM1REQ2RSwgMHgzMEM1REU3OSwgMHgwMEZGRkZGRSwgMHgwMEZGRkZGRiwgMHgwQkU3RjJDQywgMHg2QkI1RDQ0QiwgMHhCRUNGRTI4QSwgMHhCQ0M4REU4MywgMHhCQTI1ODVBMywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCQTA1NzRCOCwgMHhBODlFQzc2MywgMHhCRkRBRThBQywgMHhCRUM1REM3RiwgMHhCNzE5N0ZBQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCQjA5NzZCNywgMHhBOEE3Q0M2MSwgMHhCRkQ4RTdBNCwgMHg5RkJERDg1OSwgMHgxQkNDRTI4RSwgMHg1Q0I0RDQ0RCwgMHhCRENCRTA3RSwgMHhCRUNFRTE4RCwgMHhCODM3OEY5OCwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCQjA2NzVCOCwgMHhBNzlCQzY2NiwgMHhCRkQ3RTdBMywgMHhBNUJFRDk1QywgMHgxOURCRUJBRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkNGRTQ5NywgMHg3RkI2RDU0QSwgMHhCRkQzRTQ5NywgMHhCQ0I5RDY3QiwgMHhCODEwN0FCMSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCNjEyN0JCMSwgMHhBREIwRDE2MywgMHhCRkQ4RTdBNCwgMHg5M0JBRDY1MywgMHgwRUU0RjBDMiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RUFBNSwgMHg5NkJBRDc1MSwgMHhCRkQ4RTdBMywgMHhCQUEwQzU1NywgMHhCRjRGOUY0NywgMHhCRjRFOUU0NywgMHhCRjRFOUU0NywgMHhCRjRFOUU0NiwgMHhCRjRFOUU0NywgMHhBRjdBQjI0MywgMHhCRUNGRTI4QSwgMHhCRENBREY3RCwgMHg0QkI0RDU1MiwgMHgxRkNGRTM4RCwgMHg5RkJDRDc1NCwgMHhCRkQ3RTZBMiwgMHhCODlFQzU1NSwgMHhCRTRGOUU0NiwgMHhCRjRFOUU0NywgMHhCRjRFOUU0NiwgMHhCRjRGOUY0NywgMHhCRjRFOUU0NiwgMHhCMDdDQjQ0NCwgMHhCRUNGRTI4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwNEY2RkFFRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUZCQywgMHg5MEI5RDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFFQ0Y1QywgMHhCQzUyOUY0NiwgMHhCRjRGOUU0NywgMHhCRjREOUU0NiwgMHhCRjRFOUU0NywgMHhCRjRFOUU0NiwgMHhBRDczQjA0NCwgMHhCQkNCRTA4MCwgMHhCRkNFRTI4OCwgMHg2M0I1RDQ0QywgMHg4QkI4RDY0RCwgMHhCRkQ2RTY5RSwgMHhCOEI2RDQ2NywgMHhCRDUzQTA0NiwgMHhCRjRFOUU0NywgMHhCRjRFOUU0NiwgMHhCRjRFOUU0NywgMHhCRjRFOUU0NiwgMHhBQjcxQjA0NiwgMHhCQkM4REU3NywgMHhCRkQyRTQ5MiwgMHg2OEI1RDQ0RSwgMHgzMUI1RDU1OCwgMHhBOEJFRDk1QywgMHhCRkQ4RTdBMywgMHhCNTlBQzU1MCwgMHhCRjRFOUU0NywgMHhCRjRFOUQ0NiwgMHhCRjRFOUY0NywgMHhCRjRFOUU0NywgMHhCRjRFOUU0NywgMHhBODkwQzA0OCwgMHhCRkQ0RTU5OSwgMHhCNUM1REM2RiwgMHg4MEI2RDQ0NywgMHhCRkQxRTM5MSwgMHhCRUMzREI3NiwgMHhCQTVBQTM0NywgMHhCRjRFOUU0NywgMHhCRjRFOUU0NiwgMHhCRjRGOUU0NywgMHhCRjRFOUU0NiwgMHhCOTVFQTU0NiwgMHhCNUMzREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNSwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0E1Q0I1NywgMHhCRTUwOUY0NiwgMHhCRjRFOUU0NywgMHhCRjREOUU0NiwgMHhCRjRFOUU0NiwgMHhCRjRFOUU0NiwgMHhBODgxQjc0NCwgMHhCRENFRTE4QSwgMHhCQ0NCRTA3RSwgMHg0OUIzRDQ1MiwgMHg1NkI1RDQ0RSwgMHhCRUNBREY3QSwgMHhCRUQwRTM4RCwgMHhCMjc0QjI0NSwgMHhCRjRFOUU0NiwgMHhCRjRFOUU0NiwgMHhCRjRFOUU0NywgMHhCRjRFOUU0NiwgMHhCRDUwOUY0NiwgMHhBOEE2Q0I0RSwgMHhCRkQ4RTdBMywgMHhBMkJFRDg1QywgMHgyMUJFREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQ0RTQ5OSwgMHhCQUI5RDU2QiwgMHhCQzU0QTE0NSwgMHhCRjRFOUU0NywgMHhCRjRFOUU0NiwgMHhCRjRGOUU0NiwgMHhCRjRFOUU0NiwgMHhBRjZBQUQ0NSwgMHhCOUM3REQ3NCwgMHhCRkQyRTQ5MywgMHg2OUI1RDQ0RCwgMHgwQ0QxRTY5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNEQyRTU5NSwgMHhBN0JERDg1OSwgMHhCRkQ3RTZBMiwgMHhCODk0QkY1MCwgMHhCRjRFOUU0NiwgMHhCRjRFOUU0NywgMHhCRjREOUQ0NiwgMHhCRjRFOUU0NiwgMHhCRjREOUU0NiwgMHhBOTg4Qjk0NCwgMHhCRkQxRTM5MiwgMHhCQUM4REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlEQUVDRTAsIDB4ODgzMTk2NEIsIDB4QkY0MDlGNDcsIDB4QkY1MkE5NDcsIDB4QkY1RUIzNDcsIDB4QkY2NkJBNDYsIDB4QkY2QUJFNDYsIDB4QkY2QkJENDUsIDB4QkY2REJFNDUsIDB4QkY2RUJFNDUsIDB4QkY2RkJGNDUsIDB4QkY3MEJFNDQsIDB4QkY3NUMwNDcsIDB4QkY4MEMxNEQsIDB4QkY4OEMzNTMsIDB4QkY4OUMyNTMsIDB4QkY4QUMzNTMsIDB4QkY4QkMxNTIsIDB4QkY4NEJFNEYsIDB4QkY3NUI3NDksIDB4QkY2OUIxNDYsIDB4QkY2MUFCNDQsIDB4QkY1REE3NDUsIDB4QkU1NkEyNDUsIDB4QkE0RTlENDUsIDB4OUQ0OTk5NDcsIDB4NjU1RUE1NjEsIDB4MkFBREQwQUYsIDB4MDdEMkU1RDMsIDB4MDBGQUZDRkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDZEQkU5REEsIDB4NkI1QzlGNTUsIDB4QkM1QzlGNDMsIDB4QkY2RUFCNDMsIDB4QkY3REI2NDIsIDB4QkY4NkJFNDMsIDB4QkY4QUMzNDQsIDB4QkY4QkM1NDUsIDB4QkY4QUM0NDQsIDB4QkY4QUM1NDQsIDB4QkY4OEM0NDMsIDB4QkY4OEM0NDQsIDB4QkY4N0M0NDMsIDB4QkY4N0M0NDQsIDB4QkY4NUMzNDMsIDB4QkY4NUM0NDMsIDB4QkY4M0MzNDMsIDB4QkY4M0MzNDMsIDB4QkY4MUMzNDIsIDB4QkY4MEMzNDMsIDB4QkY3RkMyNDMsIDB4QkY3RUMyNDMsIDB4QkY4NUMzNDUsIDB4QkZBMkM5NTAsIDB4QkY5RkM4NTAsIDB4QkY5REM3NTAsIDB4QkZBNENBNjIsIDB4QkZBMkNBNjYsIDB4QkY5MEMxNEYsIDB4QkY2MUFDNDcsIDB4QkE0NzlDNDUsIDB4MkQ4RkMzOTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGM0Y4RTUsIDB4NEZCNkQ1NTMsIDB4QkFDN0RENzQsIDB4QkZEMkU0OTQsIDB4QjQ0NTk2OTAsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QjExQTgwQUIsIDB4QjFCN0Q0NjYsIDB4QkZEOUU4QTcsIDB4QkZEN0U3QTMsIDB4Qjg3OEIzN0MsIDB4QkUwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QTU0RDlDODksIDB4QkRDQkUwODAsIDB4QkVDRUUyODksIDB4NTdCNUQ0NTAsIDB4MDFGN0ZBRUQsIDB4MDBGRkZGRkYsIDB4MEREREVDQjYsIDB4NzJCNUQ0NEEsIDB4QkVEMUUzOTEsIDB4QkRDNkREN0IsIDB4QkExNzdFQUQsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkQwMzczQjksIDB4QTU5OEM0NjQsIDB4QkZEN0U2QTIsIDB4QUFCRkQ5NUYsIDB4MURENUU3QTAsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTNDRkU0OTYsIDB4N0ZCNkQ0NEEsIDB4QkZENEU1OTksIDB4QkJCNkQ0NzksIDB4QjkwRjdBQjIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjQxMjdCQUYsIDB4QUVCMkQyNjQsIDB4QkZEQkU5QjIsIDB4QjlCNkQ0NzIsIDB4QkMwODc2QjYsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QjMxNTdEQUYsIDB4QUVCQkQ3NjMsIDB4QkZEN0U2QTEsIDB4OEJCOEQ1NTAsIDB4MTdCQ0RBNkQsIDB4NzFCNUQ0NEEsIDB4QkZEMUUzOEYsIDB4QkRDM0RCN0UsIDB4QjYxQTdGQUIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjYwRjdBQjEsIDB4QUNCOEQ1NjAsIDB4QkZEN0U2QTIsIDB4OTNCQUQ3NTMsIDB4MEREQkVCQjIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MURDRUUzOTMsIDB4OTJCOUQ2NEYsIDB4QkZENkU2QTEsIDB4QjlBNkNCNzIsIDB4QkQwMjcyQkEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QUYyMzg1QTQsIDB4QjNDM0RCNjksIDB4QkZENUU1OUMsIDB4N0RCOEQ1NTAsIDB4MDZFQkY0RDQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUU5QTQsIDB4OTZCOUQ2NTEsIDB4QkZEN0U3QTMsIDB4Qjk5RkM1NTcsIDB4QkU0RTlFNDYsIDB4QkY0QzlENDYsIDB4QkY0RDlENDYsIDB4QkY0RDlENDYsIDB4QkY0RDlFNDcsIDB4QUY3OEIyNDMsIDB4QkVDRkUyOEEsIDB4QkRDQURGN0QsIDB4NEJCNEQ0NTIsIDB4MUVDRkUzOEQsIDB4OUZCQ0Q3NTQsIDB4QkZEN0U2QTIsIDB4Qjg5RUM1NTUsIDB4QkU0RDlENDYsIDB4QkY0RDlFNDcsIDB4QkY0QzlENDYsIDB4QkY0RDlFNDYsIDB4QkY0QzlENDYsIDB4QjA3QkI0NDQsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDNGNkZBRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VFQkMsIDB4OTBCOUQ2NEYsIDB4QkZEN0U2QTEsIDB4QkFBRUNGNUMsIDB4QkI1MDlFNDYsIDB4QkY0RDlFNDcsIDB4QkY0QzlENDYsIDB4QkY0RDlENDYsIDB4QkY0QzlENDYsIDB4QUQ3MkFGNDQsIDB4QkJDQkUwODAsIDB4QkZDRUUxODgsIDB4NjhCNUQ0NEEsIDB4OThCQUQ2NTEsIDB4QkZEN0U2QTIsIDB4QkJBN0NDNUMsIDB4QkQ0RTlFNDYsIDB4QkY0RDlENDYsIDB4QkY0QzlENDYsIDB4QkY0RDlFNDcsIDB4QkY0QzlENDYsIDB4QUQ3N0IyNDUsIDB4QkNDQ0UwODQsIDB4QkZDREUxODUsIDB4NTVCM0Q0NEYsIDB4MjJDRUUzOEUsIDB4OUJCQUQ2NTMsIDB4QkZEOEU3QTQsIDB4QjlBNUNBNTksIDB4QkU0RjlFNDcsIDB4QkY0RDlENDYsIDB4QkY0RDlFNDcsIDB4QkY0QzlENDYsIDB4QkY0RDlFNDYsIDB4QUM4MEI3NDYsIDB4QkVEMEUzOEYsIDB4QkJDOURFN0EsIDB4ODhCNkQ0NDYsIDB4QkZEMUUzOTEsIDB4QkVDMkRCNzYsIDB4QkE1OUEyNDYsIDB4QkY0RDlFNDYsIDB4QkY0QzlENDYsIDB4QkY0RDlENDYsIDB4QkY0QzlENDYsIDB4Qjk1REE1NDYsIDB4QjVDM0RCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJFMEVEQjQsIDB4OURCQkQ3NTQsIDB4QkZEN0U2QTIsIDB4QjdBNUNBNTYsIDB4QkU0RTlFNDYsIDB4QkY0RDlFNDcsIDB4QkY0QzlENDYsIDB4QkY0RDlFNDYsIDB4QkY0RDlENDYsIDB4QTg4MEI3NDQsIDB4QkRDRUUyOEIsIDB4QkJDQURGN0QsIDB4NDhCM0Q0NTEsIDB4NTZCNUQ0NEQsIDB4QkVDOURFNzksIDB4QkVEMEUyOEQsIDB4QjI3M0IxNDQsIDB4QkY0RDlFNDcsIDB4QkY0QzlENDYsIDB4QkY0RDlENDYsIDB4QkY0QzlENDYsIDB4QkQ0RjlGNDYsIDB4QThBNkNCNEUsIDB4QkZEN0U3QTIsIDB4QTJCREQ4NUMsIDB4MjBCRURBNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFMkVFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZENEU0OTksIDB4QkFCOUQ0NkIsIDB4QkM1MkEwNDUsIDB4QkY0RDlFNDcsIDB4QkY0QzlENDYsIDB4QkY0RDlFNDYsIDB4QkY0QzlENDYsIDB4QUY2OUFDNDUsIDB4QjlDN0RENzQsIDB4QkZEMkUzOTIsIDB4NjhCNEQ0NEQsIDB4MENEMUU2OUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjNEMkU1OTUsIDB4QTZCREQ4NTksIDB4QkZEN0U2QTEsIDB4Qjg5NEJGNEYsIDB4QkU0QzlENDYsIDB4QkY0RDlFNDcsIDB4QkY0RDlENDYsIDB4QkY0QzlENDYsIDB4QkY0QzlENDYsIDB4QTk4OEI4NDQsIDB4QkZEMUUzOTEsIDB4QkFDN0RENzQsIDB4M0JCNUQ1NTgsIDB4MDJGQUZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRERFRUUzLCAweDY3NDI5RjVELCAweEJEMzg5QzQ2LCAweEJGNENBNzQ3LCAweEJGNThCMDQ3LCAweEJGNjJCOTQ3LCAweEJGNjdCQzQ2LCAweEJGNjlCRDQ2LCAweEJGNkFCRDQ2LCAweEJGNkNCRTQ2LCAweEJGNkRCRTQ1LCAweEJGNzBCRTQ2LCAweEJGN0NDMDRELCAweEJGODZDMjUzLCAweEJGODdDMTUzLCAweEJGODZDMTU0LCAweEJGODFCRTUxLCAweEJGNzRCODRDLCAweEJGNjZCMDQ3LCAweEJGNUZBQjQ2LCAweEJGNTlBNjQ1LCAweEJGNTNBMjQ1LCAweEJBNEE5QzQ1LCAweDlCNDQ5ODQ2LCAweDY0NEM5QzUyLCAweDJCOTZDNTlBLCAweDA4RDNFNkQ1LCAweDAxRjlGQ0ZBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RENFQkRDLCAweDYzNUE5RjU2LCAweEJDNUI5RjQ0LCAweEJGNkNBQjQzLCAweEJGN0FCNjQzLCAweEJGODNCRDQyLCAweEJGODhDMzQ0LCAweEJGODhDNDQ0LCAweEJGODhDNDQ0LCAweEJGODdDMzQ0LCAweEJGODdDNDQ0LCAweEJGODVDMzQzLCAweEJGODVDNDQ0LCAweEJGODRDMzQzLCAweEJGODNDNDQzLCAweEJGODJDMzQyLCAweEJGODFDMzQzLCAweEJGN0ZDMjQzLCAweEJGN0ZDMzQzLCAweEJGN0VDMjQzLCAweEJGN0RDMjQzLCAweEJGN0JDMTQzLCAweEJGOTdDNzRDLCAweEJGOUZDODUwLCAweEJGOURDODUwLCAweEJGOUNDNzUyLCAweEJGQTJDQTY3LCAweEJGOTZDNDU3LCAweEJGNzdCNzRCLCAweEJGNTBBMjQ1LCAweDdFNTlBNjYxLCAweDAyRjdGQUY3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTNFRkMzLCAweDY2QjVENDRBLCAweEJEQ0RFMTg3LCAweEJFQ0RFMTg0LCAweEI4MjU4NkEzLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEFCMzA4QzlCLCAweEI3QzZERDcxLCAweEJGRDlFOEE3LCAweEJGRDVFNTlDLCAweEI0NThBMTg3LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEEzNjZBOTdBLCAweEJFRDFFMzkyLCAweEJDQzlERTc3LCAweDNDQzZERTc4LCAweDAwRkZGRkZFLCAweDAwRkZGRkZGLCAweDE3RDZFOEE1LCAweDg3QjdENTRCLCAweEJGRDZFNjlFLCAweEI3QjFEMTc1LCAweEJEMEI3N0I0LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEI4MEE3N0I1LCAweEFCQjJEMjYwLCAweEJGRDdFN0EzLCAweDk5QkJENzU0LCAweDEwRENFQkIzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFFQ0VFMzkyLCAweDkzQjlENjRGLCAweEJGRDdFN0EyLCAweEI4QTRDQTcxLCAweEJFMDI3M0JCLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEFEMjQ4NUEzLCAweEI0QzREQzZCLCAweEJGREJFOUIxLCAweEI3OTVDMjc4LCAweEJFMDM3M0I5LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEFBMkY4QzlELCAweEI4QzNEQjcwLCAweEJGRDRFNTk5LCAweDcyQjZENDRFLCAweDFCQ0RFMzkxLCAweDg3QjdENTRDLCAweEJGRDVFNTlELCAweEI5QjVENDcyLCAweEJEMDg3NkI3LCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEFDMjM4NUE0LCAweEI1QzFEQTZDLCAweEJGRDVFNTlDLCAweDdDQjhENjRGLCAweDA2RjRGOUU3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkRGRUZBLCAweDJCQjhENzYxLCAweEEzQkREODU3LCAweEJGRDdFN0E0LCAweEI0ODVCOTc5LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE4M0M5Mjk0LCAweEJCQzlERjdBLCAweEJGRDFFMzkxLCAweDYzQjhENjUzLCAweDAyRkNGREY3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE0LCAweDk2QkFENjUxLCAweEJGRDhFN0EzLCAweEJBOUZDNTU3LCAweEJGNEQ5RDQ2LCAweEJGNEI5RDQ2LCAweEJGNEI5RDQ2LCAweEJGNEI5RDQ2LCAweEJGNEI5RDQ3LCAweEFGNzlCMjQzLCAweEJFQ0ZFMjhCLCAweEJEQ0FERjdELCAweDRCQjRENDUyLCAweDFFQ0ZFMzhELCAweDlGQkNEODU1LCAweEJGRDdFN0EyLCAweEI4OURDNTU1LCAweEJFNEM5RDQ2LCAweEJGNEM5RTQ3LCAweEJGNEI5RDQ2LCAweEJGNEM5RDQ2LCAweEJGNEI5RDQ2LCAweEIwN0JCNDQ0LCAweEJFQ0ZFMjhCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDA0RjdGQUVELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRkJDLCAweDkxQkFENjRGLCAweEJGRDdFN0ExLCAweEJBQURDRjVDLCAweEJDNEY5RTQ2LCAweEJGNEM5RDQ3LCAweEJGNEI5RDQ2LCAweEJGNEM5RDQ2LCAweEJGNEI5RDQ2LCAweEFENzFBRjQ0LCAweEJCQ0JFMDgwLCAweEJGQ0ZFMjg4LCAweDZDQjVENDRBLCAweEE1QkREODU4LCAweEJGRDdFNkEzLCAweEI2OUVDODUzLCAweEJGNEM5RDQ2LCAweEJGNEM5RDQ3LCAweEJGNEI5RDQ2LCAweEJGNEM5RDQ2LCAweEJGNEI5RDQ2LCAweEFBODRCOTQ2LCAweEJFRDFFMzkxLCAweEJBQzlERjc5LCAweDQ1QjNENDUxLCAweDE1Q0ZFNDkyLCAweDhEQjhENTRELCAweEJGRDdFNkEwLCAweEI3QjREMjYzLCAweEJENTFBMDQ3LCAweEJGNEI5RDQ2LCAweEJGNEM5RDQ2LCAweEJGNEI5RDQ2LCAweEJGNEI5RDQ3LCAweEFFNzRCMTQ1LCAweEJEQ0RFMTgzLCAweEJGQ0VFMTg3LCAweDkxQjZENTQ1LCAweEJGRDFFMzkxLCAweEJFQzJEQjc2LCAweEJBNTdBMjQ2LCAweEJGNEM5RDQ3LCAweEJGNEI5RDQ2LCAweEJGNEM5RDQ2LCAweEJGNEI5RDQ2LCAweEI5NURBNTQ2LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI0LCAweDlEQkJENzU0LCAweEJGRDdFN0EzLCAweEI3QTRDQjU2LCAweEJFNEQ5RDQ2LCAweEJGNEM5RDQ3LCAweEJGNEI5RDQ2LCAweEJGNEI5RDQ2LCAweEJGNEI5RDQ2LCAweEE4ODBCNzQ0LCAweEJEQ0VFMjhCLCAweEJCQ0JERjdFLCAweDQ4QjNENDUxLCAweDU2QjVENDRFLCAweEJFQ0FERjdBLCAweEJFRDBFMzhELCAweEIyNzNCMTQ1LCAweEJGNEM5RDQ3LCAweEJGNEI5RDQ2LCAweEJGNEM5RDQ3LCAweEJGNEI5RDQ2LCAweEJENEU5RjQ3LCAweEE5QTZDQjRFLCAweEJGRDdFN0EzLCAweEEyQkVEODVDLCAweDIxQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNTk5LCAweEJBQjlENDZCLCAweEJDNTJBMDQ1LCAweEJGNEM5RDQ2LCAweEJGNEI5RDQ2LCAweEJGNEM5RDQ3LCAweEJGNEI5RDQ2LCAweEFGNjhBQzQ1LCAweEI5QzdERDc0LCAweEJGRDJFNDkyLCAweDY4QjVENDRELCAweDBERDFFNjlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI0RDJFNTk1LCAweEE3QkVEODU5LCAweEJGRDdFNkEyLCAweEI4OTRCRjUwLCAweEJGNEI5RDQ2LCAweEJGNEM5RDQ3LCAweEJGNEI5RDQ2LCAweEJGNEI5RDQ2LCAweEJGNEI5RDQ2LCAweEE5ODdCODQ0LCAweEJGRDFFMzkyLCAweEJBQzdERTc1LCAweDNCQjVENTU4LCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEY4RkJGOSwgMHg0NjY4QjM4MCwgMHhCQTMyOTg0NiwgMHhCRjQ0QTM0NywgMHhCRjUzQUQ0NywgMHhCRjVDQjQ0NiwgMHhCRjY1QkM0NiwgMHhCRjY2QkM0NiwgMHhCRjY4QkQ0NiwgMHhCRjY5QkQ0NSwgMHhCRjZBQkQ0NiwgMHhCRjc0QkU0QSwgMHhCRjgxQzA1MiwgMHhCRjg0QzA1MywgMHhCRjgyQkU1MywgMHhCRjc4Qjk0RiwgMHhCRjY4QjI0QSwgMHhCRjVCQUE0NiwgMHhCRjU1QTU0NiwgMHhCRTRFQTA0NSwgMHhCQTQ3OUI0NSwgMHg5QzQzOTk0OSwgMHg2NTZCQUU3MiwgMHgyOTk2QzU5QywgMHgwOEJFREJDMiwgMHgwMEYyRjhGMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwM0RGRUNERiwgMHg1OTdGQjQ3QiwgMHhCOTU3OUU0MywgMHhCRjY4QTk0NCwgMHhCRjc1QjM0MywgMHhCRjdGQkI0MiwgMHhCRjg0QzE0MywgMHhCRjg2QzQ0NCwgMHhCRjg1QzQ0MywgMHhCRjg1QzM0MywgMHhCRjg0QzM0MiwgMHhCRjg0QzQ0MywgMHhCRjgyQzI0MiwgMHhCRjgxQzM0MywgMHhCRjgwQzI0MiwgMHhCRjdGQzM0MywgMHhCRjdFQzI0MywgMHhCRjdFQzI0MywgMHhCRjdEQzI0MywgMHhCRjdDQzI0MywgMHhCRjdCQzE0MywgMHhCRjgyQzM0NiwgMHhCRjlFQzg0RiwgMHhCRjlEQzc1MCwgMHhCRjlBQzY1MCwgMHhCRjlDQzc1QSwgMHhCRjk5QzU1RiwgMHhCRjhBQzA0RiwgMHhCRjVCQTk0NiwgMHhCNjQzOUI0NiwgMHgyNEE1Q0ZBRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMERDRUJCNCwgMHg3Q0I2RDU0QSwgMHhCRkQzRTQ5NiwgMHhCQUJERDg3QSwgMHhCQTE0N0NBRCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNjRBOTk4QiwgMHhCQ0NDRTA4MiwgMHhCRkQ4RTdBNSwgMHhCRUQwRTI4RiwgMHhCODM5OTE5NywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRTAxNzJCQiwgMHhBNTg5QkM2OCwgMHhCRkQ1RTU5RCwgMHhCMUMzREI2OCwgMHgyOEM2REU3RCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyM0MzREQ3OSwgMHg5OUJBRDY1MSwgMHhCRkQ3RTdBMywgMHhCODk0QzE3NiwgMHhCRDAzNzNCQSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBRDFGODJBNywgMHhCNEJDRDc2OSwgMHhCRkQ2RTY5RSwgMHg4MkI4RDY0RiwgMHgwOEVGRjZERCwgMHgwMEZGRkZGRiwgMHgwMEZDRkRGOSwgMHgyQ0I5RDc2MSwgMHhBM0JERDg1OCwgMHhCRkQ3RTdBMywgMHhCNDgxQjc3OSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNzNGOTQ5MSwgMHhCQkNBREY3QiwgMHhCRkQ5RThBQywgMHhCODdBQjQ3QiwgMHhCRTAwNzJCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNTRCOUI4QSwgMHhCRENCRTA4MCwgMHhCRUNGRTI4OSwgMHg1N0I4RDY1NiwgMHgyNEI3RDY2MCwgMHg5OUI5RDY1MSwgMHhCRkQ3RTdBMywgMHhCNTk1QzI3NywgMHhCRTAzNzNCQSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhBNTQzOTY4RSwgMHhCREM5REY3QSwgMHhCRUQwRTI4RiwgMHg2MUI1RDQ0RSwgMHgwMkY1RjlFQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZERkVGQSwgMHgzQkI3RDY1QiwgMHhCMEMxREE2MywgMHhCRkQ2RTU5RiwgMHhCODY2QTg4MiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNDVFQTQ3RSwgMHhCRUNGRTE4QSwgMHhCQ0NDRTA4MCwgMHg0OEI2RDU1NiwgMHgwMUZCRkRGNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNSwgMHg5NkJBRDY1MSwgMHhCRkQ3RTdBMywgMHhCOTlGQzU1NywgMHhCRTRCOUQ0NiwgMHhCRjRBOUM0NiwgMHhCRjRBOUM0NiwgMHhCRjRBOUM0NiwgMHhCRjRBOUQ0NiwgMHhBRjc3QjE0MiwgMHhCRUNGRTI4QSwgMHhCRENBREY3QywgMHg0QkI0RDQ1MiwgMHgxRUNGRTM4RCwgMHg5RkJCRDc1NCwgMHhCRkQ3RTZBMiwgMHhCODlEQzQ1NSwgMHhCRTRCOUM0NiwgMHhCRjRBOUQ0NiwgMHhCRjQ5OUM0NiwgMHhCRjRBOUQ0NywgMHhCRjRBOUM0NiwgMHhCMDdBQjM0MywgMHhCRUNGRTE4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwM0Y2RkFFQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUZCQywgMHg5MEI5RDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFFQ0Y1QywgMHhCQjRFOUU0NiwgMHhCRjRBOUQ0NiwgMHhCRjQ5OUM0NiwgMHhCRjRBOUQ0NiwgMHhCRjRBOUM0NiwgMHhBQzcwQUU0NCwgMHhCQUNCREY4MCwgMHhCRkNFRTE4NywgMHg3MEI1RDQ0OSwgMHhBRUMwREE2MiwgMHhCRkQ2RTZBMCwgMHhCNjhBQkQ0RCwgMHhCRjRBOUM0NiwgMHhCRjRBOUM0NiwgMHhCRjQ5OUM0NiwgMHhCRjRBOUQ0NiwgMHhCRjRBOUM0NiwgMHhBNzk1QzI0NywgMHhCRkQ0RTQ5OSwgMHhCNEM1REM2RCwgMHgzN0IyRDM1MywgMHgwQUU2RjFDNywgMHg3RUI3RDU0QiwgMHhCRkQ0RTU5OSwgMHhCOEMyREE2RCwgMHhCRDU0QTE0NiwgMHhCRjRBOUM0NiwgMHhCRjRBOUQ0NywgMHhCRjRBOUM0NiwgMHhCRjRBOUQ0NiwgMHhBQjZBQUM0NSwgMHhCQ0M3REQ3NSwgMHhCRkQyRTM5MywgMHg5QkI2RDQ0NSwgMHhCRkQxRTM5MSwgMHhCRUMyREI3NiwgMHhCQTU2QTE0NiwgMHhCRjRBOUQ0NiwgMHhCRjRBOUM0NiwgMHhCRjRBOUQ0NiwgMHhCRjRBOUM0NiwgMHhCODVCQTQ0NiwgMHhCNUMyREE2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkUwRURCNCwgMHg5Q0JCRDc1NCwgMHhCRkQ3RTZBMywgMHhCN0E0Q0E1NywgMHhCRTRCOUQ0NiwgMHhCRjRBOUM0NiwgMHhCRjRBOUM0NiwgMHhCRjRCOUQ0NiwgMHhCRjRBOUM0NiwgMHhBODdGQjY0NCwgMHhCRENFRTE4QSwgMHhCQkNCREY3RCwgMHg0OEIzRDQ1MSwgMHg1NkI0RDQ0RCwgMHhCRUM5REU3QSwgMHhCRUQwRTI4RCwgMHhCMjcyQjE0NSwgMHhCRjRBOUQ0NiwgMHhCRjRBOUM0NiwgMHhCRjRBOUQ0NiwgMHhCRjRBOUM0NiwgMHhCRDREOUU0NiwgMHhBOEE2Q0I0RSwgMHhCRkQ3RTdBMiwgMHhBMkJFRDg1QywgMHgyMEJEREE3MSwgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQzRTQ5OSwgMHhCQUI5RDQ2QiwgMHhCQzUxOUY0NSwgMHhCRjRBOUM0NiwgMHhCRjQ5OUM0NiwgMHhCRjRBOUM0NiwgMHhCRjRBOUM0NiwgMHhBRjY3QUM0NSwgMHhCOUM3REQ3MywgMHhCRkQyRTQ5MiwgMHg2OEI0RDQ0RCwgMHgwQ0QxRTY5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyM0QyRTU5NSwgMHhBNkJERDg1OSwgMHhCRkQ2RTZBMSwgMHhCODk0QkY1MCwgMHhCRTRBOUM0NiwgMHhCRjRBOUQ0NiwgMHhCRjRBOUM0NiwgMHhCRjRBOUQ0NiwgMHhCRjQ5OUM0NiwgMHhBODg3Qjg0MywgMHhCRUQxRTM5MSwgMHhCQUM3REQ3NSwgMHgzQkI1RDU1OCwgMHgwMkZBRkNGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MkE4RUM3QTIsIDB4QjAyQjk1NDYsIDB4QkYzRTlGNDcsIDB4QkY0Q0E4NDcsIDB4QkY1N0IwNDgsIDB4QkY1RUI2NDYsIDB4QkY2NEJDNDcsIDB4QkY2NUJDNDYsIDB4QkY2NUJCNDcsIDB4QkY2N0JBNDgsIDB4QkY3QUJFNTAsIDB4QkY4MUJFNTQsIDB4QkY3REJDNTMsIDB4QkY2REI0NEUsIDB4QkY1Q0FDNDksIDB4QkY1MUE1NDYsIDB4QkY0Q0ExNDYsIDB4Qjk0NDlCNDUsIDB4OUEzQjk2NDYsIDB4NjQ1OUE2NjUsIDB4MkE5RkNCQTYsIDB4MDhFQUY0RUMsIDB4MDFGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGOEZCRjgsIDB4NTE4MUI2N0YsIDB4Qjg1MjlDNDQsIDB4QkY2NEE4NDQsIDB4QkY3M0IyNDQsIDB4QkY3REJBNDIsIDB4QkY4M0MxNDMsIDB4QkY4NEMzNDMsIDB4QkY4NEMzNDMsIDB4QkY4MkMzNDIsIDB4QkY4MkMzNDMsIDB4QkY4MEMzNDMsIDB4QkY4MEMzNDMsIDB4QkY3RkMyNDMsIDB4QkY3RkMzNDQsIDB4QkY3REMyNDMsIDB4QkY3REMyNDMsIDB4QkY3QkMxNDMsIDB4QkY3Q0MyNDQsIDB4QkY3QUMxNDMsIDB4QkY3OUMxNDQsIDB4QkY5MUM1NEMsIDB4QkY5RUM4NTEsIDB4QkY5QUM2NTAsIDB4QkY5OEM2NTEsIDB4QkY5OEM1NUYsIDB4QkY5MUMzNTMsIDB4QkY3MEI0NEEsIDB4QkY0REEyNDYsIDB4NzM0NDlDNTIsIDB4MDJFOUY0RUMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJDOEUwODcsIDB4OEZCOUQ2NEUsIDB4QkZENkU2OUYsIDB4QkFBNkNCNzcsIDB4QkIwNjc1QjcsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTU2Q0FDNzYsIDB4QkZEMkUzOTIsIDB4QkZEOUU3QTUsIDB4QkNDNURDODIsIDB4QjgyMzg1QTUsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkEwNzc1QjcsIDB4QTg5RUM3NjUsIDB4QkZEN0U3QTMsIDB4QTNCRUQ5NUIsIDB4MThERUVDQjMsIDB4MDBGRkZGRkYsIDB4MDBGREZFRkEsIDB4MzJDMURDNzEsIDB4QTlCRUQ5NUMsIDB4QkZEOEU3QTMsIDB4QjU3OUIzN0EsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QTgzQTkxOTUsIDB4QkJDOERFNzcsIDB4QkZEMkUzOTMsIDB4NjlCNkQ1NEUsIDB4MDJFRkY2REUsIDB4MDBGRkZGRkYsIDB4MDFGQ0ZERjgsIDB4M0RCOEQ3NUEsIDB4QjFDMURBNjQsIDB4QkZEN0U2QTAsIDB4Qjc2NEE3ODIsIDB4QkYwMTcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QTQ2MEE1N0QsIDB4QkZEMEUzOEQsIDB4QkZENkU2QTEsIDB4QjU1OEExODgsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTQ2NkE5N0EsIDB4QkVEMUUzOTIsIDB4QkNDOURFNzgsIDB4M0VDNURFNzUsIDB4MzJCRURBNkEsIDB4QThCRUQ4NUIsIDB4QkZEOEU3QTMsIDB4Qjg3OUIzN0IsIDB4QkYwMTcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTM1QUEyODAsIDB4QkVEMEUzOEQsIDB4QkRDQURGN0QsIDB4NDZCRURBNjYsIDB4MDBGQkZDRjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDRGMEY3REYsIDB4NEZCNkQ1NTMsIDB4QkFDN0RFNzQsIDB4QkZEMkU0OTUsIDB4QjU0Njk4OTEsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTM3N0IyNzIsIDB4QkZENEU1OTksIDB4QjdDNURENkUsIDB4MzBDQkUxODYsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUU5QTUsIDB4OTZCQUQ2NTEsIDB4QkZEOEU3QTMsIDB4QkE5RkM1NTcsIDB4QkY0QTlENDYsIDB4QkY0ODlDNDYsIDB4QkY0OTlDNDcsIDB4QkY0ODlDNDYsIDB4QkY0OTlDNDcsIDB4QUY3N0IxNDMsIDB4QkVDRkUyOEEsIDB4QkRDQURGN0QsIDB4NEJCNEQ1NTIsIDB4MUZDRkUzOEQsIDB4OUZCQ0Q3NTQsIDB4QkZEN0U2QTIsIDB4Qjg5REM1NTUsIDB4QkU0QTlDNDYsIDB4QkY0OTlENDcsIDB4QkY0ODlDNDYsIDB4QkY0OTlENDcsIDB4QkY0ODlDNDYsIDB4QjA3OUIzNDQsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDRGNkZBRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VGQkMsIDB4OTBCOUQ2NEYsIDB4QkZEN0U2QTEsIDB4QkFBRUNGNUMsIDB4QkM0RDlENDYsIDB4QkY0OTlDNDcsIDB4QkY0OTlDNDYsIDB4QkY0OTlDNDcsIDB4QkY0ODlDNDYsIDB4QUQ2RkFFNDQsIDB4QkJDQkUwODAsIDB4QkZDRkUyODgsIDB4NzdCNUQ0NDYsIDB4QjVDNURDNkQsIDB4QkZENEU1OUEsIDB4QkE3QkI1NDksIDB4QkY0OTlDNDYsIDB4QkY0OTlDNDYsIDB4QkY0ODlDNDYsIDB4QkY0QTlENDcsIDB4QkU0QTlENDYsIDB4QUM5REM3NEMsIDB4QkZENkU2QTAsIDB4QUNDMURBNjIsIDB4MkJCRERBNkQsIDB4MDVGNUZBRTgsIDB4NkJCNkQ0NEIsIDB4QkZEMUUzOEUsIDB4QkVDOERFN0IsIDB4Qjk1REE1NDcsIDB4QkY0ODlDNDYsIDB4QkY0OTlENDcsIDB4QkY0OTlDNDYsIDB4QkY0OTlDNDcsIDB4QjM1QkE0NDcsIDB4QjdDMERBNjksIDB4QkZENUU1OUMsIDB4QTVCOEQ1NDksIDB4QkZEMUUzOTEsIDB4QkVDMkRCNzYsIDB4QkE1NUExNDcsIDB4QkY0OTlDNDYsIDB4QkY0OTlDNDYsIDB4QkY0QTlENDcsIDB4QkY0OTlDNDYsIDB4Qjk1QkE0NDYsIDB4QjVDMkRCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjUsIDB4OURCQkQ3NTQsIDB4QkZEN0U2QTMsIDB4QjdBNENBNTcsIDB4QkU0QTlENDYsIDB4QkY0OTlENDcsIDB4QkY0OTlDNDYsIDB4QkY0OTlENDcsIDB4QkY0OTlDNDYsIDB4QTg3RUI3NDQsIDB4QkRDRkUyOEIsIDB4QkNDQkUwN0UsIDB4NDlCM0Q0NTIsIDB4NTZCNUQ0NEUsIDB4QkVDOURGN0EsIDB4QkVEMEUzOEQsIDB4QjI3MUIxNDUsIDB4QkY0OTlDNDYsIDB4QkY0ODlDNDYsIDB4QkY0OTlENDcsIDB4QkY0OTlDNDYsIDB4QkQ0QzlFNDcsIDB4QThBNUNBNEUsIDB4QkZEN0U3QTIsIDB4QTJCRUQ5NUMsIDB4MjFCRURCNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEFFM0VFQjcsIDB4N0ZCOEQ1NEMsIDB4QkZENEU1OTksIDB4QkFCOUQ1NkIsIDB4QkM1MDlGNDUsIDB4QkY0OTlDNDcsIDB4QkY0ODlDNDYsIDB4QkY0OTlENDcsIDB4QkY0OTlDNDYsIDB4QUY2N0FDNDUsIDB4QjlDN0RENzQsIDB4QkZEMkU0OTIsIDB4NjlCNUQ0NEQsIDB4MENEMkU2OUYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjREM0U1OTUsIDB4QTZCRUQ4NTksIDB4QkZEN0U2QTIsIDB4Qjg5NEJGNTAsIDB4QkY0OTlDNDYsIDB4QkY0OTlENDcsIDB4QkY0OTlDNDYsIDB4QkY0OTlENDcsIDB4QkY0OTlDNDYsIDB4QTk4NkI4NDQsIDB4QkZEMUUzOTIsIDB4QkFDOERFNzUsIDB4M0JCNUQ1NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE0QTdENEI4LCAweDlFMkE5NTRCLCAweEJGMzU5QjQ3LCAweEJGNDNBMzQ3LCAweEJGNEVBQTQ3LCAweEJGNTVCMDQ4LCAweEJGNTlCNDQ3LCAweEJGNUNCNTQ3LCAweEJGNUNCNDQ2LCAweEJGNjdCNjRCLCAweEJGN0FCQjUyLCAweEJGNzVCNzUxLCAweEJGNjFBRDRCLCAweEJGNTBBNTQ3LCAweEJGNDdBMDQ2LCAweEI5M0Y5QTQ2LCAweDlBM0I5NzQ2LCAweDYyNTVBNTYzLCAweDI4OTZDNzlGLCAweDA4REFFQkRELCAweDAwRkFGQ0ZCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjdGQUY4LCAweDRBN0ZCNjgxLCAweEI1NEY5QTQ0LCAweEJGNjFBNjQ0LCAweEJGNkZCMDQzLCAweEJGN0JCOTQzLCAweEJGODBCRjQyLCAweEJGODFDMzQzLCAweEJGODBDMjQyLCAweEJGODBDMzQzLCAweEJGN0ZDMjQzLCAweEJGN0VDMjQzLCAweEJGN0RDMjQzLCAweEJGN0RDMjQzLCAweEJGN0JDMTQzLCAweEJGN0JDMTQzLCAweEJGN0FDMTQzLCAweEJGN0FDMTQzLCAweEJGNzhDMDQzLCAweEJGNzhDMTQ0LCAweEJGN0RDMTQ1LCAweEJGOUJDNzRGLCAweEJGOUFDNjUwLCAweEJGOTdDNjUwLCAweEJGOTRDNDUzLCAweEJGOTJDMzU5LCAweEJGODRCRDRFLCAweEJGNThBOTQ3LCAweEIwM0Y5OTQ1LCAweDFCQjJENkJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRkZELCAweDI4QzZERTdFLCAweEEwQkNENzU1LCAweEJGRDdFN0EzLCAweEI3OERCRTc1LCAweEJFMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJFMDE3MkJBLCAweEEzODRCOTZDLCAweEJGRDVFNjlFLCAweEJGRDlFOEE2LCAweEJDQjdENDc1LCAweEJBMEI3N0I1LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEI1MTM3QkFGLCAweEFFQjhENjYxLCAweEJGRDdFNkEyLCAweDkwQkFENjUyLCAweDBCREZFREJCLCAweDAwRkZGRkZGLCAweDAyRjRGOUU3LCAweDQ0QjRENDUwLCAweEIzQzNEQjZBLCAweEJGRDVFNjlDLCAweEI1NTU5Rjg5LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MUJDLCAweEE0NTM5RTg0LCAweEJEQ0VFMjg5LCAweEJFQ0NFMDgyLCAweDREQkVEQTY0LCAweDAwRkNGREZBLCAweDAwRkZGRkZGLCAweDAzRjBGNkRGLCAweDUwQjZENTUyLCAweEI5QzdERDc1LCAweEJGRDJFNDk0LCAweEI1NDM5NjkxLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEEyN0FCMzZGLCAweEJGRDVFNjlFLCAweEJFRDBFMzkxLCAweEI4M0I5Mjk2LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJEMDE3MkJCLCAweEE1ODhCQjY5LCAweEJGRDVFNTlELCAweEIxQzNEQjY4LCAweDJBQjVENTU5LCAweDQzQjVENTU0LCAweEIzQzNEQjZBLCAweEJGRDVFNjlDLCAweEI0NThBMTg3LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEEzN0VCNjZDLCAweEJGRDRFNTlBLCAweEI1QzREQjZDLCAweDJGQzVERTdBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTVGMUM4LCAweDY0QjRENDRBLCAweEJEQ0VFMTg2LCAweEJFQ0RFMTg1LCAweEI5Mjg4N0ExLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJEMDE3MkJBLCAweEE2OUNDNjYxLCAweEJGRDdFNkExLCAweEE5QzBEOTVGLCAweDFEQ0NFMjhFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE0LCAweDk2QjlENjUxLCAweEJGRDhFN0EzLCAweEI5OUVDNTU3LCAweEJFNDk5QzQ2LCAweEJGNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEJGNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEFGNzZCMDQzLCAweEJFQ0ZFMjhBLCAweEJEQ0FERjdDLCAweDRCQjRENDUxLCAweDFFQ0ZFMzhELCAweDlGQkJENzU0LCAweEJGRDdFNkEyLCAweEI4OURDNDU1LCAweEJFNDg5QzQ2LCAweEJGNDg5QzQ3LCAweEJGNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEJGNDc5QjQ2LCAweEIwNzlCMzQ0LCAweEJFQ0ZFMjhCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDAzRjZGQUVDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRUJDLCAweDkwQjlENjRGLCAweEJGRDdFNkExLCAweEJBQURDRTVDLCAweEJCNEI5RDQ1LCAweEJGNDg5QzQ3LCAweEJGNDc5QjQ2LCAweEJGNDc5QzQ2LCAweEJGNDc5QjQ2LCAweEFENkZBRTQ0LCAweEJCQ0JERjgwLCAweEJGQ0VFMTg4LCAweDdFQjVENDQ1LCAweEJDQzlERTc4LCAweEJFRDBFMjkwLCAweEI4NzBCMDQ1LCAweEJGNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEJGNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEJDNEI5RDQ2LCAweEFDQUFDRDUzLCAweEJGRDhFN0E0LCAweEEwQkREODU5LCAweDIwQkREQTcyLCAweDAyRjhGQkVGLCAweDU2QjhENjUzLCAweEJFQ0NFMDgwLCAweEJFQ0VFMTg5LCAweEI1NkFBRDQ2LCAweEJGNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEJGNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEJBNTFBMDQ2LCAweEIwQkJENzVGLCAweEJGRDZFNkExLCAweEFFQjlENjRELCAweEJGRDFFMzkxLCAweEJFQzJEQjc2LCAweEJBNTRBMTQ2LCAweEJGNDg5QzQ3LCAweEJGNDc5QzQ2LCAweEJGNDc5QzQ2LCAweEJGNDc5QjQ2LCAweEI5NUFBMzQ2LCAweEI1QzJEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCREZFREI0LCAweDlEQkJENzU0LCAweEJGRDdFN0EzLCAweEI3QTRDQTU2LCAweEJFNDk5QzQ2LCAweEJGNDg5QzQ2LCAweEJGNDc5QjQ2LCAweEJGNDc5QzQ2LCAweEJGNDc5QjQ2LCAweEE4N0VCNjQ0LCAweEJEQ0VFMjhCLCAweEJCQ0FERjdFLCAweDQ4QjNEMzUxLCAweDU2QjVENDRFLCAweEJFQzlERTdBLCAweEJFRDBFMjhELCAweEIyNzBCMDQ0LCAweEJGNDc5QzQ2LCAweEJGNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEJGNDc5QjQ2LCAweEJENEE5RDQ2LCAweEE4QTVDQTRFLCAweEJGRDdFN0EyLCAweEEyQkREODVDLCAweDIwQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTJFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNDk5LCAweEJBQjhENDZCLCAweEJDNEU5RTQ1LCAweEJGNDg5QzQ2LCAweEJGNDc5QzQ2LCAweEJGNDc5QzQ2LCAweEJGNDc5QjQ2LCAweEFGNjZBQjQ1LCAweEI5QzdERDc0LCAweEJGRDJFMzkyLCAweDY4QjRENDRELCAweDBDRDFFNjlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIzRDJFNTk1LCAweEE2QkREODU5LCAweEJGRDZFNkExLCAweEI4OTNCRTUwLCAweEJFNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEJGNDc5QjQ2LCAweEJGNDg5QzQ2LCAweEJGNDc5QjQ2LCAweEE5ODZCODQ0LCAweEJGRDFFMzkxLCAweEJBQzdERTc0LCAweDNCQjVENTU3LCAweDAyRkFGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOERERUZFNCwgMHg4MjJCOTg1MiwgMHhCRjJDOTg0NywgMHhCRjNBOUY0NywgMHhCRjQzQTU0OCwgMHhCRjRDQTk0NywgMHhCRjUxQUQ0OCwgMHhCRjUzQUQ0NywgMHhCRjU0QUQ0OCwgMHhCRjY2QjI0RCwgMHhCRjZCQjI0RiwgMHhCRjU1QTg0QSwgMHhCRjQ0QTA0NywgMHhCODNCOUE0NiwgMHg5OTM1OTY0NiwgMHg2MDQ0OUQ1NywgMHgyODg1QkY5MiwgMHgwN0Q4RUFEQywgMHgwMUZFRkZGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY4RkJGOCwgMHg0MTdGQjY4MSwgMHhCMzREOUE0NSwgMHhCRjVFQTY0NCwgMHhCRjZEQjA0NCwgMHhCRjc3Qjg0MywgMHhCRjdFQzA0MywgMHhCRjdGQzI0MywgMHhCRjdFQzM0MywgMHhCRjdEQzI0MywgMHhCRjdEQzI0MywgMHhCRjdDQzI0MywgMHhCRjdCQzI0NCwgMHhCRjdBQzE0MywgMHhCRjdBQzI0NCwgMHhCRjc5QzE0MywgMHhCRjc5QzE0NCwgMHhCRjc3QzA0MywgMHhCRjc3QzE0NCwgMHhCRjc2QzA0NCwgMHhCRjhCQzQ0QSwgMHhCRjk5QzY1MCwgMHhCRjk3QzY1MCwgMHhCRjkzQzQ1MCwgMHhCRjkxQzM1NywgMHhCRjhCQzA1MSwgMHhCRjZCQjI0QSwgMHhCRjRBQTE0NiwgMHg3MzZDQjE1QSwgMHgzNkMwREI3MCwgMHgzOEMxREM3MCwgMHgzN0MxREM3MCwgMHgzOEMyREM3MCwgMHgzN0MxREM3MCwgMHgzOEMyREM3MCwgMHgzN0MxREM3MCwgMHgzOEMyREM3MCwgMHgzN0MxREM3MCwgMHgxRUM5RTE4NiwgMHgwMUY5RkJGMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY5RkNGMiwgMHgzOUI1RDQ1NSwgMHhBRUMwREE2MSwgMHhCRkQ3RTZBMSwgMHhCNTZBQUI4MSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQzA0NzRCOSwgMHhBNkE4Q0Q1RiwgMHhCRkQ3RTdBNCwgMHhCRkQ5RThBNywgMHhCNkEyQzk3MSwgMHhCRjAyNzNCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBQzI1ODVBMywgMHhCNUM0REM2RCwgMHhCRkQ0RTU5QSwgMHg3OUI4RDY0RiwgMHgwNUVCRjRENSwgMHgwMEZGRkZGRiwgMHgwNUYxRjdFMSwgMHg1N0I1RDQ0RSwgMHhCQ0M5REU3QSwgMHhCRkQwRTM5MSwgMHhCNzNDOTI5NCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAxNzJCQywgMHhBNDc2QjE3MCwgMHhCRkQ0RTU5NywgMHhCN0M2REQ3MiwgMHgzNkJGREI2QywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUU0RjBDNiwgMHg2NkI1RDQ0QiwgMHhCRENFRTE4NywgMHhCRUNERTE4NSwgMHhCODI2ODZBMywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRTAyNzNCQiwgMHhBNTlEQzc2MSwgMHhCRkRBRThBQSwgMHhCREM2REM4MywgMHhCNzIxODRBNSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCQTA3NzVCNywgMHhBNzlEQzc2NSwgMHhCRkQ3RTdBMywgMHhBM0JFRDg1QiwgMHgxREM4RTA4NSwgMHg1OEI1RDQ0RCwgMHhCQUM5REY3QSwgMHhCRkQxRTM5MCwgMHhCODNBOTE5NiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCQzA1NzRCOSwgMHhBNjk1QzM2NSwgMHhCRkQ3RTdBMiwgMHhBOEJGRDk1RiwgMHgxRUQyRTU5OCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMEQ5RUFBRCwgMHg3OUI2RDQ0QSwgMHhCRkQzRTQ5NSwgMHhCQUJERDg3QiwgMHhCQTE2N0VBQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCNjBDNzhCMywgMHhBQ0FCQ0U2NCwgMHhCRkQ3RTdBMywgMHg5OEJCRDc1NiwgMHgxMUUyRUZCRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZERkRGOSwgMHgwOEY3RkFFQiwgMHgwOUY2RkFFQiwgMHgwOUY3RkFFQiwgMHgwOUY2RkFFQSwgMHgwOUY3RkFFQiwgMHgwOUY2RkFFQiwgMHgwOUY3RkFFQiwgMHgwOUY2RkFFQSwgMHgwOUY3RkFFQiwgMHgwN0Y2RkFFQiwgMHgwMUZERkVGQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNCwgMHg5NkJBRDY1MSwgMHhCRkQ4RTdBMywgMHhCQTlGQzU1OCwgMHhCRjQ3OUM0NiwgMHhCRjQ2OUI0NiwgMHhCRjQ3OUM0NiwgMHhCRjQ2OUI0NiwgMHhCRjQ2OUI0NiwgMHhBRjc2QjE0MywgMHhCRUNGRTI4QSwgMHhCRENBREY3RCwgMHg0QkI0RDQ1MiwgMHgxRUNGRTM4RCwgMHg5RkJDRDc1NCwgMHhCRkQ3RTZBMiwgMHhCODlEQzQ1NSwgMHhCRTQ3OUI0NiwgMHhCRjQ2OUM0NiwgMHhCRjQ2OUI0NiwgMHhCRjQ3OUI0NiwgMHhCRjQ2OUI0NiwgMHhCMDc4QjM0NCwgMHhCRUNGRTI4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwNEY3RkFFRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUZCQywgMHg5MUI5RDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFEQ0U1QywgMHhCQzRBOUM0NiwgMHhCRjQ3OUM0NywgMHhCRjQ2OUI0NiwgMHhCRjQ2OUM0NywgMHhCRjQ2OUI0NiwgMHhBRDZFQUU0NCwgMHhCQkNCRTA4MSwgMHhCRkNFRTI4OCwgMHg4OEI1RDQ0NCwgMHhCRkNFRTE4NiwgMHhCRUNCREY4NCwgMHhCNzYwQTg0NiwgMHhCRjQ2OUI0NiwgMHhCRjQ2OUM0NywgMHhCRjQ2OUM0NiwgMHhCRjQ2OUM0NywgMHhCQTRGOUY0NiwgMHhBQ0JCRDc1QywgMHhCRkQ3RTdBMywgMHg5MUJBRDc1MiwgMHgxOEMxREM3QSwgMHgwMEZGRkZGRiwgMHg0NEM3REY3NywgMHhCOUM3REQ3MiwgMHhCRUQzRTQ5NiwgMHhCODc5QjQ0NywgMHhCRjQ2OUI0NiwgMHhCRjQ3OUM0NiwgMHhCRjQ2OUI0NiwgMHhCRjQ3OUM0NywgMHhCRDRBOUQ0NiwgMHhBQUIzRDM1NiwgMHhCRkQ3RTZBMywgMHhCOEJERDg1NSwgMHhCRkQxRTM5MSwgMHhCRUMyREI3NiwgMHhCQTUzQTA0NiwgMHhCRjQ3OUI0NiwgMHhCRjQ2OUI0NiwgMHhCRjQ2OUI0NiwgMHhCRjQ2OUI0NiwgMHhCOTU5QTM0NiwgMHhCNUMzREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0EzQ0E1NiwgMHhCRTQ3OUI0NiwgMHhCRjQ3OUM0NywgMHhCRjQ2OUI0NiwgMHhCRjQ2OUM0NiwgMHhCRjQ2OUI0NiwgMHhBODdEQjY0NCwgMHhCRENFRTI4QiwgMHhCQkNBREY3RSwgMHg0OEIzRDQ1MSwgMHg1NkI1RDQ0RSwgMHhCRUNBREY3QSwgMHhCRUQwRTM4RCwgMHhCMjZGQjA0NCwgMHhCRjQ3OUM0NiwgMHhCRjQ2OUI0NiwgMHhCRjQ3OUI0NiwgMHhCRjQ1OUI0NiwgMHhCRDRBOUQ0NiwgMHhBOUE1Q0E0RSwgMHhCRkQ3RTdBMiwgMHhBMkJFRDg1QywgMHgyMUJEREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI4RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUI5RDQ2QiwgMHhCQzREOUU0NSwgMHhCRjQ3OUM0NiwgMHhCRjQ2OUI0NiwgMHhCRjQ3OUM0NiwgMHhCRjQ2OUI0NiwgMHhBRjY1QUI0NSwgMHhCOUM3REQ3NCwgMHhCRkQyRTQ5MiwgMHg2OEI0RDQ0QywgMHgwREQyRTY5RiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNEQyRTU5NSwgMHhBN0JFRDg1OSwgMHhCRkQ3RTZBMiwgMHhCODkyQkU1MCwgMHhCRjQ2OUI0NiwgMHhCRjQ2OUM0NywgMHhCRjQ2OUI0NiwgMHhCRjQ3OUM0NywgMHhCRjQ2OUI0NiwgMHhBOTg2Qjg0NCwgMHhCRkQxRTM5MiwgMHhCQUM4REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGN0ZCRjgsIDB4NjMzQ0ExNjQsIDB4QkQyMzk0NDYsIDB4QkYyRjlBNDcsIDB4QkYzQTlGNDcsIDB4QkY0MEEzNDgsIDB4QkY0NEE1NDcsIDB4QkY0NkE1NDcsIDB4QkY0NkE0NDcsIDB4QkY1MkE3NEEsIDB4QkU0NkEwNDksIDB4QjgzNjk5NDYsIDB4OTgzRTlCNTAsIDB4NUU2Q0IzN0MsIDB4MjU5NEM4QTEsIDB4MDZDREU1RDMsIDB4MDBGNUZBRjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGOEZCRjgsIDB4Mzg3RkI3ODMsIDB4QUY0QTk5NDQsIDB4QkY1Q0E1NDUsIDB4QkY2OUFGNDQsIDB4QkY3NUI5NDMsIDB4QkY3QkJGNDIsIDB4QkY3REMyNDMsIDB4QkY3Q0MxNDIsIDB4QkY3QkMyNDMsIDB4QkY3QkMxNDMsIDB4QkY3QUMxNDMsIDB4QkY3OUMxNDMsIDB4QkY3OUMxNDQsIDB4QkY3N0MwNDMsIDB4QkY3N0MxNDQsIDB4QkY3NkMwNDQsIDB4QkY3NkMwNDQsIDB4QkY3NUJGNDMsIDB4QkY3N0MwNDUsIDB4QkY5NUM1NEUsIDB4QkY5NkM1NTAsIDB4QkY5M0M0NTAsIDB4QkY5MEMzNTEsIDB4QkY4QkMwNTMsIDB4QkY3RkJCNEUsIDB4QkY2MEFENDgsIDB4QkI5NEM0NEEsIDB4QjhDNERDNkYsIDB4QkFDN0RENzUsIDB4QjlDN0RENzQsIDB4QkFDN0RFNzUsIDB4QjlDN0RENzQsIDB4QkFDN0RENzUsIDB4QjlDN0RENzQsIDB4QkFDOERFNzUsIDB4QjlDN0RENzMsIDB4OUJCQkQ3NTQsIDB4MUFEM0U2OUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGNkZBRUQsIDB4NEFCNUQ0NTIsIDB4QjlDNkRENzAsIDB4QkVEM0U0OTgsIDB4Qjc0RDlCOEIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QjIxMjdCQUYsIDB4QUZCNUQ0NjQsIDB4QkZEOEU3QTYsIDB4QkZEOEU3QTQsIDB4QjU3Q0I1N0IsIDB4QkYwMTcyQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTU0Njk3OEQsIDB4QkRDQURGN0MsIDB4QkRDRkUyOEUsIDB4NUVCNkQ1NTEsIDB4MDFGOUZCRjIsIDB4MDBGRkZGRkYsIDB4MEJEOUU5QUQsIDB4NkRCNUQ0NEEsIDB4QkVDRkUyOEMsIDB4QkVDN0REODEsIDB4QjUxRDgxQTcsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkQwMzczQkEsIDB4QTQ4Q0JFNjgsIDB4QkZEN0U2QTAsIDB4QUNDMEQ5NjIsIDB4MjJEM0U2OUEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTBEOUU5QUQsIDB4N0NCNkQ1NEIsIDB4QkZEM0U0OTUsIDB4QkFCQ0Q3N0IsIDB4QkExNDdDQUQsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjUwRTc5QjMsIDB4QUNBQ0NGNjMsIDB4QkZEQ0VBQjIsIDB4QkNCOUQ1NzUsIDB4QkEwQjc3QjUsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjYxMTdBQUYsIDB4QURCOUQ1NjEsIDB4QkZEN0U2QTIsIDB4OTFCQUQ2NTIsIDB4MTZDMURDN0EsIDB4NkRCNUQ0NEIsIDB4QkZDRkUxOEEsIDB4QkRDNkREODQsIDB4QjcyMjg0QTQsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjgwRTc5QjIsIDB4QUFCMEQwNjEsIDB4QkZEOEU3QTQsIDB4OTdCQkQ3NTUsIDB4MTBERkVEQjksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJDQkUyOEMsIDB4OERCOEQ1NEMsIDB4QkZENkU2OUYsIDB4QkFBOENDNzQsIDB4QkIwNjc1QjgsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QUYyMTgzQTUsIDB4QjNCRUQ5NjgsIDB4QkZENUU1OUUsIDB4ODJCOEQ2NEYsIDB4MDdFN0YxQ0IsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZGRkQsIDB4MkRDRkUzODgsIDB4N0NCN0Q1NEIsIDB4ODdCOEQ1NEUsIDB4ODdCOEQ2NEUsIDB4ODdCOEQ1NEUsIDB4ODdCOEQ2NEYsIDB4ODdCOEQ1NEUsIDB4ODdCOEQ2NEYsIDB4ODdCOEQ1NEUsIDB4ODdCOEQ2NEYsIDB4NzZCNkQ0NEMsIDB4MjVDM0RENzksIDB4MDBGQkZERjcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUU5QTQsIDB4OTZCOUQ2NTEsIDB4QkZEN0U3QTMsIDB4Qjk5RUM0NTcsIDB4QkU0NjlCNDYsIDB4QkY0NDlCNDYsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDYsIDB4QkY0NTlCNDYsIDB4QUY3NUIwNDMsIDB4QkVDRkUyOEEsIDB4QkRDQURGN0MsIDB4NEJCNEQ1NTIsIDB4MUVDRkUzOEQsIDB4OUZCQkQ3NTQsIDB4QkZEN0U2QTIsIDB4Qjg5Q0M0NTUsIDB4QkU0NjlCNDYsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDYsIDB4QkY0NTlCNDYsIDB4QkY0NTlCNDYsIDB4QjA3N0IyNDMsIDB4QkVDRkUxOEIsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDNGNkZBRUMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VGQkMsIDB4OTBCOUQ2NEYsIDB4QkZENkU2QTEsIDB4QkFBRENFNUMsIDB4QkI0OTlDNDUsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDYsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDYsIDB4QUM2REFENDQsIDB4QkFDQkRGODAsIDB4QkZDRUUxODgsIDB4OTVCNUQ0NDQsIDB4QkZEMkUzOTIsIDB4QkVDNERDNzYsIDB4QkI1M0ExNDYsIDB4QkY0NTlBNDYsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDYsIDB4QkY0NTlCNDYsIDB4QjY1NUExNDUsIDB4QjNCRkQ5NjUsIDB4QkZENUU2OUUsIDB4ODFCOEQ1NEYsIDB4MTJEOUU5QUQsIDB4MDBGRkZGRkYsIDB4MzRDN0RFNzgsIDB4QjFDMkRCNjYsIDB4QkZENUU1OUQsIDB4Qjc4NEI5NEIsIDB4QkY0NTlBNDYsIDB4QkY0NTlCNDYsIDB4QkY0NTlCNDYsIDB4QkY0NTlCNDYsIDB4QkQ0NjlCNDYsIDB4QURBMEM3NEYsIDB4QkZEN0U2QTIsIDB4QkZDMEQ5NUQsIDB4QkZEMUUzOTEsIDB4QkVDMkRCNzYsIDB4QkE1MUEwNDYsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDYsIDB4QkY0NTlCNDYsIDB4QkY0NTlBNDYsIDB4Qjg1OEEzNDYsIDB4QjVDMkRBNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJFMEVEQjQsIDB4OUNCQkQ3NTMsIDB4QkZEN0U2QTMsIDB4QjdBM0NBNTYsIDB4QkU0NjlCNDYsIDB4QkY0NTlCNDYsIDB4QkY0NTlBNDYsIDB4QkY0NTlCNDYsIDB4QkY0NTlBNDYsIDB4QTg3Q0I2NDQsIDB4QkRDRUUxOEEsIDB4QkJDQURGN0QsIDB4NDhCM0Q0NTEsIDB4NTZCNUQ0NEQsIDB4QkVDOURGN0EsIDB4QkVEMEUyOEQsIDB4QjI2RUIwNDQsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDYsIDB4QkY0NTlCNDYsIDB4QkY0NDlCNDYsIDB4QkQ0ODlDNDYsIDB4QThBNUNBNEUsIDB4QkZEN0U3QTIsIDB4QTJCRUQ4NUMsIDB4MjBCRERBNzEsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFM0VFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZEM0U0OTksIDB4QkFCOUQ0NkIsIDB4QkM0QzlFNDUsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDYsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDYsIDB4QUY2M0FCNDUsIDB4QjlDN0RENzMsIDB4QkZEMkU0OTIsIDB4NjhCNEQ0NEQsIDB4MENEMUU2OUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjNEMkU1OTQsIDB4QTZCREQ4NTksIDB4QkZENkU2QTEsIDB4Qjg5MkJFNEYsIDB4QkU0NTlCNDYsIDB4QkY0NTlCNDYsIDB4QkY0NDlBNDUsIDB4QkY0NTlCNDYsIDB4QkY0NTlCNDYsIDB4QTg4NUI3NDQsIDB4QkVEMUUzOTEsIDB4QkFDN0RFNzUsIDB4M0JCNUQ1NTcsIDB4MDJGQUZDRjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjhGQ0ZBLCAweDQxNjNCNTg3LCAweEI5MUI5MjQ3LCAweEJGMjY5NjQ2LCAweEJGMkU5QTQ3LCAweEJGMzM5QzQ3LCAweEJGMzc5RDQ4LCAweEJGMzg5RDQ3LCAweEJGMzU5QjQ3LCAweEI4MzA5NzQ2LCAweDk5MzE5ODRCLCAweDYwNTJBNzZBLCAweDI3QUZEN0JCLCAweDA1RUFGNEVELCAweDAxRkVGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjlGQ0Y5LCAweDMxN0VCNzg0LCAweEFDNDg5OTQ1LCAweEJGNUFBNTQ1LCAweEJGNjhCMDQ1LCAweEJGNzNCNzQzLCAweEJGNzlCRjQ0LCAweEJGN0JDMTQzLCAweEJGN0JDMjQzLCAweEJGN0FDMTQzLCAweEJGN0FDMTQ0LCAweEJGNzlDMTQ0LCAweEJGNzhDMTQ0LCAweEJGNzdDMDQ0LCAweEJGNzdDMTQ0LCAweEJGNzZDMDQ0LCAweEJGNzVDMDQ0LCAweEJGNzRDMDQ0LCAweEJGNzNCRjQ1LCAweEJGODFDMTQ5LCAweEJGOTdDNjUwLCAweEJGOTNDNDUwLCAweEJGOEZDMzUxLCAweEJGOENDMTUyLCAweEJGODhDMDUyLCAweEJGN0FCQTRDLCAweEJGQjBEMjVBLCAweEJGRDlFOEE4LCAweEJGRDJFNDkzLCAweEJFRDBFMzkxLCAweEJFRDFFMzkxLCAweEJFRDBFMzkxLCAweEJFRDFFMzkxLCAweEJFRDFFMzkxLCAweEJGRDFFNDkyLCAweEJGRDlFOEE5LCAweEI0QzREQzZBLCAweDJBQzRERTc5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA4REZFRUJCLCAweDYwQjRENDRDLCAweEJEQ0RFMTgzLCAweEJGQ0RFMTg5LCAweEI1MkQ4QTlGLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEFDMkI4OTlGLCAweEI4QzJEQjZGLCAweEJGRDlFOEE2LCAweEJGRDZFNjlGLCAweEI2NjJBNjgyLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEEzNjBBNjdELCAweEJGRDFFMzhFLCAweEJDQ0FERjdDLCAweDQ0QkVEQTY1LCAweDAwRkJGREY3LCAweDAwRkZGRkZGLCAweDE0RDhFOUFBLCAweDgzQjdENTRDLCAweEJGRDRFNTlCLCAweEJBQkFENzczLCAweEJDMEI3N0I0LCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJCMDk3N0I3LCAweEE4QURDRjYwLCAweEJGRDhFN0E0LCAweDlEQkNENzU3LCAweDEzRDlFQUFCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCQ0FFMThBLCAweDhGQjlENjRFLCAweEJGRDZFNkEwLCAweEJBQTdDQzc1LCAweEJCMDU3NEI4LCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEIwMjI4NEE1LCAweEI0QkZEOTY5LCAweEJGRENFQUIzLCAweEI2QTBDODczLCAweEJGMDM3M0JBLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEFDMjU4NUEzLCAweEI1QzNEQjZELCAweEJGRDRFNTlCLCAweDdBQjhENjRGLCAweDE5QzVERTgwLCAweDgyQjdENTRCLCAweEJGRDRFNTlBLCAweEJDQjlENjc2LCAweEJBMEI3N0I0LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEIwMUQ4MkE5LCAweEIyQzFEQTY3LCAweEJGRDZFNjlFLCAweDgyQjhENjRGLCAweDA3RTlGM0NGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZCLCAweDI4QzRERTdBLCAweDlGQkNENzU1LCAweEJGRDhFN0E0LCAweEI2OEZCRjc0LCAweEJGMDE3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE5MzU4RTk4LCAweEI5QzhERTc3LCAweEJGRDJFMzkzLCAweDZBQkFENzU1LCAweDAyRjdGQUVELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRkRGRUZBLCAweDZCQkFENzU1LCAweEJFQ0NFMDgyLCAweEJGRDZFNjlFLCAweEJGRDZFNjlFLCAweEJGRDVFNjlELCAweEJGRDZFNjlFLCAweEJGRDVFNTlELCAweEJGRDZFNjlFLCAweEJGRDVFNjlELCAweEJGRDZFNjlGLCAweEJDQzlERjdCLCAweDU3QjRENDRGLCAweDA2RTZGMUNCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFQUE1LCAweDk2QkFENjUxLCAweEJGRDhFN0EzLCAweEJBOUVDNTU3LCAweEJGNDU5QjQ2LCAweEJGNDQ5QjQ2LCAweEJGNDQ5QjQ2LCAweEJGNDQ5QTQ2LCAweEJGNDQ5QjQ3LCAweEFGNzVCMDQzLCAweEJFQ0ZFMjhBLCAweEJEQ0FERjdELCAweDRCQjRENTUyLCAweDFGQ0ZFMzhELCAweDlGQkNENzU1LCAweEJGRDdFN0EyLCAweEI4OUNDNDU1LCAweEJFNDU5QjQ2LCAweEJGNDQ5QjQ3LCAweEJGNDQ5QTQ2LCAweEJGNDQ5QjQ3LCAweEJGNDQ5QjQ2LCAweEIwNzdCMjQ0LCAweEJFQ0ZFMjhCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDA0RjZGQUVELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRkJDLCAweDkwQjlENjRGLCAweEJGRDdFNkExLCAweEJBQURDRTVDLCAweEJDNDc5QzQ2LCAweEJGNDQ5QTQ2LCAweEJGNDM5QTQ2LCAweEJGNDQ5QjQ2LCAweEJGNDM5QTQ2LCAweEFENkNBRDQ0LCAweEJCQ0JFMDgwLCAweEJGQ0ZFMjg4LCAweDlGQjdENTQ3LCAweEJGRDVFNjlDLCAweEI3QkVEODY5LCAweEJFNEI5RTQ2LCAweEJGNDQ5QTQ2LCAweEJGNDQ5QjQ3LCAweEJGNDQ5QTQ2LCAweEJGNDU5QjQ2LCAweEFENjBBODQ2LCAweEJBQzVEQzcxLCAweEJGRDNFNDk3LCAweDcwQjZENTRFLCAweDBDRDlFOUFFLCAweDAwRkZGRkZGLCAweDI1RDFFNDkyLCAweEE5QkZEOTVDLCAweEJGRDdFNkEyLCAweEI0OThDNDUwLCAweEJGNDQ5QjQ2LCAweEJGNDQ5QjQ3LCAweEJGNDM5QTQ2LCAweEJGNDQ5QjQ2LCAweEJFNDQ5QjQ2LCAweEFDOTVDMjQ5LCAweEJGRDVFNTlDLCAweEJGQzREQzZBLCAweEJGRDFFMzkxLCAweEJFQzJEQjc2LCAweEJBNTFBMDQ2LCAweEJGNDQ5QjQ2LCAweEJGNDM5QTQ2LCAweEJGNDQ5QjQ3LCAweEJGNDQ5QTQ2LCAweEI5NTdBMzQ2LCAweEI1QzNEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI1LCAweDlEQkJENzU0LCAweEJGRDdFNkEzLCAweEI3QTNDQTU2LCAweEJFNDU5QjQ2LCAweEJGNDQ5QjQ3LCAweEJGNDM5QTQ2LCAweEJGNDQ5QjQ3LCAweEJGNDQ5QjQ2LCAweEE4N0NCNjQ0LCAweEJEQ0VFMjhCLCAweEJDQ0JFMDdFLCAweDQ5QjNENDUyLCAweDU2QjVENTRFLCAweEJFQ0FERjdBLCAweEJFRDBFMzhELCAweEIyNkVCMDQ1LCAweEJGNDQ5QjQ3LCAweEJGNDM5QTQ2LCAweEJGNDQ5QjQ3LCAweEJGNDQ5QjQ2LCAweEJENDc5QzQ2LCAweEE4QTVDQTRFLCAweEJGRDdFN0EzLCAweEEyQkVEOTVDLCAweDIxQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBBRTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNDk5LCAweEJBQjlENDZCLCAweEJDNEI5RTQ1LCAweEJGNDQ5QjQ3LCAweEJGNDM5QTQ2LCAweEJGNDQ5QjQ2LCAweEJGNDQ5QTQ2LCAweEFGNjNBQjQ1LCAweEI5QzdERDc0LCAweEJGRDJFNDkyLCAweDY5QjVENDRELCAweDBDRDFFNjlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI0RDNFNTk1LCAweEE2QkVEODU5LCAweEJGRDdFNkExLCAweEI4OTJCRTUwLCAweEJGNDQ5QTQ2LCAweEJGNDQ5QjQ3LCAweEJGNDM5QTQ2LCAweEJGNDQ5QjQ2LCAweEJGNDQ5QjQ2LCAweEE5ODVCNzQ0LCAweEJGRDFFMzkyLCAweEJBQzhERTc1LCAweDNCQjVENTU4LCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkVGRSwgMHgyNTkzQ0RBRCwgMHhBRTEyOEY0NiwgMHhCRjFDOTI0NiwgMHhCRjIzOTQ0NiwgMHhCRjI3OTY0NywgMHhCRTI4OTU0NiwgMHhCOTI2OTQ0NiwgMHg5NzI4OTQ0OSwgMHg1RTUxQTg2RCwgMHgyNTk0QzlBNSwgMHgwNkQ3RUJERSwgMHgwMEZCRkRGQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEY5RkJGOSwgMHgyQTdGQjg4NSwgMHhBNzQ1OTg0NSwgMHhCRjU3QTQ0NSwgMHhCRjY1QUU0NSwgMHhCRjcwQjc0NCwgMHhCRjc3QkU0MywgMHhCRjc5QzE0NCwgMHhCRjc4QzA0MywgMHhCRjc4QzE0NCwgMHhCRjc2QzA0MywgMHhCRjc3QzA0NCwgMHhCRjc1QzA0NCwgMHhCRjc1QzA0NCwgMHhCRjc0QkY0NCwgMHhCRjczQzA0NCwgMHhCRjcyQkY0NCwgMHhCRjcyQkY0NCwgMHhCRjcxQkU0NCwgMHhCRjhEQzQ0RCwgMHhCRjkyQzQ1MCwgMHhCRjhGQzM1MCwgMHhCRjhCQzE1MCwgMHhCRjg4QzE1MSwgMHhCRjhGQzM0RSwgMHhCRkJDRDg2OCwgMHhCRkQ1RTU5RCwgMHhCMTdEQjU3MiwgMHhCMDQ1OTc5MCwgMHhCMTQ1OTc5MCwgMHhCMDQ0OTY4RiwgMHhCMTQ1OTc5MCwgMHhBRDQ5OTk4QywgMHhBQkE5Q0Q1QywgMHhCRkQ3RTZBMiwgMHhBNkJGRDk1RSwgMHgxQkQ2RThBMiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwRURGRURCQSwgMHg3NkI1RDQ0QSwgMHhCRUQyRTM5MywgMHhCQkM0REM3OSwgMHhCQjE1N0RBRSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNjQyOTY4RiwgMHhCQkNCRTA3RSwgMHhCRkQ4RTdBNSwgMHhCRkQyRTQ5MywgMHhCNTNFOTM5NCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhBMzgwQjc2QiwgMHhCRkQ1RTU5QywgMHhCNEM0REI2QSwgMHgyQ0NBRTE4NSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxRkJGREI3MywgMHg5NkI5RDY0RiwgMHhCRkQ3RTZBMiwgMHhCNjlCQzY3NywgMHhCRDA0NzRCOCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCMTE3N0VBRCwgMHhCMEJCRDc2NSwgMHhCRkQ3RTZBMSwgMHg4OEI4RDU0RiwgMHgwOUVCRjREMywgMHgwMEZGRkZGRiwgMHgwMEZERkVGQywgMHgyOEMzREQ3OSwgMHhBMEJDRDc1NSwgMHhCRkQ3RTdBMywgMHhCNjhEQkU3NiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBODM4OTA5NiwgMHhCOUM4REU3NywgMHhCRkRBRTlBRSwgMHhCNzdFQjY3QiwgMHhCRjAxNzJCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhBNjQ1OTc4RCwgMHhCRENBREY3RCwgMHhCRUQwRTI4RSwgMHg1RkI1RDU0RiwgMHgyMEM0REQ3QywgMHg5NUJBRDY1MCwgMHhCRkQ3RTZBMiwgMHhCNkEyQzk3MiwgMHhCRTAyNzJCOSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBODM5OTE5NiwgMHhCQUM3REQ3NiwgMHhCRUQyRTM5MywgMHg2OEI2RDU1MCwgMHgwM0Y5RkNGMiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZBRkNGNSwgMHgzOEI2RDU1NywgMHhBQ0MwRDk2MCwgMHhCRkQ3RTdBMiwgMHhCNTZBQUI4MCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNDU3QTE4MSwgMHhCRUNFRTE4NywgMHhCQ0NDRTA4NCwgMHg0RkI5RDc1QSwgMHgwMEZERkRGQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkZERkVGQSwgMHg3MUJBRDc1NSwgMHhCRkQyRTM5MiwgMHhCRUNERTA4MywgMHhCOEIzRDE2MywgMHhCOEFGQ0U2MiwgMHhCOEIwQ0Y2MywgMHhCOEFGQ0Y2MiwgMHhCOEIwQ0Y2MywgMHhCN0I1RDI2MiwgMHhCRkNGRTI4QSwgMHhCRENFRTE4QSwgMHg1Q0I0RDQ0RSwgMHgwOUU2RjFDQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNCwgMHg5NkI5RDY1MSwgMHhCRkQ4RTdBMywgMHhCOTlEQzQ1NywgMHhCRTQ0OUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQzOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhBRjc0QjA0MiwgMHhCRUNGRTI4QSwgMHhCRENBREY3RCwgMHg0QkI0RDQ1MSwgMHgxRUNGRTM4RCwgMHg5RkJCRDc1NCwgMHhCRkQ3RTdBMiwgMHhCODlCQzM1NSwgMHhCRTQzOUE0NSwgMHhCRjQzOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCMDc2QjI0MywgMHhCRUNGRTI4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwM0Y2RkFFQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUVCQywgMHg5MEI5RDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFDQ0U1QywgMHhCQjQ2OUI0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhBRDZCQUQ0NCwgMHhCQkNCRTA4MCwgMHhCRkNFRTI4OCwgMHhBOEI4RDU0QiwgMHhCRkQ3RTdBMiwgMHhCN0FDQ0U1RiwgMHhCRTQ2OUM0NiwgMHhCRjQyOUE0NiwgMHhCRjQzOUI0NiwgMHhCRjQyOUE0NiwgMHhCRjQzOUE0NiwgMHhBOTcwQjA0NCwgMHhCRENCRTA3RSwgMHhCRUNGRTI4QSwgMHg1RUI0RDQ0RSwgMHgwOEQ5RUFBRiwgMHgwMEZGRkZGRiwgMHgxQUUxRUVCOCwgMHg5Q0JCRDc1MywgMHhCRkQ3RTZBMywgMHhCOUE1Q0I1OCwgMHhCRTQ0OUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhBOTg4QkM0NiwgMHhCRkQyRTQ5NCwgMHhCRkM4REU3NiwgMHhCRkQxRTM5MSwgMHhCRUMyREE3NiwgMHhCQTRGOUY0NiwgMHhCRjQzOUI0NywgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCOTU1QTI0NiwgMHhCNUMyREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDQ0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkRGRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCN0EyQzk1NiwgMHhCRTQ0OUE0NiwgMHhCRjQzOUE0NiwgMHhCRjQzOUE0NiwgMHhCRjQzOUE0NiwgMHhCRjQyOUE0NiwgMHhBODdCQjY0NCwgMHhCRENFRTI4QiwgMHhCQkNBREY3RCwgMHg0OEIzRDM1MSwgMHg1NkI1RDQ0RSwgMHhCRUM5REY3QSwgMHhCRUQwRTI4RCwgMHhCMjZEQUY0NCwgMHhCRjQzOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQzOUE0NiwgMHhCRjQyOUE0NiwgMHhCRDQ2OUM0NiwgMHhBOEE1Q0E0RSwgMHhCRkQ3RTdBMiwgMHhBMkJERDg1QiwgMHgyMEJEREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUyRUVCNywgMHg3RkI3RDU0QywgMHhCRkQ0RTQ5OSwgMHhCQUI4RDQ2QiwgMHhCQzQ5OUQ0NSwgMHhCRjQzOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhBRjYyQUE0NSwgMHhCOUM3REQ3NCwgMHhCRkQyRTQ5MiwgMHg2OEI0RDQ0QywgMHgwQ0QxRTY5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyM0QyRTU5NCwgMHhBNkJERDg1OSwgMHhCRkQ3RTZBMSwgMHhCODkxQkU1MCwgMHhCRTQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhCRjQyOUE0NiwgMHhBOTg0Qjc0MywgMHhCRkQxRTM5MSwgMHhCQUM3REQ3NSwgMHgzQkI1RDU1NywgMHgwMkZBRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJBNEQ2QkMsIDB4OUExMDkxNEIsIDB4QkYxMThGNDYsIDB4QkYxNzkxNDYsIDB4QjgxOTkwNDUsIDB4OTYxQTkxNDgsIDB4NUQzNTlENUQsIDB4MjQ3N0JDOTEsIDB4MDZEQUVERTAsIDB4MDFGQUZERkIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGQUZDRkEsIDB4MjQ4REMwOTMsIDB4QTM0NzlCNEIsIDB4QkY1NEEyNDUsIDB4QkY2M0FFNDUsIDB4QkY2REI2NDQsIDB4QkY3NkJFNDQsIDB4QkY3N0MwNDMsIDB4QkY3N0MwNDQsIDB4QkY3NkMwNDQsIDB4QkY3NkMwNDQsIDB4QkY3NUMwNDQsIDB4QkY3NEMwNDQsIDB4QkY3M0JGNDQsIDB4QkY3M0MwNDUsIDB4QkY3MkJGNDUsIDB4QkY3MUJGNDUsIDB4QkY2RkJFNDUsIDB4QkY3N0MwNDgsIDB4QkY5MUM0NTAsIDB4QkY4RkMzNTEsIDB4QkY4QkMxNTEsIDB4QkY4OUMxNTIsIDB4QkY5QUM4NEUsIDB4QkZDN0RFNzgsIDB4QkZEMUUzOTIsIDB4QkIzRTkzOTQsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjcwRjdBQjEsIDB4QUJCNkQ0NjEsIDB4QkZEN0U2QTMsIDB4OTVCQkQ3NTQsIDB4MEVERUVDQjcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlDRkU0OTQsIDB4OEFCN0Q1NEMsIDB4QkZENkU2OUUsIDB4QjdBQ0NFNzYsIDB4QkMwQTc3QjUsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QTQ2NEE3N0EsIDB4QkVEMUUzOEYsIDB4QkZEOEU3QTUsIDB4QkRDQURGODUsIDB4QjkyNzg2QTEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkMwNDc0QkEsIDB4QTc5QkM2NjMsIDB4QkZEN0U3QTMsIDB4QTdCRUQ5NUQsIDB4MUNEMkU1OTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MkVCRkRCNkYsIDB4QTZCREQ4NTksIDB4QkZEOEU3QTQsIDB4Qjk4MEI3N0EsIDB4QkUwMTcyQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QTkzNThFOTksIDB4QkFDNERDNzIsIDB4QkZENEU1OTcsIDB4NkZCNkQ0NEQsIDB4MDRGNEY5RTYsIDB4MDBGRkZGRkYsIDB4MDFGQUZDRjQsIDB4MzlCNUQ1NTYsIDB4QURDMERBNjEsIDB4QkZEN0U2QTEsIDB4QjY2OUFBODIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QTU1OEEyODIsIDB4QkVDRUUxODksIDB4QkZEN0U3QTUsIDB4QjY2M0E3ODIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTI1RUE1N0UsIDB4QkZEMEUzOEUsIDB4QkNDQURGN0MsIDB4NDRDMURDNkMsIDB4MkVCN0Q2NUQsIDB4QTVCREQ4NTksIDB4QkZEN0U3QTMsIDB4Qjc3RUI2N0MsIDB4QkUwMTcyQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QTQ1N0ExODMsIDB4QkVDRUUxODcsIDB4QkRDQ0UxODMsIDB4NERCQkQ4NUUsIDB4MDFGQkZERjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGQUZDRjQsIDB4NEFCN0Q2NTUsIDB4QjhDNURDNkYsIDB4QkZENEU1OTksIDB4Qjc1MDlEOEEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMTcyQkIsIDB4QTM3MEFFNzMsIDB4QkZEM0U1OTYsIDB4QjhDN0RENzIsIDB4MzZDMERCNkMsIDB4MDBGREZFRkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGREZFRkEsIDB4NzFCQUQ3NTYsIDB4QkZEMkU0OTIsIDB4QjlDN0RFNzQsIDB4Qjc1QUE2NDQsIDB4QkU0NTlCNDUsIDB4QkU0NTlCNDYsIDB4QkU0NTlCNDUsIDB4QkU0NjlCNDYsIDB4QjI2NEE3NDIsIDB4QkNDQUUwN0UsIDB4QkRDRkUyOEEsIDB4NURCNEQ0NEUsIDB4MDlFNkYxQ0EsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUU5QTUsIDB4OTZCQUQ2NTEsIDB4QkZEOEU3QTMsIDB4QkE5RUM0NTgsIDB4QkY0MzlBNDYsIDB4QkY0MTlBNDYsIDB4QkY0MjlBNDYsIDB4QkY0MjlBNDYsIDB4QkY0MTlBNDYsIDB4QUY3M0IwNDIsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0QsIDB4NEJCNEQ1NTIsIDB4MUVDRkUzOEQsIDB4OUZCQ0Q3NTUsIDB4QkZEN0U2QTIsIDB4Qjg5QkM0NTUsIDB4QkU0MjlBNDYsIDB4QkY0MjlBNDYsIDB4QkY0MTlBNDYsIDB4QkY0MTlBNDcsIDB4QkY0MTk5NDYsIDB4QjA3NkIyNDQsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDRGN0ZBRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VGQkMsIDB4OTFCOUQ2NEYsIDB4QkZEN0U2QTEsIDB4QkFBRENFNUMsIDB4QkM0NTlCNDYsIDB4QkY0MTlBNDcsIDB4QkY0MTlBNDYsIDB4QkY0MjlBNDYsIDB4QkY0MTlBNDYsIDB4QUQ2QkFENDQsIDB4QkJDQkUwODAsIDB4QkZDRUUyODgsIDB4QjJCQkQ3NTIsIDB4QkZEOEU3QTQsIDB4QkE5REM2NTYsIDB4QkY0MzlBNDYsIDB4QkY0MTlBNDYsIDB4QkY0MTlBNDcsIDB4QkY0MTlBNDYsIDB4QkY0MTlBNDYsIDB4QUM3OEIzNDQsIDB4QkVEMEUzOEQsIDB4QkRDQkRGN0UsIDB4NENCNEQ0NTEsIDB4MDVGMkY4RTQsIDB4MDBGRkZGRkYsIDB4MTFFMUVFQjksIDB4OEVCOEQ2NEQsIDB4QkZENkU2OUYsIDB4QjlCMkQxNjMsIDB4QkM0NzlDNDYsIDB4QkY0MTlBNDYsIDB4QkY0MTlBNDYsIDB4QkY0MjlBNDcsIDB4QkY0MTk5NDYsIDB4QUQ3NUIyNDUsIDB4QkRDRkUyOEIsIDB4QkZDREUxODMsIDB4QkZEMkUzOTIsIDB4QkVDMkRCNzYsIDB4QkE0RjlGNDYsIDB4QkY0MjlBNDcsIDB4QkY0MTlBNDYsIDB4QkY0MTlBNDYsIDB4QkY0MTk5NDYsIDB4Qjk1NEEyNDYsIDB4QjVDM0RCNkEsIDB4QkZENEU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjQsIDB4OURCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjdBMkNBNTYsIDB4QkU0MzlBNDYsIDB4QkY0MjlBNDYsIDB4QkY0MTk5NDYsIDB4QkY0MTlBNDYsIDB4QkY0MTk5NDYsIDB4QTg3QkI2NDQsIDB4QkRDRkUyOEIsIDB4QkJDQkUwN0UsIDB4NDhCM0Q0NTEsIDB4NTZCNUQ1NEUsIDB4QkVDQURGN0EsIDB4QkVEMEUyOEQsIDB4QjI2REFGNDUsIDB4QkY0MTlBNDYsIDB4QkY0MTlBNDYsIDB4QkY0MjlBNDYsIDB4QkY0MTlBNDYsIDB4QkQ0NTlDNDcsIDB4QTlBNUNBNEUsIDB4QkZEN0U3QTIsIDB4QTJCRUQ4NUMsIDB4MjFCRERBNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFM0VFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZENEU1OTksIDB4QkFCOEQ0NkIsIDB4QkM0OTlDNDUsIDB4QkY0MTlBNDYsIDB4QkY0MTk5NDYsIDB4QkY0MjlBNDYsIDB4QkY0MTk5NDYsIDB4QUY2MUFBNDUsIDB4QjlDN0RENzQsIDB4QkZEMkU0OTIsIDB4NjhCNUQ0NEQsIDB4MEREMkU2OUYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjREMkU1OTUsIDB4QTdCRUQ4NTksIDB4QkZEN0U2QTEsIDB4Qjg5MUJFNTAsIDB4QkY0MTk5NDYsIDB4QkY0MTlBNDYsIDB4QkY0MTlBNDYsIDB4QkY0MjlBNDYsIDB4QkY0MTlBNDYsIDB4QTk4NEI3NDQsIDB4QkZEMUUzOTIsIDB4QkFDOERFNzUsIDB4M0JCNUQ1NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA3RENFRkU1LCAweDdFMUU5OTVBLCAweEI3MDM4RDQ1LCAweDk0MUE5NTUyLCAweDVCNDhBOTcxLCAweDIxOTBDQUE5LCAweDA2RERFRkU0LCAweDAwRjNGOUY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRkZFLCAweDFFQkFEOUJFLCAweDlDNDU5OTRBLCAweEJGNTJBMjQ1LCAweEJGNjBBQzQ1LCAweEJGNkJCNTQ1LCAweEJGNzNCQzQzLCAweEJGNzZDMDQ0LCAweEJGNzRCRjQ0LCAweEJGNzRDMDQ0LCAweEJGNzNCRjQ0LCAweEJGNzJCRjQ0LCAweEJGNzJCRjQ0LCAweEJGNzFCRjQ0LCAweEJGNkZCRTQ0LCAweEJGNkZCRjQ1LCAweEJGNkVCRTQ1LCAweEJGNkRCRTQ1LCAweEJGODJDMTRCLCAweEJGOTBDMzUxLCAweEJGOEJDMTUwLCAweEJGOEFDMTUyLCAweEJGOUZDQTRDLCAweEJGQ0VFMjg4LCAweEJGQzdERTg1LCAweEJGMjU4NkEwLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEFFMUY4M0E2LCAweEIzQzJEQjZBLCAweEJGRDVFNTlELCAweDdFQjhENTRGLCAweDA2RURGNUQ4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI1QzVERTdELCAweDlCQkFENjUzLCAweEJGRDhFN0EzLCAweEI5OTJDMDc1LCAweEJFMDI3MkJCLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJDLCAweEJFMDE3MkJCLCAweEEzN0VCNjZDLCAweEJGRDVFNjlDLCAweEJGRDhFN0E1LCAweEJCQjlENjdCLCAweEI4MTE3QUFGLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEI1MTE3QkIxLCAweEFDQUZEMDYzLCAweEJGRDhFN0EzLCAweDk0QkFENjUzLCAweDBGRTVGMEMzLCAweDAwRkZGRkZGLCAweDAxRjZGQUVDLCAweDNGQjhENjVDLCAweEIyQzJEQjY2LCAweEJGRDVFNTlFLCAweEI0NUZBNTg0LCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJDLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEE0NEQ5Qjg4LCAweEJEQ0NFMDgzLCAweEJFQ0VFMTg3LCAweDU0QjdENjU2LCAweDAxRjZGQUVDLCAweDAwRkZGRkZGLCAweDAyRjRGOUU3LCAweDRBQjVENDUzLCAweEI5QzZERDcwLCAweEJGRDNFNDk3LCAweEI3NEU5QjhDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJCLCAweEEzNzRCMDcyLCAweEJGRDRFNTlBLCAweEJGRDJFNDk1LCAweEI1M0U5MzkzLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE0ODBCNzZDLCAweEJGRDVFNTlCLCAweEI0QzNEQjZBLCAweDJEQzNERDc1LCAweDNFQjhENjVELCAweEIzQzJEQjY2LCAweEJGRDVFNTlFLCAweEI3NjNBNzgyLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEEzNzNCMDczLCAweEJFRDNFNDk3LCAweEI5QzZERDcxLCAweDMzQzlFMDgyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA3RTNFRkMzLCAweDVGQjVENDRDLCAweEJDQ0JFMDgxLCAweEJGQ0VFMTg5LCAweEI0MkQ4QTlFLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDE3MkJCLCAweEEzOTJDMTY1LCAweEJGRDdFNkExLCAweEFEQzBEOTYyLCAweDIxRDFFNTk3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRkRGRUZBLCAweDcxQkFENzU1LCAweEJGRDFFMzkyLCAweEI4QzdERDc0LCAweEI4NTZBNTQ1LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGM0Y5OTQ2LCAweEJGNDA5QTQ2LCAweEIyNjBBNTQyLCAweEJDQ0FERjdFLCAweEJEQ0VFMThBLCAweDVDQjRENDRFLCAweDA5RTZGMUNBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE0LCAweDk2QjlENjUxLCAweEJGRDhFN0EzLCAweEI5OURDNDU3LCAweEJFNDE5OTQ2LCAweEJGM0Y5OTQ2LCAweEJGNDA5OTQ2LCAweEJGM0Y5OTQ2LCAweEJGNDA5OTQ2LCAweEFGNzJBRjQzLCAweEJFQ0ZFMjhBLCAweEJEQ0FERTdDLCAweDRCQjRENDUyLCAweDFFQ0ZFMzhELCAweDlGQkJENzU0LCAweEJGRDdFNkEyLCAweEI4OUJDMzU1LCAweEJFNDE5OTQ1LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ1LCAweEIwNzVCMTQzLCAweEJFQ0ZFMThCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDAzRjZGQUVDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRkJDLCAweDkwQjlENjRGLCAweEJGRDZFNkExLCAweEJBQUNDRTVDLCAweEJCNDQ5QTQ1LCAweEJGNDA5OTQ2LCAweEJGM0Y5OTQ1LCAweEJGNDA5QTQ2LCAweEJGNDA5OTQ2LCAweEFDNkFBQzQzLCAweEJBQ0JERjgwLCAweEJGQ0VFMTg3LCAweEJDQkVEODVCLCAweEJGRDdFN0EyLCAweEI2OTBDMDRFLCAweEJGNDE5QTQ2LCAweEJGM0Y5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ1LCAweEJGNDA5QTQ2LCAweEE4ODdCQzQ2LCAweEJGRDNFNDk3LCAweEI3QzZEQzcwLCAweDNEQjNENDUzLCAweDAzRjRGOUU3LCAweDAwRkZGRkZGLCAweDA3RUZGNkRBLCAweDdGQjhENjRELCAweEJGRDNFNDk4LCAweEI4QzFEQTZFLCAweEJCNEI5RjQ1LCAweEJGNDA5OTQ2LCAweEJGM0Y5OTQ2LCAweEJGNDA5OTQ2LCAweEJGM0Y5OTQ2LCAweEFGNjlBQzQ0LCAweEJCQ0FERjdFLCAweEJGRDBFMjhFLCAweEJGRDFFMzkyLCAweEJFQzJEQTc2LCAweEJBNEQ5RTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEI4NTNBMTQ1LCAweEI1QzJEQTY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCRTBFREI0LCAweDlDQkFENzUzLCAweEJGRDdFNkEyLCAweEI3QTJDOTU2LCAweEJFNDE5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEE4NzlCNTQzLCAweEJEQ0VFMThBLCAweEJCQ0FERjdFLCAweDQ4QjNENDUxLCAweDU2QjRENDRELCAweEJFQzlERTdBLCAweEJFRDBFMzhELCAweEIyNkJBRjQ0LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5QTQ2LCAweEJGNDA5OTQ2LCAweEJENDM5QjQ2LCAweEE4QTRDQTRFLCAweEJGRDdFNkEyLCAweEEyQkVEODVDLCAweDIwQkREQTcxLCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDNFNDk5LCAweEJBQjhENDZCLCAweEJDNDc5QzQ1LCAweEJGNDA5OTQ2LCAweEJGM0Y5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEFGNjBBOTQ1LCAweEI5QzdERDczLCAweEJGRDJFMzkyLCAweDY4QjRENDRDLCAweDBDRDFFNTlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIzRDJFNTk1LCAweEE2QkREODU5LCAweEJGRDZFNkExLCAweEI4OTFCRTUwLCAweEJFNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGNDA5OTQ2LCAweEJGM0Y5OTQ2LCAweEE4ODNCNjQzLCAweEJFRDFFMzkxLCAweEJBQzdERTc1LCAweDNCQjVENTU4LCAweDAyRkFGQ0Y1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgzQTQ4QUM3OCwgMHg1OTM2QTU2QywgMHgyMzhDQ0JBQSwgMHgwNkU1RjNFQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUJBREFCRiwgMHg5NjQ1OUE0QywgMHhCRjRGQTE0NiwgMHhCRjYwQUM0NiwgMHhCRjY5QjU0NSwgMHhCRjczQkQ0NSwgMHhCRjc0QkY0NCwgMHhCRjczQzA0NSwgMHhCRjcyQkY0NCwgMHhCRjcxQkY0NSwgMHhCRjcwQkY0NSwgMHhCRjcwQkY0NSwgMHhCRjZFQkU0NSwgMHhCRjZGQkY0NSwgMHhCRjZEQkU0NSwgMHhCRjZDQkU0NiwgMHhCRjZEQkU0NywgMHhCRjhCQzM1MCwgMHhCRjhCQzE1MCwgMHhCRjhDQzM1MiwgMHhCRkE2Q0Q0RCwgMHhCRkQ0RTU5OCwgMHhCRkJCRDc3NywgMHhCRjBGN0FCMCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNzNFOTM5MywgMHhCQ0M5REU3OSwgMHhCRUQxRTM5MSwgMHg2NUI2RDU1MCwgMHgwMkY4RkJGMCwgMHgwMEZGRkZGRiwgMHgwMEZBRkNGNCwgMHgzNUJDRDk2NiwgMHhBQkJGRDk1RSwgMHhCRkQ3RTdBMiwgMHhCNDczQjA3RCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRDA1NzRCOSwgMHhBNjlCQzU2NCwgMHhCRkQ4RTdBNCwgMHhCRkQ5RThBNywgMHhCQUE4Q0M3MSwgMHhCRDAzNzNCQSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCMDIzODVBNSwgMHhCM0MzREI2OSwgMHhCRkQ1RTY5RCwgMHg3RkI4RDU0RiwgMHgwNkU5RjNDRiwgMHgwMEZGRkZGRiwgMHgwNUYwRjdFMCwgMHg1M0I0RDQ0RCwgMHhCQUM5REY3NywgMHhCRkQxRTM5MywgMHhCODQxOTQ5MywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNDZEQUQ3NiwgMHhCRUQyRTQ5NCwgMHhCQUM4REU3NiwgMHgzQUMzREM3MywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOEUxRUVCRSwgMHg2MEI0RDQ0QiwgMHhCRENDRTA4MywgMHhCRkNERTE4OCwgMHhCNTJDODlBMCwgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRTAxNzJCQSwgMHhBNTkzQzE2NiwgMHhCRkQ4RThBOCwgMHhCRENCREY4NSwgMHhCOTI4ODdBMCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCQjA1NzRCOSwgMHhBNzk5QzU2NCwgMHhCRkQ4RTdBMiwgMHhBN0JGRDk1RCwgMHgyMUI4RDc2MiwgMHg1M0I0RDQ0RCwgMHhCOUM5REU3OCwgMHhCRkQyRTM5MywgMHhCNTNGOTQ5NCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRDAyNzJCQSwgMHhBNjk1QzI2NSwgMHhCRkQ3RTZBMSwgMHhBREMxREE2MiwgMHgyMUM5RTA4NSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwRUUxRUVCRiwgMHg3NkI2RDU0QSwgMHhCRUQyRTM5MiwgMHhCQkM1REQ3QiwgMHhCQjE3N0VBQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCOTA4NzZCNywgMHhBOUFDQ0Y2MCwgMHhCRkQ4RTdBNCwgMHg5REJDRDc1NiwgMHgxM0Q2RThBNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwM0ZERkVGQSwgMHg3MkJCRDc1NiwgMHhCRkQyRTQ5MywgMHhCOEM3REQ3NCwgMHhCODU1QTQ0NSwgMHhCRjNFOTk0NiwgMHhCRjNGOTk0NywgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NywgMHhCMjVGQTU0MiwgMHhCQ0NCRTA3RSwgMHhCRENGRTI4QSwgMHg1REI0RDQ0RiwgMHgwOUU2RjFDQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNSwgMHg5NkJBRDY1MSwgMHhCRkQ4RTdBMywgMHhCQTlEQzQ1OCwgMHhCRjQwOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNFOTk0NiwgMHhCRjNGOTk0NywgMHhBRjcyQUY0MywgMHhCRUNGRTI4QSwgMHhCRENBREY3RCwgMHg0QkI0RDU1MiwgMHgxRkNGRTM4RCwgMHg5RkJDRDc1NCwgMHhCRkQ3RTZBMiwgMHhCODlCQzQ1NSwgMHhCRTQwOTk0NiwgMHhCRjNGOTk0NywgMHhCRjNFOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NiwgMHhCMDc0QjE0NCwgMHhCRUNGRTI4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwNEY2RkFFRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUZCQywgMHg5MEI5RDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFDQ0U1QywgMHhCQzQzOUE0NiwgMHhCRjNGOTk0NywgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NywgMHhCRjNFOTk0NiwgMHhBRDZBQUM0NCwgMHhCQkNCRTA4MCwgMHhCRkNGRTI4OCwgMHhCRkMzREI2OCwgMHhCRkQ2RTY5RCwgMHhCNjdEQjY0OSwgMHhCRjQwOUE0NywgMHhCRjNFOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNFOTk0NiwgMHhCRjQwOUE0NiwgMHhBODk5QzU0OSwgMHhCRkQ2RTY5RSwgMHhCMEMyREI2NiwgMHgzMUI2RDY1QywgMHgwMUY2RkFFQywgMHgwMEZGRkZGRiwgMHgwNEY5RkNGMiwgMHg2Q0I4RDY0RCwgMHhCRUQwRTI4RiwgMHhCREM5REY3QiwgMHhCQTU0QTI0NSwgMHhCRjNGOTk0NywgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNFOTk0NiwgMHhBRTVFQTk0NiwgMHhCOUM1REM3MSwgMHhCRkQ0RTU5NywgMHhCRkQyRTQ5NCwgMHhCRUMyREI3NiwgMHhCQTRDOUY0NiwgMHhCRjNGOTk0NywgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NywgMHhCRjNGOTk0NiwgMHhCOTUyQTE0NiwgMHhCNUMyREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNSwgMHg5REJCRDc1NCwgMHhCRkQ3RTZBMywgMHhCN0EyQ0E1NiwgMHhCRTQxOUE0NiwgMHhCRjNGOTk0NiwgMHhCRjNFOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NiwgMHhBODc5QjU0NCwgMHhCRENFRTE4QSwgMHhCQ0NCRTA3RSwgMHg0OUIzRDQ1MiwgMHg1NkI1RDQ0RSwgMHhCRUM5REY3QSwgMHhCRUQwRTM4RCwgMHhCMjZCQUY0NSwgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNGOUE0NiwgMHhCRjNGOTk0NiwgMHhCRDQyOUI0NiwgMHhBOEE0Q0E0RSwgMHhCRkQ3RTdBMywgMHhBMkJFRDg1QywgMHgyMUJFREE3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQUUzRUVCNywgMHg3RkI4RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUI4RDU2QiwgMHhCQzQ3OUM0NSwgMHhCRjNGOTk0NiwgMHhCRjNFOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NiwgMHhBRjVGQTk0NSwgMHhCOUM3REQ3NCwgMHhCRkQyRTQ5MiwgMHg2OUI1RDQ0RCwgMHgwQ0QxRTY5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNEQzRTU5NSwgMHhBNkJFRDg1OSwgMHhCRkQ3RTZBMiwgMHhCODkxQkU1MCwgMHhCRjNGOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNFOTk0NiwgMHhCRjNGOTk0NiwgMHhCRjNFOTk0NiwgMHhBOTgzQjc0NCwgMHhCRkQxRTM5MSwgMHhCQUM4REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNFM0YyRUIsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTVCQ0RBQzEsIDB4OEY0MTk4NEIsIDB4QkY0REExNDYsIDB4QkY1Q0FCNDYsIDB4QkY2N0I0NDUsIDB4QkY2RUJBNDQsIDB4QkY3MUJGNDUsIDB4QkY3MUJFNDQsIDB4QkY3MEJGNDUsIDB4QkY2RUJFNDQsIDB4QkY2RUJFNDUsIDB4QkY2REJENDUsIDB4QkY2REJFNDYsIDB4QkY2QkJENDUsIDB4QkY2QkJENDYsIDB4QkY2OUJENDUsIDB4QkY3NUJGNEEsIDB4QkY4QUMxNTAsIDB4QkY4RkM0NTIsIDB4QkZBREQwNTEsIDB4QkZEN0U3QTEsIDB4QkZBNENCNzAsIDB4QkYwMzc0QjksIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTM1QUEyODAsIDB4QkVDRkUyOEEsIDB4QkNDQkRGODAsIDB4NDlCOEQ2NTgsIDB4MDBGOUZCRjIsIDB4MDBGRkZGRkYsIDB4MDJGNUY5RUEsIDB4NDdCNEQ0NTEsIDB4QjVDNERDNkMsIDB4QkZENUU1OUEsIDB4Qjc1MjlFOEEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QjcwRTc5QjMsIDB4QUJCNkQ0NUYsIDB4QkZEOEU3QTUsIDB4QkZEOEU3QTUsIDB4QjU4NkJBNzksIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QTgzQjkxOTQsIDB4QkFDOERFNzgsIDB4QkZEMkUzOTIsIDB4NjVCOEQ2NTQsIDB4MDJGQ0ZERjgsIDB4MDBGRkZGRkYsIDB4MDlFM0VGQzMsIDB4NjhCNUQ0NEIsIDB4QkZDRUUxODgsIDB4QkRDOEREODUsIDB4QjYyNzg3QTEsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkQwMTcyQkEsIDB4QTU4OUJDNjksIDB4QkZENkU2OUYsIDB4QjBDMkRCNjYsIDB4MjZDNkRGN0UsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEVFMUVFQkUsIDB4NzZCNkQ0NEEsIDB4QkZEMkU0OTMsIDB4QkFDNERDNzksIDB4QkMxNjdEQUQsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QjgwODc2QjYsIDB4QTlBRENGNjAsIDB4QkZEQkU5QUYsIDB4QkNCQUQ2N0IsIDB4QjgxMTdCQjAsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjYxMDdBQjEsIDB4QUNBRkQwNjIsIDB4QkZEOEU3QTQsIDB4OTVCQUQ2NTQsIDB4MThDREUzOTIsIDB4NjdCNEQ0NEEsIDB4QkVDRUUyODgsIDB4QkNDQURGODUsIDB4QjkyODg3QTEsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjcwQTc3QjQsIDB4QUJBNkNDNjQsIDB4QkZEN0U3QTQsIDB4OUNCQ0Q3NTcsIDB4MTNERkVEQjgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTdDQkUxOEQsIDB4ODlCN0Q1NEMsIDB4QkZENUU1OUQsIDB4QjhBQ0NGNzgsIDB4QkIwQTc3QjQsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjAxQjgwQUEsIDB4QjJCOEQ1NjYsIDB4QkZEN0U2QTEsIDB4ODdCOEQ1NTAsIDB4MEFFQ0Y0RDQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGREZFRkEsIDB4NzFCQUQ3NTUsIDB4QkZEMkU0OTIsIDB4QjhDN0RENzQsIDB4Qjc1NEE0NDQsIDB4QkYzRDk4NDYsIDB4QkYzRTk5NDYsIDB4QkYzRDk5NDYsIDB4QkYzRTk5NDYsIDB4QjI1RkE0NDEsIDB4QkNDQURGN0UsIDB4QkRDRUUxOEEsIDB4NUNCNEQ0NEUsIDB4MDlFNkYxQ0EsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUU5QTQsIDB4OTZCOUQ2NTEsIDB4QkZEOEU3QTMsIDB4Qjk5REM0NTcsIDB4QkUzRjk5NDYsIDB4QkYzRDk4NDYsIDB4QkYzRDk5NDYsIDB4QkYzRDk5NDYsIDB4QkYzRDk5NDYsIDB4QUY3MUFGNDIsIDB4QkVDRkUyOEEsIDB4QkRDQURGN0MsIDB4NEJCNEQ0NTIsIDB4MUVDRkUzOEQsIDB4OUZCQkQ3NTQsIDB4QkZEN0U2QTIsIDB4Qjg5QUMzNTUsIDB4QkUzRTk4NDUsIDB4QkYzRDk5NDYsIDB4QkYzRDk4NDYsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDYsIDB4QjA3NEIxNDMsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDNGNkZBRUMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VFQkMsIDB4OTBCOUQ2NEYsIDB4QkZEN0U2QTEsIDB4QkFBQ0NFNUMsIDB4QkI0MjlBNDUsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDYsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDYsIDB4QUQ2OEFCNDMsIDB4QkJDQkUwODAsIDB4QkZDRUUxODgsIDB4QkZDN0RENzQsIDB4QkZEMkU0OTUsIDB4QkE2Q0FFNDYsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDUsIDB4QkYzRDk5NDYsIDB4QkYzQzk4NDYsIDB4QkQ0MDlBNDYsIDB4QUNBMkM5NEYsIDB4QkZEOEU3QTMsIDB4QTVCRUQ4NUMsIDB4MjVDMkREN0EsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGOUZDRjIsIDB4NTdCN0Q2NEYsIDB4QkNDQkUwODAsIDB4QkZDRUUyODksIDB4QjU2MEE4NDYsIDB4QkYzRDk5NDYsIDB4QkYzRDk4NDYsIDB4QkYzRDk5NDYsIDB4QkYzRDk4NDYsIDB4QjU0RUEwNDYsIDB4QjZCQ0Q3NjQsIDB4QkZENkU2OUYsIDB4QkZEM0U0OTYsIDB4QkVDMURBNzUsIDB4QkE0QjlENDUsIDB4QkYzRDk5NDYsIDB4QkYzRDk5NDYsIDB4QkYzRDk5NDYsIDB4QkYzRDk4NDYsIDB4Qjk1MUExNDUsIDB4QjVDMkRCNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ0NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUJERkVEQjQsIDB4OURCQUQ3NTQsIDB4QkZEN0U2QTMsIDB4QjdBMUM5NTYsIDB4QkUzRjk5NDYsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDYsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDYsIDB4QTg3OUI0NDQsIDB4QkRDRUUxOEEsIDB4QkJDQURGN0QsIDB4NDhCM0Q0NTEsIDB4NTZCNUQ0NEQsIDB4QkVDOURGN0EsIDB4QkVEMEUyOEQsIDB4QjI2QUFFNDQsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDYsIDB4QkYzRDk5NDYsIDB4QkYzRDk4NDYsIDB4QkQ0MTlBNDYsIDB4QThBNEM5NEUsIDB4QkZEN0U3QTIsIDB4QTJCREQ4NUIsIDB4MjBCRERBNzAsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFMkVFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZEM0U0OTksIDB4QkFCOEQ0NkIsIDB4QkM0NTlCNDUsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDYsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDYsIDB4QUY1RkE5NDUsIDB4QjlDN0RENzMsIDB4QkZEMkU0OTIsIDB4NjhCNEQ0NEQsIDB4MENEMUU2OUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjNEMkU1OTUsIDB4QTZCREQ4NTksIDB4QkZEN0U2QTIsIDB4Qjg5MEJENTAsIDB4QkUzRDk4NDYsIDB4QkYzRTk5NDYsIDB4QkYzRDk4NDYsIDB4QkYzRDk4NDYsIDB4QkYzQzk4NDYsIDB4QTk4MkI2NDQsIDB4QkZEMUUzOTIsIDB4QkFDN0RENzQsIDB4M0JCNUQ1NTgsIDB4MDJGQUZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDExQkJEQUMyLCAweDg4NDA5OTRDLCAweEJFNEJBMDQ2LCAweEJGNUFBQTQ2LCAweEJGNjNCMjQ1LCAweEJGNkJCQTQ1LCAweEJGNkZCRTQ1LCAweEJGNkZCRjQ1LCAweEJGNkVCRTQ1LCAweEJGNkRCRTQ2LCAweEJGNkNCRTQ1LCAweEJGNkNCRTQ2LCAweEJGNkFCRDQ2LCAweEJGNjlCRTQ2LCAweEJGNjhCRDQ2LCAweEJGNjdCRDQ3LCAweEJGN0VCRjRELCAweEJGOTJDNTUyLCAweEJGQjVENDU4LCAweEJGRDhFN0EzLCAweEJGODVCQTc3LCAweEJGMDI3MkJCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE0NzdCMjcxLCAweEJGRDRFNTlBLCAweEI3QzVEQzZFLCAweDMxQzlFMDgxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RTlGM0QxLCAweDVBQjVENTRFLCAweEJEQ0FERjdELCAweEJGQ0ZFMjhFLCAweEI2Mzg5MDk3LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEFEMjQ4NUE1LCAweEI1QkZEOTZCLCAweEJGRDlFOEE2LCAweEJGRDZFNkEwLCAweEI4NjhBQTgyLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEE0NUNBNDdGLCAweEJGQ0ZFMTg5LCAweEJDQ0NFMDgyLCAweDRBQjdENjU2LCAweDAxRkNGREY4LCAweDAwRkZGRkZGLCAweDEyRDZFOEE1LCAweDdEQjZENDRBLCAweEJGRDRFNTk4LCAweEJDQkNENzc2LCAweEJBMEU3OUIzLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJBMDg3NkI2LCAweEE4QTJDOTY0LCAweEJGRDdFN0E0LCAweEExQkREODVBLCAweDE2RERFQ0IyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE5Q0NFMjhFLCAweDhBQjdENTRDLCAweEJGRDZFNjlFLCAweEI4QUFDRTc3LCAweEJDMEE3N0I2LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEFGMUI4MEFBLCAweEIzQjlENjY4LCAweEJGRENFQUIzLCAweEI5QUFDRDcxLCAweEJEMDM3M0JBLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEIwMjE4NEE2LCAweEIyQzNEQjY4LCAweEJGRDZFNjlFLCAweDdGQjdENTRFLCAweDE4QkFEOTZBLCAweDdDQjZENTRBLCAweEJGRDNFNDk3LCAweEJCQjlENjdCLCAweEI5MTE3QkIwLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEIyMUI4MEE5LCAweEIxQkVEOTY1LCAweEJGRDZFNkEwLCAweDg3QjlENjUwLCAweDA4RTNFRkMyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI0QzdERjgyLCAweDlCQkJENzUzLCAweEJGRDdFN0EzLCAweEI5OTZDMzc0LCAweEJFMDE3MkJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEFBMzM4RDlBLCAweEI4QzZERDcyLCAweEJGRDNFNTk3LCAweDZGQjdENTRGLCAweDAzRURGNUQ5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRkRGRUZBLCAweDcxQkJENzU1LCAweEJGRDJFNDkyLCAweEI5QzdERDc0LCAweEI4NTNBNDQ1LCAweEJGM0I5ODQ2LCAweEJGM0M5OTQ2LCAweEJGM0M5ODQ2LCAweEJGM0M5OTQ3LCAweEIyNUVBNDQyLCAweEJDQ0JFMDdFLCAweEJEQ0VFMjhBLCAweDVEQjRENDRGLCAweDA5RTZGMUNBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE0LCAweDk2QjlENjUxLCAweEJGRDhFN0EzLCAweEJBOURDNDU4LCAweEJGM0U5OTQ2LCAweEJGM0M5ODQ2LCAweEJGM0Q5ODQ2LCAweEJGM0M5ODQ2LCAweEJGM0M5ODQ2LCAweEFGNzFBRjQzLCAweEJFQ0ZFMjhBLCAweEJEQ0FERjdELCAweDRCQjRENTUyLCAweDFFQ0ZFMzhELCAweDlGQkNEODU1LCAweEJGRDdFNkEyLCAweEI4OUFDMzU1LCAweEJFM0Q5ODQ2LCAweEJGM0M5OTQ3LCAweEJGM0M5ODQ2LCAweEJGM0M5ODQ2LCAweEJGM0M5ODQ2LCAweEIwNzNCMTQ0LCAweEJFQ0ZFMjhCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDA0RjdGQUVELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRkJDLCAweDkxQjlENjRGLCAweEJGRDdFNkExLCAweEJBQUNDRTVDLCAweEJDNDE5OTQ1LCAweEJGM0Q5OTQ2LCAweEJGM0M5ODQ2LCAweEJGM0Q5ODQ2LCAweEJGM0M5ODQ2LCAweEFENjhBQjQ0LCAweEJCQ0JFMDgxLCAweEJGQ0ZFMjg5LCAweEJGQ0NFMDgxLCAweEJFQ0VFMjhBLCAweEI3NjFBQTQ0LCAweEJGM0Q5OTQ2LCAweEJGM0I5ODQ2LCAweEJGM0Q5ODQ2LCAweEJGM0M5ODQ2LCAweEJBNDM5QzQ2LCAweEFDQjFEMTU3LCAweEJGRDhFN0E0LCAweDk3QkJENzU1LCAweDFDQzJERDdDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZDLCAweDQzQzhERjc4LCAweEI5QzdERDcyLCAweEJGRDNFNTk2LCAweEI1NzNCMzQ2LCAweEJGM0Q5OTQ2LCAweEJGM0M5ODQ2LCAweEJGM0Q5ODQ2LCAweEJGM0M5ODQ2LCAweEJDNDU5QzQ2LCAweEFGQjVENDVCLCAweEJGRDhFN0EzLCAweEJGRDRFNTlBLCAweEJFQzJEQjc2LCAweEJBNEE5RDQ1LCAweEJGM0Q5OTQ2LCAweEJGM0M5ODQ2LCAweEJGM0M5ODQ2LCAweEJGM0M5ODQ2LCAweEI5NTBBMTQ2LCAweEI1QzJEQjY5LCAweEJGRDRFNTlBLCAweDc2QjZENTRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFDRTBFREI0LCAweDlEQkJENzU0LCAweEJGRDdFN0EzLCAweEI3QTFDOTU2LCAweEJFM0U5OTQ2LCAweEJGM0M5OTQ2LCAweEJGM0M5OTQ2LCAweEJGM0Q5OTQ2LCAweEJGM0M5ODQ2LCAweEE4NzhCNDQ0LCAweEJEQ0VFMjhCLCAweEJCQ0JFMDdFLCAweDQ4QjNENDUyLCAweDU2QjVENTRFLCAweEJFQzlERjdBLCAweEJFRDBFMjhELCAweEIyNjlBRTQ1LCAweEJGM0M5OTQ3LCAweEJGM0M5ODQ2LCAweEJGM0M5OTQ2LCAweEJGM0M5ODQ2LCAweEJENDA5QTQ2LCAweEE5QTRDQTRFLCAweEJGRDdFN0EyLCAweEEyQkVEODVDLCAweDIxQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNDk5LCAweEJBQjhENDZCLCAweEJDNDQ5QjQ1LCAweEJGM0M5ODQ2LCAweEJGM0M5ODQ2LCAweEJGM0M5ODQ2LCAweEJGM0M5ODQ2LCAweEFGNUVBOTQ1LCAweEI5QzdERDc0LCAweEJGRDJFNDkzLCAweDY4QjRENDRELCAweDBERDFFNjlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI0RDJFNTk1LCAweEE3QkVEODU5LCAweEJGRDdFNkExLCAweEI4OTBCRDUwLCAweEJGM0M5ODQ2LCAweEJGM0Q5OTQ2LCAweEJGM0M5ODQ2LCAweEJGM0M5OTQ2LCAweEJGM0M5ODQ2LCAweEE5ODJCNjQ0LCAweEJGRDFFMzkyLCAweEJBQzdERTc1LCAweDNCQjVENTU4LCAweDAyRkJGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQ0MwREVDNiwgMHg4MDU4QTY2MywgMHhCRTQ4OUU0NiwgMHhCRjU1QTc0NiwgMHhCRjVGQjA0NiwgMHhCRjY3Qjc0NSwgMHhCRjZDQkQ0NSwgMHhCRjZDQkQ0NSwgMHhCRjZDQkU0NiwgMHhCRjZCQkQ0NSwgMHhCRjZBQkQ0NiwgMHhCRjY4QkQ0NiwgMHhCRjY4QkQ0NiwgMHhCRjY2QkM0NiwgMHhCRjY1QkM0NywgMHhCRjY4QkM0NywgMHhCRjkyQzY0RiwgMHhCRkJERDg2NCwgMHhCRkQ2RTZBMCwgMHhCRjY3QUE4MCwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCQzAzNzNCQSwgMHhBNTk2QzM2MywgMHhCRkQ3RTdBMiwgMHhBQUMwRDk2MCwgMHgxRkNBRTE4OCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQ0RBRUFCMSwgMHg3MUI2RDQ0QSwgMHhCRUQwRTI4RSwgMHhCRUM2REQ3RCwgMHhCNzE4N0VBQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNjQwOTQ5MSwgMHhCQkM4REU3OSwgMHhCRkQ5RTdBNiwgMHhCRkQzRTQ5NiwgMHhCNTQ5OTk4RiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRTAwNzFCQiwgMHhBMjc2QjI3MiwgMHhCRkQ0RTQ5OCwgMHhCN0M2REQ2RiwgMHgzMEM4REY4MCwgMHgwMEZFRkZGRCwgMHgwMEZFRkZGRSwgMHgxQ0NCRTI4QywgMHg5MUI4RDU0RSwgMHhCRkQ3RTdBMSwgMHhCNkE3Q0M3MSwgMHhCRTA0NzRCOSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCNDEzN0JBRiwgMHhBRUJERDg2MSwgMHhCRkQ2RTZBMSwgMHg4RUI5RDY1MSwgMHgwQURFRUNCOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNUM3REY4MCwgMHg5Q0JBRDY1MiwgMHhCRkQ4RTdBNCwgMHhCODkzQzE3NCwgMHhCRTAxNzJCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhBOTM1OEU5NywgMHhCOUM3REU3MywgMHhCRkRCRTlBRiwgMHhCNTg2QkE3OSwgMHhCRTAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNzNBOTE5NSwgMHhCQUM4REU3OCwgMHhCRUQxRTM5MiwgMHg2NUI3RDU1MiwgMHgxRkNCRTI4QiwgMHg5MEI4RDU0RSwgMHhCRkQ3RTZBMSwgMHhCOUE4Q0Q3MSwgMHhCRDAzNzNCQSwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBOTJGOEI5QiwgMHhCOEM3REQ3MywgMHhCRUQzRTQ5NiwgMHg2RkI4RDY1MiwgMHgwM0Y1RjlFQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY5RkNGMywgMHgzM0I4RDc1RiwgMHhBQUJGRDk1RCwgMHhCRkQ3RTZBMiwgMHhCNDc0QjA3RCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBNTRDOUI4OSwgMHhCQ0NERTA4NCwgMHhCRUNFRTE4NywgMHg1NUJDRDg1RiwgMHgwMUZFRkZGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkZERkVGQSwgMHg3MUJBRDc1NiwgMHhCRkQxRTM5MiwgMHhCOEM3REQ3MywgMHhCODUyQTM0NCwgMHhCRjNCOTg0NiwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhCRjNCOTg0NiwgMHhCMjVEQTQ0MSwgMHhCQ0NBREY3RSwgMHhCRENFRTE4OSwgMHg1Q0I0RDQ0RSwgMHgwOUU2RjFDQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNCwgMHg5NkI5RDY1MSwgMHhCRkQ4RTdBMywgMHhCOTlDQzQ1NywgMHhCRTNEOTg0NiwgMHhCRjNBOTc0NiwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhCRjNCOTg0NiwgMHhBRjcwQUY0MiwgMHhCRUNGRTI4QSwgMHhCRENBREY3QywgMHg0QkI0RDQ1MiwgMHgxRUNGRTM4RCwgMHg5RkJCRDc1NCwgMHhCRkQ3RTZBMiwgMHhCODlBQzM1NSwgMHhCRTNCOTg0NSwgMHhCRjNCOTg0NiwgMHhCRjNCOTc0NiwgMHhCRjNCOTg0NiwgMHhCRjNCOTc0NiwgMHhCMDcyQjA0MywgMHhCRUNGRTE4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwM0Y2RkFFQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUZCQywgMHg5MEI5RDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFCQ0Q1QiwgMHhCQjNGOTk0NSwgMHhCRjNCOTg0NiwgMHhCRjNCOTc0NiwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhBQzY3QUI0MywgMHhCQUNCREY4MCwgMHhCRkNGRTI4QiwgMHhCRkQwRTI4RSwgMHhCREM2REQ3QywgMHhCODRGQTA0NSwgMHhCRjNCOTg0NiwgMHhCRjNBOTg0NiwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhCODRBOUU0NiwgMHhBRUJFRDk2MSwgMHhCRkQ3RTZBMCwgMHg4N0I4RDU0RiwgMHgxNUM0REU4MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgzNUNCRTE4MiwgMHhCMEMyREE2NSwgMHhCRkQ2RTY5RSwgMHhCODgwQjg0QSwgMHhCRjNCOTg0NiwgMHhCRjNCOTg0NiwgMHhCRjNCOTg0NiwgMHhCRjNCOTc0NiwgMHhCRTNEOTk0NiwgMHhBOUFEQ0Y1MywgMHhCRkQ3RTdBMywgMHhCRkQ1RTU5QywgMHhCRUMyREE3NSwgMHhCQTQ4OUQ0NSwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhCODRFQTA0NSwgMHhCNUMyREE2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkUwRURCNCwgMHg5Q0JCRDc1MywgMHhCRkQ3RTZBMiwgMHhCN0ExQzk1NiwgMHhCRTNEOTg0NiwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NSwgMHhCRjNCOTg0NiwgMHhCRjNBOTg0NiwgMHhBODc3QjQ0NCwgMHhCRENFRTE4QSwgMHhCQkNBREY3RCwgMHg0OEIzRDQ1MSwgMHg1NkI1RDQ0RCwgMHhCRUM5REY3QSwgMHhCRUQwRTI4RCwgMHhCMjY4QUU0NCwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhCRjNCOTg0NiwgMHhCRjNBOTg0NiwgMHhCRDNGOTk0NiwgMHhBOEEzQzk0RSwgMHhCRkQ3RTdBMiwgMHhBMkJFRDg1QiwgMHgyMEJEREE3MCwgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI3RDU0QywgMHhCRkQzRTQ5OSwgMHhCQUI4RDQ2QiwgMHhCQzQzOUE0NSwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhBRjVDQTg0NSwgMHhCOUM3REQ3MywgMHhCRkQyRTQ5MiwgMHg2OEI0RDQ0RCwgMHgwQ0QxRTU5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyM0QyRTU5NCwgMHhBNkJERDg1OSwgMHhCRkQ3RTZBMSwgMHhCODhGQkQ1MCwgMHhCRTNCOTg0NiwgMHhCRjNCOTg0NiwgMHhCRjNBOTc0NiwgMHhCRjNCOTg0NiwgMHhCRjNCOTg0NiwgMHhBODgxQjY0MywgMHhCRUQxRTM5MSwgMHhCQUM3REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZBRkNGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFOUYzRUIsIDB4Nzk1OUE3NjcsIDB4QkQ0MjlDNDYsIDB4QkY1MkE2NDcsIDB4QkY1Q0FGNDYsIDB4QkY2NUI3NDYsIDB4QkY2OUJDNDYsIDB4QkY2QUJFNDYsIDB4QkY2OUJENDYsIDB4QkY2OUJENDcsIDB4QkY2N0JENDYsIDB4QkY2NkJENDcsIDB4QkY2NUJDNDcsIDB4QkY2NEJDNDcsIDB4QkY2NEJDNDcsIDB4QkY4QUM2NDksIDB4QkZDNURDNzQsIDB4QkZEM0U0OTYsIDB4QkY0ODk5OEUsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QjcwRDc5QjQsIDB4QUJBOUNENjQsIDB4QkZEOEU3QTQsIDB4OTlCQkQ3NTYsIDB4MTJFMkVGQkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTVEQUVBQUQsIDB4ODZCOEQ1NEMsIDB4QkZENUU1OUMsIDB4QjhCN0Q1NzMsIDB4QkQwQTc3QjQsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTU1OEEyODIsIDB4QkRDRkUyOEIsIDB4QkZEOUU4QTYsIDB4QkVDREUxODYsIDB4QjgyQTg4QTEsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkUwMTcyQkIsIDB4QTY5QUM1NjMsIDB4QkZEN0U2QTEsIDB4QUJDMERBNjEsIDB4MUVDRUUzOTAsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MkJCQ0Q5NjgsIDB4QTJCQ0Q3NTYsIDB4QkZEOEU3QTQsIDB4Qjc4M0I5N0EsIDB4QkYwMjczQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QUEyQTg4QTAsIDB4QjdDM0RDNkYsIDB4QkZENEU1OUEsIDB4NzZCN0Q2NEYsIDB4MDVGNkZBRUMsIDB4MDBGRkZGRkYsIDB4MDFGOUZDRjMsIDB4MzVCQUQ4NjEsIDB4QUFCRkQ5NUUsIDB4QkZEOEU3QTIsIDB4QjQ3MkFGN0UsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QTU0RDlCODgsIDB4QkRDREUxODYsIDB4QkZEOEU3QTYsIDB4Qjc2OUFCODEsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTQ1REE0N0YsIDB4QkZDRkUyODksIDB4QkNDQ0UwODEsIDB4NEFCNUQ1NTMsIDB4MkJCQkQ5NjYsIDB4QTFCQ0Q3NTYsIDB4QkZEOEU3QTQsIDB4QjQ4N0JBNzgsIDB4QkYwMTcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTU1MjlFODYsIDB4QkVDREUxODQsIDB4QkRDRUUxODcsIDB4NTRCOEQ2NTUsIDB4MDFGQkZERjcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGOEZCRUYsIDB4NDVCNUQ0NTIsIDB4QjVDNURDNkIsIDB4QkZENEU1OUIsIDB4Qjg1NTlGODksIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTU2RUFENzUsIDB4QkZEMkU0OTMsIDB4QjlDOURGNzcsIDB4M0NCQkQ4NjIsIDB4MDFGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGREZFRkEsIDB4NzJCQkQ3NTYsIDB4QkZEMkU0OTMsIDB4QjhDN0RENzQsIDB4Qjg1MkEzNDUsIDB4QkYzQTk3NDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk3NDYsIDB4QkYzQTk4NDYsIDB4QjI1REE0NDIsIDB4QkNDQkRGN0UsIDB4QkRDRUUyOEEsIDB4NURCNEQ0NEYsIDB4MDlFNkYxQ0EsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTZEOUVBQTUsIDB4OTZCQUQ2NTEsIDB4QkZEOEU3QTMsIDB4QkE5Q0M0NTcsIDB4QkYzQzk5NDYsIDB4QkYzOTk3NDYsIDB4QkYzQTk4NDYsIDB4QkYzQTk3NDYsIDB4QkYzQTk4NDcsIDB4QUY3MEFFNDMsIDB4QkVDRkUyOEEsIDB4QkRDQURGN0QsIDB4NEJCNEQ1NTIsIDB4MUZDRkUzOEQsIDB4OUZCQ0Q3NTQsIDB4QkZEN0U2QTIsIDB4Qjg5QUMzNTUsIDB4QkUzQjk4NDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk3NDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk3NDYsIDB4QjA3MkIwNDQsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDRGNkZBRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VGQkMsIDB4OTBCQUQ2NEYsIDB4QkZEN0U2QTEsIDB4QkFBQ0NFNUMsIDB4QkMzRTk5NDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk3NDYsIDB4QkYzQTk4NDcsIDB4QkYzQTk3NDYsIDB4QUQ2NkFCNDQsIDB4QkJDQkUwODAsIDB4QkZEMEUzOEQsIDB4QkZENEU1OTksIDB4QkRCRkQ5NkUsIDB4QkM0NDlCNDUsIDB4QkYzQTk4NDcsIDB4QkYzOTk3NDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk3NDYsIDB4QjQ1MkEyNDUsIDB4QjZDM0RCNkMsIDB4QkZENUU1OUEsIDB4NzdCNkQ0NEUsIDB4MTBEREVDQjYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjZDREUyODgsIDB4QTdCRUQ4NUIsIDB4QkZEOEU3QTMsIDB4QjU5MUMxNTAsIDB4QkYzQTk4NDcsIDB4QkYzQTk3NDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk3NDYsIDB4QkYzQjk4NDcsIDB4QUM5OEM0NEMsIDB4QkZEN0U3QTEsIDB4QkZENkU2OUUsIDB4QkVDMkRCNzYsIDB4QkE0ODlENDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk3NDYsIDB4QkYzQTk4NDcsIDB4QkYzQTk4NDYsIDB4Qjk0RUEwNDUsIDB4QjVDMkRCNjksIDB4QkZENUU1OUEsIDB4NzZCNkQ1NEUsIDB4MTFERkVEQkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUNFMEVEQjUsIDB4OURCQkQ3NTQsIDB4QkZEN0U3QTMsIDB4QjdBMUM5NTYsIDB4QkUzQzk4NDYsIDB4QkYzQTk4NDYsIDB4QkYzQTk3NDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk4NDYsIDB4QTg3N0I0NDQsIDB4QkRDRUUxOEIsIDB4QkNDQkUwN0UsIDB4NDlCM0Q0NTIsIDB4NTZCNUQ0NEUsIDB4QkVDOURGN0EsIDB4QkVEMEUzOEQsIDB4QjI2OEFFNDUsIDB4QkYzQTk4NDYsIDB4QkYzQTk4NDYsIDB4QkYzQTk4NDYsIDB4QkYzQTk4NDYsIDB4QkQzRDk5NDYsIDB4QThBNEM5NEUsIDB4QkZEN0U3QTIsIDB4QTJCRUQ4NUMsIDB4MjFCRERBNzEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEFFM0VFQjcsIDB4N0ZCOEQ1NEMsIDB4QkZENEU0OTksIDB4QkFCOEQ0NkIsIDB4QkM0MjlBNDUsIDB4QkYzQTk4NDYsIDB4QkYzOTk3NDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk4NDYsIDB4QUY1Q0E4NDUsIDB4QjlDN0RENzQsIDB4QkZEMkU0OTMsIDB4NjlCNUQ0NEQsIDB4MENEMkU2OUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjREM0U1OTUsIDB4QTZCREQ4NTksIDB4QkZEN0U2QTEsIDB4Qjg4RkJENTAsIDB4QkYzQTk4NDYsIDB4QkYzQTk4NDYsIDB4QkYzOTk3NDYsIDB4QkYzQTk4NDcsIDB4QkYzQTk4NDYsIDB4QTk4MUI2NDQsIDB4QkZEMUUzOTIsIDB4QkFDOERFNzUsIDB4M0JCNUQ1NTgsIDB4MDJGQkZERjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA4RTlGNEVDLCAweDcwNTZBNjY3LCAweEJEM0Y5QjQ2LCAweEJGNEVBNDQ2LCAweEJGNUFBRTQ3LCAweEJGNjFCNTQ1LCAweEJGNjdCQjQ2LCAweEJGNjdCQzQ2LCAweEJGNjdCQzQ2LCAweEJGNjVCQzQ2LCAweEJGNjVCQzQ3LCAweEJGNjNCQjQ2LCAweEJGNjJCQzQ3LCAweEJGNjRCQzQ3LCAweEJGOERDODQ3LCAweEJGQ0NFMDg1LCAweEJGQ0NFMDg3LCAweEJGMkM4OTlELCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEIxMUQ4MkE4LCAweEIxQzFEQTY1LCAweEJGRDZFNjlGLCAweDgzQjhENTRGLCAweDA4RTNFRkMzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIxQzFEQzc2LCAweDk4QkFENzUxLCAweEJGRDdFNkEyLCAweEI3OTVDMjc4LCAweEJEMDM3M0I5LCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJCLCAweEE0N0NCNTZFLCAweEJGRDRFNDk5LCAweEJGRDlFN0E2LCAweEJBQkZEODdCLCAweEJBMTc3RUFDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEI2MEI3N0I0LCAweEFCQUJDRTYzLCAweEJGRDdFN0EzLCAweDk5QkJENzU2LCAweDExREZFREI4LCAweDAwRkZGRkZGLCAweDAwRkVGRUZDLCAweDNCQkNEOTY1LCAweEIwQzFEQTYzLCAweEJGRDdFNkEwLCAweEI2NjlBQTdGLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEE1NDk5OThCLCAweEJFQ0JFMDdGLCAweEJFQ0ZFMjhDLCAweDVCQjZENTUxLCAweDAxRjdGQUVFLCAweDAwRkZGRkZGLCAweDAyRjZGQUVELCAweDQ3QjVENDUxLCAweEI1QzREQzZDLCAweEJGRDRFNTlCLCAweEI3NTI5RTg5LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJGMDE3MkJDLCAweEEzNzBBRTczLCAweEJGRDNFNDk3LCAweEJGRDNFNDk4LCAweEI1NDg5ODhGLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEEyNzVCMTcyLCAweEJGRDNFNDk4LCAweEI3QzVEQzZGLCAweDMyQzlFMDgxLCAweDNBQjhENjVCLCAweEFGQzBEOTYyLCAweEJGRDdFNkExLCAweEI3NjhBOTgwLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEEyNkFBQjc3LCAweEJGRDJFNDk0LCAweEI5QzdERDc1LCAweDM5QzZERTc5LCAweDAwRkRGRUZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RTZGMUNBLCAweDU5QjRENDRFLCAweEJEQ0FERjdDLCAweEJFQ0ZFMThFLCAweEI1Mzg5MDk4LCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJEMDE3MkJBLCAweEE0ODZCQTZCLCAweEJGRDVFNTlFLCAweEIwQzJEQjY2LCAweDI2Q0NFMjhCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRkRGRUZBLCAweDcxQkFENzU1LCAweEJGRDJFNDkyLCAweEI4QzdERDc0LCAweEI3NTBBMjQ0LCAweEJGMzg5NjQ1LCAweEJGMzk5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEIyNUNBMzQyLCAweEJDQ0FERjdFLCAweEJEQ0VFMThBLCAweDVDQjRENDRFLCAweDA5RTZGMUNBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE2RDlFOUE0LCAweDk2QjlENjUxLCAweEJGRDhFN0EzLCAweEI5OUNDNDU3LCAweEJFM0E5NzQ2LCAweEJGMzg5NjQ1LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEFGNkZBRTQyLCAweEJFQ0ZFMjhBLCAweEJEQ0FERjdELCAweDRCQjRENDUxLCAweDFFQ0ZFMzhELCAweDlGQkJENzU0LCAweEJGRDdFNkEyLCAweEI4OUFDMzU1LCAweEJFMzk5NzQ2LCAweEJGMzg5ODQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEIwNzFCMDQzLCAweEJFQ0ZFMjhCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDAzRjZGQUVDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRUJDLCAweDkwQjlENjRGLCAweEJGRDdFNkExLCAweEJBQUJDRDVDLCAweEJCM0Q5ODQ1LCAweEJGMzk5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzc5NzQ1LCAweEFENjZBQjQzLCAweEJCQ0JERjgwLCAweEJGRDFFMzkwLCAweEJGRDZFNjlGLCAweEI3QjZENTYzLCAweEJFM0M5ODQ1LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEFBNjJBQTQ1LCAweEJCQzhERDc3LCAweEJFRDFFMzkxLCAweDY1QjRENDRELCAweDBBRERFQ0I3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFBRTVGMEJGLCAweDlDQkJENjUzLCAweEJGRDhFN0E0LCAweEI1QTVDQzU3LCAweEJGM0E5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzk5NzQ2LCAweEFCOEJCRDQ3LCAweEJGRDVFNTlBLCAweEJGRDdFNkEyLCAweEJFQzFEQTc1LCAweEJBNDY5QzQ1LCAweEJGMzg5ODQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEI5NENBMDQ1LCAweEI1QzJEQTY5LCAweEJGRDRFNTlBLCAweDc2QjZENDRFLCAweDExREZFREJBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFCREZFREI0LCAweDlEQkJENzU0LCAweEJGRDdFNkEzLCAweEI3QTBDOTU2LCAweEJFM0E5NzQ1LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzg5NzQ2LCAweEE4NzZCMzQ0LCAweEJEQ0VFMThBLCAweEJCQ0FERjdELCAweDQ4QjNEMzUxLCAweDU2QjVENDRELCAweEJFQzlERTdBLCAweEJFRDBFMjhELCAweEIyNjdBRDQ0LCAweEJGMzk5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzk5NzQ2LCAweEJGMzg5NzQ2LCAweEJEM0M5OTQ2LCAweEE4QTNDOTRELCAweEJGRDdFNkEyLCAweEEyQkVEODVDLCAweDIwQkREQTcxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA5RTJFRUI3LCAweDdGQjdENTRDLCAweEJGRDNFNDk5LCAweEJBQjhEMzZCLCAweEJDNDA5QTQ1LCAweEJGMzk5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzk5NzQ2LCAweEJGMzg5NzQ2LCAweEFGNUJBODQ1LCAweEI5QzdERDczLCAweEJGRDJFNDkyLCAweDY4QjRENDRELCAweDBDRDFFNjlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIzRDJFNTk0LCAweEE2QkREODU5LCAweEJGRDdFNkExLCAweEI4OEZCRDRGLCAweEJFMzg5NzQ2LCAweEJGMzk5NzQ2LCAweEJGMzg5NzQ2LCAweEJGMzk5NzQ2LCAweEJGMzg5NzQ2LCAweEE5ODFCNjQzLCAweEJGRDFFMzkxLCAweEJBQzdERDc0LCAweDNCQjVENTU4LCAweDAyRkFGREY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkVBRjRFQywgMHg2NzU3QTc2OSwgMHhCQzNDOUE0NiwgMHhCRjRDQTU0NywgMHhCRjU4QUU0NywgMHhCRjVGQjU0NywgMHhCRjY0QkE0NiwgMHhCRjY1QkM0NywgMHhCRjYzQkM0NiwgMHhCRjYzQkM0NywgMHhCRjYyQkI0NywgMHhCRjYxQkI0NywgMHhCRjY2QkM0OCwgMHhCRjk3Q0I0OSwgMHhCRkQyRTM5NCwgMHhCRkJFRDg3QywgMHhCRjE2N0VBQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBOTMzOEQ5QSwgMHhCOUM3REQ3NSwgMHhCRkQzRTQ5NSwgMHg2QkI4RDY1MiwgMHgwM0ZBRkNGMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgzMEMxREM3MiwgMHhBOEJFRDk1QiwgMHhCRkQ3RTdBMywgMHhCNzdEQjU3OSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQzA0NzNCOSwgMHhBNjkyQzE2OCwgMHhCRkQ3RTdBMiwgMHhCRkQ5RThBNiwgMHhCQUE5Q0Q3NiwgMHhCQjA3NzZCNywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCMDFGODNBNywgMHhCM0JERDg2OCwgMHhCRkQ2RTY5RiwgMHg4NEI4RDY1MCwgMHgwOEU4RjJDRCwgMHgwMEZGRkZGRiwgMHgwM0VERjVEOSwgMHg0RkI1RDU0RiwgMHhCOEM3REQ3MywgMHhCRkQzRTQ5NiwgMHhCNTQ0OTY5MSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhBMzYyQTc3QiwgMHhCRkQxRTM5MSwgMHhCQ0M5REY3OSwgMHg0MEM3REY3OSwgMHgwMEZFRkZGRSwgMHgwMEZGRkZGRiwgMHgwNUU2RjFDQSwgMHg1QkI1RDU0RSwgMHhCRENBREY3RCwgMHhCRkNGRTI4RCwgMHhCNjM2OEY5OCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRTAyNzNCQiwgMHhBNDg4QkI2QSwgMHhCRkQ4RTdBNSwgMHhCRUNERTE4NywgMHhCODJCODlBMCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRDAxNzJCQiwgMHhBNTk5QzU2MiwgMHhCRkQ3RTZBMSwgMHhBQkMwREE2MCwgMHgyMUJDRDk2OSwgMHg0REI2RDU1MywgMHhCOUM3REQ3MiwgMHhCRkQzRTQ5NiwgMHhCNTQ3OTg4RiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhBMzhFQkU2NiwgMHhCRkQ2RTY5RiwgMHhCMEMyREE2NSwgMHgyNUNERTM4RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQ0RFRUNCNywgMHg2RkI1RDQ0QSwgMHhCRUQwRTM4RiwgMHhCREM3REU3RCwgMHhCODFBODBBQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQzA1NzRCOCwgMHhBOEE4Q0Q2MCwgMHhCRkQ3RTdBMywgMHhBMkJERDg1QSwgMHgxNUQ1RTdBMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkZERkVGQSwgMHg3MUJBRDc1NSwgMHhCRkQyRTQ5MywgMHhCOUM3REQ3NCwgMHhCODRGQTM0NSwgMHhCRjM3OTc0NiwgMHhCRjM4OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCMjVCQTM0MiwgMHhCQ0NCRTA3RSwgMHhCRENFRTI4QSwgMHg1REI0RDQ0RSwgMHgwOUU2RjFDQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNkQ5RTlBNSwgMHg5NkJBRDY1MSwgMHhCRkQ4RTdBMywgMHhCQTlDQzQ1NywgMHhCRjM5OTc0NiwgMHhCRjM3OTY0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhBRjZFQUU0MywgMHhCRUNGRTI4QiwgMHhCRENBREY3RCwgMHg0QkI0RDQ1MiwgMHgxRUNGRTM4RCwgMHg5RkJDRDc1NCwgMHhCRkQ3RTZBMiwgMHhCODk5QzM1NSwgMHhCRTM4OTc0NSwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCMDcxQjA0NCwgMHhCRUNGRTI4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwNEY3RkJFRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUZCQywgMHg5MUJBRDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFCQ0Q1QiwgMHhCQzNCOTg0NSwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhBRDY1QUE0MywgMHhCQkNCRTA4MCwgMHhCRkQyRTQ5MywgMHhCRkQ3RTZBMywgMHhCOEExQzg1QSwgMHhCRTM4OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTY0NiwgMHhBOTcxQjI0NSwgMHhCRUNERTE4NSwgMHhCRUNERTE4NCwgMHg1NUI0RDQ0RiwgMHgwNkU0RjBDNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMUU2RjFDMiwgMHg4REI4RDU0RCwgMHhCRkQ3RTZBMCwgMHhCQkIwRDE2MiwgMHhCQzNFOTk0NiwgMHhCRjM3OTY0NSwgMHhCRjM3OTc0NywgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NywgMHhBODdFQjk0NSwgMHhCRkQyRTQ5MSwgMHhCRkQ5RThBOCwgMHhCRUMxREE3NiwgMHhCQTQ1OUM0NSwgMHhCRjM4OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCOTRDQTA0NSwgMHhCNUMyREI2OSwgMHhCRkQ0RTU5QSwgMHg3NkI2RDU0RSwgMHgxMURGRURCQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQ0UwRURCNCwgMHg5REJCRDc1NCwgMHhCRkQ3RTdBMywgMHhCN0EwQzk1NiwgMHhCRTM5OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhBODc1QjQ0NCwgMHhCRENFRTE4QSwgMHhCQkNBREY3RCwgMHg0OEIzRDQ1MSwgMHg1NkI1RDQ0RSwgMHhCRUNBREY3QSwgMHhCRUQwRTI4RCwgMHhCMjY2QUQ0NCwgMHhCRjM3OTc0NywgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTY0NiwgMHhCRDNCOTg0NiwgMHhBOUEzQzk0RSwgMHhCRkQ3RTdBMiwgMHhBMkJFRDg1QywgMHgyMUJFREI3MSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUUzRUVCNywgMHg3RkI4RDY0QywgMHhCRkQ0RTU5OSwgMHhCQUI4RDQ2QiwgMHhCQzQwOUE0NSwgMHhCRjM4OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTY0NiwgMHhBRjVBQTg0NSwgMHhCOUM3REQ3NCwgMHhCRkQyRTQ5MiwgMHg2OEI1RDQ0RCwgMHgwREQxRTY5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNEQyRTU5NSwgMHhBN0JFRDg1OSwgMHhCRkQ3RTZBMSwgMHhCODhGQkQ0RiwgMHhCRjM3OTY0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhCRjM3OTc0NiwgMHhBOTgxQjY0NCwgMHhCRkQxRTM5MSwgMHhCQUM3REU3NSwgMHgzQkI1RDU1OCwgMHgwMkZCRkRGNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDVFQUY0RUQsIDB4NUU1NEE2NjksIDB4QkIzOTlBNDYsIDB4QkY0QUE0NDYsIDB4QkY1NkFENDcsIDB4QkY1Q0IzNDYsIDB4QkY2MUJBNDcsIDB4QkY2MkJCNDYsIDB4QkY2MUJCNDcsIDB4QkY1RkJCNDcsIDB4QkY1RUJCNDcsIDB4QkY2OUJFNDksIDB4QkZBMENFNEMsIDB4QkZENUU1OUYsIDB4QkZBRUQwNzAsIDB4QkYwNTc0QjcsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QUM0QzlDODQsIDB4QkVDQ0UwODIsIDB4QkRDRUUxODcsIDB4NTJCNkQ1NTMsIDB4MDFGQkZERjYsIDB4MDBGRUZFRkUsIDB4MDdEREVDQjcsIDB4NTBCNUQ0NTAsIDB4QjZDNURDNkYsIDB4QkVENEU1OUIsIDB4QjY1NTlGOEEsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjkwQjc3QjMsIDB4QUFCMkQyNjAsIDB4QkZEOEU3QTUsIDB4QkZEOUU4QTYsIDB4QjY5M0MxNzMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QTkyRDhBOUMsIDB4QjdDNkRENzEsIDB4QkZEM0U0OTYsIDB4NzNCOEQ2NTAsIDB4MDVFOEYyRDAsIDB4MDJGNEY5RTcsIDB4MTZENUU3QTQsIDB4NzVCNUQ0NEEsIDB4QkRDRUUxODgsIDB4QkRDQURGODgsIDB4QjgyQTg4OUYsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QTM4NEI5NjksIDB4QkZENUU1OUIsIDB4QjRDM0RCNkEsIDB4MzBDMkRDNzQsIDB4MDFGN0ZBRUUsIDB4MDFGNkZBRUMsIDB4MTdDOUUwOEEsIDB4N0RCNkQ0NEEsIDB4QkVEMUUzOTIsIDB4QkVDNUREN0QsIDB4QjgxNzdFQUMsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkIwNjc1QjcsIDB4QThBQUNFNUYsIDB4QkZEQkU5QUYsIDB4QkFCRUQ4N0MsIDB4QkExNzdFQUIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjYwQzc4QjQsIDB4QUNBOUNENjMsIDB4QkZEN0U3QTMsIDB4OTlCQ0Q3NTYsIDB4MUFDQkUxOEMsIDB4NjNCNUQ0NEIsIDB4QkNDQ0UwODQsIDB4QkVDRUUxODYsIDB4QjcyOTg4QTAsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjkwNzc1QjcsIDB4QThBNUNCNjEsIDB4QkZEOEU3QTMsIDB4QTBCQ0Q3NTgsIDB4MTZEM0U2OUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTVEN0U5QTksIDB4ODRCNkQ1NEIsIDB4QkZENUU1OUIsIDB4QjdCNUQ0NzUsIDB4QkQwQzc4QjMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QjIxMzdCQUYsIDB4QUZCN0Q0NjQsIDB4QkZEN0U2QTIsIDB4OEVCOUQ2NTEsIDB4MEJFNEVGQzMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGREZFRkEsIDB4NzFCQUQ3NTUsIDB4QkZEMkUzOTIsIDB4QjhDN0RENzQsIDB4Qjg0RUEyNDQsIDB4QkYzNjk2NDYsIDB4QkYzNTk3NDYsIDB4QkYzNTk2NDYsIDB4QkYzNTk2NDYsIDB4QjI1QUEzNDIsIDB4QkJDQURGN0MsIDB4QkRDRkUyOEQsIDB4NjdCNUQ0NEQsIDB4MENERkVEQkMsIDB4MDBGRkZGRkUsIDB4MDBGQkZDRjUsIDB4MUVEMkU1OTEsIDB4OTlCQUQ2NTEsIDB4QkZEN0U3QTMsIDB4Qjk5QkMzNTcsIDB4QkUzNzk3NDYsIDB4QkYzNjk2NDYsIDB4QkYzNjk2NDYsIDB4QkYzNTk2NDYsIDB4QkYzNjk2NDYsIDB4QUY2REFFNDIsIDB4QkVDRkUyOEEsIDB4QkRDQURGN0MsIDB4NEJCNEQ1NTIsIDB4MUVDRkUzOEQsIDB4OUZCQkQ3NTQsIDB4QkZEN0U2QTIsIDB4Qjg5OUMyNTUsIDB4QkUzNjk2NDUsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDUsIDB4QkYzNjk2NDYsIDB4QkYzNTk2NDYsIDB4QjA3MEFGNDMsIDB4QkVDRkUxOEEsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDNGNkZBRUMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VGQkMsIDB4OTBCOUQ2NEYsIDB4QkZENkU2QTEsIDB4QkFBQkNENUIsIDB4QkIzQTk3NDUsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDYsIDB4QkYzNjk3NDYsIDB4QkYzNTk3NDYsIDB4QUM2NEE5NDMsIDB4QkFDQkRGODAsIDB4QkZENEU1OTgsIDB4QkZEN0U3QTMsIDB4QkE5MUMwNTEsIDB4QkUzNjk2NDUsIDB4QkYzNjk3NDYsIDB4QkYzNjk2NDYsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDUsIDB4QUE3Q0I2NDUsIDB4QkVEMUUzOTIsIDB4QkJDOERFNzYsIDB4NDJCNEQ0NTQsIDB4MDNGOEZCRUYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDhFQUYzQ0YsIDB4N0RCN0Q1NEMsIDB4QkZENEU0OTgsIDB4QjhCRUQ4NkYsIDB4QkE0NTlENDUsIDB4QkYzNjk2NDYsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDYsIDB4QkYzNjk3NDYsIDB4QUM2OUFENDQsIDB4QkRDREUxODYsIDB4QkZEQUU4QUEsIDB4QkVDMURBNzUsIDB4QkE0NDlDNDUsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDYsIDB4QkYzNjk2NDYsIDB4QkYzNjk2NDYsIDB4Qjg0QTlGNDUsIDB4QjVDMkRBNjksIDB4QkZENEU1OUEsIDB4NzZCNkQ0NEUsIDB4MTFERUVEQkEsIDB4MDBGRUZFRkUsIDB4MDBGREZFRjksIDB4MjNDRUUyODcsIDB4QTJCQ0Q3NTYsIDB4QkZEN0U3QTMsIDB4Qjc5REM4NTUsIDB4QkUzNzk3NDYsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDUsIDB4QkYzNTk2NDYsIDB4QkYzNTk2NDUsIDB4QTg3NUIzNDQsIDB4QkRDRkUxOEIsIDB4QkJDQURGN0QsIDB4NDhCM0QzNTEsIDB4NTZCNEQ0NEQsIDB4QkVDOURFN0EsIDB4QkVEMEUyOEQsIDB4QjI2NUFENDQsIDB4QkYzNjk2NDYsIDB4QkYzNTk2NDUsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDYsIDB4QkQzOTk4NDYsIDB4QThBM0M4NEQsIDB4QkZEN0U3QTIsIDB4QTJCRUQ4NUMsIDB4MjBCRERBNzAsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MDBGRkZGRkUsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MDBGRkZGRkUsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MDBGRkZGRkUsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDlFM0VFQjcsIDB4N0ZCN0Q1NEMsIDB4QkZEM0U0OTksIDB4QkFCN0Q0NkIsIDB4QkMzRTk5NDUsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDYsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDYsIDB4QUY1OUE3NDUsIDB4QjlDN0RENzQsIDB4QkZEMkUzOTIsIDB4NjhCNUQ0NEQsIDB4MENEMUU2OUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjNEMkU1OTUsIDB4QTZCREQ4NTksIDB4QkZEN0U2QTIsIDB4Qjg4RUJENTAsIDB4QkUzNTk2NDYsIDB4QkYzNTk2NDYsIDB4QkYzNTk2NDYsIDB4QkYzNjk3NDYsIDB4QkYzNTk2NDYsIDB4QUQ3OUI0NDQsIDB4QkVEMEUyOEYsIDB4QkJDOURGN0EsIDB4NTRCNUQ0NTAsIDB4MTREOUU5QTksIDB4MDhFRUY1RDgsIDB4MDRGMUY3REYsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRUJGNEVELCAweDU3NTVBNzZCLCAweEI5Mzc5OTQ2LCAweEJGNDdBNDQ3LCAweEJGNTNBQzQ3LCAweEJGNUJCNDQ3LCAweEJGNUZCOTQ3LCAweEJGNjBCQjQ3LCAweEJGNUVCQTQ3LCAweEJGNURCQjQ3LCAweEJGNkJCRjQ5LCAweEJGQTdEMTUxLCAweEJGRDdFNkEyLCAweEJGQTNDQzY5LCAweEJGMDE3MkJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJEM0M5NTg2LCAweEJFQzhERTdCLCAweEJGRDNFNDk1LCAweDdFQjdENTRELCAweDI3Q0NFMzhDLCAweDI1QzdERjgyLCAweDVBQjZENTUwLCAweEE2QkREODU5LCAweEJGRDZFNjlGLCAweEJEQkVEODgxLCAweEJDMUI4MEFCLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEFDMkQ4QTlFLCAweEI4QzNEQzZGLCAweEJGRDdFNkEzLCAweEJGRDhFN0E0LCAweEIwODVCQTc0LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEFDMjM4NUE0LCAweEIxQkREODY1LCAweEJGRDhFN0E0LCAweEFFQzFEQTYyLCAweDZDQjhENjUzLCAweDVEQjhENjU1LCAweDg5QjhENTRELCAweEI4QzdERDcyLCAweEJGRDhFN0E1LCAweEJDOUFDNTdDLCAweEJEMDU3NEI4LCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweDlFNzVCMTcxLCAweEJGRDFFMzkwLCAweEJFQ0ZFMjhDLCAweDk1QkFENzUzLCAweDVDQjlENzU5LCAweDUwQjhENzU5LCAweDgwQjZENTRCLCAweEI4QzdERDcyLCAweEJGRDhFN0E1LCAweEJCOENCRTdELCAweEJFMDQ3M0I5LCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEFFMjQ4NUE0LCAweEI0QkREODZBLCAweEJGRERFQkI0LCAweEJBQUFDRTc1LCAweEJCMDc3NUI4LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEIwMUU4MkE3LCAweEIzQkVEOTY3LCAweEJGRDZFNjlGLCAweDg1QjhENjUwLCAweDE3QkVEQTczLCAweDc4QjZENTRCLCAweEJGRDJFNDk0LCAweEJCQzBEOTdDLCAweEJBMTc3RUFCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEIyMTg3RkFDLCAweEIwQjZENDY1LCAweEJGRDdFN0EyLCAweDhDQjlENjUxLCAweDBDRThGMkNCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIyQzNERDdBLCAweDk2QjlENjUwLCAweEJGRDhFN0EyLCAweEI4OThDMzc2LCAweEJEMDQ3NEJBLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEFBMkU4QTlELCAweEI5QzNEQjZGLCAweEJGRDRFNTlBLCAweDc1QjdENTRFLCAweDA0RUZGNkRELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRkRGRUZBLCAweDZFQkFENzU0LCAweEJGRDBFMzhFLCAweEJBQzlERTdCLCAweEI5NEVBMjQ0LCAweEJGMzQ5NjQ2LCAweEJGMzQ5NjQ2LCAweEJGMzQ5NjQ2LCAweEJGMzU5NjQ2LCAweEI1NEE5RTQ0LCAweEI1QkVEODY2LCAweEJGRDdFNkEzLCAweEFCQkZEOTVELCAweDVEQjhENjUzLCAweDM1QkZEQTY2LCAweDQ4QkREOTVDLCAweDdEQjdENTRBLCAweEI4QzdERDcyLCAweEJGRDdFN0EyLCAweEI5ODlCQzRFLCAweEJGMzY5NzQ2LCAweEJGMzQ5NjQ2LCAweEJGMzU5NzQ2LCAweEJGMzU5NjQ2LCAweEJGMzU5NzQ3LCAweEFDNzNCMDQzLCAweEJFRDBFMzhFLCAweEJEQzlERjdCLCAweDQ3QjRENTUzLCAweDFFQ0ZFMzhELCAweDlGQkJENzU0LCAweEJGRDdFN0EyLCAweEI4OTlDMzU1LCAweEJFMzY5NjQ2LCAweEJGMzU5NzQ2LCAweEJGMzQ5NjQ2LCAweEJGMzQ5NjQ3LCAweEJGMzQ5NjQ2LCAweEIwNzBCMDQ0LCAweEJFQ0ZFMjhCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDA0RjZGQUVELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRkJDLCAweDkwQjlENjRGLCAweEJGRDdFNkExLCAweEJBQUJDRDVDLCAweEJDM0E5NzQ2LCAweEJGMzU5NjQ3LCAweEJGMzQ5NjQ2LCAweEJGMzU5NzQ2LCAweEJGMzQ5NjQ2LCAweEFENjRBOTQzLCAweEJCQ0JFMDgwLCAweEJGRDVFNjlCLCAweEJGRDZFNjlGLCAweEI2ODNCQzRDLCAweEJGMzQ5NjQ2LCAweEJGMzU5NzQ3LCAweEJGMzU5NjQ2LCAweEJGMzU5NzQ2LCAweEJGMzQ5NjQ2LCAweEE3OEZDMTQ5LCAweEJGRDVFNTlDLCAweEI0QzREQzZBLCAweDM0QjNENDU2LCAweDAyRjhGQkVGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRkNGRUY4LCAweDZDQjlENjUyLCAweEJFRDBFMzhFLCAweEJCQzlERjdCLCAweEJCNEVBMjQ1LCAweEJGMzU5NjQ2LCAweEJGMzU5NjQ2LCAweEJGMzQ5NjQ2LCAweEJGMzU5NzQ2LCAweEIxNUNBNzQ0LCAweEJBQzlERjdBLCAweEJGREFFOUFELCAweEJFQzFEQjc2LCAweEJBNDM5QzQ1LCAweEJGMzU5NjQ2LCAweEJGMzQ5NjQ2LCAweEJGMzU5NjQ3LCAweEJGMzQ5NjQ2LCAweEI5NEE5RjQ1LCAweEI1QzJEQjY5LCAweEJGRDVFNTlBLCAweDg5QjdENTRCLCAweDVBQkJEODU5LCAweDU2QkZEQTYxLCAweDU3QkVEQTVGLCAweDdBQjdENTQ5LCAweEJBQzlERTc3LCAweEJGRDVFNTlDLCAweEI4N0RCODRCLCAweEJGMzQ5NjQ2LCAweEJGMzU5NjQ2LCAweEJGMzU5NjQ2LCAweEJGMzU5NzQ3LCAweEJGMzQ5NjQ2LCAweEE4N0NCNzQ2LCAweEJFRDFFMzkyLCAweEJBQzlERjc4LCAweDQ0QjNENDUxLCAweDU2QjVENDRFLCAweEJFQzlERjdBLCAweEJFRDBFMzhELCAweEIyNjRBRDQ1LCAweEJGMzU5NjQ2LCAweEJGMzQ5NjQ2LCAweEJGMzU5NjQ2LCAweEJGMzU5NjQ2LCAweEJEMzg5ODQ2LCAweEE4QTNDOTRFLCAweEJGRDdFN0EzLCAweEE2QkVEODVCLCAweDUzQjZENTUwLCAweDQ5QkZEOTYxLCAweDQ5QkZEQTYyLCAweDQ5QkZEQTYxLCAweDQ5QkZEQTYyLCAweDQ5QkVEOTYxLCAweDQ5QkZEQTYyLCAweDQ5QkZEQTYxLCAweDQ5QkZEQTYyLCAweDQ5QkVEOTYxLCAweDQ5QkZEQTYyLCAweDQ5QkZEQTYxLCAweDQ5QkZEQTYyLCAweDM4QzJEQzZGLCAweDBDRTVGMUM1LCAweDBBRTNFRUI3LCAweDdGQjdENTRDLCAweEJGRDRFNTk5LCAweEJBQjhENDZCLCAweEJDM0Q5OTQ1LCAweEJGMzU5NjQ2LCAweEJGMzU5NjQ2LCAweEJGMzU5NzQ3LCAweEJGMzQ5NjQ2LCAweEFGNThBNzQ1LCAweEI5QzdERDc0LCAweEJGRDJFNDkyLCAweDY5QjVENDRELCAweDBDRDJFNjlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFFRDNFNjk1LCAweEEwQkNEODU2LCAweEJGRDdFN0E0LCAweEI3OTdDMjU0LCAweEJGMzU5NjQ2LCAweEJGMzU5NzQ2LCAweEJGMzU5NjQ2LCAweEJGMzU5NzQ3LCAweEJGMzQ5NjQ2LCAweEIyNTdBNDQ0LCAweEJBQzZEQzc0LCAweEJGRDdFN0EyLCAweEIxQzJEQTY1LCAweDkwQjlENjRFLCAweDdBQjZENDRBLCAweDY5QjdENjRGLCAweDI1Q0NFMjhCLCAweDAyRjdGQkVELCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkVCRjVFRSwgMHg0RDU0QTc2QiwgMHhCNzMzOTg0NywgMHhCRjQzQTE0NywgMHhCRjUwQUI0OCwgMHhCRjU3QjI0NywgMHhCRjVDQjg0NywgMHhCRjVDQkE0NywgMHhCRjVCQkE0NywgMHhCRjZBQkU0OSwgMHhCRkE3RDE1MSwgMHhCRkQ3RTZBMSwgMHhCRkE0Q0M2OCwgMHhCRjAyNzJCQSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjE0N0VBOCwgMHhCREEzQ0I1QywgMHhCRkQ3RTZBMCwgMHhCRENGRTI4QiwgMHhCM0MyREI2NiwgMHhCMEMxREE2MywgMHhCQkNBREY3RCwgMHhCRkQ3RTZBMiwgMHhCRkNCRTA4RSwgMHhCQzREOUI5MSwgMHhCRjAxNzJCQiwgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAxNzJCQiwgMHhBNzZEQUM3NiwgMHhCRkQyRTQ5MywgMHhCRkQwRTI4RSwgMHhCRkQ4RTdBMywgMHhCMDhGQkY2RSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQzAzNzNCQSwgMHg5RTdCQjQ2RiwgMHhCQ0NCREY3RiwgMHhCRkQ4RTdBNSwgMHhCRkQyRTQ5MywgMHhCRkNGRTI4QywgMHhCRkQ1RTU5QywgMHhCRkQ3RTdBMSwgMHhCREFDQ0U3RSwgMHhCQzIyODRBNywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBQzI1ODVBMywgMHhBQUIwRDE2MCwgMHhCRUQzRTQ5OCwgMHhCRkQ3RTdBMiwgMHhCRUNGRTI4QiwgMHhCQ0NDRTA4MiwgMHhCRkQzRTQ5NiwgMHhCRkQ4RTdBNCwgMHhCREFDQ0U3RSwgMHhCRDFEODFBQSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQiwgMHhCRTAwNzFCQiwgMHhBNzVFQTU3RiwgMHhCRENGRTI4QiwgMHhCRkRCRTlBRSwgMHhCNjkxQzA3NCwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBODMzOEQ5OSwgMHhCOEM4REQ3NSwgMHhCRkQyRTQ5NCwgMHg2Q0I4RDY1MiwgMHgxQ0JDRDk2RSwgMHg4Q0I4RDU0RCwgMHhCRkQ2RTY5RSwgMHhCQUFBQ0U3NiwgMHhCQTA3NzVCNywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBQzJDODk5RiwgMHhCNkM1REM2RiwgMHhCRkQ0RTU5OSwgMHg3NEI3RDU0RSwgMHgwNEVBRjNEMiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkVGQiwgMHgyRkMyREM3MywgMHhBN0JERDg1QSwgMHhCRkQ4RTdBMywgMHhCNjdFQjU3OCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhBNjQ1OTc4RCwgMHhCQ0NCRTA4MCwgMHhCRkNGRTE4QSwgMHg1QkJBRDg1QSwgMHgwMUY3RkFFRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkZERkVGQSwgMHg1QkI5RDY1NCwgMHhCQ0NDRTA4MiwgMHhCRUNFRTE4OSwgMHhCODVCQTU0NCwgMHhCRjMzOTU0NiwgMHhCRjMzOTY0NiwgMHhCRjMzOTY0NiwgMHhCRjMzOTY0NiwgMHhCRTM0OTU0NSwgMHhBRjdGQjc0NywgMHhCRENERTA4NSwgMHhCRkQ3RTdBNCwgMHhCQUNBREY3RCwgMHhCM0MzREI2OSwgMHhCN0M3REQ3MywgMHhCRkQxRTM5MSwgMHhCRkQ3RTZBNCwgMHhCREJDRDc2RSwgMHhCQjRCOUY0NCwgMHhCRjMzOTY0NiwgMHhCRjMzOTU0NiwgMHhCRjM0OTY0NiwgMHhCRjMzOTY0NiwgMHhCRjM0OTY0NiwgMHhBNzhCQkQ0NiwgMHhCRkQ0RTU5QSwgMHhCNUM1REM2RSwgMHgzQUIzRDQ1NCwgMHgxQ0NGRTM4RCwgMHg5RkJDRDc1NCwgMHhCRkQ3RTZBMiwgMHhCODk4QzI1NSwgMHhCRTM0OTU0NSwgMHhCRjMzOTY0NiwgMHhCRjMzOTU0NiwgMHhCRjMzOTY0NiwgMHhCRjMzOTU0NSwgMHhCMDZGQUY0MywgMHhCRUNGRTI4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwM0Y2RkFFQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUVCQywgMHg5MEI5RDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFCQ0Q1QiwgMHhCQjM4OTc0NSwgMHhCRjMzOTY0NiwgMHhCRjMyOTY0NiwgMHhCRjMzOTY0NiwgMHhCRjMzOTU0NiwgMHhBRDYzQTk0MywgMHhCQkNCRTA4MCwgMHhCRkQ3RTdBMCwgMHhCRkQzRTQ5NywgMHhCNzZDQUY0OCwgMHhCRjMzOTY0NiwgMHhCRjM0OTY0NiwgMHhCRjMzOTU0NiwgMHhCRjMzOTY0NiwgMHhCRTM1OTY0NiwgMHhBOTlGQzg0QywgMHhCRkQ2RTZBMSwgMHhBQUMwREE2MCwgMHgyOUI1RDU1RCwgMHgwMUY5RkJGMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkZDRkRGOCwgMHg1OEI4RDY1MiwgMHhCQ0NDRTA4MSwgMHhCRkNFRTE4OCwgMHhCNzVBQTY0NiwgMHhCRjMzOTU0NiwgMHhCRjM0OTY0NiwgMHhCRjMzOTU0NiwgMHhCRjMzOTY0NiwgMHhCMDUwQTM0NSwgMHhCN0M0REM2RCwgMHhCRkRCRTlBRiwgMHhCRUMxREE3NSwgMHhCQTQyOUI0NSwgMHhCRjMzOTY0NiwgMHhCRjMyOTU0NiwgMHhCRjM0OTY0NiwgMHhCRjMzOTU0NSwgMHhCOTQ5OUU0NSwgMHhCNUMyREI2OSwgMHhCRkQ4RTdBNCwgMHhCQ0NDRTA4MSwgMHhCQ0NCRTA4MSwgMHhCQkNCRTA4MCwgMHhCQ0NCRTA4MSwgMHhCRUQwRTI4RSwgMHhCRkQ4RTdBNSwgMHhCQkI4RDU2QSwgMHhCQzQ2OUQ0NSwgMHhCRjMzOTU0NiwgMHhCRjMzOTY0NiwgMHhCRjMzOTY0NiwgMHhCRjMzOTY0NiwgMHhCRTM0OTY0NSwgMHhBOTkxQzE0OCwgMHhCRkQ1RTU5QiwgMHhCM0M0REM2QywgMHgzN0I0RDQ1NywgMHg1NEI3RDY1MiwgMHhCRUM5REY3QSwgMHhCRUQwRTI4RCwgMHhCMjYzQUM0NCwgMHhCRjMzOTY0NiwgMHhCRjMyOTU0NiwgMHhCRjMzOTY0NiwgMHhCRjMyOTY0NiwgMHhCRDM3OTg0NiwgMHhBOEEyQzg0RCwgMHhCRkQ3RTdBMywgMHhCRENBREY3RCwgMHhCOEM3REQ3NCwgMHhCOEM3REQ3MywgMHhCOEM3REU3NCwgMHhCOEM2REQ3MywgMHhCOEM3REU3NCwgMHhCOEM3REQ3MywgMHhCOEM3REU3NCwgMHhCOEM3REQ3MywgMHhCOEM3REU3NCwgMHhCOEM3REQ3MywgMHhCOEM3REQ3MywgMHhCOEM2REQ3MywgMHhCOEM3REU3NCwgMHhBQ0JFRDk1QywgMHg0MEI0RDU1NSwgMHgwQ0QzRTU5NSwgMHg3RkI3RDU0QywgMHhCRkQzRTQ5OSwgMHhCQUI3RDM2QSwgMHhCQzNCOTg0NSwgMHhCRjMzOTY0NiwgMHhCRjMzOTU0NiwgMHhCRjMzOTY0NiwgMHhCRjMyOTU0NiwgMHhBRjU3QTc0NSwgMHhCOUM3REQ3NCwgMHhCRkQyRTQ5MiwgMHg2OEI0RDQ0RCwgMHgwQ0QxRTY5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNURGRUNCMywgMHg5N0JBRDc1MSwgMHhCRkQ3RTdBMiwgMHhCNkFEQ0Y1QywgMHhCRTM1OTU0NSwgMHhCRjMzOTY0NiwgMHhCRjMzOTY0NiwgMHhCRjMzOTY0NiwgMHhCRjMzOTU0NiwgMHhCRTM2OTc0NiwgMHhCMDgyQjg0OCwgMHhCREM5REU3RSwgMHhCRkQ3RTZBMiwgMHhCRkQ3RTZBMCwgMHhCRkQzRTQ5NywgMHhCRUNERTE4MywgMHg4QkI4RDU0RSwgMHgyRUJBRDg2NCwgMHgwMkVGRjZERSwgCisJCTB4MDBGRUZFRkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFFRkY3RjEsIDB4NDU4QUM0OUMsIDB4QjQzMDk3NDcsIDB4QkY0M0EzNEMsIDB4QkY1MUFENTQsIDB4QkY1NUIzNDksIDB4QkY1OUI3NDcsIDB4QkY1QUJBNDgsIDB4QkY2NkJENDksIDB4QkY5RkNGNEQsIDB4QkZENkU2OUYsIDB4QkZCNEQ0NkQsIDB4QkYxMTdDQUQsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMTcyQkMsIDB4QkEzMzhGOEUsIDB4QjJBQ0NGNjMsIDB4QkVDRUUxOEEsIDB4QkZENkU2OUUsIDB4QkZENkU2OUYsIDB4QkZEMUUzOTIsIDB4QkNBQ0NGN0MsIDB4QkQ0Mjk1OTgsIDB4QkYwMTcyQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QjMxRTgyQTgsIDB4QjJCNUQzNjgsIDB4QkZEOEU3QTUsIDB4QkVDMkRCNjcsIDB4QkZEOEU3QTMsIDB4QjNBOUNENkMsIDB4QjgwQjc4QjUsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjkwQTc3QjUsIDB4QTU2MUE2N0UsIDB4QjFBRENGNjgsIDB4QkFDM0RCN0EsIDB4QkNDNERDODAsIDB4QkNCMkQyNzksIDB4QkI2REFEODYsIDB4QkQxNDdDQUUsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcyQkMsIDB4QUYyNDg1QTQsIDB4QTc4M0I5NkUsIDB4QjZCN0Q1NkUsIDB4QkJDOURGN0YsIDB4QkRDREUxODcsIDB4QkRCQ0Q3N0UsIDB4QkM3QkI0ODIsIDB4QkQxNjdEQUUsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QjYxNDdDQUUsIDB4QUZBRENGNjUsIDB4QkZEOUU4QTcsIDB4QkZEOEU3QTQsIDB4QjU2RUFEN0YsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTU1NDlGODQsIDB4QkVDRUUxODYsIDB4QkNDREUwODYsIDB4NTJCOEQ2NTgsIDB4MjdDN0RGODEsIDB4OUVCQkQ3NTQsIDB4QkZEOEU3QTMsIDB4QjY5M0MxNzQsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QTY0Nzk4OEMsIDB4QkNDQkUwODAsIDB4QkVDRkUyOEIsIDB4NUFCQUQ3NTgsIDB4MDFGREZFRkIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGNEY5RTgsIDB4NDJCNEQ0NTEsIDB4QjJDM0RCNjgsIDB4QkZENkU2OUUsIDB4QjU1QUEyODcsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QTQ2NUE4N0EsIDB4QkZEMUUzOTEsIDB4QkFDOURFNzksIDB4NDFCRkRCNkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZGRkMsIDB4M0NDNERENzIsIDB4QjVDNERDNkEsIDB4QkZENkU2OUUsIDB4QjY4M0I5NEIsIDB4QkYzMTk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkUzNzk3NDYsIDB4QjQ3N0IzNDcsIDB4QkJCQ0Q3NkMsIDB4QkVEMUUzOTEsIDB4QkZENUU2OUIsIDB4QkZEM0U0OTYsIDB4QkRDOERFN0YsIDB4QkE5RUM2NTgsIDB4QkM1MEExNDUsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMTk1NDYsIDB4QkEzQzk5NDUsIDB4QURBRENFNTQsIDB4QkZEOEU4QTUsIDB4QTRCRUQ4NUMsIDB4MjZCQUQ4NjgsIDB4MUFEM0U2OTYsIDB4OUZCQ0Q4NTUsIDB4QkZEN0U3QTIsIDB4Qjg5OEMyNTUsIDB4QkUzMzk1NDYsIDB4QkYzMjk2NDcsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMTk1NDYsIDB4QjA2RkFGNDMsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDRGNkZBRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VGQkMsIDB4OTFCOUQ2NEYsIDB4QkZEN0U3QTEsIDB4QkFBQkNENUMsIDB4QkMzNzk2NDUsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMTk1NDYsIDB4QUQ2MkE5NDMsIDB4QkJDQkRGODAsIDB4QkZEOUU4QTUsIDB4QkVEMEUyOEQsIDB4QkI1REE4NDUsIDB4QkYzMTk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkIzODk3NDYsIDB4QUVBOENDNTMsIDB4QkZEN0U3QTMsIDB4OUVCREQ4NTksIDB4MUZDNkRGODQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkIsIDB4NDNDMkRDNkMsIDB4QkFDN0RFNzMsIDB4QkZEMkU0OTUsIDB4QjQ2RUIxNDcsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QjY0MTlCNDUsIDB4QjVCOEQ1NjEsIDB4QkZEQkU5QjAsIDB4QkVDMURBNzUsIDB4QkE0MTlCNDUsIDB4QkYzMzk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QjU0NzlFNDYsIDB4QTVCQkQ3NTcsIDB4QkRDREUxODYsIDB4QkRDREUxODcsIDB4QkRDRUUxODcsIDB4QkRDREUxODcsIDB4QkRDREUxODcsIDB4QkNDOEREN0UsIDB4QkJBNkNDNUQsIDB4QkE1NEE0NDYsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkMzOTk3NDUsIDB4QUJBRUQwNTUsIDB4QkZEOEU3QTQsIDB4QTNCRUQ5NUIsIDB4MjRCRERBNkUsIDB4NTNDNURFNzAsIDB4QkVDQURGN0EsIDB4QkVEMEUzOEQsIDB4QjI2MkFDNDQsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMTk1NDYsIDB4QkQzNjk3NDYsIDB4OUNBMEM3NDksIDB4QkZDRUUxODcsIDB4QkZEMUUzOTEsIDB4QkZEMkU0OTIsIDB4QkZEMUUzOTIsIDB4QkZEMkUzOTIsIDB4QkZEMUUzOTEsIDB4QkZEMkU0OTIsIDB4QkZEMUUzOTIsIDB4QkZEMkUzOTIsIDB4QkZEMUUzOTIsIDB4QkZEMkU0OTIsIDB4QkZEMUUzOTIsIDB4QkZEMkU0OTIsIDB4QkZEMUUzOTIsIDB4QkZEN0U3QTMsIDB4QkNDQkUwODEsIDB4NTJCNEQ0NTAsIDB4MTBEMEU0OEYsIDB4N0ZCN0Q1NEMsIDB4QkZENEU1OTksIDB4QkFCN0Q0NkIsIDB4QkMzQjk4NDUsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QUY1NkE3NDUsIDB4QjlDN0RENzQsIDB4QkZEMkU0OTIsIDB4NjhCNUQ0NEQsIDB4MEREMkU2OUYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MENFQ0Y0RDMsIDB4ODFCN0Q1NEIsIDB4QkZENEU1OTksIDB4QkNCRkQ5NzAsIDB4Qjk0MzlBNDQsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk2NDYsIDB4QkUzNTk2NDUsIDB4QjY1REE3NDQsIDB4QjY5MkJGNEYsIDB4QjlCNUQ0NjMsIDB4QkRCREQ3NkYsIDB4QkZENEU1OUQsIDB4QkVEMEUzOEQsIDB4OENCOUQ2NEYsIDB4MUFDMkREN0MsIAorCQkweDAxRkNGREY4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkRGRUZFLCAweDNEOENDNTlFLCAweEIxMzA5NzQ4LCAweEJGNDFBNDU1LCAweEJGNTNBRjY1LCAweEJGNTNCMTRCLCAweEJGNTdCNzQ4LCAweEJGNjBCQjQ5LCAweEJGOTBDQTQ4LCAweEJGRDBFMjhGLCAweEJGQ0FERjgxLCAweEJGMzk5MzhGLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJCLCAweEJFMDA3MUJCLCAweEI0MTc3RUFDLCAweEFCNEI5QThCLCAweEIzNkZBRTc5LCAweEI1NjZBOTdGLCAweEI4M0M5Mjk2LCAweEJDMEM3OEIzLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJBMDc3NUI2LCAweEFBODdCQjZDLCAweEJFRDJFNDk2LCAweEJEQ0RFMTg0LCAweDlDQjZENDQ3LCAweEJGRDNFNDk2LCAweEJBQzhERTdCLCAweEFCMzk5MDk2LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJCLCAweEI4MDk3NkI2LCAweEI0MjE4M0E0LCAweEI3MUY4MkE2LCAweEJCMDg3NkI1LCAweEJGMDA3MkJCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDE3MkJCLCAweEI0MTI3QkIwLCAweEI1MkI4OTlELCAweEJBMkQ4QTlDLCAweEJBMTI3QkFGLCAweEJGMDE3MkJCLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJEMDQ3NEI5LCAweEE5NzVCMDczLCAweEJFRDBFMjhGLCAweEJGRDZFNkEwLCAweEJGRDRFNTk5LCAweEI3NTE5RDhBLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJCLCAweEEyNkZBRDc0LCAweEJGRDNFNDk1LCAweEI4QzdERDczLCAweDM5QkREOTY2LCAweDM2QjRENDU0LCAweEFCQzBEOTVGLCAweEJGRDZFNkExLCAweEI1NkRBRDgwLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDA3MUJCLCAweEE0NjlBQjc4LCAweEJGRDFFMzkwLCAweEJBQzlERjdBLCAweDNGQkFENzVGLCAweDAwRkRGRUZCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RjJGN0UzLCAweDU0QjRENDRFLCAweEJCQzhERTc3LCAweEJGRDFFMzkzLCAweEI3NDA5NDkyLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJFMDE3MkJCLCAweEE0ODFCNzZDLCAweEJGRDVFNjlDLCAweEIyQzNEQjZBLCAweDJCQzlFMDgzLCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFERDJFNTk5LCAweDlBQkJENzUyLCAweEJGRDdFNkEyLCAweEI5QjZENDY2LCAweEJBM0U5OTQ0LCAweEJGMzE5NTQ2LCAweEJGMzA5NDQ1LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzE5NTQ2LCAweEJFMzE5NTQ1LCAweEJBNDI5QzQ1LCAweEI2NjFBODQ0LCAweEI2NzBCMDQ4LCAweEI3NjVBOTQ1LCAweEJBNERBMDQ0LCAweEJFMzM5NTQ1LCAweEJGMzA5NTQ2LCAweEJGMzA5NTQ1LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEFCNjZBQjQ0LCAweEJBQzhERTc4LCAweEJGRDRFNTk5LCAweDdCQjZENTRFLCAweDE0Q0VFNDk3LCAweDFBRDhFOEExLCAweDlGQkJENzU0LCAweEJGRDdFNkEyLCAweEI4OThDMjU1LCAweEJFMzI5NTQ1LCAweEJGMzE5NTQ2LCAweEJGMzA5NDQ2LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEIwNkRBRjQzLCAweEJFQ0ZFMThCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDAzRjZGQUVDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRkJDLCAweDkwQjlENjRGLCAweEJGRDdFNkExLCAweEJBQUFDRDVCLCAweEJCMzU5NjQ1LCAweEJGMzA5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ1LCAweEFDNjFBOTQzLCAweEJBQ0JFMDgwLCAweEJGREFFOEFBLCAweEJDQ0FERjgyLCAweEI4NTBBMzQ0LCAweEJGMzA5NTQ2LCAweEJGMzE5NTQ2LCAweEJGMzA5NDQ2LCAweEJGMzA5NTQ2LCAweEI2M0Q5QTQ1LCAweEFGQjhENTVELCAweEJGRDdFNkEyLCAweDhFQjlENjUyLCAweDE3QzVERjg0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDMzQ0ZFMzhCLCAweEIyQzJEQjY1LCAweEJGRDVFNTlFLCAweEI4N0ZCODRBLCAweEJGMzE5NTQ2LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzA5NTQ2LCAweEJDMzg5NzQ1LCAweEFGQjBEMTU3LCAweEJGREJFOUFGLCAweEJFQzFEQTc1LCAweEJBNDA5QTQ1LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEJCMzY5NzQ2LCAweEFCNTJBNTQ1LCAweEJBNTNBNTQ0LCAweEJBNTJBNTQzLCAweEJBNTJBNTQ0LCAweEJBNTJBNDQzLCAweEJBNTJBNTQ0LCAweEI4NEJBMTQ0LCAweEJFMzU5NjQ2LCAweEJGMzA5NTQ2LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzE5NTQ2LCAweEFENUFBNzQ0LCAweEI5QzREQzcxLCAweEJFRDRFNTlCLCAweDgwQjdENTRGLCAweDE0QzZERjg3LCAweDUyQzVERDcwLCAweEJFQzlERTdBLCAweEJFRDBFMzhELCAweEIyNjFBQzQ0LCAweEJGMzA5NTQ2LCAweEJGMzA5NDQ1LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEJFMzE5NTQ2LCAweEEyNTdBMzQ1LCAweEI1NjJBOTQ1LCAweEI2NjJBODQ1LCAweEI2NjJBOTQ1LCAweEI2NjJBODQ1LCAweEI2NjJBOTQ2LCAweEI2NjFBODQ1LCAweEI2NjJBODQ1LCAweEI2NjFBODQ1LCAweEI2NjJBODQ1LCAweEI2NjFBODQ1LCAweEI2NjFBODQ1LCAweEI2NjFBODQ1LCAweEI2NjJBODQ2LCAweEFFODFCNjQzLCAweEJFQ0VFMTg4LCAweEJCQ0JERjgxLCAweDUyQjNENDUwLCAweDEwQ0ZFMzhFLCAweDdGQjdENTRDLCAweEJGRDNFNDk5LCAweEJBQjdEMzZBLCAweEJDMzk5ODQ0LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ1LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEFGNTVBNjQ1LCAweEI5QzdERDc0LCAweEJGRDJFNDkyLCAweDY4QjVENDRELCAweDBDRDFFNjlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRjNGOEU0LCAweDVFQjhENjUyLCAweEJDQ0NFMDgxLCAweEJFRDFFMzhGLCAweEI1NjdBQjQ0LCAweEJGMzA5NTQ2LCAweEJGMzA5NTQ1LCAweEJGMzE5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzA5NTQ2LCAweEJGMzE5NTQ2LCAweEJFMzA5NTQ2LCAweEJFMzY5NjQ1LCAweEJBM0M5NzQ0LCAweEIzQUNEMDU3LCAweEJGRDdFN0E0LCAweEE4QzBEOTYwLCAweDI1QjVENTVFLCAKKwkJMHgwMUZDRkVGOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkVGRSwgMHgzNzhFQzdBMSwgMHhBRTJEOTc0NywgMHhCRjQxQTQ1NywgMHhCRjU0QjE3MywgMHhCRjUzQjM1NCwgMHhCRjU2Qjc0OCwgMHhCRjdFQzU0OSwgMHhCRkMxREI2RSwgMHhCRkQ2RTY5RiwgMHhCRjg3QkU2NiwgMHhCRjA2NzZCNywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCQzA1NzVCOSwgMHhBODZCQUI3OCwgMHhCRENDRTE4MywgMHhCRkQ1RTU5RCwgMHg5N0JBRDc1MywgMHg1REI1RDQ0QywgMHhCOEM2REQ3MSwgMHhCRkQ2RTY5RiwgMHhBNzkyQzE2OSwgMHhCODA4NzZCNiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRDAyNzNCQSwgMHhBQTU3QTE4NCwgMHhCQkM3REU3OSwgMHhCRkQ3RTdBMywgMHhCRkQxRTM4RiwgMHhCRkNGRTI4QiwgMHhCNTMwOEM5QywgMHhCRjAwNzJCQywgMHhCRjAwNzFCQywgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCRjAxNzJCQiwgMHhBNDhFQkU2NywgMHhCRkQ3RTdBMCwgMHhBRkMxREE2MywgMHgyNUNCRTI4OCwgMHg0N0I2RDU1NSwgMHhCOEM1REQ2RSwgMHhCRkQ0RTU5QSwgMHhCNzUzOUU4QSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRTAxNzJCQiwgMHhBMzgyQjg2RCwgMHhCRkQ1RTY5RCwgMHhCM0M0REM2OSwgMHgyOUQxRTU5NCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQURBRUFBRiwgMHg2QUI1RDU0QiwgMHhCRUNFRTI4OSwgMHhCRUM4REU4MywgMHhCNjIxODRBNiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzJCQywgMHhCQzA2NzVCOSwgMHhBNjlEQzc2MywgMHhCRkQ4RTdBMywgMHhBNUJFRDg1QywgMHgxQURBRUFBQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkYxRjdFMCwgMHg2NkI4RDY1MSwgMHhCQ0NDRTA4MSwgMHhCRkQzRTQ5NiwgMHhCNDgyQjg0QSwgMHhCRjMxOTY0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTQ0NiwgMHhCRjMwOTY0NywgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NywgMHhCNjQxOUI0NCwgMHhBRUFFQ0Y1NSwgMHhCRkQ3RTZBMiwgMHhCNkM1REM2RCwgMHg0M0IzRDQ1MywgMHgwNkU4RjJDRSwgMHgxQUQ5RTlBMSwgMHg5RkJDRDc1NCwgMHhCRkQ3RTZBMiwgMHhCODk4QzI1NSwgMHhCRTMxOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTQ0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCMDZEQUY0MywgMHhCRUNGRTI4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwNEY2RkFFRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUZCQywgMHg5MEI5RDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFBQ0Q1QywgMHhCQzM1OTY0NSwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NywgMHhCRjJGOTU0NiwgMHhBRDYxQTk0MywgMHhCQkNCRTA4MCwgMHhCRkRCRTlBRCwgMHhCQ0MwRDk3NSwgMHhCQTQxOUI0NSwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCNTQ2OUU0NSwgMHhCM0MzREI2OCwgMHhCRkQ1RTU5RCwgMHg3RUI3RDU0RSwgMHgxMUNGRTQ5OSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNkNGRTM4RCwgMHhBN0JGRDk1QywgMHhCRkQ3RTdBMiwgMHhCNjhFQkY1MCwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NywgMHhCRTMxOTU0NiwgMHhBOEE5Q0U1MCwgMHhCRkQ5RThBQiwgMHhCRUMxREE3NiwgMHhCQTNGOUE0NSwgMHhCRjJGOTU0NiwgMHhCRjJGOTQ0NiwgMHhCRjMwOTY0NywgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NywgMHhCRjJGOTU0NiwgMHhCRDM1OTc0NiwgMHhBNzlCQzY0QSwgMHhCRkQ1RTU5QiwgMHhCQUM4REU3OCwgMHg0REI0RDQ1MSwgMHgwOEUwRUVCRiwgMHg1MkM2REU3MSwgMHhCRUM5REU3QSwgMHhCRUQwRTM4RCwgMHhCMjYxQUM0NSwgMHhCRjJGOTU0NiwgMHhCRjJGOTQ0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCMTYwQTc0MiwgMHhCRENFRTE4NywgMHhCQ0NCRTA4MSwgMHg1MkI0RDQ1MCwgMHgxMENGRTQ4RiwgMHg3RkI3RDU0QywgMHhCRkQ0RTU5OSwgMHhCQUI4RDQ2QiwgMHhCQzM5OTg0NSwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhBRjU0QTY0NSwgMHhCOUM3REQ3NCwgMHhCRkQyRTQ5MiwgMHg2OUI1RDQ0RCwgMHgwQ0QxRTY5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRSwgMHgzMEM1REU3OCwgMHhBQ0JGRDk1RSwgMHhCRkQ4RThBNSwgMHhCNkE1Q0E1OCwgMHhCRDM3OTc0NSwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjJGOTU0NiwgMHhCRjMwOTU0NiwgMHhCRjMwOTU0NiwgMHhBM0E2Q0Q0QiwgMHhCRkQ2RTZBMCwgMHhBOUMwREE2MSwgMHgyNUI1RDU1RSwgCisJCTB4MDBGQ0ZERjgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGREZFRkUsIDB4MkU4RUM3QTIsIDB4QUEyOTk2NDgsIDB4QkYzQ0EyNTYsIDB4QkY1M0IxN0EsIDB4QkY1MkIyNUUsIDB4QkY2OEJDNEIsIDB4QkZBM0NGNEYsIDB4QkZENkU2OUUsIDB4QkZDNERDNzcsIDB4QkY0QTlGODEsIDB4QkYwMTcyQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QjkwOTc3QjUsIDB4QUE3MEFFNzYsIDB4QkJDOURFN0MsIDB4QkZEOEU3QTMsIDB4QUFCRkQ5NUYsIDB4NDFCQ0Q5NjIsIDB4MkVCQ0Q5NjcsIDB4OTJCOUQ2NEYsIDB4QkVENEU1OUIsIDB4QkNDQURGODAsIDB4OUY2NkE5N0IsIDB4QkMwMzczQkEsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QjQwRTc5QjMsIDB4QTgxODdFQUMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkMwNjc1QjgsIDB4QTk1RkE1N0UsIDB4QjlDNERDNzUsIDB4QkZEOEU3QTYsIDB4QkVDNERDNkEsIDB4QkZEMUUzOTEsIDB4QkNDNkREN0IsIDB4QkIxOTdGQUEsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QjkwNzc1QjcsIDB4QThBOUNENjAsIDB4QkZEN0U3QTQsIDB4OUVCQ0Q3NTcsIDB4MUJCQkQ5NkIsIDB4NURCNEQ0NEIsIDB4QkNDQ0UwODAsIDB4QkVDRkUxOEEsIDB4QjUzMThDOUQsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcyQkMsIDB4QkMwMzczQjksIDB4QTdBM0NBNjAsIDB4QkZEN0U2QTIsIDB4QTVCRUQ4NUIsIDB4MThEMUU1OTksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJEOUVBQUQsIDB4ODBCN0Q1NEIsIDB4QkZEM0U0OTksIDB4QkJCREQ4NzQsIDB4QkIwQzc4QjMsIDB4QkYwMDcyQkMsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QkYwMDcxQkIsIDB4QjcwRTc5QjMsIDB4QUNCN0Q1NjAsIDB4QkZEN0U3QTMsIDB4OTNCOUQ2NTIsIDB4MEREOUVBQUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MjZDREUzOEIsIDB4OUJCQUQ2NTMsIDB4QkZENkU2OUYsIDB4QkNDN0REN0IsIDB4QjM2QkFENDUsIDB4QkUyRjk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDUsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk0NDUsIDB4QkYyRjk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDUsIDB4QkYyRTk1NDYsIDB4QkYyRDk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QjgzRDk5NDUsIDB4QTg5Q0M2NEEsIDB4QkVEMUUzOTAsIDB4QkVEMEUyOTEsIDB4N0NCN0Q1NEYsIDB4MTlDMERDN0EsIDB4MDBGREZFRkEsIDB4MUFEOEU4QTEsIDB4OUZCQkQ3NTQsIDB4QkZEN0U2QTIsIDB4Qjg5N0MyNTQsIDB4QkUyRjk0NDUsIDB4QkYyRTk1NDYsIDB4QkYyRDk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QjA2Q0FFNDMsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDNGNkZBRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VFQkMsIDB4OTBCOUQ2NEYsIDB4QkZEN0U2QTEsIDB4QkFBQUNDNUIsIDB4QkIzMzk1NDUsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk0NDYsIDB4QkYyRDk0NDYsIDB4QUQ2MEE4NDMsIDB4QkJDQkUwODAsIDB4QkZEQkU5QUYsIDB4QkJCN0Q0NjcsIDB4QkQzNjk2NDYsIDB4QkYyRDk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QjA1MUEyNDQsIDB4QjhDN0RENzMsIDB4QkVEMkUzOTQsIDB4NkNCNUQ1NEUsIDB4MENFMUVFQkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTlFMEVEQjYsIDB4OUNCQkQ3NTMsIDB4QkZEN0U3QTMsIDB4QjRBNENCNTgsIDB4QkYyRTk0NDUsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QkUyRTk0NDYsIDB4QUI5MEMwNEIsIDB4QkZENkU2QTIsIDB4QkVDMURBNzUsIDB4QkEzRDk5NDUsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRDk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRDk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRDk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRDk0NDYsIDB4QkYyRTk0NDUsIDB4QkYyRjk1NDYsIDB4QkUyRjk1NDUsIDB4QTg3M0IyNDUsIDB4QjlDN0RENzUsIDB4QkZENkU2OUYsIDB4OTNCQUQ2NTMsIDB4MjNCQ0Q5NkUsIDB4MDBGQUZDRjUsIDB4NTJDNURFNzEsIDB4QkVDOURFN0EsIDB4QkVDRkUyOEQsIDB4QjI2MEFDNDQsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRDk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRDk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRjk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRjk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk1NDYsIDB4QjE2MEE3NDEsIDB4QkRDREUxODcsIDB4QkNDQkUwODEsIDB4NTJCM0Q0NTAsIDB4MTBDRkUzOEUsIDB4N0ZCN0Q1NEMsIDB4QkZENEU0OTksIDB4QkFCN0QzNkEsIDB4QkMzODk4NDUsIDB4QkYyRTk0NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk0NDYsIDB4QkYyRTk0NDYsIDB4QUY1M0E2NDUsIDB4QjlDN0RENzMsIDB4QkZEMkUzOTIsIDB4NjhCNUQ0NEQsIDB4MENEMUU2OUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MERFN0YxQzgsIDB4N0FCNkQ1NEIsIDB4QkZEMEUzOEUsIDB4QkVDRkUxOEMsIDB4QjI3Q0I1NDcsIDB4QkUzMDk1NDUsIDB4QkYyRTk0NDYsIDB4QkYyRDk0NDYsIDB4QkYyRjk1NDYsIDB4QkYyRTk0NDYsIDB4QkYyRjk1NDYsIDB4QkYyRTk0NDUsIDB4QkYyRTk1NDYsIDB4QkYyRTk1NDYsIDB4QTNBNUNENEIsIDB4QkZENkU2QTAsIDB4QTlDMERBNjEsIDB4MjVCNUQ2NUUsIAorCQkweDAxRkNGREY4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZELCAweDI4OEZDOUE0LCAweEE1MjY5NjQ3LCAweEJGMzlBMjU1LCAweEJGNEZCMDdCLCAweEJGNTlCNTZBLCAweEJGN0VDMzRCLCAweEJGQkZEQTZCLCAweEJGRDdFN0E0LCAweEJGQjZENjY3LCAweEJGNDE5OTg2LCAweEJGMDM3M0I5LCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJFMDE3MkJCLCAweEIwMkE4OEEwLCAweEFDOTNDMTY4LCAweEJFQ0VFMTg5LCAweEJGRDdFN0EzLCAweEFGQzFEQTYzLCAweDUxQjZENTUyLCAweDA5RTNFRkMxLCAweDBCREVFREI4LCAweDUyQjVENTRGLCAweEFFQzFEQTYyLCAweEJGRDhFOEE1LCAweEI4QzREQzczLCAweDlDNkJBQjc4LCAweEI3MEE3N0I1LCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJCMDY3NUI4LCAweEFDNDE5NDkwLCAweEFDQTJDQTY1LCAweEE4QTZDQzYxLCAweEFDMzE4RDlCLCAweEJFMDE3MkJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MUJDLCAweEJGMDA3MUJCLCAweEJGMDE3MkJCLCAweEIyMUQ4MUE4LCAweEFBODRCOTZELCAweEJDQzlERTdFLCAweEJGRDhFN0E1LCAweEI1QzREQzZELCAweEEwQjhENTQ5LCAweEJGRDVFNTlDLCAweEI5QUVEMDc3LCAweEJCMEI3N0IzLCAweEJGMDA3MkJDLCAweEJGMDA3MUJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEIxMTk4MEFDLCAweEIxQjdENTY2LCAweEJGRDdFN0ExLCAweDhBQjlENjUxLCAweDE4Q0RFMzkyLCAweDczQjVENDRBLCAweEJGRDFFMzkxLCAweEJCQzZERDdCLCAweEJCMTk3RkFCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEIzMTI3QkIwLCAweEFFQjNEMjY0LCAweEJGRDdFNkEyLCAweDkxQkFENzUzLCAweDBERUFGM0NGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFEQzlFMDg4LCAweDkzQjlENjRGLCAweEJGRDdFNkExLCAweEI2QTBDODc2LCAweEJEMDU3NEI4LCAweEJGMDA3MkJDLCAweEJGMDA3MUJCLCAweEJGMDA3MkJDLCAweEJGMDA3MkJDLCAweEFEMjQ4NUE1LCAweEI1QzBEOTZCLCAweEJGRDVFNjlELCAweDdCQjdENTRFLCAweDA3RjJGOEUyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RjFGOEUxLCAweDRDQjdENjU2LCAweEIxQzJEQjY1LCAweEJGRDhFN0E0LCAweEJDQzVEQzc1LCAweEIwNzRCMjQ2LCAweEJEMzM5NjQ1LCAweEJGMkM5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkM5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkM5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkU5NTQ2LCAweEIyNEE5RjQ0LCAweEFBQTFDODRELCAweEJFQ0ZFMjhBLCAweEJGRDVFNjlDLCAweDlDQkJENzU1LCAweDMwQjRENTVBLCAweDA0RUZGNkRFLCAweDAwRkZGRkZGLCAweDFBRDhFOUExLCAweDlGQkNENzU0LCAweEJGRDdFN0EyLCAweEI4OTdDMjU1LCAweEJFMkU5NDQ1LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEIwNkNBRTQzLCAweEJFQ0ZFMjhCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDA0RjZGQUVELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRkJDLCAweDkxQjlENjRGLCAweEJGRDdFNkExLCAweEJBQUFDRDVDLCAweEJDMzI5NTQ1LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEFENUZBODQzLCAweEJCQ0JFMDgwLCAweEJGREJFQUFGLCAweEI1QUNDRjVDLCAweEJGMkY5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkM5NDQ2LCAweEJGMkQ5NDQ2LCAweEE4NjRBQzQ1LCAweEJFQ0JFMDdGLCAweEJEQ0VFMThBLCAweDVDQjRENDRGLCAweDA4RTFFRUJGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEwRTlGMkNCLCAweDhEQjlENjRFLCAweEJGRDZFNkEwLCAweEJBQjJEMjYyLCAweEJEMzI5NTQ1LCAweEJGMkU5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEFDODJCOTQ3LCAweEJGRDNFNDk3LCAweEJFQzFEQTc1LCAweEJBM0M5OTQ1LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkM5NDQ2LCAweEJEMzE5NjQ2LCAweEE4NzFCMTQ0LCAweEI0QzFEQTY4LCAweEJGRDhFN0E1LCAweEI0QzREQzZBLCAweDQ3QjNENDUyLCAweDBBRTFFRUJFLCAweDAwRkZGRkZGLCAweDUzQzZERTcxLCAweEJFQ0FERjdBLCAweEJFRDBFMjhELCAweEIyNUZBQzQ0LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkM5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkM5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkU5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkM5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkM5NDQ2LCAweEJGMkQ5NTQ2LCAweEIxNUZBNzQyLCAweEJEQ0RFMTg3LCAweEJDQ0JFMDgxLCAweDUyQjNENDUwLCAweDEwQ0ZFMzhFLCAweDdGQjhENTRDLCAweEJGRDRFNTk5LCAweEJBQjdEMzZCLCAweEJDMzY5NzQ1LCAweEJGMkQ5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NTQ2LCAweEJGMkM5NDQ2LCAweEFGNTNBNjQ1LCAweEI5QzdERDc0LCAweEJGRDJFNDkyLCAweDY4QjVENDRELCAweDBERDJFNjlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjlGQ0YyLCAweDMyQzFEQzcxLCAweEE1QkREODU5LCAweEJGRDdFNkExLCAweEJEQzlERjdFLCAweEIwN0NCNjQ2LCAweEJDMzU5NzQ1LCAweEJGMkM5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkQ5NDQ2LCAweEJGMkU5NTQ2LCAweEJGMkQ5NDQ2LCAweEJGMkU5NTQ3LCAweEJGMkM5NDQ2LCAweEEzQTVDRDRCLCAweEJGRDZFNkEwLCAweEE5QzBEQTYxLCAweDI1QjVENjVFLCAKKwkJMHgwMUZDRkRGOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkVGRCwgMHgyMThFQzhBNCwgMHhBMTIxOTQ0OCwgMHhCRjMzOUY1NCwgMHhCRjREQUY3QywgMHhCRjY0Qjk2RiwgMHhCRjhFQzg0RCwgMHhCRkM3REU3QiwgMHhCRkQ4RTdBMywgMHhCRkJCRDg2QywgMHhCRjZBQjE2QywgMHhCRjE5ODJBMywgMHhCRjAxNzJCQSwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCQjA1NzRCOCwgMHhBRTJDOEE5RCwgMHhBNzdCQjQ3MCwgMHhCN0JFRDg2RSwgMHhCRkQ1RTU5RCwgMHhCRkQ0RTU5NywgMHhBNkJFRDg1QiwgMHg0RkI3RDY1MywgMHgwQUUxRUVCRCwgMHgwMEZGRkZGRiwgMHgwMEZDRkRGOSwgMHgxQ0NDRTM4RiwgMHg2NkI1RDQ0QiwgMHhCNUM1REM2RCwgMHhCRkQ4RTdBNSwgMHhCQ0NCREY4MCwgMHhBMjk4QzQ2MywgMHhBMzNGOTQ5MiwgMHhCNDBBNzdCNCwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRDAyNzJCQSwgMHhCMjFBN0ZBQSwgMHhBOTREOUI4OCwgMHhBQzk4QzQ2NywgMHhCQkM3REQ3QSwgMHhCRkQ4RTdBMywgMHhCRUQ2RTZBMSwgMHhCNkJFRDg2RCwgMHhBNDZFQUQ3NiwgMHhBRDIxODRBNiwgMHhCQjAyNzJCQSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRDAzNzNCQSwgMHhCMDIyODRBNCwgMHhBNjZCQUM3OCwgMHhCM0I1RDM2NywgMHhCRkQzRTQ5NiwgMHhCRkQ1RTU5RSwgMHhBRkMxREE2NCwgMHg2NkI2RDQ0QywgMHg5QUJBRDY1MiwgMHhCRkQ3RTZBMiwgMHhCOTk4QzQ3NCwgMHhCRDAxNzJCQSwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhBQTMxOEM5QiwgMHhCN0M1REM3MCwgMHhCRkQ0RTU5OCwgMHg3MkI1RDQ0QywgMHgxQUI0RDU1RCwgMHg4N0I3RDQ0QiwgMHhCRkQ1RTY5RCwgMHhCOEFFQ0Y3NywgMHhCQjBCNzhCNCwgMHhCRjAwNzFCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhBQzI5ODdBMCwgMHhCN0MxREE2QywgMHhCRkQ0RTU5QiwgMHg3QkI3RDU0RSwgMHgwNUVCRjNENCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyQkJGREE2RiwgMHhBM0JERDg1NywgMHhCRkQ3RTdBMywgMHhCODg0Qjk3OSwgMHhCRTAxNzJCQiwgMHhCRjAwNzJCQywgMHhCRjAwNzFCQiwgMHhCRjAwNzFCQywgMHhCRjAwNzFCQiwgMHhBNzQyOTY5MCwgMHhCQ0M5REU3QSwgMHhCRkQxRTM4RiwgMHg2MUI0RDQ0RCwgMHgwMkYzRjhFNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQ0U0RUZDNCwgMHg1RkI1RDQ0RCwgMHhCNEMzREI2OCwgMHhCRkQ4RTdBNCwgMHhCRENDRTA4NSwgMHhCMjlFQzc1MCwgMHhCMjU2QTQ0MywgMHhCQzMxOTU0NSwgMHhCRTJCOTQ0NSwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTM0NSwgMHhCRjJCOTQ0NiwgMHhCRjJCOTM0NiwgMHhCRjJDOTQ0NiwgMHhCNTQwOUE0NCwgMHhBOTdBQjU0NCwgMHhCMkI5RDU1RSwgMHhCRkQ0RTU5OSwgMHhCRUQzRTQ5OCwgMHhBMkJERDg1OSwgMHgzREI0RDQ1NSwgMHgwQURERUNCNywgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHgxQUQ4RThBMSwgMHg5RkJCRDc1NCwgMHhCRkQ3RTZBMiwgMHhCODk3QzI1NCwgMHhCRTJDOTQ0NSwgMHhCRjJCOTQ0NiwgMHhCRjJBOTM0NSwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCMDZCQUU0MywgMHhCRUNFRTE4QiwgMHhCRENBREY3QywgMHg0NEI0RDQ1MywgMHgwM0Y2RkFFQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxMkUzRUZCQywgMHg5MEI5RDY0RiwgMHhCRkQ3RTZBMSwgMHhCQUFBQ0M1QiwgMHhCQjMxOTU0NSwgMHhCRjJCOTQ0NiwgMHhCRjJCOTM0NSwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NiwgMHhBQzVFQTc0MywgMHhCQUNCREY4MCwgMHhCRkRBRTlBRSwgMHhCNjk0QzE1NCwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJBOTM0NSwgMHhCRjJCOTQ0NiwgMHhBOTc0QjM0NCwgMHhCRkQwRTI4QywgMHhCQkNBREY3QywgMHg0QkI0RDQ1MSwgMHgwM0U2RjFDQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUU5RjJDQiwgMHg3Q0I3RDU0QSwgMHhCRkQzRTQ5OCwgMHhCQkJDRDc2RiwgMHhCOTM5OTk0NSwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NSwgMHhBMTczQjQ0NSwgMHhCQkMyREE2NiwgMHhCM0I1RDM1NiwgMHhCNzNBOTg0NSwgMHhCRjJCOTQ0NiwgMHhCRjJBOTM0NSwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NSwgMHhCRjJDOTQ0NiwgMHhCRjJCOTM0NiwgMHhCRjJDOTQ0NiwgMHhCRTJCOTM0NSwgMHhCRDMwOTU0NiwgMHhBRTUwQTM0NCwgMHhBNTk0QzM0OSwgMHhCOUM1REM3MiwgMHhCRkQ4RTdBNSwgMHhCOUM4REU3NiwgMHg2NUI1RDQ0RSwgMHgxNUMxREQ3QywgMHgwMEZCRkRGNywgMHgwMEZGRkZGRiwgMHg1MkM1REQ3MCwgMHhCRUM5REU3QSwgMHhCRUQwRTI4RCwgMHhCMjVFQUI0NCwgMHhCRjJCOTQ0NiwgMHhCRjJCOTM0NiwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJBOTM0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTM0NiwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJDOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTQ0NiwgMHhCRjJCOTM0NSwgMHhCRjJDOTQ0NiwgMHhCMTVFQTY0MSwgMHhCRENERTE4NywgMHhCQkNCREY4MSwgMHg1MkIzRDQ1MCwgMHgxMENGRTM4RSwgMHg3RkI3RDU0QywgMHhCRkQzRTQ5OSwgMHhCQUI3RDQ2QiwgMHhCQzM1OTc0NSwgMHhCRjJDOTQ0NiwgMHhCRjJCOTM0NiwgMHhCRjJCOTQ0NiwgMHhCRjJBOTQ0NiwgMHhBRjUxQTY0NSwgMHhCOUM3REQ3NCwgMHhCRkQyRTQ5MiwgMHg2OEI0RDQ0RCwgMHgwQ0QxRTY5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkU5RjNEMSwgMHg1MEI4RDY1NiwgMHhCMEMwREE2MiwgMHhCRkQ3RTdBMiwgMHhCRENFRTE4OSwgMHhCMUE0Q0E1MywgMHhBRjYyQUE0MywgMHhCOTM5OTg0NSwgMHhCRTJCOTM0NSwgMHhCRjJCOTQ0NiwgMHhCRjJCOTM0NSwgMHhCRjJDOTQ0NiwgMHhCRTJBOTM0NSwgMHhBM0E1Q0Q0QiwgMHhCRkQ2RTZBMCwgMHhBOUMwRDk2MSwgMHgyNUI1RDU1RCwgCisJCTB4MDFGQ0ZFRjgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGREZFRkQsIDB4MUQ4Q0M5QTYsIDB4OUExQjkzNDgsIDB4QkYzMDlFNTUsIDB4QkY0QkFGN0IsIDB4QkY2QUJDNzEsIDB4QkY5MUM5NTAsIDB4QkZDNURENzUsIDB4QkZEOEU3QTQsIDB4QkZDRkUyOEMsIDB4QkZBRkQzNjMsIDB4QkY3Q0JBNjUsIDB4QkY1MEEwN0YsIDB4QkYzNDkxOTIsIDB4QkYyMzg3OUEsIDB4QkIyNzhBOTcsIDB4QTc0QjlBODksIDB4QTY2RUFENzcsIDB4QUNBMEM4NjUsIDB4QjhDM0RCNzIsIDB4QkZENEU0OTgsIDB4QkZEOEU3QTQsIDB4QkFDOURFNzksIDB4OERCOUQ2NEYsIDB4M0RCQkQ4NjAsIDB4MDlFMkVGQkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGNkZBRUMsIDB4MjNCQ0Q5NkIsIDB4NjZCNkQ1NEMsIDB4QUVDMERBNjIsIDB4QkZENUU2OUMsIDB4QkZENUU2OUQsIDB4QjlDNkRENzQsIDB4QThBOUNENjAsIDB4OUY3REI2NkYsIDB4QTM2MUE2N0MsIDB4QTM1RUE1N0YsIDB4QTU1RkE1N0QsIDB4QTY3MUFGNzYsIDB4QUE5QUM1NjYsIDB4QjVCOUQ2NkIsIDB4QkRDREUxODYsIDB4QkZEN0U3QTMsIDB4QkZENEU1OUIsIDB4QjZDNURDNkMsIDB4QkFDOERFNzgsIDB4QkZEOEU3QTUsIDB4QkVEMUUzOTAsIDB4QjRCQ0Q3NkEsIDB4QTU5NUMzNjUsIDB4QTI2OEFBNzksIDB4QTQ0RjlEODcsIDB4QTQ0Mjk1OTAsIDB4QTQ0MDk0OTAsIDB4QTY1MDlEODgsIDB4QTQ2QUFCNzgsIDB4QTg5OUM1NjUsIDB4QjVCREQ4NkMsIDB4QkZEMUUzOTEsIDB4QkZEOEU3QTQsIDB4QkRDREUxODQsIDB4OTlCQkQ3NTQsIDB4NEJCNUQ1NTAsIDB4M0NCNEQ0NTMsIDB4QTlCRkQ5NUQsIDB4QkZEN0U2QTIsIDB4QjA5MEMwNkIsIDB4QUIzMzhFOTgsIDB4QUIzMzhEOTgsIDB4QUEzMzhEOTgsIDB4QUIzMzhFOTksIDB4QUIzMzhEOTgsIDB4QTA2NEE4NzcsIDB4QkNDQ0UwODIsIDB4QkZDRkUyODksIDB4NTdCQkQ4NUMsIDB4MjRDNERFN0IsIDB4OTlCQUQ2NTEsIDB4QkZEOEU3QTMsIDB4QjVBNENBNkIsIDB4QUEzNThGOTgsIDB4QUEzMzhEOTgsIDB4QUIzMzhFOTksIDB4QUIzMzhEOTgsIDB4QUIzMzhFOTksIDB4QTA1RkE1N0EsIDB4QkJDQkUwN0QsIDB4QkZEMEUzOEUsIDB4NjFCOUQ3NTYsIDB4MDFGNUY5RUEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGOEZCRUYsIDB4M0NCOUQ3NUYsIDB4QjFDMkRCNjUsIDB4QkZENkU2OUYsIDB4QUU4M0I5NkQsIDB4QUIzMzhEOTgsIDB4QUIzMzhFOTksIDB4QUEzMzhEOTgsIDB4QUIzMzhFOTksIDB4QUIzMzhEOTgsIDB4QTA3MkFGNzAsIDB4QkVDRkUyOEQsIDB4QkRDQkUwN0UsIDB4NDZDMkRDNkQsIDB4MDBGRUZFRkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGREZFRkIsIDB4MEZEMUU2OUMsIDB4NTZCNUQ0NEUsIDB4QTlCRkQ5NUQsIDB4QkZEM0U0OTYsIDB4QkZEN0U3QTEsIDB4QkJDOERENzksIDB4QjBBQUNFNTUsIDB4QUQ4MEI3NDYsIDB4QUU2MEE5NDQsIDB4QjM0RTlGNDIsIDB4QjM0OTlFNDQsIDB4QjI0OTlFNDMsIDB4QjE1MUEyNDMsIDB4QTk2REIwNDQsIDB4QTg5NEMyNDksIDB4QjJCOEQ1NUUsIDB4QkVDRkUyOEIsIDB4QkZEOEU3QTUsIDB4QkRDREUxODQsIDB4OTBCOUQ2NTIsIDB4MzhCNEQ1NTgsIDB4MENERUVDQjgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUFEOUU5QTEsIDB4OUZCQ0Q3NTQsIDB4QkZEN0U2QTIsIDB4QjNBNUNBNTQsIDB4QTk1REE2NDIsIDB4QUE1Q0E2NDMsIDB4QUE1QkE2NDIsIDB4QUE1Q0E3NDMsIDB4QUE1Q0E2NDIsIDB4QTU4NkJBNDIsIDB4QkVDRkUyOEIsIDB4QkRDQURGN0MsIDB4NDRCNEQ0NTMsIDB4MDRGN0ZBRUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTJFM0VGQkMsIDB4OTBCOUQ2NEYsIDB4QkZEN0U2QTEsIDB4QjdCMkQxNUIsIDB4QTg2MUE4NDIsIDB4QUE1REE4NDMsIDB4QUE1Q0E3NDIsIDB4QUE1REE4NDMsIDB4QUE1REE4NDMsIDB4QTE3RUI3NDIsIDB4QkJDQkUwODAsIDB4QkZEQ0VBQjAsIDB4QkRBNENBNjUsIDB4QUU1RkE5NDMsIDB4QUE1REE4NDMsIDB4QUE1RUE4NDMsIDB4QUE1REE4NDMsIDB4QUE1REE4NDQsIDB4QTU5MkMxNDUsIDB4QkZENEU1OTgsIDB4QjdDNkRDNkYsIDB4M0FCNUQ1NTgsIDB4MDJGQUZDRjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGQkZDRjUsIDB4NkNCQkQ3NTYsIDB4QkVEMEUyOEQsIDB4QkNDQURGN0QsIDB4QTk2RUIwNDIsIDB4QUE1REE5NDMsIDB4QUE1REE4NDMsIDB4QUE1RUE5NDQsIDB4QUE1RUE5NDMsIDB4QjM4OEJENEQsIDB4QkVDRkUyOEIsIDB4QkFCRkQ5NjgsIDB4QTc2N0FDNDMsIDB4QUE1RUE5NDQsIDB4QUE1REE4NDMsIDB4QUE1RUE5NDQsIDB4QUE1RUE4NDMsIDB4QUE1RUE5NDQsIDB4QUE1REE4NDMsIDB4QUE1RUE5NDQsIDB4QUE1RUE4NDMsIDB4QUE1RUE5NDQsIDB4QUE1REE5NDMsIDB4QUE1RUE5NDQsIDB4QUE1RUE5NDQsIDB4QTg2QkIxNDUsIDB4QUE4MUI5NDYsIDB4QUFBNUNCNTAsIDB4QjZDMURBNkEsIDB4QkZEM0U0OTYsIDB4QkZEN0U2QTEsIDB4QjVDNURDNkQsIDB4NjdCNUQ0NEUsIDB4MURDM0REN0QsIDB4MDFGOEZCRjEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NTJDNURFNzEsIDB4QkVDOURGN0EsIDB4QkVEMEUzOEQsIDB4QTc3RUI4NDMsIDB4QUE1REE4NDMsIDB4QUE1REE3NDMsIDB4QUE1REE4NDMsIDB4QUE1Q0E3NDMsIDB4QUE1REE4NDMsIDB4QUE1Q0E3NDIsIDB4QUE1REE4NDMsIDB4QUE1REE3NDMsIDB4QUE1Q0E3NDMsIDB4QUE1Q0E3NDMsIDB4QUE1REE4NDMsIDB4QUE1REE3NDMsIDB4QUE1REE4NDMsIDB4QUE1Q0E2NDIsIDB4QUE1REE3NDMsIDB4QUE1Q0E3NDMsIDB4QUE1Q0E3NDMsIDB4QUE1Q0E3NDIsIDB4QUE1REE3NDMsIDB4QTU3RUI1NDAsIDB4QkVDRUUxODcsIDB4QkNDQ0UwODEsIDB4NTJCNEQ0NTAsIDB4MTBEMEU0OEYsIDB4N0ZCN0Q1NEMsIDB4QkZENEU1OTksIDB4QjlCREQ3NkIsIDB4QTk2MkE5NDIsIDB4QUE1Q0E3NDMsIDB4QUE1Q0E2NDIsIDB4QUE1Q0E3NDMsIDB4QUE1Q0E2NDIsIDB4QTI3NUIzNDIsIDB4QkFDN0RENzQsIDB4QkZEMkU0OTMsIDB4NjlCNUQ0NEQsIDB4MENEMUU2OUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MENFOEYyQ0QsIDB4NTFCOEQ2NTYsIDB4QThCRUQ5NUIsIDB4QkZEMkUzOTMsIDB4QkZEOEU3QTMsIDB4QkNDQ0UwODIsIDB4QjNCNUQzNUUsIDB4QUI5NUMyNEIsIDB4QUI3OUI1NDUsIDB4QUI2MEE5NDQsIDB4QjI1MEEwNDMsIDB4QjY0ODlFNDQsIDB4QjBBQ0QwNTYsIDB4QkZEN0U3QTMsIDB4QTlDMERBNjEsIDB4MjVCNUQ2NUUsIAorCQkweDAwRkRGRUZCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZFLCAweDE2QTFEM0I3LCAweDk1MkI5QjU3LCAweEJFMkE5QzU0LCAweEJGNDlBRTdCLCAweEJGNjVCQTczLCAweEJGODRDNTUyLCAweEJGQjBENDVCLCAweEJGQ0ZFMjhCLCAweEJGRDdFNkEzLCAweEJGRDVFNTlDLCAweEJGQ0RFMTg3LCAweEJGQzZERTdBLCAweEJGQzFEQjcyLCAweEJGQzNEQzc3LCAweEJFQ0NFMDg0LCAweEJGRDNFNDk3LCAweEJGRDdFNkEzLCAweEJGRDVFNjlDLCAweEJBQzlERjdBLCAweDlDQkJENzU1LCAweDVEQjVENDRELCAweDIxQ0JFMjg5LCAweDAyRjRGOEU3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRjdGQUVGLCAweDFCQ0VFMzkxLCAweDUwQjVENDRGLCAweDkxQjlENjUwLCAweEI4QzdERDc0LCAweEJGRDRFNTlCLCAweEJGRDdFNkE0LCAweEJGRDRFNTlCLCAweEJGRDBFMjhELCAweEJGQ0VFMjg5LCAweEJGRDBFMjhFLCAweEJGRDRFNTlBLCAweEJGRDdFNkEzLCAweEJGRDdFN0ExLCAweEJFQ0ZFMjhCLCAweEIwQzJEQjY2LCAweDg1QjhENTRFLCAweDRGQjVENTRGLCAweDY3QjZENDRDLCAweEE0QkREODU5LCAweEJDQ0NFMDg0LCAweEJGRDdFN0ExLCAweEJGRDdFNkExLCAweEJGRDJFNDkzLCAweEJEQ0NFMDg0LCAweEJDQ0FERjdELCAweEJCQ0FERjdDLCAweEJFQ0VFMTg2LCAweEJGRDJFMzk0LCAweEJGRDhFN0EzLCAweEJGRDZFNjlGLCAweEJDQ0NFMTgzLCAweEE0QkREODVBLCAweDZCQjdENTRELCAweDJCQkZEQTZELCAweDA3RTVGMUM4LCAweDQzQjRENDUyLCAweEI0QzREQzZBLCAweEJGRDhFN0E1LCAweEJEQ0JERjdFLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJCQzlERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJGRDVFNjlELCAweEI5QzlERTc4LCAweDNFQjdENjU5LCAweDMyQkVEQTZBLCAweEE5QkVEOTVDLCAweEJGRDlFOEE3LCAweEJEQ0JFMDgxLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJCQzlERjdCLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJDQzlERjdCLCAweEJGRDRFNTlBLCAweEJCQ0FERjdELCAweDQ2QkNEODYxLCAweDAwRkVGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RjBGN0RGLCAweDRGQjRENDRELCAweEI4QzdERDc0LCAweEJGRDdFNkEyLCAweEJEQ0FERjdELCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERjdCLCAweEJCQzlERjdCLCAweEJCQzlERTdCLCAweEJEQ0FERjdDLCAweEJGRDZFNkExLCAweEI1QzVEQzZELCAweDJGQzJEQzc0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZDLCAweDA5RTRGMEM1LCAweDNBQjdENjVBLCAweDg2QjdENTRFLCAweEI1QzVEQzZFLCAweEJFRDNFNDk3LCAweEJGRDhFN0E1LCAweEJGRDNFNDk4LCAweEJFQ0RFMTg0LCAweEI4QzdERDc1LCAweEI1QzVERDZGLCAweEI0QzVEQzZFLCAweEI5QzhERTc2LCAweEJFQ0RFMTg3LCAweEJGRDVFNjlELCAweEJGRDdFN0EzLCAweEJFRDBFMjhCLCAweEE5QkVEOTVFLCAweDY2QjVENTRFLCAweDI1QjZENjYxLCAweDA3REVFREI5LCAweDAwRkVGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFBRDhFOEExLCAweDlGQkNENzU0LCAweEJGRDhFN0E1LCAweEJFQ0NFMDgyLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJGRDRFNTlCLCAweEJEQ0FERjdDLCAweDQ0QjRENDUzLCAweDAzRjZGQUVDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyRTNFRUJDLCAweDkwQjlENjRGLCAweEJGRDdFNkEyLCAweEJFQ0RFMTg1LCAweEJCQzlERTdCLCAweEJDQ0FERjdCLCAweEJCQzlERTdCLCAweEJDQzlERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJGRDJFNDk2LCAweEJGRDdFN0EyLCAweEJGRDdFNkEyLCAweEJEQ0FERjdFLCAweEJCQzlERTdCLCAweEJDQzlERjdCLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJEQ0FERjdELCAweEJGRDhFN0E0LCAweEFFQzFEQTY0LCAweDJEQjRENTVCLCAweDAxRkFGQ0Y1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkRGRUZCLCAweDU4QkJEODU3LCAweEJCQ0JFMDgxLCAweEJGRDRFNTk5LCAweEJDQzlERTdCLCAweEJDQzlERjdCLCAweEJCQzlERTdCLCAweEJDQzlERjdDLCAweEJCQzlERTdCLCAweEJGRDFFMzkxLCAweEJGREJFOUFGLCAweEJGRDFFMzkxLCAweEJCQzlERjdCLCAweEJDQzlERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERjdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERjdCLCAweEJCQ0FERjdDLCAweEJCQ0JERjdGLCAweEJGQ0ZFMjg4LCAweEJGRDNFNDk2LCAweEJGRDdFN0EyLCAweEJGRDVFNTlGLCAweEJDQ0JFMDdGLCAweDk5QkJENzU1LCAweDRDQjNENDUxLCAweDE3QzJERDdFLCAweDAyRjlGQ0YyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDUyQzVERDcxLCAweEJFQzlERjdBLCAweEJGRDVFNTlDLCAweEJDQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJDQzlERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERjdCLCAweEJDQzlERjdCLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERjdCLCAweEJDQzlERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERjdCLCAweEJDQzlERjdCLCAweEJDQzlERjdCLCAweEJGRDRFNTlBLCAweEJDQ0JFMDgxLCAweDUyQjNENDUwLCAweDEwQ0ZFMzhFLCAweDdGQjdENTRDLCAweEJGRDRFNTk5LCAweEJGRDBFMjhDLCAweEJCQzlERjdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJCQzlERTdCLCAweEJDQ0FERjdDLCAweEJFRDFFMzkwLCAweEJGRDJFNDkzLCAweDY4QjRENDRDLCAweDBDRDFFNTlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA4RThGMkNELCAweDM4QjdENjVCLCAweDgwQjdENTRELCAweEIyQzNEQjY4LCAweEJFRDBFMjhGLCAweEJGRDhFN0E0LCAweEJGRDZFNkEwLCAweEJGRDJFNDkyLCAweEJEQ0NFMDgyLCAweEI5QzhERTc3LCAweEI3QzVEQzcwLCAweEJGRDRFNTk5LCAweEJFRDFFMzkyLCAweDhDQjlENjUxLCAweDFEQzBEQjc3LCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxM0NDRThEQSwgMHg4RDIzOUI1NywgMHhCRjI3OUQ1NCwgMHhCRjQ1QUQ3QiwgMHhCRjU4Qjc3QSwgMHhCRjZCQkU1NywgMHhCRjg4Qzg0QiwgMHhCRkE3RDI1NiwgMHhCRkJGREI2RCwgMHhCRkNBRTA4MywgMHhCRkQxRTM5MCwgMHhCRkQyRTM5MywgMHhCRkQxRTM5MSwgMHhCRUNCRTA4NiwgMHhCOEM2REQ3MiwgMHhBNkJFRDg1QywgMHg4NUI4RDY0RSwgMHg1N0I1RDU0RiwgMHgyOUMzREQ3NSwgMHgwOEUzRUZDMywgMHgwMEZERkVGQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZERkVGQSwgMHgwQkUyRUZDMSwgMHgyRUMyREM3MywgMHg1OUI1RDQ0RSwgMHg4NUI4RDY0RSwgMHhBNEJFRDg1QiwgMHhCNkM1REM2RCwgMHhCQUM5REY3QiwgMHhCQ0NCRTA3RSwgMHhCQUM5REU3OSwgMHhCNUM1REM2RCwgMHhBN0JFRDg1QywgMHg4RUI5RDc1MSwgMHg2OUI2RDQ0QywgMHgzRkJBRDg1RSwgMHgxOUNFRTM5MiwgMHgwNUVDRjVENiwgMHgxNUNFRTM5MiwgMHgzREI4RDY1OSwgMHg2OUI2RDQ0QiwgMHg5MkJBRDY1MSwgMHhBREMwRDk2MiwgMHhCOUM4REU3NiwgMHhCQ0NDRTA4NCwgMHhCRUNGRTI4QiwgMHhCRENFRTI4QSwgMHhCQ0NERTE4MywgMHhCOEM3REQ3MywgMHhBQkMwREE1RiwgMHg4REI5RDY1MCwgMHg2MkI2RDU0RCwgMHgzMUMxREI2RSwgMHgwRUUyRUZCRSwgMHgwMEZDRkRGOCwgMHgwMkY4RkJGMSwgMHg0M0I1RDU1MywgMHhBRUJGRDk1RSwgMHhCRENFRTI4QSwgMHhCRENGRTI4QiwgMHhCRENFRTI4QiwgMHhCRUNGRTI4QywgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENFRTI4QiwgMHhCRUNGRTM4QywgMHhCRENFRTI4OSwgMHhBOUJFRDk1QywgMHgyNkM4REY4MSwgMHgzNEI2RDY1OSwgMHhBMUJCRDc1NSwgMHhCRENFRTI4OSwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENFRTE4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QSwgMHhBQ0JGRDk1RiwgMHgyQ0M3REY3RCwgMHgwMEZFRkZGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUYwRjdFMCwgMHg0RUI0RDQ0RiwgMHhCM0MyREI2NCwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENFRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QywgMHhCRENFRTE4OCwgMHg5RkJERDg1NywgMHgxQ0Q3RThBNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwM0YyRjhFMiwgMHgxN0NDRTI5MSwgMHg0NEI3RDY1OCwgMHg3REI3RDU0RCwgMHhBNUJFRDk1QiwgMHhCOEM2REQ3MSwgMHhCRENFRTI4NywgMHhCRkQxRTM5MiwgMHhCRkQ0RTU5OCwgMHhCRkQzRTQ5NywgMHhCRkQyRTQ5MiwgMHhCQ0NDRTA4NCwgMHhCNUM1REM2QywgMHg5N0JCRDc1NSwgMHg2NUI1RDU0RSwgMHgzMEI0RDU1OSwgMHgxMkNERTM5NCwgMHgwMkY2RkFFQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxM0RBRUFBOSwgMHg4REI5RDY0RSwgMHhCRENDRTA4MywgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENFRTI4QSwgMHhCMkMxREE2NCwgMHgzQUIzRDQ1NCwgMHgwM0Y2RkFFRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwREU1RjBDMiwgMHg4MEI3RDY0QywgMHhCQ0NCREY3RiwgMHhCRENGRTI4QiwgMHhCRENFRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCQkM2REQ2RiwgMHhCQkM5REU3QSwgMHhCRUNGRTI4QywgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENFRTE4NywgMHg5NkJBRDY1MywgMHgyMUJFREE3MiwgMHgwMEZDRkRGOSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkVGQywgMHgzREJERDk2MiwgMHhCMEMwRDk2MSwgMHhCRENGRTI4QiwgMHhCRENFRTE4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENFRTI4OCwgMHhCQ0NBREY3QywgMHhCRENGRTI4QiwgMHhCRENFRTE4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENFRTE4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QywgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENFRTE4OCwgMHhCQ0NDRTE4MiwgMHhCOEM3REQ3MiwgMHhBQUMwRDk2MCwgMHg4OEI4RDU1MCwgMHg1NUI0RDQ1MCwgMHgyNUJBRDg2QSwgMHgwQkRERUNCNywgMHgwMEY5RkNGMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg0NEM1REU3MywgMHhCM0MxREE2MywgMHhCRENGRTI4QiwgMHhCRENFRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENFRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENFRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QiwgMHhCNEMyREI2OCwgMHg0NUIzRDQ1MiwgMHgwQUUxRUVCQywgMHg3MEI3RDY0RSwgMHhCQkM4REU3OCwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUQwRTM4QywgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRENGRTI4QiwgMHhCRUNGRTI4QiwgMHhCRENGRTI4QiwgMHhCQUM3REQ3MiwgMHg1OEIzRDQ0RSwgMHgwQURERUNCNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkYyRjhFMywgMHgxNENDRTM5MiwgMHgzQ0I2RDY1OSwgMHg2RUI1RDQ0QywgMHg5N0JCRDc1NCwgMHhBRkMxREE2MywgMHhCOUM5REU3NywgMHhCQ0NERTE4NywgMHhCRkQyRTM5MSwgMHhCRkQ0RTU5OCwgMHhCRUNGRTI4OCwgMHg4REI5RDY1MSwgMHgyRkI3RDc2MCwgMHgwN0VCRjRENCwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEZDREU4REEsIDB4ODUyMjlCNTgsIDB4QkUyMjlDNTQsIDB4QkY0MUFDN0MsIDB4QkY0QkIzN0UsIDB4QkY0RUI2NUIsIDB4QkY1OUJDNEIsIDB4QkY2QUMxNEIsIDB4QkY3OEM0NDksIDB4QkY4MUM3NEEsIDB4QkY4NUM1NEMsIDB4QkY3QkMwNEEsIDB4QkI2NUI2NDgsIDB4NjA5NUM4NEYsIDB4MkZCQ0Q4NjUsIDB4MThEMkU2OUIsIDB4MDVFQUYzRDMsIDB4MDBGRUZFRkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkIsIDB4MDlFMkVGQzEsIDB4MUZDQUUxODgsIDB4MzNCOUQ3NUUsIDB4NDdCOUQ3NTksIDB4NTVCNUQ0NEUsIDB4NTlCNUQ0NEQsIDB4NTJCNkQ1NTEsIDB4NDJCQUQ3NUIsIDB4MkZCRURBNkIsIDB4MUREMEU1OTYsIDB4MEFFNkYwQzgsIDB4MDFGQUZDRjQsIDB4MDBGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MDJGM0Y4RTUsIDB4MTBEQ0VCQjMsIDB4MjdDNkRGN0MsIDB4M0JCOUQ3NUMsIDB4NTBCN0Q1NTIsIDB4NUZCNUQ0NEMsIDB4NjVCNkQ0NEQsIDB4NjRCNUQ0NEMsIDB4NUNCNUQ1NEQsIDB4NEFCOUQ2NTcsIDB4MzJCQkQ4NjIsIDB4MUJEMEU0OTYsIDB4MDhFOUYzRDAsIDB4MDBGQ0ZERkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGREZFRkIsIDB4MUJDRUUzOTIsIDB4NTNCNUQ0NEYsIDB4NjRCNkQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNUQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNUQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNkQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNUQ0NEQsIDB4NDhCN0Q2NTUsIDB4MDhFOEYyQ0QsIDB4MTNEM0U2OUUsIDB4NENCNkQ1NTIsIDB4NjVCNkQ1NEQsIDB4NjRCNUQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNUQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNkQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNUQ0NEQsIDB4NjVCNkQ1NEQsIDB4NEJCN0Q1NTUsIDB4MEJFMEVFQkIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGQkZERjcsIDB4MjFDOEUwODMsIDB4NThCNUQ1NEUsIDB4NjRCNUQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNUQ0NEQsIDB4NjVCNkQ0NEQsIDB4NjRCNUQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNkQ0NEQsIDB4NjVCNkQ1NEQsIDB4NjRCNUQ0NEMsIDB4NDJCOEQ2NTksIDB4MDVGMEY2REYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MDNGMkY4RTMsIDB4MTBEMkU1OUUsIDB4MjZCQkQ5NjksIDB4NDBCNUQ1NTcsIDB4NTlCNEQ0NEUsIDB4NjdCNUQ0NEQsIDB4NzNCNUQ0NEMsIDB4NzJCNUQ0NEIsIDB4NjZCNUQ0NEUsIDB4NTJCM0Q0NEYsIDB4MzdCNkQ2NUMsIDB4MUVCRkRCNzUsIDB4MEVEN0U5QUEsIDB4MDJFRkY2REQsIDB4MDBGRkZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGNkZBRUIsIDB4MkZCQkQ5NjYsIDB4NTdCM0Q0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCM0Q0NEYsIDB4NDVCM0Q0NTIsIDB4MTVDQkUyOTAsIDB4MDBGREZFRkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGQkZERjgsIDB4MjhDMERDNzMsIDB4NTVCM0Q0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCNEQ0NEYsIDB4NERCNEQ0NTAsIDB4NTJCM0Q0NEYsIDB4NTlCNEQ0NTAsIDB4NThCM0QzNEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NEYsIDB4NThCM0Q0NEYsIDB4NThCNEQ0NEYsIDB4MzVCNEQ1NTgsIDB4MEFENkU4QTgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEREQ0VDQjMsIDB4NDdCNUQ1NTUsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCM0Q0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NThCNEQ0NEYsIDB4NTRCM0QzNEUsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCM0Q0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NEYsIDB4NThCM0QzNEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQzNEYsIDB4NTlCNEQ0NTAsIDB4NThCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCM0Q0NEUsIDB4NTBCM0Q0NEYsIDB4M0VCNEQ0NTUsIDB4MkFCN0Q2NjEsIDB4MTdDNERFODEsIDB4MEFEREVDQjYsIDB4MDBGQUZDRjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEZEOEU5QUIsIDB4NDdCNEQ0NTIsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NEYsIDB4NThCM0QzNEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCM0Q0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NEYsIDB4NThCM0Q0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NEYsIDB4NDhCMkQzNTAsIDB4MThDM0RFODAsIDB4MDFGNkZBRUMsIDB4MjFCRkRCNzIsIDB4NTNCM0Q0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NThCNEQ0NEYsIDB4NTlCNEQ0NTAsIDB4NTlCM0Q0NEYsIDB4NTlCNEQ0NTAsIDB4NThCM0Q0NEYsIDB4NEVCM0Q0NTAsIDB4MUVCOEQ3NjcsIDB4MDFGNEY5RTcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MDJGMkY4RTQsIDB4MEJEQkVCQjMsIDB4MUJDQ0UzOTAsIDB4MkVCN0Q2NUYsIDB4NDVCNkQ2NTgsIDB4NTdCM0Q0NEUsIDB4NjVCNUQ1NEUsIDB4NzJCNUQ0NEMsIDB4NjhCNUQ0NEQsIDB4MjlCNkQ2NjEsIDB4MDZFQkY0RDUsIDB4MDBGRkZGRkUsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBDQ0ZFOURDLCAweDdEMUY5QjU4LCAweEJFMUQ5QzU0LCAweEJGM0ZBQjdDLCAweEJGNDhCMzdGLCAweEJGM0RCMjVBLCAweEJGM0NCNTRBLCAweEJGM0ZCNjRBLCAweEJGNDNCNzRCLCAweEJGNDBCMTRCLCAweEJGMzhBQjRELCAweEJGMUQ5RDQ5LCAweDZGMjI5RjVCLCAweDAxRUVGN0YwLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZFLCAweDAwRkRGRUZBLCAweDAyRkFGQ0YzLCAweDA0RTZGMUNCLCAweDA1RTdGMkNCLCAweDAyRUVGNkRCLCAweDAxRkRGRUZCLCAweDAwRkRGRUZCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRkZELCAweDAxRkRGRUZBLCAweDA0RURGNUQ5LCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDA3RTZGMUNBLCAweDA2RTdGMkNCLCAweDAyRjhGQkYxLCAweDAxRkRGRUZCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZCLCAweDA2RThGMkNELCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDA3RTdGMUNCLCAweDA4RTdGMkNCLCAweDA3RTZGMUNCLCAweDAzRjJGOEUyLCAweDAwRkVGRkZFLCAweDAwRkVGRkZFLCAweDA1RURGNURBLCAweDA4RTdGMkNCLCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDA3RTZGMUNBLCAweDA4RTdGMkNCLCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDAzRjJGN0UyLCAweDAwRkZGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkJGREY2LCAweDA2RTdGMkNCLCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDA3RTZGMUNCLCAweDA4RTdGMkNCLCAweDA3RTdGMUNCLCAweDA4RTdGMkNCLCAweDA3RTZGMUNCLCAweDAyRjRGOUU4LCAweDAwRkZGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkRGRUZCLCAweDAxRjNGOEU1LCAweDA3RTdGMkNCLCAweDBBRTZGMUNCLCAweDBERTdGMkNCLCAweDBDRTZGMUNCLCAweDBCRTdGMkNCLCAweDA3RTZGMUNCLCAweDAyRjhGQkYwLCAweDAwRkRGRUZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkJGREY1LCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA1RTdGMkNDLCAweDAwRkNGRUZBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkRGRUZCLCAweDA1RTdGMkNELCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA2RTdGMkNCLCAweDA1RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDAzRUZGNkRDLCAweDAwRkZGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZFLCAweDAzRjFGN0UwLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA2RTdGMkNCLCAweDAyRURGNURBLCAweDAxRkRGRUZCLCAweDAwRkVGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRkZELCAweDAzRUNGNEQ3LCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA1RTZGMUNCLCAweDAxRkFGQ0Y0LCAweDAwRkZGRkZGLCAweDAxRkRGRUZBLCAweDA1RTdGMkNELCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA3RTdGMkNCLCAweDA2RTZGMUNCLCAweDA2RTdGMkNCLCAweDAxRjlGQ0YyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZBLCAweDAyRjVGQUU5LCAweDA1RTZGMUNCLCAweDBBRTdGMkNCLCAweDBDRTBFRUJFLCAweDBERDlFQUFGLCAweDAzRjFGN0UxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUNGRTlEQywgMHg3NTFDOUI1OSwgMHhCRDE2OUE1NCwgMHhCRjNEQUI3QywgMHhCRjQ2QjE3RSwgMHhCRjNDQjI1OSwgMHhCRjM5QjM0QSwgMHhCRjNBQjU0QSwgMHhCRjM2QUY0OSwgMHhCRjJFQTk0QSwgMHhCRjIxOUY0OSwgMHhBRjBBOTQ0NywgMHgxODk3RDFCMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDdEMUVBREQsIDB4NkIxQjlBNTksIDB4QkQxNjlBNTQsIDB4QkYzQ0FCN0IsIDB4QkY0NUIyN0UsIDB4QkYzOUIwNTcsIDB4QkYzOEIyNEEsIDB4QkYzNkFGNEEsIDB4QkYzMUFCNEEsIDB4QkYyNUEyNDksIDB4QkYxMTk5NDgsIDB4NjI0NEFDNzYsIDB4MDFGRUZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkQsIDB4MDJGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MDJGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRUZFRkUsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZFRkUsIDB4MDBGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MDFGRUZFRkUsIDB4MDBGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGMUY4RjMsIDB4MjBCRURFQzUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZFRkUsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRUZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkUsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGREZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkYsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZFRkUsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZFRkUsIDB4MDBGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDdGMUY4RjMsIDB4MDNGQkZERkIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGREZFRkUsIDB4MDFGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MDFGRUZFRkUsIDB4MDFGREZFRkUsIDB4MDBGRkZGRkYsIDB4MDJGQkZERkMsIDB4MDhGMUY4RjIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZFRkUsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkQsIDB4MDJGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RDJFQURELCAweDY1MUQ5QjVBLCAweEJDMTI5OTU0LCAweEJGM0JBQjdDLCAweEJGNDNBRjdDLCAweEJGMzZBRDU0LCAweEJGMzNBQzRBLCAweEJGMzBBQjRBLCAweEJGMjlBNDQ5LCAweEJGMUQ5RDQ4LCAweEE4MDk5NDQ5LCAweDEyQjhERkNCLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRURGNUVGLCAweDRCODhDMjk0LCAweDkzNDhBMDVBLCAweEFBNDhBMTVBLCAweDk5NDhBMDVBLCAweDVBNkNCMzdBLCAweDA3REFFQ0RFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RjRGOUY1LCAweDNGOTZDOUEwLCAweDgyNTNBNjY0LCAweEE0NDhBMTVBLCAweEE2NDhBMDVBLCAweDg4NEJBMjVDLCAweDQ5OEJDMzk2LCAweDBBRTdGM0U5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA4RjZGQUY3LCAweDkzNEZBNDYwLCAweDk5NDhBMTVBLCAweDk4NDhBMDVBLCAweDk5NDhBMTVBLCAweDk5NDhBMDVBLCAweDdGNTVBNzY1LCAweDA5RTZGMkU5LCAweDhBNEZBNDYxLCAweDk5NDhBMDVBLCAweDk5NDhBMTVBLCAweDk4NDhBMDVBLCAweDk5NDhBMTVBLCAweDk5NDhBMDVBLCAweDk3NDhBMTVBLCAweDI4OTNDNzlELCAweDc2NENBMzVFLCAweDk3NDhBMDVBLCAweDM5OUNDQ0E2LCAweDAwRjRGOUY1LCAweDU1NThBOTY4LCAweDkzNDhBMDVBLCAweDM5QTdEMUFGLCAweDMyQjREOEJCLCAweDk2NDhBMTVBLCAweDVCNUFBOTZBLCAweDAxRkRGRUZELCAweDM3OUJDQkE0LCAweDk2NDhBMTVBLCAweDcwNDlBMTVBLCAweDA2RTdGM0U5LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDMxQTJDRkFCLCAweDk2NDU5RjU3LCAweDA5RUVGNkVGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RERFREUxLCAweDkwNDhBMTVBLCAweDk5NDhBMDVBLCAweDk5NDhBMTVBLCAweDkxNDhBMDVBLCAweDc0NUJBQTZCLCAweDI5QjZEOUJELCAweDAwRjlGQ0ZBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDZCN0VCQzhCLCAweDk5NDhBMTVBLCAweDk4NDhBMDVBLCAweDk5NDhBMTVBLCAweDk5NDhBMDVBLCAweDk5NDhBMTVBLCAweDM1QTZEMUFGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RUNGNUVFLCAweDRCN0JCQTg4LCAweDkzNDhBMTVBLCAweEE4NDhBMDVBLCAweDkwNDhBMTVBLCAweDQ0ODdDMTkzLCAweDAzRjRGOUY1LCAweDAwRkZGRkZGLCAweDAyRkNGREZDLCAweDg1NTdBODY3LCAweDk5NDhBMTVBLCAweDk5NDhBMDVBLCAweDk0NDhBMTVBLCAweDdDNENBMjVELCAweDNGQTNDRkFDLCAweDA0RUZGNkYwLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDFBRENFRERGLCAweDkwNDhBMTVBLCAweDk4NDhBMDVBLCAweDk5NDhBMTVBLCAweDkxNDhBMDVBLCAweDc0NUNBQjZDLCAweDI4QjdEOUJFLCAweDAwRkFGQ0ZBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDZDN0NCQjg5LCAweDk5NDhBMTVBLCAweDk5NDhBMDVBLCAweDk5NDhBMTVBLCAweDk4NDhBMDVBLCAweDk5NDhBMTVBLCAweDMzQThEMkIxLCAweDAwRkZGRkZGLCAweDMzQzRFMENBLCAweDU1ODBCRThELCAweDAyRkFGQ0ZBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkJGREZDLCAweDQ5OTRDODlGLCAweDc1NEZBNDYwLCAweDQxQTZEMUFFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDYzN0VCQzhCLCAweDk5NDhBMTVBLCAweDk5NDhBMDVBLCAweDk3NDhBMTVBLCAweDg0NDhBMDVBLCAweDUxODZDMTkyLCAweDBBRTRGMUU3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDRGOUZDREE5LCAweDk5NDhBMTVBLCAweDk4NDhBMDVBLCAweDk5NDhBMTVBLCAweDk5NDhBMDVBLCAweDk5NDhBMTVBLCAweDUwODVDMDkxLCAweDAwRkZGRkZGLCAweDBFRUNGNUVELCAweDhENEFBMTVDLCAweDk4NDhBMDVBLCAweDk5NDhBMTVBLCAweDkzNDhBMDVBLCAweDc4NTVBNzY2LCAweDMwQjBENkI4LCAweDAxRjZGQUY3LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDUzOEVDNDk5LCAweDkzNDhBMTVBLCAweDVGNjVBRjc0LCAweDAwRkZGRkZGLCAweDBERUZGN0YxLCAweDc1NjJBRTcxLCAweDA3RURGNUVGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDMxQUNENEI0LCAweDcxNUVBQzZFLCAweDVEN0JCQjg4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEyREVFRUUxLCAweDU5N0JCQjg4LCAweDhENDhBMDVBLCAweEE5NDhBMTVBLCAweEE0NDhBMDVBLCAweDg0NTBBNDYxLCAweDQ0OTJDNjlDLCAweDA3RjBGOEYyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNEQzRUJERiwgMHg1QzFFOUI1QSwgMHhCQTE1OTk1NCwgMHhCRjM4QTk3QiwgMHhCRjQwQUU3QSwgMHhCRjMwQTk1MSwgMHhCRjJFQTk0QSwgMHhCRjI5QTU0OSwgMHhCRjIwOUY0OSwgMHhCRTEwOTY0NywgMHg1NDQwQUE3NCwgMHgwMEZERkVGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZCRkRGQywgMHg2MDYzQUU3MiwgMHhCRDMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHg2ODU0QTY2NCwgMHgwMUZFRkZGRSwgMHgwMEZGRkZGRiwgMHgxMEQ0RTlEOCwgMHg4NDRFQTM1RiwgMHhCRDMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRTMyOTU0NiwgMHg5NDQ0OUY1NiwgMHgxQkI5REJDMCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwQUY1RkFGNiwgMHhCODNBOTk0RCwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCNjM0OTY0OCwgMHgzRjgyQkU4RiwgMHhCQjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCQzMyOTU0NiwgMHgyOUFGRDZCNywgMHg3NjY5QjI3OCwgMHhCRjMyOTU0NiwgMHg4ODUwQTU2MSwgMHgwMUY2RkFGNywgMHg0MDk0Qzg5RSwgMHhCRDMyOTU0NiwgMHg4NTRCQTI1QywgMHg4MzQ4QTA1QSwgMHhCRjMyOTU0NiwgMHg0NzhDQzQ5OCwgMHgwM0Y5RkNGOSwgMHg4NDU1QTc2NiwgMHhCRjMyOTU0NiwgMHg2RTY0QUY3NCwgMHgwMUZCRkRGQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwM0YyRjhGMywgMHg4QTQ3QTA1OSwgMHhCRjMyOTU0NiwgMHg0ODk4Q0FBMiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyMkRBRUNERCwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCNDMyOTU0NiwgMHgzNzlBQ0JBNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg4NjZGQjU3RCwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHg2NTc2Qjg4MywgMHgwMUZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkY3RkJGNywgMHg2NzVDQUI2QywgMHhCRDMyOTU0NiwgMHhCRDMyOTU0NiwgMHhCMjMyOTU0NiwgMHhCRTMyOTU0NiwgMHhCQjMyOTU0NiwgMHg1MjgzQkY4RiwgMHgwMEZFRkZGRSwgMHgwNEZDRkRGQywgMHhBRjQzOUQ1NSwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRDMyOTU0NiwgMHg3RDU4QTk2OSwgMHgwQkVBRjRFQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNUQ4RUJEQywgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCMzMyOTU0NiwgMHgzNTlDQ0NBNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg4ODZEQjM3QiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHg2Mzc4Qjk4NSwgMHgwMEZGRkZGRiwgMHgzN0M0RTBDQSwgMHhCQjMzOTY0NywgMHg1NTdGQkQ4QywgMHgwMkZBRkNGQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY5RkNGQSwgMHg4NzNGOUM1MiwgMHhCRjMyOTU0NiwgMHg1RTlCQ0NBNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg4NjZGQjQ3RCwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHg5ODQyOUQ1NCwgMHgxQkQxRTdENSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg2NDk0Qzg5RiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHg4NzU1QTc2NSwgMHgwMUZCRkRGQiwgMHgxNEU5RjRFQywgMHhCRTM0OTY0OCwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCNzMyOTU0NiwgMHg0NDg5QzI5NSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg3NjgwQkQ4RCwgMHhCRjMyOTU0NiwgMHg2RjUzQTY2NCwgMHgwMEZGRkZGRiwgMHgwRUYwRjdGMSwgMHhCQjM3OTg0QSwgMHg3OTVDQUI2QywgMHgwOEVERjZFRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg1QjY5QjI3OCwgMHhCRjMyOTU0NiwgMHg4QjZCQjM3QSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZCRkRGQiwgMHgzMzhCQzM5NiwgMHhBODNCOTk0RSwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRTMyOTU0NiwgMHg4NzRBQTI1QywgMHgwOUQ2RUFEQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJFNEYzRUIsIDB4NTM1N0I0ODQsIDB4QjgxMDk3NTMsIDB4QkYzNkE4N0EsIDB4QkYzQkFBNzUsIDB4QkYyQUE1NEUsIDB4QkYyN0E0NDksIDB4QkYyMkEwNDksIDB4QkYxNTk5NDgsIDB4OUYwNzkyNDksIDB4MEJCOERGQ0IsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEZFNEYxRTcsIDB4QUQzMjk1NDYsIDB4QkQzMjk1NDYsIDB4NjI3M0I2ODEsIDB4MjZEM0U4RDcsIDB4NTA4OEMxOTQsIDB4OUMzOTk5NEQsIDB4MUZBOEQyQjAsIDB4MDBGRkZGRkYsIDB4MDNGMEY3RjEsIDB4N0U0NjlGNTgsIDB4QkUzMjk1NDYsIDB4QjYzMjk1NDYsIDB4Njc2OEIxNzcsIDB4MkNCMEQ2QjcsIDB4MjlCQ0RDQzMsIDB4NUI3OUJBODYsIDB4QUQzMzk1NDcsIDB4QkYzMjk1NDYsIDB4OTU0NDlFNTcsIDB4MEJFNkYyRTgsIDB4MDBGRkZGRkYsIDB4MEFGNUZBRjYsIDB4QjczQTk5NEQsIDB4QkUzMjk1NDYsIDB4NDM4REM0OTksIDB4MjVEOEVCREMsIDB4MjREN0VBREIsIDB4MjREOEVCREMsIDB4MTNFNUYyRTgsIDB4MjREOEVCREMsIDB4MjREN0VBREIsIDB4Nzc4MEJEOEMsIDB4QkYzMjk1NDYsIDB4OEI0MTlENTMsIDB4MjVENUU5RDksIDB4MjREOEVCREMsIDB4MDdGMEY3RjEsIDB4MjlBREQ0QjUsIDB4QjkzMjk1NDYsIDB4QjczMjk1NDYsIDB4MUZDNEUwQ0EsIDB4MDlFQUY0RUMsIDB4QTMzOTk4NEMsIDB4QkIzMjk1NDYsIDB4QkMzMjk1NDYsIDB4QTczRjlDNTIsIDB4MENFN0YyRTksIDB4MUFCREREQzQsIDB4QjUzMzk1NDcsIDB4QjkzMjk1NDYsIDB4MjNBRkQ2QjcsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MzI5RkNEQTgsIDB4QkIzMjk1NDYsIDB4QkYzMjk1NDYsIDB4OUU0MjlENTUsIDB4MEFFNEYxRTYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjJEQUVDREQsIDB4QkYzMjk1NDYsIDB4QjUzMjk1NDYsIDB4MzJBQUQzQjIsIDB4MzRBNkQxQUUsIDB4OEY0MDlDNTIsIDB4QkYzMjk1NDYsIDB4OTI0RkE0NjAsIDB4MDFGQUZDRkEsIDB4MDBGRkZGRkYsIDB4ODY2RkI0N0QsIDB4QkYzMjk1NDYsIDB4NzE1QUFBNkEsIDB4MjVEOEVCREMsIDB4MjREN0VBREIsIDB4MjVEOEVCREMsIDB4MTdEQUVDREUsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNGNkZBRjYsIDB4NUM3OEI5ODUsIDB4QTMzNTk2NDksIDB4M0M5Q0NDQTYsIDB4MTREN0VBREIsIDB4NjA3NUI4ODIsIDB4QkYzMjk1NDYsIDB4QTE0MDlDNTMsIDB4MDNGOUZDRkEsIDB4MDRGQ0ZERkMsIDB4QUY0MjlENTUsIDB4QkYzMjk1NDYsIDB4NEQ4MUJFOEQsIDB4MkZBMUNFQUEsIDB4Njg3NUI3ODIsIDB4QjczMzk2NDcsIDB4QkUzMjk1NDYsIDB4NkU2N0IwNzUsIDB4MDFGQkZERkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjREN0VBREIsIDB4QkYzMjk1NDYsIDB4QjQzMjk1NDYsIDB4MzFBQ0Q0QjQsIDB4MzRBNEQwQUQsIDB4OTEzRjlDNTIsIDB4QkYzMjk1NDYsIDB4OTA1MUE1NjIsIDB4MDFGQUZDRkIsIDB4MDBGRkZGRkYsIDB4ODg2REIzN0IsIDB4QkYzMjk1NDYsIDB4NkY1Q0FBNkMsIDB4MjVEOEVCREMsIDB4MjREOEVBREIsIDB4MjVEOEVCREMsIDB4MTZEQUVDREUsIDB4MDBGRUZGRkUsIDB4MzdDNEUwQ0EsIDB4QkYzMjk1NDYsIDB4QjkzMjk1NDYsIDB4NEE3RUJDOEIsIDB4MDFGOUZDRkEsIDB4MDBGRkZGRkYsIDB4MDFGOUZCRjksIDB4ODYzRjlDNTIsIDB4QkYzMjk1NDYsIDB4NUU5QkNCQTUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4ODY2RkI0N0QsIDB4QkYzMjk1NDYsIDB4NzE1QUFBNkEsIDB4MkFCMUQ3QjksIDB4NTU4NkMwOTIsIDB4QUMzNzk4NEIsIDB4QkYzMjk1NDYsIDB4OTQ0NDlFNTYsIDB4MDhFRUY2RjAsIDB4MDBGRkZGRkYsIDB4NjM5NEM3OUUsIDB4QkYzMjk1NDYsIDB4OEMzRjlDNTIsIDB4MjVENUU5RDksIDB4MjREN0VBREIsIDB4MjVEOEVCREMsIDB4MUREOEVCREIsIDB4MDBGOUZDRkEsIDB4MTRFOUYzRUIsIDB4QkQzNDk2NDgsIDB4QkEzMjk1NDYsIDB4Mzk5Q0NDQTYsIDB4MzBBREQ1QjUsIDB4ODY0NjlGNTgsIDB4QkYzMjk1NDYsIDB4QTA0MjlENTUsIDB4MDNGNUZBRjYsIDB4MDBGRkZGRkYsIDB4NzY4MEJEOEQsIDB4QkYzMjk1NDYsIDB4NkY1MkE2NjMsIDB4MDBGRkZGRkYsIDB4MEVFRkY3RjEsIDB4QkIzNjk3NEEsIDB4QkUzMjk1NDYsIDB4NkU1Q0FCNkIsIDB4MDVFQ0Y1RUUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NUI2OUIxNzcsIDB4QkYzMjk1NDYsIDB4OEE2QkIyNzksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjVCREREQzMsIDB4QjEzMzk1NDcsIDB4QkUzMjk1NDYsIDB4OUEzQjlBNEYsIDB4NDk4Q0MzOTcsIDB4MjZEMEU3RDUsIDB4MkJCNEQ4QkIsIDB4NUY3MUI2N0YsIDB4QUQzODk4NEIsIDB4Njk1REFDNkQsIDB4MDJFREY1RUYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAyRjdGQkY5LCAweDRBNTdCNDg0LCAweEI2MEY5NjUzLCAweEJGMzNBNTc5LCAweEJGMzVBNzcwLCAweEJGMjNBMTRDLCAweEJGMjE5RjQ5LCAweEJGMUE5QTQ4LCAweEJEMDU5NDQ4LCAweDQ4M0VBODcxLCAweDAwRkJGREZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE4RTVGMkU3LCAweEJDMzM5NTQ3LCAweEJBMzI5NTQ2LCAweDI2QjBENkI4LCAweDAxRkVGRkZFLCAweDAwRkZGRkZGLCAweDBBRERFRUUwLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDMxOTlDQUEzLCAweEJDMzI5NTQ2LCAweEJBMzI5NTQ2LCAweDNFOERDNDk4LCAweDAxRjdGQkY4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkRGRUZFLCAweDI3QUFEM0IzLCAweEIxMzQ5NjQ4LCAweEJFMzI5NTQ2LCAweDRGOERDNDk4LCAweDAwRkZGRkZGLCAweDBBRjVGQUY2LCAweEI3M0E5OTRELCAweEJFMzI5NTQ2LCAweDI1QTNEMEFDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDY2OTJDNzlELCAweEJGMzI5NTQ2LCAweDdGNDU5RjU3LCAweDAxRkNGREZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRjVGQUY2LCAweDkwNDhBMDVBLCAweEJGMzI5NTQ2LCAweDYwNjlCMTc4LCAweDAxRkJGREZDLCAweDVCNzFCNTdGLCAweEJGMzI5NTQ2LCAweEJGMzI5NTQ2LCAweDYyNkRCNDdCLCAweDAwRkZGRkZGLCAweDVDN0FCQTg3LCAweEJGMzI5NTQ2LCAweDg5NENBMjVELCAweDAzRjRGOUY1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RjJGOEYzLCAweDhCNDhBMTVBLCAweEJFMzI5NTQ2LCAweEIwMzI5NTQ2LCAweEJFMzI5NTQ2LCAweDUwNzFCNjdGLCAweDAwRkVGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIyREFFQ0RELCAweEJGMzI5NTQ2LCAweEIyMzI5NTQ2LCAweDExQzdFMkNDLCAweDAwRkZGRkZGLCAweDM5QjFEN0I5LCAweEJGMzI5NTQ2LCAweEE4MzU5NzQ5LCAweDA4REJFQ0RGLCAweDAwRkZGRkZGLCAweDg2NkZCNDdELCAweEJGMzI5NTQ2LCAweDVGNjRBRjczLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkRGRUZELCAweDBERDJFN0Q2LCAweDAxRkNGRUZDLCAweDAwRkZGRkZGLCAweDI4QkNEREMzLCAweEJGMzI5NTQ2LCAweEE1NDA5QzUzLCAweDA0RkFGQ0ZBLCAweDA0RkNGRUZDLCAweEFGNDM5RTU1LCAweEJGMzI5NTQ2LCAweDMyOTRDODlFLCAweDAwRkZGRkZGLCAweDAxRkNGREZDLCAweDRBODVDMDkxLCAweEJDMzI5NTQ2LCAweEI2MzM5NjQ3LCAweDFBQzVFMUNBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI0RDhFQURCLCAweEJGMzI5NTQ2LCAweEIxMzI5NTQ2LCAweDBGQzlFM0NFLCAweDAwRkZGRkZGLCAweDNDQUZENkI3LCAweEJGMzI5NTQ2LCAweEE2MzU5NzQ5LCAweDA3RERFREUwLCAweDAwRkZGRkZGLCAweDg4NkRCMzdCLCAweEJGMzI5NTQ2LCAweDVENjZCMDc1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDM3QzRFMENBLCAweEJGMzI5NTQ2LCAweEJGMzI5NTQ2LCAweEI5MzM5NTQ3LCAweDRBN0NCQjg5LCAweDAxRkFGQ0ZBLCAweDAxRjlGQ0Y5LCAweDg3M0Y5QzUyLCAweEJGMzI5NTQ2LCAweDVFOUJDQkE1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDg2NkZCNDdELCAweEJGMzI5NTQ2LCAweDVGNjRBRjczLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI4QjJEN0I5LCAweEIyMzM5NTQ3LCAweEJFMzI5NTQ2LCAweDQwOTVDODlGLCAweDAwRkZGRkZGLCAweDYzOTRDODlFLCAweEJGMzI5NTQ2LCAweDgxNDM5RTU1LCAweDAxRkNGREZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDE0RTlGNEVCLCAweEJFMzQ5NjQ4LCAweEI5MzI5NTQ2LCAweDFBQjVEOUJDLCAweDAwRkZGRkZGLCAweDI5QzNFMEM5LCAweEJGMzI5NTQ2LCAweEIyMzQ5NjQ4LCAweDBFQ0JFNEQwLCAweDAwRkZGRkZGLCAweDc2ODBCRThELCAweEJGMzI5NTQ2LCAweDZGNTNBNjYzLCAweDAwRkZGRkZGLCAweDBFRjBGN0YxLCAweEJCMzc5ODRBLCAweEJGMzI5NTQ2LCAweEJFMzI5NTQ2LCAweDZENUFBQTZBLCAweDA1RUNGNUVFLCAweDAwRkZGRkZGLCAweDVCNjlCMjc4LCAweEJGMzI5NTQ2LCAweDhBNkJCMzc5LCAweDAwRkZGRkZGLCAweDAyRjFGOEYyLCAweDg3NDhBMDVBLCAweEJGMzI5NTQ2LCAweDhENTRBNzY1LCAweDBEREJFRERFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkZGRkZGLCAweDE3QzNFMEM5LCAweDA3RUVGNkYwLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY2RkJGOCwgMHg0MjU5QjU4NSwgMHhCMzBEOTQ1MiwgMHhCRjMxQTQ3OSwgMHhCRjJEQTM2OCwgMHhCRjFEOUQ0QSwgMHhCRjE5OUE0OCwgMHhCRjBCOTY0OCwgMHg5NzA1OTA0OCwgMHgwOEI5RTBDQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUU2RjJFOCwgMHg5RjM1OTY0OCwgMHhCRjMyOTU0NiwgMHhBNzM1OTc0OSwgMHg2NDY5QjI3OCwgMHgyNkI5REJDMCwgMHgwM0ZBRkNGQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg2OTZGQjQ3RCwgMHhCRjMyOTU0NiwgMHg4NjU2QTc2NywgMHgwM0Y3RkJGOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZERkVGRCwgMHg2Njc2Qjg4MywgMHhCRjMyOTU0NiwgMHg4QTRDQTM1RSwgMHgwMEZFRkVGRSwgMHgwQUY1RkFGNiwgMHhCNzNBOTk0RCwgMHhCRTMyOTU0NiwgMHg1RTc5Qjk4NiwgMHg0N0IzRDhCQiwgMHg0NEIzRDdCQSwgMHgwREVDRjVFRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg2NjkyQzc5RCwgMHhCRjMyOTU0NiwgMHg3RjQ0OUY1NywgMHgwMEZDRkRGQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg0MDg2QzA5MiwgMHhCRTMyOTU0NiwgMHhBNTNCOTk0RSwgMHgwQUU2RjJFOCwgMHgyMkMwREVDNiwgMHhCOTMyOTU0NiwgMHhCQzMyOTU0NiwgMHgyNUIwRDZCNywgMHgwOEVERjVFRSwgMHg5RjQzOUU1NSwgMHhCRDMyOTU0NiwgMHgzRTlGQ0RBOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgzMzlCQ0JBNSwgMHhCQzMyOTU0NiwgMHhBNDM2OTc0OSwgMHg0NzgwQkU4RCwgMHhCRDMyOTU0NiwgMHhBNDM4OTg0QiwgMHgwQ0Q0RTlEOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyMkQ5RUJERCwgMHhCRjMyOTU0NiwgMHhCMzMyOTU0NiwgMHgxQUJFRERDNCwgMHgxN0M2RTFDQiwgMHg3RjRFQTM1RiwgMHhCRjMyOTU0NiwgMHg4NzU2QTg2NywgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHg4NjZGQjQ3RCwgMHhCRjMyOTU0NiwgMHg5QjQwOUM1MiwgMHg3ODZDQjM3QSwgMHg3NzZCQjI3QSwgMHg2MTdBQkE4NywgMHgwMUZERkVGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxRUQxRTdENiwgMHg1MThCQzM5NiwgMHg5QTNDOUE0RiwgMHhCOTMzOTU0NywgMHg0RThFQzQ5OSwgMHgwMEZERkVGRCwgMHgwM0ZCRkRGQywgMHhBRjQyOUQ1NSwgMHhCRjMyOTU0NiwgMHgzMjk0Qzc5RSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUU4RjNFQiwgMHg5RjNCOTk0RSwgMHhCRjMyOTU0NiwgMHg0NzlBQ0JBNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNEQ3RUFEQiwgMHhCRjMyOTU0NiwgMHhCMjMyOTU0NiwgMHgxOUMwREZDNiwgMHgxN0M1RTFDQSwgMHg4MDREQTM1RSwgMHhCRjMyOTU0NiwgMHg4NTU4QTk2OSwgMHgwMEZFRkVGRSwgMHgwMEZGRkZGRiwgMHg4ODZDQjM3QiwgMHhCRjMyOTU0NiwgMHg5QTQwOUM1MywgMHg3ODZDQjM3QSwgMHg3NzZCQjI3OSwgMHg2MDdCQkI4OCwgMHgwMEZERkVGRCwgMHgwMEZGRkZGRiwgMHgzNkM0RTBDOSwgMHhCRjMyOTU0NiwgMHhCQjMyOTU0NiwgMHhCQTMyOTU0NiwgMHhCNzMyOTU0NiwgMHgzRTdCQkI4OCwgMHgwMkYzRjhGNCwgMHg4NjNGOUM1MSwgMHhCRjMyOTU0NiwgMHg1RTlCQ0JBNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg4NjZGQjQ3RCwgMHhCRjMyOTU0NiwgMHg1RjY0QUY3MywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZBRkNGQSwgMHg3NzVBQTk2QSwgMHhCRjMyOTU0NiwgMHg3MzZBQjI3OSwgMHgwMEZGRkZGRiwgMHg2Mzk0Qzc5RSwgMHhCRjMyOTU0NiwgMHhBNzM2OTc0QSwgMHg3ODZCQjI3OSwgMHg3NzZCQjI3QSwgMHg2RjZEQjQ3QiwgMHgwOUVGRjdGMSwgMHgwMEZGRkZGRiwgMHgxNEU5RjRFQiwgMHhCRDM0OTY0OCwgMHhCOTMyOTU0NiwgMHgyM0FFRDVCNiwgMHgxNENERTVEMiwgMHg3MzU3QTg2NywgMHhCRjMyOTU0NiwgMHg5NjQ4QTA1QSwgMHgwMkZCRkRGQiwgMHgwMEZGRkZGRiwgMHg3NTgwQkQ4QywgMHhCRjMyOTU0NiwgMHg2RjUyQTY2MywgMHgwMEZGRkZGRiwgMHgwRUVGRjdGMSwgMHhCQjM3OTc0QSwgMHhCRTMyOTU0NiwgMHhCNzMyOTU0NiwgMHhCRDMyOTU0NiwgMHg2MjVBQUE2QSwgMHgwM0VBRjRFQywgMHg1QjY5QjE3NywgMHhCRjMyOTU0NiwgMHg4QTZCQjI3OSwgMHgwMEZGRkZGRiwgMHgxNERDRURFMCwgMHhCMTMyOTU0NiwgMHhCQjMyOTU0NiwgMHgyRUIwRDZCNywgMHgwMEZGRkZGRiwgMHgwMEZFRkVGRSwgMHgyMkQxRTdENiwgMHg0NkIzRDdCQSwgMHg0N0IzRDhCQSwgMHg0NkIzRDdCQSwgMHg0N0IzRDhCQiwgMHgxOUUzRjBFNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGOEZDRkEsIDB4M0E1OUI1ODYsIDB4QjEwRTk0NTIsIDB4QkYyREEyNzcsIDB4QkYyNkEwNjEsIDB4QkYxODk5NDgsIDB4QkYxMjk3NDgsIDB4QkMwMzkyNDYsIDB4M0MzQ0E3NzAsIDB4MDBGOUZDRkIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkYsIDB4MzNBNkQxQUUsIDB4QUMzODk4NEIsIDB4QkUzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkEzMzk2NDcsIDB4N0U1OEE5NjgsIDB4MEVDREU1RDIsIDB4MDBGRkZGRkYsIDB4ODQ2RkI0N0QsIDB4QkYzMjk1NDYsIDB4NjI2NEFGNzMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NDA4QUMzOTUsIDB4QkYzMjk1NDYsIDB4QTY0QkEyNUQsIDB4MDFGRUZFRkUsIDB4MEFGNUZBRjYsIDB4QjgzQTk5NEQsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkEzMjk1NDYsIDB4MjVDQkU0RDAsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NjY5MkM3OUQsIDB4QkYzMjk1NDYsIDB4N0Y0NTlGNTcsIDB4MDFGQ0ZERkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEJFNkYyRTksIDB4QTQzRjlDNTIsIDB4QkQzMjk1NDYsIDB4M0U5MkM3OUMsIDB4NTA4RkM1OUEsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4NTg3RkJEOEMsIDB4MzRBNUQxQUUsIDB4QkUzMjk1NDYsIDB4QTIzOTk4NEMsIDB4MDlERkVGRTIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDVGMkY4RjMsIDB4OEM0N0EwNTksIDB4QkYzMjk1NDYsIDB4NjA3Q0JCODksIDB4MDhFM0YxRTYsIDB4OUIzQzlBNEYsIDB4QkYzMjk1NDYsIDB4NTM2RkI1N0QsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjJEQUVDREQsIDB4QkYzMjk1NDYsIDB4QkIzMjk1NDYsIDB4QjAzNzk4NEIsIDB4QkEzNDk2NDgsIDB4QkYzMjk1NDYsIDB4QUIzNjk3NEEsIDB4MjdCMUQ3QjksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4ODY2RkI1N0QsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4OUM0NkEwNTgsIDB4MDFGQ0ZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NEY4M0JGOEYsIDB4QkMzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QTczODk4NEMsIDB4MjdDMERGQzYsIDB4MDBGRkZGRkYsIDB4MDRGQ0ZERkMsIDB4QUY0MzlENTUsIDB4QkYzMjk1NDYsIDB4MzI5NEM4OUYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGOUZDRkEsIDB4ODczRjlCNTEsIDB4QkYzMjk1NDYsIDB4NUQ5QkNCQTQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjVEOEVCREMsIDB4QkYzMjk1NDYsIDB4QkIzMjk1NDYsIDB4QjAzNzk4NEIsIDB4QkEzNDk2NDgsIDB4QkYzMjk1NDYsIDB4QUEzNjk3NEEsIDB4MjZCM0Q4QkIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4ODg2REIzN0IsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4OUE0OEExNUEsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MzdDNEUwQ0EsIDB4QkYzMjk1NDYsIDB4QTYzMjk1NDYsIDB4NTI3QUJBODcsIDB4QkEzMjk1NDYsIDB4QjYzMzk2NDcsIDB4NDA3M0I3ODEsIDB4ODczQjlBNEUsIDB4QkYzMjk1NDYsIDB4NUU5QkNDQTUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4ODY2RkI0N0QsIDB4QkYzMjk1NDYsIDB4NUY2NEFGNzMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NUM2OEIxNzcsIDB4QkYzMjk1NDYsIDB4ODk2QkIyNzksIDB4MDBGRkZGRkYsIDB4NjQ5NEM4OUYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QjEzNDk2NDgsIDB4MEZFOUY0RUIsIDB4MDBGRkZGRkYsIDB4MTRFOUY0RUMsIDB4QkUzNDk2NDgsIDB4QkQzMjk1NDYsIDB4QUUzNzk4NEEsIDB4QkEzNTk2NDksIDB4QkYzMjk1NDYsIDB4QjAzNTk3NDksIDB4MzNBMENFQUEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NzY4MEJEOEQsIDB4QkYzMjk1NDYsIDB4NkY1M0E2NjQsIDB4MDBGRkZGRkYsIDB4MEVGMEY3RjEsIDB4QkIzNzk4NEEsIDB4QkMzMjk1NDYsIDB4NDg3M0I3ODAsIDB4QUYzOTk5NEQsIDB4QkQzMjk1NDYsIDB4NjI1OEE5NjksIDB4NUU1NkE4NjcsIDB4QkYzMjk1NDYsIDB4OEI2QkIzN0EsIDB4MDBGRkZGRkYsIDB4MjBEQ0VERTAsIDB4QkUzMjk1NDYsIDB4QjUzMjk1NDYsIDB4MTNDNEUxQ0EsIDB4MDBGRkZGRkYsIDB4MDFGQkZERkMsIDB4ODg0QUExNUIsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4QkYzMjk1NDYsIDB4NDVCNUQ5QkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRjdGQkY5LCAweDMyNUVCNjg3LCAweEFDMEM5MjUxLCAweEJGMkJBMDc1LCAweEJGMUE5QTU3LCAweEJGMEY5NjQ4LCAweEJGMDQ5MzQ3LCAweDhCMDg5MDQ5LCAweDA0RDdFQ0UxLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZFLCAweDEyRENFRERGLCAweDUyODNCRjhGLCAweDkxNEFBMjVDLCAweEJCMzI5NTQ2LCAweEJGMzI5NTQ2LCAweDc3NjNBRTcyLCAweDAxRkVGRkZFLCAweDc2NkZCNDdELCAweEJGMzI5NTQ2LCAweDcyNjNBRTcyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDUwODhDMjk0LCAweEJGMzI5NTQ2LCAweDlBNEJBMjVELCAweDAwRkVGRUZFLCAweDBBRjVGQUY2LCAweEI3M0E5OTRELCAweEJGMzI5NTQ2LCAweDg1NTJBNTYyLCAweDc4NkNCMzdBLCAweDc0NkJCMjdBLCAweDE3REFFQ0RELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDY2OTJDNzlELCAweEJGMzI5NTQ2LCAweDdGNDQ5RjU3LCAweDAwRkNGREZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDVFNkVCNDdDLCAweEJGMzI5NTQ2LCAweDhCNEFBMTVDLCAweDlGMzg5ODRDLCAweEI5MzI5NTQ2LCAweEJCMzI5NTQ2LCAweEEzM0Q5QjUwLCAweDg2NDY5RjU4LCAweEJGMzI5NTQ2LCAweDVENzNCNzgxLCAweDAwRkVGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDM0OUFDQkE0LCAweEJDMzI5NTQ2LCAweEJFMzI5NTQ2LCAweDg5NjBBRDZGLCAweDc4N0VCQzhCLCAweEEwM0Q5QTUwLCAweEJGMzI5NTQ2LCAweEFBMzc5NzRBLCAweDEwRDRFOUQ4LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIyREFFQ0RELCAweEJGMzI5NTQ2LCAweEIyMzI5NTQ2LCAweDVGNDdBMDU5LCAweEJEMzI5NTQ2LCAweEJDMzI5NTQ2LCAweDMxOUVDQ0E3LCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDg2NkZCNDdELCAweEJGMzI5NTQ2LCAweDgyNTFBNTYyLCAweDQ3QjNEOEJBLCAweDQ2QjNEN0JBLCAweDNBQkJEQ0MxLCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEzRDFFN0Q1LCAweDJBQjNEN0JBLCAweDZDNUJBQTZCLCAweEJDMzI5NTQ2LCAweEEzM0I5QTRFLCAweDBCRDVFOUQ5LCAweDA0RkNGREZDLCAweEFGNDI5RDU1LCAweEJGMzI5NTQ2LCAweDMyOTRDNzlFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA0RjhGQkY5LCAweDk5M0U5QjUxLCAweEJGMzI5NTQ2LCAweDRCOUFDQkE0LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI0RDdFQURCLCAweEJGMzI5NTQ2LCAweEIxMzI5NTQ2LCAweDYwNDdBMDU5LCAweEJEMzI5NTQ2LCAweEJCMzI5NTQ2LCAweDMwQTBDRUE5LCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDg4NkRCMzdCLCAweEJGMzI5NTQ2LCAweDgxNTNBNjYzLCAweDQ3QjNEOEJCLCAweDQ3QjNEN0JBLCAweDM5QkJEQ0MyLCAweDAwRkVGRUZFLCAweDAwRkZGRkZGLCAweDM3QzRFMENBLCAweEJGMzI5NTQ2LCAweEE1MzI5NTQ2LCAweDBCRDJFOEQ3LCAweDUzNjRBRjczLCAweEJCMzI5NTQ2LCAweEIzMzI5NTQ2LCAweEE4MzI5NTQ2LCAweEJGMzI5NTQ2LCAweDVFOUJDQkE1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDg2NkZCNDdELCAweEJGMzI5NTQ2LCAweDVGNjRBRjczLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDZGNjdCMDc2LCAweEJGMzI5NTQ2LCAweDc4NkFCMjc5LCAweDAwRkZGRkZGLCAweDYzOTRDNzlFLCAweEJGMzI5NTQ2LCAweDk4M0M5QTRGLCAweDQ3QjFEN0I4LCAweDQ2QjNEN0JBLCAweDQyQjREOEJCLCAweDA1RjdGQkY4LCAweDAwRkZGRkZGLCAweDE0RTlGM0VCLCAweEJEMzQ5NjQ4LCAweEI5MzI5NTQ2LCAweDVBNDdBMDU5LCAweEJCMzI5NTQ2LCAweEJFMzI5NTQ2LCAweDQwOERDNDk4LCAweDAwRkRGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDc2ODBCRDhELCAweEJGMzI5NTQ2LCAweDZGNTJBNjYzLCAweDAwRkZGRkZGLCAweDBFRUZGN0YxLCAweEJCMzY5NzRBLCAweEJDMzI5NTQ2LCAweDFGQUNENEI0LCAweDMyOEFDMjk2LCAweEIwMzM5NTQ3LCAweEJCMzI5NTQ2LCAweEExMzI5NTQ2LCAweEJGMzI5NTQ2LCAweDhBNkJCMjc5LCAweDAwRkZGRkZGLCAweDE4RENFREUwLCAweEI1MzI5NTQ2LCAweEI4MzI5NTQ2LCAweDIxQzNFMEM4LCAweDAwRkZGRkZGLCAweDA5RENFRERGLCAweDZFNkRCMzdCLCAweDc3NkJCMjdBLCAweDdBNjZCMDc1LCAweEIxMzI5NTQ2LCAweEJGMzI5NTQ2LCAweDQ1QjREOEJDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUY4RkNGQSwgMHgyQTVFQjU4OCwgMHhBODBCOTI1MCwgMHhCRjI2OUU3MSwgMHhCRjEwOTc1MCwgMHhCRjA3OTQ0NywgMHhCQjAzOTA0NywgMHgyRTg2QzhBNiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZBRkNGQiwgMHgwMUYyRjlGMywgMHgwMEZGRkZGRiwgMHgwNEY0RkFGNSwgMHg0RjdEQkM4QSwgMHhCRjMyOTU0NiwgMHhBQjNCOUE0RSwgMHgwOUUyRjBFNCwgMHg0ODgwQkQ4QywgMHhCRTMyOTU0NiwgMHhBRDM2OTc0QSwgMHgxQUMxREZDNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUVGRjdGMSwgMHg5NzQ2OUY1OCwgMHhCRjMyOTU0NiwgMHg2QjVDQUI2QywgMHgwMEZFRkZGRSwgMHgwQUY1RkFGNiwgMHhCNzNBOTk0RCwgMHhCRTMyOTU0NiwgMHgyNUEzRDBBQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg2NjkyQzc5RCwgMHhCRjMyOTU0NiwgMHg3RjQ1OUY1NywgMHgwMUZDRkRGQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxOUNCRTREMCwgMHhCMzMzOTU0NywgMHhCRTMyOTU0NiwgMHhCRjMyOTU0NiwgMHg3RDUwQTU2MSwgMHg3QTUwQTU2MSwgMHhCRjMyOTU0NiwgMHhCRTMyOTU0NiwgMHhCMzM1OTc0OSwgMHgxN0M1RTFDQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNEYwRjdGMSwgMHg4RDQ3QTA1OSwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRTMyOTU0NiwgMHg1QzcwQjU3RSwgMHgwMEZDRkVGRCwgMHgwMEZGRkZGRiwgMHgyMkRBRUNERCwgMHhCRjMyOTU0NiwgMHhCMjMyOTU0NiwgMHgxNkI5REJDMCwgMHg4QjQ3QTA1OSwgMHhCRjMyOTU0NiwgMHg4QTRBQTE1QywgMHgwNkVFRjdGMCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg4NjZGQjQ3RCwgMHhCRjMyOTU0NiwgMHg1RjY0QUY3MywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkZGRSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkUyRjBFNSwgMHhBMDNDOUE0RiwgMHhCQjMyOTU0NiwgMHgyQUMwREVDNiwgMHgwNEZDRkVGQywgMHhBRjQzOUU1NSwgMHhCRjMyOTU0NiwgMHgzMjk0Qzg5RSwgMHgwMEZGRkZGRiwgMHgwMEZDRkRGQywgMHgzOThBQzM5NiwgMHhCQTMzOTU0NywgMHhCOTMzOTY0NywgMHgyMUM0RTFDQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNEQ4RUFEQiwgMHhCRjMyOTU0NiwgMHhCMTMyOTU0NiwgMHgxNkJBREJDMCwgMHg4QzQ2OUY1OCwgMHhCRjMyOTU0NiwgMHg4OTRCQTI1RCwgMHgwNkVGRjdGMSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg4ODZEQjM3QiwgMHhCRjMyOTU0NiwgMHg1RDY2QjA3NSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgzN0M0RTBDQSwgMHhCRjMyOTU0NiwgMHhBNTMyOTU0NiwgMHgwOURERURFMCwgMHgwMkYyRjhGMywgMHg1NTY2QjA3NSwgMHhCQzMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHg1RTlCQ0JBNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg4NjZGQjQ3RCwgMHhCRjMyOTU0NiwgMHg1RjY0QUY3MywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkIzRDhCQiwgMHhBQzM3OTg0QiwgMHhCRTMyOTU0NiwgMHg0ODk1Qzg5RiwgMHgwMEZGRkZGRiwgMHg2Mzk0Qzg5RSwgMHhCRjMyOTU0NiwgMHg4MTQzOUU1NSwgMHgwMUZDRkRGQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxNEU5RjRFQiwgMHhCRTM0OTY0OCwgMHhCOTMyOTU0NiwgMHgxREFFRDVCNiwgMHg3RTUyQTU2MywgMHhCRjMyOTU0NiwgMHg5NzQzOUU1NSwgMHgwQUU0RjFFNywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg3NjgwQkU4RCwgMHhCRjMyOTU0NiwgMHg2RjUzQTY2MywgMHgwMEZGRkZGRiwgMHgwRUYwRjdGMSwgMHhCQjM3OTg0QSwgMHhCQzMyOTU0NiwgMHgxRkFERDVCNSwgMHgwMEZDRkRGQywgMHgzMzhCQzM5NywgMHhCMzMyOTU0NiwgMHhCRjMyOTU0NiwgMHhCRjMyOTU0NiwgMHg4QTZCQjM3OSwgMHgwMEZGRkZGRiwgMHgwNUYxRjhGMiwgMHg5NzQ4QTA1OSwgMHhCRjMyOTU0NiwgMHg2RDVDQUI2QywgMHgwMkZBRkRGQiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkVBRjRFQywgMHg5QjM0OTY0OCwgMHhCRjMyOTU0NiwgMHg0NUI1RDhCQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGOEZCRjksIDB4MjU1RkI3OEEsIDB4QTIwQTkxNTAsIDB4QkYyMzlDNkIsIDB4QkYwNjkzNEEsIDB4QkYwMTkxNDcsIDB4ODAyMDlCNUMsIDB4MDNGMUY5RjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGQUZDRkEsIDB4NDY4MEJEOEMsIDB4NUQ2MkFFNzEsIDB4MDdFMkYwRTQsIDB4MDJGNUZBRjYsIDB4NEM4MkJFOEUsIDB4QkYzMjk1NDYsIDB4QTczRTlCNTEsIDB4MDdFN0YzRTksIDB4MENEOUVCREMsIDB4QTAzNzk4NEIsIDB4QkYzMjk1NDYsIDB4OTc0REEzNUUsIDB4MjdCM0Q3QkEsIDB4MDNGN0ZCRjgsIDB4MDBGQ0ZERkMsIDB4MThDMURGQzcsIDB4ODA1REFCNkQsIDB4QkUzMjk1NDYsIDB4QjAzODk4NEMsIDB4MURDMERFQzYsIDB4MDBGRkZGRkYsIDB4MEFGNUZBRjYsIDB4QjczQTk5NEQsIDB4QkUzMjk1NDYsIDB4MjVBM0NGQUMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NjY5MkM3OUQsIDB4QkYzMjk1NDYsIDB4N0Y0NDlGNTcsIDB4MDBGQ0ZERkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGQ0ZFRkQsIDB4Nzc1RUFDNkUsIDB4QkYzMjk1NDYsIDB4QkIzMjk1NDYsIDB4MkRCMUQ2QjgsIDB4MkNCNkQ5QkQsIDB4QkEzMjk1NDYsIDB4QkYzMjk1NDYsIDB4N0E2MkFFNzEsIDB4MDFGQ0ZERkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MzU5OUNBQTMsIDB4QkQzMjk1NDYsIDB4QjkzNDk2NDcsIDB4NTc4N0MxOTIsIDB4NDZBMENFQTksIDB4NDdBMUNFQUEsIDB4NDZBMENFQTksIDB4NzM2RkI1N0QsIDB4QkUzMjk1NDYsIDB4QUMzNjk3NDksIDB4MTNEMkU4RDYsIDB4MDBGRkZGRkYsIDB4MjJEOUVCREQsIDB4QkYzMjk1NDYsIDB4QjIzMjk1NDYsIDB4MTBDNkUyQ0MsIDB4MjJDMERFQzYsIDB4QjMzNTk2NDgsIDB4QkQzMjk1NDYsIDB4NTM3Q0JCODksIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4ODY2RkI0N0QsIDB4QkYzMjk1NDYsIDB4NkM1QUFBNkEsIDB4MUJEOEVCREMsIDB4MUFEN0VBREIsIDB4MUJEOEVCREMsIDB4MUFEN0VBREIsIDB4MDVGM0Y5RjQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MUZDNkUxQ0IsIDB4NzA2NEFGNzMsIDB4MEZEREVFRTAsIDB4MDBGRkZGRkYsIDB4MTlDOEUzQ0UsIDB4QUQzNzk3NEEsIDB4QkIzMjk1NDYsIDB4MjhCRkRFQzYsIDB4MDNGQkZERkMsIDB4QUY0MjlENTUsIDB4QkYzMjk1NDYsIDB4NDY4MUJFOEQsIDB4MUZEMkU3RDYsIDB4NTE3NkI4ODMsIDB4QjAzMzk2NDcsIDB4QkUzMjk1NDYsIDB4N0E1OEE4NjgsIDB4MDJGMUY4RjMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MjREN0VBREIsIDB4QkYzMjk1NDYsIDB4QjEzMjk1NDYsIDB4MEZDOUUzQ0UsIDB4MjNCRUREQzQsIDB4QjQzNDk2NDgsIDB4QkQzMjk1NDYsIDB4NTI3RkJEOEIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4ODg2Q0IzN0IsIDB4QkYzMjk1NDYsIDB4NkE1Q0FCNkMsIDB4MUJEOEVCREMsIDB4MUFEN0VBREIsIDB4MUJEOEVCREMsIDB4MUFEN0VBREIsIDB4MDVGM0Y5RjQsIDB4MzZDNEUwQzksIDB4QkYzMjk1NDYsIDB4QTUzMjk1NDYsIDB4MDlEQ0VERTAsIDB4MDBGRkZGRkYsIDB4MDNGMkY4RjQsIDB4NUY2NkIwNzUsIDB4QkMzMjk1NDYsIDB4QkYzMjk1NDYsIDB4NUU5QkNCQTUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4ODY2RkI0N0QsIDB4QkYzMjk1NDYsIDB4NkM1QUFBNkEsIDB4MUNEOEVCREMsIDB4M0Y5MkM2OUMsIDB4OUYzNzk4NEIsIDB4QkYzMjk1NDYsIDB4OUQ0MTlENTQsIDB4MEFEN0VBREIsIDB4MDBGRkZGRkYsIDB4NjM5NEM3OUUsIDB4QkYzMjk1NDYsIDB4ODkzRjlDNTIsIDB4MUNENUU5RDksIDB4MUFEOEVBREIsIDB4MUJEOEVCREMsIDB4MUFEN0VBREIsIDB4MDlFQ0Y1RUQsIDB4MTRFOUY0RUIsIDB4QkQzNDk2NDgsIDB4QjkzMjk1NDYsIDB4MUFCNUQ5QkMsIDB4MThDRkU2RDQsIDB4QUQzNzk4NEEsIDB4QkUzMjk1NDYsIDB4NjM2REIzN0IsIDB4MDBGREZFRkQsIDB4MDBGRkZGRkYsIDB4NzU4MEJEOEMsIDB4QkYzMjk1NDYsIDB4NkY1MkE2NjMsIDB4MDBGRkZGRkYsIDB4MEVFRkY3RjEsIDB4QkIzNzk3NEEsIDB4QkMzMjk1NDYsIDB4MUZBQ0Q0QjQsIDB4MDBGRkZGRkYsIDB4MDFGQ0ZERkMsIDB4M0Q4Q0M0OTcsIDB4QjQzMzk1NDYsIDB4QkYzMjk1NDYsIDB4OEE2QkIyNzksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4NDA4QkMzOTYsIDB4QkIzMjk1NDYsIDB4QjkzMzk1NDcsIDB4NUY3OUJBODYsIDB4MEZEM0U4RDcsIDB4MDBGQkZERkIsIDB4MDJGOUZDRjksIDB4MjVBRUQ1QjYsIDB4QTgzMjk1NDYsIDB4QkYzMjk1NDYsIDB4NDVCNUQ4QkMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRjlGQ0ZBLCAweDFGQTNENUJCLCAweDlFMTM5NTU3LCAweEJGMTg5NzYwLCAweEJGMDI5MTQ4LCAweEI2MDI4RjQ2LCAweDI1OEZDQ0FELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDIxQjNEOEJBLCAweEI0MzI5NTQ2LCAweEJFMzI5NTQ2LCAweEEyM0M5QTRGLCAweDk3NEFBMjVDLCAweEI4MzI5NTQ2LCAweEJGMzI5NTQ2LCAweDY4NkNCMzdBLCAweDAxRkZGRkZGLCAweDAwRkRGRUZFLCAweDJEOUNDQ0E2LCAweEFDMzQ5NjQ4LCAweEJGMzI5NTQ2LCAweEI4MzI5NTQ2LCAweDlENENBMzVELCAweDk2NTBBNTYxLCAweEIyMzM5NjQ3LCAweEJGMzI5NTQ2LCAweEIzMzM5NjQ3LCAweDNDODNCRjhGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDBBRjVGQUY2LCAweEI4M0E5OTRELCAweEJFMzI5NTQ2LCAweDI1QTNDRkFDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDY2OTJDNzlELCAweEJGMzI5NTQ2LCAweDdGNDU5RjU3LCAweDAxRkNGREZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDJDQUJEM0IzLCAweEJDMzM5NjQ3LCAweDkxM0Y5QzUxLCAweDA1RjJGOUY0LCAweDAzRUJGNUVELCAweDhGNDM5RTU1LCAweEJBMzI5NTQ2LCAweDJGQTREMEFELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RUVGNkYwLCAweDhFNDU5RjU3LCAweEJGMzI5NTQ2LCAweDgxNUNBQjZDLCAweDAyRkJGREZDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDEwRTJGMEU1LCAweEE5M0I5OTRFLCAweEJGMzI5NTQ2LCAweDY2NzBCNTdFLCAweDAxRkRGRUZELCAweDIyREFFQ0RELCAweEJGMzI5NTQ2LCAweEIzMzI5NTQ2LCAweDEwQzdFMkNDLCAweDAwRkNGREZDLCAweDVDNkFCMjc5LCAweEJFMzI5NTQ2LCAweEIxMzg5ODRCLCAweDIxQkFEQkMxLCAweDAwRkZGRkZGLCAweDg2NkZCNTdELCAweEJGMzI5NTQ2LCAweEJCMzI5NTQ2LCAweEI3MzI5NTQ2LCAweEI3MzI5NTQ2LCAweEI3MzI5NTQ2LCAweEE0Mzg5ODRCLCAweDBDREJFRERGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA1RjNGOUY0LCAweDkwNDdBMDU5LCAweEJGMzI5NTQ2LCAweEE1M0I5QTRFLCAweDgxNTJBNjYzLCAweEE3Mzc5ODRCLCAweEJGMzI5NTQ2LCAweDlBNDM5RTU2LCAweDA4RERFRUUwLCAweDA0RkNGREZDLCAweEFGNDM5RDU1LCAweEJGMzI5NTQ2LCAweEI5MzI5NTQ2LCAweEJBMzI5NTQ2LCAweEJGMzI5NTQ2LCAweEJFMzI5NTQ2LCAweDg2NThBOTY5LCAweDBFRUFGNEVDLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDI1RDhFQkRDLCAweEJGMzI5NTQ2LCAweEIxMzI5NTQ2LCAweDEwQzlFM0NFLCAweDAxRkJGREZDLCAweDVFNjhCMTc3LCAweEJFMzI5NTQ2LCAweEIxMzg5ODRCLCAweDIwQkNEQ0MzLCAweDAwRkZGRkZGLCAweDg4NkRCMzdCLCAweEJGMzI5NTQ2LCAweEJCMzI5NTQ2LCAweEI3MzI5NTQ2LCAweEI3MzI5NTQ2LCAweEI3MzI5NTQ2LCAweEEzMzk5OTRDLCAweDBCRERFREUwLCAweDM3QzRFMENBLCAweEJGMzI5NTQ2LCAweEE2MzI5NTQ2LCAweDA5RENFREUwLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRjNGOUY0LCAweDYwNjhCMTc3LCAweEJEMzI5NTQ2LCAweDVFOUJDQ0E1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDg2NkZCNDdELCAweEJGMzI5NTQ2LCAweEJCMzI5NTQ2LCAweEI4MzI5NTQ2LCAweEJGMzI5NTQ2LCAweEJGMzI5NTQ2LCAweDlGNDI5RDU0LCAweDIwRDFFN0Q1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDY0OTRDODlGLCAweEJGMzI5NTQ2LCAweEJDMzI5NTQ2LCAweEI3MzI5NTQ2LCAweEI3MzI5NTQ2LCAweEI3MzI5NTQ2LCAweEIxMzI5NTQ2LCAweDIwQkNEREMzLCAweDE0RTlGNEVDLCAweEJFMzQ5NjQ4LCAweEI5MzI5NTQ2LCAweDFBQjVEOUJELCAweDAwRkVGRkZGLCAweDRENzlCQTg2LCAweEJEMzI5NTQ2LCAweEI3MzU5NzQ5LCAweDJEQUJENEIzLCAweDAwRkZGRkZGLCAweDc2ODBCRDhELCAweEJGMzI5NTQ2LCAweDZGNTNBNjY0LCAweDAwRkZGRkZGLCAweDBFRjBGN0YxLCAweEJCMzc5ODRBLCAweEJDMzI5NTQ2LCAweDFGQUNENEI1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAxRkNGREZDLCAweDNEOEVDNTk5LCAweEI2MzM5NTQ3LCAweDhCNkJCMzdBLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAzRjJGOEYzLCAweDY1NUZBRDZGLCAweEJCMzM5NTQ2LCAweEJGMzI5NTQ2LCAweEFEMzI5NTQ2LCAweDk1NEZBNDYxLCAweDlCNERBMzVGLCAweEI3MzI5NTQ2LCAweEJGMzI5NTQ2LCAweEI5MzQ5NjQ4LCAweDM3QkVERUM1LCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgxQkFDRDlDMiwgMHg5NzEyOTQ1NSwgMHhCRjBEOTM1NCwgMHhCRTAxOEY0NiwgMHg3MjIwOTk1QSwgMHgwMUVFRjdGMiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkZBRkNGQSwgMHg0RTgwQkQ4RCwgMHhBQTM4OTg0QywgMHhCQjMyOTU0NiwgMHhCRTMyOTU0NiwgMHhCMjMyOTU0NiwgMHg2RjY5QjE3OCwgMHgwQkRBRUNERSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZFRkZGRSwgMHgxREM2RTFDQywgMHg3QjUwQTU2MSwgMHhCMDM1OTc0OSwgMHhCQzMyOTU0NiwgMHhCQzMyOTU0NiwgMHhCMzMzOTY0NywgMHg4NzQ4QTA1QSwgMHgyOUIxRDdCOSwgMHgwMEY5RkNGQSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwOUY1RkFGNiwgMHhBNjQwOUM1MywgMHhBMjQ5QTE1QSwgMHgxRUFERDVCNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg1RDkyQzc5RCwgMHhBQTQ0OUU1NiwgMHg2ODU5QTk2OSwgMHgwMEZDRkRGQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNEYxRjhGMiwgMHg5MTNEOUI1MCwgMHg0MjhGQzU5QSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgzRTk0Qzg5RSwgMHg5NTQxOUQ1NCwgMHgwNEYyRjlGNCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyMUFGRDVCNiwgMHg5RDQ1OUY1NywgMHhBRDM0OTY0OCwgMHgyOUJCRENDMiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg1ODg2QzA5MiwgMHhBRjNBOTk0RCwgMHg4ODRBQTE1QywgMHgwOUQ5RUJERCwgMHgyMERBRUNERCwgMHhBQzNEOUI1MCwgMHg5NDQ4QTA1QSwgMHgwRENERTVEMiwgMHgwMEZGRkZGRiwgMHgwOUUwRUZFMywgMHg5MzQyOUQ1NCwgMHhBMjNFOUI1MCwgMHg0QTgzQkY4RiwgMHgwMEZGRkZGRiwgMHg3NzdFQkM4QiwgMHhBQTQ5QTE1QSwgMHhBQTQ4QTA1QSwgMHhBQTQ4QTE1QSwgMHhBQTQ4QTA1QSwgMHhBQTQ5QTE1QSwgMHg2QTZBQjI3OCwgMHgwMUZDRkRGQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyNkM0RTFDQSwgMHg5MzQ0OUU1NiwgMHhCODMyOTU0NiwgMHhCRTMyOTU0NiwgMHhCODMyOTU0NiwgMHg5MDRCQTI1QywgMHgxREQzRThENywgMHgwMEZGRkZGRiwgMHgwM0ZDRkVGQywgMHg5QzU3QTg2NywgMHhBQTQ4QTE1QSwgMHhBQTQ4QTA1QSwgMHhBNTQ5QTE1QSwgMHg4NDRDQTI1RCwgMHg0NDhFQzU5OSwgMHgwNkVBRjRFQywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgyMUQ3RUFEQiwgMHhBQzNEOUI1MCwgMHg5MzQ4QTA1QSwgMHgwQ0NGRTZEMywgMHgwMEZGRkZGRiwgMHgwQURGRUZFMiwgMHg5NDQxOUQ1NCwgMHhBMTNFOUI1MSwgMHg0OTg1QzA5MSwgMHgwMEZGRkZGRiwgMHg3OTdDQkI4OSwgMHhBQTQ4QTE1QSwgMHhBQTQ4QTA1QSwgMHhBQTQ5QTE1QSwgMHhBQTQ4QTA1QSwgMHhBQTQ4QTE1QSwgMHg2ODZCQjI3OSwgMHgwMUZDRkVGRCwgMHgzMkM0RTBDQSwgMHhBQzNGOUM1MiwgMHg4ODQ4QTA1QSwgMHgwN0UwRUZFMywgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNUYzRjlGNCwgMHg2QjY5QjE3NywgMHg1QzlCQ0JBNSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg3NzdFQkM4QiwgMHhBQTQ4QTE1QSwgMHhBQTQ4QTA1QSwgMHhBODQ5QTE1QSwgMHg4RTQ4QTA1QSwgMHg1NjdGQkQ4QywgMHgwRkQyRThENiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHg1ODlGQ0RBOSwgMHhBQTQ5QTE1QSwgMHhBQTQ4QTA1QSwgMHhBQTQ4QTE1QSwgMHhBQTQ4QTA1QSwgMHhBQTQ5QTE1QSwgMHg4NTU2QTg2NywgMHgwNEVFRjZGMCwgMHgxMkU5RjNFQiwgMHhBQjNEOUI1MCwgMHg5QjQ4QTA1QSwgMHgxNEJERERDMywgMHgwMEZGRkZGRiwgMHgwNkVCRjVFRCwgMHg4NzQ5QTE1QiwgMHhBNTNDOUE0RiwgMHg1NTc1Qjg4MywgMHgwMUZERkVGRCwgMHg2QjgwQkQ4RCwgMHhBODQ2QTA1OCwgMHg1OTY1QUY3NCwgMHgwMEZGRkZGRiwgMHgwREVGRjdGMSwgMHhBOTNFOUI1MSwgMHg5RTQ4QTA1QSwgMHgxOUI1RDlCRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMUZERkVGRCwgMHg0ODhFQzQ5OSwgMHg4MzZDQjM3QSwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMkZDRkRGQywgMHgzQ0EwQ0RBOSwgMHg5MzQ0OUY1NywgMHhCNTMyOTU0NiwgMHhCRTMyOTU0NiwgMHhCQzMyOTU0NiwgMHhCMjM1OTY0OCwgMHg4NjREQTM1RSwgMHgyRkE2RDFBRiwgMHgwMUZDRkVGRCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MTVBRURBQzMsIDB4OTExMjkzNTIsIDB4QkUwNDhFNDcsIDB4QjEwMzhENDYsIDB4MUI4RkNDQUQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MEREQUVDREUsIDB4MjdDQ0U1RDEsIDB4MkNDREU1RDIsIDB4MTVDQ0U1RDEsIDB4MDFGOEZCRjgsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZGRkUsIDB4MTJENEU5RDgsIDB4MkFDREU1RDIsIDB4MkFDQ0U1RDEsIDB4MTZDRUU2RDMsIDB4MDFGQkZERkIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkQsIDB4MDhEREVERTAsIDB4MDJGRUZGRkUsIDB4MDBGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDdFNEYxRTcsIDB4MDNGNUZBRjYsIDB4MDFGRUZGRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MzA5OENBQTIsIDB4MDlFN0YyRTksIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDlFRUY2RUYsIDB4MkY5MUM2OUMsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRkZGRkYsIDB4MDJGN0ZCRjgsIDB4MEZEMUU3RDUsIDB4MDBGREZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDZFQkY1RUQsIDB4MENEREVFRTEsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDJGNkZBRjcsIDB4MDZFNEYxRTcsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MENFMkYwRTUsIDB4MDVFNkYyRTgsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDFGRUZFRkUsIDB4MDJGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDJGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDJGRUZGRkUsIDB4MDFGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDRFRUY2RjAsIDB4MUZDREU1RDIsIDB4MkVDQ0U1RDEsIDB4MUZDREU1RDIsIDB4MDRGNEY5RjUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkUsIDB4MDJGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDJGRUZGRkUsIDB4MDFGREZFRkUsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDJGNUZBRjYsIDB4MDZFNUYyRTcsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MENFMUYwRTQsIDB4MDVFNkYyRTksIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDFGRUZFRkUsIDB4MDJGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDJGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDJGRUZFRkUsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDRGMEY3RjIsIDB4MDVFOUY0RUIsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDRGM0Y5RjUsIDB4MUVDRUU2RDIsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZFRkUsIDB4MDJGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDJGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGRUZFRkUsIDB4MDJGRUZGRkUsIDB4MDFGREZFRkQsIDB4MDJGRUZFRkUsIDB4MDFGREZFRkQsIDB4MDJGRUZGRkUsIDB4MDFGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDFGOUZDRkEsIDB4MDdFMUVGRTQsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MEJFNkYyRTksIDB4MDdFMkYwRTQsIDB4MDBGRUZFRkUsIDB4MDBGRkZGRkYsIDB4MDdFMEVGRTMsIDB4MDJGOUZDRkEsIDB4MDBGREZFRkUsIDB4MDBGRkZGRkYsIDB4MDFGQkZERkMsIDB4MDdERkVGRTIsIDB4MDFGREZFRkQsIDB4MDFGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDFGREZFRkQsIDB4MjJDNEUxQ0EsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDNFRkY3RjAsIDB4MUFDQ0U1RDEsIDB4MkNDREU1RDIsIDB4MjhDQ0U1RDEsIDB4MTREMkU4RDYsIDB4MDFGREZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRUZFLCAweDExQjBEQkM1LCAweDhBMEM5MDRDLCAweEJFMDI4RDQ1LCAweDY1MUI5NzU4LCAweDAxRURGN0YyLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkVGRkZFLCAweDAwRkVGRkZFLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkRGRUZELCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwRUIxRENDNiwgMHg4MjBGOTI0RiwgMHhBQTAxOEM0NSwgMHgxNTkxQ0RBRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRUZGRkUsIDB4MEFFMUYxRTksIDB4NzgzMkEyNjgsIDB4NTgzRUE3NzAsIDB4MDBGQ0ZFRkQsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDA4RTdGNEVELCAweDVDMzZBMzZCLCAweDBDQzRFNEQzLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwNkM5RTdEOCwgMHgwNkUwRjFFOCwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCQkweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCAKKwkJMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgCisJCTB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGNUZBRjgsIDB4MDVGNEZBRjcsIDB4MDFGOEZDRkEsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIAorCX07CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvTWFpbi9SZWdpc3Rlci5jcHAgYi9zcmMvTWFpbi9SZWdpc3Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhYTk2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL1JlZ2lzdGVyLmNwcApAQCAtMCwwICsxLDQ2IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJSZWdpc3Rlci5ocHAiCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBTRVJJQUxfUFJFRklYICJTUyIKKyNkZWZpbmUgQ0hFQ0tTVU1fS0VZICJTaGFkZXJDb3JlIgorCisvLyBUaGUgQXBwIG5hbWUgKioqTVVTVCoqKiBiZSBpbiBsb3dlcmNhc2UhCitjb25zdCBjaGFyIHJlZ2lzdGVyZWRBcHBbMzJdID0gU0NSQU1CTEUzMSgiY2hyb21lXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiLCBBUFBOQU1FX1NDUkFNQkxFKTsKKworY2hhciB2YWxpZGF0aW9uS2V5WzMyXTsgICAvLyBTZXJpYWwgcHJvdmlkZWQgYnkgYXBwbGljYXRpb24KK2NoYXIgdmFsaWRhdGlvbkFwcFszMl07ICAgLy8gQXBwbGljYXRpb24gbmFtZQorCit2b2lkIEluaXRWYWxpZGF0aW9uQXBwKHZvaWQpCit7CisJY2hhciBleGVQYXRoW01BWF9QQVRIKjEwXTsKKwljaGFyIGZpbGVOYW1lW19NQVhfRk5BTUVdOworCUdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIGV4ZVBhdGgsIHNpemVvZihleGVQYXRoKSk7CisJX3NwbGl0cGF0aChleGVQYXRoLCAwLCAwLCBmaWxlTmFtZSwgMCk7CisJX3N0cmx3cihmaWxlTmFtZSk7CisJbWVtc2V0KHZhbGlkYXRpb25BcHAsICdcMCcsIHNpemVvZih2YWxpZGF0aW9uQXBwKSk7CisJc3RybmNweSh2YWxpZGF0aW9uQXBwLCBmaWxlTmFtZSwgc3RybGVuKGZpbGVOYW1lKSk7Cit9CisKK2V4dGVybiAiQyIKK3sKKwl2b2lkIF9fc3RkY2FsbCBSZWdpc3RlcihjaGFyICpsaWNlbnNlS2V5KQorCXsKKwkJSW5pdFZhbGlkYXRpb25BcHAoKTsKKwkJbWVtc2V0KHZhbGlkYXRpb25LZXksICdcMCcsIHNpemVvZih2YWxpZGF0aW9uS2V5KSk7CisJCXN0cm5jcHkodmFsaWRhdGlvbktleSwgbGljZW5zZUtleSwgc3RybGVuKGxpY2Vuc2VLZXkpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvTWFpbi9SZWdpc3Rlci5ocHAgYi9zcmMvTWFpbi9SZWdpc3Rlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjYjk1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL1JlZ2lzdGVyLmhwcApAQCAtMCwwICsxLDM1IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZiBSZWdpc3Rlcl9ocHANCisjZGVmaW5lIFJlZ2lzdGVyX2hwcA0KKw0KKyNkZWZpbmUgU0VSSUFMX1BSRUZJWCAiU1MiDQorI2RlZmluZSBDSEVDS1NVTV9LRVkgIlNoYWRlckNvcmUiDQorDQorI2RlZmluZSBBUFBOQU1FX1NDUkFNQkxFICI4Z2JkZiYqYmIwMG5uajl2I0AzLi0sbDhnYzN4LixwIg0KKyNkZWZpbmUgU0NSQU1CTEUzMSh4LCB5KSB7eFswXV55WzBdLCB4WzFdXnlbMV0sIHhbMl1eeVsyXSwgeFszXV55WzNdLCB4WzRdXnlbNF0sIHhbNV1eeVs1XSwgeFs2XV55WzZdLCB4WzddXnlbN10sIHhbOV1eeVs5XSwgeFsxMF1eeVsxMF0sIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHhbMTFdXnlbMTFdLCB4WzEyXV55WzEyXSwgeFsxM11eeVsxM10sIHhbMTRdXnlbMTRdLCB4WzE1XV55WzE1XSwgeFsxNl1eeVsxNl0sIHhbMTddXnlbMTddLCB4WzE4XV55WzE4XSwgeFsxOV1eeVsxOV0sIHhbMjBdXnlbMjBdLCBcDQorCQkJCQkgICAgICB4WzIxXV55WzIxXSwgeFsyMl1eeVsyMl0sIHhbMjNdXnlbMjNdLCB4WzI0XV55WzI0XSwgeFsyNV1eeVsyNV0sIHhbMjZdXnlbMjZdLCB4WzI3XV55WzI3XSwgeFsyOF1eeVsyOF0sIHhbMjldXnlbMjldLCB4WzMwXV55WzMwXSwgMH07DQorDQorZXh0ZXJuIGNvbnN0IGNoYXIgcmVnaXN0ZXJlZEFwcFszMl07DQorDQorZXh0ZXJuIGNoYXIgdmFsaWRhdGlvbktleVszMl07DQorZXh0ZXJuIGNoYXIgdmFsaWRhdGlvbkFwcFszMl07DQorDQordm9pZCBJbml0VmFsaWRhdGlvbkFwcCgpOw0KKw0KK2V4dGVybiAiQyINCit7DQorCXZvaWQgX19zdGRjYWxsIFJlZ2lzdGVyKGNoYXIgKmxpY2Vuc2VLZXkpOw0KK30NCisNCisjZW5kaWYgICAvLyBSZWdpc3Rlcl9ocHANCmRpZmYgLS1naXQgYS9zcmMvTWFpbi9Td2lmdENvbmZpZy5jcHAgYi9zcmMvTWFpbi9Td2lmdENvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3MjgxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL1N3aWZ0Q29uZmlnLmNwcApAQCAtMCwwICsxLDgzNiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiU3dpZnRDb25maWcuaHBwIgorCisjaW5jbHVkZSAiQ29uZmlndXJhdG9yLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKyNpbmNsdWRlICJWZXJzaW9uLmgiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpZiBQRVJGX1BST0ZJTEUKK2V4dGVybiBQcm9maWxlciBwcm9maWxlcjsKKyNlbmRpZgorCituYW1lc3BhY2Ugc3cKK3sKKwlzdGQ6OnN0cmluZyBpdG9hKGludCBudW1iZXIpCisJeworCQlzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKwkJc3MgPDwgbnVtYmVyOworCQlyZXR1cm4gc3Muc3RyKCk7CisJfQorCQorCXN0ZDo6c3RyaW5nIGZ0b2EoZG91YmxlIG51bWJlcikKKwl7CisJCXN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCQlzcyA8PCBudW1iZXI7CisJCXJldHVybiBzcy5zdHIoKTsKKwl9CisKKwlTd2lmdENvbmZpZzo6U3dpZnRDb25maWcoYm9vbCBkaXNhYmxlU2VydmVyT3ZlcnJpZGUpCisJeworCQlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZjcml0aWNhbFNlY3Rpb24pOworCisJCXJlYWRDb25maWd1cmF0aW9uKGRpc2FibGVTZXJ2ZXJPdmVycmlkZSk7CisKKwkJaWYoIWRpc2FibGVTZXJ2ZXJPdmVycmlkZSkKKwkJeworCQkJd3JpdGVDb25maWd1cmF0aW9uKCk7CisJCX0KKworCQlyZWNlaXZlQnVmZmVyID0gMDsKKworCQlpZighY29uZmlnLmRpc2FibGVTZXJ2ZXIpCisJCXsKKwkJCWNyZWF0ZVNlcnZlcigpOworCQl9CisJfQorCisJU3dpZnRDb25maWc6On5Td2lmdENvbmZpZygpCisJeworCQlkZXN0cm95U2VydmVyKCk7CisKKwkJRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZjcml0aWNhbFNlY3Rpb24pOworCX0KKworCXZvaWQgU3dpZnRDb25maWc6OmNyZWF0ZVNlcnZlcigpCisJeworCQlidWZmZXJMZW5ndGggPSAxNiAqIDEwMjQ7CisJCXJlY2VpdmVCdWZmZXIgPSBuZXcgY2hhcltidWZmZXJMZW5ndGhdOworCisJCVdTQURBVEEgd2luc29ja0RhdGE7CisJCVdTQVN0YXJ0dXAoTUFLRVdPUkQoMiwgMiksICZ3aW5zb2NrRGF0YSk7CisKKwkJYWRkcmluZm8gaGludHMgPSB7MH07CisJCWhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisJCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJCWhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisJCWhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKworCQlhZGRyaW5mbyAqaW5mbzsKKwkJZ2V0YWRkcmluZm8oImxvY2FsaG9zdCIsICI4MDgwIiwgJmhpbnRzLCAmaW5mbyk7CisKKwkJbGlzdGVuU29ja2V0ID0gc29ja2V0KGluZm8tPmFpX2ZhbWlseSwgaW5mby0+YWlfc29ja3R5cGUsIGluZm8tPmFpX3Byb3RvY29sKTsKKwkJYmluZChsaXN0ZW5Tb2NrZXQsIGluZm8tPmFpX2FkZHIsIChpbnQpaW5mby0+YWlfYWRkcmxlbik7CisJCWxpc3RlbihsaXN0ZW5Tb2NrZXQsIFNPTUFYQ09OTik7CisKKwkJdGVybWluYXRlID0gZmFsc2U7CisJCXNlcnZlclRocmVhZCA9IENyZWF0ZVRocmVhZCgwLCAxMDI0ICogMTAyNCwgc2VydmVyUm91dGluZSwgdGhpcywgMCwgMCk7CisJfQorCisJdm9pZCBTd2lmdENvbmZpZzo6ZGVzdHJveVNlcnZlcigpCisJeworCQlpZihyZWNlaXZlQnVmZmVyKQorCQl7CisJCQl0ZXJtaW5hdGUgPSB0cnVlOworCQkJV2FpdEZvclNpbmdsZU9iamVjdChzZXJ2ZXJUaHJlYWQsIElORklOSVRFKTsKKwkJCUNsb3NlSGFuZGxlKHNlcnZlclRocmVhZCk7CisKKwkJCWNsb3Nlc29ja2V0KGxpc3RlblNvY2tldCk7CisKKwkJCVdTQUNsZWFudXAoKTsKKworCQkJZGVsZXRlW10gcmVjZWl2ZUJ1ZmZlcjsKKwkJCXJlY2VpdmVCdWZmZXIgPSAwOworCQl9CisJfQorCisJYm9vbCBTd2lmdENvbmZpZzo6aGFzTmV3Q29uZmlndXJhdGlvbihib29sIHJlc2V0KQorCXsKKwkJYm9vbCB2YWx1ZSA9IG5ld0NvbmZpZzsKKworCQlpZihyZXNldCkKKwkJeworCQkJbmV3Q29uZmlnID0gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJdm9pZCBTd2lmdENvbmZpZzo6Z2V0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uKQorCXsKKwkJRW50ZXJDcml0aWNhbFNlY3Rpb24oJmNyaXRpY2FsU2VjdGlvbik7CisJCWNvbmZpZ3VyYXRpb24gPSBjb25maWc7CisJCUxlYXZlQ3JpdGljYWxTZWN0aW9uKCZjcml0aWNhbFNlY3Rpb24pOworCX0KKworCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFN3aWZ0Q29uZmlnOjpzZXJ2ZXJSb3V0aW5lKHZvaWQgKnBhcmFtZXRlcnMpCisJeworCQlTd2lmdENvbmZpZyAqc3dpZnRDb25maWcgPSAoU3dpZnRDb25maWcqKXBhcmFtZXRlcnM7CisKKwkJc3dpZnRDb25maWctPnNlcnZlckxvb3AoKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlib29sIFN3aWZ0Q29uZmlnOjpwZW5kaW5nKFNPQ0tFVCBzb2NrZXQsIGludCBtcykKKwl7CisJCWZkX3NldCBzb2NrZXRzID0gezEsIHtzb2NrZXR9fTsKKwkJdGltZXZhbCB0aW1lb3V0ID0ge21zIC8gMTAwMCwgbXMgJSAxMDAwfTsKKworCQlyZXR1cm4gc2VsZWN0KDAsICZzb2NrZXRzLCAwLCAwLCAmdGltZW91dCkgPT0gMTsKKwl9CisKKwl2b2lkIFN3aWZ0Q29uZmlnOjpzZXJ2ZXJMb29wKCkKKwl7CisJCXJlYWRDb25maWd1cmF0aW9uKCk7CisKKwkJd2hpbGUoIXRlcm1pbmF0ZSkKKwkJeworCQkJaWYocGVuZGluZyhsaXN0ZW5Tb2NrZXQsIDEwMCkpCisJCQl7CisJCQkJY2xpZW50U29ja2V0ID0gYWNjZXB0KGxpc3RlblNvY2tldCwgMCwgMCk7CisJCQkJaW50IGJ5dGVzUmVjZWl2ZWQgPSAxOworCisJCQkJd2hpbGUoYnl0ZXNSZWNlaXZlZCA+IDAgJiYgIXRlcm1pbmF0ZSkKKwkJCQl7CisJCQkJCWlmKHBlbmRpbmcoY2xpZW50U29ja2V0LCAxMCkpCisJCQkJCXsKKwkJCQkJCWJ5dGVzUmVjZWl2ZWQgPSByZWN2KGNsaWVudFNvY2tldCwgcmVjZWl2ZUJ1ZmZlciwgYnVmZmVyTGVuZ3RoLCAwKTsKKworCQkJCQkJaWYoYnl0ZXNSZWNlaXZlZCA+IDApCisJCQkJCQl7CisJCQkJCQkJcmVjZWl2ZUJ1ZmZlcltieXRlc1JlY2VpdmVkXSA9IDA7CisJCQkJCQkJCisJCQkJCQkJcmVzcG9uZChyZWNlaXZlQnVmZmVyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWNsb3Nlc29ja2V0KGNsaWVudFNvY2tldCk7CisJCQl9CisJCX0KKwl9CisKKwlib29sIG1hdGNoKGNvbnN0IGNoYXIgKip1cmwsIGNoYXIgKnN0cmluZykKKwl7CisJCXNpemVfdCBsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKKworCQlpZihzdHJuY21wKCp1cmwsIHN0cmluZywgbGVuZ3RoKSA9PSAwKQorCQl7CisJCQkqdXJsICs9IGxlbmd0aDsKKworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJdm9pZCBTd2lmdENvbmZpZzo6cmVzcG9uZChjb25zdCBjaGFyICpyZXF1ZXN0KQorCXsKKwkJaWYobWF0Y2goJnJlcXVlc3QsICJHRVQgLyIpKQorCQl7CisJCQlpZihtYXRjaCgmcmVxdWVzdCwgInN3aWZ0c2hhZGVyIikgfHwgbWF0Y2goJnJlcXVlc3QsICJzd2lmdGNvbmZpZyIpKQorCQkJeworCQkJCWlmKG1hdGNoKCZyZXF1ZXN0LCAiICIpIHx8IG1hdGNoKCZyZXF1ZXN0LCAiLyAiKSkKKwkJCQl7CisJCQkJCXJldHVybiBzZW5kKE9LLCBwYWdlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmKG1hdGNoKCZyZXF1ZXN0LCAiUE9TVCAvIikpCisJCXsKKwkJCWlmKG1hdGNoKCZyZXF1ZXN0LCAic3dpZnRzaGFkZXIiKSB8fCBtYXRjaCgmcmVxdWVzdCwgInN3aWZ0Y29uZmlnIikpCisJCQl7CisJCQkJaWYobWF0Y2goJnJlcXVlc3QsICIgIikgfHwgbWF0Y2goJnJlcXVlc3QsICIvICIpKQorCQkJCXsKKwkJCQkJRW50ZXJDcml0aWNhbFNlY3Rpb24oJmNyaXRpY2FsU2VjdGlvbik7CisKKwkJCQkJY29uc3QgY2hhciAqcG9zdERhdGEgPSBzdHJzdHIocmVxdWVzdCwgIlxyXG5cclxuIik7CisJCQkJCXBvc3REYXRhID0gcG9zdERhdGEgPyBwb3N0RGF0YSArIDQgOiAwOworCisJCQkJCWlmKHBvc3REYXRhICYmIHN0cmxlbihwb3N0RGF0YSkgPiAwKQorCQkJCQl7CisJCQkJCQlwYXJzZVBvc3QocG9zdERhdGEpOworCQkJCQl9CisJCQkJCWVsc2UgICAvLyBQT1NUIGRhdGEgaW4gbmV4dCBwYWNrZXQKKwkJCQkJeworCQkJCQkJaW50IGJ5dGVzUmVjZWl2ZWQgPSByZWN2KGNsaWVudFNvY2tldCwgcmVjZWl2ZUJ1ZmZlciwgYnVmZmVyTGVuZ3RoLCAwKTsKKwkJCQkJCQorCQkJCQkJaWYoYnl0ZXNSZWNlaXZlZCA+IDApCisJCQkJCQl7CisJCQkJCQkJcmVjZWl2ZUJ1ZmZlcltieXRlc1JlY2VpdmVkXSA9IDA7CisJCQkJCQkJcGFyc2VQb3N0KHJlY2VpdmVCdWZmZXIpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJd3JpdGVDb25maWd1cmF0aW9uKCk7CisJCQkJCW5ld0NvbmZpZyA9IHRydWU7CisKKwkJCQkJaWYoY29uZmlnLmRpc2FibGVTZXJ2ZXIpCisJCQkJCXsKKwkJCQkJCWRlc3Ryb3lTZXJ2ZXIoKTsKKwkJCQkJfQorCisJCQkJCUxlYXZlQ3JpdGljYWxTZWN0aW9uKCZjcml0aWNhbFNlY3Rpb24pOworCisJCQkJCXJldHVybiBzZW5kKE9LLCBwYWdlKCkpOworCQkJCX0KKwkJCQllbHNlIGlmKG1hdGNoKCZyZXF1ZXN0LCAiL3Byb2ZpbGUgIikpCisJCQkJeworCQkJCQlyZXR1cm4gc2VuZChPSywgcHJvZmlsZSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gc2VuZChOb3RGb3VuZCk7CisJfQorCisJc3RkOjpzdHJpbmcgU3dpZnRDb25maWc6OnBhZ2UoKQorCXsKKwkJc3RkOjpzdHJpbmcgaHRtbDsKKworCQljb25zdCBzdGQ6OnN0cmluZyBzZWxlY3RlZCA9ICJzZWxlY3RlZD0nc2VsZWN0ZWQnIjsKKwkJY29uc3Qgc3RkOjpzdHJpbmcgY2hlY2tlZCA9ICJjaGVja2VkPSdjaGVja2VkJyI7CisJCWNvbnN0IHN0ZDo6c3RyaW5nIGVtcHR5ID0gIiI7CisKKwkJaHRtbCArPSAiPCFET0NUWVBFIEhUTUwgUFVCTElDICctLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOJyAnaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCc+XG4iOworCQlodG1sICs9ICI8aHRtbD5cbiI7CisJCWh0bWwgKz0gIjxoZWFkPlxuIjsKKwkJaHRtbCArPSAiPG1ldGEgaHR0cC1lcXVpdj0nY29udGVudC10eXBlJyBjb250ZW50PSd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnPlxuIjsKKwkJaHRtbCArPSAiPHRpdGxlPlN3aWZ0U2hhZGVyIENvbmZpZ3VyYXRpb24gUGFuZWw8L3RpdGxlPlxuIjsKKwkJaHRtbCArPSAiPC9oZWFkPlxuIjsKKwkJaHRtbCArPSAiPGJvZHk+XG4iOworCQlodG1sICs9ICI8ZGl2IGlkPSdwcm9maWxlJz48L2Rpdj5cbiI7CisJCWh0bWwgKz0gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz5cbiI7CisJCWh0bWwgKz0gInJlcXVlc3QoKTtcbiI7CisJCWh0bWwgKz0gImZ1bmN0aW9uIHJlcXVlc3QoKVxuIjsKKwkJaHRtbCArPSAie1xuIjsKKwkJaHRtbCArPSAidmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuIjsKKwkJaHRtbCArPSAieGhyLm9wZW4oJ1BPU1QnLCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL3N3aWZ0c2hhZGVyL3Byb2ZpbGUnLCB0cnVlKTtcbiI7CisJCWh0bWwgKz0gInhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4iOworCQlodG1sICs9ICJ7XG4iOworCQlodG1sICs9ICJpZih4aHIucmVhZHlTdGF0ZSA9PSA0ICYmIHhoci5zdGF0dXMgPT0gMjAwKVxuIjsKKwkJaHRtbCArPSAie1xuIjsKKwkJaHRtbCArPSAiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2ZpbGUnKS5pbm5lckhUTUwgPSB4aHIucmVzcG9uc2VUZXh0O1xuIjsKKwkJaHRtbCArPSAic2V0VGltZW91dCgncmVxdWVzdCgpJywgMTAwMCk7XG4iOworCQlodG1sICs9ICJ9XG4iOworCQlodG1sICs9ICJ9XG4iOworCQlodG1sICs9ICJ4aHIuc2VuZCgpO1xuIjsKKwkJaHRtbCArPSAifVxuIjsKKwkJaHRtbCArPSAiPC9zY3JpcHQ+XG4iOworCQlodG1sICs9ICI8Zm9ybSBtZXRob2Q9J1BPU1QnIGFjdGlvbj0nJz5cbiI7CisJCWh0bWwgKz0gIjxoMT5Td2lmdFNoYWRlciBDb25maWd1cmF0aW9uIFBhbmVsPC9oMT5cbiI7CisJCWh0bWwgKz0gIjxocj48cD5cbiI7CisJCWh0bWwgKz0gIjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdBcHBseSBjaGFuZ2VzJyB0aXRsZT0nQ2xpY2sgdG8gYXBwbHkgYWxsIHNldHRpbmdzLic+XG4iOworCS8vCWh0bWwgKz0gIjxpbnB1dCB0eXBlPSdyZXNldCcgdmFsdWU9J1Jlc2V0IGNoYW5nZXMnIHRpdGxlPSdDbGljayB0byByZXNldCB5b3VyIGNoYW5nZXMgdG8gdGhlIHByZXZpb3VzIHZhbHVlLic+XG4iOworCQlodG1sICs9ICI8L3A+PGhyPlxuIjsKKwkJaHRtbCArPSAiPGgyPjxlbT5EZXZpY2UgY2FwYWJpbGl0aWVzPC9lbT48L2gyPlxuIjsKKwkJaHRtbCArPSAiPHRhYmxlPlxuIjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5CdWlsZCByZXZpc2lvbjo8L3RkPjx0ZD4iIFJFVklTSU9OX1NUUklORyAiPC90ZD48L3RyPlxuIjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5QaXhlbCBzaGFkZXIgbW9kZWw6PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSdwaXhlbFNoYWRlclZlcnNpb24nIHRpdGxlPSdUaGUgaGlnaGVzdCB2ZXJzaW9uIG9mIHBpeGVsIHNoYWRlciBzdXBwb3J0ZWQgYnkgU3dpZnRTaGFkZXIuIExvd2VyIHZlcnNpb25zIG1pZ2h0IGJlIGZhc3RlciBpZiBzdXBwb3J0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBPbmx5IGVmZmVjdGl2ZSBhZnRlciByZXN0YXJ0aW5nIHRoZSBhcHBsaWNhdGlvbi4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMCciICArIChjb25maWcucGl4ZWxTaGFkZXJWZXJzaW9uID09ICAwID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjAuMDwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMTEnIiArIChjb25maWcucGl4ZWxTaGFkZXJWZXJzaW9uID09IDExID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjEuMTwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMTInIiArIChjb25maWcucGl4ZWxTaGFkZXJWZXJzaW9uID09IDEyID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjEuMjwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMTMnIiArIChjb25maWcucGl4ZWxTaGFkZXJWZXJzaW9uID09IDEzID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjEuMzwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMTQnIiArIChjb25maWcucGl4ZWxTaGFkZXJWZXJzaW9uID09IDE0ID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjEuNDwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMjAnIiArIChjb25maWcucGl4ZWxTaGFkZXJWZXJzaW9uID09IDIwID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjIuMDwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMjEnIiArIChjb25maWcucGl4ZWxTaGFkZXJWZXJzaW9uID09IDIxID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjIueDwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMzAnIiArIChjb25maWcucGl4ZWxTaGFkZXJWZXJzaW9uID09IDMwID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjMuMCAoZGVmYXVsdCk8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjwvc2VsZWN0PjwvdGQ+PC90cj5cbiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+VmVydGV4IHNoYWRlciBtb2RlbDo8L3RkPjx0ZD48c2VsZWN0IG5hbWU9J3ZlcnRleFNoYWRlclZlcnNpb24nIHRpdGxlPSdUaGUgaGlnaGVzdCB2ZXJzaW9uIG9mIHZlcnRleCBzaGFkZXIgc3VwcG9ydGVkIGJ5IFN3aWZ0U2hhZGVyLiBMb3dlciB2ZXJzaW9ucyBtaWdodCBiZSBmYXN0ZXIgaWYgc3VwcG9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT25seSBlZmZlY3RpdmUgYWZ0ZXIgcmVzdGFydGluZyB0aGUgYXBwbGljYXRpb24uJz5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzAnIiAgKyAoY29uZmlnLnZlcnRleFNoYWRlclZlcnNpb24gPT0gIDAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MC4wPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScxMSciICsgKGNvbmZpZy52ZXJ0ZXhTaGFkZXJWZXJzaW9uID09IDExID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjEuMTwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMjAnIiArIChjb25maWcudmVydGV4U2hhZGVyVmVyc2lvbiA9PSAyMCA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj4yLjA8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzIxJyIgKyAoY29uZmlnLnZlcnRleFNoYWRlclZlcnNpb24gPT0gMjEgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+Mi54PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSczMCciICsgKGNvbmZpZy52ZXJ0ZXhTaGFkZXJWZXJzaW9uID09IDMwID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjMuMCAoZGVmYXVsdCk8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjwvc2VsZWN0PjwvdGQ+PC90cj5cbiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+VGV4dHVyZSBtZW1vcnk6PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSd0ZXh0dXJlTWVtb3J5JyB0aXRsZT0nVGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB1c2VkIGZvciB0ZXh0dXJlcyBhbmQgb3RoZXIgcmVzb3VyY2VzLic+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScxMjgnIiAgKyAoY29uZmlnLnRleHR1cmVNZW1vcnkgPT0gMTI4ICA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj4xMjggTUI8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzI1NiciICArIChjb25maWcudGV4dHVyZU1lbW9yeSA9PSAyNTYgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjI1NiBNQiAoZGVmYXVsdCk8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzUxMiciICArIChjb25maWcudGV4dHVyZU1lbW9yeSA9PSA1MTIgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjUxMiBNQjwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMTAyNCciICsgKGNvbmZpZy50ZXh0dXJlTWVtb3J5ID09IDEwMjQgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MTAyNCBNQjwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMjA0OCciICsgKGNvbmZpZy50ZXh0dXJlTWVtb3J5ID09IDIwNDggPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MjA0OCBNQjwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPC9zZWxlY3Q+PC90ZD48L3RyPlxuIjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5EZXZpY2UgaWRlbnRpZmllcjo8L3RkPjx0ZD48c2VsZWN0IG5hbWU9J2lkZW50aWZpZXInIHRpdGxlPSdUaGUgaW5mb3JtYXRpb24gdXNlZCBieSBzb21lIGFwcGxpY2F0aW9ucyB0byBkZXRlcm1pbmUgZGV2aWNlIGNhcGFiaWxpdGllcy4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMCciICsgKGNvbmZpZy5pZGVudGlmaWVyID09IDAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+VHJhbnNHYW1pbmcgU3dpZnRTaGFkZXIgKGRlZmF1bHQpPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScxJyIgKyAoY29uZmlnLmlkZW50aWZpZXIgPT0gMSA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5OVklESUEgR2VGb3JjZSA3OTAwIEdTPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScyJyIgKyAoY29uZmlnLmlkZW50aWZpZXIgPT0gMiA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5BVEkgTW9iaWxpdHkgUmFkZW9uIFgxNjAwPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSczJyIgKyAoY29uZmlnLmlkZW50aWZpZXIgPT0gMyA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5JbnRlbCBHTUEgWDMxMDA8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzQnIiArIChjb25maWcuaWRlbnRpZmllciA9PSA0ID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPlN5c3RlbSBkZXZpY2U8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjwvc2VsZWN0PjwvdGQ+PC90cj5cbiI7CisJCWh0bWwgKz0gIjwvdGFibGU+XG4iOworCQlodG1sICs9ICI8aDI+PGVtPkNhY2hlIHNpemVzPC9lbT48L2gyPlxuIjsKKwkJaHRtbCArPSAiPHRhYmxlPlxuIjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5WZXJ0ZXggcm91dGluZSBjYWNoZSBzaXplOjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0ndmVydGV4Um91dGluZUNhY2hlU2l6ZScgdGl0bGU9J1RoZSBudW1iZXIgb2YgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHZlcnRleCBwcm9jZXNzaW5nIHJvdXRpbmVzIGJlaW5nIGNhY2hlZCBmb3IgcmV1c2UuIExvd2VyIG51bWJlcnMgc2F2ZSBtZW1vcnkgYnV0IHJlcXVpcmUgbW9yZSByb3V0aW5lcyB0byBiZSByZWdlbmVyYXRlZC4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nNjQnIiAgICsgKGNvbmZpZy52ZXJ0ZXhSb3V0aW5lQ2FjaGVTaXplID09IDY0ICAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+NjQ8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEyOCciICArIChjb25maWcudmVydGV4Um91dGluZUNhY2hlU2l6ZSA9PSAxMjggID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjEyODwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMjU2JyIgICsgKGNvbmZpZy52ZXJ0ZXhSb3V0aW5lQ2FjaGVTaXplID09IDI1NiAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MjU2PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSc1MTInIiAgKyAoY29uZmlnLnZlcnRleFJvdXRpbmVDYWNoZVNpemUgPT0gNTEyICA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj41MTI8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEwMjQnIiArIChjb25maWcudmVydGV4Um91dGluZUNhY2hlU2l6ZSA9PSAxMDI0ID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjEwMjQgKGRlZmF1bHQpPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScyMDQ4JyIgKyAoY29uZmlnLnZlcnRleFJvdXRpbmVDYWNoZVNpemUgPT0gMjA0OCA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj4yMDQ4PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSc0MDk2JyIgKyAoY29uZmlnLnZlcnRleFJvdXRpbmVDYWNoZVNpemUgPT0gNDA5NiA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj40MDk2PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8L3NlbGVjdD48L3RkPlxuIjsKKwkJaHRtbCArPSAiPC90cj5cbiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+UGl4ZWwgcm91dGluZSBjYWNoZSBzaXplOjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0ncGl4ZWxSb3V0aW5lQ2FjaGVTaXplJyB0aXRsZT0nVGhlIG51bWJlciBvZiBkeW5hbWljYWxseSBnZW5lcmF0ZWQgcGl4ZWwgcHJvY2Vzc2luZyByb3V0aW5lcyBiZWluZyBjYWNoZWQgZm9yIHJldXNlLiBMb3dlciBudW1iZXJzIHNhdmUgbWVtb3J5IGJ1dCByZXF1aXJlIG1vcmUgcm91dGluZXMgdG8gYmUgcmVnZW5lcmF0ZWQuJz5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzY0JyIgICArIChjb25maWcucGl4ZWxSb3V0aW5lQ2FjaGVTaXplID09IDY0ICAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+NjQ8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEyOCciICArIChjb25maWcucGl4ZWxSb3V0aW5lQ2FjaGVTaXplID09IDEyOCAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MTI4PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScyNTYnIiAgKyAoY29uZmlnLnBpeGVsUm91dGluZUNhY2hlU2l6ZSA9PSAyNTYgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjI1Njwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nNTEyJyIgICsgKGNvbmZpZy5waXhlbFJvdXRpbmVDYWNoZVNpemUgPT0gNTEyICA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj41MTI8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEwMjQnIiArIChjb25maWcucGl4ZWxSb3V0aW5lQ2FjaGVTaXplID09IDEwMjQgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MTAyNCAoZGVmYXVsdCk8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzIwNDgnIiArIChjb25maWcucGl4ZWxSb3V0aW5lQ2FjaGVTaXplID09IDIwNDggPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MjA0ODwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nNDA5NiciICsgKGNvbmZpZy5waXhlbFJvdXRpbmVDYWNoZVNpemUgPT0gNDA5NiA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj40MDk2PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8L3NlbGVjdD48L3RkPlxuIjsKKwkJaHRtbCArPSAiPC90cj5cbiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+U2V0dXAgcm91dGluZSBjYWNoZSBzaXplOjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0nc2V0dXBSb3V0aW5lQ2FjaGVTaXplJyB0aXRsZT0nVGhlIG51bWJlciBvZiBkeW5hbWljYWxseSBnZW5lcmF0ZWQgcHJpbWl0aXZlIHNldHVwIHJvdXRpbmVzIGJlaW5nIGNhY2hlZCBmb3IgcmV1c2UuIExvd2VyIG51bWJlcnMgc2F2ZSBtZW1vcnkgYnV0IHJlcXVpcmUgbW9yZSByb3V0aW5lcyB0byBiZSByZWdlbmVyYXRlZC4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nNjQnIiAgICsgKGNvbmZpZy5zZXR1cFJvdXRpbmVDYWNoZVNpemUgPT0gNjQgICA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj42NDwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMTI4JyIgICsgKGNvbmZpZy5zZXR1cFJvdXRpbmVDYWNoZVNpemUgPT0gMTI4ICA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj4xMjg8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzI1NiciICArIChjb25maWcuc2V0dXBSb3V0aW5lQ2FjaGVTaXplID09IDI1NiAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MjU2PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSc1MTInIiAgKyAoY29uZmlnLnNldHVwUm91dGluZUNhY2hlU2l6ZSA9PSA1MTIgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjUxMjwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMTAyNCciICsgKGNvbmZpZy5zZXR1cFJvdXRpbmVDYWNoZVNpemUgPT0gMTAyNCA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj4xMDI0IChkZWZhdWx0KTwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMjA0OCciICsgKGNvbmZpZy5zZXR1cFJvdXRpbmVDYWNoZVNpemUgPT0gMjA0OCA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj4yMDQ4PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSc0MDk2JyIgKyAoY29uZmlnLnNldHVwUm91dGluZUNhY2hlU2l6ZSA9PSA0MDk2ID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjQwOTY8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjwvc2VsZWN0PjwvdGQ+XG4iOworCQlodG1sICs9ICI8L3RyPlxuIjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5WZXJ0ZXggY2FjaGUgc2l6ZTo8L3RkPjx0ZD48c2VsZWN0IG5hbWU9J3ZlcnRleENhY2hlU2l6ZScgdGl0bGU9J1RoZSBudW1iZXIgb2YgcHJvY2Vzc2VkIHZlcnRpY2VzIGJlaW5nIGNhY2hlZCBmb3IgcmV1c2UuIExvd2VyIG51bWJlcnMgc2F2ZSBtZW1vcnkgYnV0IHJlcXVpcmUgbW9yZSB2ZXJ0aWNlcyB0byBiZSByZXByb2Nlc3NlZC4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nNjQnIiAgICsgKGNvbmZpZy52ZXJ0ZXhDYWNoZVNpemUgPT0gNjQgICA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj42NCAoZGVmYXVsdCk8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjwvc2VsZWN0PjwvdGQ+XG4iOworCQlodG1sICs9ICI8L3RyPlxuIjsKKwkJaHRtbCArPSAiPC90YWJsZT5cbiI7CisJCWh0bWwgKz0gIjxoMj48ZW0+UXVhbGl0eTwvZW0+PC9oMj5cbiI7CisJCWh0bWwgKz0gIjx0YWJsZT5cbiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+TWF4aW11bSB0ZXh0dXJlIHNhbXBsaW5nIHF1YWxpdHk6PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSd0ZXh0dXJlU2FtcGxlUXVhbGl0eScgdGl0bGU9J1RoZSBtYXhpbXVtIHRleHR1cmUgZmlsdGVyaW5nIHF1YWxpdHkuIExvd2VyIHNldHRpbmdzIGNhbiBiZSBmYXN0ZXIgYnV0IGNhdXNlIHZpc3VhbCBhcnRpZmFjdHMuJz5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzAnIiArIChjb25maWcudGV4dHVyZVNhbXBsZVF1YWxpdHkgPT0gMCA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5Qb2ludDwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMSciICsgKGNvbmZpZy50ZXh0dXJlU2FtcGxlUXVhbGl0eSA9PSAxID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPkxpbmVhcjwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMiciICsgKGNvbmZpZy50ZXh0dXJlU2FtcGxlUXVhbGl0eSA9PSAyID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPkFuaXNvdHJvcGljIChkZWZhdWx0KTwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPC9zZWxlY3Q+PC90ZD5cbiI7CisJCWh0bWwgKz0gIjwvdHI+XG4iOworCQlodG1sICs9ICI8dHI+PHRkPk1heGltdW0gbWlwbWFwcGluZyBxdWFsaXR5OjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0nbWlwbWFwUXVhbGl0eScgdGl0bGU9J1RoZSBtYXhpbXVtIG1pcG1hcCBmaWx0ZXJpbmcgcXVhbGl0eS4gSGlnaGVyIHNldHRpbmdzIGNhbiBiZSBtb3JlIHZpc3VhbGx5IGFwcGVhbGluZyBidXQgYXJlIHNsb3dlci4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMCciICsgKGNvbmZpZy5taXBtYXBRdWFsaXR5ID09IDAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+UG9pbnQ8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEnIiArIChjb25maWcubWlwbWFwUXVhbGl0eSA9PSAxID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPkxpbmVhciAoZGVmYXVsdCk8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjwvc2VsZWN0PjwvdGQ+XG4iOworCQlodG1sICs9ICI8L3RyPlxuIjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5QZXJzcGVjdGl2ZSBjb3JyZWN0aW9uOjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0ncGVyc3BlY3RpdmVDb3JyZWN0aW9uJyB0aXRsZT0nRW5hYmxlcyBvciBkaXNhYmxlcyBwZXJzcGVjdGl2ZSBjb3JyZWN0aW9uLiBEaXNhYmxpbmcgaXQgaXMgZmFzdGVyIGJ1dCBjYW4gY2F1c2VzIGRpc3RvcnRpb24uIFJlY29tbWVuZGVkIGZvciAyRCBhcHBsaWNhdGlvbnMgb25seS4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMCciICsgKGNvbmZpZy5wZXJzcGVjdGl2ZUNvcnJlY3Rpb24gPT0gMCA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5PZmY8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEnIiArIChjb25maWcucGVyc3BlY3RpdmVDb3JyZWN0aW9uID09IDEgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+T24gKGRlZmF1bHQpPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8L3NlbGVjdD48L3RkPlxuIjsKKwkJaHRtbCArPSAiPC90cj5cbiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+VHJhbnNjZW5kZW50YWwgZnVuY3Rpb24gcHJlY2lzaW9uOjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0ndHJhbnNjZW5kZW50YWxQcmVjaXNpb24nIHRpdGxlPSdUaGUgcHJlY2lzaW9uIGF0IHdoaWNoIGxvZy9leHAvcG93L3JjcC9yc3EvbnJtIHNoYWRlciBpbnN0cnVjdGlvbnMgYXJlIGNvbXB1dGVkLiBMb3dlciBzZXR0aW5ncyBjYW4gYmUgZmFzdGVyIGJ1dCBjYXVzZSB2aXN1YWwgYXJ0aWZhY3RzLic+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScwJyIgKyAoY29uZmlnLnRyYW5zY2VuZGVudGFsUHJlY2lzaW9uID09IDAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+QXBwcm94aW1hdGU8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEnIiArIChjb25maWcudHJhbnNjZW5kZW50YWxQcmVjaXNpb24gPT0gMSA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5QYXJ0aWFsPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScyJyIgKyAoY29uZmlnLnRyYW5zY2VuZGVudGFsUHJlY2lzaW9uID09IDIgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+QWNjdXJhdGUgKGRlZmF1bHQpPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSczJyIgKyAoY29uZmlnLnRyYW5zY2VuZGVudGFsUHJlY2lzaW9uID09IDMgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+V0hRTDwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nNCciICsgKGNvbmZpZy50cmFuc2NlbmRlbnRhbFByZWNpc2lvbiA9PSA0ID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPklFRUU8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjwvc2VsZWN0PjwvdGQ+XG4iOworCQlodG1sICs9ICI8L3RyPlxuIjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5UcmFuc3BhcmVuY3kgYW50aS1hbGlhc2luZzo8L3RkPjx0ZD48c2VsZWN0IG5hbWU9J3RyYW5zcGFyZW5jeUFudGlhbGlhc2luZycgdGl0bGU9J1RoZSB0ZWNobmlxdWUgdXNlZCB0byBhbnRpLWFsaWFzIGFscGhhLXRlc3RlZCB0cmFuc3BhcmVudCB0ZXh0dXJlcy4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMCciICsgKGNvbmZpZy50cmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcgPT0gMCA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5Ob25lIChkZWZhdWx0KTwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMSciICsgKGNvbmZpZy50cmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcgPT0gMSA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5BbHBoYS10by1Db3ZlcmFnZTwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPC9zZWxlY3Q+PC90ZD5cbiI7CisJCWh0bWwgKz0gIjwvdGFibGU+XG4iOworCQlodG1sICs9ICI8aDI+PGVtPlByb2Nlc3NvciBzZXR0aW5nczwvZW0+PC9oMj5cbiI7CisJCWh0bWwgKz0gIjx0YWJsZT5cbiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+TnVtYmVyIG9mIHRocmVhZHM6PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSd0aHJlYWRDb3VudCcgdGl0bGU9J1RoZSBudW1iZXIgb2YgcmVuZGVyaW5nIHRocmVhZHMgdG8gYmUgdXNlZC4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nLTEnIiArIChjb25maWcudGhyZWFkQ291bnQgPT0gLTEgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+Q29yZSBjb3VudDwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMCciICArIChjb25maWcudGhyZWFkQ291bnQgPT0gMCAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+UHJvY2VzcyBhZmZpbml0eSAoZGVmYXVsdCk8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEnIiAgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDEgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjE8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzInIiAgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDIgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjI8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzMnIiAgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDMgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjM8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzQnIiAgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDQgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjQ8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzUnIiAgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDUgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjU8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzYnIiAgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDYgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjY8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzcnIiAgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDcgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjc8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzgnIiAgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDggID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjg8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzknIiAgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDkgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjk8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEwJyIgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDEwID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjEwPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScxMSciICsgKGNvbmZpZy50aHJlYWRDb3VudCA9PSAxMSA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj4xMTwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMTInIiArIChjb25maWcudGhyZWFkQ291bnQgPT0gMTIgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MTI8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzEzJyIgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDEzID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjEzPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScxNCciICsgKGNvbmZpZy50aHJlYWRDb3VudCA9PSAxNCA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj4xNDwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMTUnIiArIChjb25maWcudGhyZWFkQ291bnQgPT0gMTUgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+MTU8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzE2JyIgKyAoY29uZmlnLnRocmVhZENvdW50ID09IDE2ID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPjE2PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8L3NlbGVjdD48L3RkPjwvdHI+XG4iOworCQlodG1sICs9ICI8dHI+PHRkPkVuYWJsZSBTU0U6PC90ZD48dGQ+PGlucHV0IG5hbWUgPSAnZW5hYmxlU1NFJyB0eXBlPSdjaGVja2JveCciICsgKGNvbmZpZy5lbmFibGVTU0UgPT0gdHJ1ZSA/IGNoZWNrZWQgOiBlbXB0eSkgKyAiIGRpc2FibGVkPSdkaXNhYmxlZCcgdGl0bGU9J0lmIGNoZWNrZWQgZW5hYmxlcyB0aGUgdXNlIG9mIFNTRSBpbnN0cnVjdGlvbiBzZXQgZXh0ZW50aW9ucyBpZiBzdXBwb3J0ZWQgYnkgdGhlIENQVS4nPjwvdGQ+PC90cj4iOworCQlodG1sICs9ICI8dHI+PHRkPkVuYWJsZSBTU0UyOjwvdGQ+PHRkPjxpbnB1dCBuYW1lID0gJ2VuYWJsZVNTRTInIHR5cGU9J2NoZWNrYm94JyIgKyAoY29uZmlnLmVuYWJsZVNTRTIgPT0gdHJ1ZSA/IGNoZWNrZWQgOiBlbXB0eSkgKyAiIGRpc2FibGVkPSdkaXNhYmxlZCcgdGl0bGU9J0lmIGNoZWNrZWQgZW5hYmxlcyB0aGUgdXNlIG9mIFNTRTIgaW5zdHJ1Y3Rpb24gc2V0IGV4dGVudGlvbnMgaWYgc3VwcG9ydGVkIGJ5IHRoZSBDUFUuJz48L3RkPjwvdHI+IjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5FbmFibGUgU1NFMzo8L3RkPjx0ZD48aW5wdXQgbmFtZSA9ICdlbmFibGVTU0UzJyB0eXBlPSdjaGVja2JveCciICsgKGNvbmZpZy5lbmFibGVTU0UzID09IHRydWUgPyBjaGVja2VkIDogZW1wdHkpICsgIiB0aXRsZT0nSWYgY2hlY2tlZCBlbmFibGVzIHRoZSB1c2Ugb2YgU1NFMyBpbnN0cnVjdGlvbiBzZXQgZXh0ZW50aW9ucyBpZiBzdXBwb3J0ZWQgYnkgdGhlIENQVS4nPjwvdGQ+PC90cj4iOworCQlodG1sICs9ICI8dHI+PHRkPkVuYWJsZSBTU1NFMzo8L3RkPjx0ZD48aW5wdXQgbmFtZSA9ICdlbmFibGVTU1NFMycgdHlwZT0nY2hlY2tib3gnIiArIChjb25maWcuZW5hYmxlU1NTRTMgPT0gdHJ1ZSA/IGNoZWNrZWQgOiBlbXB0eSkgKyAiIHRpdGxlPSdJZiBjaGVja2VkIGVuYWJsZXMgdGhlIHVzZSBvZiBTU1NFMyBpbnN0cnVjdGlvbiBzZXQgZXh0ZW50aW9ucyBpZiBzdXBwb3J0ZWQgYnkgdGhlIENQVS4nPjwvdGQ+PC90cj4iOworCQlodG1sICs9ICI8dHI+PHRkPkVuYWJsZSBTU0U0LjE6PC90ZD48dGQ+PGlucHV0IG5hbWUgPSAnZW5hYmxlU1NFNF8xJyB0eXBlPSdjaGVja2JveCciICsgKGNvbmZpZy5lbmFibGVTU0U0XzEgPT0gdHJ1ZSA/IGNoZWNrZWQgOiBlbXB0eSkgKyAiIHRpdGxlPSdJZiBjaGVja2VkIGVuYWJsZXMgdGhlIHVzZSBvZiBTU0U0LjEgaW5zdHJ1Y3Rpb24gc2V0IGV4dGVudGlvbnMgaWYgc3VwcG9ydGVkIGJ5IHRoZSBDUFUuJz48L3RkPjwvdHI+IjsKKwkJaHRtbCArPSAiPC90YWJsZT5cbiI7CisJCWh0bWwgKz0gIjxoMj48ZW0+Q29tcGlsZXIgb3B0aW1pemF0aW9uczwvZW0+PC9oMj5cbiI7CisJCWh0bWwgKz0gIjx0YWJsZT5cbiI7CisKKwkJZm9yKGludCBwYXNzID0gMDsgcGFzcyA8IDEwOyBwYXNzKyspCisJCXsKKwkJCWh0bWwgKz0gIjx0cj48dGQ+T3B0aW1pemF0aW9uIHBhc3MgIiArIGl0b2EocGFzcyArIDEpICsgIjo8L3RkPjx0ZD48c2VsZWN0IG5hbWU9J29wdGltaXphdGlvbiIgKyBpdG9hKHBhc3MgKyAxKSArICInIHRpdGxlPSdBbiBvcHRpbWl6YXRpb24gcGFzcyBmb3IgdGhlIHNoYWRlciBjb21waWxlci4nPlxuIjsKKwkJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzAnIiAgKyAoY29uZmlnLm9wdGltaXphdGlvbltwYXNzXSA9PSAwICA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5EaXNhYmxlZCIgKyAocGFzcyA+IDAgPyAiIChkZWZhdWx0KSIgOiAiIikgKyAiPC9vcHRpb24+XG4iOworCQkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMSciICArIChjb25maWcub3B0aW1pemF0aW9uW3Bhc3NdID09IDEgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPkluc3RydWN0aW9uIENvbWJpbmluZyIgKyAocGFzcyA9PSAwID8gIiAoZGVmYXVsdCkiIDogIiIpICsgIjwvb3B0aW9uPlxuIjsKKwkJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzInIiAgKyAoY29uZmlnLm9wdGltaXphdGlvbltwYXNzXSA9PSAyICA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5Db250cm9sIEZsb3cgU2ltcGxpZmljYXRpb248L29wdGlvbj5cbiI7CisJCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSczJyIgICsgKGNvbmZpZy5vcHRpbWl6YXRpb25bcGFzc10gPT0gMyAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+TG9vcCBJbnZhcmlhbnQgQ29kZSBNb3Rpb248L29wdGlvbj5cbiI7CisJCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSc0JyIgICsgKGNvbmZpZy5vcHRpbWl6YXRpb25bcGFzc10gPT0gNCAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+QWdncmVzc2l2ZSBEZWFkIENvZGUgRWxpbWluYXRpb248L29wdGlvbj5cbiI7CisJCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSc1JyIgICsgKGNvbmZpZy5vcHRpbWl6YXRpb25bcGFzc10gPT0gNSAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+R2xvYmFsIFZhbHVlIE51bWJlcmluZzwvb3B0aW9uPlxuIjsKKwkJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzYnIiAgKyAoY29uZmlnLm9wdGltaXphdGlvbltwYXNzXSA9PSA2ICA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5Db21tdXRhdGl2ZSBFeHByZXNzaW9ucyBSZWFzc29jaWF0aW9uPC9vcHRpb24+XG4iOworCQkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nNyciICArIChjb25maWcub3B0aW1pemF0aW9uW3Bhc3NdID09IDcgID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPkRlYWQgU3RvcmUgRWxpbWluYXRpb248L29wdGlvbj5cbiI7CisJCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSc4JyIgICsgKGNvbmZpZy5vcHRpbWl6YXRpb25bcGFzc10gPT0gOCAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+U3BhcnNlIENvbmRpdGlvbmFsIENvcHkgUHJvcGFnYXRpb248L29wdGlvbj5cbiI7CisJCQlodG1sICs9ICI8L3NlbGVjdD48L3RkPjwvdHI+XG4iOworCQl9CisKKwkJaHRtbCArPSAiPC90YWJsZT5cbiI7CisJCWh0bWwgKz0gIjxoMj48ZW0+VGVzdGluZyAmIEV4cGVyaW1lbnRhbDwvZW0+PC9oMj5cbiI7CisJCWh0bWwgKz0gIjx0YWJsZT5cbiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+RGlzYWJsZSBTd2lmdENvbmZpZyBzZXJ2ZXI6PC90ZD48dGQ+PGlucHV0IG5hbWUgPSAnZGlzYWJsZVNlcnZlcicgdHlwZT0nY2hlY2tib3gnIiArIChjb25maWcuZGlzYWJsZVNlcnZlciA9PSB0cnVlID8gY2hlY2tlZCA6IGVtcHR5KSArICIgdGl0bGU9J0lmIGNoZWNrZWQgZGlzYWJsZXMgdGhlIHdlYiBicm93c2VyIGJhc2VkIGNvbnRyb2wgcGFuZWwuJz48L3RkPjwvdHI+IjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5Gb3JjZSB3aW5kb3dlZCBtb2RlOjwvdGQ+PHRkPjxpbnB1dCBuYW1lID0gJ2ZvcmNlV2luZG93ZWQnIHR5cGU9J2NoZWNrYm94JyIgKyAoY29uZmlnLmZvcmNlV2luZG93ZWQgPT0gdHJ1ZSA/IGNoZWNrZWQgOiBlbXB0eSkgKyAiIHRpdGxlPSdJZiBjaGVja2VkIHByZXZlbnRzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIHN3aXRjaGluZyB0byBmdWxsLXNjcmVlbiBtb2RlLic+PC90ZD48L3RyPiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+Q29tcGxlbWVudGFyeSBkZXB0aCBidWZmZXI6PC90ZD48dGQ+PGlucHV0IG5hbWUgPSAnY29tcGxlbWVudGFyeURlcHRoQnVmZmVyJyB0eXBlPSdjaGVja2JveCciICsgKGNvbmZpZy5jb21wbGVtZW50YXJ5RGVwdGhCdWZmZXIgPT0gdHJ1ZSA/IGNoZWNrZWQgOiBlbXB0eSkgKyAiIHRpdGxlPSdJZiBjaGVja2VkIGNhdXNlcyAxIC0geiB0byBiZSBzdG9yZWQgaW4gdGhlIGRlcHRoIGJ1ZmZlci4nPjwvdGQ+PC90cj4iOworCQlodG1sICs9ICI8dHI+PHRkPlBvc3QgYWxwaGEgYmxlbmQgc1JHQiBjb252ZXJzaW9uOjwvdGQ+PHRkPjxpbnB1dCBuYW1lID0gJ3Bvc3RCbGVuZFNSR0InIHR5cGU9J2NoZWNrYm94JyIgKyAoY29uZmlnLnBvc3RCbGVuZFNSR0IgPT0gdHJ1ZSA/IGNoZWNrZWQgOiBlbXB0eSkgKyAiIHRpdGxlPSdJZiBjaGVja2VkIGFscGhhIGJsZW5kaW5nIGlzIHBlcmZvcm1lZCBpbiBsaW5lYXIgY29sb3Igc3BhY2UuJz48L3RkPjwvdHI+IjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5FeGFjdCBjb2xvciByb3VuZGluZzo8L3RkPjx0ZD48aW5wdXQgbmFtZSA9ICdleGFjdENvbG9yUm91bmRpbmcnIHR5cGU9J2NoZWNrYm94JyIgKyAoY29uZmlnLmV4YWN0Q29sb3JSb3VuZGluZyA9PSB0cnVlID8gY2hlY2tlZCA6IGVtcHR5KSArICIgdGl0bGU9J0lmIGNoZWNrZWQgY29sb3Igcm91bmRpbmcgaXMgZG9uZSBhdCBoaWdoIGFjY3VyYWN5Lic+PC90ZD48L3RyPiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+RGlzYWJsZSBhbHBoYSBkaXNwbGF5IGZvcm1hdHM6PC90ZD48dGQ+PGlucHV0IG5hbWUgPSAnZGlzYWJsZUFscGhhTW9kZScgdHlwZT0nY2hlY2tib3gnIiArIChjb25maWcuZGlzYWJsZUFscGhhTW9kZSA9PSB0cnVlID8gY2hlY2tlZCA6IGVtcHR5KSArICIgdGl0bGU9J0lmIGNoZWNrZWQgdGhlIGRldmljZSBkb2VzIG5vdCBhZHZlcnRpc2UgdGhlIEE4UjhHOEI4IGRpc3BsYXkgbW9kZS4nPjwvdGQ+PC90cj4iOworCQlodG1sICs9ICI8dHI+PHRkPkRpc2FibGUgMTAtYml0IGRpc3BsYXkgZm9ybWF0czo8L3RkPjx0ZD48aW5wdXQgbmFtZSA9ICdkaXNhYmxlMTBCaXRNb2RlJyB0eXBlPSdjaGVja2JveCciICsgKGNvbmZpZy5kaXNhYmxlMTBCaXRNb2RlID09IHRydWUgPyBjaGVja2VkIDogZW1wdHkpICsgIiB0aXRsZT0nSWYgY2hlY2tlZCB0aGUgZGV2aWNlIGRvZXMgbm90IGFkdmVydGlzZSB0aGUgQTJSMTBHMTBCMTAgZGlzcGxheSBtb2RlLic+PC90ZD48L3RyPiI7CisJCWh0bWwgKz0gIjx0cj48dGQ+RnJhbWUtYnVmZmVyIEFQSTo8L3RkPjx0ZD48c2VsZWN0IG5hbWU9J2ZyYW1lQnVmZmVyQVBJJyB0aXRsZT0nVGhlIEFQSSB1c2VkIGZvciBkaXNwbGF5aW5nIHRoZSByZW5kZXJlZCByZXN1bHQgb24gc2NyZWVuIChyZXF1aXJlcyByZXN0YXJ0KS4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMCciICsgKGNvbmZpZy5mcmFtZUJ1ZmZlckFQSSA9PSAwID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPkRpcmVjdERyYXcgKGRlZmF1bHQpPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScxJyIgKyAoY29uZmlnLmZyYW1lQnVmZmVyQVBJID09IDEgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+R0RJPC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8L3NlbGVjdD48L3RkPlxuIjsKKwkJaHRtbCArPSAiPHRyPjx0ZD5TaGFkb3cgbWFwcGluZyBleHRlbnNpb25zOjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0nc2hhZG93TWFwcGluZycgdGl0bGU9J0ZlYXR1cmVzIHRoYXQgbWF5IGFjY2VsZXJhdGUgb3IgaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiBzaGFkb3cgbWFwcGluZy4nPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMCciICsgKGNvbmZpZy5zaGFkb3dNYXBwaW5nID09IDAgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+Tm9uZTwvb3B0aW9uPlxuIjsKKwkJaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nMSciICsgKGNvbmZpZy5zaGFkb3dNYXBwaW5nID09IDEgPyBzZWxlY3RlZCA6IGVtcHR5KSArICI+RmV0Y2g0PC9vcHRpb24+XG4iOworCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPScyJyIgKyAoY29uZmlnLnNoYWRvd01hcHBpbmcgPT0gMiA/IHNlbGVjdGVkIDogZW1wdHkpICsgIj5EU1Q8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JzMnIiArIChjb25maWcuc2hhZG93TWFwcGluZyA9PSAzID8gc2VsZWN0ZWQgOiBlbXB0eSkgKyAiPkZldGNoNCAmIERTVCAoZGVmYXVsdCk8L29wdGlvbj5cbiI7CisJCWh0bWwgKz0gIjwvc2VsZWN0PjwvdGQ+XG4iOworCQlodG1sICs9ICI8dHI+PHRkPkZvcmNlIGNsZWFyaW5nIHJlZ2lzdGVycyB0aGF0IGhhdmUgbm8gZGVmYXVsdCB2YWx1ZTo8L3RkPjx0ZD48aW5wdXQgbmFtZSA9ICdmb3JjZUNsZWFyUmVnaXN0ZXJzJyB0eXBlPSdjaGVja2JveCciICsgKGNvbmZpZy5mb3JjZUNsZWFyUmVnaXN0ZXJzID09IHRydWUgPyBjaGVja2VkIDogZW1wdHkpICsgIiB0aXRsZT0nSW5pdGlhbGl6ZXMgc2hhZGVyIHJlZ2lzdGVyIHZhbHVlcyB0byAwIGV2ZW4gaWYgdGhleSBoYXZlIG5vIGRlZmF1bHQuJz48L3RkPjwvdHI+IjsKKwkJaHRtbCArPSAiPC90YWJsZT5cbiI7CisJI2lmbmRlZiBOREVCVUcKKwkJaHRtbCArPSAiPGgyPjxlbT5EZWJ1Z2dpbmc8L2VtPjwvaDI+XG4iOworCQlodG1sICs9ICI8dGFibGU+XG4iOworCQlodG1sICs9ICI8dHI+PHRkPk1pbmltdW0gcHJpbWl0aXZlczo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgc2l6ZT0nMTAnIG1heGxlbmd0aD0nMTAnIG5hbWU9J21pblByaW1pdGl2ZXMnIHZhbHVlPSciICsgaXRvYShjb25maWcubWluUHJpbWl0aXZlcykgKyAiJz48L3RkPjwvdHI+XG4iOworCQlodG1sICs9ICI8dHI+PHRkPk1heGltdW0gcHJpbWl0aXZlczo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgc2l6ZT0nMTAnIG1heGxlbmd0aD0nMTAnIG5hbWU9J21heFByaW1pdGl2ZXMnIHZhbHVlPSciICsgaXRvYShjb25maWcubWF4UHJpbWl0aXZlcykgKyAiJz48L3RkPjwvdHI+XG4iOworCQlodG1sICs9ICI8L3RhYmxlPlxuIjsKKwkjZW5kaWYKKwkJaHRtbCArPSAiPGhyPjxwPlxuIjsKKwkJaHRtbCArPSAiPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMHB0Jz5Ib3ZlciB0aGUgbW91c2UgcG9pbnRlciBvdmVyIGEgY29udHJvbCB0byBnZXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3NwYW4+PGJyPlxuIjsKKwkJaHRtbCArPSAiPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMHB0Jz5Tb21lIHNldHRpbmdzIGNhbiBiZSBhcHBsaWVkIGludGVyYWN0aXZlbHksIHNvbWUgbmVlZCBhIHJlc3RhcnQgb2YgdGhlIGFwcGxpY2F0aW9uLjwvc3Bhbj48YnI+XG4iOworCQlodG1sICs9ICI8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwcHQnPlJlbW92aW5nIHRoZSBTd2lmdFNoYWRlci5pbmkgZmlsZSByZXN1bHRzIGluIHJlc2V0dGluZyB0aGUgb3B0aW9ucyB0byB0aGVpciBkZWZhdWx0Ljwvc3Bhbj48L3A+XG4iOworCQlodG1sICs9ICI8L2Zvcm0+XG4iOworCQlodG1sICs9ICI8L2JvZHk+XG4iOworCQlodG1sICs9ICI8L2h0bWw+XG4iOworCisJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCXByb2ZpbGVyLnJlc2V0KCk7CisJCSNlbmRpZgorCisJCXJldHVybiBodG1sOworCX0KKworCXN0ZDo6c3RyaW5nIFN3aWZ0Q29uZmlnOjpwcm9maWxlKCkKKwl7CisJCXN0ZDo6c3RyaW5nIGh0bWw7CisKKwkJI2lmIFBFUkZfUFJPRklMRQorCQkJaW50IHRleFRpbWUgPSAoaW50KSgxMDAwICogcHJvZmlsZXIuY3ljbGVzW1BFUkZfVEVYXSAvIHByb2ZpbGVyLmN5Y2xlc1tQRVJGX1BJWEVMXSArIDAuNSk7CisJCQlpbnQgc2hhZGVyVGltZSA9IChpbnQpKDEwMDAgKiBwcm9maWxlci5jeWNsZXNbUEVSRl9TSEFERVJdIC8gcHJvZmlsZXIuY3ljbGVzW1BFUkZfUElYRUxdICsgMC41KTsKKwkJCWludCBwaXBlVGltZSA9IChpbnQpKDEwMDAgKiBwcm9maWxlci5jeWNsZXNbUEVSRl9QSVBFXSAvIHByb2ZpbGVyLmN5Y2xlc1tQRVJGX1BJWEVMXSArIDAuNSk7CisJCQlpbnQgcm9wVGltZSA9IChpbnQpKDEwMDAgKiBwcm9maWxlci5jeWNsZXNbUEVSRl9ST1BdIC8gcHJvZmlsZXIuY3ljbGVzW1BFUkZfUElYRUxdICsgMC41KTsKKwkJCWludCBpbnRlcnBUaW1lID0gKGludCkoMTAwMCAqIHByb2ZpbGVyLmN5Y2xlc1tQRVJGX0lOVEVSUF0gLyBwcm9maWxlci5jeWNsZXNbUEVSRl9QSVhFTF0gKyAwLjUpOworCQkJaW50IHJhc3RUaW1lID0gMTAwMCAtIHBpcGVUaW1lOworCisJCQlwaXBlVGltZSAtPSBzaGFkZXJUaW1lICsgcm9wVGltZSArIGludGVycFRpbWU7CisJCQlzaGFkZXJUaW1lIC09IHRleFRpbWU7CisKKwkJCWRvdWJsZSB0ZXhUaW1lRiA9IChkb3VibGUpdGV4VGltZSAvIDEwOworCQkJZG91YmxlIHNoYWRlclRpbWVGID0gKGRvdWJsZSlzaGFkZXJUaW1lIC8gMTA7CisJCQlkb3VibGUgcGlwZVRpbWVGID0gKGRvdWJsZSlwaXBlVGltZSAvIDEwOworCQkJZG91YmxlIHJvcFRpbWVGID0gKGRvdWJsZSlyb3BUaW1lIC8gMTA7CisJCQlkb3VibGUgaW50ZXJwVGltZUYgPSAoZG91YmxlKWludGVycFRpbWUgLyAxMDsKKwkJCWRvdWJsZSByYXN0VGltZUYgPSAoZG91YmxlKXJhc3RUaW1lIC8gMTA7CisKKwkJCWRvdWJsZSBhdmVyYWdlUm9wT3BlcmF0aW9ucyA9IHByb2ZpbGVyLnJvcE9wZXJhdGlvbnNUb3RhbCAvIHN0ZDo6bWF4KHByb2ZpbGVyLmZyYW1lc1RvdGFsLCAxKSAvIDEuMGU2ZjsKKwkJCWRvdWJsZSBhdmVyYWdlQ29tcHJlc3NlZFRleCA9IHByb2ZpbGVyLmNvbXByZXNzZWRUZXhUb3RhbCAvIHN0ZDo6bWF4KHByb2ZpbGVyLmZyYW1lc1RvdGFsLCAxKSAvIDEuMGU2ZjsKKwkJCWRvdWJsZSBhdmVyYWdlVGV4T3BlcmF0aW9ucyA9IHByb2ZpbGVyLnRleE9wZXJhdGlvbnNUb3RhbCAvIHN0ZDo6bWF4KHByb2ZpbGVyLmZyYW1lc1RvdGFsLCAxKSAvIDEuMGU2ZjsKKworCQkJaHRtbCArPSAiPHA+RlBTOiAiICsgZnRvYShwcm9maWxlci5GUFMpICsgIjwvcD5cbiI7CisJCQlodG1sICs9ICI8cD5GcmFtZTogIiArIGl0b2EocHJvZmlsZXIuZnJhbWVzVG90YWwpICsgIjwvcD5cbiI7CisJCQlodG1sICs9ICI8cD5SYXN0ZXIgb3BlcmF0aW9ucyAobWlsbGlvbik6ICIgKyBmdG9hKHByb2ZpbGVyLnJvcE9wZXJhdGlvbnNGcmFtZSAvIDEuMGU2ZikgKyAiIChjdXJyZW50KSwgIiArIGZ0b2EoYXZlcmFnZVJvcE9wZXJhdGlvbnMpICsgIiAoYXZlcmFnZSk8L3A+XG4iOworCQkJaHRtbCArPSAiPHA+VGV4dHVyZSBvcGVyYXRpb25zIChtaWxsaW9uKTogIiArIGZ0b2EocHJvZmlsZXIudGV4T3BlcmF0aW9uc0ZyYW1lIC8gMS4wZTZmKSArICIgKGN1cnJlbnQpLCAiICsgZnRvYShhdmVyYWdlVGV4T3BlcmF0aW9ucykgKyAiIChhdmVyYWdlKTwvcD5cbiI7CisJCQlodG1sICs9ICI8cD5Db21wcmVzc2VkIHRleHR1cmUgb3BlcmF0aW9ucyAobWlsbGlvbik6ICIgKyBmdG9hKHByb2ZpbGVyLmNvbXByZXNzZWRUZXhGcmFtZSAvIDEuMGU2ZikgKyAiIChjdXJyZW50KSwgIiArIGZ0b2EoYXZlcmFnZUNvbXByZXNzZWRUZXgpICsgIiAoYXZlcmFnZSk8L3A+XG4iOworCQkJaHRtbCArPSAiPGRpdiBpZD0ncHJvZmlsZScgc3R5bGU9J3Bvc2l0aW9uOnJlbGF0aXZlOyB3aWR0aDoxMDEwcHg7IGhlaWdodDo1MHB4OyBiYWNrZ3JvdW5kLWNvbG9yOnNpbHZlcjsnPiI7CisJCQlodG1sICs9ICI8ZGl2IHN0eWxlPSdwb3NpdGlvbjpyZWxhdGl2ZTsgd2lkdGg6MTAwMHB4OyBoZWlnaHQ6NDBweDsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgbGVmdDo1cHg7IHRvcDo1cHg7Jz4iOworCQkJaHRtbCArPSAiPGRpdiBzdHlsZT0ncG9zaXRpb246cmVsYXRpdmU7IGZsb2F0OmxlZnQ7IHdpZHRoOiIgKyBpdG9hKHJhc3RUaW1lKSAgICsgInB4OyBoZWlnaHQ6NDBweDsgYm9yZGVyLXN0eWxlOm5vbmU7IHRleHQtYWxpZ246Y2VudGVyOyBsaW5lLWhlaWdodDo0MHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGN0Y7IG92ZXJmbG93OmhpZGRlbjsnPiIgKyBmdG9hKHJhc3RUaW1lRikgICArICIlIHJhc3Q8L2Rpdj5cbiI7CisJCQlodG1sICs9ICI8ZGl2IHN0eWxlPSdwb3NpdGlvbjpyZWxhdGl2ZTsgZmxvYXQ6bGVmdDsgd2lkdGg6IiArIGl0b2EocGlwZVRpbWUpICAgKyAicHg7IGhlaWdodDo0MHB4OyBib3JkZXItc3R5bGU6bm9uZTsgdGV4dC1hbGlnbjpjZW50ZXI7IGxpbmUtaGVpZ2h0OjQwcHg7IGJhY2tncm91bmQtY29sb3I6I0ZGN0Y3Rjsgb3ZlcmZsb3c6aGlkZGVuOyc+IiArIGZ0b2EocGlwZVRpbWVGKSAgICsgIiUgcGlwZTwvZGl2PlxuIjsKKwkJCWh0bWwgKz0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOnJlbGF0aXZlOyBmbG9hdDpsZWZ0OyB3aWR0aDoiICsgaXRvYShpbnRlcnBUaW1lKSArICJweDsgaGVpZ2h0OjQwcHg7IGJvcmRlci1zdHlsZTpub25lOyB0ZXh0LWFsaWduOmNlbnRlcjsgbGluZS1oZWlnaHQ6NDBweDsgYmFja2dyb3VuZC1jb2xvcjojN0ZGRkZGOyBvdmVyZmxvdzpoaWRkZW47Jz4iICsgZnRvYShpbnRlcnBUaW1lRikgKyAiJSBpbnRlcnA8L2Rpdj5cbiI7CisJCQlodG1sICs9ICI8ZGl2IHN0eWxlPSdwb3NpdGlvbjpyZWxhdGl2ZTsgZmxvYXQ6bGVmdDsgd2lkdGg6IiArIGl0b2Eoc2hhZGVyVGltZSkgKyAicHg7IGhlaWdodDo0MHB4OyBib3JkZXItc3R5bGU6bm9uZTsgdGV4dC1hbGlnbjpjZW50ZXI7IGxpbmUtaGVpZ2h0OjQwcHg7IGJhY2tncm91bmQtY29sb3I6IzdGRkY3Rjsgb3ZlcmZsb3c6aGlkZGVuOyc+IiArIGZ0b2Eoc2hhZGVyVGltZUYpICsgIiUgc2hhZGVyPC9kaXY+XG4iOworCQkJaHRtbCArPSAiPGRpdiBzdHlsZT0ncG9zaXRpb246cmVsYXRpdmU7IGZsb2F0OmxlZnQ7IHdpZHRoOiIgKyBpdG9hKHRleFRpbWUpICAgICsgInB4OyBoZWlnaHQ6NDBweDsgYm9yZGVyLXN0eWxlOm5vbmU7IHRleHQtYWxpZ246Y2VudGVyOyBsaW5lLWhlaWdodDo0MHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiNGRjdGRkY7IG92ZXJmbG93OmhpZGRlbjsnPiIgKyBmdG9hKHRleFRpbWVGKSAgICArICIlIHRleDwvZGl2PlxuIjsKKwkJCWh0bWwgKz0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOnJlbGF0aXZlOyBmbG9hdDpsZWZ0OyB3aWR0aDoiICsgaXRvYShyb3BUaW1lKSAgICArICJweDsgaGVpZ2h0OjQwcHg7IGJvcmRlci1zdHlsZTpub25lOyB0ZXh0LWFsaWduOmNlbnRlcjsgbGluZS1oZWlnaHQ6NDBweDsgYmFja2dyb3VuZC1jb2xvcjojN0Y3RkZGOyBvdmVyZmxvdzpoaWRkZW47Jz4iICsgZnRvYShyb3BUaW1lRikgICAgKyAiJSByb3A8L2Rpdj5cbiI7CisJCQlodG1sICs9ICI8L2Rpdj48L2Rpdj5cbiI7CisKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBQRVJGX1RJTUVSUzsgaSsrKQorCQkJeworCQkJCXByb2ZpbGVyLmN5Y2xlc1tpXSA9IDA7CisJCQl9CisJCSNlbmRpZgorCisJCXJldHVybiBodG1sOworCX0KKworCXZvaWQgU3dpZnRDb25maWc6OnNlbmQoU3RhdHVzIGNvZGUsIHN0ZDo6c3RyaW5nIGJvZHkpCisJeworCQlzdGQ6OnN0cmluZyBzdGF0dXM7CisJCWNoYXIgaGVhZGVyWzEwMjRdOworCisJCXN3aXRjaChjb2RlKQorCQl7CisJCWNhc2UgT0s6ICAgICAgIHN0YXR1cyArPSAiSFRUUC8xLjEgMjAwIE9LXHJcbiI7ICAgICAgICBicmVhazsKKwkJY2FzZSBOb3RGb3VuZDogc3RhdHVzICs9ICJIVFRQLzEuMSA0MDQgTm90IEZvdW5kXHJcbiI7IGJyZWFrOworCQl9CisKKwkJc3ByaW50ZihoZWFkZXIsICJDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFxyXG4iCisJCQkJCQkiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIKKwkJCQkJCSJIb3N0OiBsb2NhbGhvc3RcclxuIgorCQkJCQkJIlxyXG4iLCBib2R5LnNpemUoKSk7CisKKwkJc3RkOjpzdHJpbmcgbWVzc2FnZSA9IHN0YXR1cyArIGhlYWRlciArIGJvZHk7CisJCTo6c2VuZChjbGllbnRTb2NrZXQsIG1lc3NhZ2UuY19zdHIoKSwgKGludCltZXNzYWdlLmxlbmd0aCgpLCAwKTsKKwl9CisKKwl2b2lkIFN3aWZ0Q29uZmlnOjpwYXJzZVBvc3QoY29uc3QgY2hhciAqcG9zdCkKKwl7CisJCS8vIE9ubHkgZW5hYmxlZCBjaGVja2JveGVzIGFwcGVhciBpbiB0aGUgUE9TVAorCQljb25maWcuZW5hYmxlU1NFID0gdHJ1ZTsKKwkJY29uZmlnLmVuYWJsZVNTRTIgPSB0cnVlOworCQljb25maWcuZW5hYmxlU1NFMyA9IGZhbHNlOworCQljb25maWcuZW5hYmxlU1NTRTMgPSBmYWxzZTsKKwkJY29uZmlnLmVuYWJsZVNTRTRfMSA9IGZhbHNlOworCQljb25maWcuZGlzYWJsZVNlcnZlciA9IGZhbHNlOworCQljb25maWcuZm9yY2VXaW5kb3dlZCA9IGZhbHNlOworCQljb25maWcuY29tcGxlbWVudGFyeURlcHRoQnVmZmVyID0gZmFsc2U7CisJCWNvbmZpZy5wb3N0QmxlbmRTUkdCID0gZmFsc2U7CisJCWNvbmZpZy5leGFjdENvbG9yUm91bmRpbmcgPSBmYWxzZTsKKwkJY29uZmlnLmRpc2FibGVBbHBoYU1vZGUgPSBmYWxzZTsKKwkJY29uZmlnLmRpc2FibGUxMEJpdE1vZGUgPSBmYWxzZTsKKwkJY29uZmlnLmZvcmNlQ2xlYXJSZWdpc3RlcnMgPSBmYWxzZTsKKworCQl3aGlsZSgqcG9zdCAhPSAwKQorCQl7CisJCQlpbnQgaW50ZWdlcjsKKwkJCWludCBpbmRleDsKKworCQkJaWYoc3NjYW5mKHBvc3QsICJwaXhlbFNoYWRlclZlcnNpb249JWQiLCAmaW50ZWdlcikpCisJCQl7CisJCQkJY29uZmlnLnBpeGVsU2hhZGVyVmVyc2lvbiA9IGludGVnZXI7CisJCQl9CisJCQllbHNlIGlmKHNzY2FuZihwb3N0LCAidmVydGV4U2hhZGVyVmVyc2lvbj0lZCIsICZpbnRlZ2VyKSkKKwkJCXsKKwkJCQljb25maWcudmVydGV4U2hhZGVyVmVyc2lvbiA9IGludGVnZXI7CisJCQl9CisJCQllbHNlIGlmKHNzY2FuZihwb3N0LCAidGV4dHVyZU1lbW9yeT0lZCIsICZpbnRlZ2VyKSkKKwkJCXsKKwkJCQljb25maWcudGV4dHVyZU1lbW9yeSA9IGludGVnZXI7CisJCQl9CisJCQllbHNlIGlmKHNzY2FuZihwb3N0LCAiaWRlbnRpZmllcj0lZCIsICZpbnRlZ2VyKSkKKwkJCXsKKwkJCQljb25maWcuaWRlbnRpZmllciA9IGludGVnZXI7CisJCQl9CisJCQllbHNlIGlmKHNzY2FuZihwb3N0LCAidmVydGV4Um91dGluZUNhY2hlU2l6ZT0lZCIsICZpbnRlZ2VyKSkKKwkJCXsKKwkJCQljb25maWcudmVydGV4Um91dGluZUNhY2hlU2l6ZSA9IGludGVnZXI7CisJCQl9CisJCQllbHNlIGlmKHNzY2FuZihwb3N0LCAicGl4ZWxSb3V0aW5lQ2FjaGVTaXplPSVkIiwgJmludGVnZXIpKQorCQkJeworCQkJCWNvbmZpZy5waXhlbFJvdXRpbmVDYWNoZVNpemUgPSBpbnRlZ2VyOworCQkJfQorCQkJZWxzZSBpZihzc2NhbmYocG9zdCwgInNldHVwUm91dGluZUNhY2hlU2l6ZT0lZCIsICZpbnRlZ2VyKSkKKwkJCXsKKwkJCQljb25maWcuc2V0dXBSb3V0aW5lQ2FjaGVTaXplID0gaW50ZWdlcjsKKwkJCX0KKwkJCWVsc2UgaWYoc3NjYW5mKHBvc3QsICJ2ZXJ0ZXhDYWNoZVNpemU9JWQiLCAmaW50ZWdlcikpCisJCQl7CisJCQkJY29uZmlnLnZlcnRleENhY2hlU2l6ZSA9IGludGVnZXI7CisJCQl9CisJCQllbHNlIGlmKHNzY2FuZihwb3N0LCAidGV4dHVyZVNhbXBsZVF1YWxpdHk9JWQiLCAmaW50ZWdlcikpCisJCQl7CisJCQkJY29uZmlnLnRleHR1cmVTYW1wbGVRdWFsaXR5ID0gaW50ZWdlcjsKKwkJCX0KKwkJCWVsc2UgaWYoc3NjYW5mKHBvc3QsICJtaXBtYXBRdWFsaXR5PSVkIiwgJmludGVnZXIpKQorCQkJeworCQkJCWNvbmZpZy5taXBtYXBRdWFsaXR5ID0gaW50ZWdlcjsKKwkJCX0KKwkJCWVsc2UgaWYoc3NjYW5mKHBvc3QsICJwZXJzcGVjdGl2ZUNvcnJlY3Rpb249JWQiLCAmaW50ZWdlcikpCisJCQl7CisJCQkJY29uZmlnLnBlcnNwZWN0aXZlQ29ycmVjdGlvbiA9IGludGVnZXIgIT0gMDsKKwkJCX0KKwkJCWVsc2UgaWYoc3NjYW5mKHBvc3QsICJ0cmFuc2NlbmRlbnRhbFByZWNpc2lvbj0lZCIsICZpbnRlZ2VyKSkKKwkJCXsKKwkJCQljb25maWcudHJhbnNjZW5kZW50YWxQcmVjaXNpb24gPSBpbnRlZ2VyOworCQkJfQorCQkJZWxzZSBpZihzc2NhbmYocG9zdCwgInRyYW5zcGFyZW5jeUFudGlhbGlhc2luZz0lZCIsICZpbnRlZ2VyKSkKKwkJCXsKKwkJCQljb25maWcudHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nID0gaW50ZWdlcjsKKwkJCX0KKwkJCWVsc2UgaWYoc3NjYW5mKHBvc3QsICJ0aHJlYWRDb3VudD0lZCIsICZpbnRlZ2VyKSkKKwkJCXsKKwkJCQljb25maWcudGhyZWFkQ291bnQgPSBpbnRlZ2VyOworCQkJfQorCQkJZWxzZSBpZihzc2NhbmYocG9zdCwgImZyYW1lQnVmZmVyQVBJPSVkIiwgJmludGVnZXIpKQorCQkJeworCQkJCWNvbmZpZy5mcmFtZUJ1ZmZlckFQSSA9IGludGVnZXI7CisJCQl9CisJCQllbHNlIGlmKHNzY2FuZihwb3N0LCAic2hhZG93TWFwcGluZz0lZCIsICZpbnRlZ2VyKSkKKwkJCXsKKwkJCQljb25maWcuc2hhZG93TWFwcGluZyA9IGludGVnZXI7CisJCQl9CisJCQllbHNlIGlmKHN0cnN0cihwb3N0LCAiZW5hYmxlU1NFPW9uIikpCisJCQl7CisJCQkJY29uZmlnLmVuYWJsZVNTRSA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmKHN0cnN0cihwb3N0LCAiZW5hYmxlU1NFMj1vbiIpKQorCQkJeworCQkJCWlmKGNvbmZpZy5lbmFibGVTU0UpCisJCQkJeworCQkJCQljb25maWcuZW5hYmxlU1NFMiA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihzdHJzdHIocG9zdCwgImVuYWJsZVNTRTM9b24iKSkKKwkJCXsKKwkJCQlpZihjb25maWcuZW5hYmxlU1NFMikKKwkJCQl7CisJCQkJCWNvbmZpZy5lbmFibGVTU0UzID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKHN0cnN0cihwb3N0LCAiZW5hYmxlU1NTRTM9b24iKSkKKwkJCXsKKwkJCQlpZihjb25maWcuZW5hYmxlU1NFMykKKwkJCQl7CisJCQkJCWNvbmZpZy5lbmFibGVTU1NFMyA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihzdHJzdHIocG9zdCwgImVuYWJsZVNTRTRfMT1vbiIpKQorCQkJeworCQkJCWlmKGNvbmZpZy5lbmFibGVTU1NFMykKKwkJCQl7CisJCQkJCWNvbmZpZy5lbmFibGVTU0U0XzEgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoc3NjYW5mKHBvc3QsICJvcHRpbWl6YXRpb24lZD0lZCIsICZpbmRleCwgJmludGVnZXIpKQorCQkJeworCQkJCWNvbmZpZy5vcHRpbWl6YXRpb25baW5kZXggLSAxXSA9IChPcHRpbWl6YXRpb24paW50ZWdlcjsKKwkJCX0KKwkJCWVsc2UgaWYoc3Ryc3RyKHBvc3QsICJkaXNhYmxlU2VydmVyPW9uIikpCisJCQl7CisJCQkJY29uZmlnLmRpc2FibGVTZXJ2ZXIgPSB0cnVlOworCQkJfQorCQkJZWxzZSBpZihzdHJzdHIocG9zdCwgImZvcmNlV2luZG93ZWQ9b24iKSkKKwkJCXsKKwkJCQljb25maWcuZm9yY2VXaW5kb3dlZCA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmKHN0cnN0cihwb3N0LCAiY29tcGxlbWVudGFyeURlcHRoQnVmZmVyPW9uIikpCisJCQl7CisJCQkJY29uZmlnLmNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlciA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmKHN0cnN0cihwb3N0LCAicG9zdEJsZW5kU1JHQj1vbiIpKQorCQkJeworCQkJCWNvbmZpZy5wb3N0QmxlbmRTUkdCID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UgaWYoc3Ryc3RyKHBvc3QsICJleGFjdENvbG9yUm91bmRpbmc9b24iKSkKKwkJCXsKKwkJCQljb25maWcuZXhhY3RDb2xvclJvdW5kaW5nID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UgaWYoc3Ryc3RyKHBvc3QsICJkaXNhYmxlQWxwaGFNb2RlPW9uIikpCisJCQl7CisJCQkJY29uZmlnLmRpc2FibGVBbHBoYU1vZGUgPSB0cnVlOworCQkJfQorCQkJZWxzZSBpZihzdHJzdHIocG9zdCwgImRpc2FibGUxMEJpdE1vZGU9b24iKSkKKwkJCXsKKwkJCQljb25maWcuZGlzYWJsZTEwQml0TW9kZSA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmKHN0cnN0cihwb3N0LCAiZm9yY2VDbGVhclJlZ2lzdGVycz1vbiIpKQorCQkJeworCQkJCWNvbmZpZy5mb3JjZUNsZWFyUmVnaXN0ZXJzID0gdHJ1ZTsKKwkJCX0KKwkJI2lmbmRlZiBOREVCVUcJCQorCQkJZWxzZSBpZihzc2NhbmYocG9zdCwgIm1pblByaW1pdGl2ZXM9JWQiLCAmaW50ZWdlcikpCisJCQl7CisJCQkJY29uZmlnLm1pblByaW1pdGl2ZXMgPSBpbnRlZ2VyOworCQkJfQorCQkJZWxzZSBpZihzc2NhbmYocG9zdCwgIm1heFByaW1pdGl2ZXM9JWQiLCAmaW50ZWdlcikpCisJCQl7CisJCQkJY29uZmlnLm1heFByaW1pdGl2ZXMgPSBpbnRlZ2VyOworCQkJfQorCQkjZW5kaWYKKwkJCWVsc2UKKwkJCXsKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCisJCQlkbworCQkJeworCQkJCXBvc3QrKzsKKwkJCX0KKwkJCXdoaWxlKHBvc3RbLTFdICE9ICcmJyAmJiAqcG9zdCAhPSAwKTsKKwkJfQorCX0KKworCXZvaWQgU3dpZnRDb25maWc6OnJlYWRDb25maWd1cmF0aW9uKGJvb2wgZGlzYWJsZVNlcnZlck92ZXJyaWRlKQorCXsKKwkJQ29uZmlndXJhdG9yIGluaSgiU3dpZnRTaGFkZXIuaW5pIik7CisKKwkJY29uZmlnLnBpeGVsU2hhZGVyVmVyc2lvbiA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiUGl4ZWxTaGFkZXJWZXJzaW9uIiwgMzApOworCQljb25maWcudmVydGV4U2hhZGVyVmVyc2lvbiA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiVmVydGV4U2hhZGVyVmVyc2lvbiIsIDMwKTsKKwkJY29uZmlnLnRleHR1cmVNZW1vcnkgPSBpbmkuZ2V0SW50ZWdlcigiQ2FwYWJpbGl0aWVzIiwgIlRleHR1cmVNZW1vcnkiLCAyNTYpOworCQljb25maWcuaWRlbnRpZmllciA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiSWRlbnRpZmllciIsIDApOworCQljb25maWcudmVydGV4Um91dGluZUNhY2hlU2l6ZSA9IGluaS5nZXRJbnRlZ2VyKCJDYWNoZXMiLCAiVmVydGV4Um91dGluZUNhY2hlU2l6ZSIsIDEwMjQpOworCQljb25maWcucGl4ZWxSb3V0aW5lQ2FjaGVTaXplID0gaW5pLmdldEludGVnZXIoIkNhY2hlcyIsICJQaXhlbFJvdXRpbmVDYWNoZVNpemUiLCAxMDI0KTsKKwkJY29uZmlnLnNldHVwUm91dGluZUNhY2hlU2l6ZSA9IGluaS5nZXRJbnRlZ2VyKCJDYWNoZXMiLCAiU2V0dXBSb3V0aW5lQ2FjaGVTaXplIiwgMTAyNCk7CisJCWNvbmZpZy52ZXJ0ZXhDYWNoZVNpemUgPSBpbmkuZ2V0SW50ZWdlcigiQ2FjaGVzIiwgIlZlcnRleENhY2hlU2l6ZSIsIDY0KTsKKwkJY29uZmlnLnRleHR1cmVTYW1wbGVRdWFsaXR5ID0gaW5pLmdldEludGVnZXIoIlF1YWxpdHkiLCAiVGV4dHVyZVNhbXBsZVF1YWxpdHkiLCAyKTsKKwkJY29uZmlnLm1pcG1hcFF1YWxpdHkgPSBpbmkuZ2V0SW50ZWdlcigiUXVhbGl0eSIsICJNaXBtYXBRdWFsaXR5IiwgMSk7CisJCWNvbmZpZy5wZXJzcGVjdGl2ZUNvcnJlY3Rpb24gPSBpbmkuZ2V0Qm9vbGVhbigiUXVhbGl0eSIsICJQZXJzcGVjdGl2ZUNvcnJlY3Rpb24iLCB0cnVlKTsKKwkJY29uZmlnLnRyYW5zY2VuZGVudGFsUHJlY2lzaW9uID0gaW5pLmdldEludGVnZXIoIlF1YWxpdHkiLCAiVHJhbnNjZW5kZW50YWxQcmVjaXNpb24iLCAyKTsKKwkJY29uZmlnLnRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyA9IGluaS5nZXRJbnRlZ2VyKCJRdWFsaXR5IiwgIlRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyIsIDApOworCQljb25maWcudGhyZWFkQ291bnQgPSBpbmkuZ2V0SW50ZWdlcigiUHJvY2Vzc29yIiwgIlRocmVhZENvdW50IiwgMCk7CisJCWNvbmZpZy5lbmFibGVTU0UgPSBpbmkuZ2V0Qm9vbGVhbigiUHJvY2Vzc29yIiwgIkVuYWJsZVNTRSIsIHRydWUpOworCQljb25maWcuZW5hYmxlU1NFMiA9IGluaS5nZXRCb29sZWFuKCJQcm9jZXNzb3IiLCAiRW5hYmxlU1NFMiIsIHRydWUpOworCQljb25maWcuZW5hYmxlU1NFMyA9IGluaS5nZXRCb29sZWFuKCJQcm9jZXNzb3IiLCAiRW5hYmxlU1NFMyIsIHRydWUpOworCQljb25maWcuZW5hYmxlU1NTRTMgPSBpbmkuZ2V0Qm9vbGVhbigiUHJvY2Vzc29yIiwgIkVuYWJsZVNTU0UzIiwgdHJ1ZSk7CisJCWNvbmZpZy5lbmFibGVTU0U0XzEgPSBpbmkuZ2V0Qm9vbGVhbigiUHJvY2Vzc29yIiwgIkVuYWJsZVNTRTRfMSIsIHRydWUpOworCisJCWZvcihpbnQgcGFzcyA9IDA7IHBhc3MgPCAxMDsgcGFzcysrKQorCQl7CisJCQljb25maWcub3B0aW1pemF0aW9uW3Bhc3NdID0gKE9wdGltaXphdGlvbilpbmkuZ2V0SW50ZWdlcigiT3B0aW1pemF0aW9uIiwgIk9wdGltaXphdGlvblBhc3MiICsgaXRvYShwYXNzICsgMSksIHBhc3MgPT0gMCA/IEluc3RydWN0aW9uQ29tYmluaW5nIDogRGlzYWJsZWQpOworCQl9CisKKwkJY29uZmlnLmRpc2FibGVTZXJ2ZXIgPSBpbmkuZ2V0Qm9vbGVhbigiVGVzdGluZyIsICJEaXNhYmxlU2VydmVyIiwgdHJ1ZSk7CisJCWNvbmZpZy5mb3JjZVdpbmRvd2VkID0gaW5pLmdldEJvb2xlYW4oIlRlc3RpbmciLCAiRm9yY2VXaW5kb3dlZCIsIGZhbHNlKTsKKwkJY29uZmlnLmNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlciA9IGluaS5nZXRCb29sZWFuKCJUZXN0aW5nIiwgIkNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlciIsIGZhbHNlKTsKKwkJY29uZmlnLnBvc3RCbGVuZFNSR0IgPSBpbmkuZ2V0Qm9vbGVhbigiVGVzdGluZyIsICJQb3N0QmxlbmRTUkdCIiwgZmFsc2UpOworCQljb25maWcuZXhhY3RDb2xvclJvdW5kaW5nID0gaW5pLmdldEJvb2xlYW4oIlRlc3RpbmciLCAiRXhhY3RDb2xvclJvdW5kaW5nIiwgZmFsc2UpOworCQljb25maWcuZGlzYWJsZUFscGhhTW9kZSA9IGluaS5nZXRCb29sZWFuKCJUZXN0aW5nIiwgIkRpc2FibGVBbHBoYU1vZGUiLCBmYWxzZSk7CisJCWNvbmZpZy5kaXNhYmxlMTBCaXRNb2RlID0gaW5pLmdldEJvb2xlYW4oIlRlc3RpbmciLCAiRGlzYWJsZTEwQml0TW9kZSIsIGZhbHNlKTsKKwkJY29uZmlnLmZyYW1lQnVmZmVyQVBJID0gaW5pLmdldEludGVnZXIoIlRlc3RpbmciLCAiRnJhbWVCdWZmZXJBUEkiLCAwKTsKKwkJY29uZmlnLnNoYWRvd01hcHBpbmcgPSBpbmkuZ2V0SW50ZWdlcigiVGVzdGluZyIsICJTaGFkb3dNYXBwaW5nIiwgMyk7CisJCWNvbmZpZy5mb3JjZUNsZWFyUmVnaXN0ZXJzID0gaW5pLmdldEJvb2xlYW4oIlRlc3RpbmciLCAiRm9yY2VDbGVhclJlZ2lzdGVycyIsIGZhbHNlKTsKKworCSNpZm5kZWYgTkRFQlVHCisJCWNvbmZpZy5taW5QcmltaXRpdmVzID0gMTsKKwkJY29uZmlnLm1heFByaW1pdGl2ZXMgPSAxIDw8IDIxOworCSNlbmRpZgorCisJCXN0cnVjdCBzdGF0IHN0YXR1czsKKwkJaW50IGxhc3RNb2RpZmllZCA9IGluaS5nZXRJbnRlZ2VyKCJMYXN0TW9kaWZpZWQiLCAiVGltZSIsIDApOworCisJCWJvb2wgbm9Db25maWcgPSBzdGF0KCJTd2lmdFNoYWRlci5pbmkiLCAmc3RhdHVzKSAhPSAwOworCQluZXdDb25maWcgPSAhbm9Db25maWcgJiYgYWJzKChpbnQpc3RhdHVzLnN0X210aW1lIC0gbGFzdE1vZGlmaWVkKSA+IDE7CisKKwkJaWYoZGlzYWJsZVNlcnZlck92ZXJyaWRlKQorCQl7CisJCQljb25maWcuZGlzYWJsZVNlcnZlciA9IHRydWU7CisJCX0KKwl9CisKKwl2b2lkIFN3aWZ0Q29uZmlnOjp3cml0ZUNvbmZpZ3VyYXRpb24oKQorCXsKKwkJQ29uZmlndXJhdG9yIGluaSgiU3dpZnRTaGFkZXIuaW5pIik7CisJCQorCQlpbmkuYWRkVmFsdWUoIkNhcGFiaWxpdGllcyIsICJQaXhlbFNoYWRlclZlcnNpb24iLCBpdG9hKGNvbmZpZy5waXhlbFNoYWRlclZlcnNpb24pKTsKKwkJaW5pLmFkZFZhbHVlKCJDYXBhYmlsaXRpZXMiLCAiVmVydGV4U2hhZGVyVmVyc2lvbiIsIGl0b2EoY29uZmlnLnZlcnRleFNoYWRlclZlcnNpb24pKTsKKwkJaW5pLmFkZFZhbHVlKCJDYXBhYmlsaXRpZXMiLCAiVGV4dHVyZU1lbW9yeSIsIGl0b2EoY29uZmlnLnRleHR1cmVNZW1vcnkpKTsKKwkJaW5pLmFkZFZhbHVlKCJDYXBhYmlsaXRpZXMiLCAiSWRlbnRpZmllciIsIGl0b2EoY29uZmlnLmlkZW50aWZpZXIpKTsKKwkJaW5pLmFkZFZhbHVlKCJDYWNoZXMiLCAiVmVydGV4Um91dGluZUNhY2hlU2l6ZSIsIGl0b2EoY29uZmlnLnZlcnRleFJvdXRpbmVDYWNoZVNpemUpKTsKKwkJaW5pLmFkZFZhbHVlKCJDYWNoZXMiLCAiUGl4ZWxSb3V0aW5lQ2FjaGVTaXplIiwgaXRvYShjb25maWcucGl4ZWxSb3V0aW5lQ2FjaGVTaXplKSk7CisJCWluaS5hZGRWYWx1ZSgiQ2FjaGVzIiwgIlNldHVwUm91dGluZUNhY2hlU2l6ZSIsIGl0b2EoY29uZmlnLnNldHVwUm91dGluZUNhY2hlU2l6ZSkpOworCQlpbmkuYWRkVmFsdWUoIkNhY2hlcyIsICJWZXJ0ZXhDYWNoZVNpemUiLCBpdG9hKGNvbmZpZy52ZXJ0ZXhDYWNoZVNpemUpKTsKKwkJaW5pLmFkZFZhbHVlKCJRdWFsaXR5IiwgIlRleHR1cmVTYW1wbGVRdWFsaXR5IiwgaXRvYShjb25maWcudGV4dHVyZVNhbXBsZVF1YWxpdHkpKTsKKwkJaW5pLmFkZFZhbHVlKCJRdWFsaXR5IiwgIk1pcG1hcFF1YWxpdHkiLCBpdG9hKGNvbmZpZy5taXBtYXBRdWFsaXR5KSk7CisJCWluaS5hZGRWYWx1ZSgiUXVhbGl0eSIsICJQZXJzcGVjdGl2ZUNvcnJlY3Rpb24iLCBpdG9hKGNvbmZpZy5wZXJzcGVjdGl2ZUNvcnJlY3Rpb24pKTsKKwkJaW5pLmFkZFZhbHVlKCJRdWFsaXR5IiwgIlRyYW5zY2VuZGVudGFsUHJlY2lzaW9uIiwgaXRvYShjb25maWcudHJhbnNjZW5kZW50YWxQcmVjaXNpb24pKTsKKwkJaW5pLmFkZFZhbHVlKCJRdWFsaXR5IiwgIlRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyIsIGl0b2EoY29uZmlnLnRyYW5zcGFyZW5jeUFudGlhbGlhc2luZykpOworCQlpbmkuYWRkVmFsdWUoIlByb2Nlc3NvciIsICJUaHJlYWRDb3VudCIsIGl0b2EoY29uZmlnLnRocmVhZENvdW50KSk7CisJLy8JaW5pLmFkZFZhbHVlKCJQcm9jZXNzb3IiLCAiRW5hYmxlU1NFIiwgaXRvYShjb25maWcuZW5hYmxlU1NFKSk7CisJLy8JaW5pLmFkZFZhbHVlKCJQcm9jZXNzb3IiLCAiRW5hYmxlU1NFMiIsIGl0b2EoY29uZmlnLmVuYWJsZVNTRTIpKTsKKwkJaW5pLmFkZFZhbHVlKCJQcm9jZXNzb3IiLCAiRW5hYmxlU1NFMyIsIGl0b2EoY29uZmlnLmVuYWJsZVNTRTMpKTsKKwkJaW5pLmFkZFZhbHVlKCJQcm9jZXNzb3IiLCAiRW5hYmxlU1NTRTMiLCBpdG9hKGNvbmZpZy5lbmFibGVTU1NFMykpOworCQlpbmkuYWRkVmFsdWUoIlByb2Nlc3NvciIsICJFbmFibGVTU0U0XzEiLCBpdG9hKGNvbmZpZy5lbmFibGVTU0U0XzEpKTsKKworCQlmb3IoaW50IHBhc3MgPSAwOyBwYXNzIDwgMTA7IHBhc3MrKykKKwkJeworCQkJaW5pLmFkZFZhbHVlKCJPcHRpbWl6YXRpb24iLCAiT3B0aW1pemF0aW9uUGFzcyIgKyBpdG9hKHBhc3MgKyAxKSwgaXRvYShjb25maWcub3B0aW1pemF0aW9uW3Bhc3NdKSk7CisJCX0KKworCQlpbmkuYWRkVmFsdWUoIlRlc3RpbmciLCAiRGlzYWJsZVNlcnZlciIsIGl0b2EoY29uZmlnLmRpc2FibGVTZXJ2ZXIpKTsKKwkJaW5pLmFkZFZhbHVlKCJUZXN0aW5nIiwgIkZvcmNlV2luZG93ZWQiLCBpdG9hKGNvbmZpZy5mb3JjZVdpbmRvd2VkKSk7CisJCWluaS5hZGRWYWx1ZSgiVGVzdGluZyIsICJDb21wbGVtZW50YXJ5RGVwdGhCdWZmZXIiLCBpdG9hKGNvbmZpZy5jb21wbGVtZW50YXJ5RGVwdGhCdWZmZXIpKTsKKwkJaW5pLmFkZFZhbHVlKCJUZXN0aW5nIiwgIlBvc3RCbGVuZFNSR0IiLCBpdG9hKGNvbmZpZy5wb3N0QmxlbmRTUkdCKSk7CisJCWluaS5hZGRWYWx1ZSgiVGVzdGluZyIsICJFeGFjdENvbG9yUm91bmRpbmciLCBpdG9hKGNvbmZpZy5leGFjdENvbG9yUm91bmRpbmcpKTsKKwkJaW5pLmFkZFZhbHVlKCJUZXN0aW5nIiwgIkRpc2FibGVBbHBoYU1vZGUiLCBpdG9hKGNvbmZpZy5kaXNhYmxlQWxwaGFNb2RlKSk7CisJCWluaS5hZGRWYWx1ZSgiVGVzdGluZyIsICJEaXNhYmxlMTBCaXRNb2RlIiwgaXRvYShjb25maWcuZGlzYWJsZTEwQml0TW9kZSkpOworCQlpbmkuYWRkVmFsdWUoIlRlc3RpbmciLCAiRnJhbWVCdWZmZXJBUEkiLCBpdG9hKGNvbmZpZy5mcmFtZUJ1ZmZlckFQSSkpOworCQlpbmkuYWRkVmFsdWUoIlRlc3RpbmciLCAiU2hhZG93TWFwcGluZyIsIGl0b2EoY29uZmlnLnNoYWRvd01hcHBpbmcpKTsKKwkJaW5pLmFkZFZhbHVlKCJUZXN0aW5nIiwgIkZvcmNlQ2xlYXJSZWdpc3RlcnMiLCBpdG9hKGNvbmZpZy5mb3JjZUNsZWFyUmVnaXN0ZXJzKSk7CisJCWluaS5hZGRWYWx1ZSgiTGFzdE1vZGlmaWVkIiwgIlRpbWUiLCBpdG9hKChpbnQpdGltZSgwKSkpOworCisJCWluaS53cml0ZUZpbGUoIlN3aWZ0U2hhZGVyIENvbmZpZ3VyYXRpb24gRmlsZVxuIgorCQkgICAgICAgICAgICAgICI7XG4iCisJCQkJCSAgIjsgVG8gZ2V0IGFuIG92ZXJ2aWV3IG9mIHRoZSB2YWxpZCBzZXR0aW5ncyBhbmQgdGhlaXIgbWVhbmluZyxcbiIKKwkJCQkJICAiOyBydW4gdGhlIGFwcGxpY2F0aW9uIGluIHdpbmRvd2VkIG1vZGUgYW5kIG9wZW4gdGhlXG4iCisJCQkJCSAgIjsgU3dpZnRDb25maWcgYXBwbGljYXRpb24gb3IgZ28gdG8gaHR0cDovL2xvY2FsaG9zdDo4MDgwL3N3aWZ0Y29uZmlnLiIpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9NYWluL1N3aWZ0Q29uZmlnLmhwcCBiL3NyYy9NYWluL1N3aWZ0Q29uZmlnLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDkxZjBkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL01haW4vU3dpZnRDb25maWcuaHBwCkBAIC0wLDAgKzEsMTExIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZiBzd19Td2lmdENvbmZpZ19ocHANCisjZGVmaW5lIHN3X1N3aWZ0Q29uZmlnX2hwcA0KKw0KKyNpbmNsdWRlICJOdWNsZXVzLmhwcCINCisNCisjaW5jbHVkZSA8d2luc29jazIuaD4NCisjaW5jbHVkZSA8d3MydGNwaXAuaD4NCisjaW5jbHVkZSA8c3RyaW5nPg0KKw0KK25hbWVzcGFjZSBzdw0KK3sNCisJY2xhc3MgU3dpZnRDb25maWcNCisJew0KKwlwdWJsaWM6DQorCQlzdHJ1Y3QgQ29uZmlndXJhdGlvbg0KKwkJew0KKwkJCWludCBwaXhlbFNoYWRlclZlcnNpb247DQorCQkJaW50IHZlcnRleFNoYWRlclZlcnNpb247DQorCQkJaW50IHRleHR1cmVNZW1vcnk7DQorCQkJaW50IGlkZW50aWZpZXI7DQorCQkJaW50IHZlcnRleFJvdXRpbmVDYWNoZVNpemU7DQorCQkJaW50IHBpeGVsUm91dGluZUNhY2hlU2l6ZTsNCisJCQlpbnQgc2V0dXBSb3V0aW5lQ2FjaGVTaXplOw0KKwkJCWludCB2ZXJ0ZXhDYWNoZVNpemU7DQorCQkJaW50IHRleHR1cmVTYW1wbGVRdWFsaXR5Ow0KKwkJCWludCBtaXBtYXBRdWFsaXR5Ow0KKwkJCWJvb2wgcGVyc3BlY3RpdmVDb3JyZWN0aW9uOw0KKwkJCWludCB0cmFuc2NlbmRlbnRhbFByZWNpc2lvbjsNCisJCQlpbnQgdGhyZWFkQ291bnQ7DQorCQkJYm9vbCBlbmFibGVTU0U7DQorCQkJYm9vbCBlbmFibGVTU0UyOw0KKwkJCWJvb2wgZW5hYmxlU1NFMzsNCisJCQlib29sIGVuYWJsZVNTU0UzOw0KKwkJCWJvb2wgZW5hYmxlU1NFNF8xOw0KKwkJCU9wdGltaXphdGlvbiBvcHRpbWl6YXRpb25bMTBdOw0KKwkJCWJvb2wgZGlzYWJsZVNlcnZlcjsNCisJCQlib29sIGtlZXBTeXN0ZW1DdXJzb3I7DQorCQkJYm9vbCBmb3JjZVdpbmRvd2VkOw0KKwkJCWJvb2wgY29tcGxlbWVudGFyeURlcHRoQnVmZmVyOw0KKwkJCWJvb2wgcG9zdEJsZW5kU1JHQjsNCisJCQlib29sIGV4YWN0Q29sb3JSb3VuZGluZzsNCisJCQlib29sIGRpc2FibGVBbHBoYU1vZGU7DQorCQkJYm9vbCBkaXNhYmxlMTBCaXRNb2RlOw0KKwkJCWludCB0cmFuc3BhcmVuY3lBbnRpYWxpYXNpbmc7DQorCQkJaW50IGZyYW1lQnVmZmVyQVBJOw0KKwkJCWludCBzaGFkb3dNYXBwaW5nOw0KKwkJCWJvb2wgZm9yY2VDbGVhclJlZ2lzdGVyczsNCisJCSNpZm5kZWYgTkRFQlVHDQorCQkJdW5zaWduZWQgaW50IG1pblByaW1pdGl2ZXM7DQorCQkJdW5zaWduZWQgaW50IG1heFByaW1pdGl2ZXM7DQorCQkjZW5kaWYNCisJCX07DQorDQorCQlTd2lmdENvbmZpZyhib29sIGRpc2FibGVTZXJ2ZXJPdmVycmlkZSk7DQorDQorCQl+U3dpZnRDb25maWcoKTsNCisNCisJCWJvb2wgaGFzTmV3Q29uZmlndXJhdGlvbihib29sIHJlc2V0ID0gdHJ1ZSk7DQorCQl2b2lkIGdldENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbik7DQorDQorCXByaXZhdGU6DQorCQllbnVtIFN0YXR1cw0KKwkJew0KKwkJCU9LID0gMjAwLA0KKwkJCU5vdEZvdW5kID0gNDA0DQorCQl9Ow0KKw0KKwkJdm9pZCBjcmVhdGVTZXJ2ZXIoKTsNCisJCXZvaWQgZGVzdHJveVNlcnZlcigpOw0KKw0KKwkJc3RhdGljIHVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIHNlcnZlclJvdXRpbmUodm9pZCAqcGFyYW1ldGVycyk7DQorDQorCQlib29sIHBlbmRpbmcoU09DS0VUIHNvY2tldCwgaW50IG1zKTsNCisJCXZvaWQgc2VydmVyTG9vcCgpOw0KKwkJdm9pZCByZXNwb25kKGNvbnN0IGNoYXIgKnJlcXVlc3QpOw0KKwkJc3RkOjpzdHJpbmcgcGFnZSgpOw0KKwkJc3RkOjpzdHJpbmcgcHJvZmlsZSgpOw0KKwkJdm9pZCBzZW5kKFN0YXR1cyBjb2RlLCBzdGQ6OnN0cmluZyBib2R5ID0gIiIpOw0KKwkJdm9pZCBwYXJzZVBvc3QoY29uc3QgY2hhciAqcG9zdCk7DQorDQorCQl2b2lkIHJlYWRDb25maWd1cmF0aW9uKGJvb2wgZGlzYWJsZVNlcnZlck92ZXJyaWRlID0gZmFsc2UpOw0KKwkJdm9pZCB3cml0ZUNvbmZpZ3VyYXRpb24oKTsNCisNCisJCUNvbmZpZ3VyYXRpb24gY29uZmlnOw0KKw0KKwkJSEFORExFIHNlcnZlclRocmVhZDsNCisJCXZvbGF0aWxlIGJvb2wgdGVybWluYXRlOw0KKwkJQ1JJVElDQUxfU0VDVElPTiBjcml0aWNhbFNlY3Rpb247ICAgLy8gUHJvdGVjdHMgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncw0KKw0KKwkJYm9vbCBuZXdDb25maWc7DQorDQorCQlTT0NLRVQgbGlzdGVuU29ja2V0Ow0KKwkJU09DS0VUIGNsaWVudFNvY2tldDsNCisNCisJCWludCBidWZmZXJMZW5ndGg7DQorCQljaGFyICpyZWNlaXZlQnVmZmVyOw0KKwl9Ow0KK30NCisNCisjZW5kaWYgICAvLyBzd19Td2lmdENvbmZpZ19ocHANCmRpZmYgLS1naXQgYS9zcmMvTWFpbi9jcmMuaCBiL3NyYy9NYWluL2NyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjk4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFpbi9jcmMuaApAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICBjcmMuaAorICogCisgKiBEZXNjcmlwdGlvbjogQSBoZWFkZXIgZmlsZSBkZXNjcmliaW5nIHRoZSB2YXJpb3VzIENSQyBzdGFuZGFyZHMuCisgKgorICogTm90ZXM6ICAgICAgIAorICoKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwIGJ5IE1pY2hhZWwgQmFyci4gIFRoaXMgc29mdHdhcmUgaXMgcGxhY2VkIGludG8KKyAqIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2UuICBIb3dldmVyLCB0aGlzCisgKiBub3RpY2UgbXVzdCBub3QgYmUgY2hhbmdlZCBvciByZW1vdmVkIGFuZCBubyB3YXJyYW50eSBpcyBlaXRoZXIKKyAqIGV4cHJlc3NlZCBvciBpbXBsaWVkIGJ5IGl0cyBwdWJsaWNhdGlvbiBvciBkaXN0cmlidXRpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfY3JjX2gKKyNkZWZpbmUgX2NyY19oCisKKy8qCisgKiBTZWxlY3QgdGhlIENSQyBzdGFuZGFyZCBmcm9tIHRoZSBsaXN0IHRoYXQgZm9sbG93cy4KKyAqLworI2RlZmluZSBDUkNfQ0NJVFQKKworCisjaWYgZGVmaW5lZChDUkNfQ0NJVFQpCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIGNyYzsKKworI2RlZmluZSBDUkNfTkFNRQkJCSJDUkMtQ0NJVFQiCisjZGVmaW5lIFBPTFlOT01JQUwJCQkweDEwMjEKKyNkZWZpbmUgSU5JVElBTF9SRU1BSU5ERVIJMHhGRkZGCisjZGVmaW5lIEZJTkFMX1hPUl9WQUxVRQkJMHgwMDAwCisjZGVmaW5lIFJFRkxFQ1RfREFUQQkJRkFMU0UKKyNkZWZpbmUgUkVGTEVDVF9SRU1BSU5ERVIJRkFMU0UKKyNkZWZpbmUgQ0hFQ0tfVkFMVUUJCQkweDI5QjEKKworI2VsaWYgZGVmaW5lZChDUkMxNikKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgY3JjOworCisjZGVmaW5lIENSQ19OQU1FCQkJIkNSQy0xNiIKKyNkZWZpbmUgUE9MWU5PTUlBTAkJCTB4ODAwNQorI2RlZmluZSBJTklUSUFMX1JFTUFJTkRFUgkweDAwMDAKKyNkZWZpbmUgRklOQUxfWE9SX1ZBTFVFCQkweDAwMDAKKyNkZWZpbmUgUkVGTEVDVF9EQVRBCQlUUlVFCisjZGVmaW5lIFJFRkxFQ1RfUkVNQUlOREVSCVRSVUUKKyNkZWZpbmUgQ0hFQ0tfVkFMVUUJCQkweEJCM0QKKworI2VsaWYgZGVmaW5lZChDUkMzMikKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBjcmM7CisKKyNkZWZpbmUgQ1JDX05BTUUJCQkiQ1JDLTMyIgorI2RlZmluZSBQT0xZTk9NSUFMCQkJMHgwNEMxMURCNworI2RlZmluZSBJTklUSUFMX1JFTUFJTkRFUgkweEZGRkZGRkZGCisjZGVmaW5lIEZJTkFMX1hPUl9WQUxVRQkJMHhGRkZGRkZGRgorI2RlZmluZSBSRUZMRUNUX0RBVEEJCVRSVUUKKyNkZWZpbmUgUkVGTEVDVF9SRU1BSU5ERVIJVFJVRQorI2RlZmluZSBDSEVDS19WQUxVRQkJCTB4Q0JGNDM5MjYKKworI2Vsc2UKKworI2Vycm9yICJPbmUgb2YgQ1JDX0NDSVRULCBDUkMxNiwgb3IgQ1JDMzIgbXVzdCBiZSAjZGVmaW5lJ2QuIgorCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgordm9pZCAgY3JjSW5pdCh2b2lkKTsKK2NyYyAgIGNyY1Nsb3codW5zaWduZWQgY2hhciBjb25zdCBtZXNzYWdlW10sIGludCBuQnl0ZXMpOworY3JjICAgY3JjRmFzdCh1bnNpZ25lZCBjaGFyIGNvbnN0IG1lc3NhZ2VbXSwgaW50IG5CeXRlcyk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfY3JjX2ggKi8KZGlmZiAtLWdpdCBhL3NyYy9NYWluL3NlcmlhbGNvbW1vbi5oIGIvc3JjL01haW4vc2VyaWFsY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0NzljNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL3NlcmlhbGNvbW1vbi5oCkBAIC0wLDAgKzEsMTkgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworCisjcHJhZ21hIG9uY2UKKworCisjZGVmaW5lIFJPT1RfTEVOR1RIIDEwCisjZGVmaW5lIENIRUNLU1VNX0xFTkdUSCA0CisjZGVmaW5lIFBSRUZJWF9MRU5HVEggMgorI2RlZmluZSBTRVJJQUxfTEVOR1RIIFBSRUZJWF9MRU5HVEggKyBST09UX0xFTkdUSCArIENIRUNLU1VNX0xFTkdUSApkaWZmIC0tZ2l0IGEvc3JjL01haW4vc2VyaWFsdmFsaWQuY3BwIGIvc3JjL01haW4vc2VyaWFsdmFsaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTc2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFpbi9zZXJpYWx2YWxpZC5jcHAKQEAgLTAsMCArMSwxMjggQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJzZXJpYWx2YWxpZC5oIgorI2luY2x1ZGUgImNyYy5oIgorCitzdGF0aWMgdm9pZCBEZWNyeXB0U3RyaW5nKCBjaGFyKiBzdHJpbmdfdG9fZGVjcnlwdCwgaW50IHN0cmluZ19sZW5ndGggKTsKKworYm9vbCBWYWxpZGF0ZVNlcmlhbE51bWJlciggY29uc3QgY2hhciogaW5TZXJpYWxOdW1iZXIsIGNvbnN0IGNoYXIqIGNoZWNrc3VtX2tleSwgY29uc3QgY2hhciogcHJlZml4KQoreworCWlmIChzdHJsZW4oaW5TZXJpYWxOdW1iZXIpICE9IFNFUklBTF9MRU5HVEgpCisJeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCWlmIChzdHJzdHIoaW5TZXJpYWxOdW1iZXIsIHByZWZpeCkgIT0gaW5TZXJpYWxOdW1iZXIpCisJeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJY2hhciB3b3JraW5nX2J1ZmZlclsyNTZdOworCWNoYXIgZGVjcnlwdGVkX3NlcmlhbFtTRVJJQUxfTEVOR1RIKzFdOworCWxvbmcgYWN0dWFsX2NoZWNrc3VtID0gMDsKKwkKKwlzdHJuY3B5KGRlY3J5cHRlZF9zZXJpYWwsIGluU2VyaWFsTnVtYmVyLCBTRVJJQUxfTEVOR1RIKTsKKwlkZWNyeXB0ZWRfc2VyaWFsW1NFUklBTF9MRU5HVEhdID0gJ1wwJzsKKwkKKwlEZWNyeXB0U3RyaW5nKCAmKGRlY3J5cHRlZF9zZXJpYWxbUFJFRklYX0xFTkdUSF0pLFJPT1RfTEVOR1RIICsgQ0hFQ0tTVU1fTEVOR1RIKTsKKwkKKwljaGFyIGR1bW15X3ByZWZpeFsxMF07CisJbG9uZyBsb25nIHNlcmlhbF9udW1iZXI7CisKKwkKKwlzc2NhbmYoIGRlY3J5cHRlZF9zZXJpYWwsICIlMnMlMTBsbHglNHgiLCBkdW1teV9wcmVmaXgsICZzZXJpYWxfbnVtYmVyLCAmYWN0dWFsX2NoZWNrc3VtKTsKKwlzdHJjcHkod29ya2luZ19idWZmZXIsIGNoZWNrc3VtX2tleSk7CisJc3RyY2F0KHdvcmtpbmdfYnVmZmVyLCBkZWNyeXB0ZWRfc2VyaWFsKTsKKwl3b3JraW5nX2J1ZmZlcltzdHJsZW4oY2hlY2tzdW1fa2V5KSArIFBSRUZJWF9MRU5HVEggKyBST09UX0xFTkdUSF0gPSAnXDAnOworCisJY3JjSW5pdCgpOworCWNyYyBjYWxjdWxhdGVkX2NoZWNrc3VtID0gY3JjRmFzdCgodW5zaWduZWQgY2hhciopd29ya2luZ19idWZmZXIsIHN0cmxlbih3b3JraW5nX2J1ZmZlcikpOworCQorCQorCWlmIChjYWxjdWxhdGVkX2NoZWNrc3VtID09IGFjdHVhbF9jaGVja3N1bSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKKworc3RhdGljIHZvaWQgRGVjcnlwdFN0cmluZyggY2hhciogc3RyaW5nX3RvX2RlY3J5cHQsIGludCBzdHJpbmdfbGVuZ3RoICkKK3sKKwlmb3IgKCBpbnQgaSA9IDAgOyBpIDwgc3RyaW5nX2xlbmd0aCA7IGkrKykKKwl7CisJCXN3aXRjaCAoc3RyaW5nX3RvX2RlY3J5cHRbaV0pCisJCXsKKwkJCWNhc2UgJ2MnOgorCQkJY2FzZSAnQyc6CisJCQkJc3RyaW5nX3RvX2RlY3J5cHRbaV0gPSAnYSc7CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoKKwkJCWNhc2UgJ0QnOgkJCQorCQkJCXN0cmluZ190b19kZWNyeXB0W2ldID0gJ2InOworCQkJCWJyZWFrOworCQkJY2FzZSAnZyc6CisJCQljYXNlICdHJzoJCQkKKwkJCQlzdHJpbmdfdG9fZGVjcnlwdFtpXSA9ICdjJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2YnOgorCQkJY2FzZSAnRic6CQkJCisJCQkJc3RyaW5nX3RvX2RlY3J5cHRbaV0gPSAnZCc7CisJCQkJYnJlYWs7CisJCQljYXNlICdoJzoKKwkJCWNhc2UgJ0gnOgkJCQorCQkJCXN0cmluZ190b19kZWNyeXB0W2ldID0gJ2UnOworCQkJCWJyZWFrOworCQkJY2FzZSAnYic6CisJCQljYXNlICdCJzoJCQkKKwkJCQlzdHJpbmdfdG9fZGVjcnlwdFtpXSA9ICdmJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzInOgkJCQorCQkJCXN0cmluZ190b19kZWNyeXB0W2ldID0gJzAnOworCQkJCWJyZWFrOworCQkJY2FzZSAnMyc6CQkJCisJCQkJc3RyaW5nX3RvX2RlY3J5cHRbaV0gPSAnMSc7CisJCQkJYnJlYWs7CisJCQljYXNlICc0JzoJCQkKKwkJCQlzdHJpbmdfdG9fZGVjcnlwdFtpXSA9ICcyJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzUnOgkJCQorCQkJCXN0cmluZ190b19kZWNyeXB0W2ldID0gJzMnOworCQkJCWJyZWFrOworCQkJY2FzZSAnNic6CQkJCisJCQkJc3RyaW5nX3RvX2RlY3J5cHRbaV0gPSAnNCc7CisJCQkJYnJlYWs7CisJCQljYXNlICc3JzoJCQkKKwkJCQlzdHJpbmdfdG9fZGVjcnlwdFtpXSA9ICc1JzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzgnOgkJCQorCQkJCXN0cmluZ190b19kZWNyeXB0W2ldID0gJzYnOworCQkJCWJyZWFrOworCQkJY2FzZSAnOSc6CQkJCisJCQkJc3RyaW5nX3RvX2RlY3J5cHRbaV0gPSAnNyc7CisJCQkJYnJlYWs7CisJCQljYXNlICdqJzoKKwkJCWNhc2UgJ0onOgkJCQorCQkJCXN0cmluZ190b19kZWNyeXB0W2ldID0gJzgnOworCQkJCWJyZWFrOworCQkJY2FzZSAnayc6CisJCQljYXNlICdLJzoJCQkKKwkJCQlzdHJpbmdfdG9fZGVjcnlwdFtpXSA9ICc5JzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL01haW4vc2VyaWFsdmFsaWQuaCBiL3NyYy9NYWluL3NlcmlhbHZhbGlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyNGYzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWluL3NlcmlhbHZhbGlkLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJzZXJpYWxjb21tb24uaCIKKworCisKK2Jvb2wgVmFsaWRhdGVTZXJpYWxOdW1iZXIoIGNvbnN0IGNoYXIqIGluU2VyaWFsTnVtYmVyLCAKKwkJCQkJCSAgIGNvbnN0IGNoYXIqIGNoZWNrc3VtX2tleSwgY29uc3QgY2hhciogcHJlZml4KTsKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbW1vbi9hbmdsZXV0aWxzLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21tb24vYW5nbGV1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Yzc2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21tb24vYW5nbGV1dGlscy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIGFuZ2xldXRpbHMuaDogQ29tbW9uIEFOR0xFIHV0aWxpdGllcy4KKworI2lmbmRlZiBDT01NT05fQU5HTEVVVElMU19IXworI2RlZmluZSBDT01NT05fQU5HTEVVVElMU19IXworCisvLyBBIG1hY3JvIHRvIGRpc2FsbG93IHRoZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0gZnVuY3Rpb25zCisvLyBUaGlzIG11c3QgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzCisjZGVmaW5lIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUeXBlTmFtZSkgXAorICBUeXBlTmFtZShjb25zdCBUeXBlTmFtZSYpOyAgICAgICAgICAgICAgIFwKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKQorCisjZW5kaWYgLy8gQ09NTU9OX0FOR0xFVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbW1vbi9kZWJ1Zy5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21tb24vZGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Zjk2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21tb24vZGVidWcuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIGRlYnVnLmNwcDogRGVidWdnaW5nIHV0aWxpdGllcy4KKworI2luY2x1ZGUgImNvbW1vbi9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworbmFtZXNwYWNlIGdsCit7CisJc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YXJhcmcpCisJeworCQkjaWYgMAorCQkJRklMRSogZmlsZSA9IGZvcGVuKFRSQUNFX09VVFBVVF9GSUxFLCAiYSIpOworCisJCQlpZihmaWxlKQorCQkJeworCQkJCXZmcHJpbnRmKGZpbGUsIGZvcm1hdCwgdmFyYXJnKTsKKwkJCQlmY2xvc2UoZmlsZSk7CisJCQl9CisJCSNlbmRpZgorCX0KKworCXZvaWQgdHJhY2UoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJeworCQl2YV9saXN0IHZhcmFyZzsKKwkJdmFfc3RhcnQodmFyYXJnLCBmb3JtYXQpOworCQlvdXRwdXQoZm9ybWF0LCB2YXJhcmcpOworCQl2YV9lbmQodmFyYXJnKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21tb24vZGVidWcuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbW1vbi9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDgzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21tb24vZGVidWcuaApAQCAtMCwwICsxLDgyIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBkZWJ1Zy5oOiBEZWJ1Z2dpbmcgdXRpbGl0aWVzLgorCisjaWZuZGVmIENPTU1PTl9ERUJVR19IXworI2RlZmluZSBDT01NT05fREVCVUdfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJjb21tb24vYW5nbGV1dGlscy5oIgorCisjaWYgIWRlZmluZWQoVFJBQ0VfT1VUUFVUX0ZJTEUpCisjZGVmaW5lIFRSQUNFX09VVFBVVF9GSUxFICJkZWJ1Zy50eHQiCisjZW5kaWYKKworbmFtZXNwYWNlIGdsCit7CisgICAgLy8gT3V0cHV0cyB0ZXh0IHRvIHRoZSBkZWJ1Z2dpbmcgbG9nCisgICAgdm9pZCB0cmFjZShjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7Cit9CisKKy8vIEEgbWFjcm8gdG8gb3V0cHV0IGEgdHJhY2Ugb2YgYSBmdW5jdGlvbiBjYWxsIGFuZCBpdHMgYXJndW1lbnRzIHRvIHRoZSBkZWJ1Z2dpbmcgbG9nCisjaWYgZGVmaW5lZChBTkdMRV9ESVNBQkxFX1RSQUNFKQorI2RlZmluZSBUUkFDRShtZXNzYWdlLCAuLi4pICh2b2lkKDApKQorI2Vsc2UKKyNkZWZpbmUgVFJBQ0UobWVzc2FnZSwgLi4uKSBnbDo6dHJhY2UoInRyYWNlOiAlcyglZCk6ICJtZXNzYWdlIlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgX19WQV9BUkdTX18pCisjZW5kaWYKKworLy8gQSBtYWNybyB0byBvdXRwdXQgYSBmdW5jdGlvbiBjYWxsIGFuZCBpdHMgYXJndW1lbnRzIHRvIHRoZSBkZWJ1Z2dpbmcgbG9nLCB0byBkZW5vdGUgYW4gaXRlbSBpbiBuZWVkIG9mIGZpeGluZy4KKyNpZiBkZWZpbmVkKEFOR0xFX0RJU0FCTEVfVFJBQ0UpCisjZGVmaW5lIEZJWE1FKG1lc3NhZ2UsIC4uLikgKHZvaWQoMCkpCisjZWxzZQorI2RlZmluZSBGSVhNRShtZXNzYWdlLCAuLi4pIGRvIHtnbDo6dHJhY2UoImZpeG1lOiAlcyglZCk6ICJtZXNzYWdlIlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgX19WQV9BUkdTX18pOyBhc3NlcnQoZmFsc2UpO30gd2hpbGUoZmFsc2UpCisjZW5kaWYKKworLy8gQSBtYWNybyB0byBvdXRwdXQgYSBmdW5jdGlvbiBjYWxsIGFuZCBpdHMgYXJndW1lbnRzIHRvIHRoZSBkZWJ1Z2dpbmcgbG9nLCBpbiBjYXNlIG9mIGVycm9yLgorI2lmIGRlZmluZWQoQU5HTEVfRElTQUJMRV9UUkFDRSkKKyNkZWZpbmUgRVJSKG1lc3NhZ2UsIC4uLikgKHZvaWQoMCkpCisjZWxzZQorI2RlZmluZSBFUlIobWVzc2FnZSwgLi4uKSBkbyB7Z2w6OnRyYWNlKCJlcnI6ICVzKCVkKTogIm1lc3NhZ2UiXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBfX1ZBX0FSR1NfXyk7IGFzc2VydChmYWxzZSk7fSB3aGlsZShmYWxzZSkKKyNlbmRpZgorCisvLyBBIG1hY3JvIGFzc2VydGluZyBhIGNvbmRpdGlvbiBhbmQgb3V0cHV0dGluZyBmYWlsdXJlcyB0byB0aGUgZGVidWcgbG9nCisjaWYgIWRlZmluZWQoTkRFQlVHKQorI2RlZmluZSBBU1NFUlQoZXhwcmVzc2lvbikgZG8geyBcCisgICAgaWYoIShleHByZXNzaW9uKSkgXAorICAgICAgICBFUlIoIlx0ISBBc3NlcnQgZmFpbGVkIGluICVzKCVkKTogIiNleHByZXNzaW9uIlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgYXNzZXJ0KGV4cHJlc3Npb24pOyBcCisgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKGV4cHJlc3Npb24pICh2b2lkKDApKQorI2VuZGlmCisKKy8vIEEgbWFjcm8gdG8gaW5kaWNhdGUgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbmFsaXR5CisjaWYgIWRlZmluZWQoTkRFQlVHKQorI2RlZmluZSBVTklNUExFTUVOVEVEKCkgZG8geyBcCisgICAgRklYTUUoIlx0ISBVbmltcGxlbWVudGVkOiAlcyglZClcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisgICAgYXNzZXJ0KGZhbHNlKTsgXAorICAgIH0gd2hpbGUoMCkKKyNlbHNlCisgICAgI2RlZmluZSBVTklNUExFTUVOVEVEKCkgRklYTUUoIlx0ISBVbmltcGxlbWVudGVkOiAlcyglZClcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCisjZW5kaWYKKworLy8gQSBtYWNybyBmb3IgY29kZSB3aGljaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgcmVhY2hlZCB1bmRlciB2YWxpZCBhc3N1bXB0aW9ucworI2lmICFkZWZpbmVkKE5ERUJVRykKKyNkZWZpbmUgVU5SRUFDSEFCTEUoKSBkbyB7IFwKKyAgICBFUlIoIlx0ISBVbnJlYWNoYWJsZSByZWFjaGVkOiAlcyglZClcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisgICAgYXNzZXJ0KGZhbHNlKTsgXAorICAgIH0gd2hpbGUoMCkKKyNlbHNlCisgICAgI2RlZmluZSBVTlJFQUNIQUJMRSgpIEVSUigiXHQhIFVucmVhY2hhYmxlIHJlYWNoZWQ6ICVzKCVkKVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNlbmRpZgorCisvLyBBIG1hY3JvIGZ1bmN0aW9uaW5nIGFzIGEgY29tcGlsZS10aW1lIGFzc2VydCB0byB2YWxpZGF0ZSBjb25zdGFudCBjb25kaXRpb25zCisjZGVmaW5lIE1FVEFfQVNTRVJUKGNvbmRpdGlvbikgdHlwZWRlZiBpbnQgQ09NUElMRV9USU1FX0FTU0VSVF8jI19fTElORV9fW3N0YXRpY19jYXN0PGJvb2w+KGNvbmRpdGlvbikgPyAxIDogLTFdCisKKyNlbmRpZiAgIC8vIENPTU1PTl9ERUJVR19IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvQmFzZVR5cGVzLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9CYXNlVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjRhODYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvQmFzZVR5cGVzLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgX0JBU0lDVFlQRVNfSU5DTFVERURfCisjZGVmaW5lIF9CQVNJQ1RZUEVTX0lOQ0xVREVEXworCisvLworLy8gUHJlY2lzaW9uIHF1YWxpZmllcnMKKy8vCitlbnVtIFRQcmVjaXNpb24KK3sKKyAgICAvLyBUaGVzZSBuZWVkIHRvIGJlIGtlcHQgc29ydGVkCisgICAgRWJwVW5kZWZpbmVkLAorICAgIEVicExvdywKKyAgICBFYnBNZWRpdW0sCisgICAgRWJwSGlnaCwKK307CisKK2lubGluZSBjb25zdCBjaGFyKiBnZXRQcmVjaXNpb25TdHJpbmcoVFByZWNpc2lvbiBwKQoreworICAgIHN3aXRjaChwKQorICAgIHsKKyAgICBjYXNlIEVicEhpZ2g6CQlyZXR1cm4gImhpZ2hwIjsJCWJyZWFrOworICAgIGNhc2UgRWJwTWVkaXVtOgkJcmV0dXJuICJtZWRpdW1wIjsJYnJlYWs7CisgICAgY2FzZSBFYnBMb3c6CQlyZXR1cm4gImxvd3AiOwkJYnJlYWs7CisgICAgZGVmYXVsdDoJCQlyZXR1cm4gIm1lZGl1bXAiOyAgIGJyZWFrOyAgIC8vIFNhZmVzdCBmYWxsYmFjaworICAgIH0KK30KKworLy8KKy8vIEJhc2ljIHR5cGUuICBBcnJheXMsIHZlY3RvcnMsIGV0Yy4sIGFyZSBvcnRob2dvbmFsIHRvIHRoaXMuCisvLworZW51bSBUQmFzaWNUeXBlCit7CisgICAgRWJ0Vm9pZCwKKyAgICBFYnRGbG9hdCwKKyAgICBFYnRJbnQsCisgICAgRWJ0Qm9vbCwKKyAgICBFYnRHdWFyZFNhbXBsZXJCZWdpbiwgIC8vIG5vbiB0eXBlOiAgc2VlIGltcGxlbWVudGF0aW9uIG9mIElzU2FtcGxlcigpCisgICAgRWJ0U2FtcGxlcjJELAorICAgIEVidFNhbXBsZXJDdWJlLAorICAgIEVidEd1YXJkU2FtcGxlckVuZCwgICAgLy8gbm9uIHR5cGU6ICBzZWUgaW1wbGVtZW50YXRpb24gb2YgSXNTYW1wbGVyKCkKKyAgICBFYnRTdHJ1Y3QsCisgICAgRWJ0QWRkcmVzcywgICAgICAgICAgICAvLyBzaG91bGQgYmUgZGVwcmVjYXRlZD8/Cit9OworCitpbmxpbmUgY29uc3QgY2hhciogZ2V0QmFzaWNTdHJpbmcoVEJhc2ljVHlwZSB0KQoreworICAgIHN3aXRjaCAodCkKKyAgICB7CisgICAgY2FzZSBFYnRWb2lkOiAgICAgICAgICAgICAgcmV0dXJuICJ2b2lkIjsgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRWJ0RmxvYXQ6ICAgICAgICAgICAgIHJldHVybiAiZmxvYXQiOyAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEVidEludDogICAgICAgICAgICAgICByZXR1cm4gImludCI7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFYnRCb29sOiAgICAgICAgICAgICAgcmV0dXJuICJib29sIjsgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRWJ0U2FtcGxlcjJEOiAgICAgICAgIHJldHVybiAic2FtcGxlcjJEIjsgICAgICAgICBicmVhazsKKyAgICBjYXNlIEVidFNhbXBsZXJDdWJlOiAgICAgICByZXR1cm4gInNhbXBsZXJDdWJlIjsgICAgICAgYnJlYWs7CisgICAgY2FzZSBFYnRTdHJ1Y3Q6ICAgICAgICAgICAgcmV0dXJuICJzdHJ1Y3R1cmUiOyAgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biB0eXBlIjsKKyAgICB9Cit9CisKK2lubGluZSBib29sIElzU2FtcGxlcihUQmFzaWNUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHR5cGUgPiBFYnRHdWFyZFNhbXBsZXJCZWdpbiAmJiB0eXBlIDwgRWJ0R3VhcmRTYW1wbGVyRW5kOworfQorCisvLworLy8gUXVhbGlmaWVycyBhbmQgYnVpbHQtaW5zLiAgVGhlc2UgYXJlIG1haW5seSB1c2VkIHRvIHNlZSB3aGF0IGNhbiBiZSByZWFkCisvLyBvciB3cml0dGVuLCBhbmQgYnkgdGhlIG1hY2hpbmUgZGVwZW5kZW50IHRyYW5zbGF0b3IgdG8ga25vdyB3aGljaCByZWdpc3RlcnMKKy8vIHRvIGFsbG9jYXRlIHZhcmlhYmxlcyBpbi4gIFNpbmNlIGJ1aWx0LWlucyB0ZW5kIHRvIGdvIHRvIGRpZmZlcmVudCByZWdpc3RlcnMKKy8vIHRoYW4gdmFyeWluZyBvciB1bmlmb3JtLCBpdCBtYWtlcyBzZW5zZSB0aGV5IGFyZSBwZWVycywgbm90IHN1Yi1jbGFzc2VzLgorLy8KK2VudW0gVFF1YWxpZmllcgoreworICAgIEV2cVRlbXBvcmFyeSwgICAgIC8vIEZvciB0ZW1wb3JhcmllcyAod2l0aGluIGEgZnVuY3Rpb24pLCByZWFkL3dyaXRlCisgICAgRXZxR2xvYmFsLCAgICAgICAgLy8gRm9yIGdsb2JhbHMgcmVhZC93cml0ZQorICAgIEV2cUNvbnN0LCAgICAgICAgIC8vIFVzZXIgZGVmaW5lZCBjb25zdGFudHMgYW5kIG5vbi1vdXRwdXQgcGFyYW1ldGVycyBpbiBmdW5jdGlvbnMKKyAgICBFdnFBdHRyaWJ1dGUsICAgICAvLyBSZWFkb25seQorICAgIEV2cVZhcnlpbmdJbiwgICAgIC8vIHJlYWRvbmx5LCBmcmFnbWVudCBzaGFkZXJzIG9ubHkKKyAgICBFdnFWYXJ5aW5nT3V0LCAgICAvLyB2ZXJ0ZXggc2hhZGVycyBvbmx5ICByZWFkL3dyaXRlCisgICAgRXZxSW52YXJpYW50VmFyeWluZ0luLCAgICAgLy8gcmVhZG9ubHksIGZyYWdtZW50IHNoYWRlcnMgb25seQorICAgIEV2cUludmFyaWFudFZhcnlpbmdPdXQsICAgIC8vIHZlcnRleCBzaGFkZXJzIG9ubHkgIHJlYWQvd3JpdGUKKyAgICBFdnFVbmlmb3JtLCAgICAgICAvLyBSZWFkb25seSwgdmVydGV4IGFuZCBmcmFnbWVudAorCisgICAgLy8gcGFjay91bnBhY2sgaW5wdXQgYW5kIG91dHB1dAorICAgIEV2cUlucHV0LAorICAgIEV2cU91dHB1dCwKKworICAgIC8vIHBhcmFtZXRlcnMKKyAgICBFdnFJbiwKKyAgICBFdnFPdXQsCisgICAgRXZxSW5PdXQsCisgICAgRXZxQ29uc3RSZWFkT25seSwKKworICAgIC8vIGJ1aWx0LWlucyB3cml0dGVuIGJ5IHZlcnRleCBzaGFkZXIKKyAgICBFdnFQb3NpdGlvbiwKKyAgICBFdnFQb2ludFNpemUsCisKKyAgICAvLyBidWlsdC1pbnMgcmVhZCBieSBmcmFnbWVudCBzaGFkZXIKKyAgICBFdnFGcmFnQ29vcmQsCisgICAgRXZxRnJvbnRGYWNpbmcsCisgICAgRXZxUG9pbnRDb29yZCwKKworICAgIC8vIGJ1aWx0LWlucyB3cml0dGVuIGJ5IGZyYWdtZW50IHNoYWRlcgorICAgIEV2cUZyYWdDb2xvciwKKyAgICBFdnFGcmFnRGF0YSwKKworICAgIC8vIGVuZCBvZiBsaXN0CisgICAgRXZxTGFzdCwKK307CisKKy8vCisvLyBUaGlzIGlzIGp1c3QgZm9yIGRlYnVnIHByaW50IG91dCwgY2FycmllZCBhbG9uZyB3aXRoIHRoZSBkZWZpbml0aW9ucyBhYm92ZS4KKy8vCitpbmxpbmUgY29uc3QgY2hhciogZ2V0UXVhbGlmaWVyU3RyaW5nKFRRdWFsaWZpZXIgcSkKK3sKKyAgICBzd2l0Y2gocSkKKyAgICB7CisgICAgY2FzZSBFdnFUZW1wb3Jhcnk6ICAgICAgcmV0dXJuICJUZW1wb3JhcnkiOyAgICAgIGJyZWFrOworICAgIGNhc2UgRXZxR2xvYmFsOiAgICAgICAgIHJldHVybiAiR2xvYmFsIjsgICAgICAgICBicmVhazsKKyAgICBjYXNlIEV2cUNvbnN0OiAgICAgICAgICByZXR1cm4gImNvbnN0IjsgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdnFDb25zdFJlYWRPbmx5OiAgcmV0dXJuICJjb25zdCI7ICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZxQXR0cmlidXRlOiAgICAgIHJldHVybiAiYXR0cmlidXRlIjsgICAgICBicmVhazsKKyAgICBjYXNlIEV2cVZhcnlpbmdJbjogICAgICByZXR1cm4gInZhcnlpbmciOyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdnFWYXJ5aW5nT3V0OiAgICAgcmV0dXJuICJ2YXJ5aW5nIjsgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZxSW52YXJpYW50VmFyeWluZ0luOiByZXR1cm4gImludmFyaWFudCB2YXJ5aW5nIjsJYnJlYWs7CisgICAgY2FzZSBFdnFJbnZhcmlhbnRWYXJ5aW5nT3V0OnJldHVybiAiaW52YXJpYW50IHZhcnlpbmciOwlicmVhazsKKyAgICBjYXNlIEV2cVVuaWZvcm06ICAgICAgICByZXR1cm4gInVuaWZvcm0iOyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdnFJbjogICAgICAgICAgICAgcmV0dXJuICJpbiI7ICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZxT3V0OiAgICAgICAgICAgIHJldHVybiAib3V0IjsgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEV2cUluT3V0OiAgICAgICAgICByZXR1cm4gImlub3V0IjsgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdnFJbnB1dDogICAgICAgICAgcmV0dXJuICJpbnB1dCI7ICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZxT3V0cHV0OiAgICAgICAgIHJldHVybiAib3V0cHV0IjsgICAgICAgICBicmVhazsKKyAgICBjYXNlIEV2cVBvc2l0aW9uOiAgICAgICByZXR1cm4gIlBvc2l0aW9uIjsgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdnFQb2ludFNpemU6ICAgICAgcmV0dXJuICJQb2ludFNpemUiOyAgICAgIGJyZWFrOworICAgIGNhc2UgRXZxRnJhZ0Nvb3JkOiAgICAgIHJldHVybiAiRnJhZ0Nvb3JkIjsgICAgICBicmVhazsKKyAgICBjYXNlIEV2cUZyb250RmFjaW5nOiAgICByZXR1cm4gIkZyb250RmFjaW5nIjsgICAgYnJlYWs7CisgICAgY2FzZSBFdnFGcmFnQ29sb3I6ICAgICAgcmV0dXJuICJGcmFnQ29sb3IiOyAgICAgIGJyZWFrOworICAgIGNhc2UgRXZxRnJhZ0RhdGE6ICAgICAgIHJldHVybiAiRnJhZ0RhdGEiOyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biBxdWFsaWZpZXIiOworICAgIH0KK30KKworI2VuZGlmIC8vIF9CQVNJQ1RZUEVTX0lOQ0xVREVEXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvQ29kZUdlbkdMU0wuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvQ29kZUdlbkdMU0wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDBiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Db2RlR2VuR0xTTC5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2luY2x1ZGUgImNvbXBpbGVyL1RyYW5zbGF0b3JHTFNMLmgiCisKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQgdG8gY3JlYXRlIHRoZSBhY3R1YWwKKy8vIGNvbXBpbGUgb2JqZWN0IHVzZWQgYnkgaGlnaGVyIGxldmVsIGNvZGUuICBJdCByZXR1cm5zCisvLyBhIHN1YmNsYXNzIG9mIFRDb21waWxlci4KKy8vCitUQ29tcGlsZXIqIENvbnN0cnVjdENvbXBpbGVyKFNoU2hhZGVyVHlwZSB0eXBlLCBTaFNoYWRlclNwZWMgc3BlYykKK3sKKyAgICByZXR1cm4gbmV3IFRyYW5zbGF0b3JHTFNMKHR5cGUsIHNwZWMpOworfQorCisvLworLy8gRGVsZXRlIHRoZSBjb21waWxlciBtYWRlIGJ5IENvbnN0cnVjdENvbXBpbGVyCisvLwordm9pZCBEZWxldGVDb21waWxlcihUQ29tcGlsZXIqIGNvbXBpbGVyKQoreworICAgIGRlbGV0ZSBjb21waWxlcjsKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0NvZGVHZW5ITFNMLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0NvZGVHZW5ITFNMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDRlNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvQ29kZUdlbkhMU0wuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9UcmFuc2xhdG9ySExTTC5oIgorCisvLworLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHByb3ZpZGVkIHRvIGNyZWF0ZSB0aGUgYWN0dWFsCisvLyBjb21waWxlIG9iamVjdCB1c2VkIGJ5IGhpZ2hlciBsZXZlbCBjb2RlLiAgSXQgcmV0dXJucworLy8gYSBzdWJjbGFzcyBvZiBUQ29tcGlsZXIuCisvLworVENvbXBpbGVyKiBDb25zdHJ1Y3RDb21waWxlcihTaFNoYWRlclR5cGUgdHlwZSwgU2hTaGFkZXJTcGVjIHNwZWMpCit7CisgICAgcmV0dXJuIG5ldyBUcmFuc2xhdG9ySExTTCh0eXBlLCBzcGVjKTsKK30KKworLy8KKy8vIERlbGV0ZSB0aGUgY29tcGlsZXIgbWFkZSBieSBDb25zdHJ1Y3RDb21waWxlcgorLy8KK3ZvaWQgRGVsZXRlQ29tcGlsZXIoVENvbXBpbGVyKiBjb21waWxlcikKK3sKKyAgICBkZWxldGUgY29tcGlsZXI7Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Db21tb24uaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTU1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Db21tb24uaApAQCAtMCwwICsxLDg5IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaWZuZGVmIF9DT01NT05fSU5DTFVERURfCisjZGVmaW5lIF9DT01NT05fSU5DTFVERURfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29tcGlsZXIvUG9vbEFsbG9jLmgiCisKKy8vIFdlIG5lZWQgdHdvIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB0byByZXBvcnQgZXJyb3JzL3dhcm5pbmdzIC0gc3RyaW5nIGFuZAorLy8gbGluZSBudW1iZXIuIFdlIGVuY29kZSB0aGVzZSBpbnRvIGEgc2luZ2xlIGludCBzbyB0aGF0IGl0IGNhbiBiZSBlYXNpbHkKKy8vIGluY3JlbWVudGVkL2RlY3JlbWVudGVkIGJ5IGxleGVyLiBUaGUgcmlnaHQgU09VUkNFX0xPQ19MSU5FX1NJWkUgYml0cyBzdG9yZQorLy8gbGluZSBudW1iZXIgd2hpbGUgdGhlIHJlc3Qgc3RvcmUgdGhlIHN0cmluZyBudW1iZXIuIFNpbmNlIHRoZSBzaGFkZXJzIGFyZQorLy8gdXN1YWxseSBzbWFsbCwgd2Ugc2hvdWxkIG5vdCBydW4gb3V0IG9mIG1lbW9yeS4gU09VUkNFX0xPQ19MSU5FX1NJWkUKKy8vIGNhbiBiZSBpbmNyZWFzZWQgdG8gYWxsZXZpYXRlIHRoaXMgaXNzdWUuCit0eXBlZGVmIGludCBUU291cmNlTG9jOworY29uc3QgdW5zaWduZWQgaW50IFNPVVJDRV9MT0NfTElORV9TSVpFID0gMTY7ICAvLyBpbiBiaXRzLgorY29uc3QgdW5zaWduZWQgaW50IFNPVVJDRV9MT0NfTElORV9NQVNLID0gKDEgPDwgU09VUkNFX0xPQ19MSU5FX1NJWkUpIC0gMTsKKworaW5saW5lIFRTb3VyY2VMb2MgRW5jb2RlU291cmNlTG9jKGludCBzdHJpbmcsIGludCBsaW5lKSB7CisgICAgcmV0dXJuIChzdHJpbmcgPDwgU09VUkNFX0xPQ19MSU5FX1NJWkUpIHwgKGxpbmUgJiBTT1VSQ0VfTE9DX0xJTkVfTUFTSyk7Cit9CisKK2lubGluZSB2b2lkIERlY29kZVNvdXJjZUxvYyhUU291cmNlTG9jIGxvYywgaW50KiBzdHJpbmcsIGludCogbGluZSkgeworICAgIGlmIChzdHJpbmcpICpzdHJpbmcgPSBsb2MgPj4gU09VUkNFX0xPQ19MSU5FX1NJWkU7CisgICAgaWYgKGxpbmUpICpsaW5lID0gbG9jICYgU09VUkNFX0xPQ19MSU5FX01BU0s7Cit9CisKKy8vCisvLyBQdXQgUE9PTF9BTExPQ0FUT1JfTkVXX0RFTEVURSBpbiBiYXNlIGNsYXNzZXMgdG8gbWFrZSB0aGVtIHVzZSB0aGlzIHNjaGVtZS4KKy8vCisjZGVmaW5lIFBPT0xfQUxMT0NBVE9SX05FV19ERUxFVEUoQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QgcykgeyByZXR1cm4gKEEpLmFsbG9jYXRlKHMpOyB9ICAgICAgICAgIFwKKyAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90LCB2b2lkICpfV2hlcmUpIHsgcmV0dXJuIChfV2hlcmUpOwl9ICAgICBcCisgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopIHsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKiwgdm9pZCAqKSB7IH0gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b2lkKiBvcGVyYXRvciBuZXdbXShzaXplX3QgcykgeyByZXR1cm4gKEEpLmFsbG9jYXRlKHMpOyB9ICAgICAgICBcCisgICAgdm9pZCogb3BlcmF0b3IgbmV3W10oc2l6ZV90LCB2b2lkICpfV2hlcmUpIHsgcmV0dXJuIChfV2hlcmUpOwl9IFwKKyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqKSB7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkICosIHZvaWQgKikgeyB9CisKKy8vCisvLyBQb29sIHZlcnNpb24gb2Ygc3RyaW5nLgorLy8KK3R5cGVkZWYgcG9vbF9hbGxvY2F0b3I8Y2hhcj4gVFN0cmluZ0FsbG9jYXRvcjsKK3R5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmcgPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIFRTdHJpbmdBbGxvY2F0b3I+IFRTdHJpbmc7Cit0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmluZ3N0cmVhbTxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBUU3RyaW5nQWxsb2NhdG9yPiBUU3RyaW5nU3RyZWFtOworaW5saW5lIFRTdHJpbmcqIE5ld1Bvb2xUU3RyaW5nKGNvbnN0IGNoYXIqIHMpCit7CisJdm9pZCogbWVtb3J5ID0gR2xvYmFsUG9vbEFsbG9jYXRvci5hbGxvY2F0ZShzaXplb2YoVFN0cmluZykpOworCXJldHVybiBuZXcobWVtb3J5KSBUU3RyaW5nKHMpOworfQorCisvLworLy8gUGVyc2lzdGVudCBzdHJpbmcgbWVtb3J5LiAgU2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igc3RyaW5ncyB0aGF0IHN1cnZpdmUKKy8vIGFjcm9zcyBjb21waWxlcy4KKy8vCisjZGVmaW5lIFRQZXJzaXN0U3RyaW5nIHN0ZDo6c3RyaW5nCisjZGVmaW5lIFRQZXJzaXN0U3RyaW5nU3RyZWFtIHN0ZDo6b3N0cmluZ3N0cmVhbQorCisvLworLy8gUG9vbCBhbGxvY2F0b3IgdmVyc2lvbnMgb2YgdmVjdG9ycywgbGlzdHMsIGFuZCBtYXBzCisvLwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFRWZWN0b3IgOiBwdWJsaWMgc3RkOjp2ZWN0b3I8VCwgcG9vbF9hbGxvY2F0b3I8VD4gPiB7CitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxULCBwb29sX2FsbG9jYXRvcjxUPiA+OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgIFRWZWN0b3IoKSA6IHN0ZDo6dmVjdG9yPFQsIHBvb2xfYWxsb2NhdG9yPFQ+ID4oKSB7fQorICAgIFRWZWN0b3IoY29uc3QgcG9vbF9hbGxvY2F0b3I8VD4mIGEpIDogc3RkOjp2ZWN0b3I8VCwgcG9vbF9hbGxvY2F0b3I8VD4gPihhKSB7fQorICAgIFRWZWN0b3Ioc2l6ZV90eXBlIGkpOiBzdGQ6OnZlY3RvcjxULCBwb29sX2FsbG9jYXRvcjxUPiA+KGkpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgSywgY2xhc3MgRCwgY2xhc3MgQ01QID0gc3RkOjpsZXNzPEs+ID4gCitjbGFzcyBUTWFwIDogcHVibGljIHN0ZDo6bWFwPEssIEQsIENNUCwgcG9vbF9hbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IEssIEQ+ID4gPiB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBwb29sX2FsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgSywgRD4gPiB0QWxsb2NhdG9yOworCisgICAgVE1hcCgpIDogc3RkOjptYXA8SywgRCwgQ01QLCB0QWxsb2NhdG9yPigpIHt9CisgICAgLy8gdXNlIGNvcnJlY3QgdHdvLXN0YWdlIG5hbWUgbG9va3VwIHN1cHBvcnRlZCBpbiBnY2MgMy40IGFuZCBhYm92ZQorICAgIFRNYXAoY29uc3QgdEFsbG9jYXRvciYgYSkgOiBzdGQ6Om1hcDxLLCBELCBDTVAsIHRBbGxvY2F0b3I+KHN0ZDo6bWFwPEssIEQsIENNUCwgdEFsbG9jYXRvcj46OmtleV9jb21wYXJlKCksIGEpIHt9Cit9OworCisjZW5kaWYgLy8gX0NPTU1PTl9JTkNMVURFRF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0NvbXBpbGVyLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0NvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGJlYmVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsMjQwIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaW5jbHVkZSAiY29tcGlsZXIvRGV0ZWN0UmVjdXJzaW9uLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvSW5pdGlhbGl6ZS5oIgorI2luY2x1ZGUgImNvbXBpbGVyL1BhcnNlSGVscGVyLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvU2hIYW5kbGUuaCIKKyNpbmNsdWRlICJjb21waWxlci9WYWxpZGF0ZUxpbWl0YXRpb25zLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvTWFwTG9uZ1ZhcmlhYmxlTmFtZXMuaCIKKworbmFtZXNwYWNlIHsKK2Jvb2wgSW5pdGlhbGl6ZVN5bWJvbFRhYmxlKAorICAgIGNvbnN0IFRCdWlsdEluU3RyaW5ncyYgYnVpbHRJblN0cmluZ3MsCisgICAgU2hTaGFkZXJUeXBlIHR5cGUsIFNoU2hhZGVyU3BlYyBzcGVjLCBjb25zdCBTaEJ1aWx0SW5SZXNvdXJjZXMmIHJlc291cmNlcywKKyAgICBUSW5mb1NpbmsmIGluZm9TaW5rLCBUU3ltYm9sVGFibGUmIHN5bWJvbFRhYmxlKQoreworICAgIFRJbnRlcm1lZGlhdGUgaW50ZXJtZWRpYXRlKGluZm9TaW5rKTsKKyAgICBURXh0ZW5zaW9uQmVoYXZpb3IgZXh0QmVoYXZpb3I7CisgICAgVFBhcnNlQ29udGV4dCBwYXJzZUNvbnRleHQoc3ltYm9sVGFibGUsIGV4dEJlaGF2aW9yLCBpbnRlcm1lZGlhdGUsIHR5cGUsIHNwZWMsIDAsIE5VTEwsIGluZm9TaW5rKTsKKworICAgIEdsb2JhbFBhcnNlQ29udGV4dCA9ICZwYXJzZUNvbnRleHQ7CisKKyAgICBhc3NlcnQoc3ltYm9sVGFibGUuaXNFbXB0eSgpKTsgICAgICAgCisgICAgLy8KKyAgICAvLyBQYXJzZSB0aGUgYnVpbHQtaW5zLiAgVGhpcyBzaG91bGQgb25seSBoYXBwZW4gb25jZSBwZXIKKyAgICAvLyBsYW5ndWFnZSBzeW1ib2wgdGFibGUuCisgICAgLy8KKyAgICAvLyBQdXNoIHRoZSBzeW1ib2wgdGFibGUgdG8gZ2l2ZSBpdCBhbiBpbml0aWFsIHNjb3BlLiAgVGhpcworICAgIC8vIHB1c2ggc2hvdWxkIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBwb3AsIHNvIHRoYXQgYnVpbHQtaW5zCisgICAgLy8gYXJlIHByZXNlcnZlZCwgYW5kIHRoZSB0ZXN0IGZvciBhbiBlbXB0eSB0YWJsZSBmYWlscy4KKyAgICAvLworICAgIHN5bWJvbFRhYmxlLnB1c2goKTsKKworICAgIGZvciAoVEJ1aWx0SW5TdHJpbmdzOjpjb25zdF9pdGVyYXRvciBpID0gYnVpbHRJblN0cmluZ3MuYmVnaW4oKTsgaSAhPSBidWlsdEluU3RyaW5ncy5lbmQoKTsgKytpKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogYnVpbHRJblNoYWRlcnMgPSBpLT5jX3N0cigpOworICAgICAgICBpbnQgYnVpbHRJbkxlbmd0aHMgPSBzdGF0aWNfY2FzdDxpbnQ+KGktPnNpemUoKSk7CisgICAgICAgIGlmIChidWlsdEluTGVuZ3RocyA8PSAwKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChQYVBhcnNlU3RyaW5ncygxLCAmYnVpbHRJblNoYWRlcnMsICZidWlsdEluTGVuZ3RocywgJnBhcnNlQ29udGV4dCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhJbnRlcm5hbEVycm9yLCAiVW5hYmxlIHRvIHBhcnNlIGJ1aWx0LWlucyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgSWRlbnRpZnlCdWlsdElucyh0eXBlLCBzcGVjLCByZXNvdXJjZXMsIHN5bWJvbFRhYmxlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBUU2NvcGVkUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgVFNjb3BlZFBvb2xBbGxvY2F0b3IoVFBvb2xBbGxvY2F0b3IqIGFsbG9jYXRvciwgYm9vbCBwdXNoUG9wKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSwgbVB1c2hQb3BBbGxvY2F0b3IocHVzaFBvcCkgeworICAgICAgICBpZiAobVB1c2hQb3BBbGxvY2F0b3IpIG1BbGxvY2F0b3ItPnB1c2goKTsKKyAgICAgICAgU2V0R2xvYmFsUG9vbEFsbG9jYXRvcihtQWxsb2NhdG9yKTsKKyAgICB9CisgICAgflRTY29wZWRQb29sQWxsb2NhdG9yKCkgeworICAgICAgICBTZXRHbG9iYWxQb29sQWxsb2NhdG9yKE5VTEwpOworICAgICAgICBpZiAobVB1c2hQb3BBbGxvY2F0b3IpIG1BbGxvY2F0b3ItPnBvcCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBUUG9vbEFsbG9jYXRvciogbUFsbG9jYXRvcjsKKyAgICBib29sIG1QdXNoUG9wQWxsb2NhdG9yOworfTsKK30gIC8vIG5hbWVzcGFjZQorCitUU2hIYW5kbGVCYXNlOjpUU2hIYW5kbGVCYXNlKCkgeworICAgIGFsbG9jYXRvci5wdXNoKCk7CisgICAgU2V0R2xvYmFsUG9vbEFsbG9jYXRvcigmYWxsb2NhdG9yKTsKK30KKworVFNoSGFuZGxlQmFzZTo6flRTaEhhbmRsZUJhc2UoKSB7CisgICAgU2V0R2xvYmFsUG9vbEFsbG9jYXRvcihOVUxMKTsKKyAgICBhbGxvY2F0b3IucG9wQWxsKCk7Cit9CisKK1RDb21waWxlcjo6VENvbXBpbGVyKFNoU2hhZGVyVHlwZSB0eXBlLCBTaFNoYWRlclNwZWMgc3BlYykKKyAgICA6IHNoYWRlclR5cGUodHlwZSksCisgICAgICBzaGFkZXJTcGVjKHNwZWMpIAoreworfQorCitUQ29tcGlsZXI6On5UQ29tcGlsZXIoKQoreworfQorCitib29sIFRDb21waWxlcjo6SW5pdChjb25zdCBTaEJ1aWx0SW5SZXNvdXJjZXMmIHJlc291cmNlcykKK3sKKyAgICBUU2NvcGVkUG9vbEFsbG9jYXRvciBzY29wZWRBbGxvYygmYWxsb2NhdG9yLCBmYWxzZSk7CisKKyAgICAvLyBHZW5lcmF0ZSBidWlsdC1pbiBzeW1ib2wgdGFibGUuCisgICAgaWYgKCFJbml0QnVpbHRJblN5bWJvbFRhYmxlKHJlc291cmNlcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBJbml0RXh0ZW5zaW9uQmVoYXZpb3IocmVzb3VyY2VzLCBleHRlbnNpb25CZWhhdmlvcik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUQ29tcGlsZXI6OmNvbXBpbGUoY29uc3QgY2hhciogY29uc3Qgc2hhZGVyU3RyaW5nc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bVN0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGlsZU9wdGlvbnMpCit7CisgICAgVFNjb3BlZFBvb2xBbGxvY2F0b3Igc2NvcGVkQWxsb2MoJmFsbG9jYXRvciwgdHJ1ZSk7CisgICAgY2xlYXJSZXN1bHRzKCk7CisKKyAgICBpZiAobnVtU3RyaW5ncyA9PSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIElmIGNvbXBpbGluZyBmb3IgV2ViR0wsIHZhbGlkYXRlIGxvb3AgYW5kIGluZGV4aW5nIGFzIHdlbGwuCisgICAgaWYgKHNoYWRlclNwZWMgPT0gU0hfV0VCR0xfU1BFQykKKyAgICAgICAgY29tcGlsZU9wdGlvbnMgfD0gU0hfVkFMSURBVEVfTE9PUF9JTkRFWElORzsKKworICAgIC8vIEZpcnN0IHN0cmluZyBpcyBwYXRoIG9mIHNvdXJjZSBmaWxlIGlmIGZsYWcgaXMgc2V0LiBUaGUgYWN0dWFsIHNvdXJjZSBmb2xsb3dzLgorICAgIGNvbnN0IGNoYXIqIHNvdXJjZVBhdGggPSBOVUxMOworICAgIGludCBmaXJzdFNvdXJjZSA9IDA7CisgICAgaWYgKGNvbXBpbGVPcHRpb25zICYgU0hfU09VUkNFX1BBVEgpCisgICAgeworICAgICAgICBzb3VyY2VQYXRoID0gc2hhZGVyU3RyaW5nc1swXTsKKyAgICAgICAgKytmaXJzdFNvdXJjZTsKKyAgICB9CisKKyAgICBUSW50ZXJtZWRpYXRlIGludGVybWVkaWF0ZShpbmZvU2luayk7CisgICAgVFBhcnNlQ29udGV4dCBwYXJzZUNvbnRleHQoc3ltYm9sVGFibGUsIGV4dGVuc2lvbkJlaGF2aW9yLCBpbnRlcm1lZGlhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyVHlwZSwgc2hhZGVyU3BlYywgY29tcGlsZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUGF0aCwgaW5mb1NpbmspOworICAgIEdsb2JhbFBhcnNlQ29udGV4dCA9ICZwYXJzZUNvbnRleHQ7CisKKyAgICAvLyBXZSBwcmVzZXJ2ZSBzeW1ib2xzIGF0IHRoZSBidWlsdC1pbiBsZXZlbCBmcm9tIGNvbXBpbGUtdG8tY29tcGlsZS4KKyAgICAvLyBTdGFydCBwdXNoaW5nIHRoZSB1c2VyLWRlZmluZWQgc3ltYm9scyBhdCBnbG9iYWwgbGV2ZWwuCisgICAgc3ltYm9sVGFibGUucHVzaCgpOworICAgIGlmICghc3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpKQorICAgICAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEludGVybmFsRXJyb3IsICJXcm9uZyBzeW1ib2wgdGFibGUgbGV2ZWwiKTsKKworICAgIC8vIFBhcnNlIHNoYWRlci4KKyAgICBib29sIHN1Y2Nlc3MgPQorICAgICAgICAoUGFQYXJzZVN0cmluZ3MobnVtU3RyaW5ncyAtIGZpcnN0U291cmNlLCAmc2hhZGVyU3RyaW5nc1tmaXJzdFNvdXJjZV0sIE5VTEwsICZwYXJzZUNvbnRleHQpID09IDApICYmCisgICAgICAgIChwYXJzZUNvbnRleHQudHJlZVJvb3QgIT0gTlVMTCk7CisgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgVEludGVybU5vZGUqIHJvb3QgPSBwYXJzZUNvbnRleHQudHJlZVJvb3Q7CisgICAgICAgIHN1Y2Nlc3MgPSBpbnRlcm1lZGlhdGUucG9zdFByb2Nlc3Mocm9vdCk7CisKKyAgICAgICAgaWYgKHN1Y2Nlc3MpCisgICAgICAgICAgICBzdWNjZXNzID0gZGV0ZWN0UmVjdXJzaW9uKHJvb3QpOworCisgICAgICAgIGlmIChzdWNjZXNzICYmIChjb21waWxlT3B0aW9ucyAmIFNIX1ZBTElEQVRFX0xPT1BfSU5ERVhJTkcpKQorICAgICAgICAgICAgc3VjY2VzcyA9IHZhbGlkYXRlTGltaXRhdGlvbnMocm9vdCk7CisKKyAgICAgICAgLy8gQ2FsbCBtYXBMb25nVmFyaWFibGVOYW1lcygpIGJlZm9yZSBjb2xsZWN0QXR0cmlic1VuaWZvcm1zKCkgc28gaW4KKyAgICAgICAgLy8gY29sbGVjdEF0dHJpYnNVbmlmb3JtcygpIHdlIGFscmVhZHkgaGF2ZSB0aGUgbWFwcGVkIHN5bWJvbCBuYW1lcyBhbmQKKyAgICAgICAgLy8gd2UgY291bGQgY29tcG9zaXRlIG1hcHBlZCBhbmQgb3JpZ2luYWwgdmFyaWFibGUgbmFtZXMuCisgICAgICAgIGlmIChzdWNjZXNzICYmIChjb21waWxlT3B0aW9ucyAmIFNIX01BUF9MT05HX1ZBUklBQkxFX05BTUVTKSkKKyAgICAgICAgICAgIG1hcExvbmdWYXJpYWJsZU5hbWVzKHJvb3QpOworCisgICAgICAgIGlmIChzdWNjZXNzICYmIChjb21waWxlT3B0aW9ucyAmIFNIX0FUVFJJQlVURVNfVU5JRk9STVMpKQorICAgICAgICAgICAgY29sbGVjdEF0dHJpYnNVbmlmb3Jtcyhyb290KTsKKworICAgICAgICBpZiAoc3VjY2VzcyAmJiAoY29tcGlsZU9wdGlvbnMgJiBTSF9JTlRFUk1FRElBVEVfVFJFRSkpCisgICAgICAgICAgICBpbnRlcm1lZGlhdGUub3V0cHV0VHJlZShyb290KTsKKworICAgICAgICBpZiAoc3VjY2VzcyAmJiAoY29tcGlsZU9wdGlvbnMgJiBTSF9PQkpFQ1RfQ09ERSkpCisgICAgICAgICAgICB0cmFuc2xhdGUocm9vdCk7CisgICAgfQorCisgICAgLy8gQ2xlYW51cCBtZW1vcnkuCisgICAgaW50ZXJtZWRpYXRlLnJlbW92ZShwYXJzZUNvbnRleHQudHJlZVJvb3QpOworICAgIC8vIEVuc3VyZSBzeW1ib2wgdGFibGUgaXMgcmV0dXJuZWQgdG8gdGhlIGJ1aWx0LWluIGxldmVsLAorICAgIC8vIHRocm93aW5nIGF3YXkgYWxsIGJ1dCB0aGUgYnVpbHQtaW5zLgorICAgIHdoaWxlICghc3ltYm9sVGFibGUuYXRCdWlsdEluTGV2ZWwoKSkKKyAgICAgICAgc3ltYm9sVGFibGUucG9wKCk7CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworYm9vbCBUQ29tcGlsZXI6OkluaXRCdWlsdEluU3ltYm9sVGFibGUoY29uc3QgU2hCdWlsdEluUmVzb3VyY2VzJiByZXNvdXJjZXMpCit7CisgICAgVEJ1aWx0SW5zIGJ1aWx0SW5zOworCisgICAgYnVpbHRJbnMuaW5pdGlhbGl6ZShzaGFkZXJUeXBlLCBzaGFkZXJTcGVjLCByZXNvdXJjZXMpOworICAgIHJldHVybiBJbml0aWFsaXplU3ltYm9sVGFibGUoYnVpbHRJbnMuZ2V0QnVpbHRJblN0cmluZ3MoKSwKKyAgICAgICAgc2hhZGVyVHlwZSwgc2hhZGVyU3BlYywgcmVzb3VyY2VzLCBpbmZvU2luaywgc3ltYm9sVGFibGUpOworfQorCit2b2lkIFRDb21waWxlcjo6Y2xlYXJSZXN1bHRzKCkKK3sKKyAgICBpbmZvU2luay5pbmZvLmVyYXNlKCk7CisgICAgaW5mb1Npbmsub2JqLmVyYXNlKCk7CisgICAgaW5mb1NpbmsuZGVidWcuZXJhc2UoKTsKKworICAgIGF0dHJpYnMuY2xlYXIoKTsKKyAgICB1bmlmb3Jtcy5jbGVhcigpOworfQorCitib29sIFRDb21waWxlcjo6ZGV0ZWN0UmVjdXJzaW9uKFRJbnRlcm1Ob2RlKiByb290KQoreworICAgIERldGVjdFJlY3Vyc2lvbiBkZXRlY3Q7CisgICAgcm9vdC0+dHJhdmVyc2UoJmRldGVjdCk7CisgICAgc3dpdGNoIChkZXRlY3QuZGV0ZWN0UmVjdXJzaW9uKCkpIHsKKyAgICAgICAgY2FzZSBEZXRlY3RSZWN1cnNpb246OmtFcnJvck5vbmU6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEZXRlY3RSZWN1cnNpb246OmtFcnJvck1pc3NpbmdNYWluOgorICAgICAgICAgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhFcnJvciwgIk1pc3NpbmcgbWFpbigpIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgRGV0ZWN0UmVjdXJzaW9uOjprRXJyb3JSZWN1cnNpb246CisgICAgICAgICAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEVycm9yLCAiRnVuY3Rpb24gcmVjdXJzaW9uIGRldGVjdGVkIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBUQ29tcGlsZXI6OnZhbGlkYXRlTGltaXRhdGlvbnMoVEludGVybU5vZGUqIHJvb3QpIHsKKyAgICBWYWxpZGF0ZUxpbWl0YXRpb25zIHZhbGlkYXRlKHNoYWRlclR5cGUsIGluZm9TaW5rLmluZm8pOworICAgIHJvb3QtPnRyYXZlcnNlKCZ2YWxpZGF0ZSk7CisgICAgcmV0dXJuIHZhbGlkYXRlLm51bUVycm9ycygpID09IDA7Cit9CisKK3ZvaWQgVENvbXBpbGVyOjpjb2xsZWN0QXR0cmlic1VuaWZvcm1zKFRJbnRlcm1Ob2RlKiByb290KQoreworICAgIENvbGxlY3RBdHRyaWJzVW5pZm9ybXMgY29sbGVjdChhdHRyaWJzLCB1bmlmb3Jtcyk7CisgICAgcm9vdC0+dHJhdmVyc2UoJmNvbGxlY3QpOworfQorCit2b2lkIFRDb21waWxlcjo6bWFwTG9uZ1ZhcmlhYmxlTmFtZXMoVEludGVybU5vZGUqIHJvb3QpCit7CisgICAgTWFwTG9uZ1ZhcmlhYmxlTmFtZXMgbWFwKHZhcnlpbmdMb25nTmFtZU1hcCk7CisgICAgcm9vdC0+dHJhdmVyc2UoJm1hcCk7Cit9CisKK2ludCBUQ29tcGlsZXI6OmdldE1hcHBlZE5hbWVNYXhMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBNQVhfSURFTlRJRklFUl9OQU1FX1NJWkUgKyAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvQ29uc3RhbnRVbmlvbi5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvQ29uc3RhbnRVbmlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOGExMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Db25zdGFudFVuaW9uLmgKQEAgLTAsMCArMSwyNTggQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgX0NPTlNUQU5UX1VOSU9OX0lOQ0xVREVEXworI2RlZmluZSBfQ09OU1RBTlRfVU5JT05fSU5DTFVERURfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworY2xhc3MgQ29uc3RhbnRVbmlvbiB7CitwdWJsaWM6CisKKyAgICBQT09MX0FMTE9DQVRPUl9ORVdfREVMRVRFKEdsb2JhbFBvb2xBbGxvY2F0b3IpICAgICAgICAKKyAgICB2b2lkIHNldElDb25zdChpbnQgaSkge2lDb25zdCA9IGk7IHR5cGUgPSBFYnRJbnQ7IH0KKyAgICB2b2lkIHNldEZDb25zdChmbG9hdCBmKSB7ZkNvbnN0ID0gZjsgdHlwZSA9IEVidEZsb2F0OyB9CisgICAgdm9pZCBzZXRCQ29uc3QoYm9vbCBiKSB7YkNvbnN0ID0gYjsgdHlwZSA9IEVidEJvb2w7IH0KKworICAgIGludCBnZXRJQ29uc3QoKSB7IHJldHVybiBpQ29uc3Q7IH0KKyAgICBmbG9hdCBnZXRGQ29uc3QoKSB7IHJldHVybiBmQ29uc3Q7IH0KKyAgICBib29sIGdldEJDb25zdCgpIHsgcmV0dXJuIGJDb25zdDsgfQorICAgIGludCBnZXRJQ29uc3QoKSBjb25zdCB7IHJldHVybiBpQ29uc3Q7IH0KKyAgICBmbG9hdCBnZXRGQ29uc3QoKSBjb25zdCB7IHJldHVybiBmQ29uc3Q7IH0KKyAgICBib29sIGdldEJDb25zdCgpIGNvbnN0IHsgcmV0dXJuIGJDb25zdDsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGludCBpKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGkgPT0gaUNvbnN0OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmbG9hdCBmKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGYgPT0gZkNvbnN0OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBib29sIGIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYiA9PSBiQ29uc3Q7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbnN0YW50VW5pb24mIGNvbnN0YW50KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGNvbnN0YW50LnR5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBFYnRJbnQ6CisgICAgICAgICAgICByZXR1cm4gY29uc3RhbnQuaUNvbnN0ID09IGlDb25zdDsKKyAgICAgICAgY2FzZSBFYnRGbG9hdDoKKyAgICAgICAgICAgIHJldHVybiBjb25zdGFudC5mQ29uc3QgPT0gZkNvbnN0OworICAgICAgICBjYXNlIEVidEJvb2w6CisgICAgICAgICAgICByZXR1cm4gY29uc3RhbnQuYkNvbnN0ID09IGJDb25zdDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaW50IGkpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oaSk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZsb2F0IGYpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oZik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGJvb2wgYikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShiKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ29uc3RhbnRVbmlvbiYgY29uc3RhbnQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oY29uc3RhbnQpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IENvbnN0YW50VW5pb24mIGNvbnN0YW50KSBjb25zdAorICAgIHsgCisgICAgICAgIGFzc2VydCh0eXBlID09IGNvbnN0YW50LnR5cGUpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBFYnRJbnQ6CisgICAgICAgICAgICByZXR1cm4gaUNvbnN0ID4gY29uc3RhbnQuaUNvbnN0OworICAgICAgICBjYXNlIEVidEZsb2F0OgorICAgICAgICAgICAgcmV0dXJuIGZDb25zdCA+IGNvbnN0YW50LmZDb25zdDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBJbnZhbGlkIG9wZXJhdGlvbiwgaGFuZGxlZCBhdCBzZW1hbnRpYyBhbmFseXNpcworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENvbnN0YW50VW5pb24mIGNvbnN0YW50KSBjb25zdAorICAgIHsgCisgICAgICAgIGFzc2VydCh0eXBlID09IGNvbnN0YW50LnR5cGUpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBFYnRJbnQ6CisgICAgICAgICAgICByZXR1cm4gaUNvbnN0IDwgY29uc3RhbnQuaUNvbnN0OworICAgICAgICBjYXNlIEVidEZsb2F0OgorICAgICAgICAgICAgcmV0dXJuIGZDb25zdCA8IGNvbnN0YW50LmZDb25zdDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBJbnZhbGlkIG9wZXJhdGlvbiwgaGFuZGxlZCBhdCBzZW1hbnRpYyBhbmFseXNpcworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENvbnN0YW50VW5pb24gb3BlcmF0b3IrKGNvbnN0IENvbnN0YW50VW5pb24mIGNvbnN0YW50KSBjb25zdAorICAgIHsgCisgICAgICAgIENvbnN0YW50VW5pb24gcmV0dXJuVmFsdWU7CisgICAgICAgIGFzc2VydCh0eXBlID09IGNvbnN0YW50LnR5cGUpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBFYnRJbnQ6IHJldHVyblZhbHVlLnNldElDb25zdChpQ29uc3QgKyBjb25zdGFudC5pQ29uc3QpOyBicmVhazsKKyAgICAgICAgY2FzZSBFYnRGbG9hdDogcmV0dXJuVmFsdWUuc2V0RkNvbnN0KGZDb25zdCArIGNvbnN0YW50LmZDb25zdCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UgJiYgIkRlZmF1bHQgbWlzc2luZyIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworICAgIH0KKworICAgIENvbnN0YW50VW5pb24gb3BlcmF0b3ItKGNvbnN0IENvbnN0YW50VW5pb24mIGNvbnN0YW50KSBjb25zdAorICAgIHsgCisgICAgICAgIENvbnN0YW50VW5pb24gcmV0dXJuVmFsdWU7CisgICAgICAgIGFzc2VydCh0eXBlID09IGNvbnN0YW50LnR5cGUpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBFYnRJbnQ6IHJldHVyblZhbHVlLnNldElDb25zdChpQ29uc3QgLSBjb25zdGFudC5pQ29uc3QpOyBicmVhazsKKyAgICAgICAgY2FzZSBFYnRGbG9hdDogcmV0dXJuVmFsdWUuc2V0RkNvbnN0KGZDb25zdCAtIGNvbnN0YW50LmZDb25zdCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UgJiYgIkRlZmF1bHQgbWlzc2luZyIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworICAgIH0KKworICAgIENvbnN0YW50VW5pb24gb3BlcmF0b3IqKGNvbnN0IENvbnN0YW50VW5pb24mIGNvbnN0YW50KSBjb25zdAorICAgIHsgCisgICAgICAgIENvbnN0YW50VW5pb24gcmV0dXJuVmFsdWU7CisgICAgICAgIGFzc2VydCh0eXBlID09IGNvbnN0YW50LnR5cGUpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBFYnRJbnQ6IHJldHVyblZhbHVlLnNldElDb25zdChpQ29uc3QgKiBjb25zdGFudC5pQ29uc3QpOyBicmVhazsKKyAgICAgICAgY2FzZSBFYnRGbG9hdDogcmV0dXJuVmFsdWUuc2V0RkNvbnN0KGZDb25zdCAqIGNvbnN0YW50LmZDb25zdCk7IGJyZWFrOyAKKyAgICAgICAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlICYmICJEZWZhdWx0IG1pc3NpbmciKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisKKyAgICBDb25zdGFudFVuaW9uIG9wZXJhdG9yJShjb25zdCBDb25zdGFudFVuaW9uJiBjb25zdGFudCkgY29uc3QKKyAgICB7IAorICAgICAgICBDb25zdGFudFVuaW9uIHJldHVyblZhbHVlOworICAgICAgICBhc3NlcnQodHlwZSA9PSBjb25zdGFudC50eXBlKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgRWJ0SW50OiByZXR1cm5WYWx1ZS5zZXRJQ29uc3QoaUNvbnN0ICUgY29uc3RhbnQuaUNvbnN0KTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICBhc3NlcnQoZmFsc2UgJiYgIkRlZmF1bHQgbWlzc2luZyIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworICAgIH0KKworICAgIENvbnN0YW50VW5pb24gb3BlcmF0b3I+Pihjb25zdCBDb25zdGFudFVuaW9uJiBjb25zdGFudCkgY29uc3QKKyAgICB7IAorICAgICAgICBDb25zdGFudFVuaW9uIHJldHVyblZhbHVlOworICAgICAgICBhc3NlcnQodHlwZSA9PSBjb25zdGFudC50eXBlKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgRWJ0SW50OiByZXR1cm5WYWx1ZS5zZXRJQ29uc3QoaUNvbnN0ID4+IGNvbnN0YW50LmlDb25zdCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgYXNzZXJ0KGZhbHNlICYmICJEZWZhdWx0IG1pc3NpbmciKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisKKyAgICBDb25zdGFudFVuaW9uIG9wZXJhdG9yPDwoY29uc3QgQ29uc3RhbnRVbmlvbiYgY29uc3RhbnQpIGNvbnN0CisgICAgeyAKKyAgICAgICAgQ29uc3RhbnRVbmlvbiByZXR1cm5WYWx1ZTsKKyAgICAgICAgYXNzZXJ0KHR5cGUgPT0gY29uc3RhbnQudHlwZSk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEVidEludDogcmV0dXJuVmFsdWUuc2V0SUNvbnN0KGlDb25zdCA8PCBjb25zdGFudC5pQ29uc3QpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgIGFzc2VydChmYWxzZSAmJiAiRGVmYXVsdCBtaXNzaW5nIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorCisgICAgQ29uc3RhbnRVbmlvbiBvcGVyYXRvciYoY29uc3QgQ29uc3RhbnRVbmlvbiYgY29uc3RhbnQpIGNvbnN0CisgICAgeyAKKyAgICAgICAgQ29uc3RhbnRVbmlvbiByZXR1cm5WYWx1ZTsKKyAgICAgICAgYXNzZXJ0KHR5cGUgPT0gY29uc3RhbnQudHlwZSk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEVidEludDogIHJldHVyblZhbHVlLnNldElDb25zdChpQ29uc3QgJiBjb25zdGFudC5pQ29uc3QpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgIGFzc2VydChmYWxzZSAmJiAiRGVmYXVsdCBtaXNzaW5nIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorCisgICAgQ29uc3RhbnRVbmlvbiBvcGVyYXRvcnwoY29uc3QgQ29uc3RhbnRVbmlvbiYgY29uc3RhbnQpIGNvbnN0CisgICAgeyAKKyAgICAgICAgQ29uc3RhbnRVbmlvbiByZXR1cm5WYWx1ZTsKKyAgICAgICAgYXNzZXJ0KHR5cGUgPT0gY29uc3RhbnQudHlwZSk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEVidEludDogIHJldHVyblZhbHVlLnNldElDb25zdChpQ29uc3QgfCBjb25zdGFudC5pQ29uc3QpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgIGFzc2VydChmYWxzZSAmJiAiRGVmYXVsdCBtaXNzaW5nIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorCisgICAgQ29uc3RhbnRVbmlvbiBvcGVyYXRvcl4oY29uc3QgQ29uc3RhbnRVbmlvbiYgY29uc3RhbnQpIGNvbnN0CisgICAgeyAKKyAgICAgICAgQ29uc3RhbnRVbmlvbiByZXR1cm5WYWx1ZTsKKyAgICAgICAgYXNzZXJ0KHR5cGUgPT0gY29uc3RhbnQudHlwZSk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEVidEludDogIHJldHVyblZhbHVlLnNldElDb25zdChpQ29uc3QgXiBjb25zdGFudC5pQ29uc3QpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgIGFzc2VydChmYWxzZSAmJiAiRGVmYXVsdCBtaXNzaW5nIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorCisgICAgQ29uc3RhbnRVbmlvbiBvcGVyYXRvciYmKGNvbnN0IENvbnN0YW50VW5pb24mIGNvbnN0YW50KSBjb25zdAorICAgIHsgCisgICAgICAgIENvbnN0YW50VW5pb24gcmV0dXJuVmFsdWU7CisgICAgICAgIGFzc2VydCh0eXBlID09IGNvbnN0YW50LnR5cGUpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBFYnRCb29sOiByZXR1cm5WYWx1ZS5zZXRCQ29uc3QoYkNvbnN0ICYmIGNvbnN0YW50LmJDb25zdCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgYXNzZXJ0KGZhbHNlICYmICJEZWZhdWx0IG1pc3NpbmciKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisKKyAgICBDb25zdGFudFVuaW9uIG9wZXJhdG9yfHwoY29uc3QgQ29uc3RhbnRVbmlvbiYgY29uc3RhbnQpIGNvbnN0CisgICAgeyAKKyAgICAgICAgQ29uc3RhbnRVbmlvbiByZXR1cm5WYWx1ZTsKKyAgICAgICAgYXNzZXJ0KHR5cGUgPT0gY29uc3RhbnQudHlwZSk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEVidEJvb2w6IHJldHVyblZhbHVlLnNldEJDb25zdChiQ29uc3QgfHwgY29uc3RhbnQuYkNvbnN0KTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICBhc3NlcnQoZmFsc2UgJiYgIkRlZmF1bHQgbWlzc2luZyIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworICAgIH0KKworICAgIFRCYXNpY1R5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGU7IH0KK3ByaXZhdGU6CisKKyAgICB1bmlvbiAgeworICAgICAgICBpbnQgaUNvbnN0OyAgLy8gdXNlZCBmb3IgaXZlYywgc2NhbGFyIGludHMKKyAgICAgICAgYm9vbCBiQ29uc3Q7IC8vIHVzZWQgZm9yIGJ2ZWMsIHNjYWxhciBib29scworICAgICAgICBmbG9hdCBmQ29uc3Q7ICAgLy8gdXNlZCBmb3IgdmVjLCBtYXQsIHNjYWxhciBmbG9hdHMKKyAgICB9IDsKKworICAgIFRCYXNpY1R5cGUgdHlwZTsKK307CisKKyNlbmRpZiAvLyBfQ09OU1RBTlRfVU5JT05fSU5DTFVERURfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9EZXRlY3RSZWN1cnNpb24uY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvRGV0ZWN0UmVjdXJzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDM1NGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvRGV0ZWN0UmVjdXJzaW9uLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDExIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2luY2x1ZGUgImNvbXBpbGVyL0RldGVjdFJlY3Vyc2lvbi5oIgorCitEZXRlY3RSZWN1cnNpb246OkZ1bmN0aW9uTm9kZTo6RnVuY3Rpb25Ob2RlKGNvbnN0IFRTdHJpbmcmIGZuYW1lKQorICAgIDogbmFtZShmbmFtZSksCisgICAgICB2aXNpdChQcmVWaXNpdCkKK3sKK30KKworY29uc3QgVFN0cmluZyYgRGV0ZWN0UmVjdXJzaW9uOjpGdW5jdGlvbk5vZGU6OmdldE5hbWUoKSBjb25zdAoreworICAgIHJldHVybiBuYW1lOworfQorCit2b2lkIERldGVjdFJlY3Vyc2lvbjo6RnVuY3Rpb25Ob2RlOjphZGRDYWxsZWUoCisgICAgRGV0ZWN0UmVjdXJzaW9uOjpGdW5jdGlvbk5vZGUqIGNhbGxlZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxlZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGNhbGxlZXNbaV0gPT0gY2FsbGVlKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYWxsZWVzLnB1c2hfYmFjayhjYWxsZWUpOworfQorCitib29sIERldGVjdFJlY3Vyc2lvbjo6RnVuY3Rpb25Ob2RlOjpkZXRlY3RSZWN1cnNpb24oKQoreworICAgIEFTU0VSVCh2aXNpdCA9PSBQcmVWaXNpdCk7CisgICAgdmlzaXQgPSBJblZpc2l0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FsbGVlcy5zaXplKCk7ICsraSkgeworICAgICAgICBzd2l0Y2ggKGNhbGxlZXNbaV0tPnZpc2l0KSB7CisgICAgICAgICAgICBjYXNlIEluVmlzaXQ6CisgICAgICAgICAgICAgICAgLy8gY3ljbGUgZGV0ZWN0ZWQsIGkuZS4sIHJlY3Vyc2lvbiBkZXRlY3RlZC4KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgUG9zdFZpc2l0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQcmVWaXNpdDogeworICAgICAgICAgICAgICAgIGJvb2wgcmVjdXJzaW9uID0gY2FsbGVlc1tpXS0+ZGV0ZWN0UmVjdXJzaW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdmlzaXQgPSBQb3N0VmlzaXQ7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitEZXRlY3RSZWN1cnNpb246OkRldGVjdFJlY3Vyc2lvbigpCisgICAgOiBjdXJyZW50RnVuY3Rpb24oTlVMTCkKK3sKK30KKworRGV0ZWN0UmVjdXJzaW9uOjp+RGV0ZWN0UmVjdXJzaW9uKCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9ucy5zaXplKCk7ICsraSkKKyAgICAgICAgZGVsZXRlIGZ1bmN0aW9uc1tpXTsKK30KKworYm9vbCBEZXRlY3RSZWN1cnNpb246OnZpc2l0QWdncmVnYXRlKFZpc2l0IHZpc2l0LCBUSW50ZXJtQWdncmVnYXRlKiBub2RlKQoreworICAgIHN3aXRjaCAobm9kZS0+Z2V0T3AoKSkKKyAgICB7CisgICAgICAgIGNhc2UgRU9wUHJvdG90eXBlOgorICAgICAgICAgICAgLy8gRnVuY3Rpb24gZGVjbGFyYXRpb24uCisgICAgICAgICAgICAvLyBEb24ndCBhZGQgRnVuY3Rpb25Ob2RlIGhlcmUgYmVjYXVzZSBub2RlLT5nZXROYW1lKCkgaXMgdGhlCisgICAgICAgICAgICAvLyB1bm1hbmdsZWQgZnVuY3Rpb24gbmFtZS4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcEZ1bmN0aW9uOiB7CisgICAgICAgICAgICAvLyBGdW5jdGlvbiBkZWZpbml0aW9uLgorICAgICAgICAgICAgaWYgKHZpc2l0ID09IFByZVZpc2l0KSB7CisgICAgICAgICAgICAgICAgY3VycmVudEZ1bmN0aW9uID0gZmluZEZ1bmN0aW9uQnlOYW1lKG5vZGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGdW5jdGlvbiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbk5vZGUobm9kZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2hfYmFjayhjdXJyZW50RnVuY3Rpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRU9wRnVuY3Rpb25DYWxsOiB7CisgICAgICAgICAgICAvLyBGdW5jdGlvbiBjYWxsLgorICAgICAgICAgICAgaWYgKHZpc2l0ID09IFByZVZpc2l0KSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKGN1cnJlbnRGdW5jdGlvbiAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICBGdW5jdGlvbk5vZGUqIGZ1bmMgPSBmaW5kRnVuY3Rpb25CeU5hbWUobm9kZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb25Ob2RlKG5vZGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoX2JhY2soZnVuYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cnJlbnRGdW5jdGlvbi0+YWRkQ2FsbGVlKGZ1bmMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworRGV0ZWN0UmVjdXJzaW9uOjpFcnJvckNvZGUgRGV0ZWN0UmVjdXJzaW9uOjpkZXRlY3RSZWN1cnNpb24oKQoreworICAgIEZ1bmN0aW9uTm9kZSogbWFpbiA9IGZpbmRGdW5jdGlvbkJ5TmFtZSgibWFpbigiKTsKKyAgICBpZiAobWFpbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4ga0Vycm9yTWlzc2luZ01haW47CisgICAgaWYgKG1haW4tPmRldGVjdFJlY3Vyc2lvbigpKQorICAgICAgICByZXR1cm4ga0Vycm9yUmVjdXJzaW9uOworICAgIHJldHVybiBrRXJyb3JOb25lOworfQorCitEZXRlY3RSZWN1cnNpb246OkZ1bmN0aW9uTm9kZSogRGV0ZWN0UmVjdXJzaW9uOjpmaW5kRnVuY3Rpb25CeU5hbWUoCisgICAgY29uc3QgVFN0cmluZyYgbmFtZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZ1bmN0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoZnVuY3Rpb25zW2ldLT5nZXROYW1lKCkgPT0gbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbnNbaV07CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9EZXRlY3RSZWN1cnNpb24uaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0RldGVjdFJlY3Vyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWM3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9EZXRlY3RSZWN1cnNpb24uaApAQCAtMCwwICsxLDYwIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaWZuZGVmIENPTVBJTEVSX0RFVEVDVF9SRUNVUlNJT05fSF8KKyNkZWZpbmUgQ09NUElMRVJfREVURUNUX1JFQ1VSU0lPTl9IXworCisjaW5jbHVkZSAiR0xTTEFORy9TaGFkZXJMYW5nLmgiCisKKyNpbmNsdWRlICJjb21waWxlci9pbnRlcm1lZGlhdGUuaCIKKyNpbmNsdWRlICJjb21waWxlci9WYXJpYWJsZUluZm8uaCIKKworLy8gVHJhdmVyc2VzIGludGVybWVkaWF0ZSB0cmVlIHRvIGRldGVjdCBmdW5jdGlvbiByZWN1cnNpb24uCitjbGFzcyBEZXRlY3RSZWN1cnNpb24gOiBwdWJsaWMgVEludGVybVRyYXZlcnNlciB7CitwdWJsaWM6CisgICAgZW51bSBFcnJvckNvZGUgeworICAgICAgICBrRXJyb3JNaXNzaW5nTWFpbiwKKyAgICAgICAga0Vycm9yUmVjdXJzaW9uLAorICAgICAgICBrRXJyb3JOb25lCisgICAgfTsKKworICAgIERldGVjdFJlY3Vyc2lvbigpOworICAgIH5EZXRlY3RSZWN1cnNpb24oKTsKKworICAgIHZpcnR1YWwgYm9vbCB2aXNpdEFnZ3JlZ2F0ZShWaXNpdCwgVEludGVybUFnZ3JlZ2F0ZSopOworCisgICAgRXJyb3JDb2RlIGRldGVjdFJlY3Vyc2lvbigpOworCitwcml2YXRlOgorICAgIGNsYXNzIEZ1bmN0aW9uTm9kZSB7CisgICAgcHVibGljOgorICAgICAgICBGdW5jdGlvbk5vZGUoY29uc3QgVFN0cmluZyYgZm5hbWUpOworCisgICAgICAgIGNvbnN0IFRTdHJpbmcmIGdldE5hbWUoKSBjb25zdDsKKworICAgICAgICAvLyBJZiBhIGZ1bmN0aW9uIGlzIGFscmVhZHkgaW4gdGhlIGNhbGxlZSBsaXN0LCB0aGlzIGJlY29tZXMgYSBuby1vcC4KKyAgICAgICAgdm9pZCBhZGRDYWxsZWUoRnVuY3Rpb25Ob2RlKiBjYWxsZWUpOworCisgICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYWxscyBhcmUgZGV0ZWN0ZWQuCisgICAgICAgIGJvb2wgZGV0ZWN0UmVjdXJzaW9uKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBtYW5nbGVkIGZ1bmN0aW9uIG5hbWUgaXMgdW5pcXVlLgorICAgICAgICBUU3RyaW5nIG5hbWU7CisKKyAgICAgICAgLy8gZnVuY3Rpb25zIHRoYXQgYXJlIGRpcmVjdGx5IGNhbGxlZCBieSB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBUVmVjdG9yPEZ1bmN0aW9uTm9kZSo+IGNhbGxlZXM7CisKKyAgICAgICAgVmlzaXQgdmlzaXQ7CisgICAgfTsKKworICAgIEZ1bmN0aW9uTm9kZSogZmluZEZ1bmN0aW9uQnlOYW1lKGNvbnN0IFRTdHJpbmcmIG5hbWUpOworCisgICAgVFZlY3RvcjxGdW5jdGlvbk5vZGUqPiBmdW5jdGlvbnM7CisgICAgRnVuY3Rpb25Ob2RlKiBjdXJyZW50RnVuY3Rpb247Cit9OworCisjZW5kaWYgIC8vIENPTVBJTEVSX0RFVEVDVF9SRUNVUlNJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0V4dGVuc2lvbkJlaGF2aW9yLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9FeHRlbnNpb25CZWhhdmlvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTZjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9FeHRlbnNpb25CZWhhdmlvci5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgX0VYVEVOU0lPTl9CRUhBVklPUl9JTkNMVURFRF8KKyNkZWZpbmUgX0VYVEVOU0lPTl9CRUhBVklPUl9JTkNMVURFRF8KKworI2luY2x1ZGUgImNvbXBpbGVyL0NvbW1vbi5oIgorCit0eXBlZGVmIGVudW0geworICAgIEVCaFJlcXVpcmUsCisgICAgRUJoRW5hYmxlLAorICAgIEVCaFdhcm4sCisgICAgRUJoRGlzYWJsZQorfSBUQmVoYXZpb3I7CisKK3R5cGVkZWYgVE1hcDxUU3RyaW5nLCBUQmVoYXZpb3I+IFRFeHRlbnNpb25CZWhhdmlvcjsKKworI2VuZGlmIC8vIF9FWFRFTlNJT05fVEFCTEVfSU5DTFVERURfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Gb3JMb29wVW5yb2xsLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0Zvckxvb3BVbnJvbGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MzFhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Gb3JMb29wVW5yb2xsLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDExIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2luY2x1ZGUgImNvbXBpbGVyL0Zvckxvb3BVbnJvbGwuaCIKKwordm9pZCBGb3JMb29wVW5yb2xsOjpGaWxsTG9vcEluZGV4SW5mbyhUSW50ZXJtTG9vcCogbm9kZSwgVExvb3BJbmRleEluZm8mIGluZm8pCit7CisgICAgQVNTRVJUKG5vZGUtPmdldFR5cGUoKSA9PSBFTG9vcEZvcik7CisgICAgQVNTRVJUKG5vZGUtPmdldFVucm9sbEZsYWcoKSk7CisKKyAgICBUSW50ZXJtTm9kZSogaW5pdCA9IG5vZGUtPmdldEluaXQoKTsKKyAgICBBU1NFUlQoaW5pdCAhPSBOVUxMKTsKKyAgICBUSW50ZXJtQWdncmVnYXRlKiBkZWNsID0gaW5pdC0+Z2V0QXNBZ2dyZWdhdGUoKTsKKyAgICBBU1NFUlQoKGRlY2wgIT0gTlVMTCkgJiYgKGRlY2wtPmdldE9wKCkgPT0gRU9wRGVjbGFyYXRpb24pKTsKKyAgICBUSW50ZXJtU2VxdWVuY2UmIGRlY2xTZXEgPSBkZWNsLT5nZXRTZXF1ZW5jZSgpOworICAgIEFTU0VSVChkZWNsU2VxLnNpemUoKSA9PSAxKTsKKyAgICBUSW50ZXJtQmluYXJ5KiBkZWNsSW5pdCA9IGRlY2xTZXFbMF0tPmdldEFzQmluYXJ5Tm9kZSgpOworICAgIEFTU0VSVCgoZGVjbEluaXQgIT0gTlVMTCkgJiYgKGRlY2xJbml0LT5nZXRPcCgpID09IEVPcEluaXRpYWxpemUpKTsKKyAgICBUSW50ZXJtU3ltYm9sKiBzeW1ib2wgPSBkZWNsSW5pdC0+Z2V0TGVmdCgpLT5nZXRBc1N5bWJvbE5vZGUoKTsKKyAgICBBU1NFUlQoc3ltYm9sICE9IE5VTEwpOworICAgIEFTU0VSVChzeW1ib2wtPmdldEJhc2ljVHlwZSgpID09IEVidEludCk7CisKKyAgICBpbmZvLmlkID0gc3ltYm9sLT5nZXRJZCgpOworCisgICAgQVNTRVJUKGRlY2xJbml0LT5nZXRSaWdodCgpICE9IE5VTEwpOworICAgIFRJbnRlcm1Db25zdGFudFVuaW9uKiBpbml0Tm9kZSA9IGRlY2xJbml0LT5nZXRSaWdodCgpLT5nZXRBc0NvbnN0YW50VW5pb24oKTsKKyAgICBBU1NFUlQoaW5pdE5vZGUgIT0gTlVMTCk7CisKKyAgICBpbmZvLmluaXRWYWx1ZSA9IGV2YWx1YXRlSW50Q29uc3RhbnQoaW5pdE5vZGUpOworICAgIGluZm8uY3VycmVudFZhbHVlID0gaW5mby5pbml0VmFsdWU7CisKKyAgICBUSW50ZXJtTm9kZSogY29uZCA9IG5vZGUtPmdldENvbmRpdGlvbigpOworICAgIEFTU0VSVChjb25kICE9IE5VTEwpOworICAgIFRJbnRlcm1CaW5hcnkqIGJpbk9wID0gY29uZC0+Z2V0QXNCaW5hcnlOb2RlKCk7CisgICAgQVNTRVJUKGJpbk9wICE9IE5VTEwpOworICAgIEFTU0VSVChiaW5PcC0+Z2V0UmlnaHQoKSAhPSBOVUxMKTsKKyAgICBBU1NFUlQoYmluT3AtPmdldFJpZ2h0KCktPmdldEFzQ29uc3RhbnRVbmlvbigpICE9IE5VTEwpOworCisgICAgaW5mby5pbmNyZW1lbnRWYWx1ZSA9IGdldExvb3BJbmNyZW1lbnQobm9kZSk7CisgICAgaW5mby5zdG9wVmFsdWUgPSBldmFsdWF0ZUludENvbnN0YW50KAorICAgICAgICBiaW5PcC0+Z2V0UmlnaHQoKS0+Z2V0QXNDb25zdGFudFVuaW9uKCkpOworICAgIGluZm8ub3AgPSBiaW5PcC0+Z2V0T3AoKTsKK30KKwordm9pZCBGb3JMb29wVW5yb2xsOjpTdGVwKCkKK3sKKyAgICBBU1NFUlQobUxvb3BJbmRleFN0YWNrLnNpemUoKSA+IDApOworICAgIFRMb29wSW5kZXhJbmZvJiBpbmZvID0gbUxvb3BJbmRleFN0YWNrW21Mb29wSW5kZXhTdGFjay5zaXplKCkgLSAxXTsKKyAgICBpbmZvLmN1cnJlbnRWYWx1ZSArPSBpbmZvLmluY3JlbWVudFZhbHVlOworfQorCitib29sIEZvckxvb3BVbnJvbGw6OlNhdGlzZmllc0xvb3BDb25kaXRpb24oKQoreworICAgIEFTU0VSVChtTG9vcEluZGV4U3RhY2suc2l6ZSgpID4gMCk7CisgICAgVExvb3BJbmRleEluZm8mIGluZm8gPSBtTG9vcEluZGV4U3RhY2tbbUxvb3BJbmRleFN0YWNrLnNpemUoKSAtIDFdOworICAgIC8vIFJlbGF0aW9uYWwgb3BlcmF0b3IgaXMgb25lIG9mOiA+ID49IDwgPD0gPT0gb3IgIT0uCisgICAgc3dpdGNoIChpbmZvLm9wKSB7CisgICAgICBjYXNlIEVPcEVxdWFsOgorICAgICAgICByZXR1cm4gKGluZm8uY3VycmVudFZhbHVlID09IGluZm8uc3RvcFZhbHVlKTsKKyAgICAgIGNhc2UgRU9wTm90RXF1YWw6CisgICAgICAgIHJldHVybiAoaW5mby5jdXJyZW50VmFsdWUgIT0gaW5mby5zdG9wVmFsdWUpOworICAgICAgY2FzZSBFT3BMZXNzVGhhbjoKKyAgICAgICAgcmV0dXJuIChpbmZvLmN1cnJlbnRWYWx1ZSA8IGluZm8uc3RvcFZhbHVlKTsKKyAgICAgIGNhc2UgRU9wR3JlYXRlclRoYW46CisgICAgICAgIHJldHVybiAoaW5mby5jdXJyZW50VmFsdWUgPiBpbmZvLnN0b3BWYWx1ZSk7CisgICAgICBjYXNlIEVPcExlc3NUaGFuRXF1YWw6CisgICAgICAgIHJldHVybiAoaW5mby5jdXJyZW50VmFsdWUgPD0gaW5mby5zdG9wVmFsdWUpOworICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbkVxdWFsOgorICAgICAgICByZXR1cm4gKGluZm8uY3VycmVudFZhbHVlID49IGluZm8uc3RvcFZhbHVlKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBGb3JMb29wVW5yb2xsOjpOZWVkc1RvUmVwbGFjZVN5bWJvbFdpdGhWYWx1ZShUSW50ZXJtU3ltYm9sKiBzeW1ib2wpCit7CisgICAgZm9yIChUVmVjdG9yPFRMb29wSW5kZXhJbmZvPjo6aXRlcmF0b3IgaSA9IG1Mb29wSW5kZXhTdGFjay5iZWdpbigpOworICAgICAgICAgaSAhPSBtTG9vcEluZGV4U3RhY2suZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgICAgaWYgKGktPmlkID09IHN5bWJvbC0+Z2V0SWQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludCBGb3JMb29wVW5yb2xsOjpHZXRMb29wSW5kZXhWYWx1ZShUSW50ZXJtU3ltYm9sKiBzeW1ib2wpCit7CisgICAgZm9yIChUVmVjdG9yPFRMb29wSW5kZXhJbmZvPjo6aXRlcmF0b3IgaSA9IG1Mb29wSW5kZXhTdGFjay5iZWdpbigpOworICAgICAgICAgaSAhPSBtTG9vcEluZGV4U3RhY2suZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgICAgaWYgKGktPmlkID09IHN5bWJvbC0+Z2V0SWQoKSkKKyAgICAgICAgICAgIHJldHVybiBpLT5jdXJyZW50VmFsdWU7CisgICAgfQorICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEZvckxvb3BVbnJvbGw6OlB1c2goVExvb3BJbmRleEluZm8mIGluZm8pCit7CisgICAgbUxvb3BJbmRleFN0YWNrLnB1c2hfYmFjayhpbmZvKTsKK30KKwordm9pZCBGb3JMb29wVW5yb2xsOjpQb3AoKQoreworICAgIG1Mb29wSW5kZXhTdGFjay5wb3BfYmFjaygpOworfQorCitpbnQgRm9yTG9vcFVucm9sbDo6Z2V0TG9vcEluY3JlbWVudChUSW50ZXJtTG9vcCogbm9kZSkKK3sKKyAgICBUSW50ZXJtTm9kZSogZXhwciA9IG5vZGUtPmdldEV4cHJlc3Npb24oKTsKKyAgICBBU1NFUlQoZXhwciAhPSBOVUxMKTsKKyAgICAvLyBmb3IgZXhwcmVzc2lvbiBoYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6CisgICAgLy8gICAgIGxvb3BfaW5kZXgrKworICAgIC8vICAgICBsb29wX2luZGV4LS0KKyAgICAvLyAgICAgbG9vcF9pbmRleCArPSBjb25zdGFudF9leHByZXNzaW9uCisgICAgLy8gICAgIGxvb3BfaW5kZXggLT0gY29uc3RhbnRfZXhwcmVzc2lvbgorICAgIC8vICAgICArK2xvb3BfaW5kZXgKKyAgICAvLyAgICAgLS1sb29wX2luZGV4CisgICAgLy8gVGhlIGxhc3QgdHdvIGZvcm1zIGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSBzcGVjLCBidXQgSSBhbSBhc3N1bWluZworICAgIC8vIGl0cyBhbiBvdmVyc2lnaHQuCisgICAgVEludGVybVVuYXJ5KiB1bk9wID0gZXhwci0+Z2V0QXNVbmFyeU5vZGUoKTsKKyAgICBUSW50ZXJtQmluYXJ5KiBiaW5PcCA9IHVuT3AgPyBOVUxMIDogZXhwci0+Z2V0QXNCaW5hcnlOb2RlKCk7CisKKyAgICBUT3BlcmF0b3Igb3AgPSBFT3BOdWxsOworICAgIFRJbnRlcm1Db25zdGFudFVuaW9uKiBpbmNyZW1lbnROb2RlID0gTlVMTDsKKyAgICBpZiAodW5PcCAhPSBOVUxMKSB7CisgICAgICAgIG9wID0gdW5PcC0+Z2V0T3AoKTsKKyAgICB9IGVsc2UgaWYgKGJpbk9wICE9IE5VTEwpIHsKKyAgICAgICAgb3AgPSBiaW5PcC0+Z2V0T3AoKTsKKyAgICAgICAgQVNTRVJUKGJpbk9wLT5nZXRSaWdodCgpICE9IE5VTEwpOworICAgICAgICBpbmNyZW1lbnROb2RlID0gYmluT3AtPmdldFJpZ2h0KCktPmdldEFzQ29uc3RhbnRVbmlvbigpOworICAgICAgICBBU1NFUlQoaW5jcmVtZW50Tm9kZSAhPSBOVUxMKTsKKyAgICB9CisKKyAgICBpbnQgaW5jcmVtZW50ID0gMDsKKyAgICAvLyBUaGUgb3BlcmF0b3IgaXMgb25lIG9mOiArKyAtLSArPSAtPS4KKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgRU9wUG9zdEluY3JlbWVudDoKKyAgICAgICAgY2FzZSBFT3BQcmVJbmNyZW1lbnQ6CisgICAgICAgICAgICBBU1NFUlQoKHVuT3AgIT0gTlVMTCkgJiYgKGJpbk9wID09IE5VTEwpKTsKKyAgICAgICAgICAgIGluY3JlbWVudCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BQb3N0RGVjcmVtZW50OgorICAgICAgICBjYXNlIEVPcFByZURlY3JlbWVudDoKKyAgICAgICAgICAgIEFTU0VSVCgodW5PcCAhPSBOVUxMKSAmJiAoYmluT3AgPT0gTlVMTCkpOworICAgICAgICAgICAgaW5jcmVtZW50ID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BBZGRBc3NpZ246CisgICAgICAgICAgICBBU1NFUlQoKHVuT3AgPT0gTlVMTCkgJiYgKGJpbk9wICE9IE5VTEwpKTsKKyAgICAgICAgICAgIGluY3JlbWVudCA9IGV2YWx1YXRlSW50Q29uc3RhbnQoaW5jcmVtZW50Tm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BTdWJBc3NpZ246CisgICAgICAgICAgICBBU1NFUlQoKHVuT3AgPT0gTlVMTCkgJiYgKGJpbk9wICE9IE5VTEwpKTsKKyAgICAgICAgICAgIGluY3JlbWVudCA9IC0gZXZhbHVhdGVJbnRDb25zdGFudChpbmNyZW1lbnROb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW5jcmVtZW50OworfQorCitpbnQgRm9yTG9vcFVucm9sbDo6ZXZhbHVhdGVJbnRDb25zdGFudChUSW50ZXJtQ29uc3RhbnRVbmlvbiogbm9kZSkKK3sKKyAgICBBU1NFUlQoKG5vZGUgIT0gTlVMTCkgJiYgKG5vZGUtPmdldFVuaW9uQXJyYXlQb2ludGVyKCkgIT0gTlVMTCkpOworICAgIHJldHVybiBub2RlLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRJQ29uc3QoKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvRm9yTG9vcFVucm9sbC5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvRm9yTG9vcFVucm9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjJiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Gb3JMb29wVW5yb2xsLmgKQEAgLTAsMCArMSw0NiBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9pbnRlcm1lZGlhdGUuaCIKKworc3RydWN0IFRMb29wSW5kZXhJbmZvIHsKKyAgICBpbnQgaWQ7CisgICAgaW50IGluaXRWYWx1ZTsKKyAgICBpbnQgc3RvcFZhbHVlOworICAgIGludCBpbmNyZW1lbnRWYWx1ZTsKKyAgICBUT3BlcmF0b3Igb3A7CisgICAgaW50IGN1cnJlbnRWYWx1ZTsKK307CisKK2NsYXNzIEZvckxvb3BVbnJvbGwgeworcHVibGljOgorICAgIEZvckxvb3BVbnJvbGwoKSB7IH0KKworICAgIHZvaWQgRmlsbExvb3BJbmRleEluZm8oVEludGVybUxvb3AqIG5vZGUsIFRMb29wSW5kZXhJbmZvJiBpbmZvKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgaW5mby5jdXJyZW50VmFsdWUgZm9yIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uLgorICAgIHZvaWQgU3RlcCgpOworCisgICAgLy8gUmV0dXJuIGZhbHNlIGlmIGxvb3AgY29uZGl0aW9uIGlzIG5vIGxvbmdlciBzYXRpc2ZpZWQuCisgICAgYm9vbCBTYXRpc2ZpZXNMb29wQ29uZGl0aW9uKCk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgc3ltYm9sIGlzIHRoZSBpbmRleCBvZiBhIGxvb3AgdGhhdCdzIHVucm9sbGVkLgorICAgIGJvb2wgTmVlZHNUb1JlcGxhY2VTeW1ib2xXaXRoVmFsdWUoVEludGVybVN5bWJvbCogc3ltYm9sKTsKKworICAgIC8vIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIGdpdmVuIGxvb3AgaW5kZXggc3ltYm9sLgorICAgIGludCBHZXRMb29wSW5kZXhWYWx1ZShUSW50ZXJtU3ltYm9sKiBzeW1ib2wpOworCisgICAgdm9pZCBQdXNoKFRMb29wSW5kZXhJbmZvJiBpbmZvKTsKKyAgICB2b2lkIFBvcCgpOworCitwcml2YXRlOgorICAgIGludCBnZXRMb29wSW5jcmVtZW50KFRJbnRlcm1Mb29wKiBub2RlKTsKKworICAgIGludCBldmFsdWF0ZUludENvbnN0YW50KFRJbnRlcm1Db25zdGFudFVuaW9uKiBub2RlKTsKKworICAgIFRWZWN0b3I8VExvb3BJbmRleEluZm8+IG1Mb29wSW5kZXhTdGFjazsKK307CisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luZm9TaW5rLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luZm9TaW5rLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTMyZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW5mb1NpbmsuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9JbmZvU2luay5oIgorCit2b2lkIFRJbmZvU2lua0Jhc2U6OnByZWZpeChUUHJlZml4VHlwZSBtZXNzYWdlKSB7CisgICAgc3dpdGNoKG1lc3NhZ2UpIHsKKyAgICAgICAgY2FzZSBFUHJlZml4Tm9uZToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVQcmVmaXhXYXJuaW5nOgorICAgICAgICAgICAgc2luay5hcHBlbmQoIldBUk5JTkc6ICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVByZWZpeEVycm9yOgorICAgICAgICAgICAgc2luay5hcHBlbmQoIkVSUk9SOiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVQcmVmaXhJbnRlcm5hbEVycm9yOgorICAgICAgICAgICAgc2luay5hcHBlbmQoIklOVEVSTkFMIEVSUk9SOiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVQcmVmaXhVbmltcGxlbWVudGVkOgorICAgICAgICAgICAgc2luay5hcHBlbmQoIlVOSU1QTEVNRU5URUQ6ICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVByZWZpeE5vdGU6CisgICAgICAgICAgICBzaW5rLmFwcGVuZCgiTk9URTogIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNpbmsuYXBwZW5kKCJVTktPV04gRVJST1I6ICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFRJbmZvU2lua0Jhc2U6OmxvY2F0aW9uKFRTb3VyY2VMb2MgbG9jKSB7CisgICAgaW50IHN0cmluZyA9IDAsIGxpbmUgPSAwOworICAgIERlY29kZVNvdXJjZUxvYyhsb2MsICZzdHJpbmcsICZsaW5lKTsKKworICAgIFRQZXJzaXN0U3RyaW5nU3RyZWFtIHN0cmVhbTsKKyAgICBpZiAobGluZSkKKyAgICAgICAgc3RyZWFtIDw8IHN0cmluZyA8PCAiOiIgPDwgbGluZTsKKyAgICBlbHNlCisgICAgICAgIHN0cmVhbSA8PCBzdHJpbmcgPDwgIjo/ICI7CisgICAgc3RyZWFtIDw8ICI6ICI7CisKKyAgICBzaW5rLmFwcGVuZChzdHJlYW0uc3RyKCkpOworfQorCit2b2lkIFRJbmZvU2lua0Jhc2U6Om1lc3NhZ2UoVFByZWZpeFR5cGUgbWVzc2FnZSwgY29uc3QgY2hhciogcykgeworICAgIHByZWZpeChtZXNzYWdlKTsKKyAgICBzaW5rLmFwcGVuZChzKTsKKyAgICBzaW5rLmFwcGVuZCgiXG4iKTsKK30KKwordm9pZCBUSW5mb1NpbmtCYXNlOjptZXNzYWdlKFRQcmVmaXhUeXBlIG1lc3NhZ2UsIGNvbnN0IGNoYXIqIHMsIFRTb3VyY2VMb2MgbG9jKSB7CisgICAgcHJlZml4KG1lc3NhZ2UpOworICAgIGxvY2F0aW9uKGxvYyk7CisgICAgc2luay5hcHBlbmQocyk7CisgICAgc2luay5hcHBlbmQoIlxuIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9JbmZvU2luay5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW5mb1NpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIyNGU5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9JbmZvU2luay5oCkBAIC0wLDAgKzEsMTE1IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaWZuZGVmIF9JTkZPU0lOS19JTkNMVURFRF8KKyNkZWZpbmUgX0lORk9TSU5LX0lOQ0xVREVEXworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImNvbXBpbGVyL0NvbW1vbi5oIgorCisvLyBSZXR1cm5zIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIGdpdmVuIGZsb2F0aW5nLXBvaW50IG51bWJlci4KK2lubGluZSBmbG9hdCBmcmFjdGlvbmFsUGFydChmbG9hdCBmKSB7CisgIGZsb2F0IGludFBhcnQgPSAwLjBmOworICByZXR1cm4gbW9kZmYoZiwgJmludFBhcnQpOworfQorCisvLworLy8gVFByZWZpeFR5cGUgaXMgdXNlZCB0byBjZW50cmFsaXplIGhvdyBpbmZvIGxvZyBtZXNzYWdlcyBzdGFydC4KKy8vIFNlZSBiZWxvdy4KKy8vCitlbnVtIFRQcmVmaXhUeXBlIHsKKyAgICBFUHJlZml4Tm9uZSwKKyAgICBFUHJlZml4V2FybmluZywKKyAgICBFUHJlZml4RXJyb3IsCisgICAgRVByZWZpeEludGVybmFsRXJyb3IsCisgICAgRVByZWZpeFVuaW1wbGVtZW50ZWQsCisgICAgRVByZWZpeE5vdGUKK307CisKKy8vCisvLyBFbmNhcHN1bGF0ZSBpbmZvIGxvZ3MgZm9yIGFsbCBvYmplY3RzIHRoYXQgaGF2ZSB0aGVtLgorLy8KKy8vIFRoZSBtZXRob2RzIGFyZSBhIGdlbmVyYWwgc2V0IG9mIHRvb2xzIGZvciBnZXR0aW5nIGEgdmFyaWV0eSBvZgorLy8gbWVzc2FnZXMgYW5kIHR5cGVzIGluc2VydGVkIGludG8gdGhlIGxvZy4KKy8vCitjbGFzcyBUSW5mb1NpbmtCYXNlIHsKK3B1YmxpYzoKKyAgICBUSW5mb1NpbmtCYXNlKCkge30KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIFRJbmZvU2lua0Jhc2UmIG9wZXJhdG9yPDwoY29uc3QgVCYgdCkgeworICAgICAgICBUUGVyc2lzdFN0cmluZ1N0cmVhbSBzdHJlYW07CisgICAgICAgIHN0cmVhbSA8PCB0OworICAgICAgICBzaW5rLmFwcGVuZChzdHJlYW0uc3RyKCkpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIC8vIE92ZXJyaWRlIDw8IG9wZXJhdG9yIGZvciBzcGVjaWZpYyB0eXBlcy4gSXQgaXMgZmFzdGVyIHRvIGFwcGVuZCBzdHJpbmdzCisgICAgLy8gYW5kIGNoYXJhY3RlcnMgZGlyZWN0bHkgdG8gdGhlIHNpbmsuCisgICAgVEluZm9TaW5rQmFzZSYgb3BlcmF0b3I8PChjaGFyIGMpIHsKKyAgICAgICAgc2luay5hcHBlbmQoMSwgYyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgVEluZm9TaW5rQmFzZSYgb3BlcmF0b3I8PChjb25zdCBjaGFyKiBzdHIpIHsKKyAgICAgICAgc2luay5hcHBlbmQoc3RyKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBUSW5mb1NpbmtCYXNlJiBvcGVyYXRvcjw8KGNvbnN0IFRQZXJzaXN0U3RyaW5nJiBzdHIpIHsKKyAgICAgICAgc2luay5hcHBlbmQoc3RyKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBUSW5mb1NpbmtCYXNlJiBvcGVyYXRvcjw8KGNvbnN0IFRTdHJpbmcmIHN0cikgeworICAgICAgICBzaW5rLmFwcGVuZChzdHIuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgLy8gTWFrZSBzdXJlIGZsb2F0cyBhcmUgd3JpdHRlbiB3aXRoIGNvcnJlY3QgcHJlY2lzaW9uLgorICAgIFRJbmZvU2lua0Jhc2UmIG9wZXJhdG9yPDwoZmxvYXQgZikgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgZGVjaW1hbCBwb2ludCBpcyB3cml0dGVuLiBJZiBhIG51bWJlcgorICAgICAgICAvLyBkb2VzIG5vdCBoYXZlIGEgZnJhY3Rpb25hbCBwYXJ0LCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gZm9ybWF0IGRvZXMKKyAgICAgICAgLy8gbm90IHdyaXRlIHRoZSBkZWNpbWFsIHBvcnRpb24gd2hpY2ggZ2V0cyBpbnRlcnByZXRlZCBhcyBpbnRlZ2VyIGJ5CisgICAgICAgIC8vIHRoZSBjb21waWxlci4KKyAgICAgICAgVFBlcnNpc3RTdHJpbmdTdHJlYW0gc3RyZWFtOworICAgICAgICBpZiAoZnJhY3Rpb25hbFBhcnQoZikgPT0gMC4wZikgeworICAgICAgICAgICAgc3RyZWFtLnByZWNpc2lvbigxKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OnNob3dwb2ludCA8PCBzdGQ6OmZpeGVkIDw8IGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJlYW0udW5zZXRmKHN0ZDo6aW9zOjpmaXhlZCk7CisgICAgICAgICAgICBzdHJlYW0udW5zZXRmKHN0ZDo6aW9zOjpzY2llbnRpZmljKTsKKyAgICAgICAgICAgIHN0cmVhbS5wcmVjaXNpb24oOCk7CisgICAgICAgICAgICBzdHJlYW0gPDwgZjsKKyAgICAgICAgfQorICAgICAgICBzaW5rLmFwcGVuZChzdHJlYW0uc3RyKCkpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIC8vIFdyaXRlIGJvb2xlYW4gdmFsdWVzIGFzIHRoZWlyIG5hbWVzIGluc3RlYWQgb2YgaW50ZWdyYWwgdmFsdWUuCisgICAgVEluZm9TaW5rQmFzZSYgb3BlcmF0b3I8PChib29sIGIpIHsKKyAgICAgICAgY29uc3QgY2hhciogc3RyID0gYiA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgICAgIHNpbmsuYXBwZW5kKHN0cik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkIGVyYXNlKCkgeyBzaW5rLmNsZWFyKCk7IH0KKyAgICBpbnQgc2l6ZSgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oc2luay5zaXplKCkpOyB9CisKKyAgICBjb25zdCBUUGVyc2lzdFN0cmluZyYgc3RyKCkgY29uc3QgeyByZXR1cm4gc2luazsgfQorICAgIGNvbnN0IGNoYXIqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gc2luay5jX3N0cigpOyB9CisKKyAgICB2b2lkIHByZWZpeChUUHJlZml4VHlwZSBtZXNzYWdlKTsKKyAgICB2b2lkIGxvY2F0aW9uKFRTb3VyY2VMb2MgbG9jKTsKKyAgICB2b2lkIG1lc3NhZ2UoVFByZWZpeFR5cGUgbWVzc2FnZSwgY29uc3QgY2hhciogcyk7CisgICAgdm9pZCBtZXNzYWdlKFRQcmVmaXhUeXBlIG1lc3NhZ2UsIGNvbnN0IGNoYXIqIHMsIFRTb3VyY2VMb2MgbG9jKTsKKworcHJpdmF0ZToKKyAgICBUUGVyc2lzdFN0cmluZyBzaW5rOworfTsKKworY2xhc3MgVEluZm9TaW5rIHsKK3B1YmxpYzoKKyAgICBUSW5mb1NpbmtCYXNlIGluZm87CisgICAgVEluZm9TaW5rQmFzZSBkZWJ1ZzsKKyAgICBUSW5mb1NpbmtCYXNlIG9iajsKK307CisKKyNlbmRpZiAvLyBfSU5GT1NJTktfSU5DTFVERURfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Jbml0aWFsaXplLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luaXRpYWxpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTJkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Jbml0aWFsaXplLmNwcApAQCAtMCwwICsxLDYyOSBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8KKy8vIENyZWF0ZSBzdHJpbmdzIHRoYXQgZGVjbGFyZSBidWlsdC1pbiBkZWZpbml0aW9ucywgYWRkIGJ1aWx0LWlucyB0aGF0CisvLyBjYW5ub3QgYmUgZXhwcmVzc2VkIGluIHRoZSBmaWxlcywgYW5kIGVzdGFibGlzaCBtYXBwaW5ncyBiZXR3ZWVuIAorLy8gYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBvcGVyYXRvcnMuCisvLworCisjaW5jbHVkZSAiY29tcGlsZXIvSW5pdGlhbGl6ZS5oIgorCisjaW5jbHVkZSAiY29tcGlsZXIvaW50ZXJtZWRpYXRlLmgiCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFByb3RvdHlwZXMgZm9yIGJ1aWx0LWluIGZ1bmN0aW9ucyBzZWVuIGJ5IGJvdGggdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzLgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorc3RhdGljIFRTdHJpbmcgQnVpbHRJbkZ1bmN0aW9uc0NvbW1vbigpCit7CisgICAgVFN0cmluZyBzOworCisgICAgLy8KKyAgICAvLyBBbmdsZSBhbmQgVHJpZ29ub21ldHJpYyBGdW5jdGlvbnMuCisgICAgLy8KKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCByYWRpYW5zKGZsb2F0IGRlZ3JlZXMpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICByYWRpYW5zKHZlYzIgIGRlZ3JlZXMpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICByYWRpYW5zKHZlYzMgIGRlZ3JlZXMpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICByYWRpYW5zKHZlYzQgIGRlZ3JlZXMpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGRlZ3JlZXMoZmxvYXQgcmFkaWFucyk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIGRlZ3JlZXModmVjMiAgcmFkaWFucyk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIGRlZ3JlZXModmVjMyAgcmFkaWFucyk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIGRlZ3JlZXModmVjNCAgcmFkaWFucyk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgc2luKGZsb2F0IGFuZ2xlKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgc2luKHZlYzIgIGFuZ2xlKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgc2luKHZlYzMgIGFuZ2xlKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgc2luKHZlYzQgIGFuZ2xlKTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBjb3MoZmxvYXQgYW5nbGUpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICBjb3ModmVjMiAgYW5nbGUpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBjb3ModmVjMyAgYW5nbGUpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBjb3ModmVjNCAgYW5nbGUpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IHRhbihmbG9hdCBhbmdsZSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIHRhbih2ZWMyICBhbmdsZSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIHRhbih2ZWMzICBhbmdsZSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIHRhbih2ZWM0ICBhbmdsZSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgYXNpbihmbG9hdCB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgYXNpbih2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgYXNpbih2ZWMzICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgYXNpbih2ZWM0ICB4KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBhY29zKGZsb2F0IHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICBhY29zKHZlYzIgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBhY29zKHZlYzMgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBhY29zKHZlYzQgIHgpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGF0YW4oZmxvYXQgeSwgZmxvYXQgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIGF0YW4odmVjMiAgeSwgdmVjMiAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIGF0YW4odmVjMyAgeSwgdmVjMyAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIGF0YW4odmVjNCAgeSwgdmVjNCAgeCk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgYXRhbihmbG9hdCB5X292ZXJfeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIGF0YW4odmVjMiAgeV9vdmVyX3gpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBhdGFuKHZlYzMgIHlfb3Zlcl94KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgYXRhbih2ZWM0ICB5X292ZXJfeCk7IikpOworCisgICAgLy8KKyAgICAvLyBFeHBvbmVudGlhbCBGdW5jdGlvbnMuCisgICAgLy8KKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBwb3coZmxvYXQgeCwgZmxvYXQgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIHBvdyh2ZWMyICB4LCB2ZWMyICB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgcG93KHZlYzMgIHgsIHZlYzMgIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBwb3codmVjNCAgeCwgdmVjNCAgeSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgZXhwKGZsb2F0IHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICBleHAodmVjMiAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIGV4cCh2ZWMzICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgZXhwKHZlYzQgIHgpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGxvZyhmbG9hdCB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgbG9nKHZlYzIgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBsb2codmVjMyAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIGxvZyh2ZWM0ICB4KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBleHAyKGZsb2F0IHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICBleHAyKHZlYzIgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBleHAyKHZlYzMgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBleHAyKHZlYzQgIHgpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGxvZzIoZmxvYXQgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIGxvZzIodmVjMiAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIGxvZzIodmVjMyAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIGxvZzIodmVjNCAgeCk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgc3FydChmbG9hdCB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgc3FydCh2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgc3FydCh2ZWMzICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgc3FydCh2ZWM0ICB4KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBpbnZlcnNlc3FydChmbG9hdCB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgaW52ZXJzZXNxcnQodmVjMiAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIGludmVyc2VzcXJ0KHZlYzMgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBpbnZlcnNlc3FydCh2ZWM0ICB4KTsiKSk7CisKKyAgICAvLworICAgIC8vIENvbW1vbiBGdW5jdGlvbnMuCisgICAgLy8KKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBhYnMoZmxvYXQgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIGFicyh2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgYWJzKHZlYzMgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBhYnModmVjNCAgeCk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgc2lnbihmbG9hdCB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgc2lnbih2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgc2lnbih2ZWMzICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgc2lnbih2ZWM0ICB4KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBmbG9vcihmbG9hdCB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgZmxvb3IodmVjMiAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIGZsb29yKHZlYzMgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBmbG9vcih2ZWM0ICB4KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBjZWlsKGZsb2F0IHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICBjZWlsKHZlYzIgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBjZWlsKHZlYzMgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBjZWlsKHZlYzQgIHgpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGZyYWN0KGZsb2F0IHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICBmcmFjdCh2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgZnJhY3QodmVjMyAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIGZyYWN0KHZlYzQgIHgpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IG1vZChmbG9hdCB4LCBmbG9hdCB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgbW9kKHZlYzIgIHgsIGZsb2F0IHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBtb2QodmVjMyAgeCwgZmxvYXQgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIG1vZCh2ZWM0ICB4LCBmbG9hdCB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgbW9kKHZlYzIgIHgsIHZlYzIgIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBtb2QodmVjMyAgeCwgdmVjMyAgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIG1vZCh2ZWM0ICB4LCB2ZWM0ICB5KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBtaW4oZmxvYXQgeCwgZmxvYXQgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIG1pbih2ZWMyICB4LCBmbG9hdCB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgbWluKHZlYzMgIHgsIGZsb2F0IHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBtaW4odmVjNCAgeCwgZmxvYXQgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIG1pbih2ZWMyICB4LCB2ZWMyICB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgbWluKHZlYzMgIHgsIHZlYzMgIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBtaW4odmVjNCAgeCwgdmVjNCAgeSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgbWF4KGZsb2F0IHgsIGZsb2F0IHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICBtYXgodmVjMiAgeCwgZmxvYXQgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIG1heCh2ZWMzICB4LCBmbG9hdCB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgbWF4KHZlYzQgIHgsIGZsb2F0IHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICBtYXgodmVjMiAgeCwgdmVjMiAgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIG1heCh2ZWMzICB4LCB2ZWMzICB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgbWF4KHZlYzQgIHgsIHZlYzQgIHkpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGNsYW1wKGZsb2F0IHgsIGZsb2F0IG1pblZhbCwgZmxvYXQgbWF4VmFsKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgY2xhbXAodmVjMiAgeCwgZmxvYXQgbWluVmFsLCBmbG9hdCBtYXhWYWwpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBjbGFtcCh2ZWMzICB4LCBmbG9hdCBtaW5WYWwsIGZsb2F0IG1heFZhbCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIGNsYW1wKHZlYzQgIHgsIGZsb2F0IG1pblZhbCwgZmxvYXQgbWF4VmFsKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgY2xhbXAodmVjMiAgeCwgdmVjMiAgbWluVmFsLCB2ZWMyICBtYXhWYWwpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBjbGFtcCh2ZWMzICB4LCB2ZWMzICBtaW5WYWwsIHZlYzMgIG1heFZhbCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgIGNsYW1wKHZlYzQgIHgsIHZlYzQgIG1pblZhbCwgdmVjNCAgbWF4VmFsKTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBtaXgoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgYSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIG1peCh2ZWMyICB4LCB2ZWMyICB5LCBmbG9hdCBhKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgbWl4KHZlYzMgIHgsIHZlYzMgIHksIGZsb2F0IGEpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBtaXgodmVjNCAgeCwgdmVjNCAgeSwgZmxvYXQgYSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIG1peCh2ZWMyICB4LCB2ZWMyICB5LCB2ZWMyICBhKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgbWl4KHZlYzMgIHgsIHZlYzMgIHksIHZlYzMgIGEpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBtaXgodmVjNCAgeCwgdmVjNCAgeSwgdmVjNCAgYSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgc3RlcChmbG9hdCBlZGdlLCBmbG9hdCB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgc3RlcCh2ZWMyICBlZGdlLCB2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgc3RlcCh2ZWMzICBlZGdlLCB2ZWMzICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgc3RlcCh2ZWM0ICBlZGdlLCB2ZWM0ICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgc3RlcChmbG9hdCBlZGdlLCB2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgc3RlcChmbG9hdCBlZGdlLCB2ZWMzICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgc3RlcChmbG9hdCBlZGdlLCB2ZWM0ICB4KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBzbW9vdGhzdGVwKGZsb2F0IGVkZ2UwLCBmbG9hdCBlZGdlMSwgZmxvYXQgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIHNtb290aHN0ZXAodmVjMiAgZWRnZTAsIHZlYzIgIGVkZ2UxLCB2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgc21vb3Roc3RlcCh2ZWMzICBlZGdlMCwgdmVjMyAgZWRnZTEsIHZlYzMgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBzbW9vdGhzdGVwKHZlYzQgIGVkZ2UwLCB2ZWM0ICBlZGdlMSwgdmVjNCAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIHNtb290aHN0ZXAoZmxvYXQgZWRnZTAsIGZsb2F0IGVkZ2UxLCB2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgc21vb3Roc3RlcChmbG9hdCBlZGdlMCwgZmxvYXQgZWRnZTEsIHZlYzMgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBzbW9vdGhzdGVwKGZsb2F0IGVkZ2UwLCBmbG9hdCBlZGdlMSwgdmVjNCAgeCk7IikpOworCisgICAgLy8KKyAgICAvLyBHZW9tZXRyaWMgRnVuY3Rpb25zLgorICAgIC8vCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgbGVuZ3RoKGZsb2F0IHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBsZW5ndGgodmVjMiAgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGxlbmd0aCh2ZWMzICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgbGVuZ3RoKHZlYzQgIHgpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGRpc3RhbmNlKGZsb2F0IHAwLCBmbG9hdCBwMSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGRpc3RhbmNlKHZlYzIgIHAwLCB2ZWMyICBwMSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGRpc3RhbmNlKHZlYzMgIHAwLCB2ZWMzICBwMSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGRpc3RhbmNlKHZlYzQgIHAwLCB2ZWM0ICBwMSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgZG90KGZsb2F0IHgsIGZsb2F0IHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBkb3QodmVjMiAgeCwgdmVjMiAgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImZsb2F0IGRvdCh2ZWMzICB4LCB2ZWMzICB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgZG90KHZlYzQgIHgsIHZlYzQgIHkpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgY3Jvc3ModmVjMyB4LCB2ZWMzIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBub3JtYWxpemUoZmxvYXQgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIG5vcm1hbGl6ZSh2ZWMyICB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgbm9ybWFsaXplKHZlYzMgIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBub3JtYWxpemUodmVjNCAgeCk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgZmFjZWZvcndhcmQoZmxvYXQgTiwgZmxvYXQgSSwgZmxvYXQgTnJlZik7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIGZhY2Vmb3J3YXJkKHZlYzIgIE4sIHZlYzIgIEksIHZlYzIgIE5yZWYpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBmYWNlZm9yd2FyZCh2ZWMzICBOLCB2ZWMzICBJLCB2ZWMzICBOcmVmKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgZmFjZWZvcndhcmQodmVjNCAgTiwgdmVjNCAgSSwgdmVjNCAgTnJlZik7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgcmVmbGVjdChmbG9hdCBJLCBmbG9hdCBOKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgcmVmbGVjdCh2ZWMyICBJLCB2ZWMyICBOKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgcmVmbGVjdCh2ZWMzICBJLCB2ZWMzICBOKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCAgcmVmbGVjdCh2ZWM0ICBJLCB2ZWM0ICBOKTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCByZWZyYWN0KGZsb2F0IEksIGZsb2F0IE4sIGZsb2F0IGV0YSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzIgIHJlZnJhY3QodmVjMiAgSSwgdmVjMiAgTiwgZmxvYXQgZXRhKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMyAgcmVmcmFjdCh2ZWMzICBJLCB2ZWMzICBOLCBmbG9hdCBldGEpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICByZWZyYWN0KHZlYzQgIEksIHZlYzQgIE4sIGZsb2F0IGV0YSk7IikpOworCisgICAgLy8KKyAgICAvLyBNYXRyaXggRnVuY3Rpb25zLgorICAgIC8vCisgICAgcy5hcHBlbmQoVFN0cmluZygibWF0MiBtYXRyaXhDb21wTXVsdChtYXQyIHgsIG1hdDIgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoIm1hdDMgbWF0cml4Q29tcE11bHQobWF0MyB4LCBtYXQzIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJtYXQ0IG1hdHJpeENvbXBNdWx0KG1hdDQgeCwgbWF0NCB5KTsiKSk7CisKKyAgICAvLworICAgIC8vIFZlY3RvciByZWxhdGlvbmFsIGZ1bmN0aW9ucy4KKyAgICAvLworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMyIGxlc3NUaGFuKHZlYzIgeCwgdmVjMiB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzMgbGVzc1RoYW4odmVjMyB4LCB2ZWMzIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjNCBsZXNzVGhhbih2ZWM0IHgsIHZlYzQgeSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzIgbGVzc1RoYW4oaXZlYzIgeCwgaXZlYzIgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMzIGxlc3NUaGFuKGl2ZWMzIHgsIGl2ZWMzIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjNCBsZXNzVGhhbihpdmVjNCB4LCBpdmVjNCB5KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjMiBsZXNzVGhhbkVxdWFsKHZlYzIgeCwgdmVjMiB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzMgbGVzc1RoYW5FcXVhbCh2ZWMzIHgsIHZlYzMgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWM0IGxlc3NUaGFuRXF1YWwodmVjNCB4LCB2ZWM0IHkpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMyIGxlc3NUaGFuRXF1YWwoaXZlYzIgeCwgaXZlYzIgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMzIGxlc3NUaGFuRXF1YWwoaXZlYzMgeCwgaXZlYzMgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWM0IGxlc3NUaGFuRXF1YWwoaXZlYzQgeCwgaXZlYzQgeSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzIgZ3JlYXRlclRoYW4odmVjMiB4LCB2ZWMyIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjMyBncmVhdGVyVGhhbih2ZWMzIHgsIHZlYzMgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWM0IGdyZWF0ZXJUaGFuKHZlYzQgeCwgdmVjNCB5KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjMiBncmVhdGVyVGhhbihpdmVjMiB4LCBpdmVjMiB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzMgZ3JlYXRlclRoYW4oaXZlYzMgeCwgaXZlYzMgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWM0IGdyZWF0ZXJUaGFuKGl2ZWM0IHgsIGl2ZWM0IHkpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMyIGdyZWF0ZXJUaGFuRXF1YWwodmVjMiB4LCB2ZWMyIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjMyBncmVhdGVyVGhhbkVxdWFsKHZlYzMgeCwgdmVjMyB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzQgZ3JlYXRlclRoYW5FcXVhbCh2ZWM0IHgsIHZlYzQgeSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzIgZ3JlYXRlclRoYW5FcXVhbChpdmVjMiB4LCBpdmVjMiB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzMgZ3JlYXRlclRoYW5FcXVhbChpdmVjMyB4LCBpdmVjMyB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzQgZ3JlYXRlclRoYW5FcXVhbChpdmVjNCB4LCBpdmVjNCB5KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjMiBlcXVhbCh2ZWMyIHgsIHZlYzIgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMzIGVxdWFsKHZlYzMgeCwgdmVjMyB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzQgZXF1YWwodmVjNCB4LCB2ZWM0IHkpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMyIGVxdWFsKGl2ZWMyIHgsIGl2ZWMyIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjMyBlcXVhbChpdmVjMyB4LCBpdmVjMyB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzQgZXF1YWwoaXZlYzQgeCwgaXZlYzQgeSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzIgZXF1YWwoYnZlYzIgeCwgYnZlYzIgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMzIGVxdWFsKGJ2ZWMzIHgsIGJ2ZWMzIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjNCBlcXVhbChidmVjNCB4LCBidmVjNCB5KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjMiBub3RFcXVhbCh2ZWMyIHgsIHZlYzIgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMzIG5vdEVxdWFsKHZlYzMgeCwgdmVjMyB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzQgbm90RXF1YWwodmVjNCB4LCB2ZWM0IHkpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMyIG5vdEVxdWFsKGl2ZWMyIHgsIGl2ZWMyIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjMyBub3RFcXVhbChpdmVjMyB4LCBpdmVjMyB5KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzQgbm90RXF1YWwoaXZlYzQgeCwgaXZlYzQgeSk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzIgbm90RXF1YWwoYnZlYzIgeCwgYnZlYzIgeSk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWMzIG5vdEVxdWFsKGJ2ZWMzIHgsIGJ2ZWMzIHkpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjNCBub3RFcXVhbChidmVjNCB4LCBidmVjNCB5KTsiKSk7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJib29sIGFueShidmVjMiB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYm9vbCBhbnkoYnZlYzMgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJvb2wgYW55KGJ2ZWM0IHgpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJvb2wgYWxsKGJ2ZWMyIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJib29sIGFsbChidmVjMyB4KTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygiYm9vbCBhbGwoYnZlYzQgeCk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygiYnZlYzIgbm90KGJ2ZWMyIHgpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJidmVjMyBub3QoYnZlYzMgeCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoImJ2ZWM0IG5vdChidmVjNCB4KTsiKSk7CisKKyAgICAvLworICAgIC8vIE5vaXNlIGZ1bmN0aW9ucy4KKyAgICAvLworICAgIC8vcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgbm9pc2UxKGZsb2F0IHgpOyIpKTsKKyAgICAvL3MuYXBwZW5kKFRTdHJpbmcoImZsb2F0IG5vaXNlMSh2ZWMyICB4KTsiKSk7CisgICAgLy9zLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBub2lzZTEodmVjMyAgeCk7IikpOworICAgIC8vcy5hcHBlbmQoVFN0cmluZygiZmxvYXQgbm9pc2UxKHZlYzQgIHgpOyIpKTsKKworICAgIC8vcy5hcHBlbmQoVFN0cmluZygidmVjMiBub2lzZTIoZmxvYXQgeCk7IikpOworICAgIC8vcy5hcHBlbmQoVFN0cmluZygidmVjMiBub2lzZTIodmVjMiAgeCk7IikpOworICAgIC8vcy5hcHBlbmQoVFN0cmluZygidmVjMiBub2lzZTIodmVjMyAgeCk7IikpOworICAgIC8vcy5hcHBlbmQoVFN0cmluZygidmVjMiBub2lzZTIodmVjNCAgeCk7IikpOworCisgICAgLy9zLmFwcGVuZChUU3RyaW5nKCJ2ZWMzIG5vaXNlMyhmbG9hdCB4KTsiKSk7CisgICAgLy9zLmFwcGVuZChUU3RyaW5nKCJ2ZWMzIG5vaXNlMyh2ZWMyICB4KTsiKSk7CisgICAgLy9zLmFwcGVuZChUU3RyaW5nKCJ2ZWMzIG5vaXNlMyh2ZWMzICB4KTsiKSk7CisgICAgLy9zLmFwcGVuZChUU3RyaW5nKCJ2ZWMzIG5vaXNlMyh2ZWM0ICB4KTsiKSk7CisKKyAgICAvL3MuYXBwZW5kKFRTdHJpbmcoInZlYzQgbm9pc2U0KGZsb2F0IHgpOyIpKTsKKyAgICAvL3MuYXBwZW5kKFRTdHJpbmcoInZlYzQgbm9pc2U0KHZlYzIgIHgpOyIpKTsKKyAgICAvL3MuYXBwZW5kKFRTdHJpbmcoInZlYzQgbm9pc2U0KHZlYzMgIHgpOyIpKTsKKyAgICAvL3MuYXBwZW5kKFRTdHJpbmcoInZlYzQgbm9pc2U0KHZlYzQgIHgpOyIpKTsKKworICAgIHJldHVybiBzOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBQcm90b3R5cGVzIGZvciBidWlsdC1pbiBmdW5jdGlvbnMgc2VlbiBieSB2ZXJ0ZXggc2hhZGVycyBvbmx5LgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorc3RhdGljIFRTdHJpbmcgQnVpbHRJbkZ1bmN0aW9uc1ZlcnRleChjb25zdCBTaEJ1aWx0SW5SZXNvdXJjZXMmIHJlc291cmNlcykKK3sKKyAgICBUU3RyaW5nIHM7CisKKyAgICAvLworICAgIC8vIEdlb21ldHJpYyBGdW5jdGlvbnMuCisgICAgLy8KKyAgICAvL3MuYXBwZW5kKFRTdHJpbmcoInZlYzQgZnRyYW5zZm9ybSgpOyIpKTsKKworICAgIC8vCisgICAgLy8gVGV4dHVyZSBGdW5jdGlvbnMuCisgICAgLy8KKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0IHRleHR1cmUyRChzYW1wbGVyMkQgc2FtcGxlciwgdmVjMiBjb29yZCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgdGV4dHVyZTJEUHJvaihzYW1wbGVyMkQgc2FtcGxlciwgdmVjMyBjb29yZCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgdGV4dHVyZTJEUHJvaihzYW1wbGVyMkQgc2FtcGxlciwgdmVjNCBjb29yZCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgdGV4dHVyZUN1YmUoc2FtcGxlckN1YmUgc2FtcGxlciwgdmVjMyBjb29yZCk7IikpOworCisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCB0ZXh0dXJlMkRMb2Qoc2FtcGxlcjJEIHNhbXBsZXIsIHZlYzIgY29vcmQsIGZsb2F0IGxvZCk7IikpOworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgdGV4dHVyZTJEUHJvakxvZChzYW1wbGVyMkQgc2FtcGxlciwgdmVjMyBjb29yZCwgZmxvYXQgbG9kKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCB0ZXh0dXJlMkRQcm9qTG9kKHNhbXBsZXIyRCBzYW1wbGVyLCB2ZWM0IGNvb3JkLCBmbG9hdCBsb2QpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0IHRleHR1cmVDdWJlTG9kKHNhbXBsZXJDdWJlIHNhbXBsZXIsIHZlYzMgY29vcmQsIGZsb2F0IGxvZCk7IikpOworCisgICAgcmV0dXJuIHM7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFByb3RvdHlwZXMgZm9yIGJ1aWx0LWluIGZ1bmN0aW9ucyBzZWVuIGJ5IGZyYWdtZW50IHNoYWRlcnMgb25seS4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0YXRpYyBUU3RyaW5nIEJ1aWx0SW5GdW5jdGlvbnNGcmFnbWVudChjb25zdCBTaEJ1aWx0SW5SZXNvdXJjZXMmIHJlc291cmNlcykKK3sKKyAgICBUU3RyaW5nIHM7CisKKyAgICAvLworICAgIC8vIFRleHR1cmUgRnVuY3Rpb25zLgorICAgIC8vCisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCB0ZXh0dXJlMkQoc2FtcGxlcjJEIHNhbXBsZXIsIHZlYzIgY29vcmQpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0IHRleHR1cmUyRFByb2ooc2FtcGxlcjJEIHNhbXBsZXIsIHZlYzMgY29vcmQpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0IHRleHR1cmUyRFByb2ooc2FtcGxlcjJEIHNhbXBsZXIsIHZlYzQgY29vcmQpOyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0IHRleHR1cmVDdWJlKHNhbXBsZXJDdWJlIHNhbXBsZXIsIHZlYzMgY29vcmQpOyIpKTsKKworICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzQgdGV4dHVyZTJEKHNhbXBsZXIyRCBzYW1wbGVyLCB2ZWMyIGNvb3JkLCBmbG9hdCBiaWFzKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCB0ZXh0dXJlMkRQcm9qKHNhbXBsZXIyRCBzYW1wbGVyLCB2ZWMzIGNvb3JkLCBmbG9hdCBiaWFzKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCB0ZXh0dXJlMkRQcm9qKHNhbXBsZXIyRCBzYW1wbGVyLCB2ZWM0IGNvb3JkLCBmbG9hdCBiaWFzKTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidmVjNCB0ZXh0dXJlQ3ViZShzYW1wbGVyQ3ViZSBzYW1wbGVyLCB2ZWMzIGNvb3JkLCBmbG9hdCBiaWFzKTsiKSk7CisKKyAgICBpZiAocmVzb3VyY2VzLk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcykgeworICAgICAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBkRmR4KGZsb2F0IHApOyIpKTsKKyAgICAgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgZEZkeCh2ZWMyICBwKTsiKSk7CisgICAgICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIGRGZHgodmVjMyAgcCk7IikpOworICAgICAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBkRmR4KHZlYzQgIHApOyIpKTsKKworICAgICAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBkRmR5KGZsb2F0IHApOyIpKTsKKyAgICAgICAgcy5hcHBlbmQoVFN0cmluZygidmVjMiAgZEZkeSh2ZWMyICBwKTsiKSk7CisgICAgICAgIHMuYXBwZW5kKFRTdHJpbmcoInZlYzMgIGRGZHkodmVjMyAgcCk7IikpOworICAgICAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBkRmR5KHZlYzQgIHApOyIpKTsKKworICAgICAgICBzLmFwcGVuZChUU3RyaW5nKCJmbG9hdCBmd2lkdGgoZmxvYXQgcCk7IikpOworICAgICAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMyICBmd2lkdGgodmVjMiAgcCk7IikpOworICAgICAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWMzICBmd2lkdGgodmVjMyAgcCk7IikpOworICAgICAgICBzLmFwcGVuZChUU3RyaW5nKCJ2ZWM0ICBmd2lkdGgodmVjNCAgcCk7IikpOworICAgIH0KKworICAgIHJldHVybiBzOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBTdGFuZGFyZCB1bmlmb3Jtcy4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0YXRpYyBUU3RyaW5nIFN0YW5kYXJkVW5pZm9ybXMoKQoreworICAgIFRTdHJpbmcgczsKKworICAgIC8vCisgICAgLy8gRGVwdGggcmFuZ2UgaW4gd2luZG93IGNvb3JkaW5hdGVzCisgICAgLy8KKyAgICBzLmFwcGVuZChUU3RyaW5nKCJzdHJ1Y3QgZ2xfRGVwdGhSYW5nZVBhcmFtZXRlcnMgeyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCIgICAgaGlnaHAgZmxvYXQgbmVhcjsiKSk7ICAgICAgICAvLyBuCisgICAgcy5hcHBlbmQoVFN0cmluZygiICAgIGhpZ2hwIGZsb2F0IGZhcjsiKSk7ICAgICAgICAgLy8gZgorICAgIHMuYXBwZW5kKFRTdHJpbmcoIiAgICBoaWdocCBmbG9hdCBkaWZmOyIpKTsgICAgICAgIC8vIGYgLSBuCisgICAgcy5hcHBlbmQoVFN0cmluZygifTsiKSk7CisgICAgcy5hcHBlbmQoVFN0cmluZygidW5pZm9ybSBnbF9EZXB0aFJhbmdlUGFyYW1ldGVycyBnbF9EZXB0aFJhbmdlOyIpKTsKKworICAgIHJldHVybiBzOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBEZWZhdWx0IHByZWNpc2lvbiBmb3IgdmVydGV4IHNoYWRlcnMuCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzdGF0aWMgVFN0cmluZyBEZWZhdWx0UHJlY2lzaW9uVmVydGV4KCkKK3sKKyAgICBUU3RyaW5nIHM7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJwcmVjaXNpb24gaGlnaHAgaW50OyIpKTsKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7IikpOworCisgICAgcmV0dXJuIHM7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIERlZmF1bHQgcHJlY2lzaW9uIGZvciBmcmFnbWVudCBzaGFkZXJzLgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorc3RhdGljIFRTdHJpbmcgRGVmYXVsdFByZWNpc2lvbkZyYWdtZW50KCkKK3sKKyAgICBUU3RyaW5nIHM7CisKKyAgICBzLmFwcGVuZChUU3RyaW5nKCJwcmVjaXNpb24gbWVkaXVtcCBpbnQ7IikpOworICAgIC8vIE5vIGRlZmF1bHQgcHJlY2lzaW9uIGZvciBmbG9hdCBpbiBmcmFnbWVudCBzaGFkZXJzCisKKyAgICByZXR1cm4gczsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gSW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGJ1aWx0LWluIGNvbnN0YW50cy4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0YXRpYyBUU3RyaW5nIEJ1aWx0SW5Db25zdGFudHMoY29uc3QgU2hCdWlsdEluUmVzb3VyY2VzICZyZXNvdXJjZXMpCit7CisgICAgVFN0cmluZ1N0cmVhbSBzOworCisgICAgcyA8PCAiY29uc3QgaW50IGdsX01heFZlcnRleEF0dHJpYnMgPSAiIDw8IHJlc291cmNlcy5NYXhWZXJ0ZXhBdHRyaWJzIDw8ICI7IjsKKyAgICBzIDw8ICJjb25zdCBpbnQgZ2xfTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgPSAiIDw8IHJlc291cmNlcy5NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9ycyA8PCAiOyI7CisKKyAgICBzIDw8ICJjb25zdCBpbnQgZ2xfTWF4VmFyeWluZ1ZlY3RvcnMgPSAiIDw8IHJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyA8PCAiOyI7CisgICAgcyA8PCAiY29uc3QgaW50IGdsX01heFZlcnRleFRleHR1cmVJbWFnZVVuaXRzID0gIiA8PCByZXNvdXJjZXMuTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPDwgIjsiOworICAgIHMgPDwgImNvbnN0IGludCBnbF9NYXhDb21iaW5lZFRleHR1cmVJbWFnZVVuaXRzID0gIiA8PCByZXNvdXJjZXMuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA8PCAiOyI7CisgICAgcyA8PCAiY29uc3QgaW50IGdsX01heFRleHR1cmVJbWFnZVVuaXRzID0gIiA8PCByZXNvdXJjZXMuTWF4VGV4dHVyZUltYWdlVW5pdHMgPDwgIjsiOworICAgIHMgPDwgImNvbnN0IGludCBnbF9NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzID0gIiA8PCByZXNvdXJjZXMuTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyA8PCAiOyI7CisgICAgcyA8PCAiY29uc3QgaW50IGdsX01heERyYXdCdWZmZXJzID0gIiA8PCByZXNvdXJjZXMuTWF4RHJhd0J1ZmZlcnMgPDwgIjsiOworCisgICAgcmV0dXJuIHMuc3RyKCk7Cit9CisKK3ZvaWQgVEJ1aWx0SW5zOjppbml0aWFsaXplKFNoU2hhZGVyVHlwZSB0eXBlLCBTaFNoYWRlclNwZWMgc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNoQnVpbHRJblJlc291cmNlcyYgcmVzb3VyY2VzKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgU0hfRlJBR01FTlRfU0hBREVSOgorICAgICAgICBidWlsdEluU3RyaW5ncy5wdXNoX2JhY2soRGVmYXVsdFByZWNpc2lvbkZyYWdtZW50KCkpOworICAgICAgICBidWlsdEluU3RyaW5ncy5wdXNoX2JhY2soQnVpbHRJbkZ1bmN0aW9uc0NvbW1vbigpKTsKKyAgICAgICAgYnVpbHRJblN0cmluZ3MucHVzaF9iYWNrKEJ1aWx0SW5GdW5jdGlvbnNGcmFnbWVudChyZXNvdXJjZXMpKTsKKyAgICAgICAgYnVpbHRJblN0cmluZ3MucHVzaF9iYWNrKFN0YW5kYXJkVW5pZm9ybXMoKSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTSF9WRVJURVhfU0hBREVSOgorICAgICAgICBidWlsdEluU3RyaW5ncy5wdXNoX2JhY2soRGVmYXVsdFByZWNpc2lvblZlcnRleCgpKTsKKyAgICAgICAgYnVpbHRJblN0cmluZ3MucHVzaF9iYWNrKEJ1aWx0SW5GdW5jdGlvbnNDb21tb24oKSk7CisgICAgICAgIGJ1aWx0SW5TdHJpbmdzLnB1c2hfYmFjayhCdWlsdEluRnVuY3Rpb25zVmVydGV4KHJlc291cmNlcykpOworICAgICAgICBidWlsdEluU3RyaW5ncy5wdXNoX2JhY2soU3RhbmRhcmRVbmlmb3JtcygpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UgJiYgIkxhbmd1YWdlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICBidWlsdEluU3RyaW5ncy5wdXNoX2JhY2soQnVpbHRJbkNvbnN0YW50cyhyZXNvdXJjZXMpKTsKK30KKwordm9pZCBJZGVudGlmeUJ1aWx0SW5zKFNoU2hhZGVyVHlwZSB0eXBlLCBTaFNoYWRlclNwZWMgc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaEJ1aWx0SW5SZXNvdXJjZXMmIHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICBUU3ltYm9sVGFibGUmIHN5bWJvbFRhYmxlKQoreworICAgIC8vCisgICAgLy8gRmlyc3QsIGluc2VydCBzb21lIHNwZWNpYWwgYnVpbHQtaW4gdmFyaWFibGVzIHRoYXQgYXJlIG5vdCBpbiAKKyAgICAvLyB0aGUgYnVpbHQtaW4gaGVhZGVyIGZpbGVzLgorICAgIC8vCisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIFNIX0ZSQUdNRU5UX1NIQURFUjoKKyAgICAgICAgc3ltYm9sVGFibGUuaW5zZXJ0KCpuZXcgVFZhcmlhYmxlKE5ld1Bvb2xUU3RyaW5nKCJnbF9GcmFnQ29vcmQiKSwgICAgICAgICAgICAgICAgICAgVFR5cGUoRWJ0RmxvYXQsIEVicE1lZGl1bSwgRXZxRnJhZ0Nvb3JkLCAgIDQpKSk7CisgICAgICAgIHN5bWJvbFRhYmxlLmluc2VydCgqbmV3IFRWYXJpYWJsZShOZXdQb29sVFN0cmluZygiZ2xfRnJvbnRGYWNpbmciKSwgICAgICAgICAgICAgICAgIFRUeXBlKEVidEJvb2wsICBFYnBVbmRlZmluZWQsIEV2cUZyb250RmFjaW5nLCAxKSkpOworICAgICAgICBzeW1ib2xUYWJsZS5pbnNlcnQoKm5ldyBUVmFyaWFibGUoTmV3UG9vbFRTdHJpbmcoImdsX0ZyYWdDb2xvciIpLCAgICAgICAgICAgICAgICAgICBUVHlwZShFYnRGbG9hdCwgRWJwTWVkaXVtLCBFdnFGcmFnQ29sb3IsICAgNCkpKTsKKyAgICAgICAgc3ltYm9sVGFibGUuaW5zZXJ0KCpuZXcgVFZhcmlhYmxlKE5ld1Bvb2xUU3RyaW5nKCJnbF9GcmFnRGF0YVtnbF9NYXhEcmF3QnVmZmVyc10iKSwgVFR5cGUoRWJ0RmxvYXQsIEVicE1lZGl1bSwgRXZxRnJhZ0RhdGEsICAgIDQpKSk7CisgICAgICAgIHN5bWJvbFRhYmxlLmluc2VydCgqbmV3IFRWYXJpYWJsZShOZXdQb29sVFN0cmluZygiZ2xfUG9pbnRDb29yZCIpLCAgICAgICAgICAgICAgICAgIFRUeXBlKEVidEZsb2F0LCBFYnBNZWRpdW0sIEV2cVBvaW50Q29vcmQsICAyKSkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU0hfVkVSVEVYX1NIQURFUjoKKyAgICAgICAgc3ltYm9sVGFibGUuaW5zZXJ0KCpuZXcgVFZhcmlhYmxlKE5ld1Bvb2xUU3RyaW5nKCJnbF9Qb3NpdGlvbiIpLCAgICBUVHlwZShFYnRGbG9hdCwgRWJwSGlnaCwgRXZxUG9zaXRpb24sICAgIDQpKSk7CisgICAgICAgIHN5bWJvbFRhYmxlLmluc2VydCgqbmV3IFRWYXJpYWJsZShOZXdQb29sVFN0cmluZygiZ2xfUG9pbnRTaXplIiksICAgVFR5cGUoRWJ0RmxvYXQsIEVicE1lZGl1bSwgRXZxUG9pbnRTaXplLCAgIDEpKSk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlICYmICJMYW5ndWFnZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOZXh0LCBpZGVudGlmeSB3aGljaCBidWlsdC1pbnMgZnJvbSB0aGUgYWxyZWFkeSBsb2FkZWQgaGVhZGVycyBoYXZlCisgICAgLy8gYSBtYXBwaW5nIHRvIGFuIG9wZXJhdG9yLiAgVGhvc2UgdGhhdCBhcmUgbm90IGlkZW50aWZpZWQgYXMgc3VjaCBhcmUKKyAgICAvLyBleHBlY3RlZCB0byBiZSByZXNvbHZlZCB0aHJvdWdoIGEgbGlicmFyeSBvZiBmdW5jdGlvbnMsIHZlcnN1cyBhcworICAgIC8vIG9wZXJhdGlvbnMuCisgICAgLy8KKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJub3QiLCAgICAgICAgICAgICAgRU9wVmVjdG9yTG9naWNhbE5vdCk7CisKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJtYXRyaXhDb21wTXVsdCIsICAgRU9wTXVsKTsKKworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImVxdWFsIiwgICAgICAgICAgICBFT3BWZWN0b3JFcXVhbCk7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigibm90RXF1YWwiLCAgICAgICAgIEVPcFZlY3Rvck5vdEVxdWFsKTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJsZXNzVGhhbiIsICAgICAgICAgRU9wTGVzc1RoYW4pOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImdyZWF0ZXJUaGFuIiwgICAgICBFT3BHcmVhdGVyVGhhbik7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigibGVzc1RoYW5FcXVhbCIsICAgIEVPcExlc3NUaGFuRXF1YWwpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImdyZWF0ZXJUaGFuRXF1YWwiLCBFT3BHcmVhdGVyVGhhbkVxdWFsKTsKKyAgICAKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJyYWRpYW5zIiwgICAgICBFT3BSYWRpYW5zKTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJkZWdyZWVzIiwgICAgICBFT3BEZWdyZWVzKTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJzaW4iLCAgICAgICAgICBFT3BTaW4pOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImNvcyIsICAgICAgICAgIEVPcENvcyk7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigidGFuIiwgICAgICAgICAgRU9wVGFuKTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJhc2luIiwgICAgICAgICBFT3BBc2luKTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJhY29zIiwgICAgICAgICBFT3BBY29zKTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJhdGFuIiwgICAgICAgICBFT3BBdGFuKTsKKworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoInBvdyIsICAgICAgICAgIEVPcFBvdyk7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigiZXhwMiIsICAgICAgICAgRU9wRXhwMik7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigibG9nIiwgICAgICAgICAgRU9wTG9nKTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJleHAiLCAgICAgICAgICBFT3BFeHApOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImxvZzIiLCAgICAgICAgIEVPcExvZzIpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoInNxcnQiLCAgICAgICAgIEVPcFNxcnQpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImludmVyc2VzcXJ0IiwgIEVPcEludmVyc2VTcXJ0KTsKKworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImFicyIsICAgICAgICAgIEVPcEFicyk7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigic2lnbiIsICAgICAgICAgRU9wU2lnbik7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigiZmxvb3IiLCAgICAgICAgRU9wRmxvb3IpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImNlaWwiLCAgICAgICAgIEVPcENlaWwpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImZyYWN0IiwgICAgICAgIEVPcEZyYWN0KTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJtb2QiLCAgICAgICAgICBFT3BNb2QpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoIm1pbiIsICAgICAgICAgIEVPcE1pbik7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigibWF4IiwgICAgICAgICAgRU9wTWF4KTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJjbGFtcCIsICAgICAgICBFT3BDbGFtcCk7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigibWl4IiwgICAgICAgICAgRU9wTWl4KTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJzdGVwIiwgICAgICAgICBFT3BTdGVwKTsKKyAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJzbW9vdGhzdGVwIiwgICBFT3BTbW9vdGhTdGVwKTsKKworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImxlbmd0aCIsICAgICAgIEVPcExlbmd0aCk7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigiZGlzdGFuY2UiLCAgICAgRU9wRGlzdGFuY2UpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImRvdCIsICAgICAgICAgIEVPcERvdCk7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigiY3Jvc3MiLCAgICAgICAgRU9wQ3Jvc3MpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoIm5vcm1hbGl6ZSIsICAgIEVPcE5vcm1hbGl6ZSk7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigiZmFjZWZvcndhcmQiLCAgRU9wRmFjZUZvcndhcmQpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoInJlZmxlY3QiLCAgICAgIEVPcFJlZmxlY3QpOworICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoInJlZnJhY3QiLCAgICAgIEVPcFJlZnJhY3QpOworICAgIAorICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImFueSIsICAgICAgICAgIEVPcEFueSk7CisgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigiYWxsIiwgICAgICAgICAgRU9wQWxsKTsKKworICAgIC8vIE1hcCBsYW5ndWFnZS1zcGVjaWZpYyBvcGVyYXRvcnMuCisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIFNIX1ZFUlRFWF9TSEFERVI6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0hfRlJBR01FTlRfU0hBREVSOgorICAgICAgICBpZiAocmVzb3VyY2VzLk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcykgeworICAgICAgICAgICAgc3ltYm9sVGFibGUucmVsYXRlVG9PcGVyYXRvcigiZEZkeCIsICAgRU9wREZkeCk7CisgICAgICAgICAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb09wZXJhdG9yKCJkRmR5IiwgICBFT3BERmR5KTsKKyAgICAgICAgICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvT3BlcmF0b3IoImZ3aWR0aCIsIEVPcEZ3aWR0aCk7CisKKyAgICAgICAgICAgIHN5bWJvbFRhYmxlLnJlbGF0ZVRvRXh0ZW5zaW9uKCJkRmR4IiwgIkdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpOworICAgICAgICAgICAgc3ltYm9sVGFibGUucmVsYXRlVG9FeHRlbnNpb24oImRGZHkiLCAiR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIik7CisgICAgICAgICAgICBzeW1ib2xUYWJsZS5yZWxhdGVUb0V4dGVuc2lvbigiZndpZHRoIiwgIkdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIC8vIEZpbmFsbHkgYWRkIHJlc291cmNlLXNwZWNpZmljIHZhcmlhYmxlcy4KKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgU0hfRlJBR01FTlRfU0hBREVSOiB7CisgICAgICAgICAgICAvLyBTZXQgdXAgZ2xfRnJhZ0RhdGEuICBUaGUgYXJyYXkgc2l6ZS4KKyAgICAgICAgICAgIFRUeXBlIGZyYWdEYXRhKEVidEZsb2F0LCBFYnBNZWRpdW0sIEV2cUZyYWdDb2xvciwgICA0LCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICBmcmFnRGF0YS5zZXRBcnJheVNpemUocmVzb3VyY2VzLk1heERyYXdCdWZmZXJzKTsKKyAgICAgICAgICAgIHN5bWJvbFRhYmxlLmluc2VydCgqbmV3IFRWYXJpYWJsZShOZXdQb29sVFN0cmluZygiZ2xfRnJhZ0RhdGEiKSwgICAgZnJhZ0RhdGEpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgSW5pdEV4dGVuc2lvbkJlaGF2aW9yKGNvbnN0IFNoQnVpbHRJblJlc291cmNlcyYgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEV4dGVuc2lvbkJlaGF2aW9yJiBleHRCZWhhdmlvcikKK3sKKyAgICBpZiAocmVzb3VyY2VzLk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcykKKyAgICAgICAgZXh0QmVoYXZpb3JbIkdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyJdID0gRUJoRGlzYWJsZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luaXRpYWxpemUuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luaXRpYWxpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBhZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW5pdGlhbGl6ZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgX0lOSVRJQUxJWkVfSU5DTFVERURfCisjZGVmaW5lIF9JTklUSUFMSVpFX0lOQ0xVREVEXworCisjaW5jbHVkZSAiY29tcGlsZXIvQ29tbW9uLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvU2hIYW5kbGUuaCIKKyNpbmNsdWRlICJjb21waWxlci9TeW1ib2xUYWJsZS5oIgorCit0eXBlZGVmIFRWZWN0b3I8VFN0cmluZz4gVEJ1aWx0SW5TdHJpbmdzOworCitjbGFzcyBUQnVpbHRJbnMgeworcHVibGljOgorICAgIFBPT0xfQUxMT0NBVE9SX05FV19ERUxFVEUoR2xvYmFsUG9vbEFsbG9jYXRvcikKKworICAgIHZvaWQgaW5pdGlhbGl6ZShTaFNoYWRlclR5cGUgdHlwZSwgU2hTaGFkZXJTcGVjIHNwZWMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNoQnVpbHRJblJlc291cmNlcyYgcmVzb3VyY2VzKTsKKyAgICBjb25zdCBUQnVpbHRJblN0cmluZ3MmIGdldEJ1aWx0SW5TdHJpbmdzKCkgeyByZXR1cm4gYnVpbHRJblN0cmluZ3M7IH0KKworcHJvdGVjdGVkOgorICAgIFRCdWlsdEluU3RyaW5ncyBidWlsdEluU3RyaW5nczsKK307CisKK3ZvaWQgSWRlbnRpZnlCdWlsdElucyhTaFNoYWRlclR5cGUgdHlwZSwgU2hTaGFkZXJTcGVjIHNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2hCdWlsdEluUmVzb3VyY2VzJiByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgVFN5bWJvbFRhYmxlJiBzeW1ib2xUYWJsZSk7CisKK3ZvaWQgSW5pdEV4dGVuc2lvbkJlaGF2aW9yKGNvbnN0IFNoQnVpbHRJblJlc291cmNlcyYgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEV4dGVuc2lvbkJlaGF2aW9yJiBleHRlbnNpb25CZWhhdmlvcik7CisKKyNlbmRpZiAvLyBfSU5JVElBTElaRV9JTkNMVURFRF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luaXRpYWxpemVEbGwuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW5pdGlhbGl6ZURsbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2M2NmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luaXRpYWxpemVEbGwuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaW5jbHVkZSAiY29tcGlsZXIvSW5pdGlhbGl6ZURsbC5oIgorCisjaW5jbHVkZSAiY29tcGlsZXIvSW5pdGlhbGl6ZUdsb2JhbHMuaCIKKyNpbmNsdWRlICJjb21waWxlci9Jbml0aWFsaXplUGFyc2VDb250ZXh0LmgiCisjaW5jbHVkZSAiY29tcGlsZXIvb3NpbmNsdWRlLmgiCisKK09TX1RMU0luZGV4IFRocmVhZEluaXRpYWxpemVJbmRleCA9IE9TX0lOVkFMSURfVExTX0lOREVYOworCitib29sIEluaXRQcm9jZXNzKCkKK3sKKyAgICBpZiAoVGhyZWFkSW5pdGlhbGl6ZUluZGV4ICE9IE9TX0lOVkFMSURfVExTX0lOREVYKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEZ1bmN0aW9uIGlzIHJlLWVudHJhbnQuCisgICAgICAgIC8vCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIFRocmVhZEluaXRpYWxpemVJbmRleCA9IE9TX0FsbG9jVExTSW5kZXgoKTsKKworICAgIGlmIChUaHJlYWRJbml0aWFsaXplSW5kZXggPT0gT1NfSU5WQUxJRF9UTFNfSU5ERVgpIHsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkluaXRQcm9jZXNzKCk6IEZhaWxlZCB0byBhbGxvY2F0ZSBUTFMgYXJlYSBmb3IgaW5pdCBmbGFnIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAgIGlmICghSW5pdGlhbGl6ZVBvb2xJbmRleCgpKSB7CisgICAgICAgIGFzc2VydCgwICYmICJJbml0UHJvY2VzcygpOiBGYWlsZWQgdG8gaW5pdGFsaXplIGdsb2JhbCBwb29sIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIUluaXRpYWxpemVQYXJzZUNvbnRleHRJbmRleCgpKSB7CisgICAgICAgIGFzc2VydCgwICYmICJJbml0UHJvY2VzcygpOiBGYWlsZWQgdG8gaW5pdGFsaXplIHBhcnNlIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBJbml0VGhyZWFkKCk7Cit9CisKK2Jvb2wgRGV0YWNoUHJvY2VzcygpCit7CisgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKworICAgIGlmIChUaHJlYWRJbml0aWFsaXplSW5kZXggPT0gT1NfSU5WQUxJRF9UTFNfSU5ERVgpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgc3VjY2VzcyA9IERldGFjaFRocmVhZCgpOworCisgICAgaWYgKCFGcmVlUGFyc2VDb250ZXh0SW5kZXgoKSkKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworCisgICAgRnJlZVBvb2xJbmRleCgpOworCisgICAgT1NfRnJlZVRMU0luZGV4KFRocmVhZEluaXRpYWxpemVJbmRleCk7CisgICAgVGhyZWFkSW5pdGlhbGl6ZUluZGV4ID0gT1NfSU5WQUxJRF9UTFNfSU5ERVg7CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworYm9vbCBJbml0VGhyZWFkKCkKK3sKKyAgICAvLworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgcmUtZW50cmFudAorICAgIC8vCisgICAgaWYgKFRocmVhZEluaXRpYWxpemVJbmRleCA9PSBPU19JTlZBTElEX1RMU19JTkRFWCkgeworICAgICAgICBhc3NlcnQoMCAmJiAiSW5pdFRocmVhZCgpOiBQcm9jZXNzIGhhc24ndCBiZWVuIGluaXRhbGlzZWQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoT1NfR2V0VExTVmFsdWUoVGhyZWFkSW5pdGlhbGl6ZUluZGV4KSAhPSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEluaXRpYWxpemVHbG9iYWxQb29scygpOworCisgICAgaWYgKCFJbml0aWFsaXplR2xvYmFsUGFyc2VDb250ZXh0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghT1NfU2V0VExTVmFsdWUoVGhyZWFkSW5pdGlhbGl6ZUluZGV4LCAodm9pZCAqKTEpKSB7CisgICAgICAgIGFzc2VydCgwICYmICJJbml0VGhyZWFkKCk6IFVuYWJsZSB0byBzZXQgaW5pdCBmbGFnLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV0YWNoVGhyZWFkKCkKK3sKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOworCisgICAgaWYgKFRocmVhZEluaXRpYWxpemVJbmRleCA9PSBPU19JTlZBTElEX1RMU19JTkRFWCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLworICAgIC8vIEZ1bmN0aW9uIGlzIHJlLWVudHJhbnQgYW5kIHRoaXMgdGhyZWFkIG1heSBub3QgaGF2ZSBiZWVuIGluaXRhbGlzZWQuCisgICAgLy8KKyAgICBpZiAoT1NfR2V0VExTVmFsdWUoVGhyZWFkSW5pdGlhbGl6ZUluZGV4KSAhPSAwKSB7CisgICAgICAgIGlmICghT1NfU2V0VExTVmFsdWUoVGhyZWFkSW5pdGlhbGl6ZUluZGV4LCAodm9pZCAqKTApKSB7CisgICAgICAgICAgICBhc3NlcnQoMCAmJiAiRGV0YWNoVGhyZWFkKCk6IFVuYWJsZSB0byBjbGVhciBpbml0IGZsYWcuIik7CisgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUZyZWVQYXJzZUNvbnRleHQoKSkKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgICAgICBGcmVlR2xvYmFsUG9vbHMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW5pdGlhbGl6ZURsbC5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW5pdGlhbGl6ZURsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NzIzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Jbml0aWFsaXplRGxsLmgKQEAgLTAsMCArMSwxNiBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKyNpZm5kZWYgX19JTklUSUFMSVpFRExMX0gKKyNkZWZpbmUgX19JTklUSUFMSVpFRExMX0gKKworYm9vbCBJbml0UHJvY2VzcygpOworYm9vbCBEZXRhY2hQcm9jZXNzKCk7CisKK2Jvb2wgSW5pdFRocmVhZCgpOworYm9vbCBEZXRhY2hUaHJlYWQoKTsKKworI2VuZGlmIC8vIF9fSU5JVElBTElaRURMTF9ICisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luaXRpYWxpemVHbG9iYWxzLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Jbml0aWFsaXplR2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MmE0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Jbml0aWFsaXplR2xvYmFscy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgX19JTklUSUFMSVpFX0dMT0JBTFNfSU5DTFVERURfCisjZGVmaW5lIF9fSU5JVElBTElaRV9HTE9CQUxTX0lOQ0xVREVEXworCit2b2lkIEluaXRpYWxpemVHbG9iYWxQb29scygpOwordm9pZCBGcmVlR2xvYmFsUG9vbHMoKTsKK2Jvb2wgSW5pdGlhbGl6ZVBvb2xJbmRleCgpOwordm9pZCBGcmVlUG9vbEluZGV4KCk7CisKKyNlbmRpZiAvLyBfX0lOSVRJQUxJWkVfR0xPQkFMU19JTkNMVURFRF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luaXRpYWxpemVQYXJzZUNvbnRleHQuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL0luaXRpYWxpemVQYXJzZUNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjBmZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW5pdGlhbGl6ZVBhcnNlQ29udGV4dC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgX19JTklUSUFMSVpFX1BBUlNFX0NPTlRFWFRfSU5DTFVERURfCisjZGVmaW5lIF9fSU5JVElBTElaRV9QQVJTRV9DT05URVhUX0lOQ0xVREVEXworCitib29sIEluaXRpYWxpemVQYXJzZUNvbnRleHRJbmRleCgpOworYm9vbCBGcmVlUGFyc2VDb250ZXh0SW5kZXgoKTsKKworYm9vbCBJbml0aWFsaXplR2xvYmFsUGFyc2VDb250ZXh0KCk7Citib29sIEZyZWVQYXJzZUNvbnRleHQoKTsKKworI2VuZGlmIC8vIF9fSU5JVElBTElaRV9QQVJTRV9DT05URVhUX0lOQ0xVREVEXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW50ZXJtVHJhdmVyc2UuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW50ZXJtVHJhdmVyc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMzg3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9JbnRlcm1UcmF2ZXJzZS5jcHAKQEAgLTAsMCArMSwyOTMgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9pbnRlcm1lZGlhdGUuaCIKKworLy8KKy8vIFRyYXZlcnNlIHRoZSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gdHJlZSwgYW5kCisvLyBjYWxsIGEgbm9kZSB0eXBlIHNwZWNpZmljIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUuCisvLyBEb25lIHJlY3Vyc2l2ZWx5IHRocm91Z2ggdGhlIG1lbWJlciBmdW5jdGlvbiBUcmF2ZXJzZSgpLgorLy8gTm9kZSB0eXBlcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVpciBmdW5jdGlvbiB0byBjYWxsIGlzIDAsCisvLyBidXQgdGhlaXIgc3VidHJlZSB3aWxsIHN0aWxsIGJlIHRyYXZlcnNlZC4KKy8vIE5vZGVzIHdpdGggY2hpbGRyZW4gY2FuIGhhdmUgdGhlaXIgd2hvbGUgc3VidHJlZSBza2lwcGVkCisvLyBpZiBwcmVWaXNpdCBpcyB0dXJuZWQgb24gYW5kIHRoZSB0eXBlIHNwZWNpZmljIGZ1bmN0aW9uCisvLyByZXR1cm5zIGZhbHNlLgorLy8KKy8vIHByZVZpc2l0LCBwb3N0VmlzaXQsIGFuZCByaWdodFRvTGVmdCBjb250cm9sIHdoYXQgb3JkZXIKKy8vIG5vZGVzIGFyZSB2aXNpdGVkIGluLgorLy8KKworLy8KKy8vIFRyYXZlcnNhbCBmdW5jdGlvbnMgZm9yIHRlcm1pbmFscyBhcmUgc3RyYWlnaGZvcndhcmQuLi4uCisvLwordm9pZCBUSW50ZXJtU3ltYm9sOjp0cmF2ZXJzZShUSW50ZXJtVHJhdmVyc2VyKiBpdCkKK3sKKwlpdC0+dmlzaXRTeW1ib2wodGhpcyk7Cit9CisKK3ZvaWQgVEludGVybUNvbnN0YW50VW5pb246OnRyYXZlcnNlKFRJbnRlcm1UcmF2ZXJzZXIqIGl0KQoreworCWl0LT52aXNpdENvbnN0YW50VW5pb24odGhpcyk7Cit9CisKKy8vCisvLyBUcmF2ZXJzZSBhIGJpbmFyeSBub2RlLgorLy8KK3ZvaWQgVEludGVybUJpbmFyeTo6dHJhdmVyc2UoVEludGVybVRyYXZlcnNlciogaXQpCit7CisJYm9vbCB2aXNpdCA9IHRydWU7CisKKwkvLworCS8vIHZpc2l0IHRoZSBub2RlIGJlZm9yZSBjaGlsZHJlbiBpZiBwcmUtdmlzaXRpbmcuCisJLy8KKwlpZihpdC0+cHJlVmlzaXQpCisJeworCQl2aXNpdCA9IGl0LT52aXNpdEJpbmFyeShQcmVWaXNpdCwgdGhpcyk7CisJfQorCQorCS8vCisJLy8gVmlzaXQgdGhlIGNoaWxkcmVuLCBpbiB0aGUgcmlnaHQgb3JkZXIuCisJLy8KKwlpZih2aXNpdCkKKwl7CisJCWl0LT5pbmNyZW1lbnREZXB0aCgpOworCisJCWlmKGl0LT5yaWdodFRvTGVmdCkgCisJCXsKKwkJCWlmKHJpZ2h0KQorCQkJeworCQkJCXJpZ2h0LT50cmF2ZXJzZShpdCk7CisJCQl9CisJCQkKKwkJCWlmKGl0LT5pblZpc2l0KQorCQkJeworCQkJCXZpc2l0ID0gaXQtPnZpc2l0QmluYXJ5KEluVmlzaXQsIHRoaXMpOworCQkJfQorCisJCQlpZih2aXNpdCAmJiBsZWZ0KQorCQkJeworCQkJCWxlZnQtPnRyYXZlcnNlKGl0KTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKGxlZnQpCisJCQl7CisJCQkJbGVmdC0+dHJhdmVyc2UoaXQpOworCQkJfQorCQkJCisJCQlpZihpdC0+aW5WaXNpdCkKKwkJCXsKKwkJCQl2aXNpdCA9IGl0LT52aXNpdEJpbmFyeShJblZpc2l0LCB0aGlzKTsKKwkJCX0KKworCQkJaWYodmlzaXQgJiYgcmlnaHQpCisJCQl7CisJCQkJcmlnaHQtPnRyYXZlcnNlKGl0KTsKKwkJCX0KKwkJfQorCisJCWl0LT5kZWNyZW1lbnREZXB0aCgpOworCX0KKworCS8vCisJLy8gVmlzaXQgdGhlIG5vZGUgYWZ0ZXIgdGhlIGNoaWxkcmVuLCBpZiByZXF1ZXN0ZWQgYW5kIHRoZSB0cmF2ZXJzYWwKKwkvLyBoYXNuJ3QgYmVlbiBjYW5jZWxsZWQgeWV0LgorCS8vCisJaWYodmlzaXQgJiYgaXQtPnBvc3RWaXNpdCkKKwl7CisJCWl0LT52aXNpdEJpbmFyeShQb3N0VmlzaXQsIHRoaXMpOworCX0KK30KKworLy8KKy8vIFRyYXZlcnNlIGEgdW5hcnkgbm9kZS4gIFNhbWUgY29tbWVudHMgaW4gYmluYXJ5IG5vZGUgYXBwbHkgaGVyZS4KKy8vCit2b2lkIFRJbnRlcm1VbmFyeTo6dHJhdmVyc2UoVEludGVybVRyYXZlcnNlciogaXQpCit7CisJYm9vbCB2aXNpdCA9IHRydWU7CisKKwlpZiAoaXQtPnByZVZpc2l0KQorCQl2aXNpdCA9IGl0LT52aXNpdFVuYXJ5KFByZVZpc2l0LCB0aGlzKTsKKworCWlmICh2aXNpdCkgeworCQlpdC0+aW5jcmVtZW50RGVwdGgoKTsKKwkJb3BlcmFuZC0+dHJhdmVyc2UoaXQpOworCQlpdC0+ZGVjcmVtZW50RGVwdGgoKTsKKwl9CisJCisJaWYgKHZpc2l0ICYmIGl0LT5wb3N0VmlzaXQpCisJCWl0LT52aXNpdFVuYXJ5KFBvc3RWaXNpdCwgdGhpcyk7Cit9CisKKy8vCisvLyBUcmF2ZXJzZSBhbiBhZ2dyZWdhdGUgbm9kZS4gIFNhbWUgY29tbWVudHMgaW4gYmluYXJ5IG5vZGUgYXBwbHkgaGVyZS4KKy8vCit2b2lkIFRJbnRlcm1BZ2dyZWdhdGU6OnRyYXZlcnNlKFRJbnRlcm1UcmF2ZXJzZXIqIGl0KQoreworCWJvb2wgdmlzaXQgPSB0cnVlOworCQorCWlmKGl0LT5wcmVWaXNpdCkKKwl7CisJCXZpc2l0ID0gaXQtPnZpc2l0QWdncmVnYXRlKFByZVZpc2l0LCB0aGlzKTsKKwl9CisJCisJaWYodmlzaXQpCisJeworCQlpdC0+aW5jcmVtZW50RGVwdGgoKTsKKworCQlpZihpdC0+cmlnaHRUb0xlZnQpCisJCXsKKwkJCWZvcihUSW50ZXJtU2VxdWVuY2U6OnJldmVyc2VfaXRlcmF0b3Igc2l0ID0gc2VxdWVuY2UucmJlZ2luKCk7IHNpdCAhPSBzZXF1ZW5jZS5yZW5kKCk7IHNpdCsrKQorCQkJeworCQkJCSgqc2l0KS0+dHJhdmVyc2UoaXQpOworCisJCQkJaWYodmlzaXQgJiYgaXQtPmluVmlzaXQpCisJCQkJeworCQkJCQlpZigqc2l0ICE9IHNlcXVlbmNlLmZyb250KCkpCisJCQkJCXsKKwkJCQkJCXZpc2l0ID0gaXQtPnZpc2l0QWdncmVnYXRlKEluVmlzaXQsIHRoaXMpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZm9yKFRJbnRlcm1TZXF1ZW5jZTo6aXRlcmF0b3Igc2l0ID0gc2VxdWVuY2UuYmVnaW4oKTsgc2l0ICE9IHNlcXVlbmNlLmVuZCgpOyBzaXQrKykKKwkJCXsKKwkJCQkoKnNpdCktPnRyYXZlcnNlKGl0KTsKKworCQkJCWlmKHZpc2l0ICYmIGl0LT5pblZpc2l0KQorCQkJCXsKKwkJCQkJaWYoKnNpdCAhPSBzZXF1ZW5jZS5iYWNrKCkpCisJCQkJCXsKKwkJCQkJCXZpc2l0ID0gaXQtPnZpc2l0QWdncmVnYXRlKEluVmlzaXQsIHRoaXMpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpdC0+ZGVjcmVtZW50RGVwdGgoKTsKKwl9CisKKwlpZih2aXNpdCAmJiBpdC0+cG9zdFZpc2l0KQorCXsKKwkJaXQtPnZpc2l0QWdncmVnYXRlKFBvc3RWaXNpdCwgdGhpcyk7CisJfQorfQorCisvLworLy8gVHJhdmVyc2UgYSBzZWxlY3Rpb24gbm9kZS4gIFNhbWUgY29tbWVudHMgaW4gYmluYXJ5IG5vZGUgYXBwbHkgaGVyZS4KKy8vCit2b2lkIFRJbnRlcm1TZWxlY3Rpb246OnRyYXZlcnNlKFRJbnRlcm1UcmF2ZXJzZXIqIGl0KQoreworCWJvb2wgdmlzaXQgPSB0cnVlOworCisJaWYgKGl0LT5wcmVWaXNpdCkKKwkJdmlzaXQgPSBpdC0+dmlzaXRTZWxlY3Rpb24oUHJlVmlzaXQsIHRoaXMpOworCQorCWlmICh2aXNpdCkgeworCQlpdC0+aW5jcmVtZW50RGVwdGgoKTsKKwkJaWYgKGl0LT5yaWdodFRvTGVmdCkgeworCQkJaWYgKGZhbHNlQmxvY2spCisJCQkJZmFsc2VCbG9jay0+dHJhdmVyc2UoaXQpOworCQkJaWYgKHRydWVCbG9jaykKKwkJCQl0cnVlQmxvY2stPnRyYXZlcnNlKGl0KTsKKwkJCWNvbmRpdGlvbi0+dHJhdmVyc2UoaXQpOworCQl9IGVsc2UgeworCQkJY29uZGl0aW9uLT50cmF2ZXJzZShpdCk7CisJCQlpZiAodHJ1ZUJsb2NrKQorCQkJCXRydWVCbG9jay0+dHJhdmVyc2UoaXQpOworCQkJaWYgKGZhbHNlQmxvY2spCisJCQkJZmFsc2VCbG9jay0+dHJhdmVyc2UoaXQpOworCQl9CisJCWl0LT5kZWNyZW1lbnREZXB0aCgpOworCX0KKworCWlmICh2aXNpdCAmJiBpdC0+cG9zdFZpc2l0KQorCQlpdC0+dmlzaXRTZWxlY3Rpb24oUG9zdFZpc2l0LCB0aGlzKTsKK30KKworLy8KKy8vIFRyYXZlcnNlIGEgbG9vcCBub2RlLiAgU2FtZSBjb21tZW50cyBpbiBiaW5hcnkgbm9kZSBhcHBseSBoZXJlLgorLy8KK3ZvaWQgVEludGVybUxvb3A6OnRyYXZlcnNlKFRJbnRlcm1UcmF2ZXJzZXIqIGl0KQoreworCWJvb2wgdmlzaXQgPSB0cnVlOworCisJaWYoaXQtPnByZVZpc2l0KQorCXsKKwkJdmlzaXQgPSBpdC0+dmlzaXRMb29wKFByZVZpc2l0LCB0aGlzKTsKKwl9CisJCisJaWYodmlzaXQpCisJeworCQlpdC0+aW5jcmVtZW50RGVwdGgoKTsKKworCQlpZihpdC0+cmlnaHRUb0xlZnQpCisJCXsKKwkJCWlmKGV4cHIpCisJCQl7CisJCQkJZXhwci0+dHJhdmVyc2UoaXQpOworCQkJfQorCisJCQlpZihib2R5KQorCQkJeworCQkJCWJvZHktPnRyYXZlcnNlKGl0KTsKKwkJCX0KKworCQkJaWYoY29uZCkKKwkJCXsKKwkJCQljb25kLT50cmF2ZXJzZShpdCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihjb25kKQorCQkJeworCQkJCWNvbmQtPnRyYXZlcnNlKGl0KTsKKwkJCX0KKworCQkJaWYoYm9keSkKKwkJCXsKKwkJCQlib2R5LT50cmF2ZXJzZShpdCk7CisJCQl9CisKKwkJCWlmKGV4cHIpCisJCQl7CisJCQkJZXhwci0+dHJhdmVyc2UoaXQpOworCQkJfQorCQl9CisKKwkJaXQtPmRlY3JlbWVudERlcHRoKCk7CisJfQorCisJaWYodmlzaXQgJiYgaXQtPnBvc3RWaXNpdCkKKwl7CisJCWl0LT52aXNpdExvb3AoUG9zdFZpc2l0LCB0aGlzKTsKKwl9Cit9CisKKy8vCisvLyBUcmF2ZXJzZSBhIGJyYW5jaCBub2RlLiAgU2FtZSBjb21tZW50cyBpbiBiaW5hcnkgbm9kZSBhcHBseSBoZXJlLgorLy8KK3ZvaWQgVEludGVybUJyYW5jaDo6dHJhdmVyc2UoVEludGVybVRyYXZlcnNlciogaXQpCit7CisJYm9vbCB2aXNpdCA9IHRydWU7CisKKwlpZiAoaXQtPnByZVZpc2l0KQorCQl2aXNpdCA9IGl0LT52aXNpdEJyYW5jaChQcmVWaXNpdCwgdGhpcyk7CisJCisJaWYgKHZpc2l0ICYmIGV4cHJlc3Npb24pIHsKKwkJaXQtPmluY3JlbWVudERlcHRoKCk7CisJCWV4cHJlc3Npb24tPnRyYXZlcnNlKGl0KTsKKwkJaXQtPmRlY3JlbWVudERlcHRoKCk7CisJfQorCisJaWYgKHZpc2l0ICYmIGl0LT5wb3N0VmlzaXQpCisJCWl0LT52aXNpdEJyYW5jaChQb3N0VmlzaXQsIHRoaXMpOworfQorCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9JbnRlcm1lZGlhdGUuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW50ZXJtZWRpYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWU4ZGEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvSW50ZXJtZWRpYXRlLmNwcApAQCAtMCwwICsxLDE0NTQgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vCisvLyBCdWlsZCB0aGUgaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uLgorLy8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29tcGlsZXIvbG9jYWxpbnRlcm1lZGlhdGUuaCIKKyNpbmNsdWRlICJjb21waWxlci9RdWFsaWZpZXJBbGl2ZS5oIgorI2luY2x1ZGUgImNvbXBpbGVyL1JlbW92ZVRyZWUuaCIKKworYm9vbCBDb21wYXJlU3RydWN0dXJlKGNvbnN0IFRUeXBlJiBsZWZ0Tm9kZVR5cGUsIENvbnN0YW50VW5pb24qIHJpZ2h0VW5pb25BcnJheSwgQ29uc3RhbnRVbmlvbiogbGVmdFVuaW9uQXJyYXkpOworCitzdGF0aWMgVFByZWNpc2lvbiBHZXRIaWdoZXJQcmVjaXNpb24oIFRQcmVjaXNpb24gbGVmdCwgVFByZWNpc2lvbiByaWdodCApeworICAgIHJldHVybiBsZWZ0ID4gcmlnaHQgPyBsZWZ0IDogcmlnaHQ7Cit9CisKK2NvbnN0IGNoYXIqIGdldE9wZXJhdG9yU3RyaW5nKFRPcGVyYXRvciBvcCkgeworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgIGNhc2UgRU9wSW5pdGlhbGl6ZTogcmV0dXJuICI9IjsKKyAgICAgIGNhc2UgRU9wQXNzaWduOiByZXR1cm4gIj0iOworICAgICAgY2FzZSBFT3BBZGRBc3NpZ246IHJldHVybiAiKz0iOworICAgICAgY2FzZSBFT3BTdWJBc3NpZ246IHJldHVybiAiLT0iOworICAgICAgY2FzZSBFT3BEaXZBc3NpZ246IHJldHVybiAiLz0iOworCisgICAgICAvLyBGYWxsLXRocm91Z2guCisgICAgICBjYXNlIEVPcE11bEFzc2lnbjogCisgICAgICBjYXNlIEVPcFZlY3RvclRpbWVzTWF0cml4QXNzaWduOgorICAgICAgY2FzZSBFT3BWZWN0b3JUaW1lc1NjYWxhckFzc2lnbjoKKyAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNTY2FsYXJBc3NpZ246CisgICAgICBjYXNlIEVPcE1hdHJpeFRpbWVzTWF0cml4QXNzaWduOiByZXR1cm4gIio9IjsKKworICAgICAgLy8gRmFsbC10aHJvdWdoLgorICAgICAgY2FzZSBFT3BJbmRleERpcmVjdDoKKyAgICAgIGNhc2UgRU9wSW5kZXhJbmRpcmVjdDogcmV0dXJuICJbXSI7CisKKyAgICAgIGNhc2UgRU9wSW5kZXhEaXJlY3RTdHJ1Y3Q6IHJldHVybiAiLiI7CisgICAgICBjYXNlIEVPcFZlY3RvclN3aXp6bGU6IHJldHVybiAiLiI7CisgICAgICBjYXNlIEVPcEFkZDogcmV0dXJuICIrIjsKKyAgICAgIGNhc2UgRU9wU3ViOiByZXR1cm4gIi0iOworICAgICAgY2FzZSBFT3BNdWw6IHJldHVybiAiKiI7CisgICAgICBjYXNlIEVPcERpdjogcmV0dXJuICIvIjsKKyAgICAgIGNhc2UgRU9wTW9kOiBVTklNUExFTUVOVEVEKCk7IGJyZWFrOworICAgICAgY2FzZSBFT3BFcXVhbDogcmV0dXJuICI9PSI7CisgICAgICBjYXNlIEVPcE5vdEVxdWFsOiByZXR1cm4gIiE9IjsKKyAgICAgIGNhc2UgRU9wTGVzc1RoYW46IHJldHVybiAiPCI7CisgICAgICBjYXNlIEVPcEdyZWF0ZXJUaGFuOiByZXR1cm4gIj4iOworICAgICAgY2FzZSBFT3BMZXNzVGhhbkVxdWFsOiByZXR1cm4gIjw9IjsKKyAgICAgIGNhc2UgRU9wR3JlYXRlclRoYW5FcXVhbDogcmV0dXJuICI+PSI7CisKKyAgICAgIC8vIEZhbGwtdGhyb3VnaC4KKyAgICAgIGNhc2UgRU9wVmVjdG9yVGltZXNTY2FsYXI6CisgICAgICBjYXNlIEVPcFZlY3RvclRpbWVzTWF0cml4OgorICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc1ZlY3RvcjoKKyAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNTY2FsYXI6CisgICAgICBjYXNlIEVPcE1hdHJpeFRpbWVzTWF0cml4OiByZXR1cm4gIioiOworCisgICAgICBjYXNlIEVPcExvZ2ljYWxPcjogcmV0dXJuICJ8fCI7CisgICAgICBjYXNlIEVPcExvZ2ljYWxYb3I6IHJldHVybiAiXl4iOworICAgICAgY2FzZSBFT3BMb2dpY2FsQW5kOiByZXR1cm4gIiYmIjsKKyAgICAgIGNhc2UgRU9wTmVnYXRpdmU6IHJldHVybiAiLSI7CisgICAgICBjYXNlIEVPcFZlY3RvckxvZ2ljYWxOb3Q6IHJldHVybiAibm90IjsKKyAgICAgIGNhc2UgRU9wTG9naWNhbE5vdDogcmV0dXJuICIhIjsKKyAgICAgIGNhc2UgRU9wUG9zdEluY3JlbWVudDogcmV0dXJuICIrKyI7CisgICAgICBjYXNlIEVPcFBvc3REZWNyZW1lbnQ6IHJldHVybiAiLS0iOworICAgICAgY2FzZSBFT3BQcmVJbmNyZW1lbnQ6IHJldHVybiAiKysiOworICAgICAgY2FzZSBFT3BQcmVEZWNyZW1lbnQ6IHJldHVybiAiLS0iOworCisgICAgICAvLyBGYWxsLXRocm91Z2guCisgICAgICBjYXNlIEVPcENvbnZJbnRUb0Jvb2w6CisgICAgICBjYXNlIEVPcENvbnZGbG9hdFRvQm9vbDogcmV0dXJuICJib29sIjsKKyAKKyAgICAgIC8vIEZhbGwtdGhyb3VnaC4KKyAgICAgIGNhc2UgRU9wQ29udkJvb2xUb0Zsb2F0OgorICAgICAgY2FzZSBFT3BDb252SW50VG9GbG9hdDogcmV0dXJuICJmbG9hdCI7CisgCisgICAgICAvLyBGYWxsLXRocm91Z2guCisgICAgICBjYXNlIEVPcENvbnZGbG9hdFRvSW50OgorICAgICAgY2FzZSBFT3BDb252Qm9vbFRvSW50OiByZXR1cm4gImludCI7CisKKyAgICAgIGNhc2UgRU9wUmFkaWFuczogcmV0dXJuICJyYWRpYW5zIjsKKyAgICAgIGNhc2UgRU9wRGVncmVlczogcmV0dXJuICJkZWdyZWVzIjsKKyAgICAgIGNhc2UgRU9wU2luOiByZXR1cm4gInNpbiI7CisgICAgICBjYXNlIEVPcENvczogcmV0dXJuICJjb3MiOworICAgICAgY2FzZSBFT3BUYW46IHJldHVybiAidGFuIjsKKyAgICAgIGNhc2UgRU9wQXNpbjogcmV0dXJuICJhc2luIjsKKyAgICAgIGNhc2UgRU9wQWNvczogcmV0dXJuICJhY29zIjsKKyAgICAgIGNhc2UgRU9wQXRhbjogcmV0dXJuICJhdGFuIjsKKyAgICAgIGNhc2UgRU9wRXhwOiByZXR1cm4gImV4cCI7CisgICAgICBjYXNlIEVPcExvZzogcmV0dXJuICJsb2ciOworICAgICAgY2FzZSBFT3BFeHAyOiByZXR1cm4gImV4cDIiOworICAgICAgY2FzZSBFT3BMb2cyOiByZXR1cm4gImxvZzIiOworICAgICAgY2FzZSBFT3BTcXJ0OiByZXR1cm4gInNxcnQiOworICAgICAgY2FzZSBFT3BJbnZlcnNlU3FydDogcmV0dXJuICJpbnZlcnNlc3FydCI7CisgICAgICBjYXNlIEVPcEFiczogcmV0dXJuICJhYnMiOworICAgICAgY2FzZSBFT3BTaWduOiByZXR1cm4gInNpZ24iOworICAgICAgY2FzZSBFT3BGbG9vcjogcmV0dXJuICJmbG9vciI7CisgICAgICBjYXNlIEVPcENlaWw6IHJldHVybiAiY2VpbCI7CisgICAgICBjYXNlIEVPcEZyYWN0OiByZXR1cm4gImZyYWN0IjsKKyAgICAgIGNhc2UgRU9wTGVuZ3RoOiByZXR1cm4gImxlbmd0aCI7CisgICAgICBjYXNlIEVPcE5vcm1hbGl6ZTogcmV0dXJuICJub3JtYWxpemUiOworICAgICAgY2FzZSBFT3BERmR4OiByZXR1cm4gImRGZHgiOworICAgICAgY2FzZSBFT3BERmR5OiByZXR1cm4gImRGZHkiOworICAgICAgY2FzZSBFT3BGd2lkdGg6IHJldHVybiAiZndpZHRoIjsKKyAgICAgIGNhc2UgRU9wQW55OiByZXR1cm4gImFueSI7CisgICAgICBjYXNlIEVPcEFsbDogcmV0dXJuICJhbGwiOworCisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gRmlyc3Qgc2V0IG9mIGZ1bmN0aW9ucyBhcmUgdG8gaGVscCBidWlsZCB0aGUgaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uLgorLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGUgbm9kZXMuCisvLyBUaGV5IGFyZSBjYWxsZWQgZnJvbSBwYXJzZXIgcHJvZHVjdGlvbnMuCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8KKy8vIEFkZCBhIHRlcm1pbmFsIG5vZGUgZm9yIGFuIGlkZW50aWZpZXIgaW4gYW4gZXhwcmVzc2lvbi4KKy8vCisvLyBSZXR1cm5zIHRoZSBhZGRlZCBub2RlLgorLy8KK1RJbnRlcm1TeW1ib2wqIFRJbnRlcm1lZGlhdGU6OmFkZFN5bWJvbChpbnQgaWQsIGNvbnN0IFRTdHJpbmcmIG5hbWUsIGNvbnN0IFRUeXBlJiB0eXBlLCBUU291cmNlTG9jIGxpbmUpCit7CisgICAgVEludGVybVN5bWJvbCogbm9kZSA9IG5ldyBUSW50ZXJtU3ltYm9sKGlkLCBuYW1lLCB0eXBlKTsKKyAgICBub2RlLT5zZXRMaW5lKGxpbmUpOworCisgICAgcmV0dXJuIG5vZGU7Cit9CisKKy8vCisvLyBDb25uZWN0IHR3byBub2RlcyB3aXRoIGEgbmV3IHBhcmVudCB0aGF0IGRvZXMgYSBiaW5hcnkgb3BlcmF0aW9uIG9uIHRoZSBub2Rlcy4KKy8vCisvLyBSZXR1cm5zIHRoZSBhZGRlZCBub2RlLgorLy8KK1RJbnRlcm1UeXBlZCogVEludGVybWVkaWF0ZTo6YWRkQmluYXJ5TWF0aChUT3BlcmF0b3Igb3AsIFRJbnRlcm1UeXBlZCogbGVmdCwgVEludGVybVR5cGVkKiByaWdodCwgVFNvdXJjZUxvYyBsaW5lLCBUU3ltYm9sVGFibGUmIHN5bWJvbFRhYmxlKQoreworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBFT3BFcXVhbDoKKyAgICAgICAgY2FzZSBFT3BOb3RFcXVhbDoKKyAgICAgICAgICAgIGlmIChsZWZ0LT5pc0FycmF5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BMZXNzVGhhbjoKKyAgICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbjoKKyAgICAgICAgY2FzZSBFT3BMZXNzVGhhbkVxdWFsOgorICAgICAgICBjYXNlIEVPcEdyZWF0ZXJUaGFuRXF1YWw6CisgICAgICAgICAgICBpZiAobGVmdC0+aXNNYXRyaXgoKSB8fCBsZWZ0LT5pc0FycmF5KCkgfHwgbGVmdC0+aXNWZWN0b3IoKSB8fCBsZWZ0LT5nZXRCYXNpY1R5cGUoKSA9PSBFYnRTdHJ1Y3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcExvZ2ljYWxPcjoKKyAgICAgICAgY2FzZSBFT3BMb2dpY2FsWG9yOgorICAgICAgICBjYXNlIEVPcExvZ2ljYWxBbmQ6CisgICAgICAgICAgICBpZiAobGVmdC0+Z2V0QmFzaWNUeXBlKCkgIT0gRWJ0Qm9vbCB8fCBsZWZ0LT5pc01hdHJpeCgpIHx8IGxlZnQtPmlzQXJyYXkoKSB8fCBsZWZ0LT5pc1ZlY3RvcigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BBZGQ6CisgICAgICAgIGNhc2UgRU9wU3ViOgorICAgICAgICBjYXNlIEVPcERpdjoKKyAgICAgICAgY2FzZSBFT3BNdWw6CisgICAgICAgICAgICBpZiAobGVmdC0+Z2V0QmFzaWNUeXBlKCkgPT0gRWJ0U3RydWN0IHx8IGxlZnQtPmdldEJhc2ljVHlwZSgpID09IEVidEJvb2wpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmlyc3QgdHJ5IGNvbnZlcnRpbmcgdGhlIGNoaWxkcmVuIHRvIGNvbXBhdGlibGUgdHlwZXMuCisgICAgLy8KKyAgICBpZiAobGVmdC0+Z2V0VHlwZSgpLmdldFN0cnVjdCgpICYmIHJpZ2h0LT5nZXRUeXBlKCkuZ2V0U3RydWN0KCkpIHsKKyAgICAgICAgaWYgKGxlZnQtPmdldFR5cGUoKSAhPSByaWdodC0+Z2V0VHlwZSgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVEludGVybVR5cGVkKiBjaGlsZCA9IGFkZENvbnZlcnNpb24ob3AsIGxlZnQtPmdldFR5cGUoKSwgcmlnaHQpOworICAgICAgICBpZiAoY2hpbGQpCisgICAgICAgICAgICByaWdodCA9IGNoaWxkOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoaWxkID0gYWRkQ29udmVyc2lvbihvcCwgcmlnaHQtPmdldFR5cGUoKSwgbGVmdCk7CisgICAgICAgICAgICBpZiAoY2hpbGQpCisgICAgICAgICAgICAgICAgbGVmdCA9IGNoaWxkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOZWVkIGEgbmV3IG5vZGUgaG9sZGluZyB0aGluZ3MgdG9nZXRoZXIgdGhlbi4gIE1ha2UKKyAgICAvLyBvbmUgYW5kIHByb21vdGUgaXQgdG8gdGhlIHJpZ2h0IHR5cGUuCisgICAgLy8KKyAgICBUSW50ZXJtQmluYXJ5KiBub2RlID0gbmV3IFRJbnRlcm1CaW5hcnkob3ApOworICAgIGlmIChsaW5lID09IDApCisgICAgICAgIGxpbmUgPSByaWdodC0+Z2V0TGluZSgpOworICAgIG5vZGUtPnNldExpbmUobGluZSk7CisKKyAgICBub2RlLT5zZXRMZWZ0KGxlZnQpOworICAgIG5vZGUtPnNldFJpZ2h0KHJpZ2h0KTsKKyAgICBpZiAoIW5vZGUtPnByb21vdGUoaW5mb1NpbmspKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vCisgICAgLy8gU2VlIGlmIHdlIGNhbiBmb2xkIGNvbnN0YW50cy4KKyAgICAvLworICAgIFRJbnRlcm1UeXBlZCogdHlwZWRSZXR1cm5Ob2RlID0gMDsKKyAgICBUSW50ZXJtQ29uc3RhbnRVbmlvbiAqbGVmdFRlbXBDb25zdGFudCA9IGxlZnQtPmdldEFzQ29uc3RhbnRVbmlvbigpOworICAgIFRJbnRlcm1Db25zdGFudFVuaW9uICpyaWdodFRlbXBDb25zdGFudCA9IHJpZ2h0LT5nZXRBc0NvbnN0YW50VW5pb24oKTsKKyAgICBpZiAobGVmdFRlbXBDb25zdGFudCAmJiByaWdodFRlbXBDb25zdGFudCkgeworICAgICAgICB0eXBlZFJldHVybk5vZGUgPSBsZWZ0VGVtcENvbnN0YW50LT5mb2xkKG5vZGUtPmdldE9wKCksIHJpZ2h0VGVtcENvbnN0YW50LCBpbmZvU2luayk7CisKKyAgICAgICAgaWYgKHR5cGVkUmV0dXJuTm9kZSkKKyAgICAgICAgICAgIHJldHVybiB0eXBlZFJldHVybk5vZGU7CisgICAgfQorCisgICAgcmV0dXJuIG5vZGU7Cit9CisKKy8vCisvLyBDb25uZWN0IHR3byBub2RlcyB0aHJvdWdoIGFuIGFzc2lnbm1lbnQuCisvLworLy8gUmV0dXJucyB0aGUgYWRkZWQgbm9kZS4KKy8vCitUSW50ZXJtVHlwZWQqIFRJbnRlcm1lZGlhdGU6OmFkZEFzc2lnbihUT3BlcmF0b3Igb3AsIFRJbnRlcm1UeXBlZCogbGVmdCwgVEludGVybVR5cGVkKiByaWdodCwgVFNvdXJjZUxvYyBsaW5lKQoreworICAgIC8vCisgICAgLy8gTGlrZSBhZGRpbmcgYmluYXJ5IG1hdGgsIGV4Y2VwdCB0aGUgY29udmVyc2lvbiBjYW4gb25seSBnbworICAgIC8vIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAgICAvLworICAgIFRJbnRlcm1CaW5hcnkqIG5vZGUgPSBuZXcgVEludGVybUJpbmFyeShvcCk7CisgICAgaWYgKGxpbmUgPT0gMCkKKyAgICAgICAgbGluZSA9IGxlZnQtPmdldExpbmUoKTsKKyAgICBub2RlLT5zZXRMaW5lKGxpbmUpOworCisgICAgVEludGVybVR5cGVkKiBjaGlsZCA9IGFkZENvbnZlcnNpb24ob3AsIGxlZnQtPmdldFR5cGUoKSwgcmlnaHQpOworICAgIGlmIChjaGlsZCA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG5vZGUtPnNldExlZnQobGVmdCk7CisgICAgbm9kZS0+c2V0UmlnaHQoY2hpbGQpOworICAgIGlmICghIG5vZGUtPnByb21vdGUoaW5mb1NpbmspKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBub2RlOworfQorCisvLworLy8gQ29ubmVjdCB0d28gbm9kZXMgdGhyb3VnaCBhbiBpbmRleCBvcGVyYXRvciwgd2hlcmUgdGhlIGxlZnQgbm9kZSBpcyB0aGUgYmFzZQorLy8gb2YgYW4gYXJyYXkgb3Igc3RydWN0LCBhbmQgdGhlIHJpZ2h0IG5vZGUgaXMgYSBkaXJlY3Qgb3IgaW5kaXJlY3Qgb2Zmc2V0LgorLy8KKy8vIFJldHVybnMgdGhlIGFkZGVkIG5vZGUuCisvLyBUaGUgY2FsbGVyIHNob3VsZCBzZXQgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIG5vZGUuCisvLworVEludGVybVR5cGVkKiBUSW50ZXJtZWRpYXRlOjphZGRJbmRleChUT3BlcmF0b3Igb3AsIFRJbnRlcm1UeXBlZCogYmFzZSwgVEludGVybVR5cGVkKiBpbmRleCwgVFNvdXJjZUxvYyBsaW5lKQoreworICAgIFRJbnRlcm1CaW5hcnkqIG5vZGUgPSBuZXcgVEludGVybUJpbmFyeShvcCk7CisgICAgaWYgKGxpbmUgPT0gMCkKKyAgICAgICAgbGluZSA9IGluZGV4LT5nZXRMaW5lKCk7CisgICAgbm9kZS0+c2V0TGluZShsaW5lKTsKKyAgICBub2RlLT5zZXRMZWZ0KGJhc2UpOworICAgIG5vZGUtPnNldFJpZ2h0KGluZGV4KTsKKworICAgIC8vIGNhbGxlciBzaG91bGQgc2V0IHRoZSB0eXBlCisKKyAgICByZXR1cm4gbm9kZTsKK30KKworLy8KKy8vIEFkZCBvbmUgbm9kZSBhcyB0aGUgcGFyZW50IG9mIGFub3RoZXIgdGhhdCBpdCBvcGVyYXRlcyBvbi4KKy8vCisvLyBSZXR1cm5zIHRoZSBhZGRlZCBub2RlLgorLy8KK1RJbnRlcm1UeXBlZCogVEludGVybWVkaWF0ZTo6YWRkVW5hcnlNYXRoKFRPcGVyYXRvciBvcCwgVEludGVybU5vZGUqIGNoaWxkTm9kZSwgVFNvdXJjZUxvYyBsaW5lLCBUU3ltYm9sVGFibGUmIHN5bWJvbFRhYmxlKQoreworICAgIFRJbnRlcm1VbmFyeSogbm9kZTsKKyAgICBUSW50ZXJtVHlwZWQqIGNoaWxkID0gY2hpbGROb2RlLT5nZXRBc1R5cGVkKCk7CisKKyAgICBpZiAoY2hpbGQgPT0gMCkgeworICAgICAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEludGVybmFsRXJyb3IsICJCYWQgdHlwZSBpbiBBZGRVbmFyeU1hdGgiLCBsaW5lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIEVPcExvZ2ljYWxOb3Q6CisgICAgICAgICAgICBpZiAoY2hpbGQtPmdldFR5cGUoKS5nZXRCYXNpY1R5cGUoKSAhPSBFYnRCb29sIHx8IGNoaWxkLT5nZXRUeXBlKCkuaXNNYXRyaXgoKSB8fCBjaGlsZC0+Z2V0VHlwZSgpLmlzQXJyYXkoKSB8fCBjaGlsZC0+Z2V0VHlwZSgpLmlzVmVjdG9yKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wUG9zdEluY3JlbWVudDoKKyAgICAgICAgY2FzZSBFT3BQcmVJbmNyZW1lbnQ6CisgICAgICAgIGNhc2UgRU9wUG9zdERlY3JlbWVudDoKKyAgICAgICAgY2FzZSBFT3BQcmVEZWNyZW1lbnQ6CisgICAgICAgIGNhc2UgRU9wTmVnYXRpdmU6CisgICAgICAgICAgICBpZiAoY2hpbGQtPmdldFR5cGUoKS5nZXRCYXNpY1R5cGUoKSA9PSBFYnRTdHJ1Y3QgfHwgY2hpbGQtPmdldFR5cGUoKS5pc0FycmF5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIC8vCisgICAgLy8gRG8gd2UgbmVlZCB0byBwcm9tb3RlIHRoZSBvcGVyYW5kPworICAgIC8vCisgICAgLy8gTm90ZTogSW1wbGljaXQgcHJvbW90aW9ucyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgbGFuZ3VhZ2UuCisgICAgLy8KKyAgICBUQmFzaWNUeXBlIG5ld1R5cGUgPSBFYnRWb2lkOworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RJbnQ6ICAgbmV3VHlwZSA9IEVidEludDsgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RCb29sOiAgbmV3VHlwZSA9IEVidEJvb2w7ICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RGbG9hdDogbmV3VHlwZSA9IEVidEZsb2F0OyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgaWYgKG5ld1R5cGUgIT0gRWJ0Vm9pZCkgeworICAgICAgICBjaGlsZCA9IGFkZENvbnZlcnNpb24ob3AsIFRUeXBlKG5ld1R5cGUsIGNoaWxkLT5nZXRQcmVjaXNpb24oKSwgRXZxVGVtcG9yYXJ5LAorICAgICAgICAgICAgY2hpbGQtPmdldE5vbWluYWxTaXplKCksCisgICAgICAgICAgICBjaGlsZC0+aXNNYXRyaXgoKSwKKyAgICAgICAgICAgIGNoaWxkLT5pc0FycmF5KCkpLAorICAgICAgICAgICAgY2hpbGQpOworICAgICAgICBpZiAoY2hpbGQgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gRm9yIGNvbnN0cnVjdG9ycywgd2UgYXJlIG5vdyBkb25lLCBpdCdzIGFsbCBpbiB0aGUgY29udmVyc2lvbi4KKyAgICAvLworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RJbnQ6CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0Qm9vbDoKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RGbG9hdDoKKyAgICAgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgVEludGVybUNvbnN0YW50VW5pb24gKmNoaWxkVGVtcENvbnN0YW50ID0gMDsKKyAgICBpZiAoY2hpbGQtPmdldEFzQ29uc3RhbnRVbmlvbigpKQorICAgICAgICBjaGlsZFRlbXBDb25zdGFudCA9IGNoaWxkLT5nZXRBc0NvbnN0YW50VW5pb24oKTsKKworICAgIC8vCisgICAgLy8gTWFrZSBhIG5ldyBub2RlIGZvciB0aGUgb3BlcmF0b3IuCisgICAgLy8KKyAgICBub2RlID0gbmV3IFRJbnRlcm1VbmFyeShvcCk7CisgICAgaWYgKGxpbmUgPT0gMCkKKyAgICAgICAgbGluZSA9IGNoaWxkLT5nZXRMaW5lKCk7CisgICAgbm9kZS0+c2V0TGluZShsaW5lKTsKKyAgICBub2RlLT5zZXRPcGVyYW5kKGNoaWxkKTsKKworICAgIGlmICghIG5vZGUtPnByb21vdGUoaW5mb1NpbmspKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChjaGlsZFRlbXBDb25zdGFudCkgIHsKKyAgICAgICAgVEludGVybVR5cGVkKiBuZXdDaGlsZCA9IGNoaWxkVGVtcENvbnN0YW50LT5mb2xkKG9wLCAwLCBpbmZvU2luayk7CisKKyAgICAgICAgaWYgKG5ld0NoaWxkKQorICAgICAgICAgICAgcmV0dXJuIG5ld0NoaWxkOworICAgIH0KKworICAgIHJldHVybiBub2RlOworfQorCisvLworLy8gVGhpcyBpcyB0aGUgc2FmZSB3YXkgdG8gY2hhbmdlIHRoZSBvcGVyYXRvciBvbiBhbiBhZ2dyZWdhdGUsIGFzIGl0CisvLyBkb2VzIGxvdHMgb2YgZXJyb3IgY2hlY2tpbmcgYW5kIGZpeGluZy4gIEVzcGVjaWFsbHkgZm9yIGVzdGFibGlzaGluZworLy8gYSBmdW5jdGlvbiBjYWxsJ3Mgb3BlcmF0aW9uIG9uIGl0J3Mgc2V0IG9mIHBhcmFtZXRlcnMuICBTZXF1ZW5jZXMKKy8vIG9mIGluc3RydWN0aW9ucyBhcmUgYWxzbyBhZ2dyZWdhdGVzLCBidXQgdGhleSBqdXN0IGRpcmVuY3RseSBzZXQKKy8vIHRoZWlyIG9wZXJhdG9yIHRvIEVPcFNlcXVlbmNlLgorLy8KKy8vIFJldHVybnMgYW4gYWdncmVnYXRlIG5vZGUsIHdoaWNoIGNvdWxkIGJlIHRoZSBvbmUgcGFzc2VkIGluIGlmCisvLyBpdCB3YXMgYWxyZWFkeSBhbiBhZ2dyZWdhdGUuCisvLworVEludGVybUFnZ3JlZ2F0ZSogVEludGVybWVkaWF0ZTo6c2V0QWdncmVnYXRlT3BlcmF0b3IoVEludGVybU5vZGUqIG5vZGUsIFRPcGVyYXRvciBvcCwgVFNvdXJjZUxvYyBsaW5lKQoreworICAgIFRJbnRlcm1BZ2dyZWdhdGUqIGFnZ05vZGU7CisKKyAgICAvLworICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFnZ3JlZ2F0ZS4gIElmIG5vdCB0dXJuIGl0IGludG8gb25lLgorICAgIC8vCisgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgYWdnTm9kZSA9IG5vZGUtPmdldEFzQWdncmVnYXRlKCk7CisgICAgICAgIGlmIChhZ2dOb2RlID09IDAgfHwgYWdnTm9kZS0+Z2V0T3AoKSAhPSBFT3BOdWxsKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTWFrZSBhbiBhZ2dyZWdhdGUgY29udGFpbmluZyB0aGlzIG5vZGUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgYWdnTm9kZSA9IG5ldyBUSW50ZXJtQWdncmVnYXRlKCk7CisgICAgICAgICAgICBhZ2dOb2RlLT5nZXRTZXF1ZW5jZSgpLnB1c2hfYmFjayhub2RlKTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IDApCisgICAgICAgICAgICAgICAgbGluZSA9IG5vZGUtPmdldExpbmUoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBhZ2dOb2RlID0gbmV3IFRJbnRlcm1BZ2dyZWdhdGUoKTsKKworICAgIC8vCisgICAgLy8gU2V0IHRoZSBvcGVyYXRvci4KKyAgICAvLworICAgIGFnZ05vZGUtPnNldE9wKG9wKTsKKyAgICBpZiAobGluZSAhPSAwKQorICAgICAgICBhZ2dOb2RlLT5zZXRMaW5lKGxpbmUpOworCisgICAgcmV0dXJuIGFnZ05vZGU7Cit9CisKKy8vCisvLyBDb252ZXJ0IG9uZSB0eXBlIHRvIGFub3RoZXIuCisvLworLy8gUmV0dXJucyB0aGUgbm9kZSByZXByZXNlbnRpbmcgdGhlIGNvbnZlcnNpb24sIHdoaWNoIGNvdWxkIGJlIHRoZSBzYW1lCisvLyBub2RlIHBhc3NlZCBpbiBpZiBubyBjb252ZXJzaW9uIHdhcyBuZWVkZWQuCisvLworLy8gUmV0dXJuIDAgaWYgYSBjb252ZXJzaW9uIGNhbid0IGJlIGRvbmUuCisvLworVEludGVybVR5cGVkKiBUSW50ZXJtZWRpYXRlOjphZGRDb252ZXJzaW9uKFRPcGVyYXRvciBvcCwgY29uc3QgVFR5cGUmIHR5cGUsIFRJbnRlcm1UeXBlZCogbm9kZSkKK3sKKyAgICAvLworICAgIC8vIERvZXMgdGhlIGJhc2UgdHlwZSBhbGxvdyBvcGVyYXRpb24/CisgICAgLy8KKyAgICBzd2l0Y2ggKG5vZGUtPmdldEJhc2ljVHlwZSgpKSB7CisgICAgICAgIGNhc2UgRWJ0Vm9pZDoKKyAgICAgICAgY2FzZSBFYnRTYW1wbGVyMkQ6CisgICAgICAgIGNhc2UgRWJ0U2FtcGxlckN1YmU6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIGlmIHR5cGVzIGFyZSBpZGVudGljYWwsIG5vIHByb2JsZW0KKyAgICAvLworICAgIGlmICh0eXBlID09IG5vZGUtPmdldFR5cGUoKSkKKyAgICAgICAgcmV0dXJuIG5vZGU7CisKKyAgICAvLworICAgIC8vIElmIG9uZSdzIGEgc3RydWN0dXJlLCB0aGVuIG5vIGNvbnZlcnNpb25zLgorICAgIC8vCisgICAgaWYgKHR5cGUuZ2V0U3RydWN0KCkgfHwgbm9kZS0+Z2V0VHlwZSgpLmdldFN0cnVjdCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vCisgICAgLy8gSWYgb25lJ3MgYW4gYXJyYXksIHRoZW4gbm8gY29udmVyc2lvbnMuCisgICAgLy8KKyAgICBpZiAodHlwZS5pc0FycmF5KCkgfHwgbm9kZS0+Z2V0VHlwZSgpLmlzQXJyYXkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBUQmFzaWNUeXBlIHByb21vdGVUbzsKKworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXhwbGljaXQgY29udmVyc2lvbnMKKyAgICAgICAgLy8KKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RCb29sOgorICAgICAgICAgICAgcHJvbW90ZVRvID0gRWJ0Qm9vbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEZsb2F0OgorICAgICAgICAgICAgcHJvbW90ZVRvID0gRWJ0RmxvYXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RJbnQ6CisgICAgICAgICAgICBwcm9tb3RlVG8gPSBFYnRJbnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9ucyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgbGFuZ3VhZ2UuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKHR5cGUuZ2V0QmFzaWNUeXBlKCkgIT0gbm9kZS0+Z2V0VHlwZSgpLmdldEJhc2ljVHlwZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNpemUgYW5kIHN0cnVjdHVyZSBjb3VsZCBzdGlsbCBkaWZmZXIsIGJ1dCB0aGF0J3MKKyAgICAgICAgICAgIC8vIGhhbmRsZWQgYnkgb3BlcmF0b3IgcHJvbW90aW9uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIGlmIChub2RlLT5nZXRBc0NvbnN0YW50VW5pb24oKSkgeworCisgICAgICAgIHJldHVybiAocHJvbW90ZUNvbnN0YW50VW5pb24ocHJvbW90ZVRvLCBub2RlLT5nZXRBc0NvbnN0YW50VW5pb24oKSkpOworICAgIH0gZWxzZSB7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRkIGEgbmV3IG5ld05vZGUgZm9yIHRoZSBjb252ZXJzaW9uLgorICAgICAgICAvLworICAgICAgICBUSW50ZXJtVW5hcnkqIG5ld05vZGUgPSAwOworCisgICAgICAgIFRPcGVyYXRvciBuZXdPcCA9IEVPcE51bGw7CisgICAgICAgIHN3aXRjaCAocHJvbW90ZVRvKSB7CisgICAgICAgICAgICBjYXNlIEVidEZsb2F0OgorICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+Z2V0QmFzaWNUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFYnRJbnQ6ICAgbmV3T3AgPSBFT3BDb252SW50VG9GbG9hdDsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEVidEJvb2w6ICBuZXdPcCA9IEVPcENvbnZCb29sVG9GbG9hdDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEludGVybmFsRXJyb3IsICJCYWQgcHJvbW90aW9uIG5vZGUiLCBub2RlLT5nZXRMaW5lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFYnRCb29sOgorICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+Z2V0QmFzaWNUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFYnRJbnQ6ICAgbmV3T3AgPSBFT3BDb252SW50VG9Cb29sOyAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEVidEZsb2F0OiBuZXdPcCA9IEVPcENvbnZGbG9hdFRvQm9vbDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEludGVybmFsRXJyb3IsICJCYWQgcHJvbW90aW9uIG5vZGUiLCBub2RlLT5nZXRMaW5lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFYnRJbnQ6CisgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlLT5nZXRCYXNpY1R5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEVidEJvb2w6ICAgbmV3T3AgPSBFT3BDb252Qm9vbFRvSW50OyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRWJ0RmxvYXQ6ICBuZXdPcCA9IEVPcENvbnZGbG9hdFRvSW50OyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkJhZCBwcm9tb3Rpb24gbm9kZSIsIG5vZGUtPmdldExpbmUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkJhZCBwcm9tb3Rpb24gdHlwZSIsIG5vZGUtPmdldExpbmUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBUVHlwZSB0eXBlKHByb21vdGVUbywgbm9kZS0+Z2V0UHJlY2lzaW9uKCksIEV2cVRlbXBvcmFyeSwgbm9kZS0+Z2V0Tm9taW5hbFNpemUoKSwgbm9kZS0+aXNNYXRyaXgoKSwgbm9kZS0+aXNBcnJheSgpKTsKKyAgICAgICAgbmV3Tm9kZSA9IG5ldyBUSW50ZXJtVW5hcnkobmV3T3AsIHR5cGUpOworICAgICAgICBuZXdOb2RlLT5zZXRMaW5lKG5vZGUtPmdldExpbmUoKSk7CisgICAgICAgIG5ld05vZGUtPnNldE9wZXJhbmQobm9kZSk7CisKKyAgICAgICAgcmV0dXJuIG5ld05vZGU7CisgICAgfQorfQorCisvLworLy8gU2FmZSB3YXkgdG8gY29tYmluZSB0d28gbm9kZXMgaW50byBhbiBhZ2dyZWdhdGUuICBXb3JrcyB3aXRoIG51bGwgcG9pbnRlcnMsCisvLyBhIG5vZGUgdGhhdCdzIG5vdCBhIGFnZ3JlZ2F0ZSB5ZXQsIGV0Yy4KKy8vCisvLyBSZXR1cm5zIHRoZSByZXN1bHRpbmcgYWdncmVnYXRlLCB1bmxlc3MgMCB3YXMgcGFzc2VkIGluIGZvcgorLy8gYm90aCBleGlzdGluZyBub2Rlcy4KKy8vCitUSW50ZXJtQWdncmVnYXRlKiBUSW50ZXJtZWRpYXRlOjpncm93QWdncmVnYXRlKFRJbnRlcm1Ob2RlKiBsZWZ0LCBUSW50ZXJtTm9kZSogcmlnaHQsIFRTb3VyY2VMb2MgbGluZSkKK3sKKyAgICBpZiAobGVmdCA9PSAwICYmIHJpZ2h0ID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgVEludGVybUFnZ3JlZ2F0ZSogYWdnTm9kZSA9IDA7CisgICAgaWYgKGxlZnQpCisgICAgICAgIGFnZ05vZGUgPSBsZWZ0LT5nZXRBc0FnZ3JlZ2F0ZSgpOworICAgIGlmICghYWdnTm9kZSB8fCBhZ2dOb2RlLT5nZXRPcCgpICE9IEVPcE51bGwpIHsKKyAgICAgICAgYWdnTm9kZSA9IG5ldyBUSW50ZXJtQWdncmVnYXRlOworICAgICAgICBpZiAobGVmdCkKKyAgICAgICAgICAgIGFnZ05vZGUtPmdldFNlcXVlbmNlKCkucHVzaF9iYWNrKGxlZnQpOworICAgIH0KKworICAgIGlmIChyaWdodCkKKyAgICAgICAgYWdnTm9kZS0+Z2V0U2VxdWVuY2UoKS5wdXNoX2JhY2socmlnaHQpOworCisgICAgaWYgKGxpbmUgIT0gMCkKKyAgICAgICAgYWdnTm9kZS0+c2V0TGluZShsaW5lKTsKKworICAgIHJldHVybiBhZ2dOb2RlOworfQorCisvLworLy8gVHVybiBhbiBleGlzdGluZyBub2RlIGludG8gYW4gYWdncmVnYXRlLgorLy8KKy8vIFJldHVybnMgYW4gYWdncmVnYXRlLCB1bmxlc3MgMCB3YXMgcGFzc2VkIGluIGZvciB0aGUgZXhpc3Rpbmcgbm9kZS4KKy8vCitUSW50ZXJtQWdncmVnYXRlKiBUSW50ZXJtZWRpYXRlOjptYWtlQWdncmVnYXRlKFRJbnRlcm1Ob2RlKiBub2RlLCBUU291cmNlTG9jIGxpbmUpCit7CisgICAgaWYgKG5vZGUgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBUSW50ZXJtQWdncmVnYXRlKiBhZ2dOb2RlID0gbmV3IFRJbnRlcm1BZ2dyZWdhdGU7CisgICAgYWdnTm9kZS0+Z2V0U2VxdWVuY2UoKS5wdXNoX2JhY2sobm9kZSk7CisKKyAgICBpZiAobGluZSAhPSAwKQorICAgICAgICBhZ2dOb2RlLT5zZXRMaW5lKGxpbmUpOworICAgIGVsc2UKKyAgICAgICAgYWdnTm9kZS0+c2V0TGluZShub2RlLT5nZXRMaW5lKCkpOworCisgICAgcmV0dXJuIGFnZ05vZGU7Cit9CisKKy8vCisvLyBGb3IgImlmIiB0ZXN0IG5vZGVzLiAgVGhlcmUgYXJlIHRocmVlIGNoaWxkcmVuOyBhIGNvbmRpdGlvbiwKKy8vIGEgdHJ1ZSBwYXRoLCBhbmQgYSBmYWxzZSBwYXRoLiAgVGhlIHR3byBwYXRocyBhcmUgaW4gdGhlCisvLyBub2RlUGFpci4KKy8vCisvLyBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gbm9kZSBjcmVhdGVkLgorLy8KK1RJbnRlcm1Ob2RlKiBUSW50ZXJtZWRpYXRlOjphZGRTZWxlY3Rpb24oVEludGVybVR5cGVkKiBjb25kLCBUSW50ZXJtTm9kZVBhaXIgbm9kZVBhaXIsIFRTb3VyY2VMb2MgbGluZSkKK3sKKyAgICAvLworICAgIC8vIEZvciBjb21waWxlIHRpbWUgY29uc3RhbnQgc2VsZWN0aW9ucywgcHJ1bmUgdGhlIGNvZGUgYW5kCisgICAgLy8gdGVzdCBub3cuCisgICAgLy8KKworICAgIGlmIChjb25kLT5nZXRBc1R5cGVkKCkgJiYgY29uZC0+Z2V0QXNUeXBlZCgpLT5nZXRBc0NvbnN0YW50VW5pb24oKSkgeworICAgICAgICBpZiAoY29uZC0+Z2V0QXNUeXBlZCgpLT5nZXRBc0NvbnN0YW50VW5pb24oKS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKS0+Z2V0QkNvbnN0KCkpCisgICAgICAgICAgICByZXR1cm4gbm9kZVBhaXIubm9kZTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBub2RlUGFpci5ub2RlMjsKKyAgICB9CisKKyAgICBUSW50ZXJtU2VsZWN0aW9uKiBub2RlID0gbmV3IFRJbnRlcm1TZWxlY3Rpb24oY29uZCwgbm9kZVBhaXIubm9kZTEsIG5vZGVQYWlyLm5vZGUyKTsKKyAgICBub2RlLT5zZXRMaW5lKGxpbmUpOworCisgICAgcmV0dXJuIG5vZGU7Cit9CisKKworVEludGVybVR5cGVkKiBUSW50ZXJtZWRpYXRlOjphZGRDb21tYShUSW50ZXJtVHlwZWQqIGxlZnQsIFRJbnRlcm1UeXBlZCogcmlnaHQsIFRTb3VyY2VMb2MgbGluZSkKK3sKKyAgICBpZiAobGVmdC0+Z2V0VHlwZSgpLmdldFF1YWxpZmllcigpID09IEV2cUNvbnN0ICYmIHJpZ2h0LT5nZXRUeXBlKCkuZ2V0UXVhbGlmaWVyKCkgPT0gRXZxQ29uc3QpIHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIFRJbnRlcm1UeXBlZCAqY29tbWFBZ2dyZWdhdGUgPSBncm93QWdncmVnYXRlKGxlZnQsIHJpZ2h0LCBsaW5lKTsKKyAgICAgICAgY29tbWFBZ2dyZWdhdGUtPmdldEFzQWdncmVnYXRlKCktPnNldE9wKEVPcENvbW1hKTsKKyAgICAgICAgY29tbWFBZ2dyZWdhdGUtPnNldFR5cGUocmlnaHQtPmdldFR5cGUoKSk7CisgICAgICAgIGNvbW1hQWdncmVnYXRlLT5nZXRUeXBlUG9pbnRlcigpLT5zZXRRdWFsaWZpZXIoRXZxVGVtcG9yYXJ5KTsKKyAgICAgICAgcmV0dXJuIGNvbW1hQWdncmVnYXRlOworICAgIH0KK30KKworLy8KKy8vIEZvciAiPzoiIHRlc3Qgbm9kZXMuICBUaGVyZSBhcmUgdGhyZWUgY2hpbGRyZW47IGEgY29uZGl0aW9uLAorLy8gYSB0cnVlIHBhdGgsIGFuZCBhIGZhbHNlIHBhdGguICBUaGUgdHdvIHBhdGhzIGFyZSBzcGVjaWZpZWQKKy8vIGFzIHNlcGFyYXRlIHBhcmFtZXRlcnMuCisvLworLy8gUmV0dXJucyB0aGUgc2VsZWN0aW9uIG5vZGUgY3JlYXRlZCwgb3IgMCBpZiBvbmUgY291bGQgbm90IGJlLgorLy8KK1RJbnRlcm1UeXBlZCogVEludGVybWVkaWF0ZTo6YWRkU2VsZWN0aW9uKFRJbnRlcm1UeXBlZCogY29uZCwgVEludGVybVR5cGVkKiB0cnVlQmxvY2ssIFRJbnRlcm1UeXBlZCogZmFsc2VCbG9jaywgVFNvdXJjZUxvYyBsaW5lKQoreworICAgIC8vCisgICAgLy8gR2V0IGNvbXBhdGlibGUgdHlwZXMuCisgICAgLy8KKyAgICBUSW50ZXJtVHlwZWQqIGNoaWxkID0gYWRkQ29udmVyc2lvbihFT3BTZXF1ZW5jZSwgdHJ1ZUJsb2NrLT5nZXRUeXBlKCksIGZhbHNlQmxvY2spOworICAgIGlmIChjaGlsZCkKKyAgICAgICAgZmFsc2VCbG9jayA9IGNoaWxkOworICAgIGVsc2UgeworICAgICAgICBjaGlsZCA9IGFkZENvbnZlcnNpb24oRU9wU2VxdWVuY2UsIGZhbHNlQmxvY2stPmdldFR5cGUoKSwgdHJ1ZUJsb2NrKTsKKyAgICAgICAgaWYgKGNoaWxkKQorICAgICAgICAgICAgdHJ1ZUJsb2NrID0gY2hpbGQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2VlIGlmIGFsbCB0aGUgb3BlcmFuZHMgYXJlIGNvbnN0YW50LCB0aGVuIGZvbGQgaXQgb3RoZXJ3aXNlIG5vdC4KKyAgICAvLworCisgICAgaWYgKGNvbmQtPmdldEFzQ29uc3RhbnRVbmlvbigpICYmIHRydWVCbG9jay0+Z2V0QXNDb25zdGFudFVuaW9uKCkgJiYgZmFsc2VCbG9jay0+Z2V0QXNDb25zdGFudFVuaW9uKCkpIHsKKyAgICAgICAgaWYgKGNvbmQtPmdldEFzQ29uc3RhbnRVbmlvbigpLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRCQ29uc3QoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlQmxvY2s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZUJsb2NrOworICAgIH0KKworICAgIC8vCisgICAgLy8gTWFrZSBhIHNlbGVjdGlvbiBub2RlLgorICAgIC8vCisgICAgVEludGVybVNlbGVjdGlvbiogbm9kZSA9IG5ldyBUSW50ZXJtU2VsZWN0aW9uKGNvbmQsIHRydWVCbG9jaywgZmFsc2VCbG9jaywgdHJ1ZUJsb2NrLT5nZXRUeXBlKCkpOworICAgIG5vZGUtPnNldExpbmUobGluZSk7CisKKyAgICByZXR1cm4gbm9kZTsKK30KKworLy8KKy8vIENvbnN0YW50IHRlcm1pbmFsIG5vZGVzLiAgSGFzIGEgdW5pb24gdGhhdCBjb250YWlucyBib29sLCBmbG9hdCBvciBpbnQgY29uc3RhbnRzCisvLworLy8gUmV0dXJucyB0aGUgY29uc3RhbnQgdW5pb24gbm9kZSBjcmVhdGVkLgorLy8KKworVEludGVybUNvbnN0YW50VW5pb24qIFRJbnRlcm1lZGlhdGU6OmFkZENvbnN0YW50VW5pb24oQ29uc3RhbnRVbmlvbiogdW5pb25BcnJheVBvaW50ZXIsIGNvbnN0IFRUeXBlJiB0LCBUU291cmNlTG9jIGxpbmUpCit7CisgICAgVEludGVybUNvbnN0YW50VW5pb24qIG5vZGUgPSBuZXcgVEludGVybUNvbnN0YW50VW5pb24odW5pb25BcnJheVBvaW50ZXIsIHQpOworICAgIG5vZGUtPnNldExpbmUobGluZSk7CisKKyAgICByZXR1cm4gbm9kZTsKK30KKworVEludGVybVR5cGVkKiBUSW50ZXJtZWRpYXRlOjphZGRTd2l6emxlKFRWZWN0b3JGaWVsZHMmIGZpZWxkcywgVFNvdXJjZUxvYyBsaW5lKQoreworCisgICAgVEludGVybUFnZ3JlZ2F0ZSogbm9kZSA9IG5ldyBUSW50ZXJtQWdncmVnYXRlKEVPcFNlcXVlbmNlKTsKKworICAgIG5vZGUtPnNldExpbmUobGluZSk7CisgICAgVEludGVybUNvbnN0YW50VW5pb24qIGNvbnN0SW50Tm9kZTsKKyAgICBUSW50ZXJtU2VxdWVuY2UgJnNlcXVlbmNlVmVjdG9yID0gbm9kZS0+Z2V0U2VxdWVuY2UoKTsKKyAgICBDb25zdGFudFVuaW9uKiB1bmlvbkFycmF5OworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubnVtOyBpKyspIHsKKyAgICAgICAgdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICB1bmlvbkFycmF5LT5zZXRJQ29uc3QoZmllbGRzLm9mZnNldHNbaV0pOworICAgICAgICBjb25zdEludE5vZGUgPSBhZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEludCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksIGxpbmUpOworICAgICAgICBzZXF1ZW5jZVZlY3Rvci5wdXNoX2JhY2soY29uc3RJbnROb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbm9kZTsKK30KKworLy8KKy8vIENyZWF0ZSBsb29wIG5vZGVzLgorLy8KK1RJbnRlcm1Ob2RlKiBUSW50ZXJtZWRpYXRlOjphZGRMb29wKFRMb29wVHlwZSB0eXBlLCBUSW50ZXJtTm9kZSogaW5pdCwgVEludGVybVR5cGVkKiBjb25kLCBUSW50ZXJtVHlwZWQqIGV4cHIsIFRJbnRlcm1Ob2RlKiBib2R5LCBUU291cmNlTG9jIGxpbmUpCit7CisgICAgVEludGVybU5vZGUqIG5vZGUgPSBuZXcgVEludGVybUxvb3AodHlwZSwgaW5pdCwgY29uZCwgZXhwciwgYm9keSk7CisgICAgbm9kZS0+c2V0TGluZShsaW5lKTsKKworICAgIHJldHVybiBub2RlOworfQorCisvLworLy8gQWRkIGJyYW5jaGVzLgorLy8KK1RJbnRlcm1CcmFuY2gqIFRJbnRlcm1lZGlhdGU6OmFkZEJyYW5jaChUT3BlcmF0b3IgYnJhbmNoT3AsIFRTb3VyY2VMb2MgbGluZSkKK3sKKyAgICByZXR1cm4gYWRkQnJhbmNoKGJyYW5jaE9wLCAwLCBsaW5lKTsKK30KKworVEludGVybUJyYW5jaCogVEludGVybWVkaWF0ZTo6YWRkQnJhbmNoKFRPcGVyYXRvciBicmFuY2hPcCwgVEludGVybVR5cGVkKiBleHByZXNzaW9uLCBUU291cmNlTG9jIGxpbmUpCit7CisgICAgVEludGVybUJyYW5jaCogbm9kZSA9IG5ldyBUSW50ZXJtQnJhbmNoKGJyYW5jaE9wLCBleHByZXNzaW9uKTsKKyAgICBub2RlLT5zZXRMaW5lKGxpbmUpOworCisgICAgcmV0dXJuIG5vZGU7Cit9CisKKy8vCisvLyBUaGlzIGlzIHRvIGJlIGV4ZWN1dGVkIG9uY2UgdGhlIGZpbmFsIHJvb3QgaXMgcHV0IG9uIHRvcCBieSB0aGUgcGFyc2luZworLy8gcHJvY2Vzcy4KKy8vCitib29sIFRJbnRlcm1lZGlhdGU6OnBvc3RQcm9jZXNzKFRJbnRlcm1Ob2RlKiByb290KQoreworICAgIGlmIChyb290ID09IDApCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8KKyAgICAvLyBGaXJzdCwgZmluaXNoIG9mZiB0aGUgdG9wIGxldmVsIHNlcXVlbmNlLCBpZiBhbnkKKyAgICAvLworICAgIFRJbnRlcm1BZ2dyZWdhdGUqIGFnZ1Jvb3QgPSByb290LT5nZXRBc0FnZ3JlZ2F0ZSgpOworICAgIGlmIChhZ2dSb290ICYmIGFnZ1Jvb3QtPmdldE9wKCkgPT0gRU9wTnVsbCkKKyAgICAgICAgYWdnUm9vdC0+c2V0T3AoRU9wU2VxdWVuY2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vCisvLyBUaGlzIGRlbGV0ZXMgdGhlIHRyZWUuCisvLwordm9pZCBUSW50ZXJtZWRpYXRlOjpyZW1vdmUoVEludGVybU5vZGUqIHJvb3QpCit7CisgICAgaWYgKHJvb3QpCisgICAgICAgIFJlbW92ZUFsbFRyZWVOb2Rlcyhyb290KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIE1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIG5vZGVzIHVzZWQgZm9yIGJ1aWxkaW5nIHRoZSB0cmVlLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8KKy8vIFNheSB3aGV0aGVyIG9yIG5vdCBhbiBvcGVyYXRpb24gbm9kZSBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiBzdGF0ZSBpcyBtb2RpZmllZC4KKy8vCitib29sIFRJbnRlcm1PcGVyYXRvcjo6bW9kaWZpZXNTdGF0ZSgpIGNvbnN0Cit7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIEVPcFBvc3RJbmNyZW1lbnQ6CisgICAgICAgIGNhc2UgRU9wUG9zdERlY3JlbWVudDoKKyAgICAgICAgY2FzZSBFT3BQcmVJbmNyZW1lbnQ6CisgICAgICAgIGNhc2UgRU9wUHJlRGVjcmVtZW50OgorICAgICAgICBjYXNlIEVPcEFzc2lnbjoKKyAgICAgICAgY2FzZSBFT3BBZGRBc3NpZ246CisgICAgICAgIGNhc2UgRU9wU3ViQXNzaWduOgorICAgICAgICBjYXNlIEVPcE11bEFzc2lnbjoKKyAgICAgICAgY2FzZSBFT3BWZWN0b3JUaW1lc01hdHJpeEFzc2lnbjoKKyAgICAgICAgY2FzZSBFT3BWZWN0b3JUaW1lc1NjYWxhckFzc2lnbjoKKyAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc1NjYWxhckFzc2lnbjoKKyAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc01hdHJpeEFzc2lnbjoKKyAgICAgICAgY2FzZSBFT3BEaXZBc3NpZ246CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8vCisvLyByZXR1cm5zIHRydWUgaWYgdGhlIG9wZXJhdG9yIGlzIGZvciBvbmUgb2YgdGhlIGNvbnN0cnVjdG9ycworLy8KK2Jvb2wgVEludGVybU9wZXJhdG9yOjppc0NvbnN0cnVjdG9yKCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0VmVjMjoKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RWZWMzOgorICAgICAgICBjYXNlIEVPcENvbnN0cnVjdFZlYzQ6CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0TWF0MjoKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RNYXQzOgorICAgICAgICBjYXNlIEVPcENvbnN0cnVjdE1hdDQ6CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0RmxvYXQ6CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0SVZlYzI6CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0SVZlYzM6CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0SVZlYzQ6CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0SW50OgorICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJWZWMyOgorICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJWZWMzOgorICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJWZWM0OgorICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJvb2w6CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0U3RydWN0OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorLy8KKy8vIE1ha2Ugc3VyZSB0aGUgdHlwZSBvZiBhIHVuYXJ5IG9wZXJhdG9yIGlzIGFwcHJvcHJpYXRlIGZvciBpdHMKKy8vIGNvbWJpbmF0aW9uIG9mIG9wZXJhdGlvbiBhbmQgb3BlcmFuZCB0eXBlLgorLy8KKy8vIFJldHVybnMgZmFsc2UgaW4gbm90aGluZyBtYWtlcyBzZW5zZS4KKy8vCitib29sIFRJbnRlcm1VbmFyeTo6cHJvbW90ZShUSW5mb1NpbmsmKQoreworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBFT3BMb2dpY2FsTm90OgorICAgICAgICAgICAgaWYgKG9wZXJhbmQtPmdldEJhc2ljVHlwZSgpICE9IEVidEJvb2wpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTmVnYXRpdmU6CisgICAgICAgIGNhc2UgRU9wUG9zdEluY3JlbWVudDoKKyAgICAgICAgY2FzZSBFT3BQb3N0RGVjcmVtZW50OgorICAgICAgICBjYXNlIEVPcFByZUluY3JlbWVudDoKKyAgICAgICAgY2FzZSBFT3BQcmVEZWNyZW1lbnQ6CisgICAgICAgICAgICBpZiAob3BlcmFuZC0+Z2V0QmFzaWNUeXBlKCkgPT0gRWJ0Qm9vbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gb3BlcmF0b3JzIGZvciBidWlsdC1pbnMgYXJlIGFscmVhZHkgdHlwZSBjaGVja2VkIGFnYWluc3QgdGhlaXIgcHJvdG90eXBlCisgICAgICAgIGNhc2UgRU9wQW55OgorICAgICAgICBjYXNlIEVPcEFsbDoKKyAgICAgICAgY2FzZSBFT3BWZWN0b3JMb2dpY2FsTm90OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChvcGVyYW5kLT5nZXRCYXNpY1R5cGUoKSAhPSBFYnRGbG9hdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2V0VHlwZShvcGVyYW5kLT5nZXRUeXBlKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vCisvLyBFc3RhYmxpc2hlcyB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0YW50IG9wZXJhdGlvbiwgYXMgd2VsbCBhcworLy8gbWFrZXMgdGhlIG9wZXJhdG9yIHRoZSBjb3JyZWN0IG9uZSBmb3IgdGhlIG9wZXJhbmRzLgorLy8KKy8vIFJldHVybnMgZmFsc2UgaWYgb3BlcmF0b3IgY2FuJ3Qgd29yayBvbiBvcGVyYW5kcy4KKy8vCitib29sIFRJbnRlcm1CaW5hcnk6OnByb21vdGUoVEluZm9TaW5rJiBpbmZvU2luaykKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgaGFuZGxlcyBzY2FsYXJzLCB2ZWN0b3JzLCBhbmQgbWF0cmljZXMuCisgICAgaWYgKGxlZnQtPmlzQXJyYXkoKSB8fCByaWdodC0+aXNBcnJheSgpKSB7CisgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkludmFsaWQgb3BlcmF0aW9uIGZvciBhcnJheXMiLCBnZXRMaW5lKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gR0xTTCBFUyAyLjAgZG9lcyBub3Qgc3VwcG9ydCBpbXBsaWNpdCB0eXBlIGNhc3RpbmcuCisgICAgLy8gU28gdGhlIGJhc2ljIHR5cGUgc2hvdWxkIGFsd2F5cyBtYXRjaC4KKyAgICBpZiAobGVmdC0+Z2V0QmFzaWNUeXBlKCkgIT0gcmlnaHQtPmdldEJhc2ljVHlwZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLworICAgIC8vIEJhc2UgYXNzdW1wdGlvbjogIGp1c3QgbWFrZSB0aGUgdHlwZSB0aGUgc2FtZSBhcyB0aGUgbGVmdAorICAgIC8vIG9wZXJhbmQuICBUaGVuIG9ubHkgZGV2aWF0aW9ucyBmcm9tIHRoaXMgbmVlZCBiZSBjb2RlZC4KKyAgICAvLworICAgIHNldFR5cGUobGVmdC0+Z2V0VHlwZSgpKTsKKworICAgIC8vIFRoZSByZXN1bHQgZ2V0cyBwcm9tb3RlZCB0byB0aGUgaGlnaGVzdCBwcmVjaXNpb24uCisgICAgVFByZWNpc2lvbiBoaWdoZXJQcmVjaXNpb24gPSBHZXRIaWdoZXJQcmVjaXNpb24obGVmdC0+Z2V0UHJlY2lzaW9uKCksIHJpZ2h0LT5nZXRQcmVjaXNpb24oKSk7CisgICAgZ2V0VHlwZVBvaW50ZXIoKS0+c2V0UHJlY2lzaW9uKGhpZ2hlclByZWNpc2lvbik7CisKKyAgICAvLyBCaW5hcnkgb3BlcmF0aW9ucyByZXN1bHRzIGluIHRlbXBvcmFyeSB2YXJpYWJsZXMgdW5sZXNzIGJvdGgKKyAgICAvLyBvcGVyYW5kcyBhcmUgY29uc3QuCisgICAgaWYgKGxlZnQtPmdldFF1YWxpZmllcigpICE9IEV2cUNvbnN0IHx8IHJpZ2h0LT5nZXRRdWFsaWZpZXIoKSAhPSBFdnFDb25zdCkgeworICAgICAgICBnZXRUeXBlUG9pbnRlcigpLT5zZXRRdWFsaWZpZXIoRXZxVGVtcG9yYXJ5KTsKKyAgICB9CisKKyAgICBpbnQgc2l6ZSA9IHN0ZDo6bWF4KGxlZnQtPmdldE5vbWluYWxTaXplKCksIHJpZ2h0LT5nZXROb21pbmFsU2l6ZSgpKTsKKworICAgIC8vCisgICAgLy8gQWxsIHNjYWxhcnMuIENvZGUgYWZ0ZXIgdGhpcyB0ZXN0IGFzc3VtZXMgdGhpcyBjYXNlIGlzIHJlbW92ZWQhCisgICAgLy8KKyAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBQcm9tb3RlIHRvIGNvbmRpdGlvbmFsCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY2FzZSBFT3BFcXVhbDoKKyAgICAgICAgICAgIGNhc2UgRU9wTm90RXF1YWw6CisgICAgICAgICAgICBjYXNlIEVPcExlc3NUaGFuOgorICAgICAgICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbjoKKyAgICAgICAgICAgIGNhc2UgRU9wTGVzc1RoYW5FcXVhbDoKKyAgICAgICAgICAgIGNhc2UgRU9wR3JlYXRlclRoYW5FcXVhbDoKKyAgICAgICAgICAgICAgICBzZXRUeXBlKFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQW5kIGFuZCBPciBvcGVyYXRlIG9uIGNvbmRpdGlvbmFscworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGNhc2UgRU9wTG9naWNhbEFuZDoKKyAgICAgICAgICAgIGNhc2UgRU9wTG9naWNhbE9yOgorICAgICAgICAgICAgICAgIC8vIEJvdGggb3BlcmFuZHMgbXVzdCBiZSBvZiB0eXBlIGJvb2wuCisgICAgICAgICAgICAgICAgaWYgKGxlZnQtPmdldEJhc2ljVHlwZSgpICE9IEVidEJvb2wgfHwgcmlnaHQtPmdldEJhc2ljVHlwZSgpICE9IEVidEJvb2wpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBzZXRUeXBlKFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIElmIHdlIHJlYWNoIGhlcmUsIGF0IGxlYXN0IG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgdmVjdG9yIG9yIG1hdHJpeC4KKyAgICAvLyBUaGUgb3RoZXIgb3BlcmFuZCBjb3VsZCBiZSBhIHNjYWxhciwgdmVjdG9yLCBvciBtYXRyaXguCisgICAgLy8gQXJlIHRoZSBzaXplcyBjb21wYXRpYmxlPworICAgIC8vCisgICAgaWYgKGxlZnQtPmdldE5vbWluYWxTaXplKCkgIT0gcmlnaHQtPmdldE5vbWluYWxTaXplKCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIG5vbWluYWwgc2l6ZSBvZiBvcGVyYW5kcyBkbyBub3QgbWF0Y2g6CisgICAgICAgIC8vIE9uZSBvZiB0aGVtIG11c3QgYmUgc2NhbGFyLgorICAgICAgICBpZiAobGVmdC0+Z2V0Tm9taW5hbFNpemUoKSAhPSAxICYmIHJpZ2h0LT5nZXROb21pbmFsU2l6ZSgpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIE9wZXJhdG9yIGNhbm5vdCBiZSBvZiB0eXBlIHB1cmUgYXNzaWdubWVudC4KKyAgICAgICAgaWYgKG9wID09IEVPcEFzc2lnbiB8fCBvcCA9PSBFT3BJbml0aWFsaXplKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2FuIHRoZXNlIHR3byBvcGVyYW5kcyBiZSBjb21iaW5lZD8KKyAgICAvLworICAgIFRCYXNpY1R5cGUgYmFzaWNUeXBlID0gbGVmdC0+Z2V0QmFzaWNUeXBlKCk7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIEVPcE11bDoKKyAgICAgICAgICAgIGlmICghbGVmdC0+aXNNYXRyaXgoKSAmJiByaWdodC0+aXNNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGlmIChsZWZ0LT5pc1ZlY3RvcigpKQorICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcFZlY3RvclRpbWVzTWF0cml4OworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcE1hdHJpeFRpbWVzU2NhbGFyOworICAgICAgICAgICAgICAgICAgICBzZXRUeXBlKFRUeXBlKGJhc2ljVHlwZSwgaGlnaGVyUHJlY2lzaW9uLCBFdnFUZW1wb3JhcnksIHNpemUsIHRydWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnQtPmlzTWF0cml4KCkgJiYgIXJpZ2h0LT5pc01hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJpZ2h0LT5pc1ZlY3RvcigpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wID0gRU9wTWF0cml4VGltZXNWZWN0b3I7CisgICAgICAgICAgICAgICAgICAgIHNldFR5cGUoVFR5cGUoYmFzaWNUeXBlLCBoaWdoZXJQcmVjaXNpb24sIEV2cVRlbXBvcmFyeSwgc2l6ZSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcE1hdHJpeFRpbWVzU2NhbGFyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdC0+aXNNYXRyaXgoKSAmJiByaWdodC0+aXNNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIG9wID0gRU9wTWF0cml4VGltZXNNYXRyaXg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFsZWZ0LT5pc01hdHJpeCgpICYmICFyaWdodC0+aXNNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGlmIChsZWZ0LT5pc1ZlY3RvcigpICYmIHJpZ2h0LT5pc1ZlY3RvcigpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIGFzIGNvbXBvbmVudCBwcm9kdWN0CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0LT5pc1ZlY3RvcigpIHx8IHJpZ2h0LT5pc1ZlY3RvcigpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wID0gRU9wVmVjdG9yVGltZXNTY2FsYXI7CisgICAgICAgICAgICAgICAgICAgIHNldFR5cGUoVFR5cGUoYmFzaWNUeXBlLCBoaWdoZXJQcmVjaXNpb24sIEV2cVRlbXBvcmFyeSwgc2l6ZSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIk1pc3NpbmcgZWxzZXMiLCBnZXRMaW5lKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcE11bEFzc2lnbjoKKyAgICAgICAgICAgIGlmICghbGVmdC0+aXNNYXRyaXgoKSAmJiByaWdodC0+aXNNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGlmIChsZWZ0LT5pc1ZlY3RvcigpKQorICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcFZlY3RvclRpbWVzTWF0cml4QXNzaWduOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0LT5pc01hdHJpeCgpICYmICFyaWdodC0+aXNNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGlmIChyaWdodC0+aXNWZWN0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3AgPSBFT3BNYXRyaXhUaW1lc1NjYWxhckFzc2lnbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnQtPmlzTWF0cml4KCkgJiYgcmlnaHQtPmlzTWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBvcCA9IEVPcE1hdHJpeFRpbWVzTWF0cml4QXNzaWduOworICAgICAgICAgICAgfSBlbHNlIGlmICghbGVmdC0+aXNNYXRyaXgoKSAmJiAhcmlnaHQtPmlzTWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGVmdC0+aXNWZWN0b3IoKSAmJiByaWdodC0+aXNWZWN0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBhcyBjb21wb25lbnQgcHJvZHVjdAorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdC0+aXNWZWN0b3IoKSB8fCByaWdodC0+aXNWZWN0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoISBsZWZ0LT5pc1ZlY3RvcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcFZlY3RvclRpbWVzU2NhbGFyQXNzaWduOworICAgICAgICAgICAgICAgICAgICBzZXRUeXBlKFRUeXBlKGJhc2ljVHlwZSwgaGlnaGVyUHJlY2lzaW9uLCBFdnFUZW1wb3JhcnksIHNpemUsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEludGVybmFsRXJyb3IsICJNaXNzaW5nIGVsc2VzIiwgZ2V0TGluZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVPcEFzc2lnbjoKKyAgICAgICAgY2FzZSBFT3BJbml0aWFsaXplOgorICAgICAgICBjYXNlIEVPcEFkZDoKKyAgICAgICAgY2FzZSBFT3BTdWI6CisgICAgICAgIGNhc2UgRU9wRGl2OgorICAgICAgICBjYXNlIEVPcEFkZEFzc2lnbjoKKyAgICAgICAgY2FzZSBFT3BTdWJBc3NpZ246CisgICAgICAgIGNhc2UgRU9wRGl2QXNzaWduOgorICAgICAgICAgICAgaWYgKChsZWZ0LT5pc01hdHJpeCgpICYmIHJpZ2h0LT5pc1ZlY3RvcigpKSB8fAorICAgICAgICAgICAgICAgIChsZWZ0LT5pc1ZlY3RvcigpICYmIHJpZ2h0LT5pc01hdHJpeCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBzZXRUeXBlKFRUeXBlKGJhc2ljVHlwZSwgaGlnaGVyUHJlY2lzaW9uLCBFdnFUZW1wb3JhcnksIHNpemUsIGxlZnQtPmlzTWF0cml4KCkgfHwgcmlnaHQtPmlzTWF0cml4KCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wRXF1YWw6CisgICAgICAgIGNhc2UgRU9wTm90RXF1YWw6CisgICAgICAgIGNhc2UgRU9wTGVzc1RoYW46CisgICAgICAgIGNhc2UgRU9wR3JlYXRlclRoYW46CisgICAgICAgIGNhc2UgRU9wTGVzc1RoYW5FcXVhbDoKKyAgICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbkVxdWFsOgorICAgICAgICAgICAgaWYgKChsZWZ0LT5pc01hdHJpeCgpICYmIHJpZ2h0LT5pc1ZlY3RvcigpKSB8fAorICAgICAgICAgICAgICAgIChsZWZ0LT5pc1ZlY3RvcigpICYmIHJpZ2h0LT5pc01hdHJpeCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBzZXRUeXBlKFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tcGFyZVN0cnVjdChjb25zdCBUVHlwZSYgbGVmdE5vZGVUeXBlLCBDb25zdGFudFVuaW9uKiByaWdodFVuaW9uQXJyYXksIENvbnN0YW50VW5pb24qIGxlZnRVbmlvbkFycmF5KQoreworICAgIGNvbnN0IFRUeXBlTGlzdCogZmllbGRzID0gbGVmdE5vZGVUeXBlLmdldFN0cnVjdCgpOworCisgICAgc2l6ZV90IHN0cnVjdFNpemUgPSBmaWVsZHMtPnNpemUoKTsKKyAgICBpbnQgaW5kZXggPSAwOworCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzdHJ1Y3RTaXplOyBqKyspIHsKKyAgICAgICAgaW50IHNpemUgPSAoKmZpZWxkcylbal0udHlwZS0+Z2V0T2JqZWN0U2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgaWYgKCgqZmllbGRzKVtqXS50eXBlLT5nZXRCYXNpY1R5cGUoKSA9PSBFYnRTdHJ1Y3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoIUNvbXBhcmVTdHJ1Y3R1cmUoKigqZmllbGRzKVtqXS50eXBlLCAmcmlnaHRVbmlvbkFycmF5W2luZGV4XSwgJmxlZnRVbmlvbkFycmF5W2luZGV4XSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxlZnRVbmlvbkFycmF5W2luZGV4XSAhPSByaWdodFVuaW9uQXJyYXlbaW5kZXhdKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvbXBhcmVTdHJ1Y3R1cmUoY29uc3QgVFR5cGUmIGxlZnROb2RlVHlwZSwgQ29uc3RhbnRVbmlvbiogcmlnaHRVbmlvbkFycmF5LCBDb25zdGFudFVuaW9uKiBsZWZ0VW5pb25BcnJheSkKK3sKKyAgICBpZiAobGVmdE5vZGVUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICBUVHlwZSB0eXBlV2l0aG91dEFycmF5bmVzcyA9IGxlZnROb2RlVHlwZTsKKyAgICAgICAgdHlwZVdpdGhvdXRBcnJheW5lc3MuY2xlYXJBcnJheW5lc3MoKTsKKworICAgICAgICBpbnQgYXJyYXlTaXplID0gbGVmdE5vZGVUeXBlLmdldEFycmF5U2l6ZSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlTaXplOyArK2kpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSB0eXBlV2l0aG91dEFycmF5bmVzcy5nZXRPYmplY3RTaXplKCkgKiBpOworICAgICAgICAgICAgaWYgKCFDb21wYXJlU3RydWN0KHR5cGVXaXRob3V0QXJyYXluZXNzLCAmcmlnaHRVbmlvbkFycmF5W29mZnNldF0sICZsZWZ0VW5pb25BcnJheVtvZmZzZXRdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIENvbXBhcmVTdHJ1Y3QobGVmdE5vZGVUeXBlLCByaWdodFVuaW9uQXJyYXksIGxlZnRVbmlvbkFycmF5KTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLworLy8gVGhlIGZvbGQgZnVuY3Rpb25zIHNlZSBpZiBhbiBvcGVyYXRpb24gb24gYSBjb25zdGFudCBjYW4gYmUgZG9uZSBpbiBwbGFjZSwKKy8vIHdpdGhvdXQgZ2VuZXJhdGluZyBydW4tdGltZSBjb2RlLgorLy8KKy8vIFJldHVybnMgdGhlIG5vZGUgdG8ga2VlcCB1c2luZywgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgdGhlIG5vZGUgcGFzc2VkIGluLgorLy8KKworVEludGVybVR5cGVkKiBUSW50ZXJtQ29uc3RhbnRVbmlvbjo6Zm9sZChUT3BlcmF0b3Igb3AsIFRJbnRlcm1UeXBlZCogY29uc3RhbnROb2RlLCBUSW5mb1NpbmsmIGluZm9TaW5rKQoreworICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBnZXRVbmlvbkFycmF5UG9pbnRlcigpOworICAgIGludCBvYmplY3RTaXplID0gZ2V0VHlwZSgpLmdldE9iamVjdFNpemUoKTsKKworICAgIGlmIChjb25zdGFudE5vZGUpIHsgIC8vIGJpbmFyeSBvcGVyYXRpb25zCisgICAgICAgIFRJbnRlcm1Db25zdGFudFVuaW9uICpub2RlID0gY29uc3RhbnROb2RlLT5nZXRBc0NvbnN0YW50VW5pb24oKTsKKyAgICAgICAgQ29uc3RhbnRVbmlvbiAqcmlnaHRVbmlvbkFycmF5ID0gbm9kZS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKTsKKyAgICAgICAgVFR5cGUgcmV0dXJuVHlwZSA9IGdldFR5cGUoKTsKKworICAgICAgICAvLyBmb3IgYSBjYXNlIGxpa2UgZmxvYXQgZiA9IDEuMiArIHZlYzQoMiwzLDQsNSk7CisgICAgICAgIGlmIChjb25zdGFudE5vZGUtPmdldFR5cGUoKS5nZXRPYmplY3RTaXplKCkgPT0gMSAmJiBvYmplY3RTaXplID4gMSkgeworICAgICAgICAgICAgcmlnaHRVbmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bb2JqZWN0U2l6ZV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdFNpemU7ICsraSkKKyAgICAgICAgICAgICAgICByaWdodFVuaW9uQXJyYXlbaV0gPSAqbm9kZS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKTsKKyAgICAgICAgICAgIHJldHVyblR5cGUgPSBnZXRUeXBlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RhbnROb2RlLT5nZXRUeXBlKCkuZ2V0T2JqZWN0U2l6ZSgpID4gMSAmJiBvYmplY3RTaXplID09IDEpIHsKKyAgICAgICAgICAgIC8vIGZvciBhIGNhc2UgbGlrZSBmbG9hdCBmID0gdmVjNCgyLDMsNCw1KSArIDEuMjsKKyAgICAgICAgICAgIHVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvbltjb25zdGFudE5vZGUtPmdldFR5cGUoKS5nZXRPYmplY3RTaXplKCldOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdGFudE5vZGUtPmdldFR5cGUoKS5nZXRPYmplY3RTaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICB1bmlvbkFycmF5W2ldID0gKmdldFVuaW9uQXJyYXlQb2ludGVyKCk7CisgICAgICAgICAgICByZXR1cm5UeXBlID0gbm9kZS0+Z2V0VHlwZSgpOworICAgICAgICAgICAgb2JqZWN0U2l6ZSA9IGNvbnN0YW50Tm9kZS0+Z2V0VHlwZSgpLmdldE9iamVjdFNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbnN0YW50VW5pb24qIHRlbXBDb25zdEFycmF5ID0gMDsKKyAgICAgICAgVEludGVybUNvbnN0YW50VW5pb24gKnRlbXBOb2RlOworCisgICAgICAgIGJvb2wgYm9vbE5vZGVGbGFnID0gZmFsc2U7CisgICAgICAgIHN3aXRjaChvcCkgeworICAgICAgICAgICAgY2FzZSBFT3BBZGQ6CisgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvbltvYmplY3RTaXplXTsKKyAgICAgICAgICAgICAgICB7Ly8gc3VwcG9ydCBNU1ZDKys2LjAKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RTaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheVtpXSA9IHVuaW9uQXJyYXlbaV0gKyByaWdodFVuaW9uQXJyYXlbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFT3BTdWI6CisgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvbltvYmplY3RTaXplXTsKKyAgICAgICAgICAgICAgICB7Ly8gc3VwcG9ydCBNU1ZDKys2LjAKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RTaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheVtpXSA9IHVuaW9uQXJyYXlbaV0gLSByaWdodFVuaW9uQXJyYXlbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEVPcE11bDoKKyAgICAgICAgICAgIGNhc2UgRU9wVmVjdG9yVGltZXNTY2FsYXI6CisgICAgICAgICAgICBjYXNlIEVPcE1hdHJpeFRpbWVzU2NhbGFyOgorICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bb2JqZWN0U2l6ZV07CisgICAgICAgICAgICAgICAgey8vIHN1cHBvcnQgTVNWQysrNi4wCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0U2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXlbaV0gPSB1bmlvbkFycmF5W2ldICogcmlnaHRVbmlvbkFycmF5W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNNYXRyaXg6CisgICAgICAgICAgICAgICAgaWYgKGdldFR5cGUoKS5nZXRCYXNpY1R5cGUoKSAhPSBFYnRGbG9hdCB8fCBub2RlLT5nZXRCYXNpY1R5cGUoKSAhPSBFYnRGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEludGVybmFsRXJyb3IsICJDb25zdGFudCBGb2xkaW5nIGNhbm5vdCBiZSBkb25lIGZvciBtYXRyaXggbXVsdGlwbHkiLCBnZXRMaW5lKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgey8vIHN1cHBvcnQgTVNWQysrNi4wCisgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gZ2V0Tm9taW5hbFNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvbltzaXplKnNpemVdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBzaXplOyByb3crKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgc2l6ZTsgY29sdW1uKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheVtzaXplICogY29sdW1uICsgcm93XS5zZXRGQ29uc3QoMC4wZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXlbc2l6ZSAqIGNvbHVtbiArIHJvd10uc2V0RkNvbnN0KHRlbXBDb25zdEFycmF5W3NpemUgKiBjb2x1bW4gKyByb3ddLmdldEZDb25zdCgpICsgdW5pb25BcnJheVtpICogc2l6ZSArIHJvd10uZ2V0RkNvbnN0KCkgKiAocmlnaHRVbmlvbkFycmF5W2NvbHVtbiAqIHNpemUgKyBpXS5nZXRGQ29uc3QoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRU9wRGl2OgorICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bb2JqZWN0U2l6ZV07CisgICAgICAgICAgICAgICAgey8vIHN1cHBvcnQgTVNWQysrNi4wCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGdldFR5cGUoKS5nZXRCYXNpY1R5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBFYnRGbG9hdDoKKyAgICAgICAgICAgICAgICBpZiAocmlnaHRVbmlvbkFycmF5W2ldID09IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhXYXJuaW5nLCAiRGl2aWRlIGJ5IHplcm8gZXJyb3IgZHVyaW5nIGNvbnN0YW50IGZvbGRpbmciLCBnZXRMaW5lKCkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheVtpXS5zZXRGQ29uc3QoRkxUX01BWCk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5W2ldLnNldEZDb25zdCh1bmlvbkFycmF5W2ldLmdldEZDb25zdCgpIC8gcmlnaHRVbmlvbkFycmF5W2ldLmdldEZDb25zdCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBFYnRJbnQ6CisgICAgICAgICAgICAgICAgaWYgKHJpZ2h0VW5pb25BcnJheVtpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4V2FybmluZywgIkRpdmlkZSBieSB6ZXJvIGVycm9yIGR1cmluZyBjb25zdGFudCBmb2xkaW5nIiwgZ2V0TGluZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXlbaV0uc2V0SUNvbnN0KElOVF9NQVgpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheVtpXS5zZXRJQ29uc3QodW5pb25BcnJheVtpXS5nZXRJQ29uc3QoKSAvIHJpZ2h0VW5pb25BcnJheVtpXS5nZXRJQ29uc3QoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkNvbnN0YW50IGZvbGRpbmcgY2Fubm90IGJlIGRvbmUgZm9yIFwiL1wiIiwgZ2V0TGluZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc1ZlY3RvcjoKKyAgICAgICAgICAgICAgICBpZiAobm9kZS0+Z2V0QmFzaWNUeXBlKCkgIT0gRWJ0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhJbnRlcm5hbEVycm9yLCAiQ29uc3RhbnQgRm9sZGluZyBjYW5ub3QgYmUgZG9uZSBmb3IgbWF0cml4IHRpbWVzIHZlY3RvciIsIGdldExpbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheSA9IG5ldyBDb25zdGFudFVuaW9uW2dldE5vbWluYWxTaXplKCldOworCisgICAgICAgICAgICAgICAgey8vIHN1cHBvcnQgTVNWQysrNi4wCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHNpemUgPSBnZXROb21pbmFsU2l6ZSgpLCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXlbaV0uc2V0RkNvbnN0KDAuMGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheVtpXS5zZXRGQ29uc3QodGVtcENvbnN0QXJyYXlbaV0uZ2V0RkNvbnN0KCkgKyAoKHVuaW9uQXJyYXlbaipzaXplICsgaV0uZ2V0RkNvbnN0KCkpICogcmlnaHRVbmlvbkFycmF5W2pdLmdldEZDb25zdCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZW1wTm9kZSA9IG5ldyBUSW50ZXJtQ29uc3RhbnRVbmlvbih0ZW1wQ29uc3RBcnJheSwgbm9kZS0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB0ZW1wTm9kZS0+c2V0TGluZShnZXRMaW5lKCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBOb2RlOworCisgICAgICAgICAgICBjYXNlIEVPcFZlY3RvclRpbWVzTWF0cml4OgorICAgICAgICAgICAgICAgIGlmIChnZXRUeXBlKCkuZ2V0QmFzaWNUeXBlKCkgIT0gRWJ0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhJbnRlcm5hbEVycm9yLCAiQ29uc3RhbnQgRm9sZGluZyBjYW5ub3QgYmUgZG9uZSBmb3IgdmVjdG9yIHRpbWVzIG1hdHJpeCIsIGdldExpbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bZ2V0Tm9taW5hbFNpemUoKV07CisgICAgICAgICAgICAgICAgey8vIHN1cHBvcnQgTVNWQysrNi4wCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHNpemUgPSBnZXROb21pbmFsU2l6ZSgpLCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXlbaV0uc2V0RkNvbnN0KDAuMGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheVtpXS5zZXRGQ29uc3QodGVtcENvbnN0QXJyYXlbaV0uZ2V0RkNvbnN0KCkgKyAoKHVuaW9uQXJyYXlbal0uZ2V0RkNvbnN0KCkpICogcmlnaHRVbmlvbkFycmF5W2kqc2l6ZSArIGpdLmdldEZDb25zdCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRU9wTG9naWNhbEFuZDogLy8gdGhpcyBjb2RlIGlzIHdyaXR0ZW4gZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UsIHdpbGwgbm90IGdldCBleGVjdXRlZCBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheSA9IG5ldyBDb25zdGFudFVuaW9uW29iamVjdFNpemVdOworICAgICAgICAgICAgICAgIHsvLyBzdXBwb3J0IE1TVkMrKzYuMAorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdFNpemU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5W2ldID0gdW5pb25BcnJheVtpXSAmJiByaWdodFVuaW9uQXJyYXlbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEVPcExvZ2ljYWxPcjogLy8gdGhpcyBjb2RlIGlzIHdyaXR0ZW4gZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UsIHdpbGwgbm90IGdldCBleGVjdXRlZCBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheSA9IG5ldyBDb25zdGFudFVuaW9uW29iamVjdFNpemVdOworICAgICAgICAgICAgICAgIHsvLyBzdXBwb3J0IE1TVkMrKzYuMAorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdFNpemU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5W2ldID0gdW5pb25BcnJheVtpXSB8fCByaWdodFVuaW9uQXJyYXlbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEVPcExvZ2ljYWxYb3I6CisgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvbltvYmplY3RTaXplXTsKKyAgICAgICAgICAgICAgICB7Ly8gc3VwcG9ydCBNU1ZDKys2LjAKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RTaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGdldFR5cGUoKS5nZXRCYXNpY1R5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBFYnRCb29sOiB0ZW1wQ29uc3RBcnJheVtpXS5zZXRCQ29uc3QoKHVuaW9uQXJyYXlbaV0gPT0gcmlnaHRVbmlvbkFycmF5W2ldKSA/IGZhbHNlIDogdHJ1ZSk7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlICYmICJEZWZhdWx0IG1pc3NpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBFT3BMZXNzVGhhbjoKKyAgICAgICAgICAgICAgICBhc3NlcnQob2JqZWN0U2l6ZSA9PSAxKTsKKyAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5LT5zZXRCQ29uc3QoKnVuaW9uQXJyYXkgPCAqcmlnaHRVbmlvbkFycmF5KTsKKyAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gVFR5cGUoRWJ0Qm9vbCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVPcEdyZWF0ZXJUaGFuOgorICAgICAgICAgICAgICAgIGFzc2VydChvYmplY3RTaXplID09IDEpOworICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXktPnNldEJDb25zdCgqdW5pb25BcnJheSA+ICpyaWdodFVuaW9uQXJyYXkpOworICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBUVHlwZShFYnRCb29sLCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRU9wTGVzc1RoYW5FcXVhbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChvYmplY3RTaXplID09IDEpOworICAgICAgICAgICAgICAgICAgICBDb25zdGFudFVuaW9uIGNvbnN0YW50OworICAgICAgICAgICAgICAgICAgICBjb25zdGFudC5zZXRCQ29uc3QoKnVuaW9uQXJyYXkgPiAqcmlnaHRVbmlvbkFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXktPnNldEJDb25zdCghY29uc3RhbnQuZ2V0QkNvbnN0KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gVFR5cGUoRWJ0Qm9vbCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRU9wR3JlYXRlclRoYW5FcXVhbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChvYmplY3RTaXplID09IDEpOworICAgICAgICAgICAgICAgICAgICBDb25zdGFudFVuaW9uIGNvbnN0YW50OworICAgICAgICAgICAgICAgICAgICBjb25zdGFudC5zZXRCQ29uc3QoKnVuaW9uQXJyYXkgPCAqcmlnaHRVbmlvbkFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXktPnNldEJDb25zdCghY29uc3RhbnQuZ2V0QkNvbnN0KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gVFR5cGUoRWJ0Qm9vbCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBFT3BFcXVhbDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0VHlwZSgpLmdldEJhc2ljVHlwZSgpID09IEVidFN0cnVjdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUNvbXBhcmVTdHJ1Y3R1cmUobm9kZS0+Z2V0VHlwZSgpLCBub2RlLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLCB1bmlvbkFycmF5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xOb2RlRmxhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlvbkFycmF5W2ldICE9IHJpZ2h0VW5pb25BcnJheVtpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xOb2RlRmxhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBicmVhayBvdXQgb2YgZm9yIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICAgICAgaWYgKCFib29sTm9kZUZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXktPnNldEJDb25zdCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb25zdEFycmF5LT5zZXRCQ29uc3QoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlbXBOb2RlID0gbmV3IFRJbnRlcm1Db25zdGFudFVuaW9uKHRlbXBDb25zdEFycmF5LCBUVHlwZShFYnRCb29sLCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSk7CisgICAgICAgICAgICAgICAgdGVtcE5vZGUtPnNldExpbmUoZ2V0TGluZSgpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wTm9kZTsKKworICAgICAgICAgICAgY2FzZSBFT3BOb3RFcXVhbDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0VHlwZSgpLmdldEJhc2ljVHlwZSgpID09IEVidFN0cnVjdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQ29tcGFyZVN0cnVjdHVyZShub2RlLT5nZXRUeXBlKCksIG5vZGUtPmdldFVuaW9uQXJyYXlQb2ludGVyKCksIHVuaW9uQXJyYXkpKQorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbE5vZGVGbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdFNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuaW9uQXJyYXlbaV0gPT0gcmlnaHRVbmlvbkFycmF5W2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbE5vZGVGbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGJyZWFrIG91dCBvZiBmb3IgbG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgICAgICBpZiAoIWJvb2xOb2RlRmxhZykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uc3RBcnJheS0+c2V0QkNvbnN0KHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbnN0QXJyYXktPnNldEJDb25zdChmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGVtcE5vZGUgPSBuZXcgVEludGVybUNvbnN0YW50VW5pb24odGVtcENvbnN0QXJyYXksIFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpKTsKKyAgICAgICAgICAgICAgICB0ZW1wTm9kZS0+c2V0TGluZShnZXRMaW5lKCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBOb2RlOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkludmFsaWQgb3BlcmF0b3IgZm9yIGNvbnN0YW50IGZvbGRpbmciLCBnZXRMaW5lKCkpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHRlbXBOb2RlID0gbmV3IFRJbnRlcm1Db25zdGFudFVuaW9uKHRlbXBDb25zdEFycmF5LCByZXR1cm5UeXBlKTsKKyAgICAgICAgdGVtcE5vZGUtPnNldExpbmUoZ2V0TGluZSgpKTsKKworICAgICAgICByZXR1cm4gdGVtcE5vZGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG8gdW5hcnkgb3BlcmF0aW9ucworICAgICAgICAvLworICAgICAgICBUSW50ZXJtQ29uc3RhbnRVbmlvbiAqbmV3Tm9kZSA9IDA7CisgICAgICAgIENvbnN0YW50VW5pb24qIHRlbXBDb25zdEFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bb2JqZWN0U2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVPcE5lZ2F0aXZlOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGdldFR5cGUoKS5nZXRCYXNpY1R5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFYnRGbG9hdDogdGVtcENvbnN0QXJyYXlbaV0uc2V0RkNvbnN0KC11bmlvbkFycmF5W2ldLmdldEZDb25zdCgpKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVidEludDogICB0ZW1wQ29uc3RBcnJheVtpXS5zZXRJQ29uc3QoLXVuaW9uQXJyYXlbaV0uZ2V0SUNvbnN0KCkpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhJbnRlcm5hbEVycm9yLCAiVW5hcnkgb3BlcmF0aW9uIG5vdCBmb2xkZWQgaW50byBjb25zdGFudCIsIGdldExpbmUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFT3BMb2dpY2FsTm90OiAvLyB0aGlzIGNvZGUgaXMgd3JpdHRlbiBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSwgd2lsbCBub3QgZ2V0IGV4ZWN1dGVkIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGdldFR5cGUoKS5nZXRCYXNpY1R5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFYnRCb29sOiAgdGVtcENvbnN0QXJyYXlbaV0uc2V0QkNvbnN0KCF1bmlvbkFycmF5W2ldLmdldEJDb25zdCgpKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIlVuYXJ5IG9wZXJhdGlvbiBub3QgZm9sZGVkIGludG8gY29uc3RhbnQiLCBnZXRMaW5lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5ld05vZGUgPSBuZXcgVEludGVybUNvbnN0YW50VW5pb24odGVtcENvbnN0QXJyYXksIGdldFR5cGUoKSk7CisgICAgICAgIG5ld05vZGUtPnNldExpbmUoZ2V0TGluZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ld05vZGU7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7Cit9CisKK1RJbnRlcm1UeXBlZCogVEludGVybWVkaWF0ZTo6cHJvbW90ZUNvbnN0YW50VW5pb24oVEJhc2ljVHlwZSBwcm9tb3RlVG8sIFRJbnRlcm1Db25zdGFudFVuaW9uKiBub2RlKQoreworICAgIENvbnN0YW50VW5pb24gKnJpZ2h0VW5pb25BcnJheSA9IG5vZGUtPmdldFVuaW9uQXJyYXlQb2ludGVyKCk7CisgICAgaW50IHNpemUgPSBub2RlLT5nZXRUeXBlKCkuZ2V0T2JqZWN0U2l6ZSgpOworCisgICAgQ29uc3RhbnRVbmlvbiAqbGVmdFVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvbltzaXplXTsKKworICAgIGZvciAoaW50IGk9MDsgaSA8IHNpemU7IGkrKykgeworCisgICAgICAgIHN3aXRjaCAocHJvbW90ZVRvKSB7CisgICAgICAgICAgICBjYXNlIEVidEZsb2F0OgorICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+Z2V0VHlwZSgpLmdldEJhc2ljVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRWJ0SW50OgorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFVuaW9uQXJyYXlbaV0uc2V0RkNvbnN0KHN0YXRpY19jYXN0PGZsb2F0PihyaWdodFVuaW9uQXJyYXlbaV0uZ2V0SUNvbnN0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEVidEJvb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0VW5pb25BcnJheVtpXS5zZXRGQ29uc3Qoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJpZ2h0VW5pb25BcnJheVtpXS5nZXRCQ29uc3QoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRWJ0RmxvYXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0VW5pb25BcnJheVtpXSA9IHJpZ2h0VW5pb25BcnJheVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhJbnRlcm5hbEVycm9yLCAiQ2Fubm90IHByb21vdGUiLCBub2RlLT5nZXRMaW5lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFYnRJbnQ6CisgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlLT5nZXRUeXBlKCkuZ2V0QmFzaWNUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFYnRJbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0VW5pb25BcnJheVtpXSA9IHJpZ2h0VW5pb25BcnJheVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEVidEJvb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0VW5pb25BcnJheVtpXS5zZXRJQ29uc3Qoc3RhdGljX2Nhc3Q8aW50PihyaWdodFVuaW9uQXJyYXlbaV0uZ2V0QkNvbnN0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEVidEZsb2F0OgorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFVuaW9uQXJyYXlbaV0uc2V0SUNvbnN0KHN0YXRpY19jYXN0PGludD4ocmlnaHRVbmlvbkFycmF5W2ldLmdldEZDb25zdCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkNhbm5vdCBwcm9tb3RlIiwgbm9kZS0+Z2V0TGluZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRWJ0Qm9vbDoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUtPmdldFR5cGUoKS5nZXRCYXNpY1R5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEVidEludDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRVbmlvbkFycmF5W2ldLnNldEJDb25zdChyaWdodFVuaW9uQXJyYXlbaV0uZ2V0SUNvbnN0KCkgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFYnRCb29sOgorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFVuaW9uQXJyYXlbaV0gPSByaWdodFVuaW9uQXJyYXlbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFYnRGbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRVbmlvbkFycmF5W2ldLnNldEJDb25zdChyaWdodFVuaW9uQXJyYXlbaV0uZ2V0RkNvbnN0KCkgIT0gMC4wZik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkNhbm5vdCBwcm9tb3RlIiwgbm9kZS0+Z2V0TGluZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEludGVybmFsRXJyb3IsICJJbmNvcnJlY3QgZGF0YSB0eXBlIGZvdW5kIiwgbm9kZS0+Z2V0TGluZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgY29uc3QgVFR5cGUmIHQgPSBub2RlLT5nZXRUeXBlKCk7CisKKyAgICByZXR1cm4gYWRkQ29uc3RhbnRVbmlvbihsZWZ0VW5pb25BcnJheSwgVFR5cGUocHJvbW90ZVRvLCB0LmdldFByZWNpc2lvbigpLCB0LmdldFF1YWxpZmllcigpLCB0LmdldE5vbWluYWxTaXplKCksIHQuaXNNYXRyaXgoKSwgdC5pc0FycmF5KCkpLCBub2RlLT5nZXRMaW5lKCkpOworfQorCit2b2lkIFRJbnRlcm1BZ2dyZWdhdGU6OmFkZFRvUHJhZ21hVGFibGUoY29uc3QgVFByYWdtYVRhYmxlJiBwVGFibGUpCit7CisgICAgYXNzZXJ0KCFwcmFnbWFUYWJsZSk7CisgICAgcHJhZ21hVGFibGUgPSBuZXcgVFByYWdtYVRhYmxlKCk7CisgICAgKnByYWdtYVRhYmxlID0gcFRhYmxlOworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvTU1hcC5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvTU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDg2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9NTWFwLmgKQEAgLTAsMCArMSw1NiBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2lmbmRlZiBfTU1BUF9JTkNMVURFRF8KKyNkZWZpbmUgX01NQVBfSU5DTFVERURfCisKKy8vCisvLyBFbmNhcHN1bGF0ZSBtZW1vcnkgbWFwcGVkIGZpbGVzCisvLworCitjbGFzcyBUTU1hcCB7CitwdWJsaWM6CisgICAgVE1NYXAoY29uc3QgY2hhciogZmlsZU5hbWUpIDogCisgICAgICAgIGZTaXplKC0xKSwgLy8gLTEgaXMgdGhlIGVycm9yIHZhbHVlIHJldHVybmVkIGJ5IEdldEZpbGVTaXplKCkKKyAgICAgICAgZnAoTlVMTCksCisgICAgICAgIGZCdWZmKDApICAgLy8gMCBpcyB0aGUgZXJyb3IgdmFsdWUgcmV0dXJuZWQgYnkgTWFwVmlld09mRmlsZSgpCisgICAgeworICAgICAgICBpZiAoKGZwID0gZm9wZW4oZmlsZU5hbWUsICJyIikpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNoYXIgYyA9IGdldGMoZnApOworICAgICAgICBmU2l6ZSA9IDA7CisgICAgICAgIHdoaWxlIChjICE9IEVPRikgeworICAgICAgICAgICAgZlNpemUrKzsKKyAgICAgICAgICAgIGMgPSBnZXRjKGZwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSBFT0YpCisgICAgICAgICAgICBmU2l6ZSsrOworICAgICAgICByZXdpbmQoZnApOworICAgICAgICBmQnVmZiA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpICogZlNpemUpOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBjID0gZ2V0YyhmcCk7CisgICAgICAgIHdoaWxlIChjICE9IEVPRikgeworICAgICAgICAgICAgZkJ1ZmZbY291bnQrK10gPSBjOworICAgICAgICAgICAgYyA9IGdldGMoZnApOworICAgICAgICB9CisgICAgICAgIGZCdWZmW2NvdW50KytdID0gYzsKKyAgICB9CisKKyAgICBjaGFyKiBnZXREYXRhKCkgeyByZXR1cm4gZkJ1ZmY7IH0KKyAgICBpbnQgICBnZXRTaXplKCkgeyByZXR1cm4gZlNpemU7IH0KKworICAgIH5UTU1hcCgpIHsKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpCisgICAgICAgICAgICBmY2xvc2UoZnApOworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgaW50ICAgICAgICAgICAgIGZTaXplOyAgICAgIC8vIHNpemUgb2YgZmlsZSB0byBtYXAgaW4KKyAgICBGSUxFICpmcDsKKyAgICBjaGFyKiAgICAgICAgICAgZkJ1ZmY7ICAgICAgLy8gdGhlIGFjdHVhbCBkYXRhOworfTsKKworI2VuZGlmIC8vIF9NTUFQX0lOQ0xVREVEXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvTWFwTG9uZ1ZhcmlhYmxlTmFtZXMuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvTWFwTG9uZ1ZhcmlhYmxlTmFtZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzU1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9NYXBMb25nVmFyaWFibGVOYW1lcy5jcHAKQEAgLTAsMCArMSw2OSBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDExIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2luY2x1ZGUgImNvbXBpbGVyL01hcExvbmdWYXJpYWJsZU5hbWVzLmgiCisKK25hbWVzcGFjZSB7CisKK1RTdHJpbmcgbWFwTG9uZ05hbWUoaW50IGlkLCBjb25zdCBUU3RyaW5nJiBuYW1lLCBib29sIGlzVmFyeWluZykKK3sKKyAgICBBU1NFUlQobmFtZS5zaXplKCkgPiBNQVhfSURFTlRJRklFUl9OQU1FX1NJWkUpOworICAgIFRTdHJpbmdTdHJlYW0gc3RyZWFtOworICAgIHN0cmVhbSA8PCAid2ViZ2xfIjsKKyAgICBpZiAoaXNWYXJ5aW5nKQorICAgICAgICBzdHJlYW0gPDwgInYiOworICAgIHN0cmVhbSA8PCBpZCA8PCAiXyI7CisgICAgc3RyZWFtIDw8IG5hbWUuc3Vic3RyKDAsIE1BWF9JREVOVElGSUVSX05BTUVfU0laRSAtIHN0cmVhbS5zdHIoKS5zaXplKCkpOworICAgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworTWFwTG9uZ1ZhcmlhYmxlTmFtZXM6Ok1hcExvbmdWYXJpYWJsZU5hbWVzKAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcnlpbmdMb25nTmFtZU1hcCkKKyAgICA6IG1WYXJ5aW5nTG9uZ05hbWVNYXAodmFyeWluZ0xvbmdOYW1lTWFwKQoreworfQorCit2b2lkIE1hcExvbmdWYXJpYWJsZU5hbWVzOjp2aXNpdFN5bWJvbChUSW50ZXJtU3ltYm9sKiBzeW1ib2wpCit7CisgICAgQVNTRVJUKHN5bWJvbCAhPSBOVUxMKTsKKyAgICBpZiAoc3ltYm9sLT5nZXRTeW1ib2woKS5zaXplKCkgPiBNQVhfSURFTlRJRklFUl9OQU1FX1NJWkUpIHsKKyAgICAgICAgc3dpdGNoIChzeW1ib2wtPmdldFF1YWxpZmllcigpKSB7CisgICAgICAgICAgY2FzZSBFdnFWYXJ5aW5nSW46CisgICAgICAgICAgY2FzZSBFdnFWYXJ5aW5nT3V0OgorICAgICAgICAgIGNhc2UgRXZxSW52YXJpYW50VmFyeWluZ0luOgorICAgICAgICAgIGNhc2UgRXZxSW52YXJpYW50VmFyeWluZ091dDoKKyAgICAgICAgICAgIHN5bWJvbC0+c2V0U3ltYm9sKAorICAgICAgICAgICAgICAgIG1hcFZhcnlpbmdMb25nTmFtZShzeW1ib2wtPmdldFN5bWJvbCgpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3ltYm9sLT5zZXRTeW1ib2woCisgICAgICAgICAgICAgICAgbWFwTG9uZ05hbWUoc3ltYm9sLT5nZXRJZCgpLCBzeW1ib2wtPmdldFN5bWJvbCgpLCBmYWxzZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07CisgICAgfQorfQorCitib29sIE1hcExvbmdWYXJpYWJsZU5hbWVzOjp2aXNpdExvb3AoVmlzaXQsIFRJbnRlcm1Mb29wKiBub2RlKQoreworICAgIGlmIChub2RlLT5nZXRJbml0KCkpCisgICAgICAgIG5vZGUtPmdldEluaXQoKS0+dHJhdmVyc2UodGhpcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1RTdHJpbmcgTWFwTG9uZ1ZhcmlhYmxlTmFtZXM6Om1hcFZhcnlpbmdMb25nTmFtZShjb25zdCBUU3RyaW5nJiBuYW1lKQoreworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVZhcnlpbmdMb25nTmFtZU1hcC5maW5kKG5hbWUuY19zdHIoKSk7CisgICAgaWYgKGl0ICE9IG1WYXJ5aW5nTG9uZ05hbWVNYXAuZW5kKCkpCisgICAgICAgIHJldHVybiAoKml0KS5zZWNvbmQuY19zdHIoKTsKKworICAgIGludCBpZCA9IG1WYXJ5aW5nTG9uZ05hbWVNYXAuc2l6ZSgpOworICAgIFRTdHJpbmcgbWFwcGVkTmFtZSA9IG1hcExvbmdOYW1lKGlkLCBuYW1lLCB0cnVlKTsKKyAgICBtVmFyeWluZ0xvbmdOYW1lTWFwLmluc2VydCgKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6dmFsdWVfdHlwZShuYW1lLmNfc3RyKCksIG1hcHBlZE5hbWUuY19zdHIoKSkpOworICAgIHJldHVybiBtYXBwZWROYW1lOworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvTWFwTG9uZ1ZhcmlhYmxlTmFtZXMuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL01hcExvbmdWYXJpYWJsZU5hbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmMTliOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL01hcExvbmdWYXJpYWJsZU5hbWVzLmgKQEAgLTAsMCArMSwzMyBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDExIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2lmbmRlZiBDT01QSUxFUl9NQVBfTE9OR19WQVJJQUJMRV9OQU1FU19IXworI2RlZmluZSBDT01QSUxFUl9NQVBfTE9OR19WQVJJQUJMRV9OQU1FU19IXworCisjaW5jbHVkZSAiR0xTTEFORy9TaGFkZXJMYW5nLmgiCisKKyNpbmNsdWRlICJjb21waWxlci9pbnRlcm1lZGlhdGUuaCIKKyNpbmNsdWRlICJjb21waWxlci9WYXJpYWJsZUluZm8uaCIKKworLy8gVGhpcyBzaXplIGRvZXMgbm90IGluY2x1ZGUgJ1wwJyBpbiB0aGUgZW5kLgorI2RlZmluZSBNQVhfSURFTlRJRklFUl9OQU1FX1NJWkUgMzIKKworLy8gVHJhdmVyc2VzIGludGVybWVkaWF0ZSB0cmVlIHRvIG1hcCBhdHRyaWJ1dGVzIGFuZCB1bmlmb3JtcyBuYW1lcyB0aGF0IGFyZQorLy8gbG9uZ2VyIHRoYW4gTUFYX0lERU5USUZJRVJfTkFNRV9TSVpFIHRvIE1BWF9JREVOVElGSUVSX05BTUVfU0laRS4KK2NsYXNzIE1hcExvbmdWYXJpYWJsZU5hbWVzIDogcHVibGljIFRJbnRlcm1UcmF2ZXJzZXIgeworcHVibGljOgorICAgIE1hcExvbmdWYXJpYWJsZU5hbWVzKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcnlpbmdMb25nTmFtZU1hcCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdmlzaXRTeW1ib2woVEludGVybVN5bWJvbCopOworICAgIHZpcnR1YWwgYm9vbCB2aXNpdExvb3AoVmlzaXQsIFRJbnRlcm1Mb29wKik7CisKK3ByaXZhdGU6CisgICAgVFN0cmluZyBtYXBWYXJ5aW5nTG9uZ05hbWUoY29uc3QgVFN0cmluZyYgbmFtZSk7CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBtVmFyeWluZ0xvbmdOYW1lTWFwOworfTsKKworI2VuZGlmICAvLyBDT01QSUxFUl9NQVBfTE9OR19WQVJJQUJMRV9OQU1FU19IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvT3V0cHV0R0xTTC5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9PdXRwdXRHTFNMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjI0ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvT3V0cHV0R0xTTC5jcHAKQEAgLTAsMCArMSw3MTAgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMSBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9PdXRwdXRHTFNMLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvZGVidWcuaCIKKworbmFtZXNwYWNlCit7CitUU3RyaW5nIGdldFR5cGVOYW1lKGNvbnN0IFRUeXBlJiB0eXBlKQoreworICAgIFRJbmZvU2lua0Jhc2Ugb3V0OworICAgIGlmICh0eXBlLmlzTWF0cml4KCkpCisgICAgeworICAgICAgICBvdXQgPDwgIm1hdCI7CisgICAgICAgIG91dCA8PCB0eXBlLmdldE5vbWluYWxTaXplKCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUuaXNWZWN0b3IoKSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZS5nZXRCYXNpY1R5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBFYnRGbG9hdDogb3V0IDw8ICJ2ZWMiOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRWJ0SW50OiBvdXQgPDwgIml2ZWMiOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRWJ0Qm9vbDogb3V0IDw8ICJidmVjIjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgdHlwZS5nZXROb21pbmFsU2l6ZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAodHlwZS5nZXRCYXNpY1R5cGUoKSA9PSBFYnRTdHJ1Y3QpCisgICAgICAgICAgICBvdXQgPDwgdHlwZS5nZXRUeXBlTmFtZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQgPDwgdHlwZS5nZXRCYXNpY1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gVFN0cmluZyhvdXQuY19zdHIoKSk7Cit9CisKK1RTdHJpbmcgYXJyYXlCcmFja2V0cyhjb25zdCBUVHlwZSYgdHlwZSkKK3sKKyAgICBBU1NFUlQodHlwZS5pc0FycmF5KCkpOworICAgIFRJbmZvU2lua0Jhc2Ugb3V0OworICAgIG91dCA8PCAiWyIgPDwgdHlwZS5nZXRBcnJheVNpemUoKSA8PCAiXSI7CisgICAgcmV0dXJuIFRTdHJpbmcob3V0LmNfc3RyKCkpOworfQorCitib29sIGlzU2luZ2xlU3RhdGVtZW50KFRJbnRlcm1Ob2RlKiBub2RlKSB7CisgICAgaWYgKGNvbnN0IFRJbnRlcm1BZ2dyZWdhdGUqIGFnZ3JlZ2F0ZSA9IG5vZGUtPmdldEFzQWdncmVnYXRlKCkpCisgICAgeworICAgICAgICByZXR1cm4gKGFnZ3JlZ2F0ZS0+Z2V0T3AoKSAhPSBFT3BGdW5jdGlvbikgJiYKKyAgICAgICAgICAgICAgIChhZ2dyZWdhdGUtPmdldE9wKCkgIT0gRU9wU2VxdWVuY2UpOworICAgIH0KKyAgICBlbHNlIGlmIChjb25zdCBUSW50ZXJtU2VsZWN0aW9uKiBzZWxlY3Rpb24gPSBub2RlLT5nZXRBc1NlbGVjdGlvbk5vZGUoKSkKKyAgICB7CisgICAgICAgIC8vIFRlcm5hcnkgb3BlcmF0b3JzIGFyZSB1c3VhbGx5IHBhcnQgb2YgYW4gYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRob3NlIHJhcmUgY2FzZXMgaW4gd2hpY2ggdGhleSBhcmUgYWxsIGJ5IHRoZW1zZWx2ZXMuCisgICAgICAgIHJldHVybiBzZWxlY3Rpb24tPnVzZXNUZXJuYXJ5T3BlcmF0b3IoKTsKKyAgICB9CisgICAgZWxzZSBpZiAobm9kZS0+Z2V0QXNMb29wTm9kZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCitUT3V0cHV0R0xTTDo6VE91dHB1dEdMU0woVEluZm9TaW5rQmFzZSYgb2JqU2luaykKKyAgICA6IFRJbnRlcm1UcmF2ZXJzZXIodHJ1ZSwgdHJ1ZSwgdHJ1ZSksCisgICAgICBtT2JqU2luayhvYmpTaW5rKSwKKyAgICAgIG1EZWNsYXJpbmdWYXJpYWJsZXMoZmFsc2UpCit7Cit9CisKK3ZvaWQgVE91dHB1dEdMU0w6OndyaXRlVHJpcGxldChWaXNpdCB2aXNpdCwgY29uc3QgY2hhciogcHJlU3RyLCBjb25zdCBjaGFyKiBpblN0ciwgY29uc3QgY2hhciogcG9zdFN0cikKK3sKKyAgICBUSW5mb1NpbmtCYXNlJiBvdXQgPSBvYmpTaW5rKCk7CisgICAgaWYgKHZpc2l0ID09IFByZVZpc2l0ICYmIHByZVN0cikKKyAgICB7CisgICAgICAgIG91dCA8PCBwcmVTdHI7CisgICAgfQorICAgIGVsc2UgaWYgKHZpc2l0ID09IEluVmlzaXQgJiYgaW5TdHIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5TdHI7CisgICAgfQorICAgIGVsc2UgaWYgKHZpc2l0ID09IFBvc3RWaXNpdCAmJiBwb3N0U3RyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IHBvc3RTdHI7CisgICAgfQorfQorCit2b2lkIFRPdXRwdXRHTFNMOjp3cml0ZVZhcmlhYmxlVHlwZShjb25zdCBUVHlwZSYgdHlwZSkKK3sKKyAgICBUSW5mb1NpbmtCYXNlJiBvdXQgPSBvYmpTaW5rKCk7CisgICAgVFF1YWxpZmllciBxdWFsaWZpZXIgPSB0eXBlLmdldFF1YWxpZmllcigpOworICAgIC8vIFRPRE8oYWxva3ApOiBWYWxpZGF0ZSBxdWFsaWZpZXIgZm9yIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KKyAgICBpZiAoKHF1YWxpZmllciAhPSBFdnFUZW1wb3JhcnkpICYmIChxdWFsaWZpZXIgIT0gRXZxR2xvYmFsKSkKKyAgICAgICAgb3V0IDw8IHR5cGUuZ2V0UXVhbGlmaWVyU3RyaW5nKCkgPDwgIiAiOworCisgICAgLy8gRGVjbGFyZSB0aGUgc3RydWN0IGlmIHdlIGhhdmUgbm90IGRvbmUgc28gYWxyZWFkeS4KKyAgICBpZiAoKHR5cGUuZ2V0QmFzaWNUeXBlKCkgPT0gRWJ0U3RydWN0KSAmJgorICAgICAgICAobURlY2xhcmVkU3RydWN0cy5maW5kKHR5cGUuZ2V0VHlwZU5hbWUoKSkgPT0gbURlY2xhcmVkU3RydWN0cy5lbmQoKSkpCisgICAgeworICAgICAgICBvdXQgPDwgInN0cnVjdCAiIDw8IHR5cGUuZ2V0VHlwZU5hbWUoKSA8PCAie1xuIjsKKyAgICAgICAgY29uc3QgVFR5cGVMaXN0KiBzdHJ1Y3R1cmUgPSB0eXBlLmdldFN0cnVjdCgpOworICAgICAgICBBU1NFUlQoc3RydWN0dXJlICE9IE5VTEwpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cnVjdHVyZS0+c2l6ZSgpOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFRUeXBlKiBmaWVsZFR5cGUgPSAoKnN0cnVjdHVyZSlbaV0udHlwZTsKKyAgICAgICAgICAgIEFTU0VSVChmaWVsZFR5cGUgIT0gTlVMTCk7CisgICAgICAgICAgICBvdXQgPDwgZ2V0VHlwZU5hbWUoKmZpZWxkVHlwZSkgPDwgIiAiIDw8IGZpZWxkVHlwZS0+Z2V0RmllbGROYW1lKCk7CisgICAgICAgICAgICBpZiAoZmllbGRUeXBlLT5pc0FycmF5KCkpCisgICAgICAgICAgICAgICAgb3V0IDw8IGFycmF5QnJhY2tldHMoKmZpZWxkVHlwZSk7CisgICAgICAgICAgICBvdXQgPDwgIjtcbiI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICJ9IjsKKyAgICAgICAgbURlY2xhcmVkU3RydWN0cy5pbnNlcnQodHlwZS5nZXRUeXBlTmFtZSgpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGdldFR5cGVOYW1lKHR5cGUpOworICAgIH0KK30KKwordm9pZCBUT3V0cHV0R0xTTDo6d3JpdGVGdW5jdGlvblBhcmFtZXRlcnMoY29uc3QgVEludGVybVNlcXVlbmNlJiBhcmdzKQoreworICAgIFRJbmZvU2lua0Jhc2UmIG91dCA9IG9ialNpbmsoKTsKKyAgICBmb3IgKFRJbnRlcm1TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGFyZ3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIgIT0gYXJncy5lbmQoKTsgKytpdGVyKQorICAgIHsKKyAgICAgICAgY29uc3QgVEludGVybVN5bWJvbCogYXJnID0gKCppdGVyKS0+Z2V0QXNTeW1ib2xOb2RlKCk7CisgICAgICAgIEFTU0VSVChhcmcgIT0gTlVMTCk7CisKKyAgICAgICAgY29uc3QgVFR5cGUmIHR5cGUgPSBhcmctPmdldFR5cGUoKTsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsaWZpZXIgPSB0eXBlLmdldFF1YWxpZmllcigpOworICAgICAgICAvLyBUT0RPKGFsb2twKTogVmFsaWRhdGUgcXVhbGlmaWVyIGZvciBmdW5jdGlvbiBhcmd1bWVudHMuCisgICAgICAgIGlmICgocXVhbGlmaWVyICE9IEV2cVRlbXBvcmFyeSkgJiYgKHF1YWxpZmllciAhPSBFdnFHbG9iYWwpKQorICAgICAgICAgICAgb3V0IDw8IHR5cGUuZ2V0UXVhbGlmaWVyU3RyaW5nKCkgPDwgIiAiOworCisgICAgICAgIG91dCA8PCBnZXRUeXBlTmFtZSh0eXBlKTsKKworICAgICAgICBjb25zdCBUU3RyaW5nJiBuYW1lID0gYXJnLT5nZXRTeW1ib2woKTsKKyAgICAgICAgaWYgKCFuYW1lLmVtcHR5KCkpCisgICAgICAgICAgICBvdXQgPDwgIiAiIDw8IG5hbWU7CisgICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkKKyAgICAgICAgICAgIG91dCA8PCBhcnJheUJyYWNrZXRzKHR5cGUpOworCisgICAgICAgIC8vIFB1dCBhIGNvbW1hIGlmIHRoaXMgaXMgbm90IHRoZSBsYXN0IGFyZ3VtZW50LgorICAgICAgICBpZiAoaXRlciAhPSBhcmdzLmVuZCgpIC0gMSkKKyAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgIH0KK30KKworY29uc3QgQ29uc3RhbnRVbmlvbiogVE91dHB1dEdMU0w6OndyaXRlQ29uc3RhbnRVbmlvbihjb25zdCBUVHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RhbnRVbmlvbiogcENvbnN0VW5pb24pCit7CisgICAgVEluZm9TaW5rQmFzZSYgb3V0ID0gb2JqU2luaygpOworCisgICAgaWYgKHR5cGUuZ2V0QmFzaWNUeXBlKCkgPT0gRWJ0U3RydWN0KQorICAgIHsKKyAgICAgICAgb3V0IDw8IHR5cGUuZ2V0VHlwZU5hbWUoKSA8PCAiKCI7CisgICAgICAgIGNvbnN0IFRUeXBlTGlzdCogc3RydWN0dXJlID0gdHlwZS5nZXRTdHJ1Y3QoKTsKKyAgICAgICAgQVNTRVJUKHN0cnVjdHVyZSAhPSBOVUxMKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJ1Y3R1cmUtPnNpemUoKTsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBUVHlwZSogZmllbGRUeXBlID0gKCpzdHJ1Y3R1cmUpW2ldLnR5cGU7CisgICAgICAgICAgICBBU1NFUlQoZmllbGRUeXBlICE9IE5VTEwpOworICAgICAgICAgICAgcENvbnN0VW5pb24gPSB3cml0ZUNvbnN0YW50VW5pb24oKmZpZWxkVHlwZSwgcENvbnN0VW5pb24pOworICAgICAgICAgICAgaWYgKGkgIT0gc3RydWN0dXJlLT5zaXplKCkgLSAxKSBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIikiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgc2l6ZSA9IHR5cGUuZ2V0T2JqZWN0U2l6ZSgpOworICAgICAgICBib29sIHdyaXRlVHlwZSA9IHNpemUgPiAxOworICAgICAgICBpZiAod3JpdGVUeXBlKSBvdXQgPDwgZ2V0VHlwZU5hbWUodHlwZSkgPDwgIigiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSwgKytwQ29uc3RVbmlvbikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChwQ29uc3RVbmlvbi0+Z2V0VHlwZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRWJ0RmxvYXQ6IG91dCA8PCBwQ29uc3RVbmlvbi0+Z2V0RkNvbnN0KCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRWJ0SW50OiBvdXQgPDwgcENvbnN0VW5pb24tPmdldElDb25zdCgpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVidEJvb2w6IG91dCA8PCBwQ29uc3RVbmlvbi0+Z2V0QkNvbnN0KCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSAhPSBzaXplIC0gMSkgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyaXRlVHlwZSkgb3V0IDw8ICIpIjsKKyAgICB9CisgICAgcmV0dXJuIHBDb25zdFVuaW9uOworfQorCit2b2lkIFRPdXRwdXRHTFNMOjp2aXNpdFN5bWJvbChUSW50ZXJtU3ltYm9sKiBub2RlKQoreworICAgIFRJbmZvU2lua0Jhc2UmIG91dCA9IG9ialNpbmsoKTsKKyAgICBpZiAobUxvb3BVbnJvbGwuTmVlZHNUb1JlcGxhY2VTeW1ib2xXaXRoVmFsdWUobm9kZSkpCisgICAgICAgIG91dCA8PCBtTG9vcFVucm9sbC5HZXRMb29wSW5kZXhWYWx1ZShub2RlKTsKKyAgICBlbHNlCisgICAgICAgIG91dCA8PCBub2RlLT5nZXRTeW1ib2woKTsKKworICAgIGlmIChtRGVjbGFyaW5nVmFyaWFibGVzICYmIG5vZGUtPmdldFR5cGUoKS5pc0FycmF5KCkpCisgICAgICAgIG91dCA8PCBhcnJheUJyYWNrZXRzKG5vZGUtPmdldFR5cGUoKSk7Cit9CisKK3ZvaWQgVE91dHB1dEdMU0w6OnZpc2l0Q29uc3RhbnRVbmlvbihUSW50ZXJtQ29uc3RhbnRVbmlvbiogbm9kZSkKK3sKKyAgICB3cml0ZUNvbnN0YW50VW5pb24obm9kZS0+Z2V0VHlwZSgpLCBub2RlLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpKTsKK30KKworYm9vbCBUT3V0cHV0R0xTTDo6dmlzaXRCaW5hcnkoVmlzaXQgdmlzaXQsIFRJbnRlcm1CaW5hcnkqIG5vZGUpCit7CisgICAgYm9vbCB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKKyAgICBUSW5mb1NpbmtCYXNlJiBvdXQgPSBvYmpTaW5rKCk7CisgICAgc3dpdGNoIChub2RlLT5nZXRPcCgpKQorICAgIHsKKyAgICAgICAgY2FzZSBFT3BJbml0aWFsaXplOgorICAgICAgICAgICAgaWYgKHZpc2l0ID09IEluVmlzaXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIgPSAiOworICAgICAgICAgICAgICAgIC8vIFJIUyBvZiBpbml0aWFsaXplIGlzIG5vdCBiZWluZyBkZWNsYXJlZC4KKyAgICAgICAgICAgICAgICBtRGVjbGFyaW5nVmFyaWFibGVzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BBc3NpZ246IHdyaXRlVHJpcGxldCh2aXNpdCwgIigiLCAiID0gIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQWRkQXNzaWduOiB3cml0ZVRyaXBsZXQodmlzaXQsICIoIiwgIiArPSAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BTdWJBc3NpZ246IHdyaXRlVHJpcGxldCh2aXNpdCwgIigiLCAiIC09ICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcERpdkFzc2lnbjogd3JpdGVUcmlwbGV0KHZpc2l0LCAiKCIsICIgLz0gIiwgIikiKTsgYnJlYWs7CisgICAgICAgIC8vIE5vdGljZSB0aGUgZmFsbC10aHJvdWdoLgorICAgICAgICBjYXNlIEVPcE11bEFzc2lnbjogCisgICAgICAgIGNhc2UgRU9wVmVjdG9yVGltZXNNYXRyaXhBc3NpZ246CisgICAgICAgIGNhc2UgRU9wVmVjdG9yVGltZXNTY2FsYXJBc3NpZ246CisgICAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNTY2FsYXJBc3NpZ246CisgICAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNNYXRyaXhBc3NpZ246CisgICAgICAgICAgICB3cml0ZVRyaXBsZXQodmlzaXQsICIoIiwgIiAqPSAiLCAiKSIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFT3BJbmRleERpcmVjdDoKKyAgICAgICAgY2FzZSBFT3BJbmRleEluZGlyZWN0OgorICAgICAgICAgICAgd3JpdGVUcmlwbGV0KHZpc2l0LCBOVUxMLCAiWyIsICJdIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BJbmRleERpcmVjdFN0cnVjdDoKKyAgICAgICAgICAgIGlmICh2aXNpdCA9PSBJblZpc2l0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiLiI7CisgICAgICAgICAgICAgICAgLy8gVE9ETyhhbG9rcCk6IEFTU0VSVAorICAgICAgICAgICAgICAgIG91dCA8PCBub2RlLT5nZXRUeXBlKCkuZ2V0RmllbGROYW1lKCk7CisgICAgICAgICAgICAgICAgdmlzaXRDaGlsZHJlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wVmVjdG9yU3dpenpsZToKKyAgICAgICAgICAgIGlmICh2aXNpdCA9PSBJblZpc2l0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiLiI7CisgICAgICAgICAgICAgICAgVEludGVybUFnZ3JlZ2F0ZSogcmlnaHRDaGlsZCA9IG5vZGUtPmdldFJpZ2h0KCktPmdldEFzQWdncmVnYXRlKCk7CisgICAgICAgICAgICAgICAgVEludGVybVNlcXVlbmNlJiBzZXF1ZW5jZSA9IHJpZ2h0Q2hpbGQtPmdldFNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgZm9yIChUSW50ZXJtU2VxdWVuY2U6Oml0ZXJhdG9yIHNpdCA9IHNlcXVlbmNlLmJlZ2luKCk7IHNpdCAhPSBzZXF1ZW5jZS5lbmQoKTsgKytzaXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUSW50ZXJtQ29uc3RhbnRVbmlvbiogZWxlbWVudCA9ICgqc2l0KS0+Z2V0QXNDb25zdGFudFVuaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChlbGVtZW50LT5nZXRCYXNpY1R5cGUoKSA9PSBFYnRJbnQpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoZWxlbWVudC0+Z2V0Tm9taW5hbFNpemUoKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RhbnRVbmlvbiYgZGF0YSA9IGVsZW1lbnQtPmdldFVuaW9uQXJyYXlQb2ludGVyKClbMF07CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChkYXRhLmdldFR5cGUoKSA9PSBFYnRJbnQpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEuZ2V0SUNvbnN0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogb3V0IDw8ICJ4IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IG91dCA8PCAieSI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiBvdXQgPDwgInoiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogb3V0IDw8ICJ3IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2aXNpdENoaWxkcmVuID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVPcEFkZDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiKCIsICIgKyAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BTdWI6IHdyaXRlVHJpcGxldCh2aXNpdCwgIigiLCAiIC0gIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTXVsOiB3cml0ZVRyaXBsZXQodmlzaXQsICIoIiwgIiAqICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcERpdjogd3JpdGVUcmlwbGV0KHZpc2l0LCAiKCIsICIgLyAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BNb2Q6IFVOSU1QTEVNRU5URUQoKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wRXF1YWw6IHdyaXRlVHJpcGxldCh2aXNpdCwgIigiLCAiID09ICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcE5vdEVxdWFsOiB3cml0ZVRyaXBsZXQodmlzaXQsICIoIiwgIiAhPSAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BMZXNzVGhhbjogd3JpdGVUcmlwbGV0KHZpc2l0LCAiKCIsICIgPCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbjogd3JpdGVUcmlwbGV0KHZpc2l0LCAiKCIsICIgPiAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BMZXNzVGhhbkVxdWFsOiB3cml0ZVRyaXBsZXQodmlzaXQsICIoIiwgIiA8PSAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbkVxdWFsOiB3cml0ZVRyaXBsZXQodmlzaXQsICIoIiwgIiA+PSAiLCAiKSIpOyBicmVhazsKKworICAgICAgICAvLyBOb3RpY2UgdGhlIGZhbGwtdGhyb3VnaC4KKyAgICAgICAgY2FzZSBFT3BWZWN0b3JUaW1lc1NjYWxhcjoKKyAgICAgICAgY2FzZSBFT3BWZWN0b3JUaW1lc01hdHJpeDoKKyAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc1ZlY3RvcjoKKyAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc1NjYWxhcjoKKyAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc01hdHJpeDoKKyAgICAgICAgICAgIHdyaXRlVHJpcGxldCh2aXNpdCwgIigiLCAiICogIiwgIikiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wTG9naWNhbE9yOiB3cml0ZVRyaXBsZXQodmlzaXQsICIoIiwgIiB8fCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BMb2dpY2FsWG9yOiB3cml0ZVRyaXBsZXQodmlzaXQsICIoIiwgIiBeXiAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BMb2dpY2FsQW5kOiB3cml0ZVRyaXBsZXQodmlzaXQsICIoIiwgIiAmJiAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHZpc2l0Q2hpbGRyZW47Cit9CisKK2Jvb2wgVE91dHB1dEdMU0w6OnZpc2l0VW5hcnkoVmlzaXQgdmlzaXQsIFRJbnRlcm1VbmFyeSogbm9kZSkKK3sKKyAgICBzd2l0Y2ggKG5vZGUtPmdldE9wKCkpCisgICAgeworICAgICAgICBjYXNlIEVPcE5lZ2F0aXZlOiB3cml0ZVRyaXBsZXQodmlzaXQsICIoLSIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcFZlY3RvckxvZ2ljYWxOb3Q6IHdyaXRlVHJpcGxldCh2aXNpdCwgIm5vdCgiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BMb2dpY2FsTm90OiB3cml0ZVRyaXBsZXQodmlzaXQsICIoISIsIE5VTEwsICIpIik7IGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wUG9zdEluY3JlbWVudDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiKCIsIE5VTEwsICIrKykiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wUG9zdERlY3JlbWVudDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiKCIsIE5VTEwsICItLSkiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wUHJlSW5jcmVtZW50OiB3cml0ZVRyaXBsZXQodmlzaXQsICIoKysiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BQcmVEZWNyZW1lbnQ6IHdyaXRlVHJpcGxldCh2aXNpdCwgIigtLSIsIE5VTEwsICIpIik7IGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wQ29udkludFRvQm9vbDoKKyAgICAgICAgY2FzZSBFT3BDb252RmxvYXRUb0Jvb2w6CisgICAgICAgICAgICBzd2l0Y2ggKG5vZGUtPmdldE9wZXJhbmQoKS0+Z2V0VHlwZSgpLmdldE5vbWluYWxTaXplKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiB3cml0ZVRyaXBsZXQodmlzaXQsICJib29sKCIsIE5VTEwsICIpIik7ICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHdyaXRlVHJpcGxldCh2aXNpdCwgImJ2ZWMyKCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogd3JpdGVUcmlwbGV0KHZpc2l0LCAiYnZlYzMoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiB3cml0ZVRyaXBsZXQodmlzaXQsICJidmVjNCgiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29udkJvb2xUb0Zsb2F0OgorICAgICAgICBjYXNlIEVPcENvbnZJbnRUb0Zsb2F0OgorICAgICAgICAgICAgc3dpdGNoIChub2RlLT5nZXRPcGVyYW5kKCktPmdldFR5cGUoKS5nZXROb21pbmFsU2l6ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTogd3JpdGVUcmlwbGV0KHZpc2l0LCAiZmxvYXQoIiwgTlVMTCwgIikiKTsgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogd3JpdGVUcmlwbGV0KHZpc2l0LCAidmVjMigiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHdyaXRlVHJpcGxldCh2aXNpdCwgInZlYzMoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiB3cml0ZVRyaXBsZXQodmlzaXQsICJ2ZWM0KCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb252RmxvYXRUb0ludDoKKyAgICAgICAgY2FzZSBFT3BDb252Qm9vbFRvSW50OgorICAgICAgICAgICAgc3dpdGNoIChub2RlLT5nZXRPcGVyYW5kKCktPmdldFR5cGUoKS5nZXROb21pbmFsU2l6ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTogd3JpdGVUcmlwbGV0KHZpc2l0LCAiaW50KCIsIE5VTEwsICIpIik7ICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHdyaXRlVHJpcGxldCh2aXNpdCwgIml2ZWMyKCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogd3JpdGVUcmlwbGV0KHZpc2l0LCAiaXZlYzMoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiB3cml0ZVRyaXBsZXQodmlzaXQsICJpdmVjNCgiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFT3BSYWRpYW5zOiB3cml0ZVRyaXBsZXQodmlzaXQsICJyYWRpYW5zKCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcERlZ3JlZXM6IHdyaXRlVHJpcGxldCh2aXNpdCwgImRlZ3JlZXMoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wU2luOiB3cml0ZVRyaXBsZXQodmlzaXQsICJzaW4oIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29zOiB3cml0ZVRyaXBsZXQodmlzaXQsICJjb3MoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wVGFuOiB3cml0ZVRyaXBsZXQodmlzaXQsICJ0YW4oIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQXNpbjogd3JpdGVUcmlwbGV0KHZpc2l0LCAiYXNpbigiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BBY29zOiB3cml0ZVRyaXBsZXQodmlzaXQsICJhY29zKCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcEF0YW46IHdyaXRlVHJpcGxldCh2aXNpdCwgImF0YW4oIiwgTlVMTCwgIikiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFT3BFeHA6IHdyaXRlVHJpcGxldCh2aXNpdCwgImV4cCgiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BMb2c6IHdyaXRlVHJpcGxldCh2aXNpdCwgImxvZygiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BFeHAyOiB3cml0ZVRyaXBsZXQodmlzaXQsICJleHAyKCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcExvZzI6IHdyaXRlVHJpcGxldCh2aXNpdCwgImxvZzIoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wU3FydDogd3JpdGVUcmlwbGV0KHZpc2l0LCAic3FydCgiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BJbnZlcnNlU3FydDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiaW52ZXJzZXNxcnQoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFT3BBYnM6IHdyaXRlVHJpcGxldCh2aXNpdCwgImFicygiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BTaWduOiB3cml0ZVRyaXBsZXQodmlzaXQsICJzaWduKCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcEZsb29yOiB3cml0ZVRyaXBsZXQodmlzaXQsICJmbG9vcigiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDZWlsOiB3cml0ZVRyaXBsZXQodmlzaXQsICJjZWlsKCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcEZyYWN0OiB3cml0ZVRyaXBsZXQodmlzaXQsICJmcmFjdCgiLCBOVUxMLCAiKSIpOyBicmVhazsKKworICAgICAgICBjYXNlIEVPcExlbmd0aDogd3JpdGVUcmlwbGV0KHZpc2l0LCAibGVuZ3RoKCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcE5vcm1hbGl6ZTogd3JpdGVUcmlwbGV0KHZpc2l0LCAibm9ybWFsaXplKCIsIE5VTEwsICIpIik7IGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wREZkeDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiZEZkeCgiLCBOVUxMLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BERmR5OiB3cml0ZVRyaXBsZXQodmlzaXQsICJkRmR5KCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcEZ3aWR0aDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiZndpZHRoKCIsIE5VTEwsICIpIik7IGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wQW55OiB3cml0ZVRyaXBsZXQodmlzaXQsICJhbnkoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQWxsOiB3cml0ZVRyaXBsZXQodmlzaXQsICJhbGwoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVE91dHB1dEdMU0w6OnZpc2l0U2VsZWN0aW9uKFZpc2l0IHZpc2l0LCBUSW50ZXJtU2VsZWN0aW9uKiBub2RlKQoreworICAgIFRJbmZvU2lua0Jhc2UmIG91dCA9IG9ialNpbmsoKTsKKworICAgIGlmIChub2RlLT51c2VzVGVybmFyeU9wZXJhdG9yKCkpCisgICAgeworICAgICAgICAvLyBOb3RpY2UgdHdvIGJyYWNrZXRzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZC4gVGhlIG91dGVyIG9uZXMKKyAgICAgICAgLy8gZW5jYXBzdWxhdGUgdGhlIHdob2xlIHRlcm5hcnkgZXhwcmVzc2lvbi4gVGhpcyBwcmVzZXJ2ZXMgdGhlCisgICAgICAgIC8vIG9yZGVyIG9mIHByZWNlZGVuY2Ugd2hlbiB0ZXJuYXJ5IGV4cHJlc3Npb25zIGFyZSB1c2VkIGluIGEKKyAgICAgICAgLy8gY29tcG91bmQgZXhwcmVzc2lvbiwgaS5lLiwgYyA9IDIgKiAoYSA8IGIgPyAxIDogMikuCisgICAgICAgIG91dCA8PCAiKCgiOworICAgICAgICBub2RlLT5nZXRDb25kaXRpb24oKS0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgIG91dCA8PCAiKSA/ICgiOworICAgICAgICBub2RlLT5nZXRUcnVlQmxvY2soKS0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgIG91dCA8PCAiKSA6ICgiOworICAgICAgICBub2RlLT5nZXRGYWxzZUJsb2NrKCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICBvdXQgPDwgIikpIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJpZiAoIjsKKyAgICAgICAgbm9kZS0+Z2V0Q29uZGl0aW9uKCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICBvdXQgPDwgIilcbiI7CisKKyAgICAgICAgaW5jcmVtZW50RGVwdGgoKTsKKyAgICAgICAgdmlzaXRDb2RlQmxvY2sobm9kZS0+Z2V0VHJ1ZUJsb2NrKCkpOworCisgICAgICAgIGlmIChub2RlLT5nZXRGYWxzZUJsb2NrKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiZWxzZVxuIjsKKyAgICAgICAgICAgIHZpc2l0Q29kZUJsb2NrKG5vZGUtPmdldEZhbHNlQmxvY2soKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVjcmVtZW50RGVwdGgoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRPdXRwdXRHTFNMOjp2aXNpdEFnZ3JlZ2F0ZShWaXNpdCB2aXNpdCwgVEludGVybUFnZ3JlZ2F0ZSogbm9kZSkKK3sKKyAgICBib29sIHZpc2l0Q2hpbGRyZW4gPSB0cnVlOworICAgIFRJbmZvU2lua0Jhc2UmIG91dCA9IG9ialNpbmsoKTsKKyAgICBzd2l0Y2ggKG5vZGUtPmdldE9wKCkpCisgICAgeworICAgICAgICBjYXNlIEVPcFNlcXVlbmNlOiB7CisgICAgICAgICAgICAvLyBTY29wZSB0aGUgc2VxdWVuY2VzIGV4Y2VwdCB3aGVuIGF0IHRoZSBnbG9iYWwgc2NvcGUuCisgICAgICAgICAgICBpZiAoZGVwdGggPiAwKSBvdXQgPDwgIntcbiI7CisKKyAgICAgICAgICAgIGluY3JlbWVudERlcHRoKCk7CisgICAgICAgICAgICBjb25zdCBUSW50ZXJtU2VxdWVuY2UmIHNlcXVlbmNlID0gbm9kZS0+Z2V0U2VxdWVuY2UoKTsKKyAgICAgICAgICAgIGZvciAoVEludGVybVNlcXVlbmNlOjpjb25zdF9pdGVyYXRvciBpdGVyID0gc2VxdWVuY2UuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgaXRlciAhPSBzZXF1ZW5jZS5lbmQoKTsgKytpdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRJbnRlcm1Ob2RlKiBub2RlID0gKml0ZXI7CisgICAgICAgICAgICAgICAgQVNTRVJUKG5vZGUgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgbm9kZS0+dHJhdmVyc2UodGhpcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoaXNTaW5nbGVTdGF0ZW1lbnQobm9kZSkpCisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiO1xuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlY3JlbWVudERlcHRoKCk7CisKKyAgICAgICAgICAgIC8vIFNjb3BlIHRoZSBzZXF1ZW5jZXMgZXhjZXB0IHdoZW4gYXQgdGhlIGdsb2JhbCBzY29wZS4KKyAgICAgICAgICAgIGlmIChkZXB0aCA+IDApIG91dCA8PCAifVxuIjsKKyAgICAgICAgICAgIHZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRU9wUHJvdG90eXBlOiB7CisgICAgICAgICAgICAvLyBGdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIEFTU0VSVCh2aXNpdCA9PSBQcmVWaXNpdCk7CisgICAgICAgICAgICBUU3RyaW5nIHJldHVyblR5cGUgPSBnZXRUeXBlTmFtZShub2RlLT5nZXRUeXBlKCkpOworICAgICAgICAgICAgb3V0IDw8IHJldHVyblR5cGUgPDwgIiAiIDw8IG5vZGUtPmdldE5hbWUoKTsKKworICAgICAgICAgICAgb3V0IDw8ICIoIjsKKyAgICAgICAgICAgIHdyaXRlRnVuY3Rpb25QYXJhbWV0ZXJzKG5vZGUtPmdldFNlcXVlbmNlKCkpOworICAgICAgICAgICAgb3V0IDw8ICIpIjsKKworICAgICAgICAgICAgdmlzaXRDaGlsZHJlbiA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBFT3BGdW5jdGlvbjogeworICAgICAgICAgICAgLy8gRnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAgICAgICAgICAgIEFTU0VSVCh2aXNpdCA9PSBQcmVWaXNpdCk7CisgICAgICAgICAgICBUU3RyaW5nIHJldHVyblR5cGUgPSBnZXRUeXBlTmFtZShub2RlLT5nZXRUeXBlKCkpOworICAgICAgICAgICAgVFN0cmluZyBmdW5jdGlvbk5hbWUgPSBURnVuY3Rpb246OnVubWFuZ2xlTmFtZShub2RlLT5nZXROYW1lKCkpOworICAgICAgICAgICAgb3V0IDw8IHJldHVyblR5cGUgPDwgIiAiIDw8IGZ1bmN0aW9uTmFtZTsKKworICAgICAgICAgICAgaW5jcmVtZW50RGVwdGgoKTsKKyAgICAgICAgICAgIC8vIEZ1bmN0aW9uIGRlZmluaXRpb24gbm9kZSBjb250YWlucyBvbmUgb3IgdHdvIGNoaWxkcmVuIG5vZGVzCisgICAgICAgICAgICAvLyByZXByZXNlbnRpbmcgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgZnVuY3Rpb24gYm9keS4gVGhlIGxhdHRlcgorICAgICAgICAgICAgLy8gaXMgbm90IHByZXNlbnQgaW4gY2FzZSBvZiBlbXB0eSBmdW5jdGlvbiBib2RpZXMuCisgICAgICAgICAgICBjb25zdCBUSW50ZXJtU2VxdWVuY2UmIHNlcXVlbmNlID0gbm9kZS0+Z2V0U2VxdWVuY2UoKTsKKyAgICAgICAgICAgIEFTU0VSVCgoc2VxdWVuY2Uuc2l6ZSgpID09IDEpIHx8IChzZXF1ZW5jZS5zaXplKCkgPT0gMikpOworICAgICAgICAgICAgVEludGVybVNlcXVlbmNlOjpjb25zdF9pdGVyYXRvciBzZXFJdGVyID0gc2VxdWVuY2UuYmVnaW4oKTsKKworICAgICAgICAgICAgLy8gVHJhdmVyc2UgZnVuY3Rpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICAgIFRJbnRlcm1BZ2dyZWdhdGUqIHBhcmFtcyA9ICgqc2VxSXRlciktPmdldEFzQWdncmVnYXRlKCk7CisgICAgICAgICAgICBBU1NFUlQocGFyYW1zICE9IE5VTEwpOworICAgICAgICAgICAgQVNTRVJUKHBhcmFtcy0+Z2V0T3AoKSA9PSBFT3BQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHBhcmFtcy0+dHJhdmVyc2UodGhpcyk7CisKKyAgICAgICAgICAgIC8vIFRyYXZlcnNlIGZ1bmN0aW9uIGJvZHkuCisgICAgICAgICAgICBUSW50ZXJtQWdncmVnYXRlKiBib2R5ID0gKytzZXFJdGVyICE9IHNlcXVlbmNlLmVuZCgpID8KKyAgICAgICAgICAgICAgICAoKnNlcUl0ZXIpLT5nZXRBc0FnZ3JlZ2F0ZSgpIDogTlVMTDsKKyAgICAgICAgICAgIHZpc2l0Q29kZUJsb2NrKGJvZHkpOworICAgICAgICAgICAgZGVjcmVtZW50RGVwdGgoKTsKKyAKKyAgICAgICAgICAgIC8vIEZ1bGx5IHByb2Nlc3NlZDsgbm8gbmVlZCB0byB2aXNpdCBjaGlsZHJlbi4KKyAgICAgICAgICAgIHZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRU9wRnVuY3Rpb25DYWxsOgorICAgICAgICAgICAgLy8gRnVuY3Rpb24gY2FsbC4KKyAgICAgICAgICAgIGlmICh2aXNpdCA9PSBQcmVWaXNpdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUU3RyaW5nIGZ1bmN0aW9uTmFtZSA9IFRGdW5jdGlvbjo6dW5tYW5nbGVOYW1lKG5vZGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGZ1bmN0aW9uTmFtZSA8PCAiKCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aXNpdCA9PSBJblZpc2l0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BQYXJhbWV0ZXJzOiB7CisgICAgICAgICAgICAvLyBGdW5jdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgQVNTRVJUKHZpc2l0ID09IFByZVZpc2l0KTsKKyAgICAgICAgICAgIG91dCA8PCAiKCI7CisgICAgICAgICAgICB3cml0ZUZ1bmN0aW9uUGFyYW1ldGVycyhub2RlLT5nZXRTZXF1ZW5jZSgpKTsKKyAgICAgICAgICAgIG91dCA8PCAiKSI7CisgICAgICAgICAgICB2aXNpdENoaWxkcmVuID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEVPcERlY2xhcmF0aW9uOiB7CisgICAgICAgICAgICAvLyBWYXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIGlmICh2aXNpdCA9PSBQcmVWaXNpdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBUSW50ZXJtU2VxdWVuY2UmIHNlcXVlbmNlID0gbm9kZS0+Z2V0U2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBUSW50ZXJtVHlwZWQqIHZhcmlhYmxlID0gc2VxdWVuY2UuZnJvbnQoKS0+Z2V0QXNUeXBlZCgpOworICAgICAgICAgICAgICAgIHdyaXRlVmFyaWFibGVUeXBlKHZhcmlhYmxlLT5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgIG91dCA8PCAiICI7CisgICAgICAgICAgICAgICAgbURlY2xhcmluZ1ZhcmlhYmxlcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aXNpdCA9PSBJblZpc2l0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICAgICAgICAgIG1EZWNsYXJpbmdWYXJpYWJsZXMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1EZWNsYXJpbmdWYXJpYWJsZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0RmxvYXQ6IHdyaXRlVHJpcGxldCh2aXNpdCwgImZsb2F0KCIsIE5VTEwsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdFZlYzI6IHdyaXRlVHJpcGxldCh2aXNpdCwgInZlYzIoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0VmVjMzogd3JpdGVUcmlwbGV0KHZpc2l0LCAidmVjMygiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RWZWM0OiB3cml0ZVRyaXBsZXQodmlzaXQsICJ2ZWM0KCIsICIsICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJvb2w6IHdyaXRlVHJpcGxldCh2aXNpdCwgImJvb2woIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0QlZlYzI6IHdyaXRlVHJpcGxldCh2aXNpdCwgImJ2ZWMyKCIsICIsICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJWZWMzOiB3cml0ZVRyaXBsZXQodmlzaXQsICJidmVjMygiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RCVmVjNDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiYnZlYzQoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0SW50OiB3cml0ZVRyaXBsZXQodmlzaXQsICJpbnQoIiwgTlVMTCwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0SVZlYzI6IHdyaXRlVHJpcGxldCh2aXNpdCwgIml2ZWMyKCIsICIsICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdElWZWMzOiB3cml0ZVRyaXBsZXQodmlzaXQsICJpdmVjMygiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RJVmVjNDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiaXZlYzQoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0TWF0Mjogd3JpdGVUcmlwbGV0KHZpc2l0LCAibWF0MigiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RNYXQzOiB3cml0ZVRyaXBsZXQodmlzaXQsICJtYXQzKCIsICIsICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdE1hdDQ6IHdyaXRlVHJpcGxldCh2aXNpdCwgIm1hdDQoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29uc3RydWN0U3RydWN0OgorICAgICAgICAgICAgaWYgKHZpc2l0ID09IFByZVZpc2l0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlJiB0eXBlID0gbm9kZS0+Z2V0VHlwZSgpOworICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlLmdldEJhc2ljVHlwZSgpID09IEVidFN0cnVjdCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IHR5cGUuZ2V0VHlwZU5hbWUoKSA8PCAiKCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aXNpdCA9PSBJblZpc2l0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVPcExlc3NUaGFuOiB3cml0ZVRyaXBsZXQodmlzaXQsICJsZXNzVGhhbigiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbjogd3JpdGVUcmlwbGV0KHZpc2l0LCAiZ3JlYXRlclRoYW4oIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTGVzc1RoYW5FcXVhbDogd3JpdGVUcmlwbGV0KHZpc2l0LCAibGVzc1RoYW5FcXVhbCgiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbkVxdWFsOiB3cml0ZVRyaXBsZXQodmlzaXQsICJncmVhdGVyVGhhbkVxdWFsKCIsICIsICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcFZlY3RvckVxdWFsOiB3cml0ZVRyaXBsZXQodmlzaXQsICJlcXVhbCgiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BWZWN0b3JOb3RFcXVhbDogd3JpdGVUcmlwbGV0KHZpc2l0LCAibm90RXF1YWwoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29tbWE6IHdyaXRlVHJpcGxldCh2aXNpdCwgTlVMTCwgIiwgIiwgTlVMTCk7IGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wTW9kOiB3cml0ZVRyaXBsZXQodmlzaXQsICJtb2QoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wUG93OiB3cml0ZVRyaXBsZXQodmlzaXQsICJwb3coIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQXRhbjogd3JpdGVUcmlwbGV0KHZpc2l0LCAiYXRhbigiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BNaW46IHdyaXRlVHJpcGxldCh2aXNpdCwgIm1pbigiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BNYXg6IHdyaXRlVHJpcGxldCh2aXNpdCwgIm1heCgiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDbGFtcDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiY2xhbXAoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTWl4OiB3cml0ZVRyaXBsZXQodmlzaXQsICJtaXgoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wU3RlcDogd3JpdGVUcmlwbGV0KHZpc2l0LCAic3RlcCgiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BTbW9vdGhTdGVwOiB3cml0ZVRyaXBsZXQodmlzaXQsICJzbW9vdGhzdGVwKCIsICIsICIsICIpIik7IGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wRGlzdGFuY2U6IHdyaXRlVHJpcGxldCh2aXNpdCwgImRpc3RhbmNlKCIsICIsICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcERvdDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiZG90KCIsICIsICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENyb3NzOiB3cml0ZVRyaXBsZXQodmlzaXQsICJjcm9zcygiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BGYWNlRm9yd2FyZDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiZmFjZWZvcndhcmQoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wUmVmbGVjdDogd3JpdGVUcmlwbGV0KHZpc2l0LCAicmVmbGVjdCgiLCAiLCAiLCAiKSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BSZWZyYWN0OiB3cml0ZVRyaXBsZXQodmlzaXQsICJyZWZyYWN0KCIsICIsICIsICIpIik7IGJyZWFrOworICAgICAgICBjYXNlIEVPcE11bDogd3JpdGVUcmlwbGV0KHZpc2l0LCAibWF0cml4Q29tcE11bHQoIiwgIiwgIiwgIikiKTsgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB2aXNpdENoaWxkcmVuOworfQorCitib29sIFRPdXRwdXRHTFNMOjp2aXNpdExvb3AoVmlzaXQgdmlzaXQsIFRJbnRlcm1Mb29wKiBub2RlKQoreworICAgIFRJbmZvU2lua0Jhc2UmIG91dCA9IG9ialNpbmsoKTsKKworICAgIGluY3JlbWVudERlcHRoKCk7CisgICAgLy8gTG9vcCBoZWFkZXIuCisgICAgVExvb3BUeXBlIGxvb3BUeXBlID0gbm9kZS0+Z2V0VHlwZSgpOworICAgIGlmIChsb29wVHlwZSA9PSBFTG9vcEZvcikgIC8vIGZvciBsb29wCisgICAgeworICAgICAgICBpZiAoIW5vZGUtPmdldFVucm9sbEZsYWcoKSkgeworICAgICAgICAgICAgb3V0IDw8ICJmb3IgKCI7CisgICAgICAgICAgICBpZiAobm9kZS0+Z2V0SW5pdCgpKQorICAgICAgICAgICAgICAgIG5vZGUtPmdldEluaXQoKS0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgICAgICBvdXQgPDwgIjsgIjsKKworICAgICAgICAgICAgaWYgKG5vZGUtPmdldENvbmRpdGlvbigpKQorICAgICAgICAgICAgICAgIG5vZGUtPmdldENvbmRpdGlvbigpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICAgICAgICAgIG91dCA8PCAiOyAiOworCisgICAgICAgICAgICBpZiAobm9kZS0+Z2V0RXhwcmVzc2lvbigpKQorICAgICAgICAgICAgICAgIG5vZGUtPmdldEV4cHJlc3Npb24oKS0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgICAgICBvdXQgPDwgIilcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAobG9vcFR5cGUgPT0gRUxvb3BXaGlsZSkgIC8vIHdoaWxlIGxvb3AKKyAgICB7CisgICAgICAgIG91dCA8PCAid2hpbGUgKCI7CisgICAgICAgIEFTU0VSVChub2RlLT5nZXRDb25kaXRpb24oKSAhPSBOVUxMKTsKKyAgICAgICAgbm9kZS0+Z2V0Q29uZGl0aW9uKCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICBvdXQgPDwgIilcbiI7CisgICAgfQorICAgIGVsc2UgIC8vIGRvLXdoaWxlIGxvb3AKKyAgICB7CisgICAgICAgIEFTU0VSVChsb29wVHlwZSA9PSBFTG9vcERvV2hpbGUpOworICAgICAgICBvdXQgPDwgImRvXG4iOworICAgIH0KKworICAgIC8vIExvb3AgYm9keS4KKyAgICBpZiAobm9kZS0+Z2V0VW5yb2xsRmxhZygpKQorICAgIHsKKyAgICAgICAgVExvb3BJbmRleEluZm8gaW5kZXhJbmZvOworICAgICAgICBtTG9vcFVucm9sbC5GaWxsTG9vcEluZGV4SW5mbyhub2RlLCBpbmRleEluZm8pOworICAgICAgICBtTG9vcFVucm9sbC5QdXNoKGluZGV4SW5mbyk7CisgICAgICAgIHdoaWxlIChtTG9vcFVucm9sbC5TYXRpc2ZpZXNMb29wQ29uZGl0aW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpc2l0Q29kZUJsb2NrKG5vZGUtPmdldEJvZHkoKSk7CisgICAgICAgICAgICBtTG9vcFVucm9sbC5TdGVwKCk7CisgICAgICAgIH0KKyAgICAgICAgbUxvb3BVbnJvbGwuUG9wKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpc2l0Q29kZUJsb2NrKG5vZGUtPmdldEJvZHkoKSk7CisgICAgfQorCisgICAgLy8gTG9vcCBmb290ZXIuCisgICAgaWYgKGxvb3BUeXBlID09IEVMb29wRG9XaGlsZSkgIC8vIGRvLXdoaWxlIGxvb3AKKyAgICB7CisgICAgICAgIG91dCA8PCAid2hpbGUgKCI7CisgICAgICAgIEFTU0VSVChub2RlLT5nZXRDb25kaXRpb24oKSAhPSBOVUxMKTsKKyAgICAgICAgbm9kZS0+Z2V0Q29uZGl0aW9uKCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICBvdXQgPDwgIik7XG4iOworICAgIH0KKyAgICBkZWNyZW1lbnREZXB0aCgpOworCisgICAgLy8gTm8gbmVlZCB0byB2aXNpdCBjaGlsZHJlbi4gVGhleSBoYXZlIGJlZW4gYWxyZWFkeSBwcm9jZXNzZWQgaW4KKyAgICAvLyB0aGlzIGZ1bmN0aW9uLgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUT3V0cHV0R0xTTDo6dmlzaXRCcmFuY2goVmlzaXQgdmlzaXQsIFRJbnRlcm1CcmFuY2gqIG5vZGUpCit7CisgICAgc3dpdGNoIChub2RlLT5nZXRGbG93T3AoKSkKKyAgICB7CisgICAgICAgIGNhc2UgRU9wS2lsbDogd3JpdGVUcmlwbGV0KHZpc2l0LCAiZGlzY2FyZCIsIE5VTEwsIE5VTEwpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BCcmVhazogd3JpdGVUcmlwbGV0KHZpc2l0LCAiYnJlYWsiLCBOVUxMLCBOVUxMKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29udGludWU6IHdyaXRlVHJpcGxldCh2aXNpdCwgImNvbnRpbnVlIiwgTlVMTCwgTlVMTCk7IGJyZWFrOworICAgICAgICBjYXNlIEVPcFJldHVybjogd3JpdGVUcmlwbGV0KHZpc2l0LCAicmV0dXJuICIsIE5VTEwsIE5VTEwpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVE91dHB1dEdMU0w6OnZpc2l0Q29kZUJsb2NrKFRJbnRlcm1Ob2RlKiBub2RlKSB7CisgICAgVEluZm9TaW5rQmFzZSAmb3V0ID0gb2JqU2luaygpOworICAgIGlmIChub2RlICE9IE5VTEwpCisgICAgeworICAgICAgICBub2RlLT50cmF2ZXJzZSh0aGlzKTsKKyAgICAgICAgLy8gU2luZ2xlIHN0YXRlbWVudHMgbm90IHBhcnQgb2YgYSBzZXF1ZW5jZSBuZWVkIHRvIGJlIHRlcm1pbmF0ZWQKKyAgICAgICAgLy8gd2l0aCBzZW1pLWNvbG9uLgorICAgICAgICBpZiAoaXNTaW5nbGVTdGF0ZW1lbnQobm9kZSkpCisgICAgICAgICAgICBvdXQgPDwgIjtcbiI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCAie1xufVxuIjsgIC8vIEVtcHR5IGNvZGUgYmxvY2suCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvT3V0cHV0R0xTTC5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvT3V0cHV0R0xTTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTExMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9PdXRwdXRHTFNMLmgKQEAgLTAsMCArMSw1MiBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2lmbmRlZiBDUk9TU0NPTVBJTEVSR0xTTF9PVVRQVVRHTFNMX0hfCisjZGVmaW5lIENST1NTQ09NUElMRVJHTFNMX09VVFBVVEdMU0xfSF8KKworI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgImNvbXBpbGVyL0Zvckxvb3BVbnJvbGwuaCIKKyNpbmNsdWRlICJjb21waWxlci9pbnRlcm1lZGlhdGUuaCIKKyNpbmNsdWRlICJjb21waWxlci9QYXJzZUhlbHBlci5oIgorCitjbGFzcyBUT3V0cHV0R0xTTCA6IHB1YmxpYyBUSW50ZXJtVHJhdmVyc2VyCit7CitwdWJsaWM6CisgICAgVE91dHB1dEdMU0woVEluZm9TaW5rQmFzZSYgb2JqU2luayk7CisKK3Byb3RlY3RlZDoKKyAgICBUSW5mb1NpbmtCYXNlJiBvYmpTaW5rKCkgeyByZXR1cm4gbU9ialNpbms7IH0KKyAgICB2b2lkIHdyaXRlVHJpcGxldChWaXNpdCB2aXNpdCwgY29uc3QgY2hhciogcHJlU3RyLCBjb25zdCBjaGFyKiBpblN0ciwgY29uc3QgY2hhciogcG9zdFN0cik7CisgICAgdm9pZCB3cml0ZVZhcmlhYmxlVHlwZShjb25zdCBUVHlwZSYgdHlwZSk7CisgICAgdm9pZCB3cml0ZUZ1bmN0aW9uUGFyYW1ldGVycyhjb25zdCBUSW50ZXJtU2VxdWVuY2UmIGFyZ3MpOworICAgIGNvbnN0IENvbnN0YW50VW5pb24qIHdyaXRlQ29uc3RhbnRVbmlvbihjb25zdCBUVHlwZSYgdHlwZSwgY29uc3QgQ29uc3RhbnRVbmlvbiogcENvbnN0VW5pb24pOworCisgICAgdmlydHVhbCB2b2lkIHZpc2l0U3ltYm9sKFRJbnRlcm1TeW1ib2wqIG5vZGUpOworICAgIHZpcnR1YWwgdm9pZCB2aXNpdENvbnN0YW50VW5pb24oVEludGVybUNvbnN0YW50VW5pb24qIG5vZGUpOworICAgIHZpcnR1YWwgYm9vbCB2aXNpdEJpbmFyeShWaXNpdCB2aXNpdCwgVEludGVybUJpbmFyeSogbm9kZSk7CisgICAgdmlydHVhbCBib29sIHZpc2l0VW5hcnkoVmlzaXQgdmlzaXQsIFRJbnRlcm1VbmFyeSogbm9kZSk7CisgICAgdmlydHVhbCBib29sIHZpc2l0U2VsZWN0aW9uKFZpc2l0IHZpc2l0LCBUSW50ZXJtU2VsZWN0aW9uKiBub2RlKTsKKyAgICB2aXJ0dWFsIGJvb2wgdmlzaXRBZ2dyZWdhdGUoVmlzaXQgdmlzaXQsIFRJbnRlcm1BZ2dyZWdhdGUqIG5vZGUpOworICAgIHZpcnR1YWwgYm9vbCB2aXNpdExvb3AoVmlzaXQgdmlzaXQsIFRJbnRlcm1Mb29wKiBub2RlKTsKKyAgICB2aXJ0dWFsIGJvb2wgdmlzaXRCcmFuY2goVmlzaXQgdmlzaXQsIFRJbnRlcm1CcmFuY2gqIG5vZGUpOworCisgICAgdm9pZCB2aXNpdENvZGVCbG9jayhUSW50ZXJtTm9kZSogbm9kZSk7CisKK3ByaXZhdGU6CisgICAgVEluZm9TaW5rQmFzZSYgbU9ialNpbms7CisgICAgYm9vbCBtRGVjbGFyaW5nVmFyaWFibGVzOworCisgICAgLy8gU3RydWN0cyBhcmUgZGVjbGFyZWQgYXMgdGhlIHRyZWUgaXMgdHJhdmVyc2VkLiBUaGlzIHNldCBjb250YWlucyBhbGwKKyAgICAvLyB0aGUgc3RydWN0cyBhbHJlYWR5IGRlY2xhcmVkLiBJdCBpcyBtYWludGFpbmVkIHNvIHRoYXQgYSBzdHJ1Y3QgaXMKKyAgICAvLyBkZWNsYXJlZCBvbmx5IG9uY2UuCisgICAgdHlwZWRlZiBzdGQ6OnNldDxUU3RyaW5nPiBEZWNsYXJlZFN0cnVjdHM7CisgICAgRGVjbGFyZWRTdHJ1Y3RzIG1EZWNsYXJlZFN0cnVjdHM7CisKKyAgICBGb3JMb29wVW5yb2xsIG1Mb29wVW5yb2xsOworfTsKKworI2VuZGlmICAvLyBDUk9TU0NPTVBJTEVSR0xTTF9PVVRQVVRHTFNMX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9PdXRwdXRITFNMLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL091dHB1dEhMU0wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTY5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9PdXRwdXRITFNMLmNwcApAQCAtMCwwICsxLDIzNDcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMSBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9PdXRwdXRITFNMLmgiCisKKyNpbmNsdWRlICJjb21waWxlci9kZWJ1Zy5oIgorI2luY2x1ZGUgImNvbXBpbGVyL0luZm9TaW5rLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvVW5mb2xkU2VsZWN0LmgiCisjaW5jbHVkZSAiY29tcGlsZXIvU2VhcmNoU3ltYm9sLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIHNoCit7CisvLyBJbnRlZ2VyIHRvIFRTdHJpbmcgY29udmVyc2lvbgorVFN0cmluZyBzdHIoaW50IGkpCit7CisgICAgY2hhciBidWZmZXJbMjBdOworICAgIHNwcmludGYoYnVmZmVyLCAiJWQiLCBpKTsKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitPdXRwdXRITFNMOjpPdXRwdXRITFNMKFRQYXJzZUNvbnRleHQgJmNvbnRleHQpIDogVEludGVybVRyYXZlcnNlcih0cnVlLCB0cnVlLCB0cnVlKSwgbUNvbnRleHQoY29udGV4dCkKK3sKKyAgICBtVW5mb2xkU2VsZWN0ID0gbmV3IFVuZm9sZFNlbGVjdChjb250ZXh0LCB0aGlzKTsKKyAgICBtSW5zaWRlRnVuY3Rpb24gPSBmYWxzZTsKKworICAgIG1Vc2VzVGV4dHVyZTJEID0gZmFsc2U7CisgICAgbVVzZXNUZXh0dXJlMkRfYmlhcyA9IGZhbHNlOworICAgIG1Vc2VzVGV4dHVyZTJEUHJvaiA9IGZhbHNlOworICAgIG1Vc2VzVGV4dHVyZTJEUHJval9iaWFzID0gZmFsc2U7CisgICAgbVVzZXNUZXh0dXJlMkRQcm9qTG9kID0gZmFsc2U7CisgICAgbVVzZXNUZXh0dXJlMkRMb2QgPSBmYWxzZTsKKyAgICBtVXNlc1RleHR1cmVDdWJlID0gZmFsc2U7CisgICAgbVVzZXNUZXh0dXJlQ3ViZV9iaWFzID0gZmFsc2U7CisgICAgbVVzZXNUZXh0dXJlQ3ViZUxvZCA9IGZhbHNlOworICAgIG1Vc2VzRGVwdGhSYW5nZSA9IGZhbHNlOworICAgIG1Vc2VzRnJhZ0Nvb3JkID0gZmFsc2U7CisgICAgbVVzZXNQb2ludENvb3JkID0gZmFsc2U7CisgICAgbVVzZXNGcm9udEZhY2luZyA9IGZhbHNlOworICAgIG1Vc2VzUG9pbnRTaXplID0gZmFsc2U7CisgICAgbVVzZXNYb3IgPSBmYWxzZTsKKyAgICBtVXNlc01vZDEgPSBmYWxzZTsKKyAgICBtVXNlc01vZDIgPSBmYWxzZTsKKyAgICBtVXNlc01vZDMgPSBmYWxzZTsKKyAgICBtVXNlc01vZDQgPSBmYWxzZTsKKyAgICBtVXNlc0ZhY2Vmb3J3YXJkMSA9IGZhbHNlOworICAgIG1Vc2VzRmFjZWZvcndhcmQyID0gZmFsc2U7CisgICAgbVVzZXNGYWNlZm9yd2FyZDMgPSBmYWxzZTsKKyAgICBtVXNlc0ZhY2Vmb3J3YXJkNCA9IGZhbHNlOworICAgIG1Vc2VzRXF1YWxNYXQyID0gZmFsc2U7CisgICAgbVVzZXNFcXVhbE1hdDMgPSBmYWxzZTsKKyAgICBtVXNlc0VxdWFsTWF0NCA9IGZhbHNlOworICAgIG1Vc2VzRXF1YWxWZWMyID0gZmFsc2U7CisgICAgbVVzZXNFcXVhbFZlYzMgPSBmYWxzZTsKKyAgICBtVXNlc0VxdWFsVmVjNCA9IGZhbHNlOworICAgIG1Vc2VzRXF1YWxJVmVjMiA9IGZhbHNlOworICAgIG1Vc2VzRXF1YWxJVmVjMyA9IGZhbHNlOworICAgIG1Vc2VzRXF1YWxJVmVjNCA9IGZhbHNlOworICAgIG1Vc2VzRXF1YWxCVmVjMiA9IGZhbHNlOworICAgIG1Vc2VzRXF1YWxCVmVjMyA9IGZhbHNlOworICAgIG1Vc2VzRXF1YWxCVmVjNCA9IGZhbHNlOworICAgIG1Vc2VzQXRhbjIgPSBmYWxzZTsKKworICAgIG1TY29wZURlcHRoID0gMDsKKworICAgIG1VbmlxdWVJbmRleCA9IDA7Cit9CisKK091dHB1dEhMU0w6On5PdXRwdXRITFNMKCkKK3sKKyAgICBkZWxldGUgbVVuZm9sZFNlbGVjdDsKK30KKwordm9pZCBPdXRwdXRITFNMOjpvdXRwdXQoKQoreworICAgIG1Db250ZXh0LnRyZWVSb290LT50cmF2ZXJzZSh0aGlzKTsgICAvLyBPdXRwdXQgdGhlIGJvZHkgZmlyc3QgdG8gZGV0ZXJtaW5lIHdoYXQgaGFzIHRvIGdvIGluIHRoZSBoZWFkZXIKKyAgICBoZWFkZXIoKTsKKworICAgIG1Db250ZXh0LmluZm9TaW5rLm9iaiA8PCBtSGVhZGVyLmNfc3RyKCk7CisgICAgbUNvbnRleHQuaW5mb1Npbmsub2JqIDw8IG1Cb2R5LmNfc3RyKCk7Cit9CisKK1RJbmZvU2lua0Jhc2UgJk91dHB1dEhMU0w6OmdldEJvZHlTdHJlYW0oKQoreworICAgIHJldHVybiBtQm9keTsKK30KKworaW50IE91dHB1dEhMU0w6OnZlY3RvclNpemUoY29uc3QgVFR5cGUgJnR5cGUpIGNvbnN0Cit7CisgICAgaW50IGVsZW1lbnRTaXplID0gdHlwZS5pc01hdHJpeCgpID8gdHlwZS5nZXROb21pbmFsU2l6ZSgpIDogMTsKKyAgICBpbnQgYXJyYXlTaXplID0gdHlwZS5pc0FycmF5KCkgPyB0eXBlLmdldEFycmF5U2l6ZSgpIDogMTsKKworICAgIHJldHVybiBlbGVtZW50U2l6ZSAqIGFycmF5U2l6ZTsKK30KKwordm9pZCBPdXRwdXRITFNMOjpoZWFkZXIoKQoreworICAgIFNoU2hhZGVyVHlwZSBzaGFkZXJUeXBlID0gbUNvbnRleHQuc2hhZGVyVHlwZTsKKyAgICBUSW5mb1NpbmtCYXNlICZvdXQgPSBtSGVhZGVyOworCisgICAgZm9yIChTdHJ1Y3REZWNsYXJhdGlvbnM6Oml0ZXJhdG9yIHN0cnVjdERlY2xhcmF0aW9uID0gbVN0cnVjdERlY2xhcmF0aW9ucy5iZWdpbigpOyBzdHJ1Y3REZWNsYXJhdGlvbiAhPSBtU3RydWN0RGVjbGFyYXRpb25zLmVuZCgpOyBzdHJ1Y3REZWNsYXJhdGlvbisrKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICpzdHJ1Y3REZWNsYXJhdGlvbjsKKyAgICB9CisKKyAgICBmb3IgKENvbnN0cnVjdG9yczo6aXRlcmF0b3IgY29uc3RydWN0b3IgPSBtQ29uc3RydWN0b3JzLmJlZ2luKCk7IGNvbnN0cnVjdG9yICE9IG1Db25zdHJ1Y3RvcnMuZW5kKCk7IGNvbnN0cnVjdG9yKyspCisgICAgeworICAgICAgICBvdXQgPDwgKmNvbnN0cnVjdG9yOworICAgIH0KKworICAgIGlmIChzaGFkZXJUeXBlID09IFNIX0ZSQUdNRU5UX1NIQURFUikKKyAgICB7CisgICAgICAgIFRTdHJpbmcgdW5pZm9ybXM7CisgICAgICAgIFRTdHJpbmcgdmFyeWluZ3M7CisKKyAgICAgICAgVFN5bWJvbFRhYmxlTGV2ZWwgKnN5bWJvbHMgPSBtQ29udGV4dC5zeW1ib2xUYWJsZS5nZXRHbG9iYWxMZXZlbCgpOworICAgICAgICBpbnQgc2VtYW50aWNJbmRleCA9IDA7CisKKyAgICAgICAgZm9yIChUU3ltYm9sVGFibGVMZXZlbDo6Y29uc3RfaXRlcmF0b3IgbmFtZWRTeW1ib2wgPSBzeW1ib2xzLT5iZWdpbigpOyBuYW1lZFN5bWJvbCAhPSBzeW1ib2xzLT5lbmQoKTsgbmFtZWRTeW1ib2wrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVFN5bWJvbCAqc3ltYm9sID0gKCpuYW1lZFN5bWJvbCkuc2Vjb25kOworICAgICAgICAgICAgY29uc3QgVFN0cmluZyAmbmFtZSA9IHN5bWJvbC0+Z2V0TmFtZSgpOworCisgICAgICAgICAgICBpZiAoc3ltYm9sLT5pc1ZhcmlhYmxlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgVFZhcmlhYmxlICp2YXJpYWJsZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRWYXJpYWJsZSo+KHN5bWJvbCk7CisgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgJnR5cGUgPSB2YXJpYWJsZS0+Z2V0VHlwZSgpOworICAgICAgICAgICAgICAgIFRRdWFsaWZpZXIgcXVhbGlmaWVyID0gdHlwZS5nZXRRdWFsaWZpZXIoKTsKKworICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZXIgPT0gRXZxVW5pZm9ybSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmVmZXJlbmNlZFVuaWZvcm1zLmZpbmQobmFtZS5jX3N0cigpKSAhPSBtUmVmZXJlbmNlZFVuaWZvcm1zLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyArPSAidW5pZm9ybSAiICsgdHlwZVN0cmluZyh0eXBlKSArICIgIiArIGRlY29yYXRlVW5pZm9ybShuYW1lLCB0eXBlLmlzQXJyYXkoKSkgKyBhcnJheVN0cmluZyh0eXBlKSArICI7XG4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHF1YWxpZmllciA9PSBFdnFWYXJ5aW5nSW4gfHwgcXVhbGlmaWVyID09IEV2cUludmFyaWFudFZhcnlpbmdJbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmVmZXJlbmNlZFZhcnlpbmdzLmZpbmQobmFtZS5jX3N0cigpKSAhPSBtUmVmZXJlbmNlZFZhcnlpbmdzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9ncmFtIGxpbmtpbmcgZGVwZW5kcyBvbiB0aGlzIGV4YWN0IGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyeWluZ3MgKz0gInN0YXRpYyAiICsgdHlwZVN0cmluZyh0eXBlKSArICIgIiArIGRlY29yYXRlKG5hbWUpICsgYXJyYXlTdHJpbmcodHlwZSkgKyAiID0gIiArIGluaXRpYWxpemVyKHR5cGUpICsgIjtcbiI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljSW5kZXggKz0gdHlwZS5pc0FycmF5KCkgPyB0eXBlLmdldEFycmF5U2l6ZSgpIDogMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChxdWFsaWZpZXIgPT0gRXZxR2xvYmFsIHx8IHF1YWxpZmllciA9PSBFdnFUZW1wb3JhcnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBHbG9iYWxzIGFyZSBkZWNsYXJlZCBhbmQgaW50aWFsaXplZCBhcyBhbiBhZ2dyZWdhdGUgbm9kZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChxdWFsaWZpZXIgPT0gRXZxQ29uc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25zdGFudHMgYXJlIHJlcGVhdGVkIGFzIGxpdGVyYWxzIHdoZXJlIHVzZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICIvLyBWYXJ5aW5nc1xuIjsKKyAgICAgICAgb3V0IDw8ICB2YXJ5aW5nczsKKyAgICAgICAgb3V0IDw8ICJcbiIKKyAgICAgICAgICAgICAgICJzdGF0aWMgZmxvYXQ0IGdsX0NvbG9yWzFdID0ge2Zsb2F0NCgwLCAwLCAwLCAwKX07XG4iOworCisgICAgICAgIGlmIChtVXNlc0ZyYWdDb29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJzdGF0aWMgZmxvYXQ0IGdsX0ZyYWdDb29yZCA9IGZsb2F0NCgwLCAwLCAwLCAwKTtcbiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVVzZXNQb2ludENvb3JkKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgInN0YXRpYyBmbG9hdDIgZ2xfUG9pbnRDb29yZCA9IGZsb2F0MigwLjUsIDAuNSk7XG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Vc2VzRnJvbnRGYWNpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAic3RhdGljIGJvb2wgZ2xfRnJvbnRGYWNpbmcgPSBmYWxzZTtcbiI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgIlxuIjsKKworICAgICAgICBpZiAobVVzZXNGcmFnQ29vcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAidW5pZm9ybSBmbG9hdDQgZHhfVmlld3BvcnQ7XG4iCisgICAgICAgICAgICAgICAgICAgInVuaWZvcm0gZmxvYXQyIGR4X0RlcHRoO1xuIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVXNlc0Zyb250RmFjaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgInVuaWZvcm0gYm9vbCBkeF9Qb2ludHNPckxpbmVzO1xuIgorICAgICAgICAgICAgICAgICAgICJ1bmlmb3JtIGJvb2wgZHhfRnJvbnRDQ1c7XG4iOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQgPDwgIlxuIjsKKyAgICAgICAgb3V0IDw8ICB1bmlmb3JtczsKKyAgICAgICAgb3V0IDw8ICJcbiI7CisKKyAgICAgICAgLy8gVGhlIHRleHR1cmUgZmV0Y2ggZnVuY3Rpb25zICJmbGlwIiB0aGUgWSBjb29yZGluYXRlIGluIG9uZSB3YXkgb3IgYW5vdGhlci4gVGhpcyBpcyBiZWNhdXNlIHRleHR1cmVzIGFyZSBzdG9yZWQKKyAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBPcGVuR0wgY29udmVudGlvbiwgaS5lLiAoMCwgMCkgaXMgImJvdHRvbSBsZWZ0IiwgcmF0aGVyIHRoYW4gdGhlIEQzRCBjb252ZW50aW9uIHdoZXJlICgwLCAwKQorICAgICAgICAvLyBpcyAidG9wIGxlZnQiLiBTaW5jZSB0aGUgSExTTCB0ZXh0dXJlIGZldGNoIGZ1bmN0aW9ucyBleHBlY3QgdGV4dHVyZXMgdG8gYmUgc3RvcmVkIGFjY29yZGluZyB0byB0aGUgRDNECisgICAgICAgIC8vIGNvbnZlbnRpb24sIHRoZSBZIGNvb3JkaW5hdGUgcGFzc2VkIHRvIHRoZXNlIGZ1bmN0aW9ucyBpcyBhZGp1c3RlZCB0byBjb21wZW5zYXRlLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgc2ltcGxlc3QgY2FzZSBpcyB0ZXh0dXJlMkQgd2hlcmUgdGhlIG1hcHBpbmcgaXMgWSAtPiAxLVksIHdoaWNoIG1hcHMgWzAsIDFdIC0+IFsxLCAwXS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHRleHR1cmUyRFByb2ogZnVuY3Rpb25zIGFyZSBtb3JlIGNvbXBsaWNhdGVkIGJlY2F1c2UgdGhlIHByb2plY3Rpb24gZGl2aWRlcyBieSBlaXRoZXIgWiBvciBXLiBGb3IgdGhlIHZlYzMKKyAgICAgICAgLy8gY2FzZSwgdGhlIG1hcHBpbmcgaXMgWSAtPiBaLVkgb3IgWS9aIC0+IDEtWS9aLCB3aGljaCBhZ2FpbiBtYXBzIFswLCAxXSAtPiBbMSwgMF0uCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvciBjdWJlIHRleHR1cmVzIHRoZSBtYXBwaW5nIGlzIFkgLT4gLVksIHdoaWNoIG1hcHMgWy0xLCAxXSAtPiBbMSwgLTFdLiBUaGlzIGlzIG5vdCBzdWZmaWNpZW50IG9uIGl0cyBvd24gZm9yIHRoZQorICAgICAgICAvLyArWSBhbmQgLVkgZmFjZXMsIHdoaWNoIGFyZSBub3cgb24gdGhlICJ3cm9uZyBzaWRlcyIgb2YgdGhlIGN1YmUuIFRoaXMgaXMgY29tcGVuc2F0ZWQgZm9yIGJ5IGV4Y2hhbmdpbmcgdGhlCisgICAgICAgIC8vICtZIGFuZCAtWSBmYWNlcyBldmVyeXdoZXJlIGVsc2UgdGhyb3VnaG91dCB0aGUgY29kZS4KKyAgICAgICAgCisgICAgICAgIGlmIChtVXNlc1RleHR1cmUyRCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJmbG9hdDQgZ2xfdGV4dHVyZTJEKHNhbXBsZXIyRCBzLCBmbG9hdDIgdClcbiIKKyAgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHRleDJEKHMsIGZsb2F0Mih0LngsIDEgLSB0LnkpKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAgICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVVzZXNUZXh0dXJlMkRfYmlhcykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJmbG9hdDQgZ2xfdGV4dHVyZTJEKHNhbXBsZXIyRCBzLCBmbG9hdDIgdCwgZmxvYXQgYmlhcylcbiIKKyAgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHRleDJEYmlhcyhzLCBmbG9hdDQodC54LCAxIC0gdC55LCAwLCBiaWFzKSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Vc2VzVGV4dHVyZTJEUHJvaikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJmbG9hdDQgZ2xfdGV4dHVyZTJEUHJvaihzYW1wbGVyMkQgcywgZmxvYXQzIHQpXG4iCisgICAgICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIHJldHVybiB0ZXgyRHByb2oocywgZmxvYXQ0KHQueCwgdC56IC0gdC55LCAwLCB0LnopKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAiZmxvYXQ0IGdsX3RleHR1cmUyRFByb2ooc2FtcGxlcjJEIHMsIGZsb2F0NCB0KVxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdGV4MkRwcm9qKHMsIGZsb2F0NCh0LngsIHQudyAtIHQueSwgdC56LCB0LncpKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAgICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVVzZXNUZXh0dXJlMkRQcm9qX2JpYXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiZmxvYXQ0IGdsX3RleHR1cmUyRFByb2ooc2FtcGxlcjJEIHMsIGZsb2F0MyB0LCBmbG9hdCBiaWFzKVxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdGV4MkRiaWFzKHMsIGZsb2F0NCh0LnggLyB0LnosIDEgLSAodC55IC8gdC56KSwgMCwgYmlhcykpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICJmbG9hdDQgZ2xfdGV4dHVyZTJEUHJvaihzYW1wbGVyMkQgcywgZmxvYXQ0IHQsIGZsb2F0IGJpYXMpXG4iCisgICAgICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIHJldHVybiB0ZXgyRGJpYXMocywgZmxvYXQ0KHQueCAvIHQudywgMSAtICh0LnkgLyB0LncpLCAwLCBiaWFzKSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Vc2VzVGV4dHVyZUN1YmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiZmxvYXQ0IGdsX3RleHR1cmVDdWJlKHNhbXBsZXJDVUJFIHMsIGZsb2F0MyB0KVxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdGV4Q1VCRShzLCBmbG9hdDModC54LCAtdC55LCB0LnopKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAgICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVVzZXNUZXh0dXJlQ3ViZV9iaWFzKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgImZsb2F0NCBnbF90ZXh0dXJlQ3ViZShzYW1wbGVyQ1VCRSBzLCBmbG9hdDMgdCwgZmxvYXQgYmlhcylcbiIKKyAgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHRleENVQkViaWFzKHMsIGZsb2F0NCh0LngsIC10LnksIHQueiwgYmlhcykpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICAgIlxuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgLy8gVmVydGV4IHNoYWRlcgorICAgIHsKKyAgICAgICAgVFN0cmluZyB1bmlmb3JtczsKKyAgICAgICAgVFN0cmluZyBhdHRyaWJ1dGVzOworICAgICAgICBUU3RyaW5nIHZhcnlpbmdzOworCisgICAgICAgIFRTeW1ib2xUYWJsZUxldmVsICpzeW1ib2xzID0gbUNvbnRleHQuc3ltYm9sVGFibGUuZ2V0R2xvYmFsTGV2ZWwoKTsKKworICAgICAgICBmb3IgKFRTeW1ib2xUYWJsZUxldmVsOjpjb25zdF9pdGVyYXRvciBuYW1lZFN5bWJvbCA9IHN5bWJvbHMtPmJlZ2luKCk7IG5hbWVkU3ltYm9sICE9IHN5bWJvbHMtPmVuZCgpOyBuYW1lZFN5bWJvbCsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBUU3ltYm9sICpzeW1ib2wgPSAoKm5hbWVkU3ltYm9sKS5zZWNvbmQ7CisgICAgICAgICAgICBjb25zdCBUU3RyaW5nICZuYW1lID0gc3ltYm9sLT5nZXROYW1lKCk7CisKKyAgICAgICAgICAgIGlmIChzeW1ib2wtPmlzVmFyaWFibGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBUVmFyaWFibGUgKnZhcmlhYmxlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVFZhcmlhYmxlKj4oc3ltYm9sKTsKKyAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSAmdHlwZSA9IHZhcmlhYmxlLT5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgVFF1YWxpZmllciBxdWFsaWZpZXIgPSB0eXBlLmdldFF1YWxpZmllcigpOworCisgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllciA9PSBFdnFVbmlmb3JtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VkVW5pZm9ybXMuZmluZChuYW1lLmNfc3RyKCkpICE9IG1SZWZlcmVuY2VkVW5pZm9ybXMuZW5kKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zICs9ICJ1bmlmb3JtICIgKyB0eXBlU3RyaW5nKHR5cGUpICsgIiAiICsgZGVjb3JhdGVVbmlmb3JtKG5hbWUsIHR5cGUuaXNBcnJheSgpKSArIGFycmF5U3RyaW5nKHR5cGUpICsgIjtcbiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocXVhbGlmaWVyID09IEV2cUF0dHJpYnV0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmVmZXJlbmNlZEF0dHJpYnV0ZXMuZmluZChuYW1lLmNfc3RyKCkpICE9IG1SZWZlcmVuY2VkQXR0cmlidXRlcy5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyArPSAic3RhdGljICIgKyB0eXBlU3RyaW5nKHR5cGUpICsgIiAiICsgZGVjb3JhdGUobmFtZSkgKyBhcnJheVN0cmluZyh0eXBlKSArICIgPSAiICsgaW5pdGlhbGl6ZXIodHlwZSkgKyAiO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChxdWFsaWZpZXIgPT0gRXZxVmFyeWluZ091dCB8fCBxdWFsaWZpZXIgPT0gRXZxSW52YXJpYW50VmFyeWluZ091dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmVmZXJlbmNlZFZhcnlpbmdzLmZpbmQobmFtZS5jX3N0cigpKSAhPSBtUmVmZXJlbmNlZFZhcnlpbmdzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9ncmFtIGxpbmtpbmcgZGVwZW5kcyBvbiB0aGlzIGV4YWN0IGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyeWluZ3MgKz0gInN0YXRpYyAiICsgdHlwZVN0cmluZyh0eXBlKSArICIgIiArIGRlY29yYXRlKG5hbWUpICsgYXJyYXlTdHJpbmcodHlwZSkgKyAiID0gIiArIGluaXRpYWxpemVyKHR5cGUpICsgIjtcbiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocXVhbGlmaWVyID09IEV2cUdsb2JhbCB8fCBxdWFsaWZpZXIgPT0gRXZxVGVtcG9yYXJ5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR2xvYmFscyBhcmUgZGVjbGFyZWQgYW5kIGludGlhbGl6ZWQgYXMgYW4gYWdncmVnYXRlIG5vZGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocXVhbGlmaWVyID09IEV2cUNvbnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RhbnRzIGFyZSByZXBlYXRlZCBhcyBsaXRlcmFscyB3aGVyZSB1c2VkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiLy8gQXR0cmlidXRlc1xuIjsKKyAgICAgICAgb3V0IDw8ICBhdHRyaWJ1dGVzOworICAgICAgICBvdXQgPDwgIlxuIgorICAgICAgICAgICAgICAgInN0YXRpYyBmbG9hdDQgZ2xfUG9zaXRpb24gPSBmbG9hdDQoMCwgMCwgMCwgMCk7XG4iOworICAgICAgICAKKyAgICAgICAgaWYgKG1Vc2VzUG9pbnRTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgInN0YXRpYyBmbG9hdCBnbF9Qb2ludFNpemUgPSBmbG9hdCgxKTtcbiI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgIlxuIgorICAgICAgICAgICAgICAgIi8vIFZhcnlpbmdzXG4iOworICAgICAgICBvdXQgPDwgIHZhcnlpbmdzOworICAgICAgICBvdXQgPDwgIlxuIgorICAgICAgICAgICAgICAgInVuaWZvcm0gZmxvYXQyIGR4X0hhbGZQaXhlbFNpemU7XG4iCisgICAgICAgICAgICAgICAiXG4iOworICAgICAgICBvdXQgPDwgIHVuaWZvcm1zOworICAgICAgICBvdXQgPDwgIlxuIjsKKworICAgICAgICAvLyBUaGUgdGV4dHVyZSBmZXRjaCBmdW5jdGlvbnMgImZsaXAiIHRoZSBZIGNvb3JkaW5hdGUgaW4gb25lIHdheSBvciBhbm90aGVyLiBUaGlzIGlzIGJlY2F1c2UgdGV4dHVyZXMgYXJlIHN0b3JlZAorICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIE9wZW5HTCBjb252ZW50aW9uLCBpLmUuICgwLCAwKSBpcyAiYm90dG9tIGxlZnQiLCByYXRoZXIgdGhhbiB0aGUgRDNEIGNvbnZlbnRpb24gd2hlcmUgKDAsIDApCisgICAgICAgIC8vIGlzICJ0b3AgbGVmdCIuIFNpbmNlIHRoZSBITFNMIHRleHR1cmUgZmV0Y2ggZnVuY3Rpb25zIGV4cGVjdCB0ZXh0dXJlcyB0byBiZSBzdG9yZWQgYWNjb3JkaW5nIHRvIHRoZSBEM0QKKyAgICAgICAgLy8gY29udmVudGlvbiwgdGhlIFkgY29vcmRpbmF0ZSBwYXNzZWQgdG8gdGhlc2UgZnVuY3Rpb25zIGlzIGFkanVzdGVkIHRvIGNvbXBlbnNhdGUuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBzaW1wbGVzdCBjYXNlIGlzIHRleHR1cmUyRCB3aGVyZSB0aGUgbWFwcGluZyBpcyBZIC0+IDEtWSwgd2hpY2ggbWFwcyBbMCwgMV0gLT4gWzEsIDBdLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgdGV4dHVyZTJEUHJvaiBmdW5jdGlvbnMgYXJlIG1vcmUgY29tcGxpY2F0ZWQgYmVjYXVzZSB0aGUgcHJvamVjdGlvbiBkaXZpZGVzIGJ5IGVpdGhlciBaIG9yIFcuIEZvciB0aGUgdmVjMworICAgICAgICAvLyBjYXNlLCB0aGUgbWFwcGluZyBpcyBZIC0+IFotWSBvciBZL1ogLT4gMS1ZL1osIHdoaWNoIGFnYWluIG1hcHMgWzAsIDFdIC0+IFsxLCAwXS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9yIGN1YmUgdGV4dHVyZXMgdGhlIG1hcHBpbmcgaXMgWSAtPiAtWSwgd2hpY2ggbWFwcyBbLTEsIDFdIC0+IFsxLCAtMV0uIFRoaXMgaXMgbm90IHN1ZmZpY2llbnQgb24gaXRzIG93biBmb3IgdGhlCisgICAgICAgIC8vICtZIGFuZCAtWSBmYWNlcywgd2hpY2ggYXJlIG5vdyBvbiB0aGUgIndyb25nIHNpZGVzIiBvZiB0aGUgY3ViZS4gVGhpcyBpcyBjb21wZW5zYXRlZCBmb3IgYnkgZXhjaGFuZ2luZyB0aGUKKyAgICAgICAgLy8gK1kgYW5kIC1ZIGZhY2VzIGV2ZXJ5d2hlcmUgZWxzZSB0aHJvdWdob3V0IHRoZSBjb2RlLgorICAgICAgICAKKyAgICAgICAgaWYgKG1Vc2VzVGV4dHVyZTJEKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgImZsb2F0NCBnbF90ZXh0dXJlMkQoc2FtcGxlcjJEIHMsIGZsb2F0MiB0KVxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdGV4MkRsb2QocywgZmxvYXQ0KHQueCwgMSAtIHQueSwgMCwgMCkpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICAgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVXNlc1RleHR1cmUyRExvZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJmbG9hdDQgZ2xfdGV4dHVyZTJETG9kKHNhbXBsZXIyRCBzLCBmbG9hdDIgdCwgZmxvYXQgbG9kKVxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdGV4MkRsb2QocywgZmxvYXQ0KHQueCwgMSAtIHQueSwgMCwgbG9kKSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Vc2VzVGV4dHVyZTJEUHJvaikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJmbG9hdDQgZ2xfdGV4dHVyZTJEUHJvaihzYW1wbGVyMkQgcywgZmxvYXQzIHQpXG4iCisgICAgICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIHJldHVybiB0ZXgyRGxvZChzLCBmbG9hdDQodC54IC8gdC56LCAxIC0gdC55IC8gdC56LCAwLCAwKSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgImZsb2F0NCBnbF90ZXh0dXJlMkRQcm9qKHNhbXBsZXIyRCBzLCBmbG9hdDQgdClcbiIKKyAgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHRleDJEbG9kKHMsIGZsb2F0NCh0LnggLyB0LncsIDEgLSB0LnkgLyB0LncsIDAsIDApKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAgICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVVzZXNUZXh0dXJlMkRQcm9qTG9kKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgImZsb2F0NCBnbF90ZXh0dXJlMkRQcm9qTG9kKHNhbXBsZXIyRCBzLCBmbG9hdDMgdCwgZmxvYXQgbG9kKVxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdGV4MkRsb2QocywgZmxvYXQ0KHQueCAvIHQueiwgMSAtIHQueSAvIHQueiwgMCwgbG9kKSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgImZsb2F0NCBnbF90ZXh0dXJlMkRQcm9qTG9kKHNhbXBsZXIyRCBzLCBmbG9hdDQgdCwgZmxvYXQgbG9kKVxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdGV4MkRsb2QocywgZmxvYXQ0KHQueCAvIHQudywgMSAtIHQueSAvIHQudywgMCwgbG9kKSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Vc2VzVGV4dHVyZUN1YmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiZmxvYXQ0IGdsX3RleHR1cmVDdWJlKHNhbXBsZXJDVUJFIHMsIGZsb2F0MyB0KVxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdGV4Q1VCRWxvZChzLCBmbG9hdDQodC54LCAtdC55LCB0LnosIDApKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAgICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVVzZXNUZXh0dXJlQ3ViZUxvZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJmbG9hdDQgZ2xfdGV4dHVyZUN1YmVMb2Qoc2FtcGxlckNVQkUgcywgZmxvYXQzIHQsIGZsb2F0IGxvZClcbiIKKyAgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHRleENVQkVsb2QocywgZmxvYXQ0KHQueCwgLXQueSwgdC56LCBsb2QpKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAgICJcbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVVzZXNGcmFnQ29vcmQpCisgICAgeworICAgICAgICBvdXQgPDwgIiNkZWZpbmUgR0xfVVNFU19GUkFHX0NPT1JEXG4iOworICAgIH0KKworICAgIGlmIChtVXNlc1BvaW50Q29vcmQpCisgICAgeworICAgICAgICBvdXQgPDwgIiNkZWZpbmUgR0xfVVNFU19QT0lOVF9DT09SRFxuIjsKKyAgICB9CisKKyAgICBpZiAobVVzZXNGcm9udEZhY2luZykKKyAgICB7CisgICAgICAgIG91dCA8PCAiI2RlZmluZSBHTF9VU0VTX0ZST05UX0ZBQ0lOR1xuIjsKKyAgICB9CisKKyAgICBpZiAobVVzZXNQb2ludFNpemUpCisgICAgeworICAgICAgICBvdXQgPDwgIiNkZWZpbmUgR0xfVVNFU19QT0lOVF9TSVpFXG4iOworICAgIH0KKworICAgIGlmIChtVXNlc0RlcHRoUmFuZ2UpCisgICAgeworICAgICAgICBvdXQgPDwgInN0cnVjdCBnbF9EZXB0aFJhbmdlUGFyYW1ldGVyc1xuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgICAgZmxvYXQgbmVhcjtcbiIKKyAgICAgICAgICAgICAgICIgICAgZmxvYXQgZmFyO1xuIgorICAgICAgICAgICAgICAgIiAgICBmbG9hdCBkaWZmO1xuIgorICAgICAgICAgICAgICAgIn07XG4iCisgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAidW5pZm9ybSBmbG9hdDMgZHhfRGVwdGhSYW5nZTsiCisgICAgICAgICAgICAgICAic3RhdGljIGdsX0RlcHRoUmFuZ2VQYXJhbWV0ZXJzIGdsX0RlcHRoUmFuZ2UgPSB7ZHhfRGVwdGhSYW5nZS54LCBkeF9EZXB0aFJhbmdlLnksIGR4X0RlcHRoUmFuZ2Uuen07XG4iCisgICAgICAgICAgICAgICAiXG4iOworICAgIH0KKworICAgIGlmIChtVXNlc1hvcikKKyAgICB7CisgICAgICAgIG91dCA8PCAiYm9vbCB4b3IoYm9vbCBwLCBib29sIHEpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgICByZXR1cm4gKHAgfHwgcSkgJiYgIShwICYmIHEpO1xuIgorICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICJcbiI7CisgICAgfQorCisgICAgaWYgKG1Vc2VzTW9kMSkKKyAgICB7CisgICAgICAgIG91dCA8PCAiZmxvYXQgbW9kKGZsb2F0IHgsIGZsb2F0IHkpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgICByZXR1cm4geCAtIHkgKiBmbG9vcih4IC8geSk7XG4iCisgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgIlxuIjsKKyAgICB9CisgICAgCisgICAgaWYgKG1Vc2VzTW9kMikKKyAgICB7CisgICAgICAgIG91dCA8PCAiZmxvYXQyIG1vZChmbG9hdDIgeCwgZmxvYXQgeSlcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICAgIHJldHVybiB4IC0geSAqIGZsb29yKHggLyB5KTtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAiXG4iOworICAgIH0KKyAgICAKKyAgICBpZiAobVVzZXNNb2QzKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdDMgbW9kKGZsb2F0MyB4LCBmbG9hdCB5KVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHggLSB5ICogZmxvb3IoeCAvIHkpO1xuIgorICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICJcbiI7CisgICAgfQorCisgICAgaWYgKG1Vc2VzTW9kNCkKKyAgICB7CisgICAgICAgIG91dCA8PCAiZmxvYXQ0IG1vZChmbG9hdDQgeCwgZmxvYXQgeSlcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICAgIHJldHVybiB4IC0geSAqIGZsb29yKHggLyB5KTtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAiXG4iOworICAgIH0KKworICAgIGlmIChtVXNlc0ZhY2Vmb3J3YXJkMSkKKyAgICB7CisgICAgICAgIG91dCA8PCAiZmxvYXQgZmFjZWZvcndhcmQoZmxvYXQgTiwgZmxvYXQgSSwgZmxvYXQgTnJlZilcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICAgIGlmKGRvdChOcmVmLCBJKSA+PSAwKVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gLU47XG4iCisgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgICAgZWxzZVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gTjtcbiIKKyAgICAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICJcbiI7CisgICAgfQorCisgICAgaWYgKG1Vc2VzRmFjZWZvcndhcmQyKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdDIgZmFjZWZvcndhcmQoZmxvYXQyIE4sIGZsb2F0MiBJLCBmbG9hdDIgTnJlZilcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICAgIGlmKGRvdChOcmVmLCBJKSA+PSAwKVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gLU47XG4iCisgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgICAgZWxzZVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gTjtcbiIKKyAgICAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICJcbiI7CisgICAgfQorCisgICAgaWYgKG1Vc2VzRmFjZWZvcndhcmQzKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdDMgZmFjZWZvcndhcmQoZmxvYXQzIE4sIGZsb2F0MyBJLCBmbG9hdDMgTnJlZilcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICAgIGlmKGRvdChOcmVmLCBJKSA+PSAwKVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gLU47XG4iCisgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgICAgZWxzZVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gTjtcbiIKKyAgICAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICJcbiI7CisgICAgfQorCisgICAgaWYgKG1Vc2VzRmFjZWZvcndhcmQ0KQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdDQgZmFjZWZvcndhcmQoZmxvYXQ0IE4sIGZsb2F0NCBJLCBmbG9hdDQgTnJlZilcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICAgIGlmKGRvdChOcmVmLCBJKSA+PSAwKVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gLU47XG4iCisgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgICAgZWxzZVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gTjtcbiIKKyAgICAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICJcbiI7CisgICAgfQorCisgICAgaWYgKG1Vc2VzRXF1YWxNYXQyKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJib29sIGVxdWFsKGZsb2F0MngyIG0sIGZsb2F0MngyIG4pXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgICByZXR1cm4gbVswXVswXSA9PSBuWzBdWzBdICYmIG1bMF1bMV0gPT0gblswXVsxXSAmJlxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgbVsxXVswXSA9PSBuWzFdWzBdICYmIG1bMV1bMV0gPT0gblsxXVsxXTtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iOworICAgIH0KKworICAgIGlmIChtVXNlc0VxdWFsTWF0MykKKyAgICB7CisgICAgICAgIG91dCA8PCAiYm9vbCBlcXVhbChmbG9hdDN4MyBtLCBmbG9hdDN4MyBuKVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIG1bMF1bMF0gPT0gblswXVswXSAmJiBtWzBdWzFdID09IG5bMF1bMV0gJiYgbVswXVsyXSA9PSBuWzBdWzJdICYmXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICBtWzFdWzBdID09IG5bMV1bMF0gJiYgbVsxXVsxXSA9PSBuWzFdWzFdICYmIG1bMV1bMl0gPT0gblsxXVsyXSAmJlxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgbVsyXVswXSA9PSBuWzJdWzBdICYmIG1bMl1bMV0gPT0gblsyXVsxXSAmJiBtWzJdWzJdID09IG5bMl1bMl07XG4iCisgICAgICAgICAgICAgICAifVxuIjsKKyAgICB9CisKKyAgICBpZiAobVVzZXNFcXVhbE1hdDQpCisgICAgeworICAgICAgICBvdXQgPDwgImJvb2wgZXF1YWwoZmxvYXQ0eDQgbSwgZmxvYXQ0eDQgbilcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICAgIHJldHVybiBtWzBdWzBdID09IG5bMF1bMF0gJiYgbVswXVsxXSA9PSBuWzBdWzFdICYmIG1bMF1bMl0gPT0gblswXVsyXSAmJiBtWzBdWzNdID09IG5bMF1bM10gJiZcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgIG1bMV1bMF0gPT0gblsxXVswXSAmJiBtWzFdWzFdID09IG5bMV1bMV0gJiYgbVsxXVsyXSA9PSBuWzFdWzJdICYmIG1bMV1bM10gPT0gblsxXVszXSAmJlxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgbVsyXVswXSA9PSBuWzJdWzBdICYmIG1bMl1bMV0gPT0gblsyXVsxXSAmJiBtWzJdWzJdID09IG5bMl1bMl0gJiYgbVsyXVszXSA9PSBuWzJdWzNdICYmXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICBtWzNdWzBdID09IG5bM11bMF0gJiYgbVszXVsxXSA9PSBuWzNdWzFdICYmIG1bM11bMl0gPT0gblszXVsyXSAmJiBtWzNdWzNdID09IG5bM11bM107XG4iCisgICAgICAgICAgICAgICAifVxuIjsKKyAgICB9CisKKyAgICBpZiAobVVzZXNFcXVhbFZlYzIpCisgICAgeworICAgICAgICBvdXQgPDwgImJvb2wgZXF1YWwoZmxvYXQyIHYsIGZsb2F0MiB1KVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHYueCA9PSB1LnggJiYgdi55ID09IHUueTtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iOworICAgIH0KKworICAgIGlmIChtVXNlc0VxdWFsVmVjMykKKyAgICB7CisgICAgICAgIG91dCA8PCAiYm9vbCBlcXVhbChmbG9hdDMgdiwgZmxvYXQzIHUpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdi54ID09IHUueCAmJiB2LnkgPT0gdS55ICYmIHYueiA9PSB1Lno7XG4iCisgICAgICAgICAgICAgICAifVxuIjsKKyAgICB9CisKKyAgICBpZiAobVVzZXNFcXVhbFZlYzQpCisgICAgeworICAgICAgICBvdXQgPDwgImJvb2wgZXF1YWwoZmxvYXQ0IHYsIGZsb2F0NCB1KVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHYueCA9PSB1LnggJiYgdi55ID09IHUueSAmJiB2LnogPT0gdS56ICYmIHYudyA9PSB1Lnc7XG4iCisgICAgICAgICAgICAgICAifVxuIjsKKyAgICB9CisKKyAgICBpZiAobVVzZXNFcXVhbElWZWMyKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJib29sIGVxdWFsKGludDIgdiwgaW50MiB1KVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHYueCA9PSB1LnggJiYgdi55ID09IHUueTtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iOworICAgIH0KKworICAgIGlmIChtVXNlc0VxdWFsSVZlYzMpCisgICAgeworICAgICAgICBvdXQgPDwgImJvb2wgZXF1YWwoaW50MyB2LCBpbnQzIHUpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdi54ID09IHUueCAmJiB2LnkgPT0gdS55ICYmIHYueiA9PSB1Lno7XG4iCisgICAgICAgICAgICAgICAifVxuIjsKKyAgICB9CisKKyAgICBpZiAobVVzZXNFcXVhbElWZWM0KQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJib29sIGVxdWFsKGludDQgdiwgaW50NCB1KVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHYueCA9PSB1LnggJiYgdi55ID09IHUueSAmJiB2LnogPT0gdS56ICYmIHYudyA9PSB1Lnc7XG4iCisgICAgICAgICAgICAgICAifVxuIjsKKyAgICB9CisKKyAgICBpZiAobVVzZXNFcXVhbEJWZWMyKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJib29sIGVxdWFsKGJvb2wyIHYsIGJvb2wyIHUpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdi54ID09IHUueCAmJiB2LnkgPT0gdS55O1xuIgorICAgICAgICAgICAgICAgIn1cbiI7CisgICAgfQorCisgICAgaWYgKG1Vc2VzRXF1YWxCVmVjMykKKyAgICB7CisgICAgICAgIG91dCA8PCAiYm9vbCBlcXVhbChib29sMyB2LCBib29sMyB1KVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHYueCA9PSB1LnggJiYgdi55ID09IHUueSAmJiB2LnogPT0gdS56O1xuIgorICAgICAgICAgICAgICAgIn1cbiI7CisgICAgfQorCisgICAgaWYgKG1Vc2VzRXF1YWxCVmVjNCkKKyAgICB7CisgICAgICAgIG91dCA8PCAiYm9vbCBlcXVhbChib29sNCB2LCBib29sNCB1KVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHYueCA9PSB1LnggJiYgdi55ID09IHUueSAmJiB2LnogPT0gdS56ICYmIHYudyA9PSB1Lnc7XG4iCisgICAgICAgICAgICAgICAifVxuIjsKKyAgICB9CisKKyAgICBpZiAobVVzZXNBdGFuMikKKyAgICB7CisgICAgICAgIG91dCA8PCAiZmxvYXQgYXRhbnl4KGZsb2F0IHksIGZsb2F0IHgpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgICBpZih4ID09IDAgJiYgeSA9PSAwKSB4ID0gMTtcbiIgICAvLyBBdm9pZCBwcm9kdWNpbmcgYSBOYU4KKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIGF0YW4yKHksIHgpO1xuIgorICAgICAgICAgICAgICAgIn1cbiI7CisgICAgfQorfQorCit2b2lkIE91dHB1dEhMU0w6OnZpc2l0U3ltYm9sKFRJbnRlcm1TeW1ib2wgKm5vZGUpCit7CisgICAgVEluZm9TaW5rQmFzZSAmb3V0ID0gbUJvZHk7CisKKyAgICBUU3RyaW5nIG5hbWUgPSBub2RlLT5nZXRTeW1ib2woKTsKKworICAgIGlmIChuYW1lID09ICJnbF9GcmFnQ29sb3IiKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJnbF9Db2xvclswXSI7CisgICAgfQorICAgIGVsc2UgaWYgKG5hbWUgPT0gImdsX0ZyYWdEYXRhIikKKyAgICB7CisgICAgICAgIG91dCA8PCAiZ2xfQ29sb3IiOworICAgIH0KKyAgICBlbHNlIGlmIChuYW1lID09ICJnbF9EZXB0aFJhbmdlIikKKyAgICB7CisgICAgICAgIG1Vc2VzRGVwdGhSYW5nZSA9IHRydWU7CisgICAgICAgIG91dCA8PCBuYW1lOworICAgIH0KKyAgICBlbHNlIGlmIChuYW1lID09ICJnbF9GcmFnQ29vcmQiKQorICAgIHsKKyAgICAgICAgbVVzZXNGcmFnQ29vcmQgPSB0cnVlOworICAgICAgICBvdXQgPDwgbmFtZTsKKyAgICB9CisgICAgZWxzZSBpZiAobmFtZSA9PSAiZ2xfUG9pbnRDb29yZCIpCisgICAgeworICAgICAgICBtVXNlc1BvaW50Q29vcmQgPSB0cnVlOworICAgICAgICBvdXQgPDwgbmFtZTsKKyAgICB9CisgICAgZWxzZSBpZiAobmFtZSA9PSAiZ2xfRnJvbnRGYWNpbmciKQorICAgIHsKKyAgICAgICAgbVVzZXNGcm9udEZhY2luZyA9IHRydWU7CisgICAgICAgIG91dCA8PCBuYW1lOworICAgIH0KKyAgICBlbHNlIGlmIChuYW1lID09ICJnbF9Qb2ludFNpemUiKQorICAgIHsKKyAgICAgICAgbVVzZXNQb2ludFNpemUgPSB0cnVlOworICAgICAgICBvdXQgPDwgbmFtZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsaWZpZXIgPSBub2RlLT5nZXRRdWFsaWZpZXIoKTsKKworICAgICAgICBpZiAocXVhbGlmaWVyID09IEV2cVVuaWZvcm0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG1SZWZlcmVuY2VkVW5pZm9ybXMuaW5zZXJ0KG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBvdXQgPDwgZGVjb3JhdGVVbmlmb3JtKG5hbWUsIG5vZGUtPmlzQXJyYXkoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocXVhbGlmaWVyID09IEV2cUF0dHJpYnV0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbVJlZmVyZW5jZWRBdHRyaWJ1dGVzLmluc2VydChuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgb3V0IDw8IGRlY29yYXRlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHF1YWxpZmllciA9PSBFdnFWYXJ5aW5nT3V0IHx8IHF1YWxpZmllciA9PSBFdnFJbnZhcmlhbnRWYXJ5aW5nT3V0IHx8IHF1YWxpZmllciA9PSBFdnFWYXJ5aW5nSW4gfHwgcXVhbGlmaWVyID09IEV2cUludmFyaWFudFZhcnlpbmdJbikKKyAgICAgICAgeworICAgICAgICAgICAgbVJlZmVyZW5jZWRWYXJ5aW5ncy5pbnNlcnQobmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG91dCA8PCBkZWNvcmF0ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBkZWNvcmF0ZShuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBPdXRwdXRITFNMOjp2aXNpdEJpbmFyeShWaXNpdCB2aXNpdCwgVEludGVybUJpbmFyeSAqbm9kZSkKK3sKKyAgICBUSW5mb1NpbmtCYXNlICZvdXQgPSBtQm9keTsKKworICAgIHN3aXRjaCAobm9kZS0+Z2V0T3AoKSkKKyAgICB7CisgICAgICBjYXNlIEVPcEFzc2lnbjogICAgICAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIgPSAiLCAiKSIpOyAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEluaXRpYWxpemU6CisgICAgICAgIGlmICh2aXNpdCA9PSBQcmVWaXNpdCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gR0xTTCBhbGxvd3MgdG8gd3JpdGUgdGhpbmdzIGxpa2UgImZsb2F0IHggPSB4OyIgd2hlcmUgYSBuZXcgdmFyaWFibGUgeCBpcyBkZWZpbmVkCisgICAgICAgICAgICAvLyBhbmQgdGhlIHZhbHVlIG9mIGFuIGV4aXN0aW5nIHZhcmlhYmxlIHggaXMgYXNzaWduZWQuIEhMU0wgdXNlcyBDIHNlbWFudGljcyAodGhlCisgICAgICAgICAgICAvLyBuZXcgdmFyaWFibGUgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIGFzc2lnbm1lbnQgaXMgZXZhbHVhdGVkKSwgc28gd2UgbmVlZCB0byBjb252ZXJ0CisgICAgICAgICAgICAvLyB0aGlzIHRvICJmbG9hdCB0ID0geCwgeCA9IHQ7Ii4KKworICAgICAgICAgICAgVEludGVybVN5bWJvbCAqc3ltYm9sTm9kZSA9IG5vZGUtPmdldExlZnQoKS0+Z2V0QXNTeW1ib2xOb2RlKCk7CisgICAgICAgICAgICBUSW50ZXJtVHlwZWQgKmV4cHJlc3Npb24gPSBub2RlLT5nZXRSaWdodCgpOworCisgICAgICAgICAgICBzaDo6U2VhcmNoU3ltYm9sIHNlYXJjaFN5bWJvbChzeW1ib2xOb2RlLT5nZXRTeW1ib2woKSk7CisgICAgICAgICAgICBleHByZXNzaW9uLT50cmF2ZXJzZSgmc2VhcmNoU3ltYm9sKTsKKyAgICAgICAgICAgIGJvb2wgc2FtZVN5bWJvbCA9IHNlYXJjaFN5bWJvbC5mb3VuZE1hdGNoKCk7CisKKyAgICAgICAgICAgIGlmIChzYW1lU3ltYm9sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFR5cGUgYWxyZWFkeSBwcmludGVkCisgICAgICAgICAgICAgICAgb3V0IDw8ICJ0IiArIHN0cihtVW5pcXVlSW5kZXgpICsgIiA9ICI7CisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgICAgICAgICAgc3ltYm9sTm9kZS0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIgPSB0IiArIHN0cihtVW5pcXVlSW5kZXgpOworCisgICAgICAgICAgICAgICAgbVVuaXF1ZUluZGV4Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZpc2l0ID09IEluVmlzaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiID0gIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wQWRkQXNzaWduOiAgICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiArPSAiLCAiKSIpOyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wU3ViQXNzaWduOiAgICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiAtPSAiLCAiKSIpOyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wTXVsQXNzaWduOiAgICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiAqPSAiLCAiKSIpOyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wVmVjdG9yVGltZXNTY2FsYXJBc3NpZ246IG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiAqPSAiLCAiKSIpOyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNTY2FsYXJBc3NpZ246IG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiAqPSAiLCAiKSIpOyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wVmVjdG9yVGltZXNNYXRyaXhBc3NpZ246CisgICAgICAgIGlmICh2aXNpdCA9PSBQcmVWaXNpdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh2aXNpdCA9PSBJblZpc2l0KQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIiA9IG11bCgiOworICAgICAgICAgICAgbm9kZS0+Z2V0TGVmdCgpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICAgICAgICAgIG91dCA8PCAiLCB0cmFuc3Bvc2UoIjsgICAKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKSkpIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNNYXRyaXhBc3NpZ246CisgICAgICAgIGlmICh2aXNpdCA9PSBQcmVWaXNpdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh2aXNpdCA9PSBJblZpc2l0KQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIiA9IG11bCgiOworICAgICAgICAgICAgbm9kZS0+Z2V0TGVmdCgpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICAgICAgICAgIG91dCA8PCAiLCAiOyAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIpKSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcERpdkFzc2lnbjogICAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIgLz0gIiwgIikiKTsgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEluZGV4RGlyZWN0OiAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiIiwgIlsiLCAiXSIpOyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEluZGV4SW5kaXJlY3Q6ICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiIiwgIlsiLCAiXSIpOyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEluZGV4RGlyZWN0U3RydWN0OgorICAgICAgICBpZiAodmlzaXQgPT0gSW5WaXNpdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIuIiArIG5vZGUtPmdldFR5cGUoKS5nZXRGaWVsZE5hbWUoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BWZWN0b3JTd2l6emxlOgorICAgICAgICBpZiAodmlzaXQgPT0gSW5WaXNpdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIuIjsKKworICAgICAgICAgICAgVEludGVybUFnZ3JlZ2F0ZSAqc3dpenpsZSA9IG5vZGUtPmdldFJpZ2h0KCktPmdldEFzQWdncmVnYXRlKCk7CisKKyAgICAgICAgICAgIGlmIChzd2l6emxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRJbnRlcm1TZXF1ZW5jZSAmc2VxdWVuY2UgPSBzd2l6emxlLT5nZXRTZXF1ZW5jZSgpOworCisgICAgICAgICAgICAgICAgZm9yIChUSW50ZXJtU2VxdWVuY2U6Oml0ZXJhdG9yIHNpdCA9IHNlcXVlbmNlLmJlZ2luKCk7IHNpdCAhPSBzZXF1ZW5jZS5lbmQoKTsgc2l0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUSW50ZXJtQ29uc3RhbnRVbmlvbiAqZWxlbWVudCA9ICgqc2l0KS0+Z2V0QXNDb25zdGFudFVuaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gZWxlbWVudC0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKVswXS5nZXRJQ29uc3QoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBvdXQgPDwgIngiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogb3V0IDw8ICJ5IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IG91dCA8PCAieiI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBvdXQgPDwgInciOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIEZ1bGx5IHByb2Nlc3NlZAorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BBZGQ6ICAgICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIigiLCAiICsgIiwgIikiKTsgYnJlYWs7CisgICAgICBjYXNlIEVPcFN1YjogICAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIgLSAiLCAiKSIpOyBicmVhazsKKyAgICAgIGNhc2UgRU9wTXVsOiAgICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiAqICIsICIpIik7IGJyZWFrOworICAgICAgY2FzZSBFT3BEaXY6ICAgICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIigiLCAiIC8gIiwgIikiKTsgYnJlYWs7CisgICAgICBjYXNlIEVPcEVxdWFsOgorICAgICAgY2FzZSBFT3BOb3RFcXVhbDoKKyAgICAgICAgaWYgKG5vZGUtPmdldExlZnQoKS0+aXNTY2FsYXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5vZGUtPmdldE9wKCkgPT0gRU9wRXF1YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIigiLCAiID09ICIsICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIigiLCAiICE9ICIsICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobm9kZS0+Z2V0TGVmdCgpLT5nZXRCYXNpY1R5cGUoKSA9PSBFYnRTdHJ1Y3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChub2RlLT5nZXRPcCgpID09IEVPcEVxdWFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiKCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIhKCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IFRUeXBlTGlzdCAqZmllbGRzID0gbm9kZS0+Z2V0TGVmdCgpLT5nZXRUeXBlKCkuZ2V0U3RydWN0KCk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLT5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSAqZmllbGRUeXBlID0gKCpmaWVsZHMpW2ldLnR5cGU7CisKKyAgICAgICAgICAgICAgICBub2RlLT5nZXRMZWZ0KCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICAgICAgICAgIG91dCA8PCAiLiIgKyBmaWVsZFR5cGUtPmdldEZpZWxkTmFtZSgpICsgIiA9PSAiOworICAgICAgICAgICAgICAgIG5vZGUtPmdldFJpZ2h0KCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICAgICAgICAgIG91dCA8PCAiLiIgKyBmaWVsZFR5cGUtPmdldEZpZWxkTmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGkgPCBmaWVsZHMtPnNpemUoKSAtIDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIiAmJiAiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0IDw8ICIpIjsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5vZGUtPmdldExlZnQoKS0+aXNNYXRyaXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUtPmdldExlZnQoKS0+Z2V0Tm9taW5hbFNpemUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjYXNlIDI6IG1Vc2VzRXF1YWxNYXQyID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIDM6IG1Vc2VzRXF1YWxNYXQzID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIDQ6IG1Vc2VzRXF1YWxNYXQ0ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUtPmdldExlZnQoKS0+aXNWZWN0b3IoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUtPmdldExlZnQoKS0+Z2V0QmFzaWNUeXBlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2FzZSBFYnRGbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlLT5nZXRMZWZ0KCktPmdldE5vbWluYWxTaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IG1Vc2VzRXF1YWxWZWMyID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBtVXNlc0VxdWFsVmVjMyA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogbVVzZXNFcXVhbFZlYzQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBFYnRJbnQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+Z2V0TGVmdCgpLT5nZXROb21pbmFsU2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiBtVXNlc0VxdWFsSVZlYzIgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IG1Vc2VzRXF1YWxJVmVjMyA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogbVVzZXNFcXVhbElWZWM0ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgRWJ0Qm9vbDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlLT5nZXRMZWZ0KCktPmdldE5vbWluYWxTaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IG1Vc2VzRXF1YWxCVmVjMiA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogbVVzZXNFcXVhbEJWZWMzID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiBtVXNlc0VxdWFsQlZlYzQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIFVOUkVBQ0hBQkxFKCk7CisKKyAgICAgICAgICAgIGlmIChub2RlLT5nZXRPcCgpID09IEVPcEVxdWFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJlcXVhbCgiLCAiLCAiLCAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICIhZXF1YWwoIiwgIiwgIiwgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wTGVzc1RoYW46ICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiA8ICIsICIpIik7ICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEdyZWF0ZXJUaGFuOiAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIgPiAiLCAiKSIpOyAgIGJyZWFrOworICAgICAgY2FzZSBFT3BMZXNzVGhhbkVxdWFsOiAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIigiLCAiIDw9ICIsICIpIik7ICBicmVhazsKKyAgICAgIGNhc2UgRU9wR3JlYXRlclRoYW5FcXVhbDogIG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiA+PSAiLCAiKSIpOyAgYnJlYWs7CisgICAgICBjYXNlIEVPcFZlY3RvclRpbWVzU2NhbGFyOiBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIgKiAiLCAiKSIpOyAgIGJyZWFrOworICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc1NjYWxhcjogb3V0cHV0VHJpcGxldCh2aXNpdCwgIigiLCAiICogIiwgIikiKTsgICBicmVhazsKKyAgICAgIGNhc2UgRU9wVmVjdG9yVGltZXNNYXRyaXg6IG91dHB1dFRyaXBsZXQodmlzaXQsICJtdWwoIiwgIiwgdHJhbnNwb3NlKCIsICIpKSIpOyBicmVhazsKKyAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNWZWN0b3I6IG91dHB1dFRyaXBsZXQodmlzaXQsICJtdWwodHJhbnNwb3NlKCIsICIpLCAiLCAiKSIpOyBicmVhazsKKyAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNNYXRyaXg6IG91dHB1dFRyaXBsZXQodmlzaXQsICJ0cmFuc3Bvc2UobXVsKHRyYW5zcG9zZSgiLCAiKSwgdHJhbnNwb3NlKCIsICIpKSkiKTsgYnJlYWs7CisgICAgICBjYXNlIEVPcExvZ2ljYWxPcjogICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIgfHwgIiwgIikiKTsgIGJyZWFrOworICAgICAgY2FzZSBFT3BMb2dpY2FsWG9yOgorICAgICAgICBtVXNlc1hvciA9IHRydWU7CisgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJ4b3IoIiwgIiwgIiwgIikiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcExvZ2ljYWxBbmQ6ICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIgJiYgIiwgIikiKTsgIGJyZWFrOworICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPdXRwdXRITFNMOjp2aXNpdFVuYXJ5KFZpc2l0IHZpc2l0LCBUSW50ZXJtVW5hcnkgKm5vZGUpCit7CisgICAgVEluZm9TaW5rQmFzZSAmb3V0ID0gbUJvZHk7CisKKyAgICBzd2l0Y2ggKG5vZGUtPmdldE9wKCkpCisgICAgeworICAgICAgY2FzZSBFT3BOZWdhdGl2ZTogICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKC0iLCAiIiwgIikiKTsgIGJyZWFrOworICAgICAgY2FzZSBFT3BWZWN0b3JMb2dpY2FsTm90OiBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCEiLCAiIiwgIikiKTsgIGJyZWFrOworICAgICAgY2FzZSBFT3BMb2dpY2FsTm90OiAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCEiLCAiIiwgIikiKTsgIGJyZWFrOworICAgICAgY2FzZSBFT3BQb3N0SW5jcmVtZW50OiAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIiLCAiKyspIik7IGJyZWFrOworICAgICAgY2FzZSBFT3BQb3N0RGVjcmVtZW50OiAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIiLCAiLS0pIik7IGJyZWFrOworICAgICAgY2FzZSBFT3BQcmVJbmNyZW1lbnQ6ICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCsrIiwgIiIsICIpIik7IGJyZWFrOworICAgICAgY2FzZSBFT3BQcmVEZWNyZW1lbnQ6ICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKC0tIiwgIiIsICIpIik7IGJyZWFrOworICAgICAgY2FzZSBFT3BDb252SW50VG9Cb29sOgorICAgICAgY2FzZSBFT3BDb252RmxvYXRUb0Jvb2w6CisgICAgICAgIHN3aXRjaCAobm9kZS0+Z2V0T3BlcmFuZCgpLT5nZXRUeXBlKCkuZ2V0Tm9taW5hbFNpemUoKSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgMTogICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImJvb2woIiwgIiIsICIpIik7ICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6ICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJib29sMigiLCAiIiwgIikiKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOiAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiYm9vbDMoIiwgIiIsICIpIik7IGJyZWFrOworICAgICAgICAgIGNhc2UgNDogICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImJvb2w0KCIsICIiLCAiKSIpOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDb252Qm9vbFRvRmxvYXQ6CisgICAgICBjYXNlIEVPcENvbnZJbnRUb0Zsb2F0OgorICAgICAgICBzd2l0Y2ggKG5vZGUtPmdldE9wZXJhbmQoKS0+Z2V0VHlwZSgpLmdldE5vbWluYWxTaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDE6ICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJmbG9hdCgiLCAiIiwgIikiKTsgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjogICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImZsb2F0MigiLCAiIiwgIikiKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOiAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiZmxvYXQzKCIsICIiLCAiKSIpOyBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6ICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJmbG9hdDQoIiwgIiIsICIpIik7IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcENvbnZGbG9hdFRvSW50OgorICAgICAgY2FzZSBFT3BDb252Qm9vbFRvSW50OgorICAgICAgICBzd2l0Y2ggKG5vZGUtPmdldE9wZXJhbmQoKS0+Z2V0VHlwZSgpLmdldE5vbWluYWxTaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDE6ICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJpbnQoIiwgIiIsICIpIik7ICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6ICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJpbnQyKCIsICIiLCAiKSIpOyBicmVhazsKKyAgICAgICAgICBjYXNlIDM6ICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJpbnQzKCIsICIiLCAiKSIpOyBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6ICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJpbnQ0KCIsICIiLCAiKSIpOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BSYWRpYW5zOiAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAicmFkaWFucygiLCAiIiwgIikiKTsgICBicmVhazsKKyAgICAgIGNhc2UgRU9wRGVncmVlczogICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImRlZ3JlZXMoIiwgIiIsICIpIik7ICAgYnJlYWs7CisgICAgICBjYXNlIEVPcFNpbjogICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJzaW4oIiwgIiIsICIpIik7ICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDb3M6ICAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiY29zKCIsICIiLCAiKSIpOyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wVGFuOiAgICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgInRhbigiLCAiIiwgIikiKTsgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEFzaW46ICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJhc2luKCIsICIiLCAiKSIpOyAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BBY29zOiAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiYWNvcygiLCAiIiwgIikiKTsgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wQXRhbjogICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImF0YW4oIiwgIiIsICIpIik7ICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEV4cDogICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJleHAoIiwgIiIsICIpIik7ICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BMb2c6ICAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAibG9nKCIsICIiLCAiKSIpOyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wRXhwMjogICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImV4cDIoIiwgIiIsICIpIik7ICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcExvZzI6ICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJsb2cyKCIsICIiLCAiKSIpOyAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BTcXJ0OiAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAic3FydCgiLCAiIiwgIikiKTsgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wSW52ZXJzZVNxcnQ6ICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgInJzcXJ0KCIsICIiLCAiKSIpOyAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEFiczogICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJhYnMoIiwgIiIsICIpIik7ICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BTaWduOiAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAic2lnbigiLCAiIiwgIikiKTsgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wRmxvb3I6ICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImZsb29yKCIsICIiLCAiKSIpOyAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcENlaWw6ICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJjZWlsKCIsICIiLCAiKSIpOyAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BGcmFjdDogICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiZnJhYygiLCAiIiwgIikiKTsgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wTGVuZ3RoOiAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImxlbmd0aCgiLCAiIiwgIikiKTsgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcE5vcm1hbGl6ZTogICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJub3JtYWxpemUoIiwgIiIsICIpIik7IGJyZWFrOworICAgICAgY2FzZSBFT3BERmR4OiAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiZGR4KCIsICIiLCAiKSIpOyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wREZkeTogICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIigtZGR5KCIsICIiLCAiKSkiKTsgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEZ3aWR0aDogICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJmd2lkdGgoIiwgIiIsICIpIik7ICAgIGJyZWFrOyAgICAgICAgCisgICAgICBjYXNlIEVPcEFueTogICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJhbnkoIiwgIiIsICIpIik7ICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BBbGw6ICAgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiYWxsKCIsICIiLCAiKSIpOyAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT3V0cHV0SExTTDo6dmlzaXRBZ2dyZWdhdGUoVmlzaXQgdmlzaXQsIFRJbnRlcm1BZ2dyZWdhdGUgKm5vZGUpCit7CisgICAgU2hTaGFkZXJUeXBlIHNoYWRlclR5cGUgPSBtQ29udGV4dC5zaGFkZXJUeXBlOworICAgIFRJbmZvU2lua0Jhc2UgJm91dCA9IG1Cb2R5OworCisgICAgc3dpdGNoIChub2RlLT5nZXRPcCgpKQorICAgIHsKKyAgICAgIGNhc2UgRU9wU2VxdWVuY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSW5zaWRlRnVuY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0TGluZURpcmVjdGl2ZShub2RlLT5nZXRMaW5lKCkpOworICAgICAgICAgICAgICAgIG91dCA8PCAie1xuIjsKKworICAgICAgICAgICAgICAgIG1TY29wZURlcHRoKys7CisKKyAgICAgICAgICAgICAgICBpZiAobVNjb3BlQnJhY2tldC5zaXplKCkgPCBtU2NvcGVEZXB0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1TY29wZUJyYWNrZXQucHVzaF9iYWNrKDApOyAgIC8vIE5ldyBzY29wZSBsZXZlbAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtU2NvcGVCcmFja2V0W21TY29wZURlcHRoIC0gMV0rKzsgICAvLyBOZXcgc2NvcGUgYXQgZXhpc3RpbmcgbGV2ZWwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoVEludGVybVNlcXVlbmNlOjppdGVyYXRvciBzaXQgPSBub2RlLT5nZXRTZXF1ZW5jZSgpLmJlZ2luKCk7IHNpdCAhPSBub2RlLT5nZXRTZXF1ZW5jZSgpLmVuZCgpOyBzaXQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRMaW5lRGlyZWN0aXZlKCgqc2l0KS0+Z2V0TGluZSgpKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1NpbmdsZVN0YXRlbWVudCgqc2l0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1VbmZvbGRTZWxlY3QtPnRyYXZlcnNlKCpzaXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICgqc2l0KS0+dHJhdmVyc2UodGhpcyk7CisKKyAgICAgICAgICAgICAgICBvdXQgPDwgIjtcbiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSW5zaWRlRnVuY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0TGluZURpcmVjdGl2ZShub2RlLT5nZXRFbmRMaW5lKCkpOworICAgICAgICAgICAgICAgIG91dCA8PCAifVxuIjsKKworICAgICAgICAgICAgICAgIG1TY29wZURlcHRoLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgY2FzZSBFT3BEZWNsYXJhdGlvbjoKKyAgICAgICAgaWYgKHZpc2l0ID09IFByZVZpc2l0KQorICAgICAgICB7CisgICAgICAgICAgICBUSW50ZXJtU2VxdWVuY2UgJnNlcXVlbmNlID0gbm9kZS0+Z2V0U2VxdWVuY2UoKTsKKyAgICAgICAgICAgIFRJbnRlcm1UeXBlZCAqdmFyaWFibGUgPSBzZXF1ZW5jZVswXS0+Z2V0QXNUeXBlZCgpOworICAgICAgICAgICAgYm9vbCB2aXNpdCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZSAmJiAodmFyaWFibGUtPmdldFF1YWxpZmllcigpID09IEV2cVRlbXBvcmFyeSB8fCB2YXJpYWJsZS0+Z2V0UXVhbGlmaWVyKCkgPT0gRXZxR2xvYmFsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUtPmdldFR5cGUoKS5nZXRTdHJ1Y3QoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFkZENvbnN0cnVjdG9yKHZhcmlhYmxlLT5nZXRUeXBlKCksIHNjb3BlZFN0cnVjdCh2YXJpYWJsZS0+Z2V0VHlwZSgpLmdldFR5cGVOYW1lKCkpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlLT5nZXRBc1N5bWJvbE5vZGUoKSB8fCB2YXJpYWJsZS0+Z2V0QXNTeW1ib2xOb2RlKCktPmdldFN5bWJvbCgpICE9ICIiKSAgIC8vIFZhcmlhYmxlIGRlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnNpZGVGdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJzdGF0aWMgIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG91dCA8PCB0eXBlU3RyaW5nKHZhcmlhYmxlLT5nZXRUeXBlKCkpICsgIiAiOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoVEludGVybVNlcXVlbmNlOjppdGVyYXRvciBzaXQgPSBzZXF1ZW5jZS5iZWdpbigpOyBzaXQgIT0gc2VxdWVuY2UuZW5kKCk7IHNpdCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUSW50ZXJtU3ltYm9sICpzeW1ib2wgPSAoKnNpdCktPmdldEFzU3ltYm9sTm9kZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbC0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGFycmF5U3RyaW5nKHN5bWJvbC0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIiA9ICIgKyBpbml0aWFsaXplcih2YXJpYWJsZS0+Z2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnNpdCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlzaXQgJiYgdGhpcy0+aW5WaXNpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnNpdCAhPSBzZXF1ZW5jZS5iYWNrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpdCA9IHRoaXMtPnZpc2l0QWdncmVnYXRlKEluVmlzaXQsIG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh2aXNpdCAmJiB0aGlzLT5wb3N0VmlzaXQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnZpc2l0QWdncmVnYXRlKFBvc3RWaXNpdCwgbm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFyaWFibGUtPmdldEFzU3ltYm9sTm9kZSgpICYmIHZhcmlhYmxlLT5nZXRBc1N5bWJvbE5vZGUoKS0+Z2V0U3ltYm9sKCkgPT0gIiIpICAgLy8gVHlwZSAoc3RydWN0KSBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBhZGRlZCB0byBjb25zdHJ1Y3RvciBtYXAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmlzaXQgPT0gSW5WaXNpdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcFByb3RvdHlwZToKKyAgICAgICAgaWYgKHZpc2l0ID09IFByZVZpc2l0KQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgdHlwZVN0cmluZyhub2RlLT5nZXRUeXBlKCkpIDw8ICIgIiA8PCBkZWNvcmF0ZShub2RlLT5nZXROYW1lKCkpIDw8ICIoIjsKKworICAgICAgICAgICAgVEludGVybVNlcXVlbmNlICZhcmd1bWVudHMgPSBub2RlLT5nZXRTZXF1ZW5jZSgpOworCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUSW50ZXJtU3ltYm9sICpzeW1ib2wgPSBhcmd1bWVudHNbaV0tPmdldEFzU3ltYm9sTm9kZSgpOworCisgICAgICAgICAgICAgICAgaWYgKHN5bWJvbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBhcmd1bWVudFN0cmluZyhzeW1ib2wpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgYXJndW1lbnRzLnNpemUoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0IDw8ICIpO1xuIjsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDb21tYTogICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiIiwgIiwgIiwgIiIpOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wRnVuY3Rpb246CisgICAgICAgIHsKKyAgICAgICAgICAgIFRTdHJpbmcgbmFtZSA9IFRGdW5jdGlvbjo6dW5tYW5nbGVOYW1lKG5vZGUtPmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmICh2aXNpdCA9PSBQcmVWaXNpdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgdHlwZVN0cmluZyhub2RlLT5nZXRUeXBlKCkpIDw8ICIgIjsKKworICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJtYWluIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiZ2xfbWFpbigiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgZGVjb3JhdGUobmFtZSkgPDwgIigiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRJbnRlcm1TZXF1ZW5jZSAmc2VxdWVuY2UgPSBub2RlLT5nZXRTZXF1ZW5jZSgpOworICAgICAgICAgICAgICAgIFRJbnRlcm1TZXF1ZW5jZSAmYXJndW1lbnRzID0gc2VxdWVuY2VbMF0tPmdldEFzQWdncmVnYXRlKCktPmdldFNlcXVlbmNlKCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRJbnRlcm1TeW1ib2wgKnN5bWJvbCA9IGFyZ3VtZW50c1tpXS0+Z2V0QXNTeW1ib2xOb2RlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGFyZ3VtZW50U3RyaW5nKHN5bWJvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgYXJndW1lbnRzLnNpemUoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNlcXVlbmNlLmVyYXNlKHNlcXVlbmNlLmJlZ2luKCkpOworCisgICAgICAgICAgICAgICAgb3V0IDw8ICIpXG4iOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG91dHB1dExpbmVEaXJlY3RpdmUobm9kZS0+Z2V0TGluZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIntcbiI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbUluc2lkZUZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZpc2l0ID09IFBvc3RWaXNpdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRMaW5lRGlyZWN0aXZlKG5vZGUtPmdldEVuZExpbmUoKSk7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJ9XG4iOworCisgICAgICAgICAgICAgICAgbUluc2lkZUZ1bmN0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEZ1bmN0aW9uQ2FsbDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpc2l0ID09IFByZVZpc2l0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRTdHJpbmcgbmFtZSA9IFRGdW5jdGlvbjo6dW5tYW5nbGVOYW1lKG5vZGUtPmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAobm9kZS0+aXNVc2VyRGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGRlY29yYXRlKG5hbWUpIDw8ICIoIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gInRleHR1cmUyRCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLT5nZXRTZXF1ZW5jZSgpLnNpemUoKSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VzVGV4dHVyZTJEID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUtPmdldFNlcXVlbmNlKCkuc2l6ZSgpID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVzZXNUZXh0dXJlMkRfYmlhcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFVOUkVBQ0hBQkxFKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiZ2xfdGV4dHVyZTJEKCI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAidGV4dHVyZTJEUHJvaiIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLT5nZXRTZXF1ZW5jZSgpLnNpemUoKSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VzVGV4dHVyZTJEUHJvaiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLT5nZXRTZXF1ZW5jZSgpLnNpemUoKSA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VzVGV4dHVyZTJEUHJval9iaWFzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJnbF90ZXh0dXJlMkRQcm9qKCI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAidGV4dHVyZUN1YmUiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS0+Z2V0U2VxdWVuY2UoKS5zaXplKCkgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXNlc1RleHR1cmVDdWJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUtPmdldFNlcXVlbmNlKCkuc2l6ZSgpID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVzZXNUZXh0dXJlQ3ViZV9iaWFzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJnbF90ZXh0dXJlQ3ViZSgiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gInRleHR1cmUyRExvZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLT5nZXRTZXF1ZW5jZSgpLnNpemUoKSA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VzVGV4dHVyZTJETG9kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJnbF90ZXh0dXJlMkRMb2QoIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lID09ICJ0ZXh0dXJlMkRQcm9qTG9kIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUtPmdldFNlcXVlbmNlKCkuc2l6ZSgpID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVzZXNUZXh0dXJlMkRQcm9qTG9kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJnbF90ZXh0dXJlMkRQcm9qTG9kKCI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAidGV4dHVyZUN1YmVMb2QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS0+Z2V0U2VxdWVuY2UoKS5zaXplKCkgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXNlc1RleHR1cmVDdWJlTG9kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJnbF90ZXh0dXJlQ3ViZUxvZCgiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aXNpdCA9PSBJblZpc2l0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcFBhcmFtZXRlcnM6ICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiwgIiwgIilcbntcbiIpOyAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wQ29uc3RydWN0RmxvYXQ6CisgICAgICAgIGFkZENvbnN0cnVjdG9yKG5vZGUtPmdldFR5cGUoKSwgInZlYzEiLCAmbm9kZS0+Z2V0U2VxdWVuY2UoKSk7CisgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJ2ZWMxKCIsICIiLCAiKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wQ29uc3RydWN0VmVjMjoKKyAgICAgICAgYWRkQ29uc3RydWN0b3Iobm9kZS0+Z2V0VHlwZSgpLCAidmVjMiIsICZub2RlLT5nZXRTZXF1ZW5jZSgpKTsKKyAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgInZlYzIoIiwgIiwgIiwgIikiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcENvbnN0cnVjdFZlYzM6CisgICAgICAgIGFkZENvbnN0cnVjdG9yKG5vZGUtPmdldFR5cGUoKSwgInZlYzMiLCAmbm9kZS0+Z2V0U2VxdWVuY2UoKSk7CisgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJ2ZWMzKCIsICIsICIsICIpIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RWZWM0OgorICAgICAgICBhZGRDb25zdHJ1Y3Rvcihub2RlLT5nZXRUeXBlKCksICJ2ZWM0IiwgJm5vZGUtPmdldFNlcXVlbmNlKCkpOworICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAidmVjNCgiLCAiLCAiLCAiKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wQ29uc3RydWN0Qm9vbDoKKyAgICAgICAgYWRkQ29uc3RydWN0b3Iobm9kZS0+Z2V0VHlwZSgpLCAiYnZlYzEiLCAmbm9kZS0+Z2V0U2VxdWVuY2UoKSk7CisgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJidmVjMSgiLCAiIiwgIikiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcENvbnN0cnVjdEJWZWMyOgorICAgICAgICBhZGRDb25zdHJ1Y3Rvcihub2RlLT5nZXRUeXBlKCksICJidmVjMiIsICZub2RlLT5nZXRTZXF1ZW5jZSgpKTsKKyAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImJ2ZWMyKCIsICIsICIsICIpIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RCVmVjMzoKKyAgICAgICAgYWRkQ29uc3RydWN0b3Iobm9kZS0+Z2V0VHlwZSgpLCAiYnZlYzMiLCAmbm9kZS0+Z2V0U2VxdWVuY2UoKSk7CisgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJidmVjMygiLCAiLCAiLCAiKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wQ29uc3RydWN0QlZlYzQ6CisgICAgICAgIGFkZENvbnN0cnVjdG9yKG5vZGUtPmdldFR5cGUoKSwgImJ2ZWM0IiwgJm5vZGUtPmdldFNlcXVlbmNlKCkpOworICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiYnZlYzQoIiwgIiwgIiwgIikiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcENvbnN0cnVjdEludDoKKyAgICAgICAgYWRkQ29uc3RydWN0b3Iobm9kZS0+Z2V0VHlwZSgpLCAiaXZlYzEiLCAmbm9kZS0+Z2V0U2VxdWVuY2UoKSk7CisgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJpdmVjMSgiLCAiIiwgIikiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcENvbnN0cnVjdElWZWMyOgorICAgICAgICBhZGRDb25zdHJ1Y3Rvcihub2RlLT5nZXRUeXBlKCksICJpdmVjMiIsICZub2RlLT5nZXRTZXF1ZW5jZSgpKTsKKyAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIml2ZWMyKCIsICIsICIsICIpIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RJVmVjMzoKKyAgICAgICAgYWRkQ29uc3RydWN0b3Iobm9kZS0+Z2V0VHlwZSgpLCAiaXZlYzMiLCAmbm9kZS0+Z2V0U2VxdWVuY2UoKSk7CisgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJpdmVjMygiLCAiLCAiLCAiKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wQ29uc3RydWN0SVZlYzQ6CisgICAgICAgIGFkZENvbnN0cnVjdG9yKG5vZGUtPmdldFR5cGUoKSwgIml2ZWM0IiwgJm5vZGUtPmdldFNlcXVlbmNlKCkpOworICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiaXZlYzQoIiwgIiwgIiwgIikiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcENvbnN0cnVjdE1hdDI6CisgICAgICAgIGFkZENvbnN0cnVjdG9yKG5vZGUtPmdldFR5cGUoKSwgIm1hdDIiLCAmbm9kZS0+Z2V0U2VxdWVuY2UoKSk7CisgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJtYXQyKCIsICIsICIsICIpIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RNYXQzOgorICAgICAgICBhZGRDb25zdHJ1Y3Rvcihub2RlLT5nZXRUeXBlKCksICJtYXQzIiwgJm5vZGUtPmdldFNlcXVlbmNlKCkpOworICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAibWF0MygiLCAiLCAiLCAiKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wQ29uc3RydWN0TWF0NDogCisgICAgICAgIGFkZENvbnN0cnVjdG9yKG5vZGUtPmdldFR5cGUoKSwgIm1hdDQiLCAmbm9kZS0+Z2V0U2VxdWVuY2UoKSk7CisgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJtYXQ0KCIsICIsICIsICIpIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDb25zdHJ1Y3RTdHJ1Y3Q6CisgICAgICAgIGFkZENvbnN0cnVjdG9yKG5vZGUtPmdldFR5cGUoKSwgc2NvcGVkU3RydWN0KG5vZGUtPmdldFR5cGUoKS5nZXRUeXBlTmFtZSgpKSwgJm5vZGUtPmdldFNlcXVlbmNlKCkpOworICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCBzdHJ1Y3RMb29rdXAobm9kZS0+Z2V0VHlwZSgpLmdldFR5cGVOYW1lKCkpICsgIl9jdG9yKCIsICIsICIsICIpIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BMZXNzVGhhbjogICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIgPCAiLCAiKSIpOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcEdyZWF0ZXJUaGFuOiAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiA+ICIsICIpIik7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wTGVzc1RoYW5FcXVhbDogICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIigiLCAiIDw9ICIsICIpIik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbkVxdWFsOiBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiKCIsICIgPj0gIiwgIikiKTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcFZlY3RvckVxdWFsOiAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICIoIiwgIiA9PSAiLCAiKSIpOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wVmVjdG9yTm90RXF1YWw6ICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIigiLCAiICE9ICIsICIpIik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BNb2Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+Z2V0U2VxdWVuY2UoKVswXS0+Z2V0QXNUeXBlZCgpLT5nZXROb21pbmFsU2l6ZSgpKSAgIC8vIE51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBmaXJzdCBhcmd1bWVudAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIDE6IG1Vc2VzTW9kMSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDI6IG1Vc2VzTW9kMiA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDM6IG1Vc2VzTW9kMyA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDQ6IG1Vc2VzTW9kNCA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAibW9kKCIsICIsICIsICIpIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcFBvdzogICAgICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJwb3coIiwgIiwgIiwgIikiKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wQXRhbjoKKyAgICAgICAgQVNTRVJUKG5vZGUtPmdldFNlcXVlbmNlKCkuc2l6ZSgpID09IDIpOyAgIC8vIGF0YW4oeCkgaXMgYSB1bmFyeSBvcGVyYXRvcgorICAgICAgICBtVXNlc0F0YW4yID0gdHJ1ZTsKKyAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImF0YW55eCgiLCAiLCAiLCAiKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wTWluOiAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIm1pbigiLCAiLCAiLCAiKSIpOyAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcE1heDogICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJtYXgoIiwgIiwgIiwgIikiKTsgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDbGFtcDogICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiY2xhbXAoIiwgIiwgIiwgIikiKTsgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wTWl4OiAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImxlcnAoIiwgIiwgIiwgIikiKTsgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcFN0ZXA6ICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJzdGVwKCIsICIsICIsICIpIik7ICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BTbW9vdGhTdGVwOiAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAic21vb3Roc3RlcCgiLCAiLCAiLCAiKSIpOyAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wRGlzdGFuY2U6ICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImRpc3RhbmNlKCIsICIsICIsICIpIik7ICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcERvdDogICAgICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJkb3QoIiwgIiwgIiwgIikiKTsgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDcm9zczogICAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiY3Jvc3MoIiwgIiwgIiwgIikiKTsgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wRmFjZUZvcndhcmQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+Z2V0U2VxdWVuY2UoKVswXS0+Z2V0QXNUeXBlZCgpLT5nZXROb21pbmFsU2l6ZSgpKSAgIC8vIE51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBmaXJzdCBhcmd1bWVudAorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxOiBtVXNlc0ZhY2Vmb3J3YXJkMSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBtVXNlc0ZhY2Vmb3J3YXJkMiA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiBtVXNlc0ZhY2Vmb3J3YXJkMyA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiBtVXNlc0ZhY2Vmb3J3YXJkNCA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgImZhY2Vmb3J3YXJkKCIsICIsICIsICIpIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVPcFJlZmxlY3Q6ICAgICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJyZWZsZWN0KCIsICIsICIsICIpIik7ICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BSZWZyYWN0OiAgICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAicmVmcmFjdCgiLCAiLCAiLCAiKSIpOyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wTXVsOiAgICAgICAgICAgb3V0cHV0VHJpcGxldCh2aXNpdCwgIigiLCAiICogIiwgIikiKTsgICAgICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE91dHB1dEhMU0w6OnZpc2l0U2VsZWN0aW9uKFZpc2l0IHZpc2l0LCBUSW50ZXJtU2VsZWN0aW9uICpub2RlKQoreworICAgIFRJbmZvU2lua0Jhc2UgJm91dCA9IG1Cb2R5OworCisgICAgaWYgKG5vZGUtPnVzZXNUZXJuYXJ5T3BlcmF0b3IoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAicyIgPDwgbVVuZm9sZFNlbGVjdC0+Z2V0TmV4dFRlbXBvcmFyeUluZGV4KCk7CisgICAgfQorICAgIGVsc2UgIC8vIGlmL2Vsc2Ugc3RhdGVtZW50CisgICAgeworICAgICAgICBtVW5mb2xkU2VsZWN0LT50cmF2ZXJzZShub2RlLT5nZXRDb25kaXRpb24oKSk7CisKKyAgICAgICAgb3V0IDw8ICJpZigiOworCisgICAgICAgIG5vZGUtPmdldENvbmRpdGlvbigpLT50cmF2ZXJzZSh0aGlzKTsKKworICAgICAgICBvdXQgPDwgIilcbiI7CisgICAgICAgIAorICAgICAgICBvdXRwdXRMaW5lRGlyZWN0aXZlKG5vZGUtPmdldExpbmUoKSk7CisgICAgICAgIG91dCA8PCAie1xuIjsKKworICAgICAgICBpZiAobm9kZS0+Z2V0VHJ1ZUJsb2NrKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGUtPmdldFRydWVCbG9jaygpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dExpbmVEaXJlY3RpdmUobm9kZS0+Z2V0TGluZSgpKTsKKyAgICAgICAgb3V0IDw8ICI7fVxuIjsKKworICAgICAgICBpZiAobm9kZS0+Z2V0RmFsc2VCbG9jaygpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgImVsc2VcbiI7CisKKyAgICAgICAgICAgIG91dHB1dExpbmVEaXJlY3RpdmUobm9kZS0+Z2V0RmFsc2VCbG9jaygpLT5nZXRMaW5lKCkpOworICAgICAgICAgICAgb3V0IDw8ICJ7XG4iOworCisgICAgICAgICAgICBvdXRwdXRMaW5lRGlyZWN0aXZlKG5vZGUtPmdldEZhbHNlQmxvY2soKS0+Z2V0TGluZSgpKTsKKyAgICAgICAgICAgIG5vZGUtPmdldEZhbHNlQmxvY2soKS0+dHJhdmVyc2UodGhpcyk7CisKKyAgICAgICAgICAgIG91dHB1dExpbmVEaXJlY3RpdmUobm9kZS0+Z2V0RmFsc2VCbG9jaygpLT5nZXRMaW5lKCkpOworICAgICAgICAgICAgb3V0IDw8ICI7fVxuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBPdXRwdXRITFNMOjp2aXNpdENvbnN0YW50VW5pb24oVEludGVybUNvbnN0YW50VW5pb24gKm5vZGUpCit7CisgICAgd3JpdGVDb25zdGFudFVuaW9uKG5vZGUtPmdldFR5cGUoKSwgbm9kZS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKSk7Cit9CisKK2Jvb2wgT3V0cHV0SExTTDo6dmlzaXRMb29wKFZpc2l0IHZpc2l0LCBUSW50ZXJtTG9vcCAqbm9kZSkKK3sKKyAgICBpZiAoaGFuZGxlRXhjZXNzaXZlTG9vcChub2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBUSW5mb1NpbmtCYXNlICZvdXQgPSBtQm9keTsKKworICAgIGlmIChub2RlLT5nZXRUeXBlKCkgPT0gRUxvb3BEb1doaWxlKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJkb1xuIjsKKworICAgICAgICBvdXRwdXRMaW5lRGlyZWN0aXZlKG5vZGUtPmdldExpbmUoKSk7CisgICAgICAgIG91dCA8PCAie1xuIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJmb3IoIjsKKyAgICAgICAgCisgICAgICAgIGlmIChub2RlLT5nZXRJbml0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGUtPmdldEluaXQoKS0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgIjsgIjsKKworICAgICAgICBpZiAobm9kZS0+Z2V0Q29uZGl0aW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGUtPmdldENvbmRpdGlvbigpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiOyAiOworCisgICAgICAgIGlmIChub2RlLT5nZXRFeHByZXNzaW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGUtPmdldEV4cHJlc3Npb24oKS0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgIilcbiI7CisgICAgICAgIAorICAgICAgICBvdXRwdXRMaW5lRGlyZWN0aXZlKG5vZGUtPmdldExpbmUoKSk7CisgICAgICAgIG91dCA8PCAie1xuIjsKKyAgICB9CisKKyAgICBpZiAobm9kZS0+Z2V0Qm9keSgpKQorICAgIHsKKyAgICAgICAgbm9kZS0+Z2V0Qm9keSgpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICB9CisKKyAgICBvdXRwdXRMaW5lRGlyZWN0aXZlKG5vZGUtPmdldExpbmUoKSk7CisgICAgb3V0IDw8ICI7fVxuIjsKKworICAgIGlmIChub2RlLT5nZXRUeXBlKCkgPT0gRUxvb3BEb1doaWxlKQorICAgIHsKKyAgICAgICAgb3V0cHV0TGluZURpcmVjdGl2ZShub2RlLT5nZXRDb25kaXRpb24oKS0+Z2V0TGluZSgpKTsKKyAgICAgICAgb3V0IDw8ICJ3aGlsZShcbiI7CisKKyAgICAgICAgbm9kZS0+Z2V0Q29uZGl0aW9uKCktPnRyYXZlcnNlKHRoaXMpOworCisgICAgICAgIG91dCA8PCAiKSI7CisgICAgfQorCisgICAgb3V0IDw8ICI7XG4iOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE91dHB1dEhMU0w6OnZpc2l0QnJhbmNoKFZpc2l0IHZpc2l0LCBUSW50ZXJtQnJhbmNoICpub2RlKQoreworICAgIFRJbmZvU2lua0Jhc2UgJm91dCA9IG1Cb2R5OworCisgICAgc3dpdGNoIChub2RlLT5nZXRGbG93T3AoKSkKKyAgICB7CisgICAgICBjYXNlIEVPcEtpbGw6ICAgICBvdXRwdXRUcmlwbGV0KHZpc2l0LCAiZGlzY2FyZDtcbiIsICIiLCAiIik7ICBicmVhazsKKyAgICAgIGNhc2UgRU9wQnJlYWs6ICAgIG91dHB1dFRyaXBsZXQodmlzaXQsICJicmVhaztcbiIsICIiLCAiIik7ICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BDb250aW51ZTogb3V0cHV0VHJpcGxldCh2aXNpdCwgImNvbnRpbnVlO1xuIiwgIiIsICIiKTsgYnJlYWs7CisgICAgICBjYXNlIEVPcFJldHVybjoKKyAgICAgICAgaWYgKHZpc2l0ID09IFByZVZpc2l0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobm9kZS0+Z2V0RXhwcmVzc2lvbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAicmV0dXJuICI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJyZXR1cm47XG4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZpc2l0ID09IFBvc3RWaXNpdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5vZGUtPmdldEV4cHJlc3Npb24oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIjtcbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE91dHB1dEhMU0w6OmlzU2luZ2xlU3RhdGVtZW50KFRJbnRlcm1Ob2RlICpub2RlKQoreworICAgIFRJbnRlcm1BZ2dyZWdhdGUgKmFnZ3JlZ2F0ZSA9IG5vZGUtPmdldEFzQWdncmVnYXRlKCk7CisKKyAgICBpZiAoYWdncmVnYXRlKQorICAgIHsKKyAgICAgICAgaWYgKGFnZ3JlZ2F0ZS0+Z2V0T3AoKSA9PSBFT3BTZXF1ZW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChUSW50ZXJtU2VxdWVuY2U6Oml0ZXJhdG9yIHNpdCA9IGFnZ3JlZ2F0ZS0+Z2V0U2VxdWVuY2UoKS5iZWdpbigpOyBzaXQgIT0gYWdncmVnYXRlLT5nZXRTZXF1ZW5jZSgpLmVuZCgpOyBzaXQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzU2luZ2xlU3RhdGVtZW50KCpzaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gSGFuZGxlIGxvb3BzIHdpdGggbW9yZSB0aGFuIDI1NSBpdGVyYXRpb25zICh1bnN1cHBvcnRlZCBieSBEM0Q5KSBieSBzcGxpdHRpbmcgdGhlbQorYm9vbCBPdXRwdXRITFNMOjpoYW5kbGVFeGNlc3NpdmVMb29wKFRJbnRlcm1Mb29wICpub2RlKQoreworICAgIFRJbmZvU2lua0Jhc2UgJm91dCA9IG1Cb2R5OworCisgICAgLy8gUGFyc2UgbG9vcHMgb2YgdGhlIGZvcm06CisgICAgLy8gZm9yKGludCBpbmRleCA9IGluaXRpYWw7IGluZGV4IFtjb21wYXJhdG9yXSBsaW1pdDsgaW5kZXggKz0gaW5jcmVtZW50KQorICAgIFRJbnRlcm1TeW1ib2wgKmluZGV4ID0gTlVMTDsKKyAgICBUT3BlcmF0b3IgY29tcGFyYXRvciA9IEVPcE51bGw7CisgICAgaW50IGluaXRpYWwgPSAwOworICAgIGludCBsaW1pdCA9IDA7CisgICAgaW50IGluY3JlbWVudCA9IDA7CisKKyAgICAvLyBQYXJzZSBpbmRleCBuYW1lIGFuZCBpbnRpYWwgdmFsdWUKKyAgICBpZiAobm9kZS0+Z2V0SW5pdCgpKQorICAgIHsKKyAgICAgICAgVEludGVybUFnZ3JlZ2F0ZSAqaW5pdCA9IG5vZGUtPmdldEluaXQoKS0+Z2V0QXNBZ2dyZWdhdGUoKTsKKworICAgICAgICBpZiAoaW5pdCkKKyAgICAgICAgeworICAgICAgICAgICAgVEludGVybVNlcXVlbmNlICZzZXF1ZW5jZSA9IGluaXQtPmdldFNlcXVlbmNlKCk7CisgICAgICAgICAgICBUSW50ZXJtVHlwZWQgKnZhcmlhYmxlID0gc2VxdWVuY2VbMF0tPmdldEFzVHlwZWQoKTsKKworICAgICAgICAgICAgaWYgKHZhcmlhYmxlICYmIHZhcmlhYmxlLT5nZXRRdWFsaWZpZXIoKSA9PSBFdnFUZW1wb3JhcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVEludGVybUJpbmFyeSAqYXNzaWduID0gdmFyaWFibGUtPmdldEFzQmluYXJ5Tm9kZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGFzc2lnbi0+Z2V0T3AoKSA9PSBFT3BJbml0aWFsaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVEludGVybVN5bWJvbCAqc3ltYm9sID0gYXNzaWduLT5nZXRMZWZ0KCktPmdldEFzU3ltYm9sTm9kZSgpOworICAgICAgICAgICAgICAgICAgICBUSW50ZXJtQ29uc3RhbnRVbmlvbiAqY29uc3RhbnQgPSBhc3NpZ24tPmdldFJpZ2h0KCktPmdldEFzQ29uc3RhbnRVbmlvbigpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgJiYgY29uc3RhbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zdGFudC0+Z2V0QmFzaWNUeXBlKCkgPT0gRWJ0SW50ICYmIGNvbnN0YW50LT5nZXROb21pbmFsU2l6ZSgpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBzeW1ib2w7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCA9IGNvbnN0YW50LT5nZXRVbmlvbkFycmF5UG9pbnRlcigpWzBdLmdldElDb25zdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUGFyc2UgY29tcGFyYXRvciBhbmQgbGltaXQgdmFsdWUKKyAgICBpZiAoaW5kZXggIT0gTlVMTCAmJiBub2RlLT5nZXRDb25kaXRpb24oKSkKKyAgICB7CisgICAgICAgIFRJbnRlcm1CaW5hcnkgKnRlc3QgPSBub2RlLT5nZXRDb25kaXRpb24oKS0+Z2V0QXNCaW5hcnlOb2RlKCk7CisgICAgICAgIAorICAgICAgICBpZiAodGVzdCAmJiB0ZXN0LT5nZXRMZWZ0KCktPmdldEFzU3ltYm9sTm9kZSgpLT5nZXRJZCgpID09IGluZGV4LT5nZXRJZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBUSW50ZXJtQ29uc3RhbnRVbmlvbiAqY29uc3RhbnQgPSB0ZXN0LT5nZXRSaWdodCgpLT5nZXRBc0NvbnN0YW50VW5pb24oKTsKKworICAgICAgICAgICAgaWYgKGNvbnN0YW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb25zdGFudC0+Z2V0QmFzaWNUeXBlKCkgPT0gRWJ0SW50ICYmIGNvbnN0YW50LT5nZXROb21pbmFsU2l6ZSgpID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yID0gdGVzdC0+Z2V0T3AoKTsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBjb25zdGFudC0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKVswXS5nZXRJQ29uc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQYXJzZSBpbmNyZW1lbnQKKyAgICBpZiAoaW5kZXggIT0gTlVMTCAmJiBjb21wYXJhdG9yICE9IEVPcE51bGwgJiYgbm9kZS0+Z2V0RXhwcmVzc2lvbigpKQorICAgIHsKKyAgICAgICAgVEludGVybUJpbmFyeSAqYmluYXJ5VGVybWluYWwgPSBub2RlLT5nZXRFeHByZXNzaW9uKCktPmdldEFzQmluYXJ5Tm9kZSgpOworICAgICAgICBUSW50ZXJtVW5hcnkgKnVuYXJ5VGVybWluYWwgPSBub2RlLT5nZXRFeHByZXNzaW9uKCktPmdldEFzVW5hcnlOb2RlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoYmluYXJ5VGVybWluYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRPcGVyYXRvciBvcCA9IGJpbmFyeVRlcm1pbmFsLT5nZXRPcCgpOworICAgICAgICAgICAgVEludGVybUNvbnN0YW50VW5pb24gKmNvbnN0YW50ID0gYmluYXJ5VGVybWluYWwtPmdldFJpZ2h0KCktPmdldEFzQ29uc3RhbnRVbmlvbigpOworCisgICAgICAgICAgICBpZiAoY29uc3RhbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0YW50LT5nZXRCYXNpY1R5cGUoKSA9PSBFYnRJbnQgJiYgY29uc3RhbnQtPmdldE5vbWluYWxTaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IGNvbnN0YW50LT5nZXRVbmlvbkFycmF5UG9pbnRlcigpWzBdLmdldElDb25zdCgpOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3ApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVPcEFkZEFzc2lnbjogaW5jcmVtZW50ID0gdmFsdWU7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVPcFN1YkFzc2lnbjogaW5jcmVtZW50ID0gLXZhbHVlOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBVTklNUExFTUVOVEVEKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodW5hcnlUZXJtaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgVE9wZXJhdG9yIG9wID0gdW5hcnlUZXJtaW5hbC0+Z2V0T3AoKTsKKworICAgICAgICAgICAgc3dpdGNoIChvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBFT3BQb3N0SW5jcmVtZW50OiBpbmNyZW1lbnQgPSAxOyAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRU9wUG9zdERlY3JlbWVudDogaW5jcmVtZW50ID0gLTE7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVPcFByZUluY3JlbWVudDogIGluY3JlbWVudCA9IDE7ICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFT3BQcmVEZWNyZW1lbnQ6ICBpbmNyZW1lbnQgPSAtMTsgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6IFVOSU1QTEVNRU5URUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbmRleCAhPSBOVUxMICYmIGNvbXBhcmF0b3IgIT0gRU9wTnVsbCAmJiBpbmNyZW1lbnQgIT0gMCkKKyAgICB7CisgICAgICAgIGlmIChjb21wYXJhdG9yID09IEVPcExlc3NUaGFuRXF1YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbXBhcmF0b3IgPSBFT3BMZXNzVGhhbjsKKyAgICAgICAgICAgIGxpbWl0ICs9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29tcGFyYXRvciA9PSBFT3BMZXNzVGhhbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSAobGltaXQgLSBpbml0aWFsKSAvIGluY3JlbWVudDsKKworICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPD0gMjU1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBOb3QgYW4gZXhjZXNzaXZlIGxvb3AKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdGlvbnMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByZW1haW5kZXIgPSAobGltaXQgLSBpbml0aWFsKSAlIGluY3JlbWVudDsKKyAgICAgICAgICAgICAgICBpbnQgY2xhbXBlZExpbWl0ID0gaW5pdGlhbCArIGluY3JlbWVudCAqIHN0ZDo6bWluKDI1NSwgaXRlcmF0aW9ucyk7CisKKyAgICAgICAgICAgICAgICAvLyBmb3IoaW50IGluZGV4ID0gaW5pdGlhbDsgaW5kZXggPCBjbGFtcGVkTGltaXQ7IGluZGV4ICs9IGluY3JlbWVudCkKKworICAgICAgICAgICAgICAgIG91dCA8PCAiZm9yKGludCAiOworICAgICAgICAgICAgICAgIGluZGV4LT50cmF2ZXJzZSh0aGlzKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIiA9ICI7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluaXRpYWw7CisKKyAgICAgICAgICAgICAgICBvdXQgPDwgIjsgIjsKKyAgICAgICAgICAgICAgICBpbmRleC0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIgPCAiOworICAgICAgICAgICAgICAgIG91dCA8PCBjbGFtcGVkTGltaXQ7CisKKyAgICAgICAgICAgICAgICBvdXQgPDwgIjsgIjsKKyAgICAgICAgICAgICAgICBpbmRleC0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIgKz0gIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5jcmVtZW50OworICAgICAgICAgICAgICAgIG91dCA8PCAiKVxuIjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvdXRwdXRMaW5lRGlyZWN0aXZlKG5vZGUtPmdldExpbmUoKSk7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJ7XG4iOworCisgICAgICAgICAgICAgICAgaWYgKG5vZGUtPmdldEJvZHkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUtPmdldEJvZHkoKS0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb3V0cHV0TGluZURpcmVjdGl2ZShub2RlLT5nZXRMaW5lKCkpOworICAgICAgICAgICAgICAgIG91dCA8PCAiO31cbiI7CisKKyAgICAgICAgICAgICAgICBpbml0aWFsICs9IDI1NSAqIGluY3JlbWVudDsKKyAgICAgICAgICAgICAgICBpdGVyYXRpb25zIC09IDI1NTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBVTklNUExFTUVOVEVEKCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOyAgIC8vIE5vdCBoYW5kbGVkIGFzIGFuIGV4Y2Vzc2l2ZSBsb29wCit9CisKK3ZvaWQgT3V0cHV0SExTTDo6b3V0cHV0VHJpcGxldChWaXNpdCB2aXNpdCwgY29uc3QgVFN0cmluZyAmcHJlU3RyaW5nLCBjb25zdCBUU3RyaW5nICZpblN0cmluZywgY29uc3QgVFN0cmluZyAmcG9zdFN0cmluZykKK3sKKyAgICBUSW5mb1NpbmtCYXNlICZvdXQgPSBtQm9keTsKKworICAgIGlmICh2aXNpdCA9PSBQcmVWaXNpdCkKKyAgICB7CisgICAgICAgIG91dCA8PCBwcmVTdHJpbmc7CisgICAgfQorICAgIGVsc2UgaWYgKHZpc2l0ID09IEluVmlzaXQpCisgICAgeworICAgICAgICBvdXQgPDwgaW5TdHJpbmc7CisgICAgfQorICAgIGVsc2UgaWYgKHZpc2l0ID09IFBvc3RWaXNpdCkKKyAgICB7CisgICAgICAgIG91dCA8PCBwb3N0U3RyaW5nOworICAgIH0KK30KKwordm9pZCBPdXRwdXRITFNMOjpvdXRwdXRMaW5lRGlyZWN0aXZlKGludCBsaW5lKQoreworICAgIGlmICgobUNvbnRleHQuY29tcGlsZU9wdGlvbnMgJiBTSF9MSU5FX0RJUkVDVElWRVMpICYmIChsaW5lID4gMCkpCisgICAgeworICAgICAgICBtQm9keSA8PCAiXG4iOworICAgICAgICBtQm9keSA8PCAiI2xpbmUgIiA8PCBsaW5lOworCisgICAgICAgIGlmIChtQ29udGV4dC5zb3VyY2VQYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBtQm9keSA8PCAiIFwiIiA8PCBtQ29udGV4dC5zb3VyY2VQYXRoIDw8ICJcIiI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1Cb2R5IDw8ICJcbiI7CisgICAgfQorfQorCitUU3RyaW5nIE91dHB1dEhMU0w6OmFyZ3VtZW50U3RyaW5nKGNvbnN0IFRJbnRlcm1TeW1ib2wgKnN5bWJvbCkKK3sKKyAgICBUUXVhbGlmaWVyIHF1YWxpZmllciA9IHN5bWJvbC0+Z2V0UXVhbGlmaWVyKCk7CisgICAgY29uc3QgVFR5cGUgJnR5cGUgPSBzeW1ib2wtPmdldFR5cGUoKTsKKyAgICBUU3RyaW5nIG5hbWUgPSBzeW1ib2wtPmdldFN5bWJvbCgpOworCisgICAgaWYgKG5hbWUuZW1wdHkoKSkgICAvLyBITFNMIGRlbWFuZHMgbmFtZWQgYXJndW1lbnRzLCBhbHNvIGZvciBwcm90b3R5cGVzCisgICAgeworICAgICAgICBuYW1lID0gIngiICsgc3RyKG1VbmlxdWVJbmRleCsrKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbmFtZSA9IGRlY29yYXRlKG5hbWUpOworICAgIH0KKworICAgIHJldHVybiBxdWFsaWZpZXJTdHJpbmcocXVhbGlmaWVyKSArICIgIiArIHR5cGVTdHJpbmcodHlwZSkgKyAiICIgKyBuYW1lICsgYXJyYXlTdHJpbmcodHlwZSk7Cit9CisKK1RTdHJpbmcgT3V0cHV0SExTTDo6cXVhbGlmaWVyU3RyaW5nKFRRdWFsaWZpZXIgcXVhbGlmaWVyKQoreworICAgIHN3aXRjaChxdWFsaWZpZXIpCisgICAgeworICAgICAgY2FzZSBFdnFJbjogICAgICAgICAgICByZXR1cm4gImluIjsKKyAgICAgIGNhc2UgRXZxT3V0OiAgICAgICAgICAgcmV0dXJuICJvdXQiOworICAgICAgY2FzZSBFdnFJbk91dDogICAgICAgICByZXR1cm4gImlub3V0IjsKKyAgICAgIGNhc2UgRXZxQ29uc3RSZWFkT25seTogcmV0dXJuICJjb25zdCI7CisgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIHJldHVybiAiIjsKK30KKworVFN0cmluZyBPdXRwdXRITFNMOjp0eXBlU3RyaW5nKGNvbnN0IFRUeXBlICZ0eXBlKQoreworICAgIGlmICh0eXBlLmdldEJhc2ljVHlwZSgpID09IEVidFN0cnVjdCkKKyAgICB7CisgICAgICAgIGlmICh0eXBlLmdldFR5cGVOYW1lKCkgIT0gIiIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJ1Y3RMb29rdXAodHlwZS5nZXRUeXBlTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLy8gTmFtZWxlc3Mgc3RydWN0dXJlLCBkZWZpbmUgaW4gcGxhY2UKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVFR5cGVMaXN0ICZmaWVsZHMgPSAqdHlwZS5nZXRTdHJ1Y3QoKTsKKworICAgICAgICAgICAgVFN0cmluZyBzdHJpbmcgPSAic3RydWN0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7XG4iOworCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSAmZmllbGQgPSAqZmllbGRzW2ldLnR5cGU7CisKKyAgICAgICAgICAgICAgICBzdHJpbmcgKz0gIiAgICAiICsgdHlwZVN0cmluZyhmaWVsZCkgKyAiICIgKyBmaWVsZC5nZXRGaWVsZE5hbWUoKSArIGFycmF5U3RyaW5nKGZpZWxkKSArICI7XG4iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJpbmcgKz0gIn0gIjsKKworICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLmlzTWF0cml4KCkpCisgICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0Tm9taW5hbFNpemUoKSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgMjogcmV0dXJuICJmbG9hdDJ4MiI7CisgICAgICAgICAgY2FzZSAzOiByZXR1cm4gImZsb2F0M3gzIjsKKyAgICAgICAgICBjYXNlIDQ6IHJldHVybiAiZmxvYXQ0eDQiOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZS5nZXRCYXNpY1R5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgRWJ0RmxvYXQ6CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0Tm9taW5hbFNpemUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gImZsb2F0IjsKKyAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gImZsb2F0MiI7CisgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuICJmbG9hdDMiOworICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiAiZmxvYXQ0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEVidEludDoKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXROb21pbmFsU2l6ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiAiaW50IjsKKyAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gImludDIiOworICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiAiaW50MyI7CisgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuICJpbnQ0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEVidEJvb2w6CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0Tm9taW5hbFNpemUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gImJvb2wiOworICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiAiYm9vbDIiOworICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiAiYm9vbDMiOworICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiAiYm9vbDQiOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgRWJ0Vm9pZDoKKyAgICAgICAgICAgIHJldHVybiAidm9pZCI7CisgICAgICAgICAgY2FzZSBFYnRTYW1wbGVyMkQ6CisgICAgICAgICAgICByZXR1cm4gInNhbXBsZXIyRCI7CisgICAgICAgICAgY2FzZSBFYnRTYW1wbGVyQ3ViZToKKyAgICAgICAgICAgIHJldHVybiAic2FtcGxlckNVQkUiOworICAgICAgICB9CisgICAgfQorCisgICAgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FCisgICAgcmV0dXJuICI8dW5rbm93biB0eXBlPiI7Cit9CisKK1RTdHJpbmcgT3V0cHV0SExTTDo6YXJyYXlTdHJpbmcoY29uc3QgVFR5cGUgJnR5cGUpCit7CisgICAgaWYgKCF0eXBlLmlzQXJyYXkoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICByZXR1cm4gIlsiICsgc3RyKHR5cGUuZ2V0QXJyYXlTaXplKCkpICsgIl0iOworfQorCitUU3RyaW5nIE91dHB1dEhMU0w6OmluaXRpYWxpemVyKGNvbnN0IFRUeXBlICZ0eXBlKQoreworICAgIFRTdHJpbmcgc3RyaW5nOworCisgICAgZm9yIChpbnQgY29tcG9uZW50ID0gMDsgY29tcG9uZW50IDwgdHlwZS5nZXRPYmplY3RTaXplKCk7IGNvbXBvbmVudCsrKQorICAgIHsKKyAgICAgICAgc3RyaW5nICs9ICIwIjsKKworICAgICAgICBpZiAoY29tcG9uZW50IDwgdHlwZS5nZXRPYmplY3RTaXplKCkgLSAxKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgKz0gIiwgIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAieyIgKyBzdHJpbmcgKyAifSI7Cit9CisKK3ZvaWQgT3V0cHV0SExTTDo6YWRkQ29uc3RydWN0b3IoY29uc3QgVFR5cGUgJnR5cGUsIGNvbnN0IFRTdHJpbmcgJm5hbWUsIGNvbnN0IFRJbnRlcm1TZXF1ZW5jZSAqcGFyYW1ldGVycykKK3sKKyAgICBpZiAobmFtZSA9PSAiIikKKyAgICB7CisgICAgICAgIHJldHVybjsgICAvLyBOYW1lbGVzcyBzdHJ1Y3R1cmVzIGRvbid0IGhhdmUgY29uc3RydWN0b3JzCisgICAgfQorCisgICAgVFR5cGUgY3RvclR5cGUgPSB0eXBlOworICAgIGN0b3JUeXBlLmNsZWFyQXJyYXluZXNzKCk7CisgICAgY3RvclR5cGUuc2V0UHJlY2lzaW9uKEVicEhpZ2gpOworICAgIGN0b3JUeXBlLnNldFF1YWxpZmllcihFdnFUZW1wb3JhcnkpOworCisgICAgVFN0cmluZyBjdG9yTmFtZSA9IHR5cGUuZ2V0U3RydWN0KCkgPyBkZWNvcmF0ZShuYW1lKSA6IG5hbWU7CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFRUeXBlPiBQYXJhbWV0ZXJBcnJheTsKKyAgICBQYXJhbWV0ZXJBcnJheSBjdG9yUGFyYW1ldGVyczsKKworICAgIGlmICh0eXBlLmdldFN0cnVjdCgpKQorICAgIHsKKyAgICAgICAgbVN0cnVjdE5hbWVzLmluc2VydChkZWNvcmF0ZShuYW1lKSk7CisKKyAgICAgICAgVFN0cmluZyBzdHJ1Y3R1cmU7CisgICAgICAgIHN0cnVjdHVyZSArPSAic3RydWN0ICIgKyBkZWNvcmF0ZShuYW1lKSArICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICJ7XG4iOworCisgICAgICAgIGNvbnN0IFRUeXBlTGlzdCAmZmllbGRzID0gKnR5cGUuZ2V0U3RydWN0KCk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFRUeXBlICZmaWVsZCA9ICpmaWVsZHNbaV0udHlwZTsKKworICAgICAgICAgICAgc3RydWN0dXJlICs9ICIgICAgIiArIHR5cGVTdHJpbmcoZmllbGQpICsgIiAiICsgZmllbGQuZ2V0RmllbGROYW1lKCkgKyBhcnJheVN0cmluZyhmaWVsZCkgKyAiO1xuIjsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdHVyZSArPSAifTtcbiI7CisKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChtU3RydWN0RGVjbGFyYXRpb25zLmJlZ2luKCksIG1TdHJ1Y3REZWNsYXJhdGlvbnMuZW5kKCksIHN0cnVjdHVyZSkgPT0gbVN0cnVjdERlY2xhcmF0aW9ucy5lbmQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbVN0cnVjdERlY2xhcmF0aW9ucy5wdXNoX2JhY2soc3RydWN0dXJlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjdG9yUGFyYW1ldGVycy5wdXNoX2JhY2soKmZpZWxkc1tpXS50eXBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgZm9yIChUSW50ZXJtU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIHBhcmFtZXRlciA9IHBhcmFtZXRlcnMtPmJlZ2luKCk7IHBhcmFtZXRlciAhPSBwYXJhbWV0ZXJzLT5lbmQoKTsgcGFyYW1ldGVyKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0b3JQYXJhbWV0ZXJzLnB1c2hfYmFjaygoKnBhcmFtZXRlciktPmdldEFzVHlwZWQoKS0+Z2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIFVOUkVBQ0hBQkxFKCk7CisKKyAgICBUU3RyaW5nIGNvbnN0cnVjdG9yOworCisgICAgaWYgKGN0b3JUeXBlLmdldFN0cnVjdCgpKQorICAgIHsKKyAgICAgICAgY29uc3RydWN0b3IgKz0gY3Rvck5hbWUgKyAiICIgKyBjdG9yTmFtZSArICJfY3RvcigiOworICAgIH0KKyAgICBlbHNlICAgLy8gQnVpbHQtaW4gdHlwZQorICAgIHsKKyAgICAgICAgY29uc3RydWN0b3IgKz0gdHlwZVN0cmluZyhjdG9yVHlwZSkgKyAiICIgKyBjdG9yTmFtZSArICIoIjsKKyAgICB9CisKKyAgICBmb3IgKHVuc2lnbmVkIGludCBwYXJhbWV0ZXIgPSAwOyBwYXJhbWV0ZXIgPCBjdG9yUGFyYW1ldGVycy5zaXplKCk7IHBhcmFtZXRlcisrKQorICAgIHsKKyAgICAgICAgY29uc3QgVFR5cGUgJnR5cGUgPSBjdG9yUGFyYW1ldGVyc1twYXJhbWV0ZXJdOworCisgICAgICAgIGNvbnN0cnVjdG9yICs9IHR5cGVTdHJpbmcodHlwZSkgKyAiIHgiICsgc3RyKHBhcmFtZXRlcikgKyBhcnJheVN0cmluZyh0eXBlKTsKKworICAgICAgICBpZiAocGFyYW1ldGVyIDwgY3RvclBhcmFtZXRlcnMuc2l6ZSgpIC0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3RydWN0b3IgKz0gIiwgIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0cnVjdG9yICs9ICIpXG4iCisgICAgICAgICAgICAgICAgICAgIntcbiI7CisKKyAgICBpZiAoY3RvclR5cGUuZ2V0U3RydWN0KCkpCisgICAgeworICAgICAgICBjb25zdHJ1Y3RvciArPSAiICAgICIgKyBjdG9yTmFtZSArICIgc3RydWN0dXJlID0geyI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvbnN0cnVjdG9yICs9ICIgICAgcmV0dXJuICIgKyB0eXBlU3RyaW5nKGN0b3JUeXBlKSArICIoIjsKKyAgICB9CisKKyAgICBpZiAoY3RvclR5cGUuaXNNYXRyaXgoKSAmJiBjdG9yUGFyYW1ldGVycy5zaXplKCkgPT0gMSkKKyAgICB7CisgICAgICAgIGludCBkaW0gPSBjdG9yVHlwZS5nZXROb21pbmFsU2l6ZSgpOworICAgICAgICBjb25zdCBUVHlwZSAmcGFyYW1ldGVyID0gY3RvclBhcmFtZXRlcnNbMF07CisKKyAgICAgICAgaWYgKHBhcmFtZXRlci5pc1NjYWxhcigpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBkaW07IHJvdysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGRpbTsgY29sKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciArPSBUU3RyaW5nKChyb3cgPT0gY29sKSA/ICJ4MCIgOiAiMC4wIik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAocm93IDwgZGltIC0gMSB8fCBjb2wgPCBkaW0gLSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciArPSAiLCAiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBhcmFtZXRlci5pc01hdHJpeCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBkaW07IHJvdysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGRpbTsgY29sKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocm93IDwgcGFyYW1ldGVyLmdldE5vbWluYWxTaXplKCkgJiYgY29sIDwgcGFyYW1ldGVyLmdldE5vbWluYWxTaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yICs9IFRTdHJpbmcoIngwIikgKyAiWyIgKyBzdHIocm93KSArICJdIiArICJbIiArIHN0cihjb2wpICsgIl0iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgKz0gVFN0cmluZygocm93ID09IGNvbCkgPyAiMS4wIiA6ICIwLjAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPCBkaW0gLSAxIHx8IGNvbCA8IGRpbSAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yICs9ICIsICI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgcmVtYWluaW5nQ29tcG9uZW50cyA9IGN0b3JUeXBlLmdldE9iamVjdFNpemUoKTsKKyAgICAgICAgaW50IHBhcmFtZXRlckluZGV4ID0gMDsKKworICAgICAgICB3aGlsZSAocmVtYWluaW5nQ29tcG9uZW50cyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFRUeXBlICZwYXJhbWV0ZXIgPSBjdG9yUGFyYW1ldGVyc1twYXJhbWV0ZXJJbmRleF07CisgICAgICAgICAgICBib29sIG1vcmVQYXJhbWV0ZXJzID0gcGFyYW1ldGVySW5kZXggPCAoaW50KWN0b3JQYXJhbWV0ZXJzLnNpemUoKSAtIDE7CisKKyAgICAgICAgICAgIGNvbnN0cnVjdG9yICs9ICJ4IiArIHN0cihwYXJhbWV0ZXJJbmRleCk7CisKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIuaXNTY2FsYXIoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdDb21wb25lbnRzIC09IHBhcmFtZXRlci5nZXRPYmplY3RTaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbWV0ZXIuaXNWZWN0b3IoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nQ29tcG9uZW50cyA9PSBwYXJhbWV0ZXIuZ2V0T2JqZWN0U2l6ZSgpIHx8IG1vcmVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nQ29tcG9uZW50cyAtPSBwYXJhbWV0ZXIuZ2V0T2JqZWN0U2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmdDb21wb25lbnRzIDwgcGFyYW1ldGVyLmdldE5vbWluYWxTaXplKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlbWFpbmluZ0NvbXBvbmVudHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IGNvbnN0cnVjdG9yICs9ICIueCI7ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogY29uc3RydWN0b3IgKz0gIi54eSI7ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBjb25zdHJ1Y3RvciArPSAiLnh5eiI7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IGNvbnN0cnVjdG9yICs9ICIueHl6dyI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdDb21wb25lbnRzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1ldGVyLmlzTWF0cml4KCkgfHwgcGFyYW1ldGVyLmdldFN0cnVjdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFTU0VSVChyZW1haW5pbmdDb21wb25lbnRzID09IHBhcmFtZXRlci5nZXRPYmplY3RTaXplKCkgfHwgbW9yZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJlbWFpbmluZ0NvbXBvbmVudHMgLT0gcGFyYW1ldGVyLmdldE9iamVjdFNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKworICAgICAgICAgICAgaWYgKG1vcmVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlckluZGV4Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZW1haW5pbmdDb21wb25lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yICs9ICIsICI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3RvclR5cGUuZ2V0U3RydWN0KCkpCisgICAgeworICAgICAgICBjb25zdHJ1Y3RvciArPSAifTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gc3RydWN0dXJlO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAifVxuIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3RydWN0b3IgKz0gIik7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iOworICAgIH0KKworICAgIG1Db25zdHJ1Y3RvcnMuaW5zZXJ0KGNvbnN0cnVjdG9yKTsKK30KKworY29uc3QgQ29uc3RhbnRVbmlvbiAqT3V0cHV0SExTTDo6d3JpdGVDb25zdGFudFVuaW9uKGNvbnN0IFRUeXBlICZ0eXBlLCBjb25zdCBDb25zdGFudFVuaW9uICpjb25zdFVuaW9uKQoreworICAgIFRJbmZvU2lua0Jhc2UgJm91dCA9IG1Cb2R5OworCisgICAgaWYgKHR5cGUuZ2V0QmFzaWNUeXBlKCkgPT0gRWJ0U3RydWN0KQorICAgIHsKKyAgICAgICAgb3V0IDw8IHN0cnVjdExvb2t1cCh0eXBlLmdldFR5cGVOYW1lKCkpICsgIl9jdG9yKCI7CisgICAgICAgIAorICAgICAgICBjb25zdCBUVHlwZUxpc3QgKnN0cnVjdHVyZSA9IHR5cGUuZ2V0U3RydWN0KCk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJ1Y3R1cmUtPnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBUVHlwZSAqZmllbGRUeXBlID0gKCpzdHJ1Y3R1cmUpW2ldLnR5cGU7CisKKyAgICAgICAgICAgIGNvbnN0VW5pb24gPSB3cml0ZUNvbnN0YW50VW5pb24oKmZpZWxkVHlwZSwgY29uc3RVbmlvbik7CisKKyAgICAgICAgICAgIGlmIChpICE9IHN0cnVjdHVyZS0+c2l6ZSgpIC0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiKSI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBzaXplID0gdHlwZS5nZXRPYmplY3RTaXplKCk7CisgICAgICAgIGJvb2wgd3JpdGVUeXBlID0gc2l6ZSA+IDE7CisgICAgICAgIAorICAgICAgICBpZiAod3JpdGVUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgdHlwZVN0cmluZyh0eXBlKSA8PCAiKCI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKywgY29uc3RVbmlvbisrKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbnN0VW5pb24tPmdldFR5cGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBFYnRGbG9hdDogb3V0IDw8IGNvbnN0VW5pb24tPmdldEZDb25zdCgpOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFYnRJbnQ6ICAgb3V0IDw8IGNvbnN0VW5pb24tPmdldElDb25zdCgpOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFYnRCb29sOiAgb3V0IDw8IGNvbnN0VW5pb24tPmdldEJDb25zdCgpOyBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgIT0gc2l6ZSAtIDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAod3JpdGVUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIikiOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbnN0VW5pb247Cit9CisKK1RTdHJpbmcgT3V0cHV0SExTTDo6c2NvcGVTdHJpbmcodW5zaWduZWQgaW50IGRlcHRoTGltaXQpCit7CisgICAgVFN0cmluZyBzdHJpbmc7CisKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1TY29wZUJyYWNrZXQuc2l6ZSgpICYmIGkgPCBkZXB0aExpbWl0OyBpKyspCisgICAgeworICAgICAgICBzdHJpbmcgKz0gIl8iICsgc3RyKGkpOworICAgIH0KKworICAgIHJldHVybiBzdHJpbmc7Cit9CisKK1RTdHJpbmcgT3V0cHV0SExTTDo6c2NvcGVkU3RydWN0KGNvbnN0IFRTdHJpbmcgJnR5cGVOYW1lKQoreworICAgIGlmICh0eXBlTmFtZSA9PSAiIikKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlTmFtZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHlwZU5hbWUgKyBzY29wZVN0cmluZyhtU2NvcGVEZXB0aCk7Cit9CisKK1RTdHJpbmcgT3V0cHV0SExTTDo6c3RydWN0TG9va3VwKGNvbnN0IFRTdHJpbmcgJnR5cGVOYW1lKQoreworICAgIGZvciAoaW50IGRlcHRoID0gbVNjb3BlRGVwdGg7IGRlcHRoID49IDA7IGRlcHRoLS0pCisgICAgeworICAgICAgICBUU3RyaW5nIHNjb3BlZE5hbWUgPSBkZWNvcmF0ZSh0eXBlTmFtZSArIHNjb3BlU3RyaW5nKGRlcHRoKSk7CisKKyAgICAgICAgZm9yIChTdHJ1Y3ROYW1lczo6aXRlcmF0b3Igc3RydWN0TmFtZSA9IG1TdHJ1Y3ROYW1lcy5iZWdpbigpOyBzdHJ1Y3ROYW1lICE9IG1TdHJ1Y3ROYW1lcy5lbmQoKTsgc3RydWN0TmFtZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKnN0cnVjdE5hbWUgPT0gc2NvcGVkTmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NvcGVkTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFVOUkVBQ0hBQkxFKCk7ICAgLy8gU2hvdWxkIGhhdmUgZm91bmQgYSBtYXRjaGluZyBjb25zdHJ1Y3RvcgorCisgICAgcmV0dXJuIHR5cGVOYW1lOworfQorCitUU3RyaW5nIE91dHB1dEhMU0w6OmRlY29yYXRlKGNvbnN0IFRTdHJpbmcgJnN0cmluZykKK3sKKyAgICBpZiAoc3RyaW5nLmNvbXBhcmUoMCwgMywgImdsXyIpICE9IDAgJiYgc3RyaW5nLmNvbXBhcmUoMCwgMywgImR4XyIpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gIl8iICsgc3RyaW5nOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RyaW5nOworfQorCitUU3RyaW5nIE91dHB1dEhMU0w6OmRlY29yYXRlVW5pZm9ybShjb25zdCBUU3RyaW5nICZzdHJpbmcsIGJvb2wgYXJyYXkpCit7CisgICAgaWYgKGFycmF5KQorICAgIHsKKyAgICAgICAgcmV0dXJuICJhcl8iICsgc3RyaW5nOyAgIC8vIEFsbG93cyBpZGVudGlmeWluZyBhcnJheXMgb2Ygc2l6ZSAxCisgICAgfQorICAgIAorICAgIHJldHVybiBkZWNvcmF0ZShzdHJpbmcpOworfQorfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvT3V0cHV0SExTTC5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvT3V0cHV0SExTTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMDU4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9PdXRwdXRITFNMLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMSBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgQ09NUElMRVJfT1VUUFVUSExTTF9IXworI2RlZmluZSBDT01QSUxFUl9PVVRQVVRITFNMX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgImNvbXBpbGVyL2ludGVybWVkaWF0ZS5oIgorI2luY2x1ZGUgImNvbXBpbGVyL1BhcnNlSGVscGVyLmgiCisKK25hbWVzcGFjZSBzaAoreworY2xhc3MgVW5mb2xkU2VsZWN0OworCitjbGFzcyBPdXRwdXRITFNMIDogcHVibGljIFRJbnRlcm1UcmF2ZXJzZXIKK3sKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IE91dHB1dEhMU0woVFBhcnNlQ29udGV4dCAmY29udGV4dCk7CisgICAgfk91dHB1dEhMU0woKTsKKworICAgIHZvaWQgb3V0cHV0KCk7CisKKyAgICBUSW5mb1NpbmtCYXNlICZnZXRCb2R5U3RyZWFtKCk7CisKKyAgICBUU3RyaW5nIHR5cGVTdHJpbmcoY29uc3QgVFR5cGUgJnR5cGUpOworICAgIHN0YXRpYyBUU3RyaW5nIHF1YWxpZmllclN0cmluZyhUUXVhbGlmaWVyIHF1YWxpZmllcik7CisgICAgc3RhdGljIFRTdHJpbmcgYXJyYXlTdHJpbmcoY29uc3QgVFR5cGUgJnR5cGUpOworICAgIHN0YXRpYyBUU3RyaW5nIGluaXRpYWxpemVyKGNvbnN0IFRUeXBlICZ0eXBlKTsKKyAgICBzdGF0aWMgVFN0cmluZyBkZWNvcmF0ZShjb25zdCBUU3RyaW5nICZzdHJpbmcpOyAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVwZW5kcyBhbiB1bmRlcnNjb3JlIHRvIGF2b2lkIG5hbWluZyBjbGFzaGVzCisgICAgc3RhdGljIFRTdHJpbmcgZGVjb3JhdGVVbmlmb3JtKGNvbnN0IFRTdHJpbmcgJnN0cmluZywgYm9vbCBhcnJheSk7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaGVhZGVyKCk7CisKKyAgICAvLyBWaXNpdCBBU1Qgbm9kZXMgYW5kIG91dHB1dCB0aGVpciBjb2RlIHRvIHRoZSBib2R5IHN0cmVhbQorICAgIHZvaWQgdmlzaXRTeW1ib2woVEludGVybVN5bWJvbCopOworICAgIHZvaWQgdmlzaXRDb25zdGFudFVuaW9uKFRJbnRlcm1Db25zdGFudFVuaW9uKik7CisgICAgYm9vbCB2aXNpdEJpbmFyeShWaXNpdCB2aXNpdCwgVEludGVybUJpbmFyeSopOworICAgIGJvb2wgdmlzaXRVbmFyeShWaXNpdCB2aXNpdCwgVEludGVybVVuYXJ5Kik7CisgICAgYm9vbCB2aXNpdFNlbGVjdGlvbihWaXNpdCB2aXNpdCwgVEludGVybVNlbGVjdGlvbiopOworICAgIGJvb2wgdmlzaXRBZ2dyZWdhdGUoVmlzaXQgdmlzaXQsIFRJbnRlcm1BZ2dyZWdhdGUqKTsKKyAgICBib29sIHZpc2l0TG9vcChWaXNpdCB2aXNpdCwgVEludGVybUxvb3AqKTsKKyAgICBib29sIHZpc2l0QnJhbmNoKFZpc2l0IHZpc2l0LCBUSW50ZXJtQnJhbmNoKik7CisKKyAgICBib29sIGlzU2luZ2xlU3RhdGVtZW50KFRJbnRlcm1Ob2RlICpub2RlKTsKKyAgICBib29sIGhhbmRsZUV4Y2Vzc2l2ZUxvb3AoVEludGVybUxvb3AgKm5vZGUpOworICAgIHZvaWQgb3V0cHV0VHJpcGxldChWaXNpdCB2aXNpdCwgY29uc3QgVFN0cmluZyAmcHJlU3RyaW5nLCBjb25zdCBUU3RyaW5nICZpblN0cmluZywgY29uc3QgVFN0cmluZyAmcG9zdFN0cmluZyk7CisgICAgdm9pZCBvdXRwdXRMaW5lRGlyZWN0aXZlKGludCBsaW5lKTsKKyAgICBUU3RyaW5nIGFyZ3VtZW50U3RyaW5nKGNvbnN0IFRJbnRlcm1TeW1ib2wgKnN5bWJvbCk7CisgICAgaW50IHZlY3RvclNpemUoY29uc3QgVFR5cGUgJnR5cGUpIGNvbnN0OworCisgICAgdm9pZCBhZGRDb25zdHJ1Y3Rvcihjb25zdCBUVHlwZSAmdHlwZSwgY29uc3QgVFN0cmluZyAmbmFtZSwgY29uc3QgVEludGVybVNlcXVlbmNlICpwYXJhbWV0ZXJzKTsKKyAgICBjb25zdCBDb25zdGFudFVuaW9uICp3cml0ZUNvbnN0YW50VW5pb24oY29uc3QgVFR5cGUgJnR5cGUsIGNvbnN0IENvbnN0YW50VW5pb24gKmNvbnN0VW5pb24pOworCisgICAgVFN0cmluZyBzY29wZVN0cmluZyh1bnNpZ25lZCBpbnQgZGVwdGhMaW1pdCk7CisgICAgVFN0cmluZyBzY29wZWRTdHJ1Y3QoY29uc3QgVFN0cmluZyAmdHlwZU5hbWUpOworICAgIFRTdHJpbmcgc3RydWN0TG9va3VwKGNvbnN0IFRTdHJpbmcgJnR5cGVOYW1lKTsKKworICAgIFRQYXJzZUNvbnRleHQgJm1Db250ZXh0OworICAgIFVuZm9sZFNlbGVjdCAqbVVuZm9sZFNlbGVjdDsKKyAgICBib29sIG1JbnNpZGVGdW5jdGlvbjsKKworICAgIC8vIE91dHB1dCBzdHJlYW1zCisgICAgVEluZm9TaW5rQmFzZSBtSGVhZGVyOworICAgIFRJbmZvU2lua0Jhc2UgbUJvZHk7CisgICAgVEluZm9TaW5rQmFzZSBtRm9vdGVyOworCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG1SZWZlcmVuY2VkVW5pZm9ybXM7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG1SZWZlcmVuY2VkQXR0cmlidXRlczsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbVJlZmVyZW5jZWRWYXJ5aW5nczsKKworICAgIC8vIFBhcmFtZXRlcnMgZGV0ZXJtaW5pbmcgd2hhdCBnb2VzIGluIHRoZSBoZWFkZXIgb3V0cHV0CisgICAgYm9vbCBtVXNlc1RleHR1cmUyRDsKKyAgICBib29sIG1Vc2VzVGV4dHVyZTJEX2JpYXM7CisgICAgYm9vbCBtVXNlc1RleHR1cmUyRExvZDsKKyAgICBib29sIG1Vc2VzVGV4dHVyZTJEUHJvajsKKyAgICBib29sIG1Vc2VzVGV4dHVyZTJEUHJval9iaWFzOworICAgIGJvb2wgbVVzZXNUZXh0dXJlMkRQcm9qTG9kOworICAgIGJvb2wgbVVzZXNUZXh0dXJlQ3ViZTsKKyAgICBib29sIG1Vc2VzVGV4dHVyZUN1YmVfYmlhczsKKyAgICBib29sIG1Vc2VzVGV4dHVyZUN1YmVMb2Q7CisgICAgYm9vbCBtVXNlc0RlcHRoUmFuZ2U7CisgICAgYm9vbCBtVXNlc0ZyYWdDb29yZDsKKyAgICBib29sIG1Vc2VzUG9pbnRDb29yZDsKKyAgICBib29sIG1Vc2VzRnJvbnRGYWNpbmc7CisgICAgYm9vbCBtVXNlc1BvaW50U2l6ZTsKKyAgICBib29sIG1Vc2VzWG9yOworICAgIGJvb2wgbVVzZXNNb2QxOworICAgIGJvb2wgbVVzZXNNb2QyOworICAgIGJvb2wgbVVzZXNNb2QzOworICAgIGJvb2wgbVVzZXNNb2Q0OworICAgIGJvb2wgbVVzZXNGYWNlZm9yd2FyZDE7CisgICAgYm9vbCBtVXNlc0ZhY2Vmb3J3YXJkMjsKKyAgICBib29sIG1Vc2VzRmFjZWZvcndhcmQzOworICAgIGJvb2wgbVVzZXNGYWNlZm9yd2FyZDQ7CisgICAgYm9vbCBtVXNlc0VxdWFsTWF0MjsKKyAgICBib29sIG1Vc2VzRXF1YWxNYXQzOworICAgIGJvb2wgbVVzZXNFcXVhbE1hdDQ7CisgICAgYm9vbCBtVXNlc0VxdWFsVmVjMjsKKyAgICBib29sIG1Vc2VzRXF1YWxWZWMzOworICAgIGJvb2wgbVVzZXNFcXVhbFZlYzQ7CisgICAgYm9vbCBtVXNlc0VxdWFsSVZlYzI7CisgICAgYm9vbCBtVXNlc0VxdWFsSVZlYzM7CisgICAgYm9vbCBtVXNlc0VxdWFsSVZlYzQ7CisgICAgYm9vbCBtVXNlc0VxdWFsQlZlYzI7CisgICAgYm9vbCBtVXNlc0VxdWFsQlZlYzM7CisgICAgYm9vbCBtVXNlc0VxdWFsQlZlYzQ7CisgICAgYm9vbCBtVXNlc0F0YW4yOworCisgICAgdHlwZWRlZiBzdGQ6OnNldDxUU3RyaW5nPiBDb25zdHJ1Y3RvcnM7CisgICAgQ29uc3RydWN0b3JzIG1Db25zdHJ1Y3RvcnM7CisKKyAgICB0eXBlZGVmIHN0ZDo6c2V0PFRTdHJpbmc+IFN0cnVjdE5hbWVzOworICAgIFN0cnVjdE5hbWVzIG1TdHJ1Y3ROYW1lczsKKworICAgIHR5cGVkZWYgc3RkOjpsaXN0PFRTdHJpbmc+IFN0cnVjdERlY2xhcmF0aW9uczsKKyAgICBTdHJ1Y3REZWNsYXJhdGlvbnMgbVN0cnVjdERlY2xhcmF0aW9uczsKKworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8aW50PiBTY29wZUJyYWNrZXQ7CisgICAgU2NvcGVCcmFja2V0IG1TY29wZUJyYWNrZXQ7CisgICAgdW5zaWduZWQgaW50IG1TY29wZURlcHRoOworCisgICAgaW50IG1VbmlxdWVJbmRleDsgICAvLyBGb3IgY3JlYXRpbmcgdW5pcXVlIG5hbWVzCit9OworfQorCisjZW5kaWYgICAvLyBDT01QSUxFUl9PVVRQVVRITFNMX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9QYXJzZUhlbHBlci5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9QYXJzZUhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI3YzE4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1BhcnNlSGVscGVyLmNwcApAQCAtMCwwICsxLDE1MzEgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMSBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9QYXJzZUhlbHBlci5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImNvbXBpbGVyL2dsc2xhbmcuaCIKKyNpbmNsdWRlICJjb21waWxlci9vc2luY2x1ZGUuaCIKKyNpbmNsdWRlICJjb21waWxlci9Jbml0aWFsaXplUGFyc2VDb250ZXh0LmgiCisKK2V4dGVybiAiQyIgeworZXh0ZXJuIGludCBJbml0UHJlcHJvY2Vzc29yKCk7CitleHRlcm4gaW50IEZpbmFsaXplUHJlcHJvY2Vzc29yKCk7CitleHRlcm4gdm9pZCBQcmVkZWZpbmVJbnRNYWNybyhjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBSZXBvcnRJbmZvKFRJbmZvU2lua0Jhc2UmIHNpbmssCisgICAgICAgICAgICAgICAgICAgICAgIFRQcmVmaXhUeXBlIHR5cGUsIFRTb3VyY2VMb2MgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZWFzb24sIGNvbnN0IGNoYXIqIHRva2VuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0cmFJbmZvKQoreworICAgIC8qIFZDKysgZm9ybWF0OiBmaWxlKGxpbmVudW0pIDogZXJyb3IgIzogJ3Rva2VuJyA6IGV4dHJhaW5mbyAqLworICAgIHNpbmsucHJlZml4KHR5cGUpOworICAgIHNpbmsubG9jYXRpb24obG9jKTsKKyAgICBzaW5rIDw8ICInIiA8PCB0b2tlbiA8PCAgIicgOiAiIDw8IHJlYXNvbiA8PCAiICIgPDwgZXh0cmFJbmZvIDw8ICJcbiI7Cit9CisKK3N0YXRpYyB2b2lkIERlZmluZUV4dGVuc2lvbk1hY3Jvcyhjb25zdCBURXh0ZW5zaW9uQmVoYXZpb3ImIGV4dEJlaGF2aW9yKQoreworICAgIGZvciAoVEV4dGVuc2lvbkJlaGF2aW9yOjpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0QmVoYXZpb3IuYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIgIT0gZXh0QmVoYXZpb3IuZW5kKCk7ICsraXRlcikgeworICAgICAgICBQcmVkZWZpbmVJbnRNYWNybyhpdGVyLT5maXJzdC5jX3N0cigpLCAxKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gU3ViLSB2ZWN0b3IgYW5kIG1hdHJpeCBmaWVsZHMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8KKy8vIExvb2sgYXQgYSAnLicgZmllbGQgc2VsZWN0b3Igc3RyaW5nIGFuZCBjaGFuZ2UgaXQgaW50byBvZmZzZXRzCisvLyBmb3IgYSB2ZWN0b3IuCisvLworYm9vbCBUUGFyc2VDb250ZXh0OjpwYXJzZVZlY3RvckZpZWxkcyhjb25zdCBUU3RyaW5nJiBjb21wU3RyaW5nLCBpbnQgdmVjU2l6ZSwgVFZlY3RvckZpZWxkcyYgZmllbGRzLCBpbnQgbGluZSkKK3sKKyAgICBmaWVsZHMubnVtID0gKGludCkgY29tcFN0cmluZy5zaXplKCk7CisgICAgaWYgKGZpZWxkcy5udW0gPiA0KSB7CisgICAgICAgIGVycm9yKGxpbmUsICJpbGxlZ2FsIHZlY3RvciBmaWVsZCBzZWxlY3Rpb24iLCBjb21wU3RyaW5nLmNfc3RyKCksICIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGVudW0geworICAgICAgICBleHl6dywKKyAgICAgICAgZXJnYmEsCisgICAgICAgIGVzdHBxLAorICAgIH0gZmllbGRTZXRbNF07CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5udW07ICsraSkgeworICAgICAgICBzd2l0Y2ggKGNvbXBTdHJpbmdbaV0pICB7CisgICAgICAgIGNhc2UgJ3gnOiAKKyAgICAgICAgICAgIGZpZWxkcy5vZmZzZXRzW2ldID0gMDsKKyAgICAgICAgICAgIGZpZWxkU2V0W2ldID0gZXh5enc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncic6IAorICAgICAgICAgICAgZmllbGRzLm9mZnNldHNbaV0gPSAwOworICAgICAgICAgICAgZmllbGRTZXRbaV0gPSBlcmdiYTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgIGZpZWxkcy5vZmZzZXRzW2ldID0gMDsKKyAgICAgICAgICAgIGZpZWxkU2V0W2ldID0gZXN0cHE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAneSc6IAorICAgICAgICAgICAgZmllbGRzLm9mZnNldHNbaV0gPSAxOworICAgICAgICAgICAgZmllbGRTZXRbaV0gPSBleHl6dzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdnJzogCisgICAgICAgICAgICBmaWVsZHMub2Zmc2V0c1tpXSA9IDE7CisgICAgICAgICAgICBmaWVsZFNldFtpXSA9IGVyZ2JhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgZmllbGRzLm9mZnNldHNbaV0gPSAxOworICAgICAgICAgICAgZmllbGRTZXRbaV0gPSBlc3RwcTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd6JzogCisgICAgICAgICAgICBmaWVsZHMub2Zmc2V0c1tpXSA9IDI7CisgICAgICAgICAgICBmaWVsZFNldFtpXSA9IGV4eXp3OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2InOiAKKyAgICAgICAgICAgIGZpZWxkcy5vZmZzZXRzW2ldID0gMjsKKyAgICAgICAgICAgIGZpZWxkU2V0W2ldID0gZXJnYmE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICBmaWVsZHMub2Zmc2V0c1tpXSA9IDI7CisgICAgICAgICAgICBmaWVsZFNldFtpXSA9IGVzdHBxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICBjYXNlICd3JzogCisgICAgICAgICAgICBmaWVsZHMub2Zmc2V0c1tpXSA9IDM7CisgICAgICAgICAgICBmaWVsZFNldFtpXSA9IGV4eXp3OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOiAKKyAgICAgICAgICAgIGZpZWxkcy5vZmZzZXRzW2ldID0gMzsKKyAgICAgICAgICAgIGZpZWxkU2V0W2ldID0gZXJnYmE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncSc6CisgICAgICAgICAgICBmaWVsZHMub2Zmc2V0c1tpXSA9IDM7CisgICAgICAgICAgICBmaWVsZFNldFtpXSA9IGVzdHBxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnJvcihsaW5lLCAiaWxsZWdhbCB2ZWN0b3IgZmllbGQgc2VsZWN0aW9uIiwgY29tcFN0cmluZy5jX3N0cigpLCAiIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5udW07ICsraSkgeworICAgICAgICBpZiAoZmllbGRzLm9mZnNldHNbaV0gPj0gdmVjU2l6ZSkgeworICAgICAgICAgICAgZXJyb3IobGluZSwgInZlY3RvciBmaWVsZCBzZWxlY3Rpb24gb3V0IG9mIHJhbmdlIiwgIGNvbXBTdHJpbmcuY19zdHIoKSwgIiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBpZiAoZmllbGRTZXRbaV0gIT0gZmllbGRTZXRbaS0xXSkgeworICAgICAgICAgICAgICAgIGVycm9yKGxpbmUsICJpbGxlZ2FsIC0gdmVjdG9yIGNvbXBvbmVudCBmaWVsZHMgbm90IGZyb20gdGhlIHNhbWUgc2V0IiwgY29tcFN0cmluZy5jX3N0cigpLCAiIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworLy8KKy8vIExvb2sgYXQgYSAnLicgZmllbGQgc2VsZWN0b3Igc3RyaW5nIGFuZCBjaGFuZ2UgaXQgaW50byBvZmZzZXRzCisvLyBmb3IgYSBtYXRyaXguCisvLworYm9vbCBUUGFyc2VDb250ZXh0OjpwYXJzZU1hdHJpeEZpZWxkcyhjb25zdCBUU3RyaW5nJiBjb21wU3RyaW5nLCBpbnQgbWF0U2l6ZSwgVE1hdHJpeEZpZWxkcyYgZmllbGRzLCBpbnQgbGluZSkKK3sKKyAgICBmaWVsZHMud2hvbGVSb3cgPSBmYWxzZTsKKyAgICBmaWVsZHMud2hvbGVDb2wgPSBmYWxzZTsKKyAgICBmaWVsZHMucm93ID0gLTE7CisgICAgZmllbGRzLmNvbCA9IC0xOworCisgICAgaWYgKGNvbXBTdHJpbmcuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgZXJyb3IobGluZSwgImlsbGVnYWwgbGVuZ3RoIG9mIG1hdHJpeCBmaWVsZCBzZWxlY3Rpb24iLCBjb21wU3RyaW5nLmNfc3RyKCksICIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChjb21wU3RyaW5nWzBdID09ICdfJykgeworICAgICAgICBpZiAoY29tcFN0cmluZ1sxXSA8ICcwJyB8fCBjb21wU3RyaW5nWzFdID4gJzMnKSB7CisgICAgICAgICAgICBlcnJvcihsaW5lLCAiaWxsZWdhbCBtYXRyaXggZmllbGQgc2VsZWN0aW9uIiwgY29tcFN0cmluZy5jX3N0cigpLCAiIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmllbGRzLndob2xlQ29sID0gdHJ1ZTsKKyAgICAgICAgZmllbGRzLmNvbCA9IGNvbXBTdHJpbmdbMV0gLSAnMCc7CisgICAgfSBlbHNlIGlmIChjb21wU3RyaW5nWzFdID09ICdfJykgeworICAgICAgICBpZiAoY29tcFN0cmluZ1swXSA8ICcwJyB8fCBjb21wU3RyaW5nWzBdID4gJzMnKSB7CisgICAgICAgICAgICBlcnJvcihsaW5lLCAiaWxsZWdhbCBtYXRyaXggZmllbGQgc2VsZWN0aW9uIiwgY29tcFN0cmluZy5jX3N0cigpLCAiIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmllbGRzLndob2xlUm93ID0gdHJ1ZTsKKyAgICAgICAgZmllbGRzLnJvdyA9IGNvbXBTdHJpbmdbMF0gLSAnMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNvbXBTdHJpbmdbMF0gPCAnMCcgfHwgY29tcFN0cmluZ1swXSA+ICczJyB8fAorICAgICAgICAgICAgY29tcFN0cmluZ1sxXSA8ICcwJyB8fCBjb21wU3RyaW5nWzFdID4gJzMnKSB7CisgICAgICAgICAgICBlcnJvcihsaW5lLCAiaWxsZWdhbCBtYXRyaXggZmllbGQgc2VsZWN0aW9uIiwgY29tcFN0cmluZy5jX3N0cigpLCAiIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmllbGRzLnJvdyA9IGNvbXBTdHJpbmdbMF0gLSAnMCc7CisgICAgICAgIGZpZWxkcy5jb2wgPSBjb21wU3RyaW5nWzFdIC0gJzAnOworICAgIH0KKworICAgIGlmIChmaWVsZHMucm93ID49IG1hdFNpemUgfHwgZmllbGRzLmNvbCA+PSBtYXRTaXplKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJtYXRyaXggZmllbGQgc2VsZWN0aW9uIG91dCBvZiByYW5nZSIsIGNvbXBTdHJpbmcuY19zdHIoKSwgIiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gRXJyb3JzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vCisvLyBUcmFjayB3aGV0aGVyIGVycm9ycyBoYXZlIG9jY3VycmVkLgorLy8KK3ZvaWQgVFBhcnNlQ29udGV4dDo6cmVjb3ZlcigpCit7CisgICAgcmVjb3ZlcmVkRnJvbUVycm9yID0gdHJ1ZTsKK30KKworLy8KKy8vIFVzZWQgYnkgZmxleC9iaXNvbiB0byBvdXRwdXQgYWxsIHN5bnRheCBhbmQgcGFyc2luZyBlcnJvcnMuCisvLwordm9pZCBUUGFyc2VDb250ZXh0OjplcnJvcihUU291cmNlTG9jIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmVhc29uLCBjb25zdCBjaGFyKiB0b2tlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dHJhSW5mb0Zvcm1hdCwgLi4uKQoreworICAgIGNoYXIgZXh0cmFJbmZvWzUxMl07CisgICAgdmFfbGlzdCBtYXJrZXI7CisgICAgdmFfc3RhcnQobWFya2VyLCBleHRyYUluZm9Gb3JtYXQpOworICAgIHZzbnByaW50ZihleHRyYUluZm8sIHNpemVvZihleHRyYUluZm8pLCBleHRyYUluZm9Gb3JtYXQsIG1hcmtlcik7CisKKyAgICBSZXBvcnRJbmZvKGluZm9TaW5rLmluZm8sIEVQcmVmaXhFcnJvciwgbG9jLCByZWFzb24sIHRva2VuLCBleHRyYUluZm8pOworCisgICAgdmFfZW5kKG1hcmtlcik7CisgICAgKytudW1FcnJvcnM7Cit9CisKK3ZvaWQgVFBhcnNlQ29udGV4dDo6d2FybmluZyhUU291cmNlTG9jIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZWFzb24sIGNvbnN0IGNoYXIqIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dHJhSW5mb0Zvcm1hdCwgLi4uKSB7CisgICAgY2hhciBleHRyYUluZm9bNTEyXTsKKyAgICB2YV9saXN0IG1hcmtlcjsKKyAgICB2YV9zdGFydChtYXJrZXIsIGV4dHJhSW5mb0Zvcm1hdCk7CisgICAgdnNucHJpbnRmKGV4dHJhSW5mbywgc2l6ZW9mKGV4dHJhSW5mbyksIGV4dHJhSW5mb0Zvcm1hdCwgbWFya2VyKTsKKworICAgIFJlcG9ydEluZm8oaW5mb1NpbmsuaW5mbywgRVByZWZpeFdhcm5pbmcsIGxvYywgcmVhc29uLCB0b2tlbiwgZXh0cmFJbmZvKTsKKworICAgIHZhX2VuZChtYXJrZXIpOworfQorCisvLworLy8gU2FtZSBlcnJvciBtZXNzYWdlIGZvciBhbGwgcGxhY2VzIGFzc2lnbm1lbnRzIGRvbid0IHdvcmsuCisvLwordm9pZCBUUGFyc2VDb250ZXh0Ojphc3NpZ25FcnJvcihpbnQgbGluZSwgY29uc3QgY2hhciogb3AsIFRTdHJpbmcgbGVmdCwgVFN0cmluZyByaWdodCkKK3sKKyAgICBlcnJvcihsaW5lLCAiIiwgb3AsICJjYW5ub3QgY29udmVydCBmcm9tICclcycgdG8gJyVzJyIsCisgICAgICAgICAgcmlnaHQuY19zdHIoKSwgbGVmdC5jX3N0cigpKTsKK30KKworLy8KKy8vIFNhbWUgZXJyb3IgbWVzc2FnZSBmb3IgYWxsIHBsYWNlcyB1bmFyeSBvcGVyYXRpb25zIGRvbid0IHdvcmsuCisvLwordm9pZCBUUGFyc2VDb250ZXh0Ojp1bmFyeU9wRXJyb3IoaW50IGxpbmUsIGNvbnN0IGNoYXIqIG9wLCBUU3RyaW5nIG9wZXJhbmQpCit7CisgICBlcnJvcihsaW5lLCAiIHdyb25nIG9wZXJhbmQgdHlwZSIsIG9wLCAKKyAgICAgICAgICAibm8gb3BlcmF0aW9uICclcycgZXhpc3RzIHRoYXQgdGFrZXMgYW4gb3BlcmFuZCBvZiB0eXBlICVzIChvciB0aGVyZSBpcyBubyBhY2NlcHRhYmxlIGNvbnZlcnNpb24pIiwKKyAgICAgICAgICBvcCwgb3BlcmFuZC5jX3N0cigpKTsKK30KKworLy8KKy8vIFNhbWUgZXJyb3IgbWVzc2FnZSBmb3IgYWxsIGJpbmFyeSBvcGVyYXRpb25zIGRvbid0IHdvcmsuCisvLwordm9pZCBUUGFyc2VDb250ZXh0OjpiaW5hcnlPcEVycm9yKGludCBsaW5lLCBjb25zdCBjaGFyKiBvcCwgVFN0cmluZyBsZWZ0LCBUU3RyaW5nIHJpZ2h0KQoreworICAgIGVycm9yKGxpbmUsICIgd3Jvbmcgb3BlcmFuZCB0eXBlcyAiLCBvcCwgCisgICAgICAgICAgICAibm8gb3BlcmF0aW9uICclcycgZXhpc3RzIHRoYXQgdGFrZXMgYSBsZWZ0LWhhbmQgb3BlcmFuZCBvZiB0eXBlICclcycgYW5kICIKKyAgICAgICAgICAgICJhIHJpZ2h0IG9wZXJhbmQgb2YgdHlwZSAnJXMnIChvciB0aGVyZSBpcyBubyBhY2NlcHRhYmxlIGNvbnZlcnNpb24pIiwgCisgICAgICAgICAgICBvcCwgbGVmdC5jX3N0cigpLCByaWdodC5jX3N0cigpKTsKK30KKworYm9vbCBUUGFyc2VDb250ZXh0OjpwcmVjaXNpb25FcnJvckNoZWNrKGludCBsaW5lLCBUUHJlY2lzaW9uIHByZWNpc2lvbiwgVEJhc2ljVHlwZSB0eXBlKXsKKyAgICBzd2l0Y2goIHR5cGUgKXsKKyAgICBjYXNlIEVidEZsb2F0OgorICAgICAgICBpZiggcHJlY2lzaW9uID09IEVicFVuZGVmaW5lZCApeworICAgICAgICAgICAgZXJyb3IoIGxpbmUsICJObyBwcmVjaXNpb24gc3BlY2lmaWVkIGZvciAoZmxvYXQpIiwgIiIsICIiICk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVidEludDoKKyAgICAgICAgaWYoIHByZWNpc2lvbiA9PSBFYnBVbmRlZmluZWQgKXsKKyAgICAgICAgICAgIGVycm9yKCBsaW5lLCAiTm8gcHJlY2lzaW9uIHNwZWNpZmllZCAoaW50KSIsICIiLCAiIiApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vCisvLyBCb3RoIHRlc3QgYW5kIGlmIG5lY2Vzc2FyeSwgc3BpdCBvdXQgYW4gZXJyb3IsIHRvIHNlZSBpZiB0aGUgbm9kZSBpcyByZWFsbHkKKy8vIGFuIGwtdmFsdWUgdGhhdCBjYW4gYmUgb3BlcmF0ZWQgb24gdGhpcyB3YXkuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB3YXMgYW4gZXJyb3IuCisvLworYm9vbCBUUGFyc2VDb250ZXh0OjpsVmFsdWVFcnJvckNoZWNrKGludCBsaW5lLCBjb25zdCBjaGFyKiBvcCwgVEludGVybVR5cGVkKiBub2RlKQoreworICAgIFRJbnRlcm1TeW1ib2wqIHN5bU5vZGUgPSBub2RlLT5nZXRBc1N5bWJvbE5vZGUoKTsKKyAgICBUSW50ZXJtQmluYXJ5KiBiaW5hcnlOb2RlID0gbm9kZS0+Z2V0QXNCaW5hcnlOb2RlKCk7CisKKyAgICBpZiAoYmluYXJ5Tm9kZSkgeworICAgICAgICBib29sIGVycm9yUmV0dXJuOworCisgICAgICAgIHN3aXRjaChiaW5hcnlOb2RlLT5nZXRPcCgpKSB7CisgICAgICAgIGNhc2UgRU9wSW5kZXhEaXJlY3Q6CisgICAgICAgIGNhc2UgRU9wSW5kZXhJbmRpcmVjdDoKKyAgICAgICAgY2FzZSBFT3BJbmRleERpcmVjdFN0cnVjdDoKKyAgICAgICAgICAgIHJldHVybiBsVmFsdWVFcnJvckNoZWNrKGxpbmUsIG9wLCBiaW5hcnlOb2RlLT5nZXRMZWZ0KCkpOworICAgICAgICBjYXNlIEVPcFZlY3RvclN3aXp6bGU6CisgICAgICAgICAgICBlcnJvclJldHVybiA9IGxWYWx1ZUVycm9yQ2hlY2sobGluZSwgb3AsIGJpbmFyeU5vZGUtPmdldExlZnQoKSk7CisgICAgICAgICAgICBpZiAoIWVycm9yUmV0dXJuKSB7CisgICAgICAgICAgICAgICAgaW50IG9mZnNldFs0XSA9IHswLDAsMCwwfTsKKworICAgICAgICAgICAgICAgIFRJbnRlcm1UeXBlZCogcmlnaHROb2RlID0gYmluYXJ5Tm9kZS0+Z2V0UmlnaHQoKTsKKyAgICAgICAgICAgICAgICBUSW50ZXJtQWdncmVnYXRlICphZ2dyTm9kZSA9IHJpZ2h0Tm9kZS0+Z2V0QXNBZ2dyZWdhdGUoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKFRJbnRlcm1TZXF1ZW5jZTo6aXRlcmF0b3IgcCA9IGFnZ3JOb2RlLT5nZXRTZXF1ZW5jZSgpLmJlZ2luKCk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICE9IGFnZ3JOb2RlLT5nZXRTZXF1ZW5jZSgpLmVuZCgpOyBwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gKCpwKS0+Z2V0QXNUeXBlZCgpLT5nZXRBc0NvbnN0YW50VW5pb24oKS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKS0+Z2V0SUNvbnN0KCk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFt2YWx1ZV0rKzsgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0W3ZhbHVlXSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKGxpbmUsICIgbC12YWx1ZSBvZiBzd2l6emxlIGNhbm5vdCBoYXZlIGR1cGxpY2F0ZSBjb21wb25lbnRzIiwgb3AsICIiLCAiIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAKKworICAgICAgICAgICAgcmV0dXJuIGVycm9yUmV0dXJuOworICAgICAgICBkZWZhdWx0OiAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVycm9yKGxpbmUsICIgbC12YWx1ZSByZXF1aXJlZCIsIG9wLCAiIiwgIiIpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgY29uc3QgY2hhciogc3ltYm9sID0gMDsKKyAgICBpZiAoc3ltTm9kZSAhPSAwKQorICAgICAgICBzeW1ib2wgPSBzeW1Ob2RlLT5nZXRTeW1ib2woKS5jX3N0cigpOworCisgICAgY29uc3QgY2hhciogbWVzc2FnZSA9IDA7CisgICAgc3dpdGNoIChub2RlLT5nZXRRdWFsaWZpZXIoKSkgeworICAgIGNhc2UgRXZxQ29uc3Q6ICAgICAgICAgIG1lc3NhZ2UgPSAiY2FuJ3QgbW9kaWZ5IGEgY29uc3QiOyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdnFDb25zdFJlYWRPbmx5OiAgbWVzc2FnZSA9ICJjYW4ndCBtb2RpZnkgYSBjb25zdCI7ICAgICAgICBicmVhazsKKyAgICBjYXNlIEV2cUF0dHJpYnV0ZTogICAgICBtZXNzYWdlID0gImNhbid0IG1vZGlmeSBhbiBhdHRyaWJ1dGUiOyAgIGJyZWFrOworICAgIGNhc2UgRXZxVW5pZm9ybTogICAgICAgIG1lc3NhZ2UgPSAiY2FuJ3QgbW9kaWZ5IGEgdW5pZm9ybSI7ICAgICAgYnJlYWs7CisgICAgY2FzZSBFdnFWYXJ5aW5nSW46ICAgICAgbWVzc2FnZSA9ICJjYW4ndCBtb2RpZnkgYSB2YXJ5aW5nIjsgICAgICBicmVhazsKKyAgICBjYXNlIEV2cUlucHV0OiAgICAgICAgICBtZXNzYWdlID0gImNhbid0IG1vZGlmeSBhbiBpbnB1dCI7ICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZxRnJhZ0Nvb3JkOiAgICAgIG1lc3NhZ2UgPSAiY2FuJ3QgbW9kaWZ5IGdsX0ZyYWdDb29yZCI7ICAgYnJlYWs7CisgICAgY2FzZSBFdnFGcm9udEZhY2luZzogICAgbWVzc2FnZSA9ICJjYW4ndCBtb2RpZnkgZ2xfRnJvbnRGYWNpbmciOyBicmVhazsKKyAgICBjYXNlIEV2cVBvaW50Q29vcmQ6ICAgICBtZXNzYWdlID0gImNhbid0IG1vZGlmeSBnbF9Qb2ludENvb3JkIjsgIGJyZWFrOworICAgIGRlZmF1bHQ6CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVHlwZSB0aGF0IGNhbid0IGJlIHdyaXR0ZW4gdG8/CisgICAgICAgIC8vCisgICAgICAgIHN3aXRjaCAobm9kZS0+Z2V0QmFzaWNUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBFYnRTYW1wbGVyMkQ6CisgICAgICAgIGNhc2UgRWJ0U2FtcGxlckN1YmU6CisgICAgICAgICAgICBtZXNzYWdlID0gImNhbid0IG1vZGlmeSBhIHNhbXBsZXIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRWJ0Vm9pZDoKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiY2FuJ3QgbW9kaWZ5IHZvaWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWVzc2FnZSA9PSAwICYmIGJpbmFyeU5vZGUgPT0gMCAmJiBzeW1Ob2RlID09IDApIHsKKyAgICAgICAgZXJyb3IobGluZSwgIiBsLXZhbHVlIHJlcXVpcmVkIiwgb3AsICIiLCAiIik7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpcyBva2F5LCBubyBlcnJvci4KKyAgICAvLworICAgIGlmIChtZXNzYWdlID09IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vCisgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIHdlIGhhdmUgYW4gZXJyb3IgYW5kIGEgbWVzc2FnZS4KKyAgICAvLworICAgIGlmIChzeW1Ob2RlKQorICAgICAgICBlcnJvcihsaW5lLCAiIGwtdmFsdWUgcmVxdWlyZWQiLCBvcCwgIlwiJXNcIiAoJXMpIiwgc3ltYm9sLCBtZXNzYWdlKTsKKyAgICBlbHNlCisgICAgICAgIGVycm9yKGxpbmUsICIgbC12YWx1ZSByZXF1aXJlZCIsIG9wLCAiKCVzKSIsIG1lc3NhZ2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vCisvLyBCb3RoIHRlc3QsIGFuZCBpZiBuZWNlc3Nhcnkgc3BpdCBvdXQgYW4gZXJyb3IsIHRvIHNlZSBpZiB0aGUgbm9kZSBpcyByZWFsbHkKKy8vIGEgY29uc3RhbnQuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB3YXMgYW4gZXJyb3IuCisvLworYm9vbCBUUGFyc2VDb250ZXh0Ojpjb25zdEVycm9yQ2hlY2soVEludGVybVR5cGVkKiBub2RlKQoreworICAgIGlmIChub2RlLT5nZXRRdWFsaWZpZXIoKSA9PSBFdnFDb25zdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZXJyb3Iobm9kZS0+Z2V0TGluZSgpLCAiY29uc3RhbnQgZXhwcmVzc2lvbiByZXF1aXJlZCIsICIiLCAiIik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8KKy8vIEJvdGggdGVzdCwgYW5kIGlmIG5lY2Vzc2FyeSBzcGl0IG91dCBhbiBlcnJvciwgdG8gc2VlIGlmIHRoZSBub2RlIGlzIHJlYWxseQorLy8gYW4gaW50ZWdlci4KKy8vCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHdhcyBhbiBlcnJvci4KKy8vCitib29sIFRQYXJzZUNvbnRleHQ6OmludGVnZXJFcnJvckNoZWNrKFRJbnRlcm1UeXBlZCogbm9kZSwgY29uc3QgY2hhciogdG9rZW4pCit7CisgICAgaWYgKG5vZGUtPmdldEJhc2ljVHlwZSgpID09IEVidEludCAmJiBub2RlLT5nZXROb21pbmFsU2l6ZSgpID09IDEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGVycm9yKG5vZGUtPmdldExpbmUoKSwgImludGVnZXIgZXhwcmVzc2lvbiByZXF1aXJlZCIsIHRva2VuLCAiIik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8KKy8vIEJvdGggdGVzdCwgYW5kIGlmIG5lY2Vzc2FyeSBzcGl0IG91dCBhbiBlcnJvciwgdG8gc2VlIGlmIHdlIGFyZSBjdXJyZW50bHkKKy8vIGdsb2JhbGx5IHNjb3BlZC4KKy8vCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHdhcyBhbiBlcnJvci4KKy8vCitib29sIFRQYXJzZUNvbnRleHQ6Omdsb2JhbEVycm9yQ2hlY2soaW50IGxpbmUsIGJvb2wgZ2xvYmFsLCBjb25zdCBjaGFyKiB0b2tlbikKK3sKKyAgICBpZiAoZ2xvYmFsKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBlcnJvcihsaW5lLCAib25seSBhbGxvd2VkIGF0IGdsb2JhbCBzY29wZSIsIHRva2VuLCAiIik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8KKy8vIEZvciBub3csIGtlZXAgaXQgc2ltcGxlOiAgaWYgaXQgc3RhcnRzICJnbF8iLCBpdCdzIHJlc2VydmVkLCBpbmRlcGVuZGVudAorLy8gb2Ygc2NvcGUuICBFeGNlcHQsIGlmIHRoZSBzeW1ib2wgdGFibGUgaXMgYXQgdGhlIGJ1aWx0LWluIHB1c2gtbGV2ZWwsCisvLyB3aGljaCBpcyB3aGVuIHdlIGFyZSBwYXJzaW5nIGJ1aWx0LWlucy4KKy8vIEFsc28gY2hlY2tzIGZvciAid2ViZ2xfIiBhbmQgIl93ZWJnbF8iIHJlc2VydmVkIGlkZW50aWZpZXJzIGlmIHBhcnNpbmcgYQorLy8gd2ViZ2wgc2hhZGVyLgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCisvLworYm9vbCBUUGFyc2VDb250ZXh0OjpyZXNlcnZlZEVycm9yQ2hlY2soaW50IGxpbmUsIGNvbnN0IFRTdHJpbmcmIGlkZW50aWZpZXIpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIHJlc2VydmVkRXJyTXNnID0gInJlc2VydmVkIGJ1aWx0LWluIG5hbWUiOworICAgIGlmICghc3ltYm9sVGFibGUuYXRCdWlsdEluTGV2ZWwoKSkgeworICAgICAgICBpZiAoaWRlbnRpZmllci5jb21wYXJlKDAsIDMsICJnbF8iKSA9PSAwKSB7CisgICAgICAgICAgICBlcnJvcihsaW5lLCByZXNlcnZlZEVyck1zZywgImdsXyIsICIiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzaGFkZXJTcGVjID09IFNIX1dFQkdMX1NQRUMpIHsKKyAgICAgICAgICAgIGlmIChpZGVudGlmaWVyLmNvbXBhcmUoMCwgNiwgIndlYmdsXyIpID09IDApIHsKKyAgICAgICAgICAgICAgICBlcnJvcihsaW5lLCByZXNlcnZlZEVyck1zZywgIndlYmdsXyIsICIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpZGVudGlmaWVyLmNvbXBhcmUoMCwgNywgIl93ZWJnbF8iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZXJyb3IobGluZSwgcmVzZXJ2ZWRFcnJNc2csICJfd2ViZ2xfIiwgIiIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpZGVudGlmaWVyLmZpbmQoIl9fIikgIT0gVFN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgLy9lcnJvcihsaW5lLCAiVHdvIGNvbnNlY3V0aXZlIHVuZGVyc2NvcmVzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iLCBpZGVudGlmaWVyLmNfc3RyKCksICIiLCAiIik7CisgICAgICAgICAgICAvL3JldHVybiB0cnVlOworICAgICAgICAgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhXYXJuaW5nLCAiVHdvIGNvbnNlY3V0aXZlIHVuZGVyc2NvcmVzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iLCBsaW5lKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8KKy8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggZGF0YSBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IgdG8gYnVpbGQKKy8vIHNvbWV0aGluZyBvZiB0aGUgdHlwZSBvZiB0aGUgY29uc3RydWN0b3IuICBBbHNvIHJldHVybnMgdGhlIHR5cGUgb2YKKy8vIHRoZSBjb25zdHJ1Y3Rvci4KKy8vCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIGNvbnN0cnVjdGlvbi4KKy8vCitib29sIFRQYXJzZUNvbnRleHQ6OmNvbnN0cnVjdG9yRXJyb3JDaGVjayhpbnQgbGluZSwgVEludGVybU5vZGUqIG5vZGUsIFRGdW5jdGlvbiYgZnVuY3Rpb24sIFRPcGVyYXRvciBvcCwgVFR5cGUqIHR5cGUpCit7CisgICAgKnR5cGUgPSBmdW5jdGlvbi5nZXRSZXR1cm5UeXBlKCk7CisKKyAgICBib29sIGNvbnN0cnVjdGluZ01hdHJpeCA9IGZhbHNlOworICAgIHN3aXRjaChvcCkgeworICAgIGNhc2UgRU9wQ29uc3RydWN0TWF0MjoKKyAgICBjYXNlIEVPcENvbnN0cnVjdE1hdDM6CisgICAgY2FzZSBFT3BDb25zdHJ1Y3RNYXQ0OgorICAgICAgICBjb25zdHJ1Y3RpbmdNYXRyaXggPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOb3RlOiBJdCdzIG9rYXkgdG8gaGF2ZSB0b28gbWFueSBjb21wb25lbnRzIGF2YWlsYWJsZSwgYnV0IG5vdCBva2F5IHRvIGhhdmUgdW51c2VkCisgICAgLy8gYXJndW1lbnRzLiAgJ2Z1bGwnIHdpbGwgZ28gdG8gdHJ1ZSB3aGVuIGVub3VnaCBhcmdzIGhhdmUgYmVlbiBzZWVuLiAgSWYgd2UgbG9vcAorICAgIC8vIGFnYWluLCB0aGVyZSBpcyBhbiBleHRyYSBhcmd1bWVudCwgc28gJ292ZXJmdWxsJyB3aWxsIGJlY29tZSB0cnVlLgorICAgIC8vCisKKyAgICBpbnQgc2l6ZSA9IDA7CisgICAgYm9vbCBjb25zdFR5cGUgPSB0cnVlOworICAgIGJvb2wgZnVsbCA9IGZhbHNlOworICAgIGJvb2wgb3ZlckZ1bGwgPSBmYWxzZTsKKyAgICBib29sIG1hdHJpeEluTWF0cml4ID0gZmFsc2U7CisgICAgYm9vbCBhcnJheUFyZyA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3Rpb24uZ2V0UGFyYW1Db3VudCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgVFBhcmFtZXRlciYgcGFyYW0gPSBmdW5jdGlvbi5nZXRQYXJhbShpKTsKKyAgICAgICAgc2l6ZSArPSBwYXJhbS50eXBlLT5nZXRPYmplY3RTaXplKCk7CisgICAgICAgIAorICAgICAgICBpZiAoY29uc3RydWN0aW5nTWF0cml4ICYmIHBhcmFtLnR5cGUtPmlzTWF0cml4KCkpCisgICAgICAgICAgICBtYXRyaXhJbk1hdHJpeCA9IHRydWU7CisgICAgICAgIGlmIChmdWxsKQorICAgICAgICAgICAgb3ZlckZ1bGwgPSB0cnVlOworICAgICAgICBpZiAob3AgIT0gRU9wQ29uc3RydWN0U3RydWN0ICYmICF0eXBlLT5pc0FycmF5KCkgJiYgc2l6ZSA+PSB0eXBlLT5nZXRPYmplY3RTaXplKCkpCisgICAgICAgICAgICBmdWxsID0gdHJ1ZTsKKyAgICAgICAgaWYgKHBhcmFtLnR5cGUtPmdldFF1YWxpZmllcigpICE9IEV2cUNvbnN0KQorICAgICAgICAgICAgY29uc3RUeXBlID0gZmFsc2U7CisgICAgICAgIGlmIChwYXJhbS50eXBlLT5pc0FycmF5KCkpCisgICAgICAgICAgICBhcnJheUFyZyA9IHRydWU7CisgICAgfQorICAgIAorICAgIGlmIChjb25zdFR5cGUpCisgICAgICAgIHR5cGUtPnNldFF1YWxpZmllcihFdnFDb25zdCk7CisKKyAgICBpZiAodHlwZS0+aXNBcnJheSgpICYmIHR5cGUtPmdldEFycmF5U2l6ZSgpICE9IGZ1bmN0aW9uLmdldFBhcmFtQ291bnQoKSkgeworICAgICAgICBlcnJvcihsaW5lLCAiYXJyYXkgY29uc3RydWN0b3IgbmVlZHMgb25lIGFyZ3VtZW50IHBlciBhcnJheSBlbGVtZW50IiwgImNvbnN0cnVjdG9yIiwgIiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoYXJyYXlBcmcgJiYgb3AgIT0gRU9wQ29uc3RydWN0U3RydWN0KSB7CisgICAgICAgIGVycm9yKGxpbmUsICJjb25zdHJ1Y3RpbmcgZnJvbSBhIG5vbi1kZXJlZmVyZW5jZWQgYXJyYXkiLCAiY29uc3RydWN0b3IiLCAiIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChtYXRyaXhJbk1hdHJpeCAmJiAhdHlwZS0+aXNBcnJheSgpKSB7CisgICAgICAgIGlmIChmdW5jdGlvbi5nZXRQYXJhbUNvdW50KCkgIT0gMSkgeworICAgICAgICAgIGVycm9yKGxpbmUsICJjb25zdHJ1Y3RpbmcgbWF0cml4IGZyb20gbWF0cml4IGNhbiBvbmx5IHRha2Ugb25lIGFyZ3VtZW50IiwgImNvbnN0cnVjdG9yIiwgIiIpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG92ZXJGdWxsKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJ0b28gbWFueSBhcmd1bWVudHMiLCAiY29uc3RydWN0b3IiLCAiIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBpZiAob3AgPT0gRU9wQ29uc3RydWN0U3RydWN0ICYmICF0eXBlLT5pc0FycmF5KCkgJiYgaW50KHR5cGUtPmdldFN0cnVjdCgpLT5zaXplKCkpICE9IGZ1bmN0aW9uLmdldFBhcmFtQ291bnQoKSkgeworICAgICAgICBlcnJvcihsaW5lLCAiTnVtYmVyIG9mIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBzdHJ1Y3R1cmUgZmllbGRzIiwgImNvbnN0cnVjdG9yIiwgIiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIXR5cGUtPmlzTWF0cml4KCkpIHsKKyAgICAgICAgaWYgKChvcCAhPSBFT3BDb25zdHJ1Y3RTdHJ1Y3QgJiYgc2l6ZSAhPSAxICYmIHNpemUgPCB0eXBlLT5nZXRPYmplY3RTaXplKCkpIHx8CisgICAgICAgICAgICAob3AgPT0gRU9wQ29uc3RydWN0U3RydWN0ICYmIHNpemUgPCB0eXBlLT5nZXRPYmplY3RTaXplKCkpKSB7CisgICAgICAgICAgICBlcnJvcihsaW5lLCAibm90IGVub3VnaCBkYXRhIHByb3ZpZGVkIGZvciBjb25zdHJ1Y3Rpb24iLCAiY29uc3RydWN0b3IiLCAiIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRJbnRlcm1UeXBlZCAqdHlwZWQgPSBub2RlID8gbm9kZS0+Z2V0QXNUeXBlZCgpIDogMDsKKyAgICBpZiAodHlwZWQgPT0gMCkgeworICAgICAgICBlcnJvcihsaW5lLCAiY29uc3RydWN0b3IgYXJndW1lbnQgZG9lcyBub3QgaGF2ZSBhIHR5cGUiLCAiY29uc3RydWN0b3IiLCAiIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAob3AgIT0gRU9wQ29uc3RydWN0U3RydWN0ICYmIElzU2FtcGxlcih0eXBlZC0+Z2V0QmFzaWNUeXBlKCkpKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJjYW5ub3QgY29udmVydCBhIHNhbXBsZXIiLCAiY29uc3RydWN0b3IiLCAiIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAodHlwZWQtPmdldEJhc2ljVHlwZSgpID09IEVidFZvaWQpIHsKKyAgICAgICAgZXJyb3IobGluZSwgImNhbm5vdCBjb252ZXJ0IGEgdm9pZCIsICJjb25zdHJ1Y3RvciIsICIiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgYSB2b2lkIHZhcmlhYmxlIGhhcyBiZWVuIGRlY2xhcmVkIGFuZCByYWlzZSBhbiBlcnJvciBtZXNzYWdlIGZvciBzdWNoIGEgY2FzZQorLy8KKy8vIHJldHVybnMgdHJ1ZSBpbiBjYXNlIG9mIGFuIGVycm9yCisvLworYm9vbCBUUGFyc2VDb250ZXh0Ojp2b2lkRXJyb3JDaGVjayhpbnQgbGluZSwgY29uc3QgVFN0cmluZyYgaWRlbnRpZmllciwgY29uc3QgVFB1YmxpY1R5cGUmIHB1YlR5cGUpCit7CisgICAgaWYgKHB1YlR5cGUudHlwZSA9PSBFYnRWb2lkKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJpbGxlZ2FsIHVzZSBvZiB0eXBlICd2b2lkJyIsIGlkZW50aWZpZXIuY19zdHIoKSwgIiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IAorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIG5vZGUgKGZvciB0aGUgZXhwcmVzc2lvbikgY29udGFpbnMgYSBzY2FsYXIgYm9vbGVhbiBleHByZXNzaW9uIG9yIG5vdAorLy8KKy8vIHJldHVybnMgdHJ1ZSBpbiBjYXNlIG9mIGFuIGVycm9yCisvLworYm9vbCBUUGFyc2VDb250ZXh0Ojpib29sRXJyb3JDaGVjayhpbnQgbGluZSwgY29uc3QgVEludGVybVR5cGVkKiB0eXBlKQoreworICAgIGlmICh0eXBlLT5nZXRCYXNpY1R5cGUoKSAhPSBFYnRCb29sIHx8IHR5cGUtPmlzQXJyYXkoKSB8fCB0eXBlLT5pc01hdHJpeCgpIHx8IHR5cGUtPmlzVmVjdG9yKCkpIHsKKyAgICAgICAgZXJyb3IobGluZSwgImJvb2xlYW4gZXhwcmVzc2lvbiBleHBlY3RlZCIsICIiLCAiIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgbm9kZSAoZm9yIHRoZSBleHByZXNzaW9uKSBjb250YWlucyBhIHNjYWxhciBib29sZWFuIGV4cHJlc3Npb24gb3Igbm90CisvLworLy8gcmV0dXJucyB0cnVlIGluIGNhc2Ugb2YgYW4gZXJyb3IKKy8vCitib29sIFRQYXJzZUNvbnRleHQ6OmJvb2xFcnJvckNoZWNrKGludCBsaW5lLCBjb25zdCBUUHVibGljVHlwZSYgcFR5cGUpCit7CisgICAgaWYgKHBUeXBlLnR5cGUgIT0gRWJ0Qm9vbCB8fCBwVHlwZS5hcnJheSB8fCBwVHlwZS5tYXRyaXggfHwgKHBUeXBlLnNpemUgPiAxKSkgeworICAgICAgICBlcnJvcihsaW5lLCAiYm9vbGVhbiBleHByZXNzaW9uIGV4cGVjdGVkIiwgIiIsICIiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSAKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUUGFyc2VDb250ZXh0OjpzYW1wbGVyRXJyb3JDaGVjayhpbnQgbGluZSwgY29uc3QgVFB1YmxpY1R5cGUmIHBUeXBlLCBjb25zdCBjaGFyKiByZWFzb24pCit7CisgICAgaWYgKHBUeXBlLnR5cGUgPT0gRWJ0U3RydWN0KSB7CisgICAgICAgIGlmIChjb250YWluc1NhbXBsZXIoKnBUeXBlLnVzZXJEZWYpKSB7CisgICAgICAgICAgICBlcnJvcihsaW5lLCByZWFzb24sIGdldEJhc2ljU3RyaW5nKHBUeXBlLnR5cGUpLCAiKHN0cnVjdHVyZSBjb250YWlucyBhIHNhbXBsZXIpIik7CisgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKElzU2FtcGxlcihwVHlwZS50eXBlKSkgeworICAgICAgICBlcnJvcihsaW5lLCByZWFzb24sIGdldEJhc2ljU3RyaW5nKHBUeXBlLnR5cGUpLCAiIik7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRQYXJzZUNvbnRleHQ6OnN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soaW50IGxpbmUsIGNvbnN0IFRQdWJsaWNUeXBlJiBwVHlwZSkKK3sKKyAgICBpZiAoKHBUeXBlLnF1YWxpZmllciA9PSBFdnFWYXJ5aW5nSW4gfHwgcFR5cGUucXVhbGlmaWVyID09IEV2cVZhcnlpbmdPdXQgfHwgcFR5cGUucXVhbGlmaWVyID09IEV2cUF0dHJpYnV0ZSkgJiYKKyAgICAgICAgcFR5cGUudHlwZSA9PSBFYnRTdHJ1Y3QpIHsKKyAgICAgICAgZXJyb3IobGluZSwgImNhbm5vdCBiZSB1c2VkIHdpdGggYSBzdHJ1Y3R1cmUiLCBnZXRRdWFsaWZpZXJTdHJpbmcocFR5cGUucXVhbGlmaWVyKSwgIiIpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHBUeXBlLnF1YWxpZmllciAhPSBFdnFVbmlmb3JtICYmIHNhbXBsZXJFcnJvckNoZWNrKGxpbmUsIHBUeXBlLCAic2FtcGxlcnMgbXVzdCBiZSB1bmlmb3JtIikpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRQYXJzZUNvbnRleHQ6OnBhcmFtZXRlclNhbXBsZXJFcnJvckNoZWNrKGludCBsaW5lLCBUUXVhbGlmaWVyIHF1YWxpZmllciwgY29uc3QgVFR5cGUmIHR5cGUpCit7CisgICAgaWYgKChxdWFsaWZpZXIgPT0gRXZxT3V0IHx8IHF1YWxpZmllciA9PSBFdnFJbk91dCkgJiYgCisgICAgICAgICAgICAgdHlwZS5nZXRCYXNpY1R5cGUoKSAhPSBFYnRTdHJ1Y3QgJiYgSXNTYW1wbGVyKHR5cGUuZ2V0QmFzaWNUeXBlKCkpKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJzYW1wbGVycyBjYW5ub3QgYmUgb3V0cHV0IHBhcmFtZXRlcnMiLCB0eXBlLmdldEJhc2ljU3RyaW5nKCksICIiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRQYXJzZUNvbnRleHQ6OmNvbnRhaW5zU2FtcGxlcihUVHlwZSYgdHlwZSkKK3sKKyAgICBpZiAoSXNTYW1wbGVyKHR5cGUuZ2V0QmFzaWNUeXBlKCkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICh0eXBlLmdldEJhc2ljVHlwZSgpID09IEVidFN0cnVjdCkgeworICAgICAgICBUVHlwZUxpc3QmIHN0cnVjdHVyZSA9ICp0eXBlLmdldFN0cnVjdCgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cnVjdHVyZS5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5zU2FtcGxlcigqc3RydWN0dXJlW2ldLnR5cGUpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLworLy8gRG8gc2l6ZSBjaGVja2luZyBmb3IgYW4gYXJyYXkgdHlwZSdzIHNpemUuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KKy8vCitib29sIFRQYXJzZUNvbnRleHQ6OmFycmF5U2l6ZUVycm9yQ2hlY2soaW50IGxpbmUsIFRJbnRlcm1UeXBlZCogZXhwciwgaW50JiBzaXplKQoreworICAgIFRJbnRlcm1Db25zdGFudFVuaW9uKiBjb25zdGFudCA9IGV4cHItPmdldEFzQ29uc3RhbnRVbmlvbigpOworICAgIGlmIChjb25zdGFudCA9PSAwIHx8IGNvbnN0YW50LT5nZXRCYXNpY1R5cGUoKSAhPSBFYnRJbnQpIHsKKyAgICAgICAgZXJyb3IobGluZSwgImFycmF5IHNpemUgbXVzdCBiZSBhIGNvbnN0YW50IGludGVnZXIgZXhwcmVzc2lvbiIsICIiLCAiIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNpemUgPSBjb25zdGFudC0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKS0+Z2V0SUNvbnN0KCk7CisKKyAgICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJhcnJheSBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIiwgIiIsICIiKTsKKyAgICAgICAgc2l6ZSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8KKy8vIFNlZSBpZiB0aGlzIHF1YWxpZmllciBjYW4gYmUgYW4gYXJyYXkuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorLy8KK2Jvb2wgVFBhcnNlQ29udGV4dDo6YXJyYXlRdWFsaWZpZXJFcnJvckNoZWNrKGludCBsaW5lLCBUUHVibGljVHlwZSB0eXBlKQoreworICAgIGlmICgodHlwZS5xdWFsaWZpZXIgPT0gRXZxQXR0cmlidXRlKSB8fCAodHlwZS5xdWFsaWZpZXIgPT0gRXZxQ29uc3QpKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJjYW5ub3QgZGVjbGFyZSBhcnJheXMgb2YgdGhpcyBxdWFsaWZpZXIiLCBUVHlwZSh0eXBlKS5nZXRDb21wbGV0ZVN0cmluZygpLmNfc3RyKCksICIiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLworLy8gU2VlIGlmIHRoaXMgdHlwZSBjYW4gYmUgYW4gYXJyYXkuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorLy8KK2Jvb2wgVFBhcnNlQ29udGV4dDo6YXJyYXlUeXBlRXJyb3JDaGVjayhpbnQgbGluZSwgVFB1YmxpY1R5cGUgdHlwZSkKK3sKKyAgICAvLworICAgIC8vIENhbiB0aGUgdHlwZSBiZSBhbiBhcnJheT8KKyAgICAvLworICAgIGlmICh0eXBlLmFycmF5KSB7CisgICAgICAgIGVycm9yKGxpbmUsICJjYW5ub3QgZGVjbGFyZSBhcnJheXMgb2YgYXJyYXlzIiwgVFR5cGUodHlwZSkuZ2V0Q29tcGxldGVTdHJpbmcoKS5jX3N0cigpLCAiIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8KKy8vIERvIGFsbCB0aGUgc2VtYW50aWMgY2hlY2tpbmcgZm9yIGRlY2xhcmluZyBhbiBhcnJheSwgd2l0aCBhbmQgCisvLyB3aXRob3V0IGEgc2l6ZSwgYW5kIG1ha2UgdGhlIHJpZ2h0IGNoYW5nZXMgdG8gdGhlIHN5bWJvbCB0YWJsZS4KKy8vCisvLyBzaXplID09IDAgbWVhbnMgbm8gc3BlY2lmaWVkIHNpemUuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KKy8vCitib29sIFRQYXJzZUNvbnRleHQ6OmFycmF5RXJyb3JDaGVjayhpbnQgbGluZSwgVFN0cmluZyYgaWRlbnRpZmllciwgVFB1YmxpY1R5cGUgdHlwZSwgVFZhcmlhYmxlKiYgdmFyaWFibGUpCit7CisgICAgLy8KKyAgICAvLyBEb24ndCBjaGVjayBmb3IgcmVzZXJ2ZWQgd29yZCB1c2UgdW50aWwgYWZ0ZXIgd2Uga25vdyBpdCdzIG5vdCBpbiB0aGUgc3ltYm9sIHRhYmxlLAorICAgIC8vIGJlY2F1c2UgcmVzZXJ2ZWQgYXJyYXlzIGNhbiBiZSByZWRlY2xhcmVkLgorICAgIC8vCisKKyAgICBib29sIGJ1aWx0SW4gPSBmYWxzZTsgCisgICAgYm9vbCBzYW1lU2NvcGUgPSBmYWxzZTsKKyAgICBUU3ltYm9sKiBzeW1ib2wgPSBzeW1ib2xUYWJsZS5maW5kKGlkZW50aWZpZXIsICZidWlsdEluLCAmc2FtZVNjb3BlKTsKKyAgICBpZiAoc3ltYm9sID09IDAgfHwgIXNhbWVTY29wZSkgeworICAgICAgICBpZiAocmVzZXJ2ZWRFcnJvckNoZWNrKGxpbmUsIGlkZW50aWZpZXIpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIAorICAgICAgICB2YXJpYWJsZSA9IG5ldyBUVmFyaWFibGUoJmlkZW50aWZpZXIsIFRUeXBlKHR5cGUpKTsKKworICAgICAgICBpZiAodHlwZS5hcnJheVNpemUpCisgICAgICAgICAgICB2YXJpYWJsZS0+Z2V0VHlwZSgpLnNldEFycmF5U2l6ZSh0eXBlLmFycmF5U2l6ZSk7CisKKyAgICAgICAgaWYgKCEgc3ltYm9sVGFibGUuaW5zZXJ0KCp2YXJpYWJsZSkpIHsKKyAgICAgICAgICAgIGRlbGV0ZSB2YXJpYWJsZTsKKyAgICAgICAgICAgIGVycm9yKGxpbmUsICJJTlRFUk5BTCBFUlJPUiBpbnNlcnRpbmcgbmV3IHN5bWJvbCIsIGlkZW50aWZpZXIuY19zdHIoKSwgIiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoISBzeW1ib2wtPmlzVmFyaWFibGUoKSkgeworICAgICAgICAgICAgZXJyb3IobGluZSwgInZhcmlhYmxlIGV4cGVjdGVkIiwgaWRlbnRpZmllci5jX3N0cigpLCAiIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhcmlhYmxlID0gc3RhdGljX2Nhc3Q8VFZhcmlhYmxlKj4oc3ltYm9sKTsKKyAgICAgICAgaWYgKCEgdmFyaWFibGUtPmdldFR5cGUoKS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGVycm9yKGxpbmUsICJyZWRlY2xhcmluZyBub24tYXJyYXkgYXMgYXJyYXkiLCBpZGVudGlmaWVyLmNfc3RyKCksICIiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YXJpYWJsZS0+Z2V0VHlwZSgpLmdldEFycmF5U2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZXJyb3IobGluZSwgInJlZGVjbGFyYXRpb24gb2YgYXJyYXkgd2l0aCBzaXplIiwgaWRlbnRpZmllci5jX3N0cigpLCAiIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCEgdmFyaWFibGUtPmdldFR5cGUoKS5zYW1lRWxlbWVudFR5cGUoVFR5cGUodHlwZSkpKSB7CisgICAgICAgICAgICBlcnJvcihsaW5lLCAicmVkZWNsYXJhdGlvbiBvZiBhcnJheSB3aXRoIGEgZGlmZmVyZW50IHR5cGUiLCBpZGVudGlmaWVyLmNfc3RyKCksICIiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgVFR5cGUqIHQgPSB2YXJpYWJsZS0+Z2V0QXJyYXlJbmZvcm1hdGlvblR5cGUoKTsKKyAgICAgICAgd2hpbGUgKHQgIT0gMCkgeworICAgICAgICAgICAgaWYgKHQtPmdldE1heEFycmF5U2l6ZSgpID4gdHlwZS5hcnJheVNpemUpIHsKKyAgICAgICAgICAgICAgICBlcnJvcihsaW5lLCAiaGlnaGVyIGluZGV4IHZhbHVlIGFscmVhZHkgdXNlZCBmb3IgdGhlIGFycmF5IiwgaWRlbnRpZmllci5jX3N0cigpLCAiIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0LT5zZXRBcnJheVNpemUodHlwZS5hcnJheVNpemUpOworICAgICAgICAgICAgdCA9IHQtPmdldEFycmF5SW5mb3JtYXRpb25UeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZS5hcnJheVNpemUpCisgICAgICAgICAgICB2YXJpYWJsZS0+Z2V0VHlwZSgpLnNldEFycmF5U2l6ZSh0eXBlLmFycmF5U2l6ZSk7CisgICAgfSAKKworICAgIGlmICh2b2lkRXJyb3JDaGVjayhsaW5lLCBpZGVudGlmaWVyLCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVFBhcnNlQ29udGV4dDo6YXJyYXlTZXRNYXhTaXplKFRJbnRlcm1TeW1ib2wgKm5vZGUsIFRUeXBlKiB0eXBlLCBpbnQgc2l6ZSwgYm9vbCB1cGRhdGVGbGFnLCBUU291cmNlTG9jIGxpbmUpCit7CisgICAgYm9vbCBidWlsdEluID0gZmFsc2U7CisgICAgVFN5bWJvbCogc3ltYm9sID0gc3ltYm9sVGFibGUuZmluZChub2RlLT5nZXRTeW1ib2woKSwgJmJ1aWx0SW4pOworICAgIGlmIChzeW1ib2wgPT0gMCkgeworICAgICAgICBlcnJvcihsaW5lLCAiIHVuZGVjbGFyZWQgaWRlbnRpZmllciIsIG5vZGUtPmdldFN5bWJvbCgpLmNfc3RyKCksICIiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIFRWYXJpYWJsZSogdmFyaWFibGUgPSBzdGF0aWNfY2FzdDxUVmFyaWFibGUqPihzeW1ib2wpOworCisgICAgdHlwZS0+c2V0QXJyYXlJbmZvcm1hdGlvblR5cGUodmFyaWFibGUtPmdldEFycmF5SW5mb3JtYXRpb25UeXBlKCkpOworICAgIHZhcmlhYmxlLT51cGRhdGVBcnJheUluZm9ybWF0aW9uVHlwZSh0eXBlKTsKKworICAgIC8vIHNwZWNpYWwgY2FzaW5nIHRvIHRlc3QgaW5kZXggdmFsdWUgb2YgZ2xfRnJhZ0RhdGEuIElmIHRoZSBhY2Nlc3NlZCBpbmRleCBpcyA+PSBnbF9NYXhEcmF3QnVmZmVycworICAgIC8vIGl0cyBhbiBlcnJvcgorICAgIGlmIChub2RlLT5nZXRTeW1ib2woKSA9PSAiZ2xfRnJhZ0RhdGEiKSB7CisgICAgICAgIFRTeW1ib2wqIGZyYWdEYXRhID0gc3ltYm9sVGFibGUuZmluZCgiZ2xfTWF4RHJhd0J1ZmZlcnMiLCAmYnVpbHRJbik7CisgICAgICAgIGlmIChmcmFnRGF0YSA9PSAwKSB7CisgICAgICAgICAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEludGVybmFsRXJyb3IsICJnbF9NYXhEcmF3QnVmZmVycyBub3QgZGVmaW5lZCIsIGxpbmUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZnJhZ0RhdGFWYWx1ZSA9IHN0YXRpY19jYXN0PFRWYXJpYWJsZSo+KGZyYWdEYXRhKS0+Z2V0Q29uc3RQb2ludGVyKClbMF0uZ2V0SUNvbnN0KCk7CisgICAgICAgIGlmIChmcmFnRGF0YVZhbHVlIDw9IHNpemUpIHsKKyAgICAgICAgICAgIGVycm9yKGxpbmUsICIiLCAiWyIsICJnbF9GcmFnRGF0YSBjYW4gb25seSBoYXZlIGEgbWF4IGFycmF5IHNpemUgb2YgdXAgdG8gZ2xfTWF4RHJhd0J1ZmZlcnMiLCAiIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIGRvbnQgd2FudCB0byB1cGRhdGUgdGhlIG1heEFycmF5U2l6ZSB3aGVuIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCB3ZSBqdXN0IHdhbnQgdG8gaW5jbHVkZSB0aGlzIAorICAgIC8vIG5vZGUgdHlwZSBpbiB0aGUgY2hhaW4gb2Ygbm9kZSB0eXBlcyBzbyB0aGF0IGl0cyB1cGRhdGVkIHdoZW4gYSBoaWdoZXIgbWF4QXJyYXlTaXplIGNvbWVzIGluLgorICAgIGlmICghdXBkYXRlRmxhZykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc2l6ZSsrOworICAgIHZhcmlhYmxlLT5nZXRUeXBlKCkuc2V0TWF4QXJyYXlTaXplKHNpemUpOworICAgIHR5cGUtPnNldE1heEFycmF5U2l6ZShzaXplKTsKKyAgICBUVHlwZSogdHQgPSB0eXBlOworCisgICAgd2hpbGUodHQtPmdldEFycmF5SW5mb3JtYXRpb25UeXBlKCkgIT0gMCkgeworICAgICAgICB0dCA9IHR0LT5nZXRBcnJheUluZm9ybWF0aW9uVHlwZSgpOworICAgICAgICB0dC0+c2V0TWF4QXJyYXlTaXplKHNpemUpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8KKy8vIEVuZm9yY2Ugbm9uLWluaXRpYWxpemVyIHR5cGUvcXVhbGlmaWVyIHJ1bGVzLgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCisvLworYm9vbCBUUGFyc2VDb250ZXh0Ojpub25Jbml0Q29uc3RFcnJvckNoZWNrKGludCBsaW5lLCBUU3RyaW5nJiBpZGVudGlmaWVyLCBUUHVibGljVHlwZSYgdHlwZSkKK3sKKyAgICAvLworICAgIC8vIE1ha2UgdGhlIHF1YWxpZmllciBtYWtlIHNlbnNlLgorICAgIC8vCisgICAgaWYgKHR5cGUucXVhbGlmaWVyID09IEV2cUNvbnN0KSB7CisgICAgICAgIHR5cGUucXVhbGlmaWVyID0gRXZxVGVtcG9yYXJ5OworICAgICAgICBlcnJvcihsaW5lLCAidmFyaWFibGVzIHdpdGggcXVhbGlmaWVyICdjb25zdCcgbXVzdCBiZSBpbml0aWFsaXplZCIsIGlkZW50aWZpZXIuY19zdHIoKSwgIiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vCisvLyBEbyBzZW1hbnRpYyBjaGVja2luZyBmb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0aGF0IGhhcyBubyBpbml0aWFsaXplciwKKy8vIGFuZCB1cGRhdGUgdGhlIHN5bWJvbCB0YWJsZS4KKy8vCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorLy8KK2Jvb2wgVFBhcnNlQ29udGV4dDo6bm9uSW5pdEVycm9yQ2hlY2soaW50IGxpbmUsIFRTdHJpbmcmIGlkZW50aWZpZXIsIFRQdWJsaWNUeXBlJiB0eXBlLCBUVmFyaWFibGUqJiB2YXJpYWJsZSkKK3sKKyAgICBpZiAocmVzZXJ2ZWRFcnJvckNoZWNrKGxpbmUsIGlkZW50aWZpZXIpKQorICAgICAgICByZWNvdmVyKCk7CisKKyAgICB2YXJpYWJsZSA9IG5ldyBUVmFyaWFibGUoJmlkZW50aWZpZXIsIFRUeXBlKHR5cGUpKTsKKworICAgIGlmICghIHN5bWJvbFRhYmxlLmluc2VydCgqdmFyaWFibGUpKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJyZWRlZmluaXRpb24iLCB2YXJpYWJsZS0+Z2V0TmFtZSgpLmNfc3RyKCksICIiKTsKKyAgICAgICAgZGVsZXRlIHZhcmlhYmxlOworICAgICAgICB2YXJpYWJsZSA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICh2b2lkRXJyb3JDaGVjayhsaW5lLCBpZGVudGlmaWVyLCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVFBhcnNlQ29udGV4dDo6cGFyYW1FcnJvckNoZWNrKGludCBsaW5lLCBUUXVhbGlmaWVyIHF1YWxpZmllciwgVFF1YWxpZmllciBwYXJhbVF1YWxpZmllciwgVFR5cGUqIHR5cGUpCit7ICAgIAorICAgIGlmIChxdWFsaWZpZXIgIT0gRXZxQ29uc3QgJiYgcXVhbGlmaWVyICE9IEV2cVRlbXBvcmFyeSkgeworICAgICAgICBlcnJvcihsaW5lLCAicXVhbGlmaWVyIG5vdCBhbGxvd2VkIG9uIGZ1bmN0aW9uIHBhcmFtZXRlciIsIGdldFF1YWxpZmllclN0cmluZyhxdWFsaWZpZXIpLCAiIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAocXVhbGlmaWVyID09IEV2cUNvbnN0ICYmIHBhcmFtUXVhbGlmaWVyICE9IEV2cUluKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJxdWFsaWZpZXIgbm90IGFsbG93ZWQgd2l0aCAiLCBnZXRRdWFsaWZpZXJTdHJpbmcocXVhbGlmaWVyKSwgZ2V0UXVhbGlmaWVyU3RyaW5nKHBhcmFtUXVhbGlmaWVyKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChxdWFsaWZpZXIgPT0gRXZxQ29uc3QpCisgICAgICAgIHR5cGUtPnNldFF1YWxpZmllcihFdnFDb25zdFJlYWRPbmx5KTsKKyAgICBlbHNlCisgICAgICAgIHR5cGUtPnNldFF1YWxpZmllcihwYXJhbVF1YWxpZmllcik7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVFBhcnNlQ29udGV4dDo6ZXh0ZW5zaW9uRXJyb3JDaGVjayhpbnQgbGluZSwgY29uc3QgVFN0cmluZyYgZXh0ZW5zaW9uKQoreworICAgIFRFeHRlbnNpb25CZWhhdmlvcjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbkJlaGF2aW9yLmZpbmQoZXh0ZW5zaW9uKTsKKyAgICBpZiAoaXRlciA9PSBleHRlbnNpb25CZWhhdmlvci5lbmQoKSkgeworICAgICAgICBlcnJvcihsaW5lLCAiZXh0ZW5zaW9uIiwgZXh0ZW5zaW9uLmNfc3RyKCksICJpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoaXRlci0+c2Vjb25kID09IEVCaERpc2FibGUpIHsKKyAgICAgICAgZXJyb3IobGluZSwgImV4dGVuc2lvbiIsIGV4dGVuc2lvbi5jX3N0cigpLCAiaXMgZGlzYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChpdGVyLT5zZWNvbmQgPT0gRUJoV2FybikgeworICAgICAgICBUU3RyaW5nIG1zZyA9ICJleHRlbnNpb24gIiArIGV4dGVuc2lvbiArICIgaXMgYmVpbmcgdXNlZCI7CisgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4V2FybmluZywgbXNnLmNfc3RyKCksIGxpbmUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBOb24tRXJyb3JzLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLworLy8gTG9vayB1cCBhIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIHN5bWJvbCB0YWJsZSwgYW5kIG1ha2Ugc3VyZSBpdCBpcyBhIGZ1bmN0aW9uLgorLy8KKy8vIFJldHVybiB0aGUgZnVuY3Rpb24gc3ltYm9sIGlmIGZvdW5kLCBvdGhlcndpc2UgMC4KKy8vCitjb25zdCBURnVuY3Rpb24qIFRQYXJzZUNvbnRleHQ6OmZpbmRGdW5jdGlvbihpbnQgbGluZSwgVEZ1bmN0aW9uKiBjYWxsLCBib29sICpidWlsdEluKQoreworICAgIC8vIEZpcnN0IGZpbmQgYnkgdW5tYW5nbGVkIG5hbWUgdG8gY2hlY2sgd2hldGhlciB0aGUgZnVuY3Rpb24gbmFtZSBoYXMgYmVlbgorICAgIC8vIGhpZGRlbiBieSBhIHZhcmlhYmxlIG5hbWUgb3Igc3RydWN0IHR5cGVuYW1lLgorICAgIGNvbnN0IFRTeW1ib2wqIHN5bWJvbCA9IHN5bWJvbFRhYmxlLmZpbmQoY2FsbC0+Z2V0TmFtZSgpLCBidWlsdEluKTsKKyAgICBpZiAoc3ltYm9sID09IDApIHsKKyAgICAgICAgc3ltYm9sID0gc3ltYm9sVGFibGUuZmluZChjYWxsLT5nZXRNYW5nbGVkTmFtZSgpLCBidWlsdEluKTsKKyAgICB9CisKKyAgICBpZiAoc3ltYm9sID09IDApIHsKKyAgICAgICAgZXJyb3IobGluZSwgIm5vIG1hdGNoaW5nIG92ZXJsb2FkZWQgZnVuY3Rpb24gZm91bmQiLCBjYWxsLT5nZXROYW1lKCkuY19zdHIoKSwgIiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXN5bWJvbC0+aXNGdW5jdGlvbigpKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJmdW5jdGlvbiBuYW1lIGV4cGVjdGVkIiwgY2FsbC0+Z2V0TmFtZSgpLmNfc3RyKCksICIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFRGdW5jdGlvbio+KHN5bWJvbCk7Cit9CisKKy8vCisvLyBJbml0aWFsaXplcnMgc2hvdyB1cCBpbiBzZXZlcmFsIHBsYWNlcyBpbiB0aGUgZ3JhbW1hci4gIEhhdmUgb25lIHNldCBvZgorLy8gY29kZSB0byBoYW5kbGUgdGhlbSBoZXJlLgorLy8KK2Jvb2wgVFBhcnNlQ29udGV4dDo6ZXhlY3V0ZUluaXRpYWxpemVyKFRTb3VyY2VMb2MgbGluZSwgVFN0cmluZyYgaWRlbnRpZmllciwgVFB1YmxpY1R5cGUmIHBUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJbnRlcm1UeXBlZCogaW5pdGlhbGl6ZXIsIFRJbnRlcm1Ob2RlKiYgaW50ZXJtTm9kZSwgVFZhcmlhYmxlKiB2YXJpYWJsZSkKK3sKKyAgICBUVHlwZSB0eXBlID0gVFR5cGUocFR5cGUpOworCisgICAgaWYgKHZhcmlhYmxlID09IDApIHsKKyAgICAgICAgaWYgKHJlc2VydmVkRXJyb3JDaGVjayhsaW5lLCBpZGVudGlmaWVyKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmICh2b2lkRXJyb3JDaGVjayhsaW5lLCBpZGVudGlmaWVyLCBwVHlwZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLworICAgICAgICAvLyBhZGQgdmFyaWFibGUgdG8gc3ltYm9sIHRhYmxlCisgICAgICAgIC8vCisgICAgICAgIHZhcmlhYmxlID0gbmV3IFRWYXJpYWJsZSgmaWRlbnRpZmllciwgdHlwZSk7CisgICAgICAgIGlmICghIHN5bWJvbFRhYmxlLmluc2VydCgqdmFyaWFibGUpKSB7CisgICAgICAgICAgICBlcnJvcihsaW5lLCAicmVkZWZpbml0aW9uIiwgdmFyaWFibGUtPmdldE5hbWUoKS5jX3N0cigpLCAiIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIC8vIGRvbid0IGRlbGV0ZSB2YXJpYWJsZSwgaXQncyB1c2VkIGJ5IGVycm9yIHJlY292ZXJ5LCBhbmQgdGhlIHBvb2wgCisgICAgICAgICAgICAvLyBwb3Agd2lsbCB0YWtlIGNhcmUgb2YgdGhlIG1lbW9yeQorICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBpZGVudGlmaWVyIG11c3QgYmUgb2YgdHlwZSBjb25zdGFudCwgYSBnbG9iYWwsIG9yIGEgdGVtcG9yYXJ5CisgICAgLy8KKyAgICBUUXVhbGlmaWVyIHF1YWxpZmllciA9IHZhcmlhYmxlLT5nZXRUeXBlKCkuZ2V0UXVhbGlmaWVyKCk7CisgICAgaWYgKChxdWFsaWZpZXIgIT0gRXZxVGVtcG9yYXJ5KSAmJiAocXVhbGlmaWVyICE9IEV2cUdsb2JhbCkgJiYgKHF1YWxpZmllciAhPSBFdnFDb25zdCkpIHsKKyAgICAgICAgZXJyb3IobGluZSwgIiBjYW5ub3QgaW5pdGlhbGl6ZSB0aGlzIHR5cGUgb2YgcXVhbGlmaWVyICIsIHZhcmlhYmxlLT5nZXRUeXBlKCkuZ2V0UXVhbGlmaWVyU3RyaW5nKCksICIiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vCisgICAgLy8gdGVzdCBmb3IgYW5kIHByb3BhZ2F0ZSBjb25zdGFudAorICAgIC8vCisKKyAgICBpZiAocXVhbGlmaWVyID09IEV2cUNvbnN0KSB7CisgICAgICAgIGlmIChxdWFsaWZpZXIgIT0gaW5pdGlhbGl6ZXItPmdldFR5cGUoKS5nZXRRdWFsaWZpZXIoKSkgeworICAgICAgICAgICAgZXJyb3IobGluZSwgIiBhc3NpZ25pbmcgbm9uLWNvbnN0YW50IHRvIiwgIj0iLCAiJyVzJyIsIHZhcmlhYmxlLT5nZXRUeXBlKCkuZ2V0Q29tcGxldGVTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHZhcmlhYmxlLT5nZXRUeXBlKCkuc2V0UXVhbGlmaWVyKEV2cVRlbXBvcmFyeSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSAhPSBpbml0aWFsaXplci0+Z2V0VHlwZSgpKSB7CisgICAgICAgICAgICBlcnJvcihsaW5lLCAiIG5vbi1tYXRjaGluZyB0eXBlcyBmb3IgY29uc3QgaW5pdGlhbGl6ZXIgIiwgCisgICAgICAgICAgICAgICAgdmFyaWFibGUtPmdldFR5cGUoKS5nZXRRdWFsaWZpZXJTdHJpbmcoKSwgIiIpOworICAgICAgICAgICAgdmFyaWFibGUtPmdldFR5cGUoKS5zZXRRdWFsaWZpZXIoRXZxVGVtcG9yYXJ5KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpbml0aWFsaXplci0+Z2V0QXNDb25zdGFudFVuaW9uKCkpIHsgCisgICAgICAgICAgICBDb25zdGFudFVuaW9uKiB1bmlvbkFycmF5ID0gdmFyaWFibGUtPmdldENvbnN0UG9pbnRlcigpOworCisgICAgICAgICAgICBpZiAodHlwZS5nZXRPYmplY3RTaXplKCkgPT0gMSAmJiB0eXBlLmdldEJhc2ljVHlwZSgpICE9IEVidFN0cnVjdCkgeworICAgICAgICAgICAgICAgICp1bmlvbkFycmF5ID0gKGluaXRpYWxpemVyLT5nZXRBc0NvbnN0YW50VW5pb24oKS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKSlbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5zaGFyZUNvbnN0UG9pbnRlcihpbml0aWFsaXplci0+Z2V0QXNDb25zdGFudFVuaW9uKCktPmdldFVuaW9uQXJyYXlQb2ludGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyLT5nZXRBc1N5bWJvbE5vZGUoKSkgeworICAgICAgICAgICAgY29uc3QgVFN5bWJvbCogc3ltYm9sID0gc3ltYm9sVGFibGUuZmluZChpbml0aWFsaXplci0+Z2V0QXNTeW1ib2xOb2RlKCktPmdldFN5bWJvbCgpKTsKKyAgICAgICAgICAgIGNvbnN0IFRWYXJpYWJsZSogdFZhciA9IHN0YXRpY19jYXN0PGNvbnN0IFRWYXJpYWJsZSo+KHN5bWJvbCk7CisKKyAgICAgICAgICAgIENvbnN0YW50VW5pb24qIGNvbnN0QXJyYXkgPSB0VmFyLT5nZXRDb25zdFBvaW50ZXIoKTsKKyAgICAgICAgICAgIHZhcmlhYmxlLT5zaGFyZUNvbnN0UG9pbnRlcihjb25zdEFycmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVycm9yKGxpbmUsICIgY2Fubm90IGFzc2lnbiB0byIsICI9IiwgIiclcyciLCB2YXJpYWJsZS0+Z2V0VHlwZSgpLmdldENvbXBsZXRlU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICB2YXJpYWJsZS0+Z2V0VHlwZSgpLnNldFF1YWxpZmllcihFdnFUZW1wb3JhcnkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgCisgICAgaWYgKHF1YWxpZmllciAhPSBFdnFDb25zdCkgeworICAgICAgICBUSW50ZXJtU3ltYm9sKiBpbnRlcm1TeW1ib2wgPSBpbnRlcm1lZGlhdGUuYWRkU3ltYm9sKHZhcmlhYmxlLT5nZXRVbmlxdWVJZCgpLCB2YXJpYWJsZS0+Z2V0TmFtZSgpLCB2YXJpYWJsZS0+Z2V0VHlwZSgpLCBsaW5lKTsKKyAgICAgICAgaW50ZXJtTm9kZSA9IGludGVybWVkaWF0ZS5hZGRBc3NpZ24oRU9wSW5pdGlhbGl6ZSwgaW50ZXJtU3ltYm9sLCBpbml0aWFsaXplciwgbGluZSk7CisgICAgICAgIGlmIChpbnRlcm1Ob2RlID09IDApIHsKKyAgICAgICAgICAgIGFzc2lnbkVycm9yKGxpbmUsICI9IiwgaW50ZXJtU3ltYm9sLT5nZXRDb21wbGV0ZVN0cmluZygpLCBpbml0aWFsaXplci0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSAKKyAgICAgICAgaW50ZXJtTm9kZSA9IDA7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVFBhcnNlQ29udGV4dDo6YXJlQWxsQ2hpbGRDb25zdChUSW50ZXJtQWdncmVnYXRlKiBhZ2dyTm9kZSkKK3sKKyAgICBBU1NFUlQoYWdnck5vZGUgIT0gTlVMTCk7CisgICAgaWYgKCFhZ2dyTm9kZS0+aXNDb25zdHJ1Y3RvcigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIGFsbENvbnN0YW50ID0gdHJ1ZTsKKworICAgIC8vIGNoZWNrIGlmIGFsbCB0aGUgY2hpbGQgbm9kZXMgYXJlIGNvbnN0YW50cyBzbyB0aGF0IHRoZXkgY2FuIGJlIGluc2VydGVkIGludG8gCisgICAgLy8gdGhlIHBhcmVudCBub2RlCisgICAgVEludGVybVNlcXVlbmNlICZzZXF1ZW5jZSA9IGFnZ3JOb2RlLT5nZXRTZXF1ZW5jZSgpIDsKKyAgICBmb3IgKFRJbnRlcm1TZXF1ZW5jZTo6aXRlcmF0b3IgcCA9IHNlcXVlbmNlLmJlZ2luKCk7IHAgIT0gc2VxdWVuY2UuZW5kKCk7ICsrcCkgeworICAgICAgICBpZiAoISgqcCktPmdldEFzVHlwZWQoKS0+Z2V0QXNDb25zdGFudFVuaW9uKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGFsbENvbnN0YW50OworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdGVzdCBmb3IgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB2YXJpb3VzIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucworLy8gYW5kIGFsc28gY29udmVydCB0aGVtIHRvIHRoZSByaWdodCBkYXRhdHlwZSBpZiBpdCBpcyBhbGxvd2VkIGFuZCByZXF1aXJlZC4gCisvLworLy8gUmV0dXJucyAwIGZvciBhbiBlcnJvciBvciB0aGUgY29uc3RydWN0ZWQgbm9kZSAoYWdncmVnYXRlIG9yIHR5cGVkKSBmb3Igbm8gZXJyb3IuCisvLworVEludGVybVR5cGVkKiBUUGFyc2VDb250ZXh0OjphZGRDb25zdHJ1Y3RvcihUSW50ZXJtTm9kZSogbm9kZSwgY29uc3QgVFR5cGUqIHR5cGUsIFRPcGVyYXRvciBvcCwgVEZ1bmN0aW9uKiBmbkNhbGwsIFRTb3VyY2VMb2MgbGluZSkKK3sKKyAgICBpZiAobm9kZSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFRJbnRlcm1BZ2dyZWdhdGUqIGFnZ3JOb2RlID0gbm9kZS0+Z2V0QXNBZ2dyZWdhdGUoKTsKKyAgICAKKyAgICBUVHlwZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIG1lbWJlclR5cGVzOworICAgIGlmIChvcCA9PSBFT3BDb25zdHJ1Y3RTdHJ1Y3QpCisgICAgICAgIG1lbWJlclR5cGVzID0gdHlwZS0+Z2V0U3RydWN0KCktPmJlZ2luKCk7CisgICAgCisgICAgVFR5cGUgZWxlbWVudFR5cGUgPSAqdHlwZTsKKyAgICBpZiAodHlwZS0+aXNBcnJheSgpKQorICAgICAgICBlbGVtZW50VHlwZS5jbGVhckFycmF5bmVzcygpOworCisgICAgYm9vbCBzaW5nbGVBcmc7CisgICAgaWYgKGFnZ3JOb2RlKSB7CisgICAgICAgIGlmIChhZ2dyTm9kZS0+Z2V0T3AoKSAhPSBFT3BOdWxsIHx8IGFnZ3JOb2RlLT5nZXRTZXF1ZW5jZSgpLnNpemUoKSA9PSAxKQorICAgICAgICAgICAgc2luZ2xlQXJnID0gdHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2luZ2xlQXJnID0gZmFsc2U7CisgICAgfSBlbHNlCisgICAgICAgIHNpbmdsZUFyZyA9IHRydWU7CisKKyAgICBUSW50ZXJtVHlwZWQgKm5ld05vZGU7CisgICAgaWYgKHNpbmdsZUFyZykgeworICAgICAgICAvLyBJZiBzdHJ1Y3R1cmUgY29uc3RydWN0b3Igb3IgYXJyYXkgY29uc3RydWN0b3IgaXMgYmVpbmcgY2FsbGVkIAorICAgICAgICAvLyBmb3Igb25seSBvbmUgcGFyYW1ldGVyIGluc2lkZSB0aGUgc3RydWN0dXJlLCB3ZSBuZWVkIHRvIGNhbGwgY29uc3RydWN0U3RydWN0IGZ1bmN0aW9uIG9uY2UuCisgICAgICAgIGlmICh0eXBlLT5pc0FycmF5KCkpCisgICAgICAgICAgICBuZXdOb2RlID0gY29uc3RydWN0U3RydWN0KG5vZGUsICZlbGVtZW50VHlwZSwgMSwgbm9kZS0+Z2V0TGluZSgpLCBmYWxzZSk7CisgICAgICAgIGVsc2UgaWYgKG9wID09IEVPcENvbnN0cnVjdFN0cnVjdCkKKyAgICAgICAgICAgIG5ld05vZGUgPSBjb25zdHJ1Y3RTdHJ1Y3Qobm9kZSwgKCptZW1iZXJUeXBlcykudHlwZSwgMSwgbm9kZS0+Z2V0TGluZSgpLCBmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5ld05vZGUgPSBjb25zdHJ1Y3RCdWlsdEluKHR5cGUsIG9wLCBub2RlLCBub2RlLT5nZXRMaW5lKCksIGZhbHNlKTsKKworICAgICAgICBpZiAobmV3Tm9kZSAmJiBuZXdOb2RlLT5nZXRBc0FnZ3JlZ2F0ZSgpKSB7CisgICAgICAgICAgICBUSW50ZXJtVHlwZWQqIGNvbnN0Q29uc3RydWN0b3IgPSBmb2xkQ29uc3RDb25zdHJ1Y3RvcihuZXdOb2RlLT5nZXRBc0FnZ3JlZ2F0ZSgpLCAqdHlwZSk7CisgICAgICAgICAgICBpZiAoY29uc3RDb25zdHJ1Y3RvcikKKyAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXdOb2RlOworICAgIH0KKyAgICAKKyAgICAvLworICAgIC8vIEhhbmRsZSBsaXN0IG9mIGFyZ3VtZW50cy4KKyAgICAvLworICAgIFRJbnRlcm1TZXF1ZW5jZSAmc2VxdWVuY2VWZWN0b3IgPSBhZ2dyTm9kZS0+Z2V0U2VxdWVuY2UoKSA7ICAgIC8vIFN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IKKyAgICAvLyBpZiB0aGUgc3RydWN0dXJlIGNvbnN0cnVjdG9yIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLCB0aGVuIGNvbnN0cnVjdAorICAgIC8vIGVhY2ggcGFyYW1ldGVyCisgICAgCisgICAgaW50IHBhcmFtQ291bnQgPSAwOyAgLy8ga2VlcHMgYSB0cmFjayBvZiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIG51bWJlciBiZWluZyBjaGVja2VkICAgIAorICAgIAorICAgIC8vIGZvciBlYWNoIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IgY2FsbCwgY2hlY2sgdG8gc2VlIGlmIHRoZSByaWdodCB0eXBlIGlzIHBhc3NlZCBvciBjb252ZXJ0IHRoZW0gCisgICAgLy8gdG8gdGhlIHJpZ2h0IHR5cGUgaWYgcG9zc2libGUgKGFuZCBhbGxvd2VkKS4KKyAgICAvLyBmb3Igc3RydWN0dXJlIGNvbnN0cnVjdG9ycywganVzdCBjaGVjayBpZiB0aGUgcmlnaHQgdHlwZSBpcyBwYXNzZWQsIG5vIGNvbnZlcnNpb24gaXMgYWxsb3dlZC4KKyAgICAKKyAgICBmb3IgKFRJbnRlcm1TZXF1ZW5jZTo6aXRlcmF0b3IgcCA9IHNlcXVlbmNlVmVjdG9yLmJlZ2luKCk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICE9IHNlcXVlbmNlVmVjdG9yLmVuZCgpOyBwKyssIHBhcmFtQ291bnQrKykgeworICAgICAgICBpZiAodHlwZS0+aXNBcnJheSgpKQorICAgICAgICAgICAgbmV3Tm9kZSA9IGNvbnN0cnVjdFN0cnVjdCgqcCwgJmVsZW1lbnRUeXBlLCBwYXJhbUNvdW50KzEsIG5vZGUtPmdldExpbmUoKSwgdHJ1ZSk7CisgICAgICAgIGVsc2UgaWYgKG9wID09IEVPcENvbnN0cnVjdFN0cnVjdCkKKyAgICAgICAgICAgIG5ld05vZGUgPSBjb25zdHJ1Y3RTdHJ1Y3QoKnAsIChtZW1iZXJUeXBlc1twYXJhbUNvdW50XSkudHlwZSwgcGFyYW1Db3VudCsxLCBub2RlLT5nZXRMaW5lKCksIHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuZXdOb2RlID0gY29uc3RydWN0QnVpbHRJbih0eXBlLCBvcCwgKnAsIG5vZGUtPmdldExpbmUoKSwgdHJ1ZSk7CisgICAgICAgIAorICAgICAgICBpZiAobmV3Tm9kZSkgeworICAgICAgICAgICAgKnAgPSBuZXdOb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgVEludGVybVR5cGVkKiBjb25zdHJ1Y3RvciA9IGludGVybWVkaWF0ZS5zZXRBZ2dyZWdhdGVPcGVyYXRvcihhZ2dyTm9kZSwgb3AsIGxpbmUpOworICAgIFRJbnRlcm1UeXBlZCogY29uc3RDb25zdHJ1Y3RvciA9IGZvbGRDb25zdENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yLT5nZXRBc0FnZ3JlZ2F0ZSgpLCAqdHlwZSk7CisgICAgaWYgKGNvbnN0Q29uc3RydWN0b3IpCisgICAgICAgIHJldHVybiBjb25zdENvbnN0cnVjdG9yOworCisgICAgcmV0dXJuIGNvbnN0cnVjdG9yOworfQorCitUSW50ZXJtVHlwZWQqIFRQYXJzZUNvbnRleHQ6OmZvbGRDb25zdENvbnN0cnVjdG9yKFRJbnRlcm1BZ2dyZWdhdGUqIGFnZ3JOb2RlLCBjb25zdCBUVHlwZSYgdHlwZSkKK3sKKyAgICBib29sIGNhbkJlRm9sZGVkID0gYXJlQWxsQ2hpbGRDb25zdChhZ2dyTm9kZSk7CisgICAgYWdnck5vZGUtPnNldFR5cGUodHlwZSk7CisgICAgaWYgKGNhbkJlRm9sZGVkKSB7CisgICAgICAgIGJvb2wgcmV0dXJuVmFsID0gZmFsc2U7CisgICAgICAgIENvbnN0YW50VW5pb24qIHVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblt0eXBlLmdldE9iamVjdFNpemUoKV07CisgICAgICAgIGlmIChhZ2dyTm9kZS0+Z2V0U2VxdWVuY2UoKS5zaXplKCkgPT0gMSkgIHsKKyAgICAgICAgICAgIHJldHVyblZhbCA9IGludGVybWVkaWF0ZS5wYXJzZUNvbnN0VHJlZShhZ2dyTm9kZS0+Z2V0TGluZSgpLCBhZ2dyTm9kZSwgdW5pb25BcnJheSwgYWdnck5vZGUtPmdldE9wKCksIHN5bWJvbFRhYmxlLCAgdHlwZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm5WYWwgPSBpbnRlcm1lZGlhdGUucGFyc2VDb25zdFRyZWUoYWdnck5vZGUtPmdldExpbmUoKSwgYWdnck5vZGUsIHVuaW9uQXJyYXksIGFnZ3JOb2RlLT5nZXRPcCgpLCBzeW1ib2xUYWJsZSwgIHR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXR1cm5WYWwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICByZXR1cm4gaW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgdHlwZSwgYWdnck5vZGUtPmdldExpbmUoKSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIEZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbi4gQ2FsbHMgYWRkVW5hcnlNYXRoIHdpdGggYXBwcm9wcmlhdGUgRU9wIHZhbHVlCisvLyBmb3IgdGhlIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IgKHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uKS4gRXNzZW50aWFsbHksIGl0IGNvbnZlcnRzCisvLyB0aGUgcGFyYW1ldGVyIHR5cGVzIGNvcnJlY3RseS4gSWYgYSBjb25zdHJ1Y3RvciBleHBlY3RzIGFuIGludCAobGlrZSBpdmVjMikgYW5kIGlzIHBhc3NlZCBhIAorLy8gZmxvYXQsIHRoZW4gZmxvYXQgaXMgY29udmVydGVkIHRvIGludC4KKy8vCisvLyBSZXR1cm5zIDAgZm9yIGFuIGVycm9yIG9yIHRoZSBjb25zdHJ1Y3RlZCBub2RlLgorLy8KK1RJbnRlcm1UeXBlZCogVFBhcnNlQ29udGV4dDo6Y29uc3RydWN0QnVpbHRJbihjb25zdCBUVHlwZSogdHlwZSwgVE9wZXJhdG9yIG9wLCBUSW50ZXJtTm9kZSogbm9kZSwgVFNvdXJjZUxvYyBsaW5lLCBib29sIHN1YnNldCkKK3sKKyAgICBUSW50ZXJtVHlwZWQqIG5ld05vZGU7CisgICAgVE9wZXJhdG9yIGJhc2ljT3A7CisKKyAgICAvLworICAgIC8vIEZpcnN0LCBjb252ZXJ0IHR5cGVzIGFzIG5lZWRlZC4KKyAgICAvLworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIEVPcENvbnN0cnVjdFZlYzI6CisgICAgY2FzZSBFT3BDb25zdHJ1Y3RWZWMzOgorICAgIGNhc2UgRU9wQ29uc3RydWN0VmVjNDoKKyAgICBjYXNlIEVPcENvbnN0cnVjdE1hdDI6CisgICAgY2FzZSBFT3BDb25zdHJ1Y3RNYXQzOgorICAgIGNhc2UgRU9wQ29uc3RydWN0TWF0NDoKKyAgICBjYXNlIEVPcENvbnN0cnVjdEZsb2F0OgorICAgICAgICBiYXNpY09wID0gRU9wQ29uc3RydWN0RmxvYXQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFT3BDb25zdHJ1Y3RJVmVjMjoKKyAgICBjYXNlIEVPcENvbnN0cnVjdElWZWMzOgorICAgIGNhc2UgRU9wQ29uc3RydWN0SVZlYzQ6CisgICAgY2FzZSBFT3BDb25zdHJ1Y3RJbnQ6CisgICAgICAgIGJhc2ljT3AgPSBFT3BDb25zdHJ1Y3RJbnQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFT3BDb25zdHJ1Y3RCVmVjMjoKKyAgICBjYXNlIEVPcENvbnN0cnVjdEJWZWMzOgorICAgIGNhc2UgRU9wQ29uc3RydWN0QlZlYzQ6CisgICAgY2FzZSBFT3BDb25zdHJ1Y3RCb29sOgorICAgICAgICBiYXNpY09wID0gRU9wQ29uc3RydWN0Qm9vbDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBlcnJvcihsaW5lLCAidW5zdXBwb3J0ZWQgY29uc3RydWN0aW9uIiwgIiIsICIiKTsKKyAgICAgICAgcmVjb3ZlcigpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBuZXdOb2RlID0gaW50ZXJtZWRpYXRlLmFkZFVuYXJ5TWF0aChiYXNpY09wLCBub2RlLCBub2RlLT5nZXRMaW5lKCksIHN5bWJvbFRhYmxlKTsKKyAgICBpZiAobmV3Tm9kZSA9PSAwKSB7CisgICAgICAgIGVycm9yKGxpbmUsICJjYW4ndCBjb252ZXJ0IiwgImNvbnN0cnVjdG9yIiwgIiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIE5vdywgaWYgdGhlcmUgc3RpbGwgaXNuJ3QgYW4gb3BlcmF0aW9uIHRvIGRvIHRoZSBjb25zdHJ1Y3Rpb24sIGFuZCB3ZSBuZWVkIG9uZSwgYWRkIG9uZS4KKyAgICAvLworICAgIAorICAgIC8vIE90aGVyd2lzZSwgc2tpcCBvdXQgZWFybHkuCisgICAgaWYgKHN1YnNldCB8fCAobmV3Tm9kZSAhPSBub2RlICYmIG5ld05vZGUtPmdldFR5cGUoKSA9PSAqdHlwZSkpCisgICAgICAgIHJldHVybiBuZXdOb2RlOworCisgICAgLy8gc2V0QWdncmVnYXRlT3BlcmF0b3Igd2lsbCBpbnNlcnQgYSBuZXcgbm9kZSBmb3IgdGhlIGNvbnN0cnVjdG9yLCBhcyBuZWVkZWQuCisgICAgcmV0dXJuIGludGVybWVkaWF0ZS5zZXRBZ2dyZWdhdGVPcGVyYXRvcihuZXdOb2RlLCBvcCwgbGluZSk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gdGVzdHMgZm9yIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzdHJ1Y3R1cmVzIGNvbnN0cnVjdG9ycy4gUmFpc2VzCisvLyBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBleHBlY3RlZCB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKy8vCisvLyBSZXR1cm5zIDAgZm9yIGFuIGVycm9yIG9yIHRoZSBpbnB1dCBub2RlIGl0c2VsZiBpZiB0aGUgZXhwZWN0ZWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXIgdHlwZXMgbWF0Y2guCisvLworVEludGVybVR5cGVkKiBUUGFyc2VDb250ZXh0Ojpjb25zdHJ1Y3RTdHJ1Y3QoVEludGVybU5vZGUqIG5vZGUsIFRUeXBlKiB0eXBlLCBpbnQgcGFyYW1Db3VudCwgVFNvdXJjZUxvYyBsaW5lLCBib29sIHN1YnNldCkKK3sKKyAgICBpZiAoKnR5cGUgPT0gbm9kZS0+Z2V0QXNUeXBlZCgpLT5nZXRUeXBlKCkpIHsKKyAgICAgICAgaWYgKHN1YnNldCkKKyAgICAgICAgICAgIHJldHVybiBub2RlLT5nZXRBc1R5cGVkKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBpbnRlcm1lZGlhdGUuc2V0QWdncmVnYXRlT3BlcmF0b3Iobm9kZS0+Z2V0QXNUeXBlZCgpLCBFT3BDb25zdHJ1Y3RTdHJ1Y3QsIGxpbmUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVycm9yKGxpbmUsICIiLCAiY29uc3RydWN0b3IiLCAiY2Fubm90IGNvbnZlcnQgcGFyYW1ldGVyICVkIGZyb20gJyVzJyB0byAnJXMnIiwgcGFyYW1Db3VudCwKKyAgICAgICAgICAgICAgICBub2RlLT5nZXRBc1R5cGVkKCktPmdldFR5cGUoKS5nZXRCYXNpY1N0cmluZygpLCB0eXBlLT5nZXRCYXNpY1N0cmluZygpKTsKKyAgICAgICAgcmVjb3ZlcigpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvLworLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgdmVjdG9yIGZpZWxkKHMpIGJlaW5nIGFjY2Vzc2VkIGZyb20gY29udGFudCB2ZWN0b3IuCisvLyBJZiBvbmx5IG9uZSBjb21wb25lbnQgb2YgdmVjdG9yIGlzIGFjY2Vzc2VkICh2Lnggb3IgdlswXSB3aGVyZSB2IGlzIGEgY29udGFudCB2ZWN0b3IpLCB0aGVuIGEgY29udGFudCBub2RlIGlzCisvLyByZXR1cm5lZCwgZWxzZSBhbiBhZ2dyZWdhdGUgbm9kZSBpcyByZXR1cm5lZCAoZm9yIHYueHkpLiBUaGUgaW5wdXQgdG8gdGhpcyBmdW5jdGlvbiBjb3VsZCBlaXRoZXIgYmUgdGhlIHN5bWJvbAorLy8gbm9kZSBvciBpdCBjb3VsZCBiZSB0aGUgaW50ZXJtZWRpYXRlIHRyZWUgcmVwcmVzZW50YXRpb24gb2YgYWNjZXNzaW5nIGZpZWxkcyBpbiBhIGNvbnN0YW50IHN0cnVjdHVyZSBvciBjb2x1bW4gb2YgCisvLyBhIGNvbnN0YW50IG1hdHJpeC4KKy8vCitUSW50ZXJtVHlwZWQqIFRQYXJzZUNvbnRleHQ6OmFkZENvbnN0VmVjdG9yTm9kZShUVmVjdG9yRmllbGRzJiBmaWVsZHMsIFRJbnRlcm1UeXBlZCogbm9kZSwgVFNvdXJjZUxvYyBsaW5lKQoreworICAgIFRJbnRlcm1UeXBlZCogdHlwZWROb2RlOworICAgIFRJbnRlcm1Db25zdGFudFVuaW9uKiB0ZW1wQ29uc3RhbnROb2RlID0gbm9kZS0+Z2V0QXNDb25zdGFudFVuaW9uKCk7CisKKyAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5OworICAgIGlmICh0ZW1wQ29uc3RhbnROb2RlKSB7CisgICAgICAgIHVuaW9uQXJyYXkgPSB0ZW1wQ29uc3RhbnROb2RlLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpOworCisgICAgICAgIGlmICghdW5pb25BcnJheSkgeyAgLy8gdGhpcyBlcnJvciBtZXNzYWdlIHNob3VsZCBuZXZlciBiZSByYWlzZWQKKyAgICAgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkNvbnN0YW50VW5pb24gbm90IGluaXRpYWxpemVkIGluIGFkZENvbnN0VmVjdG9yTm9kZSBmdW5jdGlvbiIsIGxpbmUpOworICAgICAgICAgICAgcmVjb3ZlcigpOworCisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIFRoZSBub2RlIGhhcyB0byBiZSBlaXRoZXIgYSBzeW1ib2wgbm9kZSBvciBhbiBhZ2dyZWdhdGUgbm9kZSBvciBhIHRlbXBDb25zdGFudCBub2RlLCBlbHNlLCBpdHMgYW4gZXJyb3IKKyAgICAgICAgZXJyb3IobGluZSwgIkNhbm5vdCBvZmZzZXQgaW50byB0aGUgdmVjdG9yIiwgIkVycm9yIiwgIiIpOworICAgICAgICByZWNvdmVyKCk7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQ29uc3RhbnRVbmlvbiogY29uc3RBcnJheSA9IG5ldyBDb25zdGFudFVuaW9uW2ZpZWxkcy5udW1dOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubnVtOyBpKyspIHsKKyAgICAgICAgaWYgKGZpZWxkcy5vZmZzZXRzW2ldID49IG5vZGUtPmdldFR5cGUoKS5nZXRPYmplY3RTaXplKCkpIHsKKyAgICAgICAgICAgIGVycm9yKGxpbmUsICIiLCAiWyIsICJ2ZWN0b3IgZmllbGQgc2VsZWN0aW9uIG91dCBvZiByYW5nZSAnJWQnIiwgZmllbGRzLm9mZnNldHNbaV0pOworICAgICAgICAgICAgcmVjb3ZlcigpOworICAgICAgICAgICAgZmllbGRzLm9mZnNldHNbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjb25zdEFycmF5W2ldID0gdW5pb25BcnJheVtmaWVsZHMub2Zmc2V0c1tpXV07CisKKyAgICB9IAorICAgIHR5cGVkTm9kZSA9IGludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKGNvbnN0QXJyYXksIG5vZGUtPmdldFR5cGUoKSwgbGluZSk7CisgICAgcmV0dXJuIHR5cGVkTm9kZTsKK30KKworLy8KKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sdW1uIGJlaW5nIGFjY2Vzc2VkIGZyb20gYSBjb25zdGFudCBtYXRyaXguIFRoZSB2YWx1ZXMgYXJlIHJldHJpZXZlZCBmcm9tCisvLyB0aGUgc3ltYm9sIHRhYmxlIGFuZCBwYXJzZS10cmVlIGlzIGJ1aWx0IGZvciBhIHZlY3RvciAoZWFjaCBjb2x1bW4gb2YgYSBtYXRyaXggaXMgYSB2ZWN0b3IpLiBUaGUgaW5wdXQgCisvLyB0byB0aGUgZnVuY3Rpb24gY291bGQgZWl0aGVyIGJlIGEgc3ltYm9sIG5vZGUgKG1bMF0gd2hlcmUgbSBpcyBhIGNvbnN0YW50IG1hdHJpeCl0aGF0IHJlcHJlc2VudHMgYSAKKy8vIGNvbnN0YW50IG1hdHJpeCBvciBpdCBjb3VsZCBiZSB0aGUgdHJlZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RhbnQgbWF0cml4IChzLm0xWzBdIHdoZXJlIHMgaXMgYSBjb25zdGFudCBzdHJ1Y3R1cmUpCisvLworVEludGVybVR5cGVkKiBUUGFyc2VDb250ZXh0OjphZGRDb25zdE1hdHJpeE5vZGUoaW50IGluZGV4LCBUSW50ZXJtVHlwZWQqIG5vZGUsIFRTb3VyY2VMb2MgbGluZSkKK3sKKyAgICBUSW50ZXJtVHlwZWQqIHR5cGVkTm9kZTsKKyAgICBUSW50ZXJtQ29uc3RhbnRVbmlvbiogdGVtcENvbnN0YW50Tm9kZSA9IG5vZGUtPmdldEFzQ29uc3RhbnRVbmlvbigpOworCisgICAgaWYgKGluZGV4ID49IG5vZGUtPmdldFR5cGUoKS5nZXROb21pbmFsU2l6ZSgpKSB7CisgICAgICAgIGVycm9yKGxpbmUsICIiLCAiWyIsICJtYXRyaXggZmllbGQgc2VsZWN0aW9uIG91dCBvZiByYW5nZSAnJWQnIiwgaW5kZXgpOworICAgICAgICByZWNvdmVyKCk7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICB9CisKKyAgICBpZiAodGVtcENvbnN0YW50Tm9kZSkgeworICAgICAgICAgQ29uc3RhbnRVbmlvbiogdW5pb25BcnJheSA9IHRlbXBDb25zdGFudE5vZGUtPmdldFVuaW9uQXJyYXlQb2ludGVyKCk7CisgICAgICAgICBpbnQgc2l6ZSA9IHRlbXBDb25zdGFudE5vZGUtPmdldFR5cGUoKS5nZXROb21pbmFsU2l6ZSgpOworICAgICAgICAgdHlwZWROb2RlID0gaW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24oJnVuaW9uQXJyYXlbc2l6ZSppbmRleF0sIHRlbXBDb25zdGFudE5vZGUtPmdldFR5cGUoKSwgbGluZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyb3IobGluZSwgIkNhbm5vdCBvZmZzZXQgaW50byB0aGUgbWF0cml4IiwgIkVycm9yIiwgIiIpOworICAgICAgICByZWNvdmVyKCk7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIHR5cGVkTm9kZTsKK30KKworCisvLworLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVsZW1lbnQgb2YgYW4gYXJyYXkgYWNjZXNzZWQgZnJvbSBhIGNvbnN0YW50IGFycmF5LiBUaGUgdmFsdWVzIGFyZSByZXRyaWV2ZWQgZnJvbQorLy8gdGhlIHN5bWJvbCB0YWJsZSBhbmQgcGFyc2UtdHJlZSBpcyBidWlsdCBmb3IgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuIFRoZSBpbnB1dCAKKy8vIHRvIHRoZSBmdW5jdGlvbiBjb3VsZCBlaXRoZXIgYmUgYSBzeW1ib2wgbm9kZSAoYVswXSB3aGVyZSBhIGlzIGEgY29uc3RhbnQgYXJyYXkpdGhhdCByZXByZXNlbnRzIGEgCisvLyBjb25zdGFudCBhcnJheSBvciBpdCBjb3VsZCBiZSB0aGUgdHJlZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RhbnQgYXJyYXkgKHMuYTFbMF0gd2hlcmUgcyBpcyBhIGNvbnN0YW50IHN0cnVjdHVyZSkKKy8vCitUSW50ZXJtVHlwZWQqIFRQYXJzZUNvbnRleHQ6OmFkZENvbnN0QXJyYXlOb2RlKGludCBpbmRleCwgVEludGVybVR5cGVkKiBub2RlLCBUU291cmNlTG9jIGxpbmUpCit7CisgICAgVEludGVybVR5cGVkKiB0eXBlZE5vZGU7CisgICAgVEludGVybUNvbnN0YW50VW5pb24qIHRlbXBDb25zdGFudE5vZGUgPSBub2RlLT5nZXRBc0NvbnN0YW50VW5pb24oKTsKKyAgICBUVHlwZSBhcnJheUVsZW1lbnRUeXBlID0gbm9kZS0+Z2V0VHlwZSgpOworICAgIGFycmF5RWxlbWVudFR5cGUuY2xlYXJBcnJheW5lc3MoKTsKKworICAgIGlmIChpbmRleCA+PSBub2RlLT5nZXRUeXBlKCkuZ2V0QXJyYXlTaXplKCkpIHsKKyAgICAgICAgZXJyb3IobGluZSwgIiIsICJbIiwgImFycmF5IGZpZWxkIHNlbGVjdGlvbiBvdXQgb2YgcmFuZ2UgJyVkJyIsIGluZGV4KTsKKyAgICAgICAgcmVjb3ZlcigpOworICAgICAgICBpbmRleCA9IDA7CisgICAgfQorCisgICAgaW50IGFycmF5RWxlbWVudFNpemUgPSBhcnJheUVsZW1lbnRUeXBlLmdldE9iamVjdFNpemUoKTsKKworICAgIGlmICh0ZW1wQ29uc3RhbnROb2RlKSB7CisgICAgICAgICBDb25zdGFudFVuaW9uKiB1bmlvbkFycmF5ID0gdGVtcENvbnN0YW50Tm9kZS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKTsKKyAgICAgICAgIHR5cGVkTm9kZSA9IGludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKCZ1bmlvbkFycmF5W2FycmF5RWxlbWVudFNpemUgKiBpbmRleF0sIHRlbXBDb25zdGFudE5vZGUtPmdldFR5cGUoKSwgbGluZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyb3IobGluZSwgIkNhbm5vdCBvZmZzZXQgaW50byB0aGUgYXJyYXkiLCAiRXJyb3IiLCAiIik7CisgICAgICAgIHJlY292ZXIoKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gdHlwZWROb2RlOworfQorCisKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBmaWVsZCBpbnNpZGUgYSBjb25zdGFudCBzdHJ1Y3R1cmUgZnJvbSB0aGUgc3ltYm9sIHRhYmxlLiAKKy8vIElmIHRoZXJlIGlzIGFuIGVtYmVkZGVkL25lc3RlZCBzdHJ1Y3QsIGl0IGFwcHJvcHJpYXRlbHkgY2FsbHMgYWRkQ29uc3RTdHJ1Y3ROZXN0ZWQgb3IgYWRkQ29uc3RTdHJ1Y3RGcm9tQWdncgorLy8gZnVuY3Rpb24gYW5kIHJldHVybnMgdGhlIHBhcnNlLXRyZWUgd2l0aCB0aGUgdmFsdWVzIG9mIHRoZSBlbWJlZGRlZC9uZXN0ZWQgc3RydWN0LgorLy8KK1RJbnRlcm1UeXBlZCogVFBhcnNlQ29udGV4dDo6YWRkQ29uc3RTdHJ1Y3QoVFN0cmluZyYgaWRlbnRpZmllciwgVEludGVybVR5cGVkKiBub2RlLCBUU291cmNlTG9jIGxpbmUpCit7CisgICAgY29uc3QgVFR5cGVMaXN0KiBmaWVsZHMgPSBub2RlLT5nZXRUeXBlKCkuZ2V0U3RydWN0KCk7CisgICAgVEludGVybVR5cGVkICp0eXBlZE5vZGU7CisgICAgaW50IGluc3RhbmNlU2l6ZSA9IDA7CisgICAgdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKyAgICBUSW50ZXJtQ29uc3RhbnRVbmlvbiAqdGVtcENvbnN0YW50Tm9kZSA9IG5vZGUtPmdldEFzQ29uc3RhbnRVbmlvbigpOworCisgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGZpZWxkcy0+c2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAgIGlmICgoKmZpZWxkcylbaW5kZXhdLnR5cGUtPmdldEZpZWxkTmFtZSgpID09IGlkZW50aWZpZXIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5zdGFuY2VTaXplICs9ICgqZmllbGRzKVtpbmRleF0udHlwZS0+Z2V0T2JqZWN0U2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRlbXBDb25zdGFudE5vZGUpIHsKKyAgICAgICAgIENvbnN0YW50VW5pb24qIGNvbnN0QXJyYXkgPSB0ZW1wQ29uc3RhbnROb2RlLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpOworCisgICAgICAgICB0eXBlZE5vZGUgPSBpbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbihjb25zdEFycmF5K2luc3RhbmNlU2l6ZSwgdGVtcENvbnN0YW50Tm9kZS0+Z2V0VHlwZSgpLCBsaW5lKTsgLy8gdHlwZSB3aWxsIGJlIGNoYW5nZWQgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24KKyAgICB9IGVsc2UgeworICAgICAgICBlcnJvcihsaW5lLCAiQ2Fubm90IG9mZnNldCBpbnRvIHRoZSBzdHJ1Y3R1cmUiLCAiRXJyb3IiLCAiIik7CisgICAgICAgIHJlY292ZXIoKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gdHlwZWROb2RlOworfQorCisvLworLy8gUGFyc2UgYW4gYXJyYXkgb2Ygc3RyaW5ncyB1c2luZyB5eXBhcnNlLgorLy8KKy8vIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKy8vCitpbnQgUGFQYXJzZVN0cmluZ3MoaW50IGNvdW50LCBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdbXSwgY29uc3QgaW50IGxlbmd0aFtdLAorICAgICAgICAgICAgICAgICAgIFRQYXJzZUNvbnRleHQqIGNvbnRleHQpIHsKKyAgICBpZiAoKGNvdW50ID09IDApIHx8IChzdHJpbmcgPT0gTlVMTCkpCisgICAgICAgIHJldHVybiAxOworCisgICAgLy8gc2V0dXAgcHJlcHJvY2Vzc29yLgorICAgIGlmIChJbml0UHJlcHJvY2Vzc29yKCkpCisgICAgICAgIHJldHVybiAxOworICAgIERlZmluZUV4dGVuc2lvbk1hY3Jvcyhjb250ZXh0LT5leHRlbnNpb25CZWhhdmlvcik7CisKKyAgICBpZiAoZ2xzbGFuZ19pbml0aWFsaXplKGNvbnRleHQpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGdsc2xhbmdfc2Nhbihjb3VudCwgc3RyaW5nLCBsZW5ndGgsIGNvbnRleHQpOworICAgIGludCBlcnJvciA9IGdsc2xhbmdfcGFyc2UoY29udGV4dCk7CisKKyAgICBnbHNsYW5nX2ZpbmFsaXplKGNvbnRleHQpOworICAgIEZpbmFsaXplUHJlcHJvY2Vzc29yKCk7CisgICAgcmV0dXJuIChlcnJvciA9PSAwKSAmJiAoY29udGV4dC0+bnVtRXJyb3JzID09IDApID8gMCA6IDE7Cit9CisKK09TX1RMU0luZGV4IEdsb2JhbFBhcnNlQ29udGV4dEluZGV4ID0gT1NfSU5WQUxJRF9UTFNfSU5ERVg7CisKK2Jvb2wgSW5pdGlhbGl6ZVBhcnNlQ29udGV4dEluZGV4KCkKK3sKKyAgICBpZiAoR2xvYmFsUGFyc2VDb250ZXh0SW5kZXggIT0gT1NfSU5WQUxJRF9UTFNfSU5ERVgpIHsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkluaXRpYWxpemVQYXJzZUNvbnRleHRJbmRleCgpOiBQYXJzZSBDb250ZXh0IGFscmVhZHkgaW5pdGFsaXNlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBBbGxvY2F0ZSBhIFRMUyBpbmRleC4KKyAgICAvLworICAgIEdsb2JhbFBhcnNlQ29udGV4dEluZGV4ID0gT1NfQWxsb2NUTFNJbmRleCgpOworICAgIAorICAgIGlmIChHbG9iYWxQYXJzZUNvbnRleHRJbmRleCA9PSBPU19JTlZBTElEX1RMU19JTkRFWCkgeworICAgICAgICBhc3NlcnQoMCAmJiAiSW5pdGlhbGl6ZVBhcnNlQ29udGV4dEluZGV4KCk6IFBhcnNlIENvbnRleHQgYWxyZWFkeSBpbml0YWxpc2VkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGcmVlUGFyc2VDb250ZXh0SW5kZXgoKQoreworICAgIE9TX1RMU0luZGV4IHRsc2lJbmRleCA9IEdsb2JhbFBhcnNlQ29udGV4dEluZGV4OworCisgICAgaWYgKEdsb2JhbFBhcnNlQ29udGV4dEluZGV4ID09IE9TX0lOVkFMSURfVExTX0lOREVYKSB7CisgICAgICAgIGFzc2VydCgwICYmICJGcmVlUGFyc2VDb250ZXh0SW5kZXgoKTogUGFyc2UgQ29udGV4dCBpbmRleCBub3QgaW5pdGFsaXNlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgR2xvYmFsUGFyc2VDb250ZXh0SW5kZXggPSBPU19JTlZBTElEX1RMU19JTkRFWDsKKworICAgIHJldHVybiBPU19GcmVlVExTSW5kZXgodGxzaUluZGV4KTsKK30KKworYm9vbCBJbml0aWFsaXplR2xvYmFsUGFyc2VDb250ZXh0KCkKK3sKKyAgICBpZiAoR2xvYmFsUGFyc2VDb250ZXh0SW5kZXggPT0gT1NfSU5WQUxJRF9UTFNfSU5ERVgpIHsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkluaXRpYWxpemVHbG9iYWxQYXJzZUNvbnRleHQoKTogUGFyc2UgQ29udGV4dCBpbmRleCBub3QgaW5pdGFsaXNlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVFRocmVhZFBhcnNlQ29udGV4dCAqbHBQYXJzZUNvbnRleHQgPSBzdGF0aWNfY2FzdDxUVGhyZWFkUGFyc2VDb250ZXh0ICo+KE9TX0dldFRMU1ZhbHVlKEdsb2JhbFBhcnNlQ29udGV4dEluZGV4KSk7CisgICAgaWYgKGxwUGFyc2VDb250ZXh0ICE9IDApIHsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkluaXRpYWxpemVQYXJzZUNvbnRleHRJbmRleCgpOiBQYXJzZSBDb250ZXh0IGFscmVhZHkgaW5pdGFsaXNlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVFRocmVhZFBhcnNlQ29udGV4dCAqbHBUaHJlYWREYXRhID0gbmV3IFRUaHJlYWRQYXJzZUNvbnRleHQoKTsKKyAgICBpZiAobHBUaHJlYWREYXRhID09IDApIHsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkluaXRpYWxpemVHbG9iYWxQYXJzZUNvbnRleHQoKTogVW5hYmxlIHRvIGNyZWF0ZSB0aHJlYWQgcGFyc2UgY29udGV4dCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbHBUaHJlYWREYXRhLT5scEdsb2JhbFBhcnNlQ29udGV4dCA9IDA7CisgICAgT1NfU2V0VExTVmFsdWUoR2xvYmFsUGFyc2VDb250ZXh0SW5kZXgsIGxwVGhyZWFkRGF0YSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGcmVlUGFyc2VDb250ZXh0KCkKK3sKKyAgICBpZiAoR2xvYmFsUGFyc2VDb250ZXh0SW5kZXggPT0gT1NfSU5WQUxJRF9UTFNfSU5ERVgpIHsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkZyZWVQYXJzZUNvbnRleHQoKTogUGFyc2UgQ29udGV4dCBpbmRleCBub3QgaW5pdGFsaXNlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVFRocmVhZFBhcnNlQ29udGV4dCAqbHBQYXJzZUNvbnRleHQgPSBzdGF0aWNfY2FzdDxUVGhyZWFkUGFyc2VDb250ZXh0ICo+KE9TX0dldFRMU1ZhbHVlKEdsb2JhbFBhcnNlQ29udGV4dEluZGV4KSk7CisgICAgaWYgKGxwUGFyc2VDb250ZXh0KQorICAgICAgICBkZWxldGUgbHBQYXJzZUNvbnRleHQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVFBhcnNlQ29udGV4dFBvaW50ZXImIEdldEdsb2JhbFBhcnNlQ29udGV4dCgpCit7CisgICAgLy8KKyAgICAvLyBNaW5pbWFsIGVycm9yIGNoZWNraW5nIGZvciBzcGVlZAorICAgIC8vCisKKyAgICBUVGhyZWFkUGFyc2VDb250ZXh0ICpscFBhcnNlQ29udGV4dCA9IHN0YXRpY19jYXN0PFRUaHJlYWRQYXJzZUNvbnRleHQgKj4oT1NfR2V0VExTVmFsdWUoR2xvYmFsUGFyc2VDb250ZXh0SW5kZXgpKTsKKworICAgIHJldHVybiBscFBhcnNlQ29udGV4dC0+bHBHbG9iYWxQYXJzZUNvbnRleHQ7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1BhcnNlSGVscGVyLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9QYXJzZUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTZjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9QYXJzZUhlbHBlci5oCkBAIC0wLDAgKzEsMTE4IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworI2lmbmRlZiBfUEFSU0VSX0hFTFBFUl9JTkNMVURFRF8KKyNkZWZpbmUgX1BBUlNFUl9IRUxQRVJfSU5DTFVERURfCisKKyNpbmNsdWRlICJjb21waWxlci9FeHRlbnNpb25CZWhhdmlvci5oIgorI2luY2x1ZGUgImNvbXBpbGVyL2xvY2FsaW50ZXJtZWRpYXRlLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvU2hIYW5kbGUuaCIKKyNpbmNsdWRlICJjb21waWxlci9TeW1ib2xUYWJsZS5oIgorCitzdHJ1Y3QgVE1hdHJpeEZpZWxkcyB7CisgICAgYm9vbCB3aG9sZVJvdzsKKyAgICBib29sIHdob2xlQ29sOworICAgIGludCByb3c7CisgICAgaW50IGNvbDsKK307CisKK3N0cnVjdCBUUHJhZ21hIHsKKyAgICBUUHJhZ21hKGJvb2wgbywgYm9vbCBkKSA6IG9wdGltaXplKG8pLCBkZWJ1ZyhkKSB7IH0KKyAgICBib29sIG9wdGltaXplOworICAgIGJvb2wgZGVidWc7CisgICAgVFByYWdtYVRhYmxlIHByYWdtYVRhYmxlOworfTsKKworLy8KKy8vIFRoZSBmb2xsb3dpbmcgYXJlIGV4dHJhIHZhcmlhYmxlcyBuZWVkZWQgZHVyaW5nIHBhcnNpbmcsIGdyb3VwZWQgdG9nZXRoZXIgc28KKy8vIHRoZXkgY2FuIGJlIHBhc3NlZCB0byB0aGUgcGFyc2VyIHdpdGhvdXQgbmVlZGluZyBhIGdsb2JhbC4KKy8vCitzdHJ1Y3QgVFBhcnNlQ29udGV4dCB7CisgICAgVFBhcnNlQ29udGV4dChUU3ltYm9sVGFibGUmIHN5bXQsIGNvbnN0IFRFeHRlbnNpb25CZWhhdmlvciYgZXh0LCBUSW50ZXJtZWRpYXRlJiBpbnRlcm0sIFNoU2hhZGVyVHlwZSB0eXBlLCBTaFNoYWRlclNwZWMgc3BlYywgaW50IG9wdGlvbnMsIGNvbnN0IGNoYXIqIHNvdXJjZVBhdGgsIFRJbmZvU2luayYgaXMpIDoKKyAgICAgICAgICAgIGludGVybWVkaWF0ZShpbnRlcm0pLCBzeW1ib2xUYWJsZShzeW10KSwgZXh0ZW5zaW9uQmVoYXZpb3IoZXh0KSwgaW5mb1NpbmsoaXMpLCBzaGFkZXJUeXBlKHR5cGUpLCBzaGFkZXJTcGVjKHNwZWMpLCBjb21waWxlT3B0aW9ucyhvcHRpb25zKSwgc291cmNlUGF0aChzb3VyY2VQYXRoKSwgdHJlZVJvb3QoMCksCisgICAgICAgICAgICByZWNvdmVyZWRGcm9tRXJyb3IoZmFsc2UpLCBudW1FcnJvcnMoMCksIGxleEFmdGVyVHlwZShmYWxzZSksIGxvb3BOZXN0aW5nTGV2ZWwoMCksCisgICAgICAgICAgICBpblR5cGVQYXJlbihmYWxzZSksIHNjYW5uZXIoTlVMTCksIGNvbnRleHRQcmFnbWEodHJ1ZSwgZmFsc2UpIHsgIH0KKyAgICBUSW50ZXJtZWRpYXRlJiBpbnRlcm1lZGlhdGU7IC8vIHRvIGhvbGQgYW5kIGJ1aWxkIGEgcGFyc2UgdHJlZQorICAgIFRTeW1ib2xUYWJsZSYgc3ltYm9sVGFibGU7ICAgLy8gc3ltYm9sIHRhYmxlIHRoYXQgZ29lcyB3aXRoIHRoZSBsYW5ndWFnZSBjdXJyZW50bHkgYmVpbmcgcGFyc2VkCisgICAgVEV4dGVuc2lvbkJlaGF2aW9yIGV4dGVuc2lvbkJlaGF2aW9yOyAgLy8gbWFwcGluZyBiZXR3ZWVuIHN1cHBvcnRlZCBleHRlbnNpb25zIGFuZCBjdXJyZW50IGJlaGF2aW9yLgorICAgIFRJbmZvU2luayYgaW5mb1Npbms7CisgICAgU2hTaGFkZXJUeXBlIHNoYWRlclR5cGU7ICAgICAgICAgICAgICAvLyB2ZXJ0ZXggb3IgZnJhZ21lbnQgbGFuZ3VhZ2UgKGZ1dHVyZTogcGFjayBvciB1bnBhY2spCisgICAgU2hTaGFkZXJTcGVjIHNoYWRlclNwZWM7ICAgICAgICAgICAgICAvLyBUaGUgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiBjb21waWxlciBjb25mb3JtcyB0byAtIEdMRVMyIG9yIFdlYkdMLgorICAgIGludCBjb21waWxlT3B0aW9uczsKKyAgICBjb25zdCBjaGFyKiBzb3VyY2VQYXRoOyAgICAgIC8vIFBhdGggb2Ygc291cmNlIGZpbGUgb3IgTlVMTC4KKyAgICBUSW50ZXJtTm9kZSogdHJlZVJvb3Q7ICAgICAgIC8vIHJvb3Qgb2YgcGFyc2UgdHJlZSBiZWluZyBjcmVhdGVkCisgICAgYm9vbCByZWNvdmVyZWRGcm9tRXJyb3I7ICAgICAvLyB0cnVlIGlmIGEgcGFyc2UgZXJyb3IgaGFzIG9jY3VycmVkLCBidXQgd2UgY29udGludWUgdG8gcGFyc2UKKyAgICBpbnQgbnVtRXJyb3JzOworICAgIGJvb2wgbGV4QWZ0ZXJUeXBlOyAgICAgICAgICAgLy8gdHJ1ZSBpZiB3ZSd2ZSByZWNvZ25pemVkIGEgdHlwZSwgc28gY2FuIG9ubHkgYmUgbG9va2luZyBmb3IgYW4gaWRlbnRpZmllcgorICAgIGludCBsb29wTmVzdGluZ0xldmVsOyAgICAgICAgLy8gMCBpZiBvdXRzaWRlIGFsbCBsb29wcworICAgIGJvb2wgaW5UeXBlUGFyZW47ICAgICAgICAgICAgLy8gdHJ1ZSBpZiBpbiBwYXJlbnRoZXNlcywgbG9va2luZyBvbmx5IGZvciBhbiBpZGVudGlmaWVyCisgICAgY29uc3QgVFR5cGUqIGN1cnJlbnRGdW5jdGlvblR5cGU7ICAvLyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQncyBjdXJyZW50bHkgYmVpbmcgcGFyc2VkCisgICAgYm9vbCBmdW5jdGlvblJldHVybnNWYWx1ZTsgICAvLyB0cnVlIGlmIGEgbm9uLXZvaWQgZnVuY3Rpb24gaGFzIGEgcmV0dXJuCisKKyAgICB2b2lkIGVycm9yKFRTb3VyY2VMb2MgbG9jLCBjb25zdCBjaGFyICpyZWFzb24sIGNvbnN0IGNoYXIqIHRva2VuLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0cmFJbmZvRm9ybWF0LCAuLi4pOworICAgIHZvaWQgd2FybmluZyhUU291cmNlTG9jIGxvYywgY29uc3QgY2hhciogcmVhc29uLCBjb25zdCBjaGFyKiB0b2tlbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0cmFJbmZvRm9ybWF0LCAuLi4pOworICAgIGJvb2wgcmVzZXJ2ZWRFcnJvckNoZWNrKGludCBsaW5lLCBjb25zdCBUU3RyaW5nJiBpZGVudGlmaWVyKTsKKyAgICB2b2lkIHJlY292ZXIoKTsKKworICAgIGJvb2wgcGFyc2VWZWN0b3JGaWVsZHMoY29uc3QgVFN0cmluZyYsIGludCB2ZWNTaXplLCBUVmVjdG9yRmllbGRzJiwgaW50IGxpbmUpOworICAgIGJvb2wgcGFyc2VNYXRyaXhGaWVsZHMoY29uc3QgVFN0cmluZyYsIGludCBtYXRTaXplLCBUTWF0cml4RmllbGRzJiwgaW50IGxpbmUpOworICAgIHZvaWQgYXNzaWduRXJyb3IoaW50IGxpbmUsIGNvbnN0IGNoYXIqIG9wLCBUU3RyaW5nIGxlZnQsIFRTdHJpbmcgcmlnaHQpOworICAgIHZvaWQgdW5hcnlPcEVycm9yKGludCBsaW5lLCBjb25zdCBjaGFyKiBvcCwgVFN0cmluZyBvcGVyYW5kKTsKKyAgICB2b2lkIGJpbmFyeU9wRXJyb3IoaW50IGxpbmUsIGNvbnN0IGNoYXIqIG9wLCBUU3RyaW5nIGxlZnQsIFRTdHJpbmcgcmlnaHQpOworICAgIGJvb2wgcHJlY2lzaW9uRXJyb3JDaGVjayhpbnQgbGluZSwgVFByZWNpc2lvbiBwcmVjaXNpb24sIFRCYXNpY1R5cGUgdHlwZSk7CisgICAgYm9vbCBsVmFsdWVFcnJvckNoZWNrKGludCBsaW5lLCBjb25zdCBjaGFyKiBvcCwgVEludGVybVR5cGVkKik7CisgICAgYm9vbCBjb25zdEVycm9yQ2hlY2soVEludGVybVR5cGVkKiBub2RlKTsKKyAgICBib29sIGludGVnZXJFcnJvckNoZWNrKFRJbnRlcm1UeXBlZCogbm9kZSwgY29uc3QgY2hhciogdG9rZW4pOworICAgIGJvb2wgZ2xvYmFsRXJyb3JDaGVjayhpbnQgbGluZSwgYm9vbCBnbG9iYWwsIGNvbnN0IGNoYXIqIHRva2VuKTsKKyAgICBib29sIGNvbnN0cnVjdG9yRXJyb3JDaGVjayhpbnQgbGluZSwgVEludGVybU5vZGUqLCBURnVuY3Rpb24mLCBUT3BlcmF0b3IsIFRUeXBlKik7CisgICAgYm9vbCBhcnJheVNpemVFcnJvckNoZWNrKGludCBsaW5lLCBUSW50ZXJtVHlwZWQqIGV4cHIsIGludCYgc2l6ZSk7CisgICAgYm9vbCBhcnJheVF1YWxpZmllckVycm9yQ2hlY2soaW50IGxpbmUsIFRQdWJsaWNUeXBlIHR5cGUpOworICAgIGJvb2wgYXJyYXlUeXBlRXJyb3JDaGVjayhpbnQgbGluZSwgVFB1YmxpY1R5cGUgdHlwZSk7CisgICAgYm9vbCBhcnJheUVycm9yQ2hlY2soaW50IGxpbmUsIFRTdHJpbmcmIGlkZW50aWZpZXIsIFRQdWJsaWNUeXBlIHR5cGUsIFRWYXJpYWJsZSomIHZhcmlhYmxlKTsKKyAgICBib29sIHZvaWRFcnJvckNoZWNrKGludCwgY29uc3QgVFN0cmluZyYsIGNvbnN0IFRQdWJsaWNUeXBlJik7CisgICAgYm9vbCBib29sRXJyb3JDaGVjayhpbnQsIGNvbnN0IFRJbnRlcm1UeXBlZCopOworICAgIGJvb2wgYm9vbEVycm9yQ2hlY2soaW50LCBjb25zdCBUUHVibGljVHlwZSYpOworICAgIGJvb2wgc2FtcGxlckVycm9yQ2hlY2soaW50IGxpbmUsIGNvbnN0IFRQdWJsaWNUeXBlJiBwVHlwZSwgY29uc3QgY2hhciogcmVhc29uKTsKKyAgICBib29sIHN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soaW50IGxpbmUsIGNvbnN0IFRQdWJsaWNUeXBlJiBwVHlwZSk7CisgICAgYm9vbCBwYXJhbWV0ZXJTYW1wbGVyRXJyb3JDaGVjayhpbnQgbGluZSwgVFF1YWxpZmllciBxdWFsaWZpZXIsIGNvbnN0IFRUeXBlJiB0eXBlKTsKKyAgICBib29sIGNvbnRhaW5zU2FtcGxlcihUVHlwZSYgdHlwZSk7CisgICAgYm9vbCBub25Jbml0Q29uc3RFcnJvckNoZWNrKGludCBsaW5lLCBUU3RyaW5nJiBpZGVudGlmaWVyLCBUUHVibGljVHlwZSYgdHlwZSk7CisgICAgYm9vbCBub25Jbml0RXJyb3JDaGVjayhpbnQgbGluZSwgVFN0cmluZyYgaWRlbnRpZmllciwgVFB1YmxpY1R5cGUmIHR5cGUsIFRWYXJpYWJsZSomIHZhcmlhYmxlKTsKKyAgICBib29sIHBhcmFtRXJyb3JDaGVjayhpbnQgbGluZSwgVFF1YWxpZmllciBxdWFsaWZpZXIsIFRRdWFsaWZpZXIgcGFyYW1RdWFsaWZpZXIsIFRUeXBlKiB0eXBlKTsKKyAgICBib29sIGV4dGVuc2lvbkVycm9yQ2hlY2soaW50IGxpbmUsIGNvbnN0IFRTdHJpbmcmKTsKKyAgICBjb25zdCBURnVuY3Rpb24qIGZpbmRGdW5jdGlvbihpbnQgbGluZSwgVEZ1bmN0aW9uKiBwZm5DYWxsLCBib29sICpidWlsdEluID0gMCk7CisgICAgYm9vbCBleGVjdXRlSW5pdGlhbGl6ZXIoVFNvdXJjZUxvYyBsaW5lLCBUU3RyaW5nJiBpZGVudGlmaWVyLCBUUHVibGljVHlwZSYgcFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEludGVybVR5cGVkKiBpbml0aWFsaXplciwgVEludGVybU5vZGUqJiBpbnRlcm1Ob2RlLCBUVmFyaWFibGUqIHZhcmlhYmxlID0gMCk7CisgICAgYm9vbCBhcmVBbGxDaGlsZENvbnN0KFRJbnRlcm1BZ2dyZWdhdGUqIGFnZ3JOb2RlKTsKKyAgICBUSW50ZXJtVHlwZWQqIGFkZENvbnN0cnVjdG9yKFRJbnRlcm1Ob2RlKiwgY29uc3QgVFR5cGUqLCBUT3BlcmF0b3IsIFRGdW5jdGlvbiosIFRTb3VyY2VMb2MpOworICAgIFRJbnRlcm1UeXBlZCogZm9sZENvbnN0Q29uc3RydWN0b3IoVEludGVybUFnZ3JlZ2F0ZSogYWdnck5vZGUsIGNvbnN0IFRUeXBlJiB0eXBlKTsKKyAgICBUSW50ZXJtVHlwZWQqIGNvbnN0cnVjdFN0cnVjdChUSW50ZXJtTm9kZSosIFRUeXBlKiwgaW50LCBUU291cmNlTG9jLCBib29sIHN1YnNldCk7CisgICAgVEludGVybVR5cGVkKiBjb25zdHJ1Y3RCdWlsdEluKGNvbnN0IFRUeXBlKiwgVE9wZXJhdG9yLCBUSW50ZXJtTm9kZSosIFRTb3VyY2VMb2MsIGJvb2wgc3Vic2V0KTsKKyAgICBUSW50ZXJtVHlwZWQqIGFkZENvbnN0VmVjdG9yTm9kZShUVmVjdG9yRmllbGRzJiwgVEludGVybVR5cGVkKiwgVFNvdXJjZUxvYyk7CisgICAgVEludGVybVR5cGVkKiBhZGRDb25zdE1hdHJpeE5vZGUoaW50ICwgVEludGVybVR5cGVkKiwgVFNvdXJjZUxvYyk7CisgICAgVEludGVybVR5cGVkKiBhZGRDb25zdEFycmF5Tm9kZShpbnQgaW5kZXgsIFRJbnRlcm1UeXBlZCogbm9kZSwgVFNvdXJjZUxvYyBsaW5lKTsKKyAgICBUSW50ZXJtVHlwZWQqIGFkZENvbnN0U3RydWN0KFRTdHJpbmcmICwgVEludGVybVR5cGVkKiwgVFNvdXJjZUxvYyk7CisgICAgYm9vbCBhcnJheVNldE1heFNpemUoVEludGVybVN5bWJvbCosIFRUeXBlKiwgaW50LCBib29sLCBUU291cmNlTG9jKTsKKyAgICB2b2lkKiBzY2FubmVyOworICAgIHN0cnVjdCBUUHJhZ21hIGNvbnRleHRQcmFnbWE7CisgICAgVFN0cmluZyBIYXNoRXJyTXNnOworICAgIGJvb2wgQWZ0ZXJFT0Y7Cit9OworCitpbnQgUGFQYXJzZVN0cmluZ3MoaW50IGNvdW50LCBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdbXSwgY29uc3QgaW50IGxlbmd0aFtdLAorICAgICAgICAgICAgICAgICAgIFRQYXJzZUNvbnRleHQqIGNvbnRleHQpOworCit0eXBlZGVmIFRQYXJzZUNvbnRleHQqIFRQYXJzZUNvbnRleHRQb2ludGVyOworZXh0ZXJuIFRQYXJzZUNvbnRleHRQb2ludGVyJiBHZXRHbG9iYWxQYXJzZUNvbnRleHQoKTsKKyNkZWZpbmUgR2xvYmFsUGFyc2VDb250ZXh0IEdldEdsb2JhbFBhcnNlQ29udGV4dCgpCisKK3R5cGVkZWYgc3RydWN0IFRUaHJlYWRQYXJzZUNvbnRleHRSZWMKK3sKKyAgICBUUGFyc2VDb250ZXh0ICpscEdsb2JhbFBhcnNlQ29udGV4dDsKK30gVFRocmVhZFBhcnNlQ29udGV4dDsKKworI2VuZGlmIC8vIF9QQVJTRVJfSEVMUEVSX0lOQ0xVREVEXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvUG9vbEFsbG9jLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1Bvb2xBbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4NmM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1Bvb2xBbGxvYy5jcHAKQEAgLTAsMCArMSwzMDQgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9Qb29sQWxsb2MuaCIKKworI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImNvbXBpbGVyL0luaXRpYWxpemVHbG9iYWxzLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvb3NpbmNsdWRlLmgiCisKK09TX1RMU0luZGV4IFBvb2xJbmRleCA9IE9TX0lOVkFMSURfVExTX0lOREVYOworCit2b2lkIEluaXRpYWxpemVHbG9iYWxQb29scygpCit7CisgICAgVFRocmVhZEdsb2JhbFBvb2xzKiBnbG9iYWxQb29scz0gc3RhdGljX2Nhc3Q8VFRocmVhZEdsb2JhbFBvb2xzKj4oT1NfR2V0VExTVmFsdWUoUG9vbEluZGV4KSk7ICAgIAorICAgIGlmIChnbG9iYWxQb29scykKKyAgICAgICAgcmV0dXJuOworCisgICAgVFRocmVhZEdsb2JhbFBvb2xzKiB0aHJlYWREYXRhID0gbmV3IFRUaHJlYWRHbG9iYWxQb29scygpOworICAgIHRocmVhZERhdGEtPmdsb2JhbFBvb2xBbGxvY2F0b3IgPSAwOworCisgICAgT1NfU2V0VExTVmFsdWUoUG9vbEluZGV4LCB0aHJlYWREYXRhKTsKK30KKwordm9pZCBGcmVlR2xvYmFsUG9vbHMoKQoreworICAgIC8vIFJlbGVhc2UgdGhlIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoaXMgdGhyZWFkLgorICAgIFRUaHJlYWRHbG9iYWxQb29scyogZ2xvYmFsUG9vbHM9IHN0YXRpY19jYXN0PFRUaHJlYWRHbG9iYWxQb29scyo+KE9TX0dldFRMU1ZhbHVlKFBvb2xJbmRleCkpOyAgICAKKyAgICBpZiAoIWdsb2JhbFBvb2xzKQorICAgICAgICByZXR1cm47CisgCisgICAgZGVsZXRlIGdsb2JhbFBvb2xzOworfQorCitib29sIEluaXRpYWxpemVQb29sSW5kZXgoKQoreworICAgIC8vIEFsbG9jYXRlIGEgVExTIGluZGV4LgorICAgIGlmICgoUG9vbEluZGV4ID0gT1NfQWxsb2NUTFNJbmRleCgpKSA9PSBPU19JTlZBTElEX1RMU19JTkRFWCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRnJlZVBvb2xJbmRleCgpCit7CisgICAgLy8gUmVsZWFzZSB0aGUgVExTIGluZGV4LgorICAgIE9TX0ZyZWVUTFNJbmRleChQb29sSW5kZXgpOworfQorCitUUG9vbEFsbG9jYXRvciYgR2V0R2xvYmFsUG9vbEFsbG9jYXRvcigpCit7CisgICAgVFRocmVhZEdsb2JhbFBvb2xzKiB0aHJlYWREYXRhID0gc3RhdGljX2Nhc3Q8VFRocmVhZEdsb2JhbFBvb2xzKj4oT1NfR2V0VExTVmFsdWUoUG9vbEluZGV4KSk7CisKKyAgICByZXR1cm4gKnRocmVhZERhdGEtPmdsb2JhbFBvb2xBbGxvY2F0b3I7Cit9CisKK3ZvaWQgU2V0R2xvYmFsUG9vbEFsbG9jYXRvcihUUG9vbEFsbG9jYXRvciogcG9vbEFsbG9jYXRvcikKK3sKKyAgICBUVGhyZWFkR2xvYmFsUG9vbHMqIHRocmVhZERhdGEgPSBzdGF0aWNfY2FzdDxUVGhyZWFkR2xvYmFsUG9vbHMqPihPU19HZXRUTFNWYWx1ZShQb29sSW5kZXgpKTsKKworICAgIHRocmVhZERhdGEtPmdsb2JhbFBvb2xBbGxvY2F0b3IgPSBwb29sQWxsb2NhdG9yOworfQorCisvLworLy8gSW1wbGVtZW50IHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBUUG9vbEFsbG9jYXRvciBjbGFzcywgd2hpY2gKKy8vIGlzIGRvY3VtZW50ZWQgaW4gUG9vbEFsbG9jLmguCisvLworVFBvb2xBbGxvY2F0b3I6OlRQb29sQWxsb2NhdG9yKGludCBncm93dGhJbmNyZW1lbnQsIGludCBhbGxvY2F0aW9uQWxpZ25tZW50KSA6IAorICAgIHBhZ2VTaXplKGdyb3d0aEluY3JlbWVudCksCisgICAgYWxpZ25tZW50KGFsbG9jYXRpb25BbGlnbm1lbnQpLAorICAgIGZyZWVMaXN0KDApLAorICAgIGluVXNlTGlzdCgwKSwKKyAgICBudW1DYWxscygwKSwKKyAgICB0b3RhbEJ5dGVzKDApCit7CisgICAgLy8KKyAgICAvLyBEb24ndCBhbGxvdyBwYWdlIHNpemVzIHdlIGtub3cgYXJlIHNtYWxsZXIgdGhhbiBhbGwgY29tbW9uCisgICAgLy8gT1MgcGFnZSBzaXplcy4KKyAgICAvLworICAgIGlmIChwYWdlU2l6ZSA8IDQqMTAyNCkKKyAgICAgICAgcGFnZVNpemUgPSA0KjEwMjQ7CisKKyAgICAvLworICAgIC8vIEEgbGFyZ2UgY3VycmVudFBhZ2VPZmZzZXQgaW5kaWNhdGVzIGEgbmV3IHBhZ2UgbmVlZHMgdG8KKyAgICAvLyBiZSBvYnRhaW5lZCB0byBhbGxvY2F0ZSBtZW1vcnkuCisgICAgLy8KKyAgICBjdXJyZW50UGFnZU9mZnNldCA9IHBhZ2VTaXplOworCisgICAgLy8KKyAgICAvLyBBZGp1c3QgYWxpZ25tZW50IHRvIGJlIGF0IGxlYXN0IHBvaW50ZXIgYWxpZ25lZCBhbmQKKyAgICAvLyBwb3dlciBvZiAyLgorICAgIC8vCisgICAgc2l6ZV90IG1pbkFsaWduID0gc2l6ZW9mKHZvaWQqKTsKKyAgICBhbGlnbm1lbnQgJj0gfihtaW5BbGlnbiAtIDEpOworICAgIGlmIChhbGlnbm1lbnQgPCBtaW5BbGlnbikKKyAgICAgICAgYWxpZ25tZW50ID0gbWluQWxpZ247CisgICAgc2l6ZV90IGEgPSAxOworICAgIHdoaWxlIChhIDwgYWxpZ25tZW50KQorICAgICAgICBhIDw8PSAxOworICAgIGFsaWdubWVudCA9IGE7CisgICAgYWxpZ25tZW50TWFzayA9IGEgLSAxOworCisgICAgLy8KKyAgICAvLyBBbGlnbiBoZWFkZXIgc2tpcAorICAgIC8vCisgICAgaGVhZGVyU2tpcCA9IG1pbkFsaWduOworICAgIGlmIChoZWFkZXJTa2lwIDwgc2l6ZW9mKHRIZWFkZXIpKSB7CisgICAgICAgIGhlYWRlclNraXAgPSAoc2l6ZW9mKHRIZWFkZXIpICsgYWxpZ25tZW50TWFzaykgJiB+YWxpZ25tZW50TWFzazsKKyAgICB9Cit9CisKK1RQb29sQWxsb2NhdG9yOjp+VFBvb2xBbGxvY2F0b3IoKQoreworICAgIHdoaWxlIChpblVzZUxpc3QpIHsKKyAgICAgICAgdEhlYWRlciogbmV4dCA9IGluVXNlTGlzdC0+bmV4dFBhZ2U7CisgICAgICAgIGluVXNlTGlzdC0+fnRIZWFkZXIoKTsKKyAgICAgICAgZGVsZXRlIFtdIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGluVXNlTGlzdCk7CisgICAgICAgIGluVXNlTGlzdCA9IG5leHQ7CisgICAgfQorCisgICAgLy8gV2Ugc2hvdWxkIG5vdCBjaGVjayB0aGUgZ3VhcmQgYmxvY2tzCisgICAgLy8gaGVyZSwgYmVjYXVzZSB3ZSBkaWQgaXQgYWxyZWFkeSB3aGVuIHRoZSBibG9jayB3YXMKKyAgICAvLyBwbGFjZWQgaW50byB0aGUgZnJlZSBsaXN0LgorICAgIC8vCisgICAgd2hpbGUgKGZyZWVMaXN0KSB7CisgICAgICAgIHRIZWFkZXIqIG5leHQgPSBmcmVlTGlzdC0+bmV4dFBhZ2U7CisgICAgICAgIGRlbGV0ZSBbXSByZWludGVycHJldF9jYXN0PGNoYXIqPihmcmVlTGlzdCk7CisgICAgICAgIGZyZWVMaXN0ID0gbmV4dDsKKyAgICB9Cit9CisKKy8vIFN1cHBvcnQgTVNWQysrIDYuMAorY29uc3QgdW5zaWduZWQgY2hhciBUQWxsb2NhdGlvbjo6Z3VhcmRCbG9ja0JlZ2luVmFsID0gMHhmYjsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgVEFsbG9jYXRpb246Omd1YXJkQmxvY2tFbmRWYWwgICA9IDB4ZmU7Citjb25zdCB1bnNpZ25lZCBjaGFyIFRBbGxvY2F0aW9uOjp1c2VyRGF0YUZpbGwgICAgICAgPSAweGNkOworCisjaWZkZWYgR1VBUkRfQkxPQ0tTCisgICAgY29uc3Qgc2l6ZV90IFRBbGxvY2F0aW9uOjpndWFyZEJsb2NrU2l6ZSA9IDE2OworI2Vsc2UKKyAgICBjb25zdCBzaXplX3QgVEFsbG9jYXRpb246Omd1YXJkQmxvY2tTaXplID0gMDsKKyNlbmRpZgorCisvLworLy8gQ2hlY2sgYSBzaW5nbGUgZ3VhcmQgYmxvY2sgZm9yIGRhbWFnZQorLy8KK3ZvaWQgVEFsbG9jYXRpb246OmNoZWNrR3VhcmRCbG9jayh1bnNpZ25lZCBjaGFyKiBibG9ja01lbSwgdW5zaWduZWQgY2hhciB2YWwsIGNvbnN0IGNoYXIqIGxvY1RleHQpIGNvbnN0Cit7CisjaWZkZWYgR1VBUkRfQkxPQ0tTCisgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBndWFyZEJsb2NrU2l6ZTsgeCsrKSB7CisgICAgICAgIGlmIChibG9ja01lbVt4XSAhPSB2YWwpIHsKKyAgICAgICAgICAgIGNoYXIgYXNzZXJ0TXNnWzgwXTsKKworICAgICAgICAgICAgLy8gV2UgZG9uJ3QgcHJpbnQgdGhlIGFzc2VydCBtZXNzYWdlLiAgSXQncyBoZXJlIGp1c3QgdG8gYmUgaGVscGZ1bC4KKyAgICAgICAgICAgIHNwcmludGYoYXNzZXJ0TXNnLCAiUG9vbEFsbG9jOiBEYW1hZ2UgJXMgJWx1IGJ5dGUgYWxsb2NhdGlvbiBhdCAweCVwXG4iLAorICAgICAgICAgICAgICAgICAgICBsb2NUZXh0LCBzaXplLCBkYXRhKCkpOworICAgICAgICAgICAgYXNzZXJ0KDAgJiYgIlBvb2xBbGxvYzogRGFtYWdlIGluIGd1YXJkIGJsb2NrIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworCit2b2lkIFRQb29sQWxsb2NhdG9yOjpwdXNoKCkKK3sKKyAgICB0QWxsb2NTdGF0ZSBzdGF0ZSA9IHsgY3VycmVudFBhZ2VPZmZzZXQsIGluVXNlTGlzdCB9OworCisgICAgc3RhY2sucHVzaF9iYWNrKHN0YXRlKTsKKyAgICAgICAgCisgICAgLy8KKyAgICAvLyBJbmRpY2F0ZSB0aGVyZSBpcyBubyBjdXJyZW50IHBhZ2UgdG8gYWxsb2NhdGUgZnJvbS4KKyAgICAvLworICAgIGN1cnJlbnRQYWdlT2Zmc2V0ID0gcGFnZVNpemU7Cit9CisKKy8vCisvLyBEbyBhIG1hc3MtZGVhbGxvY2F0aW9uIG9mIGFsbCB0aGUgaW5kaXZpZHVhbCBhbGxvY2F0aW9ucworLy8gdGhhdCBoYXZlIG9jY3VycmVkIHNpbmNlIHRoZSBsYXN0IHB1c2goKSwgb3Igc2luY2UgdGhlCisvLyBsYXN0IHBvcCgpLCBvciBzaW5jZSB0aGUgb2JqZWN0J3MgY3JlYXRpb24uCisvLworLy8gVGhlIGRlYWxsb2NhdGVkIHBhZ2VzIGFyZSBzYXZlZCBmb3IgZnV0dXJlIGFsbG9jYXRpb25zLgorLy8KK3ZvaWQgVFBvb2xBbGxvY2F0b3I6OnBvcCgpCit7CisgICAgaWYgKHN0YWNrLnNpemUoKSA8IDEpCisgICAgICAgIHJldHVybjsKKworICAgIHRIZWFkZXIqIHBhZ2UgPSBzdGFjay5iYWNrKCkucGFnZTsKKyAgICBjdXJyZW50UGFnZU9mZnNldCA9IHN0YWNrLmJhY2soKS5vZmZzZXQ7CisKKyAgICB3aGlsZSAoaW5Vc2VMaXN0ICE9IHBhZ2UpIHsKKyAgICAgICAgLy8gaW52b2tlIGRlc3RydWN0b3IgdG8gZnJlZSBhbGxvY2F0aW9uIGxpc3QKKyAgICAgICAgaW5Vc2VMaXN0LT5+dEhlYWRlcigpOworICAgICAgICAKKyAgICAgICAgdEhlYWRlciogbmV4dEluVXNlID0gaW5Vc2VMaXN0LT5uZXh0UGFnZTsKKyAgICAgICAgaWYgKGluVXNlTGlzdC0+cGFnZUNvdW50ID4gMSkKKyAgICAgICAgICAgIGRlbGV0ZSBbXSByZWludGVycHJldF9jYXN0PGNoYXIqPihpblVzZUxpc3QpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluVXNlTGlzdC0+bmV4dFBhZ2UgPSBmcmVlTGlzdDsKKyAgICAgICAgICAgIGZyZWVMaXN0ID0gaW5Vc2VMaXN0OworICAgICAgICB9CisgICAgICAgIGluVXNlTGlzdCA9IG5leHRJblVzZTsKKyAgICB9CisKKyAgICBzdGFjay5wb3BfYmFjaygpOworfQorCisvLworLy8gRG8gYSBtYXNzLWRlYWxsb2NhdGlvbiBvZiBhbGwgdGhlIGluZGl2aWR1YWwgYWxsb2NhdGlvbnMKKy8vIHRoYXQgaGF2ZSBvY2N1cnJlZC4KKy8vCit2b2lkIFRQb29sQWxsb2NhdG9yOjpwb3BBbGwoKQoreworICAgIHdoaWxlIChzdGFjay5zaXplKCkgPiAwKQorICAgICAgICBwb3AoKTsKK30KKwordm9pZCogVFBvb2xBbGxvY2F0b3I6OmFsbG9jYXRlKHNpemVfdCBudW1CeXRlcykKK3sKKyAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgZ3VhcmQgYmxvY2tzLCBhbGwgYWxsb2NhdGlvbnMgYXJlIGJyYWNrZXRlZCBieQorICAgIC8vIHRoZW06IFtndWFyZGJsb2NrXVthbGxvY2F0aW9uXVtndWFyZGJsb2NrXS4gIG51bUJ5dGVzIGlzIGhvdworICAgIC8vIG11Y2ggbWVtb3J5IHRoZSBjYWxsZXIgYXNrZWQgZm9yLiAgYWxsb2NhdGlvblNpemUgaXMgdGhlIHRvdGFsCisgICAgLy8gc2l6ZSBpbmNsdWRpbmcgZ3VhcmQgYmxvY2tzLiAgSW4gcmVsZWFzZSBidWlsZCwKKyAgICAvLyBndWFyZEJsb2NrU2l6ZT0wIGFuZCB0aGlzIGFsbCBnZXRzIG9wdGltaXplZCBhd2F5LgorICAgIHNpemVfdCBhbGxvY2F0aW9uU2l6ZSA9IFRBbGxvY2F0aW9uOjphbGxvY2F0aW9uU2l6ZShudW1CeXRlcyk7CisgICAgCisgICAgLy8KKyAgICAvLyBKdXN0IGtlZXAgc29tZSBpbnRlcmVzdGluZyBzdGF0aXN0aWNzLgorICAgIC8vCisgICAgKytudW1DYWxsczsKKyAgICB0b3RhbEJ5dGVzICs9IG51bUJ5dGVzOworCisgICAgLy8KKyAgICAvLyBEbyB0aGUgYWxsb2NhdGlvbiwgbW9zdCBsaWtlbHkgY2FzZSBmaXJzdCwgZm9yIGVmZmljaWVuY3kuCisgICAgLy8gVGhpcyBzdGVwIGNvdWxkIGJlIG1vdmVkIHRvIGJlIGlubGluZSBzb21ldGltZS4KKyAgICAvLworICAgIGlmIChjdXJyZW50UGFnZU9mZnNldCArIGFsbG9jYXRpb25TaXplIDw9IHBhZ2VTaXplKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNhZmUgdG8gYWxsb2NhdGUgZnJvbSBjdXJyZW50UGFnZU9mZnNldC4KKyAgICAgICAgLy8KKyAgICAgICAgdW5zaWduZWQgY2hhciogbWVtb3J5ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyICo+KGluVXNlTGlzdCkgKyBjdXJyZW50UGFnZU9mZnNldDsKKyAgICAgICAgY3VycmVudFBhZ2VPZmZzZXQgKz0gYWxsb2NhdGlvblNpemU7CisgICAgICAgIGN1cnJlbnRQYWdlT2Zmc2V0ID0gKGN1cnJlbnRQYWdlT2Zmc2V0ICsgYWxpZ25tZW50TWFzaykgJiB+YWxpZ25tZW50TWFzazsKKworICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZUFsbG9jYXRpb24oaW5Vc2VMaXN0LCBtZW1vcnksIG51bUJ5dGVzKTsKKyAgICB9CisKKyAgICBpZiAoYWxsb2NhdGlvblNpemUgKyBoZWFkZXJTa2lwID4gcGFnZVNpemUpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG8gYSBtdWx0aS1wYWdlIGFsbG9jYXRpb24uICBEb24ndCBtaXggdGhlc2Ugd2l0aCB0aGUgb3RoZXJzLgorICAgICAgICAvLyBUaGUgT1MgaXMgZWZmaWNpZW50IGFuZCBhbGxvY2F0aW5nIGFuZCBmcmVlLWluZyBtdWx0aXBsZSBwYWdlcy4KKyAgICAgICAgLy8KKyAgICAgICAgc2l6ZV90IG51bUJ5dGVzVG9BbGxvYyA9IGFsbG9jYXRpb25TaXplICsgaGVhZGVyU2tpcDsKKyAgICAgICAgdEhlYWRlciogbWVtb3J5ID0gcmVpbnRlcnByZXRfY2FzdDx0SGVhZGVyKj4oOjpuZXcgY2hhcltudW1CeXRlc1RvQWxsb2NdKTsKKyAgICAgICAgaWYgKG1lbW9yeSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gVXNlIHBsYWNlbWVudC1uZXcgdG8gaW5pdGlhbGl6ZSBoZWFkZXIKKyAgICAgICAgbmV3KG1lbW9yeSkgdEhlYWRlcihpblVzZUxpc3QsIChudW1CeXRlc1RvQWxsb2MgKyBwYWdlU2l6ZSAtIDEpIC8gcGFnZVNpemUpOworICAgICAgICBpblVzZUxpc3QgPSBtZW1vcnk7CisKKyAgICAgICAgY3VycmVudFBhZ2VPZmZzZXQgPSBwYWdlU2l6ZTsgIC8vIG1ha2UgbmV4dCBhbGxvY2F0aW9uIGNvbWUgZnJvbSBhIG5ldyBwYWdlCisKKyAgICAgICAgLy8gTm8gZ3VhcmQgYmxvY2tzIGZvciBtdWx0aS1wYWdlIGFsbG9jYXRpb25zICh5ZXQpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4obWVtb3J5KSArIGhlYWRlclNraXApOworICAgIH0KKworICAgIC8vCisgICAgLy8gTmVlZCBhIHNpbXBsZSBwYWdlIHRvIGFsbG9jYXRlIGZyb20uCisgICAgLy8KKyAgICB0SGVhZGVyKiBtZW1vcnk7CisgICAgaWYgKGZyZWVMaXN0KSB7CisgICAgICAgIG1lbW9yeSA9IGZyZWVMaXN0OworICAgICAgICBmcmVlTGlzdCA9IGZyZWVMaXN0LT5uZXh0UGFnZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1vcnkgPSByZWludGVycHJldF9jYXN0PHRIZWFkZXIqPig6Om5ldyBjaGFyW3BhZ2VTaXplXSk7CisgICAgICAgIGlmIChtZW1vcnkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFVzZSBwbGFjZW1lbnQtbmV3IHRvIGluaXRpYWxpemUgaGVhZGVyCisgICAgbmV3KG1lbW9yeSkgdEhlYWRlcihpblVzZUxpc3QsIDEpOworICAgIGluVXNlTGlzdCA9IG1lbW9yeTsKKyAgICAKKyAgICB1bnNpZ25lZCBjaGFyKiByZXQgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIgKj4oaW5Vc2VMaXN0KSArIGhlYWRlclNraXA7CisgICAgY3VycmVudFBhZ2VPZmZzZXQgPSAoaGVhZGVyU2tpcCArIGFsbG9jYXRpb25TaXplICsgYWxpZ25tZW50TWFzaykgJiB+YWxpZ25tZW50TWFzazsKKworICAgIHJldHVybiBpbml0aWFsaXplQWxsb2NhdGlvbihpblVzZUxpc3QsIHJldCwgbnVtQnl0ZXMpOworfQorCisKKy8vCisvLyBDaGVjayBhbGwgYWxsb2NhdGlvbnMgaW4gYSBsaXN0IGZvciBkYW1hZ2UgYnkgY2FsbGluZyBjaGVjayBvbiBlYWNoLgorLy8KK3ZvaWQgVEFsbG9jYXRpb246OmNoZWNrQWxsb2NMaXN0KCkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IFRBbGxvY2F0aW9uKiBhbGxvYyA9IHRoaXM7IGFsbG9jICE9IDA7IGFsbG9jID0gYWxsb2MtPnByZXZBbGxvYykKKyAgICAgICAgYWxsb2MtPmNoZWNrKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Qb29sQWxsb2MuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1Bvb2xBbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTA5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9Qb29sQWxsb2MuaApAQCAtMCwwICsxLDMwMCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2lmbmRlZiBfUE9PTEFMTE9DX0lOQ0xVREVEXworI2RlZmluZSBfUE9PTEFMTE9DX0lOQ0xVREVEXworCisjaWZkZWYgX0RFQlVHCisjZGVmaW5lIEdVQVJEX0JMT0NLUyAgLy8gZGVmaW5lIHRvIGVuYWJsZSBndWFyZCBibG9jayBzYW5pdHkgY2hlY2tpbmcKKyNlbmRpZgorCisvLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBhbiBhbGxvY2F0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBlZmZpY2llbnRseQorLy8gYWxsb2NhdGUgYSBsYXJnZSBudW1iZXIgb2Ygc21hbGwgcmVxdWVzdHMgZm9yIGhlYXAgbWVtb3J5LCB3aXRoIHRoZSAKKy8vIGludGVudGlvbiB0aGF0IHRoZXkgYXJlIG5vdCBpbmRpdmlkdWFsbHkgZGVhbGxvY2F0ZWQsIGJ1dCByYXRoZXIgCisvLyBjb2xsZWN0aXZlbHkgZGVhbGxvY2F0ZWQgYXQgb25lIHRpbWUuCisvLworLy8gVGhpcyBzaW11bHRhbmVvdXNseQorLy8KKy8vICogTWFrZXMgZWFjaCBpbmRpdmlkdWFsIGFsbG9jYXRpb24gbXVjaCBtb3JlIGVmZmljaWVudDsgdGhlCisvLyAgICAgdHlwaWNhbCBhbGxvY2F0aW9uIGlzIHRyaXZpYWwuCisvLyAqIENvbXBsZXRlbHkgYXZvaWRzIHRoZSBjb3N0IG9mIGRvaW5nIGluZGl2aWR1YWwgZGVhbGxvY2F0aW9uLgorLy8gKiBTYXZlcyB0aGUgdHJvdWJsZSBvZiB0cmFja2luZyBkb3duIGFuZCBwbHVnZ2luZyBhIGxhcmdlIGNsYXNzIG9mIGxlYWtzLgorLy8KKy8vIEluZGl2aWR1YWwgY2xhc3NlcyBjYW4gdXNlIHRoaXMgYWxsb2NhdG9yIGJ5IHN1cHBseWluZyB0aGVpciBvd24KKy8vIG5ldyBhbmQgZGVsZXRlIG1ldGhvZHMuCisvLworLy8gU1RMIGNvbnRhaW5lcnMgY2FuIHVzZSB0aGlzIGFsbG9jYXRvciBieSB1c2luZyB0aGUgcG9vbF9hbGxvY2F0b3IKKy8vIGNsYXNzIGFzIHRoZSBhbGxvY2F0b3IgKHNlY29uZCkgdGVtcGxhdGUgYXJndW1lbnQuCisvLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBJZiB3ZSBhcmUgdXNpbmcgZ3VhcmQgYmxvY2tzLCB3ZSBtdXN0IHRyYWNrIGVhY2ggaW5kaXZ1YWwKKy8vIGFsbG9jYXRpb24uICBJZiB3ZSBhcmVuJ3QgdXNpbmcgZ3VhcmQgYmxvY2tzLCB0aGVzZQorLy8gbmV2ZXIgZ2V0IGluc3RhbnRpYXRlZCwgc28gd29uJ3QgaGF2ZSBhbnkgaW1wYWN0LgorLy8gCisKK2NsYXNzIFRBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICBUQWxsb2NhdGlvbihzaXplX3Qgc2l6ZSwgdW5zaWduZWQgY2hhciogbWVtLCBUQWxsb2NhdGlvbiogcHJldiA9IDApIDoKKyAgICAgICAgc2l6ZShzaXplKSwgbWVtKG1lbSksIHByZXZBbGxvYyhwcmV2KSB7CisgICAgICAgIC8vIEFsbG9jYXRpb25zIGFyZSBicmFja2V0ZWQ6CisgICAgICAgIC8vICAgIFthbGxvY2F0aW9uSGVhZGVyXVtpbml0aWFsR3VhcmRCbG9ja11bdXNlckRhdGFdW2ZpbmFsR3VhcmRCbG9ja10KKyAgICAgICAgLy8gVGhpcyB3b3VsZCBiZSBjbGVhbmVyIHdpdGggaWYgKGd1YXJkQmxvY2tTaXplKS4uLiwgYnV0IHRoYXQKKyAgICAgICAgLy8gbWFrZXMgdGhlIGNvbXBpbGVyIHByaW50IHdhcm5pbmdzIGFib3V0IDAgbGVuZ3RoIG1lbXNldHMsCisgICAgICAgIC8vIGV2ZW4gd2l0aCB0aGUgaWYoKSBwcm90ZWN0aW5nIHRoZW0uCisjaWZkZWYgR1VBUkRfQkxPQ0tTCisgICAgICAgIG1lbXNldChwcmVHdWFyZCgpLCBndWFyZEJsb2NrQmVnaW5WYWwsIGd1YXJkQmxvY2tTaXplKTsKKyAgICAgICAgbWVtc2V0KGRhdGEoKSwgICAgICB1c2VyRGF0YUZpbGwsICAgICAgIHNpemUpOworICAgICAgICBtZW1zZXQocG9zdEd1YXJkKCksIGd1YXJkQmxvY2tFbmRWYWwsICAgZ3VhcmRCbG9ja1NpemUpOworI2VuZGlmCisgICAgfQorCisgICAgdm9pZCBjaGVjaygpIGNvbnN0IHsKKyAgICAgICAgY2hlY2tHdWFyZEJsb2NrKHByZUd1YXJkKCksICBndWFyZEJsb2NrQmVnaW5WYWwsICJiZWZvcmUiKTsKKyAgICAgICAgY2hlY2tHdWFyZEJsb2NrKHBvc3RHdWFyZCgpLCBndWFyZEJsb2NrRW5kVmFsLCAgICJhZnRlciIpOworICAgIH0KKworICAgIHZvaWQgY2hlY2tBbGxvY0xpc3QoKSBjb25zdDsKKworICAgIC8vIFJldHVybiB0b3RhbCBzaXplIG5lZWRlZCB0byBhY2NvbW9kYXRlIHVzZXIgYnVmZmVyIG9mICdzaXplJywKKyAgICAvLyBwbHVzIG91ciB0cmFja2luZyBkYXRhLgorICAgIGlubGluZSBzdGF0aWMgc2l6ZV90IGFsbG9jYXRpb25TaXplKHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBzaXplICsgMiAqIGd1YXJkQmxvY2tTaXplICsgaGVhZGVyU2l6ZSgpOworICAgIH0KKworICAgIC8vIE9mZnNldCBmcm9tIHN1cnJvdW5kaW5nIGJ1ZmZlciB0byBnZXQgdG8gdXNlciBkYXRhIGJ1ZmZlci4KKyAgICBpbmxpbmUgc3RhdGljIHVuc2lnbmVkIGNoYXIqIG9mZnNldEFsbG9jYXRpb24odW5zaWduZWQgY2hhciogbSkgeworICAgICAgICByZXR1cm4gbSArIGd1YXJkQmxvY2tTaXplICsgaGVhZGVyU2l6ZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGNoZWNrR3VhcmRCbG9jayh1bnNpZ25lZCBjaGFyKiBibG9ja01lbSwgdW5zaWduZWQgY2hhciB2YWwsIGNvbnN0IGNoYXIqIGxvY1RleHQpIGNvbnN0OworCisgICAgLy8gRmluZCBvZmZzZXRzIHRvIHByZSBhbmQgcG9zdCBndWFyZCBibG9ja3MsIGFuZCB1c2VyIGRhdGEgYnVmZmVyCisgICAgdW5zaWduZWQgY2hhciogcHJlR3VhcmQoKSAgY29uc3QgeyByZXR1cm4gbWVtICsgaGVhZGVyU2l6ZSgpOyB9CisgICAgdW5zaWduZWQgY2hhciogZGF0YSgpICAgICAgY29uc3QgeyByZXR1cm4gcHJlR3VhcmQoKSArIGd1YXJkQmxvY2tTaXplOyB9CisgICAgdW5zaWduZWQgY2hhciogcG9zdEd1YXJkKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpICsgc2l6ZTsgfQorCisgICAgc2l6ZV90IHNpemU7ICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBvZiB0aGUgdXNlciBkYXRhIGFyZWEKKyAgICB1bnNpZ25lZCBjaGFyKiBtZW07ICAgICAgICAgICAvLyBiZWdpbm5pbmcgb2Ygb3VyIGFsbG9jYXRpb24gKHB0cyB0byBoZWFkZXIpCisgICAgVEFsbG9jYXRpb24qIHByZXZBbGxvYzsgICAgICAgLy8gcHJpb3IgYWxsb2NhdGlvbiBpbiB0aGUgY2hhaW4KKworICAgIC8vIFN1cHBvcnQgTVNWQysrIDYuMAorICAgIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBjaGFyIGd1YXJkQmxvY2tCZWdpblZhbDsKKyAgICBjb25zdCBzdGF0aWMgdW5zaWduZWQgY2hhciBndWFyZEJsb2NrRW5kVmFsOworICAgIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBjaGFyIHVzZXJEYXRhRmlsbDsKKworICAgIGNvbnN0IHN0YXRpYyBzaXplX3QgZ3VhcmRCbG9ja1NpemU7CisjaWZkZWYgR1VBUkRfQkxPQ0tTCisgICAgaW5saW5lIHN0YXRpYyBzaXplX3QgaGVhZGVyU2l6ZSgpIHsgcmV0dXJuIHNpemVvZihUQWxsb2NhdGlvbik7IH0KKyNlbHNlCisgICAgaW5saW5lIHN0YXRpYyBzaXplX3QgaGVhZGVyU2l6ZSgpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorfTsKKworLy8KKy8vIFRoZXJlIGFyZSBzZXZlcmFsIHN0YWNrcy4gIE9uZSBpcyB0byB0cmFjayB0aGUgcHVzaGluZyBhbmQgcG9wcGluZworLy8gb2YgdGhlIHVzZXIsIGFuZCBub3QgeWV0IGltcGxlbWVudGVkLiAgVGhlIG90aGVycyBhcmUgc2ltcGx5IGEgCisvLyByZXBvc2l0b3JpZXMgb2YgZnJlZSBwYWdlcyBvciB1c2VkIHBhZ2VzLgorLy8KKy8vIFBhZ2Ugc3RhY2tzIGFyZSBsaW5rZWQgdG9nZXRoZXIgd2l0aCBhIHNpbXBsZSBoZWFkZXIgYXQgdGhlIGJlZ2lubmluZworLy8gb2YgZWFjaCBhbGxvY2F0aW9uIG9idGFpbmVkIGZyb20gdGhlIHVuZGVybHlpbmcgT1MuICBNdWx0aS1wYWdlIGFsbG9jYXRpb25zCisvLyBhcmUgcmV0dXJuZWQgdG8gdGhlIE9TLiAgSW5kaXZpZHVhbCBwYWdlIGFsbG9jYXRpb25zIGFyZSBrZXB0IGZvciBmdXR1cmUKKy8vIHJlLXVzZS4KKy8vCisvLyBUaGUgInBhZ2Ugc2l6ZSIgdXNlZCBpcyBub3QsIG5vciBtdXN0IGl0IG1hdGNoLCB0aGUgdW5kZXJseWluZyBPUworLy8gcGFnZSBzaXplLiAgQnV0LCBoYXZpbmcgaXQgYmUgYWJvdXQgdGhhdCBzaXplIG9yIGVxdWFsIHRvIGEgc2V0IG9mIAorLy8gcGFnZXMgaXMgbGlrZWx5IG1vc3Qgb3B0aW1hbC4KKy8vCitjbGFzcyBUUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgVFBvb2xBbGxvY2F0b3IoaW50IGdyb3d0aEluY3JlbWVudCA9IDgqMTAyNCwgaW50IGFsbG9jYXRpb25BbGlnbm1lbnQgPSAxNik7CisKKyAgICAvLworICAgIC8vIERvbid0IGNhbGwgdGhlIGRlc3RydWN0b3IganVzdCB0byBmcmVlIHVwIHRoZSBtZW1vcnksIGNhbGwgcG9wKCkKKyAgICAvLworICAgIH5UUG9vbEFsbG9jYXRvcigpOworCisgICAgLy8KKyAgICAvLyBDYWxsIHB1c2goKSB0byBlc3RhYmxpc2ggYSBuZXcgcGxhY2UgdG8gcG9wIG1lbW9yeSB0b28uICBEb2VzIG5vdAorICAgIC8vIGhhdmUgdG8gYmUgY2FsbGVkIHRvIGdldCB0aGluZ3Mgc3RhcnRlZC4KKyAgICAvLworICAgIHZvaWQgcHVzaCgpOworCisgICAgLy8KKyAgICAvLyBDYWxsIHBvcCgpIHRvIGZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBwdXNoKCksCisgICAgLy8gb3IgaWYgbm8gbGFzdCBjYWxsIHRvIHB1c2gsIGZyZWVzIGFsbCBtZW1vcnkgc2luY2UgZmlyc3QgYWxsb2NhdGlvbi4KKyAgICAvLworICAgIHZvaWQgcG9wKCk7CisKKyAgICAvLworICAgIC8vIENhbGwgcG9wQWxsKCkgdG8gZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZC4KKyAgICAvLworICAgIHZvaWQgcG9wQWxsKCk7CisKKyAgICAvLworICAgIC8vIENhbGwgYWxsb2NhdGUoKSB0byBhY3R1YWxseSBhY3F1aXJlIG1lbW9yeS4gIFJldHVybnMgMCBpZiBubyBtZW1vcnkKKyAgICAvLyBhdmFpbGFibGUsIG90aGVyd2lzZSBhIHByb3Blcmx5IGFsaWduZWQgcG9pbnRlciB0byAnbnVtQnl0ZXMnIG9mIG1lbW9yeS4KKyAgICAvLworICAgIHZvaWQqIGFsbG9jYXRlKHNpemVfdCBudW1CeXRlcyk7CisKKyAgICAvLworICAgIC8vIFRoZXJlIGlzIG5vIGRlYWxsb2NhdGUuICBUaGUgcG9pbnQgb2YgdGhpcyBjbGFzcyBpcyB0aGF0CisgICAgLy8gZGVhbGxvY2F0aW9uIGNhbiBiZSBza2lwcGVkIGJ5IHRoZSB1c2VyIG9mIGl0LCBhcyB0aGUgbW9kZWwKKyAgICAvLyBvZiB1c2UgaXMgdG8gc2ltdWx0YW5lb3VzbHkgZGVhbGxvY2F0ZSBldmVyeXRoaW5nIGF0IG9uY2UKKyAgICAvLyBieSBjYWxsaW5nIHBvcCgpLCBhbmQgdG8gbm90IGhhdmUgdG8gc29sdmUgbWVtb3J5IGxlYWsgcHJvYmxlbXMuCisgICAgLy8KKworcHJvdGVjdGVkOgorICAgIGZyaWVuZCBzdHJ1Y3QgdEhlYWRlcjsKKyAgICAKKyAgICBzdHJ1Y3QgdEhlYWRlciB7CisgICAgICAgIHRIZWFkZXIodEhlYWRlciogbmV4dFBhZ2UsIHNpemVfdCBwYWdlQ291bnQpIDoKKyAgICAgICAgICAgIG5leHRQYWdlKG5leHRQYWdlKSwKKyAgICAgICAgICAgIHBhZ2VDb3VudChwYWdlQ291bnQpCisjaWZkZWYgR1VBUkRfQkxPQ0tTCisgICAgICAgICAgLCBsYXN0QWxsb2NhdGlvbigwKQorI2VuZGlmCisgICAgICAgICAgICB7IH0KKworICAgICAgICB+dEhlYWRlcigpIHsKKyNpZmRlZiBHVUFSRF9CTE9DS1MKKyAgICAgICAgICAgIGlmIChsYXN0QWxsb2NhdGlvbikKKyAgICAgICAgICAgICAgICBsYXN0QWxsb2NhdGlvbi0+Y2hlY2tBbGxvY0xpc3QoKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgdEhlYWRlciogbmV4dFBhZ2U7CisgICAgICAgIHNpemVfdCBwYWdlQ291bnQ7CisjaWZkZWYgR1VBUkRfQkxPQ0tTCisgICAgICAgIFRBbGxvY2F0aW9uKiBsYXN0QWxsb2NhdGlvbjsKKyNlbmRpZgorICAgIH07CisKKyAgICBzdHJ1Y3QgdEFsbG9jU3RhdGUgeworICAgICAgICBzaXplX3Qgb2Zmc2V0OworICAgICAgICB0SGVhZGVyKiBwYWdlOworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjx0QWxsb2NTdGF0ZT4gdEFsbG9jU3RhY2s7CisKKyAgICAvLyBUcmFjayBhbGxvY2F0aW9ucyBpZiBhbmQgb25seSBpZiB3ZSdyZSB1c2luZyBndWFyZCBibG9ja3MKKyAgICB2b2lkKiBpbml0aWFsaXplQWxsb2NhdGlvbih0SGVhZGVyKiBibG9jaywgdW5zaWduZWQgY2hhciogbWVtb3J5LCBzaXplX3QgbnVtQnl0ZXMpIHsKKyNpZmRlZiBHVUFSRF9CTE9DS1MKKyAgICAgICAgbmV3KG1lbW9yeSkgVEFsbG9jYXRpb24obnVtQnl0ZXMsIG1lbW9yeSwgYmxvY2stPmxhc3RBbGxvY2F0aW9uKTsKKyAgICAgICAgYmxvY2stPmxhc3RBbGxvY2F0aW9uID0gcmVpbnRlcnByZXRfY2FzdDxUQWxsb2NhdGlvbio+KG1lbW9yeSk7CisjZW5kaWYKKyAgICAgICAgLy8gVGhpcyBpcyBvcHRpbWl6ZWQgZW50aXJlbHkgYXdheSBpZiBHVUFSRF9CTE9DS1MgaXMgbm90IGRlZmluZWQuCisgICAgICAgIHJldHVybiBUQWxsb2NhdGlvbjo6b2Zmc2V0QWxsb2NhdGlvbihtZW1vcnkpOworICAgIH0KKworICAgIHNpemVfdCBwYWdlU2l6ZTsgICAgICAgIC8vIGdyYW51bGFyaXR5IG9mIGFsbG9jYXRpb24gZnJvbSB0aGUgT1MKKyAgICBzaXplX3QgYWxpZ25tZW50OyAgICAgICAvLyBhbGwgcmV0dXJuZWQgYWxsb2NhdGlvbnMgd2lsbCBiZSBhbGlnbmVkIGF0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZ3JhbnVsYXJpdHksIHdoaWNoIHdpbGwgYmUgYSBwb3dlciBvZiAyCisgICAgc2l6ZV90IGFsaWdubWVudE1hc2s7CisgICAgc2l6ZV90IGhlYWRlclNraXA7ICAgICAgLy8gYW1vdW50IG9mIG1lbW9yeSB0byBza2lwIHRvIG1ha2Ugcm9vbSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBoZWFkZXIgKGJhc2ljYWxseSwgc2l6ZSBvZiBoZWFkZXIsIHJvdW5kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIHVwIHRvIG1ha2UgaXQgYWxpZ25lZAorICAgIHNpemVfdCBjdXJyZW50UGFnZU9mZnNldDsgIC8vIG5leHQgb2Zmc2V0IGluIHRvcCBvZiBpblVzZUxpc3QgdG8gYWxsb2NhdGUgZnJvbQorICAgIHRIZWFkZXIqIGZyZWVMaXN0OyAgICAgIC8vIGxpc3Qgb2YgcG9wcGVkIG1lbW9yeQorICAgIHRIZWFkZXIqIGluVXNlTGlzdDsgICAgIC8vIGxpc3Qgb2YgYWxsIG1lbW9yeSBjdXJyZW50bHkgYmVpbmcgdXNlZAorICAgIHRBbGxvY1N0YWNrIHN0YWNrOyAgICAgIC8vIHN0YWNrIG9mIHdoZXJlIHRvIGFsbG9jYXRlIGZyb20sIHRvIHBhcnRpdGlvbiBwb29sCisKKyAgICBpbnQgbnVtQ2FsbHM7ICAgICAgICAgICAvLyBqdXN0IGFuIGludGVyZXN0aW5nIHN0YXRpc3RpYworICAgIHNpemVfdCB0b3RhbEJ5dGVzOyAgICAgIC8vIGp1c3QgYW4gaW50ZXJlc3Rpbmcgc3RhdGlzdGljCitwcml2YXRlOgorICAgIFRQb29sQWxsb2NhdG9yJiBvcGVyYXRvcj0oY29uc3QgVFBvb2xBbGxvY2F0b3ImKTsgIC8vIGRvbnQgYWxsb3cgYXNzaWdubWVudCBvcGVyYXRvcgorICAgIFRQb29sQWxsb2NhdG9yKGNvbnN0IFRQb29sQWxsb2NhdG9yJik7ICAvLyBkb250IGFsbG93IGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvcgorfTsKKworCisvLworLy8gVGhlcmUgY291bGQgcG90ZW50aWFsbHkgYmUgbWFueSBwb29scyB3aXRoIHBvcHMgaGFwcGVuaW5nIGF0CisvLyBkaWZmZXJlbnQgdGltZXMuICBCdXQgYSBzaW1wbGUgdXNlIGlzIHRvIGhhdmUgYSBnbG9iYWwgcG9wCisvLyB3aXRoIGV2ZXJ5b25lIHVzaW5nIHRoZSBzYW1lIGdsb2JhbCBhbGxvY2F0b3IuCisvLworZXh0ZXJuIFRQb29sQWxsb2NhdG9yJiBHZXRHbG9iYWxQb29sQWxsb2NhdG9yKCk7CitleHRlcm4gdm9pZCBTZXRHbG9iYWxQb29sQWxsb2NhdG9yKFRQb29sQWxsb2NhdG9yKiBwb29sQWxsb2NhdG9yKTsKKyNkZWZpbmUgR2xvYmFsUG9vbEFsbG9jYXRvciBHZXRHbG9iYWxQb29sQWxsb2NhdG9yKCkKKworc3RydWN0IFRUaHJlYWRHbG9iYWxQb29scworeworICAgIFRQb29sQWxsb2NhdG9yKiBnbG9iYWxQb29sQWxsb2NhdG9yOworfTsKKworLy8KKy8vIFRoaXMgU1RMIGNvbXBhdGlibGUgYWxsb2NhdG9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgdGhlIGFsbG9jYXRvcgorLy8gcGFyYW1ldGVyIHRvIHRlbXBsYXRpemVkIFNUTCBjb250YWluZXJzLCBsaWtlIHZlY3RvciBhbmQgbWFwLgorLy8KKy8vIEl0IHdpbGwgdXNlIHRoZSBwb29scyBmb3IgYWxsb2NhdGlvbiwgYW5kIG5vdAorLy8gZG8gYW55IGRlYWxsb2NhdGlvbiwgYnV0IHdpbGwgc3RpbGwgZG8gZGVzdHJ1Y3Rpb24uCisvLwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIHBvb2xfYWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgVCogcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IFQqIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBUJiByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCBUJiBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBPdGhlcj4gCisgICAgc3RydWN0IHJlYmluZCB7CisgICAgICAgIHR5cGVkZWYgcG9vbF9hbGxvY2F0b3I8T3RoZXI+IG90aGVyOworICAgIH07CisgICAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSB4KSBjb25zdCB7IHJldHVybiAmeDsgfQorICAgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgeCkgY29uc3QgeyByZXR1cm4gJng7IH0KKworICAgIHBvb2xfYWxsb2NhdG9yKCkgOiBhbGxvY2F0b3IoR2xvYmFsUG9vbEFsbG9jYXRvcikgeyB9CisgICAgcG9vbF9hbGxvY2F0b3IoVFBvb2xBbGxvY2F0b3ImIGEpIDogYWxsb2NhdG9yKGEpIHsgfQorICAgIHBvb2xfYWxsb2NhdG9yKGNvbnN0IHBvb2xfYWxsb2NhdG9yPFQ+JiBwKSA6IGFsbG9jYXRvcihwLmFsbG9jYXRvcikgeyB9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBPdGhlcj4KKyAgICBwb29sX2FsbG9jYXRvcihjb25zdCBwb29sX2FsbG9jYXRvcjxPdGhlcj4mIHApIDogYWxsb2NhdG9yKHAuZ2V0QWxsb2NhdG9yKCkpIHsgfQorCisjaWYgZGVmaW5lZChfX1NVTlBST19DQykgJiYgIWRlZmluZWQoX1JXU1REX0FMTE9DQVRPUikKKyAgICAvLyBsaWJDU3RkIG9uIHNvbWUgcGxhdGZvcm1zIGhhdmUgYSBkaWZmZXJlbnQgYWxsb2NhdGUvZGVhbGxvY2F0ZSBpbnRlcmZhY2UuCisgICAgLy8gQ2FsbGVyIHByZS1iYWtlcyBzaXplb2YoVCkgaW50byAnbicgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZQorICAgIC8vIGFsbG9jYXRlZCwgbm90IHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgdm9pZCogYWxsb2NhdGUoc2l6ZV90eXBlIG4pIHsgCisgICAgICAgIHJldHVybiBnZXRBbGxvY2F0b3IoKS5hbGxvY2F0ZShuKTsKKyAgICB9CisgICAgdm9pZCogYWxsb2NhdGUoc2l6ZV90eXBlIG4sIGNvbnN0IHZvaWQqKSB7CisgICAgICAgIHJldHVybiBnZXRBbGxvY2F0b3IoKS5hbGxvY2F0ZShuKTsKKyAgICB9CisgICAgdm9pZCBkZWFsbG9jYXRlKHZvaWQqLCBzaXplX3R5cGUpIHt9CisjZWxzZQorICAgIHBvaW50ZXIgYWxsb2NhdGUoc2l6ZV90eXBlIG4pIHsgCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHBvaW50ZXI+KGdldEFsbG9jYXRvcigpLmFsbG9jYXRlKG4gKiBzaXplb2YoVCkpKTsKKyAgICB9CisgICAgcG9pbnRlciBhbGxvY2F0ZShzaXplX3R5cGUgbiwgY29uc3Qgdm9pZCopIHsgCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHBvaW50ZXI+KGdldEFsbG9jYXRvcigpLmFsbG9jYXRlKG4gKiBzaXplb2YoVCkpKTsKKyAgICB9CisgICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIsIHNpemVfdHlwZSkge30KKyNlbmRpZiAgLy8gX1JXU1REX0FMTE9DQVRPUgorCisgICAgdm9pZCBjb25zdHJ1Y3QocG9pbnRlciBwLCBjb25zdCBUJiB2YWwpIHsgbmV3ICgodm9pZCAqKXApIFQodmFsKTsgfQorICAgIHZvaWQgZGVzdHJveShwb2ludGVyIHApIHsgcC0+VDo6flQoKTsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBvb2xfYWxsb2NhdG9yJiByaHMpIGNvbnN0IHsgcmV0dXJuICZnZXRBbGxvY2F0b3IoKSA9PSAmcmhzLmdldEFsbG9jYXRvcigpOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBvb2xfYWxsb2NhdG9yJiByaHMpIGNvbnN0IHsgcmV0dXJuICZnZXRBbGxvY2F0b3IoKSAhPSAmcmhzLmdldEFsbG9jYXRvcigpOyB9CisKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKSAvIHNpemVvZihUKTsgfQorICAgIHNpemVfdHlwZSBtYXhfc2l6ZShpbnQgc2l6ZSkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPigtMSkgLyBzaXplOyB9CisKKyAgICB2b2lkIHNldEFsbG9jYXRvcihUUG9vbEFsbG9jYXRvciogYSkgeyBhbGxvY2F0b3IgPSAqYTsgfQorICAgIFRQb29sQWxsb2NhdG9yJiBnZXRBbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0b3I7IH0KKworcHJvdGVjdGVkOgorICAgIFRQb29sQWxsb2NhdG9yJiBhbGxvY2F0b3I7Cit9OworCisjZW5kaWYgLy8gX1BPT0xBTExPQ19JTkNMVURFRF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1F1YWxpZmllckFsaXZlLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1F1YWxpZmllckFsaXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmE2ODc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvUXVhbGlmaWVyQWxpdmUuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9pbnRlcm1lZGlhdGUuaCIKKworY2xhc3MgVEFsaXZlVHJhdmVyc2VyIDogcHVibGljIFRJbnRlcm1UcmF2ZXJzZXIgeworcHVibGljOgorICAgIFRBbGl2ZVRyYXZlcnNlcihUUXVhbGlmaWVyIHEpIDogVEludGVybVRyYXZlcnNlcih0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpLCBmb3VuZChmYWxzZSksIHF1YWxpZmllcihxKQorICAgIHsKKyAgICB9CisKKwlib29sIHdhc0ZvdW5kKCkgeyByZXR1cm4gZm91bmQ7IH0KKworcHJvdGVjdGVkOgorICAgIGJvb2wgZm91bmQ7CisgICAgVFF1YWxpZmllciBxdWFsaWZpZXI7CisKKyAgICB2b2lkIHZpc2l0U3ltYm9sKFRJbnRlcm1TeW1ib2wqKTsKKyAgICBib29sIHZpc2l0U2VsZWN0aW9uKFZpc2l0LCBUSW50ZXJtU2VsZWN0aW9uKik7Cit9OworCisvLworLy8gUmVwb3J0IHdoZXRoZXIgb3Igbm90IGEgdmFyaWFibGUgb2YgdGhlIGdpdmVuIHF1YWxpZmllciB0eXBlCisvLyBpcyBndWFyYW50ZWVkIHdyaXR0ZW4uICBOb3QgYWx3YXlzIHBvc3NpYmxlIHRvIGRldGVybWluZSBpZgorLy8gaXQgaXMgd3JpdHRlbiBjb25kaXRpb25hbGx5LgorLy8KKy8vID8/IEl0IGRvZXMgbm90IGRvIHRoaXMgd2VsbCB5ZXQsIHRoaXMgaXMganVzdCBhIHBsYWNlIGhvbGRlcgorLy8gdGhhdCBzaW1wbHkgZGV0ZXJtaW5lcyBpZiBpdCB3YXMgcmVmZXJlbmNlIGF0IGFsbCwgYW55d2hlcmUuCisvLworYm9vbCBRdWFsaWZpZXJXcml0dGVuKFRJbnRlcm1Ob2RlKiBub2RlLCBUUXVhbGlmaWVyIHF1YWxpZmllcikKK3sKKyAgICBUQWxpdmVUcmF2ZXJzZXIgaXQocXVhbGlmaWVyKTsKKworICAgIGlmIChub2RlKQorICAgICAgICBub2RlLT50cmF2ZXJzZSgmaXQpOworCisgICAgcmV0dXJuIGl0Lndhc0ZvdW5kKCk7Cit9CisKK3ZvaWQgVEFsaXZlVHJhdmVyc2VyOjp2aXNpdFN5bWJvbChUSW50ZXJtU3ltYm9sKiBub2RlKQoreworICAgIC8vCisgICAgLy8gSWYgaXQncyB3aGF0IHdlJ3JlIGxvb2tpbmcgZm9yLCByZWNvcmQgaXQuCisgICAgLy8KKyAgICBpZiAobm9kZS0+Z2V0UXVhbGlmaWVyKCkgPT0gcXVhbGlmaWVyKQorICAgICAgICBmb3VuZCA9IHRydWU7Cit9CisKK2Jvb2wgVEFsaXZlVHJhdmVyc2VyOjp2aXNpdFNlbGVjdGlvbihWaXNpdCBwcmVWaXNpdCwgVEludGVybVNlbGVjdGlvbiogbm9kZSkKK3sKKyAgICBpZiAod2FzRm91bmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9RdWFsaWZpZXJBbGl2ZS5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvUXVhbGlmaWVyQWxpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzJhMDZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvUXVhbGlmaWVyQWxpdmUuaApAQCAtMCwwICsxLDcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKK2Jvb2wgUXVhbGlmaWVyV3JpdHRlbihUSW50ZXJtTm9kZSogcm9vdCwgVFF1YWxpZmllcik7CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9SZW1vdmVUcmVlLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1JlbW92ZVRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjhjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9SZW1vdmVUcmVlLmNwcApAQCAtMCwwICsxLDc3IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaW5jbHVkZSAiY29tcGlsZXIvaW50ZXJtZWRpYXRlLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvUmVtb3ZlVHJlZS5oIgorCisvLworLy8gQ29kZSB0byByZWN1cnNpdmVseSBkZWxldGUgdGhlIGludGVybWVkaWF0ZSB0cmVlLgorLy8KKworY2xhc3MgUmVtb3ZlVHJlZSA6IHB1YmxpYyBUSW50ZXJtVHJhdmVyc2VyCit7CitwdWJsaWM6CisJUmVtb3ZlVHJlZSgpIDogVEludGVybVRyYXZlcnNlcihmYWxzZSwgZmFsc2UsIHRydWUpCisJeworCX0KKworcHJvdGVjdGVkOgorCXZvaWQgdmlzaXRTeW1ib2woVEludGVybVN5bWJvbCopOworCXZvaWQgdmlzaXRDb25zdGFudFVuaW9uKFRJbnRlcm1Db25zdGFudFVuaW9uKik7CisJYm9vbCB2aXNpdEJpbmFyeShWaXNpdCB2aXNpdCwgVEludGVybUJpbmFyeSopOworCWJvb2wgdmlzaXRVbmFyeShWaXNpdCB2aXNpdCwgVEludGVybVVuYXJ5Kik7CisJYm9vbCB2aXNpdFNlbGVjdGlvbihWaXNpdCB2aXNpdCwgVEludGVybVNlbGVjdGlvbiopOworCWJvb2wgdmlzaXRBZ2dyZWdhdGUoVmlzaXQgdmlzaXQsIFRJbnRlcm1BZ2dyZWdhdGUqKTsKK307CisKK3ZvaWQgUmVtb3ZlVHJlZTo6dmlzaXRTeW1ib2woVEludGVybVN5bWJvbCogbm9kZSkKK3sKKwlkZWxldGUgbm9kZTsKK30KKworYm9vbCBSZW1vdmVUcmVlOjp2aXNpdEJpbmFyeShWaXNpdCB2aXNpdCwgVEludGVybUJpbmFyeSogbm9kZSkKK3sKKwlkZWxldGUgbm9kZTsKKworCXJldHVybiB0cnVlOworfQorCitib29sIFJlbW92ZVRyZWU6OnZpc2l0VW5hcnkoVmlzaXQgdmlzaXQsIFRJbnRlcm1VbmFyeSogbm9kZSkKK3sKKyAgICBkZWxldGUgbm9kZTsKKworCXJldHVybiB0cnVlOworfQorCitib29sIFJlbW92ZVRyZWU6OnZpc2l0QWdncmVnYXRlKFZpc2l0IHZpc2l0LCBUSW50ZXJtQWdncmVnYXRlKiBub2RlKQoreworCWRlbGV0ZSBub2RlOworCisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVtb3ZlVHJlZTo6dmlzaXRTZWxlY3Rpb24oVmlzaXQgdmlzaXQsIFRJbnRlcm1TZWxlY3Rpb24qIG5vZGUpCit7CisJZGVsZXRlIG5vZGU7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW1vdmVUcmVlOjp2aXNpdENvbnN0YW50VW5pb24oVEludGVybUNvbnN0YW50VW5pb24qIG5vZGUpCit7CisJZGVsZXRlIG5vZGU7Cit9CisKKy8vCisvLyBFbnRyeSBwb2ludC4KKy8vCit2b2lkIFJlbW92ZUFsbFRyZWVOb2RlcyhUSW50ZXJtTm9kZSogcm9vdCkKK3sKKyAgICBSZW1vdmVUcmVlIGl0OworCisgICAgcm9vdC0+dHJhdmVyc2UoJml0KTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvUmVtb3ZlVHJlZS5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvUmVtb3ZlVHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTgyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9SZW1vdmVUcmVlLmgKQEAgLTAsMCArMSw3IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCit2b2lkIFJlbW92ZUFsbFRyZWVOb2RlcyhUSW50ZXJtTm9kZSopOwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvU2VhcmNoU3ltYm9sLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1NlYXJjaFN5bWJvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2OGYxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1NlYXJjaFN5bWJvbC5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKy8vIFNlYXJjaFN5bWJvbCBpcyBhbiBBU1QgdHJhdmVyc2VyIHRvIGRldGVjdCB0aGUgdXNlIG9mIGEgZ2l2ZW4gc3ltYm9sIG5hbWUKKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9TZWFyY2hTeW1ib2wuaCIKKworI2luY2x1ZGUgImNvbXBpbGVyL0luZm9TaW5rLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvT3V0cHV0SExTTC5oIgorCituYW1lc3BhY2Ugc2gKK3sKK1NlYXJjaFN5bWJvbDo6U2VhcmNoU3ltYm9sKGNvbnN0IFRTdHJpbmcgJnN5bWJvbCkgOiBtU3ltYm9sKHN5bWJvbCkKK3sKKyAgICBtYXRjaCA9IGZhbHNlOworfQorCit2b2lkIFNlYXJjaFN5bWJvbDo6dHJhdmVyc2UoVEludGVybU5vZGUgKm5vZGUpCit7CisgICAgbm9kZS0+dHJhdmVyc2UodGhpcyk7Cit9CisKK3ZvaWQgU2VhcmNoU3ltYm9sOjp2aXNpdFN5bWJvbChUSW50ZXJtU3ltYm9sICpzeW1ib2xOb2RlKQoreworICAgIGlmIChzeW1ib2xOb2RlLT5nZXRTeW1ib2woKSA9PSBtU3ltYm9sKQorICAgIHsKKyAgICAgICAgbWF0Y2ggPSB0cnVlOworICAgIH0KK30KKworYm9vbCBTZWFyY2hTeW1ib2w6OmZvdW5kTWF0Y2goKSBjb25zdAoreworICAgIHJldHVybiBtYXRjaDsKK30KK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1NlYXJjaFN5bWJvbC5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvU2VhcmNoU3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjMGI5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1NlYXJjaFN5bWJvbC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisvLyBTZWFyY2hTeW1ib2wgaXMgYW4gQVNUIHRyYXZlcnNlciB0byBkZXRlY3QgdGhlIHVzZSBvZiBhIGdpdmVuIHN5bWJvbCBuYW1lCisvLworCisjaWZuZGVmIENPTVBJTEVSX1NFQVJDSFNZTUJPTF9IXworI2RlZmluZSBDT01QSUxFUl9TRUFSQ0hTWU1CT0xfSF8KKworI2luY2x1ZGUgImNvbXBpbGVyL2ludGVybWVkaWF0ZS5oIgorI2luY2x1ZGUgImNvbXBpbGVyL1BhcnNlSGVscGVyLmgiCisKK25hbWVzcGFjZSBzaAoreworY2xhc3MgU2VhcmNoU3ltYm9sIDogcHVibGljIFRJbnRlcm1UcmF2ZXJzZXIKK3sKKyAgcHVibGljOgorICAgIFNlYXJjaFN5bWJvbChjb25zdCBUU3RyaW5nICZzeW1ib2wpOworCisgICAgdm9pZCB0cmF2ZXJzZShUSW50ZXJtTm9kZSAqbm9kZSk7CisgICAgdm9pZCB2aXNpdFN5bWJvbChUSW50ZXJtU3ltYm9sICpzeW1ib2xOb2RlKTsKKworICAgIGJvb2wgZm91bmRNYXRjaCgpIGNvbnN0OworCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBUU3RyaW5nICZtU3ltYm9sOworICAgIGJvb2wgbWF0Y2g7Cit9OworfQorCisjZW5kaWYgICAvLyBDT01QSUxFUl9TRUFSQ0hTWU1CT0xfSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1NoSGFuZGxlLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9TaEhhbmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTJmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9TaEhhbmRsZS5oCkBAIC0wLDAgKzEsMTEyIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaWZuZGVmIF9TSEhBTkRMRV9JTkNMVURFRF8KKyNkZWZpbmUgX1NISEFORExFX0lOQ0xVREVEXworCisvLworLy8gTWFjaGluZSBpbmRlcGVuZGVudCBwYXJ0IG9mIHRoZSBjb21waWxlciBwcml2YXRlIG9iamVjdHMKKy8vIHNlbnQgYXMgU2hIYW5kbGUgdG8gdGhlIGRyaXZlci4KKy8vCisvLyBUaGlzIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgYnkgZHJpdmVyIGNvZGUuCisvLworCisjaW5jbHVkZSAiR0xTTEFORy9TaGFkZXJMYW5nLmgiCisKKyNpbmNsdWRlICJjb21waWxlci9FeHRlbnNpb25CZWhhdmlvci5oIgorI2luY2x1ZGUgImNvbXBpbGVyL0luZm9TaW5rLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvU3ltYm9sVGFibGUuaCIKKyNpbmNsdWRlICJjb21waWxlci9WYXJpYWJsZUluZm8uaCIKKworY2xhc3MgVENvbXBpbGVyOworCisvLworLy8gVGhlIGJhc2UgY2xhc3MgdXNlZCB0byBiYWNrIGhhbmRsZXMgcmV0dXJuZWQgdG8gdGhlIGRyaXZlci4KKy8vCitjbGFzcyBUU2hIYW5kbGVCYXNlIHsKK3B1YmxpYzoKKyAgICBUU2hIYW5kbGVCYXNlKCk7CisgICAgdmlydHVhbCB+VFNoSGFuZGxlQmFzZSgpOworICAgIHZpcnR1YWwgVENvbXBpbGVyKiBnZXRBc0NvbXBpbGVyKCkgeyByZXR1cm4gMDsgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gTWVtb3J5IGFsbG9jYXRvci4gQWxsb2NhdGVzIGFuZCB0cmFja3MgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBjb21waWxlci4KKyAgICAvLyBEZWFsbG9jYXRlcyBhbGwgbWVtb3J5IHdoZW4gY29tcGlsZXIgaXMgZGVzdHJ1Y3RlZC4KKyAgICBUUG9vbEFsbG9jYXRvciBhbGxvY2F0b3I7Cit9OworCisvLworLy8gVGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBjb21waWxlciB0byBkZXJpdmUgZnJvbQorLy8gZm9yIG1hbmFnaW5nIG9iamVjdCBjb2RlIGZyb20gdGhlIGNvbXBpbGUuCisvLworY2xhc3MgVENvbXBpbGVyIDogcHVibGljIFRTaEhhbmRsZUJhc2UgeworcHVibGljOgorICAgIFRDb21waWxlcihTaFNoYWRlclR5cGUgdHlwZSwgU2hTaGFkZXJTcGVjIHNwZWMpOworICAgIHZpcnR1YWwgflRDb21waWxlcigpOworICAgIHZpcnR1YWwgVENvbXBpbGVyKiBnZXRBc0NvbXBpbGVyKCkgeyByZXR1cm4gdGhpczsgfQorCisgICAgYm9vbCBJbml0KGNvbnN0IFNoQnVpbHRJblJlc291cmNlcyYgcmVzb3VyY2VzKTsKKyAgICBib29sIGNvbXBpbGUoY29uc3QgY2hhciogY29uc3Qgc2hhZGVyU3RyaW5nc1tdLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtU3RyaW5ncywKKyAgICAgICAgICAgICAgICAgaW50IGNvbXBpbGVPcHRpb25zKTsKKworICAgIC8vIEdldCByZXN1bHRzIG9mIHRoZSBsYXN0IGNvbXBpbGF0aW9uLgorICAgIFRJbmZvU2luayYgZ2V0SW5mb1NpbmsoKSB7IHJldHVybiBpbmZvU2luazsgfQorICAgIGNvbnN0IFRWYXJpYWJsZUluZm9MaXN0JiBnZXRBdHRyaWJzKCkgY29uc3QgeyByZXR1cm4gYXR0cmliczsgfQorICAgIGNvbnN0IFRWYXJpYWJsZUluZm9MaXN0JiBnZXRVbmlmb3JtcygpIGNvbnN0IHsgcmV0dXJuIHVuaWZvcm1zOyB9CisgICAgaW50IGdldE1hcHBlZE5hbWVNYXhMZW5ndGgoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIFNoU2hhZGVyVHlwZSBnZXRTaGFkZXJUeXBlKCkgY29uc3QgeyByZXR1cm4gc2hhZGVyVHlwZTsgfQorICAgIFNoU2hhZGVyU3BlYyBnZXRTaGFkZXJTcGVjKCkgY29uc3QgeyByZXR1cm4gc2hhZGVyU3BlYzsgfQorICAgIC8vIEluaXRpYWxpemUgc3ltYm9sLXRhYmxlIHdpdGggYnVpbHQtaW4gc3ltYm9scy4KKyAgICBib29sIEluaXRCdWlsdEluU3ltYm9sVGFibGUoY29uc3QgU2hCdWlsdEluUmVzb3VyY2VzJiByZXNvdXJjZXMpOworICAgIC8vIENsZWFycyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBwcmV2aW91cyBjb21waWxhdGlvbi4KKyAgICB2b2lkIGNsZWFyUmVzdWx0cygpOworICAgIC8vIFJldHVybiB0cnVlIGlmIGZ1bmN0aW9uIHJlY3Vyc2lvbiBpcyBkZXRlY3RlZC4KKyAgICBib29sIGRldGVjdFJlY3Vyc2lvbihUSW50ZXJtTm9kZSogcm9vdCk7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzaGFkZXIgZG9lcyBub3QgZXhjZWVkIHRoZSBtaW5pbXVtCisgICAgLy8gZnVuY3Rpb25hbGl0eSBtYW5kYXRlZCBpbiBHTFNMIDEuMCBzcGVjIEFwcGVuZGl4IEEuCisgICAgYm9vbCB2YWxpZGF0ZUxpbWl0YXRpb25zKFRJbnRlcm1Ob2RlKiByb290KTsKKyAgICAvLyBDb2xsZWN0IGluZm8gZm9yIGFsbCBhdHRyaWJzIGFuZCB1bmlmb3Jtcy4KKyAgICB2b2lkIGNvbGxlY3RBdHRyaWJzVW5pZm9ybXMoVEludGVybU5vZGUqIHJvb3QpOworICAgIC8vIE1hcCBsb25nIHZhcmlhYmxlIG5hbWVzIGludG8gc2hvcnRlciBvbmVzLgorICAgIHZvaWQgbWFwTG9uZ1ZhcmlhYmxlTmFtZXMoVEludGVybU5vZGUqIHJvb3QpOworICAgIC8vIFRyYW5zbGF0ZSB0byBvYmplY3QgY29kZS4KKyAgICB2aXJ0dWFsIHZvaWQgdHJhbnNsYXRlKFRJbnRlcm1Ob2RlKiByb290KSA9IDA7CisKK3ByaXZhdGU6CisgICAgU2hTaGFkZXJUeXBlIHNoYWRlclR5cGU7CisgICAgU2hTaGFkZXJTcGVjIHNoYWRlclNwZWM7CisKKyAgICAvLyBCdWlsdC1pbiBzeW1ib2wgdGFibGUgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZSwgc3BlYywgYW5kIHJlc291cmNlcy4KKyAgICAvLyBJdCBpcyBwcmVzZXJ2ZWQgZnJvbSBjb21waWxlLXRvLWNvbXBpbGUuCisgICAgVFN5bWJvbFRhYmxlIHN5bWJvbFRhYmxlOworICAgIC8vIEJ1aWx0LWluIGV4dGVuc2lvbnMgd2l0aCBkZWZhdWx0IGJlaGF2aW9yLgorICAgIFRFeHRlbnNpb25CZWhhdmlvciBleHRlbnNpb25CZWhhdmlvcjsKKworICAgIC8vIFJlc3VsdHMgb2YgY29tcGlsYXRpb24uCisgICAgVEluZm9TaW5rIGluZm9TaW5rOyAgLy8gT3V0cHV0IHNpbmsuCisgICAgVFZhcmlhYmxlSW5mb0xpc3QgYXR0cmliczsgIC8vIEFjdGl2ZSBhdHRyaWJ1dGVzIGluIHRoZSBjb21waWxlZCBzaGFkZXIuCisgICAgVFZhcmlhYmxlSW5mb0xpc3QgdW5pZm9ybXM7ICAvLyBBY3RpdmUgdW5pZm9ybXMgaW4gdGhlIGNvbXBpbGVkIHNoYWRlci4KKworICAgIC8vIFBhaXIgb2YgbG9uZyB2YXJ5aW5nIHZhcmliYWxlIG5hbWUgPG9yaWdpbmFsTmFtZSwgbWFwcGVkTmFtZT4uCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJ5aW5nTG9uZ05hbWVNYXA7Cit9OworCisvLworLy8gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZQorLy8gYW5kIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBjb2RlLgorLy8KKy8vIFRoZSBtYWNoaW5lIGRlcGVuZGVudCBjb2RlIHNob3VsZCBkZXJpdmUgZnJvbSB0aGUgY2xhc3NlcworLy8gYWJvdmUuIFRoZW4gQ29uc3RydWN0KigpIGFuZCBEZWxldGUqKCkgd2lsbCBjcmVhdGUgYW5kIAorLy8gZGVzdHJveSB0aGUgbWFjaGluZSBkZXBlbmRlbnQgb2JqZWN0cywgd2hpY2ggY29udGFpbiB0aGUKKy8vIGFib3ZlIG1hY2hpbmUgaW5kZXBlbmRlbnQgaW5mb3JtYXRpb24uCisvLworVENvbXBpbGVyKiBDb25zdHJ1Y3RDb21waWxlcihTaFNoYWRlclR5cGUgdHlwZSwgU2hTaGFkZXJTcGVjIHNwZWMpOwordm9pZCBEZWxldGVDb21waWxlcihUQ29tcGlsZXIqKTsKKworI2VuZGlmIC8vIF9TSEhBTkRMRV9JTkNMVURFRF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1NoYWRlckxhbmcuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvU2hhZGVyTGFuZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxZTRlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1NoYWRlckxhbmcuY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLworLy8gSW1wbGVtZW50IHRoZSB0b3AtbGV2ZWwgb2YgaW50ZXJmYWNlIHRvIHRoZSBjb21waWxlciwKKy8vIGFzIGRlZmluZWQgaW4gU2hhZGVyTGFuZy5oCisvLworCisjaW5jbHVkZSAiR0xTTEFORy9TaGFkZXJMYW5nLmgiCisKKyNpbmNsdWRlICJjb21waWxlci9Jbml0aWFsaXplRGxsLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvU2hIYW5kbGUuaCIKKworLy8KKy8vIFRoaXMgaXMgdGhlIHBsYXRmb3JtIGluZGVwZW5kZW50IGludGVyZmFjZSBiZXR3ZWVuIGFuIE9HTCBkcml2ZXIKKy8vIGFuZCB0aGUgc2hhZGluZyBsYW5ndWFnZSBjb21waWxlci4KKy8vCisKK3N0YXRpYyBpbnQgZ2V0VmFyaWFibGVNYXhMZW5ndGgoY29uc3QgVFZhcmlhYmxlSW5mb0xpc3QmIHZhckxpc3QpCit7CisgICAgVFN0cmluZzo6c2l6ZV90eXBlIG1heExlbiA9IDA7CisgICAgZm9yIChUVmFyaWFibGVJbmZvTGlzdDo6Y29uc3RfaXRlcmF0b3IgaSA9IHZhckxpc3QuYmVnaW4oKTsKKyAgICAgICAgIGkgIT0gdmFyTGlzdC5lbmQoKTsgKytpKQorICAgIHsKKyAgICAgICAgbWF4TGVuID0gc3RkOjptYXgobWF4TGVuLCBpLT5uYW1lLnNpemUoKSk7CisgICAgfQorICAgIC8vIEFkZCAxIHRvIGluY2x1ZGUgbnVsbC10ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obWF4TGVuKSArIDE7Cit9CisKK3N0YXRpYyB2b2lkIGdldFZhcmlhYmxlSW5mbyhTaFNoYWRlckluZm8gdmFyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaERhdGFUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbWFwcGVkTmFtZSkKK3sKKyAgICBpZiAoIWhhbmRsZSB8fCAhc2l6ZSB8fCAhdHlwZSB8fCAhbmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgIEFTU0VSVCgodmFyVHlwZSA9PSBTSF9BQ1RJVkVfQVRUUklCVVRFUykgfHwKKyAgICAgICAgICAgKHZhclR5cGUgPT0gU0hfQUNUSVZFX1VOSUZPUk1TKSk7CisKKyAgICBUU2hIYW5kbGVCYXNlKiBiYXNlID0gcmVpbnRlcnByZXRfY2FzdDxUU2hIYW5kbGVCYXNlKj4oaGFuZGxlKTsKKyAgICBUQ29tcGlsZXIqIGNvbXBpbGVyID0gYmFzZS0+Z2V0QXNDb21waWxlcigpOworICAgIGlmIChjb21waWxlciA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBUVmFyaWFibGVJbmZvTGlzdCYgdmFyTGlzdCA9IHZhclR5cGUgPT0gU0hfQUNUSVZFX0FUVFJJQlVURVMgPworICAgICAgICBjb21waWxlci0+Z2V0QXR0cmlicygpIDogY29tcGlsZXItPmdldFVuaWZvcm1zKCk7CisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzdGF0aWNfY2FzdDxpbnQ+KHZhckxpc3Quc2l6ZSgpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgVFZhcmlhYmxlSW5mbyYgdmFySW5mbyA9IHZhckxpc3RbaW5kZXhdOworICAgIGlmIChsZW5ndGgpICpsZW5ndGggPSB2YXJJbmZvLm5hbWUuc2l6ZSgpOworICAgICpzaXplID0gdmFySW5mby5zaXplOworICAgICp0eXBlID0gdmFySW5mby50eXBlOworICAgIHN0cmNweShuYW1lLCB2YXJJbmZvLm5hbWUuY19zdHIoKSk7CisgICAgaWYgKG1hcHBlZE5hbWUpCisgICAgICAgIHN0cmNweShtYXBwZWROYW1lLCB2YXJJbmZvLm1hcHBlZE5hbWUuY19zdHIoKSk7Cit9CisKKy8vCisvLyBEcml2ZXIgbXVzdCBjYWxsIHRoaXMgZmlyc3QsIG9uY2UsIGJlZm9yZSBkb2luZyBhbnkgb3RoZXIKKy8vIGNvbXBpbGVyIG9wZXJhdGlvbnMuCisvLworaW50IFNoSW5pdGlhbGl6ZSgpCit7CisgICAgaWYgKCFJbml0UHJvY2VzcygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCisvLworLy8gQ2xlYW51cCBzeW1ib2wgdGFibGVzCisvLworaW50IFNoRmluYWxpemUoKQoreworICAgIGlmICghRGV0YWNoUHJvY2VzcygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCisvLworLy8gSW5pdGlhbGl6ZSBidWlsdC1pbiByZXNvdXJjZXMgd2l0aCBtaW5pbXVtIGV4cGVjdGVkIHZhbHVlcy4KKy8vCit2b2lkIFNoSW5pdEJ1aWx0SW5SZXNvdXJjZXMoU2hCdWlsdEluUmVzb3VyY2VzKiByZXNvdXJjZXMpCit7CisgICAgLy8gQ29uc3RhbnRzLgorICAgIHJlc291cmNlcy0+TWF4VmVydGV4QXR0cmlicyA9IDg7CisgICAgcmVzb3VyY2VzLT5NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9ycyA9IDEyODsKKyAgICByZXNvdXJjZXMtPk1heFZhcnlpbmdWZWN0b3JzID0gODsKKyAgICByZXNvdXJjZXMtPk1heFZlcnRleFRleHR1cmVJbWFnZVVuaXRzID0gMDsKKyAgICByZXNvdXJjZXMtPk1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMgPSA4OworICAgIHJlc291cmNlcy0+TWF4VGV4dHVyZUltYWdlVW5pdHMgPSA4OworICAgIHJlc291cmNlcy0+TWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyA9IDE2OworICAgIHJlc291cmNlcy0+TWF4RHJhd0J1ZmZlcnMgPSAxOworCisgICAgLy8gRXh0ZW5zaW9ucy4KKyAgICByZXNvdXJjZXMtPk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA9IDA7Cit9CisKKy8vCisvLyBEcml2ZXIgY2FsbHMgdGhlc2UgdG8gY3JlYXRlIGFuZCBkZXN0cm95IGNvbXBpbGVyIG9iamVjdHMuCisvLworU2hIYW5kbGUgU2hDb25zdHJ1Y3RDb21waWxlcihTaFNoYWRlclR5cGUgdHlwZSwgU2hTaGFkZXJTcGVjIHNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNoQnVpbHRJblJlc291cmNlcyogcmVzb3VyY2VzKQoreworICAgIGlmICghSW5pdFRocmVhZCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFRTaEhhbmRsZUJhc2UqIGJhc2UgPSBzdGF0aWNfY2FzdDxUU2hIYW5kbGVCYXNlKj4oQ29uc3RydWN0Q29tcGlsZXIodHlwZSwgc3BlYykpOworICAgIFRDb21waWxlciogY29tcGlsZXIgPSBiYXNlLT5nZXRBc0NvbXBpbGVyKCk7CisgICAgaWYgKGNvbXBpbGVyID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gR2VuZXJhdGUgYnVpbHQtaW4gc3ltYm9sIHRhYmxlLgorICAgIGlmICghY29tcGlsZXItPkluaXQoKnJlc291cmNlcykpIHsKKyAgICAgICAgU2hEZXN0cnVjdChiYXNlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGJhc2UpOworfQorCit2b2lkIFNoRGVzdHJ1Y3QoU2hIYW5kbGUgaGFuZGxlKQoreworICAgIGlmIChoYW5kbGUgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgVFNoSGFuZGxlQmFzZSogYmFzZSA9IHN0YXRpY19jYXN0PFRTaEhhbmRsZUJhc2UqPihoYW5kbGUpOworCisgICAgaWYgKGJhc2UtPmdldEFzQ29tcGlsZXIoKSkKKyAgICAgICAgRGVsZXRlQ29tcGlsZXIoYmFzZS0+Z2V0QXNDb21waWxlcigpKTsKK30KKworLy8KKy8vIERvIGFuIGFjdHVhbCBjb21waWxlIG9uIHRoZSBnaXZlbiBzdHJpbmdzLiAgVGhlIHJlc3VsdCBpcyBsZWZ0IAorLy8gaW4gdGhlIGdpdmVuIGNvbXBpbGUgb2JqZWN0LgorLy8KKy8vIFJldHVybjogIFRoZSByZXR1cm4gdmFsdWUgb2YgU2hDb21waWxlIGlzIHJlYWxseSBib29sZWFuLCBpbmRpY2F0aW5nCisvLyBzdWNjZXNzIG9yIGZhaWx1cmUuCisvLworaW50IFNoQ29tcGlsZSgKKyAgICBjb25zdCBTaEhhbmRsZSBoYW5kbGUsCisgICAgY29uc3QgY2hhciogY29uc3Qgc2hhZGVyU3RyaW5nc1tdLAorICAgIGNvbnN0IGludCBudW1TdHJpbmdzLAorICAgIGludCBjb21waWxlT3B0aW9ucykKK3sKKyAgICBpZiAoIUluaXRUaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoaGFuZGxlID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgVFNoSGFuZGxlQmFzZSogYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VFNoSGFuZGxlQmFzZSo+KGhhbmRsZSk7CisgICAgVENvbXBpbGVyKiBjb21waWxlciA9IGJhc2UtPmdldEFzQ29tcGlsZXIoKTsKKyAgICBpZiAoY29tcGlsZXIgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBib29sIHN1Y2Nlc3MgPSBjb21waWxlci0+Y29tcGlsZShzaGFkZXJTdHJpbmdzLCBudW1TdHJpbmdzLCBjb21waWxlT3B0aW9ucyk7CisgICAgcmV0dXJuIHN1Y2Nlc3MgPyAxIDogMDsKK30KKwordm9pZCBTaEdldEluZm8oY29uc3QgU2hIYW5kbGUgaGFuZGxlLCBTaFNoYWRlckluZm8gcG5hbWUsIGludCogcGFyYW1zKQoreworICAgIGlmICghaGFuZGxlIHx8ICFwYXJhbXMpCisgICAgICAgIHJldHVybjsKKworICAgIFRTaEhhbmRsZUJhc2UqIGJhc2UgPSBzdGF0aWNfY2FzdDxUU2hIYW5kbGVCYXNlKj4oaGFuZGxlKTsKKyAgICBUQ29tcGlsZXIqIGNvbXBpbGVyID0gYmFzZS0+Z2V0QXNDb21waWxlcigpOworICAgIGlmICghY29tcGlsZXIpIHJldHVybjsKKworICAgIHN3aXRjaChwbmFtZSkKKyAgICB7CisgICAgY2FzZSBTSF9JTkZPX0xPR19MRU5HVEg6CisgICAgICAgICpwYXJhbXMgPSBjb21waWxlci0+Z2V0SW5mb1NpbmsoKS5pbmZvLnNpemUoKSArIDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0hfT0JKRUNUX0NPREVfTEVOR1RIOgorICAgICAgICAqcGFyYW1zID0gY29tcGlsZXItPmdldEluZm9TaW5rKCkub2JqLnNpemUoKSArIDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0hfQUNUSVZFX1VOSUZPUk1TOgorICAgICAgICAqcGFyYW1zID0gY29tcGlsZXItPmdldFVuaWZvcm1zKCkuc2l6ZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNIX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEg6CisgICAgICAgICpwYXJhbXMgPSBnZXRWYXJpYWJsZU1heExlbmd0aChjb21waWxlci0+Z2V0VW5pZm9ybXMoKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0hfQUNUSVZFX0FUVFJJQlVURVM6CisgICAgICAgICpwYXJhbXMgPSBjb21waWxlci0+Z2V0QXR0cmlicygpLnNpemUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEg6CisgICAgICAgICpwYXJhbXMgPSBnZXRWYXJpYWJsZU1heExlbmd0aChjb21waWxlci0+Z2V0QXR0cmlicygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSF9NQVBQRURfTkFNRV9NQVhfTEVOR1RIOgorICAgICAgICAqcGFyYW1zID0gY29tcGlsZXItPmdldE1hcHBlZE5hbWVNYXhMZW5ndGgoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICB9Cit9CisKKy8vCisvLyBSZXR1cm4gYW55IGNvbXBpbGVyIGxvZyBvZiBtZXNzYWdlcyBmb3IgdGhlIGFwcGxpY2F0aW9uLgorLy8KK3ZvaWQgU2hHZXRJbmZvTG9nKGNvbnN0IFNoSGFuZGxlIGhhbmRsZSwgY2hhciogaW5mb0xvZykKK3sKKyAgICBpZiAoIWhhbmRsZSB8fCAhaW5mb0xvZykKKyAgICAgICAgcmV0dXJuOworCisgICAgVFNoSGFuZGxlQmFzZSogYmFzZSA9IHN0YXRpY19jYXN0PFRTaEhhbmRsZUJhc2UqPihoYW5kbGUpOworICAgIFRDb21waWxlciogY29tcGlsZXIgPSBiYXNlLT5nZXRBc0NvbXBpbGVyKCk7CisgICAgaWYgKCFjb21waWxlcikgcmV0dXJuOworCisgICAgVEluZm9TaW5rJiBpbmZvU2luayA9IGNvbXBpbGVyLT5nZXRJbmZvU2luaygpOworICAgIHN0cmNweShpbmZvTG9nLCBpbmZvU2luay5pbmZvLmNfc3RyKCkpOworfQorCisvLworLy8gUmV0dXJuIGFueSBvYmplY3QgY29kZS4KKy8vCit2b2lkIFNoR2V0T2JqZWN0Q29kZShjb25zdCBTaEhhbmRsZSBoYW5kbGUsIGNoYXIqIG9iakNvZGUpCit7CisgICAgaWYgKCFoYW5kbGUgfHwgIW9iakNvZGUpCisgICAgICAgIHJldHVybjsKKworICAgIFRTaEhhbmRsZUJhc2UqIGJhc2UgPSBzdGF0aWNfY2FzdDxUU2hIYW5kbGVCYXNlKj4oaGFuZGxlKTsKKyAgICBUQ29tcGlsZXIqIGNvbXBpbGVyID0gYmFzZS0+Z2V0QXNDb21waWxlcigpOworICAgIGlmICghY29tcGlsZXIpIHJldHVybjsKKworICAgIFRJbmZvU2luayYgaW5mb1NpbmsgPSBjb21waWxlci0+Z2V0SW5mb1NpbmsoKTsKKyAgICBzdHJjcHkob2JqQ29kZSwgaW5mb1Npbmsub2JqLmNfc3RyKCkpOworfQorCit2b2lkIFNoR2V0QWN0aXZlQXR0cmliKGNvbnN0IFNoSGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBTaERhdGFUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBtYXBwZWROYW1lKQoreworICAgIGdldFZhcmlhYmxlSW5mbyhTSF9BQ1RJVkVfQVRUUklCVVRFUywKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBpbmRleCwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lLCBtYXBwZWROYW1lKTsKK30KKwordm9pZCBTaEdldEFjdGl2ZVVuaWZvcm0oY29uc3QgU2hIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBTaERhdGFUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG1hcHBlZE5hbWUpCit7CisgICAgZ2V0VmFyaWFibGVJbmZvKFNIX0FDVElWRV9VTklGT1JNUywKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBpbmRleCwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lLCBtYXBwZWROYW1lKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1N5bWJvbFRhYmxlLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1N5bWJvbFRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjgxN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvU3ltYm9sVGFibGUuY3BwCkBAIC0wLDAgKzEsMjMyIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLworLy8gU3ltYm9sIHRhYmxlIGZvciBwYXJzaW5nLiAgTW9zdCBmdW5jdGlvbmFsaXkgYW5kIG1haW4gaWRlYXMKKy8vIGFyZSBkb2N1bWVudGVkIGluIHRoZSBoZWFkZXIgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9TeW1ib2xUYWJsZS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8KKy8vIFRUeXBlIGhlbHBlciBmdW5jdGlvbiBuZWVkcyBhIHBsYWNlIHRvIGxpdmUuCisvLworCisvLworLy8gUmVjdXJzaXZlbHkgZ2VuZXJhdGUgbWFuZ2xlZCBuYW1lcy4KKy8vCit2b2lkIFRUeXBlOjpidWlsZE1hbmdsZWROYW1lKFRTdHJpbmcmIG1hbmdsZWROYW1lKQoreworICAgIGlmIChpc01hdHJpeCgpKQorICAgICAgICBtYW5nbGVkTmFtZSArPSAnbSc7CisgICAgZWxzZSBpZiAoaXNWZWN0b3IoKSkKKyAgICAgICAgbWFuZ2xlZE5hbWUgKz0gJ3YnOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBFYnRGbG9hdDogICAgICAgICAgICAgIG1hbmdsZWROYW1lICs9ICdmJzsgICAgICBicmVhazsKKyAgICBjYXNlIEVidEludDogICAgICAgICAgICAgICAgbWFuZ2xlZE5hbWUgKz0gJ2knOyAgICAgIGJyZWFrOworICAgIGNhc2UgRWJ0Qm9vbDogICAgICAgICAgICAgICBtYW5nbGVkTmFtZSArPSAnYic7ICAgICAgYnJlYWs7CisgICAgY2FzZSBFYnRTYW1wbGVyMkQ6ICAgICAgICAgIG1hbmdsZWROYW1lICs9ICJzMiI7ICAgICBicmVhazsKKyAgICBjYXNlIEVidFNhbXBsZXJDdWJlOiAgICAgICAgbWFuZ2xlZE5hbWUgKz0gInNDIjsgICAgIGJyZWFrOworICAgIGNhc2UgRWJ0U3RydWN0OgorICAgICAgICBtYW5nbGVkTmFtZSArPSAic3RydWN0LSI7CisgICAgICAgIGlmICh0eXBlTmFtZSkKKyAgICAgICAgICAgIG1hbmdsZWROYW1lICs9ICp0eXBlTmFtZTsKKyAgICAgICAgey8vIHN1cHBvcnQgTVNWQysrNi4wCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cnVjdHVyZS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtYW5nbGVkTmFtZSArPSAnLSc7CisgICAgICAgICAgICAgICAgKCpzdHJ1Y3R1cmUpW2ldLnR5cGUtPmJ1aWxkTWFuZ2xlZE5hbWUobWFuZ2xlZE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbWFuZ2xlZE5hbWUgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgZ2V0Tm9taW5hbFNpemUoKSk7CisgICAgaWYgKGlzQXJyYXkoKSkgeworICAgICAgICBjaGFyIGJ1ZlsyMF07CisgICAgICAgIHNwcmludGYoYnVmLCAiJWQiLCBhcnJheVNpemUpOworICAgICAgICBtYW5nbGVkTmFtZSArPSAnWyc7CisgICAgICAgIG1hbmdsZWROYW1lICs9IGJ1ZjsKKyAgICAgICAgbWFuZ2xlZE5hbWUgKz0gJ10nOworICAgIH0KK30KKworaW50IFRUeXBlOjpnZXRTdHJ1Y3RTaXplKCkgY29uc3QKK3sKKyAgICBpZiAoIWdldFN0cnVjdCgpKSB7CisgICAgICAgIGFzc2VydChmYWxzZSAmJiAiTm90IGEgc3RydWN0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzdHJ1Y3R1cmVTaXplID09IDApCisgICAgICAgIGZvciAoVFR5cGVMaXN0Ojpjb25zdF9pdGVyYXRvciB0bCA9IGdldFN0cnVjdCgpLT5iZWdpbigpOyB0bCAhPSBnZXRTdHJ1Y3QoKS0+ZW5kKCk7IHRsKyspCisgICAgICAgICAgICBzdHJ1Y3R1cmVTaXplICs9ICgoKnRsKS50eXBlKS0+Z2V0T2JqZWN0U2l6ZSgpOworCisgICAgcmV0dXJuIHN0cnVjdHVyZVNpemU7Cit9CisKKy8vCisvLyBEdW1wIGZ1bmN0aW9ucy4KKy8vCisKK3ZvaWQgVFZhcmlhYmxlOjpkdW1wKFRJbmZvU2luayYgaW5mb1NpbmspIGNvbnN0Cit7CisgICAgaW5mb1NpbmsuZGVidWcgPDwgZ2V0TmFtZSgpLmNfc3RyKCkgPDwgIjogIiA8PCB0eXBlLmdldFF1YWxpZmllclN0cmluZygpIDw8ICIgIiA8PCB0eXBlLmdldFByZWNpc2lvblN0cmluZygpIDw8ICIgIiA8PCB0eXBlLmdldEJhc2ljU3RyaW5nKCk7CisgICAgaWYgKHR5cGUuaXNBcnJheSgpKSB7CisgICAgICAgIGluZm9TaW5rLmRlYnVnIDw8ICJbMF0iOworICAgIH0KKyAgICBpbmZvU2luay5kZWJ1ZyA8PCAiXG4iOworfQorCit2b2lkIFRGdW5jdGlvbjo6ZHVtcChUSW5mb1NpbmsgJmluZm9TaW5rKSBjb25zdAoreworICAgIGluZm9TaW5rLmRlYnVnIDw8IGdldE5hbWUoKS5jX3N0cigpIDw8ICI6ICIgPDwgIHJldHVyblR5cGUuZ2V0QmFzaWNTdHJpbmcoKSA8PCAiICIgPDwgZ2V0TWFuZ2xlZE5hbWUoKS5jX3N0cigpIDw8ICJcbiI7Cit9CisKK3ZvaWQgVFN5bWJvbFRhYmxlTGV2ZWw6OmR1bXAoVEluZm9TaW5rICZpbmZvU2luaykgY29uc3QKK3sKKyAgICB0TGV2ZWw6OmNvbnN0X2l0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBsZXZlbC5iZWdpbigpOyBpdCAhPSBsZXZlbC5lbmQoKTsgKytpdCkKKyAgICAgICAgKCppdCkuc2Vjb25kLT5kdW1wKGluZm9TaW5rKTsKK30KKwordm9pZCBUU3ltYm9sVGFibGU6OmR1bXAoVEluZm9TaW5rICZpbmZvU2luaykgY29uc3QKK3sKKyAgICBmb3IgKGludCBsZXZlbCA9IGN1cnJlbnRMZXZlbCgpOyBsZXZlbCA+PSAwOyAtLWxldmVsKSB7CisgICAgICAgIGluZm9TaW5rLmRlYnVnIDw8ICJMRVZFTCAiIDw8IGxldmVsIDw8ICJcbiI7CisgICAgICAgIHRhYmxlW2xldmVsXS0+ZHVtcChpbmZvU2luayk7CisgICAgfQorfQorCisvLworLy8gRnVuY3Rpb25zIGhhdmUgYnVyaWVkIHBvaW50ZXJzIHRvIGRlbGV0ZS4KKy8vCitURnVuY3Rpb246On5URnVuY3Rpb24oKQoreworICAgIGZvciAoVFBhcmFtTGlzdDo6aXRlcmF0b3IgaSA9IHBhcmFtZXRlcnMuYmVnaW4oKTsgaSAhPSBwYXJhbWV0ZXJzLmVuZCgpOyArK2kpCisgICAgICAgIGRlbGV0ZSAoKmkpLnR5cGU7Cit9CisKKy8vCisvLyBTeW1ib2wgdGFibGUgbGV2ZWxzIGFyZSBhIG1hcCBvZiBwb2ludGVycyB0byBzeW1ib2xzIHRoYXQgaGF2ZSB0byBiZSBkZWxldGVkLgorLy8KK1RTeW1ib2xUYWJsZUxldmVsOjp+VFN5bWJvbFRhYmxlTGV2ZWwoKQoreworICAgIGZvciAodExldmVsOjppdGVyYXRvciBpdCA9IGxldmVsLmJlZ2luKCk7IGl0ICE9IGxldmVsLmVuZCgpOyArK2l0KQorICAgICAgICBkZWxldGUgKCppdCkuc2Vjb25kOworfQorCisvLworLy8gQ2hhbmdlIGFsbCBmdW5jdGlvbiBlbnRyaWVzIGluIHRoZSB0YWJsZSB3aXRoIHRoZSBub24tbWFuZ2xlZCBuYW1lCisvLyB0byBiZSByZWxhdGVkIHRvIHRoZSBwcm92aWRlZCBidWlsdC1pbiBvcGVyYXRpb24uICBUaGlzIGlzIGEgbG93CisvLyBwZXJmb3JtYW5jZSBvcGVyYXRpb24sIGFuZCBvbmx5IGludGVuZGVkIGZvciBzeW1ib2wgdGFibGVzIHRoYXQKKy8vIGxpdmUgYWNyb3NzIGEgbGFyZ2UgbnVtYmVyIG9mIGNvbXBpbGVzLgorLy8KK3ZvaWQgVFN5bWJvbFRhYmxlTGV2ZWw6OnJlbGF0ZVRvT3BlcmF0b3IoY29uc3QgY2hhciogbmFtZSwgVE9wZXJhdG9yIG9wKQoreworICAgIHRMZXZlbDo6aXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IGxldmVsLmJlZ2luKCk7IGl0ICE9IGxldmVsLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS5zZWNvbmQtPmlzRnVuY3Rpb24oKSkgeworICAgICAgICAgICAgVEZ1bmN0aW9uKiBmdW5jdGlvbiA9IHN0YXRpY19jYXN0PFRGdW5jdGlvbio+KCgqaXQpLnNlY29uZCk7CisgICAgICAgICAgICBpZiAoZnVuY3Rpb24tPmdldE5hbWUoKSA9PSBuYW1lKQorICAgICAgICAgICAgICAgIGZ1bmN0aW9uLT5yZWxhdGVUb09wZXJhdG9yKG9wKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8KKy8vIENoYW5nZSBhbGwgZnVuY3Rpb24gZW50cmllcyBpbiB0aGUgdGFibGUgd2l0aCB0aGUgbm9uLW1hbmdsZWQgbmFtZQorLy8gdG8gYmUgcmVsYXRlZCB0byB0aGUgcHJvdmlkZWQgYnVpbHQtaW4gZXh0ZW5zaW9uLiBUaGlzIGlzIGEgbG93CisvLyBwZXJmb3JtYW5jZSBvcGVyYXRpb24sIGFuZCBvbmx5IGludGVuZGVkIGZvciBzeW1ib2wgdGFibGVzIHRoYXQKKy8vIGxpdmUgYWNyb3NzIGEgbGFyZ2UgbnVtYmVyIG9mIGNvbXBpbGVzLgorLy8KK3ZvaWQgVFN5bWJvbFRhYmxlTGV2ZWw6OnJlbGF0ZVRvRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRTdHJpbmcmIGV4dCkKK3sKKyAgICBmb3IgKHRMZXZlbDo6aXRlcmF0b3IgaXQgPSBsZXZlbC5iZWdpbigpOyBpdCAhPSBsZXZlbC5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQtPnNlY29uZC0+aXNGdW5jdGlvbigpKSB7CisgICAgICAgICAgICBURnVuY3Rpb24qIGZ1bmN0aW9uID0gc3RhdGljX2Nhc3Q8VEZ1bmN0aW9uKj4oaXQtPnNlY29uZCk7CisgICAgICAgICAgICBpZiAoZnVuY3Rpb24tPmdldE5hbWUoKSA9PSBuYW1lKQorICAgICAgICAgICAgICAgIGZ1bmN0aW9uLT5yZWxhdGVUb0V4dGVuc2lvbihleHQpOworICAgICAgICB9CisgICAgfQorfQorCitUU3ltYm9sOjpUU3ltYm9sKGNvbnN0IFRTeW1ib2wmIGNvcHlPZikKK3sKKyAgICBuYW1lID0gTmV3UG9vbFRTdHJpbmcoY29weU9mLm5hbWUtPmNfc3RyKCkpOworICAgIHVuaXF1ZUlkID0gY29weU9mLnVuaXF1ZUlkOworfQorCitUVmFyaWFibGU6OlRWYXJpYWJsZShjb25zdCBUVmFyaWFibGUmIGNvcHlPZiwgVFN0cnVjdHVyZU1hcCYgcmVtYXBwZXIpIDogVFN5bWJvbChjb3B5T2YpCit7CisgICAgdHlwZS5jb3B5VHlwZShjb3B5T2YudHlwZSwgcmVtYXBwZXIpOworICAgIHVzZXJUeXBlID0gY29weU9mLnVzZXJUeXBlOworICAgIC8vIGZvciBidWlsdEluIHN5bWJvbCB0YWJsZSBsZXZlbCwgdW5pb25BcnJheSBhbmQgYXJyYXlJbmZvcm1hdGlvbiBwb2ludGVycyBzaG91bGQgYmUgTlVMTAorICAgIGFzc2VydChjb3B5T2YuYXJyYXlJbmZvcm1hdGlvblR5cGUgPT0gMCk7CisgICAgYXJyYXlJbmZvcm1hdGlvblR5cGUgPSAwOworCisgICAgaWYgKGNvcHlPZi51bmlvbkFycmF5KSB7CisgICAgICAgIGFzc2VydCghY29weU9mLnR5cGUuZ2V0U3RydWN0KCkpOworICAgICAgICBhc3NlcnQoY29weU9mLnR5cGUuZ2V0T2JqZWN0U2l6ZSgpID09IDEpOworICAgICAgICB1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgIHVuaW9uQXJyYXlbMF0gPSBjb3B5T2YudW5pb25BcnJheVswXTsKKyAgICB9IGVsc2UKKyAgICAgICAgdW5pb25BcnJheSA9IDA7Cit9CisKK1RWYXJpYWJsZSogVFZhcmlhYmxlOjpjbG9uZShUU3RydWN0dXJlTWFwJiByZW1hcHBlcikKK3sKKyAgICBUVmFyaWFibGUgKnZhcmlhYmxlID0gbmV3IFRWYXJpYWJsZSgqdGhpcywgcmVtYXBwZXIpOworCisgICAgcmV0dXJuIHZhcmlhYmxlOworfQorCitURnVuY3Rpb246OlRGdW5jdGlvbihjb25zdCBURnVuY3Rpb24mIGNvcHlPZiwgVFN0cnVjdHVyZU1hcCYgcmVtYXBwZXIpIDogVFN5bWJvbChjb3B5T2YpCit7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3B5T2YucGFyYW1ldGVycy5zaXplKCk7ICsraSkgeworICAgICAgICBUUGFyYW1ldGVyIHBhcmFtOworICAgICAgICBwYXJhbWV0ZXJzLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgIHBhcmFtZXRlcnMuYmFjaygpLmNvcHlQYXJhbShjb3B5T2YucGFyYW1ldGVyc1tpXSwgcmVtYXBwZXIpOworICAgIH0KKworICAgIHJldHVyblR5cGUuY29weVR5cGUoY29weU9mLnJldHVyblR5cGUsIHJlbWFwcGVyKTsKKyAgICBtYW5nbGVkTmFtZSA9IGNvcHlPZi5tYW5nbGVkTmFtZTsKKyAgICBvcCA9IGNvcHlPZi5vcDsKKyAgICBkZWZpbmVkID0gY29weU9mLmRlZmluZWQ7Cit9CisKK1RGdW5jdGlvbiogVEZ1bmN0aW9uOjpjbG9uZShUU3RydWN0dXJlTWFwJiByZW1hcHBlcikKK3sKKyAgICBURnVuY3Rpb24gKmZ1bmN0aW9uID0gbmV3IFRGdW5jdGlvbigqdGhpcywgcmVtYXBwZXIpOworCisgICAgcmV0dXJuIGZ1bmN0aW9uOworfQorCitUU3ltYm9sVGFibGVMZXZlbCogVFN5bWJvbFRhYmxlTGV2ZWw6OmNsb25lKFRTdHJ1Y3R1cmVNYXAmIHJlbWFwcGVyKQoreworICAgIFRTeW1ib2xUYWJsZUxldmVsICpzeW1UYWJsZUxldmVsID0gbmV3IFRTeW1ib2xUYWJsZUxldmVsKCk7CisgICAgdExldmVsOjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGxldmVsLmJlZ2luKCk7IGl0ZXIgIT0gbGV2ZWwuZW5kKCk7ICsraXRlcikgeworICAgICAgICBzeW1UYWJsZUxldmVsLT5pbnNlcnQoKml0ZXItPnNlY29uZC0+Y2xvbmUocmVtYXBwZXIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3ltVGFibGVMZXZlbDsKK30KKwordm9pZCBUU3ltYm9sVGFibGU6OmNvcHlUYWJsZShjb25zdCBUU3ltYm9sVGFibGUmIGNvcHlPZikKK3sKKyAgICBUU3RydWN0dXJlTWFwIHJlbWFwcGVyOworICAgIHVuaXF1ZUlkID0gY29weU9mLnVuaXF1ZUlkOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY29weU9mLnRhYmxlLnNpemUoKTsgKytpKSB7CisgICAgICAgIHRhYmxlLnB1c2hfYmFjayhjb3B5T2YudGFibGVbaV0tPmNsb25lKHJlbWFwcGVyKSk7CisgICAgfQorICAgIGZvciggdW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY29weU9mLnByZWNpc2lvblN0YWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHByZWNpc2lvblN0YWNrLnB1c2hfYmFjayggY29weU9mLnByZWNpc2lvblN0YWNrW2ldICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvU3ltYm9sVGFibGUuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1N5bWJvbFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiYzY1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1N5bWJvbFRhYmxlLmgKQEAgLTAsMCArMSwzNDggQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgX1NZTUJPTF9UQUJMRV9JTkNMVURFRF8KKyNkZWZpbmUgX1NZTUJPTF9UQUJMRV9JTkNMVURFRF8KKworLy8KKy8vIFN5bWJvbCB0YWJsZSBmb3IgcGFyc2luZy4gIEhhcyB0aGVzZSBkZXNpZ24gY2hhcmFjdGVyaXN0aWNzOgorLy8KKy8vICogU2FtZSBzeW1ib2wgdGFibGUgY2FuIGJlIHVzZWQgdG8gY29tcGlsZSBtYW55IHNoYWRlcnMsIHRvIHByZXNlcnZlCisvLyAgIGVmZm9ydCBvZiBjcmVhdGluZyBhbmQgbG9hZGluZyB3aXRoIHRoZSBsYXJnZSBudW1iZXJzIG9mIGJ1aWx0LWluCisvLyAgIHN5bWJvbHMuCisvLworLy8gKiBOYW1lIG1hbmdsaW5nIHdpbGwgYmUgdXNlZCB0byBnaXZlIGVhY2ggZnVuY3Rpb24gYSB1bmlxdWUgbmFtZQorLy8gICBzbyB0aGF0IHN5bWJvbCB0YWJsZSBsb29rdXBzIGFyZSBuZXZlciBhbWJpZ3VvdXMuICBUaGlzIGFsbG93cworLy8gICBhIHNpbXBsZXIgc3ltYm9sIHRhYmxlIHN0cnVjdHVyZS4KKy8vCisvLyAqIFB1c2hpbmcgYW5kIHBvcHBpbmcgb2Ygc2NvcGUsIHNvIHN5bWJvbCB0YWJsZSB3aWxsIHJlYWxseSBiZSBhIHN0YWNrIAorLy8gICBvZiBzeW1ib2wgdGFibGVzLiAgU2VhcmNoZWQgZnJvbSB0aGUgdG9wLCB3aXRoIG5ldyBpbnNlcnRzIGdvaW5nIGludG8KKy8vICAgdGhlIHRvcC4KKy8vCisvLyAqIENvbnN0YW50czogIENvbXBpbGUgdGltZSBjb25zdGFudCBzeW1ib2xzIHdpbGwga2VlcCB0aGVpciB2YWx1ZXMKKy8vICAgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFRoZSBwYXJzZXIgY2FuIHN1YnN0aXR1dGUgY29uc3RhbnRzIGF0IHBhcnNlCisvLyAgIHRpbWUsIGluY2x1ZGluZyBkb2luZyBjb25zdGFudCBmb2xkaW5nIGFuZCBjb25zdGFudCBwcm9wYWdhdGlvbi4KKy8vCisvLyAqIE5vIHRlbXBvcmFyaWVzOiAgVGVtcG9yYXJpZXMgbWFkZSBmcm9tIG9wZXJhdGlvbnMgKCssIC0tLCAueHksIGV0Yy4pCisvLyAgIGFyZSB0cmFja2VkIGluIHRoZSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24sIG5vdCB0aGUgc3ltYm9sIHRhYmxlLgorLy8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiY29tcGlsZXIvSW5mb1NpbmsuaCIKKyNpbmNsdWRlICJjb21waWxlci9pbnRlcm1lZGlhdGUuaCIKKworLy8KKy8vIFN5bWJvbCBiYXNlIGNsYXNzLiAgKENhbiBidWlsZCBmdW5jdGlvbnMgb3IgdmFyaWFibGVzIG91dCBvZiB0aGVzZS4uLikKKy8vCitjbGFzcyBUU3ltYm9sIHsgICAgCitwdWJsaWM6CisgICAgUE9PTF9BTExPQ0FUT1JfTkVXX0RFTEVURShHbG9iYWxQb29sQWxsb2NhdG9yKQorICAgIFRTeW1ib2woY29uc3QgVFN0cmluZyAqbikgOiAgbmFtZShuKSB7IH0KKyAgICB2aXJ0dWFsIH5UU3ltYm9sKCkgeyAvKiBkb24ndCBkZWxldGUgbmFtZSwgaXQncyBmcm9tIHRoZSBwb29sICovIH0KKyAgICBjb25zdCBUU3RyaW5nJiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gKm5hbWU7IH0KKyAgICB2aXJ0dWFsIGNvbnN0IFRTdHJpbmcmIGdldE1hbmdsZWROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0TmFtZSgpOyB9CisgICAgdmlydHVhbCBib29sIGlzRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc1ZhcmlhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2b2lkIHNldFVuaXF1ZUlkKGludCBpZCkgeyB1bmlxdWVJZCA9IGlkOyB9CisgICAgaW50IGdldFVuaXF1ZUlkKCkgY29uc3QgeyByZXR1cm4gdW5pcXVlSWQ7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChUSW5mb1NpbmsgJmluZm9TaW5rKSBjb25zdCA9IDA7CQorICAgIFRTeW1ib2woY29uc3QgVFN5bWJvbCYpOworICAgIHZpcnR1YWwgVFN5bWJvbCogY2xvbmUoVFN0cnVjdHVyZU1hcCYgcmVtYXBwZXIpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IFRTdHJpbmcgKm5hbWU7CisgICAgdW5zaWduZWQgaW50IHVuaXF1ZUlkOyAgICAgIC8vIEZvciByZWFsIGNvbXBhcmluZyBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCit9OworCisvLworLy8gVmFyaWFibGUgY2xhc3MsIG1lYW5pbmcgYSBzeW1ib2wgdGhhdCdzIG5vdCBhIGZ1bmN0aW9uLgorLy8gCisvLyBUaGVyZSBjb3VsZCBiZSBhIHNlcGFyYXRlIGNsYXNzIGhlaXJhcmNoeSBmb3IgQ29uc3RhbnQgdmFyaWFibGVzOworLy8gT25seSBvbmUgb2YgaW50LCBib29sLCBvciBmbG9hdCwgKG9yIG5vbmUpIGlzIGNvcnJlY3QgZm9yCisvLyBhbnkgcGFydGljdWxhciB1c2UsIGJ1dCBpdCdzIGVhc3kgdG8gZG8gdGhpcyB3YXksIGFuZCBkb2Vzbid0CisvLyBzZWVtIHdvcnRoIGhhdmluZyBzZXBhcmF0ZSBjbGFzc2VzLCBhbmQgImdldENvbnN0IiBjYW4ndCBzaW1wbHkgcmV0dXJuCisvLyBkaWZmZXJlbnQgdmFsdWVzIGZvciBkaWZmZXJlbnQgdHlwZXMgcG9seW1vcnBoaWNhbGx5LCBzbyB0aGlzIGlzIAorLy8ganVzdCBzaW1wbGUgYW5kIHByYWdtYXRpYy4KKy8vCitjbGFzcyBUVmFyaWFibGUgOiBwdWJsaWMgVFN5bWJvbCB7CitwdWJsaWM6CisgICAgVFZhcmlhYmxlKGNvbnN0IFRTdHJpbmcgKm5hbWUsIGNvbnN0IFRUeXBlJiB0LCBib29sIHVUID0gZmFsc2UgKSA6IFRTeW1ib2wobmFtZSksIHR5cGUodCksIHVzZXJUeXBlKHVUKSwgdW5pb25BcnJheSgwKSwgYXJyYXlJbmZvcm1hdGlvblR5cGUoMCkgeyB9CisgICAgdmlydHVhbCB+VFZhcmlhYmxlKCkgeyB9CisgICAgdmlydHVhbCBib29sIGlzVmFyaWFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9ICAgIAorICAgIFRUeXBlJiBnZXRUeXBlKCkgeyByZXR1cm4gdHlwZTsgfSAgICAKKyAgICBjb25zdCBUVHlwZSYgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGU7IH0KKyAgICBib29sIGlzVXNlclR5cGUoKSBjb25zdCB7IHJldHVybiB1c2VyVHlwZTsgfQorICAgIHZvaWQgc2V0UXVhbGlmaWVyKFRRdWFsaWZpZXIgcXVhbGlmaWVyKSB7IHR5cGUuc2V0UXVhbGlmaWVyKHF1YWxpZmllcik7IH0KKyAgICB2b2lkIHVwZGF0ZUFycmF5SW5mb3JtYXRpb25UeXBlKFRUeXBlICp0KSB7IGFycmF5SW5mb3JtYXRpb25UeXBlID0gdDsgfQorICAgIFRUeXBlKiBnZXRBcnJheUluZm9ybWF0aW9uVHlwZSgpIHsgcmV0dXJuIGFycmF5SW5mb3JtYXRpb25UeXBlOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChUSW5mb1NpbmsgJmluZm9TaW5rKSBjb25zdDsKKworICAgIENvbnN0YW50VW5pb24qIGdldENvbnN0UG9pbnRlcigpCisgICAgeyAKKyAgICAgICAgaWYgKCF1bmlvbkFycmF5KQorICAgICAgICAgICAgdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uW3R5cGUuZ2V0T2JqZWN0U2l6ZSgpXTsKKworICAgICAgICByZXR1cm4gdW5pb25BcnJheTsKKyAgICB9CisKKyAgICBDb25zdGFudFVuaW9uKiBnZXRDb25zdFBvaW50ZXIoKSBjb25zdCB7IHJldHVybiB1bmlvbkFycmF5OyB9CisKKyAgICB2b2lkIHNoYXJlQ29uc3RQb2ludGVyKCBDb25zdGFudFVuaW9uICpjb25zdEFycmF5KQorICAgIHsKKyAgICAgICAgaWYgKHVuaW9uQXJyYXkgPT0gY29uc3RBcnJheSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBkZWxldGVbXSB1bmlvbkFycmF5OworICAgICAgICB1bmlvbkFycmF5ID0gY29uc3RBcnJheTsgIAorICAgIH0KKyAgICBUVmFyaWFibGUoY29uc3QgVFZhcmlhYmxlJiwgVFN0cnVjdHVyZU1hcCYgcmVtYXBwZXIpOyAvLyBjb3B5IGNvbnN0cnVjdG9yCisgICAgdmlydHVhbCBUVmFyaWFibGUqIGNsb25lKFRTdHJ1Y3R1cmVNYXAmIHJlbWFwcGVyKTsKKworcHJvdGVjdGVkOgorICAgIFRUeXBlIHR5cGU7CisgICAgYm9vbCB1c2VyVHlwZTsKKyAgICAvLyB3ZSBhcmUgYXNzdW1pbmcgdGhhdCBQb29sIEFsbG9jYXRvciB3aWxsIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdW5pb25BcnJheQorICAgIC8vIHdoZW4gdGhpcyBvYmplY3QgaXMgZGVzdHJveWVkCisgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheTsKKyAgICBUVHlwZSAqYXJyYXlJbmZvcm1hdGlvblR5cGU7ICAvLyB0aGlzIGlzIHVzZWQgZm9yIHVwZGF0aW5nIG1heEFycmF5U2l6ZSBpbiBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gYSBnaXZlbiBzeW1ib2wKK307CisKKy8vCisvLyBUaGUgZnVuY3Rpb24gc3ViLWNsYXNzIG9mIHN5bWJvbHMgYW5kIHRoZSBwYXJzZXIgd2lsbCBuZWVkIHRvCisvLyBzaGFyZSB0aGlzIGRlZmluaXRpb24gb2YgYSBmdW5jdGlvbiBwYXJhbWV0ZXIuCisvLworc3RydWN0IFRQYXJhbWV0ZXIgeworICAgIFRTdHJpbmcgKm5hbWU7CisgICAgVFR5cGUqIHR5cGU7CisgICAgdm9pZCBjb3B5UGFyYW0oY29uc3QgVFBhcmFtZXRlciYgcGFyYW0sIFRTdHJ1Y3R1cmVNYXAmIHJlbWFwcGVyKQorICAgIHsKKyAgICAgICAgbmFtZSA9IE5ld1Bvb2xUU3RyaW5nKHBhcmFtLm5hbWUtPmNfc3RyKCkpOworICAgICAgICB0eXBlID0gcGFyYW0udHlwZS0+Y2xvbmUocmVtYXBwZXIpOworICAgIH0KK307CisKKy8vCisvLyBUaGUgZnVuY3Rpb24gc3ViLWNsYXNzIG9mIGEgc3ltYm9sLiAgCisvLworY2xhc3MgVEZ1bmN0aW9uIDogcHVibGljIFRTeW1ib2wgeworcHVibGljOgorICAgIFRGdW5jdGlvbihUT3BlcmF0b3IgbykgOgorICAgICAgICBUU3ltYm9sKDApLAorICAgICAgICByZXR1cm5UeXBlKFRUeXBlKEVidFZvaWQsIEVicFVuZGVmaW5lZCkpLAorICAgICAgICBvcChvKSwKKyAgICAgICAgZGVmaW5lZChmYWxzZSkgeyB9CisgICAgVEZ1bmN0aW9uKGNvbnN0IFRTdHJpbmcgKm5hbWUsIFRUeXBlJiByZXRUeXBlLCBUT3BlcmF0b3IgdE9wID0gRU9wTnVsbCkgOiAKKyAgICAgICAgVFN5bWJvbChuYW1lKSwgCisgICAgICAgIHJldHVyblR5cGUocmV0VHlwZSksCisgICAgICAgIG1hbmdsZWROYW1lKFRGdW5jdGlvbjo6bWFuZ2xlTmFtZSgqbmFtZSkpLAorICAgICAgICBvcCh0T3ApLAorICAgICAgICBkZWZpbmVkKGZhbHNlKSB7IH0KKyAgICB2aXJ0dWFsIH5URnVuY3Rpb24oKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0gICAgCisKKyAgICBzdGF0aWMgVFN0cmluZyBtYW5nbGVOYW1lKGNvbnN0IFRTdHJpbmcmIG5hbWUpIHsgcmV0dXJuIG5hbWUgKyAnKCc7IH0KKyAgICBzdGF0aWMgVFN0cmluZyB1bm1hbmdsZU5hbWUoY29uc3QgVFN0cmluZyYgbWFuZ2xlZE5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gVFN0cmluZyhtYW5nbGVkTmFtZS5jX3N0cigpLCBtYW5nbGVkTmFtZS5maW5kX2ZpcnN0X29mKCcoJykpOworICAgIH0KKworICAgIHZvaWQgYWRkUGFyYW1ldGVyKFRQYXJhbWV0ZXImIHApIAorICAgIHsgCisgICAgICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHApOworICAgICAgICBtYW5nbGVkTmFtZSA9IG1hbmdsZWROYW1lICsgcC50eXBlLT5nZXRNYW5nbGVkTmFtZSgpOworICAgIH0KKworICAgIGNvbnN0IFRTdHJpbmcmIGdldE1hbmdsZWROYW1lKCkgY29uc3QgeyByZXR1cm4gbWFuZ2xlZE5hbWU7IH0KKyAgICBjb25zdCBUVHlwZSYgZ2V0UmV0dXJuVHlwZSgpIGNvbnN0IHsgcmV0dXJuIHJldHVyblR5cGU7IH0KKworICAgIHZvaWQgcmVsYXRlVG9PcGVyYXRvcihUT3BlcmF0b3IgbykgeyBvcCA9IG87IH0KKyAgICBUT3BlcmF0b3IgZ2V0QnVpbHRJbk9wKCkgY29uc3QgeyByZXR1cm4gb3A7IH0KKworICAgIHZvaWQgcmVsYXRlVG9FeHRlbnNpb24oY29uc3QgVFN0cmluZyYgZXh0KSB7IGV4dGVuc2lvbiA9IGV4dDsgfQorICAgIGNvbnN0IFRTdHJpbmcmIGdldEV4dGVuc2lvbigpIGNvbnN0IHsgcmV0dXJuIGV4dGVuc2lvbjsgfQorCisgICAgdm9pZCBzZXREZWZpbmVkKCkgeyBkZWZpbmVkID0gdHJ1ZTsgfQorICAgIGJvb2wgaXNEZWZpbmVkKCkgeyByZXR1cm4gZGVmaW5lZDsgfQorCisgICAgaW50IGdldFBhcmFtQ291bnQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHBhcmFtZXRlcnMuc2l6ZSgpKTsgfSAgCisgICAgY29uc3QgVFBhcmFtZXRlciYgZ2V0UGFyYW0oaW50IGkpIGNvbnN0IHsgcmV0dXJuIHBhcmFtZXRlcnNbaV07IH0KKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFRJbmZvU2luayAmaW5mb1NpbmspIGNvbnN0OworICAgIFRGdW5jdGlvbihjb25zdCBURnVuY3Rpb24mLCBUU3RydWN0dXJlTWFwJiByZW1hcHBlcik7CisgICAgdmlydHVhbCBURnVuY3Rpb24qIGNsb25lKFRTdHJ1Y3R1cmVNYXAmIHJlbWFwcGVyKTsKKworcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgVFZlY3RvcjxUUGFyYW1ldGVyPiBUUGFyYW1MaXN0OworICAgIFRQYXJhbUxpc3QgcGFyYW1ldGVyczsKKyAgICBUVHlwZSByZXR1cm5UeXBlOworICAgIFRTdHJpbmcgbWFuZ2xlZE5hbWU7CisgICAgVE9wZXJhdG9yIG9wOworICAgIFRTdHJpbmcgZXh0ZW5zaW9uOworICAgIGJvb2wgZGVmaW5lZDsKK307CisKKworY2xhc3MgVFN5bWJvbFRhYmxlTGV2ZWwgeworcHVibGljOgorICAgIHR5cGVkZWYgVE1hcDxUU3RyaW5nLCBUU3ltYm9sKj4gdExldmVsOworICAgIHR5cGVkZWYgdExldmVsOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIGNvbnN0IHRMZXZlbDo6dmFsdWVfdHlwZSB0TGV2ZWxQYWlyOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHRMZXZlbDo6aXRlcmF0b3IsIGJvb2w+IHRJbnNlcnRSZXN1bHQ7CisKKyAgICBQT09MX0FMTE9DQVRPUl9ORVdfREVMRVRFKEdsb2JhbFBvb2xBbGxvY2F0b3IpCisgICAgVFN5bWJvbFRhYmxlTGV2ZWwoKSB7IH0KKyAgICB+VFN5bWJvbFRhYmxlTGV2ZWwoKTsKKworICAgIGJvb2wgaW5zZXJ0KFRTeW1ib2wmIHN5bWJvbCkgCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyByZXR1cm5pbmcgdHJ1ZSBtZWFucyBzeW1ib2wgd2FzIGFkZGVkIHRvIHRoZSB0YWJsZQorICAgICAgICAvLworICAgICAgICB0SW5zZXJ0UmVzdWx0IHJlc3VsdDsKKyAgICAgICAgcmVzdWx0ID0gbGV2ZWwuaW5zZXJ0KHRMZXZlbFBhaXIoc3ltYm9sLmdldE1hbmdsZWROYW1lKCksICZzeW1ib2wpKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0LnNlY29uZDsKKyAgICB9CisKKyAgICBUU3ltYm9sKiBmaW5kKGNvbnN0IFRTdHJpbmcmIG5hbWUpIGNvbnN0CisgICAgeworICAgICAgICB0TGV2ZWw6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGV2ZWwuZmluZChuYW1lKTsKKyAgICAgICAgaWYgKGl0ID09IGxldmVsLmVuZCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoKml0KS5zZWNvbmQ7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGxldmVsLmJlZ2luKCk7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBsZXZlbC5lbmQoKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbGF0ZVRvT3BlcmF0b3IoY29uc3QgY2hhciogbmFtZSwgVE9wZXJhdG9yIG9wKTsKKyAgICB2b2lkIHJlbGF0ZVRvRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRTdHJpbmcmIGV4dCk7CisgICAgdm9pZCBkdW1wKFRJbmZvU2luayAmaW5mb1NpbmspIGNvbnN0OworICAgIFRTeW1ib2xUYWJsZUxldmVsKiBjbG9uZShUU3RydWN0dXJlTWFwJiByZW1hcHBlcik7CisKK3Byb3RlY3RlZDoKKyAgICB0TGV2ZWwgbGV2ZWw7Cit9OworCitjbGFzcyBUU3ltYm9sVGFibGUgeworcHVibGljOgorICAgIFRTeW1ib2xUYWJsZSgpIDogdW5pcXVlSWQoMCkKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBzeW1ib2wgdGFibGUgY2Fubm90IGJlIHVzZWQgdW50aWwgcHVzaCgpIGlzIGNhbGxlZCwgYnV0CisgICAgICAgIC8vIHRoZSBsYWNrIG9mIGFuIGluaXRpYWwgY2FsbCB0byBwdXNoKCkgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0CisgICAgICAgIC8vIHRoYXQgdGhlIHN5bWJvbCB0YWJsZSBoYXMgbm90IGJlZW4gcHJlbG9hZGVkIHdpdGggYnVpbHQtaW5zLgorICAgICAgICAvLworICAgIH0KKworICAgIH5UU3ltYm9sVGFibGUoKQorICAgIHsKKyAgICAgICAgLy8gbGV2ZWwgMCBpcyBhbHdheXMgYnVpbHQgSW4gc3ltYm9scywgc28gd2UgbmV2ZXIgcG9wIHRoYXQgb3V0CisgICAgICAgIHdoaWxlICh0YWJsZS5zaXplKCkgPiAxKQorICAgICAgICAgICAgcG9wKCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXaGVuIHRoZSBzeW1ib2wgdGFibGUgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYnVpbHQtaW5zLCB0aGVyZSBzaG91bGQKKyAgICAvLyAncHVzaCcgY2FsbHMsIHNvIHRoYXQgYnVpbHQtaW5zIGFyZSBhdCBsZXZlbCAwIGFuZCB0aGUgc2hhZGVyCisgICAgLy8gZ2xvYmFscyBhcmUgYXQgbGV2ZWwgMS4KKyAgICAvLworICAgIGJvb2wgaXNFbXB0eSgpIHsgcmV0dXJuIHRhYmxlLnNpemUoKSA9PSAwOyB9CisgICAgYm9vbCBhdEJ1aWx0SW5MZXZlbCgpIHsgcmV0dXJuIHRhYmxlLnNpemUoKSA9PSAxOyB9CisgICAgYm9vbCBhdEdsb2JhbExldmVsKCkgeyByZXR1cm4gdGFibGUuc2l6ZSgpIDw9IDI7IH0KKyAgICB2b2lkIHB1c2goKQorICAgIHsKKyAgICAgICAgdGFibGUucHVzaF9iYWNrKG5ldyBUU3ltYm9sVGFibGVMZXZlbCk7CisgICAgICAgIHByZWNpc2lvblN0YWNrLnB1c2hfYmFjayggUHJlY2lzaW9uU3RhY2tMZXZlbCgpICk7CisgICAgfQorCisgICAgdm9pZCBwb3AoKQorICAgIHsgCisgICAgICAgIGRlbGV0ZSB0YWJsZVtjdXJyZW50TGV2ZWwoKV07IAorICAgICAgICB0YWJsZS5wb3BfYmFjaygpOyAKKyAgICAgICAgcHJlY2lzaW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICB9CisKKyAgICBib29sIGluc2VydChUU3ltYm9sJiBzeW1ib2wpCisgICAgeworICAgICAgICBzeW1ib2wuc2V0VW5pcXVlSWQoKyt1bmlxdWVJZCk7CisgICAgICAgIHJldHVybiB0YWJsZVtjdXJyZW50TGV2ZWwoKV0tPmluc2VydChzeW1ib2wpOworICAgIH0KKworICAgIFRTeW1ib2wqIGZpbmQoY29uc3QgVFN0cmluZyYgbmFtZSwgYm9vbCogYnVpbHRJbiA9IDAsIGJvb2wgKnNhbWVTY29wZSA9IDApIAorICAgIHsKKyAgICAgICAgaW50IGxldmVsID0gY3VycmVudExldmVsKCk7CisgICAgICAgIFRTeW1ib2wqIHN5bWJvbDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3ltYm9sID0gdGFibGVbbGV2ZWxdLT5maW5kKG5hbWUpOworICAgICAgICAgICAgLS1sZXZlbDsKKyAgICAgICAgfSB3aGlsZSAoc3ltYm9sID09IDAgJiYgbGV2ZWwgPj0gMCk7CisgICAgICAgIGxldmVsKys7CisgICAgICAgIGlmIChidWlsdEluKQorICAgICAgICAgICAgKmJ1aWx0SW4gPSBsZXZlbCA9PSAwOworICAgICAgICBpZiAoc2FtZVNjb3BlKQorICAgICAgICAgICAgKnNhbWVTY29wZSA9IGxldmVsID09IGN1cnJlbnRMZXZlbCgpOworICAgICAgICByZXR1cm4gc3ltYm9sOworICAgIH0KKworICAgIFRTeW1ib2xUYWJsZUxldmVsKiBnZXRHbG9iYWxMZXZlbCgpIHsKKyAgICAgICAgYXNzZXJ0KHRhYmxlLnNpemUoKSA+PSAyKTsKKyAgICAgICAgcmV0dXJuIHRhYmxlWzFdOworICAgIH0KKyAgICB2b2lkIHJlbGF0ZVRvT3BlcmF0b3IoY29uc3QgY2hhciogbmFtZSwgVE9wZXJhdG9yIG9wKSB7CisgICAgICAgIHRhYmxlWzBdLT5yZWxhdGVUb09wZXJhdG9yKG5hbWUsIG9wKTsKKyAgICB9CisgICAgdm9pZCByZWxhdGVUb0V4dGVuc2lvbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUU3RyaW5nJiBleHQpIHsKKyAgICAgICAgdGFibGVbMF0tPnJlbGF0ZVRvRXh0ZW5zaW9uKG5hbWUsIGV4dCk7CisgICAgfQorICAgIGludCBnZXRNYXhTeW1ib2xJZCgpIHsgcmV0dXJuIHVuaXF1ZUlkOyB9CisgICAgdm9pZCBkdW1wKFRJbmZvU2luayAmaW5mb1NpbmspIGNvbnN0OworICAgIHZvaWQgY29weVRhYmxlKGNvbnN0IFRTeW1ib2xUYWJsZSYgY29weU9mKTsKKworICAgIHZvaWQgc2V0RGVmYXVsdFByZWNpc2lvbiggVEJhc2ljVHlwZSB0eXBlLCBUUHJlY2lzaW9uIHByZWMgKXsKKyAgICAgICAgaWYoIHR5cGUgIT0gRWJ0RmxvYXQgJiYgdHlwZSAhPSBFYnRJbnQgKSByZXR1cm47IC8vIE9ubHkgc2V0IGRlZmF1bHQgcHJlY2lzaW9uIGZvciBpbnQvZmxvYXQKKyAgICAgICAgaW50IGluZGV4T2ZMYXN0RWxlbWVudCA9IHN0YXRpY19jYXN0PGludD4ocHJlY2lzaW9uU3RhY2suc2l6ZSgpKSAtIDE7CisgICAgICAgIHByZWNpc2lvblN0YWNrW2luZGV4T2ZMYXN0RWxlbWVudF1bdHlwZV0gPSBwcmVjOyAvLyBVc2VzIG1hcCBvcGVyYXRvciBbXSwgb3ZlcndyaXRlcyB0aGUgY3VycmVudCB2YWx1ZQorICAgIH0KKworICAgIC8vIFNlYXJjaGVzIGRvd24gdGhlIHByZWNpc2lvblN0YWNrIGZvciBhIHByZWNpc2lvbiBxdWFsaWZpZXIgZm9yIHRoZSBzcGVjaWZpZWQgVEJhc2ljVHlwZQorICAgIFRQcmVjaXNpb24gZ2V0RGVmYXVsdFByZWNpc2lvbiggVEJhc2ljVHlwZSB0eXBlKXsKKyAgICAgICAgaWYoIHR5cGUgIT0gRWJ0RmxvYXQgJiYgdHlwZSAhPSBFYnRJbnQgKSByZXR1cm4gRWJwVW5kZWZpbmVkOworICAgICAgICBpbnQgbGV2ZWwgPSBzdGF0aWNfY2FzdDxpbnQ+KHByZWNpc2lvblN0YWNrLnNpemUoKSkgLSAxOworICAgICAgICBhc3NlcnQoIGxldmVsID49IDApOyAvLyBKdXN0IHRvIGJlIHNhZmUuIFNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICBQcmVjaXNpb25TdGFja0xldmVsOjppdGVyYXRvciBpdDsKKyAgICAgICAgVFByZWNpc2lvbiBwcmVjID0gRWJwVW5kZWZpbmVkOyAvLyBJZiB3ZSBkb250IGZpbmQgYW55dGhpbmcgd2UgcmV0dXJuIHRoaXMuIFNob3VsZCB3ZSBlcnJvciBjaGVjayB0aGlzPworICAgICAgICB3aGlsZSggbGV2ZWwgPj0gMCApeworICAgICAgICAgICAgaXQgPSBwcmVjaXNpb25TdGFja1tsZXZlbF0uZmluZCggdHlwZSApOworICAgICAgICAgICAgaWYoIGl0ICE9IHByZWNpc2lvblN0YWNrW2xldmVsXS5lbmQoKSApeworICAgICAgICAgICAgICAgIHByZWMgPSAoKml0KS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcmVjOworICAgIH0KKworcHJvdGVjdGVkOiAgICAKKyAgICBpbnQgY3VycmVudExldmVsKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0YWJsZS5zaXplKCkpIC0gMTsgfQorCisgICAgc3RkOjp2ZWN0b3I8VFN5bWJvbFRhYmxlTGV2ZWwqPiB0YWJsZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPCBUQmFzaWNUeXBlLCBUUHJlY2lzaW9uID4gUHJlY2lzaW9uU3RhY2tMZXZlbDsKKyAgICBzdGQ6OnZlY3RvcjwgUHJlY2lzaW9uU3RhY2tMZXZlbCA+IHByZWNpc2lvblN0YWNrOworICAgIGludCB1bmlxdWVJZDsgICAgIC8vIGZvciB1bmlxdWUgaWRlbnRpZmljYXRpb24gaW4gY29kZSBnZW5lcmF0aW9uCit9OworCisjZW5kaWYgLy8gX1NZTUJPTF9UQUJMRV9JTkNMVURFRF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1RyYW5zbGF0b3JHTFNMLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1RyYW5zbGF0b3JHTFNMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTYzYWUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVHJhbnNsYXRvckdMU0wuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9UcmFuc2xhdG9yR0xTTC5oIgorCisjaW5jbHVkZSAiY29tcGlsZXIvT3V0cHV0R0xTTC5oIgorI2luY2x1ZGUgImNvbXBpbGVyL1ZlcnNpb25HTFNMLmgiCisKK3N0YXRpYyB2b2lkIHdyaXRlVmVyc2lvbihTaFNoYWRlclR5cGUgdHlwZSwgVEludGVybU5vZGUqIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgVEluZm9TaW5rQmFzZSYgc2luaykgeworICAgIFRWZXJzaW9uR0xTTCB2ZXJzaW9uR0xTTCh0eXBlKTsKKyAgICByb290LT50cmF2ZXJzZSgmdmVyc2lvbkdMU0wpOworICAgIGludCB2ZXJzaW9uID0gdmVyc2lvbkdMU0wuZ2V0VmVyc2lvbigpOworICAgIC8vIFdlIG5lZWQgdG8gd3JpdGUgdmVyc2lvbiBkaXJlY3RpdmUgb25seSBpZiBpdCBpcyBncmVhdGVyIHRoYW4gMTEwLgorICAgIC8vIElmIHRoZXJlIGlzIG5vIHZlcnNpb24gZGlyZWN0aXZlIGluIHRoZSBzaGFkZXIsIDExMCBpcyBpbXBsaWVkLgorICAgIGlmICh2ZXJzaW9uID4gMTEwKSB7CisgICAgICAgIHNpbmsgPDwgIiN2ZXJzaW9uICIgPDwgdmVyc2lvbiA8PCAiXG4iOworICAgIH0KK30KKworVHJhbnNsYXRvckdMU0w6OlRyYW5zbGF0b3JHTFNMKFNoU2hhZGVyVHlwZSB0eXBlLCBTaFNoYWRlclNwZWMgc3BlYykKKyAgICA6IFRDb21waWxlcih0eXBlLCBzcGVjKSB7Cit9CisKK3ZvaWQgVHJhbnNsYXRvckdMU0w6OnRyYW5zbGF0ZShUSW50ZXJtTm9kZSogcm9vdCkgeworICAgIFRJbmZvU2lua0Jhc2UmIHNpbmsgPSBnZXRJbmZvU2luaygpLm9iajsKKworICAgIC8vIFdyaXRlIEdMU0wgdmVyc2lvbi4KKyAgICB3cml0ZVZlcnNpb24oZ2V0U2hhZGVyVHlwZSgpLCByb290LCBzaW5rKTsKKworICAgIC8vIFdyaXRlIHRyYW5zbGF0ZWQgc2hhZGVyLgorICAgIFRPdXRwdXRHTFNMIG91dHB1dEdMU0woc2luayk7CisgICAgcm9vdC0+dHJhdmVyc2UoJm91dHB1dEdMU0wpOworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVHJhbnNsYXRvckdMU0wuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1RyYW5zbGF0b3JHTFNMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjZTA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1RyYW5zbGF0b3JHTFNMLmgKQEAgLTAsMCArMSwyMCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2lmbmRlZiBDT01QSUxFUl9UUkFOU0xBVE9SR0xTTF9IXworI2RlZmluZSBDT01QSUxFUl9UUkFOU0xBVE9SR0xTTF9IXworCisjaW5jbHVkZSAiY29tcGlsZXIvU2hIYW5kbGUuaCIKKworY2xhc3MgVHJhbnNsYXRvckdMU0wgOiBwdWJsaWMgVENvbXBpbGVyIHsKK3B1YmxpYzoKKyAgICBUcmFuc2xhdG9yR0xTTChTaFNoYWRlclR5cGUgdHlwZSwgU2hTaGFkZXJTcGVjIHNwZWMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIHRyYW5zbGF0ZShUSW50ZXJtTm9kZSogcm9vdCk7Cit9OworCisjZW5kaWYgIC8vIENPTVBJTEVSX1RSQU5TTEFUT1JHTFNMX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9UcmFuc2xhdG9ySExTTC5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9UcmFuc2xhdG9ySExTTC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkN2YxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1RyYW5zbGF0b3JITFNMLmNwcApAQCAtMCwwICsxLDIyIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaW5jbHVkZSAiY29tcGlsZXIvVHJhbnNsYXRvckhMU0wuaCIKKworI2luY2x1ZGUgImNvbXBpbGVyL091dHB1dEhMU0wuaCIKKworVHJhbnNsYXRvckhMU0w6OlRyYW5zbGF0b3JITFNMKFNoU2hhZGVyVHlwZSB0eXBlLCBTaFNoYWRlclNwZWMgc3BlYykKKyAgICA6IFRDb21waWxlcih0eXBlLCBzcGVjKQoreworfQorCit2b2lkIFRyYW5zbGF0b3JITFNMOjp0cmFuc2xhdGUoVEludGVybU5vZGUgKnJvb3QpCit7CisgICAgVFBhcnNlQ29udGV4dCYgcGFyc2VDb250ZXh0ID0gKkdldEdsb2JhbFBhcnNlQ29udGV4dCgpOworICAgIHNoOjpPdXRwdXRITFNMIG91dHB1dEhMU0wocGFyc2VDb250ZXh0KTsKKworICAgIG91dHB1dEhMU0wub3V0cHV0KCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9UcmFuc2xhdG9ySExTTC5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVHJhbnNsYXRvckhMU0wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Y2NzJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVHJhbnNsYXRvckhMU0wuaApAQCAtMCwwICsxLDIwIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaWZuZGVmIENPTVBJTEVSX1RSQU5TTEFUT1JITFNMX0hfCisjZGVmaW5lIENPTVBJTEVSX1RSQU5TTEFUT1JITFNMX0hfCisKKyNpbmNsdWRlICJjb21waWxlci9TaEhhbmRsZS5oIgorCitjbGFzcyBUcmFuc2xhdG9ySExTTCA6IHB1YmxpYyBUQ29tcGlsZXIgeworcHVibGljOgorICAgIFRyYW5zbGF0b3JITFNMKFNoU2hhZGVyVHlwZSB0eXBlLCBTaFNoYWRlclNwZWMgc3BlYyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgdHJhbnNsYXRlKFRJbnRlcm1Ob2RlKiByb290KTsKK307CisKKyNlbmRpZiAgLy8gQ09NUElMRVJfVFJBTlNMQVRPUkhMU0xfSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1R5cGVzLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZmNjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9UeXBlcy5oCkBAIC0wLDAgKzEsMjkzIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaWZuZGVmIF9UWVBFU19JTkNMVURFRAorI2RlZmluZSBfVFlQRVNfSU5DTFVERUQKKworI2luY2x1ZGUgImNvbXBpbGVyL0Jhc2VUeXBlcy5oIgorI2luY2x1ZGUgImNvbXBpbGVyL0NvbW1vbi5oIgorI2luY2x1ZGUgImNvbXBpbGVyL2RlYnVnLmgiCisKKy8vCisvLyBOZWVkIHRvIGhhdmUgYXNzb2NpYXRpb24gb2YgbGluZSBudW1iZXJzIHRvIHR5cGVzIGluIGEgbGlzdCBmb3IgYnVpbGRpbmcgc3RydWN0cy4KKy8vCitjbGFzcyBUVHlwZTsKK3N0cnVjdCBUVHlwZUxpbmUgeworICAgIFRUeXBlKiB0eXBlOworICAgIGludCBsaW5lOworfTsKK3R5cGVkZWYgVFZlY3RvcjxUVHlwZUxpbmU+IFRUeXBlTGlzdDsKKworaW5saW5lIFRUeXBlTGlzdCogTmV3UG9vbFRUeXBlTGlzdCgpCit7CisgICAgdm9pZCogbWVtb3J5ID0gR2xvYmFsUG9vbEFsbG9jYXRvci5hbGxvY2F0ZShzaXplb2YoVFR5cGVMaXN0KSk7CisgICAgcmV0dXJuIG5ldyhtZW1vcnkpIFRUeXBlTGlzdDsKK30KKworLy8KKy8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhIHByb2JsZW0gd2l0aCB0aGUgeWFjYyBzdGFjaywgIEl0IGNhbid0IGhhdmUKKy8vIHR5cGVzIHRoYXQgaXQgdGhpbmtzIGhhdmUgbm9uLXRyaXZpYWwgY29uc3RydWN0b3JzLiAgSXQgc2hvdWxkCisvLyBqdXN0IGJlIHVzZWQgd2hpbGUgcmVjb2duaXppbmcgdGhlIGdyYW1tYXIsIG5vdCBhbnl0aGluZyBlbHNlLiAgUG9pbnRlcnMKKy8vIGNvdWxkIGJlIHVzZWQsIGJ1dCBhbHNvIHRyeWluZyB0byBhdm9pZCBsb3RzIG9mIG1lbW9yeSBtYW5hZ2VtZW50IG92ZXJoZWFkLgorLy8KKy8vIE5vdCBhcyBiYWQgYXMgaXQgbG9va3MsIHRoZXJlIGlzIG5vIGFjdHVhbCBhc3N1bXB0aW9uIHRoYXQgdGhlIGZpZWxkcworLy8gbWF0Y2ggdXAgb3IgYXJlIG5hbWUgdGhlIHNhbWUgb3IgYW55dGhpbmcgbGlrZSB0aGF0LgorLy8KK2NsYXNzIFRQdWJsaWNUeXBlIHsKK3B1YmxpYzoKKyAgICBUQmFzaWNUeXBlIHR5cGU7CisgICAgVFF1YWxpZmllciBxdWFsaWZpZXI7CisgICAgVFByZWNpc2lvbiBwcmVjaXNpb247CisgICAgaW50IHNpemU7ICAgICAgICAgIC8vIHNpemUgb2YgdmVjdG9yIG9yIG1hdHJpeCwgbm90IHNpemUgb2YgYXJyYXkKKyAgICBib29sIG1hdHJpeDsKKyAgICBib29sIGFycmF5OworICAgIGludCBhcnJheVNpemU7CisgICAgVFR5cGUqIHVzZXJEZWY7CisgICAgaW50IGxpbmU7CisKKyAgICB2b2lkIHNldEJhc2ljKFRCYXNpY1R5cGUgYnQsIFRRdWFsaWZpZXIgcSwgaW50IGxuID0gMCkKKyAgICB7CisgICAgICAgIHR5cGUgPSBidDsKKyAgICAgICAgcXVhbGlmaWVyID0gcTsKKyAgICAgICAgcHJlY2lzaW9uID0gRWJwVW5kZWZpbmVkOworICAgICAgICBzaXplID0gMTsKKyAgICAgICAgbWF0cml4ID0gZmFsc2U7CisgICAgICAgIGFycmF5ID0gZmFsc2U7CisgICAgICAgIGFycmF5U2l6ZSA9IDA7CisgICAgICAgIHVzZXJEZWYgPSAwOworICAgICAgICBsaW5lID0gbG47CisgICAgfQorCisgICAgdm9pZCBzZXRBZ2dyZWdhdGUoaW50IHMsIGJvb2wgbSA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgc2l6ZSA9IHM7CisgICAgICAgIG1hdHJpeCA9IG07CisgICAgfQorCisgICAgdm9pZCBzZXRBcnJheShib29sIGEsIGludCBzID0gMCkKKyAgICB7CisgICAgICAgIGFycmF5ID0gYTsKKyAgICAgICAgYXJyYXlTaXplID0gczsKKyAgICB9Cit9OworCit0eXBlZGVmIFRNYXA8VFR5cGVMaXN0KiwgVFR5cGVMaXN0Kj4gVFN0cnVjdHVyZU1hcDsKK3R5cGVkZWYgVE1hcDxUVHlwZUxpc3QqLCBUVHlwZUxpc3QqPjo6aXRlcmF0b3IgVFN0cnVjdHVyZU1hcEl0ZXJhdG9yOworLy8KKy8vIEJhc2UgY2xhc3MgZm9yIHRoaW5ncyB0aGF0IGhhdmUgYSB0eXBlLgorLy8KK2NsYXNzIFRUeXBlIHsKK3B1YmxpYzoKKyAgICBQT09MX0FMTE9DQVRPUl9ORVdfREVMRVRFKEdsb2JhbFBvb2xBbGxvY2F0b3IpCisgICAgVFR5cGUoKSB7fQorICAgIFRUeXBlKFRCYXNpY1R5cGUgdCwgVFByZWNpc2lvbiBwLCBUUXVhbGlmaWVyIHEgPSBFdnFUZW1wb3JhcnksIGludCBzID0gMSwgYm9vbCBtID0gZmFsc2UsIGJvb2wgYSA9IGZhbHNlKSA6CisgICAgICAgICAgICB0eXBlKHQpLCBwcmVjaXNpb24ocCksIHF1YWxpZmllcihxKSwgc2l6ZShzKSwgbWF0cml4KG0pLCBhcnJheShhKSwgYXJyYXlTaXplKDApLAorICAgICAgICAgICAgbWF4QXJyYXlTaXplKDApLCBhcnJheUluZm9ybWF0aW9uVHlwZSgwKSwgc3RydWN0dXJlKDApLCBzdHJ1Y3R1cmVTaXplKDApLCBmaWVsZE5hbWUoMCksIG1hbmdsZWQoMCksIHR5cGVOYW1lKDApCisgICAgeworICAgIH0KKyAgICBleHBsaWNpdCBUVHlwZShjb25zdCBUUHVibGljVHlwZSAmcCkgOgorICAgICAgICAgICAgdHlwZShwLnR5cGUpLCBwcmVjaXNpb24ocC5wcmVjaXNpb24pLCBxdWFsaWZpZXIocC5xdWFsaWZpZXIpLCBzaXplKHAuc2l6ZSksIG1hdHJpeChwLm1hdHJpeCksIGFycmF5KHAuYXJyYXkpLCBhcnJheVNpemUocC5hcnJheVNpemUpLAorICAgICAgICAgICAgbWF4QXJyYXlTaXplKDApLCBhcnJheUluZm9ybWF0aW9uVHlwZSgwKSwgc3RydWN0dXJlKDApLCBzdHJ1Y3R1cmVTaXplKDApLCBmaWVsZE5hbWUoMCksIG1hbmdsZWQoMCksIHR5cGVOYW1lKDApCisgICAgeworICAgICAgICBpZiAocC51c2VyRGVmKSB7CisgICAgICAgICAgICBzdHJ1Y3R1cmUgPSBwLnVzZXJEZWYtPmdldFN0cnVjdCgpOworICAgICAgICAgICAgdHlwZU5hbWUgPSBOZXdQb29sVFN0cmluZyhwLnVzZXJEZWYtPmdldFR5cGVOYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgVFR5cGUoVFR5cGVMaXN0KiB1c2VyRGVmLCBjb25zdCBUU3RyaW5nJiBuLCBUUHJlY2lzaW9uIHAgPSBFYnBVbmRlZmluZWQpIDoKKyAgICAgICAgICAgIHR5cGUoRWJ0U3RydWN0KSwgcHJlY2lzaW9uKHApLCBxdWFsaWZpZXIoRXZxVGVtcG9yYXJ5KSwgc2l6ZSgxKSwgbWF0cml4KGZhbHNlKSwgYXJyYXkoZmFsc2UpLCBhcnJheVNpemUoMCksCisgICAgICAgICAgICBtYXhBcnJheVNpemUoMCksIGFycmF5SW5mb3JtYXRpb25UeXBlKDApLCBzdHJ1Y3R1cmUodXNlckRlZiksIHN0cnVjdHVyZVNpemUoMCksIGZpZWxkTmFtZSgwKSwgbWFuZ2xlZCgwKQorICAgIHsKKyAgICAgICAgdHlwZU5hbWUgPSBOZXdQb29sVFN0cmluZyhuLmNfc3RyKCkpOworICAgIH0KKworICAgIHZvaWQgY29weVR5cGUoY29uc3QgVFR5cGUmIGNvcHlPZiwgVFN0cnVjdHVyZU1hcCYgcmVtYXBwZXIpCisgICAgeworICAgICAgICB0eXBlID0gY29weU9mLnR5cGU7CisgICAgICAgIHByZWNpc2lvbiA9IGNvcHlPZi5wcmVjaXNpb247CisgICAgICAgIHF1YWxpZmllciA9IGNvcHlPZi5xdWFsaWZpZXI7CisgICAgICAgIHNpemUgPSBjb3B5T2Yuc2l6ZTsKKyAgICAgICAgbWF0cml4ID0gY29weU9mLm1hdHJpeDsKKyAgICAgICAgYXJyYXkgPSBjb3B5T2YuYXJyYXk7CisgICAgICAgIGFycmF5U2l6ZSA9IGNvcHlPZi5hcnJheVNpemU7CisKKyAgICAgICAgVFN0cnVjdHVyZU1hcEl0ZXJhdG9yIGl0ZXI7CisgICAgICAgIGlmIChjb3B5T2Yuc3RydWN0dXJlKSB7CisgICAgICAgICAgICBpZiAoKGl0ZXIgPSByZW1hcHBlci5maW5kKHN0cnVjdHVyZSkpID09IHJlbWFwcGVyLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBuZXcgc3RydWN0dXJlIGhlcmUKKyAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgPSBOZXdQb29sVFR5cGVMaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3B5T2Yuc3RydWN0dXJlLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBUVHlwZUxpbmUgdHlwZUxpbmU7CisgICAgICAgICAgICAgICAgICAgIHR5cGVMaW5lLmxpbmUgPSAoKmNvcHlPZi5zdHJ1Y3R1cmUpW2ldLmxpbmU7CisgICAgICAgICAgICAgICAgICAgIHR5cGVMaW5lLnR5cGUgPSAoKmNvcHlPZi5zdHJ1Y3R1cmUpW2ldLnR5cGUtPmNsb25lKHJlbWFwcGVyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlLT5wdXNoX2JhY2sodHlwZUxpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RydWN0dXJlID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHN0cnVjdHVyZSA9IDA7CisKKyAgICAgICAgZmllbGROYW1lID0gMDsKKyAgICAgICAgaWYgKGNvcHlPZi5maWVsZE5hbWUpCisgICAgICAgICAgICBmaWVsZE5hbWUgPSBOZXdQb29sVFN0cmluZyhjb3B5T2YuZmllbGROYW1lLT5jX3N0cigpKTsKKyAgICAgICAgdHlwZU5hbWUgPSAwOworICAgICAgICBpZiAoY29weU9mLnR5cGVOYW1lKQorICAgICAgICAgICAgdHlwZU5hbWUgPSBOZXdQb29sVFN0cmluZyhjb3B5T2YudHlwZU5hbWUtPmNfc3RyKCkpOworCisgICAgICAgIG1hbmdsZWQgPSAwOworICAgICAgICBpZiAoY29weU9mLm1hbmdsZWQpCisgICAgICAgICAgICBtYW5nbGVkID0gTmV3UG9vbFRTdHJpbmcoY29weU9mLm1hbmdsZWQtPmNfc3RyKCkpOworCisgICAgICAgIHN0cnVjdHVyZVNpemUgPSBjb3B5T2Yuc3RydWN0dXJlU2l6ZTsKKyAgICAgICAgbWF4QXJyYXlTaXplID0gY29weU9mLm1heEFycmF5U2l6ZTsKKyAgICAgICAgYXNzZXJ0KGNvcHlPZi5hcnJheUluZm9ybWF0aW9uVHlwZSA9PSAwKTsKKyAgICAgICAgYXJyYXlJbmZvcm1hdGlvblR5cGUgPSAwOyAvLyBhcnJheUluZm9ybWF0aW9uVHlwZSBzaG91bGQgbm90IGJlIHNldCBmb3IgYnVpbHRJbiBzeW1ib2wgdGFibGUgbGV2ZWwKKyAgICB9CisKKyAgICBUVHlwZSogY2xvbmUoVFN0cnVjdHVyZU1hcCYgcmVtYXBwZXIpCisgICAgeworICAgICAgICBUVHlwZSAqbmV3VHlwZSA9IG5ldyBUVHlwZSgpOworICAgICAgICBuZXdUeXBlLT5jb3B5VHlwZSgqdGhpcywgcmVtYXBwZXIpOworCisgICAgICAgIHJldHVybiBuZXdUeXBlOworICAgIH0KKworICAgIFRCYXNpY1R5cGUgZ2V0QmFzaWNUeXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZTsgfQorICAgIHZvaWQgc2V0QmFzaWNUeXBlKFRCYXNpY1R5cGUgdCkgeyB0eXBlID0gdDsgfQorCisgICAgVFByZWNpc2lvbiBnZXRQcmVjaXNpb24oKSBjb25zdCB7IHJldHVybiBwcmVjaXNpb247IH0KKyAgICB2b2lkIHNldFByZWNpc2lvbihUUHJlY2lzaW9uIHApIHsgcHJlY2lzaW9uID0gcDsgfQorCisgICAgVFF1YWxpZmllciBnZXRRdWFsaWZpZXIoKSBjb25zdCB7IHJldHVybiBxdWFsaWZpZXI7IH0KKyAgICB2b2lkIHNldFF1YWxpZmllcihUUXVhbGlmaWVyIHEpIHsgcXVhbGlmaWVyID0gcTsgfQorCisgICAgLy8gT25lLWRpbWVuc2lvbmFsIHNpemUgb2Ygc2luZ2xlIGluc3RhbmNlIHR5cGUKKyAgICBpbnQgZ2V0Tm9taW5hbFNpemUoKSBjb25zdCB7IHJldHVybiBzaXplOyB9CisgICAgdm9pZCBzZXROb21pbmFsU2l6ZShpbnQgcykgeyBzaXplID0gczsgfQorICAgIC8vIEZ1bGwgc2l6ZSBvZiBzaW5nbGUgaW5zdGFuY2Ugb2YgdHlwZQorICAgIGludCBnZXRPYmplY3RTaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIGludCB0b3RhbFNpemU7CisKKyAgICAgICAgaWYgKGdldEJhc2ljVHlwZSgpID09IEVidFN0cnVjdCkKKyAgICAgICAgICAgIHRvdGFsU2l6ZSA9IGdldFN0cnVjdFNpemUoKTsKKyAgICAgICAgZWxzZSBpZiAobWF0cml4KQorICAgICAgICAgICAgdG90YWxTaXplID0gc2l6ZSAqIHNpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRvdGFsU2l6ZSA9IHNpemU7CisKKyAgICAgICAgaWYgKGlzQXJyYXkoKSkKKyAgICAgICAgICAgIHRvdGFsU2l6ZSAqPSBzdGQ6Om1heChnZXRBcnJheVNpemUoKSwgZ2V0TWF4QXJyYXlTaXplKCkpOworCisgICAgICAgIHJldHVybiB0b3RhbFNpemU7CisgICAgfQorCisgICAgYm9vbCBpc01hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1hdHJpeCA/IHRydWUgOiBmYWxzZTsgfQorICAgIHZvaWQgc2V0TWF0cml4KGJvb2wgbSkgeyBtYXRyaXggPSBtOyB9CisKKyAgICBib29sIGlzQXJyYXkoKSBjb25zdCAgeyByZXR1cm4gYXJyYXkgPyB0cnVlIDogZmFsc2U7IH0KKyAgICBpbnQgZ2V0QXJyYXlTaXplKCkgY29uc3QgeyByZXR1cm4gYXJyYXlTaXplOyB9CisgICAgdm9pZCBzZXRBcnJheVNpemUoaW50IHMpIHsgYXJyYXkgPSB0cnVlOyBhcnJheVNpemUgPSBzOyB9CisgICAgaW50IGdldE1heEFycmF5U2l6ZSAoKSBjb25zdCB7IHJldHVybiBtYXhBcnJheVNpemU7IH0KKyAgICB2b2lkIHNldE1heEFycmF5U2l6ZSAoaW50IHMpIHsgbWF4QXJyYXlTaXplID0gczsgfQorICAgIHZvaWQgY2xlYXJBcnJheW5lc3MoKSB7IGFycmF5ID0gZmFsc2U7IGFycmF5U2l6ZSA9IDA7IG1heEFycmF5U2l6ZSA9IDA7IH0KKyAgICB2b2lkIHNldEFycmF5SW5mb3JtYXRpb25UeXBlKFRUeXBlKiB0KSB7IGFycmF5SW5mb3JtYXRpb25UeXBlID0gdDsgfQorICAgIFRUeXBlKiBnZXRBcnJheUluZm9ybWF0aW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGFycmF5SW5mb3JtYXRpb25UeXBlOyB9CisKKyAgICBib29sIGlzVmVjdG9yKCkgY29uc3QgeyByZXR1cm4gc2l6ZSA+IDEgJiYgIW1hdHJpeDsgfQorICAgIGJvb2wgaXNTY2FsYXIoKSBjb25zdCB7IHJldHVybiBzaXplID09IDEgJiYgIW1hdHJpeCAmJiAhc3RydWN0dXJlOyB9CisKKyAgICBUVHlwZUxpc3QqIGdldFN0cnVjdCgpIGNvbnN0IHsgcmV0dXJuIHN0cnVjdHVyZTsgfQorICAgIHZvaWQgc2V0U3RydWN0KFRUeXBlTGlzdCogcykgeyBzdHJ1Y3R1cmUgPSBzOyB9CisKKyAgICBjb25zdCBUU3RyaW5nJiBnZXRUeXBlTmFtZSgpIGNvbnN0CisgICAgeworICAgICAgICBhc3NlcnQodHlwZU5hbWUpOworICAgICAgICByZXR1cm4gKnR5cGVOYW1lOworICAgIH0KKyAgICB2b2lkIHNldFR5cGVOYW1lKGNvbnN0IFRTdHJpbmcmIG4pCisgICAgeworICAgICAgICB0eXBlTmFtZSA9IE5ld1Bvb2xUU3RyaW5nKG4uY19zdHIoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0ZpZWxkKCkgY29uc3QgeyByZXR1cm4gZmllbGROYW1lICE9IDA7IH0KKyAgICBjb25zdCBUU3RyaW5nJiBnZXRGaWVsZE5hbWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KGZpZWxkTmFtZSk7CisgICAgICAgIHJldHVybiAqZmllbGROYW1lOworICAgIH0KKyAgICB2b2lkIHNldEZpZWxkTmFtZShjb25zdCBUU3RyaW5nJiBuKQorICAgIHsKKyAgICAgICAgZmllbGROYW1lID0gTmV3UG9vbFRTdHJpbmcobi5jX3N0cigpKTsKKyAgICB9CisKKyAgICBUU3RyaW5nJiBnZXRNYW5nbGVkTmFtZSgpIHsKKyAgICAgICAgaWYgKCFtYW5nbGVkKSB7CisgICAgICAgICAgICBtYW5nbGVkID0gTmV3UG9vbFRTdHJpbmcoIiIpOworICAgICAgICAgICAgYnVpbGRNYW5nbGVkTmFtZSgqbWFuZ2xlZCk7CisgICAgICAgICAgICAqbWFuZ2xlZCArPSAnOycgOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICptYW5nbGVkOworICAgIH0KKworICAgIGJvb2wgc2FtZUVsZW1lbnRUeXBlKGNvbnN0IFRUeXBlJiByaWdodCkgY29uc3QgeworICAgICAgICByZXR1cm4gICAgICB0eXBlID09IHJpZ2h0LnR5cGUgICAmJgorICAgICAgICAgICAgICAgICAgICBzaXplID09IHJpZ2h0LnNpemUgICAmJgorICAgICAgICAgICAgICAgICAgbWF0cml4ID09IHJpZ2h0Lm1hdHJpeCAmJgorICAgICAgICAgICAgICAgc3RydWN0dXJlID09IHJpZ2h0LnN0cnVjdHVyZTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRUeXBlJiByaWdodCkgY29uc3QgeworICAgICAgICByZXR1cm4gICAgICB0eXBlID09IHJpZ2h0LnR5cGUgICAmJgorICAgICAgICAgICAgICAgICAgICBzaXplID09IHJpZ2h0LnNpemUgICAmJgorICAgICAgICAgICAgICAgICAgbWF0cml4ID09IHJpZ2h0Lm1hdHJpeCAmJgorICAgICAgICAgICAgICAgICAgIGFycmF5ID09IHJpZ2h0LmFycmF5ICAmJiAoIWFycmF5IHx8IGFycmF5U2l6ZSA9PSByaWdodC5hcnJheVNpemUpICYmCisgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgPT0gcmlnaHQuc3RydWN0dXJlOworICAgICAgICAvLyBkb24ndCBjaGVjayB0aGUgcXVhbGlmaWVyLCBpdCdzIG5vdCBldmVyIHdoYXQncyBiZWluZyBzb3VnaHQgYWZ0ZXIKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRUeXBlJiByaWdodCkgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ocmlnaHQpOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBUVHlwZSYgcmlnaHQpIGNvbnN0IHsKKyAgICAgICAgaWYgKHR5cGUgIT0gcmlnaHQudHlwZSkgcmV0dXJuIHR5cGUgPCByaWdodC50eXBlOworICAgICAgICBpZiAoc2l6ZSAhPSByaWdodC5zaXplKSByZXR1cm4gc2l6ZSA8IHJpZ2h0LnNpemU7CisgICAgICAgIGlmIChtYXRyaXggIT0gcmlnaHQubWF0cml4KSByZXR1cm4gbWF0cml4IDwgcmlnaHQubWF0cml4OworICAgICAgICBpZiAoYXJyYXkgIT0gcmlnaHQuYXJyYXkpIHJldHVybiBhcnJheSA8IHJpZ2h0LmFycmF5OworICAgICAgICBpZiAoYXJyYXlTaXplICE9IHJpZ2h0LmFycmF5U2l6ZSkgcmV0dXJuIGFycmF5U2l6ZSA8IHJpZ2h0LmFycmF5U2l6ZTsKKyAgICAgICAgaWYgKHN0cnVjdHVyZSAhPSByaWdodC5zdHJ1Y3R1cmUpIHJldHVybiBzdHJ1Y3R1cmUgPCByaWdodC5zdHJ1Y3R1cmU7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIGdldEJhc2ljU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gOjpnZXRCYXNpY1N0cmluZyh0eXBlKTsgfQorICAgIGNvbnN0IGNoYXIqIGdldFByZWNpc2lvblN0cmluZygpIGNvbnN0IHsgcmV0dXJuIDo6Z2V0UHJlY2lzaW9uU3RyaW5nKHByZWNpc2lvbik7IH0KKyAgICBjb25zdCBjaGFyKiBnZXRRdWFsaWZpZXJTdHJpbmcoKSBjb25zdCB7IHJldHVybiA6OmdldFF1YWxpZmllclN0cmluZyhxdWFsaWZpZXIpOyB9CisgICAgVFN0cmluZyBnZXRDb21wbGV0ZVN0cmluZygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBidWlsZE1hbmdsZWROYW1lKFRTdHJpbmcmKTsKKyAgICBpbnQgZ2V0U3RydWN0U2l6ZSgpIGNvbnN0OworCisgICAgVEJhc2ljVHlwZSB0eXBlICAgICAgOiA2OworICAgIFRQcmVjaXNpb24gcHJlY2lzaW9uOworICAgIFRRdWFsaWZpZXIgcXVhbGlmaWVyIDogNzsKKyAgICBpbnQgc2l6ZSAgICAgICAgICAgICA6IDg7IC8vIHNpemUgb2YgdmVjdG9yIG9yIG1hdHJpeCwgbm90IHNpemUgb2YgYXJyYXkKKyAgICB1bnNpZ25lZCBpbnQgbWF0cml4ICA6IDE7CisgICAgdW5zaWduZWQgaW50IGFycmF5ICAgOiAxOworICAgIGludCBhcnJheVNpemU7CisgICAgaW50IG1heEFycmF5U2l6ZTsKKyAgICBUVHlwZSogYXJyYXlJbmZvcm1hdGlvblR5cGU7CisKKyAgICBUVHlwZUxpc3QqIHN0cnVjdHVyZTsgICAgICAvLyAwIHVubGVzcyB0aGlzIGlzIGEgc3RydWN0CisgICAgbXV0YWJsZSBpbnQgc3RydWN0dXJlU2l6ZTsKKworICAgIFRTdHJpbmcgKmZpZWxkTmFtZTsgICAgICAgICAvLyBmb3Igc3RydWN0dXJlIGZpZWxkIG5hbWVzCisgICAgVFN0cmluZyAqbWFuZ2xlZDsKKyAgICBUU3RyaW5nICp0eXBlTmFtZTsgICAgICAgICAgLy8gZm9yIHN0cnVjdHVyZSBmaWVsZCB0eXBlIG5hbWUKK307CisKKyNlbmRpZiAvLyBfVFlQRVNfSU5DTFVERURfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9VbmZvbGRTZWxlY3QuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVW5mb2xkU2VsZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzk4NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVW5mb2xkU2VsZWN0LmNwcApAQCAtMCwwICsxLDk2IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gVW5mb2xkU2VsZWN0IGlzIGFuIEFTVCB0cmF2ZXJzZXIgdG8gb3V0cHV0IHRoZSBzZWxlY3Qgb3BlcmF0b3IgPzogYXMgaWYtZWxzZSBzdGF0ZW1lbnRzCisvLworCisjaW5jbHVkZSAiY29tcGlsZXIvVW5mb2xkU2VsZWN0LmgiCisKKyNpbmNsdWRlICJjb21waWxlci9JbmZvU2luay5oIgorI2luY2x1ZGUgImNvbXBpbGVyL091dHB1dEhMU0wuaCIKKworbmFtZXNwYWNlIHNoCit7CitVbmZvbGRTZWxlY3Q6OlVuZm9sZFNlbGVjdChUUGFyc2VDb250ZXh0ICZjb250ZXh0LCBPdXRwdXRITFNMICpvdXRwdXRITFNMKSA6IG1Db250ZXh0KGNvbnRleHQpLCBtT3V0cHV0SExTTChvdXRwdXRITFNMKQoreworICAgIG1UZW1wb3JhcnlJbmRleCA9IDA7Cit9CisKK3ZvaWQgVW5mb2xkU2VsZWN0Ojp0cmF2ZXJzZShUSW50ZXJtTm9kZSAqbm9kZSkKK3sKKyAgICBpbnQgcmV3aW5kSW5kZXggPSBtVGVtcG9yYXJ5SW5kZXg7CisgICAgbm9kZS0+dHJhdmVyc2UodGhpcyk7CisgICAgbVRlbXBvcmFyeUluZGV4ID0gcmV3aW5kSW5kZXg7Cit9CisKK2Jvb2wgVW5mb2xkU2VsZWN0Ojp2aXNpdFNlbGVjdGlvbihWaXNpdCB2aXNpdCwgVEludGVybVNlbGVjdGlvbiAqbm9kZSkKK3sKKyAgICBUSW5mb1NpbmtCYXNlICZvdXQgPSBtT3V0cHV0SExTTC0+Z2V0Qm9keVN0cmVhbSgpOworCisgICAgaWYgKG5vZGUtPnVzZXNUZXJuYXJ5T3BlcmF0b3IoKSkKKyAgICB7CisgICAgICAgIGludCBpID0gbVRlbXBvcmFyeUluZGV4OworCisgICAgICAgIG91dCA8PCBtT3V0cHV0SExTTC0+dHlwZVN0cmluZyhub2RlLT5nZXRUeXBlKCkpIDw8ICIgcyIgPDwgaSA8PCAiO1xuIjsKKworICAgICAgICBtVGVtcG9yYXJ5SW5kZXggPSBpICsgMTsKKyAgICAgICAgbm9kZS0+Z2V0Q29uZGl0aW9uKCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICBvdXQgPDwgImlmKCI7CisgICAgICAgIG1UZW1wb3JhcnlJbmRleCA9IGkgKyAxOworICAgICAgICBub2RlLT5nZXRDb25kaXRpb24oKS0+dHJhdmVyc2UobU91dHB1dEhMU0wpOworICAgICAgICBvdXQgPDwgIilcbiIKKyAgICAgICAgICAgICAgICJ7XG4iOworICAgICAgICBtVGVtcG9yYXJ5SW5kZXggPSBpICsgMTsKKyAgICAgICAgbm9kZS0+Z2V0VHJ1ZUJsb2NrKCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICBvdXQgPDwgIiAgICBzIiA8PCBpIDw8ICIgPSAiOworICAgICAgICBtVGVtcG9yYXJ5SW5kZXggPSBpICsgMTsKKyAgICAgICAgbm9kZS0+Z2V0VHJ1ZUJsb2NrKCktPnRyYXZlcnNlKG1PdXRwdXRITFNMKTsKKyAgICAgICAgb3V0IDw8ICI7XG4iCisgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgImVsc2VcbiIKKyAgICAgICAgICAgICAgICJ7XG4iOworICAgICAgICBtVGVtcG9yYXJ5SW5kZXggPSBpICsgMTsKKyAgICAgICAgbm9kZS0+Z2V0RmFsc2VCbG9jaygpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICAgICAgb3V0IDw8ICIgICAgcyIgPDwgaSA8PCAiID0gIjsKKyAgICAgICAgbVRlbXBvcmFyeUluZGV4ID0gaSArIDE7CisgICAgICAgIG5vZGUtPmdldEZhbHNlQmxvY2soKS0+dHJhdmVyc2UobU91dHB1dEhMU0wpOworICAgICAgICBvdXQgPDwgIjtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iOworCisgICAgICAgIG1UZW1wb3JhcnlJbmRleCA9IGkgKyAxOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBVbmZvbGRTZWxlY3Q6OnZpc2l0TG9vcChWaXNpdCB2aXNpdCwgVEludGVybUxvb3AgKm5vZGUpCit7CisgICAgaW50IHJld2luZEluZGV4ID0gbVRlbXBvcmFyeUluZGV4OworCisgICAgaWYgKG5vZGUtPmdldEluaXQoKSkKKyAgICB7CisgICAgICAgIG5vZGUtPmdldEluaXQoKS0+dHJhdmVyc2UodGhpcyk7CisgICAgfQorICAgIAorICAgIGlmIChub2RlLT5nZXRDb25kaXRpb24oKSkKKyAgICB7CisgICAgICAgIG5vZGUtPmdldENvbmRpdGlvbigpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICB9CisKKyAgICBpZiAobm9kZS0+Z2V0RXhwcmVzc2lvbigpKQorICAgIHsKKyAgICAgICAgbm9kZS0+Z2V0RXhwcmVzc2lvbigpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICB9CisKKyAgICBtVGVtcG9yYXJ5SW5kZXggPSByZXdpbmRJbmRleDsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50IFVuZm9sZFNlbGVjdDo6Z2V0TmV4dFRlbXBvcmFyeUluZGV4KCkKK3sKKyAgICByZXR1cm4gbVRlbXBvcmFyeUluZGV4Kys7Cit9Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9VbmZvbGRTZWxlY3QuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1VuZm9sZFNlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhM2JhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9VbmZvbGRTZWxlY3QuaApAQCAtMCwwICsxLDM4IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gVW5mb2xkU2VsZWN0IGlzIGFuIEFTVCB0cmF2ZXJzZXIgdG8gb3V0cHV0IHRoZSBzZWxlY3Qgb3BlcmF0b3IgPzogYXMgaWYtZWxzZSBzdGF0ZW1lbnRzCisvLworCisjaWZuZGVmIENPTVBJTEVSX1VORk9MRFNFTEVDVF9IXworI2RlZmluZSBDT01QSUxFUl9VTkZPTERTRUxFQ1RfSF8KKworI2luY2x1ZGUgImNvbXBpbGVyL2ludGVybWVkaWF0ZS5oIgorI2luY2x1ZGUgImNvbXBpbGVyL1BhcnNlSGVscGVyLmgiCisKK25hbWVzcGFjZSBzaAoreworY2xhc3MgT3V0cHV0SExTTDsKKworY2xhc3MgVW5mb2xkU2VsZWN0IDogcHVibGljIFRJbnRlcm1UcmF2ZXJzZXIKK3sKKyAgcHVibGljOgorICAgIFVuZm9sZFNlbGVjdChUUGFyc2VDb250ZXh0ICZjb250ZXh0LCBPdXRwdXRITFNMICpvdXRwdXRITFNMKTsKKworICAgIHZvaWQgdHJhdmVyc2UoVEludGVybU5vZGUgKm5vZGUpOworICAgIGJvb2wgdmlzaXRTZWxlY3Rpb24oVmlzaXQgdmlzaXQsIFRJbnRlcm1TZWxlY3Rpb24gKm5vZGUpOworICAgIGJvb2wgdmlzaXRMb29wKFZpc2l0IHZpc2l0LCBUSW50ZXJtTG9vcCAqbm9kZSk7CisKKyAgICBpbnQgZ2V0TmV4dFRlbXBvcmFyeUluZGV4KCk7CisKKyAgcHJvdGVjdGVkOgorICAgIFRQYXJzZUNvbnRleHQgJm1Db250ZXh0OworICAgIE91dHB1dEhMU0wgKmNvbnN0IG1PdXRwdXRITFNMOworCisgICAgaW50IG1UZW1wb3JhcnlJbmRleDsKK307Cit9CisKKyNlbmRpZiAgIC8vIENPTVBJTEVSX1VORk9MRFNFTEVDVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVmFsaWRhdGVMaW1pdGF0aW9ucy5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9WYWxpZGF0ZUxpbWl0YXRpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjdkMGJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVmFsaWRhdGVMaW1pdGF0aW9ucy5jcHAKQEAgLTAsMCArMSw1MTEgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9WYWxpZGF0ZUxpbWl0YXRpb25zLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvSW5mb1NpbmsuaCIKKyNpbmNsdWRlICJjb21waWxlci9QYXJzZUhlbHBlci5oIgorCituYW1lc3BhY2UgeworYm9vbCBJc0xvb3BJbmRleChjb25zdCBUSW50ZXJtU3ltYm9sKiBzeW1ib2wsIGNvbnN0IFRMb29wU3RhY2smIHN0YWNrKSB7CisgICAgZm9yIChUTG9vcFN0YWNrOjpjb25zdF9pdGVyYXRvciBpID0gc3RhY2suYmVnaW4oKTsgaSAhPSBzdGFjay5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmIChpLT5pbmRleC5pZCA9PSBzeW1ib2wtPmdldElkKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE1hcmtMb29wRm9yVW5yb2xsKGNvbnN0IFRJbnRlcm1TeW1ib2wqIHN5bWJvbCwgVExvb3BTdGFjayYgc3RhY2spIHsKKyAgICBmb3IgKFRMb29wU3RhY2s6Oml0ZXJhdG9yIGkgPSBzdGFjay5iZWdpbigpOyBpICE9IHN0YWNrLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKGktPmluZGV4LmlkID09IHN5bWJvbC0+Z2V0SWQoKSkgeworICAgICAgICAgICAgQVNTRVJUKGktPmxvb3AgIT0gTlVMTCk7CisgICAgICAgICAgICBpLT5sb29wLT5zZXRVbnJvbGxGbGFnKHRydWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIFVOUkVBQ0hBQkxFKCk7Cit9CisKKy8vIFRyYXZlcnNlcyBhIG5vZGUgdG8gY2hlY2sgaWYgaXQgcmVwcmVzZW50cyBhIGNvbnN0YW50IGluZGV4IGV4cHJlc3Npb24uCisvLyBEZWZpbml0aW9uOgorLy8gY29uc3RhbnQtaW5kZXgtZXhwcmVzc2lvbnMgYXJlIGEgc3VwZXJzZXQgb2YgY29uc3RhbnQtZXhwcmVzc2lvbnMuCisvLyBDb25zdGFudC1pbmRleC1leHByZXNzaW9ucyBjYW4gaW5jbHVkZSBsb29wIGluZGljZXMgYXMgZGVmaW5lZCBpbgorLy8gR0xTTCBFUyAxLjAgc3BlYywgQXBwZW5kaXggQSwgc2VjdGlvbiA0LgorLy8gVGhlIGZvbGxvd2luZyBhcmUgY29uc3RhbnQtaW5kZXgtZXhwcmVzc2lvbnM6CisvLyAtIENvbnN0YW50IGV4cHJlc3Npb25zCisvLyAtIExvb3AgaW5kaWNlcyBhcyBkZWZpbmVkIGluIHNlY3Rpb24gNAorLy8gLSBFeHByZXNzaW9ucyBjb21wb3NlZCBvZiBib3RoIG9mIHRoZSBhYm92ZQorY2xhc3MgVmFsaWRhdGVDb25zdEluZGV4RXhwciA6IHB1YmxpYyBUSW50ZXJtVHJhdmVyc2VyIHsKK3B1YmxpYzoKKyAgICBWYWxpZGF0ZUNvbnN0SW5kZXhFeHByKGNvbnN0IFRMb29wU3RhY2smIHN0YWNrKQorICAgICAgICA6IG1WYWxpZCh0cnVlKSwgbUxvb3BTdGFjayhzdGFjaykge30KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyc2VkIG5vZGUgcmVwcmVzZW50cyBhIGNvbnN0YW50IGluZGV4IGV4cHJlc3Npb24uCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbVZhbGlkOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdmlzaXRTeW1ib2woVEludGVybVN5bWJvbCogc3ltYm9sKSB7CisgICAgICAgIC8vIE9ubHkgY29uc3RhbnRzIGFuZCBsb29wIGluZGljZXMgYXJlIGFsbG93ZWQgaW4gYQorICAgICAgICAvLyBjb25zdGFudCBpbmRleCBleHByZXNzaW9uLgorICAgICAgICBpZiAobVZhbGlkKSB7CisgICAgICAgICAgICBtVmFsaWQgPSAoc3ltYm9sLT5nZXRRdWFsaWZpZXIoKSA9PSBFdnFDb25zdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIElzTG9vcEluZGV4KHN5bWJvbCwgbUxvb3BTdGFjayk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgY29uc3QgVExvb3BTdGFjayYgbUxvb3BTdGFjazsKK307CisKKy8vIFRyYXZlcnNlcyBhIG5vZGUgdG8gY2hlY2sgaWYgaXQgdXNlcyBhIGxvb3AgaW5kZXguCisvLyBJZiBhbiBpbnQgbG9vcCBpbmRleCBpcyB1c2VkIGluIGl0cyBib2R5IGFzIGEgc2FtcGxlciBhcnJheSBpbmRleCwKKy8vIG1hcmsgdGhlIGxvb3AgZm9yIHVucm9sbC4KK2NsYXNzIFZhbGlkYXRlTG9vcEluZGV4RXhwciA6IHB1YmxpYyBUSW50ZXJtVHJhdmVyc2VyIHsKK3B1YmxpYzoKKyAgICBWYWxpZGF0ZUxvb3BJbmRleEV4cHIoVExvb3BTdGFjayYgc3RhY2spCisgICAgICAgIDogbVVzZXNGbG9hdExvb3BJbmRleChmYWxzZSksCisgICAgICAgICAgbVVzZXNJbnRMb29wSW5kZXgoZmFsc2UpLAorICAgICAgICAgIG1Mb29wU3RhY2soc3RhY2spIHt9CisKKyAgICBib29sIHVzZXNGbG9hdExvb3BJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1Vc2VzRmxvYXRMb29wSW5kZXg7IH0KKyAgICBib29sIHVzZXNJbnRMb29wSW5kZXgoKSBjb25zdCB7IHJldHVybiBtVXNlc0ludExvb3BJbmRleDsgfQorCisgICAgdmlydHVhbCB2b2lkIHZpc2l0U3ltYm9sKFRJbnRlcm1TeW1ib2wqIHN5bWJvbCkgeworICAgICAgICBpZiAoSXNMb29wSW5kZXgoc3ltYm9sLCBtTG9vcFN0YWNrKSkgeworICAgICAgICAgICAgc3dpdGNoIChzeW1ib2wtPmdldEJhc2ljVHlwZSgpKSB7CisgICAgICAgICAgICAgIGNhc2UgRWJ0RmxvYXQ6CisgICAgICAgICAgICAgICAgbVVzZXNGbG9hdExvb3BJbmRleCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRWJ0SW50OgorICAgICAgICAgICAgICAgIG1Vc2VzSW50TG9vcEluZGV4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBNYXJrTG9vcEZvclVucm9sbChzeW1ib2wsIG1Mb29wU3RhY2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtVXNlc0Zsb2F0TG9vcEluZGV4OworICAgIGJvb2wgbVVzZXNJbnRMb29wSW5kZXg7CisgICAgVExvb3BTdGFjayYgbUxvb3BTdGFjazsKK307Cit9ICAvLyBuYW1lc3BhY2UKKworVmFsaWRhdGVMaW1pdGF0aW9uczo6VmFsaWRhdGVMaW1pdGF0aW9ucyhTaFNoYWRlclR5cGUgc2hhZGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEluZm9TaW5rQmFzZSYgc2luaykKKyAgICA6IG1TaGFkZXJUeXBlKHNoYWRlclR5cGUpLAorICAgICAgbVNpbmsoc2luayksCisgICAgICBtTnVtRXJyb3JzKDApCit7Cit9CisKK2Jvb2wgVmFsaWRhdGVMaW1pdGF0aW9uczo6dmlzaXRCaW5hcnkoVmlzaXQsIFRJbnRlcm1CaW5hcnkqIG5vZGUpCit7CisgICAgLy8gQ2hlY2sgaWYgbG9vcCBpbmRleCBpcyBtb2RpZmllZCBpbiB0aGUgbG9vcCBib2R5LgorICAgIHZhbGlkYXRlT3BlcmF0aW9uKG5vZGUsIG5vZGUtPmdldExlZnQoKSk7CisKKyAgICAvLyBDaGVjayBpbmRleGluZy4KKyAgICBzd2l0Y2ggKG5vZGUtPmdldE9wKCkpIHsKKyAgICAgIGNhc2UgRU9wSW5kZXhEaXJlY3Q6CisgICAgICAgIHZhbGlkYXRlSW5kZXhpbmcobm9kZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFT3BJbmRleEluZGlyZWN0OgorI2lmIGRlZmluZWQoX19BUFBMRV9fKQorICAgICAgICAvLyBMb29wIHVucm9sbGluZyBpcyBhIHdvcmstYXJvdW5kIGZvciBhIE1hYyBDZyBjb21waWxlciBidWcgd2hlcmUgaXQKKyAgICAgICAgLy8gY3Jhc2hlcyB3aGVuIGEgc2FtcGxlciBhcnJheSdzIGluZGV4IGlzIGFsc28gdGhlIGxvb3AgaW5kZXguCisgICAgICAgIC8vIE9uY2UgQXBwbGUgZml4ZXMgdGhpcyBidWcsIHdlIHNob3VsZCByZW1vdmUgdGhlIGNvZGUgaW4gdGhpcyBDTC4KKyAgICAgICAgLy8gU2VlIGh0dHA6Ly9jb2RlcmV2aWV3LmFwcHNwb3QuY29tLzQzMzEwNDgvLgorICAgICAgICBpZiAoKG5vZGUtPmdldExlZnQoKSAhPSBOVUxMKSAmJiAobm9kZS0+Z2V0UmlnaHQoKSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgKG5vZGUtPmdldExlZnQoKS0+Z2V0QXNTeW1ib2xOb2RlKCkpKSB7CisgICAgICAgICAgICBUSW50ZXJtU3ltYm9sKiBzeW1ib2wgPSBub2RlLT5nZXRMZWZ0KCktPmdldEFzU3ltYm9sTm9kZSgpOworICAgICAgICAgICAgaWYgKElzU2FtcGxlcihzeW1ib2wtPmdldEJhc2ljVHlwZSgpKSAmJiBzeW1ib2wtPmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgIFZhbGlkYXRlTG9vcEluZGV4RXhwciB2YWxpZGF0ZShtTG9vcFN0YWNrKTsKKyAgICAgICAgICAgICAgICBub2RlLT5nZXRSaWdodCgpLT50cmF2ZXJzZSgmdmFsaWRhdGUpOworICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZS51c2VzRmxvYXRMb29wSW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcihub2RlLT5nZXRMaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGVyIGFycmF5IGluZGV4IGlzIGZsb2F0IGxvb3AgaW5kZXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgdmFsaWRhdGVJbmRleGluZyhub2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVmFsaWRhdGVMaW1pdGF0aW9uczo6dmlzaXRVbmFyeShWaXNpdCwgVEludGVybVVuYXJ5KiBub2RlKQoreworICAgIC8vIENoZWNrIGlmIGxvb3AgaW5kZXggaXMgbW9kaWZpZWQgaW4gdGhlIGxvb3AgYm9keS4KKyAgICB2YWxpZGF0ZU9wZXJhdGlvbihub2RlLCBub2RlLT5nZXRPcGVyYW5kKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVmFsaWRhdGVMaW1pdGF0aW9uczo6dmlzaXRBZ2dyZWdhdGUoVmlzaXQsIFRJbnRlcm1BZ2dyZWdhdGUqIG5vZGUpCit7CisgICAgc3dpdGNoIChub2RlLT5nZXRPcCgpKSB7CisgICAgICBjYXNlIEVPcEZ1bmN0aW9uQ2FsbDoKKyAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNhbGwobm9kZSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFZhbGlkYXRlTGltaXRhdGlvbnM6OnZpc2l0TG9vcChWaXNpdCwgVEludGVybUxvb3AqIG5vZGUpCit7CisgICAgaWYgKCF2YWxpZGF0ZUxvb3BUeXBlKG5vZGUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBUTG9vcEluZm8gaW5mbzsKKyAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihUTG9vcEluZm8pKTsKKyAgICBpbmZvLmxvb3AgPSBub2RlOworICAgIGlmICghdmFsaWRhdGVGb3JMb29wSGVhZGVyKG5vZGUsICZpbmZvKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgVEludGVybU5vZGUqIGJvZHkgPSBub2RlLT5nZXRCb2R5KCk7CisgICAgaWYgKGJvZHkgIT0gTlVMTCkgeworICAgICAgICBtTG9vcFN0YWNrLnB1c2hfYmFjayhpbmZvKTsKKyAgICAgICAgYm9keS0+dHJhdmVyc2UodGhpcyk7CisgICAgICAgIG1Mb29wU3RhY2sucG9wX2JhY2soKTsKKyAgICB9CisKKyAgICAvLyBUaGUgbG9vcCBpcyBmdWxseSBwcm9jZXNzZWQgLSBubyBuZWVkIHRvIHZpc2l0IGNoaWxkcmVuLgorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBWYWxpZGF0ZUxpbWl0YXRpb25zOjplcnJvcihUU291cmNlTG9jIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyKiB0b2tlbikKK3sKKyAgICBtU2luay5wcmVmaXgoRVByZWZpeEVycm9yKTsKKyAgICBtU2luay5sb2NhdGlvbihsb2MpOworICAgIG1TaW5rIDw8ICInIiA8PCB0b2tlbiA8PCAiJyA6ICIgPDwgcmVhc29uIDw8ICJcbiI7CisgICAgKyttTnVtRXJyb3JzOworfQorCitib29sIFZhbGlkYXRlTGltaXRhdGlvbnM6OndpdGhpbkxvb3BCb2R5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gIW1Mb29wU3RhY2suZW1wdHkoKTsKK30KKworYm9vbCBWYWxpZGF0ZUxpbWl0YXRpb25zOjppc0xvb3BJbmRleChjb25zdCBUSW50ZXJtU3ltYm9sKiBzeW1ib2wpIGNvbnN0Cit7CisgICAgcmV0dXJuIElzTG9vcEluZGV4KHN5bWJvbCwgbUxvb3BTdGFjayk7Cit9CisKK2Jvb2wgVmFsaWRhdGVMaW1pdGF0aW9uczo6dmFsaWRhdGVMb29wVHlwZShUSW50ZXJtTG9vcCogbm9kZSkgeworICAgIFRMb29wVHlwZSB0eXBlID0gbm9kZS0+Z2V0VHlwZSgpOworICAgIGlmICh0eXBlID09IEVMb29wRm9yKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFJlamVjdCB3aGlsZSBhbmQgZG8td2hpbGUgbG9vcHMuCisgICAgZXJyb3Iobm9kZS0+Z2V0TGluZSgpLAorICAgICAgICAgICJUaGlzIHR5cGUgb2YgbG9vcCBpcyBub3QgYWxsb3dlZCIsCisgICAgICAgICAgdHlwZSA9PSBFTG9vcFdoaWxlID8gIndoaWxlIiA6ICJkbyIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBWYWxpZGF0ZUxpbWl0YXRpb25zOjp2YWxpZGF0ZUZvckxvb3BIZWFkZXIoVEludGVybUxvb3AqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTG9vcEluZm8qIGluZm8pCit7CisgICAgQVNTRVJUKG5vZGUtPmdldFR5cGUoKSA9PSBFTG9vcEZvcik7CisKKyAgICAvLworICAgIC8vIFRoZSBmb3Igc3RhdGVtZW50IGhhcyB0aGUgZm9ybToKKyAgICAvLyAgICBmb3IgKCBpbml0LWRlY2xhcmF0aW9uIDsgY29uZGl0aW9uIDsgZXhwcmVzc2lvbiApIHN0YXRlbWVudAorICAgIC8vCisgICAgaWYgKCF2YWxpZGF0ZUZvckxvb3BJbml0KG5vZGUsIGluZm8pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCF2YWxpZGF0ZUZvckxvb3BDb25kKG5vZGUsIGluZm8pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCF2YWxpZGF0ZUZvckxvb3BFeHByKG5vZGUsIGluZm8pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWYWxpZGF0ZUxpbWl0YXRpb25zOjp2YWxpZGF0ZUZvckxvb3BJbml0KFRJbnRlcm1Mb29wKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMb29wSW5mbyogaW5mbykKK3sKKyAgICBUSW50ZXJtTm9kZSogaW5pdCA9IG5vZGUtPmdldEluaXQoKTsKKyAgICBpZiAoaW5pdCA9PSBOVUxMKSB7CisgICAgICAgIGVycm9yKG5vZGUtPmdldExpbmUoKSwgIk1pc3NpbmcgaW5pdCBkZWNsYXJhdGlvbiIsICJmb3IiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW5pdC1kZWNsYXJhdGlvbiBoYXMgdGhlIGZvcm06CisgICAgLy8gICAgIHR5cGUtc3BlY2lmaWVyIGlkZW50aWZpZXIgPSBjb25zdGFudC1leHByZXNzaW9uCisgICAgLy8KKyAgICBUSW50ZXJtQWdncmVnYXRlKiBkZWNsID0gaW5pdC0+Z2V0QXNBZ2dyZWdhdGUoKTsKKyAgICBpZiAoKGRlY2wgPT0gTlVMTCkgfHwgKGRlY2wtPmdldE9wKCkgIT0gRU9wRGVjbGFyYXRpb24pKSB7CisgICAgICAgIGVycm9yKGluaXQtPmdldExpbmUoKSwgIkludmFsaWQgaW5pdCBkZWNsYXJhdGlvbiIsICJmb3IiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBUbyBrZWVwIHRoaW5ncyBzaW1wbGUgZG8gbm90IGFsbG93IGRlY2xhcmF0aW9uIGxpc3QuCisgICAgVEludGVybVNlcXVlbmNlJiBkZWNsU2VxID0gZGVjbC0+Z2V0U2VxdWVuY2UoKTsKKyAgICBpZiAoZGVjbFNlcS5zaXplKCkgIT0gMSkgeworICAgICAgICBlcnJvcihkZWNsLT5nZXRMaW5lKCksICJJbnZhbGlkIGluaXQgZGVjbGFyYXRpb24iLCAiZm9yIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgVEludGVybUJpbmFyeSogZGVjbEluaXQgPSBkZWNsU2VxWzBdLT5nZXRBc0JpbmFyeU5vZGUoKTsKKyAgICBpZiAoKGRlY2xJbml0ID09IE5VTEwpIHx8IChkZWNsSW5pdC0+Z2V0T3AoKSAhPSBFT3BJbml0aWFsaXplKSkgeworICAgICAgICBlcnJvcihkZWNsLT5nZXRMaW5lKCksICJJbnZhbGlkIGluaXQgZGVjbGFyYXRpb24iLCAiZm9yIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgVEludGVybVN5bWJvbCogc3ltYm9sID0gZGVjbEluaXQtPmdldExlZnQoKS0+Z2V0QXNTeW1ib2xOb2RlKCk7CisgICAgaWYgKHN5bWJvbCA9PSBOVUxMKSB7CisgICAgICAgIGVycm9yKGRlY2xJbml0LT5nZXRMaW5lKCksICJJbnZhbGlkIGluaXQgZGVjbGFyYXRpb24iLCAiZm9yIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gVGhlIGxvb3AgaW5kZXggaGFzIHR5cGUgaW50IG9yIGZsb2F0LgorICAgIFRCYXNpY1R5cGUgdHlwZSA9IHN5bWJvbC0+Z2V0QmFzaWNUeXBlKCk7CisgICAgaWYgKCh0eXBlICE9IEVidEludCkgJiYgKHR5cGUgIT0gRWJ0RmxvYXQpKSB7CisgICAgICAgIGVycm9yKHN5bWJvbC0+Z2V0TGluZSgpLAorICAgICAgICAgICAgICAiSW52YWxpZCB0eXBlIGZvciBsb29wIGluZGV4IiwgZ2V0QmFzaWNTdHJpbmcodHlwZSkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFRoZSBsb29wIGluZGV4IGlzIGluaXRpYWxpemVkIHdpdGggY29uc3RhbnQgZXhwcmVzc2lvbi4KKyAgICBpZiAoIWlzQ29uc3RFeHByKGRlY2xJbml0LT5nZXRSaWdodCgpKSkgeworICAgICAgICBlcnJvcihkZWNsSW5pdC0+Z2V0TGluZSgpLAorICAgICAgICAgICAgICAiTG9vcCBpbmRleCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBub24tY29uc3RhbnQgZXhwcmVzc2lvbiIsCisgICAgICAgICAgICAgIHN5bWJvbC0+Z2V0U3ltYm9sKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbmZvLT5pbmRleC5pZCA9IHN5bWJvbC0+Z2V0SWQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWYWxpZGF0ZUxpbWl0YXRpb25zOjp2YWxpZGF0ZUZvckxvb3BDb25kKFRJbnRlcm1Mb29wKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMb29wSW5mbyogaW5mbykKK3sKKyAgICBUSW50ZXJtTm9kZSogY29uZCA9IG5vZGUtPmdldENvbmRpdGlvbigpOworICAgIGlmIChjb25kID09IE5VTEwpIHsKKyAgICAgICAgZXJyb3Iobm9kZS0+Z2V0TGluZSgpLCAiTWlzc2luZyBjb25kaXRpb24iLCAiZm9yIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8KKyAgICAvLyBjb25kaXRpb24gaGFzIHRoZSBmb3JtOgorICAgIC8vICAgICBsb29wX2luZGV4IHJlbGF0aW9uYWxfb3BlcmF0b3IgY29uc3RhbnRfZXhwcmVzc2lvbgorICAgIC8vCisgICAgVEludGVybUJpbmFyeSogYmluT3AgPSBjb25kLT5nZXRBc0JpbmFyeU5vZGUoKTsKKyAgICBpZiAoYmluT3AgPT0gTlVMTCkgeworICAgICAgICBlcnJvcihub2RlLT5nZXRMaW5lKCksICJJbnZhbGlkIGNvbmRpdGlvbiIsICJmb3IiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBMb29wIGluZGV4IHNob3VsZCBiZSB0byB0aGUgbGVmdCBvZiByZWxhdGlvbmFsIG9wZXJhdG9yLgorICAgIFRJbnRlcm1TeW1ib2wqIHN5bWJvbCA9IGJpbk9wLT5nZXRMZWZ0KCktPmdldEFzU3ltYm9sTm9kZSgpOworICAgIGlmIChzeW1ib2wgPT0gTlVMTCkgeworICAgICAgICBlcnJvcihiaW5PcC0+Z2V0TGluZSgpLCAiSW52YWxpZCBjb25kaXRpb24iLCAiZm9yIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHN5bWJvbC0+Z2V0SWQoKSAhPSBpbmZvLT5pbmRleC5pZCkgeworICAgICAgICBlcnJvcihzeW1ib2wtPmdldExpbmUoKSwKKyAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvb3AgaW5kZXgiLCBzeW1ib2wtPmdldFN5bWJvbCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFJlbGF0aW9uYWwgb3BlcmF0b3IgaXMgb25lIG9mOiA+ID49IDwgPD0gPT0gb3IgIT0uCisgICAgc3dpdGNoIChiaW5PcC0+Z2V0T3AoKSkgeworICAgICAgY2FzZSBFT3BFcXVhbDoKKyAgICAgIGNhc2UgRU9wTm90RXF1YWw6CisgICAgICBjYXNlIEVPcExlc3NUaGFuOgorICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbjoKKyAgICAgIGNhc2UgRU9wTGVzc1RoYW5FcXVhbDoKKyAgICAgIGNhc2UgRU9wR3JlYXRlclRoYW5FcXVhbDoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBlcnJvcihiaW5PcC0+Z2V0TGluZSgpLAorICAgICAgICAgICAgICAiSW52YWxpZCByZWxhdGlvbmFsIG9wZXJhdG9yIiwKKyAgICAgICAgICAgICAgZ2V0T3BlcmF0b3JTdHJpbmcoYmluT3AtPmdldE9wKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIExvb3AgaW5kZXggbXVzdCBiZSBjb21wYXJlZCB3aXRoIGEgY29uc3RhbnQuCisgICAgaWYgKCFpc0NvbnN0RXhwcihiaW5PcC0+Z2V0UmlnaHQoKSkpIHsKKyAgICAgICAgZXJyb3IoYmluT3AtPmdldExpbmUoKSwKKyAgICAgICAgICAgICAgIkxvb3AgaW5kZXggY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggbm9uLWNvbnN0YW50IGV4cHJlc3Npb24iLAorICAgICAgICAgICAgICBzeW1ib2wtPmdldFN5bWJvbCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVmFsaWRhdGVMaW1pdGF0aW9uczo6dmFsaWRhdGVGb3JMb29wRXhwcihUSW50ZXJtTG9vcCogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTG9vcEluZm8qIGluZm8pCit7CisgICAgVEludGVybU5vZGUqIGV4cHIgPSBub2RlLT5nZXRFeHByZXNzaW9uKCk7CisgICAgaWYgKGV4cHIgPT0gTlVMTCkgeworICAgICAgICBlcnJvcihub2RlLT5nZXRMaW5lKCksICJNaXNzaW5nIGV4cHJlc3Npb24iLCAiZm9yIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBmb3IgZXhwcmVzc2lvbiBoYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6CisgICAgLy8gICAgIGxvb3BfaW5kZXgrKworICAgIC8vICAgICBsb29wX2luZGV4LS0KKyAgICAvLyAgICAgbG9vcF9pbmRleCArPSBjb25zdGFudF9leHByZXNzaW9uCisgICAgLy8gICAgIGxvb3BfaW5kZXggLT0gY29uc3RhbnRfZXhwcmVzc2lvbgorICAgIC8vICAgICArK2xvb3BfaW5kZXgKKyAgICAvLyAgICAgLS1sb29wX2luZGV4CisgICAgLy8gVGhlIGxhc3QgdHdvIGZvcm1zIGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSBzcGVjLCBidXQgSSBhbSBhc3N1bWluZworICAgIC8vIGl0cyBhbiBvdmVyc2lnaHQuCisgICAgVEludGVybVVuYXJ5KiB1bk9wID0gZXhwci0+Z2V0QXNVbmFyeU5vZGUoKTsKKyAgICBUSW50ZXJtQmluYXJ5KiBiaW5PcCA9IHVuT3AgPyBOVUxMIDogZXhwci0+Z2V0QXNCaW5hcnlOb2RlKCk7CisKKyAgICBUT3BlcmF0b3Igb3AgPSBFT3BOdWxsOworICAgIFRJbnRlcm1TeW1ib2wqIHN5bWJvbCA9IE5VTEw7CisgICAgaWYgKHVuT3AgIT0gTlVMTCkgeworICAgICAgICBvcCA9IHVuT3AtPmdldE9wKCk7CisgICAgICAgIHN5bWJvbCA9IHVuT3AtPmdldE9wZXJhbmQoKS0+Z2V0QXNTeW1ib2xOb2RlKCk7CisgICAgfSBlbHNlIGlmIChiaW5PcCAhPSBOVUxMKSB7CisgICAgICAgIG9wID0gYmluT3AtPmdldE9wKCk7CisgICAgICAgIHN5bWJvbCA9IGJpbk9wLT5nZXRMZWZ0KCktPmdldEFzU3ltYm9sTm9kZSgpOworICAgIH0KKworICAgIC8vIFRoZSBvcGVyYW5kIG11c3QgYmUgbG9vcCBpbmRleC4KKyAgICBpZiAoc3ltYm9sID09IE5VTEwpIHsKKyAgICAgICAgZXJyb3IoZXhwci0+Z2V0TGluZSgpLCAiSW52YWxpZCBleHByZXNzaW9uIiwgImZvciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzeW1ib2wtPmdldElkKCkgIT0gaW5mby0+aW5kZXguaWQpIHsKKyAgICAgICAgZXJyb3Ioc3ltYm9sLT5nZXRMaW5lKCksCisgICAgICAgICAgICAgICJFeHBlY3RlZCBsb29wIGluZGV4Iiwgc3ltYm9sLT5nZXRTeW1ib2woKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRoZSBvcGVyYXRvciBpcyBvbmUgb2Y6ICsrIC0tICs9IC09LgorICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBFT3BQb3N0SW5jcmVtZW50OgorICAgICAgICBjYXNlIEVPcFBvc3REZWNyZW1lbnQ6CisgICAgICAgIGNhc2UgRU9wUHJlSW5jcmVtZW50OgorICAgICAgICBjYXNlIEVPcFByZURlY3JlbWVudDoKKyAgICAgICAgICAgIEFTU0VSVCgodW5PcCAhPSBOVUxMKSAmJiAoYmluT3AgPT0gTlVMTCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQWRkQXNzaWduOgorICAgICAgICBjYXNlIEVPcFN1YkFzc2lnbjoKKyAgICAgICAgICAgIEFTU0VSVCgodW5PcCA9PSBOVUxMKSAmJiAoYmluT3AgIT0gTlVMTCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnJvcihleHByLT5nZXRMaW5lKCksICJJbnZhbGlkIG9wZXJhdG9yIiwgZ2V0T3BlcmF0b3JTdHJpbmcob3ApKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBMb29wIGluZGV4IG11c3QgYmUgaW5jcmVtZW50ZWQvZGVjcmVtZW50ZWQgd2l0aCBhIGNvbnN0YW50LgorICAgIGlmIChiaW5PcCAhPSBOVUxMKSB7CisgICAgICAgIGlmICghaXNDb25zdEV4cHIoYmluT3AtPmdldFJpZ2h0KCkpKSB7CisgICAgICAgICAgICBlcnJvcihiaW5PcC0+Z2V0TGluZSgpLAorICAgICAgICAgICAgICAgICAgIkxvb3AgaW5kZXggY2Fubm90IGJlIG1vZGlmaWVkIGJ5IG5vbi1jb25zdGFudCBleHByZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgIHN5bWJvbC0+Z2V0U3ltYm9sKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWYWxpZGF0ZUxpbWl0YXRpb25zOjp2YWxpZGF0ZUZ1bmN0aW9uQ2FsbChUSW50ZXJtQWdncmVnYXRlKiBub2RlKQoreworICAgIEFTU0VSVChub2RlLT5nZXRPcCgpID09IEVPcEZ1bmN0aW9uQ2FsbCk7CisKKyAgICAvLyBJZiBub3Qgd2l0aGluIGxvb3AgYm9keSwgdGhlcmUgaXMgbm90aGluZyB0byBjaGVjay4KKyAgICBpZiAoIXdpdGhpbkxvb3BCb2R5KCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTGlzdCBvZiBwYXJhbSBpbmRpY2VzIGZvciB3aGljaCBsb29wIGluZGljZXMgYXJlIHVzZWQgYXMgYXJndW1lbnQuCisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnQ+IFBhcmFtSW5kZXg7CisgICAgUGFyYW1JbmRleCBwSW5kZXg7CisgICAgVEludGVybVNlcXVlbmNlJiBwYXJhbXMgPSBub2RlLT5nZXRTZXF1ZW5jZSgpOworICAgIGZvciAoVEludGVybVNlcXVlbmNlOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVEludGVybVN5bWJvbCogc3ltYm9sID0gcGFyYW1zW2ldLT5nZXRBc1N5bWJvbE5vZGUoKTsKKyAgICAgICAgaWYgKHN5bWJvbCAmJiBpc0xvb3BJbmRleChzeW1ib2wpKQorICAgICAgICAgICAgcEluZGV4LnB1c2hfYmFjayhpKTsKKyAgICB9CisgICAgLy8gSWYgbm9uZSBvZiB0aGUgbG9vcCBpbmRpY2VzIGFyZSB1c2VkIGFzIGFyZ3VtZW50cywKKyAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIGNoZWNrLgorICAgIGlmIChwSW5kZXguZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBib29sIHZhbGlkID0gdHJ1ZTsKKyAgICBUU3ltYm9sVGFibGUmIHN5bWJvbFRhYmxlID0gR2xvYmFsUGFyc2VDb250ZXh0LT5zeW1ib2xUYWJsZTsKKyAgICBUU3ltYm9sKiBzeW1ib2wgPSBzeW1ib2xUYWJsZS5maW5kKG5vZGUtPmdldE5hbWUoKSk7CisgICAgQVNTRVJUKHN5bWJvbCAmJiBzeW1ib2wtPmlzRnVuY3Rpb24oKSk7CisgICAgVEZ1bmN0aW9uKiBmdW5jdGlvbiA9IHN0YXRpY19jYXN0PFRGdW5jdGlvbio+KHN5bWJvbCk7CisgICAgZm9yIChQYXJhbUluZGV4Ojpjb25zdF9pdGVyYXRvciBpID0gcEluZGV4LmJlZ2luKCk7CisgICAgICAgICBpICE9IHBJbmRleC5lbmQoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IFRQYXJhbWV0ZXImIHBhcmFtID0gZnVuY3Rpb24tPmdldFBhcmFtKCppKTsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsID0gcGFyYW0udHlwZS0+Z2V0UXVhbGlmaWVyKCk7CisgICAgICAgIGlmICgocXVhbCA9PSBFdnFPdXQpIHx8IChxdWFsID09IEV2cUluT3V0KSkgeworICAgICAgICAgICAgZXJyb3IocGFyYW1zWyppXS0+Z2V0TGluZSgpLAorICAgICAgICAgICAgICAgICAgIkxvb3AgaW5kZXggY2Fubm90IGJlIHVzZWQgYXMgYXJndW1lbnQgdG8gYSBmdW5jdGlvbiBvdXQgb3IgaW5vdXQgcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgIHBhcmFtc1sqaV0tPmdldEFzU3ltYm9sTm9kZSgpLT5nZXRTeW1ib2woKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdmFsaWQ7Cit9CisKK2Jvb2wgVmFsaWRhdGVMaW1pdGF0aW9uczo6dmFsaWRhdGVPcGVyYXRpb24oVEludGVybU9wZXJhdG9yKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSW50ZXJtTm9kZSogb3BlcmFuZCkgeworICAgIC8vIENoZWNrIGlmIGxvb3AgaW5kZXggaXMgbW9kaWZpZWQgaW4gdGhlIGxvb3AgYm9keS4KKyAgICBpZiAoIXdpdGhpbkxvb3BCb2R5KCkgfHwgIW5vZGUtPm1vZGlmaWVzU3RhdGUoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjb25zdCBUSW50ZXJtU3ltYm9sKiBzeW1ib2wgPSBvcGVyYW5kLT5nZXRBc1N5bWJvbE5vZGUoKTsKKyAgICBpZiAoc3ltYm9sICYmIGlzTG9vcEluZGV4KHN5bWJvbCkpIHsKKyAgICAgICAgZXJyb3Iobm9kZS0+Z2V0TGluZSgpLAorICAgICAgICAgICAgICAiTG9vcCBpbmRleCBjYW5ub3QgYmUgc3RhdGljYWxseSBhc3NpZ25lZCB0byB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIGxvb3AiLAorICAgICAgICAgICAgICBzeW1ib2wtPmdldFN5bWJvbCgpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWYWxpZGF0ZUxpbWl0YXRpb25zOjppc0NvbnN0RXhwcihUSW50ZXJtTm9kZSogbm9kZSkKK3sKKyAgICBBU1NFUlQobm9kZSAhPSBOVUxMKTsKKyAgICByZXR1cm4gbm9kZS0+Z2V0QXNDb25zdGFudFVuaW9uKCkgIT0gTlVMTDsKK30KKworYm9vbCBWYWxpZGF0ZUxpbWl0YXRpb25zOjppc0NvbnN0SW5kZXhFeHByKFRJbnRlcm1Ob2RlKiBub2RlKQoreworICAgIEFTU0VSVChub2RlICE9IE5VTEwpOworCisgICAgVmFsaWRhdGVDb25zdEluZGV4RXhwciB2YWxpZGF0ZShtTG9vcFN0YWNrKTsKKyAgICBub2RlLT50cmF2ZXJzZSgmdmFsaWRhdGUpOworICAgIHJldHVybiB2YWxpZGF0ZS5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgVmFsaWRhdGVMaW1pdGF0aW9uczo6dmFsaWRhdGVJbmRleGluZyhUSW50ZXJtQmluYXJ5KiBub2RlKQoreworICAgIEFTU0VSVCgobm9kZS0+Z2V0T3AoKSA9PSBFT3BJbmRleERpcmVjdCkgfHwKKyAgICAgICAgICAgKG5vZGUtPmdldE9wKCkgPT0gRU9wSW5kZXhJbmRpcmVjdCkpOworCisgICAgYm9vbCB2YWxpZCA9IHRydWU7CisgICAgVEludGVybVR5cGVkKiBpbmRleCA9IG5vZGUtPmdldFJpZ2h0KCk7CisgICAgLy8gVGhlIGluZGV4IGV4cHJlc3Npb24gbXVzdCBoYXZlIGludGVncmFsIHR5cGUuCisgICAgaWYgKCFpbmRleC0+aXNTY2FsYXIoKSB8fCAoaW5kZXgtPmdldEJhc2ljVHlwZSgpICE9IEVidEludCkpIHsKKyAgICAgICAgZXJyb3IoaW5kZXgtPmdldExpbmUoKSwKKyAgICAgICAgICAgICAgIkluZGV4IGV4cHJlc3Npb24gbXVzdCBoYXZlIGludGVncmFsIHR5cGUiLAorICAgICAgICAgICAgICBpbmRleC0+Z2V0Q29tcGxldGVTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICB9CisgICAgLy8gVGhlIGluZGV4IGV4cGVzc2lvbiBtdXN0IGJlIGEgY29uc3RhbnQtaW5kZXgtZXhwcmVzc2lvbiB1bmxlc3MKKyAgICAvLyB0aGUgb3BlcmFuZCBpcyBhIHVuaWZvcm0gaW4gYSB2ZXJ0ZXggc2hhZGVyLgorICAgIFRJbnRlcm1UeXBlZCogb3BlcmFuZCA9IG5vZGUtPmdldExlZnQoKTsKKyAgICBib29sIHNraXAgPSAobVNoYWRlclR5cGUgPT0gU0hfVkVSVEVYX1NIQURFUikgJiYKKyAgICAgICAgICAgICAgICAob3BlcmFuZC0+Z2V0UXVhbGlmaWVyKCkgPT0gRXZxVW5pZm9ybSk7CisgICAgaWYgKCFza2lwICYmICFpc0NvbnN0SW5kZXhFeHByKGluZGV4KSkgeworICAgICAgICBlcnJvcihpbmRleC0+Z2V0TGluZSgpLCAiSW5kZXggZXhwcmVzc2lvbiBtdXN0IGJlIGNvbnN0YW50IiwgIltdIik7CisgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB2YWxpZDsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVmFsaWRhdGVMaW1pdGF0aW9ucy5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVmFsaWRhdGVMaW1pdGF0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzVjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9WYWxpZGF0ZUxpbWl0YXRpb25zLmgKQEAgLTAsMCArMSw1OSBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJHTFNMQU5HL1NoYWRlckxhbmcuaCIKKyNpbmNsdWRlICJjb21waWxlci9pbnRlcm1lZGlhdGUuaCIKKworY2xhc3MgVEluZm9TaW5rQmFzZTsKKworc3RydWN0IFRMb29wSW5mbyB7CisgICAgc3RydWN0IFRJbmRleCB7CisgICAgICAgIGludCBpZDsgIC8vIHN5bWJvbCBpZC4KKyAgICB9IGluZGV4OworICAgIFRJbnRlcm1Mb29wKiBsb29wOworfTsKK3R5cGVkZWYgVFZlY3RvcjxUTG9vcEluZm8+IFRMb29wU3RhY2s7CisKKy8vIFRyYXZlcnNlcyBpbnRlcm1lZGlhdGUgdHJlZSB0byBlbnN1cmUgdGhhdCB0aGUgc2hhZGVyIGRvZXMgbm90IGV4Y2VlZCB0aGUKKy8vIG1pbmltdW0gZnVuY3Rpb25hbGl0eSBtYW5kYXRlZCBpbiBHTFNMIDEuMCBzcGVjLCBBcHBlbmRpeCBBLgorY2xhc3MgVmFsaWRhdGVMaW1pdGF0aW9ucyA6IHB1YmxpYyBUSW50ZXJtVHJhdmVyc2VyIHsKK3B1YmxpYzoKKyAgICBWYWxpZGF0ZUxpbWl0YXRpb25zKFNoU2hhZGVyVHlwZSBzaGFkZXJUeXBlLCBUSW5mb1NpbmtCYXNlJiBzaW5rKTsKKworICAgIGludCBudW1FcnJvcnMoKSBjb25zdCB7IHJldHVybiBtTnVtRXJyb3JzOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdmlzaXRCaW5hcnkoVmlzaXQsIFRJbnRlcm1CaW5hcnkqKTsKKyAgICB2aXJ0dWFsIGJvb2wgdmlzaXRVbmFyeShWaXNpdCwgVEludGVybVVuYXJ5Kik7CisgICAgdmlydHVhbCBib29sIHZpc2l0QWdncmVnYXRlKFZpc2l0LCBUSW50ZXJtQWdncmVnYXRlKik7CisgICAgdmlydHVhbCBib29sIHZpc2l0TG9vcChWaXNpdCwgVEludGVybUxvb3AqKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGVycm9yKFRTb3VyY2VMb2MgbG9jLCBjb25zdCBjaGFyICpyZWFzb24sIGNvbnN0IGNoYXIqIHRva2VuKTsKKworICAgIGJvb2wgd2l0aGluTG9vcEJvZHkoKSBjb25zdDsKKyAgICBib29sIGlzTG9vcEluZGV4KGNvbnN0IFRJbnRlcm1TeW1ib2wqIHN5bWJvbCkgY29uc3Q7CisgICAgYm9vbCB2YWxpZGF0ZUxvb3BUeXBlKFRJbnRlcm1Mb29wKiBub2RlKTsKKyAgICBib29sIHZhbGlkYXRlRm9yTG9vcEhlYWRlcihUSW50ZXJtTG9vcCogbm9kZSwgVExvb3BJbmZvKiBpbmZvKTsKKyAgICBib29sIHZhbGlkYXRlRm9yTG9vcEluaXQoVEludGVybUxvb3AqIG5vZGUsIFRMb29wSW5mbyogaW5mbyk7CisgICAgYm9vbCB2YWxpZGF0ZUZvckxvb3BDb25kKFRJbnRlcm1Mb29wKiBub2RlLCBUTG9vcEluZm8qIGluZm8pOworICAgIGJvb2wgdmFsaWRhdGVGb3JMb29wRXhwcihUSW50ZXJtTG9vcCogbm9kZSwgVExvb3BJbmZvKiBpbmZvKTsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgbm9uZSBvZiB0aGUgbG9vcCBpbmRpY2VzIGlzIHVzZWQgYXMgdGhlIGFyZ3VtZW50IHRvCisgICAgLy8gdGhlIGdpdmVuIGZ1bmN0aW9uIG91dCBvciBpbm91dCBwYXJhbWV0ZXIuCisgICAgYm9vbCB2YWxpZGF0ZUZ1bmN0aW9uQ2FsbChUSW50ZXJtQWdncmVnYXRlKiBub2RlKTsKKyAgICBib29sIHZhbGlkYXRlT3BlcmF0aW9uKFRJbnRlcm1PcGVyYXRvciogbm9kZSwgVEludGVybU5vZGUqIG9wZXJhbmQpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGluZGV4aW5nIGRvZXMgbm90IGV4Y2VlZCB0aGUgbWluaW11bSBmdW5jdGlvbmFsaXR5CisgICAgLy8gbWFuZGF0ZWQgaW4gR0xTTCAxLjAgc3BlYywgQXBwZW5kaXggQSwgU2VjdGlvbiA1LgorICAgIGJvb2wgaXNDb25zdEV4cHIoVEludGVybU5vZGUqIG5vZGUpOworICAgIGJvb2wgaXNDb25zdEluZGV4RXhwcihUSW50ZXJtTm9kZSogbm9kZSk7CisgICAgYm9vbCB2YWxpZGF0ZUluZGV4aW5nKFRJbnRlcm1CaW5hcnkqIG5vZGUpOworCisgICAgU2hTaGFkZXJUeXBlIG1TaGFkZXJUeXBlOworICAgIFRJbmZvU2lua0Jhc2UmIG1TaW5rOworICAgIGludCBtTnVtRXJyb3JzOworICAgIFRMb29wU3RhY2sgbUxvb3BTdGFjazsKK307CisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1ZhcmlhYmxlSW5mby5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9WYXJpYWJsZUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExM2E4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9WYXJpYWJsZUluZm8uY3BwCkBAIC0wLDAgKzEsMjIwIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaW5jbHVkZSAiY29tcGlsZXIvVmFyaWFibGVJbmZvLmgiCisKK3N0YXRpYyBUU3RyaW5nIGFycmF5QnJhY2tldHMoaW50IGluZGV4KQoreworICAgIFRTdHJpbmdTdHJlYW0gc3RyZWFtOworICAgIHN0cmVhbSA8PCAiWyIgPDwgaW5kZXggPDwgIl0iOworICAgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGRhdGEgdHlwZSBmb3IgYW4gYXR0cmlidXRlIG9yIHVuaWZvcm0uCitzdGF0aWMgU2hEYXRhVHlwZSBnZXRWYXJpYWJsZURhdGFUeXBlKGNvbnN0IFRUeXBlJiB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZS5nZXRCYXNpY1R5cGUoKSkgeworICAgICAgY2FzZSBFYnRGbG9hdDoKKyAgICAgICAgICBpZiAodHlwZS5pc01hdHJpeCgpKSB7CisgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXROb21pbmFsU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gU0hfRkxPQVRfTUFUMjsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBTSF9GTE9BVF9NQVQzOworICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFNIX0ZMT0FUX01BVDQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc1ZlY3RvcigpKSB7CisgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXROb21pbmFsU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gU0hfRkxPQVRfVkVDMjsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBTSF9GTE9BVF9WRUMzOworICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFNIX0ZMT0FUX1ZFQzQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJldHVybiBTSF9GTE9BVDsKKyAgICAgICAgICB9CisgICAgICBjYXNlIEVidEludDoKKyAgICAgICAgICBpZiAodHlwZS5pc01hdHJpeCgpKSB7CisgICAgICAgICAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzVmVjdG9yKCkpIHsKKyAgICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldE5vbWluYWxTaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBTSF9JTlRfVkVDMjsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBTSF9JTlRfVkVDMzsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBTSF9JTlRfVkVDNDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0dXJuIFNIX0lOVDsKKyAgICAgICAgICB9CisgICAgICBjYXNlIEVidEJvb2w6CisgICAgICAgICAgaWYgKHR5cGUuaXNNYXRyaXgoKSkgeworICAgICAgICAgICAgICBVTlJFQUNIQUJMRSgpOworICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc1ZlY3RvcigpKSB7CisgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXROb21pbmFsU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gU0hfQk9PTF9WRUMyOworICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFNIX0JPT0xfVkVDMzsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBTSF9CT09MX1ZFQzQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJldHVybiBTSF9CT09MOworICAgICAgICAgIH0KKyAgICAgIGNhc2UgRWJ0U2FtcGxlcjJEOiByZXR1cm4gU0hfU0FNUExFUl8yRDsKKyAgICAgIGNhc2UgRWJ0U2FtcGxlckN1YmU6IHJldHVybiBTSF9TQU1QTEVSX0NVQkU7CisgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgIH0KKyAgICByZXR1cm4gU0hfTk9ORTsKK30KKworc3RhdGljIHZvaWQgZ2V0QnVpbHRJblZhcmlhYmxlSW5mbyhjb25zdCBUVHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFN0cmluZyYgbWFwcGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFZhcmlhYmxlSW5mb0xpc3QmIGluZm9MaXN0KTsKK3N0YXRpYyB2b2lkIGdldFVzZXJEZWZpbmVkVmFyaWFibGVJbmZvKGNvbnN0IFRUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRTdHJpbmcmIG1hcHBlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVmFyaWFibGVJbmZvTGlzdCYgaW5mb0xpc3QpOworCisvLyBSZXR1cm5zIGluZm8gZm9yIGFuIGF0dHJpYnV0ZSBvciB1bmlmb3JtLgorc3RhdGljIHZvaWQgZ2V0VmFyaWFibGVJbmZvKGNvbnN0IFRUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFN0cmluZyYgbWFwcGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVmFyaWFibGVJbmZvTGlzdCYgaW5mb0xpc3QpCit7CisgICAgaWYgKHR5cGUuZ2V0QmFzaWNUeXBlKCkgPT0gRWJ0U3RydWN0KSB7CisgICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmdldEFycmF5U2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBUU3RyaW5nIGxuYW1lID0gbmFtZSArIGFycmF5QnJhY2tldHMoaSk7CisgICAgICAgICAgICAgICAgVFN0cmluZyBsbWFwcGVkTmFtZSA9IG1hcHBlZE5hbWUgKyBhcnJheUJyYWNrZXRzKGkpOworICAgICAgICAgICAgICAgIGdldFVzZXJEZWZpbmVkVmFyaWFibGVJbmZvKHR5cGUsIGxuYW1lLCBsbWFwcGVkTmFtZSwgaW5mb0xpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0VXNlckRlZmluZWRWYXJpYWJsZUluZm8odHlwZSwgbmFtZSwgbWFwcGVkTmFtZSwgaW5mb0xpc3QpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2V0QnVpbHRJblZhcmlhYmxlSW5mbyh0eXBlLCBuYW1lLCBtYXBwZWROYW1lLCBpbmZvTGlzdCk7CisgICAgfQorfQorCit2b2lkIGdldEJ1aWx0SW5WYXJpYWJsZUluZm8oY29uc3QgVFR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUU3RyaW5nJiBtYXBwZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRWYXJpYWJsZUluZm9MaXN0JiBpbmZvTGlzdCkKK3sKKyAgICBBU1NFUlQodHlwZS5nZXRCYXNpY1R5cGUoKSAhPSBFYnRTdHJ1Y3QpOworCisgICAgVFZhcmlhYmxlSW5mbyB2YXJJbmZvOworICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgeworICAgICAgICB2YXJJbmZvLm5hbWUgPSAobmFtZSArICJbMF0iKS5jX3N0cigpOworICAgICAgICB2YXJJbmZvLm1hcHBlZE5hbWUgPSAobWFwcGVkTmFtZSArICJbMF0iKS5jX3N0cigpOworICAgICAgICB2YXJJbmZvLnNpemUgPSB0eXBlLmdldEFycmF5U2l6ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhckluZm8ubmFtZSA9IG5hbWUuY19zdHIoKTsKKyAgICAgICAgdmFySW5mby5tYXBwZWROYW1lID0gbWFwcGVkTmFtZS5jX3N0cigpOworICAgICAgICB2YXJJbmZvLnNpemUgPSAxOworICAgIH0KKyAgICB2YXJJbmZvLnR5cGUgPSBnZXRWYXJpYWJsZURhdGFUeXBlKHR5cGUpOworICAgIGluZm9MaXN0LnB1c2hfYmFjayh2YXJJbmZvKTsKK30KKwordm9pZCBnZXRVc2VyRGVmaW5lZFZhcmlhYmxlSW5mbyhjb25zdCBUVHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFN0cmluZyYgbWFwcGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFZhcmlhYmxlSW5mb0xpc3QmIGluZm9MaXN0KQoreworICAgIEFTU0VSVCh0eXBlLmdldEJhc2ljVHlwZSgpID09IEVidFN0cnVjdCk7CisKKyAgICBjb25zdCBUVHlwZUxpc3QqIHN0cnVjdHVyZSA9IHR5cGUuZ2V0U3RydWN0KCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJ1Y3R1cmUtPnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IFRUeXBlKiBmaWVsZFR5cGUgPSAoKnN0cnVjdHVyZSlbaV0udHlwZTsKKyAgICAgICAgZ2V0VmFyaWFibGVJbmZvKCpmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgIi4iICsgZmllbGRUeXBlLT5nZXRGaWVsZE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZE5hbWUgKyAiLiIgKyBmaWVsZFR5cGUtPmdldEZpZWxkTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0xpc3QpOworICAgIH0KK30KKworQ29sbGVjdEF0dHJpYnNVbmlmb3Jtczo6Q29sbGVjdEF0dHJpYnNVbmlmb3JtcyhUVmFyaWFibGVJbmZvTGlzdCYgYXR0cmlicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFZhcmlhYmxlSW5mb0xpc3QmIHVuaWZvcm1zKQorICAgIDogbUF0dHJpYnMoYXR0cmlicyksCisgICAgICBtVW5pZm9ybXModW5pZm9ybXMpCit7Cit9CisKKy8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gYXR0cmlidXRlIGFuZCB1bmlmb3JtIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgordm9pZCBDb2xsZWN0QXR0cmlic1VuaWZvcm1zOjp2aXNpdFN5bWJvbChUSW50ZXJtU3ltYm9sKikKK3sKK30KKwordm9pZCBDb2xsZWN0QXR0cmlic1VuaWZvcm1zOjp2aXNpdENvbnN0YW50VW5pb24oVEludGVybUNvbnN0YW50VW5pb24qKQoreworfQorCitib29sIENvbGxlY3RBdHRyaWJzVW5pZm9ybXM6OnZpc2l0QmluYXJ5KFZpc2l0LCBUSW50ZXJtQmluYXJ5KikKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29sbGVjdEF0dHJpYnNVbmlmb3Jtczo6dmlzaXRVbmFyeShWaXNpdCwgVEludGVybVVuYXJ5KikKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29sbGVjdEF0dHJpYnNVbmlmb3Jtczo6dmlzaXRTZWxlY3Rpb24oVmlzaXQsIFRJbnRlcm1TZWxlY3Rpb24qKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDb2xsZWN0QXR0cmlic1VuaWZvcm1zOjp2aXNpdEFnZ3JlZ2F0ZShWaXNpdCwgVEludGVybUFnZ3JlZ2F0ZSogbm9kZSkKK3sKKyAgICBib29sIHZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKKworICAgIHN3aXRjaCAobm9kZS0+Z2V0T3AoKSkKKyAgICB7CisgICAgY2FzZSBFT3BTZXF1ZW5jZToKKyAgICAgICAgLy8gV2UgbmVlZCB0byB2aXNpdCBzZXF1ZW5jZSBjaGlsZHJlbiB0byBnZXQgdG8gdmFyaWFibGUgZGVjbGFyYXRpb25zLgorICAgICAgICB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFT3BEZWNsYXJhdGlvbjogeworICAgICAgICBjb25zdCBUSW50ZXJtU2VxdWVuY2UmIHNlcXVlbmNlID0gbm9kZS0+Z2V0U2VxdWVuY2UoKTsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsaWZpZXIgPSBzZXF1ZW5jZS5mcm9udCgpLT5nZXRBc1R5cGVkKCktPmdldFF1YWxpZmllcigpOworICAgICAgICBpZiAocXVhbGlmaWVyID09IEV2cUF0dHJpYnV0ZSB8fCBxdWFsaWZpZXIgPT0gRXZxVW5pZm9ybSkKKyAgICAgICAgeworICAgICAgICAgICAgVFZhcmlhYmxlSW5mb0xpc3QmIGluZm9MaXN0ID0gcXVhbGlmaWVyID09IEV2cUF0dHJpYnV0ZSA/CisgICAgICAgICAgICAgICAgbUF0dHJpYnMgOiBtVW5pZm9ybXM7CisgICAgICAgICAgICBmb3IgKFRJbnRlcm1TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgaSA9IHNlcXVlbmNlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgIGkgIT0gc2VxdWVuY2UuZW5kKCk7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBUSW50ZXJtU3ltYm9sKiB2YXJpYWJsZSA9ICgqaSktPmdldEFzU3ltYm9sTm9kZSgpOworICAgICAgICAgICAgICAgIC8vIFRoZSBvbmx5IGNhc2UgaW4gd2hpY2ggdGhlIHNlcXVlbmNlIHdpbGwgbm90IGNvbnRhaW4gYQorICAgICAgICAgICAgICAgIC8vIFRJbnRlcm1TeW1ib2wgbm9kZSBpcyBpbml0aWFsaXphdGlvbi4gSXQgd2lsbCBjb250YWluIGEKKyAgICAgICAgICAgICAgICAvLyBUSW50ZXJCaW5hcnkgbm9kZSBpbiB0aGF0IGNhc2UuIFNpbmNlIGF0dHJpYnV0ZXMgYW5kIHVuaWZyb21zCisgICAgICAgICAgICAgICAgLy8gY2Fubm90IGJlIGluaXRpYWxpemVkIGluIGEgc2hhZGVyLCB3ZSBtdXN0IGhhdmUgb25seQorICAgICAgICAgICAgICAgIC8vIFRJbnRlcm1TeW1ib2wgbm9kZXMgaW4gdGhlIHNlcXVlbmNlLgorICAgICAgICAgICAgICAgIEFTU0VSVCh2YXJpYWJsZSAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICBnZXRWYXJpYWJsZUluZm8odmFyaWFibGUtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUtPmdldE9yaWdpbmFsU3ltYm9sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5nZXRTeW1ib2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0xpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdmlzaXRDaGlsZHJlbjsKK30KKworYm9vbCBDb2xsZWN0QXR0cmlic1VuaWZvcm1zOjp2aXNpdExvb3AoVmlzaXQsIFRJbnRlcm1Mb29wKikKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29sbGVjdEF0dHJpYnNVbmlmb3Jtczo6dmlzaXRCcmFuY2goVmlzaXQsIFRJbnRlcm1CcmFuY2gqKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVmFyaWFibGVJbmZvLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9WYXJpYWJsZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjdhY2FmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVmFyaWFibGVJbmZvLmgKQEAgLTAsMCArMSw0MyBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDExIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2lmbmRlZiBDT01QSUxFUl9WQVJJQUJMRV9JTkZPX0hfCisjZGVmaW5lIENPTVBJTEVSX1ZBUklBQkxFX0lORk9fSF8KKworI2luY2x1ZGUgIkdMU0xBTkcvU2hhZGVyTGFuZy5oIgorI2luY2x1ZGUgImNvbXBpbGVyL2ludGVybWVkaWF0ZS5oIgorCisvLyBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHZhcmlhYmxlLgorLy8gSXQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgdG8gc3RvcmUgaW5mbyBhYm91dCBhY3RpdmUgYXR0cmlicyBhbmQgdW5pZm9ybXMuCitzdHJ1Y3QgVFZhcmlhYmxlSW5mbyB7CisgICAgVFBlcnNpc3RTdHJpbmcgbmFtZTsKKyAgICBUUGVyc2lzdFN0cmluZyBtYXBwZWROYW1lOworICAgIFNoRGF0YVR5cGUgdHlwZTsKKyAgICBpbnQgc2l6ZTsKK307Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPFRWYXJpYWJsZUluZm8+IFRWYXJpYWJsZUluZm9MaXN0OworCisvLyBUcmF2ZXJzZXMgaW50ZXJtZWRpYXRlIHRyZWUgdG8gY29sbGVjdCBhbGwgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMuCitjbGFzcyBDb2xsZWN0QXR0cmlic1VuaWZvcm1zIDogcHVibGljIFRJbnRlcm1UcmF2ZXJzZXIgeworcHVibGljOgorICAgIENvbGxlY3RBdHRyaWJzVW5pZm9ybXMoVFZhcmlhYmxlSW5mb0xpc3QmIGF0dHJpYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVmFyaWFibGVJbmZvTGlzdCYgdW5pZm9ybXMpOworCisgICAgdmlydHVhbCB2b2lkIHZpc2l0U3ltYm9sKFRJbnRlcm1TeW1ib2wqKTsKKyAgICB2aXJ0dWFsIHZvaWQgdmlzaXRDb25zdGFudFVuaW9uKFRJbnRlcm1Db25zdGFudFVuaW9uKik7CisgICAgdmlydHVhbCBib29sIHZpc2l0QmluYXJ5KFZpc2l0LCBUSW50ZXJtQmluYXJ5Kik7CisgICAgdmlydHVhbCBib29sIHZpc2l0VW5hcnkoVmlzaXQsIFRJbnRlcm1VbmFyeSopOworICAgIHZpcnR1YWwgYm9vbCB2aXNpdFNlbGVjdGlvbihWaXNpdCwgVEludGVybVNlbGVjdGlvbiopOworICAgIHZpcnR1YWwgYm9vbCB2aXNpdEFnZ3JlZ2F0ZShWaXNpdCwgVEludGVybUFnZ3JlZ2F0ZSopOworICAgIHZpcnR1YWwgYm9vbCB2aXNpdExvb3AoVmlzaXQsIFRJbnRlcm1Mb29wKik7CisgICAgdmlydHVhbCBib29sIHZpc2l0QnJhbmNoKFZpc2l0LCBUSW50ZXJtQnJhbmNoKik7CisKK3ByaXZhdGU6CisgICAgVFZhcmlhYmxlSW5mb0xpc3QmIG1BdHRyaWJzOworICAgIFRWYXJpYWJsZUluZm9MaXN0JiBtVW5pZm9ybXM7Cit9OworCisjZW5kaWYgIC8vIENPTVBJTEVSX1ZBUklBQkxFX0lORk9fSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1ZlcnNpb25HTFNMLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1ZlcnNpb25HTFNMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmNlZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVmVyc2lvbkdMU0wuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaW5jbHVkZSAiY29tcGlsZXIvVmVyc2lvbkdMU0wuaCIKKworc3RhdGljIGNvbnN0IGludCBHTFNMX1ZFUlNJT05fMTEwID0gMTEwOworc3RhdGljIGNvbnN0IGludCBHTFNMX1ZFUlNJT05fMTIwID0gMTIwOworCisvLyBXZSBuZWVkIHRvIHNjYW4gZm9yIHRocmVlIHRoaW5nczoKKy8vIDEuICJpbnZhcmlhbnQiIGtleXdvcmQ6IFRoaXMgY2FuIG9jY3VyIGluIGJvdGggLSB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMKKy8vICAgIGJ1dCBvbmx5IGF0IHRoZSBnbG9iYWwgc2NvcGUuCisvLyAyLiAiZ2xfUG9pbnRDb29yZCIgYnVpbHQtaW4gdmFyaWFibGU6IFRoaXMgY2FuIG9ubHkgb2NjdXIgaW4gZnJhZ21lbnQgc2hhZGVyCisvLyAgICBidXQgaW5zaWRlIGFueSBzY29wZS4KKy8vIDMuIENhbGwgdG8gYSBtYXRyaXggY29uc3RydWN0b3Igd2l0aCBhbm90aGVyIG1hdHJpeCBhcyBhcmd1bWVudC4KKy8vICAgIChUaGVzZSBjb25zdHJ1Y3RvcnMgd2VyZSByZXNlcnZlZCBpbiBHTFNMIHZlcnNpb24gMS4xMC4pCisvLworLy8gSWYgaXQgd2VyZW4ndCBmb3IgKDMpIHRoZW4gd2Ugd291bGQgb25seSBuZWVkIHRvIHNjYW4gdGhlIGdsb2JhbAorLy8gc2NvcGUgb2YgdGhlIHZlcnRleCBzaGFkZXIuIEhvd2V2ZXIsIHdlIG5lZWQgdG8gc2NhbiB0aGUgZW50aXJlCisvLyBzaGFkZXIgaW4gYm90aCBjYXNlcy4KKy8vCisvLyBUT0RPKGFsb2twKTogVGhlIGZvbGxvd2luZyB0d28gY2FzZXMgb2YgaW52YXJpYW50IGRlY2FsYXJhdGlvbiBnZXQgbG9zdAorLy8gZHVyaW5nIHBhcnNpbmcgLSB0aGV5IGRvIG5vdCBnZXQgY2FycmllZCBvdmVyIHRvIHRoZSBpbnRlcm1lZGlhdGUgdHJlZS4KKy8vIEhhbmRsZSB0aGVzZSBjYXNlczoKKy8vIDEuIFdoZW4gYSBwcmFnbWEgaXMgdXNlZCB0byBmb3JjZSBhbGwgb3V0cHV0IHZhcmlhYmxlcyB0byBiZSBpbnZhcmlhbnQ6CisvLyAgICAtICNwcmFnbWEgU1RER0wgaW52YXJpYW50KGFsbCkKKy8vIDIuIFdoZW4gYSBwcmV2aW91c2x5IGRlY2FsYXJlZCBvciBidWlsdC1pbiB2YXJpYWJsZSBpcyBtYXJrZWQgaW52YXJpYW50OgorLy8gICAgLSBpbnZhcmlhbnQgZ2xfUG9zaXRpb247CisvLyAgICAtIHZhcnlpbmcgdmVjMyBjb2xvcjsgaW52YXJpYW50IGNvbG9yOworLy8KK1RWZXJzaW9uR0xTTDo6VFZlcnNpb25HTFNMKFNoU2hhZGVyVHlwZSB0eXBlKQorICAgIDogbVNoYWRlclR5cGUodHlwZSksCisgICAgICBtVmVyc2lvbihHTFNMX1ZFUlNJT05fMTEwKQoreworfQorCit2b2lkIFRWZXJzaW9uR0xTTDo6dmlzaXRTeW1ib2woVEludGVybVN5bWJvbCogbm9kZSkKK3sKKyAgICBpZiAobm9kZS0+Z2V0U3ltYm9sKCkgPT0gImdsX1BvaW50Q29vcmQiKQorICAgICAgICB1cGRhdGVWZXJzaW9uKEdMU0xfVkVSU0lPTl8xMjApOworfQorCit2b2lkIFRWZXJzaW9uR0xTTDo6dmlzaXRDb25zdGFudFVuaW9uKFRJbnRlcm1Db25zdGFudFVuaW9uKikKK3sKK30KKworYm9vbCBUVmVyc2lvbkdMU0w6OnZpc2l0QmluYXJ5KFZpc2l0LCBUSW50ZXJtQmluYXJ5KikKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUVmVyc2lvbkdMU0w6OnZpc2l0VW5hcnkoVmlzaXQsIFRJbnRlcm1VbmFyeSopCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVFZlcnNpb25HTFNMOjp2aXNpdFNlbGVjdGlvbihWaXNpdCwgVEludGVybVNlbGVjdGlvbiopCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVFZlcnNpb25HTFNMOjp2aXNpdEFnZ3JlZ2F0ZShWaXNpdCwgVEludGVybUFnZ3JlZ2F0ZSogbm9kZSkKK3sKKyAgICBib29sIHZpc2l0Q2hpbGRyZW4gPSB0cnVlOworCisgICAgc3dpdGNoIChub2RlLT5nZXRPcCgpKSB7CisgICAgICBjYXNlIEVPcFNlcXVlbmNlOgorICAgICAgICAvLyBXZSBuZWVkIHRvIHZpc2l0IHNlcXVlbmNlIGNoaWxkcmVuIHRvIGdldCB0byBnbG9iYWwgb3IgaW5uZXIgc2NvcGUuCisgICAgICAgIHZpc2l0Q2hpbGRyZW4gPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU9wRGVjbGFyYXRpb246IHsKKyAgICAgICAgY29uc3QgVEludGVybVNlcXVlbmNlJiBzZXF1ZW5jZSA9IG5vZGUtPmdldFNlcXVlbmNlKCk7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbGlmaWVyID0gc2VxdWVuY2UuZnJvbnQoKS0+Z2V0QXNUeXBlZCgpLT5nZXRRdWFsaWZpZXIoKTsKKyAgICAgICAgaWYgKChxdWFsaWZpZXIgPT0gRXZxSW52YXJpYW50VmFyeWluZ0luKSB8fAorICAgICAgICAgICAgKHF1YWxpZmllciA9PSBFdnFJbnZhcmlhbnRWYXJ5aW5nT3V0KSkgeworICAgICAgICAgICAgdXBkYXRlVmVyc2lvbihHTFNMX1ZFUlNJT05fMTIwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRU9wQ29uc3RydWN0TWF0MjoKKyAgICAgIGNhc2UgRU9wQ29uc3RydWN0TWF0MzoKKyAgICAgIGNhc2UgRU9wQ29uc3RydWN0TWF0NDogeworICAgICAgICBjb25zdCBUSW50ZXJtU2VxdWVuY2UmIHNlcXVlbmNlID0gbm9kZS0+Z2V0U2VxdWVuY2UoKTsKKyAgICAgICAgaWYgKHNlcXVlbmNlLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgVEludGVybVR5cGVkKiB0eXBlZCA9IHNlcXVlbmNlLmZyb250KCktPmdldEFzVHlwZWQoKTsKKyAgICAgICAgICBpZiAodHlwZWQgJiYgdHlwZWQtPmlzTWF0cml4KCkpIHsKKyAgICAgICAgICAgIHVwZGF0ZVZlcnNpb24oR0xTTF9WRVJTSU9OXzEyMCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdmlzaXRDaGlsZHJlbjsKK30KKworYm9vbCBUVmVyc2lvbkdMU0w6OnZpc2l0TG9vcChWaXNpdCwgVEludGVybUxvb3AqKQoreworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFRWZXJzaW9uR0xTTDo6dmlzaXRCcmFuY2goVmlzaXQsIFRJbnRlcm1CcmFuY2gqKQoreworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRWZXJzaW9uR0xTTDo6dXBkYXRlVmVyc2lvbihpbnQgdmVyc2lvbikKK3sKKyAgICBtVmVyc2lvbiA9IHN0ZDo6bWF4KHZlcnNpb24sIG1WZXJzaW9uKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvVmVyc2lvbkdMU0wuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1ZlcnNpb25HTFNMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2ZmNiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL1ZlcnNpb25HTFNMLmgKQEAgLTAsMCArMSw1MiBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2lmbmRlZiBDT01QSUxFUl9WRVJTSU9OR0xTTF9IXworI2RlZmluZSBDT01QSUxFUl9WRVJTSU9OR0xTTF9IXworCisjaW5jbHVkZSAiR0xTTEFORy9TaGFkZXJMYW5nLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvaW50ZXJtZWRpYXRlLmgiCisKKy8vIFRyYXZlcnNlcyB0aGUgaW50ZXJtZWRpYXRlIHRyZWUgdG8gcmV0dXJuIHRoZSBtaW5pbXVtIEdMU0wgdmVyc2lvbgorLy8gcmVxdWlyZWQgdG8gbGVnYWxseSBhY2Nlc3MgYWxsIGJ1aWx0LWluIGZlYXR1cmVzIHVzZWQgaW4gdGhlIHNoYWRlci4KKy8vIEdMU0wgMS4xIHdoaWNoIGlzIG1hbmRhdGVkIGJ5IE9wZW5HTCAyLjAgcHJvdmlkZXM6CisvLyAgIC0gI3ZlcnNpb24gYW5kICNleHRlbnNpb24gdG8gZGVjbGFyZSB2ZXJzaW9uIGFuZCBleHRlbnNpb25zLgorLy8gICAtIGJ1aWx0LWluIGZ1bmN0aW9ucyByZWZyYWN0LCBleHAsIGFuZCBsb2cuCisvLyAgIC0gdXBkYXRlZCBzdGVwKCkgdG8gY29tcGFyZSB4IDwgZWRnZSBpbnN0ZWFkIG9mIHggPD0gZWRnZS4KKy8vIEdMU0wgMS4yIHdoaWNoIGlzIG1hbmRhdGVkIGJ5IE9wZW5HTCAyLjEgcHJvdmlkZXM6CisvLyAgIC0gbWFueSBjaGFuZ2VzIHRvIHJlZHVjZSBkaWZmZXJlbmNlcyB3aGVuIGNvbXBhcmVkIHRvIHRoZSBFUyBzcGVjaWZpY2F0aW9uLgorLy8gICAtIGludmFyaWFudCBrZXl3b3JkIGFuZCBpdHMgc3VwcG9ydC4KKy8vICAgLSBjKysgc3R5bGUgbmFtZSBoaWRpbmcgcnVsZXMuCisvLyAgIC0gYnVpbHQtaW4gdmFyaWFibGUgZ2xfUG9pbnRDb29yZCBmb3IgZnJhZ21lbnQgc2hhZGVycy4KKy8vICAgLSBtYXRyaXggY29uc3RydWN0b3JzIHRha2luZyBtYXRyaXggYXMgYXJndW1lbnQuCisvLworY2xhc3MgVFZlcnNpb25HTFNMIDogcHVibGljIFRJbnRlcm1UcmF2ZXJzZXIgeworcHVibGljOgorICAgIFRWZXJzaW9uR0xTTChTaFNoYWRlclR5cGUgdHlwZSk7CisKKyAgICAvLyBSZXR1cm5zIDEyMCBpZiAiaW52YXJpYW50IiBrZXl3b3JkLCAiZ2xfUG9pbnRDb29yZCIsIG9yCisgICAgLy8gbWF0cml4L21hdHJpeCBjb25zdHJ1Y3RvcnMgYXJlIHVzZWQgaW4gdGhlIHNoYWRlci4gRWxzZSAxMTAgaXMKKyAgICAvLyByZXR1cm5lZC4KKyAgICBpbnQgZ2V0VmVyc2lvbigpIHsgcmV0dXJuIG1WZXJzaW9uOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdmlzaXRTeW1ib2woVEludGVybVN5bWJvbCopOworICAgIHZpcnR1YWwgdm9pZCB2aXNpdENvbnN0YW50VW5pb24oVEludGVybUNvbnN0YW50VW5pb24qKTsKKyAgICB2aXJ0dWFsIGJvb2wgdmlzaXRCaW5hcnkoVmlzaXQsIFRJbnRlcm1CaW5hcnkqKTsKKyAgICB2aXJ0dWFsIGJvb2wgdmlzaXRVbmFyeShWaXNpdCwgVEludGVybVVuYXJ5Kik7CisgICAgdmlydHVhbCBib29sIHZpc2l0U2VsZWN0aW9uKFZpc2l0LCBUSW50ZXJtU2VsZWN0aW9uKik7CisgICAgdmlydHVhbCBib29sIHZpc2l0QWdncmVnYXRlKFZpc2l0LCBUSW50ZXJtQWdncmVnYXRlKik7CisgICAgdmlydHVhbCBib29sIHZpc2l0TG9vcChWaXNpdCwgVEludGVybUxvb3AqKTsKKyAgICB2aXJ0dWFsIGJvb2wgdmlzaXRCcmFuY2goVmlzaXQsIFRJbnRlcm1CcmFuY2gqKTsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgdXBkYXRlVmVyc2lvbihpbnQgdmVyc2lvbik7CisKK3ByaXZhdGU6CisgICAgU2hTaGFkZXJUeXBlIG1TaGFkZXJUeXBlOworICAgIGludCBtVmVyc2lvbjsKK307CisKKyNlbmRpZiAgLy8gQ09NUElMRVJfVkVSU0lPTkdMU0xfSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2RlYnVnLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2RlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQyZTFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZGVidWcuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIGRlYnVnLmNwcDogRGVidWdnaW5nIHV0aWxpdGllcy4KKworI2luY2x1ZGUgImNvbXBpbGVyL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY29tcGlsZXIvUGFyc2VIZWxwZXIuaCIKKworc3RhdGljIGNvbnN0IGludCBrVHJhY2VCdWZmZXJMZW4gPSAxMDI0OworCisjaWZkZWYgVFJBQ0VfRU5BQkxFRAorZXh0ZXJuICJDIiB7Cit2b2lkIFRyYWNlKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgICAgaWYgKCFmb3JtYXQpIHJldHVybjsKKworICAgIFRQYXJzZUNvbnRleHQqIHBhcnNlQ29udGV4dCA9IEdldEdsb2JhbFBhcnNlQ29udGV4dCgpOworICAgIGlmIChwYXJzZUNvbnRleHQpIHsKKyAgICAgICAgY2hhciBidWZba1RyYWNlQnVmZmVyTGVuXTsKKyAgICAgICAgdmFfbGlzdCBhcmdzOworICAgICAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgICAgICB2c25wcmludGYoYnVmLCBrVHJhY2VCdWZmZXJMZW4sIGZvcm1hdCwgYXJncyk7CisgICAgICAgIHZhX2VuZChhcmdzKTsKKworICAgICAgICBwYXJzZUNvbnRleHQtPmluZm9TaW5rLmRlYnVnIDw8IGJ1ZjsKKyAgICB9Cit9Cit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYgIC8vIFRSQUNFX0VOQUJMRUQKKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZGVidWcuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzNzE1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2RlYnVnLmgKQEAgLTAsMCArMSw1MyBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gZGVidWcuaDogRGVidWdnaW5nIHV0aWxpdGllcy4KKworI2lmbmRlZiBDT01QSUxFUl9ERUJVR19IXworI2RlZmluZSBDT01QSUxFUl9ERUJVR19IXworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpZmRlZiBfREVCVUcKKyNkZWZpbmUgVFJBQ0VfRU5BQkxFRCAgLy8gZGVmaW5lIHRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlIHRyYWNpbmcKKyNlbmRpZiAgLy8gX0RFQlVHCisKKy8vIE91dHB1dHMgdGV4dCB0byB0aGUgZGVidWcgbG9nCisjaWZkZWYgVFJBQ0VfRU5BQkxFRAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKK3ZvaWQgVHJhY2UoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmICAvLyBfX2NwbHVzcGx1cworCisjZWxzZSAgIC8vIFRSQUNFX0VOQUJMRUQKKworI2RlZmluZSBUcmFjZSguLi4pICgodm9pZCkwKQorCisjZW5kaWYgIC8vIFRSQUNFX0VOQUJMRUQKKworLy8gQSBtYWNybyBhc3NlcnRpbmcgYSBjb25kaXRpb24gYW5kIG91dHB1dHRpbmcgZmFpbHVyZXMgdG8gdGhlIGRlYnVnIGxvZworI2RlZmluZSBBU1NFUlQoZXhwcmVzc2lvbikgZG8geyBcCisgICAgaWYoIShleHByZXNzaW9uKSkgXAorICAgICAgICBUcmFjZSgiQXNzZXJ0IGZhaWxlZDogJXMoJWQpOiAiI2V4cHJlc3Npb24iXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorICAgIGFzc2VydChleHByZXNzaW9uKTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIFVOSU1QTEVNRU5URUQoKSBkbyB7IFwKKyAgICBUcmFjZSgiVW5pbXBsZW1lbnRlZCBpbnZva2VkOiAlcyglZClcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisgICAgYXNzZXJ0KGZhbHNlKTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIFVOUkVBQ0hBQkxFKCkgZG8geyBcCisgICAgVHJhY2UoIlVucmVhY2hhYmxlIHJlYWNoZWQ6ICVzKCVkKVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKyAgICBhc3NlcnQoZmFsc2UpOyBcCit9IHdoaWxlKDApCisKKyNlbmRpZiAgIC8vIENPTVBJTEVSX0RFQlVHX0hfCisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2dlbmVyYXRlX2dsc2xhbmdfbGV4ZXIuc2ggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nZW5lcmF0ZV9nbHNsYW5nX2xleGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODQ3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nZW5lcmF0ZV9nbHNsYW5nX2xleGVyLnNoCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyMgR2VuZXJhdGVzIEdMU0wgRVMgbGV4ZXIgLSBnbHNsYW5nX2xleC5jcHAKKworc2NyaXB0X2Rpcj0kKGRpcm5hbWUgJDApCitpbnB1dF9maWxlPSRzY3JpcHRfZGlyL2dsc2xhbmcubAorb3V0cHV0X2ZpbGU9JHNjcmlwdF9kaXIvZ2xzbGFuZ19sZXguY3BwCitmbGV4IC0tbm9saW5lIC0tbm91bmlzdGQgLS1vdXRmaWxlPSRvdXRwdXRfZmlsZSAkaW5wdXRfZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZ2VuZXJhdGVfZ2xzbGFuZ19wYXJzZXIuc2ggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nZW5lcmF0ZV9nbHNsYW5nX3BhcnNlci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODlmNWMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZ2VuZXJhdGVfZ2xzbGFuZ19wYXJzZXIuc2gKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworIyBHZW5lcmF0ZXMgR0xTTCBFUyBwYXJzZXIgLSBnbHNsYW5nX3RhYi5oIGFuZCBnbHNsYW5nX3RhYi5jcHAKKworc2NyaXB0X2Rpcj0kKGRpcm5hbWUgJDApCitpbnB1dF9maWxlPSRzY3JpcHRfZGlyL2dsc2xhbmcueQorb3V0cHV0X2hlYWRlcj0kc2NyaXB0X2Rpci9nbHNsYW5nX3RhYi5oCitvdXRwdXRfc291cmNlPSRzY3JpcHRfZGlyL2dsc2xhbmdfdGFiLmNwcAorYmlzb24gLS1uby1saW5lcyAtLXNrZWxldG9uPXlhY2MuYyAtLWRlZmluZXM9JG91dHB1dF9oZWFkZXIgLS1vdXRwdXQ9JG91dHB1dF9zb3VyY2UgJGlucHV0X2ZpbGUKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2dsc2xhbmcuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2dsc2xhbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmYxNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZ2xzbGFuZy5oCkBAIC0wLDAgKzEsMTYgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCitzdHJ1Y3QgVFBhcnNlQ29udGV4dDsKK2V4dGVybiBpbnQgZ2xzbGFuZ19pbml0aWFsaXplKFRQYXJzZUNvbnRleHQqIGNvbnRleHQpOworZXh0ZXJuIGludCBnbHNsYW5nX2ZpbmFsaXplKFRQYXJzZUNvbnRleHQqIGNvbnRleHQpOworCitleHRlcm4gdm9pZCBnbHNsYW5nX3NjYW4oaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZW5ndGhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUGFyc2VDb250ZXh0KiBjb250ZXh0KTsKK2V4dGVybiBpbnQgZ2xzbGFuZ19wYXJzZShUUGFyc2VDb250ZXh0KiBjb250ZXh0KTsKKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZ2xzbGFuZy5sIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZ2xzbGFuZy5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2M1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nbHNsYW5nLmwKQEAgLTAsMCArMSw1NzAgQEAKKy8qCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCitUaGlzIGZpbGUgY29udGFpbnMgdGhlIExleCBzcGVjaWZpY2F0aW9uIGZvciBHTFNMIEVTLgorQmFzZWQgb24gQU5TSSBDIGdyYW1tYXIsIExleCBzcGVjaWZpY2F0aW9uOgoraHR0cDovL3d3dy5seXNhdG9yLmxpdS5zZS9jL0FOU0ktQy1ncmFtbWFyLWwuaHRtbAorCitJRiBZT1UgTU9ESUZZIFRISVMgRklMRSBZT1UgQUxTTyBORUVEIFRPIFJVTiBnZW5lcmF0ZV9nbHNsYW5nX2xleGVyLnNoLAorV0hJQ0ggR0VORVJBVEVTIFRIRSBHTFNMIEVTIExFWEVSIChnbHNsYW5nX2xleC5jcHApLgorKi8KKworJXRvcHsKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZ2VuZXJhdGVfZ2xzbGFuZ19sZXhlci5zaC4gRE8gTk9UIEVESVQhCit9CisKKyV7CisjaW5jbHVkZSAiY29tcGlsZXIvZ2xzbGFuZy5oIgorI2luY2x1ZGUgImNvbXBpbGVyL1BhcnNlSGVscGVyLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvdXRpbC5oIgorI2luY2x1ZGUgImdsc2xhbmdfdGFiLmgiCisKKy8qIHdpbmRvd3Mgb25seSBwcmFnbWEgKi8KKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MTAyKQorI2VuZGlmCisKKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geXlsdmFsLT5sZXgubGluZSA9IHl5bGluZW5vOworI2RlZmluZSBZWV9JTlBVVChidWYsIHJlc3VsdCwgbWF4X3NpemUpIFwKKyAgICByZXN1bHQgPSBzdHJpbmdfaW5wdXQoYnVmLCBtYXhfc2l6ZSwgeXlzY2FubmVyKTsKKworc3RhdGljIGludCBzdHJpbmdfaW5wdXQoY2hhciogYnVmLCBpbnQgbWF4X3NpemUsIHl5c2Nhbl90IHl5c2Nhbm5lcik7CitzdGF0aWMgaW50IGNoZWNrX3R5cGUoeXlzY2FuX3QgeXlzY2FubmVyKTsKK3N0YXRpYyBpbnQgcmVzZXJ2ZWRfd29yZCh5eXNjYW5fdCB5eXNjYW5uZXIpOworJX0KKworJW9wdGlvbiBub3l5d3JhcCBub3VucHV0IG5ldmVyLWludGVyYWN0aXZlCislb3B0aW9uIHl5bGluZW5vIHJlZW50cmFudCBiaXNvbi1icmlkZ2UKKyVvcHRpb24gc3RhY2sKKyVvcHRpb24gZXh0cmEtdHlwZT0iVFBhcnNlQ29udGV4dCoiCisleCBDT01NRU5UIEZJRUxEUworCitEICAgICAgICAgICBbMC05XQorTCAgICAgICAgICAgW2EtekEtWl9dCitIICAgICAgICAgICBbYS1mQS1GMC05XQorRSAgICAgICAgICAgW0VlXVsrLV0/e0R9KworTyAgICAgICAgICAgWzAtN10KKworJSUKKworJXsKKyAgICBUUGFyc2VDb250ZXh0KiBjb250ZXh0ID0geXlleHRyYTsKKyV9CisKKyAgICAvKiBTaW5nbGUtbGluZSBjb21tZW50cyAqLworIi8vIlteXG5dKiA7CisKKyAgICAvKiBNdWx0aS1saW5lIGNvbW1lbnRzICovCisiLyoiICAgICAgICAgICB7IHl5X3B1c2hfc3RhdGUoQ09NTUVOVCwgeXlzY2FubmVyKTsgfQorPENPTU1FTlQ+LiB8Cis8Q09NTUVOVD5cbiA7Cis8Q09NTUVOVD4iKi8iICB7IHl5X3BvcF9zdGF0ZSh5eXNjYW5uZXIpOyB9CisKKyJpbnZhcmlhbnQiICAgIHsgcmV0dXJuKElOVkFSSUFOVCk7IH0KKyJoaWdocCIgICAgICAgIHsgcmV0dXJuKEhJR0hfUFJFQ0lTSU9OKTsgfQorIm1lZGl1bXAiICAgICAgeyByZXR1cm4oTUVESVVNX1BSRUNJU0lPTik7IH0KKyJsb3dwIiAgICAgICAgIHsgcmV0dXJuKExPV19QUkVDSVNJT04pOyB9CisicHJlY2lzaW9uIiAgICB7IHJldHVybihQUkVDSVNJT04pOyB9CisKKyJhdHRyaWJ1dGUiICAgIHsgcmV0dXJuKEFUVFJJQlVURSk7IH0KKyJjb25zdCIgICAgICAgIHsgcmV0dXJuKENPTlNUX1FVQUwpOyB9CisidW5pZm9ybSIgICAgICB7IHJldHVybihVTklGT1JNKTsgfQorInZhcnlpbmciICAgICAgeyByZXR1cm4oVkFSWUlORyk7IH0KKworImJyZWFrIiAgICAgICAgeyByZXR1cm4oQlJFQUspOyB9CisiY29udGludWUiICAgICB7IHJldHVybihDT05USU5VRSk7IH0KKyJkbyIgICAgICAgICAgIHsgcmV0dXJuKERPKTsgfQorImZvciIgICAgICAgICAgeyByZXR1cm4oRk9SKTsgfQorIndoaWxlIiAgICAgICAgeyByZXR1cm4oV0hJTEUpOyB9CisKKyJpZiIgICAgICAgICAgIHsgcmV0dXJuKElGKTsgfQorImVsc2UiICAgICAgICAgeyByZXR1cm4oRUxTRSk7IH0KKworImluIiAgICAgICAgICAgeyByZXR1cm4oSU5fUVVBTCk7IH0KKyJvdXQiICAgICAgICAgIHsgcmV0dXJuKE9VVF9RVUFMKTsgfQorImlub3V0IiAgICAgICAgeyByZXR1cm4oSU5PVVRfUVVBTCk7IH0KKworImZsb2F0IiAgICAgICAgeyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4oRkxPQVRfVFlQRSk7IH0KKyJpbnQiICAgICAgICAgIHsgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gdHJ1ZTsgcmV0dXJuKElOVF9UWVBFKTsgfQorInZvaWQiICAgICAgICAgeyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4oVk9JRF9UWVBFKTsgfQorImJvb2wiICAgICAgICAgeyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4oQk9PTF9UWVBFKTsgfQorInRydWUiICAgICAgICAgeyB5eWx2YWwtPmxleC5iID0gdHJ1ZTsgIHJldHVybihCT09MQ09OU1RBTlQpOyB9CisiZmFsc2UiICAgICAgICB7IHl5bHZhbC0+bGV4LmIgPSBmYWxzZTsgcmV0dXJuKEJPT0xDT05TVEFOVCk7IH0KKworImRpc2NhcmQiICAgICAgeyByZXR1cm4oRElTQ0FSRCk7IH0KKyJyZXR1cm4iICAgICAgIHsgcmV0dXJuKFJFVFVSTik7IH0KKworIm1hdDIiICAgICAgICAgeyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4oTUFUUklYMik7IH0KKyJtYXQzIiAgICAgICAgIHsgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gdHJ1ZTsgcmV0dXJuKE1BVFJJWDMpOyB9CisibWF0NCIgICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybihNQVRSSVg0KTsgfQorCisidmVjMiIgICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybiAoVkVDMik7IH0KKyJ2ZWMzIiAgICAgICAgIHsgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gdHJ1ZTsgcmV0dXJuIChWRUMzKTsgfQorInZlYzQiICAgICAgICAgeyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gKFZFQzQpOyB9CisiaXZlYzIiICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybiAoSVZFQzIpOyB9CisiaXZlYzMiICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybiAoSVZFQzMpOyB9CisiaXZlYzQiICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybiAoSVZFQzQpOyB9CisiYnZlYzIiICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybiAoQlZFQzIpOyB9CisiYnZlYzMiICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybiAoQlZFQzMpOyB9CisiYnZlYzQiICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybiAoQlZFQzQpOyB9CisKKyJzYW1wbGVyMkQiICAgICAgIHsgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gdHJ1ZTsgcmV0dXJuIFNBTVBMRVIyRDsgfQorInNhbXBsZXJDdWJlIiAgICAgeyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gU0FNUExFUkNVQkU7IH0KKworInN0cnVjdCIgICAgICAgeyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4oU1RSVUNUKTsgfQorCisiYXNtIiAgICAgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKworImNsYXNzIiAgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisidW5pb24iICAgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJlbnVtIiAgICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorInR5cGVkZWYiICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisidGVtcGxhdGUiICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJ0aGlzIiAgICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorInBhY2tlZCIgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisKKyJnb3RvIiAgICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorInN3aXRjaCIgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisiZGVmYXVsdCIgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKworImlubGluZSIgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9Cisibm9pbmxpbmUiICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJ2b2xhdGlsZSIgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorInB1YmxpYyIgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9Cisic3RhdGljIiAgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJleHRlcm4iICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorImV4dGVybmFsIiAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisiaW50ZXJmYWNlIiAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKworImxvbmciICAgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9Cisic2hvcnQiICAgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJkb3VibGUiICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorImhhbGYiICAgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisiZml4ZWQiICAgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJ1bnNpZ25lZCIgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCisiaW5wdXQiICAgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJvdXRwdXQiICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCisiaHZlYzIiICAgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJodmVjMyIgICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorImh2ZWM0IiAgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisiZnZlYzIiICAgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJmdmVjMyIgICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorImZ2ZWM0IiAgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisiZHZlYzIiICAgICAgICB7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKyJkdmVjMyIgICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorImR2ZWM0IiAgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisKKyJzaXplb2YiICAgICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorImNhc3QiICAgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisKKyJuYW1lc3BhY2UiICAgIHsgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorInVzaW5nIiAgICAgICAgeyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisKK3tMfSh7TH18e0R9KSogICAgICAgeworICAgeXlsdmFsLT5sZXguc3RyaW5nID0gTmV3UG9vbFRTdHJpbmcoeXl0ZXh0KTsgCisgICByZXR1cm4gY2hlY2tfdHlwZSh5eXNjYW5uZXIpOworfQorCiswW3hYXXtIfSsgICAgICAgICB7IHl5bHZhbC0+bGV4LmkgPSBzdHJ0b2woeXl0ZXh0LCAwLCAwKTsgcmV0dXJuKElOVENPTlNUQU5UKTsgfQorMHtPfSsgICAgICAgICAgICAgeyB5eWx2YWwtPmxleC5pID0gc3RydG9sKHl5dGV4dCwgMCwgMCk7IHJldHVybihJTlRDT05TVEFOVCk7IH0KKzB7RH0rICAgICAgICAgICAgIHsgY29udGV4dC0+ZXJyb3IoeXlsaW5lbm8sICJJbnZhbGlkIE9jdGFsIG51bWJlci4iLCB5eXRleHQsICIiLCAiIik7IGNvbnRleHQtPnJlY292ZXIoKTsgcmV0dXJuIDA7fQore0R9KyAgICAgICAgICAgICAgeyB5eWx2YWwtPmxleC5pID0gc3RydG9sKHl5dGV4dCwgMCwgMCk7IHJldHVybihJTlRDT05TVEFOVCk7IH0KKwore0R9K3tFfSAgICAgICAgICAgeyB5eWx2YWwtPmxleC5mID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGF0b2ZfZG90KHl5dGV4dCkpOyByZXR1cm4oRkxPQVRDT05TVEFOVCk7IH0KK3tEfSsiLiJ7RH0qKHtFfSk/IHsgeXlsdmFsLT5sZXguZiA9IHN0YXRpY19jYXN0PGZsb2F0PihhdG9mX2RvdCh5eXRleHQpKTsgcmV0dXJuKEZMT0FUQ09OU1RBTlQpOyB9CisiLiJ7RH0rKHtFfSk/ICAgICB7IHl5bHZhbC0+bGV4LmYgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXRvZl9kb3QoeXl0ZXh0KSk7IHJldHVybihGTE9BVENPTlNUQU5UKTsgfQorCisiKz0iICAgICAgICAgICAgeyAgcmV0dXJuKEFERF9BU1NJR04pOyB9CisiLT0iICAgICAgICAgICAgeyAgcmV0dXJuKFNVQl9BU1NJR04pOyB9CisiKj0iICAgICAgICAgICAgeyAgcmV0dXJuKE1VTF9BU1NJR04pOyB9CisiLz0iICAgICAgICAgICAgeyAgcmV0dXJuKERJVl9BU1NJR04pOyB9CisiJT0iICAgICAgICAgICAgeyAgcmV0dXJuKE1PRF9BU1NJR04pOyB9CisiPDw9IiAgICAgICAgICAgeyAgcmV0dXJuKExFRlRfQVNTSUdOKTsgfQorIj4+PSIgICAgICAgICAgIHsgIHJldHVybihSSUdIVF9BU1NJR04pOyB9CisiJj0iICAgICAgICAgICAgeyAgcmV0dXJuKEFORF9BU1NJR04pOyB9CisiXj0iICAgICAgICAgICAgeyAgcmV0dXJuKFhPUl9BU1NJR04pOyB9CisifD0iICAgICAgICAgICAgeyAgcmV0dXJuKE9SX0FTU0lHTik7IH0KKworIisrIiAgICAgICAgICAgIHsgIHJldHVybihJTkNfT1ApOyB9CisiLS0iICAgICAgICAgICAgeyAgcmV0dXJuKERFQ19PUCk7IH0KKyImJiIgICAgICAgICAgICB7ICByZXR1cm4oQU5EX09QKTsgfQorInx8IiAgICAgICAgICAgIHsgIHJldHVybihPUl9PUCk7IH0KKyJeXiIgICAgICAgICAgICB7ICByZXR1cm4oWE9SX09QKTsgfQorIjw9IiAgICAgICAgICAgIHsgIHJldHVybihMRV9PUCk7IH0KKyI+PSIgICAgICAgICAgICB7ICByZXR1cm4oR0VfT1ApOyB9CisiPT0iICAgICAgICAgICAgeyAgcmV0dXJuKEVRX09QKTsgfQorIiE9IiAgICAgICAgICAgIHsgIHJldHVybihORV9PUCk7IH0KKyI8PCIgICAgICAgICAgICB7ICByZXR1cm4oTEVGVF9PUCk7IH0KKyI+PiIgICAgICAgICAgICB7ICByZXR1cm4oUklHSFRfT1ApOyB9CisiOyIgICAgICAgICAgICAgeyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSBmYWxzZTsgcmV0dXJuKFNFTUlDT0xPTik7IH0KKygieyJ8IjwlIikgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IGZhbHNlOyByZXR1cm4oTEVGVF9CUkFDRSk7IH0KKygifSJ8IiU+IikgICAgICB7IHJldHVybihSSUdIVF9CUkFDRSk7IH0KKyIsIiAgICAgICAgIHsgaWYgKGNvbnRleHQtPmluVHlwZVBhcmVuKSBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSBmYWxzZTsgcmV0dXJuKENPTU1BKTsgfQorIjoiICAgICAgICAgeyByZXR1cm4oQ09MT04pOyB9CisiPSIgICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IGZhbHNlOyByZXR1cm4oRVFVQUwpOyB9CisiKCIgICAgICAgICB7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IGZhbHNlOyBjb250ZXh0LT5pblR5cGVQYXJlbiA9IHRydWU7IHJldHVybihMRUZUX1BBUkVOKTsgfQorIikiICAgICAgICAgeyBjb250ZXh0LT5pblR5cGVQYXJlbiA9IGZhbHNlOyByZXR1cm4oUklHSFRfUEFSRU4pOyB9CisoIlsifCI8OiIpICAgICAgeyByZXR1cm4oTEVGVF9CUkFDS0VUKTsgfQorKCJdInwiOj4iKSAgICAgIHsgcmV0dXJuKFJJR0hUX0JSQUNLRVQpOyB9CisiLiIgICAgICAgICB7IEJFR0lOKEZJRUxEUyk7ICByZXR1cm4oRE9UKTsgfQorIiEiICAgICAgICAgeyByZXR1cm4oQkFORyk7IH0KKyItIiAgICAgICAgIHsgcmV0dXJuKERBU0gpOyB9CisifiIgICAgICAgICB7IHJldHVybihUSUxERSk7IH0KKyIrIiAgICAgICAgIHsgcmV0dXJuKFBMVVMpOyB9CisiKiIgICAgICAgICB7IHJldHVybihTVEFSKTsgfQorIi8iICAgICAgICAgeyByZXR1cm4oU0xBU0gpOyB9CisiJSIgICAgICAgICB7IHJldHVybihQRVJDRU5UKTsgfQorIjwiICAgICAgICAgeyByZXR1cm4oTEVGVF9BTkdMRSk7IH0KKyI+IiAgICAgICAgIHsgcmV0dXJuKFJJR0hUX0FOR0xFKTsgfQorInwiICAgICAgICAgeyByZXR1cm4oVkVSVElDQUxfQkFSKTsgfQorIl4iICAgICAgICAgeyByZXR1cm4oQ0FSRVQpOyB9CisiJiIgICAgICAgICB7IHJldHVybihBTVBFUlNBTkQpOyB9CisiPyIgICAgICAgICB7IHJldHVybihRVUVTVElPTik7IH0KKworPEZJRUxEUz57TH0oe0x9fHtEfSkqIHsgCisgICAgQkVHSU4oSU5JVElBTCk7CisgICAgeXlsdmFsLT5sZXguc3RyaW5nID0gTmV3UG9vbFRTdHJpbmcoeXl0ZXh0KTsgCisgICAgcmV0dXJuIEZJRUxEX1NFTEVDVElPTjsKK30KKzxGSUVMRFM+WyBcdFx2XGZccl0ge30KKworWyBcdFx2XG5cZlxyXSAgIHsgIH0KKzwqPjw8RU9GPj4gICAgICB7IGNvbnRleHQtPkFmdGVyRU9GID0gdHJ1ZTsgeXl0ZXJtaW5hdGUoKTsgfQorPCo+LiAgICAgICAgICAgIHsgY29udGV4dC0+d2FybmluZyh5eWxpbmVubywgIlVua25vd24gY2hhciIsIHl5dGV4dCwgIiIpOyByZXR1cm4gMDsgfQorCislJQorCitleHRlcm4gIkMiIHsKKy8vIFByZXByb2Nlc3NvciBpbnRlcmZhY2UuCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL3ByZXByb2Nlc3MuaCIKKworI2RlZmluZSBTRVRVUF9DT05URVhUKHBwKSBcCisgICAgVFBhcnNlQ29udGV4dCogY29udGV4dCA9IChUUGFyc2VDb250ZXh0KikgcHAtPnBDOyBcCisgICAgc3RydWN0IHl5Z3V0c190KiB5eWcgPSAoc3RydWN0IHl5Z3V0c190KikgY29udGV4dC0+c2Nhbm5lcjsKKworLy8gUHJlcHJvY2Vzc29yIGNhbGxiYWNrcy4KK3ZvaWQgQ1BQRGVidWdMb2dNc2coY29uc3QgY2hhciAqbXNnKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBjb250ZXh0LT5pbmZvU2luay5kZWJ1Zy5tZXNzYWdlKEVQcmVmaXhOb25lLCBtc2cpOworfQorCit2b2lkIENQUFdhcm5pbmdUb0luZm9Mb2coY29uc3QgY2hhciAqbXNnKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBjb250ZXh0LT53YXJuaW5nKHl5bGluZW5vLCBtc2csICIiLCAiIik7Cit9CisKK3ZvaWQgQ1BQU2hJbmZvTG9nTXNnKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgY29udGV4dC0+ZXJyb3IoeXlsaW5lbm8sIG1zZywgIiIsICIiKTsKKyAgICBjb250ZXh0LT5yZWNvdmVyKCk7Cit9CisKK3ZvaWQgQ1BQRXJyb3JUb0luZm9Mb2coY2hhciAqbXNnKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBjb250ZXh0LT5lcnJvcih5eWxpbmVubywgbXNnLCAiIiwgIiIpOworICAgIGNvbnRleHQtPnJlY292ZXIoKTsKK30KKwordm9pZCBTZXRMaW5lTnVtYmVyKGludCBsaW5lKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBpbnQgc3RyaW5nID0gMDsKKyAgICBEZWNvZGVTb3VyY2VMb2MoeXlsaW5lbm8sICZzdHJpbmcsIE5VTEwpOworICAgIHl5bGluZW5vID0gRW5jb2RlU291cmNlTG9jKHN0cmluZywgbGluZSk7Cit9CisKK3ZvaWQgU2V0U3RyaW5nTnVtYmVyKGludCBzdHJpbmcpCit7CisgICAgU0VUVVBfQ09OVEVYVChjcHApOworICAgIGludCBsaW5lID0gMDsKKyAgICBEZWNvZGVTb3VyY2VMb2MoeXlsaW5lbm8sIE5VTEwsICZsaW5lKTsKKyAgICB5eWxpbmVubyA9IEVuY29kZVNvdXJjZUxvYyhzdHJpbmcsIGxpbmUpOworfQorCitpbnQgR2V0U3RyaW5nTnVtYmVyKCkKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgaW50IHN0cmluZyA9IDA7CisgICAgRGVjb2RlU291cmNlTG9jKHl5bGluZW5vLCAmc3RyaW5nLCBOVUxMKTsKKyAgICByZXR1cm4gc3RyaW5nOworfQorCitpbnQgR2V0TGluZU51bWJlcigpCit7CisgICAgU0VUVVBfQ09OVEVYVChjcHApOworICAgIGludCBsaW5lID0gMDsKKyAgICBEZWNvZGVTb3VyY2VMb2MoeXlsaW5lbm8sIE5VTEwsICZsaW5lKTsKKyAgICByZXR1cm4gbGluZTsKK30KKwordm9pZCBJbmNMaW5lTnVtYmVyKCkKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgaW50IHN0cmluZyA9IDAsIGxpbmUgPSAwOworICAgIERlY29kZVNvdXJjZUxvYyh5eWxpbmVubywgJnN0cmluZywgJmxpbmUpOworICAgIHl5bGluZW5vID0gRW5jb2RlU291cmNlTG9jKHN0cmluZywgKytsaW5lKTsKK30KKwordm9pZCBEZWNMaW5lTnVtYmVyKCkKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgaW50IHN0cmluZyA9IDAsIGxpbmUgPSAwOworICAgIERlY29kZVNvdXJjZUxvYyh5eWxpbmVubywgJnN0cmluZywgJmxpbmUpOworICAgIHl5bGluZW5vID0gRW5jb2RlU291cmNlTG9jKHN0cmluZywgLS1saW5lKTsKK30KKwordm9pZCBIYW5kbGVQcmFnbWEoY29uc3QgY2hhciAqKnRva2VucywgaW50IG51bVRva2VucykKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgaWYgKCFzdHJjbXAodG9rZW5zWzBdLCAib3B0aW1pemUiKSkgeworICAgICAgICBpZiAobnVtVG9rZW5zICE9IDQpIHsKKyAgICAgICAgICAgIENQUFNoSW5mb0xvZ01zZygib3B0aW1pemUgcHJhZ21hIHN5bnRheCBpcyBpbmNvcnJlY3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHN0cmNtcCh0b2tlbnNbMV0sICIoIikpIHsKKyAgICAgICAgICAgIENQUFNoSW5mb0xvZ01zZygiXCIoXCIgZXhwZWN0ZWQgYWZ0ZXIgJ29wdGltaXplJyBrZXl3b3JkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBpZiAoIXN0cmNtcCh0b2tlbnNbMl0sICJvbiIpKQorICAgICAgICAgICAgY29udGV4dC0+Y29udGV4dFByYWdtYS5vcHRpbWl6ZSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodG9rZW5zWzJdLCAib2ZmIikpCisgICAgICAgICAgICBjb250ZXh0LT5jb250ZXh0UHJhZ21hLm9wdGltaXplID0gZmFsc2U7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKCJcIm9uXCIgb3IgXCJvZmZcIiBleHBlY3RlZCBhZnRlciAnKCcgZm9yICdvcHRpbWl6ZScgcHJhZ21hIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzdHJjbXAodG9rZW5zWzNdLCAiKSIpKSB7CisgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2coIlwiKVwiIGV4cGVjdGVkIHRvIGVuZCAnb3B0aW1pemUnIHByYWdtYSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKHRva2Vuc1swXSwgImRlYnVnIikpIHsKKyAgICAgICAgaWYgKG51bVRva2VucyAhPSA0KSB7CisgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2coImRlYnVnIHByYWdtYSBzeW50YXggaXMgaW5jb3JyZWN0Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzdHJjbXAodG9rZW5zWzFdLCAiKCIpKSB7CisgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2coIlwiKFwiIGV4cGVjdGVkIGFmdGVyICdkZWJ1Zycga2V5d29yZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKCFzdHJjbXAodG9rZW5zWzJdLCAib24iKSkKKyAgICAgICAgICAgIGNvbnRleHQtPmNvbnRleHRQcmFnbWEuZGVidWcgPSB0cnVlOworICAgICAgICBlbHNlIGlmICghc3RyY21wKHRva2Vuc1syXSwgIm9mZiIpKQorICAgICAgICAgICAgY29udGV4dC0+Y29udGV4dFByYWdtYS5kZWJ1ZyA9IGZhbHNlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIENQUFNoSW5mb0xvZ01zZygiXCJvblwiIG9yIFwib2ZmXCIgZXhwZWN0ZWQgYWZ0ZXIgJygnIGZvciAnZGVidWcnIHByYWdtYSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3RyY21wKHRva2Vuc1szXSwgIikiKSkgeworICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKCJcIilcIiBleHBlY3RlZCB0byBlbmQgJ2RlYnVnJyBwcmFnbWEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjaWZkZWYgUFJBR01BX1RBQkxFCisgICAgICAgIC8vCisgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIHByYWdtYQorICAgICAgICAvLyB1c2UgKChUUGFyc2VDb250ZXh0ICopY3BwLT5wQyktPmNvbnRleHRQcmFnbWEucHJhZ21hVGFibGUgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHByYWdtYQorICAgICAgICAvLyBGb3Igbm93LCBqdXN0IGlnbm9yZSB0aGUgcHJhZ21hIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGNhbm5vdCByZWNvZ25pemUKKyAgICAgICAgLy8gQW4gRXhhbXBsZSBvZiBvbmUgc3VjaCBpbXBsZW1lbnRhdGlvbiBmb3IgYSBwcmFnbWEgdGhhdCBoYXMgYSBzeW50YXggbGlrZQorICAgICAgICAvLyAjcHJhZ21hIHByYWdtYW5hbWUocHJhZ21hdmFsdWUpCisgICAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gc3RvcmVzIHRoZSBjdXJyZW50IHByYWdtYXZhbHVlIGFnYWluc3QgdGhlIHByYWdtYSBuYW1lIGluIHByYWdtYVRhYmxlLgorICAgICAgICAvLyAgICAgICAgCisgICAgICAgIGlmIChudW1Ub2tlbnMgPT0gNCAmJiAhc3RyY21wKHRva2Vuc1sxXSwgIigiKSAmJiAhc3RyY21wKHRva2Vuc1szXSwgIikiKSkgeyAgICAgICAgICAgICAgCisgICAgICAgICAgICBUUHJhZ21hVGFibGUmIHByYWdtYVRhYmxlID0gKChUUGFyc2VDb250ZXh0ICopY3BwLT5wQyktPmNvbnRleHRQcmFnbWEucHJhZ21hVGFibGU7CisgICAgICAgICAgICBUUHJhZ21hVGFibGU6Oml0ZXJhdG9yIGl0ZXI7CisgICAgICAgICAgICBpdGVyID0gcHJhZ21hVGFibGUuZmluZChUU3RyaW5nKHRva2Vuc1swXSkpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gcHJhZ21hVGFibGUuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQgPSB0b2tlbnNbMl07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByYWdtYVRhYmxlWyB0b2tlbnNbMF0gXSA9IHRva2Vuc1syXTsKKyAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKG51bVRva2VucyA+PSAyKSB7CisgICAgICAgICAgICBUUHJhZ21hVGFibGUmIHByYWdtYVRhYmxlID0gKChUUGFyc2VDb250ZXh0ICopY3BwLT5wQyktPmNvbnRleHRQcmFnbWEucHJhZ21hVGFibGU7CisgICAgICAgICAgICBUUHJhZ21hVGFibGU6Oml0ZXJhdG9yIGl0ZXI7CisgICAgICAgICAgICBpdGVyID0gcHJhZ21hVGFibGUuZmluZChUU3RyaW5nKHRva2Vuc1swXSkpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gcHJhZ21hVGFibGUuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQgPSB0b2tlbnNbMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByYWdtYVRhYmxlWyB0b2tlbnNbMF0gXSA9IHRva2Vuc1sxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8vIFBSQUdNQV9UQUJMRQorICAgIH0KK30KKwordm9pZCBTdG9yZVN0cihjaGFyICpzdHJpbmcpCit7CisgICAgU0VUVVBfQ09OVEVYVChjcHApOworICAgIFRTdHJpbmcgc3RyU3JjOworICAgIHN0clNyYyA9IFRTdHJpbmcoc3RyaW5nKTsKKworICAgIGNvbnRleHQtPkhhc2hFcnJNc2cgPSBjb250ZXh0LT5IYXNoRXJyTXNnICsgIiAiICsgc3RyU3JjOworfQorCitjb25zdCBjaGFyKiBHZXRTdHJmcm9tVFN0cih2b2lkKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBjcHAtPkVyck1zZyA9IGNvbnRleHQtPkhhc2hFcnJNc2cuY19zdHIoKTsKKyAgICByZXR1cm4gY3BwLT5FcnJNc2c7Cit9CisKK3ZvaWQgUmVzZXRUU3RyaW5nKHZvaWQpCit7CisgICAgU0VUVVBfQ09OVEVYVChjcHApOworICAgIGNvbnRleHQtPkhhc2hFcnJNc2cgPSAiIjsKK30KKworVEJlaGF2aW9yIEdldEJlaGF2aW9yKGNvbnN0IGNoYXIqIGJlaGF2aW9yKQoreworICAgIGlmICghc3RyY21wKCJyZXF1aXJlIiwgYmVoYXZpb3IpKQorICAgICAgICByZXR1cm4gRUJoUmVxdWlyZTsKKyAgICBlbHNlIGlmICghc3RyY21wKCJlbmFibGUiLCBiZWhhdmlvcikpCisgICAgICAgIHJldHVybiBFQmhFbmFibGU7CisgICAgZWxzZSBpZiAoIXN0cmNtcCgiZGlzYWJsZSIsIGJlaGF2aW9yKSkKKyAgICAgICAgcmV0dXJuIEVCaERpc2FibGU7CisgICAgZWxzZSBpZiAoIXN0cmNtcCgid2FybiIsIGJlaGF2aW9yKSkKKyAgICAgICAgcmV0dXJuIEVCaFdhcm47CisgICAgZWxzZSB7CisgICAgICAgIENQUFNoSW5mb0xvZ01zZygoVFN0cmluZygiYmVoYXZpb3IgJyIpICsgYmVoYXZpb3IgKyAiJyBpcyBub3Qgc3VwcG9ydGVkIikuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBFQmhEaXNhYmxlOworICAgIH0gICAgICAgIAorfQorCit2b2lkIHVwZGF0ZUV4dGVuc2lvbkJlaGF2aW9yKGNvbnN0IGNoYXIqIGV4dE5hbWUsIGNvbnN0IGNoYXIqIGJlaGF2aW9yKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBUQmVoYXZpb3IgYmVoYXZpb3JWYWwgPSBHZXRCZWhhdmlvcihiZWhhdmlvcik7CisgICAgVE1hcDxUU3RyaW5nLCBUQmVoYXZpb3I+OjogaXRlcmF0b3IgaXRlcjsKKyAgICBUU3RyaW5nIG1zZzsKKyAgICAKKyAgICAvLyBzcGVjaWFsIGNhc2VkIGZvciBhbGwgZXh0ZW5zaW9uCisgICAgaWYgKCFzdHJjbXAoZXh0TmFtZSwgImFsbCIpKSB7CisgICAgICAgIGlmIChiZWhhdmlvclZhbCA9PSBFQmhSZXF1aXJlIHx8IGJlaGF2aW9yVmFsID09IEVCaEVuYWJsZSkgeworICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKCJleHRlbnNpb24gJ2FsbCcgY2Fubm90IGhhdmUgJ3JlcXVpcmUnIG9yICdlbmFibGUnIGJlaGF2aW9yIik7ICAKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaXRlciA9IGNvbnRleHQtPmV4dGVuc2lvbkJlaGF2aW9yLmJlZ2luKCk7IGl0ZXIgIT0gY29udGV4dC0+ZXh0ZW5zaW9uQmVoYXZpb3IuZW5kKCk7ICsraXRlcikKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQgPSBiZWhhdmlvclZhbDsKKyAgICAgICAgfSAgICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgICAgaXRlciA9IGNvbnRleHQtPmV4dGVuc2lvbkJlaGF2aW9yLmZpbmQoVFN0cmluZyhleHROYW1lKSk7CisgICAgICAgIGlmIChpdGVyID09IGNvbnRleHQtPmV4dGVuc2lvbkJlaGF2aW9yLmVuZCgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGJlaGF2aW9yVmFsKSB7CisgICAgICAgICAgICBjYXNlIEVCaFJlcXVpcmU6CisgICAgICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKChUU3RyaW5nKCJleHRlbnNpb24gJyIpICsgZXh0TmFtZSArICInIGlzIG5vdCBzdXBwb3J0ZWQiKS5jX3N0cigpKTsgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFQmhFbmFibGU6CisgICAgICAgICAgICBjYXNlIEVCaFdhcm46CisgICAgICAgICAgICBjYXNlIEVCaERpc2FibGU6CisgICAgICAgICAgICAgICAgbXNnID0gVFN0cmluZygiZXh0ZW5zaW9uICciKSArIGV4dE5hbWUgKyAiJyBpcyBub3Qgc3VwcG9ydGVkIjsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5pbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeFdhcm5pbmcsIG1zZy5jX3N0cigpLCB5eWxpbmVubyk7IAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGl0ZXItPnNlY29uZCA9IGJlaGF2aW9yVmFsOworICAgIH0KK30KK30gIC8vIGV4dGVybiAiQyIKKworaW50IHN0cmluZ19pbnB1dChjaGFyKiBidWYsIGludCBtYXhfc2l6ZSwgeXlzY2FuX3QgeXlzY2FubmVyKSB7CisgICAgaW50IGxlbjsKKworICAgIGlmICgobGVuID0geXlsZXhfQ1BQKGJ1ZiwgbWF4X3NpemUpKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobGVuID49IG1heF9zaXplKSAKKyAgICAgICAgWVlfRkFUQUxfRVJST1IoImlucHV0IGJ1ZmZlciBvdmVyZmxvdywgY2FuJ3QgZW5sYXJnZSBidWZmZXIgYmVjYXVzZSBzY2FubmVyIHVzZXMgUkVKRUNUIik7CisKKyAgICBidWZbbGVuXSA9ICcgJzsKKyAgICByZXR1cm4gbGVuKzE7Cit9CisKK2ludCBjaGVja190eXBlKHl5c2Nhbl90IHl5c2Nhbm5lcikgeworICAgIHN0cnVjdCB5eWd1dHNfdCogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopIHl5c2Nhbm5lcjsKKyAgICAKKyAgICBpbnQgdG9rZW4gPSBJREVOVElGSUVSOworICAgIFRTeW1ib2wqIHN5bWJvbCA9IHl5ZXh0cmEtPnN5bWJvbFRhYmxlLmZpbmQoeXl0ZXh0KTsKKyAgICBpZiAoeXlleHRyYS0+bGV4QWZ0ZXJUeXBlID09IGZhbHNlICYmIHN5bWJvbCAmJiBzeW1ib2wtPmlzVmFyaWFibGUoKSkgeworICAgICAgICBUVmFyaWFibGUqIHZhcmlhYmxlID0gc3RhdGljX2Nhc3Q8VFZhcmlhYmxlKj4oc3ltYm9sKTsKKyAgICAgICAgaWYgKHZhcmlhYmxlLT5pc1VzZXJUeXBlKCkpIHsKKyAgICAgICAgICAgIHl5ZXh0cmEtPmxleEFmdGVyVHlwZSA9IHRydWU7CisgICAgICAgICAgICB0b2tlbiA9IFRZUEVfTkFNRTsKKyAgICAgICAgfQorICAgIH0KKyAgICB5eWx2YWwtPmxleC5zeW1ib2wgPSBzeW1ib2w7CisgICAgcmV0dXJuIHRva2VuOworfQorCitpbnQgcmVzZXJ2ZWRfd29yZCh5eXNjYW5fdCB5eXNjYW5uZXIpIHsKKyAgICBzdHJ1Y3QgeXlndXRzX3QqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKSB5eXNjYW5uZXI7CisKKyAgICB5eWV4dHJhLT5lcnJvcih5eWxpbmVubywgIklsbGVnYWwgdXNlIG9mIHJlc2VydmVkIHdvcmQiLCB5eXRleHQsICIiKTsKKyAgICB5eWV4dHJhLT5yZWNvdmVyKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgeXllcnJvcihUUGFyc2VDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiByZWFzb24pIHsKKyAgICBzdHJ1Y3QgeXlndXRzX3QqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKSBjb250ZXh0LT5zY2FubmVyOworCisgICAgaWYgKGNvbnRleHQtPkFmdGVyRU9GKSB7CisgICAgICAgIGNvbnRleHQtPmVycm9yKHl5bGluZW5vLCByZWFzb24sICJ1bmV4cGVjdGVkIEVPRiIsICIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb250ZXh0LT5lcnJvcih5eWxpbmVubywgcmVhc29uLCB5eXRleHQsICIiKTsKKyAgICB9CisgICAgY29udGV4dC0+cmVjb3ZlcigpOworfQorCitpbnQgZ2xzbGFuZ19pbml0aWFsaXplKFRQYXJzZUNvbnRleHQqIGNvbnRleHQpIHsKKyAgICB5eXNjYW5fdCBzY2FubmVyID0gTlVMTDsKKyAgICBpZiAoeXlsZXhfaW5pdF9leHRyYShjb250ZXh0LCAmc2Nhbm5lcikpCisgICAgICAgIHJldHVybiAxOworCisgICAgY29udGV4dC0+c2Nhbm5lciA9IHNjYW5uZXI7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBnbHNsYW5nX2ZpbmFsaXplKFRQYXJzZUNvbnRleHQqIGNvbnRleHQpIHsKKyAgICB5eXNjYW5fdCBzY2FubmVyID0gY29udGV4dC0+c2Nhbm5lcjsKKyAgICBpZiAoc2Nhbm5lciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICAKKyAgICBjb250ZXh0LT5zY2FubmVyID0gTlVMTDsKKyAgICByZXR1cm4geXlsZXhfZGVzdHJveShzY2FubmVyKTsKK30KKwordm9pZCBnbHNsYW5nX3NjYW4oaW50IGNvdW50LCBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdbXSwgY29uc3QgaW50IGxlbmd0aFtdLAorICAgICAgICAgICAgICAgICAgVFBhcnNlQ29udGV4dCogY29udGV4dCkgeworICAgIHl5cmVzdGFydChOVUxMLCBjb250ZXh0LT5zY2FubmVyKTsKKyAgICB5eXNldF9saW5lbm8oRW5jb2RlU291cmNlTG9jKDAsIDEpLCBjb250ZXh0LT5zY2FubmVyKTsKKyAgICBjb250ZXh0LT5BZnRlckVPRiA9IGZhbHNlOworICAgIAorICAgIC8vIEluaXQgcHJlcHJvY2Vzc29yLgorICAgIGNwcC0+cEMgPSBjb250ZXh0OworICAgIGNwcC0+UGFXaGljaFN0ciA9IDA7CisgICAgY3BwLT5QYUFyZ3YgICAgID0gc3RyaW5nOworICAgIGNwcC0+UGFBcmdjICAgICA9IGNvdW50OworICAgIGNwcC0+UGFTdHJMZW4gICA9IGxlbmd0aDsKKyAgICBjcHAtPnBhc3RGaXJzdFN0YXRlbWVudCA9IDA7CisgICAgU2NhbkZyb21TdHJpbmcoc3RyaW5nWzBdKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZ2xzbGFuZy55IGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZ2xzbGFuZy55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZmExNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nbHNsYW5nLnkKQEAgLTAsMCArMSwyMDc4IEBACisvKgorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBZYWNjIGdyYW1tYXIgZm9yIEdMU0wgRVMuCitCYXNlZCBvbiBBTlNJIEMgWWFjYyBncmFtbWFyOgoraHR0cDovL3d3dy5seXNhdG9yLmxpdS5zZS9jL0FOU0ktQy1ncmFtbWFyLXkuaHRtbAorCitJRiBZT1UgTU9ESUZZIFRISVMgRklMRSBZT1UgQUxTTyBORUVEIFRPIFJVTiBnZW5lcmF0ZV9nbHNsYW5nX3BhcnNlci5zaCwKK1dISUNIIEdFTkVSQVRFUyBUSEUgR0xTTCBFUyBQQVJTRVIgKGdsc2xhbmdfdGFiLmNwcCBBTkQgZ2xzbGFuZ190YWIuaCkuCisqLworCisleworLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlX2dsc2xhbmdfcGFyc2VyLnNoLiBETyBOT1QgRURJVCEKKworI2luY2x1ZGUgImNvbXBpbGVyL1N5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvUGFyc2VIZWxwZXIuaCIKKyNpbmNsdWRlICJHTFNMQU5HL1NoYWRlckxhbmcuaCIKKworI2RlZmluZSBZWUxFWF9QQVJBTSBjb250ZXh0LT5zY2FubmVyCislfQorCislZXhwZWN0IDEgLyogT25lIHNoaWZ0IHJlZHVjZSBjb25mbGljdCBiZWNhdXNlIG9mIGlmIHwgZWxzZSAqLworJXB1cmUtcGFyc2VyCislcGFyc2UtcGFyYW0ge1RQYXJzZUNvbnRleHQqIGNvbnRleHR9CisKKyV1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgICAgVFNvdXJjZUxvYyBsaW5lOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBUU3RyaW5nICpzdHJpbmc7CisgICAgICAgICAgICBmbG9hdCBmOworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBib29sIGI7CisgICAgICAgIH07CisgICAgICAgIFRTeW1ib2wqIHN5bWJvbDsKKyAgICB9IGxleDsKKyAgICBzdHJ1Y3QgeworICAgICAgICBUU291cmNlTG9jIGxpbmU7CisgICAgICAgIFRPcGVyYXRvciBvcDsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgVEludGVybU5vZGUqIGludGVybU5vZGU7CisgICAgICAgICAgICBUSW50ZXJtTm9kZVBhaXIgbm9kZVBhaXI7CisgICAgICAgICAgICBUSW50ZXJtVHlwZWQqIGludGVybVR5cGVkTm9kZTsKKyAgICAgICAgICAgIFRJbnRlcm1BZ2dyZWdhdGUqIGludGVybUFnZ3JlZ2F0ZTsKKyAgICAgICAgfTsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgVFB1YmxpY1R5cGUgdHlwZTsKKyAgICAgICAgICAgIFRQcmVjaXNpb24gcHJlY2lzaW9uOworICAgICAgICAgICAgVFF1YWxpZmllciBxdWFsaWZpZXI7CisgICAgICAgICAgICBURnVuY3Rpb24qIGZ1bmN0aW9uOworICAgICAgICAgICAgVFBhcmFtZXRlciBwYXJhbTsKKyAgICAgICAgICAgIFRUeXBlTGluZSB0eXBlTGluZTsKKyAgICAgICAgICAgIFRUeXBlTGlzdCogdHlwZUxpc3Q7CisgICAgICAgIH07CisgICAgfSBpbnRlcm07Cit9CisKKyV7CitleHRlcm4gaW50IHl5bGV4KFlZU1RZUEUqIHl5bHZhbF9wYXJhbSwgdm9pZCogeXlzY2FubmVyKTsKK2V4dGVybiB2b2lkIHl5ZXJyb3IoVFBhcnNlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogcmVhc29uKTsKKworI2RlZmluZSBGUkFHX1ZFUlRfT05MWShTLCBMKSB7ICBcCisgICAgaWYgKGNvbnRleHQtPnNoYWRlclR5cGUgIT0gU0hfRlJBR01FTlRfU0hBREVSICYmICBcCisgICAgICAgIGNvbnRleHQtPnNoYWRlclR5cGUgIT0gU0hfVkVSVEVYX1NIQURFUikgeyAgXAorICAgICAgICBjb250ZXh0LT5lcnJvcihMLCAiIHN1cHBvcnRlZCBpbiB2ZXJ0ZXgvZnJhZ21lbnQgc2hhZGVycyBvbmx5ICIsIFMsICIiLCAiIik7ICBcCisgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsgIFwKKyAgICB9ICBcCit9CisKKyNkZWZpbmUgVkVSVEVYX09OTFkoUywgTCkgeyAgXAorICAgIGlmIChjb250ZXh0LT5zaGFkZXJUeXBlICE9IFNIX1ZFUlRFWF9TSEFERVIpIHsgIFwKKyAgICAgICAgY29udGV4dC0+ZXJyb3IoTCwgIiBzdXBwb3J0ZWQgaW4gdmVydGV4IHNoYWRlcnMgb25seSAiLCBTLCAiIiwgIiIpOyAgXAorICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7ICBcCisgICAgfSAgXAorfQorCisjZGVmaW5lIEZSQUdfT05MWShTLCBMKSB7ICBcCisgICAgaWYgKGNvbnRleHQtPnNoYWRlclR5cGUgIT0gU0hfRlJBR01FTlRfU0hBREVSKSB7ICBcCisgICAgICAgIGNvbnRleHQtPmVycm9yKEwsICIgc3VwcG9ydGVkIGluIGZyYWdtZW50IHNoYWRlcnMgb25seSAiLCBTLCAiIiwgIiIpOyAgXAorICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7ICBcCisgICAgfSAgXAorfQorJX0KKworJXRva2VuIDxsZXg+IElOVkFSSUFOVCBISUdIX1BSRUNJU0lPTiBNRURJVU1fUFJFQ0lTSU9OIExPV19QUkVDSVNJT04gUFJFQ0lTSU9OCisldG9rZW4gPGxleD4gQVRUUklCVVRFIENPTlNUX1FVQUwgQk9PTF9UWVBFIEZMT0FUX1RZUEUgSU5UX1RZUEUKKyV0b2tlbiA8bGV4PiBCUkVBSyBDT05USU5VRSBETyBFTFNFIEZPUiBJRiBESVNDQVJEIFJFVFVSTgorJXRva2VuIDxsZXg+IEJWRUMyIEJWRUMzIEJWRUM0IElWRUMyIElWRUMzIElWRUM0IFZFQzIgVkVDMyBWRUM0CisldG9rZW4gPGxleD4gTUFUUklYMiBNQVRSSVgzIE1BVFJJWDQgSU5fUVVBTCBPVVRfUVVBTCBJTk9VVF9RVUFMIFVOSUZPUk0gVkFSWUlORworJXRva2VuIDxsZXg+IFNUUlVDVCBWT0lEX1RZUEUgV0hJTEUKKyV0b2tlbiA8bGV4PiBTQU1QTEVSMkQgU0FNUExFUkNVQkUKKworJXRva2VuIDxsZXg+IElERU5USUZJRVIgVFlQRV9OQU1FIEZMT0FUQ09OU1RBTlQgSU5UQ09OU1RBTlQgQk9PTENPTlNUQU5UCisldG9rZW4gPGxleD4gRklFTERfU0VMRUNUSU9OCisldG9rZW4gPGxleD4gTEVGVF9PUCBSSUdIVF9PUAorJXRva2VuIDxsZXg+IElOQ19PUCBERUNfT1AgTEVfT1AgR0VfT1AgRVFfT1AgTkVfT1AKKyV0b2tlbiA8bGV4PiBBTkRfT1AgT1JfT1AgWE9SX09QIE1VTF9BU1NJR04gRElWX0FTU0lHTiBBRERfQVNTSUdOCisldG9rZW4gPGxleD4gTU9EX0FTU0lHTiBMRUZUX0FTU0lHTiBSSUdIVF9BU1NJR04gQU5EX0FTU0lHTiBYT1JfQVNTSUdOIE9SX0FTU0lHTgorJXRva2VuIDxsZXg+IFNVQl9BU1NJR04KKworJXRva2VuIDxsZXg+IExFRlRfUEFSRU4gUklHSFRfUEFSRU4gTEVGVF9CUkFDS0VUIFJJR0hUX0JSQUNLRVQgTEVGVF9CUkFDRSBSSUdIVF9CUkFDRSBET1QKKyV0b2tlbiA8bGV4PiBDT01NQSBDT0xPTiBFUVVBTCBTRU1JQ09MT04gQkFORyBEQVNIIFRJTERFIFBMVVMgU1RBUiBTTEFTSCBQRVJDRU5UCisldG9rZW4gPGxleD4gTEVGVF9BTkdMRSBSSUdIVF9BTkdMRSBWRVJUSUNBTF9CQVIgQ0FSRVQgQU1QRVJTQU5EIFFVRVNUSU9OCisKKyV0eXBlIDxpbnRlcm0+IGFzc2lnbm1lbnRfb3BlcmF0b3IgdW5hcnlfb3BlcmF0b3IKKyV0eXBlIDxpbnRlcm0uaW50ZXJtVHlwZWROb2RlPiB2YXJpYWJsZV9pZGVudGlmaWVyIHByaW1hcnlfZXhwcmVzc2lvbiBwb3N0Zml4X2V4cHJlc3Npb24KKyV0eXBlIDxpbnRlcm0uaW50ZXJtVHlwZWROb2RlPiBleHByZXNzaW9uIGludGVnZXJfZXhwcmVzc2lvbiBhc3NpZ25tZW50X2V4cHJlc3Npb24KKyV0eXBlIDxpbnRlcm0uaW50ZXJtVHlwZWROb2RlPiB1bmFyeV9leHByZXNzaW9uIG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24gYWRkaXRpdmVfZXhwcmVzc2lvbgorJXR5cGUgPGludGVybS5pbnRlcm1UeXBlZE5vZGU+IHJlbGF0aW9uYWxfZXhwcmVzc2lvbiBlcXVhbGl0eV9leHByZXNzaW9uCisldHlwZSA8aW50ZXJtLmludGVybVR5cGVkTm9kZT4gY29uZGl0aW9uYWxfZXhwcmVzc2lvbiBjb25zdGFudF9leHByZXNzaW9uCisldHlwZSA8aW50ZXJtLmludGVybVR5cGVkTm9kZT4gbG9naWNhbF9vcl9leHByZXNzaW9uIGxvZ2ljYWxfeG9yX2V4cHJlc3Npb24gbG9naWNhbF9hbmRfZXhwcmVzc2lvbgorJXR5cGUgPGludGVybS5pbnRlcm1UeXBlZE5vZGU+IHNoaWZ0X2V4cHJlc3Npb24gYW5kX2V4cHJlc3Npb24gZXhjbHVzaXZlX29yX2V4cHJlc3Npb24gaW5jbHVzaXZlX29yX2V4cHJlc3Npb24KKyV0eXBlIDxpbnRlcm0uaW50ZXJtVHlwZWROb2RlPiBmdW5jdGlvbl9jYWxsIGluaXRpYWxpemVyIGNvbmRpdGlvbiBjb25kaXRpb25vcHQKKworJXR5cGUgPGludGVybS5pbnRlcm1Ob2RlPiB0cmFuc2xhdGlvbl91bml0IGZ1bmN0aW9uX2RlZmluaXRpb24KKyV0eXBlIDxpbnRlcm0uaW50ZXJtTm9kZT4gc3RhdGVtZW50IHNpbXBsZV9zdGF0ZW1lbnQKKyV0eXBlIDxpbnRlcm0uaW50ZXJtQWdncmVnYXRlPiAgc3RhdGVtZW50X2xpc3QgY29tcG91bmRfc3RhdGVtZW50CisldHlwZSA8aW50ZXJtLmludGVybU5vZGU+IGRlY2xhcmF0aW9uX3N0YXRlbWVudCBzZWxlY3Rpb25fc3RhdGVtZW50IGV4cHJlc3Npb25fc3RhdGVtZW50CisldHlwZSA8aW50ZXJtLmludGVybU5vZGU+IGRlY2xhcmF0aW9uIGV4dGVybmFsX2RlY2xhcmF0aW9uCisldHlwZSA8aW50ZXJtLmludGVybU5vZGU+IGZvcl9pbml0X3N0YXRlbWVudCBjb21wb3VuZF9zdGF0ZW1lbnRfbm9fbmV3X3Njb3BlCisldHlwZSA8aW50ZXJtLm5vZGVQYWlyPiBzZWxlY3Rpb25fcmVzdF9zdGF0ZW1lbnQgZm9yX3Jlc3Rfc3RhdGVtZW50CisldHlwZSA8aW50ZXJtLmludGVybU5vZGU+IGl0ZXJhdGlvbl9zdGF0ZW1lbnQganVtcF9zdGF0ZW1lbnQgc3RhdGVtZW50X25vX25ld19zY29wZQorJXR5cGUgPGludGVybT4gc2luZ2xlX2RlY2xhcmF0aW9uIGluaXRfZGVjbGFyYXRvcl9saXN0CisKKyV0eXBlIDxpbnRlcm0+IHBhcmFtZXRlcl9kZWNsYXJhdGlvbiBwYXJhbWV0ZXJfZGVjbGFyYXRvciBwYXJhbWV0ZXJfdHlwZV9zcGVjaWZpZXIKKyV0eXBlIDxpbnRlcm0ucXVhbGlmaWVyPiBwYXJhbWV0ZXJfcXVhbGlmaWVyCisKKyV0eXBlIDxpbnRlcm0ucHJlY2lzaW9uPiBwcmVjaXNpb25fcXVhbGlmaWVyCisldHlwZSA8aW50ZXJtLnR5cGU+IHR5cGVfcXVhbGlmaWVyIGZ1bGx5X3NwZWNpZmllZF90eXBlIHR5cGVfc3BlY2lmaWVyCisldHlwZSA8aW50ZXJtLnR5cGU+IHR5cGVfc3BlY2lmaWVyX25vX3ByZWMgdHlwZV9zcGVjaWZpZXJfbm9uYXJyYXkKKyV0eXBlIDxpbnRlcm0udHlwZT4gc3RydWN0X3NwZWNpZmllcgorJXR5cGUgPGludGVybS50eXBlTGluZT4gc3RydWN0X2RlY2xhcmF0b3IKKyV0eXBlIDxpbnRlcm0udHlwZUxpc3Q+IHN0cnVjdF9kZWNsYXJhdG9yX2xpc3Qgc3RydWN0X2RlY2xhcmF0aW9uIHN0cnVjdF9kZWNsYXJhdGlvbl9saXN0CisldHlwZSA8aW50ZXJtLmZ1bmN0aW9uPiBmdW5jdGlvbl9oZWFkZXIgZnVuY3Rpb25fZGVjbGFyYXRvciBmdW5jdGlvbl9pZGVudGlmaWVyCisldHlwZSA8aW50ZXJtLmZ1bmN0aW9uPiBmdW5jdGlvbl9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzIGZ1bmN0aW9uX2NhbGxfaGVhZGVyCisldHlwZSA8aW50ZXJtPiBmdW5jdGlvbl9jYWxsX2hlYWRlcl93aXRoX3BhcmFtZXRlcnMgZnVuY3Rpb25fY2FsbF9oZWFkZXJfbm9fcGFyYW1ldGVycyBmdW5jdGlvbl9jYWxsX2dlbmVyaWMgZnVuY3Rpb25fcHJvdG90eXBlCisldHlwZSA8aW50ZXJtPiBmdW5jdGlvbl9jYWxsX29yX21ldGhvZAorCislc3RhcnQgdHJhbnNsYXRpb25fdW5pdAorJSUKKwordmFyaWFibGVfaWRlbnRpZmllcgorICAgIDogSURFTlRJRklFUiB7CisgICAgICAgIC8vIFRoZSBzeW1ib2wgdGFibGUgc2VhcmNoIHdhcyBkb25lIGluIHRoZSBsZXhpY2FsIHBoYXNlCisgICAgICAgIGNvbnN0IFRTeW1ib2wqIHN5bWJvbCA9ICQxLnN5bWJvbDsKKyAgICAgICAgY29uc3QgVFZhcmlhYmxlKiB2YXJpYWJsZTsKKyAgICAgICAgaWYgKHN5bWJvbCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMS5saW5lLCAidW5kZWNsYXJlZCBpZGVudGlmaWVyIiwgJDEuc3RyaW5nLT5jX3N0cigpLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICBUVHlwZSB0eXBlKEVidEZsb2F0LCBFYnBVbmRlZmluZWQpOworICAgICAgICAgICAgVFZhcmlhYmxlKiBmYWtlVmFyaWFibGUgPSBuZXcgVFZhcmlhYmxlKCQxLnN0cmluZywgdHlwZSk7CisgICAgICAgICAgICBjb250ZXh0LT5zeW1ib2xUYWJsZS5pbnNlcnQoKmZha2VWYXJpYWJsZSk7CisgICAgICAgICAgICB2YXJpYWJsZSA9IGZha2VWYXJpYWJsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaWRlbnRpZmllciBjYW4gb25seSBiZSBhIHZhcmlhYmxlIHR5cGUgc3ltYm9sCisgICAgICAgICAgICBpZiAoISBzeW1ib2wtPmlzVmFyaWFibGUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQxLmxpbmUsICJ2YXJpYWJsZSBleHBlY3RlZCIsICQxLnN0cmluZy0+Y19zdHIoKSwgIiIpOworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhcmlhYmxlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVFZhcmlhYmxlKj4oc3ltYm9sKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvbid0IGRlbGV0ZSAkMS5zdHJpbmcsIGl0J3MgdXNlZCBieSBlcnJvciByZWNvdmVyeSwgYW5kIHRoZSBwb29sCisgICAgICAgIC8vIHBvcCB3aWxsIHJlY2xhaW0gdGhlIG1lbW9yeQorCisgICAgICAgIGlmICh2YXJpYWJsZS0+Z2V0VHlwZSgpLmdldFF1YWxpZmllcigpID09IEV2cUNvbnN0ICkgeworICAgICAgICAgICAgQ29uc3RhbnRVbmlvbiogY29uc3RBcnJheSA9IHZhcmlhYmxlLT5nZXRDb25zdFBvaW50ZXIoKTsKKyAgICAgICAgICAgIFRUeXBlIHQodmFyaWFibGUtPmdldFR5cGUoKSk7CisgICAgICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKGNvbnN0QXJyYXksIHQsICQxLmxpbmUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFN5bWJvbCh2YXJpYWJsZS0+Z2V0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUtPmdldFR5cGUoKSwgJDEubGluZSk7CisgICAgfQorICAgIDsKKworcHJpbWFyeV9leHByZXNzaW9uCisgICAgOiB2YXJpYWJsZV9pZGVudGlmaWVyIHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICB9CisgICAgfCBJTlRDT05TVEFOVCB7CisgICAgICAgIC8vCisgICAgICAgIC8vIElOVF9UWVBFIGlzIG9ubHkgMTYtYml0IHBsdXMgc2lnbiBiaXQgZm9yIHZlcnRleC9mcmFnbWVudCBzaGFkZXJzLAorICAgICAgICAvLyBjaGVjayBmb3Igb3ZlcmZsb3cgZm9yIGNvbnN0YW50cworICAgICAgICAvLworICAgICAgICBpZiAoYWJzKCQxLmkpID49ICgxIDw8IDE2KSkgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDEubGluZSwgIiBpbnRlZ2VyIGNvbnN0YW50IG92ZXJmbG93IiwgIiIsICIiKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgIHVuaW9uQXJyYXktPnNldElDb25zdCgkMS5pKTsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRJbnQsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAkMS5saW5lKTsKKyAgICB9CisgICAgfCBGTE9BVENPTlNUQU5UIHsKKyAgICAgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICB1bmlvbkFycmF5LT5zZXRGQ29uc3QoJDEuZik7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgVFR5cGUoRWJ0RmxvYXQsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAkMS5saW5lKTsKKyAgICB9CisgICAgfCBCT09MQ09OU1RBTlQgeworICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgIHVuaW9uQXJyYXktPnNldEJDb25zdCgkMS5iKTsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRCb29sLCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSwgJDEubGluZSk7CisgICAgfQorICAgIHwgTEVGVF9QQVJFTiBleHByZXNzaW9uIFJJR0hUX1BBUkVOIHsKKyAgICAgICAgJCQgPSAkMjsKKyAgICB9CisgICAgOworCitwb3N0Zml4X2V4cHJlc3Npb24KKyAgICA6IHByaW1hcnlfZXhwcmVzc2lvbiB7CisgICAgICAgICQkID0gJDE7CisgICAgfQorICAgIHwgcG9zdGZpeF9leHByZXNzaW9uIExFRlRfQlJBQ0tFVCBpbnRlZ2VyX2V4cHJlc3Npb24gUklHSFRfQlJBQ0tFVCB7CisgICAgICAgIGlmICghJDEtPmlzQXJyYXkoKSAmJiAhJDEtPmlzTWF0cml4KCkgJiYgISQxLT5pc1ZlY3RvcigpKSB7CisgICAgICAgICAgICBpZiAoJDEtPmdldEFzU3ltYm9sTm9kZSgpKQorICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQyLmxpbmUsICIgbGVmdCBvZiAnWycgaXMgbm90IG9mIHR5cGUgYXJyYXksIG1hdHJpeCwgb3IgdmVjdG9yICIsICQxLT5nZXRBc1N5bWJvbE5vZGUoKS0+Z2V0U3ltYm9sKCkuY19zdHIoKSwgIiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQyLmxpbmUsICIgbGVmdCBvZiAnWycgaXMgbm90IG9mIHR5cGUgYXJyYXksIG1hdHJpeCwgb3IgdmVjdG9yICIsICJleHByZXNzaW9uIiwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgICAgIGlmICgkMS0+Z2V0VHlwZSgpLmdldFF1YWxpZmllcigpID09IEV2cUNvbnN0ICYmICQzLT5nZXRRdWFsaWZpZXIoKSA9PSBFdnFDb25zdCkgeworICAgICAgICAgICAgaWYgKCQxLT5pc0FycmF5KCkpIHsgLy8gY29uc3RhbnQgZm9sZGluZyBmb3IgYXJyYXlzCisgICAgICAgICAgICAgICAgJCQgPSBjb250ZXh0LT5hZGRDb25zdEFycmF5Tm9kZSgkMy0+Z2V0QXNDb25zdGFudFVuaW9uKCktPmdldFVuaW9uQXJyYXlQb2ludGVyKCktPmdldElDb25zdCgpLCAkMSwgJDIubGluZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCQxLT5pc1ZlY3RvcigpKSB7ICAvLyBjb25zdGFudCBmb2xkaW5nIGZvciB2ZWN0b3JzCisgICAgICAgICAgICAgICAgVFZlY3RvckZpZWxkcyBmaWVsZHM7CisgICAgICAgICAgICAgICAgZmllbGRzLm51bSA9IDE7CisgICAgICAgICAgICAgICAgZmllbGRzLm9mZnNldHNbMF0gPSAkMy0+Z2V0QXNDb25zdGFudFVuaW9uKCktPmdldFVuaW9uQXJyYXlQb2ludGVyKCktPmdldElDb25zdCgpOyAvLyBuZWVkIHRvIGRvIGl0IHRoaXMgd2F5IGJlY2F1c2Ugdi54eSBzZW5kcyBmaWVsZHMgaW50ZWdlciBhcnJheQorICAgICAgICAgICAgICAgICQkID0gY29udGV4dC0+YWRkQ29uc3RWZWN0b3JOb2RlKGZpZWxkcywgJDEsICQyLmxpbmUpOworICAgICAgICAgICAgfSBlbHNlIGlmICgkMS0+aXNNYXRyaXgoKSkgeyAvLyBjb25zdGFudCBmb2xkaW5nIGZvciBtYXRyaWNlcworICAgICAgICAgICAgICAgICQkID0gY29udGV4dC0+YWRkQ29uc3RNYXRyaXhOb2RlKCQzLT5nZXRBc0NvbnN0YW50VW5pb24oKS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKS0+Z2V0SUNvbnN0KCksICQxLCAkMi5saW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkMy0+Z2V0UXVhbGlmaWVyKCkgPT0gRXZxQ29uc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCQxLT5pc1ZlY3RvcigpIHx8ICQxLT5pc01hdHJpeCgpKSAmJiAkMS0+Z2V0VHlwZSgpLmdldE5vbWluYWxTaXplKCkgPD0gJDMtPmdldEFzQ29uc3RhbnRVbmlvbigpLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRJQ29uc3QoKSAmJiAhJDEtPmlzQXJyYXkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDIubGluZSwgIiIsICJbIiwgImZpZWxkIHNlbGVjdGlvbiBvdXQgb2YgcmFuZ2UgJyVkJyIsICQzLT5nZXRBc0NvbnN0YW50VW5pb24oKS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKS0+Z2V0SUNvbnN0KCkpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCQxLT5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkMS0+Z2V0VHlwZSgpLmdldEFycmF5U2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDEtPmdldFR5cGUoKS5nZXRNYXhBcnJheVNpemUoKSA8PSAkMy0+Z2V0QXNDb25zdGFudFVuaW9uKCktPmdldFVuaW9uQXJyYXlQb2ludGVyKCktPmdldElDb25zdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LT5hcnJheVNldE1heFNpemUoJDEtPmdldEFzU3ltYm9sTm9kZSgpLCAkMS0+Z2V0VHlwZVBvaW50ZXIoKSwgJDMtPmdldEFzQ29uc3RhbnRVbmlvbigpLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRJQ29uc3QoKSwgdHJ1ZSwgJDIubGluZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5U2V0TWF4U2l6ZSgkMS0+Z2V0QXNTeW1ib2xOb2RlKCksICQxLT5nZXRUeXBlUG9pbnRlcigpLCAwLCBmYWxzZSwgJDIubGluZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggJDMtPmdldEFzQ29uc3RhbnRVbmlvbigpLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRJQ29uc3QoKSA+PSAkMS0+Z2V0VHlwZSgpLmdldEFycmF5U2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDIubGluZSwgIiIsICJbIiwgImFycmF5IGluZGV4IG91dCBvZiByYW5nZSAnJWQnIiwgJDMtPmdldEFzQ29uc3RhbnRVbmlvbigpLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRJQ29uc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEluZGV4KEVPcEluZGV4RGlyZWN0LCAkMSwgJDMsICQyLmxpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCQxLT5pc0FycmF5KCkgJiYgJDEtPmdldFR5cGUoKS5nZXRBcnJheVNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQyLmxpbmUsICIiLCAiWyIsICJhcnJheSBtdXN0IGJlIHJlZGVjbGFyZWQgd2l0aCBhIHNpemUgYmVmb3JlIGJlaW5nIGluZGV4ZWQgd2l0aCBhIHZhcmlhYmxlIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRJbmRleChFT3BJbmRleEluZGlyZWN0LCAkMSwgJDMsICQyLmxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkJCA9PSAwKSB7CisgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRGQ29uc3QoMC4wZik7CisgICAgICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEZsb2F0LCBFYnBIaWdoLCBFdnFDb25zdCksICQyLmxpbmUpOworICAgICAgICB9IGVsc2UgaWYgKCQxLT5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmICgkMS0+Z2V0VHlwZSgpLmdldFN0cnVjdCgpKQorICAgICAgICAgICAgICAgICQkLT5zZXRUeXBlKFRUeXBlKCQxLT5nZXRUeXBlKCkuZ2V0U3RydWN0KCksICQxLT5nZXRUeXBlKCkuZ2V0VHlwZU5hbWUoKSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICQkLT5zZXRUeXBlKFRUeXBlKCQxLT5nZXRCYXNpY1R5cGUoKSwgJDEtPmdldFByZWNpc2lvbigpLCBFdnFUZW1wb3JhcnksICQxLT5nZXROb21pbmFsU2l6ZSgpLCAkMS0+aXNNYXRyaXgoKSkpOworCisgICAgICAgICAgICBpZiAoJDEtPmdldFR5cGUoKS5nZXRRdWFsaWZpZXIoKSA9PSBFdnFDb25zdCkKKyAgICAgICAgICAgICAgICAkJC0+Z2V0VHlwZVBvaW50ZXIoKS0+c2V0UXVhbGlmaWVyKEV2cUNvbnN0KTsKKyAgICAgICAgfSBlbHNlIGlmICgkMS0+aXNNYXRyaXgoKSAmJiAkMS0+Z2V0VHlwZSgpLmdldFF1YWxpZmllcigpID09IEV2cUNvbnN0KQorICAgICAgICAgICAgJCQtPnNldFR5cGUoVFR5cGUoJDEtPmdldEJhc2ljVHlwZSgpLCAkMS0+Z2V0UHJlY2lzaW9uKCksIEV2cUNvbnN0LCAkMS0+Z2V0Tm9taW5hbFNpemUoKSkpOworICAgICAgICBlbHNlIGlmICgkMS0+aXNNYXRyaXgoKSkKKyAgICAgICAgICAgICQkLT5zZXRUeXBlKFRUeXBlKCQxLT5nZXRCYXNpY1R5cGUoKSwgJDEtPmdldFByZWNpc2lvbigpLCBFdnFUZW1wb3JhcnksICQxLT5nZXROb21pbmFsU2l6ZSgpKSk7CisgICAgICAgIGVsc2UgaWYgKCQxLT5pc1ZlY3RvcigpICYmICQxLT5nZXRUeXBlKCkuZ2V0UXVhbGlmaWVyKCkgPT0gRXZxQ29uc3QpCisgICAgICAgICAgICAkJC0+c2V0VHlwZShUVHlwZSgkMS0+Z2V0QmFzaWNUeXBlKCksICQxLT5nZXRQcmVjaXNpb24oKSwgRXZxQ29uc3QpKTsKKyAgICAgICAgZWxzZSBpZiAoJDEtPmlzVmVjdG9yKCkpCisgICAgICAgICAgICAkJC0+c2V0VHlwZShUVHlwZSgkMS0+Z2V0QmFzaWNUeXBlKCksICQxLT5nZXRQcmVjaXNpb24oKSwgRXZxVGVtcG9yYXJ5KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICQkLT5zZXRUeXBlKCQxLT5nZXRUeXBlKCkpOworICAgIH0KKyAgICB8IGZ1bmN0aW9uX2NhbGwgeworICAgICAgICAkJCA9ICQxOworICAgIH0KKyAgICB8IHBvc3RmaXhfZXhwcmVzc2lvbiBET1QgRklFTERfU0VMRUNUSU9OIHsKKyAgICAgICAgaWYgKCQxLT5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQzLmxpbmUsICJjYW5ub3QgYXBwbHkgZG90IG9wZXJhdG9yIHRvIGFuIGFycmF5IiwgIi4iLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJDEtPmlzVmVjdG9yKCkpIHsKKyAgICAgICAgICAgIFRWZWN0b3JGaWVsZHMgZmllbGRzOworICAgICAgICAgICAgaWYgKCEgY29udGV4dC0+cGFyc2VWZWN0b3JGaWVsZHMoKiQzLnN0cmluZywgJDEtPmdldE5vbWluYWxTaXplKCksIGZpZWxkcywgJDMubGluZSkpIHsKKyAgICAgICAgICAgICAgICBmaWVsZHMubnVtID0gMTsKKyAgICAgICAgICAgICAgICBmaWVsZHMub2Zmc2V0c1swXSA9IDA7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoJDEtPmdldFR5cGUoKS5nZXRRdWFsaWZpZXIoKSA9PSBFdnFDb25zdCkgeyAvLyBjb25zdGFudCBmb2xkaW5nIGZvciB2ZWN0b3IgZmllbGRzCisgICAgICAgICAgICAgICAgJCQgPSBjb250ZXh0LT5hZGRDb25zdFZlY3Rvck5vZGUoZmllbGRzLCAkMSwgJDMubGluZSk7CisgICAgICAgICAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgICAgICAkJCA9ICQxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICQkLT5zZXRUeXBlKFRUeXBlKCQxLT5nZXRCYXNpY1R5cGUoKSwgJDEtPmdldFByZWNpc2lvbigpLCBFdnFDb25zdCwgKGludCkgKCokMy5zdHJpbmcpLnNpemUoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRzLm51bSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0SUNvbnN0KGZpZWxkcy5vZmZzZXRzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgVEludGVybVR5cGVkKiBpbmRleCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEludCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICQzLmxpbmUpOworICAgICAgICAgICAgICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRJbmRleChFT3BJbmRleERpcmVjdCwgJDEsIGluZGV4LCAkMi5saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgJCQtPnNldFR5cGUoVFR5cGUoJDEtPmdldEJhc2ljVHlwZSgpLCAkMS0+Z2V0UHJlY2lzaW9uKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBUU3RyaW5nIHZlY3RvclN0cmluZyA9ICokMy5zdHJpbmc7CisgICAgICAgICAgICAgICAgICAgIFRJbnRlcm1UeXBlZCogaW5kZXggPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkU3dpenpsZShmaWVsZHMsICQzLmxpbmUpOworICAgICAgICAgICAgICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRJbmRleChFT3BWZWN0b3JTd2l6emxlLCAkMSwgaW5kZXgsICQyLmxpbmUpOworICAgICAgICAgICAgICAgICAgICAkJC0+c2V0VHlwZShUVHlwZSgkMS0+Z2V0QmFzaWNUeXBlKCksICQxLT5nZXRQcmVjaXNpb24oKSwgRXZxVGVtcG9yYXJ5LCAoaW50KSB2ZWN0b3JTdHJpbmcuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCQxLT5pc01hdHJpeCgpKSB7CisgICAgICAgICAgICBUTWF0cml4RmllbGRzIGZpZWxkczsKKyAgICAgICAgICAgIGlmICghIGNvbnRleHQtPnBhcnNlTWF0cml4RmllbGRzKCokMy5zdHJpbmcsICQxLT5nZXROb21pbmFsU2l6ZSgpLCBmaWVsZHMsICQzLmxpbmUpKSB7CisgICAgICAgICAgICAgICAgZmllbGRzLndob2xlUm93ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZmllbGRzLndob2xlQ29sID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZmllbGRzLnJvdyA9IDA7CisgICAgICAgICAgICAgICAgZmllbGRzLmNvbCA9IDA7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmllbGRzLndob2xlUm93IHx8IGZpZWxkcy53aG9sZUNvbCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQyLmxpbmUsICIgbm9uLXNjYWxhciBmaWVsZHMgbm90IGltcGxlbWVudGVkIHlldCIsICIuIiwgIiIpOworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0SUNvbnN0KDApOworICAgICAgICAgICAgICAgIFRJbnRlcm1UeXBlZCogaW5kZXggPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRJbnQsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAkMy5saW5lKTsKKyAgICAgICAgICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRJbmRleChFT3BJbmRleERpcmVjdCwgJDEsIGluZGV4LCAkMi5saW5lKTsKKyAgICAgICAgICAgICAgICAkJC0+c2V0VHlwZShUVHlwZSgkMS0+Z2V0QmFzaWNUeXBlKCksICQxLT5nZXRQcmVjaXNpb24oKSxFdnFUZW1wb3JhcnksICQxLT5nZXROb21pbmFsU2l6ZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRJQ29uc3QoZmllbGRzLmNvbCAqICQxLT5nZXROb21pbmFsU2l6ZSgpICsgZmllbGRzLnJvdyk7CisgICAgICAgICAgICAgICAgVEludGVybVR5cGVkKiBpbmRleCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEludCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICQzLmxpbmUpOworICAgICAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEluZGV4KEVPcEluZGV4RGlyZWN0LCAkMSwgaW5kZXgsICQyLmxpbmUpOworICAgICAgICAgICAgICAgICQkLT5zZXRUeXBlKFRUeXBlKCQxLT5nZXRCYXNpY1R5cGUoKSwgJDEtPmdldFByZWNpc2lvbigpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoJDEtPmdldEJhc2ljVHlwZSgpID09IEVidFN0cnVjdCkgeworICAgICAgICAgICAgYm9vbCBmaWVsZEZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBjb25zdCBUVHlwZUxpc3QqIGZpZWxkcyA9ICQxLT5nZXRUeXBlKCkuZ2V0U3RydWN0KCk7CisgICAgICAgICAgICBpZiAoZmllbGRzID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMi5saW5lLCAic3RydWN0dXJlIGhhcyBubyBmaWVsZHMiLCAiSW50ZXJuYWwgRXJyb3IiLCAiIik7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgICQkID0gJDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWVsZHMtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKmZpZWxkcylbaV0udHlwZS0+Z2V0RmllbGROYW1lKCkgPT0gKiQzLnN0cmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGRGb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoJDEtPmdldFR5cGUoKS5nZXRRdWFsaWZpZXIoKSA9PSBFdnFDb25zdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJCQgPSBjb250ZXh0LT5hZGRDb25zdFN0cnVjdCgqJDMuc3RyaW5nLCAkMSwgJDIubGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJCA9ICQxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQtPnNldFR5cGUoKigqZmllbGRzKVtpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHF1YWxpZmllciBvZiB0aGUgcmV0dXJuIHR5cGUsIG5vdCBvZiB0aGUgc3RydWN0dXJlIGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGlzIHNoYXJlZCBiZXR3ZWVuIHZhcmlvdXMgc3RydWN0dXJlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJC0+Z2V0VHlwZVBvaW50ZXIoKS0+c2V0UXVhbGlmaWVyKEV2cUNvbnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uQXJyYXktPnNldElDb25zdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRJbnRlcm1UeXBlZCogaW5kZXggPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCAqKCpmaWVsZHMpW2ldLnR5cGUsICQzLmxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkSW5kZXgoRU9wSW5kZXhEaXJlY3RTdHJ1Y3QsICQxLCBpbmRleCwgJDIubGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAkJC0+c2V0VHlwZSgqKCpmaWVsZHMpW2ldLnR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDIubGluZSwgIiBubyBzdWNoIGZpZWxkIGluIHN0cnVjdHVyZSIsICQzLnN0cmluZy0+Y19zdHIoKSwgIiIpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgICAgICQkID0gJDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDIubGluZSwgIiBmaWVsZCBzZWxlY3Rpb24gcmVxdWlyZXMgc3RydWN0dXJlLCB2ZWN0b3IsIG9yIG1hdHJpeCBvbiBsZWZ0IGhhbmQgc2lkZSIsICQzLnN0cmluZy0+Y19zdHIoKSwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgfQorICAgICAgICAvLyBkb24ndCBkZWxldGUgJDMuc3RyaW5nLCBpdCdzIGZyb20gdGhlIHBvb2wKKyAgICB9CisgICAgfCBwb3N0Zml4X2V4cHJlc3Npb24gSU5DX09QIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPmxWYWx1ZUVycm9yQ2hlY2soJDIubGluZSwgIisrIiwgJDEpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRVbmFyeU1hdGgoRU9wUG9zdEluY3JlbWVudCwgJDEsICQyLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnVuYXJ5T3BFcnJvcigkMi5saW5lLCAiKysiLCAkMS0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAkJCA9ICQxOworICAgICAgICB9CisgICAgfQorICAgIHwgcG9zdGZpeF9leHByZXNzaW9uIERFQ19PUCB7CisgICAgICAgIGlmIChjb250ZXh0LT5sVmFsdWVFcnJvckNoZWNrKCQyLmxpbmUsICItLSIsICQxKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkVW5hcnlNYXRoKEVPcFBvc3REZWNyZW1lbnQsICQxLCAkMi5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgkJCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT51bmFyeU9wRXJyb3IoJDIubGluZSwgIi0tIiwgJDEtPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgfQorICAgIH0KKyAgICA7CisKK2ludGVnZXJfZXhwcmVzc2lvbgorICAgIDogZXhwcmVzc2lvbiB7CisgICAgICAgIGlmIChjb250ZXh0LT5pbnRlZ2VyRXJyb3JDaGVjaygkMSwgIltdIikpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICQkID0gJDE7CisgICAgfQorICAgIDsKKworZnVuY3Rpb25fY2FsbAorICAgIDogZnVuY3Rpb25fY2FsbF9vcl9tZXRob2QgeworICAgICAgICBURnVuY3Rpb24qIGZuQ2FsbCA9ICQxLmZ1bmN0aW9uOworICAgICAgICBUT3BlcmF0b3Igb3AgPSBmbkNhbGwtPmdldEJ1aWx0SW5PcCgpOworCisgICAgICAgIGlmIChvcCAhPSBFT3BOdWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlbiB0aGlzIHNob3VsZCBiZSBhIGNvbnN0cnVjdG9yLgorICAgICAgICAgICAgLy8gRG9uJ3QgZ28gdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGZvciBjb25zdHJ1Y3RvcnMuCisgICAgICAgICAgICAvLyBUaGVpciBwYXJhbWV0ZXJzIHdpbGwgYmUgdmVyaWZpZWQgYWxnb3JpdGhtaWNhbGx5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFRUeXBlIHR5cGUoRWJ0Vm9pZCwgRWJwVW5kZWZpbmVkKTsgIC8vIHVzZSB0aGlzIHRvIGdldCB0aGUgdHlwZSBiYWNrCisgICAgICAgICAgICBpZiAoY29udGV4dC0+Y29uc3RydWN0b3JFcnJvckNoZWNrKCQxLmxpbmUsICQxLmludGVybU5vZGUsICpmbkNhbGwsIG9wLCAmdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAkJCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSXQncyBhIGNvbnN0cnVjdG9yLCBvZiB0eXBlICd0eXBlJy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICQkID0gY29udGV4dC0+YWRkQ29uc3RydWN0b3IoJDEuaW50ZXJtTm9kZSwgJnR5cGUsIG9wLCBmbkNhbGwsICQxLmxpbmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoJCQgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5zZXRBZ2dyZWdhdGVPcGVyYXRvcigwLCBvcCwgJDEubGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkJC0+c2V0VHlwZSh0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBOb3QgYSBjb25zdHJ1Y3Rvci4gIEZpbmQgaXQgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjb25zdCBURnVuY3Rpb24qIGZuQ2FuZGlkYXRlOworICAgICAgICAgICAgYm9vbCBidWlsdEluOworICAgICAgICAgICAgZm5DYW5kaWRhdGUgPSBjb250ZXh0LT5maW5kRnVuY3Rpb24oJDEubGluZSwgZm5DYWxsLCAmYnVpbHRJbik7CisgICAgICAgICAgICBpZiAoZm5DYW5kaWRhdGUpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEEgZGVjbGFyZWQgZnVuY3Rpb24uCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoYnVpbHRJbiAmJiAhZm5DYW5kaWRhdGUtPmdldEV4dGVuc2lvbigpLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXh0ZW5zaW9uRXJyb3JDaGVjaygkMS5saW5lLCBmbkNhbmRpZGF0ZS0+Z2V0RXh0ZW5zaW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3AgPSBmbkNhbmRpZGF0ZS0+Z2V0QnVpbHRJbk9wKCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1aWx0SW4gJiYgb3AgIT0gRU9wTnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBIGZ1bmN0aW9uIGNhbGwgbWFwcGVkIHRvIGEgYnVpbHQtaW4gb3BlcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBpZiAoZm5DYW5kaWRhdGUtPmdldFBhcmFtQ291bnQoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJlYXQgaXQgbGlrZSBhIGJ1aWx0LWluIHVuYXJ5IG9wZXJhdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFVuYXJ5TWF0aChvcCwgJDEuaW50ZXJtTm9kZSwgMCwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQkID09IDApICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDEuaW50ZXJtTm9kZS0+Z2V0TGluZSgpLCAiIHdyb25nIG9wZXJhbmQgdHlwZSIsICJJbnRlcm5hbCBFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWlsdCBpbiB1bmFyeSBvcGVyYXRvciBmdW5jdGlvbi4gIFR5cGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VEludGVybVR5cGVkKj4oJDEuaW50ZXJtTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVlFUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLnNldEFnZ3JlZ2F0ZU9wZXJhdG9yKCQxLmludGVybUFnZ3JlZ2F0ZSwgb3AsICQxLmxpbmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlYWwgZnVuY3Rpb24gY2FsbAorCisgICAgICAgICAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLnNldEFnZ3JlZ2F0ZU9wZXJhdG9yKCQxLmludGVybUFnZ3JlZ2F0ZSwgRU9wRnVuY3Rpb25DYWxsLCAkMS5saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgJCQtPnNldFR5cGUoZm5DYW5kaWRhdGUtPmdldFJldHVyblR5cGUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBob3cgd2Uga25vdyB3aGV0aGVyIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhIGJ1aWx0SW4gZnVuY3Rpb24gb3IgYSB1c2VyIGRlZmluZWQgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYnVpbHRJbiA9PSBmYWxzZSwgaXQncyBhIHVzZXJEZWZpbmVkIC0+IGNvdWxkIGJlIGFuIG92ZXJsb2FkZWQgYnVpbHRJbiBmdW5jdGlvbiBhbHNvCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGJ1aWx0SW4gPT0gdHJ1ZSwgaXQncyBkZWZpbml0ZWx5IGEgYnVpbHRJbiBmdW5jdGlvbiB3aXRoIEVPcE51bGwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWlsdEluKQorICAgICAgICAgICAgICAgICAgICAgICAgJCQtPmdldEFzQWdncmVnYXRlKCktPnNldFVzZXJEZWZpbmVkKCk7CisgICAgICAgICAgICAgICAgICAgICQkLT5nZXRBc0FnZ3JlZ2F0ZSgpLT5zZXROYW1lKGZuQ2FuZGlkYXRlLT5nZXRNYW5nbGVkTmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBUUXVhbGlmaWVyIHF1YWw7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm5DYW5kaWRhdGUtPmdldFBhcmFtQ291bnQoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxdWFsID0gZm5DYW5kaWRhdGUtPmdldFBhcmFtKGkpLnR5cGUtPmdldFF1YWxpZmllcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWwgPT0gRXZxT3V0IHx8IHF1YWwgPT0gRXZxSW5PdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC0+bFZhbHVlRXJyb3JDaGVjaygkJC0+Z2V0TGluZSgpLCAiYXNzaWduIiwgJCQtPmdldEFzQWdncmVnYXRlKCktPmdldFNlcXVlbmNlKClbaV0tPmdldEFzVHlwZWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDEuaW50ZXJtTm9kZS0+Z2V0TGluZSgpLCAiQ29uc3RhbnQgdmFsdWUgY2Fubm90IGJlIHBhc3NlZCBmb3IgJ291dCcgb3IgJ2lub3V0JyBwYXJhbWV0ZXJzLiIsICJFcnJvciIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkJC0+c2V0VHlwZShmbkNhbmRpZGF0ZS0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSB3YXMgcHV0IG91dCBieSBQYUZpbmRGdW5jdGlvbigpCisgICAgICAgICAgICAgICAgLy8gUHV0IG9uIGEgZHVtbXkgbm9kZSBmb3IgZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0RkNvbnN0KDAuMGYpOworICAgICAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgVFR5cGUoRWJ0RmxvYXQsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAkMS5saW5lKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGZuQ2FsbDsKKyAgICB9CisgICAgOworCitmdW5jdGlvbl9jYWxsX29yX21ldGhvZAorICAgIDogZnVuY3Rpb25fY2FsbF9nZW5lcmljIHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICB9CisgICAgfCBwb3N0Zml4X2V4cHJlc3Npb24gRE9UIGZ1bmN0aW9uX2NhbGxfZ2VuZXJpYyB7CisgICAgICAgIGNvbnRleHQtPmVycm9yKCQzLmxpbmUsICJtZXRob2RzIGFyZSBub3Qgc3VwcG9ydGVkIiwgIiIsICIiKTsKKyAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAkJCA9ICQzOworICAgIH0KKyAgICA7CisKK2Z1bmN0aW9uX2NhbGxfZ2VuZXJpYworICAgIDogZnVuY3Rpb25fY2FsbF9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzIFJJR0hUX1BBUkVOIHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgJCQubGluZSA9ICQyLmxpbmU7CisgICAgfQorICAgIHwgZnVuY3Rpb25fY2FsbF9oZWFkZXJfbm9fcGFyYW1ldGVycyBSSUdIVF9QQVJFTiB7CisgICAgICAgICQkID0gJDE7CisgICAgICAgICQkLmxpbmUgPSAkMi5saW5lOworICAgIH0KKyAgICA7CisKK2Z1bmN0aW9uX2NhbGxfaGVhZGVyX25vX3BhcmFtZXRlcnMKKyAgICA6IGZ1bmN0aW9uX2NhbGxfaGVhZGVyIFZPSURfVFlQRSB7CisgICAgICAgICQkLmZ1bmN0aW9uID0gJDE7CisgICAgICAgICQkLmludGVybU5vZGUgPSAwOworICAgIH0KKyAgICB8IGZ1bmN0aW9uX2NhbGxfaGVhZGVyIHsKKyAgICAgICAgJCQuZnVuY3Rpb24gPSAkMTsKKyAgICAgICAgJCQuaW50ZXJtTm9kZSA9IDA7CisgICAgfQorICAgIDsKKworZnVuY3Rpb25fY2FsbF9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzCisgICAgOiBmdW5jdGlvbl9jYWxsX2hlYWRlciBhc3NpZ25tZW50X2V4cHJlc3Npb24geworICAgICAgICBUUGFyYW1ldGVyIHBhcmFtID0geyAwLCBuZXcgVFR5cGUoJDItPmdldFR5cGUoKSkgfTsKKyAgICAgICAgJDEtPmFkZFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgICQkLmZ1bmN0aW9uID0gJDE7CisgICAgICAgICQkLmludGVybU5vZGUgPSAkMjsKKyAgICB9CisgICAgfCBmdW5jdGlvbl9jYWxsX2hlYWRlcl93aXRoX3BhcmFtZXRlcnMgQ09NTUEgYXNzaWdubWVudF9leHByZXNzaW9uIHsKKyAgICAgICAgVFBhcmFtZXRlciBwYXJhbSA9IHsgMCwgbmV3IFRUeXBlKCQzLT5nZXRUeXBlKCkpIH07CisgICAgICAgICQxLmZ1bmN0aW9uLT5hZGRQYXJhbWV0ZXIocGFyYW0pOworICAgICAgICAkJC5mdW5jdGlvbiA9ICQxLmZ1bmN0aW9uOworICAgICAgICAkJC5pbnRlcm1Ob2RlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUoJDEuaW50ZXJtTm9kZSwgJDMsICQyLmxpbmUpOworICAgIH0KKyAgICA7CisKK2Z1bmN0aW9uX2NhbGxfaGVhZGVyCisgICAgOiBmdW5jdGlvbl9pZGVudGlmaWVyIExFRlRfUEFSRU4geworICAgICAgICAkJCA9ICQxOworICAgIH0KKyAgICA7CisKKy8vIEdyYW1tYXIgTm90ZTogIENvbnN0cnVjdG9ycyBsb29rIGxpa2UgZnVuY3Rpb25zLCBidXQgYXJlIHJlY29nbml6ZWQgYXMgdHlwZXMuCisKK2Z1bmN0aW9uX2lkZW50aWZpZXIKKyAgICA6IHR5cGVfc3BlY2lmaWVyIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCQxLmFycmF5KSB7CisgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvcnMgZm9yIGFycmF5cyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMS5saW5lLCAiY2Fubm90IGNvbnN0cnVjdCB0aGlzIHR5cGUiLCAiYXJyYXkiLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAkMS5zZXRBcnJheShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBUT3BlcmF0b3Igb3AgPSBFT3BOdWxsOworICAgICAgICBpZiAoJDEudXNlckRlZikgeworICAgICAgICAgICAgb3AgPSBFT3BDb25zdHJ1Y3RTdHJ1Y3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKCQxLnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRWJ0RmxvYXQ6CisgICAgICAgICAgICAgICAgaWYgKCQxLm1hdHJpeCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goJDEuc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gRU9wQ29uc3RydWN0TWF0MjsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gRU9wQ29uc3RydWN0TWF0MzsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gRU9wQ29uc3RydWN0TWF0NDsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCQxLnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcENvbnN0cnVjdEZsb2F0OyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcENvbnN0cnVjdFZlYzI7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcENvbnN0cnVjdFZlYzM7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcENvbnN0cnVjdFZlYzQ7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRWJ0SW50OgorICAgICAgICAgICAgICAgIHN3aXRjaCgkMS5zaXplKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBFT3BDb25zdHJ1Y3RJbnQ7ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAgICAgICBGUkFHX1ZFUlRfT05MWSgiaXZlYzIiLCAkMS5saW5lKTsgb3AgPSBFT3BDb25zdHJ1Y3RJVmVjMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiAgICAgICBGUkFHX1ZFUlRfT05MWSgiaXZlYzMiLCAkMS5saW5lKTsgb3AgPSBFT3BDb25zdHJ1Y3RJVmVjMzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiAgICAgICBGUkFHX1ZFUlRfT05MWSgiaXZlYzQiLCAkMS5saW5lKTsgb3AgPSBFT3BDb25zdHJ1Y3RJVmVjNDsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFYnRCb29sOgorICAgICAgICAgICAgICAgIHN3aXRjaCgkMS5zaXplKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBFT3BDb25zdHJ1Y3RCb29sOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAgICAgICBGUkFHX1ZFUlRfT05MWSgiYnZlYzIiLCAkMS5saW5lKTsgb3AgPSBFT3BDb25zdHJ1Y3RCVmVjMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiAgICAgICBGUkFHX1ZFUlRfT05MWSgiYnZlYzMiLCAkMS5saW5lKTsgb3AgPSBFT3BDb25zdHJ1Y3RCVmVjMzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiAgICAgICBGUkFHX1ZFUlRfT05MWSgiYnZlYzQiLCAkMS5saW5lKTsgb3AgPSBFT3BDb25zdHJ1Y3RCVmVjNDsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3AgPT0gRU9wTnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQxLmxpbmUsICJjYW5ub3QgY29uc3RydWN0IHRoaXMgdHlwZSIsIGdldEJhc2ljU3RyaW5nKCQxLnR5cGUpLCAiIik7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgICQxLnR5cGUgPSBFYnRGbG9hdDsKKyAgICAgICAgICAgICAgICBvcCA9IEVPcENvbnN0cnVjdEZsb2F0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFRTdHJpbmcgdGVtcFN0cmluZzsKKyAgICAgICAgVFR5cGUgdHlwZSgkMSk7CisgICAgICAgIFRGdW5jdGlvbiAqZnVuY3Rpb24gPSBuZXcgVEZ1bmN0aW9uKCZ0ZW1wU3RyaW5nLCB0eXBlLCBvcCk7CisgICAgICAgICQkID0gZnVuY3Rpb247CisgICAgfQorICAgIHwgSURFTlRJRklFUiB7CisgICAgICAgIGlmIChjb250ZXh0LT5yZXNlcnZlZEVycm9yQ2hlY2soJDEubGluZSwgKiQxLnN0cmluZykpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIFRUeXBlIHR5cGUoRWJ0Vm9pZCwgRWJwVW5kZWZpbmVkKTsKKyAgICAgICAgVEZ1bmN0aW9uICpmdW5jdGlvbiA9IG5ldyBURnVuY3Rpb24oJDEuc3RyaW5nLCB0eXBlKTsKKyAgICAgICAgJCQgPSBmdW5jdGlvbjsKKyAgICB9CisgICAgfCBGSUVMRF9TRUxFQ1RJT04geworICAgICAgICBpZiAoY29udGV4dC0+cmVzZXJ2ZWRFcnJvckNoZWNrKCQxLmxpbmUsICokMS5zdHJpbmcpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBUVHlwZSB0eXBlKEVidFZvaWQsIEVicFVuZGVmaW5lZCk7CisgICAgICAgIFRGdW5jdGlvbiAqZnVuY3Rpb24gPSBuZXcgVEZ1bmN0aW9uKCQxLnN0cmluZywgdHlwZSk7CisgICAgICAgICQkID0gZnVuY3Rpb247CisgICAgfQorICAgIDsKKwordW5hcnlfZXhwcmVzc2lvbgorICAgIDogcG9zdGZpeF9leHByZXNzaW9uIHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICB9CisgICAgfCBJTkNfT1AgdW5hcnlfZXhwcmVzc2lvbiB7CisgICAgICAgIGlmIChjb250ZXh0LT5sVmFsdWVFcnJvckNoZWNrKCQxLmxpbmUsICIrKyIsICQyKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkVW5hcnlNYXRoKEVPcFByZUluY3JlbWVudCwgJDIsICQxLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnVuYXJ5T3BFcnJvcigkMS5saW5lLCAiKysiLCAkMi0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAkJCA9ICQyOworICAgICAgICB9CisgICAgfQorICAgIHwgREVDX09QIHVuYXJ5X2V4cHJlc3Npb24geworICAgICAgICBpZiAoY29udGV4dC0+bFZhbHVlRXJyb3JDaGVjaygkMS5saW5lLCAiLS0iLCAkMikpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFVuYXJ5TWF0aChFT3BQcmVEZWNyZW1lbnQsICQyLCAkMS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgkJCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT51bmFyeU9wRXJyb3IoJDEubGluZSwgIi0tIiwgJDItPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgJCQgPSAkMjsKKyAgICAgICAgfQorICAgIH0KKyAgICB8IHVuYXJ5X29wZXJhdG9yIHVuYXJ5X2V4cHJlc3Npb24geworICAgICAgICBpZiAoJDEub3AgIT0gRU9wTnVsbCkgeworICAgICAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkVW5hcnlNYXRoKCQxLm9wLCAkMiwgJDEubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvck9wID0gIiI7CisgICAgICAgICAgICAgICAgc3dpdGNoKCQxLm9wKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFT3BOZWdhdGl2ZTogICBlcnJvck9wID0gIi0iOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVPcExvZ2ljYWxOb3Q6IGVycm9yT3AgPSAiISI7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250ZXh0LT51bmFyeU9wRXJyb3IoJDEubGluZSwgZXJyb3JPcCwgJDItPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICAkJCA9ICQyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICQkID0gJDI7CisgICAgfQorICAgIDsKKy8vIEdyYW1tYXIgTm90ZTogIE5vIHRyYWRpdGlvbmFsIHN0eWxlIHR5cGUgY2FzdHMuCisKK3VuYXJ5X29wZXJhdG9yCisgICAgOiBQTFVTICB7ICQkLmxpbmUgPSAkMS5saW5lOyAkJC5vcCA9IEVPcE51bGw7IH0KKyAgICB8IERBU0ggIHsgJCQubGluZSA9ICQxLmxpbmU7ICQkLm9wID0gRU9wTmVnYXRpdmU7IH0KKyAgICB8IEJBTkcgIHsgJCQubGluZSA9ICQxLmxpbmU7ICQkLm9wID0gRU9wTG9naWNhbE5vdDsgfQorICAgIDsKKy8vIEdyYW1tYXIgTm90ZTogIE5vICcqJyBvciAnJicgdW5hcnkgb3BzLiAgUG9pbnRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuCisKK211bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24KKyAgICA6IHVuYXJ5X2V4cHJlc3Npb24geyAkJCA9ICQxOyB9CisgICAgfCBtdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uIFNUQVIgdW5hcnlfZXhwcmVzc2lvbiB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCIqIiwgJDIubGluZSk7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEJpbmFyeU1hdGgoRU9wTXVsLCAkMSwgJDMsICQyLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoJDIubGluZSwgIioiLCAkMS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgJDMtPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgfQorICAgIH0KKyAgICB8IG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24gU0xBU0ggdW5hcnlfZXhwcmVzc2lvbiB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCIvIiwgJDIubGluZSk7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEJpbmFyeU1hdGgoRU9wRGl2LCAkMSwgJDMsICQyLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoJDIubGluZSwgIi8iLCAkMS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgJDMtPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgfQorICAgIH0KKyAgICA7CisKK2FkZGl0aXZlX2V4cHJlc3Npb24KKyAgICA6IG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24geyAkJCA9ICQxOyB9CisgICAgfCBhZGRpdGl2ZV9leHByZXNzaW9uIFBMVVMgbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbiB7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEJpbmFyeU1hdGgoRU9wQWRkLCAkMSwgJDMsICQyLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoJDIubGluZSwgIisiLCAkMS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgJDMtPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgfQorICAgIH0KKyAgICB8IGFkZGl0aXZlX2V4cHJlc3Npb24gREFTSCBtdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uIHsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BTdWIsICQxLCAkMywgJDIubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICBpZiAoJCQgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YmluYXJ5T3BFcnJvcigkMi5saW5lLCAiLSIsICQxLT5nZXRDb21wbGV0ZVN0cmluZygpLCAkMy0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAkJCA9ICQxOworICAgICAgICB9CisgICAgfQorICAgIDsKKworc2hpZnRfZXhwcmVzc2lvbgorICAgIDogYWRkaXRpdmVfZXhwcmVzc2lvbiB7ICQkID0gJDE7IH0KKyAgICA7CisKK3JlbGF0aW9uYWxfZXhwcmVzc2lvbgorICAgIDogc2hpZnRfZXhwcmVzc2lvbiB7ICQkID0gJDE7IH0KKyAgICB8IHJlbGF0aW9uYWxfZXhwcmVzc2lvbiBMRUZUX0FOR0xFIHNoaWZ0X2V4cHJlc3Npb24geworICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRCaW5hcnlNYXRoKEVPcExlc3NUaGFuLCAkMSwgJDMsICQyLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoJDIubGluZSwgIjwiLCAkMS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgJDMtPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0QkNvbnN0KGZhbHNlKTsKKyAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgVFR5cGUoRWJ0Qm9vbCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICQyLmxpbmUpOworICAgICAgICB9CisgICAgfQorICAgIHwgcmVsYXRpb25hbF9leHByZXNzaW9uIFJJR0hUX0FOR0xFIHNoaWZ0X2V4cHJlc3Npb24gIHsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BHcmVhdGVyVGhhbiwgJDEsICQzLCAkMi5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgkJCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCQyLmxpbmUsICI+IiwgJDEtPmdldENvbXBsZXRlU3RyaW5nKCksICQzLT5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgIHVuaW9uQXJyYXktPnNldEJDb25zdChmYWxzZSk7CisgICAgICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAkMi5saW5lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB8IHJlbGF0aW9uYWxfZXhwcmVzc2lvbiBMRV9PUCBzaGlmdF9leHByZXNzaW9uICB7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEJpbmFyeU1hdGgoRU9wTGVzc1RoYW5FcXVhbCwgJDEsICQzLCAkMi5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgkJCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCQyLmxpbmUsICI8PSIsICQxLT5nZXRDb21wbGV0ZVN0cmluZygpLCAkMy0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRCQ29uc3QoZmFsc2UpOworICAgICAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRCb29sLCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSwgJDIubGluZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgfCByZWxhdGlvbmFsX2V4cHJlc3Npb24gR0VfT1Agc2hpZnRfZXhwcmVzc2lvbiAgeworICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRCaW5hcnlNYXRoKEVPcEdyZWF0ZXJUaGFuRXF1YWwsICQxLCAkMywgJDIubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICBpZiAoJCQgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YmluYXJ5T3BFcnJvcigkMi5saW5lLCAiPj0iLCAkMS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgJDMtPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0QkNvbnN0KGZhbHNlKTsKKyAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgVFR5cGUoRWJ0Qm9vbCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICQyLmxpbmUpOworICAgICAgICB9CisgICAgfQorICAgIDsKKworZXF1YWxpdHlfZXhwcmVzc2lvbgorICAgIDogcmVsYXRpb25hbF9leHByZXNzaW9uIHsgJCQgPSAkMTsgfQorICAgIHwgZXF1YWxpdHlfZXhwcmVzc2lvbiBFUV9PUCByZWxhdGlvbmFsX2V4cHJlc3Npb24gIHsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BFcXVhbCwgJDEsICQzLCAkMi5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgkJCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCQyLmxpbmUsICI9PSIsICQxLT5nZXRDb21wbGV0ZVN0cmluZygpLCAkMy0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRCQ29uc3QoZmFsc2UpOworICAgICAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRCb29sLCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSwgJDIubGluZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgfCBlcXVhbGl0eV9leHByZXNzaW9uIE5FX09QIHJlbGF0aW9uYWxfZXhwcmVzc2lvbiB7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEJpbmFyeU1hdGgoRU9wTm90RXF1YWwsICQxLCAkMywgJDIubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICBpZiAoJCQgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YmluYXJ5T3BFcnJvcigkMi5saW5lLCAiIT0iLCAkMS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgJDMtPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0QkNvbnN0KGZhbHNlKTsKKyAgICAgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgVFR5cGUoRWJ0Qm9vbCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICQyLmxpbmUpOworICAgICAgICB9CisgICAgfQorICAgIDsKKworYW5kX2V4cHJlc3Npb24KKyAgICA6IGVxdWFsaXR5X2V4cHJlc3Npb24geyAkJCA9ICQxOyB9CisgICAgOworCitleGNsdXNpdmVfb3JfZXhwcmVzc2lvbgorICAgIDogYW5kX2V4cHJlc3Npb24geyAkJCA9ICQxOyB9CisgICAgOworCitpbmNsdXNpdmVfb3JfZXhwcmVzc2lvbgorICAgIDogZXhjbHVzaXZlX29yX2V4cHJlc3Npb24geyAkJCA9ICQxOyB9CisgICAgOworCitsb2dpY2FsX2FuZF9leHByZXNzaW9uCisgICAgOiBpbmNsdXNpdmVfb3JfZXhwcmVzc2lvbiB7ICQkID0gJDE7IH0KKyAgICB8IGxvZ2ljYWxfYW5kX2V4cHJlc3Npb24gQU5EX09QIGluY2x1c2l2ZV9vcl9leHByZXNzaW9uIHsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BMb2dpY2FsQW5kLCAkMSwgJDMsICQyLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoJDIubGluZSwgIiYmIiwgJDEtPmdldENvbXBsZXRlU3RyaW5nKCksICQzLT5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgIHVuaW9uQXJyYXktPnNldEJDb25zdChmYWxzZSk7CisgICAgICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAkMi5saW5lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICA7CisKK2xvZ2ljYWxfeG9yX2V4cHJlc3Npb24KKyAgICA6IGxvZ2ljYWxfYW5kX2V4cHJlc3Npb24geyAkJCA9ICQxOyB9CisgICAgfCBsb2dpY2FsX3hvcl9leHByZXNzaW9uIFhPUl9PUCBsb2dpY2FsX2FuZF9leHByZXNzaW9uICB7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEJpbmFyeU1hdGgoRU9wTG9naWNhbFhvciwgJDEsICQzLCAkMi5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgkJCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCQyLmxpbmUsICJeXiIsICQxLT5nZXRDb21wbGV0ZVN0cmluZygpLCAkMy0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRCQ29uc3QoZmFsc2UpOworICAgICAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRCb29sLCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSwgJDIubGluZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgOworCitsb2dpY2FsX29yX2V4cHJlc3Npb24KKyAgICA6IGxvZ2ljYWxfeG9yX2V4cHJlc3Npb24geyAkJCA9ICQxOyB9CisgICAgfCBsb2dpY2FsX29yX2V4cHJlc3Npb24gT1JfT1AgbG9naWNhbF94b3JfZXhwcmVzc2lvbiAgeworICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRCaW5hcnlNYXRoKEVPcExvZ2ljYWxPciwgJDEsICQzLCAkMi5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgkJCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCQyLmxpbmUsICJ8fCIsICQxLT5nZXRDb21wbGV0ZVN0cmluZygpLCAkMy0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRCQ29uc3QoZmFsc2UpOworICAgICAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRCb29sLCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSwgJDIubGluZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgOworCitjb25kaXRpb25hbF9leHByZXNzaW9uCisgICAgOiBsb2dpY2FsX29yX2V4cHJlc3Npb24geyAkJCA9ICQxOyB9CisgICAgfCBsb2dpY2FsX29yX2V4cHJlc3Npb24gUVVFU1RJT04gZXhwcmVzc2lvbiBDT0xPTiBhc3NpZ25tZW50X2V4cHJlc3Npb24geworICAgICAgIGlmIChjb250ZXh0LT5ib29sRXJyb3JDaGVjaygkMi5saW5lLCAkMSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkU2VsZWN0aW9uKCQxLCAkMywgJDUsICQyLmxpbmUpOworICAgICAgICBpZiAoJDMtPmdldFR5cGUoKSAhPSAkNS0+Z2V0VHlwZSgpKQorICAgICAgICAgICAgJCQgPSAwOworCisgICAgICAgIGlmICgkJCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCQyLmxpbmUsICI6IiwgJDMtPmdldENvbXBsZXRlU3RyaW5nKCksICQ1LT5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICQkID0gJDU7CisgICAgICAgIH0KKyAgICB9CisgICAgOworCithc3NpZ25tZW50X2V4cHJlc3Npb24KKyAgICA6IGNvbmRpdGlvbmFsX2V4cHJlc3Npb24geyAkJCA9ICQxOyB9CisgICAgfCB1bmFyeV9leHByZXNzaW9uIGFzc2lnbm1lbnRfb3BlcmF0b3IgYXNzaWdubWVudF9leHByZXNzaW9uIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPmxWYWx1ZUVycm9yQ2hlY2soJDIubGluZSwgImFzc2lnbiIsICQxKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQXNzaWduKCQyLm9wLCAkMSwgJDMsICQyLmxpbmUpOworICAgICAgICBpZiAoJCQgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YXNzaWduRXJyb3IoJDIubGluZSwgImFzc2lnbiIsICQxLT5nZXRDb21wbGV0ZVN0cmluZygpLCAkMy0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAkJCA9ICQxOworICAgICAgICB9CisgICAgfQorICAgIDsKKworYXNzaWdubWVudF9vcGVyYXRvcgorICAgIDogRVFVQUwgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJC5saW5lID0gJDEubGluZTsgJCQub3AgPSBFT3BBc3NpZ247IH0KKyAgICB8IE1VTF9BU1NJR04gICB7IEZSQUdfVkVSVF9PTkxZKCIqPSIsICQxLmxpbmUpOyAgICAgJCQubGluZSA9ICQxLmxpbmU7ICQkLm9wID0gRU9wTXVsQXNzaWduOyB9CisgICAgfCBESVZfQVNTSUdOICAgeyBGUkFHX1ZFUlRfT05MWSgiLz0iLCAkMS5saW5lKTsgICAgICQkLmxpbmUgPSAkMS5saW5lOyAkJC5vcCA9IEVPcERpdkFzc2lnbjsgfQorICAgIHwgQUREX0FTU0lHTiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJC5saW5lID0gJDEubGluZTsgJCQub3AgPSBFT3BBZGRBc3NpZ247IH0KKyAgICB8IFNVQl9BU1NJR04gICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQubGluZSA9ICQxLmxpbmU7ICQkLm9wID0gRU9wU3ViQXNzaWduOyB9CisgICAgOworCitleHByZXNzaW9uCisgICAgOiBhc3NpZ25tZW50X2V4cHJlc3Npb24geworICAgICAgICAkJCA9ICQxOworICAgIH0KKyAgICB8IGV4cHJlc3Npb24gQ09NTUEgYXNzaWdubWVudF9leHByZXNzaW9uIHsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29tbWEoJDEsICQzLCAkMi5saW5lKTsKKyAgICAgICAgaWYgKCQkID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoJDIubGluZSwgIiwiLCAkMS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgJDMtPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgJCQgPSAkMzsKKyAgICAgICAgfQorICAgIH0KKyAgICA7CisKK2NvbnN0YW50X2V4cHJlc3Npb24KKyAgICA6IGNvbmRpdGlvbmFsX2V4cHJlc3Npb24geworICAgICAgICBpZiAoY29udGV4dC0+Y29uc3RFcnJvckNoZWNrKCQxKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgJCQgPSAkMTsKKyAgICB9CisgICAgOworCitkZWNsYXJhdGlvbgorICAgIDogZnVuY3Rpb25fcHJvdG90eXBlIFNFTUlDT0xPTiAgIHsKKyAgICAgICAgVEZ1bmN0aW9uICZmdW5jdGlvbiA9ICooJDEuZnVuY3Rpb24pOworICAgICAgICAKKyAgICAgICAgVEludGVybUFnZ3JlZ2F0ZSAqcHJvdG90eXBlID0gbmV3IFRJbnRlcm1BZ2dyZWdhdGU7CisgICAgICAgIHByb3RvdHlwZS0+c2V0VHlwZShmdW5jdGlvbi5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICBwcm90b3R5cGUtPnNldE5hbWUoZnVuY3Rpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3Rpb24uZ2V0UGFyYW1Db3VudCgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFRQYXJhbWV0ZXIgJnBhcmFtID0gZnVuY3Rpb24uZ2V0UGFyYW0oaSk7CisgICAgICAgICAgICBpZiAocGFyYW0ubmFtZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRWYXJpYWJsZSAqdmFyaWFibGUgPSBuZXcgVFZhcmlhYmxlKHBhcmFtLm5hbWUsICpwYXJhbS50eXBlKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwcm90b3R5cGUgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuZ3Jvd0FnZ3JlZ2F0ZShwcm90b3R5cGUsIGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRTeW1ib2wodmFyaWFibGUtPmdldFVuaXF1ZUlkKCksIHZhcmlhYmxlLT5nZXROYW1lKCksIHZhcmlhYmxlLT5nZXRUeXBlKCksICQxLmxpbmUpLCAkMS5saW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90b3R5cGUgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuZ3Jvd0FnZ3JlZ2F0ZShwcm90b3R5cGUsIGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRTeW1ib2woMCwgIiIsICpwYXJhbS50eXBlLCAkMS5saW5lKSwgJDEubGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RvdHlwZS0+c2V0T3AoRU9wUHJvdG90eXBlKTsKKyAgICAgICAgJCQgPSBwcm90b3R5cGU7CisgICAgfQorICAgIHwgaW5pdF9kZWNsYXJhdG9yX2xpc3QgU0VNSUNPTE9OIHsKKyAgICAgICAgaWYgKCQxLmludGVybUFnZ3JlZ2F0ZSkKKyAgICAgICAgICAgICQxLmludGVybUFnZ3JlZ2F0ZS0+c2V0T3AoRU9wRGVjbGFyYXRpb24pOworICAgICAgICAkJCA9ICQxLmludGVybUFnZ3JlZ2F0ZTsKKyAgICB9CisgICAgfCBQUkVDSVNJT04gcHJlY2lzaW9uX3F1YWxpZmllciB0eXBlX3NwZWNpZmllcl9ub19wcmVjIFNFTUlDT0xPTiB7CisgICAgICAgIGNvbnRleHQtPnN5bWJvbFRhYmxlLnNldERlZmF1bHRQcmVjaXNpb24oICQzLnR5cGUsICQyICk7CisgICAgICAgICQkID0gMDsKKyAgICB9CisgICAgOworCitmdW5jdGlvbl9wcm90b3R5cGUKKyAgICA6IGZ1bmN0aW9uX2RlY2xhcmF0b3IgUklHSFRfUEFSRU4gIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTXVsdGlwbGUgZGVjbGFyYXRpb25zIG9mIHRoZSBzYW1lIGZ1bmN0aW9uIGFyZSBhbGxvd2VkLgorICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgZGVmaW5pdGlvbiwgdGhlIGRlZmluaXRpb24gcHJvZHVjdGlvbiBjb2RlIHdpbGwgY2hlY2sgZm9yIHJlZGVmaW5pdGlvbnMKKyAgICAgICAgLy8gKHdlIGRvbid0IGtub3cgYXQgdGhpcyBwb2ludCBpZiBpdCdzIGEgZGVmaW5pdGlvbiBvciBub3QpLgorICAgICAgICAvLworICAgICAgICAvLyBSZWRlY2xhcmF0aW9ucyBhcmUgYWxsb3dlZC4gIEJ1dCwgcmV0dXJuIHR5cGVzIGFuZCBwYXJhbWV0ZXIgcXVhbGlmaWVycyBtdXN0IG1hdGNoLgorICAgICAgICAvLworICAgICAgICBURnVuY3Rpb24qIHByZXZEZWMgPSBzdGF0aWNfY2FzdDxURnVuY3Rpb24qPihjb250ZXh0LT5zeW1ib2xUYWJsZS5maW5kKCQxLT5nZXRNYW5nbGVkTmFtZSgpKSk7CisgICAgICAgIGlmIChwcmV2RGVjKSB7CisgICAgICAgICAgICBpZiAocHJldkRlYy0+Z2V0UmV0dXJuVHlwZSgpICE9ICQxLT5nZXRSZXR1cm5UeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMi5saW5lLCAib3ZlcmxvYWRlZCBmdW5jdGlvbnMgbXVzdCBoYXZlIHRoZSBzYW1lIHJldHVybiB0eXBlIiwgJDEtPmdldFJldHVyblR5cGUoKS5nZXRCYXNpY1N0cmluZygpLCAiIik7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmV2RGVjLT5nZXRQYXJhbUNvdW50KCk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChwcmV2RGVjLT5nZXRQYXJhbShpKS50eXBlLT5nZXRRdWFsaWZpZXIoKSAhPSAkMS0+Z2V0UGFyYW0oaSkudHlwZS0+Z2V0UXVhbGlmaWVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDIubGluZSwgIm92ZXJsb2FkZWQgZnVuY3Rpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSBwYXJhbWV0ZXIgcXVhbGlmaWVycyIsICQxLT5nZXRQYXJhbShpKS50eXBlLT5nZXRRdWFsaWZpZXJTdHJpbmcoKSwgIiIpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHJlZGVjbGFyYXRpb24sIGl0IGNvdWxkIGFsc28gYmUgYSBkZWZpbml0aW9uLAorICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSB3YW50IHRvIHVzZSB0aGUgdmFyaWFibGUgbmFtZXMgZnJvbSB0aGlzIG9uZSwgYW5kIG5vdCB0aGUgb25lIHRoYXQncworICAgICAgICAvLyBiZWluZyByZWRlY2xhcmVkLiAgU28sIHBhc3MgYmFjayB1cCB0aGlzIGRlY2xhcmF0aW9uLCBub3QgdGhlIG9uZSBpbiB0aGUgc3ltYm9sIHRhYmxlLgorICAgICAgICAvLworICAgICAgICAkJC5mdW5jdGlvbiA9ICQxOworICAgICAgICAkJC5saW5lID0gJDIubGluZTsKKworICAgICAgICBjb250ZXh0LT5zeW1ib2xUYWJsZS5pbnNlcnQoKiQkLmZ1bmN0aW9uKTsKKyAgICB9CisgICAgOworCitmdW5jdGlvbl9kZWNsYXJhdG9yCisgICAgOiBmdW5jdGlvbl9oZWFkZXIgeworICAgICAgICAkJCA9ICQxOworICAgIH0KKyAgICB8IGZ1bmN0aW9uX2hlYWRlcl93aXRoX3BhcmFtZXRlcnMgeworICAgICAgICAkJCA9ICQxOworICAgIH0KKyAgICA7CisKKworZnVuY3Rpb25faGVhZGVyX3dpdGhfcGFyYW1ldGVycworICAgIDogZnVuY3Rpb25faGVhZGVyIHBhcmFtZXRlcl9kZWNsYXJhdGlvbiB7CisgICAgICAgIC8vIEFkZCB0aGUgcGFyYW1ldGVyCisgICAgICAgICQkID0gJDE7CisgICAgICAgIGlmICgkMi5wYXJhbS50eXBlLT5nZXRCYXNpY1R5cGUoKSAhPSBFYnRWb2lkKQorICAgICAgICAgICAgJDEtPmFkZFBhcmFtZXRlcigkMi5wYXJhbSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlbGV0ZSAkMi5wYXJhbS50eXBlOworICAgIH0KKyAgICB8IGZ1bmN0aW9uX2hlYWRlcl93aXRoX3BhcmFtZXRlcnMgQ09NTUEgcGFyYW1ldGVyX2RlY2xhcmF0aW9uIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gT25seSBmaXJzdCBwYXJhbWV0ZXIgb2Ygb25lLXBhcmFtZXRlciBmdW5jdGlvbnMgY2FuIGJlIHZvaWQKKyAgICAgICAgLy8gVGhlIGNoZWNrIGZvciBuYW1lZCBwYXJhbWV0ZXJzIG5vdCBiZWluZyB2b2lkIGlzIGRvbmUgaW4gcGFyYW1ldGVyX2RlY2xhcmF0b3IKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCQzLnBhcmFtLnR5cGUtPmdldEJhc2ljVHlwZSgpID09IEVidFZvaWQpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIHBhcmFtZXRlciA+IGZpcnN0IGlzIHZvaWQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMi5saW5lLCAiY2Fubm90IGJlIGFuIGFyZ3VtZW50IHR5cGUgZXhjZXB0IGZvciAnKHZvaWQpJyIsICJ2b2lkIiwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgZGVsZXRlICQzLnBhcmFtLnR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBZGQgdGhlIHBhcmFtZXRlcgorICAgICAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgICAgICQxLT5hZGRQYXJhbWV0ZXIoJDMucGFyYW0pOworICAgICAgICB9CisgICAgfQorICAgIDsKKworZnVuY3Rpb25faGVhZGVyCisgICAgOiBmdWxseV9zcGVjaWZpZWRfdHlwZSBJREVOVElGSUVSIExFRlRfUEFSRU4geworICAgICAgICBpZiAoJDEucXVhbGlmaWVyICE9IEV2cUdsb2JhbCAmJiAkMS5xdWFsaWZpZXIgIT0gRXZxVGVtcG9yYXJ5KSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMi5saW5lLCAibm8gcXVhbGlmaWVycyBhbGxvd2VkIGZvciBmdW5jdGlvbiByZXR1cm4iLCBnZXRRdWFsaWZpZXJTdHJpbmcoJDEucXVhbGlmaWVyKSwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgICAgIC8vIG1ha2Ugc3VyZSBhIHNhbXBsZXIgaXMgbm90IGludm9sdmVkIGFzIHdlbGwuLi4KKyAgICAgICAgaWYgKGNvbnRleHQtPnN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soJDIubGluZSwgJDEpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIC8vIEFkZCB0aGUgZnVuY3Rpb24gYXMgYSBwcm90b3R5cGUgYWZ0ZXIgcGFyc2luZyBpdCAod2UgZG8gbm90IHN1cHBvcnQgcmVjdXJzaW9uKQorICAgICAgICBURnVuY3Rpb24gKmZ1bmN0aW9uOworICAgICAgICBUVHlwZSB0eXBlKCQxKTsKKyAgICAgICAgZnVuY3Rpb24gPSBuZXcgVEZ1bmN0aW9uKCQyLnN0cmluZywgdHlwZSk7CisgICAgICAgICQkID0gZnVuY3Rpb247CisgICAgfQorICAgIDsKKworcGFyYW1ldGVyX2RlY2xhcmF0b3IKKyAgICAvLyBUeXBlICsgbmFtZQorICAgIDogdHlwZV9zcGVjaWZpZXIgSURFTlRJRklFUiB7CisgICAgICAgIGlmICgkMS50eXBlID09IEVidFZvaWQpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQyLmxpbmUsICJpbGxlZ2FsIHVzZSBvZiB0eXBlICd2b2lkJyIsICQyLnN0cmluZy0+Y19zdHIoKSwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgICAgIGlmIChjb250ZXh0LT5yZXNlcnZlZEVycm9yQ2hlY2soJDIubGluZSwgKiQyLnN0cmluZykpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIFRQYXJhbWV0ZXIgcGFyYW0gPSB7JDIuc3RyaW5nLCBuZXcgVFR5cGUoJDEpfTsKKyAgICAgICAgJCQubGluZSA9ICQyLmxpbmU7CisgICAgICAgICQkLnBhcmFtID0gcGFyYW07CisgICAgfQorICAgIHwgdHlwZV9zcGVjaWZpZXIgSURFTlRJRklFUiBMRUZUX0JSQUNLRVQgY29uc3RhbnRfZXhwcmVzc2lvbiBSSUdIVF9CUkFDS0VUIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gbWFrZSBhbiBhcnJheSBvdXQgb2YgdGhpcyB0eXBlCisgICAgICAgIGlmIChjb250ZXh0LT5hcnJheVR5cGVFcnJvckNoZWNrKCQzLmxpbmUsICQxKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKworICAgICAgICBpZiAoY29udGV4dC0+cmVzZXJ2ZWRFcnJvckNoZWNrKCQyLmxpbmUsICokMi5zdHJpbmcpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIGludCBzaXplOworICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlTaXplRXJyb3JDaGVjaygkMy5saW5lLCAkNCwgc2l6ZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICQxLnNldEFycmF5KHRydWUsIHNpemUpOworCisgICAgICAgIFRUeXBlKiB0eXBlID0gbmV3IFRUeXBlKCQxKTsKKyAgICAgICAgVFBhcmFtZXRlciBwYXJhbSA9IHsgJDIuc3RyaW5nLCB0eXBlIH07CisgICAgICAgICQkLmxpbmUgPSAkMi5saW5lOworICAgICAgICAkJC5wYXJhbSA9IHBhcmFtOworICAgIH0KKyAgICA7CisKK3BhcmFtZXRlcl9kZWNsYXJhdGlvbgorICAgIC8vCisgICAgLy8gVGhlIG9ubHkgcGFyYW1ldGVyIHF1YWxpZmllciBhIHBhcmFtZXRlciBjYW4gaGF2ZSBhcmUKKyAgICAvLyBJTl9RVUFMLCBPVVRfUVVBTCwgSU5PVVRfUVVBTCwgb3IgQ09OU1QuCisgICAgLy8KKworICAgIC8vCisgICAgLy8gVHlwZSArIG5hbWUKKyAgICAvLworICAgIDogdHlwZV9xdWFsaWZpZXIgcGFyYW1ldGVyX3F1YWxpZmllciBwYXJhbWV0ZXJfZGVjbGFyYXRvciB7CisgICAgICAgICQkID0gJDM7CisgICAgICAgIGlmIChjb250ZXh0LT5wYXJhbUVycm9yQ2hlY2soJDMubGluZSwgJDEucXVhbGlmaWVyLCAkMiwgJCQucGFyYW0udHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgfQorICAgIHwgcGFyYW1ldGVyX3F1YWxpZmllciBwYXJhbWV0ZXJfZGVjbGFyYXRvciB7CisgICAgICAgICQkID0gJDI7CisgICAgICAgIGlmIChjb250ZXh0LT5wYXJhbWV0ZXJTYW1wbGVyRXJyb3JDaGVjaygkMi5saW5lLCAkMSwgKiQyLnBhcmFtLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBpZiAoY29udGV4dC0+cGFyYW1FcnJvckNoZWNrKCQyLmxpbmUsIEV2cVRlbXBvcmFyeSwgJDEsICQkLnBhcmFtLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgIH0KKyAgICAvLworICAgIC8vIE9ubHkgdHlwZQorICAgIC8vCisgICAgfCB0eXBlX3F1YWxpZmllciBwYXJhbWV0ZXJfcXVhbGlmaWVyIHBhcmFtZXRlcl90eXBlX3NwZWNpZmllciB7CisgICAgICAgICQkID0gJDM7CisgICAgICAgIGlmIChjb250ZXh0LT5wYXJhbUVycm9yQ2hlY2soJDMubGluZSwgJDEucXVhbGlmaWVyLCAkMiwgJCQucGFyYW0udHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgfQorICAgIHwgcGFyYW1ldGVyX3F1YWxpZmllciBwYXJhbWV0ZXJfdHlwZV9zcGVjaWZpZXIgeworICAgICAgICAkJCA9ICQyOworICAgICAgICBpZiAoY29udGV4dC0+cGFyYW1ldGVyU2FtcGxlckVycm9yQ2hlY2soJDIubGluZSwgJDEsICokMi5wYXJhbS50eXBlKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgaWYgKGNvbnRleHQtPnBhcmFtRXJyb3JDaGVjaygkMi5saW5lLCBFdnFUZW1wb3JhcnksICQxLCAkJC5wYXJhbS50eXBlKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICB9CisgICAgOworCitwYXJhbWV0ZXJfcXVhbGlmaWVyCisgICAgOiAvKiBlbXB0eSAqLyB7CisgICAgICAgICQkID0gRXZxSW47CisgICAgfQorICAgIHwgSU5fUVVBTCB7CisgICAgICAgICQkID0gRXZxSW47CisgICAgfQorICAgIHwgT1VUX1FVQUwgeworICAgICAgICAkJCA9IEV2cU91dDsKKyAgICB9CisgICAgfCBJTk9VVF9RVUFMIHsKKyAgICAgICAgJCQgPSBFdnFJbk91dDsKKyAgICB9CisgICAgOworCitwYXJhbWV0ZXJfdHlwZV9zcGVjaWZpZXIKKyAgICA6IHR5cGVfc3BlY2lmaWVyIHsKKyAgICAgICAgVFBhcmFtZXRlciBwYXJhbSA9IHsgMCwgbmV3IFRUeXBlKCQxKSB9OworICAgICAgICAkJC5wYXJhbSA9IHBhcmFtOworICAgIH0KKyAgICA7CisKK2luaXRfZGVjbGFyYXRvcl9saXN0CisgICAgOiBzaW5nbGVfZGVjbGFyYXRpb24geworICAgICAgICAkJCA9ICQxOworICAgICAgICAKKyAgICAgICAgaWYgKCQkLnR5cGUucHJlY2lzaW9uID09IEVicFVuZGVmaW5lZCkgeworICAgICAgICAgICAgJCQudHlwZS5wcmVjaXNpb24gPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5nZXREZWZhdWx0UHJlY2lzaW9uKCQxLnR5cGUudHlwZSk7CisgICAgICAgICAgICBpZiAoY29udGV4dC0+cHJlY2lzaW9uRXJyb3JDaGVjaygkMS5saW5lLCAkJC50eXBlLnByZWNpc2lvbiwgJDEudHlwZS50eXBlKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB8IGluaXRfZGVjbGFyYXRvcl9saXN0IENPTU1BIElERU5USUZJRVIgeworICAgICAgICBUSW50ZXJtU3ltYm9sKiBzeW1ib2wgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkU3ltYm9sKDAsICokMy5zdHJpbmcsIFRUeXBlKCQxLnR5cGUpLCAkMy5saW5lKTsKKyAgICAgICAgJCQuaW50ZXJtQWdncmVnYXRlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUoJDEuaW50ZXJtTm9kZSwgc3ltYm9sLCAkMy5saW5lKTsKKyAgICAgICAgCisgICAgICAgIGlmIChjb250ZXh0LT5zdHJ1Y3RRdWFsaWZpZXJFcnJvckNoZWNrKCQzLmxpbmUsICQkLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIGlmIChjb250ZXh0LT5ub25Jbml0Q29uc3RFcnJvckNoZWNrKCQzLmxpbmUsICokMy5zdHJpbmcsICQkLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIFRWYXJpYWJsZSogdmFyaWFibGUgPSAwOworICAgICAgICBpZiAoY29udGV4dC0+bm9uSW5pdEVycm9yQ2hlY2soJDMubGluZSwgKiQzLnN0cmluZywgJCQudHlwZSwgdmFyaWFibGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBpZiAoc3ltYm9sICYmIHZhcmlhYmxlKQorICAgICAgICAgICAgc3ltYm9sLT5zZXRJZCh2YXJpYWJsZS0+Z2V0VW5pcXVlSWQoKSk7CisgICAgfQorICAgIHwgaW5pdF9kZWNsYXJhdG9yX2xpc3QgQ09NTUEgSURFTlRJRklFUiBMRUZUX0JSQUNLRVQgUklHSFRfQlJBQ0tFVCB7CisgICAgICAgIGlmIChjb250ZXh0LT5zdHJ1Y3RRdWFsaWZpZXJFcnJvckNoZWNrKCQzLmxpbmUsICQxLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIGlmIChjb250ZXh0LT5ub25Jbml0Q29uc3RFcnJvckNoZWNrKCQzLmxpbmUsICokMy5zdHJpbmcsICQxLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgICQkID0gJDE7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5VHlwZUVycm9yQ2hlY2soJDQubGluZSwgJDEudHlwZSkgfHwgY29udGV4dC0+YXJyYXlRdWFsaWZpZXJFcnJvckNoZWNrKCQ0LmxpbmUsICQxLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICQxLnR5cGUuc2V0QXJyYXkodHJ1ZSk7CisgICAgICAgICAgICBUVmFyaWFibGUqIHZhcmlhYmxlOworICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5RXJyb3JDaGVjaygkNC5saW5lLCAqJDMuc3RyaW5nLCAkMS50eXBlLCB2YXJpYWJsZSkpCisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgfQorICAgIHwgaW5pdF9kZWNsYXJhdG9yX2xpc3QgQ09NTUEgSURFTlRJRklFUiBMRUZUX0JSQUNLRVQgY29uc3RhbnRfZXhwcmVzc2lvbiBSSUdIVF9CUkFDS0VUIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPnN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soJDMubGluZSwgJDEudHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPm5vbkluaXRDb25zdEVycm9yQ2hlY2soJDMubGluZSwgKiQzLnN0cmluZywgJDEudHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgJCQgPSAkMTsKKworICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlUeXBlRXJyb3JDaGVjaygkNC5saW5lLCAkMS50eXBlKSB8fCBjb250ZXh0LT5hcnJheVF1YWxpZmllckVycm9yQ2hlY2soJDQubGluZSwgJDEudHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlTaXplRXJyb3JDaGVjaygkNC5saW5lLCAkNSwgc2l6ZSkpCisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgJDEudHlwZS5zZXRBcnJheSh0cnVlLCBzaXplKTsKKyAgICAgICAgICAgIFRWYXJpYWJsZSogdmFyaWFibGUgPSAwOworICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5RXJyb3JDaGVjaygkNC5saW5lLCAqJDMuc3RyaW5nLCAkMS50eXBlLCB2YXJpYWJsZSkpCisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgVFR5cGUgdHlwZSA9IFRUeXBlKCQxLnR5cGUpOworICAgICAgICAgICAgdHlwZS5zZXRBcnJheVNpemUoc2l6ZSk7CisgICAgICAgICAgICAkJC5pbnRlcm1BZ2dyZWdhdGUgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuZ3Jvd0FnZ3JlZ2F0ZSgkMS5pbnRlcm1Ob2RlLCBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkU3ltYm9sKHZhcmlhYmxlID8gdmFyaWFibGUtPmdldFVuaXF1ZUlkKCkgOiAwLCAqJDMuc3RyaW5nLCB0eXBlLCAkMy5saW5lKSwgJDMubGluZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgfCBpbml0X2RlY2xhcmF0b3JfbGlzdCBDT01NQSBJREVOVElGSUVSIEVRVUFMIGluaXRpYWxpemVyIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPnN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soJDMubGluZSwgJDEudHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgJCQgPSAkMTsKKworICAgICAgICBUSW50ZXJtTm9kZSogaW50ZXJtTm9kZTsKKyAgICAgICAgaWYgKCFjb250ZXh0LT5leGVjdXRlSW5pdGlhbGl6ZXIoJDMubGluZSwgKiQzLnN0cmluZywgJDEudHlwZSwgJDUsIGludGVybU5vZGUpKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gYnVpbGQgdGhlIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmIChpbnRlcm1Ob2RlKQorICAgICAgICAkJC5pbnRlcm1BZ2dyZWdhdGUgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuZ3Jvd0FnZ3JlZ2F0ZSgkMS5pbnRlcm1Ob2RlLCBpbnRlcm1Ob2RlLCAkNC5saW5lKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAkJC5pbnRlcm1BZ2dyZWdhdGUgPSAkMS5pbnRlcm1BZ2dyZWdhdGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAkJC5pbnRlcm1BZ2dyZWdhdGUgPSAwOworICAgICAgICB9CisgICAgfQorICAgIDsKKworc2luZ2xlX2RlY2xhcmF0aW9uCisgICAgOiBmdWxseV9zcGVjaWZpZWRfdHlwZSB7CisgICAgICAgICQkLnR5cGUgPSAkMTsKKyAgICAgICAgJCQuaW50ZXJtQWdncmVnYXRlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLm1ha2VBZ2dyZWdhdGUoY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFN5bWJvbCgwLCAiIiwgVFR5cGUoJDEpLCAkMS5saW5lKSwgJDEubGluZSk7CisgICAgfQorICAgIHwgZnVsbHlfc3BlY2lmaWVkX3R5cGUgSURFTlRJRklFUiB7CisgICAgICAgIFRJbnRlcm1TeW1ib2wqIHN5bWJvbCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRTeW1ib2woMCwgKiQyLnN0cmluZywgVFR5cGUoJDEpLCAkMi5saW5lKTsKKyAgICAgICAgJCQuaW50ZXJtQWdncmVnYXRlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLm1ha2VBZ2dyZWdhdGUoc3ltYm9sLCAkMi5saW5lKTsKKyAgICAgICAgCisgICAgICAgIGlmIChjb250ZXh0LT5zdHJ1Y3RRdWFsaWZpZXJFcnJvckNoZWNrKCQyLmxpbmUsICQkLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIGlmIChjb250ZXh0LT5ub25Jbml0Q29uc3RFcnJvckNoZWNrKCQyLmxpbmUsICokMi5zdHJpbmcsICQkLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgCisgICAgICAgICAgICAkJC50eXBlID0gJDE7CisKKyAgICAgICAgVFZhcmlhYmxlKiB2YXJpYWJsZSA9IDA7CisgICAgICAgIGlmIChjb250ZXh0LT5ub25Jbml0RXJyb3JDaGVjaygkMi5saW5lLCAqJDIuc3RyaW5nLCAkJC50eXBlLCB2YXJpYWJsZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIGlmICh2YXJpYWJsZSAmJiBzeW1ib2wpCisgICAgICAgICAgICBzeW1ib2wtPnNldElkKHZhcmlhYmxlLT5nZXRVbmlxdWVJZCgpKTsKKyAgICB9CisgICAgfCBmdWxseV9zcGVjaWZpZWRfdHlwZSBJREVOVElGSUVSIExFRlRfQlJBQ0tFVCBSSUdIVF9CUkFDS0VUIHsKKyAgICAgICAgY29udGV4dC0+ZXJyb3IoJDIubGluZSwgInVuc2l6ZWQgYXJyYXkgZGVjbGFyYXRpb25zIG5vdCBzdXBwb3J0ZWQiLCAkMi5zdHJpbmctPmNfc3RyKCksICIiKTsKKyAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIFRJbnRlcm1TeW1ib2wqIHN5bWJvbCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRTeW1ib2woMCwgKiQyLnN0cmluZywgVFR5cGUoJDEpLCAkMi5saW5lKTsKKyAgICAgICAgJCQuaW50ZXJtQWdncmVnYXRlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLm1ha2VBZ2dyZWdhdGUoc3ltYm9sLCAkMi5saW5lKTsKKyAgICAgICAgJCQudHlwZSA9ICQxOworICAgIH0KKyAgICB8IGZ1bGx5X3NwZWNpZmllZF90eXBlIElERU5USUZJRVIgTEVGVF9CUkFDS0VUIGNvbnN0YW50X2V4cHJlc3Npb24gUklHSFRfQlJBQ0tFVCB7CisgICAgICAgIFRUeXBlIHR5cGUgPSBUVHlwZSgkMSk7CisgICAgICAgIGludCBzaXplOworICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlTaXplRXJyb3JDaGVjaygkMi5saW5lLCAkNCwgc2l6ZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIHR5cGUuc2V0QXJyYXlTaXplKHNpemUpOworICAgICAgICBUSW50ZXJtU3ltYm9sKiBzeW1ib2wgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkU3ltYm9sKDAsICokMi5zdHJpbmcsIHR5cGUsICQyLmxpbmUpOworICAgICAgICAkJC5pbnRlcm1BZ2dyZWdhdGUgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUubWFrZUFnZ3JlZ2F0ZShzeW1ib2wsICQyLmxpbmUpOworICAgICAgICAKKyAgICAgICAgaWYgKGNvbnRleHQtPnN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soJDIubGluZSwgJDEpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIGlmIChjb250ZXh0LT5ub25Jbml0Q29uc3RFcnJvckNoZWNrKCQyLmxpbmUsICokMi5zdHJpbmcsICQxKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKworICAgICAgICAkJC50eXBlID0gJDE7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5VHlwZUVycm9yQ2hlY2soJDMubGluZSwgJDEpIHx8IGNvbnRleHQtPmFycmF5UXVhbGlmaWVyRXJyb3JDaGVjaygkMy5saW5lLCAkMSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlTaXplRXJyb3JDaGVjaygkMy5saW5lLCAkNCwgc2l6ZSkpCisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgICAgICAkMS5zZXRBcnJheSh0cnVlLCBzaXplKTsKKyAgICAgICAgICAgIFRWYXJpYWJsZSogdmFyaWFibGUgPSAwOworICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5RXJyb3JDaGVjaygkMy5saW5lLCAqJDIuc3RyaW5nLCAkMSwgdmFyaWFibGUpKQorICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZSAmJiBzeW1ib2wpCisgICAgICAgICAgICAgICAgc3ltYm9sLT5zZXRJZCh2YXJpYWJsZS0+Z2V0VW5pcXVlSWQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgfCBmdWxseV9zcGVjaWZpZWRfdHlwZSBJREVOVElGSUVSIEVRVUFMIGluaXRpYWxpemVyIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPnN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soJDIubGluZSwgJDEpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgICQkLnR5cGUgPSAkMTsKKworICAgICAgICBUSW50ZXJtTm9kZSogaW50ZXJtTm9kZTsKKyAgICAgICAgaWYgKCFjb250ZXh0LT5leGVjdXRlSW5pdGlhbGl6ZXIoJDIubGluZSwgKiQyLnN0cmluZywgJDEsICQ0LCBpbnRlcm1Ob2RlKSkgeworICAgICAgICAvLworICAgICAgICAvLyBCdWlsZCBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgICAgIGlmKGludGVybU5vZGUpCisgICAgICAgICAgICAgICAgJCQuaW50ZXJtQWdncmVnYXRlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLm1ha2VBZ2dyZWdhdGUoaW50ZXJtTm9kZSwgJDMubGluZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgJCQuaW50ZXJtQWdncmVnYXRlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICQkLmludGVybUFnZ3JlZ2F0ZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgfCBJTlZBUklBTlQgSURFTlRJRklFUiB7CisgICAgICAgIFZFUlRFWF9PTkxZKCJpbnZhcmlhbnQgZGVjbGFyYXRpb24iLCAkMS5saW5lKTsKKyAgICAgICAgJCQucXVhbGlmaWVyID0gRXZxSW52YXJpYW50VmFyeWluZ091dDsKKyAgICAgICAgJCQuaW50ZXJtQWdncmVnYXRlID0gMDsKKyAgICB9CisKKy8vCisvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSBwYWNrL3VucGFjayBsYW5ndWFnZXMuCisvLworLy8gICAgfCBidWZmZXJfc3BlY2lmaWVyIHsKKy8vICAgICAgICAkJC5pbnRlcm1BZ2dyZWdhdGUgPSAwOworLy8gICAgfQorICAgIDsKKworLy8gR3JhbW1hciBOb3RlOiAgTm8gJ2VudW0nLCBvciAndHlwZWRlZicuCisKKy8vCisvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSBwYWNrL3VucGFjayBsYW5ndWFnZXMuCisvLworLy8ldHlwZSA8aW50ZXJtPiBidWZmZXJfZGVjbGFyYXRpb24KKy8vJXR5cGUgPGludGVybS50eXBlPiBidWZmZXJfc3BlY2lmaWVyIGlucHV0X29yX291dHB1dCBidWZmZXJfZGVjbGFyYXRpb25fbGlzdAorLy9idWZmZXJfc3BlY2lmaWVyCisvLyAgICA6IGlucHV0X29yX291dHB1dCBMRUZUX0JSQUNFIGJ1ZmZlcl9kZWNsYXJhdGlvbl9saXN0IFJJR0hUX0JSQUNFIHsKKy8vICAgIH0KKy8vICAgIDsKKy8vCisvL2lucHV0X29yX291dHB1dAorLy8gICAgOiBJTlBVVCB7CisvLyAgICAgICAgaWYgKGNvbnRleHQtPmdsb2JhbEVycm9yQ2hlY2soJDEubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpLCAiaW5wdXQiKSkKKy8vICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworLy8gICAgICAgIFVOUEFDS19PTkxZKCJpbnB1dCIsICQxLmxpbmUpOworLy8gICAgICAgICQkLnF1YWxpZmllciA9IEV2cUlucHV0OworLy8gICAgfQorLy8gICAgfCBPVVRQVVQgeworLy8gICAgICAgIGlmIChjb250ZXh0LT5nbG9iYWxFcnJvckNoZWNrKCQxLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSwgIm91dHB1dCIpKQorLy8gICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisvLyAgICAgICAgUEFDS19PTkxZKCJvdXRwdXQiLCAkMS5saW5lKTsKKy8vICAgICAgICAkJC5xdWFsaWZpZXIgPSBFdnFPdXRwdXQ7CisvLyAgICB9CisvLyAgICA7CisKKy8vCisvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSBwYWNrL3VucGFjayBsYW5ndWFnZXMuCisvLworLy9idWZmZXJfZGVjbGFyYXRpb25fbGlzdAorLy8gICAgOiBidWZmZXJfZGVjbGFyYXRpb24geworLy8gICAgfQorLy8gICAgfCBidWZmZXJfZGVjbGFyYXRpb25fbGlzdCBidWZmZXJfZGVjbGFyYXRpb24geworLy8gICAgfQorLy8gICAgOworCisvLworLy8gSW5wdXQvb3V0cHV0IHNlbWFudGljczoKKy8vICAgZmxvYXQgbXVzdCBiZSAxNiBvciAzMiBiaXRzCisvLyAgIGZsb2F0IGFsaWdubWVudCByZXN0cmljdGlvbnM/CisvLyAgIGNoZWNrIGZvciBvbmx5IG9uZSBpbnB1dCBhbmQgb25seSBvbmUgb3V0cHV0CisvLyAgIHN1bSBvZiBiaXRmaWVsZHMgaGFzIHRvIGJlIG11bHRpcGxlIG9mIDMyCisvLworCisvLworLy8gUGxhY2UgaG9sZGVyIGZvciB0aGUgcGFjay91bnBhY2sgbGFuZ3VhZ2VzLgorLy8KKy8vYnVmZmVyX2RlY2xhcmF0aW9uCisvLyAgICA6IHR5cGVfc3BlY2lmaWVyIElERU5USUZJRVIgQ09MT04gY29uc3RhbnRfZXhwcmVzc2lvbiBTRU1JQ09MT04geworLy8gICAgICAgIGlmIChjb250ZXh0LT5yZXNlcnZlZEVycm9yQ2hlY2soJDIubGluZSwgKiQyLnN0cmluZywgY29udGV4dCkpCisvLyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKy8vICAgICAgICAkJC52YXJpYWJsZSA9IG5ldyBUVmFyaWFibGUoJDIuc3RyaW5nLCAkMSk7CisvLyAgICAgICAgaWYgKCEgY29udGV4dC0+c3ltYm9sVGFibGUuaW5zZXJ0KCokJC52YXJpYWJsZSkpIHsKKy8vICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDIubGluZSwgInJlZGVmaW5pdGlvbiIsICQkLnZhcmlhYmxlLT5nZXROYW1lKCkuY19zdHIoKSwgIiIpOworLy8gICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisvLyAgICAgICAgICAgIC8vIGRvbid0IGhhdmUgdG8gZGVsZXRlICQkLnZhcmlhYmxlLCB0aGUgcG9vbCBwb3Agd2lsbCB0YWtlIGNhcmUgb2YgaXQKKy8vICAgICAgICB9CisvLyAgICB9CisvLyAgICA7CisKK2Z1bGx5X3NwZWNpZmllZF90eXBlCisgICAgOiB0eXBlX3NwZWNpZmllciB7CisgICAgICAgICQkID0gJDE7CisKKyAgICAgICAgaWYgKCQxLmFycmF5KSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMS5saW5lLCAibm90IHN1cHBvcnRlZCIsICJmaXJzdC1jbGFzcyBhcnJheSIsICIiKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICQxLnNldEFycmF5KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB8IHR5cGVfcXVhbGlmaWVyIHR5cGVfc3BlY2lmaWVyICB7CisgICAgICAgIGlmICgkMi5hcnJheSkgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDIubGluZSwgIm5vdCBzdXBwb3J0ZWQiLCAiZmlyc3QtY2xhc3MgYXJyYXkiLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAkMi5zZXRBcnJheShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJDEucXVhbGlmaWVyID09IEV2cUF0dHJpYnV0ZSAmJgorICAgICAgICAgICAgKCQyLnR5cGUgPT0gRWJ0Qm9vbCB8fCAkMi50eXBlID09IEVidEludCkpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQyLmxpbmUsICJjYW5ub3QgYmUgYm9vbCBvciBpbnQiLCBnZXRRdWFsaWZpZXJTdHJpbmcoJDEucXVhbGlmaWVyKSwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgICAgIGlmICgoJDEucXVhbGlmaWVyID09IEV2cVZhcnlpbmdJbiB8fCAkMS5xdWFsaWZpZXIgPT0gRXZxVmFyeWluZ091dCkgJiYKKyAgICAgICAgICAgICgkMi50eXBlID09IEVidEJvb2wgfHwgJDIudHlwZSA9PSBFYnRJbnQpKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMi5saW5lLCAiY2Fubm90IGJlIGJvb2wgb3IgaW50IiwgZ2V0UXVhbGlmaWVyU3RyaW5nKCQxLnF1YWxpZmllciksICIiKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgfQorICAgICAgICAkJCA9ICQyOworICAgICAgICAkJC5xdWFsaWZpZXIgPSAkMS5xdWFsaWZpZXI7CisgICAgfQorICAgIDsKKwordHlwZV9xdWFsaWZpZXIKKyAgICA6IENPTlNUX1FVQUwgeworICAgICAgICAkJC5zZXRCYXNpYyhFYnRWb2lkLCBFdnFDb25zdCwgJDEubGluZSk7CisgICAgfQorICAgIHwgQVRUUklCVVRFIHsKKyAgICAgICAgVkVSVEVYX09OTFkoImF0dHJpYnV0ZSIsICQxLmxpbmUpOworICAgICAgICBpZiAoY29udGV4dC0+Z2xvYmFsRXJyb3JDaGVjaygkMS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCksICJhdHRyaWJ1dGUiKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0Vm9pZCwgRXZxQXR0cmlidXRlLCAkMS5saW5lKTsKKyAgICB9CisgICAgfCBWQVJZSU5HIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPmdsb2JhbEVycm9yQ2hlY2soJDEubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpLCAidmFyeWluZyIpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBpZiAoY29udGV4dC0+c2hhZGVyVHlwZSA9PSBTSF9WRVJURVhfU0hBREVSKQorICAgICAgICAgICAgJCQuc2V0QmFzaWMoRWJ0Vm9pZCwgRXZxVmFyeWluZ091dCwgJDEubGluZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICQkLnNldEJhc2ljKEVidFZvaWQsIEV2cVZhcnlpbmdJbiwgJDEubGluZSk7CisgICAgfQorICAgIHwgSU5WQVJJQU5UIFZBUllJTkcgeworICAgICAgICBpZiAoY29udGV4dC0+Z2xvYmFsRXJyb3JDaGVjaygkMS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCksICJpbnZhcmlhbnQgdmFyeWluZyIpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBpZiAoY29udGV4dC0+c2hhZGVyVHlwZSA9PSBTSF9WRVJURVhfU0hBREVSKQorICAgICAgICAgICAgJCQuc2V0QmFzaWMoRWJ0Vm9pZCwgRXZxSW52YXJpYW50VmFyeWluZ091dCwgJDEubGluZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICQkLnNldEJhc2ljKEVidFZvaWQsIEV2cUludmFyaWFudFZhcnlpbmdJbiwgJDEubGluZSk7CisgICAgfQorICAgIHwgVU5JRk9STSB7CisgICAgICAgIGlmIChjb250ZXh0LT5nbG9iYWxFcnJvckNoZWNrKCQxLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSwgInVuaWZvcm0iKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0Vm9pZCwgRXZxVW5pZm9ybSwgJDEubGluZSk7CisgICAgfQorICAgIDsKKwordHlwZV9zcGVjaWZpZXIKKyAgICA6IHR5cGVfc3BlY2lmaWVyX25vX3ByZWMgeworICAgICAgICAkJCA9ICQxOworICAgIH0KKyAgICB8IHByZWNpc2lvbl9xdWFsaWZpZXIgdHlwZV9zcGVjaWZpZXJfbm9fcHJlYyB7CisgICAgICAgICQkID0gJDI7CisgICAgICAgICQkLnByZWNpc2lvbiA9ICQxOworICAgIH0KKyAgICA7CisKK3ByZWNpc2lvbl9xdWFsaWZpZXIKKyAgICA6IEhJR0hfUFJFQ0lTSU9OIHsKKyAgICAgICAgJCQgPSBFYnBIaWdoOworICAgIH0KKyAgICB8IE1FRElVTV9QUkVDSVNJT04geworICAgICAgICAkJCA9IEVicE1lZGl1bTsKKyAgICB9CisgICAgfCBMT1dfUFJFQ0lTSU9OICB7CisgICAgICAgICQkID0gRWJwTG93OworICAgIH0KKyAgICA7CisKK3R5cGVfc3BlY2lmaWVyX25vX3ByZWMKKyAgICA6IHR5cGVfc3BlY2lmaWVyX25vbmFycmF5IHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICB9CisgICAgfCB0eXBlX3NwZWNpZmllcl9ub25hcnJheSBMRUZUX0JSQUNLRVQgY29uc3RhbnRfZXhwcmVzc2lvbiBSSUdIVF9CUkFDS0VUIHsKKyAgICAgICAgJCQgPSAkMTsKKworICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlUeXBlRXJyb3JDaGVjaygkMi5saW5lLCAkMSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlTaXplRXJyb3JDaGVjaygkMi5saW5lLCAkMywgc2l6ZSkpCisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgJCQuc2V0QXJyYXkodHJ1ZSwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgOworCit0eXBlX3NwZWNpZmllcl9ub25hcnJheQorICAgIDogVk9JRF9UWVBFIHsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsID0gY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpID8gRXZxR2xvYmFsIDogRXZxVGVtcG9yYXJ5OworICAgICAgICAkJC5zZXRCYXNpYyhFYnRWb2lkLCBxdWFsLCAkMS5saW5lKTsKKyAgICB9CisgICAgfCBGTE9BVF9UWVBFIHsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsID0gY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpID8gRXZxR2xvYmFsIDogRXZxVGVtcG9yYXJ5OworICAgICAgICAkJC5zZXRCYXNpYyhFYnRGbG9hdCwgcXVhbCwgJDEubGluZSk7CisgICAgfQorICAgIHwgSU5UX1RZUEUgeworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICQkLnNldEJhc2ljKEVidEludCwgcXVhbCwgJDEubGluZSk7CisgICAgfQorICAgIHwgQk9PTF9UWVBFIHsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsID0gY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpID8gRXZxR2xvYmFsIDogRXZxVGVtcG9yYXJ5OworICAgICAgICAkJC5zZXRCYXNpYyhFYnRCb29sLCBxdWFsLCAkMS5saW5lKTsKKyAgICB9CisvLyAgICB8IFVOU0lHTkVEIElOVF9UWVBFIHsKKy8vICAgICAgICBQQUNLX1VOUEFDS19PTkxZKCJ1bnNpZ25lZCIsICQxLmxpbmUpOworLy8gICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKy8vICAgICAgICAkJC5zZXRCYXNpYyhFYnRJbnQsIHF1YWwsICQxLmxpbmUpOworLy8gICAgfQorICAgIHwgVkVDMiB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0RmxvYXQsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoMik7CisgICAgfQorICAgIHwgVkVDMyB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0RmxvYXQsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoMyk7CisgICAgfQorICAgIHwgVkVDNCB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0RmxvYXQsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoNCk7CisgICAgfQorICAgIHwgQlZFQzIgeworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICQkLnNldEJhc2ljKEVidEJvb2wsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoMik7CisgICAgfQorICAgIHwgQlZFQzMgeworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICQkLnNldEJhc2ljKEVidEJvb2wsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoMyk7CisgICAgfQorICAgIHwgQlZFQzQgeworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICQkLnNldEJhc2ljKEVidEJvb2wsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoNCk7CisgICAgfQorICAgIHwgSVZFQzIgeworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICQkLnNldEJhc2ljKEVidEludCwgcXVhbCwgJDEubGluZSk7CisgICAgICAgICQkLnNldEFnZ3JlZ2F0ZSgyKTsKKyAgICB9CisgICAgfCBJVkVDMyB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0SW50LCBxdWFsLCAkMS5saW5lKTsKKyAgICAgICAgJCQuc2V0QWdncmVnYXRlKDMpOworICAgIH0KKyAgICB8IElWRUM0IHsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsID0gY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpID8gRXZxR2xvYmFsIDogRXZxVGVtcG9yYXJ5OworICAgICAgICAkJC5zZXRCYXNpYyhFYnRJbnQsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoNCk7CisgICAgfQorICAgIHwgTUFUUklYMiB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCJtYXQyIiwgJDEubGluZSk7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0RmxvYXQsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoMiwgdHJ1ZSk7CisgICAgfQorICAgIHwgTUFUUklYMyB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCJtYXQzIiwgJDEubGluZSk7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0RmxvYXQsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoMywgdHJ1ZSk7CisgICAgfQorICAgIHwgTUFUUklYNCB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCJtYXQ0IiwgJDEubGluZSk7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0RmxvYXQsIHF1YWwsICQxLmxpbmUpOworICAgICAgICAkJC5zZXRBZ2dyZWdhdGUoNCwgdHJ1ZSk7CisgICAgfQorICAgIHwgU0FNUExFUjJEIHsKKyAgICAgICAgRlJBR19WRVJUX09OTFkoInNhbXBsZXIyRCIsICQxLmxpbmUpOworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICQkLnNldEJhc2ljKEVidFNhbXBsZXIyRCwgcXVhbCwgJDEubGluZSk7CisgICAgfQorICAgIHwgU0FNUExFUkNVQkUgeworICAgICAgICBGUkFHX1ZFUlRfT05MWSgic2FtcGxlckN1YmUiLCAkMS5saW5lKTsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsID0gY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpID8gRXZxR2xvYmFsIDogRXZxVGVtcG9yYXJ5OworICAgICAgICAkJC5zZXRCYXNpYyhFYnRTYW1wbGVyQ3ViZSwgcXVhbCwgJDEubGluZSk7CisgICAgfQorICAgIHwgc3RydWN0X3NwZWNpZmllciB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCJzdHJ1Y3QiLCAkMS5saW5lKTsKKyAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgJCQucXVhbGlmaWVyID0gY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpID8gRXZxR2xvYmFsIDogRXZxVGVtcG9yYXJ5OworICAgIH0KKyAgICB8IFRZUEVfTkFNRSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgaXMgZm9yIHVzZXIgZGVmaW5lZCB0eXBlIG5hbWVzLiAgVGhlIGxleGljYWwgcGhhc2UgbG9va2VkIHVwIHRoZQorICAgICAgICAvLyB0eXBlLgorICAgICAgICAvLworICAgICAgICBUVHlwZSYgc3RydWN0dXJlID0gc3RhdGljX2Nhc3Q8VFZhcmlhYmxlKj4oJDEuc3ltYm9sKS0+Z2V0VHlwZSgpOworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICQkLnNldEJhc2ljKEVidFN0cnVjdCwgcXVhbCwgJDEubGluZSk7CisgICAgICAgICQkLnVzZXJEZWYgPSAmc3RydWN0dXJlOworICAgIH0KKyAgICA7CisKK3N0cnVjdF9zcGVjaWZpZXIKKyAgICA6IFNUUlVDVCBJREVOVElGSUVSIExFRlRfQlJBQ0Ugc3RydWN0X2RlY2xhcmF0aW9uX2xpc3QgUklHSFRfQlJBQ0UgeworICAgICAgICBpZiAoY29udGV4dC0+cmVzZXJ2ZWRFcnJvckNoZWNrKCQyLmxpbmUsICokMi5zdHJpbmcpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIFRUeXBlKiBzdHJ1Y3R1cmUgPSBuZXcgVFR5cGUoJDQsICokMi5zdHJpbmcpOworICAgICAgICBUVmFyaWFibGUqIHVzZXJUeXBlRGVmID0gbmV3IFRWYXJpYWJsZSgkMi5zdHJpbmcsICpzdHJ1Y3R1cmUsIHRydWUpOworICAgICAgICBpZiAoISBjb250ZXh0LT5zeW1ib2xUYWJsZS5pbnNlcnQoKnVzZXJUeXBlRGVmKSkgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDIubGluZSwgInJlZGVmaW5pdGlvbiIsICQyLnN0cmluZy0+Y19zdHIoKSwgInN0cnVjdCIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgICAgICQkLnNldEJhc2ljKEVidFN0cnVjdCwgRXZxVGVtcG9yYXJ5LCAkMS5saW5lKTsKKyAgICAgICAgJCQudXNlckRlZiA9IHN0cnVjdHVyZTsKKyAgICB9CisgICAgfCBTVFJVQ1QgTEVGVF9CUkFDRSBzdHJ1Y3RfZGVjbGFyYXRpb25fbGlzdCBSSUdIVF9CUkFDRSB7CisgICAgICAgIFRUeXBlKiBzdHJ1Y3R1cmUgPSBuZXcgVFR5cGUoJDMsIFRTdHJpbmcoIiIpKTsKKyAgICAgICAgJCQuc2V0QmFzaWMoRWJ0U3RydWN0LCBFdnFUZW1wb3JhcnksICQxLmxpbmUpOworICAgICAgICAkJC51c2VyRGVmID0gc3RydWN0dXJlOworICAgIH0KKyAgICA7CisKK3N0cnVjdF9kZWNsYXJhdGlvbl9saXN0CisgICAgOiBzdHJ1Y3RfZGVjbGFyYXRpb24geworICAgICAgICAkJCA9ICQxOworICAgIH0KKyAgICB8IHN0cnVjdF9kZWNsYXJhdGlvbl9saXN0IHN0cnVjdF9kZWNsYXJhdGlvbiB7CisgICAgICAgICQkID0gJDE7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgJDItPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8ICQkLT5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgIGlmICgoKiQkKVtqXS50eXBlLT5nZXRGaWVsZE5hbWUoKSA9PSAoKiQyKVtpXS50eXBlLT5nZXRGaWVsZE5hbWUoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoKiQyKVtpXS5saW5lLCAiZHVwbGljYXRlIGZpZWxkIG5hbWUgaW4gc3RydWN0dXJlOiIsICJzdHJ1Y3QiLCAoKiQyKVtpXS50eXBlLT5nZXRGaWVsZE5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICQkLT5wdXNoX2JhY2soKCokMilbaV0pOworICAgICAgICB9CisgICAgfQorICAgIDsKKworc3RydWN0X2RlY2xhcmF0aW9uCisgICAgOiB0eXBlX3NwZWNpZmllciBzdHJ1Y3RfZGVjbGFyYXRvcl9saXN0IFNFTUlDT0xPTiB7CisgICAgICAgICQkID0gJDI7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPnZvaWRFcnJvckNoZWNrKCQxLmxpbmUsICgqJDIpWzBdLnR5cGUtPmdldEZpZWxkTmFtZSgpLCAkMSkpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8ICQkLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENhcmVmdWwgbm90IHRvIHJlcGxhY2UgYWxyZWFkeSBrbm93biBhc3BlY3RzIG9mIHR5cGUsIGxpa2UgYXJyYXktbmVzcworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFRUeXBlKiB0eXBlID0gKCokJClbaV0udHlwZTsKKyAgICAgICAgICAgIHR5cGUtPnNldEJhc2ljVHlwZSgkMS50eXBlKTsKKyAgICAgICAgICAgIHR5cGUtPnNldE5vbWluYWxTaXplKCQxLnNpemUpOworICAgICAgICAgICAgdHlwZS0+c2V0TWF0cml4KCQxLm1hdHJpeCk7CisKKyAgICAgICAgICAgIC8vIGRvbid0IGFsbG93IGFycmF5cyBvZiBhcnJheXMKKyAgICAgICAgICAgIGlmICh0eXBlLT5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlUeXBlRXJyb3JDaGVjaygkMS5saW5lLCAkMSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkMS5hcnJheSkKKyAgICAgICAgICAgICAgICB0eXBlLT5zZXRBcnJheVNpemUoJDEuYXJyYXlTaXplKTsKKyAgICAgICAgICAgIGlmICgkMS51c2VyRGVmKSB7CisgICAgICAgICAgICAgICAgdHlwZS0+c2V0U3RydWN0KCQxLnVzZXJEZWYtPmdldFN0cnVjdCgpKTsKKyAgICAgICAgICAgICAgICB0eXBlLT5zZXRUeXBlTmFtZSgkMS51c2VyRGVmLT5nZXRUeXBlTmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICA7CisKK3N0cnVjdF9kZWNsYXJhdG9yX2xpc3QKKyAgICA6IHN0cnVjdF9kZWNsYXJhdG9yIHsKKyAgICAgICAgJCQgPSBOZXdQb29sVFR5cGVMaXN0KCk7CisgICAgICAgICQkLT5wdXNoX2JhY2soJDEpOworICAgIH0KKyAgICB8IHN0cnVjdF9kZWNsYXJhdG9yX2xpc3QgQ09NTUEgc3RydWN0X2RlY2xhcmF0b3IgeworICAgICAgICAkJC0+cHVzaF9iYWNrKCQzKTsKKyAgICB9CisgICAgOworCitzdHJ1Y3RfZGVjbGFyYXRvcgorICAgIDogSURFTlRJRklFUiB7CisgICAgICAgIGlmIChjb250ZXh0LT5yZXNlcnZlZEVycm9yQ2hlY2soJDEubGluZSwgKiQxLnN0cmluZykpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgJCQudHlwZSA9IG5ldyBUVHlwZShFYnRWb2lkLCBFYnBVbmRlZmluZWQpOworICAgICAgICAkJC5saW5lID0gJDEubGluZTsKKyAgICAgICAgJCQudHlwZS0+c2V0RmllbGROYW1lKCokMS5zdHJpbmcpOworICAgIH0KKyAgICB8IElERU5USUZJRVIgTEVGVF9CUkFDS0VUIGNvbnN0YW50X2V4cHJlc3Npb24gUklHSFRfQlJBQ0tFVCB7CisgICAgICAgIGlmIChjb250ZXh0LT5yZXNlcnZlZEVycm9yQ2hlY2soJDEubGluZSwgKiQxLnN0cmluZykpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgJCQudHlwZSA9IG5ldyBUVHlwZShFYnRWb2lkLCBFYnBVbmRlZmluZWQpOworICAgICAgICAkJC5saW5lID0gJDEubGluZTsKKyAgICAgICAgJCQudHlwZS0+c2V0RmllbGROYW1lKCokMS5zdHJpbmcpOworCisgICAgICAgIGludCBzaXplOworICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlTaXplRXJyb3JDaGVjaygkMi5saW5lLCAkMywgc2l6ZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICQkLnR5cGUtPnNldEFycmF5U2l6ZShzaXplKTsKKyAgICB9CisgICAgOworCitpbml0aWFsaXplcgorICAgIDogYXNzaWdubWVudF9leHByZXNzaW9uIHsgJCQgPSAkMTsgfQorICAgIDsKKworZGVjbGFyYXRpb25fc3RhdGVtZW50CisgICAgOiBkZWNsYXJhdGlvbiB7ICQkID0gJDE7IH0KKyAgICA7CisKK3N0YXRlbWVudAorICAgIDogY29tcG91bmRfc3RhdGVtZW50ICB7ICQkID0gJDE7IH0KKyAgICB8IHNpbXBsZV9zdGF0ZW1lbnQgICAgeyAkJCA9ICQxOyB9CisgICAgOworCisvLyBHcmFtbWFyIE5vdGU6ICBObyBsYWJlbGVkIHN0YXRlbWVudHM7ICdnb3RvJyBpcyBub3Qgc3VwcG9ydGVkLgorCitzaW1wbGVfc3RhdGVtZW50CisgICAgOiBkZWNsYXJhdGlvbl9zdGF0ZW1lbnQgeyAkJCA9ICQxOyB9CisgICAgfCBleHByZXNzaW9uX3N0YXRlbWVudCAgeyAkJCA9ICQxOyB9CisgICAgfCBzZWxlY3Rpb25fc3RhdGVtZW50ICAgeyAkJCA9ICQxOyB9CisgICAgfCBpdGVyYXRpb25fc3RhdGVtZW50ICAgeyAkJCA9ICQxOyB9CisgICAgfCBqdW1wX3N0YXRlbWVudCAgICAgICAgeyAkJCA9ICQxOyB9CisgICAgOworCitjb21wb3VuZF9zdGF0ZW1lbnQKKyAgICA6IExFRlRfQlJBQ0UgUklHSFRfQlJBQ0UgeyAkJCA9IDA7IH0KKyAgICB8IExFRlRfQlJBQ0UgeyBjb250ZXh0LT5zeW1ib2xUYWJsZS5wdXNoKCk7IH0gc3RhdGVtZW50X2xpc3QgeyBjb250ZXh0LT5zeW1ib2xUYWJsZS5wb3AoKTsgfSBSSUdIVF9CUkFDRSB7CisgICAgICAgIGlmICgkMyAhPSAwKSB7CisgICAgICAgICAgICAkMy0+c2V0T3AoRU9wU2VxdWVuY2UpOworICAgICAgICAgICAgJDMtPnNldEVuZExpbmUoJDUubGluZSk7CisgICAgICAgIH0KKyAgICAgICAgJCQgPSAkMzsKKyAgICB9CisgICAgOworCitzdGF0ZW1lbnRfbm9fbmV3X3Njb3BlCisgICAgOiBjb21wb3VuZF9zdGF0ZW1lbnRfbm9fbmV3X3Njb3BlIHsgJCQgPSAkMTsgfQorICAgIHwgc2ltcGxlX3N0YXRlbWVudCAgICAgICAgICAgICAgICB7ICQkID0gJDE7IH0KKyAgICA7CisKK2NvbXBvdW5kX3N0YXRlbWVudF9ub19uZXdfc2NvcGUKKyAgICAvLyBTdGF0ZW1lbnQgdGhhdCBkb2Vzbid0IGNyZWF0ZSBhIG5ldyBzY29wZSwgZm9yIHNlbGVjdGlvbl9zdGF0ZW1lbnQsIGl0ZXJhdGlvbl9zdGF0ZW1lbnQKKyAgICA6IExFRlRfQlJBQ0UgUklHSFRfQlJBQ0UgeworICAgICAgICAkJCA9IDA7CisgICAgfQorICAgIHwgTEVGVF9CUkFDRSBzdGF0ZW1lbnRfbGlzdCBSSUdIVF9CUkFDRSB7CisgICAgICAgIGlmICgkMikgeworICAgICAgICAgICAgJDItPnNldE9wKEVPcFNlcXVlbmNlKTsKKyAgICAgICAgICAgICQyLT5zZXRFbmRMaW5lKCQzLmxpbmUpOworICAgICAgICB9CisgICAgICAgICQkID0gJDI7CisgICAgfQorICAgIDsKKworc3RhdGVtZW50X2xpc3QKKyAgICA6IHN0YXRlbWVudCB7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLm1ha2VBZ2dyZWdhdGUoJDEsIDApOworICAgIH0KKyAgICB8IHN0YXRlbWVudF9saXN0IHN0YXRlbWVudCB7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUoJDEsICQyLCAwKTsKKyAgICB9CisgICAgOworCitleHByZXNzaW9uX3N0YXRlbWVudAorICAgIDogU0VNSUNPTE9OICB7ICQkID0gMDsgfQorICAgIHwgZXhwcmVzc2lvbiBTRU1JQ09MT04gIHsgJCQgPSBzdGF0aWNfY2FzdDxUSW50ZXJtTm9kZSo+KCQxKTsgfQorICAgIDsKKworc2VsZWN0aW9uX3N0YXRlbWVudAorICAgIDogSUYgTEVGVF9QQVJFTiBleHByZXNzaW9uIFJJR0hUX1BBUkVOIHNlbGVjdGlvbl9yZXN0X3N0YXRlbWVudCB7CisgICAgICAgIGlmIChjb250ZXh0LT5ib29sRXJyb3JDaGVjaygkMS5saW5lLCAkMykpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFNlbGVjdGlvbigkMywgJDUsICQxLmxpbmUpOworICAgIH0KKyAgICA7CisKK3NlbGVjdGlvbl9yZXN0X3N0YXRlbWVudAorICAgIDogc3RhdGVtZW50IEVMU0Ugc3RhdGVtZW50IHsKKyAgICAgICAgJCQubm9kZTEgPSAkMTsKKyAgICAgICAgJCQubm9kZTIgPSAkMzsKKyAgICB9CisgICAgfCBzdGF0ZW1lbnQgeworICAgICAgICAkJC5ub2RlMSA9ICQxOworICAgICAgICAkJC5ub2RlMiA9IDA7CisgICAgfQorICAgIDsKKworLy8gR3JhbW1hciBOb3RlOiAgTm8gJ3N3aXRjaCcuICBTd2l0Y2ggc3RhdGVtZW50cyBub3Qgc3VwcG9ydGVkLgorCitjb25kaXRpb24KKyAgICAvLyBJbiAxOTk2IGMrKyBkcmFmdCwgY29uZGl0aW9ucyBjYW4gaW5jbHVkZSBzaW5nbGUgZGVjbGFyYXRpb25zCisgICAgOiBleHByZXNzaW9uIHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgaWYgKGNvbnRleHQtPmJvb2xFcnJvckNoZWNrKCQxLT5nZXRMaW5lKCksICQxKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICB9CisgICAgfCBmdWxseV9zcGVjaWZpZWRfdHlwZSBJREVOVElGSUVSIEVRVUFMIGluaXRpYWxpemVyIHsKKyAgICAgICAgVEludGVybU5vZGUqIGludGVybU5vZGU7CisgICAgICAgIGlmIChjb250ZXh0LT5zdHJ1Y3RRdWFsaWZpZXJFcnJvckNoZWNrKCQyLmxpbmUsICQxKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgaWYgKGNvbnRleHQtPmJvb2xFcnJvckNoZWNrKCQyLmxpbmUsICQxKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKworICAgICAgICBpZiAoIWNvbnRleHQtPmV4ZWN1dGVJbml0aWFsaXplcigkMi5saW5lLCAqJDIuc3RyaW5nLCAkMSwgJDQsIGludGVybU5vZGUpKQorICAgICAgICAgICAgJCQgPSAkNDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAkJCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgOworCitpdGVyYXRpb25fc3RhdGVtZW50CisgICAgOiBXSElMRSBMRUZUX1BBUkVOIHsgY29udGV4dC0+c3ltYm9sVGFibGUucHVzaCgpOyArK2NvbnRleHQtPmxvb3BOZXN0aW5nTGV2ZWw7IH0gY29uZGl0aW9uIFJJR0hUX1BBUkVOIHN0YXRlbWVudF9ub19uZXdfc2NvcGUgeworICAgICAgICBjb250ZXh0LT5zeW1ib2xUYWJsZS5wb3AoKTsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkTG9vcChFTG9vcFdoaWxlLCAwLCAkNCwgMCwgJDYsICQxLmxpbmUpOworICAgICAgICAtLWNvbnRleHQtPmxvb3BOZXN0aW5nTGV2ZWw7CisgICAgfQorICAgIHwgRE8geyArK2NvbnRleHQtPmxvb3BOZXN0aW5nTGV2ZWw7IH0gc3RhdGVtZW50IFdISUxFIExFRlRfUEFSRU4gZXhwcmVzc2lvbiBSSUdIVF9QQVJFTiBTRU1JQ09MT04geworICAgICAgICBpZiAoY29udGV4dC0+Ym9vbEVycm9yQ2hlY2soJDgubGluZSwgJDYpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZExvb3AoRUxvb3BEb1doaWxlLCAwLCAkNiwgMCwgJDMsICQ0LmxpbmUpOworICAgICAgICAtLWNvbnRleHQtPmxvb3BOZXN0aW5nTGV2ZWw7CisgICAgfQorICAgIHwgRk9SIExFRlRfUEFSRU4geyBjb250ZXh0LT5zeW1ib2xUYWJsZS5wdXNoKCk7ICsrY29udGV4dC0+bG9vcE5lc3RpbmdMZXZlbDsgfSBmb3JfaW5pdF9zdGF0ZW1lbnQgZm9yX3Jlc3Rfc3RhdGVtZW50IFJJR0hUX1BBUkVOIHN0YXRlbWVudF9ub19uZXdfc2NvcGUgeworICAgICAgICBjb250ZXh0LT5zeW1ib2xUYWJsZS5wb3AoKTsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkTG9vcChFTG9vcEZvciwgJDQsIHJlaW50ZXJwcmV0X2Nhc3Q8VEludGVybVR5cGVkKj4oJDUubm9kZTEpLCByZWludGVycHJldF9jYXN0PFRJbnRlcm1UeXBlZCo+KCQ1Lm5vZGUyKSwgJDcsICQxLmxpbmUpOworICAgICAgICAtLWNvbnRleHQtPmxvb3BOZXN0aW5nTGV2ZWw7CisgICAgfQorICAgIDsKKworZm9yX2luaXRfc3RhdGVtZW50CisgICAgOiBleHByZXNzaW9uX3N0YXRlbWVudCB7CisgICAgICAgICQkID0gJDE7CisgICAgfQorICAgIHwgZGVjbGFyYXRpb25fc3RhdGVtZW50IHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICB9CisgICAgOworCitjb25kaXRpb25vcHQKKyAgICA6IGNvbmRpdGlvbiB7CisgICAgICAgICQkID0gJDE7CisgICAgfQorICAgIHwgLyogTWF5IGJlIG51bGwgKi8geworICAgICAgICAkJCA9IDA7CisgICAgfQorICAgIDsKKworZm9yX3Jlc3Rfc3RhdGVtZW50CisgICAgOiBjb25kaXRpb25vcHQgU0VNSUNPTE9OIHsKKyAgICAgICAgJCQubm9kZTEgPSAkMTsKKyAgICAgICAgJCQubm9kZTIgPSAwOworICAgIH0KKyAgICB8IGNvbmRpdGlvbm9wdCBTRU1JQ09MT04gZXhwcmVzc2lvbiAgeworICAgICAgICAkJC5ub2RlMSA9ICQxOworICAgICAgICAkJC5ub2RlMiA9ICQzOworICAgIH0KKyAgICA7CisKK2p1bXBfc3RhdGVtZW50CisgICAgOiBDT05USU5VRSBTRU1JQ09MT04geworICAgICAgICBpZiAoY29udGV4dC0+bG9vcE5lc3RpbmdMZXZlbCA8PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMS5saW5lLCAiY29udGludWUgc3RhdGVtZW50IG9ubHkgYWxsb3dlZCBpbiBsb29wcyIsICIiLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQnJhbmNoKEVPcENvbnRpbnVlLCAkMS5saW5lKTsKKyAgICB9CisgICAgfCBCUkVBSyBTRU1JQ09MT04geworICAgICAgICBpZiAoY29udGV4dC0+bG9vcE5lc3RpbmdMZXZlbCA8PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMS5saW5lLCAiYnJlYWsgc3RhdGVtZW50IG9ubHkgYWxsb3dlZCBpbiBsb29wcyIsICIiLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQnJhbmNoKEVPcEJyZWFrLCAkMS5saW5lKTsKKyAgICB9CisgICAgfCBSRVRVUk4gU0VNSUNPTE9OIHsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQnJhbmNoKEVPcFJldHVybiwgJDEubGluZSk7CisgICAgICAgIGlmIChjb250ZXh0LT5jdXJyZW50RnVuY3Rpb25UeXBlLT5nZXRCYXNpY1R5cGUoKSAhPSBFYnRWb2lkKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMS5saW5lLCAibm9uLXZvaWQgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSB2YWx1ZSIsICJyZXR1cm4iLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgfCBSRVRVUk4gZXhwcmVzc2lvbiBTRU1JQ09MT04geworICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRCcmFuY2goRU9wUmV0dXJuLCAkMiwgJDEubGluZSk7CisgICAgICAgIGNvbnRleHQtPmZ1bmN0aW9uUmV0dXJuc1ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgaWYgKGNvbnRleHQtPmN1cnJlbnRGdW5jdGlvblR5cGUtPmdldEJhc2ljVHlwZSgpID09IEVidFZvaWQpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQxLmxpbmUsICJ2b2lkIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYSB2YWx1ZSIsICJyZXR1cm4iLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0gZWxzZSBpZiAoKihjb250ZXh0LT5jdXJyZW50RnVuY3Rpb25UeXBlKSAhPSAkMi0+Z2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMS5saW5lLCAiZnVuY3Rpb24gcmV0dXJuIGlzIG5vdCBtYXRjaGluZyB0eXBlOiIsICJyZXR1cm4iLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgfCBESVNDQVJEIFNFTUlDT0xPTiB7CisgICAgICAgIEZSQUdfT05MWSgiZGlzY2FyZCIsICQxLmxpbmUpOworICAgICAgICAkJCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRCcmFuY2goRU9wS2lsbCwgJDEubGluZSk7CisgICAgfQorICAgIDsKKworLy8gR3JhbW1hciBOb3RlOiAgTm8gJ2dvdG8nLiAgR290b3MgYXJlIG5vdCBzdXBwb3J0ZWQuCisKK3RyYW5zbGF0aW9uX3VuaXQKKyAgICA6IGV4dGVybmFsX2RlY2xhcmF0aW9uIHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICAgICAgY29udGV4dC0+dHJlZVJvb3QgPSAkJDsKKyAgICB9CisgICAgfCB0cmFuc2xhdGlvbl91bml0IGV4dGVybmFsX2RlY2xhcmF0aW9uIHsKKyAgICAgICAgJCQgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuZ3Jvd0FnZ3JlZ2F0ZSgkMSwgJDIsIDApOworICAgICAgICBjb250ZXh0LT50cmVlUm9vdCA9ICQkOworICAgIH0KKyAgICA7CisKK2V4dGVybmFsX2RlY2xhcmF0aW9uCisgICAgOiBmdW5jdGlvbl9kZWZpbml0aW9uIHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICB9CisgICAgfCBkZWNsYXJhdGlvbiB7CisgICAgICAgICQkID0gJDE7CisgICAgfQorICAgIDsKKworZnVuY3Rpb25fZGVmaW5pdGlvbgorICAgIDogZnVuY3Rpb25fcHJvdG90eXBlIHsKKyAgICAgICAgVEZ1bmN0aW9uKiBmdW5jdGlvbiA9ICQxLmZ1bmN0aW9uOworICAgICAgICBURnVuY3Rpb24qIHByZXZEZWMgPSBzdGF0aWNfY2FzdDxURnVuY3Rpb24qPihjb250ZXh0LT5zeW1ib2xUYWJsZS5maW5kKGZ1bmN0aW9uLT5nZXRNYW5nbGVkTmFtZSgpKSk7CisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGU6ICAncHJldkRlYycgY291bGQgYmUgJ2Z1bmN0aW9uJyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gZnVuY3Rpb24KKyAgICAgICAgLy8gYXMgaXQgd291bGQgaGF2ZSBqdXN0IGJlZW4gcHV0IGluIHRoZSBzeW1ib2wgdGFibGUuICBPdGhlcndpc2UsIHdlJ3JlIGxvb2tpbmcgdXAKKyAgICAgICAgLy8gYW4gZWFybGllciBvY2N1cmFuY2UuCisgICAgICAgIC8vCisgICAgICAgIGlmIChwcmV2RGVjLT5pc0RlZmluZWQoKSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoZW4gdGhpcyBmdW5jdGlvbiBhbHJlYWR5IGhhcyBhIGJvZHkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDEubGluZSwgImZ1bmN0aW9uIGFscmVhZHkgaGFzIGEgYm9keSIsIGZ1bmN0aW9uLT5nZXROYW1lKCkuY19zdHIoKSwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgICAgIHByZXZEZWMtPnNldERlZmluZWQoKTsKKworICAgICAgICAvLworICAgICAgICAvLyBSYWlzZSBlcnJvciBtZXNzYWdlIGlmIG1haW4gZnVuY3Rpb24gdGFrZXMgYW55IHBhcmFtZXRlcnMgb3IgcmV0dXJuIGFueXRoaW5nIG90aGVyIHRoYW4gdm9pZAorICAgICAgICAvLworICAgICAgICBpZiAoZnVuY3Rpb24tPmdldE5hbWUoKSA9PSAibWFpbiIpIHsKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbi0+Z2V0UGFyYW1Db3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQxLmxpbmUsICJmdW5jdGlvbiBjYW5ub3QgdGFrZSBhbnkgcGFyYW1ldGVyKHMpIiwgZnVuY3Rpb24tPmdldE5hbWUoKS5jX3N0cigpLCAiIik7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZ1bmN0aW9uLT5nZXRSZXR1cm5UeXBlKCkuZ2V0QmFzaWNUeXBlKCkgIT0gRWJ0Vm9pZCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCQxLmxpbmUsICIiLCBmdW5jdGlvbi0+Z2V0UmV0dXJuVHlwZSgpLmdldEJhc2ljU3RyaW5nKCksICJtYWluIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYSB2YWx1ZSIpOworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIE5ldyBzeW1ib2wgdGFibGUgc2NvcGUgZm9yIGJvZHkgb2YgZnVuY3Rpb24gcGx1cyBpdHMgYXJndW1lbnRzCisgICAgICAgIC8vCisgICAgICAgIGNvbnRleHQtPnN5bWJvbFRhYmxlLnB1c2goKTsKKworICAgICAgICAvLworICAgICAgICAvLyBSZW1lbWJlciB0aGUgcmV0dXJuIHR5cGUgZm9yIGxhdGVyIGNoZWNraW5nIGZvciBSRVRVUk4gc3RhdGVtZW50cy4KKyAgICAgICAgLy8KKyAgICAgICAgY29udGV4dC0+Y3VycmVudEZ1bmN0aW9uVHlwZSA9ICYocHJldkRlYy0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgY29udGV4dC0+ZnVuY3Rpb25SZXR1cm5zVmFsdWUgPSBmYWxzZTsKKworICAgICAgICAvLworICAgICAgICAvLyBJbnNlcnQgcGFyYW1ldGVycyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCisgICAgICAgIC8vIElmIHRoZSBwYXJhbWV0ZXIgaGFzIG5vIG5hbWUsIGl0J3Mgbm90IGFuIGVycm9yLCBqdXN0IGRvbid0IGluc2VydCBpdAorICAgICAgICAvLyAoY291bGQgYmUgdXNlZCBmb3IgdW51c2VkIGFyZ3MpLgorICAgICAgICAvLworICAgICAgICAvLyBBbHNvLCBhY2N1bXVsYXRlIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgaW50byB0aGUgSElMLCBzbyBsb3dlciBsZXZlbCBjb2RlCisgICAgICAgIC8vIGtub3dzIHdoZXJlIHRvIGZpbmQgcGFyYW1ldGVycy4KKyAgICAgICAgLy8KKyAgICAgICAgVEludGVybUFnZ3JlZ2F0ZSogcGFyYW1Ob2RlcyA9IG5ldyBUSW50ZXJtQWdncmVnYXRlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLT5nZXRQYXJhbUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgVFBhcmFtZXRlciYgcGFyYW0gPSBmdW5jdGlvbi0+Z2V0UGFyYW0oaSk7CisgICAgICAgICAgICBpZiAocGFyYW0ubmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgVFZhcmlhYmxlICp2YXJpYWJsZSA9IG5ldyBUVmFyaWFibGUocGFyYW0ubmFtZSwgKnBhcmFtLnR5cGUpOworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBwYXJhbWV0ZXJzIHdpdGggbmFtZSBpbiB0aGUgc3ltYm9sIHRhYmxlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKCEgY29udGV4dC0+c3ltYm9sVGFibGUuaW5zZXJ0KCp2YXJpYWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoJDEubGluZSwgInJlZGVmaW5pdGlvbiIsIHZhcmlhYmxlLT5nZXROYW1lKCkuY19zdHIoKSwgIiIpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YXJpYWJsZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcGFyYW1ldGVyIHRvIHRoZSBISUwKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHBhcmFtTm9kZXMgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuZ3Jvd0FnZ3JlZ2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1Ob2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFN5bWJvbCh2YXJpYWJsZS0+Z2V0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUtPmdldFR5cGUoKSwgJDEubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxLmxpbmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbU5vZGVzID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUocGFyYW1Ob2RlcywgY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFN5bWJvbCgwLCAiIiwgKnBhcmFtLnR5cGUsICQxLmxpbmUpLCAkMS5saW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb250ZXh0LT5pbnRlcm1lZGlhdGUuc2V0QWdncmVnYXRlT3BlcmF0b3IocGFyYW1Ob2RlcywgRU9wUGFyYW1ldGVycywgJDEubGluZSk7CisgICAgICAgICQxLmludGVybUFnZ3JlZ2F0ZSA9IHBhcmFtTm9kZXM7CisgICAgICAgIGNvbnRleHQtPmxvb3BOZXN0aW5nTGV2ZWwgPSAwOworICAgIH0KKyAgICBjb21wb3VuZF9zdGF0ZW1lbnRfbm9fbmV3X3Njb3BlIHsKKyAgICAgICAgLy8/PyBDaGVjayB0aGF0IGFsbCBwYXRocyByZXR1cm4gYSB2YWx1ZSBpZiByZXR1cm4gdHlwZSAhPSB2b2lkID8KKyAgICAgICAgLy8gICBNYXkgYmUgYmVzdCBkb25lIGFzIHBvc3QgcHJvY2VzcyBwaGFzZSBvbiBpbnRlcm1lZGlhdGUgY29kZQorICAgICAgICBpZiAoY29udGV4dC0+Y3VycmVudEZ1bmN0aW9uVHlwZS0+Z2V0QmFzaWNUeXBlKCkgIT0gRWJ0Vm9pZCAmJiAhIGNvbnRleHQtPmZ1bmN0aW9uUmV0dXJuc1ZhbHVlKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigkMS5saW5lLCAiZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWU6IiwgIiIsICQxLmZ1bmN0aW9uLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgY29udGV4dC0+c3ltYm9sVGFibGUucG9wKCk7CisgICAgICAgICQkID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUoJDEuaW50ZXJtQWdncmVnYXRlLCAkMywgMCk7CisgICAgICAgIGNvbnRleHQtPmludGVybWVkaWF0ZS5zZXRBZ2dyZWdhdGVPcGVyYXRvcigkJCwgRU9wRnVuY3Rpb24sICQxLmxpbmUpOworICAgICAgICAkJC0+Z2V0QXNBZ2dyZWdhdGUoKS0+c2V0TmFtZSgkMS5mdW5jdGlvbi0+Z2V0TWFuZ2xlZE5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgJCQtPmdldEFzQWdncmVnYXRlKCktPnNldFR5cGUoJDEuZnVuY3Rpb24tPmdldFJldHVyblR5cGUoKSk7CisKKyAgICAgICAgLy8gc3RvcmUgdGhlIHByYWdtYSBpbmZvcm1hdGlvbiBmb3IgZGVidWcgYW5kIG9wdGltaXplIGFuZCBvdGhlciB2ZW5kb3Igc3BlY2lmaWMKKyAgICAgICAgLy8gaW5mb3JtYXRpb24uIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHF1ZXJpZWQgZnJvbSB0aGUgcGFyc2UgdHJlZQorICAgICAgICAkJC0+Z2V0QXNBZ2dyZWdhdGUoKS0+c2V0T3B0aW1pemUoY29udGV4dC0+Y29udGV4dFByYWdtYS5vcHRpbWl6ZSk7CisgICAgICAgICQkLT5nZXRBc0FnZ3JlZ2F0ZSgpLT5zZXREZWJ1Zyhjb250ZXh0LT5jb250ZXh0UHJhZ21hLmRlYnVnKTsKKyAgICAgICAgJCQtPmdldEFzQWdncmVnYXRlKCktPmFkZFRvUHJhZ21hVGFibGUoY29udGV4dC0+Y29udGV4dFByYWdtYS5wcmFnbWFUYWJsZSk7CisKKyAgICAgICAgaWYgKCQzICYmICQzLT5nZXRBc0FnZ3JlZ2F0ZSgpKQorICAgICAgICAgICAgJCQtPmdldEFzQWdncmVnYXRlKCktPnNldEVuZExpbmUoJDMtPmdldEFzQWdncmVnYXRlKCktPmdldEVuZExpbmUoKSk7CisgICAgfQorICAgIDsKKworJSUKKworaW50IGdsc2xhbmdfcGFyc2UoVFBhcnNlQ29udGV4dCogY29udGV4dCkgeworICAgIHJldHVybiB5eXBhcnNlKGNvbnRleHQpOworfQorCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nbHNsYW5nX2xleC5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nbHNsYW5nX2xleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1ZjUzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2dsc2xhbmdfbGV4LmNwcApAQCAtMCwwICsxLDMxODYgQEAKKyNsaW5lIDE3ICJjb21waWxlci9nbHNsYW5nLmwiCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlX2dsc2xhbmdfbGV4ZXIuc2guIERPIE5PVCBFRElUIQorCisKKworI2xpbmUgMTMgImNvbXBpbGVyL2dsc2xhbmdfbGV4LmNwcCIKKworI2RlZmluZSAgWVlfSU5UX0FMSUdORUQgc2hvcnQgaW50CisKKy8qIEEgbGV4aWNhbCBzY2FubmVyIGdlbmVyYXRlZCBieSBmbGV4ICovCisKKyNkZWZpbmUgRkxFWF9TQ0FOTkVSCisjZGVmaW5lIFlZX0ZMRVhfTUFKT1JfVkVSU0lPTiAyCisjZGVmaW5lIFlZX0ZMRVhfTUlOT1JfVkVSU0lPTiA1CisjZGVmaW5lIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiAzNQorI2lmIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiA+IDAKKyNkZWZpbmUgRkxFWF9CRVRBCisjZW5kaWYKKworLyogRmlyc3QsIHdlIGRlYWwgd2l0aCAgcGxhdGZvcm0tc3BlY2lmaWMgb3IgY29tcGlsZXItc3BlY2lmaWMgaXNzdWVzLiAqLworCisvKiBiZWdpbiBzdGFuZGFyZCBDIGhlYWRlcnMuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBlbmQgc3RhbmRhcmQgQyBoZWFkZXJzLiAqLworCisvKiBmbGV4IGludGVnZXIgdHlwZSBkZWZpbml0aW9ucyAqLworCisjaWZuZGVmIEZMRVhJTlRfSAorI2RlZmluZSBGTEVYSU5UX0gKKworLyogQzk5IHN5c3RlbXMgaGF2ZSA8aW50dHlwZXMuaD4uIE5vbi1DOTkgc3lzdGVtcyBtYXkgb3IgbWF5IG5vdC4gKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorCisvKiBDOTkgc2F5cyB0byBkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyBiZWZvcmUgaW5jbHVkaW5nIHN0ZGludC5oLAorICogaWYgeW91IHdhbnQgdGhlIGxpbWl0IChtYXgvbWluKSBtYWNyb3MgZm9yIGludCB0eXBlcy4gCisgKi8KKyNpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KK3R5cGVkZWYgaW50OF90IGZsZXhfaW50OF90OwordHlwZWRlZiB1aW50OF90IGZsZXhfdWludDhfdDsKK3R5cGVkZWYgaW50MTZfdCBmbGV4X2ludDE2X3Q7Cit0eXBlZGVmIHVpbnQxNl90IGZsZXhfdWludDE2X3Q7Cit0eXBlZGVmIGludDMyX3QgZmxleF9pbnQzMl90OwordHlwZWRlZiB1aW50MzJfdCBmbGV4X3VpbnQzMl90OworI2Vsc2UKK3R5cGVkZWYgc2lnbmVkIGNoYXIgZmxleF9pbnQ4X3Q7Cit0eXBlZGVmIHNob3J0IGludCBmbGV4X2ludDE2X3Q7Cit0eXBlZGVmIGludCBmbGV4X2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgZmxleF91aW50OF90OyAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGZsZXhfdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBmbGV4X3VpbnQzMl90OworI2VuZGlmIC8qICEgQzk5ICovCisKKy8qIExpbWl0cyBvZiBpbnRlZ3JhbCB0eXBlcy4gKi8KKyNpZm5kZWYgSU5UOF9NSU4KKyNkZWZpbmUgSU5UOF9NSU4gICAgICAgICAgICAgICAoLTEyOCkKKyNlbmRpZgorI2lmbmRlZiBJTlQxNl9NSU4KKyNkZWZpbmUgSU5UMTZfTUlOICAgICAgICAgICAgICAoLTMyNzY3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUlOCisjZGVmaW5lIElOVDMyX01JTiAgICAgICAgICAgICAgKC0yMTQ3NDgzNjQ3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UOF9NQVgKKyNkZWZpbmUgSU5UOF9NQVggICAgICAgICAgICAgICAoMTI3KQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01BWAorI2RlZmluZSBJTlQxNl9NQVggICAgICAgICAgICAgICgzMjc2NykKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYICAgICAgICAgICAgICAoMjE0NzQ4MzY0NykKKyNlbmRpZgorI2lmbmRlZiBVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVDhfTUFYICAgICAgICAgICAgICAoMjU1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlQxNl9NQVggICAgICAgICAgICAgKDY1NTM1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlQzMl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVKQorI2VuZGlmCisKKyNlbmRpZiAvKiAhIEZMRVhJTlRfSCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKworLyogVGhlICJjb25zdCIgc3RvcmFnZS1jbGFzcy1tb2RpZmllciBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbHNlCS8qICEgX19jcGx1c3BsdXMgKi8KKworLyogQzk5IHJlcXVpcmVzIF9fU1REQ19fIHRvIGJlIGRlZmluZWQgYXMgMS4gKi8KKyNpZiBkZWZpbmVkIChfX1NURENfXykKKworI2RlZmluZSBZWV9VU0VfQ09OU1QKKworI2VuZGlmCS8qIGRlZmluZWQgKF9fU1REQ19fKSAqLworI2VuZGlmCS8qICEgX19jcGx1c3BsdXMgKi8KKworI2lmZGVmIFlZX1VTRV9DT05TVAorI2RlZmluZSB5eWNvbnN0IGNvbnN0CisjZWxzZQorI2RlZmluZSB5eWNvbnN0CisjZW5kaWYKKworLyogUmV0dXJuZWQgdXBvbiBlbmQtb2YtZmlsZS4gKi8KKyNkZWZpbmUgWVlfTlVMTCAwCisKKy8qIFByb21vdGVzIGEgcG9zc2libHkgbmVnYXRpdmUsIHBvc3NpYmx5IHNpZ25lZCBjaGFyIHRvIGFuIHVuc2lnbmVkCisgKiBpbnRlZ2VyIGZvciB1c2UgYXMgYW4gYXJyYXkgaW5kZXguICBJZiB0aGUgc2lnbmVkIGNoYXIgaXMgbmVnYXRpdmUsCisgKiB3ZSB3YW50IHRvIGluc3RlYWQgdHJlYXQgaXQgYXMgYW4gOC1iaXQgdW5zaWduZWQgY2hhciwgaGVuY2UgdGhlCisgKiBkb3VibGUgY2FzdC4KKyAqLworI2RlZmluZSBZWV9TQ19UT19VSShjKSAoKHVuc2lnbmVkIGludCkgKHVuc2lnbmVkIGNoYXIpIGMpCisKKy8qIEFuIG9wYXF1ZSBwb2ludGVyLiAqLworI2lmbmRlZiBZWV9UWVBFREVGX1lZX1NDQU5ORVJfVAorI2RlZmluZSBZWV9UWVBFREVGX1lZX1NDQU5ORVJfVAordHlwZWRlZiB2b2lkKiB5eXNjYW5fdDsKKyNlbmRpZgorCisvKiBGb3IgY29udmVuaWVuY2UsIHRoZXNlIHZhcnMgKHBsdXMgdGhlIGJpc29uIHZhcnMgZmFyIGJlbG93KQorICAgYXJlIG1hY3JvcyBpbiB0aGUgcmVlbnRyYW50IHNjYW5uZXIuICovCisjZGVmaW5lIHl5aW4geXlnLT55eWluX3IKKyNkZWZpbmUgeXlvdXQgeXlnLT55eW91dF9yCisjZGVmaW5lIHl5ZXh0cmEgeXlnLT55eWV4dHJhX3IKKyNkZWZpbmUgeXlsZW5nIHl5Zy0+eXlsZW5nX3IKKyNkZWZpbmUgeXl0ZXh0IHl5Zy0+eXl0ZXh0X3IKKyNkZWZpbmUgeXlsaW5lbm8gKFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnNfbGluZW5vKQorI2RlZmluZSB5eWNvbHVtbiAoWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9ic19jb2x1bW4pCisjZGVmaW5lIHl5X2ZsZXhfZGVidWcgeXlnLT55eV9mbGV4X2RlYnVnX3IKKworLyogRW50ZXIgYSBzdGFydCBjb25kaXRpb24uICBUaGlzIG1hY3JvIHJlYWxseSBvdWdodCB0byB0YWtlIGEgcGFyYW1ldGVyLAorICogYnV0IHdlIGRvIGl0IHRoZSBkaXNndXN0aW5nIGNydWZ0eSB3YXkgZm9yY2VkIG9uIHVzIGJ5IHRoZSAoKS1sZXNzCisgKiBkZWZpbml0aW9uIG9mIEJFR0lOLgorICovCisjZGVmaW5lIEJFR0lOIHl5Zy0+eXlfc3RhcnQgPSAxICsgMiAqCisKKy8qIFRyYW5zbGF0ZSB0aGUgY3VycmVudCBzdGFydCBzdGF0ZSBpbnRvIGEgdmFsdWUgdGhhdCBjYW4gYmUgbGF0ZXIgaGFuZGVkCisgKiB0byBCRUdJTiB0byByZXR1cm4gdG8gdGhlIHN0YXRlLiAgVGhlIFlZU1RBVEUgYWxpYXMgaXMgZm9yIGxleAorICogY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBZWV9TVEFSVCAoKHl5Zy0+eXlfc3RhcnQgLSAxKSAvIDIpCisjZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKKworLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KKyNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKKworLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KKyNkZWZpbmUgWVlfTkVXX0ZJTEUgeXlyZXN0YXJ0KHl5aW4gLHl5c2Nhbm5lciApCisKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUl9DSEFSIDAKKworLyogU2l6ZSBvZiBkZWZhdWx0IGlucHV0IGJ1ZmZlci4gKi8KKyNpZm5kZWYgWVlfQlVGX1NJWkUKKyNkZWZpbmUgWVlfQlVGX1NJWkUgMTYzODQKKyNlbmRpZgorCisvKiBUaGUgc3RhdGUgYnVmIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb25lIHN0YXRlIHBlciBjaGFyYWN0ZXIgaW4gdGhlIG1haW4gYnVmZmVyLgorICovCisjZGVmaW5lIFlZX1NUQVRFX0JVRl9TSVpFICAgKChZWV9CVUZfU0laRSArIDIpICogc2l6ZW9mKHl5X3N0YXRlX3R5cGUpKQorCisjaWZuZGVmIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCisjZGVmaW5lIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCit0eXBlZGVmIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKllZX0JVRkZFUl9TVEFURTsKKyNlbmRpZgorCisjZGVmaW5lIEVPQl9BQ1RfQ09OVElOVUVfU0NBTiAwCisjZGVmaW5lIEVPQl9BQ1RfRU5EX09GX0ZJTEUgMQorI2RlZmluZSBFT0JfQUNUX0xBU1RfTUFUQ0ggMgorCisgICAgLyogTm90ZTogV2Ugc3BlY2lmaWNhbGx5IG9taXQgdGhlIHRlc3QgZm9yIHl5X3J1bGVfY2FuX21hdGNoX2VvbCBiZWNhdXNlIGl0IHJlcXVpcmVzCisgICAgICogICAgICAgYWNjZXNzIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB5eV9hY3QuIFNpbmNlIHl5bGVzcygpIGlzIGEgbWFjcm8sIGl0IHdvdWxkIGJyZWFrCisgICAgICogICAgICAgZXhpc3Rpbmcgc2Nhbm5lcnMgdGhhdCBjYWxsIHl5bGVzcygpIGZyb20gT1VUU0lERSB5eWxleC4gCisgICAgICogICAgICAgT25lIG9idmlvdXMgc29sdXRpb24gaXQgdG8gbWFrZSB5eV9hY3QgYSBnbG9iYWwuIEkgdHJpZWQgdGhhdCwgYW5kIHNhdworICAgICAqICAgICAgIGEgNSUgcGVyZm9ybWFuY2UgaGl0IGluIGEgbm9uLXl5bGluZW5vIHNjYW5uZXIsIGJlY2F1c2UgeXlfYWN0IGlzCisgICAgICogICAgICAgbm9ybWFsbHkgZGVjbGFyZWQgYXMgYSByZWdpc3RlciB2YXJpYWJsZS0tIHNvIGl0IGlzIG5vdCB3b3J0aCBpdC4KKyAgICAgKi8KKyAgICAjZGVmaW5lICBZWV9MRVNTX0xJTkVOTyhuKSBcCisgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICBpbnQgeXlsO1wKKyAgICAgICAgICAgICAgICBmb3IgKCB5eWwgPSBuOyB5eWwgPCB5eWxlbmc7ICsreXlsIClcCisgICAgICAgICAgICAgICAgICAgIGlmICggeXl0ZXh0W3l5bF0gPT0gJ1xuJyApXAorICAgICAgICAgICAgICAgICAgICAgICAgLS15eWxpbmVubztcCisgICAgICAgICAgICB9d2hpbGUoMCkKKyAgICAKKy8qIFJldHVybiBhbGwgYnV0IHRoZSBmaXJzdCAibiIgbWF0Y2hlZCBjaGFyYWN0ZXJzIGJhY2sgdG8gdGhlIGlucHV0IHN0cmVhbS4gKi8KKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB5eXRleHQuICovIFwKKyAgICAgICAgaW50IHl5bGVzc19tYWNyb19hcmcgPSAobik7IFwKKyAgICAgICAgWVlfTEVTU19MSU5FTk8oeXlsZXNzX21hY3JvX2FyZyk7XAorCQkqeXlfY3AgPSB5eWctPnl5X2hvbGRfY2hhcjsgXAorCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUIFwKKwkJeXlnLT55eV9jX2J1Zl9wID0geXlfY3AgPSB5eV9icCArIHl5bGVzc19tYWNyb19hcmcgLSBZWV9NT1JFX0FESjsgXAorCQlZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgeXl0ZXh0IGFnYWluICovIFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworI2RlZmluZSB1bnB1dChjKSB5eXVucHV0KCBjLCB5eWctPnl5dGV4dF9wdHIgLCB5eXNjYW5uZXIgKQorCisjaWZuZGVmIFlZX1RZUEVERUZfWVlfU0laRV9UCisjZGVmaW5lIFlZX1RZUEVERUZfWVlfU0laRV9UCit0eXBlZGVmIHNpemVfdCB5eV9zaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCisjZGVmaW5lIFlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUKK3N0cnVjdCB5eV9idWZmZXJfc3RhdGUKKwl7CisJRklMRSAqeXlfaW5wdXRfZmlsZTsKKworCWNoYXIgKnl5X2NoX2J1ZjsJCS8qIGlucHV0IGJ1ZmZlciAqLworCWNoYXIgKnl5X2J1Zl9wb3M7CQkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IGJ1ZmZlciAqLworCisJLyogU2l6ZSBvZiBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG5vdCBpbmNsdWRpbmcgcm9vbSBmb3IgRU9CCisJICogY2hhcmFjdGVycy4KKwkgKi8KKwl5eV9zaXplX3QgeXlfYnVmX3NpemU7CisKKwkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGludG8geXlfY2hfYnVmLCBub3QgaW5jbHVkaW5nIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJaW50IHl5X25fY2hhcnM7CisKKwkvKiBXaGV0aGVyIHdlICJvd24iIHRoZSBidWZmZXIgLSBpLmUuLCB3ZSBrbm93IHdlIGNyZWF0ZWQgaXQsCisJICogYW5kIGNhbiByZWFsbG9jKCkgaXQgdG8gZ3JvdyBpdCwgYW5kIHNob3VsZCBmcmVlKCkgaXQgdG8KKwkgKiBkZWxldGUgaXQuCisJICovCisJaW50IHl5X2lzX291cl9idWZmZXI7CisKKwkvKiBXaGV0aGVyIHRoaXMgaXMgYW4gImludGVyYWN0aXZlIiBpbnB1dCBzb3VyY2U7IGlmIHNvLCBhbmQKKwkgKiBpZiB3ZSdyZSB1c2luZyBzdGRpbyBmb3IgaW5wdXQsIHRoZW4gd2Ugd2FudCB0byB1c2UgZ2V0YygpCisJICogaW5zdGVhZCBvZiBmcmVhZCgpLCB0byBtYWtlIHN1cmUgd2Ugc3RvcCBmZXRjaGluZyBpbnB1dCBhZnRlcgorCSAqIGVhY2ggbmV3bGluZS4KKwkgKi8KKwlpbnQgeXlfaXNfaW50ZXJhY3RpdmU7CisKKwkvKiBXaGV0aGVyIHdlJ3JlIGNvbnNpZGVyZWQgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCisJICogSWYgc28sICdeJyBydWxlcyB3aWxsIGJlIGFjdGl2ZSBvbiB0aGUgbmV4dCBtYXRjaCwgb3RoZXJ3aXNlCisJICogbm90LgorCSAqLworCWludCB5eV9hdF9ib2w7CisKKyAgICBpbnQgeXlfYnNfbGluZW5vOyAvKio8IFRoZSBsaW5lIGNvdW50LiAqLworICAgIGludCB5eV9ic19jb2x1bW47IC8qKjwgVGhlIGNvbHVtbiBjb3VudC4gKi8KKyAgICAKKwkvKiBXaGV0aGVyIHRvIHRyeSB0byBmaWxsIHRoZSBpbnB1dCBidWZmZXIgd2hlbiB3ZSByZWFjaCB0aGUKKwkgKiBlbmQgb2YgaXQuCisJICovCisJaW50IHl5X2ZpbGxfYnVmZmVyOworCisJaW50IHl5X2J1ZmZlcl9zdGF0dXM7CisKKyNkZWZpbmUgWVlfQlVGRkVSX05FVyAwCisjZGVmaW5lIFlZX0JVRkZFUl9OT1JNQUwgMQorCS8qIFdoZW4gYW4gRU9GJ3MgYmVlbiBzZWVuIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgdGV4dCB0byBwcm9jZXNzCisJICogdGhlbiB3ZSBtYXJrIHRoZSBidWZmZXIgYXMgWVlfRU9GX1BFTkRJTkcsIHRvIGluZGljYXRlIHRoYXQgd2UKKwkgKiBzaG91bGRuJ3QgdHJ5IHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc291cmNlIGFueSBtb3JlLiAgV2UgbWlnaHQKKwkgKiBzdGlsbCBoYXZlIGEgYnVuY2ggb2YgdG9rZW5zIHRvIG1hdGNoLCB0aG91Z2gsIGJlY2F1c2Ugb2YKKwkgKiBwb3NzaWJsZSBiYWNraW5nLXVwLgorCSAqCisJICogV2hlbiB3ZSBhY3R1YWxseSBzZWUgdGhlIEVPRiwgd2UgY2hhbmdlIHRoZSBzdGF0dXMgdG8gIm5ldyIKKwkgKiAodmlhIHl5cmVzdGFydCgpKSwgc28gdGhhdCB0aGUgdXNlciBjYW4gY29udGludWUgc2Nhbm5pbmcgYnkKKwkgKiBqdXN0IHBvaW50aW5nIHl5aW4gYXQgYSBuZXcgaW5wdXQgZmlsZS4KKwkgKi8KKyNkZWZpbmUgWVlfQlVGRkVSX0VPRl9QRU5ESU5HIDIKKworCX07CisjZW5kaWYgLyogIVlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUgKi8KKworLyogV2UgcHJvdmlkZSBtYWNyb3MgZm9yIGFjY2Vzc2luZyBidWZmZXIgc3RhdGVzIGluIGNhc2UgaW4gdGhlCisgKiBmdXR1cmUgd2Ugd2FudCB0byBwdXQgdGhlIGJ1ZmZlciBzdGF0ZXMgaW4gYSBtb3JlIGdlbmVyYWwKKyAqICJzY2FubmVyIHN0YXRlIi4KKyAqCisgKiBSZXR1cm5zIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBvciBOVUxMLgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSICggeXlnLT55eV9idWZmZXJfc3RhY2sgXAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IHl5Zy0+eXlfYnVmZmVyX3N0YWNrW3l5Zy0+eXlfYnVmZmVyX3N0YWNrX3RvcF0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpCisKKy8qIFNhbWUgYXMgcHJldmlvdXMgbWFjcm8sIGJ1dCB1c2VmdWwgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIGJ1ZmZlciBzdGFjayBpcyBub3QKKyAqIE5VTEwgb3Igd2hlbiB3ZSBuZWVkIGFuIGx2YWx1ZS4gRm9yIGludGVybmFsIHVzZSBvbmx5LgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSB5eWctPnl5X2J1ZmZlcl9zdGFja1t5eWctPnl5X2J1ZmZlcl9zdGFja190b3BdCisKK3ZvaWQgeXlyZXN0YXJ0IChGSUxFICppbnB1dF9maWxlICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3ZvaWQgeXlfc3dpdGNoX3RvX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworWVlfQlVGRkVSX1NUQVRFIHl5X2NyZWF0ZV9idWZmZXIgKEZJTEUgKmZpbGUsaW50IHNpemUgLHl5c2Nhbl90IHl5c2Nhbm5lciApOwordm9pZCB5eV9kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkIHl5X2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOwordm9pZCB5eXB1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkIHl5cG9wX2J1ZmZlcl9zdGF0ZSAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3N0YXRpYyB2b2lkIHl5ZW5zdXJlX2J1ZmZlcl9zdGFjayAoeXlzY2FuX3QgeXlzY2FubmVyICk7CitzdGF0aWMgdm9pZCB5eV9sb2FkX2J1ZmZlcl9zdGF0ZSAoeXlzY2FuX3QgeXlzY2FubmVyICk7CitzdGF0aWMgdm9pZCB5eV9pbml0X2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIsRklMRSAqZmlsZSAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKKyNkZWZpbmUgWVlfRkxVU0hfQlVGRkVSIHl5X2ZsdXNoX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiAseXlzY2FubmVyKQorCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9idWZmZXIgKGNoYXIgKmJhc2UseXlfc2l6ZV90IHNpemUgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKnl5X3N0ciAseXlzY2FuX3QgeXlzY2FubmVyICk7CitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9ieXRlcyAoeXljb25zdCBjaGFyICpieXRlcyxpbnQgbGVuICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCAqeXlhbGxvYyAoeXlfc2l6ZV90ICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3ZvaWQgKnl5cmVhbGxvYyAodm9pZCAqLHl5X3NpemVfdCAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkIHl5ZnJlZSAodm9pZCAqICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworI2RlZmluZSB5eV9uZXdfYnVmZmVyIHl5X2NyZWF0ZV9idWZmZXIKKworI2RlZmluZSB5eV9zZXRfaW50ZXJhY3RpdmUoaXNfaW50ZXJhY3RpdmUpIFwKKwl7IFwKKwlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXsgXAorICAgICAgICB5eWVuc3VyZV9idWZmZXJfc3RhY2sgKHl5c2Nhbm5lcik7IFwKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gICAgXAorICAgICAgICAgICAgeXlfY3JlYXRlX2J1ZmZlcih5eWluLFlZX0JVRl9TSVpFICx5eXNjYW5uZXIpOyBcCisJfSBcCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pc19pbnRlcmFjdGl2ZSA9IGlzX2ludGVyYWN0aXZlOyBcCisJfQorCisjZGVmaW5lIHl5X3NldF9ib2woYXRfYm9sKSBcCisJeyBcCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7XAorICAgICAgICB5eWVuc3VyZV9idWZmZXJfc3RhY2sgKHl5c2Nhbm5lcik7IFwKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gICAgXAorICAgICAgICAgICAgeXlfY3JlYXRlX2J1ZmZlcih5eWluLFlZX0JVRl9TSVpFICx5eXNjYW5uZXIpOyBcCisJfSBcCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9hdF9ib2wgPSBhdF9ib2w7IFwKKwl9CisKKyNkZWZpbmUgWVlfQVRfQk9MKCkgKFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sKQorCisvKiBCZWdpbiB1c2VyIHNlY3QzICovCisKKyNkZWZpbmUgeXl3cmFwKG4pIDEKKyNkZWZpbmUgWVlfU0tJUF9ZWVdSQVAKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFlZX0NIQVI7CisKK3R5cGVkZWYgaW50IHl5X3N0YXRlX3R5cGU7CisKKyNkZWZpbmUgeXl0ZXh0X3B0ciB5eXRleHRfcgorCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAoeXlfc3RhdGVfdHlwZSBjdXJyZW50X3N0YXRlICAseXlzY2FuX3QgeXlzY2FubmVyKTsKK3N0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIgbXNnW10gLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCisvKiBEb25lIGFmdGVyIHRoZSBjdXJyZW50IHBhdHRlcm4gaGFzIGJlZW4gbWF0Y2hlZCBhbmQgYmVmb3JlIHRoZQorICogY29ycmVzcG9uZGluZyBhY3Rpb24gLSBzZXRzIHVwIHl5dGV4dC4KKyAqLworI2RlZmluZSBZWV9ET19CRUZPUkVfQUNUSU9OIFwKKwl5eWctPnl5dGV4dF9wdHIgPSB5eV9icDsgXAorCXl5bGVuZyA9IChzaXplX3QpICh5eV9jcCAtIHl5X2JwKTsgXAorCXl5Zy0+eXlfaG9sZF9jaGFyID0gKnl5X2NwOyBcCisJKnl5X2NwID0gJ1wwJzsgXAorCXl5Zy0+eXlfY19idWZfcCA9IHl5X2NwOworCisjZGVmaW5lIFlZX05VTV9SVUxFUyAxNDUKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUiAxNDYKKy8qIFRoaXMgc3RydWN0IGlzIG5vdCB1c2VkIGluIHRoaXMgc2Nhbm5lciwKKyAgIGJ1dCBpdHMgcHJlc2VuY2UgaXMgbmVjZXNzYXJ5LiAqLworc3RydWN0IHl5X3RyYW5zX2luZm8KKwl7CisJZmxleF9pbnQzMl90IHl5X3ZlcmlmeTsKKwlmbGV4X2ludDMyX3QgeXlfbnh0OworCX07CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYWNjZXB0WzQxMV0gPQorICAgIHsgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTQ2LCAgMTQ0LCAgMTQzLCAgMTQzLAorICAgICAgMTI4LCAgMTM0LCAgMTM5LCAgMTIzLCAgMTI0LCAgMTMyLCAgMTMxLCAgMTIwLCAgMTI5LCAgMTI3LAorICAgICAgMTMzLCAgIDkyLCAgIDkyLCAgMTIxLCAgMTE3LCAgMTM1LCAgMTIyLCAgMTM2LCAgMTQwLCAgIDg4LAorICAgICAgMTI1LCAgMTI2LCAgMTM4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LAorICAgICAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LAorICAgICAgIDg4LCAgIDg4LCAgIDg4LCAgMTE4LCAgMTM3LCAgMTE5LCAgMTMwLCAgICAzLCAgICA0LCAgICAzLAorICAgICAgMTQyLCAgMTQ1LCAgMTQxLCAgMTE0LCAgMTAwLCAgMTE5LCAgMTA4LCAgMTAzLCAgIDk4LCAgMTA2LAorICAgICAgIDk2LCAgMTA3LCAgIDk3LCAgIDk1LCAgICAyLCAgICAxLCAgIDk5LCAgIDk0LCAgIDkwLCAgIDkxLAorICAgICAgICAwLCAgICAwLCAgIDkyLCAgMTI2LCAgMTE4LCAgMTI1LCAgMTE1LCAgMTExLCAgMTEzLCAgMTEyLAorICAgICAgMTE2LCAgIDg4LCAgMTA0LCAgMTEwLCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LAorCisgICAgICAgODgsICAgODgsICAgODgsICAgODgsICAgMTcsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsCisgICAgICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgMjAsICAgMjIsCisgICAgICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsCisgICAgICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsCisgICAgICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAxMDUsICAxMDksICAgIDUsICAxNDEsCisgICAgICAgIDAsICAgIDEsICAgOTQsICAgIDAsICAgIDAsICAgOTMsICAgODksICAxMDEsICAxMDIsICAgNDgsCisgICAgICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsCisgICAgICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgMTgsICAgODgsICAgODgsCisgICAgICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgMjYsICAgODgsICAgODgsICAgODgsCisgICAgICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgMjMsICAgODgsICAgODgsICAgODgsICAgODgsCisKKyAgICAgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwKKyAgICAgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICAgMCwgICA5NSwKKyAgICAgICAgMCwgICA5NCwgICA4OCwgICAyOCwgICA4OCwgICA4OCwgICA4NSwgICA4OCwgICA4OCwgICA4OCwKKyAgICAgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICAyMSwgICA1MSwgICA4OCwgICA4OCwgICA4OCwgICA4OCwKKyAgICAgICA4OCwgICA1NiwgICA3MCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwKKyAgICAgICA4OCwgICA2NywgICAgOSwgICAzMywgICAzNCwgICAzNSwgICA4OCwgICA4OCwgICA4OCwgICA4OCwKKyAgICAgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwKKyAgICAgICA4OCwgICA1NCwgICAyOSwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICAzNiwKKyAgICAgICAzNywgICAzOCwgICAyNywgICA4OCwgICA4OCwgICA4OCwgICAxNSwgICA0MiwgICA0MywgICA0NCwKKyAgICAgICA0OSwgICAxMiwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4MSwgICA4MiwgICA4MywgICA4OCwKKworICAgICAgIDMwLCAgIDcxLCAgIDI1LCAgIDc4LCAgIDc5LCAgIDgwLCAgICA3LCAgIDc1LCAgIDc2LCAgIDc3LAorICAgICAgIDg4LCAgIDI0LCAgIDczLCAgIDg4LCAgIDg4LCAgIDM5LCAgIDQwLCAgIDQxLCAgIDg4LCAgIDg4LAorICAgICAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDY4LCAgIDg4LCAgIDg4LAorICAgICAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDUwLCAgIDg4LCAgIDg3LCAgIDg4LCAgIDg4LAorICAgICAgIDE5LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDY5LCAgIDY0LCAgIDU5LCAgIDg4LCAgIDg4LAorICAgICAgIDg4LCAgIDg4LCAgIDg4LCAgIDc0LCAgIDU1LCAgIDg4LCAgIDYyLCAgIDMyLCAgIDg4LCAgIDg0LAorICAgICAgIDYzLCAgIDQ3LCAgIDU3LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LAorICAgICAgIDg4LCAgIDU4LCAgIDMxLCAgIDg4LCAgIDg4LCAgIDg4LCAgICA4LCAgIDg4LCAgIDg4LCAgIDg4LAorICAgICAgIDg4LCAgIDg4LCAgIDUyLCAgIDEzLCAgIDg4LCAgIDE0LCAgIDg4LCAgIDg4LCAgIDE2LCAgIDY1LAorICAgICAgIDg4LCAgIDg4LCAgIDg4LCAgIDYwLCAgIDg4LCAgIDg4LCAgIDg4LCAgIDUzLCAgIDcyLCAgIDYxLAorCisgICAgICAgMTEsICAgNjYsICAgIDYsICAgODYsICAgMTAsICAgNDUsICAgODgsICAgODgsICAgNDYsICAgIDAKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAorICAgICAgICAyLCAgICAyLCAgICAyLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAyLCAgICA0LCAgICAxLCAgICAxLCAgICAxLCAgICA1LCAgICA2LCAgICAxLCAgICA3LAorICAgICAgICA4LCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LAorICAgICAgIDE4LCAgIDE5LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDIwLCAgIDIwLCAgIDIxLCAgIDIyLCAgIDIzLAorICAgICAgIDI0LCAgIDI1LCAgIDI2LCAgICAxLCAgIDI3LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDI3LAorICAgICAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLAorICAgICAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMyLCAgIDMxLCAgIDMxLAorICAgICAgIDMzLCAgICAxLCAgIDM0LCAgIDM1LCAgIDMxLCAgICAxLCAgIDM2LCAgIDM3LCAgIDM4LCAgIDM5LAorCisgICAgICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgMzEsICAgNDUsICAgNDYsICAgNDcsICAgNDgsCisgICAgICAgNDksICAgNTAsICAgMzEsICAgNTEsICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsCisgICAgICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfbWV0YVs2NF0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAyLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICAzLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAzLCAgICAzLCAgICAzLCAgICAzLAorICAgICAgICA0LCAgICA0LCAgICAxLCAgICAxLCAgICAxLCAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICAzLAorICAgICAgICAzLCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LAorICAgICAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxCisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9iYXNlWzQxNl0gPQorICAgIHsgICAwLAorICAgICAgICAwLCAgICAwLCAgIDYxLCAgIDYyLCAgIDcxLCAgICAwLCAgNjA2LCAgNjA3LCAgNjA3LCAgNjA3LAorICAgICAgNTgxLCAgIDQyLCAgMTI5LCAgNjA3LCAgNjA3LCAgNTgwLCAgMTI2LCAgNjA3LCAgMTI1LCAgMTIzLAorICAgICAgMTM3LCAgMTQ5LCAgMTU3LCAgNTc4LCAgNjA3LCAgMTc1LCAgNTc4LCAgIDQ0LCAgNjA3LCAgICAwLAorICAgICAgNjA3LCAgNjA3LCAgMTIwLCAgIDk1LCAgMTAzLCAgMTQyLCAgMTQ2LCAgMTM2LCAgMTU2LCAgNTUyLAorICAgICAgMTY4LCAgMTYyLCAgNTUxLCAgMTIwLCAgMTU4LCAgNTQ1LCAgMTczLCAgNTU4LCAgMTcyLCAgMTc4LAorICAgICAgMTExLCAgMTg2LCAgNTU0LCAgNjA3LCAgMTU5LCAgNjA3LCAgNjA3LCAgNjA3LCAgNjA3LCAgNTgyLAorICAgICAgNjA3LCAgNjA3LCAgICAwLCAgNjA3LCAgNjA3LCAgNjA3LCAgNjA3LCAgNjA3LCAgNjA3LCAgNjA3LAorICAgICAgNjA3LCAgNjA3LCAgNjA3LCAgMjIyLCAgNjA3LCAgICAwLCAgNjA3LCAgMjI4LCAgMjU0LCAgMjYyLAorICAgICAgMjgxLCAgICAwLCAgMjkwLCAgNjA3LCAgNjA3LCAgNjA3LCAgNTcxLCAgNjA3LCAgNjA3LCAgNjA3LAorICAgICAgNTcwLCAgICAwLCAgNjA3LCAgNjA3LCAgNTQ2LCAgNTM5LCAgNTQyLCAgNTUwLCAgNTQ5LCAgNTM2LAorCisgICAgICA1NTEsICA1MzgsICA1NDQsICA1MzIsICA1MjksICA1NDIsICA1MjksICA1MjYsICA1MjYsICA1MzIsCisgICAgICA1MjAsICA1MjcsICA1MjQsICA1MzQsICA1MjAsICA1MjYsICA1MjksICA1MzAsICAgIDAsICAyMDQsCisgICAgICA1MjksICAyMDcsICA1MTUsICA1MjgsICA1MTksICA1MjEsICA1MTEsICA1MjUsICA1MjIsICA1MjQsCisgICAgICA1MDcsICA1MTIsICA1MDksICA0OTgsICAxODMsICA1MTIsICA1MDgsICA1MTAsICA0OTksICA1MDIsCisgICAgICAyMTIsICA1MDcsICA0OTksICA1MTEsICAxODYsICA1MDQsICA2MDcsICA2MDcsICA2MDcsICAgIDAsCisgICAgICAzMDYsICAgIDAsICAzMTYsICAzMzIsICAyNzAsICAzNDIsICAgIDAsICA2MDcsICA2MDcsICAgIDAsCisgICAgICA0OTYsICA1MDAsICA1MDksICA1MDYsICA0OTAsICA0OTAsICAxNjEsICA1MDUsICA1MDIsICA1MDIsCisgICAgICA1MDAsICA0OTcsICA0ODksICA0OTUsICA0ODIsICA0OTMsICA0OTYsICAgIDAsICA0OTMsICA0ODEsCisgICAgICA0ODgsICA0ODUsICA0ODksICA0ODIsICA0NzEsICA0NzAsICA0ODMsICA0ODYsICA0ODMsICA0NzgsCisgICAgICA0NjksICAyOTQsICA0NzQsICA0NzcsICA0NjgsICA0NjUsICA0NjksICA0NzUsICA0NjYsICA0NTcsCisKKyAgICAgIDQ2MCwgIDQ1OCwgIDQ2OCwgIDQ1NCwgIDQ1MiwgIDQ1MiwgIDQ1NCwgIDQ1MSwgIDQ2MiwgIDQ2MSwKKyAgICAgIDI3OCwgIDQ1NiwgIDQ1MSwgIDQ0MCwgIDMyMCwgIDQ1OCwgIDQ2MCwgIDQ0OSwgIDM0OCwgIDM1NCwKKyAgICAgIDM2MCwgIDM2NiwgIDQ1MCwgICAgMCwgIDQ0OCwgIDMzNiwgICAgMCwgIDQ0MCwgIDQzOCwgIDQ0NiwKKyAgICAgIDQzNSwgIDQ1MiwgIDQ0MSwgIDM3MCwgICAgMCwgICAgMCwgIDQzNSwgIDQ0NSwgIDQ0NSwgIDQzMCwKKyAgICAgIDM3MywgICAgMCwgICAgMCwgIDQzMiwgIDM3NiwgIDQzMywgIDQyNywgIDQyNiwgIDQyNywgIDQyNiwKKyAgICAgIDM3OSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDQyMiwgIDQyMywgIDQyOCwgIDQxOSwKKyAgICAgIDQzMiwgIDQyNywgIDQyNiwgIDQxOCwgIDQyMiwgIDQxNCwgIDQxNywgIDQyMSwgIDQyNiwgIDQyNSwKKyAgICAgIDQxNiwgICAgMCwgICAgMCwgIDQyMiwgIDQxMSwgIDQxMSwgIDQxNiwgIDQxNSwgIDQxMiwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgIDQwMiwgIDQxNCwgIDQxNiwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgIDQwNCwgIDQwNSwgIDM5OSwgIDQwOSwgICAgMCwgICAgMCwgICAgMCwgIDQwMCwKKworICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgNDA3LCAgICAwLCAgICAwLCAgNDA1LCAgNDAxLCAgICAwLCAgICAwLCAgICAwLCAgMzk3LCAgMzkzLAorICAgICAgMzk4LCAgMzg4LCAgNDAxLCAgMzg3LCAgNDAwLCAgMzg5LCAgMzk2LCAgICAwLCAgMzk0LCAgMzk2LAorICAgICAgMzgwLCAgMzg5LCAgMzk1LCAgMzkwLCAgMzc4LCAgICAwLCAgMzgwLCAgICAwLCAgMzc5LCAgMzgyLAorICAgICAgICAwLCAgMzcxLCAgMzcwLCAgMzcwLCAgMzgzLCAgICAwLCAgMzg1LCAgICAwLCAgMzg0LCAgMzgzLAorICAgICAgMzY4LCAgMzgxLCAgMzY4LCAgICAwLCAgICAwLCAgMzcxLCAgICAwLCAgICAwLCAgMzYzLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgMzYwLCAgMzcxLCAgMzY0LCAgMzY4LCAgMzAzLCAgMjk3LCAgMjg4LAorICAgICAgMzAwLCAgICAwLCAgICAwLCAgMjgzLCAgMjkwLCAgMjY5LCAgICAwLCAgMjc3LCAgMjc0LCAgMjU1LAorICAgICAgMjMyLCAgMjU1LCAgICAwLCAgICAwLCAgMjQ0LCAgICAwLCAgMjM2LCAgMjI2LCAgICAwLCAgICAwLAorICAgICAgMjI1LCAgMjA4LCAgMjExLCAgICAwLCAgMTg1LCAgMjAyLCAgMTMxLCAgICAwLCAgICAwLCAgICAwLAorCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMzQsICAxMTcsICAgIDAsICA2MDcsCisgICAgICAzOTgsICA0MDAsICA0MDIsICA0MDYsICAxNDIKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2RlZls0MTZdID0KKyAgICB7ICAgMCwKKyAgICAgIDQxMCwgICAgMSwgIDQxMSwgIDQxMSwgIDQxMCwgICAgNSwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMiwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMywgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxNCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxNSwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMiwgIDQxMCwgIDQxMCwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKworICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLAorICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLAorICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLAorICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLAorICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEwLCAgNDEwLCAgNDEwLCAgNDEzLAorICAgICAgNDEwLCAgNDE0LCAgNDEwLCAgNDEwLCAgNDEwLCAgNDEwLCAgNDE1LCAgNDEwLCAgNDEwLCAgNDEyLAorICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLAorICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLAorICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLAorICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLAorCisgICAgICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsCisgICAgICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTAsICA0MTAsCisgICAgICA0MTAsICA0MTAsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsCisgICAgICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsCisgICAgICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsCisgICAgICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsCisgICAgICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsCisgICAgICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsCisgICAgICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsCisgICAgICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsICA0MTIsCisKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKyAgICAgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwgIDQxMiwKKworICAgICAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgNDEyLCAgICAwLAorICAgICAgNDEwLCAgNDEwLCAgNDEwLCAgNDEwLCAgNDEwCisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9ueHRbNjcxXSA9CisgICAgeyAgIDAsCisgICAgICAgIDgsICAgIDksICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsCisgICAgICAgMTgsICAgMTksICAgMjAsICAgMjEsICAgMjIsICAgMjMsICAgMjMsICAgMjMsICAgMjMsICAgMjMsCisgICAgICAgMjQsICAgMjUsICAgMjYsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMzAsICAgMzAsICAgMzAsCisgICAgICAgMzAsICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsICAgMzcsICAgMzgsCisgICAgICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgMzAsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsCisgICAgICAgNDgsICAgNDksICAgNTAsICAgNTEsICAgNTIsICAgNTMsICAgMzAsICAgMzAsICAgMzAsICAgNTQsCisgICAgICAgNTUsICAgNTYsICAgNTcsICAgNTksICAgNTksICAgNjUsICAgNjYsICAgOTAsICAgOTEsICAgNjAsCisgICAgICAgNjAsICAgIDgsICAgNjEsICAgNjIsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsCisgICAgICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsCisgICAgICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgNjMsICAgNjMsICAgNjMsCisKKyAgICAgICA2MywgICA2MywgICA2MywgICAgOCwgICAgOCwgICAgOCwgICA2MywgICA2MywgICA2MywgICA2MywKKyAgICAgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywKKyAgICAgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywgICA2MywKKyAgICAgICAgOCwgICAgOCwgICAgOCwgICAgOCwgICA2NywgICA3MCwgICA3MiwgICA3NCwgICA3NCwgICA3NCwKKyAgICAgICA3NCwgICA3NCwgICA3NCwgICA5MywgIDE1NywgICA3NSwgICA5NSwgICA5NiwgICA3MywgICA3MSwKKyAgICAgICA3NiwgICA5NywgICA2OCwgICA5OCwgICA5NCwgIDEyMywgIDQwOSwgICA5OSwgIDE0MSwgIDEyNCwKKyAgICAgICA3NywgICA3OCwgIDE0MiwgICA3OSwgICA3OSwgICA3OSwgICA3OSwgICA3OSwgICA4MCwgICA3OCwKKyAgICAgIDQwOCwgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgIDEwMCwgICA4MSwgICA4NSwKKyAgICAgICA4MiwgIDEwNywgIDE0NywgIDEwOCwgIDQwNywgIDEwMywgICA4MSwgIDEwMSwgICA4MSwgIDEwNCwKKyAgICAgIDEwMiwgIDExMCwgIDEwOSwgIDEyNSwgIDEwNSwgICA4NiwgICA4MSwgICA4NywgICA4OCwgIDExMSwKKworICAgICAgMTA2LCAgMTEyLCAgMTE5LCAgMTE2LCAgMTEzLCAgIDgyLCAgMTI2LCAgMTMyLCAgMTI4LCAgMTIwLAorICAgICAgMTE0LCAgMTE3LCAgMjI5LCAgMjMwLCAgMTMzLCAgMTM0LCAgMTIxLCAgMTM3LCAgMjA0LCAgMTQ4LAorICAgICAgMTM4LCAgMTQzLCAgMTE4LCAgMTI5LCAgMTM1LCAgMTQ0LCAgMTMwLCAgMTM2LCAgMTM5LCAgMjE2LAorICAgICAgNDA2LCAgMjE3LCAgNDA1LCAgMjA1LCAgMTQ1LCAgMTQwLCAgIDc0LCAgIDc0LCAgIDc0LCAgIDc0LAorICAgICAgIDc0LCAgIDc0LCAgMTUzLCAgMTUzLCAgMTUzLCAgMTUzLCAgMTUzLCAgMTUzLCAgMzk2LCAgMTg0LAorICAgICAgNDA0LCAgMTUxLCAgMTg1LCAgMTg2LCAgMTkwLCAgMjExLCAgMTg3LCAgMTU0LCAgMTg4LCAgMzk3LAorICAgICAgNDAzLCAgMTUxLCAgMTkxLCAgMjEyLCAgNDAyLCAgNDAxLCAgIDc4LCAgMTU0LCAgIDc5LCAgIDc5LAorICAgICAgIDc5LCAgIDc5LCAgIDc5LCAgIDgwLCAgIDc4LCAgNDAwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLAorICAgICAgIDgwLCAgIDgwLCAgMzk5LCAgIDgxLCAgMTU2LCAgMTU2LCAgMTU2LCAgMTU2LCAgMTU2LCAgMTU2LAorICAgICAgMTU1LCAgIDgxLCAgMTU1LCAgIDgxLCAgMzk4LCAgMTU2LCAgMTU2LCAgMTU2LCAgMTU2LCAgMTU2LAorCisgICAgICAxNTYsICAgODEsICAgNzgsICAzOTUsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsCisgICAgICAyNTQsICAyNTUsICAyNTYsICAzOTQsICAzOTMsICAyMTksICAzOTIsICAyMTksICAyNzUsICAgODEsCisgICAgICAyMjAsICAyMjAsICAyMjAsICAyMjAsICAyMjAsICAyMjAsICAyNzYsICAzOTEsICAzOTAsICAgODEsCisgICAgICAxNTMsICAxNTMsICAxNTMsICAxNTMsICAxNTMsICAxNTMsICAyODAsICAyODEsICAyODIsICAzODksCisgICAgICAzODgsICAyMjEsICAzODcsICAyMjEsICAzODYsICAxNTQsICAyMjIsICAyMjIsICAyMjIsICAyMjIsCisgICAgICAyMjIsICAyMjIsICAyODgsICAyODksICAyOTAsICAxNTQsICAxNTYsICAxNTYsICAxNTYsICAxNTYsCisgICAgICAxNTYsICAxNTYsICAyMjAsICAyMjAsICAyMjAsICAyMjAsICAyMjAsICAyMjAsICAyMjAsICAyMjAsCisgICAgICAyMjAsICAyMjAsICAyMjAsICAyMjAsICAyMjIsICAyMjIsICAyMjIsICAyMjIsICAyMjIsICAyMjIsCisgICAgICAyMjIsICAyMjIsICAyMjIsICAyMjIsICAyMjIsICAyMjIsICAyOTcsICAyOTgsICAyOTksICAzMDQsCisgICAgICAzMDUsICAzMDYsICAzMDgsICAzMDksICAzMTAsICAzMTYsICAzMTcsICAzMTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA5MiwgICA5MiwgIDE1MCwgIDE1MCwgIDE1MiwgIDM4NSwgIDE1MiwgIDE1MiwKKyAgICAgIDM4NCwgIDM4MywgIDM4MiwgIDM4MSwgIDM4MCwgIDM3OSwgIDM3OCwgIDM3NywgIDM3NiwgIDM3NSwKKyAgICAgIDM3NCwgIDM3MywgIDM3MiwgIDM3MSwgIDM3MCwgIDM2OSwgIDM2OCwgIDM2NywgIDM2NiwgIDM2NSwKKyAgICAgIDM2NCwgIDM2MywgIDM2MiwgIDM2MSwgIDM2MCwgIDM1OSwgIDM1OCwgIDM1NywgIDM1NiwgIDM1NSwKKyAgICAgIDM1NCwgIDM1MywgIDM1MiwgIDM1MSwgIDM1MCwgIDM0OSwgIDM0OCwgIDM0NywgIDM0NiwgIDM0NSwKKyAgICAgIDM0NCwgIDM0MywgIDM0MiwgIDM0MSwgIDM0MCwgIDMzOSwgIDMzOCwgIDMzNywgIDMzNiwgIDMzNSwKKyAgICAgIDMzNCwgIDMzMywgIDMzMiwgIDMzMSwgIDMzMCwgIDMyOSwgIDMyOCwgIDMyNywgIDMyNiwgIDMyNSwKKyAgICAgIDMyNCwgIDMyMywgIDMyMiwgIDMyMSwgIDMyMCwgIDMxOSwgIDMxNSwgIDMxNCwgIDMxMywgIDMxMiwKKyAgICAgIDMxMSwgIDMwNywgIDMwMywgIDMwMiwgIDMwMSwgIDMwMCwgIDI5NiwgIDI5NSwgIDI5NCwgIDI5MywKKyAgICAgIDI5MiwgIDI5MSwgIDI4NywgIDI4NiwgIDI4NSwgIDI4NCwgIDI4MywgIDI3OSwgIDI3OCwgIDI3NywKKworICAgICAgMjc0LCAgMjczLCAgMjcyLCAgMjcxLCAgMjcwLCAgMjY5LCAgMjY4LCAgMjY3LCAgMjY2LCAgMjY1LAorICAgICAgMjY0LCAgMjYzLCAgMjYyLCAgMjYxLCAgMjYwLCAgMjU5LCAgMjU4LCAgMjU3LCAgMjUzLCAgMjUyLAorICAgICAgMjUxLCAgMjUwLCAgMjQ5LCAgMjQ4LCAgMjQ3LCAgMjQ2LCAgMjQ1LCAgMjQ0LCAgMjQzLCAgMjQyLAorICAgICAgMjQxLCAgMjQwLCAgMjM5LCAgMjM4LCAgMjM3LCAgMjM2LCAgMjM1LCAgMjM0LCAgMjMzLCAgMjMyLAorICAgICAgMjMxLCAgMjI4LCAgMjI3LCAgMjI2LCAgMjI1LCAgMjI0LCAgMjIzLCAgMjE4LCAgMjE1LCAgMjE0LAorICAgICAgMjEzLCAgMjEwLCAgMjA5LCAgMjA4LCAgMjA3LCAgMjA2LCAgMjAzLCAgMjAyLCAgMjAxLCAgMjAwLAorICAgICAgMTk5LCAgMTk4LCAgMTk3LCAgMTk2LCAgMTk1LCAgMTk0LCAgMTkzLCAgMTkyLCAgMTg5LCAgMTgzLAorICAgICAgMTgyLCAgMTgxLCAgMTgwLCAgMTc5LCAgMTc4LCAgMTc3LCAgMTc2LCAgMTc1LCAgMTc0LCAgMTczLAorICAgICAgMTcyLCAgMTcxLCAgMTcwLCAgMTY5LCAgMTY4LCAgMTY3LCAgMTY2LCAgMTY1LCAgMTY0LCAgMTYzLAorICAgICAgMTYyLCAgMTYxLCAgMTYwLCAgMTU5LCAgMTU4LCAgMTQ5LCAgMTQ2LCAgMTMxLCAgMTI3LCAgMTIyLAorCisgICAgICAxMTUsICAgODksICAgODQsICAgNjksICAgNjQsICA0MTAsICAgIDcsICA0MTAsICA0MTAsICA0MTAsCisgICAgICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsCisgICAgICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsCisgICAgICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsCisgICAgICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsCisgICAgICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsCisgICAgICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAsICA0MTAKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2Noa1s2NzFdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMywgICAgNCwgICAxMiwgICAxMiwgICAyOCwgICAyOCwgICAgMywKKyAgICAgICAgNCwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwKKyAgICAgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwKKyAgICAgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwKKworICAgICAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LAorICAgICAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LAorICAgICAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LAorICAgICAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgIDEzLCAgIDE3LCAgIDE5LCAgIDIwLCAgIDIwLCAgIDIwLAorICAgICAgIDIwLCAgIDIwLCAgIDIwLCAgIDMzLCAgNDE1LCAgIDIxLCAgIDM0LCAgIDM0LCAgIDE5LCAgIDE3LAorICAgICAgIDIxLCAgIDM1LCAgIDEzLCAgIDM1LCAgIDMzLCAgIDQ0LCAgNDA4LCAgIDM1LCAgIDUxLCAgIDQ0LAorICAgICAgIDIxLCAgIDIyLCAgIDUxLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDIzLAorICAgICAgNDA3LCAgIDIzLCAgIDIzLCAgIDIzLCAgIDIzLCAgIDIzLCAgIDIzLCAgIDM2LCAgIDIyLCAgIDI2LAorICAgICAgIDIyLCAgIDM4LCAgIDU1LCAgIDM4LCAgMzk3LCAgIDM3LCAgIDIzLCAgIDM2LCAgIDIyLCAgIDM3LAorICAgICAgIDM2LCAgIDM5LCAgIDM4LCAgIDQ1LCAgIDM3LCAgIDI2LCAgIDIzLCAgIDI2LCAgIDI2LCAgIDM5LAorCisgICAgICAgMzcsICAgMzksICAgNDIsICAgNDEsICAgMzksICAgMjIsICAgNDUsICAgNDksICAgNDcsICAgNDIsCisgICAgICAgMzksICAgNDEsICAxNjcsICAxNjcsICAgNDksICAgNDksICAgNDIsICAgNTAsICAxMzUsICAgNTUsCisgICAgICAgNTAsICAgNTIsICAgNDEsICAgNDcsICAgNDksICAgNTIsICAgNDcsICAgNDksICAgNTAsICAxNDUsCisgICAgICAzOTYsICAxNDUsICAzOTUsICAxMzUsICAgNTIsICAgNTAsICAgNzQsICAgNzQsICAgNzQsICAgNzQsCisgICAgICAgNzQsICAgNzQsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAzODEsICAxMjAsCisgICAgICAzOTMsICAgNzQsICAxMjAsICAxMjAsICAxMjIsICAxNDEsICAxMjAsICAgNzgsICAxMjAsICAzODEsCisgICAgICAzOTIsICAgNzQsICAxMjIsICAxNDEsICAzOTEsICAzODgsICAgNzksICAgNzgsICAgNzksICAgNzksCisgICAgICAgNzksICAgNzksICAgNzksICAgNzksICAgODAsICAzODcsICAgODAsICAgODAsICAgODAsICAgODAsCisgICAgICAgODAsICAgODAsICAzODUsICAgNzksICAxNTUsICAxNTUsICAxNTUsICAxNTUsICAxNTUsICAxNTUsCisgICAgICAgODEsICAgODAsICAgODEsICAgNzksICAzODIsICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsCisKKyAgICAgICA4MSwgICA4MCwgICA4MywgIDM4MCwgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywKKyAgICAgIDE5MiwgIDE5MiwgIDE5MiwgIDM3OSwgIDM3OCwgIDE1MSwgIDM3NiwgIDE1MSwgIDIxMSwgICA4MywKKyAgICAgIDE1MSwgIDE1MSwgIDE1MSwgIDE1MSwgIDE1MSwgIDE1MSwgIDIxMSwgIDM3NSwgIDM3NCwgICA4MywKKyAgICAgIDE1MywgIDE1MywgIDE1MywgIDE1MywgIDE1MywgIDE1MywgIDIxNSwgIDIxNSwgIDIxNSwgIDM3MSwKKyAgICAgIDM3MCwgIDE1NCwgIDM2OSwgIDE1NCwgIDM2OCwgIDE1MywgIDE1NCwgIDE1NCwgIDE1NCwgIDE1NCwKKyAgICAgIDE1NCwgIDE1NCwgIDIyNiwgIDIyNiwgIDIyNiwgIDE1MywgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwKKyAgICAgIDE1NiwgIDE1NiwgIDIxOSwgIDIxOSwgIDIxOSwgIDIxOSwgIDIxOSwgIDIxOSwgIDIyMCwgIDIyMCwKKyAgICAgIDIyMCwgIDIyMCwgIDIyMCwgIDIyMCwgIDIyMSwgIDIyMSwgIDIyMSwgIDIyMSwgIDIyMSwgIDIyMSwKKyAgICAgIDIyMiwgIDIyMiwgIDIyMiwgIDIyMiwgIDIyMiwgIDIyMiwgIDIzNCwgIDIzNCwgIDIzNCwgIDI0MSwKKyAgICAgIDI0MSwgIDI0MSwgIDI0NSwgIDI0NSwgIDI0NSwgIDI1MSwgIDI1MSwgIDI1MSwgIDQxMSwgIDQxMSwKKworICAgICAgNDExLCAgNDExLCAgNDEyLCAgNDEyLCAgNDEzLCAgNDEzLCAgNDE0LCAgMzY3LCAgNDE0LCAgNDE0LAorICAgICAgMzY2LCAgMzY1LCAgMzY0LCAgMzU5LCAgMzU2LCAgMzUzLCAgMzUyLCAgMzUxLCAgMzUwLCAgMzQ5LAorICAgICAgMzQ3LCAgMzQ1LCAgMzQ0LCAgMzQzLCAgMzQyLCAgMzQwLCAgMzM5LCAgMzM3LCAgMzM1LCAgMzM0LAorICAgICAgMzMzLCAgMzMyLCAgMzMxLCAgMzMwLCAgMzI5LCAgMzI3LCAgMzI2LCAgMzI1LCAgMzI0LCAgMzIzLAorICAgICAgMzIyLCAgMzIxLCAgMzIwLCAgMzE5LCAgMzE1LCAgMzE0LCAgMzExLCAgMzAwLCAgMjk2LCAgMjk1LAorICAgICAgMjk0LCAgMjkzLCAgMjg2LCAgMjg1LCAgMjg0LCAgMjc5LCAgMjc4LCAgMjc3LCAgMjc2LCAgMjc1LAorICAgICAgMjc0LCAgMjcxLCAgMjcwLCAgMjY5LCAgMjY4LCAgMjY3LCAgMjY2LCAgMjY1LCAgMjY0LCAgMjYzLAorICAgICAgMjYyLCAgMjYxLCAgMjYwLCAgMjU5LCAgMjU4LCAgMjU3LCAgMjUwLCAgMjQ5LCAgMjQ4LCAgMjQ3LAorICAgICAgMjQ2LCAgMjQ0LCAgMjQwLCAgMjM5LCAgMjM4LCAgMjM3LCAgMjMzLCAgMjMyLCAgMjMxLCAgMjMwLAorICAgICAgMjI5LCAgMjI4LCAgMjI1LCAgMjIzLCAgMjE4LCAgMjE3LCAgMjE2LCAgMjE0LCAgMjEzLCAgMjEyLAorCisgICAgICAyMTAsICAyMDksICAyMDgsICAyMDcsICAyMDYsICAyMDUsICAyMDQsICAyMDMsICAyMDIsICAyMDEsCisgICAgICAyMDAsICAxOTksICAxOTgsICAxOTcsICAxOTYsICAxOTUsICAxOTQsICAxOTMsICAxOTEsICAxOTAsCisgICAgICAxODksICAxODgsICAxODcsICAxODYsICAxODUsICAxODQsICAxODMsICAxODIsICAxODEsICAxODAsCisgICAgICAxNzksICAxNzcsICAxNzYsICAxNzUsICAxNzQsICAxNzMsICAxNzIsICAxNzEsICAxNzAsICAxNjksCisgICAgICAxNjgsICAxNjYsICAxNjUsICAxNjQsICAxNjMsICAxNjIsICAxNjEsICAxNDYsICAxNDQsICAxNDMsCisgICAgICAxNDIsICAxNDAsICAxMzksICAxMzgsICAxMzcsICAxMzYsICAxMzQsICAxMzMsICAxMzIsICAxMzEsCisgICAgICAxMzAsICAxMjksICAxMjgsICAxMjcsICAxMjYsICAxMjUsICAxMjQsICAxMjMsICAxMjEsICAxMTgsCisgICAgICAxMTcsICAxMTYsICAxMTUsICAxMTQsICAxMTMsICAxMTIsICAxMTEsICAxMTAsICAxMDksICAxMDgsCisgICAgICAxMDcsICAxMDYsICAxMDUsICAxMDQsICAxMDMsICAxMDIsICAxMDEsICAxMDAsICAgOTksICAgOTgsCisgICAgICAgOTcsICAgOTYsICAgOTUsICAgOTEsICAgODcsICAgNjAsICAgNTMsICAgNDgsICAgNDYsICAgNDMsCisKKyAgICAgICA0MCwgICAyNywgICAyNCwgICAxNiwgICAxMSwgICAgNywgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwKKyAgICAgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMCwgIDQxMAorICAgIH0gOworCisvKiBUYWJsZSBvZiBib29sZWFucywgdHJ1ZSBpZiBydWxlIGNvdWxkIG1hdGNoIGVvbC4gKi8KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MzJfdCB5eV9ydWxlX2Nhbl9tYXRjaF9lb2xbMTQ2XSA9CisgICAgeyAgIDAsCiswLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAKKyAgICAwLCAwLCAwLCAxLCAwLCAwLCAgICAgfTsKKworLyogVGhlIGludGVudCBiZWhpbmQgdGhpcyBkZWZpbml0aW9uIGlzIHRoYXQgaXQnbGwgY2F0Y2gKKyAqIGFueSB1c2VzIG9mIFJFSkVDVCB3aGljaCBmbGV4IG1pc3NlZC4KKyAqLworI2RlZmluZSBSRUpFQ1QgcmVqZWN0X3VzZWRfYnV0X25vdF9kZXRlY3RlZAorI2RlZmluZSB5eW1vcmUoKSB5eW1vcmVfdXNlZF9idXRfbm90X2RldGVjdGVkCisjZGVmaW5lIFlZX01PUkVfQURKIDAKKyNkZWZpbmUgWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAorLyoKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKK1RoaXMgZmlsZSBjb250YWlucyB0aGUgTGV4IHNwZWNpZmljYXRpb24gZm9yIEdMU0wgRVMuCitCYXNlZCBvbiBBTlNJIEMgZ3JhbW1hciwgTGV4IHNwZWNpZmljYXRpb246CitodHRwOi8vd3d3Lmx5c2F0b3IubGl1LnNlL2MvQU5TSS1DLWdyYW1tYXItbC5odG1sCisKK0lGIFlPVSBNT0RJRlkgVEhJUyBGSUxFIFlPVSBBTFNPIE5FRUQgVE8gUlVOIGdlbmVyYXRlX2dsc2xhbmdfbGV4ZXIuc2gsCitXSElDSCBHRU5FUkFURVMgVEhFIEdMU0wgRVMgTEVYRVIgKGdsc2xhbmdfbGV4LmNwcCkuCisqLworCisjaW5jbHVkZSAiY29tcGlsZXIvZ2xzbGFuZy5oIgorI2luY2x1ZGUgImNvbXBpbGVyL1BhcnNlSGVscGVyLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvdXRpbC5oIgorI2luY2x1ZGUgImdsc2xhbmdfdGFiLmgiCisKKy8qIHdpbmRvd3Mgb25seSBwcmFnbWEgKi8KKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MTAyKQorI2VuZGlmCisKKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geXlsdmFsLT5sZXgubGluZSA9IHl5bGluZW5vOworI2RlZmluZSBZWV9JTlBVVChidWYsIHJlc3VsdCwgbWF4X3NpemUpIFwKKyAgICByZXN1bHQgPSBzdHJpbmdfaW5wdXQoYnVmLCBtYXhfc2l6ZSwgeXlzY2FubmVyKTsKKworc3RhdGljIGludCBzdHJpbmdfaW5wdXQoY2hhciogYnVmLCBpbnQgbWF4X3NpemUsIHl5c2Nhbl90IHl5c2Nhbm5lcik7CitzdGF0aWMgaW50IGNoZWNrX3R5cGUoeXlzY2FuX3QgeXlzY2FubmVyKTsKK3N0YXRpYyBpbnQgcmVzZXJ2ZWRfd29yZCh5eXNjYW5fdCB5eXNjYW5uZXIpOworCisjZGVmaW5lIElOSVRJQUwgMAorI2RlZmluZSBDT01NRU5UIDEKKyNkZWZpbmUgRklFTERTIDIKKworI2RlZmluZSBZWV9FWFRSQV9UWVBFIFRQYXJzZUNvbnRleHQqCisKKy8qIEhvbGRzIHRoZSBlbnRpcmUgc3RhdGUgb2YgdGhlIHJlZW50cmFudCBzY2FubmVyLiAqLworc3RydWN0IHl5Z3V0c190CisgICAgeworCisgICAgLyogVXNlci1kZWZpbmVkLiBOb3QgdG91Y2hlZCBieSBmbGV4LiAqLworICAgIFlZX0VYVFJBX1RZUEUgeXlleHRyYV9yOworCisgICAgLyogVGhlIHJlc3QgYXJlIHRoZSBzYW1lIGFzIHRoZSBnbG9iYWxzIGRlY2xhcmVkIGluIHRoZSBub24tcmVlbnRyYW50IHNjYW5uZXIuICovCisgICAgRklMRSAqeXlpbl9yLCAqeXlvdXRfcjsKKyAgICBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX3RvcDsgLyoqPCBpbmRleCBvZiB0b3Agb2Ygc3RhY2suICovCisgICAgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja19tYXg7IC8qKjwgY2FwYWNpdHkgb2Ygc3RhY2suICovCisgICAgWVlfQlVGRkVSX1NUQVRFICogeXlfYnVmZmVyX3N0YWNrOyAvKio8IFN0YWNrIGFzIGFuIGFycmF5LiAqLworICAgIGNoYXIgeXlfaG9sZF9jaGFyOworICAgIGludCB5eV9uX2NoYXJzOworICAgIGludCB5eWxlbmdfcjsKKyAgICBjaGFyICp5eV9jX2J1Zl9wOworICAgIGludCB5eV9pbml0OworICAgIGludCB5eV9zdGFydDsKKyAgICBpbnQgeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mOworICAgIGludCB5eV9zdGFydF9zdGFja19wdHI7CisgICAgaW50IHl5X3N0YXJ0X3N0YWNrX2RlcHRoOworICAgIGludCAqeXlfc3RhcnRfc3RhY2s7CisgICAgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKKyAgICBjaGFyKiB5eV9sYXN0X2FjY2VwdGluZ19jcG9zOworCisgICAgaW50IHl5bGluZW5vX3I7CisgICAgaW50IHl5X2ZsZXhfZGVidWdfcjsKKworICAgIGNoYXIgKnl5dGV4dF9yOworICAgIGludCB5eV9tb3JlX2ZsYWc7CisgICAgaW50IHl5X21vcmVfbGVuOworCisgICAgWVlTVFlQRSAqIHl5bHZhbF9yOworCisgICAgfTsgLyogZW5kIHN0cnVjdCB5eWd1dHNfdCAqLworCitzdGF0aWMgaW50IHl5X2luaXRfZ2xvYmFscyAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKKyAgICAvKiBUaGlzIG11c3QgZ28gaGVyZSBiZWNhdXNlIFlZU1RZUEUgYW5kIFlZTFRZUEUgYXJlIGluY2x1ZGVkCisgICAgICogZnJvbSBiaXNvbiBvdXRwdXQgaW4gc2VjdGlvbiAxLiovCisgICAgIyAgICBkZWZpbmUgeXlsdmFsIHl5Zy0+eXlsdmFsX3IKKyAgICAKK2ludCB5eWxleF9pbml0ICh5eXNjYW5fdCogc2Nhbm5lcik7CisKK2ludCB5eWxleF9pbml0X2V4dHJhIChZWV9FWFRSQV9UWVBFIHVzZXJfZGVmaW5lZCx5eXNjYW5fdCogc2Nhbm5lcik7CisKKy8qIEFjY2Vzc29yIG1ldGhvZHMgdG8gZ2xvYmFscy4KKyAgIFRoZXNlIGFyZSBtYWRlIHZpc2libGUgdG8gbm9uLXJlZW50cmFudCBzY2FubmVycyBmb3IgY29udmVuaWVuY2UuICovCisKK2ludCB5eWxleF9kZXN0cm95ICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworaW50IHl5Z2V0X2RlYnVnICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCB5eXNldF9kZWJ1ZyAoaW50IGRlYnVnX2ZsYWcgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitZWV9FWFRSQV9UWVBFIHl5Z2V0X2V4dHJhICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCB5eXNldF9leHRyYSAoWVlfRVhUUkFfVFlQRSB1c2VyX2RlZmluZWQgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitGSUxFICp5eWdldF9pbiAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3ZvaWQgeXlzZXRfaW4gIChGSUxFICogaW5fc3RyICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworRklMRSAqeXlnZXRfb3V0ICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCB5eXNldF9vdXQgIChGSUxFICogb3V0X3N0ciAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKK2ludCB5eWdldF9sZW5nICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworY2hhciAqeXlnZXRfdGV4dCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK2ludCB5eWdldF9saW5lbm8gKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCit2b2lkIHl5c2V0X2xpbmVubyAoaW50IGxpbmVfbnVtYmVyICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworWVlTVFlQRSAqIHl5Z2V0X2x2YWwgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCit2b2lkIHl5c2V0X2x2YWwgKFlZU1RZUEUgKiB5eWx2YWxfcGFyYW0gLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCisvKiBNYWNyb3MgYWZ0ZXIgdGhpcyBwb2ludCBjYW4gYWxsIGJlIG92ZXJyaWRkZW4gYnkgdXNlciBkZWZpbml0aW9ucyBpbgorICogc2VjdGlvbiAxLgorICovCisKKyNpZm5kZWYgWVlfU0tJUF9ZWVdSQVAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBpbnQgeXl3cmFwICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKyNlbHNlCitleHRlcm4gaW50IHl5d3JhcCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIHl5dGV4dF9wdHIKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciAqLHl5Y29uc3QgY2hhciAqLGludCAseXlzY2FuX3QgeXlzY2FubmVyKTsKKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqICx5eXNjYW5fdCB5eXNjYW5uZXIpOworI2VuZGlmCisKKyNpZm5kZWYgWVlfTk9fSU5QVVQKKworI2lmZGVmIF9fY3BsdXNwbHVzCitzdGF0aWMgaW50IHl5aW5wdXQgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworI2Vsc2UKK3N0YXRpYyBpbnQgaW5wdXQgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworI2VuZGlmCisKKyNlbmRpZgorCisgICAgc3RhdGljIHZvaWQgeXlfcHVzaF9zdGF0ZSAoaW50IG5ld19zdGF0ZSAseXlzY2FuX3QgeXlzY2FubmVyKTsKKyAgICAKKyAgICBzdGF0aWMgdm9pZCB5eV9wb3Bfc3RhdGUgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworICAgIAorICAgIHN0YXRpYyBpbnQgeXlfdG9wX3N0YXRlICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKyAgICAKKy8qIEFtb3VudCBvZiBzdHVmZiB0byBzbHVycCB1cCB3aXRoIGVhY2ggcmVhZC4gKi8KKyNpZm5kZWYgWVlfUkVBRF9CVUZfU0laRQorI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDgxOTIKKyNlbmRpZgorCisvKiBDb3B5IHdoYXRldmVyIHRoZSBsYXN0IHJ1bGUgbWF0Y2hlZCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAqLworI2lmbmRlZiBFQ0hPCisvKiBUaGlzIHVzZWQgdG8gYmUgYW4gZnB1dHMoKSwgYnV0IHNpbmNlIHRoZSBzdHJpbmcgbWlnaHQgY29udGFpbiBOVUwncywKKyAqIHdlIG5vdyB1c2UgZndyaXRlKCkuCisgKi8KKyNkZWZpbmUgRUNITyBmd3JpdGUoIHl5dGV4dCwgeXlsZW5nLCAxLCB5eW91dCApCisjZW5kaWYKKworLyogR2V0cyBpbnB1dCBhbmQgc3R1ZmZzIGl0IGludG8gImJ1ZiIuICBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciBZWV9OVUxMLAorICogaXMgcmV0dXJuZWQgaW4gInJlc3VsdCIuCisgKi8KKyNpZm5kZWYgWVlfSU5QVVQKKyNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkgXAorCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pc19pbnRlcmFjdGl2ZSApIFwKKwkJeyBcCisJCWludCBjID0gJyonOyBcCisJCWludCBuOyBcCisJCWZvciAoIG4gPSAwOyBuIDwgbWF4X3NpemUgJiYgXAorCQkJICAgICAoYyA9IGdldGMoIHl5aW4gKSkgIT0gRU9GICYmIGMgIT0gJ1xuJzsgKytuICkgXAorCQkJYnVmW25dID0gKGNoYXIpIGM7IFwKKwkJaWYgKCBjID09ICdcbicgKSBcCisJCQlidWZbbisrXSA9IChjaGFyKSBjOyBcCisJCWlmICggYyA9PSBFT0YgJiYgZmVycm9yKCB5eWluICkgKSBcCisJCQlZWV9GQVRBTF9FUlJPUiggImlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQiICk7IFwKKwkJcmVzdWx0ID0gbjsgXAorCQl9IFwKKwllbHNlIFwKKwkJeyBcCisJCWVycm5vPTA7IFwKKwkJd2hpbGUgKCAocmVzdWx0ID0gZnJlYWQoYnVmLCAxLCBtYXhfc2l6ZSwgeXlpbikpPT0wICYmIGZlcnJvcih5eWluKSkgXAorCQkJeyBcCisJCQlpZiggZXJybm8gIT0gRUlOVFIpIFwKKwkJCQl7IFwKKwkJCQlZWV9GQVRBTF9FUlJPUiggImlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQiICk7IFwKKwkJCQlicmVhazsgXAorCQkJCX0gXAorCQkJZXJybm89MDsgXAorCQkJY2xlYXJlcnIoeXlpbik7IFwKKwkJCX0gXAorCQl9XAorXAorCisjZW5kaWYKKworLyogTm8gc2VtaS1jb2xvbiBhZnRlciByZXR1cm47IGNvcnJlY3QgdXNhZ2UgaXMgdG8gd3JpdGUgInl5dGVybWluYXRlKCk7IiAtCisgKiB3ZSBkb24ndCB3YW50IGFuIGV4dHJhICc7JyBhZnRlciB0aGUgInJldHVybiIgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UKKyAqIHNvbWUgY29tcGlsZXJzIHRvIGNvbXBsYWluIGFib3V0IHVucmVhY2hhYmxlIHN0YXRlbWVudHMuCisgKi8KKyNpZm5kZWYgeXl0ZXJtaW5hdGUKKyNkZWZpbmUgeXl0ZXJtaW5hdGUoKSByZXR1cm4gWVlfTlVMTAorI2VuZGlmCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGJ5IHdoaWNoIHN0YXJ0LWNvbmRpdGlvbiBzdGFjayBncm93cy4gKi8KKyNpZm5kZWYgWVlfU1RBUlRfU1RBQ0tfSU5DUgorI2RlZmluZSBZWV9TVEFSVF9TVEFDS19JTkNSIDI1CisjZW5kaWYKKworLyogUmVwb3J0IGEgZmF0YWwgZXJyb3IuICovCisjaWZuZGVmIFlZX0ZBVEFMX0VSUk9SCisjZGVmaW5lIFlZX0ZBVEFMX0VSUk9SKG1zZykgeXlfZmF0YWxfZXJyb3IoIG1zZyAsIHl5c2Nhbm5lcikKKyNlbmRpZgorCisvKiBlbmQgdGFibGVzIHNlcmlhbGl6YXRpb24gc3RydWN0dXJlcyBhbmQgcHJvdG90eXBlcyAqLworCisvKiBEZWZhdWx0IGRlY2xhcmF0aW9uIG9mIGdlbmVyYXRlZCBzY2FubmVyIC0gYSBkZWZpbmUgc28gdGhlIHVzZXIgY2FuCisgKiBlYXNpbHkgYWRkIHBhcmFtZXRlcnMuCisgKi8KKyNpZm5kZWYgWVlfREVDTAorI2RlZmluZSBZWV9ERUNMX0lTX09VUlMgMQorCitleHRlcm4gaW50IHl5bGV4IFwKKyAgICAgICAgICAgICAgIChZWVNUWVBFICogeXlsdmFsX3BhcmFtICx5eXNjYW5fdCB5eXNjYW5uZXIpOworCisjZGVmaW5lIFlZX0RFQ0wgaW50IHl5bGV4IFwKKyAgICAgICAgICAgICAgIChZWVNUWVBFICogeXlsdmFsX3BhcmFtICwgeXlzY2FuX3QgeXlzY2FubmVyKQorI2VuZGlmIC8qICFZWV9ERUNMICovCisKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHl5dGV4dCBhbmQgeXlsZW5nCisgKiBoYXZlIGJlZW4gc2V0IHVwLgorICovCisjaWZuZGVmIFlZX1VTRVJfQUNUSU9OCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OCisjZW5kaWYKKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4gKi8KKyNpZm5kZWYgWVlfQlJFQUsKKyNkZWZpbmUgWVlfQlJFQUsgYnJlYWs7CisjZW5kaWYKKworI2RlZmluZSBZWV9SVUxFX1NFVFVQIFwKKwlZWV9VU0VSX0FDVElPTgorCisvKiogVGhlIG1haW4gc2Nhbm5lciBmdW5jdGlvbiB3aGljaCBkb2VzIGFsbCB0aGUgd29yay4KKyAqLworWVlfREVDTAoreworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcCwgKnl5X2JwOworCXJlZ2lzdGVyIGludCB5eV9hY3Q7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisgICAgVFBhcnNlQ29udGV4dCogY29udGV4dCA9IHl5ZXh0cmE7CisKKyAgICAvKiBTaW5nbGUtbGluZSBjb21tZW50cyAqLworCisgICAgeXlsdmFsID0geXlsdmFsX3BhcmFtOworCisJaWYgKCAheXlnLT55eV9pbml0ICkKKwkJeworCQl5eWctPnl5X2luaXQgPSAxOworCisjaWZkZWYgWVlfVVNFUl9JTklUCisJCVlZX1VTRVJfSU5JVDsKKyNlbmRpZgorCisJCWlmICggISB5eWctPnl5X3N0YXJ0ICkKKwkJCXl5Zy0+eXlfc3RhcnQgPSAxOwkvKiBmaXJzdCBzdGFydCBzdGF0ZSAqLworCisJCWlmICggISB5eWluICkKKwkJCXl5aW4gPSBzdGRpbjsKKworCQlpZiAoICEgeXlvdXQgKQorCQkJeXlvdXQgPSBzdGRvdXQ7CisKKwkJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICkgeworCQkJeXllbnN1cmVfYnVmZmVyX3N0YWNrICh5eXNjYW5uZXIpOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0KKwkJCQl5eV9jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUgLHl5c2Nhbm5lcik7CisJCX0KKworCQl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSh5eXNjYW5uZXIgKTsKKwkJfQorCisJd2hpbGUgKCAxICkJCS8qIGxvb3BzIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgKi8KKwkJeworCQl5eV9jcCA9IHl5Zy0+eXlfY19idWZfcDsKKworCQkvKiBTdXBwb3J0IG9mIHl5dGV4dC4gKi8KKwkJKnl5X2NwID0geXlnLT55eV9ob2xkX2NoYXI7CisKKwkJLyogeXlfYnAgcG9pbnRzIHRvIHRoZSBwb3NpdGlvbiBpbiB5eV9jaF9idWYgb2YgdGhlIHN0YXJ0IG9mCisJCSAqIHRoZSBjdXJyZW50IHJ1bi4KKwkJICovCisJCXl5X2JwID0geXlfY3A7CisKKwkJeXlfY3VycmVudF9zdGF0ZSA9IHl5Zy0+eXlfc3RhcnQ7Cit5eV9tYXRjaDoKKwkJZG8KKwkJCXsKKwkJCXJlZ2lzdGVyIFlZX0NIQVIgeXlfYyA9IHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldOworCQkJaWYgKCB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV0gKQorCQkJCXsKKwkJCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MgPSB5eV9jcDsKKwkJCQl9CisJCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCisJCQkJeworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07CisJCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDQxMSApCisJCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJCX0KKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJKyt5eV9jcDsKKwkJCX0KKwkJd2hpbGUgKCB5eV9jdXJyZW50X3N0YXRlICE9IDQxMCApOworCQl5eV9jcCA9IHl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfY3BvczsKKwkJeXlfY3VycmVudF9zdGF0ZSA9IHl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfc3RhdGU7CisKK3l5X2ZpbmRfYWN0aW9uOgorCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07CisKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsKKworCQlpZiAoIHl5X2FjdCAhPSBZWV9FTkRfT0ZfQlVGRkVSICYmIHl5X3J1bGVfY2FuX21hdGNoX2VvbFt5eV9hY3RdICkKKwkJCXsKKwkJCWludCB5eWw7CisJCQlmb3IgKCB5eWwgPSAwOyB5eWwgPCB5eWxlbmc7ICsreXlsICkKKwkJCQlpZiAoIHl5dGV4dFt5eWxdID09ICdcbicgKQorCQkJCQkgICAKKyAgICBkb3sgeXlsaW5lbm8rKzsKKyAgICAgICAgeXljb2x1bW49MDsKKyAgICB9d2hpbGUoMCkKKzsKKwkJCX0KKworZG9fYWN0aW9uOgkvKiBUaGlzIGxhYmVsIGlzIHVzZWQgb25seSB0byBhY2Nlc3MgRU9GIGFjdGlvbnMuICovCisKKwkJc3dpdGNoICggeXlfYWN0ICkKKwl7IC8qIGJlZ2lubmluZyBvZiBhY3Rpb24gc3dpdGNoICovCisJCQljYXNlIDA6IC8qIG11c3QgYmFjayB1cCAqLworCQkJLyogdW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OICovCisJCQkqeXlfY3AgPSB5eWctPnl5X2hvbGRfY2hhcjsKKwkJCXl5X2NwID0geXlnLT55eV9sYXN0X2FjY2VwdGluZ19jcG9zOworCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfc3RhdGU7CisJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCitjYXNlIDE6CitZWV9SVUxFX1NFVFVQCis7CisJWVlfQlJFQUsKKy8qIE11bHRpLWxpbmUgY29tbWVudHMgKi8KK2Nhc2UgMjoKK1lZX1JVTEVfU0VUVVAKK3sgeXlfcHVzaF9zdGF0ZShDT01NRU5ULCB5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMzoKK2Nhc2UgNDoKKy8qIHJ1bGUgNCBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCis7CisJWVlfQlJFQUsKK2Nhc2UgNToKK1lZX1JVTEVfU0VUVVAKK3sgeXlfcG9wX3N0YXRlKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA2OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oSU5WQVJJQU5UKTsgfQorCVlZX0JSRUFLCitjYXNlIDc6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihISUdIX1BSRUNJU0lPTik7IH0KKwlZWV9CUkVBSworY2FzZSA4OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oTUVESVVNX1BSRUNJU0lPTik7IH0KKwlZWV9CUkVBSworY2FzZSA5OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oTE9XX1BSRUNJU0lPTik7IH0KKwlZWV9CUkVBSworY2FzZSAxMDoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKFBSRUNJU0lPTik7IH0KKwlZWV9CUkVBSworY2FzZSAxMToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKEFUVFJJQlVURSk7IH0KKwlZWV9CUkVBSworY2FzZSAxMjoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKENPTlNUX1FVQUwpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihVTklGT1JNKTsgfQorCVlZX0JSRUFLCitjYXNlIDE0OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oVkFSWUlORyk7IH0KKwlZWV9CUkVBSworY2FzZSAxNToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKEJSRUFLKTsgfQorCVlZX0JSRUFLCitjYXNlIDE2OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oQ09OVElOVUUpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTc6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihETyk7IH0KKwlZWV9CUkVBSworY2FzZSAxODoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKEZPUik7IH0KKwlZWV9CUkVBSworY2FzZSAxOToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKFdISUxFKTsgfQorCVlZX0JSRUFLCitjYXNlIDIwOgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oSUYpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMjE6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihFTFNFKTsgfQorCVlZX0JSRUFLCitjYXNlIDIyOgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oSU5fUVVBTCk7IH0KKwlZWV9CUkVBSworY2FzZSAyMzoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKE9VVF9RVUFMKTsgfQorCVlZX0JSRUFLCitjYXNlIDI0OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oSU5PVVRfUVVBTCk7IH0KKwlZWV9CUkVBSworY2FzZSAyNToKK1lZX1JVTEVfU0VUVVAKK3sgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gdHJ1ZTsgcmV0dXJuKEZMT0FUX1RZUEUpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMjY6CitZWV9SVUxFX1NFVFVQCit7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybihJTlRfVFlQRSk7IH0KKwlZWV9CUkVBSworY2FzZSAyNzoKK1lZX1JVTEVfU0VUVVAKK3sgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gdHJ1ZTsgcmV0dXJuKFZPSURfVFlQRSk7IH0KKwlZWV9CUkVBSworY2FzZSAyODoKK1lZX1JVTEVfU0VUVVAKK3sgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gdHJ1ZTsgcmV0dXJuKEJPT0xfVFlQRSk7IH0KKwlZWV9CUkVBSworY2FzZSAyOToKK1lZX1JVTEVfU0VUVVAKK3sgeXlsdmFsLT5sZXguYiA9IHRydWU7ICByZXR1cm4oQk9PTENPTlNUQU5UKTsgfQorCVlZX0JSRUFLCitjYXNlIDMwOgorWVlfUlVMRV9TRVRVUAoreyB5eWx2YWwtPmxleC5iID0gZmFsc2U7IHJldHVybihCT09MQ09OU1RBTlQpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMzE6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihESVNDQVJEKTsgfQorCVlZX0JSRUFLCitjYXNlIDMyOgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oUkVUVVJOKTsgfQorCVlZX0JSRUFLCitjYXNlIDMzOgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4oTUFUUklYMik7IH0KKwlZWV9CUkVBSworY2FzZSAzNDoKK1lZX1JVTEVfU0VUVVAKK3sgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gdHJ1ZTsgcmV0dXJuKE1BVFJJWDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMzU6CitZWV9SVUxFX1NFVFVQCit7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybihNQVRSSVg0KTsgfQorCVlZX0JSRUFLCitjYXNlIDM2OgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gKFZFQzIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMzc6CitZWV9SVUxFX1NFVFVQCit7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybiAoVkVDMyk7IH0KKwlZWV9CUkVBSworY2FzZSAzODoKK1lZX1JVTEVfU0VUVVAKK3sgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gdHJ1ZTsgcmV0dXJuIChWRUM0KTsgfQorCVlZX0JSRUFLCitjYXNlIDM5OgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gKElWRUMyKTsgfQorCVlZX0JSRUFLCitjYXNlIDQwOgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gKElWRUMzKTsgfQorCVlZX0JSRUFLCitjYXNlIDQxOgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gKElWRUM0KTsgfQorCVlZX0JSRUFLCitjYXNlIDQyOgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gKEJWRUMyKTsgfQorCVlZX0JSRUFLCitjYXNlIDQzOgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gKEJWRUMzKTsgfQorCVlZX0JSRUFLCitjYXNlIDQ0OgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gKEJWRUM0KTsgfQorCVlZX0JSRUFLCitjYXNlIDQ1OgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4gU0FNUExFUjJEOyB9CisJWVlfQlJFQUsKK2Nhc2UgNDY6CitZWV9SVUxFX1NFVFVQCit7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IHRydWU7IHJldHVybiBTQU1QTEVSQ1VCRTsgfQorCVlZX0JSRUFLCitjYXNlIDQ3OgorWVlfUlVMRV9TRVRVUAoreyBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSB0cnVlOyByZXR1cm4oU1RSVUNUKTsgfQorCVlZX0JSRUFLCitjYXNlIDQ4OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNDk6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA1MDoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDUxOgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNTI6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA1MzoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDU0OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNTU6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA1NjoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDU3OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNTg6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA1OToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDYwOgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNjE6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA2MjoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDYzOgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNjQ6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA2NToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDY2OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNjc6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA2ODoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDY5OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNzA6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA3MToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDcyOgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNzM6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA3NDoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDc1OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNzY6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA3NzoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDc4OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNzk6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA4MDoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDgxOgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgODI6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA4MzoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDg0OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgODU6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybiByZXNlcnZlZF93b3JkKHl5c2Nhbm5lcik7IH0KKwlZWV9CUkVBSworY2FzZSA4NjoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuIHJlc2VydmVkX3dvcmQoeXlzY2FubmVyKTsgfQorCVlZX0JSRUFLCitjYXNlIDg3OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4gcmVzZXJ2ZWRfd29yZCh5eXNjYW5uZXIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgODg6CitZWV9SVUxFX1NFVFVQCit7CisgICB5eWx2YWwtPmxleC5zdHJpbmcgPSBOZXdQb29sVFN0cmluZyh5eXRleHQpOyAKKyAgIHJldHVybiBjaGVja190eXBlKHl5c2Nhbm5lcik7Cit9CisJWVlfQlJFQUsKK2Nhc2UgODk6CitZWV9SVUxFX1NFVFVQCit7IHl5bHZhbC0+bGV4LmkgPSBzdHJ0b2woeXl0ZXh0LCAwLCAwKTsgcmV0dXJuKElOVENPTlNUQU5UKTsgfQorCVlZX0JSRUFLCitjYXNlIDkwOgorWVlfUlVMRV9TRVRVUAoreyB5eWx2YWwtPmxleC5pID0gc3RydG9sKHl5dGV4dCwgMCwgMCk7IHJldHVybihJTlRDT05TVEFOVCk7IH0KKwlZWV9CUkVBSworY2FzZSA5MToKK1lZX1JVTEVfU0VUVVAKK3sgY29udGV4dC0+ZXJyb3IoeXlsaW5lbm8sICJJbnZhbGlkIE9jdGFsIG51bWJlci4iLCB5eXRleHQsICIiLCAiIik7IGNvbnRleHQtPnJlY292ZXIoKTsgcmV0dXJuIDA7fQorCVlZX0JSRUFLCitjYXNlIDkyOgorWVlfUlVMRV9TRVRVUAoreyB5eWx2YWwtPmxleC5pID0gc3RydG9sKHl5dGV4dCwgMCwgMCk7IHJldHVybihJTlRDT05TVEFOVCk7IH0KKwlZWV9CUkVBSworY2FzZSA5MzoKK1lZX1JVTEVfU0VUVVAKK3sgeXlsdmFsLT5sZXguZiA9IHN0YXRpY19jYXN0PGZsb2F0PihhdG9mX2RvdCh5eXRleHQpKTsgcmV0dXJuKEZMT0FUQ09OU1RBTlQpOyB9CisJWVlfQlJFQUsKK2Nhc2UgOTQ6CitZWV9SVUxFX1NFVFVQCit7IHl5bHZhbC0+bGV4LmYgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXRvZl9kb3QoeXl0ZXh0KSk7IHJldHVybihGTE9BVENPTlNUQU5UKTsgfQorCVlZX0JSRUFLCitjYXNlIDk1OgorWVlfUlVMRV9TRVRVUAoreyB5eWx2YWwtPmxleC5mID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGF0b2ZfZG90KHl5dGV4dCkpOyByZXR1cm4oRkxPQVRDT05TVEFOVCk7IH0KKwlZWV9CUkVBSworY2FzZSA5NjoKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihBRERfQVNTSUdOKTsgfQorCVlZX0JSRUFLCitjYXNlIDk3OgorWVlfUlVMRV9TRVRVUAoreyAgcmV0dXJuKFNVQl9BU1NJR04pOyB9CisJWVlfQlJFQUsKK2Nhc2UgOTg6CitZWV9SVUxFX1NFVFVQCit7ICByZXR1cm4oTVVMX0FTU0lHTik7IH0KKwlZWV9CUkVBSworY2FzZSA5OToKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihESVZfQVNTSUdOKTsgfQorCVlZX0JSRUFLCitjYXNlIDEwMDoKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihNT0RfQVNTSUdOKTsgfQorCVlZX0JSRUFLCitjYXNlIDEwMToKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihMRUZUX0FTU0lHTik7IH0KKwlZWV9CUkVBSworY2FzZSAxMDI6CitZWV9SVUxFX1NFVFVQCit7ICByZXR1cm4oUklHSFRfQVNTSUdOKTsgfQorCVlZX0JSRUFLCitjYXNlIDEwMzoKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihBTkRfQVNTSUdOKTsgfQorCVlZX0JSRUFLCitjYXNlIDEwNDoKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihYT1JfQVNTSUdOKTsgfQorCVlZX0JSRUFLCitjYXNlIDEwNToKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihPUl9BU1NJR04pOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTA2OgorWVlfUlVMRV9TRVRVUAoreyAgcmV0dXJuKElOQ19PUCk7IH0KKwlZWV9CUkVBSworY2FzZSAxMDc6CitZWV9SVUxFX1NFVFVQCit7ICByZXR1cm4oREVDX09QKTsgfQorCVlZX0JSRUFLCitjYXNlIDEwODoKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihBTkRfT1ApOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTA5OgorWVlfUlVMRV9TRVRVUAoreyAgcmV0dXJuKE9SX09QKTsgfQorCVlZX0JSRUFLCitjYXNlIDExMDoKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihYT1JfT1ApOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTExOgorWVlfUlVMRV9TRVRVUAoreyAgcmV0dXJuKExFX09QKTsgfQorCVlZX0JSRUFLCitjYXNlIDExMjoKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihHRV9PUCk7IH0KKwlZWV9CUkVBSworY2FzZSAxMTM6CitZWV9SVUxFX1NFVFVQCit7ICByZXR1cm4oRVFfT1ApOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTE0OgorWVlfUlVMRV9TRVRVUAoreyAgcmV0dXJuKE5FX09QKTsgfQorCVlZX0JSRUFLCitjYXNlIDExNToKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihMRUZUX09QKTsgfQorCVlZX0JSRUFLCitjYXNlIDExNjoKK1lZX1JVTEVfU0VUVVAKK3sgIHJldHVybihSSUdIVF9PUCk7IH0KKwlZWV9CUkVBSworY2FzZSAxMTc6CitZWV9SVUxFX1NFVFVQCit7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IGZhbHNlOyByZXR1cm4oU0VNSUNPTE9OKTsgfQorCVlZX0JSRUFLCitjYXNlIDExODoKK1lZX1JVTEVfU0VUVVAKK3sgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gZmFsc2U7IHJldHVybihMRUZUX0JSQUNFKTsgfQorCVlZX0JSRUFLCitjYXNlIDExOToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKFJJR0hUX0JSQUNFKTsgfQorCVlZX0JSRUFLCitjYXNlIDEyMDoKK1lZX1JVTEVfU0VUVVAKK3sgaWYgKGNvbnRleHQtPmluVHlwZVBhcmVuKSBjb250ZXh0LT5sZXhBZnRlclR5cGUgPSBmYWxzZTsgcmV0dXJuKENPTU1BKTsgfQorCVlZX0JSRUFLCitjYXNlIDEyMToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKENPTE9OKTsgfQorCVlZX0JSRUFLCitjYXNlIDEyMjoKK1lZX1JVTEVfU0VUVVAKK3sgY29udGV4dC0+bGV4QWZ0ZXJUeXBlID0gZmFsc2U7IHJldHVybihFUVVBTCk7IH0KKwlZWV9CUkVBSworY2FzZSAxMjM6CitZWV9SVUxFX1NFVFVQCit7IGNvbnRleHQtPmxleEFmdGVyVHlwZSA9IGZhbHNlOyBjb250ZXh0LT5pblR5cGVQYXJlbiA9IHRydWU7IHJldHVybihMRUZUX1BBUkVOKTsgfQorCVlZX0JSRUFLCitjYXNlIDEyNDoKK1lZX1JVTEVfU0VUVVAKK3sgY29udGV4dC0+aW5UeXBlUGFyZW4gPSBmYWxzZTsgcmV0dXJuKFJJR0hUX1BBUkVOKTsgfQorCVlZX0JSRUFLCitjYXNlIDEyNToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKExFRlRfQlJBQ0tFVCk7IH0KKwlZWV9CUkVBSworY2FzZSAxMjY6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihSSUdIVF9CUkFDS0VUKTsgfQorCVlZX0JSRUFLCitjYXNlIDEyNzoKK1lZX1JVTEVfU0VUVVAKK3sgQkVHSU4oRklFTERTKTsgIHJldHVybihET1QpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTI4OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oQkFORyk7IH0KKwlZWV9CUkVBSworY2FzZSAxMjk6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihEQVNIKTsgfQorCVlZX0JSRUFLCitjYXNlIDEzMDoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKFRJTERFKTsgfQorCVlZX0JSRUFLCitjYXNlIDEzMToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKFBMVVMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTMyOgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oU1RBUik7IH0KKwlZWV9CUkVBSworY2FzZSAxMzM6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihTTEFTSCk7IH0KKwlZWV9CUkVBSworY2FzZSAxMzQ6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihQRVJDRU5UKTsgfQorCVlZX0JSRUFLCitjYXNlIDEzNToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKExFRlRfQU5HTEUpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM2OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oUklHSFRfQU5HTEUpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM3OgorWVlfUlVMRV9TRVRVUAoreyByZXR1cm4oVkVSVElDQUxfQkFSKTsgfQorCVlZX0JSRUFLCitjYXNlIDEzODoKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKENBUkVUKTsgfQorCVlZX0JSRUFLCitjYXNlIDEzOToKK1lZX1JVTEVfU0VUVVAKK3sgcmV0dXJuKEFNUEVSU0FORCk7IH0KKwlZWV9CUkVBSworY2FzZSAxNDA6CitZWV9SVUxFX1NFVFVQCit7IHJldHVybihRVUVTVElPTik7IH0KKwlZWV9CUkVBSworY2FzZSAxNDE6CitZWV9SVUxFX1NFVFVQCit7IAorICAgIEJFR0lOKElOSVRJQUwpOworICAgIHl5bHZhbC0+bGV4LnN0cmluZyA9IE5ld1Bvb2xUU3RyaW5nKHl5dGV4dCk7IAorICAgIHJldHVybiBGSUVMRF9TRUxFQ1RJT047Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTQyOgorWVlfUlVMRV9TRVRVUAore30KKwlZWV9CUkVBSworY2FzZSAxNDM6CisvKiBydWxlIDE0MyBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCit7ICB9CisJWVlfQlJFQUsKK2Nhc2UgWVlfU1RBVEVfRU9GKElOSVRJQUwpOgorY2FzZSBZWV9TVEFURV9FT0YoQ09NTUVOVCk6CitjYXNlIFlZX1NUQVRFX0VPRihGSUVMRFMpOgoreyBjb250ZXh0LT5BZnRlckVPRiA9IHRydWU7IHl5dGVybWluYXRlKCk7IH0KKwlZWV9CUkVBSworY2FzZSAxNDQ6CitZWV9SVUxFX1NFVFVQCit7IGNvbnRleHQtPndhcm5pbmcoeXlsaW5lbm8sICJVbmtub3duIGNoYXIiLCB5eXRleHQsICIiKTsgcmV0dXJuIDA7IH0KKwlZWV9CUkVBSworY2FzZSAxNDU6CitZWV9SVUxFX1NFVFVQCitFQ0hPOworCVlZX0JSRUFLCisKKwljYXNlIFlZX0VORF9PRl9CVUZGRVI6CisJCXsKKwkJLyogQW1vdW50IG9mIHRleHQgbWF0Y2hlZCBub3QgaW5jbHVkaW5nIHRoZSBFT0IgY2hhci4gKi8KKwkJaW50IHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQgPSAoaW50KSAoeXlfY3AgLSB5eWctPnl5dGV4dF9wdHIpIC0gMTsKKworCQkvKiBVbmRvIHRoZSBlZmZlY3RzIG9mIFlZX0RPX0JFRk9SRV9BQ1RJT04uICovCisJCSp5eV9jcCA9IHl5Zy0+eXlfaG9sZF9jaGFyOworCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCisKKwkJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPT0gWVlfQlVGRkVSX05FVyApCisJCQl7CisJCQkvKiBXZSdyZSBzY2FubmluZyBhIG5ldyBmaWxlIG9yIGlucHV0IHNvdXJjZS4gIEl0J3MKKwkJCSAqIHBvc3NpYmxlIHRoYXQgdGhpcyBoYXBwZW5lZCBiZWNhdXNlIHRoZSB1c2VyCisJCQkgKiBqdXN0IHBvaW50ZWQgeXlpbiBhdCBhIG5ldyBzb3VyY2UgYW5kIGNhbGxlZAorCQkJICogeXlsZXgoKS4gIElmIHNvLCB0aGVuIHdlIGhhdmUgdG8gYXNzdXJlCisJCQkgKiBjb25zaXN0ZW5jeSBiZXR3ZWVuIFlZX0NVUlJFTlRfQlVGRkVSIGFuZCBvdXIKKwkJCSAqIGdsb2JhbHMuICBIZXJlIGlzIHRoZSByaWdodCBwbGFjZSB0byBkbyBzbywgYmVjYXVzZQorCQkJICogdGhpcyBpcyB0aGUgZmlyc3QgYWN0aW9uIChvdGhlciB0aGFuIHBvc3NpYmx5IGEKKwkJCSAqIGJhY2stdXApIHRoYXQgd2lsbCBtYXRjaCBmb3IgdGhlIG5ldyBpbnB1dCBzb3VyY2UuCisJCQkgKi8KKwkJCXl5Zy0+eXlfbl9jaGFycyA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZSA9IHl5aW47CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTk9STUFMOworCQkJfQorCisJCS8qIE5vdGUgdGhhdCBoZXJlIHdlIHRlc3QgZm9yIHl5X2NfYnVmX3AgIjw9IiB0byB0aGUgcG9zaXRpb24KKwkJICogb2YgdGhlIGZpcnN0IEVPQiBpbiB0aGUgYnVmZmVyLCBzaW5jZSB5eV9jX2J1Zl9wIHdpbGwKKwkJICogYWxyZWFkeSBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgcGFzdCB0aGUgTlVMIGNoYXJhY3RlcgorCQkgKiAoc2luY2UgYWxsIHN0YXRlcyBtYWtlIHRyYW5zaXRpb25zIG9uIEVPQiB0byB0aGUKKwkJICogZW5kLW9mLWJ1ZmZlciBzdGF0ZSkuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIHRlc3QKKwkJICogaW4gaW5wdXQoKS4KKwkJICovCisJCWlmICggeXlnLT55eV9jX2J1Zl9wIDw9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1Zlt5eWctPnl5X25fY2hhcnNdICkKKwkJCXsgLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLworCQkJeXlfc3RhdGVfdHlwZSB5eV9uZXh0X3N0YXRlOworCisJCQl5eWctPnl5X2NfYnVmX3AgPSB5eWctPnl5dGV4dF9wdHIgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OworCisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCB5eXNjYW5uZXIgKTsKKworCQkJLyogT2theSwgd2UncmUgbm93IHBvc2l0aW9uZWQgdG8gbWFrZSB0aGUgTlVMCisJCQkgKiB0cmFuc2l0aW9uLiAgV2UgY291bGRuJ3QgaGF2ZQorCQkJICogeXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCkgZ28gYWhlYWQgYW5kIGRvIGl0CisJCQkgKiBmb3IgdXMgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgaG93IHRvIGRlYWwKKwkJCSAqIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIGphbW1pbmcgKGFuZCB3ZSBkb24ndAorCQkJICogd2FudCB0byBidWlsZCBqYW1taW5nIGludG8gaXQgYmVjYXVzZSB0aGVuIGl0CisJCQkgKiB3aWxsIHJ1biBtb3JlIHNsb3dseSkuCisJCQkgKi8KKworCQkJeXlfbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIHl5X2N1cnJlbnRfc3RhdGUgLCB5eXNjYW5uZXIpOworCisJCQl5eV9icCA9IHl5Zy0+eXl0ZXh0X3B0ciArIFlZX01PUkVfQURKOworCisJCQlpZiAoIHl5X25leHRfc3RhdGUgKQorCQkJCXsKKwkJCQkvKiBDb25zdW1lIHRoZSBOVUwuICovCisJCQkJeXlfY3AgPSArK3l5Zy0+eXlfY19idWZfcDsKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbmV4dF9zdGF0ZTsKKwkJCQlnb3RvIHl5X21hdGNoOworCQkJCX0KKworCQkJZWxzZQorCQkJCXsKKwkJCQl5eV9jcCA9IHl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfY3BvczsKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlnLT55eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJCX0KKwkJCX0KKworCQllbHNlIHN3aXRjaCAoIHl5X2dldF9uZXh0X2J1ZmZlciggeXlzY2FubmVyICkgKQorCQkJeworCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCXsKKwkJCQl5eWctPnl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZiA9IDA7CisKKwkJCQlpZiAoIHl5d3JhcCh5eXNjYW5uZXIgKSApCisJCQkJCXsKKwkJCQkJLyogTm90ZTogYmVjYXVzZSB3ZSd2ZSB0YWtlbiBjYXJlIGluCisJCQkJCSAqIHl5X2dldF9uZXh0X2J1ZmZlcigpIHRvIGhhdmUgc2V0IHVwCisJCQkJCSAqIHl5dGV4dCwgd2UgY2FuIG5vdyBzZXQgdXAKKwkJCQkJICogeXlfY19idWZfcCBzbyB0aGF0IGlmIHNvbWUgdG90YWwKKwkJCQkJICogaG9zZXIgKGxpa2UgZmxleCBpdHNlbGYpIHdhbnRzIHRvCisJCQkJCSAqIGNhbGwgdGhlIHNjYW5uZXIgYWZ0ZXIgd2UgcmV0dXJuIHRoZQorCQkJCQkgKiBZWV9OVUxMLCBpdCdsbCBzdGlsbCB3b3JrIC0gYW5vdGhlcgorCQkJCQkgKiBZWV9OVUxMIHdpbGwgZ2V0IHJldHVybmVkLgorCQkJCQkgKi8KKwkJCQkJeXlnLT55eV9jX2J1Zl9wID0geXlnLT55eXRleHRfcHRyICsgWVlfTU9SRV9BREo7CisKKwkJCQkJeXlfYWN0ID0gWVlfU1RBVEVfRU9GKFlZX1NUQVJUKTsKKwkJCQkJZ290byBkb19hY3Rpb247CisJCQkJCX0KKworCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoICEgeXlnLT55eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisJCQkJCX0KKwkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCXl5Zy0+eXlfY19idWZfcCA9CisJCQkJCXl5Zy0+eXl0ZXh0X3B0ciArIHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQ7CisKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCB5eXNjYW5uZXIgKTsKKworCQkJCXl5X2NwID0geXlnLT55eV9jX2J1Zl9wOworCQkJCXl5X2JwID0geXlnLT55eXRleHRfcHRyICsgWVlfTU9SRV9BREo7CisJCQkJZ290byB5eV9tYXRjaDsKKworCQkJY2FzZSBFT0JfQUNUX0xBU1RfTUFUQ0g6CisJCQkJeXlnLT55eV9jX2J1Zl9wID0KKwkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbeXlnLT55eV9uX2NoYXJzXTsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoIHl5c2Nhbm5lciApOworCisJCQkJeXlfY3AgPSB5eWctPnl5X2NfYnVmX3A7CisJCQkJeXlfYnAgPSB5eWctPnl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJfQorCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJWVlfRkFUQUxfRVJST1IoCisJCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1ubyBhY3Rpb24gZm91bmQiICk7CisJfSAvKiBlbmQgb2YgYWN0aW9uIHN3aXRjaCAqLworCQl9IC8qIGVuZCBvZiBzY2FubmluZyBvbmUgdG9rZW4gKi8KK30gLyogZW5kIG9mIHl5bGV4ICovCisKKy8qIHl5X2dldF9uZXh0X2J1ZmZlciAtIHRyeSB0byByZWFkIGluIGEgbmV3IGJ1ZmZlcgorICoKKyAqIFJldHVybnMgYSBjb2RlIHJlcHJlc2VudGluZyBhbiBhY3Rpb246CisgKglFT0JfQUNUX0xBU1RfTUFUQ0ggLQorICoJRU9CX0FDVF9DT05USU5VRV9TQ0FOIC0gY29udGludWUgc2Nhbm5pbmcgZnJvbSBjdXJyZW50IHBvc2l0aW9uCisgKglFT0JfQUNUX0VORF9PRl9GSUxFIC0gZW5kIG9mIGZpbGUKKyAqLworc3RhdGljIGludCB5eV9nZXRfbmV4dF9idWZmZXIgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisJcmVnaXN0ZXIgY2hhciAqZGVzdCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmOworCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9IHl5Zy0+eXl0ZXh0X3B0cjsKKwlyZWdpc3RlciBpbnQgbnVtYmVyX3RvX21vdmUsIGk7CisJaW50IHJldF92YWw7CisKKwlpZiAoIHl5Zy0+eXlfY19idWZfcCA+ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1Zlt5eWctPnl5X25fY2hhcnMgKyAxXSApCisJCVlZX0ZBVEFMX0VSUk9SKAorCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1lbmQgb2YgYnVmZmVyIG1pc3NlZCIgKTsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9maWxsX2J1ZmZlciA9PSAwICkKKwkJeyAvKiBEb24ndCB0cnkgdG8gZmlsbCB0aGUgYnVmZmVyLCBzbyB0aGlzIGlzIGFuIEVPRi4gKi8KKwkJaWYgKCB5eWctPnl5X2NfYnVmX3AgLSB5eWctPnl5dGV4dF9wdHIgLSBZWV9NT1JFX0FESiA9PSAxICkKKwkJCXsKKwkJCS8qIFdlIG1hdGNoZWQgYSBzaW5nbGUgY2hhcmFjdGVyLCB0aGUgRU9CLCBzbworCQkJICogdHJlYXQgdGhpcyBhcyBhIGZpbmFsIEVPRi4KKwkJCSAqLworCQkJcmV0dXJuIEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl9CisKKwkJZWxzZQorCQkJeworCQkJLyogV2UgbWF0Y2hlZCBzb21lIHRleHQgcHJpb3IgdG8gdGhlIEVPQiwgZmlyc3QKKwkJCSAqIHByb2Nlc3MgaXQuCisJCQkgKi8KKwkJCXJldHVybiBFT0JfQUNUX0xBU1RfTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIFRyeSB0byByZWFkIG1vcmUgZGF0YS4gKi8KKworCS8qIEZpcnN0IG1vdmUgbGFzdCBjaGFycyB0byBzdGFydCBvZiBidWZmZXIuICovCisJbnVtYmVyX3RvX21vdmUgPSAoaW50KSAoeXlnLT55eV9jX2J1Zl9wIC0geXlnLT55eXRleHRfcHRyKSAtIDE7CisKKwlmb3IgKCBpID0gMDsgaSA8IG51bWJlcl90b19tb3ZlOyArK2kgKQorCQkqKGRlc3QrKykgPSAqKHNvdXJjZSsrKTsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9FT0ZfUEVORElORyApCisJCS8qIGRvbid0IGRvIHRoZSByZWFkLCBpdCdzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhbiBFT0YsCisJCSAqIGp1c3QgZm9yY2UgYW4gRU9GCisJCSAqLworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSB5eWctPnl5X25fY2hhcnMgPSAwOworCisJZWxzZQorCQl7CisJCQlpbnQgbnVtX3RvX3JlYWQgPQorCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSAtIG51bWJlcl90b19tb3ZlIC0gMTsKKworCQl3aGlsZSAoIG51bV90b19yZWFkIDw9IDAgKQorCQkJeyAvKiBOb3QgZW5vdWdoIHJvb20gaW4gdGhlIGJ1ZmZlciAtIGdyb3cgaXQuICovCisKKwkJCS8qIGp1c3QgYSBzaG9ydGVyIG5hbWUgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCQkJWVlfQlVGRkVSX1NUQVRFIGIgPSBZWV9DVVJSRU5UX0JVRkZFUjsKKworCQkJaW50IHl5X2NfYnVmX3Bfb2Zmc2V0ID0KKwkJCQkoaW50KSAoeXlnLT55eV9jX2J1Zl9wIC0gYi0+eXlfY2hfYnVmKTsKKworCQkJaWYgKCBiLT55eV9pc19vdXJfYnVmZmVyICkKKwkJCQl7CisJCQkJaW50IG5ld19zaXplID0gYi0+eXlfYnVmX3NpemUgKiAyOworCisJCQkJaWYgKCBuZXdfc2l6ZSA8PSAwICkKKwkJCQkJYi0+eXlfYnVmX3NpemUgKz0gYi0+eXlfYnVmX3NpemUgLyA4OworCQkJCWVsc2UKKwkJCQkJYi0+eXlfYnVmX3NpemUgKj0gMjsKKworCQkJCWItPnl5X2NoX2J1ZiA9IChjaGFyICopCisJCQkJCS8qIEluY2x1ZGUgcm9vbSBpbiBmb3IgMiBFT0IgY2hhcnMuICovCisJCQkJCXl5cmVhbGxvYygodm9pZCAqKSBiLT55eV9jaF9idWYsYi0+eXlfYnVmX3NpemUgKyAyICx5eXNjYW5uZXIgKTsKKwkJCQl9CisJCQllbHNlCisJCQkJLyogQ2FuJ3QgZ3JvdyBpdCwgd2UgZG9uJ3Qgb3duIGl0LiAqLworCQkJCWItPnl5X2NoX2J1ZiA9IDA7CisKKwkJCWlmICggISBiLT55eV9jaF9idWYgKQorCQkJCVlZX0ZBVEFMX0VSUk9SKAorCQkJCSJmYXRhbCBlcnJvciAtIHNjYW5uZXIgaW5wdXQgYnVmZmVyIG92ZXJmbG93IiApOworCisJCQl5eWctPnl5X2NfYnVmX3AgPSAmYi0+eXlfY2hfYnVmW3l5X2NfYnVmX3Bfb2Zmc2V0XTsKKworCQkJbnVtX3RvX3JlYWQgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplIC0KKwkJCQkJCW51bWJlcl90b19tb3ZlIC0gMTsKKworCQkJfQorCisJCWlmICggbnVtX3RvX3JlYWQgPiBZWV9SRUFEX0JVRl9TSVpFICkKKwkJCW51bV90b19yZWFkID0gWVlfUkVBRF9CVUZfU0laRTsKKworCQkvKiBSZWFkIGluIG1vcmUgZGF0YS4gKi8KKwkJWVlfSU5QVVQoICgmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbbnVtYmVyX3RvX21vdmVdKSwKKwkJCXl5Zy0+eXlfbl9jaGFycywgKHNpemVfdCkgbnVtX3RvX3JlYWQgKTsKKworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSB5eWctPnl5X25fY2hhcnM7CisJCX0KKworCWlmICggeXlnLT55eV9uX2NoYXJzID09IDAgKQorCQl7CisJCWlmICggbnVtYmVyX3RvX21vdmUgPT0gWVlfTU9SRV9BREogKQorCQkJeworCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl5eXJlc3RhcnQoeXlpbiAgLHl5c2Nhbm5lcik7CisJCQl9CisKKwkJZWxzZQorCQkJeworCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfTEFTVF9NQVRDSDsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9CisJCQkJWVlfQlVGRkVSX0VPRl9QRU5ESU5HOworCQkJfQorCQl9CisKKwllbHNlCisJCXJldF92YWwgPSBFT0JfQUNUX0NPTlRJTlVFX1NDQU47CisKKwlpZiAoKHl5X3NpemVfdCkgKHl5Zy0+eXlfbl9jaGFycyArIG51bWJlcl90b19tb3ZlKSA+IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUpIHsKKwkJLyogRXh0ZW5kIHRoZSBhcnJheSBieSA1MCUsIHBsdXMgdGhlIG51bWJlciB3ZSByZWFsbHkgbmVlZC4gKi8KKwkJeXlfc2l6ZV90IG5ld19zaXplID0geXlnLT55eV9uX2NoYXJzICsgbnVtYmVyX3RvX21vdmUgKyAoeXlnLT55eV9uX2NoYXJzID4+IDEpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiA9IChjaGFyICopIHl5cmVhbGxvYygodm9pZCAqKSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZixuZXdfc2l6ZSAseXlzY2FubmVyICk7CisJCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiApCisJCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKSIgKTsKKwl9CisKKwl5eWctPnl5X25fY2hhcnMgKz0gbnVtYmVyX3RvX21vdmU7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbeXlnLT55eV9uX2NoYXJzXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1Zlt5eWctPnl5X25fY2hhcnMgKyAxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCXl5Zy0+eXl0ZXh0X3B0ciA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlswXTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUgLSBnZXQgdGhlIHN0YXRlIGp1c3QgYmVmb3JlIHRoZSBFT0IgY2hhciB3YXMgcmVhY2hlZCAqLworCisgICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisJcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwOworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKworCXl5X2N1cnJlbnRfc3RhdGUgPSB5eWctPnl5X3N0YXJ0OworCisJZm9yICggeXlfY3AgPSB5eWctPnl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsgeXlfY3AgPCB5eWctPnl5X2NfYnVmX3A7ICsreXlfY3AgKQorCQl7CisJCXJlZ2lzdGVyIFlZX0NIQVIgeXlfYyA9ICgqeXlfY3AgPyB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXSA6IDEpOworCQlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCisJCQl7CisJCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCXl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfY3BvcyA9IHl5X2NwOworCQkJfQorCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCisJCQl7CisJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOworCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDQxMSApCisJCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CisJCQl9CisJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQl9CisKKwlyZXR1cm4geXlfY3VycmVudF9zdGF0ZTsKK30KKworLyogeXlfdHJ5X05VTF90cmFucyAtIHRyeSB0byBtYWtlIGEgdHJhbnNpdGlvbiBvbiB0aGUgTlVMIGNoYXJhY3RlcgorICoKKyAqIHN5bm9wc2lzCisgKgluZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggY3VycmVudF9zdGF0ZSApOworICovCisgICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAgKHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKwlyZWdpc3RlciBpbnQgeXlfaXNfamFtOworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsgLyogVGhpcyB2YXIgbWF5IGJlIHVudXNlZCBkZXBlbmRpbmcgdXBvbiBvcHRpb25zLiAqLworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwID0geXlnLT55eV9jX2J1Zl9wOworCisJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0gMTsKKwlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCisJCXsKKwkJeXlnLT55eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSA9IHl5X2N1cnJlbnRfc3RhdGU7CisJCXl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfY3BvcyA9IHl5X2NwOworCQl9CisJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQorCQl7CisJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07CisJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA0MTEgKQorCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CisJCX0KKwl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyAodW5zaWduZWQgaW50KSB5eV9jXTsKKwl5eV9pc19qYW0gPSAoeXlfY3VycmVudF9zdGF0ZSA9PSA0MTApOworCisJcmV0dXJuIHl5X2lzX2phbSA/IDAgOiB5eV9jdXJyZW50X3N0YXRlOworfQorCisjaWZuZGVmIFlZX05PX0lOUFVUCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBzdGF0aWMgaW50IHl5aW5wdXQgKHl5c2Nhbl90IHl5c2Nhbm5lcikKKyNlbHNlCisgICAgc3RhdGljIGludCBpbnB1dCAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKKyNlbmRpZgorCit7CisJaW50IGM7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisJKnl5Zy0+eXlfY19idWZfcCA9IHl5Zy0+eXlfaG9sZF9jaGFyOworCisJaWYgKCAqeXlnLT55eV9jX2J1Zl9wID09IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCXsKKwkJLyogeXlfY19idWZfcCBub3cgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgd2Ugd2FudCB0byByZXR1cm4uCisJCSAqIElmIHRoaXMgb2NjdXJzICpiZWZvcmUqIHRoZSBFT0IgY2hhcmFjdGVycywgdGhlbiBpdCdzIGEKKwkJICogdmFsaWQgTlVMOyBpZiBub3QsIHRoZW4gd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICggeXlnLT55eV9jX2J1Zl9wIDwgJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW3l5Zy0+eXlfbl9jaGFyc10gKQorCQkJLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLworCQkJKnl5Zy0+eXlfY19idWZfcCA9ICdcMCc7CisKKwkJZWxzZQorCQkJeyAvKiBuZWVkIG1vcmUgaW5wdXQgKi8KKwkJCWludCBvZmZzZXQgPSB5eWctPnl5X2NfYnVmX3AgLSB5eWctPnl5dGV4dF9wdHI7CisJCQkrK3l5Zy0+eXlfY19idWZfcDsKKworCQkJc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCB5eXNjYW5uZXIgKSApCisJCQkJeworCQkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCQkvKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB5eV9nX25fYigpCisJCQkJCSAqIHNlZXMgdGhhdCB3ZSd2ZSBhY2N1bXVsYXRlZCBhCisJCQkJCSAqIHRva2VuIGFuZCBmbGFncyB0aGF0IHdlIG5lZWQgdG8KKwkJCQkJICogdHJ5IG1hdGNoaW5nIHRoZSB0b2tlbiBiZWZvcmUKKwkJCQkJICogcHJvY2VlZGluZy4gIEJ1dCBmb3IgaW5wdXQoKSwKKwkJCQkJICogdGhlcmUncyBubyBtYXRjaGluZyB0byBjb25zaWRlci4KKwkJCQkJICogU28gY29udmVydCB0aGUgRU9CX0FDVF9MQVNUX01BVENICisJCQkJCSAqIHRvIEVPQl9BQ1RfRU5EX09GX0ZJTEUuCisJCQkJCSAqLworCisJCQkJCS8qIFJlc2V0IGJ1ZmZlciBzdGF0dXMuICovCisJCQkJCXl5cmVzdGFydCh5eWluICx5eXNjYW5uZXIpOworCisJCQkJCS8qRkFMTFRIUk9VR0gqLworCisJCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCQl7CisJCQkJCWlmICggeXl3cmFwKHl5c2Nhbm5lciApICkKKwkJCQkJCXJldHVybiBFT0Y7CisKKwkJCQkJaWYgKCAhIHl5Zy0+eXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mICkKKwkJCQkJCVlZX05FV19GSUxFOworI2lmZGVmIF9fY3BsdXNwbHVzCisJCQkJCXJldHVybiB5eWlucHV0KHl5c2Nhbm5lcik7CisjZWxzZQorCQkJCQlyZXR1cm4gaW5wdXQoeXlzY2FubmVyKTsKKyNlbmRpZgorCQkJCQl9CisKKwkJCQljYXNlIEVPQl9BQ1RfQ09OVElOVUVfU0NBTjoKKwkJCQkJeXlnLT55eV9jX2J1Zl9wID0geXlnLT55eXRleHRfcHRyICsgb2Zmc2V0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCWMgPSAqKHVuc2lnbmVkIGNoYXIgKikgeXlnLT55eV9jX2J1Zl9wOwkvKiBjYXN0IGZvciA4LWJpdCBjaGFyJ3MgKi8KKwkqeXlnLT55eV9jX2J1Zl9wID0gJ1wwJzsJLyogcHJlc2VydmUgeXl0ZXh0ICovCisJeXlnLT55eV9ob2xkX2NoYXIgPSAqKyt5eWctPnl5X2NfYnVmX3A7CisKKwlpZiAoIGMgPT0gJ1xuJyApCisJCSAgIAorICAgIGRveyB5eWxpbmVubysrOworICAgICAgICB5eWNvbHVtbj0wOworICAgIH13aGlsZSgwKQorOworCisJcmV0dXJuIGM7Cit9CisjZW5kaWYJLyogaWZuZGVmIFlZX05PX0lOUFVUICovCisKKy8qKiBJbW1lZGlhdGVseSBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgc3RyZWFtLgorICogQHBhcmFtIGlucHV0X2ZpbGUgQSByZWFkYWJsZSBzdHJlYW0uCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVzZXQgdGhlIHN0YXJ0IGNvbmRpdGlvbiB0byBAYyBJTklUSUFMIC4KKyAqLworICAgIHZvaWQgeXlyZXN0YXJ0ICAoRklMRSAqIGlucHV0X2ZpbGUgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7CisgICAgICAgIHl5ZW5zdXJlX2J1ZmZlcl9zdGFjayAoeXlzY2FubmVyKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0KKyAgICAgICAgICAgIHl5X2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSAseXlzY2FubmVyKTsKKwl9CisKKwl5eV9pbml0X2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUixpbnB1dF9maWxlICx5eXNjYW5uZXIpOworCXl5X2xvYWRfYnVmZmVyX3N0YXRlKHl5c2Nhbm5lciApOworfQorCisvKiogU3dpdGNoIHRvIGEgZGlmZmVyZW50IGlucHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSBuZXdfYnVmZmVyIFRoZSBuZXcgaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KKyAgICB2b2lkIHl5X3N3aXRjaF90b19idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIG5ld19idWZmZXIgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisJLyogVE9ETy4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVwbGFjZSB0aGlzIGVudGlyZSBmdW5jdGlvbiBib2R5CisJICogd2l0aAorCSAqCQl5eXBvcF9idWZmZXJfc3RhdGUoKTsKKwkgKgkJeXlwdXNoX2J1ZmZlcl9zdGF0ZShuZXdfYnVmZmVyKTsKKyAgICAgKi8KKwl5eWVuc3VyZV9idWZmZXJfc3RhY2sgKHl5c2Nhbm5lcik7CisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiA9PSBuZXdfYnVmZmVyICkKKwkJcmV0dXJuOworCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCisJCXsKKwkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLworCQkqeXlnLT55eV9jX2J1Zl9wID0geXlnLT55eV9ob2xkX2NoYXI7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9IHl5Zy0+eXlfY19idWZfcDsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0geXlnLT55eV9uX2NoYXJzOworCQl9CisKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBuZXdfYnVmZmVyOworCXl5X2xvYWRfYnVmZmVyX3N0YXRlKHl5c2Nhbm5lciApOworCisJLyogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyB3aGV0aGVyIHdlIGRpZCB0aGlzIHN3aXRjaCBkdXJpbmcKKwkgKiBFT0YgKHl5d3JhcCgpKSBwcm9jZXNzaW5nLCBidXQgdGhlIG9ubHkgdGltZSB0aGlzIGZsYWcKKwkgKiBpcyBsb29rZWQgYXQgaXMgYWZ0ZXIgeXl3cmFwKCkgaXMgY2FsbGVkLCBzbyBpdCdzIHNhZmUKKwkgKiB0byBnbyBhaGVhZCBhbmQgYWx3YXlzIHNldCBpdC4KKwkgKi8KKwl5eWctPnl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZiA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHl5X2xvYWRfYnVmZmVyX3N0YXRlICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKwl5eWctPnl5X25fY2hhcnMgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnM7CisJeXlnLT55eXRleHRfcHRyID0geXlnLT55eV9jX2J1Zl9wID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zOworCXl5aW4gPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lucHV0X2ZpbGU7CisJeXlnLT55eV9ob2xkX2NoYXIgPSAqeXlnLT55eV9jX2J1Zl9wOworfQorCisvKiogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gaW5wdXQgYnVmZmVyIHN0YXRlLgorICogQHBhcmFtIGZpbGUgQSByZWFkYWJsZSBzdHJlYW0uCisgKiBAcGFyYW0gc2l6ZSBUaGUgY2hhcmFjdGVyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLiBXaGVuIGluIGRvdWJ0LCB1c2UgQGMgWVlfQlVGX1NJWkUuCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KKyAqIEByZXR1cm4gdGhlIGFsbG9jYXRlZCBidWZmZXIgc3RhdGUuCisgKi8KKyAgICBZWV9CVUZGRVJfU1RBVEUgeXlfY3JlYXRlX2J1ZmZlciAgKEZJTEUgKiBmaWxlLCBpbnQgIHNpemUgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisgICAgCisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHl5YWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgLHl5c2Nhbm5lciApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpIiApOworCisJYi0+eXlfYnVmX3NpemUgPSBzaXplOworCisJLyogeXlfY2hfYnVmIGhhcyB0byBiZSAyIGNoYXJhY3RlcnMgbG9uZ2VyIHRoYW4gdGhlIHNpemUgZ2l2ZW4gYmVjYXVzZQorCSAqIHdlIG5lZWQgdG8gcHV0IGluIDIgZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLgorCSAqLworCWItPnl5X2NoX2J1ZiA9IChjaGFyICopIHl5YWxsb2MoYi0+eXlfYnVmX3NpemUgKyAyICx5eXNjYW5uZXIgKTsKKwlpZiAoICEgYi0+eXlfY2hfYnVmICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpIiApOworCisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7CisKKwl5eV9pbml0X2J1ZmZlcihiLGZpbGUgLHl5c2Nhbm5lcik7CisKKwlyZXR1cm4gYjsKK30KKworLyoqIERlc3Ryb3kgdGhlIGJ1ZmZlci4KKyAqIEBwYXJhbSBiIGEgYnVmZmVyIGNyZWF0ZWQgd2l0aCB5eV9jcmVhdGVfYnVmZmVyKCkKKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCisgICAgdm9pZCB5eV9kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKSAvKiBOb3Qgc3VyZSBpZiB3ZSBzaG91bGQgcG9wIGhlcmUuICovCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IChZWV9CVUZGRVJfU1RBVEUpIDA7CisKKwlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQl5eWZyZWUoKHZvaWQgKikgYi0+eXlfY2hfYnVmICx5eXNjYW5uZXIgKTsKKworCXl5ZnJlZSgodm9pZCAqKSBiICx5eXNjYW5uZXIgKTsKK30KKworLyogSW5pdGlhbGl6ZXMgb3IgcmVpbml0aWFsaXplcyBhIGJ1ZmZlci4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgc29tZXRpbWVzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBidWZmZXIsCisgKiBzdWNoIGFzIGR1cmluZyBhIHl5cmVzdGFydCgpIG9yIGF0IEVPRi4KKyAqLworICAgIHN0YXRpYyB2b2lkIHl5X2luaXRfYnVmZmVyICAoWVlfQlVGRkVSX1NUQVRFICBiLCBGSUxFICogZmlsZSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKKworeworCWludCBvZXJybm8gPSBlcnJubzsKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKKwl5eV9mbHVzaF9idWZmZXIoYiAseXlzY2FubmVyKTsKKworCWItPnl5X2lucHV0X2ZpbGUgPSBmaWxlOworCWItPnl5X2ZpbGxfYnVmZmVyID0gMTsKKworICAgIC8qIElmIGIgaXMgdGhlIGN1cnJlbnQgYnVmZmVyLCB0aGVuIHl5X2luaXRfYnVmZmVyIHdhcyBfcHJvYmFibHlfCisgICAgICogY2FsbGVkIGZyb20geXlyZXN0YXJ0KCkgb3IgdGhyb3VnaCB5eV9nZXRfbmV4dF9idWZmZXIuCisgICAgICogSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHJlc2V0IHRoZSBsaW5lbm8gb3IgY29sdW1uLgorICAgICAqLworICAgIGlmIChiICE9IFlZX0NVUlJFTlRfQlVGRkVSKXsKKyAgICAgICAgYi0+eXlfYnNfbGluZW5vID0gMTsKKyAgICAgICAgYi0+eXlfYnNfY29sdW1uID0gMDsKKyAgICB9CisKKyAgICAgICAgYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAwOworICAgIAorCWVycm5vID0gb2Vycm5vOworfQorCisvKiogRGlzY2FyZCBhbGwgYnVmZmVyZWQgY2hhcmFjdGVycy4gT24gdGhlIG5leHQgc2NhbiwgWVlfSU5QVVQgd2lsbCBiZSBjYWxsZWQuCisgKiBAcGFyYW0gYiB0aGUgYnVmZmVyIHN0YXRlIHRvIGJlIGZsdXNoZWQsIHVzdWFsbHkgQGMgWVlfQ1VSUkVOVF9CVUZGRVIuCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KKyAqLworICAgIHZvaWQgeXlfZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCWlmICggISBiICkKKwkJcmV0dXJuOworCisJYi0+eXlfbl9jaGFycyA9IDA7CisKKwkvKiBXZSBhbHdheXMgbmVlZCB0d28gZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLiAgVGhlIGZpcnN0IGNhdXNlcworCSAqIGEgdHJhbnNpdGlvbiB0byB0aGUgZW5kLW9mLWJ1ZmZlciBzdGF0ZS4gIFRoZSBzZWNvbmQgY2F1c2VzCisJICogYSBqYW0gaW4gdGhhdCBzdGF0ZS4KKwkgKi8KKwliLT55eV9jaF9idWZbMF0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisJYi0+eXlfY2hfYnVmWzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJYi0+eXlfYnVmX3BvcyA9ICZiLT55eV9jaF9idWZbMF07CisKKwliLT55eV9hdF9ib2wgPSAxOworCWItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOworCisJaWYgKCBiID09IFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJeXlfbG9hZF9idWZmZXJfc3RhdGUoeXlzY2FubmVyICk7Cit9CisKKy8qKiBQdXNoZXMgdGhlIG5ldyBzdGF0ZSBvbnRvIHRoZSBzdGFjay4gVGhlIG5ldyBzdGF0ZSBiZWNvbWVzCisgKiAgdGhlIGN1cnJlbnQgc3RhdGUuIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSB0aGUgc3RhY2sKKyAqICBpZiBuZWNlc3NhcnkuCisgKiAgQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBzdGF0ZS4KKyAqICBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KKyAqLwordm9pZCB5eXB1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisJaWYgKG5ld19idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJeXllbnN1cmVfYnVmZmVyX3N0YWNrKHl5c2Nhbm5lcik7CisKKwkvKiBUaGlzIGJsb2NrIGlzIGNvcGllZCBmcm9tIHl5X3N3aXRjaF90b19idWZmZXIuICovCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCisJCXsKKwkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLworCQkqeXlnLT55eV9jX2J1Zl9wID0geXlnLT55eV9ob2xkX2NoYXI7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9IHl5Zy0+eXlfY19idWZfcDsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0geXlnLT55eV9uX2NoYXJzOworCQl9CisKKwkvKiBPbmx5IHB1c2ggaWYgdG9wIGV4aXN0cy4gT3RoZXJ3aXNlLCByZXBsYWNlIHRvcC4gKi8KKwlpZiAoWVlfQ1VSUkVOVF9CVUZGRVIpCisJCXl5Zy0+eXlfYnVmZmVyX3N0YWNrX3RvcCsrOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IG5ld19idWZmZXI7CisKKwkvKiBjb3BpZWQgZnJvbSB5eV9zd2l0Y2hfdG9fYnVmZmVyLiAqLworCXl5X2xvYWRfYnVmZmVyX3N0YXRlKHl5c2Nhbm5lciApOworCXl5Zy0+eXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mID0gMTsKK30KKworLyoqIFJlbW92ZXMgYW5kIGRlbGV0ZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGlmIHByZXNlbnQuCisgKiAgVGhlIG5leHQgZWxlbWVudCBiZWNvbWVzIHRoZSBuZXcgdG9wLgorICogIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCit2b2lkIHl5cG9wX2J1ZmZlcl9zdGF0ZSAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKwlpZiAoIVlZX0NVUlJFTlRfQlVGRkVSKQorCQlyZXR1cm47CisKKwl5eV9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICx5eXNjYW5uZXIpOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7CisJaWYgKHl5Zy0+eXlfYnVmZmVyX3N0YWNrX3RvcCA+IDApCisJCS0teXlnLT55eV9idWZmZXJfc3RhY2tfdG9wOworCisJaWYgKFlZX0NVUlJFTlRfQlVGRkVSKSB7CisJCXl5X2xvYWRfYnVmZmVyX3N0YXRlKHl5c2Nhbm5lciApOworCQl5eWctPnl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZiA9IDE7CisJfQorfQorCisvKiBBbGxvY2F0ZXMgdGhlIHN0YWNrIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICogIEd1YXJhbnRlZXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBwdXNoLgorICovCitzdGF0aWMgdm9pZCB5eWVuc3VyZV9idWZmZXJfc3RhY2sgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKwlpbnQgbnVtX3RvX2FsbG9jOworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKworCWlmICgheXlnLT55eV9idWZmZXJfc3RhY2spIHsKKworCQkvKiBGaXJzdCBhbGxvY2F0aW9uIGlzIGp1c3QgZm9yIDIgZWxlbWVudHMsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhpcworCQkgKiBzY2FubmVyIHdpbGwgZXZlbiBuZWVkIGEgc3RhY2suIFdlIHVzZSAyIGluc3RlYWQgb2YgMSB0byBhdm9pZCBhbgorCQkgKiBpbW1lZGlhdGUgcmVhbGxvYyBvbiB0aGUgbmV4dCBjYWxsLgorICAgICAgICAgKi8KKwkJbnVtX3RvX2FsbG9jID0gMTsKKwkJeXlnLT55eV9idWZmZXJfc3RhY2sgPSAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSoqKXl5YWxsb2MKKwkJCQkJCQkJKG51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikKKwkJCQkJCQkJLCB5eXNjYW5uZXIpOworCQlpZiAoICEgeXlnLT55eV9idWZmZXJfc3RhY2sgKQorCQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXllbnN1cmVfYnVmZmVyX3N0YWNrKCkiICk7CisJCQkJCQkJCSAgCisJCW1lbXNldCh5eWctPnl5X2J1ZmZlcl9zdGFjaywgMCwgbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CisJCQkJCisJCXl5Zy0+eXlfYnVmZmVyX3N0YWNrX21heCA9IG51bV90b19hbGxvYzsKKwkJeXlnLT55eV9idWZmZXJfc3RhY2tfdG9wID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmICh5eWctPnl5X2J1ZmZlcl9zdGFja190b3AgPj0gKHl5Zy0+eXlfYnVmZmVyX3N0YWNrX21heCkgLSAxKXsKKworCQkvKiBJbmNyZWFzZSB0aGUgYnVmZmVyIHRvIHByZXBhcmUgZm9yIGEgcG9zc2libGUgcHVzaC4gKi8KKwkJaW50IGdyb3dfc2l6ZSA9IDggLyogYXJiaXRyYXJ5IGdyb3cgc2l6ZSAqLzsKKworCQludW1fdG9fYWxsb2MgPSB5eWctPnl5X2J1ZmZlcl9zdGFja19tYXggKyBncm93X3NpemU7CisJCXl5Zy0+eXlfYnVmZmVyX3N0YWNrID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil5eXJlYWxsb2MKKwkJCQkJCQkJKHl5Zy0+eXlfYnVmZmVyX3N0YWNrLAorCQkJCQkJCQludW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCisJCQkJCQkJCSwgeXlzY2FubmVyKTsKKwkJaWYgKCAhIHl5Zy0+eXlfYnVmZmVyX3N0YWNrICkKKwkJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5ZW5zdXJlX2J1ZmZlcl9zdGFjaygpIiApOworCisJCS8qIHplcm8gb25seSB0aGUgbmV3IHNsb3RzLiovCisJCW1lbXNldCh5eWctPnl5X2J1ZmZlcl9zdGFjayArIHl5Zy0+eXlfYnVmZmVyX3N0YWNrX21heCwgMCwgZ3Jvd19zaXplICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CisJCXl5Zy0+eXlfYnVmZmVyX3N0YWNrX21heCA9IG51bV90b19hbGxvYzsKKwl9Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gZGlyZWN0bHkgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGNoYXJhY3RlciBidWZmZXIuCisgKiBAcGFyYW0gYmFzZSB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgorICogQHBhcmFtIHNpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNoYXJhY3RlciBidWZmZXIKKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuIAorICovCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9idWZmZXIgIChjaGFyICogYmFzZSwgeXlfc2l6ZV90ICBzaXplICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworICAgIAorCWlmICggc2l6ZSA8IDIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0yXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0xXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgKQorCQkvKiBUaGV5IGZvcmdvdCB0byBsZWF2ZSByb29tIGZvciB0aGUgRU9CJ3MuICovCisJCXJldHVybiAwOworCisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHl5YWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgLHl5c2Nhbm5lciApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfc2Nhbl9idWZmZXIoKSIgKTsKKworCWItPnl5X2J1Zl9zaXplID0gc2l6ZSAtIDI7CS8qICItIDIiIHRvIHRha2UgY2FyZSBvZiBFT0IncyAqLworCWItPnl5X2J1Zl9wb3MgPSBiLT55eV9jaF9idWYgPSBiYXNlOworCWItPnl5X2lzX291cl9idWZmZXIgPSAwOworCWItPnl5X2lucHV0X2ZpbGUgPSAwOworCWItPnl5X25fY2hhcnMgPSBiLT55eV9idWZfc2l6ZTsKKwliLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7CisJYi0+eXlfYXRfYm9sID0gMTsKKwliLT55eV9maWxsX2J1ZmZlciA9IDA7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwl5eV9zd2l0Y2hfdG9fYnVmZmVyKGIgLHl5c2Nhbm5lciApOworCisJcmV0dXJuIGI7Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gYSBzdHJpbmcuIFRoZSBuZXh0IGNhbGwgdG8geXlsZXgoKSB3aWxsCisgKiBzY2FuIGZyb20gYSBAZSBjb3B5IG9mIEBhIHN0ci4KKyAqIEBwYXJhbSB5eXN0ciBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byBzY2FuCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgorICogQG5vdGUgSWYgeW91IHdhbnQgdG8gc2NhbiBieXRlcyB0aGF0IG1heSBjb250YWluIE5VTCB2YWx1ZXMsIHRoZW4gdXNlCisgKiAgICAgICB5eV9zY2FuX2J5dGVzKCkgaW5zdGVhZC4KKyAqLworWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKiB5eXN0ciAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICAKKwlyZXR1cm4geXlfc2Nhbl9ieXRlcyh5eXN0cixzdHJsZW4oeXlzdHIpICx5eXNjYW5uZXIpOworfQorCisvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIHRoZSBnaXZlbiBieXRlcy4gVGhlIG5leHQgY2FsbCB0byB5eWxleCgpIHdpbGwKKyAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgYnl0ZXMuCisgKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHNjYW4KKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgQGEgYnl0ZXMuCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgorICovCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9ieXRlcyAgKHl5Y29uc3QgY2hhciAqIHl5Ynl0ZXMsIGludCAgX3l5Ynl0ZXNfbGVuICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworCWNoYXIgKmJ1ZjsKKwl5eV9zaXplX3QgbjsKKwlpbnQgaTsKKyAgICAKKwkvKiBHZXQgbWVtb3J5IGZvciBmdWxsIGJ1ZmZlciwgaW5jbHVkaW5nIHNwYWNlIGZvciB0cmFpbGluZyBFT0Incy4gKi8KKwluID0gX3l5Ynl0ZXNfbGVuICsgMjsKKwlidWYgPSAoY2hhciAqKSB5eWFsbG9jKG4gLHl5c2Nhbm5lciApOworCWlmICggISBidWYgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9zY2FuX2J5dGVzKCkiICk7CisKKwlmb3IgKCBpID0gMDsgaSA8IF95eWJ5dGVzX2xlbjsgKytpICkKKwkJYnVmW2ldID0geXlieXRlc1tpXTsKKworCWJ1ZltfeXlieXRlc19sZW5dID0gYnVmW195eWJ5dGVzX2xlbisxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCWIgPSB5eV9zY2FuX2J1ZmZlcihidWYsbiAseXlzY2FubmVyKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAiYmFkIGJ1ZmZlciBpbiB5eV9zY2FuX2J5dGVzKCkiICk7CisKKwkvKiBJdCdzIG9rYXkgdG8gZ3JvdyBldGMuIHRoaXMgYnVmZmVyLCBhbmQgd2Ugc2hvdWxkIHRocm93IGl0CisJICogYXdheSB3aGVuIHdlJ3JlIGRvbmUuCisJICovCisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7CisKKwlyZXR1cm4gYjsKK30KKworICAgIHN0YXRpYyB2b2lkIHl5X3B1c2hfc3RhdGUgKGludCAgbmV3X3N0YXRlICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKwlpZiAoIHl5Zy0+eXlfc3RhcnRfc3RhY2tfcHRyID49IHl5Zy0+eXlfc3RhcnRfc3RhY2tfZGVwdGggKQorCQl7CisJCXl5X3NpemVfdCBuZXdfc2l6ZTsKKworCQl5eWctPnl5X3N0YXJ0X3N0YWNrX2RlcHRoICs9IFlZX1NUQVJUX1NUQUNLX0lOQ1I7CisJCW5ld19zaXplID0geXlnLT55eV9zdGFydF9zdGFja19kZXB0aCAqIHNpemVvZiggaW50ICk7CisKKwkJaWYgKCAhIHl5Zy0+eXlfc3RhcnRfc3RhY2sgKQorCQkJeXlnLT55eV9zdGFydF9zdGFjayA9IChpbnQgKikgeXlhbGxvYyhuZXdfc2l6ZSAseXlzY2FubmVyICk7CisKKwkJZWxzZQorCQkJeXlnLT55eV9zdGFydF9zdGFjayA9IChpbnQgKikgeXlyZWFsbG9jKCh2b2lkICopIHl5Zy0+eXlfc3RhcnRfc3RhY2ssbmV3X3NpemUgLHl5c2Nhbm5lciApOworCisJCWlmICggISB5eWctPnl5X3N0YXJ0X3N0YWNrICkKKwkJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIG1lbW9yeSBleHBhbmRpbmcgc3RhcnQtY29uZGl0aW9uIHN0YWNrIiApOworCQl9CisKKwl5eWctPnl5X3N0YXJ0X3N0YWNrW3l5Zy0+eXlfc3RhcnRfc3RhY2tfcHRyKytdID0gWVlfU1RBUlQ7CisKKwlCRUdJTihuZXdfc3RhdGUpOworfQorCisgICAgc3RhdGljIHZvaWQgeXlfcG9wX3N0YXRlICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKwlpZiAoIC0teXlnLT55eV9zdGFydF9zdGFja19wdHIgPCAwICkKKwkJWVlfRkFUQUxfRVJST1IoICJzdGFydC1jb25kaXRpb24gc3RhY2sgdW5kZXJmbG93IiApOworCisJQkVHSU4oeXlnLT55eV9zdGFydF9zdGFja1t5eWctPnl5X3N0YXJ0X3N0YWNrX3B0cl0pOworfQorCisgICAgc3RhdGljIGludCB5eV90b3Bfc3RhdGUgICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCXJldHVybiB5eWctPnl5X3N0YXJ0X3N0YWNrW3l5Zy0+eXlfc3RhcnRfc3RhY2tfcHRyIC0gMV07Cit9CisKKyNpZm5kZWYgWVlfRVhJVF9GQUlMVVJFCisjZGVmaW5lIFlZX0VYSVRfRkFJTFVSRSAyCisjZW5kaWYKKworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciogbXNnICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIAkodm9pZCkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZyApOworCWV4aXQoIFlZX0VYSVRfRkFJTFVSRSApOworfQorCisvKiBSZWRlZmluZSB5eWxlc3MoKSBzbyBpdCB3b3JrcyBpbiBzZWN0aW9uIDMgY29kZS4gKi8KKworI3VuZGVmIHl5bGVzcworI2RlZmluZSB5eWxlc3MobikgXAorCWRvIFwKKwkJeyBcCisJCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHl5dGV4dC4gKi8gXAorICAgICAgICBpbnQgeXlsZXNzX21hY3JvX2FyZyA9IChuKTsgXAorICAgICAgICBZWV9MRVNTX0xJTkVOTyh5eWxlc3NfbWFjcm9fYXJnKTtcCisJCXl5dGV4dFt5eWxlbmddID0geXlnLT55eV9ob2xkX2NoYXI7IFwKKwkJeXlnLT55eV9jX2J1Zl9wID0geXl0ZXh0ICsgeXlsZXNzX21hY3JvX2FyZzsgXAorCQl5eWctPnl5X2hvbGRfY2hhciA9ICp5eWctPnl5X2NfYnVmX3A7IFwKKwkJKnl5Zy0+eXlfY19idWZfcCA9ICdcMCc7IFwKKwkJeXlsZW5nID0geXlsZXNzX21hY3JvX2FyZzsgXAorCQl9IFwKKwl3aGlsZSAoIDAgKQorCisvKiBBY2Nlc3NvciAgbWV0aG9kcyAoZ2V0L3NldCBmdW5jdGlvbnMpIHRvIHN0cnVjdCBtZW1iZXJzLiAqLworCisvKiogR2V0IHRoZSB1c2VyLWRlZmluZWQgZGF0YSBmb3IgdGhpcyBzY2FubmVyLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK1lZX0VYVFJBX1RZUEUgeXlnZXRfZXh0cmEgICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIHJldHVybiB5eWV4dHJhOworfQorCisvKiogR2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK2ludCB5eWdldF9saW5lbm8gICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIAorICAgICAgICBpZiAoISBZWV9DVVJSRU5UX0JVRkZFUikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiB5eWxpbmVubzsKK30KKworLyoqIEdldCB0aGUgY3VycmVudCBjb2x1bW4gbnVtYmVyLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK2ludCB5eWdldF9jb2x1bW4gICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIAorICAgICAgICBpZiAoISBZWV9DVVJSRU5UX0JVRkZFUikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiB5eWNvbHVtbjsKK30KKworLyoqIEdldCB0aGUgaW5wdXQgc3RyZWFtLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK0ZJTEUgKnl5Z2V0X2luICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlpbjsKK30KKworLyoqIEdldCB0aGUgb3V0cHV0IHN0cmVhbS4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCitGSUxFICp5eWdldF9vdXQgICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIHJldHVybiB5eW91dDsKK30KKworLyoqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHRva2VuLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK2ludCB5eWdldF9sZW5nICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlsZW5nOworfQorCisvKiogR2V0IHRoZSBjdXJyZW50IHRva2VuLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KKworY2hhciAqeXlnZXRfdGV4dCAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgcmV0dXJuIHl5dGV4dDsKK30KKworLyoqIFNldCB0aGUgdXNlci1kZWZpbmVkIGRhdGEuIFRoaXMgZGF0YSBpcyBuZXZlciB0b3VjaGVkIGJ5IHRoZSBzY2FubmVyLgorICogQHBhcmFtIHVzZXJfZGVmaW5lZCBUaGUgZGF0YSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzY2FubmVyLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK3ZvaWQgeXlzZXRfZXh0cmEgKFlZX0VYVFJBX1RZUEUgIHVzZXJfZGVmaW5lZCAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlleHRyYSA9IHVzZXJfZGVmaW5lZCA7Cit9CisKKy8qKiBTZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiBAcGFyYW0gbGluZV9udW1iZXIKKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCit2b2lkIHl5c2V0X2xpbmVubyAoaW50ICBsaW5lX251bWJlciAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKKyAgICAgICAgLyogbGluZW5vIGlzIG9ubHkgdmFsaWQgaWYgYW4gaW5wdXQgYnVmZmVyIGV4aXN0cy4gKi8KKyAgICAgICAgaWYgKCEgWVlfQ1VSUkVOVF9CVUZGRVIgKQorICAgICAgICAgICB5eV9mYXRhbF9lcnJvciggInl5c2V0X2xpbmVubyBjYWxsZWQgd2l0aCBubyBidWZmZXIiICwgeXlzY2FubmVyKTsgCisgICAgCisgICAgeXlsaW5lbm8gPSBsaW5lX251bWJlcjsKK30KKworLyoqIFNldCB0aGUgY3VycmVudCBjb2x1bW4uCisgKiBAcGFyYW0gbGluZV9udW1iZXIKKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCit2b2lkIHl5c2V0X2NvbHVtbiAoaW50ICBjb2x1bW5fbm8gLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisgICAgICAgIC8qIGNvbHVtbiBpcyBvbmx5IHZhbGlkIGlmIGFuIGlucHV0IGJ1ZmZlciBleGlzdHMuICovCisgICAgICAgIGlmICghIFlZX0NVUlJFTlRfQlVGRkVSICkKKyAgICAgICAgICAgeXlfZmF0YWxfZXJyb3IoICJ5eXNldF9jb2x1bW4gY2FsbGVkIHdpdGggbm8gYnVmZmVyIiAsIHl5c2Nhbm5lcik7IAorICAgIAorICAgIHl5Y29sdW1uID0gY29sdW1uX25vOworfQorCisvKiogU2V0IHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgZG9lcyBub3QgZGlzY2FyZCB0aGUgY3VycmVudAorICogaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIGluX3N0ciBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICogQHNlZSB5eV9zd2l0Y2hfdG9fYnVmZmVyCisgKi8KK3ZvaWQgeXlzZXRfaW4gKEZJTEUgKiAgaW5fc3RyICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICB5eWluID0gaW5fc3RyIDsKK30KKwordm9pZCB5eXNldF9vdXQgKEZJTEUgKiAgb3V0X3N0ciAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlvdXQgPSBvdXRfc3RyIDsKK30KKworaW50IHl5Z2V0X2RlYnVnICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlfZmxleF9kZWJ1ZzsKK30KKwordm9pZCB5eXNldF9kZWJ1ZyAoaW50ICBiZGVidWcgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIHl5X2ZsZXhfZGVidWcgPSBiZGVidWcgOworfQorCisvKiBBY2Nlc3NvciBtZXRob2RzIGZvciB5eWx2YWwgYW5kIHl5bGxvYyAqLworCitZWVNUWVBFICogeXlnZXRfbHZhbCAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgcmV0dXJuIHl5bHZhbDsKK30KKwordm9pZCB5eXNldF9sdmFsIChZWVNUWVBFICogIHl5bHZhbF9wYXJhbSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlsdmFsID0geXlsdmFsX3BhcmFtOworfQorCisvKiBVc2VyLXZpc2libGUgQVBJICovCisKKy8qIHl5bGV4X2luaXQgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGNyZWF0ZXMgdGhlIHNjYW5uZXIgaXRzZWxmLCBzbyBpdCBpcworICogdGhlIE9OTFkgcmVlbnRyYW50IGZ1bmN0aW9uIHRoYXQgZG9lc24ndCB0YWtlIHRoZSBzY2FubmVyIGFzIHRoZSBsYXN0IGFyZ3VtZW50LgorICogVGhhdCdzIHdoeSB3ZSBleHBsaWNpdGx5IGhhbmRsZSB0aGUgZGVjbGFyYXRpb24sIGluc3RlYWQgb2YgdXNpbmcgb3VyIG1hY3Jvcy4KKyAqLworCitpbnQgeXlsZXhfaW5pdCh5eXNjYW5fdCogcHRyX3l5X2dsb2JhbHMpCisKK3sKKyAgICBpZiAocHRyX3l5X2dsb2JhbHMgPT0gTlVMTCl7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAqcHRyX3l5X2dsb2JhbHMgPSAoeXlzY2FuX3QpIHl5YWxsb2MgKCBzaXplb2YoIHN0cnVjdCB5eWd1dHNfdCApLCBOVUxMICk7CisKKyAgICBpZiAoKnB0cl95eV9nbG9iYWxzID09IE5VTEwpeworICAgICAgICBlcnJubyA9IEVOT01FTTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogQnkgc2V0dGluZyB0byAweEFBLCB3ZSBleHBvc2UgYnVncyBpbiB5eV9pbml0X2dsb2JhbHMuIExlYXZlIGF0IDB4MDAgZm9yIHJlbGVhc2VzLiAqLworICAgIG1lbXNldCgqcHRyX3l5X2dsb2JhbHMsMHgwMCxzaXplb2Yoc3RydWN0IHl5Z3V0c190KSk7CisKKyAgICByZXR1cm4geXlfaW5pdF9nbG9iYWxzICggKnB0cl95eV9nbG9iYWxzICk7Cit9CisKKy8qIHl5bGV4X2luaXRfZXh0cmEgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgeXlsZXhfaW5pdCwgYnV0IGZvbGxvd3MgdGhlCisgKiBjb252ZW50aW9uIG9mIHRha2luZyB0aGUgc2Nhbm5lciBhcyB0aGUgbGFzdCBhcmd1bWVudC4gTm90ZSBob3dldmVyLCB0aGF0CisgKiB0aGlzIGlzIGEgKnBvaW50ZXIqIHRvIGEgc2Nhbm5lciwgYXMgaXQgd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhpcyBjYWxsIChhbmQKKyAqIGlzIHRoZSByZWFzb24sIHRvbywgd2h5IHRoaXMgZnVuY3Rpb24gYWxzbyBtdXN0IGhhbmRsZSBpdHMgb3duIGRlY2xhcmF0aW9uKS4KKyAqIFRoZSB1c2VyIGRlZmluZWQgdmFsdWUgaW4gdGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgYXZhaWxhYmxlIHRvIHl5YWxsb2MgaW4KKyAqIHRoZSB5eWV4dHJhIGZpZWxkLgorICovCisKK2ludCB5eWxleF9pbml0X2V4dHJhKFlZX0VYVFJBX1RZUEUgeXlfdXNlcl9kZWZpbmVkLHl5c2Nhbl90KiBwdHJfeXlfZ2xvYmFscyApCisKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgZHVtbXlfeXlndXRzOworCisgICAgeXlzZXRfZXh0cmEgKHl5X3VzZXJfZGVmaW5lZCwgJmR1bW15X3l5Z3V0cyk7CisKKyAgICBpZiAocHRyX3l5X2dsb2JhbHMgPT0gTlVMTCl7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisJCisgICAgKnB0cl95eV9nbG9iYWxzID0gKHl5c2Nhbl90KSB5eWFsbG9jICggc2l6ZW9mKCBzdHJ1Y3QgeXlndXRzX3QgKSwgJmR1bW15X3l5Z3V0cyApOworCQorICAgIGlmICgqcHRyX3l5X2dsb2JhbHMgPT0gTlVMTCl7CisgICAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgCisgICAgLyogQnkgc2V0dGluZyB0byAweEFBLCB3ZSBleHBvc2UgYnVncyBpbgorICAgIHl5X2luaXRfZ2xvYmFscy4gTGVhdmUgYXQgMHgwMCBmb3IgcmVsZWFzZXMuICovCisgICAgbWVtc2V0KCpwdHJfeXlfZ2xvYmFscywweDAwLHNpemVvZihzdHJ1Y3QgeXlndXRzX3QpKTsKKyAgICAKKyAgICB5eXNldF9leHRyYSAoeXlfdXNlcl9kZWZpbmVkLCAqcHRyX3l5X2dsb2JhbHMpOworICAgIAorICAgIHJldHVybiB5eV9pbml0X2dsb2JhbHMgKCAqcHRyX3l5X2dsb2JhbHMgKTsKK30KKworc3RhdGljIGludCB5eV9pbml0X2dsb2JhbHMgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgLyogSW5pdGlhbGl6YXRpb24gaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBub24tcmVlbnRyYW50IHNjYW5uZXIuCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB5eWxleF9kZXN0cm95KCksIHNvIGRvbid0IGFsbG9jYXRlIGhlcmUuCisgICAgICovCisKKyAgICB5eWctPnl5X2J1ZmZlcl9zdGFjayA9IDA7CisgICAgeXlnLT55eV9idWZmZXJfc3RhY2tfdG9wID0gMDsKKyAgICB5eWctPnl5X2J1ZmZlcl9zdGFja19tYXggPSAwOworICAgIHl5Zy0+eXlfY19idWZfcCA9IChjaGFyICopIDA7CisgICAgeXlnLT55eV9pbml0ID0gMDsKKyAgICB5eWctPnl5X3N0YXJ0ID0gMDsKKworICAgIHl5Zy0+eXlfc3RhcnRfc3RhY2tfcHRyID0gMDsKKyAgICB5eWctPnl5X3N0YXJ0X3N0YWNrX2RlcHRoID0gMDsKKyAgICB5eWctPnl5X3N0YXJ0X3N0YWNrID0gIE5VTEw7CisKKy8qIERlZmluZWQgaW4gbWFpbi5jICovCisjaWZkZWYgWVlfU1RESU5JVAorICAgIHl5aW4gPSBzdGRpbjsKKyAgICB5eW91dCA9IHN0ZG91dDsKKyNlbHNlCisgICAgeXlpbiA9IChGSUxFICopIDA7CisgICAgeXlvdXQgPSAoRklMRSAqKSAwOworI2VuZGlmCisKKyAgICAvKiBGb3IgZnV0dXJlIHJlZmVyZW5jZTogU2V0IGVycm5vIG9uIGVycm9yLCBzaW5jZSB3ZSBhcmUgY2FsbGVkIGJ5CisgICAgICogeXlsZXhfaW5pdCgpCisgICAgICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHl5bGV4X2Rlc3Ryb3kgaXMgZm9yIGJvdGggcmVlbnRyYW50IGFuZCBub24tcmVlbnRyYW50IHNjYW5uZXJzLiAqLworaW50IHl5bGV4X2Rlc3Ryb3kgICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisgICAgLyogUG9wIHRoZSBidWZmZXIgc3RhY2ssIGRlc3Ryb3lpbmcgZWFjaCBlbGVtZW50LiAqLworCXdoaWxlKFlZX0NVUlJFTlRfQlVGRkVSKXsKKwkJeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiAseXlzY2FubmVyICk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7CisJCXl5cG9wX2J1ZmZlcl9zdGF0ZSh5eXNjYW5uZXIpOworCX0KKworCS8qIERlc3Ryb3kgdGhlIHN0YWNrIGl0c2VsZi4gKi8KKwl5eWZyZWUoeXlnLT55eV9idWZmZXJfc3RhY2sgLHl5c2Nhbm5lcik7CisJeXlnLT55eV9idWZmZXJfc3RhY2sgPSBOVUxMOworCisgICAgLyogRGVzdHJveSB0aGUgc3RhcnQgY29uZGl0aW9uIHN0YWNrLiAqLworICAgICAgICB5eWZyZWUoeXlnLT55eV9zdGFydF9zdGFjayAseXlzY2FubmVyICk7CisgICAgICAgIHl5Zy0+eXlfc3RhcnRfc3RhY2sgPSBOVUxMOworCisgICAgLyogUmVzZXQgdGhlIGdsb2JhbHMuIFRoaXMgaXMgaW1wb3J0YW50IGluIGEgbm9uLXJlZW50cmFudCBzY2FubmVyIHNvIHRoZSBuZXh0IHRpbWUKKyAgICAgKiB5eWxleCgpIGlzIGNhbGxlZCwgaW5pdGlhbGl6YXRpb24gd2lsbCBvY2N1ci4gKi8KKyAgICB5eV9pbml0X2dsb2JhbHMoIHl5c2Nhbm5lcik7CisKKyAgICAvKiBEZXN0cm95IHRoZSBtYWluIHN0cnVjdCAocmVlbnRyYW50IG9ubHkpLiAqLworICAgIHl5ZnJlZSAoIHl5c2Nhbm5lciAsIHl5c2Nhbm5lciApOworICAgIHl5c2Nhbm5lciA9IE5VTEw7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnRlcm5hbCB1dGlsaXR5IHJvdXRpbmVzLgorICovCisKKyNpZm5kZWYgeXl0ZXh0X3B0cgorc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyKiBzMSwgeXljb25zdCBjaGFyICogczIsIGludCBuICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworCXJlZ2lzdGVyIGludCBpOworCWZvciAoIGkgPSAwOyBpIDwgbjsgKytpICkKKwkJczFbaV0gPSBzMltpXTsKK30KKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqIHMgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisJcmVnaXN0ZXIgaW50IG47CisJZm9yICggbiA9IDA7IHNbbl07ICsrbiApCisJCTsKKworCXJldHVybiBuOworfQorI2VuZGlmCisKK3ZvaWQgKnl5YWxsb2MgKHl5X3NpemVfdCAgc2l6ZSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKwlyZXR1cm4gKHZvaWQgKikgbWFsbG9jKCBzaXplICk7Cit9CisKK3ZvaWQgKnl5cmVhbGxvYyAgKHZvaWQgKiBwdHIsIHl5X3NpemVfdCAgc2l6ZSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKwkvKiBUaGUgY2FzdCB0byAoY2hhciAqKSBpbiB0aGUgZm9sbG93aW5nIGFjY29tbW9kYXRlcyBib3RoCisJICogaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIGNoYXIqIGdlbmVyaWMgcG9pbnRlcnMsIGFuZCB0aG9zZQorCSAqIHRoYXQgdXNlIHZvaWQqIGdlbmVyaWMgcG9pbnRlcnMuICBJdCB3b3JrcyB3aXRoIHRoZSBsYXR0ZXIKKwkgKiBiZWNhdXNlIGJvdGggQU5TSSBDIGFuZCBDKysgYWxsb3cgY2FzdGxlc3MgYXNzaWdubWVudCBmcm9tCisJICogYW55IHBvaW50ZXIgdHlwZSB0byB2b2lkKiwgYW5kIGRlYWwgd2l0aCBhcmd1bWVudCBjb252ZXJzaW9ucworCSAqIGFzIHRob3VnaCBkb2luZyBhbiBhc3NpZ25tZW50LgorCSAqLworCXJldHVybiAodm9pZCAqKSByZWFsbG9jKCAoY2hhciAqKSBwdHIsIHNpemUgKTsKK30KKwordm9pZCB5eWZyZWUgKHZvaWQgKiBwdHIgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisJZnJlZSggKGNoYXIgKikgcHRyICk7CS8qIHNlZSB5eXJlYWxsb2MoKSBmb3IgKGNoYXIgKikgY2FzdCAqLworfQorCisjZGVmaW5lIFlZVEFCTEVTX05BTUUgInl5dGFibGVzIgorCitleHRlcm4gIkMiIHsKKy8vIFByZXByb2Nlc3NvciBpbnRlcmZhY2UuCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL3ByZXByb2Nlc3MuaCIKKworI2RlZmluZSBTRVRVUF9DT05URVhUKHBwKSBcCisgICAgVFBhcnNlQ29udGV4dCogY29udGV4dCA9IChUUGFyc2VDb250ZXh0KikgcHAtPnBDOyBcCisgICAgc3RydWN0IHl5Z3V0c190KiB5eWcgPSAoc3RydWN0IHl5Z3V0c190KikgY29udGV4dC0+c2Nhbm5lcjsKKworLy8gUHJlcHJvY2Vzc29yIGNhbGxiYWNrcy4KK3ZvaWQgQ1BQRGVidWdMb2dNc2coY29uc3QgY2hhciAqbXNnKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBjb250ZXh0LT5pbmZvU2luay5kZWJ1Zy5tZXNzYWdlKEVQcmVmaXhOb25lLCBtc2cpOworfQorCit2b2lkIENQUFdhcm5pbmdUb0luZm9Mb2coY29uc3QgY2hhciAqbXNnKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBjb250ZXh0LT53YXJuaW5nKHl5bGluZW5vLCBtc2csICIiLCAiIik7Cit9CisKK3ZvaWQgQ1BQU2hJbmZvTG9nTXNnKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgY29udGV4dC0+ZXJyb3IoeXlsaW5lbm8sIG1zZywgIiIsICIiKTsKKyAgICBjb250ZXh0LT5yZWNvdmVyKCk7Cit9CisKK3ZvaWQgQ1BQRXJyb3JUb0luZm9Mb2coY2hhciAqbXNnKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBjb250ZXh0LT5lcnJvcih5eWxpbmVubywgbXNnLCAiIiwgIiIpOworICAgIGNvbnRleHQtPnJlY292ZXIoKTsKK30KKwordm9pZCBTZXRMaW5lTnVtYmVyKGludCBsaW5lKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBpbnQgc3RyaW5nID0gMDsKKyAgICBEZWNvZGVTb3VyY2VMb2MoeXlsaW5lbm8sICZzdHJpbmcsIE5VTEwpOworICAgIHl5bGluZW5vID0gRW5jb2RlU291cmNlTG9jKHN0cmluZywgbGluZSk7Cit9CisKK3ZvaWQgU2V0U3RyaW5nTnVtYmVyKGludCBzdHJpbmcpCit7CisgICAgU0VUVVBfQ09OVEVYVChjcHApOworICAgIGludCBsaW5lID0gMDsKKyAgICBEZWNvZGVTb3VyY2VMb2MoeXlsaW5lbm8sIE5VTEwsICZsaW5lKTsKKyAgICB5eWxpbmVubyA9IEVuY29kZVNvdXJjZUxvYyhzdHJpbmcsIGxpbmUpOworfQorCitpbnQgR2V0U3RyaW5nTnVtYmVyKCkKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgaW50IHN0cmluZyA9IDA7CisgICAgRGVjb2RlU291cmNlTG9jKHl5bGluZW5vLCAmc3RyaW5nLCBOVUxMKTsKKyAgICByZXR1cm4gc3RyaW5nOworfQorCitpbnQgR2V0TGluZU51bWJlcigpCit7CisgICAgU0VUVVBfQ09OVEVYVChjcHApOworICAgIGludCBsaW5lID0gMDsKKyAgICBEZWNvZGVTb3VyY2VMb2MoeXlsaW5lbm8sIE5VTEwsICZsaW5lKTsKKyAgICByZXR1cm4gbGluZTsKK30KKwordm9pZCBJbmNMaW5lTnVtYmVyKCkKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgaW50IHN0cmluZyA9IDAsIGxpbmUgPSAwOworICAgIERlY29kZVNvdXJjZUxvYyh5eWxpbmVubywgJnN0cmluZywgJmxpbmUpOworICAgIHl5bGluZW5vID0gRW5jb2RlU291cmNlTG9jKHN0cmluZywgKytsaW5lKTsKK30KKwordm9pZCBEZWNMaW5lTnVtYmVyKCkKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgaW50IHN0cmluZyA9IDAsIGxpbmUgPSAwOworICAgIERlY29kZVNvdXJjZUxvYyh5eWxpbmVubywgJnN0cmluZywgJmxpbmUpOworICAgIHl5bGluZW5vID0gRW5jb2RlU291cmNlTG9jKHN0cmluZywgLS1saW5lKTsKK30KKwordm9pZCBIYW5kbGVQcmFnbWEoY29uc3QgY2hhciAqKnRva2VucywgaW50IG51bVRva2VucykKK3sKKyAgICBTRVRVUF9DT05URVhUKGNwcCk7CisgICAgaWYgKCFzdHJjbXAodG9rZW5zWzBdLCAib3B0aW1pemUiKSkgeworICAgICAgICBpZiAobnVtVG9rZW5zICE9IDQpIHsKKyAgICAgICAgICAgIENQUFNoSW5mb0xvZ01zZygib3B0aW1pemUgcHJhZ21hIHN5bnRheCBpcyBpbmNvcnJlY3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHN0cmNtcCh0b2tlbnNbMV0sICIoIikpIHsKKyAgICAgICAgICAgIENQUFNoSW5mb0xvZ01zZygiXCIoXCIgZXhwZWN0ZWQgYWZ0ZXIgJ29wdGltaXplJyBrZXl3b3JkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBpZiAoIXN0cmNtcCh0b2tlbnNbMl0sICJvbiIpKQorICAgICAgICAgICAgY29udGV4dC0+Y29udGV4dFByYWdtYS5vcHRpbWl6ZSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodG9rZW5zWzJdLCAib2ZmIikpCisgICAgICAgICAgICBjb250ZXh0LT5jb250ZXh0UHJhZ21hLm9wdGltaXplID0gZmFsc2U7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKCJcIm9uXCIgb3IgXCJvZmZcIiBleHBlY3RlZCBhZnRlciAnKCcgZm9yICdvcHRpbWl6ZScgcHJhZ21hIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzdHJjbXAodG9rZW5zWzNdLCAiKSIpKSB7CisgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2coIlwiKVwiIGV4cGVjdGVkIHRvIGVuZCAnb3B0aW1pemUnIHByYWdtYSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKHRva2Vuc1swXSwgImRlYnVnIikpIHsKKyAgICAgICAgaWYgKG51bVRva2VucyAhPSA0KSB7CisgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2coImRlYnVnIHByYWdtYSBzeW50YXggaXMgaW5jb3JyZWN0Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzdHJjbXAodG9rZW5zWzFdLCAiKCIpKSB7CisgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2coIlwiKFwiIGV4cGVjdGVkIGFmdGVyICdkZWJ1Zycga2V5d29yZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKCFzdHJjbXAodG9rZW5zWzJdLCAib24iKSkKKyAgICAgICAgICAgIGNvbnRleHQtPmNvbnRleHRQcmFnbWEuZGVidWcgPSB0cnVlOworICAgICAgICBlbHNlIGlmICghc3RyY21wKHRva2Vuc1syXSwgIm9mZiIpKQorICAgICAgICAgICAgY29udGV4dC0+Y29udGV4dFByYWdtYS5kZWJ1ZyA9IGZhbHNlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIENQUFNoSW5mb0xvZ01zZygiXCJvblwiIG9yIFwib2ZmXCIgZXhwZWN0ZWQgYWZ0ZXIgJygnIGZvciAnZGVidWcnIHByYWdtYSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3RyY21wKHRva2Vuc1szXSwgIikiKSkgeworICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKCJcIilcIiBleHBlY3RlZCB0byBlbmQgJ2RlYnVnJyBwcmFnbWEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjaWZkZWYgUFJBR01BX1RBQkxFCisgICAgICAgIC8vCisgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIHByYWdtYQorICAgICAgICAvLyB1c2UgKChUUGFyc2VDb250ZXh0ICopY3BwLT5wQyktPmNvbnRleHRQcmFnbWEucHJhZ21hVGFibGUgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHByYWdtYQorICAgICAgICAvLyBGb3Igbm93LCBqdXN0IGlnbm9yZSB0aGUgcHJhZ21hIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGNhbm5vdCByZWNvZ25pemUKKyAgICAgICAgLy8gQW4gRXhhbXBsZSBvZiBvbmUgc3VjaCBpbXBsZW1lbnRhdGlvbiBmb3IgYSBwcmFnbWEgdGhhdCBoYXMgYSBzeW50YXggbGlrZQorICAgICAgICAvLyAjcHJhZ21hIHByYWdtYW5hbWUocHJhZ21hdmFsdWUpCisgICAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gc3RvcmVzIHRoZSBjdXJyZW50IHByYWdtYXZhbHVlIGFnYWluc3QgdGhlIHByYWdtYSBuYW1lIGluIHByYWdtYVRhYmxlLgorICAgICAgICAvLyAgICAgICAgCisgICAgICAgIGlmIChudW1Ub2tlbnMgPT0gNCAmJiAhc3RyY21wKHRva2Vuc1sxXSwgIigiKSAmJiAhc3RyY21wKHRva2Vuc1szXSwgIikiKSkgeyAgICAgICAgICAgICAgCisgICAgICAgICAgICBUUHJhZ21hVGFibGUmIHByYWdtYVRhYmxlID0gKChUUGFyc2VDb250ZXh0ICopY3BwLT5wQyktPmNvbnRleHRQcmFnbWEucHJhZ21hVGFibGU7CisgICAgICAgICAgICBUUHJhZ21hVGFibGU6Oml0ZXJhdG9yIGl0ZXI7CisgICAgICAgICAgICBpdGVyID0gcHJhZ21hVGFibGUuZmluZChUU3RyaW5nKHRva2Vuc1swXSkpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gcHJhZ21hVGFibGUuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQgPSB0b2tlbnNbMl07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByYWdtYVRhYmxlWyB0b2tlbnNbMF0gXSA9IHRva2Vuc1syXTsKKyAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKG51bVRva2VucyA+PSAyKSB7CisgICAgICAgICAgICBUUHJhZ21hVGFibGUmIHByYWdtYVRhYmxlID0gKChUUGFyc2VDb250ZXh0ICopY3BwLT5wQyktPmNvbnRleHRQcmFnbWEucHJhZ21hVGFibGU7CisgICAgICAgICAgICBUUHJhZ21hVGFibGU6Oml0ZXJhdG9yIGl0ZXI7CisgICAgICAgICAgICBpdGVyID0gcHJhZ21hVGFibGUuZmluZChUU3RyaW5nKHRva2Vuc1swXSkpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gcHJhZ21hVGFibGUuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQgPSB0b2tlbnNbMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByYWdtYVRhYmxlWyB0b2tlbnNbMF0gXSA9IHRva2Vuc1sxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8vIFBSQUdNQV9UQUJMRQorICAgIH0KK30KKwordm9pZCBTdG9yZVN0cihjaGFyICpzdHJpbmcpCit7CisgICAgU0VUVVBfQ09OVEVYVChjcHApOworICAgIFRTdHJpbmcgc3RyU3JjOworICAgIHN0clNyYyA9IFRTdHJpbmcoc3RyaW5nKTsKKworICAgIGNvbnRleHQtPkhhc2hFcnJNc2cgPSBjb250ZXh0LT5IYXNoRXJyTXNnICsgIiAiICsgc3RyU3JjOworfQorCitjb25zdCBjaGFyKiBHZXRTdHJmcm9tVFN0cih2b2lkKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBjcHAtPkVyck1zZyA9IGNvbnRleHQtPkhhc2hFcnJNc2cuY19zdHIoKTsKKyAgICByZXR1cm4gY3BwLT5FcnJNc2c7Cit9CisKK3ZvaWQgUmVzZXRUU3RyaW5nKHZvaWQpCit7CisgICAgU0VUVVBfQ09OVEVYVChjcHApOworICAgIGNvbnRleHQtPkhhc2hFcnJNc2cgPSAiIjsKK30KKworVEJlaGF2aW9yIEdldEJlaGF2aW9yKGNvbnN0IGNoYXIqIGJlaGF2aW9yKQoreworICAgIGlmICghc3RyY21wKCJyZXF1aXJlIiwgYmVoYXZpb3IpKQorICAgICAgICByZXR1cm4gRUJoUmVxdWlyZTsKKyAgICBlbHNlIGlmICghc3RyY21wKCJlbmFibGUiLCBiZWhhdmlvcikpCisgICAgICAgIHJldHVybiBFQmhFbmFibGU7CisgICAgZWxzZSBpZiAoIXN0cmNtcCgiZGlzYWJsZSIsIGJlaGF2aW9yKSkKKyAgICAgICAgcmV0dXJuIEVCaERpc2FibGU7CisgICAgZWxzZSBpZiAoIXN0cmNtcCgid2FybiIsIGJlaGF2aW9yKSkKKyAgICAgICAgcmV0dXJuIEVCaFdhcm47CisgICAgZWxzZSB7CisgICAgICAgIENQUFNoSW5mb0xvZ01zZygoVFN0cmluZygiYmVoYXZpb3IgJyIpICsgYmVoYXZpb3IgKyAiJyBpcyBub3Qgc3VwcG9ydGVkIikuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBFQmhEaXNhYmxlOworICAgIH0gICAgICAgIAorfQorCit2b2lkIHVwZGF0ZUV4dGVuc2lvbkJlaGF2aW9yKGNvbnN0IGNoYXIqIGV4dE5hbWUsIGNvbnN0IGNoYXIqIGJlaGF2aW9yKQoreworICAgIFNFVFVQX0NPTlRFWFQoY3BwKTsKKyAgICBUQmVoYXZpb3IgYmVoYXZpb3JWYWwgPSBHZXRCZWhhdmlvcihiZWhhdmlvcik7CisgICAgVE1hcDxUU3RyaW5nLCBUQmVoYXZpb3I+OjogaXRlcmF0b3IgaXRlcjsKKyAgICBUU3RyaW5nIG1zZzsKKyAgICAKKyAgICAvLyBzcGVjaWFsIGNhc2VkIGZvciBhbGwgZXh0ZW5zaW9uCisgICAgaWYgKCFzdHJjbXAoZXh0TmFtZSwgImFsbCIpKSB7CisgICAgICAgIGlmIChiZWhhdmlvclZhbCA9PSBFQmhSZXF1aXJlIHx8IGJlaGF2aW9yVmFsID09IEVCaEVuYWJsZSkgeworICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKCJleHRlbnNpb24gJ2FsbCcgY2Fubm90IGhhdmUgJ3JlcXVpcmUnIG9yICdlbmFibGUnIGJlaGF2aW9yIik7ICAKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaXRlciA9IGNvbnRleHQtPmV4dGVuc2lvbkJlaGF2aW9yLmJlZ2luKCk7IGl0ZXIgIT0gY29udGV4dC0+ZXh0ZW5zaW9uQmVoYXZpb3IuZW5kKCk7ICsraXRlcikKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQgPSBiZWhhdmlvclZhbDsKKyAgICAgICAgfSAgICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgICAgaXRlciA9IGNvbnRleHQtPmV4dGVuc2lvbkJlaGF2aW9yLmZpbmQoVFN0cmluZyhleHROYW1lKSk7CisgICAgICAgIGlmIChpdGVyID09IGNvbnRleHQtPmV4dGVuc2lvbkJlaGF2aW9yLmVuZCgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGJlaGF2aW9yVmFsKSB7CisgICAgICAgICAgICBjYXNlIEVCaFJlcXVpcmU6CisgICAgICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKChUU3RyaW5nKCJleHRlbnNpb24gJyIpICsgZXh0TmFtZSArICInIGlzIG5vdCBzdXBwb3J0ZWQiKS5jX3N0cigpKTsgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFQmhFbmFibGU6CisgICAgICAgICAgICBjYXNlIEVCaFdhcm46CisgICAgICAgICAgICBjYXNlIEVCaERpc2FibGU6CisgICAgICAgICAgICAgICAgbXNnID0gVFN0cmluZygiZXh0ZW5zaW9uICciKSArIGV4dE5hbWUgKyAiJyBpcyBub3Qgc3VwcG9ydGVkIjsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5pbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeFdhcm5pbmcsIG1zZy5jX3N0cigpLCB5eWxpbmVubyk7IAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGl0ZXItPnNlY29uZCA9IGJlaGF2aW9yVmFsOworICAgIH0KK30KK30gIC8vIGV4dGVybiAiQyIKKworaW50IHN0cmluZ19pbnB1dChjaGFyKiBidWYsIGludCBtYXhfc2l6ZSwgeXlzY2FuX3QgeXlzY2FubmVyKSB7CisgICAgaW50IGxlbjsKKworICAgIGlmICgobGVuID0geXlsZXhfQ1BQKGJ1ZiwgbWF4X3NpemUpKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobGVuID49IG1heF9zaXplKSAKKyAgICAgICAgWVlfRkFUQUxfRVJST1IoImlucHV0IGJ1ZmZlciBvdmVyZmxvdywgY2FuJ3QgZW5sYXJnZSBidWZmZXIgYmVjYXVzZSBzY2FubmVyIHVzZXMgUkVKRUNUIik7CisKKyAgICBidWZbbGVuXSA9ICcgJzsKKyAgICByZXR1cm4gbGVuKzE7Cit9CisKK2ludCBjaGVja190eXBlKHl5c2Nhbl90IHl5c2Nhbm5lcikgeworICAgIHN0cnVjdCB5eWd1dHNfdCogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopIHl5c2Nhbm5lcjsKKyAgICAKKyAgICBpbnQgdG9rZW4gPSBJREVOVElGSUVSOworICAgIFRTeW1ib2wqIHN5bWJvbCA9IHl5ZXh0cmEtPnN5bWJvbFRhYmxlLmZpbmQoeXl0ZXh0KTsKKyAgICBpZiAoeXlleHRyYS0+bGV4QWZ0ZXJUeXBlID09IGZhbHNlICYmIHN5bWJvbCAmJiBzeW1ib2wtPmlzVmFyaWFibGUoKSkgeworICAgICAgICBUVmFyaWFibGUqIHZhcmlhYmxlID0gc3RhdGljX2Nhc3Q8VFZhcmlhYmxlKj4oc3ltYm9sKTsKKyAgICAgICAgaWYgKHZhcmlhYmxlLT5pc1VzZXJUeXBlKCkpIHsKKyAgICAgICAgICAgIHl5ZXh0cmEtPmxleEFmdGVyVHlwZSA9IHRydWU7CisgICAgICAgICAgICB0b2tlbiA9IFRZUEVfTkFNRTsKKyAgICAgICAgfQorICAgIH0KKyAgICB5eWx2YWwtPmxleC5zeW1ib2wgPSBzeW1ib2w7CisgICAgcmV0dXJuIHRva2VuOworfQorCitpbnQgcmVzZXJ2ZWRfd29yZCh5eXNjYW5fdCB5eXNjYW5uZXIpIHsKKyAgICBzdHJ1Y3QgeXlndXRzX3QqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKSB5eXNjYW5uZXI7CisKKyAgICB5eWV4dHJhLT5lcnJvcih5eWxpbmVubywgIklsbGVnYWwgdXNlIG9mIHJlc2VydmVkIHdvcmQiLCB5eXRleHQsICIiKTsKKyAgICB5eWV4dHJhLT5yZWNvdmVyKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgeXllcnJvcihUUGFyc2VDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiByZWFzb24pIHsKKyAgICBzdHJ1Y3QgeXlndXRzX3QqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKSBjb250ZXh0LT5zY2FubmVyOworCisgICAgaWYgKGNvbnRleHQtPkFmdGVyRU9GKSB7CisgICAgICAgIGNvbnRleHQtPmVycm9yKHl5bGluZW5vLCByZWFzb24sICJ1bmV4cGVjdGVkIEVPRiIsICIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb250ZXh0LT5lcnJvcih5eWxpbmVubywgcmVhc29uLCB5eXRleHQsICIiKTsKKyAgICB9CisgICAgY29udGV4dC0+cmVjb3ZlcigpOworfQorCitpbnQgZ2xzbGFuZ19pbml0aWFsaXplKFRQYXJzZUNvbnRleHQqIGNvbnRleHQpIHsKKyAgICB5eXNjYW5fdCBzY2FubmVyID0gTlVMTDsKKyAgICBpZiAoeXlsZXhfaW5pdF9leHRyYShjb250ZXh0LCZzY2FubmVyKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBjb250ZXh0LT5zY2FubmVyID0gc2Nhbm5lcjsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGdsc2xhbmdfZmluYWxpemUoVFBhcnNlQ29udGV4dCogY29udGV4dCkgeworICAgIHl5c2Nhbl90IHNjYW5uZXIgPSBjb250ZXh0LT5zY2FubmVyOworICAgIGlmIChzY2FubmVyID09IE5VTEwpIHJldHVybiAwOworICAgIAorICAgIGNvbnRleHQtPnNjYW5uZXIgPSBOVUxMOworICAgIHJldHVybiB5eWxleF9kZXN0cm95KHNjYW5uZXIpOworfQorCit2b2lkIGdsc2xhbmdfc2NhbihpbnQgY291bnQsIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ1tdLCBjb25zdCBpbnQgbGVuZ3RoW10sCisgICAgICAgICAgICAgICAgICBUUGFyc2VDb250ZXh0KiBjb250ZXh0KSB7CisgICAgeXlyZXN0YXJ0KE5VTEwsY29udGV4dC0+c2Nhbm5lcik7CisgICAgeXlzZXRfbGluZW5vKEVuY29kZVNvdXJjZUxvYygwLCAxKSxjb250ZXh0LT5zY2FubmVyKTsKKyAgICBjb250ZXh0LT5BZnRlckVPRiA9IGZhbHNlOworICAgIAorICAgIC8vIEluaXQgcHJlcHJvY2Vzc29yLgorICAgIGNwcC0+cEMgPSBjb250ZXh0OworICAgIGNwcC0+UGFXaGljaFN0ciA9IDA7CisgICAgY3BwLT5QYUFyZ3YgICAgID0gc3RyaW5nOworICAgIGNwcC0+UGFBcmdjICAgICA9IGNvdW50OworICAgIGNwcC0+UGFTdHJMZW4gICA9IGxlbmd0aDsKKyAgICBjcHAtPnBhc3RGaXJzdFN0YXRlbWVudCA9IDA7CisgICAgU2NhbkZyb21TdHJpbmcoc3RyaW5nWzBdKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZ2xzbGFuZ190YWIuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvZ2xzbGFuZ190YWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYWM1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nbHNsYW5nX3RhYi5jcHAKQEAgLTAsMCArMSw0NzE2IEBACisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi4zLiAgKi8KKworLyogU2tlbGV0b24gaW1wbGVtZW50YXRpb24gZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQworCisgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgY3JlYXRlIGEgbGFyZ2VyIHdvcmsgdGhhdCBjb250YWlucworICAgcGFydCBvciBhbGwgb2YgdGhlIEJpc29uIHBhcnNlciBza2VsZXRvbiBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKKyAgIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBzbyBsb25nIGFzIHRoYXQgd29yayBpc24ndCBpdHNlbGYgYQorICAgcGFyc2VyIGdlbmVyYXRvciB1c2luZyB0aGUgc2tlbGV0b24gb3IgYSBtb2RpZmllZCB2ZXJzaW9uIHRoZXJlb2YKKyAgIGFzIGEgcGFyc2VyIHNrZWxldG9uLiAgQWx0ZXJuYXRpdmVseSwgaWYgeW91IG1vZGlmeSBvciByZWRpc3RyaWJ1dGUKKyAgIHRoZSBwYXJzZXIgc2tlbGV0b24gaXRzZWxmLCB5b3UgbWF5IChhdCB5b3VyIG9wdGlvbikgcmVtb3ZlIHRoaXMKKyAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZworICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2Ugd2l0aG91dCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uLgorCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCisgICB2ZXJzaW9uIDIuMiBvZiBCaXNvbi4gICovCisKKy8qIEMgTEFMUigxKSBwYXJzZXIgc2tlbGV0b24gd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuLCBieQorICAgc2ltcGxpZnlpbmcgdGhlIG9yaWdpbmFsIHNvLWNhbGxlZCAic2VtYW50aWMiIHBhcnNlci4gICovCisKKy8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCisgICBpbmZyaW5naW5nIG9uIHVzZXIgbmFtZSBzcGFjZS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgZXZlbiBmb3IgbG9jYWwKKyAgIHZhcmlhYmxlcywgYXMgdGhleSBtaWdodCBvdGhlcndpc2UgYmUgZXhwYW5kZWQgYnkgdXNlciBtYWNyb3MuCisgICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCisgICBkZWZpbmUgbmVjZXNzYXJ5IGxpYnJhcnkgc3ltYm9sczsgdGhleSBhcmUgbm90ZWQgIklORlJJTkdFUyBPTgorICAgVVNFUiBOQU1FIFNQQUNFIiBiZWxvdy4gICovCisKKy8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCisjZGVmaW5lIFlZQklTT04gMQorCisvKiBCaXNvbiB2ZXJzaW9uLiAgKi8KKyNkZWZpbmUgWVlCSVNPTl9WRVJTSU9OICIyLjMiCisKKy8qIFNrZWxldG9uIG5hbWUuICAqLworI2RlZmluZSBZWVNLRUxFVE9OX05BTUUgInlhY2MuYyIKKworLyogUHVyZSBwYXJzZXJzLiAgKi8KKyNkZWZpbmUgWVlQVVJFIDEKKworLyogVXNpbmcgbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgWVlMU1BfTkVFREVEIDAKKworCisKKy8qIFRva2Vucy4gICovCisjaWZuZGVmIFlZVE9LRU5UWVBFCisjIGRlZmluZSBZWVRPS0VOVFlQRQorICAgLyogUHV0IHRoZSB0b2tlbnMgaW50byB0aGUgc3ltYm9sIHRhYmxlLCBzbyB0aGF0IEdEQiBhbmQgb3RoZXIgZGVidWdnZXJzCisgICAgICBrbm93IGFib3V0IHRoZW0uICAqLworICAgZW51bSB5eXRva2VudHlwZSB7CisgICAgIElOVkFSSUFOVCA9IDI1OCwKKyAgICAgSElHSF9QUkVDSVNJT04gPSAyNTksCisgICAgIE1FRElVTV9QUkVDSVNJT04gPSAyNjAsCisgICAgIExPV19QUkVDSVNJT04gPSAyNjEsCisgICAgIFBSRUNJU0lPTiA9IDI2MiwKKyAgICAgQVRUUklCVVRFID0gMjYzLAorICAgICBDT05TVF9RVUFMID0gMjY0LAorICAgICBCT09MX1RZUEUgPSAyNjUsCisgICAgIEZMT0FUX1RZUEUgPSAyNjYsCisgICAgIElOVF9UWVBFID0gMjY3LAorICAgICBCUkVBSyA9IDI2OCwKKyAgICAgQ09OVElOVUUgPSAyNjksCisgICAgIERPID0gMjcwLAorICAgICBFTFNFID0gMjcxLAorICAgICBGT1IgPSAyNzIsCisgICAgIElGID0gMjczLAorICAgICBESVNDQVJEID0gMjc0LAorICAgICBSRVRVUk4gPSAyNzUsCisgICAgIEJWRUMyID0gMjc2LAorICAgICBCVkVDMyA9IDI3NywKKyAgICAgQlZFQzQgPSAyNzgsCisgICAgIElWRUMyID0gMjc5LAorICAgICBJVkVDMyA9IDI4MCwKKyAgICAgSVZFQzQgPSAyODEsCisgICAgIFZFQzIgPSAyODIsCisgICAgIFZFQzMgPSAyODMsCisgICAgIFZFQzQgPSAyODQsCisgICAgIE1BVFJJWDIgPSAyODUsCisgICAgIE1BVFJJWDMgPSAyODYsCisgICAgIE1BVFJJWDQgPSAyODcsCisgICAgIElOX1FVQUwgPSAyODgsCisgICAgIE9VVF9RVUFMID0gMjg5LAorICAgICBJTk9VVF9RVUFMID0gMjkwLAorICAgICBVTklGT1JNID0gMjkxLAorICAgICBWQVJZSU5HID0gMjkyLAorICAgICBTVFJVQ1QgPSAyOTMsCisgICAgIFZPSURfVFlQRSA9IDI5NCwKKyAgICAgV0hJTEUgPSAyOTUsCisgICAgIFNBTVBMRVIyRCA9IDI5NiwKKyAgICAgU0FNUExFUkNVQkUgPSAyOTcsCisgICAgIElERU5USUZJRVIgPSAyOTgsCisgICAgIFRZUEVfTkFNRSA9IDI5OSwKKyAgICAgRkxPQVRDT05TVEFOVCA9IDMwMCwKKyAgICAgSU5UQ09OU1RBTlQgPSAzMDEsCisgICAgIEJPT0xDT05TVEFOVCA9IDMwMiwKKyAgICAgRklFTERfU0VMRUNUSU9OID0gMzAzLAorICAgICBMRUZUX09QID0gMzA0LAorICAgICBSSUdIVF9PUCA9IDMwNSwKKyAgICAgSU5DX09QID0gMzA2LAorICAgICBERUNfT1AgPSAzMDcsCisgICAgIExFX09QID0gMzA4LAorICAgICBHRV9PUCA9IDMwOSwKKyAgICAgRVFfT1AgPSAzMTAsCisgICAgIE5FX09QID0gMzExLAorICAgICBBTkRfT1AgPSAzMTIsCisgICAgIE9SX09QID0gMzEzLAorICAgICBYT1JfT1AgPSAzMTQsCisgICAgIE1VTF9BU1NJR04gPSAzMTUsCisgICAgIERJVl9BU1NJR04gPSAzMTYsCisgICAgIEFERF9BU1NJR04gPSAzMTcsCisgICAgIE1PRF9BU1NJR04gPSAzMTgsCisgICAgIExFRlRfQVNTSUdOID0gMzE5LAorICAgICBSSUdIVF9BU1NJR04gPSAzMjAsCisgICAgIEFORF9BU1NJR04gPSAzMjEsCisgICAgIFhPUl9BU1NJR04gPSAzMjIsCisgICAgIE9SX0FTU0lHTiA9IDMyMywKKyAgICAgU1VCX0FTU0lHTiA9IDMyNCwKKyAgICAgTEVGVF9QQVJFTiA9IDMyNSwKKyAgICAgUklHSFRfUEFSRU4gPSAzMjYsCisgICAgIExFRlRfQlJBQ0tFVCA9IDMyNywKKyAgICAgUklHSFRfQlJBQ0tFVCA9IDMyOCwKKyAgICAgTEVGVF9CUkFDRSA9IDMyOSwKKyAgICAgUklHSFRfQlJBQ0UgPSAzMzAsCisgICAgIERPVCA9IDMzMSwKKyAgICAgQ09NTUEgPSAzMzIsCisgICAgIENPTE9OID0gMzMzLAorICAgICBFUVVBTCA9IDMzNCwKKyAgICAgU0VNSUNPTE9OID0gMzM1LAorICAgICBCQU5HID0gMzM2LAorICAgICBEQVNIID0gMzM3LAorICAgICBUSUxERSA9IDMzOCwKKyAgICAgUExVUyA9IDMzOSwKKyAgICAgU1RBUiA9IDM0MCwKKyAgICAgU0xBU0ggPSAzNDEsCisgICAgIFBFUkNFTlQgPSAzNDIsCisgICAgIExFRlRfQU5HTEUgPSAzNDMsCisgICAgIFJJR0hUX0FOR0xFID0gMzQ0LAorICAgICBWRVJUSUNBTF9CQVIgPSAzNDUsCisgICAgIENBUkVUID0gMzQ2LAorICAgICBBTVBFUlNBTkQgPSAzNDcsCisgICAgIFFVRVNUSU9OID0gMzQ4CisgICB9OworI2VuZGlmCisvKiBUb2tlbnMuICAqLworI2RlZmluZSBJTlZBUklBTlQgMjU4CisjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIDI1OQorI2RlZmluZSBNRURJVU1fUFJFQ0lTSU9OIDI2MAorI2RlZmluZSBMT1dfUFJFQ0lTSU9OIDI2MQorI2RlZmluZSBQUkVDSVNJT04gMjYyCisjZGVmaW5lIEFUVFJJQlVURSAyNjMKKyNkZWZpbmUgQ09OU1RfUVVBTCAyNjQKKyNkZWZpbmUgQk9PTF9UWVBFIDI2NQorI2RlZmluZSBGTE9BVF9UWVBFIDI2NgorI2RlZmluZSBJTlRfVFlQRSAyNjcKKyNkZWZpbmUgQlJFQUsgMjY4CisjZGVmaW5lIENPTlRJTlVFIDI2OQorI2RlZmluZSBETyAyNzAKKyNkZWZpbmUgRUxTRSAyNzEKKyNkZWZpbmUgRk9SIDI3MgorI2RlZmluZSBJRiAyNzMKKyNkZWZpbmUgRElTQ0FSRCAyNzQKKyNkZWZpbmUgUkVUVVJOIDI3NQorI2RlZmluZSBCVkVDMiAyNzYKKyNkZWZpbmUgQlZFQzMgMjc3CisjZGVmaW5lIEJWRUM0IDI3OAorI2RlZmluZSBJVkVDMiAyNzkKKyNkZWZpbmUgSVZFQzMgMjgwCisjZGVmaW5lIElWRUM0IDI4MQorI2RlZmluZSBWRUMyIDI4MgorI2RlZmluZSBWRUMzIDI4MworI2RlZmluZSBWRUM0IDI4NAorI2RlZmluZSBNQVRSSVgyIDI4NQorI2RlZmluZSBNQVRSSVgzIDI4NgorI2RlZmluZSBNQVRSSVg0IDI4NworI2RlZmluZSBJTl9RVUFMIDI4OAorI2RlZmluZSBPVVRfUVVBTCAyODkKKyNkZWZpbmUgSU5PVVRfUVVBTCAyOTAKKyNkZWZpbmUgVU5JRk9STSAyOTEKKyNkZWZpbmUgVkFSWUlORyAyOTIKKyNkZWZpbmUgU1RSVUNUIDI5MworI2RlZmluZSBWT0lEX1RZUEUgMjk0CisjZGVmaW5lIFdISUxFIDI5NQorI2RlZmluZSBTQU1QTEVSMkQgMjk2CisjZGVmaW5lIFNBTVBMRVJDVUJFIDI5NworI2RlZmluZSBJREVOVElGSUVSIDI5OAorI2RlZmluZSBUWVBFX05BTUUgMjk5CisjZGVmaW5lIEZMT0FUQ09OU1RBTlQgMzAwCisjZGVmaW5lIElOVENPTlNUQU5UIDMwMQorI2RlZmluZSBCT09MQ09OU1RBTlQgMzAyCisjZGVmaW5lIEZJRUxEX1NFTEVDVElPTiAzMDMKKyNkZWZpbmUgTEVGVF9PUCAzMDQKKyNkZWZpbmUgUklHSFRfT1AgMzA1CisjZGVmaW5lIElOQ19PUCAzMDYKKyNkZWZpbmUgREVDX09QIDMwNworI2RlZmluZSBMRV9PUCAzMDgKKyNkZWZpbmUgR0VfT1AgMzA5CisjZGVmaW5lIEVRX09QIDMxMAorI2RlZmluZSBORV9PUCAzMTEKKyNkZWZpbmUgQU5EX09QIDMxMgorI2RlZmluZSBPUl9PUCAzMTMKKyNkZWZpbmUgWE9SX09QIDMxNAorI2RlZmluZSBNVUxfQVNTSUdOIDMxNQorI2RlZmluZSBESVZfQVNTSUdOIDMxNgorI2RlZmluZSBBRERfQVNTSUdOIDMxNworI2RlZmluZSBNT0RfQVNTSUdOIDMxOAorI2RlZmluZSBMRUZUX0FTU0lHTiAzMTkKKyNkZWZpbmUgUklHSFRfQVNTSUdOIDMyMAorI2RlZmluZSBBTkRfQVNTSUdOIDMyMQorI2RlZmluZSBYT1JfQVNTSUdOIDMyMgorI2RlZmluZSBPUl9BU1NJR04gMzIzCisjZGVmaW5lIFNVQl9BU1NJR04gMzI0CisjZGVmaW5lIExFRlRfUEFSRU4gMzI1CisjZGVmaW5lIFJJR0hUX1BBUkVOIDMyNgorI2RlZmluZSBMRUZUX0JSQUNLRVQgMzI3CisjZGVmaW5lIFJJR0hUX0JSQUNLRVQgMzI4CisjZGVmaW5lIExFRlRfQlJBQ0UgMzI5CisjZGVmaW5lIFJJR0hUX0JSQUNFIDMzMAorI2RlZmluZSBET1QgMzMxCisjZGVmaW5lIENPTU1BIDMzMgorI2RlZmluZSBDT0xPTiAzMzMKKyNkZWZpbmUgRVFVQUwgMzM0CisjZGVmaW5lIFNFTUlDT0xPTiAzMzUKKyNkZWZpbmUgQkFORyAzMzYKKyNkZWZpbmUgREFTSCAzMzcKKyNkZWZpbmUgVElMREUgMzM4CisjZGVmaW5lIFBMVVMgMzM5CisjZGVmaW5lIFNUQVIgMzQwCisjZGVmaW5lIFNMQVNIIDM0MQorI2RlZmluZSBQRVJDRU5UIDM0MgorI2RlZmluZSBMRUZUX0FOR0xFIDM0MworI2RlZmluZSBSSUdIVF9BTkdMRSAzNDQKKyNkZWZpbmUgVkVSVElDQUxfQkFSIDM0NQorI2RlZmluZSBDQVJFVCAzNDYKKyNkZWZpbmUgQU1QRVJTQU5EIDM0NworI2RlZmluZSBRVUVTVElPTiAzNDgKKworCisKKworLyogQ29weSB0aGUgZmlyc3QgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCisKKworLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlX2dsc2xhbmdfcGFyc2VyLnNoLiBETyBOT1QgRURJVCEKKworI2luY2x1ZGUgImNvbXBpbGVyL1N5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvUGFyc2VIZWxwZXIuaCIKKyNpbmNsdWRlICJHTFNMQU5HL1NoYWRlckxhbmcuaCIKKworI2RlZmluZSBZWUxFWF9QQVJBTSBjb250ZXh0LT5zY2FubmVyCisKKworLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KKyNpZm5kZWYgWVlERUJVRworIyBkZWZpbmUgWVlERUJVRyAwCisjZW5kaWYKKworLyogRW5hYmxpbmcgdmVyYm9zZSBlcnJvciBtZXNzYWdlcy4gICovCisjaWZkZWYgWVlFUlJPUl9WRVJCT1NFCisjIHVuZGVmIFlZRVJST1JfVkVSQk9TRQorIyBkZWZpbmUgWVlFUlJPUl9WRVJCT1NFIDEKKyNlbHNlCisjIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMAorI2VuZGlmCisKKy8qIEVuYWJsaW5nIHRoZSB0b2tlbiB0YWJsZS4gICovCisjaWZuZGVmIFlZVE9LRU5fVEFCTEUKKyMgZGVmaW5lIFlZVE9LRU5fVEFCTEUgMAorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgWVlTVFlQRSAmJiAhIGRlZmluZWQgWVlTVFlQRV9JU19ERUNMQVJFRAordHlwZWRlZiB1bmlvbiBZWVNUWVBFCisKK3sKKyAgICBzdHJ1Y3QgeworICAgICAgICBUU291cmNlTG9jIGxpbmU7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIFRTdHJpbmcgKnN0cmluZzsKKyAgICAgICAgICAgIGZsb2F0IGY7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGJvb2wgYjsKKyAgICAgICAgfTsKKyAgICAgICAgVFN5bWJvbCogc3ltYm9sOworICAgIH0gbGV4OworICAgIHN0cnVjdCB7CisgICAgICAgIFRTb3VyY2VMb2MgbGluZTsKKyAgICAgICAgVE9wZXJhdG9yIG9wOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBUSW50ZXJtTm9kZSogaW50ZXJtTm9kZTsKKyAgICAgICAgICAgIFRJbnRlcm1Ob2RlUGFpciBub2RlUGFpcjsKKyAgICAgICAgICAgIFRJbnRlcm1UeXBlZCogaW50ZXJtVHlwZWROb2RlOworICAgICAgICAgICAgVEludGVybUFnZ3JlZ2F0ZSogaW50ZXJtQWdncmVnYXRlOworICAgICAgICB9OworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBUUHVibGljVHlwZSB0eXBlOworICAgICAgICAgICAgVFByZWNpc2lvbiBwcmVjaXNpb247CisgICAgICAgICAgICBUUXVhbGlmaWVyIHF1YWxpZmllcjsKKyAgICAgICAgICAgIFRGdW5jdGlvbiogZnVuY3Rpb247CisgICAgICAgICAgICBUUGFyYW1ldGVyIHBhcmFtOworICAgICAgICAgICAgVFR5cGVMaW5lIHR5cGVMaW5lOworICAgICAgICAgICAgVFR5cGVMaXN0KiB0eXBlTGlzdDsKKyAgICAgICAgfTsKKyAgICB9IGludGVybTsKK30KKy8qIExpbmUgMTkzIG9mIHlhY2MuYy4gICovCisKKwlZWVNUWVBFOworIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLworIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCisjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQorI2VuZGlmCisKKworCisvKiBDb3B5IHRoZSBzZWNvbmQgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCisKKworZXh0ZXJuIGludCB5eWxleChZWVNUWVBFKiB5eWx2YWxfcGFyYW0sIHZvaWQqIHl5c2Nhbm5lcik7CitleHRlcm4gdm9pZCB5eWVycm9yKFRQYXJzZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIHJlYXNvbik7CisKKyNkZWZpbmUgRlJBR19WRVJUX09OTFkoUywgTCkgeyAgXAorICAgIGlmIChjb250ZXh0LT5zaGFkZXJUeXBlICE9IFNIX0ZSQUdNRU5UX1NIQURFUiAmJiAgXAorICAgICAgICBjb250ZXh0LT5zaGFkZXJUeXBlICE9IFNIX1ZFUlRFWF9TSEFERVIpIHsgIFwKKyAgICAgICAgY29udGV4dC0+ZXJyb3IoTCwgIiBzdXBwb3J0ZWQgaW4gdmVydGV4L2ZyYWdtZW50IHNoYWRlcnMgb25seSAiLCBTLCAiIiwgIiIpOyAgXAorICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7ICBcCisgICAgfSAgXAorfQorCisjZGVmaW5lIFZFUlRFWF9PTkxZKFMsIEwpIHsgIFwKKyAgICBpZiAoY29udGV4dC0+c2hhZGVyVHlwZSAhPSBTSF9WRVJURVhfU0hBREVSKSB7ICBcCisgICAgICAgIGNvbnRleHQtPmVycm9yKEwsICIgc3VwcG9ydGVkIGluIHZlcnRleCBzaGFkZXJzIG9ubHkgIiwgUywgIiIsICIiKTsgIFwKKyAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOyAgXAorICAgIH0gIFwKK30KKworI2RlZmluZSBGUkFHX09OTFkoUywgTCkgeyAgXAorICAgIGlmIChjb250ZXh0LT5zaGFkZXJUeXBlICE9IFNIX0ZSQUdNRU5UX1NIQURFUikgeyAgXAorICAgICAgICBjb250ZXh0LT5lcnJvcihMLCAiIHN1cHBvcnRlZCBpbiBmcmFnbWVudCBzaGFkZXJzIG9ubHkgIiwgUywgIiIsICIiKTsgIFwKKyAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOyAgXAorICAgIH0gIFwKK30KKworCisvKiBMaW5lIDIxNiBvZiB5YWNjLmMuICAqLworCisKKyNpZmRlZiBzaG9ydAorIyB1bmRlZiBzaG9ydAorI2VuZGlmCisKKyNpZmRlZiBZWVRZUEVfVUlOVDgKK3R5cGVkZWYgWVlUWVBFX1VJTlQ4IHl5dHlwZV91aW50ODsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgeXl0eXBlX3VpbnQ4OworI2VuZGlmCisKKyNpZmRlZiBZWVRZUEVfSU5UOAordHlwZWRlZiBZWVRZUEVfSU5UOCB5eXR5cGVfaW50ODsKKyNlbGlmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIGNoYXIgeXl0eXBlX2ludDg7CisjZWxzZQordHlwZWRlZiBzaG9ydCBpbnQgeXl0eXBlX2ludDg7CisjZW5kaWYKKworI2lmZGVmIFlZVFlQRV9VSU5UMTYKK3R5cGVkZWYgWVlUWVBFX1VJTlQxNiB5eXR5cGVfdWludDE2OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHl5dHlwZV91aW50MTY7CisjZW5kaWYKKworI2lmZGVmIFlZVFlQRV9JTlQxNgordHlwZWRlZiBZWVRZUEVfSU5UMTYgeXl0eXBlX2ludDE2OworI2Vsc2UKK3R5cGVkZWYgc2hvcnQgaW50IHl5dHlwZV9pbnQxNjsKKyNlbmRpZgorCisjaWZuZGVmIFlZU0laRV9UCisjIGlmZGVmIF9fU0laRV9UWVBFX18KKyMgIGRlZmluZSBZWVNJWkVfVCBfX1NJWkVfVFlQRV9fCisjIGVsaWYgZGVmaW5lZCBzaXplX3QKKyMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgZWxpZiAhIGRlZmluZWQgWVlTSVpFX1QgJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorIyAgaW5jbHVkZSA8c3RkZGVmLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgZWxzZQorIyAgZGVmaW5lIFlZU0laRV9UIHVuc2lnbmVkIGludAorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgWVlTSVpFX01BWElNVU0gKChZWVNJWkVfVCkgLTEpCisKKyNpZm5kZWYgWVlfCisjIGlmIGRlZmluZWQgWVlFTkFCTEVfTkxTICYmIFlZRU5BQkxFX05MUworIyAgaWYgRU5BQkxFX05MUworIyAgIGluY2x1ZGUgPGxpYmludGwuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGRlZmluZSBZWV8obXNnaWQpIGRnZXR0ZXh0ICgiYmlzb24tcnVudGltZSIsIG1zZ2lkKQorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZuZGVmIFlZXworIyAgZGVmaW5lIFlZXyhtc2dpZCkgbXNnaWQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTdXBwcmVzcyB1bnVzZWQtdmFyaWFibGUgd2FybmluZ3MgYnkgInVzaW5nIiBFLiAgKi8KKyNpZiAhIGRlZmluZWQgbGludCB8fCBkZWZpbmVkIF9fR05VQ19fCisjIGRlZmluZSBZWVVTRShlKSAoKHZvaWQpIChlKSkKKyNlbHNlCisjIGRlZmluZSBZWVVTRShlKSAvKiBlbXB0eSAqLworI2VuZGlmCisKKy8qIElkZW50aXR5IGZ1bmN0aW9uLCB1c2VkIHRvIHN1cHByZXNzIHdhcm5pbmdzIGFib3V0IGNvbnN0YW50IGNvbmRpdGlvbnMuICAqLworI2lmbmRlZiBsaW50CisjIGRlZmluZSBZWUlEKG4pIChuKQorI2Vsc2UKKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgaW50CitZWUlEIChpbnQgaSkKKyNlbHNlCitzdGF0aWMgaW50CitZWUlEIChpKQorICAgIGludCBpOworI2VuZGlmCit7CisgIHJldHVybiBpOworfQorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgeXlvdmVyZmxvdyB8fCBZWUVSUk9SX1ZFUkJPU0UKKworLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLworCisjIGlmZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQorIyAgaWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICAgaWZkZWYgX19HTlVDX18KKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQorIyAgIGVsaWYgZGVmaW5lZCBfX0JVSUxUSU5fVkFfQVJHX0lOQ1IKKyMgICAgaW5jbHVkZSA8YWxsb2NhLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBlbGlmIGRlZmluZWQgX0FJWAorIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBfX2FsbG9jYQorIyAgIGVsaWYgZGVmaW5lZCBfTVNDX1ZFUgorIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgICBlbHNlCisjICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorIyAgICBpZiAhIGRlZmluZWQgX0FMTE9DQV9IICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorIyAgICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICAgIGlmbmRlZiBfU1RETElCX0gKKyMgICAgICBkZWZpbmUgX1NURExJQl9IIDEKKyMgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgWVlTVEFDS19BTExPQworICAgLyogUGFjaWZ5IEdDQydzIGBlbXB0eSBpZi1ib2R5JyB3YXJuaW5nLiAgKi8KKyMgIGRlZmluZSBZWVNUQUNLX0ZSRUUoUHRyKSBkbyB7IC8qIGVtcHR5ICovOyB9IHdoaWxlIChZWUlEICgwKSkKKyMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KKyAgICAvKiBUaGUgT1MgbWlnaHQgZ3VhcmFudGVlIG9ubHkgb25lIGd1YXJkIHBhZ2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2ssCisgICAgICAgYW5kIGEgcGFnZSBzaXplIGNhbiBiZSBhcyBzbWFsbCBhcyA0MDk2IGJ5dGVzLiAgU28gd2UgY2Fubm90IHNhZmVseQorICAgICAgIGludm9rZSBhbGxvY2EgKE4pIGlmIE4gZXhjZWVkcyA0MDk2LiAgVXNlIGEgc2xpZ2h0bHkgc21hbGxlciBudW1iZXIKKyAgICAgICB0byBhbGxvdyBmb3IgYSBmZXcgY29tcGlsZXItYWxsb2NhdGVkIHRlbXBvcmFyeSBzdGFjayBzbG90cy4gICovCisjICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSA0MDMyIC8qIHJlYXNvbmFibGUgY2lyY2EgMjAwNiAqLworIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgWVlNQUxMT0MKKyMgIGRlZmluZSBZWVNUQUNLX0ZSRUUgWVlGUkVFCisjICBpZm5kZWYgWVlTVEFDS19BTExPQ19NQVhJTVVNCisjICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSBZWVNJWkVfTUFYSU1VTQorIyAgZW5kaWYKKyMgIGlmIChkZWZpbmVkIF9fY3BsdXNwbHVzICYmICEgZGVmaW5lZCBfU1RETElCX0ggXAorICAgICAgICYmICEgKChkZWZpbmVkIFlZTUFMTE9DIHx8IGRlZmluZWQgbWFsbG9jKSBcCisJICAgICAmJiAoZGVmaW5lZCBZWUZSRUUgfHwgZGVmaW5lZCBmcmVlKSkpCisjICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBpZm5kZWYgX1NURExJQl9ICisjICAgIGRlZmluZSBfU1RETElCX0ggMQorIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZuZGVmIFlZTUFMTE9DCisjICAgZGVmaW5lIFlZTUFMTE9DIG1hbGxvYworIyAgIGlmICEgZGVmaW5lZCBtYWxsb2MgJiYgISBkZWZpbmVkIF9TVERMSUJfSCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCit2b2lkICptYWxsb2MgKFlZU0laRV9UKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZuZGVmIFlZRlJFRQorIyAgIGRlZmluZSBZWUZSRUUgZnJlZQorIyAgIGlmICEgZGVmaW5lZCBmcmVlICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQordm9pZCBmcmVlICh2b2lkICopOyAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYgLyogISBkZWZpbmVkIHl5b3ZlcmZsb3cgfHwgWVlFUlJPUl9WRVJCT1NFICovCisKKworI2lmICghIGRlZmluZWQgeXlvdmVyZmxvdyBcCisgICAgICYmICghIGRlZmluZWQgX19jcGx1c3BsdXMgXAorCSB8fCAoZGVmaW5lZCBZWVNUWVBFX0lTX1RSSVZJQUwgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCisKKy8qIEEgdHlwZSB0aGF0IGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIGFueSBzdGFjayBtZW1iZXIuICAqLwordW5pb24geXlhbGxvYworeworICB5eXR5cGVfaW50MTYgeXlzczsKKyAgWVlTVFlQRSB5eXZzOworICB9OworCisvKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLworIyBkZWZpbmUgWVlTVEFDS19HQVBfTUFYSU1VTSAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCisKKy8qIFRoZSBzaXplIG9mIGFuIGFycmF5IGxhcmdlIHRvIGVub3VnaCB0byBob2xkIGFsbCBzdGFja3MsIGVhY2ggd2l0aAorICAgTiBlbGVtZW50cy4gICovCisjIGRlZmluZSBZWVNUQUNLX0JZVEVTKE4pIFwKKyAgICAgKChOKSAqIChzaXplb2YgKHl5dHlwZV9pbnQxNikgKyBzaXplb2YgKFlZU1RZUEUpKSBcCisgICAgICArIFlZU1RBQ0tfR0FQX01BWElNVU0pCisKKy8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIEZST00gdG8gVE8uICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbworICAgbm90IG92ZXJsYXAuICAqLworIyBpZm5kZWYgWVlDT1BZCisjICBpZiBkZWZpbmVkIF9fR05VQ19fICYmIDEgPCBfX0dOVUNfXworIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KSBcCisgICAgICBfX2J1aWx0aW5fbWVtY3B5IChUbywgRnJvbSwgKENvdW50KSAqIHNpemVvZiAoKihGcm9tKSkpCisjICBlbHNlCisjICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpCQlcCisgICAgICBkbwkJCQkJXAorCXsJCQkJCVwKKwkgIFlZU0laRV9UIHl5aTsJCQkJXAorCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAorCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKKwl9CQkJCQlcCisgICAgICB3aGlsZSAoWVlJRCAoMCkpCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBSZWxvY2F0ZSBTVEFDSyBmcm9tIGl0cyBvbGQgbG9jYXRpb24gdG8gdGhlIG5ldyBvbmUuICBUaGUKKyAgIGxvY2FsIHZhcmlhYmxlcyBZWVNJWkUgYW5kIFlZU1RBQ0tTSVpFIGdpdmUgdGhlIG9sZCBhbmQgbmV3IG51bWJlciBvZgorICAgZWxlbWVudHMgaW4gdGhlIHN0YWNrLCBhbmQgWVlQVFIgZ2l2ZXMgdGhlIG5ldyBsb2NhdGlvbiBvZiB0aGUKKyAgIHN0YWNrLiAgQWR2YW5jZSBZWVBUUiB0byBhIHByb3Blcmx5IGFsaWduZWQgbG9jYXRpb24gZm9yIHRoZSBuZXh0CisgICBzdGFjay4gICovCisjIGRlZmluZSBZWVNUQUNLX1JFTE9DQVRFKFN0YWNrKQkJCQkJXAorICAgIGRvCQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlZWVNJWkVfVCB5eW5ld2J5dGVzOwkJCQkJCVwKKwlZWUNPUFkgKCZ5eXB0ci0+U3RhY2ssIFN0YWNrLCB5eXNpemUpOwkJCQlcCisJU3RhY2sgPSAmeXlwdHItPlN0YWNrOwkJCQkJCVwKKwl5eW5ld2J5dGVzID0geXlzdGFja3NpemUgKiBzaXplb2YgKCpTdGFjaykgKyBZWVNUQUNLX0dBUF9NQVhJTVVNOyBcCisJeXlwdHIgKz0geXluZXdieXRlcyAvIHNpemVvZiAoKnl5cHRyKTsJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICB3aGlsZSAoWVlJRCAoMCkpCisKKyNlbmRpZgorCisvKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICAqLworI2RlZmluZSBZWUZJTkFMICA2OQorLyogWVlMQVNUIC0tIExhc3QgaW5kZXggaW4gWVlUQUJMRS4gICovCisjZGVmaW5lIFlZTEFTVCAgIDEzMzQKKworLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICAqLworI2RlZmluZSBZWU5UT0tFTlMgIDk0CisvKiBZWU5OVFMgLS0gTnVtYmVyIG9mIG5vbnRlcm1pbmFscy4gICovCisjZGVmaW5lIFlZTk5UUyAgNzgKKy8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBydWxlcy4gICovCisjZGVmaW5lIFlZTlJVTEVTICAxOTMKKy8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBzdGF0ZXMuICAqLworI2RlZmluZSBZWU5TVEFURVMgIDI5NgorCisvKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KKyNkZWZpbmUgWVlVTkRFRlRPSyAgMgorI2RlZmluZSBZWU1BWFVUT0sgICAzNDgKKworI2RlZmluZSBZWVRSQU5TTEFURShZWVgpCQkJCQkJXAorICAoKHVuc2lnbmVkIGludCkgKFlZWCkgPD0gWVlNQVhVVE9LID8geXl0cmFuc2xhdGVbWVlYXSA6IFlZVU5ERUZUT0spCisKKy8qIFlZVFJBTlNMQVRFW1lZTEVYXSAtLSBCaXNvbiBzeW1ib2wgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXRyYW5zbGF0ZVtdID0KK3sKKyAgICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsCisgICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwKKyAgICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LAorICAgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQsCisgICAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwKKyAgICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LAorICAgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsCisgICAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwKKyAgICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgIDg0LAorICAgICAgODUsICAgIDg2LCAgICA4NywgICAgODgsICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MworfTsKKworI2lmIFlZREVCVUcKKy8qIFlZUFJIU1tZWU5dIC0tIEluZGV4IG9mIHRoZSBmaXJzdCBSSFMgc3ltYm9sIG9mIHJ1bGUgbnVtYmVyIFlZTiBpbgorICAgWVlSSFMuICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXlwcmhzW10gPQoreworICAgICAgIDAsICAgICAwLCAgICAgMywgICAgIDUsICAgICA3LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMTksCisgICAgICAyNCwgICAgMjYsICAgIDMwLCAgICAzMywgICAgMzYsICAgIDM4LCAgICA0MCwgICAgNDIsICAgIDQ2LCAgICA0OSwKKyAgICAgIDUyLCAgICA1NSwgICAgNTcsICAgIDYwLCAgICA2NCwgICAgNjcsICAgIDY5LCAgICA3MSwgICAgNzMsICAgIDc1LAorICAgICAgNzgsICAgIDgxLCAgICA4NCwgICAgODYsICAgIDg4LCAgICA5MCwgICAgOTIsICAgIDk2LCAgIDEwMCwgICAxMDIsCisgICAgIDEwNiwgICAxMTAsICAgMTEyLCAgIDExNCwgICAxMTgsICAgMTIyLCAgIDEyNiwgICAxMzAsICAgMTMyLCAgIDEzNiwKKyAgICAgMTQwLCAgIDE0MiwgICAxNDQsICAgMTQ2LCAgIDE0OCwgICAxNTIsICAgMTU0LCAgIDE1OCwgICAxNjAsICAgMTY0LAorICAgICAxNjYsICAgMTcyLCAgIDE3NCwgICAxNzgsICAgMTgwLCAgIDE4MiwgICAxODQsICAgMTg2LCAgIDE4OCwgICAxOTAsCisgICAgIDE5NCwgICAxOTYsICAgMTk5LCAgIDIwMiwgICAyMDcsICAgMjEwLCAgIDIxMiwgICAyMTQsICAgMjE3LCAgIDIyMSwKKyAgICAgMjI1LCAgIDIyOCwgICAyMzQsICAgMjM4LCAgIDI0MSwgICAyNDUsICAgMjQ4LCAgIDI0OSwgICAyNTEsICAgMjUzLAorICAgICAyNTUsICAgMjU3LCAgIDI1OSwgICAyNjMsICAgMjY5LCAgIDI3NiwgICAyODIsICAgMjg0LCAgIDI4NywgICAyOTIsCisgICAgIDI5OCwgICAzMDMsICAgMzA2LCAgIDMwOCwgICAzMTEsICAgMzEzLCAgIDMxNSwgICAzMTcsICAgMzIwLCAgIDMyMiwKKyAgICAgMzI0LCAgIDMyNywgICAzMjksICAgMzMxLCAgIDMzMywgICAzMzUsICAgMzQwLCAgIDM0MiwgICAzNDQsICAgMzQ2LAorICAgICAzNDgsICAgMzUwLCAgIDM1MiwgICAzNTQsICAgMzU2LCAgIDM1OCwgICAzNjAsICAgMzYyLCAgIDM2NCwgICAzNjYsCisgICAgIDM2OCwgICAzNzAsICAgMzcyLCAgIDM3NCwgICAzNzYsICAgMzc4LCAgIDM4MCwgICAzODYsICAgMzkxLCAgIDM5MywKKyAgICAgMzk2LCAgIDQwMCwgICA0MDIsICAgNDA2LCAgIDQwOCwgICA0MTMsICAgNDE1LCAgIDQxNywgICA0MTksICAgNDIxLAorICAgICA0MjMsICAgNDI1LCAgIDQyNywgICA0MjksICAgNDMxLCAgIDQzNCwgICA0MzUsICAgNDM2LCAgIDQ0MiwgICA0NDQsCisgICAgIDQ0NiwgICA0NDksICAgNDUzLCAgIDQ1NSwgICA0NTgsICAgNDYwLCAgIDQ2MywgICA0NjksICAgNDczLCAgIDQ3NSwKKyAgICAgNDc3LCAgIDQ4MiwgICA0ODMsICAgNDkwLCAgIDQ5MSwgICA1MDAsICAgNTAxLCAgIDUwOSwgICA1MTEsICAgNTEzLAorICAgICA1MTUsICAgNTE2LCAgIDUxOSwgICA1MjMsICAgNTI2LCAgIDUyOSwgICA1MzIsICAgNTM2LCAgIDUzOSwgICA1NDEsCisgICAgIDU0NCwgICA1NDYsICAgNTQ4LCAgIDU0OQorfTsKKworLyogWVlSSFMgLS0gQSBgLTEnLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBydWxlcycgUkhTLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXlyaHNbXSA9Cit7CisgICAgIDE2OCwgICAgIDAsICAgIC0xLCAgICA0MywgICAgLTEsICAgIDk1LCAgICAtMSwgICAgNDYsICAgIC0xLCAgICA0NSwKKyAgICAgIC0xLCAgICA0NywgICAgLTEsICAgIDcwLCAgIDEyMiwgICAgNzEsICAgIC0xLCAgICA5NiwgICAgLTEsICAgIDk3LAorICAgICAgNzIsICAgIDk4LCAgICA3MywgICAgLTEsICAgIDk5LCAgICAtMSwgICAgOTcsICAgIDc2LCAgICA0OCwgICAgLTEsCisgICAgICA5NywgICAgNTEsICAgIC0xLCAgICA5NywgICAgNTIsICAgIC0xLCAgIDEyMiwgICAgLTEsICAgMTAwLCAgICAtMSwKKyAgICAgMTAxLCAgICAtMSwgICAgOTcsICAgIDc2LCAgIDEwMSwgICAgLTEsICAgMTAzLCAgICA3MSwgICAgLTEsICAgMTAyLAorICAgICAgNzEsICAgIC0xLCAgIDEwNCwgICAgMzksICAgIC0xLCAgIDEwNCwgICAgLTEsICAgMTA0LCAgIDEyMCwgICAgLTEsCisgICAgIDEwMywgICAgNzcsICAgMTIwLCAgICAtMSwgICAxMDUsICAgIDcwLCAgICAtMSwgICAxMzcsICAgIC0xLCAgICA0MywKKyAgICAgIC0xLCAgICA0OCwgICAgLTEsICAgIDk3LCAgICAtMSwgICAgNTEsICAgMTA2LCAgICAtMSwgICAgNTIsICAgMTA2LAorICAgICAgLTEsICAgMTA3LCAgIDEwNiwgICAgLTEsICAgIDg0LCAgICAtMSwgICAgODIsICAgIC0xLCAgICA4MSwgICAgLTEsCisgICAgIDEwNiwgICAgLTEsICAgMTA4LCAgICA4NSwgICAxMDYsICAgIC0xLCAgIDEwOCwgICAgODYsICAgMTA2LCAgICAtMSwKKyAgICAgMTA4LCAgICAtMSwgICAxMDksICAgIDg0LCAgIDEwOCwgICAgLTEsICAgMTA5LCAgICA4MiwgICAxMDgsICAgIC0xLAorICAgICAxMDksICAgIC0xLCAgIDExMCwgICAgLTEsICAgMTExLCAgICA4OCwgICAxMTAsICAgIC0xLCAgIDExMSwgICAgODksCisgICAgIDExMCwgICAgLTEsICAgMTExLCAgICA1MywgICAxMTAsICAgIC0xLCAgIDExMSwgICAgNTQsICAgMTEwLCAgICAtMSwKKyAgICAgMTExLCAgICAtMSwgICAxMTIsICAgIDU1LCAgIDExMSwgICAgLTEsICAgMTEyLCAgICA1NiwgICAxMTEsICAgIC0xLAorICAgICAxMTIsICAgIC0xLCAgIDExMywgICAgLTEsICAgMTE0LCAgICAtMSwgICAxMTUsICAgIC0xLCAgIDExNiwgICAgNTcsCisgICAgIDExNSwgICAgLTEsICAgMTE2LCAgICAtMSwgICAxMTcsICAgIDU5LCAgIDExNiwgICAgLTEsICAgMTE3LCAgICAtMSwKKyAgICAgMTE4LCAgICA1OCwgICAxMTcsICAgIC0xLCAgIDExOCwgICAgLTEsICAgMTE4LCAgICA5MywgICAxMjIsICAgIDc4LAorICAgICAxMjAsICAgIC0xLCAgIDExOSwgICAgLTEsICAgMTA2LCAgIDEyMSwgICAxMjAsICAgIC0xLCAgICA3OSwgICAgLTEsCisgICAgICA2MCwgICAgLTEsICAgIDYxLCAgICAtMSwgICAgNjIsICAgIC0xLCAgICA2OSwgICAgLTEsICAgMTIwLCAgICAtMSwKKyAgICAgMTIyLCAgICA3NywgICAxMjAsICAgIC0xLCAgIDExOSwgICAgLTEsICAgMTI1LCAgICA4MCwgICAgLTEsICAgMTMzLAorICAgICAgODAsICAgIC0xLCAgICAgNywgICAxMzgsICAgMTM5LCAgICA4MCwgICAgLTEsICAgMTI2LCAgICA3MSwgICAgLTEsCisgICAgIDEyOCwgICAgLTEsICAgMTI3LCAgICAtMSwgICAxMjgsICAgMTMwLCAgICAtMSwgICAxMjcsICAgIDc3LCAgIDEzMCwKKyAgICAgIC0xLCAgIDEzNSwgICAgNDMsICAgIDcwLCAgICAtMSwgICAxMzcsICAgIDQzLCAgICAtMSwgICAxMzcsICAgIDQzLAorICAgICAgNzIsICAgMTIzLCAgICA3MywgICAgLTEsICAgMTM2LCAgIDEzMSwgICAxMjksICAgIC0xLCAgIDEzMSwgICAxMjksCisgICAgICAtMSwgICAxMzYsICAgMTMxLCAgIDEzMiwgICAgLTEsICAgMTMxLCAgIDEzMiwgICAgLTEsICAgIC0xLCAgICAzMywKKyAgICAgIC0xLCAgICAzNCwgICAgLTEsICAgIDM1LCAgICAtMSwgICAxMzcsICAgIC0xLCAgIDEzNCwgICAgLTEsICAgMTMzLAorICAgICAgNzcsICAgIDQzLCAgICAtMSwgICAxMzMsICAgIDc3LCAgICA0MywgICAgNzIsICAgIDczLCAgICAtMSwgICAxMzMsCisgICAgICA3NywgICAgNDMsICAgIDcyLCAgIDEyMywgICAgNzMsICAgIC0xLCAgIDEzMywgICAgNzcsICAgIDQzLCAgICA3OSwKKyAgICAgMTQ2LCAgICAtMSwgICAxMzUsICAgIC0xLCAgIDEzNSwgICAgNDMsICAgIC0xLCAgIDEzNSwgICAgNDMsICAgIDcyLAorICAgICAgNzMsICAgIC0xLCAgIDEzNSwgICAgNDMsICAgIDcyLCAgIDEyMywgICAgNzMsICAgIC0xLCAgIDEzNSwgICAgNDMsCisgICAgICA3OSwgICAxNDYsICAgIC0xLCAgICAgMywgICAgNDMsICAgIC0xLCAgIDEzNywgICAgLTEsICAgMTM2LCAgIDEzNywKKyAgICAgIC0xLCAgICAgOSwgICAgLTEsICAgICA4LCAgICAtMSwgICAgMzcsICAgIC0xLCAgICAgMywgICAgMzcsICAgIC0xLAorICAgICAgMzYsICAgIC0xLCAgIDEzOSwgICAgLTEsICAgMTM4LCAgIDEzOSwgICAgLTEsICAgICA0LCAgICAtMSwgICAgIDUsCisgICAgICAtMSwgICAgIDYsICAgIC0xLCAgIDE0MCwgICAgLTEsICAgMTQwLCAgICA3MiwgICAxMjMsICAgIDczLCAgICAtMSwKKyAgICAgIDM5LCAgICAtMSwgICAgMTEsICAgIC0xLCAgICAxMiwgICAgLTEsICAgIDEwLCAgICAtMSwgICAgMjcsICAgIC0xLAorICAgICAgMjgsICAgIC0xLCAgICAyOSwgICAgLTEsICAgIDIxLCAgICAtMSwgICAgMjIsICAgIC0xLCAgICAyMywgICAgLTEsCisgICAgICAyNCwgICAgLTEsICAgIDI1LCAgICAtMSwgICAgMjYsICAgIC0xLCAgICAzMCwgICAgLTEsICAgIDMxLCAgICAtMSwKKyAgICAgIDMyLCAgICAtMSwgICAgNDEsICAgIC0xLCAgICA0MiwgICAgLTEsICAgMTQxLCAgICAtMSwgICAgNDQsICAgIC0xLAorICAgICAgMzgsICAgIDQzLCAgICA3NCwgICAxNDIsICAgIDc1LCAgICAtMSwgICAgMzgsICAgIDc0LCAgIDE0MiwgICAgNzUsCisgICAgICAtMSwgICAxNDMsICAgIC0xLCAgIDE0MiwgICAxNDMsICAgIC0xLCAgIDEzNywgICAxNDQsICAgIDgwLCAgICAtMSwKKyAgICAgMTQ1LCAgICAtMSwgICAxNDQsICAgIDc3LCAgIDE0NSwgICAgLTEsICAgIDQzLCAgICAtMSwgICAgNDMsICAgIDcyLAorICAgICAxMjMsICAgIDczLCAgICAtMSwgICAxMjAsICAgIC0xLCAgIDEyNCwgICAgLTEsICAgMTUwLCAgICAtMSwgICAxNDksCisgICAgICAtMSwgICAxNDcsICAgIC0xLCAgIDE1NiwgICAgLTEsICAgMTU3LCAgICAtMSwgICAxNjAsICAgIC0xLCAgIDE2NywKKyAgICAgIC0xLCAgICA3NCwgICAgNzUsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDc0LCAgIDE1MSwgICAxNTUsICAgMTUyLAorICAgICAgNzUsICAgIC0xLCAgIDE1NCwgICAgLTEsICAgMTQ5LCAgICAtMSwgICAgNzQsICAgIDc1LCAgICAtMSwgICAgNzQsCisgICAgIDE1NSwgICAgNzUsICAgIC0xLCAgIDE0OCwgICAgLTEsICAgMTU1LCAgIDE0OCwgICAgLTEsICAgIDgwLCAgICAtMSwKKyAgICAgMTIyLCAgICA4MCwgICAgLTEsICAgIDE4LCAgICA3MCwgICAxMjIsICAgIDcxLCAgIDE1OCwgICAgLTEsICAgMTQ4LAorICAgICAgMTYsICAgMTQ4LCAgICAtMSwgICAxNDgsICAgIC0xLCAgIDEyMiwgICAgLTEsICAgMTM1LCAgICA0MywgICAgNzksCisgICAgIDE0NiwgICAgLTEsICAgIC0xLCAgICA0MCwgICAgNzAsICAgMTYxLCAgIDE1OSwgICAgNzEsICAgMTUzLCAgICAtMSwKKyAgICAgIC0xLCAgICAxNSwgICAxNjIsICAgMTQ4LCAgICA0MCwgICAgNzAsICAgMTIyLCAgICA3MSwgICAgODAsICAgIC0xLAorICAgICAgLTEsICAgIDE3LCAgICA3MCwgICAxNjMsICAgMTY0LCAgIDE2NiwgICAgNzEsICAgMTUzLCAgICAtMSwgICAxNTYsCisgICAgICAtMSwgICAxNDcsICAgIC0xLCAgIDE1OSwgICAgLTEsICAgIC0xLCAgIDE2NSwgICAgODAsICAgIC0xLCAgIDE2NSwKKyAgICAgIDgwLCAgIDEyMiwgICAgLTEsICAgIDE0LCAgICA4MCwgICAgLTEsICAgIDEzLCAgICA4MCwgICAgLTEsICAgIDIwLAorICAgICAgODAsICAgIC0xLCAgICAyMCwgICAxMjIsICAgIDgwLCAgICAtMSwgICAgMTksICAgIDgwLCAgICAtMSwgICAxNjksCisgICAgICAtMSwgICAxNjgsICAgMTY5LCAgICAtMSwgICAxNzAsICAgIC0xLCAgIDEyNCwgICAgLTEsICAgIC0xLCAgIDEyNSwKKyAgICAgMTcxLCAgIDE1NCwgICAgLTEKK307CisKKy8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXlybGluZVtdID0KK3sKKyAgICAgICAwLCAgIDE1MywgICAxNTMsICAgMTg4LCAgIDE5MSwgICAyMDQsICAgMjA5LCAgIDIxNCwgICAyMjAsICAgMjIzLAorICAgICAyOTYsICAgMjk5LCAgIDQwOCwgICA0MTgsICAgNDMxLCAgIDQzOSwgICA1MzgsICAgNTQxLCAgIDU0OSwgICA1NTMsCisgICAgIDU2MCwgICA1NjQsICAgNTcxLCAgIDU3NywgICA1ODYsICAgNTk0LCAgIDY1NiwgICA2NjMsICAgNjczLCAgIDY3NiwKKyAgICAgNjg2LCAgIDY5NiwgICA3MTcsICAgNzE4LCAgIDcxOSwgICA3MjQsICAgNzI1LCAgIDczNCwgICA3NDYsICAgNzQ3LAorICAgICA3NTUsICAgNzY2LCAgIDc3MCwgICA3NzEsICAgNzgxLCAgIDc5MSwgICA4MDEsICAgODE0LCAgIDgxNSwgICA4MjUsCisgICAgIDgzOCwgICA4NDIsICAgODQ2LCAgIDg1MCwgICA4NTEsICAgODY0LCAgIDg2NSwgICA4NzgsICAgODc5LCAgIDg5MiwKKyAgICAgODkzLCAgIDkxMCwgICA5MTEsICAgOTI0LCAgIDkyNSwgICA5MjYsICAgOTI3LCAgIDkyOCwgICA5MzIsICAgOTM1LAorICAgICA5NDYsICAgOTU0LCAgIDk3OSwgICA5ODQsICAgOTkxLCAgMTAyNywgIDEwMzAsICAxMDM3LCAgMTA0NSwgIDEwNjYsCisgICAgMTA4NSwgIDEwOTYsICAxMTI1LCAgMTEzMCwgIDExNDAsICAxMTQ1LCAgMTE1NSwgIDExNTgsICAxMTYxLCAgMTE2NCwKKyAgICAxMTcwLCAgMTE3NywgIDExODcsICAxMjAzLCAgMTIyMSwgIDEyNDUsICAxMjY4LCAgMTI3MiwgIDEyOTAsICAxMjk4LAorICAgIDEzMzAsICAxMzUwLCAgMTQyNiwgIDE0MzUsICAxNDU4LCAgMTQ2MSwgIDE0NjcsICAxNDc1LCAgMTQ4MywgIDE0OTEsCisgICAgMTQ5NCwgIDE1MDEsICAxNTA0LCAgMTUwNywgIDE1MTMsICAxNTE2LCAgMTUzMSwgIDE1MzUsICAxNTM5LCAgMTU0MywKKyAgICAxNTUyLCAgMTU1NywgIDE1NjIsICAxNTY3LCAgMTU3MiwgIDE1NzcsICAxNTgyLCAgMTU4NywgIDE1OTIsICAxNTk3LAorICAgIDE2MDMsICAxNjA5LCAgMTYxNSwgIDE2MjAsICAxNjI1LCAgMTYzMCwgIDE2NDMsICAxNjU2LCAgMTY2NCwgIDE2NjcsCisgICAgMTY4MiwgIDE3MTMsICAxNzE3LCAgMTcyMywgIDE3MzEsICAxNzQ3LCAgMTc1MSwgIDE3NTUsICAxNzU2LCAgMTc2MiwKKyAgICAxNzYzLCAgMTc2NCwgIDE3NjUsICAxNzY2LCAgMTc3MCwgIDE3NzEsICAxNzcxLCAgMTc3MSwgIDE3ODEsICAxNzgyLAorICAgIDE3ODcsICAxNzkwLCAgMTgwMCwgIDE4MDMsICAxODA5LCAgMTgxMCwgIDE4MTQsICAxODIyLCAgMTgyNiwgIDE4MzYsCisgICAgMTg0MSwgIDE4NTgsICAxODU4LCAgMTg2MywgIDE4NjMsICAxODcwLCAgMTg3MCwgIDE4NzgsICAxODgxLCAgMTg4NywKKyAgICAxODkwLCAgMTg5NiwgIDE5MDAsICAxOTA3LCAgMTkxNCwgIDE5MjEsICAxOTI4LCAgMTkzOSwgIDE5NDgsICAxOTUyLAorICAgIDE5NTksICAxOTYyLCAgMTk2OCwgIDE5NjgKK307CisjZW5kaWYKKworI2lmIFlZREVCVUcgfHwgWVlFUlJPUl9WRVJCT1NFIHx8IFlZVE9LRU5fVEFCTEUKKy8qIFlZVE5BTUVbU1lNQk9MLU5VTV0gLS0gU3RyaW5nIG5hbWUgb2YgdGhlIHN5bWJvbCBTWU1CT0wtTlVNLgorICAgRmlyc3QsIHRoZSB0ZXJtaW5hbHMsIHRoZW4sIHN0YXJ0aW5nIGF0IFlZTlRPS0VOUywgbm9udGVybWluYWxzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB5eXRuYW1lW10gPQoreworICAiJGVuZCIsICJlcnJvciIsICIkdW5kZWZpbmVkIiwgIklOVkFSSUFOVCIsICJISUdIX1BSRUNJU0lPTiIsCisgICJNRURJVU1fUFJFQ0lTSU9OIiwgIkxPV19QUkVDSVNJT04iLCAiUFJFQ0lTSU9OIiwgIkFUVFJJQlVURSIsCisgICJDT05TVF9RVUFMIiwgIkJPT0xfVFlQRSIsICJGTE9BVF9UWVBFIiwgIklOVF9UWVBFIiwgIkJSRUFLIiwgIkNPTlRJTlVFIiwKKyAgIkRPIiwgIkVMU0UiLCAiRk9SIiwgIklGIiwgIkRJU0NBUkQiLCAiUkVUVVJOIiwgIkJWRUMyIiwgIkJWRUMzIiwKKyAgIkJWRUM0IiwgIklWRUMyIiwgIklWRUMzIiwgIklWRUM0IiwgIlZFQzIiLCAiVkVDMyIsICJWRUM0IiwgIk1BVFJJWDIiLAorICAiTUFUUklYMyIsICJNQVRSSVg0IiwgIklOX1FVQUwiLCAiT1VUX1FVQUwiLCAiSU5PVVRfUVVBTCIsICJVTklGT1JNIiwKKyAgIlZBUllJTkciLCAiU1RSVUNUIiwgIlZPSURfVFlQRSIsICJXSElMRSIsICJTQU1QTEVSMkQiLCAiU0FNUExFUkNVQkUiLAorICAiSURFTlRJRklFUiIsICJUWVBFX05BTUUiLCAiRkxPQVRDT05TVEFOVCIsICJJTlRDT05TVEFOVCIsCisgICJCT09MQ09OU1RBTlQiLCAiRklFTERfU0VMRUNUSU9OIiwgIkxFRlRfT1AiLCAiUklHSFRfT1AiLCAiSU5DX09QIiwKKyAgIkRFQ19PUCIsICJMRV9PUCIsICJHRV9PUCIsICJFUV9PUCIsICJORV9PUCIsICJBTkRfT1AiLCAiT1JfT1AiLAorICAiWE9SX09QIiwgIk1VTF9BU1NJR04iLCAiRElWX0FTU0lHTiIsICJBRERfQVNTSUdOIiwgIk1PRF9BU1NJR04iLAorICAiTEVGVF9BU1NJR04iLCAiUklHSFRfQVNTSUdOIiwgIkFORF9BU1NJR04iLCAiWE9SX0FTU0lHTiIsICJPUl9BU1NJR04iLAorICAiU1VCX0FTU0lHTiIsICJMRUZUX1BBUkVOIiwgIlJJR0hUX1BBUkVOIiwgIkxFRlRfQlJBQ0tFVCIsCisgICJSSUdIVF9CUkFDS0VUIiwgIkxFRlRfQlJBQ0UiLCAiUklHSFRfQlJBQ0UiLCAiRE9UIiwgIkNPTU1BIiwgIkNPTE9OIiwKKyAgIkVRVUFMIiwgIlNFTUlDT0xPTiIsICJCQU5HIiwgIkRBU0giLCAiVElMREUiLCAiUExVUyIsICJTVEFSIiwgIlNMQVNIIiwKKyAgIlBFUkNFTlQiLCAiTEVGVF9BTkdMRSIsICJSSUdIVF9BTkdMRSIsICJWRVJUSUNBTF9CQVIiLCAiQ0FSRVQiLAorICAiQU1QRVJTQU5EIiwgIlFVRVNUSU9OIiwgIiRhY2NlcHQiLCAidmFyaWFibGVfaWRlbnRpZmllciIsCisgICJwcmltYXJ5X2V4cHJlc3Npb24iLCAicG9zdGZpeF9leHByZXNzaW9uIiwgImludGVnZXJfZXhwcmVzc2lvbiIsCisgICJmdW5jdGlvbl9jYWxsIiwgImZ1bmN0aW9uX2NhbGxfb3JfbWV0aG9kIiwgImZ1bmN0aW9uX2NhbGxfZ2VuZXJpYyIsCisgICJmdW5jdGlvbl9jYWxsX2hlYWRlcl9ub19wYXJhbWV0ZXJzIiwKKyAgImZ1bmN0aW9uX2NhbGxfaGVhZGVyX3dpdGhfcGFyYW1ldGVycyIsICJmdW5jdGlvbl9jYWxsX2hlYWRlciIsCisgICJmdW5jdGlvbl9pZGVudGlmaWVyIiwgInVuYXJ5X2V4cHJlc3Npb24iLCAidW5hcnlfb3BlcmF0b3IiLAorICAibXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbiIsICJhZGRpdGl2ZV9leHByZXNzaW9uIiwgInNoaWZ0X2V4cHJlc3Npb24iLAorICAicmVsYXRpb25hbF9leHByZXNzaW9uIiwgImVxdWFsaXR5X2V4cHJlc3Npb24iLCAiYW5kX2V4cHJlc3Npb24iLAorICAiZXhjbHVzaXZlX29yX2V4cHJlc3Npb24iLCAiaW5jbHVzaXZlX29yX2V4cHJlc3Npb24iLAorICAibG9naWNhbF9hbmRfZXhwcmVzc2lvbiIsICJsb2dpY2FsX3hvcl9leHByZXNzaW9uIiwKKyAgImxvZ2ljYWxfb3JfZXhwcmVzc2lvbiIsICJjb25kaXRpb25hbF9leHByZXNzaW9uIiwKKyAgImFzc2lnbm1lbnRfZXhwcmVzc2lvbiIsICJhc3NpZ25tZW50X29wZXJhdG9yIiwgImV4cHJlc3Npb24iLAorICAiY29uc3RhbnRfZXhwcmVzc2lvbiIsICJkZWNsYXJhdGlvbiIsICJmdW5jdGlvbl9wcm90b3R5cGUiLAorICAiZnVuY3Rpb25fZGVjbGFyYXRvciIsICJmdW5jdGlvbl9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzIiwKKyAgImZ1bmN0aW9uX2hlYWRlciIsICJwYXJhbWV0ZXJfZGVjbGFyYXRvciIsICJwYXJhbWV0ZXJfZGVjbGFyYXRpb24iLAorICAicGFyYW1ldGVyX3F1YWxpZmllciIsICJwYXJhbWV0ZXJfdHlwZV9zcGVjaWZpZXIiLAorICAiaW5pdF9kZWNsYXJhdG9yX2xpc3QiLCAic2luZ2xlX2RlY2xhcmF0aW9uIiwgImZ1bGx5X3NwZWNpZmllZF90eXBlIiwKKyAgInR5cGVfcXVhbGlmaWVyIiwgInR5cGVfc3BlY2lmaWVyIiwgInByZWNpc2lvbl9xdWFsaWZpZXIiLAorICAidHlwZV9zcGVjaWZpZXJfbm9fcHJlYyIsICJ0eXBlX3NwZWNpZmllcl9ub25hcnJheSIsICJzdHJ1Y3Rfc3BlY2lmaWVyIiwKKyAgInN0cnVjdF9kZWNsYXJhdGlvbl9saXN0IiwgInN0cnVjdF9kZWNsYXJhdGlvbiIsCisgICJzdHJ1Y3RfZGVjbGFyYXRvcl9saXN0IiwgInN0cnVjdF9kZWNsYXJhdG9yIiwgImluaXRpYWxpemVyIiwKKyAgImRlY2xhcmF0aW9uX3N0YXRlbWVudCIsICJzdGF0ZW1lbnQiLCAic2ltcGxlX3N0YXRlbWVudCIsCisgICJjb21wb3VuZF9zdGF0ZW1lbnQiLCAiQDEiLCAiQDIiLCAic3RhdGVtZW50X25vX25ld19zY29wZSIsCisgICJjb21wb3VuZF9zdGF0ZW1lbnRfbm9fbmV3X3Njb3BlIiwgInN0YXRlbWVudF9saXN0IiwKKyAgImV4cHJlc3Npb25fc3RhdGVtZW50IiwgInNlbGVjdGlvbl9zdGF0ZW1lbnQiLAorICAic2VsZWN0aW9uX3Jlc3Rfc3RhdGVtZW50IiwgImNvbmRpdGlvbiIsICJpdGVyYXRpb25fc3RhdGVtZW50IiwgIkAzIiwKKyAgIkA0IiwgIkA1IiwgImZvcl9pbml0X3N0YXRlbWVudCIsICJjb25kaXRpb25vcHQiLCAiZm9yX3Jlc3Rfc3RhdGVtZW50IiwKKyAgImp1bXBfc3RhdGVtZW50IiwgInRyYW5zbGF0aW9uX3VuaXQiLCAiZXh0ZXJuYWxfZGVjbGFyYXRpb24iLAorICAiZnVuY3Rpb25fZGVmaW5pdGlvbiIsICJANiIsIDAKK307CisjZW5kaWYKKworIyBpZmRlZiBZWVBSSU5UCisvKiBZWVRPS05VTVtZWUxFWC1OVU1dIC0tIEludGVybmFsIHRva2VuIG51bWJlciBjb3JyZXNwb25kaW5nIHRvCisgICB0b2tlbiBZWUxFWC1OVU0uICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXl0b2tudW1bXSA9Cit7CisgICAgICAgMCwgICAyNTYsICAgMjU3LCAgIDI1OCwgICAyNTksICAgMjYwLCAgIDI2MSwgICAyNjIsICAgMjYzLCAgIDI2NCwKKyAgICAgMjY1LCAgIDI2NiwgICAyNjcsICAgMjY4LCAgIDI2OSwgICAyNzAsICAgMjcxLCAgIDI3MiwgICAyNzMsICAgMjc0LAorICAgICAyNzUsICAgMjc2LCAgIDI3NywgICAyNzgsICAgMjc5LCAgIDI4MCwgICAyODEsICAgMjgyLCAgIDI4MywgICAyODQsCisgICAgIDI4NSwgICAyODYsICAgMjg3LCAgIDI4OCwgICAyODksICAgMjkwLCAgIDI5MSwgICAyOTIsICAgMjkzLCAgIDI5NCwKKyAgICAgMjk1LCAgIDI5NiwgICAyOTcsICAgMjk4LCAgIDI5OSwgICAzMDAsICAgMzAxLCAgIDMwMiwgICAzMDMsICAgMzA0LAorICAgICAzMDUsICAgMzA2LCAgIDMwNywgICAzMDgsICAgMzA5LCAgIDMxMCwgICAzMTEsICAgMzEyLCAgIDMxMywgICAzMTQsCisgICAgIDMxNSwgICAzMTYsICAgMzE3LCAgIDMxOCwgICAzMTksICAgMzIwLCAgIDMyMSwgICAzMjIsICAgMzIzLCAgIDMyNCwKKyAgICAgMzI1LCAgIDMyNiwgICAzMjcsICAgMzI4LCAgIDMyOSwgICAzMzAsICAgMzMxLCAgIDMzMiwgICAzMzMsICAgMzM0LAorICAgICAzMzUsICAgMzM2LCAgIDMzNywgICAzMzgsICAgMzM5LCAgIDM0MCwgICAzNDEsICAgMzQyLCAgIDM0MywgICAzNDQsCisgICAgIDM0NSwgICAzNDYsICAgMzQ3LCAgIDM0OAorfTsKKyMgZW5kaWYKKworLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjFbXSA9Cit7CisgICAgICAgMCwgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTYsICAgIDk2LCAgICA5NiwgICAgOTYsICAgIDk3LCAgICA5NywKKyAgICAgIDk3LCAgICA5NywgICAgOTcsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMCwgICAxMDEsICAgMTAxLAorICAgICAxMDIsICAgMTAyLCAgIDEwMywgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDUsICAgMTA1LCAgIDEwNiwgICAxMDYsCisgICAgIDEwNiwgICAxMDYsICAgMTA3LCAgIDEwNywgICAxMDcsICAgMTA4LCAgIDEwOCwgICAxMDgsICAgMTA5LCAgIDEwOSwKKyAgICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTExLCAgIDExMSwgICAxMTEsICAgMTExLCAgIDExMiwgICAxMTIsICAgMTEyLAorICAgICAxMTMsICAgMTE0LCAgIDExNSwgICAxMTYsICAgMTE2LCAgIDExNywgICAxMTcsICAgMTE4LCAgIDExOCwgICAxMTksCisgICAgIDExOSwgICAxMjAsICAgMTIwLCAgIDEyMSwgICAxMjEsICAgMTIxLCAgIDEyMSwgICAxMjEsICAgMTIyLCAgIDEyMiwKKyAgICAgMTIzLCAgIDEyNCwgICAxMjQsICAgMTI0LCAgIDEyNSwgICAxMjYsICAgMTI2LCAgIDEyNywgICAxMjcsICAgMTI4LAorICAgICAxMjksICAgMTI5LCAgIDEzMCwgICAxMzAsICAgMTMwLCAgIDEzMCwgICAxMzEsICAgMTMxLCAgIDEzMSwgICAxMzEsCisgICAgIDEzMiwgICAxMzMsICAgMTMzLCAgIDEzMywgICAxMzMsICAgMTMzLCAgIDEzNCwgICAxMzQsICAgMTM0LCAgIDEzNCwKKyAgICAgMTM0LCAgIDEzNCwgICAxMzUsICAgMTM1LCAgIDEzNiwgICAxMzYsICAgMTM2LCAgIDEzNiwgICAxMzYsICAgMTM3LAorICAgICAxMzcsICAgMTM4LCAgIDEzOCwgICAxMzgsICAgMTM5LCAgIDEzOSwgICAxNDAsICAgMTQwLCAgIDE0MCwgICAxNDAsCisgICAgIDE0MCwgICAxNDAsICAgMTQwLCAgIDE0MCwgICAxNDAsICAgMTQwLCAgIDE0MCwgICAxNDAsICAgMTQwLCAgIDE0MCwKKyAgICAgMTQwLCAgIDE0MCwgICAxNDAsICAgMTQwLCAgIDE0MCwgICAxNDAsICAgMTQxLCAgIDE0MSwgICAxNDIsICAgMTQyLAorICAgICAxNDMsICAgMTQ0LCAgIDE0NCwgICAxNDUsICAgMTQ1LCAgIDE0NiwgICAxNDcsICAgMTQ4LCAgIDE0OCwgICAxNDksCisgICAgIDE0OSwgICAxNDksICAgMTQ5LCAgIDE0OSwgICAxNTAsICAgMTUxLCAgIDE1MiwgICAxNTAsICAgMTUzLCAgIDE1MywKKyAgICAgMTU0LCAgIDE1NCwgICAxNTUsICAgMTU1LCAgIDE1NiwgICAxNTYsICAgMTU3LCAgIDE1OCwgICAxNTgsICAgMTU5LAorICAgICAxNTksICAgMTYxLCAgIDE2MCwgICAxNjIsICAgMTYwLCAgIDE2MywgICAxNjAsICAgMTY0LCAgIDE2NCwgICAxNjUsCisgICAgIDE2NSwgICAxNjYsICAgMTY2LCAgIDE2NywgICAxNjcsICAgMTY3LCAgIDE2NywgICAxNjcsICAgMTY4LCAgIDE2OCwKKyAgICAgMTY5LCAgIDE2OSwgICAxNzEsICAgMTcwCit9OworCisvKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjJbXSA9Cit7CisgICAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgNCwKKyAgICAgICAxLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMywKKyAgICAgICAzLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAzLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMywgICAgIDEsCisgICAgICAgNSwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywKKyAgICAgICAxLCAgICAgMiwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDMsICAgICAzLAorICAgICAgIDIsICAgICA1LCAgICAgMywgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAzLCAgICAgNSwgICAgIDYsICAgICA1LCAgICAgMSwgICAgIDIsICAgICA0LCAgICAgNSwKKyAgICAgICA0LCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLAorICAgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgNCwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICA1LCAgICAgNCwgICAgIDEsICAgICAyLAorICAgICAgIDMsICAgICAxLCAgICAgMywgICAgIDEsICAgICA0LCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAwLCAgICAgMCwgICAgIDUsICAgICAxLCAgICAgMSwKKyAgICAgICAyLCAgICAgMywgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDIsICAgICA1LCAgICAgMywgICAgIDEsICAgICAxLAorICAgICAgIDQsICAgICAwLCAgICAgNiwgICAgIDAsICAgICA4LCAgICAgMCwgICAgIDcsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMCwgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDIsICAgICAxLCAgICAgMiwKKyAgICAgICAxLCAgICAgMSwgICAgIDAsICAgICAzCit9OworCisvKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJ1bGUgdG8gcmVkdWNlIHdpdGggaW4gc3RhdGUKKyAgIFNUQVRFLU5VTSB3aGVuIFlZVEFCTEUgZG9lc24ndCBzcGVjaWZ5IHNvbWV0aGluZyBlbHNlIHRvIGRvLiAgWmVybworICAgbWVhbnMgdGhlIGRlZmF1bHQgaXMgYW4gZXJyb3IuICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eWRlZmFjdFtdID0KK3sKKyAgICAgICAwLCAgICAgMCwgICAxMTEsICAgMTEyLCAgIDExMywgICAgIDAsICAgMTA1LCAgIDEwNCwgICAxMTksICAgMTE3LAorICAgICAxMTgsICAgMTIzLCAgIDEyNCwgICAxMjUsICAgMTI2LCAgIDEyNywgICAxMjgsICAgMTIwLCAgIDEyMSwgICAxMjIsCisgICAgIDEyOSwgICAxMzAsICAgMTMxLCAgIDEwOCwgICAxMDYsICAgICAwLCAgIDExNiwgICAxMzIsICAgMTMzLCAgIDEzNSwKKyAgICAgMTkxLCAgIDE5MiwgICAgIDAsICAgIDc2LCAgICA4NiwgICAgIDAsICAgIDkxLCAgICA5NiwgICAgIDAsICAgMTAyLAorICAgICAgIDAsICAgMTA5LCAgIDExNCwgICAxMzQsICAgICAwLCAgIDE4OCwgICAxOTAsICAgMTA3LCAgIDEwMSwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgIDcxLCAgICAgMCwgICAgNzQsICAgIDg2LCAgICAgMCwgICAgODcsICAgIDg4LCAgICA4OSwKKyAgICAgIDc3LCAgICAgMCwgICAgODYsICAgICAwLCAgICA3MiwgICAgOTcsICAgMTAzLCAgIDExMCwgICAgIDAsICAgICAxLAorICAgICAxODksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDEzOCwgICAgIDAsICAgMTkzLCAgICA3OCwgICAgODMsCisgICAgICA4NSwgICAgOTAsICAgICAwLCAgICA5MiwgICAgNzksICAgICAwLCAgICAgMCwgICAgIDIsICAgICA1LCAgICAgNCwKKyAgICAgICA2LCAgICAyNywgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzQsICAgIDMzLCAgICAzMiwgICAgIDMsICAgICA4LAorICAgICAgMjgsICAgIDEwLCAgICAxNSwgICAgMTYsICAgICAwLCAgICAgMCwgICAgMjEsICAgICAwLCAgICAzNSwgICAgIDAsCisgICAgICAzOCwgICAgNDEsICAgIDQyLCAgICA0NywgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU1LCAgICA1NywKKyAgICAgIDU5LCAgICA3MCwgICAgIDAsICAgIDI1LCAgICA3MywgICAgIDAsICAgMTQzLCAgICAgMCwgICAxNDEsICAgMTM3LAorICAgICAxMzksICAgICAwLCAgICAgMCwgICAxNzMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNTUsCisgICAgIDE2MCwgICAxNjQsICAgIDM1LCAgICA2MSwgICAgNjgsICAgICAwLCAgIDE0NiwgICAgIDAsICAgMTAyLCAgIDE0OSwKKyAgICAgMTYyLCAgIDE0OCwgICAxNDcsICAgICAwLCAgIDE1MCwgICAxNTEsICAgMTUyLCAgIDE1MywgICAgODAsICAgIDgyLAorICAgICAgODQsICAgICAwLCAgICAgMCwgICAgOTgsICAgICAwLCAgIDE0NSwgICAxMDAsICAgIDI5LCAgICAzMCwgICAgIDAsCisgICAgICAxMiwgICAgMTMsICAgICAwLCAgICAgMCwgICAgMTksICAgIDE4LCAgICAgMCwgICAxMTYsICAgIDIyLCAgICAyNCwKKyAgICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDExNSwgICAxMzYsICAgICAwLCAgICAgMCwgICAxNDAsCisgICAgIDE4NCwgICAxODMsICAgICAwLCAgIDE3NSwgICAgIDAsICAgMTg3LCAgIDE4NSwgICAgIDAsICAgMTcxLCAgIDE1NCwKKyAgICAgICAwLCAgICA2NCwgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjMsICAgICAwLCAgICAgMCwgICAxNjUsICAgMTYxLAorICAgICAxNjMsICAgICAwLCAgICA5MywgICAgIDAsICAgIDk1LCAgICA5OSwgICAgIDcsICAgICAwLCAgICAxNCwgICAgMjYsCisgICAgICAxMSwgICAgMTcsICAgIDIzLCAgICAzNiwgICAgMzcsICAgIDQwLCAgICAzOSwgICAgNDUsICAgIDQ2LCAgICA0MywKKyAgICAgIDQ0LCAgICA0OCwgICAgNDksICAgIDU0LCAgICA1NiwgICAgNTgsICAgICAwLCAgICAgMCwgICAxNDIsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgIDE4NiwgICAgIDAsICAgMTU2LCAgICA2MiwgICAgNjksICAgICAwLCAgICA5NCwgICAgIDksCisgICAgICAgMCwgICAxNDQsICAgICAwLCAgIDE3OCwgICAxNzcsICAgMTgwLCAgICAgMCwgICAxNjksICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICA4MSwgICAgNjAsICAgICAwLCAgIDE3OSwgICAgIDAsICAgICAwLCAgIDE2OCwgICAxNjYsICAgICAwLAorICAgICAgIDAsICAgMTU3LCAgICAgMCwgICAxODEsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTU5LCAgIDE3MiwgICAxNTgsCisgICAgICAgMCwgICAxODIsICAgMTc2LCAgIDE2NywgICAxNzAsICAgMTc0Cit9OworCisvKiBZWURFRkdPVE9bTlRFUk0tTlVNXS4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5ZGVmZ290b1tdID0KK3sKKyAgICAgIC0xLCAgICA5OCwgICAgOTksICAgMTAwLCAgIDIyNywgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LAorICAgICAxMDYsICAgMTA3LCAgIDE0MiwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgMTEzLCAgIDExNCwgICAxMTUsCisgICAgIDExNiwgICAxMTcsICAgMTE4LCAgIDExOSwgICAxMjAsICAgMTQzLCAgIDE0NCwgICAyMTYsICAgMTQ1LCAgIDEyMiwKKyAgICAgMTQ2LCAgIDE0NywgICAgMzIsICAgIDMzLCAgICAzNCwgICAgNzksICAgIDYwLCAgICA2MSwgICAgODAsICAgIDM1LAorICAgICAgMzYsICAgIDM3LCAgICAzOCwgICAxMjMsICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA3NCwgICAgNzUsCisgICAgIDEyNywgICAxMjgsICAgMTY2LCAgIDE0OSwgICAxNTAsICAgMTUxLCAgIDE1MiwgICAyMTAsICAgMjcwLCAgIDI4OCwKKyAgICAgMjg5LCAgIDE1MywgICAxNTQsICAgMTU1LCAgIDI3OCwgICAyNjksICAgMTU2LCAgIDI1MywgICAyMDIsICAgMjUwLAorICAgICAyNjUsICAgMjc1LCAgIDI3NiwgICAxNTcsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDUzCit9OworCisvKiBZWVBBQ1RbU1RBVEUtTlVNXSAtLSBJbmRleCBpbiBZWVRBQkxFIG9mIHRoZSBwb3J0aW9uIGRlc2NyaWJpbmcKKyAgIFNUQVRFLU5VTS4gICovCisjZGVmaW5lIFlZUEFDVF9OSU5GIC0yNTAKK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXlwYWN0W10gPQoreworICAgIDEyMjUsICAgIDM2LCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgIDE1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgIC0yNTAsCisgICAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwKKyAgICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgICAtMzMsICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLAorICAgIC0yNTAsICAgLTYwLCAgIC0yMiwgICAtMTcsICAgIDIxLCAgIC02MiwgIC0yNTAsICAgIDIyLCAgMTI2NiwgIC0yNTAsCisgICAgMTI5MCwgIC0yNTAsICAgIDExLCAgLTI1MCwgIDExMzgsICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgMTI5MCwKKyAgICAgIDE0LCAgMTI2NiwgIC0yNTAsICAgIDI3LCAgLTI1MCwgICAgMzQsICAgIDQxLCAgLTI1MCwgIC0yNTAsICAtMjUwLAorICAgIC0yNTAsICAxMjY2LCAgIDEyOSwgICAgNjEsICAtMjUwLCAgICAxNywgIC0yNTAsICAtMjUwLCAgIDkwOCwgIC0yNTAsCisgICAgLTI1MCwgICAgMzEsICAxMjY2LCAgICA3MiwgIDEwNDIsICAtMjUwLCAgIDI4MywgIC0yNTAsICAtMjUwLCAgLTI1MCwKKyAgICAtMjUwLCAgICA5MCwgIDEyNjYsICAgLTQ2LCAgLTI1MCwgICAxOTQsICAgOTA4LCAgICA2NSwgIC0yNTAsICAtMjUwLAorICAgIC0yNTAsICAtMjUwLCAgIDkwOCwgICA5MDgsICAgOTA4LCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgIC0yNTAsCisgICAgIC00MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgICAgODAsICAgLTI1LCAgIDk3NSwgICAgODcsICAtMjUwLCAgIDkwOCwKKyAgICAgIDM1LCAgICAxMywgIC0yNTAsICAgLTI2LCAgICA2OCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgICAxMTAsICAgMTA5LAorICAgICAtNTQsICAtMjUwLCAgICA5NiwgIC0yNTAsICAtMjUwLCAgMTA4MywgICAgOTgsICAgIDMzLCAgLTI1MCwgIC0yNTAsCisgICAgLTI1MCwgICAgOTEsICAgIDkyLCAgLTI1MCwgICAxMDQsICAgMTA3LCAgICA5OSwgICA3NjAsICAgMTA4LCAgIDEwNSwKKyAgICAtMjUwLCAgLTI1MCwgICAgMjQsICAtMjUwLCAgLTI1MCwgICAgMzcsICAtMjUwLCAgIC02MCwgICAxMTIsICAtMjUwLAorICAgIC0yNTAsICAtMjUwLCAgLTI1MCwgICAzNjUsICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgIDExMSwgIC0yNTAsCisgICAgLTI1MCwgICA4MjcsICAgOTA4LCAgLTI1MCwgICAxMTMsICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgICAgNCwKKyAgICAtMjUwLCAgLTI1MCwgICA5MDgsICAxMTc5LCAgLTI1MCwgIC0yNTAsICAgOTA4LCAgIDExNCwgIC0yNTAsICAtMjUwLAorICAgIC0yNTAsICAgOTA4LCAgIDkwOCwgICA5MDgsICAgOTA4LCAgIDkwOCwgICA5MDgsICAgOTA4LCAgIDkwOCwgICA5MDgsCisgICAgIDkwOCwgICA5MDgsICAgOTA4LCAgIDkwOCwgICA5MDgsICAtMjUwLCAgLTI1MCwgICA5MDgsICAgIDcyLCAgLTI1MCwKKyAgICAtMjUwLCAgLTI1MCwgICA0NDcsICAtMjUwLCAgIDkwOCwgIC0yNTAsICAtMjUwLCAgICA0MiwgIC0yNTAsICAtMjUwLAorICAgICA0NDcsICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgICA5MDgsICAgOTA4LCAgLTI1MCwgIC0yNTAsCisgICAgLTI1MCwgICA5MDgsICAtMjUwLCAgIDExNSwgIC0yNTAsICAtMjUwLCAgLTI1MCwgICAxMTYsICAgMTE3LCAgLTI1MCwKKyAgICAgMTIwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgICAgMzUsICAgIDM1LCAgLTI1MCwgIC0yNTAsICAtMjUwLAorICAgIC0yNTAsICAgLTI2LCAgIC0yNiwgIC0yNTAsICAgMTEwLCAgIDEwOSwgICAgNTEsICAgMTE5LCAgLTI1MCwgICAxNDQsCisgICAgIDYxMSwgICAgMjMsICAtMjUwLCAgIDY5MywgICA0NDcsICAtMjUwLCAgLTI1MCwgICAxMjIsICAtMjUwLCAgLTI1MCwKKyAgICAgOTA4LCAgLTI1MCwgICAxMjMsICAtMjUwLCAgLTI1MCwgICA2OTMsICAgNDQ3LCAgIDExNywgICAxNTMsICAgMTI2LAorICAgICAxMjgsICAtMjUwLCAgLTI1MCwgICA5MDgsICAtMjUwLCAgIDEyNywgICAxMzcsICAgMTcxLCAgLTI1MCwgICAxMzAsCisgICAgIDUyOSwgIC0yNTAsICAgIDI4LCAgIDkwOCwgICA1MjksICAgNDQ3LCAgIDkwOCwgIC0yNTAsICAtMjUwLCAgLTI1MCwKKyAgICAgMTMxLCAgIDExNywgIC0yNTAsICAtMjUwLCAgLTI1MCwgIC0yNTAKK307CisKKy8qIFlZUEdPVE9bTlRFUk0tTlVNXS4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5cGdvdG9bXSA9Cit7CisgICAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgICAgMzksICAtMjUwLCAgLTI1MCwKKyAgICAtMjUwLCAgLTI1MCwgICAtNDUsICAtMjUwLCAgIC0xOCwgIC0yNTAsICAgLTc5LCAgIC0zMCwgIC0yNTAsICAtMjUwLAorICAgIC0yNTAsICAgIDM4LCAgICA1MiwgICAgMjAsICAtMjUwLCAgIC02MywgICAtODUsICAtMjUwLCAgIC05MiwgICAtNzEsCisgICAgICAgNiwgICAgIDksICAtMjUwLCAgLTI1MCwgIC0yNTAsICAgMTMyLCAgIDE3MiwgICAxNjYsICAgMTQ4LCAgLTI1MCwKKyAgICAtMjUwLCAgLTI0NiwgICAtMjEsICAgICAwLCAgIDIyNiwgICAtMjQsICAtMjUwLCAgLTI1MCwgICAxNjIsICAgLTY2LAorICAgIC0yNTAsICAgIDQ1LCAgLTE1OSwgICAgLTMsICAtMTM2LCAgLTI0OSwgIC0yNTAsICAtMjUwLCAgLTI1MCwgICAtMzYsCisgICAgIDE5NiwgICAgNDYsICAgICAxLCAgLTI1MCwgIC0yNTAsICAgLTEzLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwKKyAgICAtMjUwLCAgLTI1MCwgIC0yNTAsICAtMjUwLCAgLTI1MCwgICAyMTEsICAtMjUwLCAgLTI1MAorfTsKKworLyogWVlUQUJMRVtZWVBBQ1RbU1RBVEUtTlVNXV0uICBXaGF0IHRvIGRvIGluIHN0YXRlIFNUQVRFLU5VTS4gIElmCisgICBwb3NpdGl2ZSwgc2hpZnQgdGhhdCB0b2tlbi4gIElmIG5lZ2F0aXZlLCByZWR1Y2UgdGhlIHJ1bGUgd2hpY2gKKyAgIG51bWJlciBpcyB0aGUgb3Bwb3NpdGUuICBJZiB6ZXJvLCBkbyB3aGF0IFlZREVGQUNUIHNheXMuCisgICBJZiBZWVRBQkxFX05JTkYsIHN5bnRheCBlcnJvci4gICovCisjZGVmaW5lIFlZVEFCTEVfTklORiAtNzYKK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXl0YWJsZVtdID0KK3sKKyAgICAgIDM5LCAgIDE2NSwgICAxNjksICAgMjI0LCAgIDE5MywgICAxMjEsICAgIDMwLCAgIDI2OCwgICAxMzAsICAgIDMxLAorICAgICAgNTAsICAgMTcwLCAgIDE3MSwgICAgNjIsICAgMTY0LCAgICA2MywgICAgNjcsICAgMjIwLCAgICA2NCwgICAyNjgsCisgICAgICA1MiwgICAxNzgsICAgMTIxLCAgIDEwOCwgICAgNTYsICAgIDcxLCAgIDE2MSwgICAxODUsICAgMTg2LCAgICAgNiwKKyAgICAgICA3LCAgIDI4NywgICAxNzIsICAgMTYyLCAgICA2MiwgICAyODcsICAgMTczLCAgICA1NiwgICAgNjYsICAgMTk0LAorICAgICAxMDgsICAgIDUxLCAgICAgNiwgICAgIDcsICAgIDM5LCAgIDIwNywgICAxNzUsICAgMTY3LCAgIDE2OCwgICAgNTQsCisgICAgICAzMCwgICAgNzMsICAgMTc2LCAgICAzMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgMjMsICAgIDI0LCAgIDEzMCwKKyAgICAgIDU1LCAgICA4MSwgICAxODcsICAgMTg4LCAgIDE4MCwgICAgNjUsICAgMjQ5LCAgICA1NywgICAgNTgsICAgIDU5LAorICAgICAgMjMsICAgIDI0LCAgICA3MywgICAgNDcsICAgIDczLCAgIDIyNiwgICAxNDgsICAgMTY1LCAgICA0NywgICAgNDgsCisgICAgIDIyOCwgICAyMTcsICAgIDgxLCAgICA2OCwgICAyMTEsICAgMjEyLCAgIDIxMywgICAgODQsICAgIDcyLCAgICA4NSwKKyAgICAgMjIzLCAgIDIzMiwgICAtNzUsICAgMjE0LCAgIDI2NiwgICAxODMsICAgIDg2LCAgIDE4NCwgICAxMjEsICAgMjkwLAorICAgICAyMTcsICAgIDc2LCAgIDI0NiwgICAyMTUsICAgIDgzLCAgIDIxNywgICAyMzcsICAgMjM4LCAgIDIzOSwgICAyNDAsCisgICAgIDE5OCwgICAxMjQsICAgMjUxLCAgIDE5OSwgICAyMTcsICAgMTI2LCAgIDEwOCwgICAyMTgsICAgMjIwLCAgIDIxNywKKyAgICAgMTgxLCAgIDE4MiwgICAyNTIsICAgMTg5LCAgIDE5MCwgICAgNzMsICAgMjQ3LCAgIDI5NCwgICAyMTcsICAgMjYwLAorICAgICAyNzcsICAgMjU1LCAgIDI1NiwgICAxNTgsICAgMTIxLCAgIC0yNiwgICAyMzMsICAgMjM0LCAgIDEwOCwgICAxMDgsCisgICAgIDEwOCwgICAxMDgsICAgMTA4LCAgIDEwOCwgICAxMDgsICAgMTA4LCAgIDEwOCwgICAxMDgsICAgMTA4LCAgIDI5MywKKyAgICAgMjU3LCAgIDE3NCwgICAxMDgsICAgMTQ4LCAgICAgMiwgICAgIDMsICAgICA0LCAgIDE3OSwgICAxMjEsICAgMjQxLAorICAgICAyNDIsICAgMjY3LCAgICA1NywgICAgNTgsICAgIDU5LCAgIDIzNSwgICAyMzYsICAgMTkxLCAgIDE5MiwgICAxOTUsCisgICAgIDE5NywgICAyMDAsICAgMjAxLCAgIDI2NywgICAyMDMsICAgMjcyLCAgIDEwOCwgICAyMDQsICAgMjA4LCAgIDIwNSwKKyAgICAgMjA5LCAgIDI4MiwgICAtMjUsICAgMjIxLCAgIDI2MiwgICAtMjAsICAgMjI1LCAgIDI4NSwgICAyNTgsICAgMjU5LAorICAgICAtMjcsICAgMjkxLCAgIDI2MSwgICAyNzMsICAgMjE3LCAgIDI3MSwgICAyNzksICAgMjgwLCAgICAgMiwgICAgIDMsCisgICAgICAgNCwgICAxNjUsICAgMTQ4LCAgIDI4MSwgICAgIDgsICAgICA5LCAgICAxMCwgICAyODMsICAgMjg0LCAgIDI4NiwKKyAgICAgMTQ4LCAgIDI5NSwgICAyMzEsICAgMjQ1LCAgIDE1OSwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAorICAgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDc4LCAgICA4MiwgICAyNDMsCisgICAgIDE2MCwgICAgNDksICAgIDI1LCAgICAyNiwgICAxMjUsICAgIDI3LCAgICAyOCwgICAgODcsICAgIDI5LCAgICA4OCwKKyAgICAgIDg5LCAgICA5MCwgICAgOTEsICAgMjQ4LCAgIDI0NCwgICAgOTIsICAgIDkzLCAgIDI2MywgICAyOTIsICAgIDc3LAorICAgICAxNDgsICAgMjY0LCAgIDI3NCwgICAxNDgsICAgMTQ4LCAgICA3MCwgICAyNTQsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgOTQsICAgMTQ4LCAgIDE0OCwgICAxNjMsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgOTUsICAgIDk2LCAgICAgMCwgICAgOTcsICAgICAwLAorICAgICAxNDgsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQ4LCAgIDE0OCwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsCisgICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgIDEzMSwgICAxMzIsICAgMTMzLCAgICAgMCwKKyAgICAgMTM0LCAgIDEzNSwgICAxMzYsICAgMTM3LCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjMsCisgICAgICAyNCwgICAgMjUsICAgIDI2LCAgIDEzOCwgICAgMjcsICAgIDI4LCAgICA4NywgICAgMjksICAgIDg4LCAgICA4OSwKKyAgICAgIDkwLCAgICA5MSwgICAgIDAsICAgICAwLCAgICA5MiwgICAgOTMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICA5NCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxMzksICAgMTQwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQxLCAgICA5NSwgICAgOTYsICAgICAwLCAgICA5NywgICAgIDEsICAgICAyLAorICAgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgIDEzMSwgICAxMzIsCisgICAgIDEzMywgICAgIDAsICAgMTM0LCAgIDEzNSwgICAxMzYsICAgMTM3LCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwKKyAgICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgIDEzOCwgICAgMjcsICAgIDI4LCAgICA4NywgICAgMjksCisgICAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgIDAsICAgICAwLCAgICA5MiwgICAgOTMsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA5NCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxMzksCisgICAgIDIxOSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQxLCAgICA5NSwgICAgOTYsICAgICAwLCAgICA5NywKKyAgICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgICAxMzEsICAgMTMyLCAgIDEzMywgICAgIDAsICAgMTM0LCAgIDEzNSwgICAxMzYsICAgMTM3LCAgICAxMSwgICAgMTIsCisgICAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgIDEzOCwgICAgMjcsICAgIDI4LAorICAgICAgODcsICAgIDI5LCAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgIDAsICAgICAwLCAgICA5MiwgICAgOTMsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA5NCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgMTM5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQxLCAgICA5NSwgICAgOTYsCisgICAgICAgMCwgICAgOTcsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwKKyAgICAgICA5LCAgICAxMCwgICAxMzEsICAgMTMyLCAgIDEzMywgICAgIDAsICAgMTM0LCAgIDEzNSwgICAxMzYsICAgMTM3LAorICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsCisgICAgICAyMSwgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgIDEzOCwKKyAgICAgIDI3LCAgICAyOCwgICAgODcsICAgIDI5LCAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgIDAsICAgICAwLAorICAgICAgOTIsICAgIDkzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA5NCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgIDc2LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQxLAorICAgICAgOTUsICAgIDk2LCAgICAgMCwgICAgOTcsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsCisgICAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LAorICAgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIzLCAgICAyNCwgICAgMjUsCisgICAgICAyNiwgICAgIDAsICAgIDI3LCAgICAyOCwgICAgODcsICAgIDI5LCAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwKKyAgICAgICAwLCAgICAgMCwgICAgOTIsICAgIDkzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgOTQsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgIDE0MSwgICAgOTUsICAgIDk2LCAgICAgMCwgICAgOTcsICAgIDU2LCAgICAgMiwgICAgIDMsICAgICA0LAorICAgICAgIDAsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwKKyAgICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIzLAorICAgICAgMjQsICAgIDI1LCAgICAyNiwgICAgIDAsICAgIDI3LCAgICAyOCwgICAgODcsICAgIDI5LCAgICA4OCwgICAgODksCisgICAgICA5MCwgICAgOTEsICAgICAwLCAgICAgMCwgICAgOTIsICAgIDkzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgOTQsICAgICAyLCAgICAgMywgICAgIDQsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgOCwgICAgIDksICAgIDEwLCAgICAgMCwgICAgOTUsICAgIDk2LCAgICAgMCwgICAgOTcsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAorICAgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyNSwgICAgMjYsCisgICAgICAgMCwgICAgMjcsICAgIDI4LCAgICA4NywgICAgMjksICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLCAgICAgMCwKKyAgICAgICAwLCAgICA5MiwgICAgOTMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICA5NCwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDgsICAgICA5LCAgICAxMCwKKyAgICAgMjA2LCAgICA5NSwgICAgOTYsICAgICAwLCAgICA5NywgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTEsICAgIDEyLAorICAgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI1LCAgICAyNiwgICAgIDAsICAgIDI3LCAgICAyOCwKKyAgICAgIDg3LCAgICAyOSwgICAgODgsICAgIDg5LCAgICA5MCwgICAgOTEsICAgICAwLCAgICAgMCwgICAgOTIsICAgIDkzLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgOTQsICAgICAwLCAgICAgMCwKKyAgICAgMjIyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgOTUsICAgIDk2LAorICAgICAgIDAsICAgIDk3LCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgOCwgICAgIDksCisgICAgICAxMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxMSwKKyAgICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLAorICAgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjUsICAgIDI2LCAgICAgMCwgICAgMjcsCisgICAgICAyOCwgICAgODcsICAgIDI5LCAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgIDAsICAgICAwLCAgICA5MiwKKyAgICAgIDkzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA5NCwgICAgIDIsCisgICAgICAgMywgICAgIDQsICAgICAwLCAgICAgMCwgICAgIDAsICAgICA4LCAgICAgOSwgICAgMTAsICAgICAwLCAgICA5NSwKKyAgICAgIDk2LCAgICAgMCwgICAgOTcsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAyNSwgICAxNzcsICAgICAwLCAgICAyNywgICAgMjgsICAgIDg3LCAgICAyOSwKKyAgICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLCAgICAgMCwgICAgIDAsICAgIDkyLCAgICA5MywgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDk0LCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDgsICAgICA5LCAgICAxMCwgICAgIDAsICAgIDk1LCAgICA5NiwgICAgIDAsICAgIDk3LAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsCisgICAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgIDI1LCAgICAyNiwgICAgIDAsICAgIDI3LCAgICAyOCwgICAgIDAsICAgIDI5LCAgICAgMiwgICAgIDMsICAgICA0LAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDgsICAgICA5LCAgICAxMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwKKyAgICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgICAwLCAgIDEyOSwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgIDI1LCAgICAyNiwgICAgIDAsICAgIDI3LCAgICAyOCwgICAgIDAsICAgIDI5LCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDY5LCAgICAgMCwKKyAgICAgICAwLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAorICAgICAgMTAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE5NiwgICAgMTEsCisgICAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwKKyAgICAgIDIyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgIDAsICAgIDI3LAorICAgICAgMjgsICAgICAwLCAgICAyOSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDgsCisgICAgICAgOSwgICAgMTAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgICAgMjEsICAgIDIyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI1LCAgICAyNiwgICAgIDAsCisgICAgICAyNywgICAgMjgsICAgMjI5LCAgICAyOSwgICAgIDAsICAgICAwLCAgICAgMCwgICAyMzAsICAgICAxLCAgICAgMiwKKyAgICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsCisgICAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgIDAsICAgIDI3LCAgICAyOCwgICAgIDAsICAgIDI5LAorICAgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDgsICAgICA5LCAgICAxMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTEsICAgIDEyLCAgICAxMywKKyAgICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgICAwLAorICAgICAgIDgsICAgICA5LCAgICAxMCwgICAgIDAsICAgIDI1LCAgICAyNiwgICAgIDAsICAgIDI3LCAgICAyOCwgICAgIDAsCisgICAgICAyOSwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKKyAgICAgIDIwLCAgICAyMSwgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjUsICAgIDI2LAorICAgICAgIDAsICAgIDI3LCAgICAyOCwgICAgIDAsICAgIDI5Cit9OworCitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5Y2hlY2tbXSA9Cit7CisgICAgICAgMCwgICAgODYsICAgIDk0LCAgIDE2MiwgICAgNTgsICAgIDY4LCAgICAgMCwgICAyNTMsICAgIDc0LCAgICAgMCwKKyAgICAgIDQzLCAgICA1MSwgICAgNTIsICAgIDM0LCAgICA4NSwgICAgNzcsICAgIDQwLCAgIDE1MywgICAgODAsICAgMjY1LAorICAgICAgODAsICAgMTA2LCAgICA4NSwgICAgNjgsICAgICAzLCAgICA0OSwgICAgNzIsICAgIDUzLCAgICA1NCwgICAgIDgsCisgICAgICAgOSwgICAyODAsICAgIDcyLCAgICA3OSwgICAgNTUsICAgMjg0LCAgICA3NiwgICAgIDMsICAgIDM4LCAgICA5MywKKyAgICAgIDg1LCAgICA3NCwgICAgIDgsICAgICA5LCAgICA0NCwgICAxMzcsICAgIDcxLCAgICA5MiwgICAgOTMsICAgIDcxLAorICAgICAgNDQsICAgIDUxLCAgICA3NywgICAgNDQsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAxMjUsCisgICAgICA3NywgICAgNjEsICAgIDg4LCAgICA4OSwgICAxMDksICAgIDQzLCAgIDIwMiwgICAgMzMsICAgIDM0LCAgICAzNSwKKyAgICAgIDM2LCAgICAzNywgICAgNzIsICAgIDM3LCAgICA3NCwgICAgNzEsICAgIDc2LCAgIDE2MiwgICAgMzcsICAgIDQzLAorICAgICAxNzIsICAgIDc3LCAgICA4MiwgICAgNzIsICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDcwLCAgICA3NCwgICAgNzIsCisgICAgIDE2MSwgICAxNzYsICAgIDcxLCAgICA2OSwgICAgNzEsICAgIDgyLCAgICA3OSwgICAgODQsICAgMTYxLCAgICA3MSwKKyAgICAgIDc3LCAgICA3NCwgICAxOTQsICAgIDc5LCAgICA0MywgICAgNzcsICAgMTg1LCAgIDE4NiwgICAxODcsICAgMTg4LAorICAgICAgNzcsICAgIDgwLCAgIDIwNCwgICAgODAsICAgIDc3LCAgICA0MywgICAxNjEsICAgIDgwLCAgIDI1NCwgICAgNzcsCisgICAgICA4NSwgICAgODYsICAgIDgwLCAgICA1NSwgICAgNTYsICAgMTI1LCAgIDE5NywgICAyODYsICAgIDc3LCAgICA3OCwKKyAgICAgMjY2LCAgIDIxNiwgICAyMTcsICAgIDQzLCAgIDE5NywgICAgNzAsICAgMTgxLCAgIDE4MiwgICAxODMsICAgMTg0LAorICAgICAxODUsICAgMTg2LCAgIDE4NywgICAxODgsICAgMTg5LCAgIDE5MCwgICAxOTEsICAgMTkyLCAgIDE5MywgICAyODUsCisgICAgIDIyMSwgICAgNzEsICAgMTk3LCAgIDE1MywgICAgIDQsICAgICA1LCAgICAgNiwgICAgNzAsICAgMjIxLCAgIDE4OSwKKyAgICAgMTkwLCAgIDI1MywgICAgMzMsICAgIDM0LCAgICAzNSwgICAxODMsICAgMTg0LCAgICA1NywgICAgNTksICAgIDczLAorICAgICAgNzIsICAgIDgwLCAgICA4MCwgICAyNjUsICAgIDcwLCAgIDI2MCwgICAyMjEsICAgIDcwLCAgICA3MCwgICAgODAsCisgICAgICA3NSwgICAyNzMsICAgIDcwLCAgICA3MiwgICAgNDAsICAgIDcxLCAgICA3MywgICAgMTYsICAgIDczLCAgICA3MywKKyAgICAgIDcwLCAgIDI4MywgICAgNzMsICAgIDcwLCAgICA3NywgICAgNzMsICAgIDQzLCAgICA3MSwgICAgIDQsICAgICA1LAorICAgICAgIDYsICAgMjg2LCAgIDIwMiwgICAgNzUsICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDgwLCAgICA3MSwgICAgNzksCisgICAgIDIxMCwgICAgODAsICAgMTczLCAgIDE5MywgICAgODIsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwKKyAgICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICA1NSwgICAgNjIsICAgMTkxLAorICAgICAgODIsICAgICA1LCAgICAzOCwgICAgMzksICAgIDcyLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsCisgICAgICA0NiwgICAgNDcsICAgIDQ4LCAgIDE5OCwgICAxOTIsICAgIDUxLCAgICA1MiwgICAyNTAsICAgMjg0LCAgICA1MywKKyAgICAgMjUwLCAgIDI1MCwgICAyNjUsICAgMjUzLCAgIDI1NCwgICAgNDQsICAgMjEwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDcwLCAgIDI2NSwgICAyNjYsICAgIDczLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDgxLCAgICA4MiwgICAgLTEsICAgIDg0LCAgICAtMSwKKyAgICAgMjgwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgIDI4NCwgICAyODUsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LAorICAgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgLTEsCisgICAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwKKyAgICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDM2LAorICAgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsCisgICAgICA0NywgICAgNDgsICAgIC0xLCAgICAtMSwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNzAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDc0LCAgICA3NSwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICA4MCwgICAgODEsICAgIDgyLCAgICAtMSwgICAgODQsICAgICAzLCAgICAgNCwKKyAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgICAgMTUsICAgIC0xLCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsCisgICAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LAorICAgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIC0xLCAgICAtMSwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNzAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDc0LAorICAgICAgNzUsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA4MCwgICAgODEsICAgIDgyLCAgICAtMSwgICAgODQsCisgICAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwKKyAgICAgIDEzLCAgICAxNCwgICAgMTUsICAgIC0xLCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLAorICAgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwKKyAgICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIC0xLCAgICAtMSwgICAgNTEsICAgIDUyLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNzAsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICA3NCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA4MCwgICAgODEsICAgIDgyLAorICAgICAgLTEsICAgIDg0LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsCisgICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIC0xLCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwKKyAgICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLAorICAgICAgMzEsICAgIDMyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsCisgICAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIC0xLCAgICAtMSwKKyAgICAgIDUxLCAgICA1MiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNzAsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICA3NCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA4MCwKKyAgICAgIDgxLCAgICA4MiwgICAgLTEsICAgIDg0LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwKKyAgICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzNiwgICAgMzcsICAgIDM4LAorICAgICAgMzksICAgIC0xLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsCisgICAgICAtMSwgICAgLTEsICAgIDUxLCAgICA1MiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIDcwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgLTEsICAgIDg0LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwKKyAgICAgIC0xLCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsCisgICAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzNiwKKyAgICAgIDM3LCAgICAzOCwgICAgMzksICAgIC0xLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LAorICAgICAgNDcsICAgIDQ4LCAgICAtMSwgICAgLTEsICAgIDUxLCAgICA1MiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDcwLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgMTAsICAgIDExLCAgICAxMiwgICAgLTEsICAgIDgxLCAgICA4MiwgICAgLTEsICAgIDg0LCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwKKyAgICAgIDMwLCAgICAzMSwgICAgMzIsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzgsICAgIDM5LAorICAgICAgLTEsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgLTEsCisgICAgICAtMSwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgNzAsICAgICA0LCAgICAgNSwgICAgIDYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDEwLCAgICAxMSwgICAgMTIsCisgICAgICA4MCwgICAgODEsICAgIDgyLCAgICAtMSwgICAgODQsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDIxLCAgICAyMiwKKyAgICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzOCwgICAgMzksICAgIC0xLCAgICA0MSwgICAgNDIsCisgICAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICAtMSwgICAgLTEsICAgIDUxLCAgICA1MiwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDcwLCAgICAtMSwgICAgLTEsCisgICAgICA3MywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDgxLCAgICA4MiwKKyAgICAgIC0xLCAgICA4NCwgICAgIDQsICAgICA1LCAgICAgNiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMTAsICAgIDExLAorICAgICAgMTIsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMjEsCisgICAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwKKyAgICAgIDMyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDM4LCAgICAzOSwgICAgLTEsICAgIDQxLAorICAgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIC0xLCAgICAtMSwgICAgNTEsCisgICAgICA1MiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNzAsICAgICA0LAorICAgICAgIDUsICAgICA2LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAtMSwgICAgODEsCisgICAgICA4MiwgICAgLTEsICAgIDg0LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwKKyAgICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzgsICAgIDM5LCAgICAtMSwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCisgICAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgLTEsICAgIC0xLCAgICA1MSwgICAgNTIsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA3MCwgICAgIDQsICAgICA1LCAgICAgNiwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIDEwLCAgICAxMSwgICAgMTIsICAgIC0xLCAgICA4MSwgICAgODIsICAgIC0xLCAgICA4NCwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LAorICAgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAzOCwgICAgMzksICAgIC0xLCAgICA0MSwgICAgNDIsICAgIC0xLCAgICA0NCwgICAgIDQsICAgICA1LCAgICAgNiwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDEwLCAgICAxMSwgICAgMTIsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsCisgICAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAtMSwgICAgNzUsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAzOCwgICAgMzksICAgIC0xLCAgICA0MSwgICAgNDIsICAgIC0xLCAgICA0NCwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAgMCwgICAgLTEsCisgICAgICAtMSwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKKyAgICAgIDEyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNzUsICAgIDIxLAorICAgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsCisgICAgICAzMiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIC0xLCAgICA0MSwKKyAgICAgIDQyLCAgICAtMSwgICAgNDQsICAgICA0LCAgICAgNSwgICAgIDYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDEwLAorICAgICAgMTEsICAgIDEyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwKKyAgICAgIDMxLCAgICAzMiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzOCwgICAgMzksICAgIC0xLAorICAgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQ4LCAgICAgMywgICAgIDQsCisgICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LAorICAgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIC0xLCAgICA0MSwgICAgNDIsICAgIC0xLCAgICA0NCwKKyAgICAgICA0LCAgICAgNSwgICAgIDYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDEwLCAgICAxMSwgICAgMTIsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDIxLCAgICAyMiwgICAgMjMsCisgICAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAtMSwKKyAgICAgIDEwLCAgICAxMSwgICAgMTIsICAgIC0xLCAgICAzOCwgICAgMzksICAgIC0xLCAgICA0MSwgICAgNDIsICAgIC0xLAorICAgICAgNDQsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksCisgICAgICAzMCwgICAgMzEsICAgIDMyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDM4LCAgICAzOSwKKyAgICAgIC0xLCAgICA0MSwgICAgNDIsICAgIC0xLCAgICA0NAorfTsKKworLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKKyAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXN0b3NbXSA9Cit7CisgICAgICAgMCwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKKyAgICAgIDEyLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LAorICAgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQxLCAgICA0MiwgICAgNDQsCisgICAgIDEyNCwgICAxMjUsICAgMTI2LCAgIDEyNywgICAxMjgsICAgMTMzLCAgIDEzNCwgICAxMzUsICAgMTM2LCAgIDEzNywKKyAgICAgMTM4LCAgIDEzOSwgICAxNDAsICAgMTQxLCAgIDE2OCwgICAxNjksICAgMTcwLCAgICAzNywgICAgNDMsICAgMTM4LAorICAgICAgNDMsICAgIDc0LCAgICA4MCwgICAxNzEsICAgIDcxLCAgICA3NywgICAgIDMsICAgIDMzLCAgICAzNCwgICAgMzUsCisgICAgIDEzMCwgICAxMzEsICAgMTM2LCAgICA3NywgICAgODAsICAgIDQzLCAgIDEzNywgICAxMzksICAgIDcyLCAgICAgMCwKKyAgICAgMTY5LCAgIDEzOSwgICAgNzQsICAgMTM3LCAgIDE0MiwgICAxNDMsICAgIDc0LCAgIDE1NCwgICAxMzAsICAgMTI5LAorICAgICAxMzIsICAgMTM3LCAgIDEzMSwgICAgNDMsICAgIDcwLCAgICA3MiwgICAgNzksICAgIDQzLCAgICA0NSwgICAgNDYsCisgICAgICA0NywgICAgNDgsICAgIDUxLCAgICA1MiwgICAgNzAsICAgIDgxLCAgICA4MiwgICAgODQsICAgIDk1LCAgICA5NiwKKyAgICAgIDk3LCAgICA5OSwgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMTA3LAorICAgICAxMDgsICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgIDExMywgICAxMTQsICAgMTE1LCAgIDExNiwgICAxMTcsCisgICAgIDExOCwgICAxMTksICAgMTIzLCAgIDEzNywgICAgODAsICAgMTQyLCAgICA0MywgICAxNDQsICAgMTQ1LCAgICA3NSwKKyAgICAgMTQzLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgNDAsICAgIDc0LAorICAgICAgNzUsICAgIDgwLCAgIDEwNiwgICAxMTksICAgMTIwLCAgIDEyMiwgICAxMjQsICAgMTI1LCAgIDEzNywgICAxNDcsCisgICAgIDE0OCwgICAxNDksICAgMTUwLCAgIDE1NSwgICAxNTYsICAgMTU3LCAgIDE2MCwgICAxNjcsICAgIDQzLCAgIDEyOSwKKyAgICAgMTMyLCAgICA3MiwgICAgNzksICAgIDczLCAgIDEyMywgICAxMjAsICAgMTQ2LCAgIDEwNiwgICAxMDYsICAgMTIyLAorICAgICAgNTEsICAgIDUyLCAgICA3MiwgICAgNzYsICAgIDcxLCAgICA3MSwgICAgNzcsICAgIDM5LCAgIDEyMCwgICAgNzAsCisgICAgIDEwNiwgICAgODUsICAgIDg2LCAgICA4MiwgICAgODQsICAgIDUzLCAgICA1NCwgICAgODgsICAgIDg5LCAgICA1NSwKKyAgICAgIDU2LCAgICA1NywgICAgNTksICAgIDU4LCAgICA5MywgICAgNzMsICAgIDc1LCAgICA3MiwgICAgNzcsICAgIDgwLAorICAgICAgODAsICAgIDgwLCAgIDE2MiwgICAgNzAsICAgIDcwLCAgICA4MCwgICAgODAsICAgMTIyLCAgICA3MCwgICAgNzUsCisgICAgIDE1MSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjksICAgIDc5LCAgIDEyMSwgICAgNzcsICAgIDgwLCAgICA3NSwKKyAgICAgMTQ4LCAgICA3MiwgICAgNzMsICAgMTIzLCAgIDE0NiwgICAgNzMsICAgIDcxLCAgICA5OCwgICAxMjIsICAgIDQzLAorICAgICAgNDgsICAgMTAxLCAgIDEyMCwgICAxMDYsICAgMTA2LCAgIDEwOCwgICAxMDgsICAgMTEwLCAgIDExMCwgICAxMTAsCisgICAgIDExMCwgICAxMTEsICAgMTExLCAgIDExNSwgICAxMTYsICAgMTE3LCAgIDEyMiwgICAxMjMsICAgMTQ1LCAgIDE0OCwKKyAgICAgMTYzLCAgIDEyMiwgICAgODAsICAgMTYxLCAgIDE1NSwgICAxMjAsICAgMTIwLCAgIDEyMywgICAgNzMsICAgIDczLAorICAgICAgNzgsICAgIDczLCAgICA0MCwgICAxNDcsICAgMTU2LCAgIDE2NCwgICAgNzEsICAgMTIyLCAgIDEzNSwgICAxNTksCisgICAgIDE1MiwgICAgNzMsICAgMTIwLCAgICA3MCwgICAxNTksICAgMTY1LCAgIDE2NiwgICAxNDgsICAgMTU4LCAgICA0MywKKyAgICAgIDcxLCAgICA3NSwgICAxMjIsICAgIDgwLCAgICA3MSwgICAgMTYsICAgIDc5LCAgIDE0OSwgICAxNTMsICAgMTU0LAorICAgICAgNzEsICAgMTIyLCAgIDE1MywgICAxNDgsICAgMTQ2LCAgICA4MAorfTsKKworI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQorI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCisjZGVmaW5lIFlZRU1QVFkJCSgtMikKKyNkZWZpbmUgWVlFT0YJCTAKKworI2RlZmluZSBZWUFDQ0VQVAlnb3RvIHl5YWNjZXB0bGFiCisjZGVmaW5lIFlZQUJPUlQJCWdvdG8geXlhYm9ydGxhYgorI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJyb3JsYWIKKworCisvKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4gIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5CisgICB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgorICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLworCisjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorCisjZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKKworI2RlZmluZSBZWUJBQ0tVUChUb2tlbiwgVmFsdWUpCQkJCQlcCitkbwkJCQkJCQkJXAorICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIHl5Y2hhciA9IChUb2tlbik7CQkJCQkJXAorICAgICAgeXlsdmFsID0gKFZhbHVlKTsJCQkJCQlcCisgICAgICB5eXRva2VuID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKKyAgICAgIFlZUE9QU1RBQ0sgKDEpOwkJCQkJCVwKKyAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAorICAgIH0JCQkJCQkJCVwKKyAgZWxzZQkJCQkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIHl5ZXJyb3IgKGNvbnRleHQsIFlZXygic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpKTsgXAorICAgICAgWVlFUlJPUjsJCQkJCQkJXAorICAgIH0JCQkJCQkJCVwKK3doaWxlIChZWUlEICgwKSkKKworCisjZGVmaW5lIFlZVEVSUk9SCTEKKyNkZWZpbmUgWVlFUlJDT0RFCTI1NgorCisKKy8qIFlZTExPQ19ERUZBVUxUIC0tIFNldCBDVVJSRU5UIHRvIHNwYW4gZnJvbSBSSFNbMV0gdG8gUkhTW05dLgorICAgSWYgTiBpcyAwLCB0aGVuIHNldCBDVVJSRU5UIHRvIHRoZSBlbXB0eSBsb2NhdGlvbiB3aGljaCBlbmRzCisgICB0aGUgcHJldmlvdXMgc3ltYm9sOiBSSFNbMF0gKGFsd2F5cyBkZWZpbmVkKS4gICovCisKKyNkZWZpbmUgWVlSSFNMT0MoUmhzLCBLKSAoKFJocylbS10pCisjaWZuZGVmIFlZTExPQ19ERUZBVUxUCisjIGRlZmluZSBZWUxMT0NfREVGQVVMVChDdXJyZW50LCBSaHMsIE4pCQkJCVwKKyAgICBkbwkJCQkJCQkJCVwKKyAgICAgIGlmIChZWUlEIChOKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsJCQkJCQkJCVwKKwkgIChDdXJyZW50KS5maXJzdF9saW5lICAgPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9saW5lOwlcCisJICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gWVlSSFNMT0MgKFJocywgMSkuZmlyc3RfY29sdW1uOwlcCisJICAoQ3VycmVudCkubGFzdF9saW5lICAgID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9saW5lOwkJXAorCSAgKEN1cnJlbnQpLmxhc3RfY29sdW1uICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfY29sdW1uOwlcCisJfQkJCQkJCQkJXAorICAgICAgZWxzZQkJCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkgIChDdXJyZW50KS5maXJzdF9saW5lICAgPSAoQ3VycmVudCkubGFzdF9saW5lICAgPQkJXAorCSAgICBZWVJIU0xPQyAoUmhzLCAwKS5sYXN0X2xpbmU7CQkJCVwKKwkgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSAoQ3VycmVudCkubGFzdF9jb2x1bW4gPQkJXAorCSAgICBZWVJIU0xPQyAoUmhzLCAwKS5sYXN0X2NvbHVtbjsJCQkJXAorCX0JCQkJCQkJCVwKKyAgICB3aGlsZSAoWVlJRCAoMCkpCisjZW5kaWYKKworCisvKiBZWV9MT0NBVElPTl9QUklOVCAtLSBQcmludCB0aGUgbG9jYXRpb24gb24gdGhlIHN0cmVhbS4KKyAgIFRoaXMgbWFjcm8gd2FzIG5vdCBtYW5kYXRlZCBvcmlnaW5hbGx5OiBkZWZpbmUgb25seSBpZiB3ZSBrbm93CisgICB3ZSB3b24ndCBicmVhayB1c2VyIGNvZGU6IHdoZW4gdGhlc2UgYXJlIHRoZSBsb2NhdGlvbnMgd2Uga25vdy4gICovCisKKyNpZm5kZWYgWVlfTE9DQVRJT05fUFJJTlQKKyMgaWYgZGVmaW5lZCBZWUxUWVBFX0lTX1RSSVZJQUwgJiYgWVlMVFlQRV9JU19UUklWSUFMCisjICBkZWZpbmUgWVlfTE9DQVRJT05fUFJJTlQoRmlsZSwgTG9jKQkJCVwKKyAgICAgZnByaW50ZiAoRmlsZSwgIiVkLiVkLSVkLiVkIiwJCQlcCisJICAgICAgKExvYykuZmlyc3RfbGluZSwgKExvYykuZmlyc3RfY29sdW1uLAlcCisJICAgICAgKExvYykubGFzdF9saW5lLCAgKExvYykubGFzdF9jb2x1bW4pCisjIGVsc2UKKyMgIGRlZmluZSBZWV9MT0NBVElPTl9QUklOVChGaWxlLCBMb2MpICgodm9pZCkgMCkKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIFlZTEVYIC0tIGNhbGxpbmcgYHl5bGV4JyB3aXRoIHRoZSByaWdodCBhcmd1bWVudHMuICAqLworCisjaWZkZWYgWVlMRVhfUEFSQU0KKyMgZGVmaW5lIFlZTEVYIHl5bGV4ICgmeXlsdmFsLCBZWUxFWF9QQVJBTSkKKyNlbHNlCisjIGRlZmluZSBZWUxFWCB5eWxleCAoJnl5bHZhbCkKKyNlbmRpZgorCisvKiBFbmFibGUgZGVidWdnaW5nIGlmIHJlcXVlc3RlZC4gICovCisjaWYgWVlERUJVRworCisjIGlmbmRlZiBZWUZQUklOVEYKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWUZQUklOVEYgZnByaW50ZgorIyBlbmRpZgorCisjIGRlZmluZSBZWURQUklOVEYoQXJncykJCQlcCitkbyB7CQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCVwKKyAgICBZWUZQUklOVEYgQXJnczsJCQkJXAorfSB3aGlsZSAoWVlJRCAoMCkpCisKKyMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQkJCSAgXAorZG8gewkJCQkJCQkJCSAgXAorICBpZiAoeXlkZWJ1ZykJCQkJCQkJCSAgXAorICAgIHsJCQkJCQkJCQkgIFwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQkJICBcCisgICAgICB5eV9zeW1ib2xfcHJpbnQgKHN0ZGVyciwJCQkJCQkgIFwKKwkJICBUeXBlLCBWYWx1ZSwgY29udGV4dCk7IFwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsJCQkJCQkgIFwKKyAgICB9CQkJCQkJCQkJICBcCit9IHdoaWxlIChZWUlEICgwKSkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBQcmludCB0aGlzIHN5bWJvbCBvbiBZWU9VVFBVVC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qQVJHU1VTRUQqLworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyB2b2lkCit5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXAsIFRQYXJzZUNvbnRleHQqIGNvbnRleHQpCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXAsIGNvbnRleHQpCisgICAgRklMRSAqeXlvdXRwdXQ7CisgICAgaW50IHl5dHlwZTsKKyAgICBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXA7CisgICAgVFBhcnNlQ29udGV4dCogY29udGV4dDsKKyNlbmRpZgoreworICBpZiAoIXl5dmFsdWVwKQorICAgIHJldHVybjsKKyAgWVlVU0UgKGNvbnRleHQpOworIyBpZmRlZiBZWVBSSU5UCisgIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCisgICAgWVlQUklOVCAoeXlvdXRwdXQsIHl5dG9rbnVtW3l5dHlwZV0sICp5eXZhbHVlcCk7CisjIGVsc2UKKyAgWVlVU0UgKHl5b3V0cHV0KTsKKyMgZW5kaWYKKyAgc3dpdGNoICh5eXR5cGUpCisgICAgeworICAgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUHJpbnQgdGhpcyBzeW1ib2wgb24gWVlPVVRQVVQuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIHZvaWQKK3l5X3N5bWJvbF9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCwgVFBhcnNlQ29udGV4dCogY29udGV4dCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfc3ltYm9sX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCwgY29udGV4dCkKKyAgICBGSUxFICp5eW91dHB1dDsKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKKyAgICBUUGFyc2VDb250ZXh0KiBjb250ZXh0OworI2VuZGlmCit7CisgIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCisgICAgWVlGUFJJTlRGICh5eW91dHB1dCwgInRva2VuICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOworICBlbHNlCisgICAgWVlGUFJJTlRGICh5eW91dHB1dCwgIm50ZXJtICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOworCisgIHl5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXAsIGNvbnRleHQpOworICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiKSIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlfc3RhY2tfcHJpbnQgLS0gUHJpbnQgdGhlIHN0YXRlIHN0YWNrIGZyb20gaXRzIEJPVFRPTSB1cCB0byBpdHMgfAorfCBUT1AgKGluY2x1ZGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyB2b2lkCit5eV9zdGFja19wcmludCAoeXl0eXBlX2ludDE2ICpib3R0b20sIHl5dHlwZV9pbnQxNiAqdG9wKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eV9zdGFja19wcmludCAoYm90dG9tLCB0b3ApCisgICAgeXl0eXBlX2ludDE2ICpib3R0b207CisgICAgeXl0eXBlX2ludDE2ICp0b3A7CisjZW5kaWYKK3sKKyAgWVlGUFJJTlRGIChzdGRlcnIsICJTdGFjayBub3ciKTsKKyAgZm9yICg7IGJvdHRvbSA8PSB0b3A7ICsrYm90dG9tKQorICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKmJvdHRvbSk7CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKK30KKworIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQkJCVwKKyAgICB5eV9zdGFja19wcmludCAoKEJvdHRvbSksIChUb3ApKTsJCQkJXAorfSB3aGlsZSAoWVlJRCAoMCkpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFJlcG9ydCB0aGF0IHRoZSBZWVJVTEUgaXMgZ29pbmcgdG8gYmUgcmVkdWNlZC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIHZvaWQKK3l5X3JlZHVjZV9wcmludCAoWVlTVFlQRSAqeXl2c3AsIGludCB5eXJ1bGUsIFRQYXJzZUNvbnRleHQqIGNvbnRleHQpCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3JlZHVjZV9wcmludCAoeXl2c3AsIHl5cnVsZSwgY29udGV4dCkKKyAgICBZWVNUWVBFICp5eXZzcDsKKyAgICBpbnQgeXlydWxlOworICAgIFRQYXJzZUNvbnRleHQqIGNvbnRleHQ7CisjZW5kaWYKK3sKKyAgaW50IHl5bnJocyA9IHl5cjJbeXlydWxlXTsKKyAgaW50IHl5aTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgeXlsbm8gPSB5eXJsaW5lW3l5cnVsZV07CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgc3RhY2sgYnkgcnVsZSAlZCAobGluZSAlbHUpOlxuIiwKKwkgICAgIHl5cnVsZSAtIDEsIHl5bG5vKTsKKyAgLyogVGhlIHN5bWJvbHMgYmVpbmcgcmVkdWNlZC4gICovCisgIGZvciAoeXlpID0gMDsgeXlpIDwgeXlucmhzOyB5eWkrKykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgICAkJWQgPSAiLCB5eWkgKyAxKTsKKyAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLCB5eXJoc1t5eXByaHNbeXlydWxlXSArIHl5aV0sCisJCSAgICAgICAmKHl5dnNwWyh5eWkgKyAxKSAtICh5eW5yaHMpXSkKKwkJICAgICAgIAkJICAgICAgICwgY29udGV4dCk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIH0KK30KKworIyBkZWZpbmUgWVlfUkVEVUNFX1BSSU5UKFJ1bGUpCQlcCitkbyB7CQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQlcCisgICAgeXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgUnVsZSwgY29udGV4dCk7IFwKK30gd2hpbGUgKFlZSUQgKDApKQorCisvKiBOb256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlLiAgSXQgaXMgbGVmdCB1bmluaXRpYWxpemVkIHNvIHRoYXQKKyAgIG11bHRpcGxlIHBhcnNlcnMgY2FuIGNvZXhpc3QuICAqLworaW50IHl5ZGVidWc7CisjZWxzZSAvKiAhWVlERUJVRyAqLworIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCisjIGRlZmluZSBZWV9TWU1CT0xfUFJJTlQoVGl0bGUsIFR5cGUsIFZhbHVlLCBMb2NhdGlvbikKKyMgZGVmaW5lIFlZX1NUQUNLX1BSSU5UKEJvdHRvbSwgVG9wKQorIyBkZWZpbmUgWVlfUkVEVUNFX1BSSU5UKFJ1bGUpCisjZW5kaWYgLyogIVlZREVCVUcgKi8KKworCisvKiBZWUlOSVRERVBUSCAtLSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcy4gICovCisjaWZuZGVmCVlZSU5JVERFUFRICisjIGRlZmluZSBZWUlOSVRERVBUSCAyMDAKKyNlbmRpZgorCisvKiBZWU1BWERFUFRIIC0tIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvIChlZmZlY3RpdmUgb25seQorICAgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuCisKKyAgIERvIG5vdCBtYWtlIHRoaXMgdmFsdWUgdG9vIGxhcmdlOyB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmCisgICBZWVNUQUNLX0FMTE9DX01BWElNVU0gPCBZWVNUQUNLX0JZVEVTIChZWU1BWERFUFRIKQorICAgZXZhbHVhdGVkIHdpdGggaW5maW5pdGUtcHJlY2lzaW9uIGludGVnZXIgYXJpdGhtZXRpYy4gICovCisKKyNpZm5kZWYgWVlNQVhERVBUSAorIyBkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAorI2VuZGlmCisKKwwKKworI2lmIFlZRVJST1JfVkVSQk9TRQorCisjIGlmbmRlZiB5eXN0cmxlbgorIyAgaWYgZGVmaW5lZCBfX0dMSUJDX18gJiYgZGVmaW5lZCBfU1RSSU5HX0gKKyMgICBkZWZpbmUgeXlzdHJsZW4gc3RybGVuCisjICBlbHNlCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBZWVNUUi4gICovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIFlZU0laRV9UCit5eXN0cmxlbiAoY29uc3QgY2hhciAqeXlzdHIpCisjZWxzZQorc3RhdGljIFlZU0laRV9UCit5eXN0cmxlbiAoeXlzdHIpCisgICAgY29uc3QgY2hhciAqeXlzdHI7CisjZW5kaWYKK3sKKyAgWVlTSVpFX1QgeXlsZW47CisgIGZvciAoeXlsZW4gPSAwOyB5eXN0clt5eWxlbl07IHl5bGVuKyspCisgICAgY29udGludWU7CisgIHJldHVybiB5eWxlbjsKK30KKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZuZGVmIHl5c3RwY3B5CisjICBpZiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBkZWZpbmVkIF9TVFJJTkdfSCAmJiBkZWZpbmVkIF9HTlVfU09VUkNFCisjICAgZGVmaW5lIHl5c3RwY3B5IHN0cGNweQorIyAgZWxzZQorLyogQ29weSBZWVNSQyB0byBZWURFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgJ1wwJyBpbgorICAgWVlERVNULiAgKi8KKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgY2hhciAqCit5eXN0cGNweSAoY2hhciAqeXlkZXN0LCBjb25zdCBjaGFyICp5eXNyYykKKyNlbHNlCitzdGF0aWMgY2hhciAqCit5eXN0cGNweSAoeXlkZXN0LCB5eXNyYykKKyAgICBjaGFyICp5eWRlc3Q7CisgICAgY29uc3QgY2hhciAqeXlzcmM7CisjZW5kaWYKK3sKKyAgY2hhciAqeXlkID0geXlkZXN0OworICBjb25zdCBjaGFyICp5eXMgPSB5eXNyYzsKKworICB3aGlsZSAoKCp5eWQrKyA9ICp5eXMrKykgIT0gJ1wwJykKKyAgICBjb250aW51ZTsKKworICByZXR1cm4geXlkIC0gMTsKK30KKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZuZGVmIHl5dG5hbWVycgorLyogQ29weSB0byBZWVJFUyB0aGUgY29udGVudHMgb2YgWVlTVFIgYWZ0ZXIgc3RyaXBwaW5nIGF3YXkgdW5uZWNlc3NhcnkKKyAgIHF1b3RlcyBhbmQgYmFja3NsYXNoZXMsIHNvIHRoYXQgaXQncyBzdWl0YWJsZSBmb3IgeXllcnJvci4gIFRoZQorICAgaGV1cmlzdGljIGlzIHRoYXQgZG91YmxlLXF1b3RpbmcgaXMgdW5uZWNlc3NhcnkgdW5sZXNzIHRoZSBzdHJpbmcKKyAgIGNvbnRhaW5zIGFuIGFwb3N0cm9waGUsIGEgY29tbWEsIG9yIGJhY2tzbGFzaCAob3RoZXIgdGhhbgorICAgYmFja3NsYXNoLWJhY2tzbGFzaCkuICBZWVNUUiBpcyB0YWtlbiBmcm9tIHl5dG5hbWUuICBJZiBZWVJFUyBpcworICAgbnVsbCwgZG8gbm90IGNvcHk7IGluc3RlYWQsIHJldHVybiB0aGUgbGVuZ3RoIG9mIHdoYXQgdGhlIHJlc3VsdAorICAgd291bGQgaGF2ZSBiZWVuLiAgKi8KK3N0YXRpYyBZWVNJWkVfVAoreXl0bmFtZXJyIChjaGFyICp5eXJlcywgY29uc3QgY2hhciAqeXlzdHIpCit7CisgIGlmICgqeXlzdHIgPT0gJyInKQorICAgIHsKKyAgICAgIFlZU0laRV9UIHl5biA9IDA7CisgICAgICBjaGFyIGNvbnN0ICp5eXAgPSB5eXN0cjsKKworICAgICAgZm9yICg7OykKKwlzd2l0Y2ggKCorK3l5cCkKKwkgIHsKKwkgIGNhc2UgJ1wnJzoKKwkgIGNhc2UgJywnOgorCSAgICBnb3RvIGRvX25vdF9zdHJpcF9xdW90ZXM7CisKKwkgIGNhc2UgJ1xcJzoKKwkgICAgaWYgKCorK3l5cCAhPSAnXFwnKQorCSAgICAgIGdvdG8gZG9fbm90X3N0cmlwX3F1b3RlczsKKwkgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwkgIGRlZmF1bHQ6CisJICAgIGlmICh5eXJlcykKKwkgICAgICB5eXJlc1t5eW5dID0gKnl5cDsKKwkgICAgeXluKys7CisJICAgIGJyZWFrOworCisJICBjYXNlICciJzoKKwkgICAgaWYgKHl5cmVzKQorCSAgICAgIHl5cmVzW3l5bl0gPSAnXDAnOworCSAgICByZXR1cm4geXluOworCSAgfQorICAgIGRvX25vdF9zdHJpcF9xdW90ZXM6IDsKKyAgICB9CisKKyAgaWYgKCEgeXlyZXMpCisgICAgcmV0dXJuIHl5c3RybGVuICh5eXN0cik7CisKKyAgcmV0dXJuIHl5c3RwY3B5ICh5eXJlcywgeXlzdHIpIC0geXlyZXM7Cit9CisjIGVuZGlmCisKKy8qIENvcHkgaW50byBZWVJFU1VMVCBhbiBlcnJvciBtZXNzYWdlIGFib3V0IHRoZSB1bmV4cGVjdGVkIHRva2VuCisgICBZWUNIQVIgd2hpbGUgaW4gc3RhdGUgWVlTVEFURS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCwKKyAgIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCBieXRlLiAgSWYgWVlSRVNVTFQgaXMgbnVsbCwgZG8gbm90CisgICBjb3B5IGFueXRoaW5nOyBqdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUKKyAgIGNvcGllZC4gIEFzIGEgc3BlY2lhbCBjYXNlLCByZXR1cm4gMCBpZiBhbiBvcmRpbmFyeSAic3ludGF4IGVycm9yIgorICAgbWVzc2FnZSB3aWxsIGRvLiAgUmV0dXJuIFlZU0laRV9NQVhJTVVNIGlmIG92ZXJmbG93IG9jY3VycyBkdXJpbmcKKyAgIHNpemUgY2FsY3VsYXRpb24uICAqLworc3RhdGljIFlZU0laRV9UCit5eXN5bnRheF9lcnJvciAoY2hhciAqeXlyZXN1bHQsIGludCB5eXN0YXRlLCBpbnQgeXljaGFyKQoreworICBpbnQgeXluID0geXlwYWN0W3l5c3RhdGVdOworCisgIGlmICghIChZWVBBQ1RfTklORiA8IHl5biAmJiB5eW4gPD0gWVlMQVNUKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCB5eXR5cGUgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKyAgICAgIFlZU0laRV9UIHl5c2l6ZTAgPSB5eXRuYW1lcnIgKDAsIHl5dG5hbWVbeXl0eXBlXSk7CisgICAgICBZWVNJWkVfVCB5eXNpemUgPSB5eXNpemUwOworICAgICAgWVlTSVpFX1QgeXlzaXplMTsKKyAgICAgIGludCB5eXNpemVfb3ZlcmZsb3cgPSAwOworICAgICAgZW51bSB7IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0gPSA1IH07CisgICAgICBjaGFyIGNvbnN0ICp5eWFyZ1tZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNXTsKKyAgICAgIGludCB5eXg7CisKKyMgaWYgMAorICAgICAgLyogVGhpcyBpcyBzbyB4Z2V0dGV4dCBzZWVzIHRoZSB0cmFuc2xhdGFibGUgZm9ybWF0cyB0aGF0IGFyZQorCSBjb25zdHJ1Y3RlZCBvbiB0aGUgZmx5LiAgKi8KKyAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIik7CisgICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIik7CisgICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIik7CisgICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIik7CisgICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIG9yICVzIik7CisjIGVuZGlmCisgICAgICBjaGFyICp5eWZtdDsKKyAgICAgIGNoYXIgY29uc3QgKnl5ZjsKKyAgICAgIHN0YXRpYyBjaGFyIGNvbnN0IHl5dW5leHBlY3RlZFtdID0gInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcyI7CisgICAgICBzdGF0aWMgY2hhciBjb25zdCB5eWV4cGVjdGluZ1tdID0gIiwgZXhwZWN0aW5nICVzIjsKKyAgICAgIHN0YXRpYyBjaGFyIGNvbnN0IHl5b3JbXSA9ICIgb3IgJXMiOworICAgICAgY2hhciB5eWZvcm1hdFtzaXplb2YgeXl1bmV4cGVjdGVkCisJCSAgICArIHNpemVvZiB5eWV4cGVjdGluZyAtIDEKKwkJICAgICsgKChZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNIC0gMikKKwkJICAgICAgICogKHNpemVvZiB5eW9yIC0gMSkpXTsKKyAgICAgIGNoYXIgY29uc3QgKnl5cHJlZml4ID0geXlleHBlY3Rpbmc7CisKKyAgICAgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KKwkgWVlDSEVDSy4gICovCisgICAgICBpbnQgeXl4YmVnaW4gPSB5eW4gPCAwID8gLXl5biA6IDA7CisKKyAgICAgIC8qIFN0YXkgd2l0aGluIGJvdW5kcyBvZiBib3RoIHl5Y2hlY2sgYW5kIHl5dG5hbWUuICAqLworICAgICAgaW50IHl5Y2hlY2tsaW0gPSBZWUxBU1QgLSB5eW4gKyAxOworICAgICAgaW50IHl5eGVuZCA9IHl5Y2hlY2tsaW0gPCBZWU5UT0tFTlMgPyB5eWNoZWNrbGltIDogWVlOVE9LRU5TOworICAgICAgaW50IHl5Y291bnQgPSAxOworCisgICAgICB5eWFyZ1swXSA9IHl5dG5hbWVbeXl0eXBlXTsKKyAgICAgIHl5Zm10ID0geXlzdHBjcHkgKHl5Zm9ybWF0LCB5eXVuZXhwZWN0ZWQpOworCisgICAgICBmb3IgKHl5eCA9IHl5eGJlZ2luOyB5eXggPCB5eXhlbmQ7ICsreXl4KQorCWlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4ICYmIHl5eCAhPSBZWVRFUlJPUikKKwkgIHsKKwkgICAgaWYgKHl5Y291bnQgPT0gWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSkKKwkgICAgICB7CisJCXl5Y291bnQgPSAxOworCQl5eXNpemUgPSB5eXNpemUwOworCQl5eWZvcm1hdFtzaXplb2YgeXl1bmV4cGVjdGVkIC0gMV0gPSAnXDAnOworCQlicmVhazsKKwkgICAgICB9CisJICAgIHl5YXJnW3l5Y291bnQrK10gPSB5eXRuYW1lW3l5eF07CisJICAgIHl5c2l6ZTEgPSB5eXNpemUgKyB5eXRuYW1lcnIgKDAsIHl5dG5hbWVbeXl4XSk7CisJICAgIHl5c2l6ZV9vdmVyZmxvdyB8PSAoeXlzaXplMSA8IHl5c2l6ZSk7CisJICAgIHl5c2l6ZSA9IHl5c2l6ZTE7CisJICAgIHl5Zm10ID0geXlzdHBjcHkgKHl5Zm10LCB5eXByZWZpeCk7CisJICAgIHl5cHJlZml4ID0geXlvcjsKKwkgIH0KKworICAgICAgeXlmID0gWVlfKHl5Zm9ybWF0KTsKKyAgICAgIHl5c2l6ZTEgPSB5eXNpemUgKyB5eXN0cmxlbiAoeXlmKTsKKyAgICAgIHl5c2l6ZV9vdmVyZmxvdyB8PSAoeXlzaXplMSA8IHl5c2l6ZSk7CisgICAgICB5eXNpemUgPSB5eXNpemUxOworCisgICAgICBpZiAoeXlzaXplX292ZXJmbG93KQorCXJldHVybiBZWVNJWkVfTUFYSU1VTTsKKworICAgICAgaWYgKHl5cmVzdWx0KQorCXsKKwkgIC8qIEF2b2lkIHNwcmludGYsIGFzIHRoYXQgaW5mcmluZ2VzIG9uIHRoZSB1c2VyJ3MgbmFtZSBzcGFjZS4KKwkgICAgIERvbid0IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGV2ZW4gaWYgdGhlIHRyYW5zbGF0aW9uCisJICAgICBwcm9kdWNlZCBhIHN0cmluZyB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgIiVzInMuICAqLworCSAgY2hhciAqeXlwID0geXlyZXN1bHQ7CisJICBpbnQgeXlpID0gMDsKKwkgIHdoaWxlICgoKnl5cCA9ICp5eWYpICE9ICdcMCcpCisJICAgIHsKKwkgICAgICBpZiAoKnl5cCA9PSAnJScgJiYgeXlmWzFdID09ICdzJyAmJiB5eWkgPCB5eWNvdW50KQorCQl7CisJCSAgeXlwICs9IHl5dG5hbWVyciAoeXlwLCB5eWFyZ1t5eWkrK10pOworCQkgIHl5ZiArPSAyOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgeXlwKys7CisJCSAgeXlmKys7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIHJldHVybiB5eXNpemU7CisgICAgfQorfQorI2VuZGlmIC8qIFlZRVJST1JfVkVSQk9TRSAqLworDAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBSZWxlYXNlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB0byB0aGlzIHN5bWJvbC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qQVJHU1VTRUQqLworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyB2b2lkCit5eWRlc3RydWN0IChjb25zdCBjaGFyICp5eW1zZywgaW50IHl5dHlwZSwgWVlTVFlQRSAqeXl2YWx1ZXAsIFRQYXJzZUNvbnRleHQqIGNvbnRleHQpCisjZWxzZQorc3RhdGljIHZvaWQKK3l5ZGVzdHJ1Y3QgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwLCBjb250ZXh0KQorICAgIGNvbnN0IGNoYXIgKnl5bXNnOworICAgIGludCB5eXR5cGU7CisgICAgWVlTVFlQRSAqeXl2YWx1ZXA7CisgICAgVFBhcnNlQ29udGV4dCogY29udGV4dDsKKyNlbmRpZgoreworICBZWVVTRSAoeXl2YWx1ZXApOworICBZWVVTRSAoY29udGV4dCk7CisKKyAgaWYgKCF5eW1zZykKKyAgICB5eW1zZyA9ICJEZWxldGluZyI7CisgIFlZX1NZTUJPTF9QUklOVCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKTsKKworICBzd2l0Y2ggKHl5dHlwZSkKKyAgICB7CisKKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorfQorDAorCisvKiBQcmV2ZW50IHdhcm5pbmdzIGZyb20gLVdtaXNzaW5nLXByb3RvdHlwZXMuICAqLworCisjaWZkZWYgWVlQQVJTRV9QQVJBTQorI2lmIGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworaW50IHl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pOworI2Vsc2UKK2ludCB5eXBhcnNlICgpOworI2VuZGlmCisjZWxzZSAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KKyNpZiBkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKK2ludCB5eXBhcnNlIChUUGFyc2VDb250ZXh0KiBjb250ZXh0KTsKKyNlbHNlCitpbnQgeXlwYXJzZSAoKTsKKyNlbmRpZgorI2VuZGlmIC8qICEgWVlQQVJTRV9QQVJBTSAqLworCisKKworCisKKworLyotLS0tLS0tLS0tLgorfCB5eXBhcnNlLiAgfAorYC0tLS0tLS0tLS0qLworCisjaWZkZWYgWVlQQVJTRV9QQVJBTQorI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK2ludAoreXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSkKKyNlbHNlCitpbnQKK3l5cGFyc2UgKFlZUEFSU0VfUEFSQU0pCisgICAgdm9pZCAqWVlQQVJTRV9QQVJBTTsKKyNlbmRpZgorI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQoraW50Cit5eXBhcnNlIChUUGFyc2VDb250ZXh0KiBjb250ZXh0KQorI2Vsc2UKK2ludAoreXlwYXJzZSAoY29udGV4dCkKKyAgICBUUGFyc2VDb250ZXh0KiBjb250ZXh0OworI2VuZGlmCisjZW5kaWYKK3sKKyAgLyogVGhlIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KK2ludCB5eWNoYXI7CisKKy8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9vay1haGVhZCBzeW1ib2wuICAqLworWVlTVFlQRSB5eWx2YWw7CisKKy8qIE51bWJlciBvZiBzeW50YXggZXJyb3JzIHNvIGZhci4gICovCitpbnQgeXluZXJyczsKKworICBpbnQgeXlzdGF0ZTsKKyAgaW50IHl5bjsKKyAgaW50IHl5cmVzdWx0OworICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KKyAgaW50IHl5ZXJyc3RhdHVzOworICAvKiBMb29rLWFoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLworICBpbnQgeXl0b2tlbiA9IDA7CisjaWYgWVlFUlJPUl9WRVJCT1NFCisgIC8qIEJ1ZmZlciBmb3IgZXJyb3IgbWVzc2FnZXMsIGFuZCBpdHMgYWxsb2NhdGVkIHNpemUuICAqLworICBjaGFyIHl5bXNnYnVmWzEyOF07CisgIGNoYXIgKnl5bXNnID0geXltc2didWY7CisgIFlZU0laRV9UIHl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOworI2VuZGlmCisKKyAgLyogVGhyZWUgc3RhY2tzIGFuZCB0aGVpciB0b29sczoKKyAgICAgYHl5c3MnOiByZWxhdGVkIHRvIHN0YXRlcywKKyAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcywKKyAgICAgYHl5bHMnOiByZWxhdGVkIHRvIGxvY2F0aW9ucy4KKworICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKKyAgICAgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZS4gICovCisKKyAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KKyAgeXl0eXBlX2ludDE2IHl5c3NhW1lZSU5JVERFUFRIXTsKKyAgeXl0eXBlX2ludDE2ICp5eXNzID0geXlzc2E7CisgIHl5dHlwZV9pbnQxNiAqeXlzc3A7CisKKyAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KKyAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07CisgIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsKKyAgWVlTVFlQRSAqeXl2c3A7CisKKworCisjZGVmaW5lIFlZUE9QU1RBQ0soTikgICAoeXl2c3AgLT0gKE4pLCB5eXNzcCAtPSAoTikpCisKKyAgWVlTSVpFX1QgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKKworICAvKiBUaGUgdmFyaWFibGVzIHVzZWQgdG8gcmV0dXJuIHNlbWFudGljIHZhbHVlIGFuZCBsb2NhdGlvbiBmcm9tIHRoZQorICAgICBhY3Rpb24gcm91dGluZXMuICAqLworICBZWVNUWVBFIHl5dmFsOworCisKKyAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIG9uIHRoZSBSSFMgb2YgdGhlIHJlZHVjZWQgcnVsZS4KKyAgICAgS2VlcCB0byB6ZXJvIHdoZW4gbm8gc3ltYm9sIHNob3VsZCBiZSBwb3BwZWQuICAqLworICBpbnQgeXlsZW4gPSAwOworCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7CisKKyAgeXlzdGF0ZSA9IDA7CisgIHl5ZXJyc3RhdHVzID0gMDsKKyAgeXluZXJycyA9IDA7CisgIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLworCisgIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCisgICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjaworICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCisgICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KKworICB5eXNzcCA9IHl5c3M7CisgIHl5dnNwID0geXl2czsKKworICBnb3RvIHl5c2V0c3RhdGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eW5ld3N0YXRlIC0tIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluIHl5c3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyB5eW5ld3N0YXRlOgorICAvKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcworICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuICBTbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KKyAgeXlzc3ArKzsKKworIHl5c2V0c3RhdGU6CisgICp5eXNzcCA9IHl5c3RhdGU7CisKKyAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCisgICAgICBZWVNJWkVfVCB5eXNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOworCisjaWZkZWYgeXlvdmVyZmxvdworICAgICAgeworCS8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byByZWFsbG9jYXRlIHRoZSBzdGFjay4gIFVzZSBjb3BpZXMgb2YKKwkgICB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvCisJICAgbWVtb3J5LiAgKi8KKwlZWVNUWVBFICp5eXZzMSA9IHl5dnM7CisJeXl0eXBlX2ludDE2ICp5eXNzMSA9IHl5c3M7CisKKworCS8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mIHRoZQorCSAgIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgVGhpcyB1c2VkIHRvIGJlIGEKKwkgICBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsIGJ1dCB0aGF0IG1pZ2h0CisJICAgYmUgdW5kZWZpbmVkIGlmIHl5b3ZlcmZsb3cgaXMgYSBtYWNyby4gICovCisJeXlvdmVyZmxvdyAoWVlfKCJtZW1vcnkgZXhoYXVzdGVkIiksCisJCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICAgICZ5eXZzMSwgeXlzaXplICogc2l6ZW9mICgqeXl2c3ApLAorCisJCSAgICAmeXlzdGFja3NpemUpOworCisJeXlzcyA9IHl5c3MxOworCXl5dnMgPSB5eXZzMTsKKyAgICAgIH0KKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKyMgaWZuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKyAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7CisjIGVsc2UKKyAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLworICAgICAgaWYgKFlZTUFYREVQVEggPD0geXlzdGFja3NpemUpCisJZ290byB5eWV4aGF1c3RlZGxhYjsKKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoWVlNQVhERVBUSCA8IHl5c3RhY2tzaXplKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKworICAgICAgeworCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOworCXVuaW9uIHl5YWxsb2MgKnl5cHRyID0KKwkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7CisJaWYgKCEgeXlwdHIpCisJICBnb3RvIHl5ZXhoYXVzdGVkbGFiOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3MpOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnMpOworCisjICB1bmRlZiBZWVNUQUNLX1JFTE9DQVRFCisJaWYgKHl5c3MxICE9IHl5c3NhKQorCSAgWVlTVEFDS19GUkVFICh5eXNzMSk7CisgICAgICB9CisjIGVuZGlmCisjZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLworCisgICAgICB5eXNzcCA9IHl5c3MgKyB5eXNpemUgLSAxOworICAgICAgeXl2c3AgPSB5eXZzICsgeXlzaXplIC0gMTsKKworCisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcgaW50KSB5eXN0YWNrc2l6ZSkpOworCisgICAgICBpZiAoeXlzcyArIHl5c3RhY2tzaXplIC0gMSA8PSB5eXNzcCkKKwlZWUFCT1JUOworICAgIH0KKworICBZWURQUklOVEYgKChzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSkpOworCisgIGdvdG8geXliYWNrdXA7CisKKy8qLS0tLS0tLS0tLS0uCit8IHl5YmFja3VwLiAgfAorYC0tLS0tLS0tLS0tKi8KK3l5YmFja3VwOgorCisgIC8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICBSZWFkIGEKKyAgICAgbG9vay1haGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2stYWhlYWQgdG9rZW4uICAqLworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlQQUNUX05JTkYpCisgICAgZ290byB5eWRlZmF1bHQ7CisKKyAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2stYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogWVlDSEFSIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GIG9yIGEgdmFsaWQgbG9vay1haGVhZCBzeW1ib2wuICAqLworICBpZiAoeXljaGFyID09IFlZRU1QVFkpCisgICAgeworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKSk7CisgICAgICB5eWNoYXIgPSBZWUxFWDsKKyAgICB9CisKKyAgaWYgKHl5Y2hhciA8PSBZWUVPRikKKyAgICB7CisgICAgICB5eWNoYXIgPSB5eXRva2VuID0gWVlFT0Y7CisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKyAgICAgIFlZX1NZTUJPTF9QUklOVCAoIk5leHQgdG9rZW4gaXMiLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKKyAgICB9CisKKyAgLyogSWYgdGhlIHByb3BlciBhY3Rpb24gb24gc2VlaW5nIHRva2VuIFlZVE9LRU4gaXMgdG8gcmVkdWNlIG9yIHRvCisgICAgIGRldGVjdCBhbiBlcnJvciwgdGFrZSB0aGF0IGFjdGlvbi4gICovCisgIHl5biArPSB5eXRva2VuOworICBpZiAoeXluIDwgMCB8fCBZWUxBU1QgPCB5eW4gfHwgeXljaGVja1t5eW5dICE9IHl5dG9rZW4pCisgICAgZ290byB5eWRlZmF1bHQ7CisgIHl5biA9IHl5dGFibGVbeXluXTsKKyAgaWYgKHl5biA8PSAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gMCB8fCB5eW4gPT0gWVlUQUJMRV9OSU5GKQorCWdvdG8geXllcnJsYWI7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIC8qIENvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3IKKyAgICAgc3RhdHVzLiAgKi8KKyAgaWYgKHl5ZXJyc3RhdHVzKQorICAgIHl5ZXJyc3RhdHVzLS07CisKKyAgLyogU2hpZnQgdGhlIGxvb2stYWhlYWQgdG9rZW4uICAqLworICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5dG9rZW4sICZ5eWx2YWwsICZ5eWxsb2MpOworCisgIC8qIERpc2NhcmQgdGhlIHNoaWZ0ZWQgdG9rZW4gdW5sZXNzIGl0IGlzIGVvZi4gICovCisgIGlmICh5eWNoYXIgIT0gWVlFT0YpCisgICAgeXljaGFyID0gWVlFTVBUWTsKKworICB5eXN0YXRlID0geXluOworICAqKyt5eXZzcCA9IHl5bHZhbDsKKworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlkZWZhdWx0IC0tIGRvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlkZWZhdWx0OgorICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJsYWI7CisgIGdvdG8geXlyZWR1Y2U7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlyZWR1Y2UgLS0gRG8gYSByZWR1Y3Rpb24uICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlyZWR1Y2U6CisgIC8qIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCisgIHl5bGVuID0geXlyMlt5eW5dOworCisgIC8qIElmIFlZTEVOIGlzIG5vbnplcm8sIGltcGxlbWVudCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uOgorICAgICBgJCQgPSAkMScuCisKKyAgICAgT3RoZXJ3aXNlLCB0aGUgZm9sbG93aW5nIGxpbmUgc2V0cyBZWVZBTCB0byBnYXJiYWdlLgorICAgICBUaGlzIGJlaGF2aW9yIGlzIHVuZG9jdW1lbnRlZCBhbmQgQmlzb24KKyAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKKyAgICAgdW5jb25kaXRpb25hbGx5IG1ha2VzIHRoZSBwYXJzZXIgYSBiaXQgc21hbGxlciwgYW5kIGl0IGF2b2lkcyBhCisgICAgIEdDQyB3YXJuaW5nIHRoYXQgWVlWQUwgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4gICovCisgIHl5dmFsID0geXl2c3BbMS15eWxlbl07CisKKworICBZWV9SRURVQ0VfUFJJTlQgKHl5bik7CisgIHN3aXRjaCAoeXluKQorICAgIHsKKyAgICAgICAgY2FzZSAyOgorCisgICAgeworICAgICAgICAvLyBUaGUgc3ltYm9sIHRhYmxlIHNlYXJjaCB3YXMgZG9uZSBpbiB0aGUgbGV4aWNhbCBwaGFzZQorICAgICAgICBjb25zdCBUU3ltYm9sKiBzeW1ib2wgPSAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLnN5bWJvbDsKKyAgICAgICAgY29uc3QgVFZhcmlhYmxlKiB2YXJpYWJsZTsKKyAgICAgICAgaWYgKHN5bWJvbCA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUsICJ1bmRlY2xhcmVkIGlkZW50aWZpZXIiLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLnN0cmluZy0+Y19zdHIoKSwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgVFR5cGUgdHlwZShFYnRGbG9hdCwgRWJwVW5kZWZpbmVkKTsKKyAgICAgICAgICAgIFRWYXJpYWJsZSogZmFrZVZhcmlhYmxlID0gbmV3IFRWYXJpYWJsZSgoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLnN0cmluZywgdHlwZSk7CisgICAgICAgICAgICBjb250ZXh0LT5zeW1ib2xUYWJsZS5pbnNlcnQoKmZha2VWYXJpYWJsZSk7CisgICAgICAgICAgICB2YXJpYWJsZSA9IGZha2VWYXJpYWJsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaWRlbnRpZmllciBjYW4gb25seSBiZSBhIHZhcmlhYmxlIHR5cGUgc3ltYm9sCisgICAgICAgICAgICBpZiAoISBzeW1ib2wtPmlzVmFyaWFibGUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSwgInZhcmlhYmxlIGV4cGVjdGVkIiwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5zdHJpbmctPmNfc3RyKCksICIiKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXJpYWJsZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRWYXJpYWJsZSo+KHN5bWJvbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkb24ndCBkZWxldGUgJDEuc3RyaW5nLCBpdCdzIHVzZWQgYnkgZXJyb3IgcmVjb3ZlcnksIGFuZCB0aGUgcG9vbAorICAgICAgICAvLyBwb3Agd2lsbCByZWNsYWltIHRoZSBtZW1vcnkKKworICAgICAgICBpZiAodmFyaWFibGUtPmdldFR5cGUoKS5nZXRRdWFsaWZpZXIoKSA9PSBFdnFDb25zdCApIHsKKyAgICAgICAgICAgIENvbnN0YW50VW5pb24qIGNvbnN0QXJyYXkgPSB2YXJpYWJsZS0+Z2V0Q29uc3RQb2ludGVyKCk7CisgICAgICAgICAgICBUVHlwZSB0KHZhcmlhYmxlLT5nZXRUeXBlKCkpOworICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24oY29uc3RBcnJheSwgdCwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkU3ltYm9sKHZhcmlhYmxlLT5nZXRVbmlxdWVJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS0+Z2V0VHlwZSgpLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDoKKworICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSU5UX1RZUEUgaXMgb25seSAxNi1iaXQgcGx1cyBzaWduIGJpdCBmb3IgdmVydGV4L2ZyYWdtZW50IHNoYWRlcnMsCisgICAgICAgIC8vIGNoZWNrIGZvciBvdmVyZmxvdyBmb3IgY29uc3RhbnRzCisgICAgICAgIC8vCisgICAgICAgIGlmIChhYnMoKHl5dnNwWygxKSAtICgxKV0ubGV4KS5pKSA+PSAoMSA8PCAxNikpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSwgIiBpbnRlZ2VyIGNvbnN0YW50IG92ZXJmbG93IiwgIiIsICIiKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgIHVuaW9uQXJyYXktPnNldElDb25zdCgoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmkpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRJbnQsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1OgorCisgICAgeworICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgIHVuaW9uQXJyYXktPnNldEZDb25zdCgoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmYpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRGbG9hdCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDY6CisKKyAgICB7CisgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgdW5pb25BcnJheS0+c2V0QkNvbnN0KCh5eXZzcFsoMSkgLSAoMSldLmxleCkuYik7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDIpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDk6CisKKyAgICB7CisgICAgICAgIGlmICghKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmlzQXJyYXkoKSAmJiAhKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmlzTWF0cml4KCkgJiYgISh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5pc1ZlY3RvcigpKSB7CisgICAgICAgICAgICBpZiAoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEFzU3ltYm9sTm9kZSgpKQorICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoNCldLmxleCkubGluZSwgIiBsZWZ0IG9mICdbJyBpcyBub3Qgb2YgdHlwZSBhcnJheSwgbWF0cml4LCBvciB2ZWN0b3IgIiwgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEFzU3ltYm9sTm9kZSgpLT5nZXRTeW1ib2woKS5jX3N0cigpLCAiIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygyKSAtICg0KV0ubGV4KS5saW5lLCAiIGxlZnQgb2YgJ1snIGlzIG5vdCBvZiB0eXBlIGFycmF5LCBtYXRyaXgsIG9yIHZlY3RvciAiLCAiZXhwcmVzc2lvbiIsICIiKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKS5nZXRRdWFsaWZpZXIoKSA9PSBFdnFDb25zdCAmJiAoeXl2c3BbKDMpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0UXVhbGlmaWVyKCkgPT0gRXZxQ29uc3QpIHsKKyAgICAgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+aXNBcnJheSgpKSB7IC8vIGNvbnN0YW50IGZvbGRpbmcgZm9yIGFycmF5cworICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmFkZENvbnN0QXJyYXlOb2RlKCh5eXZzcFsoMykgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRBc0NvbnN0YW50VW5pb24oKS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKS0+Z2V0SUNvbnN0KCksICh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDIpIC0gKDQpXS5sZXgpLmxpbmUpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+aXNWZWN0b3IoKSkgeyAgLy8gY29uc3RhbnQgZm9sZGluZyBmb3IgdmVjdG9ycworICAgICAgICAgICAgICAgIFRWZWN0b3JGaWVsZHMgZmllbGRzOworICAgICAgICAgICAgICAgIGZpZWxkcy5udW0gPSAxOworICAgICAgICAgICAgICAgIGZpZWxkcy5vZmZzZXRzWzBdID0gKHl5dnNwWygzKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEFzQ29uc3RhbnRVbmlvbigpLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRJQ29uc3QoKTsgLy8gbmVlZCB0byBkbyBpdCB0aGlzIHdheSBiZWNhdXNlIHYueHkgc2VuZHMgZmllbGRzIGludGVnZXIgYXJyYXkKKyAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5hZGRDb25zdFZlY3Rvck5vZGUoZmllbGRzLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygyKSAtICg0KV0ubGV4KS5saW5lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmlzTWF0cml4KCkpIHsgLy8gY29uc3RhbnQgZm9sZGluZyBmb3IgbWF0cmljZXMKKyAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5hZGRDb25zdE1hdHJpeE5vZGUoKHl5dnNwWygzKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEFzQ29uc3RhbnRVbmlvbigpLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRJQ29uc3QoKSwgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMikgLSAoNCldLmxleCkubGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKHl5dnNwWygzKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFF1YWxpZmllcigpID09IEV2cUNvbnN0KSB7CisgICAgICAgICAgICAgICAgaWYgKCgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+aXNWZWN0b3IoKSB8fCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+aXNNYXRyaXgoKSkgJiYgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKS5nZXROb21pbmFsU2l6ZSgpIDw9ICh5eXZzcFsoMykgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRBc0NvbnN0YW50VW5pb24oKS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKS0+Z2V0SUNvbnN0KCkgJiYgISh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5pc0FycmF5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoNCldLmxleCkubGluZSwgIiIsICJbIiwgImZpZWxkIHNlbGVjdGlvbiBvdXQgb2YgcmFuZ2UgJyVkJyIsICh5eXZzcFsoMykgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRBc0NvbnN0YW50VW5pb24oKS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKS0+Z2V0SUNvbnN0KCkpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0VHlwZSgpLmdldEFycmF5U2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKS5nZXRNYXhBcnJheVNpemUoKSA8PSAoeXl2c3BbKDMpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0QXNDb25zdGFudFVuaW9uKCktPmdldFVuaW9uQXJyYXlQb2ludGVyKCktPmdldElDb25zdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LT5hcnJheVNldE1heFNpemUoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEFzU3ltYm9sTm9kZSgpLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0VHlwZVBvaW50ZXIoKSwgKHl5dnNwWygzKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEFzQ29uc3RhbnRVbmlvbigpLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRJQ29uc3QoKSwgdHJ1ZSwgKHl5dnNwWygyKSAtICg0KV0ubGV4KS5saW5lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlTZXRNYXhTaXplKCh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRBc1N5bWJvbE5vZGUoKSwgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGVQb2ludGVyKCksIDAsIGZhbHNlLCAoeXl2c3BbKDIpIC0gKDQpXS5sZXgpLmxpbmUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICh5eXZzcFsoMykgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRBc0NvbnN0YW50VW5pb24oKS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKS0+Z2V0SUNvbnN0KCkgPj0gKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKS5nZXRBcnJheVNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoNCldLmxleCkubGluZSwgIiIsICJbIiwgImFycmF5IGluZGV4IG91dCBvZiByYW5nZSAnJWQnIiwgKHl5dnNwWygzKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEFzQ29uc3RhbnRVbmlvbigpLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpLT5nZXRJQ29uc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRJbmRleChFT3BJbmRleERpcmVjdCwgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMykgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDIpIC0gKDQpXS5sZXgpLmxpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5pc0FycmF5KCkgJiYgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKS5nZXRBcnJheVNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoNCldLmxleCkubGluZSwgIiIsICJbIiwgImFycmF5IG11c3QgYmUgcmVkZWNsYXJlZCB3aXRoIGEgc2l6ZSBiZWZvcmUgYmVpbmcgaW5kZXhlZCB3aXRoIGEgdmFyaWFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRJbmRleChFT3BJbmRleEluZGlyZWN0LCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygzKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMikgLSAoNCldLmxleCkubGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9PSAwKSB7CisgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRGQ29uc3QoMC4wZik7CisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRGbG9hdCwgRWJwSGlnaCwgRXZxQ29uc3QpLCAoeXl2c3BbKDIpIC0gKDQpXS5sZXgpLmxpbmUpOworICAgICAgICB9IGVsc2UgaWYgKCh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0VHlwZSgpLmdldFN0cnVjdCgpKQorICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+c2V0VHlwZShUVHlwZSgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0VHlwZSgpLmdldFN0cnVjdCgpLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0VHlwZSgpLmdldFR5cGVOYW1lKCkpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPnNldFR5cGUoVFR5cGUoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEJhc2ljVHlwZSgpLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0UHJlY2lzaW9uKCksIEV2cVRlbXBvcmFyeSwgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldE5vbWluYWxTaXplKCksICh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5pc01hdHJpeCgpKSk7CisKKyAgICAgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0VHlwZSgpLmdldFF1YWxpZmllcigpID09IEV2cUNvbnN0KQorICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0VHlwZVBvaW50ZXIoKS0+c2V0UXVhbGlmaWVyKEV2cUNvbnN0KTsKKyAgICAgICAgfSBlbHNlIGlmICgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+aXNNYXRyaXgoKSAmJiAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0VHlwZSgpLmdldFF1YWxpZmllcigpID09IEV2cUNvbnN0KQorICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5zZXRUeXBlKFRUeXBlKCh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRCYXNpY1R5cGUoKSwgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFByZWNpc2lvbigpLCBFdnFDb25zdCwgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldE5vbWluYWxTaXplKCkpKTsKKyAgICAgICAgZWxzZSBpZiAoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmlzTWF0cml4KCkpCisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPnNldFR5cGUoVFR5cGUoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEJhc2ljVHlwZSgpLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0UHJlY2lzaW9uKCksIEV2cVRlbXBvcmFyeSwgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldE5vbWluYWxTaXplKCkpKTsKKyAgICAgICAgZWxzZSBpZiAoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmlzVmVjdG9yKCkgJiYgKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKS5nZXRRdWFsaWZpZXIoKSA9PSBFdnFDb25zdCkKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+c2V0VHlwZShUVHlwZSgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0QmFzaWNUeXBlKCksICh5eXZzcFsoMSkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRQcmVjaXNpb24oKSwgRXZxQ29uc3QpKTsKKyAgICAgICAgZWxzZSBpZiAoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmlzVmVjdG9yKCkpCisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPnNldFR5cGUoVFR5cGUoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEJhc2ljVHlwZSgpLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0UHJlY2lzaW9uKCksIEV2cVRlbXBvcmFyeSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPnNldFR5cGUoKHl5dnNwWygxKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTE6CisKKyAgICB7CisgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+aXNBcnJheSgpKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDMpIC0gKDMpXS5sZXgpLmxpbmUsICJjYW5ub3QgYXBwbHkgZG90IG9wZXJhdG9yIHRvIGFuIGFycmF5IiwgIi4iLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmlzVmVjdG9yKCkpIHsKKyAgICAgICAgICAgIFRWZWN0b3JGaWVsZHMgZmllbGRzOworICAgICAgICAgICAgaWYgKCEgY29udGV4dC0+cGFyc2VWZWN0b3JGaWVsZHMoKih5eXZzcFsoMykgLSAoMyldLmxleCkuc3RyaW5nLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Tm9taW5hbFNpemUoKSwgZmllbGRzLCAoeXl2c3BbKDMpIC0gKDMpXS5sZXgpLmxpbmUpKSB7CisgICAgICAgICAgICAgICAgZmllbGRzLm51bSA9IDE7CisgICAgICAgICAgICAgICAgZmllbGRzLm9mZnNldHNbMF0gPSAwOworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRUeXBlKCkuZ2V0UXVhbGlmaWVyKCkgPT0gRXZxQ29uc3QpIHsgLy8gY29uc3RhbnQgZm9sZGluZyBmb3IgdmVjdG9yIGZpZWxkcworICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmFkZENvbnN0VmVjdG9yTm9kZShmaWVsZHMsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICAgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+c2V0VHlwZShUVHlwZSgoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0QmFzaWNUeXBlKCksICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRQcmVjaXNpb24oKSwgRXZxQ29uc3QsIChpbnQpICgqKHl5dnNwWygzKSAtICgzKV0ubGV4KS5zdHJpbmcpLnNpemUoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRzLm51bSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0SUNvbnN0KGZpZWxkcy5vZmZzZXRzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgVEludGVybVR5cGVkKiBpbmRleCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEludCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICh5eXZzcFsoMykgLSAoMyldLmxleCkubGluZSk7CisgICAgICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRJbmRleChFT3BJbmRleERpcmVjdCwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksIGluZGV4LCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPnNldFR5cGUoVFR5cGUoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEJhc2ljVHlwZSgpLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0UHJlY2lzaW9uKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBUU3RyaW5nIHZlY3RvclN0cmluZyA9ICooeXl2c3BbKDMpIC0gKDMpXS5sZXgpLnN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgVEludGVybVR5cGVkKiBpbmRleCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRTd2l6emxlKGZpZWxkcywgKHl5dnNwWygzKSAtICgzKV0ubGV4KS5saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEluZGV4KEVPcFZlY3RvclN3aXp6bGUsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCBpbmRleCwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5zZXRUeXBlKFRUeXBlKCh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRCYXNpY1R5cGUoKSwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFByZWNpc2lvbigpLCBFdnFUZW1wb3JhcnksIChpbnQpIHZlY3RvclN0cmluZy5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmlzTWF0cml4KCkpIHsKKyAgICAgICAgICAgIFRNYXRyaXhGaWVsZHMgZmllbGRzOworICAgICAgICAgICAgaWYgKCEgY29udGV4dC0+cGFyc2VNYXRyaXhGaWVsZHMoKih5eXZzcFsoMykgLSAoMyldLmxleCkuc3RyaW5nLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Tm9taW5hbFNpemUoKSwgZmllbGRzLCAoeXl2c3BbKDMpIC0gKDMpXS5sZXgpLmxpbmUpKSB7CisgICAgICAgICAgICAgICAgZmllbGRzLndob2xlUm93ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZmllbGRzLndob2xlQ29sID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZmllbGRzLnJvdyA9IDA7CisgICAgICAgICAgICAgICAgZmllbGRzLmNvbCA9IDA7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmllbGRzLndob2xlUm93IHx8IGZpZWxkcy53aG9sZUNvbCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgIiBub24tc2NhbGFyIGZpZWxkcyBub3QgaW1wbGVtZW50ZWQgeWV0IiwgIi4iLCAiIik7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRJQ29uc3QoMCk7CisgICAgICAgICAgICAgICAgVEludGVybVR5cGVkKiBpbmRleCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEludCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICh5eXZzcFsoMykgLSAoMyldLmxleCkubGluZSk7CisgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEluZGV4KEVPcEluZGV4RGlyZWN0LCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgaW5kZXgsICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSk7CisgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5zZXRUeXBlKFRUeXBlKCh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRCYXNpY1R5cGUoKSwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFByZWNpc2lvbigpLEV2cVRlbXBvcmFyeSwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldE5vbWluYWxTaXplKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICAgICAgICAgIHVuaW9uQXJyYXktPnNldElDb25zdChmaWVsZHMuY29sICogKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldE5vbWluYWxTaXplKCkgKyBmaWVsZHMucm93KTsKKyAgICAgICAgICAgICAgICBUSW50ZXJtVHlwZWQqIGluZGV4ID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgVFR5cGUoRWJ0SW50LCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSwgKHl5dnNwWygzKSAtICgzKV0ubGV4KS5saW5lKTsKKyAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkSW5kZXgoRU9wSW5kZXhEaXJlY3QsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCBpbmRleCwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lKTsKKyAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPnNldFR5cGUoVFR5cGUoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEJhc2ljVHlwZSgpLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0UHJlY2lzaW9uKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0QmFzaWNUeXBlKCkgPT0gRWJ0U3RydWN0KSB7CisgICAgICAgICAgICBib29sIGZpZWxkRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnN0IFRUeXBlTGlzdCogZmllbGRzID0gKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKS5nZXRTdHJ1Y3QoKTsKKyAgICAgICAgICAgIGlmIChmaWVsZHMgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgInN0cnVjdHVyZSBoYXMgbm8gZmllbGRzIiwgIkludGVybmFsIEVycm9yIiwgIiIpOworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpZWxkcy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgqZmllbGRzKVtpXS50eXBlLT5nZXRGaWVsZE5hbWUoKSA9PSAqKHl5dnNwWygzKSAtICgzKV0ubGV4KS5zdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkRm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRUeXBlKCkuZ2V0UXVhbGlmaWVyKCkgPT0gRXZxQ29uc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmFkZENvbnN0U3RydWN0KCooeXl2c3BbKDMpIC0gKDMpXS5sZXgpLnN0cmluZywgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPnNldFR5cGUoKigqZmllbGRzKVtpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHF1YWxpZmllciBvZiB0aGUgcmV0dXJuIHR5cGUsIG5vdCBvZiB0aGUgc3RydWN0dXJlIGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGlzIHNoYXJlZCBiZXR3ZWVuIHZhcmlvdXMgc3RydWN0dXJlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGVQb2ludGVyKCktPnNldFF1YWxpZmllcihFdnFDb25zdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRJQ29uc3QoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBUSW50ZXJtVHlwZWQqIGluZGV4ID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgKigqZmllbGRzKVtpXS50eXBlLCAoeXl2c3BbKDMpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEluZGV4KEVPcEluZGV4RGlyZWN0U3RydWN0LCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgaW5kZXgsICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPnNldFR5cGUoKigqZmllbGRzKVtpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgIiBubyBzdWNoIGZpZWxkIGluIHN0cnVjdHVyZSIsICh5eXZzcFsoMykgLSAoMyldLmxleCkuc3RyaW5nLT5jX3N0cigpLCAiIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCAiIGZpZWxkIHNlbGVjdGlvbiByZXF1aXJlcyBzdHJ1Y3R1cmUsIHZlY3Rvciwgb3IgbWF0cml4IG9uIGxlZnQgaGFuZCBzaWRlIiwgKHl5dnNwWygzKSAtICgzKV0ubGV4KS5zdHJpbmctPmNfc3RyKCksICIiKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgICAgICB9CisgICAgICAgIC8vIGRvbid0IGRlbGV0ZSAkMy5zdHJpbmcsIGl0J3MgZnJvbSB0aGUgcG9vbAorICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjoKKworICAgIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPmxWYWx1ZUVycm9yQ2hlY2soKHl5dnNwWygyKSAtICgyKV0ubGV4KS5saW5lLCAiKysiLCAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRVbmFyeU1hdGgoRU9wUG9zdEluY3JlbWVudCwgKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMikgLSAoMildLmxleCkubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICBpZiAoKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnVuYXJ5T3BFcnJvcigoeXl2c3BbKDIpIC0gKDIpXS5sZXgpLmxpbmUsICIrKyIsICh5eXZzcFsoMSkgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEzOgorCisgICAgeworICAgICAgICBpZiAoY29udGV4dC0+bFZhbHVlRXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDIpXS5sZXgpLmxpbmUsICItLSIsICh5eXZzcFsoMSkgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFVuYXJ5TWF0aChFT3BQb3N0RGVjcmVtZW50LCAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygyKSAtICgyKV0ubGV4KS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+dW5hcnlPcEVycm9yKCh5eXZzcFsoMikgLSAoMildLmxleCkubGluZSwgIi0tIiwgKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTQ6CisKKyAgICB7CisgICAgICAgIGlmIChjb250ZXh0LT5pbnRlZ2VyRXJyb3JDaGVjaygoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgIltdIikpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNToKKworICAgIHsKKyAgICAgICAgVEZ1bmN0aW9uKiBmbkNhbGwgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLmZ1bmN0aW9uOworICAgICAgICBUT3BlcmF0b3Igb3AgPSBmbkNhbGwtPmdldEJ1aWx0SW5PcCgpOworCisgICAgICAgIGlmIChvcCAhPSBFT3BOdWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlbiB0aGlzIHNob3VsZCBiZSBhIGNvbnN0cnVjdG9yLgorICAgICAgICAgICAgLy8gRG9uJ3QgZ28gdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGZvciBjb25zdHJ1Y3RvcnMuCisgICAgICAgICAgICAvLyBUaGVpciBwYXJhbWV0ZXJzIHdpbGwgYmUgdmVyaWZpZWQgYWxnb3JpdGhtaWNhbGx5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFRUeXBlIHR5cGUoRWJ0Vm9pZCwgRWJwVW5kZWZpbmVkKTsgIC8vIHVzZSB0aGlzIHRvIGdldCB0aGUgdHlwZSBiYWNrCisgICAgICAgICAgICBpZiAoY29udGV4dC0+Y29uc3RydWN0b3JFcnJvckNoZWNrKCh5eXZzcFsoMSkgLSAoMSldLmludGVybSkubGluZSwgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5pbnRlcm1Ob2RlLCAqZm5DYWxsLCBvcCwgJnR5cGUpKSB7CisgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBJdCdzIGEgY29uc3RydWN0b3IsIG9mIHR5cGUgJ3R5cGUnLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+YWRkQ29uc3RydWN0b3IoKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5pbnRlcm1Ob2RlLCAmdHlwZSwgb3AsIGZuQ2FsbCwgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5saW5lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5zZXRBZ2dyZWdhdGVPcGVyYXRvcigwLCBvcCwgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5saW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+c2V0VHlwZSh0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBOb3QgYSBjb25zdHJ1Y3Rvci4gIEZpbmQgaXQgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjb25zdCBURnVuY3Rpb24qIGZuQ2FuZGlkYXRlOworICAgICAgICAgICAgYm9vbCBidWlsdEluOworICAgICAgICAgICAgZm5DYW5kaWRhdGUgPSBjb250ZXh0LT5maW5kRnVuY3Rpb24oKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5saW5lLCBmbkNhbGwsICZidWlsdEluKTsKKyAgICAgICAgICAgIGlmIChmbkNhbmRpZGF0ZSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQSBkZWNsYXJlZCBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmIChidWlsdEluICYmICFmbkNhbmRpZGF0ZS0+Z2V0RXh0ZW5zaW9uKCkuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5leHRlbnNpb25FcnJvckNoZWNrKCh5eXZzcFsoMSkgLSAoMSldLmludGVybSkubGluZSwgZm5DYW5kaWRhdGUtPmdldEV4dGVuc2lvbigpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gZm5DYW5kaWRhdGUtPmdldEJ1aWx0SW5PcCgpOworICAgICAgICAgICAgICAgIGlmIChidWlsdEluICYmIG9wICE9IEVPcE51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gQSBmdW5jdGlvbiBjYWxsIG1hcHBlZCB0byBhIGJ1aWx0LWluIG9wZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZuQ2FuZGlkYXRlLT5nZXRQYXJhbUNvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyZWF0IGl0IGxpa2UgYSBidWlsdC1pbiB1bmFyeSBvcGVyYXRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkVW5hcnlNYXRoKG9wLCAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLmludGVybU5vZGUsIDAsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLmludGVybU5vZGUtPmdldExpbmUoKSwgIiB3cm9uZyBvcGVyYW5kIHR5cGUiLCAiSW50ZXJuYWwgRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVpbHQgaW4gdW5hcnkgb3BlcmF0b3IgZnVuY3Rpb24uICBUeXBlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFRJbnRlcm1UeXBlZCo+KCh5eXZzcFsoMSkgLSAoMSldLmludGVybSkuaW50ZXJtTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVlFUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5zZXRBZ2dyZWdhdGVPcGVyYXRvcigoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLmludGVybUFnZ3JlZ2F0ZSwgb3AsICh5eXZzcFsoMSkgLSAoMSldLmludGVybSkubGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVhbCBmdW5jdGlvbiBjYWxsCisKKyAgICAgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLnNldEFnZ3JlZ2F0ZU9wZXJhdG9yKCh5eXZzcFsoMSkgLSAoMSldLmludGVybSkuaW50ZXJtQWdncmVnYXRlLCBFT3BGdW5jdGlvbkNhbGwsICh5eXZzcFsoMSkgLSAoMSldLmludGVybSkubGluZSk7CisgICAgICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+c2V0VHlwZShmbkNhbmRpZGF0ZS0+Z2V0UmV0dXJuVHlwZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGhvdyB3ZSBrbm93IHdoZXRoZXIgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIGEgYnVpbHRJbiBmdW5jdGlvbiBvciBhIHVzZXIgZGVmaW5lZCBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBpZiBidWlsdEluID09IGZhbHNlLCBpdCdzIGEgdXNlckRlZmluZWQgLT4gY291bGQgYmUgYW4gb3ZlcmxvYWRlZCBidWlsdEluIGZ1bmN0aW9uIGFsc28KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYnVpbHRJbiA9PSB0cnVlLCBpdCdzIGRlZmluaXRlbHkgYSBidWlsdEluIGZ1bmN0aW9uIHdpdGggRU9wTnVsbAorICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1aWx0SW4pCisgICAgICAgICAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEFzQWdncmVnYXRlKCktPnNldFVzZXJEZWZpbmVkKCk7CisgICAgICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0QXNBZ2dyZWdhdGUoKS0+c2V0TmFtZShmbkNhbmRpZGF0ZS0+Z2V0TWFuZ2xlZE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgVFF1YWxpZmllciBxdWFsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZuQ2FuZGlkYXRlLT5nZXRQYXJhbUNvdW50KCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcXVhbCA9IGZuQ2FuZGlkYXRlLT5nZXRQYXJhbShpKS50eXBlLT5nZXRRdWFsaWZpZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWFsID09IEV2cU91dCB8fCBxdWFsID09IEV2cUluT3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQtPmxWYWx1ZUVycm9yQ2hlY2soKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRMaW5lKCksICJhc3NpZ24iLCAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldEFzQWdncmVnYXRlKCktPmdldFNlcXVlbmNlKClbaV0tPmdldEFzVHlwZWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5pbnRlcm1Ob2RlLT5nZXRMaW5lKCksICJDb25zdGFudCB2YWx1ZSBjYW5ub3QgYmUgcGFzc2VkIGZvciAnb3V0JyBvciAnaW5vdXQnIHBhcmFtZXRlcnMuIiwgIkVycm9yIiwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+c2V0VHlwZShmbkNhbmRpZGF0ZS0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSB3YXMgcHV0IG91dCBieSBQYUZpbmRGdW5jdGlvbigpCisgICAgICAgICAgICAgICAgLy8gUHV0IG9uIGEgZHVtbXkgbm9kZSBmb3IgZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0RkNvbnN0KDAuMGYpOworICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEZsb2F0LCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSwgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5saW5lKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGZuQ2FsbDsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTY6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0pID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTc6CisKKyAgICB7CisgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMykgLSAoMyldLmludGVybSkubGluZSwgIm1ldGhvZHMgYXJlIG5vdCBzdXBwb3J0ZWQiLCAiIiwgIiIpOworICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICh5eXZhbC5pbnRlcm0pID0gKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTg6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0pID0gKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtKTsKKyAgICAgICAgKHl5dmFsLmludGVybSkubGluZSA9ICh5eXZzcFsoMikgLSAoMildLmxleCkubGluZTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTk6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0pID0gKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtKTsKKyAgICAgICAgKHl5dmFsLmludGVybSkubGluZSA9ICh5eXZzcFsoMikgLSAoMildLmxleCkubGluZTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjA6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0pLmZ1bmN0aW9uID0gKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmZ1bmN0aW9uKTsKKyAgICAgICAgKHl5dmFsLmludGVybSkuaW50ZXJtTm9kZSA9IDA7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDIxOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtKS5mdW5jdGlvbiA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5mdW5jdGlvbik7CisgICAgICAgICh5eXZhbC5pbnRlcm0pLmludGVybU5vZGUgPSAwOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMjoKKworICAgIHsKKyAgICAgICAgVFBhcmFtZXRlciBwYXJhbSA9IHsgMCwgbmV3IFRUeXBlKCh5eXZzcFsoMikgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRUeXBlKCkpIH07CisgICAgICAgICh5eXZzcFsoMSkgLSAoMildLmludGVybS5mdW5jdGlvbiktPmFkZFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0pLmZ1bmN0aW9uID0gKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmZ1bmN0aW9uKTsKKyAgICAgICAgKHl5dmFsLmludGVybSkuaW50ZXJtTm9kZSA9ICh5eXZzcFsoMikgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMzoKKworICAgIHsKKyAgICAgICAgVFBhcmFtZXRlciBwYXJhbSA9IHsgMCwgbmV3IFRUeXBlKCh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRUeXBlKCkpIH07CisgICAgICAgICh5eXZzcFsoMSkgLSAoMyldLmludGVybSkuZnVuY3Rpb24tPmFkZFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0pLmZ1bmN0aW9uID0gKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtKS5mdW5jdGlvbjsKKyAgICAgICAgKHl5dmFsLmludGVybSkuaW50ZXJtTm9kZSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5ncm93QWdncmVnYXRlKCh5eXZzcFsoMSkgLSAoMyldLmludGVybSkuaW50ZXJtTm9kZSwgKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDI0OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmZ1bmN0aW9uKSA9ICh5eXZzcFsoMSkgLSAoMildLmludGVybS5mdW5jdGlvbik7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDI1OgorCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLworICAgICAgICBpZiAoKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpLmFycmF5KSB7CisgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvcnMgZm9yIGFycmF5cyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkubGluZSwgImNhbm5vdCBjb25zdHJ1Y3QgdGhpcyB0eXBlIiwgImFycmF5IiwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpLnNldEFycmF5KGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIFRPcGVyYXRvciBvcCA9IEVPcE51bGw7CisgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkudXNlckRlZikgeworICAgICAgICAgICAgb3AgPSBFT3BDb25zdHJ1Y3RTdHJ1Y3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKCh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKS50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEVidEZsb2F0OgorICAgICAgICAgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkubWF0cml4KSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCgoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkuc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gRU9wQ29uc3RydWN0TWF0MjsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gRU9wQ29uc3RydWN0TWF0MzsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gRU9wQ29uc3RydWN0TWF0NDsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKS5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBFT3BDb25zdHJ1Y3RGbG9hdDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBFT3BDb25zdHJ1Y3RWZWMyOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBFT3BDb25zdHJ1Y3RWZWMzOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBFT3BDb25zdHJ1Y3RWZWM0OyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVidEludDoKKyAgICAgICAgICAgICAgICBzd2l0Y2goKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpLnNpemUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IEVPcENvbnN0cnVjdEludDsgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6ICAgICAgIEZSQUdfVkVSVF9PTkxZKCJpdmVjMiIsICh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKS5saW5lKTsgb3AgPSBFT3BDb25zdHJ1Y3RJVmVjMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiAgICAgICBGUkFHX1ZFUlRfT05MWSgiaXZlYzMiLCAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkubGluZSk7IG9wID0gRU9wQ29uc3RydWN0SVZlYzM7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogICAgICAgRlJBR19WRVJUX09OTFkoIml2ZWM0IiwgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpLmxpbmUpOyBvcCA9IEVPcENvbnN0cnVjdElWZWM0OyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVidEJvb2w6CisgICAgICAgICAgICAgICAgc3dpdGNoKCh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKS5zaXplKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBFT3BDb25zdHJ1Y3RCb29sOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAgICAgICBGUkFHX1ZFUlRfT05MWSgiYnZlYzIiLCAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkubGluZSk7IG9wID0gRU9wQ29uc3RydWN0QlZlYzI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogICAgICAgRlJBR19WRVJUX09OTFkoImJ2ZWMzIiwgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpLmxpbmUpOyBvcCA9IEVPcENvbnN0cnVjdEJWZWMzOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICAgIEZSQUdfVkVSVF9PTkxZKCJidmVjNCIsICh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKS5saW5lKTsgb3AgPSBFT3BDb25zdHJ1Y3RCVmVjNDsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3AgPT0gRU9wTnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKS5saW5lLCAiY2Fubm90IGNvbnN0cnVjdCB0aGlzIHR5cGUiLCBnZXRCYXNpY1N0cmluZygoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkudHlwZSksICIiKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAgICAgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpLnR5cGUgPSBFYnRGbG9hdDsKKyAgICAgICAgICAgICAgICBvcCA9IEVPcENvbnN0cnVjdEZsb2F0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFRTdHJpbmcgdGVtcFN0cmluZzsKKyAgICAgICAgVFR5cGUgdHlwZSgoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkpOworICAgICAgICBURnVuY3Rpb24gKmZ1bmN0aW9uID0gbmV3IFRGdW5jdGlvbigmdGVtcFN0cmluZywgdHlwZSwgb3ApOworICAgICAgICAoeXl2YWwuaW50ZXJtLmZ1bmN0aW9uKSA9IGZ1bmN0aW9uOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNjoKKworICAgIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPnJlc2VydmVkRXJyb3JDaGVjaygoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUsICooeXl2c3BbKDEpIC0gKDEpXS5sZXgpLnN0cmluZykpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIFRUeXBlIHR5cGUoRWJ0Vm9pZCwgRWJwVW5kZWZpbmVkKTsKKyAgICAgICAgVEZ1bmN0aW9uICpmdW5jdGlvbiA9IG5ldyBURnVuY3Rpb24oKHl5dnNwWygxKSAtICgxKV0ubGV4KS5zdHJpbmcsIHR5cGUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmZ1bmN0aW9uKSA9IGZ1bmN0aW9uOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNzoKKworICAgIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPnJlc2VydmVkRXJyb3JDaGVjaygoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUsICooeXl2c3BbKDEpIC0gKDEpXS5sZXgpLnN0cmluZykpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIFRUeXBlIHR5cGUoRWJ0Vm9pZCwgRWJwVW5kZWZpbmVkKTsKKyAgICAgICAgVEZ1bmN0aW9uICpmdW5jdGlvbiA9IG5ldyBURnVuY3Rpb24oKHl5dnNwWygxKSAtICgxKV0ubGV4KS5zdHJpbmcsIHR5cGUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmZ1bmN0aW9uKSA9IGZ1bmN0aW9uOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyODoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDI5OgorCisgICAgeworICAgICAgICBpZiAoY29udGV4dC0+bFZhbHVlRXJyb3JDaGVjaygoeXl2c3BbKDEpIC0gKDIpXS5sZXgpLmxpbmUsICIrKyIsICh5eXZzcFsoMikgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFVuYXJ5TWF0aChFT3BQcmVJbmNyZW1lbnQsICh5eXZzcFsoMikgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDEpIC0gKDIpXS5sZXgpLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT51bmFyeU9wRXJyb3IoKHl5dnNwWygxKSAtICgyKV0ubGV4KS5saW5lLCAiKysiLCAoeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICAgICAgfQorICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMDoKKworICAgIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPmxWYWx1ZUVycm9yQ2hlY2soKHl5dnNwWygxKSAtICgyKV0ubGV4KS5saW5lLCAiLS0iLCAoeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRVbmFyeU1hdGgoRU9wUHJlRGVjcmVtZW50LCAoeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygxKSAtICgyKV0ubGV4KS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+dW5hcnlPcEVycm9yKCh5eXZzcFsoMSkgLSAoMildLmxleCkubGluZSwgIi0tIiwgKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzE6CisKKyAgICB7CisgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0pLm9wICE9IEVPcE51bGwpIHsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRVbmFyeU1hdGgoKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtKS5vcCwgKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMSkgLSAoMildLmludGVybSkubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICAgICAgaWYgKCh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXJyb3JPcCA9ICIiOworICAgICAgICAgICAgICAgIHN3aXRjaCgoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0pLm9wKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFT3BOZWdhdGl2ZTogICBlcnJvck9wID0gIi0iOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVPcExvZ2ljYWxOb3Q6IGVycm9yT3AgPSAiISI7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250ZXh0LT51bmFyeU9wRXJyb3IoKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtKS5saW5lLCBlcnJvck9wLCAoeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMikgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMikgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMjoKKworICAgIHsgKHl5dmFsLmludGVybSkubGluZSA9ICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZTsgKHl5dmFsLmludGVybSkub3AgPSBFT3BOdWxsOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzM6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0pLmxpbmUgPSAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmU7ICh5eXZhbC5pbnRlcm0pLm9wID0gRU9wTmVnYXRpdmU7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNDoKKworICAgIHsgKHl5dmFsLmludGVybSkubGluZSA9ICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZTsgKHl5dmFsLmludGVybSkub3AgPSBFT3BMb2dpY2FsTm90OyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzU6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzY6CisKKyAgICB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCIqIiwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lKTsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEJpbmFyeU1hdGgoRU9wTXVsLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICBpZiAoKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCAiKiIsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICAgICAgfQorICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNzoKKworICAgIHsKKyAgICAgICAgRlJBR19WRVJUX09OTFkoIi8iLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BEaXYsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YmluYXJ5T3BFcnJvcigoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsICIvIiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDM4OgorCisgICAgeyAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDM5OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BBZGQsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YmluYXJ5T3BFcnJvcigoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsICIrIiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDQwOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BTdWIsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YmluYXJ5T3BFcnJvcigoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsICItIiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDQxOgorCisgICAgeyAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDQyOgorCisgICAgeyAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDQzOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BMZXNzVGhhbiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgIjwiLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0QkNvbnN0KGZhbHNlKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDQ0OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BHcmVhdGVyVGhhbiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgIj4iLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0QkNvbnN0KGZhbHNlKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDQ1OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BMZXNzVGhhbkVxdWFsLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICBpZiAoKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCAiPD0iLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0QkNvbnN0KGZhbHNlKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDQ2OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BHcmVhdGVyVGhhbkVxdWFsLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUpOworICAgICAgICBpZiAoKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCAiPj0iLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheSA9IG5ldyBDb25zdGFudFVuaW9uWzFdOworICAgICAgICAgICAgdW5pb25BcnJheS0+c2V0QkNvbnN0KGZhbHNlKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRDb25zdGFudFVuaW9uKHVuaW9uQXJyYXksIFRUeXBlKEVidEJvb2wsIEVicFVuZGVmaW5lZCwgRXZxQ29uc3QpLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDQ3OgorCisgICAgeyAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDQ4OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQmluYXJ5TWF0aChFT3BFcXVhbCwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgIj09IiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgIHVuaW9uQXJyYXktPnNldEJDb25zdChmYWxzZSk7CisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRCb29sLCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lKTsKKyAgICAgICAgfQorICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0OToKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEJpbmFyeU1hdGgoRU9wTm90RXF1YWwsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YmluYXJ5T3BFcnJvcigoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsICIhPSIsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRCQ29uc3QoZmFsc2UpOworICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgVFR5cGUoRWJ0Qm9vbCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTA6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTE6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTI6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTM6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTQ6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRCaW5hcnlNYXRoKEVPcExvZ2ljYWxBbmQsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YmluYXJ5T3BFcnJvcigoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsICImJiIsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRCQ29uc3QoZmFsc2UpOworICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgVFR5cGUoRWJ0Qm9vbCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTU6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTY6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRCaW5hcnlNYXRoKEVPcExvZ2ljYWxYb3IsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCBjb250ZXh0LT5zeW1ib2xUYWJsZSk7CisgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPT0gMCkgeworICAgICAgICAgICAgY29udGV4dC0+YmluYXJ5T3BFcnJvcigoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsICJeXiIsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICBDb25zdGFudFVuaW9uICp1bmlvbkFycmF5ID0gbmV3IENvbnN0YW50VW5pb25bMV07CisgICAgICAgICAgICB1bmlvbkFycmF5LT5zZXRCQ29uc3QoZmFsc2UpOworICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZENvbnN0YW50VW5pb24odW5pb25BcnJheSwgVFR5cGUoRWJ0Qm9vbCwgRWJwVW5kZWZpbmVkLCBFdnFDb25zdCksICh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTc6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTg6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRCaW5hcnlNYXRoKEVPcExvZ2ljYWxPciwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlKTsKKyAgICAgICAgaWYgKCh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5hcnlPcEVycm9yKCh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgInx8IiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXkgPSBuZXcgQ29uc3RhbnRVbmlvblsxXTsKKyAgICAgICAgICAgIHVuaW9uQXJyYXktPnNldEJDb25zdChmYWxzZSk7CisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29uc3RhbnRVbmlvbih1bmlvbkFycmF5LCBUVHlwZShFYnRCb29sLCBFYnBVbmRlZmluZWQsIEV2cUNvbnN0KSwgKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lKTsKKyAgICAgICAgfQorICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1OToKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MDoKKworICAgIHsKKyAgICAgICBpZiAoY29udGV4dC0+Ym9vbEVycm9yQ2hlY2soKHl5dnNwWygyKSAtICg1KV0ubGV4KS5saW5lLCAoeXl2c3BbKDEpIC0gKDUpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFNlbGVjdGlvbigoeXl2c3BbKDEpIC0gKDUpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygzKSAtICg1KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoNSkgLSAoNSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDIpIC0gKDUpXS5sZXgpLmxpbmUpOworICAgICAgICBpZiAoKHl5dnNwWygzKSAtICg1KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKSAhPSAoeXl2c3BbKDUpIC0gKDUpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0VHlwZSgpKQorICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gMDsKKworICAgICAgICBpZiAoKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoKHl5dnNwWygyKSAtICg1KV0ubGV4KS5saW5lLCAiOiIsICh5eXZzcFsoMykgLSAoNSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpLCAoeXl2c3BbKDUpIC0gKDUpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDUpIC0gKDUpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICAgICAgfQorICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MToKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MjoKKworICAgIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPmxWYWx1ZUVycm9yQ2hlY2soKHl5dnNwWygyKSAtICgzKV0uaW50ZXJtKS5saW5lLCAiYXNzaWduIiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSkpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQXNzaWduKCh5eXZzcFsoMikgLSAoMyldLmludGVybSkub3AsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygyKSAtICgzKV0uaW50ZXJtKS5saW5lKTsKKyAgICAgICAgaWYgKCh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9PSAwKSB7CisgICAgICAgICAgICBjb250ZXh0LT5hc3NpZ25FcnJvcigoeXl2c3BbKDIpIC0gKDMpXS5pbnRlcm0pLmxpbmUsICJhc3NpZ24iLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSwgKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldENvbXBsZXRlU3RyaW5nKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjM6CisKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybSkubGluZSA9ICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZTsgKHl5dmFsLmludGVybSkub3AgPSBFT3BBc3NpZ247IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2NDoKKworICAgIHsgRlJBR19WRVJUX09OTFkoIio9IiwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lKTsgICAgICh5eXZhbC5pbnRlcm0pLmxpbmUgPSAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmU7ICh5eXZhbC5pbnRlcm0pLm9wID0gRU9wTXVsQXNzaWduOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjU6CisKKyAgICB7IEZSQUdfVkVSVF9PTkxZKCIvPSIsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7ICAgICAoeXl2YWwuaW50ZXJtKS5saW5lID0gKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lOyAoeXl2YWwuaW50ZXJtKS5vcCA9IEVPcERpdkFzc2lnbjsgO30KKyAgICBicmVhazsKKworICBjYXNlIDY2OgorCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0pLmxpbmUgPSAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmU7ICh5eXZhbC5pbnRlcm0pLm9wID0gRU9wQWRkQXNzaWduOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjc6CisKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHl5dmFsLmludGVybSkubGluZSA9ICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZTsgKHl5dmFsLmludGVybSkub3AgPSBFT3BTdWJBc3NpZ247IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2ODoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDY5OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQ29tbWEoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCAoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICBpZiAoKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmJpbmFyeU9wRXJyb3IoKHl5dnNwWygyKSAtICgzKV0ubGV4KS5saW5lLCAiLCIsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRDb21wbGV0ZVN0cmluZygpLCAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKS0+Z2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICAgICAgfQorICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3MDoKKworICAgIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPmNvbnN0RXJyb3JDaGVjaygoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3MToKKworICAgIHsKKyAgICAgICAgVEZ1bmN0aW9uICZmdW5jdGlvbiA9ICooKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtKS5mdW5jdGlvbik7CisgICAgICAgIAorICAgICAgICBUSW50ZXJtQWdncmVnYXRlICpwcm90b3R5cGUgPSBuZXcgVEludGVybUFnZ3JlZ2F0ZTsKKyAgICAgICAgcHJvdG90eXBlLT5zZXRUeXBlKGZ1bmN0aW9uLmdldFJldHVyblR5cGUoKSk7CisgICAgICAgIHByb3RvdHlwZS0+c2V0TmFtZShmdW5jdGlvbi5nZXROYW1lKCkpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jdGlvbi5nZXRQYXJhbUNvdW50KCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVFBhcmFtZXRlciAmcGFyYW0gPSBmdW5jdGlvbi5nZXRQYXJhbShpKTsKKyAgICAgICAgICAgIGlmIChwYXJhbS5uYW1lICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFZhcmlhYmxlICp2YXJpYWJsZSA9IG5ldyBUVmFyaWFibGUocGFyYW0ubmFtZSwgKnBhcmFtLnR5cGUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHByb3RvdHlwZSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5ncm93QWdncmVnYXRlKHByb3RvdHlwZSwgY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFN5bWJvbCh2YXJpYWJsZS0+Z2V0VW5pcXVlSWQoKSwgdmFyaWFibGUtPmdldE5hbWUoKSwgdmFyaWFibGUtPmdldFR5cGUoKSwgKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtKS5saW5lKSwgKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtKS5saW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90b3R5cGUgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuZ3Jvd0FnZ3JlZ2F0ZShwcm90b3R5cGUsIGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRTeW1ib2woMCwgIiIsICpwYXJhbS50eXBlLCAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0pLmxpbmUpLCAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0pLmxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90b3R5cGUtPnNldE9wKEVPcFByb3RvdHlwZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSBwcm90b3R5cGU7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDcyOgorCisgICAgeworICAgICAgICBpZiAoKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtKS5pbnRlcm1BZ2dyZWdhdGUpCisgICAgICAgICAgICAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0pLmludGVybUFnZ3JlZ2F0ZS0+c2V0T3AoRU9wRGVjbGFyYXRpb24pOworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpID0gKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtKS5pbnRlcm1BZ2dyZWdhdGU7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDczOgorCisgICAgeworICAgICAgICBjb250ZXh0LT5zeW1ib2xUYWJsZS5zZXREZWZhdWx0UHJlY2lzaW9uKCAoeXl2c3BbKDMpIC0gKDQpXS5pbnRlcm0udHlwZSkudHlwZSwgKHl5dnNwWygyKSAtICg0KV0uaW50ZXJtLnByZWNpc2lvbikgKTsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9IDA7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDc0OgorCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBNdWx0aXBsZSBkZWNsYXJhdGlvbnMgb2YgdGhlIHNhbWUgZnVuY3Rpb24gYXJlIGFsbG93ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBkZWZpbml0aW9uLCB0aGUgZGVmaW5pdGlvbiBwcm9kdWN0aW9uIGNvZGUgd2lsbCBjaGVjayBmb3IgcmVkZWZpbml0aW9ucworICAgICAgICAvLyAod2UgZG9uJ3Qga25vdyBhdCB0aGlzIHBvaW50IGlmIGl0J3MgYSBkZWZpbml0aW9uIG9yIG5vdCkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlZGVjbGFyYXRpb25zIGFyZSBhbGxvd2VkLiAgQnV0LCByZXR1cm4gdHlwZXMgYW5kIHBhcmFtZXRlciBxdWFsaWZpZXJzIG11c3QgbWF0Y2guCisgICAgICAgIC8vCisgICAgICAgIFRGdW5jdGlvbiogcHJldkRlYyA9IHN0YXRpY19jYXN0PFRGdW5jdGlvbio+KGNvbnRleHQtPnN5bWJvbFRhYmxlLmZpbmQoKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmZ1bmN0aW9uKS0+Z2V0TWFuZ2xlZE5hbWUoKSkpOworICAgICAgICBpZiAocHJldkRlYykgeworICAgICAgICAgICAgaWYgKHByZXZEZWMtPmdldFJldHVyblR5cGUoKSAhPSAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0uZnVuY3Rpb24pLT5nZXRSZXR1cm5UeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDIpIC0gKDIpXS5sZXgpLmxpbmUsICJvdmVybG9hZGVkIGZ1bmN0aW9ucyBtdXN0IGhhdmUgdGhlIHNhbWUgcmV0dXJuIHR5cGUiLCAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0uZnVuY3Rpb24pLT5nZXRSZXR1cm5UeXBlKCkuZ2V0QmFzaWNTdHJpbmcoKSwgIiIpOworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJldkRlYy0+Z2V0UGFyYW1Db3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJldkRlYy0+Z2V0UGFyYW0oaSkudHlwZS0+Z2V0UXVhbGlmaWVyKCkgIT0gKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmZ1bmN0aW9uKS0+Z2V0UGFyYW0oaSkudHlwZS0+Z2V0UXVhbGlmaWVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygyKSAtICgyKV0ubGV4KS5saW5lLCAib3ZlcmxvYWRlZCBmdW5jdGlvbnMgbXVzdCBoYXZlIHRoZSBzYW1lIHBhcmFtZXRlciBxdWFsaWZpZXJzIiwgKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmZ1bmN0aW9uKS0+Z2V0UGFyYW0oaSkudHlwZS0+Z2V0UXVhbGlmaWVyU3RyaW5nKCksICIiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgaXMgYSByZWRlY2xhcmF0aW9uLCBpdCBjb3VsZCBhbHNvIGJlIGEgZGVmaW5pdGlvbiwKKyAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSwgd2Ugd2FudCB0byB1c2UgdGhlIHZhcmlhYmxlIG5hbWVzIGZyb20gdGhpcyBvbmUsIGFuZCBub3QgdGhlIG9uZSB0aGF0J3MKKyAgICAgICAgLy8gYmVpbmcgcmVkZWNsYXJlZC4gIFNvLCBwYXNzIGJhY2sgdXAgdGhpcyBkZWNsYXJhdGlvbiwgbm90IHRoZSBvbmUgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKyAgICAgICAgLy8KKyAgICAgICAgKHl5dmFsLmludGVybSkuZnVuY3Rpb24gPSAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0uZnVuY3Rpb24pOworICAgICAgICAoeXl2YWwuaW50ZXJtKS5saW5lID0gKHl5dnNwWygyKSAtICgyKV0ubGV4KS5saW5lOworCisgICAgICAgIGNvbnRleHQtPnN5bWJvbFRhYmxlLmluc2VydCgqKHl5dmFsLmludGVybSkuZnVuY3Rpb24pOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NToKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5mdW5jdGlvbikgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uZnVuY3Rpb24pOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NjoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5mdW5jdGlvbikgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uZnVuY3Rpb24pOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NzoKKworICAgIHsKKyAgICAgICAgLy8gQWRkIHRoZSBwYXJhbWV0ZXIKKyAgICAgICAgKHl5dmFsLmludGVybS5mdW5jdGlvbikgPSAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0uZnVuY3Rpb24pOworICAgICAgICBpZiAoKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtKS5wYXJhbS50eXBlLT5nZXRCYXNpY1R5cGUoKSAhPSBFYnRWb2lkKQorICAgICAgICAgICAgKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmZ1bmN0aW9uKS0+YWRkUGFyYW1ldGVyKCh5eXZzcFsoMikgLSAoMildLmludGVybSkucGFyYW0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZWxldGUgKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtKS5wYXJhbS50eXBlOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3ODoKKworICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gT25seSBmaXJzdCBwYXJhbWV0ZXIgb2Ygb25lLXBhcmFtZXRlciBmdW5jdGlvbnMgY2FuIGJlIHZvaWQKKyAgICAgICAgLy8gVGhlIGNoZWNrIGZvciBuYW1lZCBwYXJhbWV0ZXJzIG5vdCBiZWluZyB2b2lkIGlzIGRvbmUgaW4gcGFyYW1ldGVyX2RlY2xhcmF0b3IKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCh5eXZzcFsoMykgLSAoMyldLmludGVybSkucGFyYW0udHlwZS0+Z2V0QmFzaWNUeXBlKCkgPT0gRWJ0Vm9pZCkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgcGFyYW1ldGVyID4gZmlyc3QgaXMgdm9pZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgImNhbm5vdCBiZSBhbiBhcmd1bWVudCB0eXBlIGV4Y2VwdCBmb3IgJyh2b2lkKSciLCAidm9pZCIsICIiKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIGRlbGV0ZSAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0pLnBhcmFtLnR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBZGQgdGhlIHBhcmFtZXRlcgorICAgICAgICAgICAgKHl5dmFsLmludGVybS5mdW5jdGlvbikgPSAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0uZnVuY3Rpb24pOworICAgICAgICAgICAgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLmZ1bmN0aW9uKS0+YWRkUGFyYW1ldGVyKCh5eXZzcFsoMykgLSAoMyldLmludGVybSkucGFyYW0pOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDc5OgorCisgICAgeworICAgICAgICBpZiAoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLnR5cGUpLnF1YWxpZmllciAhPSBFdnFHbG9iYWwgJiYgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLnR5cGUpLnF1YWxpZmllciAhPSBFdnFUZW1wb3JhcnkpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoMyldLmxleCkubGluZSwgIm5vIHF1YWxpZmllcnMgYWxsb3dlZCBmb3IgZnVuY3Rpb24gcmV0dXJuIiwgZ2V0UXVhbGlmaWVyU3RyaW5nKCh5eXZzcFsoMSkgLSAoMyldLmludGVybS50eXBlKS5xdWFsaWZpZXIpLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbWFrZSBzdXJlIGEgc2FtcGxlciBpcyBub3QgaW52b2x2ZWQgYXMgd2VsbC4uLgorICAgICAgICBpZiAoY29udGV4dC0+c3RydWN0UXVhbGlmaWVyRXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDMpXS5sZXgpLmxpbmUsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS50eXBlKSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBmdW5jdGlvbiBhcyBhIHByb3RvdHlwZSBhZnRlciBwYXJzaW5nIGl0ICh3ZSBkbyBub3Qgc3VwcG9ydCByZWN1cnNpb24pCisgICAgICAgIFRGdW5jdGlvbiAqZnVuY3Rpb247CisgICAgICAgIFRUeXBlIHR5cGUoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLnR5cGUpKTsKKyAgICAgICAgZnVuY3Rpb24gPSBuZXcgVEZ1bmN0aW9uKCh5eXZzcFsoMikgLSAoMyldLmxleCkuc3RyaW5nLCB0eXBlKTsKKyAgICAgICAgKHl5dmFsLmludGVybS5mdW5jdGlvbikgPSBmdW5jdGlvbjsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODA6CisKKyAgICB7CisgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0udHlwZSkudHlwZSA9PSBFYnRWb2lkKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDIpIC0gKDIpXS5sZXgpLmxpbmUsICJpbGxlZ2FsIHVzZSBvZiB0eXBlICd2b2lkJyIsICh5eXZzcFsoMikgLSAoMildLmxleCkuc3RyaW5nLT5jX3N0cigpLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRleHQtPnJlc2VydmVkRXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDIpXS5sZXgpLmxpbmUsICooeXl2c3BbKDIpIC0gKDIpXS5sZXgpLnN0cmluZykpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIFRQYXJhbWV0ZXIgcGFyYW0gPSB7KHl5dnNwWygyKSAtICgyKV0ubGV4KS5zdHJpbmcsIG5ldyBUVHlwZSgoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0udHlwZSkpfTsKKyAgICAgICAgKHl5dmFsLmludGVybSkubGluZSA9ICh5eXZzcFsoMikgLSAoMildLmxleCkubGluZTsKKyAgICAgICAgKHl5dmFsLmludGVybSkucGFyYW0gPSBwYXJhbTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODE6CisKKyAgICB7CisgICAgICAgIC8vIENoZWNrIHRoYXQgd2UgY2FuIG1ha2UgYW4gYXJyYXkgb3V0IG9mIHRoaXMgdHlwZQorICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlUeXBlRXJyb3JDaGVjaygoeXl2c3BbKDMpIC0gKDUpXS5sZXgpLmxpbmUsICh5eXZzcFsoMSkgLSAoNSldLmludGVybS50eXBlKSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPnJlc2VydmVkRXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDUpXS5sZXgpLmxpbmUsICooeXl2c3BbKDIpIC0gKDUpXS5sZXgpLnN0cmluZykpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGlmIChjb250ZXh0LT5hcnJheVNpemVFcnJvckNoZWNrKCh5eXZzcFsoMykgLSAoNSldLmxleCkubGluZSwgKHl5dnNwWyg0KSAtICg1KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksIHNpemUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAoeXl2c3BbKDEpIC0gKDUpXS5pbnRlcm0udHlwZSkuc2V0QXJyYXkodHJ1ZSwgc2l6ZSk7CisKKyAgICAgICAgVFR5cGUqIHR5cGUgPSBuZXcgVFR5cGUoKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtLnR5cGUpKTsKKyAgICAgICAgVFBhcmFtZXRlciBwYXJhbSA9IHsgKHl5dnNwWygyKSAtICg1KV0ubGV4KS5zdHJpbmcsIHR5cGUgfTsKKyAgICAgICAgKHl5dmFsLmludGVybSkubGluZSA9ICh5eXZzcFsoMikgLSAoNSldLmxleCkubGluZTsKKyAgICAgICAgKHl5dmFsLmludGVybSkucGFyYW0gPSBwYXJhbTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODI6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0pID0gKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtKTsKKyAgICAgICAgaWYgKGNvbnRleHQtPnBhcmFtRXJyb3JDaGVjaygoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0pLmxpbmUsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS50eXBlKS5xdWFsaWZpZXIsICh5eXZzcFsoMikgLSAoMyldLmludGVybS5xdWFsaWZpZXIpLCAoeXl2YWwuaW50ZXJtKS5wYXJhbS50eXBlKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODM6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0pID0gKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtKTsKKyAgICAgICAgaWYgKGNvbnRleHQtPnBhcmFtZXRlclNhbXBsZXJFcnJvckNoZWNrKCh5eXZzcFsoMikgLSAoMildLmludGVybSkubGluZSwgKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLnF1YWxpZmllciksICooeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0pLnBhcmFtLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBpZiAoY29udGV4dC0+cGFyYW1FcnJvckNoZWNrKCh5eXZzcFsoMikgLSAoMildLmludGVybSkubGluZSwgRXZxVGVtcG9yYXJ5LCAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0ucXVhbGlmaWVyKSwgKHl5dmFsLmludGVybSkucGFyYW0udHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDg0OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtKSA9ICh5eXZzcFsoMykgLSAoMyldLmludGVybSk7CisgICAgICAgIGlmIChjb250ZXh0LT5wYXJhbUVycm9yQ2hlY2soKHl5dnNwWygzKSAtICgzKV0uaW50ZXJtKS5saW5lLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0udHlwZSkucXVhbGlmaWVyLCAoeXl2c3BbKDIpIC0gKDMpXS5pbnRlcm0ucXVhbGlmaWVyKSwgKHl5dmFsLmludGVybSkucGFyYW0udHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDg1OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtKSA9ICh5eXZzcFsoMikgLSAoMildLmludGVybSk7CisgICAgICAgIGlmIChjb250ZXh0LT5wYXJhbWV0ZXJTYW1wbGVyRXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0pLmxpbmUsICh5eXZzcFsoMSkgLSAoMildLmludGVybS5xdWFsaWZpZXIpLCAqKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtKS5wYXJhbS50eXBlKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgaWYgKGNvbnRleHQtPnBhcmFtRXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0pLmxpbmUsIEV2cVRlbXBvcmFyeSwgKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLnF1YWxpZmllciksICh5eXZhbC5pbnRlcm0pLnBhcmFtLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4NjoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5xdWFsaWZpZXIpID0gRXZxSW47CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDg3OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLnF1YWxpZmllcikgPSBFdnFJbjsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODg6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0ucXVhbGlmaWVyKSA9IEV2cU91dDsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODk6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0ucXVhbGlmaWVyKSA9IEV2cUluT3V0OworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5MDoKKworICAgIHsKKyAgICAgICAgVFBhcmFtZXRlciBwYXJhbSA9IHsgMCwgbmV3IFRUeXBlKCh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKSkgfTsKKyAgICAgICAgKHl5dmFsLmludGVybSkucGFyYW0gPSBwYXJhbTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTE6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0pID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKTsKKyAgICAgICAgCisgICAgICAgIGlmICgoeXl2YWwuaW50ZXJtKS50eXBlLnByZWNpc2lvbiA9PSBFYnBVbmRlZmluZWQpIHsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0pLnR5cGUucHJlY2lzaW9uID0gY29udGV4dC0+c3ltYm9sVGFibGUuZ2V0RGVmYXVsdFByZWNpc2lvbigoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLnR5cGUudHlwZSk7CisgICAgICAgICAgICBpZiAoY29udGV4dC0+cHJlY2lzaW9uRXJyb3JDaGVjaygoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLmxpbmUsICh5eXZhbC5pbnRlcm0pLnR5cGUucHJlY2lzaW9uLCAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLnR5cGUudHlwZSkpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTI6CisKKyAgICB7CisgICAgICAgIFRJbnRlcm1TeW1ib2wqIHN5bWJvbCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRTeW1ib2woMCwgKih5eXZzcFsoMykgLSAoMyldLmxleCkuc3RyaW5nLCBUVHlwZSgoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0pLnR5cGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5sZXgpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtKS5pbnRlcm1BZ2dyZWdhdGUgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuZ3Jvd0FnZ3JlZ2F0ZSgoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0pLmludGVybU5vZGUsIHN5bWJvbCwgKHl5dnNwWygzKSAtICgzKV0ubGV4KS5saW5lKTsKKyAgICAgICAgCisgICAgICAgIGlmIChjb250ZXh0LT5zdHJ1Y3RRdWFsaWZpZXJFcnJvckNoZWNrKCh5eXZzcFsoMykgLSAoMyldLmxleCkubGluZSwgKHl5dmFsLmludGVybSkudHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPm5vbkluaXRDb25zdEVycm9yQ2hlY2soKHl5dnNwWygzKSAtICgzKV0ubGV4KS5saW5lLCAqKHl5dnNwWygzKSAtICgzKV0ubGV4KS5zdHJpbmcsICh5eXZhbC5pbnRlcm0pLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIFRWYXJpYWJsZSogdmFyaWFibGUgPSAwOworICAgICAgICBpZiAoY29udGV4dC0+bm9uSW5pdEVycm9yQ2hlY2soKHl5dnNwWygzKSAtICgzKV0ubGV4KS5saW5lLCAqKHl5dnNwWygzKSAtICgzKV0ubGV4KS5zdHJpbmcsICh5eXZhbC5pbnRlcm0pLnR5cGUsIHZhcmlhYmxlKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgaWYgKHN5bWJvbCAmJiB2YXJpYWJsZSkKKyAgICAgICAgICAgIHN5bWJvbC0+c2V0SWQodmFyaWFibGUtPmdldFVuaXF1ZUlkKCkpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5MzoKKworICAgIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPnN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soKHl5dnNwWygzKSAtICg1KV0ubGV4KS5saW5lLCAoeXl2c3BbKDEpIC0gKDUpXS5pbnRlcm0pLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIGlmIChjb250ZXh0LT5ub25Jbml0Q29uc3RFcnJvckNoZWNrKCh5eXZzcFsoMykgLSAoNSldLmxleCkubGluZSwgKih5eXZzcFsoMykgLSAoNSldLmxleCkuc3RyaW5nLCAoeXl2c3BbKDEpIC0gKDUpXS5pbnRlcm0pLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgICh5eXZhbC5pbnRlcm0pID0gKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtKTsKKworICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlUeXBlRXJyb3JDaGVjaygoeXl2c3BbKDQpIC0gKDUpXS5sZXgpLmxpbmUsICh5eXZzcFsoMSkgLSAoNSldLmludGVybSkudHlwZSkgfHwgY29udGV4dC0+YXJyYXlRdWFsaWZpZXJFcnJvckNoZWNrKCh5eXZzcFsoNCkgLSAoNSldLmxleCkubGluZSwgKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtKS50eXBlKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAoeXl2c3BbKDEpIC0gKDUpXS5pbnRlcm0pLnR5cGUuc2V0QXJyYXkodHJ1ZSk7CisgICAgICAgICAgICBUVmFyaWFibGUqIHZhcmlhYmxlOworICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5RXJyb3JDaGVjaygoeXl2c3BbKDQpIC0gKDUpXS5sZXgpLmxpbmUsICooeXl2c3BbKDMpIC0gKDUpXS5sZXgpLnN0cmluZywgKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtKS50eXBlLCB2YXJpYWJsZSkpCisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDk0OgorCisgICAgeworICAgICAgICBpZiAoY29udGV4dC0+c3RydWN0UXVhbGlmaWVyRXJyb3JDaGVjaygoeXl2c3BbKDMpIC0gKDYpXS5sZXgpLmxpbmUsICh5eXZzcFsoMSkgLSAoNildLmludGVybSkudHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPm5vbkluaXRDb25zdEVycm9yQ2hlY2soKHl5dnNwWygzKSAtICg2KV0ubGV4KS5saW5lLCAqKHl5dnNwWygzKSAtICg2KV0ubGV4KS5zdHJpbmcsICh5eXZzcFsoMSkgLSAoNildLmludGVybSkudHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgKHl5dmFsLmludGVybSkgPSAoeXl2c3BbKDEpIC0gKDYpXS5pbnRlcm0pOworCisgICAgICAgIGlmIChjb250ZXh0LT5hcnJheVR5cGVFcnJvckNoZWNrKCh5eXZzcFsoNCkgLSAoNildLmxleCkubGluZSwgKHl5dnNwWygxKSAtICg2KV0uaW50ZXJtKS50eXBlKSB8fCBjb250ZXh0LT5hcnJheVF1YWxpZmllckVycm9yQ2hlY2soKHl5dnNwWyg0KSAtICg2KV0ubGV4KS5saW5lLCAoeXl2c3BbKDEpIC0gKDYpXS5pbnRlcm0pLnR5cGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5U2l6ZUVycm9yQ2hlY2soKHl5dnNwWyg0KSAtICg2KV0ubGV4KS5saW5lLCAoeXl2c3BbKDUpIC0gKDYpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgc2l6ZSkpCisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgKHl5dnNwWygxKSAtICg2KV0uaW50ZXJtKS50eXBlLnNldEFycmF5KHRydWUsIHNpemUpOworICAgICAgICAgICAgVFZhcmlhYmxlKiB2YXJpYWJsZSA9IDA7CisgICAgICAgICAgICBpZiAoY29udGV4dC0+YXJyYXlFcnJvckNoZWNrKCh5eXZzcFsoNCkgLSAoNildLmxleCkubGluZSwgKih5eXZzcFsoMykgLSAoNildLmxleCkuc3RyaW5nLCAoeXl2c3BbKDEpIC0gKDYpXS5pbnRlcm0pLnR5cGUsIHZhcmlhYmxlKSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICBUVHlwZSB0eXBlID0gVFR5cGUoKHl5dnNwWygxKSAtICg2KV0uaW50ZXJtKS50eXBlKTsKKyAgICAgICAgICAgIHR5cGUuc2V0QXJyYXlTaXplKHNpemUpOworICAgICAgICAgICAgKHl5dmFsLmludGVybSkuaW50ZXJtQWdncmVnYXRlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUoKHl5dnNwWygxKSAtICg2KV0uaW50ZXJtKS5pbnRlcm1Ob2RlLCBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkU3ltYm9sKHZhcmlhYmxlID8gdmFyaWFibGUtPmdldFVuaXF1ZUlkKCkgOiAwLCAqKHl5dnNwWygzKSAtICg2KV0ubGV4KS5zdHJpbmcsIHR5cGUsICh5eXZzcFsoMykgLSAoNildLmxleCkubGluZSksICh5eXZzcFsoMykgLSAoNildLmxleCkubGluZSk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTU6CisKKyAgICB7CisgICAgICAgIGlmIChjb250ZXh0LT5zdHJ1Y3RRdWFsaWZpZXJFcnJvckNoZWNrKCh5eXZzcFsoMykgLSAoNSldLmxleCkubGluZSwgKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtKS50eXBlKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKworICAgICAgICAoeXl2YWwuaW50ZXJtKSA9ICh5eXZzcFsoMSkgLSAoNSldLmludGVybSk7CisKKyAgICAgICAgVEludGVybU5vZGUqIGludGVybU5vZGU7CisgICAgICAgIGlmICghY29udGV4dC0+ZXhlY3V0ZUluaXRpYWxpemVyKCh5eXZzcFsoMykgLSAoNSldLmxleCkubGluZSwgKih5eXZzcFsoMykgLSAoNSldLmxleCkuc3RyaW5nLCAoeXl2c3BbKDEpIC0gKDUpXS5pbnRlcm0pLnR5cGUsICh5eXZzcFsoNSkgLSAoNSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCBpbnRlcm1Ob2RlKSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoaW50ZXJtTm9kZSkKKyAgICAgICAgKHl5dmFsLmludGVybSkuaW50ZXJtQWdncmVnYXRlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUoKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtKS5pbnRlcm1Ob2RlLCBpbnRlcm1Ob2RlLCAoeXl2c3BbKDQpIC0gKDUpXS5sZXgpLmxpbmUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0pLmludGVybUFnZ3JlZ2F0ZSA9ICh5eXZzcFsoMSkgLSAoNSldLmludGVybSkuaW50ZXJtQWdncmVnYXRlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgKHl5dmFsLmludGVybSkuaW50ZXJtQWdncmVnYXRlID0gMDsKKyAgICAgICAgfQorICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NjoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybSkudHlwZSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKTsKKyAgICAgICAgKHl5dmFsLmludGVybSkuaW50ZXJtQWdncmVnYXRlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLm1ha2VBZ2dyZWdhdGUoY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFN5bWJvbCgwLCAiIiwgVFR5cGUoKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpKSwgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpLmxpbmUpLCAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkubGluZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDk3OgorCisgICAgeworICAgICAgICBUSW50ZXJtU3ltYm9sKiBzeW1ib2wgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkU3ltYm9sKDAsICooeXl2c3BbKDIpIC0gKDIpXS5sZXgpLnN0cmluZywgVFR5cGUoKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLnR5cGUpKSwgKHl5dnNwWygyKSAtICgyKV0ubGV4KS5saW5lKTsKKyAgICAgICAgKHl5dmFsLmludGVybSkuaW50ZXJtQWdncmVnYXRlID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLm1ha2VBZ2dyZWdhdGUoc3ltYm9sLCAoeXl2c3BbKDIpIC0gKDIpXS5sZXgpLmxpbmUpOworICAgICAgICAKKyAgICAgICAgaWYgKGNvbnRleHQtPnN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soKHl5dnNwWygyKSAtICgyKV0ubGV4KS5saW5lLCAoeXl2YWwuaW50ZXJtKS50eXBlKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKworICAgICAgICBpZiAoY29udGV4dC0+bm9uSW5pdENvbnN0RXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDIpXS5sZXgpLmxpbmUsICooeXl2c3BbKDIpIC0gKDIpXS5sZXgpLnN0cmluZywgKHl5dmFsLmludGVybSkudHlwZSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0pLnR5cGUgPSAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0udHlwZSk7CisKKyAgICAgICAgVFZhcmlhYmxlKiB2YXJpYWJsZSA9IDA7CisgICAgICAgIGlmIChjb250ZXh0LT5ub25Jbml0RXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDIpXS5sZXgpLmxpbmUsICooeXl2c3BbKDIpIC0gKDIpXS5sZXgpLnN0cmluZywgKHl5dmFsLmludGVybSkudHlwZSwgdmFyaWFibGUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBpZiAodmFyaWFibGUgJiYgc3ltYm9sKQorICAgICAgICAgICAgc3ltYm9sLT5zZXRJZCh2YXJpYWJsZS0+Z2V0VW5pcXVlSWQoKSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDk4OgorCisgICAgeworICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDIpIC0gKDQpXS5sZXgpLmxpbmUsICJ1bnNpemVkIGFycmF5IGRlY2xhcmF0aW9ucyBub3Qgc3VwcG9ydGVkIiwgKHl5dnNwWygyKSAtICg0KV0ubGV4KS5zdHJpbmctPmNfc3RyKCksICIiKTsKKyAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIFRJbnRlcm1TeW1ib2wqIHN5bWJvbCA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRTeW1ib2woMCwgKih5eXZzcFsoMikgLSAoNCldLmxleCkuc3RyaW5nLCBUVHlwZSgoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0udHlwZSkpLCAoeXl2c3BbKDIpIC0gKDQpXS5sZXgpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtKS5pbnRlcm1BZ2dyZWdhdGUgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUubWFrZUFnZ3JlZ2F0ZShzeW1ib2wsICh5eXZzcFsoMikgLSAoNCldLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0pLnR5cGUgPSAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0udHlwZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDk5OgorCisgICAgeworICAgICAgICBUVHlwZSB0eXBlID0gVFR5cGUoKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtLnR5cGUpKTsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGlmIChjb250ZXh0LT5hcnJheVNpemVFcnJvckNoZWNrKCh5eXZzcFsoMikgLSAoNSldLmxleCkubGluZSwgKHl5dnNwWyg0KSAtICg1KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksIHNpemUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB0eXBlLnNldEFycmF5U2l6ZShzaXplKTsKKyAgICAgICAgVEludGVybVN5bWJvbCogc3ltYm9sID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFN5bWJvbCgwLCAqKHl5dnNwWygyKSAtICg1KV0ubGV4KS5zdHJpbmcsIHR5cGUsICh5eXZzcFsoMikgLSAoNSldLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0pLmludGVybUFnZ3JlZ2F0ZSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5tYWtlQWdncmVnYXRlKHN5bWJvbCwgKHl5dnNwWygyKSAtICg1KV0ubGV4KS5saW5lKTsKKyAgICAgICAgCisgICAgICAgIGlmIChjb250ZXh0LT5zdHJ1Y3RRdWFsaWZpZXJFcnJvckNoZWNrKCh5eXZzcFsoMikgLSAoNSldLmxleCkubGluZSwgKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtLnR5cGUpKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKworICAgICAgICBpZiAoY29udGV4dC0+bm9uSW5pdENvbnN0RXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDUpXS5sZXgpLmxpbmUsICooeXl2c3BbKDIpIC0gKDUpXS5sZXgpLnN0cmluZywgKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtLnR5cGUpKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKworICAgICAgICAoeXl2YWwuaW50ZXJtKS50eXBlID0gKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtLnR5cGUpOworCisgICAgICAgIGlmIChjb250ZXh0LT5hcnJheVR5cGVFcnJvckNoZWNrKCh5eXZzcFsoMykgLSAoNSldLmxleCkubGluZSwgKHl5dnNwWygxKSAtICg1KV0uaW50ZXJtLnR5cGUpKSB8fCBjb250ZXh0LT5hcnJheVF1YWxpZmllckVycm9yQ2hlY2soKHl5dnNwWygzKSAtICg1KV0ubGV4KS5saW5lLCAoeXl2c3BbKDEpIC0gKDUpXS5pbnRlcm0udHlwZSkpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5U2l6ZUVycm9yQ2hlY2soKHl5dnNwWygzKSAtICg1KV0ubGV4KS5saW5lLCAoeXl2c3BbKDQpIC0gKDUpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgc2l6ZSkpCisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgICAgICAoeXl2c3BbKDEpIC0gKDUpXS5pbnRlcm0udHlwZSkuc2V0QXJyYXkodHJ1ZSwgc2l6ZSk7CisgICAgICAgICAgICBUVmFyaWFibGUqIHZhcmlhYmxlID0gMDsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LT5hcnJheUVycm9yQ2hlY2soKHl5dnNwWygzKSAtICg1KV0ubGV4KS5saW5lLCAqKHl5dnNwWygyKSAtICg1KV0ubGV4KS5zdHJpbmcsICh5eXZzcFsoMSkgLSAoNSldLmludGVybS50eXBlKSwgdmFyaWFibGUpKQorICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZSAmJiBzeW1ib2wpCisgICAgICAgICAgICAgICAgc3ltYm9sLT5zZXRJZCh2YXJpYWJsZS0+Z2V0VW5pcXVlSWQoKSk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTAwOgorCisgICAgeworICAgICAgICBpZiAoY29udGV4dC0+c3RydWN0UXVhbGlmaWVyRXJyb3JDaGVjaygoeXl2c3BbKDIpIC0gKDQpXS5sZXgpLmxpbmUsICh5eXZzcFsoMSkgLSAoNCldLmludGVybS50eXBlKSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgKHl5dmFsLmludGVybSkudHlwZSA9ICh5eXZzcFsoMSkgLSAoNCldLmludGVybS50eXBlKTsKKworICAgICAgICBUSW50ZXJtTm9kZSogaW50ZXJtTm9kZTsKKyAgICAgICAgaWYgKCFjb250ZXh0LT5leGVjdXRlSW5pdGlhbGl6ZXIoKHl5dnNwWygyKSAtICg0KV0ubGV4KS5saW5lLCAqKHl5dnNwWygyKSAtICg0KV0ubGV4KS5zdHJpbmcsICh5eXZzcFsoMSkgLSAoNCldLmludGVybS50eXBlKSwgKHl5dnNwWyg0KSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksIGludGVybU5vZGUpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1aWxkIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbgorICAgICAgICAvLworICAgICAgICAgICAgaWYoaW50ZXJtTm9kZSkKKyAgICAgICAgICAgICAgICAoeXl2YWwuaW50ZXJtKS5pbnRlcm1BZ2dyZWdhdGUgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUubWFrZUFnZ3JlZ2F0ZShpbnRlcm1Ob2RlLCAoeXl2c3BbKDMpIC0gKDQpXS5sZXgpLmxpbmUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICh5eXZhbC5pbnRlcm0pLmludGVybUFnZ3JlZ2F0ZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtKS5pbnRlcm1BZ2dyZWdhdGUgPSAwOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMToKKworICAgIHsKKyAgICAgICAgVkVSVEVYX09OTFkoImludmFyaWFudCBkZWNsYXJhdGlvbiIsICh5eXZzcFsoMSkgLSAoMildLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0pLnF1YWxpZmllciA9IEV2cUludmFyaWFudFZhcnlpbmdPdXQ7CisgICAgICAgICh5eXZhbC5pbnRlcm0pLmludGVybUFnZ3JlZ2F0ZSA9IDA7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMjoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKTsKKworICAgICAgICBpZiAoKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpLmFycmF5KSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkubGluZSwgIm5vdCBzdXBwb3J0ZWQiLCAiZmlyc3QtY2xhc3MgYXJyYXkiLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICAgICAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0udHlwZSkuc2V0QXJyYXkoZmFsc2UpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMzoKKworICAgIHsKKyAgICAgICAgaWYgKCh5eXZzcFsoMikgLSAoMildLmludGVybS50eXBlKS5hcnJheSkgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtLnR5cGUpLmxpbmUsICJub3Qgc3VwcG9ydGVkIiwgImZpcnN0LWNsYXNzIGFycmF5IiwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtLnR5cGUpLnNldEFycmF5KGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0udHlwZSkucXVhbGlmaWVyID09IEV2cUF0dHJpYnV0ZSAmJgorICAgICAgICAgICAgKCh5eXZzcFsoMikgLSAoMildLmludGVybS50eXBlKS50eXBlID09IEVidEJvb2wgfHwgKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtLnR5cGUpLnR5cGUgPT0gRWJ0SW50KSkgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtLnR5cGUpLmxpbmUsICJjYW5ub3QgYmUgYm9vbCBvciBpbnQiLCBnZXRRdWFsaWZpZXJTdHJpbmcoKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLnR5cGUpLnF1YWxpZmllciksICIiKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCh5eXZzcFsoMSkgLSAoMildLmludGVybS50eXBlKS5xdWFsaWZpZXIgPT0gRXZxVmFyeWluZ0luIHx8ICh5eXZzcFsoMSkgLSAoMildLmludGVybS50eXBlKS5xdWFsaWZpZXIgPT0gRXZxVmFyeWluZ091dCkgJiYKKyAgICAgICAgICAgICgoeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0udHlwZSkudHlwZSA9PSBFYnRCb29sIHx8ICh5eXZzcFsoMikgLSAoMildLmludGVybS50eXBlKS50eXBlID09IEVidEludCkpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMikgLSAoMildLmludGVybS50eXBlKS5saW5lLCAiY2Fubm90IGJlIGJvb2wgb3IgaW50IiwgZ2V0UXVhbGlmaWVyU3RyaW5nKCh5eXZzcFsoMSkgLSAoMildLmludGVybS50eXBlKS5xdWFsaWZpZXIpLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKSA9ICh5eXZzcFsoMikgLSAoMildLmludGVybS50eXBlKTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5xdWFsaWZpZXIgPSAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0udHlwZSkucXVhbGlmaWVyOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDQ6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0Vm9pZCwgRXZxQ29uc3QsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwNToKKworICAgIHsKKyAgICAgICAgVkVSVEVYX09OTFkoImF0dHJpYnV0ZSIsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgICAgIGlmIChjb250ZXh0LT5nbG9iYWxFcnJvckNoZWNrKCh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpLCAiYXR0cmlidXRlIikpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0Vm9pZCwgRXZxQXR0cmlidXRlLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDY6CisKKyAgICB7CisgICAgICAgIGlmIChjb250ZXh0LT5nbG9iYWxFcnJvckNoZWNrKCh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpLCAidmFyeWluZyIpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBpZiAoY29udGV4dC0+c2hhZGVyVHlwZSA9PSBTSF9WRVJURVhfU0hBREVSKQorICAgICAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRWb2lkLCBFdnFWYXJ5aW5nT3V0LCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEJhc2ljKEVidFZvaWQsIEV2cVZhcnlpbmdJbiwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTA3OgorCisgICAgeworICAgICAgICBpZiAoY29udGV4dC0+Z2xvYmFsRXJyb3JDaGVjaygoeXl2c3BbKDEpIC0gKDIpXS5sZXgpLmxpbmUsIGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSwgImludmFyaWFudCB2YXJ5aW5nIikpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIGlmIChjb250ZXh0LT5zaGFkZXJUeXBlID09IFNIX1ZFUlRFWF9TSEFERVIpCisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEJhc2ljKEVidFZvaWQsIEV2cUludmFyaWFudFZhcnlpbmdPdXQsICh5eXZzcFsoMSkgLSAoMildLmxleCkubGluZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0Vm9pZCwgRXZxSW52YXJpYW50VmFyeWluZ0luLCAoeXl2c3BbKDEpIC0gKDIpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDg6CisKKyAgICB7CisgICAgICAgIGlmIChjb250ZXh0LT5nbG9iYWxFcnJvckNoZWNrKCh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSwgY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpLCAidW5pZm9ybSIpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEJhc2ljKEVidFZvaWQsIEV2cVVuaWZvcm0sICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwOToKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTEwOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpID0gKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtLnR5cGUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnByZWNpc2lvbiA9ICh5eXZzcFsoMSkgLSAoMildLmludGVybS5wcmVjaXNpb24pOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTE6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0ucHJlY2lzaW9uKSA9IEVicEhpZ2g7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDExMjoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5wcmVjaXNpb24pID0gRWJwTWVkaXVtOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTM6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0ucHJlY2lzaW9uKSA9IEVicExvdzsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTE0OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTU6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkgPSAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0udHlwZSk7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5VHlwZUVycm9yQ2hlY2soKHl5dnNwWygyKSAtICg0KV0ubGV4KS5saW5lLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0udHlwZSkpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5U2l6ZUVycm9yQ2hlY2soKHl5dnNwWygyKSAtICg0KV0ubGV4KS5saW5lLCAoeXl2c3BbKDMpIC0gKDQpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgc2l6ZSkpCisgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRBcnJheSh0cnVlLCBzaXplKTsKKyAgICAgICAgfQorICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTY6CisKKyAgICB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRWb2lkLCBxdWFsLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTc6CisKKyAgICB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRGbG9hdCwgcXVhbCwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTE4OgorCisgICAgeworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0SW50LCBxdWFsLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTk6CisKKyAgICB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRCb29sLCBxdWFsLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjA6CisKKyAgICB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRGbG9hdCwgcXVhbCwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lKTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRBZ2dyZWdhdGUoMik7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEyMToKKworICAgIHsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsID0gY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpID8gRXZxR2xvYmFsIDogRXZxVGVtcG9yYXJ5OworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEJhc2ljKEVidEZsb2F0LCBxdWFsLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEFnZ3JlZ2F0ZSgzKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTIyOgorCisgICAgeworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0RmxvYXQsIHF1YWwsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QWdncmVnYXRlKDQpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjM6CisKKyAgICB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRCb29sLCBxdWFsLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEFnZ3JlZ2F0ZSgyKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTI0OgorCisgICAgeworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0Qm9vbCwgcXVhbCwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lKTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRBZ2dyZWdhdGUoMyk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEyNToKKworICAgIHsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsID0gY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpID8gRXZxR2xvYmFsIDogRXZxVGVtcG9yYXJ5OworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEJhc2ljKEVidEJvb2wsIHF1YWwsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QWdncmVnYXRlKDQpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjY6CisKKyAgICB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRJbnQsIHF1YWwsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QWdncmVnYXRlKDIpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjc6CisKKyAgICB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRJbnQsIHF1YWwsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QWdncmVnYXRlKDMpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjg6CisKKyAgICB7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRJbnQsIHF1YWwsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QWdncmVnYXRlKDQpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjk6CisKKyAgICB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCJtYXQyIiwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lKTsKKyAgICAgICAgVFF1YWxpZmllciBxdWFsID0gY29udGV4dC0+c3ltYm9sVGFibGUuYXRHbG9iYWxMZXZlbCgpID8gRXZxR2xvYmFsIDogRXZxVGVtcG9yYXJ5OworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEJhc2ljKEVidEZsb2F0LCBxdWFsLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEFnZ3JlZ2F0ZSgyLCB0cnVlKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTMwOgorCisgICAgeworICAgICAgICBGUkFHX1ZFUlRfT05MWSgibWF0MyIsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRGbG9hdCwgcXVhbCwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lKTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRBZ2dyZWdhdGUoMywgdHJ1ZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEzMToKKworICAgIHsKKyAgICAgICAgRlJBR19WRVJUX09OTFkoIm1hdDQiLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0RmxvYXQsIHF1YWwsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QWdncmVnYXRlKDQsIHRydWUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMzI6CisKKyAgICB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCJzYW1wbGVyMkQiLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0U2FtcGxlcjJELCBxdWFsLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMzM6CisKKyAgICB7CisgICAgICAgIEZSQUdfVkVSVF9PTkxZKCJzYW1wbGVyQ3ViZSIsICh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSk7CisgICAgICAgIFRRdWFsaWZpZXIgcXVhbCA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlKS5zZXRCYXNpYyhFYnRTYW1wbGVyQ3ViZSwgcXVhbCwgKHl5dnNwWygxKSAtICgxKV0ubGV4KS5saW5lKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTM0OgorCisgICAgeworICAgICAgICBGUkFHX1ZFUlRfT05MWSgic3RydWN0IiwgKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnF1YWxpZmllciA9IGNvbnRleHQtPnN5bWJvbFRhYmxlLmF0R2xvYmFsTGV2ZWwoKSA/IEV2cUdsb2JhbCA6IEV2cVRlbXBvcmFyeTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTM1OgorCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIGZvciB1c2VyIGRlZmluZWQgdHlwZSBuYW1lcy4gIFRoZSBsZXhpY2FsIHBoYXNlIGxvb2tlZCB1cCB0aGUKKyAgICAgICAgLy8gdHlwZS4KKyAgICAgICAgLy8KKyAgICAgICAgVFR5cGUmIHN0cnVjdHVyZSA9IHN0YXRpY19jYXN0PFRWYXJpYWJsZSo+KCh5eXZzcFsoMSkgLSAoMSldLmxleCkuc3ltYm9sKS0+Z2V0VHlwZSgpOworICAgICAgICBUUXVhbGlmaWVyIHF1YWwgPSBjb250ZXh0LT5zeW1ib2xUYWJsZS5hdEdsb2JhbExldmVsKCkgPyBFdnFHbG9iYWwgOiBFdnFUZW1wb3Jhcnk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0U3RydWN0LCBxdWFsLCAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnVzZXJEZWYgPSAmc3RydWN0dXJlOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMzY6CisKKyAgICB7CisgICAgICAgIGlmIChjb250ZXh0LT5yZXNlcnZlZEVycm9yQ2hlY2soKHl5dnNwWygyKSAtICg1KV0ubGV4KS5saW5lLCAqKHl5dnNwWygyKSAtICg1KV0ubGV4KS5zdHJpbmcpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIFRUeXBlKiBzdHJ1Y3R1cmUgPSBuZXcgVFR5cGUoKHl5dnNwWyg0KSAtICg1KV0uaW50ZXJtLnR5cGVMaXN0KSwgKih5eXZzcFsoMikgLSAoNSldLmxleCkuc3RyaW5nKTsKKyAgICAgICAgVFZhcmlhYmxlKiB1c2VyVHlwZURlZiA9IG5ldyBUVmFyaWFibGUoKHl5dnNwWygyKSAtICg1KV0ubGV4KS5zdHJpbmcsICpzdHJ1Y3R1cmUsIHRydWUpOworICAgICAgICBpZiAoISBjb250ZXh0LT5zeW1ib2xUYWJsZS5pbnNlcnQoKnVzZXJUeXBlRGVmKSkgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygyKSAtICg1KV0ubGV4KS5saW5lLCAicmVkZWZpbml0aW9uIiwgKHl5dnNwWygyKSAtICg1KV0ubGV4KS5zdHJpbmctPmNfc3RyKCksICJzdHJ1Y3QiKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgfQorICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnNldEJhc2ljKEVidFN0cnVjdCwgRXZxVGVtcG9yYXJ5LCAoeXl2c3BbKDEpIC0gKDUpXS5sZXgpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGUpLnVzZXJEZWYgPSBzdHJ1Y3R1cmU7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEzNzoKKworICAgIHsKKyAgICAgICAgVFR5cGUqIHN0cnVjdHVyZSA9IG5ldyBUVHlwZSgoeXl2c3BbKDMpIC0gKDQpXS5pbnRlcm0udHlwZUxpc3QpLCBUU3RyaW5nKCIiKSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkuc2V0QmFzaWMoRWJ0U3RydWN0LCBFdnFUZW1wb3JhcnksICh5eXZzcFsoMSkgLSAoNCldLmxleCkubGluZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZSkudXNlckRlZiA9IHN0cnVjdHVyZTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTM4OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGVMaXN0KSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS50eXBlTGlzdCk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDEzOToKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlTGlzdCkgPSAoeXl2c3BbKDEpIC0gKDIpXS5pbnRlcm0udHlwZUxpc3QpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8ICh5eXZzcFsoMikgLSAoMildLmludGVybS50eXBlTGlzdCktPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8ICh5eXZhbC5pbnRlcm0udHlwZUxpc3QpLT5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgIGlmICgoKih5eXZhbC5pbnRlcm0udHlwZUxpc3QpKVtqXS50eXBlLT5nZXRGaWVsZE5hbWUoKSA9PSAoKih5eXZzcFsoMikgLSAoMildLmludGVybS50eXBlTGlzdCkpW2ldLnR5cGUtPmdldEZpZWxkTmFtZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCgqKHl5dnNwWygyKSAtICgyKV0uaW50ZXJtLnR5cGVMaXN0KSlbaV0ubGluZSwgImR1cGxpY2F0ZSBmaWVsZCBuYW1lIGluIHN0cnVjdHVyZToiLCAic3RydWN0IiwgKCooeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0udHlwZUxpc3QpKVtpXS50eXBlLT5nZXRGaWVsZE5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZUxpc3QpLT5wdXNoX2JhY2soKCooeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0udHlwZUxpc3QpKVtpXSk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTQwOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGVMaXN0KSA9ICh5eXZzcFsoMikgLSAoMyldLmludGVybS50eXBlTGlzdCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPnZvaWRFcnJvckNoZWNrKCh5eXZzcFsoMSkgLSAoMyldLmludGVybS50eXBlKS5saW5lLCAoKih5eXZzcFsoMikgLSAoMyldLmludGVybS50eXBlTGlzdCkpWzBdLnR5cGUtPmdldEZpZWxkTmFtZSgpLCAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0udHlwZSkpKSB7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAoeXl2YWwuaW50ZXJtLnR5cGVMaXN0KS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDYXJlZnVsIG5vdCB0byByZXBsYWNlIGFscmVhZHkga25vd24gYXNwZWN0cyBvZiB0eXBlLCBsaWtlIGFycmF5LW5lc3MKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBUVHlwZSogdHlwZSA9ICgqKHl5dmFsLmludGVybS50eXBlTGlzdCkpW2ldLnR5cGU7CisgICAgICAgICAgICB0eXBlLT5zZXRCYXNpY1R5cGUoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLnR5cGUpLnR5cGUpOworICAgICAgICAgICAgdHlwZS0+c2V0Tm9taW5hbFNpemUoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLnR5cGUpLnNpemUpOworICAgICAgICAgICAgdHlwZS0+c2V0TWF0cml4KCh5eXZzcFsoMSkgLSAoMyldLmludGVybS50eXBlKS5tYXRyaXgpOworCisgICAgICAgICAgICAvLyBkb24ndCBhbGxvdyBhcnJheXMgb2YgYXJyYXlzCisgICAgICAgICAgICBpZiAodHlwZS0+aXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFycmF5VHlwZUVycm9yQ2hlY2soKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLnR5cGUpLmxpbmUsICh5eXZzcFsoMSkgLSAoMyldLmludGVybS50eXBlKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0udHlwZSkuYXJyYXkpCisgICAgICAgICAgICAgICAgdHlwZS0+c2V0QXJyYXlTaXplKCh5eXZzcFsoMSkgLSAoMyldLmludGVybS50eXBlKS5hcnJheVNpemUpOworICAgICAgICAgICAgaWYgKCh5eXZzcFsoMSkgLSAoMyldLmludGVybS50eXBlKS51c2VyRGVmKSB7CisgICAgICAgICAgICAgICAgdHlwZS0+c2V0U3RydWN0KCh5eXZzcFsoMSkgLSAoMyldLmludGVybS50eXBlKS51c2VyRGVmLT5nZXRTdHJ1Y3QoKSk7CisgICAgICAgICAgICAgICAgdHlwZS0+c2V0VHlwZU5hbWUoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtLnR5cGUpLnVzZXJEZWYtPmdldFR5cGVOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE0MToKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlTGlzdCkgPSBOZXdQb29sVFR5cGVMaXN0KCk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZUxpc3QpLT5wdXNoX2JhY2soKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLnR5cGVMaW5lKSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE0MjoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlTGlzdCktPnB1c2hfYmFjaygoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0udHlwZUxpbmUpKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTQzOgorCisgICAgeworICAgICAgICBpZiAoY29udGV4dC0+cmVzZXJ2ZWRFcnJvckNoZWNrKCh5eXZzcFsoMSkgLSAoMSldLmxleCkubGluZSwgKih5eXZzcFsoMSkgLSAoMSldLmxleCkuc3RyaW5nKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGVMaW5lKS50eXBlID0gbmV3IFRUeXBlKEVidFZvaWQsIEVicFVuZGVmaW5lZCk7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZUxpbmUpLmxpbmUgPSAoeXl2c3BbKDEpIC0gKDEpXS5sZXgpLmxpbmU7CisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZUxpbmUpLnR5cGUtPnNldEZpZWxkTmFtZSgqKHl5dnNwWygxKSAtICgxKV0ubGV4KS5zdHJpbmcpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDQ6CisKKyAgICB7CisgICAgICAgIGlmIChjb250ZXh0LT5yZXNlcnZlZEVycm9yQ2hlY2soKHl5dnNwWygxKSAtICg0KV0ubGV4KS5saW5lLCAqKHl5dnNwWygxKSAtICg0KV0ubGV4KS5zdHJpbmcpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgICh5eXZhbC5pbnRlcm0udHlwZUxpbmUpLnR5cGUgPSBuZXcgVFR5cGUoRWJ0Vm9pZCwgRWJwVW5kZWZpbmVkKTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlTGluZSkubGluZSA9ICh5eXZzcFsoMSkgLSAoNCldLmxleCkubGluZTsKKyAgICAgICAgKHl5dmFsLmludGVybS50eXBlTGluZSkudHlwZS0+c2V0RmllbGROYW1lKCooeXl2c3BbKDEpIC0gKDQpXS5sZXgpLnN0cmluZyk7CisKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGlmIChjb250ZXh0LT5hcnJheVNpemVFcnJvckNoZWNrKCh5eXZzcFsoMikgLSAoNCldLmxleCkubGluZSwgKHl5dnNwWygzKSAtICg0KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksIHNpemUpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAoeXl2YWwuaW50ZXJtLnR5cGVMaW5lKS50eXBlLT5zZXRBcnJheVNpemUoc2l6ZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE0NToKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1UeXBlZE5vZGUpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDY6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtTm9kZSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDc6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtQWdncmVnYXRlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE0ODoKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1Ob2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE0OToKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1Ob2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE1MDoKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1Ob2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE1MToKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1Ob2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE1MjoKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1Ob2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE1MzoKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1Ob2RlKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE1NDoKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1BZ2dyZWdhdGUpID0gMDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE1NToKKworICAgIHsgY29udGV4dC0+c3ltYm9sVGFibGUucHVzaCgpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTU2OgorCisgICAgeyBjb250ZXh0LT5zeW1ib2xUYWJsZS5wb3AoKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE1NzoKKworICAgIHsKKyAgICAgICAgaWYgKCh5eXZzcFsoMykgLSAoNSldLmludGVybS5pbnRlcm1BZ2dyZWdhdGUpICE9IDApIHsKKyAgICAgICAgICAgICh5eXZzcFsoMykgLSAoNSldLmludGVybS5pbnRlcm1BZ2dyZWdhdGUpLT5zZXRPcChFT3BTZXF1ZW5jZSk7CisgICAgICAgICAgICAoeXl2c3BbKDMpIC0gKDUpXS5pbnRlcm0uaW50ZXJtQWdncmVnYXRlKS0+c2V0RW5kTGluZSgoeXl2c3BbKDUpIC0gKDUpXS5sZXgpLmxpbmUpOworICAgICAgICB9CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtQWdncmVnYXRlKSA9ICh5eXZzcFsoMykgLSAoNSldLmludGVybS5pbnRlcm1BZ2dyZWdhdGUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNTg6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtTm9kZSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNTk6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtTm9kZSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjA6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSAwOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjE6CisKKyAgICB7CisgICAgICAgIGlmICgoeXl2c3BbKDIpIC0gKDMpXS5pbnRlcm0uaW50ZXJtQWdncmVnYXRlKSkgeworICAgICAgICAgICAgKHl5dnNwWygyKSAtICgzKV0uaW50ZXJtLmludGVybUFnZ3JlZ2F0ZSktPnNldE9wKEVPcFNlcXVlbmNlKTsKKyAgICAgICAgICAgICh5eXZzcFsoMikgLSAoMyldLmludGVybS5pbnRlcm1BZ2dyZWdhdGUpLT5zZXRFbmRMaW5lKCh5eXZzcFsoMykgLSAoMyldLmxleCkubGluZSk7CisgICAgICAgIH0KKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9ICh5eXZzcFsoMikgLSAoMyldLmludGVybS5pbnRlcm1BZ2dyZWdhdGUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjI6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtQWdncmVnYXRlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5tYWtlQWdncmVnYXRlKCh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1Ob2RlKSwgMCk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE2MzoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1BZ2dyZWdhdGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUoKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmludGVybUFnZ3JlZ2F0ZSksICh5eXZzcFsoMikgLSAoMildLmludGVybS5pbnRlcm1Ob2RlKSwgMCk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE2NDoKKworICAgIHsgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9IDA7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjU6CisKKyAgICB7ICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSBzdGF0aWNfY2FzdDxUSW50ZXJtTm9kZSo+KCh5eXZzcFsoMSkgLSAoMildLmludGVybS5pbnRlcm1UeXBlZE5vZGUpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE2NjoKKworICAgIHsKKyAgICAgICAgaWYgKGNvbnRleHQtPmJvb2xFcnJvckNoZWNrKCh5eXZzcFsoMSkgLSAoNSldLmxleCkubGluZSwgKHl5dnNwWygzKSAtICg1KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSkpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFNlbGVjdGlvbigoeXl2c3BbKDMpIC0gKDUpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWyg1KSAtICg1KV0uaW50ZXJtLm5vZGVQYWlyKSwgKHl5dnNwWygxKSAtICg1KV0ubGV4KS5saW5lKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTY3OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLm5vZGVQYWlyKS5ub2RlMSA9ICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1Ob2RlKTsKKyAgICAgICAgKHl5dmFsLmludGVybS5ub2RlUGFpcikubm9kZTIgPSAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtTm9kZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE2ODoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5ub2RlUGFpcikubm9kZTEgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtTm9kZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0ubm9kZVBhaXIpLm5vZGUyID0gMDsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTY5OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICAgICAgaWYgKGNvbnRleHQtPmJvb2xFcnJvckNoZWNrKCh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLT5nZXRMaW5lKCksICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTcwOgorCisgICAgeworICAgICAgICBUSW50ZXJtTm9kZSogaW50ZXJtTm9kZTsKKyAgICAgICAgaWYgKGNvbnRleHQtPnN0cnVjdFF1YWxpZmllckVycm9yQ2hlY2soKHl5dnNwWygyKSAtICg0KV0ubGV4KS5saW5lLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0udHlwZSkpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICBpZiAoY29udGV4dC0+Ym9vbEVycm9yQ2hlY2soKHl5dnNwWygyKSAtICg0KV0ubGV4KS5saW5lLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0udHlwZSkpKQorICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworCisgICAgICAgIGlmICghY29udGV4dC0+ZXhlY3V0ZUluaXRpYWxpemVyKCh5eXZzcFsoMikgLSAoNCldLmxleCkubGluZSwgKih5eXZzcFsoMikgLSAoNCldLmxleCkuc3RyaW5nLCAoeXl2c3BbKDEpIC0gKDQpXS5pbnRlcm0udHlwZSksICh5eXZzcFsoNCkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpLCBpbnRlcm1Ob2RlKSkKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9ICh5eXZzcFsoNCkgLSAoNCldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSA9IDA7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTcxOgorCisgICAgeyBjb250ZXh0LT5zeW1ib2xUYWJsZS5wdXNoKCk7ICsrY29udGV4dC0+bG9vcE5lc3RpbmdMZXZlbDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE3MjoKKworICAgIHsKKyAgICAgICAgY29udGV4dC0+c3ltYm9sVGFibGUucG9wKCk7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkTG9vcChFTG9vcFdoaWxlLCAwLCAoeXl2c3BbKDQpIC0gKDYpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgMCwgKHl5dnNwWyg2KSAtICg2KV0uaW50ZXJtLmludGVybU5vZGUpLCAoeXl2c3BbKDEpIC0gKDYpXS5sZXgpLmxpbmUpOworICAgICAgICAtLWNvbnRleHQtPmxvb3BOZXN0aW5nTGV2ZWw7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE3MzoKKworICAgIHsgKytjb250ZXh0LT5sb29wTmVzdGluZ0xldmVsOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTc0OgorCisgICAgeworICAgICAgICBpZiAoY29udGV4dC0+Ym9vbEVycm9yQ2hlY2soKHl5dnNwWyg4KSAtICg4KV0ubGV4KS5saW5lLCAoeXl2c3BbKDYpIC0gKDgpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSkpCisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRMb29wKEVMb29wRG9XaGlsZSwgMCwgKHl5dnNwWyg2KSAtICg4KV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSksIDAsICh5eXZzcFsoMykgLSAoOCldLmludGVybS5pbnRlcm1Ob2RlKSwgKHl5dnNwWyg0KSAtICg4KV0ubGV4KS5saW5lKTsKKyAgICAgICAgLS1jb250ZXh0LT5sb29wTmVzdGluZ0xldmVsOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNzU6CisKKyAgICB7IGNvbnRleHQtPnN5bWJvbFRhYmxlLnB1c2goKTsgKytjb250ZXh0LT5sb29wTmVzdGluZ0xldmVsOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTc2OgorCisgICAgeworICAgICAgICBjb250ZXh0LT5zeW1ib2xUYWJsZS5wb3AoKTsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRMb29wKEVMb29wRm9yLCAoeXl2c3BbKDQpIC0gKDcpXS5pbnRlcm0uaW50ZXJtTm9kZSksIHJlaW50ZXJwcmV0X2Nhc3Q8VEludGVybVR5cGVkKj4oKHl5dnNwWyg1KSAtICg3KV0uaW50ZXJtLm5vZGVQYWlyKS5ub2RlMSksIHJlaW50ZXJwcmV0X2Nhc3Q8VEludGVybVR5cGVkKj4oKHl5dnNwWyg1KSAtICg3KV0uaW50ZXJtLm5vZGVQYWlyKS5ub2RlMiksICh5eXZzcFsoNykgLSAoNyldLmludGVybS5pbnRlcm1Ob2RlKSwgKHl5dnNwWygxKSAtICg3KV0ubGV4KS5saW5lKTsKKyAgICAgICAgLS1jb250ZXh0LT5sb29wTmVzdGluZ0xldmVsOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNzc6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtTm9kZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE3ODoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1Ob2RlKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTc5OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTgwOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybVR5cGVkTm9kZSkgPSAwOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxODE6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0ubm9kZVBhaXIpLm5vZGUxID0gKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSk7CisgICAgICAgICh5eXZhbC5pbnRlcm0ubm9kZVBhaXIpLm5vZGUyID0gMDsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTgyOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLm5vZGVQYWlyKS5ub2RlMSA9ICh5eXZzcFsoMSkgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLm5vZGVQYWlyKS5ub2RlMiA9ICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1UeXBlZE5vZGUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxODM6CisKKyAgICB7CisgICAgICAgIGlmIChjb250ZXh0LT5sb29wTmVzdGluZ0xldmVsIDw9IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMSkgLSAoMildLmxleCkubGluZSwgImNvbnRpbnVlIHN0YXRlbWVudCBvbmx5IGFsbG93ZWQgaW4gbG9vcHMiLCAiIiwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQnJhbmNoKEVPcENvbnRpbnVlLCAoeXl2c3BbKDEpIC0gKDIpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxODQ6CisKKyAgICB7CisgICAgICAgIGlmIChjb250ZXh0LT5sb29wTmVzdGluZ0xldmVsIDw9IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMSkgLSAoMildLmxleCkubGluZSwgImJyZWFrIHN0YXRlbWVudCBvbmx5IGFsbG93ZWQgaW4gbG9vcHMiLCAiIiwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQnJhbmNoKEVPcEJyZWFrLCAoeXl2c3BbKDEpIC0gKDIpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxODU6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkQnJhbmNoKEVPcFJldHVybiwgKHl5dnNwWygxKSAtICgyKV0ubGV4KS5saW5lKTsKKyAgICAgICAgaWYgKGNvbnRleHQtPmN1cnJlbnRGdW5jdGlvblR5cGUtPmdldEJhc2ljVHlwZSgpICE9IEVidFZvaWQpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycm9yKCh5eXZzcFsoMSkgLSAoMildLmxleCkubGluZSwgIm5vbi12b2lkIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUiLCAicmV0dXJuIiwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE4NjoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5hZGRCcmFuY2goRU9wUmV0dXJuLCAoeXl2c3BbKDIpIC0gKDMpXS5pbnRlcm0uaW50ZXJtVHlwZWROb2RlKSwgKHl5dnNwWygxKSAtICgzKV0ubGV4KS5saW5lKTsKKyAgICAgICAgY29udGV4dC0+ZnVuY3Rpb25SZXR1cm5zVmFsdWUgPSB0cnVlOworICAgICAgICBpZiAoY29udGV4dC0+Y3VycmVudEZ1bmN0aW9uVHlwZS0+Z2V0QmFzaWNUeXBlKCkgPT0gRWJ0Vm9pZCkgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygxKSAtICgzKV0ubGV4KS5saW5lLCAidm9pZCBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIGEgdmFsdWUiLCAicmV0dXJuIiwgIiIpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9IGVsc2UgaWYgKCooY29udGV4dC0+Y3VycmVudEZ1bmN0aW9uVHlwZSkgIT0gKHl5dnNwWygyKSAtICgzKV0uaW50ZXJtLmludGVybVR5cGVkTm9kZSktPmdldFR5cGUoKSkgeworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygxKSAtICgzKV0ubGV4KS5saW5lLCAiZnVuY3Rpb24gcmV0dXJuIGlzIG5vdCBtYXRjaGluZyB0eXBlOiIsICJyZXR1cm4iLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTg3OgorCisgICAgeworICAgICAgICBGUkFHX09OTFkoImRpc2NhcmQiLCAoeXl2c3BbKDEpIC0gKDIpXS5sZXgpLmxpbmUpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZEJyYW5jaChFT3BLaWxsLCAoeXl2c3BbKDEpIC0gKDIpXS5sZXgpLmxpbmUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxODg6CisKKyAgICB7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0uaW50ZXJtTm9kZSk7CisgICAgICAgIGNvbnRleHQtPnRyZWVSb290ID0gKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTg5OgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUoKHl5dnNwWygxKSAtICgyKV0uaW50ZXJtLmludGVybU5vZGUpLCAoeXl2c3BbKDIpIC0gKDIpXS5pbnRlcm0uaW50ZXJtTm9kZSksIDApOworICAgICAgICBjb250ZXh0LT50cmVlUm9vdCA9ICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSk7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE5MDoKKworICAgIHsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVybS5pbnRlcm1Ob2RlKTsKKyAgICA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTkxOgorCisgICAgeworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtLmludGVybU5vZGUpOworICAgIDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOTI6CisKKyAgICB7CisgICAgICAgIFRGdW5jdGlvbiogZnVuY3Rpb24gPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLmZ1bmN0aW9uOworICAgICAgICBURnVuY3Rpb24qIHByZXZEZWMgPSBzdGF0aWNfY2FzdDxURnVuY3Rpb24qPihjb250ZXh0LT5zeW1ib2xUYWJsZS5maW5kKGZ1bmN0aW9uLT5nZXRNYW5nbGVkTmFtZSgpKSk7CisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGU6ICAncHJldkRlYycgY291bGQgYmUgJ2Z1bmN0aW9uJyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gZnVuY3Rpb24KKyAgICAgICAgLy8gYXMgaXQgd291bGQgaGF2ZSBqdXN0IGJlZW4gcHV0IGluIHRoZSBzeW1ib2wgdGFibGUuICBPdGhlcndpc2UsIHdlJ3JlIGxvb2tpbmcgdXAKKyAgICAgICAgLy8gYW4gZWFybGllciBvY2N1cmFuY2UuCisgICAgICAgIC8vCisgICAgICAgIGlmIChwcmV2RGVjLT5pc0RlZmluZWQoKSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoZW4gdGhpcyBmdW5jdGlvbiBhbHJlYWR5IGhhcyBhIGJvZHkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5saW5lLCAiZnVuY3Rpb24gYWxyZWFkeSBoYXMgYSBib2R5IiwgZnVuY3Rpb24tPmdldE5hbWUoKS5jX3N0cigpLCAiIik7CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvdmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcHJldkRlYy0+c2V0RGVmaW5lZCgpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJhaXNlIGVycm9yIG1lc3NhZ2UgaWYgbWFpbiBmdW5jdGlvbiB0YWtlcyBhbnkgcGFyYW1ldGVycyBvciByZXR1cm4gYW55dGhpbmcgb3RoZXIgdGhhbiB2b2lkCisgICAgICAgIC8vCisgICAgICAgIGlmIChmdW5jdGlvbi0+Z2V0TmFtZSgpID09ICJtYWluIikgeworICAgICAgICAgICAgaWYgKGZ1bmN0aW9uLT5nZXRQYXJhbUNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5saW5lLCAiZnVuY3Rpb24gY2Fubm90IHRha2UgYW55IHBhcmFtZXRlcihzKSIsIGZ1bmN0aW9uLT5nZXROYW1lKCkuY19zdHIoKSwgIiIpOworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmdW5jdGlvbi0+Z2V0UmV0dXJuVHlwZSgpLmdldEJhc2ljVHlwZSgpICE9IEVidFZvaWQpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLmxpbmUsICIiLCBmdW5jdGlvbi0+Z2V0UmV0dXJuVHlwZSgpLmdldEJhc2ljU3RyaW5nKCksICJtYWluIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYSB2YWx1ZSIpOworICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIE5ldyBzeW1ib2wgdGFibGUgc2NvcGUgZm9yIGJvZHkgb2YgZnVuY3Rpb24gcGx1cyBpdHMgYXJndW1lbnRzCisgICAgICAgIC8vCisgICAgICAgIGNvbnRleHQtPnN5bWJvbFRhYmxlLnB1c2goKTsKKworICAgICAgICAvLworICAgICAgICAvLyBSZW1lbWJlciB0aGUgcmV0dXJuIHR5cGUgZm9yIGxhdGVyIGNoZWNraW5nIGZvciBSRVRVUk4gc3RhdGVtZW50cy4KKyAgICAgICAgLy8KKyAgICAgICAgY29udGV4dC0+Y3VycmVudEZ1bmN0aW9uVHlwZSA9ICYocHJldkRlYy0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgY29udGV4dC0+ZnVuY3Rpb25SZXR1cm5zVmFsdWUgPSBmYWxzZTsKKworICAgICAgICAvLworICAgICAgICAvLyBJbnNlcnQgcGFyYW1ldGVycyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCisgICAgICAgIC8vIElmIHRoZSBwYXJhbWV0ZXIgaGFzIG5vIG5hbWUsIGl0J3Mgbm90IGFuIGVycm9yLCBqdXN0IGRvbid0IGluc2VydCBpdAorICAgICAgICAvLyAoY291bGQgYmUgdXNlZCBmb3IgdW51c2VkIGFyZ3MpLgorICAgICAgICAvLworICAgICAgICAvLyBBbHNvLCBhY2N1bXVsYXRlIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgaW50byB0aGUgSElMLCBzbyBsb3dlciBsZXZlbCBjb2RlCisgICAgICAgIC8vIGtub3dzIHdoZXJlIHRvIGZpbmQgcGFyYW1ldGVycy4KKyAgICAgICAgLy8KKyAgICAgICAgVEludGVybUFnZ3JlZ2F0ZSogcGFyYW1Ob2RlcyA9IG5ldyBUSW50ZXJtQWdncmVnYXRlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLT5nZXRQYXJhbUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgVFBhcmFtZXRlciYgcGFyYW0gPSBmdW5jdGlvbi0+Z2V0UGFyYW0oaSk7CisgICAgICAgICAgICBpZiAocGFyYW0ubmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgVFZhcmlhYmxlICp2YXJpYWJsZSA9IG5ldyBUVmFyaWFibGUocGFyYW0ubmFtZSwgKnBhcmFtLnR5cGUpOworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBwYXJhbWV0ZXJzIHdpdGggbmFtZSBpbiB0aGUgc3ltYm9sIHRhYmxlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKCEgY29udGV4dC0+c3ltYm9sVGFibGUuaW5zZXJ0KCp2YXJpYWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IoKHl5dnNwWygxKSAtICgxKV0uaW50ZXJtKS5saW5lLCAicmVkZWZpbml0aW9uIiwgdmFyaWFibGUtPmdldE5hbWUoKS5jX3N0cigpLCAiIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY292ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZhcmlhYmxlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIEhJTAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgcGFyYW1Ob2RlcyA9IGNvbnRleHQtPmludGVybWVkaWF0ZS5ncm93QWdncmVnYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5pbnRlcm1lZGlhdGUuYWRkU3ltYm9sKHZhcmlhYmxlLT5nZXRVbmlxdWVJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS0+Z2V0VHlwZSgpLCAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLmxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlcm0pLmxpbmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbU5vZGVzID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUocGFyYW1Ob2RlcywgY29udGV4dC0+aW50ZXJtZWRpYXRlLmFkZFN5bWJvbCgwLCAiIiwgKnBhcmFtLnR5cGUsICh5eXZzcFsoMSkgLSAoMSldLmludGVybSkubGluZSksICh5eXZzcFsoMSkgLSAoMSldLmludGVybSkubGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udGV4dC0+aW50ZXJtZWRpYXRlLnNldEFnZ3JlZ2F0ZU9wZXJhdG9yKHBhcmFtTm9kZXMsIEVPcFBhcmFtZXRlcnMsICh5eXZzcFsoMSkgLSAoMSldLmludGVybSkubGluZSk7CisgICAgICAgICh5eXZzcFsoMSkgLSAoMSldLmludGVybSkuaW50ZXJtQWdncmVnYXRlID0gcGFyYW1Ob2RlczsKKyAgICAgICAgY29udGV4dC0+bG9vcE5lc3RpbmdMZXZlbCA9IDA7CisgICAgO30KKyAgICBicmVhazsKKworICBjYXNlIDE5MzoKKworICAgIHsKKyAgICAgICAgLy8/PyBDaGVjayB0aGF0IGFsbCBwYXRocyByZXR1cm4gYSB2YWx1ZSBpZiByZXR1cm4gdHlwZSAhPSB2b2lkID8KKyAgICAgICAgLy8gICBNYXkgYmUgYmVzdCBkb25lIGFzIHBvc3QgcHJvY2VzcyBwaGFzZSBvbiBpbnRlcm1lZGlhdGUgY29kZQorICAgICAgICBpZiAoY29udGV4dC0+Y3VycmVudEZ1bmN0aW9uVHlwZS0+Z2V0QmFzaWNUeXBlKCkgIT0gRWJ0Vm9pZCAmJiAhIGNvbnRleHQtPmZ1bmN0aW9uUmV0dXJuc1ZhbHVlKSB7CisgICAgICAgICAgICBjb250ZXh0LT5lcnJvcigoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0pLmxpbmUsICJmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZToiLCAiIiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtKS5mdW5jdGlvbi0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgY29udGV4dC0+cmVjb3ZlcigpOworICAgICAgICB9CisgICAgICAgIGNvbnRleHQtPnN5bWJvbFRhYmxlLnBvcCgpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpID0gY29udGV4dC0+aW50ZXJtZWRpYXRlLmdyb3dBZ2dyZWdhdGUoKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtKS5pbnRlcm1BZ2dyZWdhdGUsICh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1Ob2RlKSwgMCk7CisgICAgICAgIGNvbnRleHQtPmludGVybWVkaWF0ZS5zZXRBZ2dyZWdhdGVPcGVyYXRvcigoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpLCBFT3BGdW5jdGlvbiwgKHl5dnNwWygxKSAtICgzKV0uaW50ZXJtKS5saW5lKTsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKS0+Z2V0QXNBZ2dyZWdhdGUoKS0+c2V0TmFtZSgoeXl2c3BbKDEpIC0gKDMpXS5pbnRlcm0pLmZ1bmN0aW9uLT5nZXRNYW5nbGVkTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpLT5nZXRBc0FnZ3JlZ2F0ZSgpLT5zZXRUeXBlKCh5eXZzcFsoMSkgLSAoMyldLmludGVybSkuZnVuY3Rpb24tPmdldFJldHVyblR5cGUoKSk7CisKKyAgICAgICAgLy8gc3RvcmUgdGhlIHByYWdtYSBpbmZvcm1hdGlvbiBmb3IgZGVidWcgYW5kIG9wdGltaXplIGFuZCBvdGhlciB2ZW5kb3Igc3BlY2lmaWMKKyAgICAgICAgLy8gaW5mb3JtYXRpb24uIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHF1ZXJpZWQgZnJvbSB0aGUgcGFyc2UgdHJlZQorICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpLT5nZXRBc0FnZ3JlZ2F0ZSgpLT5zZXRPcHRpbWl6ZShjb250ZXh0LT5jb250ZXh0UHJhZ21hLm9wdGltaXplKTsKKyAgICAgICAgKHl5dmFsLmludGVybS5pbnRlcm1Ob2RlKS0+Z2V0QXNBZ2dyZWdhdGUoKS0+c2V0RGVidWcoY29udGV4dC0+Y29udGV4dFByYWdtYS5kZWJ1Zyk7CisgICAgICAgICh5eXZhbC5pbnRlcm0uaW50ZXJtTm9kZSktPmdldEFzQWdncmVnYXRlKCktPmFkZFRvUHJhZ21hVGFibGUoY29udGV4dC0+Y29udGV4dFByYWdtYS5wcmFnbWFUYWJsZSk7CisKKyAgICAgICAgaWYgKCh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1Ob2RlKSAmJiAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlcm0uaW50ZXJtTm9kZSktPmdldEFzQWdncmVnYXRlKCkpCisgICAgICAgICAgICAoeXl2YWwuaW50ZXJtLmludGVybU5vZGUpLT5nZXRBc0FnZ3JlZ2F0ZSgpLT5zZXRFbmRMaW5lKCh5eXZzcFsoMykgLSAoMyldLmludGVybS5pbnRlcm1Ob2RlKS0+Z2V0QXNBZ2dyZWdhdGUoKS0+Z2V0RW5kTGluZSgpKTsKKyAgICA7fQorICAgIGJyZWFrOworCisKKy8qIExpbmUgMTI2NyBvZiB5YWNjLmMuICAqLworCisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgIFlZX1NZTUJPTF9QUklOVCAoIi0+ICQkID0iLCB5eXIxW3l5bl0sICZ5eXZhbCwgJnl5bG9jKTsKKworICBZWVBPUFNUQUNLICh5eWxlbik7CisgIHl5bGVuID0gMDsKKyAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKworICAqKyt5eXZzcCA9IHl5dmFsOworCisKKyAgLyogTm93IGBzaGlmdCcgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLiAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUKKyAgICAgdGhhdCBnb2VzIHRvLCBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8gYW5kIHRoZSBydWxlCisgICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KKworICB5eW4gPSB5eXIxW3l5bl07CisKKyAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVE9LRU5TXSArICp5eXNzcDsKKyAgaWYgKDAgPD0geXlzdGF0ZSAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKKyAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKKyAgZWxzZQorICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVE9LRU5TXTsKKworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWI6CisgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLworICBpZiAoIXl5ZXJyc3RhdHVzKQorICAgIHsKKyAgICAgICsreXluZXJyczsKKyNpZiAhIFlZRVJST1JfVkVSQk9TRQorICAgICAgeXllcnJvciAoY29udGV4dCwgWVlfKCJzeW50YXggZXJyb3IiKSk7CisjZWxzZQorICAgICAgeworCVlZU0laRV9UIHl5c2l6ZSA9IHl5c3ludGF4X2Vycm9yICgwLCB5eXN0YXRlLCB5eWNoYXIpOworCWlmICh5eW1zZ19hbGxvYyA8IHl5c2l6ZSAmJiB5eW1zZ19hbGxvYyA8IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkKKwkgIHsKKwkgICAgWVlTSVpFX1QgeXlhbGxvYyA9IDIgKiB5eXNpemU7CisJICAgIGlmICghICh5eXNpemUgPD0geXlhbGxvYyAmJiB5eWFsbG9jIDw9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkpCisJICAgICAgeXlhbGxvYyA9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTTsKKwkgICAgaWYgKHl5bXNnICE9IHl5bXNnYnVmKQorCSAgICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOworCSAgICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5YWxsb2MpOworCSAgICBpZiAoeXltc2cpCisJICAgICAgeXltc2dfYWxsb2MgPSB5eWFsbG9jOworCSAgICBlbHNlCisJICAgICAgeworCQl5eW1zZyA9IHl5bXNnYnVmOworCQl5eW1zZ19hbGxvYyA9IHNpemVvZiB5eW1zZ2J1ZjsKKwkgICAgICB9CisJICB9CisKKwlpZiAoMCA8IHl5c2l6ZSAmJiB5eXNpemUgPD0geXltc2dfYWxsb2MpCisJICB7CisJICAgICh2b2lkKSB5eXN5bnRheF9lcnJvciAoeXltc2csIHl5c3RhdGUsIHl5Y2hhcik7CisJICAgIHl5ZXJyb3IgKGNvbnRleHQsIHl5bXNnKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHl5ZXJyb3IgKGNvbnRleHQsIFlZXygic3ludGF4IGVycm9yIikpOworCSAgICBpZiAoeXlzaXplICE9IDApCisJICAgICAgZ290byB5eWV4aGF1c3RlZGxhYjsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworCisKKyAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCisgICAgeworICAgICAgLyogSWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2stYWhlYWQgdG9rZW4gYWZ0ZXIgYW4KKwkgZXJyb3IsIGRpc2NhcmQgaXQuICAqLworCisgICAgICBpZiAoeXljaGFyIDw9IFlZRU9GKQorCXsKKwkgIC8qIFJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dC4gICovCisJICBpZiAoeXljaGFyID09IFlZRU9GKQorCSAgICBZWUFCT1JUOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB5eWRlc3RydWN0ICgiRXJyb3I6IGRpc2NhcmRpbmciLAorCQkgICAgICB5eXRva2VuLCAmeXlsdmFsLCBjb250ZXh0KTsKKwkgIHl5Y2hhciA9IFlZRU1QVFk7CisJfQorICAgIH0KKworICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2stYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisgICAgIHRva2VuLiAgKi8KKyAgZ290byB5eWVycmxhYjE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJyb3JsYWIgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgWVlFUlJPUi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJvcmxhYjoKKworICAvKiBQYWNpZnkgY29tcGlsZXJzIGxpa2UgR0NDIHdoZW4gdGhlIHVzZXIgY29kZSBuZXZlciBpbnZva2VzCisgICAgIFlZRVJST1IgYW5kIHRoZSBsYWJlbCB5eWVycm9ybGFiIHRoZXJlZm9yZSBuZXZlciBhcHBlYXJzIGluIHVzZXIKKyAgICAgY29kZS4gICovCisgIGlmICgvKkNPTlNUQ09ORCovIDApCisgICAgIGdvdG8geXllcnJvcmxhYjsKKworICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCisgICAgIHRoaXMgWVlFUlJPUi4gICovCisgIFlZUE9QU1RBQ0sgKHl5bGVuKTsKKyAgeXlsZW4gPSAwOworICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOworICB5eXN0YXRlID0gKnl5c3NwOworICBnb3RvIHl5ZXJybGFiMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiMSAtLSBjb21tb24gY29kZSBmb3IgYm90aCBzeW50YXggZXJyb3IgYW5kIFlZRVJST1IuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycmxhYjE6CisgIHl5ZXJyc3RhdHVzID0gMzsJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzLiAgKi8KKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgICAgIGlmICh5eW4gIT0gWVlQQUNUX05JTkYpCisJeworCSAgeXluICs9IFlZVEVSUk9SOworCSAgaWYgKDAgPD0geXluICYmIHl5biA8PSBZWUxBU1QgJiYgeXljaGVja1t5eW5dID09IFlZVEVSUk9SKQorCSAgICB7CisJICAgICAgeXluID0geXl0YWJsZVt5eW5dOworCSAgICAgIGlmICgwIDwgeXluKQorCQlicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogUG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4uICAqLworICAgICAgaWYgKHl5c3NwID09IHl5c3MpCisJWVlBQk9SVDsKKworCisgICAgICB5eWRlc3RydWN0ICgiRXJyb3I6IHBvcHBpbmciLAorCQkgIHl5c3Rvc1t5eXN0YXRlXSwgeXl2c3AsIGNvbnRleHQpOworICAgICAgWVlQT1BTVEFDSyAoMSk7CisgICAgICB5eXN0YXRlID0gKnl5c3NwOworICAgICAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKyAgICB9CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgICorK3l5dnNwID0geXlsdmFsOworCisKKyAgLyogU2hpZnQgdGhlIGVycm9yIHRva2VuLiAgKi8KKyAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXN0b3NbeXluXSwgeXl2c3AsIHl5bHNwKTsKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWFjY2VwdGxhYiAtLSBZWUFDQ0VQVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhY2NlcHRsYWI6CisgIHl5cmVzdWx0ID0gMDsKKyAgZ290byB5eXJldHVybjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhYm9ydGxhYiAtLSBZWUFCT1JUIGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhYm9ydGxhYjoKKyAgeXlyZXN1bHQgPSAxOworICBnb3RvIHl5cmV0dXJuOworCisjaWZuZGVmIHl5b3ZlcmZsb3cKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlleGhhdXN0ZWRsYWIgLS0gbWVtb3J5IGV4aGF1c3Rpb24gY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXhoYXVzdGVkbGFiOgorICB5eWVycm9yIChjb250ZXh0LCBZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7CisgIHl5cmVzdWx0ID0gMjsKKyAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyNlbmRpZgorCit5eXJldHVybjoKKyAgaWYgKHl5Y2hhciAhPSBZWUVPRiAmJiB5eWNoYXIgIT0gWVlFTVBUWSkKKyAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKKwkJIHl5dG9rZW4sICZ5eWx2YWwsIGNvbnRleHQpOworICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCisgICAgIHRoaXMgWVlBQk9SVCBvciBZWUFDQ0VQVC4gICovCisgIFlZUE9QU1RBQ0sgKHl5bGVuKTsKKyAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKyAgd2hpbGUgKHl5c3NwICE9IHl5c3MpCisgICAgeworICAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IHBvcHBpbmciLAorCQkgIHl5c3Rvc1sqeXlzc3BdLCB5eXZzcCwgY29udGV4dCk7CisgICAgICBZWVBPUFNUQUNLICgxKTsKKyAgICB9CisjaWZuZGVmIHl5b3ZlcmZsb3cKKyAgaWYgKHl5c3MgIT0geXlzc2EpCisgICAgWVlTVEFDS19GUkVFICh5eXNzKTsKKyNlbmRpZgorI2lmIFlZRVJST1JfVkVSQk9TRQorICBpZiAoeXltc2cgIT0geXltc2didWYpCisgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7CisjZW5kaWYKKyAgLyogTWFrZSBzdXJlIFlZSUQgaXMgdXNlZC4gICovCisgIHJldHVybiBZWUlEICh5eXJlc3VsdCk7Cit9CisKKworCisKKworaW50IGdsc2xhbmdfcGFyc2UoVFBhcnNlQ29udGV4dCogY29udGV4dCkgeworICAgIHJldHVybiB5eXBhcnNlKGNvbnRleHQpOworfQorCisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2dsc2xhbmdfdGFiLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nbHNsYW5nX3RhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODQ4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9nbHNsYW5nX3RhYi5oCkBAIC0wLDAgKzEsMjc0IEBACisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi4zLiAgKi8KKworLyogU2tlbGV0b24gaW50ZXJmYWNlIGZvciBCaXNvbidzIFlhY2MtbGlrZSBwYXJzZXJzIGluIEMKKworICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKKyAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCisgICB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgc28gbG9uZyBhcyB0aGF0IHdvcmsgaXNuJ3QgaXRzZWxmIGEKKyAgIHBhcnNlciBnZW5lcmF0b3IgdXNpbmcgdGhlIHNrZWxldG9uIG9yIGEgbW9kaWZpZWQgdmVyc2lvbiB0aGVyZW9mCisgICBhcyBhIHBhcnNlciBza2VsZXRvbi4gIEFsdGVybmF0aXZlbHksIGlmIHlvdSBtb2RpZnkgb3IgcmVkaXN0cmlidXRlCisgICB0aGUgcGFyc2VyIHNrZWxldG9uIGl0c2VsZiwgeW91IG1heSAoYXQgeW91ciBvcHRpb24pIHJlbW92ZSB0aGlzCisgICBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgc2tlbGV0b24gYW5kIHRoZSByZXN1bHRpbmcKKyAgIEJpc29uIG91dHB1dCBmaWxlcyB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIHdpdGhvdXQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbi4KKworICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbgorICAgdmVyc2lvbiAyLjIgb2YgQmlzb24uICAqLworCisvKiBUb2tlbnMuICAqLworI2lmbmRlZiBZWVRPS0VOVFlQRQorIyBkZWZpbmUgWVlUT0tFTlRZUEUKKyAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycworICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KKyAgIGVudW0geXl0b2tlbnR5cGUgeworICAgICBJTlZBUklBTlQgPSAyNTgsCisgICAgIEhJR0hfUFJFQ0lTSU9OID0gMjU5LAorICAgICBNRURJVU1fUFJFQ0lTSU9OID0gMjYwLAorICAgICBMT1dfUFJFQ0lTSU9OID0gMjYxLAorICAgICBQUkVDSVNJT04gPSAyNjIsCisgICAgIEFUVFJJQlVURSA9IDI2MywKKyAgICAgQ09OU1RfUVVBTCA9IDI2NCwKKyAgICAgQk9PTF9UWVBFID0gMjY1LAorICAgICBGTE9BVF9UWVBFID0gMjY2LAorICAgICBJTlRfVFlQRSA9IDI2NywKKyAgICAgQlJFQUsgPSAyNjgsCisgICAgIENPTlRJTlVFID0gMjY5LAorICAgICBETyA9IDI3MCwKKyAgICAgRUxTRSA9IDI3MSwKKyAgICAgRk9SID0gMjcyLAorICAgICBJRiA9IDI3MywKKyAgICAgRElTQ0FSRCA9IDI3NCwKKyAgICAgUkVUVVJOID0gMjc1LAorICAgICBCVkVDMiA9IDI3NiwKKyAgICAgQlZFQzMgPSAyNzcsCisgICAgIEJWRUM0ID0gMjc4LAorICAgICBJVkVDMiA9IDI3OSwKKyAgICAgSVZFQzMgPSAyODAsCisgICAgIElWRUM0ID0gMjgxLAorICAgICBWRUMyID0gMjgyLAorICAgICBWRUMzID0gMjgzLAorICAgICBWRUM0ID0gMjg0LAorICAgICBNQVRSSVgyID0gMjg1LAorICAgICBNQVRSSVgzID0gMjg2LAorICAgICBNQVRSSVg0ID0gMjg3LAorICAgICBJTl9RVUFMID0gMjg4LAorICAgICBPVVRfUVVBTCA9IDI4OSwKKyAgICAgSU5PVVRfUVVBTCA9IDI5MCwKKyAgICAgVU5JRk9STSA9IDI5MSwKKyAgICAgVkFSWUlORyA9IDI5MiwKKyAgICAgU1RSVUNUID0gMjkzLAorICAgICBWT0lEX1RZUEUgPSAyOTQsCisgICAgIFdISUxFID0gMjk1LAorICAgICBTQU1QTEVSMkQgPSAyOTYsCisgICAgIFNBTVBMRVJDVUJFID0gMjk3LAorICAgICBJREVOVElGSUVSID0gMjk4LAorICAgICBUWVBFX05BTUUgPSAyOTksCisgICAgIEZMT0FUQ09OU1RBTlQgPSAzMDAsCisgICAgIElOVENPTlNUQU5UID0gMzAxLAorICAgICBCT09MQ09OU1RBTlQgPSAzMDIsCisgICAgIEZJRUxEX1NFTEVDVElPTiA9IDMwMywKKyAgICAgTEVGVF9PUCA9IDMwNCwKKyAgICAgUklHSFRfT1AgPSAzMDUsCisgICAgIElOQ19PUCA9IDMwNiwKKyAgICAgREVDX09QID0gMzA3LAorICAgICBMRV9PUCA9IDMwOCwKKyAgICAgR0VfT1AgPSAzMDksCisgICAgIEVRX09QID0gMzEwLAorICAgICBORV9PUCA9IDMxMSwKKyAgICAgQU5EX09QID0gMzEyLAorICAgICBPUl9PUCA9IDMxMywKKyAgICAgWE9SX09QID0gMzE0LAorICAgICBNVUxfQVNTSUdOID0gMzE1LAorICAgICBESVZfQVNTSUdOID0gMzE2LAorICAgICBBRERfQVNTSUdOID0gMzE3LAorICAgICBNT0RfQVNTSUdOID0gMzE4LAorICAgICBMRUZUX0FTU0lHTiA9IDMxOSwKKyAgICAgUklHSFRfQVNTSUdOID0gMzIwLAorICAgICBBTkRfQVNTSUdOID0gMzIxLAorICAgICBYT1JfQVNTSUdOID0gMzIyLAorICAgICBPUl9BU1NJR04gPSAzMjMsCisgICAgIFNVQl9BU1NJR04gPSAzMjQsCisgICAgIExFRlRfUEFSRU4gPSAzMjUsCisgICAgIFJJR0hUX1BBUkVOID0gMzI2LAorICAgICBMRUZUX0JSQUNLRVQgPSAzMjcsCisgICAgIFJJR0hUX0JSQUNLRVQgPSAzMjgsCisgICAgIExFRlRfQlJBQ0UgPSAzMjksCisgICAgIFJJR0hUX0JSQUNFID0gMzMwLAorICAgICBET1QgPSAzMzEsCisgICAgIENPTU1BID0gMzMyLAorICAgICBDT0xPTiA9IDMzMywKKyAgICAgRVFVQUwgPSAzMzQsCisgICAgIFNFTUlDT0xPTiA9IDMzNSwKKyAgICAgQkFORyA9IDMzNiwKKyAgICAgREFTSCA9IDMzNywKKyAgICAgVElMREUgPSAzMzgsCisgICAgIFBMVVMgPSAzMzksCisgICAgIFNUQVIgPSAzNDAsCisgICAgIFNMQVNIID0gMzQxLAorICAgICBQRVJDRU5UID0gMzQyLAorICAgICBMRUZUX0FOR0xFID0gMzQzLAorICAgICBSSUdIVF9BTkdMRSA9IDM0NCwKKyAgICAgVkVSVElDQUxfQkFSID0gMzQ1LAorICAgICBDQVJFVCA9IDM0NiwKKyAgICAgQU1QRVJTQU5EID0gMzQ3LAorICAgICBRVUVTVElPTiA9IDM0OAorICAgfTsKKyNlbmRpZgorLyogVG9rZW5zLiAgKi8KKyNkZWZpbmUgSU5WQVJJQU5UIDI1OAorI2RlZmluZSBISUdIX1BSRUNJU0lPTiAyNTkKKyNkZWZpbmUgTUVESVVNX1BSRUNJU0lPTiAyNjAKKyNkZWZpbmUgTE9XX1BSRUNJU0lPTiAyNjEKKyNkZWZpbmUgUFJFQ0lTSU9OIDI2MgorI2RlZmluZSBBVFRSSUJVVEUgMjYzCisjZGVmaW5lIENPTlNUX1FVQUwgMjY0CisjZGVmaW5lIEJPT0xfVFlQRSAyNjUKKyNkZWZpbmUgRkxPQVRfVFlQRSAyNjYKKyNkZWZpbmUgSU5UX1RZUEUgMjY3CisjZGVmaW5lIEJSRUFLIDI2OAorI2RlZmluZSBDT05USU5VRSAyNjkKKyNkZWZpbmUgRE8gMjcwCisjZGVmaW5lIEVMU0UgMjcxCisjZGVmaW5lIEZPUiAyNzIKKyNkZWZpbmUgSUYgMjczCisjZGVmaW5lIERJU0NBUkQgMjc0CisjZGVmaW5lIFJFVFVSTiAyNzUKKyNkZWZpbmUgQlZFQzIgMjc2CisjZGVmaW5lIEJWRUMzIDI3NworI2RlZmluZSBCVkVDNCAyNzgKKyNkZWZpbmUgSVZFQzIgMjc5CisjZGVmaW5lIElWRUMzIDI4MAorI2RlZmluZSBJVkVDNCAyODEKKyNkZWZpbmUgVkVDMiAyODIKKyNkZWZpbmUgVkVDMyAyODMKKyNkZWZpbmUgVkVDNCAyODQKKyNkZWZpbmUgTUFUUklYMiAyODUKKyNkZWZpbmUgTUFUUklYMyAyODYKKyNkZWZpbmUgTUFUUklYNCAyODcKKyNkZWZpbmUgSU5fUVVBTCAyODgKKyNkZWZpbmUgT1VUX1FVQUwgMjg5CisjZGVmaW5lIElOT1VUX1FVQUwgMjkwCisjZGVmaW5lIFVOSUZPUk0gMjkxCisjZGVmaW5lIFZBUllJTkcgMjkyCisjZGVmaW5lIFNUUlVDVCAyOTMKKyNkZWZpbmUgVk9JRF9UWVBFIDI5NAorI2RlZmluZSBXSElMRSAyOTUKKyNkZWZpbmUgU0FNUExFUjJEIDI5NgorI2RlZmluZSBTQU1QTEVSQ1VCRSAyOTcKKyNkZWZpbmUgSURFTlRJRklFUiAyOTgKKyNkZWZpbmUgVFlQRV9OQU1FIDI5OQorI2RlZmluZSBGTE9BVENPTlNUQU5UIDMwMAorI2RlZmluZSBJTlRDT05TVEFOVCAzMDEKKyNkZWZpbmUgQk9PTENPTlNUQU5UIDMwMgorI2RlZmluZSBGSUVMRF9TRUxFQ1RJT04gMzAzCisjZGVmaW5lIExFRlRfT1AgMzA0CisjZGVmaW5lIFJJR0hUX09QIDMwNQorI2RlZmluZSBJTkNfT1AgMzA2CisjZGVmaW5lIERFQ19PUCAzMDcKKyNkZWZpbmUgTEVfT1AgMzA4CisjZGVmaW5lIEdFX09QIDMwOQorI2RlZmluZSBFUV9PUCAzMTAKKyNkZWZpbmUgTkVfT1AgMzExCisjZGVmaW5lIEFORF9PUCAzMTIKKyNkZWZpbmUgT1JfT1AgMzEzCisjZGVmaW5lIFhPUl9PUCAzMTQKKyNkZWZpbmUgTVVMX0FTU0lHTiAzMTUKKyNkZWZpbmUgRElWX0FTU0lHTiAzMTYKKyNkZWZpbmUgQUREX0FTU0lHTiAzMTcKKyNkZWZpbmUgTU9EX0FTU0lHTiAzMTgKKyNkZWZpbmUgTEVGVF9BU1NJR04gMzE5CisjZGVmaW5lIFJJR0hUX0FTU0lHTiAzMjAKKyNkZWZpbmUgQU5EX0FTU0lHTiAzMjEKKyNkZWZpbmUgWE9SX0FTU0lHTiAzMjIKKyNkZWZpbmUgT1JfQVNTSUdOIDMyMworI2RlZmluZSBTVUJfQVNTSUdOIDMyNAorI2RlZmluZSBMRUZUX1BBUkVOIDMyNQorI2RlZmluZSBSSUdIVF9QQVJFTiAzMjYKKyNkZWZpbmUgTEVGVF9CUkFDS0VUIDMyNworI2RlZmluZSBSSUdIVF9CUkFDS0VUIDMyOAorI2RlZmluZSBMRUZUX0JSQUNFIDMyOQorI2RlZmluZSBSSUdIVF9CUkFDRSAzMzAKKyNkZWZpbmUgRE9UIDMzMQorI2RlZmluZSBDT01NQSAzMzIKKyNkZWZpbmUgQ09MT04gMzMzCisjZGVmaW5lIEVRVUFMIDMzNAorI2RlZmluZSBTRU1JQ09MT04gMzM1CisjZGVmaW5lIEJBTkcgMzM2CisjZGVmaW5lIERBU0ggMzM3CisjZGVmaW5lIFRJTERFIDMzOAorI2RlZmluZSBQTFVTIDMzOQorI2RlZmluZSBTVEFSIDM0MAorI2RlZmluZSBTTEFTSCAzNDEKKyNkZWZpbmUgUEVSQ0VOVCAzNDIKKyNkZWZpbmUgTEVGVF9BTkdMRSAzNDMKKyNkZWZpbmUgUklHSFRfQU5HTEUgMzQ0CisjZGVmaW5lIFZFUlRJQ0FMX0JBUiAzNDUKKyNkZWZpbmUgQ0FSRVQgMzQ2CisjZGVmaW5lIEFNUEVSU0FORCAzNDcKKyNkZWZpbmUgUVVFU1RJT04gMzQ4CisKKworCisKKyNpZiAhIGRlZmluZWQgWVlTVFlQRSAmJiAhIGRlZmluZWQgWVlTVFlQRV9JU19ERUNMQVJFRAordHlwZWRlZiB1bmlvbiBZWVNUWVBFCisKK3sKKyAgICBzdHJ1Y3QgeworICAgICAgICBUU291cmNlTG9jIGxpbmU7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIFRTdHJpbmcgKnN0cmluZzsKKyAgICAgICAgICAgIGZsb2F0IGY7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGJvb2wgYjsKKyAgICAgICAgfTsKKyAgICAgICAgVFN5bWJvbCogc3ltYm9sOworICAgIH0gbGV4OworICAgIHN0cnVjdCB7CisgICAgICAgIFRTb3VyY2VMb2MgbGluZTsKKyAgICAgICAgVE9wZXJhdG9yIG9wOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBUSW50ZXJtTm9kZSogaW50ZXJtTm9kZTsKKyAgICAgICAgICAgIFRJbnRlcm1Ob2RlUGFpciBub2RlUGFpcjsKKyAgICAgICAgICAgIFRJbnRlcm1UeXBlZCogaW50ZXJtVHlwZWROb2RlOworICAgICAgICAgICAgVEludGVybUFnZ3JlZ2F0ZSogaW50ZXJtQWdncmVnYXRlOworICAgICAgICB9OworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBUUHVibGljVHlwZSB0eXBlOworICAgICAgICAgICAgVFByZWNpc2lvbiBwcmVjaXNpb247CisgICAgICAgICAgICBUUXVhbGlmaWVyIHF1YWxpZmllcjsKKyAgICAgICAgICAgIFRGdW5jdGlvbiogZnVuY3Rpb247CisgICAgICAgICAgICBUUGFyYW1ldGVyIHBhcmFtOworICAgICAgICAgICAgVFR5cGVMaW5lIHR5cGVMaW5lOworICAgICAgICAgICAgVFR5cGVMaXN0KiB0eXBlTGlzdDsKKyAgICAgICAgfTsKKyAgICB9IGludGVybTsKK30KKy8qIExpbmUgMTUyOSBvZiB5YWNjLmMuICAqLworCisJWVlTVFlQRTsKKyMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KKyMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQorIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvaW50ZXJtT3V0LmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2ludGVybU91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4YTY5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2ludGVybU91dC5jcHAKQEAgLTAsMCArMSw0MTcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9sb2NhbGludGVybWVkaWF0ZS5oIgorCisvLworLy8gVHdvIHB1cnBvc2VzOgorLy8gMS4gIFNob3cgYW4gZXhhbXBsZSBvZiBob3cgdG8gaXRlcmF0ZSB0cmVlLiAgRnVuY3Rpb25zIGNhbgorLy8gICAgIGFsc28gZGlyZWN0bHkgY2FsbCBUcmF2ZXJzZSgpIG9uIGNoaWxkcmVuIHRoZW1zZWx2ZXMgdG8KKy8vICAgICBoYXZlIGZpbmVyIGdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBwcm9jZXNzIHRoYW4gc2hvd24gaGVyZS4KKy8vICAgICBTZWUgdGhlIGxhc3QgZnVuY3Rpb24gZm9yIGhvdyB0byBnZXQgc3RhcnRlZC4KKy8vIDIuICBQcmludCBvdXQgYSB0ZXh0IGJhc2VkIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmVlLgorLy8KKworLy8KKy8vIFVzZSB0aGlzIGNsYXNzIHRvIGNhcnJ5IGFsb25nIGRhdGEgZnJvbSBub2RlIHRvIG5vZGUgaW4KKy8vIHRoZSB0cmF2ZXJzYWwKKy8vCitjbGFzcyBUT3V0cHV0VHJhdmVyc2VyIDogcHVibGljIFRJbnRlcm1UcmF2ZXJzZXIgeworcHVibGljOgorICAgIFRPdXRwdXRUcmF2ZXJzZXIoVEluZm9TaW5rQmFzZSYgaSkgOiBzaW5rKGkpIHsgfQorICAgIFRJbmZvU2lua0Jhc2UmIHNpbms7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIHZpc2l0U3ltYm9sKFRJbnRlcm1TeW1ib2wqKTsKKyAgICB2b2lkIHZpc2l0Q29uc3RhbnRVbmlvbihUSW50ZXJtQ29uc3RhbnRVbmlvbiopOworICAgIGJvb2wgdmlzaXRCaW5hcnkoVmlzaXQgdmlzaXQsIFRJbnRlcm1CaW5hcnkqKTsKKyAgICBib29sIHZpc2l0VW5hcnkoVmlzaXQgdmlzaXQsIFRJbnRlcm1VbmFyeSopOworICAgIGJvb2wgdmlzaXRTZWxlY3Rpb24oVmlzaXQgdmlzaXQsIFRJbnRlcm1TZWxlY3Rpb24qKTsKKyAgICBib29sIHZpc2l0QWdncmVnYXRlKFZpc2l0IHZpc2l0LCBUSW50ZXJtQWdncmVnYXRlKik7CisgICAgYm9vbCB2aXNpdExvb3AoVmlzaXQgdmlzaXQsIFRJbnRlcm1Mb29wKik7CisgICAgYm9vbCB2aXNpdEJyYW5jaChWaXNpdCB2aXNpdCwgVEludGVybUJyYW5jaCopOworfTsKKworVFN0cmluZyBUVHlwZTo6Z2V0Q29tcGxldGVTdHJpbmcoKSBjb25zdAoreworICAgIFRTdHJpbmdTdHJlYW0gc3RyZWFtOworCisgICAgaWYgKHF1YWxpZmllciAhPSBFdnFUZW1wb3JhcnkgJiYgcXVhbGlmaWVyICE9IEV2cUdsb2JhbCkKKyAgICAgICAgc3RyZWFtIDw8IGdldFF1YWxpZmllclN0cmluZygpIDw8ICIgIiA8PCBnZXRQcmVjaXNpb25TdHJpbmcoKSA8PCAiICI7CisgICAgaWYgKGFycmF5KQorICAgICAgICBzdHJlYW0gPDwgImFycmF5IG9mICI7CisgICAgaWYgKG1hdHJpeCkKKyAgICAgICAgc3RyZWFtIDw8IHNpemUgPDwgIlgiIDw8IHNpemUgPDwgIiBtYXRyaXggb2YgIjsKKyAgICBlbHNlIGlmIChzaXplID4gMSkKKyAgICAgICAgc3RyZWFtIDw8IHNpemUgPDwgIi1jb21wb25lbnQgdmVjdG9yIG9mICI7CisKKyAgICBzdHJlYW0gPDwgZ2V0QmFzaWNTdHJpbmcoKTsKKyAgICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCisvLworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgcHJpbnRpbmcsIG5vdCBwYXJ0IG9mIHRyYXZlcnNpbmcuCisvLworCit2b2lkIE91dHB1dFRyZWVUZXh0KFRJbmZvU2lua0Jhc2UmIHNpbmssIFRJbnRlcm1Ob2RlKiBub2RlLCBjb25zdCBpbnQgZGVwdGgpCit7CisgICAgaW50IGk7CisKKyAgICBzaW5rLmxvY2F0aW9uKG5vZGUtPmdldExpbmUoKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVwdGg7ICsraSkKKyAgICAgICAgc2luayA8PCAiICAiOworfQorCisvLworLy8gVGhlIHJlc3Qgb2YgdGhlIGZpbGUgYXJlIHRoZSB0cmF2ZXJzYWwgZnVuY3Rpb25zLiAgVGhlIGxhc3Qgb25lCisvLyBpcyB0aGUgb25lIHRoYXQgc3RhcnRzIHRoZSB0cmF2ZXJzYWwuCisvLworLy8gUmV0dXJuIHRydWUgZnJvbSBpbnRlcmlvciBub2RlcyB0byBoYXZlIHRoZSBleHRlcm5hbCB0cmF2ZXJzYWwKKy8vIGNvbnRpbnVlIG9uIHRvIGNoaWxkcmVuLiAgSWYgeW91IHByb2Nlc3MgY2hpbGRyZW4geW91cnNlbGYsCisvLyByZXR1cm4gZmFsc2UuCisvLworCit2b2lkIFRPdXRwdXRUcmF2ZXJzZXI6OnZpc2l0U3ltYm9sKFRJbnRlcm1TeW1ib2wqIG5vZGUpCit7CisgICAgT3V0cHV0VHJlZVRleHQoc2luaywgbm9kZSwgZGVwdGgpOworCisgICAgc2luayA8PCAiJyIgPDwgbm9kZS0+Z2V0U3ltYm9sKCkgPDwgIicgIjsKKyAgICBzaW5rIDw8ICIoIiA8PCBub2RlLT5nZXRDb21wbGV0ZVN0cmluZygpIDw8ICIpXG4iOworfQorCitib29sIFRPdXRwdXRUcmF2ZXJzZXI6OnZpc2l0QmluYXJ5KFZpc2l0IHZpc2l0LCBUSW50ZXJtQmluYXJ5KiBub2RlKQoreworICAgIFRJbmZvU2lua0Jhc2UmIG91dCA9IHNpbms7CisKKyAgICBPdXRwdXRUcmVlVGV4dChvdXQsIG5vZGUsIGRlcHRoKTsKKworICAgIHN3aXRjaCAobm9kZS0+Z2V0T3AoKSkgeworICAgICAgICBjYXNlIEVPcEFzc2lnbjogICAgICAgICAgICAgICAgICAgb3V0IDw8ICJtb3ZlIHNlY29uZCBjaGlsZCB0byBmaXJzdCBjaGlsZCI7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BJbml0aWFsaXplOiAgICAgICAgICAgICAgIG91dCA8PCAiaW5pdGlhbGl6ZSBmaXJzdCBjaGlsZCB3aXRoIHNlY29uZCBjaGlsZCI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQWRkQXNzaWduOiAgICAgICAgICAgICAgICBvdXQgPDwgImFkZCBzZWNvbmQgY2hpbGQgaW50byBmaXJzdCBjaGlsZCI7ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcFN1YkFzc2lnbjogICAgICAgICAgICAgICAgb3V0IDw8ICJzdWJ0cmFjdCBzZWNvbmQgY2hpbGQgaW50byBmaXJzdCBjaGlsZCI7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BNdWxBc3NpZ246ICAgICAgICAgICAgICAgIG91dCA8PCAibXVsdGlwbHkgc2Vjb25kIGNoaWxkIGludG8gZmlyc3QgY2hpbGQiOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wVmVjdG9yVGltZXNNYXRyaXhBc3NpZ246ICBvdXQgPDwgIm1hdHJpeCBtdWx0IHNlY29uZCBjaGlsZCBpbnRvIGZpcnN0IGNoaWxkIjsgIGJyZWFrOworICAgICAgICBjYXNlIEVPcFZlY3RvclRpbWVzU2NhbGFyQXNzaWduOiAgb3V0IDw8ICJ2ZWN0b3Igc2NhbGUgc2Vjb25kIGNoaWxkIGludG8gZmlyc3QgY2hpbGQiOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc1NjYWxhckFzc2lnbjogIG91dCA8PCAibWF0cml4IHNjYWxlIHNlY29uZCBjaGlsZCBpbnRvIGZpcnN0IGNoaWxkIjsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTWF0cml4VGltZXNNYXRyaXhBc3NpZ246ICBvdXQgPDwgIm1hdHJpeCBtdWx0IHNlY29uZCBjaGlsZCBpbnRvIGZpcnN0IGNoaWxkIjsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wRGl2QXNzaWduOiAgICAgICAgICAgICAgICBvdXQgPDwgImRpdmlkZSBzZWNvbmQgY2hpbGQgaW50byBmaXJzdCBjaGlsZCI7ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcEluZGV4RGlyZWN0OiAgIG91dCA8PCAiZGlyZWN0IGluZGV4IjsgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BJbmRleEluZGlyZWN0OiBvdXQgPDwgImluZGlyZWN0IGluZGV4IjsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wSW5kZXhEaXJlY3RTdHJ1Y3Q6ICAgb3V0IDw8ICJkaXJlY3QgaW5kZXggZm9yIHN0cnVjdHVyZSI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wVmVjdG9yU3dpenpsZTogb3V0IDw8ICJ2ZWN0b3Igc3dpenpsZSI7IGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wQWRkOiAgICBvdXQgPDwgImFkZCI7ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wU3ViOiAgICBvdXQgPDwgInN1YnRyYWN0IjsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTXVsOiAgICBvdXQgPDwgImNvbXBvbmVudC13aXNlIG11bHRpcGx5IjsgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wRGl2OiAgICBvdXQgPDwgImRpdmlkZSI7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wRXF1YWw6ICAgICAgICAgICAgb3V0IDw8ICJDb21wYXJlIEVxdWFsIjsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcE5vdEVxdWFsOiAgICAgICAgIG91dCA8PCAiQ29tcGFyZSBOb3QgRXF1YWwiOyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BMZXNzVGhhbjogICAgICAgICBvdXQgPDwgIkNvbXBhcmUgTGVzcyBUaGFuIjsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wR3JlYXRlclRoYW46ICAgICAgb3V0IDw8ICJDb21wYXJlIEdyZWF0ZXIgVGhhbiI7ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcExlc3NUaGFuRXF1YWw6ICAgIG91dCA8PCAiQ29tcGFyZSBMZXNzIFRoYW4gb3IgRXF1YWwiOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbkVxdWFsOiBvdXQgPDwgIkNvbXBhcmUgR3JlYXRlciBUaGFuIG9yIEVxdWFsIjsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFT3BWZWN0b3JUaW1lc1NjYWxhcjogb3V0IDw8ICJ2ZWN0b3Itc2NhbGUiOyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BWZWN0b3JUaW1lc01hdHJpeDogb3V0IDw8ICJ2ZWN0b3ItdGltZXMtbWF0cml4IjsgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc1ZlY3Rvcjogb3V0IDw8ICJtYXRyaXgtdGltZXMtdmVjdG9yIjsgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc1NjYWxhcjogb3V0IDw8ICJtYXRyaXgtc2NhbGUiOyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BNYXRyaXhUaW1lc01hdHJpeDogb3V0IDw8ICJtYXRyaXgtbXVsdGlwbHkiOyAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVPcExvZ2ljYWxPcjogIG91dCA8PCAibG9naWNhbC1vciI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTG9naWNhbFhvcjogb3V0IDw8ICJsb2dpY2FsLXhvciI7IGJyZWFrOworICAgICAgICBjYXNlIEVPcExvZ2ljYWxBbmQ6IG91dCA8PCAibG9naWNhbC1hbmQiOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogb3V0IDw8ICI8dW5rbm93biBvcD4iOworICAgIH0KKworICAgIG91dCA8PCAiICgiIDw8IG5vZGUtPmdldENvbXBsZXRlU3RyaW5nKCkgPDwgIikiOworCisgICAgb3V0IDw8ICJcbiI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUT3V0cHV0VHJhdmVyc2VyOjp2aXNpdFVuYXJ5KFZpc2l0IHZpc2l0LCBUSW50ZXJtVW5hcnkqIG5vZGUpCit7CisgICAgVEluZm9TaW5rQmFzZSYgb3V0ID0gc2luazsKKworICAgIE91dHB1dFRyZWVUZXh0KG91dCwgbm9kZSwgZGVwdGgpOworCisgICAgc3dpdGNoIChub2RlLT5nZXRPcCgpKSB7CisgICAgICAgIGNhc2UgRU9wTmVnYXRpdmU6ICAgICAgIG91dCA8PCAiTmVnYXRlIHZhbHVlIjsgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BWZWN0b3JMb2dpY2FsTm90OgorICAgICAgICBjYXNlIEVPcExvZ2ljYWxOb3Q6ICAgICBvdXQgPDwgIk5lZ2F0ZSBjb25kaXRpb25hbCI7ICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFT3BQb3N0SW5jcmVtZW50OiAgb3V0IDw8ICJQb3N0LUluY3JlbWVudCI7ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcFBvc3REZWNyZW1lbnQ6ICBvdXQgPDwgIlBvc3QtRGVjcmVtZW50IjsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wUHJlSW5jcmVtZW50OiAgIG91dCA8PCAiUHJlLUluY3JlbWVudCI7ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BQcmVEZWNyZW1lbnQ6ICAgb3V0IDw8ICJQcmUtRGVjcmVtZW50IjsgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wQ29udkludFRvQm9vbDogIG91dCA8PCAiQ29udmVydCBpbnQgdG8gYm9vbCI7ICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb252RmxvYXRUb0Jvb2w6b3V0IDw8ICJDb252ZXJ0IGZsb2F0IHRvIGJvb2wiO2JyZWFrOworICAgICAgICBjYXNlIEVPcENvbnZCb29sVG9GbG9hdDpvdXQgPDwgIkNvbnZlcnQgYm9vbCB0byBmbG9hdCI7YnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ29udkludFRvRmxvYXQ6IG91dCA8PCAiQ29udmVydCBpbnQgdG8gZmxvYXQiOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb252RmxvYXRUb0ludDogb3V0IDw8ICJDb252ZXJ0IGZsb2F0IHRvIGludCI7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnZCb29sVG9JbnQ6ICBvdXQgPDwgIkNvbnZlcnQgYm9vbCB0byBpbnQiOyAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFT3BSYWRpYW5zOiAgICAgICAgb3V0IDw8ICJyYWRpYW5zIjsgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcERlZ3JlZXM6ICAgICAgICBvdXQgPDwgImRlZ3JlZXMiOyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wU2luOiAgICAgICAgICAgIG91dCA8PCAic2luZSI7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDb3M6ICAgICAgICAgICAgb3V0IDw8ICJjb3NpbmUiOyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcFRhbjogICAgICAgICAgICBvdXQgPDwgInRhbmdlbnQiOyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQXNpbjogICAgICAgICAgIG91dCA8PCAiYXJjIHNpbmUiOyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BBY29zOiAgICAgICAgICAgb3V0IDw8ICJhcmMgY29zaW5lIjsgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcEF0YW46ICAgICAgICAgICBvdXQgPDwgImFyYyB0YW5nZW50IjsgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFT3BFeHA6ICAgICAgICAgICAgb3V0IDw8ICJleHAiOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcExvZzogICAgICAgICAgICBvdXQgPDwgImxvZyI7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wRXhwMjogICAgICAgICAgIG91dCA8PCAiZXhwMiI7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BMb2cyOiAgICAgICAgICAgb3V0IDw8ICJsb2cyIjsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcFNxcnQ6ICAgICAgICAgICBvdXQgPDwgInNxcnQiOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wSW52ZXJzZVNxcnQ6ICAgIG91dCA8PCAiaW52ZXJzZSBzcXJ0IjsgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVPcEFiczogICAgICAgICAgICBvdXQgPDwgIkFic29sdXRlIHZhbHVlIjsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wU2lnbjogICAgICAgICAgIG91dCA8PCAiU2lnbiI7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BGbG9vcjogICAgICAgICAgb3V0IDw8ICJGbG9vciI7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENlaWw6ICAgICAgICAgICBvdXQgPDwgIkNlaWxpbmciOyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wRnJhY3Q6ICAgICAgICAgIG91dCA8PCAiRnJhY3Rpb24iOyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVPcExlbmd0aDogICAgICAgICBvdXQgPDwgImxlbmd0aCI7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTm9ybWFsaXplOiAgICAgIG91dCA8PCAibm9ybWFsaXplIjsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vCWNhc2UgRU9wRFBkeDogICAgICAgICAgIG91dCA8PCAiZFBkeCI7ICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vCWNhc2UgRU9wRFBkeTogICAgICAgICAgIG91dCA8PCAiZFBkeSI7ICAgICAgICAgICAgICAgICBicmVhazsgICAKKyAgICAgICAgICAgIC8vCWNhc2UgRU9wRndpZHRoOiAgICAgICAgIG91dCA8PCAiZndpZHRoIjsgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgY2FzZSBFT3BBbnk6ICAgICAgICAgICAgb3V0IDw8ICJhbnkiOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcEFsbDogICAgICAgICAgICBvdXQgPDwgImFsbCI7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogb3V0Lm1lc3NhZ2UoRVByZWZpeEVycm9yLCAiQmFkIHVuYXJ5IG9wIik7CisgICAgfQorCisgICAgb3V0IDw8ICIgKCIgPDwgbm9kZS0+Z2V0Q29tcGxldGVTdHJpbmcoKSA8PCAiKSI7CisKKyAgICBvdXQgPDwgIlxuIjsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFRPdXRwdXRUcmF2ZXJzZXI6OnZpc2l0QWdncmVnYXRlKFZpc2l0IHZpc2l0LCBUSW50ZXJtQWdncmVnYXRlKiBub2RlKQoreworICAgIFRJbmZvU2lua0Jhc2UmIG91dCA9IHNpbms7CisKKyAgICBpZiAobm9kZS0+Z2V0T3AoKSA9PSBFT3BOdWxsKSB7CisgICAgICAgIG91dC5tZXNzYWdlKEVQcmVmaXhFcnJvciwgIm5vZGUgaXMgc3RpbGwgRU9wTnVsbCEiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgT3V0cHV0VHJlZVRleHQob3V0LCBub2RlLCBkZXB0aCk7CisKKyAgICBzd2l0Y2ggKG5vZGUtPmdldE9wKCkpIHsKKyAgICAgICAgY2FzZSBFT3BTZXF1ZW5jZTogICAgICBvdXQgPDwgIlNlcXVlbmNlXG4iOyByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBFT3BDb21tYTogICAgICAgICBvdXQgPDwgIkNvbW1hXG4iOyByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBFT3BGdW5jdGlvbjogICAgICBvdXQgPDwgIkZ1bmN0aW9uIERlZmluaXRpb246ICIgPDwgbm9kZS0+Z2V0TmFtZSgpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BGdW5jdGlvbkNhbGw6ICBvdXQgPDwgIkZ1bmN0aW9uIENhbGw6ICIgPDwgbm9kZS0+Z2V0TmFtZSgpOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BQYXJhbWV0ZXJzOiAgICBvdXQgPDwgIkZ1bmN0aW9uIFBhcmFtZXRlcnM6ICI7ICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEZsb2F0OiBvdXQgPDwgIkNvbnN0cnVjdCBmbG9hdCI7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdFZlYzI6ICBvdXQgPDwgIkNvbnN0cnVjdCB2ZWMyIjsgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdFZlYzM6ICBvdXQgPDwgIkNvbnN0cnVjdCB2ZWMzIjsgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdFZlYzQ6ICBvdXQgPDwgIkNvbnN0cnVjdCB2ZWM0IjsgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJvb2w6ICBvdXQgPDwgIkNvbnN0cnVjdCBib29sIjsgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJWZWMyOiBvdXQgPDwgIkNvbnN0cnVjdCBidmVjMiI7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJWZWMzOiBvdXQgPDwgIkNvbnN0cnVjdCBidmVjMyI7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEJWZWM0OiBvdXQgPDwgIkNvbnN0cnVjdCBidmVjNCI7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdEludDogICBvdXQgPDwgIkNvbnN0cnVjdCBpbnQiOyAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdElWZWMyOiBvdXQgPDwgIkNvbnN0cnVjdCBpdmVjMiI7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdElWZWMzOiBvdXQgPDwgIkNvbnN0cnVjdCBpdmVjMyI7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdElWZWM0OiBvdXQgPDwgIkNvbnN0cnVjdCBpdmVjNCI7IGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdE1hdDI6ICBvdXQgPDwgIkNvbnN0cnVjdCBtYXQyIjsgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdE1hdDM6ICBvdXQgPDwgIkNvbnN0cnVjdCBtYXQzIjsgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdE1hdDQ6ICBvdXQgPDwgIkNvbnN0cnVjdCBtYXQ0IjsgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnN0cnVjdFN0cnVjdDogIG91dCA8PCAiQ29uc3RydWN0IHN0cnVjdHVyZSI7ICBicmVhazsKKworICAgICAgICBjYXNlIEVPcExlc3NUaGFuOiAgICAgICAgIG91dCA8PCAiQ29tcGFyZSBMZXNzIFRoYW4iOyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BHcmVhdGVyVGhhbjogICAgICBvdXQgPDwgIkNvbXBhcmUgR3JlYXRlciBUaGFuIjsgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTGVzc1RoYW5FcXVhbDogICAgb3V0IDw8ICJDb21wYXJlIExlc3MgVGhhbiBvciBFcXVhbCI7ICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcEdyZWF0ZXJUaGFuRXF1YWw6IG91dCA8PCAiQ29tcGFyZSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwiOyBicmVhazsKKyAgICAgICAgY2FzZSBFT3BWZWN0b3JFcXVhbDogICAgICBvdXQgPDwgIkVxdWFsIjsgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wVmVjdG9yTm90RXF1YWw6ICAgb3V0IDw8ICJOb3RFcXVhbCI7ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wTW9kOiAgICAgICAgICAgb3V0IDw8ICJtb2QiOyAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcFBvdzogICAgICAgICAgIG91dCA8PCAicG93IjsgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVPcEF0YW46ICAgICAgICAgIG91dCA8PCAiYXJjIHRhbmdlbnQiOyBicmVhazsKKworICAgICAgICBjYXNlIEVPcE1pbjogICAgICAgICAgIG91dCA8PCAibWluIjsgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BNYXg6ICAgICAgICAgICBvdXQgPDwgIm1heCI7ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wQ2xhbXA6ICAgICAgICAgb3V0IDw8ICJjbGFtcCI7ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcE1peDogICAgICAgICAgIG91dCA8PCAibWl4IjsgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BTdGVwOiAgICAgICAgICBvdXQgPDwgInN0ZXAiOyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wU21vb3RoU3RlcDogICAgb3V0IDw8ICJzbW9vdGhzdGVwIjsgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU9wRGlzdGFuY2U6ICAgICAgb3V0IDw8ICJkaXN0YW5jZSI7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcERvdDogICAgICAgICAgIG91dCA8PCAiZG90LXByb2R1Y3QiOyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BDcm9zczogICAgICAgICBvdXQgPDwgImNyb3NzLXByb2R1Y3QiOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wRmFjZUZvcndhcmQ6ICAgb3V0IDw8ICJmYWNlLWZvcndhcmQiOyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcFJlZmxlY3Q6ICAgICAgIG91dCA8PCAicmVmbGVjdCI7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BSZWZyYWN0OiAgICAgICBvdXQgPDwgInJlZnJhY3QiOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wTXVsOiAgICAgICAgICAgb3V0IDw8ICJjb21wb25lbnQtd2lzZSBtdWx0aXBseSI7IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IG91dC5tZXNzYWdlKEVQcmVmaXhFcnJvciwgIkJhZCBhZ2dyZWdhdGlvbiBvcCIpOworICAgIH0KKworICAgIGlmIChub2RlLT5nZXRPcCgpICE9IEVPcFNlcXVlbmNlICYmIG5vZGUtPmdldE9wKCkgIT0gRU9wUGFyYW1ldGVycykKKyAgICAgICAgb3V0IDw8ICIgKCIgPDwgbm9kZS0+Z2V0Q29tcGxldGVTdHJpbmcoKSA8PCAiKSI7CisKKyAgICBvdXQgPDwgIlxuIjsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFRPdXRwdXRUcmF2ZXJzZXI6OnZpc2l0U2VsZWN0aW9uKFZpc2l0IHZpc2l0LCBUSW50ZXJtU2VsZWN0aW9uKiBub2RlKQoreworICAgIFRJbmZvU2lua0Jhc2UmIG91dCA9IHNpbms7CisKKyAgICBPdXRwdXRUcmVlVGV4dChvdXQsIG5vZGUsIGRlcHRoKTsKKworICAgIG91dCA8PCAiVGVzdCBjb25kaXRpb24gYW5kIHNlbGVjdCI7CisgICAgb3V0IDw8ICIgKCIgPDwgbm9kZS0+Z2V0Q29tcGxldGVTdHJpbmcoKSA8PCAiKVxuIjsKKworICAgICsrZGVwdGg7CisKKyAgICBPdXRwdXRUcmVlVGV4dChzaW5rLCBub2RlLCBkZXB0aCk7CisgICAgb3V0IDw8ICJDb25kaXRpb25cbiI7CisgICAgbm9kZS0+Z2V0Q29uZGl0aW9uKCktPnRyYXZlcnNlKHRoaXMpOworCisgICAgT3V0cHV0VHJlZVRleHQoc2luaywgbm9kZSwgZGVwdGgpOworICAgIGlmIChub2RlLT5nZXRUcnVlQmxvY2soKSkgeworICAgICAgICBvdXQgPDwgInRydWUgY2FzZVxuIjsKKyAgICAgICAgbm9kZS0+Z2V0VHJ1ZUJsb2NrKCktPnRyYXZlcnNlKHRoaXMpOworICAgIH0gZWxzZQorICAgICAgICBvdXQgPDwgInRydWUgY2FzZSBpcyBudWxsXG4iOworCisgICAgaWYgKG5vZGUtPmdldEZhbHNlQmxvY2soKSkgeworICAgICAgICBPdXRwdXRUcmVlVGV4dChzaW5rLCBub2RlLCBkZXB0aCk7CisgICAgICAgIG91dCA8PCAiZmFsc2UgY2FzZVxuIjsKKyAgICAgICAgbm9kZS0+Z2V0RmFsc2VCbG9jaygpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICB9CisKKyAgICAtLWRlcHRoOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFRPdXRwdXRUcmF2ZXJzZXI6OnZpc2l0Q29uc3RhbnRVbmlvbihUSW50ZXJtQ29uc3RhbnRVbmlvbiogbm9kZSkKK3sKKyAgICBUSW5mb1NpbmtCYXNlJiBvdXQgPSBzaW5rOworCisgICAgaW50IHNpemUgPSBub2RlLT5nZXRUeXBlKCkuZ2V0T2JqZWN0U2l6ZSgpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgT3V0cHV0VHJlZVRleHQob3V0LCBub2RlLCBkZXB0aCk7CisgICAgICAgIHN3aXRjaCAobm9kZS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKVtpXS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgRWJ0Qm9vbDoKKyAgICAgICAgICAgICAgICBpZiAobm9kZS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKVtpXS5nZXRCQ29uc3QoKSkKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiZmFsc2UiOworCisgICAgICAgICAgICAgICAgb3V0IDw8ICIgKCIgPDwgImNvbnN0IGJvb2wiIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRWJ0RmxvYXQ6CisgICAgICAgICAgICAgICAgb3V0IDw8IG5vZGUtPmdldFVuaW9uQXJyYXlQb2ludGVyKClbaV0uZ2V0RkNvbnN0KCk7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIgKGNvbnN0IGZsb2F0KVxuIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRWJ0SW50OgorICAgICAgICAgICAgICAgIG91dCA8PCBub2RlLT5nZXRVbmlvbkFycmF5UG9pbnRlcigpW2ldLmdldElDb25zdCgpOworICAgICAgICAgICAgICAgIG91dCA8PCAiIChjb25zdCBpbnQpXG4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBvdXQubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIlVua25vd24gY29uc3RhbnQiLCBub2RlLT5nZXRMaW5lKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIFRPdXRwdXRUcmF2ZXJzZXI6OnZpc2l0TG9vcChWaXNpdCB2aXNpdCwgVEludGVybUxvb3AqIG5vZGUpCit7CisgICAgVEluZm9TaW5rQmFzZSYgb3V0ID0gc2luazsKKworICAgIE91dHB1dFRyZWVUZXh0KG91dCwgbm9kZSwgZGVwdGgpOworCisgICAgb3V0IDw8ICJMb29wIHdpdGggY29uZGl0aW9uICI7CisgICAgaWYgKG5vZGUtPmdldFR5cGUoKSA9PSBFTG9vcERvV2hpbGUpCisgICAgICAgIG91dCA8PCAibm90ICI7CisgICAgb3V0IDw8ICJ0ZXN0ZWQgZmlyc3RcbiI7CisKKyAgICArK2RlcHRoOworCisgICAgT3V0cHV0VHJlZVRleHQoc2luaywgbm9kZSwgZGVwdGgpOworICAgIGlmIChub2RlLT5nZXRDb25kaXRpb24oKSkgeworICAgICAgICBvdXQgPDwgIkxvb3AgQ29uZGl0aW9uXG4iOworICAgICAgICBub2RlLT5nZXRDb25kaXRpb24oKS0+dHJhdmVyc2UodGhpcyk7CisgICAgfSBlbHNlCisgICAgICAgIG91dCA8PCAiTm8gbG9vcCBjb25kaXRpb25cbiI7CisKKyAgICBPdXRwdXRUcmVlVGV4dChzaW5rLCBub2RlLCBkZXB0aCk7CisgICAgaWYgKG5vZGUtPmdldEJvZHkoKSkgeworICAgICAgICBvdXQgPDwgIkxvb3AgQm9keVxuIjsKKyAgICAgICAgbm9kZS0+Z2V0Qm9keSgpLT50cmF2ZXJzZSh0aGlzKTsKKyAgICB9IGVsc2UKKyAgICAgICAgb3V0IDw8ICJObyBsb29wIGJvZHlcbiI7CisKKyAgICBpZiAobm9kZS0+Z2V0RXhwcmVzc2lvbigpKSB7CisgICAgICAgIE91dHB1dFRyZWVUZXh0KHNpbmssIG5vZGUsIGRlcHRoKTsKKyAgICAgICAgb3V0IDw8ICJMb29wIFRlcm1pbmFsIEV4cHJlc3Npb25cbiI7CisgICAgICAgIG5vZGUtPmdldEV4cHJlc3Npb24oKS0+dHJhdmVyc2UodGhpcyk7CisgICAgfQorCisgICAgLS1kZXB0aDsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUT3V0cHV0VHJhdmVyc2VyOjp2aXNpdEJyYW5jaChWaXNpdCB2aXNpdCwgVEludGVybUJyYW5jaCogbm9kZSkKK3sKKyAgICBUSW5mb1NpbmtCYXNlJiBvdXQgPSBzaW5rOworCisgICAgT3V0cHV0VHJlZVRleHQob3V0LCBub2RlLCBkZXB0aCk7CisKKyAgICBzd2l0Y2ggKG5vZGUtPmdldEZsb3dPcCgpKSB7CisgICAgICAgIGNhc2UgRU9wS2lsbDogICAgICBvdXQgPDwgIkJyYW5jaDogS2lsbCI7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT3BCcmVhazogICAgIG91dCA8PCAiQnJhbmNoOiBCcmVhayI7ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPcENvbnRpbnVlOiAgb3V0IDw8ICJCcmFuY2g6IENvbnRpbnVlIjsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU9wUmV0dXJuOiAgICBvdXQgPDwgIkJyYW5jaDogUmV0dXJuIjsgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgIG91dCA8PCAiQnJhbmNoOiBVbmtub3duIEJyYW5jaCI7IGJyZWFrOworICAgIH0KKworICAgIGlmIChub2RlLT5nZXRFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICIgd2l0aCBleHByZXNzaW9uXG4iOworICAgICAgICArK2RlcHRoOworICAgICAgICBub2RlLT5nZXRFeHByZXNzaW9uKCktPnRyYXZlcnNlKHRoaXMpOworICAgICAgICAtLWRlcHRoOworICAgIH0gZWxzZQorICAgICAgICBvdXQgPDwgIlxuIjsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8KKy8vIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9uZSB0byBjYWxsIGV4dGVybmFsbHkgdG8gc3RhcnQgdGhlIHRyYXZlcnNhbC4KKy8vIEluZGl2aWR1YWwgZnVuY3Rpb25zIGNhbiBiZSBpbml0aWFsaXplZCB0byAwIHRvIHNraXAgcHJvY2Vzc2luZyBvZiB0aGF0CisvLyB0eXBlIG9mIG5vZGUuICBJdCdzIGNoaWxkcmVuIHdpbGwgc3RpbGwgYmUgcHJvY2Vzc2VkLgorLy8KK3ZvaWQgVEludGVybWVkaWF0ZTo6b3V0cHV0VHJlZShUSW50ZXJtTm9kZSogcm9vdCkKK3sKKyAgICBpZiAocm9vdCA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBUT3V0cHV0VHJhdmVyc2VyIGl0KGluZm9TaW5rLmluZm8pOworCisgICAgcm9vdC0+dHJhdmVyc2UoJml0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2ludGVybWVkaWF0ZS5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvaW50ZXJtZWRpYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhZjVhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2ludGVybWVkaWF0ZS5oCkBAIC0wLDAgKzEsNTQ0IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLworLy8gRGVmaW5pdGlvbiBvZiB0aGUgaW4tbWVtb3J5IGhpZ2gtbGV2ZWwgaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uCisvLyBvZiBzaGFkZXJzLiAgVGhpcyBpcyBhIHRyZWUgdGhhdCBwYXJzZXIgY3JlYXRlcy4KKy8vCisvLyBOb2RlcyBpbiB0aGUgdHJlZSBhcmUgZGVmaW5lZCBhcyBhIGhpZXJhcmNoeSBvZiBjbGFzc2VzIGRlcml2ZWQgZnJvbSAKKy8vIFRJbnRlcm1Ob2RlLiBFYWNoIGlzIGEgbm9kZSBpbiBhIHRyZWUuICBUaGVyZSBpcyBubyBwcmVzZXQgYnJhbmNoaW5nIGZhY3RvcjsKKy8vIGVhY2ggbm9kZSBjYW4gaGF2ZSBpdCdzIG93biB0eXBlIG9mIGxpc3Qgb2YgY2hpbGRyZW4uCisvLworCisjaWZuZGVmIF9fSU5URVJNRURJQVRFX0gKKyNkZWZpbmUgX19JTlRFUk1FRElBVEVfSAorCisjaW5jbHVkZSAiY29tcGlsZXIvQ29tbW9uLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvVHlwZXMuaCIKKyNpbmNsdWRlICJjb21waWxlci9Db25zdGFudFVuaW9uLmgiCisKKy8vCisvLyBPcGVyYXRvcnMgdXNlZCBieSB0aGUgaGlnaC1sZXZlbCAocGFyc2UgdHJlZSkgcmVwcmVzZW50YXRpb24uCisvLworZW51bSBUT3BlcmF0b3IgeworICAgIEVPcE51bGwsICAgICAgICAgICAgLy8gaWYgaW4gYSBub2RlLCBzaG91bGQgb25seSBtZWFuIGEgbm9kZSBpcyBzdGlsbCBiZWluZyBidWlsdAorICAgIEVPcFNlcXVlbmNlLCAgICAgICAgLy8gZGVub3RlcyBhIGxpc3Qgb2Ygc3RhdGVtZW50cywgb3IgcGFyYW1ldGVycywgZXRjLgorICAgIEVPcEZ1bmN0aW9uQ2FsbCwgICAgCisgICAgRU9wRnVuY3Rpb24sICAgICAgICAvLyBGb3IgZnVuY3Rpb24gZGVmaW5pdGlvbgorICAgIEVPcFBhcmFtZXRlcnMsICAgICAgLy8gYW4gYWdncmVnYXRlIGxpc3RpbmcgdGhlIHBhcmFtZXRlcnMgdG8gYSBmdW5jdGlvbgorCisgICAgRU9wRGVjbGFyYXRpb24sCisgICAgRU9wUHJvdG90eXBlLAorCisgICAgLy8KKyAgICAvLyBVbmFyeSBvcGVyYXRvcnMKKyAgICAvLworCisgICAgRU9wTmVnYXRpdmUsCisgICAgRU9wTG9naWNhbE5vdCwKKyAgICBFT3BWZWN0b3JMb2dpY2FsTm90LAorCisgICAgRU9wUG9zdEluY3JlbWVudCwKKyAgICBFT3BQb3N0RGVjcmVtZW50LAorICAgIEVPcFByZUluY3JlbWVudCwKKyAgICBFT3BQcmVEZWNyZW1lbnQsCisKKyAgICBFT3BDb252SW50VG9Cb29sLAorICAgIEVPcENvbnZGbG9hdFRvQm9vbCwKKyAgICBFT3BDb252Qm9vbFRvRmxvYXQsCisgICAgRU9wQ29udkludFRvRmxvYXQsCisgICAgRU9wQ29udkZsb2F0VG9JbnQsCisgICAgRU9wQ29udkJvb2xUb0ludCwKKworICAgIC8vCisgICAgLy8gYmluYXJ5IG9wZXJhdGlvbnMKKyAgICAvLworCisgICAgRU9wQWRkLAorICAgIEVPcFN1YiwKKyAgICBFT3BNdWwsCisgICAgRU9wRGl2LAorICAgIEVPcEVxdWFsLAorICAgIEVPcE5vdEVxdWFsLAorICAgIEVPcFZlY3RvckVxdWFsLAorICAgIEVPcFZlY3Rvck5vdEVxdWFsLAorICAgIEVPcExlc3NUaGFuLAorICAgIEVPcEdyZWF0ZXJUaGFuLAorICAgIEVPcExlc3NUaGFuRXF1YWwsCisgICAgRU9wR3JlYXRlclRoYW5FcXVhbCwKKyAgICBFT3BDb21tYSwKKworICAgIEVPcFZlY3RvclRpbWVzU2NhbGFyLAorICAgIEVPcFZlY3RvclRpbWVzTWF0cml4LAorICAgIEVPcE1hdHJpeFRpbWVzVmVjdG9yLAorICAgIEVPcE1hdHJpeFRpbWVzU2NhbGFyLAorCisgICAgRU9wTG9naWNhbE9yLAorICAgIEVPcExvZ2ljYWxYb3IsCisgICAgRU9wTG9naWNhbEFuZCwKKworICAgIEVPcEluZGV4RGlyZWN0LAorICAgIEVPcEluZGV4SW5kaXJlY3QsCisgICAgRU9wSW5kZXhEaXJlY3RTdHJ1Y3QsCisKKyAgICBFT3BWZWN0b3JTd2l6emxlLAorCisgICAgLy8KKyAgICAvLyBCdWlsdC1pbiBmdW5jdGlvbnMgcG90ZW50aWFsbHkgbWFwcGVkIHRvIG9wZXJhdG9ycworICAgIC8vCisKKyAgICBFT3BSYWRpYW5zLAorICAgIEVPcERlZ3JlZXMsCisgICAgRU9wU2luLAorICAgIEVPcENvcywKKyAgICBFT3BUYW4sCisgICAgRU9wQXNpbiwKKyAgICBFT3BBY29zLAorICAgIEVPcEF0YW4sCisKKyAgICBFT3BQb3csCisgICAgRU9wRXhwLAorICAgIEVPcExvZywKKyAgICBFT3BFeHAyLAorICAgIEVPcExvZzIsCisgICAgRU9wU3FydCwKKyAgICBFT3BJbnZlcnNlU3FydCwKKworICAgIEVPcEFicywKKyAgICBFT3BTaWduLAorICAgIEVPcEZsb29yLAorICAgIEVPcENlaWwsCisgICAgRU9wRnJhY3QsCisgICAgRU9wTW9kLAorICAgIEVPcE1pbiwKKyAgICBFT3BNYXgsCisgICAgRU9wQ2xhbXAsCisgICAgRU9wTWl4LAorICAgIEVPcFN0ZXAsCisgICAgRU9wU21vb3RoU3RlcCwKKworICAgIEVPcExlbmd0aCwKKyAgICBFT3BEaXN0YW5jZSwKKyAgICBFT3BEb3QsCisgICAgRU9wQ3Jvc3MsCisgICAgRU9wTm9ybWFsaXplLAorICAgIEVPcEZhY2VGb3J3YXJkLAorICAgIEVPcFJlZmxlY3QsCisgICAgRU9wUmVmcmFjdCwKKworICAgIEVPcERGZHgsICAgICAgICAgICAgLy8gRnJhZ21lbnQgb25seSwgT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIGV4dGVuc2lvbgorICAgIEVPcERGZHksICAgICAgICAgICAgLy8gRnJhZ21lbnQgb25seSwgT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIGV4dGVuc2lvbgorICAgIEVPcEZ3aWR0aCwgICAgICAgICAgLy8gRnJhZ21lbnQgb25seSwgT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIGV4dGVuc2lvbgorCisgICAgRU9wTWF0cml4VGltZXNNYXRyaXgsCisKKyAgICBFT3BBbnksCisgICAgRU9wQWxsLAorCisgICAgLy8KKyAgICAvLyBCcmFuY2gKKyAgICAvLworCisgICAgRU9wS2lsbCwgICAgICAgICAgICAvLyBGcmFnbWVudCBvbmx5CisgICAgRU9wUmV0dXJuLAorICAgIEVPcEJyZWFrLAorICAgIEVPcENvbnRpbnVlLAorCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLworCisgICAgRU9wQ29uc3RydWN0SW50LAorICAgIEVPcENvbnN0cnVjdEJvb2wsCisgICAgRU9wQ29uc3RydWN0RmxvYXQsCisgICAgRU9wQ29uc3RydWN0VmVjMiwKKyAgICBFT3BDb25zdHJ1Y3RWZWMzLAorICAgIEVPcENvbnN0cnVjdFZlYzQsCisgICAgRU9wQ29uc3RydWN0QlZlYzIsCisgICAgRU9wQ29uc3RydWN0QlZlYzMsCisgICAgRU9wQ29uc3RydWN0QlZlYzQsCisgICAgRU9wQ29uc3RydWN0SVZlYzIsCisgICAgRU9wQ29uc3RydWN0SVZlYzMsCisgICAgRU9wQ29uc3RydWN0SVZlYzQsCisgICAgRU9wQ29uc3RydWN0TWF0MiwKKyAgICBFT3BDb25zdHJ1Y3RNYXQzLAorICAgIEVPcENvbnN0cnVjdE1hdDQsCisgICAgRU9wQ29uc3RydWN0U3RydWN0LAorCisgICAgLy8KKyAgICAvLyBtb3ZlcworICAgIC8vCisKKyAgICBFT3BBc3NpZ24sCisgICAgRU9wSW5pdGlhbGl6ZSwKKyAgICBFT3BBZGRBc3NpZ24sCisgICAgRU9wU3ViQXNzaWduLAorICAgIEVPcE11bEFzc2lnbiwKKyAgICBFT3BWZWN0b3JUaW1lc01hdHJpeEFzc2lnbiwKKyAgICBFT3BWZWN0b3JUaW1lc1NjYWxhckFzc2lnbiwKKyAgICBFT3BNYXRyaXhUaW1lc1NjYWxhckFzc2lnbiwKKyAgICBFT3BNYXRyaXhUaW1lc01hdHJpeEFzc2lnbiwKKyAgICBFT3BEaXZBc3NpZ24sCit9OworCitleHRlcm4gY29uc3QgY2hhciogZ2V0T3BlcmF0b3JTdHJpbmcoVE9wZXJhdG9yIG9wKTsKKworY2xhc3MgVEludGVybVRyYXZlcnNlcjsKK2NsYXNzIFRJbnRlcm1BZ2dyZWdhdGU7CitjbGFzcyBUSW50ZXJtQmluYXJ5OworY2xhc3MgVEludGVybVVuYXJ5OworY2xhc3MgVEludGVybUNvbnN0YW50VW5pb247CitjbGFzcyBUSW50ZXJtU2VsZWN0aW9uOworY2xhc3MgVEludGVybVR5cGVkOworY2xhc3MgVEludGVybVN5bWJvbDsKK2NsYXNzIFRJbnRlcm1Mb29wOworY2xhc3MgVEluZm9TaW5rOworCisvLworLy8gQmFzZSBjbGFzcyBmb3IgdGhlIHRyZWUgbm9kZXMKKy8vCitjbGFzcyBUSW50ZXJtTm9kZSB7CitwdWJsaWM6CisgICAgUE9PTF9BTExPQ0FUT1JfTkVXX0RFTEVURShHbG9iYWxQb29sQWxsb2NhdG9yKQorCisgICAgVEludGVybU5vZGUoKSA6IGxpbmUoMCkge30KKworICAgIFRTb3VyY2VMb2MgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmU7IH0KKyAgICB2b2lkIHNldExpbmUoVFNvdXJjZUxvYyBsKSB7IGxpbmUgPSBsOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdHJhdmVyc2UoVEludGVybVRyYXZlcnNlciopID0gMDsKKyAgICB2aXJ0dWFsIFRJbnRlcm1UeXBlZCogZ2V0QXNUeXBlZCgpIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIFRJbnRlcm1Db25zdGFudFVuaW9uKiBnZXRBc0NvbnN0YW50VW5pb24oKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBUSW50ZXJtQWdncmVnYXRlKiBnZXRBc0FnZ3JlZ2F0ZSgpIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIFRJbnRlcm1CaW5hcnkqIGdldEFzQmluYXJ5Tm9kZSgpIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIFRJbnRlcm1VbmFyeSogZ2V0QXNVbmFyeU5vZGUoKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBUSW50ZXJtU2VsZWN0aW9uKiBnZXRBc1NlbGVjdGlvbk5vZGUoKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBUSW50ZXJtU3ltYm9sKiBnZXRBc1N5bWJvbE5vZGUoKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBUSW50ZXJtTG9vcCogZ2V0QXNMb29wTm9kZSgpIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIH5USW50ZXJtTm9kZSgpIHsgfQorCitwcm90ZWN0ZWQ6CisgICAgVFNvdXJjZUxvYyBsaW5lOworfTsKKworLy8KKy8vIFRoaXMgaXMganVzdCB0byBoZWxwIHlhY2MuCisvLworc3RydWN0IFRJbnRlcm1Ob2RlUGFpciB7CisgICAgVEludGVybU5vZGUqIG5vZGUxOworICAgIFRJbnRlcm1Ob2RlKiBub2RlMjsKK307CisKKy8vCisvLyBJbnRlcm1lZGlhdGUgY2xhc3MgZm9yIG5vZGVzIHRoYXQgaGF2ZSBhIHR5cGUuCisvLworY2xhc3MgVEludGVybVR5cGVkIDogcHVibGljIFRJbnRlcm1Ob2RlIHsKK3B1YmxpYzoKKyAgICBUSW50ZXJtVHlwZWQoY29uc3QgVFR5cGUmIHQpIDogdHlwZSh0KSAgeyB9CisgICAgdmlydHVhbCBUSW50ZXJtVHlwZWQqIGdldEFzVHlwZWQoKSB7IHJldHVybiB0aGlzOyB9CisKKyAgICB2b2lkIHNldFR5cGUoY29uc3QgVFR5cGUmIHQpIHsgdHlwZSA9IHQ7IH0KKyAgICBjb25zdCBUVHlwZSYgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGU7IH0KKyAgICBUVHlwZSogZ2V0VHlwZVBvaW50ZXIoKSB7IHJldHVybiAmdHlwZTsgfQorCisgICAgVEJhc2ljVHlwZSBnZXRCYXNpY1R5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlLmdldEJhc2ljVHlwZSgpOyB9CisgICAgVFF1YWxpZmllciBnZXRRdWFsaWZpZXIoKSBjb25zdCB7IHJldHVybiB0eXBlLmdldFF1YWxpZmllcigpOyB9CisgICAgVFByZWNpc2lvbiBnZXRQcmVjaXNpb24oKSBjb25zdCB7IHJldHVybiB0eXBlLmdldFByZWNpc2lvbigpOyB9CisgICAgaW50IGdldE5vbWluYWxTaXplKCkgY29uc3QgeyByZXR1cm4gdHlwZS5nZXROb21pbmFsU2l6ZSgpOyB9CisgICAgCisgICAgYm9vbCBpc01hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUuaXNNYXRyaXgoKTsgfQorICAgIGJvb2wgaXNBcnJheSgpICBjb25zdCB7IHJldHVybiB0eXBlLmlzQXJyYXkoKTsgfQorICAgIGJvb2wgaXNWZWN0b3IoKSBjb25zdCB7IHJldHVybiB0eXBlLmlzVmVjdG9yKCk7IH0KKyAgICBib29sIGlzU2NhbGFyKCkgY29uc3QgeyByZXR1cm4gdHlwZS5pc1NjYWxhcigpOyB9CisgICAgY29uc3QgY2hhciogZ2V0QmFzaWNTdHJpbmcoKSBjb25zdCB7IHJldHVybiB0eXBlLmdldEJhc2ljU3RyaW5nKCk7IH0KKyAgICBjb25zdCBjaGFyKiBnZXRRdWFsaWZpZXJTdHJpbmcoKSBjb25zdCB7IHJldHVybiB0eXBlLmdldFF1YWxpZmllclN0cmluZygpOyB9CisgICAgVFN0cmluZyBnZXRDb21wbGV0ZVN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHR5cGUuZ2V0Q29tcGxldGVTdHJpbmcoKTsgfQorCitwcm90ZWN0ZWQ6CisgICAgVFR5cGUgdHlwZTsKK307CisKKy8vCisvLyBIYW5kbGUgZm9yLCBkby13aGlsZSwgYW5kIHdoaWxlIGxvb3BzLgorLy8KK2VudW0gVExvb3BUeXBlIHsKKyAgICBFTG9vcEZvciwKKyAgICBFTG9vcFdoaWxlLAorICAgIEVMb29wRG9XaGlsZSwKK307CisKK2NsYXNzIFRJbnRlcm1Mb29wIDogcHVibGljIFRJbnRlcm1Ob2RlIHsKK3B1YmxpYzoKKyAgICBUSW50ZXJtTG9vcChUTG9vcFR5cGUgYVR5cGUsCisgICAgICAgICAgICAgICAgVEludGVybU5vZGUgKmFJbml0LCBUSW50ZXJtVHlwZWQqIGFDb25kLCBUSW50ZXJtVHlwZWQqIGFFeHByLAorICAgICAgICAgICAgICAgIFRJbnRlcm1Ob2RlKiBhQm9keSkgOgorICAgICAgICAgICAgdHlwZShhVHlwZSksCisgICAgICAgICAgICBpbml0KGFJbml0KSwKKyAgICAgICAgICAgIGNvbmQoYUNvbmQpLAorICAgICAgICAgICAgZXhwcihhRXhwciksCisgICAgICAgICAgICBib2R5KGFCb2R5KSwKKyAgICAgICAgICAgIHVucm9sbEZsYWcoZmFsc2UpIHsgfQorCisgICAgdmlydHVhbCBUSW50ZXJtTG9vcCogZ2V0QXNMb29wTm9kZSgpIHsgcmV0dXJuIHRoaXM7IH0KKyAgICB2aXJ0dWFsIHZvaWQgdHJhdmVyc2UoVEludGVybVRyYXZlcnNlciopOworCisgICAgVExvb3BUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlOyB9CisgICAgVEludGVybU5vZGUqIGdldEluaXQoKSB7IHJldHVybiBpbml0OyB9CisgICAgVEludGVybVR5cGVkKiBnZXRDb25kaXRpb24oKSB7IHJldHVybiBjb25kOyB9CisgICAgVEludGVybVR5cGVkKiBnZXRFeHByZXNzaW9uKCkgeyByZXR1cm4gZXhwcjsgfQorICAgIFRJbnRlcm1Ob2RlKiBnZXRCb2R5KCkgeyByZXR1cm4gYm9keTsgfQorCisgICAgdm9pZCBzZXRVbnJvbGxGbGFnKGJvb2wgZmxhZykgeyB1bnJvbGxGbGFnID0gZmxhZzsgfQorICAgIGJvb2wgZ2V0VW5yb2xsRmxhZygpIHsgcmV0dXJuIHVucm9sbEZsYWc7IH0KKworcHJvdGVjdGVkOgorICAgIFRMb29wVHlwZSB0eXBlOworICAgIFRJbnRlcm1Ob2RlKiBpbml0OyAgLy8gZm9yLWxvb3AgaW5pdGlhbGl6YXRpb24KKyAgICBUSW50ZXJtVHlwZWQqIGNvbmQ7IC8vIGxvb3AgZXhpdCBjb25kaXRpb24KKyAgICBUSW50ZXJtVHlwZWQqIGV4cHI7IC8vIGZvci1sb29wIGV4cHJlc3Npb24KKyAgICBUSW50ZXJtTm9kZSogYm9keTsgIC8vIGxvb3AgYm9keQorCisgICAgYm9vbCB1bnJvbGxGbGFnOyAvLyBXaGV0aGVyIHRoZSBsb29wIHNob3VsZCBiZSB1bnJvbGxlZCBvciBub3QuCit9OworCisvLworLy8gSGFuZGxlIGJyZWFrLCBjb250aW51ZSwgcmV0dXJuLCBhbmQga2lsbC4KKy8vCitjbGFzcyBUSW50ZXJtQnJhbmNoIDogcHVibGljIFRJbnRlcm1Ob2RlIHsKK3B1YmxpYzoKKyAgICBUSW50ZXJtQnJhbmNoKFRPcGVyYXRvciBvcCwgVEludGVybVR5cGVkKiBlKSA6CisgICAgICAgICAgICBmbG93T3Aob3ApLAorICAgICAgICAgICAgZXhwcmVzc2lvbihlKSB7IH0KKworICAgIHZpcnR1YWwgdm9pZCB0cmF2ZXJzZShUSW50ZXJtVHJhdmVyc2VyKik7CisKKyAgICBUT3BlcmF0b3IgZ2V0Rmxvd09wKCkgeyByZXR1cm4gZmxvd09wOyB9CisgICAgVEludGVybVR5cGVkKiBnZXRFeHByZXNzaW9uKCkgeyByZXR1cm4gZXhwcmVzc2lvbjsgfQorCitwcm90ZWN0ZWQ6CisgICAgVE9wZXJhdG9yIGZsb3dPcDsKKyAgICBUSW50ZXJtVHlwZWQqIGV4cHJlc3Npb247ICAvLyBub24temVybyBleGNlcHQgZm9yICJyZXR1cm4gZXhwOyIgc3RhdGVtZW50cworfTsKKworLy8KKy8vIE5vZGVzIHRoYXQgY29ycmVzcG9uZCB0byBzeW1ib2xzIG9yIGNvbnN0YW50cyBpbiB0aGUgc291cmNlIGNvZGUuCisvLworY2xhc3MgVEludGVybVN5bWJvbCA6IHB1YmxpYyBUSW50ZXJtVHlwZWQgeworcHVibGljOgorICAgIC8vIGlmIHN5bWJvbCBpcyBpbml0aWFsaXplZCBhcyBzeW1ib2woc3ltKSwgdGhlIG1lbW9yeSBjb21lcyBmcm9tIHRoZSBwb29sYWxsb2NhdG9yIG9mIHN5bS4gSWYgc3ltIGNvbWVzIGZyb20KKyAgICAvLyBwZXIgcHJvY2VzcyBnbG9iYWxwb29sYWxsb2NhdG9yLCB0aGVuIGl0IGNhdXNlcyBpbmNyZWFzZWQgbWVtb3J5IHVzYWdlIHBlciBjb21waWxlCisgICAgLy8gaXQgaXMgZXNzZW50aWFsIHRvIHVzZSAic3ltYm9sID0gc3ltIiB0byBhc3NpZ24gdG8gc3ltYm9sCisgICAgVEludGVybVN5bWJvbChpbnQgaSwgY29uc3QgVFN0cmluZyYgc3ltLCBjb25zdCBUVHlwZSYgdCkgOiAKKyAgICAgICAgICAgIFRJbnRlcm1UeXBlZCh0KSwgaWQoaSkgIHsgc3ltYm9sID0gc3ltOyBvcmlnaW5hbFN5bWJvbCA9IHN5bTsgfSAKKworICAgIGludCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIGlkOyB9CisgICAgY29uc3QgVFN0cmluZyYgZ2V0U3ltYm9sKCkgY29uc3QgeyByZXR1cm4gc3ltYm9sOyB9CisKKyAgICB2b2lkIHNldElkKGludCBuZXdJZCkgeyBpZCA9IG5ld0lkOyB9CisgICAgdm9pZCBzZXRTeW1ib2woY29uc3QgVFN0cmluZyYgc3ltKSB7IHN5bWJvbCA9IHN5bTsgfQorCisgICAgY29uc3QgVFN0cmluZyYgZ2V0T3JpZ2luYWxTeW1ib2woKSBjb25zdCB7IHJldHVybiBvcmlnaW5hbFN5bWJvbDsgfQorCisgICAgdmlydHVhbCB2b2lkIHRyYXZlcnNlKFRJbnRlcm1UcmF2ZXJzZXIqKTsKKyAgICB2aXJ0dWFsIFRJbnRlcm1TeW1ib2wqIGdldEFzU3ltYm9sTm9kZSgpIHsgcmV0dXJuIHRoaXM7IH0KKworcHJvdGVjdGVkOgorICAgIGludCBpZDsKKyAgICBUU3RyaW5nIHN5bWJvbDsKKyAgICBUU3RyaW5nIG9yaWdpbmFsU3ltYm9sOworfTsKKworY2xhc3MgVEludGVybUNvbnN0YW50VW5pb24gOiBwdWJsaWMgVEludGVybVR5cGVkIHsKK3B1YmxpYzoKKyAgICBUSW50ZXJtQ29uc3RhbnRVbmlvbihDb25zdGFudFVuaW9uICp1bmlvblBvaW50ZXIsIGNvbnN0IFRUeXBlJiB0KSA6IFRJbnRlcm1UeXBlZCh0KSwgdW5pb25BcnJheVBvaW50ZXIodW5pb25Qb2ludGVyKSB7IH0KKworICAgIENvbnN0YW50VW5pb24qIGdldFVuaW9uQXJyYXlQb2ludGVyKCkgY29uc3QgeyByZXR1cm4gdW5pb25BcnJheVBvaW50ZXI7IH0KKyAgICB2b2lkIHNldFVuaW9uQXJyYXlQb2ludGVyKENvbnN0YW50VW5pb24gKmMpIHsgdW5pb25BcnJheVBvaW50ZXIgPSBjOyB9CisKKyAgICB2aXJ0dWFsIFRJbnRlcm1Db25zdGFudFVuaW9uKiBnZXRBc0NvbnN0YW50VW5pb24oKSAgeyByZXR1cm4gdGhpczsgfQorICAgIHZpcnR1YWwgdm9pZCB0cmF2ZXJzZShUSW50ZXJtVHJhdmVyc2VyKik7CisKKyAgICBUSW50ZXJtVHlwZWQqIGZvbGQoVE9wZXJhdG9yLCBUSW50ZXJtVHlwZWQqLCBUSW5mb1NpbmsmKTsKKworcHJvdGVjdGVkOgorICAgIENvbnN0YW50VW5pb24gKnVuaW9uQXJyYXlQb2ludGVyOworfTsKKworLy8KKy8vIEludGVybWVkaWF0ZSBjbGFzcyBmb3Igbm9kZSB0eXBlcyB0aGF0IGhvbGQgb3BlcmF0b3JzLgorLy8KK2NsYXNzIFRJbnRlcm1PcGVyYXRvciA6IHB1YmxpYyBUSW50ZXJtVHlwZWQgeworcHVibGljOgorICAgIFRPcGVyYXRvciBnZXRPcCgpIGNvbnN0IHsgcmV0dXJuIG9wOyB9CisgICAgdm9pZCBzZXRPcChUT3BlcmF0b3IgbykgeyBvcCA9IG87IH0KKworICAgIGJvb2wgbW9kaWZpZXNTdGF0ZSgpIGNvbnN0OworICAgIGJvb2wgaXNDb25zdHJ1Y3RvcigpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgVEludGVybU9wZXJhdG9yKFRPcGVyYXRvciBvKSA6IFRJbnRlcm1UeXBlZChUVHlwZShFYnRGbG9hdCwgRWJwVW5kZWZpbmVkKSksIG9wKG8pIHt9CisgICAgVEludGVybU9wZXJhdG9yKFRPcGVyYXRvciBvLCBUVHlwZSYgdCkgOiBUSW50ZXJtVHlwZWQodCksIG9wKG8pIHt9ICAgCisgICAgVE9wZXJhdG9yIG9wOworfTsKKworLy8KKy8vIE5vZGVzIGZvciBhbGwgdGhlIGJhc2ljIGJpbmFyeSBtYXRoIG9wZXJhdG9ycy4KKy8vCitjbGFzcyBUSW50ZXJtQmluYXJ5IDogcHVibGljIFRJbnRlcm1PcGVyYXRvciB7CitwdWJsaWM6CisgICAgVEludGVybUJpbmFyeShUT3BlcmF0b3IgbykgOiBUSW50ZXJtT3BlcmF0b3Iobykge30KKworICAgIHZpcnR1YWwgVEludGVybUJpbmFyeSogZ2V0QXNCaW5hcnlOb2RlKCkgeyByZXR1cm4gdGhpczsgfQorICAgIHZpcnR1YWwgdm9pZCB0cmF2ZXJzZShUSW50ZXJtVHJhdmVyc2VyKik7CisKKyAgICB2b2lkIHNldExlZnQoVEludGVybVR5cGVkKiBuKSB7IGxlZnQgPSBuOyB9CisgICAgdm9pZCBzZXRSaWdodChUSW50ZXJtVHlwZWQqIG4pIHsgcmlnaHQgPSBuOyB9CisgICAgVEludGVybVR5cGVkKiBnZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gbGVmdDsgfQorICAgIFRJbnRlcm1UeXBlZCogZ2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiByaWdodDsgfQorICAgIGJvb2wgcHJvbW90ZShUSW5mb1NpbmsmKTsKKworcHJvdGVjdGVkOgorICAgIFRJbnRlcm1UeXBlZCogbGVmdDsKKyAgICBUSW50ZXJtVHlwZWQqIHJpZ2h0OworfTsKKworLy8KKy8vIE5vZGVzIGZvciB1bmFyeSBtYXRoIG9wZXJhdG9ycy4KKy8vCitjbGFzcyBUSW50ZXJtVW5hcnkgOiBwdWJsaWMgVEludGVybU9wZXJhdG9yIHsKK3B1YmxpYzoKKyAgICBUSW50ZXJtVW5hcnkoVE9wZXJhdG9yIG8sIFRUeXBlJiB0KSA6IFRJbnRlcm1PcGVyYXRvcihvLCB0KSwgb3BlcmFuZCgwKSB7fQorICAgIFRJbnRlcm1VbmFyeShUT3BlcmF0b3IgbykgOiBUSW50ZXJtT3BlcmF0b3IobyksIG9wZXJhbmQoMCkge30KKworICAgIHZpcnR1YWwgdm9pZCB0cmF2ZXJzZShUSW50ZXJtVHJhdmVyc2VyKik7CisgICAgdmlydHVhbCBUSW50ZXJtVW5hcnkqIGdldEFzVW5hcnlOb2RlKCkgeyByZXR1cm4gdGhpczsgfQorCisgICAgdm9pZCBzZXRPcGVyYW5kKFRJbnRlcm1UeXBlZCogbykgeyBvcGVyYW5kID0gbzsgfQorICAgIFRJbnRlcm1UeXBlZCogZ2V0T3BlcmFuZCgpIHsgcmV0dXJuIG9wZXJhbmQ7IH0gICAgCisgICAgYm9vbCBwcm9tb3RlKFRJbmZvU2luayYpOworCitwcm90ZWN0ZWQ6CisgICAgVEludGVybVR5cGVkKiBvcGVyYW5kOworfTsKKwordHlwZWRlZiBUVmVjdG9yPFRJbnRlcm1Ob2RlKj4gVEludGVybVNlcXVlbmNlOwordHlwZWRlZiBUVmVjdG9yPGludD4gVFF1YWxpZmllckxpc3Q7Cit0eXBlZGVmIFRNYXA8VFN0cmluZywgVFN0cmluZz4gVFByYWdtYVRhYmxlOworLy8KKy8vIE5vZGVzIHRoYXQgb3BlcmF0ZSBvbiBhbiBhcmJpdHJhcnkgc2l6ZWQgc2V0IG9mIGNoaWxkcmVuLgorLy8KK2NsYXNzIFRJbnRlcm1BZ2dyZWdhdGUgOiBwdWJsaWMgVEludGVybU9wZXJhdG9yIHsKK3B1YmxpYzoKKyAgICBUSW50ZXJtQWdncmVnYXRlKCkgOiBUSW50ZXJtT3BlcmF0b3IoRU9wTnVsbCksIHVzZXJEZWZpbmVkKGZhbHNlKSwgcHJhZ21hVGFibGUoMCksIGVuZExpbmUoMCkgeyB9CisgICAgVEludGVybUFnZ3JlZ2F0ZShUT3BlcmF0b3IgbykgOiBUSW50ZXJtT3BlcmF0b3IobyksIHByYWdtYVRhYmxlKDApIHsgfQorICAgIH5USW50ZXJtQWdncmVnYXRlKCkgeyBkZWxldGUgcHJhZ21hVGFibGU7IH0KKworICAgIHZpcnR1YWwgVEludGVybUFnZ3JlZ2F0ZSogZ2V0QXNBZ2dyZWdhdGUoKSB7IHJldHVybiB0aGlzOyB9CisgICAgdmlydHVhbCB2b2lkIHRyYXZlcnNlKFRJbnRlcm1UcmF2ZXJzZXIqKTsKKworICAgIFRJbnRlcm1TZXF1ZW5jZSYgZ2V0U2VxdWVuY2UoKSB7IHJldHVybiBzZXF1ZW5jZTsgfQorCisgICAgdm9pZCBzZXROYW1lKGNvbnN0IFRTdHJpbmcmIG4pIHsgbmFtZSA9IG47IH0KKyAgICBjb25zdCBUU3RyaW5nJiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZTsgfQorCisgICAgdm9pZCBzZXRVc2VyRGVmaW5lZCgpIHsgdXNlckRlZmluZWQgPSB0cnVlOyB9CisgICAgYm9vbCBpc1VzZXJEZWZpbmVkKCkgeyByZXR1cm4gdXNlckRlZmluZWQ7IH0KKworICAgIHZvaWQgc2V0T3B0aW1pemUoYm9vbCBvKSB7IG9wdGltaXplID0gbzsgfQorICAgIGJvb2wgZ2V0T3B0aW1pemUoKSB7IHJldHVybiBvcHRpbWl6ZTsgfQorICAgIHZvaWQgc2V0RGVidWcoYm9vbCBkKSB7IGRlYnVnID0gZDsgfQorICAgIGJvb2wgZ2V0RGVidWcoKSB7IHJldHVybiBkZWJ1ZzsgfQorICAgIHZvaWQgYWRkVG9QcmFnbWFUYWJsZShjb25zdCBUUHJhZ21hVGFibGUmIHBUYWJsZSk7CisgICAgY29uc3QgVFByYWdtYVRhYmxlJiBnZXRQcmFnbWFUYWJsZSgpIGNvbnN0IHsgcmV0dXJuICpwcmFnbWFUYWJsZTsgfQorICAgIHZvaWQgc2V0RW5kTGluZShUU291cmNlTG9jIGxpbmUpIHsgZW5kTGluZSA9IGxpbmU7IH0KKyAgICBUU291cmNlTG9jIGdldEVuZExpbmUoKSBjb25zdCB7IHJldHVybiBlbmRMaW5lOyB9CisKK3Byb3RlY3RlZDoKKyAgICBUSW50ZXJtQWdncmVnYXRlKGNvbnN0IFRJbnRlcm1BZ2dyZWdhdGUmKTsgLy8gZGlzYWxsb3cgY29weSBjb25zdHJ1Y3RvcgorICAgIFRJbnRlcm1BZ2dyZWdhdGUmIG9wZXJhdG9yPShjb25zdCBUSW50ZXJtQWdncmVnYXRlJik7IC8vIGRpc2FsbG93IGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICBUSW50ZXJtU2VxdWVuY2Ugc2VxdWVuY2U7CisgICAgVFN0cmluZyBuYW1lOworICAgIGJvb2wgdXNlckRlZmluZWQ7IC8vIHVzZWQgZm9yIHVzZXIgZGVmaW5lZCBmdW5jdGlvbiBuYW1lcworCisgICAgYm9vbCBvcHRpbWl6ZTsKKyAgICBib29sIGRlYnVnOworICAgIFRQcmFnbWFUYWJsZSAqcHJhZ21hVGFibGU7CisgICAgVFNvdXJjZUxvYyBlbmRMaW5lOworfTsKKworLy8KKy8vIEZvciBpZiB0ZXN0cy4gIFNpbXBsaWZpZWQgc2luY2UgdGhlcmUgaXMgbm8gc3dpdGNoIHN0YXRlbWVudC4KKy8vCitjbGFzcyBUSW50ZXJtU2VsZWN0aW9uIDogcHVibGljIFRJbnRlcm1UeXBlZCB7CitwdWJsaWM6CisgICAgVEludGVybVNlbGVjdGlvbihUSW50ZXJtVHlwZWQqIGNvbmQsIFRJbnRlcm1Ob2RlKiB0cnVlQiwgVEludGVybU5vZGUqIGZhbHNlQikgOgorICAgICAgICAgICAgVEludGVybVR5cGVkKFRUeXBlKEVidFZvaWQsIEVicFVuZGVmaW5lZCkpLCBjb25kaXRpb24oY29uZCksIHRydWVCbG9jayh0cnVlQiksIGZhbHNlQmxvY2soZmFsc2VCKSB7fQorICAgIFRJbnRlcm1TZWxlY3Rpb24oVEludGVybVR5cGVkKiBjb25kLCBUSW50ZXJtTm9kZSogdHJ1ZUIsIFRJbnRlcm1Ob2RlKiBmYWxzZUIsIGNvbnN0IFRUeXBlJiB0eXBlKSA6CisgICAgICAgICAgICBUSW50ZXJtVHlwZWQodHlwZSksIGNvbmRpdGlvbihjb25kKSwgdHJ1ZUJsb2NrKHRydWVCKSwgZmFsc2VCbG9jayhmYWxzZUIpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgdHJhdmVyc2UoVEludGVybVRyYXZlcnNlciopOworCisgICAgYm9vbCB1c2VzVGVybmFyeU9wZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gZ2V0QmFzaWNUeXBlKCkgIT0gRWJ0Vm9pZDsgfQorICAgIFRJbnRlcm1Ob2RlKiBnZXRDb25kaXRpb24oKSBjb25zdCB7IHJldHVybiBjb25kaXRpb247IH0KKyAgICBUSW50ZXJtTm9kZSogZ2V0VHJ1ZUJsb2NrKCkgY29uc3QgeyByZXR1cm4gdHJ1ZUJsb2NrOyB9CisgICAgVEludGVybU5vZGUqIGdldEZhbHNlQmxvY2soKSBjb25zdCB7IHJldHVybiBmYWxzZUJsb2NrOyB9CisgICAgVEludGVybVNlbGVjdGlvbiogZ2V0QXNTZWxlY3Rpb25Ob2RlKCkgeyByZXR1cm4gdGhpczsgfQorCitwcm90ZWN0ZWQ6CisgICAgVEludGVybVR5cGVkKiBjb25kaXRpb247CisgICAgVEludGVybU5vZGUqIHRydWVCbG9jazsKKyAgICBUSW50ZXJtTm9kZSogZmFsc2VCbG9jazsKK307CisKK2VudW0gVmlzaXQKK3sKKyAgICBQcmVWaXNpdCwKKyAgICBJblZpc2l0LAorICAgIFBvc3RWaXNpdAorfTsKKworLy8KKy8vIEZvciB0cmF2ZXJzaW5nIHRoZSB0cmVlLiAgVXNlciBzaG91bGQgZGVyaXZlIGZyb20gdGhpcywgCisvLyBwdXQgdGhlaXIgdHJhdmVyc2FsIHNwZWNpZmljIGRhdGEgaW4gaXQsIGFuZCB0aGVuIHBhc3MKKy8vIGl0IHRvIGEgVHJhdmVyc2UgbWV0aG9kLgorLy8KKy8vIFdoZW4gdXNpbmcgdGhpcywganVzdCBmaWxsIGluIHRoZSBtZXRob2RzIGZvciBub2RlcyB5b3Ugd2FudCB2aXNpdGVkLgorLy8gUmV0dXJuIGZhbHNlIGZyb20gYSBwcmUtdmlzaXQgdG8gc2tpcCB2aXNpdGluZyB0aGF0IG5vZGUncyBzdWJ0cmVlLgorLy8KK2NsYXNzIFRJbnRlcm1UcmF2ZXJzZXIKK3sKK3B1YmxpYzoKKyAgICBQT09MX0FMTE9DQVRPUl9ORVdfREVMRVRFKEdsb2JhbFBvb2xBbGxvY2F0b3IpCisKKyAgICBUSW50ZXJtVHJhdmVyc2VyKGJvb2wgcHJlVmlzaXQgPSB0cnVlLCBib29sIGluVmlzaXQgPSBmYWxzZSwgYm9vbCBwb3N0VmlzaXQgPSBmYWxzZSwgYm9vbCByaWdodFRvTGVmdCA9IGZhbHNlKSA6IAorICAgICAgICAgICAgcHJlVmlzaXQocHJlVmlzaXQpLAorICAgICAgICAgICAgaW5WaXNpdChpblZpc2l0KSwKKyAgICAgICAgICAgIHBvc3RWaXNpdChwb3N0VmlzaXQpLAorICAgICAgICAgICAgcmlnaHRUb0xlZnQocmlnaHRUb0xlZnQpLAorICAgICAgICAgICAgZGVwdGgoMCkge30KKworICAgIHZpcnR1YWwgdm9pZCB2aXNpdFN5bWJvbChUSW50ZXJtU3ltYm9sKikge30KKyAgICB2aXJ0dWFsIHZvaWQgdmlzaXRDb25zdGFudFVuaW9uKFRJbnRlcm1Db25zdGFudFVuaW9uKikge30KKyAgICB2aXJ0dWFsIGJvb2wgdmlzaXRCaW5hcnkoVmlzaXQgdmlzaXQsIFRJbnRlcm1CaW5hcnkqKSB7cmV0dXJuIHRydWU7fQorICAgIHZpcnR1YWwgYm9vbCB2aXNpdFVuYXJ5KFZpc2l0IHZpc2l0LCBUSW50ZXJtVW5hcnkqKSB7cmV0dXJuIHRydWU7fQorICAgIHZpcnR1YWwgYm9vbCB2aXNpdFNlbGVjdGlvbihWaXNpdCB2aXNpdCwgVEludGVybVNlbGVjdGlvbiopIHtyZXR1cm4gdHJ1ZTt9CisgICAgdmlydHVhbCBib29sIHZpc2l0QWdncmVnYXRlKFZpc2l0IHZpc2l0LCBUSW50ZXJtQWdncmVnYXRlKikge3JldHVybiB0cnVlO30KKyAgICB2aXJ0dWFsIGJvb2wgdmlzaXRMb29wKFZpc2l0IHZpc2l0LCBUSW50ZXJtTG9vcCopIHtyZXR1cm4gdHJ1ZTt9CisgICAgdmlydHVhbCBib29sIHZpc2l0QnJhbmNoKFZpc2l0IHZpc2l0LCBUSW50ZXJtQnJhbmNoKikge3JldHVybiB0cnVlO30KKworICAgIHZvaWQgaW5jcmVtZW50RGVwdGgoKSB7ZGVwdGgrKzt9CisgICAgdm9pZCBkZWNyZW1lbnREZXB0aCgpIHtkZXB0aC0tO30KKworICAgIGNvbnN0IGJvb2wgcHJlVmlzaXQ7CisgICAgY29uc3QgYm9vbCBpblZpc2l0OworICAgIGNvbnN0IGJvb2wgcG9zdFZpc2l0OworICAgIGNvbnN0IGJvb2wgcmlnaHRUb0xlZnQ7CisKK3Byb3RlY3RlZDoKKyAgICBpbnQgZGVwdGg7Cit9OworCisjZW5kaWYgLy8gX19JTlRFUk1FRElBVEVfSApkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvbG9jYWxpbnRlcm1lZGlhdGUuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2xvY2FsaW50ZXJtZWRpYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4OTBiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL2xvY2FsaW50ZXJtZWRpYXRlLmgKQEAgLTAsMCArMSw1OCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2lmbmRlZiBfTE9DQUxfSU5URVJNRURJQVRFX0lOQ0xVREVEXworI2RlZmluZSBfTE9DQUxfSU5URVJNRURJQVRFX0lOQ0xVREVEXworCisjaW5jbHVkZSAiR0xTTEFORy9TaGFkZXJMYW5nLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvaW50ZXJtZWRpYXRlLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvU3ltYm9sVGFibGUuaCIKKworc3RydWN0IFRWZWN0b3JGaWVsZHMgeworICAgIGludCBvZmZzZXRzWzRdOworICAgIGludCBudW07Cit9OworCisvLworLy8gU2V0IG9mIGhlbHBlciBmdW5jdGlvbnMgdG8gaGVscCBwYXJzZSBhbmQgYnVpbGQgdGhlIHRyZWUuCisvLworY2xhc3MgVEluZm9TaW5rOworY2xhc3MgVEludGVybWVkaWF0ZSB7CitwdWJsaWM6ICAgIAorICAgIFBPT0xfQUxMT0NBVE9SX05FV19ERUxFVEUoR2xvYmFsUG9vbEFsbG9jYXRvcikKKworICAgIFRJbnRlcm1lZGlhdGUoVEluZm9TaW5rJiBpKSA6IGluZm9TaW5rKGkpIHsgfQorICAgIFRJbnRlcm1TeW1ib2wqIGFkZFN5bWJvbChpbnQgSWQsIGNvbnN0IFRTdHJpbmcmLCBjb25zdCBUVHlwZSYsIFRTb3VyY2VMb2MpOworICAgIFRJbnRlcm1UeXBlZCogYWRkQ29udmVyc2lvbihUT3BlcmF0b3IsIGNvbnN0IFRUeXBlJiwgVEludGVybVR5cGVkKik7CisgICAgVEludGVybVR5cGVkKiBhZGRCaW5hcnlNYXRoKFRPcGVyYXRvciBvcCwgVEludGVybVR5cGVkKiBsZWZ0LCBUSW50ZXJtVHlwZWQqIHJpZ2h0LCBUU291cmNlTG9jLCBUU3ltYm9sVGFibGUmKTsKKyAgICBUSW50ZXJtVHlwZWQqIGFkZEFzc2lnbihUT3BlcmF0b3Igb3AsIFRJbnRlcm1UeXBlZCogbGVmdCwgVEludGVybVR5cGVkKiByaWdodCwgVFNvdXJjZUxvYyk7CisgICAgVEludGVybVR5cGVkKiBhZGRJbmRleChUT3BlcmF0b3Igb3AsIFRJbnRlcm1UeXBlZCogYmFzZSwgVEludGVybVR5cGVkKiBpbmRleCwgVFNvdXJjZUxvYyk7CisgICAgVEludGVybVR5cGVkKiBhZGRVbmFyeU1hdGgoVE9wZXJhdG9yIG9wLCBUSW50ZXJtTm9kZSogY2hpbGQsIFRTb3VyY2VMb2MsIFRTeW1ib2xUYWJsZSYpOworICAgIFRJbnRlcm1BZ2dyZWdhdGUqIGdyb3dBZ2dyZWdhdGUoVEludGVybU5vZGUqIGxlZnQsIFRJbnRlcm1Ob2RlKiByaWdodCwgVFNvdXJjZUxvYyk7CisgICAgVEludGVybUFnZ3JlZ2F0ZSogbWFrZUFnZ3JlZ2F0ZShUSW50ZXJtTm9kZSogbm9kZSwgVFNvdXJjZUxvYyk7CisgICAgVEludGVybUFnZ3JlZ2F0ZSogc2V0QWdncmVnYXRlT3BlcmF0b3IoVEludGVybU5vZGUqLCBUT3BlcmF0b3IsIFRTb3VyY2VMb2MpOworICAgIFRJbnRlcm1Ob2RlKiAgYWRkU2VsZWN0aW9uKFRJbnRlcm1UeXBlZCogY29uZCwgVEludGVybU5vZGVQYWlyIGNvZGUsIFRTb3VyY2VMb2MpOworICAgIFRJbnRlcm1UeXBlZCogYWRkU2VsZWN0aW9uKFRJbnRlcm1UeXBlZCogY29uZCwgVEludGVybVR5cGVkKiB0cnVlQmxvY2ssIFRJbnRlcm1UeXBlZCogZmFsc2VCbG9jaywgVFNvdXJjZUxvYyk7CisgICAgVEludGVybVR5cGVkKiBhZGRDb21tYShUSW50ZXJtVHlwZWQqIGxlZnQsIFRJbnRlcm1UeXBlZCogcmlnaHQsIFRTb3VyY2VMb2MpOworICAgIFRJbnRlcm1Db25zdGFudFVuaW9uKiBhZGRDb25zdGFudFVuaW9uKENvbnN0YW50VW5pb24qLCBjb25zdCBUVHlwZSYsIFRTb3VyY2VMb2MpOworICAgIFRJbnRlcm1UeXBlZCogcHJvbW90ZUNvbnN0YW50VW5pb24oVEJhc2ljVHlwZSwgVEludGVybUNvbnN0YW50VW5pb24qKSA7CisgICAgYm9vbCBwYXJzZUNvbnN0VHJlZShUU291cmNlTG9jLCBUSW50ZXJtTm9kZSosIENvbnN0YW50VW5pb24qLCBUT3BlcmF0b3IsIFRTeW1ib2xUYWJsZSYsIFRUeXBlLCBib29sIHNpbmdsZUNvbnN0YW50UGFyYW0gPSBmYWxzZSk7ICAgICAgICAKKyAgICBUSW50ZXJtTm9kZSogYWRkTG9vcChUTG9vcFR5cGUsIFRJbnRlcm1Ob2RlKiwgVEludGVybVR5cGVkKiwgVEludGVybVR5cGVkKiwgVEludGVybU5vZGUqLCBUU291cmNlTG9jKTsKKyAgICBUSW50ZXJtQnJhbmNoKiBhZGRCcmFuY2goVE9wZXJhdG9yLCBUU291cmNlTG9jKTsKKyAgICBUSW50ZXJtQnJhbmNoKiBhZGRCcmFuY2goVE9wZXJhdG9yLCBUSW50ZXJtVHlwZWQqLCBUU291cmNlTG9jKTsKKyAgICBUSW50ZXJtVHlwZWQqIGFkZFN3aXp6bGUoVFZlY3RvckZpZWxkcyYsIFRTb3VyY2VMb2MpOworICAgIGJvb2wgcG9zdFByb2Nlc3MoVEludGVybU5vZGUqKTsKKwl2b2lkIHJlbW92ZShUSW50ZXJtTm9kZSopOworICAgIHZvaWQgb3V0cHV0VHJlZShUSW50ZXJtTm9kZSopOworICAgIAorcHJvdGVjdGVkOgorICAgIFRJbmZvU2luayYgaW5mb1Npbms7CisKK3ByaXZhdGU6CisgICAgdm9pZCBvcGVyYXRvcj0oVEludGVybWVkaWF0ZSYpOyAvLyBwcmV2ZW50IGFzc2lnbm1lbnRzCit9OworCisjZW5kaWYgLy8gX0xPQ0FMX0lOVEVSTUVESUFURV9JTkNMVURFRF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL29zaW5jbHVkZS5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvb3NpbmNsdWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNGRmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL29zaW5jbHVkZS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgX19PU0lOQ0xVREVfSAorI2RlZmluZSBfX09TSU5DTFVERV9ICisKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY29udGFpbnMgb3Mtc3BlY2lmaWMgZGF0YXR5cGVzIGFuZAorLy8gZGVjbGFyZXMgYW55IG9zLXNwZWNpZmljIGZ1bmN0aW9ucy4KKy8vCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisjZGVmaW5lIEFOR0xFX09TX1dJTgorI2VsaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19saW51eF9fKSB8fCBcCisgICAgICBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBcCisgICAgICBkZWZpbmVkKF9fc3VuKSB8fCBkZWZpbmVkKEFORFJPSUQpCisjZGVmaW5lIEFOR0xFX09TX1BPU0lYCisjZWxzZQorI2Vycm9yIFVuc3VwcG9ydGVkIHBsYXRmb3JtLgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEFOR0xFX1VTRV9OU1BSKQorI2luY2x1ZGUgInBydGhyZWFkLmgiCisjZWxpZiBkZWZpbmVkKEFOR0xFX09TX1dJTikKKyNkZWZpbmUgU1RSSUNUCisjZGVmaW5lIFZDX0VYVFJBTEVBTiAxCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VsaWYgZGVmaW5lZChBTkdMRV9PU19QT1NJWCkKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZiAgLy8gQU5HTEVfVVNFX05TUFIKKworCisjaW5jbHVkZSAiY29tcGlsZXIvZGVidWcuaCIKKworLy8KKy8vIFRocmVhZCBMb2NhbCBTdG9yYWdlIE9wZXJhdGlvbnMKKy8vCisjaWYgZGVmaW5lZChBTkdMRV9VU0VfTlNQUikKK3R5cGVkZWYgUFJVaW50biBPU19UTFNJbmRleDsKKyNkZWZpbmUgT1NfSU5WQUxJRF9UTFNfSU5ERVggMHhGRkZGRkZGRgorI2VsaWYgZGVmaW5lZChBTkdMRV9PU19XSU4pCit0eXBlZGVmIERXT1JEIE9TX1RMU0luZGV4OworI2RlZmluZSBPU19JTlZBTElEX1RMU19JTkRFWCAoVExTX09VVF9PRl9JTkRFWEVTKQorI2VsaWYgZGVmaW5lZChBTkdMRV9PU19QT1NJWCkKK3R5cGVkZWYgdW5zaWduZWQgaW50IE9TX1RMU0luZGV4OworI2RlZmluZSBPU19JTlZBTElEX1RMU19JTkRFWCAweEZGRkZGRkZGCisjZW5kaWYgIC8vIEFOR0xFX1VTRV9OU1BSCisKK09TX1RMU0luZGV4IE9TX0FsbG9jVExTSW5kZXgoKTsKK2Jvb2wgT1NfU2V0VExTVmFsdWUoT1NfVExTSW5kZXggbkluZGV4LCB2b2lkICpscHZWYWx1ZSk7Citib29sIE9TX0ZyZWVUTFNJbmRleChPU19UTFNJbmRleCBuSW5kZXgpOworCitpbmxpbmUgdm9pZCogT1NfR2V0VExTVmFsdWUoT1NfVExTSW5kZXggbkluZGV4KQoreworICAgIEFTU0VSVChuSW5kZXggIT0gT1NfSU5WQUxJRF9UTFNfSU5ERVgpOworI2lmIGRlZmluZWQoQU5HTEVfVVNFX05TUFIpCisgICAgcmV0dXJuIFBSX0dldFRocmVhZFByaXZhdGUobkluZGV4KTsKKyNlbGlmIGRlZmluZWQoQU5HTEVfT1NfV0lOKQorICAgIHJldHVybiBUbHNHZXRWYWx1ZShuSW5kZXgpOworI2VsaWYgZGVmaW5lZChBTkdMRV9PU19QT1NJWCkKKyAgICByZXR1cm4gcHRocmVhZF9nZXRzcGVjaWZpYyhuSW5kZXgpOworI2VuZGlmICAvLyBBTkdMRV9PU19XSU4KK30KKworI2VuZGlmIC8vIF9fT1NJTkNMVURFX0gKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL29zc291cmNlX25zcHIuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvb3Nzb3VyY2VfbnNwci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzZDgxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL29zc291cmNlX25zcHIuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5zcHIgc3BlY2lmaWMgZnVuY3Rpb25zCisvLworI2luY2x1ZGUgImNvbXBpbGVyL29zaW5jbHVkZS5oIgorCisvLworLy8gVGhyZWFkIExvY2FsIFN0b3JhZ2UgT3BlcmF0aW9ucworLy8KK09TX1RMU0luZGV4IE9TX0FsbG9jVExTSW5kZXgoKQoreworICAgIFBSVWludG4gaW5kZXg7CisgICAgUFJTdGF0dXMgc3RhdHVzID0gUFJfTmV3VGhyZWFkUHJpdmF0ZUluZGV4KCZpbmRleCwgTlVMTCk7CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGFzc2VydCgwICYmICJPU19BbGxvY1RMU0luZGV4KCk6IFVuYWJsZSB0byBhbGxvY2F0ZSBUaHJlYWQgTG9jYWwgU3RvcmFnZSIpOworICAgICAgICByZXR1cm4gT1NfSU5WQUxJRF9UTFNfSU5ERVg7CisgICAgfQorCisgICAgcmV0dXJuIGluZGV4OworfQorCitib29sIE9TX1NldFRMU1ZhbHVlKE9TX1RMU0luZGV4IG5JbmRleCwgdm9pZCAqbHB2VmFsdWUpCit7CisgICAgaWYgKG5JbmRleCA9PSBPU19JTlZBTElEX1RMU19JTkRFWCkgeworICAgICAgICBhc3NlcnQoMCAmJiAiT1NfU2V0VExTVmFsdWUoKTogSW52YWxpZCBUTFMgSW5kZXgiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBQUl9TZXRUaHJlYWRQcml2YXRlKG5JbmRleCwgbHB2VmFsdWUpID09IDA7Cit9CisKK2Jvb2wgT1NfRnJlZVRMU0luZGV4KE9TX1RMU0luZGV4IG5JbmRleCkKK3sKKyAgICAvLyBDYW4ndCBkZWxldGUgVExTIGtleXMgd2l0aCBuc3ByCisgICAgcmV0dXJuIHRydWU7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL29zc291cmNlX3Bvc2l4LmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL29zc291cmNlX3Bvc2l4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFlNjk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvb3Nzb3VyY2VfcG9zaXguY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBvc2l4IHNwZWNpZmljIGZ1bmN0aW9ucworLy8KKyNpbmNsdWRlICJjb21waWxlci9vc2luY2x1ZGUuaCIKKworI2lmICFkZWZpbmVkKEFOR0xFX09TX1BPU0lYKQorI2Vycm9yIFRyeWluZyB0byBidWlsZCBhIHBvc2l4IHNwZWNpZmljIGZpbGUgaW4gYSBub24tcG9zaXggYnVpbGQuCisjZW5kaWYKKworLy8KKy8vIFRocmVhZCBMb2NhbCBTdG9yYWdlIE9wZXJhdGlvbnMKKy8vCitPU19UTFNJbmRleCBPU19BbGxvY1RMU0luZGV4KCkKK3sKKyAgICBwdGhyZWFkX2tleV90IHBQb29sSW5kZXg7CisKKyAgICAvLworICAgIC8vIENyZWF0ZSBnbG9iYWwgcG9vbCBrZXkuCisgICAgLy8KKyAgICBpZiAoKHB0aHJlYWRfa2V5X2NyZWF0ZSgmcFBvb2xJbmRleCwgTlVMTCkpICE9IDApIHsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIk9TX0FsbG9jVExTSW5kZXgoKTogVW5hYmxlIHRvIGFsbG9jYXRlIFRocmVhZCBMb2NhbCBTdG9yYWdlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBwUG9vbEluZGV4OworICAgIH0KK30KKworCitib29sIE9TX1NldFRMU1ZhbHVlKE9TX1RMU0luZGV4IG5JbmRleCwgdm9pZCAqbHB2VmFsdWUpCit7CisgICAgaWYgKG5JbmRleCA9PSBPU19JTlZBTElEX1RMU19JTkRFWCkgeworICAgICAgICBhc3NlcnQoMCAmJiAiT1NfU2V0VExTVmFsdWUoKTogSW52YWxpZCBUTFMgSW5kZXgiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChwdGhyZWFkX3NldHNwZWNpZmljKG5JbmRleCwgbHB2VmFsdWUpID09IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgT1NfRnJlZVRMU0luZGV4KE9TX1RMU0luZGV4IG5JbmRleCkKK3sKKyAgICBpZiAobkluZGV4ID09IE9TX0lOVkFMSURfVExTX0lOREVYKSB7CisgICAgICAgIGFzc2VydCgwICYmICJPU19TZXRUTFNWYWx1ZSgpOiBJbnZhbGlkIFRMUyBJbmRleCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBEZWxldGUgdGhlIGdsb2JhbCBwb29sIGtleS4KKyAgICAvLworICAgIGlmIChwdGhyZWFkX2tleV9kZWxldGUobkluZGV4KSA9PSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL29zc291cmNlX3dpbi5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9vc3NvdXJjZV93aW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTIyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9vc3NvdXJjZV93aW4uY3BwCkBAIC0wLDAgKzEsNTcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpbmNsdWRlICJjb21waWxlci9vc2luY2x1ZGUuaCIKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY29udGFpbnMgdGhlIHdpbmRvdydzIHNwZWNpZmljIGZ1bmN0aW9ucworLy8KKworI2lmICFkZWZpbmVkKEFOR0xFX09TX1dJTikKKyNlcnJvciBUcnlpbmcgdG8gYnVpbGQgYSB3aW5kb3dzIHNwZWNpZmljIGZpbGUgaW4gYSBub24gd2luZG93cyBidWlsZC4KKyNlbmRpZgorCisKKy8vCisvLyBUaHJlYWQgTG9jYWwgU3RvcmFnZSBPcGVyYXRpb25zCisvLworT1NfVExTSW5kZXggT1NfQWxsb2NUTFNJbmRleCgpCit7CisJRFdPUkQgZHdJbmRleCA9IFRsc0FsbG9jKCk7CisJaWYgKGR3SW5kZXggPT0gVExTX09VVF9PRl9JTkRFWEVTKSB7CisJCWFzc2VydCgwICYmICJPU19BbGxvY1RMU0luZGV4KCk6IFVuYWJsZSB0byBhbGxvY2F0ZSBUaHJlYWQgTG9jYWwgU3RvcmFnZSIpOworCQlyZXR1cm4gT1NfSU5WQUxJRF9UTFNfSU5ERVg7CisJfQorCisJcmV0dXJuIGR3SW5kZXg7Cit9CisKKworYm9vbCBPU19TZXRUTFNWYWx1ZShPU19UTFNJbmRleCBuSW5kZXgsIHZvaWQgKmxwdlZhbHVlKQoreworCWlmIChuSW5kZXggPT0gT1NfSU5WQUxJRF9UTFNfSU5ERVgpIHsKKwkJYXNzZXJ0KDAgJiYgIk9TX1NldFRMU1ZhbHVlKCk6IEludmFsaWQgVExTIEluZGV4Iik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoVGxzU2V0VmFsdWUobkluZGV4LCBscHZWYWx1ZSkpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgT1NfRnJlZVRMU0luZGV4KE9TX1RMU0luZGV4IG5JbmRleCkKK3sKKwlpZiAobkluZGV4ID09IE9TX0lOVkFMSURfVExTX0lOREVYKSB7CisJCWFzc2VydCgwICYmICJPU19TZXRUTFNWYWx1ZSgpOiBJbnZhbGlkIFRMUyBJbmRleCIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKFRsc0ZyZWUobkluZGV4KSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wYXJzZUNvbnN0LmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3BhcnNlQ29uc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGE1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wYXJzZUNvbnN0LmNwcApAQCAtMCwwICsxLDIzOCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworI2luY2x1ZGUgImNvbXBpbGVyL1BhcnNlSGVscGVyLmgiCisKKy8vCisvLyBVc2UgdGhpcyBjbGFzcyB0byBjYXJyeSBhbG9uZyBkYXRhIGZyb20gbm9kZSB0byBub2RlIGluIAorLy8gdGhlIHRyYXZlcnNhbAorLy8KK2NsYXNzIFRDb25zdFRyYXZlcnNlciA6IHB1YmxpYyBUSW50ZXJtVHJhdmVyc2VyIHsKK3B1YmxpYzoKKyAgICBUQ29uc3RUcmF2ZXJzZXIoQ29uc3RhbnRVbmlvbiogY1VuaW9uLCBib29sIHNpbmdsZUNvbnN0UGFyYW0sIFRPcGVyYXRvciBjb25zdHJ1Y3RUeXBlLCBUSW5mb1NpbmsmIHNpbmssIFRTeW1ib2xUYWJsZSYgc3ltVGFibGUsIFRUeXBlJiB0KQorICAgICAgICA6IGVycm9yKGZhbHNlKSwKKyAgICAgICAgICBpbmRleCgwKSwKKyAgICAgICAgICB1bmlvbkFycmF5KGNVbmlvbiksCisgICAgICAgICAgdHlwZSh0KSwKKyAgICAgICAgICBjb25zdHJ1Y3RvclR5cGUoY29uc3RydWN0VHlwZSksCisgICAgICAgICAgc2luZ2xlQ29uc3RhbnRQYXJhbShzaW5nbGVDb25zdFBhcmFtKSwKKyAgICAgICAgICBpbmZvU2luayhzaW5rKSwKKyAgICAgICAgICBzeW1ib2xUYWJsZShzeW1UYWJsZSksCisgICAgICAgICAgc2l6ZSgwKSwKKyAgICAgICAgICBpc01hdHJpeChmYWxzZSksCisgICAgICAgICAgbWF0cml4U2l6ZSgwKSB7CisgICAgfQorCisgICAgYm9vbCBlcnJvcjsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgdmlzaXRTeW1ib2woVEludGVybVN5bWJvbCopOworICAgIHZvaWQgdmlzaXRDb25zdGFudFVuaW9uKFRJbnRlcm1Db25zdGFudFVuaW9uKik7CisgICAgYm9vbCB2aXNpdEJpbmFyeShWaXNpdCB2aXNpdCwgVEludGVybUJpbmFyeSopOworICAgIGJvb2wgdmlzaXRVbmFyeShWaXNpdCB2aXNpdCwgVEludGVybVVuYXJ5Kik7CisgICAgYm9vbCB2aXNpdFNlbGVjdGlvbihWaXNpdCB2aXNpdCwgVEludGVybVNlbGVjdGlvbiopOworICAgIGJvb2wgdmlzaXRBZ2dyZWdhdGUoVmlzaXQgdmlzaXQsIFRJbnRlcm1BZ2dyZWdhdGUqKTsKKyAgICBib29sIHZpc2l0TG9vcChWaXNpdCB2aXNpdCwgVEludGVybUxvb3AqKTsKKyAgICBib29sIHZpc2l0QnJhbmNoKFZpc2l0IHZpc2l0LCBUSW50ZXJtQnJhbmNoKik7CisKKyAgICBpbnQgaW5kZXg7CisgICAgQ29uc3RhbnRVbmlvbiAqdW5pb25BcnJheTsKKyAgICBUVHlwZSB0eXBlOworICAgIFRPcGVyYXRvciBjb25zdHJ1Y3RvclR5cGU7CisgICAgYm9vbCBzaW5nbGVDb25zdGFudFBhcmFtOworICAgIFRJbmZvU2luayYgaW5mb1Npbms7CisgICAgVFN5bWJvbFRhYmxlJiBzeW1ib2xUYWJsZTsKKyAgICBpbnQgc2l6ZTsgLy8gc2l6ZSBvZiB0aGUgY29uc3RydWN0b3IgKCA0IGZvciB2ZWM0KQorICAgIGJvb2wgaXNNYXRyaXg7CisgICAgaW50IG1hdHJpeFNpemU7IC8vIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4IChub21pbmFsIHNpemUgYW5kIG5vdCB0aGUgaW5zdGFuY2Ugc2l6ZSkKK307CisKKy8vCisvLyBUaGUgcmVzdCBvZiB0aGUgZmlsZSBhcmUgdGhlIHRyYXZlcnNhbCBmdW5jdGlvbnMuICBUaGUgbGFzdCBvbmUKKy8vIGlzIHRoZSBvbmUgdGhhdCBzdGFydHMgdGhlIHRyYXZlcnNhbC4KKy8vCisvLyBSZXR1cm4gdHJ1ZSBmcm9tIGludGVyaW9yIG5vZGVzIHRvIGhhdmUgdGhlIGV4dGVybmFsIHRyYXZlcnNhbAorLy8gY29udGludWUgb24gdG8gY2hpbGRyZW4uICBJZiB5b3UgcHJvY2VzcyBjaGlsZHJlbiB5b3Vyc2VsZiwKKy8vIHJldHVybiBmYWxzZS4KKy8vCisKK3ZvaWQgVENvbnN0VHJhdmVyc2VyOjp2aXNpdFN5bWJvbChUSW50ZXJtU3ltYm9sKiBub2RlKQoreworICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIlN5bWJvbCBOb2RlIGZvdW5kIGluIGNvbnN0YW50IGNvbnN0cnVjdG9yIiwgbm9kZS0+Z2V0TGluZSgpKTsKKyAgICByZXR1cm47CisKK30KKworYm9vbCBUQ29uc3RUcmF2ZXJzZXI6OnZpc2l0QmluYXJ5KFZpc2l0IHZpc2l0LCBUSW50ZXJtQmluYXJ5KiBub2RlKQoreworICAgIFRRdWFsaWZpZXIgcXVhbGlmaWVyID0gbm9kZS0+Z2V0VHlwZSgpLmdldFF1YWxpZmllcigpOworICAgIAorICAgIGlmIChxdWFsaWZpZXIgIT0gRXZxQ29uc3QpIHsKKyAgICAgICAgVFN0cmluZyBidWY7CisgICAgICAgIGJ1Zi5hcHBlbmQoIidjb25zdHJ1Y3RvcicgOiBhc3NpZ25pbmcgbm9uLWNvbnN0YW50IHRvICIpOworICAgICAgICBidWYuYXBwZW5kKHR5cGUuZ2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4RXJyb3IsIGJ1Zi5jX3N0cigpLCBub2RlLT5nZXRMaW5lKCkpOworICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsgIAorICAgIH0KKworICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhJbnRlcm5hbEVycm9yLCAiQmluYXJ5IE5vZGUgZm91bmQgaW4gY29uc3RhbnQgY29uc3RydWN0b3IiLCBub2RlLT5nZXRMaW5lKCkpOworICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUQ29uc3RUcmF2ZXJzZXI6OnZpc2l0VW5hcnkoVmlzaXQgdmlzaXQsIFRJbnRlcm1VbmFyeSogbm9kZSkKK3sKKyAgICBUU3RyaW5nIGJ1ZjsKKyAgICBidWYuYXBwZW5kKCInY29uc3RydWN0b3InIDogYXNzaWduaW5nIG5vbi1jb25zdGFudCB0byAiKTsKKyAgICBidWYuYXBwZW5kKHR5cGUuZ2V0Q29tcGxldGVTdHJpbmcoKSk7CisgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhFcnJvciwgYnVmLmNfc3RyKCksIG5vZGUtPmdldExpbmUoKSk7CisgICAgZXJyb3IgPSB0cnVlOworICAgIHJldHVybiBmYWxzZTsgIAorfQorCitib29sIFRDb25zdFRyYXZlcnNlcjo6dmlzaXRBZ2dyZWdhdGUoVmlzaXQgdmlzaXQsIFRJbnRlcm1BZ2dyZWdhdGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlLT5pc0NvbnN0cnVjdG9yKCkgJiYgbm9kZS0+Z2V0T3AoKSAhPSBFT3BDb21tYSkgeworICAgICAgICBUU3RyaW5nIGJ1ZjsKKyAgICAgICAgYnVmLmFwcGVuZCgiJ2NvbnN0cnVjdG9yJyA6IGFzc2lnbmluZyBub24tY29uc3RhbnQgdG8gIik7CisgICAgICAgIGJ1Zi5hcHBlbmQodHlwZS5nZXRDb21wbGV0ZVN0cmluZygpKTsKKyAgICAgICAgaW5mb1NpbmsuaW5mby5tZXNzYWdlKEVQcmVmaXhFcnJvciwgYnVmLmNfc3RyKCksIG5vZGUtPmdldExpbmUoKSk7CisgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgCisgICAgfQorCisgICAgaWYgKG5vZGUtPmdldFNlcXVlbmNlKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBmbGFnID0gbm9kZS0+Z2V0U2VxdWVuY2UoKS5zaXplKCkgPT0gMSAmJiBub2RlLT5nZXRTZXF1ZW5jZSgpWzBdLT5nZXRBc1R5cGVkKCktPmdldEFzQ29uc3RhbnRVbmlvbigpOworICAgIGlmIChmbGFnKSAKKyAgICB7CisgICAgICAgIHNpbmdsZUNvbnN0YW50UGFyYW0gPSB0cnVlOyAKKyAgICAgICAgY29uc3RydWN0b3JUeXBlID0gbm9kZS0+Z2V0T3AoKTsKKyAgICAgICAgc2l6ZSA9IG5vZGUtPmdldFR5cGUoKS5nZXRPYmplY3RTaXplKCk7CisKKyAgICAgICAgaWYgKG5vZGUtPmdldFR5cGUoKS5pc01hdHJpeCgpKSB7CisgICAgICAgICAgICBpc01hdHJpeCA9IHRydWU7CisgICAgICAgICAgICBtYXRyaXhTaXplID0gbm9kZS0+Z2V0VHlwZSgpLmdldE5vbWluYWxTaXplKCk7CisgICAgICAgIH0KKyAgICB9ICAgICAgIAorCisgICAgZm9yIChUSW50ZXJtU2VxdWVuY2U6Oml0ZXJhdG9yIHAgPSBub2RlLT5nZXRTZXF1ZW5jZSgpLmJlZ2luKCk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICE9IG5vZGUtPmdldFNlcXVlbmNlKCkuZW5kKCk7IHArKykgeworCisgICAgICAgIGlmIChub2RlLT5nZXRPcCgpID09IEVPcENvbW1hKQorICAgICAgICAgICAgaW5kZXggPSAwOyAgICAgICAgICAgCisKKyAgICAgICAgKCpwKS0+dHJhdmVyc2UodGhpcyk7CisgICAgfSAgIAorICAgIGlmIChmbGFnKSAKKyAgICB7CisgICAgICAgIHNpbmdsZUNvbnN0YW50UGFyYW0gPSBmYWxzZTsgICAKKyAgICAgICAgY29uc3RydWN0b3JUeXBlID0gRU9wTnVsbDsKKyAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIGlzTWF0cml4ID0gZmFsc2U7CisgICAgICAgIG1hdHJpeFNpemUgPSAwOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVENvbnN0VHJhdmVyc2VyOjp2aXNpdFNlbGVjdGlvbihWaXNpdCB2aXNpdCwgVEludGVybVNlbGVjdGlvbiogbm9kZSkKK3sKKyAgICBpbmZvU2luay5pbmZvLm1lc3NhZ2UoRVByZWZpeEludGVybmFsRXJyb3IsICJTZWxlY3Rpb24gTm9kZSBmb3VuZCBpbiBjb25zdGFudCBjb25zdHJ1Y3RvciIsIG5vZGUtPmdldExpbmUoKSk7CisgICAgZXJyb3IgPSB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUQ29uc3RUcmF2ZXJzZXI6OnZpc2l0Q29uc3RhbnRVbmlvbihUSW50ZXJtQ29uc3RhbnRVbmlvbiogbm9kZSkKK3sKKyAgICBDb25zdGFudFVuaW9uKiBsZWZ0VW5pb25BcnJheSA9IHVuaW9uQXJyYXk7CisgICAgaW50IGluc3RhbmNlU2l6ZSA9IHR5cGUuZ2V0T2JqZWN0U2l6ZSgpOworCisgICAgaWYgKGluZGV4ID49IGluc3RhbmNlU2l6ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFzaW5nbGVDb25zdGFudFBhcmFtKSB7CisgICAgICAgIGludCBzaXplID0gbm9kZS0+Z2V0VHlwZSgpLmdldE9iamVjdFNpemUoKTsKKyAgICAKKyAgICAgICAgQ29uc3RhbnRVbmlvbiAqcmlnaHRVbmlvbkFycmF5ID0gbm9kZS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gaW5zdGFuY2VTaXplKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGxlZnRVbmlvbkFycmF5W2luZGV4XSA9IHJpZ2h0VW5pb25BcnJheVtpXTsKKworICAgICAgICAgICAgKGluZGV4KSsrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHRvdGFsU2l6ZSA9IGluZGV4ICsgc2l6ZTsKKyAgICAgICAgQ29uc3RhbnRVbmlvbiAqcmlnaHRVbmlvbkFycmF5ID0gbm9kZS0+Z2V0VW5pb25BcnJheVBvaW50ZXIoKTsKKyAgICAgICAgaWYgKCFpc01hdHJpeCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBpbmRleDsgaSA8IHRvdGFsU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPj0gaW5zdGFuY2VTaXplKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBsZWZ0VW5pb25BcnJheVtpXSA9IHJpZ2h0VW5pb25BcnJheVtjb3VudF07CisKKyAgICAgICAgICAgICAgICAoaW5kZXgpKys7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG5vZGUtPmdldFR5cGUoKS5nZXRPYmplY3RTaXplKCkgPiAxKQorICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgLy8gZm9yIG1hdHJpeCBjb25zdHJ1Y3RvcnMKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBpbnQgZWxlbWVudCA9IGluZGV4OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgdG90YWxTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBpbnN0YW5jZVNpemUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAtIGkgPT0gMCB8fCAoaSAtIGVsZW1lbnQpICUgKG1hdHJpeFNpemUgKyAxKSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgbGVmdFVuaW9uQXJyYXlbaV0gPSByaWdodFVuaW9uQXJyYXlbY291bnRdOworICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgIGxlZnRVbmlvbkFycmF5W2ldLnNldEZDb25zdCgwLjBmKTsKKworICAgICAgICAgICAgICAgIChpbmRleCkrKzsKKworICAgICAgICAgICAgICAgIGlmIChub2RlLT5nZXRUeXBlKCkuZ2V0T2JqZWN0U2l6ZSgpID4gMSkKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgVENvbnN0VHJhdmVyc2VyOjp2aXNpdExvb3AoVmlzaXQgdmlzaXQsIFRJbnRlcm1Mb29wKiBub2RlKQoreworICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkxvb3AgTm9kZSBmb3VuZCBpbiBjb25zdGFudCBjb25zdHJ1Y3RvciIsIG5vZGUtPmdldExpbmUoKSk7CisgICAgZXJyb3IgPSB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUQ29uc3RUcmF2ZXJzZXI6OnZpc2l0QnJhbmNoKFZpc2l0IHZpc2l0LCBUSW50ZXJtQnJhbmNoKiBub2RlKQoreworICAgIGluZm9TaW5rLmluZm8ubWVzc2FnZShFUHJlZml4SW50ZXJuYWxFcnJvciwgIkJyYW5jaCBOb2RlIGZvdW5kIGluIGNvbnN0YW50IGNvbnN0cnVjdG9yIiwgbm9kZS0+Z2V0TGluZSgpKTsKKyAgICBlcnJvciA9IHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLworLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgb25lIHRvIGNhbGwgZXh0ZXJuYWxseSB0byBzdGFydCB0aGUgdHJhdmVyc2FsLgorLy8gSW5kaXZpZHVhbCBmdW5jdGlvbnMgY2FuIGJlIGluaXRpYWxpemVkIHRvIDAgdG8gc2tpcCBwcm9jZXNzaW5nIG9mIHRoYXQKKy8vIHR5cGUgb2Ygbm9kZS4gIEl0J3MgY2hpbGRyZW4gd2lsbCBzdGlsbCBiZSBwcm9jZXNzZWQuCisvLworYm9vbCBUSW50ZXJtZWRpYXRlOjpwYXJzZUNvbnN0VHJlZShUU291cmNlTG9jIGxpbmUsIFRJbnRlcm1Ob2RlKiByb290LCBDb25zdGFudFVuaW9uKiB1bmlvbkFycmF5LCBUT3BlcmF0b3IgY29uc3RydWN0b3JUeXBlLCBUU3ltYm9sVGFibGUmIHN5bWJvbFRhYmxlLCBUVHlwZSB0LCBib29sIHNpbmdsZUNvbnN0YW50UGFyYW0pCit7CisgICAgaWYgKHJvb3QgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgVENvbnN0VHJhdmVyc2VyIGl0KHVuaW9uQXJyYXksIHNpbmdsZUNvbnN0YW50UGFyYW0sIGNvbnN0cnVjdG9yVHlwZSwgaW5mb1NpbmssIHN5bWJvbFRhYmxlLCB0KTsKKworICAgIHJvb3QtPnRyYXZlcnNlKCZpdCk7CisgICAgaWYgKGl0LmVycm9yKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9hdG9tLmMgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvYXRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2MzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvYXRvbS5jCkBAIC0wLDAgKzEsNzM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKK0NvcHlyaWdodCAoYykgMjAwMiwgTlZJRElBIENvcnBvcmF0aW9uLgorCitOVklESUEgQ29ycG9yYXRpb24oIk5WSURJQSIpIHN1cHBsaWVzIHRoaXMgc29mdHdhcmUgdG8geW91IGluCitjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwKK2luc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgTlZJRElBIHNvZnR3YXJlCitjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlCit0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBOVklESUEKK3NvZnR3YXJlLgorCitJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZAorc3ViamVjdCB0byB0aGVzZSB0ZXJtcywgTlZJRElBIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZQorbGljZW5zZSwgdW5kZXIgTlZJRElBJ3MgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIE5WSURJQSBzb2Z0d2FyZSAodGhlCisiTlZJRElBIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUKK05WSURJQSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Citmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBOVklESUEgU29mdHdhcmUsIHlvdSBtdXN0CityZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2Ugb2YgTlZJRElBLCB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwordGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBOVklESUEgU29mdHdhcmUuCitOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG5vciBsb2dvcyBvZiBOVklESUEKK0NvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCitOVklESUEgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOVklESUEuCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzCitleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IE5WSURJQSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUKK3dvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBOVklESUEgU29mdHdhcmUgbWF5IGJlCitpbmNvcnBvcmF0ZWQuIE5vIGhhcmR3YXJlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCisKK1RIRSBOVklESUEgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELAorSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IKK0lUUyBVU0UgQU5EIE9QRVJBVElPTiBFSVRIRVIgQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBPVEhFUgorUFJPRFVDVFMuCisKK0lOIE5PIEVWRU5UIFNIQUxMIE5WSURJQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIEVYRU1QTEFSWSwgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIExPU1QgUFJPRklUUzsgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIE9SIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFCitOVklESUEgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwKK1RPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYKK05WSURJQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLworLy8gYXRvbS5jCisvLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImNvbXBpbGVyL2RlYnVnLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL3NsZ2xvYmFscy5oIgorCisjdW5kZWYgbWFsbG9jCisjdW5kZWYgcmVhbGxvYworI3VuZGVmIGZyZWUKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTdHJpbmcgdGFibGU6IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgdmFsOworICAgIGNvbnN0IGNoYXIgKnN0cjsKK30gdG9rZW5zW10gPSB7CisgICAgeyBDUFBfQU5EX09QLCAgICAgICAgICImJiIgfSwKKyAgICB7IENQUF9BTkRfQVNTSUdOLCAgICAgIiY9IiB9LAorICAgIHsgQ1BQX1NVQl9BU1NJR04sICAgICAiLT0iIH0sCisgICAgeyBDUFBfTU9EX0FTU0lHTiwgICAgICIlPSIgfSwKKyAgICB7IENQUF9BRERfQVNTSUdOLCAgICAgIis9IiB9LAorICAgIHsgQ1BQX0RJVl9BU1NJR04sICAgICAiLz0iIH0sCisgICAgeyBDUFBfTVVMX0FTU0lHTiwgICAgICIqPSIgfSwKKyAgICB7IENQUF9SSUdIVF9CUkFDS0VULCAgIjo+IiB9LAorICAgIHsgQ1BQX0VRX09QLCAgICAgICAgICAiPT0iIH0sCisgICAgeyBDUFBfWE9SX09QLCAgICAgICAgICJeXiIgfSwgCisgICAgeyBDUFBfWE9SX0FTU0lHTiwgICAgICJePSIgfSwgCisgICAgeyBDUFBfRkxPQVRDT05TVEFOVCwgICI8ZmxvYXQtY29uc3Q+IiB9LAorICAgIHsgQ1BQX0dFX09QLCAgICAgICAgICAiPj0iIH0sCisgICAgeyBDUFBfUklHSFRfT1AsICAgICAgICI+PiIgfSwKKyAgICB7IENQUF9SSUdIVF9BU1NJR04sICAgIj4+PSIgfSwgCisgICAgeyBDUFBfSURFTlRJRklFUiwgICAgICI8aWRlbnQ+IiB9LAorICAgIHsgQ1BQX0lOVENPTlNUQU5ULCAgICAiPGludC1jb25zdD4iIH0sCisgICAgeyBDUFBfTEVfT1AsICAgICAgICAgICI8PSIgfSwKKyAgICB7IENQUF9MRUZUX09QLCAgICAgICAgIjw8IiB9LAorICAgIHsgQ1BQX0xFRlRfQVNTSUdOLCAgICAiPDw9IiB9LAorICAgIHsgQ1BQX0xFRlRfQlJBQ0tFVCwgICAiPDoiIH0sCisgICAgeyBDUFBfTEVGVF9CUkFDRSwgICAgICI8JSIgfSwgCisgICAgeyBDUFBfREVDX09QLCAgICAgICAgICItLSIgfSwKKyAgICB7IENQUF9SSUdIVF9CUkFDRSwgICAgIiU+IiB9LCAKKyAgICB7IENQUF9ORV9PUCwgICAgICAgICAgIiE9IiB9LAorICAgIHsgQ1BQX09SX09QLCAgICAgICAgICAifHwiIH0sCisgICAgeyBDUFBfT1JfQVNTSUdOLCAgICAgICJ8PSIgfSwgCisgICAgeyBDUFBfSU5DX09QLCAgICAgICAgICIrKyIgfSwKKyAgICB7IENQUF9TVFJDT05TVEFOVCwgICAgIjxzdHJpbmctY29uc3Q+IiB9LAorICAgIHsgQ1BQX1RZUEVJREVOVElGSUVSLCAiPHR5cGUtaWRlbnQ+IiB9LAorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTdHJpbmcgdGFibGU6IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIElOSVRfU1RSSU5HX1RBQkxFX1NJWkUgMTYzODQKKwordHlwZWRlZiBzdHJ1Y3QgU3RyaW5nVGFibGVfUmVjIHsKKyAgICBjaGFyICpzdHJpbmdzOworICAgIGludCBuZXh0RnJlZTsKKyAgICBpbnQgc2l6ZTsKK30gU3RyaW5nVGFibGU7CisKKy8qCisgKiBJbml0U3RyaW5nVGFibGUoKSAtIEluaXRpYWxpemUgdGhlIHN0cmluZyB0YWJsZS4KKyAqCisgKi8KKworc3RhdGljIGludCBJbml0U3RyaW5nVGFibGUoU3RyaW5nVGFibGUgKnN0YWJsZSkKK3sKKyAgICBzdGFibGUtPnN0cmluZ3MgPSAoY2hhciAqKSBtYWxsb2MoSU5JVF9TVFJJTkdfVEFCTEVfU0laRSk7CisgICAgaWYgKCFzdGFibGUtPnN0cmluZ3MpCisgICAgICAgIHJldHVybiAwOworICAgIC8vIFplcm8tdGggb2Zmc2V0IG1lYW5zICJlbXB0eSIgc28gZG9uJ3QgdXNlIGl0LgorICAgIHN0YWJsZS0+bmV4dEZyZWUgPSAxOworICAgIHN0YWJsZS0+c2l6ZSA9IElOSVRfU1RSSU5HX1RBQkxFX1NJWkU7CisgICAgcmV0dXJuIDE7Cit9IC8vIEluaXRTdHJpbmdUYWJsZQorCisvKgorICogRnJlZVN0cmluZ1RhYmxlKCkgLSBGcmVlIHRoZSBzdHJpbmcgdGFibGUuCisgKgorICovCisKK3N0YXRpYyB2b2lkIEZyZWVTdHJpbmdUYWJsZShTdHJpbmdUYWJsZSAqc3RhYmxlKQoreworICAgIGlmIChzdGFibGUtPnN0cmluZ3MpCisgICAgICAgIGZyZWUoc3RhYmxlLT5zdHJpbmdzKTsKKyAgICBzdGFibGUtPnN0cmluZ3MgPSBOVUxMOworICAgIHN0YWJsZS0+bmV4dEZyZWUgPSAwOworICAgIHN0YWJsZS0+c2l6ZSA9IDA7Cit9IC8vIEZyZWVTdHJpbmdUYWJsZQorCisvKgorICogSGFzaFN0cmluZygpIC0gSGFzaCBhIHN0cmluZyB3aXRoIHRoZSBiYXNlIGhhc2ggZnVuY3Rpb24uCisgKgorICovCisKK3N0YXRpYyBpbnQgSGFzaFN0cmluZyhjb25zdCBjaGFyICpzKQoreworICAgIGludCBodmFsID0gMDsKKworICAgIHdoaWxlICgqcykgeworICAgICAgICBodmFsID0gKGh2YWwqMTM1MDcgKyAqcyoxOTcpIF4gKGh2YWwgPj4gMik7CisgICAgICAgIHMrKzsKKyAgICB9CisgICAgcmV0dXJuIGh2YWwgJiAweDdmZmZmZmZmOworfSAvLyBIYXNoU3RyaW5nCisKKy8qCisgKiBIYXNoU3RyaW5nMigpIC0gSGFzaCBhIHN0cmluZyB3aXRoIHRoZSBpbmNyaW1lbnRpbmcgaGFzaCBmdW5jdGlvbi4KKyAqCisgKi8KKworc3RhdGljIGludCBIYXNoU3RyaW5nMihjb25zdCBjaGFyICpzKQoreworICAgIGludCBodmFsID0gMDsKKworICAgIHdoaWxlICgqcykgeworICAgICAgICBodmFsID0gKGh2YWwqNzI5ICsgKnMqMzcpIF4gKGh2YWwgPj4gMSk7CisgICAgICAgIHMrKzsKKyAgICB9CisgICAgcmV0dXJuIGh2YWw7Cit9IC8vIEhhc2hTdHJpbmcyCisKKy8qCisgKiBBZGRTdHJpbmcoKSAtIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyB0YWJsZS4gIFJldHVybiBpdCdzIG9mZnNldC4KKyAqCisgKi8KKworc3RhdGljIGludCBBZGRTdHJpbmcoU3RyaW5nVGFibGUgKnN0YWJsZSwgY29uc3QgY2hhciAqcykKK3sKKyAgICBpbnQgbGVuLCBsb2M7CisgICAgY2hhciAqc3RyOworCisgICAgbGVuID0gKGludCkgc3RybGVuKHMpOworICAgIHdoaWxlIChzdGFibGUtPm5leHRGcmVlICsgbGVuICsgMSA+PSBzdGFibGUtPnNpemUpIHsKKyAgICAgICAgYXNzZXJ0KHN0YWJsZS0+c2l6ZSA8IDEwMDAwMDApOworICAgICAgICBzdHIgPSAoY2hhciAqKSBtYWxsb2Moc3RhYmxlLT5zaXplKjIpOworICAgICAgICBtZW1jcHkoc3RyLCBzdGFibGUtPnN0cmluZ3MsIHN0YWJsZS0+c2l6ZSk7CisgICAgICAgIGZyZWUoc3RhYmxlLT5zdHJpbmdzKTsKKyAgICAgICAgc3RhYmxlLT5zdHJpbmdzID0gc3RyOworICAgICAgICBzdGFibGUtPnNpemUgPSBzdGFibGUtPnNpemUqMjsKKyAgICB9CisgICAgbG9jID0gc3RhYmxlLT5uZXh0RnJlZTsKKyAgICBzdHJjcHkoJnN0YWJsZS0+c3RyaW5nc1tsb2NdLCBzKTsKKyAgICBzdGFibGUtPm5leHRGcmVlICs9IGxlbiArIDE7CisgICAgcmV0dXJuIGxvYzsKK30gLy8gQWRkU3RyaW5nCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEhhc2ggdGFibGU6IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJTklUX0hBU0hfVEFCTEVfU0laRSAyMDQ3CisjZGVmaW5lIEhBU0hfVEFCTEVfTUFYX0NPTExJU0lPTlMgMworCit0eXBlZGVmIHN0cnVjdCBIYXNoRW50cnlfUmVjIHsKKyAgICBpbnQgaW5kZXg7ICAgICAgLy8gU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICBpbnQgdmFsdWU7ICAgICAgLy8gQXRvbSAoc3ltYm9sKSB2YWx1ZQorfSBIYXNoRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IEhhc2hUYWJsZV9SZWMgeworICAgIEhhc2hFbnRyeSAqZW50cnk7CisgICAgaW50IHNpemU7CisgICAgaW50IGVudHJpZXM7CisgICAgaW50IGNvdW50c1tIQVNIX1RBQkxFX01BWF9DT0xMSVNJT05TICsgMV07Cit9IEhhc2hUYWJsZTsKKworLyoKKyAqIEluaXRIYXNoVGFibGUoKSAtIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUuCisgKgorICovCisKK3N0YXRpYyBpbnQgSW5pdEhhc2hUYWJsZShIYXNoVGFibGUgKmh0YWJsZSwgaW50IGZzaXplKQoreworICAgIGludCBpaTsKKworICAgIGh0YWJsZS0+ZW50cnkgPSAoSGFzaEVudHJ5ICopIG1hbGxvYyhzaXplb2YoSGFzaEVudHJ5KSpmc2l6ZSk7CisgICAgaWYgKCFodGFibGUtPmVudHJ5KQorICAgICAgICByZXR1cm4gMDsKKyAgICBodGFibGUtPnNpemUgPSBmc2l6ZTsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBmc2l6ZTsgaWkrKykgeworICAgICAgICBodGFibGUtPmVudHJ5W2lpXS5pbmRleCA9IDA7CisgICAgICAgIGh0YWJsZS0+ZW50cnlbaWldLnZhbHVlID0gMDsKKyAgICB9CisgICAgaHRhYmxlLT5lbnRyaWVzID0gMDsKKyAgICBmb3IgKGlpID0gMDsgaWkgPD0gSEFTSF9UQUJMRV9NQVhfQ09MTElTSU9OUzsgaWkrKykKKyAgICAgICAgaHRhYmxlLT5jb3VudHNbaWldID0gMDsKKyAgICByZXR1cm4gMTsKK30gLy8gSW5pdEhhc2hUYWJsZQorCisvKgorICogRnJlZUhhc2hUYWJsZSgpIC0gRnJlZSB0aGUgaGFzaCB0YWJsZS4KKyAqCisgKi8KKworc3RhdGljIHZvaWQgRnJlZUhhc2hUYWJsZShIYXNoVGFibGUgKmh0YWJsZSkKK3sKKyAgICBpZiAoaHRhYmxlLT5lbnRyeSkKKyAgICAgICAgZnJlZShodGFibGUtPmVudHJ5KTsKKyAgICBodGFibGUtPmVudHJ5ID0gTlVMTDsKKyAgICBodGFibGUtPnNpemUgPSAwOworICAgIGh0YWJsZS0+ZW50cmllcyA9IDA7Cit9IC8vIEZyZWVIYXNoVGFibGUKKworLyoKKyAqIEVtcHR5KCkgLSBTZWUgaWYgYSBoYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LgorICoKKyAqLworCitzdGF0aWMgaW50IEVtcHR5KEhhc2hUYWJsZSAqaHRhYmxlLCBpbnQgaGFzaGxvYykKK3sKKyAgICBhc3NlcnQoaGFzaGxvYyA+PSAwICYmIGhhc2hsb2MgPCBodGFibGUtPnNpemUpOworICAgIGlmIChodGFibGUtPmVudHJ5W2hhc2hsb2NdLmluZGV4ID09IDApIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfSAvLyBFbXB0eQorCisvKgorICogTWF0Y2goKSAtIFNlZSBpZiBhIGhhc2ggdGFibGUgZW50cnkgaXMgbWF0Y2hlcyBhIHN0cmluZy4KKyAqCisgKi8KKworc3RhdGljIGludCBNYXRjaChIYXNoVGFibGUgKmh0YWJsZSwgU3RyaW5nVGFibGUgKnN0YWJsZSwgY29uc3QgY2hhciAqcywgaW50IGhhc2hsb2MpCit7CisgICAgaW50IHN0cmxvYzsKKworICAgIHN0cmxvYyA9IGh0YWJsZS0+ZW50cnlbaGFzaGxvY10uaW5kZXg7CisgICAgaWYgKCFzdHJjbXAocywgJnN0YWJsZS0+c3RyaW5nc1tzdHJsb2NdKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9IC8vIE1hdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEF0b20gdGFibGU6IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJTklUX0FUT01fVEFCTEVfU0laRSAxMDI0CisKKworc3RydWN0IEF0b21UYWJsZV9SZWMgeworICAgIFN0cmluZ1RhYmxlIHN0YWJsZTsgLy8gU3RyaW5nIHRhYmxlLgorICAgIEhhc2hUYWJsZSBodGFibGU7ICAgLy8gSGFzaGVzIHN0cmluZyB0byBhdG9tIG51bWJlciBhbmQgdG9rZW4gdmFsdWUuICBNdWx0aXBsZSBzdHJpbmdzIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0aGUgc2FtZSB0b2tlbiB2YWx1ZSBidXQgZWFjaCB1bmlxdWUgc3RyaW5nIGlzIGEgdW5pcXVlIGF0b20uCisgICAgaW50ICphbWFwOyAgICAgICAgICAvLyBNYXBzIGF0b20gdmFsdWUgdG8gb2Zmc2V0IGluIHN0cmluZyB0YWJsZS4gIEF0b21zIGFsbCBtYXAgdG8gdW5pcXVlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmdzIGV4Y2VwdCBmb3Igc29tZSB1bmRlZmluZWQgdmFsdWVzIGluIHRoZSBsb3dlciwgZml4ZWQgcGFydAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGF0b20gdGFibGUgdGhhdCBtYXAgdG8gIjx1bmRlZmluZWQ+Ii4gIFRoZSBsb3dlc3QgMjU2IGF0b21zCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZXNwb25kIHRvIHNpbmdsZSBjaGFyYWN0ZXIgQVNDSUkgdmFsdWVzIGV4Y2VwdCBmb3IgYWxwaGFudW1lcmljCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIGFuZCAnXycsIHdoaWNoIGNhbiBiZSBvdGhlciB0b2tlbnMuICBOZXh0IGNvbWUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYW5ndWFnZSB0b2tlbnMgd2l0aCB0aGVpciBhdG9tIHZhbHVlcyBlcXVhbCB0byB0aGUgdG9rZW4gdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVuIGNvbWUgcHJlZGVmaW5lZCBhdG9tcywgZm9sbG93ZWQgYnkgdXNlciBzcGVjaWZpZWQgaWRlbnRpZmllcnMuCisgICAgaW50ICphcmV2OyAgICAgICAgICAvLyBSZXZlcnNlZCBhdG9tIGZvciBzeW1ib2wgdGFibGUgdXNlLgorICAgIGludCBuZXh0RnJlZTsKKyAgICBpbnQgc2l6ZTsKK307CisKK3N0YXRpYyBBdG9tVGFibGUgbGF0YWJsZSA9IHsgeyAwIH0gfTsKK0F0b21UYWJsZSAqYXRhYmxlID0gJmxhdGFibGU7CisKK3N0YXRpYyBpbnQgQWRkQXRvbUZpeGVkKEF0b21UYWJsZSAqYXRhYmxlLCBjb25zdCBjaGFyICpzLCBpbnQgYXRvbSk7CisKKy8qCisgKiBHcm93QXRvbVRhYmxlKCkgLSBHcm93IHRoZSBhdG9tIHRhYmxlIHRvIGF0IGxlYXN0ICJzaXplIiBpZiBpdCdzIHNtYWxsZXIuCisgKgorICovCisKK3N0YXRpYyBpbnQgR3Jvd0F0b21UYWJsZShBdG9tVGFibGUgKmF0YWJsZSwgaW50IHNpemUpCit7CisgICAgaW50ICpuZXdtYXAsICpuZXdyZXY7CisKKyAgICBpZiAoYXRhYmxlLT5zaXplIDwgc2l6ZSkgeworICAgICAgICBpZiAoYXRhYmxlLT5hbWFwKSB7CisgICAgICAgICAgICBuZXdtYXAgPSByZWFsbG9jKGF0YWJsZS0+YW1hcCwgc2l6ZW9mKGludCkqc2l6ZSk7CisgICAgICAgICAgICBuZXdyZXYgPSByZWFsbG9jKGF0YWJsZS0+YXJldiwgc2l6ZW9mKGludCkqc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdtYXAgPSBtYWxsb2Moc2l6ZW9mKGludCkqc2l6ZSk7CisgICAgICAgICAgICBuZXdyZXYgPSBtYWxsb2Moc2l6ZW9mKGludCkqc2l6ZSk7CisgICAgICAgICAgICBhdGFibGUtPnNpemUgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICghbmV3bWFwIHx8ICFuZXdyZXYpIHsKKyAgICAgICAgICAgIC8qIGZhaWxlZCB0byBncm93IC0tIGVycm9yICovCisgICAgICAgICAgICBpZiAobmV3bWFwKQorICAgICAgICAgICAgICAgIGF0YWJsZS0+YW1hcCA9IG5ld21hcDsKKyAgICAgICAgICAgIGlmIChuZXdyZXYpCisgICAgICAgICAgICAgICAgYXRhYmxlLT5hcmV2ID0gbmV3cmV2OworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbXNldCgmbmV3bWFwW2F0YWJsZS0+c2l6ZV0sIDAsIChzaXplIC0gYXRhYmxlLT5zaXplKSAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgbWVtc2V0KCZuZXdyZXZbYXRhYmxlLT5zaXplXSwgMCwgKHNpemUgLSBhdGFibGUtPnNpemUpICogc2l6ZW9mKGludCkpOworICAgICAgICBhdGFibGUtPmFtYXAgPSBuZXdtYXA7CisgICAgICAgIGF0YWJsZS0+YXJldiA9IG5ld3JldjsKKyAgICAgICAgYXRhYmxlLT5zaXplID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8vIEdyb3dBdG9tVGFibGUKKworLyoKKyAqIGxSZXZlcnNlKCkgLSBSZXZlcnNlIHRoZSBib3R0b20gMjAgYml0cyBvZiBhIDMyIGJpdCBpbnQuCisgKgorICovCisKK3N0YXRpYyBpbnQgbFJldmVyc2UoaW50IGZ2YWwpCit7CisgICAgdW5zaWduZWQgaW50IGluID0gZnZhbDsKKyAgICBpbnQgcmVzdWx0ID0gMCwgY250ID0gMDsKKworICAgIHdoaWxlKGluKSB7CisgICAgICAgIHJlc3VsdCA8PD0gMTsKKyAgICAgICAgcmVzdWx0IHw9IGluJjE7CisgICAgICAgIGluID4+PSAxOworICAgICAgICBjbnQrKzsKKyAgICB9CisKKyAgICAvLyBEb24ndCB1c2UgYWxsIDMxIGJpdHMuICBPbmUgbWlsbGlvbiBhdG9tcyBpcyBwbGVudHkgYW5kIHNvbWV0aW1lcyB0aGUKKyAgICAvLyB1cHBlciBiaXRzIGFyZSB1c2VkIGZvciBvdGhlciB0aGluZ3MuCisKKyAgICBpZiAoY250IDwgMjApCisgICAgICAgIHJlc3VsdCA8PD0gMjAgLSBjbnQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gbFJldmVyc2UKKworLyoKKyAqIEFsbG9jYXRlQXRvbSgpIC0gQWxsb2NhdGUgYSBuZXcgYXRvbS4gIEFzc29jaWF0ZWQgd2l0aCB0aGUgInVuZGVmaW5lZCIgdmFsdWUgb2YgLTEuCisgKgorICovCisKK3N0YXRpYyBpbnQgQWxsb2NhdGVBdG9tKEF0b21UYWJsZSAqYXRhYmxlKQoreworICAgIGlmIChhdGFibGUtPm5leHRGcmVlID49IGF0YWJsZS0+c2l6ZSkKKyAgICAgICAgR3Jvd0F0b21UYWJsZShhdGFibGUsIGF0YWJsZS0+bmV4dEZyZWUqMik7CisgICAgYXRhYmxlLT5hbWFwW2F0YWJsZS0+bmV4dEZyZWVdID0gLTE7CisgICAgYXRhYmxlLT5hcmV2W2F0YWJsZS0+bmV4dEZyZWVdID0gbFJldmVyc2UoYXRhYmxlLT5uZXh0RnJlZSk7CisgICAgYXRhYmxlLT5uZXh0RnJlZSsrOworICAgIHJldHVybiBhdGFibGUtPm5leHRGcmVlIC0gMTsKK30gLy8gQWxsb2NhdGVBdG9tCisKKy8qCisgKiBTZXRBdG9tVmFsdWUoKSAtIEFsbG9jYXRlIGEgbmV3IGF0b20gYXNzb2NpYXRlZCB3aXRoICJoYXNoaW5kZXgiLgorICoKKyAqLworCitzdGF0aWMgdm9pZCBTZXRBdG9tVmFsdWUoQXRvbVRhYmxlICphdGFibGUsIGludCBhdG9tbnVtYmVyLCBpbnQgaGFzaGluZGV4KQoreworICAgIGF0YWJsZS0+YW1hcFthdG9tbnVtYmVyXSA9IGF0YWJsZS0+aHRhYmxlLmVudHJ5W2hhc2hpbmRleF0uaW5kZXg7CisgICAgYXRhYmxlLT5odGFibGUuZW50cnlbaGFzaGluZGV4XS52YWx1ZSA9IGF0b21udW1iZXI7Cit9IC8vIFNldEF0b21WYWx1ZQorCisvKgorICogRmluZEhhc2hMb2MoKSAtIEZpbmQgdGhlIGhhc2ggbG9jYXRpb24gZm9yIHRoaXMgc3RyaW5nLiAgUmV0dXJuIC0xIGl0IGhhc2ggdGFibGUgaXMgZnVsbC4KKyAqCisgKi8KKworc3RhdGljIGludCBGaW5kSGFzaExvYyhBdG9tVGFibGUgKmF0YWJsZSwgY29uc3QgY2hhciAqcykKK3sKKyAgICBpbnQgaGFzaGxvYywgaGFzaGRlbHRhLCBjb3VudDsKKyAgICBpbnQgRm91bmRFbXB0eVNsb3QgPSAwOworICAgIGludCBjb2xsaXNpb25bSEFTSF9UQUJMRV9NQVhfQ09MTElTSU9OUyArIDFdOworCisgICAgaGFzaGxvYyA9IEhhc2hTdHJpbmcocykgJSBhdGFibGUtPmh0YWJsZS5zaXplOworICAgIGlmICghRW1wdHkoJmF0YWJsZS0+aHRhYmxlLCBoYXNobG9jKSkgeworICAgICAgICBpZiAoTWF0Y2goJmF0YWJsZS0+aHRhYmxlLCAmYXRhYmxlLT5zdGFibGUsIHMsIGhhc2hsb2MpKQorICAgICAgICAgICAgcmV0dXJuIGhhc2hsb2M7CisgICAgICAgIGNvbGxpc2lvblswXSA9IGhhc2hsb2M7CisgICAgICAgIGhhc2hkZWx0YSA9IEhhc2hTdHJpbmcyKHMpOworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChjb3VudCA8IEhBU0hfVEFCTEVfTUFYX0NPTExJU0lPTlMpIHsKKyAgICAgICAgICAgIGhhc2hsb2MgPSAoKGhhc2hsb2MgKyBoYXNoZGVsdGEpICYgMHg3ZmZmZmZmZikgJSBhdGFibGUtPmh0YWJsZS5zaXplOworICAgICAgICAgICAgaWYgKCFFbXB0eSgmYXRhYmxlLT5odGFibGUsIGhhc2hsb2MpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1hdGNoKCZhdGFibGUtPmh0YWJsZSwgJmF0YWJsZS0+c3RhYmxlLCBzLCBoYXNobG9jKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzaGxvYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEZvdW5kRW1wdHlTbG90ID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBjb2xsaXNpb25bY291bnRdID0gaGFzaGxvYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghRm91bmRFbXB0eVNsb3QpIHsKKyAgICAgICAgICAgIGlmIChjcHAtPm9wdGlvbnMuRHVtcEF0b21UYWJsZSkgeworICAgICAgICAgICAgICAgIGludCBpaTsKKyAgICAgICAgICAgICAgICBjaGFyIHN0clsyMDBdOworICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiKioqIEhhc2ggZmFpbGVkIHdpdGggbW9yZSB0aGFuICVkIGNvbGxpc2lvbnMuIE11c3QgaW5jcmVhc2UgaGFzaCB0YWJsZSBzaXplLiAqKioiLAorICAgICAgICAgICAgICAgICAgICAgICBIQVNIX1RBQkxFX01BWF9DT0xMSVNJT05TKTsKKyAgICAgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2coc3RyKTsKKworICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiKioqIE5ldyBzdHJpbmcgXCIlc1wiLCBoYXNoPSUwNHgsIGRlbHRhPSUwNHgiLCBzLCBjb2xsaXNpb25bMF0sIGhhc2hkZWx0YSk7CisgICAgICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKHN0cik7CisgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDw9IEhBU0hfVEFCTEVfTUFYX0NPTExJU0lPTlM7IGlpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIqKiogQ29sbGlkZXMgb24gdHJ5ICVkIGF0IGhhc2ggZW50cnkgJTA0eCB3aXRoIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSArIDEsIGNvbGxpc2lvbltpaV0sIEdldEF0b21TdHJpbmcoYXRhYmxlLCBhdGFibGUtPmh0YWJsZS5lbnRyeVtjb2xsaXNpb25baWldXS52YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2coc3RyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdGFibGUtPmh0YWJsZS5jb3VudHNbY291bnRdKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGhhc2hsb2M7Cit9IC8vIEZpbmRIYXNoTG9jCisKKy8qCisgKiBJbmNyZWFzZUhhc2hUYWJsZVNpemUoKQorICoKKyAqLworCitzdGF0aWMgaW50IEluY3JlYXNlSGFzaFRhYmxlU2l6ZShBdG9tVGFibGUgKmF0YWJsZSkKK3sKKyAgICBpbnQgaWksIHN0cmxvYywgb2xkaGFzaGxvYywgdmFsdWUsIHNpemU7CisgICAgQXRvbVRhYmxlIG9sZHRhYmxlOworICAgIGNoYXIgKnM7CisKKyAgICAvLyBTYXZlIHRoZSBvbGQgYXRvbSB0YWJsZSBhbmQgY3JlYXRlIGEgbmV3IG9uZToKKworICAgIG9sZHRhYmxlID0gKmF0YWJsZTsKKyAgICBzaXplID0gb2xkdGFibGUuaHRhYmxlLnNpemUqMiArIDE7CisgICAgaWYgKCFJbml0QXRvbVRhYmxlKGF0YWJsZSwgc2l6ZSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gQWRkIGFsbCB0aGUgZXhpc3RpbmcgdmFsdWVzIHRvIHRoZSBuZXcgYXRvbSB0YWJsZSBwcmVzZXJ2aW5nIHRoZWlyIGF0b20gdmFsdWVzOgorCisgICAgZm9yIChpaSA9IGF0YWJsZS0+bmV4dEZyZWU7IGlpIDwgb2xkdGFibGUubmV4dEZyZWU7IGlpKyspIHsKKyAgICAgICAgc3RybG9jID0gb2xkdGFibGUuYW1hcFtpaV07CisgICAgICAgIHMgPSAmb2xkdGFibGUuc3RhYmxlLnN0cmluZ3Nbc3RybG9jXTsKKyAgICAgICAgb2xkaGFzaGxvYyA9IEZpbmRIYXNoTG9jKCZvbGR0YWJsZSwgcyk7CisgICAgICAgIGFzc2VydChvbGRoYXNobG9jID49IDApOworICAgICAgICB2YWx1ZSA9IG9sZHRhYmxlLmh0YWJsZS5lbnRyeVtvbGRoYXNobG9jXS52YWx1ZTsKKyAgICAgICAgQWRkQXRvbUZpeGVkKGF0YWJsZSwgcywgdmFsdWUpOworICAgIH0KKyAgICBGcmVlQXRvbVRhYmxlKCZvbGR0YWJsZSk7CisgICAgcmV0dXJuIDE7Cit9IC8vIEluY3JlYXNlSGFzaFRhYmxlU2l6ZQorCisvKgorICogTG9va1VwQWRkU3RyaW5nSGFzaCgpIC0gTG9va3VwIGEgc3RyaW5nIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgaXQncyBub3QgdGhlcmUsIGFkZCBpdCBhbmQKKyAqICAgICAgICBpbml0aWFsaXplIHRoZSBhdG9tIHZhbHVlIGluIHRoZSBoYXNoIHRhYmxlIHRvIDAuICBSZXR1cm4gdGhlIGhhc2ggdGFibGUgaW5kZXguCisgKi8KKworc3RhdGljIGludCBMb29rVXBBZGRTdHJpbmdIYXNoKEF0b21UYWJsZSAqYXRhYmxlLCBjb25zdCBjaGFyICpzKQoreworICAgIGludCBoYXNobG9jLCBzdHJsb2M7CisKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIGhhc2hsb2MgPSBGaW5kSGFzaExvYyhhdGFibGUsIHMpOworICAgICAgICBpZiAoaGFzaGxvYyA+PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIEluY3JlYXNlSGFzaFRhYmxlU2l6ZShhdGFibGUpOworICAgIH0KKworICAgIGlmIChFbXB0eSgmYXRhYmxlLT5odGFibGUsIGhhc2hsb2MpKSB7CisgICAgICAgIGF0YWJsZS0+aHRhYmxlLmVudHJpZXMrKzsKKyAgICAgICAgc3RybG9jID0gQWRkU3RyaW5nKCZhdGFibGUtPnN0YWJsZSwgcyk7CisgICAgICAgIGF0YWJsZS0+aHRhYmxlLmVudHJ5W2hhc2hsb2NdLmluZGV4ID0gc3RybG9jOworICAgICAgICBhdGFibGUtPmh0YWJsZS5lbnRyeVtoYXNobG9jXS52YWx1ZSA9IDA7CisgICAgfQorICAgIHJldHVybiBoYXNobG9jOworfSAvLyBMb29rVXBBZGRTdHJpbmdIYXNoCisKKy8qCisgKiBMb29rVXBBZGRTdHJpbmcoKSAtIExvb2t1cCBhIHN0cmluZyBpbiB0aGUgaGFzaCB0YWJsZS4gIElmIGl0J3Mgbm90IHRoZXJlLCBhZGQgaXQgYW5kCisgKiAgICAgICAgaW5pdGlhbGl6ZSB0aGUgYXRvbSB2YWx1ZSBpbiB0aGUgaGFzaCB0YWJsZSB0byB0aGUgbmV4dCBhdG9tIG51bWJlci4KKyAqICAgICAgICBSZXR1cm4gdGhlIGF0b20gdmFsdWUgb2Ygc3RyaW5nLgorICovCisKK2ludCBMb29rVXBBZGRTdHJpbmcoQXRvbVRhYmxlICphdGFibGUsIGNvbnN0IGNoYXIgKnMpCit7CisgICAgaW50IGhhc2hpbmRleCwgYXRvbTsKKworICAgIGhhc2hpbmRleCA9IExvb2tVcEFkZFN0cmluZ0hhc2goYXRhYmxlLCBzKTsKKyAgICBhdG9tID0gYXRhYmxlLT5odGFibGUuZW50cnlbaGFzaGluZGV4XS52YWx1ZTsKKyAgICBpZiAoYXRvbSA9PSAwKSB7CisgICAgICAgIGF0b20gPSBBbGxvY2F0ZUF0b20oYXRhYmxlKTsKKyAgICAgICAgU2V0QXRvbVZhbHVlKGF0YWJsZSwgYXRvbSwgaGFzaGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGF0b207Cit9IC8vIExvb2tVcEFkZFN0cmluZworCisvKgorICogR2V0QXRvbVN0cmluZygpCisgKgorICovCisKK2NvbnN0ICBjaGFyICpHZXRBdG9tU3RyaW5nKEF0b21UYWJsZSAqYXRhYmxlLCBpbnQgYXRvbSkKK3sKKyAgICBpbnQgc29mZnNldDsKKworICAgIGlmIChhdG9tID4gMCAmJiBhdG9tIDwgYXRhYmxlLT5uZXh0RnJlZSkgeworICAgICAgICBzb2Zmc2V0ID0gYXRhYmxlLT5hbWFwW2F0b21dOworICAgICAgICBpZiAoc29mZnNldCA+IDAgJiYgc29mZnNldCA8IGF0YWJsZS0+c3RhYmxlLm5leHRGcmVlKSB7CisgICAgICAgICAgICByZXR1cm4gJmF0YWJsZS0+c3RhYmxlLnN0cmluZ3Nbc29mZnNldF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIjxpbnRlcm5hbCBlcnJvcjogYmFkIHNvZmZzZXQ+IjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhdG9tID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAiPG51bGwgYXRvbT4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGF0b20gPT0gRU9GKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICI8RU9GPiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAiPGludmFsaWQgYXRvbT4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAvLyBHZXRBdG9tU3RyaW5nCisKKy8qCisgKiBHZXRSZXZlcnNlZEF0b20oKQorICoKKyAqLworCitpbnQgR2V0UmV2ZXJzZWRBdG9tKEF0b21UYWJsZSAqYXRhYmxlLCBpbnQgYXRvbSkKK3sKKyAgICBpZiAoYXRvbSA+IDAgJiYgYXRvbSA8IGF0YWJsZS0+bmV4dEZyZWUpIHsKKyAgICAgICAgcmV0dXJuIGF0YWJsZS0+YXJldlthdG9tXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9IC8vIEdldFJldmVyc2VkQXRvbQorCisvKgorICogQWRkQXRvbSgpIC0gQWRkIGEgc3RyaW5nIHRvIHRoZSBhdG9tLCBoYXNoIGFuZCBzdHJpbmcgdGFibGVzIGlmIGl0IGlzbid0IGFscmVhZHkgdGhlcmUuCisgKiAgICAgICAgIFJldHVybiBpdCdzIGF0b20gaW5kZXguCisgKi8KKworaW50IEFkZEF0b20oQXRvbVRhYmxlICphdGFibGUsIGNvbnN0IGNoYXIgKnMpCit7CisgICAgaW50IGF0b207CisKKyAgICBhdG9tID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgcyk7CisgICAgcmV0dXJuIGF0b207Cit9IC8vIEFkZEF0b20KKworLyoKKyAqIEFkZEF0b21GaXhlZCgpIC0gQWRkIGFuIGF0b20gdG8gdGhlIGhhc2ggYW5kIHN0cmluZyB0YWJsZXMgaWYgaXQgaXNuJ3QgYWxyZWFkeSB0aGVyZS4KKyAqICAgICAgICAgQXNzaWduIGl0IHRoZSBhdG9tIHZhbHVlIG9mICJhdG9tIi4KKyAqLworCitzdGF0aWMgaW50IEFkZEF0b21GaXhlZChBdG9tVGFibGUgKmF0YWJsZSwgY29uc3QgY2hhciAqcywgaW50IGF0b20pCit7CisgICAgaW50IGhhc2hpbmRleCwgbHNpemU7CisKKyAgICBoYXNoaW5kZXggPSBMb29rVXBBZGRTdHJpbmdIYXNoKGF0YWJsZSwgcyk7CisgICAgaWYgKGF0YWJsZS0+bmV4dEZyZWUgPj0gYXRhYmxlLT5zaXplIHx8IGF0b20gPj0gYXRhYmxlLT5zaXplKSB7CisgICAgICAgIGxzaXplID0gYXRhYmxlLT5zaXplKjI7CisgICAgICAgIGlmIChsc2l6ZSA8PSBhdG9tKQorICAgICAgICAgICAgbHNpemUgPSBhdG9tICsgMTsKKyAgICAgICAgR3Jvd0F0b21UYWJsZShhdGFibGUsIGxzaXplKTsKKyAgICB9CisgICAgYXRhYmxlLT5hbWFwW2F0b21dID0gYXRhYmxlLT5odGFibGUuZW50cnlbaGFzaGluZGV4XS5pbmRleDsKKyAgICBhdGFibGUtPmh0YWJsZS5lbnRyeVtoYXNoaW5kZXhdLnZhbHVlID0gYXRvbTsKKyAgICAvL2lmIChhdG9tID49IGF0YWJsZS0+bmV4dEZyZWUpCisgICAgLy8gICAgYXRhYmxlLT5uZXh0RnJlZSA9IGF0b20gKyAxOworICAgIHdoaWxlIChhdG9tID49IGF0YWJsZS0+bmV4dEZyZWUpIHsKKyAgICAgICAgYXRhYmxlLT5hcmV2W2F0YWJsZS0+bmV4dEZyZWVdID0gbFJldmVyc2UoYXRhYmxlLT5uZXh0RnJlZSk7CisgICAgICAgIGF0YWJsZS0+bmV4dEZyZWUrKzsKKyAgICB9CisgICAgcmV0dXJuIGF0b207Cit9IC8vIEFkZEF0b21GaXhlZAorCisvKgorICogSW5pdEF0b21UYWJsZSgpIC0gSW5pdGlhbGl6ZSB0aGUgYXRvbSB0YWJsZS4KKyAqCisgKi8KKworaW50IEluaXRBdG9tVGFibGUoQXRvbVRhYmxlICphdGFibGUsIGludCBodHNpemUpCit7CisgICAgdW5zaWduZWQgaW50IGlpOworCisgICAgaHRzaXplID0gaHRzaXplIDw9IDAgPyBJTklUX0hBU0hfVEFCTEVfU0laRSA6IGh0c2l6ZTsKKyAgICBpZiAoIUluaXRTdHJpbmdUYWJsZSgmYXRhYmxlLT5zdGFibGUpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIUluaXRIYXNoVGFibGUoJmF0YWJsZS0+aHRhYmxlLCBodHNpemUpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF0YWJsZS0+bmV4dEZyZWUgPSAwOworICAgIGF0YWJsZS0+YW1hcCA9IE5VTEw7CisgICAgYXRhYmxlLT5zaXplID0gMDsKKyAgICBHcm93QXRvbVRhYmxlKGF0YWJsZSwgSU5JVF9BVE9NX1RBQkxFX1NJWkUpOworICAgIGlmICghYXRhYmxlLT5hbWFwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIEluaXRpYWxpemUgbG93ZXIgcGFydCBvZiBhdG9tIHRhYmxlIHRvICI8dW5kZWZpbmVkPiIgYXRvbToKKworICAgIEFkZEF0b21GaXhlZChhdGFibGUsICI8dW5kZWZpbmVkPiIsIDApOworICAgIGZvciAoaWkgPSAwOyBpaSA8IEZJUlNUX1VTRVJfVE9LRU5fU1k7IGlpKyspCisgICAgICAgIGF0YWJsZS0+YW1hcFtpaV0gPSBhdGFibGUtPmFtYXBbMF07CisKKyAgICAvLyBBZGQgc2luZ2xlIGNoYXJhY3RlciB0b2tlbnMgdG8gdGhlIGF0b20gdGFibGU6CisKKyAgICB7CisJCWNvbnN0IGNoYXIgKnMgPSAifiElXiYqKCktKz18LC48Pi8/OzpbXXt9IyI7CisgICAgICAgIGNoYXIgdFsyXTsKKworICAgICAgICB0WzFdID0gJ1wwJzsKKyAgICAgICAgd2hpbGUgKCpzKSB7CisgICAgICAgICAgICB0WzBdID0gKnM7CisgICAgICAgICAgICBBZGRBdG9tRml4ZWQoYXRhYmxlLCB0LCBzWzBdKTsKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFkZCBtdWx0aXBsZSBjaGFyYWN0ZXIgc2Nhbm5lciB0b2tlbnMgOgorCisgICAgZm9yIChpaSA9IDA7IGlpIDwgc2l6ZW9mKHRva2Vucykvc2l6ZW9mKHRva2Vuc1swXSk7IGlpKyspCisgICAgICAgIEFkZEF0b21GaXhlZChhdGFibGUsIHRva2Vuc1tpaV0uc3RyLCB0b2tlbnNbaWldLnZhbCk7CisKKyAgICAvLyBBZGQgZXJyb3Igc3ltYm9sIGlmIHJ1bm5pbmcgaW4gZXJyb3IgbW9kZToKKworICAgIGlmIChjcHAtPm9wdGlvbnMuRXJyb3JNb2RlKQorICAgICAgICBBZGRBdG9tRml4ZWQoYXRhYmxlLCAiZXJyb3IiLCBFUlJPUl9TWSk7CisKKyAgICBBZGRBdG9tKGF0YWJsZSwgIjwqKiogZW5kIGZpeGVkIGF0b21zICoqKj4iKTsKKworICAgIHJldHVybiAxOworfSAvLyBJbml0QXRvbVRhYmxlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERlYnVnIFByaW50aW5nIEZ1bmN0aW9uczogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoKKyAqIFByaW50QXRvbVRhYmxlKCkKKyAqCisgKi8KKwordm9pZCBQcmludEF0b21UYWJsZShBdG9tVGFibGUgKmF0YWJsZSkKK3sKKyAgICBpbnQgaWk7CisgICAgY2hhciBzdHJbMjAwXTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IGF0YWJsZS0+bmV4dEZyZWU7IGlpKyspIHsKKyAgICAgICAgc3ByaW50ZihzdHIsICIlZDogXCIlc1wiIiwgaWksICZhdGFibGUtPnN0YWJsZS5zdHJpbmdzW2F0YWJsZS0+YW1hcFtpaV1dKTsKKyAgICAgICAgQ1BQRGVidWdMb2dNc2coc3RyKTsKKyAgICB9CisgICAgc3ByaW50ZihzdHIsICJIYXNoIHRhYmxlOiBzaXplPSVkLCBlbnRyaWVzPSVkLCBjb2xsaXNpb25zPSIsCisgICAgICAgICAgIGF0YWJsZS0+aHRhYmxlLnNpemUsIGF0YWJsZS0+aHRhYmxlLmVudHJpZXMpOworICAgIENQUERlYnVnTG9nTXNnKHN0cik7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgSEFTSF9UQUJMRV9NQVhfQ09MTElTSU9OUzsgaWkrKykgeworICAgICAgICBzcHJpbnRmKHN0ciwgIiAlZCIsIGF0YWJsZS0+aHRhYmxlLmNvdW50c1tpaV0pOworICAgICAgICBDUFBEZWJ1Z0xvZ01zZyhzdHIpOworICAgIH0KKworfSAvLyBQcmludEF0b21UYWJsZQorCisKKy8qCisgKiBHZXRTdHJpbmdPZkF0b20oKQorICoKKyAqLworCitjaGFyKiBHZXRTdHJpbmdPZkF0b20oQXRvbVRhYmxlICphdGFibGUsIGludCBhdG9tKQoreworCSBjaGFyKiBjaHJfc3RyOworCSBjaHJfc3RyPSZhdGFibGUtPnN0YWJsZS5zdHJpbmdzW2F0YWJsZS0+YW1hcFthdG9tXV07CisJIHJldHVybiBjaHJfc3RyOworfSAvLyBHZXRTdHJpbmdPZkF0b20KKworLyoKKyAqIEZyZWVBdG9tVGFibGUoKSAtIEZyZWUgdGhlIGF0b20gdGFibGUgYW5kIGFzc29jaWF0ZWQgbWVtb3J5CisgKgorICovCisKK3ZvaWQgRnJlZUF0b21UYWJsZShBdG9tVGFibGUgKmF0YWJsZSkKK3sKKyAgICBGcmVlU3RyaW5nVGFibGUoJmF0YWJsZS0+c3RhYmxlKTsKKyAgICBGcmVlSGFzaFRhYmxlKCZhdGFibGUtPmh0YWJsZSk7CisgICAgaWYgKGF0YWJsZS0+YW1hcCkKKyAgICAgICAgZnJlZShhdGFibGUtPmFtYXApOworICAgIGlmIChhdGFibGUtPmFyZXYpCisgICAgICAgIGZyZWUoYXRhYmxlLT5hcmV2KTsKKyAgICBhdGFibGUtPmFtYXAgPSBOVUxMOworICAgIGF0YWJsZS0+YXJldiA9IE5VTEw7CisgICAgYXRhYmxlLT5uZXh0RnJlZSA9IDA7CisgICAgYXRhYmxlLT5zaXplID0gMDsKK30gLy8gRnJlZUF0b21UYWJsZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gRW5kIG9mIGF0b20uYyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9hdG9tLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvYXRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODRjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvYXRvbS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorQ29weXJpZ2h0IChjKSAyMDAyLCBOVklESUEgQ29ycG9yYXRpb24uCisKK05WSURJQSBDb3Jwb3JhdGlvbigiTlZJRElBIikgc3VwcGxpZXMgdGhpcyBzb2Z0d2FyZSB0byB5b3UgaW4KK2NvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLAoraW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBOVklESUEgc29mdHdhcmUKK2NvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UKK3Rlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZSB0aGlzIE5WSURJQQorc29mdHdhcmUuCisKK0luIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kCitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zLCBOVklESUEgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlCitsaWNlbnNlLCB1bmRlciBOVklESUEncyBjb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgTlZJRElBIHNvZnR3YXJlICh0aGUKKyJOVklESUEgU29mdHdhcmUiKSwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZQorTlZJRElBIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkKK2Zvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIE5WSURJQSBTb2Z0d2FyZSwgeW91IG11c3QKK3JldGFpbiB0aGUgY29weXJpZ2h0IG5vdGljZSBvZiBOVklESUEsIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nCit0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIE5WSURJQSBTb2Z0d2FyZS4KK05laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3Mgbm9yIGxvZ29zIG9mIE5WSURJQQorQ29ycG9yYXRpb24gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUKK05WSURJQSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIE5WSURJQS4KK0V4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMKK2V4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgTlZJRElBIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QKK2xpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdCBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIgZGVyaXZhdGl2ZQord29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIE5WSURJQSBTb2Z0d2FyZSBtYXkgYmUKK2luY29ycG9yYXRlZC4gTm8gaGFyZHdhcmUgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAKKworVEhFIE5WSURJQSBTT0ZUV0FSRSBJUyBCRUlORyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsCitJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUgorSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEVJVEhFUiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIE9USEVSCitQUk9EVUNUUy4KKworSU4gTk8gRVZFTlQgU0hBTEwgTlZJRElBIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULAorSU5DSURFTlRBTCwgRVhFTVBMQVJZLCBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECitUTywgTE9TVCBQUk9GSVRTOyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCitVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgT1IgQVJJU0lORyBJTiBBTlkgV0FZCitPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUKK05WSURJQSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5EIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULAorVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIE9USEVSV0lTRSwgRVZFTiBJRgorTlZJRElBIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gYXRvbS5oCisvLworCisjaWYgIWRlZmluZWQoX19BVE9NX0gpCisjZGVmaW5lIF9fQVRPTV9IIDEKKwordHlwZWRlZiBzdHJ1Y3QgQXRvbVRhYmxlX1JlYyBBdG9tVGFibGU7CisKK2V4dGVybiBBdG9tVGFibGUgKmF0YWJsZTsKKworaW50IEluaXRBdG9tVGFibGUoQXRvbVRhYmxlICphdGFibGUsIGludCBodHNpemUpOwordm9pZCBGcmVlQXRvbVRhYmxlKEF0b21UYWJsZSAqYXRhYmxlKTsKK2ludCBBZGRBdG9tKEF0b21UYWJsZSAqYXRhYmxlLCBjb25zdCBjaGFyICpzKTsKK3ZvaWQgUHJpbnRBdG9tVGFibGUoQXRvbVRhYmxlICphdGFibGUpOworaW50IExvb2tVcEFkZFN0cmluZyhBdG9tVGFibGUgKmF0YWJsZSwgY29uc3QgY2hhciAqcyk7Citjb25zdCBjaGFyICpHZXRBdG9tU3RyaW5nKEF0b21UYWJsZSAqYXRhYmxlLCBpbnQgYXRvbSk7CitpbnQgR2V0UmV2ZXJzZWRBdG9tKEF0b21UYWJsZSAqYXRhYmxlLCBpbnQgYXRvbSk7CitjaGFyKiBHZXRTdHJpbmdPZkF0b20oQXRvbVRhYmxlICphdGFibGUsIGludCBhdG9tKTsKKyNlbmRpZiAvLyAhZGVmaW5lZChfX0FUT01fSCkKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9jb21waWxlLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvY29tcGlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODA4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvY29tcGlsZS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKK0NvcHlyaWdodCAoYykgMjAwMiwgTlZJRElBIENvcnBvcmF0aW9uLgorCitOVklESUEgQ29ycG9yYXRpb24oIk5WSURJQSIpIHN1cHBsaWVzIHRoaXMgc29mdHdhcmUgdG8geW91IGluCitjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwKK2luc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgTlZJRElBIHNvZnR3YXJlCitjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlCit0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBOVklESUEKK3NvZnR3YXJlLgorCitJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZAorc3ViamVjdCB0byB0aGVzZSB0ZXJtcywgTlZJRElBIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZQorbGljZW5zZSwgdW5kZXIgTlZJRElBJ3MgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIE5WSURJQSBzb2Z0d2FyZSAodGhlCisiTlZJRElBIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUKK05WSURJQSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Citmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBOVklESUEgU29mdHdhcmUsIHlvdSBtdXN0CityZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2Ugb2YgTlZJRElBLCB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwordGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBOVklESUEgU29mdHdhcmUuCitOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG5vciBsb2dvcyBvZiBOVklESUEKK0NvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCitOVklESUEgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOVklESUEuCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzCitleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IE5WSURJQSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUKK3dvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBOVklESUEgU29mdHdhcmUgbWF5IGJlCitpbmNvcnBvcmF0ZWQuIE5vIGhhcmR3YXJlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCisKK1RIRSBOVklESUEgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELAorSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IKK0lUUyBVU0UgQU5EIE9QRVJBVElPTiBFSVRIRVIgQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBPVEhFUgorUFJPRFVDVFMuCisKK0lOIE5PIEVWRU5UIFNIQUxMIE5WSURJQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIEVYRU1QTEFSWSwgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIExPU1QgUFJPRklUUzsgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIE9SIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFCitOVklESUEgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwKK1RPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYKK05WSURJQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIGNvbXBpbGUuaAorLy8KKworI2lmICFkZWZpbmVkKF9fQ09NUElMRV9IKQorI2RlZmluZSBfX0NPTVBJTEVfSCAxCisKK2ludCBJbml0Q1BQU3RydWN0KHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCBPcHRpb25zX1JlY3sKKyAgICBjb25zdCBjaGFyICpwcm9maWxlU3RyaW5nOworICAgIGludCBFcnJvck1vZGU7CisgICAgaW50IFF1aWV0OworCQorICAgIC8vIERlYnVnIFRoZSBDb21waWxlciBvcHRpb25zOgorICAgIGludCBEdW1wQXRvbVRhYmxlOworfSBPcHRpb25zOworCisjZGVmaW5lIE1BWF9JRl9ORVNUSU5HICA2NAorc3RydWN0IENQUFN0cnVjdF9SZWMgeworICAgIC8vIFB1YmxpYyBtZW1iZXJzCisgICAgU291cmNlTG9jICpwTGFzdFNvdXJjZUxvYzsgIC8vIFNldCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzdGF0ZW1lbnQgYnkgdGhlIHRyZWUgd2Fsa2VycworICAgIE9wdGlvbnMgb3B0aW9uczsgICAgICAgICAgICAvLyBDb21waWxlIG9wdGlvbnMgYW5kIHBhcmFtZXRlcnMKKworICAgIC8vIFByaXZhdGUgbWVtYmVycworICAgIFNvdXJjZUxvYyBsYXN0U291cmNlTG9jOworCisgICAgLy8gU2Nhbm5lciBkYXRhOgorCisgICAgU291cmNlTG9jICp0b2tlbkxvYzsgICAgICAgIC8vIFNvdXJjZSBsb2NhdGlvbiBvZiBtb3N0IHJlY2VudCB0b2tlbiBzZWVuIGJ5IHRoZSBzY2FubmVyCisgICAgaW50IG1vc3RSZWNlbnRUb2tlbjsgICAgICAgIC8vIE1vc3QgcmVjZW50IHRva2VuIHNlZW4gYnkgdGhlIHNjYW5uZXIKKyAgICBJbnB1dFNyYyAqY3VycmVudElucHV0OworICAgIGludCBwcmV2aW91c190b2tlbjsKKyAgICBpbnQgcGFzdEZpcnN0U3RhdGVtZW50OyAgICAgLy8gdXNlZCB0byBtYWtlIHN1cmUgdGhhdCAjdmVyc2lvbiBpcyB0aGUgZmlyc3Qgc3RhdGVtZW50IHNlZW4gaW4gdGhlIGZpbGUsIGlmIHByZXNlbnQKKyAgICAKKwl2b2lkICpwQzsgICAgICAgICAgICAgICAgICAgLy8gc3RvcmluZyB0aGUgcGFyc2VDb250ZXh0IG9mIHRoZSBjb21waWxlIG9iamVjdCBpbiBjcHAuICAKKyAgICAgCisgICAgLy8gUHJpdmF0ZSBtZW1iZXJzOgorICAgIFNvdXJjZUxvYyBsdG9rZW5Mb2M7CisJaW50IGlmZGVwdGg7ICAgICAgICAgICAgICAgIC8vY3VycmVudCAjaWYtI2Vsc2UtI2VuZGlmIG5lc3RpbmcgaW4gdGhlIGNwcC5jIGZpbGUgKHByZS1wcm9jZXNzb3IpICAgIAorICAgIGludCBlbHNlZGVwdGhbTUFYX0lGX05FU1RJTkddOy8vS2VlcCBhIHRyYWNrIG9mICNpZiBkZXB0aC4uTWF4IGFsbG93ZWQgaXMgNjQuCisgICAgaW50IGVsc2V0cmFja2VyOyAgICAgICAgICAgIC8vI2lmLSNlbHNlIGFuZCAjZW5kaWYgY29uc3RydWN0cy4uLkNvdW50ZXIuCisgICAgY29uc3QgY2hhciAqRXJyTXNnOworICAgIGludCBDb21waWxlRXJyb3I7ICAgICAgICAgICAvL0luZGljYXRlIGNvbXBpbGUgZXJyb3Igd2hlbiAjZXJyb3IsICNlbHNlLCNlbGlmIG1pc21hdGNoLgorCisgICAgLy8KKyAgICAvLyBHbG9iYWxzIHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBQYVBhcnNlU3RyaW5ncygpIGFuZCB5eV9pbnB1dCgpYW5kIAorICAgIC8vIGFsc28gYWNyb3NzIHRoZSBmaWxlcy4oZ2VuX2dsc2xhbmcuY3BwIGFuZCBzY2FubmVyLmMpCisgICAgLy8KKyAgICBpbnQgUGFXaGljaFN0cjsgICAgICAgICAgICAgLy8gd2hpY2ggc3RyaW5nIHdlJ3JlIHBhcnNpbmcKKyAgICBjb25zdCBpbnQqIFBhU3RyTGVuOyAgICAgICAgLy8gYXJyYXkgb2YgbGVuZ3RocyBvZiB0aGUgUGFBcmd2IHN0cmluZ3MKKyAgICBpbnQgUGFBcmdjOyAgICAgICAgICAgICAgICAgLy8gY291bnQgb2Ygc3RyaW5ncyBpbiB0aGUgYXJyYXkKKyAgICBjb25zdCBjaGFyKiBjb25zdCogUGFBcmd2OyAgLy8gb3VyIGFycmF5IG9mIHN0cmluZ3MgdG8gcGFyc2UgICAgCisgICAgdW5zaWduZWQgaW50IHRva2Vuc0JlZm9yZUVPRiA6IDE7Cit9OworCisjZW5kaWYgLy8gIWRlZmluZWQoX19DT01QSUxFX0gpCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvY3BwLmMgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvY3BwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkZDRmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9jcHAuYwpAQCAtMCwwICsxLDExMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorQ29weXJpZ2h0IChjKSAyMDAyLCBOVklESUEgQ29ycG9yYXRpb24uCisKK05WSURJQSBDb3Jwb3JhdGlvbigiTlZJRElBIikgc3VwcGxpZXMgdGhpcyBzb2Z0d2FyZSB0byB5b3UgaW4KK2NvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLAoraW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBOVklESUEgc29mdHdhcmUKK2NvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UKK3Rlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZSB0aGlzIE5WSURJQQorc29mdHdhcmUuCisKK0luIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kCitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zLCBOVklESUEgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlCitsaWNlbnNlLCB1bmRlciBOVklESUEncyBjb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgTlZJRElBIHNvZnR3YXJlICh0aGUKKyJOVklESUEgU29mdHdhcmUiKSwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZQorTlZJRElBIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkKK2Zvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIE5WSURJQSBTb2Z0d2FyZSwgeW91IG11c3QKK3JldGFpbiB0aGUgY29weXJpZ2h0IG5vdGljZSBvZiBOVklESUEsIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nCit0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIE5WSURJQSBTb2Z0d2FyZS4KK05laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3Mgbm9yIGxvZ29zIG9mIE5WSURJQQorQ29ycG9yYXRpb24gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUKK05WSURJQSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIE5WSURJQS4KK0V4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMKK2V4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgTlZJRElBIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QKK2xpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdCBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIgZGVyaXZhdGl2ZQord29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIE5WSURJQSBTb2Z0d2FyZSBtYXkgYmUKK2luY29ycG9yYXRlZC4gTm8gaGFyZHdhcmUgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAKKworVEhFIE5WSURJQSBTT0ZUV0FSRSBJUyBCRUlORyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsCitJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUgorSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEVJVEhFUiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIE9USEVSCitQUk9EVUNUUy4KKworSU4gTk8gRVZFTlQgU0hBTEwgTlZJRElBIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULAorSU5DSURFTlRBTCwgRVhFTVBMQVJZLCBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECitUTywgTE9TVCBQUk9GSVRTOyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCitVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgT1IgQVJJU0lORyBJTiBBTlkgV0FZCitPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUKK05WSURJQSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5EIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULAorVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIE9USEVSV0lTRSwgRVZFTiBJRgorTlZJRElBIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gY3BwLmMKKy8vCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJjb21waWxlci9wcmVwcm9jZXNzb3Ivc2xnbG9iYWxzLmgiCisKK3N0YXRpYyBpbnQgQ1BQaWYoeXlzdHlwZXBwICogeXlsdmFscHApOworCisvKiBEb24ndCB1c2UgbWVtb3J5LmMncyByZXBsYWNlbWVudHMsIGFzIHdlIGNsZWFuIHVwIHByb3Blcmx5IGhlcmUgKi8KKyN1bmRlZiBtYWxsb2MKKyN1bmRlZiBmcmVlCisKK3N0YXRpYyBpbnQgYmluZEF0b20gPSAwOworc3RhdGljIGludCBjb25zdEF0b20gPSAwOworc3RhdGljIGludCBkZWZhdWx0QXRvbSA9IDA7CitzdGF0aWMgaW50IGRlZmluZUF0b20gPSAwOworc3RhdGljIGludCBkZWZpbmVkQXRvbSA9IDA7CitzdGF0aWMgaW50IGVsc2VBdG9tID0gMDsKK3N0YXRpYyBpbnQgZWxpZkF0b20gPSAwOworc3RhdGljIGludCBlbmRpZkF0b20gPSAwOworc3RhdGljIGludCBpZkF0b20gPSAwOworc3RhdGljIGludCBpZmRlZkF0b20gPSAwOworc3RhdGljIGludCBpZm5kZWZBdG9tID0gMDsKK3N0YXRpYyBpbnQgaW5jbHVkZUF0b20gPSAwOworc3RhdGljIGludCBsaW5lQXRvbSA9IDA7CitzdGF0aWMgaW50IHByYWdtYUF0b20gPSAwOworc3RhdGljIGludCB0ZXh1bml0QXRvbSA9IDA7CitzdGF0aWMgaW50IHVuZGVmQXRvbSA9IDA7CitzdGF0aWMgaW50IGVycm9yQXRvbSA9IDA7CitzdGF0aWMgaW50IF9fTElORV9fQXRvbSA9IDA7CitzdGF0aWMgaW50IF9fRklMRV9fQXRvbSA9IDA7CitzdGF0aWMgaW50IF9fVkVSU0lPTl9fQXRvbSA9IDA7CitzdGF0aWMgaW50IHZlcnNpb25BdG9tID0gMDsKK3N0YXRpYyBpbnQgZXh0ZW5zaW9uQXRvbSA9IDA7CisKK3N0YXRpYyBTY29wZSAqbWFjcm9zID0gMDsKKyNkZWZpbmUgTUFYX01BQ1JPX0FSR1MgIDY0CisKK3N0YXRpYyBTb3VyY2VMb2MgaWZsb2M7IC8qIG91dGVybW9zdCAjaWYgKi8KKworaW50IEluaXRDUFAodm9pZCkKK3sKKyAgICBjaGFyICAgICAgICBidWZmZXJbNjRdLCAqdDsKKyAgICBjb25zdCBjaGFyICAqZjsKKworICAgIC8vIEFkZCB2YXJpb3VzIGF0b21zIG5lZWRlZCBieSB0aGUgQ1BQIGxpbmUgc2Nhbm5lcjoKKyAgICBiaW5kQXRvbSA9IExvb2tVcEFkZFN0cmluZyhhdGFibGUsICJiaW5kIik7CisgICAgY29uc3RBdG9tID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgImNvbnN0Iik7CisgICAgZGVmYXVsdEF0b20gPSBMb29rVXBBZGRTdHJpbmcoYXRhYmxlLCAiZGVmYXVsdCIpOworICAgIGRlZmluZUF0b20gPSBMb29rVXBBZGRTdHJpbmcoYXRhYmxlLCAiZGVmaW5lIik7CisgICAgZGVmaW5lZEF0b20gPSBMb29rVXBBZGRTdHJpbmcoYXRhYmxlLCAiZGVmaW5lZCIpOworICAgIGVsaWZBdG9tID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgImVsaWYiKTsKKyAgICBlbHNlQXRvbSA9IExvb2tVcEFkZFN0cmluZyhhdGFibGUsICJlbHNlIik7CisgICAgZW5kaWZBdG9tID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgImVuZGlmIik7CisgICAgaWZBdG9tID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgImlmIik7CisgICAgaWZkZWZBdG9tID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgImlmZGVmIik7CisgICAgaWZuZGVmQXRvbSA9IExvb2tVcEFkZFN0cmluZyhhdGFibGUsICJpZm5kZWYiKTsKKyAgICBpbmNsdWRlQXRvbSA9IExvb2tVcEFkZFN0cmluZyhhdGFibGUsICJpbmNsdWRlIik7CisgICAgbGluZUF0b20gPSBMb29rVXBBZGRTdHJpbmcoYXRhYmxlLCAibGluZSIpOworICAgIHByYWdtYUF0b20gPSBMb29rVXBBZGRTdHJpbmcoYXRhYmxlLCAicHJhZ21hIik7CisgICAgdGV4dW5pdEF0b20gPSBMb29rVXBBZGRTdHJpbmcoYXRhYmxlLCAidGV4dW5pdCIpOworICAgIHVuZGVmQXRvbSA9IExvb2tVcEFkZFN0cmluZyhhdGFibGUsICJ1bmRlZiIpOworCWVycm9yQXRvbSA9IExvb2tVcEFkZFN0cmluZyhhdGFibGUsICJlcnJvciIpOworICAgIF9fTElORV9fQXRvbSA9IExvb2tVcEFkZFN0cmluZyhhdGFibGUsICJfX0xJTkVfXyIpOworICAgIF9fRklMRV9fQXRvbSA9IExvb2tVcEFkZFN0cmluZyhhdGFibGUsICJfX0ZJTEVfXyIpOworCV9fVkVSU0lPTl9fQXRvbSA9IExvb2tVcEFkZFN0cmluZyhhdGFibGUsICJfX1ZFUlNJT05fXyIpOworICAgIHZlcnNpb25BdG9tID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgInZlcnNpb24iKTsKKyAgICBleHRlbnNpb25BdG9tID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgImV4dGVuc2lvbiIpOworICAgIG1hY3JvcyA9IE5ld1Njb3BlSW5Qb29sKG1lbV9DcmVhdGVQb29sKDAsIDApKTsKKyAgICBzdHJjcHkoYnVmZmVyLCAiUFJPRklMRV8iKTsKKyAgICB0ID0gYnVmZmVyICsgc3RybGVuKGJ1ZmZlcik7CisgICAgZiA9IGNwcC0+b3B0aW9ucy5wcm9maWxlU3RyaW5nOworICAgIHdoaWxlICgoaXNhbG51bSgqZikgfHwgKmYgPT0gJ18nKSAmJiB0IDwgYnVmZmVyICsgc2l6ZW9mKGJ1ZmZlcikgLSAxKQorICAgICAgICAqdCsrID0gdG91cHBlcigqZisrKTsKKyAgICAqdCA9IDA7CisKKyAgICBQcmVkZWZpbmVJbnRNYWNybygiR0xfRVMiLCAxKTsKKyAgICBQcmVkZWZpbmVJbnRNYWNybygiR0xfRlJBR01FTlRfUFJFQ0lTSU9OX0hJR0giLCAxKTsKKworCXJldHVybiAxOworfSAvLyBJbml0Q1BQCisKK2ludCBGcmVlQ1BQKHZvaWQpCit7CisgICAgaWYgKG1hY3JvcykKKyAgICB7CisgICAgICAgIG1lbV9GcmVlUG9vbChtYWNyb3MtPnBvb2wpOworICAgICAgICBtYWNyb3MgPSAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitpbnQgRmluYWxDUFAodm9pZCkKK3sKKwlpZiAoY3BwLT5pZmRlcHRoKQorCQlDUFBFcnJvclRvSW5mb0xvZygiI2lmIG1pc21hdGNoIik7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQ1BQZGVmaW5lKHl5c3R5cGVwcCAqIHl5bHZhbHBwKQoreworICAgIGludCB0b2tlbiwgbmFtZSwgYXJnc1tNQVhfTUFDUk9fQVJHU10sIGFyZ2M7CisgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKKyAgICBNYWNyb1N5bWJvbCBtYWM7CisgICAgU3ltYm9sICpzeW1iOworICAgIFNvdXJjZUxvYyBkdW1teUxvYzsKKyAgICBtZW1zZXQoJm1hYywgMCwgc2l6ZW9mKG1hYykpOworICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICBpZiAodG9rZW4gIT0gQ1BQX0lERU5USUZJRVIpIHsKKyAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIiNkZWZpbmUiKTsKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgICBuYW1lID0geXlsdmFscHAtPnNjX2lkZW50OworICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICBpZiAodG9rZW4gPT0gJygnICYmICF5eWx2YWxwcC0+c2NfaW50KSB7CisgICAgICAgIC8vIGdhdGhlciBhcmd1bWVudHMKKyAgICAgICAgYXJnYyA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGlmIChhcmdjID09IDAgJiYgdG9rZW4gPT0gJyknKSBicmVhazsKKyAgICAgICAgICAgIGlmICh0b2tlbiAhPSBDUFBfSURFTlRJRklFUikgeworCQkJCUNQUEVycm9yVG9JbmZvTG9nKCIjZGVmaW5lIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZ2MgPCBNQVhfTUFDUk9fQVJHUykKKyAgICAgICAgICAgICAgICBhcmdzW2FyZ2MrK10gPSB5eWx2YWxwcC0+c2NfaWRlbnQ7CisgICAgICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgIH0gd2hpbGUgKHRva2VuID09ICcsJyk7CisgICAgICAgIGlmICh0b2tlbiAhPSAnKScpIHsKKyAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCIjZGVmaW5lIik7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIH0KKyAgICAgICAgbWFjLmFyZ2MgPSBhcmdjOworICAgICAgICBtYWMuYXJncyA9IG1lbV9BbGxvYyhtYWNyb3MtPnBvb2wsIGFyZ2MgKiBzaXplb2YoaW50KSk7CisgICAgICAgIG1lbWNweShtYWMuYXJncywgYXJncywgYXJnYyAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworCX0KKyAgICBtYWMuYm9keSA9IE5ld1Rva2VuU3RyZWFtKEdldEF0b21TdHJpbmcoYXRhYmxlLCBuYW1lKSwgbWFjcm9zLT5wb29sKTsKKyAgICB3aGlsZSAodG9rZW4gIT0gJ1xuJykgeworICAgICAgICBpZiAodG9rZW4gPT0gJ1xcJykgeworICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIlRoZSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIgKFxcKSBpcyBub3QgcGFydCBvZiB0aGUgT3BlbkdMIEVTIFNoYWRpbmcgTGFuZ3VhZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA8PSAwKSB7IC8vIEVPRiBvciBlcnJvcgorICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coInVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGluICNkZWZpbmUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAtIGV4cGVjdGVkIGEgbmV3bGluZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgUmVjb3JkVG9rZW4obWFjLmJvZHksIHRva2VuLCB5eWx2YWxwcCk7CisgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICB9OworCisgICAgc3ltYiA9IExvb2tVcFN5bWJvbChtYWNyb3MsIG5hbWUpOworICAgIGlmIChzeW1iKSB7CisgICAgICAgIGlmICghc3ltYi0+ZGV0YWlscy5tYWMudW5kZWYpIHsKKyAgICAgICAgICAgIC8vIGFscmVhZHkgZGVmaW5lZCAtLSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBpZGVudGljYWwKKyAgICAgICAgICAgIGlmIChzeW1iLT5kZXRhaWxzLm1hYy5hcmdjICE9IG1hYy5hcmdjKSBnb3RvIGVycm9yOworICAgICAgICAgICAgZm9yIChhcmdjPTA7IGFyZ2MgPCBtYWMuYXJnYzsgYXJnYysrKQorICAgICAgICAgICAgICAgIGlmIChzeW1iLT5kZXRhaWxzLm1hYy5hcmdzW2FyZ2NdICE9IG1hYy5hcmdzW2FyZ2NdKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgUmV3aW5kVG9rZW5TdHJlYW0oc3ltYi0+ZGV0YWlscy5tYWMuYm9keSk7CisgICAgICAgICAgICBSZXdpbmRUb2tlblN0cmVhbShtYWMuYm9keSk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IG9sZF9sdmFsLCBvbGRfdG9rZW47CisgICAgICAgICAgICAgICAgb2xkX3Rva2VuID0gUmVhZFRva2VuKHN5bWItPmRldGFpbHMubWFjLmJvZHksIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICBvbGRfbHZhbCA9IHl5bHZhbHBwLT5zY19pbnQ7CisgICAgICAgICAgICAgICAgdG9rZW4gPSBSZWFkVG9rZW4obWFjLmJvZHksIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gIT0gb2xkX3Rva2VuIHx8IHl5bHZhbHBwLT5zY19pbnQgIT0gb2xkX2x2YWwpIHsgCisgICAgICAgICAgICAgICAgZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIFN0b3JlU3RyKCJNYWNybyBSZWRlZmluZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RvcmVTdHIoR2V0U3RyaW5nT2ZBdG9tKGF0YWJsZSxuYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9R2V0U3RyZnJvbVRTdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgRGVjTGluZU51bWJlcigpOworICAgICAgICAgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2cobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIEluY0xpbmVOdW1iZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgUmVzZXRUU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyB9CisgICAgICAgICAgICB9IHdoaWxlICh0b2tlbiA+IDApOworICAgICAgICB9CisgICAgICAgIC8vRnJlZU1hY3JvKCZzeW1iLT5kZXRhaWxzLm1hYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHVtbXlMb2MuZmlsZSA9IDA7CisgICAgICAgIGR1bW15TG9jLmxpbmUgPSAwOworICAgICAgICBzeW1iID0gQWRkU3ltYm9sKCZkdW1teUxvYywgbWFjcm9zLCBuYW1lLCBNQUNST19TKTsKKyAgICB9CisgICAgc3ltYi0+ZGV0YWlscy5tYWMgPSBtYWM7CisgICAgcmV0dXJuICdcbic7Cit9IC8vIENQUGRlZmluZQorCitzdGF0aWMgaW50IENQUHVuZGVmKHl5c3R5cGVwcCAqIHl5bHZhbHBwKQoreworICAgIGludCB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgU3ltYm9sICpzeW1iOworCWlmKHRva2VuID09ICdcbicpeworCQlDUFBFcnJvclRvSW5mb0xvZygiI3VuZGVmIik7CisJICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisgICAgaWYgKHRva2VuICE9IENQUF9JREVOVElGSUVSKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgc3ltYiA9IExvb2tVcFN5bWJvbChtYWNyb3MsIHl5bHZhbHBwLT5zY19pZGVudCk7CisgICAgaWYgKHN5bWIpIHsKKyAgICAgICAgc3ltYi0+ZGV0YWlscy5tYWMudW5kZWYgPSAxOworICAgIH0KKyAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgaWYgKHRva2VuICE9ICdcbicpIHsKKyAgICBlcnJvcjoKKyAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIiN1bmRlZiIpOworICAgIH0KKyAgICByZXR1cm4gdG9rZW47Cit9IC8vIENQUHVuZGVmCisKKy8qIENQUGVsc2UgLS0gc2tpcCBmb3J3YXJkIHRvIGFwcHJvcHJpYXRlIHNwb3QuICBUaGlzIGlzIGFjdHVhbGx5IHVzZWQKKyoqIHRvIHNraXAgdG8gYW5kICNlbmRpZiBhZnRlciBzZWVpbmcgYW4gI2Vsc2UsIEFORCB0byBza2lwIHRvIGEgI2Vsc2UsCisqKiAjZWxpZiwgb3IgI2VuZGlmIGFmdGVyIGEgI2lmLyNpZmRlZi8jaWZuZGVmLyNlbGlmIHRlc3Qgd2FzIGZhbHNlCisqLworCitzdGF0aWMgaW50IENQUGVsc2UoaW50IG1hdGNoZWxzZSwgeXlzdHlwZXBwICogeXlsdmFscHApCit7CisgICAgaW50IGF0b20sZGVwdGg9MDsKKyAgICBpbnQgdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworCQorCXdoaWxlICh0b2tlbiA+IDApIHsKKyAgICAgICAgaWYgKHRva2VuICE9ICcjJykgeworICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuIDw9IDApIHsgLy8gRU9GIG9yIGVycm9yCisgICAgICAgICAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJ1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBpbiAjZWxzZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIC0gZXhwZWN0ZWQgYSBuZXdsaW5lIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisJCWlmICgodG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApKSAhPSBDUFBfSURFTlRJRklFUikKKwkJCWNvbnRpbnVlOworICAgICAgICBhdG9tID0geXlsdmFscHAtPnNjX2lkZW50OworICAgICAgICBpZiAoYXRvbSA9PSBpZkF0b20gfHwgYXRvbSA9PSBpZmRlZkF0b20gfHwgYXRvbSA9PSBpZm5kZWZBdG9tKXsKKyAgICAgICAgICAgIGRlcHRoKys7IGNwcC0+aWZkZXB0aCsrOyBjcHAtPmVsc2V0cmFja2VyKys7CisgICAgICAgICAgICBpZiAoY3BwLT5pZmRlcHRoID4gTUFYX0lGX05FU1RJTkcpIHsKKyAgICAgICAgICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygibWF4ICNpZiBuZXN0aW5nIGRlcHRoIGV4Y2VlZGVkIik7CisgICAgICAgICAgICAgICAgY3BwLT5Db21waWxlRXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2FuaXR5IGNoZWNrIGVsc2V0cmFja2VyCisgICAgICAgICAgICBpZiAoY3BwLT5lbHNldHJhY2tlciA8IDAgfHwgY3BwLT5lbHNldHJhY2tlciA+PSBNQVhfSUZfTkVTVElORykgeworICAgICAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJtaXNtYXRjaGVkICNpZi8jZW5kaWYgc3RhdGVtZW50cyIpOworICAgICAgICAgICAgICAgIGNwcC0+Q29tcGlsZUVycm9yID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNwcC0+ZWxzZWRlcHRoW2NwcC0+ZWxzZXRyYWNrZXJdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhdG9tID09IGVuZGlmQXRvbSkgeworICAgICAgICAgICAgaWYoLS1kZXB0aDwwKXsKKyAgICAgICAgICAgICAgICBpZiAoY3BwLT5lbHNldHJhY2tlcikKKyAgICAgICAgICAgICAgICAgICAgLS1jcHAtPmVsc2V0cmFja2VyOworICAgICAgICAgICAgICAgIGlmIChjcHAtPmlmZGVwdGgpIAorICAgICAgICAgICAgICAgICAgICAtLWNwcC0+aWZkZXB0aDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgCisgICAgICAgICAgICAtLWNwcC0+ZWxzZXRyYWNrZXI7CisgICAgICAgICAgICAtLWNwcC0+aWZkZXB0aDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoKGludCkobWF0Y2hlbHNlKSAhPSAwKSYmIGRlcHRoPT0wKSB7CisJCQlpZiAoYXRvbSA9PSBlbHNlQXRvbSApIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgQ1BQV2FybmluZ1RvSW5mb0xvZygidW5leHBlY3RlZCB0b2tlbnMgZm9sbG93aW5nICNlbHNlIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgLSBleHBlY3RlZCBhIG5ld2xpbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbiA8PSAwKSB7IC8vIEVPRiBvciBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJ1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBmb2xsb3dpbmcgI2Vsc2UgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAtIGV4cGVjdGVkIGEgbmV3bGluZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAKKwkJCQlicmVhazsKKwkJCX0gCisJCQllbHNlIGlmIChhdG9tID09IGVsaWZBdG9tKSB7CisgICAgICAgICAgICAgICAgLyogd2UgZGVjcmVtZW50IGNwcC0+aWZkZXB0aCBoZXJlLCBiZWNhdXNlIENQUGlmIHdpbGwgaW5jcmVtZW50CisgICAgICAgICAgICAgICAgICogaXQgYW5kIHdlIHJlYWxseSB3YW50IHRvIGxlYXZlIGl0IGFsb25lICovCisJCQkJaWYgKGNwcC0+aWZkZXB0aCl7CisJCQkJCS0tY3BwLT5pZmRlcHRoOworCQkJCSAgICAtLWNwcC0+ZWxzZXRyYWNrZXI7CisJCQkJfQorICAgICAgICAgICAgICAgIHJldHVybiBDUFBpZih5eWx2YWxwcCk7CisgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgZWxzZSBpZigoYXRvbT09ZWxzZUF0b20pICYmICghQ2hrQ29ycmVjdEVsc2VOZXN0aW5nKCkpKXsKKyAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCIjZWxzZSBhZnRlciBhICNlbHNlIik7CisgICAgICAgICAgICBjcHAtPkNvbXBpbGVFcnJvcj0xOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKwl9OworICAgIHJldHVybiB0b2tlbjsKK30KKworZW51bSBldmFsX3ByZWMgeworICAgIE1JTl9QUkVDLAorICAgIENPTkQsIExPR09SLCBMT0dBTkQsIE9SLCBYT1IsIEFORCwgRVFVQUwsIFJFTEFUSU9OLCBTSElGVCwgQURELCBNVUwsIFVOQVJZLAorICAgIE1BWF9QUkVDCit9OworCitzdGF0aWMgaW50IG9wX2xvZ29yKGludCBhLCBpbnQgYikgeyByZXR1cm4gYSB8fCBiOyB9CitzdGF0aWMgaW50IG9wX2xvZ2FuZChpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgJiYgYjsgfQorc3RhdGljIGludCBvcF9vcihpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgfCBiOyB9CitzdGF0aWMgaW50IG9wX3hvcihpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgXiBiOyB9CitzdGF0aWMgaW50IG9wX2FuZChpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgJiBiOyB9CitzdGF0aWMgaW50IG9wX2VxKGludCBhLCBpbnQgYikgeyByZXR1cm4gYSA9PSBiOyB9CitzdGF0aWMgaW50IG9wX25lKGludCBhLCBpbnQgYikgeyByZXR1cm4gYSAhPSBiOyB9CitzdGF0aWMgaW50IG9wX2dlKGludCBhLCBpbnQgYikgeyByZXR1cm4gYSA+PSBiOyB9CitzdGF0aWMgaW50IG9wX2xlKGludCBhLCBpbnQgYikgeyByZXR1cm4gYSA8PSBiOyB9CitzdGF0aWMgaW50IG9wX2d0KGludCBhLCBpbnQgYikgeyByZXR1cm4gYSA+IGI7IH0KK3N0YXRpYyBpbnQgb3BfbHQoaW50IGEsIGludCBiKSB7IHJldHVybiBhIDwgYjsgfQorc3RhdGljIGludCBvcF9zaGwoaW50IGEsIGludCBiKSB7IHJldHVybiBhIDw8IGI7IH0KK3N0YXRpYyBpbnQgb3Bfc2hyKGludCBhLCBpbnQgYikgeyByZXR1cm4gYSA+PiBiOyB9CitzdGF0aWMgaW50IG9wX2FkZChpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgKyBiOyB9CitzdGF0aWMgaW50IG9wX3N1YihpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgLSBiOyB9CitzdGF0aWMgaW50IG9wX211bChpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgKiBiOyB9CitzdGF0aWMgaW50IG9wX2RpdihpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgLyBiOyB9CitzdGF0aWMgaW50IG9wX21vZChpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgJSBiOyB9CitzdGF0aWMgaW50IG9wX3BvcyhpbnQgYSkgeyByZXR1cm4gYTsgfQorc3RhdGljIGludCBvcF9uZWcoaW50IGEpIHsgcmV0dXJuIC1hOyB9CitzdGF0aWMgaW50IG9wX2NtcGwoaW50IGEpIHsgcmV0dXJuIH5hOyB9CitzdGF0aWMgaW50IG9wX25vdChpbnQgYSkgeyByZXR1cm4gIWE7IH0KKworc3RydWN0IHsKKyAgICBpbnQgdG9rZW4sIHByZWMsICgqb3ApKGludCwgaW50KTsKK30gYmlub3BbXSA9IHsKKyAgICB7IENQUF9PUl9PUCwgTE9HT1IsIG9wX2xvZ29yIH0sCisgICAgeyBDUFBfQU5EX09QLCBMT0dBTkQsIG9wX2xvZ2FuZCB9LAorICAgIHsgJ3wnLCBPUiwgb3Bfb3IgfSwKKyAgICB7ICdeJywgWE9SLCBvcF94b3IgfSwKKyAgICB7ICcmJywgQU5ELCBvcF9hbmQgfSwKKyAgICB7IENQUF9FUV9PUCwgRVFVQUwsIG9wX2VxIH0sCisgICAgeyBDUFBfTkVfT1AsIEVRVUFMLCBvcF9uZSB9LAorICAgIHsgJz4nLCBSRUxBVElPTiwgb3BfZ3QgfSwKKyAgICB7IENQUF9HRV9PUCwgUkVMQVRJT04sIG9wX2dlIH0sCisgICAgeyAnPCcsIFJFTEFUSU9OLCBvcF9sdCB9LAorICAgIHsgQ1BQX0xFX09QLCBSRUxBVElPTiwgb3BfbGUgfSwKKyAgICB7IENQUF9MRUZUX09QLCBTSElGVCwgb3Bfc2hsIH0sCisgICAgeyBDUFBfUklHSFRfT1AsIFNISUZULCBvcF9zaHIgfSwKKyAgICB7ICcrJywgQURELCBvcF9hZGQgfSwKKyAgICB7ICctJywgQURELCBvcF9zdWIgfSwKKyAgICB7ICcqJywgTVVMLCBvcF9tdWwgfSwKKyAgICB7ICcvJywgTVVMLCBvcF9kaXYgfSwKKyAgICB7ICclJywgTVVMLCBvcF9tb2QgfSwKK307CisKK3N0cnVjdCB7CisgICAgaW50IHRva2VuLCAoKm9wKShpbnQpOworfSB1bm9wW10gPSB7CisgICAgeyAnKycsIG9wX3BvcyB9LAorICAgIHsgJy0nLCBvcF9uZWcgfSwKKyAgICB7ICd+Jywgb3BfY21wbCB9LAorICAgIHsgJyEnLCBvcF9ub3QgfSwKK307CisKKyNkZWZpbmUgQUxFTihBKSAoc2l6ZW9mKEEpL3NpemVvZihBWzBdKSkKKworc3RhdGljIGludCBldmFsKGludCB0b2tlbiwgaW50IHByZWMsIGludCAqcmVzLCBpbnQgKmVyciwgeXlzdHlwZXBwICogeXlsdmFscHApCit7CisgICAgaW50ICAgICAgICAgaSwgdmFsOworICAgIFN5bWJvbCAgICAgICpzOworICAgIGlmICh0b2tlbiA9PSBDUFBfSURFTlRJRklFUikgeworICAgICAgICBpZiAoeXlsdmFscHAtPnNjX2lkZW50ID09IGRlZmluZWRBdG9tKSB7CisgICAgICAgICAgICBpbnQgbmVlZGNsb3NlID0gMDsKKyAgICAgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGlmICh0b2tlbiA9PSAnKCcpIHsKKyAgICAgICAgICAgICAgICBuZWVkY2xvc2UgPSAxOworICAgICAgICAgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2tlbiAhPSBDUFBfSURFTlRJRklFUikKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgKnJlcyA9IChzID0gTG9va1VwU3ltYm9sKG1hY3JvcywgeXlsdmFscHAtPnNjX2lkZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gIXMtPmRldGFpbHMubWFjLnVuZGVmIDogMDsKKyAgICAgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGlmIChuZWVkY2xvc2UpIHsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gIT0gJyknKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIH0KKwkJfSBlbHNlIGlmIChNYWNyb0V4cGFuZCh5eWx2YWxwcC0+c2NfaWRlbnQsIHl5bHZhbHBwKSkgeworCQkJdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgcmV0dXJuIGV2YWwodG9rZW4sIHByZWMsIHJlcywgZXJyLCB5eWx2YWxwcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisJfSBlbHNlIGlmICh0b2tlbiA9PSBDUFBfSU5UQ09OU1RBTlQpIHsKKyAgICAgICAgKnJlcyA9IHl5bHZhbHBwLT5zY19pbnQ7CisgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICB9IGVsc2UgaWYgKHRva2VuID09ICcoJykgeworICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgIHRva2VuID0gZXZhbCh0b2tlbiwgTUlOX1BSRUMsIHJlcywgZXJyLCB5eWx2YWxwcCk7CisgICAgICAgIGlmICghKmVycikgeworICAgICAgICAgICAgaWYgKHRva2VuICE9ICcpJykKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gQUxFTih1bm9wKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAodW5vcFtpXS50b2tlbiA9PSB0b2tlbikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICB0b2tlbiA9IGV2YWwodG9rZW4sIFVOQVJZLCByZXMsIGVyciwgeXlsdmFscHApOworICAgICAgICAgICAgKnJlcyA9IHVub3BbaV0ub3AoKnJlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlICghKmVycikgeworICAgICAgICBpZiAodG9rZW4gPT0gJyknIHx8IHRva2VuID09ICdcbicpIGJyZWFrOworICAgICAgICBmb3IgKGkgPSBBTEVOKGJpbm9wKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAoYmlub3BbaV0udG9rZW4gPT0gdG9rZW4pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPCAwIHx8IGJpbm9wW2ldLnByZWMgPD0gcHJlYykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB2YWwgPSAqcmVzOworICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgIHRva2VuID0gZXZhbCh0b2tlbiwgYmlub3BbaV0ucHJlYywgcmVzLCBlcnIsIHl5bHZhbHBwKTsKKyAgICAgICAgCisgICAgICAgIGlmIChiaW5vcFtpXS5vcCA9PSBvcF9kaXYgfHwgYmlub3BbaV0ub3AgPT0gb3BfbW9kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKnJlcyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJwcmVwcm9jZXNzb3IgZGl2aWRlIG9yIG1vZHVsbyBieSB6ZXJvIik7CisgICAgICAgICAgICAgICAgKmVyciA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnJlcyA9IGJpbm9wW2ldLm9wKHZhbCwgKnJlcyk7CisgICAgfQorICAgIHJldHVybiB0b2tlbjsKK2Vycm9yOgorICAgIENQUEVycm9yVG9JbmZvTG9nKCJpbmNvcnJlY3QgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSIpOworICAgICplcnIgPSAxOworICAgICpyZXMgPSAwOworICAgIHJldHVybiB0b2tlbjsKK30gLy8gZXZhbAorCitzdGF0aWMgaW50IENQUGlmKHl5c3R5cGVwcCAqIHl5bHZhbHBwKSB7CisgICAgaW50IHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICBpbnQgcmVzID0gMCwgZXJyID0gMDsKKworICAgIGlmICghY3BwLT5pZmRlcHRoKyspCisgICAgICAgIGlmbG9jID0gKmNwcC0+dG9rZW5Mb2M7CisgICAgaWYoY3BwLT5pZmRlcHRoID4gTUFYX0lGX05FU1RJTkcpeworICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygibWF4ICNpZiBuZXN0aW5nIGRlcHRoIGV4Y2VlZGVkIik7CisgICAgICAgIGNwcC0+Q29tcGlsZUVycm9yID0gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNwcC0+ZWxzZXRyYWNrZXIrKzsKKyAgICAvLyBzYW5pdHkgY2hlY2sgZWxzZXRyYWNrZXIKKyAgICBpZiAoY3BwLT5lbHNldHJhY2tlciA8IDAgfHwgY3BwLT5lbHNldHJhY2tlciA+PSBNQVhfSUZfTkVTVElORykgeworICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygibWlzbWF0Y2hlZCAjaWYvI2VuZGlmIHN0YXRlbWVudHMiKTsKKyAgICAgICAgY3BwLT5Db21waWxlRXJyb3IgPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY3BwLT5lbHNlZGVwdGhbY3BwLT5lbHNldHJhY2tlcl0gPSAwOworCisgICAgdG9rZW4gPSBldmFsKHRva2VuLCBNSU5fUFJFQywgJnJlcywgJmVyciwgeXlsdmFscHApOworICAgIGlmICh0b2tlbiAhPSAnXG4nKSB7CisgICAgICAgIENQUFdhcm5pbmdUb0luZm9Mb2coInVuZXhwZWN0ZWQgdG9rZW5zIGZvbGxvd2luZyAjaWYgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAtIGV4cGVjdGVkIGEgbmV3bGluZSIpOworICAgICAgICB3aGlsZSAodG9rZW4gIT0gJ1xuJykgeworICAgICAgICAgICAgdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgaWYgKHRva2VuIDw9IDApIHsgLy8gRU9GIG9yIGVycm9yCisgICAgICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coInVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGluICNpZiBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIC0gZXhwZWN0ZWQgYSBuZXdsaW5lIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IAorICAgIGlmICghcmVzICYmICFlcnIpIHsKKyAgICAgICAgdG9rZW4gPSBDUFBlbHNlKDEsIHl5bHZhbHBwKTsKKyAgICB9CisKKyAgICByZXR1cm4gdG9rZW47Cit9IC8vIENQUGlmCisKK3N0YXRpYyBpbnQgQ1BQaWZkZWYoaW50IGRlZmluZWQsIHl5c3R5cGVwcCAqIHl5bHZhbHBwKQoreworICAgIGludCB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgaW50IG5hbWUgPSB5eWx2YWxwcC0+c2NfaWRlbnQ7CisgICAgaWYoKytjcHAtPmlmZGVwdGggPiBNQVhfSUZfTkVTVElORyl7CisgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJtYXggI2lmIG5lc3RpbmcgZGVwdGggZXhjZWVkZWQiKTsKKyAgICAgICAgY3BwLT5Db21waWxlRXJyb3IgPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY3BwLT5lbHNldHJhY2tlcisrOworICAgIC8vIHNhbml0eSBjaGVjayBlbHNldHJhY2tlcgorICAgIGlmIChjcHAtPmVsc2V0cmFja2VyIDwgMCB8fCBjcHAtPmVsc2V0cmFja2VyID49IE1BWF9JRl9ORVNUSU5HKSB7CisgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJtaXNtYXRjaGVkICNpZi8jZW5kaWYgc3RhdGVtZW50cyIpOworICAgICAgICBjcHAtPkNvbXBpbGVFcnJvciA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjcHAtPmVsc2VkZXB0aFtjcHAtPmVsc2V0cmFja2VyXSA9IDA7CisKKyAgICBpZiAodG9rZW4gIT0gQ1BQX0lERU5USUZJRVIpIHsKKyAgICAgICAgICAgIGRlZmluZWQgPyBDUFBFcnJvclRvSW5mb0xvZygiaWZkZWYiKTpDUFBFcnJvclRvSW5mb0xvZygiaWZuZGVmIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU3ltYm9sICpzID0gTG9va1VwU3ltYm9sKG1hY3JvcywgbmFtZSk7CisgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgaWYgKHRva2VuICE9ICdcbicpIHsKKyAgICAgICAgICAgIENQUFdhcm5pbmdUb0luZm9Mb2coInVuZXhwZWN0ZWQgdG9rZW5zIGZvbGxvd2luZyAjaWZkZWYgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAtIGV4cGVjdGVkIGEgbmV3bGluZSIpOworICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuIDw9IDApIHsgLy8gRU9GIG9yIGVycm9yCisgICAgICAgICAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJ1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBpbiAjaWZkZWYgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAtIGV4cGVjdGVkIGEgbmV3bGluZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgocyAmJiAhcy0+ZGV0YWlscy5tYWMudW5kZWYpID8gMSA6IDApICE9IGRlZmluZWQpCisgICAgICAgICAgICB0b2tlbiA9IENQUGVsc2UoMSwgeXlsdmFscHApOworICAgIH0KKyAgICByZXR1cm4gdG9rZW47Cit9IC8vIENQUGlmZGVmCisKK3N0YXRpYyBpbnQgQ1BQbGluZSh5eXN0eXBlcHAgKiB5eWx2YWxwcCkgCit7CisgICAgaW50IHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKwlpZih0b2tlbj09J1xuJyl7CisJCURlY0xpbmVOdW1iZXIoKTsKKyAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIiNsaW5lIik7CisgICAgICAgIEluY0xpbmVOdW1iZXIoKTsKKwkJcmV0dXJuIHRva2VuOworCX0KKwllbHNlIGlmICh0b2tlbiA9PSBDUFBfSU5UQ09OU1RBTlQpIHsKKwkJeXlsdmFscHAtPnNjX2ludD1hdG9pKHl5bHZhbHBwLT5zeW1ib2xfbmFtZSk7CisJCVNldExpbmVOdW1iZXIoeXlsdmFscHAtPnNjX2ludCk7CisgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgCisJCWlmICh0b2tlbiA9PSBDUFBfSU5UQ09OU1RBTlQpIHsKKyAgICAgICAgICAgIHl5bHZhbHBwLT5zY19pbnQ9YXRvaSh5eWx2YWxwcC0+c3ltYm9sX25hbWUpOworCQkJU2V0U3RyaW5nTnVtYmVyKHl5bHZhbHBwLT5zY19pbnQpOworICAgICAgICAgICAgdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworCQkJaWYodG9rZW4hPSdcbicpCisJCQkJQ1BQRXJyb3JUb0luZm9Mb2coIiNsaW5lIik7CisgICAgICAgIH0KKwkJZWxzZSBpZiAodG9rZW4gPT0gJ1xuJyl7CisJCQlyZXR1cm4gdG9rZW47CisJCX0KKwkJZWxzZXsKKyAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCIjbGluZSIpOworCQl9CisJfQorCWVsc2V7CisgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIiNsaW5lIik7CisJfQorICAgIHJldHVybiB0b2tlbjsKK30KKworc3RhdGljIGludCBDUFBlcnJvcih5eXN0eXBlcHAgKiB5eWx2YWxwcCkgeworCisJaW50IHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICBjb25zdCBjaGFyICptZXNzYWdlOworCQorICAgIHdoaWxlICh0b2tlbiAhPSAnXG4nKSB7CisgICAgICAgIGlmICh0b2tlbiA8PSAwKXsKKyAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJ1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBpbiAjZXJyb3IgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAtIGV4cGVjdGVkIGEgbmV3bGluZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH1lbHNlIGlmICh0b2tlbiA9PSBDUFBfRkxPQVRDT05TVEFOVCB8fCB0b2tlbiA9PSBDUFBfSU5UQ09OU1RBTlQpeworICAgICAgICAgICAgU3RvcmVTdHIoeXlsdmFscHAtPnN5bWJvbF9uYW1lKTsKKwkJfWVsc2UgaWYodG9rZW4gPT0gQ1BQX0lERU5USUZJRVIgfHwgdG9rZW4gPT0gQ1BQX1NUUkNPTlNUQU5UKXsKKwkJCVN0b3JlU3RyKEdldFN0cmluZ09mQXRvbShhdGFibGUseXlsdmFscHAtPnNjX2lkZW50KSk7CisJCX1lbHNlIHsKKwkJICAgIFN0b3JlU3RyKEdldFN0cmluZ09mQXRvbShhdGFibGUsdG9rZW4pKTsKKwkJfQorCQl0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisJfQorCURlY0xpbmVOdW1iZXIoKTsKKwkvL3N0b3JlIHRoaXMgbXNnIGludG8gdGhlIHNoYWRlcidzIGluZm9ybWF0aW9uIGxvZy4uc2V0IHRoZSBDb21waWxlIEVycm9yIGZsYWchISEhCisJbWVzc2FnZT1HZXRTdHJmcm9tVFN0cigpOworICAgIENQUFNoSW5mb0xvZ01zZyhtZXNzYWdlKTsKKyAgICBSZXNldFRTdHJpbmcoKTsKKyAgICBjcHAtPkNvbXBpbGVFcnJvcj0xOworICAgIEluY0xpbmVOdW1iZXIoKTsKKyAgICByZXR1cm4gJ1xuJzsKK30vL0NQUGVycm9yCisKK3N0YXRpYyBpbnQgQ1BQcHJhZ21hKHl5c3R5cGVwcCAqIHl5bHZhbHBwKQoreworCWNoYXIgU3JjU3RyTmFtZVsyXTsKKwljaGFyKiogYWxsVG9rZW5zOworCWludCB0b2tlbkNvdW50ID0gMDsKKwlpbnQgbWF4VG9rZW5Db3VudCA9IDEwOworCWNvbnN0IGNoYXIqIFNyY1N0cjsKKwlpbnQgaTsKKworCWludCB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisJCisJaWYgKHRva2VuPT0nXG4nKSB7CisJCURlY0xpbmVOdW1iZXIoKTsKKyAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIiNwcmFnbWEiKTsKKyAgICAgICAgSW5jTGluZU51bWJlcigpOworCSAgICByZXR1cm4gdG9rZW47CisJfQorCQorCWFsbFRva2VucyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikgKiBtYXhUb2tlbkNvdW50KTsJCisKKwl3aGlsZSAodG9rZW4gIT0gJ1xuJykgeworCQlpZiAodG9rZW5Db3VudCA+PSBtYXhUb2tlbkNvdW50KSB7CisJCQltYXhUb2tlbkNvdW50ICo9IDI7CisJCQlhbGxUb2tlbnMgPSAoY2hhcioqKXJlYWxsb2MoKGNoYXIqKilhbGxUb2tlbnMsIHNpemVvZihjaGFyKikgKiBtYXhUb2tlbkNvdW50KTsKKwkJfQorCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgQ1BQX0lERU5USUZJRVI6CisJCQlTcmNTdHIgPSBHZXRBdG9tU3RyaW5nKGF0YWJsZSwgeXlsdmFscHAtPnNjX2lkZW50KTsKKwkJCWFsbFRva2Vuc1t0b2tlbkNvdW50XSA9IChjaGFyKiltYWxsb2Moc3RybGVuKFNyY1N0cikgKyAxKTsKKwkJCXN0cmNweShhbGxUb2tlbnNbdG9rZW5Db3VudCsrXSwgU3JjU3RyKTsKKwkJCWJyZWFrOworCQljYXNlIENQUF9JTlRDT05TVEFOVDoKKwkJCVNyY1N0ciA9IHl5bHZhbHBwLT5zeW1ib2xfbmFtZTsKKwkJCWFsbFRva2Vuc1t0b2tlbkNvdW50XSA9IChjaGFyKiltYWxsb2Moc3RybGVuKFNyY1N0cikgKyAxKTsKKwkJCXN0cmNweShhbGxUb2tlbnNbdG9rZW5Db3VudCsrXSwgU3JjU3RyKTsKKwkJCWJyZWFrOworCQljYXNlIENQUF9GTE9BVENPTlNUQU5UOgorCQkJU3JjU3RyID0geXlsdmFscHAtPnN5bWJvbF9uYW1lOworCQkJYWxsVG9rZW5zW3Rva2VuQ291bnRdID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4oU3JjU3RyKSArIDEpOworCQkJc3RyY3B5KGFsbFRva2Vuc1t0b2tlbkNvdW50KytdLCBTcmNTdHIpOworCQkJYnJlYWs7CisJCWNhc2UgLTE6CisgICAgICAgICAgICAvLyBFT0YKKyAgICAgICAgICAgIENQUFNoSW5mb0xvZ01zZygiI3ByYWdtYSBkaXJlY3RpdmUgbXVzdCBlbmQgd2l0aCBhIG5ld2xpbmUiKTsJCQkKKwkJCXJldHVybiB0b2tlbjsKKwkJZGVmYXVsdDoKKwkJCVNyY1N0ck5hbWVbMF0gPSB0b2tlbjsKKwkJCVNyY1N0ck5hbWVbMV0gPSAnXDAnOworCQkJYWxsVG9rZW5zW3Rva2VuQ291bnRdID0gKGNoYXIqKW1hbGxvYygyKTsKKwkJCXN0cmNweShhbGxUb2tlbnNbdG9rZW5Db3VudCsrXSwgU3JjU3RyTmFtZSk7CisJCX0KKwkJdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworCX0KKworCWNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB0b2tlbiwgeXlsdmFscHApOworCUhhbmRsZVByYWdtYSgoY29uc3QgY2hhcioqKWFsbFRva2VucywgdG9rZW5Db3VudCk7CisJdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworCQorCWZvciAoaSA9IDA7IGkgPCB0b2tlbkNvdW50OyArK2kpIHsKKwkJZnJlZSAoYWxsVG9rZW5zW2ldKTsKKwl9CisJZnJlZSAoYWxsVG9rZW5zKTsJCisKKwlyZXR1cm4gdG9rZW47ICAgIAorfSAvLyBDUFBwcmFnbWEKKworI2RlZmluZSBFU1NMX1ZFUlNJT05fTlVNQkVSIDEwMAorI2RlZmluZSBFU1NMX1ZFUlNJT05fU1RSSU5HICIxMDAiCisKK3N0YXRpYyBpbnQgQ1BQdmVyc2lvbih5eXN0eXBlcHAgKiB5eWx2YWxwcCkKK3sKKworICAgIGludCB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisKKyAgICBpZiAoY3BwLT5wYXN0Rmlyc3RTdGF0ZW1lbnQgPT0gMSkKKyAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKCIjdmVyc2lvbiBtdXN0IG9jY3VyIGJlZm9yZSBhbnkgb3RoZXIgc3RhdGVtZW50IGluIHRoZSBwcm9ncmFtIik7CisKKyAgICBpZih0b2tlbj09J1xuJyl7CisJCURlY0xpbmVOdW1iZXIoKTsKKyAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIiN2ZXJzaW9uIik7CisgICAgICAgIEluY0xpbmVOdW1iZXIoKTsKKwkJcmV0dXJuIHRva2VuOworCX0KKyAgICBpZiAodG9rZW4gIT0gQ1BQX0lOVENPTlNUQU5UKQorICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiI3ZlcnNpb24iKTsKKwkKKyAgICB5eWx2YWxwcC0+c2NfaW50PWF0b2koeXlsdmFscHAtPnN5bWJvbF9uYW1lKTsKKwkvL1NldFZlcnNpb25OdW1iZXIoeXlsdmFscHAtPnNjX2ludCk7CisgICAgCisgICAgaWYgKHl5bHZhbHBwLT5zY19pbnQgIT0gRVNTTF9WRVJTSU9OX05VTUJFUikKKyAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKCJWZXJzaW9uIG51bWJlciBub3Qgc3VwcG9ydGVkIGJ5IEVTU0wiKTsKKworICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAKKwlpZiAodG9rZW4gPT0gJ1xuJyl7CisJCXJldHVybiB0b2tlbjsKKwl9CisJZWxzZXsKKyAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIiN2ZXJzaW9uIik7CisJfQorICAgIHJldHVybiB0b2tlbjsKK30gLy8gQ1BQdmVyc2lvbgorCitzdGF0aWMgaW50IENQUGV4dGVuc2lvbih5eXN0eXBlcHAgKiB5eWx2YWxwcCkKK3sKKworICAgIGludCB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgY2hhciBleHRlbnNpb25OYW1lW01BWF9TWU1CT0xfTkFNRV9MRU4gKyAxXTsKKworICAgIGlmKHRva2VuPT0nXG4nKXsKKwkJRGVjTGluZU51bWJlcigpOworICAgICAgICBDUFBTaEluZm9Mb2dNc2coImV4dGVuc2lvbiBuYW1lIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgSW5jTGluZU51bWJlcigpOworCQlyZXR1cm4gdG9rZW47CisJfQorCisgICAgaWYgKHRva2VuICE9IENQUF9JREVOVElGSUVSKQorICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiI2V4dGVuc2lvbiIpOworICAgIAorICAgIHN0cm5jcHkoZXh0ZW5zaW9uTmFtZSwgR2V0QXRvbVN0cmluZyhhdGFibGUsIHl5bHZhbHBwLT5zY19pZGVudCksIE1BWF9TWU1CT0xfTkFNRV9MRU4pOworICAgIGV4dGVuc2lvbk5hbWVbTUFYX1NZTUJPTF9OQU1FX0xFTl0gPSAnXDAnOworCSAgICAKKyAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgaWYgKHRva2VuICE9ICc6JykgeworICAgICAgICBDUFBTaEluZm9Mb2dNc2coIic6JyBtaXNzaW5nIGFmdGVyIGV4dGVuc2lvbiBuYW1lIik7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisgICAgCisgICAgdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgIGlmICh0b2tlbiAhPSBDUFBfSURFTlRJRklFUikgeworICAgICAgICBDUFBTaEluZm9Mb2dNc2coImJlaGF2aW9yIGZvciBleHRlbnNpb24gbm90IHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorCisgICAgdXBkYXRlRXh0ZW5zaW9uQmVoYXZpb3IoZXh0ZW5zaW9uTmFtZSwgR2V0QXRvbVN0cmluZyhhdGFibGUsIHl5bHZhbHBwLT5zY19pZGVudCkpOworCisgICAgdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworCWlmICh0b2tlbiA9PSAnXG4nKXsKKwkJcmV0dXJuIHRva2VuOworCX0KKwllbHNleworICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiI2V4dGVuc2lvbiIpOworCX0KKyAgICByZXR1cm4gdG9rZW47Cit9IC8vIENQUGV4dGVuc2lvbgorCitpbnQgcmVhZENQUGxpbmUoeXlzdHlwZXBwICogeXlsdmFscHApCit7CisgICAgaW50IHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICBjb25zdCBjaGFyICptZXNzYWdlOworICAgIGludCBpc1ZlcnNpb24gPSAwOworCisgICAgaWYgKHRva2VuID09IENQUF9JREVOVElGSUVSKSB7CisgICAgICAgIGlmICh5eWx2YWxwcC0+c2NfaWRlbnQgPT0gZGVmaW5lQXRvbSkgeworICAgICAgICAgICAgIHRva2VuID0gQ1BQZGVmaW5lKHl5bHZhbHBwKTsKKyAgICAgICAgfSBlbHNlIGlmICh5eWx2YWxwcC0+c2NfaWRlbnQgPT0gZWxzZUF0b20pIHsKKwkJCSBpZihDaGtDb3JyZWN0RWxzZU5lc3RpbmcoKSl7CisgICAgICAgICAgICAgICAgIGlmICghY3BwLT5pZmRlcHRoICl7CisgICAgICAgICAgICAgICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiI2Vsc2UgbWlzbWF0Y2giKTsKKyAgICAgICAgICAgICAgICAgICAgIGNwcC0+Q29tcGlsZUVycm9yPTE7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgIGlmICh0b2tlbiAhPSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICBDUFBXYXJuaW5nVG9JbmZvTG9nKCJ1bmV4cGVjdGVkIHRva2VucyBmb2xsb3dpbmcgI2Vsc2UgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAtIGV4cGVjdGVkIGEgbmV3bGluZSIpOworICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuIDw9IDApIHsgLy8gRU9GIG9yIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJ1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBpbiAjaWZkZWYgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAtIGV4cGVjdGVkIGEgbmV3bGluZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIH0KKwkJCSAgICAgdG9rZW4gPSBDUFBlbHNlKDAsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIiNlbHNlIGFmdGVyIGEgI2Vsc2UiKTsKKyAgICAgICAgICAgICAgICAgY3BwLT5pZmRlcHRoID0gMDsKKyAgICAgICAgICAgICAgICAgY3BwLT5lbHNldHJhY2tlciA9IDA7CisgICAgICAgICAgICAgICAgIGNwcC0+cGFzdEZpcnN0U3RhdGVtZW50ID0gMTsKKyAgICAgICAgICAgICAgICAgY3BwLT5Db21waWxlRXJyb3IgPSAxOworICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB9CisJCX0gZWxzZSBpZiAoeXlsdmFscHAtPnNjX2lkZW50ID09IGVsaWZBdG9tKSB7CisgICAgICAgICAgICBpZiAoIWNwcC0+aWZkZXB0aCl7CisgICAgICAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCIjZWxpZiBtaXNtYXRjaCIpOworICAgICAgICAgICAgICAgICBjcHAtPkNvbXBpbGVFcnJvcj0xOworICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICAvLyB0aGlzIHRva2VuIGlzIHJlYWxseSBhIGRvbnQgY2FyZSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gZWF0IHRoZSB0b2tlbnMKKyAgICAgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsgCisgICAgICAgICAgICB3aGlsZSAodG9rZW4gIT0gJ1xuJykgeworICAgICAgICAgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gPD0gMCkgeyAvLyBFT0Ygb3IgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coInVuZXhwZWN0IHRva2VucyBmb2xsb3dpbmcgI2VsaWYgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAtIGV4cGVjdGVkIGEgbmV3bGluZSIpOworICAgICAgICAgICAgICAgICAgICBjcHAtPkNvbXBpbGVFcnJvciA9IDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkJICAgIHRva2VuID0gQ1BQZWxzZSgwLCB5eWx2YWxwcCk7CisgICAgICAgIH0gZWxzZSBpZiAoeXlsdmFscHAtPnNjX2lkZW50ID09IGVuZGlmQXRvbSkgeworICAgICAgICAgICAgIGlmICghY3BwLT5pZmRlcHRoKXsKKyAgICAgICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIiNlbmRpZiBtaXNtYXRjaCIpOworICAgICAgICAgICAgICAgICBjcHAtPkNvbXBpbGVFcnJvcj0xOworICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAtLWNwcC0+aWZkZXB0aDsKKworICAgICAgICAgICAgIGlmIChjcHAtPmVsc2V0cmFja2VyKQorICAgICAgICAgICAgICAgICAtLWNwcC0+ZWxzZXRyYWNrZXI7CisKKwkgICAgfSBlbHNlIGlmICh5eWx2YWxwcC0+c2NfaWRlbnQgPT0gaWZBdG9tKSB7CisgICAgICAgICAgICAgdG9rZW4gPSBDUFBpZih5eWx2YWxwcCk7CisgICAgICAgIH0gZWxzZSBpZiAoeXlsdmFscHAtPnNjX2lkZW50ID09IGlmZGVmQXRvbSkgeworICAgICAgICAgICAgIHRva2VuID0gQ1BQaWZkZWYoMSwgeXlsdmFscHApOworICAgICAgICB9IGVsc2UgaWYgKHl5bHZhbHBwLT5zY19pZGVudCA9PSBpZm5kZWZBdG9tKSB7CisgICAgICAgICAgICAgdG9rZW4gPSBDUFBpZmRlZigwLCB5eWx2YWxwcCk7CisgICAgICAgIH0gZWxzZSBpZiAoeXlsdmFscHAtPnNjX2lkZW50ID09IGxpbmVBdG9tKSB7CisgICAgICAgICAgICAgdG9rZW4gPSBDUFBsaW5lKHl5bHZhbHBwKTsKKyAgICAgICAgfSBlbHNlIGlmICh5eWx2YWxwcC0+c2NfaWRlbnQgPT0gcHJhZ21hQXRvbSkgeworICAgICAgICAgICAgIHRva2VuID0gQ1BQcHJhZ21hKHl5bHZhbHBwKTsKKyAgICAgICAgfSBlbHNlIGlmICh5eWx2YWxwcC0+c2NfaWRlbnQgPT0gdW5kZWZBdG9tKSB7CisgICAgICAgICAgICAgdG9rZW4gPSBDUFB1bmRlZih5eWx2YWxwcCk7CisgICAgICAgIH0gZWxzZSBpZiAoeXlsdmFscHAtPnNjX2lkZW50ID09IGVycm9yQXRvbSkgeworICAgICAgICAgICAgIHRva2VuID0gQ1BQZXJyb3IoeXlsdmFscHApOworICAgICAgICB9IGVsc2UgaWYgKHl5bHZhbHBwLT5zY19pZGVudCA9PSB2ZXJzaW9uQXRvbSkgeworICAgICAgICAgICAgdG9rZW4gPSBDUFB2ZXJzaW9uKHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGlzVmVyc2lvbiA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoeXlsdmFscHAtPnNjX2lkZW50ID09IGV4dGVuc2lvbkF0b20pIHsKKyAgICAgICAgICAgIHRva2VuID0gQ1BQZXh0ZW5zaW9uKHl5bHZhbHBwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0b3JlU3RyKCJJbnZhbGlkIERpcmVjdGl2ZSIpOworICAgICAgICAgICAgU3RvcmVTdHIoR2V0U3RyaW5nT2ZBdG9tKGF0YWJsZSx5eWx2YWxwcC0+c2NfaWRlbnQpKTsKKyAgICAgICAgICAgIG1lc3NhZ2U9R2V0U3RyZnJvbVRTdHIoKTsKKyAgICAgICAgICAgIENQUFNoSW5mb0xvZ01zZyhtZXNzYWdlKTsKKyAgICAgICAgICAgIFJlc2V0VFN0cmluZygpOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlICh0b2tlbiAhPSAnXG4nICYmIHRva2VuICE9IDAgJiYgdG9rZW4gIT0gRU9GKSB7CisJCXRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKwl9CisgICAgICAgIAorICAgIGNwcC0+cGFzdEZpcnN0U3RhdGVtZW50ID0gMTsKKworICAgIHJldHVybiB0b2tlbjsKK30gLy8gcmVhZENQUGxpbmUKKwordm9pZCBGcmVlTWFjcm8oTWFjcm9TeW1ib2wgKnMpIHsKKyAgICBEZWxldGVUb2tlblN0cmVhbShzLT5ib2R5KTsKK30KKwordm9pZCBQcmVkZWZpbmVJbnRNYWNybyhjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpIHsKKyAgICBTb3VyY2VMb2MgbG9jYXRpb24gPSB7MH07CisgICAgU3ltYm9sICpzeW1ib2wgPSBOVUxMOworICAgIE1hY3JvU3ltYm9sIG1hY3JvID0gezB9OworICAgIHl5c3R5cGVwcCB2YWwgPSB7MH07CisgICAgaW50IGF0b20gPSAwOworCisgICAgbWFjcm8uYm9keSA9IE5ld1Rva2VuU3RyZWFtKG5hbWUsIG1hY3Jvcy0+cG9vbCk7CisgICAgdmFsLnNjX2ludCA9IHZhbHVlOworICAgIHNwcmludGYodmFsLnN5bWJvbF9uYW1lLCAiJWQiLCB2YWx1ZSk7CisgICAgUmVjb3JkVG9rZW4obWFjcm8uYm9keSwgQ1BQX0lOVENPTlNUQU5ULCAmdmFsKTsKKyAgICBhdG9tID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgbmFtZSk7CisgICAgc3ltYm9sID0gQWRkU3ltYm9sKCZsb2NhdGlvbiwgbWFjcm9zLCBhdG9tLCBNQUNST19TKTsKKyAgICBzeW1ib2wtPmRldGFpbHMubWFjID0gbWFjcm87Cit9CisKK3N0YXRpYyBpbnQgZW9mX3NjYW4oSW5wdXRTcmMgKmluLCB5eXN0eXBlcHAgKiB5eWx2YWxwcCkgeyByZXR1cm4gLTE7IH0KK3N0YXRpYyB2b2lkIG5vb3AoSW5wdXRTcmMgKmluLCBpbnQgY2gsIHl5c3R5cGVwcCAqIHl5bHZhbHBwKSB7IH0KKworc3RhdGljIHZvaWQgUHVzaEVvZlNyYygpIHsKKyAgICBJbnB1dFNyYyAqaW4gPSBtYWxsb2Moc2l6ZW9mKElucHV0U3JjKSk7CisgICAgbWVtc2V0KGluLCAwLCBzaXplb2YoSW5wdXRTcmMpKTsKKyAgICBpbi0+c2NhbiA9IGVvZl9zY2FuOworICAgIGluLT5nZXRjaCA9IGVvZl9zY2FuOworICAgIGluLT51bmdldGNoID0gbm9vcDsKKyAgICBpbi0+cHJldiA9IGNwcC0+Y3VycmVudElucHV0OworICAgIGNwcC0+Y3VycmVudElucHV0ID0gaW47Cit9CisKK3N0YXRpYyB2b2lkIFBvcEVvZlNyYygpIHsKKyAgICBpZiAoY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4gPT0gZW9mX3NjYW4pIHsKKyAgICAgICAgSW5wdXRTcmMgKmluID0gY3BwLT5jdXJyZW50SW5wdXQ7CisgICAgICAgIGNwcC0+Y3VycmVudElucHV0ID0gaW4tPnByZXY7CisgICAgICAgIGZyZWUoaW4pOworICAgIH0KK30KKworc3RhdGljIFRva2VuU3RyZWFtICpQcmVzY2FuTWFjcm9BcmcoVG9rZW5TdHJlYW0gKmEsIHl5c3R5cGVwcCAqIHl5bHZhbHBwKSB7CisgICAgaW50IHRva2VuOworICAgIFRva2VuU3RyZWFtICpuOworICAgIFJld2luZFRva2VuU3RyZWFtKGEpOworICAgIGRvIHsKKyAgICAgICAgdG9rZW4gPSBSZWFkVG9rZW4oYSwgeXlsdmFscHApOworICAgICAgICBpZiAodG9rZW4gPT0gQ1BQX0lERU5USUZJRVIgJiYgTG9va1VwU3ltYm9sKG1hY3JvcywgeXlsdmFscHAtPnNjX2lkZW50KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gd2hpbGUgKHRva2VuID4gMCk7CisgICAgaWYgKHRva2VuIDw9IDApIHJldHVybiBhOworICAgIG4gPSBOZXdUb2tlblN0cmVhbSgibWFjcm8gYXJnIiwgMCk7CisgICAgUHVzaEVvZlNyYygpOworICAgIFJlYWRGcm9tVG9rZW5TdHJlYW0oYSwgMCwgMCk7CisgICAgd2hpbGUgKCh0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCkpID4gMCkgeworICAgICAgICBpZiAodG9rZW4gPT0gQ1BQX0lERU5USUZJRVIgJiYgTWFjcm9FeHBhbmQoeXlsdmFscHAtPnNjX2lkZW50LCB5eWx2YWxwcCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgUmVjb3JkVG9rZW4obiwgdG9rZW4sIHl5bHZhbHBwKTsKKyAgICB9CisgICAgUG9wRW9mU3JjKCk7CisgICAgRGVsZXRlVG9rZW5TdHJlYW0oYSk7CisgICAgcmV0dXJuIG47Cit9IC8vIFByZXNjYW5NYWNyb0FyZworCit0eXBlZGVmIHN0cnVjdCBNYWNyb0lucHV0U3JjIHsKKyAgICBJbnB1dFNyYyAgICBiYXNlOworICAgIE1hY3JvU3ltYm9sICptYWM7CisgICAgVG9rZW5TdHJlYW0gKiphcmdzOworfSBNYWNyb0lucHV0U3JjOworCisvKiBtYWNyb19zY2FuIC0tLQorKiogcmV0dXJuIHRoZSBuZXh0IHRva2VuIGZvciBhIG1hY3JvIGV4cGFuaW9uLCBoYW5kbGluZyBtYWNybyBhcmdzIAorKi8KK3N0YXRpYyBpbnQgbWFjcm9fc2NhbihNYWNyb0lucHV0U3JjICppbiwgeXlzdHlwZXBwICogeXlsdmFscHApIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgdG9rZW4gPSBSZWFkVG9rZW4oaW4tPm1hYy0+Ym9keSwgeXlsdmFscHApOworICAgIGlmICh0b2tlbiA9PSBDUFBfSURFTlRJRklFUikgeworICAgICAgICBmb3IgKGkgPSBpbi0+bWFjLT5hcmdjLTE7IGk+PTA7IGktLSkKKyAgICAgICAgICAgIGlmIChpbi0+bWFjLT5hcmdzW2ldID09IHl5bHZhbHBwLT5zY19pZGVudCkgYnJlYWs7CisgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgIFJlYWRGcm9tVG9rZW5TdHJlYW0oaW4tPmFyZ3NbaV0sIHl5bHZhbHBwLT5zY19pZGVudCwgMCk7CisgICAgICAgICAgICByZXR1cm4gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodG9rZW4gPiAwKSByZXR1cm4gdG9rZW47CisgICAgaW4tPm1hYy0+YnVzeSA9IDA7CisgICAgY3BwLT5jdXJyZW50SW5wdXQgPSBpbi0+YmFzZS5wcmV2OworICAgIGlmIChpbi0+YXJncykgeworICAgICAgICBmb3IgKGk9aW4tPm1hYy0+YXJnYy0xOyBpPj0wOyBpLS0pCisgICAgICAgICAgICBEZWxldGVUb2tlblN0cmVhbShpbi0+YXJnc1tpXSk7CisgICAgICAgIGZyZWUoaW4tPmFyZ3MpOworICAgIH0KKyAgICBmcmVlKGluKTsKKyAgICByZXR1cm4gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKK30gLy8gbWFjcm9fc2NhbgorCisvKiBNYWNyb0V4cGFuZAorKiogY2hlY2sgYW4gaWRlbnRpZmllciAoYXRvbSkgdG8gc2VlIGlmIGl0IGEgbWFjcm8gdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuCisqKiBJZiBpdCBpcywgcHVzaCBhbiBJbnB1dFNyYyB0aGF0IHdpbGwgcHJvZHVjZSB0aGUgYXBwcm9wcmlhdGUgZXhwYW5zaW9uCisqKiBhbmQgcmV0dXJuIFRSVUUuICBJZiBub3QsIHJldHVybiBGQUxTRS4KKyovCisKK2ludCBNYWNyb0V4cGFuZChpbnQgYXRvbSwgeXlzdHlwZXBwICogeXlsdmFscHApCit7CisgICAgU3ltYm9sICAgICAgICAgICAgICAqc3ltID0gTG9va1VwU3ltYm9sKG1hY3JvcywgYXRvbSk7CisgICAgTWFjcm9JbnB1dFNyYyAgICAgICAqaW47CisgICAgaW50IGksaiwgdG9rZW4sIGRlcHRoPTA7CisgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKKwlpZiAoYXRvbSA9PSBfX0xJTkVfX0F0b20pIHsKKyAgICAgICAgeXlsdmFscHAtPnNjX2ludCA9IEdldExpbmVOdW1iZXIoKTsKKyAgICAgICAgc3ByaW50Zih5eWx2YWxwcC0+c3ltYm9sX25hbWUsIiVkIix5eWx2YWxwcC0+c2NfaW50KTsKKyAgICAgICAgVW5nZXRUb2tlbihDUFBfSU5UQ09OU1RBTlQsIHl5bHZhbHBwKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChhdG9tID09IF9fRklMRV9fQXRvbSkgeworICAgICAgICB5eWx2YWxwcC0+c2NfaW50ID0gR2V0U3RyaW5nTnVtYmVyKCk7CisgICAgICAgIHNwcmludGYoeXlsdmFscHAtPnN5bWJvbF9uYW1lLCIlZCIseXlsdmFscHAtPnNjX2ludCk7CisgICAgICAgIFVuZ2V0VG9rZW4oQ1BQX0lOVENPTlNUQU5ULCB5eWx2YWxwcCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKwlpZiAoYXRvbSA9PSBfX1ZFUlNJT05fX0F0b20pIHsKKyAgICAgICAgc3RyY3B5KHl5bHZhbHBwLT5zeW1ib2xfbmFtZSxFU1NMX1ZFUlNJT05fU1RSSU5HKTsKKyAgICAgICAgeXlsdmFscHAtPnNjX2ludCA9IGF0b2koeXlsdmFscHAtPnN5bWJvbF9uYW1lKTsKKyAgICAgICAgVW5nZXRUb2tlbihDUFBfSU5UQ09OU1RBTlQsIHl5bHZhbHBwKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghc3ltIHx8IHN5bS0+ZGV0YWlscy5tYWMudW5kZWYpIHJldHVybiAwOworICAgIGlmIChzeW0tPmRldGFpbHMubWFjLmJ1c3kpIHJldHVybiAwOyAgICAgICAgLy8gbm8gcmVjdXJzaXZlIGV4cGFuc2lvbnMKKyAgICBpbiA9IG1hbGxvYyhzaXplb2YoKmluKSk7CisgICAgbWVtc2V0KGluLCAwLCBzaXplb2YoKmluKSk7CisgICAgaW4tPmJhc2Uuc2NhbiA9ICh2b2lkICopbWFjcm9fc2NhbjsKKyAgICBpbi0+YmFzZS5saW5lID0gY3BwLT5jdXJyZW50SW5wdXQtPmxpbmU7CisgICAgaW4tPmJhc2UubmFtZSA9IGNwcC0+Y3VycmVudElucHV0LT5uYW1lOworICAgIGluLT5tYWMgPSAmc3ltLT5kZXRhaWxzLm1hYzsKKyAgICBpZiAoc3ltLT5kZXRhaWxzLm1hYy5hcmdzKSB7CisgICAgICAgIHRva2VuID0gY3BwLT5jdXJyZW50SW5wdXQtPnNjYW4oY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKwkJaWYgKHRva2VuICE9ICcoJykgeworICAgICAgICAgICAgVW5nZXRUb2tlbih0b2tlbiwgeXlsdmFscHApOworICAgICAgICAgICAgeXlsdmFscHAtPnNjX2lkZW50ID0gYXRvbTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGluLT5hcmdzID0gbWFsbG9jKGluLT5tYWMtPmFyZ2MgKiBzaXplb2YoVG9rZW5TdHJlYW0gKikpOworICAgICAgICBmb3IgKGk9MDsgaTxpbi0+bWFjLT5hcmdjOyBpKyspCisgICAgICAgICAgICBpbi0+YXJnc1tpXSA9IE5ld1Rva2VuU3RyZWFtKCJtYWNybyBhcmciLCAwKTsKKwkJaT0wO2o9MDsKKyAgICAgICAgZG97CisgICAgICAgICAgICBkZXB0aCA9IDA7CisJCQl3aGlsZSgxKSB7CisgICAgICAgICAgICAgICAgdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN0b3JlU3RyKCJFT0YgaW4gTWFjcm8gIik7CisgICAgICAgICAgICAgICAgICAgIFN0b3JlU3RyKEdldFN0cmluZ09mQXRvbShhdGFibGUsYXRvbSkpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPUdldFN0cmZyb21UU3RyKCk7CisgICAgICAgICAgICAgICAgICAgIENQUFNoSW5mb0xvZ01zZyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgUmVzZXRUU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZigoaW4tPm1hYy0+YXJnYz09MCkgJiYgKHRva2VuIT0nKScpKSBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCAmJiAodG9rZW4gPT0gJywnIHx8IHRva2VuID09ICcpJykpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSAnKCcpIGRlcHRoKys7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuID09ICcpJykgZGVwdGgtLTsKKyAgICAgICAgICAgICAgICBSZWNvcmRUb2tlbihpbi0+YXJnc1tpXSwgdG9rZW4sIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICBqPTE7CisJCQl9CisgICAgICAgICAgICBpZiAodG9rZW4gPT0gJyknKSB7CisgICAgICAgICAgICAgICAgaWYoKGluLT5tYWMtPmFyZ2M9PTEpICYmaj09MCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworCQl9d2hpbGUoaSA8IGluLT5tYWMtPmFyZ2MpOworCisgICAgICAgIGlmIChpIDwgaW4tPm1hYy0+YXJnYykgeworICAgICAgICAgICAgU3RvcmVTdHIoIlRvbyBmZXcgYXJncyBpbiBNYWNybyAiKTsKKyAgICAgICAgICAgIFN0b3JlU3RyKEdldFN0cmluZ09mQXRvbShhdGFibGUsYXRvbSkpOworICAgICAgICAgICAgbWVzc2FnZT1HZXRTdHJmcm9tVFN0cigpOworICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKG1lc3NhZ2UpOworICAgICAgICAgICAgUmVzZXRUU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gIT0gJyknKSB7CisgICAgICAgICAgICBkZXB0aD0wOworCQkJd2hpbGUgKHRva2VuID49IDAgJiYgKGRlcHRoID4gMCB8fCB0b2tlbiAhPSAnKScpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuID09ICcpJykgZGVwdGgtLTsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuID09ICcoJykgZGVwdGgrKzsKKyAgICAgICAgICAgIH0KKwkJCQorICAgICAgICAgICAgaWYgKHRva2VuIDw9IDApIHsKKyAgICAgICAgICAgICAgICBTdG9yZVN0cigiRU9GIGluIE1hY3JvICIpOworICAgICAgICAgICAgICAgIFN0b3JlU3RyKEdldFN0cmluZ09mQXRvbShhdGFibGUsYXRvbSkpOworICAgICAgICAgICAgICAgIG1lc3NhZ2U9R2V0U3RyZnJvbVRTdHIoKTsKKyAgICAgICAgICAgICAgICBDUFBTaEluZm9Mb2dNc2cobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgUmVzZXRUU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdG9yZVN0cigiVG9vIG1hbnkgYXJncyBpbiBNYWNybyAiKTsKKyAgICAgICAgICAgIFN0b3JlU3RyKEdldFN0cmluZ09mQXRvbShhdGFibGUsYXRvbSkpOworICAgICAgICAgICAgbWVzc2FnZT1HZXRTdHJmcm9tVFN0cigpOworICAgICAgICAgICAgQ1BQU2hJbmZvTG9nTXNnKG1lc3NhZ2UpOworICAgICAgICAgICAgUmVzZXRUU3RyaW5nKCk7CisJCX0KKwkJZm9yIChpPTA7IGk8aW4tPm1hYy0+YXJnYzsgaSsrKSB7CisgICAgICAgICAgICBpbi0+YXJnc1tpXSA9IFByZXNjYW5NYWNyb0FyZyhpbi0+YXJnc1tpXSwgeXlsdmFscHApOworICAgICAgICB9CisgICAgfQorI2lmIDAKKyAgICBwcmludGYoIiAgPCVzOiVkPmZvdW5kIG1hY3JvICVzXG4iLCBHZXRBdG9tU3RyaW5nKGF0YWJsZSwgbG9jLmZpbGUpLAorICAgICAgICAgICBsb2MubGluZSwgR2V0QXRvbVN0cmluZyhhdGFibGUsIGF0b20pKTsKKyAgICBmb3IgKGk9MDsgaTxpbi0+bWFjLT5hcmdjOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCJcdGFyZyAlcyA9ICciLCBHZXRBdG9tU3RyaW5nKGF0YWJsZSwgaW4tPm1hYy0+YXJnc1tpXSkpOworICAgICAgICBEdW1wVG9rZW5TdHJlYW0oc3Rkb3V0LCBpbi0+YXJnc1tpXSk7CisgICAgICAgIHByaW50ZigiJ1xuIik7CisgICAgfQorI2VuZGlmCisJLypyZXRhaW4gdGhlIGlucHV0IHNvdXJjZSovCisgICAgaW4tPmJhc2UucHJldiA9IGNwcC0+Y3VycmVudElucHV0OworICAgIHN5bS0+ZGV0YWlscy5tYWMuYnVzeSA9IDE7CisgICAgUmV3aW5kVG9rZW5TdHJlYW0oc3ltLT5kZXRhaWxzLm1hYy5ib2R5KTsKKyAgICBjcHAtPmN1cnJlbnRJbnB1dCA9ICZpbi0+YmFzZTsKKyAgICByZXR1cm4gMTsKK30gLy8gTWFjcm9FeHBhbmQKKworaW50IENoa0NvcnJlY3RFbHNlTmVzdGluZyh2b2lkKQoreworICAgIC8vIHNhbml0eSBjaGVjayB0byBtYWtlIHN1cmUgZWxzZXRyYWNrZXIgaXMgaW4gYSB2YWxpZCByYW5nZQorICAgIGlmIChjcHAtPmVsc2V0cmFja2VyIDwgMCB8fCBjcHAtPmVsc2V0cmFja2VyID49IE1BWF9JRl9ORVNUSU5HKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChjcHAtPmVsc2VkZXB0aFtjcHAtPmVsc2V0cmFja2VyXSA9PSAwKSB7CisgICAgICAgIGNwcC0+ZWxzZWRlcHRoW2NwcC0+ZWxzZXRyYWNrZXJdID0gMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9jcHAuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9jcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjRjMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL2NwcC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorQ29weXJpZ2h0IChjKSAyMDAyLCBOVklESUEgQ29ycG9yYXRpb24uCisKK05WSURJQSBDb3Jwb3JhdGlvbigiTlZJRElBIikgc3VwcGxpZXMgdGhpcyBzb2Z0d2FyZSB0byB5b3UgaW4KK2NvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLAoraW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBOVklESUEgc29mdHdhcmUKK2NvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UKK3Rlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZSB0aGlzIE5WSURJQQorc29mdHdhcmUuCisKK0luIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kCitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zLCBOVklESUEgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlCitsaWNlbnNlLCB1bmRlciBOVklESUEncyBjb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgTlZJRElBIHNvZnR3YXJlICh0aGUKKyJOVklESUEgU29mdHdhcmUiKSwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZQorTlZJRElBIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkKK2Zvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIE5WSURJQSBTb2Z0d2FyZSwgeW91IG11c3QKK3JldGFpbiB0aGUgY29weXJpZ2h0IG5vdGljZSBvZiBOVklESUEsIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nCit0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIE5WSURJQSBTb2Z0d2FyZS4KK05laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3Mgbm9yIGxvZ29zIG9mIE5WSURJQQorQ29ycG9yYXRpb24gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUKK05WSURJQSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIE5WSURJQS4KK0V4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMKK2V4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgTlZJRElBIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QKK2xpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdCBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIgZGVyaXZhdGl2ZQord29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIE5WSURJQSBTb2Z0d2FyZSBtYXkgYmUKK2luY29ycG9yYXRlZC4gTm8gaGFyZHdhcmUgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAKKworVEhFIE5WSURJQSBTT0ZUV0FSRSBJUyBCRUlORyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsCitJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUgorSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEVJVEhFUiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIE9USEVSCitQUk9EVUNUUy4KKworSU4gTk8gRVZFTlQgU0hBTEwgTlZJRElBIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULAorSU5DSURFTlRBTCwgRVhFTVBMQVJZLCBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECitUTywgTE9TVCBQUk9GSVRTOyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCitVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgT1IgQVJJU0lORyBJTiBBTlkgV0FZCitPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUKK05WSURJQSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5EIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULAorVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIE9USEVSV0lTRSwgRVZFTiBJRgorTlZJRElBIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gY3BwLmgKKy8vCisKKyNpZiAhZGVmaW5lZChfX0NQUF9IKQorI2RlZmluZSBfX0NQUF9IIDEKKworI2luY2x1ZGUgImNvbXBpbGVyL3ByZXByb2Nlc3Nvci9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb21waWxlci9wcmVwcm9jZXNzb3IvdG9rZW5zLmgiCisKK2ludCBJbml0Q1BQKHZvaWQpOworaW50IEZpbmFsQ1BQKHZvaWQpOworaW50ICByZWFkQ1BQbGluZSh5eXN0eXBlcHAgKiB5eWx2YWxwcCk7CitpbnQgTWFjcm9FeHBhbmQoaW50IGF0b20sIHl5c3R5cGVwcCAqIHl5bHZhbHBwKTsKK2ludCBDaGtDb3JyZWN0RWxzZU5lc3Rpbmcodm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IE1hY3JvU3ltYm9sIHsKKyAgICBpbnQgYXJnYzsKKyAgICBpbnQgKmFyZ3M7CisgICAgVG9rZW5TdHJlYW0gKmJvZHk7CisgICAgdW5zaWduZWQgYnVzeToxOworICAgIHVuc2lnbmVkIHVuZGVmOjE7Cit9IE1hY3JvU3ltYm9sOworCit2b2lkIEZyZWVNYWNybyhNYWNyb1N5bWJvbCAqKTsKK3ZvaWQgUHJlZGVmaW5lSW50TWFjcm8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbHVlKTsKKwordm9pZCAgQ1BQRGVidWdMb2dNc2coY29uc3QgY2hhciAqbXNnKTsgICAgICAvLyBQcmludHMgaW5mb3JtYXRpb24gaW50byBkZWJ1ZyBsb2cKK3ZvaWQgIENQUFNoSW5mb0xvZ01zZyhjb25zdCBjaGFyKik7ICAgICAgICAgLy8gU3RvcmUgY3BwIEVyciBNc2cgaW50byBTaC5JbmZvLkxvZwordm9pZCAgQ1BQV2FybmluZ1RvSW5mb0xvZyhjb25zdCBjaGFyICptc2cpOyAvLyBQcmludHMgd2FybmluZyBtZXNzYWdlcyBpbnRvIGluZm8gbG9nCit2b2lkICBIYW5kbGVQcmFnbWEoY29uc3QgY2hhcioqLCBpbnQgbnVtVG9rZW5zKTsgIC8vICNwcmFnbWEgZGlyZWN0aXZlIGNvbnRhaW5lci4KK3ZvaWQgIFJlc2V0VFN0cmluZyh2b2lkKTsgICAgICAgICAgICAgICAgICAgLy8gI2Vycm9yIE1lc3NhZ2UgYXMgVFN0cmluZy4KK3ZvaWQgIENQUEVycm9yVG9JbmZvTG9nKGNoYXIqKTsgICAgICAgICAgICAgLy8gU3RpY2sgYWxsIGNwcCBlcnJvcnMgaW50byBTaC5JbmZvLmxvZyAgIC4KK3ZvaWQgIFN0b3JlU3RyKGNoYXIqKTsgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIFRTdHJpbmcgaW4gUGFyc2UgQ29udGV4dC4KK3ZvaWQgIFNldExpbmVOdW1iZXIoaW50KTsgICAgICAgICAgICAgICAgICAgLy8gU2V0IGxpbmUgbnVtYmVyLiAgCit2b2lkICBTZXRTdHJpbmdOdW1iZXIoaW50KTsgICAgICAgICAgICAgICAgIC8vIFNldCBzdHJpbmcgbnVtYmVyLiAgICAKK2ludCAgIEdldExpbmVOdW1iZXIodm9pZCk7ICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IFN0cmluZyBOdW1iZXIuIAoraW50ICAgR2V0U3RyaW5nTnVtYmVyKHZvaWQpOyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgU3RyaW5nIE51bWJlci4gCitjb25zdCBjaGFyKiBHZXRTdHJmcm9tVFN0cih2b2lkKTsgICAgICAgICAgIC8vIENvbnZlcnQgVFN0cmluZyB0byBTdHJpbmcuICAKK3ZvaWQgIHVwZGF0ZUV4dGVuc2lvbkJlaGF2aW9yKGNvbnN0IGNoYXIqIGV4dE5hbWUsIGNvbnN0IGNoYXIqIGJlaGF2aW9yKTsKK2ludCAgIEZyZWVDUFAodm9pZCk7CisKKyNlbmRpZiAvLyAhKGRlZmluZWQoX19DUFBfSCkKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9jcHBzdHJ1Y3QuYyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9jcHBzdHJ1Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGNmZjMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL2NwcHN0cnVjdC5jCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKK0NvcHlyaWdodCAoYykgMjAwMiwgTlZJRElBIENvcnBvcmF0aW9uLgorCitOVklESUEgQ29ycG9yYXRpb24oIk5WSURJQSIpIHN1cHBsaWVzIHRoaXMgc29mdHdhcmUgdG8geW91IGluCitjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwKK2luc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgTlZJRElBIHNvZnR3YXJlCitjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlCit0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBOVklESUEKK3NvZnR3YXJlLgorCitJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZAorc3ViamVjdCB0byB0aGVzZSB0ZXJtcywgTlZJRElBIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZQorbGljZW5zZSwgdW5kZXIgTlZJRElBJ3MgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIE5WSURJQSBzb2Z0d2FyZSAodGhlCisiTlZJRElBIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUKK05WSURJQSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Citmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBOVklESUEgU29mdHdhcmUsIHlvdSBtdXN0CityZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2Ugb2YgTlZJRElBLCB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwordGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBOVklESUEgU29mdHdhcmUuCitOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG5vciBsb2dvcyBvZiBOVklESUEKK0NvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCitOVklESUEgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOVklESUEuCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzCitleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IE5WSURJQSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUKK3dvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBOVklESUEgU29mdHdhcmUgbWF5IGJlCitpbmNvcnBvcmF0ZWQuIE5vIGhhcmR3YXJlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCisKK1RIRSBOVklESUEgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELAorSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IKK0lUUyBVU0UgQU5EIE9QRVJBVElPTiBFSVRIRVIgQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBPVEhFUgorUFJPRFVDVFMuCisKK0lOIE5PIEVWRU5UIFNIQUxMIE5WSURJQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIEVYRU1QTEFSWSwgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIExPU1QgUFJPRklUUzsgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIE9SIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFCitOVklESUEgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwKK1RPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYKK05WSURJQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIGNwcHN0cnVjdC5jCisvLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImNvbXBpbGVyL3ByZXByb2Nlc3Nvci9zbGdsb2JhbHMuaCIKKworQ1BQU3RydWN0ICAqY3BwICAgICAgPSBOVUxMOworc3RhdGljIGludCAgcmVmQ291bnQgPSAwOworCitpbnQgSW5pdFByZXByb2Nlc3Nvcih2b2lkKTsKK2ludCBSZXNldFByZXByb2Nlc3Nvcih2b2lkKTsKK2ludCBGcmVlQ1BQU3RydWN0KHZvaWQpOworaW50IEZpbmFsaXplUHJlcHJvY2Vzc29yKHZvaWQpOworCisvKgorICogSW5pdENQUFN0cnVjdCgpIC0gSW5pdGlsYWl6ZSB0aGUgQ1BQIHN0cnVjdHVyZS4KKyAqCisgKi8KKworaW50IEluaXRDUFBTdHJ1Y3Qodm9pZCkKK3sKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnA7CisKKyAgICBjcHAgPSAoQ1BQU3RydWN0ICopIG1hbGxvYyhzaXplb2YoQ1BQU3RydWN0KSk7CisgICAgaWYgKGNwcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJlZkNvdW50Kys7CisKKyAgICAvLyBJbml0aWFsaXplIHB1YmxpYyBtZW1iZXJzOgorICAgIGNwcC0+cExhc3RTb3VyY2VMb2MgPSAmY3BwLT5sYXN0U291cmNlTG9jOworICAgIAorCXAgPSAoY2hhciAqKSAmY3BwLT5vcHRpb25zOworICAgIGxlbiA9IHNpemVvZihjcHAtPm9wdGlvbnMpOworICAgIHdoaWxlICgtLWxlbiA+PSAwKQorICAgICAgICBwW2xlbl0gPSAwOworICAgICAKKyAgICBSZXNldFByZXByb2Nlc3NvcigpOworICAgIHJldHVybiAxOworfSAvLyBJbml0Q1BQU3RydWN0CisKK2ludCBSZXNldFByZXByb2Nlc3Nvcih2b2lkKQoreworICAgIC8vIEluaXRpYWxpemUgcHJpdmF0ZSBtZW1iZXJzOgorCisgICAgY3BwLT5sYXN0U291cmNlTG9jLmZpbGUgPSAwOworICAgIGNwcC0+bGFzdFNvdXJjZUxvYy5saW5lID0gMDsKKyAgICBjcHAtPnBDID0gMDsKKyAgICBjcHAtPkNvbXBpbGVFcnJvciA9IDA7CisgICAgY3BwLT5pZmRlcHRoID0gMDsKKyAgICBmb3IoY3BwLT5lbHNldHJhY2tlciA9IDA7IGNwcC0+ZWxzZXRyYWNrZXIgPCBNQVhfSUZfTkVTVElORzsgY3BwLT5lbHNldHJhY2tlcisrKQorICAgICAgICBjcHAtPmVsc2VkZXB0aFtjcHAtPmVsc2V0cmFja2VyXSA9IDA7CisgICAgY3BwLT5lbHNldHJhY2tlciA9IDA7CisgICAgY3BwLT50b2tlbnNCZWZvcmVFT0YgPSAwOworICAgIHJldHVybiAxOworfQorCisvL0ludGlhbGl6aW5nIHRoZSBQcmVwcm9jZXNzb3IuCisKK2ludCBJbml0UHJlcHJvY2Vzc29yKHZvaWQpCit7CisgICAjICBkZWZpbmUgQ1BQX1NUVUZGIHRydWUKKyAgICAgICAgIyAgaWZkZWYgQ1BQX1NUVUZGCisgICAgICAgICAgICBGcmVlQ1BQU3RydWN0KCk7CisgICAgICAgICAgICBJbml0Q1BQU3RydWN0KCk7CisgICAgICAgICAgICBjcHAtPm9wdGlvbnMuUXVpZXQgPSAxOworICAgICAgICAgICAgY3BwLT5vcHRpb25zLnByb2ZpbGVTdHJpbmcgPSAiZ2VuZXJpYyI7CisgICAgICAgICAgICBpZiAoIUluaXRBdG9tVGFibGUoYXRhYmxlLCAwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGlmICghSW5pdFNjYW5uZXIoY3BwKSkKKwkgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAjICBlbmRpZgorICByZXR1cm4gMDsgCit9CisKKy8vRnJlZUNQUFN0cnVjdCgpIC0gRnJlZSB0aGUgQ1BQIHN0cnVjdHVyZS4KKworaW50IEZyZWVDUFBTdHJ1Y3Qodm9pZCkKK3sKKyAgICBpZiAocmVmQ291bnQpCisgICAgeworICAgICAgIGZyZWUoY3BwKTsKKyAgICAgICByZWZDb3VudC0tOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gMTsKK30KKworLy9GaW5hbGl6aW5nIHRoZSBQcmVwcm9jZXNzb3IuCisKK2ludCBGaW5hbGl6ZVByZXByb2Nlc3Nvcih2b2lkKQoreworICAgIyAgZGVmaW5lIENQUF9TVFVGRiB0cnVlCisgICAgICAgICMgIGlmZGVmIENQUF9TVFVGRgorICAgICAgICAgICAgRnJlZUF0b21UYWJsZShhdGFibGUpOworICAgICAgICAgICAgRnJlZUNQUFN0cnVjdCgpOworICAgICAgICAgICAgRnJlZVNjYW5uZXIoKTsKKyAgICAgICAjICBlbmRpZgorICByZXR1cm4gMDsgCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEVuZCBvZiBjcHBzdHJ1Y3QuYyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9tZW1vcnkuYyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmZlYTdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL21lbW9yeS5jCkBAIC0wLDAgKzEsMTU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKK0NvcHlyaWdodCAoYykgMjAwMiwgTlZJRElBIENvcnBvcmF0aW9uLgorCitOVklESUEgQ29ycG9yYXRpb24oIk5WSURJQSIpIHN1cHBsaWVzIHRoaXMgc29mdHdhcmUgdG8geW91IGluCitjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwKK2luc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgTlZJRElBIHNvZnR3YXJlCitjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlCit0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBOVklESUEKK3NvZnR3YXJlLgorCitJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZAorc3ViamVjdCB0byB0aGVzZSB0ZXJtcywgTlZJRElBIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZQorbGljZW5zZSwgdW5kZXIgTlZJRElBJ3MgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIE5WSURJQSBzb2Z0d2FyZSAodGhlCisiTlZJRElBIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUKK05WSURJQSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Citmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBOVklESUEgU29mdHdhcmUsIHlvdSBtdXN0CityZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2Ugb2YgTlZJRElBLCB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwordGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBOVklESUEgU29mdHdhcmUuCitOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG5vciBsb2dvcyBvZiBOVklESUEKK0NvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCitOVklESUEgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOVklESUEuCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzCitleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IE5WSURJQSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUKK3dvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBOVklESUEgU29mdHdhcmUgbWF5IGJlCitpbmNvcnBvcmF0ZWQuIE5vIGhhcmR3YXJlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCisKK1RIRSBOVklESUEgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELAorSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IKK0lUUyBVU0UgQU5EIE9QRVJBVElPTiBFSVRIRVIgQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBPVEhFUgorUFJPRFVDVFMuCisKK0lOIE5PIEVWRU5UIFNIQUxMIE5WSURJQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIEVYRU1QTEFSWSwgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIExPU1QgUFJPRklUUzsgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIE9SIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFCitOVklESUEgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwKK1RPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYKK05WSURJQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJjb21waWxlci9wcmVwcm9jZXNzb3IvbWVtb3J5LmgiCisKKy8vIGRlZmF1bHQgYWxpZ25tZW50IGFuZCBjaHVua3NpemUsIGlmIGNhbGxlZCB3aXRoIDAgYXJndW1lbnRzCisjZGVmaW5lIENIVU5LU0laRSAgICAgICAoNjQqMTAyNCkKKyNkZWZpbmUgQUxJR04gICAgICAgICAgIDgKKworLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBgcmVhbCcgbWFsbG9jIGFuZCBmcmVlLCBub3Qgb3VyIHJlcGxhY2VtZW50cworI3VuZGVmIG1hbGxvYworI3VuZGVmIGZyZWUKKworc3RydWN0IGNodW5rIHsKKyAgICBzdHJ1Y3QgY2h1bmsgICAgICAgICpuZXh0OworfTsKKworc3RydWN0IGNsZWFudXAgeworICAgIHN0cnVjdCBjbGVhbnVwICAgICAgKm5leHQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAoKmZuKSh2b2lkICopOworICAgIHZvaWQgICAgICAgICAgICAgICAgKmFyZzsKK307CisKK3N0cnVjdCBNZW1vcnlQb29sX3JlYyB7CisgICAgc3RydWN0IGNodW5rICAgICAgICAqbmV4dDsKKyAgICB1aW50cHRyX3QgICAgICAgICAgIGZyZWUsIGVuZDsKKyAgICBzaXplX3QgICAgICAgICAgICAgIGNodW5rc2l6ZTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgIGFsaWdubWFzazsKKyAgICBzdHJ1Y3QgY2xlYW51cCAgICAgICpjbGVhbnVwOworfTsKKworTWVtb3J5UG9vbCAqbWVtX0NyZWF0ZVBvb2woc2l6ZV90IGNodW5rc2l6ZSwgdW5zaWduZWQgaW50IGFsaWduKQoreworICAgIE1lbW9yeVBvb2wgICpwb29sOworCisgICAgaWYgKGFsaWduID09IDApIGFsaWduID0gQUxJR047CisgICAgaWYgKGNodW5rc2l6ZSA9PSAwKSBjaHVua3NpemUgPSBDSFVOS1NJWkU7CisgICAgaWYgKGFsaWduICYgKGFsaWduLTEpKSByZXR1cm4gMDsKKyAgICBpZiAoY2h1bmtzaXplIDwgc2l6ZW9mKE1lbW9yeVBvb2wpKSByZXR1cm4gMDsKKyAgICBpZiAoY2h1bmtzaXplICYgKGFsaWduLTEpKSByZXR1cm4gMDsKKyAgICBpZiAoIShwb29sID0gbWFsbG9jKGNodW5rc2l6ZSkpKSByZXR1cm4gMDsKKyAgICBwb29sLT5uZXh0ID0gMDsKKyAgICBwb29sLT5jaHVua3NpemUgPSBjaHVua3NpemU7CisgICAgcG9vbC0+YWxpZ25tYXNrID0gKHVpbnRwdHJfdCkoYWxpZ24pLTE7ICAKKyAgICBwb29sLT5mcmVlID0gKCh1aW50cHRyX3QpKHBvb2wgKyAxKSArIHBvb2wtPmFsaWdubWFzaykgJiB+cG9vbC0+YWxpZ25tYXNrOworICAgIHBvb2wtPmVuZCA9ICh1aW50cHRyX3QpcG9vbCArIGNodW5rc2l6ZTsKKyAgICBwb29sLT5jbGVhbnVwID0gMDsKKyAgICByZXR1cm4gcG9vbDsKK30KKwordm9pZCBtZW1fRnJlZVBvb2woTWVtb3J5UG9vbCAqcG9vbCkKK3sKKyAgICBzdHJ1Y3QgY2xlYW51cCAgICAgICpjbGVhbnVwOworICAgIHN0cnVjdCBjaHVuayAgICAgICAgKnAsICpuZXh0OworCisgICAgZm9yIChjbGVhbnVwID0gcG9vbC0+Y2xlYW51cDsgY2xlYW51cDsgY2xlYW51cCA9IGNsZWFudXAtPm5leHQpIHsKKyAgICAgICAgY2xlYW51cC0+Zm4oY2xlYW51cC0+YXJnKTsKKyAgICB9CisgICAgZm9yIChwID0gKHN0cnVjdCBjaHVuayAqKXBvb2w7IHA7IHAgPSBuZXh0KSB7CisgICAgICAgIG5leHQgPSBwLT5uZXh0OworICAgICAgICBmcmVlKHApOworICAgIH0KK30KKwordm9pZCAqbWVtX0FsbG9jKE1lbW9yeVBvb2wgKnBvb2wsIHNpemVfdCBzaXplKQoreworICAgIHN0cnVjdCBjaHVuayAqY2g7CisgICAgdm9pZCAqcnYgPSAodm9pZCAqKXBvb2wtPmZyZWU7CisgICAgc2l6ZSA9IChzaXplICsgcG9vbC0+YWxpZ25tYXNrKSAmIH5wb29sLT5hbGlnbm1hc2s7CisgICAgaWYgKHNpemUgPD0gMCkgc2l6ZSA9IHBvb2wtPmFsaWdubWFzazsKKyAgICBwb29sLT5mcmVlICs9IHNpemU7CisgICAgaWYgKHBvb2wtPmZyZWUgPiBwb29sLT5lbmQgfHwgcG9vbC0+ZnJlZSA8ICh1aW50cHRyX3QpcnYpIHsKKyAgICAgICAgc2l6ZV90IG1pbnJlcSA9IChzaXplICsgc2l6ZW9mKHN0cnVjdCBjaHVuaykgKyBwb29sLT5hbGlnbm1hc2spCisgICAgICAgICAgICAgICAgICAgICAgJiB+cG9vbC0+YWxpZ25tYXNrOworICAgICAgICBwb29sLT5mcmVlID0gKHVpbnRwdHJfdClydjsKKyAgICAgICAgaWYgKG1pbnJlcSA+PSBwb29sLT5jaHVua3NpemUpIHsKKyAgICAgICAgICAgIC8vIHJlcXVlc3Qgc2l6ZSBpcyB0b28gYmlnIGZvciB0aGUgY2h1bmtzaXplLCBzbyBhbGxvY2F0ZSBpdCBhcworICAgICAgICAgICAgLy8gYSBzaW5nbGUgY2h1bmsgb2YgdGhlIHJpZ2h0IHNpemUKKyAgICAgICAgICAgIGNoID0gbWFsbG9jKG1pbnJlcSk7CisgICAgICAgICAgICBpZiAoIWNoKSByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoID0gbWFsbG9jKHBvb2wtPmNodW5rc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWNoKSByZXR1cm4gMDsKKyAgICAgICAgICAgIHBvb2wtPmZyZWUgPSAodWludHB0cl90KWNoICsgbWlucmVxOworICAgICAgICAgICAgcG9vbC0+ZW5kID0gKHVpbnRwdHJfdCljaCArIHBvb2wtPmNodW5rc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBjaC0+bmV4dCA9IHBvb2wtPm5leHQ7CisgICAgICAgIHBvb2wtPm5leHQgPSBjaDsKKyAgICAgICAgcnYgPSAodm9pZCAqKSgoKHVpbnRwdHJfdCkoY2grMSkgKyBwb29sLT5hbGlnbm1hc2spICYgfnBvb2wtPmFsaWdubWFzayk7CisgICAgfQorICAgIHJldHVybiBydjsKK30KKworaW50IG1lbV9BZGRDbGVhbnVwKE1lbW9yeVBvb2wgKnBvb2wsIHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnKSB7CisgICAgc3RydWN0IGNsZWFudXAgKmNsZWFudXA7CisKKyAgICBwb29sLT5mcmVlID0gKHBvb2wtPmZyZWUgKyBzaXplb2Yodm9pZCAqKSAtIDEpICYgfihzaXplb2Yodm9pZCAqKS0xKTsKKyAgICBjbGVhbnVwID0gbWVtX0FsbG9jKHBvb2wsIHNpemVvZihzdHJ1Y3QgY2xlYW51cCkpOworICAgIGlmICghY2xlYW51cCkgcmV0dXJuIC0xOworICAgIGNsZWFudXAtPm5leHQgPSBwb29sLT5jbGVhbnVwOworICAgIGNsZWFudXAtPmZuID0gZm47CisgICAgY2xlYW51cC0+YXJnID0gYXJnOworICAgIHBvb2wtPmNsZWFudXAgPSBjbGVhbnVwOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL21lbW9yeS5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL21lbW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWUyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvbWVtb3J5LmgKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCitDb3B5cmlnaHQgKGMpIDIwMDIsIE5WSURJQSBDb3Jwb3JhdGlvbi4KKworTlZJRElBIENvcnBvcmF0aW9uKCJOVklESUEiKSBzdXBwbGllcyB0aGlzIHNvZnR3YXJlIHRvIHlvdSBpbgorY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsCitpbnN0YWxsYXRpb24sIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIE5WSURJQSBzb2Z0d2FyZQorY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcy4gIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGVzZQordGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgcmVkaXN0cmlidXRlIHRoaXMgTlZJRElBCitzb2Z0d2FyZS4KKworSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMsIE5WSURJQSBncmFudHMgeW91IGEgcGVyc29uYWwsIG5vbi1leGNsdXNpdmUKK2xpY2Vuc2UsIHVuZGVyIE5WSURJQSdzIGNvcHlyaWdodHMgaW4gdGhpcyBvcmlnaW5hbCBOVklESUEgc29mdHdhcmUgKHRoZQorIk5WSURJQSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgdGhlCitOVklESUEgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeQorZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTlZJRElBIFNvZnR3YXJlLCB5b3UgbXVzdAorcmV0YWluIHRoZSBjb3B5cmlnaHQgbm90aWNlIG9mIE5WSURJQSwgdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcKK3RleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbCBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgTlZJRElBIFNvZnR3YXJlLgorTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcyBub3IgbG9nb3Mgb2YgTlZJRElBCitDb3Jwb3JhdGlvbiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoZQorTlZJRElBIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gTlZJRElBLgorRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcworZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBOVklESUEgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdAorbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0IG1heSBiZSBpbmZyaW5nZWQgYnkgeW91ciBkZXJpdmF0aXZlCit3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgTlZJRElBIFNvZnR3YXJlIG1heSBiZQoraW5jb3Jwb3JhdGVkLiBObyBoYXJkd2FyZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuIAorCitUSEUgTlZJRElBIFNPRlRXQVJFIElTIEJFSU5HIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwKK0lOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKK05PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SCitJVFMgVVNFIEFORCBPUEVSQVRJT04gRUlUSEVSIEFMT05FIE9SIElOIENPTUJJTkFUSU9OIFdJVEggT1RIRVIKK1BST0RVQ1RTLgorCitJTiBOTyBFVkVOVCBTSEFMTCBOVklESUEgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBFWEVNUExBUlksIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKK1RPLCBMT1NUIFBST0ZJVFM7IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKK1VTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBPUiBBUklTSU5HIElOIEFOWSBXQVkKK09VVCBPRiBUSEUgVVNFLCBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBBTkQvT1IgRElTVFJJQlVUSU9OIE9GIFRIRQorTlZJRElBIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsCitUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IgT1RIRVJXSVNFLCBFVkVOIElGCitOVklESUEgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisjaWZuZGVmIF9fTUVNT1JZX0gKKyNkZWZpbmUgX19NRU1PUllfSAorCit0eXBlZGVmIHN0cnVjdCBNZW1vcnlQb29sX3JlYyBNZW1vcnlQb29sOworCitleHRlcm4gTWVtb3J5UG9vbCAqbWVtX0NyZWF0ZVBvb2woc2l6ZV90IGNodW5rc2l6ZSwgdW5zaWduZWQgaW50IGFsaWduKTsKK2V4dGVybiB2b2lkIG1lbV9GcmVlUG9vbChNZW1vcnlQb29sICopOworZXh0ZXJuIHZvaWQgKm1lbV9BbGxvYyhNZW1vcnlQb29sICpwLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAqbWVtX1JlYWxsb2MoTWVtb3J5UG9vbCAqcCwgdm9pZCAqb2xkLCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IG5ld3NpemUpOworZXh0ZXJuIGludCBtZW1fQWRkQ2xlYW51cChNZW1vcnlQb29sICpwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZyk7CisKKyNlbmRpZiAvKiBfX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvcGFyc2VyLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3MzQyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9wYXJzZXIuaApAQCAtMCwwICsxLDkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKK0NvcHlyaWdodCAoYykgMjAwMiwgTlZJRElBIENvcnBvcmF0aW9uLgorCitOVklESUEgQ29ycG9yYXRpb24oIk5WSURJQSIpIHN1cHBsaWVzIHRoaXMgc29mdHdhcmUgdG8geW91IGluCitjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwKK2luc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgTlZJRElBIHNvZnR3YXJlCitjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlCit0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBOVklESUEKK3NvZnR3YXJlLgorCitJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZAorc3ViamVjdCB0byB0aGVzZSB0ZXJtcywgTlZJRElBIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZQorbGljZW5zZSwgdW5kZXIgTlZJRElBJ3MgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIE5WSURJQSBzb2Z0d2FyZSAodGhlCisiTlZJRElBIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUKK05WSURJQSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Citmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBOVklESUEgU29mdHdhcmUsIHlvdSBtdXN0CityZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2Ugb2YgTlZJRElBLCB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwordGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBOVklESUEgU29mdHdhcmUuCitOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG5vciBsb2dvcyBvZiBOVklESUEKK0NvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCitOVklESUEgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOVklESUEuCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzCitleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IE5WSURJQSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUKK3dvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBOVklESUEgU29mdHdhcmUgbWF5IGJlCitpbmNvcnBvcmF0ZWQuIE5vIGhhcmR3YXJlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCisKK1RIRSBOVklESUEgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELAorSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IKK0lUUyBVU0UgQU5EIE9QRVJBVElPTiBFSVRIRVIgQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBPVEhFUgorUFJPRFVDVFMuCisKK0lOIE5PIEVWRU5UIFNIQUxMIE5WSURJQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIEVYRU1QTEFSWSwgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIExPU1QgUFJPRklUUzsgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIE9SIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFCitOVklESUEgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwKK1RPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYKK05WSURJQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJJU09OX1BBUlNFUl9ICisjIGRlZmluZSBCSVNPTl9QQVJTRVJfSAorCisjaWZuZGVmIHl5c3R5cGVwcAordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICBzY19pbnQ7CisgICAgZmxvYXQgIHNjX2Z2YWw7CisgICAgaW50ICAgIHNjX2lkZW50OworCWNoYXIgICBzeW1ib2xfbmFtZVtNQVhfU1lNQk9MX05BTUVfTEVOKzFdOworfSB5eXN0eXBlcHA7CisKKyMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCisjZW5kaWYKKyMgZGVmaW5lCUNQUF9BTkRfT1AJICAgICAgICAyNTcKKyMgZGVmaW5lCUNQUF9TVUJfQVNTSUdOCSAgICAyNTkKKyMgZGVmaW5lCUNQUF9NT0RfQVNTSUdOCSAgICAyNjAKKyMgZGVmaW5lCUNQUF9BRERfQVNTSUdOCTI2MQorIyBkZWZpbmUJQ1BQX0RJVl9BU1NJR04JMjYyCisjIGRlZmluZQlDUFBfTVVMX0FTU0lHTgkyNjMKKyMgZGVmaW5lCUNQUF9FUV9PUAkgICAgICAgIDI2NAorIyBkZWZpbmUgICAgQ1BQX1hPUl9PUCAgICAgICAgIDI2NSAKKyMgZGVmaW5lCUVSUk9SX1NZCSAgICAyNjYKKyMgZGVmaW5lCUNQUF9GTE9BVENPTlNUQU5UCTI2NworIyBkZWZpbmUJQ1BQX0dFX09QCSAgICAgICAgMjY4CisjIGRlZmluZQlDUFBfUklHSFRfT1AgICAgICAgIDI2OQorIyBkZWZpbmUJQ1BQX0lERU5USUZJRVIJICAgIDI3MAorIyBkZWZpbmUJQ1BQX0lOVENPTlNUQU5UCSAgICAyNzEKKyMgZGVmaW5lCUNQUF9MRV9PUAkgICAgICAgIDI3MgorIyBkZWZpbmUJQ1BQX0xFRlRfT1AJICAgICAgICAyNzMKKyMgZGVmaW5lCUNQUF9ERUNfT1AJMjc0CisjIGRlZmluZQlDUFBfTkVfT1AJICAgICAgICAyNzUKKyMgZGVmaW5lCUNQUF9PUl9PUAkgICAgICAgIDI3NgorIyBkZWZpbmUJQ1BQX0lOQ19PUAkgICAgMjc3CisjIGRlZmluZQlDUFBfU1RSQ09OU1RBTlQJICAgIDI3OAorIyBkZWZpbmUJQ1BQX1RZUEVJREVOVElGSUVSCTI3OQorCisjIGRlZmluZQlGSVJTVF9VU0VSX1RPS0VOX1NZCTI4OQorCisjIGRlZmluZQlDUFBfUklHSFRfQVNTSUdOCSAgICAyODAKKyMgZGVmaW5lCUNQUF9MRUZUX0FTU0lHTgkgICAgMjgxCisjIGRlZmluZQlDUFBfQU5EX0FTU0lHTgkyODIKKyMgZGVmaW5lCUNQUF9PUl9BU1NJR04gIAkyODMKKyMgZGVmaW5lCUNQUF9YT1JfQVNTSUdOCTI4NAorIyBkZWZpbmUJQ1BQX0xFRlRfQlJBQ0tFVAkyODUKKyMgZGVmaW5lCUNQUF9SSUdIVF9CUkFDS0VUCTI4NgorIyBkZWZpbmUJQ1BQX0xFRlRfQlJBQ0UJMjg3CisjIGRlZmluZQlDUFBfUklHSFRfQlJBQ0UJMjg4CisKKyNlbmRpZiAvKiBub3QgQklTT05fUEFSU0VSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9wcmVwcm9jZXNzLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvcHJlcHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDE5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvcHJlcHJvY2Vzcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorQ29weXJpZ2h0IChjKSAyMDAyLCBOVklESUEgQ29ycG9yYXRpb24uCisKK05WSURJQSBDb3Jwb3JhdGlvbigiTlZJRElBIikgc3VwcGxpZXMgdGhpcyBzb2Z0d2FyZSB0byB5b3UgaW4KK2NvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLAoraW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBOVklESUEgc29mdHdhcmUKK2NvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UKK3Rlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZSB0aGlzIE5WSURJQQorc29mdHdhcmUuCisKK0luIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kCitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zLCBOVklESUEgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlCitsaWNlbnNlLCB1bmRlciBOVklESUEncyBjb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgTlZJRElBIHNvZnR3YXJlICh0aGUKKyJOVklESUEgU29mdHdhcmUiKSwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZQorTlZJRElBIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkKK2Zvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIE5WSURJQSBTb2Z0d2FyZSwgeW91IG11c3QKK3JldGFpbiB0aGUgY29weXJpZ2h0IG5vdGljZSBvZiBOVklESUEsIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nCit0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIE5WSURJQSBTb2Z0d2FyZS4KK05laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3Mgbm9yIGxvZ29zIG9mIE5WSURJQQorQ29ycG9yYXRpb24gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUKK05WSURJQSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIE5WSURJQS4KK0V4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMKK2V4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgTlZJRElBIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QKK2xpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdCBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIgZGVyaXZhdGl2ZQord29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIE5WSURJQSBTb2Z0d2FyZSBtYXkgYmUKK2luY29ycG9yYXRlZC4gTm8gaGFyZHdhcmUgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAKKworVEhFIE5WSURJQSBTT0ZUV0FSRSBJUyBCRUlORyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsCitJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUgorSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEVJVEhFUiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIE9USEVSCitQUk9EVUNUUy4KKworSU4gTk8gRVZFTlQgU0hBTEwgTlZJRElBIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULAorSU5DSURFTlRBTCwgRVhFTVBMQVJZLCBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECitUTywgTE9TVCBQUk9GSVRTOyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCitVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgT1IgQVJJU0lORyBJTiBBTlkgV0FZCitPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUKK05WSURJQSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5EIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULAorVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIE9USEVSV0lTRSwgRVZFTiBJRgorTlZJRElBIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjb21waWxlci9wcmVwcm9jZXNzb3Ivc2xnbG9iYWxzLmgiCitleHRlcm4gQ1BQU3RydWN0ICpjcHA7CitpbnQgSW5pdENQUFN0cnVjdCh2b2lkKTsKK2ludCBJbml0U2Nhbm5lcihDUFBTdHJ1Y3QgKmNwcCk7CitpbnQgSW5pdEF0b21UYWJsZShBdG9tVGFibGUgKmF0YWJsZSwgaW50IGh0c2l6ZSk7CitpbnQgU2NhbkZyb21TdHJpbmcoY29uc3QgY2hhciAqcyk7CitjaGFyKiBHZXRTdHJpbmdPZkF0b20oQXRvbVRhYmxlICphdGFibGUsIGludCBhdG9tKTsKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9zY2FubmVyLmMgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3Ivc2Nhbm5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWRiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3Ivc2Nhbm5lci5jCkBAIC0wLDAgKzEsNjg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKK0NvcHlyaWdodCAoYykgMjAwMiwgTlZJRElBIENvcnBvcmF0aW9uLgorCitOVklESUEgQ29ycG9yYXRpb24oIk5WSURJQSIpIHN1cHBsaWVzIHRoaXMgc29mdHdhcmUgdG8geW91IGluCitjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwKK2luc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgTlZJRElBIHNvZnR3YXJlCitjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlCit0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBOVklESUEKK3NvZnR3YXJlLgorCitJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZAorc3ViamVjdCB0byB0aGVzZSB0ZXJtcywgTlZJRElBIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZQorbGljZW5zZSwgdW5kZXIgTlZJRElBJ3MgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIE5WSURJQSBzb2Z0d2FyZSAodGhlCisiTlZJRElBIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUKK05WSURJQSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Citmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBOVklESUEgU29mdHdhcmUsIHlvdSBtdXN0CityZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2Ugb2YgTlZJRElBLCB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwordGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBOVklESUEgU29mdHdhcmUuCitOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG5vciBsb2dvcyBvZiBOVklESUEKK0NvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCitOVklESUEgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOVklESUEuCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzCitleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IE5WSURJQSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUKK3dvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBOVklESUEgU29mdHdhcmUgbWF5IGJlCitpbmNvcnBvcmF0ZWQuIE5vIGhhcmR3YXJlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCisKK1RIRSBOVklESUEgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELAorSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IKK0lUUyBVU0UgQU5EIE9QRVJBVElPTiBFSVRIRVIgQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBPVEhFUgorUFJPRFVDVFMuCisKK0lOIE5PIEVWRU5UIFNIQUxMIE5WSURJQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIEVYRU1QTEFSWSwgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIExPU1QgUFJPRklUUzsgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIE9SIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFCitOVklESUEgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwKK1RPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYKK05WSURJQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIHNjYW5uZXIuYworLy8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiAwCisgICAgI2luY2x1ZGUgPGllZWVmcC5oPgorI2Vsc2UKKyAgICAjZGVmaW5lIGlzaW5mZih4KSAoKCgqKGludCAqKSYoeCkgJiAweDdmODAwMDAwTCk9PTB4N2Y4MDAwMDBMKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICgoKihpbnQgKikmKHgpICYgMHgwMDdmZmZmZkwpPT0wMDAwMDAwMDAwTCkpCisjZW5kaWYKKworI2luY2x1ZGUgImNvbXBpbGVyL3ByZXByb2Nlc3Nvci9zbGdsb2JhbHMuaCIKKyNpbmNsdWRlICJjb21waWxlci91dGlsLmgiCisKK3R5cGVkZWYgc3RydWN0IFN0cmluZ0lucHV0U3JjIHsKKyAgICBJbnB1dFNyYyBiYXNlOworICAgIGNoYXIgKnA7Cit9IFN0cmluZ0lucHV0U3JjOworCitzdGF0aWMgaW50IGVvZl9zY2FuKElucHV0U3JjICppcywgeXlzdHlwZXBwICogeXlsdmFscHApCit7CisgICAgcmV0dXJuIEVPRjsKK30gLy8gZW9mX3NjYW4KKworc3RhdGljIHZvaWQgbm9vcChJbnB1dFNyYyAqaW4sIGludCBjaCwgeXlzdHlwZXBwICogeXlsdmFscHApIHt9CisKK3N0YXRpYyBJbnB1dFNyYyBlb2ZfaW5wdXRzcmMgPSB7IDAsICZlb2Zfc2NhbiwgJmVvZl9zY2FuLCAmbm9vcCB9OworCitzdGF0aWMgaW50IGJ5dGVfc2NhbihJbnB1dFNyYyAqLCB5eXN0eXBlcHAgKiB5eWx2YWxwcCk7CisKKyNkZWZpbmUgRU9MX1NZICdcbicKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisgICAgI2RlZmluZSBEQkdfQlJFQUtQT0lOVCgpIF9fYXNtIGludCAzCisjZWxpZiBkZWZpbmVkKF9NX0FNRDY0KQorICAgICNkZWZpbmUgREJHX0JSRUFLUE9JTlQoKSBhc3NlcnQoISJEYmdfQnJlYWtwb2ludCIpOworI2Vsc2UKKyAgICAjZGVmaW5lIERCR19CUkVBS1BPSU5UKCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX01fQU1ENjQpCisgICAgX19pbnQ2NCBSRFRTQyAoIHZvaWQgKSB7CisKKyAgICAgICAgX19pbnQ2NCB2OworICAgIAorICAgICAgICBfX2FzbSBfX2VtaXQgMHgwZgorICAgICAgICBfX2FzbSBfX2VtaXQgMHgzMQorICAgICAgICBfX2FzbSBtb3YgZHdvcmQgcHRyIHYsIGVheAorICAgICAgICBfX2FzbSBtb3YgZHdvcmQgcHRyIHYrNCwgZWR4CisgICAgCisgICAgICAgIHJldHVybiB2OworICAgIH0KKyNlbmRpZgorCisKK2ludCBJbml0U2Nhbm5lcihDUFBTdHJ1Y3QgKmNwcCkKK3sKKyAgICAvLyBBZGQgdmFyaW91cyBhdG9tcyBuZWVkZWQgYnkgdGhlIENQUCBsaW5lIHNjYW5uZXI6CisgICAgaWYgKCFJbml0Q1BQKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgY3BwLT5tb3N0UmVjZW50VG9rZW4gPSAwOworICAgIGNwcC0+dG9rZW5Mb2MgPSAmY3BwLT5sdG9rZW5Mb2M7CisKKyAgICBjcHAtPmx0b2tlbkxvYy5maWxlID0gMDsKKyAgICBjcHAtPmx0b2tlbkxvYy5saW5lID0gMDsKKworICAgIGNwcC0+Y3VycmVudElucHV0ID0gJmVvZl9pbnB1dHNyYzsKKyAgICBjcHAtPnByZXZpb3VzX3Rva2VuID0gJ1xuJzsKKyAgICBjcHAtPnBhc3RGaXJzdFN0YXRlbWVudCA9IDA7CisKKyAgICByZXR1cm4gMTsKK30gLy8gSW5pdFNjYW5uZXIKKworaW50IEZyZWVTY2FubmVyKHZvaWQpCit7CisgICAgcmV0dXJuIChGcmVlQ1BQKCkpOworfQorCisvKgorICogc3RyX2dldGNoKCkKKyAqIHRha2VzIGNhcmUgb2YgcmVhZGluZyBmcm9tIG11bHRpcGxlIHN0cmluZ3MuCisgKiByZXR1cm5zIHRoZSBuZXh0LWNoYXIgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICogcmV0dXJucyBFT0Ygd2hlbiB0aGUgY29tcGxldGUgc2hhZGVyIGlzIHBhcnNlZC4KKyAqLworc3RhdGljIGludCBzdHJfZ2V0Y2goU3RyaW5nSW5wdXRTcmMgKmluKQoreworICAgIGZvcig7Oyl7CisgICAgICAgaWYgKCppbi0+cCl7CisgICAgICAgICAgaWYgKCppbi0+cCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgaW4tPmJhc2UubGluZSsrOworICAgICAgICAgICAgIEluY0xpbmVOdW1iZXIoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuICppbi0+cCsrOworICAgICAgIH0KKyAgICAgICBpZigrKyhjcHAtPlBhV2hpY2hTdHIpIDwgY3BwLT5QYUFyZ2MpeworICAgICAgICAgIGZyZWUoaW4pOworICAgICAgICAgIFNldFN0cmluZ051bWJlcihjcHAtPlBhV2hpY2hTdHIpOworICAgICAgICAgIFNldExpbmVOdW1iZXIoMSk7CisgICAgICAgICAgU2NhbkZyb21TdHJpbmcoY3BwLT5QYUFyZ3ZbY3BwLT5QYVdoaWNoU3RyXSk7CisgICAgICAgICAgaW49KFN0cmluZ0lucHV0U3JjKiljcHAtPmN1cnJlbnRJbnB1dDsKKyAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgCisgICAgICAgfQorICAgICAgIGVsc2V7CisgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQgPSBpbi0+YmFzZS5wcmV2OworICAgICAgICAgIGNwcC0+UGFXaGljaFN0cj0wOworICAgICAgICAgIGZyZWUoaW4pOworICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgfSAgCisgICAgfQorfSAvLyBzdHJfZ2V0Y2gKKworc3RhdGljIHZvaWQgc3RyX3VuZ2V0Y2goU3RyaW5nSW5wdXRTcmMgKmluLCBpbnQgY2gsIHl5c3R5cGVwcCAqdHlwZSkgeworICAgIGlmIChpbi0+cFstMV0gPT0gY2gpaW4tPnAtLTsKKyAgICBlbHNlIHsKKyAgICAgICAgKihpbi0+cCk9J1wwJzsgLy90aGlzIHdvdWxkIHRha2UgY2FyZSBvZiBzaGlmdGluZyB0byB0aGUgcHJldmlvdXMgc3RyaW5nLgorICAgICAgICBjcHAtPlBhV2hpY2hTdHItLTsKKyAgICB9ICAKKyAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICBpbi0+YmFzZS5saW5lLS07CisgICAgICAgIERlY0xpbmVOdW1iZXIoKTsKKyAgICB9Cit9IC8vIHN0cl91bmdldGNoCisKK2ludCBTY2FuRnJvbVN0cmluZyhjb25zdCBjaGFyICpzKQoreworICAgIAorICAgIFN0cmluZ0lucHV0U3JjICppbiA9IG1hbGxvYyhzaXplb2YoU3RyaW5nSW5wdXRTcmMpKTsKKyAgICBtZW1zZXQoaW4sIDAsIHNpemVvZihTdHJpbmdJbnB1dFNyYykpOworICAgIGluLT5wID0gKGNoYXIqKSBzOworICAgIGluLT5iYXNlLmxpbmUgPSAxOworICAgIGluLT5iYXNlLnNjYW4gPSBieXRlX3NjYW47CisgICAgaW4tPmJhc2UuZ2V0Y2ggPSAoaW50ICgqKShJbnB1dFNyYyAqLCB5eXN0eXBlcHAgKikpc3RyX2dldGNoOworICAgIGluLT5iYXNlLnVuZ2V0Y2ggPSAodm9pZCAoKikoSW5wdXRTcmMgKiwgaW50LCB5eXN0eXBlcHAgKikpc3RyX3VuZ2V0Y2g7CisgICAgaW4tPmJhc2UucHJldiA9IGNwcC0+Y3VycmVudElucHV0OworICAgIGNwcC0+Y3VycmVudElucHV0ID0gJmluLT5iYXNlOworCisgICAgcmV0dXJuIDE7Cit9IC8vIFNjYW5Gcm9tU3RyaW5nOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBGbG9hdGluZyBwb2ludCBjb25zdGFudHM6IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBBUFBFTkRfQ0hBUl9TKGNoLCBzdHIsIGxlbiwgbWF4X2xlbikgXAorICAgICAgaWYgKGxlbiA8IG1heF9sZW4pIHsgXAorICAgICAgICAgIHN0cltsZW4rK10gPSBjaDsgXAorICAgICAgfSBlbHNlIGlmICghYWxyZWFkeUNvbXBsYWluZWQpIHsgXAorICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJCVUZGRVIgT1ZFUkZMT1ciKTsgXAorICAgICAgICAgIGFscmVhZHlDb21wbGFpbmVkID0gMTsgXAorICAgICAgfQorCisvKgorICogbEZsb2F0Q29uc3QoKSAtIFNjYW4gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gIEFzc3VtZXMgdGhhdCB0aGUgc2Nhbm5lcgorICogICAgICAgICBoYXMgc2VlbiBhdCBsZWFzdCBvbmUgZGlnaXQsIGZvbGxvd2VkIGJ5IGVpdGhlciBhIGRlY2ltYWwgJy4nIG9yIHRoZQorICogICAgICAgICBsZXR0ZXIgJ2UnLgorICogY2ggLSAnLicgb3IgJ2UnCisgKiBsZW4gLSBsZW5ndGggb2Ygc3RyaW5nIGFscmVhZHkgY29waWVkIGludG8geXlsdmFscHAtPnN5bWJvbF9uYW1lLgorICovCisKK3N0YXRpYyBpbnQgbEZsb2F0Q29uc3QoaW50IGNoLCBpbnQgbGVuLCB5eXN0eXBlcHAgKiB5eWx2YWxwcCkKK3sKKyAgICBpbnQgYWxyZWFkeUNvbXBsYWluZWQgPSAwOworICAgIGFzc2VydCgoY2ggPT0gJy4nKSB8fCAoY2ggPT0gJ2UnKSB8fCAoY2ggPT0gJ0UnKSk7CisKKyAgICBpZiAoY2ggPT0gJy4nKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIEFQUEVORF9DSEFSX1MoY2gsIHl5bHZhbHBwLT5zeW1ib2xfbmFtZSwgbGVuLCBNQVhfU1lNQk9MX05BTUVfTEVOKTsKKyAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgIH0gd2hpbGUgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOworICAgIH0KKworICAgIC8vIEV4cG9uZW50OgorICAgIGlmIChjaCA9PSAnZScgfHwgY2ggPT0gJ0UnKSB7CisgICAgICAgIEFQUEVORF9DSEFSX1MoY2gsIHl5bHZhbHBwLT5zeW1ib2xfbmFtZSwgbGVuLCBNQVhfU1lNQk9MX05BTUVfTEVOKTsKKyAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgaWYgKGNoID09ICcrJykgeworICAgICAgICAgICAgQVBQRU5EX0NIQVJfUyhjaCwgeXlsdmFscHAtPnN5bWJvbF9uYW1lLCBsZW4sIE1BWF9TWU1CT0xfTkFNRV9MRU4pOworICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIEFQUEVORF9DSEFSX1MoY2gsIHl5bHZhbHBwLT5zeW1ib2xfbmFtZSwgbGVuLCBNQVhfU1lNQk9MX05BTUVfTEVOKTsKKyAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgQVBQRU5EX0NIQVJfUyhjaCwgeXlsdmFscHAtPnN5bWJvbF9uYW1lLCBsZW4sIE1BWF9TWU1CT0xfTkFNRV9MRU4pOworICAgICAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiRVhQT05FTlQgSU5WQUxJRCIpOworICAgICAgICB9CisgICAgfQorICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworCisgICAgYXNzZXJ0KGxlbiA8PSBNQVhfU1lNQk9MX05BTUVfTEVOKTsKKyAgICB5eWx2YWxwcC0+c3ltYm9sX25hbWVbbGVuXSA9ICdcMCc7CisgICAgeXlsdmFscHAtPnNjX2Z2YWwgPSAoZmxvYXQpIGF0b2ZfZG90KHl5bHZhbHBwLT5zeW1ib2xfbmFtZSk7CisgICAgaWYgKGlzaW5mZih5eWx2YWxwcC0+c2NfZnZhbCkpIHsKKyAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIkZMT0FUIENPTlNUQU5UIE9WRVJGTE9XIik7CisgICAgfQorICAgIHJldHVybiBDUFBfRkxPQVRDT05TVEFOVDsKK30gLy8gbEZsb2F0Q29uc3QKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE5vcm1hbCBTY2FubmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIAorc3RhdGljIGludCBieXRlX3NjYW4oSW5wdXRTcmMgKmluLCB5eXN0eXBlcHAgKiB5eWx2YWxwcCkKK3sKKyAgICBjaGFyIHN0cmluZ192YWxbTUFYX1NUUklOR19MRU4gKyAxXTsKKyAgICBpbnQgYWxyZWFkeUNvbXBsYWluZWQgPSAwOworICAgIGludCBsZW4sIGNoLCBpaSwgaXZhbCA9IDA7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHl5bHZhbHBwLT5zY19pbnQgPSAwOworICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworIAorICAgICAgICB3aGlsZSAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgeXlsdmFscHAtPnNjX2ludCA9IDE7CisgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjcHAtPmx0b2tlbkxvYy5maWxlID0gY3BwLT5jdXJyZW50SW5wdXQtPm5hbWU7CisgICAgICAgIGNwcC0+bHRva2VuTG9jLmxpbmUgPSBjcHAtPmN1cnJlbnRJbnB1dC0+bGluZTsKKyAgICAgICAgYWxyZWFkeUNvbXBsYWluZWQgPSAwOworICAgICAgICBsZW4gPSAwOworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gY2g7IC8vIFNpbmdsZSBjaGFyYWN0ZXIgdG9rZW4KKyAgICAgICAgY2FzZSBFT0Y6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgJ0EnOiBjYXNlICdCJzogY2FzZSAnQyc6IGNhc2UgJ0QnOiBjYXNlICdFJzoKKyAgICAgICAgY2FzZSAnRic6IGNhc2UgJ0cnOiBjYXNlICdIJzogY2FzZSAnSSc6IGNhc2UgJ0onOgorICAgICAgICBjYXNlICdLJzogY2FzZSAnTCc6IGNhc2UgJ00nOiBjYXNlICdOJzogY2FzZSAnTyc6CisgICAgICAgIGNhc2UgJ1AnOiBjYXNlICdRJzogY2FzZSAnUic6IGNhc2UgJ1MnOiBjYXNlICdUJzoKKyAgICAgICAgY2FzZSAnVSc6IGNhc2UgJ1YnOiBjYXNlICdXJzogY2FzZSAnWCc6IGNhc2UgJ1knOgorICAgICAgICBjYXNlICdaJzogY2FzZSAnXyc6CisgICAgICAgIGNhc2UgJ2EnOiBjYXNlICdiJzogY2FzZSAnYyc6IGNhc2UgJ2QnOiBjYXNlICdlJzoKKyAgICAgICAgY2FzZSAnZic6IGNhc2UgJ2cnOiBjYXNlICdoJzogY2FzZSAnaSc6IGNhc2UgJ2onOgorICAgICAgICBjYXNlICdrJzogY2FzZSAnbCc6IGNhc2UgJ20nOiBjYXNlICduJzogY2FzZSAnbyc6CisgICAgICAgIGNhc2UgJ3AnOiBjYXNlICdxJzogY2FzZSAncic6IGNhc2UgJ3MnOiBjYXNlICd0JzoKKyAgICAgICAgY2FzZSAndSc6IGNhc2UgJ3YnOiBjYXNlICd3JzogY2FzZSAneCc6IGNhc2UgJ3knOgorICAgICAgICBjYXNlICd6JzogICAgICAgICAgICAKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBBUFBFTkRfQ0hBUl9TKGNoLCB5eWx2YWxwcC0+c3ltYm9sX25hbWUsIGxlbiwgTUFYX1NZTUJPTF9OQU1FX0xFTik7CisgICAgICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fAorICAgICAgICAgICAgICAgICAgICAgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgICAgICAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgICAgICAgIGNoID09ICdfJyk7CisgICAgICAgICAgICBhc3NlcnQobGVuIDw9IE1BWF9TWU1CT0xfTkFNRV9MRU4pOworICAgICAgICAgICAgeXlsdmFscHAtPnN5bWJvbF9uYW1lW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQtPnVuZ2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIGNoLCB5eWx2YWxwcCk7CisgICAgICAgICAgICB5eWx2YWxwcC0+c2NfaWRlbnQgPSBMb29rVXBBZGRTdHJpbmcoYXRhYmxlLCB5eWx2YWxwcC0+c3ltYm9sX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIENQUF9JREVOVElGSUVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgQVBQRU5EX0NIQVJfUyhjaCwgeXlsdmFscHAtPnN5bWJvbF9uYW1lLCBsZW4sIE1BWF9TWU1CT0xfTkFNRV9MRU4pOworICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAneCcgfHwgY2ggPT0gJ1gnKSB7ICAvLyBoZXhhZGVjaW1hbCBpbnRlZ2VyIGNvbnN0YW50cworICAgICAgICAgICAgICAgIEFQUEVORF9DSEFSX1MoY2gsIHl5bHZhbHBwLT5zeW1ib2xfbmFtZSwgbGVuLCBNQVhfU1lNQk9MX05BTUVfTEVOKTsKKyAgICAgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIGlmICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpIHx8CisgICAgICAgICAgICAgICAgICAgIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGl2YWwgPSAwOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGl2YWwgPD0gMHgwZmZmZmZmZikgJiYgKGxlbiA8IE1BWF9TWU1CT0xfTkFNRV9MRU4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlsdmFscHAtPnN5bWJvbF9uYW1lW2xlbisrXSA9IGNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpID0gY2ggLSAnMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpID0gY2ggLSAnQScgKyAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSA9IGNoIC0gJ2EnICsgMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2YWwgPSAoaXZhbCA8PCA0KSB8IGlpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYWxyZWFkeUNvbXBsYWluZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiSEVYIENPTlNUQU5UIE9WRVJGTE9XIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeUNvbXBsYWluZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCJIRVggQ09OU1RBTlQgSU5WQUxJRCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnQobGVuIDw9IE1BWF9TWU1CT0xfTkFNRV9MRU4pOworICAgICAgICAgICAgICAgIHl5bHZhbHBwLT5zeW1ib2xfbmFtZVtsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBjcHAtPmN1cnJlbnRJbnB1dC0+dW5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgY2gsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICB5eWx2YWxwcC0+c2NfaW50ID0gaXZhbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX0lOVENPTlNUQU5UOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7IC8vIG9jdGFsIGludGVnZXIgY29uc3RhbnRzCisgICAgICAgICAgICAgICAgaXZhbCA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBpZiAoKGl2YWwgPD0gMHgxZmZmZmZmZikgJiYgKGxlbiA8IE1BWF9TWU1CT0xfTkFNRV9MRU4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5eWx2YWxwcC0+c3ltYm9sX25hbWVbbGVuKytdID0gY2g7CisgICAgICAgICAgICAgICAgICAgICAgICBpaSA9IGNoIC0gJzAnOworICAgICAgICAgICAgICAgICAgICAgICAgaXZhbCA9IChpdmFsIDw8IDMpIHwgaWk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFscmVhZHlDb21wbGFpbmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiT0NUIENPTlNUQU5UIE9WRVJGTE9XIik7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5Q29tcGxhaW5lZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy4nIHx8IGNoID09ICdlJyB8fCBjaCA9PSAnZicgfHwgY2ggPT0gJ2gnIHx8IGNoID09ICd4J3x8IGNoID09ICdFJykgCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbEZsb2F0Q29uc3QoY2gsIGxlbiwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIGFzc2VydChsZW4gPD0gTUFYX1NZTUJPTF9OQU1FX0xFTik7CisgICAgICAgICAgICAgICAgeXlsdmFscHAtPnN5bWJvbF9uYW1lW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIHl5bHZhbHBwLT5zY19pbnQgPSBpdmFsOworICAgICAgICAgICAgICAgIHJldHVybiBDUFBfSU5UQ09OU1RBTlQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIGNoID0gJzAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoLi4uCisgICAgICAgIGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICAgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgQVBQRU5EX0NIQVJfUyhjaCwgeXlsdmFscHAtPnN5bWJvbF9uYW1lLCBsZW4sIE1BWF9TWU1CT0xfTkFNRV9MRU4pOworICAgICAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICB9IHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnLicgfHwgY2ggPT0gJ2UnIHx8IGNoID09ICdFJykgeworICAgICAgICAgICAgICAgIHJldHVybiBsRmxvYXRDb25zdChjaCwgbGVuLCB5eWx2YWxwcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydChsZW4gPD0gTUFYX1NZTUJPTF9OQU1FX0xFTik7CisgICAgICAgICAgICAgICAgeXlsdmFscHAtPnN5bWJvbF9uYW1lW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIGl2YWwgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IGxlbjsgaWkrKykgeworICAgICAgICAgICAgICAgICAgICBjaCA9IHl5bHZhbHBwLT5zeW1ib2xfbmFtZVtpaV0gLSAnMCc7CisgICAgICAgICAgICAgICAgICAgIGl2YWwgPSBpdmFsKjEwICsgY2g7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaXZhbCA+IDIxNDc0ODM2NCkgfHwgKGl2YWwgPT0gMjE0NzQ4MzY0ICYmIGNoID49IDgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiSU5URUdFUiBDT05TVEFOVCBPVkVSRkxPVyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeXlsdmFscHAtPnNjX2ludCA9IGl2YWw7CisgICAgICAgICAgICAgICAgaWYoaXZhbD09MCkKKyAgICAgICAgICAgICAgICAgICBzdHJjcHkoeXlsdmFscHAtPnN5bWJvbF9uYW1lLCIwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIENQUF9JTlRDT05TVEFOVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENQUF9ERUNfT1A7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgICAgIHJldHVybiBDUFBfU1VCX0FTU0lHTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQtPnVuZ2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIGNoLCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICctJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgaWYgKGNoID09ICcrJykgeworICAgICAgICAgICAgICAgIHJldHVybiBDUFBfSU5DX09QOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX0FERF9BU1NJR047CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIHJldHVybiAnKyc7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgJyonOgorICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX01VTF9BU1NJR047CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIHJldHVybiAnKic7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX01PRF9BU1NJR047CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc+Jyl7CisgICAgICAgICAgICAgICAgcmV0dXJuIENQUF9SSUdIVF9CUkFDRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQtPnVuZ2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIGNoLCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICclJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgaWYgKGNoID09ICc+JykgeworICAgICAgICAgICAgICAgIHJldHVybiBDUFBfUklHSFRfQlJBQ0tFVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQtPnVuZ2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIGNoLCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICc6JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAnXic6CisgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgaWYgKGNoID09ICdeJykgeworICAgICAgICAgICAgICAgIHJldHVybiBDUFBfWE9SX09QOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz0nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX1hPUl9BU1NJR047CisgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgICAgcmV0dXJuICdeJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENQUF9FUV9PUDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQtPnVuZ2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIGNoLCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICc9JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAnISc6CisgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgICAgIHJldHVybiBDUFBfTkVfT1A7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIHJldHVybiAnISc7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgJ3wnOgorICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnfCcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX09SX09QOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz0nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX09SX0FTU0lHTjsKKyAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQtPnVuZ2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIGNoLCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gJ3wnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAnJic6CisgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgaWYgKGNoID09ICcmJykgeworICAgICAgICAgICAgICAgIHJldHVybiBDUFBfQU5EX09QOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz0nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX0FORF9BU1NJR047CisgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgICAgcmV0dXJuICcmJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgJzwnOgorICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpIHsKKyAgICAgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIGlmKGNoID09ICc9JykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENQUF9MRUZUX0FTU0lHTjsKKyAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICBjcHAtPmN1cnJlbnRJbnB1dC0+dW5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgY2gsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENQUF9MRUZUX09QOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX0xFX09QOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnJScpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX0xFRlRfQlJBQ0U7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICc6JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDUFBfTEVGVF9CUkFDS0VUOworICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQtPnVuZ2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIGNoLCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzwnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gJz4nKSB7CisgICAgICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICBpZihjaCA9PSAnPScpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDUFBfUklHSFRfQVNTSUdOOworICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX1JJR0hUX09QOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX0dFX09QOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNwcC0+Y3VycmVudElucHV0LT51bmdldGNoKGNwcC0+Y3VycmVudElucHV0LCBjaCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gJz4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAnLic6CisgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICBjcHAtPmN1cnJlbnRJbnB1dC0+dW5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgY2gsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbEZsb2F0Q29uc3QoJy4nLCAwLCB5eWx2YWxwcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAvLyBTcGVjaWFsIEVPRiBoYWNrCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQtPnVuZ2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIGNoLCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnLic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuICdcbic7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcqJykgeworICAgICAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2ggIT0gJyonKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIkVPRiBJTiBDT01NRU5UIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBjcHAtPmN1cnJlbnRJbnB1dC0+Z2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIHl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiRU9GIElOIENPTU1FTlQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoICE9ICcvJyk7CisgICAgICAgICAgICAgICAgLy8gR28gdHJ5IGl0IGFnYWluLi4uCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgICAgIHJldHVybiBDUFBfRElWX0FTU0lHTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3BwLT5jdXJyZW50SW5wdXQtPnVuZ2V0Y2goY3BwLT5jdXJyZW50SW5wdXQsIGNoLCB5eWx2YWxwcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICcvJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIGNoID0gY3BwLT5jdXJyZW50SW5wdXQtPmdldGNoKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7CisgICAgICAgICAgICB3aGlsZSAoY2ggIT0gJyInICYmIGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIlRoZSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIgKFxcKSBpcyBub3QgcGFydCBvZiB0aGUgT3BlbkdMIEVTIFNoYWRpbmcgTGFuZ3VhZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBUFBFTkRfQ0hBUl9TKGNoLCBzdHJpbmdfdmFsLCBsZW4sIE1BWF9TVFJJTkdfTEVOKTsKKyAgICAgICAgICAgICAgICBjaCA9IGNwcC0+Y3VycmVudElucHV0LT5nZXRjaChjcHAtPmN1cnJlbnRJbnB1dCwgeXlsdmFscHApOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGFzc2VydChsZW4gPD0gTUFYX1NUUklOR19MRU4pOworICAgICAgICAgICAgc3RyaW5nX3ZhbFtsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICB5eWx2YWxwcC0+c2NfaWRlbnQgPSBMb29rVXBBZGRTdHJpbmcoYXRhYmxlLCBzdHJpbmdfdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1BQX1NUUkNPTlNUQU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygiRU9MIElOIFNUUklORyIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9TWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfSAvLyBieXRlX3NjYW4KKworaW50IHl5bGV4X0NQUChjaGFyKiBidWYsIGludCBtYXhTaXplKQoreyAgICAKKyAgICB5eXN0eXBlcHAgeXlsdmFscHA7CisgICAgaW50IHRva2VuID0gJ1xuJzsgICAKKworICAgIGZvcig7OykgeworCisgICAgICAgIGNoYXIqIHRva2VuU3RyaW5nID0gMDsKKyAgICAgICAgdG9rZW4gPSBjcHAtPmN1cnJlbnRJbnB1dC0+c2NhbihjcHAtPmN1cnJlbnRJbnB1dCwgJnl5bHZhbHBwKTsKKyAgICAgICAgaWYoY2hlY2tfRU9GKHRva2VuKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAodG9rZW4gPCAwKSB7CisgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIG1heSBuZWVkIHRvIGJlIGltcHJvdmVkIHRvIHN1cHBvcnQgVVRGLTgKKyAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgaW4gY29tbWVudHMuCisgICAgICAgICAgICBDUFBFcnJvclRvSW5mb0xvZygicHJlcHJvY2Vzc29yIGVuY291bnRlcmVkIG5vbi1BU0NJSSBjaGFyYWN0ZXIgaW4gc2hhZGVyIHNvdXJjZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRva2VuID09ICcjJykgeworICAgICAgICAgICAgaWYgKGNwcC0+cHJldmlvdXNfdG9rZW4gPT0gJ1xuJ3x8IGNwcC0+cHJldmlvdXNfdG9rZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIHRva2VuID0gcmVhZENQUGxpbmUoJnl5bHZhbHBwKTsKKyAgICAgICAgICAgICAgICBpZihjaGVja19FT0YodG9rZW4pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coInByZXByb2Nlc3NvciBjb21tYW5kIG11c3Qgbm90IGJlIHByZWNlZGVkIGJ5IGFueSBvdGhlciBzdGF0ZW1lbnQgaW4gdGhhdCBsaW5lIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY3BwLT5wcmV2aW91c190b2tlbiA9IHRva2VuOworICAgICAgICAvLyBleHBhbmQgbWFjcm9zCisgICAgICAgIGlmICh0b2tlbiA9PSBDUFBfSURFTlRJRklFUiAmJiBNYWNyb0V4cGFuZCh5eWx2YWxwcC5zY19pZGVudCwgJnl5bHZhbHBwKSkgeworICAgICAgICAgICAgY3BwLT5wYXN0Rmlyc3RTdGF0ZW1lbnQgPSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodG9rZW4gPT0gJ1xuJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjcHAtPnBhc3RGaXJzdFN0YXRlbWVudCA9IDE7CisKKyAgICAgICAgaWYgKHRva2VuID09IENQUF9JREVOVElGSUVSKSB7CisgICAgICAgICAgICB0b2tlblN0cmluZyA9IEdldFN0cmluZ09mQXRvbShhdGFibGUseXlsdmFscHAuc2NfaWRlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09IENQUF9GTE9BVENPTlNUQU5UIHx8IHRva2VuID09IENQUF9JTlRDT05TVEFOVCl7CisgICAgICAgICAgICB0b2tlblN0cmluZyA9IHl5bHZhbHBwLnN5bWJvbF9uYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG9rZW5TdHJpbmcgPSBHZXRTdHJpbmdPZkF0b20oYXRhYmxlLHRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0b2tlblN0cmluZykgeworICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbih0b2tlblN0cmluZyk7CisgICAgICAgICAgICBjcHAtPnRva2Vuc0JlZm9yZUVPRiA9IDE7CisgICAgICAgICAgICBpZiAobGVuID49IG1heFNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF4U2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkoYnVmLCB0b2tlblN0cmluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLy8geXlsZXgKKworLy9DaGVja3MgaWYgdGhlIHRva2VuIGp1c3QgcmVhZCBpcyBFT0Ygb3Igbm90LgoraW50IGNoZWNrX0VPRihpbnQgdG9rZW4pCit7CisgICBpZih0b2tlbj09LTEpeworICAgICAgIGlmKGNwcC0+aWZkZXB0aCA+MCl7CisgICAgICAgIENQUEVycm9yVG9JbmZvTG9nKCIjZW5kaWYgbWlzc2luZyEhIENvbXBpbGF0aW9uIHN0b3BwZWQiKTsKKyAgICAgICAgY3BwLT5Db21waWxlRXJyb3I9MTsKKyAgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHJldHVybiAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEVuZCBvZiBzY2FubmVyLmMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9zY2FubmVyLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3Ivc2Nhbm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzA2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3Ivc2Nhbm5lci5oCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorQ29weXJpZ2h0IChjKSAyMDAyLCBOVklESUEgQ29ycG9yYXRpb24uCisKK05WSURJQSBDb3Jwb3JhdGlvbigiTlZJRElBIikgc3VwcGxpZXMgdGhpcyBzb2Z0d2FyZSB0byB5b3UgaW4KK2NvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLAoraW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBOVklESUEgc29mdHdhcmUKK2NvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UKK3Rlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZSB0aGlzIE5WSURJQQorc29mdHdhcmUuCisKK0luIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kCitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zLCBOVklESUEgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlCitsaWNlbnNlLCB1bmRlciBOVklESUEncyBjb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgTlZJRElBIHNvZnR3YXJlICh0aGUKKyJOVklESUEgU29mdHdhcmUiKSwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZQorTlZJRElBIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkKK2Zvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIE5WSURJQSBTb2Z0d2FyZSwgeW91IG11c3QKK3JldGFpbiB0aGUgY29weXJpZ2h0IG5vdGljZSBvZiBOVklESUEsIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nCit0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIE5WSURJQSBTb2Z0d2FyZS4KK05laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3Mgbm9yIGxvZ29zIG9mIE5WSURJQQorQ29ycG9yYXRpb24gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUKK05WSURJQSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIE5WSURJQS4KK0V4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMKK2V4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgTlZJRElBIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QKK2xpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdCBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIgZGVyaXZhdGl2ZQord29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIE5WSURJQSBTb2Z0d2FyZSBtYXkgYmUKK2luY29ycG9yYXRlZC4gTm8gaGFyZHdhcmUgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAKKworVEhFIE5WSURJQSBTT0ZUV0FSRSBJUyBCRUlORyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsCitJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUgorSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEVJVEhFUiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIE9USEVSCitQUk9EVUNUUy4KKworSU4gTk8gRVZFTlQgU0hBTEwgTlZJRElBIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULAorSU5DSURFTlRBTCwgRVhFTVBMQVJZLCBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECitUTywgTE9TVCBQUk9GSVRTOyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCitVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgT1IgQVJJU0lORyBJTiBBTlkgV0FZCitPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUKK05WSURJQSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5EIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULAorVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIE9USEVSV0lTRSwgRVZFTiBJRgorTlZJRElBIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gc2Nhbm5lci5oCisvLworCisjaWYgIWRlZmluZWQoX19TQ0FOTkVSX0gpCisjZGVmaW5lIF9fU0NBTk5FUl9IIDEKKworLy8gVGhlc2UgbGVuZ3RocyBkbyBub3QgaW5jbHVkZSB0aGUgTlVMTCB0ZXJtaW5hdG9yLgorI2RlZmluZSBNQVhfU1lNQk9MX05BTUVfTEVOIDI1NgorI2RlZmluZSBNQVhfU1RSSU5HX0xFTiA1MTEKKworI2luY2x1ZGUgImNvbXBpbGVyL3ByZXByb2Nlc3Nvci9wYXJzZXIuaCIKKworLy8gTm90IHJlYWxseSBhdG9tIHRhYmxlIHN0dWZmIGJ1dCBuZWVkZWQgZmlyc3QuLi4KKwordHlwZWRlZiBzdHJ1Y3QgU291cmNlTG9jX1JlYyB7CisgICAgdW5zaWduZWQgc2hvcnQgZmlsZSwgbGluZTsKK30gU291cmNlTG9jOworCitpbnQgeXlsZXhfQ1BQKGNoYXIqIGJ1ZiwgaW50IG1heFNpemUpOworCit0eXBlZGVmIHN0cnVjdCBJbnB1dFNyYyB7CisgICAgc3RydWN0IElucHV0U3JjCSpwcmV2OworICAgIGludAkJCSgqc2Nhbikoc3RydWN0IElucHV0U3JjICosIHl5c3R5cGVwcCAqKTsKKyAgICBpbnQJCQkoKmdldGNoKShzdHJ1Y3QgSW5wdXRTcmMgKiwgeXlzdHlwZXBwICopOworICAgIHZvaWQJCSgqdW5nZXRjaCkoc3RydWN0IElucHV0U3JjICosIGludCwgeXlzdHlwZXBwICopOworICAgIGludAkJCW5hbWU7ICAvKiBhdG9tICovCisgICAgaW50CQkJbGluZTsKK30gSW5wdXRTcmM7CisKK2ludCBJbml0U2Nhbm5lcihDUFBTdHJ1Y3QgKmNwcCk7ICAgLy8gSW50aWFsaXNlIHRoZSBjcHAgc2Nhbm5lci4gCitpbnQgU2NhbkZyb21TdHJpbmcoY29uc3QgY2hhciAqKTsgICAgICAvLyBTdGFydCBzY2FubmluZyB0aGUgaW5wdXQgZnJvbSB0aGUgc3RyaW5nIG1lbnRpb25lZC4KK2ludCBjaGVja19FT0YoaW50KTsgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGhpdCBhIEVPRiBhYnJ1cHRseSAKK3ZvaWQgQ1BQRXJyb3JUb0luZm9Mb2coY2hhciAqKTsgICAvLyBzdGlja2luZyB0aGUgbXNnLGxpbmUgaW50byB0aGUgU2hhZGVyJ3MuSW5mby5sb2cKK3ZvaWQgU2V0TGluZU51bWJlcihpbnQpOwordm9pZCBTZXRTdHJpbmdOdW1iZXIoaW50KTsKK3ZvaWQgSW5jTGluZU51bWJlcih2b2lkKTsKK3ZvaWQgRGVjTGluZU51bWJlcih2b2lkKTsKK2ludCBGcmVlU2Nhbm5lcih2b2lkKTsgICAgICAgICAgICAgICAgIC8vIEZyZWUgdGhlIGNwcCBzY2FubmVyCisjZW5kaWYgLy8gIShkZWZpbmVkKF9fU0NBTk5FUl9IKQorCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3Ivc2xnbG9iYWxzLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3Ivc2xnbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzNDYyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci9zbGdsb2JhbHMuaApAQCAtMCwwICsxLDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKK0NvcHlyaWdodCAoYykgMjAwMiwgTlZJRElBIENvcnBvcmF0aW9uLgorCitOVklESUEgQ29ycG9yYXRpb24oIk5WSURJQSIpIHN1cHBsaWVzIHRoaXMgc29mdHdhcmUgdG8geW91IGluCitjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwKK2luc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgTlZJRElBIHNvZnR3YXJlCitjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlCit0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBOVklESUEKK3NvZnR3YXJlLgorCitJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZAorc3ViamVjdCB0byB0aGVzZSB0ZXJtcywgTlZJRElBIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZQorbGljZW5zZSwgdW5kZXIgTlZJRElBJ3MgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIE5WSURJQSBzb2Z0d2FyZSAodGhlCisiTlZJRElBIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUKK05WSURJQSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Citmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBOVklESUEgU29mdHdhcmUsIHlvdSBtdXN0CityZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2Ugb2YgTlZJRElBLCB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwordGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBOVklESUEgU29mdHdhcmUuCitOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG5vciBsb2dvcyBvZiBOVklESUEKK0NvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCitOVklESUEgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOVklESUEuCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzCitleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IE5WSURJQSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUKK3dvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBOVklESUEgU29mdHdhcmUgbWF5IGJlCitpbmNvcnBvcmF0ZWQuIE5vIGhhcmR3YXJlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCisKK1RIRSBOVklESUEgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELAorSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IKK0lUUyBVU0UgQU5EIE9QRVJBVElPTiBFSVRIRVIgQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBPVEhFUgorUFJPRFVDVFMuCisKK0lOIE5PIEVWRU5UIFNIQUxMIE5WSURJQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIEVYRU1QTEFSWSwgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIExPU1QgUFJPRklUUzsgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIE9SIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFCitOVklESUEgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwKK1RPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYKK05WSURJQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIHNsZ2xvYmFscy5oCisvLworCisjaWYgIWRlZmluZWQoX19TTEdMT0JBTFNfSCkKKyNkZWZpbmUgX19TTEdMT0JBTFNfSCAxCisKK3R5cGVkZWYgc3RydWN0IENQUFN0cnVjdF9SZWMgQ1BQU3RydWN0OworCitleHRlcm4gQ1BQU3RydWN0ICpjcHA7CisKKyN1bmRlZiAgQ1BQQ19ERUJVR19USEVfQ09NUElMRVIKKyNpZiBkZWZpbmVkKF9ERUJVRykKKyNkZWZpbmUgQ1BQQ19ERUJVR19USEVfQ09NUElMRVIgMQorI2VuZGlmCisKKyN1bmRlZiAgQ1BQQ19FTkFCTEVfVE9PTFMKKyNkZWZpbmUgQ1BQQ19FTkFCTEVfVE9PTFMgMQorCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL21lbW9yeS5oIgorI2luY2x1ZGUgImNvbXBpbGVyL3ByZXByb2Nlc3Nvci9hdG9tLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL3NjYW5uZXIuaCIKKyNpbmNsdWRlICJjb21waWxlci9wcmVwcm9jZXNzb3IvY3BwLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL3Rva2Vucy5oIgorI2luY2x1ZGUgImNvbXBpbGVyL3ByZXByb2Nlc3Nvci9zeW1ib2xzLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL2NvbXBpbGUuaCIKKyNpZiAhZGVmaW5lZChOT19QQVJTRVIpCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL3BhcnNlci5oIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChOVUxMKQorI2RlZmluZSBOVUxMIDAKKyNlbmRpZgorCisjZW5kaWYgLy8gIShkZWZpbmVkKF9fU0xHTE9CQUxTX0gpCisKKworICAgIAorCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3Ivc3ltYm9scy5jIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL3N5bWJvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFlZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL3N5bWJvbHMuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCitDb3B5cmlnaHQgKGMpIDIwMDIsIE5WSURJQSBDb3Jwb3JhdGlvbi4KKworTlZJRElBIENvcnBvcmF0aW9uKCJOVklESUEiKSBzdXBwbGllcyB0aGlzIHNvZnR3YXJlIHRvIHlvdSBpbgorY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsCitpbnN0YWxsYXRpb24sIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIE5WSURJQSBzb2Z0d2FyZQorY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcy4gIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGVzZQordGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgcmVkaXN0cmlidXRlIHRoaXMgTlZJRElBCitzb2Z0d2FyZS4KKworSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMsIE5WSURJQSBncmFudHMgeW91IGEgcGVyc29uYWwsIG5vbi1leGNsdXNpdmUKK2xpY2Vuc2UsIHVuZGVyIE5WSURJQSdzIGNvcHlyaWdodHMgaW4gdGhpcyBvcmlnaW5hbCBOVklESUEgc29mdHdhcmUgKHRoZQorIk5WSURJQSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgdGhlCitOVklESUEgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeQorZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTlZJRElBIFNvZnR3YXJlLCB5b3UgbXVzdAorcmV0YWluIHRoZSBjb3B5cmlnaHQgbm90aWNlIG9mIE5WSURJQSwgdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcKK3RleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbCBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgTlZJRElBIFNvZnR3YXJlLgorTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcyBub3IgbG9nb3Mgb2YgTlZJRElBCitDb3Jwb3JhdGlvbiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoZQorTlZJRElBIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gTlZJRElBLgorRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcworZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBOVklESUEgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdAorbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0IG1heSBiZSBpbmZyaW5nZWQgYnkgeW91ciBkZXJpdmF0aXZlCit3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgTlZJRElBIFNvZnR3YXJlIG1heSBiZQoraW5jb3Jwb3JhdGVkLiBObyBoYXJkd2FyZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuIAorCitUSEUgTlZJRElBIFNPRlRXQVJFIElTIEJFSU5HIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwKK0lOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKK05PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SCitJVFMgVVNFIEFORCBPUEVSQVRJT04gRUlUSEVSIEFMT05FIE9SIElOIENPTUJJTkFUSU9OIFdJVEggT1RIRVIKK1BST0RVQ1RTLgorCitJTiBOTyBFVkVOVCBTSEFMTCBOVklESUEgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBFWEVNUExBUlksIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKK1RPLCBMT1NUIFBST0ZJVFM7IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKK1VTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBPUiBBUklTSU5HIElOIEFOWSBXQVkKK09VVCBPRiBUSEUgVVNFLCBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBBTkQvT1IgRElTVFJJQlVUSU9OIE9GIFRIRQorTlZJRElBIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsCitUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IgT1RIRVJXSVNFLCBFVkVOIElGCitOVklESUEgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBzeW1ib2xzLmMKKy8vCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL3NsZ2xvYmFscy5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gU3ltYm9sIFRhYmxlIFZhcmlhYmxlczogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1Njb3BlICpTY29wZUxpc3QgPSBOVUxMOworU2NvcGUgKkN1cnJlbnRTY29wZSA9IE5VTEw7CitTY29wZSAqR2xvYmFsU2NvcGUgPSBOVUxMOworCitzdGF0aWMgdm9pZCB1bmxpbmtTY29wZSh2b2lkICpfc2NvcGUpIHsKKyAgICBTY29wZSAqc2NvcGUgPSBfc2NvcGU7CisKKyAgICBpZiAoc2NvcGUtPm5leHQpCisgICAgICAgIHNjb3BlLT5uZXh0LT5wcmV2ID0gc2NvcGUtPnByZXY7CisgICAgaWYgKHNjb3BlLT5wcmV2KQorICAgICAgICBzY29wZS0+cHJldi0+bmV4dCA9IHNjb3BlLT5uZXh0OworICAgIGVsc2UKKyAgICAgICAgU2NvcGVMaXN0ID0gc2NvcGUtPm5leHQ7Cit9CisKKy8qCisgKiBOZXdTY29wZSgpCisgKgorICovCitTY29wZSAqTmV3U2NvcGVJblBvb2woTWVtb3J5UG9vbCAqcG9vbCkKK3sKKyAgICBTY29wZSAqbFNjb3BlOworCisgICAgbFNjb3BlID0gbWVtX0FsbG9jKHBvb2wsIHNpemVvZihTY29wZSkpOworICAgIGxTY29wZS0+cG9vbCA9IHBvb2w7CisgICAgbFNjb3BlLT5wYXJlbnQgPSBOVUxMOworICAgIGxTY29wZS0+ZnVuU2NvcGUgPSBOVUxMOworICAgIGxTY29wZS0+c3ltYm9scyA9IE5VTEw7CisgICAgCisgICAgbFNjb3BlLT5sZXZlbCA9IDA7CisKKyAgICBsU2NvcGUtPnByb2dyYW1zID0gTlVMTDsKKyAgICBpZiAoKGxTY29wZS0+bmV4dCA9IFNjb3BlTGlzdCkpCisgICAgICAgIFNjb3BlTGlzdC0+cHJldiA9IGxTY29wZTsKKyAgICBsU2NvcGUtPnByZXYgPSAwOworICAgIFNjb3BlTGlzdCA9IGxTY29wZTsKKyAgICBtZW1fQWRkQ2xlYW51cChwb29sLCB1bmxpbmtTY29wZSwgbFNjb3BlKTsKKyAgICByZXR1cm4gbFNjb3BlOworfSAvLyBOZXdTY29wZQorCisvKgorICogUHVzaFNjb3BlKCkKKyAqCisgKi8KKwordm9pZCBQdXNoU2NvcGUoU2NvcGUgKmZTY29wZSkKK3sKKyAgICBTY29wZSAqbFNjb3BlOworCisgICAgaWYgKEN1cnJlbnRTY29wZSkgeworICAgICAgICBmU2NvcGUtPmxldmVsID0gQ3VycmVudFNjb3BlLT5sZXZlbCArIDE7CisgICAgICAgIGlmIChmU2NvcGUtPmxldmVsID09IDEpIHsKKyAgICAgICAgICAgIGlmICghR2xvYmFsU2NvcGUpIHsKKyAgICAgICAgICAgICAgICAvKiBIQUNLIC0gQ1REIC0tIGlmIEdsb2JhbFNjb3BlPT1OVUxMIGFuZCBsZXZlbD09MSwgd2UncmUKKyAgICAgICAgICAgICAgICAgKiBkZWZpbmluZyBhIGZ1bmN0aW9uIGluIHRoZSBzdXBlcmdsb2JhbCBzY29wZS4gIFRoaW5ncworICAgICAgICAgICAgICAgICAqIHdpbGwgYnJlYWsgaWYgd2UgbGVhdmUgdGhlIGxldmVsIGFzIDEsIHNvIHdlIGFyYml0cmFyaWx5CisgICAgICAgICAgICAgICAgICogc2V0IGl0IHRvIDIgKi8KKyAgICAgICAgICAgICAgICBmU2NvcGUtPmxldmVsID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZlNjb3BlLT5sZXZlbCA+PSAyKSB7CisgICAgICAgICAgICBsU2NvcGUgPSBmU2NvcGU7CisgICAgICAgICAgICB3aGlsZSAobFNjb3BlLT5sZXZlbCA+IDIpCisgICAgICAgICAgICAgICAgbFNjb3BlID0gbFNjb3BlLT5uZXh0OworICAgICAgICAgICAgZlNjb3BlLT5mdW5TY29wZSA9IGxTY29wZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZTY29wZS0+bGV2ZWwgPSAwOworICAgIH0KKyAgICBmU2NvcGUtPnBhcmVudCA9IEN1cnJlbnRTY29wZTsKKyAgICBDdXJyZW50U2NvcGUgPSBmU2NvcGU7Cit9IC8vIFB1c2hTY29wZQorCisvKgorICogUG9wU2NvcGUoKQorICoKKyAqLworCitTY29wZSAqUG9wU2NvcGUodm9pZCkKK3sKKyAgICBTY29wZSAqbFNjb3BlOworCisgICAgbFNjb3BlID0gQ3VycmVudFNjb3BlOworICAgIGlmIChDdXJyZW50U2NvcGUpCisgICAgICAgIEN1cnJlbnRTY29wZSA9IEN1cnJlbnRTY29wZS0+cGFyZW50OworICAgIHJldHVybiBsU2NvcGU7Cit9IC8vIFBvcFNjb3BlCisKKy8qCisgKiBOZXdTeW1ib2woKSAtIEFsbG9jYXRlIGEgbmV3IHN5bWJvbCBub2RlOworICoKKyAqLworCitTeW1ib2wgKk5ld1N5bWJvbChTb3VyY2VMb2MgKmxvYywgU2NvcGUgKmZTY29wZSwgaW50IG5hbWUsIHN5bWJvbGtpbmQga2luZCkKK3sKKyAgICBTeW1ib2wgKmxTeW1iOworICAgIGNoYXIgKnBjaDsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CisKKyAgICBsU3ltYiA9IChTeW1ib2wgKikgbWVtX0FsbG9jKGZTY29wZS0+cG9vbCwgc2l6ZW9mKFN5bWJvbCkpOworICAgIGxTeW1iLT5sZWZ0ID0gTlVMTDsKKyAgICBsU3ltYi0+cmlnaHQgPSBOVUxMOworICAgIGxTeW1iLT5uZXh0ID0gTlVMTDsKKyAgICBsU3ltYi0+bmFtZSA9IG5hbWU7CisgICAgbFN5bWItPmxvYyA9ICpsb2M7CisgICAgbFN5bWItPmtpbmQgPSBraW5kOworICAgIAorICAgIC8vIENsZWFyIHVuaW9uIGFyZWE6CisKKyAgICBwY2ggPSAoY2hhciAqKSAmbFN5bWItPmRldGFpbHM7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgc2l6ZW9mKGxTeW1iLT5kZXRhaWxzKTsgaWkrKykKKyAgICAgICAgKnBjaCsrID0gMDsKKyAgICByZXR1cm4gbFN5bWI7Cit9IC8vIE5ld1N5bWJvbAorCisvKgorICogbEFkZFRvVHJlZSgpIC0gVXNpbmcgYSBiaW5hcnkgdHJlZSBpcyBub3QgYSBnb29kIGlkZWEgZm9yIGJhc2ljIGF0b20gdmFsdWVzIGJlY2F1c2UgdGhleQorICogICAgICAgICBhcmUgZ2VuZXJhdGVkIGluIG9yZGVyLiAgV2UnbGwgZml4IHRoaXMgbGF0ZXIgKGJ5IHJldmVyc2luZyB0aGUgYml0IHBhdHRlcm4pLgorICovCisKK3N0YXRpYyB2b2lkIGxBZGRUb1RyZWUoU3ltYm9sICoqZlN5bWJvbHMsIFN5bWJvbCAqZlN5bWIpCit7CisgICAgU3ltYm9sICpsU3ltYjsKKyAgICBpbnQgbHJldiwgZnJldjsKKworICAgIGxTeW1iID0gKmZTeW1ib2xzOworICAgIGlmIChsU3ltYikgeworICAgICAgICBmcmV2ID0gR2V0UmV2ZXJzZWRBdG9tKGF0YWJsZSwgZlN5bWItPm5hbWUpOworICAgICAgICB3aGlsZSAobFN5bWIpIHsKKyAgICAgICAgICAgIGxyZXYgPSBHZXRSZXZlcnNlZEF0b20oYXRhYmxlLCBsU3ltYi0+bmFtZSk7CisgICAgICAgICAgICBpZiAobHJldiA9PSBmcmV2KSB7CisgICAgICAgICAgICAgICAgQ1BQRXJyb3JUb0luZm9Mb2coIkdldEF0b21TdHJpbmcoYXRhYmxlLCBmU3ltYi0+bmFtZSkiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxyZXYgPiBmcmV2KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsU3ltYi0+bGVmdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbFN5bWIgPSBsU3ltYi0+bGVmdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxTeW1iLT5sZWZ0ID0gZlN5bWI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsU3ltYi0+cmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxTeW1iID0gbFN5bWItPnJpZ2h0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbFN5bWItPnJpZ2h0ID0gZlN5bWI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpmU3ltYm9scyA9IGZTeW1iOworICAgIH0KK30gLy8gbEFkZFRvVHJlZQorCisKKy8qCisgKiBBZGRTeW1ib2woKSAtIEFkZCBhIHZhcmlhYmxlLCB0eXBlLCBvciBmdW5jdGlvbiBuYW1lIHRvIGEgc2NvcGUuCisgKgorICovCisKK1N5bWJvbCAqQWRkU3ltYm9sKFNvdXJjZUxvYyAqbG9jLCBTY29wZSAqZlNjb3BlLCBpbnQgYXRvbSwgc3ltYm9sa2luZCBraW5kKQoreworICAgIFN5bWJvbCAqbFN5bWI7CisKKyAgICBpZiAoIWZTY29wZSkKKyAgICAgICAgZlNjb3BlID0gQ3VycmVudFNjb3BlOworICAgIGxTeW1iID0gTmV3U3ltYm9sKGxvYywgZlNjb3BlLCBhdG9tLCBraW5kKTsKKyAgICBsQWRkVG9UcmVlKCZmU2NvcGUtPnN5bWJvbHMsIGxTeW1iKTsKKyAgICByZXR1cm4gbFN5bWI7Cit9IC8vIEFkZFN5bWJvbAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFN5bWJvbCBTZW1hbnRpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIExvb2tVcExvY2FsU3ltYm9sKCkKKyAqCisgKi8KKworU3ltYm9sICpMb29rVXBMb2NhbFN5bWJvbChTY29wZSAqZlNjb3BlLCBpbnQgYXRvbSkKK3sKKyAgICBTeW1ib2wgKmxTeW1iOworICAgIGludCBybmFtZSwgcmF0b207CisKKyAgICByYXRvbSA9IEdldFJldmVyc2VkQXRvbShhdGFibGUsIGF0b20pOworICAgIGlmICghZlNjb3BlKQorICAgICAgICBmU2NvcGUgPSBDdXJyZW50U2NvcGU7CisgICAgbFN5bWIgPSBmU2NvcGUtPnN5bWJvbHM7CisgICAgd2hpbGUgKGxTeW1iKSB7CisgICAgICAgIHJuYW1lID0gR2V0UmV2ZXJzZWRBdG9tKGF0YWJsZSwgbFN5bWItPm5hbWUpOworICAgICAgICBpZiAocm5hbWUgPT0gcmF0b20pIHsKKyAgICAgICAgICAgIHJldHVybiBsU3ltYjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChybmFtZSA+IHJhdG9tKSB7CisgICAgICAgICAgICAgICAgbFN5bWIgPSBsU3ltYi0+bGVmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbFN5bWIgPSBsU3ltYi0+cmlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9IC8vIExvb2tVcExvY2FsU3ltYm9sCisKKy8qCisgKiBMb29rVXBTeW1ib2woKQorICoKKyAqLworCitTeW1ib2wgKkxvb2tVcFN5bWJvbChTY29wZSAqZlNjb3BlLCBpbnQgYXRvbSkKK3sKKyAgICBTeW1ib2wgKmxTeW1iOworCisgICAgaWYgKCFmU2NvcGUpCisgICAgICAgIGZTY29wZSA9IEN1cnJlbnRTY29wZTsKKyAgICB3aGlsZSAoZlNjb3BlKSB7CisgICAgICAgIGxTeW1iID0gTG9va1VwTG9jYWxTeW1ib2woZlNjb3BlLCBhdG9tKTsKKyAgICAgICAgaWYgKGxTeW1iKQorICAgICAgICAgICAgcmV0dXJuIGxTeW1iOworICAgICAgICBmU2NvcGUgPSBmU2NvcGUtPnBhcmVudDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9IC8vIExvb2tVcFN5bWJvbAorCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3Ivc3ltYm9scy5oIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL3N5bWJvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTlmNzljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL3N5bWJvbHMuaApAQCAtMCwwICsxLDExMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCitDb3B5cmlnaHQgKGMpIDIwMDIsIE5WSURJQSBDb3Jwb3JhdGlvbi4KKworTlZJRElBIENvcnBvcmF0aW9uKCJOVklESUEiKSBzdXBwbGllcyB0aGlzIHNvZnR3YXJlIHRvIHlvdSBpbgorY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsCitpbnN0YWxsYXRpb24sIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIE5WSURJQSBzb2Z0d2FyZQorY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcy4gIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGVzZQordGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgcmVkaXN0cmlidXRlIHRoaXMgTlZJRElBCitzb2Z0d2FyZS4KKworSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMsIE5WSURJQSBncmFudHMgeW91IGEgcGVyc29uYWwsIG5vbi1leGNsdXNpdmUKK2xpY2Vuc2UsIHVuZGVyIE5WSURJQSdzIGNvcHlyaWdodHMgaW4gdGhpcyBvcmlnaW5hbCBOVklESUEgc29mdHdhcmUgKHRoZQorIk5WSURJQSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgdGhlCitOVklESUEgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeQorZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTlZJRElBIFNvZnR3YXJlLCB5b3UgbXVzdAorcmV0YWluIHRoZSBjb3B5cmlnaHQgbm90aWNlIG9mIE5WSURJQSwgdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcKK3RleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbCBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgTlZJRElBIFNvZnR3YXJlLgorTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcyBub3IgbG9nb3Mgb2YgTlZJRElBCitDb3Jwb3JhdGlvbiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoZQorTlZJRElBIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gTlZJRElBLgorRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcworZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBOVklESUEgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdAorbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0IG1heSBiZSBpbmZyaW5nZWQgYnkgeW91ciBkZXJpdmF0aXZlCit3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgTlZJRElBIFNvZnR3YXJlIG1heSBiZQoraW5jb3Jwb3JhdGVkLiBObyBoYXJkd2FyZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuIAorCitUSEUgTlZJRElBIFNPRlRXQVJFIElTIEJFSU5HIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwKK0lOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKK05PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SCitJVFMgVVNFIEFORCBPUEVSQVRJT04gRUlUSEVSIEFMT05FIE9SIElOIENPTUJJTkFUSU9OIFdJVEggT1RIRVIKK1BST0RVQ1RTLgorCitJTiBOTyBFVkVOVCBTSEFMTCBOVklESUEgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBFWEVNUExBUlksIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKK1RPLCBMT1NUIFBST0ZJVFM7IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKK1VTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBPUiBBUklTSU5HIElOIEFOWSBXQVkKK09VVCBPRiBUSEUgVVNFLCBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBBTkQvT1IgRElTVFJJQlVUSU9OIE9GIFRIRQorTlZJRElBIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsCitUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IgT1RIRVJXSVNFLCBFVkVOIElGCitOVklESUEgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBzeW1ib2xzLmgKKy8vCisKKyNpZiAhZGVmaW5lZChfX1NZTUJPTFNfSCkKKyNkZWZpbmUgX19TWU1CT0xTX0ggMQorCisjaW5jbHVkZSAiY29tcGlsZXIvcHJlcHJvY2Vzc29yL21lbW9yeS5oIgorCit0eXBlZGVmIGVudW0gc3ltYm9sa2luZCB7CisgICBNQUNST19TCit9IHN5bWJvbGtpbmQ7CisKKy8vIFR5cGVkZWZzIGZvciB0aGluZ3MgZGVmaW5lZCBoZXJlIGluICJzeW1ib2xzLmgiOgorCit0eXBlZGVmIHN0cnVjdCBTY29wZV9SZWMgU2NvcGU7Cit0eXBlZGVmIHN0cnVjdCBTeW1ib2xfUmVjIFN5bWJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgU3ltYm9sTGlzdF9SZWMgeworICAgIHN0cnVjdCBTeW1ib2xMaXN0X1JlYyAqbmV4dDsKKyAgICBTeW1ib2wgKnN5bWI7Cit9IFN5bWJvbExpc3Q7CisKK3N0cnVjdCBTY29wZV9SZWMgeworICAgIFNjb3BlICpuZXh0LCAqcHJldjsgICAgIC8vIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwgc2NvcGVzCisgICAgU2NvcGUgKnBhcmVudDsKKyAgICBTY29wZSAqZnVuU2NvcGU7ICAgICAgICAvLyBQb2ludHMgdG8gYmFzZSBzY29wZSBvZiBlbmNsb3NpbmcgZnVuY3Rpb24KKyAgICBNZW1vcnlQb29sICpwb29sOyAgICAgICAvLyBwb29sIHVzZWQgZm9yIGFsbG9jYXRpb24gaW4gdGhpcyBzY29wZQorICAgIFN5bWJvbCAqc3ltYm9sczsKKyAgICAKKwlpbnQgbGV2ZWw7ICAgICAgICAgICAgICAvLyAwID0gc3VwZXIgZ2xvYmFscywgMSA9IGdsb2JhbHMsIGV0Yy4KKworICAgIC8vIE9ubHkgdXNlZCBhdCBnbG9iYWwgc2NvcGUgKGxldmVsIDEpOgorICAgIFN5bWJvbExpc3QgKnByb2dyYW1zOyAgIC8vIExpc3Qgb2YgcHJvZ3JhbXMgZm9yIHRoaXMgY29tcGlsYXRpb24uCit9OworCisKKy8vIFN5bWJvbCB0YWJsZSBpcyBhIHNpbXBsZSBiaW5hcnkgdHJlZS4KKworI2luY2x1ZGUgImNvbXBpbGVyL3ByZXByb2Nlc3Nvci9jcHAuaCIgICAgICAgIC8vIHRvIGdldCBNYWNyb1N5bWJvbCBkZWYKKworc3RydWN0IFN5bWJvbF9SZWMgeworICAgIFN5bWJvbCAqbGVmdCwgKnJpZ2h0OworICAgIFN5bWJvbCAqbmV4dDsKKyAgICBpbnQgbmFtZTsgICAgICAgLy8gTmFtZSBhdG9tCisgICAgU291cmNlTG9jIGxvYzsKKyAgICBzeW1ib2xraW5kIGtpbmQ7CisgICAgdW5pb24geworICAgICAgICBNYWNyb1N5bWJvbCBtYWM7CisgICAgfSBkZXRhaWxzOworfTsKKworZXh0ZXJuIFNjb3BlICpDdXJyZW50U2NvcGU7CitleHRlcm4gU2NvcGUgKkdsb2JhbFNjb3BlOworZXh0ZXJuIFNjb3BlICpTY29wZUxpc3Q7CisKK1Njb3BlICpOZXdTY29wZUluUG9vbChNZW1vcnlQb29sICopOworI2RlZmluZSBOZXdTY29wZSgpICAgICAgTmV3U2NvcGVJblBvb2woQ3VycmVudFNjb3BlLT5wb29sKQordm9pZCBQdXNoU2NvcGUoU2NvcGUgKmZTY29wZSk7CitTY29wZSAqUG9wU2NvcGUodm9pZCk7CitTeW1ib2wgKk5ld1N5bWJvbChTb3VyY2VMb2MgKmxvYywgU2NvcGUgKmZTY29wZSwgaW50IG5hbWUsIHN5bWJvbGtpbmQga2luZCk7CitTeW1ib2wgKkFkZFN5bWJvbChTb3VyY2VMb2MgKmxvYywgU2NvcGUgKmZTY29wZSwgaW50IGF0b20sIHN5bWJvbGtpbmQga2luZCk7CitTeW1ib2wgKkxvb2tVcExvY2FsU3ltYm9sKFNjb3BlICpmU2NvcGUsIGludCBhdG9tKTsKK1N5bWJvbCAqTG9va1VwU3ltYm9sKFNjb3BlICpmU2NvcGUsIGludCBhdG9tKTsKK3ZvaWQgQ1BQRXJyb3JUb0luZm9Mb2coY2hhciAqKTsKKworCisjZW5kaWYgLy8gIWRlZmluZWQoX19TWU1CT0xTX0gpCisKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci90b2tlbnMuYyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci90b2tlbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgzZDJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvcHJlcHJvY2Vzc29yL3Rva2Vucy5jCkBAIC0wLDAgKzEsNDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKK0NvcHlyaWdodCAoYykgMjAwMiwgTlZJRElBIENvcnBvcmF0aW9uLgorCitOVklESUEgQ29ycG9yYXRpb24oIk5WSURJQSIpIHN1cHBsaWVzIHRoaXMgc29mdHdhcmUgdG8geW91IGluCitjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwKK2luc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgTlZJRElBIHNvZnR3YXJlCitjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlCit0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBOVklESUEKK3NvZnR3YXJlLgorCitJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZAorc3ViamVjdCB0byB0aGVzZSB0ZXJtcywgTlZJRElBIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZQorbGljZW5zZSwgdW5kZXIgTlZJRElBJ3MgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIE5WSURJQSBzb2Z0d2FyZSAodGhlCisiTlZJRElBIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUKK05WSURJQSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Citmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBOVklESUEgU29mdHdhcmUsIHlvdSBtdXN0CityZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2Ugb2YgTlZJRElBLCB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwordGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBOVklESUEgU29mdHdhcmUuCitOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG5vciBsb2dvcyBvZiBOVklESUEKK0NvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCitOVklESUEgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOVklESUEuCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzCitleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IE5WSURJQSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUKK3dvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBOVklESUEgU29mdHdhcmUgbWF5IGJlCitpbmNvcnBvcmF0ZWQuIE5vIGhhcmR3YXJlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCisKK1RIRSBOVklESUEgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELAorSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IKK0lUUyBVU0UgQU5EIE9QRVJBVElPTiBFSVRIRVIgQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBPVEhFUgorUFJPRFVDVFMuCisKK0lOIE5PIEVWRU5UIFNIQUxMIE5WSURJQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIEVYRU1QTEFSWSwgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIExPU1QgUFJPRklUUzsgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIE9SIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFCitOVklESUEgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwKK1RPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYKK05WSURJQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIHRva2Vucy5jCisvLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiY29tcGlsZXIvZGVidWcuaCIKKyNpbmNsdWRlICJjb21waWxlci9wcmVwcm9jZXNzb3Ivc2xnbG9iYWxzLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvdXRpbC5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFByZXByb2Nlc3NvciBhbmQgVG9rZW4gUmVjb3JkZXIgYW5kIFBsYXliYWNrOiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgKiBpZHN0cigpCisgKiBDb3B5IGEgc3RyaW5nIHRvIGEgbWFsbG9jJ2VkIGJsb2NrIGFuZCBjb252ZXJ0IGl0IGludG8gc29tZXRoaW5nIHN1aXRhYmxlCisgKiBmb3IgYW4gSUQKKyAqCisgKi8KKworc3RhdGljIGNoYXIgKmlkc3RyKGNvbnN0IGNoYXIgKmZzdHIsIE1lbW9yeVBvb2wgKnBvb2wpCit7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyICpzdHIsICp0OworICAgIGNvbnN0IGNoYXIgKmY7CisKKyAgICBsZW4gPSBzdHJsZW4oZnN0cik7CisgICAgaWYgKCFwb29sKQorICAgICAgICBzdHIgPSAoY2hhciAqKSBtYWxsb2MobGVuICsgMSk7CisgICAgZWxzZQorICAgICAgICBzdHIgPSAoY2hhciAqKSBtZW1fQWxsb2MocG9vbCwgbGVuICsgMSk7CisgICAgCisgICAgZm9yIChmPWZzdHIsIHQ9c3RyOyAqZjsgZisrKSB7CisgICAgICAgIGlmIChpc2FsbnVtKCpmKSkgKnQrKyA9ICpmOworICAgICAgICBlbHNlIGlmICgqZiA9PSAnLicgfHwgKmYgPT0gJy8nKSAqdCsrID0gJ18nOworICAgIH0KKyAgICAqdCA9IDA7CisgICAgcmV0dXJuIHN0cjsKK30gLy8gaWRzdHIKKworCisvKgorICogbE5ld0Jsb2NrKCkKKyAqCisgKi8KKworc3RhdGljIFRva2VuQmxvY2sgKmxOZXdCbG9jayhUb2tlblN0cmVhbSAqZlRvaywgTWVtb3J5UG9vbCAqcG9vbCkKK3sKKyAgICBUb2tlbkJsb2NrICpsQmxvY2s7CisKKyAgICBpZiAoIXBvb2wpCisgICAgICAgIGxCbG9jayA9IChUb2tlbkJsb2NrICopIG1hbGxvYyhzaXplb2YoVG9rZW5CbG9jaykgKyAyNTYpOworICAgIGVsc2UKKyAgICAgICAgbEJsb2NrID0gKFRva2VuQmxvY2sgKikgbWVtX0FsbG9jKHBvb2wsIHNpemVvZihUb2tlbkJsb2NrKSArIDI1Nik7CisgICAgbEJsb2NrLT5jb3VudCA9IDA7CisgICAgbEJsb2NrLT5jdXJyZW50ID0gMDsKKyAgICBsQmxvY2stPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSBsQmxvY2sgKyBzaXplb2YoVG9rZW5CbG9jayk7CisgICAgbEJsb2NrLT5tYXggPSAyNTY7CisgICAgbEJsb2NrLT5uZXh0ID0gTlVMTDsKKyAgICBpZiAoZlRvay0+aGVhZCkgeworICAgICAgICBmVG9rLT5jdXJyZW50LT5uZXh0ID0gbEJsb2NrOworICAgIH0gZWxzZSB7CisgICAgICAgIGZUb2stPmhlYWQgPSBsQmxvY2s7CisgICAgfQorICAgIGZUb2stPmN1cnJlbnQgPSBsQmxvY2s7CisgICAgcmV0dXJuIGxCbG9jazsKK30gLy8gbE5ld0Jsb2NrCisKKy8qCisgKiBsQWRkQnl0ZSgpCisgKgorICovCisKK3N0YXRpYyB2b2lkIGxBZGRCeXRlKFRva2VuU3RyZWFtICpmVG9rLCB1bnNpZ25lZCBjaGFyIGZWYWwpCit7CisgICAgVG9rZW5CbG9jayAqbEJsb2NrOworICAgIGxCbG9jayA9IGZUb2stPmN1cnJlbnQ7CisgICAgaWYgKGxCbG9jay0+Y291bnQgPj0gbEJsb2NrLT5tYXgpCisgICAgICAgIGxCbG9jayA9IGxOZXdCbG9jayhmVG9rLCAwKTsKKyAgICBsQmxvY2stPmRhdGFbbEJsb2NrLT5jb3VudCsrXSA9IGZWYWw7Cit9IC8vIGxBZGRCeXRlCisKKworCisvKgorICogbFJlYWRCeXRlKCkgLSBHZXQgdGhlIG5leHQgYnl0ZSBmcm9tIGEgc3RyZWFtLgorICoKKyAqLworCitzdGF0aWMgaW50IGxSZWFkQnl0ZShUb2tlblN0cmVhbSAqcFRvaykKK3sKKyAgICBUb2tlbkJsb2NrICpsQmxvY2s7CisgICAgaW50IGx2YWwgPSAtMTsKKworICAgIGxCbG9jayA9IHBUb2stPmN1cnJlbnQ7CisgICAgaWYgKGxCbG9jaykgeworICAgICAgICBpZiAobEJsb2NrLT5jdXJyZW50ID49IGxCbG9jay0+Y291bnQpIHsKKyAgICAgICAgICAgIGxCbG9jayA9IGxCbG9jay0+bmV4dDsKKyAgICAgICAgICAgIGlmIChsQmxvY2spCisgICAgICAgICAgICAgICAgbEJsb2NrLT5jdXJyZW50ID0gMDsKKyAgICAgICAgICAgIHBUb2stPmN1cnJlbnQgPSBsQmxvY2s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxCbG9jaykKKyAgICAgICAgICAgIGx2YWwgPSBsQmxvY2stPmRhdGFbbEJsb2NrLT5jdXJyZW50KytdOworICAgIH0KKyAgICByZXR1cm4gbHZhbDsKK30gLy8gbFJlYWRCeXRlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHbG9iYWwgRnVuY3Rpb25zOi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgKiBOZXdUb2tlblN0cmVhbSgpCisgKgorICovCisKK1Rva2VuU3RyZWFtICpOZXdUb2tlblN0cmVhbShjb25zdCBjaGFyICpuYW1lLCBNZW1vcnlQb29sICpwb29sKQoreworICAgIFRva2VuU3RyZWFtICpwVG9rOworCisgICAgaWYgKCFwb29sKQorICAgICAgICBwVG9rID0gKFRva2VuU3RyZWFtICopIG1hbGxvYyhzaXplb2YoVG9rZW5TdHJlYW0pKTsKKyAgICBlbHNlCisgICAgICAgIHBUb2sgPSAoVG9rZW5TdHJlYW0qKW1lbV9BbGxvYyhwb29sLCBzaXplb2YoVG9rZW5TdHJlYW0pKTsKKyAgICBwVG9rLT5uZXh0ID0gTlVMTDsKKyAgICBwVG9rLT5uYW1lID0gaWRzdHIobmFtZSwgcG9vbCk7CisgICAgcFRvay0+aGVhZCA9IE5VTEw7CisgICAgcFRvay0+Y3VycmVudCA9IE5VTEw7CisgICAgbE5ld0Jsb2NrKHBUb2ssIHBvb2wpOworICAgIHJldHVybiBwVG9rOworfSAvLyBOZXdUb2tlblN0cmVhbQorCisvKgorICogRGVsZXRlVG9rZW5TdHJlYW0oKQorICoKKyAqLworCit2b2lkIERlbGV0ZVRva2VuU3RyZWFtKFRva2VuU3RyZWFtICpwVG9rKQoreworICAgIFRva2VuQmxvY2sgKnBCbG9jaywgKm5CbG9jazsKKworICAgIGlmIChwVG9rKSB7CisgICAgICAgIHBCbG9jayA9IHBUb2stPmhlYWQ7CisgICAgICAgIHdoaWxlIChwQmxvY2spIHsKKyAgICAgICAgICAgIG5CbG9jayA9IHBCbG9jay0+bmV4dDsKKyAgICAgICAgICAgIGZyZWUocEJsb2NrKTsKKyAgICAgICAgICAgIHBCbG9jayA9IG5CbG9jazsKKyAgICAgICAgfQorICAgICAgICBpZiAocFRvay0+bmFtZSkKKyAgICAgICAgICAgIGZyZWUocFRvay0+bmFtZSk7CisgICAgICAgIGZyZWUocFRvayk7CisgICAgfQorfSAvLyBEZWxldGVUb2tlblN0cmVhbQorCisvKgorICogUmVjb3JkVG9rZW4oKSAtIEFkZCBhIHRva2VuIHRvIHRoZSBlbmQgb2YgYSBsaXN0IGZvciBsYXRlciBwbGF5YmFjayBvciBwcmludG91dC4KKyAqCisgKi8KKwordm9pZCBSZWNvcmRUb2tlbihUb2tlblN0cmVhbSAqcFRvaywgaW50IHRva2VuLCB5eXN0eXBlcHAgKiB5eWx2YWxwcCkKK3sKKyAgICBjb25zdCBjaGFyICpzOworICAgIGNoYXIgKnN0cj1OVUxMOworCisgICAgaWYgKHRva2VuID4gMjU2KQorICAgICAgICBsQWRkQnl0ZShwVG9rLCAodW5zaWduZWQgY2hhcikoKHRva2VuICYgMHg3ZikgKyAweDgwKSk7CisgICAgZWxzZQorICAgICAgICBsQWRkQnl0ZShwVG9rLCAodW5zaWduZWQgY2hhcikodG9rZW4gJiAweDdmKSk7CisgICAgc3dpdGNoICh0b2tlbikgeworICAgIGNhc2UgQ1BQX0lERU5USUZJRVI6CisgICAgY2FzZSBDUFBfVFlQRUlERU5USUZJRVI6CisgICAgY2FzZSBDUFBfU1RSQ09OU1RBTlQ6CisgICAgICAgIHMgPSBHZXRBdG9tU3RyaW5nKGF0YWJsZSwgeXlsdmFscHAtPnNjX2lkZW50KTsKKyAgICAgICAgd2hpbGUgKCpzKQorICAgICAgICAgICAgbEFkZEJ5dGUocFRvaywgKHVuc2lnbmVkIGNoYXIpICpzKyspOworICAgICAgICBsQWRkQnl0ZShwVG9rLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUFBfRkxPQVRDT05TVEFOVDoKKyAgICBjYXNlIENQUF9JTlRDT05TVEFOVDoKKyAgICAgICAgIHN0cj15eWx2YWxwcC0+c3ltYm9sX25hbWU7CisgICAgICAgICB3aGlsZSAoKnN0cil7CisgICAgICAgICAgICBsQWRkQnl0ZShwVG9rLCAodW5zaWduZWQgY2hhcikgKnN0cisrKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGxBZGRCeXRlKHBUb2ssIDApOworICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnKCc6CisgICAgICAgIGxBZGRCeXRlKHBUb2ssICh1bnNpZ25lZCBjaGFyKSh5eWx2YWxwcC0+c2NfaW50ID8gMSA6IDApKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9IC8vIFJlY29yZFRva2VuCisKKy8qCisgKiBSZXdpbmRUb2tlblN0cmVhbSgpIC0gUmVzZXQgYSB0b2tlbiBzdHJlYW0gaW4gcHJlcGVyYXRpb24gZm9yIHJlYWRpbmcuCisgKgorICovCisKK3ZvaWQgUmV3aW5kVG9rZW5TdHJlYW0oVG9rZW5TdHJlYW0gKnBUb2spCit7CisgICAgaWYgKHBUb2stPmhlYWQpIHsKKyAgICAgICAgcFRvay0+Y3VycmVudCA9IHBUb2stPmhlYWQ7CisgICAgICAgIHBUb2stPmN1cnJlbnQtPmN1cnJlbnQgPSAwOworICAgIH0KK30gLy8gUmV3aW5kVG9rZW5TdHJlYW0KKworLyoKKyAqIFJlYWRUb2tlbigpIC0gUmVhZCB0aGUgbmV4dCB0b2tlbiBmcm9tIGEgc3RyZWFtLgorICoKKyAqLworCitpbnQgUmVhZFRva2VuKFRva2VuU3RyZWFtICpwVG9rLCB5eXN0eXBlcHAgKiB5eWx2YWxwcCkKK3sKKyAgICBjaGFyIHN5bWJvbF9uYW1lW01BWF9TWU1CT0xfTkFNRV9MRU4gKyAxXTsKKyAgICBjaGFyIHN0cmluZ192YWxbTUFYX1NUUklOR19MRU4gKyAxXTsKKyAgICBpbnQgbHRva2VuLCBsZW47CisgICAgY2hhciBjaDsKKworICAgIGx0b2tlbiA9IGxSZWFkQnl0ZShwVG9rKTsKKyAgICBpZiAobHRva2VuID49IDApIHsKKyAgICAgICAgaWYgKGx0b2tlbiA+IDEyNykKKyAgICAgICAgICAgIGx0b2tlbiArPSAxMjg7CisgICAgICAgIHN3aXRjaCAobHRva2VuKSB7CisgICAgICAgIGNhc2UgQ1BQX0lERU5USUZJRVI6CisgICAgICAgIGNhc2UgQ1BQX1RZUEVJREVOVElGSUVSOgorICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgIGNoID0gbFJlYWRCeXRlKHBUb2spOworICAgICAgICAgICAgd2hpbGUgKChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fAorICAgICAgICAgICAgICAgICAgICAgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgICAgICAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgICAgICAgIGNoID09ICdfJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgTUFYX1NZTUJPTF9OQU1FX0xFTikgeworICAgICAgICAgICAgICAgICAgICBzeW1ib2xfbmFtZVtsZW4rK10gPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSBsUmVhZEJ5dGUocFRvayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ltYm9sX25hbWVbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICBhc3NlcnQoY2ggPT0gJ1wwJyk7CisgICAgICAgICAgICB5eWx2YWxwcC0+c2NfaWRlbnQgPSBMb29rVXBBZGRTdHJpbmcoYXRhYmxlLCBzeW1ib2xfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQ1BQX0lERU5USUZJRVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFBfU1RSQ09OU1RBTlQ6CisgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgd2hpbGUgKChjaCA9IGxSZWFkQnl0ZShwVG9rKSkgIT0gMCkKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgTUFYX1NUUklOR19MRU4pCisgICAgICAgICAgICAgICAgICAgIHN0cmluZ192YWxbbGVuKytdID0gY2g7CisgICAgICAgICAgICBzdHJpbmdfdmFsW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgeXlsdmFscHAtPnNjX2lkZW50ID0gTG9va1VwQWRkU3RyaW5nKGF0YWJsZSwgc3RyaW5nX3ZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFBfRkxPQVRDT05TVEFOVDoKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICBjaCA9IGxSZWFkQnl0ZShwVG9rKTsKKyAgICAgICAgICAgIHdoaWxlICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyl8fChjaD09J2UnfHxjaD09J0UnfHxjaD09Jy4nKXx8KGNoPT0nKyd8fGNoPT0nLScpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChsZW4gPCBNQVhfU1lNQk9MX05BTUVfTEVOKSB7CisgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9uYW1lW2xlbisrXSA9IGNoOworICAgICAgICAgICAgICAgICAgICBjaCA9IGxSZWFkQnl0ZShwVG9rKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW1ib2xfbmFtZVtsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIGFzc2VydChjaCA9PSAnXDAnKTsKKyAgICAgICAgICAgIHN0cmNweSh5eWx2YWxwcC0+c3ltYm9sX25hbWUsc3ltYm9sX25hbWUpOworICAgICAgICAgICAgeXlsdmFscHAtPnNjX2Z2YWw9KGZsb2F0KWF0b2ZfZG90KHl5bHZhbHBwLT5zeW1ib2xfbmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUFBfSU5UQ09OU1RBTlQ6CisgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgY2ggPSBsUmVhZEJ5dGUocFRvayk7CisgICAgICAgICAgICB3aGlsZSAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChsZW4gPCBNQVhfU1lNQk9MX05BTUVfTEVOKSB7CisgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9uYW1lW2xlbisrXSA9IGNoOworICAgICAgICAgICAgICAgICAgICBjaCA9IGxSZWFkQnl0ZShwVG9rKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW1ib2xfbmFtZVtsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIGFzc2VydChjaCA9PSAnXDAnKTsKKyAgICAgICAgICAgIHN0cmNweSh5eWx2YWxwcC0+c3ltYm9sX25hbWUsc3ltYm9sX25hbWUpOworICAgICAgICAgICAgeXlsdmFscHAtPnNjX2ludD1hdG9pKHl5bHZhbHBwLT5zeW1ib2xfbmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICB5eWx2YWxwcC0+c2NfaW50ID0gbFJlYWRCeXRlKHBUb2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGx0b2tlbjsKKyAgICB9CisgICAgcmV0dXJuIEVPRl9TWTsKK30gLy8gUmVhZFRva2VuCisKK3R5cGVkZWYgc3RydWN0IFRva2VuSW5wdXRTcmMgeworICAgIElucHV0U3JjICAgICAgICAgICAgYmFzZTsKKyAgICBUb2tlblN0cmVhbSAgICAgICAgICp0b2tlbnM7CisgICAgaW50ICAgICAgICAgICAgICAgICAoKmZpbmFsKShDUFBTdHJ1Y3QgKik7Cit9IFRva2VuSW5wdXRTcmM7CisKK3N0YXRpYyBpbnQgc2Nhbl90b2tlbihUb2tlbklucHV0U3JjICppbiwgeXlzdHlwZXBwICogeXlsdmFscHApCit7CisgICAgaW50IHRva2VuID0gUmVhZFRva2VuKGluLT50b2tlbnMsIHl5bHZhbHBwKTsKKyAgICBpbnQgKCpmaW5hbCkoQ1BQU3RydWN0ICopOworICAgIGNwcC0+dG9rZW5Mb2MtPmZpbGUgPSBjcHAtPmN1cnJlbnRJbnB1dC0+bmFtZTsKKyAgICBjcHAtPnRva2VuTG9jLT5saW5lID0gY3BwLT5jdXJyZW50SW5wdXQtPmxpbmU7CisgICAgaWYgKHRva2VuID09ICdcbicpIHsKKyAgICAgICAgaW4tPmJhc2UubGluZSsrOworICAgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorICAgIGlmICh0b2tlbiA+IDApIHJldHVybiB0b2tlbjsKKyAgICBjcHAtPmN1cnJlbnRJbnB1dCA9IGluLT5iYXNlLnByZXY7CisgICAgZmluYWwgPSBpbi0+ZmluYWw7CisgICAgZnJlZShpbik7CisgICAgaWYgKGZpbmFsICYmICFmaW5hbChjcHApKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIGNwcC0+Y3VycmVudElucHV0LT5zY2FuKGNwcC0+Y3VycmVudElucHV0LCB5eWx2YWxwcCk7Cit9CisKK2ludCBSZWFkRnJvbVRva2VuU3RyZWFtKFRva2VuU3RyZWFtICp0cywgaW50IG5hbWUsIGludCAoKmZpbmFsKShDUFBTdHJ1Y3QgKikpCit7CisgICAgVG9rZW5JbnB1dFNyYyAqaW4gPSBtYWxsb2Moc2l6ZW9mKFRva2VuSW5wdXRTcmMpKTsKKyAgICBtZW1zZXQoaW4sIDAsIHNpemVvZihUb2tlbklucHV0U3JjKSk7CisgICAgaW4tPmJhc2UubmFtZSA9IG5hbWU7CisgICAgaW4tPmJhc2UucHJldiA9IGNwcC0+Y3VycmVudElucHV0OworICAgIGluLT5iYXNlLnNjYW4gPSAoaW50ICgqKShJbnB1dFNyYyAqLCB5eXN0eXBlcHAgKikpc2Nhbl90b2tlbjsKKyAgICBpbi0+YmFzZS5saW5lID0gMTsKKyAgICBpbi0+dG9rZW5zID0gdHM7CisgICAgaW4tPmZpbmFsID0gZmluYWw7CisgICAgUmV3aW5kVG9rZW5TdHJlYW0odHMpOworICAgIGNwcC0+Y3VycmVudElucHV0ID0gJmluLT5iYXNlOworICAgIHJldHVybiAxOworfQorCit0eXBlZGVmIHN0cnVjdCBVbmdvdFRva2VuIHsKKyAgICBJbnB1dFNyYyAgICBiYXNlOworICAgIGludCAgICAgICAgIHRva2VuOworICAgIHl5c3R5cGVwcCAgICAgbHZhbDsKK30gVW5nb3RUb2tlbjsKKworc3RhdGljIGludCByZWdldF90b2tlbihVbmdvdFRva2VuICp0LCB5eXN0eXBlcHAgKiB5eWx2YWxwcCkKK3sKKyAgICBpbnQgdG9rZW4gPSB0LT50b2tlbjsKKyAgICAqeXlsdmFscHAgPSB0LT5sdmFsOworICAgIGNwcC0+Y3VycmVudElucHV0ID0gdC0+YmFzZS5wcmV2OworICAgIGZyZWUodCk7CisgICAgcmV0dXJuIHRva2VuOworfQorCit2b2lkIFVuZ2V0VG9rZW4oaW50IHRva2VuLCB5eXN0eXBlcHAgKiB5eWx2YWxwcCkgeworICAgIFVuZ290VG9rZW4gKnQgPSBtYWxsb2Moc2l6ZW9mKFVuZ290VG9rZW4pKTsKKyAgICBtZW1zZXQodCwgMCwgc2l6ZW9mKFVuZ290VG9rZW4pKTsKKyAgICB0LT50b2tlbiA9IHRva2VuOworICAgIHQtPmx2YWwgPSAqeXlsdmFscHA7CisgICAgdC0+YmFzZS5zY2FuID0gKHZvaWQgKilyZWdldF90b2tlbjsKKyAgICB0LT5iYXNlLnByZXYgPSBjcHAtPmN1cnJlbnRJbnB1dDsKKyAgICB0LT5iYXNlLm5hbWUgPSBjcHAtPmN1cnJlbnRJbnB1dC0+bmFtZTsKKyAgICB0LT5iYXNlLmxpbmUgPSBjcHAtPmN1cnJlbnRJbnB1dC0+bGluZTsKKyAgICBjcHAtPmN1cnJlbnRJbnB1dCA9ICZ0LT5iYXNlOworfQorCisKK3ZvaWQgRHVtcFRva2VuU3RyZWFtKEZJTEUgKmZwLCBUb2tlblN0cmVhbSAqcywgeXlzdHlwZXBwICogeXlsdmFscHApIHsKKyAgICBpbnQgdG9rZW47CisgICAgY2hhciBzdHJbMTAwXTsKKworICAgIGlmIChmcCA9PSAwKSBmcCA9IHN0ZG91dDsKKyAgICBSZXdpbmRUb2tlblN0cmVhbShzKTsKKyAgICB3aGlsZSAoKHRva2VuID0gUmVhZFRva2VuKHMsIHl5bHZhbHBwKSkgPiAwKSB7CisgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKKyAgICAgICAgY2FzZSBDUFBfSURFTlRJRklFUjoKKyAgICAgICAgY2FzZSBDUFBfVFlQRUlERU5USUZJRVI6CisgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzICIsIEdldEF0b21TdHJpbmcoYXRhYmxlLCB5eWx2YWxwcC0+c2NfaWRlbnQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQUF9TVFJDT05TVEFOVDoKKyAgICAgICAgICAgIHNwcmludGYoc3RyLCAiXCIlc1wiIiwgR2V0QXRvbVN0cmluZyhhdGFibGUsIHl5bHZhbHBwLT5zY19pZGVudCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BQX0ZMT0FUQ09OU1RBTlQ6CisgICAgICAgICAgICAvL3ByaW50ZigiJWc5LjYgIiwgeXlsdmFscHAtPnNjX2Z2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BQX0lOVENPTlNUQU5UOgorICAgICAgICAgICAgLy9wcmludGYoIiVkICIsIHl5bHZhbHBwLT5zY19pbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAodG9rZW4gPj0gMTI3KQorICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMgIiwgR2V0QXRvbVN0cmluZyhhdGFibGUsIHRva2VuKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlYyIsIHRva2VuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIENQUERlYnVnTG9nTXNnKHN0cik7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEVuZCBvZiB0b2tlbnMuYyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvdG9rZW5zLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci9wcmVwcm9jZXNzb3IvdG9rZW5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2NmRmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3ByZXByb2Nlc3Nvci90b2tlbnMuaApAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKK0NvcHlyaWdodCAoYykgMjAwMiwgTlZJRElBIENvcnBvcmF0aW9uLgorCitOVklESUEgQ29ycG9yYXRpb24oIk5WSURJQSIpIHN1cHBsaWVzIHRoaXMgc29mdHdhcmUgdG8geW91IGluCitjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwKK2luc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgTlZJRElBIHNvZnR3YXJlCitjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlCit0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBOVklESUEKK3NvZnR3YXJlLgorCitJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZAorc3ViamVjdCB0byB0aGVzZSB0ZXJtcywgTlZJRElBIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZQorbGljZW5zZSwgdW5kZXIgTlZJRElBJ3MgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIE5WSURJQSBzb2Z0d2FyZSAodGhlCisiTlZJRElBIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUKK05WSURJQSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Citmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBOVklESUEgU29mdHdhcmUsIHlvdSBtdXN0CityZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2Ugb2YgTlZJRElBLCB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwordGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBOVklESUEgU29mdHdhcmUuCitOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG5vciBsb2dvcyBvZiBOVklESUEKK0NvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCitOVklESUEgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOVklESUEuCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzCitleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IE5WSURJQSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUKK3dvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBOVklESUEgU29mdHdhcmUgbWF5IGJlCitpbmNvcnBvcmF0ZWQuIE5vIGhhcmR3YXJlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCisKK1RIRSBOVklESUEgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELAorSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IKK0lUUyBVU0UgQU5EIE9QRVJBVElPTiBFSVRIRVIgQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBPVEhFUgorUFJPRFVDVFMuCisKK0lOIE5PIEVWRU5UIFNIQUxMIE5WSURJQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIEVYRU1QTEFSWSwgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIExPU1QgUFJPRklUUzsgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIE9SIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFCitOVklESUEgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwKK1RPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYKK05WSURJQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIHRva2Vucy5oCisvLworCisjaWYgIWRlZmluZWQoX19UT0tFTlNfSCkKKyNkZWZpbmUgX19UT0tFTlNfSCAxCisKKyNpbmNsdWRlICJjb21waWxlci9wcmVwcm9jZXNzb3IvcGFyc2VyLmgiCisKKyNkZWZpbmUgRU9GX1NZICgtMSkKKwordHlwZWRlZiBzdHJ1Y3QgVG9rZW5CbG9ja19SZWMgVG9rZW5CbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgVG9rZW5TdHJlYW1fUmVjIHsKKyAgICBzdHJ1Y3QgVG9rZW5TdHJlYW1fUmVjICpuZXh0OworICAgIGNoYXIgKm5hbWU7CisgICAgVG9rZW5CbG9jayAqaGVhZDsKKyAgICBUb2tlbkJsb2NrICpjdXJyZW50OworfSBUb2tlblN0cmVhbTsKKworc3RydWN0IFRva2VuQmxvY2tfUmVjIHsKKyAgICBUb2tlbkJsb2NrICpuZXh0OworICAgIGludCBjdXJyZW50OworICAgIGludCBjb3VudDsKKyAgICBpbnQgbWF4OworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Cit9OworCitleHRlcm4gVG9rZW5TdHJlYW0gc3RkbGliX2NwcF9zdHJlYW07CisKKworVG9rZW5TdHJlYW0gKk5ld1Rva2VuU3RyZWFtKGNvbnN0IGNoYXIgKm5hbWUsIE1lbW9yeVBvb2wgKnBvb2wpOwordm9pZCBEZWxldGVUb2tlblN0cmVhbShUb2tlblN0cmVhbSAqcFRvayk7IAordm9pZCBSZWNvcmRUb2tlbihUb2tlblN0cmVhbSAqcFRvaywgaW50IHRva2VuLCB5eXN0eXBlcHAgKiB5eWx2YWxwcCk7Cit2b2lkIFJld2luZFRva2VuU3RyZWFtKFRva2VuU3RyZWFtICpwVG9rKTsKK2ludCBSZWFkVG9rZW4oVG9rZW5TdHJlYW0gKnBUb2ssIHl5c3R5cGVwcCAqIHl5bHZhbHBwKTsKK2ludCBSZWFkRnJvbVRva2VuU3RyZWFtKFRva2VuU3RyZWFtICpwVG9rLCBpbnQgbmFtZSwgaW50ICgqZmluYWwpKENQUFN0cnVjdCAqKSk7Cit2b2lkIFVuZ2V0VG9rZW4oaW50LCB5eXN0eXBlcHAgKiB5eWx2YWxwcCk7CisKKyNpZiBkZWZpbmVkKENQUENfRU5BQkxFX1RPT0xTKQorCit2b2lkIER1bXBUb2tlblN0cmVhbShGSUxFICosIFRva2VuU3RyZWFtICosIHl5c3R5cGVwcCAqIHl5bHZhbHBwKTsKKworI2VuZGlmIC8vIGRlZmluZWQoQ1BQQ19FTkFCTEVfVE9PTFMpCisKKyNlbmRpZiAvLyAhZGVmaW5lZChfX1RPS0VOU19IKQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvdHJhbnNsYXRvcl9jb21tb24udmN4cHJvaiBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3RyYW5zbGF0b3JfY29tbW9uLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5NzRkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3RyYW5zbGF0b3JfY29tbW9uLnZjeHByb2oKQEAgLTAsMCArMSwxODAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPns1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9PC9Qcm9qZWN0R3VpZD4NCisgICAgPFJvb3ROYW1lc3BhY2U+Y29tcGlsZXI8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDMxOS4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEluY2x1ZGVQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4uLlxpbmNsdWRlOyQoRFhTREtfRElSKVxJbmNsdWRlOyQoVkNJbnN0YWxsRGlyKVBsYXRmb3JtU0RLXGluY2x1ZGU7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPg0KKyAgICA8SW5jbHVkZVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Li5caW5jbHVkZTskKERYU0RLX0RJUilcSW5jbHVkZTskKFZDSW5zdGFsbERpcilQbGF0Zm9ybVNES1xpbmNsdWRlOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKTskKFByb2plY3REaXIpLi4vOyQoUHJvamVjdERpcikuLi8uLi9pbmNsdWRlOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfTElCO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtOT01JTk1BWDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKTskKFByb2plY3REaXIpLi4vOyQoUHJvamVjdERpcikuLi8uLi9pbmNsdWRlOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfTElCO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtOT01JTk1BWDtfU0VDVVJFX1NDTD0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iQ29tcGlsZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImRlYnVnLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEZXRlY3RSZWN1cnNpb24uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkluZm9TaW5rLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJJbml0aWFsaXplLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJJbml0aWFsaXplRGxsLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJJbnRlcm1lZGlhdGUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImludGVybU91dC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iSW50ZXJtVHJhdmVyc2UuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ik1hcExvbmdWYXJpYWJsZU5hbWVzLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJvc3NvdXJjZV93aW4uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InBhcnNlQ29uc3QuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlBhcnNlSGVscGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJQb29sQWxsb2MuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlF1YWxpZmllckFsaXZlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJSZW1vdmVUcmVlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJTaGFkZXJMYW5nLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJTeW1ib2xUYWJsZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0idXRpbC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iVmFsaWRhdGVMaW1pdGF0aW9ucy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iVmFyaWFibGVJbmZvLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJwcmVwcm9jZXNzb3JcYXRvbS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InByZXByb2Nlc3NvclxjcHAuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJwcmVwcm9jZXNzb3JcY3Bwc3RydWN0LmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXG1lbW9yeS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InByZXByb2Nlc3NvclxzY2FubmVyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXHN5bWJvbHMuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJwcmVwcm9jZXNzb3JcdG9rZW5zLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZ2xzbGFuZ19sZXguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Imdsc2xhbmdfdGFiLmNwcCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEN1c3RvbUJ1aWxkIEluY2x1ZGU9Imdsc2xhbmcubCI+DQorICAgICAgPE1lc3NhZ2UgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICAgIDwvTWVzc2FnZT4NCisgICAgICA8Q29tbWFuZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgICAgPC9Db21tYW5kPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5wdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKEFkZGl0aW9uYWxJbnB1dHMpPC9BZGRpdGlvbmFsSW5wdXRzPg0KKyAgICAgIDxPdXRwdXRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICAgIDxNZXNzYWdlIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICAgIDwvTWVzc2FnZT4NCisgICAgICA8Q29tbWFuZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgICA8L0NvbW1hbmQ+DQorICAgICAgPEFkZGl0aW9uYWxJbnB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5wdXRzKTwvQWRkaXRpb25hbElucHV0cz4NCisgICAgICA8T3V0cHV0cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICA8L0N1c3RvbUJ1aWxkPg0KKyAgICA8Q3VzdG9tQnVpbGQgSW5jbHVkZT0iZ2xzbGFuZy55Ij4NCisgICAgICA8TWVzc2FnZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgICAgPC9NZXNzYWdlPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgICA8L0NvbW1hbmQ+DQorICAgICAgPE91dHB1dHMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoT3V0cHV0cyk8L091dHB1dHM+DQorICAgICAgPE1lc3NhZ2UgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgICAgPC9NZXNzYWdlPg0KKyAgICAgIDxDb21tYW5kIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICAgIDwvQ29tbWFuZD4NCisgICAgICA8T3V0cHV0cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKE91dHB1dHMpPC9PdXRwdXRzPg0KKyAgICA8L0N1c3RvbUJ1aWxkPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkJhc2VUeXBlcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkNvbW1vbi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkNvbnN0YW50VW5pb24uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJkZWJ1Zy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRldGVjdFJlY3Vyc2lvbi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkluZm9TaW5rLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iSW5pdGlhbGl6ZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkluaXRpYWxpemVEbGwuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJJbml0aWFsaXplR2xvYmFscy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkluaXRpYWxpemVQYXJzZUNvbnRleHQuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJpbnRlcm1lZGlhdGUuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJsb2NhbGludGVybWVkaWF0ZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ik1hcExvbmdWYXJpYWJsZU5hbWVzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iTU1hcC5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Im9zaW5jbHVkZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlBhcnNlSGVscGVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iUG9vbEFsbG9jLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iUXVhbGlmaWVyQWxpdmUuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJSZW1vdmVUcmVlLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxHTFNMQU5HXFJlc291cmNlTGltaXRzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxHTFNMQU5HXFNoYWRlckxhbmcuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJTaEhhbmRsZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlN5bWJvbFRhYmxlLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iVHlwZXMuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ1dGlsLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iVmFsaWRhdGVMaW1pdGF0aW9ucy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlZhcmlhYmxlSW5mby5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InByZXByb2Nlc3NvclxhdG9tLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXGNvbXBpbGUuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJwcmVwcm9jZXNzb3JcY3BwLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXG1lbW9yeS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InByZXByb2Nlc3NvclxwYXJzZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJwcmVwcm9jZXNzb3JccHJlcHJvY2Vzcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InByZXByb2Nlc3NvclxzY2FubmVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXHNsZ2xvYmFscy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InByZXByb2Nlc3NvclxzeW1ib2xzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXHRva2Vucy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Imdsc2xhbmdfdGFiLmgiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvdHJhbnNsYXRvcl9jb21tb24udmN4cHJvai5maWx0ZXJzIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvdHJhbnNsYXRvcl9jb21tb24udmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmQxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci90cmFuc2xhdG9yX2NvbW1vbi52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSwyNDEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214PC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNccHJlcHJvY2Vzc29yIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MDFhYzliM2MtMDNhNS00YWMxLWFmNWEtNTlmY2YwMjU4NTk1fTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzXGdlbmVyYXRlZCI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezFhZGQ0NDA2LWQxOTMtNGM0ZS1hOGVjLWM0MWM4ZDBiZDQ5OX08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM7eHNkPC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXNccHJlcHJvY2Vzc29yIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjMxODRkNzgtNTI2MS00Yjg1LWE1NmMtMWM2OWU2MjZjZGYzfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzXGdlbmVyYXRlZCI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2E1NmExNzcxLTQ3OTktNDdhYy1hY2U5LTY5NTVkZDNmMDU1Yn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkNvbXBpbGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZGVidWcuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJJbmZvU2luay5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkluaXRpYWxpemUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJJbml0aWFsaXplRGxsLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iSW50ZXJtZWRpYXRlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iaW50ZXJtT3V0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iSW50ZXJtVHJhdmVyc2UuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJNYXBMb25nVmFyaWFibGVOYW1lcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Im9zc291cmNlX3dpbi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InBhcnNlQ29uc3QuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJQYXJzZUhlbHBlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlBvb2xBbGxvYy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlF1YWxpZmllckFsaXZlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iUmVtb3ZlVHJlZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlNoYWRlckxhbmcuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJTeW1ib2xUYWJsZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InV0aWwuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJWYWxpZGF0ZUxpbWl0YXRpb25zLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iVmFyaWFibGVJbmZvLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXGF0b20uYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InByZXByb2Nlc3NvclxjcHAuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InByZXByb2Nlc3NvclxjcHBzdHJ1Y3QuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InByZXByb2Nlc3NvclxtZW1vcnkuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InByZXByb2Nlc3NvclxzY2FubmVyLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXHByZXByb2Nlc3NvcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJwcmVwcm9jZXNzb3Jcc3ltYm9scy5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xwcmVwcm9jZXNzb3I8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXHRva2Vucy5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xwcmVwcm9jZXNzb3I8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZ2xzbGFuZ19sZXguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW5lcmF0ZWQ8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZ2xzbGFuZ190YWIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW5lcmF0ZWQ8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGV0ZWN0UmVjdXJzaW9uLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iQmFzZVR5cGVzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkNvbW1vbi5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJDb25zdGFudFVuaW9uLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImRlYnVnLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkluZm9TaW5rLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkluaXRpYWxpemUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iSW5pdGlhbGl6ZURsbC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJJbml0aWFsaXplR2xvYmFscy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJJbml0aWFsaXplUGFyc2VDb250ZXh0LmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImludGVybWVkaWF0ZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJsb2NhbGludGVybWVkaWF0ZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJNYXBMb25nVmFyaWFibGVOYW1lcy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJNTWFwLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Im9zaW5jbHVkZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJQYXJzZUhlbHBlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJQb29sQWxsb2MuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iUXVhbGlmaWVyQWxpdmUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iUmVtb3ZlVHJlZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXEdMU0xBTkdcUmVzb3VyY2VMaW1pdHMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxHTFNMQU5HXFNoYWRlckxhbmcuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iU2hIYW5kbGUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iU3ltYm9sVGFibGUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iVHlwZXMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idXRpbC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJWYWxpZGF0ZUxpbWl0YXRpb25zLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlZhcmlhYmxlSW5mby5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJwcmVwcm9jZXNzb3JcYXRvbS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xwcmVwcm9jZXNzb3I8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXGNvbXBpbGUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InByZXByb2Nlc3NvclxjcHAuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InByZXByb2Nlc3NvclxtZW1vcnkuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InByZXByb2Nlc3NvclxwYXJzZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InByZXByb2Nlc3NvclxwcmVwcm9jZXNzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXHByZXByb2Nlc3NvcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJwcmVwcm9jZXNzb3Jcc2Nhbm5lci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xwcmVwcm9jZXNzb3I8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXHNsZ2xvYmFscy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xwcmVwcm9jZXNzb3I8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icHJlcHJvY2Vzc29yXHN5bWJvbHMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InByZXByb2Nlc3Nvclx0b2tlbnMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNccHJlcHJvY2Vzc29yPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Imdsc2xhbmdfdGFiLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXGdlbmVyYXRlZDwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEZXRlY3RSZWN1cnNpb24uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDdXN0b21CdWlsZCBJbmNsdWRlPSJnbHNsYW5nLmwiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ3VzdG9tQnVpbGQ+DQorICAgIDxDdXN0b21CdWlsZCBJbmNsdWRlPSJnbHNsYW5nLnkiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ3VzdG9tQnVpbGQ+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvdHJhbnNsYXRvcl9obHNsLnZjeHByb2ogYi9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci90cmFuc2xhdG9yX2hsc2wudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTNmYWYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvdHJhbnNsYXRvcl9obHNsLnZjeHByb2oKQEAgLTAsMCArMSw5NSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN308L1Byb2plY3RHdWlkPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Dcm9zc0NvbXBpbGVySExTTDwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW5jbHVkZVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPi4uXGluY2x1ZGU7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgRGlyZWN0WCBTREsgKEZlYnJ1YXJ5IDIwMTApXEluY2x1ZGU7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgRGlyZWN0WCBTREsgKE5vdmVtYmVyIDIwMDgpXEluY2x1ZGU7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgRGlyZWN0WCBTREsgKEF1Z3VzdCAyMDA5KVxJbmNsdWRlO0M6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IERpcmVjdFggU0RLIChGZWJydWFyeSAyMDA2KVxJbmNsdWRlOyQoVkNJbnN0YWxsRGlyKVBsYXRmb3JtU0RLXGluY2x1ZGU7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPg0KKyAgICA8SW5jbHVkZVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Li5caW5jbHVkZTtDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBEaXJlY3RYIFNESyAoRmVicnVhcnkgMjAxMClcSW5jbHVkZTtDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBEaXJlY3RYIFNESyAoTm92ZW1iZXIgMjAwOClcSW5jbHVkZTtDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBEaXJlY3RYIFNESyAoQXVndXN0IDIwMDkpXEluY2x1ZGU7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgRGlyZWN0WCBTREsgKEZlYnJ1YXJ5IDIwMDYpXEluY2x1ZGU7JChWQ0luc3RhbGxEaXIpUGxhdGZvcm1TREtcaW5jbHVkZTskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoUHJvamVjdERpcikuLi87JChQcm9qZWN0RGlyKS4uLy4uL2luY2x1ZGU7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7Tk9NSU5NQVg7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoUHJvamVjdERpcikuLi87JChQcm9qZWN0RGlyKS4uLy4uL2luY2x1ZGU7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7Tk9NSU5NQVg7X1NFQ1VSRV9TQ0w9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJDb2RlR2VuSExTTC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iT3V0cHV0SExTTC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iU2VhcmNoU3ltYm9sLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJUcmFuc2xhdG9ySExTTC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iVW5mb2xkU2VsZWN0LmNwcCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJPdXRwdXRITFNMLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iU2VhcmNoU3ltYm9sLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iVHJhbnNsYXRvckhMU0wuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJVbmZvbGRTZWxlY3QuaCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9jb21waWxlci90cmFuc2xhdG9yX2hsc2wudmN4cHJvai5maWx0ZXJzIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvdHJhbnNsYXRvcl9obHNsLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODU2NDUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvdHJhbnNsYXRvcl9obHNsLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDQ0IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzt4c2Q8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkNvZGVHZW5ITFNMLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iT3V0cHV0SExTTC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlNlYXJjaFN5bWJvbC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlRyYW5zbGF0b3JITFNMLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iVW5mb2xkU2VsZWN0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iT3V0cHV0SExTTC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJTZWFyY2hTeW1ib2wuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iVHJhbnNsYXRvckhMU0wuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iVW5mb2xkU2VsZWN0LmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3V0aWwuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2ZTRkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3V0aWwuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidXRpbC5oIgorCisjaWZkZWYgX01TQ19WRVIKKyAgICAjaW5jbHVkZSA8bG9jYWxlLmg+CisjZWxzZQorICAgICNpbmNsdWRlIDxzc3RyZWFtPgorI2VuZGlmCisKK2RvdWJsZSBhdG9mX2RvdChjb25zdCBjaGFyICpzdHIpCit7CisjaWZkZWYgX01TQ19WRVIKKyAgICBfbG9jYWxlX3QgbCA9IF9jcmVhdGVfbG9jYWxlKExDX05VTUVSSUMsICJDIik7CisgICAgZG91YmxlIHJlc3VsdCA9IF9hdG9mX2woc3RyLCBsKTsKKyAgICBfZnJlZV9sb2NhbGUobCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisgICAgZG91YmxlIHJlc3VsdDsKKyAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gcyhzdHIpOworICAgIHN0ZDo6bG9jYWxlIGwoIkMiKTsKKyAgICBzLmltYnVlKGwpOworICAgIHMgPj4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3V0aWwuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2NvbXBpbGVyL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI4OGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvY29tcGlsZXIvdXRpbC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKyNpZm5kZWYgQ09NUElMRVJfVVRJTF9ICisjZGVmaW5lIENPTVBJTEVSX1VUSUxfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIGF0b2ZfZG90IGlzIGxpa2UgYXRvZiBidXQgZm9yY2luZyBDIGxvY2FsZSwgaS5lLiBmb3JjaW5nICcuJyBhcyBkZWNpbWFsIHBvaW50LgorZG91YmxlIGF0b2ZfZG90KGNvbnN0IGNoYXIgKnN0cik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBlbmQgZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBDT01QSUxFUl9VVElMX0gKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2luY2x1ZGUvRUdML2VnbC5oIGIvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9FR0wvZWdsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllYTM0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2luY2x1ZGUvRUdML2VnbC5oCkBAIC0wLDAgKzEsMzI5IEBACisvKiAtKi0gbW9kZTogYzsgdGFiLXdpZHRoOiA4OyAtKi0gKi8KKy8qIHZpOiBzZXQgc3c9NCB0cz04OiAqLworLyogUmVmZXJlbmNlIHZlcnNpb24gb2YgZWdsLmggZm9yIEVHTCAxLjQuCisgKiAkUmV2aXNpb246IDkzNTYgJCBvbiAkRGF0ZTogMjAwOS0xMC0yMSAwMjo1MjoyNSAtMDcwMCAoV2VkLCAyMSBPY3QgMjAwOSkgJAorICovCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKioKKyoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisqLworCisjaWZuZGVmIF9fZWdsX2hfCisjZGVmaW5lIF9fZWdsX2hfCisKKy8qIEFsbCBwbGF0Zm9ybS1kZXBlbmRlbnQgdHlwZXMgYW5kIG1hY3JvIGJvaWxlcnBsYXRlIChzdWNoIGFzIEVHTEFQSQorICogYW5kIEVHTEFQSUVOVFJZKSBzaG91bGQgZ28gaW4gZWdscGxhdGZvcm0uaC4KKyAqLworI2luY2x1ZGUgPEVHTC9lZ2xwbGF0Zm9ybS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEVHTCBUeXBlcyAqLworLyogRUdMaW50IGlzIGRlZmluZWQgaW4gZWdscGxhdGZvcm0uaCAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgRUdMQm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEVHTGVudW07Cit0eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKK3R5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKK3R5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKK3R5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKK3R5cGVkZWYgdm9pZCAqRUdMQ2xpZW50QnVmZmVyOworCisvKiBFR0wgVmVyc2lvbmluZyAqLworI2RlZmluZSBFR0xfVkVSU0lPTl8xXzAJCQkxCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfMQkJCTEKKyNkZWZpbmUgRUdMX1ZFUlNJT05fMV8yCQkJMQorI2RlZmluZSBFR0xfVkVSU0lPTl8xXzMJCQkxCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfNAkJCTEKKworLyogRUdMIEVudW1lcmFudHMuIEJpdG1hc2tzIGFuZCBvdGhlciBleGNlcHRpb25hbCBjYXNlcyBhc2lkZSwgbW9zdAorICogZW51bXMgYXJlIGFzc2lnbmVkIHVuaXF1ZSB2YWx1ZXMgc3RhcnRpbmcgYXQgMHgzMDAwLgorICovCisKKy8qIEVHTCBhbGlhc2VzICovCisjZGVmaW5lIEVHTF9GQUxTRQkJCTAKKyNkZWZpbmUgRUdMX1RSVUUJCQkxCisKKy8qIE91dC1vZi1iYW5kIGhhbmRsZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWQkJKChFR0xOYXRpdmVEaXNwbGF5VHlwZSkwKQorI2RlZmluZSBFR0xfTk9fQ09OVEVYVAkJCSgoRUdMQ29udGV4dCkwKQorI2RlZmluZSBFR0xfTk9fRElTUExBWQkJCSgoRUdMRGlzcGxheSkwKQorI2RlZmluZSBFR0xfTk9fU1VSRkFDRQkJCSgoRUdMU3VyZmFjZSkwKQorCisvKiBPdXQtb2YtYmFuZCBhdHRyaWJ1dGUgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX0RPTlRfQ0FSRQkJCSgoRUdMaW50KS0xKQorCisvKiBFcnJvcnMgLyBHZXRFcnJvciByZXR1cm4gdmFsdWVzICovCisjZGVmaW5lIEVHTF9TVUNDRVNTCQkJMHgzMDAwCisjZGVmaW5lIEVHTF9OT1RfSU5JVElBTElaRUQJCTB4MzAwMQorI2RlZmluZSBFR0xfQkFEX0FDQ0VTUwkJCTB4MzAwMgorI2RlZmluZSBFR0xfQkFEX0FMTE9DCQkJMHgzMDAzCisjZGVmaW5lIEVHTF9CQURfQVRUUklCVVRFCQkweDMwMDQKKyNkZWZpbmUgRUdMX0JBRF9DT05GSUcJCQkweDMwMDUKKyNkZWZpbmUgRUdMX0JBRF9DT05URVhUCQkJMHgzMDA2CisjZGVmaW5lIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFCQkweDMwMDcKKyNkZWZpbmUgRUdMX0JBRF9ESVNQTEFZCQkJMHgzMDA4CisjZGVmaW5lIEVHTF9CQURfTUFUQ0gJCQkweDMwMDkKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfUElYTUFQCQkweDMwMEEKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfV0lORE9XCQkweDMwMEIKKyNkZWZpbmUgRUdMX0JBRF9QQVJBTUVURVIJCTB4MzAwQworI2RlZmluZSBFR0xfQkFEX1NVUkZBQ0UJCQkweDMwMEQKKyNkZWZpbmUgRUdMX0NPTlRFWFRfTE9TVAkJMHgzMDBFCS8qIEVHTCAxLjEgLSBJTUdfcG93ZXJfbWFuYWdlbWVudCAqLworCisvKiBSZXNlcnZlZCAweDMwMEYtMHgzMDFGIGZvciBhZGRpdGlvbmFsIGVycm9ycyAqLworCisvKiBDb25maWcgYXR0cmlidXRlcyAqLworI2RlZmluZSBFR0xfQlVGRkVSX1NJWkUJCQkweDMwMjAKKyNkZWZpbmUgRUdMX0FMUEhBX1NJWkUJCQkweDMwMjEKKyNkZWZpbmUgRUdMX0JMVUVfU0laRQkJCTB4MzAyMgorI2RlZmluZSBFR0xfR1JFRU5fU0laRQkJCTB4MzAyMworI2RlZmluZSBFR0xfUkVEX1NJWkUJCQkweDMwMjQKKyNkZWZpbmUgRUdMX0RFUFRIX1NJWkUJCQkweDMwMjUKKyNkZWZpbmUgRUdMX1NURU5DSUxfU0laRQkJMHgzMDI2CisjZGVmaW5lIEVHTF9DT05GSUdfQ0FWRUFUCQkweDMwMjcKKyNkZWZpbmUgRUdMX0NPTkZJR19JRAkJCTB4MzAyOAorI2RlZmluZSBFR0xfTEVWRUwJCQkweDMwMjkKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX0hFSUdIVAkJMHgzMDJBCisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMJCTB4MzAyQgorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEgJCTB4MzAyQworI2RlZmluZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEUJCTB4MzAyRAorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9JRAkJMHgzMDJFCisjZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX1RZUEUJCTB4MzAyRgorI2RlZmluZSBFR0xfU0FNUExFUwkJCTB4MzAzMQorI2RlZmluZSBFR0xfU0FNUExFX0JVRkZFUlMJCTB4MzAzMgorI2RlZmluZSBFR0xfU1VSRkFDRV9UWVBFCQkweDMwMzMKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1RZUEUJCTB4MzAzNAorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRQkweDMwMzUKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFCTB4MzAzNgorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFCTB4MzAzNworI2RlZmluZSBFR0xfTk9ORQkJCTB4MzAzOAkvKiBBdHRyaWIgbGlzdCB0ZXJtaW5hdG9yICovCisjZGVmaW5lIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCCQkweDMwMzkKKyNkZWZpbmUgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBCTB4MzAzQQorI2RlZmluZSBFR0xfTUlOX1NXQVBfSU5URVJWQUwJCTB4MzAzQgorI2RlZmluZSBFR0xfTUFYX1NXQVBfSU5URVJWQUwJCTB4MzAzQworI2RlZmluZSBFR0xfTFVNSU5BTkNFX1NJWkUJCTB4MzAzRAorI2RlZmluZSBFR0xfQUxQSEFfTUFTS19TSVpFCQkweDMwM0UKKyNkZWZpbmUgRUdMX0NPTE9SX0JVRkZFUl9UWVBFCQkweDMwM0YKKyNkZWZpbmUgRUdMX1JFTkRFUkFCTEVfVFlQRQkJMHgzMDQwCisjZGVmaW5lIEVHTF9NQVRDSF9OQVRJVkVfUElYTUFQCQkweDMwNDEJLyogUHNldWRvLWF0dHJpYnV0ZSAobm90IHF1ZXJ5YWJsZSkgKi8KKyNkZWZpbmUgRUdMX0NPTkZPUk1BTlQJCQkweDMwNDIKKworLyogUmVzZXJ2ZWQgMHgzMDQxLTB4MzA0RiBmb3IgYWRkaXRpb25hbCBjb25maWcgYXR0cmlidXRlcyAqLworCisvKiBDb25maWcgYXR0cmlidXRlIHZhbHVlcyAqLworI2RlZmluZSBFR0xfU0xPV19DT05GSUcJCQkweDMwNTAJLyogRUdMX0NPTkZJR19DQVZFQVQgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX05PTl9DT05GT1JNQU5UX0NPTkZJRwkweDMwNTEJLyogRUdMX0NPTkZJR19DQVZFQVQgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JHQgkJMHgzMDUyCS8qIEVHTF9UUkFOU1BBUkVOVF9UWVBFIHZhbHVlICovCisjZGVmaW5lIEVHTF9SR0JfQlVGRkVSCQkJMHgzMDhFCS8qIEVHTF9DT0xPUl9CVUZGRVJfVFlQRSB2YWx1ZSAqLworI2RlZmluZSBFR0xfTFVNSU5BTkNFX0JVRkZFUgkJMHgzMDhGCS8qIEVHTF9DT0xPUl9CVUZGRVJfVFlQRSB2YWx1ZSAqLworCisvKiBNb3JlIGNvbmZpZyBhdHRyaWJ1dGUgdmFsdWVzLCBmb3IgRUdMX1RFWFRVUkVfRk9STUFUICovCisjZGVmaW5lIEVHTF9OT19URVhUVVJFCQkJMHgzMDVDCisjZGVmaW5lIEVHTF9URVhUVVJFX1JHQgkJCTB4MzA1RAorI2RlZmluZSBFR0xfVEVYVFVSRV9SR0JBCQkweDMwNUUKKyNkZWZpbmUgRUdMX1RFWFRVUkVfMkQJCQkweDMwNUYKKworLyogQ29uZmlnIGF0dHJpYnV0ZSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1BCVUZGRVJfQklUCQkJMHgwMDAxCS8qIEVHTF9TVVJGQUNFX1RZUEUgbWFzayBiaXRzICovCisjZGVmaW5lIEVHTF9QSVhNQVBfQklUCQkJMHgwMDAyCS8qIEVHTF9TVVJGQUNFX1RZUEUgbWFzayBiaXRzICovCisjZGVmaW5lIEVHTF9XSU5ET1dfQklUCQkJMHgwMDA0CS8qIEVHTF9TVVJGQUNFX1RZUEUgbWFzayBiaXRzICovCisjZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFX0xJTkVBUl9CSVQJMHgwMDIwCS8qIEVHTF9TVVJGQUNFX1RZUEUgbWFzayBiaXRzICovCisjZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfUFJFX0JJVAkweDAwNDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX01VTFRJU0FNUExFX1JFU09MVkVfQk9YX0JJVCAweDAyMDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1NXQVBfQkVIQVZJT1JfUFJFU0VSVkVEX0JJVCAweDA0MDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKworI2RlZmluZSBFR0xfT1BFTkdMX0VTX0JJVAkJMHgwMDAxCS8qIEVHTF9SRU5ERVJBQkxFX1RZUEUgbWFzayBiaXRzICovCisjZGVmaW5lIEVHTF9PUEVOVkdfQklUCQkJMHgwMDAyCS8qIEVHTF9SRU5ERVJBQkxFX1RZUEUgbWFzayBiaXRzICovCisjZGVmaW5lIEVHTF9PUEVOR0xfRVMyX0JJVAkJMHgwMDA0CS8qIEVHTF9SRU5ERVJBQkxFX1RZUEUgbWFzayBiaXRzICovCisjZGVmaW5lIEVHTF9PUEVOR0xfQklUCQkJMHgwMDA4CS8qIEVHTF9SRU5ERVJBQkxFX1RZUEUgbWFzayBiaXRzICovCisKKy8qIFF1ZXJ5U3RyaW5nIHRhcmdldHMgKi8KKyNkZWZpbmUgRUdMX1ZFTkRPUgkJCTB4MzA1MworI2RlZmluZSBFR0xfVkVSU0lPTgkJCTB4MzA1NAorI2RlZmluZSBFR0xfRVhURU5TSU9OUwkJCTB4MzA1NQorI2RlZmluZSBFR0xfQ0xJRU5UX0FQSVMJCQkweDMwOEQKKworLyogUXVlcnlTdXJmYWNlIC8gU3VyZmFjZUF0dHJpYiAvIENyZWF0ZVBidWZmZXJTdXJmYWNlIHRhcmdldHMgKi8KKyNkZWZpbmUgRUdMX0hFSUdIVAkJCTB4MzA1NgorI2RlZmluZSBFR0xfV0lEVEgJCQkweDMwNTcKKyNkZWZpbmUgRUdMX0xBUkdFU1RfUEJVRkZFUgkJMHgzMDU4CisjZGVmaW5lIEVHTF9URVhUVVJFX0ZPUk1BVAkJMHgzMDgwCisjZGVmaW5lIEVHTF9URVhUVVJFX1RBUkdFVAkJMHgzMDgxCisjZGVmaW5lIEVHTF9NSVBNQVBfVEVYVFVSRQkJMHgzMDgyCisjZGVmaW5lIEVHTF9NSVBNQVBfTEVWRUwJCTB4MzA4MworI2RlZmluZSBFR0xfUkVOREVSX0JVRkZFUgkJMHgzMDg2CisjZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFCQkweDMwODcKKyNkZWZpbmUgRUdMX1ZHX0FMUEhBX0ZPUk1BVAkJMHgzMDg4CisjZGVmaW5lIEVHTF9IT1JJWk9OVEFMX1JFU09MVVRJT04JMHgzMDkwCisjZGVmaW5lIEVHTF9WRVJUSUNBTF9SRVNPTFVUSU9OCQkweDMwOTEKKyNkZWZpbmUgRUdMX1BJWEVMX0FTUEVDVF9SQVRJTwkJMHgzMDkyCisjZGVmaW5lIEVHTF9TV0FQX0JFSEFWSU9SCQkweDMwOTMKKyNkZWZpbmUgRUdMX01VTFRJU0FNUExFX1JFU09MVkUJCTB4MzA5OQorCisvKiBFR0xfUkVOREVSX0JVRkZFUiB2YWx1ZXMgLyBCaW5kVGV4SW1hZ2UgLyBSZWxlYXNlVGV4SW1hZ2UgYnVmZmVyIHRhcmdldHMgKi8KKyNkZWZpbmUgRUdMX0JBQ0tfQlVGRkVSCQkJMHgzMDg0CisjZGVmaW5lIEVHTF9TSU5HTEVfQlVGRkVSCQkweDMwODUKKworLyogT3BlblZHIGNvbG9yIHNwYWNlcyAqLworI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRV9zUkdCCQkweDMwODkJLyogRUdMX1ZHX0NPTE9SU1BBQ0UgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0VfTElORUFSCTB4MzA4QQkvKiBFR0xfVkdfQ09MT1JTUEFDRSB2YWx1ZSAqLworCisvKiBPcGVuVkcgYWxwaGEgZm9ybWF0cyAqLworI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUX05PTlBSRQkweDMwOEIJLyogRUdMX0FMUEhBX0ZPUk1BVCB2YWx1ZSAqLworI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUX1BSRQkJMHgzMDhDCS8qIEVHTF9BTFBIQV9GT1JNQVQgdmFsdWUgKi8KKworLyogQ29uc3RhbnQgc2NhbGUgZmFjdG9yIGJ5IHdoaWNoIGZyYWN0aW9uYWwgZGlzcGxheSByZXNvbHV0aW9ucyAmCisgKiBhc3BlY3QgcmF0aW8gYXJlIHNjYWxlZCB3aGVuIHF1ZXJpZWQgYXMgaW50ZWdlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgRUdMX0RJU1BMQVlfU0NBTElORwkJMTAwMDAKKworLyogVW5rbm93biBkaXNwbGF5IHJlc29sdXRpb24vYXNwZWN0IHJhdGlvICovCisjZGVmaW5lIEVHTF9VTktOT1dOCQkJKChFR0xpbnQpLTEpCisKKy8qIEJhY2sgYnVmZmVyIHN3YXAgYmVoYXZpb3JzICovCisjZGVmaW5lIEVHTF9CVUZGRVJfUFJFU0VSVkVECQkweDMwOTQJLyogRUdMX1NXQVBfQkVIQVZJT1IgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX0JVRkZFUl9ERVNUUk9ZRUQJCTB4MzA5NQkvKiBFR0xfU1dBUF9CRUhBVklPUiB2YWx1ZSAqLworCisvKiBDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlciBidWZmZXIgdHlwZXMgKi8KKyNkZWZpbmUgRUdMX09QRU5WR19JTUFHRQkJMHgzMDk2CisKKy8qIFF1ZXJ5Q29udGV4dCB0YXJnZXRzICovCisjZGVmaW5lIEVHTF9DT05URVhUX0NMSUVOVF9UWVBFCQkweDMwOTcKKworLyogQ3JlYXRlQ29udGV4dCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OCTB4MzA5OAorCisvKiBNdWx0aXNhbXBsZSByZXNvbHV0aW9uIGJlaGF2aW9ycyAqLworI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRV9ERUZBVUxUIDB4MzA5QQkvKiBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRSB2YWx1ZSAqLworI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRV9CT1gJMHgzMDlCCS8qIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFIHZhbHVlICovCisKKy8qIEJpbmRBUEkvUXVlcnlBUEkgdGFyZ2V0cyAqLworI2RlZmluZSBFR0xfT1BFTkdMX0VTX0FQSQkJMHgzMEEwCisjZGVmaW5lIEVHTF9PUEVOVkdfQVBJCQkJMHgzMEExCisjZGVmaW5lIEVHTF9PUEVOR0xfQVBJCQkJMHgzMEEyCisKKy8qIEdldEN1cnJlbnRTdXJmYWNlIHRhcmdldHMgKi8KKyNkZWZpbmUgRUdMX0RSQVcJCQkweDMwNTkKKyNkZWZpbmUgRUdMX1JFQUQJCQkweDMwNUEKKworLyogV2FpdE5hdGl2ZSBlbmdpbmVzICovCisjZGVmaW5lIEVHTF9DT1JFX05BVElWRV9FTkdJTkUJCTB4MzA1QgorCisvKiBFR0wgMS4yIHRva2VucyByZW5hbWVkIGZvciBjb25zaXN0ZW5jeSBpbiBFR0wgMS4zICovCisjZGVmaW5lIEVHTF9DT0xPUlNQQUNFCQkJRUdMX1ZHX0NPTE9SU1BBQ0UKKyNkZWZpbmUgRUdMX0FMUEhBX0ZPUk1BVAkJRUdMX1ZHX0FMUEhBX0ZPUk1BVAorI2RlZmluZSBFR0xfQ09MT1JTUEFDRV9zUkdCCQlFR0xfVkdfQ09MT1JTUEFDRV9zUkdCCisjZGVmaW5lIEVHTF9DT0xPUlNQQUNFX0xJTkVBUgkJRUdMX1ZHX0NPTE9SU1BBQ0VfTElORUFSCisjZGVmaW5lIEVHTF9BTFBIQV9GT1JNQVRfTk9OUFJFCQlFR0xfVkdfQUxQSEFfRk9STUFUX05PTlBSRQorI2RlZmluZSBFR0xfQUxQSEFfRk9STUFUX1BSRQkJRUdMX1ZHX0FMUEhBX0ZPUk1BVF9QUkUKKworLyogRUdMIGV4dGVuc2lvbnMgbXVzdCByZXF1ZXN0IGVudW0gYmxvY2tzIGZyb20gdGhlIEtocm9ub3MKKyAqIEFQSSBSZWdpc3RyYXIsIHdobyBtYWludGFpbnMgdGhlIGVudW1lcmFudCByZWdpc3RyeS4gU3VibWl0CisgKiBhIGJ1ZyBpbiBLaHJvbm9zIEJ1Z3ppbGxhIGFnYWluc3QgdGFzayAiUmVnaXN0cnkiLgorICovCisKKworCisvKiBFR0wgRnVuY3Rpb25zICovCisKK0VHTEFQSSBFR0xpbnQgRUdMQVBJRU5UUlkgZWdsR2V0RXJyb3Iodm9pZCk7CisKK0VHTEFQSSBFR0xEaXNwbGF5IEVHTEFQSUVOVFJZIGVnbEdldERpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheV9pZCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xJbml0aWFsaXplKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRweSk7CisKK0VHTEFQSSBjb25zdCBjaGFyICogRUdMQVBJRU5UUlkgZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkcHksIEVHTGludCBuYW1lKTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsR2V0Q29uZmlncyhFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnICpjb25maWdzLAorCQkJIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbENob29zZUNvbmZpZyhFR0xEaXNwbGF5IGRweSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCwKKwkJCSAgIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLAorCQkJICAgRUdMaW50ICpudW1fY29uZmlnKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEdldENvbmZpZ0F0dHJpYihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKwkJCSAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCitFR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorCQkJCSAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW4sCisJCQkJICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorCQkJCSAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKwkJCQkgIEVHTE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLAorCQkJCSAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xEZXN0cm95U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAorCQkJICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEJpbmRBUEkoRUdMZW51bSBhcGkpOworRUdMQVBJIEVHTGVudW0gRUdMQVBJRU5UUlkgZWdsUXVlcnlBUEkodm9pZCk7CisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFdhaXRDbGllbnQodm9pZCk7CisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFJlbGVhc2VUaHJlYWQodm9pZCk7CisKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKAorCSAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGJ1ZnR5cGUsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsCisJICAgICAgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN1cmZhY2VBdHRyaWIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwKKwkJCSAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgdmFsdWUpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQmluZFRleEltYWdlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUmVsZWFzZVRleEltYWdlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpOworCisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN3YXBJbnRlcnZhbChFR0xEaXNwbGF5IGRweSwgRUdMaW50IGludGVydmFsKTsKKworCitFR0xBUEkgRUdMQ29udGV4dCBFR0xBUElFTlRSWSBlZ2xDcmVhdGVDb250ZXh0KEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorCQkJICAgIEVHTENvbnRleHQgc2hhcmVfY29udGV4dCwKKwkJCSAgICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lDb250ZXh0KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xNYWtlQ3VycmVudChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LAorCQkJICBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4KTsKKworRUdMQVBJIEVHTENvbnRleHQgRUdMQVBJRU5UUlkgZWdsR2V0Q3VycmVudENvbnRleHQodm9pZCk7CitFR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xpbnQgcmVhZGRyYXcpOworRUdMQVBJIEVHTERpc3BsYXkgRUdMQVBJRU5UUlkgZWdsR2V0Q3VycmVudERpc3BsYXkodm9pZCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LAorCQkJICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFdhaXRHTCh2b2lkKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFdhaXROYXRpdmUoRUdMaW50IGVuZ2luZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xTd2FwQnVmZmVycyhFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbENvcHlCdWZmZXJzKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCisJCQkgIEVHTE5hdGl2ZVBpeG1hcFR5cGUgdGFyZ2V0KTsKKworLyogVGhpcyBpcyBhIGdlbmVyaWMgZnVuY3Rpb24gcG9pbnRlciB0eXBlLCB3aG9zZSBuYW1lIGluZGljYXRlcyBpdCBtdXN0CisgKiBiZSBjYXN0IHRvIHRoZSBwcm9wZXIgdHlwZSAqYW5kIGNhbGxpbmcgY29udmVudGlvbiogYmVmb3JlIHVzZS4KKyAqLwordHlwZWRlZiB2b2lkICgqX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkodm9pZCk7CisKKy8qIE5vdywgZGVmaW5lIGVnbEdldFByb2NBZGRyZXNzIHVzaW5nIHRoZSBnZW5lcmljIGZ1bmN0aW9uIHB0ci4gdHlwZSAqLworRUdMQVBJIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgRUdMQVBJRU5UUlkKKyAgICAgICBlZ2xHZXRQcm9jQWRkcmVzcyhjb25zdCBjaGFyICpwcm9jbmFtZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2VnbF9oXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9FR0wvZWdsZXh0LmggYi9zcmMvT3BlbkdMIEVTIDIuMC9pbmNsdWRlL0VHTC9lZ2xleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjUwYTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9FR0wvZWdsZXh0LmgKQEAgLTAsMCArMSwyMzUgQEAKKyNpZm5kZWYgX19lZ2xleHRfaF8KKyNkZWZpbmUgX19lZ2xleHRfaF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworI2luY2x1ZGUgPEVHTC9lZ2xwbGF0Zm9ybS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGVhZGVyIGZpbGUgdmVyc2lvbiBudW1iZXIgKi8KKy8qIEN1cnJlbnQgdmVyc2lvbiBhdCBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2VnbC8gKi8KKy8qICRSZXZpc2lvbjogMTA3OTUgJCBvbiAkRGF0ZTogMjAxMC0wMy0xOSAxNzowNDoxNyAtMDcwMCAoRnJpLCAxOSBNYXIgMjAxMCkgJCAqLworI2RlZmluZSBFR0xfRUdMRVhUX1ZFUlNJT04gNQorCisjaWZuZGVmIEVHTF9LSFJfY29uZmlnX2F0dHJpYnMKKyNkZWZpbmUgRUdMX0tIUl9jb25maWdfYXR0cmlicyAxCisjZGVmaW5lIEVHTF9DT05GT1JNQU5UX0tIUgkJCTB4MzA0MgkvKiBFR0xDb25maWcgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFX0xJTkVBUl9CSVRfS0hSCTB4MDAyMAkvKiBFR0xfU1VSRkFDRV9UWVBFIGJpdGZpZWxkICovCisjZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfUFJFX0JJVF9LSFIJCTB4MDA0MAkvKiBFR0xfU1VSRkFDRV9UWVBFIGJpdGZpZWxkICovCisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2xvY2tfc3VyZmFjZQorI2RlZmluZSBFR0xfS0hSX2xvY2tfc3VyZmFjZSAxCisjZGVmaW5lIEVHTF9SRUFEX1NVUkZBQ0VfQklUX0tIUgkJMHgwMDAxCS8qIEVHTF9MT0NLX1VTQUdFX0hJTlRfS0hSIGJpdGZpZWxkICovCisjZGVmaW5lIEVHTF9XUklURV9TVVJGQUNFX0JJVF9LSFIJCTB4MDAwMgkvKiBFR0xfTE9DS19VU0FHRV9ISU5UX0tIUiBiaXRmaWVsZCAqLworI2RlZmluZSBFR0xfTE9DS19TVVJGQUNFX0JJVF9LSFIJCTB4MDA4MAkvKiBFR0xfU1VSRkFDRV9UWVBFIGJpdGZpZWxkICovCisjZGVmaW5lIEVHTF9PUFRJTUFMX0ZPUk1BVF9CSVRfS0hSCQkweDAxMDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLworI2RlZmluZSBFR0xfTUFUQ0hfRk9STUFUX0tIUgkJCTB4MzA0MwkvKiBFR0xDb25maWcgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9GT1JNQVRfUkdCXzU2NV9FWEFDVF9LSFIJCTB4MzBDMAkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLworI2RlZmluZSBFR0xfRk9STUFUX1JHQl81NjVfS0hSCQkJMHgzMEMxCS8qIEVHTF9NQVRDSF9GT1JNQVRfS0hSIHZhbHVlICovCisjZGVmaW5lIEVHTF9GT1JNQVRfUkdCQV84ODg4X0VYQUNUX0tIUgkJMHgzMEMyCS8qIEVHTF9NQVRDSF9GT1JNQVRfS0hSIHZhbHVlICovCisjZGVmaW5lIEVHTF9GT1JNQVRfUkdCQV84ODg4X0tIUgkJMHgzMEMzCS8qIEVHTF9NQVRDSF9GT1JNQVRfS0hSIHZhbHVlICovCisjZGVmaW5lIEVHTF9NQVBfUFJFU0VSVkVfUElYRUxTX0tIUgkJMHgzMEM0CS8qIGVnbExvY2tTdXJmYWNlS0hSIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfTE9DS19VU0FHRV9ISU5UX0tIUgkJCTB4MzBDNQkvKiBlZ2xMb2NrU3VyZmFjZUtIUiBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgRUdMX0JJVE1BUF9QT0lOVEVSX0tIUgkJCTB4MzBDNgkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfUElUQ0hfS0hSCQkJMHgzMEM3CS8qIGVnbFF1ZXJ5U3VyZmFjZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgRUdMX0JJVE1BUF9PUklHSU5fS0hSCQkJMHgzMEM4CS8qIGVnbFF1ZXJ5U3VyZmFjZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgRUdMX0JJVE1BUF9QSVhFTF9SRURfT0ZGU0VUX0tIUgkJMHgzMEM5CS8qIGVnbFF1ZXJ5U3VyZmFjZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgRUdMX0JJVE1BUF9QSVhFTF9HUkVFTl9PRkZTRVRfS0hSCTB4MzBDQQkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfQkxVRV9PRkZTRVRfS0hSCTB4MzBDQgkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfQUxQSEFfT0ZGU0VUX0tIUgkweDMwQ0MJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfQklUTUFQX1BJWEVMX0xVTUlOQU5DRV9PRkZTRVRfS0hSCTB4MzBDRAkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9MT1dFUl9MRUZUX0tIUgkJCTB4MzBDRQkvKiBFR0xfQklUTUFQX09SSUdJTl9LSFIgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX1VQUEVSX0xFRlRfS0hSCQkJMHgzMENGCS8qIEVHTF9CSVRNQVBfT1JJR0lOX0tIUiB2YWx1ZSAqLworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsTG9ja1N1cmZhY2VLSFIgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFVubG9ja1N1cmZhY2VLSFIgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKKyNlbmRpZiAvKiBFR0xfRUdMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTExPQ0tTVVJGQUNFS0hSUFJPQykgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFVOTE9DS1NVUkZBQ0VLSFJQUk9DKSAoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0tIUl9pbWFnZQorI2RlZmluZSBFR0xfS0hSX2ltYWdlIDEKKyNkZWZpbmUgRUdMX05BVElWRV9QSVhNQVBfS0hSCQkJMHgzMEIwCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwordHlwZWRlZiB2b2lkICpFR0xJbWFnZUtIUjsKKyNkZWZpbmUgRUdMX05PX0lNQUdFX0tIUgkJCSgoRUdMSW1hZ2VLSFIpMCkKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xJbWFnZUtIUiBFR0xBUElFTlRSWSBlZ2xDcmVhdGVJbWFnZUtIUiAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LCBFR0xlbnVtIHRhcmdldCwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xEZXN0cm95SW1hZ2VLSFIgKEVHTERpc3BsYXkgZHB5LCBFR0xJbWFnZUtIUiBpbWFnZSk7CisjZW5kaWYgLyogRUdMX0VHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEVHTEltYWdlS0hSIChFR0xBUElFTlRSWVAgUEZORUdMQ1JFQVRFSU1BR0VLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LCBFR0xlbnVtIHRhcmdldCwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xERVNUUk9ZSU1BR0VLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTEltYWdlS0hSIGltYWdlKTsKKyNlbmRpZgorCisjaWZuZGVmIEVHTF9LSFJfdmdfcGFyZW50X2ltYWdlCisjZGVmaW5lIEVHTF9LSFJfdmdfcGFyZW50X2ltYWdlIDEKKyNkZWZpbmUgRUdMX1ZHX1BBUkVOVF9JTUFHRV9LSFIJCQkweDMwQkEJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2dsX3RleHR1cmVfMkRfaW1hZ2UKKyNkZWZpbmUgRUdMX0tIUl9nbF90ZXh0dXJlXzJEX2ltYWdlIDEKKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfMkRfS0hSCQkJMHgzMEIxCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9MRVZFTF9LSFIJCTB4MzBCQwkvKiBlZ2xDcmVhdGVJbWFnZUtIUiBhdHRyaWJ1dGUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVHTF9LSFJfZ2xfdGV4dHVyZV9jdWJlbWFwX2ltYWdlCisjZGVmaW5lIEVHTF9LSFJfZ2xfdGV4dHVyZV9jdWJlbWFwX2ltYWdlIDEKKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9LSFIJMHgzMEIzCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX0tIUgkweDMwQjQJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfS0hSCTB4MzBCNQkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9LSFIJMHgzMEI2CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX0tIUgkweDMwQjcJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfS0hSCTB4MzBCOAkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVHTF9LSFJfZ2xfdGV4dHVyZV8zRF9pbWFnZQorI2RlZmluZSBFR0xfS0hSX2dsX3RleHR1cmVfM0RfaW1hZ2UgMQorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV8zRF9LSFIJCQkweDMwQjIJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX1pPRkZTRVRfS0hSCQkweDMwQkQJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgYXR0cmlidXRlICovCisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2dsX3JlbmRlcmJ1ZmZlcl9pbWFnZQorI2RlZmluZSBFR0xfS0hSX2dsX3JlbmRlcmJ1ZmZlcl9pbWFnZSAxCisjZGVmaW5lIEVHTF9HTF9SRU5ERVJCVUZGRVJfS0hSCQkJMHgzMEI5CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0tIUl9yZXVzYWJsZV9zeW5jCisjZGVmaW5lIEVHTF9LSFJfcmV1c2FibGVfc3luYyAxCisKK3R5cGVkZWYgdm9pZCogRUdMU3luY0tIUjsKK3R5cGVkZWYga2hyb25vc191dGltZV9uYW5vc2Vjb25kc190IEVHTFRpbWVLSFI7CisKKyNkZWZpbmUgRUdMX1NZTkNfU1RBVFVTX0tIUgkJCTB4MzBGMQorI2RlZmluZSBFR0xfU0lHTkFMRURfS0hSCQkJMHgzMEYyCisjZGVmaW5lIEVHTF9VTlNJR05BTEVEX0tIUgkJCTB4MzBGMworI2RlZmluZSBFR0xfVElNRU9VVF9FWFBJUkVEX0tIUgkJCTB4MzBGNQorI2RlZmluZSBFR0xfQ09ORElUSU9OX1NBVElTRklFRF9LSFIJCTB4MzBGNgorI2RlZmluZSBFR0xfU1lOQ19UWVBFX0tIUgkJCTB4MzBGNworI2RlZmluZSBFR0xfU1lOQ19SRVVTQUJMRV9LSFIJCQkweDMwRkEKKyNkZWZpbmUgRUdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklUX0tIUgkJMHgwMDAxCS8qIGVnbENsaWVudFdhaXRTeW5jS0hSIDxmbGFncz4gYml0ZmllbGQgKi8KKyNkZWZpbmUgRUdMX0ZPUkVWRVJfS0hSCQkJCTB4RkZGRkZGRkZGRkZGRkZGRnVsbAorI2RlZmluZSBFR0xfTk9fU1lOQ19LSFIJCQkJKChFR0xTeW5jS0hSKTApCisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xBUEkgRUdMU3luY0tIUiBFR0xBUElFTlRSWSBlZ2xDcmVhdGVTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveVN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYyk7CitFR0xBUEkgRUdMaW50IEVHTEFQSUVOVFJZIGVnbENsaWVudFdhaXRTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFNpZ25hbFN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMZW51bSBtb2RlKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEdldFN5bmNBdHRyaWJLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisjZW5kaWYgLyogRUdMX0VHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEVHTFN5bmNLSFIgKEVHTEFQSUVOVFJZUCBQRk5FR0xDUkVBVEVTWU5DS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMREVTVFJPWVNZTkNLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYyk7Cit0eXBlZGVmIEVHTGludCAoRUdMQVBJRU5UUllQIFBGTkVHTENMSUVOVFdBSVRTWU5DS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFNJR05BTFNZTkNLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMZW51bSBtb2RlKTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTEdFVFNZTkNBVFRSSUJLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2ltYWdlX2Jhc2UKKyNkZWZpbmUgRUdMX0tIUl9pbWFnZV9iYXNlIDEKKy8qIE1vc3QgaW50ZXJmYWNlcyBkZWZpbmVkIGJ5IEVHTF9LSFJfaW1hZ2VfcGl4bWFwIGFib3ZlICovCisjZGVmaW5lIEVHTF9JTUFHRV9QUkVTRVJWRURfS0hSCQkJMHgzMEQyCS8qIGVnbENyZWF0ZUltYWdlS0hSIGF0dHJpYnV0ZSAqLworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0tIUl9pbWFnZV9waXhtYXAKKyNkZWZpbmUgRUdMX0tIUl9pbWFnZV9waXhtYXAgMQorLyogSW50ZXJmYWNlcyBkZWZpbmVkIGJ5IEVHTF9LSFJfaW1hZ2UgYWJvdmUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVHTF9JTUdfY29udGV4dF9wcmlvcml0eQorI2RlZmluZSBFR0xfSU1HX2NvbnRleHRfcHJpb3JpdHkgMQorI2RlZmluZSBFR0xfQ09OVEVYVF9QUklPUklUWV9MRVZFTF9JTUcJCTB4MzEwMAorI2RlZmluZSBFR0xfQ09OVEVYVF9QUklPUklUWV9ISUdIX0lNRwkJMHgzMTAxCisjZGVmaW5lIEVHTF9DT05URVhUX1BSSU9SSVRZX01FRElVTV9JTUcJCTB4MzEwMgorI2RlZmluZSBFR0xfQ09OVEVYVF9QUklPUklUWV9MT1dfSU1HCQkweDMxMDMKKyNlbmRpZgorCisjaWZuZGVmIEVHTF9OVl9jb3ZlcmFnZV9zYW1wbGUKKyNkZWZpbmUgRUdMX05WX2NvdmVyYWdlX3NhbXBsZSAxCisjZGVmaW5lIEVHTF9DT1ZFUkFHRV9CVUZGRVJTX05WIDB4MzBFMAorI2RlZmluZSBFR0xfQ09WRVJBR0VfU0FNUExFU19OViAweDMwRTEKKyNlbmRpZgorCisjaWZuZGVmIEVHTF9OVl9kZXB0aF9ub25saW5lYXIKKyNkZWZpbmUgRUdMX05WX2RlcHRoX25vbmxpbmVhciAxCisjZGVmaW5lIEVHTF9ERVBUSF9FTkNPRElOR19OViAweDMwRTIKKyNkZWZpbmUgRUdMX0RFUFRIX0VOQ09ESU5HX05PTkVfTlYgMAorI2RlZmluZSBFR0xfREVQVEhfRU5DT0RJTkdfTk9OTElORUFSX05WIDB4MzBFMworI2VuZGlmCisKKyNpZm5kZWYgRUdMX05WX3N5bmMKKyNkZWZpbmUgRUdMX05WX3N5bmMgMQorI2RlZmluZSBFR0xfU1lOQ19QUklPUl9DT01NQU5EU19DT01QTEVURV9OVgkweDMwRTYKKyNkZWZpbmUgRUdMX1NZTkNfU1RBVFVTX05WCQkJMHgzMEU3CisjZGVmaW5lIEVHTF9TSUdOQUxFRF9OVgkJCQkweDMwRTgKKyNkZWZpbmUgRUdMX1VOU0lHTkFMRURfTlYJCQkweDMwRTkKKyNkZWZpbmUgRUdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklUX05WCQkweDAwMDEKKyNkZWZpbmUgRUdMX0ZPUkVWRVJfTlYJCQkJMHhGRkZGRkZGRkZGRkZGRkZGdWxsCisjZGVmaW5lIEVHTF9BTFJFQURZX1NJR05BTEVEX05WCQkJMHgzMEVBCisjZGVmaW5lIEVHTF9USU1FT1VUX0VYUElSRURfTlYJCQkweDMwRUIKKyNkZWZpbmUgRUdMX0NPTkRJVElPTl9TQVRJU0ZJRURfTlYJCTB4MzBFQworI2RlZmluZSBFR0xfU1lOQ19UWVBFX05WCQkJMHgzMEVECisjZGVmaW5lIEVHTF9TWU5DX0NPTkRJVElPTl9OVgkJCTB4MzBFRQorI2RlZmluZSBFR0xfU1lOQ19GRU5DRV9OVgkJCTB4MzBFRgorI2RlZmluZSBFR0xfTk9fU1lOQ19OVgkJCQkoKEVHTFN5bmNOVikwKQordHlwZWRlZiB2b2lkKiBFR0xTeW5jTlY7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBFR0xUaW1lTlY7CisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xTeW5jTlYgZWdsQ3JlYXRlRmVuY2VTeW5jTlYgKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGNvbmRpdGlvbiwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xCb29sZWFuIGVnbERlc3Ryb3lTeW5jTlYgKEVHTFN5bmNOViBzeW5jKTsKK0VHTEJvb2xlYW4gZWdsRmVuY2VOViAoRUdMU3luY05WIHN5bmMpOworRUdMaW50IGVnbENsaWVudFdhaXRTeW5jTlYgKEVHTFN5bmNOViBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVOViB0aW1lb3V0KTsKK0VHTEJvb2xlYW4gZWdsU2lnbmFsU3luY05WIChFR0xTeW5jTlYgc3luYywgRUdMZW51bSBtb2RlKTsKK0VHTEJvb2xlYW4gZWdsR2V0U3luY0F0dHJpYk5WIChFR0xTeW5jTlYgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisjZW5kaWYgLyogRUdMX0VHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEVHTFN5bmNOViAoRUdMQVBJRU5UUllQIFBGTkVHTENSRUFURUZFTkNFU1lOQ05WUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGNvbmRpdGlvbiwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xERVNUUk9ZU1lOQ05WUFJPQykgKEVHTFN5bmNOViBzeW5jKTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTEZFTkNFTlZQUk9DKSAoRUdMU3luY05WIHN5bmMpOwordHlwZWRlZiBFR0xpbnQgKEVHTEFQSUVOVFJZUCBQRk5FR0xDTElFTlRXQUlUU1lOQ05WUFJPQykgKEVHTFN5bmNOViBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVOViB0aW1lb3V0KTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFNJR05BTFNZTkNOVlBST0MpIChFR0xTeW5jTlYgc3luYywgRUdMZW51bSBtb2RlKTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTEdFVFNZTkNBVFRSSUJOVlBST0MpIChFR0xTeW5jTlYgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisjZW5kaWYKKworI2lmbmRlZiBFR0xfQU5HTEVfcXVlcnlfc3VyZmFjZV9wb2ludGVyCisjZGVmaW5lIEVHTF9BTkdMRV9xdWVyeV9zdXJmYWNlX3BvaW50ZXIgMQorI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gZWdsUXVlcnlTdXJmYWNlUG9pbnRlckFOR0xFKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBhdHRyaWJ1dGUsIHZvaWQgKip2YWx1ZSk7CisjZW5kaWYKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFFVRVJZU1VSRkFDRVBPSU5URVJBTkdMRVBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCB2b2lkICoqdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0FOR0xFX3N1cmZhY2VfZDNkX3RleHR1cmVfMmRfc2hhcmVfaGFuZGxlCisjZGVmaW5lIEVHTF9BTkdMRV9zdXJmYWNlX2QzZF90ZXh0dXJlXzJkX3NoYXJlX2hhbmRsZQorI2RlZmluZSBFR0xfRDNEX1RFWFRVUkVfMkRfU0hBUkVfSEFORExFX0FOR0xFIDB4MzIwMAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9FR0wvZWdscGxhdGZvcm0uaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2luY2x1ZGUvRUdML2VnbHBsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlODU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2luY2x1ZGUvRUdML2VnbHBsYXRmb3JtLmgKQEAgLTAsMCArMSwxMTAgQEAKKyNpZm5kZWYgX19lZ2xwbGF0Zm9ybV9oXworI2RlZmluZSBfX2VnbHBsYXRmb3JtX2hfCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKioKKyoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisqLworCisvKiBQbGF0Zm9ybS1zcGVjaWZpYyB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIGVnbC5oCisgKiAkUmV2aXNpb246IDk3MjQgJCBvbiAkRGF0ZTogMjAwOS0xMi0wMiAwMjowNTozMyAtMDgwMCAoV2VkLCAwMiBEZWMgMjAwOSkgJAorICoKKyAqIEFkb3B0ZXJzIG1heSBtb2RpZnkga2hycGxhdGZvcm0uaCBhbmQgdGhpcyBmaWxlIHRvIHN1aXQgdGhlaXIgcGxhdGZvcm0uCisgKiBZb3UgYXJlIGVuY291cmFnZWQgdG8gc3VibWl0IGFsbCBtb2RpZmljYXRpb25zIHRvIHRoZSBLaHJvbm9zIGdyb3VwIHNvIHRoYXQKKyAqIHRoZXkgY2FuIGJlIGluY2x1ZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUuICBQbGVhc2Ugc3VibWl0IGNoYW5nZXMKKyAqIGJ5IHNlbmRpbmcgdGhlbSB0byB0aGUgcHVibGljIEtocm9ub3MgQnVnemlsbGEgKGh0dHA6Ly9raHJvbm9zLm9yZy9idWd6aWxsYSkKKyAqIGJ5IGZpbGluZyBhIGJ1ZyBhZ2FpbnN0IHByb2R1Y3QgIkVHTCIgY29tcG9uZW50ICJSZWdpc3RyeSIuCisgKi8KKworI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgorCisvKiBNYWNyb3MgdXNlZCBpbiBFR0wgZnVuY3Rpb24gcHJvdG90eXBlIGRlY2xhcmF0aW9ucy4KKyAqCisgKiBFR0wgZnVuY3Rpb25zIHNob3VsZCBiZSBwcm90b3R5cGVkIGFzOgorICoKKyAqIEVHTEFQSSByZXR1cm4tdHlwZSBFR0xBUElFTlRSWSBlZ2xGdW5jdGlvbihhcmd1bWVudHMpOworICogdHlwZWRlZiByZXR1cm4tdHlwZSAoRVhQQVBJRU5UUllQIFBGTkVHTEZVTkNUSU9OUFJPQykgKGFyZ3VtZW50cyk7CisgKgorICogS0hST05PU19BUElDQUxMIGFuZCBLSFJPTk9TX0FQSUVOVFJZIGFyZSBkZWZpbmVkIGluIEtIUi9raHJwbGF0Zm9ybS5oCisgKi8KKworI2lmbmRlZiBFR0xBUEkKKyNkZWZpbmUgRUdMQVBJIEtIUk9OT1NfQVBJQ0FMTAorI2VuZGlmCisKKyNpZm5kZWYgRUdMQVBJRU5UUlkKKyNkZWZpbmUgRUdMQVBJRU5UUlkgIEtIUk9OT1NfQVBJRU5UUlkKKyNlbmRpZgorI2RlZmluZSBFR0xBUElFTlRSWVAgRUdMQVBJRU5UUlkqCisKKy8qIFRoZSB0eXBlcyBOYXRpdmVEaXNwbGF5VHlwZSwgTmF0aXZlV2luZG93VHlwZSwgYW5kIE5hdGl2ZVBpeG1hcFR5cGUKKyAqIGFyZSBhbGlhc2VzIG9mIHdpbmRvdy1zeXN0ZW0tZGVwZW5kZW50IHR5cGVzLCBzdWNoIGFzIFggRGlzcGxheSAqIG9yCisgKiBXaW5kb3dzIERldmljZSBDb250ZXh0LiBUaGV5IG11c3QgYmUgZGVmaW5lZCBpbiBwbGF0Zm9ybS1zcGVjaWZpYworICogY29kZSBiZWxvdy4gVGhlIEVHTC1wcmVmaXhlZCB2ZXJzaW9ucyBvZiBOYXRpdmUqVHlwZSBhcmUgdGhlIHNhbWUKKyAqIHR5cGVzLCByZW5hbWVkIGluIEVHTCAxLjMgc28gYWxsIHR5cGVzIGluIHRoZSBBUEkgc3RhcnQgd2l0aCAiRUdMIi4KKyAqLworCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19WQzMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pIC8qIFdpbjMyIGFuZCBXaW5DRSAqLworI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorCit0eXBlZGVmIEhEQyAgICAgRUdMTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIEhCSVRNQVAgRUdMTmF0aXZlUGl4bWFwVHlwZTsKK3R5cGVkZWYgSFdORCAgICBFR0xOYXRpdmVXaW5kb3dUeXBlOworCisjZWxpZiBkZWZpbmVkKF9fV0lOU0NXX18pIHx8IGRlZmluZWQoX19TWU1CSUFOMzJfXykgIC8qIFN5bWJpYW4gKi8KKwordHlwZWRlZiBpbnQgICBFR0xOYXRpdmVEaXNwbGF5VHlwZTsKK3R5cGVkZWYgdm9pZCAqRUdMTmF0aXZlV2luZG93VHlwZTsKK3R5cGVkZWYgdm9pZCAqRUdMTmF0aXZlUGl4bWFwVHlwZTsKKworI2VsaWYgZGVmaW5lZChfX3VuaXhfXykKKworLyogWDExICh0ZW50YXRpdmUpICAqLworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisKK3R5cGVkZWYgRGlzcGxheSAqRUdMTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIFBpeG1hcCAgIEVHTE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIFdpbmRvdyAgIEVHTE5hdGl2ZVdpbmRvd1R5cGU7CisKKyNlbHNlCisjZXJyb3IgIlBsYXRmb3JtIG5vdCByZWNvZ25pemVkIgorI2VuZGlmCisKKy8qIEVHTCAxLjIgdHlwZXMsIHJlbmFtZWQgZm9yIGNvbnNpc3RlbmN5IGluIEVHTCAxLjMgKi8KK3R5cGVkZWYgRUdMTmF0aXZlRGlzcGxheVR5cGUgTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIEVHTE5hdGl2ZVBpeG1hcFR5cGUgIE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIEVHTE5hdGl2ZVdpbmRvd1R5cGUgIE5hdGl2ZVdpbmRvd1R5cGU7CisKKworLyogRGVmaW5lIEVHTGludC4gVGhpcyBtdXN0IGJlIGEgc2lnbmVkIGludGVncmFsIHR5cGUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4KKyAqIGFsbCBsZWdhbCBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcyBwYXNzZWQgaW50byBhbmQgb3V0IG9mIEVHTCwgd2hldGhlcgorICogdGhlaXIgdHlwZSBpcyBib29sZWFuLCBiaXRtYXNrLCBlbnVtZXJhbnQgKHN5bWJvbGljIGNvbnN0YW50KSwgaW50ZWdlciwKKyAqIGhhbmRsZSwgb3Igb3RoZXIuICBXaGlsZSBpbiBnZW5lcmFsIGEgMzItYml0IGludGVnZXIgd2lsbCBzdWZmaWNlLCBpZgorICogaGFuZGxlcyBhcmUgNjQgYml0IHR5cGVzLCB0aGVuIEVHTGludCBzaG91bGQgYmUgZGVmaW5lZCBhcyBhIHNpZ25lZCA2NC1iaXQKKyAqIGludGVnZXIgdHlwZS4KKyAqLwordHlwZWRlZiBraHJvbm9zX2ludDMyX3QgRUdMaW50OworCisjZW5kaWYgLyogX19lZ2xwbGF0Zm9ybV9oICovCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9pbmNsdWRlL0dMRVMyL2dsMi5oIGIvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9HTEVTMi9nbDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWQzYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9HTEVTMi9nbDIuaApAQCAtMCwwICsxLDYyMSBAQAorI2lmbmRlZiBfX2dsMl9oXworI2RlZmluZSBfX2dsMl9oXworCisvKiAkUmV2aXNpb246IDEwNjAyICQgb24gJERhdGU6OiAyMDEwLTAzLTA0IDIyOjM1OjM0IC0wODAwICMkICovCisKKyNpbmNsdWRlIDxHTEVTMi9nbDJwbGF0Zm9ybS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgorICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGF0YSB0eXBlIGRlZmluaXRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiB2b2lkICAgICAgICAgICAgIEdMdm9pZDsKK3R5cGVkZWYgY2hhciAgICAgICAgICAgICBHTGNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgR0xlbnVtOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgIEdMYm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTGJpdGZpZWxkOwordHlwZWRlZiBraHJvbm9zX2ludDhfdCAgIEdMYnl0ZTsKK3R5cGVkZWYgc2hvcnQgICAgICAgICAgICBHTHNob3J0OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMaW50OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMc2l6ZWk7Cit0eXBlZGVmIGtocm9ub3NfdWludDhfdCAgR0x1Ynl0ZTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICBHTHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTHVpbnQ7Cit0eXBlZGVmIGtocm9ub3NfZmxvYXRfdCAgR0xmbG9hdDsKK3R5cGVkZWYga2hyb25vc19mbG9hdF90ICBHTGNsYW1wZjsKK3R5cGVkZWYga2hyb25vc19pbnQzMl90ICBHTGZpeGVkOworCisvKiBHTCB0eXBlcyBmb3IgaGFuZGxpbmcgbGFyZ2UgdmVydGV4IGJ1ZmZlciBvYmplY3RzICovCit0eXBlZGVmIGtocm9ub3NfaW50cHRyX3QgR0xpbnRwdHI7Cit0eXBlZGVmIGtocm9ub3Nfc3NpemVfdCAgR0xzaXplaXB0cjsKKworLyogT3BlbkdMIEVTIGNvcmUgdmVyc2lvbnMgKi8KKyNkZWZpbmUgR0xfRVNfVkVSU0lPTl8yXzAgICAgICAgICAgICAgICAgIDEKKworLyogQ2xlYXJCdWZmZXJNYXNrICovCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDA0MDAwCisKKy8qIEJvb2xlYW4gKi8KKyNkZWZpbmUgR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogQmVnaW5Nb2RlICovCisjZGVmaW5lIEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEdMX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgR0xfVFJJQU5HTEVTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAweDAwMDYKKworLyogQWxwaGFGdW5jdGlvbiAobm90IHN1cHBvcnRlZCBpbiBFUzIwKSAqLworLyogICAgICBHTF9ORVZFUiAqLworLyogICAgICBHTF9MRVNTICovCisvKiAgICAgIEdMX0VRVUFMICovCisvKiAgICAgIEdMX0xFUVVBTCAqLworLyogICAgICBHTF9HUkVBVEVSICovCisvKiAgICAgIEdMX05PVEVRVUFMICovCisvKiAgICAgIEdMX0dFUVVBTCAqLworLyogICAgICBHTF9BTFdBWVMgKi8KKworLyogQmxlbmRpbmdGYWN0b3JEZXN0ICovCisjZGVmaW5lIEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgIDB4MDMwMQorI2RlZmluZSBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzAyCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAweDAzMDMKKyNkZWZpbmUgR0xfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNAorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgMHgwMzA1CisKKy8qIEJsZW5kaW5nRmFjdG9yU3JjICovCisvKiAgICAgIEdMX1pFUk8gKi8KKy8qICAgICAgR0xfT05FICovCisjZGVmaW5lIEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDYKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9DT0xPUiAgICAgICAgICAgIDB4MDMwNworI2RlZmluZSBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgMHgwMzA4CisvKiAgICAgIEdMX1NSQ19BTFBIQSAqLworLyogICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICovCisvKiAgICAgIEdMX0RTVF9BTFBIQSAqLworLyogICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCisKKy8qIEJsZW5kRXF1YXRpb25TZXBhcmF0ZSAqLworI2RlZmluZSBHTF9GVU5DX0FERCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA2CisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCICAgICAgICAgICAgIDB4ODAwOSAgICAvKiBzYW1lIGFzIEJMRU5EX0VRVUFUSU9OICovCisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBICAgICAgICAgICAweDg4M0QKKworLyogQmxlbmRTdWJ0cmFjdCAqLworI2RlZmluZSBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgMHg4MDBBCisjZGVmaW5lIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCAgICAgICAgICAweDgwMEIKKworLyogU2VwYXJhdGUgQmxlbmQgRnVuY3Rpb25zICovCisjZGVmaW5lIEdMX0JMRU5EX0RTVF9SR0IgICAgICAgICAgICAgICAgICAweDgwQzgKKyNkZWZpbmUgR0xfQkxFTkRfU1JDX1JHQiAgICAgICAgICAgICAgICAgIDB4ODBDOQorI2RlZmluZSBHTF9CTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgMHg4MENBCisjZGVmaW5lIEdMX0JMRU5EX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAweDgwQ0IKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1IgICAgICAgICAgICAgICAgIDB4ODAwMQorI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgICAgICAgMHg4MDAyCisjZGVmaW5lIEdMX0NPTlNUQU5UX0FMUEhBICAgICAgICAgICAgICAgICAweDgwMDMKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBICAgICAgIDB4ODAwNAorI2RlZmluZSBHTF9CTEVORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgMHg4MDA1CisKKy8qIEJ1ZmZlciBPYmplY3RzICovCisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAweDg4OTIKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgIDB4ODg5MworI2RlZmluZSBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgMHg4ODk0CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAweDg4OTUKKworI2RlZmluZSBHTF9TVFJFQU1fRFJBVyAgICAgICAgICAgICAgICAgICAgMHg4OEUwCisjZGVmaW5lIEdMX1NUQVRJQ19EUkFXICAgICAgICAgICAgICAgICAgICAweDg4RTQKKyNkZWZpbmUgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgIDB4ODhFOAorCisjZGVmaW5lIEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgIDB4ODc2NQorCisjZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQiAgICAgICAgICAweDg2MjYKKworLyogQ3VsbEZhY2VNb2RlICovCisjZGVmaW5lIEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQKKyNkZWZpbmUgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNQorI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgMHgwNDA4CisKKy8qIERlcHRoRnVuY3Rpb24gKi8KKy8qICAgICAgR0xfTkVWRVIgKi8KKy8qICAgICAgR0xfTEVTUyAqLworLyogICAgICBHTF9FUVVBTCAqLworLyogICAgICBHTF9MRVFVQUwgKi8KKy8qICAgICAgR0xfR1JFQVRFUiAqLworLyogICAgICBHTF9OT1RFUVVBTCAqLworLyogICAgICBHTF9HRVFVQUwgKi8KKy8qICAgICAgR0xfQUxXQVlTICovCisKKy8qIEVuYWJsZUNhcCAqLworI2RlZmluZSBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgMHgwREUxCisjZGVmaW5lIEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAweDBCNDQKKyNkZWZpbmUgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMgorI2RlZmluZSBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkQwCisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAweDBCOTAKKyNkZWZpbmUgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEI3MQorI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQzExCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgMHg4MEEwCisKKy8qIEVycm9yQ29kZSAqLworI2RlZmluZSBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNTAwCisjZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAweDA1MDEKKyNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgIDB4MDUwMgorI2RlZmluZSBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgMHgwNTA1CisKKy8qIEZyb250RmFjZURpcmVjdGlvbiAqLworI2RlZmluZSBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwCisjZGVmaW5lIEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKKworLyogR2V0UE5hbWUgKi8KKyNkZWZpbmUgR0xfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDB4MEIyMQorI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECisjZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgIDB4MEI0NQorI2RlZmluZSBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgMHgwQjQ2CisjZGVmaW5lIEdMX0RFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICAweDBCNzAKKyNkZWZpbmUgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgIDB4MEI3MgorI2RlZmluZSBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgMHgwQjczCisjZGVmaW5lIEdMX0RFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICAweDBCNzQKKyNkZWZpbmUgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAgICAgICAgICAgIDB4MEI5MQorI2RlZmluZSBHTF9TVEVOQ0lMX0ZVTkMgICAgICAgICAgICAgICAgICAgMHgwQjkyCisjZGVmaW5lIEdMX1NURU5DSUxfRkFJTCAgICAgICAgICAgICAgICAgICAweDBCOTQKKyNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgIDB4MEI5NQorI2RlZmluZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgMHgwQjk2CisjZGVmaW5lIEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAweDBCOTcKKyNkZWZpbmUgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgIDB4MEI5MworI2RlZmluZSBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgMHgwQjk4CisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GVU5DICAgICAgICAgICAgICAweDg4MDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZBSUwgICAgICAgICAgICAgIDB4ODgwMQorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMICAgMHg4ODAyCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgICAweDg4MDMKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1JFRiAgICAgICAgICAgICAgIDB4OENBMworI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAgICAgICAgMHg4Q0E0CisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19XUklURU1BU0sgICAgICAgICAweDhDQTUKKyNkZWZpbmUgR0xfVklFV1BPUlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMgorI2RlZmluZSBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgMHgwQzEwCisvKiAgICAgIEdMX1NDSVNTT1JfVEVTVCAqLworI2RlZmluZSBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgMHgwQzIyCisjZGVmaW5lIEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAweDBDMjMKKyNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQorI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1CisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAweDBEMzMKKyNkZWZpbmUgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgIDB4MEQzQQorI2RlZmluZSBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgMHgwRDUwCisjZGVmaW5lIEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAweDBENTIKKyNkZWZpbmUgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MworI2RlZmluZSBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgMHgwRDU0CisjZGVmaW5lIEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTUKKyNkZWZpbmUgR0xfREVQVEhfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NgorI2RlZmluZSBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgMHgwRDU3CisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICAgICAgICAgICAweDJBMDAKKy8qICAgICAgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAqLworI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgMHg4MDM4CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAweDgwNjkKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgIDB4ODBBQgorCisvKiBHZXRUZXh0dXJlUGFyYW1ldGVyICovCisvKiAgICAgIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAqLworLyogICAgICBHTF9URVhUVVJFX01JTl9GSUxURVIgKi8KKy8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1MgKi8KKy8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1QgKi8KKworI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKKworLyogSGludE1vZGUgKi8KKyNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAorI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCisjZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKKworLyogSGludFRhcmdldCAqLworI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAgICAgICAgICAgIDB4ODE5MgorCisvKiBEYXRhVHlwZSAqLworI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKKyNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCisjZGVmaW5lIEdMX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgIDB4MTQwNQorI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2CisjZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKKworLyogUGl4ZWxGb3JtYXQgKi8KKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAgICAgICAgIDB4MTkwMgorI2RlZmluZSBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA2CisjZGVmaW5lIEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDcKKyNkZWZpbmUgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOAorI2RlZmluZSBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgMHgxOTA5CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICAweDE5MEEKKworLyogUGl4ZWxUeXBlICovCisvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAweDgzNjMKKworLyogU2hhZGVycyAqLworI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVIgICAgICAgICAgICAgICAgICAweDhCMzAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUiAgICAgICAgICAgICAgICAgICAgMHg4QjMxCisjZGVmaW5lIEdMX01BWF9WRVJURVhfQVRUUklCUyAgICAgICAgICAgICAgIDB4ODg2OQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyAgICAgICAweDhERkIKKyNkZWZpbmUgR0xfTUFYX1ZBUllJTkdfVkVDVE9SUyAgICAgICAgICAgICAgMHg4REZDCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEI0RAorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgICAweDhCNEMKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgICAgICAgICAgMHg4ODcyCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgICAgIDB4OERGRAorI2RlZmluZSBHTF9TSEFERVJfVFlQRSAgICAgICAgICAgICAgICAgICAgICAweDhCNEYKKyNkZWZpbmUgR0xfREVMRVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg4QjgwCisjZGVmaW5lIEdMX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDB4OEI4MgorI2RlZmluZSBHTF9WQUxJREFURV9TVEFUVVMgICAgICAgICAgICAgICAgICAweDhCODMKKyNkZWZpbmUgR0xfQVRUQUNIRURfU0hBREVSUyAgICAgICAgICAgICAgICAgMHg4Qjg1CisjZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNUyAgICAgICAgICAgICAgICAgIDB4OEI4NgorI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIICAgICAgICAweDhCODcKKyNkZWZpbmUgR0xfQUNUSVZFX0FUVFJJQlVURVMgICAgICAgICAgICAgICAgMHg4Qjg5CisjZGVmaW5lIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCAgICAgIDB4OEI4QQorI2RlZmluZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04gICAgICAgICAweDhCOEMKKyNkZWZpbmUgR0xfQ1VSUkVOVF9QUk9HUkFNICAgICAgICAgICAgICAgICAgMHg4QjhECisKKy8qIFN0ZW5jaWxGdW5jdGlvbiAqLworI2RlZmluZSBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEdMX0xFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUgR0xfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMgorI2RlZmluZSBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAzCisjZGVmaW5lIEdMX0dSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDQKKyNkZWZpbmUgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNQorI2RlZmluZSBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA2CisjZGVmaW5lIEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDcKKworLyogU3RlbmNpbE9wICovCisvKiAgICAgIEdMX1pFUk8gKi8KKyNkZWZpbmUgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMAorI2RlZmluZSBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAxCisjZGVmaW5lIEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDIKKyNkZWZpbmUgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMworI2RlZmluZSBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBBCisjZGVmaW5lIEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAweDg1MDcKKyNkZWZpbmUgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDB4ODUwOAorCisvKiBTdHJpbmdOYW1lICovCisjZGVmaW5lIEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAKKyNkZWZpbmUgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMQorI2RlZmluZSBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAyCisjZGVmaW5lIEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAweDFGMDMKKworLyogVGV4dHVyZU1hZ0ZpbHRlciAqLworI2RlZmluZSBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAwCisjZGVmaW5lIEdMX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDEKKworLyogVGV4dHVyZU1pbkZpbHRlciAqLworLyogICAgICBHTF9ORUFSRVNUICovCisvKiAgICAgIEdMX0xJTkVBUiAqLworI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgMHgyNzAwCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAweDI3MDEKKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgIDB4MjcwMgorI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgMHgyNzAzCisKKy8qIFRleHR1cmVQYXJhbWV0ZXJOYW1lICovCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fRklMVEVSICAgICAgICAgICAgIDB4MjgwMQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUyAgICAgICAgICAgICAgICAgMHgyODAyCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAweDI4MDMKKworLyogVGV4dHVyZVRhcmdldCAqLworLyogICAgICBHTF9URVhUVVJFXzJEICovCisjZGVmaW5lIEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAweDE3MDIKKworI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgICAgICAgMHg4NTEzCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUCAgICAgICAweDg1MTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICAgIDB4ODUxNQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ggICAgMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAgICAweDg1MTcKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgIDB4ODUxOAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogICAgMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAgICAweDg1MUEKKyNkZWZpbmUgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAgICAgIDB4ODUxQworCisvKiBUZXh0dXJlVW5pdCAqLworI2RlZmluZSBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMwCisjZGVmaW5lIEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAweDg0QzEKKyNkZWZpbmUgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMgorI2RlZmluZSBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMzCisjZGVmaW5lIEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzQKKyNkZWZpbmUgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNQorI2RlZmluZSBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM2CisjZGVmaW5lIEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzcKKyNkZWZpbmUgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOAorI2RlZmluZSBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM5CisjZGVmaW5lIEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0EKKyNkZWZpbmUgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQgorI2RlZmluZSBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgMHg4NENDCisjZGVmaW5lIEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAweDg0Q0QKKyNkZWZpbmUgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRQorI2RlZmluZSBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgMHg4NENGCisjZGVmaW5lIEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAweDg0RDAKKyNkZWZpbmUgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMQorI2RlZmluZSBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgMHg4NEQyCisjZGVmaW5lIEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAweDg0RDMKKyNkZWZpbmUgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgIDB4ODRENAorI2RlZmluZSBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ1CisjZGVmaW5lIEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAweDg0RDYKKyNkZWZpbmUgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgIDB4ODRENworI2RlZmluZSBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ4CisjZGVmaW5lIEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAweDg0RDkKKyNkZWZpbmUgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQQorI2RlZmluZSBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgMHg4NERCCisjZGVmaW5lIEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAweDg0REMKKyNkZWZpbmUgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgIDB4ODRERAorI2RlZmluZSBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgMHg4NERFCisjZGVmaW5lIEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAweDg0REYKKyNkZWZpbmUgR0xfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgIDB4ODRFMAorCisvKiBUZXh0dXJlV3JhcE1vZGUgKi8KKyNkZWZpbmUgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjkwMQorI2RlZmluZSBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgMHg4MTJGCisjZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVCAgICAgICAgICAgICAgICAweDgzNzAKKworLyogVW5pZm9ybSBUeXBlcyAqLworI2RlZmluZSBHTF9GTE9BVF9WRUMyICAgICAgICAgICAgICAgICAgICAgMHg4QjUwCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzMgICAgICAgICAgICAgICAgICAgICAweDhCNTEKKyNkZWZpbmUgR0xfRkxPQVRfVkVDNCAgICAgICAgICAgICAgICAgICAgIDB4OEI1MgorI2RlZmluZSBHTF9JTlRfVkVDMiAgICAgICAgICAgICAgICAgICAgICAgMHg4QjUzCisjZGVmaW5lIEdMX0lOVF9WRUMzICAgICAgICAgICAgICAgICAgICAgICAweDhCNTQKKyNkZWZpbmUgR0xfSU5UX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NQorI2RlZmluZSBHTF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU2CisjZGVmaW5lIEdMX0JPT0xfVkVDMiAgICAgICAgICAgICAgICAgICAgICAweDhCNTcKKyNkZWZpbmUgR0xfQk9PTF9WRUMzICAgICAgICAgICAgICAgICAgICAgIDB4OEI1OAorI2RlZmluZSBHTF9CT09MX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgMHg4QjU5CisjZGVmaW5lIEdMX0ZMT0FUX01BVDIgICAgICAgICAgICAgICAgICAgICAweDhCNUEKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMyAgICAgICAgICAgICAgICAgICAgIDB4OEI1QgorI2RlZmluZSBHTF9GTE9BVF9NQVQ0ICAgICAgICAgICAgICAgICAgICAgMHg4QjVDCisjZGVmaW5lIEdMX1NBTVBMRVJfMkQgICAgICAgICAgICAgICAgICAgICAweDhCNUUKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFICAgICAgICAgICAgICAgICAgIDB4OEI2MAorCisvKiBWZXJ0ZXggQXJyYXlzICovCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCAgICAgICAgMHg4NjIyCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSAgICAgICAgICAgMHg4NjIzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICAgICAgICAgMHg4NjI0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSAgICAgICAgICAgMHg4NjI1CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCAgICAgMHg4ODZBCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAgICAgICAgMHg4NjQ1CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlGCisKKy8qIFJlYWQgRm9ybWF0ICovCisjZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSAgIDB4OEI5QQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCAweDhCOUIKKworLyogU2hhZGVyIFNvdXJjZSAqLworI2RlZmluZSBHTF9DT01QSUxFX1NUQVRVUyAgICAgICAgICAgICAgICAgMHg4QjgxCisjZGVmaW5lIEdMX0lORk9fTE9HX0xFTkdUSCAgICAgICAgICAgICAgICAweDhCODQKKyNkZWZpbmUgR0xfU0hBREVSX1NPVVJDRV9MRU5HVEggICAgICAgICAgIDB4OEI4OAorI2RlZmluZSBHTF9TSEFERVJfQ09NUElMRVIgICAgICAgICAgICAgICAgMHg4REZBCisKKy8qIFNoYWRlciBCaW5hcnkgKi8KKyNkZWZpbmUgR0xfU0hBREVSX0JJTkFSWV9GT1JNQVRTICAgICAgICAgIDB4OERGOAorI2RlZmluZSBHTF9OVU1fU0hBREVSX0JJTkFSWV9GT1JNQVRTICAgICAgMHg4REY5CisKKy8qIFNoYWRlciBQcmVjaXNpb24tU3BlY2lmaWVkIFR5cGVzICovCisjZGVmaW5lIEdMX0xPV19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAweDhERjAKKyNkZWZpbmUgR0xfTUVESVVNX0ZMT0FUICAgICAgICAgICAgICAgICAgIDB4OERGMQorI2RlZmluZSBHTF9ISUdIX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgMHg4REYyCisjZGVmaW5lIEdMX0xPV19JTlQgICAgICAgICAgICAgICAgICAgICAgICAweDhERjMKKyNkZWZpbmUgR0xfTUVESVVNX0lOVCAgICAgICAgICAgICAgICAgICAgIDB4OERGNAorI2RlZmluZSBHTF9ISUdIX0lOVCAgICAgICAgICAgICAgICAgICAgICAgMHg4REY1CisKKy8qIEZyYW1lYnVmZmVyIE9iamVjdC4gKi8KKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVIgICAgICAgICAgICAgICAgICAgIDB4OEQ0MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVIgICAgICAgICAgICAgICAgICAgMHg4RDQxCisKKyNkZWZpbmUgR0xfUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NgorI2RlZmluZSBHTF9SR0I1X0ExICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU3CisjZGVmaW5lIEdMX1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjIKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgIDB4ODFBNQorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYICAgICAgICAgICAgICAgICAgMHgxOTAxCisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg4ICAgICAgICAgICAgICAgICAweDhENDgKKworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEggICAgICAgICAgICAgMHg4RDQyCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQgICAgICAgICAgICAweDhENDMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVCAgIDB4OEQ0NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkUgICAgICAgICAgMHg4RDUwCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICAgICAgICAweDhENTEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRSAgICAgICAgIDB4OEQ1MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRSAgICAgICAgMHg4RDUzCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFICAgICAgICAweDhENTQKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSAgICAgIDB4OEQ1NQorCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUgICAgICAgICAgIDB4OENEMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FICAgICAgICAgICAweDhDRDEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMICAgICAgICAgMHg4Q0QyCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFIDB4OENEMworCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQwICAgICAgICAgICAgICAweDhDRTAKKyNkZWZpbmUgR0xfREVQVEhfQVRUQUNITUVOVCAgICAgICAgICAgICAgIDB4OEQwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlQgICAgICAgICAgICAgMHg4RDIwCisKKyNkZWZpbmUgR0xfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAweDhDRDUKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UICAgICAgICAgMHg4Q0Q2CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UIDB4OENENworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMgICAgICAgICAweDhDRDkKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgMHg4Q0RECisKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQklORElORyAgICAgICAgICAgIDB4OENBNgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQklORElORyAgICAgICAgICAgMHg4Q0E3CisjZGVmaW5lIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRSAgICAgICAgICAweDg0RTgKKworI2RlZmluZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiAgMHgwNTA2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR0wgY29yZSBmdW5jdGlvbnMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEF0dGFjaFNoYWRlciAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCaW5kQXR0cmliTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciogbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJpbmRCdWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJpbmRSZW5kZXJidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCbGVuZENvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJsZW5kRXF1YXRpb24gKCBHTGVudW0gbW9kZSApOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQmxlbmRGdW5jIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCdWZmZXJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQnVmZmVyU3ViRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7CitHTF9BUElDQUxMIEdMZW51bSAgICAgICBHTF9BUElFTlRSWSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMgKEdMZW51bSB0YXJnZXQpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDbGVhciAoR0xiaXRmaWVsZCBtYXNrKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQ2xlYXJDb2xvciAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoZiAoR0xjbGFtcGYgZGVwdGgpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwgKEdMaW50IHMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENvbXBpbGVTaGFkZXIgKEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCBHTHVpbnQgICAgICAgR0xfQVBJRU5UUlkgZ2xDcmVhdGVQcm9ncmFtICh2b2lkKTsKK0dMX0FQSUNBTEwgR0x1aW50ICAgICAgIEdMX0FQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyIChHTGVudW0gdHlwZSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEN1bGxGYWNlIChHTGVudW0gbW9kZSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVsZXRlRnJhbWVidWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEZWxldGVSZW5kZXJidWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlbGV0ZVNoYWRlciAoR0x1aW50IHNoYWRlcik7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogdGV4dHVyZXMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVwdGhNYXNrIChHTGJvb2xlYW4gZmxhZyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2VmIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERldGFjaFNoYWRlciAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlIChHTGVudW0gY2FwKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5IChHTHVpbnQgaW5kZXgpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEcmF3QXJyYXlzIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHMgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBpbmRpY2VzKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRW5hYmxlIChHTGVudW0gY2FwKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkgKEdMdWludCBpbmRleCk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEZpbmlzaCAodm9pZCk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEZsdXNoICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2VuQnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQqIGJ1ZmZlcnMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcCAoR0xlbnVtIHRhcmdldCk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdlbkZyYW1lYnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdlblJlbmRlcmJ1ZmZlcnMgKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2VuVGV4dHVyZXMgKEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEFjdGl2ZUF0dHJpYiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm0gKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRBdHRhY2hlZFNoYWRlcnMgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIG1heGNvdW50LCBHTHNpemVpKiBjb3VudCwgR0x1aW50KiBzaGFkZXJzKTsKK0dMX0FQSUNBTEwgaW50ICAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0QXR0cmliTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRCb29sZWFudiAoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4qIHBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOworR0xfQVBJQ0FMTCBHTGVudW0gICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRFcnJvciAodm9pZCk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEZsb2F0diAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEludGVnZXJ2IChHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtaXYgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtSW5mb0xvZyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVyaXYgKEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFNoYWRlckluZm9Mb2cgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgKEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQqIHJhbmdlLCBHTGludCogcHJlY2lzaW9uKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVyU291cmNlIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBzb3VyY2UpOworR0xfQVBJQ0FMTCBjb25zdCBHTHVieXRlKiBHTF9BUElFTlRSWSBnbEdldFN0cmluZyAoR0xlbnVtIG5hbWUpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybWZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFVuaWZvcm1pdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKTsKK0dMX0FQSUNBTEwgaW50ICAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybUxvY2F0aW9uIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZnYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiAgICBHTF9BUElFTlRSWSBnbElzQnVmZmVyIChHTHVpbnQgYnVmZmVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNFbmFibGVkIChHTGVudW0gY2FwKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlciAoR0x1aW50IGZyYW1lYnVmZmVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiAgICBHTF9BUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNTaGFkZXIgKEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gICAgR0xfQVBJRU5UUlkgZ2xJc1RleHR1cmUgKEdMdWludCB0ZXh0dXJlKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsTGluZVdpZHRoIChHTGZsb2F0IHdpZHRoKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsTGlua1Byb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsUGl4ZWxTdG9yZWkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0IChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFJlYWRQaXhlbHMgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkKiBwaXhlbHMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIgKHZvaWQpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU2Npc3NvciAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xTaGFkZXJCaW5hcnkgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCBHTHZvaWQqIGJpbmFyeSwgR0xzaXplaSBsZW5ndGgpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xTaGFkZXJTb3VyY2UgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhcioqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxGdW5jIChHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxNYXNrIChHTHVpbnQgbWFzayk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzayk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxPcCAoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmkgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdik7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0xaSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMmYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0yZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKK0dMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0yaXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0zZiAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtM2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdik7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0zaSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtM2l2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdik7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm00aSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MmZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NGZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVc2VQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZhbGlkYXRlUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZiAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmdiAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnYgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZiAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZnYgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpOworR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZiAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmdiAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyk7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXIgKEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0cik7CitHTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZpZXdwb3J0IChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsMl9oXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9HTEVTMi9nbDJleHQuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4NDRkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmgKQEAgLTAsMCArMSw4MzEgQEAKKyNpZm5kZWYgX19nbDJleHRfaF8KKyNkZWZpbmUgX19nbDJleHRfaF8KKworLyogJFJldmlzaW9uOiAxMDc5OCAkIG9uICREYXRlOjogMjAxMC0wMy0xOSAxNzozNDozMCAtMDcwMCAjJCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgorICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgorICovCisKKyNpZm5kZWYgR0xfQVBJRU5UUllQCisjICAgZGVmaW5lIEdMX0FQSUVOVFJZUCBHTF9BUElFTlRSWSoKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIE9FUyBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCisjZGVmaW5lIEdMX0VUQzFfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDY0CisjZW5kaWYKKworLyogR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjkwCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjkxCisjZGVmaW5lIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjkyCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjkzCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk0CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk1CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk2CisjZGVmaW5lIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk3CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk4CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk5CisjZW5kaWYKKworLyogR0xfT0VTX2RlcHRoMjQgKi8KKyNpZm5kZWYgR0xfT0VTX2RlcHRoMjQKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxQTYKKyNlbmRpZgorCisvKiBHTF9PRVNfZGVwdGgzMiAqLworI2lmbmRlZiBHTF9PRVNfZGVwdGgzMgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODFBNworI2VuZGlmCisKKy8qIEdMX09FU19kZXB0aF90ZXh0dXJlICovCisvKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCisKKy8qIEdMX09FU19FR0xfaW1hZ2UgKi8KKyNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQordHlwZWRlZiB2b2lkKiBHTGVnbEltYWdlT0VTOworI2VuZGlmCisKKy8qIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgKi8KKyNpZm5kZWYgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwNQorI2VuZGlmCisKKy8qIEdMX09FU19nZXRfcHJvZ3JhbV9iaW5hcnkgKi8KKyNpZm5kZWYgR0xfT0VTX2dldF9wcm9ncmFtX2JpbmFyeQorI2RlZmluZSBHTF9QUk9HUkFNX0JJTkFSWV9MRU5HVEhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODc0MQorI2RlZmluZSBHTF9OVU1fUFJPR1JBTV9CSU5BUllfRk9STUFUU19PRVMgICAgICAgICAgICAgICAgICAgICAgIDB4ODdGRQorI2RlZmluZSBHTF9QUk9HUkFNX0JJTkFSWV9GT1JNQVRTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdGRgorI2VuZGlmCisKKy8qIEdMX09FU19tYXBidWZmZXIgKi8KKyNpZm5kZWYgR0xfT0VTX21hcGJ1ZmZlcgorI2RlZmluZSBHTF9XUklURV9PTkxZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCOQorI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQgorI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQworI2RlZmluZSBHTF9CVUZGRVJfTUFQX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCRAorI2VuZGlmCisKKy8qIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAqLworI2lmbmRlZiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzI0XzhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RkEKKyNkZWZpbmUgR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4RjAKKyNlbmRpZgorCisvKiBHTF9PRVNfcmdiOF9yZ2JhOCAqLworI2lmbmRlZiBHTF9PRVNfcmdiOF9yZ2JhOAorI2RlZmluZSBHTF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MQorI2RlZmluZSBHTF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OAorI2VuZGlmCisKKy8qIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyAqLworI2lmbmRlZiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVF9PRVMgICAgICAgICAgICAgICAgICAweDhCOEIKKyNlbmRpZgorCisvKiBHTF9PRVNfc3RlbmNpbDEgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWwxCisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVgxX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQ2CisjZW5kaWYKKworLyogR0xfT0VTX3N0ZW5jaWw0ICovCisjaWZuZGVmIEdMX09FU19zdGVuY2lsNAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0NworI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlXzNEICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlXzNECisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9SX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDcyCisjZGVmaW5lIEdMX1RFWFRVUkVfM0RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDZGCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18zRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDZBCisjZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDczCisjZGVmaW5lIEdMX1NBTVBMRVJfM0RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjVGCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV8zRF9aT0ZGU0VUX09FUyAgICAgICAgMHg4Q0Q0CisjZW5kaWYKKworLyogR0xfT0VTX3RleHR1cmVfZmxvYXQgKi8KKy8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KKworLyogR0xfT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyICovCisvKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCisKKy8qIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQgKi8KKyNpZm5kZWYgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdAorI2RlZmluZSBHTF9IQUxGX0ZMT0FUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2MQorI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyICovCisvKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCisKKy8qIEdMX09FU190ZXh0dXJlX25wb3QgKi8KKy8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KKworLyogR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QgKi8KKyNpZm5kZWYgR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1QjUKKyNlbmRpZgorCisvKiBHTF9PRVNfdmVydGV4X2hhbGZfZmxvYXQgKi8KKy8qIEdMX0hBTEZfRkxPQVRfT0VTIGRlZmluZWQgaW4gR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdCBhbHJlYWR5LiAqLworCisvKiBHTF9PRVNfdmVydGV4X3R5cGVfMTBfMTBfMTBfMiAqLworI2lmbmRlZiBHTF9PRVNfdmVydGV4X3R5cGVfMTBfMTBfMTBfMgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OERGNgorI2RlZmluZSBHTF9JTlRfMTBfMTBfMTBfMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OERGNworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogQU1EIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUKKyNkZWZpbmUgR0xfM0RDX1hfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RjkKKyNkZWZpbmUgR0xfM0RDX1hZX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RkEKKyNlbmRpZgorCisvKiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZQorI2RlZmluZSBHTF9BVENfUkdCX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MgorI2RlZmluZSBHTF9BVENfUkdCQV9FWFBMSUNJVF9BTFBIQV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MworI2RlZmluZSBHTF9BVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEFfQU1EICAgICAgICAgICAgICAgICAgICAgIDB4ODdFRQorI2VuZGlmCisKKy8qIEdMX0FNRF9wZXJmb3JtYW5jZV9tb25pdG9yICovCisjaWZuZGVmIEdMX0FNRF9wZXJmb3JtYW5jZV9tb25pdG9yCisjZGVmaW5lIEdMX0NPVU5URVJfVFlQRV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkMwCisjZGVmaW5lIEdMX0NPVU5URVJfUkFOR0VfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkMxCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDY0X0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkMyCisjZGVmaW5lIEdMX1BFUkNFTlRBR0VfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkMzCisjZGVmaW5lIEdMX1BFUkZNT05fUkVTVUxUX0FWQUlMQUJMRV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkM0CisjZGVmaW5lIEdMX1BFUkZNT05fUkVTVUxUX1NJWkVfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkM1CisjZGVmaW5lIEdMX1BFUkZNT05fUkVTVUxUX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkM2CisjZW5kaWYKKworLyogR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAgKi8KKyNpZm5kZWYgR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAKKyNkZWZpbmUgR0xfWjQwMF9CSU5BUllfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3NDAKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEVYVCBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX0VYVF9ibGVuZF9taW5tYXggKi8KKyNpZm5kZWYgR0xfRVhUX2JsZW5kX21pbm1heAorI2RlZmluZSBHTF9NSU5fRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNworI2RlZmluZSBHTF9NQVhfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOAorI2VuZGlmCisKKy8qIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyICovCisjaWZuZGVmIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyCisjZGVmaW5lIEdMX0NPTE9SX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAwCisjZGVmaW5lIEdMX0RFUFRIX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAxCisjZGVmaW5lIEdMX1NURU5DSUxfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAyCisjZW5kaWYKKworLyogR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzICovCisvKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCisKKy8qIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhICovCisjaWZuZGVmIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhCisjZGVmaW5lIEdMX0JHUkFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MzY1CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MzY2CisjZW5kaWYKKworLyogR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYworI2RlZmluZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRgorI2VuZGlmCisKKy8qIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAqLworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKKyNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKKyNlbmRpZgorCisvKiBHTF9FWFRfdGV4dHVyZV90eXBlXzJfMTBfMTBfMTBfUkVWICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3R5cGVfMl8xMF8xMF8xMF9SRVYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgzNjgKKyNlbmRpZgorCisvKiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQxICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDgzRjAKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgzRjEKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIElNRyBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX0lNR19wcm9ncmFtX2JpbmFyeSAqLworI2lmbmRlZiBHTF9JTUdfcHJvZ3JhbV9iaW5hcnkKKyNkZWZpbmUgR0xfU0dYX1BST0dSQU1fQklOQVJZX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzAKKyNlbmRpZgorCisvKiBHTF9JTUdfcmVhZF9mb3JtYXQgKi8KKyNpZm5kZWYgR0xfSU1HX3JlYWRfZm9ybWF0CisjZGVmaW5lIEdMX0JHUkFfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWX0lNRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MzY1CisjZW5kaWYKKworLyogR0xfSU1HX3NoYWRlcl9iaW5hcnkgKi8KKyNpZm5kZWYgR0xfSU1HX3NoYWRlcl9iaW5hcnkKKyNkZWZpbmUgR0xfU0dYX0JJTkFSWV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDMEEKKyNlbmRpZgorCisvKiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YyAqLworI2lmbmRlZiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HICAgICAgICAgICAgICAgICAgICAgIDB4OEMwMAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HICAgICAgICAgICAgICAgICAgICAgIDB4OEMwMQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgIDB4OEMwMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgIDB4OEMwMworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogTlYgZXh0ZW5zaW9uIHRva2VucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9OVl9mZW5jZSAqLworI2lmbmRlZiBHTF9OVl9mZW5jZQorI2RlZmluZSBHTF9BTExfQ09NUExFVEVEX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGMgorI2RlZmluZSBHTF9GRU5DRV9TVEFUVVNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGMworI2RlZmluZSBHTF9GRU5DRV9DT05ESVRJT05fTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGNAorI2VuZGlmCisKKy8qIEdMX05WX2NvdmVyYWdlX3NhbXBsZSAqLworI2lmbmRlZiBHTF9OVl9jb3ZlcmFnZV9zYW1wbGUKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQ09NUE9ORU5UX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhFRDAKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQ09NUE9ORU5UNF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhFRDEKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQVRUQUNITUVOVF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhFRDIKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQlVGRkVSU19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhFRDMKKyNkZWZpbmUgR0xfQ09WRVJBR0VfU0FNUExFU19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhFRDQKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQUxMX0ZSQUdNRU5UU19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhFRDUKKyNkZWZpbmUgR0xfQ09WRVJBR0VfRURHRV9GUkFHTUVOVFNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhFRDYKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQVVUT01BVElDX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhFRDcKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQlVGRkVSX0JJVF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNlbmRpZgorCisvKiBHTF9OVl9kZXB0aF9ub25saW5lYXIgKi8KKyNpZm5kZWYgR0xfTlZfZGVwdGhfbm9ubGluZWFyCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2X05PTkxJTkVBUl9OViAgICAgICAgICAgICAgICAgICAgICAgMHg4RTJDCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBRQ09NIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfUUNPTV9kcml2ZXJfY29udHJvbCAqLworLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLworCisvKiBHTF9RQ09NX2V4dGVuZGVkX2dldCAqLworI2lmbmRlZiBHTF9RQ09NX2V4dGVuZGVkX2dldAorI2RlZmluZSBHTF9URVhUVVJFX1dJRFRIX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEMgorI2RlZmluZSBHTF9URVhUVVJFX0hFSUdIVF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEMworI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJENAorI2RlZmluZSBHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJENQorI2RlZmluZSBHTF9URVhUVVJFX0ZPUk1BVF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJENgorI2RlZmluZSBHTF9URVhUVVJFX1RZUEVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJENworI2RlZmluZSBHTF9URVhUVVJFX0lNQUdFX1ZBTElEX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEOAorI2RlZmluZSBHTF9URVhUVVJFX05VTV9MRVZFTFNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEOQorI2RlZmluZSBHTF9URVhUVVJFX1RBUkdFVF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEQQorI2RlZmluZSBHTF9URVhUVVJFX09CSkVDVF9WQUxJRF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEQgorI2RlZmluZSBHTF9TVEFURV9SRVNUT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEQworI2VuZGlmCisKKy8qIEdMX1FDT01fZXh0ZW5kZWRfZ2V0MiAqLworLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLworCisvKiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUgKi8KKyNpZm5kZWYgR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlCisjZGVmaW5lIEdMX1BFUkZNT05fR0xPQkFMX01PREVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RkEwCisjZW5kaWYKKworLyogR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nICovCisjaWZuZGVmIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZworI2RlZmluZSBHTF9XUklURU9OTFlfUkVOREVSSU5HX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgyMworI2VuZGlmCisKKy8qIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nICovCisjaWZuZGVmIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQwX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUMV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQzX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUNF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQ2X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUN19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQxX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUMl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQ0X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUNV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQ3X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQwX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUMV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQzX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUNF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ2X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUN19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQwX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUMV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQzX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUNF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQ2X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUN19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEFOR0xFIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfQU5HTEVfZnJhbWVidWZmZXJfYmxpdCAqLworI2lmbmRlZiBHTF9BTkdMRV9mcmFtZWJ1ZmZlcl9ibGl0CisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQU5HTEUgICAgICAgICAweDhDQTgKKyNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9BTkdMRSAgICAgICAgIDB4OENBOQorI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkdfQU5HTEUgMHg4Q0E2IC8vIGFsaWFzIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkcKKyNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HX0FOR0xFIDB4OENBQQorI2VuZGlmCisKKy8qIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICovCisjaWZuZGVmIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0FOR0xFICAgICAgICAgICAgICAgICAgIDB4OENBQgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0FOR0xFICAgICAweDhENTYKKyNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfQU5HTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDU3CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBFbmQgb2YgZXh0ZW5zaW9uIHRva2Vucywgc3RhcnQgb2YgY29ycmVzcG9uZGluZyBleHRlbnNpb24gZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogT0VTIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUKKyNkZWZpbmUgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUgMQorI2VuZGlmCisKKy8qIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfZGVwdGgyNCAqLworI2lmbmRlZiBHTF9PRVNfZGVwdGgyNAorI2RlZmluZSBHTF9PRVNfZGVwdGgyNCAxCisjZW5kaWYKKworLyogR0xfT0VTX2RlcHRoMzIgKi8KKyNpZm5kZWYgR0xfT0VTX2RlcHRoMzIKKyNkZWZpbmUgR0xfT0VTX2RlcHRoMzIgMQorI2VuZGlmCisKKy8qIEdMX09FU19kZXB0aF90ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19kZXB0aF90ZXh0dXJlCisjZGVmaW5lIEdMX09FU19kZXB0aF90ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfRUdMX2ltYWdlICovCisjaWZuZGVmIEdMX09FU19FR0xfaW1hZ2UKKyNkZWZpbmUgR0xfT0VTX0VHTF9pbWFnZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFR0xJTUFHRVRBUkdFVFRFWFRVUkUyRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRUdMSU1BR0VUQVJHRVRSRU5ERVJCVUZGRVJTVE9SQUdFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOworI2VuZGlmCisKKy8qIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgKi8KKyNpZm5kZWYgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludAorI2RlZmluZSBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50IDEKKyNlbmRpZgorCisvKiBHTF9PRVNfZmJvX3JlbmRlcl9taXBtYXAgKi8KKyNpZm5kZWYgR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwCisjZGVmaW5lIEdMX09FU19mYm9fcmVuZGVyX21pcG1hcCAxCisjZW5kaWYKKworLyogR0xfT0VTX2ZyYWdtZW50X3ByZWNpc2lvbl9oaWdoICovCisjaWZuZGVmIEdMX09FU19mcmFnbWVudF9wcmVjaXNpb25faGlnaAorI2RlZmluZSBHTF9PRVNfZnJhZ21lbnRfcHJlY2lzaW9uX2hpZ2ggMQorI2VuZGlmCisKKy8qIEdMX09FU19nZXRfcHJvZ3JhbV9iaW5hcnkgKi8KKyNpZm5kZWYgR0xfT0VTX2dldF9wcm9ncmFtX2JpbmFyeQorI2RlZmluZSBHTF9PRVNfZ2V0X3Byb2dyYW1fYmluYXJ5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtQmluYXJ5T0VTIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtQmluYXJ5T0VTIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIGJpbmFyeUZvcm1hdCwgY29uc3QgR0x2b2lkICpiaW5hcnksIEdMaW50IGxlbmd0aCk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUJJTkFSWU9FU1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1CSU5BUllPRVNQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTGludCBsZW5ndGgpOworI2VuZGlmCisKKy8qIEdMX09FU19tYXBidWZmZXIgKi8KKyNpZm5kZWYgR0xfT0VTX21hcGJ1ZmZlcgorI2RlZmluZSBHTF9PRVNfbWFwYnVmZmVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQqIEdMX0FQSUVOVFJZIGdsTWFwQnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsVW5tYXBCdWZmZXJPRVMgKEdMZW51bSB0YXJnZXQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcGFyYW1zKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkKiAoR0xfQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTFVOTUFQQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQT0lOVEVSVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBhcmFtcyk7CisjZW5kaWYKKworLyogR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsICovCisjaWZuZGVmIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgMQorI2VuZGlmCisKKy8qIEdMX09FU19yZ2I4X3JnYmE4ICovCisjaWZuZGVmIEdMX09FU19yZ2I4X3JnYmE4CisjZGVmaW5lIEdMX09FU19yZ2I4X3JnYmE4IDEKKyNlbmRpZgorCisvKiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgKi8KKyNpZm5kZWYgR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzCisjZGVmaW5lIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyAxCisjZW5kaWYKKworLyogR0xfT0VTX3N0ZW5jaWwxICovCisjaWZuZGVmIEdMX09FU19zdGVuY2lsMQorI2RlZmluZSBHTF9PRVNfc3RlbmNpbDEgMQorI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsNCAqLworI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDQKKyNkZWZpbmUgR0xfT0VTX3N0ZW5jaWw0IDEKKyNlbmRpZgorCisvKiBHTF9PRVNfdGV4dHVyZV8zRCAqLworI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV8zRAorI2RlZmluZSBHTF9PRVNfdGV4dHVyZV8zRCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4SW1hZ2UzRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN1YkltYWdlM0RPRVMgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTNET0VTIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UzRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhTVUJJTUFHRTNET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ09QWVRFWFNVQklNQUdFM0RPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFM0RPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTNET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTNET0VTKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7CisjZW5kaWYKKworLyogR0xfT0VTX3RleHR1cmVfZmxvYXQgKi8KKyNpZm5kZWYgR0xfT0VTX3RleHR1cmVfZmxvYXQKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfZmxvYXQgMQorI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciAqLworI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfdGV4dHVyZV9oYWxmX2Zsb2F0ICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdCAxCisjZW5kaWYKKworLyogR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIgKi8KKyNpZm5kZWYgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIgMQorI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlX25wb3QgKi8KKyNpZm5kZWYgR0xfT0VTX3RleHR1cmVfbnBvdAorI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9ucG90IDEKKyNlbmRpZgorCisvKiBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdCAqLworI2lmbmRlZiBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFZlcnRleEFycmF5T0VTIChHTHVpbnQgYXJyYXkpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlblZlcnRleEFycmF5c09FUyAoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cyk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzVmVydGV4QXJyYXlPRVMgKEdMdWludCBhcnJheSk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklORFZFUlRFWEFSUkFZT0VTUFJPQykgKEdMdWludCBhcnJheSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFTEVURVZFUlRFWEFSUkFZU09FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VOVkVSVEVYQVJSQVlTT0VTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTVkVSVEVYQVJSQVlPRVNQUk9DKSAoR0x1aW50IGFycmF5KTsKKyNlbmRpZgorCisvKiBHTF9PRVNfdmVydGV4X2hhbGZfZmxvYXQgKi8KKyNpZm5kZWYgR0xfT0VTX3ZlcnRleF9oYWxmX2Zsb2F0CisjZGVmaW5lIEdMX09FU192ZXJ0ZXhfaGFsZl9mbG9hdCAxCisjZW5kaWYKKworLyogR0xfT0VTX3ZlcnRleF90eXBlXzEwXzEwXzEwXzIgKi8KKyNpZm5kZWYgR0xfT0VTX3ZlcnRleF90eXBlXzEwXzEwXzEwXzIKKyNkZWZpbmUgR0xfT0VTX3ZlcnRleF90eXBlXzEwXzEwXzEwXzIgMQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogQU1EIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUKKyNkZWZpbmUgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgMQorI2VuZGlmCisKKy8qIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlICovCisjaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlCisjZGVmaW5lIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBBTURfcGVyZm9ybWFuY2VfbW9uaXRvciAqLworI2lmbmRlZiBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvcgorI2RlZmluZSBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQgKEdMaW50ICpudW1Hcm91cHMsIEdMc2l6ZWkgZ3JvdXBzU2l6ZSwgR0x1aW50ICpncm91cHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EIChHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5QZXJmTW9uaXRvcnNBTUQgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVQZXJmTW9uaXRvcnNBTUQgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EIChHTHVpbnQgbW9uaXRvciwgR0xib29sZWFuIGVuYWJsZSwgR0x1aW50IGdyb3VwLCBHTGludCBudW1Db3VudGVycywgR0x1aW50ICpjb3VudGVyc0xpc3QpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmVnaW5QZXJmTW9uaXRvckFNRCAoR0x1aW50IG1vbml0b3IpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5kUGVyZk1vbml0b3JBTUQgKEdMdWludCBtb25pdG9yKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQgKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbik7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRk1PTklUT1JHUk9VUFNBTURQUk9DKSAoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3Vwcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUlNBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SR1JPVVBTVFJJTkdBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUlNUUklOR0FNRFBST0MpIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpjb3VudGVyU3RyaW5nKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRk1PTklUT1JDT1VOVEVSSU5GT0FNRFBST0MpIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTlBFUkZNT05JVE9SU0FNRFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVQRVJGTU9OSVRPUlNBTURQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU0VMRUNUUEVSRk1PTklUT1JDT1VOVEVSU0FNRFBST0MpIChHTHVpbnQgbW9uaXRvciwgR0xib29sZWFuIGVuYWJsZSwgR0x1aW50IGdyb3VwLCBHTGludCBudW1Db3VudGVycywgR0x1aW50ICpjb3VudGVyc0xpc3QpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCRUdJTlBFUkZNT05JVE9SQU1EUFJPQykgKEdMdWludCBtb25pdG9yKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5EUEVSRk1PTklUT1JBTURQUk9DKSAoR0x1aW50IG1vbml0b3IpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkNPVU5URVJEQVRBQU1EUFJPQykgKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbik7CisjZW5kaWYKKworLyogR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAgKi8KKyNpZm5kZWYgR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAKKyNkZWZpbmUgR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAgMQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogRVhUIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfRVhUX2JsZW5kX21pbm1heCAqLworI2lmbmRlZiBHTF9FWFRfYmxlbmRfbWlubWF4CisjZGVmaW5lIEdMX0VYVF9ibGVuZF9taW5tYXggMQorI2VuZGlmCisKKy8qIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyICovCisjaWZuZGVmIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyCisjZGVmaW5lIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERJU0NBUkRGUkFNRUJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cworI2RlZmluZSBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpRHJhd0FycmF5c0VYVCAoR0xlbnVtLCBHTGludCAqLCBHTHNpemVpICosIEdMc2l6ZWkpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlEcmF3RWxlbWVudHNFWFQgKEdMZW51bSwgY29uc3QgR0xzaXplaSAqLCBHTGVudW0sIGNvbnN0IEdMdm9pZCogKiwgR0xzaXplaSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNVUxUSURSQVdBUlJBWVNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50ICpmaXJzdCwgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVFNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOworI2VuZGlmCisKKy8qIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhICovCisjaWZuZGVmIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhCisjZGVmaW5lIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhIDEKKyNlbmRpZgorCisvKiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgKi8KKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyAxCisjZW5kaWYKKworLyogR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OAorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggMQorI2VuZGlmCisKKy8qIEdMX0VYVF90ZXh0dXJlX3R5cGVfMl8xMF8xMF8xMF9SRVYgKi8KKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfdHlwZV8yXzEwXzEwXzEwX1JFVgorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV90eXBlXzJfMTBfMTBfMTBfUkVWIDEKKyNlbmRpZgorCisvKiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQxICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MSAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBJTUcgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9JTUdfcHJvZ3JhbV9iaW5hcnkgKi8KKyNpZm5kZWYgR0xfSU1HX3Byb2dyYW1fYmluYXJ5CisjZGVmaW5lIEdMX0lNR19wcm9ncmFtX2JpbmFyeSAxCisjZW5kaWYKKworLyogR0xfSU1HX3JlYWRfZm9ybWF0ICovCisjaWZuZGVmIEdMX0lNR19yZWFkX2Zvcm1hdAorI2RlZmluZSBHTF9JTUdfcmVhZF9mb3JtYXQgMQorI2VuZGlmCisKKy8qIEdMX0lNR19zaGFkZXJfYmluYXJ5ICovCisjaWZuZGVmIEdMX0lNR19zaGFkZXJfYmluYXJ5CisjZGVmaW5lIEdMX0lNR19zaGFkZXJfYmluYXJ5IDEKKyNlbmRpZgorCisvKiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YyAqLworI2lmbmRlZiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YworI2RlZmluZSBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YyAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBOViBleHRlbnNpb24gZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX05WX2ZlbmNlICovCisjaWZuZGVmIEdMX05WX2ZlbmNlCisjZGVmaW5lIEdMX05WX2ZlbmNlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVGZW5jZXNOViAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuRmVuY2VzTlYgKEdMc2l6ZWksIEdMdWludCAqKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNGZW5jZU5WIChHTHVpbnQpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xUZXN0RmVuY2VOViAoR0x1aW50KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZlbmNlaXZOViAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRmluaXNoRmVuY2VOViAoR0x1aW50KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFNldEZlbmNlTlYgKEdMdWludCwgR0xlbnVtKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVGRU5DRVNOVlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VORkVOQ0VTTlZQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMSVNGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMVEVTVEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURkVOQ0VJVk5WUFJPQykgKEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRklOSVNIRkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xTRVRGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbik7CisjZW5kaWYKKworLyogR0xfTlZfY292ZXJhZ2Vfc2FtcGxlICovCisjaWZuZGVmIEdMX05WX2NvdmVyYWdlX3NhbXBsZQorI2RlZmluZSBHTF9OVl9jb3ZlcmFnZV9zYW1wbGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvdmVyYWdlTWFza05WIChHTGJvb2xlYW4gbWFzayk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WIChHTGVudW0gb3BlcmF0aW9uKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT1ZFUkFHRU1BU0tOVlBST0MpIChHTGJvb2xlYW4gbWFzayk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPVkVSQUdFT1BFUkFUSU9OTlZQUk9DKSAoR0xlbnVtIG9wZXJhdGlvbik7CisjZW5kaWYKKworLyogR0xfTlZfZGVwdGhfbm9ubGluZWFyICovCisjaWZuZGVmIEdMX05WX2RlcHRoX25vbmxpbmVhcgorI2RlZmluZSBHTF9OVl9kZXB0aF9ub25saW5lYXIgMQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogUUNPTSBleHRlbnNpb24gZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wgKi8KKyNpZm5kZWYgR0xfUUNPTV9kcml2ZXJfY29udHJvbAorI2RlZmluZSBHTF9RQ09NX2RyaXZlcl9jb250cm9sIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXREcml2ZXJDb250cm9sc1FDT00gKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTSAoR0x1aW50IGRyaXZlckNvbnRyb2wsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmRyaXZlckNvbnRyb2xTdHJpbmcpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00gKEdMdWludCBkcml2ZXJDb250cm9sKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVERSSVZFUkNPTlRST0xTUUNPTVBST0MpIChHTGludCAqbnVtLCBHTHNpemVpIHNpemUsIEdMdWludCAqZHJpdmVyQ29udHJvbHMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVREUklWRVJDT05UUk9MU1RSSU5HUUNPTVBST0MpIChHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVOQUJMRURSSVZFUkNPTlRST0xRQ09NUFJPQykgKEdMdWludCBkcml2ZXJDb250cm9sKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRElTQUJMRURSSVZFUkNPTlRST0xRQ09NUFJPQykgKEdMdWludCBkcml2ZXJDb250cm9sKTsKKyNlbmRpZgorCisvKiBHTF9RQ09NX2V4dGVuZGVkX2dldCAqLworI2lmbmRlZiBHTF9RQ09NX2V4dGVuZGVkX2dldAorI2RlZmluZSBHTF9RQ09NX2V4dGVuZGVkX2dldCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0VGV4dHVyZXNRQ09NIChHTHVpbnQgKnRleHR1cmVzLCBHTGludCBtYXhUZXh0dXJlcywgR0xpbnQgKm51bVRleHR1cmVzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldEJ1ZmZlcnNRQ09NIChHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NIChHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00gKEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00gKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00gKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00gKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcyk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYVFVSRVNRQ09NUFJPQykgKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRCVUZGRVJTUUNPTVBST0MpIChHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUUkVOREVSQlVGRkVSU1FDT01QUk9DKSAoR0x1aW50ICpyZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqbnVtUmVuZGVyYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVEZSQU1FQlVGRkVSU1FDT01QUk9DKSAoR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFRFWExFVkVMUEFSQU1FVEVSSVZRQ09NUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVFRFWE9CSkVDVFNUQVRFT1ZFUlJJREVJUUNPTVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYU1VCSU1BR0VRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUQlVGRkVSUE9JTlRFUlZRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcyk7CisjZW5kaWYKKworLyogR0xfUUNPTV9leHRlbmRlZF9nZXQyICovCisjaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0MgorI2RlZmluZSBHTF9RQ09NX2V4dGVuZGVkX2dldDIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFNoYWRlcnNRQ09NIChHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFByb2dyYW1zUUNPTSAoR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcyk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00gKEdMdWludCBwcm9ncmFtKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRTSEFERVJTUUNPTVBST0MpIChHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUUFJPR1JBTVNRQ09NUFJPQykgKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTEVYVElTUFJPR1JBTUJJTkFSWVFDT01QUk9DKSAoR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRQUk9HUkFNQklOQVJZU09VUkNFUUNPTVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKTsKKyNlbmRpZgorCisvKiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUgKi8KKyNpZm5kZWYgR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlCisjZGVmaW5lIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZSAxCisjZW5kaWYKKworLyogR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nICovCisjaWZuZGVmIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZworI2RlZmluZSBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcgMQorI2VuZGlmCisKKy8qIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nICovCisjaWZuZGVmIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nCisjZGVmaW5lIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGFydFRpbGluZ1FDT00gKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmRUaWxpbmdRQ09NIChHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU1RBUlRUSUxJTkdRQ09NUFJPQykgKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVORFRJTElOR1FDT01QUk9DKSAoR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogQU5HTEUgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9BTkdMRV9mcmFtZWJ1ZmZlcl9ibGl0ICovCisjaWZuZGVmIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX2JsaXQKKyNkZWZpbmUgR0xfQU5HTEVfZnJhbWVidWZmZXJfYmxpdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmxpdEZyYW1lYnVmZmVyQU5HTEUgKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcik7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxJVEZSQU1FQlVGRkVSQU5HTEVQUk9DKSAoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOworI2VuZGlmCisKKy8qIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICovCisjaWZuZGVmIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVBTkdMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsMmV4dF9oXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9HTEVTMi9nbDJwbGF0Zm9ybS5oIGIvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9HTEVTMi9nbDJwbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZmEzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9pbmNsdWRlL0dMRVMyL2dsMnBsYXRmb3JtLmgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBfX2dsMnBsYXRmb3JtX2hfCisjZGVmaW5lIF9fZ2wycGxhdGZvcm1faF8KKworLyogJFJldmlzaW9uOiAxMDYwMiAkIG9uICREYXRlOjogMjAxMC0wMy0wNCAyMjozNTozNCAtMDgwMCAjJCAqLworCisvKgorICogVGhpcyBkb2N1bWVudCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0dJIEZyZWUgU29mdHdhcmUgQiBMaWNlbnNlIFZlcnNpb24KKyAqIDIuMC4gRm9yIGRldGFpbHMsIHNlZSBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIvIC4KKyAqLworCisvKiBQbGF0Zm9ybS1zcGVjaWZpYyB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIE9wZW5HTCBFUyAyLlggIGdsMi5oCisgKgorICogQWRvcHRlcnMgbWF5IG1vZGlmeSBraHJwbGF0Zm9ybS5oIGFuZCB0aGlzIGZpbGUgdG8gc3VpdCB0aGVpciBwbGF0Zm9ybS4KKyAqIFlvdSBhcmUgZW5jb3VyYWdlZCB0byBzdWJtaXQgYWxsIG1vZGlmaWNhdGlvbnMgdG8gdGhlIEtocm9ub3MgZ3JvdXAgc28gdGhhdAorICogdGhleSBjYW4gYmUgaW5jbHVkZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgZmlsZS4gIFBsZWFzZSBzdWJtaXQgY2hhbmdlcworICogYnkgc2VuZGluZyB0aGVtIHRvIHRoZSBwdWJsaWMgS2hyb25vcyBCdWd6aWxsYSAoaHR0cDovL2tocm9ub3Mub3JnL2J1Z3ppbGxhKQorICogYnkgZmlsaW5nIGEgYnVnIGFnYWluc3QgcHJvZHVjdCAiT3BlbkdMLUVTIiBjb21wb25lbnQgIlJlZ2lzdHJ5Ii4KKyAqLworCisjaW5jbHVkZSA8S0hSL2tocnBsYXRmb3JtLmg+CisKKyNpZm5kZWYgR0xfQVBJQ0FMTAorI2RlZmluZSBHTF9BUElDQUxMICBLSFJPTk9TX0FQSUNBTEwKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQSUVOVFJZCisjZGVmaW5lIEdMX0FQSUVOVFJZIEtIUk9OT1NfQVBJRU5UUlkKKyNlbmRpZgorCisjZW5kaWYgLyogX19nbDJwbGF0Zm9ybV9oXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvaW5jbHVkZS9HTFNMQU5HL1NoYWRlckxhbmcuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2luY2x1ZGUvR0xTTEFORy9TaGFkZXJMYW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5NWE4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2luY2x1ZGUvR0xTTEFORy9TaGFkZXJMYW5nLmgKQEAgLTAsMCArMSwyNzQgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisjaWZuZGVmIF9DT01QSUxFUl9JTlRFUkZBQ0VfSU5DTFVERURfCisjZGVmaW5lIF9DT01QSUxFUl9JTlRFUkZBQ0VfSU5DTFVERURfCisKKy8vCisvLyBUaGlzIGlzIHRoZSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBpbnRlcmZhY2UgYmV0d2VlbiBhbiBPR0wgZHJpdmVyCisvLyBhbmQgdGhlIHNoYWRpbmcgbGFuZ3VhZ2UgY29tcGlsZXIuCisvLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFZlcnNpb24gbnVtYmVyIGZvciBzaGFkZXIgdHJhbnNsYXRpb24gQVBJLgorLy8gSXQgaXMgaW5jcmVtZW50ZWQgZXZlcnl0aW1lIHRoZSBBUEkgY2hhbmdlcy4KKyNkZWZpbmUgU0hfVkVSU0lPTiAxMDQKKworLy8KKy8vIFRoZSBuYW1lcyBvZiB0aGUgZm9sbG93aW5nIGVudW1zIGhhdmUgYmVlbiBkZXJpdmVkIGJ5IHJlcGxhY2luZyBHTCBwcmVmaXgKKy8vIHdpdGggU0guIEZvciBleGFtcGxlLCBTSF9JTkZPX0xPR19MRU5HVEggaXMgZXF1aXZhbGVudCB0byBHTF9JTkZPX0xPR19MRU5HVEguCisvLyBUaGUgZW51bSB2YWx1ZXMgYXJlIGFsc28gZXF1YWwgdG8gdGhlIHZhbHVlcyBvZiB0aGVpciBHTCBjb3VudGVycGFydC4gVGhpcworLy8gaXMgZG9uZSB0byBtYWtlIGl0IGVhc2llciBmb3IgYXBwbGljYXRpb25zIHRvIHVzZSB0aGUgc2hhZGVyIGxpYnJhcnkuCisvLwordHlwZWRlZiBlbnVtIHsKKyAgU0hfRlJBR01FTlRfU0hBREVSID0gMHg4QjMwLAorICBTSF9WRVJURVhfU0hBREVSICAgPSAweDhCMzEKK30gU2hTaGFkZXJUeXBlOworCit0eXBlZGVmIGVudW0geworICBTSF9HTEVTMl9TUEVDID0gMHg4QjQwLAorICBTSF9XRUJHTF9TUEVDID0gMHg4QjQxCit9IFNoU2hhZGVyU3BlYzsKKwordHlwZWRlZiBlbnVtIHsKKyAgU0hfTk9ORSAgICAgICAgICAgPSAwLAorICBTSF9JTlQgICAgICAgICAgICA9IDB4MTQwNCwKKyAgU0hfRkxPQVQgICAgICAgICAgPSAweDE0MDYsCisgIFNIX0ZMT0FUX1ZFQzIgICAgID0gMHg4QjUwLAorICBTSF9GTE9BVF9WRUMzICAgICA9IDB4OEI1MSwKKyAgU0hfRkxPQVRfVkVDNCAgICAgPSAweDhCNTIsCisgIFNIX0lOVF9WRUMyICAgICAgID0gMHg4QjUzLAorICBTSF9JTlRfVkVDMyAgICAgICA9IDB4OEI1NCwKKyAgU0hfSU5UX1ZFQzQgICAgICAgPSAweDhCNTUsCisgIFNIX0JPT0wgICAgICAgICAgID0gMHg4QjU2LAorICBTSF9CT09MX1ZFQzIgICAgICA9IDB4OEI1NywKKyAgU0hfQk9PTF9WRUMzICAgICAgPSAweDhCNTgsCisgIFNIX0JPT0xfVkVDNCAgICAgID0gMHg4QjU5LAorICBTSF9GTE9BVF9NQVQyICAgICA9IDB4OEI1QSwKKyAgU0hfRkxPQVRfTUFUMyAgICAgPSAweDhCNUIsCisgIFNIX0ZMT0FUX01BVDQgICAgID0gMHg4QjVDLAorICBTSF9TQU1QTEVSXzJEICAgICA9IDB4OEI1RSwKKyAgU0hfU0FNUExFUl9DVUJFICAgPSAweDhCNjAKK30gU2hEYXRhVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgU0hfSU5GT19MT0dfTEVOR1RIICAgICAgICAgICAgID0gIDB4OEI4NCwKKyAgU0hfT0JKRUNUX0NPREVfTEVOR1RIICAgICAgICAgID0gIDB4OEI4OCwgIC8vIEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RICisgIFNIX0FDVElWRV9VTklGT1JNUyAgICAgICAgICAgICA9ICAweDhCODYsCisgIFNIX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEggICA9ICAweDhCODcsCisgIFNIX0FDVElWRV9BVFRSSUJVVEVTICAgICAgICAgICA9ICAweDhCODksCisgIFNIX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCA9ICAweDhCOEEsCisgIFNIX01BUFBFRF9OQU1FX01BWF9MRU5HVEggICAgICA9ICAweDhCOEIKK30gU2hTaGFkZXJJbmZvOworCisvLyBDb21waWxlIG9wdGlvbnMuCit0eXBlZGVmIGVudW0geworICBTSF9WQUxJREFURSAgICAgICAgICAgICAgICA9IDAsCisgIFNIX1ZBTElEQVRFX0xPT1BfSU5ERVhJTkcgID0gMHgwMDAxLAorICBTSF9JTlRFUk1FRElBVEVfVFJFRSAgICAgICA9IDB4MDAwMiwKKyAgU0hfT0JKRUNUX0NPREUgICAgICAgICAgICAgPSAweDAwMDQsCisgIFNIX0FUVFJJQlVURVNfVU5JRk9STVMgICAgID0gMHgwMDA4LAorICBTSF9MSU5FX0RJUkVDVElWRVMgICAgICAgICA9IDB4MDAxMCwKKyAgU0hfU09VUkNFX1BBVEggICAgICAgICAgICAgPSAweDAwMjAsCisgIFNIX01BUF9MT05HX1ZBUklBQkxFX05BTUVTID0gMHgwMDQwCit9IFNoQ29tcGlsZU9wdGlvbnM7CisKKy8vCisvLyBEcml2ZXIgbXVzdCBjYWxsIHRoaXMgZmlyc3QsIG9uY2UsIGJlZm9yZSBkb2luZyBhbnkgb3RoZXIKKy8vIGNvbXBpbGVyIG9wZXJhdGlvbnMuCisvLyBJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMsIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uemVybywgZWxzZSB6ZXJvLgorLy8KK2ludCBTaEluaXRpYWxpemUoKTsKKy8vCisvLyBEcml2ZXIgc2hvdWxkIGNhbGwgdGhpcyBhdCBzaHV0ZG93bi4KKy8vIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgdGhlIHJldHVybiB2YWx1ZSBpcyBub256ZXJvLCBlbHNlIHplcm8uCisvLworaW50IFNoRmluYWxpemUoKTsKKworLy8KKy8vIEltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBidWlsdC1pbiByZXNvdXJjZXMgKGNvbnN0YW50cyBhbmQgZXh0ZW5zaW9ucykuCisvLyBUaGUgbmFtZXMgZm9yIHRoZXNlIHJlc291cmNlcyBoYXMgYmVlbiBvYnRhaW5lZCBieSBzdHJpcHBpbmcgZ2xfL0dMXy4KKy8vCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8vIENvbnN0YW50cy4KKyAgICBpbnQgTWF4VmVydGV4QXR0cmliczsKKyAgICBpbnQgTWF4VmVydGV4VW5pZm9ybVZlY3RvcnM7CisgICAgaW50IE1heFZhcnlpbmdWZWN0b3JzOworICAgIGludCBNYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0czsKKyAgICBpbnQgTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0czsKKyAgICBpbnQgTWF4VGV4dHVyZUltYWdlVW5pdHM7CisgICAgaW50IE1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnM7CisgICAgaW50IE1heERyYXdCdWZmZXJzOworCisgICAgLy8gRXh0ZW5zaW9ucy4KKyAgICAvLyBTZXQgdG8gMSB0byBlbmFibGUgdGhlIGV4dGVuc2lvbiwgZWxzZSAwLgorICAgIGludCBPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXM7Cit9IFNoQnVpbHRJblJlc291cmNlczsKKworLy8KKy8vIEluaXRpYWxpemUgYnVpbHQtaW4gcmVzb3VyY2VzIHdpdGggbWluaW11bSBleHBlY3RlZCB2YWx1ZXMuCisvLwordm9pZCBTaEluaXRCdWlsdEluUmVzb3VyY2VzKFNoQnVpbHRJblJlc291cmNlcyogcmVzb3VyY2VzKTsKKworLy8KKy8vIFNoSGFuZGxlIGhlbGQgYnkgYnV0IG9wYXF1ZSB0byB0aGUgZHJpdmVyLiAgSXQgaXMgYWxsb2NhdGVkLAorLy8gbWFuYWdlZCwgYW5kIGRlLWFsbG9jYXRlZCBieSB0aGUgY29tcGlsZXIuIEl0J3MgY29udGVudHMgCisvLyBhcmUgZGVmaW5lZCBieSBhbmQgdXNlZCBieSB0aGUgY29tcGlsZXIuCisvLworLy8gSWYgaGFuZGxlIGNyZWF0aW9uIGZhaWxzLCAwIHdpbGwgYmUgcmV0dXJuZWQuCisvLwordHlwZWRlZiB2b2lkKiBTaEhhbmRsZTsKKworLy8KKy8vIERyaXZlciBjYWxscyB0aGVzZSB0byBjcmVhdGUgYW5kIGRlc3Ryb3kgY29tcGlsZXIgb2JqZWN0cy4KKy8vCisvLyBSZXR1cm5zIHRoZSBoYW5kbGUgb2YgY29uc3RydWN0ZWQgY29tcGlsZXIuCisvLyBQYXJhbWV0ZXJzOgorLy8gdHlwZTogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNoYWRlciAtIFNIX0ZSQUdNRU5UX1NIQURFUiBvciBTSF9WRVJURVhfU0hBREVSLgorLy8gc3BlYzogU3BlY2lmaWVzIHRoZSBsYW5ndWFnZSBzcGVjIHRoZSBjb21waWxlciBtdXN0IGNvbmZvcm0gdG8gLQorLy8gICAgICAgU0hfR0xFUzJfU1BFQyBvciBTSF9XRUJHTF9TUEVDLgorLy8gcmVzb3VyY2VzOiBTcGVjaWZpZXMgdGhlIGJ1aWx0LWluIHJlc291cmNlcy4KK1NoSGFuZGxlIFNoQ29uc3RydWN0Q29tcGlsZXIoU2hTaGFkZXJUeXBlIHR5cGUsIFNoU2hhZGVyU3BlYyBzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaEJ1aWx0SW5SZXNvdXJjZXMqIHJlc291cmNlcyk7Cit2b2lkIFNoRGVzdHJ1Y3QoU2hIYW5kbGUgaGFuZGxlKTsKKworLy8KKy8vIENvbXBpbGVzIHRoZSBnaXZlbiBzaGFkZXIgc291cmNlLgorLy8gSWYgdGhlIGZ1bmN0aW9uIHN1Y2NlZWRzLCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vbnplcm8sIGVsc2UgemVyby4KKy8vIFBhcmFtZXRlcnM6CisvLyBoYW5kbGU6IFNwZWNpZmllcyB0aGUgaGFuZGxlIG9mIGNvbXBpbGVyIHRvIGJlIHVzZWQuCisvLyBzaGFkZXJTdHJpbmdzOiBTcGVjaWZpZXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MKKy8vICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHNoYWRlciBzb3VyY2UgY29kZS4KKy8vIG51bVN0cmluZ3M6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHNoYWRlclN0cmluZ3MgYXJyYXkuCisvLyBjb21waWxlT3B0aW9uczogQSBtYXNrIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorLy8gU0hfVkFMSURBVEU6IFZhbGlkYXRlcyBzaGFkZXIgdG8gZW5zdXJlIHRoYXQgaXQgY29uZm9ybXMgdG8gdGhlIHNwZWMKKy8vICAgICAgICAgICAgICBzcGVjaWZpZWQgZHVyaW5nIGNvbXBpbGVyIGNvbnN0cnVjdGlvbi4KKy8vIFNIX1ZBTElEQVRFX0xPT1BfSU5ERVhJTkc6IFZhbGlkYXRlcyBsb29wIGFuZCBpbmRleGluZyBpbiB0aGUgc2hhZGVyIHRvCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmUgdGhhdCB0aGV5IGRvIG5vdCBleGNlZWQgdGhlIG1pbmltdW0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgbWFuZGF0ZWQgaW4gR0xTTCAxLjAgc3BlYywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVuZGl4IEEsIFNlY3Rpb24gNCBhbmQgNS4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gc3BlY2lmeSB0aGlzIHBhcmFtZXRlciB3aGVuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxpbmcgZm9yIFdlYkdMIC0gaXQgaXMgaW1wbGllZC4KKy8vIFNIX0lOVEVSTUVESUFURV9UUkVFOiBXcml0ZXMgaW50ZXJtZWRpYXRlIHRyZWUgdG8gaW5mbyBsb2cuCisvLyAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIHF1ZXJpZWQgYnkgY2FsbGluZyBTaEdldEluZm9Mb2coKS4KKy8vIFNIX09CSkVDVF9DT0RFOiBUcmFuc2xhdGVzIGludGVybWVkaWF0ZSB0cmVlIHRvIGdsc2wgb3IgaGxzbCBzaGFkZXIuCisvLyAgICAgICAgICAgICAgICAgQ2FuIGJlIHF1ZXJpZWQgYnkgY2FsbGluZyBTaEdldE9iamVjdENvZGUoKS4KKy8vIFNIX0FUVFJJQlVURVNfVU5JRk9STVM6IEV4dHJhY3RzIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIHF1ZXJpZWQgYnkgY2FsbGluZyBTaEdldEFjdGl2ZUF0dHJpYigpIGFuZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgU2hHZXRBY3RpdmVVbmlmb3JtKCkuCisvLworaW50IFNoQ29tcGlsZSgKKyAgICBjb25zdCBTaEhhbmRsZSBoYW5kbGUsCisgICAgY29uc3QgY2hhciogY29uc3Qgc2hhZGVyU3RyaW5nc1tdLAorICAgIGNvbnN0IGludCBudW1TdHJpbmdzLAorICAgIGludCBjb21waWxlT3B0aW9ucworICAgICk7CisKKy8vIFJldHVybnMgYSBwYXJhbWV0ZXIgZnJvbSBhIGNvbXBpbGVkIHNoYWRlci4KKy8vIFBhcmFtZXRlcnM6CisvLyBoYW5kbGU6IFNwZWNpZmllcyB0aGUgY29tcGlsZXIKKy8vIHBuYW1lOiBTcGVjaWZpZXMgdGhlIHBhcmFtZXRlciB0byBxdWVyeS4KKy8vIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZGVmaW5lZDoKKy8vIFNIX0lORk9fTE9HX0xFTkdUSDogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBpbmZvcm1hdGlvbiBsb2cKKy8vICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4KKy8vIFNIX09CSkVDVF9DT0RFX0xFTkdUSDogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBvYmplY3QgY29kZQorLy8gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRpb24gY2hhcmFjdGVyLgorLy8gU0hfQUNUSVZFX0FUVFJJQlVURVM6IHRoZSBudW1iZXIgb2YgYWN0aXZlIGF0dHJpYnV0ZSB2YXJpYWJsZXMuCisvLyBTSF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEg6IHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgYWN0aXZlIGF0dHJpYnV0ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBuYW1lIGluY2x1ZGluZyB0aGUgbnVsbAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCisvLyBTSF9BQ1RJVkVfVU5JRk9STVM6IHRoZSBudW1iZXIgb2YgYWN0aXZlIHVuaWZvcm0gdmFyaWFibGVzLgorLy8gU0hfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSDogdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBhY3RpdmUgdW5pZm9ybQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgbmFtZSBpbmNsdWRpbmcgdGhlIG51bGwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4KKy8vIFNIX01BUFBFRF9OQU1FX01BWF9MRU5HVEg6IHRoZSBsZW5ndGggb2YgdGhlIG1hcHBlZCB2YXJpYWJsZSBuYW1lIGluY2x1ZGluZworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG51bGwgdGVybWluYXRpb24gY2hhcmFjdGVyLgorLy8gCisvLyBwYXJhbXM6IFJlcXVlc3RlZCBwYXJhbWV0ZXIKK3ZvaWQgU2hHZXRJbmZvKGNvbnN0IFNoSGFuZGxlIGhhbmRsZSwgU2hTaGFkZXJJbmZvIHBuYW1lLCBpbnQqIHBhcmFtcyk7CisKKy8vIFJldHVybnMgbnVsLXRlcm1pbmF0ZWQgaW5mb3JtYXRpb24gbG9nIGZvciBhIGNvbXBpbGVkIHNoYWRlci4KKy8vIFBhcmFtZXRlcnM6CisvLyBoYW5kbGU6IFNwZWNpZmllcyB0aGUgY29tcGlsZXIKKy8vIGluZm9Mb2c6IFNwZWNpZmllcyBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHRoYXQgaXMgdXNlZCB0byByZXR1cm4KKy8vICAgICAgICAgIHRoZSBpbmZvcm1hdGlvbiBsb2cuIEl0IGlzIGFzc3VtZWQgdGhhdCBpbmZvTG9nIGhhcyBlbm91Z2ggbWVtb3J5CisvLyAgICAgICAgICB0byBhY2NvbW9kYXRlIHRoZSBpbmZvcm1hdGlvbiBsb2cuIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQKKy8vICAgICAgICAgIHRvIHN0b3JlIHRoZSByZXR1cm5lZCBpbmZvcm1hdGlvbiBsb2cgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKKy8vICAgICAgICAgIFNoR2V0SW5mbyB3aXRoIFNIX0lORk9fTE9HX0xFTkdUSC4KK3ZvaWQgU2hHZXRJbmZvTG9nKGNvbnN0IFNoSGFuZGxlIGhhbmRsZSwgY2hhciogaW5mb0xvZyk7CisKKy8vIFJldHVybnMgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBjb2RlIGZvciBhIGNvbXBpbGVkIHNoYWRlci4KKy8vIFBhcmFtZXRlcnM6CisvLyBoYW5kbGU6IFNwZWNpZmllcyB0aGUgY29tcGlsZXIKKy8vIGluZm9Mb2c6IFNwZWNpZmllcyBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHRoYXQgaXMgdXNlZCB0byByZXR1cm4KKy8vICAgICAgICAgIHRoZSBvYmplY3QgY29kZS4gSXQgaXMgYXNzdW1lZCB0aGF0IGluZm9Mb2cgaGFzIGVub3VnaCBtZW1vcnkgdG8KKy8vICAgICAgICAgIGFjY29tb2RhdGUgdGhlIG9iamVjdCBjb2RlLiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvCisvLyAgICAgICAgICBzdG9yZSB0aGUgcmV0dXJuZWQgb2JqZWN0IGNvZGUgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKKy8vICAgICAgICAgIFNoR2V0SW5mbyB3aXRoIFNIX09CSkVDVF9DT0RFX0xFTkdUSC4KK3ZvaWQgU2hHZXRPYmplY3RDb2RlKGNvbnN0IFNoSGFuZGxlIGhhbmRsZSwgY2hhciogb2JqQ29kZSk7CisKKy8vIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWN0aXZlIGF0dHJpYnV0ZSB2YXJpYWJsZS4KKy8vIFBhcmFtZXRlcnM6CisvLyBoYW5kbGU6IFNwZWNpZmllcyB0aGUgY29tcGlsZXIKKy8vIGluZGV4OiBTcGVjaWZpZXMgdGhlIGluZGV4IG9mIHRoZSBhdHRyaWJ1dGUgdmFyaWFibGUgdG8gYmUgcXVlcmllZC4KKy8vIGxlbmd0aDogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgd3JpdHRlbiBpbiB0aGUgc3RyaW5nCisvLyAgICAgICAgIGluZGljYXRlZCBieSBuYW1lIChleGNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvcikgaWYgYSB2YWx1ZSBvdGhlcgorLy8gICAgICAgICB0aGFuIE5VTEwgaXMgcGFzc2VkLgorLy8gc2l6ZTogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYXR0cmlidXRlIHZhcmlhYmxlLgorLy8gdHlwZTogUmV0dXJucyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgdmFyaWFibGUuCisvLyBuYW1lOiBSZXR1cm5zIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZQorLy8gICAgICAgYXR0cmlidXRlIHZhcmlhYmxlLiBJdCBpcyBhc3N1bWVkIHRoYXQgbmFtZSBoYXMgZW5vdWdoIG1lbW9yeSB0bworLy8gICAgICAgYWNjb21vZGF0ZSB0aGUgYXR0cmlidXRlIHZhcmlhYmxlIG5hbWUuIFRoZSBzaXplIG9mIHRoZSBidWZmZXIKKy8vICAgICAgIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBhdHRyaWJ1dGUgdmFyaWFibGUgbmFtZSBjYW4gYmUgb2J0YWluZWQgYnkKKy8vICAgICAgIGNhbGxpbmcgU2hHZXRJbmZvIHdpdGggU0hfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RILgorLy8gbWFwcGVkTmFtZTogUmV0dXJucyBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWFwcGVkIG5hbWUgb2YKKy8vICAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgdmFyaWFibGUsIEl0IGlzIGFzc3VtZWQgdGhhdCBtYXBwZWROYW1lIGhhcyBlbm91Z2gKKy8vICAgICAgICAgICAgIG1lbW9yeSAoU0hfTUFQUEVEX05BTUVfTUFYX0xFTkdUSCksIG9yIE5VTEwgaWYgZG9uJ3QgY2FyZQorLy8gICAgICAgICAgICAgYWJvdXQgdGhlIG1hcHBlZCBuYW1lLiBJZiB0aGUgbmFtZSBpcyBub3QgbWFwcGVkLCB0aGVuIG5hbWUgYW5kCisvLyAgICAgICAgICAgICBtYXBwZWROYW1lIGFyZSB0aGUgc2FtZS4KK3ZvaWQgU2hHZXRBY3RpdmVBdHRyaWIoY29uc3QgU2hIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCogbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIFNoRGF0YVR5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG1hcHBlZE5hbWUpOworCisvLyBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGFuIGFjdGl2ZSB1bmlmb3JtIHZhcmlhYmxlLgorLy8gUGFyYW1ldGVyczoKKy8vIGhhbmRsZTogU3BlY2lmaWVzIHRoZSBjb21waWxlcgorLy8gaW5kZXg6IFNwZWNpZmllcyB0aGUgaW5kZXggb2YgdGhlIHVuaWZvcm0gdmFyaWFibGUgdG8gYmUgcXVlcmllZC4KKy8vIGxlbmd0aDogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgd3JpdHRlbiBpbiB0aGUgc3RyaW5nCisvLyAgICAgICAgIGluZGljYXRlZCBieSBuYW1lIChleGNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvcikgaWYgYSB2YWx1ZQorLy8gICAgICAgICBvdGhlciB0aGFuIE5VTEwgaXMgcGFzc2VkLgorLy8gc2l6ZTogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgdW5pZm9ybSB2YXJpYWJsZS4KKy8vIHR5cGU6IFJldHVybnMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdW5pZm9ybSB2YXJpYWJsZS4KKy8vIG5hbWU6IFJldHVybnMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlCisvLyAgICAgICB1bmlmb3JtIHZhcmlhYmxlLiBJdCBpcyBhc3N1bWVkIHRoYXQgbmFtZSBoYXMgZW5vdWdoIG1lbW9yeSB0bworLy8gICAgICAgYWNjb21vZGF0ZSB0aGUgdW5pZm9ybSB2YXJpYWJsZSBuYW1lLiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkCisvLyAgICAgICB0byBzdG9yZSB0aGUgdW5pZm9ybSB2YXJpYWJsZSBuYW1lIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nCisvLyAgICAgICBTaEdldEluZm8gd2l0aCBTSF9BQ1RJVkVfVU5JRk9STVNfTUFYX0xFTkdUSC4KKy8vIG1hcHBlZE5hbWU6IFJldHVybnMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1hcHBlZCBuYW1lIG9mCisvLyAgICAgICAgICAgICB0aGUgdW5pZm9ybSB2YXJpYWJsZSwgSXQgaXMgYXNzdW1lZCB0aGF0IG1hcHBlZE5hbWUgaGFzIGVub3VnaAorLy8gICAgICAgICAgICAgbWVtb3J5IChTSF9NQVBQRURfTkFNRV9NQVhfTEVOR1RIKSwgb3IgTlVMTCBpZiBkb24ndCBjYXJlCisvLyAgICAgICAgICAgICBhYm91dCB0aGUgbWFwcGVkIG5hbWUuIElmIHRoZSBuYW1lIGlzIG5vdCBtYXBwZWQsIHRoZW4gbmFtZSBhbmQKKy8vICAgICAgICAgICAgIG1hcHBlZE5hbWUgYXJlIHRoZSBzYW1lLgordm9pZCBTaEdldEFjdGl2ZVVuaWZvcm0oY29uc3QgU2hIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBTaERhdGFUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG1hcHBlZE5hbWUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX0NPTVBJTEVSX0lOVEVSRkFDRV9JTkNMVURFRF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2luY2x1ZGUvS0hSL2tocnBsYXRmb3JtLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9pbmNsdWRlL0tIUi9raHJwbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzBkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9pbmNsdWRlL0tIUi9raHJwbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMjY5IEBACisjaWZuZGVmIF9fa2hycGxhdGZvcm1faF8KKyNkZWZpbmUgX19raHJwbGF0Zm9ybV9oXworCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworLyogS2hyb25vcyBwbGF0Zm9ybS1zcGVjaWZpYyB0eXBlcyBhbmQgZGVmaW5pdGlvbnMuCisgKgorICogJFJldmlzaW9uOiA5MzU2ICQgb24gJERhdGU6IDIwMDktMTAtMjEgMDI6NTI6MjUgLTA3MDAgKFdlZCwgMjEgT2N0IDIwMDkpICQKKyAqCisgKiBBZG9wdGVycyBtYXkgbW9kaWZ5IHRoaXMgZmlsZSB0byBzdWl0IHRoZWlyIHBsYXRmb3JtLiBBZG9wdGVycyBhcmUKKyAqIGVuY291cmFnZWQgdG8gc3VibWl0IHBsYXRmb3JtIHNwZWNpZmljIG1vZGlmaWNhdGlvbnMgdG8gdGhlIEtocm9ub3MKKyAqIGdyb3VwIHNvIHRoYXQgdGhleSBjYW4gYmUgaW5jbHVkZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgZmlsZS4KKyAqIFBsZWFzZSBzdWJtaXQgY2hhbmdlcyBieSBzZW5kaW5nIHRoZW0gdG8gdGhlIHB1YmxpYyBLaHJvbm9zIEJ1Z3ppbGxhCisgKiAoaHR0cDovL2tocm9ub3Mub3JnL2J1Z3ppbGxhKSBieSBmaWxpbmcgYSBidWcgYWdhaW5zdCBwcm9kdWN0CisgKiAiS2hyb25vcyAoZ2VuZXJhbCkiIGNvbXBvbmVudCAiUmVnaXN0cnkiLgorICoKKyAqIEEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSB3aGljaCBmaWxscyBpbiBzb21lIG9mIHRoZSBidWcgZmllbGRzIGNhbiBiZQorICogcmVhY2hlZCB1c2luZyBodHRwOi8vdGlueXVybC5jb20va2hycGxhdGZvcm0taC1idWdyZXBvcnQsIGJ1dCB5b3UKKyAqIG11c3QgY3JlYXRlIGEgQnVnemlsbGEgbG9naW4gZmlyc3QuCisgKgorICoKKyAqIFNlZSB0aGUgSW1wbGVtZW50ZXIncyBHdWlkZWxpbmVzIGZvciBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGlzIGZpbGUKKyAqIHNob3VsZCBiZSBsb2NhdGVkIG9uIHlvdXIgc3lzdGVtIGFuZCBmb3IgbW9yZSBkZXRhaWxzIG9mIGl0cyB1c2U6CisgKiAgICBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2ltcGxlbWVudGVyc19ndWlkZS5wZGYKKyAqCisgKiBUaGlzIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCisgKiAgICAgICAgI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgorICogYnkgS2hyb25vcyBjbGllbnQgQVBJIGhlYWRlciBmaWxlcyB0aGF0IHVzZSBpdHMgdHlwZXMgYW5kIGRlZmluZXMuCisgKgorICogVGhlIHR5cGVzIGluIGtocnBsYXRmb3JtLmggc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBkZWZpbmUgQVBJLXNwZWNpZmljIHR5cGVzLgorICoKKyAqIFR5cGVzIGRlZmluZWQgaW4ga2hycGxhdGZvcm0uaDoKKyAqICAgIGtocm9ub3NfaW50OF90ICAgICAgICAgICAgICBzaWduZWQgICA4ICBiaXQKKyAqICAgIGtocm9ub3NfdWludDhfdCAgICAgICAgICAgICB1bnNpZ25lZCA4ICBiaXQKKyAqICAgIGtocm9ub3NfaW50MTZfdCAgICAgICAgICAgICBzaWduZWQgICAxNiBiaXQKKyAqICAgIGtocm9ub3NfdWludDE2X3QgICAgICAgICAgICB1bnNpZ25lZCAxNiBiaXQKKyAqICAgIGtocm9ub3NfaW50MzJfdCAgICAgICAgICAgICBzaWduZWQgICAzMiBiaXQKKyAqICAgIGtocm9ub3NfdWludDMyX3QgICAgICAgICAgICB1bnNpZ25lZCAzMiBiaXQKKyAqICAgIGtocm9ub3NfaW50NjRfdCAgICAgICAgICAgICBzaWduZWQgICA2NCBiaXQKKyAqICAgIGtocm9ub3NfdWludDY0X3QgICAgICAgICAgICB1bnNpZ25lZCA2NCBiaXQKKyAqICAgIGtocm9ub3NfaW50cHRyX3QgICAgICAgICAgICBzaWduZWQgICBzYW1lIG51bWJlciBvZiBiaXRzIGFzIGEgcG9pbnRlcgorICogICAga2hyb25vc191aW50cHRyX3QgICAgICAgICAgIHVuc2lnbmVkIHNhbWUgbnVtYmVyIG9mIGJpdHMgYXMgYSBwb2ludGVyCisgKiAgICBraHJvbm9zX3NzaXplX3QgICAgICAgICAgICAgc2lnbmVkICAgc2l6ZQorICogICAga2hyb25vc191c2l6ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIHNpemUKKyAqICAgIGtocm9ub3NfZmxvYXRfdCAgICAgICAgICAgICBzaWduZWQgICAzMiBiaXQgZmxvYXRpbmcgcG9pbnQKKyAqICAgIGtocm9ub3NfdGltZV9uc190ICAgICAgICAgICB1bnNpZ25lZCA2NCBiaXQgdGltZSBpbiBuYW5vc2Vjb25kcworICogICAga2hyb25vc191dGltZV9uYW5vc2Vjb25kc190IHVuc2lnbmVkIHRpbWUgaW50ZXJ2YWwgb3IgYWJzb2x1dGUgdGltZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbm9zZWNvbmRzCisgKiAgICBraHJvbm9zX3N0aW1lX25hbm9zZWNvbmRzX3Qgc2lnbmVkIHRpbWUgaW50ZXJ2YWwgaW4gbmFub3NlY29uZHMKKyAqICAgIGtocm9ub3NfYm9vbGVhbl9lbnVtX3QgICAgICBlbnVtZXJhdGVkIGJvb2xlYW4gdHlwZS4gVGhpcyBzaG91bGQKKyAqICAgICAgb25seSBiZSB1c2VkIGFzIGEgYmFzZSB0eXBlIHdoZW4gYSBjbGllbnQgQVBJJ3MgYm9vbGVhbiB0eXBlIGlzCisgKiAgICAgIGFuIGVudW0uIENsaWVudCBBUElzIHdoaWNoIHVzZSBhbiBpbnRlZ2VyIG9yIG90aGVyIHR5cGUgZm9yCisgKiAgICAgIGJvb2xlYW5zIGNhbm5vdCB1c2UgdGhpcyBhcyB0aGUgYmFzZSB0eXBlIGZvciB0aGVpciBib29sZWFuLgorICoKKyAqIFRva2VucyBkZWZpbmVkIGluIGtocnBsYXRmb3JtLmg6CisgKgorICogICAgS0hST05PU19GQUxTRSwgS0hST05PU19UUlVFIEVudW1lcmF0ZWQgYm9vbGVhbiBmYWxzZS90cnVlIHZhbHVlcy4KKyAqCisgKiAgICBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgaXMgMSBpZiA2NCBiaXQgaW50ZWdlcnMgYXJlIHN1cHBvcnRlZDsgb3RoZXJ3aXNlIDAuCisgKiAgICBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgaXMgMSBpZiBmbG9hdHMgYXJlIHN1cHBvcnRlZDsgb3RoZXJ3aXNlIDAuCisgKgorICogQ2FsbGluZyBjb252ZW50aW9uIG1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZToKKyAqICAgIEtIUk9OT1NfQVBJQ0FMTAorICogICAgS0hST05PU19BUElFTlRSWQorICogICAgS0hST05PU19BUElBVFRSSUJVVEVTCisgKgorICogVGhlc2UgbWF5IGJlIHVzZWQgaW4gZnVuY3Rpb24gcHJvdG90eXBlcyBhczoKKyAqCisgKiAgICAgIEtIUk9OT1NfQVBJQ0FMTCB2b2lkIEtIUk9OT1NfQVBJRU5UUlkgZnVuY25hbWUoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnMSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcyKSBLSFJPTk9TX0FQSUFUVFJJQlVURVM7CisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9uIG9mIEtIUk9OT1NfQVBJQ0FMTAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIHByZWNlZGVzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGZ1bmN0aW9uIHByb3RvdHlwZS4KKyAqLworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX1NDSVRFQ0hfU05BUF9fKQorIyAgIGRlZmluZSBLSFJPTk9TX0FQSUNBTEwgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZWxpZiBkZWZpbmVkIChfX1NZTUJJQU4zMl9fKQorIyAgIGRlZmluZSBLSFJPTk9TX0FQSUNBTEwgSU1QT1JUX0MKKyNlbHNlCisjICAgZGVmaW5lIEtIUk9OT1NfQVBJQ0FMTAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbiBvZiBLSFJPTk9TX0FQSUVOVFJZCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZm9sbG93cyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uICBhbmQgcHJlY2VkZXMgdGhlIGZ1bmN0aW9uCisgKiBuYW1lIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUuCisgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKKyAgICAvKiBXaW4zMiBidXQgbm90IFdpbkNFICovCisjICAgZGVmaW5lIEtIUk9OT1NfQVBJRU5UUlkgX19zdGRjYWxsCisjZWxzZQorIyAgIGRlZmluZSBLSFJPTk9TX0FQSUVOVFJZCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9uIG9mIEtIUk9OT1NfQVBJQVRUUklCVVRFUworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZvbGxvd3MgdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMgb2YgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZSBhcmd1bWVudHMuCisgKi8KKyNpZiBkZWZpbmVkIChfX0FSTUNDXzJfXykKKyNkZWZpbmUgS0hST05PU19BUElBVFRSSUJVVEVTIF9fc29mdGZwCisjZWxzZQorI2RlZmluZSBLSFJPTk9TX0FQSUFUVFJJQlVURVMKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGJhc2ljIHR5cGUgZGVmaW5pdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIChkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkgfHwgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fVVNMQ19fKQorCisKKy8qCisgKiBVc2luZyA8c3RkaW50Lmg+CisgKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KK3R5cGVkZWYgaW50MzJfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwordHlwZWRlZiB1aW50MzJfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OwordHlwZWRlZiBpbnQ2NF90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDY0X3Q7CisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQorCisjZWxpZiBkZWZpbmVkKF9fVk1TICkgfHwgZGVmaW5lZChfX3NnaSkKKworLyoKKyAqIFVzaW5nIDxpbnR0eXBlcy5oPgorICovCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KK3R5cGVkZWYgaW50MzJfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwordHlwZWRlZiB1aW50MzJfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OwordHlwZWRlZiBpbnQ2NF90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDY0X3Q7CisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQorCisjZWxpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKKworLyoKKyAqIFdpbjMyCisgKi8KK3R5cGVkZWYgX19pbnQzMiAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyICAgICAgICBraHJvbm9zX3VpbnQzMl90OwordHlwZWRlZiBfX2ludDY0ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgICAgIGtocm9ub3NfdWludDY0X3Q7CisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQorCisjZWxpZiBkZWZpbmVkKF9fc3VuX18pIHx8IGRlZmluZWQoX19kaWdpdGFsX18pCisKKy8qCisgKiBTdW4gb3IgRGlnaXRhbAorICovCit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKKyNpZiBkZWZpbmVkKF9fYXJjaDY0X18pIHx8IGRlZmluZWQoX0xQNjQpCit0eXBlZGVmIGxvbmcgaW50ICAgICAgICAgICAgICAgIGtocm9ub3NfaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgICAgICAga2hyb25vc191aW50NjRfdDsKKyNlbHNlCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQgICAgICAgICAgIGtocm9ub3NfaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCAga2hyb25vc191aW50NjRfdDsKKyNlbmRpZiAvKiBfX2FyY2g2NF9fICovCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQorCisjZWxpZiAwCisKKy8qCisgKiBIeXBvdGhldGljYWwgcGxhdGZvcm0gd2l0aCBubyBmbG9hdCBvciBpbnQ2NCBzdXBwb3J0CisgKi8KK3R5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAwCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDAKKworI2Vsc2UKKworLyoKKyAqIEdlbmVyaWMgZmFsbGJhY2sKKyAqLworI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQzMl90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDMyX3Q7Cit0eXBlZGVmIHVpbnQzMl90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDMyX3Q7Cit0eXBlZGVmIGludDY0X3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50NjRfdDsKK3R5cGVkZWYgdWludDY0X3QgICAgICAgICAgICAgICAga2hyb25vc191aW50NjRfdDsKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0lOVDY0ICAgMQorI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgICAxCisKKyNlbmRpZgorCisKKy8qCisgKiBUeXBlcyB0aGF0IGFyZSAoc28gZmFyKSB0aGUgc2FtZSBvbiBhbGwgcGxhdGZvcm1zCisgKi8KK3R5cGVkZWYgc2lnbmVkICAgY2hhciAgICAgICAgICBraHJvbm9zX2ludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgICBraHJvbm9zX3VpbnQ4X3Q7Cit0eXBlZGVmIHNpZ25lZCAgIHNob3J0IGludCAgICAga2hyb25vc19pbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgICAgIGtocm9ub3NfdWludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCAgIGxvbmcgIGludCAgICAga2hyb25vc19pbnRwdHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgaW50ICAgICBraHJvbm9zX3VpbnRwdHJfdDsKK3R5cGVkZWYgc2lnbmVkICAgbG9uZyAgaW50ICAgICBraHJvbm9zX3NzaXplX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIGludCAgICAga2hyb25vc191c2l6ZV90OworCisjaWYgS0hST05PU19TVVBQT1JUX0ZMT0FUCisvKgorICogRmxvYXQgdHlwZQorICovCit0eXBlZGVmICAgICAgICAgIGZsb2F0ICAgICAgICAga2hyb25vc19mbG9hdF90OworI2VuZGlmCisKKyNpZiBLSFJPTk9TX1NVUFBPUlRfSU5UNjQKKy8qIFRpbWUgdHlwZXMKKyAqCisgKiBUaGVzZSB0eXBlcyBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYSB0aW1lIGludGVydmFsIGluIG5hbm9zZWNvbmRzIG9yCisgKiBhbiBhYnNvbHV0ZSBVbmFkanVzdGVkIFN5c3RlbSBUaW1lLiAgVW5hZGp1c3RlZCBTeXN0ZW0gVGltZSBpcyB0aGUgbnVtYmVyCisgKiBvZiBuYW5vc2Vjb25kcyBzaW5jZSBzb21lIGFyYml0cmFyeSBzeXN0ZW0gZXZlbnQgKGUuZy4gc2luY2UgdGhlIGxhc3QKKyAqIHRpbWUgdGhlIHN5c3RlbSBib290ZWQpLiAgVGhlIFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUgaXMgYW4gdW5zaWduZWQKKyAqIDY0IGJpdCB2YWx1ZSB0aGF0IHdyYXBzIGJhY2sgdG8gMCBldmVyeSA1ODQgeWVhcnMuICBUaW1lIGludGVydmFscworICogbWF5IGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQuCisgKi8KK3R5cGVkZWYga2hyb25vc191aW50NjRfdCAgICAgICBraHJvbm9zX3V0aW1lX25hbm9zZWNvbmRzX3Q7Cit0eXBlZGVmIGtocm9ub3NfaW50NjRfdCAgICAgICAga2hyb25vc19zdGltZV9uYW5vc2Vjb25kc190OworI2VuZGlmCisKKy8qCisgKiBEdW1teSB2YWx1ZSB1c2VkIHRvIHBhZCBlbnVtIHR5cGVzIHRvIDMyIGJpdHMuCisgKi8KKyNpZm5kZWYgS0hST05PU19NQVhfRU5VTQorI2RlZmluZSBLSFJPTk9TX01BWF9FTlVNIDB4N0ZGRkZGRkYKKyNlbmRpZgorCisvKgorICogRW51bWVyYXRlZCBib29sZWFuIHR5cGUKKyAqCisgKiBWYWx1ZXMgb3RoZXIgdGhhbiB6ZXJvIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIHRydWUuICBUaGVyZWZvcmUKKyAqIGNvbXBhcmlzb25zIHNob3VsZCBub3QgYmUgbWFkZSBhZ2FpbnN0IEtIUk9OT1NfVFJVRS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBLSFJPTk9TX0ZBTFNFID0gMCwKKyAgICBLSFJPTk9TX1RSVUUgID0gMSwKKyAgICBLSFJPTk9TX0JPT0xFQU5fRU5VTV9GT1JDRV9TSVpFID0gS0hST05PU19NQVhfRU5VTQorfSBraHJvbm9zX2Jvb2xlYW5fZW51bV90OworCisjZW5kaWYgLyogX19raHJwbGF0Zm9ybV9oXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML0NvbmZpZy5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODUxZWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML0NvbmZpZy5jcHAKQEAgLTAsMCArMSw0MDAgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIENvbmZpZy5jcHA6IEltcGxlbWVudHMgdGhlIGVnbDo6Q29uZmlnIGNsYXNzLCBkZXNjcmliaW5nIHRoZSBmb3JtYXQsIHR5cGUKKy8vIGFuZCBzaXplIGZvciBhbiBlZ2w6OlN1cmZhY2UuIEltcGxlbWVudHMgRUdMQ29uZmlnIGFuZCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuCisvLyBbRUdMIDEuNF0gc2VjdGlvbiAzLjQgcGFnZSAxNS4KKworI2luY2x1ZGUgIkNvbmZpZy5oIgorCisjaW5jbHVkZSAiY29tbW9uL2RlYnVnLmgiCisjaW5jbHVkZSAibGliR0xFU3YyL0ltYWdlLmhwcCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBlZ2wKK3sKK0NvbmZpZzo6Q29uZmlnKERpc3BsYXlNb2RlIGRpc3BsYXlNb2RlLCBFR0xpbnQgbWluSW50ZXJ2YWwsIEVHTGludCBtYXhJbnRlcnZhbCwgc3c6OkZvcm1hdCByZW5kZXJUYXJnZXRGb3JtYXQsIHN3OjpGb3JtYXQgZGVwdGhTdGVuY2lsRm9ybWF0LCBFR0xpbnQgbXVsdGlTYW1wbGUpCisgICAgOiBtRGlzcGxheU1vZGUoZGlzcGxheU1vZGUpLCBtUmVuZGVyVGFyZ2V0Rm9ybWF0KHJlbmRlclRhcmdldEZvcm1hdCksIG1EZXB0aFN0ZW5jaWxGb3JtYXQoZGVwdGhTdGVuY2lsRm9ybWF0KSwgbU11bHRpU2FtcGxlKG11bHRpU2FtcGxlKQoreworICAgIHNldChkaXNwbGF5TW9kZSwgbWluSW50ZXJ2YWwsIG1heEludGVydmFsLCByZW5kZXJUYXJnZXRGb3JtYXQsIGRlcHRoU3RlbmNpbEZvcm1hdCwgbXVsdGlTYW1wbGUpOworfQorCit2b2lkIENvbmZpZzo6c2V0RGVmYXVsdHMoKQoreworICAgIG1CdWZmZXJTaXplID0gMDsKKyAgICBtUmVkU2l6ZSA9IDA7CisgICAgbUdyZWVuU2l6ZSA9IDA7CisgICAgbUJsdWVTaXplID0gMDsKKyAgICBtTHVtaW5hbmNlU2l6ZSA9IDA7CisgICAgbUFscGhhU2l6ZSA9IDA7CisgICAgbUFscGhhTWFza1NpemUgPSAwOworICAgIG1CaW5kVG9UZXh0dXJlUkdCID0gRUdMX0RPTlRfQ0FSRTsKKyAgICBtQmluZFRvVGV4dHVyZVJHQkEgPSBFR0xfRE9OVF9DQVJFOworICAgIG1Db2xvckJ1ZmZlclR5cGUgPSBFR0xfUkdCX0JVRkZFUjsKKyAgICBtQ29uZmlnQ2F2ZWF0ID0gRUdMX0RPTlRfQ0FSRTsKKyAgICBtQ29uZmlnSUQgPSBFR0xfRE9OVF9DQVJFOworICAgIG1Db25mb3JtYW50ID0gMDsKKyAgICBtRGVwdGhTaXplID0gMDsKKyAgICBtTGV2ZWwgPSAwOworICAgIG1NYXRjaE5hdGl2ZVBpeG1hcCA9IEVHTF9OT05FOworICAgIG1NYXhQQnVmZmVyV2lkdGggPSAwOworICAgIG1NYXhQQnVmZmVySGVpZ2h0ID0gMDsKKyAgICBtTWF4UEJ1ZmZlclBpeGVscyA9IDA7CisgICAgbU1heFN3YXBJbnRlcnZhbCA9IEVHTF9ET05UX0NBUkU7CisgICAgbU1pblN3YXBJbnRlcnZhbCA9IEVHTF9ET05UX0NBUkU7CisgICAgbU5hdGl2ZVJlbmRlcmFibGUgPSBFR0xfRE9OVF9DQVJFOworICAgIG1OYXRpdmVWaXN1YWxJRCA9IDA7CisgICAgbU5hdGl2ZVZpc3VhbFR5cGUgPSBFR0xfRE9OVF9DQVJFOworICAgIG1SZW5kZXJhYmxlVHlwZSA9IEVHTF9PUEVOR0xfRVNfQklUOworICAgIG1TYW1wbGVCdWZmZXJzID0gMDsKKyAgICBtU2FtcGxlcyA9IDA7CisgICAgbVN0ZW5jaWxTaXplID0gMDsKKyAgICBtU3VyZmFjZVR5cGUgPSBFR0xfV0lORE9XX0JJVDsKKyAgICBtVHJhbnNwYXJlbnRUeXBlID0gRUdMX05PTkU7CisgICAgbVRyYW5zcGFyZW50UmVkVmFsdWUgPSBFR0xfRE9OVF9DQVJFOworICAgIG1UcmFuc3BhcmVudEdyZWVuVmFsdWUgPSBFR0xfRE9OVF9DQVJFOworICAgIG1UcmFuc3BhcmVudEJsdWVWYWx1ZSA9IEVHTF9ET05UX0NBUkU7Cit9CisKK3ZvaWQgQ29uZmlnOjpzZXQoRGlzcGxheU1vZGUgZGlzcGxheU1vZGUsIEVHTGludCBtaW5JbnRlcnZhbCwgRUdMaW50IG1heEludGVydmFsLCBzdzo6Rm9ybWF0IHJlbmRlclRhcmdldEZvcm1hdCwgc3c6OkZvcm1hdCBkZXB0aFN0ZW5jaWxGb3JtYXQsIEVHTGludCBtdWx0aVNhbXBsZSkKK3sKKyAgICBtQmluZFRvVGV4dHVyZVJHQiA9IEVHTF9GQUxTRTsKKyAgICBtQmluZFRvVGV4dHVyZVJHQkEgPSBFR0xfRkFMU0U7CisgICAgc3dpdGNoIChyZW5kZXJUYXJnZXRGb3JtYXQpCisgICAgeworICAgICAgY2FzZSBzdzo6Rk9STUFUX0ExUjVHNUI1OgorICAgICAgICBtQnVmZmVyU2l6ZSA9IDE2OworICAgICAgICBtUmVkU2l6ZSA9IDU7CisgICAgICAgIG1HcmVlblNpemUgPSA1OworICAgICAgICBtQmx1ZVNpemUgPSA1OworICAgICAgICBtQWxwaGFTaXplID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHN3OjpGT1JNQVRfQTJSMTBHMTBCMTA6CisgICAgICAgIG1CdWZmZXJTaXplID0gMzI7CisgICAgICAgIG1SZWRTaXplID0gMTA7CisgICAgICAgIG1HcmVlblNpemUgPSAxMDsKKyAgICAgICAgbUJsdWVTaXplID0gMTA7CisgICAgICAgIG1BbHBoYVNpemUgPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ugc3c6OkZPUk1BVF9BOFI4RzhCODoKKyAgICAgICAgbUJ1ZmZlclNpemUgPSAzMjsKKyAgICAgICAgbVJlZFNpemUgPSA4OworICAgICAgICBtR3JlZW5TaXplID0gODsKKyAgICAgICAgbUJsdWVTaXplID0gODsKKyAgICAgICAgbUFscGhhU2l6ZSA9IDg7CisgICAgICAgIG1CaW5kVG9UZXh0dXJlUkdCQSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBzdzo6Rk9STUFUX1I1RzZCNToKKyAgICAgICAgbUJ1ZmZlclNpemUgPSAxNjsKKyAgICAgICAgbVJlZFNpemUgPSA1OworICAgICAgICBtR3JlZW5TaXplID0gNjsKKyAgICAgICAgbUJsdWVTaXplID0gNTsKKyAgICAgICAgbUFscGhhU2l6ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBzdzo6Rk9STUFUX1g4UjhHOEI4OgorICAgICAgICBtQnVmZmVyU2l6ZSA9IDMyOworICAgICAgICBtUmVkU2l6ZSA9IDg7CisgICAgICAgIG1HcmVlblNpemUgPSA4OworICAgICAgICBtQmx1ZVNpemUgPSA4OworICAgICAgICBtQWxwaGFTaXplID0gMDsKKyAgICAgICAgbUJpbmRUb1RleHR1cmVSR0IgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIFVOUkVBQ0hBQkxFKCk7ICAgLy8gT3RoZXIgZm9ybWF0cyBzaG91bGQgbm90IGJlIHZhbGlkCisgICAgfQorCisgICAgbUx1bWluYW5jZVNpemUgPSAwOworICAgIG1BbHBoYU1hc2tTaXplID0gMDsKKyAgICBtQ29sb3JCdWZmZXJUeXBlID0gRUdMX1JHQl9CVUZGRVI7CisgICAgbUNvbmZpZ0NhdmVhdCA9IChkaXNwbGF5TW9kZS5mb3JtYXQgPT0gcmVuZGVyVGFyZ2V0Rm9ybWF0KSA/IEVHTF9OT05FIDogRUdMX1NMT1dfQ09ORklHOworICAgIG1Db25maWdJRCA9IDA7CisgICAgbUNvbmZvcm1hbnQgPSBFR0xfT1BFTkdMX0VTMl9CSVQ7CisKKwlzd2l0Y2ggKGRlcHRoU3RlbmNpbEZvcm1hdCkKKwl7CisJY2FzZSBzdzo6Rk9STUFUX05VTEw6CisJCW1EZXB0aFNpemUgPSAwOworCQltU3RlbmNpbFNpemUgPSAwOworCQlicmVhazsKKy8vICBjYXNlIHN3OjpGT1JNQVRfRDE2X0xPQ0tBQkxFOgorLy8gICAgICBtRGVwdGhTaXplID0gMTY7CisvLyAgICAgIG1TdGVuY2lsU2l6ZSA9IDA7CisvLyAgICAgIGJyZWFrOworCWNhc2Ugc3c6OkZPUk1BVF9EMzI6CisJCW1EZXB0aFNpemUgPSAzMjsKKwkJbVN0ZW5jaWxTaXplID0gMDsKKwkJYnJlYWs7CisvLwljYXNlIHN3OjpGT1JNQVRfRDE1UzE6CisvLwkJbURlcHRoU2l6ZSA9IDE1OworLy8JCW1TdGVuY2lsU2l6ZSA9IDE7CisvLwkJYnJlYWs7CisJY2FzZSBzdzo6Rk9STUFUX0QyNFM4OgorCQltRGVwdGhTaXplID0gMjQ7CisJCW1TdGVuY2lsU2l6ZSA9IDg7CisJCWJyZWFrOworCWNhc2Ugc3c6OkZPUk1BVF9EMjRYODoKKwkJbURlcHRoU2l6ZSA9IDI0OworCQltU3RlbmNpbFNpemUgPSAwOworCQlicmVhazsKKy8vCWNhc2Ugc3c6OkZPUk1BVF9EMjRYNFM0OgorLy8JCW1EZXB0aFNpemUgPSAyNDsKKy8vCQltU3RlbmNpbFNpemUgPSA0OworLy8JCWJyZWFrOworCWNhc2Ugc3c6OkZPUk1BVF9EMTY6CisJCW1EZXB0aFNpemUgPSAxNjsKKwkJbVN0ZW5jaWxTaXplID0gMDsKKwkJYnJlYWs7CisvLyAgY2FzZSBzdzo6Rk9STUFUX0QzMkZfTE9DS0FCTEU6CisvLyAgICAgIG1EZXB0aFNpemUgPSAzMjsKKy8vICAgICAgbVN0ZW5jaWxTaXplID0gMDsKKy8vICAgICAgYnJlYWs7CisvLyAgY2FzZSBzdzo6Rk9STUFUX0QyNEZTODoKKy8vICAgICAgbURlcHRoU2l6ZSA9IDI0OworLy8gICAgICBtU3RlbmNpbFNpemUgPSA4OworLy8gICAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJCVVOUkVBQ0hBQkxFKCk7CisJfQorCisgICAgbUxldmVsID0gMDsKKyAgICBtTWF0Y2hOYXRpdmVQaXhtYXAgPSBFR0xfTk9ORTsKKyAgICBtTWF4UEJ1ZmZlcldpZHRoID0gNDA5NjsKKyAgICBtTWF4UEJ1ZmZlckhlaWdodCA9IDQwOTY7CisgICAgbU1heFBCdWZmZXJQaXhlbHMgPSBtTWF4UEJ1ZmZlcldpZHRoICogbU1heFBCdWZmZXJIZWlnaHQ7CisgICAgbU1heFN3YXBJbnRlcnZhbCA9IG1heEludGVydmFsOworICAgIG1NaW5Td2FwSW50ZXJ2YWwgPSBtaW5JbnRlcnZhbDsKKyAgICBtTmF0aXZlUmVuZGVyYWJsZSA9IEVHTF9GQUxTRTsKKyAgICBtTmF0aXZlVmlzdWFsSUQgPSAwOworICAgIG1OYXRpdmVWaXN1YWxUeXBlID0gMDsKKyAgICBtUmVuZGVyYWJsZVR5cGUgPSBFR0xfT1BFTkdMX0VTMl9CSVQ7CisgICAgbVNhbXBsZUJ1ZmZlcnMgPSBtdWx0aVNhbXBsZSA/IDEgOiAwOworICAgIG1TYW1wbGVzID0gbXVsdGlTYW1wbGU7CisgICAgbVN1cmZhY2VUeXBlID0gRUdMX1BCVUZGRVJfQklUIHwgRUdMX1dJTkRPV19CSVQgfCBFR0xfU1dBUF9CRUhBVklPUl9QUkVTRVJWRURfQklUOworICAgIG1UcmFuc3BhcmVudFR5cGUgPSBFR0xfTk9ORTsKKyAgICBtVHJhbnNwYXJlbnRSZWRWYWx1ZSA9IDA7CisgICAgbVRyYW5zcGFyZW50R3JlZW5WYWx1ZSA9IDA7CisgICAgbVRyYW5zcGFyZW50Qmx1ZVZhbHVlID0gMDsKK30KKworRUdMQ29uZmlnIENvbmZpZzo6Z2V0SGFuZGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKEVHTENvbmZpZykoc2l6ZV90KW1Db25maWdJRDsKK30KKworU29ydENvbmZpZzo6U29ydENvbmZpZyhjb25zdCBFR0xpbnQgKmF0dHJpYkxpc3QpCisgICAgOiBtV2FudFJlZChmYWxzZSksIG1XYW50R3JlZW4oZmFsc2UpLCBtV2FudEJsdWUoZmFsc2UpLCBtV2FudEFscGhhKGZhbHNlKSwgbVdhbnRMdW1pbmFuY2UoZmFsc2UpCit7CisgICAgc2NhbkZvcldhbnRlZENvbXBvbmVudHMoYXR0cmliTGlzdCk7Cit9CisKK3ZvaWQgU29ydENvbmZpZzo6c2NhbkZvcldhbnRlZENvbXBvbmVudHMoY29uc3QgRUdMaW50ICphdHRyaWJMaXN0KQoreworICAgIC8vIFtFR0xdIHNlY3Rpb24gMy40LjEgcGFnZSAyNAorICAgIC8vIFNvcnRpbmcgcnVsZSAjMzogYnkgbGFyZ2VyIHRvdGFsIG51bWJlciBvZiBjb2xvciBiaXRzLCBub3QgY29uc2lkZXJpbmcKKyAgICAvLyBjb21wb25lbnRzIHRoYXQgYXJlIDAgb3IgZG9uJ3QtY2FyZS4KKyAgICBmb3IoY29uc3QgRUdMaW50ICphdHRyID0gYXR0cmliTGlzdDsgYXR0clswXSAhPSBFR0xfTk9ORTsgYXR0ciArPSAyKQorICAgIHsKKyAgICAgICAgaWYoYXR0clsxXSAhPSAwICYmIGF0dHJbMV0gIT0gRUdMX0RPTlRfQ0FSRSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChhdHRyWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEVHTF9SRURfU0laRTogICAgICAgbVdhbnRSZWQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfR1JFRU5fU0laRTogICAgIG1XYW50R3JlZW4gPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfQkxVRV9TSVpFOiAgICAgIG1XYW50Qmx1ZSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9BTFBIQV9TSVpFOiAgICAgbVdhbnRBbHBoYSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9MVU1JTkFOQ0VfU0laRTogbVdhbnRMdW1pbmFuY2UgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworRUdMaW50IFNvcnRDb25maWc6OndhbnRlZENvbXBvbmVudHNTaXplKGNvbnN0IENvbmZpZyAmY29uZmlnKSBjb25zdAoreworICAgIEVHTGludCB0b3RhbCA9IDA7CisKKyAgICBpZihtV2FudFJlZCkgICAgICAgdG90YWwgKz0gY29uZmlnLm1SZWRTaXplOworICAgIGlmKG1XYW50R3JlZW4pICAgICB0b3RhbCArPSBjb25maWcubUdyZWVuU2l6ZTsKKyAgICBpZihtV2FudEJsdWUpICAgICAgdG90YWwgKz0gY29uZmlnLm1CbHVlU2l6ZTsKKyAgICBpZihtV2FudEFscGhhKSAgICAgdG90YWwgKz0gY29uZmlnLm1BbHBoYVNpemU7CisgICAgaWYobVdhbnRMdW1pbmFuY2UpIHRvdGFsICs9IGNvbmZpZy5tTHVtaW5hbmNlU2l6ZTsKKworICAgIHJldHVybiB0b3RhbDsKK30KKworYm9vbCBTb3J0Q29uZmlnOjpvcGVyYXRvcigpKGNvbnN0IENvbmZpZyAqeCwgY29uc3QgQ29uZmlnICp5KSBjb25zdAoreworICAgIHJldHVybiAoKnRoaXMpKCp4LCAqeSk7Cit9CisKK2Jvb2wgU29ydENvbmZpZzo6b3BlcmF0b3IoKShjb25zdCBDb25maWcgJngsIGNvbnN0IENvbmZpZyAmeSkgY29uc3QKK3sKKyAgICAjZGVmaW5lIFNPUlQoYXR0cmlidXRlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoeC5hdHRyaWJ1dGUgIT0geS5hdHRyaWJ1dGUpICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiB4LmF0dHJpYnV0ZSA8IHkuYXR0cmlidXRlOyAgICAgIFwKKyAgICAgICAgfQorCisgICAgTUVUQV9BU1NFUlQoRUdMX05PTkUgPCBFR0xfU0xPV19DT05GSUcgJiYgRUdMX1NMT1dfQ09ORklHIDwgRUdMX05PTl9DT05GT1JNQU5UX0NPTkZJRyk7CisgICAgU09SVChtQ29uZmlnQ2F2ZWF0KTsKKworICAgIE1FVEFfQVNTRVJUKEVHTF9SR0JfQlVGRkVSIDwgRUdMX0xVTUlOQU5DRV9CVUZGRVIpOworICAgIFNPUlQobUNvbG9yQnVmZmVyVHlwZSk7CisKKyAgICAvLyBCeSBsYXJnZXIgdG90YWwgbnVtYmVyIG9mIGNvbG9yIGJpdHMsIG9ubHkgY29uc2lkZXJpbmcgdGhvc2UgdGhhdCBhcmUgcmVxdWVzdGVkIHRvIGJlID4gMC4KKyAgICBFR0xpbnQgeENvbXBvbmVudHNTaXplID0gd2FudGVkQ29tcG9uZW50c1NpemUoeCk7CisgICAgRUdMaW50IHlDb21wb25lbnRzU2l6ZSA9IHdhbnRlZENvbXBvbmVudHNTaXplKHkpOworICAgIGlmKHhDb21wb25lbnRzU2l6ZSAhPSB5Q29tcG9uZW50c1NpemUpCisgICAgeworICAgICAgICByZXR1cm4geENvbXBvbmVudHNTaXplID4geUNvbXBvbmVudHNTaXplOworICAgIH0KKworICAgIFNPUlQobUJ1ZmZlclNpemUpOworICAgIFNPUlQobVNhbXBsZUJ1ZmZlcnMpOworICAgIFNPUlQobVNhbXBsZXMpOworICAgIFNPUlQobURlcHRoU2l6ZSk7CisgICAgU09SVChtU3RlbmNpbFNpemUpOworICAgIFNPUlQobUFscGhhTWFza1NpemUpOworICAgIFNPUlQobU5hdGl2ZVZpc3VhbFR5cGUpOworICAgIFNPUlQobUNvbmZpZ0lEKTsKKworICAgICN1bmRlZiBTT1JUCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFdlJ2QgbGlrZSB0byB1c2UgU29ydENvbmZpZyB0byBhbHNvIGVsaW1pbmF0ZSBkdXBsaWNhdGUgY29uZmlncy4KKy8vIFRoaXMgd29ya3MgYXMgbG9uZyBhcyB3ZSBuZXZlciBoYXZlIHR3byBjb25maWdzIHdpdGggZGlmZmVyZW50IHBlci1SR0ItY29tcG9uZW50IGxheW91dHMsCisvLyBidXQgdGhlIHNhbWUgdG90YWwuCisvLyA1NTUxIGFuZCA1NjUgYXJlIGRpZmZlcmVudCBiZWNhdXNlIFIrRytCIGlzIGRpZmZlcmVudC4KKy8vIDU1NTEgYW5kIDU1NSBhcmUgZGlmZmVyZW50IGJlY2F1c2UgYnVmZmVyU2l6ZSBpcyBkaWZmZXJlbnQuCitjb25zdCBFR0xpbnQgQ29uZmlnU2V0OjptU29ydEF0dHJpYnNbXSA9Cit7CisgICAgRUdMX1JFRF9TSVpFLCAxLAorICAgIEVHTF9HUkVFTl9TSVpFLCAxLAorICAgIEVHTF9CTFVFX1NJWkUsIDEsCisgICAgRUdMX0xVTUlOQU5DRV9TSVpFLCAxLAorICAgIC8vIEJVVCBOT1QgQUxQSEEKKyAgICBFR0xfTk9ORQorfTsKKworQ29uZmlnU2V0OjpDb25maWdTZXQoKQorICAgIDogbVNldChTb3J0Q29uZmlnKG1Tb3J0QXR0cmlicykpCit7Cit9CisKK3ZvaWQgQ29uZmlnU2V0OjphZGQoY29uc3QgRGlzcGxheU1vZGUgJmRpc3BsYXlNb2RlLCBFR0xpbnQgbWluU3dhcEludGVydmFsLCBFR0xpbnQgbWF4U3dhcEludGVydmFsLCBzdzo6Rm9ybWF0IHJlbmRlclRhcmdldEZvcm1hdCwgc3c6OkZvcm1hdCBkZXB0aFN0ZW5jaWxGb3JtYXQsIEVHTGludCBtdWx0aVNhbXBsZSkKK3sKKyAgICBDb25maWcgY29uZmlnKGRpc3BsYXlNb2RlLCBtaW5Td2FwSW50ZXJ2YWwsIG1heFN3YXBJbnRlcnZhbCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQsIG11bHRpU2FtcGxlKTsKKworICAgIG1TZXQuaW5zZXJ0KGNvbmZpZyk7Cit9CisKK3NpemVfdCBDb25maWdTZXQ6OnNpemUoKSBjb25zdAoreworICAgIHJldHVybiBtU2V0LnNpemUoKTsKK30KKworYm9vbCBDb25maWdTZXQ6OmdldENvbmZpZ3MoRUdMQ29uZmlnICpjb25maWdzLCBjb25zdCBFR0xpbnQgKmF0dHJpYkxpc3QsIEVHTGludCBjb25maWdTaXplLCBFR0xpbnQgKm51bUNvbmZpZykKK3sKKyAgICB2ZWN0b3I8Y29uc3QgQ29uZmlnKj4gcGFzc2VkOworICAgIHBhc3NlZC5yZXNlcnZlKG1TZXQuc2l6ZSgpKTsKKworICAgIGZvcihJdGVyYXRvciBjb25maWcgPSBtU2V0LmJlZ2luKCk7IGNvbmZpZyAhPSBtU2V0LmVuZCgpOyBjb25maWcrKykKKyAgICB7CisgICAgICAgIGJvb2wgbWF0Y2ggPSB0cnVlOworICAgICAgICBjb25zdCBFR0xpbnQgKmF0dHJpYnV0ZSA9IGF0dHJpYkxpc3Q7CisKKyAgICAgICAgd2hpbGUoYXR0cmlidXRlWzBdICE9IEVHTF9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZVswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfQlVGRkVSX1NJWkU6ICAgICAgICAgICAgICAgbWF0Y2ggPSBjb25maWctPm1CdWZmZXJTaXplID49IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX0FMUEhBX1NJWkU6ICAgICAgICAgICAgICAgIG1hdGNoID0gY29uZmlnLT5tQWxwaGFTaXplID49IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9CTFVFX1NJWkU6ICAgICAgICAgICAgICAgICBtYXRjaCA9IGNvbmZpZy0+bUJsdWVTaXplID49IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfR1JFRU5fU0laRTogICAgICAgICAgICAgICAgbWF0Y2ggPSBjb25maWctPm1HcmVlblNpemUgPj0gYXR0cmlidXRlWzFdOyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX1JFRF9TSVpFOiAgICAgICAgICAgICAgICAgIG1hdGNoID0gY29uZmlnLT5tUmVkU2l6ZSA+PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9ERVBUSF9TSVpFOiAgICAgICAgICAgICAgICBtYXRjaCA9IGNvbmZpZy0+bURlcHRoU2l6ZSA+PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfU1RFTkNJTF9TSVpFOiAgICAgICAgICAgICAgbWF0Y2ggPSBjb25maWctPm1TdGVuY2lsU2l6ZSA+PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX0NPTkZJR19DQVZFQVQ6ICAgICAgICAgICAgIG1hdGNoID0gY29uZmlnLT5tQ29uZmlnQ2F2ZWF0ID09IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9DT05GSUdfSUQ6ICAgICAgICAgICAgICAgICBtYXRjaCA9IGNvbmZpZy0+bUNvbmZpZ0lEID09IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfTEVWRUw6ICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBjb25maWctPm1MZXZlbCA+PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX05BVElWRV9SRU5ERVJBQkxFOiAgICAgICAgIG1hdGNoID0gY29uZmlnLT5tTmF0aXZlUmVuZGVyYWJsZSA9PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9OQVRJVkVfVklTVUFMX1RZUEU6ICAgICAgICBtYXRjaCA9IGNvbmZpZy0+bU5hdGl2ZVZpc3VhbFR5cGUgPT0gYXR0cmlidXRlWzFdOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfU0FNUExFUzogICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBjb25maWctPm1TYW1wbGVzID49IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX1NBTVBMRV9CVUZGRVJTOiAgICAgICAgICAgIG1hdGNoID0gY29uZmlnLT5tU2FtcGxlQnVmZmVycyA+PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9TVVJGQUNFX1RZUEU6ICAgICAgICAgICAgICBtYXRjaCA9IChjb25maWctPm1TdXJmYWNlVHlwZSAmIGF0dHJpYnV0ZVsxXSkgPT0gYXR0cmlidXRlWzFdOyAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfVFJBTlNQQVJFTlRfVFlQRTogICAgICAgICAgbWF0Y2ggPSBjb25maWctPm1UcmFuc3BhcmVudFR5cGUgPT0gYXR0cmlidXRlWzFdOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUU6ICAgIG1hdGNoID0gY29uZmlnLT5tVHJhbnNwYXJlbnRCbHVlVmFsdWUgPT0gYXR0cmlidXRlWzFdOyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRTogICBtYXRjaCA9IGNvbmZpZy0+bVRyYW5zcGFyZW50R3JlZW5WYWx1ZSA9PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFOiAgICAgbWF0Y2ggPSBjb25maWctPm1UcmFuc3BhcmVudFJlZFZhbHVlID09IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0I6ICAgICAgIG1hdGNoID0gY29uZmlnLT5tQmluZFRvVGV4dHVyZVJHQiA9PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQTogICAgICBtYXRjaCA9IGNvbmZpZy0+bUJpbmRUb1RleHR1cmVSR0JBID09IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfTUlOX1NXQVBfSU5URVJWQUw6ICAgICAgICAgbWF0Y2ggPSBjb25maWctPm1NaW5Td2FwSW50ZXJ2YWwgPT0gYXR0cmlidXRlWzFdOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX01BWF9TV0FQX0lOVEVSVkFMOiAgICAgICAgIG1hdGNoID0gY29uZmlnLT5tTWF4U3dhcEludGVydmFsID09IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9MVU1JTkFOQ0VfU0laRTogICAgICAgICAgICBtYXRjaCA9IGNvbmZpZy0+bUx1bWluYW5jZVNpemUgPj0gYXR0cmlidXRlWzFdOyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfQUxQSEFfTUFTS19TSVpFOiAgICAgICAgICAgbWF0Y2ggPSBjb25maWctPm1BbHBoYU1hc2tTaXplID49IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX0NPTE9SX0JVRkZFUl9UWVBFOiAgICAgICAgIG1hdGNoID0gY29uZmlnLT5tQ29sb3JCdWZmZXJUeXBlID09IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9SRU5ERVJBQkxFX1RZUEU6ICAgICAgICAgICBtYXRjaCA9IChjb25maWctPm1SZW5kZXJhYmxlVHlwZSAmIGF0dHJpYnV0ZVsxXSkgPT0gYXR0cmlidXRlWzFdOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfTUFUQ0hfTkFUSVZFX1BJWE1BUDogICAgICAgbWF0Y2ggPSBmYWxzZTsgVU5JTVBMRU1FTlRFRCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX0NPTkZPUk1BTlQ6ICAgICAgICAgICAgICAgIG1hdGNoID0gKGNvbmZpZy0+bUNvbmZvcm1hbnQgJiBhdHRyaWJ1dGVbMV0pID09IGF0dHJpYnV0ZVsxXTsgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9NQVhfUEJVRkZFUl9XSURUSDogICAgICAgICBtYXRjaCA9IGNvbmZpZy0+bU1heFBCdWZmZXJXaWR0aCA+PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfTUFYX1BCVUZGRVJfSEVJR0hUOiAgICAgICAgbWF0Y2ggPSBjb25maWctPm1NYXhQQnVmZmVySGVpZ2h0ID49IGF0dHJpYnV0ZVsxXTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX01BWF9QQlVGRkVSX1BJWEVMUzogICAgICAgIG1hdGNoID0gY29uZmlnLT5tTWF4UEJ1ZmZlclBpeGVscyA+PSBhdHRyaWJ1dGVbMV07ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIW1hdGNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKG1hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICBwYXNzZWQucHVzaF9iYWNrKCYqY29uZmlnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGNvbmZpZ3MpCisgICAgeworICAgICAgICBzb3J0KHBhc3NlZC5iZWdpbigpLCBwYXNzZWQuZW5kKCksIFNvcnRDb25maWcoYXR0cmliTGlzdCkpOworCisgICAgICAgIEVHTGludCBpbmRleDsKKyAgICAgICAgZm9yKGluZGV4ID0gMDsgaW5kZXggPCBjb25maWdTaXplICYmIGluZGV4IDwgc3RhdGljX2Nhc3Q8RUdMaW50PihwYXNzZWQuc2l6ZSgpKTsgaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29uZmlnc1tpbmRleF0gPSBwYXNzZWRbaW5kZXhdLT5nZXRIYW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgICpudW1Db25maWcgPSBpbmRleDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKm51bUNvbmZpZyA9IHBhc3NlZC5zaXplKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IGVnbDo6Q29uZmlnICpDb25maWdTZXQ6OmdldChFR0xDb25maWcgY29uZmlnSGFuZGxlKQoreworICAgIGZvcihJdGVyYXRvciBjb25maWcgPSBtU2V0LmJlZ2luKCk7IGNvbmZpZyAhPSBtU2V0LmVuZCgpOyBjb25maWcrKykKKyAgICB7CisgICAgICAgIGlmKGNvbmZpZy0+Z2V0SGFuZGxlKCkgPT0gY29uZmlnSGFuZGxlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJigqY29uZmlnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML0NvbmZpZy5oIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzI2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvQ29uZmlnLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIENvbmZpZy5oOiBEZWZpbmVzIHRoZSBlZ2w6OkNvbmZpZyBjbGFzcywgZGVzY3JpYmluZyB0aGUgZm9ybWF0LCB0eXBlCisvLyBhbmQgc2l6ZSBmb3IgYW4gZWdsOjpTdXJmYWNlLiBJbXBsZW1lbnRzIEVHTENvbmZpZyBhbmQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LgorLy8gW0VHTCAxLjRdIHNlY3Rpb24gMy40IHBhZ2UgMTUuCisKKyNpZm5kZWYgSU5DTFVERV9DT05GSUdfSF8KKyNkZWZpbmUgSU5DTFVERV9DT05GSUdfSF8KKworI2luY2x1ZGUgImNvbW1vbi9hbmdsZXV0aWxzLmgiCisjaW5jbHVkZSAiUmVuZGVyZXIvU3VyZmFjZS5ocHAiCisKKyNkZWZpbmUgRUdMQVBJCisjaW5jbHVkZSA8RUdML2VnbC5oPgorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgZWdsCit7CitjbGFzcyBEaXNwbGF5OworCitzdHJ1Y3QgRGlzcGxheU1vZGUKK3sKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodDsKKwlzdzo6Rm9ybWF0IGZvcm1hdDsKK307CisKK2NsYXNzIENvbmZpZworeworICBwdWJsaWM6CisgICAgQ29uZmlnKERpc3BsYXlNb2RlIGRpc3BsYXlNb2RlLCBFR0xpbnQgbWluU3dhcEludGVydmFsLCBFR0xpbnQgbWF4U3dhcEludGVydmFsLCBzdzo6Rm9ybWF0IHJlbmRlclRhcmdldEZvcm1hdCwgc3c6OkZvcm1hdCBkZXB0aFN0ZW5jaWxGb3JtYXQsIEVHTGludCBtdWx0aVNhbXBsZSk7CisKKyAgICB2b2lkIHNldERlZmF1bHRzKCk7CisgICAgdm9pZCBzZXQoRGlzcGxheU1vZGUgZGlzcGxheU1vZGUsIEVHTGludCBtaW5Td2FwSW50ZXJ2YWwsIEVHTGludCBtYXhTd2FwSW50ZXJ2YWwsIHN3OjpGb3JtYXQgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBzdzo6Rm9ybWF0IGRlcHRoU3RlbmNpbEZvcm1hdCwgRUdMaW50IG11bHRpU2FtcGxlKTsKKyAgICBFR0xDb25maWcgZ2V0SGFuZGxlKCkgY29uc3Q7CisKKyAgICBjb25zdCBEaXNwbGF5TW9kZSBtRGlzcGxheU1vZGU7CisgICAgY29uc3Qgc3c6OkZvcm1hdCBtUmVuZGVyVGFyZ2V0Rm9ybWF0OworICAgIGNvbnN0IHN3OjpGb3JtYXQgbURlcHRoU3RlbmNpbEZvcm1hdDsKKyAgICBjb25zdCBFR0xpbnQgbU11bHRpU2FtcGxlOworCisgICAgRUdMaW50IG1CdWZmZXJTaXplOyAgICAgICAgICAgICAgLy8gRGVwdGggb2YgdGhlIGNvbG9yIGJ1ZmZlcgorICAgIEVHTGludCBtUmVkU2l6ZTsgICAgICAgICAgICAgICAgIC8vIEJpdHMgb2YgUmVkIGluIHRoZSBjb2xvciBidWZmZXIKKyAgICBFR0xpbnQgbUdyZWVuU2l6ZTsgICAgICAgICAgICAgICAvLyBCaXRzIG9mIEdyZWVuIGluIHRoZSBjb2xvciBidWZmZXIKKyAgICBFR0xpbnQgbUJsdWVTaXplOyAgICAgICAgICAgICAgICAvLyBCaXRzIG9mIEJsdWUgaW4gdGhlIGNvbG9yIGJ1ZmZlcgorICAgIEVHTGludCBtTHVtaW5hbmNlU2l6ZTsgICAgICAgICAgIC8vIEJpdHMgb2YgTHVtaW5hbmNlIGluIHRoZSBjb2xvciBidWZmZXIKKyAgICBFR0xpbnQgbUFscGhhU2l6ZTsgICAgICAgICAgICAgICAvLyBCaXRzIG9mIEFscGhhIGluIHRoZSBjb2xvciBidWZmZXIKKyAgICBFR0xpbnQgbUFscGhhTWFza1NpemU7ICAgICAgICAgICAvLyBCaXRzIG9mIEFscGhhIE1hc2sgaW4gdGhlIG1hc2sgYnVmZmVyCisgICAgRUdMQm9vbGVhbiBtQmluZFRvVGV4dHVyZVJHQjsgICAgLy8gVHJ1ZSBpZiBiaW5kYWJsZSB0byBSR0IgdGV4dHVyZXMuCisgICAgRUdMQm9vbGVhbiBtQmluZFRvVGV4dHVyZVJHQkE7ICAgLy8gVHJ1ZSBpZiBiaW5kYWJsZSB0byBSR0JBIHRleHR1cmVzLgorICAgIEVHTGVudW0gbUNvbG9yQnVmZmVyVHlwZTsgICAgICAgIC8vIENvbG9yIGJ1ZmZlciB0eXBlCisgICAgRUdMZW51bSBtQ29uZmlnQ2F2ZWF0OyAgICAgICAgICAgLy8gQW55IGNhdmVhdHMgZm9yIHRoZSBjb25maWd1cmF0aW9uCisgICAgRUdMaW50IG1Db25maWdJRDsgICAgICAgICAgICAgICAgLy8gVW5pcXVlIEVHTENvbmZpZyBpZGVudGlmaWVyCisgICAgRUdMaW50IG1Db25mb3JtYW50OyAgICAgICAgICAgICAgLy8gV2hldGhlciBjb250ZXh0cyBjcmVhdGVkIHdpdGggdGhpcyBjb25maWcgYXJlIGNvbmZvcm1hbnQKKyAgICBFR0xpbnQgbURlcHRoU2l6ZTsgICAgICAgICAgICAgICAvLyBCaXRzIG9mIFogaW4gdGhlIGRlcHRoIGJ1ZmZlcgorICAgIEVHTGludCBtTGV2ZWw7ICAgICAgICAgICAgICAgICAgIC8vIEZyYW1lIGJ1ZmZlciBsZXZlbAorICAgIEVHTEJvb2xlYW4gbU1hdGNoTmF0aXZlUGl4bWFwOyAgIC8vIE1hdGNoIHRoZSBuYXRpdmUgcGl4bWFwIGZvcm1hdAorICAgIEVHTGludCBtTWF4UEJ1ZmZlcldpZHRoOyAgICAgICAgIC8vIE1heGltdW0gd2lkdGggb2YgcGJ1ZmZlcgorICAgIEVHTGludCBtTWF4UEJ1ZmZlckhlaWdodDsgICAgICAgIC8vIE1heGltdW0gaGVpZ2h0IG9mIHBidWZmZXIKKyAgICBFR0xpbnQgbU1heFBCdWZmZXJQaXhlbHM7ICAgICAgICAvLyBNYXhpbXVtIHNpemUgb2YgcGJ1ZmZlcgorICAgIEVHTGludCBtTWF4U3dhcEludGVydmFsOyAgICAgICAgIC8vIE1heGltdW0gc3dhcCBpbnRlcnZhbAorICAgIEVHTGludCBtTWluU3dhcEludGVydmFsOyAgICAgICAgIC8vIE1pbmltdW0gc3dhcCBpbnRlcnZhbAorICAgIEVHTEJvb2xlYW4gbU5hdGl2ZVJlbmRlcmFibGU7ICAgIC8vIEVHTF9UUlVFIGlmIG5hdGl2ZSByZW5kZXJpbmcgQVBJcyBjYW4gcmVuZGVyIHRvIHN1cmZhY2UKKyAgICBFR0xpbnQgbU5hdGl2ZVZpc3VhbElEOyAgICAgICAgICAvLyBIYW5kbGUgb2YgY29ycmVzcG9uZGluZyBuYXRpdmUgdmlzdWFsCisgICAgRUdMaW50IG1OYXRpdmVWaXN1YWxUeXBlOyAgICAgICAgLy8gTmF0aXZlIHZpc3VhbCB0eXBlIG9mIHRoZSBhc3NvY2lhdGVkIHZpc3VhbAorICAgIEVHTGludCBtUmVuZGVyYWJsZVR5cGU7ICAgICAgICAgIC8vIFdoaWNoIGNsaWVudCByZW5kZXJpbmcgQVBJcyBhcmUgc3VwcG9ydGVkLgorICAgIEVHTGludCBtU2FtcGxlQnVmZmVyczsgICAgICAgICAgIC8vIE51bWJlciBvZiBtdWx0aXNhbXBsZSBidWZmZXJzCisgICAgRUdMaW50IG1TYW1wbGVzOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHBpeGVsCisgICAgRUdMaW50IG1TdGVuY2lsU2l6ZTsgICAgICAgICAgICAgLy8gQml0cyBvZiBTdGVuY2lsIGluIHRoZSBzdGVuY2lsIGJ1ZmZlcgorICAgIEVHTGludCBtU3VyZmFjZVR5cGU7ICAgICAgICAgICAgIC8vIFdoaWNoIHR5cGVzIG9mIEVHTCBzdXJmYWNlcyBhcmUgc3VwcG9ydGVkLgorICAgIEVHTGVudW0gbVRyYW5zcGFyZW50VHlwZTsgICAgICAgIC8vIFR5cGUgb2YgdHJhbnNwYXJlbmN5IHN1cHBvcnRlZAorICAgIEVHTGludCBtVHJhbnNwYXJlbnRSZWRWYWx1ZTsgICAgIC8vIFRyYW5zcGFyZW50IHJlZCB2YWx1ZQorICAgIEVHTGludCBtVHJhbnNwYXJlbnRHcmVlblZhbHVlOyAgIC8vIFRyYW5zcGFyZW50IGdyZWVuIHZhbHVlCisgICAgRUdMaW50IG1UcmFuc3BhcmVudEJsdWVWYWx1ZTsgICAgLy8gVHJhbnNwYXJlbnQgYmx1ZSB2YWx1ZQorfTsKKworLy8gRnVuY3Rpb24gb2JqZWN0IHVzZWQgYnkgU1RMIHNvcnRpbmcgcm91dGluZXMgZm9yIG9yZGVyaW5nIENvbmZpZ3MgYWNjb3JkaW5nIHRvIFtFR0xdIHNlY3Rpb24gMy40LjEgcGFnZSAyNC4KK2NsYXNzIFNvcnRDb25maWcKK3sKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFNvcnRDb25maWcoY29uc3QgRUdMaW50ICphdHRyaWJMaXN0KTsKKworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBDb25maWcgKngsIGNvbnN0IENvbmZpZyAqeSkgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IENvbmZpZyAmeCwgY29uc3QgQ29uZmlnICZ5KSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHZvaWQgc2NhbkZvcldhbnRlZENvbXBvbmVudHMoY29uc3QgRUdMaW50ICphdHRyaWJMaXN0KTsKKyAgICBFR0xpbnQgd2FudGVkQ29tcG9uZW50c1NpemUoY29uc3QgQ29uZmlnICZjb25maWcpIGNvbnN0OworCisgICAgYm9vbCBtV2FudFJlZDsKKyAgICBib29sIG1XYW50R3JlZW47CisgICAgYm9vbCBtV2FudEJsdWU7CisgICAgYm9vbCBtV2FudEFscGhhOworICAgIGJvb2wgbVdhbnRMdW1pbmFuY2U7Cit9OworCitjbGFzcyBDb25maWdTZXQKK3sKKyAgICBmcmllbmQgRGlzcGxheTsKKworICBwdWJsaWM6CisgICAgQ29uZmlnU2V0KCk7CisKKyAgICB2b2lkIGFkZChjb25zdCBEaXNwbGF5TW9kZSAmZGlzcGxheU1vZGUsIEVHTGludCBtaW5Td2FwSW50ZXJ2YWwsIEVHTGludCBtYXhTd2FwSW50ZXJ2YWwsIHN3OjpGb3JtYXQgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBzdzo6Rm9ybWF0IGRlcHRoU3RlbmNpbEZvcm1hdCwgRUdMaW50IG11bHRpU2FtcGxlKTsKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICAgIGJvb2wgZ2V0Q29uZmlncyhFR0xDb25maWcgKmNvbmZpZ3MsIGNvbnN0IEVHTGludCAqYXR0cmliTGlzdCwgRUdMaW50IGNvbmZpZ1NpemUsIEVHTGludCAqbnVtQ29uZmlnKTsKKyAgICBjb25zdCBlZ2w6OkNvbmZpZyAqZ2V0KEVHTENvbmZpZyBjb25maWdIYW5kbGUpOworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvbmZpZ1NldCk7CisKKyAgICB0eXBlZGVmIHN0ZDo6c2V0PENvbmZpZywgU29ydENvbmZpZz4gU2V0OworICAgIHR5cGVkZWYgU2V0OjppdGVyYXRvciBJdGVyYXRvcjsKKyAgICBTZXQgbVNldDsKKworICAgIHN0YXRpYyBjb25zdCBFR0xpbnQgbVNvcnRBdHRyaWJzW107Cit9OworfQorCisjZW5kaWYgICAvLyBJTkNMVURFX0NPTkZJR19IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML0Rpc3BsYXkuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML0Rpc3BsYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjczYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvRGlzcGxheS5jcHAKQEAgLTAsMCArMSw0OTQgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMSBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIERpc3BsYXkuY3BwOiBJbXBsZW1lbnRzIHRoZSBlZ2w6OkRpc3BsYXkgY2xhc3MsIHJlcHJlc2VudGluZyB0aGUgYWJzdHJhY3QKKy8vIGRpc3BsYXkgb24gd2hpY2ggZ3JhcGhpY3MgYXJlIGRyYXduLiBJbXBsZW1lbnRzIEVHTERpc3BsYXkuCisvLyBbRUdMIDEuNF0gc2VjdGlvbiAyLjEuMiBwYWdlIDMuCisKKyNpbmNsdWRlICJEaXNwbGF5LmgiCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAibGliR0xFU3YyL21hdGh1dGlsLmgiCisjaW5jbHVkZSAibGliR0xFU3YyL0RldmljZS5ocHAiCisjaW5jbHVkZSAiY29tbW9uL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGVnbAorewordHlwZWRlZiBzdGQ6Om1hcDxFR0xOYXRpdmVEaXNwbGF5VHlwZSwgRGlzcGxheSo+IERpc3BsYXlNYXA7IAorRGlzcGxheU1hcCBkaXNwbGF5czsKKworZWdsOjpEaXNwbGF5ICpEaXNwbGF5OjpnZXREaXNwbGF5KEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXlJZCkKK3sKKyAgICBpZihkaXNwbGF5cy5maW5kKGRpc3BsYXlJZCkgIT0gZGlzcGxheXMuZW5kKCkpCisgICAgeworICAgICAgICByZXR1cm4gZGlzcGxheXNbZGlzcGxheUlkXTsKKyAgICB9CisKKyAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBOVUxMOworCisgICAgaWYoZGlzcGxheUlkID09IEVHTF9ERUZBVUxUX0RJU1BMQVkpCisgICAgeworICAgICAgICBkaXNwbGF5ID0gbmV3IGVnbDo6RGlzcGxheShkaXNwbGF5SWQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBGSVhNRTogQ2hlY2sgaWYgZGlzcGxheUlkIGlzIGEgdmFsaWQgZGlzcGxheSBkZXZpY2UgY29udGV4dAorCisgICAgICAgIGRpc3BsYXkgPSBuZXcgZWdsOjpEaXNwbGF5KGRpc3BsYXlJZCk7CisgICAgfQorCisgICAgZGlzcGxheXNbZGlzcGxheUlkXSA9IGRpc3BsYXk7CisgICAgcmV0dXJuIGRpc3BsYXk7Cit9CisKK0Rpc3BsYXk6OkRpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheUlkKSA6IGRpc3BsYXlJZChkaXNwbGF5SWQpCit7CisgICAgbURldmljZSA9IE5VTEw7CisKKyAgICBtTWluU3dhcEludGVydmFsID0gMTsKKyAgICBtTWF4U3dhcEludGVydmFsID0gMTsKK30KKworRGlzcGxheTo6fkRpc3BsYXkoKQoreworICAgIHRlcm1pbmF0ZSgpOworCisJZGlzcGxheXMuZXJhc2UoZGlzcGxheUlkKTsKK30KKworYm9vbCBEaXNwbGF5Ojppbml0aWFsaXplKCkKK3sKKyAgICBpZihpc0luaXRpYWxpemVkKCkpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisJCQorICAgIG1NaW5Td2FwSW50ZXJ2YWwgPSAwOworICAgIG1NYXhTd2FwSW50ZXJ2YWwgPSA0OworCisgICAgY29uc3Qgc3c6OkZvcm1hdCByZW5kZXJUYXJnZXRGb3JtYXRzW10gPQorICAgIHsKKyAgICAgICAgc3c6OkZPUk1BVF9BMVI1RzVCNSwKKyAgICAvLyAgc3c6OkZPUk1BVF9BMlIxMEcxMEIxMCwgICAvLyBUaGUgY29sb3JfcmFtcCBjb25mb3JtYW5jZSB0ZXN0IHVzZXMgUmVhZFBpeGVscyB3aXRoIFVOU0lHTkVEX0JZVEUgY2F1c2luZyBpdCB0byB0aGluayB0aGF0IHJlbmRlcmluZyBza2lwcGVkIGEgY29sb3VyIHZhbHVlLgorICAgICAgICBzdzo6Rk9STUFUX0E4UjhHOEI4LAorICAgICAgICBzdzo6Rk9STUFUX1I1RzZCNSwKKyAgICAvLyAgc3c6OkZPUk1BVF9YMVI1RzVCNSwgICAgICAvLyBIYXMgbm8gY29tcGF0aWJsZSBPcGVuR0wgRVMgcmVuZGVyYnVmZmVyIGZvcm1hdAorICAgICAgICBzdzo6Rk9STUFUX1g4UjhHOEI4CisgICAgfTsKKworICAgIGNvbnN0IHN3OjpGb3JtYXQgZGVwdGhTdGVuY2lsRm9ybWF0c1tdID0KKyAgICB7CisgICAgICAgIHN3OjpGT1JNQVRfTlVMTCwKKyAgICAvLyAgc3c6OkZPUk1BVF9EMTZfTE9DS0FCTEUsCisgICAgICAgIHN3OjpGT1JNQVRfRDMyLAorICAgIC8vICBzdzo6Rk9STUFUX0QxNVMxLAorICAgICAgICBzdzo6Rk9STUFUX0QyNFM4LAorICAgICAgICBzdzo6Rk9STUFUX0QyNFg4LAorICAgIC8vICBzdzo6Rk9STUFUX0QyNFg0UzQsCisgICAgICAgIHN3OjpGT1JNQVRfRDE2LAorICAgIC8vICBzdzo6Rk9STUFUX0QzMkZfTE9DS0FCTEUsCisgICAgLy8gIHN3OjpGT1JNQVRfRDI0RlM4CisgICAgfTsKKworCURpc3BsYXlNb2RlIGN1cnJlbnREaXNwbGF5TW9kZSA9IHswfTsKKworCUhEQyBkZXZpY2VDb250ZXh0ID0gR2V0REMoMCk7CisKKwljdXJyZW50RGlzcGxheU1vZGUud2lkdGggPSA6OkdldERldmljZUNhcHMoZGV2aWNlQ29udGV4dCwgSE9SWlJFUyk7CisJY3VycmVudERpc3BsYXlNb2RlLmhlaWdodCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBWRVJUUkVTKTsKKwl1bnNpZ25lZCBpbnQgYnBwID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIEJJVFNQSVhFTCk7CisKKwlzd2l0Y2goYnBwKQorCXsKKwljYXNlIDMyOiBjdXJyZW50RGlzcGxheU1vZGUuZm9ybWF0ID0gc3c6OkZPUk1BVF9YOFI4RzhCODsgYnJlYWs7CisJY2FzZSAyNDogY3VycmVudERpc3BsYXlNb2RlLmZvcm1hdCA9IHN3OjpGT1JNQVRfUjhHOEI4OyAgIGJyZWFrOworCWNhc2UgMTY6IGN1cnJlbnREaXNwbGF5TW9kZS5mb3JtYXQgPSBzdzo6Rk9STUFUX1I1RzZCNTsgICBicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoZmFsc2UpOyAgIC8vIFVuZXhwZWN0ZWQgZGlzcGxheSBtb2RlIGNvbG9yIGRlcHRoCisJfQorCisJUmVsZWFzZURDKDAsIGRldmljZUNvbnRleHQpOworCisgICAgQ29uZmlnU2V0IGNvbmZpZ1NldDsKKworICAgIGZvcihpbnQgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IHNpemVvZihyZW5kZXJUYXJnZXRGb3JtYXRzKSAvIHNpemVvZihzdzo6Rm9ybWF0KTsgZm9ybWF0SW5kZXgrKykKKyAgICB7CisgICAgICAgIHN3OjpGb3JtYXQgcmVuZGVyVGFyZ2V0Rm9ybWF0ID0gcmVuZGVyVGFyZ2V0Rm9ybWF0c1tmb3JtYXRJbmRleF07CisKKyAgICAgICAgZm9yKGludCBkZXB0aFN0ZW5jaWxJbmRleCA9IDA7IGRlcHRoU3RlbmNpbEluZGV4IDwgc2l6ZW9mKGRlcHRoU3RlbmNpbEZvcm1hdHMpIC8gc2l6ZW9mKHN3OjpGb3JtYXQpOyBkZXB0aFN0ZW5jaWxJbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICBzdzo6Rm9ybWF0IGRlcHRoU3RlbmNpbEZvcm1hdCA9IGRlcHRoU3RlbmNpbEZvcm1hdHNbZGVwdGhTdGVuY2lsSW5kZXhdOworICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gRklYTUU6IGVudW1lcmF0ZSBtdWx0aS1zYW1wbGluZworCisgICAgICAgICAgICBjb25maWdTZXQuYWRkKGN1cnJlbnREaXNwbGF5TW9kZSwgbU1pblN3YXBJbnRlcnZhbCwgbU1heFN3YXBJbnRlcnZhbCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR2l2ZSB0aGUgc29ydGVkIGNvbmZpZ3MgYSB1bmlxdWUgSUQgYW5kIHN0b3JlIHRoZW0gaW50ZXJuYWxseQorICAgIEVHTGludCBpbmRleCA9IDE7CisgICAgZm9yKENvbmZpZ1NldDo6SXRlcmF0b3IgY29uZmlnID0gY29uZmlnU2V0Lm1TZXQuYmVnaW4oKTsgY29uZmlnICE9IGNvbmZpZ1NldC5tU2V0LmVuZCgpOyBjb25maWcrKykKKyAgICB7CisgICAgICAgIENvbmZpZyBjb25maWd1cmF0aW9uID0gKmNvbmZpZzsKKyAgICAgICAgY29uZmlndXJhdGlvbi5tQ29uZmlnSUQgPSBpbmRleDsKKyAgICAgICAgaW5kZXgrKzsKKworICAgICAgICBtQ29uZmlnU2V0Lm1TZXQuaW5zZXJ0KGNvbmZpZ3VyYXRpb24pOworICAgIH0KKworICAgIGlmKCFpc0luaXRpYWxpemVkKCkpCisgICAgeworICAgICAgICB0ZXJtaW5hdGUoKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW5pdEV4dGVuc2lvblN0cmluZygpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRGlzcGxheTo6dGVybWluYXRlKCkKK3sKKyAgICB3aGlsZSghbVN1cmZhY2VTZXQuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGRlc3Ryb3lTdXJmYWNlKCptU3VyZmFjZVNldC5iZWdpbigpKTsKKyAgICB9CisKKyAgICB3aGlsZSghbUNvbnRleHRTZXQuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGRlc3Ryb3lDb250ZXh0KCptQ29udGV4dFNldC5iZWdpbigpKTsKKyAgICB9CisKKyAgICBkZWxldGUgbURldmljZTsKKyAgICBtRGV2aWNlID0gTlVMTDsKK30KKworYm9vbCBEaXNwbGF5OjpnZXRDb25maWdzKEVHTENvbmZpZyAqY29uZmlncywgY29uc3QgRUdMaW50ICphdHRyaWJMaXN0LCBFR0xpbnQgY29uZmlnU2l6ZSwgRUdMaW50ICpudW1Db25maWcpCit7CisgICAgcmV0dXJuIG1Db25maWdTZXQuZ2V0Q29uZmlncyhjb25maWdzLCBhdHRyaWJMaXN0LCBjb25maWdTaXplLCBudW1Db25maWcpOworfQorCitib29sIERpc3BsYXk6OmdldENvbmZpZ0F0dHJpYihFR0xDb25maWcgY29uZmlnLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQoreworICAgIGNvbnN0IGVnbDo6Q29uZmlnICpjb25maWd1cmF0aW9uID0gbUNvbmZpZ1NldC5nZXQoY29uZmlnKTsKKworICAgIHN3aXRjaCAoYXR0cmlidXRlKQorICAgIHsKKyAgICAgIGNhc2UgRUdMX0JVRkZFUl9TSVpFOiAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1CdWZmZXJTaXplOyAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0FMUEhBX1NJWkU6ICAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1BbHBoYVNpemU7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0JMVUVfU0laRTogICAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1CbHVlU2l6ZTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0dSRUVOX1NJWkU6ICAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1HcmVlblNpemU7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1JFRF9TSVpFOiAgICAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1SZWRTaXplOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0RFUFRIX1NJWkU6ICAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1EZXB0aFNpemU7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1NURU5DSUxfU0laRTogICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1TdGVuY2lsU2l6ZTsgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0NPTkZJR19DQVZFQVQ6ICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1Db25maWdDYXZlYXQ7ICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0NPTkZJR19JRDogICAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1Db25maWdJRDsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0xFVkVMOiAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1MZXZlbDsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX05BVElWRV9SRU5ERVJBQkxFOiAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1OYXRpdmVSZW5kZXJhYmxlOyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX05BVElWRV9WSVNVQUxfVFlQRTogICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1OYXRpdmVWaXN1YWxUeXBlOyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1NBTVBMRVM6ICAgICAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1TYW1wbGVzOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1NBTVBMRV9CVUZGRVJTOiAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1TYW1wbGVCdWZmZXJzOyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1NVUkZBQ0VfVFlQRTogICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1TdXJmYWNlVHlwZTsgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX1RZUEU6ICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1UcmFuc3BhcmVudFR5cGU7ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUU6ICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1UcmFuc3BhcmVudEJsdWVWYWx1ZTsgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFOiAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1UcmFuc3BhcmVudEdyZWVuVmFsdWU7ICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRTogICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1UcmFuc3BhcmVudFJlZFZhbHVlOyAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0I6ICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1CaW5kVG9UZXh0dXJlUkdCOyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBOiAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1CaW5kVG9UZXh0dXJlUkdCQTsgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX01JTl9TV0FQX0lOVEVSVkFMOiAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1NaW5Td2FwSW50ZXJ2YWw7ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX01BWF9TV0FQX0lOVEVSVkFMOiAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1NYXhTd2FwSW50ZXJ2YWw7ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0xVTUlOQU5DRV9TSVpFOiAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1MdW1pbmFuY2VTaXplOyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0FMUEhBX01BU0tfU0laRTogICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1BbHBoYU1hc2tTaXplOyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0NPTE9SX0JVRkZFUl9UWVBFOiAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1Db2xvckJ1ZmZlclR5cGU7ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX1JFTkRFUkFCTEVfVFlQRTogICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1SZW5kZXJhYmxlVHlwZTsgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX01BVENIX05BVElWRV9QSVhNQVA6ICAgICAgICp2YWx1ZSA9IGZhbHNlOyBVTklNUExFTUVOVEVEKCk7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX0NPTkZPUk1BTlQ6ICAgICAgICAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1Db25mb3JtYW50OyAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX01BWF9QQlVGRkVSX1dJRFRIOiAgICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1NYXhQQnVmZmVyV2lkdGg7ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX01BWF9QQlVGRkVSX0hFSUdIVDogICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1NYXhQQnVmZmVySGVpZ2h0OyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRUdMX01BWF9QQlVGRkVSX1BJWEVMUzogICAgICAgICp2YWx1ZSA9IGNvbmZpZ3VyYXRpb24tPm1NYXhQQnVmZmVyUGl4ZWxzOyAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEaXNwbGF5OjpjcmVhdGVEZXZpY2UoKQoreworICAgIG1EZXZpY2UgPSA6OmNyZWF0ZURldmljZSgpOworCisgICAgaWYoIW1EZXZpY2UpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgZmFsc2UpOworICAgIH0KKworICAgIC8vIFBlcm1hbmVudCBub24tZGVmYXVsdCBzdGF0ZXMKKwltRGV2aWNlLT5zZXRQb2ludFNwcml0ZUVuYWJsZSh0cnVlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitFR0xTdXJmYWNlIERpc3BsYXk6OmNyZWF0ZVdpbmRvd1N1cmZhY2UoSFdORCB3aW5kb3csIEVHTENvbmZpZyBjb25maWcsIGNvbnN0IEVHTGludCAqYXR0cmliTGlzdCkKK3sKKyAgICBjb25zdCBDb25maWcgKmNvbmZpZ3VyYXRpb24gPSBtQ29uZmlnU2V0LmdldChjb25maWcpOworCisgICAgaWYoYXR0cmliTGlzdCkKKyAgICB7CisgICAgICAgIHdoaWxlKCphdHRyaWJMaXN0ICE9IEVHTF9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYkxpc3RbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgRUdMX1JFTkRFUl9CVUZGRVI6CisgICAgICAgICAgICAgICAgc3dpdGNoIChhdHRyaWJMaXN0WzFdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgRUdMX0JBQ0tfQlVGRkVSOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgRUdMX1NJTkdMRV9CVUZGRVI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7ICAgLy8gUmVuZGVyaW5nIGRpcmVjdGx5IHRvIGZyb250IGJ1ZmZlciBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX1ZHX0NPTE9SU1BBQ0U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfVkdfQUxQSEFfRk9STUFUOgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYkxpc3QgKz0gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGhhc0V4aXN0aW5nV2luZG93U3VyZmFjZSh3aW5kb3cpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19TVVJGQUNFKTsKKyAgICB9CisKKyAgICBTdXJmYWNlICpzdXJmYWNlID0gbmV3IFN1cmZhY2UodGhpcywgY29uZmlndXJhdGlvbiwgd2luZG93KTsKKworICAgIGlmKCFzdXJmYWNlLT5pbml0aWFsaXplKCkpCisgICAgeworICAgICAgICBkZWxldGUgc3VyZmFjZTsKKyAgICAgICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworICAgIH0KKworICAgIG1TdXJmYWNlU2V0Lmluc2VydChzdXJmYWNlKTsKKworICAgIHJldHVybiBzdWNjZXNzKHN1cmZhY2UpOworfQorCitFR0xTdXJmYWNlIERpc3BsYXk6OmNyZWF0ZU9mZnNjcmVlblN1cmZhY2UoRUdMQ29uZmlnIGNvbmZpZywgSEFORExFIHNoYXJlSGFuZGxlLCBjb25zdCBFR0xpbnQgKmF0dHJpYkxpc3QpCit7CisgICAgRUdMaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKKyAgICBFR0xlbnVtIHRleHR1cmVGb3JtYXQgPSBFR0xfTk9fVEVYVFVSRTsKKyAgICBFR0xlbnVtIHRleHR1cmVUYXJnZXQgPSBFR0xfTk9fVEVYVFVSRTsKKyAgICBjb25zdCBDb25maWcgKmNvbmZpZ3VyYXRpb24gPSBtQ29uZmlnU2V0LmdldChjb25maWcpOworCisgICAgaWYoYXR0cmliTGlzdCkKKyAgICB7CisgICAgICAgIHdoaWxlKCphdHRyaWJMaXN0ICE9IEVHTF9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYkxpc3RbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgRUdMX1dJRFRIOgorICAgICAgICAgICAgICAgIHdpZHRoID0gYXR0cmliTGlzdFsxXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfSEVJR0hUOgorICAgICAgICAgICAgICAgIGhlaWdodCA9IGF0dHJpYkxpc3RbMV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRUdMX0xBUkdFU1RfUEJVRkZFUjoKKyAgICAgICAgICAgICAgICBpZihhdHRyaWJMaXN0WzFdICE9IEVHTF9GQUxTRSkKKyAgICAgICAgICAgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgLy8gRklYTUUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfVEVYVFVSRV9GT1JNQVQ6CisgICAgICAgICAgICAgICAgc3dpdGNoIChhdHRyaWJMaXN0WzFdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgRUdMX05PX1RFWFRVUkU6CisgICAgICAgICAgICAgICAgICBjYXNlIEVHTF9URVhUVVJFX1JHQjoKKyAgICAgICAgICAgICAgICAgIGNhc2UgRUdMX1RFWFRVUkVfUkdCQToKKyAgICAgICAgICAgICAgICAgICAgdGV4dHVyZUZvcm1hdCA9IGF0dHJpYkxpc3RbMV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVHTF9URVhUVVJFX1RBUkdFVDoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYkxpc3RbMV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2FzZSBFR0xfTk9fVEVYVFVSRToKKyAgICAgICAgICAgICAgICAgIGNhc2UgRUdMX1RFWFRVUkVfMkQ6CisgICAgICAgICAgICAgICAgICAgIHRleHR1cmVUYXJnZXQgPSBhdHRyaWJMaXN0WzFdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FUVFJJQlVURSwgRUdMX05PX1NVUkZBQ0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfTUlQTUFQX1RFWFRVUkU6CisgICAgICAgICAgICAgICAgaWYoYXR0cmliTGlzdFsxXSAhPSBFR0xfRkFMU0UpCisgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFR0xfVkdfQ09MT1JTUEFDRToKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOworICAgICAgICAgICAgICBjYXNlIEVHTF9WR19BTFBIQV9GT1JNQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmliTGlzdCArPSAyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYod2lkdGggPCAwIHx8IGhlaWdodCA8IDApCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19TVVJGQUNFKTsKKyAgICB9CisKKyAgICBpZih3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfTk9fU1VSRkFDRSk7CisgICAgfQorCisgICAgaWYoKHRleHR1cmVGb3JtYXQgIT0gRUdMX05PX1RFWFRVUkUgJiYgdGV4dHVyZVRhcmdldCA9PSBFR0xfTk9fVEVYVFVSRSkgfHwKKyAgICAgICAodGV4dHVyZUZvcm1hdCA9PSBFR0xfTk9fVEVYVFVSRSAmJiB0ZXh0dXJlVGFyZ2V0ICE9IEVHTF9OT19URVhUVVJFKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisgICAgfQorCisgICAgaWYoIShjb25maWd1cmF0aW9uLT5tU3VyZmFjZVR5cGUgJiBFR0xfUEJVRkZFUl9CSVQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKKyAgICB9CisKKyAgICBpZigodGV4dHVyZUZvcm1hdCA9PSBFR0xfVEVYVFVSRV9SR0IgJiYgY29uZmlndXJhdGlvbi0+bUJpbmRUb1RleHR1cmVSR0IgIT0gRUdMX1RSVUUpIHx8CisgICAgICAgKHRleHR1cmVGb3JtYXQgPT0gRUdMX1RFWFRVUkVfUkdCQSAmJiBjb25maWd1cmF0aW9uLT5tQmluZFRvVGV4dHVyZVJHQkEgIT0gRUdMX1RSVUUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfTk9fU1VSRkFDRSk7CisgICAgfQorCisgICAgU3VyZmFjZSAqc3VyZmFjZSA9IG5ldyBTdXJmYWNlKHRoaXMsIGNvbmZpZ3VyYXRpb24sIHdpZHRoLCBoZWlnaHQsIHRleHR1cmVGb3JtYXQsIHRleHR1cmVUYXJnZXQpOworCisgICAgaWYoIXN1cmZhY2UtPmluaXRpYWxpemUoKSkKKyAgICB7CisgICAgICAgIGRlbGV0ZSBzdXJmYWNlOworICAgICAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7CisgICAgfQorCisgICAgbVN1cmZhY2VTZXQuaW5zZXJ0KHN1cmZhY2UpOworCisgICAgcmV0dXJuIHN1Y2Nlc3Moc3VyZmFjZSk7Cit9CisKK0VHTENvbnRleHQgRGlzcGxheTo6Y3JlYXRlQ29udGV4dChFR0xDb25maWcgY29uZmlnSGFuZGxlLCBjb25zdCBnbDo6Q29udGV4dCAqc2hhcmVDb250ZXh0KQoreworICAgIGlmKCFtRGV2aWNlKQorICAgIHsKKyAgICAgICAgaWYoIWNyZWF0ZURldmljZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGVnbDo6Q29uZmlnICpjb25maWcgPSBtQ29uZmlnU2V0LmdldChjb25maWdIYW5kbGUpOworCisgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbENyZWF0ZUNvbnRleHQoY29uZmlnLCBzaGFyZUNvbnRleHQpOworICAgIG1Db250ZXh0U2V0Lmluc2VydChjb250ZXh0KTsKKworICAgIHJldHVybiBjb250ZXh0OworfQorCit2b2lkIERpc3BsYXk6OmRlc3Ryb3lTdXJmYWNlKGVnbDo6U3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgICBkZWxldGUgc3VyZmFjZTsKKyAgICBtU3VyZmFjZVNldC5lcmFzZShzdXJmYWNlKTsKK30KKwordm9pZCBEaXNwbGF5OjpkZXN0cm95Q29udGV4dChnbDo6Q29udGV4dCAqY29udGV4dCkKK3sKKyAgICBnbERlc3Ryb3lDb250ZXh0KGNvbnRleHQpOworICAgIG1Db250ZXh0U2V0LmVyYXNlKGNvbnRleHQpOworfQorCitib29sIERpc3BsYXk6OmlzSW5pdGlhbGl6ZWQoKSBjb25zdAoreworICAgIHJldHVybiBtQ29uZmlnU2V0LnNpemUoKSA+IDA7Cit9CisKK2Jvb2wgRGlzcGxheTo6aXNWYWxpZENvbmZpZyhFR0xDb25maWcgY29uZmlnKQoreworICAgIHJldHVybiBtQ29uZmlnU2V0LmdldChjb25maWcpICE9IE5VTEw7Cit9CisKK2Jvb2wgRGlzcGxheTo6aXNWYWxpZENvbnRleHQoZ2w6OkNvbnRleHQgKmNvbnRleHQpCit7CisgICAgcmV0dXJuIG1Db250ZXh0U2V0LmZpbmQoY29udGV4dCkgIT0gbUNvbnRleHRTZXQuZW5kKCk7Cit9CisKK2Jvb2wgRGlzcGxheTo6aXNWYWxpZFN1cmZhY2UoZWdsOjpTdXJmYWNlICpzdXJmYWNlKQoreworICAgIHJldHVybiBtU3VyZmFjZVNldC5maW5kKHN1cmZhY2UpICE9IG1TdXJmYWNlU2V0LmVuZCgpOworfQorCitib29sIERpc3BsYXk6Omhhc0V4aXN0aW5nV2luZG93U3VyZmFjZShIV05EIHdpbmRvdykKK3sKKyAgICBmb3IoU3VyZmFjZVNldDo6aXRlcmF0b3Igc3VyZmFjZSA9IG1TdXJmYWNlU2V0LmJlZ2luKCk7IHN1cmZhY2UgIT0gbVN1cmZhY2VTZXQuZW5kKCk7IHN1cmZhY2UrKykKKyAgICB7CisgICAgICAgIGlmKCgqc3VyZmFjZSktPmdldFdpbmRvd0hhbmRsZSgpID09IHdpbmRvdykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0VHTGludCBEaXNwbGF5OjpnZXRNaW5Td2FwSW50ZXJ2YWwoKQoreworICAgIHJldHVybiBtTWluU3dhcEludGVydmFsOworfQorCitFR0xpbnQgRGlzcGxheTo6Z2V0TWF4U3dhcEludGVydmFsKCkKK3sKKyAgICByZXR1cm4gbU1heFN3YXBJbnRlcnZhbDsKK30KKworZ2w6OkRldmljZSAqRGlzcGxheTo6Z2V0RGV2aWNlKCkKK3sKKyAgICBpZighbURldmljZSkKKyAgICB7CisgICAgICAgIGlmKCFjcmVhdGVEZXZpY2UoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbURldmljZTsKK30KKwordm9pZCBEaXNwbGF5Ojppbml0RXh0ZW5zaW9uU3RyaW5nKCkKK3sKKyAgICBtRXh0ZW5zaW9uU3RyaW5nICs9ICJFR0xfQU5HTEVfcXVlcnlfc3VyZmFjZV9wb2ludGVyICI7CisKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGVuZCA9IG1FeHRlbnNpb25TdHJpbmcuZmluZF9sYXN0X25vdF9vZignICcpOworICAgIGlmKGVuZCAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIG1FeHRlbnNpb25TdHJpbmcucmVzaXplKGVuZCsxKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKkRpc3BsYXk6OmdldEV4dGVuc2lvblN0cmluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1FeHRlbnNpb25TdHJpbmcuY19zdHIoKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML0Rpc3BsYXkuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9EaXNwbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0OWEyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9EaXNwbGF5LmgKQEAgLTAsMCArMSw5MyBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDExIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gRGlzcGxheS5oOiBEZWZpbmVzIHRoZSBlZ2w6OkRpc3BsYXkgY2xhc3MsIHJlcHJlc2VudGluZyB0aGUgYWJzdHJhY3QKKy8vIGRpc3BsYXkgb24gd2hpY2ggZ3JhcGhpY3MgYXJlIGRyYXduLiBJbXBsZW1lbnRzIEVHTERpc3BsYXkuCisvLyBbRUdMIDEuNF0gc2VjdGlvbiAyLjEuMiBwYWdlIDMuCisKKyNpZm5kZWYgSU5DTFVERV9ESVNQTEFZX0hfCisjZGVmaW5lIElOQ0xVREVfRElTUExBWV9IXworCisjaW5jbHVkZSAiQ29uZmlnLmgiCisjaW5jbHVkZSAiU3VyZmFjZS5oIgorI2luY2x1ZGUgImxpYkdMRVN2Mi9Db250ZXh0LmgiCisjaW5jbHVkZSAibGliR0xFU3YyL0RldmljZS5ocHAiCisKKyNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorCSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIHN3Cit7CisJY2xhc3MgQ29udGV4dDsKK30KKworbmFtZXNwYWNlIGVnbAoreworCWNsYXNzIERpc3BsYXkKKwl7CisJcHVibGljOgorCQl+RGlzcGxheSgpOworCisJCXN0YXRpYyBlZ2w6OkRpc3BsYXkgKmdldERpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheUlkKTsKKworCQlib29sIGluaXRpYWxpemUoKTsKKwkJdm9pZCB0ZXJtaW5hdGUoKTsKKworCQl2aXJ0dWFsIHZvaWQgc3RhcnRTY2VuZSgpIHt9OyAgIC8vIEZJWE1FOiBSZW1vdmUgd2hlbiBDaHJvbWUgbm8gbG9uZ2VyIGNhbGxzIGdldERldmljZSgpIGRpcmVjdGx5CisJCXZpcnR1YWwgdm9pZCBlbmRTY2VuZSgpIHt9OyAgICAgLy8gRklYTUU6IFJlbW92ZSB3aGVuIENocm9tZSBubyBsb25nZXIgY2FsbHMgZ2V0RGV2aWNlKCkgZGlyZWN0bHkKKworCQlib29sIGdldENvbmZpZ3MoRUdMQ29uZmlnICpjb25maWdzLCBjb25zdCBFR0xpbnQgKmF0dHJpYkxpc3QsIEVHTGludCBjb25maWdTaXplLCBFR0xpbnQgKm51bUNvbmZpZyk7CisJCWJvb2wgZ2V0Q29uZmlnQXR0cmliKEVHTENvbmZpZyBjb25maWcsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCisJCUVHTFN1cmZhY2UgY3JlYXRlV2luZG93U3VyZmFjZShIV05EIHdpbmRvdywgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJMaXN0KTsKKwkJRUdMU3VyZmFjZSBjcmVhdGVPZmZzY3JlZW5TdXJmYWNlKEVHTENvbmZpZyBjb25maWcsIEhBTkRMRSBzaGFyZUhhbmRsZSwgY29uc3QgRUdMaW50ICphdHRyaWJMaXN0KTsKKwkJRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTENvbmZpZyBjb25maWdIYW5kbGUsIGNvbnN0IGdsOjpDb250ZXh0ICpzaGFyZUNvbnRleHQpOworCisJCXZvaWQgZGVzdHJveVN1cmZhY2UoZWdsOjpTdXJmYWNlICpzdXJmYWNlKTsKKwkJdm9pZCBkZXN0cm95Q29udGV4dChnbDo6Q29udGV4dCAqY29udGV4dCk7CisKKwkJYm9vbCBpc0luaXRpYWxpemVkKCkgY29uc3Q7CisJCWJvb2wgaXNWYWxpZENvbmZpZyhFR0xDb25maWcgY29uZmlnKTsKKwkJYm9vbCBpc1ZhbGlkQ29udGV4dChnbDo6Q29udGV4dCAqY29udGV4dCk7CisJCWJvb2wgaXNWYWxpZFN1cmZhY2UoZWdsOjpTdXJmYWNlICpzdXJmYWNlKTsKKwkJYm9vbCBoYXNFeGlzdGluZ1dpbmRvd1N1cmZhY2UoSFdORCB3aW5kb3cpOworCisJCUVHTGludCBnZXRNaW5Td2FwSW50ZXJ2YWwoKTsKKwkJRUdMaW50IGdldE1heFN3YXBJbnRlcnZhbCgpOworCisJCXZpcnR1YWwgZ2w6OkRldmljZSAqZ2V0RGV2aWNlQ2hyb21lKCkge3JldHVybiAwO307ICAgLy8gRklYTUU6IFJlbW92ZSB3aGVuIENocm9tZSBubyBsb25nZXIgY2FsbHMgZ2V0RGV2aWNlKCkgZGlyZWN0bHkKKwkJdmlydHVhbCBnbDo6RGV2aWNlICpnZXREZXZpY2UoKTsKKworCQljb25zdCBjaGFyICpnZXRFeHRlbnNpb25TdHJpbmcoKSBjb25zdDsKKworCXByaXZhdGU6CisJCURpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheUlkKTsKKworCQljb25zdCBFR0xOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5SWQ7CisJCWdsOjpEZXZpY2UgKm1EZXZpY2U7CisKKwkJRUdMaW50IG1NYXhTd2FwSW50ZXJ2YWw7CisJCUVHTGludCBtTWluU3dhcEludGVydmFsOworICAgIAorCQl0eXBlZGVmIHN0ZDo6c2V0PFN1cmZhY2UqPiBTdXJmYWNlU2V0OworCQlTdXJmYWNlU2V0IG1TdXJmYWNlU2V0OworCisJCUNvbmZpZ1NldCBtQ29uZmlnU2V0OworCisJCXR5cGVkZWYgc3RkOjpzZXQ8Z2w6OkNvbnRleHQqPiBDb250ZXh0U2V0OworCQlDb250ZXh0U2V0IG1Db250ZXh0U2V0OworCisJCWJvb2wgY3JlYXRlRGV2aWNlKCk7CisKKwkJdm9pZCBpbml0RXh0ZW5zaW9uU3RyaW5nKCk7CisJCXN0ZDo6c3RyaW5nIG1FeHRlbnNpb25TdHJpbmc7CisJfTsKK30KKworI2VuZGlmICAgLy8gSU5DTFVERV9ESVNQTEFZX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvU3VyZmFjZS5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvU3VyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0MGUxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9TdXJmYWNlLmNwcApAQCAtMCwwICsxLDM5NyBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gU3VyZmFjZS5jcHA6IEltcGxlbWVudHMgdGhlIGVnbDo6U3VyZmFjZSBjbGFzcywgcmVwcmVzZW50aW5nIGEgZHJhd2luZyBzdXJmYWNlCisvLyBzdWNoIGFzIHRoZSBjbGllbnQgYXJlYSBvZiBhIHdpbmRvdywgaW5jbHVkaW5nIGFueSBiYWNrIGJ1ZmZlcnMuCisvLyBJbXBsZW1lbnRzIEVHTFN1cmZhY2UgYW5kIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS4gW0VHTCAxLjRdIHNlY3Rpb24gMi4yIHBhZ2UgMy4KKworI2luY2x1ZGUgIlN1cmZhY2UuaCIKKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJEaXNwbGF5LmgiCisjaW5jbHVkZSAibGliR0xFU3YyL1RleHR1cmUuaCIKKyNpbmNsdWRlICJsaWJHTEVTdjIvRGV2aWNlLmhwcCIKKyNpbmNsdWRlICJjb21tb24vZGVidWcuaCIKKyNpbmNsdWRlICJNYWluL0ZyYW1lQnVmZmVyLmhwcCIKKworI2luY2x1ZGUgPGR3bWFwaS5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKK25hbWVzcGFjZSBlZ2wKK3sKKworU3VyZmFjZTo6U3VyZmFjZShEaXNwbGF5ICpkaXNwbGF5LCBjb25zdCBDb25maWcgKmNvbmZpZywgSFdORCB3aW5kb3cpIAorICAgIDogbURpc3BsYXkoZGlzcGxheSksIG1Db25maWcoY29uZmlnKSwgbVdpbmRvdyh3aW5kb3cpCit7CisgICAgZnJhbWVCdWZmZXIgPSAwOworCWJhY2tCdWZmZXIgPSAwOworCisgICAgbURlcHRoU3RlbmNpbCA9IE5VTEw7CisgICAgbVRleHR1cmUgPSBOVUxMOworICAgIG1UZXh0dXJlRm9ybWF0ID0gRUdMX05PX1RFWFRVUkU7CisgICAgbVRleHR1cmVUYXJnZXQgPSBFR0xfTk9fVEVYVFVSRTsKKworICAgIG1QaXhlbEFzcGVjdFJhdGlvID0gKEVHTGludCkoMS4wICogRUdMX0RJU1BMQVlfU0NBTElORyk7ICAgLy8gRklYTUU6IERldGVybWluZSBhY3R1YWwgcGl4ZWwgYXNwZWN0IHJhdGlvCisgICAgbVJlbmRlckJ1ZmZlciA9IEVHTF9CQUNLX0JVRkZFUjsKKyAgICBtU3dhcEJlaGF2aW9yID0gRUdMX0JVRkZFUl9QUkVTRVJWRUQ7CisgICAgbVN3YXBJbnRlcnZhbCA9IC0xOworICAgIHNldFN3YXBJbnRlcnZhbCgxKTsKKworICAgIHN1YmNsYXNzV2luZG93KCk7Cit9CisKK1N1cmZhY2U6OlN1cmZhY2UoRGlzcGxheSAqZGlzcGxheSwgY29uc3QgQ29uZmlnICpjb25maWcsIEVHTGludCB3aWR0aCwgRUdMaW50IGhlaWdodCwgRUdMZW51bSB0ZXh0dXJlRm9ybWF0LCBFR0xlbnVtIHRleHR1cmVUeXBlKQorICAgIDogbURpc3BsYXkoZGlzcGxheSksIG1XaW5kb3coTlVMTCksIG1Db25maWcoY29uZmlnKSwgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpCit7CisJZnJhbWVCdWZmZXIgPSAwOworCWJhY2tCdWZmZXIgPSAwOworCisgICAgbURlcHRoU3RlbmNpbCA9IE5VTEw7CisgICAgbVdpbmRvd1N1YmNsYXNzZWQgPSBmYWxzZTsKKyAgICBtVGV4dHVyZSA9IE5VTEw7CisgICAgbVRleHR1cmVGb3JtYXQgPSB0ZXh0dXJlRm9ybWF0OworICAgIG1UZXh0dXJlVGFyZ2V0ID0gdGV4dHVyZVR5cGU7CisKKyAgICBtUGl4ZWxBc3BlY3RSYXRpbyA9IChFR0xpbnQpKDEuMCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpOyAgIC8vIEZJWE1FOiBEZXRlcm1pbmUgYWN0dWFsIHBpeGVsIGFzcGVjdCByYXRpbworICAgIG1SZW5kZXJCdWZmZXIgPSBFR0xfQkFDS19CVUZGRVI7CisgICAgbVN3YXBCZWhhdmlvciA9IEVHTF9CVUZGRVJfUFJFU0VSVkVEOworICAgIG1Td2FwSW50ZXJ2YWwgPSAtMTsKKyAgICBzZXRTd2FwSW50ZXJ2YWwoMSk7Cit9CisKK1N1cmZhY2U6On5TdXJmYWNlKCkKK3sKKyAgICB1bnN1YmNsYXNzV2luZG93KCk7CisgICAgcmVsZWFzZSgpOworfQorCitib29sIFN1cmZhY2U6OmluaXRpYWxpemUoKQoreworICAgIEFTU0VSVCghZnJhbWVCdWZmZXIgJiYgIWJhY2tCdWZmZXIgJiYgIW1EZXB0aFN0ZW5jaWwpOworCisgICAgaWYoIXJlc2V0KCkpCisJeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisgICAgLy8gTW9kaWZ5IHByZXNlbnQgcGFyYW1ldGVycyBmb3IgdGhpcyB3aW5kb3csIGlmIHdlIGFyZSBjb21wb3NpdGVkLAorICAgIC8vIHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2YgcXVldWluZyBkb25lIGJ5IERXTSBiZXR3ZWVuIG91ciBjYWxscyB0bworICAgIC8vIHByZXNlbnQgYW5kIHRoZSBhY3R1YWwgc2NyZWVuLgorICAgIGlmKG1XaW5kb3cgJiYgKExPV09SRChHZXRWZXJzaW9uKCkpID49IDB4NjApKQorCXsKKyAgICAgICAgQk9PTCBpc0NvbXBvc2l0ZWQ7CisgICAgICAgIEhSRVNVTFQgcmVzdWx0ID0gRHdtSXNDb21wb3NpdGlvbkVuYWJsZWQoJmlzQ29tcG9zaXRlZCk7CisKKyAgICAgICAgaWYoU1VDQ0VFREVEKHJlc3VsdCkgJiYgaXNDb21wb3NpdGVkKQorCSAgICB7CisJCQlEV01fUFJFU0VOVF9QQVJBTUVURVJTIHByZXNlbnRQYXJhbXMgPSB7MH07CisgICAgICAgICAgICBwcmVzZW50UGFyYW1zLmNiU2l6ZSA9IHNpemVvZihEV01fUFJFU0VOVF9QQVJBTUVURVJTKTsKKyAgICAgICAgICAgIHByZXNlbnRQYXJhbXMuY0J1ZmZlciA9IDI7CisKKyAgICAgICAgICAgIHJlc3VsdCA9IER3bVNldFByZXNlbnRQYXJhbWV0ZXJzKG1XaW5kb3csICZwcmVzZW50UGFyYW1zKTsKKyAgICAgICAgICAgIAorCQkJaWYoRkFJTEVEKHJlc3VsdCkpCisJCQl7CisJCQkJRVJSKCJVbmFibGUgdG8gc2V0IHByZXNlbnQgcGFyYW1ldGVyczogJTA4MVgiLCByZXN1bHQpOworCQkJfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU3VyZmFjZTo6cmVsZWFzZSgpCit7CQorICAgIGlmKG1EZXB0aFN0ZW5jaWwpCisgICAgeworICAgICAgICBtRGVwdGhTdGVuY2lsLT5yZWxlYXNlKCk7CisgICAgICAgIG1EZXB0aFN0ZW5jaWwgPSBOVUxMOworICAgIH0KKworICAgIGlmKG1UZXh0dXJlKQorICAgIHsKKyAgICAgICAgbVRleHR1cmUtPnJlbGVhc2VUZXhJbWFnZSgpOworICAgICAgICBtVGV4dHVyZSA9IE5VTEw7CisgICAgfQorCisJaWYoYmFja0J1ZmZlcikKKwl7CisJCWJhY2tCdWZmZXItPnVuYmluZCgpOworCQliYWNrQnVmZmVyID0gMDsKKwl9CisKKwlkZWxldGUgZnJhbWVCdWZmZXI7CisJZnJhbWVCdWZmZXIgPSAwOworfQorCitib29sIFN1cmZhY2U6OnJlc2V0KCkKK3sKKyAgICBpZighbVdpbmRvdykKKyAgICB7CisgICAgICAgIHJldHVybiByZXNldChtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKworICAgIFJFQ1Qgd2luZG93UmVjdDsKKyAgICBpZighR2V0Q2xpZW50UmVjdChtV2luZG93LCAmd2luZG93UmVjdCkpCisgICAgeworICAgICAgICBBU1NFUlQoZmFsc2UpOworCisgICAgICAgIEVSUigiQ291bGQgbm90IHJldHJpZXZlIHRoZSB3aW5kb3cgZGltZW5zaW9ucyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHJlc2V0KHdpbmRvd1JlY3QucmlnaHQgLSB3aW5kb3dSZWN0LmxlZnQsIHdpbmRvd1JlY3QuYm90dG9tIC0gd2luZG93UmVjdC50b3ApOworfQorCitib29sIFN1cmZhY2U6OnJlc2V0KGludCBiYWNrQnVmZmVyV2lkdGgsIGludCBiYWNrQnVmZmVySGVpZ2h0KQoreworICAgIGdsOjpEZXZpY2UgKmRldmljZSA9IG1EaXNwbGF5LT5nZXREZXZpY2UoKTsKKworICAgIGlmKGRldmljZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJlbGVhc2UoKTsKKworICAgIGlmKG1XaW5kb3cpCisgICAgeworCQlmcmFtZUJ1ZmZlciA9IGNyZWF0ZUZyYW1lQnVmZmVyKDAsIGJhY2tCdWZmZXJXaWR0aCwgYmFja0J1ZmZlckhlaWdodCwgZmFsc2UpOworCisJCWlmKCFmcmFtZUJ1ZmZlcikKKwkJeworCQkJRVJSKCJDb3VsZCBub3QgY3JlYXRlIGZyYW1lIGJ1ZmZlciIpOworCQkJcmVsZWFzZSgpOworCQkJcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIGZhbHNlKTsKKwkJfQorCisJCUludmFsaWRhdGVSZWN0KG1XaW5kb3csIE5VTEwsIEZBTFNFKTsKKyAgICB9CisKKwliYWNrQnVmZmVyID0gY3JlYXRlQmFja0J1ZmZlcihiYWNrQnVmZmVyV2lkdGgsIGJhY2tCdWZmZXJIZWlnaHQsIG1Db25maWcpOworCQkKKwlpZihiYWNrQnVmZmVyKQorCXsKKwkJYmFja0J1ZmZlci0+YmluZCgpOworCX0KKworICAgIGlmKCFiYWNrQnVmZmVyKQorICAgIHsKKyAgICAgICAgRVJSKCJDb3VsZCBub3QgY3JlYXRlIGJhY2sgYnVmZmVyIik7CisgICAgICAgIHJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZihtQ29uZmlnLT5tRGVwdGhTdGVuY2lsRm9ybWF0ICE9IHN3OjpGT1JNQVRfTlVMTCkKKyAgICB7CisgICAgICAgIG1EZXB0aFN0ZW5jaWwgPSBkZXZpY2UtPmNyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UoYmFja0J1ZmZlcldpZHRoLCBiYWNrQnVmZmVySGVpZ2h0LCBtQ29uZmlnLT5tRGVwdGhTdGVuY2lsRm9ybWF0LCAxLCBmYWxzZSk7CisKKwkJaWYoIW1EZXB0aFN0ZW5jaWwpCisJCXsKKwkJCUVSUigiQ291bGQgbm90IGNyZWF0ZSBkZXB0aC9zdGVuY2lsIGJ1ZmZlciBmb3Igc3VyZmFjZSIpOworCQkJcmVsZWFzZSgpOworCQkJcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIGZhbHNlKTsKKwkJfQorICAgIH0KKworICAgIG1XaWR0aCA9IGJhY2tCdWZmZXJXaWR0aDsKKyAgICBtSGVpZ2h0ID0gYmFja0J1ZmZlckhlaWdodDsKKworICAgIHJldHVybiB0cnVlOworfQorCitIV05EIFN1cmZhY2U6OmdldFdpbmRvd0hhbmRsZSgpCit7CisgICAgcmV0dXJuIG1XaW5kb3c7Cit9CisKKyNkZWZpbmUga1N1cmZhY2VQcm9wZXJ0eSBfVEVYVCgiRWdsOjpTdXJmYWNlT3duZXIiKQorI2RlZmluZSBrUGFyZW50V25kUHJvYyBfVEVYVCgiRWdsOjpTdXJmYWNlUGFyZW50V25kUHJvYyIpCisKK3N0YXRpYyBMUkVTVUxUIENBTExCQUNLIFN1cmZhY2VXaW5kb3dQcm9jKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd3BhcmFtLCBMUEFSQU0gbHBhcmFtKQoreworCWlmKG1lc3NhZ2UgPT0gV01fU0laRSkKKwl7CisJCVN1cmZhY2UgKnN1cmZhY2UgPSByZWludGVycHJldF9jYXN0PFN1cmZhY2UqPihHZXRQcm9wKGh3bmQsIGtTdXJmYWNlUHJvcGVydHkpKTsKKwkJCisJCWlmKHN1cmZhY2UpCisJCXsKKwkJCXN1cmZhY2UtPmNoZWNrRm9yUmVzaXplKCk7CisJCX0KKwl9CisKKwlXTkRQUk9DIHByZXZXbmRGdW5jID0gcmVpbnRlcnByZXRfY2FzdDxXTkRQUk9DPihHZXRQcm9wKGh3bmQsIGtQYXJlbnRXbmRQcm9jKSk7CisKKwlyZXR1cm4gQ2FsbFdpbmRvd1Byb2MocHJldlduZEZ1bmMsIGh3bmQsIG1lc3NhZ2UsIHdwYXJhbSwgbHBhcmFtKTsKK30KKwordm9pZCBTdXJmYWNlOjpzdWJjbGFzc1dpbmRvdygpCit7CisJaWYoIW1XaW5kb3cpCisJeworCQlyZXR1cm47CisJfQorCisJRFdPUkQgcHJvY2Vzc0lkOworCURXT1JEIHRocmVhZElkID0gR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkKG1XaW5kb3csICZwcm9jZXNzSWQpOworCWlmIChwcm9jZXNzSWQgIT0gR2V0Q3VycmVudFByb2Nlc3NJZCgpIHx8IHRocmVhZElkICE9IEdldEN1cnJlbnRUaHJlYWRJZCgpKQorCXsKKwkJcmV0dXJuOworCX0KKworCVNldExhc3RFcnJvcigwKTsKKwlMT05HIG9sZFduZFByb2MgPSBTZXRXaW5kb3dMb25nKG1XaW5kb3csIEdXTF9XTkRQUk9DLCByZWludGVycHJldF9jYXN0PExPTkc+KFN1cmZhY2VXaW5kb3dQcm9jKSk7CisKKwlpZihvbGRXbmRQcm9jID09IDAgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfU1VDQ0VTUykKKwl7CisJCW1XaW5kb3dTdWJjbGFzc2VkID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwlTZXRQcm9wKG1XaW5kb3csIGtTdXJmYWNlUHJvcGVydHksIHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPih0aGlzKSk7CisJU2V0UHJvcChtV2luZG93LCBrUGFyZW50V25kUHJvYywgcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KG9sZFduZFByb2MpKTsKKwltV2luZG93U3ViY2xhc3NlZCA9IHRydWU7Cit9CisKK3ZvaWQgU3VyZmFjZTo6dW5zdWJjbGFzc1dpbmRvdygpCit7CisJaWYoIW1XaW5kb3dTdWJjbGFzc2VkKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIHVuLXN1YmNsYXNzCisJTE9ORyBwYXJlbnRXbmRGdW5jID0gcmVpbnRlcnByZXRfY2FzdDxMT05HPihHZXRQcm9wKG1XaW5kb3csIGtQYXJlbnRXbmRQcm9jKSk7CisKKwkvLyBDaGVjayB0aGUgd2luZG93cHJvYyBpcyBzdGlsbCBTdXJmYWNlV2luZG93UHJvYy4KKwkvLyBJZiB0aGlzIGFzc2VydCBmYWlscywgdGhlbiBpdCBpcyBsaWtlbHkgdGhlIGFwcGxpY2F0aW9uIGhhcyBzdWJjbGFzc2VkIHRoZQorCS8vIGh3bmQgYXMgd2VsbCBhbmQgZGlkIG5vdCB1bnN1YmNsYXNzIGJlZm9yZSBkZXN0cm95aW5nIGl0cyBFR0wgY29udGV4dC4gVGhlCisJLy8gYXBwbGljYXRpb24gc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGVpdGhlciBzdWJjbGFzcyBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZQorCS8vIEVHTCBjb250ZXh0LCBvciB0byB1bnN1YmNsYXNzIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBFR0wgY29udGV4dC4KKwlpZihwYXJlbnRXbmRGdW5jKQorCXsKKwkJTE9ORyBwcmV2V25kRnVuYyA9IFNldFdpbmRvd0xvbmcobVdpbmRvdywgR1dMX1dORFBST0MsIHBhcmVudFduZEZ1bmMpOworCQlBU1NFUlQocHJldlduZEZ1bmMgPT0gcmVpbnRlcnByZXRfY2FzdDxMT05HPihTdXJmYWNlV2luZG93UHJvYykpOworCX0KKworCVJlbW92ZVByb3AobVdpbmRvdywga1N1cmZhY2VQcm9wZXJ0eSk7CisJUmVtb3ZlUHJvcChtV2luZG93LCBrUGFyZW50V25kUHJvYyk7CisJbVdpbmRvd1N1YmNsYXNzZWQgPSBmYWxzZTsKK30KKworYm9vbCBTdXJmYWNlOjpjaGVja0ZvclJlc2l6ZSgpCit7CisgICAgUkVDVCBjbGllbnQ7CisgICAgaWYoIUdldENsaWVudFJlY3QobVdpbmRvdywgJmNsaWVudCkpCisgICAgeworICAgICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gR3JvdyB0aGUgYnVmZmVyIG5vdywgaWYgdGhlIHdpbmRvdyBoYXMgZ3Jvd24uIFdlIG5lZWQgdG8gZ3JvdyBub3cgdG8gYXZvaWQgbG9zaW5nIGluZm9ybWF0aW9uLgorICAgIGludCBjbGllbnRXaWR0aCA9IGNsaWVudC5yaWdodCAtIGNsaWVudC5sZWZ0OworICAgIGludCBjbGllbnRIZWlnaHQgPSBjbGllbnQuYm90dG9tIC0gY2xpZW50LnRvcDsKKyAgICBib29sIHNpemVEaXJ0eSA9IGNsaWVudFdpZHRoICE9IGdldFdpZHRoKCkgfHwgY2xpZW50SGVpZ2h0ICE9IGdldEhlaWdodCgpOworCisgICAgaWYoc2l6ZURpcnR5KQorICAgIHsKKyAgICAgICAgcmVzZXQoY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodCk7CisKKyAgICAgICAgaWYoc3RhdGljX2Nhc3Q8ZWdsOjpTdXJmYWNlKj4oZ2V0Q3VycmVudERyYXdTdXJmYWNlKCkpID09IHRoaXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsTWFrZUN1cnJlbnQoZ2xHZXRDdXJyZW50Q29udGV4dCgpLCBzdGF0aWNfY2FzdDxlZ2w6OkRpc3BsYXkqPihnZXRDdXJyZW50RGlzcGxheSgpKSwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU3VyZmFjZTo6c3dhcCgpCit7CisgICAgI2lmIFBFUkZfUFJPRklMRQorCQlwcm9maWxlci5uZXh0RnJhbWUoKTsKKwkjZW5kaWYKKworCWlmKGJhY2tCdWZmZXIpCisgICAgeworCQlib29sIEhEUiA9IGJhY2tCdWZmZXItPmdldEludGVybmFsRm9ybWF0KCkgPT0gc3c6OkZPUk1BVF9BMTZCMTZHMTZSMTY7CisJCXZvaWQgKnNvdXJjZSA9IGJhY2tCdWZmZXItPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19SRUFET05MWSwgc3c6OlBVQkxJQyk7CisJCWZyYW1lQnVmZmVyLT5mbGlwKG1XaW5kb3csIHNvdXJjZSwgSERSKTsKKwkJYmFja0J1ZmZlci0+dW5sb2NrSW50ZXJuYWwoKTsKKwkKKwkgICAgY2hlY2tGb3JSZXNpemUoKTsKKwl9Cit9CisKK0VHTGludCBTdXJmYWNlOjpnZXRXaWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1XaWR0aDsKK30KKworRUdMaW50IFN1cmZhY2U6OmdldEhlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1IZWlnaHQ7Cit9CisKK2dsOjpJbWFnZSAqU3VyZmFjZTo6Z2V0UmVuZGVyVGFyZ2V0KCkKK3sKKyAgICBpZihiYWNrQnVmZmVyKQorICAgIHsKKyAgICAgICAgYmFja0J1ZmZlci0+YWRkUmVmKCk7CisgICAgfQorCisgICAgcmV0dXJuIGJhY2tCdWZmZXI7Cit9CisKK2dsOjpJbWFnZSAqU3VyZmFjZTo6Z2V0RGVwdGhTdGVuY2lsKCkKK3sKKyAgICBpZihtRGVwdGhTdGVuY2lsKQorICAgIHsKKyAgICAgICAgbURlcHRoU3RlbmNpbC0+YWRkUmVmKCk7CisgICAgfQorCisgICAgcmV0dXJuIG1EZXB0aFN0ZW5jaWw7Cit9CisKK3ZvaWQgU3VyZmFjZTo6c2V0U3dhcEludGVydmFsKEVHTGludCBpbnRlcnZhbCkKK3sKKyAgICBpZihtU3dhcEludGVydmFsID09IGludGVydmFsKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBtU3dhcEludGVydmFsID0gaW50ZXJ2YWw7CisgICAgbVN3YXBJbnRlcnZhbCA9IHN0ZDo6bWF4KG1Td2FwSW50ZXJ2YWwsIG1EaXNwbGF5LT5nZXRNaW5Td2FwSW50ZXJ2YWwoKSk7CisgICAgbVN3YXBJbnRlcnZhbCA9IHN0ZDo6bWluKG1Td2FwSW50ZXJ2YWwsIG1EaXNwbGF5LT5nZXRNYXhTd2FwSW50ZXJ2YWwoKSk7Cit9CisKK0VHTGVudW0gU3VyZmFjZTo6Z2V0VGV4dHVyZUZvcm1hdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1UZXh0dXJlRm9ybWF0OworfQorCitFR0xlbnVtIFN1cmZhY2U6OmdldFRleHR1cmVUYXJnZXQoKSBjb25zdAoreworICAgIHJldHVybiBtVGV4dHVyZVRhcmdldDsKK30KKwordm9pZCBTdXJmYWNlOjpzZXRCb3VuZFRleHR1cmUoZ2w6OlRleHR1cmUyRCAqdGV4dHVyZSkKK3sKKyAgICBtVGV4dHVyZSA9IHRleHR1cmU7Cit9CisKK2dsOjpUZXh0dXJlMkQgKlN1cmZhY2U6OmdldEJvdW5kVGV4dHVyZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1UZXh0dXJlOworfQorCitzdzo6Rm9ybWF0IFN1cmZhY2U6OmdldEludGVybmFsRm9ybWF0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUNvbmZpZy0+bVJlbmRlclRhcmdldEZvcm1hdDsKK30KK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9TdXJmYWNlLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvU3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZmYxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvU3VyZmFjZS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIFN1cmZhY2UuaDogRGVmaW5lcyB0aGUgZWdsOjpTdXJmYWNlIGNsYXNzLCByZXByZXNlbnRpbmcgYSBkcmF3aW5nIHN1cmZhY2UKKy8vIHN1Y2ggYXMgdGhlIGNsaWVudCBhcmVhIG9mIGEgd2luZG93LCBpbmNsdWRpbmcgYW55IGJhY2sgYnVmZmVycy4KKy8vIEltcGxlbWVudHMgRUdMU3VyZmFjZSBhbmQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LiBbRUdMIDEuNF0gc2VjdGlvbiAyLjIgcGFnZSAzLgorCisjaWZuZGVmIElOQ0xVREVfU1VSRkFDRV9IXworI2RlZmluZSBJTkNMVURFX1NVUkZBQ0VfSF8KKworI2luY2x1ZGUgImxpYkdMRVN2Mi9JbWFnZS5ocHAiCisjaW5jbHVkZSAibGliR0xFU3YyL1RleHR1cmUuaCIKKyNpbmNsdWRlICJjb21tb24vYW5nbGV1dGlscy5oIgorI2luY2x1ZGUgIk1haW4vRnJhbWVCdWZmZXIuaHBwIgorCisjZGVmaW5lIEVHTEFQSQorI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworbmFtZXNwYWNlIGdsCit7CitjbGFzcyBJbWFnZTsKK2NsYXNzIFRleHR1cmUyRDsKK30KKworbmFtZXNwYWNlIGVnbAoreworY2xhc3MgRGlzcGxheTsKK2NsYXNzIENvbmZpZzsKKworY2xhc3MgU3VyZmFjZQoreworcHVibGljOgorICAgIFN1cmZhY2UoRGlzcGxheSAqZGlzcGxheSwgY29uc3QgZWdsOjpDb25maWcgKmNvbmZpZywgSFdORCB3aW5kb3cpOworICAgIFN1cmZhY2UoRGlzcGxheSAqZGlzcGxheSwgY29uc3QgZWdsOjpDb25maWcgKmNvbmZpZywgRUdMaW50IHdpZHRoLCBFR0xpbnQgaGVpZ2h0LCBFR0xlbnVtIHRleHR1cmVGb3JtYXQsIEVHTGVudW0gdGV4dHVyZVRhcmdldCk7CisKKyAgICB+U3VyZmFjZSgpOworCisJYm9vbCBpbml0aWFsaXplKCk7CisgICAgdm9pZCBzd2FwKCk7CisKKwlIV05EIGdldFdpbmRvd0hhbmRsZSgpOworICAgIHZpcnR1YWwgRUdMaW50IGdldFdpZHRoKCkgY29uc3Q7CisgICAgdmlydHVhbCBFR0xpbnQgZ2V0SGVpZ2h0KCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGdsOjpJbWFnZSAqZ2V0UmVuZGVyVGFyZ2V0KCk7CisgICAgdmlydHVhbCBnbDo6SW1hZ2UgKmdldERlcHRoU3RlbmNpbCgpOworCisgICAgdm9pZCBzZXRTd2FwSW50ZXJ2YWwoRUdMaW50IGludGVydmFsKTsKKyAgICBib29sIGNoZWNrRm9yUmVzaXplKCk7ICAgLy8gUmV0dXJucyB0cnVlIGlmIHN1cmZhY2UgY2hhbmdlZCBkdWUgdG8gcmVzaXplIG9yIGludGVydmFsIHVwZGF0ZQorCisgICAgdmlydHVhbCBFR0xlbnVtIGdldFRleHR1cmVGb3JtYXQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIEVHTGVudW0gZ2V0VGV4dHVyZVRhcmdldCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3c6OkZvcm1hdCBnZXRJbnRlcm5hbEZvcm1hdCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldEJvdW5kVGV4dHVyZShnbDo6VGV4dHVyZTJEICp0ZXh0dXJlKTsKKyAgICB2aXJ0dWFsIGdsOjpUZXh0dXJlMkQgKmdldEJvdW5kVGV4dHVyZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHZvaWQgcmVsZWFzZSgpOworICAgIGJvb2wgcmVzZXQoKTsKKworICAgIERpc3BsYXkgKmNvbnN0IG1EaXNwbGF5OworICAgIGdsOjpJbWFnZSAqbURlcHRoU3RlbmNpbDsKKwlzdzo6RnJhbWVCdWZmZXIgKmZyYW1lQnVmZmVyOworCWdsOjpJbWFnZSAqYmFja0J1ZmZlcjsKKworICAgIHZvaWQgc3ViY2xhc3NXaW5kb3coKTsKKyAgICB2b2lkIHVuc3ViY2xhc3NXaW5kb3coKTsKKyAgICBib29sIHJlc2V0KGludCBiYWNrYnVmZmVyV2lkdGgsIGludCBiYWNrYnVmZmVySGVpZ2h0KTsKKworICAgIGNvbnN0IEhXTkQgbVdpbmRvdzsgICAgICAgICAgICAvLyBXaW5kb3cgdGhhdCB0aGUgc3VyZmFjZSBpcyBjcmVhdGVkIGZvci4KKyAgICBib29sIG1XaW5kb3dTdWJjbGFzc2VkOyAgICAgICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgd2Ugc3VjY2Vzc2Z1bGx5IHN1YmNsYXNzZWQgbVdpbmRvdyBmb3IgV01fUkVTSVpFIGhvb2tpbmcKKyAgICBjb25zdCBlZ2w6OkNvbmZpZyAqbUNvbmZpZzsgICAgLy8gRUdMIGNvbmZpZyBzdXJmYWNlIHdhcyBjcmVhdGVkIHdpdGgKKyAgICBFR0xpbnQgbUhlaWdodDsgICAgICAgICAgICAgICAgLy8gSGVpZ2h0IG9mIHN1cmZhY2UKKyAgICBFR0xpbnQgbVdpZHRoOyAgICAgICAgICAgICAgICAgLy8gV2lkdGggb2Ygc3VyZmFjZQorLy8gIEVHTGludCBob3Jpem9udGFsUmVzb2x1dGlvbjsgICAvLyBIb3Jpem9udGFsIGRvdCBwaXRjaAorLy8gIEVHTGludCB2ZXJ0aWNhbFJlc29sdXRpb247ICAgICAvLyBWZXJ0aWNhbCBkb3QgcGl0Y2gKKy8vICBFR0xCb29sZWFuIGxhcmdlc3RQQnVmZmVyOyAgICAgLy8gSWYgdHJ1ZSwgY3JlYXRlIGxhcmdlc3QgcGJ1ZmZlciBwb3NzaWJsZQorLy8gIEVHTEJvb2xlYW4gbWlwbWFwVGV4dHVyZTsgICAgICAvLyBUcnVlIGlmIHRleHR1cmUgaGFzIG1pcG1hcHMKKy8vICBFR0xpbnQgbWlwbWFwTGV2ZWw7ICAgICAgICAgICAgLy8gTWlwbWFwIGxldmVsIHRvIHJlbmRlciB0bworLy8gIEVHTGVudW0gbXVsdGlzYW1wbGVSZXNvbHZlOyAgICAvLyBNdWx0aXNhbXBsZSByZXNvbHZlIGJlaGF2aW9yCisgICAgRUdMaW50IG1QaXhlbEFzcGVjdFJhdGlvOyAgICAgIC8vIERpc3BsYXkgYXNwZWN0IHJhdGlvCisgICAgRUdMZW51bSBtUmVuZGVyQnVmZmVyOyAgICAgICAgIC8vIFJlbmRlciBidWZmZXIKKyAgICBFR0xlbnVtIG1Td2FwQmVoYXZpb3I7ICAgICAgICAgLy8gQnVmZmVyIHN3YXAgYmVoYXZpb3IKKyAgICBFR0xlbnVtIG1UZXh0dXJlRm9ybWF0OyAgICAgICAgLy8gRm9ybWF0IG9mIHRleHR1cmU6IFJHQiwgUkdCQSwgb3Igbm8gdGV4dHVyZQorICAgIEVHTGVudW0gbVRleHR1cmVUYXJnZXQ7ICAgICAgICAvLyBUeXBlIG9mIHRleHR1cmU6IDJEIG9yIG5vIHRleHR1cmUKKy8vICBFR0xlbnVtIHZnQWxwaGFGb3JtYXQ7ICAgICAgICAgLy8gQWxwaGEgZm9ybWF0IGZvciBPcGVuVkcKKy8vICBFR0xlbnVtIHZnQ29sb3JTcGFjZTsgICAgICAgICAgLy8gQ29sb3Igc3BhY2UgZm9yIE9wZW5WRworICAgIEVHTGludCBtU3dhcEludGVydmFsOworICAgIGdsOjpUZXh0dXJlMkQgKm1UZXh0dXJlOworfTsKK30KKworI2VuZGlmICAgLy8gSU5DTFVERV9TVVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvbGliRUdMLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9saWJFR0wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWU1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvbGliRUdMLmNwcApAQCAtMCwwICsxLDEwOTcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIGxpYkVHTC5jcHA6IEltcGxlbWVudHMgdGhlIGV4cG9ydGVkIEVHTCBmdW5jdGlvbnMuCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiRGlzcGxheS5oIgorI2luY2x1ZGUgImxpYkdMRVN2Mi9Db250ZXh0LmgiCisjaW5jbHVkZSAibGliR0xFU3YyL1RleHR1cmUuaCIKKyNpbmNsdWRlICJjb21tb24vZGVidWcuaCIKKyNpbmNsdWRlICJjb21tb24vdmVyc2lvbi5oIgorCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorCitib29sIHZhbGlkYXRlRGlzcGxheShlZ2w6OkRpc3BsYXkgKmRpc3BsYXkpCit7CisgICAgaWYoZGlzcGxheSA9PSBFR0xfTk9fRElTUExBWSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0RJU1BMQVksIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZighZGlzcGxheS0+aXNJbml0aWFsaXplZCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9OT1RfSU5JVElBTElaRUQsIGZhbHNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCB2YWxpZGF0ZUNvbmZpZyhlZ2w6OkRpc3BsYXkgKmRpc3BsYXksIEVHTENvbmZpZyBjb25maWcpCit7CisgICAgaWYoIXZhbGlkYXRlRGlzcGxheShkaXNwbGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZighZGlzcGxheS0+aXNWYWxpZENvbmZpZyhjb25maWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQ09ORklHLCBmYWxzZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgdmFsaWRhdGVDb250ZXh0KGVnbDo6RGlzcGxheSAqZGlzcGxheSwgZ2w6OkNvbnRleHQgKmNvbnRleHQpCit7CisgICAgaWYoIXZhbGlkYXRlRGlzcGxheShkaXNwbGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZighZGlzcGxheS0+aXNWYWxpZENvbnRleHQoY29udGV4dCkpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9DT05URVhULCBmYWxzZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgdmFsaWRhdGVTdXJmYWNlKGVnbDo6RGlzcGxheSAqZGlzcGxheSwgZWdsOjpTdXJmYWNlICpzdXJmYWNlKQoreworICAgIGlmKCF2YWxpZGF0ZURpc3BsYXkoZGlzcGxheSkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYoIWRpc3BsYXktPmlzVmFsaWRTdXJmYWNlKHN1cmZhY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfU1VSRkFDRSwgZmFsc2UpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiCit7CitFR0xpbnQgX19zdGRjYWxsIGVnbEdldEVycm9yKHZvaWQpCit7CisgICAgVFJBQ0UoIigpIik7CisKKyAgICBFR0xpbnQgZXJyb3IgPSBlZ2w6OmdldEN1cnJlbnRFcnJvcigpOworCisgICAgaWYoZXJyb3IgIT0gRUdMX1NVQ0NFU1MpCisgICAgeworICAgICAgICBlZ2w6OnNldEN1cnJlbnRFcnJvcihFR0xfU1VDQ0VTUyk7CisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworfQorCitFR0xEaXNwbGF5IF9fc3RkY2FsbCBlZ2xHZXREaXNwbGF5KEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXlfaWQpCit7CisgICAgVFJBQ0UoIihFR0xOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5X2lkID0gMHglMC44cCkiLCBkaXNwbGF5X2lkKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVnbDo6RGlzcGxheTo6Z2V0RGlzcGxheShkaXNwbGF5X2lkKTsKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19ESVNQTEFZKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX05PX0RJU1BMQVk7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbEluaXRpYWxpemUoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpCit7CisgICAgVFJBQ0UoIihFR0xEaXNwbGF5IGRweSA9IDB4JTAuOHAsIEVHTGludCAqbWFqb3IgPSAweCUwLjhwLCBFR0xpbnQgKm1pbm9yID0gMHglMC44cCkiLAorICAgICAgICAgIGRweSwgbWFqb3IsIG1pbm9yKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoZHB5ID09IEVHTF9OT19ESVNQTEFZKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKworICAgICAgICBpZighZGlzcGxheS0+aW5pdGlhbGl6ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX05PVF9JTklUSUFMSVpFRCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKG1ham9yKSAqbWFqb3IgPSAxOworICAgICAgICBpZihtaW5vcikgKm1pbm9yID0gNDsKKworICAgICAgICByZXR1cm4gc3VjY2VzcyhFR0xfVFJVRSk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRweSkKK3sKKyAgICBUUkFDRSgiKEVHTERpc3BsYXkgZHB5ID0gMHglMC44cCkiLCBkcHkpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihkcHkgPT0gRUdMX05PX0RJU1BMQVkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBzdGF0aWNfY2FzdDxlZ2w6OkRpc3BsYXkqPihkcHkpOworCisgICAgICAgIGRpc3BsYXktPnRlcm1pbmF0ZSgpOworCisgICAgICAgIHJldHVybiBzdWNjZXNzKEVHTF9UUlVFKTsKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KKworY29uc3QgY2hhciAqX19zdGRjYWxsIGVnbFF1ZXJ5U3RyaW5nKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgbmFtZSkKK3sKKyAgICBUUkFDRSgiKEVHTERpc3BsYXkgZHB5ID0gMHglMC44cCwgRUdMaW50IG5hbWUgPSAlZCkiLCBkcHksIG5hbWUpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBzdGF0aWNfY2FzdDxlZ2w6OkRpc3BsYXkqPihkcHkpOworCisgICAgICAgIGlmKCF2YWxpZGF0ZURpc3BsYXkoZGlzcGxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChuYW1lKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBFR0xfQ0xJRU5UX0FQSVM6CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzcygiT3BlbkdMX0VTIik7CisgICAgICAgICAgY2FzZSBFR0xfRVhURU5TSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBkaXNwbGF5LT5nZXRFeHRlbnNpb25TdHJpbmcoKTsKKyAgICAgICAgICBjYXNlIEVHTF9WRU5ET1I6CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzcygiVHJhbnNHYW1pbmcgSW5jLiIpOworICAgICAgICAgIGNhc2UgRUdMX1ZFUlNJT046CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzcygiMS40IChBTkdMRSAiVkVSU0lPTl9TVFJJTkciKSIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCAoY29uc3QgY2hhciopTlVMTCk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCAoY29uc3QgY2hhciopTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbEdldENvbmZpZ3MoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpCit7CisgICAgVFJBQ0UoIihFR0xEaXNwbGF5IGRweSA9IDB4JTAuOHAsIEVHTENvbmZpZyAqY29uZmlncyA9IDB4JTAuOHAsICIKKyAgICAgICAgICAiRUdMaW50IGNvbmZpZ19zaXplID0gJWQsIEVHTGludCAqbnVtX2NvbmZpZyA9IDB4JTAuOHApIiwKKyAgICAgICAgICBkcHksIGNvbmZpZ3MsIGNvbmZpZ19zaXplLCBudW1fY29uZmlnKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKworICAgICAgICBpZighdmFsaWRhdGVEaXNwbGF5KGRpc3BsYXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYoIW51bV9jb25maWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEVHTGludCBhdHRyaWJMaXN0W10gPSAgICB7RUdMX05PTkV9OworCisgICAgICAgIGlmKCFkaXNwbGF5LT5nZXRDb25maWdzKGNvbmZpZ3MsIGF0dHJpYkxpc3QsIGNvbmZpZ19zaXplLCBudW1fY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoRUdMX1RSVUUpOworICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xCb29sZWFuIF9fc3RkY2FsbCBlZ2xDaG9vc2VDb25maWcoRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QsIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpCit7CisgICAgVFJBQ0UoIihFR0xEaXNwbGF5IGRweSA9IDB4JTAuOHAsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QgPSAweCUwLjhwLCAiCisgICAgICAgICAgIkVHTENvbmZpZyAqY29uZmlncyA9IDB4JTAuOHAsIEVHTGludCBjb25maWdfc2l6ZSA9ICVkLCBFR0xpbnQgKm51bV9jb25maWcgPSAweCUwLjhwKSIsCisgICAgICAgICAgZHB5LCBhdHRyaWJfbGlzdCwgY29uZmlncywgY29uZmlnX3NpemUsIG51bV9jb25maWcpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBzdGF0aWNfY2FzdDxlZ2w6OkRpc3BsYXkqPihkcHkpOworCisgICAgICAgIGlmKCF2YWxpZGF0ZURpc3BsYXkoZGlzcGxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZighbnVtX2NvbmZpZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgRUdMaW50IGF0dHJpYkxpc3RbXSA9ICAgIHtFR0xfTk9ORX07CisKKyAgICAgICAgaWYoIWF0dHJpYl9saXN0KQorICAgICAgICB7CisgICAgICAgICAgICBhdHRyaWJfbGlzdCA9IGF0dHJpYkxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBkaXNwbGF5LT5nZXRDb25maWdzKGNvbmZpZ3MsIGF0dHJpYl9saXN0LCBjb25maWdfc2l6ZSwgbnVtX2NvbmZpZyk7CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoRUdMX1RSVUUpOworICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xCb29sZWFuIF9fc3RkY2FsbCBlZ2xHZXRDb25maWdBdHRyaWIoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCit7CisgICAgVFJBQ0UoIihFR0xEaXNwbGF5IGRweSA9IDB4JTAuOHAsIEVHTENvbmZpZyBjb25maWcgPSAweCUwLjhwLCBFR0xpbnQgYXR0cmlidXRlID0gJWQsIEVHTGludCAqdmFsdWUgPSAweCUwLjhwKSIsCisgICAgICAgICAgZHB5LCBjb25maWcsIGF0dHJpYnV0ZSwgdmFsdWUpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBzdGF0aWNfY2FzdDxlZ2w6OkRpc3BsYXkqPihkcHkpOworCisgICAgICAgIGlmKCF2YWxpZGF0ZUNvbmZpZyhkaXNwbGF5LCBjb25maWcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYoIWRpc3BsYXktPmdldENvbmZpZ0F0dHJpYihjb25maWcsIGF0dHJpYnV0ZSwgdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9GQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VjY2VzcyhFR0xfVFJVRSk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTFN1cmZhY2UgX19zdGRjYWxsIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQoreworICAgIFRSQUNFKCIoRUdMRGlzcGxheSBkcHkgPSAweCUwLjhwLCBFR0xDb25maWcgY29uZmlnID0gMHglMC44cCwgRUdMTmF0aXZlV2luZG93VHlwZSB3aW4gPSAweCUwLjhwLCAiCisgICAgICAgICAgImNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QgPSAweCUwLjhwKSIsIGRweSwgY29uZmlnLCB3aW4sIGF0dHJpYl9saXN0KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKworICAgICAgICBpZighdmFsaWRhdGVDb25maWcoZGlzcGxheSwgY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworICAgICAgICB9CisKKyAgICAgICAgSFdORCB3aW5kb3cgPSAoSFdORCl3aW47CisKKyAgICAgICAgaWYoIUlzV2luZG93KHdpbmRvdykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX05BVElWRV9XSU5ET1csIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkaXNwbGF5LT5jcmVhdGVXaW5kb3dTdXJmYWNlKHdpbmRvdywgY29uZmlnLCBhdHRyaWJfbGlzdCk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfTk9fU1VSRkFDRSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworfQorCitFR0xTdXJmYWNlIF9fc3RkY2FsbCBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBUUkFDRSgiKEVHTERpc3BsYXkgZHB5ID0gMHglMC44cCwgRUdMQ29uZmlnIGNvbmZpZyA9IDB4JTAuOHAsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QgPSAweCUwLjhwKSIsCisgICAgICAgICAgZHB5LCBjb25maWcsIGF0dHJpYl9saXN0KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKworICAgICAgICBpZighdmFsaWRhdGVDb25maWcoZGlzcGxheSwgY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRpc3BsYXktPmNyZWF0ZU9mZnNjcmVlblN1cmZhY2UoY29uZmlnLCBOVUxMLCBhdHRyaWJfbGlzdCk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfTk9fU1VSRkFDRSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworfQorCitFR0xTdXJmYWNlIF9fc3RkY2FsbCBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBUUkFDRSgiKEVHTERpc3BsYXkgZHB5ID0gMHglMC44cCwgRUdMQ29uZmlnIGNvbmZpZyA9IDB4JTAuOHAsIEVHTE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwID0gMHglMC44cCwgIgorICAgICAgICAgICJjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0ID0gMHglMC44cCkiLCBkcHksIGNvbmZpZywgcGl4bWFwLCBhdHRyaWJfbGlzdCk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGVnbDo6RGlzcGxheSAqZGlzcGxheSA9IHN0YXRpY19jYXN0PGVnbDo6RGlzcGxheSo+KGRweSk7CisKKyAgICAgICAgaWYoIXZhbGlkYXRlQ29uZmlnKGRpc3BsYXksIGNvbmZpZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKKyAgICAgICAgfQorCisgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorCisgICAgICAgIHJldHVybiBzdWNjZXNzKEVHTF9OT19TVVJGQUNFKTsKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19TVVJGQUNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpCit7CisgICAgVFJBQ0UoIihFR0xEaXNwbGF5IGRweSA9IDB4JTAuOHAsIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IDB4JTAuOHApIiwgZHB5LCBzdXJmYWNlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKyAgICAgICAgZWdsOjpTdXJmYWNlICplZ2xTdXJmYWNlID0gc3RhdGljX2Nhc3Q8ZWdsOjpTdXJmYWNlKj4oc3VyZmFjZSk7CisKKyAgICAgICAgaWYoIXZhbGlkYXRlU3VyZmFjZShkaXNwbGF5LCBlZ2xTdXJmYWNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBkaXNwbGF5LT5kZXN0cm95U3VyZmFjZSgoZWdsOjpTdXJmYWNlKilzdXJmYWNlKTsKKworICAgICAgICByZXR1cm4gc3VjY2VzcyhFR0xfVFJVRSk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbFF1ZXJ5U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQoreworICAgIFRSQUNFKCIoRUdMRGlzcGxheSBkcHkgPSAweCUwLjhwLCBFR0xTdXJmYWNlIHN1cmZhY2UgPSAweCUwLjhwLCBFR0xpbnQgYXR0cmlidXRlID0gJWQsIEVHTGludCAqdmFsdWUgPSAweCUwLjhwKSIsCisgICAgICAgICAgZHB5LCBzdXJmYWNlLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKyAgICAgICAgZWdsOjpTdXJmYWNlICplZ2xTdXJmYWNlID0gKGVnbDo6U3VyZmFjZSopc3VyZmFjZTsKKworICAgICAgICBpZighdmFsaWRhdGVTdXJmYWNlKGRpc3BsYXksIGVnbFN1cmZhY2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBFR0xfVkdfQUxQSEFfRk9STUFUOgorICAgICAgICAgICAgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEVHTF9WR19DT0xPUlNQQUNFOgorICAgICAgICAgICAgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEVHTF9DT05GSUdfSUQ6CisgICAgICAgICAgICBVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRUdMX0hFSUdIVDoKKyAgICAgICAgICAgICp2YWx1ZSA9IGVnbFN1cmZhY2UtPmdldEhlaWdodCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBFR0xfSE9SSVpPTlRBTF9SRVNPTFVUSU9OOgorICAgICAgICAgICAgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEVHTF9MQVJHRVNUX1BCVUZGRVI6CisgICAgICAgICAgICBVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRUdMX01JUE1BUF9URVhUVVJFOgorICAgICAgICAgICAgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEVHTF9NSVBNQVBfTEVWRUw6CisgICAgICAgICAgICBVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRUdMX01VTFRJU0FNUExFX1JFU09MVkU6CisgICAgICAgICAgICBVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRUdMX1BJWEVMX0FTUEVDVF9SQVRJTzoKKyAgICAgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBFR0xfUkVOREVSX0JVRkZFUjoKKyAgICAgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBFR0xfU1dBUF9CRUhBVklPUjoKKyAgICAgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBFR0xfVEVYVFVSRV9GT1JNQVQ6CisgICAgICAgICAgICBVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRUdMX1RFWFRVUkVfVEFSR0VUOgorICAgICAgICAgICAgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEVHTF9WRVJUSUNBTF9SRVNPTFVUSU9OOgorICAgICAgICAgICAgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEVHTF9XSURUSDoKKyAgICAgICAgICAgICp2YWx1ZSA9IGVnbFN1cmZhY2UtPmdldFdpZHRoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoRUdMX1RSVUUpOworICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xCb29sZWFuIF9fc3RkY2FsbCBlZ2xCaW5kQVBJKEVHTGVudW0gYXBpKQoreworICAgIFRSQUNFKCIoRUdMZW51bSBhcGkgPSAweCVYKSIsIGFwaSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYXBpKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBFR0xfT1BFTkdMX0FQSToKKyAgICAgICAgICBjYXNlIEVHTF9PUEVOVkdfQVBJOgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOyAgIC8vIE5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgIGNhc2UgRUdMX09QRU5HTF9FU19BUEk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgZWdsOjpzZXRDdXJyZW50QVBJKGFwaSk7CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoRUdMX1RSVUUpOworICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xlbnVtIF9fc3RkY2FsbCBlZ2xRdWVyeUFQSSh2b2lkKQoreworICAgIFRSQUNFKCIoKSIpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBFR0xlbnVtIEFQSSA9IGVnbDo6Z2V0Q3VycmVudEFQSSgpOworCisgICAgICAgIHJldHVybiBzdWNjZXNzKEFQSSk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbFdhaXRDbGllbnQodm9pZCkKK3sKKyAgICBUUkFDRSgiKCkiKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FCisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoMCk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbFJlbGVhc2VUaHJlYWQodm9pZCkKK3sKKyAgICBUUkFDRSgiKCkiKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsTWFrZUN1cnJlbnQoRUdMX05PX0RJU1BMQVksIEVHTF9OT19DT05URVhULCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UpOworCisgICAgICAgIHJldHVybiBzdWNjZXNzKEVHTF9UUlVFKTsKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KKworRUdMU3VyZmFjZSBfX3N0ZGNhbGwgZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTGVudW0gYnVmdHlwZSwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBUUkFDRSgiKEVHTERpc3BsYXkgZHB5ID0gMHglMC44cCwgRUdMZW51bSBidWZ0eXBlID0gMHglWCwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciA9IDB4JTAuOHAsICIKKyAgICAgICAgICAiRUdMQ29uZmlnIGNvbmZpZyA9IDB4JTAuOHAsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QgPSAweCUwLjhwKSIsCisgICAgICAgICAgZHB5LCBidWZ0eXBlLCBidWZmZXIsIGNvbmZpZywgYXR0cmliX2xpc3QpOworCisJVU5JTVBMRU1FTlRFRCgpOworCisgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfTk9fU1VSRkFDRSk7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbFN1cmZhY2VBdHRyaWIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50IHZhbHVlKQoreworICAgIFRSQUNFKCIoRUdMRGlzcGxheSBkcHkgPSAweCUwLjhwLCBFR0xTdXJmYWNlIHN1cmZhY2UgPSAweCUwLjhwLCBFR0xpbnQgYXR0cmlidXRlID0gJWQsIEVHTGludCB2YWx1ZSA9ICVkKSIsCisgICAgICAgICAgZHB5LCBzdXJmYWNlLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKyAgICAgICAgZWdsOjpTdXJmYWNlICplZ2xTdXJmYWNlID0gc3RhdGljX2Nhc3Q8ZWdsOjpTdXJmYWNlKj4oc3VyZmFjZSk7CisKKyAgICAgICAgaWYoIXZhbGlkYXRlU3VyZmFjZShkaXNwbGF5LCBlZ2xTdXJmYWNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorCisgICAgICAgIHJldHVybiBzdWNjZXNzKEVHTF9UUlVFKTsKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KKworRUdMQm9vbGVhbiBfX3N0ZGNhbGwgZWdsQmluZFRleEltYWdlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpCit7CisgICAgVFJBQ0UoIihFR0xEaXNwbGF5IGRweSA9IDB4JTAuOHAsIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IDB4JTAuOHAsIEVHTGludCBidWZmZXIgPSAlZCkiLCBkcHksIHN1cmZhY2UsIGJ1ZmZlcik7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGVnbDo6RGlzcGxheSAqZGlzcGxheSA9IHN0YXRpY19jYXN0PGVnbDo6RGlzcGxheSo+KGRweSk7CisgICAgICAgIGVnbDo6U3VyZmFjZSAqZWdsU3VyZmFjZSA9IHN0YXRpY19jYXN0PGVnbDo6U3VyZmFjZSo+KHN1cmZhY2UpOworCisgICAgICAgIGlmKCF2YWxpZGF0ZVN1cmZhY2UoZGlzcGxheSwgZWdsU3VyZmFjZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZihidWZmZXIgIT0gRUdMX0JBQ0tfQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBpZihzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFIHx8IGVnbFN1cmZhY2UtPmdldFdpbmRvd0hhbmRsZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYoZWdsU3VyZmFjZS0+Z2V0Qm91bmRUZXh0dXJlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FDQ0VTUywgRUdMX0ZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGVnbFN1cmZhY2UtPmdldFRleHR1cmVGb3JtYXQoKSA9PSBFR0xfTk9fVEVYVFVSRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9GQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBnbEJpbmRUZXhJbWFnZShlZ2xTdXJmYWNlKTsKKworICAgICAgICByZXR1cm4gc3VjY2VzcyhFR0xfVFJVRSk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbFJlbGVhc2VUZXhJbWFnZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYnVmZmVyKQoreworICAgIFRSQUNFKCIoRUdMRGlzcGxheSBkcHkgPSAweCUwLjhwLCBFR0xTdXJmYWNlIHN1cmZhY2UgPSAweCUwLjhwLCBFR0xpbnQgYnVmZmVyID0gJWQpIiwgZHB5LCBzdXJmYWNlLCBidWZmZXIpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBzdGF0aWNfY2FzdDxlZ2w6OkRpc3BsYXkqPihkcHkpOworICAgICAgICBlZ2w6OlN1cmZhY2UgKmVnbFN1cmZhY2UgPSBzdGF0aWNfY2FzdDxlZ2w6OlN1cmZhY2UqPihzdXJmYWNlKTsKKworICAgICAgICBpZighdmFsaWRhdGVTdXJmYWNlKGRpc3BsYXksIGVnbFN1cmZhY2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYoYnVmZmVyICE9IEVHTF9CQUNLX0JVRkZFUikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSB8fCBlZ2xTdXJmYWNlLT5nZXRXaW5kb3dIYW5kbGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGVnbFN1cmZhY2UtPmdldFRleHR1cmVGb3JtYXQoKSA9PSBFR0xfTk9fVEVYVFVSRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9GQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6VGV4dHVyZTJEICp0ZXh0dXJlID0gZWdsU3VyZmFjZS0+Z2V0Qm91bmRUZXh0dXJlKCk7CisKKyAgICAgICAgaWYodGV4dHVyZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGV4dHVyZS0+cmVsZWFzZVRleEltYWdlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VjY2VzcyhFR0xfVFJVRSk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbFN3YXBJbnRlcnZhbChFR0xEaXNwbGF5IGRweSwgRUdMaW50IGludGVydmFsKQoreworICAgIFRSQUNFKCIoRUdMRGlzcGxheSBkcHkgPSAweCUwLjhwLCBFR0xpbnQgaW50ZXJ2YWwgPSAlZCkiLCBkcHksIGludGVydmFsKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKworICAgICAgICBpZighdmFsaWRhdGVEaXNwbGF5KGRpc3BsYXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgZWdsOjpTdXJmYWNlICpkcmF3X3N1cmZhY2UgPSBzdGF0aWNfY2FzdDxlZ2w6OlN1cmZhY2UqPihlZ2w6OmdldEN1cnJlbnREcmF3U3VyZmFjZSgpKTsKKworICAgICAgICBpZihkcmF3X3N1cmZhY2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZHJhd19zdXJmYWNlLT5zZXRTd2FwSW50ZXJ2YWwoaW50ZXJ2YWwpOworCisgICAgICAgIHJldHVybiBzdWNjZXNzKEVHTF9UUlVFKTsKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KKworRUdMQ29udGV4dCBfX3N0ZGNhbGwgZWdsQ3JlYXRlQ29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMQ29udGV4dCBzaGFyZV9jb250ZXh0LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQoreworICAgIFRSQUNFKCIoRUdMRGlzcGxheSBkcHkgPSAweCUwLjhwLCBFR0xDb25maWcgY29uZmlnID0gMHglMC44cCwgRUdMQ29udGV4dCBzaGFyZV9jb250ZXh0ID0gMHglMC44cCwgIgorICAgICAgICAgICJjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0ID0gMHglMC44cCkiLCBkcHksIGNvbmZpZywgc2hhcmVfY29udGV4dCwgYXR0cmliX2xpc3QpOworCisgICAgdHJ5CisgICAgeworICAgICAgICAvLyBHZXQgdGhlIHJlcXVlc3RlZCBjbGllbnQgdmVyc2lvbiAoZGVmYXVsdCBpcyAxKSBhbmQgY2hlY2sgaXQgaXMgdHdvLgorICAgICAgICBFR0xpbnQgY2xpZW50X3ZlcnNpb24gPSAxOworICAgICAgICBpZihhdHRyaWJfbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGNvbnN0IEVHTGludCogYXR0cmlidXRlID0gYXR0cmliX2xpc3Q7IGF0dHJpYnV0ZVswXSAhPSBFR0xfTk9ORTsgYXR0cmlidXRlICs9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoYXR0cmlidXRlWzBdID09IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50X3ZlcnNpb24gPSBhdHRyaWJ1dGVbMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FUVFJJQlVURSwgRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGNsaWVudF92ZXJzaW9uICE9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0NPTkZJRywgRUdMX05PX0NPTlRFWFQpOworICAgICAgICB9CisKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKworICAgICAgICBpZighdmFsaWRhdGVDb25maWcoZGlzcGxheSwgY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVHTF9OT19DT05URVhUOworICAgICAgICB9CisKKyAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZGlzcGxheS0+Y3JlYXRlQ29udGV4dChjb25maWcsIHN0YXRpY19jYXN0PGdsOjpDb250ZXh0Kj4oc2hhcmVfY29udGV4dCkpOworCisgICAgICAgIHJldHVybiBzdWNjZXNzKGNvbnRleHQpOworICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX05PX0NPTlRFWFQpOworICAgIH0KKworICAgIHJldHVybiBFR0xfTk9fQ09OVEVYVDsKK30KKworRUdMQm9vbGVhbiBfX3N0ZGNhbGwgZWdsRGVzdHJveUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KQoreworICAgIFRSQUNFKCIoRUdMRGlzcGxheSBkcHkgPSAweCUwLjhwLCBFR0xDb250ZXh0IGN0eCA9IDB4JTAuOHApIiwgZHB5LCBjdHgpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBzdGF0aWNfY2FzdDxlZ2w6OkRpc3BsYXkqPihkcHkpOworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IHN0YXRpY19jYXN0PGdsOjpDb250ZXh0Kj4oY3R4KTsKKworICAgICAgICBpZighdmFsaWRhdGVDb250ZXh0KGRpc3BsYXksIGNvbnRleHQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYoY3R4ID09IEVHTF9OT19DT05URVhUKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgZGlzcGxheS0+ZGVzdHJveUNvbnRleHQoY29udGV4dCk7CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoRUdMX1RSVUUpOworICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xCb29sZWFuIF9fc3RkY2FsbCBlZ2xNYWtlQ3VycmVudChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4KQoreworICAgIFRSQUNFKCIoRUdMRGlzcGxheSBkcHkgPSAweCUwLjhwLCBFR0xTdXJmYWNlIGRyYXcgPSAweCUwLjhwLCBFR0xTdXJmYWNlIHJlYWQgPSAweCUwLjhwLCBFR0xDb250ZXh0IGN0eCA9IDB4JTAuOHApIiwKKyAgICAgICAgICBkcHksIGRyYXcsIHJlYWQsIGN0eCk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGVnbDo6RGlzcGxheSAqZGlzcGxheSA9IHN0YXRpY19jYXN0PGVnbDo6RGlzcGxheSo+KGRweSk7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Z2w6OkNvbnRleHQqPihjdHgpOworICAgICAgICBnbDo6RGV2aWNlICpkZXZpY2UgPSBkaXNwbGF5LT5nZXREZXZpY2UoKTsKKworICAgICAgICBpZighZGV2aWNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0NPTlRFWFRfTE9TVCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGN0eCAhPSBFR0xfTk9fQ09OVEVYVCAmJiAhdmFsaWRhdGVDb250ZXh0KGRpc3BsYXksIGNvbnRleHQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYoKGRyYXcgIT0gRUdMX05PX1NVUkZBQ0UgJiYgIXZhbGlkYXRlU3VyZmFjZShkaXNwbGF5LCBzdGF0aWNfY2FzdDxlZ2w6OlN1cmZhY2UqPihkcmF3KSkpIHx8CisgICAgICAgICAgICAocmVhZCAhPSBFR0xfTk9fU1VSRkFDRSAmJiAhdmFsaWRhdGVTdXJmYWNlKGRpc3BsYXksIHN0YXRpY19jYXN0PGVnbDo6U3VyZmFjZSo+KHJlYWQpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZihkcmF3ICE9IHJlYWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorICAgICAgICB9CisKKyAgICAgICAgZWdsOjpTdXJmYWNlKiBwcmV2aW91c0RyYXcgPSBzdGF0aWNfY2FzdDxlZ2w6OlN1cmZhY2UqPihlZ2w6OmdldEN1cnJlbnREcmF3U3VyZmFjZSgpKTsKKyAgICAgICAgZWdsOjpTdXJmYWNlKiBwcmV2aW91c1JlYWQgPSBzdGF0aWNfY2FzdDxlZ2w6OlN1cmZhY2UqPihlZ2w6OmdldEN1cnJlbnRSZWFkU3VyZmFjZSgpKTsKKworICAgICAgICBlZ2w6OnNldEN1cnJlbnREaXNwbGF5KGRweSk7CisgICAgICAgIGVnbDo6c2V0Q3VycmVudERyYXdTdXJmYWNlKGRyYXcpOworICAgICAgICBlZ2w6OnNldEN1cnJlbnRSZWFkU3VyZmFjZShyZWFkKTsKKworICAgICAgICBnbE1ha2VDdXJyZW50KGNvbnRleHQsIGRpc3BsYXksIHN0YXRpY19jYXN0PGVnbDo6U3VyZmFjZSo+KGRyYXcpKTsKKworICAgICAgICByZXR1cm4gc3VjY2VzcyhFR0xfVFJVRSk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTENvbnRleHQgX19zdGRjYWxsIGVnbEdldEN1cnJlbnRDb250ZXh0KHZvaWQpCit7CisgICAgVFJBQ0UoIigpIik7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIEVHTENvbnRleHQgY29udGV4dCA9IGdsR2V0Q3VycmVudENvbnRleHQoKTsKKworICAgICAgICByZXR1cm4gc3VjY2Vzcyhjb250ZXh0KTsKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19DT05URVhUKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX05PX0NPTlRFWFQ7Cit9CisKK0VHTFN1cmZhY2UgX19zdGRjYWxsIGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTGludCByZWFkZHJhdykKK3sKKyAgICBUUkFDRSgiKEVHTGludCByZWFkZHJhdyA9ICVkKSIsIHJlYWRkcmF3KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYocmVhZGRyYXcgPT0gRUdMX1JFQUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVHTFN1cmZhY2UgcmVhZCA9IGVnbDo6Z2V0Q3VycmVudFJlYWRTdXJmYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzcyhyZWFkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHJlYWRkcmF3ID09IEVHTF9EUkFXKQorICAgICAgICB7CisgICAgICAgICAgICBFR0xTdXJmYWNlIGRyYXcgPSBlZ2w6OmdldEN1cnJlbnREcmF3U3VyZmFjZSgpOworICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoZHJhdyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX05PX1NVUkZBQ0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKK30KKworRUdMRGlzcGxheSBfX3N0ZGNhbGwgZWdsR2V0Q3VycmVudERpc3BsYXkodm9pZCkKK3sKKyAgICBUUkFDRSgiKCkiKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgRUdMRGlzcGxheSBkcHkgPSBlZ2w6OmdldEN1cnJlbnREaXNwbGF5KCk7CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoZHB5KTsKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19ESVNQTEFZKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX05PX0RJU1BMQVk7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbFF1ZXJ5Q29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCit7CisgICAgVFJBQ0UoIihFR0xEaXNwbGF5IGRweSA9IDB4JTAuOHAsIEVHTENvbnRleHQgY3R4ID0gMHglMC44cCwgRUdMaW50IGF0dHJpYnV0ZSA9ICVkLCBFR0xpbnQgKnZhbHVlID0gMHglMC44cCkiLAorICAgICAgICAgIGRweSwgY3R4LCBhdHRyaWJ1dGUsIHZhbHVlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBzdGF0aWNfY2FzdDxnbDo6Q29udGV4dCo+KGN0eCk7CisKKyAgICAgICAgaWYoIXZhbGlkYXRlQ29udGV4dChkaXNwbGF5LCBjb250ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorCisgICAgICAgIHJldHVybiBzdWNjZXNzKDApOworICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xCb29sZWFuIF9fc3RkY2FsbCBlZ2xXYWl0R0wodm9pZCkKK3sKKyAgICBUUkFDRSgiKCkiKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FCisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoMCk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTEJvb2xlYW4gX19zdGRjYWxsIGVnbFdhaXROYXRpdmUoRUdMaW50IGVuZ2luZSkKK3sKKyAgICBUUkFDRSgiKEVHTGludCBlbmdpbmUgPSAlZCkiLCBlbmdpbmUpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKworICAgICAgICByZXR1cm4gc3VjY2VzcygwKTsKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KKworRUdMQm9vbGVhbiBfX3N0ZGNhbGwgZWdsU3dhcEJ1ZmZlcnMoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSkKK3sKKyAgICBUUkFDRSgiKEVHTERpc3BsYXkgZHB5ID0gMHglMC44cCwgRUdMU3VyZmFjZSBzdXJmYWNlID0gMHglMC44cCkiLCBkcHksIHN1cmZhY2UpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBzdGF0aWNfY2FzdDxlZ2w6OkRpc3BsYXkqPihkcHkpOworICAgICAgICBlZ2w6OlN1cmZhY2UgKmVnbFN1cmZhY2UgPSAoZWdsOjpTdXJmYWNlKilzdXJmYWNlOworCisgICAgICAgIGlmKCF2YWxpZGF0ZVN1cmZhY2UoZGlzcGxheSwgZWdsU3VyZmFjZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZihzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgZWdsU3VyZmFjZS0+c3dhcCgpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoRUdMX1RSVUUpOworICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xCb29sZWFuIF9fc3RkY2FsbCBlZ2xDb3B5QnVmZmVycyhFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xOYXRpdmVQaXhtYXBUeXBlIHRhcmdldCkKK3sKKyAgICBUUkFDRSgiKEVHTERpc3BsYXkgZHB5ID0gMHglMC44cCwgRUdMU3VyZmFjZSBzdXJmYWNlID0gMHglMC44cCwgRUdMTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQgPSAweCUwLjhwKSIsIGRweSwgc3VyZmFjZSwgdGFyZ2V0KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gc3RhdGljX2Nhc3Q8ZWdsOjpEaXNwbGF5Kj4oZHB5KTsKKyAgICAgICAgZWdsOjpTdXJmYWNlICplZ2xTdXJmYWNlID0gc3RhdGljX2Nhc3Q8ZWdsOjpTdXJmYWNlKj4oc3VyZmFjZSk7CisKKyAgICAgICAgaWYoIXZhbGlkYXRlU3VyZmFjZShkaXNwbGF5LCBlZ2xTdXJmYWNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorCisgICAgICAgIHJldHVybiBzdWNjZXNzKDApOworICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIF9fc3RkY2FsbCBlZ2xHZXRQcm9jQWRkcmVzcyhjb25zdCBjaGFyICpwcm9jbmFtZSkKK3sKKyAgICBUUkFDRSgiKGNvbnN0IGNoYXIgKnByb2NuYW1lID0gXCIlc1wiKSIsIHByb2NuYW1lKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgc3RydWN0IEV4dGVuc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICAgICAgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBhZGRyZXNzOworICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBFeHRlbnNpb24gZWdsRXh0ZW5zaW9uc1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgeyIiLCBOVUxMfSwKKyAgICAgICAgfTsKKworICAgICAgICBmb3IoaW50IGV4dCA9IDA7IGV4dCA8IHNpemVvZihlZ2xFeHRlbnNpb25zKSAvIHNpemVvZihFeHRlbnNpb24pOyBleHQrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc3RyY21wKHByb2NuYW1lLCBlZ2xFeHRlbnNpb25zW2V4dF0ubmFtZSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZWdsRXh0ZW5zaW9uc1tleHRdLmFkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ2xHZXRQcm9jQWRkcmVzcyhwcm9jbmFtZSk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihFR0xfQkFEX0FMTE9DLCAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9saWJFR0wuZGVmIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML2xpYkVHTC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhNWU2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9saWJFR0wuZGVmCkBAIC0wLDAgKzEsMzYgQEAKK0xJQlJBUlkJbGliRUdMCitFWFBPUlRTCisJZWdsQmluZEFQSSAgICAgICAgICAgICAgICAgICAgICBAMTQKKwllZ2xCaW5kVGV4SW1hZ2UgICAgICAgICAgICAgICAgIEAyMAorCWVnbENob29zZUNvbmZpZyAgICAgICAgICAgICAgICAgQDcKKwllZ2xDb3B5QnVmZmVycyAgICAgICAgICAgICAgICAgIEAzMworCWVnbENyZWF0ZUNvbnRleHQgICAgICAgICAgICAgICAgQDIzCisJZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIgICAgICAgIEAxOAorCWVnbENyZWF0ZVBidWZmZXJTdXJmYWNlICAgICAgICAgQDEwCisJZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSAgICAgICAgICBAMTEKKwllZ2xDcmVhdGVXaW5kb3dTdXJmYWNlICAgICAgICAgIEA5CisJZWdsRGVzdHJveUNvbnRleHQgICAgICAgICAgICAgICBAMjQKKwllZ2xEZXN0cm95U3VyZmFjZSAgICAgICAgICAgICAgIEAxMgorCWVnbEdldENvbmZpZ0F0dHJpYiAgICAgICAgICAgICAgQDgKKwllZ2xHZXRDb25maWdzICAgICAgICAgICAgICAgICAgIEA2CisJZWdsR2V0Q3VycmVudENvbnRleHQgICAgICAgICAgICBAMjYKKwllZ2xHZXRDdXJyZW50RGlzcGxheSAgICAgICAgICAgIEAyOAorCWVnbEdldEN1cnJlbnRTdXJmYWNlICAgICAgICAgICAgQDI3CisJZWdsR2V0RGlzcGxheSAgICAgICAgICAgICAgICAgICBAMgorCWVnbEdldEVycm9yICAgICAgICAgICAgICAgICAgICAgQDEKKwllZ2xHZXRQcm9jQWRkcmVzcyAgICAgICAgICAgICAgIEAzNAorCWVnbEluaXRpYWxpemUgICAgICAgICAgICAgICAgICAgQDMKKwllZ2xNYWtlQ3VycmVudCAgICAgICAgICAgICAgICAgIEAyNQorCWVnbFF1ZXJ5QVBJICAgICAgICAgICAgICAgICAgICAgQDE1CisJZWdsUXVlcnlDb250ZXh0ICAgICAgICAgICAgICAgICBAMjkKKwllZ2xRdWVyeVN0cmluZyAgICAgICAgICAgICAgICAgIEA1CisJZWdsUXVlcnlTdXJmYWNlICAgICAgICAgICAgICAgICBAMTMKKwllZ2xSZWxlYXNlVGV4SW1hZ2UgICAgICAgICAgICAgIEAyMQorCWVnbFJlbGVhc2VUaHJlYWQgICAgICAgICAgICAgICAgQDE3CisJZWdsU3VyZmFjZUF0dHJpYiAgICAgICAgICAgICAgICBAMTkKKwllZ2xTd2FwQnVmZmVycyAgICAgICAgICAgICAgICAgIEAzMgorCWVnbFN3YXBJbnRlcnZhbCAgICAgICAgICAgICAgICAgQDIyCisJZWdsVGVybWluYXRlICAgICAgICAgICAgICAgICAgICBANAorCWVnbFdhaXRDbGllbnQgICAgICAgICAgICAgICAgICAgQDE2CisJZWdsV2FpdEdMICAgICAgICAgICAgICAgICAgICAgICBAMzAKKwllZ2xXYWl0TmF0aXZlICAgICAgICAgICAgICAgICAgIEAzMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9saWJFR0wucmMgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvbGliRUdMLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDg3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvbGliRUdMLnJjCkBAIC0wLDAgKzEsMTAyIEBACisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBnZW5lcmF0ZWQgcmVzb3VyY2Ugc2NyaXB0LgorLy8KKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorCisjZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDIgcmVzb3VyY2UuCisvLworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlICIuLi8uLi9jb21tb24vVmVyc2lvbi5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcworCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpCisjaWZkZWYgX1dJTjMyCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUworI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKKyNlbmRpZiAvL19XSU4zMgorCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBURVhUSU5DTFVERQorLy8KKworMSBURVhUSU5DTFVERSAKK0JFR0lOCisgICAgInJlc291cmNlLmhcMCIKK0VORAorCisyIFRFWFRJTkNMVURFIAorQkVHSU4KKyAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiIKKyAgICAiI2luY2x1ZGUgIiIuLi9jb21tb24vdmVyc2lvbi5oIiJcMCIKK0VORAorCiszIFRFWFRJTkNMVURFIAorQkVHSU4KKyAgICAiXHJcbiIKKyAgICAiXDAiCitFTkQKKworI2VuZGlmICAgIC8vIEFQU1RVRElPX0lOVk9LRUQKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFZlcnNpb24KKy8vCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIE1BSk9SX1ZFUlNJT04sTUlOT1JfVkVSU0lPTixCVUlMRF9WRVJTSU9OLEJVSUxEX1JFVklTSU9OCisgUFJPRFVDVFZFUlNJT04gTUFKT1JfVkVSU0lPTixNSU5PUl9WRVJTSU9OLEJVSUxEX1ZFUlNJT04sQlVJTERfUkVWSVNJT04KKyBGSUxFRkxBR1NNQVNLIDB4MTdMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIDB4MUwKKyNlbHNlCisgRklMRUZMQUdTIDB4MEwKKyNlbmRpZgorIEZJTEVPUyAweDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiU3dpZnRTaGFkZXIgbGliRUdMIER5bmFtaWMgTGluayBMaWJyYXJ5IgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgVkVSU0lPTl9TVFJJTkcKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAibGliRUdMIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCAoQykgMjAxMSBUcmFuc0dhbWluZyBJbmMuIgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAibGliRUdMLmRsbCIKKyAgICAgICAgICAgIFZBTFVFICJQcml2YXRlQnVpbGQiLCBWRVJTSU9OX1NUUklORworICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlN3aWZ0U2hhZGVyIGxpYkVHTCBEeW5hbWljIExpbmsgTGlicmFyeSIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsIFZFUlNJT05fU1RSSU5HCisgICAgICAgIEVORAorICAgIEVORAorICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTIwMAorICAgIEVORAorRU5ECisKKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisjaWZuZGVmIEFQU1RVRElPX0lOVk9LRUQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDMgcmVzb3VyY2UuCisvLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZW5kaWYgICAgLy8gbm90IEFQU1RVRElPX0lOVk9LRUQKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9saWJFR0wudmN4cHJvaiBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9saWJFR0wudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNhNWUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML2xpYkVHTC52Y3hwcm9qCkBAIC0wLDAgKzEsMTk2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57RTc0NkZDQTktNjRDMy00MzNFLTg1RTgtOUE1QTY3QUI3RUQ2fTwvUHJvamVjdEd1aWQ+DQorICAgIDxSb290TmFtZXNwYWNlPmxpYkVHTDwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8SW5jbHVkZVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Li5caW5jbHVkZTskKERYU0RLX0RJUilcSW5jbHVkZTskKFZDSW5zdGFsbERpcilQbGF0Zm9ybVNES1xpbmNsdWRlOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4NCisgICAgPEluY2x1ZGVQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPi4uXGluY2x1ZGU7JChEWFNES19ESVIpXEluY2x1ZGU7JChWQ0luc3RhbGxEaXIpUGxhdGZvcm1TREtcaW5jbHVkZTskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+DQorICAgIDxJbmNsdWRlUGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Li5caW5jbHVkZTskKERYU0RLX0RJUilcSW5jbHVkZTskKFZDSW5zdGFsbERpcilQbGF0Zm9ybVNES1xpbmNsdWRlOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKS8uLjskKFByb2plY3REaXIpLy4uLy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMO0xJQkVHTF9FWFBPUlRTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtOT01JTk1BWDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5kd21hcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPmxpYkVHTC5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxEZWxheUxvYWRETExzPmR3bWFwaS5kbGw7JShEZWxheUxvYWRETExzKTwvRGVsYXlMb2FkRExMcz4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgICA8UG9zdEJ1aWxkRXZlbnQ+DQorICAgICAgPENvbW1hbmQ+bWtkaXIgIiQoUHJvamVjdERpcikuLlwuLlxsaWJcJChDb25maWd1cmF0aW9uKVwiDQorY29weSAiJChPdXREaXIpbGliRUdMLmRsbCIgIiQoUHJvamVjdERpcikuLlwuLlxsaWJcJChDb25maWd1cmF0aW9uKVwiDQorY29weSAiJChPdXREaXIpbGliRUdMLmxpYiIgIiQoUHJvamVjdERpcikuLlwuLlxsaWJcJChDb25maWd1cmF0aW9uKVwiDQorPC9Db21tYW5kPg0KKyAgICA8L1Bvc3RCdWlsZEV2ZW50Pg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKS8uLjskKFByb2plY3REaXIpLy4uLy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztfVVNSRExMO0xJQkVHTF9FWFBPUlRTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtOT01JTk1BWDtfU0VDVVJFX1NDTD0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+ZHdtYXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT5saWJFR0wuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8RGVsYXlMb2FkRExMcz5kd21hcGkuZGxsOyUoRGVsYXlMb2FkRExMcyk8L0RlbGF5TG9hZERMTHM+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgICA8UG9zdEJ1aWxkRXZlbnQ+DQorICAgICAgPENvbW1hbmQ+bWtkaXIgIiQoUHJvamVjdERpcikuLlwuLlxsaWJcJChDb25maWd1cmF0aW9uKVwiDQorY29weSAiJChPdXREaXIpbGliRUdMLmRsbCIgIiQoUHJvamVjdERpcikuLlwuLlxsaWJcJChDb25maWd1cmF0aW9uKVwiDQorY29weSAiJChPdXREaXIpbGliRUdMLmxpYiIgIiQoUHJvamVjdERpcikuLlwuLlxsaWJcJChDb25maWd1cmF0aW9uKVwiDQorPC9Db21tYW5kPg0KKyAgICA8L1Bvc3RCdWlsZEV2ZW50Pg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKS8uLjskKFByb2plY3REaXIpLy4uLy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztfVVNSRExMO0xJQkVHTF9FWFBPUlRTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtOT01JTk1BWDtfU0VDVVJFX1NDTD0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5kd21hcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPmxpYkVHTC5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxEZWxheUxvYWRETExzPmR3bWFwaS5kbGw7JShEZWxheUxvYWRETExzKTwvRGVsYXlMb2FkRExMcz4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICAgIDxQb3N0QnVpbGRFdmVudD4NCisgICAgICA8Q29tbWFuZD5ta2RpciAiJChQcm9qZWN0RGlyKS4uXC4uXGxpYlwkKENvbmZpZ3VyYXRpb24pXCINCitjb3B5ICIkKE91dERpcilsaWJFR0wuZGxsIiAiJChQcm9qZWN0RGlyKS4uXC4uXGxpYlwkKENvbmZpZ3VyYXRpb24pXCINCitjb3B5ICIkKE91dERpcilsaWJFR0wubGliIiAiJChQcm9qZWN0RGlyKS4uXC4uXGxpYlwkKENvbmZpZ3VyYXRpb24pXCINCis8L0NvbW1hbmQ+DQorICAgIDwvUG9zdEJ1aWxkRXZlbnQ+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkNvbmZpZy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cQ29tbW9uXGRlYnVnLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXNwbGF5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJsaWJFR0wuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Im1haW4uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlN1cmZhY2UuY3BwIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkNvbmZpZy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpc3BsYXkuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXEVHTFxlZ2wuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXEVHTFxlZ2xleHQuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXEVHTFxlZ2xwbGF0Zm9ybS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Im1haW4uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJyZXNvdXJjZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlN1cmZhY2UuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxjb21tb25cdmVyc2lvbi5oIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJsaWJFR0wuZGVmIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9ImxpYkVHTC5yYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cbGliR0xFU3YyXGxpYkdMRVN2Mi52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57YjU4NzFhN2EtOTY4Yy00MmUzLWEzM2ItOTgxZTZmNDQ4ZTc4fTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9saWJFR0wudmN4cHJvai5maWx0ZXJzIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML2xpYkVHTC52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwZTE2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9saWJFR0wudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsNjggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214PC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iQ29uZmlnLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cQ29tbW9uXGRlYnVnLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlzcGxheS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImxpYkVHTC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Im1haW4uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJTdXJmYWNlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iQ29uZmlnLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpc3BsYXkuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxFR0xcZWdsLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcRUdMXGVnbGV4dC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXEVHTFxlZ2xwbGF0Zm9ybS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJtYWluLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InJlc291cmNlLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlN1cmZhY2UuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cY29tbW9uXHZlcnNpb24uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZXNvdXJjZUNvbXBpbGUgSW5jbHVkZT0ibGliRUdMLnJjIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJsaWJFR0wuZGVmIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9tYWluLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzZmNDRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML21haW4uY3BwCkBAIC0wLDAgKzEsMTYxIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBtYWluLmNwcDogRExMIGVudHJ5IHBvaW50IGFuZCBtYW5hZ2VtZW50IG9mIHRocmVhZC1sb2NhbCBkYXRhLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSAiY29tbW9uL2RlYnVnLmgiCisKK3N0YXRpYyBEV09SRCBjdXJyZW50VExTID0gVExTX09VVF9PRl9JTkRFWEVTOworCitCT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5DRSBpbnN0YW5jZSwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpCit7CisgICAgc3dpdGNoIChyZWFzb24pCisgICAgeworICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgIHsKKyNpZiAhZGVmaW5lZChBTkdMRV9ESVNBQkxFX1RSQUNFKQorICAgICAgICAgICAgRklMRSAqZGVidWcgPSBmb3BlbihUUkFDRV9PVVRQVVRfRklMRSwgInJ0Iik7CisKKyAgICAgICAgICAgIGlmKGRlYnVnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZjbG9zZShkZWJ1Zyk7CisgICAgICAgICAgICAgICAgZGVidWcgPSBmb3BlbihUUkFDRV9PVVRQVVRfRklMRSwgInd0Iik7ICAgLy8gRXJhc2UKKyAgICAgICAgICAgICAgICBmY2xvc2UoZGVidWcpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGN1cnJlbnRUTFMgPSBUbHNBbGxvYygpOworCisgICAgICAgICAgICBpZihjdXJyZW50VExTID09IFRMU19PVVRfT0ZfSU5ERVhFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRmFsbCB0aHJvdWdodCB0byBpbml0aWFsaXplIGluZGV4CisgICAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIOgorICAgICAgICB7CisgICAgICAgICAgICBlZ2w6OkN1cnJlbnQgKmN1cnJlbnQgPSAoZWdsOjpDdXJyZW50KilMb2NhbEFsbG9jKExQVFIsIHNpemVvZihlZ2w6OkN1cnJlbnQpKTsKKworICAgICAgICAgICAgaWYoY3VycmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUbHNTZXRWYWx1ZShjdXJyZW50VExTLCBjdXJyZW50KTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnQtPmVycm9yID0gRUdMX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgY3VycmVudC0+QVBJID0gRUdMX09QRU5HTF9FU19BUEk7CisgICAgICAgICAgICAgICAgY3VycmVudC0+ZGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOworICAgICAgICAgICAgICAgIGN1cnJlbnQtPmRyYXdTdXJmYWNlID0gRUdMX05PX1NVUkZBQ0U7CisgICAgICAgICAgICAgICAgY3VycmVudC0+cmVhZFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6CisgICAgICAgIHsKKyAgICAgICAgICAgIHZvaWQgKmN1cnJlbnQgPSBUbHNHZXRWYWx1ZShjdXJyZW50VExTKTsKKworICAgICAgICAgICAgaWYoY3VycmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2NhbEZyZWUoKEhMT0NBTCljdXJyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICB7CisgICAgICAgICAgICB2b2lkICpjdXJyZW50ID0gVGxzR2V0VmFsdWUoY3VycmVudFRMUyk7CisKKyAgICAgICAgICAgIGlmKGN1cnJlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9jYWxGcmVlKChITE9DQUwpY3VycmVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRsc0ZyZWUoY3VycmVudFRMUyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworbmFtZXNwYWNlIGVnbAorewordm9pZCBzZXRDdXJyZW50RXJyb3IoRUdMaW50IGVycm9yKQoreworICAgIEN1cnJlbnQgKmN1cnJlbnQgPSAoQ3VycmVudCopVGxzR2V0VmFsdWUoY3VycmVudFRMUyk7CisKKyAgICBjdXJyZW50LT5lcnJvciA9IGVycm9yOworfQorCitFR0xpbnQgZ2V0Q3VycmVudEVycm9yKCkKK3sKKyAgICBDdXJyZW50ICpjdXJyZW50ID0gKEN1cnJlbnQqKVRsc0dldFZhbHVlKGN1cnJlbnRUTFMpOworCisgICAgcmV0dXJuIGN1cnJlbnQtPmVycm9yOworfQorCit2b2lkIHNldEN1cnJlbnRBUEkoRUdMZW51bSBBUEkpCit7CisgICAgQ3VycmVudCAqY3VycmVudCA9IChDdXJyZW50KilUbHNHZXRWYWx1ZShjdXJyZW50VExTKTsKKworICAgIGN1cnJlbnQtPkFQSSA9IEFQSTsKK30KKworRUdMZW51bSBnZXRDdXJyZW50QVBJKCkKK3sKKyAgICBDdXJyZW50ICpjdXJyZW50ID0gKEN1cnJlbnQqKVRsc0dldFZhbHVlKGN1cnJlbnRUTFMpOworCisgICAgcmV0dXJuIGN1cnJlbnQtPkFQSTsKK30KKwordm9pZCBzZXRDdXJyZW50RGlzcGxheShFR0xEaXNwbGF5IGRweSkKK3sKKyAgICBDdXJyZW50ICpjdXJyZW50ID0gKEN1cnJlbnQqKVRsc0dldFZhbHVlKGN1cnJlbnRUTFMpOworCisgICAgY3VycmVudC0+ZGlzcGxheSA9IGRweTsKK30KKworRUdMRGlzcGxheSBnZXRDdXJyZW50RGlzcGxheSgpCit7CisgICAgQ3VycmVudCAqY3VycmVudCA9IChDdXJyZW50KilUbHNHZXRWYWx1ZShjdXJyZW50VExTKTsKKworICAgIHJldHVybiBjdXJyZW50LT5kaXNwbGF5OworfQorCit2b2lkIHNldEN1cnJlbnREcmF3U3VyZmFjZShFR0xTdXJmYWNlIHN1cmZhY2UpCit7CisgICAgQ3VycmVudCAqY3VycmVudCA9IChDdXJyZW50KilUbHNHZXRWYWx1ZShjdXJyZW50VExTKTsKKworICAgIGN1cnJlbnQtPmRyYXdTdXJmYWNlID0gc3VyZmFjZTsKK30KKworRUdMU3VyZmFjZSBnZXRDdXJyZW50RHJhd1N1cmZhY2UoKQoreworICAgIEN1cnJlbnQgKmN1cnJlbnQgPSAoQ3VycmVudCopVGxzR2V0VmFsdWUoY3VycmVudFRMUyk7CisKKyAgICByZXR1cm4gY3VycmVudC0+ZHJhd1N1cmZhY2U7Cit9CisKK3ZvaWQgc2V0Q3VycmVudFJlYWRTdXJmYWNlKEVHTFN1cmZhY2Ugc3VyZmFjZSkKK3sKKyAgICBDdXJyZW50ICpjdXJyZW50ID0gKEN1cnJlbnQqKVRsc0dldFZhbHVlKGN1cnJlbnRUTFMpOworCisgICAgY3VycmVudC0+cmVhZFN1cmZhY2UgPSBzdXJmYWNlOworfQorCitFR0xTdXJmYWNlIGdldEN1cnJlbnRSZWFkU3VyZmFjZSgpCit7CisgICAgQ3VycmVudCAqY3VycmVudCA9IChDdXJyZW50KilUbHNHZXRWYWx1ZShjdXJyZW50VExTKTsKKworICAgIHJldHVybiBjdXJyZW50LT5yZWFkU3VyZmFjZTsKK30KK30KKwordm9pZCBlcnJvcihFR0xpbnQgZXJyb3JDb2RlKQoreworICAgIGVnbDo6c2V0Q3VycmVudEVycm9yKGVycm9yQ29kZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvbWFpbi5oIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDlkOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliRUdML21haW4uaApAQCAtMCwwICsxLDYxIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBtYWluLmg6IE1hbmFnZW1lbnQgb2YgdGhyZWFkLWxvY2FsIGRhdGEuCisKKyNpZm5kZWYgTElCRUdMX01BSU5fSF8KKyNkZWZpbmUgTElCRUdMX01BSU5fSF8KKworI2RlZmluZSBFR0xBUEkKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorCituYW1lc3BhY2UgZWdsCit7CitzdHJ1Y3QgQ3VycmVudAoreworICAgIEVHTGludCBlcnJvcjsKKyAgICBFR0xlbnVtIEFQSTsKKyAgICBFR0xEaXNwbGF5IGRpc3BsYXk7CisgICAgRUdMU3VyZmFjZSBkcmF3U3VyZmFjZTsKKyAgICBFR0xTdXJmYWNlIHJlYWRTdXJmYWNlOworfTsKKwordm9pZCBzZXRDdXJyZW50RXJyb3IoRUdMaW50IGVycm9yKTsKK0VHTGludCBnZXRDdXJyZW50RXJyb3IoKTsKKwordm9pZCBzZXRDdXJyZW50QVBJKEVHTGVudW0gQVBJKTsKK0VHTGVudW0gZ2V0Q3VycmVudEFQSSgpOworCit2b2lkIHNldEN1cnJlbnREaXNwbGF5KEVHTERpc3BsYXkgZHB5KTsKK0VHTERpc3BsYXkgZ2V0Q3VycmVudERpc3BsYXkoKTsKKwordm9pZCBzZXRDdXJyZW50RHJhd1N1cmZhY2UoRUdMU3VyZmFjZSBzdXJmYWNlKTsKK0VHTFN1cmZhY2UgZ2V0Q3VycmVudERyYXdTdXJmYWNlKCk7CisKK3ZvaWQgc2V0Q3VycmVudFJlYWRTdXJmYWNlKEVHTFN1cmZhY2Ugc3VyZmFjZSk7CitFR0xTdXJmYWNlIGdldEN1cnJlbnRSZWFkU3VyZmFjZSgpOworfQorCit2b2lkIGVycm9yKEVHTGludCBlcnJvckNvZGUpOworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY29uc3QgVCAmZXJyb3IoRUdMaW50IGVycm9yQ29kZSwgY29uc3QgVCAmcmV0dXJuVmFsdWUpCit7CisgICAgZXJyb3IoZXJyb3JDb2RlKTsKKworICAgIHJldHVybiByZXR1cm5WYWx1ZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NvbnN0IFQgJnN1Y2Nlc3MoY29uc3QgVCAmcmV0dXJuVmFsdWUpCit7CisgICAgZWdsOjpzZXRDdXJyZW50RXJyb3IoRUdMX1NVQ0NFU1MpOworCisgICAgcmV0dXJuIHJldHVyblZhbHVlOworfQorCisjZW5kaWYgIC8vIExJQkVHTF9NQUlOX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvcmVzb3VyY2UuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkVHTC9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjFmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJFR0wvcmVzb3VyY2UuaApAQCAtMCwwICsxLDE0IEBACisvL3t7Tk9fREVQRU5ERU5DSUVTfX0KKy8vIE1pY3Jvc29mdCBWaXN1YWwgQysrIGdlbmVyYXRlZCBpbmNsdWRlIGZpbGUuCisvLyBVc2VkIGJ5IGxpYkVHTC5yYworCisvLyBOZXh0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgb2JqZWN0cworLy8gCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorI2lmbmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRSAgICAgICAgMTAxCisjZGVmaW5lIF9BUFNfTkVYVF9DT01NQU5EX1ZBTFVFICAgICAgICAgNDAwMDEKKyNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDAxCisjZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAgICAgICAgICAgMTAxCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0J1ZmZlci5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWRiMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0J1ZmZlci5jcHAKQEAgLTAsMCArMSw4NSBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gQnVmZmVyLmNwcDogSW1wbGVtZW50cyB0aGUgQnVmZmVyIGNsYXNzLCByZXByZXNlbnRpbmcgc3RvcmFnZSBvZiB2ZXJ0ZXggYW5kL29yCisvLyBpbmRleCBkYXRhLiBJbXBsZW1lbnRzIEdMIGJ1ZmZlciBvYmplY3RzIGFuZCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuCisvLyBbT3BlbkdMIEVTIDIuMC4yNF0gc2VjdGlvbiAyLjkgcGFnZSAyMS4KKworI2luY2x1ZGUgIkJ1ZmZlci5oIgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIlZlcnRleERhdGFNYW5hZ2VyLmgiCisjaW5jbHVkZSAiSW5kZXhEYXRhTWFuYWdlci5oIgorCituYW1lc3BhY2UgZ2wKK3sKKworQnVmZmVyOjpCdWZmZXIoR0x1aW50IGlkKSA6IFJlZkNvdW50T2JqZWN0KGlkKQoreworICAgIG1Db250ZW50cyA9IDA7CisgICAgbVNpemUgPSAwOworICAgIG1Vc2FnZSA9IEdMX0RZTkFNSUNfRFJBVzsKK30KKworQnVmZmVyOjp+QnVmZmVyKCkKK3sKKyAgICBpZihtQ29udGVudHMpCisJeworCQltQ29udGVudHMtPmRlc3RydWN0KCk7CisJfQorfQorCit2b2lkIEJ1ZmZlcjo6YnVmZmVyRGF0YShjb25zdCB2b2lkICpkYXRhLCBHTHNpemVpcHRyIHNpemUsIEdMZW51bSB1c2FnZSkKK3sKKyAgICBpZihzaXplID09IDApCisgICAgeworCQlpZihtQ29udGVudHMpCisJCXsKKwkJCW1Db250ZW50cy0+ZGVzdHJ1Y3QoKTsKKwkJCW1Db250ZW50cyA9IDA7CisJCX0KKyAgICB9CisgICAgZWxzZSBpZihzaXplICE9IG1TaXplKQorICAgIHsKKyAgICAgICAgaWYobUNvbnRlbnRzKQorCQl7CisJCQltQ29udGVudHMtPmRlc3RydWN0KCk7CisJCQltQ29udGVudHMgPSAwOworCQl9CisKKwkJbUNvbnRlbnRzID0gbmV3IHN3OjpSZXNvdXJjZShzaXplICsgMTAyNCk7CisKKwkJaWYobUNvbnRlbnRzKQorCQl7CisJCQltZW1zZXQoKHZvaWQqKW1Db250ZW50cy0+Z2V0QnVmZmVyKCksIDAsIHNpemUpOworCQl9CisgICAgfQorCisgICAgaWYoZGF0YSAhPSBOVUxMICYmIHNpemUgPiAwKQorICAgIHsKKwkJbWVtY3B5KCh2b2lkKiltQ29udGVudHMtPmdldEJ1ZmZlcigpLCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICBtU2l6ZSA9IHNpemU7CisgICAgbVVzYWdlID0gdXNhZ2U7Cit9CisKK3ZvaWQgQnVmZmVyOjpidWZmZXJTdWJEYXRhKGNvbnN0IHZvaWQgKmRhdGEsIEdMc2l6ZWlwdHIgc2l6ZSwgR0xpbnRwdHIgb2Zmc2V0KQoreworCWlmKG1Db250ZW50cykKKwl7CisJCWNoYXIgKmJ1ZmZlciA9IChjaGFyKiltQ29udGVudHMtPmxvY2soc3c6OlBVQkxJQyk7CisJCW1lbWNweShidWZmZXIgKyBvZmZzZXQsIGRhdGEsIHNpemUpOworCQltQ29udGVudHMtPnVubG9jaygpOworCX0KK30KKworc3c6OlJlc291cmNlICpCdWZmZXI6OmdldFJlc291cmNlKCkKK3sKKwlyZXR1cm4gbUNvbnRlbnRzOworfQorCit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvQnVmZmVyLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjNTI0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9CdWZmZXIuaApAQCAtMCwwICsxLDUyIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBCdWZmZXIuaDogRGVmaW5lcyB0aGUgQnVmZmVyIGNsYXNzLCByZXByZXNlbnRpbmcgc3RvcmFnZSBvZiB2ZXJ0ZXggYW5kL29yCisvLyBpbmRleCBkYXRhLiBJbXBsZW1lbnRzIEdMIGJ1ZmZlciBvYmplY3RzIGFuZCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuCisvLyBbT3BlbkdMIEVTIDIuMC4yNF0gc2VjdGlvbiAyLjkgcGFnZSAyMS4KKworI2lmbmRlZiBMSUJHTEVTVjJfQlVGRkVSX0hfCisjZGVmaW5lIExJQkdMRVNWMl9CVUZGRVJfSF8KKworI2luY2x1ZGUgIlJlZkNvdW50T2JqZWN0LmgiCisjaW5jbHVkZSAiY29tbW9uL2FuZ2xldXRpbHMuaCIKKyNpbmNsdWRlICJDb21tb24vUmVzb3VyY2UuaHBwIgorCisjZGVmaW5lIEdMX0FQSUNBTEwKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgZ2wKK3sKK2NsYXNzIEJ1ZmZlciA6IHB1YmxpYyBSZWZDb3VudE9iamVjdAoreworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnVmZmVyKEdMdWludCBpZCk7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXIoKTsKKworICAgIHZvaWQgYnVmZmVyRGF0YShjb25zdCB2b2lkICpkYXRhLCBHTHNpemVpcHRyIHNpemUsIEdMZW51bSB1c2FnZSk7CisgICAgdm9pZCBidWZmZXJTdWJEYXRhKGNvbnN0IHZvaWQgKmRhdGEsIEdMc2l6ZWlwdHIgc2l6ZSwgR0xpbnRwdHIgb2Zmc2V0KTsKKworCWNvbnN0IHZvaWQgKmRhdGEoKSB7IHJldHVybiBtQ29udGVudHMgPyBtQ29udGVudHMtPmdldEJ1ZmZlcigpIDogMDsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBHTGVudW0gdXNhZ2UoKSBjb25zdCB7IHJldHVybiBtVXNhZ2U7IH0KKworCXN3OjpSZXNvdXJjZSAqZ2V0UmVzb3VyY2UoKTsKKworICBwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCdWZmZXIpOworCisgICAgc3c6OlJlc291cmNlICptQ29udGVudHM7CisgICAgc2l6ZV90IG1TaXplOworICAgIEdMZW51bSBtVXNhZ2U7Cit9OworCit9CisKKyNlbmRpZiAgIC8vIExJQkdMRVNWMl9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9Db250ZXh0LmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9Db250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2YyMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMzA0MyBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDExIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gQ29udGV4dC5jcHA6IEltcGxlbWVudHMgdGhlIGdsOjpDb250ZXh0IGNsYXNzLCBtYW5hZ2luZyBhbGwgR0wgc3RhdGUgYW5kIHBlcmZvcm1pbmcKKy8vIHJlbmRlcmluZyBvcGVyYXRpb25zLiBJdCBpcyB0aGUgR0xFUzIgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgRUdMQ29udGV4dC4KKworI2luY2x1ZGUgIkNvbnRleHQuaCIKKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJtYXRodXRpbC5oIgorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlci5oIgorI2luY2x1ZGUgIkJ1ZmZlci5oIgorI2luY2x1ZGUgIkZlbmNlLmgiCisjaW5jbHVkZSAiRnJhbWVCdWZmZXIuaCIKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisjaW5jbHVkZSAiUmVuZGVyQnVmZmVyLmgiCisjaW5jbHVkZSAiU2hhZGVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIlZlcnRleERhdGFNYW5hZ2VyLmgiCisjaW5jbHVkZSAiSW5kZXhEYXRhTWFuYWdlci5oIgorI2luY2x1ZGUgImxpYkVHTC9EaXNwbGF5LmgiCisjaW5jbHVkZSAiQ29tbW9uL0hhbGYuaHBwIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjdW5kZWYgbmVhcgorI3VuZGVmIGZhcgorCituYW1lc3BhY2UgZ2wKK3sKK0NvbnRleHQ6OkNvbnRleHQoY29uc3QgZWdsOjpDb25maWcgKmNvbmZpZywgY29uc3QgQ29udGV4dCAqc2hhcmVDb250ZXh0KSA6IG1Db25maWcoY29uZmlnKQoreworICAgIG1GZW5jZUhhbmRsZUFsbG9jYXRvci5zZXRCYXNlSGFuZGxlKDApOworCisgICAgc2V0Q2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKworICAgIG1TdGF0ZS5kZXB0aENsZWFyVmFsdWUgPSAxLjBmOworICAgIG1TdGF0ZS5zdGVuY2lsQ2xlYXJWYWx1ZSA9IDA7CisKKyAgICBtU3RhdGUuY3VsbEZhY2UgPSBmYWxzZTsKKyAgICBtU3RhdGUuY3VsbE1vZGUgPSBHTF9CQUNLOworICAgIG1TdGF0ZS5mcm9udEZhY2UgPSBHTF9DQ1c7CisgICAgbVN0YXRlLmRlcHRoVGVzdCA9IGZhbHNlOworICAgIG1TdGF0ZS5kZXB0aEZ1bmMgPSBHTF9MRVNTOworICAgIG1TdGF0ZS5ibGVuZCA9IGZhbHNlOworICAgIG1TdGF0ZS5zb3VyY2VCbGVuZFJHQiA9IEdMX09ORTsKKyAgICBtU3RhdGUuc291cmNlQmxlbmRBbHBoYSA9IEdMX09ORTsKKyAgICBtU3RhdGUuZGVzdEJsZW5kUkdCID0gR0xfWkVSTzsKKyAgICBtU3RhdGUuZGVzdEJsZW5kQWxwaGEgPSBHTF9aRVJPOworICAgIG1TdGF0ZS5ibGVuZEVxdWF0aW9uUkdCID0gR0xfRlVOQ19BREQ7CisgICAgbVN0YXRlLmJsZW5kRXF1YXRpb25BbHBoYSA9IEdMX0ZVTkNfQUREOworICAgIG1TdGF0ZS5ibGVuZENvbG9yLnJlZCA9IDA7CisgICAgbVN0YXRlLmJsZW5kQ29sb3IuZ3JlZW4gPSAwOworICAgIG1TdGF0ZS5ibGVuZENvbG9yLmJsdWUgPSAwOworICAgIG1TdGF0ZS5ibGVuZENvbG9yLmFscGhhID0gMDsKKyAgICBtU3RhdGUuc3RlbmNpbFRlc3QgPSBmYWxzZTsKKyAgICBtU3RhdGUuc3RlbmNpbEZ1bmMgPSBHTF9BTFdBWVM7CisgICAgbVN0YXRlLnN0ZW5jaWxSZWYgPSAwOworICAgIG1TdGF0ZS5zdGVuY2lsTWFzayA9IC0xOworICAgIG1TdGF0ZS5zdGVuY2lsV3JpdGVtYXNrID0gLTE7CisgICAgbVN0YXRlLnN0ZW5jaWxCYWNrRnVuYyA9IEdMX0FMV0FZUzsKKyAgICBtU3RhdGUuc3RlbmNpbEJhY2tSZWYgPSAwOworICAgIG1TdGF0ZS5zdGVuY2lsQmFja01hc2sgPSAtIDE7CisgICAgbVN0YXRlLnN0ZW5jaWxCYWNrV3JpdGVtYXNrID0gLTE7CisgICAgbVN0YXRlLnN0ZW5jaWxGYWlsID0gR0xfS0VFUDsKKyAgICBtU3RhdGUuc3RlbmNpbFBhc3NEZXB0aEZhaWwgPSBHTF9LRUVQOworICAgIG1TdGF0ZS5zdGVuY2lsUGFzc0RlcHRoUGFzcyA9IEdMX0tFRVA7CisgICAgbVN0YXRlLnN0ZW5jaWxCYWNrRmFpbCA9IEdMX0tFRVA7CisgICAgbVN0YXRlLnN0ZW5jaWxCYWNrUGFzc0RlcHRoRmFpbCA9IEdMX0tFRVA7CisgICAgbVN0YXRlLnN0ZW5jaWxCYWNrUGFzc0RlcHRoUGFzcyA9IEdMX0tFRVA7CisgICAgbVN0YXRlLnBvbHlnb25PZmZzZXRGaWxsID0gZmFsc2U7CisgICAgbVN0YXRlLnBvbHlnb25PZmZzZXRGYWN0b3IgPSAwLjBmOworICAgIG1TdGF0ZS5wb2x5Z29uT2Zmc2V0VW5pdHMgPSAwLjBmOworICAgIG1TdGF0ZS5zYW1wbGVBbHBoYVRvQ292ZXJhZ2UgPSBmYWxzZTsKKyAgICBtU3RhdGUuc2FtcGxlQ292ZXJhZ2UgPSBmYWxzZTsKKyAgICBtU3RhdGUuc2FtcGxlQ292ZXJhZ2VWYWx1ZSA9IDEuMGY7CisgICAgbVN0YXRlLnNhbXBsZUNvdmVyYWdlSW52ZXJ0ID0gZmFsc2U7CisgICAgbVN0YXRlLnNjaXNzb3JUZXN0ID0gZmFsc2U7CisgICAgbVN0YXRlLmRpdGhlciA9IHRydWU7CisgICAgbVN0YXRlLmdlbmVyYXRlTWlwbWFwSGludCA9IEdMX0RPTlRfQ0FSRTsKKyAgICBtU3RhdGUuZnJhZ21lbnRTaGFkZXJEZXJpdmF0aXZlSGludCA9IEdMX0RPTlRfQ0FSRTsKKworICAgIG1TdGF0ZS5saW5lV2lkdGggPSAxLjBmOworCisgICAgbVN0YXRlLnZpZXdwb3J0WCA9IDA7CisgICAgbVN0YXRlLnZpZXdwb3J0WSA9IDA7CisgICAgbVN0YXRlLnZpZXdwb3J0V2lkdGggPSBjb25maWctPm1EaXNwbGF5TW9kZS53aWR0aDsKKyAgICBtU3RhdGUudmlld3BvcnRIZWlnaHQgPSBjb25maWctPm1EaXNwbGF5TW9kZS5oZWlnaHQ7CisgICAgbVN0YXRlLnpOZWFyID0gMC4wZjsKKyAgICBtU3RhdGUuekZhciA9IDEuMGY7CisKKyAgICBtU3RhdGUuc2Npc3NvclggPSAwOworICAgIG1TdGF0ZS5zY2lzc29yWSA9IDA7CisgICAgbVN0YXRlLnNjaXNzb3JXaWR0aCA9IGNvbmZpZy0+bURpc3BsYXlNb2RlLndpZHRoOworICAgIG1TdGF0ZS5zY2lzc29ySGVpZ2h0ID0gY29uZmlnLT5tRGlzcGxheU1vZGUuaGVpZ2h0OworCisgICAgbVN0YXRlLmNvbG9yTWFza1JlZCA9IHRydWU7CisgICAgbVN0YXRlLmNvbG9yTWFza0dyZWVuID0gdHJ1ZTsKKyAgICBtU3RhdGUuY29sb3JNYXNrQmx1ZSA9IHRydWU7CisgICAgbVN0YXRlLmNvbG9yTWFza0FscGhhID0gdHJ1ZTsKKyAgICBtU3RhdGUuZGVwdGhNYXNrID0gdHJ1ZTsKKworICAgIGlmKHNoYXJlQ29udGV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbVJlc291cmNlTWFuYWdlciA9IHNoYXJlQ29udGV4dC0+bVJlc291cmNlTWFuYWdlcjsKKyAgICAgICAgbVJlc291cmNlTWFuYWdlci0+YWRkUmVmKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1SZXNvdXJjZU1hbmFnZXIgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyKCk7CisgICAgfQorCisgICAgLy8gW09wZW5HTCBFUyAyLjAuMjRdIHNlY3Rpb24gMy43IHBhZ2UgODM6CisgICAgLy8gSW4gdGhlIGluaXRpYWwgc3RhdGUsIFRFWFRVUkVfMkQgYW5kIFRFWFRVUkVfQ1VCRV9NQVAgaGF2ZSB0d29kaW1lbnNpb25hbAorICAgIC8vIGFuZCBjdWJlIG1hcCB0ZXh0dXJlIHN0YXRlIHZlY3RvcnMgcmVzcGVjdGl2ZWx5IGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorICAgIC8vIEluIG9yZGVyIHRoYXQgYWNjZXNzIHRvIHRoZXNlIGluaXRpYWwgdGV4dHVyZXMgbm90IGJlIGxvc3QsIHRoZXkgYXJlIHRyZWF0ZWQgYXMgdGV4dHVyZQorICAgIC8vIG9iamVjdHMgYWxsIG9mIHdob3NlIG5hbWVzIGFyZSAwLgorCisgICAgbVRleHR1cmUyRFplcm8uc2V0KG5ldyBUZXh0dXJlMkQoMCkpOworICAgIG1UZXh0dXJlQ3ViZU1hcFplcm8uc2V0KG5ldyBUZXh0dXJlQ3ViZU1hcCgwKSk7CisKKyAgICBtU3RhdGUuYWN0aXZlU2FtcGxlciA9IDA7CisgICAgYmluZEFycmF5QnVmZmVyKDApOworICAgIGJpbmRFbGVtZW50QXJyYXlCdWZmZXIoMCk7CisgICAgYmluZFRleHR1cmVDdWJlTWFwKDApOworICAgIGJpbmRUZXh0dXJlMkQoMCk7CisgICAgYmluZFJlYWRGcmFtZWJ1ZmZlcigwKTsKKyAgICBiaW5kRHJhd0ZyYW1lYnVmZmVyKDApOworICAgIGJpbmRSZW5kZXJidWZmZXIoMCk7CisKKyAgICBtU3RhdGUuY3VycmVudFByb2dyYW0gPSAwOworCisgICAgbVN0YXRlLnBhY2tBbGlnbm1lbnQgPSA0OworICAgIG1TdGF0ZS51bnBhY2tBbGlnbm1lbnQgPSA0OworCisgICAgbVZlcnRleERhdGFNYW5hZ2VyID0gTlVMTDsKKyAgICBtSW5kZXhEYXRhTWFuYWdlciA9IE5VTEw7CisKKyAgICBtSW52YWxpZEVudW0gPSBmYWxzZTsKKyAgICBtSW52YWxpZFZhbHVlID0gZmFsc2U7CisgICAgbUludmFsaWRPcGVyYXRpb24gPSBmYWxzZTsKKyAgICBtT3V0T2ZNZW1vcnkgPSBmYWxzZTsKKyAgICBtSW52YWxpZEZyYW1lYnVmZmVyT3BlcmF0aW9uID0gZmFsc2U7CisKKyAgICBtSGFzQmVlbkN1cnJlbnQgPSBmYWxzZTsKKworICAgIG1hcmtBbGxTdGF0ZURpcnR5KCk7Cit9CisKK0NvbnRleHQ6On5Db250ZXh0KCkKK3sKKyAgICBpZihtU3RhdGUuY3VycmVudFByb2dyYW0gIT0gMCkKKyAgICB7CisgICAgICAgIFByb2dyYW0gKnByb2dyYW1PYmplY3QgPSBtUmVzb3VyY2VNYW5hZ2VyLT5nZXRQcm9ncmFtKG1TdGF0ZS5jdXJyZW50UHJvZ3JhbSk7CisgICAgICAgIGlmKHByb2dyYW1PYmplY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb2dyYW1PYmplY3QtPnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBtU3RhdGUuY3VycmVudFByb2dyYW0gPSAwOworICAgIH0KKworICAgIHdoaWxlKCFtRnJhbWVidWZmZXJNYXAuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGRlbGV0ZUZyYW1lYnVmZmVyKG1GcmFtZWJ1ZmZlck1hcC5iZWdpbigpLT5maXJzdCk7CisgICAgfQorCisgICAgd2hpbGUoIW1GZW5jZU1hcC5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgZGVsZXRlRmVuY2UobUZlbmNlTWFwLmJlZ2luKCktPmZpcnN0KTsKKyAgICB9CisKKyAgICB3aGlsZSghbU11bHRpU2FtcGxlU3VwcG9ydC5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgZGVsZXRlIFtdIG1NdWx0aVNhbXBsZVN1cHBvcnQuYmVnaW4oKS0+c2Vjb25kOworICAgICAgICBtTXVsdGlTYW1wbGVTdXBwb3J0LmVyYXNlKG1NdWx0aVNhbXBsZVN1cHBvcnQuYmVnaW4oKSk7CisgICAgfQorCisgICAgZm9yKGludCB0eXBlID0gMDsgdHlwZSA8IFRFWFRVUkVfVFlQRV9DT1VOVDsgdHlwZSsrKQorICAgIHsKKyAgICAgICAgZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8IE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOyBzYW1wbGVyKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG1TdGF0ZS5zYW1wbGVyVGV4dHVyZVt0eXBlXVtzYW1wbGVyXS5zZXQoTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1ZFUlRFWF9BVFRSSUJTOyBpKyspCisgICAgeworICAgICAgICBtU3RhdGUudmVydGV4QXR0cmlidXRlW2ldLm1Cb3VuZEJ1ZmZlci5zZXQoTlVMTCk7CisgICAgfQorCisgICAgbVN0YXRlLmFycmF5QnVmZmVyLnNldChOVUxMKTsKKyAgICBtU3RhdGUuZWxlbWVudEFycmF5QnVmZmVyLnNldChOVUxMKTsKKyAgICBtU3RhdGUucmVuZGVyYnVmZmVyLnNldChOVUxMKTsKKworICAgIG1UZXh0dXJlMkRaZXJvLnNldChOVUxMKTsKKyAgICBtVGV4dHVyZUN1YmVNYXBaZXJvLnNldChOVUxMKTsKKworICAgIGRlbGV0ZSBtVmVydGV4RGF0YU1hbmFnZXI7CisgICAgZGVsZXRlIG1JbmRleERhdGFNYW5hZ2VyOworCisgICAgbVJlc291cmNlTWFuYWdlci0+cmVsZWFzZSgpOworfQorCit2b2lkIENvbnRleHQ6Om1ha2VDdXJyZW50KGVnbDo6RGlzcGxheSAqZGlzcGxheSwgZWdsOjpTdXJmYWNlICpzdXJmYWNlKQoreworICAgIERldmljZSAqZGV2aWNlID0gZGlzcGxheS0+Z2V0RGV2aWNlKCk7CisKKyAgICBpZighbUhhc0JlZW5DdXJyZW50KQorICAgIHsKKyAgICAgICAgbVZlcnRleERhdGFNYW5hZ2VyID0gbmV3IFZlcnRleERhdGFNYW5hZ2VyKHRoaXMsIGRldmljZSk7CisgICAgICAgIG1JbmRleERhdGFNYW5hZ2VyID0gbmV3IEluZGV4RGF0YU1hbmFnZXIodGhpcywgZGV2aWNlKTsKKworICAgICAgICBjb25zdCBzdzo6Rm9ybWF0IHJlbmRlckJ1ZmZlckZvcm1hdHNbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3OjpGT1JNQVRfQThSOEc4QjgsCisgICAgICAgICAgICBzdzo6Rk9STUFUX1g4UjhHOEI4LAorICAgICAgICAgICAgc3c6OkZPUk1BVF9SNUc2QjUsCisgICAgICAgICAgICBzdzo6Rk9STUFUX0QyNFM4CisgICAgICAgIH07CisKKyAgICAgICAgaW5pdEV4dGVuc2lvblN0cmluZygpOworCisgICAgICAgIG1TdGF0ZS52aWV3cG9ydFggPSAwOworICAgICAgICBtU3RhdGUudmlld3BvcnRZID0gMDsKKyAgICAgICAgbVN0YXRlLnZpZXdwb3J0V2lkdGggPSBzdXJmYWNlLT5nZXRXaWR0aCgpOworICAgICAgICBtU3RhdGUudmlld3BvcnRIZWlnaHQgPSBzdXJmYWNlLT5nZXRIZWlnaHQoKTsKKworICAgICAgICBtU3RhdGUuc2Npc3NvclggPSAwOworICAgICAgICBtU3RhdGUuc2Npc3NvclkgPSAwOworICAgICAgICBtU3RhdGUuc2Npc3NvcldpZHRoID0gc3VyZmFjZS0+Z2V0V2lkdGgoKTsKKyAgICAgICAgbVN0YXRlLnNjaXNzb3JIZWlnaHQgPSBzdXJmYWNlLT5nZXRIZWlnaHQoKTsKKworICAgICAgICBtSGFzQmVlbkN1cnJlbnQgPSB0cnVlOworICAgIH0KKworICAgIC8vIFdyYXAgdGhlIGV4aXN0aW5nIHJlc291cmNlcyBpbnRvIEdMIG9iamVjdHMgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSAnMCcgbmFtZXMKKyAgICBJbWFnZSAqZGVmYXVsdFJlbmRlclRhcmdldCA9IHN1cmZhY2UtPmdldFJlbmRlclRhcmdldCgpOworICAgIEltYWdlICpkZXB0aFN0ZW5jaWwgPSBzdXJmYWNlLT5nZXREZXB0aFN0ZW5jaWwoKTsKKworICAgIENvbG9yYnVmZmVyICpjb2xvcmJ1ZmZlclplcm8gPSBuZXcgQ29sb3JidWZmZXIoZGVmYXVsdFJlbmRlclRhcmdldCk7CisgICAgRGVwdGhTdGVuY2lsYnVmZmVyICpkZXB0aFN0ZW5jaWxidWZmZXJaZXJvID0gbmV3IERlcHRoU3RlbmNpbGJ1ZmZlcihkZXB0aFN0ZW5jaWwpOworICAgIEZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlclplcm8gPSBuZXcgRGVmYXVsdEZyYW1lYnVmZmVyKGNvbG9yYnVmZmVyWmVybywgZGVwdGhTdGVuY2lsYnVmZmVyWmVybyk7CisKKyAgICBzZXRGcmFtZWJ1ZmZlclplcm8oZnJhbWVidWZmZXJaZXJvKTsKKworICAgIGlmKGRlZmF1bHRSZW5kZXJUYXJnZXQpCisgICAgeworICAgICAgICBkZWZhdWx0UmVuZGVyVGFyZ2V0LT5yZWxlYXNlKCk7CisgICAgfQorCisgICAgaWYoZGVwdGhTdGVuY2lsKQorICAgIHsKKyAgICAgICAgZGVwdGhTdGVuY2lsLT5yZWxlYXNlKCk7CisgICAgfQorICAgIAorICAgIG1hcmtBbGxTdGF0ZURpcnR5KCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgYWxsIG9mIHRoZSBzdGF0ZS1yZWxhdGVkIGRpcnR5IGZsYWdzLCBzbyB0aGF0IGFsbCBzdGF0ZSBpcyBzZXQgZHVyaW5nIG5leHQgcHJlLWRyYXcuCit2b2lkIENvbnRleHQ6Om1hcmtBbGxTdGF0ZURpcnR5KCkKK3sKKyAgICBtQXBwbGllZFByb2dyYW1TZXJpYWwgPSAwOworICAgIG1BcHBsaWVkUmVuZGVyVGFyZ2V0U2VyaWFsID0gMDsKKyAgICBtQXBwbGllZERlcHRoYnVmZmVyU2VyaWFsID0gMDsKKyAgICBtQXBwbGllZFN0ZW5jaWxidWZmZXJTZXJpYWwgPSAwOworICAgIG1EZXB0aFN0ZW5jaWxJbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgbUNsZWFyU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgbUN1bGxTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICBtRGVwdGhTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICBtTWFza1N0YXRlRGlydHkgPSB0cnVlOworICAgIG1CbGVuZFN0YXRlRGlydHkgPSB0cnVlOworICAgIG1TdGVuY2lsU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgbVBvbHlnb25PZmZzZXRTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICBtU2Npc3NvclN0YXRlRGlydHkgPSB0cnVlOworICAgIG1TYW1wbGVTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICBtRGl0aGVyU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgbUZyb250RmFjZURpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBDb250ZXh0OjpzZXRDbGVhckNvbG9yKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKQoreworICAgIG1TdGF0ZS5jb2xvckNsZWFyVmFsdWUucmVkID0gcmVkOworICAgIG1TdGF0ZS5jb2xvckNsZWFyVmFsdWUuZ3JlZW4gPSBncmVlbjsKKyAgICBtU3RhdGUuY29sb3JDbGVhclZhbHVlLmJsdWUgPSBibHVlOworICAgIG1TdGF0ZS5jb2xvckNsZWFyVmFsdWUuYWxwaGEgPSBhbHBoYTsKK30KKwordm9pZCBDb250ZXh0OjpzZXRDbGVhckRlcHRoKGZsb2F0IGRlcHRoKQoreworICAgIG1TdGF0ZS5kZXB0aENsZWFyVmFsdWUgPSBkZXB0aDsKK30KKwordm9pZCBDb250ZXh0OjpzZXRDbGVhclN0ZW5jaWwoaW50IHN0ZW5jaWwpCit7CisgICAgbVN0YXRlLnN0ZW5jaWxDbGVhclZhbHVlID0gc3RlbmNpbDsKK30KKwordm9pZCBDb250ZXh0OjpzZXRDdWxsRmFjZShib29sIGVuYWJsZWQpCit7CisgICAgaWYobVN0YXRlLmN1bGxGYWNlICE9IGVuYWJsZWQpCisgICAgeworICAgICAgICBtU3RhdGUuY3VsbEZhY2UgPSBlbmFibGVkOworICAgICAgICBtQ3VsbFN0YXRlRGlydHkgPSB0cnVlOworICAgIH0KK30KKworYm9vbCBDb250ZXh0Ojppc0N1bGxGYWNlRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdGF0ZS5jdWxsRmFjZTsKK30KKwordm9pZCBDb250ZXh0OjpzZXRDdWxsTW9kZShHTGVudW0gbW9kZSkKK3sKKyAgICBpZihtU3RhdGUuY3VsbE1vZGUgIT0gbW9kZSkKKyAgICB7CisgICAgICAgIG1TdGF0ZS5jdWxsTW9kZSA9IG1vZGU7CisgICAgICAgIG1DdWxsU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIENvbnRleHQ6OnNldEZyb250RmFjZShHTGVudW0gZnJvbnQpCit7CisgICAgaWYobVN0YXRlLmZyb250RmFjZSAhPSBmcm9udCkKKyAgICB7CisgICAgICAgIG1TdGF0ZS5mcm9udEZhY2UgPSBmcm9udDsKKyAgICAgICAgbUZyb250RmFjZURpcnR5ID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0RGVwdGhUZXN0KGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZihtU3RhdGUuZGVwdGhUZXN0ICE9IGVuYWJsZWQpCisgICAgeworICAgICAgICBtU3RhdGUuZGVwdGhUZXN0ID0gZW5hYmxlZDsKKyAgICAgICAgbURlcHRoU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCitib29sIENvbnRleHQ6OmlzRGVwdGhUZXN0RW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdGF0ZS5kZXB0aFRlc3Q7Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0RGVwdGhGdW5jKEdMZW51bSBkZXB0aEZ1bmMpCit7CisgICAgaWYobVN0YXRlLmRlcHRoRnVuYyAhPSBkZXB0aEZ1bmMpCisgICAgeworICAgICAgICBtU3RhdGUuZGVwdGhGdW5jID0gZGVwdGhGdW5jOworICAgICAgICBtRGVwdGhTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0RGVwdGhSYW5nZShmbG9hdCB6TmVhciwgZmxvYXQgekZhcikKK3sKKyAgICBtU3RhdGUuek5lYXIgPSB6TmVhcjsKKyAgICBtU3RhdGUuekZhciA9IHpGYXI7Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0QmxlbmQoYm9vbCBlbmFibGVkKQoreworICAgIGlmKG1TdGF0ZS5ibGVuZCAhPSBlbmFibGVkKQorICAgIHsKKyAgICAgICAgbVN0YXRlLmJsZW5kID0gZW5hYmxlZDsKKyAgICAgICAgbUJsZW5kU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCitib29sIENvbnRleHQ6OmlzQmxlbmRFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXRlLmJsZW5kOworfQorCit2b2lkIENvbnRleHQ6OnNldEJsZW5kRmFjdG9ycyhHTGVudW0gc291cmNlUkdCLCBHTGVudW0gZGVzdFJHQiwgR0xlbnVtIHNvdXJjZUFscGhhLCBHTGVudW0gZGVzdEFscGhhKQoreworICAgIGlmKG1TdGF0ZS5zb3VyY2VCbGVuZFJHQiAhPSBzb3VyY2VSR0IgfHwKKyAgICAgICBtU3RhdGUuc291cmNlQmxlbmRBbHBoYSAhPSBzb3VyY2VBbHBoYSB8fAorICAgICAgIG1TdGF0ZS5kZXN0QmxlbmRSR0IgIT0gZGVzdFJHQiB8fAorICAgICAgIG1TdGF0ZS5kZXN0QmxlbmRBbHBoYSAhPSBkZXN0QWxwaGEpCisgICAgeworICAgICAgICBtU3RhdGUuc291cmNlQmxlbmRSR0IgPSBzb3VyY2VSR0I7CisgICAgICAgIG1TdGF0ZS5kZXN0QmxlbmRSR0IgPSBkZXN0UkdCOworICAgICAgICBtU3RhdGUuc291cmNlQmxlbmRBbHBoYSA9IHNvdXJjZUFscGhhOworICAgICAgICBtU3RhdGUuZGVzdEJsZW5kQWxwaGEgPSBkZXN0QWxwaGE7CisgICAgICAgIG1CbGVuZFN0YXRlRGlydHkgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBDb250ZXh0OjpzZXRCbGVuZENvbG9yKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKQoreworICAgIGlmKG1TdGF0ZS5ibGVuZENvbG9yLnJlZCAhPSByZWQgfHwKKyAgICAgICBtU3RhdGUuYmxlbmRDb2xvci5ncmVlbiAhPSBncmVlbiB8fAorICAgICAgIG1TdGF0ZS5ibGVuZENvbG9yLmJsdWUgIT0gYmx1ZSB8fAorICAgICAgIG1TdGF0ZS5ibGVuZENvbG9yLmFscGhhICE9IGFscGhhKQorICAgIHsKKyAgICAgICAgbVN0YXRlLmJsZW5kQ29sb3IucmVkID0gcmVkOworICAgICAgICBtU3RhdGUuYmxlbmRDb2xvci5ncmVlbiA9IGdyZWVuOworICAgICAgICBtU3RhdGUuYmxlbmRDb2xvci5ibHVlID0gYmx1ZTsKKyAgICAgICAgbVN0YXRlLmJsZW5kQ29sb3IuYWxwaGEgPSBhbHBoYTsKKyAgICAgICAgbUJsZW5kU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIENvbnRleHQ6OnNldEJsZW5kRXF1YXRpb24oR0xlbnVtIHJnYkVxdWF0aW9uLCBHTGVudW0gYWxwaGFFcXVhdGlvbikKK3sKKyAgICBpZihtU3RhdGUuYmxlbmRFcXVhdGlvblJHQiAhPSByZ2JFcXVhdGlvbiB8fAorICAgICAgIG1TdGF0ZS5ibGVuZEVxdWF0aW9uQWxwaGEgIT0gYWxwaGFFcXVhdGlvbikKKyAgICB7CisgICAgICAgIG1TdGF0ZS5ibGVuZEVxdWF0aW9uUkdCID0gcmdiRXF1YXRpb247CisgICAgICAgIG1TdGF0ZS5ibGVuZEVxdWF0aW9uQWxwaGEgPSBhbHBoYUVxdWF0aW9uOworICAgICAgICBtQmxlbmRTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0U3RlbmNpbFRlc3QoYm9vbCBlbmFibGVkKQoreworICAgIGlmKG1TdGF0ZS5zdGVuY2lsVGVzdCAhPSBlbmFibGVkKQorICAgIHsKKyAgICAgICAgbVN0YXRlLnN0ZW5jaWxUZXN0ID0gZW5hYmxlZDsKKyAgICAgICAgbVN0ZW5jaWxTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICB9Cit9CisKK2Jvb2wgQ29udGV4dDo6aXNTdGVuY2lsVGVzdEVuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiBtU3RhdGUuc3RlbmNpbFRlc3Q7Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0U3RlbmNpbFBhcmFtcyhHTGVudW0gc3RlbmNpbEZ1bmMsIEdMaW50IHN0ZW5jaWxSZWYsIEdMdWludCBzdGVuY2lsTWFzaykKK3sKKyAgICBpZihtU3RhdGUuc3RlbmNpbEZ1bmMgIT0gc3RlbmNpbEZ1bmMgfHwKKyAgICAgICAgbVN0YXRlLnN0ZW5jaWxSZWYgIT0gc3RlbmNpbFJlZiB8fAorICAgICAgICBtU3RhdGUuc3RlbmNpbE1hc2sgIT0gc3RlbmNpbE1hc2spCisgICAgeworICAgICAgICBtU3RhdGUuc3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYzsKKyAgICAgICAgbVN0YXRlLnN0ZW5jaWxSZWYgPSAoc3RlbmNpbFJlZiA+IDApID8gc3RlbmNpbFJlZiA6IDA7CisgICAgICAgIG1TdGF0ZS5zdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrOworICAgICAgICBtU3RlbmNpbFN0YXRlRGlydHkgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBDb250ZXh0OjpzZXRTdGVuY2lsQmFja1BhcmFtcyhHTGVudW0gc3RlbmNpbEJhY2tGdW5jLCBHTGludCBzdGVuY2lsQmFja1JlZiwgR0x1aW50IHN0ZW5jaWxCYWNrTWFzaykKK3sKKyAgICBpZihtU3RhdGUuc3RlbmNpbEJhY2tGdW5jICE9IHN0ZW5jaWxCYWNrRnVuYyB8fAorICAgICAgICBtU3RhdGUuc3RlbmNpbEJhY2tSZWYgIT0gc3RlbmNpbEJhY2tSZWYgfHwKKyAgICAgICAgbVN0YXRlLnN0ZW5jaWxCYWNrTWFzayAhPSBzdGVuY2lsQmFja01hc2spCisgICAgeworICAgICAgICBtU3RhdGUuc3RlbmNpbEJhY2tGdW5jID0gc3RlbmNpbEJhY2tGdW5jOworICAgICAgICBtU3RhdGUuc3RlbmNpbEJhY2tSZWYgPSAoc3RlbmNpbEJhY2tSZWYgPiAwKSA/IHN0ZW5jaWxCYWNrUmVmIDogMDsKKyAgICAgICAgbVN0YXRlLnN0ZW5jaWxCYWNrTWFzayA9IHN0ZW5jaWxCYWNrTWFzazsKKyAgICAgICAgbVN0ZW5jaWxTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0U3RlbmNpbFdyaXRlbWFzayhHTHVpbnQgc3RlbmNpbFdyaXRlbWFzaykKK3sKKyAgICBpZihtU3RhdGUuc3RlbmNpbFdyaXRlbWFzayAhPSBzdGVuY2lsV3JpdGVtYXNrKQorICAgIHsKKyAgICAgICAgbVN0YXRlLnN0ZW5jaWxXcml0ZW1hc2sgPSBzdGVuY2lsV3JpdGVtYXNrOworICAgICAgICBtU3RlbmNpbFN0YXRlRGlydHkgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBDb250ZXh0OjpzZXRTdGVuY2lsQmFja1dyaXRlbWFzayhHTHVpbnQgc3RlbmNpbEJhY2tXcml0ZW1hc2spCit7CisgICAgaWYobVN0YXRlLnN0ZW5jaWxCYWNrV3JpdGVtYXNrICE9IHN0ZW5jaWxCYWNrV3JpdGVtYXNrKQorICAgIHsKKyAgICAgICAgbVN0YXRlLnN0ZW5jaWxCYWNrV3JpdGVtYXNrID0gc3RlbmNpbEJhY2tXcml0ZW1hc2s7CisgICAgICAgIG1TdGVuY2lsU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIENvbnRleHQ6OnNldFN0ZW5jaWxPcGVyYXRpb25zKEdMZW51bSBzdGVuY2lsRmFpbCwgR0xlbnVtIHN0ZW5jaWxQYXNzRGVwdGhGYWlsLCBHTGVudW0gc3RlbmNpbFBhc3NEZXB0aFBhc3MpCit7CisgICAgaWYobVN0YXRlLnN0ZW5jaWxGYWlsICE9IHN0ZW5jaWxGYWlsIHx8CisgICAgICAgIG1TdGF0ZS5zdGVuY2lsUGFzc0RlcHRoRmFpbCAhPSBzdGVuY2lsUGFzc0RlcHRoRmFpbCB8fAorICAgICAgICBtU3RhdGUuc3RlbmNpbFBhc3NEZXB0aFBhc3MgIT0gc3RlbmNpbFBhc3NEZXB0aFBhc3MpCisgICAgeworICAgICAgICBtU3RhdGUuc3RlbmNpbEZhaWwgPSBzdGVuY2lsRmFpbDsKKyAgICAgICAgbVN0YXRlLnN0ZW5jaWxQYXNzRGVwdGhGYWlsID0gc3RlbmNpbFBhc3NEZXB0aEZhaWw7CisgICAgICAgIG1TdGF0ZS5zdGVuY2lsUGFzc0RlcHRoUGFzcyA9IHN0ZW5jaWxQYXNzRGVwdGhQYXNzOworICAgICAgICBtU3RlbmNpbFN0YXRlRGlydHkgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBDb250ZXh0OjpzZXRTdGVuY2lsQmFja09wZXJhdGlvbnMoR0xlbnVtIHN0ZW5jaWxCYWNrRmFpbCwgR0xlbnVtIHN0ZW5jaWxCYWNrUGFzc0RlcHRoRmFpbCwgR0xlbnVtIHN0ZW5jaWxCYWNrUGFzc0RlcHRoUGFzcykKK3sKKyAgICBpZihtU3RhdGUuc3RlbmNpbEJhY2tGYWlsICE9IHN0ZW5jaWxCYWNrRmFpbCB8fAorICAgICAgICBtU3RhdGUuc3RlbmNpbEJhY2tQYXNzRGVwdGhGYWlsICE9IHN0ZW5jaWxCYWNrUGFzc0RlcHRoRmFpbCB8fAorICAgICAgICBtU3RhdGUuc3RlbmNpbEJhY2tQYXNzRGVwdGhQYXNzICE9IHN0ZW5jaWxCYWNrUGFzc0RlcHRoUGFzcykKKyAgICB7CisgICAgICAgIG1TdGF0ZS5zdGVuY2lsQmFja0ZhaWwgPSBzdGVuY2lsQmFja0ZhaWw7CisgICAgICAgIG1TdGF0ZS5zdGVuY2lsQmFja1Bhc3NEZXB0aEZhaWwgPSBzdGVuY2lsQmFja1Bhc3NEZXB0aEZhaWw7CisgICAgICAgIG1TdGF0ZS5zdGVuY2lsQmFja1Bhc3NEZXB0aFBhc3MgPSBzdGVuY2lsQmFja1Bhc3NEZXB0aFBhc3M7CisgICAgICAgIG1TdGVuY2lsU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIENvbnRleHQ6OnNldFBvbHlnb25PZmZzZXRGaWxsKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZihtU3RhdGUucG9seWdvbk9mZnNldEZpbGwgIT0gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIG1TdGF0ZS5wb2x5Z29uT2Zmc2V0RmlsbCA9IGVuYWJsZWQ7CisgICAgICAgIG1Qb2x5Z29uT2Zmc2V0U3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCitib29sIENvbnRleHQ6OmlzUG9seWdvbk9mZnNldEZpbGxFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXRlLnBvbHlnb25PZmZzZXRGaWxsOworCit9CisKK3ZvaWQgQ29udGV4dDo6c2V0UG9seWdvbk9mZnNldFBhcmFtcyhHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykKK3sKKyAgICBpZihtU3RhdGUucG9seWdvbk9mZnNldEZhY3RvciAhPSBmYWN0b3IgfHwKKyAgICAgICAgbVN0YXRlLnBvbHlnb25PZmZzZXRVbml0cyAhPSB1bml0cykKKyAgICB7CisgICAgICAgIG1TdGF0ZS5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yOworICAgICAgICBtU3RhdGUucG9seWdvbk9mZnNldFVuaXRzID0gdW5pdHM7CisgICAgICAgIG1Qb2x5Z29uT2Zmc2V0U3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIENvbnRleHQ6OnNldFNhbXBsZUFscGhhVG9Db3ZlcmFnZShib29sIGVuYWJsZWQpCit7CisgICAgaWYobVN0YXRlLnNhbXBsZUFscGhhVG9Db3ZlcmFnZSAhPSBlbmFibGVkKQorICAgIHsKKyAgICAgICAgbVN0YXRlLnNhbXBsZUFscGhhVG9Db3ZlcmFnZSA9IGVuYWJsZWQ7CisgICAgICAgIG1TYW1wbGVTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICB9Cit9CisKK2Jvb2wgQ29udGV4dDo6aXNTYW1wbGVBbHBoYVRvQ292ZXJhZ2VFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXRlLnNhbXBsZUFscGhhVG9Db3ZlcmFnZTsKK30KKwordm9pZCBDb250ZXh0OjpzZXRTYW1wbGVDb3ZlcmFnZShib29sIGVuYWJsZWQpCit7CisgICAgaWYobVN0YXRlLnNhbXBsZUNvdmVyYWdlICE9IGVuYWJsZWQpCisgICAgeworICAgICAgICBtU3RhdGUuc2FtcGxlQ292ZXJhZ2UgPSBlbmFibGVkOworICAgICAgICBtU2FtcGxlU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCitib29sIENvbnRleHQ6OmlzU2FtcGxlQ292ZXJhZ2VFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXRlLnNhbXBsZUNvdmVyYWdlOworfQorCit2b2lkIENvbnRleHQ6OnNldFNhbXBsZUNvdmVyYWdlUGFyYW1zKEdMY2xhbXBmIHZhbHVlLCBib29sIGludmVydCkKK3sKKyAgICBpZihtU3RhdGUuc2FtcGxlQ292ZXJhZ2VWYWx1ZSAhPSB2YWx1ZSB8fAorICAgICAgICBtU3RhdGUuc2FtcGxlQ292ZXJhZ2VJbnZlcnQgIT0gaW52ZXJ0KQorICAgIHsKKyAgICAgICAgbVN0YXRlLnNhbXBsZUNvdmVyYWdlVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgbVN0YXRlLnNhbXBsZUNvdmVyYWdlSW52ZXJ0ID0gaW52ZXJ0OworICAgICAgICBtU2FtcGxlU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIENvbnRleHQ6OnNldFNjaXNzb3JUZXN0KGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZihtU3RhdGUuc2Npc3NvclRlc3QgIT0gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIG1TdGF0ZS5zY2lzc29yVGVzdCA9IGVuYWJsZWQ7CisgICAgICAgIG1TY2lzc29yU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCitib29sIENvbnRleHQ6OmlzU2Npc3NvclRlc3RFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXRlLnNjaXNzb3JUZXN0OworfQorCit2b2lkIENvbnRleHQ6OnNldERpdGhlcihib29sIGVuYWJsZWQpCit7CisgICAgaWYobVN0YXRlLmRpdGhlciAhPSBlbmFibGVkKQorICAgIHsKKyAgICAgICAgbVN0YXRlLmRpdGhlciA9IGVuYWJsZWQ7CisgICAgICAgIG1EaXRoZXJTdGF0ZURpcnR5ID0gdHJ1ZTsKKyAgICB9Cit9CisKK2Jvb2wgQ29udGV4dDo6aXNEaXRoZXJFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXRlLmRpdGhlcjsKK30KKwordm9pZCBDb250ZXh0OjpzZXRMaW5lV2lkdGgoR0xmbG9hdCB3aWR0aCkKK3sKKyAgICBtU3RhdGUubGluZVdpZHRoID0gd2lkdGg7Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0R2VuZXJhdGVNaXBtYXBIaW50KEdMZW51bSBoaW50KQoreworICAgIG1TdGF0ZS5nZW5lcmF0ZU1pcG1hcEhpbnQgPSBoaW50OworfQorCit2b2lkIENvbnRleHQ6OnNldEZyYWdtZW50U2hhZGVyRGVyaXZhdGl2ZUhpbnQoR0xlbnVtIGhpbnQpCit7CisgICAgbVN0YXRlLmZyYWdtZW50U2hhZGVyRGVyaXZhdGl2ZUhpbnQgPSBoaW50OworICAgIC8vIFRPRE86IFByb3BhZ2F0ZSB0aGUgaGludCB0byBzaGFkZXIgdHJhbnNsYXRvciBzbyB3ZSBjYW4gd3JpdGUKKyAgICAvLyBkZHgsIGRkeF9jb2Fyc2UsIG9yIGRkeF9maW5lIGRlcGVuZGluZyBvbiB0aGUgaGludC4KKyAgICAvLyBJZ25vcmUgZm9yIG5vdy4gSXQgaXMgdmFsaWQgZm9yIGltcGxlbWVudGF0aW9ucyB0byBpZ25vcmUgaGludC4KK30KKwordm9pZCBDb250ZXh0OjpzZXRWaWV3cG9ydFBhcmFtcyhHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKK3sKKyAgICBtU3RhdGUudmlld3BvcnRYID0geDsKKyAgICBtU3RhdGUudmlld3BvcnRZID0geTsKKyAgICBtU3RhdGUudmlld3BvcnRXaWR0aCA9IHdpZHRoOworICAgIG1TdGF0ZS52aWV3cG9ydEhlaWdodCA9IGhlaWdodDsKK30KKwordm9pZCBDb250ZXh0OjpzZXRTY2lzc29yUGFyYW1zKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQoreworICAgIGlmKG1TdGF0ZS5zY2lzc29yWCAhPSB4IHx8IG1TdGF0ZS5zY2lzc29yWSAhPSB5IHx8IAorICAgICAgICBtU3RhdGUuc2Npc3NvcldpZHRoICE9IHdpZHRoIHx8IG1TdGF0ZS5zY2lzc29ySGVpZ2h0ICE9IGhlaWdodCkKKyAgICB7CisgICAgICAgIG1TdGF0ZS5zY2lzc29yWCA9IHg7CisgICAgICAgIG1TdGF0ZS5zY2lzc29yWSA9IHk7CisgICAgICAgIG1TdGF0ZS5zY2lzc29yV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbVN0YXRlLnNjaXNzb3JIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1TY2lzc29yU3RhdGVEaXJ0eSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIENvbnRleHQ6OnNldENvbG9yTWFzayhib29sIHJlZCwgYm9vbCBncmVlbiwgYm9vbCBibHVlLCBib29sIGFscGhhKQoreworICAgIGlmKG1TdGF0ZS5jb2xvck1hc2tSZWQgIT0gcmVkIHx8IG1TdGF0ZS5jb2xvck1hc2tHcmVlbiAhPSBncmVlbiB8fAorICAgICAgICBtU3RhdGUuY29sb3JNYXNrQmx1ZSAhPSBibHVlIHx8IG1TdGF0ZS5jb2xvck1hc2tBbHBoYSAhPSBhbHBoYSkKKyAgICB7CisgICAgICAgIG1TdGF0ZS5jb2xvck1hc2tSZWQgPSByZWQ7CisgICAgICAgIG1TdGF0ZS5jb2xvck1hc2tHcmVlbiA9IGdyZWVuOworICAgICAgICBtU3RhdGUuY29sb3JNYXNrQmx1ZSA9IGJsdWU7CisgICAgICAgIG1TdGF0ZS5jb2xvck1hc2tBbHBoYSA9IGFscGhhOworICAgICAgICBtTWFza1N0YXRlRGlydHkgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBDb250ZXh0OjpzZXREZXB0aE1hc2soYm9vbCBtYXNrKQoreworICAgIGlmKG1TdGF0ZS5kZXB0aE1hc2sgIT0gbWFzaykKKyAgICB7CisgICAgICAgIG1TdGF0ZS5kZXB0aE1hc2sgPSBtYXNrOworICAgICAgICBtTWFza1N0YXRlRGlydHkgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBDb250ZXh0OjpzZXRBY3RpdmVTYW1wbGVyKHVuc2lnbmVkIGludCBhY3RpdmUpCit7CisgICAgbVN0YXRlLmFjdGl2ZVNhbXBsZXIgPSBhY3RpdmU7Cit9CisKK0dMdWludCBDb250ZXh0OjpnZXRSZWFkRnJhbWVidWZmZXJIYW5kbGUoKSBjb25zdAoreworICAgIHJldHVybiBtU3RhdGUucmVhZEZyYW1lYnVmZmVyOworfQorCitHTHVpbnQgQ29udGV4dDo6Z2V0RHJhd0ZyYW1lYnVmZmVySGFuZGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXRlLmRyYXdGcmFtZWJ1ZmZlcjsKK30KKworR0x1aW50IENvbnRleHQ6OmdldFJlbmRlcmJ1ZmZlckhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdGF0ZS5yZW5kZXJidWZmZXIuaWQoKTsKK30KKworR0x1aW50IENvbnRleHQ6OmdldEFycmF5QnVmZmVySGFuZGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXRlLmFycmF5QnVmZmVyLmlkKCk7Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0RW5hYmxlVmVydGV4QXR0cmliQXJyYXkodW5zaWduZWQgaW50IGF0dHJpYk51bSwgYm9vbCBlbmFibGVkKQoreworICAgIG1TdGF0ZS52ZXJ0ZXhBdHRyaWJ1dGVbYXR0cmliTnVtXS5tQXJyYXlFbmFibGVkID0gZW5hYmxlZDsKK30KKworY29uc3QgVmVydGV4QXR0cmlidXRlICZDb250ZXh0OjpnZXRWZXJ0ZXhBdHRyaWJTdGF0ZSh1bnNpZ25lZCBpbnQgYXR0cmliTnVtKQoreworICAgIHJldHVybiBtU3RhdGUudmVydGV4QXR0cmlidXRlW2F0dHJpYk51bV07Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0VmVydGV4QXR0cmliU3RhdGUodW5zaWduZWQgaW50IGF0dHJpYk51bSwgQnVmZmVyICpib3VuZEJ1ZmZlciwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIGJvb2wgbm9ybWFsaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IHZvaWQgKnBvaW50ZXIpCit7CisgICAgbVN0YXRlLnZlcnRleEF0dHJpYnV0ZVthdHRyaWJOdW1dLm1Cb3VuZEJ1ZmZlci5zZXQoYm91bmRCdWZmZXIpOworICAgIG1TdGF0ZS52ZXJ0ZXhBdHRyaWJ1dGVbYXR0cmliTnVtXS5tU2l6ZSA9IHNpemU7CisgICAgbVN0YXRlLnZlcnRleEF0dHJpYnV0ZVthdHRyaWJOdW1dLm1UeXBlID0gdHlwZTsKKyAgICBtU3RhdGUudmVydGV4QXR0cmlidXRlW2F0dHJpYk51bV0ubU5vcm1hbGl6ZWQgPSBub3JtYWxpemVkOworICAgIG1TdGF0ZS52ZXJ0ZXhBdHRyaWJ1dGVbYXR0cmliTnVtXS5tU3RyaWRlID0gc3RyaWRlOworICAgIG1TdGF0ZS52ZXJ0ZXhBdHRyaWJ1dGVbYXR0cmliTnVtXS5tUG9pbnRlciA9IHBvaW50ZXI7Cit9CisKK2NvbnN0IHZvaWQgKkNvbnRleHQ6OmdldFZlcnRleEF0dHJpYlBvaW50ZXIodW5zaWduZWQgaW50IGF0dHJpYk51bSkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXRlLnZlcnRleEF0dHJpYnV0ZVthdHRyaWJOdW1dLm1Qb2ludGVyOworfQorCitjb25zdCBWZXJ0ZXhBdHRyaWJ1dGVBcnJheSAmQ29udGV4dDo6Z2V0VmVydGV4QXR0cmlidXRlcygpCit7CisgICAgcmV0dXJuIG1TdGF0ZS52ZXJ0ZXhBdHRyaWJ1dGU7Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0UGFja0FsaWdubWVudChHTGludCBhbGlnbm1lbnQpCit7CisgICAgbVN0YXRlLnBhY2tBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Cit9CisKK0dMaW50IENvbnRleHQ6OmdldFBhY2tBbGlnbm1lbnQoKSBjb25zdAoreworICAgIHJldHVybiBtU3RhdGUucGFja0FsaWdubWVudDsKK30KKwordm9pZCBDb250ZXh0OjpzZXRVbnBhY2tBbGlnbm1lbnQoR0xpbnQgYWxpZ25tZW50KQoreworICAgIG1TdGF0ZS51bnBhY2tBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Cit9CisKK0dMaW50IENvbnRleHQ6OmdldFVucGFja0FsaWdubWVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdGF0ZS51bnBhY2tBbGlnbm1lbnQ7Cit9CisKK0dMdWludCBDb250ZXh0OjpjcmVhdGVCdWZmZXIoKQoreworICAgIHJldHVybiBtUmVzb3VyY2VNYW5hZ2VyLT5jcmVhdGVCdWZmZXIoKTsKK30KKworR0x1aW50IENvbnRleHQ6OmNyZWF0ZVByb2dyYW0oKQoreworICAgIHJldHVybiBtUmVzb3VyY2VNYW5hZ2VyLT5jcmVhdGVQcm9ncmFtKCk7Cit9CisKK0dMdWludCBDb250ZXh0OjpjcmVhdGVTaGFkZXIoR0xlbnVtIHR5cGUpCit7CisgICAgcmV0dXJuIG1SZXNvdXJjZU1hbmFnZXItPmNyZWF0ZVNoYWRlcih0eXBlKTsKK30KKworR0x1aW50IENvbnRleHQ6OmNyZWF0ZVRleHR1cmUoKQoreworICAgIHJldHVybiBtUmVzb3VyY2VNYW5hZ2VyLT5jcmVhdGVUZXh0dXJlKCk7Cit9CisKK0dMdWludCBDb250ZXh0OjpjcmVhdGVSZW5kZXJidWZmZXIoKQoreworICAgIHJldHVybiBtUmVzb3VyY2VNYW5hZ2VyLT5jcmVhdGVSZW5kZXJidWZmZXIoKTsKK30KKworLy8gUmV0dXJucyBhbiB1bnVzZWQgZnJhbWVidWZmZXIgbmFtZQorR0x1aW50IENvbnRleHQ6OmNyZWF0ZUZyYW1lYnVmZmVyKCkKK3sKKyAgICBHTHVpbnQgaGFuZGxlID0gbUZyYW1lYnVmZmVySGFuZGxlQWxsb2NhdG9yLmFsbG9jYXRlKCk7CisKKyAgICBtRnJhbWVidWZmZXJNYXBbaGFuZGxlXSA9IE5VTEw7CisKKyAgICByZXR1cm4gaGFuZGxlOworfQorCitHTHVpbnQgQ29udGV4dDo6Y3JlYXRlRmVuY2UoKQoreworICAgIEdMdWludCBoYW5kbGUgPSBtRmVuY2VIYW5kbGVBbGxvY2F0b3IuYWxsb2NhdGUoKTsKKworICAgIG1GZW5jZU1hcFtoYW5kbGVdID0gbmV3IEZlbmNlOworCisgICAgcmV0dXJuIGhhbmRsZTsKK30KKwordm9pZCBDb250ZXh0OjpkZWxldGVCdWZmZXIoR0x1aW50IGJ1ZmZlcikKK3sKKyAgICBpZihtUmVzb3VyY2VNYW5hZ2VyLT5nZXRCdWZmZXIoYnVmZmVyKSkKKyAgICB7CisgICAgICAgIGRldGFjaEJ1ZmZlcihidWZmZXIpOworICAgIH0KKyAgICAKKyAgICBtUmVzb3VyY2VNYW5hZ2VyLT5kZWxldGVCdWZmZXIoYnVmZmVyKTsKK30KKwordm9pZCBDb250ZXh0OjpkZWxldGVTaGFkZXIoR0x1aW50IHNoYWRlcikKK3sKKyAgICBtUmVzb3VyY2VNYW5hZ2VyLT5kZWxldGVTaGFkZXIoc2hhZGVyKTsKK30KKwordm9pZCBDb250ZXh0OjpkZWxldGVQcm9ncmFtKEdMdWludCBwcm9ncmFtKQoreworICAgIG1SZXNvdXJjZU1hbmFnZXItPmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Cit9CisKK3ZvaWQgQ29udGV4dDo6ZGVsZXRlVGV4dHVyZShHTHVpbnQgdGV4dHVyZSkKK3sKKyAgICBpZihtUmVzb3VyY2VNYW5hZ2VyLT5nZXRUZXh0dXJlKHRleHR1cmUpKQorICAgIHsKKyAgICAgICAgZGV0YWNoVGV4dHVyZSh0ZXh0dXJlKTsKKyAgICB9CisKKyAgICBtUmVzb3VyY2VNYW5hZ2VyLT5kZWxldGVUZXh0dXJlKHRleHR1cmUpOworfQorCit2b2lkIENvbnRleHQ6OmRlbGV0ZVJlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKQoreworICAgIGlmKG1SZXNvdXJjZU1hbmFnZXItPmdldFJlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpKQorICAgIHsKKyAgICAgICAgZGV0YWNoUmVuZGVyYnVmZmVyKHJlbmRlcmJ1ZmZlcik7CisgICAgfQorICAgIAorICAgIG1SZXNvdXJjZU1hbmFnZXItPmRlbGV0ZVJlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpOworfQorCit2b2lkIENvbnRleHQ6OmRlbGV0ZUZyYW1lYnVmZmVyKEdMdWludCBmcmFtZWJ1ZmZlcikKK3sKKyAgICBGcmFtZWJ1ZmZlck1hcDo6aXRlcmF0b3IgZnJhbWVidWZmZXJPYmplY3QgPSBtRnJhbWVidWZmZXJNYXAuZmluZChmcmFtZWJ1ZmZlcik7CisKKyAgICBpZihmcmFtZWJ1ZmZlck9iamVjdCAhPSBtRnJhbWVidWZmZXJNYXAuZW5kKCkpCisgICAgeworICAgICAgICBkZXRhY2hGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcik7CisKKyAgICAgICAgbUZyYW1lYnVmZmVySGFuZGxlQWxsb2NhdG9yLnJlbGVhc2UoZnJhbWVidWZmZXJPYmplY3QtPmZpcnN0KTsKKyAgICAgICAgZGVsZXRlIGZyYW1lYnVmZmVyT2JqZWN0LT5zZWNvbmQ7CisgICAgICAgIG1GcmFtZWJ1ZmZlck1hcC5lcmFzZShmcmFtZWJ1ZmZlck9iamVjdCk7CisgICAgfQorfQorCit2b2lkIENvbnRleHQ6OmRlbGV0ZUZlbmNlKEdMdWludCBmZW5jZSkKK3sKKyAgICBGZW5jZU1hcDo6aXRlcmF0b3IgZmVuY2VPYmplY3QgPSBtRmVuY2VNYXAuZmluZChmZW5jZSk7CisKKyAgICBpZihmZW5jZU9iamVjdCAhPSBtRmVuY2VNYXAuZW5kKCkpCisgICAgeworICAgICAgICBtRmVuY2VIYW5kbGVBbGxvY2F0b3IucmVsZWFzZShmZW5jZU9iamVjdC0+Zmlyc3QpOworICAgICAgICBkZWxldGUgZmVuY2VPYmplY3QtPnNlY29uZDsKKyAgICAgICAgbUZlbmNlTWFwLmVyYXNlKGZlbmNlT2JqZWN0KTsKKyAgICB9Cit9CisKK0J1ZmZlciAqQ29udGV4dDo6Z2V0QnVmZmVyKEdMdWludCBoYW5kbGUpCit7CisgICAgcmV0dXJuIG1SZXNvdXJjZU1hbmFnZXItPmdldEJ1ZmZlcihoYW5kbGUpOworfQorCitTaGFkZXIgKkNvbnRleHQ6OmdldFNoYWRlcihHTHVpbnQgaGFuZGxlKQoreworICAgIHJldHVybiBtUmVzb3VyY2VNYW5hZ2VyLT5nZXRTaGFkZXIoaGFuZGxlKTsKK30KKworUHJvZ3JhbSAqQ29udGV4dDo6Z2V0UHJvZ3JhbShHTHVpbnQgaGFuZGxlKQoreworICAgIHJldHVybiBtUmVzb3VyY2VNYW5hZ2VyLT5nZXRQcm9ncmFtKGhhbmRsZSk7Cit9CisKK1RleHR1cmUgKkNvbnRleHQ6OmdldFRleHR1cmUoR0x1aW50IGhhbmRsZSkKK3sKKyAgICByZXR1cm4gbVJlc291cmNlTWFuYWdlci0+Z2V0VGV4dHVyZShoYW5kbGUpOworfQorCitSZW5kZXJidWZmZXIgKkNvbnRleHQ6OmdldFJlbmRlcmJ1ZmZlcihHTHVpbnQgaGFuZGxlKQoreworICAgIHJldHVybiBtUmVzb3VyY2VNYW5hZ2VyLT5nZXRSZW5kZXJidWZmZXIoaGFuZGxlKTsKK30KKworRnJhbWVidWZmZXIgKkNvbnRleHQ6OmdldFJlYWRGcmFtZWJ1ZmZlcigpCit7CisgICAgcmV0dXJuIGdldEZyYW1lYnVmZmVyKG1TdGF0ZS5yZWFkRnJhbWVidWZmZXIpOworfQorCitGcmFtZWJ1ZmZlciAqQ29udGV4dDo6Z2V0RHJhd0ZyYW1lYnVmZmVyKCkKK3sKKyAgICByZXR1cm4gZ2V0RnJhbWVidWZmZXIobVN0YXRlLmRyYXdGcmFtZWJ1ZmZlcik7Cit9CisKK3ZvaWQgQ29udGV4dDo6YmluZEFycmF5QnVmZmVyKHVuc2lnbmVkIGludCBidWZmZXIpCit7CisgICAgbVJlc291cmNlTWFuYWdlci0+Y2hlY2tCdWZmZXJBbGxvY2F0aW9uKGJ1ZmZlcik7CisKKyAgICBtU3RhdGUuYXJyYXlCdWZmZXIuc2V0KGdldEJ1ZmZlcihidWZmZXIpKTsKK30KKwordm9pZCBDb250ZXh0OjpiaW5kRWxlbWVudEFycmF5QnVmZmVyKHVuc2lnbmVkIGludCBidWZmZXIpCit7CisgICAgbVJlc291cmNlTWFuYWdlci0+Y2hlY2tCdWZmZXJBbGxvY2F0aW9uKGJ1ZmZlcik7CisKKyAgICBtU3RhdGUuZWxlbWVudEFycmF5QnVmZmVyLnNldChnZXRCdWZmZXIoYnVmZmVyKSk7Cit9CisKK3ZvaWQgQ29udGV4dDo6YmluZFRleHR1cmUyRChHTHVpbnQgdGV4dHVyZSkKK3sKKyAgICBtUmVzb3VyY2VNYW5hZ2VyLT5jaGVja1RleHR1cmVBbGxvY2F0aW9uKHRleHR1cmUsIFRFWFRVUkVfMkQpOworCisgICAgbVN0YXRlLnNhbXBsZXJUZXh0dXJlW1RFWFRVUkVfMkRdW21TdGF0ZS5hY3RpdmVTYW1wbGVyXS5zZXQoZ2V0VGV4dHVyZSh0ZXh0dXJlKSk7Cit9CisKK3ZvaWQgQ29udGV4dDo6YmluZFRleHR1cmVDdWJlTWFwKEdMdWludCB0ZXh0dXJlKQoreworICAgIG1SZXNvdXJjZU1hbmFnZXItPmNoZWNrVGV4dHVyZUFsbG9jYXRpb24odGV4dHVyZSwgVEVYVFVSRV9DVUJFKTsKKworICAgIG1TdGF0ZS5zYW1wbGVyVGV4dHVyZVtURVhUVVJFX0NVQkVdW21TdGF0ZS5hY3RpdmVTYW1wbGVyXS5zZXQoZ2V0VGV4dHVyZSh0ZXh0dXJlKSk7Cit9CisKK3ZvaWQgQ29udGV4dDo6YmluZFJlYWRGcmFtZWJ1ZmZlcihHTHVpbnQgZnJhbWVidWZmZXIpCit7CisgICAgaWYoIWdldEZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyKSkKKyAgICB7CisgICAgICAgIG1GcmFtZWJ1ZmZlck1hcFtmcmFtZWJ1ZmZlcl0gPSBuZXcgRnJhbWVidWZmZXIoKTsKKyAgICB9CisKKyAgICBtU3RhdGUucmVhZEZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7Cit9CisKK3ZvaWQgQ29udGV4dDo6YmluZERyYXdGcmFtZWJ1ZmZlcihHTHVpbnQgZnJhbWVidWZmZXIpCit7CisgICAgaWYoIWdldEZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyKSkKKyAgICB7CisgICAgICAgIG1GcmFtZWJ1ZmZlck1hcFtmcmFtZWJ1ZmZlcl0gPSBuZXcgRnJhbWVidWZmZXIoKTsKKyAgICB9CisKKyAgICBtU3RhdGUuZHJhd0ZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7Cit9CisKK3ZvaWQgQ29udGV4dDo6YmluZFJlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKQoreworICAgIG1SZXNvdXJjZU1hbmFnZXItPmNoZWNrUmVuZGVyYnVmZmVyQWxsb2NhdGlvbihyZW5kZXJidWZmZXIpOworCisgICAgbVN0YXRlLnJlbmRlcmJ1ZmZlci5zZXQoZ2V0UmVuZGVyYnVmZmVyKHJlbmRlcmJ1ZmZlcikpOworfQorCit2b2lkIENvbnRleHQ6OnVzZVByb2dyYW0oR0x1aW50IHByb2dyYW0pCit7CisgICAgR0x1aW50IHByaW9yUHJvZ3JhbSA9IG1TdGF0ZS5jdXJyZW50UHJvZ3JhbTsKKyAgICBtU3RhdGUuY3VycmVudFByb2dyYW0gPSBwcm9ncmFtOyAgICAgICAgICAgICAgIC8vIE11c3Qgc3dpdGNoIGJlZm9yZSB0cnlpbmcgdG8gZGVsZXRlLCBvdGhlcndpc2UgaXQgb25seSBnZXRzIGZsYWdnZWQuCisKKyAgICBpZihwcmlvclByb2dyYW0gIT0gcHJvZ3JhbSkKKyAgICB7CisgICAgICAgIFByb2dyYW0gKm5ld1Byb2dyYW0gPSBtUmVzb3VyY2VNYW5hZ2VyLT5nZXRQcm9ncmFtKHByb2dyYW0pOworICAgICAgICBQcm9ncmFtICpvbGRQcm9ncmFtID0gbVJlc291cmNlTWFuYWdlci0+Z2V0UHJvZ3JhbShwcmlvclByb2dyYW0pOworCisgICAgICAgIGlmKG5ld1Byb2dyYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld1Byb2dyYW0tPmFkZFJlZigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihvbGRQcm9ncmFtKQorICAgICAgICB7CisgICAgICAgICAgICBvbGRQcm9ncmFtLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0RnJhbWVidWZmZXJaZXJvKEZyYW1lYnVmZmVyICpidWZmZXIpCit7CisgICAgZGVsZXRlIG1GcmFtZWJ1ZmZlck1hcFswXTsKKyAgICBtRnJhbWVidWZmZXJNYXBbMF0gPSBidWZmZXI7Cit9CisKK3ZvaWQgQ29udGV4dDo6c2V0UmVuZGVyYnVmZmVyU3RvcmFnZShSZW5kZXJidWZmZXJTdG9yYWdlICpyZW5kZXJidWZmZXIpCit7CisgICAgUmVuZGVyYnVmZmVyICpyZW5kZXJidWZmZXJPYmplY3QgPSBtU3RhdGUucmVuZGVyYnVmZmVyLmdldCgpOworICAgIHJlbmRlcmJ1ZmZlck9iamVjdC0+c2V0U3RvcmFnZShyZW5kZXJidWZmZXIpOworfQorCitGcmFtZWJ1ZmZlciAqQ29udGV4dDo6Z2V0RnJhbWVidWZmZXIodW5zaWduZWQgaW50IGhhbmRsZSkKK3sKKyAgICBGcmFtZWJ1ZmZlck1hcDo6aXRlcmF0b3IgZnJhbWVidWZmZXIgPSBtRnJhbWVidWZmZXJNYXAuZmluZChoYW5kbGUpOworCisgICAgaWYoZnJhbWVidWZmZXIgPT0gbUZyYW1lYnVmZmVyTWFwLmVuZCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBmcmFtZWJ1ZmZlci0+c2Vjb25kOworICAgIH0KK30KKworRmVuY2UgKkNvbnRleHQ6OmdldEZlbmNlKHVuc2lnbmVkIGludCBoYW5kbGUpCit7CisgICAgRmVuY2VNYXA6Oml0ZXJhdG9yIGZlbmNlID0gbUZlbmNlTWFwLmZpbmQoaGFuZGxlKTsKKworICAgIGlmKGZlbmNlID09IG1GZW5jZU1hcC5lbmQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gZmVuY2UtPnNlY29uZDsKKyAgICB9Cit9CisKK0J1ZmZlciAqQ29udGV4dDo6Z2V0QXJyYXlCdWZmZXIoKQoreworICAgIHJldHVybiBtU3RhdGUuYXJyYXlCdWZmZXIuZ2V0KCk7Cit9CisKK0J1ZmZlciAqQ29udGV4dDo6Z2V0RWxlbWVudEFycmF5QnVmZmVyKCkKK3sKKyAgICByZXR1cm4gbVN0YXRlLmVsZW1lbnRBcnJheUJ1ZmZlci5nZXQoKTsKK30KKworUHJvZ3JhbSAqQ29udGV4dDo6Z2V0Q3VycmVudFByb2dyYW0oKQoreworICAgIHJldHVybiBtUmVzb3VyY2VNYW5hZ2VyLT5nZXRQcm9ncmFtKG1TdGF0ZS5jdXJyZW50UHJvZ3JhbSk7Cit9CisKK1RleHR1cmUyRCAqQ29udGV4dDo6Z2V0VGV4dHVyZTJEKCkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGV4dHVyZTJEKj4oZ2V0U2FtcGxlclRleHR1cmUobVN0YXRlLmFjdGl2ZVNhbXBsZXIsIFRFWFRVUkVfMkQpKTsKK30KKworVGV4dHVyZUN1YmVNYXAgKkNvbnRleHQ6OmdldFRleHR1cmVDdWJlTWFwKCkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGV4dHVyZUN1YmVNYXAqPihnZXRTYW1wbGVyVGV4dHVyZShtU3RhdGUuYWN0aXZlU2FtcGxlciwgVEVYVFVSRV9DVUJFKSk7Cit9CisKK1RleHR1cmUgKkNvbnRleHQ6OmdldFNhbXBsZXJUZXh0dXJlKHVuc2lnbmVkIGludCBzYW1wbGVyLCBUZXh0dXJlVHlwZSB0eXBlKQoreworICAgIEdMdWludCB0ZXhpZCA9IG1TdGF0ZS5zYW1wbGVyVGV4dHVyZVt0eXBlXVtzYW1wbGVyXS5pZCgpOworCisgICAgaWYodGV4aWQgPT0gMCkgICAvLyBTcGVjaWFsIGNhc2U6IDAgcmVmZXJzIHRvIGRpZmZlcmVudCBpbml0aWFsIHRleHR1cmVzIGJhc2VkIG9uIHRoZSB0YXJnZXQKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgY2FzZSBURVhUVVJFXzJEOiByZXR1cm4gbVRleHR1cmUyRFplcm8uZ2V0KCk7CisgICAgICAgICAgY2FzZSBURVhUVVJFX0NVQkU6IHJldHVybiBtVGV4dHVyZUN1YmVNYXBaZXJvLmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1TdGF0ZS5zYW1wbGVyVGV4dHVyZVt0eXBlXVtzYW1wbGVyXS5nZXQoKTsKK30KKworYm9vbCBDb250ZXh0OjpnZXRCb29sZWFudihHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zKQoreworICAgIHN3aXRjaCAocG5hbWUpCisgICAgeworICAgICAgY2FzZSBHTF9TSEFERVJfQ09NUElMRVI6ICAgICAgICAgICpwYXJhbXMgPSBHTF9UUlVFOyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQ6ICAgKnBhcmFtcyA9IG1TdGF0ZS5zYW1wbGVDb3ZlcmFnZUludmVydDsgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfREVQVEhfV1JJVEVNQVNLOiAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLmRlcHRoTWFzazsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9DT0xPUl9XUklURU1BU0s6CisgICAgICAgIHBhcmFtc1swXSA9IG1TdGF0ZS5jb2xvck1hc2tSZWQ7CisgICAgICAgIHBhcmFtc1sxXSA9IG1TdGF0ZS5jb2xvck1hc2tHcmVlbjsKKyAgICAgICAgcGFyYW1zWzJdID0gbVN0YXRlLmNvbG9yTWFza0JsdWU7CisgICAgICAgIHBhcmFtc1szXSA9IG1TdGF0ZS5jb2xvck1hc2tBbHBoYTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0NVTExfRkFDRTogICAgICAgICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5jdWxsRmFjZTsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDogICAgICAqcGFyYW1zID0gbVN0YXRlLnBvbHlnb25PZmZzZXRGaWxsOyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0U6ICpwYXJhbXMgPSBtU3RhdGUuc2FtcGxlQWxwaGFUb0NvdmVyYWdlOyAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRTogICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5zYW1wbGVDb3ZlcmFnZTsgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOiAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnNjaXNzb3JUZXN0OyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9TVEVOQ0lMX1RFU1Q6ICAgICAgICAgICAgICpwYXJhbXMgPSBtU3RhdGUuc3RlbmNpbFRlc3Q7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0RFUFRIX1RFU1Q6ICAgICAgICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5kZXB0aFRlc3Q7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfQkxFTkQ6ICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLmJsZW5kOyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9ESVRIRVI6ICAgICAgICAgICAgICAgICAgICpwYXJhbXMgPSBtU3RhdGUuZGl0aGVyOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29udGV4dDo6Z2V0RmxvYXR2KEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQoreworICAgIC8vIFBsZWFzZSBub3RlOiBERVBUSF9DTEVBUl9WQUxVRSBpcyBpbmNsdWRlZCBpbiBvdXIgaW50ZXJuYWwgZ2V0RmxvYXR2IGltcGxlbWVudGF0aW9uCisgICAgLy8gYmVjYXVzZSBpdCBpcyBzdG9yZWQgYXMgYSBmbG9hdCwgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoZSBHTCBFUyAyLjAgc3BlYyBuYW1lcworICAgIC8vIEdldEludGVnZXJ2IGFzIGl0cyBuYXRpdmUgcXVlcnkgZnVuY3Rpb24uIEFzIGl0IHdvdWxkIHJlcXVpcmUgY29udmVyc2lvbiBpbiBhbnkKKyAgICAvLyBjYXNlLCB0aGlzIHNob3VsZCBtYWtlIG5vIGRpZmZlcmVuY2UgdG8gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uCisgICAgc3dpdGNoIChwbmFtZSkKKyAgICB7CisgICAgICBjYXNlIEdMX0xJTkVfV0lEVEg6ICAgICAgICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5saW5lV2lkdGg7ICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRTogICAgKnBhcmFtcyA9IG1TdGF0ZS5zYW1wbGVDb3ZlcmFnZVZhbHVlOyAgYnJlYWs7CisgICAgICBjYXNlIEdMX0RFUFRIX0NMRUFSX1ZBTFVFOiAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5kZXB0aENsZWFyVmFsdWU7ICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUjogICAgKnBhcmFtcyA9IG1TdGF0ZS5wb2x5Z29uT2Zmc2V0RmFjdG9yOyAgYnJlYWs7CisgICAgICBjYXNlIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTOiAgICAgKnBhcmFtcyA9IG1TdGF0ZS5wb2x5Z29uT2Zmc2V0VW5pdHM7ICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRToKKyAgICAgICAgcGFyYW1zWzBdID0gQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFX01JTjsKKyAgICAgICAgcGFyYW1zWzFdID0gQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFX01BWDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRToKKyAgICAgICAgcGFyYW1zWzBdID0gQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFX01JTjsKKyAgICAgICAgcGFyYW1zWzFdID0gQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFX01BWDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0RFUFRIX1JBTkdFOgorICAgICAgICBwYXJhbXNbMF0gPSBtU3RhdGUuek5lYXI7CisgICAgICAgIHBhcmFtc1sxXSA9IG1TdGF0ZS56RmFyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfQ09MT1JfQ0xFQVJfVkFMVUU6CisgICAgICAgIHBhcmFtc1swXSA9IG1TdGF0ZS5jb2xvckNsZWFyVmFsdWUucmVkOworICAgICAgICBwYXJhbXNbMV0gPSBtU3RhdGUuY29sb3JDbGVhclZhbHVlLmdyZWVuOworICAgICAgICBwYXJhbXNbMl0gPSBtU3RhdGUuY29sb3JDbGVhclZhbHVlLmJsdWU7CisgICAgICAgIHBhcmFtc1szXSA9IG1TdGF0ZS5jb2xvckNsZWFyVmFsdWUuYWxwaGE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9CTEVORF9DT0xPUjoKKyAgICAgICAgcGFyYW1zWzBdID0gbVN0YXRlLmJsZW5kQ29sb3IucmVkOworICAgICAgICBwYXJhbXNbMV0gPSBtU3RhdGUuYmxlbmRDb2xvci5ncmVlbjsKKyAgICAgICAgcGFyYW1zWzJdID0gbVN0YXRlLmJsZW5kQ29sb3IuYmx1ZTsKKyAgICAgICAgcGFyYW1zWzNdID0gbVN0YXRlLmJsZW5kQ29sb3IuYWxwaGE7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvbnRleHQ6OmdldEludGVnZXJ2KEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK3sKKyAgICAvLyBQbGVhc2Ugbm90ZTogREVQVEhfQ0xFQVJfVkFMVUUgaXMgbm90IGluY2x1ZGVkIGluIG91ciBpbnRlcm5hbCBnZXRJbnRlZ2VydiBpbXBsZW1lbnRhdGlvbgorICAgIC8vIGJlY2F1c2UgaXQgaXMgc3RvcmVkIGFzIGEgZmxvYXQsIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGUgR0wgRVMgMi4wIHNwZWMgbmFtZXMKKyAgICAvLyBHZXRJbnRlZ2VydiBhcyBpdHMgbmF0aXZlIHF1ZXJ5IGZ1bmN0aW9uLiBBcyBpdCB3b3VsZCByZXF1aXJlIGNvbnZlcnNpb24gaW4gYW55CisgICAgLy8gY2FzZSwgdGhpcyBzaG91bGQgbWFrZSBubyBkaWZmZXJlbmNlIHRvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBZb3UgbWF5IGZpbmQgaXQgaW4gCisgICAgLy8gQ29udGV4dDo6Z2V0RmxvYXR2LgorICAgIHN3aXRjaCAocG5hbWUpCisgICAgeworICAgIGNhc2UgR0xfTUFYX1ZFUlRFWF9BVFRSSUJTOiAgICAgICAgICAgICAgICpwYXJhbXMgPSBNQVhfVkVSVEVYX0FUVFJJQlM7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzogICAgICAgKnBhcmFtcyA9IE1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTOyAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX01BWF9WQVJZSU5HX1ZFQ1RPUlM6ICAgICAgICAgICAgICAqcGFyYW1zID0gTUFYX1ZBUllJTkdfVkVDVE9SUzsgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFM6ICpwYXJhbXMgPSBNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUzsgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFM6ICAgKnBhcmFtcyA9IE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUzsgICBicmVhazsKKyAgICBjYXNlIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTOiAgICAgICAgICAqcGFyYW1zID0gTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFM7ICAgICAgICAgIGJyZWFrOworCWNhc2UgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzogICAgICpwYXJhbXMgPSBNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTOyAgICAgYnJlYWs7CisJY2FzZSBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkU6ICAgICAgICAgICAgKnBhcmFtcyA9IElNUExFTUVOVEFUSU9OX01BWF9SRU5ERVJCVUZGRVJfU0laRTsgYnJlYWs7CisgICAgY2FzZSBHTF9OVU1fU0hBREVSX0JJTkFSWV9GT1JNQVRTOiAgICAgICAgKnBhcmFtcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TSEFERVJfQklOQVJZX0ZPUk1BVFM6ICAgICAgLyogbm8gc2hhZGVyIGJpbmFyeSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgKi8gICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9BUlJBWV9CVUZGRVJfQklORElORzogICAgICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5hcnJheUJ1ZmZlci5pZCgpOyAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HOiAgICAgKnBhcmFtcyA9IG1TdGF0ZS5lbGVtZW50QXJyYXlCdWZmZXIuaWQoKTsgICAgICAgYnJlYWs7CisvLwljYXNlIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkc6ICAgICAgICAgICAgLy8gbm93IGVxdWl2YWxlbnQgdG8gR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HX0FOR0xFCisgICAgY2FzZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkdfQU5HTEU6ICAgKnBhcmFtcyA9IG1TdGF0ZS5kcmF3RnJhbWVidWZmZXI7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkdfQU5HTEU6ICAgKnBhcmFtcyA9IG1TdGF0ZS5yZWFkRnJhbWVidWZmZXI7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQklORElORzogICAgICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5yZW5kZXJidWZmZXIuaWQoKTsgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9DVVJSRU5UX1BST0dSQU06ICAgICAgICAgICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5jdXJyZW50UHJvZ3JhbTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9QQUNLX0FMSUdOTUVOVDogICAgICAgICAgICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5wYWNrQWxpZ25tZW50OyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9VTlBBQ0tfQUxJR05NRU5UOiAgICAgICAgICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS51bnBhY2tBbGlnbm1lbnQ7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVDogICAgICAgICAgICAgKnBhcmFtcyA9IG1TdGF0ZS5nZW5lcmF0ZU1pcG1hcEhpbnQ7ICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UX09FUzogKnBhcmFtcyA9IG1TdGF0ZS5mcmFnbWVudFNoYWRlckRlcml2YXRpdmVIaW50OyBicmVhazsKKyAgICBjYXNlIEdMX0FDVElWRV9URVhUVVJFOiAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gKG1TdGF0ZS5hY3RpdmVTYW1wbGVyICsgR0xfVEVYVFVSRTApOyBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfRlVOQzogICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxGdW5jOyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfUkVGOiAgICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxSZWY7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfVkFMVUVfTUFTSzogICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxNYXNrOyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19GVU5DOiAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxCYWNrRnVuYzsgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19SRUY6ICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxCYWNrUmVmOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19WQUxVRV9NQVNLOiAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxCYWNrTWFzazsgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfRkFJTDogICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxGYWlsOyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMOiAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxQYXNzRGVwdGhGYWlsOyAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTOiAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxQYXNzRGVwdGhQYXNzOyAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19GQUlMOiAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxCYWNrRmFpbDsgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUw6ICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxCYWNrUGFzc0RlcHRoRmFpbDsgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1M6ICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxCYWNrUGFzc0RlcHRoUGFzczsgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0RFUFRIX0ZVTkM6ICAgICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLmRlcHRoRnVuYzsgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0JMRU5EX1NSQ19SR0I6ICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnNvdXJjZUJsZW5kUkdCOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0JMRU5EX1NSQ19BTFBIQTogICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnNvdXJjZUJsZW5kQWxwaGE7ICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0JMRU5EX0RTVF9SR0I6ICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLmRlc3RCbGVuZFJHQjsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0JMRU5EX0RTVF9BTFBIQTogICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLmRlc3RCbGVuZEFscGhhOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0JMRU5EX0VRVUFUSU9OX1JHQjogICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLmJsZW5kRXF1YXRpb25SR0I7ICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBOiAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLmJsZW5kRXF1YXRpb25BbHBoYTsgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfV1JJVEVNQVNLOiAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxXcml0ZW1hc2s7ICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19XUklURU1BU0s6ICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxCYWNrV3JpdGVtYXNrOyAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NURU5DSUxfQ0xFQVJfVkFMVUU6ICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnN0ZW5jaWxDbGVhclZhbHVlOyAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NVQlBJWEVMX0JJVFM6ICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwljYXNlIEdMX01BWF9URVhUVVJFX1NJWkU6ICAgICAgICAgICAgICAgICAqcGFyYW1zID0gSU1QTEVNRU5UQVRJT05fTUFYX1RFWFRVUkVfU0laRTsgIGJyZWFrOworCWNhc2UgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRTogICAgICAgICpwYXJhbXMgPSBJTVBMRU1FTlRBVElPTl9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOyBicmVhazsKKyAgICBjYXNlIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzogICAKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUzNUQ19TVVBQT1JUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGF0IGN1cnJlbnQsIG9ubHkgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCBhbmQgCisgICAgICAgICAgICAgICAgLy8gR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgYXJlIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICpwYXJhbXMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYXJhbXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCWNhc2UgR0xfTUFYX1NBTVBMRVNfQU5HTEU6ICAgICAgICAgICAgICAgICpwYXJhbXMgPSBJTVBMRU1FTlRBVElPTl9NQVhfU0FNUExFUzsgYnJlYWs7CisgICAgY2FzZSBHTF9TQU1QTEVfQlVGRkVSUzogICAgICAgICAgICAgICAgICAgCisgICAgY2FzZSBHTF9TQU1QTEVTOgorICAgICAgICB7CisgICAgICAgICAgICBGcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIgPSBnZXREcmF3RnJhbWVidWZmZXIoKTsKKyAgICAgICAgICAgIGlmKGZyYW1lYnVmZmVyLT5jb21wbGV0ZW5lc3MoKSA9PSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBuYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1NBTVBMRV9CVUZGRVJTOgorICAgICAgICAgICAgICAgICAgICBpZihmcmFtZWJ1ZmZlci0+Z2V0U2FtcGxlcygpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwYXJhbXMgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBhcmFtcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9TQU1QTEVTOgorICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gZnJhbWVidWZmZXItPmdldFNhbXBsZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRTogICAqcGFyYW1zID0gSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFOyAgIGJyZWFrOworICAgIGNhc2UgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6ICpwYXJhbXMgPSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVDsgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVklFV1BPUlRfRElNUzoKKyAgICAgICAgeworCQkJaW50IG1heERpbWVuc2lvbiA9IElNUExFTUVOVEFUSU9OX01BWF9SRU5ERVJCVUZGRVJfU0laRTsKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IG1heERpbWVuc2lvbjsKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IG1heERpbWVuc2lvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOgorICAgICAgICB7CisgICAgICAgICAgICBpZihTM1RDX1NVUFBPUlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDsKKyAgICAgICAgICAgICAgICBwYXJhbXNbMV0gPSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1ZJRVdQT1JUOgorICAgICAgICBwYXJhbXNbMF0gPSBtU3RhdGUudmlld3BvcnRYOworICAgICAgICBwYXJhbXNbMV0gPSBtU3RhdGUudmlld3BvcnRZOworICAgICAgICBwYXJhbXNbMl0gPSBtU3RhdGUudmlld3BvcnRXaWR0aDsKKyAgICAgICAgcGFyYW1zWzNdID0gbVN0YXRlLnZpZXdwb3J0SGVpZ2h0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NDSVNTT1JfQk9YOgorICAgICAgICBwYXJhbXNbMF0gPSBtU3RhdGUuc2Npc3Nvclg7CisgICAgICAgIHBhcmFtc1sxXSA9IG1TdGF0ZS5zY2lzc29yWTsKKyAgICAgICAgcGFyYW1zWzJdID0gbVN0YXRlLnNjaXNzb3JXaWR0aDsKKyAgICAgICAgcGFyYW1zWzNdID0gbVN0YXRlLnNjaXNzb3JIZWlnaHQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfQ1VMTF9GQUNFX01PREU6ICAgICAgICAgICAgICAgICAgICpwYXJhbXMgPSBtU3RhdGUuY3VsbE1vZGU7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0ZST05UX0ZBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLmZyb250RmFjZTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9SRURfQklUUzoKKyAgICBjYXNlIEdMX0dSRUVOX0JJVFM6CisgICAgY2FzZSBHTF9CTFVFX0JJVFM6CisgICAgY2FzZSBHTF9BTFBIQV9CSVRTOgorICAgICAgICB7CisgICAgICAgICAgICBGcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIgPSBnZXREcmF3RnJhbWVidWZmZXIoKTsKKyAgICAgICAgICAgIENvbG9yYnVmZmVyICpjb2xvcmJ1ZmZlciA9IGZyYW1lYnVmZmVyLT5nZXRDb2xvcmJ1ZmZlcigpOworCisgICAgICAgICAgICBpZihjb2xvcmJ1ZmZlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBuYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgR0xfUkVEX0JJVFM6ICAgKnBhcmFtcyA9IGNvbG9yYnVmZmVyLT5nZXRSZWRTaXplKCk7ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIEdMX0dSRUVOX0JJVFM6ICpwYXJhbXMgPSBjb2xvcmJ1ZmZlci0+Z2V0R3JlZW5TaXplKCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBHTF9CTFVFX0JJVFM6ICAqcGFyYW1zID0gY29sb3JidWZmZXItPmdldEJsdWVTaXplKCk7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgR0xfQUxQSEFfQklUUzogKnBhcmFtcyA9IGNvbG9yYnVmZmVyLT5nZXRBbHBoYVNpemUoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYXJhbXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfREVQVEhfQklUUzoKKyAgICAgICAgeworICAgICAgICAgICAgRnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyID0gZ2V0RHJhd0ZyYW1lYnVmZmVyKCk7CisgICAgICAgICAgICBEZXB0aFN0ZW5jaWxidWZmZXIgKmRlcHRoYnVmZmVyID0gZnJhbWVidWZmZXItPmdldERlcHRoYnVmZmVyKCk7CisKKyAgICAgICAgICAgIGlmKGRlcHRoYnVmZmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYXJhbXMgPSBkZXB0aGJ1ZmZlci0+Z2V0RGVwdGhTaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TVEVOQ0lMX0JJVFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIEZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciA9IGdldERyYXdGcmFtZWJ1ZmZlcigpOworICAgICAgICAgICAgRGVwdGhTdGVuY2lsYnVmZmVyICpzdGVuY2lsYnVmZmVyID0gZnJhbWVidWZmZXItPmdldFN0ZW5jaWxidWZmZXIoKTsKKworICAgICAgICAgICAgaWYoc3RlbmNpbGJ1ZmZlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gc3RlbmNpbGJ1ZmZlci0+Z2V0U3RlbmNpbFNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1RFWFRVUkVfQklORElOR18yRDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYobVN0YXRlLmFjdGl2ZVNhbXBsZXIgPCAwIHx8IG1TdGF0ZS5hY3RpdmVTYW1wbGVyID4gTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgLSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpwYXJhbXMgPSBtU3RhdGUuc2FtcGxlclRleHR1cmVbVEVYVFVSRV8yRF1bbVN0YXRlLmFjdGl2ZVNhbXBsZXJdLmlkKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1TdGF0ZS5hY3RpdmVTYW1wbGVyIDwgMCB8fCBtU3RhdGUuYWN0aXZlU2FtcGxlciA+IE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIC0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqcGFyYW1zID0gbVN0YXRlLnNhbXBsZXJUZXh0dXJlW1RFWFRVUkVfQ1VCRV1bbVN0YXRlLmFjdGl2ZVNhbXBsZXJdLmlkKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvbnRleHQ6OmdldFF1ZXJ5UGFyYW1ldGVySW5mbyhHTGVudW0gcG5hbWUsIEdMZW51bSAqdHlwZSwgdW5zaWduZWQgaW50ICpudW1QYXJhbXMpCit7CisgICAgLy8gUGxlYXNlIG5vdGU6IHRoZSBxdWVyeSB0eXBlIHJldHVybmVkIGZvciBERVBUSF9DTEVBUl9WQUxVRSBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgLy8gaXMgRkxPQVQgcmF0aGVyIHRoYW4gSU5ULCBhcyB3b3VsZCBiZSBzdWdnZXN0ZWQgYnkgdGhlIEdMIEVTIDIuMCBzcGVjLiBUaGlzIGlzIGR1ZQorICAgIC8vIHRvIHRoZSBmYWN0IHRoYXQgaXQgaXMgc3RvcmVkIGludGVybmFsbHkgYXMgYSBmbG9hdCwgYW5kIHNvIHdvdWxkIHJlcXVpcmUgY29udmVyc2lvbgorICAgIC8vIGlmIHJldHVybmVkIGZyb20gQ29udGV4dDo6Z2V0SW50ZWdlcnYuIFNpbmNlIHRoaXMgY29udmVyc2lvbiBpcyBhbHJlYWR5IGltcGxlbWVudGVkIAorICAgIC8vIGluIHRoZSBjYXNlIHRoYXQgb25lIGNhbGxzIGdsR2V0SW50ZWdlcnYgdG8gcmV0cmlldmUgYSBmbG9hdC10eXBlZCBzdGF0ZSB2YXJpYWJsZSwgd2UKKyAgICAvLyBwbGFjZSBERVBUSF9DTEVBUl9WQUxVRSB3aXRoIHRoZSBmbG9hdHMuIFRoaXMgc2hvdWxkIG1ha2Ugbm8gZGlmZmVyZW5jZSB0byB0aGUgY2FsbGluZworICAgIC8vIGFwcGxpY2F0aW9uLgorICAgIHN3aXRjaCAocG5hbWUpCisgICAgeworICAgICAgY2FzZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzogLyogbm8gY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCAqLyAKKyAgICAgIGNhc2UgR0xfU0hBREVSX0JJTkFSWV9GT1JNQVRTOgorICAgICAgICB7CisgICAgICAgICAgICAqdHlwZSA9IEdMX0lOVDsKKyAgICAgICAgICAgICpudW1QYXJhbXMgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9NQVhfVkVSVEVYX0FUVFJJQlM6CisgICAgICBjYXNlIEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTOgorICAgICAgY2FzZSBHTF9NQVhfVkFSWUlOR19WRUNUT1JTOgorICAgICAgY2FzZSBHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUzoKKyAgICAgIGNhc2UgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTOgorICAgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUUzoKKyAgICAgIGNhc2UgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzoKKyAgICAgIGNhc2UgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFOgorICAgICAgY2FzZSBHTF9OVU1fU0hBREVSX0JJTkFSWV9GT1JNQVRTOgorICAgICAgY2FzZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICBjYXNlIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HOgorICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQklORElORzoKKyAgICAgIGNhc2UgR0xfQ1VSUkVOVF9QUk9HUkFNOgorICAgICAgY2FzZSBHTF9QQUNLX0FMSUdOTUVOVDoKKyAgICAgIGNhc2UgR0xfVU5QQUNLX0FMSUdOTUVOVDoKKyAgICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQ6CisgICAgICBjYXNlIEdMX0ZSQUdNRU5UX1NIQURFUl9ERVJJVkFUSVZFX0hJTlRfT0VTOgorICAgICAgY2FzZSBHTF9SRURfQklUUzoKKyAgICAgIGNhc2UgR0xfR1JFRU5fQklUUzoKKyAgICAgIGNhc2UgR0xfQkxVRV9CSVRTOgorICAgICAgY2FzZSBHTF9BTFBIQV9CSVRTOgorICAgICAgY2FzZSBHTF9ERVBUSF9CSVRTOgorICAgICAgY2FzZSBHTF9TVEVOQ0lMX0JJVFM6CisgICAgICBjYXNlIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkc6CisgICAgICBjYXNlIEdMX0NVTExfRkFDRV9NT0RFOgorICAgICAgY2FzZSBHTF9GUk9OVF9GQUNFOgorICAgICAgY2FzZSBHTF9BQ1RJVkVfVEVYVFVSRToKKyAgICAgIGNhc2UgR0xfU1RFTkNJTF9GVU5DOgorICAgICAgY2FzZSBHTF9TVEVOQ0lMX1ZBTFVFX01BU0s6CisgICAgICBjYXNlIEdMX1NURU5DSUxfUkVGOgorICAgICAgY2FzZSBHTF9TVEVOQ0lMX0ZBSUw6CisgICAgICBjYXNlIEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMOgorICAgICAgY2FzZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUzoKKyAgICAgIGNhc2UgR0xfU1RFTkNJTF9CQUNLX0ZVTkM6CisgICAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19WQUxVRV9NQVNLOgorICAgICAgY2FzZSBHTF9TVEVOQ0lMX0JBQ0tfUkVGOgorICAgICAgY2FzZSBHTF9TVEVOQ0lMX0JBQ0tfRkFJTDoKKyAgICAgIGNhc2UgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTDoKKyAgICAgIGNhc2UgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUzoKKyAgICAgIGNhc2UgR0xfREVQVEhfRlVOQzoKKyAgICAgIGNhc2UgR0xfQkxFTkRfU1JDX1JHQjoKKyAgICAgIGNhc2UgR0xfQkxFTkRfU1JDX0FMUEhBOgorICAgICAgY2FzZSBHTF9CTEVORF9EU1RfUkdCOgorICAgICAgY2FzZSBHTF9CTEVORF9EU1RfQUxQSEE6CisgICAgICBjYXNlIEdMX0JMRU5EX0VRVUFUSU9OX1JHQjoKKyAgICAgIGNhc2UgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEE6CisgICAgICBjYXNlIEdMX1NURU5DSUxfV1JJVEVNQVNLOgorICAgICAgY2FzZSBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLOgorICAgICAgY2FzZSBHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFOgorICAgICAgY2FzZSBHTF9TVUJQSVhFTF9CSVRTOgorICAgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TSVpFOgorICAgICAgY2FzZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOgorICAgICAgY2FzZSBHTF9TQU1QTEVfQlVGRkVSUzoKKyAgICAgIGNhc2UgR0xfU0FNUExFUzoKKyAgICAgIGNhc2UgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFOgorICAgICAgY2FzZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVDoKKyAgICAgIGNhc2UgR0xfVEVYVFVSRV9CSU5ESU5HXzJEOgorICAgICAgY2FzZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVA6CisgICAgICAgIHsKKyAgICAgICAgICAgICp0eXBlID0gR0xfSU5UOworICAgICAgICAgICAgKm51bVBhcmFtcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX01BWF9TQU1QTEVTX0FOR0xFOgorICAgICAgICB7CisgICAgICAgICAgICAqdHlwZSA9IEdMX0lOVDsKKyAgICAgICAgICAgICpudW1QYXJhbXMgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9NQVhfVklFV1BPUlRfRElNUzoKKyAgICAgICAgeworICAgICAgICAgICAgKnR5cGUgPSBHTF9JTlQ7CisgICAgICAgICAgICAqbnVtUGFyYW1zID0gMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfVklFV1BPUlQ6CisgICAgICBjYXNlIEdMX1NDSVNTT1JfQk9YOgorICAgICAgICB7CisgICAgICAgICAgICAqdHlwZSA9IEdMX0lOVDsKKyAgICAgICAgICAgICpudW1QYXJhbXMgPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9TSEFERVJfQ09NUElMRVI6CisgICAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQ6CisgICAgICBjYXNlIEdMX0RFUFRIX1dSSVRFTUFTSzoKKyAgICAgIGNhc2UgR0xfQ1VMTF9GQUNFOiAgICAgICAgICAgICAgICAvLyBDVUxMX0ZBQ0UgdGhyb3VnaCBESVRIRVIgYXJlIG5hdHVyYWwgdG8gSXNFbmFibGVkLAorICAgICAgY2FzZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMOiAgICAgIC8vIGJ1dCBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIEdldHtUeXBlfXYgcXVlcmllcy4KKyAgICAgIGNhc2UgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOiAvLyBGb3IgdGhpcyBwdXJwb3NlLCB0aGV5IGFyZSB0cmVhdGVkIGhlcmUgYXMgYm9vbC1uYXR1cmFsCisgICAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRToKKyAgICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOgorICAgICAgY2FzZSBHTF9TVEVOQ0lMX1RFU1Q6CisgICAgICBjYXNlIEdMX0RFUFRIX1RFU1Q6CisgICAgICBjYXNlIEdMX0JMRU5EOgorICAgICAgY2FzZSBHTF9ESVRIRVI6CisgICAgICAgIHsKKyAgICAgICAgICAgICp0eXBlID0gR0xfQk9PTDsKKyAgICAgICAgICAgICpudW1QYXJhbXMgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9DT0xPUl9XUklURU1BU0s6CisgICAgICAgIHsKKyAgICAgICAgICAgICp0eXBlID0gR0xfQk9PTDsKKyAgICAgICAgICAgICpudW1QYXJhbXMgPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1I6CisgICAgICBjYXNlIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTOgorICAgICAgY2FzZSBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUU6CisgICAgICBjYXNlIEdMX0RFUFRIX0NMRUFSX1ZBTFVFOgorICAgICAgY2FzZSBHTF9MSU5FX1dJRFRIOgorICAgICAgICB7CisgICAgICAgICAgICAqdHlwZSA9IEdMX0ZMT0FUOworICAgICAgICAgICAgKm51bVBhcmFtcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRToKKyAgICAgIGNhc2UgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFOgorICAgICAgY2FzZSBHTF9ERVBUSF9SQU5HRToKKyAgICAgICAgeworICAgICAgICAgICAgKnR5cGUgPSBHTF9GTE9BVDsKKyAgICAgICAgICAgICpudW1QYXJhbXMgPSAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9DT0xPUl9DTEVBUl9WQUxVRToKKyAgICAgIGNhc2UgR0xfQkxFTkRfQ09MT1I6CisgICAgICAgIHsKKyAgICAgICAgICAgICp0eXBlID0gR0xfRkxPQVQ7CisgICAgICAgICAgICAqbnVtUGFyYW1zID0gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQXBwbGllcyB0aGUgcmVuZGVyIHRhcmdldCBzdXJmYWNlLCBkZXB0aCBzdGVuY2lsIHN1cmZhY2UsIHZpZXdwb3J0IHJlY3RhbmdsZSBhbmQgc2Npc3NvciByZWN0YW5nbGUKK2Jvb2wgQ29udGV4dDo6YXBwbHlSZW5kZXJUYXJnZXQoYm9vbCBpZ25vcmVWaWV3cG9ydCkKK3sKKyAgICBEZXZpY2UgKmRldmljZSA9IGdldERldmljZSgpOworCisgICAgRnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyT2JqZWN0ID0gZ2V0RHJhd0ZyYW1lYnVmZmVyKCk7CisKKyAgICBpZighZnJhbWVidWZmZXJPYmplY3QgfHwgZnJhbWVidWZmZXJPYmplY3QtPmNvbXBsZXRlbmVzcygpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OLCBmYWxzZSk7CisgICAgfQorCisgICAgSW1hZ2UgKnJlbmRlclRhcmdldCA9IGZyYW1lYnVmZmVyT2JqZWN0LT5nZXRSZW5kZXJUYXJnZXQoKTsKKworICAgIGlmKCFyZW5kZXJUYXJnZXQpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gQ29udGV4dCBtdXN0IGJlIGxvc3QKKyAgICB9CisKKyAgICBJbWFnZSAqZGVwdGhTdGVuY2lsID0gTlVMTDsKKworICAgIHVuc2lnbmVkIGludCByZW5kZXJUYXJnZXRTZXJpYWwgPSBmcmFtZWJ1ZmZlck9iamVjdC0+Z2V0UmVuZGVyVGFyZ2V0U2VyaWFsKCk7CisgICAgaWYocmVuZGVyVGFyZ2V0U2VyaWFsICE9IG1BcHBsaWVkUmVuZGVyVGFyZ2V0U2VyaWFsKQorICAgIHsKKyAgICAgICAgZGV2aWNlLT5zZXRSZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0KTsKKyAgICAgICAgbUFwcGxpZWRSZW5kZXJUYXJnZXRTZXJpYWwgPSByZW5kZXJUYXJnZXRTZXJpYWw7CisgICAgICAgIG1TY2lzc29yU3RhdGVEaXJ0eSA9IHRydWU7ICAgLy8gU2Npc3NvciBhcmVhIG11c3QgYmUgY2xhbXBlZCB0byByZW5kZXIgdGFyZ2V0J3Mgc2l6ZSAtIHRoaXMgaXMgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgcmVuZGVyIHRhcmdldHMuCisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGRlcHRoYnVmZmVyU2VyaWFsID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgc3RlbmNpbGJ1ZmZlclNlcmlhbCA9IDA7CisgICAgaWYoZnJhbWVidWZmZXJPYmplY3QtPmdldERlcHRoYnVmZmVyVHlwZSgpICE9IEdMX05PTkUpCisgICAgeworICAgICAgICBkZXB0aFN0ZW5jaWwgPSBmcmFtZWJ1ZmZlck9iamVjdC0+Z2V0RGVwdGhidWZmZXIoKS0+Z2V0RGVwdGhTdGVuY2lsKCk7CisgICAgICAgIGlmKCFkZXB0aFN0ZW5jaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiRGVwdGggc3RlbmNpbCBwb2ludGVyIHVuZXhwZWN0ZWRseSBudWxsLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkZXB0aGJ1ZmZlclNlcmlhbCA9IGZyYW1lYnVmZmVyT2JqZWN0LT5nZXREZXB0aGJ1ZmZlcigpLT5nZXRTZXJpYWwoKTsKKyAgICB9CisgICAgZWxzZSBpZihmcmFtZWJ1ZmZlck9iamVjdC0+Z2V0U3RlbmNpbGJ1ZmZlclR5cGUoKSAhPSBHTF9OT05FKQorICAgIHsKKyAgICAgICAgZGVwdGhTdGVuY2lsID0gZnJhbWVidWZmZXJPYmplY3QtPmdldFN0ZW5jaWxidWZmZXIoKS0+Z2V0RGVwdGhTdGVuY2lsKCk7CisgICAgICAgIGlmKCFkZXB0aFN0ZW5jaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiRGVwdGggc3RlbmNpbCBwb2ludGVyIHVuZXhwZWN0ZWRseSBudWxsLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdGVuY2lsYnVmZmVyU2VyaWFsID0gZnJhbWVidWZmZXJPYmplY3QtPmdldFN0ZW5jaWxidWZmZXIoKS0+Z2V0U2VyaWFsKCk7CisgICAgfQorCisgICAgaWYoZGVwdGhidWZmZXJTZXJpYWwgIT0gbUFwcGxpZWREZXB0aGJ1ZmZlclNlcmlhbCB8fAorICAgICAgIHN0ZW5jaWxidWZmZXJTZXJpYWwgIT0gbUFwcGxpZWRTdGVuY2lsYnVmZmVyU2VyaWFsIHx8CisgICAgICAgIW1EZXB0aFN0ZW5jaWxJbml0aWFsaXplZCkKKyAgICB7CisgICAgICAgIGRldmljZS0+c2V0RGVwdGhTdGVuY2lsU3VyZmFjZShkZXB0aFN0ZW5jaWwpOworICAgICAgICBtQXBwbGllZERlcHRoYnVmZmVyU2VyaWFsID0gZGVwdGhidWZmZXJTZXJpYWw7CisgICAgICAgIG1BcHBsaWVkU3RlbmNpbGJ1ZmZlclNlcmlhbCA9IHN0ZW5jaWxidWZmZXJTZXJpYWw7CisgICAgICAgIG1EZXB0aFN0ZW5jaWxJbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisgICAgVmlld3BvcnQgdmlld3BvcnQ7CisKKyAgICBmbG9hdCB6TmVhciA9IGNsYW1wMDEobVN0YXRlLnpOZWFyKTsKKyAgICBmbG9hdCB6RmFyID0gY2xhbXAwMShtU3RhdGUuekZhcik7CisKKyAgICBpZihpZ25vcmVWaWV3cG9ydCkKKyAgICB7CisgICAgICAgIHZpZXdwb3J0LnggPSAwOworICAgICAgICB2aWV3cG9ydC55ID0gMDsKKyAgICAgICAgdmlld3BvcnQud2lkdGggPSByZW5kZXJUYXJnZXQtPmdldFdpZHRoKCk7CisgICAgICAgIHZpZXdwb3J0LmhlaWdodCA9IHJlbmRlclRhcmdldC0+Z2V0SGVpZ2h0KCk7CisgICAgICAgIHZpZXdwb3J0Lm1pblogPSAwLjBmOworICAgICAgICB2aWV3cG9ydC5tYXhaID0gMS4wZjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3c6OlJlY3QgcmVjdCA9IHRyYW5zZm9ybVBpeGVsUmVjdChtU3RhdGUudmlld3BvcnRYLCBtU3RhdGUudmlld3BvcnRZLCBtU3RhdGUudmlld3BvcnRXaWR0aCwgbVN0YXRlLnZpZXdwb3J0SGVpZ2h0LCByZW5kZXJUYXJnZXQtPmdldEhlaWdodCgpKTsKKyAgICAgICAgdmlld3BvcnQueCA9IGNsYW1wKHJlY3QubGVmdCwgMEwsIHN0YXRpY19jYXN0PExPTkc+KHJlbmRlclRhcmdldC0+Z2V0V2lkdGgoKSkpOworICAgICAgICB2aWV3cG9ydC55ID0gY2xhbXAocmVjdC50b3AsIDBMLCBzdGF0aWNfY2FzdDxMT05HPihyZW5kZXJUYXJnZXQtPmdldEhlaWdodCgpKSk7CisgICAgICAgIHZpZXdwb3J0LndpZHRoID0gY2xhbXAocmVjdC5yaWdodCAtIHJlY3QubGVmdCwgMEwsIHN0YXRpY19jYXN0PExPTkc+KHJlbmRlclRhcmdldC0+Z2V0V2lkdGgoKSkgLSBzdGF0aWNfY2FzdDxMT05HPih2aWV3cG9ydC54KSk7CisgICAgICAgIHZpZXdwb3J0LmhlaWdodCA9IGNsYW1wKHJlY3QuYm90dG9tIC0gcmVjdC50b3AsIDBMLCBzdGF0aWNfY2FzdDxMT05HPihyZW5kZXJUYXJnZXQtPmdldEhlaWdodCgpKSAtIHN0YXRpY19jYXN0PExPTkc+KHZpZXdwb3J0LnkpKTsKKyAgICAgICAgdmlld3BvcnQubWluWiA9IHpOZWFyOworICAgICAgICB2aWV3cG9ydC5tYXhaID0gekZhcjsKKyAgICB9CisKKyAgICBpZih2aWV3cG9ydC53aWR0aCA8PSAwIHx8IHZpZXdwb3J0LmhlaWdodCA8PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIE5vdGhpbmcgdG8gcmVuZGVyCisgICAgfQorCisgICAgZGV2aWNlLT5zZXRWaWV3cG9ydCh2aWV3cG9ydCk7CisKKyAgICBpZihtU2Npc3NvclN0YXRlRGlydHkpCisgICAgeworICAgICAgICBpZihtU3RhdGUuc2Npc3NvclRlc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3OjpSZWN0IHJlY3QgPSB0cmFuc2Zvcm1QaXhlbFJlY3QobVN0YXRlLnNjaXNzb3JYLCBtU3RhdGUuc2Npc3NvclksIG1TdGF0ZS5zY2lzc29yV2lkdGgsIG1TdGF0ZS5zY2lzc29ySGVpZ2h0LCByZW5kZXJUYXJnZXQtPmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIHJlY3QubGVmdCA9IGNsYW1wKHJlY3QubGVmdCwgMEwsIHN0YXRpY19jYXN0PExPTkc+KHJlbmRlclRhcmdldC0+Z2V0V2lkdGgoKSkpOworICAgICAgICAgICAgcmVjdC50b3AgPSBjbGFtcChyZWN0LnRvcCwgMEwsIHN0YXRpY19jYXN0PExPTkc+KHJlbmRlclRhcmdldC0+Z2V0SGVpZ2h0KCkpKTsKKyAgICAgICAgICAgIHJlY3QucmlnaHQgPSBjbGFtcChyZWN0LnJpZ2h0LCAwTCwgc3RhdGljX2Nhc3Q8TE9ORz4ocmVuZGVyVGFyZ2V0LT5nZXRXaWR0aCgpKSk7CisgICAgICAgICAgICByZWN0LmJvdHRvbSA9IGNsYW1wKHJlY3QuYm90dG9tLCAwTCwgc3RhdGljX2Nhc3Q8TE9ORz4ocmVuZGVyVGFyZ2V0LT5nZXRIZWlnaHQoKSkpOworICAgICAgICAgICAgZGV2aWNlLT5zZXRTY2lzc29yUmVjdChyZWN0KTsKKyAgICAgICAgICAgIGRldmljZS0+c2V0U2Npc3NvckVuYWJsZSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldmljZS0+c2V0U2Npc3NvckVuYWJsZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtU2Npc3NvclN0YXRlRGlydHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZihtU3RhdGUuY3VycmVudFByb2dyYW0pCisgICAgeworICAgICAgICBQcm9ncmFtICpwcm9ncmFtT2JqZWN0ID0gZ2V0Q3VycmVudFByb2dyYW0oKTsKKworICAgICAgICBHTGludCBoYWxmUGl4ZWxTaXplID0gcHJvZ3JhbU9iamVjdC0+Z2V0RHhIYWxmUGl4ZWxTaXplTG9jYXRpb24oKTsKKyAgICAgICAgR0xmbG9hdCB4eVsyXSA9IHsxLjBmIC8gdmlld3BvcnQud2lkdGgsIC0xLjBmIC8gdmlld3BvcnQuaGVpZ2h0fTsKKyAgICAgICAgcHJvZ3JhbU9iamVjdC0+c2V0VW5pZm9ybTJmdihoYWxmUGl4ZWxTaXplLCAxLCB4eSk7CisKKyAgICAgICAgR0xpbnQgdmlld3BvcnQgPSBwcm9ncmFtT2JqZWN0LT5nZXREeFZpZXdwb3J0TG9jYXRpb24oKTsKKyAgICAgICAgR0xmbG9hdCB3aHh5WzRdID0ge21TdGF0ZS52aWV3cG9ydFdpZHRoIC8gMi4wZiwgbVN0YXRlLnZpZXdwb3J0SGVpZ2h0IC8gMi4wZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpbVN0YXRlLnZpZXdwb3J0WCArIG1TdGF0ZS52aWV3cG9ydFdpZHRoIC8gMi4wZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpbVN0YXRlLnZpZXdwb3J0WSArIG1TdGF0ZS52aWV3cG9ydEhlaWdodCAvIDIuMGZ9OworICAgICAgICBwcm9ncmFtT2JqZWN0LT5zZXRVbmlmb3JtNGZ2KHZpZXdwb3J0LCAxLCB3aHh5KTsKKworICAgICAgICBHTGludCBkZXB0aCA9IHByb2dyYW1PYmplY3QtPmdldER4RGVwdGhMb2NhdGlvbigpOworICAgICAgICBHTGZsb2F0IGR6WzJdID0geyh6RmFyIC0gek5lYXIpIC8gMi4wZiwgKHpOZWFyICsgekZhcikgLyAyLjBmfTsKKyAgICAgICAgcHJvZ3JhbU9iamVjdC0+c2V0VW5pZm9ybTJmdihkZXB0aCwgMSwgZHopOworCisgICAgICAgIEdMaW50IGRlcHRoUmFuZ2UgPSBwcm9ncmFtT2JqZWN0LT5nZXREeERlcHRoUmFuZ2VMb2NhdGlvbigpOworICAgICAgICBHTGZsb2F0IG5lYXJGYXJEaWZmWzNdID0ge3pOZWFyLCB6RmFyLCB6RmFyIC0gek5lYXJ9OworICAgICAgICBwcm9ncmFtT2JqZWN0LT5zZXRVbmlmb3JtM2Z2KGRlcHRoUmFuZ2UsIDEsIG5lYXJGYXJEaWZmKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQXBwbGllcyB0aGUgZml4ZWQtZnVuY3Rpb24gc3RhdGUgKGN1bGxpbmcsIGRlcHRoIHRlc3QsIGFscGhhIGJsZW5kaW5nLCBzdGVuY2lsaW5nLCBldGMpCit2b2lkIENvbnRleHQ6OmFwcGx5U3RhdGUoR0xlbnVtIGRyYXdNb2RlKQoreworICAgIERldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisgICAgUHJvZ3JhbSAqcHJvZ3JhbU9iamVjdCA9IGdldEN1cnJlbnRQcm9ncmFtKCk7CisKKyAgICBGcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXJPYmplY3QgPSBnZXREcmF3RnJhbWVidWZmZXIoKTsKKworICAgIEdMZW51bSBhZGp1c3RlZEZyb250RmFjZSA9IGFkanVzdFdpbmRpbmcobVN0YXRlLmZyb250RmFjZSk7CisKKyAgICBHTGludCBmcm9udENDVyA9IHByb2dyYW1PYmplY3QtPmdldER4RnJvbnRDQ1dMb2NhdGlvbigpOworICAgIEdMaW50IGNjdyA9IChhZGp1c3RlZEZyb250RmFjZSA9PSBHTF9DQ1cpOworICAgIHByb2dyYW1PYmplY3QtPnNldFVuaWZvcm0xaXYoZnJvbnRDQ1csIDEsICZjY3cpOworCisgICAgR0xpbnQgcG9pbnRzT3JMaW5lcyA9IHByb2dyYW1PYmplY3QtPmdldER4UG9pbnRzT3JMaW5lc0xvY2F0aW9uKCk7CisgICAgR0xpbnQgYWx3YXlzRnJvbnQgPSAhaXNUcmlhbmdsZU1vZGUoZHJhd01vZGUpOworICAgIHByb2dyYW1PYmplY3QtPnNldFVuaWZvcm0xaXYocG9pbnRzT3JMaW5lcywgMSwgJmFsd2F5c0Zyb250KTsKKworICAgIGlmKG1DdWxsU3RhdGVEaXJ0eSB8fCBtRnJvbnRGYWNlRGlydHkpCisgICAgeworICAgICAgICBpZihtU3RhdGUuY3VsbEZhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldmljZS0+c2V0Q3VsbE1vZGUoZXMyc3c6OkNvbnZlcnRDdWxsTW9kZShtU3RhdGUuY3VsbE1vZGUsIGFkanVzdGVkRnJvbnRGYWNlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisJCQlkZXZpY2UtPnNldEN1bGxNb2RlKHN3OjpDb250ZXh0OjpDVUxMX05PTkUpOworICAgICAgICB9CisKKyAgICAgICAgbUN1bGxTdGF0ZURpcnR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYobURlcHRoU3RhdGVEaXJ0eSkKKyAgICB7CisgICAgICAgIGlmKG1TdGF0ZS5kZXB0aFRlc3QpCisgICAgICAgIHsKKwkJCWRldmljZS0+c2V0RGVwdGhCdWZmZXJFbmFibGUodHJ1ZSk7CisJCQlkZXZpY2UtPnNldERlcHRoQ29tcGFyZShlczJzdzo6Q29udmVydERlcHRoQ29tcGFyaXNvbihtU3RhdGUuZGVwdGhGdW5jKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZXZpY2UtPnNldERlcHRoQnVmZmVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1EZXB0aFN0YXRlRGlydHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZihtQmxlbmRTdGF0ZURpcnR5KQorICAgIHsKKyAgICAgICAgaWYobVN0YXRlLmJsZW5kKQorICAgICAgICB7CisJCQlkZXZpY2UtPnNldEFscGhhQmxlbmRFbmFibGUodHJ1ZSk7CisJCQlkZXZpY2UtPnNldFNlcGFyYXRlQWxwaGFCbGVuZEVuYWJsZSh0cnVlKTsKKworICAgICAgICAgICAgZGV2aWNlLT5zZXRCbGVuZENvbnN0YW50KGVzMnN3OjpDb252ZXJ0Q29sb3IobVN0YXRlLmJsZW5kQ29sb3IpKTsKKworCQkJZGV2aWNlLT5zZXRTb3VyY2VCbGVuZEZhY3RvcihlczJzdzo6Q29udmVydEJsZW5kRnVuYyhtU3RhdGUuc291cmNlQmxlbmRSR0IpKTsKKwkJCWRldmljZS0+c2V0RGVzdEJsZW5kRmFjdG9yKGVzMnN3OjpDb252ZXJ0QmxlbmRGdW5jKG1TdGF0ZS5kZXN0QmxlbmRSR0IpKTsKKwkJCWRldmljZS0+c2V0QmxlbmRPcGVyYXRpb24oZXMyc3c6OkNvbnZlcnRCbGVuZE9wKG1TdGF0ZS5ibGVuZEVxdWF0aW9uUkdCKSk7CisKKyAgICAgICAgICAgIGRldmljZS0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShlczJzdzo6Q29udmVydEJsZW5kRnVuYyhtU3RhdGUuc291cmNlQmxlbmRBbHBoYSkpOworCQkJZGV2aWNlLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShlczJzdzo6Q29udmVydEJsZW5kRnVuYyhtU3RhdGUuZGVzdEJsZW5kQWxwaGEpKTsKKwkJCWRldmljZS0+c2V0QmxlbmRPcGVyYXRpb25BbHBoYShlczJzdzo6Q29udmVydEJsZW5kT3AobVN0YXRlLmJsZW5kRXF1YXRpb25BbHBoYSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCQkJZGV2aWNlLT5zZXRBbHBoYUJsZW5kRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1CbGVuZFN0YXRlRGlydHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZihtU3RlbmNpbFN0YXRlRGlydHkgfHwgbUZyb250RmFjZURpcnR5KQorICAgIHsKKyAgICAgICAgaWYobVN0YXRlLnN0ZW5jaWxUZXN0ICYmIGZyYW1lYnVmZmVyT2JqZWN0LT5oYXNTdGVuY2lsKCkpCisgICAgICAgIHsKKwkJCWRldmljZS0+c2V0U3RlbmNpbEVuYWJsZSh0cnVlKTsKKwkJCWRldmljZS0+c2V0VHdvU2lkZWRTdGVuY2lsKHRydWUpOworCisgICAgICAgICAgICBpZihtU3RhdGUuc3RlbmNpbFdyaXRlbWFzayAhPSBtU3RhdGUuc3RlbmNpbEJhY2tXcml0ZW1hc2sgfHwgCisgICAgICAgICAgICAgICBtU3RhdGUuc3RlbmNpbFJlZiAhPSBtU3RhdGUuc3RlbmNpbEJhY2tSZWYgfHwgCisgICAgICAgICAgICAgICBtU3RhdGUuc3RlbmNpbE1hc2sgIT0gbVN0YXRlLnN0ZW5jaWxCYWNrTWFzaykKKyAgICAgICAgICAgIHsKKwkJCQlFUlIoIlNlcGFyYXRlIGZyb250L2JhY2sgc3RlbmNpbCB3cml0ZW1hc2tzLCByZWZlcmVuY2UgdmFsdWVzLCBvciBzdGVuY2lsIG1hc2sgdmFsdWVzIGFyZSBpbnZhbGlkIHVuZGVyIFdlYkdMLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBzdGVuY2lsIHJlZgorICAgICAgICAgICAgRGVwdGhTdGVuY2lsYnVmZmVyICpzdGVuY2lsYnVmZmVyID0gZnJhbWVidWZmZXJPYmplY3QtPmdldFN0ZW5jaWxidWZmZXIoKTsKKyAgICAgICAgICAgIEdMdWludCBtYXhTdGVuY2lsID0gKDEgPDwgc3RlbmNpbGJ1ZmZlci0+Z2V0U3RlbmNpbFNpemUoKSkgLSAxOworCisJCQlpZihhZGp1c3RlZEZyb250RmFjZSA9PSBHTF9DQ1cpCisJCQl7CisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsV3JpdGVNYXNrKG1TdGF0ZS5zdGVuY2lsV3JpdGVtYXNrKTsKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxDb21wYXJlKGVzMnN3OjpDb252ZXJ0U3RlbmNpbENvbXBhcmlzb24obVN0YXRlLnN0ZW5jaWxGdW5jKSk7CisKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxSZWZlcmVuY2UoKG1TdGF0ZS5zdGVuY2lsUmVmIDwgKEdMaW50KW1heFN0ZW5jaWwpID8gbVN0YXRlLnN0ZW5jaWxSZWYgOiBtYXhTdGVuY2lsKTsKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxNYXNrKG1TdGF0ZS5zdGVuY2lsTWFzayk7CisKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKGVzMnN3OjpDb252ZXJ0U3RlbmNpbE9wKG1TdGF0ZS5zdGVuY2lsRmFpbCkpOworCQkJCWRldmljZS0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKGVzMnN3OjpDb252ZXJ0U3RlbmNpbE9wKG1TdGF0ZS5zdGVuY2lsUGFzc0RlcHRoRmFpbCkpOworCQkJCWRldmljZS0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oZXMyc3c6OkNvbnZlcnRTdGVuY2lsT3AobVN0YXRlLnN0ZW5jaWxQYXNzRGVwdGhQYXNzKSk7CisKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxXcml0ZU1hc2tDQ1cobVN0YXRlLnN0ZW5jaWxCYWNrV3JpdGVtYXNrKTsKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxDb21wYXJlQ0NXKGVzMnN3OjpDb252ZXJ0U3RlbmNpbENvbXBhcmlzb24obVN0YXRlLnN0ZW5jaWxCYWNrRnVuYykpOworCisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsUmVmZXJlbmNlQ0NXKChtU3RhdGUuc3RlbmNpbEJhY2tSZWYgPCAoR0xpbnQpbWF4U3RlbmNpbCkgPyBtU3RhdGUuc3RlbmNpbEJhY2tSZWYgOiBtYXhTdGVuY2lsKTsKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxNYXNrQ0NXKG1TdGF0ZS5zdGVuY2lsQmFja01hc2spOworCisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbkNDVyhlczJzdzo6Q29udmVydFN0ZW5jaWxPcChtU3RhdGUuc3RlbmNpbEJhY2tGYWlsKSk7CisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1coZXMyc3c6OkNvbnZlcnRTdGVuY2lsT3AobVN0YXRlLnN0ZW5jaWxCYWNrUGFzc0RlcHRoRmFpbCkpOworCQkJCWRldmljZS0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb25DQ1coZXMyc3c6OkNvbnZlcnRTdGVuY2lsT3AobVN0YXRlLnN0ZW5jaWxCYWNrUGFzc0RlcHRoUGFzcykpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWRldmljZS0+c2V0U3RlbmNpbFdyaXRlTWFza0NDVyhtU3RhdGUuc3RlbmNpbFdyaXRlbWFzayk7CisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsQ29tcGFyZUNDVyhlczJzdzo6Q29udmVydFN0ZW5jaWxDb21wYXJpc29uKG1TdGF0ZS5zdGVuY2lsRnVuYykpOworCisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsUmVmZXJlbmNlQ0NXKChtU3RhdGUuc3RlbmNpbFJlZiA8IChHTGludCltYXhTdGVuY2lsKSA/IG1TdGF0ZS5zdGVuY2lsUmVmIDogbWF4U3RlbmNpbCk7CisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsTWFza0NDVyhtU3RhdGUuc3RlbmNpbE1hc2spOworCisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbkNDVyhlczJzdzo6Q29udmVydFN0ZW5jaWxPcChtU3RhdGUuc3RlbmNpbEZhaWwpKTsKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhlczJzdzo6Q29udmVydFN0ZW5jaWxPcChtU3RhdGUuc3RlbmNpbFBhc3NEZXB0aEZhaWwpKTsKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uQ0NXKGVzMnN3OjpDb252ZXJ0U3RlbmNpbE9wKG1TdGF0ZS5zdGVuY2lsUGFzc0RlcHRoUGFzcykpOworCisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsV3JpdGVNYXNrKG1TdGF0ZS5zdGVuY2lsQmFja1dyaXRlbWFzayk7CisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsQ29tcGFyZShlczJzdzo6Q29udmVydFN0ZW5jaWxDb21wYXJpc29uKG1TdGF0ZS5zdGVuY2lsQmFja0Z1bmMpKTsKKworCQkJCWRldmljZS0+c2V0U3RlbmNpbFJlZmVyZW5jZSgobVN0YXRlLnN0ZW5jaWxCYWNrUmVmIDwgKEdMaW50KW1heFN0ZW5jaWwpID8gbVN0YXRlLnN0ZW5jaWxCYWNrUmVmIDogbWF4U3RlbmNpbCk7CisJCQkJZGV2aWNlLT5zZXRTdGVuY2lsTWFzayhtU3RhdGUuc3RlbmNpbEJhY2tNYXNrKTsKKworCQkJCWRldmljZS0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oZXMyc3c6OkNvbnZlcnRTdGVuY2lsT3AobVN0YXRlLnN0ZW5jaWxCYWNrRmFpbCkpOworCQkJCWRldmljZS0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKGVzMnN3OjpDb252ZXJ0U3RlbmNpbE9wKG1TdGF0ZS5zdGVuY2lsQmFja1Bhc3NEZXB0aEZhaWwpKTsKKwkJCQlkZXZpY2UtPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKGVzMnN3OjpDb252ZXJ0U3RlbmNpbE9wKG1TdGF0ZS5zdGVuY2lsQmFja1Bhc3NEZXB0aFBhc3MpKTsKKwkJCX0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKwkJCWRldmljZS0+c2V0U3RlbmNpbEVuYWJsZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtU3RlbmNpbFN0YXRlRGlydHkgPSBmYWxzZTsKKyAgICAgICAgbUZyb250RmFjZURpcnR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYobU1hc2tTdGF0ZURpcnR5KQorICAgIHsKKwkJZGV2aWNlLT5zZXRDb2xvcldyaXRlTWFzaygwLCBlczJzdzo6Q29udmVydENvbG9yTWFzayhtU3RhdGUuY29sb3JNYXNrUmVkLCBtU3RhdGUuY29sb3JNYXNrR3JlZW4sIG1TdGF0ZS5jb2xvck1hc2tCbHVlLCBtU3RhdGUuY29sb3JNYXNrQWxwaGEpKTsKKwkJZGV2aWNlLT5zZXREZXB0aFdyaXRlRW5hYmxlKG1TdGF0ZS5kZXB0aE1hc2spOworCisgICAgICAgIG1NYXNrU3RhdGVEaXJ0eSA9IGZhbHNlOworICAgIH0KKworICAgIGlmKG1Qb2x5Z29uT2Zmc2V0U3RhdGVEaXJ0eSkKKyAgICB7CisgICAgICAgIGlmKG1TdGF0ZS5wb2x5Z29uT2Zmc2V0RmlsbCkKKyAgICAgICAgeworICAgICAgICAgICAgRGVwdGhTdGVuY2lsYnVmZmVyICpkZXB0aGJ1ZmZlciA9IGZyYW1lYnVmZmVyT2JqZWN0LT5nZXREZXB0aGJ1ZmZlcigpOworICAgICAgICAgICAgaWYoZGVwdGhidWZmZXIpCisgICAgICAgICAgICB7CisJCQkJZGV2aWNlLT5zZXRTbG9wZURlcHRoQmlhcyhtU3RhdGUucG9seWdvbk9mZnNldEZhY3Rvcik7CisgICAgICAgICAgICAgICAgZmxvYXQgZGVwdGhCaWFzID0gbGRleHAobVN0YXRlLnBvbHlnb25PZmZzZXRVbml0cywgLShpbnQpKGRlcHRoYnVmZmVyLT5nZXREZXB0aFNpemUoKSkpOworCQkJCWRldmljZS0+c2V0RGVwdGhCaWFzKGRlcHRoQmlhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZXZpY2UtPnNldFNsb3BlRGVwdGhCaWFzKDApOworICAgICAgICAgICAgZGV2aWNlLT5zZXREZXB0aEJpYXMoMCk7CisgICAgICAgIH0KKworICAgICAgICBtUG9seWdvbk9mZnNldFN0YXRlRGlydHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZihtU2FtcGxlU3RhdGVEaXJ0eSkKKyAgICB7CisgICAgICAgIGlmKG1TdGF0ZS5zYW1wbGVBbHBoYVRvQ292ZXJhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJWE1FKCJTYW1wbGUgYWxwaGEgdG8gY292ZXJhZ2UgaXMgdW5pbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKG1TdGF0ZS5zYW1wbGVDb3ZlcmFnZSkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IG1hc2sgPSAwOworICAgICAgICAgICAgaWYobVN0YXRlLnNhbXBsZUNvdmVyYWdlVmFsdWUgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0aHJlc2hvbGQgPSAwLjVmOworCisgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGZyYW1lYnVmZmVyT2JqZWN0LT5nZXRTYW1wbGVzKCk7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPDw9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKGkgKyAxKSAqIG1TdGF0ZS5zYW1wbGVDb3ZlcmFnZVZhbHVlID49IHRocmVzaG9sZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkICs9IDEuMGY7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKG1TdGF0ZS5zYW1wbGVDb3ZlcmFnZUludmVydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gfm1hc2s7CisgICAgICAgICAgICB9CisKKwkJCWRldmljZS0+c2V0TXVsdGlTYW1wbGVNYXNrKG1hc2spOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCQkJZGV2aWNlLT5zZXRNdWx0aVNhbXBsZU1hc2soMHhGRkZGRkZGRik7CisgICAgICAgIH0KKworICAgICAgICBtU2FtcGxlU3RhdGVEaXJ0eSA9IGZhbHNlOworICAgIH0KKworICAgIGlmKG1EaXRoZXJTdGF0ZURpcnR5KQorICAgIHsKKyAgICAvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKworICAgICAgICBtRGl0aGVyU3RhdGVEaXJ0eSA9IGZhbHNlOworICAgIH0KK30KKworR0xlbnVtIENvbnRleHQ6OmFwcGx5VmVydGV4QnVmZmVyKEdMaW50IGJhc2UsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQoreworICAgIFRyYW5zbGF0ZWRBdHRyaWJ1dGUgYXR0cmlidXRlc1tNQVhfVkVSVEVYX0FUVFJJQlNdOworCisgICAgR0xlbnVtIGVyciA9IG1WZXJ0ZXhEYXRhTWFuYWdlci0+cHJlcGFyZVZlcnRleERhdGEoZmlyc3QsIGNvdW50LCBhdHRyaWJ1dGVzKTsKKyAgICBpZihlcnIgIT0gR0xfTk9fRVJST1IpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIERldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisJUHJvZ3JhbSAqcHJvZ3JhbSA9IGdldEN1cnJlbnRQcm9ncmFtKCk7CisKKwlkZXZpY2UtPnJlc2V0SW5wdXRTdHJlYW1zKGZhbHNlKTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfVkVSVEVYX0FUVFJJQlM7IGkrKykKKwl7CQkJCisJCWlmKCFhdHRyaWJ1dGVzW2ldLmFjdGl2ZSkKKwkJeworCQkJY29udGludWU7CisJCX0KKworCQlzdzo6UmVzb3VyY2UgKnJlc291cmNlID0gYXR0cmlidXRlc1tpXS52ZXJ0ZXhCdWZmZXI7CisJCWNvbnN0IHZvaWQgKmJ1ZmZlciA9IChjaGFyKilyZXNvdXJjZS0+Z2V0QnVmZmVyKCkgKyBhdHRyaWJ1dGVzW2ldLm9mZnNldDsKKwkJCQorCQlpbnQgc3RyaWRlID0gYXR0cmlidXRlc1tpXS5zdHJpZGU7CisKKwkJYnVmZmVyID0gKGNoYXIqKWJ1ZmZlciArIHN0cmlkZSAqIGJhc2U7CisKKwkJc3c6OlN0cmVhbSBhdHRyaWJ1dGUocmVzb3VyY2UsIGJ1ZmZlciwgc3RyaWRlKTsKKworCQlhdHRyaWJ1dGUudHlwZSA9IGF0dHJpYnV0ZXNbaV0udHlwZTsKKwkJYXR0cmlidXRlLmNvdW50ID0gYXR0cmlidXRlc1tpXS5jb3VudDsKKwkJYXR0cmlidXRlLm5vcm1hbGl6ZWQgPSBhdHRyaWJ1dGVzW2ldLm5vcm1hbGl6ZWQ7CisKKwkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCAxNjsgc3RyZWFtKyspCisJCXsKKwkJCWlmKHByb2dyYW0tPmdldFZlcnRleFNoYWRlcigpLT5pbnB1dFtzdHJlYW1dLnVzYWdlID09IHN3OjpTaGFkZXJPcGVyYXRpb246OlVTQUdFX1RFWENPT1JEICYmCisJCQkgICBwcm9ncmFtLT5nZXRWZXJ0ZXhTaGFkZXIoKS0+aW5wdXRbc3RyZWFtXS5pbmRleCA9PSBwcm9ncmFtLT5nZXRTZW1hbnRpY0luZGV4KGkpKQorCQkJeworCQkJCWRldmljZS0+c2V0SW5wdXRTdHJlYW0oc3RyZWFtLCBhdHRyaWJ1dGUpOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gR0xfTk9fRVJST1I7Cit9CisKKy8vIEFwcGxpZXMgdGhlIGluZGljZXMgYW5kIGVsZW1lbnQgYXJyYXkgYmluZGluZ3MKK0dMZW51bSBDb250ZXh0OjphcHBseUluZGV4QnVmZmVyKGNvbnN0IHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgY291bnQsIEdMZW51bSBtb2RlLCBHTGVudW0gdHlwZSwgVHJhbnNsYXRlZEluZGV4RGF0YSAqaW5kZXhJbmZvKQoreworICAgIERldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisgICAgR0xlbnVtIGVyciA9IG1JbmRleERhdGFNYW5hZ2VyLT5wcmVwYXJlSW5kZXhEYXRhKHR5cGUsIGNvdW50LCBtU3RhdGUuZWxlbWVudEFycmF5QnVmZmVyLmdldCgpLCBpbmRpY2VzLCBpbmRleEluZm8pOworCisgICAgaWYoZXJyID09IEdMX05PX0VSUk9SKQorICAgIHsKKyAgICAgICAgZGV2aWNlLT5zZXRJbmRleEJ1ZmZlcihpbmRleEluZm8tPmluZGV4QnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCisvLyBBcHBsaWVzIHRoZSBzaGFkZXJzIGFuZCBzaGFkZXIgY29uc3RhbnRzCit2b2lkIENvbnRleHQ6OmFwcGx5U2hhZGVycygpCit7CisgICAgRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKyAgICBQcm9ncmFtICpwcm9ncmFtT2JqZWN0ID0gZ2V0Q3VycmVudFByb2dyYW0oKTsKKyAgICBzdzo6VmVydGV4U2hhZGVyICp2ZXJ0ZXhTaGFkZXIgPSBwcm9ncmFtT2JqZWN0LT5nZXRWZXJ0ZXhTaGFkZXIoKTsKKyAgICBzdzo6UGl4ZWxTaGFkZXIgKnBpeGVsU2hhZGVyID0gcHJvZ3JhbU9iamVjdC0+Z2V0UGl4ZWxTaGFkZXIoKTsKKworICAgIGRldmljZS0+c2V0VmVydGV4U2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgZGV2aWNlLT5zZXRQaXhlbFNoYWRlcihwaXhlbFNoYWRlcik7CisKKyAgICBpZihwcm9ncmFtT2JqZWN0LT5nZXRTZXJpYWwoKSAhPSBtQXBwbGllZFByb2dyYW1TZXJpYWwpCisgICAgeworICAgICAgICBwcm9ncmFtT2JqZWN0LT5kaXJ0eUFsbFVuaWZvcm1zKCk7CisgICAgICAgIG1BcHBsaWVkUHJvZ3JhbVNlcmlhbCA9IHByb2dyYW1PYmplY3QtPmdldFNlcmlhbCgpOworICAgIH0KKworICAgIHByb2dyYW1PYmplY3QtPmFwcGx5VW5pZm9ybXMoKTsKK30KKworLy8gQXBwbGllcyB0aGUgdGV4dHVyZXMgYW5kIHNhbXBsZXIgc3RhdGVzCit2b2lkIENvbnRleHQ6OmFwcGx5VGV4dHVyZXMoKQoreworICAgIGFwcGx5VGV4dHVyZXMoc3c6OlNBTVBMRVJfUElYRUwpOworCWFwcGx5VGV4dHVyZXMoc3c6OlNBTVBMRVJfVkVSVEVYKTsKK30KKworLy8gRm9yIGVhY2ggRGlyZWN0M0QgOSBzYW1wbGVyIG9mIGVpdGhlciB0aGUgcGl4ZWwgb3IgdmVydGV4IHN0YWdlLAorLy8gbG9va3MgdXAgdGhlIGNvcnJlc3BvbmRpbmcgT3BlbkdMIHRleHR1cmUgaW1hZ2UgdW5pdCBhbmQgdGV4dHVyZSB0eXBlLAorLy8gYW5kIHNldHMgdGhlIHRleHR1cmUgYW5kIGl0cyBhZGRyZXNzaW5nL2ZpbHRlcmluZyBzdGF0ZSAob3IgTlVMTCB3aGVuIGluYWN0aXZlKS4KK3ZvaWQgQ29udGV4dDo6YXBwbHlUZXh0dXJlcyhzdzo6U2FtcGxlclR5cGUgc2FtcGxlclR5cGUpCit7CisgICAgRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKyAgICBQcm9ncmFtICpwcm9ncmFtT2JqZWN0ID0gZ2V0Q3VycmVudFByb2dyYW0oKTsKKworICAgIGludCBzYW1wbGVyQ291bnQgPSAoc2FtcGxlclR5cGUgPT0gc3c6OlNBTVBMRVJfUElYRUwpID8gTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgOiBNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFM7ICAgLy8gUmFuZ2Ugb2Ygc2FtcGxlcnMgb2YgZ2l2ZW4gc2FtcGxlciB0eXBlCisKKyAgICBmb3IoaW50IHNhbXBsZXJJbmRleCA9IDA7IHNhbXBsZXJJbmRleCA8IHNhbXBsZXJDb3VudDsgc2FtcGxlckluZGV4KyspCisgICAgeworICAgICAgICBpbnQgdGV4dHVyZVVuaXQgPSBwcm9ncmFtT2JqZWN0LT5nZXRTYW1wbGVyTWFwcGluZyhzYW1wbGVyVHlwZSwgc2FtcGxlckluZGV4KTsgICAvLyBPcGVuR0wgdGV4dHVyZSBpbWFnZSB1bml0IGluZGV4CisKKyAgICAgICAgaWYodGV4dHVyZVVuaXQgIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRleHR1cmVUeXBlIHRleHR1cmVUeXBlID0gcHJvZ3JhbU9iamVjdC0+Z2V0U2FtcGxlclRleHR1cmVUeXBlKHNhbXBsZXJUeXBlLCBzYW1wbGVySW5kZXgpOworCisgICAgICAgICAgICBUZXh0dXJlICp0ZXh0dXJlID0gZ2V0U2FtcGxlclRleHR1cmUodGV4dHVyZVVuaXQsIHRleHR1cmVUeXBlKTsKKworCQkJaWYodGV4dHVyZS0+aXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdMZW51bSB3cmFwUyA9IHRleHR1cmUtPmdldFdyYXBTKCk7CisgICAgICAgICAgICAgICAgR0xlbnVtIHdyYXBUID0gdGV4dHVyZS0+Z2V0V3JhcFQoKTsKKyAgICAgICAgICAgICAgICBHTGVudW0gdGV4RmlsdGVyID0gdGV4dHVyZS0+Z2V0TWluRmlsdGVyKCk7CisgICAgICAgICAgICAgICAgR0xlbnVtIG1hZ0ZpbHRlciA9IHRleHR1cmUtPmdldE1hZ0ZpbHRlcigpOworCisJCQkJZGV2aWNlLT5zZXRBZGRyZXNzaW5nTW9kZVUoc2FtcGxlclR5cGUsIHNhbXBsZXJJbmRleCwgZXMyc3c6OkNvbnZlcnRUZXh0dXJlV3JhcCh3cmFwUykpOworICAgICAgICAgICAgICAgIGRldmljZS0+c2V0QWRkcmVzc2luZ01vZGVWKHNhbXBsZXJUeXBlLCBzYW1wbGVySW5kZXgsIGVzMnN3OjpDb252ZXJ0VGV4dHVyZVdyYXAod3JhcFQpKTsKKworCQkJCXN3OjpGaWx0ZXJUeXBlIG1pbkZpbHRlcjsKKwkJCQlzdzo6TWlwbWFwVHlwZSBtaXBGaWx0ZXI7CisgICAgICAgICAgICAgICAgZXMyc3c6OkNvbnZlcnRNaW5GaWx0ZXIodGV4RmlsdGVyLCAmbWluRmlsdGVyLCAmbWlwRmlsdGVyKTsKKwkJCS8vCUFTU0VSVChtaW5GaWx0ZXIgPT0gZXMyc3c6OkNvbnZlcnRNYWdGaWx0ZXIobWFnRmlsdGVyKSk7CisKKwkJCQlkZXZpY2UtPnNldFRleHR1cmVGaWx0ZXIoc2FtcGxlclR5cGUsIHNhbXBsZXJJbmRleCwgbWluRmlsdGVyKTsKKwkJCS8vCWRldmljZS0+c2V0VGV4dHVyZUZpbHRlcihzYW1wbGVyVHlwZSwgc2FtcGxlckluZGV4LCBlczJzdzo6Q29udmVydE1hZ0ZpbHRlcihtYWdGaWx0ZXIpKTsKKwkJCQlkZXZpY2UtPnNldE1pcG1hcEZpbHRlcihzYW1wbGVyVHlwZSwgc2FtcGxlckluZGV4LCBtaXBGaWx0ZXIpOworICAgICAgICAgICAgICAgIAorCQkJCWFwcGx5VGV4dHVyZShzYW1wbGVyVHlwZSwgc2FtcGxlckluZGV4LCB0ZXh0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcHBseVRleHR1cmUoc2FtcGxlclR5cGUsIHNhbXBsZXJJbmRleCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcHBseVRleHR1cmUoc2FtcGxlclR5cGUsIHNhbXBsZXJJbmRleCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dDo6YXBwbHlUZXh0dXJlKHN3OjpTYW1wbGVyVHlwZSB0eXBlLCBpbnQgaW5kZXgsIFRleHR1cmUgKmJhc2VUZXh0dXJlKQoreworCURldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisJUHJvZ3JhbSAqcHJvZ3JhbSA9IGdldEN1cnJlbnRQcm9ncmFtKCk7CisJaW50IHNhbXBsZXIgPSAodHlwZSA9PSBzdzo6U0FNUExFUl9QSVhFTCkgPyBpbmRleCA6IDE2ICsgaW5kZXg7CisJYm9vbCB0ZXh0dXJlVXNlZCA9IGZhbHNlOworCisJaWYodHlwZSA9PSBzdzo6U0FNUExFUl9QSVhFTCkKKwl7CisJCXRleHR1cmVVc2VkID0gcHJvZ3JhbS0+Z2V0UGl4ZWxTaGFkZXIoKS0+dXNlc1NhbXBsZXIoaW5kZXgpOworCX0KKwllbHNlIGlmKHR5cGUgPT0gc3c6OlNBTVBMRVJfVkVSVEVYKQorCXsKKwkJdGV4dHVyZVVzZWQgPSBwcm9ncmFtLT5nZXRQaXhlbFNoYWRlcigpLT51c2VzU2FtcGxlcihpbmRleCk7CisJfQorCWVsc2UKKwl7CisJCXRleHR1cmVVc2VkID0gdHJ1ZTsgICAvLyBGSVhNRTogQ2hlY2sgZml4ZWQtZnVuY3Rpb24gdXNlPworCX0KKworCXN3OjpSZXNvdXJjZSAqcmVzb3VyY2UgPSAwOworCisJaWYoYmFzZVRleHR1cmUgJiYgdGV4dHVyZVVzZWQpCisJeworCQlyZXNvdXJjZSA9IGJhc2VUZXh0dXJlLT5nZXRSZXNvdXJjZSgpOworCX0KKworCWRldmljZS0+c2V0VGV4dHVyZVJlc291cmNlKHNhbXBsZXIsIHJlc291cmNlKTsKKwkJCQorCWlmKGJhc2VUZXh0dXJlICYmIHRleHR1cmVVc2VkKQorCXsKKwkJaW50IGxldmVsQ291bnQgPSBiYXNlVGV4dHVyZS0+Z2V0TGV2ZWxDb3VudCgpOworCisJCWlmKGJhc2VUZXh0dXJlLT5pc1RleHR1cmUyRCgpKQorCQl7CisJCQlUZXh0dXJlMkQgKnRleHR1cmUgPSBzdGF0aWNfY2FzdDxUZXh0dXJlMkQqPihiYXNlVGV4dHVyZSk7CisKKwkJCWZvcihpbnQgbWlwbWFwTGV2ZWwgPSAwOyBtaXBtYXBMZXZlbCA8IE1JUE1BUF9MRVZFTFM7IG1pcG1hcExldmVsKyspCisJCQl7CisJCQkJaW50IHN1cmZhY2VMZXZlbCA9IG1pcG1hcExldmVsOworCisJCQkJaWYoc3VyZmFjZUxldmVsIDwgMCkKKwkJCQl7CisJCQkJCXN1cmZhY2VMZXZlbCA9IDA7CisJCQkJfQorCQkJCWVsc2UgaWYoc3VyZmFjZUxldmVsID49IGxldmVsQ291bnQpCisJCQkJeworCQkJCQlzdXJmYWNlTGV2ZWwgPSBsZXZlbENvdW50IC0gMTsKKwkJCQl9CisKKwkJCQlJbWFnZSAqc3VyZmFjZSA9IHRleHR1cmUtPmdldEltYWdlKHN1cmZhY2VMZXZlbCk7CisJCQkJZGV2aWNlLT5zZXRUZXh0dXJlTGV2ZWwoc2FtcGxlciwgMCwgbWlwbWFwTGV2ZWwsIHN1cmZhY2UsIHN3OjpURVhUVVJFXzJEKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKGJhc2VUZXh0dXJlLT5pc1RleHR1cmVDdWJlTWFwKCkpCisJCXsKKwkJCWZvcihpbnQgZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspCisJCQl7CisJCQkJVGV4dHVyZUN1YmVNYXAgKmN1YmVUZXh0dXJlID0gc3RhdGljX2Nhc3Q8VGV4dHVyZUN1YmVNYXAqPihiYXNlVGV4dHVyZSk7CisKKwkJCQlmb3IoaW50IG1pcG1hcExldmVsID0gMDsgbWlwbWFwTGV2ZWwgPCBNSVBNQVBfTEVWRUxTOyBtaXBtYXBMZXZlbCsrKQorCQkJCXsKKwkJCQkJaW50IHN1cmZhY2VMZXZlbCA9IG1pcG1hcExldmVsOworCisJCQkJCWlmKHN1cmZhY2VMZXZlbCA8IDApCisJCQkJCXsKKwkJCQkJCXN1cmZhY2VMZXZlbCA9IDA7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihzdXJmYWNlTGV2ZWwgPj0gbGV2ZWxDb3VudCkKKwkJCQkJeworCQkJCQkJc3VyZmFjZUxldmVsID0gbGV2ZWxDb3VudCAtIDE7CisJCQkJCX0KKworCQkJCQlJbWFnZSAqc3VyZmFjZSA9IGN1YmVUZXh0dXJlLT5nZXRJbWFnZSgoQ3ViZUZhY2UpZmFjZSwgc3VyZmFjZUxldmVsKTsKKwkJCQkJZGV2aWNlLT5zZXRUZXh0dXJlTGV2ZWwoc2FtcGxlciwgZmFjZSwgbWlwbWFwTGV2ZWwsIHN1cmZhY2UsIHN3OjpURVhUVVJFX0NVQkUpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIFVOSU1QTEVNRU5URUQoKTsKKwl9CisJZWxzZQorCXsKKwkJZGV2aWNlLT5zZXRUZXh0dXJlTGV2ZWwoc2FtcGxlciwgMCwgMCwgMCwgc3c6OlRFWFRVUkVfTlVMTCk7CisJfQorfQorCit2b2lkIENvbnRleHQ6OnJlYWRQaXhlbHMoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCB2b2lkKiBwaXhlbHMpCit7CisgICAgRnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyID0gZ2V0UmVhZEZyYW1lYnVmZmVyKCk7CisKKyAgICBpZihmcmFtZWJ1ZmZlci0+Y29tcGxldGVuZXNzKCkgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04pOworICAgIH0KKworICAgIGlmKGdldFJlYWRGcmFtZWJ1ZmZlckhhbmRsZSgpICE9IDAgJiYgZnJhbWVidWZmZXItPmdldFNhbXBsZXMoKSAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisKKyAgICBJbWFnZSAqcmVuZGVyVGFyZ2V0ID0gZnJhbWVidWZmZXItPmdldFJlbmRlclRhcmdldCgpOworCisgICAgaWYoIXJlbmRlclRhcmdldCkKKyAgICB7CisgICAgICAgIHJldHVybjsgICAvLyBDb250ZXh0IG11c3QgYmUgbG9zdCwgcmV0dXJuIHNpbGVudGx5CisgICAgfQorCisgICAgRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKwkKKyAgICBJbWFnZSAqc3lzdGVtU3VyZmFjZSA9IGRldmljZS0+Y3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKHJlbmRlclRhcmdldC0+Z2V0V2lkdGgoKSwgcmVuZGVyVGFyZ2V0LT5nZXRIZWlnaHQoKSwgcmVuZGVyVGFyZ2V0LT5nZXRJbnRlcm5hbEZvcm1hdCgpKTsKKworICAgIGlmKCFzeXN0ZW1TdXJmYWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KKworICAgIGlmKHJlbmRlclRhcmdldC0+Z2V0TXVsdGlTYW1wbGVEZXB0aCgpID4gMSkKKyAgICB7CisgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRTogUmVxdWlyZXMgcmVzb2x2ZSB1c2luZyBTdHJldGNoUmVjdCBpbnRvIG5vbi1tdWx0aXNhbXBsZWQgcmVuZGVyIHRhcmdldAorICAgIH0KKworICAgIGJvb2wgc3VjY2VzcyA9IGRldmljZS0+Z2V0UmVuZGVyVGFyZ2V0RGF0YShyZW5kZXJUYXJnZXQsIHN5c3RlbVN1cmZhY2UpOworCisgICAgaWYoIXN1Y2Nlc3MpCisgICAgeworCQlVTlJFQUNIQUJMRSgpOworICAgICAgICBzeXN0ZW1TdXJmYWNlLT5yZWxlYXNlKCk7CisKKyAgICAgICAgcmV0dXJuOyAgIC8vIE5vIHNlbnNpYmxlIGVycm9yIHRvIGdlbmVyYXRlCisgICAgfQorCisgICAgc3c6OlJlY3QgcmVjdCA9IHRyYW5zZm9ybVBpeGVsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCByZW5kZXJUYXJnZXQtPmdldEhlaWdodCgpKTsKKyAgICByZWN0LmxlZnQgPSBjbGFtcChyZWN0LmxlZnQsIDBMLCBzdGF0aWNfY2FzdDxMT05HPihyZW5kZXJUYXJnZXQtPmdldFdpZHRoKCkpKTsKKyAgICByZWN0LnRvcCA9IGNsYW1wKHJlY3QudG9wLCAwTCwgc3RhdGljX2Nhc3Q8TE9ORz4ocmVuZGVyVGFyZ2V0LT5nZXRIZWlnaHQoKSkpOworICAgIHJlY3QucmlnaHQgPSBjbGFtcChyZWN0LnJpZ2h0LCAwTCwgc3RhdGljX2Nhc3Q8TE9ORz4ocmVuZGVyVGFyZ2V0LT5nZXRXaWR0aCgpKSk7CisgICAgcmVjdC5ib3R0b20gPSBjbGFtcChyZWN0LmJvdHRvbSwgMEwsIHN0YXRpY19jYXN0PExPTkc+KHJlbmRlclRhcmdldC0+Z2V0SGVpZ2h0KCkpKTsKKworICAgIHZvaWQgKmJ1ZmZlciA9IHN5c3RlbVN1cmZhY2UtPmxvY2socmVjdC5sZWZ0LCByZWN0LnRvcCwgc3c6OkxPQ0tfUkVBRE9OTFkpOworCisgICAgaWYoIWJ1ZmZlcikKKyAgICB7CisgICAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIHN5c3RlbVN1cmZhY2UtPnJlbGVhc2UoKTsKKworICAgICAgICByZXR1cm47ICAgLy8gTm8gc2Vuc2libGUgZXJyb3IgdG8gZ2VuZXJhdGUKKyAgICB9CisKKyAgICB1bnNpZ25lZCBjaGFyICpzb3VyY2UgPSAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcikgKyBzeXN0ZW1TdXJmYWNlLT5nZXRQaXRjaCgpICogKHJlY3QuYm90dG9tIC0gcmVjdC50b3AgLSAxKTsKKyAgICB1bnNpZ25lZCBjaGFyICpkZXN0ID0gKHVuc2lnbmVkIGNoYXIqKXBpeGVsczsKKyAgICB1bnNpZ25lZCBzaG9ydCAqZGVzdDE2ID0gKHVuc2lnbmVkIHNob3J0KilwaXhlbHM7CisgICAgaW50IGlucHV0UGl0Y2ggPSAtKGludClzeXN0ZW1TdXJmYWNlLT5nZXRQaXRjaCgpOworICAgIEdMc2l6ZWkgb3V0cHV0UGl0Y2ggPSBDb21wdXRlUGl0Y2god2lkdGgsIGZvcm1hdCwgdHlwZSwgbVN0YXRlLnBhY2tBbGlnbm1lbnQpOworCisgICAgZm9yKGludCBqID0gMDsgaiA8IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7IGorKykKKyAgICB7CisgICAgICAgIGlmKHJlbmRlclRhcmdldC0+Z2V0SW50ZXJuYWxGb3JtYXQoKSA9PSBzdzo6Rk9STUFUX0E4UjhHOEI4ICYmCisgICAgICAgICAgIGZvcm1hdCA9PSBHTF9CR1JBX0VYVCAmJgorICAgICAgICAgICB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgRVhUX3JlYWRfZm9ybWF0X2JncmEsIGdpdmVuCisgICAgICAgICAgICAvLyBhbiBSR0JBIHNvdXJjZSBidWZmZXIuICBOb3RlIHRoYXQgYnVmZmVycyB3aXRoIG5vCisgICAgICAgICAgICAvLyBhbHBoYSBnbyB0aHJvdWdoIHRoZSBzbG93IHBhdGggYmVsb3cuCisgICAgICAgICAgICBtZW1jcHkoZGVzdCArIGogKiBvdXRwdXRQaXRjaCwKKyAgICAgICAgICAgICAgICAgICBzb3VyY2UgKyBqICogaW5wdXRQaXRjaCwKKyAgICAgICAgICAgICAgICAgICAocmVjdC5yaWdodCAtIHJlY3QubGVmdCkgKiA0KTsKKyAgICAgICAgfQorCQllbHNlCisJCXsKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OyBpKyspCisJCQl7CisJCQkJZmxvYXQgcjsKKwkJCQlmbG9hdCBnOworCQkJCWZsb2F0IGI7CisJCQkJZmxvYXQgYTsKKworCQkJCXN3aXRjaChyZW5kZXJUYXJnZXQtPmdldEludGVybmFsRm9ybWF0KCkpCisJCQkJeworCQkJCWNhc2Ugc3c6OkZPUk1BVF9SNUc2QjU6CisJCQkJCXsKKwkJCQkJCXVuc2lnbmVkIHNob3J0IHJnYiA9ICoodW5zaWduZWQgc2hvcnQqKShzb3VyY2UgKyAyICogaSArIGogKiBpbnB1dFBpdGNoKTsKKworCQkJCQkJYSA9IDEuMGY7CisJCQkJCQliID0gKHJnYiAmIDB4MDAxRikgKiAoMS4wZiAvIDB4MDAxRik7CisJCQkJCQlnID0gKHJnYiAmIDB4MDdFMCkgKiAoMS4wZiAvIDB4MDdFMCk7CisJCQkJCQlyID0gKHJnYiAmIDB4RjgwMCkgKiAoMS4wZiAvIDB4RjgwMCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBzdzo6Rk9STUFUX0ExUjVHNUI1OgorCQkJCQl7CisJCQkJCQl1bnNpZ25lZCBzaG9ydCBhcmdiID0gKih1bnNpZ25lZCBzaG9ydCopKHNvdXJjZSArIDIgKiBpICsgaiAqIGlucHV0UGl0Y2gpOworCisJCQkJCQlhID0gKGFyZ2IgJiAweDgwMDApID8gMS4wZiA6IDAuMGY7CisJCQkJCQliID0gKGFyZ2IgJiAweDAwMUYpICogKDEuMGYgLyAweDAwMUYpOworCQkJCQkJZyA9IChhcmdiICYgMHgwM0UwKSAqICgxLjBmIC8gMHgwM0UwKTsKKwkJCQkJCXIgPSAoYXJnYiAmIDB4N0MwMCkgKiAoMS4wZiAvIDB4N0MwMCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBzdzo6Rk9STUFUX0E4UjhHOEI4OgorCQkJCQl7CisJCQkJCQl1bnNpZ25lZCBpbnQgYXJnYiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlICsgNCAqIGkgKyBqICogaW5wdXRQaXRjaCk7CisKKwkJCQkJCWEgPSAoYXJnYiAmIDB4RkYwMDAwMDApICogKDEuMGYgLyAweEZGMDAwMDAwKTsKKwkJCQkJCWIgPSAoYXJnYiAmIDB4MDAwMDAwRkYpICogKDEuMGYgLyAweDAwMDAwMEZGKTsKKwkJCQkJCWcgPSAoYXJnYiAmIDB4MDAwMEZGMDApICogKDEuMGYgLyAweDAwMDBGRjAwKTsKKwkJCQkJCXIgPSAoYXJnYiAmIDB4MDBGRjAwMDApICogKDEuMGYgLyAweDAwRkYwMDAwKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIHN3OjpGT1JNQVRfWDhSOEc4Qjg6CisJCQkJCXsKKwkJCQkJCXVuc2lnbmVkIGludCB4cmdiID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UgKyA0ICogaSArIGogKiBpbnB1dFBpdGNoKTsKKworCQkJCQkJYSA9IDEuMGY7CisJCQkJCQliID0gKHhyZ2IgJiAweDAwMDAwMEZGKSAqICgxLjBmIC8gMHgwMDAwMDBGRik7CisJCQkJCQlnID0gKHhyZ2IgJiAweDAwMDBGRjAwKSAqICgxLjBmIC8gMHgwMDAwRkYwMCk7CisJCQkJCQlyID0gKHhyZ2IgJiAweDAwRkYwMDAwKSAqICgxLjBmIC8gMHgwMEZGMDAwMCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBzdzo6Rk9STUFUX0EyUjEwRzEwQjEwOgorCQkJCQl7CisJCQkJCQl1bnNpZ25lZCBpbnQgYXJnYiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlICsgNCAqIGkgKyBqICogaW5wdXRQaXRjaCk7CisKKwkJCQkJCWEgPSAoYXJnYiAmIDB4QzAwMDAwMDApICogKDEuMGYgLyAweEMwMDAwMDAwKTsKKwkJCQkJCWIgPSAoYXJnYiAmIDB4MDAwMDAzRkYpICogKDEuMGYgLyAweDAwMDAwM0ZGKTsKKwkJCQkJCWcgPSAoYXJnYiAmIDB4MDAwRkZDMDApICogKDEuMGYgLyAweDAwMEZGQzAwKTsKKwkJCQkJCXIgPSAoYXJnYiAmIDB4M0ZGMDAwMDApICogKDEuMGYgLyAweDNGRjAwMDAwKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIHN3OjpGT1JNQVRfQTMyQjMyRzMyUjMyRjoKKwkJCQkJeworCQkJCQkJciA9ICooKGZsb2F0Kikoc291cmNlICsgMTYgKiBpICsgaiAqIGlucHV0UGl0Y2gpICsgMCk7CisJCQkJCQlnID0gKigoZmxvYXQqKShzb3VyY2UgKyAxNiAqIGkgKyBqICogaW5wdXRQaXRjaCkgKyAxKTsKKwkJCQkJCWIgPSAqKChmbG9hdCopKHNvdXJjZSArIDE2ICogaSArIGogKiBpbnB1dFBpdGNoKSArIDIpOworCQkJCQkJYSA9ICooKGZsb2F0Kikoc291cmNlICsgMTYgKiBpICsgaiAqIGlucHV0UGl0Y2gpICsgMyk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBzdzo6Rk9STUFUX0ExNkIxNkcxNlIxNkY6CisJCQkJCXsKKwkJCQkJCXIgPSAoZmxvYXQpKigoc3c6OmhhbGYqKShzb3VyY2UgKyA4ICogaSArIGogKiBpbnB1dFBpdGNoKSArIDApOworCQkJCQkJZyA9IChmbG9hdCkqKChzdzo6aGFsZiopKHNvdXJjZSArIDggKiBpICsgaiAqIGlucHV0UGl0Y2gpICsgMSk7CisJCQkJCQliID0gKGZsb2F0KSooKHN3OjpoYWxmKikoc291cmNlICsgOCAqIGkgKyBqICogaW5wdXRQaXRjaCkgKyAyKTsKKwkJCQkJCWEgPSAoZmxvYXQpKigoc3c6OmhhbGYqKShzb3VyY2UgKyA4ICogaSArIGogKiBpbnB1dFBpdGNoKSArIDMpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCVVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorCQkJCQlVTlJFQUNIQUJMRSgpOworCQkJCX0KKworCQkJCXN3aXRjaCAoZm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEdMX1JHQkE6CisJCQkJCXN3aXRjaCAodHlwZSkKKwkJCQkJeworCQkJCQljYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisJCQkJCQlkZXN0WzQgKiBpICsgaiAqIG91dHB1dFBpdGNoICsgMF0gPSAodW5zaWduZWQgY2hhcikoMjU1ICogciArIDAuNWYpOworCQkJCQkJZGVzdFs0ICogaSArIGogKiBvdXRwdXRQaXRjaCArIDFdID0gKHVuc2lnbmVkIGNoYXIpKDI1NSAqIGcgKyAwLjVmKTsKKwkJCQkJCWRlc3RbNCAqIGkgKyBqICogb3V0cHV0UGl0Y2ggKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSgyNTUgKiBiICsgMC41Zik7CisJCQkJCQlkZXN0WzQgKiBpICsgaiAqIG91dHB1dFBpdGNoICsgM10gPSAodW5zaWduZWQgY2hhcikoMjU1ICogYSArIDAuNWYpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBHTF9CR1JBX0VYVDoKKwkJCQkJc3dpdGNoICh0eXBlKQorCQkJCQl7CisJCQkJCWNhc2UgR0xfVU5TSUdORURfQllURToKKwkJCQkJCWRlc3RbNCAqIGkgKyBqICogb3V0cHV0UGl0Y2ggKyAwXSA9ICh1bnNpZ25lZCBjaGFyKSgyNTUgKiBiICsgMC41Zik7CisJCQkJCQlkZXN0WzQgKiBpICsgaiAqIG91dHB1dFBpdGNoICsgMV0gPSAodW5zaWduZWQgY2hhcikoMjU1ICogZyArIDAuNWYpOworCQkJCQkJZGVzdFs0ICogaSArIGogKiBvdXRwdXRQaXRjaCArIDJdID0gKHVuc2lnbmVkIGNoYXIpKDI1NSAqIHIgKyAwLjVmKTsKKwkJCQkJCWRlc3RbNCAqIGkgKyBqICogb3V0cHV0UGl0Y2ggKyAzXSA9ICh1bnNpZ25lZCBjaGFyKSgyNTUgKiBhICsgMC41Zik7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVl9FWFQ6CisJCQkJCQkvLyBBY2NvcmRpbmcgdG8gdGhlIGRlc2t0b3AgR0wgc3BlYyBpbiB0aGUgIlRyYW5zZmVyIG9mIFBpeGVsIFJlY3RhbmdsZXMiIHNlY3Rpb24KKwkJCQkJCS8vIHRoaXMgdHlwZSBpcyBwYWNrZWQgYXMgZm9sbG93czoKKwkJCQkJCS8vICAgMTUgICAxNCAgIDEzICAgMTIgICAxMSAgIDEwICAgIDkgICAgOCAgICA3ICAgIDYgICAgNSAgICA0ICAgIDMgICAgMiAgICAxICAgIDAKKwkJCQkJCS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkJLy8gfCAgICAgICA0dGggICAgICAgICB8ICAgICAgICAzcmQgICAgICAgICB8ICAgICAgICAybmQgICAgICAgIHwgICAxc3QgY29tcG9uZW50ICAgfAorCQkJCQkJLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCQkvLyBpbiB0aGUgY2FzZSBvZiBCR1JBX0VYVCwgQiBpcyB0aGUgZmlyc3QgY29tcG9uZW50LCBHIHRoZSBzZWNvbmQsIGFuZCBzbyBmb3J0aC4KKwkJCQkJCWRlc3QxNltpICsgaiAqIG91dHB1dFBpdGNoIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KV0gPQorCQkJCQkJCSgodW5zaWduZWQgc2hvcnQpKDE1ICogYSArIDAuNWYpIDw8IDEyKXwKKwkJCQkJCQkoKHVuc2lnbmVkIHNob3J0KSgxNSAqIHIgKyAwLjVmKSA8PCA4KSB8CisJCQkJCQkJKCh1bnNpZ25lZCBzaG9ydCkoMTUgKiBnICsgMC41ZikgPDwgNCkgfAorCQkJCQkJCSgodW5zaWduZWQgc2hvcnQpKDE1ICogYiArIDAuNWYpIDw8IDApOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVZfRVhUOgorCQkJCQkJLy8gQWNjb3JkaW5nIHRvIHRoZSBkZXNrdG9wIEdMIHNwZWMgaW4gdGhlICJUcmFuc2ZlciBvZiBQaXhlbCBSZWN0YW5nbGVzIiBzZWN0aW9uCisJCQkJCQkvLyB0aGlzIHR5cGUgaXMgcGFja2VkIGFzIGZvbGxvd3M6CisJCQkJCQkvLyAgIDE1ICAgMTQgICAxMyAgIDEyICAgMTEgICAxMCAgICA5ICAgIDggICAgNyAgICA2ICAgIDUgICAgNCAgICAzICAgIDIgICAgMSAgICAwCisJCQkJCQkvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJCS8vIHwgNHRoIHwgICAgICAgICAgM3JkICAgICAgICAgICB8ICAgICAgICAgICAybmQgICAgICAgICAgfCAgICAgIDFzdCBjb21wb25lbnQgICAgIHwKKwkJCQkJCS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkJLy8gaW4gdGhlIGNhc2Ugb2YgQkdSQV9FWFQsIEIgaXMgdGhlIGZpcnN0IGNvbXBvbmVudCwgRyB0aGUgc2Vjb25kLCBhbmQgc28gZm9ydGguCisJCQkJCQlkZXN0MTZbaSArIGogKiBvdXRwdXRQaXRjaCAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCldID0KKwkJCQkJCQkoKHVuc2lnbmVkIHNob3J0KSggICAgIGEgKyAwLjVmKSA8PCAxNSkgfAorCQkJCQkJCSgodW5zaWduZWQgc2hvcnQpKDMxICogciArIDAuNWYpIDw8IDEwKSB8CisJCQkJCQkJKCh1bnNpZ25lZCBzaG9ydCkoMzEgKiBnICsgMC41ZikgPDwgNSkgfAorCQkJCQkJCSgodW5zaWduZWQgc2hvcnQpKDMxICogYiArIDAuNWYpIDw8IDApOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBHTF9SR0I6ICAgLy8gSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQKKwkJCQkJc3dpdGNoICh0eXBlKQorCQkJCQl7CisJCQkJCWNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzU6ICAgLy8gSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFCisJCQkJCQlkZXN0MTZbaSArIGogKiBvdXRwdXRQaXRjaCAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCldID0gCisJCQkJCQkJKCh1bnNpZ25lZCBzaG9ydCkoMzEgKiBiICsgMC41ZikgPDwgMCkgfAorCQkJCQkJCSgodW5zaWduZWQgc2hvcnQpKDYzICogZyArIDAuNWYpIDw8IDUpIHwKKwkJCQkJCQkoKHVuc2lnbmVkIHNob3J0KSgzMSAqIHIgKyAwLjVmKSA8PCAxMSk7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworCQkJCX0KKwkJCX0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN5c3RlbVN1cmZhY2UtPnVubG9jaygpOworCisgICAgc3lzdGVtU3VyZmFjZS0+cmVsZWFzZSgpOworfQorCit2b2lkIENvbnRleHQ6OmNsZWFyKEdMYml0ZmllbGQgbWFzaykKK3sKKyAgICBGcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXJPYmplY3QgPSBnZXREcmF3RnJhbWVidWZmZXIoKTsKKworICAgIGlmKCFmcmFtZWJ1ZmZlck9iamVjdCB8fCBmcmFtZWJ1ZmZlck9iamVjdC0+Y29tcGxldGVuZXNzKCkgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04pOworICAgIH0KKworICAgIGVnbDo6RGlzcGxheSAqZGlzcGxheSA9IGdldERpc3BsYXkoKTsKKyAgICBEZXZpY2UgKmRldmljZSA9IGdldERldmljZSgpOworCisgICAgaWYoIWFwcGx5UmVuZGVyVGFyZ2V0KHRydWUpKSAgIC8vIENsaXBzIHRoZSBjbGVhciB0byB0aGUgc2Npc3NvciByZWN0YW5nbGUgYnV0IG5vdCB0aGUgdmlld3BvcnQKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKwl1bnNpZ25lZCBpbnQgY29sb3IgPSAodW5vcm08OD4obVN0YXRlLmNvbG9yQ2xlYXJWYWx1ZS5hbHBoYSkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodW5vcm08OD4obVN0YXRlLmNvbG9yQ2xlYXJWYWx1ZS5yZWQpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHVub3JtPDg+KG1TdGF0ZS5jb2xvckNsZWFyVmFsdWUuZ3JlZW4pIDw8IDgpIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVub3JtPDg+KG1TdGF0ZS5jb2xvckNsZWFyVmFsdWUuYmx1ZSkgPDwgMCk7CisgICAgZmxvYXQgZGVwdGggPSBjbGFtcDAxKG1TdGF0ZS5kZXB0aENsZWFyVmFsdWUpOworICAgIGludCBzdGVuY2lsID0gbVN0YXRlLnN0ZW5jaWxDbGVhclZhbHVlICYgMHgwMDAwMDBGRjsKKworCWlmKG1hc2sgJiBHTF9DT0xPUl9CVUZGRVJfQklUKQorCXsKKwkJdW5zaWduZWQgaW50IHJnYmFNYXNrID0gKG1TdGF0ZS5jb2xvck1hc2tSZWQgPyAweDEgOiAwKSB8CisJCSAgICAgICAgICAgICAgICAgICAgICAgIChtU3RhdGUuY29sb3JNYXNrR3JlZW4gPyAweDIgOiAwKSB8IAorCQkgICAgICAgICAgICAgICAgICAgICAgICAobVN0YXRlLmNvbG9yTWFza0JsdWUgPyAweDQgOiAwKSB8CisJCSAgICAgICAgICAgICAgICAgICAgICAgIChtU3RhdGUuY29sb3JNYXNrQWxwaGEgPyAweDggOiAwKTsKKwkJZGV2aWNlLT5jbGVhckNvbG9yKGNvbG9yLCByZ2JhTWFzayk7CisJfQorCisJaWYobWFzayAmIEdMX0RFUFRIX0JVRkZFUl9CSVQpCisJeworCQlpZihtU3RhdGUuZGVwdGhNYXNrKQorCQl7CisJCQlkZXZpY2UtPmNsZWFyRGVwdGgoZGVwdGgpOworCQl9CisJfQorCisJaWYobWFzayAmIEdMX1NURU5DSUxfQlVGRkVSX0JJVCkKKwl7CisJCWRldmljZS0+Y2xlYXJTdGVuY2lsKHN0ZW5jaWwsIG1TdGF0ZS5zdGVuY2lsV3JpdGVtYXNrKTsKKwl9Cit9CisKK3ZvaWQgQ29udGV4dDo6ZHJhd0FycmF5cyhHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpCit7CisgICAgaWYoIW1TdGF0ZS5jdXJyZW50UHJvZ3JhbSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgfQorCisgICAgZWdsOjpEaXNwbGF5ICpkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOworICAgIERldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisgICAgUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlOworICAgIGludCBwcmltaXRpdmVDb3VudDsKKworICAgIGlmKCFlczJzdzo6Q29udmVydFByaW1pdGl2ZVR5cGUobW9kZSwgY291bnQsIHByaW1pdGl2ZVR5cGUsIHByaW1pdGl2ZUNvdW50KSkKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisKKyAgICBpZihwcmltaXRpdmVDb3VudCA8PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCFhcHBseVJlbmRlclRhcmdldChmYWxzZSkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXBwbHlTdGF0ZShtb2RlKTsKKworICAgIEdMZW51bSBlcnIgPSBhcHBseVZlcnRleEJ1ZmZlcigwLCBmaXJzdCwgY291bnQpOworICAgIGlmKGVyciAhPSBHTF9OT19FUlJPUikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihlcnIpOworICAgIH0KKworICAgIGFwcGx5U2hhZGVycygpOworICAgIGFwcGx5VGV4dHVyZXMoKTsKKworICAgIGlmKCFnZXRDdXJyZW50UHJvZ3JhbSgpLT52YWxpZGF0ZVNhbXBsZXJzKGZhbHNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgfQorCisgICAgaWYoIWN1bGxTa2lwc0RyYXcobW9kZSkpCisgICAgeworICAgICAgICBkZXZpY2UtPmRyYXdQcmltaXRpdmUocHJpbWl0aXZlVHlwZSwgcHJpbWl0aXZlQ291bnQpOworICAgIH0KK30KKwordm9pZCBDb250ZXh0OjpkcmF3RWxlbWVudHMoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzKQoreworICAgIGlmKCFtU3RhdGUuY3VycmVudFByb2dyYW0pCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0KKworICAgIGlmKCFpbmRpY2VzICYmICFtU3RhdGUuZWxlbWVudEFycmF5QnVmZmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisKKyAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBnZXREaXNwbGF5KCk7CisgICAgRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKyAgICBQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGU7CisgICAgaW50IHByaW1pdGl2ZUNvdW50OworCisgICAgaWYoIWVzMnN3OjpDb252ZXJ0UHJpbWl0aXZlVHlwZShtb2RlLCBjb3VudCwgcHJpbWl0aXZlVHlwZSwgcHJpbWl0aXZlQ291bnQpKQorICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKworICAgIGlmKHByaW1pdGl2ZUNvdW50IDw9IDApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoIWFwcGx5UmVuZGVyVGFyZ2V0KGZhbHNlKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhcHBseVN0YXRlKG1vZGUpOworCisgICAgVHJhbnNsYXRlZEluZGV4RGF0YSBpbmRleEluZm87CisgICAgR0xlbnVtIGVyciA9IGFwcGx5SW5kZXhCdWZmZXIoaW5kaWNlcywgY291bnQsIG1vZGUsIHR5cGUsICZpbmRleEluZm8pOworICAgIGlmKGVyciAhPSBHTF9OT19FUlJPUikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihlcnIpOworICAgIH0KKworICAgIEdMc2l6ZWkgdmVydGV4Q291bnQgPSBpbmRleEluZm8ubWF4SW5kZXggLSBpbmRleEluZm8ubWluSW5kZXggKyAxOworICAgIGVyciA9IGFwcGx5VmVydGV4QnVmZmVyKC0oaW50KWluZGV4SW5mby5taW5JbmRleCwgaW5kZXhJbmZvLm1pbkluZGV4LCB2ZXJ0ZXhDb3VudCk7CisgICAgaWYoZXJyICE9IEdMX05PX0VSUk9SKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKGVycik7CisgICAgfQorCisgICAgYXBwbHlTaGFkZXJzKCk7CisgICAgYXBwbHlUZXh0dXJlcygpOworCisgICAgaWYoIWdldEN1cnJlbnRQcm9ncmFtKCktPnZhbGlkYXRlU2FtcGxlcnMoZmFsc2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisKKyAgICBpZighY3VsbFNraXBzRHJhdyhtb2RlKSkKKyAgICB7CisJCWRldmljZS0+ZHJhd0luZGV4ZWRQcmltaXRpdmUocHJpbWl0aXZlVHlwZSwgaW5kZXhJbmZvLmluZGV4T2Zmc2V0LCBwcmltaXRpdmVDb3VudCwgSW5kZXhEYXRhTWFuYWdlcjo6dHlwZVNpemUodHlwZSkpOworICAgIH0KK30KKwordm9pZCBDb250ZXh0OjpmaW5pc2goKQoreworCURldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisKKwlkZXZpY2UtPmZpbmlzaCgpOworfQorCit2b2lkIENvbnRleHQ6OmZsdXNoKCkKK3sKKyAgICAvLyBXZSBkb24ndCBxdWV1ZSBhbnl0aGluZyB3aXRob3V0IHByb2Nlc3NpbmcgaXQgYXMgZmFzdCBhcyBwb3NzaWJsZQorfQorCit2b2lkIENvbnRleHQ6OnJlY29yZEludmFsaWRFbnVtKCkKK3sKKyAgICBtSW52YWxpZEVudW0gPSB0cnVlOworfQorCit2b2lkIENvbnRleHQ6OnJlY29yZEludmFsaWRWYWx1ZSgpCit7CisgICAgbUludmFsaWRWYWx1ZSA9IHRydWU7Cit9CisKK3ZvaWQgQ29udGV4dDo6cmVjb3JkSW52YWxpZE9wZXJhdGlvbigpCit7CisgICAgbUludmFsaWRPcGVyYXRpb24gPSB0cnVlOworfQorCit2b2lkIENvbnRleHQ6OnJlY29yZE91dE9mTWVtb3J5KCkKK3sKKyAgICBtT3V0T2ZNZW1vcnkgPSB0cnVlOworfQorCit2b2lkIENvbnRleHQ6OnJlY29yZEludmFsaWRGcmFtZWJ1ZmZlck9wZXJhdGlvbigpCit7CisgICAgbUludmFsaWRGcmFtZWJ1ZmZlck9wZXJhdGlvbiA9IHRydWU7Cit9CisKKy8vIEdldCBvbmUgb2YgdGhlIHJlY29yZGVkIGVycm9ycyBhbmQgY2xlYXIgaXRzIGZsYWcsIGlmIGFueS4KKy8vIFtPcGVuR0wgRVMgMi4wLjI0XSBzZWN0aW9uIDIuNSBwYWdlIDEzLgorR0xlbnVtIENvbnRleHQ6OmdldEVycm9yKCkKK3sKKyAgICBpZihtSW52YWxpZEVudW0pCisgICAgeworICAgICAgICBtSW52YWxpZEVudW0gPSBmYWxzZTsKKworICAgICAgICByZXR1cm4gR0xfSU5WQUxJRF9FTlVNOworICAgIH0KKworICAgIGlmKG1JbnZhbGlkVmFsdWUpCisgICAgeworICAgICAgICBtSW52YWxpZFZhbHVlID0gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIEdMX0lOVkFMSURfVkFMVUU7CisgICAgfQorCisgICAgaWYobUludmFsaWRPcGVyYXRpb24pCisgICAgeworICAgICAgICBtSW52YWxpZE9wZXJhdGlvbiA9IGZhbHNlOworCisgICAgICAgIHJldHVybiBHTF9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZihtT3V0T2ZNZW1vcnkpCisgICAgeworICAgICAgICBtT3V0T2ZNZW1vcnkgPSBmYWxzZTsKKworICAgICAgICByZXR1cm4gR0xfT1VUX09GX01FTU9SWTsKKyAgICB9CisKKyAgICBpZihtSW52YWxpZEZyYW1lYnVmZmVyT3BlcmF0aW9uKQorICAgIHsKKyAgICAgICAgbUludmFsaWRGcmFtZWJ1ZmZlck9wZXJhdGlvbiA9IGZhbHNlOworCisgICAgICAgIHJldHVybiBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gR0xfTk9fRVJST1I7Cit9CisKK2ludCBDb250ZXh0OjpnZXROZWFyZXN0U3VwcG9ydGVkU2FtcGxlcyhzdzo6Rm9ybWF0IGZvcm1hdCwgaW50IHJlcXVlc3RlZCkgY29uc3QKK3sKKyAgICBpZihyZXF1ZXN0ZWQgPD0gMSkKKyAgICB7CisgICAgICAgIHJldHVybiByZXF1ZXN0ZWQ7CisgICAgfQorCQorCWlmKHJlcXVlc3RlZCA8PSAyKQorCXsKKwkJcmV0dXJuIDI7CisJfQorCQorCXJldHVybiA0OworfQorCit2b2lkIENvbnRleHQ6OmRldGFjaEJ1ZmZlcihHTHVpbnQgYnVmZmVyKQoreworICAgIC8vIFtPcGVuR0wgRVMgMi4wLjI0XSBzZWN0aW9uIDIuOSBwYWdlIDIyOgorICAgIC8vIElmIGEgYnVmZmVyIG9iamVjdCBpcyBkZWxldGVkIHdoaWxlIGl0IGlzIGJvdW5kLCBhbGwgYmluZGluZ3MgdG8gdGhhdCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgY29udGV4dAorICAgIC8vIChpLmUuIGluIHRoZSB0aHJlYWQgdGhhdCBjYWxsZWQgRGVsZXRlLUJ1ZmZlcnMpIGFyZSByZXNldCB0byB6ZXJvLgorCisgICAgaWYobVN0YXRlLmFycmF5QnVmZmVyLmlkKCkgPT0gYnVmZmVyKQorICAgIHsKKyAgICAgICAgbVN0YXRlLmFycmF5QnVmZmVyLnNldChOVUxMKTsKKyAgICB9CisKKyAgICBpZihtU3RhdGUuZWxlbWVudEFycmF5QnVmZmVyLmlkKCkgPT0gYnVmZmVyKQorICAgIHsKKyAgICAgICAgbVN0YXRlLmVsZW1lbnRBcnJheUJ1ZmZlci5zZXQoTlVMTCk7CisgICAgfQorCisgICAgZm9yKGludCBhdHRyaWJ1dGUgPSAwOyBhdHRyaWJ1dGUgPCBNQVhfVkVSVEVYX0FUVFJJQlM7IGF0dHJpYnV0ZSsrKQorICAgIHsKKyAgICAgICAgaWYobVN0YXRlLnZlcnRleEF0dHJpYnV0ZVthdHRyaWJ1dGVdLm1Cb3VuZEJ1ZmZlci5pZCgpID09IGJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgbVN0YXRlLnZlcnRleEF0dHJpYnV0ZVthdHRyaWJ1dGVdLm1Cb3VuZEJ1ZmZlci5zZXQoTlVMTCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dDo6ZGV0YWNoVGV4dHVyZShHTHVpbnQgdGV4dHVyZSkKK3sKKyAgICAvLyBbT3BlbkdMIEVTIDIuMC4yNF0gc2VjdGlvbiAzLjggcGFnZSA4NDoKKyAgICAvLyBJZiBhIHRleHR1cmUgb2JqZWN0IGlzIGRlbGV0ZWQsIGl0IGlzIGFzIGlmIGFsbCB0ZXh0dXJlIHVuaXRzIHdoaWNoIGFyZSBib3VuZCB0byB0aGF0IHRleHR1cmUgb2JqZWN0IGFyZQorICAgIC8vIHJlYm91bmQgdG8gdGV4dHVyZSBvYmplY3QgemVybworCisgICAgZm9yKGludCB0eXBlID0gMDsgdHlwZSA8IFRFWFRVUkVfVFlQRV9DT1VOVDsgdHlwZSsrKQorICAgIHsKKyAgICAgICAgZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8IE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOyBzYW1wbGVyKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1TdGF0ZS5zYW1wbGVyVGV4dHVyZVt0eXBlXVtzYW1wbGVyXS5pZCgpID09IHRleHR1cmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVN0YXRlLnNhbXBsZXJUZXh0dXJlW3R5cGVdW3NhbXBsZXJdLnNldChOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFtPcGVuR0wgRVMgMi4wLjI0XSBzZWN0aW9uIDQuNCBwYWdlIDExMjoKKyAgICAvLyBJZiBhIHRleHR1cmUgb2JqZWN0IGlzIGRlbGV0ZWQgd2hpbGUgaXRzIGltYWdlIGlzIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50bHkgYm91bmQgZnJhbWVidWZmZXIsIHRoZW4gaXQgaXMKKyAgICAvLyBhcyBpZiBGcmFtZWJ1ZmZlclRleHR1cmUyRCBoYWQgYmVlbiBjYWxsZWQsIHdpdGggYSB0ZXh0dXJlIG9mIDAsIGZvciBlYWNoIGF0dGFjaG1lbnQgcG9pbnQgdG8gd2hpY2ggdGhpcworICAgIC8vIGltYWdlIHdhcyBhdHRhY2hlZCBpbiB0aGUgY3VycmVudGx5IGJvdW5kIGZyYW1lYnVmZmVyLgorCisgICAgRnJhbWVidWZmZXIgKnJlYWRGcmFtZWJ1ZmZlciA9IGdldFJlYWRGcmFtZWJ1ZmZlcigpOworICAgIEZyYW1lYnVmZmVyICpkcmF3RnJhbWVidWZmZXIgPSBnZXREcmF3RnJhbWVidWZmZXIoKTsKKworICAgIGlmKHJlYWRGcmFtZWJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJlYWRGcmFtZWJ1ZmZlci0+ZGV0YWNoVGV4dHVyZSh0ZXh0dXJlKTsKKyAgICB9CisKKyAgICBpZihkcmF3RnJhbWVidWZmZXIgJiYgZHJhd0ZyYW1lYnVmZmVyICE9IHJlYWRGcmFtZWJ1ZmZlcikKKyAgICB7CisgICAgICAgIGRyYXdGcmFtZWJ1ZmZlci0+ZGV0YWNoVGV4dHVyZSh0ZXh0dXJlKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dDo6ZGV0YWNoRnJhbWVidWZmZXIoR0x1aW50IGZyYW1lYnVmZmVyKQoreworICAgIC8vIFtPcGVuR0wgRVMgMi4wLjI0XSBzZWN0aW9uIDQuNCBwYWdlIDEwNzoKKyAgICAvLyBJZiBhIGZyYW1lYnVmZmVyIHRoYXQgaXMgY3VycmVudGx5IGJvdW5kIHRvIHRoZSB0YXJnZXQgRlJBTUVCVUZGRVIgaXMgZGVsZXRlZCwgaXQgaXMgYXMgdGhvdWdoCisgICAgLy8gQmluZEZyYW1lYnVmZmVyIGhhZCBiZWVuIGV4ZWN1dGVkIHdpdGggdGhlIHRhcmdldCBvZiBGUkFNRUJVRkZFUiBhbmQgZnJhbWVidWZmZXIgb2YgemVyby4KKworICAgIGlmKG1TdGF0ZS5yZWFkRnJhbWVidWZmZXIgPT0gZnJhbWVidWZmZXIpCisgICAgeworICAgICAgICBiaW5kUmVhZEZyYW1lYnVmZmVyKDApOworICAgIH0KKworICAgIGlmKG1TdGF0ZS5kcmF3RnJhbWVidWZmZXIgPT0gZnJhbWVidWZmZXIpCisgICAgeworICAgICAgICBiaW5kRHJhd0ZyYW1lYnVmZmVyKDApOworICAgIH0KK30KKwordm9pZCBDb250ZXh0OjpkZXRhY2hSZW5kZXJidWZmZXIoR0x1aW50IHJlbmRlcmJ1ZmZlcikKK3sKKyAgICAvLyBbT3BlbkdMIEVTIDIuMC4yNF0gc2VjdGlvbiA0LjQgcGFnZSAxMDk6CisgICAgLy8gSWYgYSByZW5kZXJidWZmZXIgdGhhdCBpcyBjdXJyZW50bHkgYm91bmQgdG8gUkVOREVSQlVGRkVSIGlzIGRlbGV0ZWQsIGl0IGlzIGFzIHRob3VnaCBCaW5kUmVuZGVyYnVmZmVyCisgICAgLy8gaGFkIGJlZW4gZXhlY3V0ZWQgd2l0aCB0aGUgdGFyZ2V0IFJFTkRFUkJVRkZFUiBhbmQgbmFtZSBvZiB6ZXJvLgorCisgICAgaWYobVN0YXRlLnJlbmRlcmJ1ZmZlci5pZCgpID09IHJlbmRlcmJ1ZmZlcikKKyAgICB7CisgICAgICAgIGJpbmRSZW5kZXJidWZmZXIoMCk7CisgICAgfQorCisgICAgLy8gW09wZW5HTCBFUyAyLjAuMjRdIHNlY3Rpb24gNC40IHBhZ2UgMTExOgorICAgIC8vIElmIGEgcmVuZGVyYnVmZmVyIG9iamVjdCBpcyBkZWxldGVkIHdoaWxlIGl0cyBpbWFnZSBpcyBhdHRhY2hlZCB0byB0aGUgY3VycmVudGx5IGJvdW5kIGZyYW1lYnVmZmVyLAorICAgIC8vIHRoZW4gaXQgaXMgYXMgaWYgRnJhbWVidWZmZXJSZW5kZXJidWZmZXIgaGFkIGJlZW4gY2FsbGVkLCB3aXRoIGEgcmVuZGVyYnVmZmVyIG9mIDAsIGZvciBlYWNoIGF0dGFjaG1lbnQKKyAgICAvLyBwb2ludCB0byB3aGljaCB0aGlzIGltYWdlIHdhcyBhdHRhY2hlZCBpbiB0aGUgY3VycmVudGx5IGJvdW5kIGZyYW1lYnVmZmVyLgorCisgICAgRnJhbWVidWZmZXIgKnJlYWRGcmFtZWJ1ZmZlciA9IGdldFJlYWRGcmFtZWJ1ZmZlcigpOworICAgIEZyYW1lYnVmZmVyICpkcmF3RnJhbWVidWZmZXIgPSBnZXREcmF3RnJhbWVidWZmZXIoKTsKKworICAgIGlmKHJlYWRGcmFtZWJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJlYWRGcmFtZWJ1ZmZlci0+ZGV0YWNoUmVuZGVyYnVmZmVyKHJlbmRlcmJ1ZmZlcik7CisgICAgfQorCisgICAgaWYoZHJhd0ZyYW1lYnVmZmVyICYmIGRyYXdGcmFtZWJ1ZmZlciAhPSByZWFkRnJhbWVidWZmZXIpCisgICAgeworICAgICAgICBkcmF3RnJhbWVidWZmZXItPmRldGFjaFJlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpOworICAgIH0KK30KKworYm9vbCBDb250ZXh0OjpjdWxsU2tpcHNEcmF3KEdMZW51bSBkcmF3TW9kZSkKK3sKKyAgICByZXR1cm4gbVN0YXRlLmN1bGxGYWNlICYmIG1TdGF0ZS5jdWxsTW9kZSA9PSBHTF9GUk9OVF9BTkRfQkFDSyAmJiBpc1RyaWFuZ2xlTW9kZShkcmF3TW9kZSk7Cit9CisKK2Jvb2wgQ29udGV4dDo6aXNUcmlhbmdsZU1vZGUoR0xlbnVtIGRyYXdNb2RlKQoreworICAgIHN3aXRjaCAoZHJhd01vZGUpCisgICAgeworICAgICAgY2FzZSBHTF9UUklBTkdMRVM6CisgICAgICBjYXNlIEdMX1RSSUFOR0xFX0ZBTjoKKyAgICAgIGNhc2UgR0xfVFJJQU5HTEVfU1RSSVA6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBHTF9QT0lOVFM6CisgICAgICBjYXNlIEdMX0xJTkVTOgorICAgICAgY2FzZSBHTF9MSU5FX0xPT1A6CisgICAgICBjYXNlIEdMX0xJTkVfU1RSSVA6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENvbnRleHQ6OnNldFZlcnRleEF0dHJpYihHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnZhbHVlcykKK3sKKyAgICBBU1NFUlQoaW5kZXggPCBNQVhfVkVSVEVYX0FUVFJJQlMpOworCisgICAgbVN0YXRlLnZlcnRleEF0dHJpYnV0ZVtpbmRleF0ubUN1cnJlbnRWYWx1ZVswXSA9IHZhbHVlc1swXTsKKyAgICBtU3RhdGUudmVydGV4QXR0cmlidXRlW2luZGV4XS5tQ3VycmVudFZhbHVlWzFdID0gdmFsdWVzWzFdOworICAgIG1TdGF0ZS52ZXJ0ZXhBdHRyaWJ1dGVbaW5kZXhdLm1DdXJyZW50VmFsdWVbMl0gPSB2YWx1ZXNbMl07CisgICAgbVN0YXRlLnZlcnRleEF0dHJpYnV0ZVtpbmRleF0ubUN1cnJlbnRWYWx1ZVszXSA9IHZhbHVlc1szXTsKKworICAgIG1WZXJ0ZXhEYXRhTWFuYWdlci0+ZGlydHlDdXJyZW50VmFsdWUoaW5kZXgpOworfQorCit2b2lkIENvbnRleHQ6OmluaXRFeHRlbnNpb25TdHJpbmcoKQoreworICAgIG1FeHRlbnNpb25TdHJpbmcgKz0gIkdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAiOworICAgIG1FeHRlbnNpb25TdHJpbmcgKz0gIkdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAiOworICAgIG1FeHRlbnNpb25TdHJpbmcgKz0gIkdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhICI7CisgICAgbUV4dGVuc2lvblN0cmluZyArPSAiR0xfQU5HTEVfZnJhbWVidWZmZXJfYmxpdCAiOworICAgIG1FeHRlbnNpb25TdHJpbmcgKz0gIkdMX09FU19yZ2I4X3JnYmE4ICI7CisgICAgbUV4dGVuc2lvblN0cmluZyArPSAiR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzICI7CisgICAgbUV4dGVuc2lvblN0cmluZyArPSAiR0xfTlZfZmVuY2UgIjsKKworICAgIGlmKFMzVENfU1VQUE9SVCkKKyAgICB7CisgICAgICAgIG1FeHRlbnNpb25TdHJpbmcgKz0gIkdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEgIjsKKyAgICB9CisKKyAgICBtRXh0ZW5zaW9uU3RyaW5nICs9ICJHTF9PRVNfdGV4dHVyZV9mbG9hdCAiOworICAgIG1FeHRlbnNpb25TdHJpbmcgKz0gIkdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQgIjsKKyAgICBtRXh0ZW5zaW9uU3RyaW5nICs9ICJHTF9PRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIgIjsKKyAgICBtRXh0ZW5zaW9uU3RyaW5nICs9ICJHTF9PRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciAiOworICAgIG1FeHRlbnNpb25TdHJpbmcgKz0gIkdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICI7CisgICAgbUV4dGVuc2lvblN0cmluZyArPSAiR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludCAiOworICAgIG1FeHRlbnNpb25TdHJpbmcgKz0gIkdMX09FU190ZXh0dXJlX25wb3QgIjsKKworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gbUV4dGVuc2lvblN0cmluZy5maW5kX2xhc3Rfbm90X29mKCcgJyk7CisgICAgaWYoZW5kICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgbUV4dGVuc2lvblN0cmluZy5yZXNpemUoZW5kKzEpOworICAgIH0KK30KKworY29uc3QgY2hhciAqQ29udGV4dDo6Z2V0RXh0ZW5zaW9uU3RyaW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUV4dGVuc2lvblN0cmluZy5jX3N0cigpOworfQorCit2b2lkIENvbnRleHQ6OmJsaXRGcmFtZWJ1ZmZlcihHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYml0ZmllbGQgbWFzaykKK3sKKyAgICBEZXZpY2UgKmRldmljZSA9IGdldERldmljZSgpOworCisgICAgRnJhbWVidWZmZXIgKnJlYWRGcmFtZWJ1ZmZlciA9IGdldFJlYWRGcmFtZWJ1ZmZlcigpOworICAgIEZyYW1lYnVmZmVyICpkcmF3RnJhbWVidWZmZXIgPSBnZXREcmF3RnJhbWVidWZmZXIoKTsKKworICAgIGlmKCFyZWFkRnJhbWVidWZmZXIgfHwgcmVhZEZyYW1lYnVmZmVyLT5jb21wbGV0ZW5lc3MoKSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSB8fAorICAgICAgICAhZHJhd0ZyYW1lYnVmZmVyIHx8IGRyYXdGcmFtZWJ1ZmZlci0+Y29tcGxldGVuZXNzKCkgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04pOworICAgIH0KKworICAgIGlmKGRyYXdGcmFtZWJ1ZmZlci0+Z2V0U2FtcGxlcygpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0KKworICAgIGludCByZWFkQnVmZmVyV2lkdGggPSByZWFkRnJhbWVidWZmZXItPmdldENvbG9yYnVmZmVyKCktPmdldFdpZHRoKCk7CisgICAgaW50IHJlYWRCdWZmZXJIZWlnaHQgPSByZWFkRnJhbWVidWZmZXItPmdldENvbG9yYnVmZmVyKCktPmdldEhlaWdodCgpOworICAgIGludCBkcmF3QnVmZmVyV2lkdGggPSBkcmF3RnJhbWVidWZmZXItPmdldENvbG9yYnVmZmVyKCktPmdldFdpZHRoKCk7CisgICAgaW50IGRyYXdCdWZmZXJIZWlnaHQgPSBkcmF3RnJhbWVidWZmZXItPmdldENvbG9yYnVmZmVyKCktPmdldEhlaWdodCgpOworCisgICAgc3c6OlJlY3Qgc291cmNlUmVjdDsKKyAgICBzdzo6UmVjdCBkZXN0UmVjdDsKKworICAgIGlmKHNyY1gwIDwgc3JjWDEpCisgICAgeworICAgICAgICBzb3VyY2VSZWN0LmxlZnQgPSBzcmNYMDsKKyAgICAgICAgc291cmNlUmVjdC5yaWdodCA9IHNyY1gxOworICAgICAgICBkZXN0UmVjdC5sZWZ0ID0gZHN0WDA7CisgICAgICAgIGRlc3RSZWN0LnJpZ2h0ID0gZHN0WDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNvdXJjZVJlY3QubGVmdCA9IHNyY1gxOworICAgICAgICBkZXN0UmVjdC5sZWZ0ID0gZHN0WDE7CisgICAgICAgIHNvdXJjZVJlY3QucmlnaHQgPSBzcmNYMDsKKyAgICAgICAgZGVzdFJlY3QucmlnaHQgPSBkc3RYMDsKKyAgICB9CisKKyAgICBpZihzcmNZMCA8IHNyY1kxKQorICAgIHsKKyAgICAgICAgc291cmNlUmVjdC50b3AgPSByZWFkQnVmZmVySGVpZ2h0IC0gc3JjWTE7CisgICAgICAgIGRlc3RSZWN0LnRvcCA9IGRyYXdCdWZmZXJIZWlnaHQgLSBkc3RZMTsKKyAgICAgICAgc291cmNlUmVjdC5ib3R0b20gPSByZWFkQnVmZmVySGVpZ2h0IC0gc3JjWTA7CisgICAgICAgIGRlc3RSZWN0LmJvdHRvbSA9IGRyYXdCdWZmZXJIZWlnaHQgLSBkc3RZMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc291cmNlUmVjdC50b3AgPSByZWFkQnVmZmVySGVpZ2h0IC0gc3JjWTA7CisgICAgICAgIGRlc3RSZWN0LnRvcCA9IGRyYXdCdWZmZXJIZWlnaHQgLSBkc3RZMDsKKyAgICAgICAgc291cmNlUmVjdC5ib3R0b20gPSByZWFkQnVmZmVySGVpZ2h0IC0gc3JjWTE7CisgICAgICAgIGRlc3RSZWN0LmJvdHRvbSA9IGRyYXdCdWZmZXJIZWlnaHQgLSBkc3RZMTsKKyAgICB9CisKKyAgICBzdzo6UmVjdCBzb3VyY2VTY2lzc29yZWRSZWN0ID0gc291cmNlUmVjdDsKKyAgICBzdzo6UmVjdCBkZXN0U2Npc3NvcmVkUmVjdCA9IGRlc3RSZWN0OworCisgICAgaWYobVN0YXRlLnNjaXNzb3JUZXN0KQorICAgIHsKKyAgICAgICAgLy8gT25seSB3cml0ZSB0byBwYXJ0cyBvZiB0aGUgZGVzdGluYXRpb24gZnJhbWVidWZmZXIgd2hpY2ggcGFzcyB0aGUgc2Npc3NvciB0ZXN0CisgICAgICAgIC8vIFBsZWFzZSBub3RlOiB0aGUgZGVzdFJlY3QgaXMgbm93IGluIFktZG93biBjb29yZGluYXRlcywgc28gdGhlICp0b3AqIG9mIHRoZQorICAgICAgICAvLyByZWN0IHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHNjaXNzb3JZLCByYXRoZXIgdGhhbiB0aGUgYm90dG9tLgorICAgICAgICBpZihkZXN0UmVjdC5sZWZ0IDwgbVN0YXRlLnNjaXNzb3JYKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeERpZmYgPSBtU3RhdGUuc2Npc3NvclggLSBkZXN0UmVjdC5sZWZ0OworICAgICAgICAgICAgZGVzdFNjaXNzb3JlZFJlY3QubGVmdCA9IG1TdGF0ZS5zY2lzc29yWDsKKyAgICAgICAgICAgIHNvdXJjZVNjaXNzb3JlZFJlY3QubGVmdCArPSB4RGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGRlc3RSZWN0LnJpZ2h0ID4gbVN0YXRlLnNjaXNzb3JYICsgbVN0YXRlLnNjaXNzb3JXaWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHhEaWZmID0gZGVzdFJlY3QucmlnaHQgLSAobVN0YXRlLnNjaXNzb3JYICsgbVN0YXRlLnNjaXNzb3JXaWR0aCk7CisgICAgICAgICAgICBkZXN0U2Npc3NvcmVkUmVjdC5yaWdodCA9IG1TdGF0ZS5zY2lzc29yWCArIG1TdGF0ZS5zY2lzc29yV2lkdGg7CisgICAgICAgICAgICBzb3VyY2VTY2lzc29yZWRSZWN0LnJpZ2h0IC09IHhEaWZmOworICAgICAgICB9CisKKyAgICAgICAgaWYoZGVzdFJlY3QudG9wIDwgbVN0YXRlLnNjaXNzb3JZKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeURpZmYgPSBtU3RhdGUuc2Npc3NvclkgLSBkZXN0UmVjdC50b3A7CisgICAgICAgICAgICBkZXN0U2Npc3NvcmVkUmVjdC50b3AgPSBtU3RhdGUuc2Npc3Nvclk7CisgICAgICAgICAgICBzb3VyY2VTY2lzc29yZWRSZWN0LnRvcCArPSB5RGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGRlc3RSZWN0LmJvdHRvbSA+IG1TdGF0ZS5zY2lzc29yWSArIG1TdGF0ZS5zY2lzc29ySGVpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeURpZmYgPSBkZXN0UmVjdC5ib3R0b20gLSAobVN0YXRlLnNjaXNzb3JZICsgbVN0YXRlLnNjaXNzb3JIZWlnaHQpOworICAgICAgICAgICAgZGVzdFNjaXNzb3JlZFJlY3QuYm90dG9tID0gbVN0YXRlLnNjaXNzb3JZICsgbVN0YXRlLnNjaXNzb3JIZWlnaHQ7CisgICAgICAgICAgICBzb3VyY2VTY2lzc29yZWRSZWN0LmJvdHRvbSAtPSB5RGlmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgYmxpdFJlbmRlclRhcmdldCA9IGZhbHNlOworICAgIGJvb2wgYmxpdERlcHRoU3RlbmNpbCA9IGZhbHNlOworCisgICAgc3c6OlJlY3Qgc291cmNlVHJpbW1lZFJlY3QgPSBzb3VyY2VTY2lzc29yZWRSZWN0OworICAgIHN3OjpSZWN0IGRlc3RUcmltbWVkUmVjdCA9IGRlc3RTY2lzc29yZWRSZWN0OworCisgICAgLy8gVGhlIHNvdXJjZSAmIGRlc3RpbmF0aW9uIHJlY3RhbmdsZXMgYWxzbyBtYXkgbmVlZCB0byBiZSB0cmltbWVkIGlmIHRoZXkgZmFsbCBvdXQgb2YgdGhlIGJvdW5kcyBvZiAKKyAgICAvLyB0aGUgYWN0dWFsIGRyYXcgYW5kIHJlYWQgc3VyZmFjZXMuCisgICAgaWYoc291cmNlVHJpbW1lZFJlY3QubGVmdCA8IDApCisgICAgeworICAgICAgICBpbnQgeERpZmYgPSAwIC0gc291cmNlVHJpbW1lZFJlY3QubGVmdDsKKyAgICAgICAgc291cmNlVHJpbW1lZFJlY3QubGVmdCA9IDA7CisgICAgICAgIGRlc3RUcmltbWVkUmVjdC5sZWZ0ICs9IHhEaWZmOworICAgIH0KKworICAgIGlmKHNvdXJjZVRyaW1tZWRSZWN0LnJpZ2h0ID4gcmVhZEJ1ZmZlcldpZHRoKQorICAgIHsKKyAgICAgICAgaW50IHhEaWZmID0gc291cmNlVHJpbW1lZFJlY3QucmlnaHQgLSByZWFkQnVmZmVyV2lkdGg7CisgICAgICAgIHNvdXJjZVRyaW1tZWRSZWN0LnJpZ2h0ID0gcmVhZEJ1ZmZlcldpZHRoOworICAgICAgICBkZXN0VHJpbW1lZFJlY3QucmlnaHQgLT0geERpZmY7CisgICAgfQorCisgICAgaWYoc291cmNlVHJpbW1lZFJlY3QudG9wIDwgMCkKKyAgICB7CisgICAgICAgIGludCB5RGlmZiA9IDAgLSBzb3VyY2VUcmltbWVkUmVjdC50b3A7CisgICAgICAgIHNvdXJjZVRyaW1tZWRSZWN0LnRvcCA9IDA7CisgICAgICAgIGRlc3RUcmltbWVkUmVjdC50b3AgKz0geURpZmY7CisgICAgfQorCisgICAgaWYoc291cmNlVHJpbW1lZFJlY3QuYm90dG9tID4gcmVhZEJ1ZmZlckhlaWdodCkKKyAgICB7CisgICAgICAgIGludCB5RGlmZiA9IHNvdXJjZVRyaW1tZWRSZWN0LmJvdHRvbSAtIHJlYWRCdWZmZXJIZWlnaHQ7CisgICAgICAgIHNvdXJjZVRyaW1tZWRSZWN0LmJvdHRvbSA9IHJlYWRCdWZmZXJIZWlnaHQ7CisgICAgICAgIGRlc3RUcmltbWVkUmVjdC5ib3R0b20gLT0geURpZmY7CisgICAgfQorCisgICAgaWYoZGVzdFRyaW1tZWRSZWN0LmxlZnQgPCAwKQorICAgIHsKKyAgICAgICAgaW50IHhEaWZmID0gMCAtIGRlc3RUcmltbWVkUmVjdC5sZWZ0OworICAgICAgICBkZXN0VHJpbW1lZFJlY3QubGVmdCA9IDA7CisgICAgICAgIHNvdXJjZVRyaW1tZWRSZWN0LmxlZnQgKz0geERpZmY7CisgICAgfQorCisgICAgaWYoZGVzdFRyaW1tZWRSZWN0LnJpZ2h0ID4gZHJhd0J1ZmZlcldpZHRoKQorICAgIHsKKyAgICAgICAgaW50IHhEaWZmID0gZGVzdFRyaW1tZWRSZWN0LnJpZ2h0IC0gZHJhd0J1ZmZlcldpZHRoOworICAgICAgICBkZXN0VHJpbW1lZFJlY3QucmlnaHQgPSBkcmF3QnVmZmVyV2lkdGg7CisgICAgICAgIHNvdXJjZVRyaW1tZWRSZWN0LnJpZ2h0IC09IHhEaWZmOworICAgIH0KKworICAgIGlmKGRlc3RUcmltbWVkUmVjdC50b3AgPCAwKQorICAgIHsKKyAgICAgICAgaW50IHlEaWZmID0gMCAtIGRlc3RUcmltbWVkUmVjdC50b3A7CisgICAgICAgIGRlc3RUcmltbWVkUmVjdC50b3AgPSAwOworICAgICAgICBzb3VyY2VUcmltbWVkUmVjdC50b3AgKz0geURpZmY7CisgICAgfQorCisgICAgaWYoZGVzdFRyaW1tZWRSZWN0LmJvdHRvbSA+IGRyYXdCdWZmZXJIZWlnaHQpCisgICAgeworICAgICAgICBpbnQgeURpZmYgPSBkZXN0VHJpbW1lZFJlY3QuYm90dG9tIC0gZHJhd0J1ZmZlckhlaWdodDsKKyAgICAgICAgZGVzdFRyaW1tZWRSZWN0LmJvdHRvbSA9IGRyYXdCdWZmZXJIZWlnaHQ7CisgICAgICAgIHNvdXJjZVRyaW1tZWRSZWN0LmJvdHRvbSAtPSB5RGlmZjsKKyAgICB9CisKKyAgICBib29sIHBhcnRpYWxCdWZmZXJDb3B5ID0gZmFsc2U7CisgICAgaWYoc291cmNlVHJpbW1lZFJlY3QuYm90dG9tIC0gc291cmNlVHJpbW1lZFJlY3QudG9wIDwgcmVhZEJ1ZmZlckhlaWdodCB8fAorICAgICAgICBzb3VyY2VUcmltbWVkUmVjdC5yaWdodCAtIHNvdXJjZVRyaW1tZWRSZWN0LmxlZnQgPCByZWFkQnVmZmVyV2lkdGggfHwgCisgICAgICAgIGRlc3RUcmltbWVkUmVjdC5ib3R0b20gLSBkZXN0VHJpbW1lZFJlY3QudG9wIDwgZHJhd0J1ZmZlckhlaWdodCB8fAorICAgICAgICBkZXN0VHJpbW1lZFJlY3QucmlnaHQgLSBkZXN0VHJpbW1lZFJlY3QubGVmdCA8IGRyYXdCdWZmZXJXaWR0aCB8fAorICAgICAgICBzb3VyY2VUcmltbWVkUmVjdC50b3AgIT0gMCB8fCBkZXN0VHJpbW1lZFJlY3QudG9wICE9IDAgfHwgc291cmNlVHJpbW1lZFJlY3QubGVmdCAhPSAwIHx8IGRlc3RUcmltbWVkUmVjdC5sZWZ0ICE9IDApCisgICAgeworICAgICAgICBwYXJ0aWFsQnVmZmVyQ29weSA9IHRydWU7CisgICAgfQorCisgICAgaWYobWFzayAmIEdMX0NPTE9SX0JVRkZFUl9CSVQpCisgICAgeworICAgICAgICBjb25zdCBib29sIHZhbGlkUmVhZFR5cGUgPSByZWFkRnJhbWVidWZmZXItPmdldENvbG9yYnVmZmVyVHlwZSgpID09IEdMX1RFWFRVUkVfMkQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZyYW1lYnVmZmVyLT5nZXRDb2xvcmJ1ZmZlclR5cGUoKSA9PSBHTF9SRU5ERVJCVUZGRVI7CisgICAgICAgIGNvbnN0IGJvb2wgdmFsaWREcmF3VHlwZSA9IGRyYXdGcmFtZWJ1ZmZlci0+Z2V0Q29sb3JidWZmZXJUeXBlKCkgPT0gR0xfVEVYVFVSRV8yRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RnJhbWVidWZmZXItPmdldENvbG9yYnVmZmVyVHlwZSgpID09IEdMX1JFTkRFUkJVRkZFUjsKKyAgICAgICAgaWYoIXZhbGlkUmVhZFR5cGUgfHwgIXZhbGlkRHJhd1R5cGUgfHwKKyAgICAgICAgICAgcmVhZEZyYW1lYnVmZmVyLT5nZXRDb2xvcmJ1ZmZlcigpLT5nZXRJbnRlcm5hbEZvcm1hdCgpICE9IGRyYXdGcmFtZWJ1ZmZlci0+Z2V0Q29sb3JidWZmZXIoKS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgRVJSKCJDb2xvciBidWZmZXIgZm9ybWF0IGNvbnZlcnNpb24gaW4gQmxpdEZyYW1lYnVmZmVyQU5HTEUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihwYXJ0aWFsQnVmZmVyQ29weSAmJiByZWFkRnJhbWVidWZmZXItPmdldFNhbXBsZXMoKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICB9CisKKyAgICAgICAgYmxpdFJlbmRlclRhcmdldCA9IHRydWU7CisKKyAgICB9CisKKyAgICBpZihtYXNrICYgKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQpKQorICAgIHsKKyAgICAgICAgRGVwdGhTdGVuY2lsYnVmZmVyICpyZWFkRFNCdWZmZXIgPSBOVUxMOworICAgICAgICBEZXB0aFN0ZW5jaWxidWZmZXIgKmRyYXdEU0J1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgLy8gV2Ugc3VwcG9ydCBPRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwsIGFuZCBkbyBub3Qgc3VwcG9ydCBhIHNlcGFyYXRlbHkgYXR0YWNoZWQgZGVwdGggYW5kIHN0ZW5jaWwgYnVmZmVyLCBzbyBpZiB3ZSBoYXZlCisgICAgICAgIC8vIGJvdGggYSBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXIsIGl0IHdpbGwgYmUgdGhlIHNhbWUgYnVmZmVyLgorCisgICAgICAgIGlmKG1hc2sgJiBHTF9ERVBUSF9CVUZGRVJfQklUKQorICAgICAgICB7CisgICAgICAgICAgICBpZihyZWFkRnJhbWVidWZmZXItPmdldERlcHRoYnVmZmVyKCkgJiYgZHJhd0ZyYW1lYnVmZmVyLT5nZXREZXB0aGJ1ZmZlcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHJlYWRGcmFtZWJ1ZmZlci0+Z2V0RGVwdGhidWZmZXJUeXBlKCkgIT0gZHJhd0ZyYW1lYnVmZmVyLT5nZXREZXB0aGJ1ZmZlclR5cGUoKSB8fAorICAgICAgICAgICAgICAgICAgIHJlYWRGcmFtZWJ1ZmZlci0+Z2V0RGVwdGhidWZmZXIoKS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSAhPSBkcmF3RnJhbWVidWZmZXItPmdldERlcHRoYnVmZmVyKCktPmdldEludGVybmFsRm9ybWF0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJsaXREZXB0aFN0ZW5jaWwgPSB0cnVlOworICAgICAgICAgICAgICAgIHJlYWREU0J1ZmZlciA9IHJlYWRGcmFtZWJ1ZmZlci0+Z2V0RGVwdGhidWZmZXIoKTsKKyAgICAgICAgICAgICAgICBkcmF3RFNCdWZmZXIgPSBkcmF3RnJhbWVidWZmZXItPmdldERlcHRoYnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihtYXNrICYgR0xfU1RFTkNJTF9CVUZGRVJfQklUKQorICAgICAgICB7CisgICAgICAgICAgICBpZihyZWFkRnJhbWVidWZmZXItPmdldFN0ZW5jaWxidWZmZXIoKSAmJiBkcmF3RnJhbWVidWZmZXItPmdldFN0ZW5jaWxidWZmZXIoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihyZWFkRnJhbWVidWZmZXItPmdldFN0ZW5jaWxidWZmZXJUeXBlKCkgIT0gZHJhd0ZyYW1lYnVmZmVyLT5nZXRTdGVuY2lsYnVmZmVyVHlwZSgpIHx8CisgICAgICAgICAgICAgICAgICAgcmVhZEZyYW1lYnVmZmVyLT5nZXRTdGVuY2lsYnVmZmVyKCktPmdldEludGVybmFsRm9ybWF0KCkgIT0gZHJhd0ZyYW1lYnVmZmVyLT5nZXRTdGVuY2lsYnVmZmVyKCktPmdldEludGVybmFsRm9ybWF0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJsaXREZXB0aFN0ZW5jaWwgPSB0cnVlOworICAgICAgICAgICAgICAgIHJlYWREU0J1ZmZlciA9IHJlYWRGcmFtZWJ1ZmZlci0+Z2V0U3RlbmNpbGJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGRyYXdEU0J1ZmZlciA9IGRyYXdGcmFtZWJ1ZmZlci0+Z2V0U3RlbmNpbGJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYocGFydGlhbEJ1ZmZlckNvcHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiT25seSB3aG9sZS1idWZmZXIgZGVwdGggYW5kIHN0ZW5jaWwgYmxpdHMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLiIpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsgLy8gb25seSB3aG9sZS1idWZmZXIgY29waWVzIGFyZSBwZXJtaXR0ZWQKKyAgICAgICAgfQorCisgICAgICAgIGlmKChkcmF3RFNCdWZmZXIgJiYgZHJhd0RTQnVmZmVyLT5nZXRTYW1wbGVzKCkgIT0gMCkgfHwgCisgICAgICAgICAgIChyZWFkRFNCdWZmZXIgJiYgcmVhZERTQnVmZmVyLT5nZXRTYW1wbGVzKCkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihibGl0UmVuZGVyVGFyZ2V0IHx8IGJsaXREZXB0aFN0ZW5jaWwpCisgICAgeworICAgICAgICBlZ2w6OkRpc3BsYXkgKmRpc3BsYXkgPSBnZXREaXNwbGF5KCk7CisKKyAgICAgICAgaWYoYmxpdFJlbmRlclRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gZGV2aWNlLT5zdHJldGNoUmVjdChyZWFkRnJhbWVidWZmZXItPmdldFJlbmRlclRhcmdldCgpLCAmc291cmNlVHJpbW1lZFJlY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RnJhbWVidWZmZXItPmdldFJlbmRlclRhcmdldCgpLCAmZGVzdFRyaW1tZWRSZWN0LCBmYWxzZSk7CisKKyAgICAgICAgICAgIGlmKCFzdWNjZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVSUigiQmxpdEZyYW1lYnVmZmVyQU5HTEUgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGJsaXREZXB0aFN0ZW5jaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IGRldmljZS0+c3RyZXRjaFJlY3QocmVhZEZyYW1lYnVmZmVyLT5nZXREZXB0aFN0ZW5jaWwoKSwgTlVMTCwgZHJhd0ZyYW1lYnVmZmVyLT5nZXREZXB0aFN0ZW5jaWwoKSwgTlVMTCwgZmFsc2UpOworCisgICAgICAgICAgICBpZighc3VjY2VzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUlIoIkJsaXRGcmFtZWJ1ZmZlckFOR0xFIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK30KKworZXh0ZXJuICJDIgoreworCWdsOjpDb250ZXh0ICpnbENyZWF0ZUNvbnRleHQoY29uc3QgZWdsOjpDb25maWcgKmNvbmZpZywgY29uc3QgZ2w6OkNvbnRleHQgKnNoYXJlQ29udGV4dCkKKwl7CisJCXJldHVybiBuZXcgZ2w6OkNvbnRleHQoY29uZmlnLCBzaGFyZUNvbnRleHQpOworCX0KKworCXZvaWQgZ2xEZXN0cm95Q29udGV4dChnbDo6Q29udGV4dCAqY29udGV4dCkKKwl7CisJCWRlbGV0ZSBjb250ZXh0OworCisJCWlmKGNvbnRleHQgPT0gZ2w6OmdldENvbnRleHQoKSkKKwkJeworCQkJZ2w6Om1ha2VDdXJyZW50KE5VTEwsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCisJdm9pZCBnbE1ha2VDdXJyZW50KGdsOjpDb250ZXh0ICpjb250ZXh0LCBlZ2w6OkRpc3BsYXkgKmRpc3BsYXksIGVnbDo6U3VyZmFjZSAqc3VyZmFjZSkKKwl7CisJCWdsOjptYWtlQ3VycmVudChjb250ZXh0LCBkaXNwbGF5LCBzdXJmYWNlKTsKKwl9CisKKwlnbDo6Q29udGV4dCAqZ2xHZXRDdXJyZW50Q29udGV4dCgpCisJeworCQlyZXR1cm4gZ2w6OmdldENvbnRleHQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvQ29udGV4dC5oIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjUzM2JkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0NvbnRleHQuaApAQCAtMCwwICsxLDQ4MCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDExIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gQ29udGV4dC5oOiBEZWZpbmVzIHRoZSBDb250ZXh0IGNsYXNzLCBtYW5hZ2luZyBhbGwgR0wgc3RhdGUgYW5kIHBlcmZvcm1pbmcKKy8vIHJlbmRlcmluZyBvcGVyYXRpb25zLiBJdCBpcyB0aGUgR0xFUzIgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgRUdMQ29udGV4dC4KKworI2lmbmRlZiBMSUJHTEVTVjJfQ09OVEVYVF9IXworI2RlZmluZSBMSUJHTEVTVjJfQ09OVEVYVF9IXworCisjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyLmgiCisjaW5jbHVkZSAiSGFuZGxlQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAiUmVmQ291bnRPYmplY3QuaCIKKyNpbmNsdWRlICJjb21tb24vYW5nbGV1dGlscy5oIgorI2luY2x1ZGUgIkltYWdlLmhwcCIKKyNpbmNsdWRlICJSZW5kZXJlci9TYW1wbGVyLmhwcCIKKworI2RlZmluZSBHTF9BUElDQUxMCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjZGVmaW5lIEVHTEFQSQorI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxoYXNoX21hcD4KKworbmFtZXNwYWNlIGVnbAoreworY2xhc3MgRGlzcGxheTsKK2NsYXNzIFN1cmZhY2U7CitjbGFzcyBDb25maWc7Cit9CisKK25hbWVzcGFjZSBnbAoreworc3RydWN0IFRyYW5zbGF0ZWRBdHRyaWJ1dGU7CitzdHJ1Y3QgVHJhbnNsYXRlZEluZGV4RGF0YTsKKworY2xhc3MgQnVmZmVyOworY2xhc3MgU2hhZGVyOworY2xhc3MgUHJvZ3JhbTsKK2NsYXNzIFRleHR1cmU7CitjbGFzcyBUZXh0dXJlMkQ7CitjbGFzcyBUZXh0dXJlQ3ViZU1hcDsKK2NsYXNzIEZyYW1lYnVmZmVyOworY2xhc3MgUmVuZGVyYnVmZmVyOworY2xhc3MgUmVuZGVyYnVmZmVyU3RvcmFnZTsKK2NsYXNzIENvbG9yYnVmZmVyOworY2xhc3MgRGVwdGhidWZmZXI7CitjbGFzcyBTdHJlYW1pbmdJbmRleEJ1ZmZlcjsKK2NsYXNzIFN0ZW5jaWxidWZmZXI7CitjbGFzcyBEZXB0aFN0ZW5jaWxidWZmZXI7CitjbGFzcyBWZXJ0ZXhEYXRhTWFuYWdlcjsKK2NsYXNzIEluZGV4RGF0YU1hbmFnZXI7CitjbGFzcyBGZW5jZTsKKworZW51bQoreworICAgIE1BWF9WRVJURVhfQVRUUklCUyA9IDE2LAorICAgIE1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTID0gMjU2IC0gMiwgICAvLyAyNTYgaXMgdGhlIG1pbmltdW0gZm9yIFNNMiwgYW5kIGluIHByYWN0aWNlIHRoZSBtYXhpbXVtIGZvciBEWDkuIFJlc2VydmUgc3BhY2UgZm9yIGR4X0hhbGZQaXhlbFNpemUgYW5kIGR4X0RlcHRoUmFuZ2UuCisgICAgTUFYX1ZBUllJTkdfVkVDVE9SUyA9IDEwLAorICAgIE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTID0gMTYsCisgICAgTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTID0gNCwgICAvLyBGb3IgZGV2aWNlcyBzdXBwb3J0aW5nIHZlcnRleCB0ZXh0dXJlIGZldGNoCisgICAgTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgPSBNQVhfVEVYVFVSRV9JTUFHRV9VTklUUyArIE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUywKKyAgICBNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTID0gMjI0IC0gMywgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgZHhfVmlld3BvcnQsIGR4X0RlcHRoLCBhbmQgZHhfRGVwdGhSYW5nZS4gZHhfUG9pbnRPckxpbmVzIGFuZCBkeF9Gcm9udENDVyB1c2Ugc2VwYXJhdGUgYm9vbCByZWdpc3RlcnMuCisgICAgTUFYX0RSQVdfQlVGRkVSUyA9IDEsCisKKyAgICBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCA9IEdMX1JHQiwKKyAgICBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNQorfTsKKworY29uc3QgZmxvYXQgQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFX01JTiA9IDEuMGY7Citjb25zdCBmbG9hdCBBTElBU0VEX0xJTkVfV0lEVEhfUkFOR0VfTUFYID0gMS4wZjsKK2NvbnN0IGZsb2F0IEFMSUFTRURfUE9JTlRfU0laRV9SQU5HRV9NSU4gPSAxLjBmOworY29uc3QgZmxvYXQgQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFX01BWCA9IDY0LjBmOworCitzdHJ1Y3QgQ29sb3IKK3sKKyAgICBmbG9hdCByZWQ7CisgICAgZmxvYXQgZ3JlZW47CisgICAgZmxvYXQgYmx1ZTsKKyAgICBmbG9hdCBhbHBoYTsKK307CisKKy8vIEhlbHBlciBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2ZXJ0ZXggYXR0cmlidXRlCitjbGFzcyBWZXJ0ZXhBdHRyaWJ1dGUKK3sKKyAgcHVibGljOgorICAgIFZlcnRleEF0dHJpYnV0ZSgpIDogbVR5cGUoR0xfRkxPQVQpLCBtU2l6ZSgwKSwgbU5vcm1hbGl6ZWQoZmFsc2UpLCBtU3RyaWRlKDApLCBtUG9pbnRlcihOVUxMKSwgbUFycmF5RW5hYmxlZChmYWxzZSkKKyAgICB7CisgICAgICAgIG1DdXJyZW50VmFsdWVbMF0gPSAwLjBmOworICAgICAgICBtQ3VycmVudFZhbHVlWzFdID0gMC4wZjsKKyAgICAgICAgbUN1cnJlbnRWYWx1ZVsyXSA9IDAuMGY7CisgICAgICAgIG1DdXJyZW50VmFsdWVbM10gPSAxLjBmOworICAgIH0KKworICAgIGludCB0eXBlU2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKG1UeXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgR0xfQllURTogICAgICAgICAgIHJldHVybiBtU2l6ZSAqIHNpemVvZihHTGJ5dGUpOworICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6ICByZXR1cm4gbVNpemUgKiBzaXplb2YoR0x1Ynl0ZSk7CisgICAgICAgIGNhc2UgR0xfU0hPUlQ6ICAgICAgICAgIHJldHVybiBtU2l6ZSAqIHNpemVvZihHTHNob3J0KTsKKyAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDogcmV0dXJuIG1TaXplICogc2l6ZW9mKEdMdXNob3J0KTsKKyAgICAgICAgY2FzZSBHTF9GSVhFRDogICAgICAgICAgcmV0dXJuIG1TaXplICogc2l6ZW9mKEdMZml4ZWQpOworICAgICAgICBjYXNlIEdMX0ZMT0FUOiAgICAgICAgICByZXR1cm4gbVNpemUgKiBzaXplb2YoR0xmbG9hdCk7CisgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7IHJldHVybiBtU2l6ZSAqIHNpemVvZihHTGZsb2F0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEdMc2l6ZWkgc3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtU3RyaWRlID8gbVN0cmlkZSA6IHR5cGVTaXplKCk7CisgICAgfQorCisgICAgLy8gRnJvbSBnbFZlcnRleEF0dHJpYlBvaW50ZXIKKyAgICBHTGVudW0gbVR5cGU7CisgICAgR0xpbnQgbVNpemU7CisgICAgYm9vbCBtTm9ybWFsaXplZDsKKyAgICBHTHNpemVpIG1TdHJpZGU7ICAgLy8gMCBtZWFucyBuYXR1cmFsIHN0cmlkZQorCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGNvbnN0IHZvaWQgKm1Qb2ludGVyOworICAgICAgICBpbnRwdHJfdCBtT2Zmc2V0OworICAgIH07CisKKyAgICBCaW5kaW5nUG9pbnRlcjxCdWZmZXI+IG1Cb3VuZEJ1ZmZlcjsgICAvLyBDYXB0dXJlZCB3aGVuIGdsVmVydGV4QXR0cmliUG9pbnRlciBpcyBjYWxsZWQuCisKKyAgICBib29sIG1BcnJheUVuYWJsZWQ7ICAgLy8gRnJvbSBnbEVuYWJsZS9EaXNhYmxlVmVydGV4QXR0cmliQXJyYXkKKyAgICBmbG9hdCBtQ3VycmVudFZhbHVlWzRdOyAgIC8vIEZyb20gZ2xWZXJ0ZXhBdHRyaWIKK307CisKK3R5cGVkZWYgVmVydGV4QXR0cmlidXRlIFZlcnRleEF0dHJpYnV0ZUFycmF5W01BWF9WRVJURVhfQVRUUklCU107CisKKy8vIEhlbHBlciBzdHJ1Y3R1cmUgdG8gc3RvcmUgYWxsIHJhdyBzdGF0ZQorc3RydWN0IFN0YXRlCit7CisgICAgQ29sb3IgY29sb3JDbGVhclZhbHVlOworICAgIEdMY2xhbXBmIGRlcHRoQ2xlYXJWYWx1ZTsKKyAgICBpbnQgc3RlbmNpbENsZWFyVmFsdWU7CisKKyAgICBib29sIGN1bGxGYWNlOworICAgIEdMZW51bSBjdWxsTW9kZTsKKyAgICBHTGVudW0gZnJvbnRGYWNlOworICAgIGJvb2wgZGVwdGhUZXN0OworICAgIEdMZW51bSBkZXB0aEZ1bmM7CisgICAgYm9vbCBibGVuZDsKKyAgICBHTGVudW0gc291cmNlQmxlbmRSR0I7CisgICAgR0xlbnVtIGRlc3RCbGVuZFJHQjsKKyAgICBHTGVudW0gc291cmNlQmxlbmRBbHBoYTsKKyAgICBHTGVudW0gZGVzdEJsZW5kQWxwaGE7CisgICAgR0xlbnVtIGJsZW5kRXF1YXRpb25SR0I7CisgICAgR0xlbnVtIGJsZW5kRXF1YXRpb25BbHBoYTsKKyAgICBDb2xvciBibGVuZENvbG9yOworICAgIGJvb2wgc3RlbmNpbFRlc3Q7CisgICAgR0xlbnVtIHN0ZW5jaWxGdW5jOworICAgIEdMaW50IHN0ZW5jaWxSZWY7CisgICAgR0x1aW50IHN0ZW5jaWxNYXNrOworICAgIEdMZW51bSBzdGVuY2lsRmFpbDsKKyAgICBHTGVudW0gc3RlbmNpbFBhc3NEZXB0aEZhaWw7CisgICAgR0xlbnVtIHN0ZW5jaWxQYXNzRGVwdGhQYXNzOworICAgIEdMdWludCBzdGVuY2lsV3JpdGVtYXNrOworICAgIEdMZW51bSBzdGVuY2lsQmFja0Z1bmM7CisgICAgR0xpbnQgc3RlbmNpbEJhY2tSZWY7CisgICAgR0x1aW50IHN0ZW5jaWxCYWNrTWFzazsKKyAgICBHTGVudW0gc3RlbmNpbEJhY2tGYWlsOworICAgIEdMZW51bSBzdGVuY2lsQmFja1Bhc3NEZXB0aEZhaWw7CisgICAgR0xlbnVtIHN0ZW5jaWxCYWNrUGFzc0RlcHRoUGFzczsKKyAgICBHTHVpbnQgc3RlbmNpbEJhY2tXcml0ZW1hc2s7CisgICAgYm9vbCBwb2x5Z29uT2Zmc2V0RmlsbDsKKyAgICBHTGZsb2F0IHBvbHlnb25PZmZzZXRGYWN0b3I7CisgICAgR0xmbG9hdCBwb2x5Z29uT2Zmc2V0VW5pdHM7CisgICAgYm9vbCBzYW1wbGVBbHBoYVRvQ292ZXJhZ2U7CisgICAgYm9vbCBzYW1wbGVDb3ZlcmFnZTsKKyAgICBHTGNsYW1wZiBzYW1wbGVDb3ZlcmFnZVZhbHVlOworICAgIGJvb2wgc2FtcGxlQ292ZXJhZ2VJbnZlcnQ7CisgICAgYm9vbCBzY2lzc29yVGVzdDsKKyAgICBib29sIGRpdGhlcjsKKworICAgIEdMZmxvYXQgbGluZVdpZHRoOworCisgICAgR0xlbnVtIGdlbmVyYXRlTWlwbWFwSGludDsKKyAgICBHTGVudW0gZnJhZ21lbnRTaGFkZXJEZXJpdmF0aXZlSGludDsKKworICAgIEdMaW50IHZpZXdwb3J0WDsKKyAgICBHTGludCB2aWV3cG9ydFk7CisgICAgR0xzaXplaSB2aWV3cG9ydFdpZHRoOworICAgIEdMc2l6ZWkgdmlld3BvcnRIZWlnaHQ7CisgICAgZmxvYXQgek5lYXI7CisgICAgZmxvYXQgekZhcjsKKworICAgIEdMaW50IHNjaXNzb3JYOworICAgIEdMaW50IHNjaXNzb3JZOworICAgIEdMc2l6ZWkgc2Npc3NvcldpZHRoOworICAgIEdMc2l6ZWkgc2Npc3NvckhlaWdodDsKKworICAgIGJvb2wgY29sb3JNYXNrUmVkOworICAgIGJvb2wgY29sb3JNYXNrR3JlZW47CisgICAgYm9vbCBjb2xvck1hc2tCbHVlOworICAgIGJvb2wgY29sb3JNYXNrQWxwaGE7CisgICAgYm9vbCBkZXB0aE1hc2s7CisKKyAgICB1bnNpZ25lZCBpbnQgYWN0aXZlU2FtcGxlcjsgICAvLyBBY3RpdmUgdGV4dHVyZSB1bml0IHNlbGVjdG9yIC0gR0xfVEVYVFVSRTAKKyAgICBCaW5kaW5nUG9pbnRlcjxCdWZmZXI+IGFycmF5QnVmZmVyOworICAgIEJpbmRpbmdQb2ludGVyPEJ1ZmZlcj4gZWxlbWVudEFycmF5QnVmZmVyOworICAgIEdMdWludCByZWFkRnJhbWVidWZmZXI7CisgICAgR0x1aW50IGRyYXdGcmFtZWJ1ZmZlcjsKKyAgICBCaW5kaW5nUG9pbnRlcjxSZW5kZXJidWZmZXI+IHJlbmRlcmJ1ZmZlcjsKKyAgICBHTHVpbnQgY3VycmVudFByb2dyYW07CisKKyAgICBWZXJ0ZXhBdHRyaWJ1dGUgdmVydGV4QXR0cmlidXRlW01BWF9WRVJURVhfQVRUUklCU107CisgICAgQmluZGluZ1BvaW50ZXI8VGV4dHVyZT4gc2FtcGxlclRleHR1cmVbVEVYVFVSRV9UWVBFX0NPVU5UXVtNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUU107CisKKyAgICBHTGludCB1bnBhY2tBbGlnbm1lbnQ7CisgICAgR0xpbnQgcGFja0FsaWdubWVudDsKK307CisKK2NsYXNzIENvbnRleHQKK3sKKyAgcHVibGljOgorICAgIENvbnRleHQoY29uc3QgZWdsOjpDb25maWcgKmNvbmZpZywgY29uc3QgQ29udGV4dCAqc2hhcmVDb250ZXh0KTsKKworICAgIH5Db250ZXh0KCk7CisKKyAgICB2b2lkIG1ha2VDdXJyZW50KGVnbDo6RGlzcGxheSAqZGlzcGxheSwgZWdsOjpTdXJmYWNlICpzdXJmYWNlKTsKKworICAgIHZvaWQgbWFya0FsbFN0YXRlRGlydHkoKTsKKworICAgIC8vIFN0YXRlIG1hbmlwdWxhdGlvbgorICAgIHZvaWQgc2V0Q2xlYXJDb2xvcihmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7CisgICAgdm9pZCBzZXRDbGVhckRlcHRoKGZsb2F0IGRlcHRoKTsKKyAgICB2b2lkIHNldENsZWFyU3RlbmNpbChpbnQgc3RlbmNpbCk7CisKKyAgICB2b2lkIHNldEN1bGxGYWNlKGJvb2wgZW5hYmxlZCk7CisgICAgYm9vbCBpc0N1bGxGYWNlRW5hYmxlZCgpIGNvbnN0OworICAgIHZvaWQgc2V0Q3VsbE1vZGUoR0xlbnVtIG1vZGUpOworICAgIHZvaWQgc2V0RnJvbnRGYWNlKEdMZW51bSBmcm9udCk7CisKKyAgICB2b2lkIHNldERlcHRoVGVzdChib29sIGVuYWJsZWQpOworICAgIGJvb2wgaXNEZXB0aFRlc3RFbmFibGVkKCkgY29uc3Q7CisgICAgdm9pZCBzZXREZXB0aEZ1bmMoR0xlbnVtIGRlcHRoRnVuYyk7CisgICAgdm9pZCBzZXREZXB0aFJhbmdlKGZsb2F0IHpOZWFyLCBmbG9hdCB6RmFyKTsKKyAgICAKKyAgICB2b2lkIHNldEJsZW5kKGJvb2wgZW5hYmxlZCk7CisgICAgYm9vbCBpc0JsZW5kRW5hYmxlZCgpIGNvbnN0OworICAgIHZvaWQgc2V0QmxlbmRGYWN0b3JzKEdMZW51bSBzb3VyY2VSR0IsIEdMZW51bSBkZXN0UkdCLCBHTGVudW0gc291cmNlQWxwaGEsIEdMZW51bSBkZXN0QWxwaGEpOworICAgIHZvaWQgc2V0QmxlbmRDb2xvcihmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7CisgICAgdm9pZCBzZXRCbGVuZEVxdWF0aW9uKEdMZW51bSByZ2JFcXVhdGlvbiwgR0xlbnVtIGFscGhhRXF1YXRpb24pOworCisgICAgdm9pZCBzZXRTdGVuY2lsVGVzdChib29sIGVuYWJsZWQpOworICAgIGJvb2wgaXNTdGVuY2lsVGVzdEVuYWJsZWQoKSBjb25zdDsKKyAgICB2b2lkIHNldFN0ZW5jaWxQYXJhbXMoR0xlbnVtIHN0ZW5jaWxGdW5jLCBHTGludCBzdGVuY2lsUmVmLCBHTHVpbnQgc3RlbmNpbE1hc2spOworICAgIHZvaWQgc2V0U3RlbmNpbEJhY2tQYXJhbXMoR0xlbnVtIHN0ZW5jaWxCYWNrRnVuYywgR0xpbnQgc3RlbmNpbEJhY2tSZWYsIEdMdWludCBzdGVuY2lsQmFja01hc2spOworICAgIHZvaWQgc2V0U3RlbmNpbFdyaXRlbWFzayhHTHVpbnQgc3RlbmNpbFdyaXRlbWFzayk7CisgICAgdm9pZCBzZXRTdGVuY2lsQmFja1dyaXRlbWFzayhHTHVpbnQgc3RlbmNpbEJhY2tXcml0ZW1hc2spOworICAgIHZvaWQgc2V0U3RlbmNpbE9wZXJhdGlvbnMoR0xlbnVtIHN0ZW5jaWxGYWlsLCBHTGVudW0gc3RlbmNpbFBhc3NEZXB0aEZhaWwsIEdMZW51bSBzdGVuY2lsUGFzc0RlcHRoUGFzcyk7CisgICAgdm9pZCBzZXRTdGVuY2lsQmFja09wZXJhdGlvbnMoR0xlbnVtIHN0ZW5jaWxCYWNrRmFpbCwgR0xlbnVtIHN0ZW5jaWxCYWNrUGFzc0RlcHRoRmFpbCwgR0xlbnVtIHN0ZW5jaWxCYWNrUGFzc0RlcHRoUGFzcyk7CisKKyAgICB2b2lkIHNldFBvbHlnb25PZmZzZXRGaWxsKGJvb2wgZW5hYmxlZCk7CisgICAgYm9vbCBpc1BvbHlnb25PZmZzZXRGaWxsRW5hYmxlZCgpIGNvbnN0OworICAgIHZvaWQgc2V0UG9seWdvbk9mZnNldFBhcmFtcyhHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7CisKKyAgICB2b2lkIHNldFNhbXBsZUFscGhhVG9Db3ZlcmFnZShib29sIGVuYWJsZWQpOworICAgIGJvb2wgaXNTYW1wbGVBbHBoYVRvQ292ZXJhZ2VFbmFibGVkKCkgY29uc3Q7CisgICAgdm9pZCBzZXRTYW1wbGVDb3ZlcmFnZShib29sIGVuYWJsZWQpOworICAgIGJvb2wgaXNTYW1wbGVDb3ZlcmFnZUVuYWJsZWQoKSBjb25zdDsKKyAgICB2b2lkIHNldFNhbXBsZUNvdmVyYWdlUGFyYW1zKEdMY2xhbXBmIHZhbHVlLCBib29sIGludmVydCk7CisKKyAgICB2b2lkIHNldERpdGhlcihib29sIGVuYWJsZWQpOworICAgIGJvb2wgaXNEaXRoZXJFbmFibGVkKCkgY29uc3Q7CisKKyAgICB2b2lkIHNldExpbmVXaWR0aChHTGZsb2F0IHdpZHRoKTsKKworICAgIHZvaWQgc2V0R2VuZXJhdGVNaXBtYXBIaW50KEdMZW51bSBoaW50KTsKKyAgICB2b2lkIHNldEZyYWdtZW50U2hhZGVyRGVyaXZhdGl2ZUhpbnQoR0xlbnVtIGhpbnQpOworCisgICAgdm9pZCBzZXRWaWV3cG9ydFBhcmFtcyhHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKKwl2b2lkIHNldFNjaXNzb3JUZXN0KGJvb2wgZW5hYmxlZCk7CisgICAgYm9vbCBpc1NjaXNzb3JUZXN0RW5hYmxlZCgpIGNvbnN0OworICAgIHZvaWQgc2V0U2Npc3NvclBhcmFtcyhHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKKyAgICB2b2lkIHNldENvbG9yTWFzayhib29sIHJlZCwgYm9vbCBncmVlbiwgYm9vbCBibHVlLCBib29sIGFscGhhKTsKKyAgICB2b2lkIHNldERlcHRoTWFzayhib29sIG1hc2spOworCisgICAgdm9pZCBzZXRBY3RpdmVTYW1wbGVyKHVuc2lnbmVkIGludCBhY3RpdmUpOworCisgICAgR0x1aW50IGdldFJlYWRGcmFtZWJ1ZmZlckhhbmRsZSgpIGNvbnN0OworICAgIEdMdWludCBnZXREcmF3RnJhbWVidWZmZXJIYW5kbGUoKSBjb25zdDsKKyAgICBHTHVpbnQgZ2V0UmVuZGVyYnVmZmVySGFuZGxlKCkgY29uc3Q7CisKKyAgICBHTHVpbnQgZ2V0QXJyYXlCdWZmZXJIYW5kbGUoKSBjb25zdDsKKworICAgIHZvaWQgc2V0RW5hYmxlVmVydGV4QXR0cmliQXJyYXkodW5zaWduZWQgaW50IGF0dHJpYk51bSwgYm9vbCBlbmFibGVkKTsKKyAgICBjb25zdCBWZXJ0ZXhBdHRyaWJ1dGUgJmdldFZlcnRleEF0dHJpYlN0YXRlKHVuc2lnbmVkIGludCBhdHRyaWJOdW0pOworICAgIHZvaWQgc2V0VmVydGV4QXR0cmliU3RhdGUodW5zaWduZWQgaW50IGF0dHJpYk51bSwgQnVmZmVyICpib3VuZEJ1ZmZlciwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCB2b2lkICpwb2ludGVyKTsKKyAgICBjb25zdCB2b2lkICpnZXRWZXJ0ZXhBdHRyaWJQb2ludGVyKHVuc2lnbmVkIGludCBhdHRyaWJOdW0pIGNvbnN0OworCisgICAgY29uc3QgVmVydGV4QXR0cmlidXRlQXJyYXkgJmdldFZlcnRleEF0dHJpYnV0ZXMoKTsKKworICAgIHZvaWQgc2V0VW5wYWNrQWxpZ25tZW50KEdMaW50IGFsaWdubWVudCk7CisgICAgR0xpbnQgZ2V0VW5wYWNrQWxpZ25tZW50KCkgY29uc3Q7CisKKyAgICB2b2lkIHNldFBhY2tBbGlnbm1lbnQoR0xpbnQgYWxpZ25tZW50KTsKKyAgICBHTGludCBnZXRQYWNrQWxpZ25tZW50KCkgY29uc3Q7CisKKyAgICAvLyBUaGVzZSBjcmVhdGUgIGFuZCBkZXN0cm95IG1ldGhvZHMgYXJlIG1lcmVseSBwYXNzLXRocm91Z2hzIHRvIAorICAgIC8vIFJlc291cmNlTWFuYWdlciwgd2hpY2ggb3ducyB0aGVzZSBvYmplY3QgdHlwZXMKKyAgICBHTHVpbnQgY3JlYXRlQnVmZmVyKCk7CisgICAgR0x1aW50IGNyZWF0ZVNoYWRlcihHTGVudW0gdHlwZSk7CisgICAgR0x1aW50IGNyZWF0ZVByb2dyYW0oKTsKKyAgICBHTHVpbnQgY3JlYXRlVGV4dHVyZSgpOworICAgIEdMdWludCBjcmVhdGVSZW5kZXJidWZmZXIoKTsKKworICAgIHZvaWQgZGVsZXRlQnVmZmVyKEdMdWludCBidWZmZXIpOworICAgIHZvaWQgZGVsZXRlU2hhZGVyKEdMdWludCBzaGFkZXIpOworICAgIHZvaWQgZGVsZXRlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSk7CisgICAgdm9pZCBkZWxldGVUZXh0dXJlKEdMdWludCB0ZXh0dXJlKTsKKyAgICB2b2lkIGRlbGV0ZVJlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKTsKKworICAgIC8vIEZyYW1lYnVmZmVycyBhcmUgb3duZWQgYnkgdGhlIENvbnRleHQsIHNvIHRoZXNlIG1ldGhvZHMgZG8gbm90IHBhc3MgdGhyb3VnaAorICAgIEdMdWludCBjcmVhdGVGcmFtZWJ1ZmZlcigpOworICAgIHZvaWQgZGVsZXRlRnJhbWVidWZmZXIoR0x1aW50IGZyYW1lYnVmZmVyKTsKKworICAgIC8vIEZlbmNlcyBhcmUgb3duZWQgYnkgdGhlIENvbnRleHQuCisgICAgR0x1aW50IGNyZWF0ZUZlbmNlKCk7CisgICAgdm9pZCBkZWxldGVGZW5jZShHTHVpbnQgZmVuY2UpOworCisgICAgdm9pZCBiaW5kQXJyYXlCdWZmZXIoR0x1aW50IGJ1ZmZlcik7CisgICAgdm9pZCBiaW5kRWxlbWVudEFycmF5QnVmZmVyKEdMdWludCBidWZmZXIpOworICAgIHZvaWQgYmluZFRleHR1cmUyRChHTHVpbnQgdGV4dHVyZSk7CisgICAgdm9pZCBiaW5kVGV4dHVyZUN1YmVNYXAoR0x1aW50IHRleHR1cmUpOworICAgIHZvaWQgYmluZFJlYWRGcmFtZWJ1ZmZlcihHTHVpbnQgZnJhbWVidWZmZXIpOworICAgIHZvaWQgYmluZERyYXdGcmFtZWJ1ZmZlcihHTHVpbnQgZnJhbWVidWZmZXIpOworICAgIHZvaWQgYmluZFJlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKTsKKyAgICB2b2lkIHVzZVByb2dyYW0oR0x1aW50IHByb2dyYW0pOworCisgICAgdm9pZCBzZXRGcmFtZWJ1ZmZlclplcm8oRnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyKTsKKworICAgIHZvaWQgc2V0UmVuZGVyYnVmZmVyU3RvcmFnZShSZW5kZXJidWZmZXJTdG9yYWdlICpyZW5kZXJidWZmZXIpOworCisgICAgdm9pZCBzZXRWZXJ0ZXhBdHRyaWIoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2YWx1ZXMpOworCisgICAgQnVmZmVyICpnZXRCdWZmZXIoR0x1aW50IGhhbmRsZSk7CisgICAgRmVuY2UgKmdldEZlbmNlKEdMdWludCBoYW5kbGUpOworICAgIFNoYWRlciAqZ2V0U2hhZGVyKEdMdWludCBoYW5kbGUpOworICAgIFByb2dyYW0gKmdldFByb2dyYW0oR0x1aW50IGhhbmRsZSk7CisgICAgVGV4dHVyZSAqZ2V0VGV4dHVyZShHTHVpbnQgaGFuZGxlKTsKKyAgICBGcmFtZWJ1ZmZlciAqZ2V0RnJhbWVidWZmZXIoR0x1aW50IGhhbmRsZSk7CisgICAgUmVuZGVyYnVmZmVyICpnZXRSZW5kZXJidWZmZXIoR0x1aW50IGhhbmRsZSk7CisKKyAgICBCdWZmZXIgKmdldEFycmF5QnVmZmVyKCk7CisgICAgQnVmZmVyICpnZXRFbGVtZW50QXJyYXlCdWZmZXIoKTsKKyAgICBQcm9ncmFtICpnZXRDdXJyZW50UHJvZ3JhbSgpOworICAgIFRleHR1cmUyRCAqZ2V0VGV4dHVyZTJEKCk7CisgICAgVGV4dHVyZUN1YmVNYXAgKmdldFRleHR1cmVDdWJlTWFwKCk7CisgICAgVGV4dHVyZSAqZ2V0U2FtcGxlclRleHR1cmUodW5zaWduZWQgaW50IHNhbXBsZXIsIFRleHR1cmVUeXBlIHR5cGUpOworICAgIEZyYW1lYnVmZmVyICpnZXRSZWFkRnJhbWVidWZmZXIoKTsKKyAgICBGcmFtZWJ1ZmZlciAqZ2V0RHJhd0ZyYW1lYnVmZmVyKCk7CisKKyAgICBib29sIGdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisgICAgYm9vbCBnZXRJbnRlZ2VydihHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworICAgIGJvb2wgZ2V0Qm9vbGVhbnYoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyk7CisKKyAgICBib29sIGdldFF1ZXJ5UGFyYW1ldGVySW5mbyhHTGVudW0gcG5hbWUsIEdMZW51bSAqdHlwZSwgdW5zaWduZWQgaW50ICpudW1QYXJhbXMpOworCisgICAgdm9pZCByZWFkUGl4ZWxzKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgdm9pZCogcGl4ZWxzKTsKKyAgICB2b2lkIGNsZWFyKEdMYml0ZmllbGQgbWFzayk7CisgICAgdm9pZCBkcmF3QXJyYXlzKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7CisgICAgdm9pZCBkcmF3RWxlbWVudHMoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzKTsKKyAgICB2b2lkIGZpbmlzaCgpOworICAgIHZvaWQgZmx1c2goKTsKKworICAgIHZvaWQgcmVjb3JkSW52YWxpZEVudW0oKTsKKyAgICB2b2lkIHJlY29yZEludmFsaWRWYWx1ZSgpOworICAgIHZvaWQgcmVjb3JkSW52YWxpZE9wZXJhdGlvbigpOworICAgIHZvaWQgcmVjb3JkT3V0T2ZNZW1vcnkoKTsKKyAgICB2b2lkIHJlY29yZEludmFsaWRGcmFtZWJ1ZmZlck9wZXJhdGlvbigpOworCisgICAgR0xlbnVtIGdldEVycm9yKCk7CisKKyAgICBpbnQgZ2V0TmVhcmVzdFN1cHBvcnRlZFNhbXBsZXMoc3c6OkZvcm1hdCBmb3JtYXQsIGludCByZXF1ZXN0ZWQpIGNvbnN0OworICAgIGNvbnN0IGNoYXIgKmdldEV4dGVuc2lvblN0cmluZygpIGNvbnN0OworICAgIAorICAgIHZvaWQgYmxpdEZyYW1lYnVmZmVyKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGJpdGZpZWxkIG1hc2spOworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvbnRleHQpOworCisgICAgYm9vbCBhcHBseVJlbmRlclRhcmdldChib29sIGlnbm9yZVZpZXdwb3J0KTsKKyAgICB2b2lkIGFwcGx5U3RhdGUoR0xlbnVtIGRyYXdNb2RlKTsKKyAgICBHTGVudW0gYXBwbHlWZXJ0ZXhCdWZmZXIoR0xpbnQgYmFzZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworICAgIEdMZW51bSBhcHBseUluZGV4QnVmZmVyKGNvbnN0IHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgY291bnQsIEdMZW51bSBtb2RlLCBHTGVudW0gdHlwZSwgVHJhbnNsYXRlZEluZGV4RGF0YSAqaW5kZXhJbmZvKTsKKyAgICB2b2lkIGFwcGx5U2hhZGVycygpOworICAgIHZvaWQgYXBwbHlUZXh0dXJlcygpOworICAgIHZvaWQgYXBwbHlUZXh0dXJlcyhzdzo6U2FtcGxlclR5cGUgdHlwZSk7CisJdm9pZCBhcHBseVRleHR1cmUoc3c6OlNhbXBsZXJUeXBlIHR5cGUsIGludCBzYW1wbGVyLCBUZXh0dXJlICp0ZXh0dXJlKTsKKworICAgIHZvaWQgZGV0YWNoQnVmZmVyKEdMdWludCBidWZmZXIpOworICAgIHZvaWQgZGV0YWNoVGV4dHVyZShHTHVpbnQgdGV4dHVyZSk7CisgICAgdm9pZCBkZXRhY2hGcmFtZWJ1ZmZlcihHTHVpbnQgZnJhbWVidWZmZXIpOworICAgIHZvaWQgZGV0YWNoUmVuZGVyYnVmZmVyKEdMdWludCByZW5kZXJidWZmZXIpOworCisgICAgYm9vbCBjdWxsU2tpcHNEcmF3KEdMZW51bSBkcmF3TW9kZSk7CisgICAgYm9vbCBpc1RyaWFuZ2xlTW9kZShHTGVudW0gZHJhd01vZGUpOworCisgICAgY29uc3QgZWdsOjpDb25maWcgKmNvbnN0IG1Db25maWc7CisKKyAgICBTdGF0ZSBtU3RhdGU7CisKKyAgICBCaW5kaW5nUG9pbnRlcjxUZXh0dXJlMkQ+IG1UZXh0dXJlMkRaZXJvOworICAgIEJpbmRpbmdQb2ludGVyPFRleHR1cmVDdWJlTWFwPiBtVGV4dHVyZUN1YmVNYXBaZXJvOworCisgICAgdHlwZWRlZiBzdGRleHQ6Omhhc2hfbWFwPEdMdWludCwgRnJhbWVidWZmZXIqPiBGcmFtZWJ1ZmZlck1hcDsKKyAgICBGcmFtZWJ1ZmZlck1hcCBtRnJhbWVidWZmZXJNYXA7CisgICAgSGFuZGxlQWxsb2NhdG9yIG1GcmFtZWJ1ZmZlckhhbmRsZUFsbG9jYXRvcjsKKworICAgIHR5cGVkZWYgc3RkZXh0OjpoYXNoX21hcDxHTHVpbnQsIEZlbmNlKj4gRmVuY2VNYXA7CisgICAgRmVuY2VNYXAgbUZlbmNlTWFwOworICAgIEhhbmRsZUFsbG9jYXRvciBtRmVuY2VIYW5kbGVBbGxvY2F0b3I7CisKKyAgICB2b2lkIGluaXRFeHRlbnNpb25TdHJpbmcoKTsKKyAgICBzdGQ6OnN0cmluZyBtRXh0ZW5zaW9uU3RyaW5nOworCisgICAgVmVydGV4RGF0YU1hbmFnZXIgKm1WZXJ0ZXhEYXRhTWFuYWdlcjsKKyAgICBJbmRleERhdGFNYW5hZ2VyICptSW5kZXhEYXRhTWFuYWdlcjsKKworICAgIC8vIFJlY29yZGVkIGVycm9ycworICAgIGJvb2wgbUludmFsaWRFbnVtOworICAgIGJvb2wgbUludmFsaWRWYWx1ZTsKKyAgICBib29sIG1JbnZhbGlkT3BlcmF0aW9uOworICAgIGJvb2wgbU91dE9mTWVtb3J5OworICAgIGJvb2wgbUludmFsaWRGcmFtZWJ1ZmZlck9wZXJhdGlvbjsKKworICAgIGJvb2wgbUhhc0JlZW5DdXJyZW50OworCisgICAgdW5zaWduZWQgaW50IG1BcHBsaWVkUHJvZ3JhbVNlcmlhbDsKKyAgICB1bnNpZ25lZCBpbnQgbUFwcGxpZWRSZW5kZXJUYXJnZXRTZXJpYWw7CisgICAgdW5zaWduZWQgaW50IG1BcHBsaWVkRGVwdGhidWZmZXJTZXJpYWw7CisgICAgdW5zaWduZWQgaW50IG1BcHBsaWVkU3RlbmNpbGJ1ZmZlclNlcmlhbDsKKyAgICBib29sIG1EZXB0aFN0ZW5jaWxJbml0aWFsaXplZDsKKworICAgIHN0ZDo6bWFwPHN3OjpGb3JtYXQsIGJvb2wqPiBtTXVsdGlTYW1wbGVTdXBwb3J0OworICAgIAorICAgIC8vIHN0YXRlIGNhY2hpbmcgZmxhZ3MKKyAgICBib29sIG1DbGVhclN0YXRlRGlydHk7CisgICAgYm9vbCBtQ3VsbFN0YXRlRGlydHk7CisgICAgYm9vbCBtRGVwdGhTdGF0ZURpcnR5OworICAgIGJvb2wgbU1hc2tTdGF0ZURpcnR5OworICAgIGJvb2wgbVBpeGVsUGFja2luZ1N0YXRlRGlydHk7CisgICAgYm9vbCBtQmxlbmRTdGF0ZURpcnR5OworICAgIGJvb2wgbVN0ZW5jaWxTdGF0ZURpcnR5OworICAgIGJvb2wgbVBvbHlnb25PZmZzZXRTdGF0ZURpcnR5OworICAgIGJvb2wgbVNjaXNzb3JTdGF0ZURpcnR5OworICAgIGJvb2wgbVNhbXBsZVN0YXRlRGlydHk7CisgICAgYm9vbCBtRnJvbnRGYWNlRGlydHk7CisgICAgYm9vbCBtRGl0aGVyU3RhdGVEaXJ0eTsKKworICAgIFJlc291cmNlTWFuYWdlciAqbVJlc291cmNlTWFuYWdlcjsKK307Cit9CisKK2V4dGVybiAiQyIKK3sKKy8vIEV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgdXNlIGJ5IEVHTAorZ2w6OkNvbnRleHQgKmdsQ3JlYXRlQ29udGV4dChjb25zdCBlZ2w6OkNvbmZpZyAqY29uZmlnLCBjb25zdCBnbDo6Q29udGV4dCAqc2hhcmVDb250ZXh0KTsKK3ZvaWQgZ2xEZXN0cm95Q29udGV4dChnbDo6Q29udGV4dCAqY29udGV4dCk7Cit2b2lkIGdsTWFrZUN1cnJlbnQoZ2w6OkNvbnRleHQgKmNvbnRleHQsIGVnbDo6RGlzcGxheSAqZGlzcGxheSwgZWdsOjpTdXJmYWNlICpzdXJmYWNlKTsKK2dsOjpDb250ZXh0ICpnbEdldEN1cnJlbnRDb250ZXh0KCk7CitfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIF9fc3RkY2FsbCBnbEdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIgKnByb2NuYW1lKTsKK3ZvaWQgX19zdGRjYWxsIGdsQmluZFRleEltYWdlKGVnbDo6U3VyZmFjZSAqc3VyZmFjZSk7Cit9CisKKyNlbmRpZiAgIC8vIElOQ0xVREVfQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0RldmljZS5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvRGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUyOTNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0RldmljZS5jcHAKQEAgLTAsMCArMSwxMDQyIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJEZXZpY2UuaHBwIgorCisjaW5jbHVkZSAiSW1hZ2UuaHBwIgorI2luY2x1ZGUgIlRleHR1cmUuaCIKKworI2luY2x1ZGUgIlJlbmRlcmVyL1JlbmRlcmVyLmhwcCIKKyNpbmNsdWRlICJSZW5kZXJlci9DbGlwcGVyLmhwcCIKKyNpbmNsdWRlICJTaGFkZXIvUGl4ZWxTaGFkZXIuaHBwIgorI2luY2x1ZGUgIlNoYWRlci9WZXJ0ZXhTaGFkZXIuaHBwIgorI2luY2x1ZGUgIk1haW4vQ29uZmlnLmhwcCIKKyNpbmNsdWRlICJNYWluL0ZyYW1lQnVmZmVyLmhwcCIKKyNpbmNsdWRlICJDb21tb24vTWF0aC5ocHAiCisjaW5jbHVkZSAiQ29tbW9uL0NvbmZpZ3VyYXRvci5ocHAiCisjaW5jbHVkZSAiQ29tbW9uL1RpbWVyLmhwcCIKKyNpbmNsdWRlICIuLi9jb21tb24vZGVidWcuaCIKKworYm9vbCBsb2NhbFNoYWRlckNvbnN0YW50cyA9IHRydWU7CisKK25hbWVzcGFjZSBnbAoreworCXVzaW5nIG5hbWVzcGFjZSBzdzsKKworCURldmljZTo6RGV2aWNlKENvbnRleHQgKmNvbnRleHQpIDogUmVuZGVyZXIoY29udGV4dCksIGNvbnRleHQoY29udGV4dCkKKwl7CisJCWRlcHRoU3RlbmNpbCA9IDA7CisJCXJlbmRlclRhcmdldCA9IDA7CisKKwkJc2V0RGVwdGhCdWZmZXJFbmFibGUodHJ1ZSk7CisJCXNldEZpbGxNb2RlKENvbnRleHQ6OkZJTExfU09MSUQpOworCQlzZXRTaGFkaW5nTW9kZShDb250ZXh0OjpTSEFESU5HX0dPVVJBVUQpOworCQlzZXREZXB0aFdyaXRlRW5hYmxlKHRydWUpOworCQlzZXRBbHBoYVRlc3RFbmFibGUoZmFsc2UpOworCQlzZXRTb3VyY2VCbGVuZEZhY3RvcihDb250ZXh0OjpCTEVORF9PTkUpOworCQlzZXREZXN0QmxlbmRGYWN0b3IoQ29udGV4dDo6QkxFTkRfWkVSTyk7CisJCXNldEN1bGxNb2RlKENvbnRleHQ6OkNVTExfQ09VTlRFUkNMT0NLV0lTRSk7CisJCXNldERlcHRoQ29tcGFyZShDb250ZXh0OjpERVBUSF9MRVNTRVFVQUwpOworCQlzZXRBbHBoYVJlZmVyZW5jZSgwKTsKKwkJc2V0QWxwaGFDb21wYXJlKENvbnRleHQ6OkFMUEhBX0FMV0FZUyk7CisJCXNldEFscGhhQmxlbmRFbmFibGUoZmFsc2UpOworCQlzZXRGb2dFbmFibGUoZmFsc2UpOworCQlzZXRTcGVjdWxhckVuYWJsZShmYWxzZSk7CisJCXNldEZvZ0NvbG9yKDApOworCQlzZXRQaXhlbEZvZ01vZGUoQ29udGV4dDo6Rk9HX05PTkUpOworCQlzZXRGb2dTdGFydCgwLjBmKTsKKwkJc2V0Rm9nRW5kKDEuMGYpOworCQlzZXRGb2dEZW5zaXR5KDEuMGYpOworCQlzZXRSYW5nZUZvZ0VuYWJsZShmYWxzZSk7CisJCXNldFN0ZW5jaWxFbmFibGUoZmFsc2UpOworCQlzZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihDb250ZXh0OjpPUEVSQVRJT05fS0VFUCk7CisJCXNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihDb250ZXh0OjpPUEVSQVRJT05fS0VFUCk7CisJCXNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKENvbnRleHQ6Ok9QRVJBVElPTl9LRUVQKTsKKwkJc2V0U3RlbmNpbENvbXBhcmUoQ29udGV4dDo6U1RFTkNJTF9BTFdBWVMpOworCQlzZXRTdGVuY2lsUmVmZXJlbmNlKDApOworCQlzZXRTdGVuY2lsTWFzaygweEZGRkZGRkZGKTsKKwkJc2V0U3RlbmNpbFdyaXRlTWFzaygweEZGRkZGRkZGKTsKKwkJc2V0VmVydGV4Rm9nTW9kZShDb250ZXh0OjpGT0dfTk9ORSk7CisJCXNldENsaXBGbGFncygwKTsKKwkJc2V0UG9pbnRTaXplKDEuMGYpOworCQlzZXRQb2ludFNpemVNaW4oMS4wZik7CisJCXNldFBvaW50U3ByaXRlRW5hYmxlKGZhbHNlKTsKKwkJc2V0UG9pbnRTaXplTWF4KDY0LjBmKTsKKwkJc2V0Q29sb3JXcml0ZU1hc2soMCwgMHgwMDAwMDAwRik7CisJCXNldEJsZW5kT3BlcmF0aW9uKENvbnRleHQ6OkJMRU5ET1BfQUREKTsKKwkJc2Npc3NvckVuYWJsZSA9IGZhbHNlOworCQlzZXRTbG9wZURlcHRoQmlhcygwLjBmKTsKKwkJc2V0VHdvU2lkZWRTdGVuY2lsKGZhbHNlKTsKKwkJc2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coQ29udGV4dDo6T1BFUkFUSU9OX0tFRVApOworCQlzZXRTdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1coQ29udGV4dDo6T1BFUkFUSU9OX0tFRVApOworCQlzZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhDb250ZXh0OjpPUEVSQVRJT05fS0VFUCk7CisJCXNldFN0ZW5jaWxDb21wYXJlQ0NXKENvbnRleHQ6OlNURU5DSUxfQUxXQVlTKTsKKwkJc2V0Q29sb3JXcml0ZU1hc2soMSwgMHgwMDAwMDAwRik7CisJCXNldENvbG9yV3JpdGVNYXNrKDIsIDB4MDAwMDAwMEYpOworCQlzZXRDb2xvcldyaXRlTWFzaygzLCAweDAwMDAwMDBGKTsKKwkJc2V0QmxlbmRDb25zdGFudCgweEZGRkZGRkZGKTsKKwkJc2V0V3JpdGVTUkdCKGZhbHNlKTsKKwkJc2V0RGVwdGhCaWFzKDAuMGYpOworCQlzZXRTZXBhcmF0ZUFscGhhQmxlbmRFbmFibGUoZmFsc2UpOworCQlzZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKENvbnRleHQ6OkJMRU5EX09ORSk7CisJCXNldERlc3RCbGVuZEZhY3RvckFscGhhKENvbnRleHQ6OkJMRU5EX1pFUk8pOworCQlzZXRCbGVuZE9wZXJhdGlvbkFscGhhKENvbnRleHQ6OkJMRU5ET1BfQUREKTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJc2V0QWRkcmVzc2luZ01vZGVVKHN3OjpTQU1QTEVSX1BJWEVMLCBpLCBBRERSRVNTSU5HX1dSQVApOworCQkJc2V0QWRkcmVzc2luZ01vZGVWKHN3OjpTQU1QTEVSX1BJWEVMLCBpLCBBRERSRVNTSU5HX1dSQVApOworCQkJc2V0QWRkcmVzc2luZ01vZGVXKHN3OjpTQU1QTEVSX1BJWEVMLCBpLCBBRERSRVNTSU5HX1dSQVApOworCQkJc2V0Qm9yZGVyQ29sb3Ioc3c6OlNBTVBMRVJfUElYRUwsIGksIDB4MDAwMDAwMDApOworCQkJc2V0VGV4dHVyZUZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgaSwgRklMVEVSX1BPSU5UKTsKKwkJCXNldE1pcG1hcEZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgaSwgTUlQTUFQX05PTkUpOworCQkJc2V0TWlwbWFwTE9EKHN3OjpTQU1QTEVSX1BJWEVMLCBpLCAwLjBmKTsKKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspCisJCXsKKwkJCXNldEFkZHJlc3NpbmdNb2RlVShzdzo6U0FNUExFUl9WRVJURVgsIGksIEFERFJFU1NJTkdfV1JBUCk7CisJCQlzZXRBZGRyZXNzaW5nTW9kZVYoc3c6OlNBTVBMRVJfVkVSVEVYLCBpLCBBRERSRVNTSU5HX1dSQVApOworCQkJc2V0QWRkcmVzc2luZ01vZGVXKHN3OjpTQU1QTEVSX1ZFUlRFWCwgaSwgQUREUkVTU0lOR19XUkFQKTsKKwkJCXNldEJvcmRlckNvbG9yKHN3OjpTQU1QTEVSX1ZFUlRFWCwgaSwgMHgwMDAwMDAwMCk7CisJCQlzZXRUZXh0dXJlRmlsdGVyKHN3OjpTQU1QTEVSX1ZFUlRFWCwgaSwgRklMVEVSX1BPSU5UKTsKKwkJCXNldE1pcG1hcEZpbHRlcihzdzo6U0FNUExFUl9WRVJURVgsIGksIE1JUE1BUF9OT05FKTsKKwkJCXNldE1pcG1hcExPRChzdzo6U0FNUExFUl9WRVJURVgsIGksIDAuMGYpOworCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDY7IGkrKykKKwkJeworCQkJZmxvYXQgcGxhbmVbNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJCXNldENsaXBQbGFuZShpLCBwbGFuZSk7CisJCX0KKworCQlwaXhlbFNoYWRlciA9IDA7CisJCXZlcnRleFNoYWRlciA9IDA7CisKKwkJcGl4ZWxTaGFkZXJEaXJ0eSA9IHRydWU7CisJCXBpeGVsU2hhZGVyQ29uc3RhbnRzRkRpcnR5ID0gMDsKKwkJdmVydGV4U2hhZGVyRGlydHkgPSB0cnVlOworCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudHNGRGlydHkgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCAyMjQ7IGkrKykKKwkJeworCQkJZmxvYXQgemVyb1s0XSA9IHswLCAwLCAwLCAwfTsKKworCQkJc2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoaSwgemVybywgMSk7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXsKKwkJCWZsb2F0IHplcm9bNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJCXNldFZlcnRleFNoYWRlckNvbnN0YW50RihpLCB6ZXJvLCAxKTsKKwkJfQorCX0KKworCURldmljZTo6fkRldmljZSgpCisJewkJCisJCWlmKGRlcHRoU3RlbmNpbCkKKwkJeworCQkJZGVwdGhTdGVuY2lsLT51bmJpbmQoKTsKKwkJCWRlcHRoU3RlbmNpbCA9IDA7CisJCX0KKwkJCisJCWlmKHJlbmRlclRhcmdldCkKKwkJeworCQkJcmVuZGVyVGFyZ2V0LT51bmJpbmQoKTsKKwkJCXJlbmRlclRhcmdldCA9IDA7CisJCX0KKworCQlkZWxldGUgY29udGV4dDsKKwl9CisKKwl2b2lkIERldmljZTo6Y2xlYXJDb2xvcih1bnNpZ25lZCBpbnQgY29sb3IsIHVuc2lnbmVkIGludCByZ2JhTWFzaykKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGNvbG9yID0gMHglMC44WCIsIGNvbG9yKTsKKworCQlpbnQgeCA9IHZpZXdwb3J0Lng7CisJCWludCB5ID0gdmlld3BvcnQueTsKKwkJaW50IHdpZHRoID0gdmlld3BvcnQud2lkdGg7CisJCWludCBoZWlnaHQgPSB2aWV3cG9ydC5oZWlnaHQ7CisKKwkJLy8gQ2xhbXAgYWdhaW5zdCBzY2lzc29yIHJlY3RhbmdsZQorCQlpZihzY2lzc29yRW5hYmxlKQorCQl7CisJCQlpZih4IDwgc2Npc3NvclJlY3QubGVmdCkgeCA9IHNjaXNzb3JSZWN0LmxlZnQ7CisJCQlpZih5IDwgc2Npc3NvclJlY3QudG9wKSB5ID0gc2Npc3NvclJlY3QudG9wOworCQkJaWYod2lkdGggPiBzY2lzc29yUmVjdC5yaWdodCAtIHNjaXNzb3JSZWN0LmxlZnQpIHdpZHRoID0gc2Npc3NvclJlY3QucmlnaHQgLSBzY2lzc29yUmVjdC5sZWZ0OworCQkJaWYoaGVpZ2h0ID4gc2Npc3NvclJlY3QuYm90dG9tIC0gc2Npc3NvclJlY3QudG9wKSBoZWlnaHQgPSBzY2lzc29yUmVjdC5ib3R0b20gLSBzY2lzc29yUmVjdC50b3A7CisJCX0KKworCQlpZihyZW5kZXJUYXJnZXQpCisJCXsKKwkJCXJlbmRlclRhcmdldC0+Y2xlYXJDb2xvckJ1ZmZlcihjb2xvciwgcmdiYU1hc2ssIHgsIHksIHdpZHRoLCBoZWlnaHQpOworCQl9CisJfQorCisJdm9pZCBEZXZpY2U6OmNsZWFyRGVwdGgoZmxvYXQgeikKKwl7CisJCVRSQUNFKCJmbG9hdCB6ID0gJWYiLCB6KTsKKworCQlpZih6ID4gMSkgeiA9IDE7CisJCWlmKHogPCAwKSB6ID0gMDsKKworCQlpbnQgeCA9IHZpZXdwb3J0Lng7CisJCWludCB5ID0gdmlld3BvcnQueTsKKwkJaW50IHdpZHRoID0gdmlld3BvcnQud2lkdGg7CisJCWludCBoZWlnaHQgPSB2aWV3cG9ydC5oZWlnaHQ7CisKKwkJLy8gQ2xhbXAgYWdhaW5zdCBzY2lzc29yIHJlY3RhbmdsZQorCQlpZihzY2lzc29yRW5hYmxlKQorCQl7CisJCQlpZih4IDwgc2Npc3NvclJlY3QubGVmdCkgeCA9IHNjaXNzb3JSZWN0LmxlZnQ7CisJCQlpZih5IDwgc2Npc3NvclJlY3QudG9wKSB5ID0gc2Npc3NvclJlY3QudG9wOworCQkJaWYod2lkdGggPiBzY2lzc29yUmVjdC5yaWdodCAtIHNjaXNzb3JSZWN0LmxlZnQpIHdpZHRoID0gc2Npc3NvclJlY3QucmlnaHQgLSBzY2lzc29yUmVjdC5sZWZ0OworCQkJaWYoaGVpZ2h0ID4gc2Npc3NvclJlY3QuYm90dG9tIC0gc2Npc3NvclJlY3QudG9wKSBoZWlnaHQgPSBzY2lzc29yUmVjdC5ib3R0b20gLSBzY2lzc29yUmVjdC50b3A7CisJCX0KKworCQlpZihkZXB0aFN0ZW5jaWwpCisJCXsKKwkJCWRlcHRoU3RlbmNpbC0+Y2xlYXJEZXB0aEJ1ZmZlcih6LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKwkJfQorCX0KKworCXZvaWQgRGV2aWNlOjpjbGVhclN0ZW5jaWwodW5zaWduZWQgaW50IHN0ZW5jaWwsIHVuc2lnbmVkIGludCBtYXNrKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc3RlbmNpbCA9ICVkIiwgc3RlbmNpbCk7CisKKwkJaW50IHggPSB2aWV3cG9ydC54OworCQlpbnQgeSA9IHZpZXdwb3J0Lnk7CisJCWludCB3aWR0aCA9IHZpZXdwb3J0LndpZHRoOworCQlpbnQgaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0OworCisJCS8vIENsYW1wIGFnYWluc3Qgc2Npc3NvciByZWN0YW5nbGUKKwkJaWYoc2Npc3NvckVuYWJsZSkKKwkJeworCQkJaWYoeCA8IHNjaXNzb3JSZWN0LmxlZnQpIHggPSBzY2lzc29yUmVjdC5sZWZ0OworCQkJaWYoeSA8IHNjaXNzb3JSZWN0LnRvcCkgeSA9IHNjaXNzb3JSZWN0LnRvcDsKKwkJCWlmKHdpZHRoID4gc2Npc3NvclJlY3QucmlnaHQgLSBzY2lzc29yUmVjdC5sZWZ0KSB3aWR0aCA9IHNjaXNzb3JSZWN0LnJpZ2h0IC0gc2Npc3NvclJlY3QubGVmdDsKKwkJCWlmKGhlaWdodCA+IHNjaXNzb3JSZWN0LmJvdHRvbSAtIHNjaXNzb3JSZWN0LnRvcCkgaGVpZ2h0ID0gc2Npc3NvclJlY3QuYm90dG9tIC0gc2Npc3NvclJlY3QudG9wOworCQl9CisKKwkJaWYoZGVwdGhTdGVuY2lsKQorCQl7CisJCQlkZXB0aFN0ZW5jaWwtPmNsZWFyU3RlbmNpbEJ1ZmZlcihzdGVuY2lsLCBtYXNrLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKwkJfQorCX0KKworCUltYWdlICpEZXZpY2U6OmNyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzdzo6Rm9ybWF0IGZvcm1hdCwgaW50IG11bHRpU2FtcGxlRGVwdGgsIGJvb2wgZGlzY2FyZCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgd2lkdGggPSAlZCwgdW5zaWduZWQgaW50IGhlaWdodCA9ICVkLCBzdzo6Rm9ybWF0IGZvcm1hdCA9ICVkLCBpbnQgbXVsdGlTYW1wbGVEZXB0aCA9ICVkLCBib29sIGRpc2NhcmQgPSAlZCIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgbXVsdGlTYW1wbGVEZXB0aCwgZGlzY2FyZCk7CisKKwkJaWYod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCB8fCBoZWlnaHQgPiBPVVRMSU5FX1JFU09MVVRJT04pCisJCXsKKwkJCUVSUigiSW52YWxpZCBwYXJhbWV0ZXJzIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJYm9vbCBsb2NrYWJsZSA9IHRydWU7CisKKwkJc3dpdGNoKGZvcm1hdCkKKwkJeworCS8vCWNhc2UgRk9STUFUX0QxNVMxOgorCQljYXNlIEZPUk1BVF9EMjRTODoKKwkJY2FzZSBGT1JNQVRfRDI0WDg6CisJLy8JY2FzZSBGT1JNQVRfRDI0WDRTNDoKKwkJY2FzZSBGT1JNQVRfRDI0RlM4OgorCQljYXNlIEZPUk1BVF9EMzI6CisJCWNhc2UgRk9STUFUX0QxNjoKKwkJCWxvY2thYmxlID0gZmFsc2U7CisJCQlicmVhazsKKwkvLwljYXNlIEZPUk1BVF9TOF9MT0NLQUJMRToKKwkvLwljYXNlIEZPUk1BVF9EMTZfTE9DS0FCTEU6CisJCWNhc2UgRk9STUFUX0QzMkZfTE9DS0FCTEU6CisJLy8JY2FzZSBGT1JNQVRfRDMyX0xPQ0tBQkxFOgorCQljYXNlIEZPUk1BVF9ERjI0OgorCQljYXNlIEZPUk1BVF9ERjE2OgorCQkJbG9ja2FibGUgPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlVTlJFQUNIQUJMRSgpOworCQl9CisKKwkJSW1hZ2UgKnN1cmZhY2UgPSBuZXcgSW1hZ2UoMCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBHTF9OT05FLCBHTF9OT05FLCBtdWx0aVNhbXBsZURlcHRoLCBsb2NrYWJsZSwgdHJ1ZSk7CisKKwkJaWYoIXN1cmZhY2UpCisJCXsKKwkJCUVSUigiT3V0IG9mIG1lbW9yeSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzdXJmYWNlLT5hZGRSZWYoKTsKKworCQlyZXR1cm4gc3VyZmFjZTsKKwl9CisKKwlJbWFnZSAqRGV2aWNlOjpjcmVhdGVPZmZzY3JlZW5QbGFpblN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzdzo6Rm9ybWF0IGZvcm1hdCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgd2lkdGggPSAlZCwgdW5zaWduZWQgaW50IGhlaWdodCA9ICVkLCBzdzo6Rm9ybWF0IGZvcm1hdCA9ICVkIiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKwkJCisJCUltYWdlICpzdXJmYWNlID0gbmV3IEltYWdlKDAsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgR0xfTk9ORSwgR0xfTk9ORSwgMSwgdHJ1ZSwgZmFsc2UpOworCisJCWlmKCFzdXJmYWNlKQorCQl7CisJCQlFUlIoIk91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc3VyZmFjZS0+YWRkUmVmKCk7CisKKwkJcmV0dXJuIHN1cmZhY2U7CisJfQorCisJSW1hZ2UgKkRldmljZTo6Y3JlYXRlUmVuZGVyVGFyZ2V0KHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgc3c6OkZvcm1hdCBmb3JtYXQsIGludCBtdWx0aVNhbXBsZURlcHRoLCBib29sIGxvY2thYmxlKQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCB3aWR0aCA9ICVkLCB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gJWQsIHN3OjpGb3JtYXQgZm9ybWF0ID0gJWQsIGludCBtdWx0aVNhbXBsZURlcHRoID0gJWQsIGJvb2wgbG9ja2FibGUgPSAlZCIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgbXVsdGlTYW1wbGVEZXB0aCwgbG9ja2FibGUpOworCisJCWlmKGhlaWdodCA+IE9VVExJTkVfUkVTT0xVVElPTikKKwkJeworCQkJRVJSKCJJbnZhbGlkIHBhcmFtZXRlcnMiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJSW1hZ2UgKnN1cmZhY2UgPSBuZXcgSW1hZ2UoMCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBHTF9OT05FLCBHTF9OT05FLCBtdWx0aVNhbXBsZURlcHRoLCBsb2NrYWJsZSAhPSBGQUxTRSwgdHJ1ZSk7CisKKwkJaWYoIXN1cmZhY2UpCisJCXsKKwkJCUVSUigiT3V0IG9mIG1lbW9yeSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzdXJmYWNlLT5hZGRSZWYoKTsKKwkJCisJCXJldHVybiBzdXJmYWNlOworCX0KKworCXZvaWQgRGV2aWNlOjpkcmF3SW5kZXhlZFByaW1pdGl2ZShQcmltaXRpdmVUeXBlIHR5cGUsIHVuc2lnbmVkIGludCBpbmRleE9mZnNldCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50LCBpbnQgaW5kZXhTaXplKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFiaW5kUmVzb3VyY2VzKCkgfHwgIXByaW1pdGl2ZUNvdW50KQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlDb250ZXh0OjpEcmF3VHlwZSBkcmF3VHlwZTsKKworCQlpZihpbmRleFNpemUgPT0gNCkKKwkJeworCQkJc3dpdGNoKHR5cGUpCisJCQl7CisJCQljYXNlIERSQVdfUE9JTlRMSVNUOiAgICAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX0lOREVYRURQT0lOVExJU1QzMjsgICAgIGJyZWFrOworCQkJY2FzZSBEUkFXX0xJTkVMSVNUOiAgICAgIGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVETElORUxJU1QzMjsgICAgICBicmVhazsKKwkJCWNhc2UgRFJBV19MSU5FU1RSSVA6ICAgICBkcmF3VHlwZSA9IENvbnRleHQ6OkRSQVdfSU5ERVhFRExJTkVTVFJJUDMyOyAgICAgYnJlYWs7CisJCQljYXNlIERSQVdfTElORUxPT1A6ICAgICAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX0lOREVYRURMSU5FTE9PUDMyOyAgICAgIGJyZWFrOworCQkJY2FzZSBEUkFXX1RSSUFOR0xFTElTVDogIGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMzI7ICBicmVhazsKKwkJCWNhc2UgRFJBV19UUklBTkdMRVNUUklQOiBkcmF3VHlwZSA9IENvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFU1RSSVAzMjsgYnJlYWs7CisJCQljYXNlIERSQVdfVFJJQU5HTEVGQU46ICAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRUZBTjMyOwkgIGJyZWFrOworCQkJZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKGluZGV4U2l6ZSA9PSAyKQorCQl7CisJCQlzd2l0Y2godHlwZSkKKwkJCXsKKwkJCWNhc2UgRFJBV19QT0lOVExJU1Q6ICAgICBkcmF3VHlwZSA9IENvbnRleHQ6OkRSQVdfSU5ERVhFRFBPSU5UTElTVDE2OyAgICAgYnJlYWs7CisJCQljYXNlIERSQVdfTElORUxJU1Q6ICAgICAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX0lOREVYRURMSU5FTElTVDE2OyAgICAgIGJyZWFrOworCQkJY2FzZSBEUkFXX0xJTkVTVFJJUDogICAgIGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVETElORVNUUklQMTY7ICAgICBicmVhazsKKwkJCWNhc2UgRFJBV19MSU5FTE9PUDogICAgICBkcmF3VHlwZSA9IENvbnRleHQ6OkRSQVdfSU5ERVhFRExJTkVMT09QMTY7ICAgICAgYnJlYWs7CisJCQljYXNlIERSQVdfVFJJQU5HTEVMSVNUOiAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRUxJU1QxNjsgIGJyZWFrOworCQkJY2FzZSBEUkFXX1RSSUFOR0xFU1RSSVA6IGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDE2OyBicmVhazsKKwkJCWNhc2UgRFJBV19UUklBTkdMRUZBTjogICBkcmF3VHlwZSA9IENvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMTY7ICAgYnJlYWs7CisJCQlkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworCQkJfQorCQl9CisJCWVsc2UgaWYoaW5kZXhTaXplID09IDEpCisJCXsKKwkJCXN3aXRjaCh0eXBlKQorCQkJeworCQkJY2FzZSBEUkFXX1BPSU5UTElTVDogICAgIGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVEUE9JTlRMSVNUODsgICAgIGJyZWFrOworCQkJY2FzZSBEUkFXX0xJTkVMSVNUOiAgICAgIGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVETElORUxJU1Q4OyAgICAgIGJyZWFrOworCQkJY2FzZSBEUkFXX0xJTkVTVFJJUDogICAgIGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVETElORVNUUklQODsgICAgIGJyZWFrOworCQkJY2FzZSBEUkFXX0xJTkVMT09QOiAgICAgIGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVETElORUxPT1A4OyAgICAgIGJyZWFrOworCQkJY2FzZSBEUkFXX1RSSUFOR0xFTElTVDogIGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUODsgIGJyZWFrOworCQkJY2FzZSBEUkFXX1RSSUFOR0xFU1RSSVA6IGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDg7IGJyZWFrOworCQkJY2FzZSBEUkFXX1RSSUFOR0xFRkFOOiAgIGRyYXdUeXBlID0gQ29udGV4dDo6RFJBV19JTkRFWEVEVFJJQU5HTEVGQU44OyAgIGJyZWFrOworCQkJZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKwkJCX0KKwkJfQorCQllbHNlIFVOUkVBQ0hBQkxFKCk7CisKKwkJZHJhdyhkcmF3VHlwZSwgaW5kZXhPZmZzZXQsIHByaW1pdGl2ZUNvdW50KTsKKwl9CisKKwl2b2lkIERldmljZTo6ZHJhd1ByaW1pdGl2ZShQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighYmluZFJlc291cmNlcygpIHx8ICFwcmltaXRpdmVDb3VudCkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJc2V0SW5kZXhCdWZmZXIoMCk7CisJCQorCQlDb250ZXh0OjpEcmF3VHlwZSBkcmF3VHlwZTsKKworCQlzd2l0Y2gocHJpbWl0aXZlVHlwZSkKKwkJeworCQljYXNlIERSQVdfUE9JTlRMSVNUOiAgICAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX1BPSU5UTElTVDsgICAgIGJyZWFrOworCQljYXNlIERSQVdfTElORUxJU1Q6ICAgICAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX0xJTkVMSVNUOyAgICAgIGJyZWFrOworCQljYXNlIERSQVdfTElORVNUUklQOiAgICAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX0xJTkVTVFJJUDsgICAgIGJyZWFrOworCQljYXNlIERSQVdfTElORUxPT1A6ICAgICAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX0xJTkVMT09QOyAgICAgIGJyZWFrOworCQljYXNlIERSQVdfVFJJQU5HTEVMSVNUOiAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX1RSSUFOR0xFTElTVDsgIGJyZWFrOworCQljYXNlIERSQVdfVFJJQU5HTEVTVFJJUDogZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX1RSSUFOR0xFU1RSSVA7IGJyZWFrOworCQljYXNlIERSQVdfVFJJQU5HTEVGQU46ICAgZHJhd1R5cGUgPSBDb250ZXh0OjpEUkFXX1RSSUFOR0xFRkFOOyAgIGJyZWFrOworCQlkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworCQl9CisKKwkJZHJhdyhkcmF3VHlwZSwgMCwgcHJpbWl0aXZlQ291bnQpOworCX0KKworCUltYWdlICpEZXZpY2U6OmdldERlcHRoU3RlbmNpbFN1cmZhY2UoKQorCXsKKwkJVFJBQ0UoInZvaWQiKTsKKworCQlpZihkZXB0aFN0ZW5jaWwpCisJCXsKKwkJCWRlcHRoU3RlbmNpbC0+YWRkUmVmKCk7CisJCX0KKworCQlyZXR1cm4gZGVwdGhTdGVuY2lsOworCX0KKworCWJvb2wgRGV2aWNlOjpnZXRSZW5kZXJUYXJnZXREYXRhKEltYWdlICpyZW5kZXJUYXJnZXQsIEltYWdlICpkZXN0U3VyZmFjZSkKKwl7CisJCVRSQUNFKCJJbWFnZSAqcmVuZGVyVGFyZ2V0ID0gMHglMC44cCwgSW1hZ2UgKmRlc3RTdXJmYWNlID0gMHglMC44cCIsIHJlbmRlclRhcmdldCwgZGVzdFN1cmZhY2UpOworCisJCWlmKCFyZW5kZXJUYXJnZXQgfHwgIWRlc3RTdXJmYWNlKQorCQl7CisJCQlFUlIoIkludmFsaWQgcGFyYW1ldGVycyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlpZihyZW5kZXJUYXJnZXQtPmdldFdpZHRoKCkgICE9IGRlc3RTdXJmYWNlLT5nZXRXaWR0aCgpIHx8CisJCSAgIHJlbmRlclRhcmdldC0+Z2V0SGVpZ2h0KCkgIT0gZGVzdFN1cmZhY2UtPmdldEhlaWdodCgpIHx8CisJCSAgIHJlbmRlclRhcmdldC0+Z2V0SW50ZXJuYWxGb3JtYXQoKSAhPSBkZXN0U3VyZmFjZS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSkKKwkJeworCQkJRVJSKCJJbnZhbGlkIHBhcmFtZXRlcnMiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXN0YXRpYyB2b2lkIChfX2NkZWNsICpibGl0RnVuY3Rpb24pKHZvaWQgKmRzdCwgdm9pZCAqc3JjKTsKKwkJc3RhdGljIFJvdXRpbmUgKmJsaXRSb3V0aW5lOworCQlzdGF0aWMgQmxpdFN0YXRlIGJsaXRTdGF0ZSA9IHswfTsKKworCQlCbGl0U3RhdGUgdXBkYXRlOworCQl1cGRhdGUud2lkdGggPSByZW5kZXJUYXJnZXQtPmdldEludGVybmFsV2lkdGgoKTsKKwkJdXBkYXRlLmhlaWdodCA9IHJlbmRlclRhcmdldC0+Z2V0SW50ZXJuYWxIZWlnaHQoKTsKKwkJdXBkYXRlLmRlcHRoID0gMzI7CisJCXVwZGF0ZS5zdHJpZGUgPSBkZXN0U3VyZmFjZS0+Z2V0SW50ZXJuYWxQaXRjaEIoKTsKKwkJdXBkYXRlLkhEUiA9IGZhbHNlOworCQl1cGRhdGUuY3Vyc29ySGVpZ2h0ID0gMDsKKwkJdXBkYXRlLmN1cnNvcldpZHRoID0gMDsKKwkJCisJCWlmKG1lbWNtcCgmYmxpdFN0YXRlLCAmdXBkYXRlLCBzaXplb2YoQmxpdFN0YXRlKSkgIT0gMCkKKwkJeworCQkJYmxpdFN0YXRlID0gdXBkYXRlOworCQkJZGVsZXRlIGJsaXRSb3V0aW5lOworCisJCQlibGl0Um91dGluZSA9IEZyYW1lQnVmZmVyOjpjb3B5Um91dGluZShibGl0U3RhdGUpOworCQkJYmxpdEZ1bmN0aW9uID0gKHZvaWQoX19jZGVjbCopKHZvaWQqLCB2b2lkKikpYmxpdFJvdXRpbmUtPmdldEVudHJ5KCk7CisJCX0KKworCQl2b2lkICpkc3QgPSBkZXN0U3VyZmFjZS0+bG9ja0ludGVybmFsKDAsIDAsIDAsIExPQ0tfV1JJVEVPTkxZLCBQVUJMSUMpOworCQl2b2lkICpzcmMgPSByZW5kZXJUYXJnZXQtPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBMT0NLX1dSSVRFT05MWSwgUFVCTElDKTsKKworCQlibGl0RnVuY3Rpb24oZHN0LCBzcmMpOworCisJCWRlc3RTdXJmYWNlLT51bmxvY2tJbnRlcm5hbCgpOworCQlyZW5kZXJUYXJnZXQtPnVubG9ja0ludGVybmFsKCk7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJdm9pZCBEZXZpY2U6OnNldERlcHRoU3RlbmNpbFN1cmZhY2UoSW1hZ2UgKmRlcHRoU3RlbmNpbCkKKwl7CisJCVRSQUNFKCJJbWFnZSAqbmV3RGVwdGhTdGVuY2lsID0gMHglMC44cCIsIGRlcHRoU3RlbmNpbCk7CisKKwkJaWYodGhpcy0+ZGVwdGhTdGVuY2lsID09IGRlcHRoU3RlbmNpbCkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYoZGVwdGhTdGVuY2lsKQorCQl7CisJCQlkZXB0aFN0ZW5jaWwtPmJpbmQoKTsKKwkJfQorCisJCWlmKHRoaXMtPmRlcHRoU3RlbmNpbCkKKwkJeworCQkJdGhpcy0+ZGVwdGhTdGVuY2lsLT51bmJpbmQoKTsKKwkJfQorCisJCXRoaXMtPmRlcHRoU3RlbmNpbCA9IGRlcHRoU3RlbmNpbDsKKworCQlzZXREZXB0aFN0ZW5jaWwoZGVwdGhTdGVuY2lsKTsKKwl9CisKKwl2b2lkIERldmljZTo6c2V0UGl4ZWxTaGFkZXIoUGl4ZWxTaGFkZXIgKnBpeGVsU2hhZGVyKQorCXsKKwkJVFJBQ0UoIlBpeGVsU2hhZGVyICpzaGFkZXIgPSAweCUwLjhwIiwgcGl4ZWxTaGFkZXIpOworCisJCXRoaXMtPnBpeGVsU2hhZGVyID0gcGl4ZWxTaGFkZXI7CisJCXBpeGVsU2hhZGVyRGlydHkgPSB0cnVlOworCX0KKworCXZvaWQgRGV2aWNlOjpzZXRQaXhlbFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKworCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQgJiYgc3RhcnRSZWdpc3RlciArIGkgPCAyMjQ7IGkrKykKKwkJeworCQkJcGl4ZWxTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzBdID0gY29uc3RhbnREYXRhW2kgKiA0ICsgMF07CisJCQlwaXhlbFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bMV0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAxXTsKKwkJCXBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDJdOworCQkJcGl4ZWxTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzNdID0gY29uc3RhbnREYXRhW2kgKiA0ICsgM107CisJCX0KKworCQlwaXhlbFNoYWRlckNvbnN0YW50c0ZEaXJ0eSA9IG1heChzdGFydFJlZ2lzdGVyICsgY291bnQsIHBpeGVsU2hhZGVyQ29uc3RhbnRzRkRpcnR5KTsKKwkJcGl4ZWxTaGFkZXJEaXJ0eSA9IHRydWU7ICAgLy8gUmVsb2FkIERFRiBjb25zdGFudHMKKwl9CisKKwl2b2lkIERldmljZTo6c2V0U2Npc3NvckVuYWJsZShib29sIGVuYWJsZSkKKwl7CisJCXNjaXNzb3JFbmFibGUgPSBlbmFibGU7CisJfQorCisJdm9pZCBEZXZpY2U6OnNldFJlbmRlclRhcmdldChJbWFnZSAqaVJlbmRlclRhcmdldCkKKwl7CisJCVRSQUNFKCJJbWFnZSAqbmV3UmVuZGVyVGFyZ2V0ID0gMHglMC44cCIsIGlSZW5kZXJUYXJnZXQpOworCisJCUltYWdlICpyZW5kZXJUYXJnZXQgPSBzdGF0aWNfY2FzdDxJbWFnZSo+KGlSZW5kZXJUYXJnZXQpOworCisJCWlmKHJlbmRlclRhcmdldCkKKwkJeworCQkJcmVuZGVyVGFyZ2V0LT5iaW5kKCk7CisJCX0KKworCQlpZih0aGlzLT5yZW5kZXJUYXJnZXQpCisJCXsKKwkJCXRoaXMtPnJlbmRlclRhcmdldC0+dW5iaW5kKCk7CisJCX0KKworCQl0aGlzLT5yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7CisKKwkJaWYocmVuZGVyVGFyZ2V0KQorCQl7CisJCQkvLyBSZXNldCB2aWV3cG9ydCB0byBzaXplIG9mIGN1cnJlbnQgcmVuZGVyIHRhcmdldAorCQkJdmlld3BvcnQueCA9IDA7CisJCQl2aWV3cG9ydC55ID0gMDsKKwkJCXZpZXdwb3J0LndpZHRoID0gcmVuZGVyVGFyZ2V0LT5nZXRXaWR0aCgpOworCQkJdmlld3BvcnQuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LT5nZXRIZWlnaHQoKTsKKwkJCXZpZXdwb3J0Lm1pblogPSAwOworCQkJdmlld3BvcnQubWF4WiA9IDE7CisKKwkJCS8vIFJlc2V0IHNjaXNzb3IgcmVjdGFuZ2xlIHRvIHNpemUgb2YgY3VycmVudCByZW5kZXIgdGFyZ2V0CisJCQlzY2lzc29yUmVjdC5sZWZ0ID0gMDsKKwkJCXNjaXNzb3JSZWN0LnRvcCA9IDA7CisJCQlzY2lzc29yUmVjdC5yaWdodCA9IHJlbmRlclRhcmdldC0+Z2V0V2lkdGgoKTsKKwkJCXNjaXNzb3JSZWN0LmJvdHRvbSA9IHJlbmRlclRhcmdldC0+Z2V0SGVpZ2h0KCk7CisJCX0KKworCQlSZW5kZXJlcjo6c2V0UmVuZGVyVGFyZ2V0KDAsIHJlbmRlclRhcmdldCk7CisJfQorCisJdm9pZCBEZXZpY2U6OnNldFNjaXNzb3JSZWN0KGNvbnN0IHN3OjpSZWN0ICZyZWN0KQorCXsKKwkJVFJBQ0UoImNvbnN0IHN3OjpSZWN0ICpyZWN0ID0gMHglMC44cCIsIHJlY3QpOworCisJCXNjaXNzb3JSZWN0ID0gcmVjdDsKKwl9CisKKwl2b2lkIERldmljZTo6c2V0VmVydGV4U2hhZGVyKFZlcnRleFNoYWRlciAqdmVydGV4U2hhZGVyKQorCXsKKwkJVFJBQ0UoIlZlcnRleFNoYWRlciAqc2hhZGVyID0gMHglMC44cCIsIHZlcnRleFNoYWRlcik7CisKKwkJdGhpcy0+dmVydGV4U2hhZGVyID0gdmVydGV4U2hhZGVyOworCQl2ZXJ0ZXhTaGFkZXJEaXJ0eSA9IHRydWU7CisJfQorCisJdm9pZCBEZXZpY2U6OnNldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKworCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQgJiYgc3RhcnRSZWdpc3RlciArIGkgPCAyNTY7IGkrKykKKwkJeworCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVswXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDBdOworCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDFdOworCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDJdOworCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVszXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDNdOworCQl9CisJCQkKKwkJdmVydGV4U2hhZGVyQ29uc3RhbnRzRkRpcnR5ID0gbWF4KHN0YXJ0UmVnaXN0ZXIgKyBjb3VudCwgdmVydGV4U2hhZGVyQ29uc3RhbnRzRkRpcnR5KTsKKwkJdmVydGV4U2hhZGVyRGlydHkgPSB0cnVlOyAgIC8vIFJlbG9hZCBERUYgY29uc3RhbnRzCisJfQorCisJdm9pZCBEZXZpY2U6OnNldFZpZXdwb3J0KGNvbnN0IFZpZXdwb3J0ICZ2aWV3cG9ydCkKKwl7CisJCVRSQUNFKCJjb25zdCBWaWV3cG9ydCAqdmlld3BvcnQgPSAweCUwLjhwIiwgdmlld3BvcnQpOworCisJCXRoaXMtPnZpZXdwb3J0ID0gdmlld3BvcnQ7CisJfQorCisJYm9vbCBEZXZpY2U6OnN0cmV0Y2hSZWN0KEltYWdlICpzb3VyY2VTdXJmYWNlLCBjb25zdCBzdzo6UmVjdCAqc291cmNlUmVjdCwgSW1hZ2UgKmRlc3RTdXJmYWNlLCBjb25zdCBzdzo6UmVjdCAqZGVzdFJlY3QsIGJvb2wgZmlsdGVyKQorCXsKKwkJVFJBQ0UoIkltYWdlICpzb3VyY2VTdXJmYWNlID0gMHglMC44cCwgY29uc3Qgc3c6OlJlY3QgKnNvdXJjZVJlY3QgPSAweCUwLjhwLCBJbWFnZSAqZGVzdFN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBzdzo6UmVjdCAqZGVzdFJlY3QgPSAweCUwLjhwLCBib29sIGZpbHRlciA9ICVkIiwgc291cmNlU3VyZmFjZSwgc291cmNlUmVjdCwgZGVzdFN1cmZhY2UsIGRlc3RSZWN0LCBmaWx0ZXIpOworCisJCWlmKCFzb3VyY2VTdXJmYWNlIHx8ICFkZXN0U3VyZmFjZSB8fCAhdmFsaWRSZWN0YW5nbGUoc291cmNlUmVjdCwgc291cmNlU3VyZmFjZSkgfHwgIXZhbGlkUmVjdGFuZ2xlKGRlc3RSZWN0LCBkZXN0U3VyZmFjZSkpCisJCXsKKwkJCUVSUigiSW52YWxpZCBwYXJhbWV0ZXJzIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCUltYWdlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxJbWFnZSo+KHNvdXJjZVN1cmZhY2UpOworCQlJbWFnZSAqZGVzdCA9IHN0YXRpY19jYXN0PEltYWdlKj4oZGVzdFN1cmZhY2UpOworCisJCWludCBzV2lkdGggPSBzb3VyY2UtPmdldEV4dGVybmFsV2lkdGgoKTsKKwkJaW50IHNIZWlnaHQgPSBzb3VyY2UtPmdldEV4dGVybmFsSGVpZ2h0KCk7CisJCWludCBkV2lkdGggPSBkZXN0LT5nZXRFeHRlcm5hbFdpZHRoKCk7CisJCWludCBkSGVpZ2h0ID0gZGVzdC0+Z2V0RXh0ZXJuYWxIZWlnaHQoKTsKKworCQlSZWN0IHNSZWN0OworCQlSZWN0IGRSZWN0OworCisJCWlmKHNvdXJjZVJlY3QpCisJCXsKKwkJCXNSZWN0ID0gKnNvdXJjZVJlY3Q7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzUmVjdC50b3AgPSAwOworCQkJc1JlY3QubGVmdCA9IDA7CisJCQlzUmVjdC5ib3R0b20gPSBzSGVpZ2h0OworCQkJc1JlY3QucmlnaHQgPSBzV2lkdGg7CisJCX0KKworCQlpZihkZXN0UmVjdCkKKwkJeworCQkJZFJlY3QgPSAqZGVzdFJlY3Q7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkUmVjdC50b3AgPSAwOworCQkJZFJlY3QubGVmdCA9IDA7CisJCQlkUmVjdC5ib3R0b20gPSBkSGVpZ2h0OworCQkJZFJlY3QucmlnaHQgPSBkV2lkdGg7CisJCX0KKworCQlib29sIHNjYWxpbmcgPSAoc1JlY3QucmlnaHQgLSBzUmVjdC5sZWZ0ICE9IGRSZWN0LnJpZ2h0IC0gZFJlY3QubGVmdCkgfHwgKHNSZWN0LmJvdHRvbSAtIHNSZWN0LnRvcCAhPSBkUmVjdC5ib3R0b20gLSBkUmVjdC50b3ApOworCQlib29sIGVxdWFsRm9ybWF0cyA9IHNvdXJjZS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSA9PSBkZXN0LT5nZXRJbnRlcm5hbEZvcm1hdCgpOworCQlib29sIGRlcHRoU3RlbmNpbCA9IEltYWdlOjppc0RlcHRoKHNvdXJjZS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSkgfHwgSW1hZ2U6OmlzU3RlbmNpbChzb3VyY2UtPmdldEludGVybmFsRm9ybWF0KCkpOworCQlib29sIGFscGhhMHhGRiA9IGZhbHNlOworCisJCWlmKChzb3VyY2UtPmdldEludGVybmFsRm9ybWF0KCkgPT0gRk9STUFUX0E4UjhHOEI4ICYmIGRlc3QtPmdldEludGVybmFsRm9ybWF0KCkgPT0gRk9STUFUX1g4UjhHOEI4KSB8fAorCQkgICAoc291cmNlLT5nZXRJbnRlcm5hbEZvcm1hdCgpID09IEZPUk1BVF9YOFI4RzhCOCAmJiBkZXN0LT5nZXRJbnRlcm5hbEZvcm1hdCgpID09IEZPUk1BVF9BOFI4RzhCOCkpCisJCXsKKwkJCWVxdWFsRm9ybWF0cyA9IHRydWU7CisJCQlhbHBoYTB4RkYgPSB0cnVlOworCQl9CisKKwkJaWYoZGVwdGhTdGVuY2lsKSAgIC8vIENvcHkgZW50aXJlbHksIGludGVybmFsbHkgICAvLyBGSVhNRTogQ2hlY2sKKwkJeworCQkJaWYoc291cmNlLT5oYXNEZXB0aCgpKQorCQkJeworCQkJCXN3OjpieXRlICpzb3VyY2VCdWZmZXIgPSAoc3c6OmJ5dGUqKXNvdXJjZS0+bG9ja0ludGVybmFsKDAsIDAsIDAsIExPQ0tfUkVBRE9OTFksIFBVQkxJQyk7CisJCQkJc3c6OmJ5dGUgKmRlc3RCdWZmZXIgPSAoc3c6OmJ5dGUqKWRlc3QtPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBMT0NLX0RJU0NBUkQsIFBVQkxJQyk7CisKKwkJCQl1bnNpZ25lZCBpbnQgd2lkdGggPSBzb3VyY2UtPmdldEludGVybmFsV2lkdGgoKTsKKwkJCQl1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gc291cmNlLT5nZXRJbnRlcm5hbEhlaWdodCgpOworCQkJCXVuc2lnbmVkIGludCBwaXRjaCA9IHNvdXJjZS0+Z2V0SW50ZXJuYWxQaXRjaEIoKTsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQl7CisJCQkJCW1lbWNweShkZXN0QnVmZmVyLCBzb3VyY2VCdWZmZXIsIHBpdGNoKTsgICAvLyBGSVhNRTogT25seSBjb3B5IHdpZHRoICogYnl0ZXMKKworCQkJCQlzb3VyY2VCdWZmZXIgKz0gcGl0Y2g7CisJCQkJCWRlc3RCdWZmZXIgKz0gcGl0Y2g7CisJCQkJfQorCisJCQkJc291cmNlLT51bmxvY2tJbnRlcm5hbCgpOworCQkJCWRlc3QtPnVubG9ja0ludGVybmFsKCk7CisJCQl9CisKKwkJCWlmKHNvdXJjZS0+aGFzU3RlbmNpbCgpKQorCQkJeworCQkJCXN3OjpieXRlICpzb3VyY2VCdWZmZXIgPSAoc3c6OmJ5dGUqKXNvdXJjZS0+bG9ja1N0ZW5jaWwoMCwgUFVCTElDKTsKKwkJCQlzdzo6Ynl0ZSAqZGVzdEJ1ZmZlciA9IChzdzo6Ynl0ZSopZGVzdC0+bG9ja1N0ZW5jaWwoMCwgUFVCTElDKTsKKworCQkJCXVuc2lnbmVkIGludCB3aWR0aCA9IHNvdXJjZS0+Z2V0SW50ZXJuYWxXaWR0aCgpOworCQkJCXVuc2lnbmVkIGludCBoZWlnaHQgPSBzb3VyY2UtPmdldEludGVybmFsSGVpZ2h0KCk7CisJCQkJdW5zaWduZWQgaW50IHBpdGNoID0gc291cmNlLT5nZXRTdGVuY2lsUGl0Y2hCKCk7CisKKwkJCQlmb3IodW5zaWduZWQgaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJeworCQkJCQltZW1jcHkoZGVzdEJ1ZmZlciwgc291cmNlQnVmZmVyLCBwaXRjaCk7ICAgLy8gRklYTUU6IE9ubHkgY29weSB3aWR0aCAqIGJ5dGVzCisKKwkJCQkJc291cmNlQnVmZmVyICs9IHBpdGNoOworCQkJCQlkZXN0QnVmZmVyICs9IHBpdGNoOworCQkJCX0KKworCQkJCXNvdXJjZS0+dW5sb2NrU3RlbmNpbCgpOworCQkJCWRlc3QtPnVubG9ja1N0ZW5jaWwoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCFzY2FsaW5nICYmIGVxdWFsRm9ybWF0cykKKwkJeworCQkJdW5zaWduZWQgY2hhciAqc291cmNlQnl0ZXMgPSAodW5zaWduZWQgY2hhciopc291cmNlLT5sb2NrSW50ZXJuYWwoc1JlY3QubGVmdCwgc1JlY3QudG9wLCAwLCBMT0NLX1JFQURPTkxZLCBQVUJMSUMpOworCQkJdW5zaWduZWQgY2hhciAqZGVzdEJ5dGVzID0gKHVuc2lnbmVkIGNoYXIqKWRlc3QtPmxvY2tJbnRlcm5hbChkUmVjdC5sZWZ0LCBkUmVjdC50b3AsIDAsIExPQ0tfUkVBRFdSSVRFLCBQVUJMSUMpOworCQkJdW5zaWduZWQgaW50IHNvdXJjZVBpdGNoID0gc291cmNlLT5nZXRJbnRlcm5hbFBpdGNoQigpOworCQkJdW5zaWduZWQgaW50IGRlc3RQaXRjaCA9IGRlc3QtPmdldEludGVybmFsUGl0Y2hCKCk7CisKKwkJCXVuc2lnbmVkIGludCB3aWR0aCA9IGRSZWN0LnJpZ2h0IC0gZFJlY3QubGVmdDsKKwkJCXVuc2lnbmVkIGludCBoZWlnaHQgPSBkUmVjdC5ib3R0b20gLSBkUmVjdC50b3A7CisJCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSB3aWR0aCAqIEltYWdlOjpieXRlcyhzb3VyY2UtPmdldEludGVybmFsRm9ybWF0KCkpOworCisJCQlmb3IodW5zaWduZWQgaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQl7CisJCQkJbWVtY3B5KGRlc3RCeXRlcywgc291cmNlQnl0ZXMsIGJ5dGVzKTsKKworCQkJCWlmKGFscGhhMHhGRikKKwkJCQl7CisJCQkJCWZvcih1bnNpZ25lZCBpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQl7CisJCQkJCQlkZXN0Qnl0ZXNbNCAqIHggKyAzXSA9IDB4RkY7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJc291cmNlQnl0ZXMgKz0gc291cmNlUGl0Y2g7CisJCQkJZGVzdEJ5dGVzICs9IGRlc3RQaXRjaDsKKwkJCX0KKworCQkJc291cmNlLT51bmxvY2tJbnRlcm5hbCgpOworCQkJZGVzdC0+dW5sb2NrSW50ZXJuYWwoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJsaXQoc291cmNlLCBzUmVjdCwgZGVzdCwgZFJlY3QsIHNjYWxpbmcgJiYgZmlsdGVyKTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCWJvb2wgRGV2aWNlOjp1cGRhdGVTdXJmYWNlKEltYWdlICpzb3VyY2VTdXJmYWNlLCBjb25zdCBzdzo6UmVjdCAqc291cmNlUmVjdCwgSW1hZ2UgKmRlc3RpbmF0aW9uU3VyZmFjZSwgY29uc3QgUE9JTlQgKmRlc3RQb2ludCkKKwl7CisJCVRSQUNFKCJJbWFnZSAqc291cmNlU3VyZmFjZSA9IDB4JTAuOHAsIGNvbnN0IHN3OjpSZWN0ICpzb3VyY2VSZWN0ID0gMHglMC44cCwgSW1hZ2UgKmRlc3RpbmF0aW9uU3VyZmFjZSA9IDB4JTAuOHAsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQgPSAweCUwLjhwIiwgc291cmNlU3VyZmFjZSwgc291cmNlUmVjdCwgZGVzdGluYXRpb25TdXJmYWNlLCBkZXN0UG9pbnQpOworCisJCWlmKCFzb3VyY2VTdXJmYWNlIHx8ICFkZXN0aW5hdGlvblN1cmZhY2UpCisJCXsKKwkJCUVSUigiSW52YWxpZCBwYXJhbWV0ZXJzIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlSZWN0IHNSZWN0OworCQlSZWN0IGRSZWN0OworCQkKKwkJaWYoc291cmNlUmVjdCkKKwkJeworCQkJc1JlY3QubGVmdCA9IHNvdXJjZVJlY3QtPmxlZnQ7CisJCQlzUmVjdC50b3AgPSBzb3VyY2VSZWN0LT50b3A7CisJCQlzUmVjdC5yaWdodCA9IHNvdXJjZVJlY3QtPnJpZ2h0OworCQkJc1JlY3QuYm90dG9tID0gc291cmNlUmVjdC0+Ym90dG9tOworCQl9CisJCWVsc2UKKwkJeworCQkJc1JlY3QubGVmdCA9IDA7CisJCQlzUmVjdC50b3AgPSAwOworCQkJc1JlY3QucmlnaHQgPSBzb3VyY2VTdXJmYWNlLT5nZXRXaWR0aCgpOworCQkJc1JlY3QuYm90dG9tID0gc291cmNlU3VyZmFjZS0+Z2V0SGVpZ2h0KCk7CisJCX0KKworCQlpZihkZXN0UG9pbnQpCisJCXsKKwkJCWRSZWN0LmxlZnQgPSBkZXN0UG9pbnQtPng7CisJCQlkUmVjdC50b3AgPSBkZXN0UG9pbnQtPnk7CisJCQlkUmVjdC5yaWdodCA9IGRlc3RQb2ludC0+eCArIHNSZWN0LnJpZ2h0IC0gc1JlY3QubGVmdDsKKwkJCWRSZWN0LmJvdHRvbSA9IGRlc3RQb2ludC0+eSArIHNSZWN0LmJvdHRvbSAtIHNSZWN0LnRvcDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRSZWN0LmxlZnQgPSAwOworCQkJZFJlY3QudG9wID0gMDsKKwkJCWRSZWN0LnJpZ2h0ID0gc1JlY3QucmlnaHQgLSBzUmVjdC5sZWZ0OworCQkJZFJlY3QuYm90dG9tID0gc1JlY3QuYm90dG9tIC0gc1JlY3QudG9wOworCQl9CisKKwkJaWYoIXZhbGlkUmVjdGFuZ2xlKCZzUmVjdCwgc291cmNlU3VyZmFjZSkgfHwgIXZhbGlkUmVjdGFuZ2xlKCZkUmVjdCwgZGVzdGluYXRpb25TdXJmYWNlKSkKKwkJeworCQkJRVJSKCJJbnZhbGlkIHBhcmFtZXRlcnMiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWludCBzV2lkdGggPSBzUmVjdC5yaWdodCAtIHNSZWN0LmxlZnQ7CisJCWludCBzSGVpZ2h0ID0gc1JlY3QuYm90dG9tIC0gc1JlY3QudG9wOworCisJCWludCBkV2lkdGggPSBkUmVjdC5yaWdodCAtIGRSZWN0LmxlZnQ7CisJCWludCBkSGVpZ2h0ID0gZFJlY3QuYm90dG9tIC0gZFJlY3QudG9wOworCisJCWlmKHNvdXJjZVN1cmZhY2UtPmdldE11bHRpU2FtcGxlRGVwdGgoKSA+IDEgfHwKKwkJICAgZGVzdGluYXRpb25TdXJmYWNlLT5nZXRNdWx0aVNhbXBsZURlcHRoKCkgPiAxIHx8CisJCSAgIHNvdXJjZVN1cmZhY2UtPmdldEludGVybmFsRm9ybWF0KCkgIT0gZGVzdGluYXRpb25TdXJmYWNlLT5nZXRJbnRlcm5hbEZvcm1hdCgpKQorCQl7CisJCQlFUlIoIkludmFsaWQgcGFyYW1ldGVycyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VCdWZmZXIgPSAodW5zaWduZWQgY2hhciopc291cmNlU3VyZmFjZS0+bG9jayhzUmVjdC5sZWZ0LCBzUmVjdC50b3AsIExPQ0tfUkVBRE9OTFkpOworCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvbkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKilkZXN0aW5hdGlvblN1cmZhY2UtPmxvY2soZFJlY3QubGVmdCwgZFJlY3QudG9wLCBMT0NLX1dSSVRFT05MWSk7CisKKwkJdW5zaWduZWQgaW50IHdpZHRoOworCQl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCQl1bnNpZ25lZCBpbnQgYnl0ZXM7CisKKwkJc3dpdGNoKHNvdXJjZVN1cmZhY2UtPmdldEludGVybmFsRm9ybWF0KCkpCisJCXsKKwkJI2lmIFMzVENfU1VQUE9SVAorCQljYXNlIEZPUk1BVF9EWFQxOgorCQljYXNlIEZPUk1BVF9BVEkxOgorCQkJd2lkdGggPSAoZFdpZHRoICsgMykgLyA0OworCQkJaGVpZ2h0ID0gKGRIZWlnaHQgKyAzKSAvIDQ7CisJCQlieXRlcyA9IHdpZHRoICogODsgICAvLyA2NCBiaXQgcGVyIDR4NCBibG9jaworCQkJYnJlYWs7CisJLy8JY2FzZSBGT1JNQVRfRFhUMjoKKwkJY2FzZSBGT1JNQVRfRFhUMzoKKwkvLwljYXNlIEZPUk1BVF9EWFQ0OgorCQljYXNlIEZPUk1BVF9EWFQ1OgorCQljYXNlIEZPUk1BVF9BVEkyOgorCQkJd2lkdGggPSAoZFdpZHRoICsgMykgLyA0OworCQkJaGVpZ2h0ID0gKGRIZWlnaHQgKyAzKSAvIDQ7CisJCQlieXRlcyA9IHdpZHRoICogMTY7ICAgLy8gMTI4IGJpdCBwZXIgNHg0IGJsb2NrCisJCQlicmVhazsKKwkJI2VuZGlmCisJCWRlZmF1bHQ6CisJCQl3aWR0aCA9IGRXaWR0aDsKKwkJCWhlaWdodCA9IGRIZWlnaHQ7CisJCQlieXRlcyA9IHdpZHRoICogSW1hZ2U6OmJ5dGVzKHNvdXJjZVN1cmZhY2UtPmdldEludGVybmFsRm9ybWF0KCkpOworCQl9CisKKwkJaW50IHNvdXJjZVBpdGNoID0gc291cmNlU3VyZmFjZS0+Z2V0UGl0Y2goKTsKKwkJaW50IGRlc3RpbmF0aW9uUGl0Y2ggPSBkZXN0aW5hdGlvblN1cmZhY2UtPmdldFBpdGNoKCk7CisKKwkJI2lmIFMzVENfU1VQUE9SVAorCQlpZihzb3VyY2VTdXJmYWNlLT5nZXRJbnRlcm5hbEZvcm1hdCgpID09IEZPUk1BVF9BVEkxIHx8IHNvdXJjZVN1cmZhY2UtPmdldEludGVybmFsRm9ybWF0KCkgPT0gRk9STUFUX0FUSTIpCisJCXsKKwkJCS8vIE1ha2UgdGhlIHBpdGNoIGNvcnJlc3BvbmQgdG8gNCByb3dzCisJCQlzb3VyY2VQaXRjaCAqPSA0OworCQkJZGVzdGluYXRpb25QaXRjaCAqPSA0OworCQl9CisJCSNlbmRpZgorCisJCWZvcih1bnNpZ25lZCBpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJeworCQkJbWVtY3B5KGRlc3RpbmF0aW9uQnVmZmVyLCBzb3VyY2VCdWZmZXIsIGJ5dGVzKTsKKwkJCQorCQkJc291cmNlQnVmZmVyICs9IHNvdXJjZVBpdGNoOworCQkJZGVzdGluYXRpb25CdWZmZXIgKz0gZGVzdGluYXRpb25QaXRjaDsKKwkJfQorCisJCXNvdXJjZVN1cmZhY2UtPnVubG9jaygpOworCQlkZXN0aW5hdGlvblN1cmZhY2UtPnVubG9jaygpOworCQkKKwkJcmV0dXJuIHRydWU7CisJfQorCisJYm9vbCBEZXZpY2U6OmJpbmRSZXNvdXJjZXMoKQorCXsKKwkJaWYoIWJpbmRWaWV3cG9ydCgpKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7ICAgLy8gWmVyby1hcmVhIHRhcmdldCByZWdpb24KKwkJfQorCisJCWJpbmRTaGFkZXJDb25zdGFudHMoKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl2b2lkIERldmljZTo6YmluZFNoYWRlckNvbnN0YW50cygpCisJeworCQlpZihwaXhlbFNoYWRlckRpcnR5KQorCQl7CisJCQlpZihwaXhlbFNoYWRlcikKKwkJCXsKKwkJCQlpZihwaXhlbFNoYWRlckNvbnN0YW50c0ZEaXJ0eSkKKwkJCQl7CisJCQkJCVJlbmRlcmVyOjpzZXRQaXhlbFNoYWRlckNvbnN0YW50RigwLCBwaXhlbFNoYWRlckNvbnN0YW50RlswXSwgcGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHkpOworCQkJCX0KKworCQkJCVJlbmRlcmVyOjpzZXRQaXhlbFNoYWRlcihwaXhlbFNoYWRlcik7ICAgLy8gTG9hZHMgc2hhZGVyIGNvbnN0YW50cyBzZXQgd2l0aCBERUYKKwkJCQlwaXhlbFNoYWRlckNvbnN0YW50c0ZEaXJ0eSA9IHBpeGVsU2hhZGVyLT5kaXJ0eUNvbnN0YW50c0Y7ICAgLy8gU2hhZGVyIERFRidlZCBjb25zdGFudHMgYXJlIGRpcnR5CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2V0UGl4ZWxTaGFkZXIoMCk7CisJCQl9CisKKwkJCXBpeGVsU2hhZGVyRGlydHkgPSBmYWxzZTsKKwkJfQorCisJCWlmKHZlcnRleFNoYWRlckRpcnR5KQorCQl7CisJCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCQl7CisJCQkJaWYodmVydGV4U2hhZGVyQ29uc3RhbnRzRkRpcnR5KQorCQkJCXsKKwkJCQkJUmVuZGVyZXI6OnNldFZlcnRleFNoYWRlckNvbnN0YW50RigwLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbMF0sIHZlcnRleFNoYWRlckNvbnN0YW50c0ZEaXJ0eSk7CisJCQkJfQorCQkKKwkJCQlSZW5kZXJlcjo6c2V0VmVydGV4U2hhZGVyKHZlcnRleFNoYWRlcik7ICAgLy8gTG9hZHMgc2hhZGVyIGNvbnN0YW50cyBzZXQgd2l0aCBERUYKKwkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudHNGRGlydHkgPSB2ZXJ0ZXhTaGFkZXItPmRpcnR5Q29uc3RhbnRzRjsgICAvLyBTaGFkZXIgREVGJ2VkIGNvbnN0YW50cyBhcmUgZGlydHkKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzZXRWZXJ0ZXhTaGFkZXIoMCk7CisJCQl9CisKKwkJCXZlcnRleFNoYWRlckRpcnR5ID0gZmFsc2U7CisJCX0KKwl9CisJCisJYm9vbCBEZXZpY2U6OmJpbmRWaWV3cG9ydCgpCisJeworCQlpZih2aWV3cG9ydC53aWR0aCA8PSAwIHx8IHZpZXdwb3J0LmhlaWdodCA8PSAwKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZihzY2lzc29yRW5hYmxlKQorCQl7CisJCQlSZWN0IHNjaXNzb3IgPSBzY2lzc29yUmVjdDsKKworCQkJbG9uZyB2aWV3cG9ydExlZnQgPSB2aWV3cG9ydC54OworCQkJbG9uZyB2aWV3cG9ydFJpZ2h0ID0gdmlld3BvcnQueCArIHZpZXdwb3J0LndpZHRoOworCQkJbG9uZyB2aWV3cG9ydFRvcCA9IHZpZXdwb3J0Lnk7CisJCQlsb25nIHZpZXdwb3J0Qm90dG9tID0gdmlld3BvcnQueSArIHZpZXdwb3J0LmhlaWdodDsKKworCQkJLy8gSW50ZXJzZWN0aW9uIG9mIHNjaXNzb3IgcmVjdGFuZ2xlIGFuZCB2aWV3cG9ydAorCQkJaWYodmlld3BvcnRMZWZ0ID4gc2Npc3Nvci5sZWZ0KSBzY2lzc29yLmxlZnQgPSB2aWV3cG9ydExlZnQ7CisJCQlpZih2aWV3cG9ydFRvcCA+IHNjaXNzb3IudG9wKSBzY2lzc29yLnRvcCA9IHZpZXdwb3J0VG9wOworCQkJaWYodmlld3BvcnRSaWdodCA8IHNjaXNzb3IucmlnaHQpIHNjaXNzb3IucmlnaHQgPSB2aWV3cG9ydFJpZ2h0OworCQkJaWYodmlld3BvcnRCb3R0b20gPCBzY2lzc29yLmJvdHRvbSkgc2Npc3Nvci5ib3R0b20gPSB2aWV3cG9ydEJvdHRvbTsKKworCQkJaWYoc2Npc3Nvci5sZWZ0ID09IHNjaXNzb3IucmlnaHQgfHwKKwkJCSAgIHNjaXNzb3IudG9wID09IHNjaXNzb3IuYm90dG9tKQorCQkJeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJLy8gRGltZW5zaW9ucyBvZiBzY2lzc29yIHJlY3RhbmdsZSByZWxhdGl2ZSB0byB2aWV3cG9ydAorCQkJZmxvYXQgcmVsYXRpdmVMZWZ0ID0gKGZsb2F0KShzY2lzc29yLmxlZnQgLSB2aWV3cG9ydExlZnQpIC8gdmlld3BvcnQud2lkdGg7CisJCQlmbG9hdCByZWxhdGl2ZVJpZ2h0ID0gKGZsb2F0KShzY2lzc29yLnJpZ2h0IC0gdmlld3BvcnRMZWZ0KSAvIHZpZXdwb3J0LndpZHRoOworCQkJZmxvYXQgcmVsYXRpdmVUb3AgPSAoZmxvYXQpKHNjaXNzb3IudG9wIC0gdmlld3BvcnRUb3ApIC8gdmlld3BvcnQuaGVpZ2h0OworCQkJZmxvYXQgcmVsYXRpdmVCb3R0b20gPSAoZmxvYXQpKHNjaXNzb3IuYm90dG9tIC0gdmlld3BvcnRUb3ApIC8gdmlld3BvcnQuaGVpZ2h0OworCisJCQkvLyBUcmFuc2Zvcm1hdGlvbiBvZiBjbGlwIHNwYWNlIGNvb3JkaW5hdGVzCisJCQlmbG9hdCBzWCA9IDEuMGYgLyAocmVsYXRpdmVSaWdodCAtIHJlbGF0aXZlTGVmdCk7ICAgLy8gU2NhbGUKKwkJCWZsb2F0IHRYID0gc1ggKiAoKDAuNWYgLSByZWxhdGl2ZUxlZnQpIC0gKHJlbGF0aXZlUmlnaHQgLSAwLjVmKSk7ICAgLy8gVHJhbnNsYXRlCisJCQlmbG9hdCBzWSA9IDEuMGYgLyAocmVsYXRpdmVCb3R0b20gLSByZWxhdGl2ZVRvcCk7ICAgLy8gU2NhbGUKKwkJCWZsb2F0IHRZID0gc1kgKiAoKDAuNWYgLSByZWxhdGl2ZVRvcCkgLSAocmVsYXRpdmVCb3R0b20gLSAwLjVmKSk7ICAgLy8gVHJhbnNsYXRlCisKKwkJCS8vIFNldCB0aGUgbmV3IHZpZXdwb3J0CisJCQlzdzo6Vmlld3BvcnQgdmlldzsKKworCQkJdmlldy5zZXRMZWZ0KChmbG9hdClzY2lzc29yLmxlZnQpOworCQkJdmlldy5zZXRUb3AoKGZsb2F0KXNjaXNzb3IudG9wKTsKKwkJCXZpZXcuc2V0V2lkdGgoKGZsb2F0KShzY2lzc29yLnJpZ2h0IC0gc2Npc3Nvci5sZWZ0KSk7CisJCQl2aWV3LnNldEhlaWdodCgoZmxvYXQpKHNjaXNzb3IuYm90dG9tIC0gc2Npc3Nvci50b3ApKTsKKworCQkJdmlldy5zZXROZWFyKHZpZXdwb3J0Lm1pblopOworCQkJdmlldy5zZXRGYXIodmlld3BvcnQubWF4Wik7CisKKwkJCVJlbmRlcmVyOjpzZXRWaWV3cG9ydCh2aWV3KTsKKwkJCXNldFBvc3RUcmFuc2Zvcm1FbmFibGUodHJ1ZSk7CisJCQlzZXRQb3NTY2FsZShzWCwgc1kpOworCQkJc2V0UG9zT2Zmc2V0KHRYLCAtdFkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gU2V0IHZpZXdwb3J0CisJCQlzdzo6Vmlld3BvcnQgdmlldzsKKworCQkJdmlldy5zZXRMZWZ0KChmbG9hdCl2aWV3cG9ydC54KTsKKwkJCXZpZXcuc2V0VG9wKChmbG9hdCl2aWV3cG9ydC55KTsKKwkJCXZpZXcuc2V0V2lkdGgoKGZsb2F0KXZpZXdwb3J0LndpZHRoKTsKKwkJCXZpZXcuc2V0SGVpZ2h0KChmbG9hdCl2aWV3cG9ydC5oZWlnaHQpOworCisJCQl2aWV3LnNldE5lYXIodmlld3BvcnQubWluWik7CisJCQl2aWV3LnNldEZhcih2aWV3cG9ydC5tYXhaKTsKKworCQkJUmVuZGVyZXI6OnNldFZpZXdwb3J0KHZpZXcpOworCQkJc2V0UG9zdFRyYW5zZm9ybUVuYWJsZShmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlib29sIERldmljZTo6dmFsaWRSZWN0YW5nbGUoY29uc3Qgc3c6OlJlY3QgKnJlY3QsIEltYWdlICpzdXJmYWNlKQorCXsKKwkJaWYoIXJlY3QpCisJCXsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJaWYocmVjdC0+cmlnaHQgPD0gcmVjdC0+bGVmdCB8fCByZWN0LT5ib3R0b20gPD0gcmVjdC0+dG9wKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZihyZWN0LT5sZWZ0IDwgMCB8fCByZWN0LT50b3AgPCAwKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZihyZWN0LT5yaWdodCA+IChpbnQpc3VyZmFjZS0+Z2V0V2lkdGgoKSB8fCByZWN0LT5ib3R0b20gPiAoaW50KXN1cmZhY2UtPmdldEhlaWdodCgpKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl2b2lkIERldmljZTo6ZmluaXNoKCkKKwl7CisJCWlmKHJlbmRlclRhcmdldCkKKwkJeworCQkJcmVuZGVyVGFyZ2V0LT5sb2NrKDAsIDAsIHN3OjpMT0NLX1JFQURXUklURSk7CisJCQlyZW5kZXJUYXJnZXQtPnVubG9jaygpOworCQl9CisJfQorfQorCitleHRlcm4gIkMiCit7CisJZ2w6OkRldmljZSAqY3JlYXRlRGV2aWNlKCkKKwl7CisJCXN3OjpDb250ZXh0ICpjb250ZXh0ID0gbmV3IHN3OjpDb250ZXh0KCk7CisKKwkJaWYoY29udGV4dCkKKwkJeworCQkJcmV0dXJuIG5ldyBnbDo6RGV2aWNlKGNvbnRleHQpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9EZXZpY2UuaHBwIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0RldmljZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzOTQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9EZXZpY2UuaHBwCkBAIC0wLDAgKzEsMTEzIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZiBkeF9EZXZpY2VfaHBwDQorI2RlZmluZSBkeF9EZXZpY2VfaHBwDQorDQorI2luY2x1ZGUgIlVua25vd24uaHBwIg0KKyNpbmNsdWRlICJSZW5kZXJlci9SZW5kZXJlci5ocHAiDQorDQorbmFtZXNwYWNlIGdsDQorew0KKwljbGFzcyBUZXh0dXJlOw0KK30NCisNCituYW1lc3BhY2UgZ2wNCit7DQorCWNsYXNzIEltYWdlOw0KKw0KKwllbnVtIFByaW1pdGl2ZVR5cGUNCisJew0KKwkJRFJBV19QT0lOVExJU1QsDQorCQlEUkFXX0xJTkVMSVNULA0KKwkJRFJBV19MSU5FU1RSSVAsDQorCQlEUkFXX0xJTkVMT09QLA0KKwkJRFJBV19UUklBTkdMRUxJU1QsDQorCQlEUkFXX1RSSUFOR0xFU1RSSVAsDQorCQlEUkFXX1RSSUFOR0xFRkFODQorCX07DQorDQorCXN0cnVjdCBWaWV3cG9ydA0KKwl7DQorCQl1bnNpZ25lZCBpbnQgeDsNCisJCXVuc2lnbmVkIGludCB5Ow0KKwkJdW5zaWduZWQgaW50IHdpZHRoOw0KKwkJdW5zaWduZWQgaW50IGhlaWdodDsNCisJCWZsb2F0IG1pblo7DQorCQlmbG9hdCBtYXhaOw0KKwl9Ow0KKw0KKwljbGFzcyBEZXZpY2UgOiBwdWJsaWMgVW5rbm93biwgcHVibGljIHN3OjpSZW5kZXJlcg0KKwl7DQorCXB1YmxpYzoNCisJCWV4cGxpY2l0IERldmljZShzdzo6Q29udGV4dCAqY29udGV4dCk7DQorDQorCQl2aXJ0dWFsIH5EZXZpY2UoKTsNCisNCisJCXZpcnR1YWwgdm9pZCBjbGVhckNvbG9yKHVuc2lnbmVkIGludCBjb2xvciwgdW5zaWduZWQgaW50IHJnYmFNYXNrKTsNCisJCXZpcnR1YWwgdm9pZCBjbGVhckRlcHRoKGZsb2F0IHopOw0KKwkJdmlydHVhbCB2b2lkIGNsZWFyU3RlbmNpbCh1bnNpZ25lZCBpbnQgc3RlbmNpbCwgdW5zaWduZWQgaW50IG1hc2spOw0KKwkJdmlydHVhbCBJbWFnZSAqY3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHN3OjpGb3JtYXQgZm9ybWF0LCBpbnQgbXVsdGlTYW1wbGVEZXB0aCwgYm9vbCBkaXNjYXJkKTsNCisJCXZpcnR1YWwgSW1hZ2UgKmNyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHN3OjpGb3JtYXQgZm9ybWF0KTsNCisJCXZpcnR1YWwgSW1hZ2UgKmNyZWF0ZVJlbmRlclRhcmdldCh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHN3OjpGb3JtYXQgZm9ybWF0LCBpbnQgbXVsdGlTYW1wbGVEZXB0aCwgYm9vbCBsb2NrYWJsZSk7DQorCQl2aXJ0dWFsIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmUoUHJpbWl0aXZlVHlwZSB0eXBlLCB1bnNpZ25lZCBpbnQgaW5kZXhPZmZzZXQsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgaW50IGluZGV4U2l6ZSk7DQorCQl2aXJ0dWFsIHZvaWQgZHJhd1ByaW1pdGl2ZShQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBwcmltaXZlQ291bnQpOw0KKwkJdmlydHVhbCBJbWFnZSAqZ2V0RGVwdGhTdGVuY2lsU3VyZmFjZSgpOw0KKwkJdmlydHVhbCBib29sIGdldFJlbmRlclRhcmdldERhdGEoSW1hZ2UgKnJlbmRlclRhcmdldCwgSW1hZ2UgKmRlc3RTdXJmYWNlKTsNCisJCXZpcnR1YWwgdm9pZCBzZXREZXB0aFN0ZW5jaWxTdXJmYWNlKEltYWdlICpuZXdEZXB0aFN0ZW5jaWwpOw0KKwkJdmlydHVhbCB2b2lkIHNldFBpeGVsU2hhZGVyKHN3OjpQaXhlbFNoYWRlciAqc2hhZGVyKTsNCisJCXZpcnR1YWwgdm9pZCBzZXRQaXhlbFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsNCisJCXZpcnR1YWwgdm9pZCBzZXRTY2lzc29yRW5hYmxlKGJvb2wgZW5hYmxlKTsNCisJCXZpcnR1YWwgdm9pZCBzZXRSZW5kZXJUYXJnZXQoSW1hZ2UgKnJlbmRlclRhcmdldCk7DQorCQl2aXJ0dWFsIHZvaWQgc2V0U2Npc3NvclJlY3QoY29uc3Qgc3c6OlJlY3QgJnJlY3QpOw0KKwkJdmlydHVhbCB2b2lkIHNldFZlcnRleFNoYWRlcihzdzo6VmVydGV4U2hhZGVyICpzaGFkZXIpOw0KKwkJdmlydHVhbCB2b2lkIHNldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsNCisJCXZpcnR1YWwgdm9pZCBzZXRWaWV3cG9ydChjb25zdCBWaWV3cG9ydCAmdmlld3BvcnQpOw0KKw0KKwkJdmlydHVhbCBib29sIHN0cmV0Y2hSZWN0KEltYWdlICpzb3VyY2VTdXJmYWNlLCBjb25zdCBzdzo6UmVjdCAqc291cmNlUmVjdCwgSW1hZ2UgKmRlc3RTdXJmYWNlLCBjb25zdCBzdzo6UmVjdCAqZGVzdFJlY3QsIGJvb2wgZmlsdGVyKTsNCisJCXZpcnR1YWwgYm9vbCB1cGRhdGVTdXJmYWNlKEltYWdlICpzb3VyY2VTdXJmYWNlLCBjb25zdCBzdzo6UmVjdCAqc291cmNlUmVjdCwgSW1hZ2UgKmRlc3RpbmF0aW9uU3VyZmFjZSwgY29uc3QgUE9JTlQgKmRlc3RQb2ludCk7DQorCQl2aXJ0dWFsIHZvaWQgZmluaXNoKCk7DQorDQorCXByaXZhdGU6DQorCQlzdzo6Q29udGV4dCAqY29uc3QgY29udGV4dDsNCisNCisJCWJvb2wgYmluZFJlc291cmNlcygpOw0KKwkJdm9pZCBiaW5kU2hhZGVyQ29uc3RhbnRzKCk7DQorCQlib29sIGJpbmRWaWV3cG9ydCgpOyAgIC8vIEFsc28gYWRqdXN0cyBmb3Igc2Npc3NvcmluZw0KKw0KKwkJYm9vbCB2YWxpZFJlY3RhbmdsZShjb25zdCBzdzo6UmVjdCAqcmVjdCwgSW1hZ2UgKnN1cmZhY2UpOw0KKw0KKwkJVmlld3BvcnQgdmlld3BvcnQ7DQorCQlzdzo6UmVjdCBzY2lzc29yUmVjdDsNCisJCWJvb2wgc2Npc3NvckVuYWJsZTsNCisNCisJCXN3OjpQaXhlbFNoYWRlciAqcGl4ZWxTaGFkZXI7DQorCQlzdzo6VmVydGV4U2hhZGVyICp2ZXJ0ZXhTaGFkZXI7DQorDQorCQlib29sIHBpeGVsU2hhZGVyRGlydHk7DQorCQlpbnQgcGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHk7DQorCQlib29sIHZlcnRleFNoYWRlckRpcnR5Ow0KKwkJaW50IHZlcnRleFNoYWRlckNvbnN0YW50c0ZEaXJ0eTsNCisNCisJCWZsb2F0IHBpeGVsU2hhZGVyQ29uc3RhbnRGWzIyNF1bNF07DQorCQlmbG9hdCB2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbMjU2XVs0XTsNCisNCisJCUltYWdlICpyZW5kZXJUYXJnZXQ7DQorCQlJbWFnZSAqZGVwdGhTdGVuY2lsOw0KKwl9Ow0KK30NCisNCitleHRlcm4gIkMiDQorew0KKwlnbDo6RGV2aWNlICpjcmVhdGVEZXZpY2UoKTsNCit9DQorDQorI2VuZGlmICAgLy8gZHhfRGV2aWNlX2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9GZW5jZS5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvRmVuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODk0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvRmVuY2UuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBGZW5jZS5jcHA6IEltcGxlbWVudHMgdGhlIEZlbmNlIGNsYXNzLCB3aGljaCBzdXBwb3J0cyB0aGUgR0xfTlZfZmVuY2UgZXh0ZW5zaW9uLgorCisjaW5jbHVkZSAiRmVuY2UuaCIKKworI2luY2x1ZGUgIm1haW4uaCIKKworbmFtZXNwYWNlIGdsCit7CisKK0ZlbmNlOjpGZW5jZSgpCit7IAorICAgIG1RdWVyeSA9IGZhbHNlOworICAgIG1Db25kaXRpb24gPSBHTF9OT05FOworICAgIG1TdGF0dXMgPSBHTF9GQUxTRTsKK30KKworRmVuY2U6On5GZW5jZSgpCit7CisgICAgbVF1ZXJ5ID0gZmFsc2U7Cit9CisKK0dMYm9vbGVhbiBGZW5jZTo6aXNGZW5jZSgpCit7CisgICAgLy8gR0xfTlZfZmVuY2Ugc3BlYzoKKyAgICAvLyBBIG5hbWUgcmV0dXJuZWQgYnkgR2VuRmVuY2VzTlYsIGJ1dCBub3QgeWV0IHNldCB2aWEgU2V0RmVuY2VOViwgaXMgbm90IHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGZlbmNlLgorICAgIHJldHVybiBtUXVlcnk7Cit9CisKK3ZvaWQgRmVuY2U6OnNldEZlbmNlKEdMZW51bSBjb25kaXRpb24pCit7CisgICAgbVF1ZXJ5ID0gdHJ1ZTsKKyAgICBtQ29uZGl0aW9uID0gY29uZGl0aW9uOworICAgIG1TdGF0dXMgPSBHTF9GQUxTRTsKK30KKworR0xib29sZWFuIEZlbmNlOjp0ZXN0RmVuY2UoKQoreworICAgIGlmKCFtUXVlcnkpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04sIEdMX1RSVUUpOworICAgIH0KKworCVVOSU1QTEVNRU5URUQoKTsKKyAgICBtU3RhdHVzID0gR0xfVFJVRTsKKworICAgIHJldHVybiBtU3RhdHVzOworfQorCit2b2lkIEZlbmNlOjpmaW5pc2hGZW5jZSgpCit7CisgICAgaWYoIW1RdWVyeSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgfQorCisgICAgd2hpbGUoIXRlc3RGZW5jZSgpKQorICAgIHsKKyAgICAgICAgU2xlZXAoMCk7CisgICAgfQorfQorCit2b2lkIEZlbmNlOjpnZXRGZW5jZWl2KEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK3sKKyAgICBpZighbVF1ZXJ5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBuYW1lKQorICAgIHsKKyAgICBjYXNlIEdMX0ZFTkNFX1NUQVRVU19OVjoKKwkJeworCQkJLy8gR0xfTlZfZmVuY2Ugc3BlYzoKKwkJCS8vIE9uY2UgdGhlIHN0YXR1cyBvZiBhIGZlbmNlIGhhcyBiZWVuIGZpbmlzaGVkICh2aWEgRmluaXNoRmVuY2VOVikgb3IgdGVzdGVkIGFuZCB0aGUgcmV0dXJuZWQgc3RhdHVzIGlzIFRSVUUgKHZpYSBlaXRoZXIgVGVzdEZlbmNlTlYKKwkJCS8vIG9yIEdldEZlbmNlaXZOViBxdWVyeWluZyB0aGUgRkVOQ0VfU1RBVFVTX05WKSwgdGhlIHN0YXR1cyByZW1haW5zIFRSVUUgdW50aWwgdGhlIG5leHQgU2V0RmVuY2VOViBvZiB0aGUgZmVuY2UuCisJCQlpZihtU3RhdHVzKQorCQkJeworCQkJCXBhcmFtc1swXSA9IEdMX1RSVUU7CisJCQkJcmV0dXJuOworCQkJfQorICAgICAgICAgICAgCisJCQltU3RhdHVzID0gdGVzdEZlbmNlKCk7CisKKwkJCXBhcmFtc1swXSA9IG1TdGF0dXM7ICAgICAgICAgICAgCisJCQlicmVhazsKKwkJfQorICAgIGNhc2UgR0xfRkVOQ0VfQ09ORElUSU9OX05WOgorICAgICAgICBwYXJhbXNbMF0gPSBtQ29uZGl0aW9uOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvRmVuY2UuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9GZW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YzBkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvRmVuY2UuaApAQCAtMCwwICsxLDQyIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBGZW5jZS5oOiBEZWZpbmVzIHRoZSBGZW5jZSBjbGFzcywgd2hpY2ggc3VwcG9ydHMgdGhlIEdMX05WX2ZlbmNlIGV4dGVuc2lvbi4KKworI2lmbmRlZiBMSUJHTEVTVjJfRkVOQ0VfSF8KKyNkZWZpbmUgTElCR0xFU1YyX0ZFTkNFX0hfCisKKyNpbmNsdWRlICJjb21tb24vYW5nbGV1dGlscy5oIgorCisjZGVmaW5lIEdMX0FQSUNBTEwKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworbmFtZXNwYWNlIGdsCit7CisKK2NsYXNzIEZlbmNlCit7CisgIHB1YmxpYzoKKyAgICBGZW5jZSgpOworICAgIHZpcnR1YWwgfkZlbmNlKCk7CisKKyAgICBHTGJvb2xlYW4gaXNGZW5jZSgpOworICAgIHZvaWQgc2V0RmVuY2UoR0xlbnVtIGNvbmRpdGlvbik7CisgICAgR0xib29sZWFuIHRlc3RGZW5jZSgpOworICAgIHZvaWQgZmluaXNoRmVuY2UoKTsKKyAgICB2b2lkIGdldEZlbmNlaXYoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKworICBwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGZW5jZSk7CisKKyAgICBib29sIG1RdWVyeTsKKyAgICBHTGVudW0gbUNvbmRpdGlvbjsKKyAgICBHTGJvb2xlYW4gbVN0YXR1czsKK307CisKK30KKworI2VuZGlmICAgLy8gTElCR0xFU1YyX0ZFTkNFX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvRnJhbWVidWZmZXIuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0ZyYW1lYnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2VlMGZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0ZyYW1lYnVmZmVyLmNwcApAQCAtMCwwICsxLDQ0OCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gRnJhbWVidWZmZXIuY3BwOiBJbXBsZW1lbnRzIHRoZSBGcmFtZWJ1ZmZlciBjbGFzcy4gSW1wbGVtZW50cyBHTCBmcmFtZWJ1ZmZlcgorLy8gb2JqZWN0cyBhbmQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LiBbT3BlbkdMIEVTIDIuMC4yNF0gc2VjdGlvbiA0LjQgcGFnZSAxMDUuCisKKyNpbmNsdWRlICJGcmFtZWJ1ZmZlci5oIgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIlJlbmRlcmJ1ZmZlci5oIgorI2luY2x1ZGUgIlRleHR1cmUuaCIKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKworbmFtZXNwYWNlIGdsCit7CisKK0ZyYW1lYnVmZmVyOjpGcmFtZWJ1ZmZlcigpCit7CisgICAgbUNvbG9yYnVmZmVyVHlwZSA9IEdMX05PTkU7CisgICAgbURlcHRoYnVmZmVyVHlwZSA9IEdMX05PTkU7CisgICAgbVN0ZW5jaWxidWZmZXJUeXBlID0gR0xfTk9ORTsKK30KKworRnJhbWVidWZmZXI6On5GcmFtZWJ1ZmZlcigpCit7CisgICAgbUNvbG9yYnVmZmVyUG9pbnRlci5zZXQoTlVMTCk7CisgICAgbURlcHRoYnVmZmVyUG9pbnRlci5zZXQoTlVMTCk7CisgICAgbVN0ZW5jaWxidWZmZXJQb2ludGVyLnNldChOVUxMKTsKK30KKworUmVuZGVyYnVmZmVyICpGcmFtZWJ1ZmZlcjo6bG9va3VwUmVuZGVyYnVmZmVyKEdMZW51bSB0eXBlLCBHTHVpbnQgaGFuZGxlKSBjb25zdAoreworICAgIENvbnRleHQgKmNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgUmVuZGVyYnVmZmVyICpidWZmZXIgPSBOVUxMOworCisgICAgaWYodHlwZSA9PSBHTF9OT05FKQorICAgIHsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09IEdMX1JFTkRFUkJVRkZFUikKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IGNvbnRleHQtPmdldFJlbmRlcmJ1ZmZlcihoYW5kbGUpOworICAgIH0KKyAgICBlbHNlIGlmKElzVGV4dHVyZVRhcmdldCh0eXBlKSkKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IGNvbnRleHQtPmdldFRleHR1cmUoaGFuZGxlKS0+Z2V0UmVuZGVyYnVmZmVyKHR5cGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBVTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIHJldHVybiBidWZmZXI7Cit9CisKK3ZvaWQgRnJhbWVidWZmZXI6OnNldENvbG9yYnVmZmVyKEdMZW51bSB0eXBlLCBHTHVpbnQgY29sb3JidWZmZXIpCit7CisgICAgbUNvbG9yYnVmZmVyVHlwZSA9IChjb2xvcmJ1ZmZlciAhPSAwKSA/IHR5cGUgOiBHTF9OT05FOworICAgIG1Db2xvcmJ1ZmZlclBvaW50ZXIuc2V0KGxvb2t1cFJlbmRlcmJ1ZmZlcih0eXBlLCBjb2xvcmJ1ZmZlcikpOworfQorCit2b2lkIEZyYW1lYnVmZmVyOjpzZXREZXB0aGJ1ZmZlcihHTGVudW0gdHlwZSwgR0x1aW50IGRlcHRoYnVmZmVyKQoreworICAgIG1EZXB0aGJ1ZmZlclR5cGUgPSAoZGVwdGhidWZmZXIgIT0gMCkgPyB0eXBlIDogR0xfTk9ORTsKKyAgICBtRGVwdGhidWZmZXJQb2ludGVyLnNldChsb29rdXBSZW5kZXJidWZmZXIodHlwZSwgZGVwdGhidWZmZXIpKTsKK30KKwordm9pZCBGcmFtZWJ1ZmZlcjo6c2V0U3RlbmNpbGJ1ZmZlcihHTGVudW0gdHlwZSwgR0x1aW50IHN0ZW5jaWxidWZmZXIpCit7CisgICAgbVN0ZW5jaWxidWZmZXJUeXBlID0gKHN0ZW5jaWxidWZmZXIgIT0gMCkgPyB0eXBlIDogR0xfTk9ORTsKKyAgICBtU3RlbmNpbGJ1ZmZlclBvaW50ZXIuc2V0KGxvb2t1cFJlbmRlcmJ1ZmZlcih0eXBlLCBzdGVuY2lsYnVmZmVyKSk7Cit9CisKK3ZvaWQgRnJhbWVidWZmZXI6OmRldGFjaFRleHR1cmUoR0x1aW50IHRleHR1cmUpCit7CisgICAgaWYobUNvbG9yYnVmZmVyUG9pbnRlci5pZCgpID09IHRleHR1cmUgJiYgSXNUZXh0dXJlVGFyZ2V0KG1Db2xvcmJ1ZmZlclR5cGUpKQorICAgIHsKKyAgICAgICAgbUNvbG9yYnVmZmVyVHlwZSA9IEdMX05PTkU7CisgICAgICAgIG1Db2xvcmJ1ZmZlclBvaW50ZXIuc2V0KE5VTEwpOworICAgIH0KKworICAgIGlmKG1EZXB0aGJ1ZmZlclBvaW50ZXIuaWQoKSA9PSB0ZXh0dXJlICYmIElzVGV4dHVyZVRhcmdldChtRGVwdGhidWZmZXJUeXBlKSkKKyAgICB7CisgICAgICAgIG1EZXB0aGJ1ZmZlclR5cGUgPSBHTF9OT05FOworICAgICAgICBtRGVwdGhidWZmZXJQb2ludGVyLnNldChOVUxMKTsKKyAgICB9CisKKyAgICBpZihtU3RlbmNpbGJ1ZmZlclBvaW50ZXIuaWQoKSA9PSB0ZXh0dXJlICYmIElzVGV4dHVyZVRhcmdldChtU3RlbmNpbGJ1ZmZlclR5cGUpKQorICAgIHsKKyAgICAgICAgbVN0ZW5jaWxidWZmZXJUeXBlID0gR0xfTk9ORTsKKyAgICAgICAgbVN0ZW5jaWxidWZmZXJQb2ludGVyLnNldChOVUxMKTsKKyAgICB9Cit9CisKK3ZvaWQgRnJhbWVidWZmZXI6OmRldGFjaFJlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKQoreworICAgIGlmKG1Db2xvcmJ1ZmZlclBvaW50ZXIuaWQoKSA9PSByZW5kZXJidWZmZXIgJiYgbUNvbG9yYnVmZmVyVHlwZSA9PSBHTF9SRU5ERVJCVUZGRVIpCisgICAgeworICAgICAgICBtQ29sb3JidWZmZXJUeXBlID0gR0xfTk9ORTsKKyAgICAgICAgbUNvbG9yYnVmZmVyUG9pbnRlci5zZXQoTlVMTCk7CisgICAgfQorCisgICAgaWYobURlcHRoYnVmZmVyUG9pbnRlci5pZCgpID09IHJlbmRlcmJ1ZmZlciAmJiBtRGVwdGhidWZmZXJUeXBlID09IEdMX1JFTkRFUkJVRkZFUikKKyAgICB7CisgICAgICAgIG1EZXB0aGJ1ZmZlclR5cGUgPSBHTF9OT05FOworICAgICAgICBtRGVwdGhidWZmZXJQb2ludGVyLnNldChOVUxMKTsKKyAgICB9CisKKyAgICBpZihtU3RlbmNpbGJ1ZmZlclBvaW50ZXIuaWQoKSA9PSByZW5kZXJidWZmZXIgJiYgbVN0ZW5jaWxidWZmZXJUeXBlID09IEdMX1JFTkRFUkJVRkZFUikKKyAgICB7CisgICAgICAgIG1TdGVuY2lsYnVmZmVyVHlwZSA9IEdMX05PTkU7CisgICAgICAgIG1TdGVuY2lsYnVmZmVyUG9pbnRlci5zZXQoTlVMTCk7CisgICAgfQorfQorCit1bnNpZ25lZCBpbnQgRnJhbWVidWZmZXI6OmdldFJlbmRlclRhcmdldFNlcmlhbCgpCit7CisgICAgUmVuZGVyYnVmZmVyICpjb2xvcmJ1ZmZlciA9IG1Db2xvcmJ1ZmZlclBvaW50ZXIuZ2V0KCk7CisKKyAgICBpZihjb2xvcmJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBjb2xvcmJ1ZmZlci0+Z2V0U2VyaWFsKCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0ltYWdlICpGcmFtZWJ1ZmZlcjo6Z2V0UmVuZGVyVGFyZ2V0KCkKK3sKKyAgICBSZW5kZXJidWZmZXIgKmNvbG9yYnVmZmVyID0gbUNvbG9yYnVmZmVyUG9pbnRlci5nZXQoKTsKKworICAgIGlmKGNvbG9yYnVmZmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbG9yYnVmZmVyLT5nZXRSZW5kZXJUYXJnZXQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworSW1hZ2UgKkZyYW1lYnVmZmVyOjpnZXREZXB0aFN0ZW5jaWwoKQoreworICAgIFJlbmRlcmJ1ZmZlciAqZGVwdGhzdGVuY2lsYnVmZmVyID0gbURlcHRoYnVmZmVyUG9pbnRlci5nZXQoKTsKKyAgICAKKyAgICBpZighZGVwdGhzdGVuY2lsYnVmZmVyKQorICAgIHsKKyAgICAgICAgZGVwdGhzdGVuY2lsYnVmZmVyID0gbVN0ZW5jaWxidWZmZXJQb2ludGVyLmdldCgpOworICAgIH0KKworICAgIGlmKGRlcHRoc3RlbmNpbGJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBkZXB0aHN0ZW5jaWxidWZmZXItPmdldERlcHRoU3RlbmNpbCgpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit1bnNpZ25lZCBpbnQgRnJhbWVidWZmZXI6OmdldERlcHRoYnVmZmVyU2VyaWFsKCkKK3sKKyAgICBSZW5kZXJidWZmZXIgKmRlcHRoYnVmZmVyID0gbURlcHRoYnVmZmVyUG9pbnRlci5nZXQoKTsKKworICAgIGlmKGRlcHRoYnVmZmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlcHRoYnVmZmVyLT5nZXRTZXJpYWwoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IEZyYW1lYnVmZmVyOjpnZXRTdGVuY2lsYnVmZmVyU2VyaWFsKCkKK3sKKyAgICBSZW5kZXJidWZmZXIgKnN0ZW5jaWxidWZmZXIgPSBtU3RlbmNpbGJ1ZmZlclBvaW50ZXIuZ2V0KCk7CisKKyAgICBpZihzdGVuY2lsYnVmZmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0ZW5jaWxidWZmZXItPmdldFNlcmlhbCgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitDb2xvcmJ1ZmZlciAqRnJhbWVidWZmZXI6OmdldENvbG9yYnVmZmVyKCkKK3sKKyAgICBSZW5kZXJidWZmZXIgKnJiID0gbUNvbG9yYnVmZmVyUG9pbnRlci5nZXQoKTsKKworICAgIGlmKHJiICE9IE5VTEwgJiYgcmItPmlzQ29sb3JidWZmZXIoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb2xvcmJ1ZmZlcio+KHJiLT5nZXRTdG9yYWdlKCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK0RlcHRoU3RlbmNpbGJ1ZmZlciAqRnJhbWVidWZmZXI6OmdldERlcHRoYnVmZmVyKCkKK3sKKyAgICBSZW5kZXJidWZmZXIgKnJiID0gbURlcHRoYnVmZmVyUG9pbnRlci5nZXQoKTsKKworICAgIGlmKHJiICE9IE5VTEwgJiYgcmItPmlzRGVwdGhidWZmZXIoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXB0aFN0ZW5jaWxidWZmZXIqPihyYi0+Z2V0U3RvcmFnZSgpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitEZXB0aFN0ZW5jaWxidWZmZXIgKkZyYW1lYnVmZmVyOjpnZXRTdGVuY2lsYnVmZmVyKCkKK3sKKyAgICBSZW5kZXJidWZmZXIgKnJiID0gbVN0ZW5jaWxidWZmZXJQb2ludGVyLmdldCgpOworCisgICAgaWYocmIgIT0gTlVMTCAmJiByYi0+aXNTdGVuY2lsYnVmZmVyKCkpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVwdGhTdGVuY2lsYnVmZmVyKj4ocmItPmdldFN0b3JhZ2UoKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworR0xlbnVtIEZyYW1lYnVmZmVyOjpnZXRDb2xvcmJ1ZmZlclR5cGUoKQoreworICAgIHJldHVybiBtQ29sb3JidWZmZXJUeXBlOworfQorCitHTGVudW0gRnJhbWVidWZmZXI6OmdldERlcHRoYnVmZmVyVHlwZSgpCit7CisgICAgcmV0dXJuIG1EZXB0aGJ1ZmZlclR5cGU7Cit9CisKK0dMZW51bSBGcmFtZWJ1ZmZlcjo6Z2V0U3RlbmNpbGJ1ZmZlclR5cGUoKQoreworICAgIHJldHVybiBtU3RlbmNpbGJ1ZmZlclR5cGU7Cit9CisKK0dMdWludCBGcmFtZWJ1ZmZlcjo6Z2V0Q29sb3JidWZmZXJIYW5kbGUoKQoreworICAgIHJldHVybiBtQ29sb3JidWZmZXJQb2ludGVyLmlkKCk7Cit9CisKK0dMdWludCBGcmFtZWJ1ZmZlcjo6Z2V0RGVwdGhidWZmZXJIYW5kbGUoKQoreworICAgIHJldHVybiBtRGVwdGhidWZmZXJQb2ludGVyLmlkKCk7Cit9CisKK0dMdWludCBGcmFtZWJ1ZmZlcjo6Z2V0U3RlbmNpbGJ1ZmZlckhhbmRsZSgpCit7CisgICAgcmV0dXJuIG1TdGVuY2lsYnVmZmVyUG9pbnRlci5pZCgpOworfQorCitib29sIEZyYW1lYnVmZmVyOjpoYXNTdGVuY2lsKCkKK3sKKyAgICBpZihtU3RlbmNpbGJ1ZmZlclR5cGUgIT0gR0xfTk9ORSkKKyAgICB7CisgICAgICAgIERlcHRoU3RlbmNpbGJ1ZmZlciAqc3RlbmNpbGJ1ZmZlck9iamVjdCA9IGdldFN0ZW5jaWxidWZmZXIoKTsKKworICAgICAgICBpZihzdGVuY2lsYnVmZmVyT2JqZWN0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RlbmNpbGJ1ZmZlck9iamVjdC0+Z2V0U3RlbmNpbFNpemUoKSA+IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0dMZW51bSBGcmFtZWJ1ZmZlcjo6Y29tcGxldGVuZXNzKCkKK3sKKyAgICBpbnQgd2lkdGggPSAwOworICAgIGludCBoZWlnaHQgPSAwOworICAgIGludCBzYW1wbGVzID0gLTE7CisKKyAgICBpZihtQ29sb3JidWZmZXJUeXBlICE9IEdMX05PTkUpCisgICAgeworICAgICAgICBDb2xvcmJ1ZmZlciAqY29sb3JidWZmZXIgPSBnZXRDb2xvcmJ1ZmZlcigpOworCisgICAgICAgIGlmKCFjb2xvcmJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGNvbG9yYnVmZmVyLT5nZXRXaWR0aCgpID09IDAgfHwgY29sb3JidWZmZXItPmdldEhlaWdodCgpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ7CisgICAgICAgIH0KKworICAgICAgICBpZihtQ29sb3JidWZmZXJUeXBlID09IEdMX1JFTkRFUkJVRkZFUikKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIUlzQ29sb3JSZW5kZXJhYmxlKGNvbG9yYnVmZmVyLT5nZXRGb3JtYXQoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKElzVGV4dHVyZVRhcmdldChtQ29sb3JidWZmZXJUeXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoSXNDb21wcmVzc2VkKGNvbG9yYnVmZmVyLT5nZXRGb3JtYXQoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihjb2xvcmJ1ZmZlci0+Z2V0Rm9ybWF0KCkgPT0gR0xfTFVNSU5BTkNFIHx8IGNvbG9yYnVmZmVyLT5nZXRGb3JtYXQoKSA9PSBHTF9MVU1JTkFOQ0VfQUxQSEEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKworICAgICAgICB3aWR0aCA9IGNvbG9yYnVmZmVyLT5nZXRXaWR0aCgpOworICAgICAgICBoZWlnaHQgPSBjb2xvcmJ1ZmZlci0+Z2V0SGVpZ2h0KCk7CisgICAgICAgIHNhbXBsZXMgPSBjb2xvcmJ1ZmZlci0+Z2V0U2FtcGxlcygpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ7CisgICAgfQorCisgICAgRGVwdGhTdGVuY2lsYnVmZmVyICpkZXB0aGJ1ZmZlciA9IE5VTEw7CisgICAgRGVwdGhTdGVuY2lsYnVmZmVyICpzdGVuY2lsYnVmZmVyID0gTlVMTDsKKworICAgIGlmKG1EZXB0aGJ1ZmZlclR5cGUgIT0gR0xfTk9ORSkKKyAgICB7CisgICAgICAgIGlmKG1EZXB0aGJ1ZmZlclR5cGUgIT0gR0xfUkVOREVSQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQ7ICAgLy8gUmVxdWlyZXMgR0xfT0VTX2RlcHRoX3RleHR1cmUKKyAgICAgICAgfQorCisgICAgICAgIGRlcHRoYnVmZmVyID0gZ2V0RGVwdGhidWZmZXIoKTsKKworICAgICAgICBpZighZGVwdGhidWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ7CisgICAgICAgIH0KKworICAgICAgICBpZihkZXB0aGJ1ZmZlci0+Z2V0V2lkdGgoKSA9PSAwIHx8IGRlcHRoYnVmZmVyLT5nZXRIZWlnaHQoKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOworICAgICAgICB9CisKKyAgICAgICAgaWYod2lkdGggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2lkdGggPSBkZXB0aGJ1ZmZlci0+Z2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGhlaWdodCA9IGRlcHRoYnVmZmVyLT5nZXRIZWlnaHQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHdpZHRoICE9IGRlcHRoYnVmZmVyLT5nZXRXaWR0aCgpIHx8IGhlaWdodCAhPSBkZXB0aGJ1ZmZlci0+Z2V0SGVpZ2h0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlM7CisgICAgICAgIH0KKworICAgICAgICBpZihzYW1wbGVzID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBzYW1wbGVzID0gZGVwdGhidWZmZXItPmdldFNhbXBsZXMoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHNhbXBsZXMgIT0gZGVwdGhidWZmZXItPmdldFNhbXBsZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEVfQU5HTEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihtU3RlbmNpbGJ1ZmZlclR5cGUgIT0gR0xfTk9ORSkKKyAgICB7CisgICAgICAgIGlmKG1TdGVuY2lsYnVmZmVyVHlwZSAhPSBHTF9SRU5ERVJCVUZGRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZW5jaWxidWZmZXIgPSBnZXRTdGVuY2lsYnVmZmVyKCk7CisKKyAgICAgICAgaWYoIXN0ZW5jaWxidWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ7CisgICAgICAgIH0KKworICAgICAgICBpZihzdGVuY2lsYnVmZmVyLT5nZXRXaWR0aCgpID09IDAgfHwgc3RlbmNpbGJ1ZmZlci0+Z2V0SGVpZ2h0KCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHdpZHRoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdpZHRoID0gc3RlbmNpbGJ1ZmZlci0+Z2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGhlaWdodCA9IHN0ZW5jaWxidWZmZXItPmdldEhlaWdodCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYod2lkdGggIT0gc3RlbmNpbGJ1ZmZlci0+Z2V0V2lkdGgoKSB8fCBoZWlnaHQgIT0gc3RlbmNpbGJ1ZmZlci0+Z2V0SGVpZ2h0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlM7CisgICAgICAgIH0KKworICAgICAgICBpZihzYW1wbGVzID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBzYW1wbGVzID0gc3RlbmNpbGJ1ZmZlci0+Z2V0U2FtcGxlcygpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc2FtcGxlcyAhPSBzdGVuY2lsYnVmZmVyLT5nZXRTYW1wbGVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0FOR0xFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYobURlcHRoYnVmZmVyVHlwZSA9PSBHTF9SRU5ERVJCVUZGRVIgJiYgbVN0ZW5jaWxidWZmZXJUeXBlID09IEdMX1JFTkRFUkJVRkZFUikKKyAgICB7CisgICAgICAgIGlmKGRlcHRoYnVmZmVyLT5nZXRGb3JtYXQoKSAhPSBHTF9ERVBUSDI0X1NURU5DSUw4X09FUyB8fAorICAgICAgICAgICBzdGVuY2lsYnVmZmVyLT5nZXRGb3JtYXQoKSAhPSBHTF9ERVBUSDI0X1NURU5DSUw4X09FUyB8fAorICAgICAgICAgICBkZXB0aGJ1ZmZlci0+Z2V0U2VyaWFsKCkgIT0gc3RlbmNpbGJ1ZmZlci0+Z2V0U2VyaWFsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9DT01QTEVURTsKK30KKworRGVmYXVsdEZyYW1lYnVmZmVyOjpEZWZhdWx0RnJhbWVidWZmZXIoQ29sb3JidWZmZXIgKmNvbG9yLCBEZXB0aFN0ZW5jaWxidWZmZXIgKmRlcHRoU3RlbmNpbCkKK3sKKyAgICBtQ29sb3JidWZmZXJUeXBlID0gR0xfUkVOREVSQlVGRkVSOworICAgIG1EZXB0aGJ1ZmZlclR5cGUgPSAoZGVwdGhTdGVuY2lsLT5nZXREZXB0aFNpemUoKSAhPSAwKSA/IEdMX1JFTkRFUkJVRkZFUiA6IEdMX05PTkU7CisgICAgbVN0ZW5jaWxidWZmZXJUeXBlID0gKGRlcHRoU3RlbmNpbC0+Z2V0U3RlbmNpbFNpemUoKSAhPSAwKSA/IEdMX1JFTkRFUkJVRkZFUiA6IEdMX05PTkU7CisKKyAgICBtQ29sb3JidWZmZXJQb2ludGVyLnNldChuZXcgUmVuZGVyYnVmZmVyKDAsIGNvbG9yKSk7CisKKyAgICBSZW5kZXJidWZmZXIgKmRlcHRoU3RlbmNpbFJlbmRlcmJ1ZmZlciA9IG5ldyBSZW5kZXJidWZmZXIoMCwgZGVwdGhTdGVuY2lsKTsKKyAgICBtRGVwdGhidWZmZXJQb2ludGVyLnNldChkZXB0aFN0ZW5jaWxSZW5kZXJidWZmZXIpOworICAgIG1TdGVuY2lsYnVmZmVyUG9pbnRlci5zZXQoZGVwdGhTdGVuY2lsUmVuZGVyYnVmZmVyKTsKK30KKworaW50IEZyYW1lYnVmZmVyOjpnZXRTYW1wbGVzKCkKK3sKKyAgICBpZihjb21wbGV0ZW5lc3MoKSA9PSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRDb2xvcmJ1ZmZlcigpLT5nZXRTYW1wbGVzKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworR0xlbnVtIERlZmF1bHRGcmFtZWJ1ZmZlcjo6Y29tcGxldGVuZXNzKCkKK3sKKyAgICAvLyBUaGUgZGVmYXVsdCBmcmFtZWJ1ZmZlciBzaG91bGQgYWx3YXlzIGJlIGNvbXBsZXRlCisgICAgQVNTRVJUKEZyYW1lYnVmZmVyOjpjb21wbGV0ZW5lc3MoKSA9PSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSk7CisKKyAgICByZXR1cm4gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEU7Cit9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9GcmFtZWJ1ZmZlci5oIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0ZyYW1lYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmY2M3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9GcmFtZWJ1ZmZlci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIEZyYW1lYnVmZmVyLmg6IERlZmluZXMgdGhlIEZyYW1lYnVmZmVyIGNsYXNzLiBJbXBsZW1lbnRzIEdMIGZyYW1lYnVmZmVyCisvLyBvYmplY3RzIGFuZCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuIFtPcGVuR0wgRVMgMi4wLjI0XSBzZWN0aW9uIDQuNCBwYWdlIDEwNS4KKworI2lmbmRlZiBMSUJHTEVTVjJfRlJBTUVCVUZGRVJfSF8KKyNkZWZpbmUgTElCR0xFU1YyX0ZSQU1FQlVGRkVSX0hfCisKKyNpbmNsdWRlICJSZWZDb3VudE9iamVjdC5oIgorI2luY2x1ZGUgImNvbW1vbi9hbmdsZXV0aWxzLmgiCisjaW5jbHVkZSAiSW1hZ2UuaHBwIgorCisjZGVmaW5lIEdMX0FQSUNBTEwKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworbmFtZXNwYWNlIGdsCit7CitjbGFzcyBSZW5kZXJidWZmZXI7CitjbGFzcyBDb2xvcmJ1ZmZlcjsKK2NsYXNzIERlcHRoYnVmZmVyOworY2xhc3MgU3RlbmNpbGJ1ZmZlcjsKK2NsYXNzIERlcHRoU3RlbmNpbGJ1ZmZlcjsKKworY2xhc3MgRnJhbWVidWZmZXIKK3sKKyAgcHVibGljOgorICAgIEZyYW1lYnVmZmVyKCk7CisKKyAgICB2aXJ0dWFsIH5GcmFtZWJ1ZmZlcigpOworCisgICAgdm9pZCBzZXRDb2xvcmJ1ZmZlcihHTGVudW0gdHlwZSwgR0x1aW50IGNvbG9yYnVmZmVyKTsKKyAgICB2b2lkIHNldERlcHRoYnVmZmVyKEdMZW51bSB0eXBlLCBHTHVpbnQgZGVwdGhidWZmZXIpOworICAgIHZvaWQgc2V0U3RlbmNpbGJ1ZmZlcihHTGVudW0gdHlwZSwgR0x1aW50IHN0ZW5jaWxidWZmZXIpOworCisgICAgdm9pZCBkZXRhY2hUZXh0dXJlKEdMdWludCB0ZXh0dXJlKTsKKyAgICB2b2lkIGRldGFjaFJlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKTsKKworICAgIEltYWdlICpnZXRSZW5kZXJUYXJnZXQoKTsKKyAgICBJbWFnZSAqZ2V0RGVwdGhTdGVuY2lsKCk7CisKKyAgICB1bnNpZ25lZCBpbnQgZ2V0UmVuZGVyVGFyZ2V0U2VyaWFsKCk7CisgICAgdW5zaWduZWQgaW50IGdldERlcHRoYnVmZmVyU2VyaWFsKCk7CisgICAgdW5zaWduZWQgaW50IGdldFN0ZW5jaWxidWZmZXJTZXJpYWwoKTsKKworICAgIENvbG9yYnVmZmVyICpnZXRDb2xvcmJ1ZmZlcigpOworICAgIERlcHRoU3RlbmNpbGJ1ZmZlciAqZ2V0RGVwdGhidWZmZXIoKTsKKyAgICBEZXB0aFN0ZW5jaWxidWZmZXIgKmdldFN0ZW5jaWxidWZmZXIoKTsKKworICAgIEdMZW51bSBnZXRDb2xvcmJ1ZmZlclR5cGUoKTsKKyAgICBHTGVudW0gZ2V0RGVwdGhidWZmZXJUeXBlKCk7CisgICAgR0xlbnVtIGdldFN0ZW5jaWxidWZmZXJUeXBlKCk7CisKKyAgICBHTHVpbnQgZ2V0Q29sb3JidWZmZXJIYW5kbGUoKTsKKyAgICBHTHVpbnQgZ2V0RGVwdGhidWZmZXJIYW5kbGUoKTsKKyAgICBHTHVpbnQgZ2V0U3RlbmNpbGJ1ZmZlckhhbmRsZSgpOworCisgICAgYm9vbCBoYXNTdGVuY2lsKCk7CisgICAgaW50IGdldFNhbXBsZXMoKTsKKworICAgIHZpcnR1YWwgR0xlbnVtIGNvbXBsZXRlbmVzcygpOworCisgIHByb3RlY3RlZDoKKyAgICBHTGVudW0gbUNvbG9yYnVmZmVyVHlwZTsKKyAgICBCaW5kaW5nUG9pbnRlcjxSZW5kZXJidWZmZXI+IG1Db2xvcmJ1ZmZlclBvaW50ZXI7CisKKyAgICBHTGVudW0gbURlcHRoYnVmZmVyVHlwZTsKKyAgICBCaW5kaW5nUG9pbnRlcjxSZW5kZXJidWZmZXI+IG1EZXB0aGJ1ZmZlclBvaW50ZXI7CisKKyAgICBHTGVudW0gbVN0ZW5jaWxidWZmZXJUeXBlOworICAgIEJpbmRpbmdQb2ludGVyPFJlbmRlcmJ1ZmZlcj4gbVN0ZW5jaWxidWZmZXJQb2ludGVyOworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEZyYW1lYnVmZmVyKTsKKworICAgIFJlbmRlcmJ1ZmZlciAqbG9va3VwUmVuZGVyYnVmZmVyKEdMZW51bSB0eXBlLCBHTHVpbnQgaGFuZGxlKSBjb25zdDsKK307CisKK2NsYXNzIERlZmF1bHRGcmFtZWJ1ZmZlciA6IHB1YmxpYyBGcmFtZWJ1ZmZlcgoreworICBwdWJsaWM6CisgICAgRGVmYXVsdEZyYW1lYnVmZmVyKENvbG9yYnVmZmVyICpjb2xvciwgRGVwdGhTdGVuY2lsYnVmZmVyICpkZXB0aFN0ZW5jaWwpOworCisgICAgdmlydHVhbCBHTGVudW0gY29tcGxldGVuZXNzKCk7CisKKyAgcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGVmYXVsdEZyYW1lYnVmZmVyKTsKK307CisKK30KKworI2VuZGlmICAgLy8gTElCR0xFU1YyX0ZSQU1FQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvSGFuZGxlQWxsb2NhdG9yLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9IYW5kbGVBbGxvY2F0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNmJhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvSGFuZGxlQWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDYzIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBIYW5kbGVBbGxvY2F0b3IuY3BwOiBJbXBsZW1lbnRzIHRoZSBIYW5kbGVBbGxvY2F0b3IgY2xhc3MsIHdoaWNoIGlzIHVzZWQKKy8vIHRvIGFsbG9jYXRlIEdMIGhhbmRsZXMuCisKKyNpbmNsdWRlICJIYW5kbGVBbGxvY2F0b3IuaCIKKworI2luY2x1ZGUgIm1haW4uaCIKKworbmFtZXNwYWNlIGdsCit7CisKK0hhbmRsZUFsbG9jYXRvcjo6SGFuZGxlQWxsb2NhdG9yKCkgOiBtQmFzZVZhbHVlKDEpLCBtTmV4dFZhbHVlKDEpCit7Cit9CisKK0hhbmRsZUFsbG9jYXRvcjo6fkhhbmRsZUFsbG9jYXRvcigpCit7Cit9CisKK3ZvaWQgSGFuZGxlQWxsb2NhdG9yOjpzZXRCYXNlSGFuZGxlKEdMdWludCB2YWx1ZSkKK3sKKyAgICBBU1NFUlQobUJhc2VWYWx1ZSA9PSBtTmV4dFZhbHVlKTsKKyAgICBtQmFzZVZhbHVlID0gdmFsdWU7CisgICAgbU5leHRWYWx1ZSA9IHZhbHVlOworfQorCitHTHVpbnQgSGFuZGxlQWxsb2NhdG9yOjphbGxvY2F0ZSgpCit7CisgICAgaWYobUZyZWVWYWx1ZXMuc2l6ZSgpKQorICAgIHsKKyAgICAgICAgR0x1aW50IGhhbmRsZSA9IG1GcmVlVmFsdWVzLmJhY2soKTsKKyAgICAgICAgbUZyZWVWYWx1ZXMucG9wX2JhY2soKTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZTsKKyAgICB9CisgICAgcmV0dXJuIG1OZXh0VmFsdWUrKzsKK30KKwordm9pZCBIYW5kbGVBbGxvY2F0b3I6OnJlbGVhc2UoR0x1aW50IGhhbmRsZSkKK3sKKyAgICBpZihoYW5kbGUgPT0gbU5leHRWYWx1ZSAtIDEpCisgICAgeworICAgICAgICAvLyBEb24ndCBkcm9wIGJlbG93IGJhc2UgdmFsdWUKKyAgICAgICAgaWYobU5leHRWYWx1ZSA+IG1CYXNlVmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1OZXh0VmFsdWUtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBPbmx5IGZyZWUgaGFuZGxlcyB0aGF0IHdlIG93biAtIGRvbid0IGRyb3AgYmVsb3cgdGhlIGJhc2UgdmFsdWUKKyAgICAgICAgaWYoaGFuZGxlID49IG1CYXNlVmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1GcmVlVmFsdWVzLnB1c2hfYmFjayhoYW5kbGUpOworICAgICAgICB9CisgICAgfQorfQorCit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvSGFuZGxlQWxsb2NhdG9yLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvSGFuZGxlQWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlYTBmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9IYW5kbGVBbGxvY2F0b3IuaApAQCAtMCwwICsxLDQ1IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBIYW5kbGVBbGxvY2F0b3IuaDogRGVmaW5lcyB0aGUgSGFuZGxlQWxsb2NhdG9yIGNsYXNzLCB3aGljaCBpcyB1c2VkIHRvCisvLyBhbGxvY2F0ZSBHTCBoYW5kbGVzLgorCisjaWZuZGVmIExJQkdMRVNWMl9IQU5ETEVBTExPQ0FUT1JfSF8KKyNkZWZpbmUgTElCR0xFU1YyX0hBTkRMRUFMTE9DQVRPUl9IXworCisjaW5jbHVkZSAiY29tbW9uL2FuZ2xldXRpbHMuaCIKKworI2RlZmluZSBHTF9BUElDQUxMCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBnbAoreworCitjbGFzcyBIYW5kbGVBbGxvY2F0b3IKK3sKKyAgcHVibGljOgorICAgIEhhbmRsZUFsbG9jYXRvcigpOworICAgIHZpcnR1YWwgfkhhbmRsZUFsbG9jYXRvcigpOworCisgICAgdm9pZCBzZXRCYXNlSGFuZGxlKEdMdWludCB2YWx1ZSk7CisKKyAgICBHTHVpbnQgYWxsb2NhdGUoKTsKKyAgICB2b2lkIHJlbGVhc2UoR0x1aW50IGhhbmRsZSk7CisKKyAgcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSGFuZGxlQWxsb2NhdG9yKTsKKworICAgIEdMdWludCBtQmFzZVZhbHVlOworICAgIEdMdWludCBtTmV4dFZhbHVlOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8R0x1aW50PiBIYW5kbGVMaXN0OworICAgIEhhbmRsZUxpc3QgbUZyZWVWYWx1ZXM7Cit9OworCit9CisKKyNlbmRpZiAgIC8vIExJQkdMRVNWMl9IQU5ETEVBTExPQ0FUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9JbWFnZS5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvSW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjY2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvSW1hZ2UuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkltYWdlLmhwcCIKKworI2luY2x1ZGUgIi4uL2NvbW1vbi9kZWJ1Zy5oIgorCituYW1lc3BhY2UgZ2wKK3sKKwlJbWFnZTo6SW1hZ2Uoc3c6OlJlc291cmNlICpwYXJlbnRUZXh0dXJlLCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpIDogc3c6OlN1cmZhY2UocGFyZW50VGV4dHVyZSwgd2lkdGgsIGhlaWdodCwgMSwgc2VsZWN0SW50ZXJuYWxGb3JtYXQoZm9ybWF0LCB0eXBlKSwgdHJ1ZSwgdHJ1ZSksIHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGludGVybmFsRm9ybWF0KHNlbGVjdEludGVybmFsRm9ybWF0KGZvcm1hdCwgdHlwZSkpLCBmb3JtYXQoZm9ybWF0KSwgdHlwZSh0eXBlKSwgbXVsdGlTYW1wbGVEZXB0aCgxKQorCXsKKwl9CisKKwlJbWFnZTo6SW1hZ2Uoc3c6OlJlc291cmNlICpwYXJlbnRUZXh0dXJlLCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgc3c6OkZvcm1hdCBpbnRlcm5hbEZvcm1hdCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGludCBtdWx0aVNhbXBsZURlcHRoLCBib29sIGxvY2thYmxlLCBib29sIHJlbmRlclRhcmdldCkgOiBzdzo6U3VyZmFjZShwYXJlbnRUZXh0dXJlLCB3aWR0aCwgaGVpZ2h0LCBtdWx0aVNhbXBsZURlcHRoLCBpbnRlcm5hbEZvcm1hdCwgbG9ja2FibGUsIHJlbmRlclRhcmdldCksIHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGludGVybmFsRm9ybWF0KGludGVybmFsRm9ybWF0KSwgZm9ybWF0KGZvcm1hdCksIHR5cGUodHlwZSksIG11bHRpU2FtcGxlRGVwdGgobXVsdGlTYW1wbGVEZXB0aCkKKwl7CisJfQorCisJSW1hZ2U6On5JbWFnZSgpCisJeworCX0KKworCXZvaWQgKkltYWdlOjpsb2NrKHVuc2lnbmVkIGludCBsZWZ0LCB1bnNpZ25lZCBpbnQgdG9wLCBzdzo6TG9jayBsb2NrKQorCXsKKwkJcmV0dXJuIGxvY2tFeHRlcm5hbChsZWZ0LCB0b3AsIDAsIGxvY2ssIHN3OjpQVUJMSUMpOworCX0KKworCXVuc2lnbmVkIGludCBJbWFnZTo6Z2V0UGl0Y2goKQorCXsKKwkJcmV0dXJuIGdldEV4dGVybmFsUGl0Y2hCKCk7CisJfQorCisJdm9pZCBJbWFnZTo6dW5sb2NrKCkKKwl7CisJCXVubG9ja0V4dGVybmFsKCk7CisJfQorCisJaW50IEltYWdlOjpnZXRXaWR0aCgpCisJeworCQlyZXR1cm4gd2lkdGg7CisJfQorCQorCWludCBJbWFnZTo6Z2V0SGVpZ2h0KCkKKwl7CisJCXJldHVybiBoZWlnaHQ7CisJfQorCisJR0xlbnVtIEltYWdlOjpnZXRGb3JtYXQoKQorCXsKKwkJcmV0dXJuIGZvcm1hdDsKKwl9CisJCisJR0xlbnVtIEltYWdlOjpnZXRUeXBlKCkKKwl7CisJCXJldHVybiB0eXBlOworCX0KKwkKKwlzdzo6Rm9ybWF0IEltYWdlOjpnZXRJbnRlcm5hbEZvcm1hdCgpCisJeworCQlyZXR1cm4gaW50ZXJuYWxGb3JtYXQ7CisJfQorCQorCWludCBJbWFnZTo6Z2V0TXVsdGlTYW1wbGVEZXB0aCgpCisJeworCQlyZXR1cm4gbXVsdGlTYW1wbGVEZXB0aDsKKwl9CisKKwlpbnQgSW1hZ2U6OmJ5dGVzKHN3OjpGb3JtYXQgZm9ybWF0KQorCXsKKwkJcmV0dXJuIHN3OjpTdXJmYWNlOjpieXRlcyhmb3JtYXQpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvSW1hZ2UuaHBwIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0ltYWdlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhiYWQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0ltYWdlLmhwcApAQCAtMCwwICsxLDU2IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgZHhfU3VyZmFjZV9ocHAKKyNkZWZpbmUgZHhfU3VyZmFjZV9ocHAKKworI2luY2x1ZGUgIlVua25vd24uaHBwIgorCisjaW5jbHVkZSAiUmVuZGVyZXIvU3VyZmFjZS5ocHAiCisKKyNkZWZpbmUgR0xfQVBJQ0FMTAorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCituYW1lc3BhY2UgZ2wKK3sKKwljbGFzcyBJbWFnZSA6IHB1YmxpYyBVbmtub3duLCBwdWJsaWMgc3c6OlN1cmZhY2UKKwl7CisJcHVibGljOgorCQlJbWFnZShzdzo6UmVzb3VyY2UgKnBhcmVudFRleHR1cmUsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSk7CisJCUltYWdlKHN3OjpSZXNvdXJjZSAqcGFyZW50VGV4dHVyZSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIHN3OjpGb3JtYXQgaW50ZXJuYWxGb3JtYXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBpbnQgbXVsdGlTYW1wbGVEZXB0aCwgYm9vbCBsb2NrYWJsZSwgYm9vbCByZW5kZXJUYXJnZXQpOworCisJCXZpcnR1YWwgfkltYWdlKCk7CisKKwkJdmlydHVhbCB2b2lkICpsb2NrKHVuc2lnbmVkIGludCBsZWZ0LCB1bnNpZ25lZCBpbnQgdG9wLCBzdzo6TG9jayBsb2NrKTsKKwkJdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0UGl0Y2goKTsKKwkJdmlydHVhbCB2b2lkIHVubG9jaygpOworCQkKKwkJdmlydHVhbCBpbnQgZ2V0V2lkdGgoKTsKKwkJdmlydHVhbCBpbnQgZ2V0SGVpZ2h0KCk7CisJCXZpcnR1YWwgR0xlbnVtIGdldEZvcm1hdCgpOworCQl2aXJ0dWFsIEdMZW51bSBnZXRUeXBlKCk7CisJCXZpcnR1YWwgc3c6OkZvcm1hdCBnZXRJbnRlcm5hbEZvcm1hdCgpOworCQl2aXJ0dWFsIGludCBnZXRNdWx0aVNhbXBsZURlcHRoKCk7CisKKwkJc3RhdGljIHN3OjpGb3JtYXQgc2VsZWN0SW50ZXJuYWxGb3JtYXQoR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpOworCQlzdGF0aWMgaW50IGJ5dGVzKHN3OjpGb3JtYXQgZm9ybWF0KTsKKworCXByaXZhdGU6CisJCWNvbnN0IEdMc2l6ZWkgd2lkdGg7CisJCWNvbnN0IEdMc2l6ZWkgaGVpZ2h0OworCQljb25zdCBHTGVudW0gZm9ybWF0OworCQljb25zdCBHTGVudW0gdHlwZTsKKwkJY29uc3Qgc3c6OkZvcm1hdCBpbnRlcm5hbEZvcm1hdDsKKwkJY29uc3QgaW50IG11bHRpU2FtcGxlRGVwdGg7CisJfTsKK30KKworI2VuZGlmICAgLy8gZHhfU3VyZmFjZV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9JbmRleERhdGFNYW5hZ2VyLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9JbmRleERhdGFNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTY4OGEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0luZGV4RGF0YU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjUzIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBJbmRleERhdGFNYW5hZ2VyLmNwcDogRGVmaW5lcyB0aGUgSW5kZXhEYXRhTWFuYWdlciwgYSBjbGFzcyB0aGF0CisvLyBydW5zIHRoZSBCdWZmZXIgdHJhbnNsYXRpb24gcHJvY2VzcyBmb3IgaW5kZXggYnVmZmVycy4KKworI2luY2x1ZGUgIkluZGV4RGF0YU1hbmFnZXIuaCIKKworI2luY2x1ZGUgIkJ1ZmZlci5oIgorI2luY2x1ZGUgIm1hdGh1dGlsLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgImNvbW1vbi9kZWJ1Zy5oIgorCituYW1lc3BhY2UKK3sKKyAgICBlbnVtIHsgSU5JVElBTF9JTkRFWF9CVUZGRVJfU0laRSA9IDQwOTYgKiBzaXplb2YoR0x1aW50KSB9OworfQorCituYW1lc3BhY2UgZ2wKK3sKKworSW5kZXhEYXRhTWFuYWdlcjo6SW5kZXhEYXRhTWFuYWdlcihDb250ZXh0ICpjb250ZXh0LCBEZXZpY2UgKmRldmljZSkgOiBtRGV2aWNlKGRldmljZSkKK3sKKyAgICBtU3RyZWFtaW5nQnVmZmVyID0gbmV3IFN0cmVhbWluZ0luZGV4QnVmZmVyKG1EZXZpY2UsIElOSVRJQUxfSU5ERVhfQlVGRkVSX1NJWkUpOworCisgICAgaWYoIW1TdHJlYW1pbmdCdWZmZXIpCisgICAgeworICAgICAgICBFUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgc3RyZWFtaW5nIGluZGV4IGJ1ZmZlci4iKTsKKyAgICB9Cit9CisKK0luZGV4RGF0YU1hbmFnZXI6On5JbmRleERhdGFNYW5hZ2VyKCkKK3sKKyAgICBkZWxldGUgbVN0cmVhbWluZ0J1ZmZlcjsKK30KKwordm9pZCBjb3B5SW5kaWNlcyhHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqaW5wdXQsIEdMc2l6ZWkgY291bnQsIHZvaWQgKm91dHB1dCkKK3sKKyAgICBpZih0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpCisgICAgeworICAgICAgICBtZW1jcHkob3V0cHV0LCBpbnB1dCwgY291bnQgKiBzaXplb2YoR0x1Ynl0ZSkpOworICAgIH0KKyAgICBlbHNlIGlmKHR5cGUgPT0gR0xfVU5TSUdORURfSU5UKQorICAgIHsKKyAgICAgICAgbWVtY3B5KG91dHB1dCwgaW5wdXQsIGNvdW50ICogc2l6ZW9mKEdMdWludCkpOworICAgIH0KKyAgICBlbHNlIGlmKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlQpCisgICAgeworICAgICAgICBtZW1jcHkob3V0cHV0LCBpbnB1dCwgY291bnQgKiBzaXplb2YoR0x1c2hvcnQpKTsKKyAgICB9CisgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBJbmRleFR5cGU+Cit2b2lkIGNvbXB1dGVSYW5nZShjb25zdCBJbmRleFR5cGUgKmluZGljZXMsIEdMc2l6ZWkgY291bnQsIEdMdWludCAqbWluSW5kZXgsIEdMdWludCAqbWF4SW5kZXgpCit7CisgICAgKm1pbkluZGV4ID0gaW5kaWNlc1swXTsKKyAgICAqbWF4SW5kZXggPSBpbmRpY2VzWzBdOworCisgICAgZm9yKEdMc2l6ZWkgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoKm1pbkluZGV4ID4gaW5kaWNlc1tpXSkgKm1pbkluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgaWYoKm1heEluZGV4IDwgaW5kaWNlc1tpXSkgKm1heEluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICB9Cit9CisKK3ZvaWQgY29tcHV0ZVJhbmdlKEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzLCBHTHNpemVpIGNvdW50LCBHTHVpbnQgKm1pbkluZGV4LCBHTHVpbnQgKm1heEluZGV4KQoreworICAgIGlmKHR5cGUgPT0gR0xfVU5TSUdORURfQllURSkKKyAgICB7CisgICAgICAgIGNvbXB1dGVSYW5nZShzdGF0aWNfY2FzdDxjb25zdCBHTHVieXRlKj4oaW5kaWNlcyksIGNvdW50LCBtaW5JbmRleCwgbWF4SW5kZXgpOworICAgIH0KKyAgICBlbHNlIGlmKHR5cGUgPT0gR0xfVU5TSUdORURfSU5UKQorICAgIHsKKyAgICAgICAgY29tcHV0ZVJhbmdlKHN0YXRpY19jYXN0PGNvbnN0IEdMdWludCo+KGluZGljZXMpLCBjb3VudCwgbWluSW5kZXgsIG1heEluZGV4KTsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUKQorICAgIHsKKyAgICAgICAgY29tcHV0ZVJhbmdlKHN0YXRpY19jYXN0PGNvbnN0IEdMdXNob3J0Kj4oaW5kaWNlcyksIGNvdW50LCBtaW5JbmRleCwgbWF4SW5kZXgpOworICAgIH0KKyAgICBlbHNlIFVOUkVBQ0hBQkxFKCk7Cit9CisKK0dMZW51bSBJbmRleERhdGFNYW5hZ2VyOjpwcmVwYXJlSW5kZXhEYXRhKEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LCBCdWZmZXIgKmJ1ZmZlciwgY29uc3Qgdm9pZCAqaW5kaWNlcywgVHJhbnNsYXRlZEluZGV4RGF0YSAqdHJhbnNsYXRlZCkKK3sKKyAgICBpZighbVN0cmVhbWluZ0J1ZmZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBHTF9PVVRfT0ZfTUVNT1JZOworICAgIH0KKworICAgIGludHB0cl90IG9mZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGluZGljZXMpOworICAgIGJvb2wgYWxpZ25lZE9mZnNldCA9IGZhbHNlOworCisgICAgaWYoYnVmZmVyICE9IE5VTEwpCisgICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6ICBhbGlnbmVkT2Zmc2V0ID0gKG9mZnNldCAlIHNpemVvZihHTHVieXRlKSA9PSAwKTsgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQ6IGFsaWduZWRPZmZzZXQgPSAob2Zmc2V0ICUgc2l6ZW9mKEdMdXNob3J0KSA9PSAwKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9JTlQ6ICAgYWxpZ25lZE9mZnNldCA9IChvZmZzZXQgJSBzaXplb2YoR0x1aW50KSA9PSAwKTsgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOyBhbGlnbmVkT2Zmc2V0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZih0eXBlU2l6ZSh0eXBlKSAqIGNvdW50ICsgb2Zmc2V0ID4gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KGJ1ZmZlci0+c2l6ZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdMX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgaW5kaWNlcyA9IHN0YXRpY19jYXN0PGNvbnN0IEdMdWJ5dGUqPihidWZmZXItPmRhdGEoKSkgKyBvZmZzZXQ7CisgICAgfQorCisgICAgU3RyZWFtaW5nSW5kZXhCdWZmZXIgKnN0cmVhbWluZ0J1ZmZlciA9IG1TdHJlYW1pbmdCdWZmZXI7CisKKwlzdzo6UmVzb3VyY2UgKnN0YXRpY0J1ZmZlciA9IGJ1ZmZlciA/IGJ1ZmZlci0+Z2V0UmVzb3VyY2UoKSA6IE5VTEw7CisKKyAgICBpZihzdGF0aWNCdWZmZXIpCisgICAgeworICAgICAgICBjb21wdXRlUmFuZ2UodHlwZSwgaW5kaWNlcywgY291bnQsICZ0cmFuc2xhdGVkLT5taW5JbmRleCwgJnRyYW5zbGF0ZWQtPm1heEluZGV4KTsKKworCQl0cmFuc2xhdGVkLT5pbmRleEJ1ZmZlciA9IHN0YXRpY0J1ZmZlcjsKKwkJdHJhbnNsYXRlZC0+aW5kZXhPZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCVVJTlQgc3RyZWFtT2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IGNvbnZlcnRDb3VudCA9IGNvdW50OworCisgICAgICAgIHN0cmVhbWluZ0J1ZmZlci0+cmVzZXJ2ZVNwYWNlKGNvbnZlcnRDb3VudCAqIHR5cGVTaXplKHR5cGUpLCB0eXBlKTsKKyAgICAgICAgdm9pZCAqb3V0cHV0ID0gc3RyZWFtaW5nQnVmZmVyLT5tYXAodHlwZVNpemUodHlwZSkgKiBjb252ZXJ0Q291bnQsICZzdHJlYW1PZmZzZXQpOworICAgICAgICAKKyAgICAgICAgaWYob3V0cHV0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiRmFpbGVkIHRvIG1hcCBpbmRleCBidWZmZXIuIik7CisgICAgICAgICAgICByZXR1cm4gR0xfT1VUX09GX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIGNvcHlJbmRpY2VzKHR5cGUsIHN0YXRpY0J1ZmZlciA/IGJ1ZmZlci0+ZGF0YSgpIDogaW5kaWNlcywgY29udmVydENvdW50LCBvdXRwdXQpOworICAgICAgICBzdHJlYW1pbmdCdWZmZXItPnVubWFwKCk7CisKKyAgICAgICAgY29tcHV0ZVJhbmdlKHR5cGUsIGluZGljZXMsIGNvdW50LCAmdHJhbnNsYXRlZC0+bWluSW5kZXgsICZ0cmFuc2xhdGVkLT5tYXhJbmRleCk7CisKKwkJdHJhbnNsYXRlZC0+aW5kZXhCdWZmZXIgPSBzdHJlYW1pbmdCdWZmZXItPmdldFJlc291cmNlKCk7CisJCXRyYW5zbGF0ZWQtPmluZGV4T2Zmc2V0ID0gc3RyZWFtT2Zmc2V0OworICAgIH0KKworICAgIHJldHVybiBHTF9OT19FUlJPUjsKK30KKworc3RkOjpzaXplX3QgSW5kZXhEYXRhTWFuYWdlcjo6dHlwZVNpemUoR0xlbnVtIHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVDogICByZXR1cm4gc2l6ZW9mKEdMdWludCk7CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDogcmV0dXJuIHNpemVvZihHTHVzaG9ydCk7CisgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOiAgcmV0dXJuIHNpemVvZihHTHVieXRlKTsKKyAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOyByZXR1cm4gc2l6ZW9mKEdMdXNob3J0KTsKKyAgICB9Cit9CisKK1N0cmVhbWluZ0luZGV4QnVmZmVyOjpTdHJlYW1pbmdJbmRleEJ1ZmZlcihEZXZpY2UgKmRldmljZSwgVUlOVCBpbml0aWFsU2l6ZSkgOiBtRGV2aWNlKGRldmljZSksIG1CdWZmZXJTaXplKGluaXRpYWxTaXplKSwgbUluZGV4QnVmZmVyKE5VTEwpCit7CisJaWYoaW5pdGlhbFNpemUgPiAwKQorICAgIHsKKwkJbUluZGV4QnVmZmVyID0gbmV3IHN3OjpSZXNvdXJjZShpbml0aWFsU2l6ZSArIDE2KTsKKworICAgICAgICBpZighbUluZGV4QnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBFUlIoIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBhbiBpbmRleCBidWZmZXIgb2Ygc2l6ZSAlbHUuIiwgaW5pdGlhbFNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgbVdyaXRlUG9zaXRpb24gPSAwOworfQorCitTdHJlYW1pbmdJbmRleEJ1ZmZlcjo6flN0cmVhbWluZ0luZGV4QnVmZmVyKCkKK3sKKwlpZihtSW5kZXhCdWZmZXIpCisgICAgeworICAgICAgICBtSW5kZXhCdWZmZXItPmRlc3RydWN0KCk7CisgICAgfQorfQorCit2b2lkICpTdHJlYW1pbmdJbmRleEJ1ZmZlcjo6bWFwKFVJTlQgcmVxdWlyZWRTcGFjZSwgVUlOVCAqb2Zmc2V0KQoreworICAgIHZvaWQgKm1hcFB0ciA9IE5VTEw7CisKKyAgICBpZihtSW5kZXhCdWZmZXIpCisgICAgeworICAgICAgICBtYXBQdHIgPSAoY2hhciopbUluZGV4QnVmZmVyLT5sb2NrKHN3OjpQVUJMSUMpICsgbVdyaXRlUG9zaXRpb247CisgICAgIAorICAgICAgICBpZighbWFwUHRyKQorICAgICAgICB7CisgICAgICAgICAgICBFUlIoIiBMb2NrIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAqb2Zmc2V0ID0gbVdyaXRlUG9zaXRpb247CisgICAgICAgIG1Xcml0ZVBvc2l0aW9uICs9IHJlcXVpcmVkU3BhY2U7CisgICAgfQorCisgICAgcmV0dXJuIG1hcFB0cjsKK30KKwordm9pZCBTdHJlYW1pbmdJbmRleEJ1ZmZlcjo6dW5tYXAoKQoreworICAgIGlmKG1JbmRleEJ1ZmZlcikKKyAgICB7CisgICAgICAgIG1JbmRleEJ1ZmZlci0+dW5sb2NrKCk7CisgICAgfQorfQorCit2b2lkIFN0cmVhbWluZ0luZGV4QnVmZmVyOjpyZXNlcnZlU3BhY2UoVUlOVCByZXF1aXJlZFNwYWNlLCBHTGVudW0gdHlwZSkKK3sKKyAgICBpZihyZXF1aXJlZFNwYWNlID4gbUJ1ZmZlclNpemUpCisgICAgeworICAgICAgICBpZihtSW5kZXhCdWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1JbmRleEJ1ZmZlci0+ZGVzdHJ1Y3QoKTsKKyAgICAgICAgICAgIG1JbmRleEJ1ZmZlciA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtQnVmZmVyU2l6ZSA9IHN0ZDo6bWF4KHJlcXVpcmVkU3BhY2UsIDIgKiBtQnVmZmVyU2l6ZSk7CisKKwkJbUluZGV4QnVmZmVyID0gbmV3IHN3OjpSZXNvdXJjZShtQnVmZmVyU2l6ZSArIDE2KTsKKyAgICAKKyAgICAgICAgaWYoIW1JbmRleEJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgRVJSKCJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYSB2ZXJ0ZXggYnVmZmVyIG9mIHNpemUgJWx1LiIsIG1CdWZmZXJTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Xcml0ZVBvc2l0aW9uID0gMDsKKyAgICB9CisgICAgZWxzZSBpZihtV3JpdGVQb3NpdGlvbiArIHJlcXVpcmVkU3BhY2UgPiBtQnVmZmVyU2l6ZSkgICAvLyBSZWN5Y2xlCisgICAgeworCQlpZihtSW5kZXhCdWZmZXIpCisJCXsKKwkJCW1JbmRleEJ1ZmZlci0+ZGVzdHJ1Y3QoKTsKKwkJCW1JbmRleEJ1ZmZlciA9IG5ldyBzdzo6UmVzb3VyY2UobUJ1ZmZlclNpemUgKyAxNik7CisJCX0KKworICAgICAgICBtV3JpdGVQb3NpdGlvbiA9IDA7CisgICAgfQorfQorCitzdzo6UmVzb3VyY2UgKlN0cmVhbWluZ0luZGV4QnVmZmVyOjpnZXRSZXNvdXJjZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1JbmRleEJ1ZmZlcjsKK30KKworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL0luZGV4RGF0YU1hbmFnZXIuaCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9JbmRleERhdGFNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlZmI4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9JbmRleERhdGFNYW5hZ2VyLmgKQEAgLTAsMCArMSw3NSBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gSW5kZXhEYXRhTWFuYWdlci5oOiBEZWZpbmVzIHRoZSBJbmRleERhdGFNYW5hZ2VyLCBhIGNsYXNzIHRoYXQKKy8vIHJ1bnMgdGhlIEJ1ZmZlciB0cmFuc2xhdGlvbiBwcm9jZXNzIGZvciBpbmRleCBidWZmZXJzLgorCisjaWZuZGVmIExJQkdMRVNWMl9JTkRFWERBVEFNQU5BR0VSX0hfCisjZGVmaW5lIExJQkdMRVNWMl9JTkRFWERBVEFNQU5BR0VSX0hfCisKKyNpbmNsdWRlICJDb250ZXh0LmgiCisjaW5jbHVkZSAiRGV2aWNlLmhwcCIKKworI2RlZmluZSBHTF9BUElDQUxMCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGdsCit7CisKK3N0cnVjdCBUcmFuc2xhdGVkSW5kZXhEYXRhCit7CisgICAgVUlOVCBtaW5JbmRleDsKKyAgICBVSU5UIG1heEluZGV4OworICAgIFVJTlQgaW5kZXhPZmZzZXQ7CisKKyAgICBzdzo6UmVzb3VyY2UgKmluZGV4QnVmZmVyOworfTsKKworY2xhc3MgU3RyZWFtaW5nSW5kZXhCdWZmZXIKK3sKKyAgcHVibGljOgorICAgIFN0cmVhbWluZ0luZGV4QnVmZmVyKERldmljZSAqZGV2aWNlLCBVSU5UIGluaXRpYWxTaXplKTsKKyAgICB2aXJ0dWFsIH5TdHJlYW1pbmdJbmRleEJ1ZmZlcigpOworCisgICAgdm9pZCAqbWFwKFVJTlQgcmVxdWlyZWRTcGFjZSwgVUlOVCAqb2Zmc2V0KTsKKwl2b2lkIHVubWFwKCk7CisgICAgdm9pZCByZXNlcnZlU3BhY2UoVUlOVCByZXF1aXJlZFNwYWNlLCBHTGVudW0gdHlwZSk7CisKKwlVSU5UIHNpemUoKSBjb25zdCB7cmV0dXJuIG1CdWZmZXJTaXplO30KKwlzdzo6UmVzb3VyY2UgKmdldFJlc291cmNlKCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKwlEZXZpY2UgKmNvbnN0IG1EZXZpY2U7CisKKyAgICBzdzo6UmVzb3VyY2UgKm1JbmRleEJ1ZmZlcjsKKyAgICBVSU5UIG1CdWZmZXJTaXplOworICAgIFVJTlQgbVdyaXRlUG9zaXRpb247Cit9OworCitjbGFzcyBJbmRleERhdGFNYW5hZ2VyCit7CisgIHB1YmxpYzoKKyAgICBJbmRleERhdGFNYW5hZ2VyKENvbnRleHQgKmNvbnRleHQsIERldmljZSAqZXZpY2UpOworICAgIHZpcnR1YWwgfkluZGV4RGF0YU1hbmFnZXIoKTsKKworICAgIEdMZW51bSBwcmVwYXJlSW5kZXhEYXRhKEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LCBCdWZmZXIgKmFycmF5RWxlbWVudEJ1ZmZlciwgY29uc3Qgdm9pZCAqaW5kaWNlcywgVHJhbnNsYXRlZEluZGV4RGF0YSAqdHJhbnNsYXRlZCk7CisKKwlzdGF0aWMgc3RkOjpzaXplX3QgdHlwZVNpemUoR0xlbnVtIHR5cGUpOworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEluZGV4RGF0YU1hbmFnZXIpOworCisgICAgRGV2aWNlICpjb25zdCBtRGV2aWNlOworCisgICAgU3RyZWFtaW5nSW5kZXhCdWZmZXIgKm1TdHJlYW1pbmdCdWZmZXI7Cit9OworCit9CisKKyNlbmRpZiAgIC8vIExJQkdMRVNWMl9JTkRFWERBVEFNQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUHJvZ3JhbS5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwZDg1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9Qcm9ncmFtLmNwcApAQCAtMCwwICsxLDMxMTcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMSBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIFByb2dyYW0uY3BwOiBJbXBsZW1lbnRzIHRoZSBQcm9ncmFtIGNsYXNzLiBJbXBsZW1lbnRzIEdMIHByb2dyYW0gb2JqZWN0cworLy8gYW5kIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS4gW09wZW5HTCBFUyAyLjAuMjRdIHNlY3Rpb24gMi4xMC4zIHBhZ2UgMjguCisKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiU2hhZGVyLmgiCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiY29tbW9uL2RlYnVnLmgiCisjaW5jbHVkZSAiU2hhZGVyL1BpeGVsU2hhZGVyLmhwcCIKKyNpbmNsdWRlICJTaGFkZXIvVmVydGV4U2hhZGVyLmhwcCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2lmICFkZWZpbmVkKEFOR0xFX0NPTVBJTEVfT1BUSU1JWkFUSU9OX0xFVkVMKQorI2RlZmluZSBBTkdMRV9DT01QSUxFX09QVElNSVpBVElPTl9MRVZFTCBEM0RDT01QSUxFX09QVElNSVpBVElPTl9MRVZFTDMKKyNlbmRpZgorCituYW1lc3BhY2UgZ2wKK3sKK3Vuc2lnbmVkIGludCBQcm9ncmFtOjptQ3VycmVudFNlcmlhbCA9IDE7Citjb25zdCBjaGFyICpmYWtlcGF0aCA9ICJDOlxcZmFrZXBhdGgiOworCitzdGQ6OnN0cmluZyBzdHIoaW50IGkpCit7CisgICAgY2hhciBidWZmZXJbMjBdOworICAgIHNwcmludGYoYnVmZmVyLCAiJWQiLCBpKTsKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitVbmlmb3JtOjpVbmlmb3JtKEdMZW51bSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmX25hbWUsIHVuc2lnbmVkIGludCBhcnJheVNpemUpIDogdHlwZSh0eXBlKSwgX25hbWUoX25hbWUpLCBuYW1lKFByb2dyYW06OnVuZGVjb3JhdGVVbmlmb3JtKF9uYW1lKSksIGFycmF5U2l6ZShhcnJheVNpemUpCit7CisgICAgaW50IGJ5dGVzID0gVW5pZm9ybVR5cGVTaXplKHR5cGUpICogYXJyYXlTaXplOworICAgIGRhdGEgPSBuZXcgdW5zaWduZWQgY2hhcltieXRlc107CisgICAgbWVtc2V0KGRhdGEsIDAsIGJ5dGVzKTsKKyAgICBkaXJ0eSA9IHRydWU7CisgICAgaGFuZGxlc1NldCA9IGZhbHNlOworfQorCitVbmlmb3JtOjp+VW5pZm9ybSgpCit7CisgICAgZGVsZXRlW10gZGF0YTsKK30KKworYm9vbCBVbmlmb3JtOjppc0FycmF5KCkKK3sKKyAgICByZXR1cm4gX25hbWUuY29tcGFyZSgwLCAzLCAiYXJfIikgPT0gMDsKK30KKworVW5pZm9ybUxvY2F0aW9uOjpVbmlmb3JtTG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJl9uYW1lLCB1bnNpZ25lZCBpbnQgZWxlbWVudCwgdW5zaWduZWQgaW50IGluZGV4KSAKKyAgICA6IG5hbWUoUHJvZ3JhbTo6dW5kZWNvcmF0ZVVuaWZvcm0oX25hbWUpKSwgZWxlbWVudChlbGVtZW50KSwgaW5kZXgoaW5kZXgpCit7Cit9CisKK1Byb2dyYW06OlByb2dyYW0oUmVzb3VyY2VNYW5hZ2VyICptYW5hZ2VyLCBHTHVpbnQgaGFuZGxlKSA6IG1SZXNvdXJjZU1hbmFnZXIobWFuYWdlciksIG1IYW5kbGUoaGFuZGxlKSwgbVNlcmlhbChpc3N1ZVNlcmlhbCgpKQoreworICAgIG1GcmFnbWVudFNoYWRlciA9IE5VTEw7CisgICAgbVZlcnRleFNoYWRlciA9IE5VTEw7CisKKyAgICBtUGl4ZWxFeGVjdXRhYmxlID0gTlVMTDsKKyAgICBtVmVydGV4RXhlY3V0YWJsZSA9IE5VTEw7CisgICAgbUNvbnN0YW50VGFibGVQUyA9IE5VTEw7CisgICAgbUNvbnN0YW50VGFibGVWUyA9IE5VTEw7CisKKyAgICBtSW5mb0xvZyA9IE5VTEw7CisgICAgbVZhbGlkYXRlZCA9IGZhbHNlOworCisgICAgdW5saW5rKCk7CisKKyAgICBtRGVsZXRlU3RhdHVzID0gZmFsc2U7CisKKyAgICBtUmVmQ291bnQgPSAwOworfQorCitQcm9ncmFtOjp+UHJvZ3JhbSgpCit7CisgICAgdW5saW5rKHRydWUpOworCisgICAgaWYobVZlcnRleFNoYWRlciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbVZlcnRleFNoYWRlci0+cmVsZWFzZSgpOworICAgIH0KKworICAgIGlmKG1GcmFnbWVudFNoYWRlciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbUZyYWdtZW50U2hhZGVyLT5yZWxlYXNlKCk7CisgICAgfQorfQorCitib29sIFByb2dyYW06OmF0dGFjaFNoYWRlcihTaGFkZXIgKnNoYWRlcikKK3sKKyAgICBpZihzaGFkZXItPmdldFR5cGUoKSA9PSBHTF9WRVJURVhfU0hBREVSKQorICAgIHsKKyAgICAgICAgaWYobVZlcnRleFNoYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVZlcnRleFNoYWRlciA9IChWZXJ0ZXhTaGFkZXIqKXNoYWRlcjsKKyAgICAgICAgbVZlcnRleFNoYWRlci0+YWRkUmVmKCk7CisgICAgfQorICAgIGVsc2UgaWYoc2hhZGVyLT5nZXRUeXBlKCkgPT0gR0xfRlJBR01FTlRfU0hBREVSKQorICAgIHsKKyAgICAgICAgaWYobUZyYWdtZW50U2hhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtRnJhZ21lbnRTaGFkZXIgPSAoRnJhZ21lbnRTaGFkZXIqKXNoYWRlcjsKKyAgICAgICAgbUZyYWdtZW50U2hhZGVyLT5hZGRSZWYoKTsKKyAgICB9CisgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6ZGV0YWNoU2hhZGVyKFNoYWRlciAqc2hhZGVyKQoreworICAgIGlmKHNoYWRlci0+Z2V0VHlwZSgpID09IEdMX1ZFUlRFWF9TSEFERVIpCisgICAgeworICAgICAgICBpZihtVmVydGV4U2hhZGVyICE9IHNoYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVZlcnRleFNoYWRlci0+cmVsZWFzZSgpOworICAgICAgICBtVmVydGV4U2hhZGVyID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZihzaGFkZXItPmdldFR5cGUoKSA9PSBHTF9GUkFHTUVOVF9TSEFERVIpCisgICAgeworICAgICAgICBpZihtRnJhZ21lbnRTaGFkZXIgIT0gc2hhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtRnJhZ21lbnRTaGFkZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUZyYWdtZW50U2hhZGVyID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBQcm9ncmFtOjpnZXRBdHRhY2hlZFNoYWRlcnNDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtVmVydGV4U2hhZGVyID8gMSA6IDApICsgKG1GcmFnbWVudFNoYWRlciA/IDEgOiAwKTsKK30KKworc3c6OlBpeGVsU2hhZGVyICpQcm9ncmFtOjpnZXRQaXhlbFNoYWRlcigpCit7CisgICAgcmV0dXJuIG1QaXhlbEV4ZWN1dGFibGU7Cit9CisKK3N3OjpWZXJ0ZXhTaGFkZXIgKlByb2dyYW06OmdldFZlcnRleFNoYWRlcigpCit7CisgICAgcmV0dXJuIG1WZXJ0ZXhFeGVjdXRhYmxlOworfQorCit2b2lkIFByb2dyYW06OmJpbmRBdHRyaWJ1dGVMb2NhdGlvbihHTHVpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYoaW5kZXggPCBNQVhfVkVSVEVYX0FUVFJJQlMpCisgICAgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1ZFUlRFWF9BVFRSSUJTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG1BdHRyaWJ1dGVCaW5kaW5nW2ldLmVyYXNlKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgbUF0dHJpYnV0ZUJpbmRpbmdbaW5kZXhdLmluc2VydChuYW1lKTsKKyAgICB9Cit9CisKK0dMdWludCBQcm9ncmFtOjpnZXRBdHRyaWJ1dGVMb2NhdGlvbihjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmKG5hbWUpCisgICAgeworICAgICAgICBmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCBNQVhfVkVSVEVYX0FUVFJJQlM7IGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1MaW5rZWRBdHRyaWJ1dGVbaW5kZXhdLm5hbWUgPT0gc3RkOjpzdHJpbmcobmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCitpbnQgUHJvZ3JhbTo6Z2V0U2VtYW50aWNJbmRleChpbnQgYXR0cmlidXRlSW5kZXgpCit7CisgICAgQVNTRVJUKGF0dHJpYnV0ZUluZGV4ID49IDAgJiYgYXR0cmlidXRlSW5kZXggPCBNQVhfVkVSVEVYX0FUVFJJQlMpOworICAgIAorICAgIHJldHVybiBtU2VtYW50aWNJbmRleFthdHRyaWJ1dGVJbmRleF07Cit9CisKKy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB0ZXh0dXJlIGltYWdlIHVuaXQgKDAtMTkpIGNvcnJlc3BvbmRpbmcgdG8gYSBEaXJlY3QzRCA5IHNhbXBsZXIKKy8vIGluZGV4ICgwLTE1IGZvciB0aGUgcGl4ZWwgc2hhZGVyIGFuZCAwLTMgZm9yIHRoZSB2ZXJ0ZXggc2hhZGVyKS4KK0dMaW50IFByb2dyYW06OmdldFNhbXBsZXJNYXBwaW5nKHN3OjpTYW1wbGVyVHlwZSB0eXBlLCB1bnNpZ25lZCBpbnQgc2FtcGxlckluZGV4KQoreworICAgIEdMdWludCBsb2dpY2FsVGV4dHVyZVVuaXQgPSAtMTsKKworICAgIHN3aXRjaCh0eXBlKQorICAgIHsKKwljYXNlIHN3OjpTQU1QTEVSX1BJWEVMOgorICAgICAgICBBU1NFUlQoc2FtcGxlckluZGV4IDwgc2l6ZW9mKG1TYW1wbGVyc1BTKS9zaXplb2YobVNhbXBsZXJzUFNbMF0pKTsKKworICAgICAgICBpZihtU2FtcGxlcnNQU1tzYW1wbGVySW5kZXhdLmFjdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9naWNhbFRleHR1cmVVbml0ID0gbVNhbXBsZXJzUFNbc2FtcGxlckluZGV4XS5sb2dpY2FsVGV4dHVyZVVuaXQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisJY2FzZSBzdzo6U0FNUExFUl9WRVJURVg6CisgICAgICAgIEFTU0VSVChzYW1wbGVySW5kZXggPCBzaXplb2YobVNhbXBsZXJzVlMpL3NpemVvZihtU2FtcGxlcnNWU1swXSkpOworCisgICAgICAgIGlmKG1TYW1wbGVyc1ZTW3NhbXBsZXJJbmRleF0uYWN0aXZlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dpY2FsVGV4dHVyZVVuaXQgPSBtU2FtcGxlcnNWU1tzYW1wbGVySW5kZXhdLmxvZ2ljYWxUZXh0dXJlVW5pdDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIGlmKGxvZ2ljYWxUZXh0dXJlVW5pdCA+PSAwICYmIGxvZ2ljYWxUZXh0dXJlVW5pdCA8IE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvZ2ljYWxUZXh0dXJlVW5pdDsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8vIFJldHVybnMgdGhlIHRleHR1cmUgdHlwZSBmb3IgYSBnaXZlbiBEaXJlY3QzRCA5IHNhbXBsZXIgdHlwZSBhbmQKKy8vIGluZGV4ICgwLTE1IGZvciB0aGUgcGl4ZWwgc2hhZGVyIGFuZCAwLTMgZm9yIHRoZSB2ZXJ0ZXggc2hhZGVyKS4KK1RleHR1cmVUeXBlIFByb2dyYW06OmdldFNhbXBsZXJUZXh0dXJlVHlwZShzdzo6U2FtcGxlclR5cGUgdHlwZSwgdW5zaWduZWQgaW50IHNhbXBsZXJJbmRleCkKK3sKKyAgICBzd2l0Y2godHlwZSkKKyAgICB7CisJY2FzZSBzdzo6U0FNUExFUl9QSVhFTDoKKyAgICAgICAgQVNTRVJUKHNhbXBsZXJJbmRleCA8IHNpemVvZihtU2FtcGxlcnNQUykvc2l6ZW9mKG1TYW1wbGVyc1BTWzBdKSk7CisgICAgICAgIEFTU0VSVChtU2FtcGxlcnNQU1tzYW1wbGVySW5kZXhdLmFjdGl2ZSk7CisgICAgICAgIHJldHVybiBtU2FtcGxlcnNQU1tzYW1wbGVySW5kZXhdLnRleHR1cmVUeXBlOworCWNhc2Ugc3c6OlNBTVBMRVJfVkVSVEVYOgorICAgICAgICBBU1NFUlQoc2FtcGxlckluZGV4IDwgc2l6ZW9mKG1TYW1wbGVyc1ZTKS9zaXplb2YobVNhbXBsZXJzVlNbMF0pKTsKKyAgICAgICAgQVNTRVJUKG1TYW1wbGVyc1ZTW3NhbXBsZXJJbmRleF0uYWN0aXZlKTsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVyc1ZTW3NhbXBsZXJJbmRleF0udGV4dHVyZVR5cGU7CisgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gVEVYVFVSRV8yRDsKK30KKworR0xpbnQgUHJvZ3JhbTo6Z2V0VW5pZm9ybUxvY2F0aW9uKHN0ZDo6c3RyaW5nIG5hbWUpCit7CisgICAgaW50IHN1YnNjcmlwdCA9IDA7CisKKyAgICAvLyBTdHJpcCBhbnkgdHJhaWxpbmcgYXJyYXkgb3BlcmF0b3IgYW5kIHJldHJpZXZlIHRoZSBzdWJzY3JpcHQKKyAgICBzaXplX3Qgb3BlbiA9IG5hbWUuZmluZF9sYXN0X29mKCdbJyk7CisgICAgc2l6ZV90IGNsb3NlID0gbmFtZS5maW5kX2xhc3Rfb2YoJ10nKTsKKyAgICBpZihvcGVuICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGNsb3NlID09IG5hbWUubGVuZ3RoKCkgLSAxKQorICAgIHsKKyAgICAgICAgc3Vic2NyaXB0ID0gYXRvaShuYW1lLnN1YnN0cihvcGVuICsgMSkuY19zdHIoKSk7CisgICAgICAgIG5hbWUuZXJhc2Uob3Blbik7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IG51bVVuaWZvcm1zID0gbVVuaWZvcm1JbmRleC5zaXplKCk7CisgICAgZm9yKHVuc2lnbmVkIGludCBsb2NhdGlvbiA9IDA7IGxvY2F0aW9uIDwgbnVtVW5pZm9ybXM7IGxvY2F0aW9uKyspCisgICAgeworICAgICAgICBpZihtVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5uYW1lID09IG5hbWUgJiYKKyAgICAgICAgICAgbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCA9PSBzdWJzY3JpcHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworYm9vbCBQcm9ncmFtOjpzZXRVbmlmb3JtMWZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KQoreworICAgIGlmKGxvY2F0aW9uIDwgMCB8fCBsb2NhdGlvbiA+PSAoaW50KW1Vbmlmb3JtSW5kZXguc2l6ZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFVuaWZvcm0gKnRhcmdldFVuaWZvcm0gPSBtVW5pZm9ybXNbbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uaW5kZXhdOworICAgIHRhcmdldFVuaWZvcm0tPmRpcnR5ID0gdHJ1ZTsKKworICAgIGlmKHRhcmdldFVuaWZvcm0tPnR5cGUgPT0gR0xfRkxPQVQpCisgICAgeworICAgICAgICBpbnQgYXJyYXlTaXplID0gdGFyZ2V0VW5pZm9ybS0+YXJyYXlTaXplOworCisgICAgICAgIGlmKGFycmF5U2l6ZSA9PSAxICYmIGNvdW50ID4gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYXR0ZW1wdGluZyB0byB3cml0ZSBhbiBhcnJheSB0byBhIG5vbi1hcnJheSB1bmlmb3JtIGlzIGFuIElOVkFMSURfT1BFUkFUSU9OCisKKyAgICAgICAgY291bnQgPSBzdGQ6Om1pbihhcnJheVNpemUgLSAoaW50KW1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQsIGNvdW50KTsKKworICAgICAgICBtZW1jcHkodGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBzaXplb2YoR0xmbG9hdCksCisgICAgICAgICAgICAgICB2LCBzaXplb2YoR0xmbG9hdCkgKiBjb3VudCk7CisgICAgfQorICAgIGVsc2UgaWYodGFyZ2V0VW5pZm9ybS0+dHlwZSA9PSBHTF9CT09MKQorICAgIHsKKyAgICAgICAgaW50IGFycmF5U2l6ZSA9IHRhcmdldFVuaWZvcm0tPmFycmF5U2l6ZTsKKworICAgICAgICBpZihhcnJheVNpemUgPT0gMSAmJiBjb3VudCA+IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGF0dGVtcHRpbmcgdG8gd3JpdGUgYW4gYXJyYXkgdG8gYSBub24tYXJyYXkgdW5pZm9ybSBpcyBhbiBJTlZBTElEX09QRVJBVElPTgorCisgICAgICAgIGNvdW50ID0gc3RkOjptaW4oYXJyYXlTaXplIC0gKGludCltVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50LCBjb3VudCk7CisgICAgICAgIEdMYm9vbGVhbiAqYm9vbFBhcmFtcyA9IG5ldyBHTGJvb2xlYW5bY291bnRdOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZih2W2ldID09IDAuMGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbFBhcmFtc1tpXSA9IEdMX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xQYXJhbXNbaV0gPSBHTF9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KHRhcmdldFVuaWZvcm0tPmRhdGEgKyBtVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50ICogc2l6ZW9mKEdMYm9vbGVhbiksCisgICAgICAgICAgICAgICBib29sUGFyYW1zLCBzaXplb2YoR0xib29sZWFuKSAqIGNvdW50KTsKKworICAgICAgICBkZWxldGUgW10gYm9vbFBhcmFtczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OnNldFVuaWZvcm0yZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpCit7CisgICAgaWYobG9jYXRpb24gPCAwIHx8IGxvY2F0aW9uID49IChpbnQpbVVuaWZvcm1JbmRleC5zaXplKCkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisgICAgdGFyZ2V0VW5pZm9ybS0+ZGlydHkgPSB0cnVlOworCisgICAgaWYodGFyZ2V0VW5pZm9ybS0+dHlwZSA9PSBHTF9GTE9BVF9WRUMyKQorICAgIHsKKyAgICAgICAgaW50IGFycmF5U2l6ZSA9IHRhcmdldFVuaWZvcm0tPmFycmF5U2l6ZTsKKworICAgICAgICBpZihhcnJheVNpemUgPT0gMSAmJiBjb3VudCA+IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGF0dGVtcHRpbmcgdG8gd3JpdGUgYW4gYXJyYXkgdG8gYSBub24tYXJyYXkgdW5pZm9ybSBpcyBhbiBJTlZBTElEX09QRVJBVElPTgorCisgICAgICAgIGNvdW50ID0gc3RkOjptaW4oYXJyYXlTaXplIC0gKGludCltVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50LCBjb3VudCk7CisKKyAgICAgICAgbWVtY3B5KHRhcmdldFVuaWZvcm0tPmRhdGEgKyBtVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50ICogc2l6ZW9mKEdMZmxvYXQpICogMiwKKyAgICAgICAgICAgICAgIHYsIDIgKiBzaXplb2YoR0xmbG9hdCkgKiBjb3VudCk7CisgICAgfQorICAgIGVsc2UgaWYodGFyZ2V0VW5pZm9ybS0+dHlwZSA9PSBHTF9CT09MX1ZFQzIpCisgICAgeworICAgICAgICBpbnQgYXJyYXlTaXplID0gdGFyZ2V0VW5pZm9ybS0+YXJyYXlTaXplOworCisgICAgICAgIGlmKGFycmF5U2l6ZSA9PSAxICYmIGNvdW50ID4gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYXR0ZW1wdGluZyB0byB3cml0ZSBhbiBhcnJheSB0byBhIG5vbi1hcnJheSB1bmlmb3JtIGlzIGFuIElOVkFMSURfT1BFUkFUSU9OCisKKyAgICAgICAgY291bnQgPSBzdGQ6Om1pbihhcnJheVNpemUgLSAoaW50KW1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQsIGNvdW50KTsKKworICAgICAgICBHTGJvb2xlYW4gKmJvb2xQYXJhbXMgPSBuZXcgR0xib29sZWFuW2NvdW50ICogMl07CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50ICogMjsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZih2W2ldID09IDAuMGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbFBhcmFtc1tpXSA9IEdMX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xQYXJhbXNbaV0gPSBHTF9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KHRhcmdldFVuaWZvcm0tPmRhdGEgKyBtVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50ICogc2l6ZW9mKEdMYm9vbGVhbikgKiAyLAorICAgICAgICAgICAgICAgYm9vbFBhcmFtcywgMiAqIHNpemVvZihHTGJvb2xlYW4pICogY291bnQpOworCisgICAgICAgIGRlbGV0ZSBbXSBib29sUGFyYW1zOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OnNldFVuaWZvcm0zZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpCit7CisgICAgaWYobG9jYXRpb24gPCAwIHx8IGxvY2F0aW9uID49IChpbnQpbVVuaWZvcm1JbmRleC5zaXplKCkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisgICAgdGFyZ2V0VW5pZm9ybS0+ZGlydHkgPSB0cnVlOworCisgICAgaWYodGFyZ2V0VW5pZm9ybS0+dHlwZSA9PSBHTF9GTE9BVF9WRUMzKQorICAgIHsKKyAgICAgICAgaW50IGFycmF5U2l6ZSA9IHRhcmdldFVuaWZvcm0tPmFycmF5U2l6ZTsKKworICAgICAgICBpZihhcnJheVNpemUgPT0gMSAmJiBjb3VudCA+IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGF0dGVtcHRpbmcgdG8gd3JpdGUgYW4gYXJyYXkgdG8gYSBub24tYXJyYXkgdW5pZm9ybSBpcyBhbiBJTlZBTElEX09QRVJBVElPTgorCisgICAgICAgIGNvdW50ID0gc3RkOjptaW4oYXJyYXlTaXplIC0gKGludCltVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50LCBjb3VudCk7CisKKyAgICAgICAgbWVtY3B5KHRhcmdldFVuaWZvcm0tPmRhdGEgKyBtVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50ICogc2l6ZW9mKEdMZmxvYXQpICogMywKKyAgICAgICAgICAgICAgIHYsIDMgKiBzaXplb2YoR0xmbG9hdCkgKiBjb3VudCk7CisgICAgfQorICAgIGVsc2UgaWYodGFyZ2V0VW5pZm9ybS0+dHlwZSA9PSBHTF9CT09MX1ZFQzMpCisgICAgeworICAgICAgICBpbnQgYXJyYXlTaXplID0gdGFyZ2V0VW5pZm9ybS0+YXJyYXlTaXplOworCisgICAgICAgIGlmKGFycmF5U2l6ZSA9PSAxICYmIGNvdW50ID4gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYXR0ZW1wdGluZyB0byB3cml0ZSBhbiBhcnJheSB0byBhIG5vbi1hcnJheSB1bmlmb3JtIGlzIGFuIElOVkFMSURfT1BFUkFUSU9OCisKKyAgICAgICAgY291bnQgPSBzdGQ6Om1pbihhcnJheVNpemUgLSAoaW50KW1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQsIGNvdW50KTsKKyAgICAgICAgR0xib29sZWFuICpib29sUGFyYW1zID0gbmV3IEdMYm9vbGVhbltjb3VudCAqIDNdOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudCAqIDM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYodltpXSA9PSAwLjBmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xQYXJhbXNbaV0gPSBHTF9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sUGFyYW1zW2ldID0gR0xfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSh0YXJnZXRVbmlmb3JtLT5kYXRhICsgbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCAqIHNpemVvZihHTGJvb2xlYW4pICogMywKKyAgICAgICAgICAgICAgIGJvb2xQYXJhbXMsIDMgKiBzaXplb2YoR0xib29sZWFuKSAqIGNvdW50KTsKKworICAgICAgICBkZWxldGUgW10gYm9vbFBhcmFtczsKKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcm9ncmFtOjpzZXRVbmlmb3JtNGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KQoreworICAgIGlmKGxvY2F0aW9uIDwgMCB8fCBsb2NhdGlvbiA+PSAoaW50KW1Vbmlmb3JtSW5kZXguc2l6ZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFVuaWZvcm0gKnRhcmdldFVuaWZvcm0gPSBtVW5pZm9ybXNbbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uaW5kZXhdOworICAgIHRhcmdldFVuaWZvcm0tPmRpcnR5ID0gdHJ1ZTsKKworICAgIGlmKHRhcmdldFVuaWZvcm0tPnR5cGUgPT0gR0xfRkxPQVRfVkVDNCkKKyAgICB7CisgICAgICAgIGludCBhcnJheVNpemUgPSB0YXJnZXRVbmlmb3JtLT5hcnJheVNpemU7CisKKyAgICAgICAgaWYoYXJyYXlTaXplID09IDEgJiYgY291bnQgPiAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhdHRlbXB0aW5nIHRvIHdyaXRlIGFuIGFycmF5IHRvIGEgbm9uLWFycmF5IHVuaWZvcm0gaXMgYW4gSU5WQUxJRF9PUEVSQVRJT04KKworICAgICAgICBjb3VudCA9IHN0ZDo6bWluKGFycmF5U2l6ZSAtIChpbnQpbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCwgY291bnQpOworCisgICAgICAgIG1lbWNweSh0YXJnZXRVbmlmb3JtLT5kYXRhICsgbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCAqIHNpemVvZihHTGZsb2F0KSAqIDQsCisgICAgICAgICAgICAgICB2LCA0ICogc2l6ZW9mKEdMZmxvYXQpICogY291bnQpOworICAgIH0KKyAgICBlbHNlIGlmKHRhcmdldFVuaWZvcm0tPnR5cGUgPT0gR0xfQk9PTF9WRUM0KQorICAgIHsKKyAgICAgICAgaW50IGFycmF5U2l6ZSA9IHRhcmdldFVuaWZvcm0tPmFycmF5U2l6ZTsKKworICAgICAgICBpZihhcnJheVNpemUgPT0gMSAmJiBjb3VudCA+IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGF0dGVtcHRpbmcgdG8gd3JpdGUgYW4gYXJyYXkgdG8gYSBub24tYXJyYXkgdW5pZm9ybSBpcyBhbiBJTlZBTElEX09QRVJBVElPTgorCisgICAgICAgIGNvdW50ID0gc3RkOjptaW4oYXJyYXlTaXplIC0gKGludCltVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50LCBjb3VudCk7CisgICAgICAgIEdMYm9vbGVhbiAqYm9vbFBhcmFtcyA9IG5ldyBHTGJvb2xlYW5bY291bnQgKiA0XTsKKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQgKiA0OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHZbaV0gPT0gMC4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sUGFyYW1zW2ldID0gR0xfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbFBhcmFtc1tpXSA9IEdMX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkodGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBzaXplb2YoR0xib29sZWFuKSAqIDQsCisgICAgICAgICAgICAgICBib29sUGFyYW1zLCA0ICogc2l6ZW9mKEdMYm9vbGVhbikgKiBjb3VudCk7CisKKyAgICAgICAgZGVsZXRlIFtdIGJvb2xQYXJhbXM7CisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6c2V0VW5pZm9ybU1hdHJpeDJmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpCit7CisgICAgaWYobG9jYXRpb24gPCAwIHx8IGxvY2F0aW9uID49IChpbnQpbVVuaWZvcm1JbmRleC5zaXplKCkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisgICAgdGFyZ2V0VW5pZm9ybS0+ZGlydHkgPSB0cnVlOworCisgICAgaWYodGFyZ2V0VW5pZm9ybS0+dHlwZSAhPSBHTF9GTE9BVF9NQVQyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludCBhcnJheVNpemUgPSB0YXJnZXRVbmlmb3JtLT5hcnJheVNpemU7CisKKyAgICBpZihhcnJheVNpemUgPT0gMSAmJiBjb3VudCA+IDEpCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYXR0ZW1wdGluZyB0byB3cml0ZSBhbiBhcnJheSB0byBhIG5vbi1hcnJheSB1bmlmb3JtIGlzIGFuIElOVkFMSURfT1BFUkFUSU9OCisKKyAgICBjb3VudCA9IHN0ZDo6bWluKGFycmF5U2l6ZSAtIChpbnQpbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCwgY291bnQpOworCisgICAgbWVtY3B5KHRhcmdldFVuaWZvcm0tPmRhdGEgKyBtVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50ICogc2l6ZW9mKEdMZmxvYXQpICogNCwKKyAgICAgICAgICAgdmFsdWUsIDQgKiBzaXplb2YoR0xmbG9hdCkgKiBjb3VudCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcm9ncmFtOjpzZXRVbmlmb3JtTWF0cml4M2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkKK3sKKyAgICBpZihsb2NhdGlvbiA8IDAgfHwgbG9jYXRpb24gPj0gKGludCltVW5pZm9ybUluZGV4LnNpemUoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKyAgICB0YXJnZXRVbmlmb3JtLT5kaXJ0eSA9IHRydWU7CisKKyAgICBpZih0YXJnZXRVbmlmb3JtLT50eXBlICE9IEdMX0ZMT0FUX01BVDMpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IGFycmF5U2l6ZSA9IHRhcmdldFVuaWZvcm0tPmFycmF5U2l6ZTsKKworICAgIGlmKGFycmF5U2l6ZSA9PSAxICYmIGNvdW50ID4gMSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhdHRlbXB0aW5nIHRvIHdyaXRlIGFuIGFycmF5IHRvIGEgbm9uLWFycmF5IHVuaWZvcm0gaXMgYW4gSU5WQUxJRF9PUEVSQVRJT04KKworICAgIGNvdW50ID0gc3RkOjptaW4oYXJyYXlTaXplIC0gKGludCltVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50LCBjb3VudCk7CisKKyAgICBtZW1jcHkodGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBzaXplb2YoR0xmbG9hdCkgKiA5LAorICAgICAgICAgICB2YWx1ZSwgOSAqIHNpemVvZihHTGZsb2F0KSAqIGNvdW50KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OnNldFVuaWZvcm1NYXRyaXg0ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKQoreworICAgIGlmKGxvY2F0aW9uIDwgMCB8fCBsb2NhdGlvbiA+PSAoaW50KW1Vbmlmb3JtSW5kZXguc2l6ZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFVuaWZvcm0gKnRhcmdldFVuaWZvcm0gPSBtVW5pZm9ybXNbbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uaW5kZXhdOworICAgIHRhcmdldFVuaWZvcm0tPmRpcnR5ID0gdHJ1ZTsKKworICAgIGlmKHRhcmdldFVuaWZvcm0tPnR5cGUgIT0gR0xfRkxPQVRfTUFUNCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgYXJyYXlTaXplID0gdGFyZ2V0VW5pZm9ybS0+YXJyYXlTaXplOworCisgICAgaWYoYXJyYXlTaXplID09IDEgJiYgY291bnQgPiAxKQorICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGF0dGVtcHRpbmcgdG8gd3JpdGUgYW4gYXJyYXkgdG8gYSBub24tYXJyYXkgdW5pZm9ybSBpcyBhbiBJTlZBTElEX09QRVJBVElPTgorCisgICAgY291bnQgPSBzdGQ6Om1pbihhcnJheVNpemUgLSAoaW50KW1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQsIGNvdW50KTsKKworICAgIG1lbWNweSh0YXJnZXRVbmlmb3JtLT5kYXRhICsgbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCAqIHNpemVvZihHTGZsb2F0KSAqIDE2LAorICAgICAgICAgICB2YWx1ZSwgMTYgKiBzaXplb2YoR0xmbG9hdCkgKiBjb3VudCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcm9ncmFtOjpzZXRVbmlmb3JtMWl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdikKK3sKKyAgICBpZihsb2NhdGlvbiA8IDAgfHwgbG9jYXRpb24gPj0gKGludCltVW5pZm9ybUluZGV4LnNpemUoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKyAgICB0YXJnZXRVbmlmb3JtLT5kaXJ0eSA9IHRydWU7CisKKyAgICBpZih0YXJnZXRVbmlmb3JtLT50eXBlID09IEdMX0lOVCB8fAorICAgICAgICB0YXJnZXRVbmlmb3JtLT50eXBlID09IEdMX1NBTVBMRVJfMkQgfHwKKyAgICAgICAgdGFyZ2V0VW5pZm9ybS0+dHlwZSA9PSBHTF9TQU1QTEVSX0NVQkUpCisgICAgeworICAgICAgICBpbnQgYXJyYXlTaXplID0gdGFyZ2V0VW5pZm9ybS0+YXJyYXlTaXplOworCisgICAgICAgIGlmKGFycmF5U2l6ZSA9PSAxICYmIGNvdW50ID4gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYXR0ZW1wdGluZyB0byB3cml0ZSBhbiBhcnJheSB0byBhIG5vbi1hcnJheSB1bmlmb3JtIGlzIGFuIElOVkFMSURfT1BFUkFUSU9OCisKKyAgICAgICAgY291bnQgPSBzdGQ6Om1pbihhcnJheVNpemUgLSAoaW50KW1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQsIGNvdW50KTsKKworICAgICAgICBtZW1jcHkodGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBzaXplb2YoR0xpbnQpLAorICAgICAgICAgICAgICAgdiwgc2l6ZW9mKEdMaW50KSAqIGNvdW50KTsKKyAgICB9CisgICAgZWxzZSBpZih0YXJnZXRVbmlmb3JtLT50eXBlID09IEdMX0JPT0wpCisgICAgeworICAgICAgICBpbnQgYXJyYXlTaXplID0gdGFyZ2V0VW5pZm9ybS0+YXJyYXlTaXplOworCisgICAgICAgIGlmKGFycmF5U2l6ZSA9PSAxICYmIGNvdW50ID4gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYXR0ZW1wdGluZyB0byB3cml0ZSBhbiBhcnJheSB0byBhIG5vbi1hcnJheSB1bmlmb3JtIGlzIGFuIElOVkFMSURfT1BFUkFUSU9OCisKKyAgICAgICAgY291bnQgPSBzdGQ6Om1pbihhcnJheVNpemUgLSAoaW50KW1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQsIGNvdW50KTsKKyAgICAgICAgR0xib29sZWFuICpib29sUGFyYW1zID0gbmV3IEdMYm9vbGVhbltjb3VudF07CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHZbaV0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sUGFyYW1zW2ldID0gR0xfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbFBhcmFtc1tpXSA9IEdMX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkodGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBzaXplb2YoR0xib29sZWFuKSwKKyAgICAgICAgICAgICAgIGJvb2xQYXJhbXMsIHNpemVvZihHTGJvb2xlYW4pICogY291bnQpOworCisgICAgICAgIGRlbGV0ZSBbXSBib29sUGFyYW1zOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6c2V0VW5pZm9ybTJpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYpCit7CisgICAgaWYobG9jYXRpb24gPCAwIHx8IGxvY2F0aW9uID49IChpbnQpbVVuaWZvcm1JbmRleC5zaXplKCkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisgICAgdGFyZ2V0VW5pZm9ybS0+ZGlydHkgPSB0cnVlOworCisgICAgaWYodGFyZ2V0VW5pZm9ybS0+dHlwZSA9PSBHTF9JTlRfVkVDMikKKyAgICB7CisgICAgICAgIGludCBhcnJheVNpemUgPSB0YXJnZXRVbmlmb3JtLT5hcnJheVNpemU7CisKKyAgICAgICAgaWYoYXJyYXlTaXplID09IDEgJiYgY291bnQgPiAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhdHRlbXB0aW5nIHRvIHdyaXRlIGFuIGFycmF5IHRvIGEgbm9uLWFycmF5IHVuaWZvcm0gaXMgYW4gSU5WQUxJRF9PUEVSQVRJT04KKworICAgICAgICBjb3VudCA9IHN0ZDo6bWluKGFycmF5U2l6ZSAtIChpbnQpbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCwgY291bnQpOworCisgICAgICAgIG1lbWNweSh0YXJnZXRVbmlmb3JtLT5kYXRhICsgbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCAqIHNpemVvZihHTGludCkgKiAyLAorICAgICAgICAgICAgICAgdiwgMiAqIHNpemVvZihHTGludCkgKiBjb3VudCk7CisgICAgfQorICAgIGVsc2UgaWYodGFyZ2V0VW5pZm9ybS0+dHlwZSA9PSBHTF9CT09MX1ZFQzIpCisgICAgeworICAgICAgICBpbnQgYXJyYXlTaXplID0gdGFyZ2V0VW5pZm9ybS0+YXJyYXlTaXplOworCisgICAgICAgIGlmKGFycmF5U2l6ZSA9PSAxICYmIGNvdW50ID4gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYXR0ZW1wdGluZyB0byB3cml0ZSBhbiBhcnJheSB0byBhIG5vbi1hcnJheSB1bmlmb3JtIGlzIGFuIElOVkFMSURfT1BFUkFUSU9OCisKKyAgICAgICAgY291bnQgPSBzdGQ6Om1pbihhcnJheVNpemUgLSAoaW50KW1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQsIGNvdW50KTsKKyAgICAgICAgR0xib29sZWFuICpib29sUGFyYW1zID0gbmV3IEdMYm9vbGVhbltjb3VudCAqIDJdOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudCAqIDI7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYodltpXSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xQYXJhbXNbaV0gPSBHTF9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sUGFyYW1zW2ldID0gR0xfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSh0YXJnZXRVbmlmb3JtLT5kYXRhICsgbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCAqIHNpemVvZihHTGJvb2xlYW4pICogMiwKKyAgICAgICAgICAgICAgIGJvb2xQYXJhbXMsIDIgKiBzaXplb2YoR0xib29sZWFuKSAqIGNvdW50KTsKKworICAgICAgICBkZWxldGUgW10gYm9vbFBhcmFtczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OnNldFVuaWZvcm0zaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2KQoreworICAgIGlmKGxvY2F0aW9uIDwgMCB8fCBsb2NhdGlvbiA+PSAoaW50KW1Vbmlmb3JtSW5kZXguc2l6ZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFVuaWZvcm0gKnRhcmdldFVuaWZvcm0gPSBtVW5pZm9ybXNbbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uaW5kZXhdOworICAgIHRhcmdldFVuaWZvcm0tPmRpcnR5ID0gdHJ1ZTsKKworICAgIGlmKHRhcmdldFVuaWZvcm0tPnR5cGUgPT0gR0xfSU5UX1ZFQzMpCisgICAgeworICAgICAgICBpbnQgYXJyYXlTaXplID0gdGFyZ2V0VW5pZm9ybS0+YXJyYXlTaXplOworCisgICAgICAgIGlmKGFycmF5U2l6ZSA9PSAxICYmIGNvdW50ID4gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYXR0ZW1wdGluZyB0byB3cml0ZSBhbiBhcnJheSB0byBhIG5vbi1hcnJheSB1bmlmb3JtIGlzIGFuIElOVkFMSURfT1BFUkFUSU9OCisKKyAgICAgICAgY291bnQgPSBzdGQ6Om1pbihhcnJheVNpemUgLSAoaW50KW1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQsIGNvdW50KTsKKworICAgICAgICBtZW1jcHkodGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBzaXplb2YoR0xpbnQpICogMywKKyAgICAgICAgICAgICAgIHYsIDMgKiBzaXplb2YoR0xpbnQpICogY291bnQpOworICAgIH0KKyAgICBlbHNlIGlmKHRhcmdldFVuaWZvcm0tPnR5cGUgPT0gR0xfQk9PTF9WRUMzKQorICAgIHsKKyAgICAgICAgaW50IGFycmF5U2l6ZSA9IHRhcmdldFVuaWZvcm0tPmFycmF5U2l6ZTsKKworICAgICAgICBpZihhcnJheVNpemUgPT0gMSAmJiBjb3VudCA+IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGF0dGVtcHRpbmcgdG8gd3JpdGUgYW4gYXJyYXkgdG8gYSBub24tYXJyYXkgdW5pZm9ybSBpcyBhbiBJTlZBTElEX09QRVJBVElPTgorCisgICAgICAgIGNvdW50ID0gc3RkOjptaW4oYXJyYXlTaXplIC0gKGludCltVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50LCBjb3VudCk7CisgICAgICAgIEdMYm9vbGVhbiAqYm9vbFBhcmFtcyA9IG5ldyBHTGJvb2xlYW5bY291bnQgKiAzXTsKKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQgKiAzOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHZbaV0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sUGFyYW1zW2ldID0gR0xfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbFBhcmFtc1tpXSA9IEdMX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkodGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBzaXplb2YoR0xib29sZWFuKSAqIDMsCisgICAgICAgICAgICAgICBib29sUGFyYW1zLCAzICogc2l6ZW9mKEdMYm9vbGVhbikgKiBjb3VudCk7CisKKyAgICAgICAgZGVsZXRlIFtdIGJvb2xQYXJhbXM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcm9ncmFtOjpzZXRVbmlmb3JtNGl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdikKK3sKKyAgICBpZihsb2NhdGlvbiA8IDAgfHwgbG9jYXRpb24gPj0gKGludCltVW5pZm9ybUluZGV4LnNpemUoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKyAgICB0YXJnZXRVbmlmb3JtLT5kaXJ0eSA9IHRydWU7CisKKyAgICBpZih0YXJnZXRVbmlmb3JtLT50eXBlID09IEdMX0lOVF9WRUM0KQorICAgIHsKKyAgICAgICAgaW50IGFycmF5U2l6ZSA9IHRhcmdldFVuaWZvcm0tPmFycmF5U2l6ZTsKKworICAgICAgICBpZihhcnJheVNpemUgPT0gMSAmJiBjb3VudCA+IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGF0dGVtcHRpbmcgdG8gd3JpdGUgYW4gYXJyYXkgdG8gYSBub24tYXJyYXkgdW5pZm9ybSBpcyBhbiBJTlZBTElEX09QRVJBVElPTgorCisgICAgICAgIGNvdW50ID0gc3RkOjptaW4oYXJyYXlTaXplIC0gKGludCltVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50LCBjb3VudCk7CisKKyAgICAgICAgbWVtY3B5KHRhcmdldFVuaWZvcm0tPmRhdGEgKyBtVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50ICogc2l6ZW9mKEdMaW50KSAqIDQsCisgICAgICAgICAgICAgICB2LCA0ICogc2l6ZW9mKEdMaW50KSAqIGNvdW50KTsKKyAgICB9CisgICAgZWxzZSBpZih0YXJnZXRVbmlmb3JtLT50eXBlID09IEdMX0JPT0xfVkVDNCkKKyAgICB7CisgICAgICAgIGludCBhcnJheVNpemUgPSB0YXJnZXRVbmlmb3JtLT5hcnJheVNpemU7CisKKyAgICAgICAgaWYoYXJyYXlTaXplID09IDEgJiYgY291bnQgPiAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhdHRlbXB0aW5nIHRvIHdyaXRlIGFuIGFycmF5IHRvIGEgbm9uLWFycmF5IHVuaWZvcm0gaXMgYW4gSU5WQUxJRF9PUEVSQVRJT04KKworICAgICAgICBjb3VudCA9IHN0ZDo6bWluKGFycmF5U2l6ZSAtIChpbnQpbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCwgY291bnQpOworICAgICAgICBHTGJvb2xlYW4gKmJvb2xQYXJhbXMgPSBuZXcgR0xib29sZWFuW2NvdW50ICogNF07CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50ICogNDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZih2W2ldID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbFBhcmFtc1tpXSA9IEdMX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xQYXJhbXNbaV0gPSBHTF9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KHRhcmdldFVuaWZvcm0tPmRhdGEgKyBtVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5lbGVtZW50ICogc2l6ZW9mKEdMYm9vbGVhbikgKiA0LAorICAgICAgICAgICAgICAgYm9vbFBhcmFtcywgNCAqIHNpemVvZihHTGJvb2xlYW4pICogY291bnQpOworCisgICAgICAgIGRlbGV0ZSBbXSBib29sUGFyYW1zOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6Z2V0VW5pZm9ybWZ2KEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpCit7CisgICAgaWYobG9jYXRpb24gPCAwIHx8IGxvY2F0aW9uID49IChpbnQpbVVuaWZvcm1JbmRleC5zaXplKCkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisKKyAgICB1bnNpZ25lZCBpbnQgY291bnQgPSBVbmlmb3JtQ29tcG9uZW50Q291bnQodGFyZ2V0VW5pZm9ybS0+dHlwZSk7CisKKyAgICBzd2l0Y2ggKFVuaWZvcm1Db21wb25lbnRUeXBlKHRhcmdldFVuaWZvcm0tPnR5cGUpKQorICAgIHsKKyAgICAgIGNhc2UgR0xfQk9PTDoKKyAgICAgICAgeworICAgICAgICAgICAgR0xib29sZWFuICpib29sUGFyYW1zID0gKEdMYm9vbGVhbiopdGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBjb3VudDsKKworICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYW1zW2ldID0gKGJvb2xQYXJhbXNbaV0gPT0gR0xfRkFMU0UpID8gMC4wZiA6IDEuMGY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICBtZW1jcHkocGFyYW1zLCB0YXJnZXRVbmlmb3JtLT5kYXRhICsgbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCAqIGNvdW50ICogc2l6ZW9mKEdMZmxvYXQpLAorICAgICAgICAgICAgICAgY291bnQgKiBzaXplb2YoR0xmbG9hdCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfSU5UOgorICAgICAgICB7CisgICAgICAgICAgICBHTGludCAqaW50UGFyYW1zID0gKEdMaW50Kil0YXJnZXRVbmlmb3JtLT5kYXRhICsgbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCAqIGNvdW50OworCisgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSAoZmxvYXQpaW50UGFyYW1zW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcm9ncmFtOjpnZXRVbmlmb3JtaXYoR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMpCit7CisgICAgaWYobG9jYXRpb24gPCAwIHx8IGxvY2F0aW9uID49IChpbnQpbVVuaWZvcm1JbmRleC5zaXplKCkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisKKyAgICB1bnNpZ25lZCBpbnQgY291bnQgPSBVbmlmb3JtQ29tcG9uZW50Q291bnQodGFyZ2V0VW5pZm9ybS0+dHlwZSk7CisKKyAgICBzd2l0Y2ggKFVuaWZvcm1Db21wb25lbnRUeXBlKHRhcmdldFVuaWZvcm0tPnR5cGUpKQorICAgIHsKKyAgICAgIGNhc2UgR0xfQk9PTDoKKyAgICAgICAgeworICAgICAgICAgICAgR0xib29sZWFuICpib29sUGFyYW1zID0gdGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBjb3VudDsKKworICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYW1zW2ldID0gKEdMaW50KWJvb2xQYXJhbXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0ICpmbG9hdFBhcmFtcyA9IChHTGZsb2F0Kil0YXJnZXRVbmlmb3JtLT5kYXRhICsgbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCAqIGNvdW50OworCisgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSAoR0xpbnQpZmxvYXRQYXJhbXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0lOVDoKKyAgICAgICAgbWVtY3B5KHBhcmFtcywgdGFyZ2V0VW5pZm9ybS0+ZGF0YSArIG1Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmVsZW1lbnQgKiBjb3VudCAqIHNpemVvZihHTGludCksCisgICAgICAgICAgICAgICBjb3VudCAqIHNpemVvZihHTGludCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6ZGlydHlBbGxVbmlmb3JtcygpCit7CisgICAgdW5zaWduZWQgaW50IG51bVVuaWZvcm1zID0gbVVuaWZvcm1zLnNpemUoKTsKKyAgICBmb3IodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBudW1Vbmlmb3JtczsgaW5kZXgrKykKKyAgICB7CisgICAgICAgIG1Vbmlmb3Jtc1tpbmRleF0tPmRpcnR5ID0gdHJ1ZTsKKyAgICB9Cit9CisKKy8vIEFwcGxpZXMgYWxsIHRoZSB1bmlmb3JtcyBzZXQgZm9yIHRoaXMgcHJvZ3JhbSBvYmplY3QgdG8gdGhlIERpcmVjdDNEIDkgZGV2aWNlCit2b2lkIFByb2dyYW06OmFwcGx5VW5pZm9ybXMoKQoreworICAgIHVuc2lnbmVkIGludCBudW1Vbmlmb3JtcyA9IG1Vbmlmb3JtSW5kZXguc2l6ZSgpOworICAgIGZvcih1bnNpZ25lZCBpbnQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IG51bVVuaWZvcm1zOyBsb2NhdGlvbisrKQorICAgIHsKKyAgICAgICAgaWYobVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uZWxlbWVudCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFVuaWZvcm0gKnRhcmdldFVuaWZvcm0gPSBtVW5pZm9ybXNbbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uaW5kZXhdOworCisgICAgICAgIGlmKHRhcmdldFVuaWZvcm0tPmRpcnR5KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYXJyYXlTaXplID0gdGFyZ2V0VW5pZm9ybS0+YXJyYXlTaXplOworICAgICAgICAgICAgR0xmbG9hdCAqZiA9IChHTGZsb2F0Kil0YXJnZXRVbmlmb3JtLT5kYXRhOworICAgICAgICAgICAgR0xpbnQgKmkgPSAoR0xpbnQqKXRhcmdldFVuaWZvcm0tPmRhdGE7CisgICAgICAgICAgICBHTGJvb2xlYW4gKmIgPSAoR0xib29sZWFuKil0YXJnZXRVbmlmb3JtLT5kYXRhOworCisgICAgICAgICAgICBzd2l0Y2ggKHRhcmdldFVuaWZvcm0tPnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQk9PTDogICAgICAgYXBwbHlVbmlmb3JtMWJ2KGxvY2F0aW9uLCBhcnJheVNpemUsIGIpOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9CT09MX1ZFQzI6ICBhcHBseVVuaWZvcm0yYnYobG9jYXRpb24sIGFycmF5U2l6ZSwgYik7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0JPT0xfVkVDMzogIGFwcGx5VW5pZm9ybTNidihsb2NhdGlvbiwgYXJyYXlTaXplLCBiKTsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfQk9PTF9WRUM0OiAgYXBwbHlVbmlmb3JtNGJ2KGxvY2F0aW9uLCBhcnJheVNpemUsIGIpOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9GTE9BVDogICAgICBhcHBseVVuaWZvcm0xZnYobG9jYXRpb24sIGFycmF5U2l6ZSwgZik7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzI6IGFwcGx5VW5pZm9ybTJmdihsb2NhdGlvbiwgYXJyYXlTaXplLCBmKTsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMzogYXBwbHlVbmlmb3JtM2Z2KGxvY2F0aW9uLCBhcnJheVNpemUsIGYpOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUM0OiBhcHBseVVuaWZvcm00ZnYobG9jYXRpb24sIGFycmF5U2l6ZSwgZik7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0ZMT0FUX01BVDI6IGFwcGx5VW5pZm9ybU1hdHJpeDJmdihsb2NhdGlvbiwgYXJyYXlTaXplLCBmKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUMzogYXBwbHlVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBhcnJheVNpemUsIGYpOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQ0OiBhcHBseVVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGFycmF5U2l6ZSwgZik7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1NBTVBMRVJfMkQ6CisgICAgICAgICAgICAgIGNhc2UgR0xfU0FNUExFUl9DVUJFOgorICAgICAgICAgICAgICBjYXNlIEdMX0lOVDogICAgICAgIGFwcGx5VW5pZm9ybTFpdihsb2NhdGlvbiwgYXJyYXlTaXplLCBpKTsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfSU5UX1ZFQzI6ICAgYXBwbHlVbmlmb3JtMml2KGxvY2F0aW9uLCBhcnJheVNpemUsIGkpOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9JTlRfVkVDMzogICBhcHBseVVuaWZvcm0zaXYobG9jYXRpb24sIGFycmF5U2l6ZSwgaSk7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0lOVF9WRUM0OiAgIGFwcGx5VW5pZm9ybTRpdihsb2NhdGlvbiwgYXJyYXlTaXplLCBpKTsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFyZ2V0VW5pZm9ybS0+ZGlydHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gQ29tcGlsZXMgdGhlIEhMU0wgY29kZSBvZiB0aGUgYXR0YWNoZWQgc2hhZGVycyBpbnRvIGV4ZWN1dGFibGUgYmluYXJpZXMKK0lEM0QxMEJsb2IgKlByb2dyYW06OmNvbXBpbGVUb0JpbmFyeShjb25zdCBjaGFyICpobHNsLCBjb25zdCBjaGFyICpwcm9maWxlLCBJRDNEWENvbnN0YW50VGFibGUgKipjb25zdGFudFRhYmxlKQoreworICAgIGlmKCFobHNsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVUlOVCBmbGFncyA9IEFOR0xFX0NPTVBJTEVfT1BUSU1JWkFUSU9OX0xFVkVMOworCisgICAgSUQzRDEwQmxvYiAqYmluYXJ5ID0gTlVMTDsKKyAgICBJRDNEMTBCbG9iICplcnJvck1lc3NhZ2UgPSBOVUxMOworICAgIEhSRVNVTFQgcmVzdWx0ID0gRDNEQ29tcGlsZShobHNsLCBzdHJsZW4oaGxzbCksIGZha2VwYXRoLCBOVUxMLCBOVUxMLCAibWFpbiIsIHByb2ZpbGUsIGZsYWdzLCAwLCAmYmluYXJ5LCAmZXJyb3JNZXNzYWdlKTsKKworICAgIGlmKGVycm9yTWVzc2FnZSkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UgPSAoY29uc3QgY2hhciopZXJyb3JNZXNzYWdlLT5HZXRCdWZmZXJQb2ludGVyKCk7CisKKyAgICAgICAgYXBwZW5kVG9JbmZvTG9nU2FuaXRpemVkKG1lc3NhZ2UpOworICAgICAgICBUUkFDRSgiXG4lcyIsIGhsc2wpOworICAgICAgICBUUkFDRSgiXG4lcyIsIG1lc3NhZ2UpOworCisgICAgICAgIGVycm9yTWVzc2FnZS0+UmVsZWFzZSgpOworICAgICAgICBlcnJvck1lc3NhZ2UgPSBOVUxMOworICAgIH0KKworICAgIGlmKEZBSUxFRChyZXN1bHQpKQorICAgIHsKKyAgICAgICAgaWYocmVzdWx0ID09IEQzREVSUl9PVVRPRlZJREVPTUVNT1JZIHx8IHJlc3VsdCA9PSBFX09VVE9GTUVNT1JZKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJlc3VsdCA9IEQzRFhHZXRTaGFkZXJDb25zdGFudFRhYmxlKHN0YXRpY19jYXN0PGNvbnN0IERXT1JEKj4oYmluYXJ5LT5HZXRCdWZmZXJQb2ludGVyKCkpLCBjb25zdGFudFRhYmxlKTsKKworICAgIGlmKEZBSUxFRChyZXN1bHQpKQorICAgIHsKKyAgICAgICAgaWYocmVzdWx0ID09IEQzREVSUl9PVVRPRlZJREVPTUVNT1JZIHx8IHJlc3VsdCA9PSBFX09VVE9GTUVNT1JZKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICAgICAgfQorCisgICAgICAgIGJpbmFyeS0+UmVsZWFzZSgpOworCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBiaW5hcnk7Cit9CisKKy8vIFBhY2tzIHZhcnlpbmdzIGludG8gZ2VuZXJpYyB2YXJ5aW5nIHJlZ2lzdGVycywgdXNpbmcgdGhlIGFsZ29yaXRobSBmcm9tIFtPcGVuR0wgRVMgU2hhZGluZyBMYW5ndWFnZSAxLjAwIHJldi4gMTddIGFwcGVuZGl4IEEgc2VjdGlvbiA3IHBhZ2UgMTExCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdXNlZCB2YXJ5aW5nIHJlZ2lzdGVycywgb3IgLTEgaWYgdW5zdWNjZXNmdWwKK2ludCBQcm9ncmFtOjpwYWNrVmFyeWluZ3MoY29uc3QgVmFyeWluZyAqcGFja2luZ1tdWzRdKQoreworICAgIENvbnRleHQgKmNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisKKyAgICBmb3IoVmFyeWluZ0xpc3Q6Oml0ZXJhdG9yIHZhcnlpbmcgPSBtRnJhZ21lbnRTaGFkZXItPnZhcnlpbmdzLmJlZ2luKCk7IHZhcnlpbmcgIT0gbUZyYWdtZW50U2hhZGVyLT52YXJ5aW5ncy5lbmQoKTsgdmFyeWluZysrKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBWYXJpYWJsZVJvd0NvdW50KHZhcnlpbmctPnR5cGUpICogdmFyeWluZy0+c2l6ZTsKKyAgICAgICAgaW50IG0gPSBWYXJpYWJsZUNvbHVtbkNvdW50KHZhcnlpbmctPnR5cGUpOworICAgICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgICAgICBpZihtID09IDIgfHwgbSA9PSAzIHx8IG0gPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGludCByID0gMDsgciA8PSBNQVhfVkFSWUlOR19WRUNUT1JTIC0gbiAmJiAhc3VjY2VzczsgcisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgYXZhaWxhYmxlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGZvcihpbnQgeSA9IDA7IHkgPCBuICYmIGF2YWlsYWJsZTsgeSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGludCB4ID0gMDsgeCA8IG0gJiYgYXZhaWxhYmxlOyB4KyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhY2tpbmdbciArIHldW3hdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoYXZhaWxhYmxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyeWluZy0+cmVnID0gcjsKKyAgICAgICAgICAgICAgICAgICAgdmFyeWluZy0+Y29sID0gMDsKKworICAgICAgICAgICAgICAgICAgICBmb3IoaW50IHkgPSAwOyB5IDwgbjsgeSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgbTsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tpbmdbciArIHldW3hdID0gJip2YXJ5aW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighc3VjY2VzcyAmJiBtID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKGludCByID0gTUFYX1ZBUllJTkdfVkVDVE9SUyAtIG47IHIgPj0gMCAmJiAhc3VjY2Vzczsgci0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBhdmFpbGFibGUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgeSA9IDA7IHkgPCBuICYmIGF2YWlsYWJsZTsgeSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IHggPSAyOyB4IDwgNCAmJiBhdmFpbGFibGU7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYWNraW5nW3IgKyB5XVt4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKGF2YWlsYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyeWluZy0+cmVnID0gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcnlpbmctPmNvbCA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgeSA9IDA7IHkgPCBuOyB5KyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCB4ID0gMjsgeCA8IDQ7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tpbmdbciArIHldW3hdID0gJip2YXJ5aW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihtID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzcGFjZVs0XSA9IHswfTsKKworICAgICAgICAgICAgZm9yKGludCB5ID0gMDsgeSA8IE1BWF9WQVJZSU5HX1ZFQ1RPUlM7IHkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgNDsgeCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3BhY2VbeF0gKz0gcGFja2luZ1t5XVt4XSA/IDAgOiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGNvbHVtbiA9IDA7CisKKyAgICAgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VbeF0gPj0gbiAmJiBzcGFjZVt4XSA8IHNwYWNlW2NvbHVtbl0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoc3BhY2VbY29sdW1uXSA+PSBuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihpbnQgciA9IDA7IHIgPCBNQVhfVkFSWUlOR19WRUNUT1JTOyByKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZighcGFja2luZ1tyXVtjb2x1bW5dKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJ5aW5nLT5yZWcgPSByOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IHkgPSByOyB5IDwgciArIG47IHkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNraW5nW3ldW2NvbHVtbl0gPSAmKnZhcnlpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyeWluZy0+Y29sID0gY29sdW1uOworCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworCisgICAgICAgIGlmKCFzdWNjZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBhcHBlbmRUb0luZm9Mb2coIkNvdWxkIG5vdCBwYWNrIHZhcnlpbmcgJXMiLCB2YXJ5aW5nLT5uYW1lLmNfc3RyKCkpOworCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiB1c2VkIHJlZ2lzdGVycworICAgIGludCByZWdpc3RlcnMgPSAwOworCisgICAgZm9yKGludCByID0gMDsgciA8IE1BWF9WQVJZSU5HX1ZFQ1RPUlM7IHIrKykKKyAgICB7CisgICAgICAgIGlmKHBhY2tpbmdbcl1bMF0gfHwgcGFja2luZ1tyXVsxXSB8fCBwYWNraW5nW3JdWzJdIHx8IHBhY2tpbmdbcl1bM10pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVycysrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlZ2lzdGVyczsKK30KKworYm9vbCBQcm9ncmFtOjpsaW5rVmFyeWluZ3MoKQoreworICAgIGlmKG1QaXhlbEhMU0wuZW1wdHkoKSB8fCBtVmVydGV4SExTTC5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlc2V0IHRoZSB2YXJ5aW5nIHJlZ2lzdGVyIGFzc2lnbm1lbnRzCisgICAgZm9yKFZhcnlpbmdMaXN0OjppdGVyYXRvciBmcmFnVmFyID0gbUZyYWdtZW50U2hhZGVyLT52YXJ5aW5ncy5iZWdpbigpOyBmcmFnVmFyICE9IG1GcmFnbWVudFNoYWRlci0+dmFyeWluZ3MuZW5kKCk7IGZyYWdWYXIrKykKKyAgICB7CisgICAgICAgIGZyYWdWYXItPnJlZyA9IC0xOworICAgICAgICBmcmFnVmFyLT5jb2wgPSAtMTsKKyAgICB9CisKKyAgICBmb3IoVmFyeWluZ0xpc3Q6Oml0ZXJhdG9yIHZ0eFZhciA9IG1WZXJ0ZXhTaGFkZXItPnZhcnlpbmdzLmJlZ2luKCk7IHZ0eFZhciAhPSBtVmVydGV4U2hhZGVyLT52YXJ5aW5ncy5lbmQoKTsgdnR4VmFyKyspCisgICAgeworICAgICAgICB2dHhWYXItPnJlZyA9IC0xOworICAgICAgICB2dHhWYXItPmNvbCA9IC0xOworICAgIH0KKworICAgIC8vIE1hcCB0aGUgdmFyeWluZ3MgdG8gdGhlIHJlZ2lzdGVyIGZpbGUKKyAgICBjb25zdCBWYXJ5aW5nICpwYWNraW5nW01BWF9WQVJZSU5HX1ZFQ1RPUlNdWzRdID0ge05VTEx9OworICAgIGludCByZWdpc3RlcnMgPSBwYWNrVmFyeWluZ3MocGFja2luZyk7CisKKyAgICBpZihyZWdpc3RlcnMgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBITFNMIGlucHV0L291dHB1dCBkZWNsYXJhdGlvbnMKKyAgICBDb250ZXh0ICpjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworCisgICAgaWYocmVnaXN0ZXJzID09IE1BWF9WQVJZSU5HX1ZFQ1RPUlMgJiYgbUZyYWdtZW50U2hhZGVyLT5tVXNlc0ZyYWdDb29yZCkKKyAgICB7CisgICAgICAgIGFwcGVuZFRvSW5mb0xvZygiTm8gdmFyeWluZyByZWdpc3RlcnMgbGVmdCB0byBzdXBwb3J0IGdsX0ZyYWdDb29yZCIpOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IoVmFyeWluZ0xpc3Q6Oml0ZXJhdG9yIGlucHV0ID0gbUZyYWdtZW50U2hhZGVyLT52YXJ5aW5ncy5iZWdpbigpOyBpbnB1dCAhPSBtRnJhZ21lbnRTaGFkZXItPnZhcnlpbmdzLmVuZCgpOyBpbnB1dCsrKQorICAgIHsKKyAgICAgICAgYm9vbCBtYXRjaGVkID0gZmFsc2U7CisKKyAgICAgICAgZm9yKFZhcnlpbmdMaXN0OjppdGVyYXRvciBvdXRwdXQgPSBtVmVydGV4U2hhZGVyLT52YXJ5aW5ncy5iZWdpbigpOyBvdXRwdXQgIT0gbVZlcnRleFNoYWRlci0+dmFyeWluZ3MuZW5kKCk7IG91dHB1dCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihvdXRwdXQtPm5hbWUgPT0gaW5wdXQtPm5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYob3V0cHV0LT50eXBlICE9IGlucHV0LT50eXBlIHx8IG91dHB1dC0+c2l6ZSAhPSBpbnB1dC0+c2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvSW5mb0xvZygiVHlwZSBvZiB2ZXJ0ZXggdmFyeWluZyAlcyBkb2VzIG5vdCBtYXRjaCB0aGF0IG9mIHRoZSBmcmFnbWVudCB2YXJ5aW5nIiwgb3V0cHV0LT5uYW1lLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvdXRwdXQtPnJlZyA9IGlucHV0LT5yZWc7CisgICAgICAgICAgICAgICAgb3V0cHV0LT5jb2wgPSBpbnB1dC0+Y29sOworCisgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZighbWF0Y2hlZCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBwZW5kVG9JbmZvTG9nKCJGcmFnbWVudCB2YXJ5aW5nICVzIGRvZXMgbm90IG1hdGNoIGFueSB2ZXJ0ZXggdmFyeWluZyIsIGlucHV0LT5uYW1lLmNfc3RyKCkpOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtVmVydGV4SExTTCArPSAic3RydWN0IFZTX0lOUFVUXG4iCisgICAgICAgICAgICAgICAgICAgIntcbiI7CisKKyAgICBpbnQgc2VtYW50aWNJbmRleCA9IDA7CisgICAgZm9yKEF0dHJpYnV0ZUFycmF5OjppdGVyYXRvciBhdHRyaWJ1dGUgPSBtVmVydGV4U2hhZGVyLT5tQXR0cmlidXRlcy5iZWdpbigpOyBhdHRyaWJ1dGUgIT0gbVZlcnRleFNoYWRlci0+bUF0dHJpYnV0ZXMuZW5kKCk7IGF0dHJpYnV0ZSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhdHRyaWJ1dGUtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX0ZMT0FUOiAgICAgIG1WZXJ0ZXhITFNMICs9ICIgICAgZmxvYXQgIjsgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUMyOiBtVmVydGV4SExTTCArPSAiICAgIGZsb2F0MiAiOyAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMzogbVZlcnRleEhMU0wgKz0gIiAgICBmbG9hdDMgIjsgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzQ6IG1WZXJ0ZXhITFNMICs9ICIgICAgZmxvYXQ0ICI7ICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQyOiBtVmVydGV4SExTTCArPSAiICAgIGZsb2F0MngyICI7IGJyZWFrOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUMzogbVZlcnRleEhMU0wgKz0gIiAgICBmbG9hdDN4MyAiOyBicmVhazsKKyAgICAgICAgICBjYXNlIEdMX0ZMT0FUX01BVDQ6IG1WZXJ0ZXhITFNMICs9ICIgICAgZmxvYXQ0eDQgIjsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogIFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIH0KKworICAgICAgICBtVmVydGV4SExTTCArPSBkZWNvcmF0ZUF0dHJpYnV0ZShhdHRyaWJ1dGUtPm5hbWUpICsgIiA6IFRFWENPT1JEIiArIHN0cihzZW1hbnRpY0luZGV4KSArICI7XG4iOworCisgICAgICAgIHNlbWFudGljSW5kZXggKz0gVmFyaWFibGVSb3dDb3VudChhdHRyaWJ1dGUtPnR5cGUpOworICAgIH0KKworICAgIG1WZXJ0ZXhITFNMICs9ICJ9O1xuIgorICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAic3RydWN0IFZTX09VVFBVVFxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBmbG9hdDQgZ2xfUG9zaXRpb24gOiBQT1NJVElPTjtcbiI7CisKKyAgICBmb3IoaW50IHIgPSAwOyByIDwgcmVnaXN0ZXJzOyByKyspCisgICAgeworICAgICAgICBpbnQgcmVnaXN0ZXJTaXplID0gcGFja2luZ1tyXVszXSA/IDQgOiAocGFja2luZ1tyXVsyXSA/IDMgOiAocGFja2luZ1tyXVsxXSA/IDIgOiAxKSk7CisKKyAgICAgICAgbVZlcnRleEhMU0wgKz0gIiAgICBmbG9hdCIgKyBzdHIocmVnaXN0ZXJTaXplKSArICIgdiIgKyBzdHIocikgKyAiIDogQ09MT1IiICsgc3RyKHIpICsgIjtcbiI7CisgICAgfQorCisgICAgaWYobUZyYWdtZW50U2hhZGVyLT5tVXNlc0ZyYWdDb29yZCkKKyAgICB7CisgICAgICAgIG1WZXJ0ZXhITFNMICs9ICIgICAgZmxvYXQ0IGdsX0ZyYWdDb29yZCA6IENPTE9SIiArIHN0cihyZWdpc3RlcnMpICsgIjtcbiI7CisgICAgfQorCisgICAgaWYobVZlcnRleFNoYWRlci0+bVVzZXNQb2ludFNpemUpCisgICAgeworICAgICAgICBtVmVydGV4SExTTCArPSAiICAgIGZsb2F0IGdsX1BvaW50U2l6ZSA6IFBTSVpFO1xuIjsKKyAgICB9CisKKyAgICBtVmVydGV4SExTTCArPSAifTtcbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgIlZTX09VVFBVVCBtYWluKFZTX0lOUFVUIGlucHV0KVxuIgorICAgICAgICAgICAgICAgICAgICJ7XG4iOworCisgICAgZm9yKEF0dHJpYnV0ZUFycmF5OjppdGVyYXRvciBhdHRyaWJ1dGUgPSBtVmVydGV4U2hhZGVyLT5tQXR0cmlidXRlcy5iZWdpbigpOyBhdHRyaWJ1dGUgIT0gbVZlcnRleFNoYWRlci0+bUF0dHJpYnV0ZXMuZW5kKCk7IGF0dHJpYnV0ZSsrKQorICAgIHsKKyAgICAgICAgbVZlcnRleEhMU0wgKz0gIiAgICAiICsgZGVjb3JhdGVBdHRyaWJ1dGUoYXR0cmlidXRlLT5uYW1lKSArICIgPSAiOworCisgICAgICAgIGlmKFZhcmlhYmxlUm93Q291bnQoYXR0cmlidXRlLT50eXBlKSA+IDEpICAgLy8gTWF0cml4CisgICAgICAgIHsKKyAgICAgICAgICAgIG1WZXJ0ZXhITFNMICs9ICJ0cmFuc3Bvc2UiOworICAgICAgICB9CisKKyAgICAgICAgbVZlcnRleEhMU0wgKz0gIihpbnB1dC4iICsgZGVjb3JhdGVBdHRyaWJ1dGUoYXR0cmlidXRlLT5uYW1lKSArICIpO1xuIjsKKyAgICB9CisKKyAgICBtVmVydGV4SExTTCArPSAiXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBnbF9tYWluKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICIgICAgVlNfT1VUUFVUIG91dHB1dDtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIG91dHB1dC5nbF9Qb3NpdGlvbi54ID0gZ2xfUG9zaXRpb24ueCAtIGR4X0hhbGZQaXhlbFNpemUueCAqIGdsX1Bvc2l0aW9uLnc7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBvdXRwdXQuZ2xfUG9zaXRpb24ueSA9IGdsX1Bvc2l0aW9uLnkgLSBkeF9IYWxmUGl4ZWxTaXplLnkgKiBnbF9Qb3NpdGlvbi53O1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgb3V0cHV0LmdsX1Bvc2l0aW9uLnogPSAoZ2xfUG9zaXRpb24ueiArIGdsX1Bvc2l0aW9uLncpICogMC41O1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgb3V0cHV0LmdsX1Bvc2l0aW9uLncgPSBnbF9Qb3NpdGlvbi53O1xuIjsKKworICAgIGlmKG1WZXJ0ZXhTaGFkZXItPm1Vc2VzUG9pbnRTaXplKQorICAgIHsKKyAgICAgICAgbVZlcnRleEhMU0wgKz0gIiAgICBvdXRwdXQuZ2xfUG9pbnRTaXplID0gY2xhbXAoZ2xfUG9pbnRTaXplLCAxLjAsICIgKyBzdHIoKGludClBTElBU0VEX1BPSU5UX1NJWkVfUkFOR0VfTUFYKSArICIpO1xuIjsKKyAgICB9CisKKyAgICBpZihtRnJhZ21lbnRTaGFkZXItPm1Vc2VzRnJhZ0Nvb3JkKQorICAgIHsKKyAgICAgICAgbVZlcnRleEhMU0wgKz0gIiAgICBvdXRwdXQuZ2xfRnJhZ0Nvb3JkID0gZ2xfUG9zaXRpb247XG4iOworICAgIH0KKworICAgIGZvcihWYXJ5aW5nTGlzdDo6aXRlcmF0b3IgdmFyeWluZyA9IG1WZXJ0ZXhTaGFkZXItPnZhcnlpbmdzLmJlZ2luKCk7IHZhcnlpbmcgIT0gbVZlcnRleFNoYWRlci0+dmFyeWluZ3MuZW5kKCk7IHZhcnlpbmcrKykKKyAgICB7CisgICAgICAgIGlmKHZhcnlpbmctPnJlZyA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdmFyeWluZy0+c2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByb3dzID0gVmFyaWFibGVSb3dDb3VudCh2YXJ5aW5nLT50eXBlKTsKKworICAgICAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCByb3dzOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgciA9IHZhcnlpbmctPnJlZyArIGkgKiByb3dzICsgajsKKyAgICAgICAgICAgICAgICAgICAgbVZlcnRleEhMU0wgKz0gIiAgICBvdXRwdXQudiIgKyBzdHIocik7CisKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzaGFyZWRSZWdpc3RlciA9IGZhbHNlOyAgIC8vIFJlZ2lzdGVyIHVzZWQgYnkgbXVsdGlwbGUgdmFyeWluZ3MKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhY2tpbmdbcl1beF0gJiYgcGFja2luZ1tyXVt4XSAhPSBwYWNraW5nW3JdWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZFJlZ2lzdGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKHNoYXJlZFJlZ2lzdGVyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmVydGV4SExTTCArPSAiLiI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFja2luZ1tyXVt4XSA9PSAmKnZhcnlpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogbVZlcnRleEhMU0wgKz0gIngiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IG1WZXJ0ZXhITFNMICs9ICJ5IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiBtVmVydGV4SExTTCArPSAieiI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogbVZlcnRleEhMU0wgKz0gInciOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1WZXJ0ZXhITFNMICs9ICIgPSAiICsgdmFyeWluZy0+bmFtZTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKHZhcnlpbmctPmFycmF5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmVydGV4SExTTCArPSAiWyIgKyBzdHIoaSkgKyAiXSI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZihyb3dzID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnRleEhMU0wgKz0gIlsiICsgc3RyKGopICsgIl0iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBtVmVydGV4SExTTCArPSAiO1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtVmVydGV4SExTTCArPSAiXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gb3V0cHV0O1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iOworCisgICAgbVBpeGVsSExTTCArPSAic3RydWN0IFBTX0lOUFVUXG4iCisgICAgICAgICAgICAgICAgICAie1xuIjsKKyAgICAKKyAgICBmb3IoVmFyeWluZ0xpc3Q6Oml0ZXJhdG9yIHZhcnlpbmcgPSBtRnJhZ21lbnRTaGFkZXItPnZhcnlpbmdzLmJlZ2luKCk7IHZhcnlpbmcgIT0gbUZyYWdtZW50U2hhZGVyLT52YXJ5aW5ncy5lbmQoKTsgdmFyeWluZysrKQorICAgIHsKKyAgICAgICAgaWYodmFyeWluZy0+cmVnID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB2YXJ5aW5nLT5zaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJvd3MgPSBWYXJpYWJsZVJvd0NvdW50KHZhcnlpbmctPnR5cGUpOworICAgICAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCByb3dzOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuID0gc3RyKHZhcnlpbmctPnJlZyArIGkgKiByb3dzICsgaik7CisgICAgICAgICAgICAgICAgICAgIG1QaXhlbEhMU0wgKz0gIiAgICBmbG9hdDQgdiIgKyBuICsgIiA6IENPTE9SIiArIG4gKyAiO1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIGlmKG1GcmFnbWVudFNoYWRlci0+bVVzZXNGcmFnQ29vcmQpCisgICAgeworICAgICAgICBtUGl4ZWxITFNMICs9ICIgICAgZmxvYXQ0IGdsX0ZyYWdDb29yZCA6IENPTE9SIiArIHN0cihyZWdpc3RlcnMpICsgIjtcbiI7CisgICAgICAgIG1QaXhlbEhMU0wgKz0gIiAgICBmbG9hdDIgZHhfVlBvcyA6IFZQT1M7XG4iOworICAgIH0KKworICAgIGlmKG1GcmFnbWVudFNoYWRlci0+bVVzZXNQb2ludENvb3JkKQorICAgIHsKKyAgICAgICAgbVBpeGVsSExTTCArPSAiICAgIGZsb2F0MiBnbF9Qb2ludENvb3JkIDogVEVYQ09PUkQwO1xuIjsKKyAgICB9CisKKyAgICBpZihtRnJhZ21lbnRTaGFkZXItPm1Vc2VzRnJvbnRGYWNpbmcpCisgICAgeworICAgICAgICBtUGl4ZWxITFNMICs9ICIgICAgZmxvYXQgdkZhY2UgOiBWRkFDRTtcbiI7CisgICAgfQorCisgICAgbVBpeGVsSExTTCArPSAifTtcbiIKKyAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICJzdHJ1Y3QgUFNfT1VUUFVUXG4iCisgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgIiAgICBmbG9hdDQgZ2xfQ29sb3JbMV0gOiBDT0xPUjtcbiIKKyAgICAgICAgICAgICAgICAgICJ9O1xuIgorICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgIlBTX09VVFBVVCBtYWluKFBTX0lOUFVUIGlucHV0KVxuIgorICAgICAgICAgICAgICAgICAgIntcbiI7CisKKyAgICBpZihtRnJhZ21lbnRTaGFkZXItPm1Vc2VzRnJhZ0Nvb3JkKQorICAgIHsKKyAgICAgICAgbVBpeGVsSExTTCArPSAiICAgIGZsb2F0IHJodyA9IDEuMCAvIGlucHV0LmdsX0ZyYWdDb29yZC53O1xuIjsKKyAgICAgICAgbVBpeGVsSExTTCArPSAiICAgIGdsX0ZyYWdDb29yZC54ID0gaW5wdXQuZHhfVlBvcy54ICsgMC41O1xuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZ2xfRnJhZ0Nvb3JkLnkgPSAyLjAgKiBkeF9WaWV3cG9ydC55IC0gaW5wdXQuZHhfVlBvcy55IC0gMC41O1xuIjsKKyAgICAgICAgbVBpeGVsSExTTCArPSAiICAgIGdsX0ZyYWdDb29yZC56ID0gKGlucHV0LmdsX0ZyYWdDb29yZC56ICogcmh3KSAqIGR4X0RlcHRoLnggKyBkeF9EZXB0aC55O1xuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZ2xfRnJhZ0Nvb3JkLncgPSByaHc7XG4iOworICAgIH0KKworICAgIGlmKG1GcmFnbWVudFNoYWRlci0+bVVzZXNQb2ludENvb3JkKQorICAgIHsKKyAgICAgICAgbVBpeGVsSExTTCArPSAiICAgIGdsX1BvaW50Q29vcmQgPSBpbnB1dC5nbF9Qb2ludENvb3JkO1xuIjsKKyAgICB9CisKKyAgICBpZihtRnJhZ21lbnRTaGFkZXItPm1Vc2VzRnJvbnRGYWNpbmcpCisgICAgeworICAgICAgICBtUGl4ZWxITFNMICs9ICIgICAgZ2xfRnJvbnRGYWNpbmcgPSBkeF9Qb2ludHNPckxpbmVzIHx8IChkeF9Gcm9udENDVyA/IChpbnB1dC52RmFjZSA+PSAwLjApIDogKGlucHV0LnZGYWNlIDw9IDAuMCkpO1xuIjsKKyAgICB9CisKKyAgICBmb3IoVmFyeWluZ0xpc3Q6Oml0ZXJhdG9yIHZhcnlpbmcgPSBtRnJhZ21lbnRTaGFkZXItPnZhcnlpbmdzLmJlZ2luKCk7IHZhcnlpbmcgIT0gbUZyYWdtZW50U2hhZGVyLT52YXJ5aW5ncy5lbmQoKTsgdmFyeWluZysrKQorICAgIHsKKyAgICAgICAgaWYodmFyeWluZy0+cmVnID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB2YXJ5aW5nLT5zaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJvd3MgPSBWYXJpYWJsZVJvd0NvdW50KHZhcnlpbmctPnR5cGUpOworICAgICAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCByb3dzOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuID0gc3RyKHZhcnlpbmctPnJlZyArIGkgKiByb3dzICsgaik7CisgICAgICAgICAgICAgICAgICAgIG1QaXhlbEhMU0wgKz0gIiAgICAiICsgdmFyeWluZy0+bmFtZTsKKworICAgICAgICAgICAgICAgICAgICBpZih2YXJ5aW5nLT5hcnJheSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbVBpeGVsSExTTCArPSAiWyIgKyBzdHIoaSkgKyAiXSI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZihyb3dzID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbVBpeGVsSExTTCArPSAiWyIgKyBzdHIoaikgKyAiXSI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtUGl4ZWxITFNMICs9ICIgPSBpbnB1dC52IiArIG4gKyAiO1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIG1QaXhlbEhMU0wgKz0gIlxuIgorICAgICAgICAgICAgICAgICAgIiAgICBnbF9tYWluKCk7XG4iCisgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAiICAgIFBTX09VVFBVVCBvdXRwdXQ7XG4iICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICIgICAgb3V0cHV0LmdsX0NvbG9yWzBdID0gZ2xfQ29sb3JbMF07XG4iCisgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAiICAgIHJldHVybiBvdXRwdXQ7XG4iCisgICAgICAgICAgICAgICAgICAifVxuIjsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBMaW5rcyB0aGUgSExTTCBjb2RlIG9mIHRoZSB2ZXJ0ZXggYW5kIHBpeGVsIHNoYWRlciBieSBtYXRjaGluZyB1cCB0aGVpciB2YXJ5aW5ncywKKy8vIGNvbXBpbGluZyB0aGVtIGludG8gYmluYXJpZXMsIGRldGVybWluaW5nIHRoZSBhdHRyaWJ1dGUgbWFwcGluZ3MsIGFuZCBjb2xsZWN0aW5nCisvLyBhIGxpc3Qgb2YgdW5pZm9ybXMKK3ZvaWQgUHJvZ3JhbTo6bGluaygpCit7CisgICAgdW5saW5rKCk7CisKKyAgICBpZighbUZyYWdtZW50U2hhZGVyIHx8ICFtRnJhZ21lbnRTaGFkZXItPmlzQ29tcGlsZWQoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZighbVZlcnRleFNoYWRlciB8fCAhbVZlcnRleFNoYWRlci0+aXNDb21waWxlZCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1QaXhlbEhMU0wgPSBtRnJhZ21lbnRTaGFkZXItPmdldEhMU0woKTsKKyAgICBtVmVydGV4SExTTCA9IG1WZXJ0ZXhTaGFkZXItPmdldEhMU0woKTsKKworICAgIGlmKCFsaW5rVmFyeWluZ3MoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDb250ZXh0ICpjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworCisgICAgSUQzRDEwQmxvYiAqdmVydGV4QmluYXJ5ID0gY29tcGlsZVRvQmluYXJ5KG1WZXJ0ZXhITFNMLmNfc3RyKCksICJ2c18zXzAiLCAmbUNvbnN0YW50VGFibGVWUyk7CisgICAgSUQzRDEwQmxvYiAqcGl4ZWxCaW5hcnkgPSBjb21waWxlVG9CaW5hcnkobVBpeGVsSExTTC5jX3N0cigpLCAicHNfM18wIiwgJm1Db25zdGFudFRhYmxlUFMpOworCisgICAgaWYodmVydGV4QmluYXJ5ICYmIHBpeGVsQmluYXJ5KQorICAgIHsKKyAgICAgICAgRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKyAgICAgICAgbVZlcnRleEV4ZWN1dGFibGUgPSBuZXcgc3c6OlZlcnRleFNoYWRlcigodW5zaWduZWQgbG9uZyopdmVydGV4QmluYXJ5LT5HZXRCdWZmZXJQb2ludGVyKCkpOworICAgICAgICBtUGl4ZWxFeGVjdXRhYmxlID0gbmV3IHN3OjpQaXhlbFNoYWRlcigodW5zaWduZWQgbG9uZyopcGl4ZWxCaW5hcnktPkdldEJ1ZmZlclBvaW50ZXIoKSk7CisKKyAgICAgICAgaWYoIW1WZXJ0ZXhFeGVjdXRhYmxlIHx8ICFtUGl4ZWxFeGVjdXRhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgICAgIH0KKworICAgICAgICB2ZXJ0ZXhCaW5hcnktPlJlbGVhc2UoKTsKKyAgICAgICAgcGl4ZWxCaW5hcnktPlJlbGVhc2UoKTsKKyAgICAgICAgdmVydGV4QmluYXJ5ID0gTlVMTDsKKyAgICAgICAgcGl4ZWxCaW5hcnkgPSBOVUxMOworCisgICAgICAgIGlmKG1WZXJ0ZXhFeGVjdXRhYmxlICYmIG1QaXhlbEV4ZWN1dGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFsaW5rQXR0cmlidXRlcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIWxpbmtVbmlmb3JtcyhtQ29uc3RhbnRUYWJsZVBTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCFsaW5rVW5pZm9ybXMobUNvbnN0YW50VGFibGVWUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0aGVzZSB1bmlmb3JtcyBhcmUgc2VhcmNoZWQgYXMgYWxyZWFkeS1kZWNvcmF0ZWQgYmVjYXVzZSBnbF8gYW5kIGR4XworICAgICAgICAgICAgLy8gYXJlIHJlc2VydmVkIHByZWZpeGVzLCBhbmQgZG8gbm90IHJlY2VpdmUgYWRkaXRpb25hbCBkZWNvcmF0aW9uCisgICAgICAgICAgICBtRHhEZXB0aFJhbmdlTG9jYXRpb24gPSBnZXRVbmlmb3JtTG9jYXRpb24oImR4X0RlcHRoUmFuZ2UiKTsKKyAgICAgICAgICAgIG1EeERlcHRoTG9jYXRpb24gPSBnZXRVbmlmb3JtTG9jYXRpb24oImR4X0RlcHRoIik7CisgICAgICAgICAgICBtRHhWaWV3cG9ydExvY2F0aW9uID0gZ2V0VW5pZm9ybUxvY2F0aW9uKCJkeF9WaWV3cG9ydCIpOworICAgICAgICAgICAgbUR4SGFsZlBpeGVsU2l6ZUxvY2F0aW9uID0gZ2V0VW5pZm9ybUxvY2F0aW9uKCJkeF9IYWxmUGl4ZWxTaXplIik7CisgICAgICAgICAgICBtRHhGcm9udENDV0xvY2F0aW9uID0gZ2V0VW5pZm9ybUxvY2F0aW9uKCJkeF9Gcm9udENDVyIpOworICAgICAgICAgICAgbUR4UG9pbnRzT3JMaW5lc0xvY2F0aW9uID0gZ2V0VW5pZm9ybUxvY2F0aW9uKCJkeF9Qb2ludHNPckxpbmVzIik7CisKKyAgICAgICAgICAgIG1MaW5rZWQgPSB0cnVlOyAgIC8vIFN1Y2Nlc3MKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gRGV0ZXJtaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIEdMIGF0dHJpYnV0ZXMgYW5kIERpcmVjdDNEIDkgdmVydGV4IHN0cmVhbSB1c2FnZSBpbmRpY2VzCitib29sIFByb2dyYW06OmxpbmtBdHRyaWJ1dGVzKCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdXNlZExvY2F0aW9ucyA9IDA7CisKKyAgICAvLyBMaW5rIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGEgYmluZGluZyBsb2NhdGlvbgorICAgIGZvcihBdHRyaWJ1dGVBcnJheTo6aXRlcmF0b3IgYXR0cmlidXRlID0gbVZlcnRleFNoYWRlci0+bUF0dHJpYnV0ZXMuYmVnaW4oKTsgYXR0cmlidXRlICE9IG1WZXJ0ZXhTaGFkZXItPm1BdHRyaWJ1dGVzLmVuZCgpOyBhdHRyaWJ1dGUrKykKKyAgICB7CisgICAgICAgIGludCBsb2NhdGlvbiA9IGdldEF0dHJpYnV0ZUJpbmRpbmcoYXR0cmlidXRlLT5uYW1lKTsKKworICAgICAgICBpZihsb2NhdGlvbiAhPSAtMSkgICAvLyBTZXQgYnkgZ2xCaW5kQXR0cmliTG9jYXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYoIW1MaW5rZWRBdHRyaWJ1dGVbbG9jYXRpb25dLm5hbWUuZW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSBhY3RpdmUgYXR0cmlidXRlcyBib3VuZCB0byB0aGUgc2FtZSBsb2NhdGlvbjsgbm90IGFuIGVycm9yCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MaW5rZWRBdHRyaWJ1dGVbbG9jYXRpb25dID0gKmF0dHJpYnV0ZTsKKworICAgICAgICAgICAgaW50IHJvd3MgPSBWYXJpYWJsZVJvd0NvdW50KGF0dHJpYnV0ZS0+dHlwZSk7CisKKyAgICAgICAgICAgIGlmKHJvd3MgKyBsb2NhdGlvbiA+IE1BWF9WRVJURVhfQVRUUklCUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRUb0luZm9Mb2coIkFjdGl2ZSBhdHRyaWJ1dGUgKCVzKSBhdCBsb2NhdGlvbiAlZCBpcyB0b28gYmlnIHRvIGZpdCIsIGF0dHJpYnV0ZS0+bmFtZS5jX3N0cigpLCBsb2NhdGlvbik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlZExvY2F0aW9ucyB8PSAxIDw8IChsb2NhdGlvbiArIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gTGluayBhdHRyaWJ1dGVzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJpbmRpbmcgbG9jYXRpb24KKyAgICBmb3IoQXR0cmlidXRlQXJyYXk6Oml0ZXJhdG9yIGF0dHJpYnV0ZSA9IG1WZXJ0ZXhTaGFkZXItPm1BdHRyaWJ1dGVzLmJlZ2luKCk7IGF0dHJpYnV0ZSAhPSBtVmVydGV4U2hhZGVyLT5tQXR0cmlidXRlcy5lbmQoKTsgYXR0cmlidXRlKyspCisgICAgeworICAgICAgICBpbnQgbG9jYXRpb24gPSBnZXRBdHRyaWJ1dGVCaW5kaW5nKGF0dHJpYnV0ZS0+bmFtZSk7CisKKyAgICAgICAgaWYobG9jYXRpb24gPT0gLTEpICAgLy8gTm90IHNldCBieSBnbEJpbmRBdHRyaWJMb2NhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcm93cyA9IFZhcmlhYmxlUm93Q291bnQoYXR0cmlidXRlLT50eXBlKTsKKyAgICAgICAgICAgIGludCBhdmFpbGFibGVJbmRleCA9IEFsbG9jYXRlRmlyc3RGcmVlQml0cygmdXNlZExvY2F0aW9ucywgcm93cywgTUFYX1ZFUlRFWF9BVFRSSUJTKTsKKworICAgICAgICAgICAgaWYoYXZhaWxhYmxlSW5kZXggPT0gLTEgfHwgYXZhaWxhYmxlSW5kZXggKyByb3dzID4gTUFYX1ZFUlRFWF9BVFRSSUJTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwcGVuZFRvSW5mb0xvZygiVG9vIG1hbnkgYWN0aXZlIGF0dHJpYnV0ZXMgKCVzKSIsIGF0dHJpYnV0ZS0+bmFtZS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBGYWlsIHRvIGxpbmsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxpbmtlZEF0dHJpYnV0ZVthdmFpbGFibGVJbmRleF0gPSAqYXR0cmlidXRlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGludCBhdHRyaWJ1dGVJbmRleCA9IDA7IGF0dHJpYnV0ZUluZGV4IDwgTUFYX1ZFUlRFWF9BVFRSSUJTOyApCisgICAgeworICAgICAgICBpbnQgaW5kZXggPSBtVmVydGV4U2hhZGVyLT5nZXRTZW1hbnRpY0luZGV4KG1MaW5rZWRBdHRyaWJ1dGVbYXR0cmlidXRlSW5kZXhdLm5hbWUpOworICAgICAgICBpbnQgcm93cyA9IHN0ZDo6bWF4KFZhcmlhYmxlUm93Q291bnQobUxpbmtlZEF0dHJpYnV0ZVthdHRyaWJ1dGVJbmRleF0udHlwZSksIDEpOworCisgICAgICAgIGZvcihpbnQgciA9IDA7IHIgPCByb3dzOyByKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG1TZW1hbnRpY0luZGV4W2F0dHJpYnV0ZUluZGV4KytdID0gaW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgUHJvZ3JhbTo6Z2V0QXR0cmlidXRlQmluZGluZyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKK3sKKyAgICBmb3IoaW50IGxvY2F0aW9uID0gMDsgbG9jYXRpb24gPCBNQVhfVkVSVEVYX0FUVFJJQlM7IGxvY2F0aW9uKyspCisgICAgeworICAgICAgICBpZihtQXR0cmlidXRlQmluZGluZ1tsb2NhdGlvbl0uZmluZChuYW1lKSAhPSBtQXR0cmlidXRlQmluZGluZ1tsb2NhdGlvbl0uZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworYm9vbCBQcm9ncmFtOjpsaW5rVW5pZm9ybXMoSUQzRFhDb25zdGFudFRhYmxlICpjb25zdGFudFRhYmxlKQoreworICAgIEQzRFhDT05TVEFOVFRBQkxFX0RFU0MgY29uc3RhbnRUYWJsZURlc2NyaXB0aW9uOworICAgIEQzRFhDT05TVEFOVF9ERVNDIGNvbnN0YW50RGVzY3JpcHRpb247CisgICAgVUlOVCBkZXNjcmlwdGlvbkNvdW50ID0gMTsKKworICAgIGNvbnN0YW50VGFibGUtPkdldERlc2MoJmNvbnN0YW50VGFibGVEZXNjcmlwdGlvbik7CisKKyAgICBmb3IodW5zaWduZWQgaW50IGNvbnN0YW50SW5kZXggPSAwOyBjb25zdGFudEluZGV4IDwgY29uc3RhbnRUYWJsZURlc2NyaXB0aW9uLkNvbnN0YW50czsgY29uc3RhbnRJbmRleCsrKQorICAgIHsKKyAgICAgICAgRDNEWEhBTkRMRSBjb25zdGFudEhhbmRsZSA9IGNvbnN0YW50VGFibGUtPkdldENvbnN0YW50KDAsIGNvbnN0YW50SW5kZXgpOworICAgICAgICBIUkVTVUxUIHJlc3VsdCA9IGNvbnN0YW50VGFibGUtPkdldENvbnN0YW50RGVzYyhjb25zdGFudEhhbmRsZSwgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKyAgICAgICAgQVNTRVJUKFNVQ0NFRURFRChyZXN1bHQpKTsKKworICAgICAgICBpZighZGVmaW5lVW5pZm9ybShjb25zdGFudEhhbmRsZSwgY29uc3RhbnREZXNjcmlwdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBBZGRzIHRoZSBkZXNjcmlwdGlvbiBvZiBhIGNvbnN0YW50IGZvdW5kIGluIHRoZSBiaW5hcnkgc2hhZGVyIHRvIHRoZSBsaXN0IG9mIHVuaWZvcm1zCisvLyBSZXR1cm5zIHRydWUgaWYgc3VjY2VzZnVsICh1bmlmb3JtIG5vdCBhbHJlYWR5IGRlZmluZWQpCitib29sIFByb2dyYW06OmRlZmluZVVuaWZvcm0oY29uc3QgRDNEWEhBTkRMRSAmY29uc3RhbnRIYW5kbGUsIGNvbnN0IEQzRFhDT05TVEFOVF9ERVNDICZjb25zdGFudERlc2NyaXB0aW9uLCBzdGQ6OnN0cmluZyBuYW1lKQoreworICAgIGlmKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJTZXQgPT0gRDNEWFJTX1NBTVBMRVIpCisgICAgeworICAgICAgICBmb3IodW5zaWduZWQgaW50IHNhbXBsZXJJbmRleCA9IGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleDsgc2FtcGxlckluZGV4IDwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4ICsgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50OyBzYW1wbGVySW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYobUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnRCeU5hbWUoTlVMTCwgY29uc3RhbnREZXNjcmlwdGlvbi5OYW1lKSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHNhbXBsZXJJbmRleCA8IE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXJzUFNbc2FtcGxlckluZGV4XS5hY3RpdmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtU2FtcGxlcnNQU1tzYW1wbGVySW5kZXhdLnRleHR1cmVUeXBlID0gKGNvbnN0YW50RGVzY3JpcHRpb24uVHlwZSA9PSBEM0RYUFRfU0FNUExFUkNVQkUpID8gVEVYVFVSRV9DVUJFIDogVEVYVFVSRV8yRDsKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXJzUFNbc2FtcGxlckluZGV4XS5sb2dpY2FsVGV4dHVyZVVuaXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb0luZm9Mb2coIlBpeGVsIHNoYWRlciBzYW1wbGVyIGNvdW50IGV4Y2VlZHMgTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKCVkKS4iLCBNQVhfVEVYVFVSRV9JTUFHRV9VTklUUyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKG1Db25zdGFudFRhYmxlVlMtPkdldENvbnN0YW50QnlOYW1lKE5VTEwsIGNvbnN0YW50RGVzY3JpcHRpb24uTmFtZSkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihzYW1wbGVySW5kZXggPCBNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtU2FtcGxlcnNWU1tzYW1wbGVySW5kZXhdLmFjdGl2ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVyc1ZTW3NhbXBsZXJJbmRleF0udGV4dHVyZVR5cGUgPSAoY29uc3RhbnREZXNjcmlwdGlvbi5UeXBlID09IEQzRFhQVF9TQU1QTEVSQ1VCRSkgPyBURVhUVVJFX0NVQkUgOiBURVhUVVJFXzJEOworICAgICAgICAgICAgICAgICAgICBtU2FtcGxlcnNWU1tzYW1wbGVySW5kZXhdLmxvZ2ljYWxUZXh0dXJlVW5pdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvSW5mb0xvZygiVmVydGV4IHNoYWRlciBzYW1wbGVyIGNvdW50IGV4Y2VlZHMgTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTICglZCkuIiwgTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaChjb25zdGFudERlc2NyaXB0aW9uLkNsYXNzKQorICAgIHsKKyAgICAgIGNhc2UgRDNEWFBDX1NUUlVDVDoKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBhcnJheUluZGV4ID0gMDsgYXJyYXlJbmRleCA8IGNvbnN0YW50RGVzY3JpcHRpb24uRWxlbWVudHM7IGFycmF5SW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGZpZWxkID0gMDsgZmllbGQgPCBjb25zdGFudERlc2NyaXB0aW9uLlN0cnVjdE1lbWJlcnM7IGZpZWxkKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEM0RYSEFORExFIGZpZWxkSGFuZGxlID0gbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnQoY29uc3RhbnRIYW5kbGUsIGZpZWxkKTsKKworICAgICAgICAgICAgICAgICAgICBEM0RYQ09OU1RBTlRfREVTQyBmaWVsZERlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgICAgICBVSU5UIGRlc2NyaXB0aW9uQ291bnQgPSAxOworCisgICAgICAgICAgICAgICAgICAgIEhSRVNVTFQgcmVzdWx0ID0gbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnREZXNjKGZpZWxkSGFuZGxlLCAmZmllbGREZXNjcmlwdGlvbiwgJmRlc2NyaXB0aW9uQ291bnQpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoU1VDQ0VFREVEKHJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0cnVjdEluZGV4ID0gKGNvbnN0YW50RGVzY3JpcHRpb24uRWxlbWVudHMgPiAxKSA/ICgiWyIgKyBzdHIoYXJyYXlJbmRleCkgKyAiXSIpIDogIiI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIWRlZmluZVVuaWZvcm0oZmllbGRIYW5kbGUsIGZpZWxkRGVzY3JpcHRpb24sIG5hbWUgKyBjb25zdGFudERlc2NyaXB0aW9uLk5hbWUgKyBzdHJ1Y3RJbmRleCArICIuIikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIGNhc2UgRDNEWFBDX1NDQUxBUjoKKyAgICAgIGNhc2UgRDNEWFBDX1ZFQ1RPUjoKKyAgICAgIGNhc2UgRDNEWFBDX01BVFJJWF9DT0xVTU5TOgorICAgICAgY2FzZSBEM0RYUENfT0JKRUNUOgorICAgICAgICByZXR1cm4gZGVmaW5lVW5pZm9ybShjb25zdGFudERlc2NyaXB0aW9uLCBuYW1lICsgY29uc3RhbnREZXNjcmlwdGlvbi5OYW1lKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgUHJvZ3JhbTo6ZGVmaW5lVW5pZm9ybShjb25zdCBEM0RYQ09OU1RBTlRfREVTQyAmY29uc3RhbnREZXNjcmlwdGlvbiwgc3RkOjpzdHJpbmcgJl9uYW1lKQoreworICAgIFVuaWZvcm0gKnVuaWZvcm0gPSBjcmVhdGVVbmlmb3JtKGNvbnN0YW50RGVzY3JpcHRpb24sIF9uYW1lKTsKKworICAgIGlmKCF1bmlmb3JtKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIGFscmVhZHkgZGVmaW5lZAorICAgIEdMaW50IGxvY2F0aW9uID0gZ2V0VW5pZm9ybUxvY2F0aW9uKHVuaWZvcm0tPm5hbWUpOworICAgIEdMZW51bSB0eXBlID0gdW5pZm9ybS0+dHlwZTsKKworICAgIGlmKGxvY2F0aW9uID49IDApCisgICAgeworICAgICAgICBkZWxldGUgdW5pZm9ybTsKKworICAgICAgICBpZihtVW5pZm9ybXNbbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uaW5kZXhdLT50eXBlICE9IHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgbVVuaWZvcm1zLnB1c2hfYmFjayh1bmlmb3JtKTsKKyAgICB1bnNpZ25lZCBpbnQgdW5pZm9ybUluZGV4ID0gbVVuaWZvcm1zLnNpemUoKSAtIDE7CisKKyAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdW5pZm9ybS0+YXJyYXlTaXplOyArK2kpCisgICAgeworICAgICAgICBtVW5pZm9ybUluZGV4LnB1c2hfYmFjayhVbmlmb3JtTG9jYXRpb24oX25hbWUsIGksIHVuaWZvcm1JbmRleCkpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitVbmlmb3JtICpQcm9ncmFtOjpjcmVhdGVVbmlmb3JtKGNvbnN0IEQzRFhDT05TVEFOVF9ERVNDICZjb25zdGFudERlc2NyaXB0aW9uLCBzdGQ6OnN0cmluZyAmX25hbWUpCit7CisgICAgaWYoY29uc3RhbnREZXNjcmlwdGlvbi5Sb3dzID09IDEpICAgLy8gVmVjdG9ycyBhbmQgc2NhbGFycworICAgIHsKKyAgICAgICAgc3dpdGNoIChjb25zdGFudERlc2NyaXB0aW9uLlR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEQzRFhQVF9TQU1QTEVSMkQ6CisgICAgICAgICAgICBzd2l0Y2ggKGNvbnN0YW50RGVzY3JpcHRpb24uQ29sdW1ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFVuaWZvcm0oR0xfU0FNUExFUl8yRCwgX25hbWUsIGNvbnN0YW50RGVzY3JpcHRpb24uRWxlbWVudHMpOworICAgICAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBEM0RYUFRfU0FNUExFUkNVQkU6CisgICAgICAgICAgICBzd2l0Y2ggKGNvbnN0YW50RGVzY3JpcHRpb24uQ29sdW1ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFVuaWZvcm0oR0xfU0FNUExFUl9DVUJFLCBfbmFtZSwgY29uc3RhbnREZXNjcmlwdGlvbi5FbGVtZW50cyk7CisgICAgICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEQzRFhQVF9CT09MOgorICAgICAgICAgICAgc3dpdGNoIChjb25zdGFudERlc2NyaXB0aW9uLkNvbHVtbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBVbmlmb3JtKEdMX0JPT0wsIF9uYW1lLCBjb25zdGFudERlc2NyaXB0aW9uLkVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFVuaWZvcm0oR0xfQk9PTF9WRUMyLCBfbmFtZSwgY29uc3RhbnREZXNjcmlwdGlvbi5FbGVtZW50cyk7CisgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBVbmlmb3JtKEdMX0JPT0xfVkVDMywgX25hbWUsIGNvbnN0YW50RGVzY3JpcHRpb24uRWxlbWVudHMpOworICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVW5pZm9ybShHTF9CT09MX1ZFQzQsIF9uYW1lLCBjb25zdGFudERlc2NyaXB0aW9uLkVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRDNEWFBUX0lOVDoKKyAgICAgICAgICAgIHN3aXRjaCAoY29uc3RhbnREZXNjcmlwdGlvbi5Db2x1bW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVW5pZm9ybShHTF9JTlQsIF9uYW1lLCBjb25zdGFudERlc2NyaXB0aW9uLkVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFVuaWZvcm0oR0xfSU5UX1ZFQzIsIF9uYW1lLCBjb25zdGFudERlc2NyaXB0aW9uLkVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFVuaWZvcm0oR0xfSU5UX1ZFQzMsIF9uYW1lLCBjb25zdGFudERlc2NyaXB0aW9uLkVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IFVuaWZvcm0oR0xfSU5UX1ZFQzQsIF9uYW1lLCBjb25zdGFudERlc2NyaXB0aW9uLkVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRDNEWFBUX0ZMT0FUOgorICAgICAgICAgICAgc3dpdGNoIChjb25zdGFudERlc2NyaXB0aW9uLkNvbHVtbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBVbmlmb3JtKEdMX0ZMT0FULCBfbmFtZSwgY29uc3RhbnREZXNjcmlwdGlvbi5FbGVtZW50cyk7CisgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBVbmlmb3JtKEdMX0ZMT0FUX1ZFQzIsIF9uYW1lLCBjb25zdGFudERlc2NyaXB0aW9uLkVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFVuaWZvcm0oR0xfRkxPQVRfVkVDMywgX25hbWUsIGNvbnN0YW50RGVzY3JpcHRpb24uRWxlbWVudHMpOworICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVW5pZm9ybShHTF9GTE9BVF9WRUM0LCBfbmFtZSwgY29uc3RhbnREZXNjcmlwdGlvbi5FbGVtZW50cyk7CisgICAgICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKGNvbnN0YW50RGVzY3JpcHRpb24uUm93cyA9PSBjb25zdGFudERlc2NyaXB0aW9uLkNvbHVtbnMpICAvLyBTcXVhcmUgbWF0cmljZXMKKyAgICB7CisgICAgICAgIHN3aXRjaCAoY29uc3RhbnREZXNjcmlwdGlvbi5UeXBlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBEM0RYUFRfRkxPQVQ6CisgICAgICAgICAgICBzd2l0Y2ggKGNvbnN0YW50RGVzY3JpcHRpb24uUm93cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFVuaWZvcm0oR0xfRkxPQVRfTUFUMiwgX25hbWUsIGNvbnN0YW50RGVzY3JpcHRpb24uRWxlbWVudHMpOworICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgVW5pZm9ybShHTF9GTE9BVF9NQVQzLCBfbmFtZSwgY29uc3RhbnREZXNjcmlwdGlvbi5FbGVtZW50cyk7CisgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBVbmlmb3JtKEdMX0ZMT0FUX01BVDQsIF9uYW1lLCBjb25zdGFudERlc2NyaXB0aW9uLkVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFRoaXMgbWV0aG9kIG5lZWRzIHRvIG1hdGNoIE91dHB1dEhMU0w6OmRlY29yYXRlCitzdGQ6OnN0cmluZyBQcm9ncmFtOjpkZWNvcmF0ZUF0dHJpYnV0ZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKK3sKKyAgICBpZihuYW1lLmNvbXBhcmUoMCwgMywgImdsXyIpICE9IDAgJiYgbmFtZS5jb21wYXJlKDAsIDMsICJkeF8iKSAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJfIiArIG5hbWU7CisgICAgfQorICAgIAorICAgIHJldHVybiBuYW1lOworfQorCitzdGQ6OnN0cmluZyBQcm9ncmFtOjp1bmRlY29yYXRlVW5pZm9ybShjb25zdCBzdGQ6OnN0cmluZyAmX25hbWUpCit7CisgICAgaWYoX25hbWVbMF0gPT0gJ18nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lLnN1YnN0cigxKTsKKyAgICB9CisgICAgZWxzZSBpZihfbmFtZS5jb21wYXJlKDAsIDMsICJhcl8iKSA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lLnN1YnN0cigzKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIF9uYW1lOworfQorCitib29sIFByb2dyYW06OmFwcGx5VW5pZm9ybTFidihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xib29sZWFuICp2KQoreworCWZsb2F0ICgqdmVjdG9yKVs0XSA9IG5ldyBmbG9hdFtjb3VudF1bNF07CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHZlY3RvcltpXVswXSA9ICh2WzBdID09IEdMX0ZBTFNFID8gMC4wZiA6IDEuMGYpOworICAgICAgICB2ZWN0b3JbaV1bMV0gPSAwOworCQl2ZWN0b3JbaV1bMl0gPSAwOworCQl2ZWN0b3JbaV1bM10gPSAwOworCisgICAgICAgIHYgKz0gMTsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRQUzsKKyAgICBEM0RYSEFORExFIGNvbnN0YW50VlM7CisgICAgZ2V0Q29uc3RhbnRIYW5kbGVzKHRhcmdldFVuaWZvcm0sICZjb25zdGFudFBTLCAmY29uc3RhbnRWUyk7CisKKyAgICBEZXZpY2UgKmRldmljZSA9IGdldERldmljZSgpOworCUQzRFhDT05TVEFOVF9ERVNDIGNvbnN0YW50RGVzY3JpcHRpb247CisgICAgVUlOVCBkZXNjcmlwdGlvbkNvdW50ID0gMTsKKworICAgIGlmKGNvbnN0YW50UFMpCisgICAgewkKKwkJbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50UFMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCQorCQlpZihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyU2V0ID09IEQzRFhSU19GTE9BVDQpCisJCXsKKwkJCWRldmljZS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXZlY3RvciwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKwkJfQorCQllbHNlIGlmKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJTZXQgPT0gRDNEWFJTX0JPT0wpCisJCXsKKwkJCWRldmljZS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEIoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoaW50Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisJCX0KKwkJZWxzZSBVTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIGlmKGNvbnN0YW50VlMpCisgICAgeworCQltQ29uc3RhbnRUYWJsZVZTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRWUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKwkJCisJCWlmKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJTZXQgPT0gRDNEWFJTX0ZMT0FUNCkKKwkJeworCQkJZGV2aWNlLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXZlY3RvciwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKwkJfQorCQllbHNlIGlmKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJTZXQgPT0gRDNEWFJTX0JPT0wpCisJCXsKKwkJCWRldmljZS0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGludCopdmVjdG9yLCBjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyQ291bnQpOworCQl9CisJCWVsc2UgVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICBkZWxldGUgW10gdmVjdG9yOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6YXBwbHlVbmlmb3JtMmJ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGJvb2xlYW4gKnYpCit7CisgICAgZmxvYXQgKCp2ZWN0b3IpWzRdID0gbmV3IGZsb2F0W2NvdW50XVs0XTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgdmVjdG9yW2ldWzBdID0gKHZbMF0gPT0gR0xfRkFMU0UgPyAwLjBmIDogMS4wZik7CisgICAgICAgIHZlY3RvcltpXVsxXSA9ICh2WzFdID09IEdMX0ZBTFNFID8gMC4wZiA6IDEuMGYpOworCQl2ZWN0b3JbaV1bMl0gPSAwOworCQl2ZWN0b3JbaV1bM10gPSAwOworCisgICAgICAgIHYgKz0gMjsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRQUzsKKyAgICBEM0RYSEFORExFIGNvbnN0YW50VlM7CisgICAgZ2V0Q29uc3RhbnRIYW5kbGVzKHRhcmdldFVuaWZvcm0sICZjb25zdGFudFBTLCAmY29uc3RhbnRWUyk7CisKKyAgICBEZXZpY2UgKmRldmljZSA9IGdldERldmljZSgpOworCUQzRFhDT05TVEFOVF9ERVNDIGNvbnN0YW50RGVzY3JpcHRpb247CisgICAgVUlOVCBkZXNjcmlwdGlvbkNvdW50ID0gMTsKKworICAgIGlmKGNvbnN0YW50UFMpCisgICAgeworCQltQ29uc3RhbnRUYWJsZVBTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRQUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKwkJQVNTRVJUKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJTZXQgPT0gRDNEWFJTX0ZMT0FUNCk7CisJCWRldmljZS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXZlY3RvciwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICBpZihjb25zdGFudFZTKQorICAgIHsKKwkJbUNvbnN0YW50VGFibGVWUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50VlMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCUFTU0VSVChjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyU2V0ID09IEQzRFhSU19GTE9BVDQpOworCQlkZXZpY2UtPnNldFZlcnRleFNoYWRlckNvbnN0YW50Rihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVySW5kZXgsIChmbG9hdCopdmVjdG9yLCBjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyQ291bnQpOworICAgIH0KKworICAgIGRlbGV0ZVtdIHZlY3RvcjsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OmFwcGx5VW5pZm9ybTNidihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xib29sZWFuICp2KQoreworICAgIGZsb2F0ICgqdmVjdG9yKVs0XSA9IG5ldyBmbG9hdFtjb3VudF1bNF07CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHZlY3RvcltpXVswXSA9ICh2WzBdID09IEdMX0ZBTFNFID8gMC4wZiA6IDEuMGYpOworICAgICAgICB2ZWN0b3JbaV1bMV0gPSAodlsxXSA9PSBHTF9GQUxTRSA/IDAuMGYgOiAxLjBmKTsKKwkJdmVjdG9yW2ldWzJdID0gKHZbMl0gPT0gR0xfRkFMU0UgPyAwLjBmIDogMS4wZik7CisJCXZlY3RvcltpXVszXSA9IDA7CisKKyAgICAgICAgdiArPSAzOworICAgIH0KKworICAgIFVuaWZvcm0gKnRhcmdldFVuaWZvcm0gPSBtVW5pZm9ybXNbbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uaW5kZXhdOworCisgICAgRDNEWEhBTkRMRSBjb25zdGFudFBTOworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRWUzsKKyAgICBnZXRDb25zdGFudEhhbmRsZXModGFyZ2V0VW5pZm9ybSwgJmNvbnN0YW50UFMsICZjb25zdGFudFZTKTsKKyAgICAKKwlEZXZpY2UgKmRldmljZSA9IGdldERldmljZSgpOworCUQzRFhDT05TVEFOVF9ERVNDIGNvbnN0YW50RGVzY3JpcHRpb247CisgICAgVUlOVCBkZXNjcmlwdGlvbkNvdW50ID0gMTsKKworICAgIGlmKGNvbnN0YW50UFMpCisgICAgeworCQltQ29uc3RhbnRUYWJsZVBTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRQUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKwkJQVNTRVJUKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJTZXQgPT0gRDNEWFJTX0ZMT0FUNCk7CisJCWRldmljZS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXZlY3RvciwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICBpZihjb25zdGFudFZTKQorICAgIHsKKwkJbUNvbnN0YW50VGFibGVWUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50VlMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCUFTU0VSVChjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyU2V0ID09IEQzRFhSU19GTE9BVDQpOworCQlkZXZpY2UtPnNldFZlcnRleFNoYWRlckNvbnN0YW50Rihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVySW5kZXgsIChmbG9hdCopdmVjdG9yLCBjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyQ291bnQpOworICAgIH0KKworICAgIGRlbGV0ZVtdIHZlY3RvcjsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OmFwcGx5VW5pZm9ybTRidihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xib29sZWFuICp2KQoreworICAgIGZsb2F0ICgqdmVjdG9yKVs0XSA9IG5ldyBmbG9hdFtjb3VudF1bNF07CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHZlY3RvcltpXVswXSA9ICh2WzBdID09IEdMX0ZBTFNFID8gMC4wZiA6IDEuMGYpOworICAgICAgICB2ZWN0b3JbaV1bMV0gPSAodlsxXSA9PSBHTF9GQUxTRSA/IDAuMGYgOiAxLjBmKTsKKwkJdmVjdG9yW2ldWzJdID0gKHZbMl0gPT0gR0xfRkFMU0UgPyAwLjBmIDogMS4wZik7CisJCXZlY3RvcltpXVszXSA9ICh2WzNdID09IEdMX0ZBTFNFID8gMC4wZiA6IDEuMGYpOworCisgICAgICAgIHYgKz0gNDsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRQUzsKKyAgICBEM0RYSEFORExFIGNvbnN0YW50VlM7CisgICAgZ2V0Q29uc3RhbnRIYW5kbGVzKHRhcmdldFVuaWZvcm0sICZjb25zdGFudFBTLCAmY29uc3RhbnRWUyk7CisgICAgCisJRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKwlEM0RYQ09OU1RBTlRfREVTQyBjb25zdGFudERlc2NyaXB0aW9uOworICAgIFVJTlQgZGVzY3JpcHRpb25Db3VudCA9IDE7CisKKyAgICBpZihjb25zdGFudFBTKQorICAgIHsKKwkJbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50UFMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCUFTU0VSVChjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyU2V0ID09IEQzRFhSU19GTE9BVDQpOworCQlkZXZpY2UtPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisgICAgaWYoY29uc3RhbnRWUykKKyAgICB7CisJCW1Db25zdGFudFRhYmxlVlMtPkdldENvbnN0YW50RGVzYyhjb25zdGFudFZTLCAmY29uc3RhbnREZXNjcmlwdGlvbiwgJmRlc2NyaXB0aW9uQ291bnQpOworCQlBU1NFUlQoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlclNldCA9PSBEM0RYUlNfRkxPQVQ0KTsKKwkJZGV2aWNlLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXZlY3RvciwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICBkZWxldGUgW10gdmVjdG9yOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6YXBwbHlVbmlmb3JtMWZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KQoreworCWZsb2F0ICgqdmVjdG9yKVs0XSA9IG5ldyBmbG9hdFtjb3VudF1bNF07CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHZlY3RvcltpXVswXSA9IHZbMF07CisJCXZlY3RvcltpXVsxXSA9IDA7CisJCXZlY3RvcltpXVsyXSA9IDA7CisJCXZlY3RvcltpXVszXSA9IDA7CisKKyAgICAgICAgdiArPSAxOworICAgIH0KKworICAgIFVuaWZvcm0gKnRhcmdldFVuaWZvcm0gPSBtVW5pZm9ybXNbbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uaW5kZXhdOworCisgICAgRDNEWEhBTkRMRSBjb25zdGFudFBTOworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRWUzsKKyAgICBnZXRDb25zdGFudEhhbmRsZXModGFyZ2V0VW5pZm9ybSwgJmNvbnN0YW50UFMsICZjb25zdGFudFZTKTsKKyAgICAKKwlEZXZpY2UgKmRldmljZSA9IGdldERldmljZSgpOworCUQzRFhDT05TVEFOVF9ERVNDIGNvbnN0YW50RGVzY3JpcHRpb247CisgICAgVUlOVCBkZXNjcmlwdGlvbkNvdW50ID0gMTsKKworICAgIGlmKGNvbnN0YW50UFMpCisgICAgewkKKwkJbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50UFMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCWRldmljZS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXZlY3RvciwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICBpZihjb25zdGFudFZTKQorICAgIHsKKwkJbUNvbnN0YW50VGFibGVWUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50VlMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCWRldmljZS0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisJZGVsZXRlW10gdmVjdG9yOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6YXBwbHlVbmlmb3JtMmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KQoreworICAgIGZsb2F0ICgqdmVjdG9yKVs0XSA9IG5ldyBmbG9hdFtjb3VudF1bNF07CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHZlY3RvcltpXVswXSA9IHZbMF07CisJCXZlY3RvcltpXVsxXSA9IHZbMV07CisJCXZlY3RvcltpXVsyXSA9IDA7CisJCXZlY3RvcltpXVszXSA9IDA7CisKKyAgICAgICAgdiArPSAyOworICAgIH0KKworICAgIFVuaWZvcm0gKnRhcmdldFVuaWZvcm0gPSBtVW5pZm9ybXNbbVVuaWZvcm1JbmRleFtsb2NhdGlvbl0uaW5kZXhdOworCisgICAgRDNEWEhBTkRMRSBjb25zdGFudFBTOworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRWUzsKKyAgICBnZXRDb25zdGFudEhhbmRsZXModGFyZ2V0VW5pZm9ybSwgJmNvbnN0YW50UFMsICZjb25zdGFudFZTKTsKKyAgICAKKwlEZXZpY2UgKmRldmljZSA9IGdldERldmljZSgpOworCUQzRFhDT05TVEFOVF9ERVNDIGNvbnN0YW50RGVzY3JpcHRpb247CisgICAgVUlOVCBkZXNjcmlwdGlvbkNvdW50ID0gMTsKKworICAgIGlmKGNvbnN0YW50UFMpCisgICAgeworCQltQ29uc3RhbnRUYWJsZVBTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRQUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKwkJZGV2aWNlLT5zZXRQaXhlbFNoYWRlckNvbnN0YW50Rihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVySW5kZXgsIChmbG9hdCopdmVjdG9yLCBjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyQ291bnQpOworICAgIH0KKworICAgIGlmKGNvbnN0YW50VlMpCisgICAgeworCQltQ29uc3RhbnRUYWJsZVZTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRWUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKwkJZGV2aWNlLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXZlY3RvciwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICBkZWxldGVbXSB2ZWN0b3I7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcm9ncmFtOjphcHBseVVuaWZvcm0zZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpCit7CisgICAgZmxvYXQgKCp2ZWN0b3IpWzRdID0gbmV3IGZsb2F0W2NvdW50XVs0XTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgdmVjdG9yW2ldWzBdID0gdlswXTsKKwkJdmVjdG9yW2ldWzFdID0gdlsxXTsKKwkJdmVjdG9yW2ldWzJdID0gdlsyXTsKKwkJdmVjdG9yW2ldWzNdID0gMDsKKworICAgICAgICB2ICs9IDM7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisKKyAgICBEM0RYSEFORExFIGNvbnN0YW50UFM7CisgICAgRDNEWEhBTkRMRSBjb25zdGFudFZTOworICAgIGdldENvbnN0YW50SGFuZGxlcyh0YXJnZXRVbmlmb3JtLCAmY29uc3RhbnRQUywgJmNvbnN0YW50VlMpOworICAgIAorCURldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisJRDNEWENPTlNUQU5UX0RFU0MgY29uc3RhbnREZXNjcmlwdGlvbjsKKyAgICBVSU5UIGRlc2NyaXB0aW9uQ291bnQgPSAxOworCisgICAgaWYoY29uc3RhbnRQUykKKyAgICB7CisJCW1Db25zdGFudFRhYmxlUFMtPkdldENvbnN0YW50RGVzYyhjb25zdGFudFBTLCAmY29uc3RhbnREZXNjcmlwdGlvbiwgJmRlc2NyaXB0aW9uQ291bnQpOworCQlkZXZpY2UtPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisgICAgaWYoY29uc3RhbnRWUykKKyAgICB7CisJCW1Db25zdGFudFRhYmxlVlMtPkdldENvbnN0YW50RGVzYyhjb25zdGFudFZTLCAmY29uc3RhbnREZXNjcmlwdGlvbiwgJmRlc2NyaXB0aW9uQ291bnQpOworCQlkZXZpY2UtPnNldFZlcnRleFNoYWRlckNvbnN0YW50Rihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVySW5kZXgsIChmbG9hdCopdmVjdG9yLCBjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyQ291bnQpOworICAgIH0KKworICAgIGRlbGV0ZVtdIHZlY3RvcjsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OmFwcGx5VW5pZm9ybTRmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdikKK3sKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRQUzsKKyAgICBEM0RYSEFORExFIGNvbnN0YW50VlM7CisgICAgZ2V0Q29uc3RhbnRIYW5kbGVzKHRhcmdldFVuaWZvcm0sICZjb25zdGFudFBTLCAmY29uc3RhbnRWUyk7CisgICAgCisJRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKwlEM0RYQ09OU1RBTlRfREVTQyBjb25zdGFudERlc2NyaXB0aW9uOworICAgIFVJTlQgZGVzY3JpcHRpb25Db3VudCA9IDE7CisKKyAgICBpZihjb25zdGFudFBTKQorICAgIHsKKwkJbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50UFMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCWRldmljZS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXYsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisgICAgaWYoY29uc3RhbnRWUykKKyAgICB7CisJCW1Db25zdGFudFRhYmxlVlMtPkdldENvbnN0YW50RGVzYyhjb25zdGFudFZTLCAmY29uc3RhbnREZXNjcmlwdGlvbiwgJmRlc2NyaXB0aW9uQ291bnQpOworCQlkZXZpY2UtPnNldFZlcnRleFNoYWRlckNvbnN0YW50Rihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVySW5kZXgsIChmbG9hdCopdiwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcm9ncmFtOjphcHBseVVuaWZvcm1NYXRyaXgyZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKQoreworICAgIGZsb2F0ICgqbWF0cml4KVsyXVs0XSA9IG5ldyBmbG9hdFtjb3VudF1bMl1bNF07CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIG1hdHJpeFtpXVswXVswXSA9IHZhbHVlWzBdOwltYXRyaXhbaV1bMF1bMV0gPSB2YWx1ZVsyXTsJbWF0cml4W2ldWzBdWzJdID0gMDsgbWF0cml4W2ldWzBdWzNdID0gMDsKKwkJbWF0cml4W2ldWzFdWzBdID0gdmFsdWVbMV07CW1hdHJpeFtpXVsxXVsxXSA9IHZhbHVlWzNdOwltYXRyaXhbaV1bMV1bMl0gPSAwOyBtYXRyaXhbaV1bMV1bM10gPSAwOworCisgICAgICAgIHZhbHVlICs9IDQ7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisKKyAgICBEM0RYSEFORExFIGNvbnN0YW50UFM7CisgICAgRDNEWEhBTkRMRSBjb25zdGFudFZTOworICAgIGdldENvbnN0YW50SGFuZGxlcyh0YXJnZXRVbmlmb3JtLCAmY29uc3RhbnRQUywgJmNvbnN0YW50VlMpOworICAgIAorCURldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisJRDNEWENPTlNUQU5UX0RFU0MgY29uc3RhbnREZXNjcmlwdGlvbjsKKyAgICBVSU5UIGRlc2NyaXB0aW9uQ291bnQgPSAxOworCisgICAgaWYoY29uc3RhbnRQUykKKyAgICB7CisJCW1Db25zdGFudFRhYmxlUFMtPkdldENvbnN0YW50RGVzYyhjb25zdGFudFBTLCAmY29uc3RhbnREZXNjcmlwdGlvbiwgJmRlc2NyaXB0aW9uQ291bnQpOworCQlkZXZpY2UtPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0KiltYXRyaXgsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisgICAgaWYoY29uc3RhbnRWUykKKyAgICB7CQorCQltQ29uc3RhbnRUYWJsZVZTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRWUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKwkJZGV2aWNlLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKW1hdHJpeCwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICBkZWxldGVbXSBtYXRyaXg7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcm9ncmFtOjphcHBseVVuaWZvcm1NYXRyaXgzZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKQoreworICAgIGZsb2F0ICgqbWF0cml4KVszXVs0XSA9IG5ldyBmbG9hdFtjb3VudF1bM11bNF07CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIG1hdHJpeFtpXVswXVswXSA9IHZhbHVlWzBdOwltYXRyaXhbaV1bMF1bMV0gPSB2YWx1ZVszXTsJbWF0cml4W2ldWzBdWzJdID0gdmFsdWVbNl07CW1hdHJpeFtpXVswXVszXSA9IDA7CisJCW1hdHJpeFtpXVsxXVswXSA9IHZhbHVlWzFdOwltYXRyaXhbaV1bMV1bMV0gPSB2YWx1ZVs0XTsJbWF0cml4W2ldWzFdWzJdID0gdmFsdWVbN107CW1hdHJpeFtpXVsxXVszXSA9IDA7CisJCW1hdHJpeFtpXVsyXVswXSA9IHZhbHVlWzJdOwltYXRyaXhbaV1bMl1bMV0gPSB2YWx1ZVs1XTsJbWF0cml4W2ldWzJdWzJdID0gdmFsdWVbOF07CW1hdHJpeFtpXVsyXVszXSA9IDA7CisKKyAgICAgICAgdmFsdWUgKz0gOTsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRQUzsKKyAgICBEM0RYSEFORExFIGNvbnN0YW50VlM7CisgICAgZ2V0Q29uc3RhbnRIYW5kbGVzKHRhcmdldFVuaWZvcm0sICZjb25zdGFudFBTLCAmY29uc3RhbnRWUyk7CisgICAgCisJRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKwlEM0RYQ09OU1RBTlRfREVTQyBjb25zdGFudERlc2NyaXB0aW9uOworICAgIFVJTlQgZGVzY3JpcHRpb25Db3VudCA9IDE7CisKKyAgICBpZihjb25zdGFudFBTKQorICAgIHsKKwkJbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50UFMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCWRldmljZS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKW1hdHJpeCwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICBpZihjb25zdGFudFZTKQorICAgIHsJCisJCW1Db25zdGFudFRhYmxlVlMtPkdldENvbnN0YW50RGVzYyhjb25zdGFudFZTLCAmY29uc3RhbnREZXNjcmlwdGlvbiwgJmRlc2NyaXB0aW9uQ291bnQpOworCQlkZXZpY2UtPnNldFZlcnRleFNoYWRlckNvbnN0YW50Rihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVySW5kZXgsIChmbG9hdCopbWF0cml4LCBjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyQ291bnQpOworICAgIH0KKworICAgIGRlbGV0ZVtdIG1hdHJpeDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OmFwcGx5VW5pZm9ybU1hdHJpeDRmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpCit7CisJZmxvYXQgKCptYXRyaXgpWzRdWzRdID0gbmV3IGZsb2F0W2NvdW50XVs0XVs0XTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgbWF0cml4W2ldWzBdWzBdID0gdmFsdWVbMF07IG1hdHJpeFtpXVswXVsxXSA9IHZhbHVlWzRdOwltYXRyaXhbaV1bMF1bMl0gPSB2YWx1ZVs4XTsgIG1hdHJpeFtpXVswXVszXSA9IHZhbHVlWzEyXTsKKwkJbWF0cml4W2ldWzFdWzBdID0gdmFsdWVbMV07CW1hdHJpeFtpXVsxXVsxXSA9IHZhbHVlWzVdOwltYXRyaXhbaV1bMV1bMl0gPSB2YWx1ZVs5XTsJIG1hdHJpeFtpXVsxXVszXSA9IHZhbHVlWzEzXTsKKwkJbWF0cml4W2ldWzJdWzBdID0gdmFsdWVbMl07CW1hdHJpeFtpXVsyXVsxXSA9IHZhbHVlWzZdOwltYXRyaXhbaV1bMl1bMl0gPSB2YWx1ZVsxMF07IG1hdHJpeFtpXVsyXVszXSA9IHZhbHVlWzE0XTsKKwkJbWF0cml4W2ldWzNdWzBdID0gdmFsdWVbM107CW1hdHJpeFtpXVszXVsxXSA9IHZhbHVlWzddOwltYXRyaXhbaV1bM11bMl0gPSB2YWx1ZVsxMV07IG1hdHJpeFtpXVszXVszXSA9IHZhbHVlWzE1XTsKKworICAgICAgICB2YWx1ZSArPSAxNjsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRQUzsKKyAgICBEM0RYSEFORExFIGNvbnN0YW50VlM7CisgICAgZ2V0Q29uc3RhbnRIYW5kbGVzKHRhcmdldFVuaWZvcm0sICZjb25zdGFudFBTLCAmY29uc3RhbnRWUyk7CisgICAgCisJRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKwlEM0RYQ09OU1RBTlRfREVTQyBjb25zdGFudERlc2NyaXB0aW9uOworICAgIFVJTlQgZGVzY3JpcHRpb25Db3VudCA9IDE7CisKKyAgICBpZihjb25zdGFudFBTKQorICAgIHsKKwkJbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50UFMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCWRldmljZS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKW1hdHJpeCwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICBpZihjb25zdGFudFZTKQorICAgIHsJCisJCW1Db25zdGFudFRhYmxlVlMtPkdldENvbnN0YW50RGVzYyhjb25zdGFudFZTLCAmY29uc3RhbnREZXNjcmlwdGlvbiwgJmRlc2NyaXB0aW9uQ291bnQpOworCQlkZXZpY2UtPnNldFZlcnRleFNoYWRlckNvbnN0YW50Rihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVySW5kZXgsIChmbG9hdCopbWF0cml4LCBjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyQ291bnQpOworICAgIH0KKworICAgIGRlbGV0ZVtdIG1hdHJpeDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OmFwcGx5VW5pZm9ybTFpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYpCit7CisJZmxvYXQgKCp2ZWN0b3IpWzRdID0gbmV3IGZsb2F0W2NvdW50XVs0XTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgdmVjdG9yW2ldWzBdID0gKGZsb2F0KXZbaV07CisJCXZlY3RvcltpXVsxXSA9IDA7CisJCXZlY3RvcltpXVsyXSA9IDA7CisJCXZlY3RvcltpXVszXSA9IDA7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisKKyAgICBEM0RYSEFORExFIGNvbnN0YW50UFM7CisgICAgRDNEWEhBTkRMRSBjb25zdGFudFZTOworICAgIGdldENvbnN0YW50SGFuZGxlcyh0YXJnZXRVbmlmb3JtLCAmY29uc3RhbnRQUywgJmNvbnN0YW50VlMpOworICAgIERldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisKKyAgICBpZihjb25zdGFudFBTKQorICAgIHsKKyAgICAgICAgRDNEWENPTlNUQU5UX0RFU0MgY29uc3RhbnREZXNjcmlwdGlvbjsKKyAgICAgICAgVUlOVCBkZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBtQ29uc3RhbnRUYWJsZVBTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRQUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKyAgICAgICAgQVNTRVJUKFNVQ0NFRURFRChyZXN1bHQpKTsKKworICAgICAgICBpZihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyU2V0ID09IEQzRFhSU19TQU1QTEVSKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmlyc3RJbmRleCA9IG1Db25zdGFudFRhYmxlUFMtPkdldFNhbXBsZXJJbmRleChjb25zdGFudFBTKTsKKworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNhbXBsZXJJbmRleCA9IGZpcnN0SW5kZXggKyBpOworCisgICAgICAgICAgICAgICAgaWYoc2FtcGxlckluZGV4IDwgTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlQobVNhbXBsZXJzUFNbc2FtcGxlckluZGV4XS5hY3RpdmUpOworICAgICAgICAgICAgICAgICAgICBtU2FtcGxlcnNQU1tzYW1wbGVySW5kZXhdLmxvZ2ljYWxUZXh0dXJlVW5pdCA9IHZbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCQkJQVNTRVJUKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJTZXQgPT0gRDNEWFJTX0ZMT0FUNCk7CisJCQlkZXZpY2UtPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihjb25zdGFudFZTKQorICAgIHsKKyAgICAgICAgRDNEWENPTlNUQU5UX0RFU0MgY29uc3RhbnREZXNjcmlwdGlvbjsKKyAgICAgICAgVUlOVCBkZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBtQ29uc3RhbnRUYWJsZVZTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRWUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKyAgICAgICAgQVNTRVJUKFNVQ0NFRURFRChyZXN1bHQpKTsKKworICAgICAgICBpZihjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyU2V0ID09IEQzRFhSU19TQU1QTEVSKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmlyc3RJbmRleCA9IG1Db25zdGFudFRhYmxlVlMtPkdldFNhbXBsZXJJbmRleChjb25zdGFudFZTKTsKKworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNhbXBsZXJJbmRleCA9IGZpcnN0SW5kZXggKyBpOworCisgICAgICAgICAgICAgICAgaWYoc2FtcGxlckluZGV4IDwgTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKG1TYW1wbGVyc1ZTW3NhbXBsZXJJbmRleF0uYWN0aXZlKTsKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXJzVlNbc2FtcGxlckluZGV4XS5sb2dpY2FsVGV4dHVyZVVuaXQgPSB2W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKwkJCUFTU0VSVChjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyU2V0ID09IEQzRFhSU19GTE9BVDQpOworCQkJZGV2aWNlLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXZlY3RvciwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworCWRlbGV0ZVtdIHZlY3RvcjsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFByb2dyYW06OmFwcGx5VW5pZm9ybTJpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYpCit7CisgICAgZmxvYXQgKCp2ZWN0b3IpWzRdID0gbmV3IGZsb2F0W2NvdW50XVs0XTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgdmVjdG9yW2ldWzBdID0gKGZsb2F0KXZbMF07CisJCXZlY3RvcltpXVsxXSA9IChmbG9hdCl2WzFdOworCQl2ZWN0b3JbaV1bMl0gPSAwOworCQl2ZWN0b3JbaV1bM10gPSAwOworCisgICAgICAgIHYgKz0gMjsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRQUzsKKyAgICBEM0RYSEFORExFIGNvbnN0YW50VlM7CisgICAgZ2V0Q29uc3RhbnRIYW5kbGVzKHRhcmdldFVuaWZvcm0sICZjb25zdGFudFBTLCAmY29uc3RhbnRWUyk7CisgICAgCisJRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKwlEM0RYQ09OU1RBTlRfREVTQyBjb25zdGFudERlc2NyaXB0aW9uOworICAgIFVJTlQgZGVzY3JpcHRpb25Db3VudCA9IDE7CisKKyAgICBpZihjb25zdGFudFBTKQorICAgIHsKKwkJbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50UFMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCUFTU0VSVChjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyU2V0ID09IEQzRFhSU19GTE9BVDQpOworCQlkZXZpY2UtPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisgICAgaWYoY29uc3RhbnRWUykKKyAgICB7CQorCQltQ29uc3RhbnRUYWJsZVZTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRWUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKwkJQVNTRVJUKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJTZXQgPT0gRDNEWFJTX0ZMT0FUNCk7CisJCWRldmljZS0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisgICAgZGVsZXRlW10gdmVjdG9yOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6YXBwbHlVbmlmb3JtM2l2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdikKK3sKKyAgICBmbG9hdCAoKnZlY3RvcilbNF0gPSBuZXcgZmxvYXRbY291bnRdWzRdOworCisgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgICB2ZWN0b3JbaV1bMF0gPSAoZmxvYXQpdlswXTsKKwkJdmVjdG9yW2ldWzFdID0gKGZsb2F0KXZbMV07CisJCXZlY3RvcltpXVsyXSA9IChmbG9hdCl2WzJdOworCQl2ZWN0b3JbaV1bM10gPSAwOworCisgICAgICAgIHYgKz0gMzsKKyAgICB9CisKKyAgICBVbmlmb3JtICp0YXJnZXRVbmlmb3JtID0gbVVuaWZvcm1zW21Vbmlmb3JtSW5kZXhbbG9jYXRpb25dLmluZGV4XTsKKworICAgIEQzRFhIQU5ETEUgY29uc3RhbnRQUzsKKyAgICBEM0RYSEFORExFIGNvbnN0YW50VlM7CisgICAgZ2V0Q29uc3RhbnRIYW5kbGVzKHRhcmdldFVuaWZvcm0sICZjb25zdGFudFBTLCAmY29uc3RhbnRWUyk7CisgICAgCisJRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKwlEM0RYQ09OU1RBTlRfREVTQyBjb25zdGFudERlc2NyaXB0aW9uOworICAgIFVJTlQgZGVzY3JpcHRpb25Db3VudCA9IDE7CisKKyAgICBpZihjb25zdGFudFBTKQorICAgIHsKKwkJbUNvbnN0YW50VGFibGVQUy0+R2V0Q29uc3RhbnREZXNjKGNvbnN0YW50UFMsICZjb25zdGFudERlc2NyaXB0aW9uLCAmZGVzY3JpcHRpb25Db3VudCk7CisJCUFTU0VSVChjb25zdGFudERlc2NyaXB0aW9uLlJlZ2lzdGVyU2V0ID09IEQzRFhSU19GTE9BVDQpOworCQlkZXZpY2UtPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisgICAgaWYoY29uc3RhbnRWUykKKyAgICB7CQorCQltQ29uc3RhbnRUYWJsZVZTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRWUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKwkJQVNTRVJUKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJTZXQgPT0gRDNEWFJTX0ZMT0FUNCk7CisJCWRldmljZS0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisgICAgZGVsZXRlW10gdmVjdG9yOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6YXBwbHlVbmlmb3JtNGl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdikKK3sKKyAgICBmbG9hdCAoKnZlY3RvcilbNF0gPSBuZXcgZmxvYXRbY291bnRdWzRdOworCisgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgICB2ZWN0b3JbaV1bMF0gPSAoZmxvYXQpdlswXTsKKwkJdmVjdG9yW2ldWzFdID0gKGZsb2F0KXZbMV07CisJCXZlY3RvcltpXVsyXSA9IChmbG9hdCl2WzJdOworCQl2ZWN0b3JbaV1bM10gPSAoZmxvYXQpdlszXTsKKworICAgICAgICB2ICs9IDQ7CisgICAgfQorCisgICAgVW5pZm9ybSAqdGFyZ2V0VW5pZm9ybSA9IG1Vbmlmb3Jtc1ttVW5pZm9ybUluZGV4W2xvY2F0aW9uXS5pbmRleF07CisKKyAgICBEM0RYSEFORExFIGNvbnN0YW50UFM7CisgICAgRDNEWEhBTkRMRSBjb25zdGFudFZTOworICAgIGdldENvbnN0YW50SGFuZGxlcyh0YXJnZXRVbmlmb3JtLCAmY29uc3RhbnRQUywgJmNvbnN0YW50VlMpOworICAgIAorCURldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisJRDNEWENPTlNUQU5UX0RFU0MgY29uc3RhbnREZXNjcmlwdGlvbjsKKyAgICBVSU5UIGRlc2NyaXB0aW9uQ291bnQgPSAxOworCisgICAgaWYoY29uc3RhbnRQUykKKyAgICB7CisJCW1Db25zdGFudFRhYmxlUFMtPkdldENvbnN0YW50RGVzYyhjb25zdGFudFBTLCAmY29uc3RhbnREZXNjcmlwdGlvbiwgJmRlc2NyaXB0aW9uQ291bnQpOworCQlkZXZpY2UtPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJJbmRleCwgKGZsb2F0Kil2ZWN0b3IsIGNvbnN0YW50RGVzY3JpcHRpb24uUmVnaXN0ZXJDb3VudCk7CisgICAgfQorCisgICAgaWYoY29uc3RhbnRWUykKKyAgICB7CQorCQltQ29uc3RhbnRUYWJsZVZTLT5HZXRDb25zdGFudERlc2MoY29uc3RhbnRWUywgJmNvbnN0YW50RGVzY3JpcHRpb24sICZkZXNjcmlwdGlvbkNvdW50KTsKKwkJZGV2aWNlLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckluZGV4LCAoZmxvYXQqKXZlY3RvciwgY29uc3RhbnREZXNjcmlwdGlvbi5SZWdpc3RlckNvdW50KTsKKyAgICB9CisKKyAgICBkZWxldGUgW10gdmVjdG9yOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gYXBwZW5kIGEgc2FudGl6ZWQgbWVzc2FnZSB0byB0aGUgcHJvZ3JhbSBpbmZvIGxvZy4KKy8vIFRoZSBEM0QgY29tcGlsZXIgaW5jbHVkZXMgYSBmYWtlIGZpbGUgcGF0aCBpbiBzb21lIG9mIHRoZSB3YXJuaW5nIG9yIGVycm9yIAorLy8gbWVzc2FnZXMsIHNvIGxldHMgcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGlzIGZha2UgZmlsZSBwYXRoIGZyb20gdGhlIGxvZy4KK3ZvaWQgUHJvZ3JhbTo6YXBwZW5kVG9JbmZvTG9nU2FuaXRpemVkKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgICAgc3RkOjpzdHJpbmcgbXNnKG1lc3NhZ2UpOworCisgICAgc2l6ZV90IGZvdW5kOworICAgIGRvCisgICAgeworICAgICAgICBmb3VuZCA9IG1zZy5maW5kKGZha2VwYXRoKTsKKyAgICAgICAgaWYoZm91bmQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZy5lcmFzZShmb3VuZCwgc3RybGVuKGZha2VwYXRoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoZm91bmQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpOworCisgICAgYXBwZW5kVG9JbmZvTG9nKCIlc1xuIiwgbXNnLmNfc3RyKCkpOworfQorCit2b2lkIFByb2dyYW06OmFwcGVuZFRvSW5mb0xvZyhjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICBpZighZm9ybWF0KQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNoYXIgaW5mb1sxMDI0XTsKKworICAgIHZhX2xpc3QgdmFyYXJnOworICAgIHZhX3N0YXJ0KHZhcmFyZywgZm9ybWF0KTsKKyAgICB2c25wcmludGYoaW5mbywgc2l6ZW9mKGluZm8pLCBmb3JtYXQsIHZhcmFyZyk7CisgICAgdmFfZW5kKHZhcmFyZyk7CisKKyAgICBzaXplX3QgaW5mb0xlbmd0aCA9IHN0cmxlbihpbmZvKTsKKworICAgIGlmKCFtSW5mb0xvZykKKyAgICB7CisgICAgICAgIG1JbmZvTG9nID0gbmV3IGNoYXJbaW5mb0xlbmd0aCArIDFdOworICAgICAgICBzdHJjcHkobUluZm9Mb2csIGluZm8pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzaXplX3QgbG9nTGVuZ3RoID0gc3RybGVuKG1JbmZvTG9nKTsKKyAgICAgICAgY2hhciAqbmV3TG9nID0gbmV3IGNoYXJbbG9nTGVuZ3RoICsgaW5mb0xlbmd0aCArIDFdOworICAgICAgICBzdHJjcHkobmV3TG9nLCBtSW5mb0xvZyk7CisgICAgICAgIHN0cmNweShuZXdMb2cgKyBsb2dMZW5ndGgsIGluZm8pOworCisgICAgICAgIGRlbGV0ZVtdIG1JbmZvTG9nOworICAgICAgICBtSW5mb0xvZyA9IG5ld0xvZzsKKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbTo6cmVzZXRJbmZvTG9nKCkKK3sKKyAgICBpZihtSW5mb0xvZykKKyAgICB7CisgICAgICAgIGRlbGV0ZSBbXSBtSW5mb0xvZzsKKyAgICAgICAgbUluZm9Mb2cgPSBOVUxMOworICAgIH0KK30KKworLy8gUmV0dXJucyB0aGUgcHJvZ3JhbSBvYmplY3QgdG8gYW4gdW5saW5rZWQgc3RhdGUsIGJlZm9yZSByZS1saW5raW5nLCBvciBhdCBkZXN0cnVjdGlvbgordm9pZCBQcm9ncmFtOjp1bmxpbmsoYm9vbCBkZXN0cm95KQoreworICAgIGlmKGRlc3Ryb3kpICAgLy8gT2JqZWN0IGJlaW5nIGRlc3RydWN0ZWQKKyAgICB7CisgICAgICAgIGlmKG1GcmFnbWVudFNoYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgbUZyYWdtZW50U2hhZGVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtRnJhZ21lbnRTaGFkZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYobVZlcnRleFNoYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgbVZlcnRleFNoYWRlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbVZlcnRleFNoYWRlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgbVBpeGVsRXhlY3V0YWJsZTsKKyAgICBtUGl4ZWxFeGVjdXRhYmxlID0gTlVMTDsKKworICAgIGRlbGV0ZSBtVmVydGV4RXhlY3V0YWJsZTsKKyAgICBtVmVydGV4RXhlY3V0YWJsZSA9IE5VTEw7CisKKyAgICBpZihtQ29uc3RhbnRUYWJsZVBTKQorICAgIHsKKyAgICAgICAgbUNvbnN0YW50VGFibGVQUy0+UmVsZWFzZSgpOworICAgICAgICBtQ29uc3RhbnRUYWJsZVBTID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihtQ29uc3RhbnRUYWJsZVZTKQorICAgIHsKKyAgICAgICAgbUNvbnN0YW50VGFibGVWUy0+UmVsZWFzZSgpOworICAgICAgICBtQ29uc3RhbnRUYWJsZVZTID0gTlVMTDsKKyAgICB9CisKKyAgICBmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCBNQVhfVkVSVEVYX0FUVFJJQlM7IGluZGV4KyspCisgICAgeworICAgICAgICBtTGlua2VkQXR0cmlidXRlW2luZGV4XS5uYW1lLmNsZWFyKCk7CisgICAgICAgIG1TZW1hbnRpY0luZGV4W2luZGV4XSA9IC0xOworICAgIH0KKworICAgIGZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTOyBpbmRleCsrKQorICAgIHsKKyAgICAgICAgbVNhbXBsZXJzUFNbaW5kZXhdLmFjdGl2ZSA9IGZhbHNlOworICAgIH0KKworICAgIGZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUzsgaW5kZXgrKykKKyAgICB7CisgICAgICAgIG1TYW1wbGVyc1ZTW2luZGV4XS5hY3RpdmUgPSBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSghbVVuaWZvcm1zLmVtcHR5KCkpCisgICAgeworICAgICAgICBkZWxldGUgbVVuaWZvcm1zLmJhY2soKTsKKyAgICAgICAgbVVuaWZvcm1zLnBvcF9iYWNrKCk7CisgICAgfQorCisgICAgbUR4RGVwdGhSYW5nZUxvY2F0aW9uID0gLTE7CisgICAgbUR4RGVwdGhMb2NhdGlvbiA9IC0xOworICAgIG1EeFZpZXdwb3J0TG9jYXRpb24gPSAtMTsKKyAgICBtRHhIYWxmUGl4ZWxTaXplTG9jYXRpb24gPSAtMTsKKyAgICBtRHhGcm9udENDV0xvY2F0aW9uID0gLTE7CisgICAgbUR4UG9pbnRzT3JMaW5lc0xvY2F0aW9uID0gLTE7CisKKyAgICBtVW5pZm9ybUluZGV4LmNsZWFyKCk7CisKKyAgICBtUGl4ZWxITFNMLmNsZWFyKCk7CisgICAgbVZlcnRleEhMU0wuY2xlYXIoKTsKKworICAgIGRlbGV0ZVtdIG1JbmZvTG9nOworICAgIG1JbmZvTG9nID0gTlVMTDsKKworICAgIG1MaW5rZWQgPSBmYWxzZTsKK30KKworYm9vbCBQcm9ncmFtOjppc0xpbmtlZCgpCit7CisgICAgcmV0dXJuIG1MaW5rZWQ7Cit9CisKK2Jvb2wgUHJvZ3JhbTo6aXNWYWxpZGF0ZWQoKSBjb25zdCAKK3sKKyAgICByZXR1cm4gbVZhbGlkYXRlZDsKK30KKwordm9pZCBQcm9ncmFtOjpyZWxlYXNlKCkKK3sKKyAgICBtUmVmQ291bnQtLTsKKworICAgIGlmKG1SZWZDb3VudCA9PSAwICYmIG1EZWxldGVTdGF0dXMpCisgICAgeworICAgICAgICBtUmVzb3VyY2VNYW5hZ2VyLT5kZWxldGVQcm9ncmFtKG1IYW5kbGUpOworICAgIH0KK30KKwordm9pZCBQcm9ncmFtOjphZGRSZWYoKQoreworICAgIG1SZWZDb3VudCsrOworfQorCit1bnNpZ25lZCBpbnQgUHJvZ3JhbTo6Z2V0UmVmQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtUmVmQ291bnQ7Cit9CisKK3Vuc2lnbmVkIGludCBQcm9ncmFtOjpnZXRTZXJpYWwoKSBjb25zdAoreworICAgIHJldHVybiBtU2VyaWFsOworfQorCit1bnNpZ25lZCBpbnQgUHJvZ3JhbTo6aXNzdWVTZXJpYWwoKQoreworICAgIHJldHVybiBtQ3VycmVudFNlcmlhbCsrOworfQorCitpbnQgUHJvZ3JhbTo6Z2V0SW5mb0xvZ0xlbmd0aCgpIGNvbnN0Cit7CisgICAgaWYoIW1JbmZvTG9nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIHN0cmxlbihtSW5mb0xvZykgKyAxOworICAgIH0KK30KKwordm9pZCBQcm9ncmFtOjpnZXRJbmZvTG9nKEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBjaGFyICppbmZvTG9nKQoreworICAgIGludCBpbmRleCA9IDA7CisKKyAgICBpZihtSW5mb0xvZykKKyAgICB7CisgICAgICAgIHdoaWxlKGluZGV4IDwgYnVmU2l6ZSAtIDEgJiYgaW5kZXggPCAoaW50KXN0cmxlbihtSW5mb0xvZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZm9Mb2dbaW5kZXhdID0gbUluZm9Mb2dbaW5kZXhdOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGJ1ZlNpemUpCisgICAgeworICAgICAgICBpbmZvTG9nW2luZGV4XSA9ICdcMCc7CisgICAgfQorCisgICAgaWYobGVuZ3RoKQorICAgIHsKKyAgICAgICAgKmxlbmd0aCA9IGluZGV4OworICAgIH0KK30KKwordm9pZCBQcm9ncmFtOjpnZXRBdHRhY2hlZFNoYWRlcnMoR0xzaXplaSBtYXhDb3VudCwgR0xzaXplaSAqY291bnQsIEdMdWludCAqc2hhZGVycykKK3sKKyAgICBpbnQgdG90YWwgPSAwOworCisgICAgaWYobVZlcnRleFNoYWRlcikKKyAgICB7CisgICAgICAgIGlmKHRvdGFsIDwgbWF4Q291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoYWRlcnNbdG90YWxdID0gbVZlcnRleFNoYWRlci0+Z2V0SGFuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICB0b3RhbCsrOworICAgIH0KKworICAgIGlmKG1GcmFnbWVudFNoYWRlcikKKyAgICB7CisgICAgICAgIGlmKHRvdGFsIDwgbWF4Q291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoYWRlcnNbdG90YWxdID0gbUZyYWdtZW50U2hhZGVyLT5nZXRIYW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsKys7CisgICAgfQorCisgICAgaWYoY291bnQpCisgICAgeworICAgICAgICAqY291bnQgPSB0b3RhbDsKKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbTo6Z2V0QWN0aXZlQXR0cmlidXRlKEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSkKK3sKKyAgICAvLyBTa2lwIG92ZXIgaW5hY3RpdmUgYXR0cmlidXRlcworICAgIHVuc2lnbmVkIGludCBhY3RpdmVBdHRyaWJ1dGUgPSAwOworICAgIHVuc2lnbmVkIGludCBhdHRyaWJ1dGU7CisgICAgZm9yKGF0dHJpYnV0ZSA9IDA7IGF0dHJpYnV0ZSA8IE1BWF9WRVJURVhfQVRUUklCUzsgYXR0cmlidXRlKyspCisgICAgeworICAgICAgICBpZihtTGlua2VkQXR0cmlidXRlW2F0dHJpYnV0ZV0ubmFtZS5lbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGFjdGl2ZUF0dHJpYnV0ZSA9PSBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhY3RpdmVBdHRyaWJ1dGUrKzsKKyAgICB9CisKKyAgICBpZihidWZzaXplID4gMCkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZyA9IG1MaW5rZWRBdHRyaWJ1dGVbYXR0cmlidXRlXS5uYW1lLmNfc3RyKCk7CisKKyAgICAgICAgc3RybmNweShuYW1lLCBzdHJpbmcsIGJ1ZnNpemUpOworICAgICAgICBuYW1lW2J1ZnNpemUgLSAxXSA9ICdcMCc7CisKKyAgICAgICAgaWYobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAqbGVuZ3RoID0gc3RybGVuKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgKnNpemUgPSAxOyAgIC8vIEFsd2F5cyBhIHNpbmdsZSAndHlwZScgaW5zdGFuY2UKKworICAgICp0eXBlID0gbUxpbmtlZEF0dHJpYnV0ZVthdHRyaWJ1dGVdLnR5cGU7Cit9CisKK0dMaW50IFByb2dyYW06OmdldEFjdGl2ZUF0dHJpYnV0ZUNvdW50KCkKK3sKKyAgICBpbnQgY291bnQgPSAwOworCisgICAgZm9yKGludCBhdHRyaWJ1dGVJbmRleCA9IDA7IGF0dHJpYnV0ZUluZGV4IDwgTUFYX1ZFUlRFWF9BVFRSSUJTOyBhdHRyaWJ1dGVJbmRleCsrKQorICAgIHsKKyAgICAgICAgaWYoIW1MaW5rZWRBdHRyaWJ1dGVbYXR0cmlidXRlSW5kZXhdLm5hbWUuZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworR0xpbnQgUHJvZ3JhbTo6Z2V0QWN0aXZlQXR0cmlidXRlTWF4TGVuZ3RoKCkKK3sKKyAgICBpbnQgbWF4TGVuZ3RoID0gMDsKKworICAgIGZvcihpbnQgYXR0cmlidXRlSW5kZXggPSAwOyBhdHRyaWJ1dGVJbmRleCA8IE1BWF9WRVJURVhfQVRUUklCUzsgYXR0cmlidXRlSW5kZXgrKykKKyAgICB7CisgICAgICAgIGlmKCFtTGlua2VkQXR0cmlidXRlW2F0dHJpYnV0ZUluZGV4XS5uYW1lLmVtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heExlbmd0aCA9IHN0ZDo6bWF4KChpbnQpKG1MaW5rZWRBdHRyaWJ1dGVbYXR0cmlidXRlSW5kZXhdLm5hbWUubGVuZ3RoKCkgKyAxKSwgbWF4TGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXhMZW5ndGg7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6Z2V0QWN0aXZlVW5pZm9ybShHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpCit7CisgICAgLy8gU2tpcCBvdmVyIGludGVybmFsIHVuaWZvcm1zCisgICAgdW5zaWduZWQgaW50IGFjdGl2ZVVuaWZvcm0gPSAwOworICAgIHVuc2lnbmVkIGludCB1bmlmb3JtOworICAgIGZvcih1bmlmb3JtID0gMDsgdW5pZm9ybSA8IG1Vbmlmb3Jtcy5zaXplKCk7IHVuaWZvcm0rKykKKyAgICB7CisgICAgICAgIGlmKG1Vbmlmb3Jtc1t1bmlmb3JtXS0+bmFtZS5jb21wYXJlKDAsIDMsICJkeF8iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGFjdGl2ZVVuaWZvcm0gPT0gaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYWN0aXZlVW5pZm9ybSsrOworICAgIH0KKworICAgIEFTU0VSVCh1bmlmb3JtIDwgbVVuaWZvcm1zLnNpemUoKSk7ICAgLy8gaW5kZXggbXVzdCBiZSBzbWFsbGVyIHRoYW4gZ2V0QWN0aXZlVW5pZm9ybUNvdW50KCkKKworICAgIGlmKGJ1ZnNpemUgPiAwKQorICAgIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyaW5nID0gbVVuaWZvcm1zW3VuaWZvcm1dLT5uYW1lOworCisgICAgICAgIGlmKG1Vbmlmb3Jtc1t1bmlmb3JtXS0+aXNBcnJheSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgKz0gIlswXSI7CisgICAgICAgIH0KKworICAgICAgICBzdHJuY3B5KG5hbWUsIHN0cmluZy5jX3N0cigpLCBidWZzaXplKTsKKyAgICAgICAgbmFtZVtidWZzaXplIC0gMV0gPSAnXDAnOworCisgICAgICAgIGlmKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgKmxlbmd0aCA9IHN0cmxlbihuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpzaXplID0gbVVuaWZvcm1zW3VuaWZvcm1dLT5hcnJheVNpemU7CisKKyAgICAqdHlwZSA9IG1Vbmlmb3Jtc1t1bmlmb3JtXS0+dHlwZTsKK30KKworR0xpbnQgUHJvZ3JhbTo6Z2V0QWN0aXZlVW5pZm9ybUNvdW50KCkKK3sKKyAgICBpbnQgY291bnQgPSAwOworCisgICAgdW5zaWduZWQgaW50IG51bVVuaWZvcm1zID0gbVVuaWZvcm1zLnNpemUoKTsKKyAgICBmb3IodW5zaWduZWQgaW50IHVuaWZvcm1JbmRleCA9IDA7IHVuaWZvcm1JbmRleCA8IG51bVVuaWZvcm1zOyB1bmlmb3JtSW5kZXgrKykKKyAgICB7CisgICAgICAgIGlmKG1Vbmlmb3Jtc1t1bmlmb3JtSW5kZXhdLT5uYW1lLmNvbXBhcmUoMCwgMywgImR4XyIpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK0dMaW50IFByb2dyYW06OmdldEFjdGl2ZVVuaWZvcm1NYXhMZW5ndGgoKQoreworICAgIGludCBtYXhMZW5ndGggPSAwOworCisgICAgdW5zaWduZWQgaW50IG51bVVuaWZvcm1zID0gbVVuaWZvcm1zLnNpemUoKTsKKyAgICBmb3IodW5zaWduZWQgaW50IHVuaWZvcm1JbmRleCA9IDA7IHVuaWZvcm1JbmRleCA8IG51bVVuaWZvcm1zOyB1bmlmb3JtSW5kZXgrKykKKyAgICB7CisgICAgICAgIGlmKCFtVW5pZm9ybXNbdW5pZm9ybUluZGV4XS0+bmFtZS5lbXB0eSgpICYmIG1Vbmlmb3Jtc1t1bmlmb3JtSW5kZXhdLT5uYW1lLmNvbXBhcmUoMCwgMywgImR4XyIpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KShtVW5pZm9ybXNbdW5pZm9ybUluZGV4XS0+bmFtZS5sZW5ndGgoKSArIDEpOworICAgICAgICAgICAgaWYobVVuaWZvcm1zW3VuaWZvcm1JbmRleF0tPmlzQXJyYXkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gMzsgIC8vIENvdW50aW5nIGluICJbMF0iLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4TGVuZ3RoID0gc3RkOjptYXgobGVuZ3RoLCBtYXhMZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1heExlbmd0aDsKK30KKwordm9pZCBQcm9ncmFtOjpmbGFnRm9yRGVsZXRpb24oKQoreworICAgIG1EZWxldGVTdGF0dXMgPSB0cnVlOworfQorCitib29sIFByb2dyYW06OmlzRmxhZ2dlZEZvckRlbGV0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbURlbGV0ZVN0YXR1czsKK30KKwordm9pZCBQcm9ncmFtOjp2YWxpZGF0ZSgpCit7CisgICAgcmVzZXRJbmZvTG9nKCk7CisKKyAgICBpZighaXNMaW5rZWQoKSkgCisgICAgeworICAgICAgICBhcHBlbmRUb0luZm9Mb2coIlByb2dyYW0gaGFzIG5vdCBiZWVuIHN1Y2Nlc3NmdWxseSBsaW5rZWQuIik7CisgICAgICAgIG1WYWxpZGF0ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBwbHlVbmlmb3JtcygpOworICAgICAgICBpZighdmFsaWRhdGVTYW1wbGVycyh0cnVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgbVZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbVZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgUHJvZ3JhbTo6dmFsaWRhdGVTYW1wbGVycyhib29sIGxvZ0Vycm9ycykKK3sKKyAgICAvLyBpZiBhbnkgdHdvIGFjdGl2ZSBzYW1wbGVycyBpbiBhIHByb2dyYW0gYXJlIG9mIGRpZmZlcmVudCB0eXBlcywgYnV0IHJlZmVyIHRvIHRoZSBzYW1lCisgICAgLy8gdGV4dHVyZSBpbWFnZSB1bml0LCBhbmQgdGhpcyBpcyB0aGUgY3VycmVudCBwcm9ncmFtLCB0aGVuIFZhbGlkYXRlUHJvZ3JhbSB3aWxsIGZhaWwsIGFuZAorICAgIC8vIERyYXdBcnJheXMgYW5kIERyYXdFbGVtZW50cyB3aWxsIGlzc3VlIHRoZSBJTlZBTElEX09QRVJBVElPTiBlcnJvci4KKworICAgIFRleHR1cmVUeXBlIHRleHR1cmVVbml0VHlwZVtNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUU107CisKKyAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFM7ICsraSkKKyAgICB7CisgICAgICAgIHRleHR1cmVVbml0VHlwZVtpXSA9IFRFWFRVUkVfVU5LTk9XTjsKKyAgICB9CisKKyAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFM7ICsraSkKKyAgICB7CisgICAgICAgIGlmKG1TYW1wbGVyc1BTW2ldLmFjdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHVuaXQgPSBtU2FtcGxlcnNQU1tpXS5sb2dpY2FsVGV4dHVyZVVuaXQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKHVuaXQgPj0gTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYobG9nRXJyb3JzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9JbmZvTG9nKCJTYW1wbGVyIHVuaWZvcm0gKCVkKSBleGNlZWRzIE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTICglZCkiLCB1bml0LCBNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih0ZXh0dXJlVW5pdFR5cGVbdW5pdF0gIT0gVEVYVFVSRV9VTktOT1dOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKG1TYW1wbGVyc1BTW2ldLnRleHR1cmVUeXBlICE9IHRleHR1cmVVbml0VHlwZVt1bml0XSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9JbmZvTG9nKCJTYW1wbGVycyBvZiBjb25mbGljdGluZyB0eXBlcyByZWZlciB0byB0aGUgc2FtZSB0ZXh0dXJlIGltYWdlIHVuaXQgKCVkKS4iLCB1bml0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGV4dHVyZVVuaXRUeXBlW3VuaXRdID0gbVNhbXBsZXJzUFNbaV0udGV4dHVyZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTOyArK2kpCisgICAgeworICAgICAgICBpZihtU2FtcGxlcnNWU1tpXS5hY3RpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB1bml0ID0gbVNhbXBsZXJzVlNbaV0ubG9naWNhbFRleHR1cmVVbml0OworICAgICAgICAgICAgCisgICAgICAgICAgICBpZih1bml0ID49IE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvSW5mb0xvZygiU2FtcGxlciB1bmlmb3JtICglZCkgZXhjZWVkcyBNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyAoJWQpIiwgdW5pdCwgTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYodGV4dHVyZVVuaXRUeXBlW3VuaXRdICE9IFRFWFRVUkVfVU5LTk9XTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihtU2FtcGxlcnNWU1tpXS50ZXh0dXJlVHlwZSAhPSB0ZXh0dXJlVW5pdFR5cGVbdW5pdF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihsb2dFcnJvcnMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvSW5mb0xvZygiU2FtcGxlcnMgb2YgY29uZmxpY3RpbmcgdHlwZXMgcmVmZXIgdG8gdGhlIHNhbWUgdGV4dHVyZSBpbWFnZSB1bml0ICglZCkuIiwgdW5pdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRleHR1cmVVbml0VHlwZVt1bml0XSA9IG1TYW1wbGVyc1ZTW2ldLnRleHR1cmVUeXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6Z2V0Q29uc3RhbnRIYW5kbGVzKFVuaWZvcm0gKnRhcmdldFVuaWZvcm0sIEQzRFhIQU5ETEUgKmNvbnN0YW50UFMsIEQzRFhIQU5ETEUgKmNvbnN0YW50VlMpCit7CisgICAgaWYoIXRhcmdldFVuaWZvcm0tPmhhbmRsZXNTZXQpCisgICAgeworICAgICAgICB0YXJnZXRVbmlmb3JtLT5wc0hhbmRsZSA9IG1Db25zdGFudFRhYmxlUFMtPkdldENvbnN0YW50QnlOYW1lKDAsIHRhcmdldFVuaWZvcm0tPl9uYW1lLmNfc3RyKCkpOworICAgICAgICB0YXJnZXRVbmlmb3JtLT52c0hhbmRsZSA9IG1Db25zdGFudFRhYmxlVlMtPkdldENvbnN0YW50QnlOYW1lKDAsIHRhcmdldFVuaWZvcm0tPl9uYW1lLmNfc3RyKCkpOworICAgICAgICB0YXJnZXRVbmlmb3JtLT5oYW5kbGVzU2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAqY29uc3RhbnRQUyA9IHRhcmdldFVuaWZvcm0tPnBzSGFuZGxlOworICAgICpjb25zdGFudFZTID0gdGFyZ2V0VW5pZm9ybS0+dnNIYW5kbGU7Cit9CisKK0dMaW50IFByb2dyYW06OmdldER4RGVwdGhSYW5nZUxvY2F0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUR4RGVwdGhSYW5nZUxvY2F0aW9uOworfQorCitHTGludCBQcm9ncmFtOjpnZXREeERlcHRoTG9jYXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtRHhEZXB0aExvY2F0aW9uOworfQorCitHTGludCBQcm9ncmFtOjpnZXREeFZpZXdwb3J0TG9jYXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtRHhWaWV3cG9ydExvY2F0aW9uOworfQorCitHTGludCBQcm9ncmFtOjpnZXREeEhhbGZQaXhlbFNpemVMb2NhdGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1EeEhhbGZQaXhlbFNpemVMb2NhdGlvbjsKK30KKworR0xpbnQgUHJvZ3JhbTo6Z2V0RHhGcm9udENDV0xvY2F0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUR4RnJvbnRDQ1dMb2NhdGlvbjsKK30KKworR0xpbnQgUHJvZ3JhbTo6Z2V0RHhQb2ludHNPckxpbmVzTG9jYXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtRHhQb2ludHNPckxpbmVzTG9jYXRpb247Cit9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9Qcm9ncmFtLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZmQ0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUHJvZ3JhbS5oCkBAIC0wLDAgKzEsMjMxIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBQcm9ncmFtLmg6IERlZmluZXMgdGhlIFByb2dyYW0gY2xhc3MuIEltcGxlbWVudHMgR0wgcHJvZ3JhbSBvYmplY3RzCisvLyBhbmQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LiBbT3BlbkdMIEVTIDIuMC4yNF0gc2VjdGlvbiAyLjEwLjMgcGFnZSAyOC4KKworI2lmbmRlZiBMSUJHTEVTVjJfUFJPR1JBTV9IXworI2RlZmluZSBMSUJHTEVTVjJfUFJPR1JBTV9IXworCisjaW5jbHVkZSAiU2hhZGVyLmgiCisjaW5jbHVkZSAiQ29udGV4dC5oIgorI2luY2x1ZGUgIlNoYWRlci9QaXhlbFNoYWRlci5ocHAiCisjaW5jbHVkZSAiU2hhZGVyL1ZlcnRleFNoYWRlci5ocHAiCisKKyNpbmNsdWRlIDxkM2R4OS5oPgorI2luY2x1ZGUgPGQzZGNvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBnbAoreworY2xhc3MgUmVzb3VyY2VNYW5hZ2VyOworY2xhc3MgRnJhZ21lbnRTaGFkZXI7CitjbGFzcyBWZXJ0ZXhTaGFkZXI7CisKKy8vIEhlbHBlciBzdHJ1Y3QgcmVwcmVzZW50aW5nIGEgc2luZ2xlIHNoYWRlciB1bmlmb3JtCitzdHJ1Y3QgVW5pZm9ybQoreworICAgIFVuaWZvcm0oR0xlbnVtIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZfbmFtZSwgdW5zaWduZWQgaW50IGFycmF5U2l6ZSk7CisKKyAgICB+VW5pZm9ybSgpOworCisgICAgYm9vbCBpc0FycmF5KCk7CisKKyAgICBjb25zdCBHTGVudW0gdHlwZTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBfbmFtZTsgICAvLyBEZWNvcmF0ZWQgbmFtZQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWU7ICAgIC8vIFVuZGVjb3JhdGVkIG5hbWUKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgYXJyYXlTaXplOworCisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBib29sIGRpcnR5OworCisgICAgRDNEWEhBTkRMRSB2c0hhbmRsZTsKKyAgICBEM0RYSEFORExFIHBzSGFuZGxlOworICAgIGJvb2wgaGFuZGxlc1NldDsKK307CisKKy8vIFN0cnVjdCB1c2VkIGZvciBjb3JyZWxhdGluZyB1bmlmb3Jtcy9lbGVtZW50cyBvZiB1bmlmb3JtIGFycmF5cyB0byBoYW5kbGVzCitzdHJ1Y3QgVW5pZm9ybUxvY2F0aW9uCit7CisgICAgVW5pZm9ybUxvY2F0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZfbmFtZSwgdW5zaWduZWQgaW50IGVsZW1lbnQsIHVuc2lnbmVkIGludCBpbmRleCk7CisKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIHVuc2lnbmVkIGludCBlbGVtZW50OworICAgIHVuc2lnbmVkIGludCBpbmRleDsKK307CisKK2NsYXNzIFByb2dyYW0KK3sKKyAgcHVibGljOgorICAgIFByb2dyYW0oUmVzb3VyY2VNYW5hZ2VyICptYW5hZ2VyLCBHTHVpbnQgaGFuZGxlKTsKKworICAgIH5Qcm9ncmFtKCk7CisKKyAgICBib29sIGF0dGFjaFNoYWRlcihTaGFkZXIgKnNoYWRlcik7CisgICAgYm9vbCBkZXRhY2hTaGFkZXIoU2hhZGVyICpzaGFkZXIpOworICAgIGludCBnZXRBdHRhY2hlZFNoYWRlcnNDb3VudCgpIGNvbnN0OworCisgICAgc3c6OlBpeGVsU2hhZGVyICpnZXRQaXhlbFNoYWRlcigpOworICAgIHN3OjpWZXJ0ZXhTaGFkZXIgKmdldFZlcnRleFNoYWRlcigpOworCisgICAgdm9pZCBiaW5kQXR0cmlidXRlTG9jYXRpb24oR0x1aW50IGluZGV4LCBjb25zdCBjaGFyICpuYW1lKTsKKyAgICBHTHVpbnQgZ2V0QXR0cmlidXRlTG9jYXRpb24oY29uc3QgY2hhciAqbmFtZSk7CisgICAgaW50IGdldFNlbWFudGljSW5kZXgoaW50IGF0dHJpYnV0ZUluZGV4KTsKKworICAgIEdMaW50IGdldFNhbXBsZXJNYXBwaW5nKHN3OjpTYW1wbGVyVHlwZSB0eXBlLCB1bnNpZ25lZCBpbnQgc2FtcGxlckluZGV4KTsKKyAgICBUZXh0dXJlVHlwZSBnZXRTYW1wbGVyVGV4dHVyZVR5cGUoc3c6OlNhbXBsZXJUeXBlIHR5cGUsIHVuc2lnbmVkIGludCBzYW1wbGVySW5kZXgpOworCisgICAgR0xpbnQgZ2V0VW5pZm9ybUxvY2F0aW9uKHN0ZDo6c3RyaW5nIG5hbWUpOworICAgIGJvb2wgc2V0VW5pZm9ybTFmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7CisgICAgYm9vbCBzZXRVbmlmb3JtMmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKKyAgICBib29sIHNldFVuaWZvcm0zZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOworICAgIGJvb2wgc2V0VW5pZm9ybTRmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7CisgICAgYm9vbCBzZXRVbmlmb3JtTWF0cml4MmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CisgICAgYm9vbCBzZXRVbmlmb3JtTWF0cml4M2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CisgICAgYm9vbCBzZXRVbmlmb3JtTWF0cml4NGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CisgICAgYm9vbCBzZXRVbmlmb3JtMWl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdik7CisgICAgYm9vbCBzZXRVbmlmb3JtMml2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdik7CisgICAgYm9vbCBzZXRVbmlmb3JtM2l2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdik7CisgICAgYm9vbCBzZXRVbmlmb3JtNGl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdik7CisKKyAgICBib29sIGdldFVuaWZvcm1mdihHTGludCBsb2NhdGlvbiwgR0xmbG9hdCAqcGFyYW1zKTsKKyAgICBib29sIGdldFVuaWZvcm1pdihHTGludCBsb2NhdGlvbiwgR0xpbnQgKnBhcmFtcyk7CisKKyAgICBHTGludCBnZXREeERlcHRoUmFuZ2VMb2NhdGlvbigpIGNvbnN0OworICAgIEdMaW50IGdldER4RGVwdGhMb2NhdGlvbigpIGNvbnN0OworICAgIEdMaW50IGdldER4Vmlld3BvcnRMb2NhdGlvbigpIGNvbnN0OworICAgIEdMaW50IGdldER4SGFsZlBpeGVsU2l6ZUxvY2F0aW9uKCkgY29uc3Q7CisgICAgR0xpbnQgZ2V0RHhGcm9udENDV0xvY2F0aW9uKCkgY29uc3Q7CisgICAgR0xpbnQgZ2V0RHhQb2ludHNPckxpbmVzTG9jYXRpb24oKSBjb25zdDsKKworICAgIHZvaWQgZGlydHlBbGxVbmlmb3JtcygpOworICAgIHZvaWQgYXBwbHlVbmlmb3JtcygpOworCisgICAgdm9pZCBsaW5rKCk7CisgICAgYm9vbCBpc0xpbmtlZCgpOworICAgIGludCBnZXRJbmZvTG9nTGVuZ3RoKCkgY29uc3Q7CisgICAgdm9pZCBnZXRJbmZvTG9nKEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBjaGFyICppbmZvTG9nKTsKKyAgICB2b2lkIGdldEF0dGFjaGVkU2hhZGVycyhHTHNpemVpIG1heENvdW50LCBHTHNpemVpICpjb3VudCwgR0x1aW50ICpzaGFkZXJzKTsKKworICAgIHZvaWQgZ2V0QWN0aXZlQXR0cmlidXRlKEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CisgICAgR0xpbnQgZ2V0QWN0aXZlQXR0cmlidXRlQ291bnQoKTsKKyAgICBHTGludCBnZXRBY3RpdmVBdHRyaWJ1dGVNYXhMZW5ndGgoKTsKKworICAgIHZvaWQgZ2V0QWN0aXZlVW5pZm9ybShHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOworICAgIEdMaW50IGdldEFjdGl2ZVVuaWZvcm1Db3VudCgpOworICAgIEdMaW50IGdldEFjdGl2ZVVuaWZvcm1NYXhMZW5ndGgoKTsKKworICAgIHZvaWQgYWRkUmVmKCk7CisgICAgdm9pZCByZWxlYXNlKCk7CisgICAgdW5zaWduZWQgaW50IGdldFJlZkNvdW50KCkgY29uc3Q7CisgICAgdm9pZCBmbGFnRm9yRGVsZXRpb24oKTsKKyAgICBib29sIGlzRmxhZ2dlZEZvckRlbGV0aW9uKCkgY29uc3Q7CisKKyAgICB2b2lkIHZhbGlkYXRlKCk7CisgICAgYm9vbCB2YWxpZGF0ZVNhbXBsZXJzKGJvb2wgbG9nRXJyb3JzKTsKKyAgICBib29sIGlzVmFsaWRhdGVkKCkgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBpbnQgZ2V0U2VyaWFsKCkgY29uc3Q7CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZGVjb3JhdGVBdHRyaWJ1dGUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOyAgICAvLyBQcmVwZW5kIGFuIHVuZGVyc2NvcmUKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdW5kZWNvcmF0ZVVuaWZvcm0oY29uc3Qgc3RkOjpzdHJpbmcgJl9uYW1lKTsgICAvLyBSZW1vdmUgbGVhZGluZyB1bmRlcnNjb3JlCisKKyAgcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUHJvZ3JhbSk7CisKKyAgICBJRDNEMTBCbG9iICpjb21waWxlVG9CaW5hcnkoY29uc3QgY2hhciAqaGxzbCwgY29uc3QgY2hhciAqcHJvZmlsZSwgSUQzRFhDb25zdGFudFRhYmxlICoqY29uc3RhbnRUYWJsZSk7CisgICAgdm9pZCB1bmxpbmsoYm9vbCBkZXN0cm95ID0gZmFsc2UpOworCisgICAgaW50IHBhY2tWYXJ5aW5ncyhjb25zdCBWYXJ5aW5nICpwYWNraW5nW11bNF0pOworICAgIGJvb2wgbGlua1ZhcnlpbmdzKCk7CisKKyAgICBib29sIGxpbmtBdHRyaWJ1dGVzKCk7CisgICAgaW50IGdldEF0dHJpYnV0ZUJpbmRpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworCisgICAgYm9vbCBsaW5rVW5pZm9ybXMoSUQzRFhDb25zdGFudFRhYmxlICpjb25zdGFudFRhYmxlKTsKKyAgICBib29sIGRlZmluZVVuaWZvcm0oY29uc3QgRDNEWEhBTkRMRSAmY29uc3RhbnRIYW5kbGUsIGNvbnN0IEQzRFhDT05TVEFOVF9ERVNDICZjb25zdGFudERlc2NyaXB0aW9uLCBzdGQ6OnN0cmluZyBuYW1lID0gIiIpOworICAgIGJvb2wgZGVmaW5lVW5pZm9ybShjb25zdCBEM0RYQ09OU1RBTlRfREVTQyAmY29uc3RhbnREZXNjcmlwdGlvbiwgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgIFVuaWZvcm0gKmNyZWF0ZVVuaWZvcm0oY29uc3QgRDNEWENPTlNUQU5UX0RFU0MgJmNvbnN0YW50RGVzY3JpcHRpb24sIHN0ZDo6c3RyaW5nICZuYW1lKTsKKyAgICBib29sIGFwcGx5VW5pZm9ybTFidihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xib29sZWFuICp2KTsKKyAgICBib29sIGFwcGx5VW5pZm9ybTJidihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xib29sZWFuICp2KTsKKyAgICBib29sIGFwcGx5VW5pZm9ybTNidihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xib29sZWFuICp2KTsKKyAgICBib29sIGFwcGx5VW5pZm9ybTRidihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xib29sZWFuICp2KTsKKyAgICBib29sIGFwcGx5VW5pZm9ybTFmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7CisgICAgYm9vbCBhcHBseVVuaWZvcm0yZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOworICAgIGJvb2wgYXBwbHlVbmlmb3JtM2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKKyAgICBib29sIGFwcGx5VW5pZm9ybTRmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7CisgICAgYm9vbCBhcHBseVVuaWZvcm1NYXRyaXgyZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKKyAgICBib29sIGFwcGx5VW5pZm9ybU1hdHJpeDNmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworICAgIGJvb2wgYXBwbHlVbmlmb3JtTWF0cml4NGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CisgICAgYm9vbCBhcHBseVVuaWZvcm0xaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2KTsKKyAgICBib29sIGFwcGx5VW5pZm9ybTJpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYpOworICAgIGJvb2wgYXBwbHlVbmlmb3JtM2l2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdik7CisgICAgYm9vbCBhcHBseVVuaWZvcm00aXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2KTsKKworICAgIHZvaWQgZ2V0Q29uc3RhbnRIYW5kbGVzKFVuaWZvcm0gKnRhcmdldFVuaWZvcm0sIEQzRFhIQU5ETEUgKmNvbnN0YW50UFMsIEQzRFhIQU5ETEUgKmNvbnN0YW50VlMpOworCisgICAgdm9pZCBhcHBlbmRUb0luZm9Mb2dTYW5pdGl6ZWQoY29uc3QgY2hhciAqbWVzc2FnZSk7CisgICAgdm9pZCBhcHBlbmRUb0luZm9Mb2coY29uc3QgY2hhciAqaW5mbywgLi4uKTsKKyAgICB2b2lkIHJlc2V0SW5mb0xvZygpOworCisgICAgc3RhdGljIHVuc2lnbmVkIGludCBpc3N1ZVNlcmlhbCgpOworCisgICAgRnJhZ21lbnRTaGFkZXIgKm1GcmFnbWVudFNoYWRlcjsKKyAgICBWZXJ0ZXhTaGFkZXIgKm1WZXJ0ZXhTaGFkZXI7CisKKyAgICBzdGQ6OnN0cmluZyBtUGl4ZWxITFNMOworICAgIHN0ZDo6c3RyaW5nIG1WZXJ0ZXhITFNMOworCisgICAgc3c6OlBpeGVsU2hhZGVyICptUGl4ZWxFeGVjdXRhYmxlOworICAgIHN3OjpWZXJ0ZXhTaGFkZXIgKm1WZXJ0ZXhFeGVjdXRhYmxlOworICAgIElEM0RYQ29uc3RhbnRUYWJsZSAqbUNvbnN0YW50VGFibGVQUzsKKyAgICBJRDNEWENvbnN0YW50VGFibGUgKm1Db25zdGFudFRhYmxlVlM7CisKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbUF0dHJpYnV0ZUJpbmRpbmdbTUFYX1ZFUlRFWF9BVFRSSUJTXTsKKyAgICBBdHRyaWJ1dGUgbUxpbmtlZEF0dHJpYnV0ZVtNQVhfVkVSVEVYX0FUVFJJQlNdOworICAgIGludCBtU2VtYW50aWNJbmRleFtNQVhfVkVSVEVYX0FUVFJJQlNdOworCisgICAgc3RydWN0IFNhbXBsZXIKKyAgICB7CisgICAgICAgIGJvb2wgYWN0aXZlOworICAgICAgICBHTGludCBsb2dpY2FsVGV4dHVyZVVuaXQ7CisgICAgICAgIFRleHR1cmVUeXBlIHRleHR1cmVUeXBlOworICAgIH07CisKKyAgICBTYW1wbGVyIG1TYW1wbGVyc1BTW01BWF9URVhUVVJFX0lNQUdFX1VOSVRTXTsKKyAgICBTYW1wbGVyIG1TYW1wbGVyc1ZTW01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUU107CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFVuaWZvcm0qPiBVbmlmb3JtQXJyYXk7CisgICAgVW5pZm9ybUFycmF5IG1Vbmlmb3JtczsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFVuaWZvcm1Mb2NhdGlvbj4gVW5pZm9ybUluZGV4OworICAgIFVuaWZvcm1JbmRleCBtVW5pZm9ybUluZGV4OworCisgICAgR0xpbnQgbUR4RGVwdGhSYW5nZUxvY2F0aW9uOworICAgIEdMaW50IG1EeERlcHRoTG9jYXRpb247CisgICAgR0xpbnQgbUR4Vmlld3BvcnRMb2NhdGlvbjsKKyAgICBHTGludCBtRHhIYWxmUGl4ZWxTaXplTG9jYXRpb247CisgICAgR0xpbnQgbUR4RnJvbnRDQ1dMb2NhdGlvbjsKKyAgICBHTGludCBtRHhQb2ludHNPckxpbmVzTG9jYXRpb247CisKKyAgICBib29sIG1MaW5rZWQ7CisgICAgYm9vbCBtRGVsZXRlU3RhdHVzOyAgIC8vIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgZGVsZXRlZCB3aGVuIG5vIGxvbmdlciBpbiB1c2UKKyAgICBjaGFyICptSW5mb0xvZzsKKyAgICBib29sIG1WYWxpZGF0ZWQ7CisKKyAgICB1bnNpZ25lZCBpbnQgbVJlZkNvdW50OworCisgICAgY29uc3QgdW5zaWduZWQgaW50IG1TZXJpYWw7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IG1DdXJyZW50U2VyaWFsOworCisgICAgUmVzb3VyY2VNYW5hZ2VyICptUmVzb3VyY2VNYW5hZ2VyOworICAgIGNvbnN0IEdMdWludCBtSGFuZGxlOworfTsKK30KKworI2VuZGlmICAgLy8gTElCR0xFU1YyX1BST0dSQU1fSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9SZWZDb3VudE9iamVjdC5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUmVmQ291bnRPYmplY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYTU3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUmVmQ291bnRPYmplY3QuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIFJlZkNvdW50T2JqZWN0LmNwcDogRGVmaW5lcyB0aGUgUmVmQ291bnRPYmplY3QgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzCisvLyBsaWZlY3ljbGUgc3VwcG9ydCBmb3IgR0wgb2JqZWN0cyB1c2luZyB0aGUgdHJhZGl0aW9uYWwgQmluZE9iamVjdCBzY2hlbWUsIGJ1dAorLy8gdGhhdCBuZWVkIHRvIGJlIHJlZmVyZW5jZSBjb3VudGVkIGZvciBjb3JyZWN0IGNyb3NzLWNvbnRleHQgZGVsZXRpb24uCisvLyAoQ29uY3JldGVseSwgdGV4dHVyZXMsIGJ1ZmZlcnMgYW5kIHJlbmRlcmJ1ZmZlcnMuKQorCisjaW5jbHVkZSAiUmVmQ291bnRPYmplY3QuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIGdsCit7CisKK1JlZkNvdW50T2JqZWN0OjpSZWZDb3VudE9iamVjdChHTHVpbnQgaWQpCit7CisgICAgbUlkID0gaWQ7CisgICAgCisJcmVmZXJlbmNlQ291bnQgPSAwOworCWJpbmRDb3VudCA9IDA7Cit9CisKK1JlZkNvdW50T2JqZWN0Ojp+UmVmQ291bnRPYmplY3QoKQoreworICAgIEFTU0VSVChyZWZlcmVuY2VDb3VudCA9PSAwKTsKKwlBU1NFUlQoYmluZENvdW50ID09IDApOworfQorCit2b2lkIFJlZkNvdW50T2JqZWN0OjphZGRSZWYoKQoreworICAgIEludGVybG9ja2VkSW5jcmVtZW50KCZyZWZlcmVuY2VDb3VudCk7Cit9CisKK3ZvaWQgUmVmQ291bnRPYmplY3Q6OnJlbGVhc2UoKQoreworICAgIEFTU0VSVChyZWZlcmVuY2VDb3VudCA+IDApOworCisgICAgaWYocmVmZXJlbmNlQ291bnQgPiAwKQorCXsKKwkJSW50ZXJsb2NrZWREZWNyZW1lbnQoJnJlZmVyZW5jZUNvdW50KTsKKwl9CisKKwlpZihyZWZlcmVuY2VDb3VudCA9PSAwICYmIGJpbmRDb3VudCA9PSAwKQorCXsKKwkJZGVsZXRlIHRoaXM7CisJfQorfQorCit2b2lkIFJlZkNvdW50T2JqZWN0OjpiaW5kKCkKK3sKKwlJbnRlcmxvY2tlZEluY3JlbWVudCgmYmluZENvdW50KTsKK30KKwordm9pZCBSZWZDb3VudE9iamVjdDo6dW5iaW5kKCkKK3sKKwlBU1NFUlQoYmluZENvdW50ID4gMCk7CisKKwlJbnRlcmxvY2tlZERlY3JlbWVudCgmYmluZENvdW50KTsKKworCWlmKHJlZmVyZW5jZUNvdW50ID09IDAgJiYgYmluZENvdW50ID09IDApCisJeworCQlkZWxldGUgdGhpczsKKwl9Cit9CisKK3ZvaWQgUmVmQ291bnRPYmplY3RCaW5kaW5nUG9pbnRlcjo6c2V0KFJlZkNvdW50T2JqZWN0ICpuZXdPYmplY3QpCit7CisgICAgLy8gYWRkUmVmIGZpcnN0IGluIGNhc2UgbmV3T2JqZWN0ID09IG1PYmplY3QgYW5kIHRoaXMgaXMgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGl0LgorICAgIGlmKG5ld09iamVjdCAhPSBOVUxMKSBuZXdPYmplY3QtPmFkZFJlZigpOworICAgIGlmKG1PYmplY3QgIT0gTlVMTCkgbU9iamVjdC0+cmVsZWFzZSgpOworCisgICAgbU9iamVjdCA9IG5ld09iamVjdDsKK30KKworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1JlZkNvdW50T2JqZWN0LmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUmVmQ291bnRPYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjk0MGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1JlZkNvdW50T2JqZWN0LmgKQEAgLTAsMCArMSw3NCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDExIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gUmVmQ291bnRPYmplY3QuaDogRGVmaW5lcyB0aGUgUmVmQ291bnRPYmplY3QgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzCisvLyBsaWZlY3ljbGUgc3VwcG9ydCBmb3IgR0wgb2JqZWN0cyB1c2luZyB0aGUgdHJhZGl0aW9uYWwgQmluZE9iamVjdCBzY2hlbWUsIGJ1dAorLy8gdGhhdCBuZWVkIHRvIGJlIHJlZmVyZW5jZSBjb3VudGVkIGZvciBjb3JyZWN0IGNyb3NzLWNvbnRleHQgZGVsZXRpb24uCisvLyAoQ29uY3JldGVseSwgdGV4dHVyZXMsIGJ1ZmZlcnMgYW5kIHJlbmRlcmJ1ZmZlcnMuKQorCisjaWZuZGVmIExJQkdMRVNWMl9SRUZDT1VOVE9CSkVDVF9IXworI2RlZmluZSBMSUJHTEVTVjJfUkVGQ09VTlRPQkpFQ1RfSF8KKworI2luY2x1ZGUgImNvbW1vbi9kZWJ1Zy5oIgorCisjZGVmaW5lIEdMX0FQSUNBTEwKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBnbAoreworCitjbGFzcyBSZWZDb3VudE9iamVjdAoreworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUmVmQ291bnRPYmplY3QoR0x1aW50IGlkKTsKKyAgICB2aXJ0dWFsIH5SZWZDb3VudE9iamVjdCgpOworCisgICAgdmlydHVhbCB2b2lkIGFkZFJlZigpOworCXZpcnR1YWwgdm9pZCByZWxlYXNlKCk7CisKKwl2aXJ0dWFsIHZvaWQgYmluZCgpOworCXZpcnR1YWwgdm9pZCB1bmJpbmQoKTsKKworICAgIEdMdWludCBpZCgpIGNvbnN0IHtyZXR1cm4gbUlkO30KKyAgICAKKyAgcHJpdmF0ZToKKyAgICBHTHVpbnQgbUlkOworCisgICAgdm9sYXRpbGUgbG9uZyByZWZlcmVuY2VDb3VudDsKKwl2b2xhdGlsZSBsb25nIGJpbmRDb3VudDsKK307CisKK2NsYXNzIFJlZkNvdW50T2JqZWN0QmluZGluZ1BvaW50ZXIKK3sKKyAgcHJvdGVjdGVkOgorICAgIFJlZkNvdW50T2JqZWN0QmluZGluZ1BvaW50ZXIoKSA6IG1PYmplY3QoTlVMTCkgeyB9CisgICAgflJlZkNvdW50T2JqZWN0QmluZGluZ1BvaW50ZXIoKSB7IEFTU0VSVChtT2JqZWN0ID09IE5VTEwpOyB9IC8vIE9iamVjdHMgaGF2ZSB0byBiZSByZWxlYXNlZCBiZWZvcmUgdGhlIHJlc291cmNlIG1hbmFnZXIgaXMgZGVzdHJveWVkLCBzbyB0aGV5IG11c3QgYmUgZXhwbGljaXRseSBjbGVhbmVkIHVwLgorCisgICAgdm9pZCBzZXQoUmVmQ291bnRPYmplY3QgKm5ld09iamVjdCk7CisgICAgUmVmQ291bnRPYmplY3QgKmdldCgpIGNvbnN0IHsgcmV0dXJuIG1PYmplY3Q7IH0KKworICBwdWJsaWM6CisgICAgR0x1aW50IGlkKCkgY29uc3QgeyByZXR1cm4gKG1PYmplY3QgIT0gTlVMTCkgPyBtT2JqZWN0LT5pZCgpIDogMDsgfQorICAgIGJvb2wgb3BlcmF0b3IgISAoKSBjb25zdCB7IHJldHVybiAoZ2V0KCkgPT0gTlVMTCk7IH0KKworICBwcml2YXRlOgorICAgIFJlZkNvdW50T2JqZWN0ICptT2JqZWN0OworfTsKKwordGVtcGxhdGU8Y2xhc3MgT2JqZWN0VHlwZT4KK2NsYXNzIEJpbmRpbmdQb2ludGVyIDogcHVibGljIFJlZkNvdW50T2JqZWN0QmluZGluZ1BvaW50ZXIKK3sKKyAgcHVibGljOgorICAgIHZvaWQgc2V0KE9iamVjdFR5cGUgKm5ld09iamVjdCkgeyBSZWZDb3VudE9iamVjdEJpbmRpbmdQb2ludGVyOjpzZXQobmV3T2JqZWN0KTsgfQorICAgIE9iamVjdFR5cGUgKmdldCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PE9iamVjdFR5cGUqPihSZWZDb3VudE9iamVjdEJpbmRpbmdQb2ludGVyOjpnZXQoKSk7IH0KKyAgICBPYmplY3RUeXBlICpvcGVyYXRvciAtPiAoKSBjb25zdCB7IHJldHVybiBnZXQoKTsgfQorfTsKKworfQorCisjZW5kaWYgICAvLyBMSUJHTEVTVjJfUkVGQ09VTlRPQkpFQ1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9SZW5kZXJidWZmZXIuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1JlbmRlcmJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkY2ExZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9SZW5kZXJidWZmZXIuY3BwCkBAIC0wLDAgKzEsNTAzIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBSZW5kZXJidWZmZXIuY3BwOiB0aGUgUmVuZGVyYnVmZmVyIGNsYXNzIGFuZCBpdHMgZGVyaXZlZCBjbGFzc2VzCisvLyBDb2xvcmJ1ZmZlciwgRGVwdGhidWZmZXIgYW5kIFN0ZW5jaWxidWZmZXIuIEltcGxlbWVudHMgR0wgcmVuZGVyYnVmZmVyCisvLyBvYmplY3RzIGFuZCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuIFtPcGVuR0wgRVMgMi4wLjI0XSBzZWN0aW9uIDQuNC4zIHBhZ2UgMTA4LgorCisjaW5jbHVkZSAiUmVuZGVyYnVmZmVyLmgiCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorCituYW1lc3BhY2UgZ2wKK3sKK3Vuc2lnbmVkIGludCBSZW5kZXJidWZmZXJTdG9yYWdlOjptQ3VycmVudFNlcmlhbCA9IDE7CisKK1JlbmRlcmJ1ZmZlcjo6UmVuZGVyYnVmZmVyKEdMdWludCBpZCwgUmVuZGVyYnVmZmVyU3RvcmFnZSAqc3RvcmFnZSkgOiBSZWZDb3VudE9iamVjdChpZCkKK3sKKyAgICBBU1NFUlQoc3RvcmFnZSAhPSBOVUxMKTsKKyAgICBtU3RvcmFnZSA9IHN0b3JhZ2U7Cit9CisKK1JlbmRlcmJ1ZmZlcjo6flJlbmRlcmJ1ZmZlcigpCit7CisgICAgZGVsZXRlIG1TdG9yYWdlOworfQorCitib29sIFJlbmRlcmJ1ZmZlcjo6aXNDb2xvcmJ1ZmZlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdG9yYWdlLT5pc0NvbG9yYnVmZmVyKCk7Cit9CisKK2Jvb2wgUmVuZGVyYnVmZmVyOjppc0RlcHRoYnVmZmVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0b3JhZ2UtPmlzRGVwdGhidWZmZXIoKTsKK30KKworYm9vbCBSZW5kZXJidWZmZXI6OmlzU3RlbmNpbGJ1ZmZlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdG9yYWdlLT5pc1N0ZW5jaWxidWZmZXIoKTsKK30KKworSW1hZ2UgKlJlbmRlcmJ1ZmZlcjo6Z2V0UmVuZGVyVGFyZ2V0KCkKK3sKKyAgICByZXR1cm4gbVN0b3JhZ2UtPmdldFJlbmRlclRhcmdldCgpOworfQorCitJbWFnZSAqUmVuZGVyYnVmZmVyOjpnZXREZXB0aFN0ZW5jaWwoKQoreworICAgIHJldHVybiBtU3RvcmFnZS0+Z2V0RGVwdGhTdGVuY2lsKCk7Cit9CisKK0dMc2l6ZWkgUmVuZGVyYnVmZmVyOjpnZXRXaWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdG9yYWdlLT5nZXRXaWR0aCgpOworfQorCitHTHNpemVpIFJlbmRlcmJ1ZmZlcjo6Z2V0SGVpZ2h0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0b3JhZ2UtPmdldEhlaWdodCgpOworfQorCitHTGVudW0gUmVuZGVyYnVmZmVyOjpnZXRGb3JtYXQoKSBjb25zdAoreworICAgIHJldHVybiBtU3RvcmFnZS0+Z2V0Rm9ybWF0KCk7Cit9CisKK3N3OjpGb3JtYXQgUmVuZGVyYnVmZmVyOjpnZXRJbnRlcm5hbEZvcm1hdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdG9yYWdlLT5nZXRJbnRlcm5hbEZvcm1hdCgpOworfQorCitHTHVpbnQgUmVuZGVyYnVmZmVyOjpnZXRSZWRTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0b3JhZ2UtPmdldFJlZFNpemUoKTsKK30KKworR0x1aW50IFJlbmRlcmJ1ZmZlcjo6Z2V0R3JlZW5TaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0b3JhZ2UtPmdldEdyZWVuU2l6ZSgpOworfQorCitHTHVpbnQgUmVuZGVyYnVmZmVyOjpnZXRCbHVlU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdG9yYWdlLT5nZXRCbHVlU2l6ZSgpOworfQorCitHTHVpbnQgUmVuZGVyYnVmZmVyOjpnZXRBbHBoYVNpemUoKSBjb25zdAoreworICAgIHJldHVybiBtU3RvcmFnZS0+Z2V0QWxwaGFTaXplKCk7Cit9CisKK0dMdWludCBSZW5kZXJidWZmZXI6OmdldERlcHRoU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdG9yYWdlLT5nZXREZXB0aFNpemUoKTsKK30KKworR0x1aW50IFJlbmRlcmJ1ZmZlcjo6Z2V0U3RlbmNpbFNpemUoKSBjb25zdAoreworICAgIHJldHVybiBtU3RvcmFnZS0+Z2V0U3RlbmNpbFNpemUoKTsKK30KKworR0xzaXplaSBSZW5kZXJidWZmZXI6OmdldFNhbXBsZXMoKSBjb25zdAoreworICAgIHJldHVybiBtU3RvcmFnZS0+Z2V0U2FtcGxlcygpOworfQorCit1bnNpZ25lZCBpbnQgUmVuZGVyYnVmZmVyOjpnZXRTZXJpYWwoKSBjb25zdAoreworICAgIHJldHVybiBtU3RvcmFnZS0+Z2V0U2VyaWFsKCk7Cit9CisKK3ZvaWQgUmVuZGVyYnVmZmVyOjpzZXRTdG9yYWdlKFJlbmRlcmJ1ZmZlclN0b3JhZ2UgKm5ld1N0b3JhZ2UpCit7CisgICAgQVNTRVJUKG5ld1N0b3JhZ2UgIT0gTlVMTCk7CisKKyAgICBkZWxldGUgbVN0b3JhZ2U7CisgICAgbVN0b3JhZ2UgPSBuZXdTdG9yYWdlOworfQorCitSZW5kZXJidWZmZXJTdG9yYWdlOjpSZW5kZXJidWZmZXJTdG9yYWdlKCkgOiBtU2VyaWFsKGlzc3VlU2VyaWFsKCkpCit7CisgICAgbVdpZHRoID0gMDsKKyAgICBtSGVpZ2h0ID0gMDsKKyAgICBmb3JtYXQgPSBHTF9SR0JBNDsKKyAgICBpbnRlcm5hbEZvcm1hdCA9IHN3OjpGT1JNQVRfQThSOEc4Qjg7CisgICAgbVNhbXBsZXMgPSAwOworfQorCitSZW5kZXJidWZmZXJTdG9yYWdlOjp+UmVuZGVyYnVmZmVyU3RvcmFnZSgpCit7Cit9CisKK2Jvb2wgUmVuZGVyYnVmZmVyU3RvcmFnZTo6aXNDb2xvcmJ1ZmZlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlcmJ1ZmZlclN0b3JhZ2U6OmlzRGVwdGhidWZmZXIoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJidWZmZXJTdG9yYWdlOjppc1N0ZW5jaWxidWZmZXIoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworSW1hZ2UgKlJlbmRlcmJ1ZmZlclN0b3JhZ2U6OmdldFJlbmRlclRhcmdldCgpCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0ltYWdlICpSZW5kZXJidWZmZXJTdG9yYWdlOjpnZXREZXB0aFN0ZW5jaWwoKQoreworICAgIHJldHVybiBOVUxMOworfQorCitHTHNpemVpIFJlbmRlcmJ1ZmZlclN0b3JhZ2U6OmdldFdpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVdpZHRoOworfQorCitHTHNpemVpIFJlbmRlcmJ1ZmZlclN0b3JhZ2U6OmdldEhlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1IZWlnaHQ7Cit9CisKK0dMZW51bSBSZW5kZXJidWZmZXJTdG9yYWdlOjpnZXRGb3JtYXQoKSBjb25zdAoreworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK0dMdWludCBSZW5kZXJidWZmZXJTdG9yYWdlOjpnZXRSZWRTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3cyZXM6OkdldFJlZFNpemUoZ2V0SW50ZXJuYWxGb3JtYXQoKSk7Cit9CisKK0dMdWludCBSZW5kZXJidWZmZXJTdG9yYWdlOjpnZXRHcmVlblNpemUoKSBjb25zdAoreworICAgIHJldHVybiBzdzJlczo6R2V0R3JlZW5TaXplKGdldEludGVybmFsRm9ybWF0KCkpOworfQorCitHTHVpbnQgUmVuZGVyYnVmZmVyU3RvcmFnZTo6Z2V0Qmx1ZVNpemUoKSBjb25zdAoreworICAgIHJldHVybiBzdzJlczo6R2V0Qmx1ZVNpemUoZ2V0SW50ZXJuYWxGb3JtYXQoKSk7Cit9CisKK0dMdWludCBSZW5kZXJidWZmZXJTdG9yYWdlOjpnZXRBbHBoYVNpemUoKSBjb25zdAoreworICAgIHJldHVybiBzdzJlczo6R2V0QWxwaGFTaXplKGdldEludGVybmFsRm9ybWF0KCkpOworfQorCitHTHVpbnQgUmVuZGVyYnVmZmVyU3RvcmFnZTo6Z2V0RGVwdGhTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3cyZXM6OkdldERlcHRoU2l6ZShnZXRJbnRlcm5hbEZvcm1hdCgpKTsKK30KKworR0x1aW50IFJlbmRlcmJ1ZmZlclN0b3JhZ2U6OmdldFN0ZW5jaWxTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3cyZXM6OkdldFN0ZW5jaWxTaXplKGdldEludGVybmFsRm9ybWF0KCkpOworfQorCitHTHNpemVpIFJlbmRlcmJ1ZmZlclN0b3JhZ2U6OmdldFNhbXBsZXMoKSBjb25zdAoreworICAgIHJldHVybiBtU2FtcGxlczsKK30KKworc3c6OkZvcm1hdCBSZW5kZXJidWZmZXJTdG9yYWdlOjpnZXRJbnRlcm5hbEZvcm1hdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGludGVybmFsRm9ybWF0OworfQorCit1bnNpZ25lZCBpbnQgUmVuZGVyYnVmZmVyU3RvcmFnZTo6Z2V0U2VyaWFsKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVNlcmlhbDsKK30KKwordW5zaWduZWQgaW50IFJlbmRlcmJ1ZmZlclN0b3JhZ2U6Omlzc3VlU2VyaWFsKCkKK3sKKyAgICByZXR1cm4gbUN1cnJlbnRTZXJpYWwrKzsKK30KKworQ29sb3JidWZmZXI6OkNvbG9yYnVmZmVyKEltYWdlICpyZW5kZXJUYXJnZXQpIDogbVJlbmRlclRhcmdldChyZW5kZXJUYXJnZXQpLCBtVGV4dHVyZShOVUxMKQoreworICAgIGlmKHJlbmRlclRhcmdldCkKKyAgICB7CisgICAgICAgIHJlbmRlclRhcmdldC0+YWRkUmVmKCk7CisJCQorICAgICAgICBtV2lkdGggPSByZW5kZXJUYXJnZXQtPmdldFdpZHRoKCk7CisgICAgICAgIG1IZWlnaHQgPSByZW5kZXJUYXJnZXQtPmdldEhlaWdodCgpOworCQlpbnRlcm5hbEZvcm1hdCA9IHJlbmRlclRhcmdldC0+Z2V0SW50ZXJuYWxGb3JtYXQoKTsKKyAgICAgICAgZm9ybWF0ID0gc3cyZXM6OkNvbnZlcnRCYWNrQnVmZmVyRm9ybWF0KGludGVybmFsRm9ybWF0KTsKKyAgICAgICAgbVNhbXBsZXMgPSByZW5kZXJUYXJnZXQtPmdldE11bHRpU2FtcGxlRGVwdGgoKTsKKyAgICB9Cit9CisKK0NvbG9yYnVmZmVyOjpDb2xvcmJ1ZmZlcihUZXh0dXJlICp0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0KSA6IG1SZW5kZXJUYXJnZXQoTlVMTCksIG1UZXh0dXJlKHRleHR1cmUpLCBtVGFyZ2V0KHRhcmdldCkKK3sKKyAgICBpZih0ZXh0dXJlKQorICAgIHsKKyAgICAgICAgbVdpZHRoID0gdGV4dHVyZS0+Z2V0V2lkdGgoKTsKKyAgICAgICAgbUhlaWdodCA9IHRleHR1cmUtPmdldEhlaWdodCgpOworICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IHRleHR1cmUtPmdldEludGVybmFsRm9ybWF0KCk7CisgICAgICAgIGZvcm1hdCA9IHRleHR1cmUtPmdldEZvcm1hdCgpOworICAgICAgICBtU2FtcGxlcyA9IDA7CisKKyAgICAgICAgbVJlbmRlclRhcmdldCA9IHRleHR1cmUtPmdldFJlbmRlclRhcmdldCh0YXJnZXQpOworICAgIH0KK30KKworQ29sb3JidWZmZXI6OkNvbG9yYnVmZmVyKGludCB3aWR0aCwgaW50IGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBzYW1wbGVzKSA6IG1SZW5kZXJUYXJnZXQoTlVMTCksIG1UZXh0dXJlKE5VTEwpCit7CisgICAgRGV2aWNlICpkZXZpY2UgPSBnZXREZXZpY2UoKTsKKworICAgIHN3OjpGb3JtYXQgcmVxdWVzdGVkRm9ybWF0ID0gZXMyc3c6OkNvbnZlcnRSZW5kZXJidWZmZXJGb3JtYXQoZm9ybWF0KTsKKyAgICBpbnQgc3VwcG9ydGVkU2FtcGxlcyA9IGdldENvbnRleHQoKS0+Z2V0TmVhcmVzdFN1cHBvcnRlZFNhbXBsZXMocmVxdWVzdGVkRm9ybWF0LCBzYW1wbGVzKTsKKworICAgIGlmKHN1cHBvcnRlZFNhbXBsZXMgPT0gLTEpCisgICAgeworICAgICAgICBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYod2lkdGggPiAwICYmIGhlaWdodCA+IDApCisgICAgeworICAgICAgICBtUmVuZGVyVGFyZ2V0ID0gZGV2aWNlLT5jcmVhdGVSZW5kZXJUYXJnZXQod2lkdGgsIGhlaWdodCwgcmVxdWVzdGVkRm9ybWF0LCBzdXBwb3J0ZWRTYW1wbGVzLCBmYWxzZSk7CisKKyAgICAgICAgaWYoIW1SZW5kZXJUYXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworCQkJcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICB0aGlzLT5mb3JtYXQgPSBmb3JtYXQ7CisgICAgaW50ZXJuYWxGb3JtYXQgPSByZXF1ZXN0ZWRGb3JtYXQ7CisgICAgbVNhbXBsZXMgPSBzdXBwb3J0ZWRTYW1wbGVzOworfQorCitDb2xvcmJ1ZmZlcjo6fkNvbG9yYnVmZmVyKCkKK3sKKyAgICBpZihtUmVuZGVyVGFyZ2V0KQorICAgIHsKKyAgICAgICAgbVJlbmRlclRhcmdldC0+cmVsZWFzZSgpOworICAgIH0KK30KKworR0xzaXplaSBDb2xvcmJ1ZmZlcjo6Z2V0V2lkdGgoKSBjb25zdAoreworICAgIGlmKG1UZXh0dXJlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0dXJlLT5nZXRXaWR0aCgpOworICAgIH0KKworICAgIHJldHVybiBtV2lkdGg7Cit9CisKK0dMc2l6ZWkgQ29sb3JidWZmZXI6OmdldEhlaWdodCgpIGNvbnN0Cit7CisgICAgaWYobVRleHR1cmUpCisgICAgeworICAgICAgICByZXR1cm4gbVRleHR1cmUtPmdldEhlaWdodCgpOworICAgIH0KKworICAgIHJldHVybiBtSGVpZ2h0OworfQorCitzdzo6Rm9ybWF0IENvbG9yYnVmZmVyOjpnZXRJbnRlcm5hbEZvcm1hdCgpIGNvbnN0Cit7CisgICAgaWYobVRleHR1cmUpCisgICAgeworICAgICAgICByZXR1cm4gbVRleHR1cmUtPmdldEludGVybmFsRm9ybWF0KCk7CisgICAgfQorCisgICAgcmV0dXJuIGludGVybmFsRm9ybWF0OworfQorCitHTGVudW0gQ29sb3JidWZmZXI6OmdldFR5cGUoKSBjb25zdAoreworICAgIGlmKG1UZXh0dXJlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0dXJlLT5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcmV0dXJuIEdMX1VOU0lHTkVEX0JZVEU7Cit9CisKK0dMZW51bSBDb2xvcmJ1ZmZlcjo6Z2V0Rm9ybWF0KCkgY29uc3QKK3sKKyAgICBpZihtVGV4dHVyZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtVGV4dHVyZS0+Z2V0Rm9ybWF0KCk7CisgICAgfQorCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworYm9vbCBDb2xvcmJ1ZmZlcjo6aXNDb2xvcmJ1ZmZlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0ltYWdlICpDb2xvcmJ1ZmZlcjo6Z2V0UmVuZGVyVGFyZ2V0KCkKK3sKKyAgICBpZihtVGV4dHVyZSkKKyAgICB7CisgICAgICAgIGlmKG1SZW5kZXJUYXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1SZW5kZXJUYXJnZXQtPnJlbGVhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1SZW5kZXJUYXJnZXQgPSBtVGV4dHVyZS0+Z2V0UmVuZGVyVGFyZ2V0KG1UYXJnZXQpOworICAgIH0KKworICAgIHJldHVybiBtUmVuZGVyVGFyZ2V0OworfQorCitEZXB0aFN0ZW5jaWxidWZmZXI6OkRlcHRoU3RlbmNpbGJ1ZmZlcihJbWFnZSAqZGVwdGhTdGVuY2lsKSA6IG1EZXB0aFN0ZW5jaWwoZGVwdGhTdGVuY2lsKQoreworICAgIGlmKGRlcHRoU3RlbmNpbCkKKyAgICB7CisgICAgICAgIGRlcHRoU3RlbmNpbC0+YWRkUmVmKCk7CisKKwkJbVdpZHRoID0gZGVwdGhTdGVuY2lsLT5nZXRXaWR0aCgpOworICAgICAgICBtSGVpZ2h0ID0gZGVwdGhTdGVuY2lsLT5nZXRIZWlnaHQoKTsKKwkJaW50ZXJuYWxGb3JtYXQgPSBkZXB0aFN0ZW5jaWwtPmdldEludGVybmFsRm9ybWF0KCk7CisJCWZvcm1hdCA9IHN3MmVzOjpDb252ZXJ0RGVwdGhTdGVuY2lsRm9ybWF0KGludGVybmFsRm9ybWF0KTsKKwkJbVNhbXBsZXMgPSBkZXB0aFN0ZW5jaWwtPmdldE11bHRpU2FtcGxlRGVwdGgoKTsKKyAgICB9Cit9CisKK0RlcHRoU3RlbmNpbGJ1ZmZlcjo6RGVwdGhTdGVuY2lsYnVmZmVyKGludCB3aWR0aCwgaW50IGhlaWdodCwgR0xzaXplaSBzYW1wbGVzKQoreworICAgIERldmljZSAqZGV2aWNlID0gZ2V0RGV2aWNlKCk7CisKKyAgICBtRGVwdGhTdGVuY2lsID0gTlVMTDsKKyAgICAKKyAgICBpbnQgc3VwcG9ydGVkU2FtcGxlcyA9IGdldENvbnRleHQoKS0+Z2V0TmVhcmVzdFN1cHBvcnRlZFNhbXBsZXMoc3c6OkZPUk1BVF9EMjRTOCwgc2FtcGxlcyk7CisKKyAgICBpZihzdXBwb3J0ZWRTYW1wbGVzID09IC0xKQorICAgIHsKKyAgICAgICAgZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKQorICAgIHsKKyAgICAgICAgbURlcHRoU3RlbmNpbCA9IGRldmljZS0+Y3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSh3aWR0aCwgaGVpZ2h0LCBzdzo6Rk9STUFUX0QyNFM4LCBzdXBwb3J0ZWRTYW1wbGVzLCBmYWxzZSk7CisKKyAgICAgICAgaWYoIW1EZXB0aFN0ZW5jaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICBmb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X09FUzsKKyAgICBpbnRlcm5hbEZvcm1hdCA9IHN3OjpGT1JNQVRfRDI0Uzg7CisgICAgbVNhbXBsZXMgPSBzdXBwb3J0ZWRTYW1wbGVzOworfQorCitEZXB0aFN0ZW5jaWxidWZmZXI6On5EZXB0aFN0ZW5jaWxidWZmZXIoKQoreworICAgIGlmKG1EZXB0aFN0ZW5jaWwpCisgICAgeworICAgICAgICBtRGVwdGhTdGVuY2lsLT5yZWxlYXNlKCk7CisgICAgfQorfQorCitib29sIERlcHRoU3RlbmNpbGJ1ZmZlcjo6aXNEZXB0aGJ1ZmZlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVwdGhTdGVuY2lsYnVmZmVyOjppc1N0ZW5jaWxidWZmZXIoKSBjb25zdAoreworICAgIHJldHVybiB0cnVlOworfQorCitJbWFnZSAqRGVwdGhTdGVuY2lsYnVmZmVyOjpnZXREZXB0aFN0ZW5jaWwoKQoreworICAgIHJldHVybiBtRGVwdGhTdGVuY2lsOworfQorCitEZXB0aGJ1ZmZlcjo6RGVwdGhidWZmZXIoSW1hZ2UgKmRlcHRoU3RlbmNpbCkgOiBEZXB0aFN0ZW5jaWxidWZmZXIoZGVwdGhTdGVuY2lsKQoreworICAgIGlmKGRlcHRoU3RlbmNpbCkKKyAgICB7CisgICAgICAgIGZvcm1hdCA9IEdMX0RFUFRIX0NPTVBPTkVOVDE2OyAgIC8vIElmIHRoZSByZW5kZXJidWZmZXIgcGFyYW1ldGVycyBhcmUgcXVlcmllZCwgdGhlIGNhbGxpbmcgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBleHBlY3Qgb25lIG9mIHRoZSB2YWxpZCByZW5kZXJidWZmZXIgZm9ybWF0cyBmb3IgdXNlIGluIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UKKyAgICB9Cit9CisKK0RlcHRoYnVmZmVyOjpEZXB0aGJ1ZmZlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIEdMc2l6ZWkgc2FtcGxlcykgOiBEZXB0aFN0ZW5jaWxidWZmZXIod2lkdGgsIGhlaWdodCwgc2FtcGxlcykKK3sKKyAgICBpZihnZXREZXB0aFN0ZW5jaWwoKSkKKyAgICB7CisgICAgICAgIGZvcm1hdCA9IEdMX0RFUFRIX0NPTVBPTkVOVDE2OyAgIC8vIElmIHRoZSByZW5kZXJidWZmZXIgcGFyYW1ldGVycyBhcmUgcXVlcmllZCwgdGhlIGNhbGxpbmcgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBleHBlY3Qgb25lIG9mIHRoZSB2YWxpZCByZW5kZXJidWZmZXIgZm9ybWF0cyBmb3IgdXNlIGluIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UKKyAgICB9Cit9CisKK0RlcHRoYnVmZmVyOjp+RGVwdGhidWZmZXIoKQoreworfQorCitib29sIERlcHRoYnVmZmVyOjppc0RlcHRoYnVmZmVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXB0aGJ1ZmZlcjo6aXNTdGVuY2lsYnVmZmVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1N0ZW5jaWxidWZmZXI6OlN0ZW5jaWxidWZmZXIoSW1hZ2UgKmRlcHRoU3RlbmNpbCkgOiBEZXB0aFN0ZW5jaWxidWZmZXIoZGVwdGhTdGVuY2lsKQoreworICAgIGlmKGRlcHRoU3RlbmNpbCkKKyAgICB7CisgICAgICAgIGZvcm1hdCA9IEdMX1NURU5DSUxfSU5ERVg4OyAgIC8vIElmIHRoZSByZW5kZXJidWZmZXIgcGFyYW1ldGVycyBhcmUgcXVlcmllZCwgdGhlIGNhbGxpbmcgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBleHBlY3Qgb25lIG9mIHRoZSB2YWxpZCByZW5kZXJidWZmZXIgZm9ybWF0cyBmb3IgdXNlIGluIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UKKyAgICB9Cit9CisKK1N0ZW5jaWxidWZmZXI6OlN0ZW5jaWxidWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBHTHNpemVpIHNhbXBsZXMpIDogRGVwdGhTdGVuY2lsYnVmZmVyKHdpZHRoLCBoZWlnaHQsIHNhbXBsZXMpCit7CisgICAgaWYoZ2V0RGVwdGhTdGVuY2lsKCkpCisgICAgeworICAgICAgICBmb3JtYXQgPSBHTF9TVEVOQ0lMX0lOREVYODsgICAvLyBJZiB0aGUgcmVuZGVyYnVmZmVyIHBhcmFtZXRlcnMgYXJlIHF1ZXJpZWQsIHRoZSBjYWxsaW5nIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgZXhwZWN0IG9uZSBvZiB0aGUgdmFsaWQgcmVuZGVyYnVmZmVyIGZvcm1hdHMgZm9yIHVzZSBpbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2xSZW5kZXJidWZmZXJTdG9yYWdlCisgICAgfQorfQorCitTdGVuY2lsYnVmZmVyOjp+U3RlbmNpbGJ1ZmZlcigpCit7Cit9CisKK2Jvb2wgU3RlbmNpbGJ1ZmZlcjo6aXNEZXB0aGJ1ZmZlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFN0ZW5jaWxidWZmZXI6OmlzU3RlbmNpbGJ1ZmZlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRydWU7Cit9Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUmVuZGVyYnVmZmVyLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUmVuZGVyYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzMzlhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9SZW5kZXJidWZmZXIuaApAQCAtMCwwICsxLDE5MiBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gUmVuZGVyYnVmZmVyLmg6IERlZmluZXMgdGhlIHdyYXBwZXIgY2xhc3MgUmVuZGVyYnVmZmVyLCBhcyB3ZWxsIGFzIHRoZQorLy8gY2xhc3MgaGllcmFyY2h5IHVzZWQgdG8gc3RvcmUgaXRzIGNvbnRlbnRzOiBSZW5kZXJidWZmZXJTdG9yYWdlLCBDb2xvcmJ1ZmZlciwKKy8vIERlcHRoU3RlbmNpbGJ1ZmZlciwgRGVwdGhidWZmZXIgYW5kIFN0ZW5jaWxidWZmZXIuIEltcGxlbWVudHMgR0wgcmVuZGVyYnVmZmVyCisvLyBvYmplY3RzIGFuZCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuIFtPcGVuR0wgRVMgMi4wLjI0XSBzZWN0aW9uIDQuNC4zIHBhZ2UgMTA4LgorCisjaWZuZGVmIExJQkdMRVNWMl9SRU5ERVJCVUZGRVJfSF8KKyNkZWZpbmUgTElCR0xFU1YyX1JFTkRFUkJVRkZFUl9IXworCisjaW5jbHVkZSAiUmVmQ291bnRPYmplY3QuaCIKKyNpbmNsdWRlICJJbWFnZS5ocHAiCisjaW5jbHVkZSAiY29tbW9uL2FuZ2xldXRpbHMuaCIKKworI2RlZmluZSBHTF9BUElDQUxMCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKK25hbWVzcGFjZSBnbAoreworY2xhc3MgVGV4dHVyZTsKKworLy8gQSBjbGFzcyBkZXJpdmVkIGZyb20gUmVuZGVyYnVmZmVyU3RvcmFnZSBpcyBjcmVhdGVkIHdoZW5ldmVyIGdsUmVuZGVyYnVmZmVyU3RvcmFnZQorLy8gaXMgY2FsbGVkLiBUaGUgc3BlY2lmaWMgY29uY3JldGUgdHlwZSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGludGVybmFsIGZvcm1hdCBpcworLy8gY29sb3VyIGRlcHRoLCBzdGVuY2lsIG9yIHBhY2tlZCBkZXB0aC9zdGVuY2lsLgorY2xhc3MgUmVuZGVyYnVmZmVyU3RvcmFnZQoreworICBwdWJsaWM6CisgICAgUmVuZGVyYnVmZmVyU3RvcmFnZSgpOworCisgICAgdmlydHVhbCB+UmVuZGVyYnVmZmVyU3RvcmFnZSgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBpc0NvbG9yYnVmZmVyKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzRGVwdGhidWZmZXIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdGVuY2lsYnVmZmVyKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIEltYWdlICpnZXRSZW5kZXJUYXJnZXQoKTsKKyAgICB2aXJ0dWFsIEltYWdlICpnZXREZXB0aFN0ZW5jaWwoKTsKKworICAgIHZpcnR1YWwgR0xzaXplaSBnZXRXaWR0aCgpIGNvbnN0OworICAgIHZpcnR1YWwgR0xzaXplaSBnZXRIZWlnaHQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIEdMZW51bSBnZXRGb3JtYXQoKSBjb25zdDsKKyAgICBHTHVpbnQgZ2V0UmVkU2l6ZSgpIGNvbnN0OworICAgIEdMdWludCBnZXRHcmVlblNpemUoKSBjb25zdDsKKyAgICBHTHVpbnQgZ2V0Qmx1ZVNpemUoKSBjb25zdDsKKyAgICBHTHVpbnQgZ2V0QWxwaGFTaXplKCkgY29uc3Q7CisgICAgR0x1aW50IGdldERlcHRoU2l6ZSgpIGNvbnN0OworICAgIEdMdWludCBnZXRTdGVuY2lsU2l6ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgR0xzaXplaSBnZXRTYW1wbGVzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN3OjpGb3JtYXQgZ2V0SW50ZXJuYWxGb3JtYXQoKSBjb25zdDsKKworICAgIHVuc2lnbmVkIGludCBnZXRTZXJpYWwoKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisgICAgR0xzaXplaSBtV2lkdGg7CisgICAgR0xzaXplaSBtSGVpZ2h0OworICAgIEdMZW51bSBmb3JtYXQ7CisgICAgc3c6OkZvcm1hdCBpbnRlcm5hbEZvcm1hdDsKKyAgICBHTHNpemVpIG1TYW1wbGVzOworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJlbmRlcmJ1ZmZlclN0b3JhZ2UpOworCisgICAgc3RhdGljIHVuc2lnbmVkIGludCBpc3N1ZVNlcmlhbCgpOworCisgICAgY29uc3QgdW5zaWduZWQgaW50IG1TZXJpYWw7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IG1DdXJyZW50U2VyaWFsOworfTsKKworLy8gUmVuZGVyYnVmZmVyIGltcGxlbWVudHMgdGhlIEdMIHJlbmRlcmJ1ZmZlciBvYmplY3QuCisvLyBJdCdzIG9ubHkgYSBwcm94eSBmb3IgYSBSZW5kZXJidWZmZXJTdG9yYWdlIGluc3RhbmNlOyB0aGUgaW50ZXJuYWwgb2JqZWN0CisvLyBjYW4gY2hhbmdlIHdoZW5ldmVyIGdsUmVuZGVyYnVmZmVyU3RvcmFnZSBpcyBjYWxsZWQuCitjbGFzcyBSZW5kZXJidWZmZXIgOiBwdWJsaWMgUmVmQ291bnRPYmplY3QKK3sKKyAgcHVibGljOgorICAgIFJlbmRlcmJ1ZmZlcihHTHVpbnQgaWQsIFJlbmRlcmJ1ZmZlclN0b3JhZ2UgKnN0b3JhZ2UpOworCisgICAgflJlbmRlcmJ1ZmZlcigpOworCisgICAgYm9vbCBpc0NvbG9yYnVmZmVyKCkgY29uc3Q7CisgICAgYm9vbCBpc0RlcHRoYnVmZmVyKCkgY29uc3Q7CisgICAgYm9vbCBpc1N0ZW5jaWxidWZmZXIoKSBjb25zdDsKKworICAgIEltYWdlICpnZXRSZW5kZXJUYXJnZXQoKTsKKyAgICBJbWFnZSAqZ2V0RGVwdGhTdGVuY2lsKCk7CisKKyAgICBHTHNpemVpIGdldFdpZHRoKCkgY29uc3Q7CisgICAgR0xzaXplaSBnZXRIZWlnaHQoKSBjb25zdDsKKyAgICBHTGVudW0gZ2V0Rm9ybWF0KCkgY29uc3Q7CisgICAgc3c6OkZvcm1hdCBnZXRJbnRlcm5hbEZvcm1hdCgpIGNvbnN0OworICAgIEdMdWludCBnZXRSZWRTaXplKCkgY29uc3Q7CisgICAgR0x1aW50IGdldEdyZWVuU2l6ZSgpIGNvbnN0OworICAgIEdMdWludCBnZXRCbHVlU2l6ZSgpIGNvbnN0OworICAgIEdMdWludCBnZXRBbHBoYVNpemUoKSBjb25zdDsKKyAgICBHTHVpbnQgZ2V0RGVwdGhTaXplKCkgY29uc3Q7CisgICAgR0x1aW50IGdldFN0ZW5jaWxTaXplKCkgY29uc3Q7CisgICAgR0xzaXplaSBnZXRTYW1wbGVzKCkgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBpbnQgZ2V0U2VyaWFsKCkgY29uc3Q7CisKKyAgICB2b2lkIHNldFN0b3JhZ2UoUmVuZGVyYnVmZmVyU3RvcmFnZSAqbmV3U3RvcmFnZSk7CisgICAgUmVuZGVyYnVmZmVyU3RvcmFnZSAqZ2V0U3RvcmFnZSgpIHsgcmV0dXJuIG1TdG9yYWdlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVuZGVyYnVmZmVyKTsKKworICAgIFJlbmRlcmJ1ZmZlclN0b3JhZ2UgKm1TdG9yYWdlOworfTsKKworY2xhc3MgQ29sb3JidWZmZXIgOiBwdWJsaWMgUmVuZGVyYnVmZmVyU3RvcmFnZQoreworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQ29sb3JidWZmZXIoSW1hZ2UgKnJlbmRlclRhcmdldCk7CisgICAgQ29sb3JidWZmZXIoVGV4dHVyZSAqdGV4dHVyZSwgR0xlbnVtIHRhcmdldCk7CisgICAgQ29sb3JidWZmZXIoR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgc2FtcGxlcyk7CisKKyAgICB2aXJ0dWFsIH5Db2xvcmJ1ZmZlcigpOworCisgICAgdmlydHVhbCBib29sIGlzQ29sb3JidWZmZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwgSW1hZ2UgKmdldFJlbmRlclRhcmdldCgpOworCisgICAgdmlydHVhbCBHTHNpemVpIGdldFdpZHRoKCkgY29uc3Q7CisgICAgdmlydHVhbCBHTHNpemVpIGdldEhlaWdodCgpIGNvbnN0OworICAgIHZpcnR1YWwgR0xlbnVtIGdldEZvcm1hdCgpIGNvbnN0OworICAgIHZpcnR1YWwgR0xlbnVtIGdldFR5cGUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3c6OkZvcm1hdCBnZXRJbnRlcm5hbEZvcm1hdCgpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvbG9yYnVmZmVyKTsKKworICAgIEltYWdlICptUmVuZGVyVGFyZ2V0OworICAgIFRleHR1cmUgKm1UZXh0dXJlOworICAgIEdMZW51bSBtVGFyZ2V0OworfTsKKworY2xhc3MgRGVwdGhTdGVuY2lsYnVmZmVyIDogcHVibGljIFJlbmRlcmJ1ZmZlclN0b3JhZ2UKK3sKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERlcHRoU3RlbmNpbGJ1ZmZlcihJbWFnZSAqZGVwdGhTdGVuY2lsKTsKKyAgICBEZXB0aFN0ZW5jaWxidWZmZXIoR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgc2FtcGxlcyk7CisKKyAgICB+RGVwdGhTdGVuY2lsYnVmZmVyKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNEZXB0aGJ1ZmZlcigpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc1N0ZW5jaWxidWZmZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwgSW1hZ2UgKmdldERlcHRoU3RlbmNpbCgpOworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERlcHRoU3RlbmNpbGJ1ZmZlcik7CisgICAgSW1hZ2UgKm1EZXB0aFN0ZW5jaWw7Cit9OworCitjbGFzcyBEZXB0aGJ1ZmZlciA6IHB1YmxpYyBEZXB0aFN0ZW5jaWxidWZmZXIKK3sKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERlcHRoYnVmZmVyKEltYWdlICpkZXB0aFN0ZW5jaWwpOworICAgIERlcHRoYnVmZmVyKEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIHNhbXBsZXMpOworCisgICAgdmlydHVhbCB+RGVwdGhidWZmZXIoKTsKKworICAgIHZpcnR1YWwgYm9vbCBpc0RlcHRoYnVmZmVyKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzU3RlbmNpbGJ1ZmZlcigpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERlcHRoYnVmZmVyKTsKK307CisKK2NsYXNzIFN0ZW5jaWxidWZmZXIgOiBwdWJsaWMgRGVwdGhTdGVuY2lsYnVmZmVyCit7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTdGVuY2lsYnVmZmVyKEltYWdlICpkZXB0aFN0ZW5jaWwpOworICAgIFN0ZW5jaWxidWZmZXIoR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgc2FtcGxlcyk7CisKKyAgICB2aXJ0dWFsIH5TdGVuY2lsYnVmZmVyKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNEZXB0aGJ1ZmZlcigpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc1N0ZW5jaWxidWZmZXIoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdGVuY2lsYnVmZmVyKTsKK307Cit9CisKKyNlbmRpZiAgIC8vIExJQkdMRVNWMl9SRU5ERVJCVUZGRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9SZXNvdXJjZU1hbmFnZXIuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1Jlc291cmNlTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxOGQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9SZXNvdXJjZU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMzIwIEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBSZXNvdXJjZU1hbmFnZXIuY3BwOiBJbXBsZW1lbnRzIHRoZSBSZXNvdXJjZU1hbmFnZXIgY2xhc3MsIHdoaWNoIHRyYWNrcyBhbmQgCisvLyByZXRyaWV2ZXMgb2JqZWN0cyB3aGljaCBtYXkgYmUgc2hhcmVkIGJ5IG11bHRpcGxlIENvbnRleHRzLgorCisjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyLmgiCisKKyNpbmNsdWRlICJCdWZmZXIuaCIKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisjaW5jbHVkZSAiUmVuZGVyQnVmZmVyLmgiCisjaW5jbHVkZSAiU2hhZGVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorCituYW1lc3BhY2UgZ2wKK3sKK1Jlc291cmNlTWFuYWdlcjo6UmVzb3VyY2VNYW5hZ2VyKCkKK3sKKyAgICBtUmVmQ291bnQgPSAxOworfQorCitSZXNvdXJjZU1hbmFnZXI6On5SZXNvdXJjZU1hbmFnZXIoKQoreworICAgIHdoaWxlKCFtQnVmZmVyTWFwLmVtcHR5KCkpCisgICAgeworICAgICAgICBkZWxldGVCdWZmZXIobUJ1ZmZlck1hcC5iZWdpbigpLT5maXJzdCk7CisgICAgfQorCisgICAgd2hpbGUoIW1Qcm9ncmFtTWFwLmVtcHR5KCkpCisgICAgeworICAgICAgICBkZWxldGVQcm9ncmFtKG1Qcm9ncmFtTWFwLmJlZ2luKCktPmZpcnN0KTsKKyAgICB9CisKKyAgICB3aGlsZSghbVNoYWRlck1hcC5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgZGVsZXRlU2hhZGVyKG1TaGFkZXJNYXAuYmVnaW4oKS0+Zmlyc3QpOworICAgIH0KKworICAgIHdoaWxlKCFtUmVuZGVyYnVmZmVyTWFwLmVtcHR5KCkpCisgICAgeworICAgICAgICBkZWxldGVSZW5kZXJidWZmZXIobVJlbmRlcmJ1ZmZlck1hcC5iZWdpbigpLT5maXJzdCk7CisgICAgfQorCisgICAgd2hpbGUoIW1UZXh0dXJlTWFwLmVtcHR5KCkpCisgICAgeworICAgICAgICBkZWxldGVUZXh0dXJlKG1UZXh0dXJlTWFwLmJlZ2luKCktPmZpcnN0KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyOjphZGRSZWYoKQoreworICAgIG1SZWZDb3VudCsrOworfQorCit2b2lkIFJlc291cmNlTWFuYWdlcjo6cmVsZWFzZSgpCit7CisgICAgaWYoLS1tUmVmQ291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KK30KKworLy8gUmV0dXJucyBhbiB1bnVzZWQgYnVmZmVyIG5hbWUKK0dMdWludCBSZXNvdXJjZU1hbmFnZXI6OmNyZWF0ZUJ1ZmZlcigpCit7CisgICAgR0x1aW50IGhhbmRsZSA9IG1CdWZmZXJIYW5kbGVBbGxvY2F0b3IuYWxsb2NhdGUoKTsKKworICAgIG1CdWZmZXJNYXBbaGFuZGxlXSA9IE5VTEw7CisKKyAgICByZXR1cm4gaGFuZGxlOworfQorCisvLyBSZXR1cm5zIGFuIHVudXNlZCBzaGFkZXIvcHJvZ3JhbSBuYW1lCitHTHVpbnQgUmVzb3VyY2VNYW5hZ2VyOjpjcmVhdGVTaGFkZXIoR0xlbnVtIHR5cGUpCit7CisgICAgR0x1aW50IGhhbmRsZSA9IG1Qcm9ncmFtU2hhZGVySGFuZGxlQWxsb2NhdG9yLmFsbG9jYXRlKCk7CisKKyAgICBpZih0eXBlID09IEdMX1ZFUlRFWF9TSEFERVIpCisgICAgeworICAgICAgICBtU2hhZGVyTWFwW2hhbmRsZV0gPSBuZXcgVmVydGV4U2hhZGVyKHRoaXMsIGhhbmRsZSk7CisgICAgfQorICAgIGVsc2UgaWYodHlwZSA9PSBHTF9GUkFHTUVOVF9TSEFERVIpCisgICAgeworICAgICAgICBtU2hhZGVyTWFwW2hhbmRsZV0gPSBuZXcgRnJhZ21lbnRTaGFkZXIodGhpcywgaGFuZGxlKTsKKyAgICB9CisgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworCisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworLy8gUmV0dXJucyBhbiB1bnVzZWQgcHJvZ3JhbS9zaGFkZXIgbmFtZQorR0x1aW50IFJlc291cmNlTWFuYWdlcjo6Y3JlYXRlUHJvZ3JhbSgpCit7CisgICAgR0x1aW50IGhhbmRsZSA9IG1Qcm9ncmFtU2hhZGVySGFuZGxlQWxsb2NhdG9yLmFsbG9jYXRlKCk7CisKKyAgICBtUHJvZ3JhbU1hcFtoYW5kbGVdID0gbmV3IFByb2dyYW0odGhpcywgaGFuZGxlKTsKKworICAgIHJldHVybiBoYW5kbGU7Cit9CisKKy8vIFJldHVybnMgYW4gdW51c2VkIHRleHR1cmUgbmFtZQorR0x1aW50IFJlc291cmNlTWFuYWdlcjo6Y3JlYXRlVGV4dHVyZSgpCit7CisgICAgR0x1aW50IGhhbmRsZSA9IG1UZXh0dXJlSGFuZGxlQWxsb2NhdG9yLmFsbG9jYXRlKCk7CisKKyAgICBtVGV4dHVyZU1hcFtoYW5kbGVdID0gTlVMTDsKKworICAgIHJldHVybiBoYW5kbGU7Cit9CisKKy8vIFJldHVybnMgYW4gdW51c2VkIHJlbmRlcmJ1ZmZlciBuYW1lCitHTHVpbnQgUmVzb3VyY2VNYW5hZ2VyOjpjcmVhdGVSZW5kZXJidWZmZXIoKQoreworICAgIEdMdWludCBoYW5kbGUgPSBtUmVuZGVyYnVmZmVySGFuZGxlQWxsb2NhdG9yLmFsbG9jYXRlKCk7CisKKyAgICBtUmVuZGVyYnVmZmVyTWFwW2hhbmRsZV0gPSBOVUxMOworCisgICAgcmV0dXJuIGhhbmRsZTsKK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXI6OmRlbGV0ZUJ1ZmZlcihHTHVpbnQgYnVmZmVyKQoreworICAgIEJ1ZmZlck1hcDo6aXRlcmF0b3IgYnVmZmVyT2JqZWN0ID0gbUJ1ZmZlck1hcC5maW5kKGJ1ZmZlcik7CisKKyAgICBpZihidWZmZXJPYmplY3QgIT0gbUJ1ZmZlck1hcC5lbmQoKSkKKyAgICB7CisgICAgICAgIG1CdWZmZXJIYW5kbGVBbGxvY2F0b3IucmVsZWFzZShidWZmZXJPYmplY3QtPmZpcnN0KTsKKyAgICAgICAgaWYoYnVmZmVyT2JqZWN0LT5zZWNvbmQpIGJ1ZmZlck9iamVjdC0+c2Vjb25kLT5yZWxlYXNlKCk7CisgICAgICAgIG1CdWZmZXJNYXAuZXJhc2UoYnVmZmVyT2JqZWN0KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyOjpkZWxldGVTaGFkZXIoR0x1aW50IHNoYWRlcikKK3sKKyAgICBTaGFkZXJNYXA6Oml0ZXJhdG9yIHNoYWRlck9iamVjdCA9IG1TaGFkZXJNYXAuZmluZChzaGFkZXIpOworCisgICAgaWYoc2hhZGVyT2JqZWN0ICE9IG1TaGFkZXJNYXAuZW5kKCkpCisgICAgeworICAgICAgICBpZihzaGFkZXJPYmplY3QtPnNlY29uZC0+Z2V0UmVmQ291bnQoKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBtUHJvZ3JhbVNoYWRlckhhbmRsZUFsbG9jYXRvci5yZWxlYXNlKHNoYWRlck9iamVjdC0+Zmlyc3QpOworICAgICAgICAgICAgZGVsZXRlIHNoYWRlck9iamVjdC0+c2Vjb25kOworICAgICAgICAgICAgbVNoYWRlck1hcC5lcmFzZShzaGFkZXJPYmplY3QpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc2hhZGVyT2JqZWN0LT5zZWNvbmQtPmZsYWdGb3JEZWxldGlvbigpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlc291cmNlTWFuYWdlcjo6ZGVsZXRlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSkKK3sKKyAgICBQcm9ncmFtTWFwOjppdGVyYXRvciBwcm9ncmFtT2JqZWN0ID0gbVByb2dyYW1NYXAuZmluZChwcm9ncmFtKTsKKworICAgIGlmKHByb2dyYW1PYmplY3QgIT0gbVByb2dyYW1NYXAuZW5kKCkpCisgICAgeworICAgICAgICBpZihwcm9ncmFtT2JqZWN0LT5zZWNvbmQtPmdldFJlZkNvdW50KCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbVByb2dyYW1TaGFkZXJIYW5kbGVBbGxvY2F0b3IucmVsZWFzZShwcm9ncmFtT2JqZWN0LT5maXJzdCk7CisgICAgICAgICAgICBkZWxldGUgcHJvZ3JhbU9iamVjdC0+c2Vjb25kOworICAgICAgICAgICAgbVByb2dyYW1NYXAuZXJhc2UocHJvZ3JhbU9iamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IAorICAgICAgICAgICAgcHJvZ3JhbU9iamVjdC0+c2Vjb25kLT5mbGFnRm9yRGVsZXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXI6OmRlbGV0ZVRleHR1cmUoR0x1aW50IHRleHR1cmUpCit7CisgICAgVGV4dHVyZU1hcDo6aXRlcmF0b3IgdGV4dHVyZU9iamVjdCA9IG1UZXh0dXJlTWFwLmZpbmQodGV4dHVyZSk7CisKKyAgICBpZih0ZXh0dXJlT2JqZWN0ICE9IG1UZXh0dXJlTWFwLmVuZCgpKQorICAgIHsKKyAgICAgICAgbVRleHR1cmVIYW5kbGVBbGxvY2F0b3IucmVsZWFzZSh0ZXh0dXJlT2JqZWN0LT5maXJzdCk7CisgICAgICAgIGlmKHRleHR1cmVPYmplY3QtPnNlY29uZCkgdGV4dHVyZU9iamVjdC0+c2Vjb25kLT5yZWxlYXNlKCk7CisgICAgICAgIG1UZXh0dXJlTWFwLmVyYXNlKHRleHR1cmVPYmplY3QpOworICAgIH0KK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXI6OmRlbGV0ZVJlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKQoreworICAgIFJlbmRlcmJ1ZmZlck1hcDo6aXRlcmF0b3IgcmVuZGVyYnVmZmVyT2JqZWN0ID0gbVJlbmRlcmJ1ZmZlck1hcC5maW5kKHJlbmRlcmJ1ZmZlcik7CisKKyAgICBpZihyZW5kZXJidWZmZXJPYmplY3QgIT0gbVJlbmRlcmJ1ZmZlck1hcC5lbmQoKSkKKyAgICB7CisgICAgICAgIG1SZW5kZXJidWZmZXJIYW5kbGVBbGxvY2F0b3IucmVsZWFzZShyZW5kZXJidWZmZXJPYmplY3QtPmZpcnN0KTsKKyAgICAgICAgaWYocmVuZGVyYnVmZmVyT2JqZWN0LT5zZWNvbmQpIHJlbmRlcmJ1ZmZlck9iamVjdC0+c2Vjb25kLT5yZWxlYXNlKCk7CisgICAgICAgIG1SZW5kZXJidWZmZXJNYXAuZXJhc2UocmVuZGVyYnVmZmVyT2JqZWN0KTsKKyAgICB9Cit9CisKK0J1ZmZlciAqUmVzb3VyY2VNYW5hZ2VyOjpnZXRCdWZmZXIodW5zaWduZWQgaW50IGhhbmRsZSkKK3sKKyAgICBCdWZmZXJNYXA6Oml0ZXJhdG9yIGJ1ZmZlciA9IG1CdWZmZXJNYXAuZmluZChoYW5kbGUpOworCisgICAgaWYoYnVmZmVyID09IG1CdWZmZXJNYXAuZW5kKCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci0+c2Vjb25kOworICAgIH0KK30KKworU2hhZGVyICpSZXNvdXJjZU1hbmFnZXI6OmdldFNoYWRlcih1bnNpZ25lZCBpbnQgaGFuZGxlKQoreworICAgIFNoYWRlck1hcDo6aXRlcmF0b3Igc2hhZGVyID0gbVNoYWRlck1hcC5maW5kKGhhbmRsZSk7CisKKyAgICBpZihzaGFkZXIgPT0gbVNoYWRlck1hcC5lbmQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gc2hhZGVyLT5zZWNvbmQ7CisgICAgfQorfQorCitUZXh0dXJlICpSZXNvdXJjZU1hbmFnZXI6OmdldFRleHR1cmUodW5zaWduZWQgaW50IGhhbmRsZSkKK3sKKyAgICBpZihoYW5kbGUgPT0gMCkgcmV0dXJuIE5VTEw7CisKKyAgICBUZXh0dXJlTWFwOjppdGVyYXRvciB0ZXh0dXJlID0gbVRleHR1cmVNYXAuZmluZChoYW5kbGUpOworCisgICAgaWYodGV4dHVyZSA9PSBtVGV4dHVyZU1hcC5lbmQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gdGV4dHVyZS0+c2Vjb25kOworICAgIH0KK30KKworUHJvZ3JhbSAqUmVzb3VyY2VNYW5hZ2VyOjpnZXRQcm9ncmFtKHVuc2lnbmVkIGludCBoYW5kbGUpCit7CisgICAgUHJvZ3JhbU1hcDo6aXRlcmF0b3IgcHJvZ3JhbSA9IG1Qcm9ncmFtTWFwLmZpbmQoaGFuZGxlKTsKKworICAgIGlmKHByb2dyYW0gPT0gbVByb2dyYW1NYXAuZW5kKCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb2dyYW0tPnNlY29uZDsKKyAgICB9Cit9CisKK1JlbmRlcmJ1ZmZlciAqUmVzb3VyY2VNYW5hZ2VyOjpnZXRSZW5kZXJidWZmZXIodW5zaWduZWQgaW50IGhhbmRsZSkKK3sKKyAgICBSZW5kZXJidWZmZXJNYXA6Oml0ZXJhdG9yIHJlbmRlcmJ1ZmZlciA9IG1SZW5kZXJidWZmZXJNYXAuZmluZChoYW5kbGUpOworCisgICAgaWYocmVuZGVyYnVmZmVyID09IG1SZW5kZXJidWZmZXJNYXAuZW5kKCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlbmRlcmJ1ZmZlci0+c2Vjb25kOworICAgIH0KK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXI6OnNldFJlbmRlcmJ1ZmZlcihHTHVpbnQgaGFuZGxlLCBSZW5kZXJidWZmZXIgKmJ1ZmZlcikKK3sKKyAgICBtUmVuZGVyYnVmZmVyTWFwW2hhbmRsZV0gPSBidWZmZXI7Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyOjpjaGVja0J1ZmZlckFsbG9jYXRpb24odW5zaWduZWQgaW50IGJ1ZmZlcikKK3sKKyAgICBpZihidWZmZXIgIT0gMCAmJiAhZ2V0QnVmZmVyKGJ1ZmZlcikpCisgICAgeworICAgICAgICBCdWZmZXIgKmJ1ZmZlck9iamVjdCA9IG5ldyBCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgbUJ1ZmZlck1hcFtidWZmZXJdID0gYnVmZmVyT2JqZWN0OworICAgICAgICBidWZmZXJPYmplY3QtPmFkZFJlZigpOworICAgIH0KK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXI6OmNoZWNrVGV4dHVyZUFsbG9jYXRpb24oR0x1aW50IHRleHR1cmUsIFRleHR1cmVUeXBlIHR5cGUpCit7CisgICAgaWYoIWdldFRleHR1cmUodGV4dHVyZSkgJiYgdGV4dHVyZSAhPSAwKQorICAgIHsKKyAgICAgICAgVGV4dHVyZSAqdGV4dHVyZU9iamVjdDsKKworICAgICAgICBpZih0eXBlID09IFRFWFRVUkVfMkQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRleHR1cmVPYmplY3QgPSBuZXcgVGV4dHVyZTJEKHRleHR1cmUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYodHlwZSA9PSBURVhUVVJFX0NVQkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRleHR1cmVPYmplY3QgPSBuZXcgVGV4dHVyZUN1YmVNYXAodGV4dHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBVTlJFQUNIQUJMRSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbVRleHR1cmVNYXBbdGV4dHVyZV0gPSB0ZXh0dXJlT2JqZWN0OworICAgICAgICB0ZXh0dXJlT2JqZWN0LT5hZGRSZWYoKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyOjpjaGVja1JlbmRlcmJ1ZmZlckFsbG9jYXRpb24oR0x1aW50IHJlbmRlcmJ1ZmZlcikKK3sKKyAgICBpZihyZW5kZXJidWZmZXIgIT0gMCAmJiAhZ2V0UmVuZGVyYnVmZmVyKHJlbmRlcmJ1ZmZlcikpCisgICAgeworICAgICAgICBSZW5kZXJidWZmZXIgKnJlbmRlcmJ1ZmZlck9iamVjdCA9IG5ldyBSZW5kZXJidWZmZXIocmVuZGVyYnVmZmVyLCBuZXcgQ29sb3JidWZmZXIoMCwgMCwgR0xfUkdCQTQsIDApKTsKKyAgICAgICAgbVJlbmRlcmJ1ZmZlck1hcFtyZW5kZXJidWZmZXJdID0gcmVuZGVyYnVmZmVyT2JqZWN0OworICAgICAgICByZW5kZXJidWZmZXJPYmplY3QtPmFkZFJlZigpOworICAgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1Jlc291cmNlTWFuYWdlci5oIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1Jlc291cmNlTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjQxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvUmVzb3VyY2VNYW5hZ2VyLmgKQEAgLTAsMCArMSw5OCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gUmVzb3VyY2VNYW5hZ2VyLmggOiBEZWZpbmVzIHRoZSBSZXNvdXJjZU1hbmFnZXIgY2xhc3MsIHdoaWNoIHRyYWNrcyBvYmplY3RzCisvLyBzaGFyZWQgYnkgbXVsdGlwbGUgR0wgY29udGV4dHMuCisKKyNpZm5kZWYgTElCR0xFU1YyX1JFU09VUkNFTUFOQUdFUl9IXworI2RlZmluZSBMSUJHTEVTVjJfUkVTT1VSQ0VNQU5BR0VSX0hfCisKKyNpbmNsdWRlICJIYW5kbGVBbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJjb21tb24vYW5nbGV1dGlscy5oIgorCisjZGVmaW5lIEdMX0FQSUNBTEwKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPGhhc2hfbWFwPgorCituYW1lc3BhY2UgZ2wKK3sKK2NsYXNzIEJ1ZmZlcjsKK2NsYXNzIFNoYWRlcjsKK2NsYXNzIFByb2dyYW07CitjbGFzcyBUZXh0dXJlOworY2xhc3MgUmVuZGVyYnVmZmVyOworCitlbnVtIFRleHR1cmVUeXBlCit7CisgICAgVEVYVFVSRV8yRCwKKyAgICBURVhUVVJFX0NVQkUsCisKKyAgICBURVhUVVJFX1RZUEVfQ09VTlQsCisgICAgVEVYVFVSRV9VTktOT1dOCit9OworCitjbGFzcyBSZXNvdXJjZU1hbmFnZXIKK3sKKyAgcHVibGljOgorICAgIFJlc291cmNlTWFuYWdlcigpOworICAgIH5SZXNvdXJjZU1hbmFnZXIoKTsKKworICAgIHZvaWQgYWRkUmVmKCk7CisgICAgdm9pZCByZWxlYXNlKCk7CisKKyAgICBHTHVpbnQgY3JlYXRlQnVmZmVyKCk7CisgICAgR0x1aW50IGNyZWF0ZVNoYWRlcihHTGVudW0gdHlwZSk7CisgICAgR0x1aW50IGNyZWF0ZVByb2dyYW0oKTsKKyAgICBHTHVpbnQgY3JlYXRlVGV4dHVyZSgpOworICAgIEdMdWludCBjcmVhdGVSZW5kZXJidWZmZXIoKTsKKworICAgIHZvaWQgZGVsZXRlQnVmZmVyKEdMdWludCBidWZmZXIpOworICAgIHZvaWQgZGVsZXRlU2hhZGVyKEdMdWludCBzaGFkZXIpOworICAgIHZvaWQgZGVsZXRlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSk7CisgICAgdm9pZCBkZWxldGVUZXh0dXJlKEdMdWludCB0ZXh0dXJlKTsKKyAgICB2b2lkIGRlbGV0ZVJlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKTsKKworICAgIEJ1ZmZlciAqZ2V0QnVmZmVyKEdMdWludCBoYW5kbGUpOworICAgIFNoYWRlciAqZ2V0U2hhZGVyKEdMdWludCBoYW5kbGUpOworICAgIFByb2dyYW0gKmdldFByb2dyYW0oR0x1aW50IGhhbmRsZSk7CisgICAgVGV4dHVyZSAqZ2V0VGV4dHVyZShHTHVpbnQgaGFuZGxlKTsKKyAgICBSZW5kZXJidWZmZXIgKmdldFJlbmRlcmJ1ZmZlcihHTHVpbnQgaGFuZGxlKTsKKyAgICAKKyAgICB2b2lkIHNldFJlbmRlcmJ1ZmZlcihHTHVpbnQgaGFuZGxlLCBSZW5kZXJidWZmZXIgKnJlbmRlcmJ1ZmZlcik7CisKKyAgICB2b2lkIGNoZWNrQnVmZmVyQWxsb2NhdGlvbih1bnNpZ25lZCBpbnQgYnVmZmVyKTsKKyAgICB2b2lkIGNoZWNrVGV4dHVyZUFsbG9jYXRpb24oR0x1aW50IHRleHR1cmUsIFRleHR1cmVUeXBlIHR5cGUpOworICAgIHZvaWQgY2hlY2tSZW5kZXJidWZmZXJBbGxvY2F0aW9uKEdMdWludCByZW5kZXJidWZmZXIpOworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJlc291cmNlTWFuYWdlcik7CisKKyAgICBzdGQ6OnNpemVfdCBtUmVmQ291bnQ7CisKKyAgICB0eXBlZGVmIHN0ZGV4dDo6aGFzaF9tYXA8R0x1aW50LCBCdWZmZXIqPiBCdWZmZXJNYXA7CisgICAgQnVmZmVyTWFwIG1CdWZmZXJNYXA7CisgICAgSGFuZGxlQWxsb2NhdG9yIG1CdWZmZXJIYW5kbGVBbGxvY2F0b3I7CisKKyAgICB0eXBlZGVmIHN0ZGV4dDo6aGFzaF9tYXA8R0x1aW50LCBTaGFkZXIqPiBTaGFkZXJNYXA7CisgICAgU2hhZGVyTWFwIG1TaGFkZXJNYXA7CisKKyAgICB0eXBlZGVmIHN0ZGV4dDo6aGFzaF9tYXA8R0x1aW50LCBQcm9ncmFtKj4gUHJvZ3JhbU1hcDsKKyAgICBQcm9ncmFtTWFwIG1Qcm9ncmFtTWFwOworICAgIEhhbmRsZUFsbG9jYXRvciBtUHJvZ3JhbVNoYWRlckhhbmRsZUFsbG9jYXRvcjsKKworICAgIHR5cGVkZWYgc3RkZXh0OjpoYXNoX21hcDxHTHVpbnQsIFRleHR1cmUqPiBUZXh0dXJlTWFwOworICAgIFRleHR1cmVNYXAgbVRleHR1cmVNYXA7CisgICAgSGFuZGxlQWxsb2NhdG9yIG1UZXh0dXJlSGFuZGxlQWxsb2NhdG9yOworCisgICAgdHlwZWRlZiBzdGRleHQ6Omhhc2hfbWFwPEdMdWludCwgUmVuZGVyYnVmZmVyKj4gUmVuZGVyYnVmZmVyTWFwOworICAgIFJlbmRlcmJ1ZmZlck1hcCBtUmVuZGVyYnVmZmVyTWFwOworICAgIEhhbmRsZUFsbG9jYXRvciBtUmVuZGVyYnVmZmVySGFuZGxlQWxsb2NhdG9yOworfTsKKworfQorCisjZW5kaWYgLy8gTElCR0xFU1YyX1JFU09VUkNFTUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1NoYWRlci5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvU2hhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzJlYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1NoYWRlci5jcHAKQEAgLTAsMCArMSw1MjMgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIFNoYWRlci5jcHA6IEltcGxlbWVudHMgdGhlIFNoYWRlciBjbGFzcyBhbmQgaXRzICBkZXJpdmVkIGNsYXNzZXMKKy8vIFZlcnRleFNoYWRlciBhbmQgRnJhZ21lbnRTaGFkZXIuIEltcGxlbWVudHMgR0wgc2hhZGVyIG9iamVjdHMgYW5kIHJlbGF0ZWQKKy8vIGZ1bmN0aW9uYWxpdHkuIFtPcGVuR0wgRVMgMi4wLjI0XSBzZWN0aW9uIDIuMTAgcGFnZSAyNCBhbmQgc2VjdGlvbiAzLjggcGFnZSA4NC4KKworI2luY2x1ZGUgIlNoYWRlci5oIgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorCisjaW5jbHVkZSAiR0xTTEFORy9TaGFkZXJsYW5nLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBnbAorewordm9pZCAqU2hhZGVyOjptRnJhZ21lbnRDb21waWxlciA9IE5VTEw7Cit2b2lkICpTaGFkZXI6Om1WZXJ0ZXhDb21waWxlciA9IE5VTEw7CisKK1NoYWRlcjo6U2hhZGVyKFJlc291cmNlTWFuYWdlciAqbWFuYWdlciwgR0x1aW50IGhhbmRsZSkgOiBtSGFuZGxlKGhhbmRsZSksIG1SZXNvdXJjZU1hbmFnZXIobWFuYWdlcikKK3sKKyAgICBtU291cmNlID0gTlVMTDsKKyAgICBtSGxzbCA9IE5VTEw7CisgICAgbUluZm9Mb2cgPSBOVUxMOworCisgICAgLy8gUGVyZm9ybSBhIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBzaGFkZXIgY29tcGlsZXIgKG9yIGFmdGVyIGJlaW5nIGRlc3RydWN0ZWQgYnkgcmVsZWFzZUNvbXBpbGVyKQorICAgIGlmKCFtRnJhZ21lbnRDb21waWxlcikKKyAgICB7CisgICAgICAgIGludCByZXN1bHQgPSBTaEluaXRpYWxpemUoKTsKKworICAgICAgICBpZihyZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoQnVpbHRJblJlc291cmNlcyByZXNvdXJjZXM7CisgICAgICAgICAgICBTaEluaXRCdWlsdEluUmVzb3VyY2VzKCZyZXNvdXJjZXMpOworICAgICAgICAgICAgQ29udGV4dCAqY29udGV4dCA9IGdldENvbnRleHQoKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgcmVzb3VyY2VzLk1heFZlcnRleEF0dHJpYnMgPSBNQVhfVkVSVEVYX0FUVFJJQlM7CisgICAgICAgICAgICByZXNvdXJjZXMuTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgPSBNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzsKKyAgICAgICAgICAgIHJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyA9IE1BWF9WQVJZSU5HX1ZFQ1RPUlM7CisgICAgICAgICAgICByZXNvdXJjZXMuTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSBNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFM7CisgICAgICAgICAgICByZXNvdXJjZXMuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOworICAgICAgICAgICAgcmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRzID0gTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFM7CisgICAgICAgICAgICByZXNvdXJjZXMuTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyA9IE1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlM7CisgICAgICAgICAgICByZXNvdXJjZXMuTWF4RHJhd0J1ZmZlcnMgPSBNQVhfRFJBV19CVUZGRVJTOworICAgICAgICAgICAgcmVzb3VyY2VzLk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA9IDE7CisKKyAgICAgICAgICAgIG1GcmFnbWVudENvbXBpbGVyID0gU2hDb25zdHJ1Y3RDb21waWxlcihTSF9GUkFHTUVOVF9TSEFERVIsIFNIX0dMRVMyX1NQRUMsICZyZXNvdXJjZXMpOworICAgICAgICAgICAgbVZlcnRleENvbXBpbGVyID0gU2hDb25zdHJ1Y3RDb21waWxlcihTSF9WRVJURVhfU0hBREVSLCBTSF9HTEVTMl9TUEVDLCAmcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1SZWZDb3VudCA9IDA7CisgICAgbURlbGV0ZVN0YXR1cyA9IGZhbHNlOworfQorCitTaGFkZXI6On5TaGFkZXIoKQoreworICAgIGRlbGV0ZVtdIG1Tb3VyY2U7CisgICAgZGVsZXRlW10gbUhsc2w7CisgICAgZGVsZXRlW10gbUluZm9Mb2c7Cit9CisKK0dMdWludCBTaGFkZXI6OmdldEhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1IYW5kbGU7Cit9CisKK3ZvaWQgU2hhZGVyOjpzZXRTb3VyY2UoR0xzaXplaSBjb3VudCwgY29uc3QgY2hhciAqKnN0cmluZywgY29uc3QgR0xpbnQgKmxlbmd0aCkKK3sKKyAgICBkZWxldGVbXSBtU291cmNlOworICAgIGludCB0b3RhbExlbmd0aCA9IDA7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmKGxlbmd0aCAmJiBsZW5ndGhbaV0gPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG90YWxMZW5ndGggKz0gbGVuZ3RoW2ldOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdG90YWxMZW5ndGggKz0gKGludClzdHJsZW4oc3RyaW5nW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1Tb3VyY2UgPSBuZXcgY2hhclt0b3RhbExlbmd0aCArIDFdOworICAgIGNoYXIgKmNvZGUgPSBtU291cmNlOworCisgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgICBpbnQgc3RyaW5nTGVuZ3RoOworCisgICAgICAgIGlmKGxlbmd0aCAmJiBsZW5ndGhbaV0gPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nTGVuZ3RoID0gbGVuZ3RoW2ldOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nTGVuZ3RoID0gKGludClzdHJsZW4oc3RyaW5nW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cm5jcHkoY29kZSwgc3RyaW5nW2ldLCBzdHJpbmdMZW5ndGgpOworICAgICAgICBjb2RlICs9IHN0cmluZ0xlbmd0aDsKKyAgICB9CisKKyAgICBtU291cmNlW3RvdGFsTGVuZ3RoXSA9ICdcMCc7Cit9CisKK2ludCBTaGFkZXI6OmdldEluZm9Mb2dMZW5ndGgoKSBjb25zdAoreworICAgIGlmKCFtSW5mb0xvZykKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJldHVybiBzdHJsZW4obUluZm9Mb2cpICsgMTsKKyAgICB9Cit9CisKK3ZvaWQgU2hhZGVyOjpnZXRJbmZvTG9nKEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBjaGFyICppbmZvTG9nKQoreworICAgIGludCBpbmRleCA9IDA7CisKKyAgICBpZihtSW5mb0xvZykKKyAgICB7CisgICAgICAgIHdoaWxlKGluZGV4IDwgYnVmU2l6ZSAtIDEgJiYgaW5kZXggPCAoaW50KXN0cmxlbihtSW5mb0xvZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZm9Mb2dbaW5kZXhdID0gbUluZm9Mb2dbaW5kZXhdOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGJ1ZlNpemUpCisgICAgeworICAgICAgICBpbmZvTG9nW2luZGV4XSA9ICdcMCc7CisgICAgfQorCisgICAgaWYobGVuZ3RoKQorICAgIHsKKyAgICAgICAgKmxlbmd0aCA9IGluZGV4OworICAgIH0KK30KKworaW50IFNoYWRlcjo6Z2V0U291cmNlTGVuZ3RoKCkgY29uc3QKK3sKKyAgICBpZighbVNvdXJjZSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJldHVybiBzdHJsZW4obVNvdXJjZSkgKyAxOworICAgIH0KK30KKwordm9pZCBTaGFkZXI6OmdldFNvdXJjZShHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgY2hhciAqc291cmNlKQoreworICAgIGludCBpbmRleCA9IDA7CisKKyAgICBpZihtU291cmNlKQorICAgIHsKKyAgICAgICAgd2hpbGUoaW5kZXggPCBidWZTaXplIC0gMSAmJiBpbmRleCA8IChpbnQpc3RybGVuKG1Tb3VyY2UpKQorICAgICAgICB7CisgICAgICAgICAgICBzb3VyY2VbaW5kZXhdID0gbVNvdXJjZVtpbmRleF07CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoYnVmU2l6ZSkKKyAgICB7CisgICAgICAgIHNvdXJjZVtpbmRleF0gPSAnXDAnOworICAgIH0KKworICAgIGlmKGxlbmd0aCkKKyAgICB7CisgICAgICAgICpsZW5ndGggPSBpbmRleDsKKyAgICB9Cit9CisKK2Jvb2wgU2hhZGVyOjppc0NvbXBpbGVkKCkKK3sKKyAgICByZXR1cm4gbUhsc2wgIT0gTlVMTDsKK30KKworY29uc3QgY2hhciAqU2hhZGVyOjpnZXRITFNMKCkKK3sKKyAgICByZXR1cm4gbUhsc2w7Cit9CisKK3ZvaWQgU2hhZGVyOjphZGRSZWYoKQoreworICAgIG1SZWZDb3VudCsrOworfQorCit2b2lkIFNoYWRlcjo6cmVsZWFzZSgpCit7CisgICAgbVJlZkNvdW50LS07CisKKyAgICBpZihtUmVmQ291bnQgPT0gMCAmJiBtRGVsZXRlU3RhdHVzKQorICAgIHsKKyAgICAgICAgbVJlc291cmNlTWFuYWdlci0+ZGVsZXRlU2hhZGVyKG1IYW5kbGUpOworICAgIH0KK30KKwordW5zaWduZWQgaW50IFNoYWRlcjo6Z2V0UmVmQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtUmVmQ291bnQ7Cit9CisKK2Jvb2wgU2hhZGVyOjppc0ZsYWdnZWRGb3JEZWxldGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1EZWxldGVTdGF0dXM7Cit9CisKK3ZvaWQgU2hhZGVyOjpmbGFnRm9yRGVsZXRpb24oKQoreworICAgIG1EZWxldGVTdGF0dXMgPSB0cnVlOworfQorCit2b2lkIFNoYWRlcjo6cmVsZWFzZUNvbXBpbGVyKCkKK3sKKyAgICBTaERlc3RydWN0KG1GcmFnbWVudENvbXBpbGVyKTsKKyAgICBTaERlc3RydWN0KG1WZXJ0ZXhDb21waWxlcik7CisKKyAgICBtRnJhZ21lbnRDb21waWxlciA9IE5VTEw7CisgICAgbVZlcnRleENvbXBpbGVyID0gTlVMTDsKKworICAgIFNoRmluYWxpemUoKTsKK30KKwordm9pZCBTaGFkZXI6OnBhcnNlVmFyeWluZ3MoKQoreworICAgIGlmKG1IbHNsKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqaW5wdXQgPSBzdHJzdHIobUhsc2wsICIvLyBWYXJ5aW5ncyIpICsgMTI7CisKKyAgICAgICAgd2hpbGUodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciB2YXJ5aW5nVHlwZVsyNTZdOworICAgICAgICAgICAgY2hhciB2YXJ5aW5nTmFtZVsyNTZdOworCisgICAgICAgICAgICBpbnQgbWF0Y2hlcyA9IHNzY2FuZihpbnB1dCwgInN0YXRpYyAlMjU1cyAlMjU1cyIsIHZhcnlpbmdUeXBlLCB2YXJ5aW5nTmFtZSk7CisKKyAgICAgICAgICAgIGlmKG1hdGNoZXMgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hhciAqYXJyYXkgPSBzdHJzdHIodmFyeWluZ05hbWUsICJbIik7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IDE7CisKKyAgICAgICAgICAgIGlmKGFycmF5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSBhdG9pKGFycmF5ICsgMSk7CisgICAgICAgICAgICAgICAgKmFycmF5ID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyeWluZ3MucHVzaF9iYWNrKFZhcnlpbmcocGFyc2VUeXBlKHZhcnlpbmdUeXBlKSwgdmFyeWluZ05hbWUsIHNpemUsIGFycmF5ICE9IE5VTEwpKTsKKworICAgICAgICAgICAgaW5wdXQgPSBzdHJzdHIoaW5wdXQsICI7IikgKyAyOworICAgICAgICB9CisKKyAgICAgICAgbVVzZXNGcmFnQ29vcmQgPSBzdHJzdHIobUhsc2wsICJHTF9VU0VTX0ZSQUdfQ09PUkQiKSAhPSBOVUxMOworICAgICAgICBtVXNlc0Zyb250RmFjaW5nID0gc3Ryc3RyKG1IbHNsLCAiR0xfVVNFU19GUk9OVF9GQUNJTkciKSAhPSBOVUxMOworICAgICAgICBtVXNlc1BvaW50U2l6ZSA9IHN0cnN0cihtSGxzbCwgIkdMX1VTRVNfUE9JTlRfU0laRSIpICE9IE5VTEw7CisgICAgICAgIG1Vc2VzUG9pbnRDb29yZCA9IHN0cnN0cihtSGxzbCwgIkdMX1VTRVNfUE9JTlRfQ09PUkQiKSAhPSBOVUxMOworICAgIH0KK30KKwordm9pZCBTaGFkZXI6OmNvbXBpbGVUb0hMU0wodm9pZCAqY29tcGlsZXIpCit7CisgICAgaWYoaXNDb21waWxlZCgpIHx8ICFtU291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRlbGV0ZVtdIG1JbmZvTG9nOworICAgIG1JbmZvTG9nID0gTlVMTDsKKworICAgIGludCBjb21waWxlT3B0aW9ucyA9IFNIX09CSkVDVF9DT0RFOworICAgIHN0ZDo6c3RyaW5nIHNvdXJjZVBhdGg7CisKKyAgICBpbnQgcmVzdWx0OworICAgIGlmKHNvdXJjZVBhdGguZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IFNoQ29tcGlsZShjb21waWxlciwgJm1Tb3VyY2UsIDEsIGNvbXBpbGVPcHRpb25zKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogc291cmNlU3RyaW5nc1syXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHNvdXJjZVBhdGguY19zdHIoKSwKKyAgICAgICAgICAgIG1Tb3VyY2UKKyAgICAgICAgfTsKKworICAgICAgICByZXN1bHQgPSBTaENvbXBpbGUoY29tcGlsZXIsIHNvdXJjZVN0cmluZ3MsIDIsIGNvbXBpbGVPcHRpb25zIHwgU0hfU09VUkNFX1BBVEgpOworICAgIH0KKworICAgIGlmKHJlc3VsdCkKKyAgICB7CisgICAgICAgIGludCBvYmpDb2RlTGVuID0gMDsKKyAgICAgICAgU2hHZXRJbmZvKGNvbXBpbGVyLCBTSF9PQkpFQ1RfQ09ERV9MRU5HVEgsICZvYmpDb2RlTGVuKTsKKyAgICAgICAgbUhsc2wgPSBuZXcgY2hhcltvYmpDb2RlTGVuXTsKKyAgICAgICAgU2hHZXRPYmplY3RDb2RlKGNvbXBpbGVyLCBtSGxzbCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpbmZvTG9nTGVuID0gMDsKKyAgICAgICAgU2hHZXRJbmZvKGNvbXBpbGVyLCBTSF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTG9nTGVuKTsKKyAgICAgICAgbUluZm9Mb2cgPSBuZXcgY2hhcltpbmZvTG9nTGVuXTsKKyAgICAgICAgU2hHZXRJbmZvTG9nKGNvbXBpbGVyLCBtSW5mb0xvZyk7CisKKyAgICAgICAgVFJBQ0UoIlxuJXMiLCBtSW5mb0xvZyk7CisgICAgfQorfQorCitHTGVudW0gU2hhZGVyOjpwYXJzZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGUpCit7CisgICAgaWYodHlwZSA9PSAiZmxvYXQiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEdMX0ZMT0FUOworICAgIH0KKyAgICBlbHNlIGlmKHR5cGUgPT0gImZsb2F0MiIpCisgICAgeworICAgICAgICByZXR1cm4gR0xfRkxPQVRfVkVDMjsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09ICJmbG9hdDMiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEdMX0ZMT0FUX1ZFQzM7CisgICAgfQorICAgIGVsc2UgaWYodHlwZSA9PSAiZmxvYXQ0IikKKyAgICB7CisgICAgICAgIHJldHVybiBHTF9GTE9BVF9WRUM0OworICAgIH0KKyAgICBlbHNlIGlmKHR5cGUgPT0gImZsb2F0MngyIikKKyAgICB7CisgICAgICAgIHJldHVybiBHTF9GTE9BVF9NQVQyOworICAgIH0KKyAgICBlbHNlIGlmKHR5cGUgPT0gImZsb2F0M3gzIikKKyAgICB7CisgICAgICAgIHJldHVybiBHTF9GTE9BVF9NQVQzOworICAgIH0KKyAgICBlbHNlIGlmKHR5cGUgPT0gImZsb2F0NHg0IikKKyAgICB7CisgICAgICAgIHJldHVybiBHTF9GTE9BVF9NQVQ0OworICAgIH0KKyAgICBlbHNlIFVOUkVBQ0hBQkxFKCk7CisKKyAgICByZXR1cm4gR0xfTk9ORTsKK30KKworLy8gdHJ1ZSBpZiB2YXJ5aW5nIHggaGFzIGEgaGlnaGVyIHByaW9yaXR5IGluIHBhY2tpbmcgdGhhbiB5Citib29sIFNoYWRlcjo6Y29tcGFyZVZhcnlpbmcoY29uc3QgVmFyeWluZyAmeCwgY29uc3QgVmFyeWluZyAmeSkKK3sKKyAgICBpZih4LnR5cGUgPT0geS50eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHguc2l6ZSA+IHkuc2l6ZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHgudHlwZSkKKyAgICB7CisgICAgICBjYXNlIEdMX0ZMT0FUX01BVDQ6IHJldHVybiB0cnVlOworICAgICAgY2FzZSBHTF9GTE9BVF9NQVQyOgorICAgICAgICBzd2l0Y2goeS50eXBlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQ0OiByZXR1cm4gZmFsc2U7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQyOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzQ6IHJldHVybiB0cnVlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUMzogcmV0dXJuIHRydWU7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUMzOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzI6IHJldHVybiB0cnVlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVQ6ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfRkxPQVRfVkVDNDoKKyAgICAgICAgc3dpdGNoKHkudHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUNDogcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUMjogcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDNDogcmV0dXJuIHRydWU7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQzOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzM6IHJldHVybiB0cnVlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMjogcmV0dXJuIHRydWU7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVDogICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9GTE9BVF9NQVQzOgorICAgICAgICBzd2l0Y2goeS50eXBlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQ0OiByZXR1cm4gZmFsc2U7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQyOiByZXR1cm4gZmFsc2U7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUM0OiByZXR1cm4gZmFsc2U7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQzOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzM6IHJldHVybiB0cnVlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMjogcmV0dXJuIHRydWU7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVDogICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9GTE9BVF9WRUMzOgorICAgICAgICBzd2l0Y2goeS50eXBlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQ0OiByZXR1cm4gZmFsc2U7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQyOiByZXR1cm4gZmFsc2U7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUM0OiByZXR1cm4gZmFsc2U7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQzOiByZXR1cm4gZmFsc2U7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUMzOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzI6IHJldHVybiB0cnVlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVQ6ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMjoKKyAgICAgICAgc3dpdGNoKHkudHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUNDogcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUMjogcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDNDogcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUMzogcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMzogcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMjogcmV0dXJuIHRydWU7CisgICAgICAgICAgY2FzZSBHTF9GTE9BVDogICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9GTE9BVDogcmV0dXJuIGZhbHNlOworICAgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1ZlcnRleFNoYWRlcjo6VmVydGV4U2hhZGVyKFJlc291cmNlTWFuYWdlciAqbWFuYWdlciwgR0x1aW50IGhhbmRsZSkgOiBTaGFkZXIobWFuYWdlciwgaGFuZGxlKQoreworfQorCitWZXJ0ZXhTaGFkZXI6On5WZXJ0ZXhTaGFkZXIoKQoreworfQorCitHTGVudW0gVmVydGV4U2hhZGVyOjpnZXRUeXBlKCkKK3sKKyAgICByZXR1cm4gR0xfVkVSVEVYX1NIQURFUjsKK30KKwordm9pZCBWZXJ0ZXhTaGFkZXI6OmNvbXBpbGUoKQoreworICAgIGNvbXBpbGVUb0hMU0wobVZlcnRleENvbXBpbGVyKTsKKyAgICBwYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICBwYXJzZVZhcnlpbmdzKCk7Cit9CisKK2ludCBWZXJ0ZXhTaGFkZXI6OmdldFNlbWFudGljSW5kZXgoY29uc3Qgc3RkOjpzdHJpbmcgJmF0dHJpYnV0ZU5hbWUpCit7CisgICAgaWYoIWF0dHJpYnV0ZU5hbWUuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGludCBzZW1hbnRpY0luZGV4ID0gMDsKKyAgICAgICAgZm9yKEF0dHJpYnV0ZUFycmF5OjppdGVyYXRvciBhdHRyaWJ1dGUgPSBtQXR0cmlidXRlcy5iZWdpbigpOyBhdHRyaWJ1dGUgIT0gbUF0dHJpYnV0ZXMuZW5kKCk7IGF0dHJpYnV0ZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihhdHRyaWJ1dGUtPm5hbWUgPT0gYXR0cmlidXRlTmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VtYW50aWNJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VtYW50aWNJbmRleCArPSBWYXJpYWJsZVJvd0NvdW50KGF0dHJpYnV0ZS0+dHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgVmVydGV4U2hhZGVyOjpwYXJzZUF0dHJpYnV0ZXMoKQoreworICAgIGlmKG1IbHNsKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqaW5wdXQgPSBzdHJzdHIobUhsc2wsICIvLyBBdHRyaWJ1dGVzIikgKyAxNDsKKworICAgICAgICB3aGlsZSh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGF0dHJpYnV0ZVR5cGVbMjU2XTsKKyAgICAgICAgICAgIGNoYXIgYXR0cmlidXRlTmFtZVsyNTZdOworCisgICAgICAgICAgICBpbnQgbWF0Y2hlcyA9IHNzY2FuZihpbnB1dCwgInN0YXRpYyAlMjU1cyBfJTI1NXMiLCBhdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVOYW1lKTsKKworICAgICAgICAgICAgaWYobWF0Y2hlcyAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQXR0cmlidXRlcy5wdXNoX2JhY2soQXR0cmlidXRlKHBhcnNlVHlwZShhdHRyaWJ1dGVUeXBlKSwgYXR0cmlidXRlTmFtZSkpOworCisgICAgICAgICAgICBpbnB1dCA9IHN0cnN0cihpbnB1dCwgIjsiKSArIDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0ZyYWdtZW50U2hhZGVyOjpGcmFnbWVudFNoYWRlcihSZXNvdXJjZU1hbmFnZXIgKm1hbmFnZXIsIEdMdWludCBoYW5kbGUpIDogU2hhZGVyKG1hbmFnZXIsIGhhbmRsZSkKK3sKK30KKworRnJhZ21lbnRTaGFkZXI6On5GcmFnbWVudFNoYWRlcigpCit7Cit9CisKK0dMZW51bSBGcmFnbWVudFNoYWRlcjo6Z2V0VHlwZSgpCit7CisgICAgcmV0dXJuIEdMX0ZSQUdNRU5UX1NIQURFUjsKK30KKwordm9pZCBGcmFnbWVudFNoYWRlcjo6Y29tcGlsZSgpCit7CisgICAgY29tcGlsZVRvSExTTChtRnJhZ21lbnRDb21waWxlcik7CisgICAgcGFyc2VWYXJ5aW5ncygpOworICAgIHZhcnlpbmdzLnNvcnQoY29tcGFyZVZhcnlpbmcpOworfQorfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1NoYWRlci5oIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1NoYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNDc0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvU2hhZGVyLmgKQEAgLTAsMCArMSwxNTggQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIFNoYWRlci5oOiBEZWZpbmVzIHRoZSBhYnN0cmFjdCBTaGFkZXIgY2xhc3MgYW5kIGl0cyBjb25jcmV0ZSBkZXJpdmVkCisvLyBjbGFzc2VzIFZlcnRleFNoYWRlciBhbmQgRnJhZ21lbnRTaGFkZXIuIEltcGxlbWVudHMgR0wgc2hhZGVyIG9iamVjdHMgYW5kCisvLyByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuIFtPcGVuR0wgRVMgMi4wLjI0XSBzZWN0aW9uIDIuMTAgcGFnZSAyNCBhbmQgc2VjdGlvbgorLy8gMy44IHBhZ2UgODQuCisKKyNpZm5kZWYgTElCR0xFU1YyX1NIQURFUl9IXworI2RlZmluZSBMSUJHTEVTVjJfU0hBREVSX0hfCisKKyNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXIuaCIKKworI2RlZmluZSBHTF9BUElDQUxMCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8ZDNkeDkuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgZ2wKK3sKK3N0cnVjdCBWYXJ5aW5nCit7CisgICAgVmFyeWluZyhHTGVudW0gdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGludCBzaXplLCBib29sIGFycmF5KQorICAgICAgICA6IHR5cGUodHlwZSksIG5hbWUobmFtZSksIHNpemUoc2l6ZSksIGFycmF5KGFycmF5KSwgcmVnKC0xKSwgY29sKC0xKQorICAgIHsKKyAgICB9CisKKyAgICBHTGVudW0gdHlwZTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGludCBzaXplOyAgIC8vIE51bWJlciBvZiAndHlwZScgZWxlbWVudHMKKyAgICBib29sIGFycmF5OworCisgICAgaW50IHJlZzsgICAgLy8gRmlyc3QgdmFyeWluZyByZWdpc3RlciwgYXNzaWduZWQgZHVyaW5nIGxpbmsKKyAgICBpbnQgY29sOyAgICAvLyBGaXJzdCByZWdpc3RlciBlbGVtZW50LCBhc3NpZ25lZCBkdXJpbmcgbGluaworfTsKKwordHlwZWRlZiBzdGQ6Omxpc3Q8VmFyeWluZz4gVmFyeWluZ0xpc3Q7CisKK2NsYXNzIFNoYWRlcgoreworICAgIGZyaWVuZCBQcm9ncmFtOworCisgIHB1YmxpYzoKKyAgICBTaGFkZXIoUmVzb3VyY2VNYW5hZ2VyICptYW5hZ2VyLCBHTHVpbnQgaGFuZGxlKTsKKworICAgIHZpcnR1YWwgflNoYWRlcigpOworCisgICAgdmlydHVhbCBHTGVudW0gZ2V0VHlwZSgpID0gMDsKKyAgICBHTHVpbnQgZ2V0SGFuZGxlKCkgY29uc3Q7CisKKyAgICB2b2lkIGRlbGV0ZVNvdXJjZSgpOworICAgIHZvaWQgc2V0U291cmNlKEdMc2l6ZWkgY291bnQsIGNvbnN0IGNoYXIgKipzdHJpbmcsIGNvbnN0IEdMaW50ICpsZW5ndGgpOworICAgIGludCBnZXRJbmZvTG9nTGVuZ3RoKCkgY29uc3Q7CisgICAgdm9pZCBnZXRJbmZvTG9nKEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBjaGFyICppbmZvTG9nKTsKKyAgICBpbnQgZ2V0U291cmNlTGVuZ3RoKCkgY29uc3Q7CisgICAgdm9pZCBnZXRTb3VyY2UoR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIGNoYXIgKnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY29tcGlsZSgpID0gMDsKKyAgICBib29sIGlzQ29tcGlsZWQoKTsKKyAgICBjb25zdCBjaGFyICpnZXRITFNMKCk7CisKKyAgICB2b2lkIGFkZFJlZigpOworICAgIHZvaWQgcmVsZWFzZSgpOworICAgIHVuc2lnbmVkIGludCBnZXRSZWZDb3VudCgpIGNvbnN0OworICAgIGJvb2wgaXNGbGFnZ2VkRm9yRGVsZXRpb24oKSBjb25zdDsKKyAgICB2b2lkIGZsYWdGb3JEZWxldGlvbigpOworCisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUNvbXBpbGVyKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTaGFkZXIpOworCisgICAgdm9pZCBwYXJzZVZhcnlpbmdzKCk7CisKKyAgICB2b2lkIGNvbXBpbGVUb0hMU0wodm9pZCAqY29tcGlsZXIpOworCisgICAgc3RhdGljIEdMZW51bSBwYXJzZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGUpOworICAgIHN0YXRpYyBib29sIGNvbXBhcmVWYXJ5aW5nKGNvbnN0IFZhcnlpbmcgJngsIGNvbnN0IFZhcnlpbmcgJnkpOworCisgICAgY29uc3QgR0x1aW50IG1IYW5kbGU7CisgICAgdW5zaWduZWQgaW50IG1SZWZDb3VudDsgICAgIC8vIE51bWJlciBvZiBwcm9ncmFtIG9iamVjdHMgdGhpcyBzaGFkZXIgaXMgYXR0YWNoZWQgdG8KKyAgICBib29sIG1EZWxldGVTdGF0dXM7ICAgICAgICAgLy8gRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzaGFkZXIgY2FuIGJlIGRlbGV0ZWQgd2hlbiBubyBsb25nZXIgaW4gdXNlCisKKyAgICBjaGFyICptU291cmNlOworICAgIGNoYXIgKm1IbHNsOworICAgIGNoYXIgKm1JbmZvTG9nOworCisgICAgVmFyeWluZ0xpc3QgdmFyeWluZ3M7CisKKyAgICBib29sIG1Vc2VzRnJhZ0Nvb3JkOworICAgIGJvb2wgbVVzZXNGcm9udEZhY2luZzsKKyAgICBib29sIG1Vc2VzUG9pbnRTaXplOworICAgIGJvb2wgbVVzZXNQb2ludENvb3JkOworCisgICAgUmVzb3VyY2VNYW5hZ2VyICptUmVzb3VyY2VNYW5hZ2VyOworCisgICAgc3RhdGljIHZvaWQgKm1GcmFnbWVudENvbXBpbGVyOworICAgIHN0YXRpYyB2b2lkICptVmVydGV4Q29tcGlsZXI7Cit9OworCitzdHJ1Y3QgQXR0cmlidXRlCit7CisgICAgQXR0cmlidXRlKCkgOiB0eXBlKEdMX05PTkUpLCBuYW1lKCIiKQorICAgIHsKKyAgICB9CisKKyAgICBBdHRyaWJ1dGUoR0xlbnVtIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSA6IHR5cGUodHlwZSksIG5hbWUobmFtZSkKKyAgICB7CisgICAgfQorCisgICAgR0xlbnVtIHR5cGU7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBBdHRyaWJ1dGVBcnJheTsKKworY2xhc3MgVmVydGV4U2hhZGVyIDogcHVibGljIFNoYWRlcgoreworICAgIGZyaWVuZCBQcm9ncmFtOworCisgIHB1YmxpYzoKKyAgICBWZXJ0ZXhTaGFkZXIoUmVzb3VyY2VNYW5hZ2VyICptYW5hZ2VyLCBHTHVpbnQgaGFuZGxlKTsKKworICAgIH5WZXJ0ZXhTaGFkZXIoKTsKKworICAgIHZpcnR1YWwgR0xlbnVtIGdldFR5cGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tcGlsZSgpOworICAgIGludCBnZXRTZW1hbnRpY0luZGV4KGNvbnN0IHN0ZDo6c3RyaW5nICZhdHRyaWJ1dGVOYW1lKTsKKworICBwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihWZXJ0ZXhTaGFkZXIpOworCisgICAgdm9pZCBwYXJzZUF0dHJpYnV0ZXMoKTsKKworICAgIEF0dHJpYnV0ZUFycmF5IG1BdHRyaWJ1dGVzOworfTsKKworY2xhc3MgRnJhZ21lbnRTaGFkZXIgOiBwdWJsaWMgU2hhZGVyCit7CisgIHB1YmxpYzoKKyAgICBGcmFnbWVudFNoYWRlcihSZXNvdXJjZU1hbmFnZXIgKm1hbmFnZXIsIEdMdWludCBoYW5kbGUpOworCisgICAgfkZyYWdtZW50U2hhZGVyKCk7CisKKyAgICB2aXJ0dWFsIEdMZW51bSBnZXRUeXBlKCk7CisgICAgdmlydHVhbCB2b2lkIGNvbXBpbGUoKTsKKworICBwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGcmFnbWVudFNoYWRlcik7Cit9OworfQorCisjZW5kaWYgICAvLyBMSUJHTEVTVjJfU0hBREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvVGV4dHVyZS5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvVGV4dHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1NmFiNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9UZXh0dXJlLmNwcApAQCAtMCwwICsxLDE2NDkgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIFRleHR1cmUuY3BwOiBJbXBsZW1lbnRzIHRoZSBUZXh0dXJlIGNsYXNzIGFuZCBpdHMgZGVyaXZlZCBjbGFzc2VzCisvLyBUZXh0dXJlMkQgYW5kIFRleHR1cmVDdWJlTWFwLiBJbXBsZW1lbnRzIEdMIHRleHR1cmUgb2JqZWN0cyBhbmQgcmVsYXRlZAorLy8gZnVuY3Rpb25hbGl0eS4gW09wZW5HTCBFUyAyLjAuMjRdIHNlY3Rpb24gMy43IHBhZ2UgNjMuCisKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAibWF0aHV0aWwuaCIKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJGcmFtZWJ1ZmZlci5oIgorI2luY2x1ZGUgIkRldmljZS5ocHAiCisjaW5jbHVkZSAibGliRUdML0Rpc3BsYXkuaCIKKyNpbmNsdWRlICJjb21tb24vZGVidWcuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpbnRyaW4uaD4KKworbmFtZXNwYWNlIGdsCit7CisKK3N3OjpGb3JtYXQgSW1hZ2U6OnNlbGVjdEludGVybmFsRm9ybWF0KEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlKQoreworCSNpZiBTM1RDX1NVUFBPUlQKKyAgICBpZihmb3JtYXQgPT0gR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCB8fAorICAgICAgIGZvcm1hdCA9PSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdzo6Rk9STUFUX0RYVDE7CisgICAgfQorICAgIGVsc2UKKwkjZW5kaWYKKwlpZih0eXBlID09IEdMX0ZMT0FUKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN3OjpGT1JNQVRfQTMyQjMyRzMyUjMyRjsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09IEdMX0hBTEZfRkxPQVRfT0VTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN3OjpGT1JNQVRfQTE2QjE2RzE2UjE2RjsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpCisgICAgeworICAgICAgICBpZihmb3JtYXQgPT0gR0xfTFVNSU5BTkNFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3c6OkZPUk1BVF9MODsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGZvcm1hdCA9PSBHTF9MVU1JTkFOQ0VfQUxQSEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdzo6Rk9STUFUX0E4TDg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihmb3JtYXQgPT0gR0xfUkdCKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3c6OkZPUk1BVF9YOFI4RzhCODsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdzo6Rk9STUFUX0E4UjhHOEI4OworICAgIH0KKworICAgIHJldHVybiBzdzo6Rk9STUFUX0E4UjhHOEI4OworfQorCitUZXh0dXJlOjpUZXh0dXJlKEdMdWludCBpZCkgOiBSZWZDb3VudE9iamVjdChpZCkKK3sKKyAgICBtTWluRmlsdGVyID0gR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSOworICAgIG1NYWdGaWx0ZXIgPSBHTF9MSU5FQVI7CisgICAgbVdyYXBTID0gR0xfUkVQRUFUOworICAgIG1XcmFwVCA9IEdMX1JFUEVBVDsKKworCXJlc291cmNlID0gbmV3IHN3OjpSZXNvdXJjZSgwKTsKK30KKworVGV4dHVyZTo6flRleHR1cmUoKQoreworCXJlc291cmNlLT5kZXN0cnVjdCgpOworfQorCitzdzo6UmVzb3VyY2UgKlRleHR1cmU6OmdldFJlc291cmNlKCkgY29uc3QKK3sKKwlyZXR1cm4gcmVzb3VyY2U7Cit9CisKK2Jvb2wgVGV4dHVyZTo6aXNUZXh0dXJlMkQoKQoreworCXJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXh0dXJlOjppc1RleHR1cmVDdWJlTWFwKCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzZnVsIGZpbHRlciBzdGF0ZSB1cGRhdGUgKHZhbGlkIGVudW0gcGFyYW1ldGVyKQorYm9vbCBUZXh0dXJlOjpzZXRNaW5GaWx0ZXIoR0xlbnVtIGZpbHRlcikKK3sKKyAgICBzd2l0Y2goZmlsdGVyKQorICAgIHsKKyAgICBjYXNlIEdMX05FQVJFU1Q6CisgICAgY2FzZSBHTF9MSU5FQVI6CisgICAgY2FzZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUOgorICAgIGNhc2UgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUOgorICAgIGNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSOgorICAgIGNhc2UgR0xfTElORUFSX01JUE1BUF9MSU5FQVI6CisgICAgICAgIG1NaW5GaWx0ZXIgPSBmaWx0ZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzZnVsIGZpbHRlciBzdGF0ZSB1cGRhdGUgKHZhbGlkIGVudW0gcGFyYW1ldGVyKQorYm9vbCBUZXh0dXJlOjpzZXRNYWdGaWx0ZXIoR0xlbnVtIGZpbHRlcikKK3sKKyAgICBzd2l0Y2goZmlsdGVyKQorICAgIHsKKyAgICBjYXNlIEdMX05FQVJFU1Q6CisgICAgY2FzZSBHTF9MSU5FQVI6CisgICAgICAgIG1NYWdGaWx0ZXIgPSBmaWx0ZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzZnVsIHdyYXAgc3RhdGUgdXBkYXRlICh2YWxpZCBlbnVtIHBhcmFtZXRlcikKK2Jvb2wgVGV4dHVyZTo6c2V0V3JhcFMoR0xlbnVtIHdyYXApCit7CisgICAgc3dpdGNoKHdyYXApCisgICAgeworICAgIGNhc2UgR0xfUkVQRUFUOgorICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgbVdyYXBTID0gd3JhcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3NmdWwgd3JhcCBzdGF0ZSB1cGRhdGUgKHZhbGlkIGVudW0gcGFyYW1ldGVyKQorYm9vbCBUZXh0dXJlOjpzZXRXcmFwVChHTGVudW0gd3JhcCkKK3sKKyAgICBzd2l0Y2god3JhcCkKKyAgICB7CisgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgorICAgIGNhc2UgR0xfTUlSUk9SRURfUkVQRUFUOgorICAgICAgICAgbVdyYXBUID0gd3JhcDsKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK0dMZW51bSBUZXh0dXJlOjpnZXRNaW5GaWx0ZXIoKSBjb25zdAoreworICAgIHJldHVybiBtTWluRmlsdGVyOworfQorCitHTGVudW0gVGV4dHVyZTo6Z2V0TWFnRmlsdGVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbU1hZ0ZpbHRlcjsKK30KKworR0xlbnVtIFRleHR1cmU6OmdldFdyYXBTKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVdyYXBTOworfQorCitHTGVudW0gVGV4dHVyZTo6Z2V0V3JhcFQoKSBjb25zdAoreworICAgIHJldHVybiBtV3JhcFQ7Cit9CisKKy8vIFN0b3JlIHRoZSBwaXhlbCByZWN0YW5nbGUgZGVzaWduYXRlZCBieSB4b2Zmc2V0LHlvZmZzZXQsd2lkdGgsaGVpZ2h0IHdpdGggcGl4ZWxzIHN0b3JlZCBhcyBmb3JtYXQvdHlwZSBhdCBpbnB1dAorLy8gaW50byB0aGUgdGFyZ2V0IHBpeGVsIHJlY3RhbmdsZSBhdCBvdXRwdXQgd2l0aCBvdXRwdXRQaXRjaCBieXRlcyBpbiBiZXR3ZWVuIGVhY2ggbGluZS4KK3ZvaWQgVGV4dHVyZTo6bG9hZEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgdW5wYWNrQWxpZ25tZW50LCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQsIEltYWdlICppbWFnZSkgY29uc3QKK3sKKyAgICBHTHNpemVpIGlucHV0UGl0Y2ggPSAtQ29tcHV0ZVBpdGNoKHdpZHRoLCBmb3JtYXQsIHR5cGUsIHVucGFja0FsaWdubWVudCk7CisgICAgaW5wdXQgPSAoKGNoYXIqKWlucHV0KSAtIGlucHV0UGl0Y2ggKiAoaGVpZ2h0IC0gMSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgICAgICBzd2l0Y2ggKGZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfQUxQSEE6CisgICAgICAgICAgICBsb2FkQWxwaGFJbWFnZURhdGEoeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgaW5wdXRQaXRjaCwgaW5wdXQsIG91dHB1dFBpdGNoLCBvdXRwdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9MVU1JTkFOQ0U6CisgICAgICAgICAgICBsb2FkTHVtaW5hbmNlSW1hZ2VEYXRhKHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0UGl0Y2gsIGlucHV0LCBvdXRwdXRQaXRjaCwgb3V0cHV0LCBpbWFnZS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSA9PSBzdzo6Rk9STUFUX0w4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgorICAgICAgICAgICAgbG9hZEx1bWluYW5jZUFscGhhSW1hZ2VEYXRhKHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0UGl0Y2gsIGlucHV0LCBvdXRwdXRQaXRjaCwgb3V0cHV0LCBpbWFnZS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSA9PSBzdzo6Rk9STUFUX0E4TDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9SR0I6CisgICAgICAgICAgICBsb2FkUkdCVUJ5dGVJbWFnZURhdGEoeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgaW5wdXRQaXRjaCwgaW5wdXQsIG91dHB1dFBpdGNoLCBvdXRwdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9SR0JBOgorICAgICAgICAgICAgaWYoc3VwcG9ydHNTU0UyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9hZFJHQkFVQnl0ZUltYWdlRGF0YVNTRTIoeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgaW5wdXRQaXRjaCwgaW5wdXQsIG91dHB1dFBpdGNoLCBvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvYWRSR0JBVUJ5dGVJbWFnZURhdGEoeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgaW5wdXRQaXRjaCwgaW5wdXQsIG91dHB1dFBpdGNoLCBvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9CR1JBX0VYVDoKKyAgICAgICAgICAgIGxvYWRCR1JBSW1hZ2VEYXRhKHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0UGl0Y2gsIGlucHV0LCBvdXRwdXRQaXRjaCwgb3V0cHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OgorICAgICAgICBzd2l0Y2ggKGZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfUkdCOgorICAgICAgICAgICAgbG9hZFJHQjU2NUltYWdlRGF0YSh4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dFBpdGNoLCBpbnB1dCwgb3V0cHV0UGl0Y2gsIG91dHB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OgorICAgICAgICBzd2l0Y2ggKGZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfUkdCQToKKyAgICAgICAgICAgIGxvYWRSR0JBNDQ0NEltYWdlRGF0YSh4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dFBpdGNoLCBpbnB1dCwgb3V0cHV0UGl0Y2gsIG91dHB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOgorICAgICAgICBzd2l0Y2ggKGZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfUkdCQToKKyAgICAgICAgICAgIGxvYWRSR0JBNTU1MUltYWdlRGF0YSh4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dFBpdGNoLCBpbnB1dCwgb3V0cHV0UGl0Y2gsIG91dHB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBmbG9hdCB0ZXh0dXJlcyBhcmUgY29udmVydGVkIHRvIFJHQkEsIG5vdCBCR1JBCisgICAgICAgICAgY2FzZSBHTF9BTFBIQToKKyAgICAgICAgICAgIGxvYWRBbHBoYUZsb2F0SW1hZ2VEYXRhKHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0UGl0Y2gsIGlucHV0LCBvdXRwdXRQaXRjaCwgb3V0cHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xfTFVNSU5BTkNFOgorICAgICAgICAgICAgbG9hZEx1bWluYW5jZUZsb2F0SW1hZ2VEYXRhKHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0UGl0Y2gsIGlucHV0LCBvdXRwdXRQaXRjaCwgb3V0cHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgorICAgICAgICAgICAgbG9hZEx1bWluYW5jZUFscGhhRmxvYXRJbWFnZURhdGEoeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgaW5wdXRQaXRjaCwgaW5wdXQsIG91dHB1dFBpdGNoLCBvdXRwdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9SR0I6CisgICAgICAgICAgICBsb2FkUkdCRmxvYXRJbWFnZURhdGEoeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgaW5wdXRQaXRjaCwgaW5wdXQsIG91dHB1dFBpdGNoLCBvdXRwdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9SR0JBOgorICAgICAgICAgICAgbG9hZFJHQkFGbG9hdEltYWdlRGF0YSh4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dFBpdGNoLCBpbnB1dCwgb3V0cHV0UGl0Y2gsIG91dHB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9IQUxGX0ZMT0FUX09FUzoKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBmbG9hdCB0ZXh0dXJlcyBhcmUgY29udmVydGVkIHRvIFJHQkEsIG5vdCBCR1JBCisgICAgICAgICAgY2FzZSBHTF9BTFBIQToKKyAgICAgICAgICAgIGxvYWRBbHBoYUhhbGZGbG9hdEltYWdlRGF0YSh4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dFBpdGNoLCBpbnB1dCwgb3V0cHV0UGl0Y2gsIG91dHB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdMX0xVTUlOQU5DRToKKyAgICAgICAgICAgIGxvYWRMdW1pbmFuY2VIYWxmRmxvYXRJbWFnZURhdGEoeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgaW5wdXRQaXRjaCwgaW5wdXQsIG91dHB1dFBpdGNoLCBvdXRwdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9MVU1JTkFOQ0VfQUxQSEE6CisgICAgICAgICAgICBsb2FkTHVtaW5hbmNlQWxwaGFIYWxmRmxvYXRJbWFnZURhdGEoeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgaW5wdXRQaXRjaCwgaW5wdXQsIG91dHB1dFBpdGNoLCBvdXRwdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9SR0I6CisgICAgICAgICAgICBsb2FkUkdCSGFsZkZsb2F0SW1hZ2VEYXRhKHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0UGl0Y2gsIGlucHV0LCBvdXRwdXRQaXRjaCwgb3V0cHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xfUkdCQToKKyAgICAgICAgICAgIGxvYWRSR0JBSGFsZkZsb2F0SW1hZ2VEYXRhKHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0UGl0Y2gsIGlucHV0LCBvdXRwdXRQaXRjaCwgb3V0cHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpsb2FkQWxwaGFJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdAoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciAqZGVzdCA9IE5VTEw7CisgICAgCisgICAgZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgc291cmNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoOworICAgICAgICBkZXN0ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KG91dHB1dCkgKyAoeSArIHlvZmZzZXQpICogb3V0cHV0UGl0Y2ggKyB4b2Zmc2V0ICogNDsKKyAgICAgICAgZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAwXSA9IDA7CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMV0gPSAwOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDJdID0gMDsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAzXSA9IHNvdXJjZVt4XTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpsb2FkQWxwaGFGbG9hdEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3QKK3sKKyAgICBjb25zdCBmbG9hdCAqc291cmNlID0gTlVMTDsKKyAgICBmbG9hdCAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4ob3V0cHV0KSArICh5ICsgeW9mZnNldCkgKiBvdXRwdXRQaXRjaCAgKyB4b2Zmc2V0ICogMTYpOworICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gMDsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAxXSA9IDA7CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMl0gPSAwOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDNdID0gc291cmNlW3hdOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRleHR1cmU6OmxvYWRBbHBoYUhhbGZGbG9hdEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnNvdXJjZSA9IE5VTEw7CisgICAgdW5zaWduZWQgc2hvcnQgKmRlc3QgPSBOVUxMOworCisgICAgZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgc291cmNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBzaG9ydCo+KHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihpbnB1dCkgKyB5ICogaW5wdXRQaXRjaCk7CisgICAgICAgIGRlc3QgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIHNob3J0Kj4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KG91dHB1dCkgKyAoeSArIHlvZmZzZXQpICogb3V0cHV0UGl0Y2ggKyB4b2Zmc2V0ICogOCk7CisgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMF0gPSAwOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDFdID0gMDsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAyXSA9IDA7CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgM10gPSBzb3VyY2VbeF07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVGV4dHVyZTo6bG9hZEx1bWluYW5jZUltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0LCBib29sIG5hdGl2ZSkgY29uc3QKK3sKKyAgICBjb25zdCBpbnQgZGVzdEJ5dGVzUGVyUGl4ZWwgPSBuYXRpdmU/IDE6IDQ7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyICpkZXN0ID0gTlVMTDsKKworICAgIGZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIHNvdXJjZSA9IHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihpbnB1dCkgKyB5ICogaW5wdXRQaXRjaDsKKyAgICAgICAgZGVzdCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihvdXRwdXQpICsgKHkgKyB5b2Zmc2V0KSAqIG91dHB1dFBpdGNoICsgeG9mZnNldCAqIGRlc3RCeXRlc1BlclBpeGVsOworCisgICAgICAgIGlmKCFuYXRpdmUpICAgLy8gQkdSQTggZGVzdGluYXRpb24gZm9ybWF0CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlc3RbNCAqIHggKyAwXSA9IHNvdXJjZVt4XTsKKyAgICAgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMV0gPSBzb3VyY2VbeF07CisgICAgICAgICAgICAgICAgZGVzdFs0ICogeCArIDJdID0gc291cmNlW3hdOworICAgICAgICAgICAgICAgIGRlc3RbNCAqIHggKyAzXSA9IDB4RkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8vIEw4IGRlc3RpbmF0aW9uIGZvcm1hdAorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoZGVzdCwgc291cmNlLCB3aWR0aCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVGV4dHVyZTo6bG9hZEx1bWluYW5jZUZsb2F0SW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3QKK3sKKyAgICBjb25zdCBmbG9hdCAqc291cmNlID0gTlVMTDsKKyAgICBmbG9hdCAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4ob3V0cHV0KSArICh5ICsgeW9mZnNldCkgKiBvdXRwdXRQaXRjaCAgKyB4b2Zmc2V0ICogMTYpOworICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gc291cmNlW3hdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDFdID0gc291cmNlW3hdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDJdID0gc291cmNlW3hdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDNdID0gMS4wZjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpsb2FkTHVtaW5hbmNlSGFsZkZsb2F0SW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3QKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqc291cmNlID0gTlVMTDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4ob3V0cHV0KSArICh5ICsgeW9mZnNldCkgKiBvdXRwdXRQaXRjaCArIHhvZmZzZXQgKiA4KTsKKyAgICAgICAgZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAwXSA9IHNvdXJjZVt4XTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAxXSA9IHNvdXJjZVt4XTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAyXSA9IHNvdXJjZVt4XTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAzXSA9IDB4M0MwMDsgLy8gU0VFRUVFTU1NTU1NTU1NTSwgUyA9IDAsIEUgPSAxNSwgTSA9IDA6IDE2Yml0IGZscHQgcmVwcmVzZW50YXRpb24gb2YgMQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRleHR1cmU6OmxvYWRMdW1pbmFuY2VBbHBoYUltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQsIGJvb2wgbmF0aXZlKSBjb25zdAoreworICAgIGNvbnN0IGludCBkZXN0Qnl0ZXNQZXJQaXhlbCA9IG5hdGl2ZT8gMjogNDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgPSBOVUxMOworICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBOVUxMOworCisgICAgZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgc291cmNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoOworICAgICAgICBkZXN0ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KG91dHB1dCkgKyAoeSArIHlvZmZzZXQpICogb3V0cHV0UGl0Y2ggKyB4b2Zmc2V0ICogZGVzdEJ5dGVzUGVyUGl4ZWw7CisgICAgICAgIAorICAgICAgICBpZighbmF0aXZlKSAgIC8vIEJHUkE4IGRlc3RpbmF0aW9uIGZvcm1hdAorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMF0gPSBzb3VyY2VbMip4KzBdOworICAgICAgICAgICAgICAgIGRlc3RbNCAqIHggKyAxXSA9IHNvdXJjZVsyKngrMF07CisgICAgICAgICAgICAgICAgZGVzdFs0ICogeCArIDJdID0gc291cmNlWzIqeCswXTsKKyAgICAgICAgICAgICAgICBkZXN0WzQgKiB4ICsgM10gPSBzb3VyY2VbMip4KzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KGRlc3QsIHNvdXJjZSwgd2lkdGggKiAyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpsb2FkTHVtaW5hbmNlQWxwaGFGbG9hdEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3QKK3sKKyAgICBjb25zdCBmbG9hdCAqc291cmNlID0gTlVMTDsKKyAgICBmbG9hdCAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4ob3V0cHV0KSArICh5ICsgeW9mZnNldCkgKiBvdXRwdXRQaXRjaCAgKyB4b2Zmc2V0ICogMTYpOworICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gc291cmNlWzIqeCswXTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAxXSA9IHNvdXJjZVsyKngrMF07CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMl0gPSBzb3VyY2VbMip4KzBdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDNdID0gc291cmNlWzIqeCsxXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpsb2FkTHVtaW5hbmNlQWxwaGFIYWxmRmxvYXRJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdAoreworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpzb3VyY2UgPSBOVUxMOworICAgIHVuc2lnbmVkIHNob3J0ICpkZXN0ID0gTlVMTDsKKworICAgIGZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIHNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgc2hvcnQqPihzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oaW5wdXQpICsgeSAqIGlucHV0UGl0Y2gpOworICAgICAgICBkZXN0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBzaG9ydCo+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihvdXRwdXQpICsgKHkgKyB5b2Zmc2V0KSAqIG91dHB1dFBpdGNoICsgeG9mZnNldCAqIDgpOworICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gc291cmNlWzIqeCswXTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAxXSA9IHNvdXJjZVsyKngrMF07CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMl0gPSBzb3VyY2VbMip4KzBdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDNdID0gc291cmNlWzIqeCsxXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpsb2FkUkdCVUJ5dGVJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdAoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oaW5wdXQpICsgeSAqIGlucHV0UGl0Y2g7CisgICAgICAgIGRlc3QgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4ob3V0cHV0KSArICh5ICsgeW9mZnNldCkgKiBvdXRwdXRQaXRjaCArIHhvZmZzZXQgKiA0OworICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gc291cmNlW3ggKiAzICsgMl07CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMV0gPSBzb3VyY2VbeCAqIDMgKyAxXTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAyXSA9IHNvdXJjZVt4ICogMyArIDBdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDNdID0gMHhGRjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpsb2FkUkdCNTY1SW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnNvdXJjZSA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihvdXRwdXQpICsgKHkgKyB5b2Zmc2V0KSAqIG91dHB1dFBpdGNoICsgeG9mZnNldCAqIDQ7CisgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByZ2JhID0gc291cmNlW3hdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gKChyZ2JhICYgMHgwMDFGKSA8PCAzKSB8ICgocmdiYSAmIDB4MDAxRikgPj4gMik7CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMV0gPSAoKHJnYmEgJiAweDA3RTApID4+IDMpIHwgKChyZ2JhICYgMHgwN0UwKSA+PiA5KTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAyXSA9ICgocmdiYSAmIDB4RjgwMCkgPj4gOCkgfCAoKHJnYmEgJiAweEY4MDApID4+IDEzKTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAzXSA9IDB4RkY7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVGV4dHVyZTo6bG9hZFJHQkZsb2F0SW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3QKK3sKKyAgICBjb25zdCBmbG9hdCAqc291cmNlID0gTlVMTDsKKyAgICBmbG9hdCAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4ob3V0cHV0KSArICh5ICsgeW9mZnNldCkgKiBvdXRwdXRQaXRjaCAgKyB4b2Zmc2V0ICogMTYpOworICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gc291cmNlW3ggKiAzICsgMF07CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMV0gPSBzb3VyY2VbeCAqIDMgKyAxXTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAyXSA9IHNvdXJjZVt4ICogMyArIDJdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDNdID0gMS4wZjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpsb2FkUkdCSGFsZkZsb2F0SW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnNvdXJjZSA9IE5VTEw7CisgICAgdW5zaWduZWQgc2hvcnQgKmRlc3QgPSBOVUxMOworCisgICAgZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgc291cmNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBzaG9ydCo+KHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihpbnB1dCkgKyB5ICogaW5wdXRQaXRjaCk7CisgICAgICAgIGRlc3QgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIHNob3J0Kj4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KG91dHB1dCkgKyAoeSArIHlvZmZzZXQpICogb3V0cHV0UGl0Y2ggICsgeG9mZnNldCAqIDgpOworICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gc291cmNlW3ggKiAzICsgMF07CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMV0gPSBzb3VyY2VbeCAqIDMgKyAxXTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAyXSA9IHNvdXJjZVt4ICogMyArIDJdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDNdID0gMHgzQzAwOyAvLyBTRUVFRUVNTU1NTU1NTU1NLCBTID0gMCwgRSA9IDE1LCBNID0gMDogMTZiaXQgZmxwdCByZXByZXNlbnRhdGlvbiBvZiAxCisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVGV4dHVyZTo6bG9hZFJHQkFVQnl0ZUltYWdlRGF0YVNTRTIoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgaW50ICpzb3VyY2UgPSBOVUxMOworICAgIHVuc2lnbmVkIGludCAqZGVzdCA9IE5VTEw7CisgICAgX19tMTI4aSBick1hc2sgPSBfbW1fc2V0MV9lcGkzMigweDAwZmYwMGZmKTsKKworICAgIGZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIHNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgaW50Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50Kj4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KG91dHB1dCkgKyAoeSArIHlvZmZzZXQpICogb3V0cHV0UGl0Y2ggKyB4b2Zmc2V0ICogNCk7CisgICAgICAgIGludCB4ID0gMDsKKworICAgICAgICAvLyBNYWtlIG91dHB1dCB3cml0ZXMgYWxpZ25lZAorICAgICAgICBmb3IoeCA9IDA7ICgocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJmRlc3RbeF0pICYgMTUpICE9IDApICYmIHggPCB3aWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmdiYSA9IHNvdXJjZVt4XTsKKyAgICAgICAgICAgIGRlc3RbeF0gPSAoX3JvdGwocmdiYSwgMTYpICYgMHgwMGZmMDBmZikgfCAocmdiYSAmIDB4ZmYwMGZmMDApOworICAgICAgICB9CisKKyAgICAgICAgZm9yKDsgeCArIDMgPCB3aWR0aDsgeCArPSA0KQorICAgICAgICB7CisgICAgICAgICAgICBfX20xMjhpIHNvdXJjZURhdGEgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpKj4oJnNvdXJjZVt4XSkpOworICAgICAgICAgICAgLy8gTWFzayBvdXQgZyBhbmQgYSwgd2hpY2ggZG9uJ3QgY2hhbmdlCisgICAgICAgICAgICBfX20xMjhpIGdhQ29tcG9uZW50cyA9IF9tbV9hbmRub3Rfc2kxMjgoYnJNYXNrLCBzb3VyY2VEYXRhKTsKKyAgICAgICAgICAgIC8vIE1hc2sgb3V0IGIgYW5kIHIKKyAgICAgICAgICAgIF9fbTEyOGkgYnJDb21wb25lbnRzID0gX21tX2FuZF9zaTEyOChzb3VyY2VEYXRhLCBick1hc2spOworICAgICAgICAgICAgLy8gU3dhcCBiIGFuZCByCisgICAgICAgICAgICBfX20xMjhpIGJyU3dhcHBlZCA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoX21tX3NodWZmbGVsb19lcGkxNihickNvbXBvbmVudHMsIF9NTV9TSFVGRkxFKDIsIDMsIDAsIDEpKSwgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOworICAgICAgICAgICAgX19tMTI4aSByZXN1bHQgPSBfbW1fb3Jfc2kxMjgoZ2FDb21wb25lbnRzLCBiclN3YXBwZWQpOworICAgICAgICAgICAgX21tX3N0b3JlX3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8X19tMTI4aSo+KCZkZXN0W3hdKSwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gbGVmdG92ZXIgd3JpdGVzCisgICAgICAgIGZvcig7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmdiYSA9IHNvdXJjZVt4XTsKKyAgICAgICAgICAgIGRlc3RbeF0gPSAoX3JvdGwocmdiYSwgMTYpICYgMHgwMGZmMDBmZikgfCAocmdiYSAmIDB4ZmYwMGZmMDApOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRleHR1cmU6OmxvYWRSR0JBVUJ5dGVJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3QKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgKnNvdXJjZSA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50ICpkZXN0ID0gTlVMTDsKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGludCo+KHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihpbnB1dCkgKyB5ICogaW5wdXRQaXRjaCk7CisgICAgICAgIGRlc3QgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCo+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihvdXRwdXQpICsgKHkgKyB5b2Zmc2V0KSAqIG91dHB1dFBpdGNoICsgeG9mZnNldCAqIDQpOworCisgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmdiYSA9IHNvdXJjZVt4XTsKKyAgICAgICAgICAgIGRlc3RbeF0gPSAoX3JvdGwocmdiYSwgMTYpICYgMHgwMGZmMDBmZikgfCAocmdiYSAmIDB4ZmYwMGZmMDApOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRleHR1cmU6OmxvYWRSR0JBNDQ0NEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnNvdXJjZSA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihvdXRwdXQpICsgKHkgKyB5b2Zmc2V0KSAqIG91dHB1dFBpdGNoICsgeG9mZnNldCAqIDQ7CisgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByZ2JhID0gc291cmNlW3hdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gKChyZ2JhICYgMHgwMEYwKSA8PCAwKSB8ICgocmdiYSAmIDB4MDBGMCkgPj4gNCk7CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMV0gPSAoKHJnYmEgJiAweDBGMDApID4+IDQpIHwgKChyZ2JhICYgMHgwRjAwKSA+PiA4KTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAyXSA9ICgocmdiYSAmIDB4RjAwMCkgPj4gOCkgfCAoKHJnYmEgJiAweEYwMDApID4+IDEyKTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAzXSA9ICgocmdiYSAmIDB4MDAwRikgPDwgNCkgfCAoKHJnYmEgJiAweDAwMEYpID4+IDApOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRleHR1cmU6OmxvYWRSR0JBNTU1MUltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnNvdXJjZSA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihvdXRwdXQpICsgKHkgKyB5b2Zmc2V0KSAqIG91dHB1dFBpdGNoICsgeG9mZnNldCAqIDQ7CisgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByZ2JhID0gc291cmNlW3hdOworICAgICAgICAgICAgZGVzdFs0ICogeCArIDBdID0gKChyZ2JhICYgMHgwMDNFKSA8PCAyKSB8ICgocmdiYSAmIDB4MDAzRSkgPj4gMyk7CisgICAgICAgICAgICBkZXN0WzQgKiB4ICsgMV0gPSAoKHJnYmEgJiAweDA3QzApID4+IDMpIHwgKChyZ2JhICYgMHgwN0MwKSA+PiA4KTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAyXSA9ICgocmdiYSAmIDB4RjgwMCkgPj4gOCkgfCAoKHJnYmEgJiAweEY4MDApID4+IDEzKTsKKyAgICAgICAgICAgIGRlc3RbNCAqIHggKyAzXSA9IChyZ2JhICYgMHgwMDAxKSA/IDB4RkYgOiAwOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRleHR1cmU6OmxvYWRSR0JBRmxvYXRJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3QKK3sKKyAgICBjb25zdCBmbG9hdCAqc291cmNlID0gTlVMTDsKKyAgICBmbG9hdCAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoKTsKKyAgICAgICAgZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4ob3V0cHV0KSArICh5ICsgeW9mZnNldCkgKiBvdXRwdXRQaXRjaCAgKyB4b2Zmc2V0ICogMTYpOworICAgICAgICBtZW1jcHkoZGVzdCwgc291cmNlLCB3aWR0aCAqIDE2KTsKKyAgICB9Cit9CisKK3ZvaWQgVGV4dHVyZTo6bG9hZFJHQkFIYWxmRmxvYXRJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3QKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UgPSBOVUxMOworICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBOVUxMOworCisgICAgZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgc291cmNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0KSArIHkgKiBpbnB1dFBpdGNoOworICAgICAgICBkZXN0ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KG91dHB1dCkgKyAoeSArIHlvZmZzZXQpICogb3V0cHV0UGl0Y2ggICsgeG9mZnNldCAqIDg7CisgICAgICAgIG1lbWNweShkZXN0LCBzb3VyY2UsIHdpZHRoICogOCk7CisgICAgfQorfQorCit2b2lkIFRleHR1cmU6OmxvYWRCR1JBSW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdAoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciAqZGVzdCA9IE5VTEw7CisKKyAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBzb3VyY2UgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oaW5wdXQpICsgeSAqIGlucHV0UGl0Y2g7CisgICAgICAgIGRlc3QgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4ob3V0cHV0KSArICh5ICsgeW9mZnNldCkgKiBvdXRwdXRQaXRjaCArIHhvZmZzZXQgKiA0OworICAgICAgICBtZW1jcHkoZGVzdCwgc291cmNlLCB3aWR0aCo0KTsKKyAgICB9Cit9CisKK3ZvaWQgVGV4dHVyZTo6bG9hZENvbXByZXNzZWRJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0Cit7CisgICAgQVNTRVJUKHhvZmZzZXQgJSA0ID09IDApOworICAgIEFTU0VSVCh5b2Zmc2V0ICUgNCA9PSAwKTsKKyAgICBBU1NFUlQod2lkdGggJSA0ID09IDAgfHwgd2lkdGggPT0gMiB8fCB3aWR0aCA9PSAxKTsKKyAgICBBU1NFUlQoaW5wdXRQaXRjaCAlIDggPT0gMCk7CisgICAgQVNTRVJUKG91dHB1dFBpdGNoICUgOCA9PSAwKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGludCAqc291cmNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBpbnQqPihpbnB1dCk7CisgICAgdW5zaWduZWQgaW50ICpkZXN0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQqPihvdXRwdXQpOworCisgICAgc3dpdGNoIChoZWlnaHQpCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvLyBSb3VuZCB3aWR0aCB1cCBpbiBjYXNlIGl0IGlzIDEuCisgICAgICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyB4ICs9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgMzItYml0cyBpcyB0d28gUkdCNTY1IGNvbG9ycyBzaGFyZWQgYnkgdGlsZSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBtb2RpZmllZC4KKyAgICAgICAgICAgICAgICBkZXN0W3hdID0gc291cmNlW3hdOworCisgICAgICAgICAgICAgICAgLy8gU2Vjb25kIDMyLWJpdHMgY29udGFpbnMgNCByb3dzIG9mIDQgMi1iaXQgaW50ZXJwb2xhbnRzIGJldHdlZW4gdGhlIGNvbG9ycywgdGhlIGxhc3QgMyByb3dzIGJlaW5nIHVudXNlZC4gTm8gZmxpcHBpbmcgc2hvdWxkIG9jY3VyLgorICAgICAgICAgICAgICAgIGRlc3RbeCArIDFdID0gc291cmNlW3ggKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAvLyBSb3VuZCB3aWR0aCB1cCBpbiBjYXNlIGl0IGlzIDEuCisgICAgICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyB4ICs9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgMzItYml0cyBpcyB0d28gUkdCNTY1IGNvbG9ycyBzaGFyZWQgYnkgdGlsZSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBtb2RpZmllZC4KKyAgICAgICAgICAgICAgICBkZXN0W3hdID0gc291cmNlW3hdOworCisgICAgICAgICAgICAgICAgLy8gU2Vjb25kIDMyLWJpdHMgY29udGFpbnMgNCByb3dzIG9mIDQgMi1iaXQgaW50ZXJwb2xhbnRzIGJldHdlZW4gdGhlIGNvbG9ycywgdGhlIGxhc3QgMiByb3dzIGJlaW5nIHVudXNlZC4gT25seSB0aGUgdG9wIDIgcm93cyBzaG91bGQgYmUgZmxpcHBlZC4KKyAgICAgICAgICAgICAgICBkZXN0W3ggKyAxXSA9ICgoc291cmNlW3ggKyAxXSA8PCA4KSAmIDB4MDAwMEZGMDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc291cmNlW3ggKyAxXSA+PiA4KSAmIDB4MDAwMDAwRkYpOyAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUKGhlaWdodCAlIDQgPT0gMCk7CisgICAgICAgICAgICBmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0IC8gNDsgKyt5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqc291cmNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBpbnQqPihzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oaW5wdXQpICsgeSAqIGlucHV0UGl0Y2gpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50Kj4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KG91dHB1dCkgKyAoeSArIHlvZmZzZXQpICogb3V0cHV0UGl0Y2ggKyB4b2Zmc2V0ICogOCk7CisKKyAgICAgICAgICAgICAgICAvLyBSb3VuZCB3aWR0aCB1cCBpbiBjYXNlIGl0IGlzIDEuCisgICAgICAgICAgICAgICAgZm9yKGludCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgeCArPSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgMzItYml0cyBpcyB0d28gUkdCNTY1IGNvbG9ycyBzaGFyZWQgYnkgdGlsZSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBtb2RpZmllZC4KKyAgICAgICAgICAgICAgICAgICAgZGVzdFt4XSA9IHNvdXJjZVt4XTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQgMzItYml0cyBjb250YWlucyA0IHJvd3Mgb2YgNCAyLWJpdCBpbnRlcnBvbGFudHMgYmV0d2VlbiB0aGUgY29sb3JzLiBBbGwgcm93cyBzaG91bGQgYmUgZmxpcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgZGVzdFt4ICsgMV0gPSAoc291cmNlW3ggKyAxXSA+PiAyNCkgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNvdXJjZVt4ICsgMV0gPDwgOCkgJiAweDAwRkYwMDAwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzb3VyY2VbeCArIDFdID4+IDgpICYgMHgwMDAwRkYwMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2VbeCArIDFdIDw8IDI0KTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpzZXRJbWFnZShHTGludCB1bnBhY2tBbGlnbm1lbnQsIGNvbnN0IHZvaWQgKnBpeGVscywgSW1hZ2UgKmltYWdlKQoreworICAgIGlmKHBpeGVscyAmJiBpbWFnZSkKKyAgICB7CisgICAgICAgIHZvaWQgKmJ1ZmZlciA9IGltYWdlLT5sb2NrKDAsIDAsIHN3OjpMT0NLX1dSSVRFT05MWSk7CisKKyAgICAgICAgaWYoYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBsb2FkSW1hZ2VEYXRhKDAsIDAsIGltYWdlLT5nZXRXaWR0aCgpLCBpbWFnZS0+Z2V0SGVpZ2h0KCksIGltYWdlLT5nZXRGb3JtYXQoKSwgaW1hZ2UtPmdldFR5cGUoKSwgdW5wYWNrQWxpZ25tZW50LCBwaXhlbHMsIGltYWdlLT5nZXRQaXRjaCgpLCBidWZmZXIsIGltYWdlKTsKKyAgICAgICAgICAgIGltYWdlLT51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpzZXRDb21wcmVzc2VkSW1hZ2UoR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKnBpeGVscywgSW1hZ2UgKmltYWdlKQoreworICAgIGlmKHBpeGVscyAmJiBpbWFnZSkKKyAgICB7CisJCXZvaWQgKmJ1ZmZlciA9IGltYWdlLT5sb2NrKDAsIDAsIHN3OjpMT0NLX1dSSVRFT05MWSk7CisKKyAgICAgICAgaWYoYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCA9IENvbXB1dGVDb21wcmVzc2VkUGl0Y2goaW1hZ2UtPmdldFdpZHRoKCksIGltYWdlLT5nZXRGb3JtYXQoKSk7CisgICAgICAgICAgICBpbnQgaW5wdXRTaXplID0gQ29tcHV0ZUNvbXByZXNzZWRTaXplKGltYWdlLT5nZXRXaWR0aCgpLCBpbWFnZS0+Z2V0SGVpZ2h0KCksIGltYWdlLT5nZXRGb3JtYXQoKSk7CisgICAgICAgICAgICBsb2FkQ29tcHJlc3NlZEltYWdlRGF0YSgwLCAwLCBpbWFnZS0+Z2V0V2lkdGgoKSwgaW1hZ2UtPmdldEhlaWdodCgpLCAtaW5wdXRQaXRjaCwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHBpeGVscykgKyBpbnB1dFNpemUgLSBpbnB1dFBpdGNoLCBpbWFnZS0+Z2V0UGl0Y2goKSwgYnVmZmVyKTsKKyAgICAgICAgICAgIGltYWdlLT51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpzdWJJbWFnZShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMaW50IHVucGFja0FsaWdubWVudCwgY29uc3Qgdm9pZCAqcGl4ZWxzLCBJbWFnZSAqaW1hZ2UpCit7CisJaWYoIWltYWdlKQorCXsKKwkJcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKwl9CisKKyAgICBpZih3aWR0aCArIHhvZmZzZXQgPiBpbWFnZS0+Z2V0V2lkdGgoKSB8fCBoZWlnaHQgKyB5b2Zmc2V0ID4gaW1hZ2UtPmdldEhlaWdodCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgIH0KKworICAgIGlmKElzQ29tcHJlc3NlZChpbWFnZS0+Z2V0Rm9ybWF0KCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisKKyAgICBpZihmb3JtYXQgIT0gaW1hZ2UtPmdldEZvcm1hdCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisKKyAgICBpZihwaXhlbHMpCisgICAgeworCQl2b2lkICpidWZmZXIgPSBpbWFnZS0+bG9jaygwLCAwLCBzdzo6TE9DS19XUklURU9OTFkpOworICAgICAgICBsb2FkSW1hZ2VEYXRhKHhvZmZzZXQsIHRyYW5zZm9ybVBpeGVsWU9mZnNldCh5b2Zmc2V0LCBoZWlnaHQsIGltYWdlLT5nZXRIZWlnaHQoKSksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgdW5wYWNrQWxpZ25tZW50LCBwaXhlbHMsIGltYWdlLT5nZXRQaXRjaCgpLCBidWZmZXIsIGltYWdlKTsKKwkJaW1hZ2UtPnVubG9jaygpOworICAgIH0KK30KKwordm9pZCBUZXh0dXJlOjpzdWJJbWFnZUNvbXByZXNzZWQoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCB2b2lkICpwaXhlbHMsIEltYWdlICppbWFnZSkKK3sKKwlpZighaW1hZ2UpCisJeworCQlyZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCX0KKworICAgIGlmKHdpZHRoICsgeG9mZnNldCA+IGltYWdlLT5nZXRXaWR0aCgpIHx8IGhlaWdodCArIHlvZmZzZXQgPiBpbWFnZS0+Z2V0SGVpZ2h0KCkpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgfQorCisgICAgaWYoZm9ybWF0ICE9IGltYWdlLT5nZXRGb3JtYXQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgfQorCisgICAgaWYocGl4ZWxzKQorICAgIHsKKyAgICAgICAgdm9pZCAqYnVmZmVyID0gaW1hZ2UtPmxvY2soeG9mZnNldCwgeW9mZnNldCwgc3c6OkxPQ0tfV1JJVEVPTkxZKTsKKyAgICAgICAgaW50IGlucHV0UGl0Y2ggPSBDb21wdXRlQ29tcHJlc3NlZFBpdGNoKHdpZHRoLCBmb3JtYXQpOworICAgICAgICBpbnQgaW5wdXRTaXplID0gQ29tcHV0ZUNvbXByZXNzZWRTaXplKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgICAgIGxvYWRDb21wcmVzc2VkSW1hZ2VEYXRhKHhvZmZzZXQsIHRyYW5zZm9ybVBpeGVsWU9mZnNldCh5b2Zmc2V0LCBoZWlnaHQsIGltYWdlLT5nZXRIZWlnaHQoKSksIHdpZHRoLCBoZWlnaHQsIC1pbnB1dFBpdGNoLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4ocGl4ZWxzKSArIGlucHV0U2l6ZSAtIGlucHV0UGl0Y2gsIGltYWdlLT5nZXRQaXRjaCgpLCBidWZmZXIpOworICAgICAgICBpbWFnZS0+dW5sb2NrKCk7CisgICAgfQorfQorCitib29sIFRleHR1cmU6OmNvcHkoSW1hZ2UgKnNvdXJjZSwgY29uc3Qgc3c6OlJlY3QgJnNvdXJjZVJlY3QsIEdMZW51bSBkZXN0Rm9ybWF0LCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBJbWFnZSAqZGVzdCkKK3sKKyAgICBEZXZpY2UgKmRldmljZSA9IGdldERldmljZSgpOworCQorICAgIHN3OjpSZWN0IGRlc3RSZWN0ID0ge3hvZmZzZXQsIHlvZmZzZXQsIHhvZmZzZXQgKyAoc291cmNlUmVjdC5yaWdodCAtIHNvdXJjZVJlY3QubGVmdCksIHlvZmZzZXQgKyAoc291cmNlUmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LnRvcCl9OworICAgIGJvb2wgc3VjY2VzcyA9IGRldmljZS0+c3RyZXRjaFJlY3Qoc291cmNlLCAmc291cmNlUmVjdCwgZGVzdCwgJmRlc3RSZWN0LCBmYWxzZSk7CisKKyAgICBpZighc3VjY2VzcykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZLCBmYWxzZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1RleHR1cmUyRDo6VGV4dHVyZTJEKEdMdWludCBpZCkgOiBUZXh0dXJlKGlkKQoreworCWZvcihpbnQgaSA9IDA7IGkgPCBNSVBNQVBfTEVWRUxTOyBpKyspCisJeworCQlpbWFnZVtpXSA9IDA7CisJfQorCisgICAgbVN1cmZhY2UgPSBOVUxMOworfQorCitUZXh0dXJlMkQ6On5UZXh0dXJlMkQoKQoreworCXJlc291cmNlLT5sb2NrKHN3OjpERVNUUlVDVCk7CisKKwlmb3IoaW50IGkgPSAwOyBpIDwgTUlQTUFQX0xFVkVMUzsgaSsrKQorCXsKKwkJaWYoaW1hZ2VbaV0pCisJCXsKKwkJCWltYWdlW2ldLT51bmJpbmQoKTsKKwkJCWltYWdlW2ldID0gMDsKKwkJfQorCX0KKworCXJlc291cmNlLT51bmxvY2soKTsKKworICAgIG1Db2xvcmJ1ZmZlclByb3h5LnNldChOVUxMKTsKKworICAgIGlmKG1TdXJmYWNlKQorICAgIHsKKyAgICAgICAgbVN1cmZhY2UtPnNldEJvdW5kVGV4dHVyZShOVUxMKTsKKyAgICAgICAgbVN1cmZhY2UgPSBOVUxMOworICAgIH0KK30KKworYm9vbCBUZXh0dXJlMkQ6OmlzVGV4dHVyZTJEKCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworR0xlbnVtIFRleHR1cmUyRDo6Z2V0VGFyZ2V0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gR0xfVEVYVFVSRV8yRDsKK30KKworR0xzaXplaSBUZXh0dXJlMkQ6OmdldFdpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaW1hZ2VbMF0gPyBpbWFnZVswXS0+Z2V0V2lkdGgoKSA6IDA7Cit9CisKK0dMc2l6ZWkgVGV4dHVyZTJEOjpnZXRIZWlnaHQoKSBjb25zdAoreworICAgIHJldHVybiBpbWFnZVswXSA/IGltYWdlWzBdLT5nZXRIZWlnaHQoKSA6IDA7Cit9CisKK0dMZW51bSBUZXh0dXJlMkQ6OmdldEZvcm1hdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGltYWdlWzBdID8gaW1hZ2VbMF0tPmdldEZvcm1hdCgpIDogMDsKK30KKworR0xlbnVtIFRleHR1cmUyRDo6Z2V0VHlwZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGltYWdlWzBdID8gaW1hZ2VbMF0tPmdldFR5cGUoKSA6IDA7Cit9CisKK3N3OjpGb3JtYXQgVGV4dHVyZTJEOjpnZXRJbnRlcm5hbEZvcm1hdCgpIGNvbnN0Cit7CisJcmV0dXJuIGltYWdlWzBdID8gaW1hZ2VbMF0tPmdldEludGVybmFsRm9ybWF0KCkgOiBzdzo6Rk9STUFUX05VTEw7Cit9CisKK2ludCBUZXh0dXJlMkQ6OmdldExldmVsQ291bnQoKSBjb25zdAoreworCWludCBsZXZlbHMgPSAwOworCisJd2hpbGUobGV2ZWxzIDwgTUlQTUFQX0xFVkVMUyAmJiBpbWFnZVtsZXZlbHNdKQorCXsKKwkJbGV2ZWxzKys7CisJfQorCisJcmV0dXJuIGxldmVsczsKK30KKwordm9pZCBUZXh0dXJlMkQ6OnNldEltYWdlKEdMaW50IGxldmVsLCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMaW50IHVucGFja0FsaWdubWVudCwgY29uc3Qgdm9pZCAqcGl4ZWxzKQoreworCWlmKGltYWdlW2xldmVsXSkKKwl7CisJCWltYWdlW2xldmVsXS0+dW5iaW5kKCk7CisJfQorCisJaW1hZ2VbbGV2ZWxdID0gbmV3IEltYWdlKGdldFJlc291cmNlKCksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSk7CisKKwlpZighaW1hZ2VbbGV2ZWxdKQorCXsKKwkJcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworCX0KKworCWltYWdlW2xldmVsXS0+YmluZCgpOworCisgICAgVGV4dHVyZTo6c2V0SW1hZ2UodW5wYWNrQWxpZ25tZW50LCBwaXhlbHMsIGltYWdlW2xldmVsXSk7Cit9CisKK3ZvaWQgVGV4dHVyZTJEOjpiaW5kVGV4SW1hZ2UoZWdsOjpTdXJmYWNlICpzdXJmYWNlKQoreworICAgIEdMZW51bSBmb3JtYXQ7CisKKyAgICBzd2l0Y2goc3VyZmFjZS0+Z2V0SW50ZXJuYWxGb3JtYXQoKSkKKyAgICB7CisgICAgY2FzZSBzdzo6Rk9STUFUX0E4UjhHOEI4OgorICAgICAgICBmb3JtYXQgPSBHTF9SR0JBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHN3OjpGT1JNQVRfWDhSOEc4Qjg6CisgICAgICAgIGZvcm1hdCA9IEdMX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgVU5JTVBMRU1FTlRFRCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisJZm9yKGludCBsZXZlbCA9IDA7IGxldmVsIDwgTUlQTUFQX0xFVkVMUzsgbGV2ZWwrKykKKwl7CisJCWlmKGltYWdlW2xldmVsXSkKKwkJeworCQkJaW1hZ2VbbGV2ZWxdLT51bmJpbmQoKTsKKwkJCWltYWdlW2xldmVsXSA9IDA7CisJCX0KKwl9CisKKwlpbWFnZVswXSA9IHN1cmZhY2UtPmdldFJlbmRlclRhcmdldCgpOworCWltYWdlWzBdLT5iaW5kKCk7CisKKyAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgbVN1cmZhY2UtPnNldEJvdW5kVGV4dHVyZSh0aGlzKTsKK30KKwordm9pZCBUZXh0dXJlMkQ6OnJlbGVhc2VUZXhJbWFnZSgpCit7CisgICAgZm9yKGludCBsZXZlbCA9IDA7IGxldmVsIDwgTUlQTUFQX0xFVkVMUzsgbGV2ZWwrKykKKwl7CisJCWlmKGltYWdlW2xldmVsXSkKKwkJeworCQkJaW1hZ2VbbGV2ZWxdLT51bmJpbmQoKTsKKwkJCWltYWdlW2xldmVsXSA9IDA7CisJCX0KKwl9Cit9CisKK3ZvaWQgVGV4dHVyZTJEOjpzZXRDb21wcmVzc2VkSW1hZ2UoR0xpbnQgbGV2ZWwsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqcGl4ZWxzKQoreworICAgIFRleHR1cmU6OnNldENvbXByZXNzZWRJbWFnZShpbWFnZVNpemUsIHBpeGVscywgaW1hZ2VbbGV2ZWxdKTsKK30KKwordm9pZCBUZXh0dXJlMkQ6OnN1YkltYWdlKEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMaW50IHVucGFja0FsaWdubWVudCwgY29uc3Qgdm9pZCAqcGl4ZWxzKQoreworCVRleHR1cmU6OnN1YkltYWdlKHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgdW5wYWNrQWxpZ25tZW50LCBwaXhlbHMsIGltYWdlW2xldmVsXSk7Cit9CisKK3ZvaWQgVGV4dHVyZTJEOjpzdWJJbWFnZUNvbXByZXNzZWQoR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqcGl4ZWxzKQoreworICAgIFRleHR1cmU6OnN1YkltYWdlQ29tcHJlc3NlZCh4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGltYWdlU2l6ZSwgcGl4ZWxzLCBpbWFnZVtsZXZlbF0pOworfQorCit2b2lkIFRleHR1cmUyRDo6Y29weUltYWdlKEdMaW50IGxldmVsLCBHTGVudW0gZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgRnJhbWVidWZmZXIgKnNvdXJjZSkKK3sKKyAgICBJbWFnZSAqcmVuZGVyVGFyZ2V0ID0gc291cmNlLT5nZXRSZW5kZXJUYXJnZXQoKTsKKworICAgIGlmKCFyZW5kZXJUYXJnZXQpCisgICAgeworICAgICAgICBFUlIoIkZhaWxlZCB0byByZXRyaWV2ZSB0aGUgcmVuZGVyIHRhcmdldC4iKTsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KKworCWlmKGltYWdlW2xldmVsXSkKKwl7CisJCWltYWdlW2xldmVsXS0+dW5iaW5kKCk7CisJfQorCisJaW1hZ2VbbGV2ZWxdID0gbmV3IEltYWdlKGdldFJlc291cmNlKCksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgR0xfVU5TSUdORURfQllURSk7CisKKwlpZighaW1hZ2VbbGV2ZWxdKQorCXsKKwkJcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworCX0KKworCWltYWdlW2xldmVsXS0+YmluZCgpOworCisgICAgaWYod2lkdGggIT0gMCAmJiBoZWlnaHQgIT0gMCkKKyAgICB7CisgICAgICAgIHN3OjpSZWN0IHNvdXJjZVJlY3QgPSB0cmFuc2Zvcm1QaXhlbFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCwgc291cmNlLT5nZXRDb2xvcmJ1ZmZlcigpLT5nZXRIZWlnaHQoKSk7CisgICAgICAgIHNvdXJjZVJlY3QubGVmdCA9IGNsYW1wKHNvdXJjZVJlY3QubGVmdCwgMCwgc291cmNlLT5nZXRDb2xvcmJ1ZmZlcigpLT5nZXRXaWR0aCgpKTsKKyAgICAgICAgc291cmNlUmVjdC50b3AgPSBjbGFtcChzb3VyY2VSZWN0LnRvcCwgMCwgc291cmNlLT5nZXRDb2xvcmJ1ZmZlcigpLT5nZXRIZWlnaHQoKSk7CisgICAgICAgIHNvdXJjZVJlY3QucmlnaHQgPSBjbGFtcChzb3VyY2VSZWN0LnJpZ2h0LCAwLCBzb3VyY2UtPmdldENvbG9yYnVmZmVyKCktPmdldFdpZHRoKCkpOworICAgICAgICBzb3VyY2VSZWN0LmJvdHRvbSA9IGNsYW1wKHNvdXJjZVJlY3QuYm90dG9tLCAwLCBzb3VyY2UtPmdldENvbG9yYnVmZmVyKCktPmdldEhlaWdodCgpKTsKKworICAgICAgICBHTGludCBkZXN0WU9mZnNldCA9IHRyYW5zZm9ybVBpeGVsWU9mZnNldCgwLCBoZWlnaHQsIGltYWdlW2xldmVsXS0+Z2V0SGVpZ2h0KCkpOworICAgICAgICAKKyAgICAgICAgY29weShzb3VyY2UtPmdldFJlbmRlclRhcmdldCgpLCBzb3VyY2VSZWN0LCBmb3JtYXQsIDAsIGRlc3RZT2Zmc2V0LCBpbWFnZVtsZXZlbF0pOworICAgIH0KK30KKwordm9pZCBUZXh0dXJlMkQ6OmNvcHlTdWJJbWFnZShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEZyYW1lYnVmZmVyICpzb3VyY2UpCit7CisJaWYoIWltYWdlW2xldmVsXSkKKwl7CisJCXJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisJfQorCisgICAgaWYoeG9mZnNldCArIHdpZHRoID4gaW1hZ2VbbGV2ZWxdLT5nZXRXaWR0aCgpIHx8IHlvZmZzZXQgKyBoZWlnaHQgPiBpbWFnZVtsZXZlbF0tPmdldEhlaWdodCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgIH0KKworICAgIEltYWdlICpyZW5kZXJUYXJnZXQgPSBzb3VyY2UtPmdldFJlbmRlclRhcmdldCgpOworCisgICAgaWYoIXJlbmRlclRhcmdldCkKKyAgICB7CisgICAgICAgIEVSUigiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSByZW5kZXIgdGFyZ2V0LiIpOworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorCisgICAgc3c6OlJlY3Qgc291cmNlUmVjdCA9IHRyYW5zZm9ybVBpeGVsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzb3VyY2UtPmdldENvbG9yYnVmZmVyKCktPmdldEhlaWdodCgpKTsKKyAgICBzb3VyY2VSZWN0LmxlZnQgPSBjbGFtcChzb3VyY2VSZWN0LmxlZnQsIDAsIHNvdXJjZS0+Z2V0Q29sb3JidWZmZXIoKS0+Z2V0V2lkdGgoKSk7CisgICAgc291cmNlUmVjdC50b3AgPSBjbGFtcChzb3VyY2VSZWN0LnRvcCwgMCwgc291cmNlLT5nZXRDb2xvcmJ1ZmZlcigpLT5nZXRIZWlnaHQoKSk7CisgICAgc291cmNlUmVjdC5yaWdodCA9IGNsYW1wKHNvdXJjZVJlY3QucmlnaHQsIDAsIHNvdXJjZS0+Z2V0Q29sb3JidWZmZXIoKS0+Z2V0V2lkdGgoKSk7CisgICAgc291cmNlUmVjdC5ib3R0b20gPSBjbGFtcChzb3VyY2VSZWN0LmJvdHRvbSwgMCwgc291cmNlLT5nZXRDb2xvcmJ1ZmZlcigpLT5nZXRIZWlnaHQoKSk7CisKKyAgICBHTGludCBkZXN0WU9mZnNldCA9IHRyYW5zZm9ybVBpeGVsWU9mZnNldCh5b2Zmc2V0LCBoZWlnaHQsIGltYWdlW2xldmVsXS0+Z2V0SGVpZ2h0KCkpOworCisJY29weShzb3VyY2UtPmdldFJlbmRlclRhcmdldCgpLCBzb3VyY2VSZWN0LCBpbWFnZVtsZXZlbF0tPmdldEZvcm1hdCgpLCB4b2Zmc2V0LCBkZXN0WU9mZnNldCwgaW1hZ2VbbGV2ZWxdKTsKK30KKworLy8gVGVzdHMgZm9yIEdMIHRleHR1cmUgb2JqZWN0IGNvbXBsZXRlbmVzcy4gW09wZW5HTCBFUyAyLjAuMjRdIHNlY3Rpb24gMy43LjEwIHBhZ2UgODEuCitib29sIFRleHR1cmUyRDo6aXNDb21wbGV0ZSgpIGNvbnN0Cit7CisJaWYoIWltYWdlWzBdKQorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworICAgIEdMc2l6ZWkgd2lkdGggPSBpbWFnZVswXS0+Z2V0V2lkdGgoKTsKKyAgICBHTHNpemVpIGhlaWdodCA9IGltYWdlWzBdLT5nZXRIZWlnaHQoKTsKKworICAgIGlmKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBtaXBtYXBwaW5nID0gZmFsc2U7CisKKyAgICBzd2l0Y2gobU1pbkZpbHRlcikKKyAgICB7CisgICAgY2FzZSBHTF9ORUFSRVNUOgorICAgIGNhc2UgR0xfTElORUFSOgorICAgICAgICBtaXBtYXBwaW5nID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVDoKKyAgICBjYXNlIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVDoKKyAgICBjYXNlIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUjoKKyAgICBjYXNlIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSOgorICAgICAgICBtaXBtYXBwaW5nID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICBpZihtaXBtYXBwaW5nKQorICAgIHsKKyAgICAgICAgaW50IHEgPSBsb2cyKHN0ZDo6bWF4KHdpZHRoLCBoZWlnaHQpKTsKKworICAgICAgICBmb3IoaW50IGxldmVsID0gMTsgbGV2ZWwgPD0gcTsgbGV2ZWwrKykKKyAgICAgICAgeworCQkJaWYoIWltYWdlW2xldmVsXSkKKwkJCXsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKyAgICAgICAgICAgIGlmKGltYWdlW2xldmVsXS0+Z2V0Rm9ybWF0KCkgIT0gaW1hZ2VbMF0tPmdldEZvcm1hdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoaW1hZ2VbbGV2ZWxdLT5nZXRUeXBlKCkgIT0gaW1hZ2VbMF0tPmdldFR5cGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGltYWdlW2xldmVsXS0+Z2V0V2lkdGgoKSAhPSBzdGQ6Om1heCgxLCB3aWR0aCA+PiBsZXZlbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihpbWFnZVtsZXZlbF0tPmdldEhlaWdodCgpICE9IHN0ZDo6bWF4KDEsIGhlaWdodCA+PiBsZXZlbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVGV4dHVyZTJEOjppc0NvbXByZXNzZWQoKSBjb25zdAoreworICAgIHJldHVybiBJc0NvbXByZXNzZWQoZ2V0Rm9ybWF0KCkpOworfQorCit2b2lkIFRleHR1cmUyRDo6Z2VuZXJhdGVNaXBtYXBzKCkKK3sKKwlpZighaW1hZ2VbMF0pCisJeworCQlyZXR1cm47ICAgLy8gRklYTUU6IGVycm9yPworCX0KKworICAgIHVuc2lnbmVkIGludCBxID0gbG9nMihzdGQ6Om1heChpbWFnZVswXS0+Z2V0V2lkdGgoKSwgaW1hZ2VbMF0tPmdldEhlaWdodCgpKSk7CisgICAgCisJZm9yKHVuc2lnbmVkIGludCBpID0gMTsgaSA8PSBxOyBpKyspCisgICAgeworCQlpZihpbWFnZVtpXSkKKwkJeworCQkJaW1hZ2VbaV0tPnVuYmluZCgpOworCQl9CisKKwkJaW1hZ2VbaV0gPSBuZXcgSW1hZ2UoZ2V0UmVzb3VyY2UoKSwgc3RkOjptYXgoaW1hZ2VbMF0tPmdldFdpZHRoKCkgPj4gaSwgMSksIHN0ZDo6bWF4KGltYWdlWzBdLT5nZXRIZWlnaHQoKSA+PiBpLCAxKSwgaW1hZ2VbMF0tPmdldEZvcm1hdCgpLCBpbWFnZVswXS0+Z2V0VHlwZSgpKTsKKworCQlpZighaW1hZ2VbaV0pCisJCXsKKwkJCXJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKwkJfQorCisJCWltYWdlW2ldLT5iaW5kKCk7CisKKwkJZ2V0RGV2aWNlKCktPnN0cmV0Y2hSZWN0KGltYWdlW2kgLSAxXSwgMCwgaW1hZ2VbaV0sIDAsIHRydWUpOworICAgIH0KK30KKworSW1hZ2UgKlRleHR1cmUyRDo6Z2V0SW1hZ2UodW5zaWduZWQgaW50IGxldmVsKQoreworCXJldHVybiBpbWFnZVtsZXZlbF07Cit9CisKK1JlbmRlcmJ1ZmZlciAqVGV4dHVyZTJEOjpnZXRSZW5kZXJidWZmZXIoR0xlbnVtIHRhcmdldCkKK3sKKyAgICBpZih0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTiwgKFJlbmRlcmJ1ZmZlciAqKU5VTEwpOworICAgIH0KKworICAgIGlmKG1Db2xvcmJ1ZmZlclByb3h5LmdldCgpID09IE5VTEwpCisgICAgeworICAgICAgICBtQ29sb3JidWZmZXJQcm94eS5zZXQobmV3IFJlbmRlcmJ1ZmZlcihpZCgpLCBuZXcgQ29sb3JidWZmZXIodGhpcywgdGFyZ2V0KSkpOworICAgIH0KKworICAgIHJldHVybiBtQ29sb3JidWZmZXJQcm94eS5nZXQoKTsKK30KKworSW1hZ2UgKlRleHR1cmUyRDo6Z2V0UmVuZGVyVGFyZ2V0KEdMZW51bSB0YXJnZXQpCit7CisgICAgQVNTRVJUKHRhcmdldCA9PSBHTF9URVhUVVJFXzJEKTsKKworCWlmKGltYWdlWzBdKQorCXsKKwkJaW1hZ2VbMF0tPmFkZFJlZigpOworCX0KKworCXJldHVybiBpbWFnZVswXTsKK30KKworVGV4dHVyZUN1YmVNYXA6OlRleHR1cmVDdWJlTWFwKEdMdWludCBpZCkgOiBUZXh0dXJlKGlkKQoreworCWZvcihpbnQgZiA9IDA7IGYgPCA2OyBmKyspCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgTUlQTUFQX0xFVkVMUzsgaSsrKQorCQl7CisJCQlpbWFnZVtmXVtpXSA9IDA7CisJCX0KKwl9Cit9CisKK1RleHR1cmVDdWJlTWFwOjp+VGV4dHVyZUN1YmVNYXAoKQoreworCXJlc291cmNlLT5sb2NrKHN3OjpERVNUUlVDVCk7CisKKwlmb3IoaW50IGYgPSAwOyBmIDwgNjsgZisrKQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IE1JUE1BUF9MRVZFTFM7IGkrKykKKwkJeworCQkJaWYoaW1hZ2VbZl1baV0pCisJCQl7CisJCQkJaW1hZ2VbZl1baV0tPnVuYmluZCgpOworCQkJCWltYWdlW2ZdW2ldID0gMDsKKwkJCX0KKwkJfQorCX0KKworCXJlc291cmNlLT51bmxvY2soKTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICBtRmFjZVByb3hpZXNbaV0uc2V0KE5VTEwpOworICAgIH0KK30KKworYm9vbCBUZXh0dXJlQ3ViZU1hcDo6aXNUZXh0dXJlQ3ViZU1hcCgpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK0dMZW51bSBUZXh0dXJlQ3ViZU1hcDo6Z2V0VGFyZ2V0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gR0xfVEVYVFVSRV9DVUJFX01BUDsKK30KKworR0xzaXplaSBUZXh0dXJlQ3ViZU1hcDo6Z2V0V2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBpbWFnZVswXVswXSA/IGltYWdlWzBdWzBdLT5nZXRXaWR0aCgpIDogMDsKK30KKworR0xzaXplaSBUZXh0dXJlQ3ViZU1hcDo6Z2V0SGVpZ2h0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaW1hZ2VbMF1bMF0gPyBpbWFnZVswXVswXS0+Z2V0SGVpZ2h0KCkgOiAwOworfQorCitHTGVudW0gVGV4dHVyZUN1YmVNYXA6OmdldEZvcm1hdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGltYWdlWzBdWzBdID8gaW1hZ2VbMF1bMF0tPmdldEZvcm1hdCgpIDogMDsKK30KKworR0xlbnVtIFRleHR1cmVDdWJlTWFwOjpnZXRUeXBlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaW1hZ2VbMF1bMF0gPyBpbWFnZVswXVswXS0+Z2V0VHlwZSgpIDogMDsKK30KKworc3c6OkZvcm1hdCBUZXh0dXJlQ3ViZU1hcDo6Z2V0SW50ZXJuYWxGb3JtYXQoKSBjb25zdAoreworICAgIHJldHVybiBpbWFnZVswXVswXSA/IGltYWdlWzBdWzBdLT5nZXRJbnRlcm5hbEZvcm1hdCgpIDogc3c6OkZPUk1BVF9OVUxMOworfQorCitpbnQgVGV4dHVyZUN1YmVNYXA6OmdldExldmVsQ291bnQoKSBjb25zdAoreworCWludCBsZXZlbHMgPSAwOworCisJd2hpbGUobGV2ZWxzIDwgTUlQTUFQX0xFVkVMUyAmJiBpbWFnZVswXVtsZXZlbHNdKQorCXsKKwkJbGV2ZWxzKys7CisJfQorCisJcmV0dXJuIGxldmVsczsKK30KKwordm9pZCBUZXh0dXJlQ3ViZU1hcDo6c2V0Q29tcHJlc3NlZEltYWdlKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKnBpeGVscykKK3sKKwlDdWJlRmFjZSBmYWNlID0gQ29udmVydEN1YmVGYWNlKHRhcmdldCk7CisKKwlpZihpbWFnZVtmYWNlXVtsZXZlbF0pCisJeworCQlpbWFnZVtmYWNlXVtsZXZlbF0tPnVuYmluZCgpOworCX0KKworCWltYWdlW2ZhY2VdW2xldmVsXSA9IG5ldyBJbWFnZShyZXNvdXJjZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFKTsKKworCWlmKCFpbWFnZVtmYWNlXVtsZXZlbF0pCisJeworCQlyZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisJfQorCisJaW1hZ2VbZmFjZV1bbGV2ZWxdLT5iaW5kKCk7CisKKyAgICBUZXh0dXJlOjpzZXRDb21wcmVzc2VkSW1hZ2UoaW1hZ2VTaXplLCBwaXhlbHMsIGltYWdlW2ZhY2VdW2xldmVsXSk7Cit9CisKK3ZvaWQgVGV4dHVyZUN1YmVNYXA6OnN1YkltYWdlKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMaW50IHVucGFja0FsaWdubWVudCwgY29uc3Qgdm9pZCAqcGl4ZWxzKQoreworICAgIFRleHR1cmU6OnN1YkltYWdlKHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgdW5wYWNrQWxpZ25tZW50LCBwaXhlbHMsIGltYWdlW0NvbnZlcnRDdWJlRmFjZSh0YXJnZXQpXVtsZXZlbF0pOworfQorCit2b2lkIFRleHR1cmVDdWJlTWFwOjpzdWJJbWFnZUNvbXByZXNzZWQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqcGl4ZWxzKQoreworICAgIFRleHR1cmU6OnN1YkltYWdlQ29tcHJlc3NlZCh4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGltYWdlU2l6ZSwgcGl4ZWxzLCBpbWFnZVtDb252ZXJ0Q3ViZUZhY2UodGFyZ2V0KV1bbGV2ZWxdKTsKK30KKworLy8gVGVzdHMgZm9yIEdMIHRleHR1cmUgb2JqZWN0IGNvbXBsZXRlbmVzcy4gW09wZW5HTCBFUyAyLjAuMjRdIHNlY3Rpb24gMy43LjEwIHBhZ2UgODEuCitib29sIFRleHR1cmVDdWJlTWFwOjppc0NvbXBsZXRlKCkgY29uc3QKK3sKKwlmb3IoaW50IGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKQorICAgIHsKKwkJaWYoIWltYWdlW2ZhY2VdWzBdKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKyAgICBpbnQgc2l6ZSA9IGltYWdlWzBdWzBdLT5nZXRXaWR0aCgpOworCisgICAgaWYoc2l6ZSA8PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgbWlwbWFwcGluZzsKKworICAgIHN3aXRjaCAobU1pbkZpbHRlcikKKyAgICB7CisgICAgY2FzZSBHTF9ORUFSRVNUOgorICAgIGNhc2UgR0xfTElORUFSOgorICAgICAgICBtaXBtYXBwaW5nID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVDoKKyAgICBjYXNlIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVDoKKyAgICBjYXNlIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUjoKKyAgICBjYXNlIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSOgorICAgICAgICBtaXBtYXBwaW5nID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICBmb3IoaW50IGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKQorICAgIHsKKyAgICAgICAgaWYoaW1hZ2VbZmFjZV1bMF0tPmdldFdpZHRoKCkgIT0gc2l6ZSB8fCBpbWFnZVtmYWNlXVswXS0+Z2V0SGVpZ2h0KCkgIT0gc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYobWlwbWFwcGluZykKKyAgICB7CisgICAgICAgIGludCBxID0gbG9nMihzaXplKTsKKworICAgICAgICBmb3IoaW50IGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaW50IGxldmVsID0gMTsgbGV2ZWwgPD0gcTsgbGV2ZWwrKykKKyAgICAgICAgICAgIHsKKwkJCQlpZighaW1hZ2VbZmFjZV1bbGV2ZWxdKQorCQkJCXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworICAgICAgICAgICAgICAgIGlmKGltYWdlW2ZhY2VdW2xldmVsXS0+Z2V0Rm9ybWF0KCkgIT0gaW1hZ2VbMF1bMF0tPmdldEZvcm1hdCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKGltYWdlW2ZhY2VdW2xldmVsXS0+Z2V0VHlwZSgpICE9IGltYWdlWzBdWzBdLT5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoaW1hZ2VbZmFjZV1bbGV2ZWxdLT5nZXRXaWR0aCgpICE9IHN0ZDo6bWF4KDEsIHNpemUgPj4gbGV2ZWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFTU0VSVChpbWFnZVtmYWNlXVtsZXZlbF0tPmdldEhlaWdodCgpID09IGltYWdlW2ZhY2VdW2xldmVsXS0+Z2V0V2lkdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUZXh0dXJlQ3ViZU1hcDo6aXNDb21wcmVzc2VkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gSXNDb21wcmVzc2VkKGdldEZvcm1hdCgpKTsKK30KKwordm9pZCBUZXh0dXJlQ3ViZU1hcDo6c2V0SW1hZ2UoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xpbnQgdW5wYWNrQWxpZ25tZW50LCBjb25zdCB2b2lkICpwaXhlbHMpCit7CisJQ3ViZUZhY2UgZmFjZSA9IENvbnZlcnRDdWJlRmFjZSh0YXJnZXQpOworCisJaWYoaW1hZ2VbZmFjZV1bbGV2ZWxdKQorCXsKKwkJaW1hZ2VbZmFjZV1bbGV2ZWxdLT51bmJpbmQoKTsKKwl9CisKKwlpbWFnZVtmYWNlXVtsZXZlbF0gPSBuZXcgSW1hZ2UocmVzb3VyY2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgR0xfVU5TSUdORURfQllURSk7CisKKwlpZighaW1hZ2VbZmFjZV1bbGV2ZWxdKQorCXsKKwkJcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworCX0KKworCWltYWdlW2ZhY2VdW2xldmVsXS0+YmluZCgpOworCisgICAgVGV4dHVyZTo6c2V0SW1hZ2UodW5wYWNrQWxpZ25tZW50LCBwaXhlbHMsIGltYWdlW2ZhY2VdW2xldmVsXSk7Cit9CisKK3ZvaWQgVGV4dHVyZUN1YmVNYXA6OmNvcHlJbWFnZShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEZyYW1lYnVmZmVyICpzb3VyY2UpCit7CisJSW1hZ2UgKnJlbmRlclRhcmdldCA9IHNvdXJjZS0+Z2V0UmVuZGVyVGFyZ2V0KCk7CisKKyAgICBpZighcmVuZGVyVGFyZ2V0KQorICAgIHsKKyAgICAgICAgRVJSKCJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIHJlbmRlciB0YXJnZXQuIik7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9CisKKwlDdWJlRmFjZSBmYWNlID0gQ29udmVydEN1YmVGYWNlKHRhcmdldCk7CisKKwlpZihpbWFnZVtmYWNlXVtsZXZlbF0pCisJeworCQlpbWFnZVtmYWNlXVtsZXZlbF0tPnVuYmluZCgpOworCX0KKworCWltYWdlW2ZhY2VdW2xldmVsXSA9IG5ldyBJbWFnZShyZXNvdXJjZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFKTsKKworCWlmKCFpbWFnZVtmYWNlXVtsZXZlbF0pCisJeworCQlyZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisJfQorCisJaW1hZ2VbZmFjZV1bbGV2ZWxdLT5iaW5kKCk7CisKKyAgICBpZih3aWR0aCAhPSAwICYmIGhlaWdodCAhPSAwKQorICAgIHsKKyAgICAgICAgc3c6OlJlY3Qgc291cmNlUmVjdCA9IHRyYW5zZm9ybVBpeGVsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzb3VyY2UtPmdldENvbG9yYnVmZmVyKCktPmdldEhlaWdodCgpKTsKKyAgICAgICAgc291cmNlUmVjdC5sZWZ0ID0gY2xhbXAoc291cmNlUmVjdC5sZWZ0LCAwLCBzb3VyY2UtPmdldENvbG9yYnVmZmVyKCktPmdldFdpZHRoKCkpOworICAgICAgICBzb3VyY2VSZWN0LnRvcCA9IGNsYW1wKHNvdXJjZVJlY3QudG9wLCAwLCBzb3VyY2UtPmdldENvbG9yYnVmZmVyKCktPmdldEhlaWdodCgpKTsKKyAgICAgICAgc291cmNlUmVjdC5yaWdodCA9IGNsYW1wKHNvdXJjZVJlY3QucmlnaHQsIDAsIHNvdXJjZS0+Z2V0Q29sb3JidWZmZXIoKS0+Z2V0V2lkdGgoKSk7CisgICAgICAgIHNvdXJjZVJlY3QuYm90dG9tID0gY2xhbXAoc291cmNlUmVjdC5ib3R0b20sIDAsIHNvdXJjZS0+Z2V0Q29sb3JidWZmZXIoKS0+Z2V0SGVpZ2h0KCkpOworCisgICAgICAgIEdMaW50IGRlc3RZT2Zmc2V0ID0gdHJhbnNmb3JtUGl4ZWxZT2Zmc2V0KDAsIGhlaWdodCwgaW1hZ2VbZmFjZV1bbGV2ZWxdLT5nZXRIZWlnaHQoKSk7CisgICAgICAgIAorICAgICAgICBjb3B5KHNvdXJjZS0+Z2V0UmVuZGVyVGFyZ2V0KCksIHNvdXJjZVJlY3QsIGZvcm1hdCwgMCwgZGVzdFlPZmZzZXQsIGltYWdlW2ZhY2VdW2xldmVsXSk7CisgICAgfQorfQorCitJbWFnZSAqVGV4dHVyZUN1YmVNYXA6OmdldEltYWdlKEN1YmVGYWNlIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCkKK3sKKwlyZXR1cm4gaW1hZ2VbZmFjZV1bbGV2ZWxdOworfQorCitJbWFnZSAqVGV4dHVyZUN1YmVNYXA6OmdldEltYWdlKEdMZW51bSBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwpCit7CisgICAgcmV0dXJuIGltYWdlW0NvbnZlcnRDdWJlRmFjZShmYWNlKV1bbGV2ZWxdOworfQorCit2b2lkIFRleHR1cmVDdWJlTWFwOjpjb3B5U3ViSW1hZ2UoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBGcmFtZWJ1ZmZlciAqc291cmNlKQoreworCUN1YmVGYWNlIGZhY2UgPSBDb252ZXJ0Q3ViZUZhY2UodGFyZ2V0KTsKKworCWlmKCFpbWFnZVtmYWNlXVtsZXZlbF0pCisJeworCQlyZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCX0KKworICAgIEdMc2l6ZWkgc2l6ZSA9IGltYWdlW2ZhY2VdW2xldmVsXS0+Z2V0V2lkdGgoKTsKKworICAgIGlmKHhvZmZzZXQgKyB3aWR0aCA+IHNpemUgfHwgeW9mZnNldCArIGhlaWdodCA+IHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgfQorCisgICAgIEltYWdlICpyZW5kZXJUYXJnZXQgPSBzb3VyY2UtPmdldFJlbmRlclRhcmdldCgpOworCisgICAgaWYoIXJlbmRlclRhcmdldCkKKyAgICB7CisgICAgICAgIEVSUigiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSByZW5kZXIgdGFyZ2V0LiIpOworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorCisgICAgc3c6OlJlY3Qgc291cmNlUmVjdCA9IHRyYW5zZm9ybVBpeGVsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzb3VyY2UtPmdldENvbG9yYnVmZmVyKCktPmdldEhlaWdodCgpKTsKKyAgICBzb3VyY2VSZWN0LmxlZnQgPSBjbGFtcChzb3VyY2VSZWN0LmxlZnQsIDAsIHNvdXJjZS0+Z2V0Q29sb3JidWZmZXIoKS0+Z2V0V2lkdGgoKSk7CisgICAgc291cmNlUmVjdC50b3AgPSBjbGFtcChzb3VyY2VSZWN0LnRvcCwgMCwgc291cmNlLT5nZXRDb2xvcmJ1ZmZlcigpLT5nZXRIZWlnaHQoKSk7CisgICAgc291cmNlUmVjdC5yaWdodCA9IGNsYW1wKHNvdXJjZVJlY3QucmlnaHQsIDAsIHNvdXJjZS0+Z2V0Q29sb3JidWZmZXIoKS0+Z2V0V2lkdGgoKSk7CisgICAgc291cmNlUmVjdC5ib3R0b20gPSBjbGFtcChzb3VyY2VSZWN0LmJvdHRvbSwgMCwgc291cmNlLT5nZXRDb2xvcmJ1ZmZlcigpLT5nZXRIZWlnaHQoKSk7CisKKyAgICBHTGludCBkZXN0WU9mZnNldCA9IHRyYW5zZm9ybVBpeGVsWU9mZnNldCh5b2Zmc2V0LCBoZWlnaHQsIGltYWdlW2ZhY2VdW2xldmVsXS0+Z2V0SGVpZ2h0KCkpOworCisJY29weShzb3VyY2UtPmdldFJlbmRlclRhcmdldCgpLCBzb3VyY2VSZWN0LCBpbWFnZVtmYWNlXVtsZXZlbF0tPmdldEZvcm1hdCgpLCB4b2Zmc2V0LCBkZXN0WU9mZnNldCwgaW1hZ2VbZmFjZV1bbGV2ZWxdKTsKK30KKworYm9vbCBUZXh0dXJlQ3ViZU1hcDo6aXNDdWJlQ29tcGxldGUoKSBjb25zdAoreworCWZvcih1bnNpZ25lZCBpbnQgZiA9IDE7IGYgPCA2OyBmKyspCisgICAgeworCQlpZighaW1hZ2VbZl1bMF0pCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworICAgIGlmKGltYWdlWzBdWzBdLT5nZXRXaWR0aCgpID09IDApCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yKHVuc2lnbmVkIGludCBmID0gMTsgZiA8IDY7IGYrKykKKyAgICB7CisgICAgICAgIGlmKGltYWdlW2ZdWzBdLT5nZXRXaWR0aCgpICE9IGltYWdlWzBdWzBdLT5nZXRXaWR0aCgpIHx8IGltYWdlW2ZdWzBdLT5nZXRGb3JtYXQoKSAhPSBpbWFnZVswXVswXS0+Z2V0Rm9ybWF0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRleHR1cmVDdWJlTWFwOjpnZW5lcmF0ZU1pcG1hcHMoKQoreworICAgIGlmKCFpc0N1YmVDb21wbGV0ZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQgcSA9IGxvZzIoaW1hZ2VbMF1bMF0tPmdldFdpZHRoKCkpOworCisJZm9yKHVuc2lnbmVkIGludCBmID0gMDsgZiA8IDY7IGYrKykKKyAgICB7CisJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDE7IGkgPD0gcTsgaSsrKQorCQl7CisJCQlpZihpbWFnZVtmXVtpXSkKKwkJCXsKKwkJCQlpbWFnZVtmXVtpXS0+dW5iaW5kKCk7CisJCQl9CisKKwkJCWltYWdlW2ZdW2ldID0gbmV3IEltYWdlKHJlc291cmNlLCBzdGQ6Om1heChpbWFnZVswXVswXS0+Z2V0V2lkdGgoKSA+PiBpLCAxKSwgc3RkOjptYXgoaW1hZ2VbMF1bMF0tPmdldEhlaWdodCgpID4+IGksIDEpLCBpbWFnZVswXVswXS0+Z2V0Rm9ybWF0KCksIGltYWdlWzBdWzBdLT5nZXRUeXBlKCkpOworCisJCQlpZighaW1hZ2VbZl1baV0pCisJCQl7CisJCQkJcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworCQkJfQorCisJCQlpbWFnZVtmXVtpXS0+YmluZCgpOworCisJCQlnZXREZXZpY2UoKS0+c3RyZXRjaFJlY3QoaW1hZ2VbZl1baSAtIDFdLCAwLCBpbWFnZVtmXVtpXSwgMCwgdHJ1ZSk7CisJCX0KKwl9Cit9CisKK1JlbmRlcmJ1ZmZlciAqVGV4dHVyZUN1YmVNYXA6OmdldFJlbmRlcmJ1ZmZlcihHTGVudW0gdGFyZ2V0KQoreworICAgIGlmKCFJc0N1YmVtYXBUZXh0dXJlVGFyZ2V0KHRhcmdldCkpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04sIChSZW5kZXJidWZmZXIgKilOVUxMKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQgZmFjZSA9IENvbnZlcnRDdWJlRmFjZSh0YXJnZXQpOworCisgICAgaWYobUZhY2VQcm94aWVzW2ZhY2VdLmdldCgpID09IE5VTEwpCisgICAgeworICAgICAgICBtRmFjZVByb3hpZXNbZmFjZV0uc2V0KG5ldyBSZW5kZXJidWZmZXIoaWQoKSwgbmV3IENvbG9yYnVmZmVyKHRoaXMsIHRhcmdldCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZhY2VQcm94aWVzW2ZhY2VdLmdldCgpOworfQorCitJbWFnZSAqVGV4dHVyZUN1YmVNYXA6OmdldFJlbmRlclRhcmdldChHTGVudW0gdGFyZ2V0KQoreworICAgIEFTU0VSVChJc0N1YmVtYXBUZXh0dXJlVGFyZ2V0KHRhcmdldCkpOworICAgIAorCWludCBmYWNlID0gQ29udmVydEN1YmVGYWNlKHRhcmdldCk7CisKKwlpZihpbWFnZVtmYWNlXVswXSkKKwl7CisJCWltYWdlW2ZhY2VdWzBdLT5hZGRSZWYoKTsKKwl9CisKKwlyZXR1cm4gaW1hZ2VbZmFjZV1bMF07Cit9CisKK30KKworZXh0ZXJuICJDIgoreworCWdsOjpJbWFnZSAqY3JlYXRlQmFja0J1ZmZlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IGVnbDo6Q29uZmlnICpjb25maWcpCisJeworCQlpZihjb25maWcpCisJCXsKKwkJCXJldHVybiBuZXcgZ2w6OkltYWdlKDAsIHdpZHRoLCBoZWlnaHQsIGNvbmZpZy0+bUFscGhhU2l6ZSA/IEdMX1JHQkEgOiBHTF9SR0IsIEdMX1VOU0lHTkVEX0JZVEUpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9UZXh0dXJlLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2IxZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvVGV4dHVyZS5oCkBAIC0wLDAgKzEsMjQ3IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBUZXh0dXJlLmg6IERlZmluZXMgdGhlIGFic3RyYWN0IFRleHR1cmUgY2xhc3MgYW5kIGl0cyBjb25jcmV0ZSBkZXJpdmVkCisvLyBjbGFzc2VzIFRleHR1cmUyRCBhbmQgVGV4dHVyZUN1YmVNYXAuIEltcGxlbWVudHMgR0wgdGV4dHVyZSBvYmplY3RzIGFuZAorLy8gcmVsYXRlZCBmdW5jdGlvbmFsaXR5LiBbT3BlbkdMIEVTIDIuMC4yNF0gc2VjdGlvbiAzLjcgcGFnZSA2My4KKworI2lmbmRlZiBMSUJHTEVTVjJfVEVYVFVSRV9IXworI2RlZmluZSBMSUJHTEVTVjJfVEVYVFVSRV9IXworCisjaW5jbHVkZSAiUmVuZGVyYnVmZmVyLmgiCisjaW5jbHVkZSAiUmVmQ291bnRPYmplY3QuaCIKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJjb21tb24vZGVidWcuaCIKKworI2RlZmluZSBHTF9BUElDQUxMCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBlZ2wKK3sKK2NsYXNzIFN1cmZhY2U7CitjbGFzcyBDb25maWc7Cit9CisKK25hbWVzcGFjZSBnbAoreworY2xhc3MgRnJhbWVidWZmZXI7CitlbnVtIEN1YmVGYWNlOworCitlbnVtCit7CisJSU1QTEVNRU5UQVRJT05fTUFYX1RFWFRVUkVfTEVWRUxTID0gTUlQTUFQX0xFVkVMUywKKyAgICBJTVBMRU1FTlRBVElPTl9NQVhfVEVYVFVSRV9TSVpFID0gMSA8PCAoTUlQTUFQX0xFVkVMUyAtIDEpLAorICAgIElNUExFTUVOVEFUSU9OX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgPSAxIDw8IChNSVBNQVBfTEVWRUxTIC0gMSksCisJSU1QTEVNRU5UQVRJT05fTUFYX1JFTkRFUkJVRkZFUl9TSVpFID0gT1VUTElORV9SRVNPTFVUSU9OLAorCUlNUExFTUVOVEFUSU9OX01BWF9TQU1QTEVTID0gNAorfTsKKworY2xhc3MgVGV4dHVyZSA6IHB1YmxpYyBSZWZDb3VudE9iamVjdAoreworcHVibGljOgorICAgIGV4cGxpY2l0IFRleHR1cmUoR0x1aW50IGlkKTsKKworICAgIHZpcnR1YWwgflRleHR1cmUoKTsKKworCXN3OjpSZXNvdXJjZSAqZ2V0UmVzb3VyY2UoKSBjb25zdDsKKwl2aXJ0dWFsIGJvb2wgaXNUZXh0dXJlMkQoKTsKKwl2aXJ0dWFsIGJvb2wgaXNUZXh0dXJlQ3ViZU1hcCgpOworCisgICAgdmlydHVhbCBHTGVudW0gZ2V0VGFyZ2V0KCkgY29uc3QgPSAwOworCisgICAgYm9vbCBzZXRNaW5GaWx0ZXIoR0xlbnVtIGZpbHRlcik7CisgICAgYm9vbCBzZXRNYWdGaWx0ZXIoR0xlbnVtIGZpbHRlcik7CisgICAgYm9vbCBzZXRXcmFwUyhHTGVudW0gd3JhcCk7CisgICAgYm9vbCBzZXRXcmFwVChHTGVudW0gd3JhcCk7CisKKyAgICBHTGVudW0gZ2V0TWluRmlsdGVyKCkgY29uc3Q7CisgICAgR0xlbnVtIGdldE1hZ0ZpbHRlcigpIGNvbnN0OworICAgIEdMZW51bSBnZXRXcmFwUygpIGNvbnN0OworICAgIEdMZW51bSBnZXRXcmFwVCgpIGNvbnN0OworCisgICAgdmlydHVhbCBHTHNpemVpIGdldFdpZHRoKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgR0xzaXplaSBnZXRIZWlnaHQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBHTGVudW0gZ2V0Rm9ybWF0KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgR0xlbnVtIGdldFR5cGUoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdzo6Rm9ybWF0IGdldEludGVybmFsRm9ybWF0KCkgY29uc3QgPSAwOworCXZpcnR1YWwgaW50IGdldExldmVsQ291bnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNDb21wcmVzc2VkKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBSZW5kZXJidWZmZXIgKmdldFJlbmRlcmJ1ZmZlcihHTGVudW0gdGFyZ2V0KSA9IDA7CisJdmlydHVhbCBJbWFnZSAqZ2V0UmVuZGVyVGFyZ2V0KEdMZW51bSB0YXJnZXQpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZU1pcG1hcHMoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNvcHlTdWJJbWFnZShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEZyYW1lYnVmZmVyICpzb3VyY2UpID0gMDsKKworICAgIHN0YXRpYyBjb25zdCBHTHVpbnQgSU5DT01QTEVURV9URVhUVVJFX0lEID0gc3RhdGljX2Nhc3Q8R0x1aW50PigtMSk7ICAgLy8gRXZlcnkgdGV4dHVyZSB0YWtlcyBhbiBpZCBhdCBjcmVhdGlvbiB0aW1lLiBUaGUgdmFsdWUgaXMgYXJiaXRyYXJ5IGJlY2F1c2UgaXQgaXMgbmV2ZXIgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZXNvdXJjZSBtYW5hZ2VyLgorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBzZXRJbWFnZShHTGludCB1bnBhY2tBbGlnbm1lbnQsIGNvbnN0IHZvaWQgKnBpeGVscywgSW1hZ2UgKmltYWdlKTsKKyAgICB2b2lkIHN1YkltYWdlKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xpbnQgdW5wYWNrQWxpZ25tZW50LCBjb25zdCB2b2lkICpwaXhlbHMsIEltYWdlICppbWFnZSk7CisgICAgdm9pZCBzZXRDb21wcmVzc2VkSW1hZ2UoR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKnBpeGVscywgSW1hZ2UgKmltYWdlKTsKKyAgICB2b2lkIHN1YkltYWdlQ29tcHJlc3NlZChHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKnBpeGVscywgSW1hZ2UgKmltYWdlKTsKKworCWJvb2wgY29weShJbWFnZSAqc291cmNlLCBjb25zdCBzdzo6UmVjdCAmc291cmNlUmVjdCwgR0xlbnVtIGRlc3RGb3JtYXQsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEltYWdlICpkZXN0KTsKKworICAgIEdMZW51bSBtTWluRmlsdGVyOworICAgIEdMZW51bSBtTWFnRmlsdGVyOworICAgIEdMZW51bSBtV3JhcFM7CisgICAgR0xlbnVtIG1XcmFwVDsKKworCXN3OjpSZXNvdXJjZSAqcmVzb3VyY2U7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRleHR1cmUpOworCisgICAgdm9pZCBsb2FkSW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgdW5wYWNrQWxpZ25tZW50LCBjb25zdCB2b2lkICppbnB1dCwgc3RkOjpzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCwgSW1hZ2UgKmltYWdlKSBjb25zdDsKKworICAgIHZvaWQgbG9hZEFscGhhSW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0OworICAgIHZvaWQgbG9hZEFscGhhRmxvYXRJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIGxvYWRBbHBoYUhhbGZGbG9hdEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIGxvYWRMdW1pbmFuY2VJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQsIGJvb2wgbmF0aXZlKSBjb25zdDsKKyAgICB2b2lkIGxvYWRMdW1pbmFuY2VGbG9hdEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIGxvYWRMdW1pbmFuY2VIYWxmRmxvYXRJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0OworICAgIHZvaWQgbG9hZEx1bWluYW5jZUFscGhhSW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQsIGJvb2wgbmF0aXZlKSBjb25zdDsKKyAgICB2b2lkIGxvYWRMdW1pbmFuY2VBbHBoYUZsb2F0SW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3Q7CisgICAgdm9pZCBsb2FkTHVtaW5hbmNlQWxwaGFIYWxmRmxvYXRJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3Q7CisgICAgdm9pZCBsb2FkUkdCVUJ5dGVJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3Q7CisgICAgdm9pZCBsb2FkUkdCNTY1SW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIGxvYWRSR0JGbG9hdEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIGxvYWRSR0JIYWxmRmxvYXRJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0OworICAgIHZvaWQgbG9hZFJHQkFVQnl0ZUltYWdlRGF0YVNTRTIoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIGxvYWRSR0JBVUJ5dGVJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0OworICAgIHZvaWQgbG9hZFJHQkE0NDQ0SW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0OworICAgIHZvaWQgbG9hZFJHQkE1NTUxSW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0OworICAgIHZvaWQgbG9hZFJHQkFGbG9hdEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3Q7CisgICAgdm9pZCBsb2FkUkdCQUhhbGZGbG9hdEltYWdlRGF0YShHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dFBpdGNoLCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IG91dHB1dFBpdGNoLCB2b2lkICpvdXRwdXQpIGNvbnN0OworICAgIHZvaWQgbG9hZEJHUkFJbWFnZURhdGEoR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRQaXRjaCwgY29uc3Qgdm9pZCAqaW5wdXQsIHNpemVfdCBvdXRwdXRQaXRjaCwgdm9pZCAqb3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIGxvYWRDb21wcmVzc2VkSW1hZ2VEYXRhKEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0UGl0Y2gsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qgb3V0cHV0UGl0Y2gsIHZvaWQgKm91dHB1dCkgY29uc3Q7Cit9OworCitjbGFzcyBUZXh0dXJlMkQgOiBwdWJsaWMgVGV4dHVyZQoreworICBwdWJsaWM6CisgICAgZXhwbGljaXQgVGV4dHVyZTJEKEdMdWludCBpZCk7CisKKyAgICB+VGV4dHVyZTJEKCk7CisKKwl2aXJ0dWFsIGJvb2wgaXNUZXh0dXJlMkQoKTsKKworICAgIHZpcnR1YWwgR0xlbnVtIGdldFRhcmdldCgpIGNvbnN0OworCisgICAgdmlydHVhbCBHTHNpemVpIGdldFdpZHRoKCkgY29uc3Q7CisgICAgdmlydHVhbCBHTHNpemVpIGdldEhlaWdodCgpIGNvbnN0OworICAgIHZpcnR1YWwgR0xlbnVtIGdldEZvcm1hdCgpIGNvbnN0OworICAgIHZpcnR1YWwgR0xlbnVtIGdldFR5cGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN3OjpGb3JtYXQgZ2V0SW50ZXJuYWxGb3JtYXQoKSBjb25zdDsKKwl2aXJ0dWFsIGludCBnZXRMZXZlbENvdW50KCkgY29uc3Q7CisKKyAgICB2b2lkIHNldEltYWdlKEdMaW50IGxldmVsLCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMaW50IHVucGFja0FsaWdubWVudCwgY29uc3Qgdm9pZCAqcGl4ZWxzKTsKKyAgICB2b2lkIHNldENvbXByZXNzZWRJbWFnZShHTGludCBsZXZlbCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCB2b2lkICpwaXhlbHMpOworICAgIHZvaWQgc3ViSW1hZ2UoR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xpbnQgdW5wYWNrQWxpZ25tZW50LCBjb25zdCB2b2lkICpwaXhlbHMpOworICAgIHZvaWQgc3ViSW1hZ2VDb21wcmVzc2VkKEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKnBpeGVscyk7CisgICAgdm9pZCBjb3B5SW1hZ2UoR0xpbnQgbGV2ZWwsIEdMZW51bSBmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBGcmFtZWJ1ZmZlciAqc291cmNlKTsKKyAgICB2b2lkIGNvcHlTdWJJbWFnZShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEZyYW1lYnVmZmVyICpzb3VyY2UpOworCisgICAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNDb21wcmVzc2VkKCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGJpbmRUZXhJbWFnZShlZ2w6OlN1cmZhY2UgKnN1cmZhY2UpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlVGV4SW1hZ2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZU1pcG1hcHMoKTsKKworCXZpcnR1YWwgSW1hZ2UgKmdldEltYWdlKHVuc2lnbmVkIGludCBsZXZlbCk7CisgICAgdmlydHVhbCBSZW5kZXJidWZmZXIgKmdldFJlbmRlcmJ1ZmZlcihHTGVudW0gdGFyZ2V0KTsKKwlJbWFnZSAqZ2V0UmVuZGVyVGFyZ2V0KEdMZW51bSB0YXJnZXQpOworCisgIHByaXZhdGU6CisJSW1hZ2UgKmltYWdlW01JUE1BUF9MRVZFTFNdOworICAgIAorICAgIGVnbDo6U3VyZmFjZSAqbVN1cmZhY2U7CisgICAgQmluZGluZ1BvaW50ZXI8UmVuZGVyYnVmZmVyPiBtQ29sb3JidWZmZXJQcm94eTsKK307CisKK2NsYXNzIFRleHR1cmVDdWJlTWFwIDogcHVibGljIFRleHR1cmUKK3sKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFRleHR1cmVDdWJlTWFwKEdMdWludCBpZCk7CisKKyAgICB+VGV4dHVyZUN1YmVNYXAoKTsKKworCXZpcnR1YWwgYm9vbCBpc1RleHR1cmVDdWJlTWFwKCk7CisKKyAgICB2aXJ0dWFsIEdMZW51bSBnZXRUYXJnZXQoKSBjb25zdDsKKyAgICAKKyAgICB2aXJ0dWFsIEdMc2l6ZWkgZ2V0V2lkdGgoKSBjb25zdDsKKyAgICB2aXJ0dWFsIEdMc2l6ZWkgZ2V0SGVpZ2h0KCkgY29uc3Q7CisgICAgdmlydHVhbCBHTGVudW0gZ2V0Rm9ybWF0KCkgY29uc3Q7CisgICAgdmlydHVhbCBHTGVudW0gZ2V0VHlwZSgpIGNvbnN0OworICAgIHZpcnR1YWwgc3c6OkZvcm1hdCBnZXRJbnRlcm5hbEZvcm1hdCgpIGNvbnN0OworCXZpcnR1YWwgaW50IGdldExldmVsQ291bnQoKSBjb25zdDsKKworCXZvaWQgc2V0SW1hZ2UoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xpbnQgdW5wYWNrQWxpZ25tZW50LCBjb25zdCB2b2lkICpwaXhlbHMpOworICAgIHZvaWQgc2V0Q29tcHJlc3NlZEltYWdlKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKnBpeGVscyk7CisKKyAgICB2b2lkIHN1YkltYWdlKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMaW50IHVucGFja0FsaWdubWVudCwgY29uc3Qgdm9pZCAqcGl4ZWxzKTsKKyAgICB2b2lkIHN1YkltYWdlQ29tcHJlc3NlZChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCB2b2lkICpwaXhlbHMpOworICAgIHZvaWQgY29weUltYWdlKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgRnJhbWVidWZmZXIgKnNvdXJjZSk7CisgICAgdmlydHVhbCB2b2lkIGNvcHlTdWJJbWFnZShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEZyYW1lYnVmZmVyICpzb3VyY2UpOworCisgICAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNDb21wcmVzc2VkKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVNaXBtYXBzKCk7CisKKyAgICB2aXJ0dWFsIFJlbmRlcmJ1ZmZlciAqZ2V0UmVuZGVyYnVmZmVyKEdMZW51bSB0YXJnZXQpOworCisJSW1hZ2UgKmdldEltYWdlKEN1YmVGYWNlIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCk7CisKKyAgcHJpdmF0ZToKKwlib29sIGlzQ3ViZUNvbXBsZXRlKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIEltYWdlICpnZXRSZW5kZXJUYXJnZXQoR0xlbnVtIHRhcmdldCk7CisKKyAgICAvLyBmYWNlIGlzIG9uZSBvZiB0aGUgR0xfVEVYVFVSRV9DVUJFX01BUF8qIGVudW1lcmFudHMuIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLgorICAgIEltYWdlICpnZXRJbWFnZShHTGVudW0gZmFjZSwgdW5zaWduZWQgaW50IGxldmVsKTsKKworICAgIEltYWdlICppbWFnZVs2XVtJTVBMRU1FTlRBVElPTl9NQVhfVEVYVFVSRV9MRVZFTFNdOworCQorICAgIEJpbmRpbmdQb2ludGVyPFJlbmRlcmJ1ZmZlcj4gbUZhY2VQcm94aWVzWzZdOworfTsKK30KKworZXh0ZXJuICJDIgoreworCWdsOjpJbWFnZSAqY3JlYXRlQmFja0J1ZmZlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IGVnbDo6Q29uZmlnICpjb25maWcpOworfQorCisjZW5kaWYgICAvLyBMSUJHTEVTVjJfVEVYVFVSRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1Vua25vd24uY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1Vua25vd24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTM3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvVW5rbm93bi5jcHAKQEAgLTAsMCArMSw2NiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlICIuLi9jb21tb24vZGVidWcuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIGdsCit7CisJVW5rbm93bjo6VW5rbm93bigpCisJeworCQlyZWZlcmVuY2VDb3VudCA9IDA7CisJCWJpbmRDb3VudCA9IDA7CisJfQorCisJVW5rbm93bjo6flVua25vd24oKQorCXsKKwkJQVNTRVJUKHJlZmVyZW5jZUNvdW50ID09IDApOworCQlBU1NFUlQoYmluZENvdW50ID09IDApOworCX0KKworCXZvaWQgVW5rbm93bjo6YWRkUmVmKCkKKwl7CisJCUludGVybG9ja2VkSW5jcmVtZW50KCZyZWZlcmVuY2VDb3VudCk7CisJfQorCisJdm9pZCBVbmtub3duOjpyZWxlYXNlKCkKKwl7CisJCWlmKHJlZmVyZW5jZUNvdW50ID4gMCkKKwkJeworCQkJSW50ZXJsb2NrZWREZWNyZW1lbnQoJnJlZmVyZW5jZUNvdW50KTsKKwkJfQorCisJCWlmKHJlZmVyZW5jZUNvdW50ID09IDAgJiYgYmluZENvdW50ID09IDApCisJCXsKKwkJCWRlbGV0ZSB0aGlzOworCQl9CisJfQorCisJdm9pZCBVbmtub3duOjpiaW5kKCkKKwl7CisJCUludGVybG9ja2VkSW5jcmVtZW50KCZiaW5kQ291bnQpOworCX0KKworCXZvaWQgVW5rbm93bjo6dW5iaW5kKCkKKwl7CisJCUFTU0VSVChiaW5kQ291bnQgPiAwKTsKKworCQlJbnRlcmxvY2tlZERlY3JlbWVudCgmYmluZENvdW50KTsKKworCQlpZihyZWZlcmVuY2VDb3VudCA9PSAwICYmIGJpbmRDb3VudCA9PSAwKQorCQl7CisJCQlkZWxldGUgdGhpczsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9Vbmtub3duLmhwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9Vbmtub3duLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM5MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1Vua25vd24uaHBwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIGR4X1Vua25vd25faHBwDQorI2RlZmluZSBkeF9Vbmtub3duX2hwcA0KKw0KK25hbWVzcGFjZSBnbA0KK3sNCisJY2xhc3MgVW5rbm93bg0KKwl7DQorCXB1YmxpYzoNCisJCVVua25vd24oKTsNCisNCisJCXZpcnR1YWwgdm9pZCBhZGRSZWYoKTsNCisJCXZpcnR1YWwgdm9pZCByZWxlYXNlKCk7DQorDQorCQl2aXJ0dWFsIHZvaWQgYmluZCgpOw0KKwkJdmlydHVhbCB2b2lkIHVuYmluZCgpOw0KKw0KKwlwcm90ZWN0ZWQ6DQorCQl2aXJ0dWFsIH5Vbmtub3duKCk7DQorDQorCXByaXZhdGU6DQorCQl2b2xhdGlsZSBsb25nIHJlZmVyZW5jZUNvdW50Ow0KKwkJdm9sYXRpbGUgbG9uZyBiaW5kQ291bnQ7DQorCX07DQorfQ0KKw0KKyNlbmRpZiAgIC8vIGR4X1Vua25vd25faHBwDQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1ZlcnRleERhdGFNYW5hZ2VyLmNwcCBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9WZXJ0ZXhEYXRhTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhYmY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9WZXJ0ZXhEYXRhTWFuYWdlci5jcHAKQEAgLTAsMCArMSwzNjAgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIFZlcnRleERhdGFNYW5hZ2VyLmg6IERlZmluZXMgdGhlIFZlcnRleERhdGFNYW5hZ2VyLCBhIGNsYXNzIHRoYXQKKy8vIHJ1bnMgdGhlIEJ1ZmZlciB0cmFuc2xhdGlvbiBwcm9jZXNzLgorCisjaW5jbHVkZSAiVmVydGV4RGF0YU1hbmFnZXIuaCIKKworI2luY2x1ZGUgIkJ1ZmZlci5oIgorI2luY2x1ZGUgIlByb2dyYW0uaCIKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiSW5kZXhEYXRhTWFuYWdlci5oIgorI2luY2x1ZGUgImNvbW1vbi9kZWJ1Zy5oIgorCituYW1lc3BhY2UKK3sKKyAgICBlbnVtIHtJTklUSUFMX1NUUkVBTV9CVUZGRVJfU0laRSA9IDEwMjQgKiAxMDI0fTsKK30KKworbmFtZXNwYWNlIGdsCit7CisKK1ZlcnRleERhdGFNYW5hZ2VyOjpWZXJ0ZXhEYXRhTWFuYWdlcihDb250ZXh0ICpjb250ZXh0LCBEZXZpY2UgKmRldmljZSkgOiBtQ29udGV4dChjb250ZXh0KSwgbURldmljZShkZXZpY2UpCit7CisgICAgZm9yKGludCBpID0gMDsgaSA8IE1BWF9WRVJURVhfQVRUUklCUzsgaSsrKQorICAgIHsKKyAgICAgICAgbURpcnR5Q3VycmVudFZhbHVlW2ldID0gdHJ1ZTsKKyAgICAgICAgbUN1cnJlbnRWYWx1ZUJ1ZmZlcltpXSA9IE5VTEw7CisgICAgfQorCisgICAgbVN0cmVhbWluZ0J1ZmZlciA9IG5ldyBTdHJlYW1pbmdWZXJ0ZXhCdWZmZXIobURldmljZSwgSU5JVElBTF9TVFJFQU1fQlVGRkVSX1NJWkUpOworCisgICAgaWYoIW1TdHJlYW1pbmdCdWZmZXIpCisgICAgeworICAgICAgICBFUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgc3RyZWFtaW5nIHZlcnRleCBidWZmZXIuIik7CisgICAgfQorfQorCitWZXJ0ZXhEYXRhTWFuYWdlcjo6flZlcnRleERhdGFNYW5hZ2VyKCkKK3sKKyAgICBkZWxldGUgbVN0cmVhbWluZ0J1ZmZlcjsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfVkVSVEVYX0FUVFJJQlM7IGkrKykKKyAgICB7CisgICAgICAgIGRlbGV0ZSBtQ3VycmVudFZhbHVlQnVmZmVyW2ldOworICAgIH0KK30KKworVUlOVCBWZXJ0ZXhEYXRhTWFuYWdlcjo6d3JpdGVBdHRyaWJ1dGVEYXRhKEFycmF5VmVydGV4QnVmZmVyICp2ZXJ0ZXhCdWZmZXIsIEdMaW50IHN0YXJ0LCBHTHNpemVpIGNvdW50LCBjb25zdCBWZXJ0ZXhBdHRyaWJ1dGUgJmF0dHJpYnV0ZSkKK3sKKyAgICBCdWZmZXIgKmJ1ZmZlciA9IGF0dHJpYnV0ZS5tQm91bmRCdWZmZXIuZ2V0KCk7CisKKyAgICBpbnQgaW5wdXRTdHJpZGUgPSBhdHRyaWJ1dGUuc3RyaWRlKCk7CisgICAgaW50IGVsZW1lbnRTaXplID0gYXR0cmlidXRlLnR5cGVTaXplKCk7CisgICAgVUlOVCBzdHJlYW1PZmZzZXQgPSAwOworCisgICAgY2hhciAqb3V0cHV0ID0gTlVMTDsKKyAgICAKKyAgICBpZih2ZXJ0ZXhCdWZmZXIpCisgICAgeworICAgICAgICBvdXRwdXQgPSAoY2hhciopdmVydGV4QnVmZmVyLT5tYXAoYXR0cmlidXRlLCBzcGFjZVJlcXVpcmVkKGF0dHJpYnV0ZSwgY291bnQpLCAmc3RyZWFtT2Zmc2V0KTsKKyAgICB9CisKKyAgICBpZihvdXRwdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEVSUigiRmFpbGVkIHRvIG1hcCB2ZXJ0ZXggYnVmZmVyLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqaW5wdXQgPSBOVUxMOworCisgICAgaWYoYnVmZmVyKQorICAgIHsKKyAgICAgICAgaW50IG9mZnNldCA9IGF0dHJpYnV0ZS5tT2Zmc2V0OworCisgICAgICAgIGlucHV0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlci0+ZGF0YSgpKSArIG9mZnNldDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW5wdXQgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oYXR0cmlidXRlLm1Qb2ludGVyKTsKKyAgICB9CisKKyAgICBpbnB1dCArPSBpbnB1dFN0cmlkZSAqIHN0YXJ0OworCisgICAgaWYoaW5wdXRTdHJpZGUgPT0gZWxlbWVudFNpemUpCisgICAgeworICAgICAgICBtZW1jcHkob3V0cHV0LCBpbnB1dCwgY291bnQgKiBpbnB1dFN0cmlkZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl7CisJCQltZW1jcHkob3V0cHV0LCBpbnB1dCwgZWxlbWVudFNpemUpOworCQkJb3V0cHV0ICs9IGVsZW1lbnRTaXplOworCQkJaW5wdXQgKz0gaW5wdXRTdHJpZGU7CisJCX0KKyAgICB9CisKKyAgICB2ZXJ0ZXhCdWZmZXItPnVubWFwKCk7CisKKyAgICByZXR1cm4gc3RyZWFtT2Zmc2V0OworfQorCitHTGVudW0gVmVydGV4RGF0YU1hbmFnZXI6OnByZXBhcmVWZXJ0ZXhEYXRhKEdMaW50IHN0YXJ0LCBHTHNpemVpIGNvdW50LCBUcmFuc2xhdGVkQXR0cmlidXRlICp0cmFuc2xhdGVkKQoreworICAgIGlmKCFtU3RyZWFtaW5nQnVmZmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEdMX09VVF9PRl9NRU1PUlk7CisgICAgfQorCisgICAgY29uc3QgVmVydGV4QXR0cmlidXRlQXJyYXkgJmF0dHJpYnMgPSBtQ29udGV4dC0+Z2V0VmVydGV4QXR0cmlidXRlcygpOworICAgIFByb2dyYW0gKnByb2dyYW0gPSBtQ29udGV4dC0+Z2V0Q3VycmVudFByb2dyYW0oKTsKKworICAgIGZvcihpbnQgYXR0cmlidXRlSW5kZXggPSAwOyBhdHRyaWJ1dGVJbmRleCA8IE1BWF9WRVJURVhfQVRUUklCUzsgYXR0cmlidXRlSW5kZXgrKykKKyAgICB7CisgICAgICAgIHRyYW5zbGF0ZWRbYXR0cmlidXRlSW5kZXhdLmFjdGl2ZSA9IChwcm9ncmFtLT5nZXRTZW1hbnRpY0luZGV4KGF0dHJpYnV0ZUluZGV4KSAhPSAtMSk7CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIHRoZSByZXF1aXJlZCBzdG9yYWdlIHNpemUgcGVyIHVzZWQgYnVmZmVyLCBhbmQgaW52YWxpZGF0ZSBzdGF0aWMgYnVmZmVycyB0aGF0IGRvbid0IGNvbnRhaW4gbWF0Y2hpbmcgYXR0cmlidXRlcworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfVkVSVEVYX0FUVFJJQlM7IGkrKykKKyAgICB7CisgICAgICAgIGlmKHRyYW5zbGF0ZWRbaV0uYWN0aXZlICYmIGF0dHJpYnNbaV0ubUFycmF5RW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIWF0dHJpYnNbaV0ubUJvdW5kQnVmZmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1TdHJlYW1pbmdCdWZmZXItPmFkZFJlcXVpcmVkU3BhY2Uoc3BhY2VSZXF1aXJlZChhdHRyaWJzW2ldLCBjb3VudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbVN0cmVhbWluZ0J1ZmZlci0+cmVzZXJ2ZVJlcXVpcmVkU3BhY2UoKTsKKyAgICAKKyAgICAvLyBQZXJmb3JtIHRoZSB2ZXJ0ZXggZGF0YSB0cmFuc2xhdGlvbnMKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1ZFUlRFWF9BVFRSSUJTOyBpKyspCisgICAgeworICAgICAgICBpZih0cmFuc2xhdGVkW2ldLmFjdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoYXR0cmlic1tpXS5tQXJyYXlFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ1ZmZlciAqYnVmZmVyID0gYXR0cmlic1tpXS5tQm91bmRCdWZmZXIuZ2V0KCk7CisKKyAgICAgICAgICAgICAgICBpZighYnVmZmVyICYmIGF0dHJpYnNbaV0ubVBvaW50ZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXBwbGljYXRpb24gZXJyb3IgdGhhdCB3b3VsZCBub3JtYWxseSByZXN1bHQgaW4gYSBjcmFzaCwgYnV0IHdlIGNhdGNoIGl0IGFuZCByZXR1cm4gYW4gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgRVJSKCJBbiBlbmFibGVkIHZlcnRleCBhcnJheSBoYXMgbm8gYnVmZmVyIGFuZCBubyBwb2ludGVyLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR0xfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3c6OlJlc291cmNlICpzdGF0aWNCdWZmZXIgPSBidWZmZXIgPyBidWZmZXItPmdldFJlc291cmNlKCkgOiBOVUxMOworCisgICAgICAgICAgICAgICAgaWYoc3RhdGljQnVmZmVyKQorICAgICAgICAgICAgICAgIHsKKwkJCQkJdHJhbnNsYXRlZFtpXS52ZXJ0ZXhCdWZmZXIgPSBzdGF0aWNCdWZmZXI7CisJCQkJCXRyYW5zbGF0ZWRbaV0ub2Zmc2V0ID0gc3RhcnQgKiBhdHRyaWJzW2ldLnN0cmlkZSgpICsgYXR0cmlic1tpXS5tT2Zmc2V0OworCQkJCQl0cmFuc2xhdGVkW2ldLnN0cmlkZSA9IGF0dHJpYnNbaV0uc3RyaWRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJTlQgc3RyZWFtT2Zmc2V0ID0gd3JpdGVBdHRyaWJ1dGVEYXRhKG1TdHJlYW1pbmdCdWZmZXIsIHN0YXJ0LCBjb3VudCwgYXR0cmlic1tpXSk7CisKKwkJCQkJaWYoc3RyZWFtT2Zmc2V0ID09IC0xKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gR0xfT1VUX09GX01FTU9SWTsKKwkJCQkJfQorCisJCQkJCXRyYW5zbGF0ZWRbaV0udmVydGV4QnVmZmVyID0gbVN0cmVhbWluZ0J1ZmZlci0+Z2V0UmVzb3VyY2UoKTsKKwkJCQkJdHJhbnNsYXRlZFtpXS5vZmZzZXQgPSBzdHJlYW1PZmZzZXQ7CisJCQkJCXRyYW5zbGF0ZWRbaV0uc3RyaWRlID0gYXR0cmlic1tpXS50eXBlU2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKworCQkJCXN3aXRjaChhdHRyaWJzW2ldLm1UeXBlKQorCQkJCXsKKwkJCQljYXNlIEdMX0JZVEU6ICAgICAgICAgICB0cmFuc2xhdGVkW2ldLnR5cGUgPSBzdzo6U1RSRUFNVFlQRV9TQllURTsgIGJyZWFrOworCQkJCWNhc2UgR0xfVU5TSUdORURfQllURTogIHRyYW5zbGF0ZWRbaV0udHlwZSA9IHN3OjpTVFJFQU1UWVBFX0JZVEU7ICAgYnJlYWs7CisJCQkJY2FzZSBHTF9TSE9SVDogICAgICAgICAgdHJhbnNsYXRlZFtpXS50eXBlID0gc3c6OlNUUkVBTVRZUEVfU0hPUlQ7ICBicmVhazsKKwkJCQljYXNlIEdMX1VOU0lHTkVEX1NIT1JUOiB0cmFuc2xhdGVkW2ldLnR5cGUgPSBzdzo6U1RSRUFNVFlQRV9VU0hPUlQ7IGJyZWFrOworCQkJCWNhc2UgR0xfRklYRUQ6ICAgICAgICAgIHRyYW5zbGF0ZWRbaV0udHlwZSA9IHN3OjpTVFJFQU1UWVBFX0ZJWEVEOyAgYnJlYWs7CisJCQkJY2FzZSBHTF9GTE9BVDogICAgICAgICAgdHJhbnNsYXRlZFtpXS50eXBlID0gc3c6OlNUUkVBTVRZUEVfRkxPQVQ7ICBicmVhazsKKwkJCQlkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOyB0cmFuc2xhdGVkW2ldLnR5cGUgPSBzdzo6U1RSRUFNVFlQRV9GTE9BVDsgIGJyZWFrOworCQkJCX0KKworCQkJCXRyYW5zbGF0ZWRbaV0uY291bnQgPSBhdHRyaWJzW2ldLm1TaXplOworCQkJCXRyYW5zbGF0ZWRbaV0ubm9ybWFsaXplZCA9IGF0dHJpYnNbaV0ubU5vcm1hbGl6ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYobURpcnR5Q3VycmVudFZhbHVlW2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1DdXJyZW50VmFsdWVCdWZmZXJbaV07CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVCdWZmZXJbaV0gPSBuZXcgQ29uc3RhbnRWZXJ0ZXhCdWZmZXIobURldmljZSwgYXR0cmlic1tpXS5tQ3VycmVudFZhbHVlWzBdLCBhdHRyaWJzW2ldLm1DdXJyZW50VmFsdWVbMV0sIGF0dHJpYnNbaV0ubUN1cnJlbnRWYWx1ZVsyXSwgYXR0cmlic1tpXS5tQ3VycmVudFZhbHVlWzNdKTsKKyAgICAgICAgICAgICAgICAgICAgbURpcnR5Q3VycmVudFZhbHVlW2ldID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJhbnNsYXRlZFtpXS52ZXJ0ZXhCdWZmZXIgPSBtQ3VycmVudFZhbHVlQnVmZmVyW2ldLT5nZXRSZXNvdXJjZSgpOworCisgICAgICAgICAgICAgICAgdHJhbnNsYXRlZFtpXS50eXBlID0gc3c6OlNUUkVBTVRZUEVfRkxPQVQ7CisJCQkJdHJhbnNsYXRlZFtpXS5jb3VudCA9IDQ7CisgICAgICAgICAgICAgICAgdHJhbnNsYXRlZFtpXS5zdHJpZGUgPSAwOworICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRbaV0ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBHTF9OT19FUlJPUjsKK30KKworc3RkOjpzaXplX3QgVmVydGV4RGF0YU1hbmFnZXI6OnNwYWNlUmVxdWlyZWQoY29uc3QgVmVydGV4QXR0cmlidXRlICZhdHRyaWIsIHN0ZDo6c2l6ZV90IGNvdW50KSBjb25zdAoreworCXJldHVybiBhdHRyaWIudHlwZVNpemUoKSAqIGNvdW50OworfQorCitWZXJ0ZXhCdWZmZXI6OlZlcnRleEJ1ZmZlcihEZXZpY2UgKmRldmljZSwgc3RkOjpzaXplX3Qgc2l6ZSkgOiBtRGV2aWNlKGRldmljZSksIG1WZXJ0ZXhCdWZmZXIoTlVMTCkKK3sKKyAgICBpZihzaXplID4gMCkKKyAgICB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXIgPSBuZXcgc3c6OlJlc291cmNlKHNpemUgKyAxMDI0KTsKKyAgICAgICAgCisgICAgICAgIGlmKCFtVmVydGV4QnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBFUlIoIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBhIHZlcnRleCBidWZmZXIgb2Ygc2l6ZSAlbHUuIiwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1ZlcnRleEJ1ZmZlcjo6flZlcnRleEJ1ZmZlcigpCit7CisgICAgaWYobVZlcnRleEJ1ZmZlcikKKyAgICB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXItPmRlc3RydWN0KCk7CisgICAgfQorfQorCit2b2lkIFZlcnRleEJ1ZmZlcjo6dW5tYXAoKQoreworICAgIGlmKG1WZXJ0ZXhCdWZmZXIpCisgICAgeworCQltVmVydGV4QnVmZmVyLT51bmxvY2soKTsKKyAgICB9Cit9CisKK3N3OjpSZXNvdXJjZSAqVmVydGV4QnVmZmVyOjpnZXRSZXNvdXJjZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1WZXJ0ZXhCdWZmZXI7Cit9CisKK0NvbnN0YW50VmVydGV4QnVmZmVyOjpDb25zdGFudFZlcnRleEJ1ZmZlcihEZXZpY2UgKmRldmljZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdykgOiBWZXJ0ZXhCdWZmZXIoZGV2aWNlLCA0ICogc2l6ZW9mKGZsb2F0KSkKK3sKKyAgICB2b2lkICpidWZmZXIgPSBOVUxMOworCisgICAgaWYobVZlcnRleEJ1ZmZlcikKKyAgICB7CisJCWJ1ZmZlciA9IG1WZXJ0ZXhCdWZmZXItPmxvY2soc3c6OlBVQkxJQyk7CisgICAgIAorICAgICAgICBpZighYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBFUlIoIkxvY2sgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihidWZmZXIpCisgICAgeworICAgICAgICBmbG9hdCAqdmVjdG9yID0gKGZsb2F0KilidWZmZXI7CisKKyAgICAgICAgdmVjdG9yWzBdID0geDsKKyAgICAgICAgdmVjdG9yWzFdID0geTsKKyAgICAgICAgdmVjdG9yWzJdID0gejsKKyAgICAgICAgdmVjdG9yWzNdID0gdzsKKworICAgICAgICBtVmVydGV4QnVmZmVyLT51bmxvY2soKTsKKyAgICB9Cit9CisKK0NvbnN0YW50VmVydGV4QnVmZmVyOjp+Q29uc3RhbnRWZXJ0ZXhCdWZmZXIoKQoreworfQorCitBcnJheVZlcnRleEJ1ZmZlcjo6QXJyYXlWZXJ0ZXhCdWZmZXIoRGV2aWNlICpkZXZpY2UsIHN0ZDo6c2l6ZV90IHNpemUpIDogVmVydGV4QnVmZmVyKGRldmljZSwgc2l6ZSkKK3sKKyAgICBtQnVmZmVyU2l6ZSA9IHNpemU7CisgICAgbVdyaXRlUG9zaXRpb24gPSAwOworICAgIG1SZXF1aXJlZFNwYWNlID0gMDsKK30KKworQXJyYXlWZXJ0ZXhCdWZmZXI6On5BcnJheVZlcnRleEJ1ZmZlcigpCit7Cit9CisKK3ZvaWQgQXJyYXlWZXJ0ZXhCdWZmZXI6OmFkZFJlcXVpcmVkU3BhY2UoVUlOVCByZXF1aXJlZFNwYWNlKQoreworICAgIG1SZXF1aXJlZFNwYWNlICs9IHJlcXVpcmVkU3BhY2U7Cit9CisKK1N0cmVhbWluZ1ZlcnRleEJ1ZmZlcjo6U3RyZWFtaW5nVmVydGV4QnVmZmVyKERldmljZSAqZGV2aWNlLCBzdGQ6OnNpemVfdCBpbml0aWFsU2l6ZSkgOiBBcnJheVZlcnRleEJ1ZmZlcihkZXZpY2UsIGluaXRpYWxTaXplKQoreworfQorCitTdHJlYW1pbmdWZXJ0ZXhCdWZmZXI6On5TdHJlYW1pbmdWZXJ0ZXhCdWZmZXIoKQoreworfQorCit2b2lkICpTdHJlYW1pbmdWZXJ0ZXhCdWZmZXI6Om1hcChjb25zdCBWZXJ0ZXhBdHRyaWJ1dGUgJmF0dHJpYnV0ZSwgc3RkOjpzaXplX3QgcmVxdWlyZWRTcGFjZSwgc3RkOjpzaXplX3QgKm9mZnNldCkKK3sKKyAgICB2b2lkICptYXBQdHIgPSBOVUxMOworCisgICAgaWYobVZlcnRleEJ1ZmZlcikKKyAgICB7CisJCW1hcFB0ciA9IChjaGFyKiltVmVydGV4QnVmZmVyLT5sb2NrKHN3OjpQVUJMSUMpICsgbVdyaXRlUG9zaXRpb247CisgICAgICAgIAorICAgICAgICBpZighbWFwUHRyKQorICAgICAgICB7CisgICAgICAgICAgICBFUlIoIkxvY2sgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgICpvZmZzZXQgPSBtV3JpdGVQb3NpdGlvbjsKKyAgICAgICAgbVdyaXRlUG9zaXRpb24gKz0gcmVxdWlyZWRTcGFjZTsKKyAgICB9CisKKyAgICByZXR1cm4gbWFwUHRyOworfQorCit2b2lkIFN0cmVhbWluZ1ZlcnRleEJ1ZmZlcjo6cmVzZXJ2ZVJlcXVpcmVkU3BhY2UoKQoreworICAgIGlmKG1SZXF1aXJlZFNwYWNlID4gbUJ1ZmZlclNpemUpCisgICAgeworICAgICAgICBpZihtVmVydGV4QnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBtVmVydGV4QnVmZmVyLT5kZXN0cnVjdCgpOworICAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtQnVmZmVyU2l6ZSA9IHN0ZDo6bWF4KG1SZXF1aXJlZFNwYWNlLCAzICogbUJ1ZmZlclNpemUgLyAyKTsgICAvLyAxLjUgeCBtQnVmZmVyU2l6ZSBpcyBhcmJpdHJhcnkgYW5kIHNob3VsZCBiZSBjaGVja2VkIHRvIHNlZSB3ZSBkb24ndCBoYXZlIHRvbyBtYW55IHJlYWxsb2NhdGlvbnMuCisKKwkJbVZlcnRleEJ1ZmZlciA9IG5ldyBzdzo6UmVzb3VyY2UobUJ1ZmZlclNpemUpOworICAgIAorICAgICAgICBpZighbVZlcnRleEJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgRVJSKCJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYSB2ZXJ0ZXggYnVmZmVyIG9mIHNpemUgJWx1LiIsIG1CdWZmZXJTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Xcml0ZVBvc2l0aW9uID0gMDsKKyAgICB9CisgICAgZWxzZSBpZihtV3JpdGVQb3NpdGlvbiArIG1SZXF1aXJlZFNwYWNlID4gbUJ1ZmZlclNpemUpICAgLy8gUmVjeWNsZQorICAgIHsKKyAgICAgICAgaWYobVZlcnRleEJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgbVZlcnRleEJ1ZmZlci0+ZGVzdHJ1Y3QoKTsKKwkJCW1WZXJ0ZXhCdWZmZXIgPSBuZXcgc3c6OlJlc291cmNlKG1CdWZmZXJTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Xcml0ZVBvc2l0aW9uID0gMDsKKyAgICB9CisKKyAgICBtUmVxdWlyZWRTcGFjZSA9IDA7Cit9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9WZXJ0ZXhEYXRhTWFuYWdlci5oIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL1ZlcnRleERhdGFNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlYmMzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9WZXJ0ZXhEYXRhTWFuYWdlci5oCkBAIC0wLDAgKzEsMTE4IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBWZXJ0ZXhEYXRhTWFuYWdlci5oOiBEZWZpbmVzIHRoZSBWZXJ0ZXhEYXRhTWFuYWdlciwgYSBjbGFzcyB0aGF0CisvLyBydW5zIHRoZSBCdWZmZXIgdHJhbnNsYXRpb24gcHJvY2Vzcy4KKworI2lmbmRlZiBMSUJHTEVTVjJfVkVSVEVYREFUQU1BTkFHRVJfSF8KKyNkZWZpbmUgTElCR0xFU1YyX1ZFUlRFWERBVEFNQU5BR0VSX0hfCisKKyNpbmNsdWRlICJDb250ZXh0LmgiCisjaW5jbHVkZSAiRGV2aWNlLmhwcCIKKworI2RlZmluZSBHTF9BUElDQUxMCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGdsCit7CisKK3N0cnVjdCBUcmFuc2xhdGVkQXR0cmlidXRlCit7CisgICAgYm9vbCBhY3RpdmU7CisKKyAgICBzdzo6U3RyZWFtVHlwZSB0eXBlOworCWludCBjb3VudDsKKwlib29sIG5vcm1hbGl6ZWQ7CisKKyAgICBVSU5UIG9mZnNldDsKKyAgICBVSU5UIHN0cmlkZTsgICAvLyAwIG1lYW5zIG5vdCB0byBhZHZhbmNlIHRoZSByZWFkIHBvaW50ZXIgYXQgYWxsCisKKyAgICBzdzo6UmVzb3VyY2UgKnZlcnRleEJ1ZmZlcjsKK307CisKK2NsYXNzIFZlcnRleEJ1ZmZlcgoreworICBwdWJsaWM6CisgICAgVmVydGV4QnVmZmVyKERldmljZSAqZGV2aWNlLCBVSU5UIHNpemUpOworICAgIHZpcnR1YWwgflZlcnRleEJ1ZmZlcigpOworCisgICAgdm9pZCB1bm1hcCgpOworCisgICAgc3c6OlJlc291cmNlICpnZXRSZXNvdXJjZSgpIGNvbnN0OworCisgIHByb3RlY3RlZDoKKyAgICBEZXZpY2UgKmNvbnN0IG1EZXZpY2U7CisgICAgc3c6OlJlc291cmNlICptVmVydGV4QnVmZmVyOworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZlcnRleEJ1ZmZlcik7Cit9OworCitjbGFzcyBDb25zdGFudFZlcnRleEJ1ZmZlciA6IHB1YmxpYyBWZXJ0ZXhCdWZmZXIKK3sKKyAgcHVibGljOgorICAgIENvbnN0YW50VmVydGV4QnVmZmVyKERldmljZSAqZGV2aWNlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3KTsKKyAgICB+Q29uc3RhbnRWZXJ0ZXhCdWZmZXIoKTsKK307CisKK2NsYXNzIEFycmF5VmVydGV4QnVmZmVyIDogcHVibGljIFZlcnRleEJ1ZmZlcgoreworICBwdWJsaWM6CisgICAgQXJyYXlWZXJ0ZXhCdWZmZXIoRGV2aWNlICpkZXZpY2UsIFVJTlQgc2l6ZSk7CisgICAgfkFycmF5VmVydGV4QnVmZmVyKCk7CisKKyAgICBVSU5UIHNpemUoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQorICAgIHZpcnR1YWwgdm9pZCAqbWFwKGNvbnN0IFZlcnRleEF0dHJpYnV0ZSAmYXR0cmlidXRlLCBVSU5UIHJlcXVpcmVkU3BhY2UsIFVJTlQgKnN0cmVhbU9mZnNldCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZXNlcnZlUmVxdWlyZWRTcGFjZSgpID0gMDsKKyAgICB2b2lkIGFkZFJlcXVpcmVkU3BhY2UoVUlOVCByZXF1aXJlZFNwYWNlKTsKKworICBwcm90ZWN0ZWQ6CisgICAgVUlOVCBtQnVmZmVyU2l6ZTsKKyAgICBVSU5UIG1Xcml0ZVBvc2l0aW9uOworICAgIFVJTlQgbVJlcXVpcmVkU3BhY2U7Cit9OworCitjbGFzcyBTdHJlYW1pbmdWZXJ0ZXhCdWZmZXIgOiBwdWJsaWMgQXJyYXlWZXJ0ZXhCdWZmZXIKK3sKKyAgcHVibGljOgorICAgIFN0cmVhbWluZ1ZlcnRleEJ1ZmZlcihEZXZpY2UgKmRldmljZSwgVUlOVCBpbml0aWFsU2l6ZSk7CisgICAgflN0cmVhbWluZ1ZlcnRleEJ1ZmZlcigpOworCisgICAgdm9pZCAqbWFwKGNvbnN0IFZlcnRleEF0dHJpYnV0ZSAmYXR0cmlidXRlLCBVSU5UIHJlcXVpcmVkU3BhY2UsIFVJTlQgKnN0cmVhbU9mZnNldCk7CisgICAgdm9pZCByZXNlcnZlUmVxdWlyZWRTcGFjZSgpOworfTsKKworY2xhc3MgVmVydGV4RGF0YU1hbmFnZXIKK3sKKyAgcHVibGljOgorICAgIFZlcnRleERhdGFNYW5hZ2VyKENvbnRleHQgKmNvbnRleHQsIERldmljZSAqYmFja2VuZCk7CisgICAgdmlydHVhbCB+VmVydGV4RGF0YU1hbmFnZXIoKTsKKworICAgIHZvaWQgZGlydHlDdXJyZW50VmFsdWUoaW50IGluZGV4KSB7IG1EaXJ0eUN1cnJlbnRWYWx1ZVtpbmRleF0gPSB0cnVlOyB9CisKKyAgICBHTGVudW0gcHJlcGFyZVZlcnRleERhdGEoR0xpbnQgc3RhcnQsIEdMc2l6ZWkgY291bnQsIFRyYW5zbGF0ZWRBdHRyaWJ1dGUgKm91dEF0dHJpYnMpOworCisgIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZlcnRleERhdGFNYW5hZ2VyKTsKKworICAgIFVJTlQgc3BhY2VSZXF1aXJlZChjb25zdCBWZXJ0ZXhBdHRyaWJ1dGUgJmF0dHJpYiwgc3RkOjpzaXplX3QgY291bnQpIGNvbnN0OworICAgIFVJTlQgd3JpdGVBdHRyaWJ1dGVEYXRhKEFycmF5VmVydGV4QnVmZmVyICp2ZXJ0ZXhCdWZmZXIsIEdMaW50IHN0YXJ0LCBHTHNpemVpIGNvdW50LCBjb25zdCBWZXJ0ZXhBdHRyaWJ1dGUgJmF0dHJpYnV0ZSk7CisKKyAgICBDb250ZXh0ICpjb25zdCBtQ29udGV4dDsKKyAgICBEZXZpY2UgKmNvbnN0IG1EZXZpY2U7CisKKyAgICBTdHJlYW1pbmdWZXJ0ZXhCdWZmZXIgKm1TdHJlYW1pbmdCdWZmZXI7CisKKyAgICBib29sIG1EaXJ0eUN1cnJlbnRWYWx1ZVtNQVhfVkVSVEVYX0FUVFJJQlNdOworICAgIENvbnN0YW50VmVydGV4QnVmZmVyICptQ3VycmVudFZhbHVlQnVmZmVyW01BWF9WRVJURVhfQVRUUklCU107Cit9OworCit9CisKKyNlbmRpZiAgIC8vIExJQkdMRVNWMl9WRVJURVhEQVRBTUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL2xpYkdMRVN2Mi5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvbGliR0xFU3YyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTlmYjBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL2xpYkdMRVN2Mi5jcHAKQEAgLTAsMCArMSw1NjM0IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBsaWJHTEVTdjIuY3BwOiBJbXBsZW1lbnRzIHRoZSBleHBvcnRlZCBPcGVuR0wgRVMgMi4wIGZ1bmN0aW9ucy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJtYXRodXRpbC5oIgorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkJ1ZmZlci5oIgorI2luY2x1ZGUgIkNvbnRleHQuaCIKKyNpbmNsdWRlICJGZW5jZS5oIgorI2luY2x1ZGUgIkZyYW1lYnVmZmVyLmgiCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorI2luY2x1ZGUgIlJlbmRlcmJ1ZmZlci5oIgorI2luY2x1ZGUgIlNoYWRlci5oIgorI2luY2x1ZGUgIlRleHR1cmUuaCIKKyNpbmNsdWRlICJjb21tb24vZGVidWcuaCIKKyNpbmNsdWRlICJjb21tb24vdmVyc2lvbi5oIgorCisjZGVmaW5lIEdMX0FQSUNBTEwKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxsaW1pdHM+CisKK2Jvb2wgdmFsaWRJbWFnZVNpemUoR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQoreworICAgIGlmKGxldmVsIDwgMCB8fCB3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIgoreworCit2b2lkIF9fc3RkY2FsbCBnbEFjdGl2ZVRleHR1cmUoR0xlbnVtIHRleHR1cmUpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGV4dHVyZSA9IDB4JVgpIiwgdGV4dHVyZSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZih0ZXh0dXJlIDwgR0xfVEVYVFVSRTAgfHwgdGV4dHVyZSA+IEdMX1RFWFRVUkUwICsgZ2w6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIC0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC0+c2V0QWN0aXZlU2FtcGxlcih0ZXh0dXJlIC0gR0xfVEVYVFVSRTApOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsQXR0YWNoU2hhZGVyKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKQoreworICAgIFRSQUNFKCIoR0x1aW50IHByb2dyYW0gPSAlZCwgR0x1aW50IHNoYWRlciA9ICVkKSIsIHByb2dyYW0sIHNoYWRlcik7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6UHJvZ3JhbSAqcHJvZ3JhbU9iamVjdCA9IGNvbnRleHQtPmdldFByb2dyYW0ocHJvZ3JhbSk7CisgICAgICAgICAgICBnbDo6U2hhZGVyICpzaGFkZXJPYmplY3QgPSBjb250ZXh0LT5nZXRTaGFkZXIoc2hhZGVyKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0U2hhZGVyKHByb2dyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIXNoYWRlck9iamVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihjb250ZXh0LT5nZXRQcm9ncmFtKHNoYWRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighcHJvZ3JhbU9iamVjdC0+YXR0YWNoU2hhZGVyKHNoYWRlck9iamVjdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEJpbmRBdHRyaWJMb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXIqIG5hbWUpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgcHJvZ3JhbSA9ICVkLCBHTHVpbnQgaW5kZXggPSAlZCwgY29uc3QgR0xjaGFyKiBuYW1lID0gMHglMC44cCkiLCBwcm9ncmFtLCBpbmRleCwgbmFtZSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGluZGV4ID49IGdsOjpNQVhfVkVSVEVYX0FUVFJJQlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6UHJvZ3JhbSAqcHJvZ3JhbU9iamVjdCA9IGNvbnRleHQtPmdldFByb2dyYW0ocHJvZ3JhbSk7CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtT2JqZWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGNvbnRleHQtPmdldFNoYWRlcihwcm9ncmFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHN0cm5jbXAobmFtZSwgImdsXyIsIDMpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvZ3JhbU9iamVjdC0+YmluZEF0dHJpYnV0ZUxvY2F0aW9uKGluZGV4LCBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEJpbmRCdWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYLCBHTHVpbnQgYnVmZmVyID0gJWQpIiwgdGFyZ2V0LCBidWZmZXIpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0YXJnZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQVJSQVlfQlVGRkVSOgorICAgICAgICAgICAgICAgIGNvbnRleHQtPmJpbmRBcnJheUJ1ZmZlcihidWZmZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgY2FzZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUjoKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5iaW5kRWxlbWVudEFycmF5QnVmZmVyKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsQmluZEZyYW1lYnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcikKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYLCBHTHVpbnQgZnJhbWVidWZmZXIgPSAlZCkiLCB0YXJnZXQsIGZyYW1lYnVmZmVyKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYodGFyZ2V0ICE9IEdMX0ZSQU1FQlVGRkVSICYmIHRhcmdldCAhPSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0FOR0xFICYmIHRhcmdldCAhPSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0FOR0xFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZih0YXJnZXQgPT0gR0xfUkVBRF9GUkFNRUJVRkZFUl9BTkdMRSB8fCB0YXJnZXQgPT0gR0xfRlJBTUVCVUZGRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC0+YmluZFJlYWRGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKHRhcmdldCA9PSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0FOR0xFIHx8IHRhcmdldCA9PSBHTF9GUkFNRUJVRkZFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5iaW5kRHJhd0ZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEJpbmRSZW5kZXJidWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYLCBHTHVpbnQgcmVuZGVyYnVmZmVyID0gJWQpIiwgdGFyZ2V0LCByZW5kZXJidWZmZXIpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZih0YXJnZXQgIT0gR0xfUkVOREVSQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LT5iaW5kUmVuZGVyYnVmZmVyKHJlbmRlcmJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xCaW5kVGV4dHVyZShHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSkKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYLCBHTHVpbnQgdGV4dHVyZSA9ICVkKSIsIHRhcmdldCwgdGV4dHVyZSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6VGV4dHVyZSAqdGV4dHVyZU9iamVjdCA9IGNvbnRleHQtPmdldFRleHR1cmUodGV4dHVyZSk7CisKKyAgICAgICAgICAgIGlmKHRleHR1cmVPYmplY3QgJiYgdGV4dHVyZU9iamVjdC0+Z2V0VGFyZ2V0KCkgIT0gdGFyZ2V0ICYmIHRleHR1cmUgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHRhcmdldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFXzJEOgorICAgICAgICAgICAgICAgIGNvbnRleHQtPmJpbmRUZXh0dXJlMkQodGV4dHVyZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVA6CisgICAgICAgICAgICAgICAgY29udGV4dC0+YmluZFRleHR1cmVDdWJlTWFwKHRleHR1cmUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEJsZW5kQ29sb3IoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpCit7CisgICAgVFJBQ0UoIihHTGNsYW1wZiByZWQgPSAlZiwgR0xjbGFtcGYgZ3JlZW4gPSAlZiwgR0xjbGFtcGYgYmx1ZSA9ICVmLCBHTGNsYW1wZiBhbHBoYSA9ICVmKSIsCisgICAgICAgICAgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCogY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC0+c2V0QmxlbmRDb2xvcihnbDo6Y2xhbXAwMShyZWQpLCBnbDo6Y2xhbXAwMShncmVlbiksIGdsOjpjbGFtcDAxKGJsdWUpLCBnbDo6Y2xhbXAwMShhbHBoYSkpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsQmxlbmRFcXVhdGlvbihHTGVudW0gbW9kZSkKK3sKKyAgICBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZShtb2RlLCBtb2RlKTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpCit7CisgICAgVFJBQ0UoIihHTGVudW0gbW9kZVJHQiA9IDB4JVgsIEdMZW51bSBtb2RlQWxwaGEgPSAweCVYKSIsIG1vZGVSR0IsIG1vZGVBbHBoYSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobW9kZVJHQikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfRlVOQ19BREQ6CisgICAgICAgICAgY2FzZSBHTF9GVU5DX1NVQlRSQUNUOgorICAgICAgICAgIGNhc2UgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtb2RlQWxwaGEpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX0ZVTkNfQUREOgorICAgICAgICAgIGNhc2UgR0xfRlVOQ19TVUJUUkFDVDoKKyAgICAgICAgICBjYXNlIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LT5zZXRCbGVuZEVxdWF0aW9uKG1vZGVSR0IsIG1vZGVBbHBoYSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xCbGVuZEZ1bmMoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKQoreworICAgIGdsQmxlbmRGdW5jU2VwYXJhdGUoc2ZhY3RvciwgZGZhY3Rvciwgc2ZhY3RvciwgZGZhY3Rvcik7Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsQmxlbmRGdW5jU2VwYXJhdGUoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpCit7CisgICAgVFJBQ0UoIihHTGVudW0gc3JjUkdCID0gMHglWCwgR0xlbnVtIGRzdFJHQiA9IDB4JVgsIEdMZW51bSBzcmNBbHBoYSA9IDB4JVgsIEdMZW51bSBkc3RBbHBoYSA9IDB4JVgpIiwKKyAgICAgICAgICBzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzcmNSR0IpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX1pFUk86CisgICAgICAgICAgY2FzZSBHTF9PTkU6CisgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6CisgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfRFNUX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX0RTVF9DT0xPUjoKKyAgICAgICAgICBjYXNlIEdMX1NSQ19BTFBIQToKKyAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9EU1RfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOgorICAgICAgICAgIGNhc2UgR0xfQ09OU1RBTlRfQ09MT1I6CisgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1I6CisgICAgICAgICAgY2FzZSBHTF9DT05TVEFOVF9BTFBIQToKKyAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQToKKyAgICAgICAgICBjYXNlIEdMX1NSQ19BTFBIQV9TQVRVUkFURToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZHN0UkdCKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9aRVJPOgorICAgICAgICAgIGNhc2UgR0xfT05FOgorICAgICAgICAgIGNhc2UgR0xfU1JDX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgICAgICAgICBjYXNlIEdMX0RTVF9DT0xPUjoKKyAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICAgICAgY2FzZSBHTF9TUkNfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICAgIGNhc2UgR0xfRFNUX0FMUEhBOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgICBjYXNlIEdMX0NPTlNUQU5UX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfQ09OU1RBTlRfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHNyY0FscGhhKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9aRVJPOgorICAgICAgICAgIGNhc2UgR0xfT05FOgorICAgICAgICAgIGNhc2UgR0xfU1JDX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgICAgICAgICBjYXNlIEdMX0RTVF9DT0xPUjoKKyAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICAgICAgY2FzZSBHTF9TUkNfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICAgIGNhc2UgR0xfRFNUX0FMUEhBOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgICBjYXNlIEdMX0NPTlNUQU5UX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfQ09OU1RBTlRfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGRzdEFscGhhKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9aRVJPOgorICAgICAgICAgIGNhc2UgR0xfT05FOgorICAgICAgICAgIGNhc2UgR0xfU1JDX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgICAgICAgICBjYXNlIEdMX0RTVF9DT0xPUjoKKyAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICAgICAgY2FzZSBHTF9TUkNfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICAgIGNhc2UgR0xfRFNUX0FMUEhBOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgICBjYXNlIEdMX0NPTlNUQU5UX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOgorICAgICAgICAgIGNhc2UgR0xfQ09OU1RBTlRfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC0+c2V0QmxlbmRGYWN0b3JzKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsQnVmZmVyRGF0YShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKQoreworICAgIFRSQUNFKCIoR0xlbnVtIHRhcmdldCA9IDB4JVgsIEdMc2l6ZWlwdHIgc2l6ZSA9ICVkLCBjb25zdCBHTHZvaWQqIGRhdGEgPSAweCUwLjhwLCBHTGVudW0gdXNhZ2UgPSAlZCkiLAorICAgICAgICAgIHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihzaXplIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh1c2FnZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfU1RSRUFNX0RSQVc6CisgICAgICAgICAgY2FzZSBHTF9TVEFUSUNfRFJBVzoKKyAgICAgICAgICBjYXNlIEdMX0RZTkFNSUNfRFJBVzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgICAgIHN3aXRjaCAodGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX0FSUkFZX0JVRkZFUjoKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjb250ZXh0LT5nZXRBcnJheUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSOgorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNvbnRleHQtPmdldEVsZW1lbnRBcnJheUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighYnVmZmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlci0+YnVmZmVyRGF0YShkYXRhLCBzaXplLCB1c2FnZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xCdWZmZXJTdWJEYXRhKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xpbnRwdHIgb2Zmc2V0ID0gJWQsIEdMc2l6ZWlwdHIgc2l6ZSA9ICVkLCBjb25zdCBHTHZvaWQqIGRhdGEgPSAweCUwLjhwKSIsCisgICAgICAgICAgdGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihzaXplIDwgMCB8fCBvZmZzZXQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBpZihkYXRhID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgICAgIHN3aXRjaCAodGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX0FSUkFZX0JVRkZFUjoKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjb250ZXh0LT5nZXRBcnJheUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSOgorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNvbnRleHQtPmdldEVsZW1lbnRBcnJheUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighYnVmZmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKChzaXplX3Qpc2l6ZSArIG9mZnNldCA+IGJ1ZmZlci0+c2l6ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyLT5idWZmZXJTdWJEYXRhKGRhdGEsIHNpemUsIG9mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKworR0xlbnVtIF9fc3RkY2FsbCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xlbnVtIHRhcmdldCkKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYKSIsIHRhcmdldCk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKHRhcmdldCAhPSBHTF9GUkFNRUJVRkZFUiAmJiB0YXJnZXQgIT0gR0xfRFJBV19GUkFNRUJVRkZFUl9BTkdMRSAmJiB0YXJnZXQgIT0gR0xfUkVBRF9GUkFNRUJVRkZFUl9BTkdMRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OkZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBpZih0YXJnZXQgPT0gR0xfUkVBRF9GUkFNRUJVRkZFUl9BTkdMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciA9IGNvbnRleHQtPmdldFJlYWRGcmFtZWJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyID0gY29udGV4dC0+Z2V0RHJhd0ZyYW1lYnVmZmVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmcmFtZWJ1ZmZlci0+Y29tcGxldGVuZXNzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlksIDApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIF9fc3RkY2FsbCBnbENsZWFyKEdMYml0ZmllbGQgbWFzaykKK3sKKyAgICBUUkFDRSgiKEdMYml0ZmllbGQgbWFzayA9ICVYKSIsIG1hc2spOworCisgICAgdHJ5CisgICAgeworCQlpZigobWFzayAmIH4oR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQpKSAhPSAwKQorCQl7CisJCQlyZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisJCX0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC0+Y2xlYXIobWFzayk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xDbGVhckNvbG9yKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKQoreworICAgIFRSQUNFKCIoR0xjbGFtcGYgcmVkID0gJWYsIEdMY2xhbXBmIGdyZWVuID0gJWYsIEdMY2xhbXBmIGJsdWUgPSAlZiwgR0xjbGFtcGYgYWxwaGEgPSAlZikiLAorICAgICAgICAgIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnNldENsZWFyQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsQ2xlYXJEZXB0aGYoR0xjbGFtcGYgZGVwdGgpCit7CisgICAgVFJBQ0UoIihHTGNsYW1wZiBkZXB0aCA9ICVmKSIsIGRlcHRoKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnNldENsZWFyRGVwdGgoZGVwdGgpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsQ2xlYXJTdGVuY2lsKEdMaW50IHMpCit7CisgICAgVFJBQ0UoIihHTGludCBzID0gJWQpIiwgcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LT5zZXRDbGVhclN0ZW5jaWwocyk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xDb2xvck1hc2soR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKQoreworICAgIFRSQUNFKCIoR0xib29sZWFuIHJlZCA9ICVkLCBHTGJvb2xlYW4gZ3JlZW4gPSAlZCwgR0xib29sZWFuIGJsdWUgPSAlZCwgR0xib29sZWFuIGFscGhhID0gJWQpIiwKKyAgICAgICAgICByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LT5zZXRDb2xvck1hc2socmVkID09IEdMX1RSVUUsIGdyZWVuID09IEdMX1RSVUUsIGJsdWUgPT0gR0xfVFJVRSwgYWxwaGEgPT0gR0xfVFJVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xDb21waWxlU2hhZGVyKEdMdWludCBzaGFkZXIpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgc2hhZGVyID0gJWQpIiwgc2hhZGVyKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpTaGFkZXIgKnNoYWRlck9iamVjdCA9IGNvbnRleHQtPmdldFNoYWRlcihzaGFkZXIpOworCisgICAgICAgICAgICBpZighc2hhZGVyT2JqZWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGNvbnRleHQtPmdldFByb2dyYW0oc2hhZGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNoYWRlck9iamVjdC0+Y29tcGlsZSgpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsQ29tcHJlc3NlZFRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xpbnQgbGV2ZWwgPSAlZCwgR0xlbnVtIGludGVybmFsZm9ybWF0ID0gMHglWCwgR0xzaXplaSB3aWR0aCA9ICVkLCAiIAorICAgICAgICAgICJHTHNpemVpIGhlaWdodCA9ICVkLCBHTGludCBib3JkZXIgPSAlZCwgR0xzaXplaSBpbWFnZVNpemUgPSAlZCwgY29uc3QgR0x2b2lkKiBkYXRhID0gMHglMC44cCkiLAorICAgICAgICAgIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGltYWdlU2l6ZSwgZGF0YSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKCF2YWxpZEltYWdlU2l6ZShsZXZlbCwgd2lkdGgsIGhlaWdodCkgfHwgYm9yZGVyICE9IDAgfHwgaW1hZ2VTaXplIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChpbnRlcm5hbGZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDoKKyAgICAgICAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICB9CisKKyAgICAgICAgaWYoYm9yZGVyICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisJCQlpZihsZXZlbCA+IGdsOjpJTVBMRU1FTlRBVElPTl9NQVhfVEVYVFVSRV9MRVZFTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHRhcmdldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFXzJEOgorICAgICAgICAgICAgICAgIGlmKHdpZHRoID4gKGdsOjpJTVBMRU1FTlRBVElPTl9NQVhfVEVYVFVSRV9TSVpFID4+IGxldmVsKSB8fAorICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPiAoZ2w6OklNUExFTUVOVEFUSU9OX01BWF9URVhUVVJFX1NJWkUgPj4gbGV2ZWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOgorICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWToKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOgorICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjoKKyAgICAgICAgICAgICAgICBpZih3aWR0aCAhPSBoZWlnaHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYod2lkdGggPiAoZ2w6OklNUExFTUVOVEFUSU9OX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgPj4gbGV2ZWwpIHx8CisgICAgICAgICAgICAgICAgICAgIGhlaWdodCA+IChnbDo6SU1QTEVNRU5UQVRJT05fTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSA+PiBsZXZlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighUzNUQ19TVVBQT1JUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOyAvLyBpbiB0aGlzIGNhc2UsIGl0J3MgYXMgdGhvdWdoIHRoZSBpbnRlcm5hbCBmb3JtYXQgc3dpdGNoIGZhaWxlZAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihpbWFnZVNpemUgIT0gZ2w6OkNvbXB1dGVDb21wcmVzc2VkU2l6ZSh3aWR0aCwgaGVpZ2h0LCBpbnRlcm5hbGZvcm1hdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih0YXJnZXQgPT0gR0xfVEVYVFVSRV8yRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnbDo6VGV4dHVyZTJEICp0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZTJEKCk7CisKKyAgICAgICAgICAgICAgICBpZighdGV4dHVyZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGV4dHVyZS0+c2V0Q29tcHJlc3NlZEltYWdlKGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgaW1hZ2VTaXplLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnbDo6VGV4dHVyZUN1YmVNYXAgKnRleHR1cmUgPSBjb250ZXh0LT5nZXRUZXh0dXJlQ3ViZU1hcCgpOworCisgICAgICAgICAgICAgICAgaWYoIXRleHR1cmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAodGFyZ2V0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOgorICAgICAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1g6CisgICAgICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWToKKyAgICAgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZOgorICAgICAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1o6CisgICAgICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjoKKyAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS0+c2V0Q29tcHJlc3NlZEltYWdlKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpbWFnZVNpemUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xpbnQgbGV2ZWwgPSAlZCwgR0xpbnQgeG9mZnNldCA9ICVkLCBHTGludCB5b2Zmc2V0ID0gJWQsICIKKyAgICAgICAgICAiR0xzaXplaSB3aWR0aCA9ICVkLCBHTHNpemVpIGhlaWdodCA9ICVkLCBHTGVudW0gZm9ybWF0ID0gMHglWCwgIgorICAgICAgICAgICJHTHNpemVpIGltYWdlU2l6ZSA9ICVkLCBjb25zdCBHTHZvaWQqIGRhdGEgPSAweCUwLjhwKSIsCisgICAgICAgICAgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZighZ2w6OklzVGV4dHVyZVRhcmdldCh0YXJnZXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHhvZmZzZXQgPCAwIHx8IHlvZmZzZXQgPCAwIHx8ICF2YWxpZEltYWdlU2l6ZShsZXZlbCwgd2lkdGgsIGhlaWdodCkgfHwgaW1hZ2VTaXplIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6CisgICAgICAgICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgZGF0YSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYobGV2ZWwgPiBnbDo6SU1QTEVNRU5UQVRJT05fTUFYX1RFWFRVUkVfTEVWRUxTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIVMzVENfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsgLy8gaW4gdGhpcyBjYXNlLCBpdCdzIGFzIHRob3VnaCB0aGUgZm9ybWF0IHN3aXRjaCBoYXMgZmFpbGVkLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihpbWFnZVNpemUgIT0gZ2w6OkNvbXB1dGVDb21wcmVzc2VkU2l6ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoeG9mZnNldCAlIDQgIT0gMCB8fCB5b2Zmc2V0ICUgNCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7IC8vIHdlIHdhaXQgdG8gY2hlY2sgdGhlIG9mZnNldHMgdW50aWwgdGhpcyBwb2ludCwgYmVjYXVzZSB0aGUgbXVsdGlwbGUtb2YtZm91ciByZXN0cmljdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IGV4aXN0IHVubGVzcyBEWFQxIHRleHR1cmVzIGFyZSBzdXBwb3J0ZWQuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHRhcmdldCA9PSBHTF9URVhUVVJFXzJEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdsOjpUZXh0dXJlMkQgKnRleHR1cmUgPSBjb250ZXh0LT5nZXRUZXh0dXJlMkQoKTsKKworICAgICAgICAgICAgICAgIGlmKCF0ZXh0dXJlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZighdGV4dHVyZS0+aXNDb21wcmVzc2VkKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCh3aWR0aCAlIDQgIT0gMCAmJiB3aWR0aCAhPSB0ZXh0dXJlLT5nZXRXaWR0aCgpKSB8fCAKKyAgICAgICAgICAgICAgICAgICAgKGhlaWdodCAlIDQgIT0gMCAmJiBoZWlnaHQgIT0gdGV4dHVyZS0+Z2V0SGVpZ2h0KCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLT5zdWJJbWFnZUNvbXByZXNzZWQobGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgaW1hZ2VTaXplLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoZ2w6OklzQ3ViZW1hcFRleHR1cmVUYXJnZXQodGFyZ2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnbDo6VGV4dHVyZUN1YmVNYXAgKnRleHR1cmUgPSBjb250ZXh0LT5nZXRUZXh0dXJlQ3ViZU1hcCgpOworCisgICAgICAgICAgICAgICAgaWYoIXRleHR1cmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCF0ZXh0dXJlLT5pc0NvbXByZXNzZWQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoKHdpZHRoICUgNCAhPSAwICYmIHdpZHRoICE9IHRleHR1cmUtPmdldFdpZHRoKCkpIHx8IAorICAgICAgICAgICAgICAgICAgICAoaGVpZ2h0ICUgNCAhPSAwICYmIGhlaWdodCAhPSB0ZXh0dXJlLT5nZXRIZWlnaHQoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRleHR1cmUtPnN1YkltYWdlQ29tcHJlc3NlZCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGltYWdlU2l6ZSwgZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbENvcHlUZXhJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xpbnQgbGV2ZWwgPSAlZCwgR0xlbnVtIGludGVybmFsZm9ybWF0ID0gMHglWCwgIgorICAgICAgICAgICJHTGludCB4ID0gJWQsIEdMaW50IHkgPSAlZCwgR0xzaXplaSB3aWR0aCA9ICVkLCBHTHNpemVpIGhlaWdodCA9ICVkLCBHTGludCBib3JkZXIgPSAlZCkiLAorICAgICAgICAgIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZighdmFsaWRJbWFnZVNpemUobGV2ZWwsIHdpZHRoLCBoZWlnaHQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBpZihib3JkZXIgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CisgICAgICAgICAgICAgICAgaWYod2lkdGggPiAoZ2w6OklNUExFTUVOVEFUSU9OX01BWF9URVhUVVJFX1NJWkUgPj4gbGV2ZWwpIHx8CisgICAgICAgICAgICAgICAgICAgIGhlaWdodCA+IChnbDo6SU1QTEVNRU5UQVRJT05fTUFYX1RFWFRVUkVfU0laRSA+PiBsZXZlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWDoKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1g6CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZOgorICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWToKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1o6CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aOgorICAgICAgICAgICAgICAgIGlmKHdpZHRoICE9IGhlaWdodCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZih3aWR0aCA+IChnbDo6SU1QTEVNRU5UQVRJT05fTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSA+PiBsZXZlbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID4gKGdsOjpJTVBMRU1FTlRBVElPTl9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFID4+IGxldmVsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdsOjpGcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIgPSBjb250ZXh0LT5nZXRSZWFkRnJhbWVidWZmZXIoKTsKKworICAgICAgICAgICAgaWYoZnJhbWVidWZmZXItPmNvbXBsZXRlbmVzcygpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGNvbnRleHQtPmdldFJlYWRGcmFtZWJ1ZmZlckhhbmRsZSgpICE9IDAgJiYgZnJhbWVidWZmZXItPmdldENvbG9yYnVmZmVyKCktPmdldFNhbXBsZXMoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdsOjpDb2xvcmJ1ZmZlciAqc291cmNlID0gZnJhbWVidWZmZXItPmdldENvbG9yYnVmZmVyKCk7CisgICAgICAgICAgICBHTGVudW0gY29sb3JidWZmZXJGb3JtYXQgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgICAgICAgICAvLyBbT3BlbkdMIEVTIDIuMC4yNF0gdGFibGUgMy45CisgICAgICAgICAgICBzd2l0Y2goaW50ZXJuYWxmb3JtYXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEdMX0FMUEhBOgorICAgICAgICAgICAgICAgIGlmKGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX0FMUEhBICYmCisgICAgICAgICAgICAgICAgICAgY29sb3JidWZmZXJGb3JtYXQgIT0gR0xfUkdCQSAmJgorICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQkE0ICYmCisgICAgICAgICAgICAgICAgICAgY29sb3JidWZmZXJGb3JtYXQgIT0gR0xfUkdCNV9BMSAmJgorICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQkE4X09FUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTF9MVU1JTkFOQ0U6CisgICAgICAgICAgICBjYXNlIEdMX1JHQjoKKyAgICAgICAgICAgICAgICBpZihjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0IgJiYKKyAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0I1NjUgJiYKKyAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0I4X09FUyAmJgorICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQkEgJiYKKyAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0JBNCAmJgorICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQjVfQTEgJiYKKyAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0JBOF9PRVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgorICAgICAgICAgICAgY2FzZSBHTF9SR0JBOgorICAgICAgICAgICAgICAgIGlmKGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQkEgJiYKKyAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0JBNCAmJgorICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQjVfQTEgJiYKKyAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0JBOF9PRVMpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6CisgICAgICAgICAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOgorICAgICAgICAgICAgICAgIGlmKFMzVENfU1VQUE9SVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHRhcmdldCA9PSBHTF9URVhUVVJFXzJEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdsOjpUZXh0dXJlMkQgKnRleHR1cmUgPSBjb250ZXh0LT5nZXRUZXh0dXJlMkQoKTsKKworICAgICAgICAgICAgICAgIGlmKCF0ZXh0dXJlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLT5jb3B5SW1hZ2UobGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmcmFtZWJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGdsOjpJc0N1YmVtYXBUZXh0dXJlVGFyZ2V0KHRhcmdldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2w6OlRleHR1cmVDdWJlTWFwICp0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZUN1YmVNYXAoKTsKKworICAgICAgICAgICAgICAgIGlmKCF0ZXh0dXJlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLT5jb3B5SW1hZ2UodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZyYW1lYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbENvcHlUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYLCBHTGludCBsZXZlbCA9ICVkLCBHTGludCB4b2Zmc2V0ID0gJWQsIEdMaW50IHlvZmZzZXQgPSAlZCwgIgorICAgICAgICAgICJHTGludCB4ID0gJWQsIEdMaW50IHkgPSAlZCwgR0xzaXplaSB3aWR0aCA9ICVkLCBHTHNpemVpIGhlaWdodCA9ICVkKSIsCisgICAgICAgICAgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKCFnbDo6SXNUZXh0dXJlVGFyZ2V0KHRhcmdldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICB9CisKKyAgICAgICAgaWYobGV2ZWwgPCAwIHx8IHhvZmZzZXQgPCAwIHx8IHlvZmZzZXQgPCAwIHx8IHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBpZihzdGQ6Om51bWVyaWNfbGltaXRzPEdMc2l6ZWk+OjptYXgoKSAtIHhvZmZzZXQgPCB3aWR0aCB8fCBzdGQ6Om51bWVyaWNfbGltaXRzPEdMc2l6ZWk+OjptYXgoKSAtIHlvZmZzZXQgPCBoZWlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihsZXZlbCA+IGdsOjpJTVBMRU1FTlRBVElPTl9NQVhfVEVYVFVSRV9MRVZFTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnbDo6RnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyID0gY29udGV4dC0+Z2V0UmVhZEZyYW1lYnVmZmVyKCk7CisKKyAgICAgICAgICAgIGlmKGZyYW1lYnVmZmVyLT5jb21wbGV0ZW5lc3MoKSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihjb250ZXh0LT5nZXRSZWFkRnJhbWVidWZmZXJIYW5kbGUoKSAhPSAwICYmIGZyYW1lYnVmZmVyLT5nZXRDb2xvcmJ1ZmZlcigpLT5nZXRTYW1wbGVzKCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnbDo6Q29sb3JidWZmZXIgKnNvdXJjZSA9IGZyYW1lYnVmZmVyLT5nZXRDb2xvcmJ1ZmZlcigpOworICAgICAgICAgICAgR0xlbnVtIGNvbG9yYnVmZmVyRm9ybWF0ID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgIGdsOjpUZXh0dXJlICp0ZXh0dXJlID0gTlVMTDsKKworICAgICAgICAgICAgaWYodGFyZ2V0ID09IEdMX1RFWFRVUkVfMkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGV4dHVyZSA9IGNvbnRleHQtPmdldFRleHR1cmUyRCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihnbDo6SXNDdWJlbWFwVGV4dHVyZVRhcmdldCh0YXJnZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRleHR1cmUgPSBjb250ZXh0LT5nZXRUZXh0dXJlQ3ViZU1hcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBVTlJFQUNIQUJMRSgpOworCisgICAgICAgICAgICBpZighdGV4dHVyZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBHTGVudW0gdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUtPmdldEZvcm1hdCgpOworCisgICAgICAgICAgICAvLyBbT3BlbkdMIEVTIDIuMC4yNF0gdGFibGUgMy45CisgICAgICAgICAgICBzd2l0Y2ggKHRleHR1cmVGb3JtYXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQUxQSEE6CisgICAgICAgICAgICAgICAgaWYoY29sb3JidWZmZXJGb3JtYXQgIT0gR0xfQUxQSEEgJiYKKyAgICAgICAgICAgICAgICAgICAgY29sb3JidWZmZXJGb3JtYXQgIT0gR0xfUkdCQSAmJgorICAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0JBNCAmJgorICAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0I1X0ExICYmCisgICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQkE4X09FUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0xVTUlOQU5DRToKKyAgICAgICAgICAgICAgY2FzZSBHTF9SR0I6CisgICAgICAgICAgICAgICAgaWYoY29sb3JidWZmZXJGb3JtYXQgIT0gR0xfUkdCICYmCisgICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQjU2NSAmJgorICAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0I4X09FUyAmJgorICAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0JBICYmCisgICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQkE0ICYmCisgICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQjVfQTEgJiYKKyAgICAgICAgICAgICAgICAgICAgY29sb3JidWZmZXJGb3JtYXQgIT0gR0xfUkdCQThfT0VTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgorICAgICAgICAgICAgICBjYXNlIEdMX1JHQkE6CisgICAgICAgICAgICAgICAgaWYoY29sb3JidWZmZXJGb3JtYXQgIT0gR0xfUkdCQSAmJgorICAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0JBNCAmJgorICAgICAgICAgICAgICAgICAgICBjb2xvcmJ1ZmZlckZvcm1hdCAhPSBHTF9SR0I1X0ExICYmCisgICAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyRm9ybWF0ICE9IEdMX1JHQkE4X09FUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6CisgICAgICAgICAgICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZXh0dXJlLT5jb3B5U3ViSW1hZ2UodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZnJhbWVidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKworR0x1aW50IF9fc3RkY2FsbCBnbENyZWF0ZVByb2dyYW0odm9pZCkKK3sKKyAgICBUUkFDRSgiKCkiKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LT5jcmVhdGVQcm9ncmFtKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlksIDApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitHTHVpbnQgX19zdGRjYWxsIGdsQ3JlYXRlU2hhZGVyKEdMZW51bSB0eXBlKQoreworICAgIFRSQUNFKCIoR0xlbnVtIHR5cGUgPSAweCVYKSIsIHR5cGUpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX0ZSQUdNRU5UX1NIQURFUjoKKyAgICAgICAgICAgICAgY2FzZSBHTF9WRVJURVhfU0hBREVSOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LT5jcmVhdGVTaGFkZXIodHlwZSk7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlksIDApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIF9fc3RkY2FsbCBnbEN1bGxGYWNlKEdMZW51bSBtb2RlKQoreworICAgIFRSQUNFKCIoR0xlbnVtIG1vZGUgPSAweCVYKSIsIG1vZGUpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBzd2l0Y2ggKG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX0ZST05UOgorICAgICAgICAgIGNhc2UgR0xfQkFDSzoKKyAgICAgICAgICBjYXNlIEdMX0ZST05UX0FORF9CQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICAgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRDdWxsTW9kZShtb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xEZWxldGVCdWZmZXJzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKQoreworICAgIFRSQUNFKCIoR0xzaXplaSBuID0gJWQsIGNvbnN0IEdMdWludCogYnVmZmVycyA9IDB4JTAuOHApIiwgbiwgYnVmZmVycyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKG4gPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5kZWxldGVCdWZmZXIoYnVmZmVyc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xEZWxldGVGZW5jZXNOVihHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZmVuY2VzKQoreworICAgIFRSQUNFKCIoR0xzaXplaSBuID0gJWQsIGNvbnN0IEdMdWludCogZmVuY2VzID0gMHglMC44cCkiLCBuLCBmZW5jZXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC0+ZGVsZXRlRmVuY2UoZmVuY2VzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbERlbGV0ZUZyYW1lYnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKQoreworICAgIFRSQUNFKCIoR0xzaXplaSBuID0gJWQsIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzID0gMHglMC44cCkiLCBuLCBmcmFtZWJ1ZmZlcnMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoZnJhbWVidWZmZXJzW2ldICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbERlbGV0ZVByb2dyYW0oR0x1aW50IHByb2dyYW0pCit7CisgICAgVFJBQ0UoIihHTHVpbnQgcHJvZ3JhbSA9ICVkKSIsIHByb2dyYW0pOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihwcm9ncmFtID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZighY29udGV4dC0+Z2V0UHJvZ3JhbShwcm9ncmFtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihjb250ZXh0LT5nZXRTaGFkZXIocHJvZ3JhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250ZXh0LT5kZWxldGVQcm9ncmFtKHByb2dyYW0pOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsRGVsZXRlUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycykKK3sKKyAgICBUUkFDRSgiKEdMc2l6ZWkgbiA9ICVkLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMgPSAweCUwLjhwKSIsIG4sIHJlbmRlcmJ1ZmZlcnMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC0+ZGVsZXRlUmVuZGVyYnVmZmVyKHJlbmRlcmJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsRGVsZXRlU2hhZGVyKEdMdWludCBzaGFkZXIpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgc2hhZGVyID0gJWQpIiwgc2hhZGVyKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoc2hhZGVyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZighY29udGV4dC0+Z2V0U2hhZGVyKHNoYWRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0UHJvZ3JhbShzaGFkZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC0+ZGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xEZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogdGV4dHVyZXMpCit7CisgICAgVFJBQ0UoIihHTHNpemVpIG4gPSAlZCwgY29uc3QgR0x1aW50KiB0ZXh0dXJlcyA9IDB4JTAuOHApIiwgbiwgdGV4dHVyZXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodGV4dHVyZXNbaV0gIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmRlbGV0ZVRleHR1cmUodGV4dHVyZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbERlcHRoRnVuYyhHTGVudW0gZnVuYykKK3sKKyAgICBUUkFDRSgiKEdMZW51bSBmdW5jID0gMHglWCkiLCBmdW5jKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgc3dpdGNoIChmdW5jKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9ORVZFUjoKKyAgICAgICAgICBjYXNlIEdMX0FMV0FZUzoKKyAgICAgICAgICBjYXNlIEdMX0xFU1M6CisgICAgICAgICAgY2FzZSBHTF9MRVFVQUw6CisgICAgICAgICAgY2FzZSBHTF9FUVVBTDoKKyAgICAgICAgICBjYXNlIEdMX0dSRUFURVI6CisgICAgICAgICAgY2FzZSBHTF9HRVFVQUw6CisgICAgICAgICAgY2FzZSBHTF9OT1RFUVVBTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LT5zZXREZXB0aEZ1bmMoZnVuYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xEZXB0aE1hc2soR0xib29sZWFuIGZsYWcpCit7CisgICAgVFJBQ0UoIihHTGJvb2xlYW4gZmxhZyA9ICVkKSIsIGZsYWcpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC0+c2V0RGVwdGhNYXNrKGZsYWcgIT0gR0xfRkFMU0UpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsRGVwdGhSYW5nZWYoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpCit7CisgICAgVFJBQ0UoIihHTGNsYW1wZiB6TmVhciA9ICVmLCBHTGNsYW1wZiB6RmFyID0gJWYpIiwgek5lYXIsIHpGYXIpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC0+c2V0RGVwdGhSYW5nZSh6TmVhciwgekZhcik7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xEZXRhY2hTaGFkZXIoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgcHJvZ3JhbSA9ICVkLCBHTHVpbnQgc2hhZGVyID0gJWQpIiwgcHJvZ3JhbSwgc2hhZGVyKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW1PYmplY3QgPSBjb250ZXh0LT5nZXRQcm9ncmFtKHByb2dyYW0pOworICAgICAgICAgICAgZ2w6OlNoYWRlciAqc2hhZGVyT2JqZWN0ID0gY29udGV4dC0+Z2V0U2hhZGVyKHNoYWRlcik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtT2JqZWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdsOjpTaGFkZXIgKnNoYWRlckJ5UHJvZ3JhbUhhbmRsZTsKKyAgICAgICAgICAgICAgICBzaGFkZXJCeVByb2dyYW1IYW5kbGUgPSBjb250ZXh0LT5nZXRTaGFkZXIocHJvZ3JhbSk7CisgICAgICAgICAgICAgICAgaWYoIXNoYWRlckJ5UHJvZ3JhbUhhbmRsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCFzaGFkZXJPYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW1CeVNoYWRlckhhbmRsZSA9IGNvbnRleHQtPmdldFByb2dyYW0oc2hhZGVyKTsKKyAgICAgICAgICAgICAgICBpZighcHJvZ3JhbUJ5U2hhZGVySGFuZGxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QtPmRldGFjaFNoYWRlcihzaGFkZXJPYmplY3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xEaXNhYmxlKEdMZW51bSBjYXApCit7CisgICAgVFJBQ0UoIihHTGVudW0gY2FwID0gMHglWCkiLCBjYXApOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjYXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQ1VMTF9GQUNFOiAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRDdWxsRmFjZShmYWxzZSk7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMOiAgICAgIGNvbnRleHQtPnNldFBvbHlnb25PZmZzZXRGaWxsKGZhbHNlKTsgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRTogY29udGV4dC0+c2V0U2FtcGxlQWxwaGFUb0NvdmVyYWdlKGZhbHNlKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfU0FNUExFX0NPVkVSQUdFOiAgICAgICAgICBjb250ZXh0LT5zZXRTYW1wbGVDb3ZlcmFnZShmYWxzZSk7ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9TQ0lTU09SX1RFU1Q6ICAgICAgICAgICAgIGNvbnRleHQtPnNldFNjaXNzb3JUZXN0KGZhbHNlKTsgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1NURU5DSUxfVEVTVDogICAgICAgICAgICAgY29udGV4dC0+c2V0U3RlbmNpbFRlc3QoZmFsc2UpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfREVQVEhfVEVTVDogICAgICAgICAgICAgICBjb250ZXh0LT5zZXREZXB0aFRlc3QoZmFsc2UpOyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9CTEVORDogICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldEJsZW5kKGZhbHNlKTsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0RJVEhFUjogICAgICAgICAgICAgICAgICAgY29udGV4dC0+c2V0RGl0aGVyKGZhbHNlKTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoR0x1aW50IGluZGV4KQoreworICAgIFRSQUNFKCIoR0x1aW50IGluZGV4ID0gJWQpIiwgaW5kZXgpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihpbmRleCA+PSBnbDo6TUFYX1ZFUlRFWF9BVFRSSUJTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC0+c2V0RW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbERyYXdBcnJheXMoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQoreworICAgIFRSQUNFKCIoR0xlbnVtIG1vZGUgPSAweCVYLCBHTGludCBmaXJzdCA9ICVkLCBHTHNpemVpIGNvdW50ID0gJWQpIiwgbW9kZSwgZmlyc3QsIGNvdW50KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoY291bnQgPCAwIHx8IGZpcnN0IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmRyYXdBcnJheXMobW9kZSwgZmlyc3QsIGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbERyYXdFbGVtZW50cyhHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcykKK3sKKyAgICBUUkFDRSgiKEdMZW51bSBtb2RlID0gMHglWCwgR0xzaXplaSBjb3VudCA9ICVkLCBHTGVudW0gdHlwZSA9IDB4JVgsIGNvbnN0IEdMdm9pZCogaW5kaWNlcyA9IDB4JTAuOHApIiwKKyAgICAgICAgICBtb2RlLCBjb3VudCwgdHlwZSwgaW5kaWNlcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGNvdW50IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgICAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgorICAgICAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBjb250ZXh0LT5kcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsRW5hYmxlKEdMZW51bSBjYXApCit7CisgICAgVFJBQ0UoIihHTGVudW0gY2FwID0gMHglWCkiLCBjYXApOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjYXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQ1VMTF9GQUNFOiAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRDdWxsRmFjZSh0cnVlKTsgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEw6ICAgICAgY29udGV4dC0+c2V0UG9seWdvbk9mZnNldEZpbGwodHJ1ZSk7ICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0U6IGNvbnRleHQtPnNldFNhbXBsZUFscGhhVG9Db3ZlcmFnZSh0cnVlKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfU0FNUExFX0NPVkVSQUdFOiAgICAgICAgICBjb250ZXh0LT5zZXRTYW1wbGVDb3ZlcmFnZSh0cnVlKTsgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1NDSVNTT1JfVEVTVDogICAgICAgICAgICAgY29udGV4dC0+c2V0U2Npc3NvclRlc3QodHJ1ZSk7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9TVEVOQ0lMX1RFU1Q6ICAgICAgICAgICAgIGNvbnRleHQtPnNldFN0ZW5jaWxUZXN0KHRydWUpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfREVQVEhfVEVTVDogICAgICAgICAgICAgICBjb250ZXh0LT5zZXREZXB0aFRlc3QodHJ1ZSk7ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX0JMRU5EOiAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+c2V0QmxlbmQodHJ1ZSk7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9ESVRIRVI6ICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldERpdGhlcih0cnVlKTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShHTHVpbnQgaW5kZXgpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgaW5kZXggPSAlZCkiLCBpbmRleCk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGluZGV4ID49IGdsOjpNQVhfVkVSVEVYX0FUVFJJQlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LT5zZXRFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpbmRleCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xGaW5pc2hGZW5jZU5WKEdMdWludCBmZW5jZSkKK3sKKyAgICBUUkFDRSgiKEdMdWludCBmZW5jZSA9ICVkKSIsIGZlbmNlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpGZW5jZSogZmVuY2VPYmplY3QgPSBjb250ZXh0LT5nZXRGZW5jZShmZW5jZSk7CisKKyAgICAgICAgICAgIGlmKGZlbmNlT2JqZWN0ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmVuY2VPYmplY3QtPmZpbmlzaEZlbmNlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xGaW5pc2godm9pZCkKK3sKKyAgICBUUkFDRSgiKCkiKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmZpbmlzaCgpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsRmx1c2godm9pZCkKK3sKKyAgICBUUkFDRSgiKCkiKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmZsdXNoKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYLCBHTGVudW0gYXR0YWNobWVudCA9IDB4JVgsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQgPSAweCVYLCAiCisgICAgICAgICAgIkdMdWludCByZW5kZXJidWZmZXIgPSAlZCkiLCB0YXJnZXQsIGF0dGFjaG1lbnQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoKHRhcmdldCAhPSBHTF9GUkFNRUJVRkZFUiAmJiB0YXJnZXQgIT0gR0xfRFJBV19GUkFNRUJVRkZFUl9BTkdMRSAmJiB0YXJnZXQgIT0gR0xfUkVBRF9GUkFNRUJVRkZFUl9BTkdMRSkKKyAgICAgICAgICAgIHx8IChyZW5kZXJidWZmZXJ0YXJnZXQgIT0gR0xfUkVOREVSQlVGRkVSICYmIHJlbmRlcmJ1ZmZlciAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OkZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBHTHVpbnQgZnJhbWVidWZmZXJIYW5kbGUgPSAwOworICAgICAgICAgICAgaWYodGFyZ2V0ID09IEdMX1JFQURfRlJBTUVCVUZGRVJfQU5HTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgPSBjb250ZXh0LT5nZXRSZWFkRnJhbWVidWZmZXIoKTsKKyAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlckhhbmRsZSA9IGNvbnRleHQtPmdldFJlYWRGcmFtZWJ1ZmZlckhhbmRsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyID0gY29udGV4dC0+Z2V0RHJhd0ZyYW1lYnVmZmVyKCk7CisgICAgICAgICAgICAgICAgZnJhbWVidWZmZXJIYW5kbGUgPSBjb250ZXh0LT5nZXREcmF3RnJhbWVidWZmZXJIYW5kbGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIWZyYW1lYnVmZmVyIHx8IChmcmFtZWJ1ZmZlckhhbmRsZSA9PSAwICYmIHJlbmRlcmJ1ZmZlciAhPSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGF0dGFjaG1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQ09MT1JfQVRUQUNITUVOVDA6CisgICAgICAgICAgICAgICAgZnJhbWVidWZmZXItPnNldENvbG9yYnVmZmVyKEdMX1JFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9ERVBUSF9BVFRBQ0hNRU5UOgorICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLT5zZXREZXB0aGJ1ZmZlcihHTF9SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UOgorICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLT5zZXRTdGVuY2lsYnVmZmVyKEdMX1JFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xlbnVtIGF0dGFjaG1lbnQgPSAweCVYLCBHTGVudW0gdGV4dGFyZ2V0ID0gMHglWCwgIgorICAgICAgICAgICJHTHVpbnQgdGV4dHVyZSA9ICVkLCBHTGludCBsZXZlbCA9ICVkKSIsIHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKHRhcmdldCAhPSBHTF9GUkFNRUJVRkZFUiAmJiB0YXJnZXQgIT0gR0xfRFJBV19GUkFNRUJVRkZFUl9BTkdMRSAmJiB0YXJnZXQgIT0gR0xfUkVBRF9GUkFNRUJVRkZFUl9BTkdMRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGF0dGFjaG1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQwOgorICAgICAgICAgIGNhc2UgR0xfREVQVEhfQVRUQUNITUVOVDoKKyAgICAgICAgICBjYXNlIEdMX1NURU5DSUxfQVRUQUNITUVOVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZih0ZXh0dXJlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGV4dGFyZ2V0ID0gR0xfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnbDo6VGV4dHVyZSAqdGV4ID0gY29udGV4dC0+Z2V0VGV4dHVyZSh0ZXh0dXJlKTsKKworICAgICAgICAgICAgICAgIGlmKHRleCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZih0ZXgtPmlzQ29tcHJlc3NlZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRleHRhcmdldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CisgICAgICAgICAgICAgICAgICAgIGlmKHRleC0+Z2V0VGFyZ2V0KCkgIT0gR0xfVEVYVFVSRV8yRCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6CisgICAgICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWDoKKyAgICAgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZOgorICAgICAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6CisgICAgICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWjoKKyAgICAgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aOgorICAgICAgICAgICAgICAgICAgICBpZih0ZXgtPmdldFRhcmdldCgpICE9IEdMX1RFWFRVUkVfQ1VCRV9NQVApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKGxldmVsICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnbDo6RnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIEdMdWludCBmcmFtZWJ1ZmZlckhhbmRsZSA9IDA7CisgICAgICAgICAgICBpZih0YXJnZXQgPT0gR0xfUkVBRF9GUkFNRUJVRkZFUl9BTkdMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciA9IGNvbnRleHQtPmdldFJlYWRGcmFtZWJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVySGFuZGxlID0gY29udGV4dC0+Z2V0UmVhZEZyYW1lYnVmZmVySGFuZGxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgPSBjb250ZXh0LT5nZXREcmF3RnJhbWVidWZmZXIoKTsKKyAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlckhhbmRsZSA9IGNvbnRleHQtPmdldERyYXdGcmFtZWJ1ZmZlckhhbmRsZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihmcmFtZWJ1ZmZlckhhbmRsZSA9PSAwIHx8ICFmcmFtZWJ1ZmZlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGF0dGFjaG1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQ09MT1JfQVRUQUNITUVOVDA6ICBmcmFtZWJ1ZmZlci0+c2V0Q29sb3JidWZmZXIodGV4dGFyZ2V0LCB0ZXh0dXJlKTsgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9ERVBUSF9BVFRBQ0hNRU5UOiAgIGZyYW1lYnVmZmVyLT5zZXREZXB0aGJ1ZmZlcih0ZXh0YXJnZXQsIHRleHR1cmUpOyAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1NURU5DSUxfQVRUQUNITUVOVDogZnJhbWVidWZmZXItPnNldFN0ZW5jaWxidWZmZXIodGV4dGFyZ2V0LCB0ZXh0dXJlKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xGcm9udEZhY2UoR0xlbnVtIG1vZGUpCit7CisgICAgVFJBQ0UoIihHTGVudW0gbW9kZSA9IDB4JVgpIiwgbW9kZSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobW9kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfQ1c6CisgICAgICAgICAgY2FzZSBHTF9DQ1c6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgICAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldEZyb250RmFjZShtb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZW5CdWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKQoreworICAgIFRSQUNFKCIoR0xzaXplaSBuID0gJWQsIEdMdWludCogYnVmZmVycyA9IDB4JTAuOHApIiwgbiwgYnVmZmVycyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKG4gPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzW2ldID0gY29udGV4dC0+Y3JlYXRlQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZW5lcmF0ZU1pcG1hcChHTGVudW0gdGFyZ2V0KQoreworICAgIFRSQUNFKCIoR0xlbnVtIHRhcmdldCA9IDB4JVgpIiwgdGFyZ2V0KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpUZXh0dXJlICp0ZXh0dXJlOworCisgICAgICAgICAgICBzd2l0Y2ggKHRhcmdldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFXzJEOgorICAgICAgICAgICAgICAgIHRleHR1cmUgPSBjb250ZXh0LT5nZXRUZXh0dXJlMkQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVA6CisgICAgICAgICAgICAgICAgdGV4dHVyZSA9IGNvbnRleHQtPmdldFRleHR1cmVDdWJlTWFwKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYodGV4dHVyZS0+aXNDb21wcmVzc2VkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGV4dHVyZS0+Z2VuZXJhdGVNaXBtYXBzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZW5GZW5jZXNOVihHTHNpemVpIG4sIEdMdWludCogZmVuY2VzKQoreworICAgIFRSQUNFKCIoR0xzaXplaSBuID0gJWQsIEdMdWludCogZmVuY2VzID0gMHglMC44cCkiLCBuLCBmZW5jZXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmVuY2VzW2ldID0gY29udGV4dC0+Y3JlYXRlRmVuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdlbkZyYW1lYnVmZmVycyhHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKQoreworICAgIFRSQUNFKCIoR0xzaXplaSBuID0gJWQsIEdMdWludCogZnJhbWVidWZmZXJzID0gMHglMC44cCkiLCBuLCBmcmFtZWJ1ZmZlcnMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJhbWVidWZmZXJzW2ldID0gY29udGV4dC0+Y3JlYXRlRnJhbWVidWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdlblJlbmRlcmJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpCit7CisgICAgVFJBQ0UoIihHTHNpemVpIG4gPSAlZCwgR0x1aW50KiByZW5kZXJidWZmZXJzID0gMHglMC44cCkiLCBuLCByZW5kZXJidWZmZXJzKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYobiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbmRlcmJ1ZmZlcnNbaV0gPSBjb250ZXh0LT5jcmVhdGVSZW5kZXJidWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdlblRleHR1cmVzKEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcykKK3sKKyAgICBUUkFDRSgiKEdMc2l6ZWkgbiA9ICVkLCBHTHVpbnQqIHRleHR1cmVzID0gIDB4JTAuOHApIiwgbiwgdGV4dHVyZXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGV4dHVyZXNbaV0gPSBjb250ZXh0LT5jcmVhdGVUZXh0dXJlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZXRBY3RpdmVBdHRyaWIoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSkKK3sKKyAgICBUUkFDRSgiKEdMdWludCBwcm9ncmFtID0gJWQsIEdMdWludCBpbmRleCA9ICVkLCBHTHNpemVpIGJ1ZnNpemUgPSAlZCwgR0xzaXplaSAqbGVuZ3RoID0gMHglMC44cCwgIgorICAgICAgICAgICJHTGludCAqc2l6ZSA9IDB4JTAuOHAsIEdMZW51bSAqdHlwZSA9ICUwLjhwLCBHTGNoYXIgKm5hbWUgPSAlMC44cCkiLAorICAgICAgICAgIHByb2dyYW0sIGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihidWZzaXplIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpQcm9ncmFtICpwcm9ncmFtT2JqZWN0ID0gY29udGV4dC0+Z2V0UHJvZ3JhbShwcm9ncmFtKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0U2hhZGVyKHByb2dyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoaW5kZXggPj0gKEdMdWludClwcm9ncmFtT2JqZWN0LT5nZXRBY3RpdmVBdHRyaWJ1dGVDb3VudCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvZ3JhbU9iamVjdC0+Z2V0QWN0aXZlQXR0cmlidXRlKGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsR2V0QWN0aXZlVW5pZm9ybShHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKQoreworICAgIFRSQUNFKCIoR0x1aW50IHByb2dyYW0gPSAlZCwgR0x1aW50IGluZGV4ID0gJWQsIEdMc2l6ZWkgYnVmc2l6ZSA9ICVkLCAiCisgICAgICAgICAgIkdMc2l6ZWkqIGxlbmd0aCA9IDB4JTAuOHAsIEdMaW50KiBzaXplID0gMHglMC44cCwgR0xlbnVtKiB0eXBlID0gMHglMC44cCwgR0xjaGFyKiBuYW1lID0gMHglMC44cCkiLAorICAgICAgICAgIHByb2dyYW0sIGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihidWZzaXplIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpQcm9ncmFtICpwcm9ncmFtT2JqZWN0ID0gY29udGV4dC0+Z2V0UHJvZ3JhbShwcm9ncmFtKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0U2hhZGVyKHByb2dyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoaW5kZXggPj0gKEdMdWludClwcm9ncmFtT2JqZWN0LT5nZXRBY3RpdmVVbmlmb3JtQ291bnQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2dyYW1PYmplY3QtPmdldEFjdGl2ZVVuaWZvcm0oaW5kZXgsIGJ1ZnNpemUsIGxlbmd0aCwgc2l6ZSwgdHlwZSwgbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZXRBdHRhY2hlZFNoYWRlcnMoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgcHJvZ3JhbSA9ICVkLCBHTHNpemVpIG1heGNvdW50ID0gJWQsIEdMc2l6ZWkqIGNvdW50ID0gMHglMC44cCwgR0x1aW50KiBzaGFkZXJzID0gMHglMC44cCkiLAorICAgICAgICAgIHByb2dyYW0sIG1heGNvdW50LCBjb3VudCwgc2hhZGVycyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKG1heGNvdW50IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpQcm9ncmFtICpwcm9ncmFtT2JqZWN0ID0gY29udGV4dC0+Z2V0UHJvZ3JhbShwcm9ncmFtKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0U2hhZGVyKHByb2dyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHByb2dyYW1PYmplY3QtPmdldEF0dGFjaGVkU2hhZGVycyhtYXhjb3VudCwgY291bnQsIHNoYWRlcnMpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK2ludCBfX3N0ZGNhbGwgZ2xHZXRBdHRyaWJMb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKQoreworICAgIFRSQUNFKCIoR0x1aW50IHByb2dyYW0gPSAlZCwgY29uc3QgR0xjaGFyKiBuYW1lID0gJXMpIiwgcHJvZ3JhbSwgbmFtZSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisKKyAgICAgICAgICAgIGdsOjpQcm9ncmFtICpwcm9ncmFtT2JqZWN0ID0gY29udGV4dC0+Z2V0UHJvZ3JhbShwcm9ncmFtKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0U2hhZGVyKHByb2dyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFLCAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighcHJvZ3JhbU9iamVjdC0+aXNMaW5rZWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04sIC0xKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHByb2dyYW1PYmplY3QtPmdldEF0dHJpYnV0ZUxvY2F0aW9uKG5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZLCAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldEJvb2xlYW52KEdMZW51bSBwbmFtZSwgR0xib29sZWFuKiBwYXJhbXMpCit7CisgICAgVFJBQ0UoIihHTGVudW0gcG5hbWUgPSAweCVYLCBHTGJvb2xlYW4qIHBhcmFtcyA9IDB4JTAuOHApIiwgIHBuYW1lLCBwYXJhbXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIShjb250ZXh0LT5nZXRCb29sZWFudihwbmFtZSwgcGFyYW1zKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR0xlbnVtIG5hdGl2ZVR5cGU7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBhcmFtcyA9IDA7CisgICAgICAgICAgICAgICAgaWYoIWNvbnRleHQtPmdldFF1ZXJ5UGFyYW1ldGVySW5mbyhwbmFtZSwgJm5hdGl2ZVR5cGUsICZudW1QYXJhbXMpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKworICAgICAgICAgICAgICAgIGlmKG51bVBhcmFtcyA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGl0IGlzIGtub3duIHRoYXQgdGhlIHBuYW1lIGlzIHZhbGlkLCBidXQgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgdG8gcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZihuYXRpdmVUeXBlID09IEdMX0ZMT0FUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAqZmxvYXRQYXJhbXMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBmbG9hdFBhcmFtcyA9IG5ldyBHTGZsb2F0W251bVBhcmFtc107CisKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+Z2V0RmxvYXR2KHBuYW1lLCBmbG9hdFBhcmFtcyk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bVBhcmFtczsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihmbG9hdFBhcmFtc1tpXSA9PSAwLjBmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IEdMX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IEdMX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWxldGUgW10gZmxvYXRQYXJhbXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYobmF0aXZlVHlwZSA9PSBHTF9JTlQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHTGludCAqaW50UGFyYW1zID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaW50UGFyYW1zID0gbmV3IEdMaW50W251bVBhcmFtc107CisKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+Z2V0SW50ZWdlcnYocG5hbWUsIGludFBhcmFtcyk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bVBhcmFtczsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihpbnRQYXJhbXNbaV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSBHTF9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSBHTF9UUlVFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGludFBhcmFtczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xlbnVtIHBuYW1lID0gMHglWCwgR0xpbnQqIHBhcmFtcyA9IDB4JTAuOHApIiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpCdWZmZXIgKmJ1ZmZlcjsKKworICAgICAgICAgICAgc3dpdGNoICh0YXJnZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQVJSQVlfQlVGRkVSOgorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNvbnRleHQtPmdldEFycmF5QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVI6CisgICAgICAgICAgICAgICAgYnVmZmVyID0gY29udGV4dC0+Z2V0RWxlbWVudEFycmF5QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighYnVmZmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEEgbnVsbCBidWZmZXIgbWVhbnMgdGhhdCAiMCIgaXMgYm91bmQgdG8gdGhlIHJlcXVlc3RlZCBidWZmZXIgdGFyZ2V0CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChwbmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHTF9CVUZGRVJfVVNBR0U6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IGJ1ZmZlci0+dXNhZ2UoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9CVUZGRVJfU0laRToKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gYnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK0dMZW51bSBfX3N0ZGNhbGwgZ2xHZXRFcnJvcih2b2lkKQoreworICAgIFRSQUNFKCIoKSIpOworCisgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgaWYoY29udGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb250ZXh0LT5nZXRFcnJvcigpOworICAgIH0KKworICAgIHJldHVybiBHTF9OT19FUlJPUjsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZXRGZW5jZWl2TlYoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgZmVuY2UgPSAlZCwgR0xlbnVtIHBuYW1lID0gMHglWCwgR0xpbnQgKnBhcmFtcyA9IDB4JTAuOHApIiwgZmVuY2UsIHBuYW1lLCBwYXJhbXMpOworCisgICAgdHJ5CisgICAgeworICAgIAorICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OkZlbmNlICpmZW5jZU9iamVjdCA9IGNvbnRleHQtPmdldEZlbmNlKGZlbmNlKTsKKworICAgICAgICAgICAgaWYoZmVuY2VPYmplY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmZW5jZU9iamVjdC0+Z2V0RmVuY2VpdihwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykKK3sKKyAgICBUUkFDRSgiKEdMZW51bSBwbmFtZSA9IDB4JVgsIEdMZmxvYXQqIHBhcmFtcyA9IDB4JTAuOHApIiwgcG5hbWUsIHBhcmFtcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZighKGNvbnRleHQtPmdldEZsb2F0dihwbmFtZSwgcGFyYW1zKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR0xlbnVtIG5hdGl2ZVR5cGU7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBhcmFtcyA9IDA7CisgICAgICAgICAgICAgICAgaWYoIWNvbnRleHQtPmdldFF1ZXJ5UGFyYW1ldGVySW5mbyhwbmFtZSwgJm5hdGl2ZVR5cGUsICZudW1QYXJhbXMpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKworICAgICAgICAgICAgICAgIGlmKG51bVBhcmFtcyA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGl0IGlzIGtub3duIHRoYXQgdGhlIHBuYW1lIGlzIHZhbGlkLCBidXQgdGhhdCB0aGVyZSBhcmUgbm8gcGFyYW1ldGVycyB0byByZXR1cm4uCisKKyAgICAgICAgICAgICAgICBpZihuYXRpdmVUeXBlID09IEdMX0JPT0wpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gKmJvb2xQYXJhbXMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBib29sUGFyYW1zID0gbmV3IEdMYm9vbGVhbltudW1QYXJhbXNdOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmdldEJvb2xlYW52KHBuYW1lLCBib29sUGFyYW1zKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbnVtUGFyYW1zOyArK2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJvb2xQYXJhbXNbaV0gPT0gR0xfRkFMU0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2ldID0gMC4wZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSAxLjBmOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGJvb2xQYXJhbXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYobmF0aXZlVHlwZSA9PSBHTF9JTlQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHTGludCAqaW50UGFyYW1zID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaW50UGFyYW1zID0gbmV3IEdMaW50W251bVBhcmFtc107CisKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+Z2V0SW50ZWdlcnYocG5hbWUsIGludFBhcmFtcyk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bVBhcmFtczsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSAoR0xmbG9hdClpbnRQYXJhbXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWxldGUgW10gaW50UGFyYW1zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xlbnVtIGF0dGFjaG1lbnQgPSAweCVYLCBHTGVudW0gcG5hbWUgPSAweCVYLCBHTGludCogcGFyYW1zID0gMHglMC44cCkiLAorICAgICAgICAgIHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHBhcmFtcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZih0YXJnZXQgIT0gR0xfRlJBTUVCVUZGRVIgJiYgdGFyZ2V0ICE9IEdMX0RSQVdfRlJBTUVCVUZGRVJfQU5HTEUgJiYgdGFyZ2V0ICE9IEdMX1JFQURfRlJBTUVCVUZGRVJfQU5HTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdsOjpGcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgaWYodGFyZ2V0ID09IEdMX1JFQURfRlJBTUVCVUZGRVJfQU5HTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0UmVhZEZyYW1lYnVmZmVySGFuZGxlKCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgPSBjb250ZXh0LT5nZXRSZWFkRnJhbWVidWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0RHJhd0ZyYW1lYnVmZmVySGFuZGxlKCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgPSBjb250ZXh0LT5nZXREcmF3RnJhbWVidWZmZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR0xlbnVtIGF0dGFjaG1lbnRUeXBlOworICAgICAgICAgICAgR0x1aW50IGF0dGFjaG1lbnRIYW5kbGU7CisgICAgICAgICAgICBzd2l0Y2ggKGF0dGFjaG1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQ09MT1JfQVRUQUNITUVOVDA6ICAgIAorICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRUeXBlID0gZnJhbWVidWZmZXItPmdldENvbG9yYnVmZmVyVHlwZSgpOworICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRIYW5kbGUgPSBmcmFtZWJ1ZmZlci0+Z2V0Q29sb3JidWZmZXJIYW5kbGUoKTsgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfREVQVEhfQVRUQUNITUVOVDogICAgIAorICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRUeXBlID0gZnJhbWVidWZmZXItPmdldERlcHRoYnVmZmVyVHlwZSgpOworICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRIYW5kbGUgPSBmcmFtZWJ1ZmZlci0+Z2V0RGVwdGhidWZmZXJIYW5kbGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlQ6ICAgCisgICAgICAgICAgICAgICAgYXR0YWNobWVudFR5cGUgPSBmcmFtZWJ1ZmZlci0+Z2V0U3RlbmNpbGJ1ZmZlclR5cGUoKTsKKyAgICAgICAgICAgICAgICBhdHRhY2htZW50SGFuZGxlID0gZnJhbWVidWZmZXItPmdldFN0ZW5jaWxidWZmZXJIYW5kbGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEdMZW51bSBhdHRhY2htZW50T2JqZWN0VHlwZTsgICAvLyBUeXBlIGNhdGVnb3J5CisgICAgICAgICAgICBpZihhdHRhY2htZW50VHlwZSA9PSBHTF9OT05FIHx8IGF0dGFjaG1lbnRUeXBlID09IEdMX1JFTkRFUkJVRkZFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdHRhY2htZW50T2JqZWN0VHlwZSA9IGF0dGFjaG1lbnRUeXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihnbDo6SXNUZXh0dXJlVGFyZ2V0KGF0dGFjaG1lbnRUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdHRhY2htZW50T2JqZWN0VHlwZSA9IEdMX1RFWFRVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIFVOUkVBQ0hBQkxFKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAocG5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRToKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gYXR0YWNobWVudE9iamVjdFR5cGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRToKKyAgICAgICAgICAgICAgICBpZihhdHRhY2htZW50T2JqZWN0VHlwZSA9PSBHTF9SRU5ERVJCVUZGRVIgfHwgYXR0YWNobWVudE9iamVjdFR5cGUgPT0gR0xfVEVYVFVSRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwYXJhbXMgPSBhdHRhY2htZW50SGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMOgorICAgICAgICAgICAgICAgIGlmKGF0dGFjaG1lbnRPYmplY3RUeXBlID09IEdMX1RFWFRVUkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gMDsgLy8gRnJhbWVidWZmZXJUZXh0dXJlMkQgd2lsbCBub3QgYWxsb3cgbGV2ZWwgdG8gYmUgc2V0IHRvIGFueXRoaW5nIGVsc2UgaW4gR0wgRVMgMi4wCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRToKKyAgICAgICAgICAgICAgICBpZihhdHRhY2htZW50T2JqZWN0VHlwZSA9PSBHTF9URVhUVVJFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoZ2w6OklzQ3ViZW1hcFRleHR1cmVUYXJnZXQoYXR0YWNobWVudFR5cGUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gYXR0YWNobWVudFR5cGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZXRJbnRlZ2VydihHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCit7CisgICAgVFJBQ0UoIihHTGVudW0gcG5hbWUgPSAweCVYLCBHTGludCogcGFyYW1zID0gMHglMC44cCkiLCBwbmFtZSwgcGFyYW1zKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCEoY29udGV4dC0+Z2V0SW50ZWdlcnYocG5hbWUsIHBhcmFtcykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdMZW51bSBuYXRpdmVUeXBlOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXJhbXMgPSAwOworICAgICAgICAgICAgICAgIGlmKCFjb250ZXh0LT5nZXRRdWVyeVBhcmFtZXRlckluZm8ocG5hbWUsICZuYXRpdmVUeXBlLCAmbnVtUGFyYW1zKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisKKyAgICAgICAgICAgICAgICBpZihudW1QYXJhbXMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBpdCBpcyBrbm93biB0aGF0IHBuYW1lIGlzIHZhbGlkLCBidXQgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgdG8gcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZihuYXRpdmVUeXBlID09IEdMX0JPT0wpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gKmJvb2xQYXJhbXMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBib29sUGFyYW1zID0gbmV3IEdMYm9vbGVhbltudW1QYXJhbXNdOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmdldEJvb2xlYW52KHBuYW1lLCBib29sUGFyYW1zKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbnVtUGFyYW1zOyArK2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJvb2xQYXJhbXNbaV0gPT0gR0xfRkFMU0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGJvb2xQYXJhbXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYobmF0aXZlVHlwZSA9PSBHTF9GTE9BVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgKmZsb2F0UGFyYW1zID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXRQYXJhbXMgPSBuZXcgR0xmbG9hdFtudW1QYXJhbXNdOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmdldEZsb2F0dihwbmFtZSwgZmxvYXRQYXJhbXMpOworCisgICAgICAgICAgICAgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1QYXJhbXM7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocG5hbWUgPT0gR0xfREVQVEhfUkFOR0UgfHwgcG5hbWUgPT0gR0xfQ09MT1JfQ0xFQVJfVkFMVUUgfHwgcG5hbWUgPT0gR0xfREVQVEhfQ0xFQVJfVkFMVUUgfHwgcG5hbWUgPT0gR0xfQkxFTkRfQ09MT1IpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2ldID0gKEdMaW50KSgoKEdMZmxvYXQpKDB4RkZGRkZGRkYpICogZmxvYXRQYXJhbXNbaV0gLSAxLjBmKSAvIDIuMGYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IChHTGludCkoZmxvYXRQYXJhbXNbaV0gPiAwLjBmID8gZmxvb3IoZmxvYXRQYXJhbXNbaV0gKyAwLjUpIDogY2VpbChmbG9hdFBhcmFtc1tpXSAtIDAuNSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGZsb2F0UGFyYW1zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldFByb2dyYW1pdihHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKQoreworICAgIFRSQUNFKCIoR0x1aW50IHByb2dyYW0gPSAlZCwgR0xlbnVtIHBuYW1lID0gJWQsIEdMaW50KiBwYXJhbXMgPSAweCUwLjhwKSIsIHByb2dyYW0sIHBuYW1lLCBwYXJhbXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW1PYmplY3QgPSBjb250ZXh0LT5nZXRQcm9ncmFtKHByb2dyYW0pOworCisgICAgICAgICAgICBpZighcHJvZ3JhbU9iamVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAocG5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfREVMRVRFX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gcHJvZ3JhbU9iamVjdC0+aXNGbGFnZ2VkRm9yRGVsZXRpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIGNhc2UgR0xfTElOS19TVEFUVVM6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IHByb2dyYW1PYmplY3QtPmlzTGlua2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICBjYXNlIEdMX1ZBTElEQVRFX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gcHJvZ3JhbU9iamVjdC0+aXNWYWxpZGF0ZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIGNhc2UgR0xfSU5GT19MT0dfTEVOR1RIOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSBwcm9ncmFtT2JqZWN0LT5nZXRJbmZvTG9nTGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICBjYXNlIEdMX0FUVEFDSEVEX1NIQURFUlM6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IHByb2dyYW1PYmplY3QtPmdldEF0dGFjaGVkU2hhZGVyc0NvdW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICBjYXNlIEdMX0FDVElWRV9BVFRSSUJVVEVTOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSBwcm9ncmFtT2JqZWN0LT5nZXRBY3RpdmVBdHRyaWJ1dGVDb3VudCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgY2FzZSBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEg6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IHByb2dyYW1PYmplY3QtPmdldEFjdGl2ZUF0dHJpYnV0ZU1heExlbmd0aCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgY2FzZSBHTF9BQ1RJVkVfVU5JRk9STVM6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IHByb2dyYW1PYmplY3QtPmdldEFjdGl2ZVVuaWZvcm1Db3VudCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgY2FzZSBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSBwcm9ncmFtT2JqZWN0LT5nZXRBY3RpdmVVbmlmb3JtTWF4TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsR2V0UHJvZ3JhbUluZm9Mb2coR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgcHJvZ3JhbSA9ICVkLCBHTHNpemVpIGJ1ZnNpemUgPSAlZCwgR0xzaXplaSogbGVuZ3RoID0gMHglMC44cCwgR0xjaGFyKiBpbmZvbG9nID0gMHglMC44cCkiLAorICAgICAgICAgIHByb2dyYW0sIGJ1ZnNpemUsIGxlbmd0aCwgaW5mb2xvZyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGJ1ZnNpemUgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW1PYmplY3QgPSBjb250ZXh0LT5nZXRQcm9ncmFtKHByb2dyYW0pOworCisgICAgICAgICAgICBpZighcHJvZ3JhbU9iamVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2dyYW1PYmplY3QtPmdldEluZm9Mb2coYnVmc2l6ZSwgbGVuZ3RoLCBpbmZvbG9nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYLCBHTGVudW0gcG5hbWUgPSAweCVYLCBHTGludCogcGFyYW1zID0gMHglMC44cCkiLCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYodGFyZ2V0ICE9IEdMX1JFTkRFUkJVRkZFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0UmVuZGVyYnVmZmVySGFuZGxlKCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnbDo6UmVuZGVyYnVmZmVyICpyZW5kZXJidWZmZXIgPSBjb250ZXh0LT5nZXRSZW5kZXJidWZmZXIoY29udGV4dC0+Z2V0UmVuZGVyYnVmZmVySGFuZGxlKCkpOworCisgICAgICAgICAgICBzd2l0Y2gocG5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1dJRFRIOiAgICAgICAgICAgKnBhcmFtcyA9IHJlbmRlcmJ1ZmZlci0+Z2V0V2lkdGgoKTsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0hFSUdIVDogICAgICAgICAgKnBhcmFtcyA9IHJlbmRlcmJ1ZmZlci0+Z2V0SGVpZ2h0KCk7ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVDogKnBhcmFtcyA9IHJlbmRlcmJ1ZmZlci0+Z2V0Rm9ybWF0KCk7ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFOiAgICAgICAgKnBhcmFtcyA9IHJlbmRlcmJ1ZmZlci0+Z2V0UmVkU2l6ZSgpOyAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU6ICAgICAgKnBhcmFtcyA9IHJlbmRlcmJ1ZmZlci0+Z2V0R3JlZW5TaXplKCk7ICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRTogICAgICAgKnBhcmFtcyA9IHJlbmRlcmJ1ZmZlci0+Z2V0Qmx1ZVNpemUoKTsgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkU6ICAgICAgKnBhcmFtcyA9IHJlbmRlcmJ1ZmZlci0+Z2V0QWxwaGFTaXplKCk7ICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkU6ICAgICAgKnBhcmFtcyA9IHJlbmRlcmJ1ZmZlci0+Z2V0RGVwdGhTaXplKCk7ICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRTogICAgKnBhcmFtcyA9IHJlbmRlcmJ1ZmZlci0+Z2V0U3RlbmNpbFNpemUoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfQU5HTEU6CisgICAgICAgICAgICAgICAgaWYoZ2w6OklNUExFTUVOVEFUSU9OX01BWF9TQU1QTEVTICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gcmVuZGVyYnVmZmVyLT5nZXRTYW1wbGVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldFNoYWRlcml2KEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKK3sKKyAgICBUUkFDRSgiKEdMdWludCBzaGFkZXIgPSAlZCwgR0xlbnVtIHBuYW1lID0gJWQsIEdMaW50KiBwYXJhbXMgPSAweCUwLjhwKSIsIHNoYWRlciwgcG5hbWUsIHBhcmFtcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6U2hhZGVyICpzaGFkZXJPYmplY3QgPSBjb250ZXh0LT5nZXRTaGFkZXIoc2hhZGVyKTsKKworICAgICAgICAgICAgaWYoIXNoYWRlck9iamVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAocG5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfU0hBREVSX1RZUEU6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IHNoYWRlck9iamVjdC0+Z2V0VHlwZSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgY2FzZSBHTF9ERUxFVEVfU1RBVFVTOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSBzaGFkZXJPYmplY3QtPmlzRmxhZ2dlZEZvckRlbGV0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICBjYXNlIEdMX0NPTVBJTEVfU1RBVFVTOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSBzaGFkZXJPYmplY3QtPmlzQ29tcGlsZWQoKSA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIGNhc2UgR0xfSU5GT19MT0dfTEVOR1RIOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSBzaGFkZXJPYmplY3QtPmdldEluZm9Mb2dMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIGNhc2UgR0xfU0hBREVSX1NPVVJDRV9MRU5HVEg6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IHNoYWRlck9iamVjdC0+Z2V0U291cmNlTGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsR2V0U2hhZGVySW5mb0xvZyhHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKQoreworICAgIFRSQUNFKCIoR0x1aW50IHNoYWRlciA9ICVkLCBHTHNpemVpIGJ1ZnNpemUgPSAlZCwgR0xzaXplaSogbGVuZ3RoID0gMHglMC44cCwgR0xjaGFyKiBpbmZvbG9nID0gMHglMC44cCkiLAorICAgICAgICAgIHNoYWRlciwgYnVmc2l6ZSwgbGVuZ3RoLCBpbmZvbG9nKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoYnVmc2l6ZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6U2hhZGVyICpzaGFkZXJPYmplY3QgPSBjb250ZXh0LT5nZXRTaGFkZXIoc2hhZGVyKTsKKworICAgICAgICAgICAgaWYoIXNoYWRlck9iamVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNoYWRlck9iamVjdC0+Z2V0SW5mb0xvZyhidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQqIHJhbmdlLCBHTGludCogcHJlY2lzaW9uKQoreworICAgIFRSQUNFKCIoR0xlbnVtIHNoYWRlcnR5cGUgPSAweCVYLCBHTGVudW0gcHJlY2lzaW9udHlwZSA9IDB4JVgsIEdMaW50KiByYW5nZSA9IDB4JTAuOHAsIEdMaW50KiBwcmVjaXNpb24gPSAweCUwLjhwKSIsCisgICAgICAgICAgc2hhZGVydHlwZSwgcHJlY2lzaW9udHlwZSwgcmFuZ2UsIHByZWNpc2lvbik7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc2hhZGVydHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfVkVSVEVYX1NIQURFUjoKKyAgICAgICAgICBjYXNlIEdMX0ZSQUdNRU5UX1NIQURFUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAocHJlY2lzaW9udHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfTE9XX0ZMT0FUOgorICAgICAgICAgIGNhc2UgR0xfTUVESVVNX0ZMT0FUOgorICAgICAgICAgIGNhc2UgR0xfSElHSF9GTE9BVDoKKyAgICAgICAgICAgIC8vIEFzc3VtZSBJRUVFIDc1NCBwcmVjaXNpb24KKyAgICAgICAgICAgIHJhbmdlWzBdID0gMTI3OworICAgICAgICAgICAgcmFuZ2VbMV0gPSAxMjc7CisgICAgICAgICAgICAqcHJlY2lzaW9uID0gMjM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdMX0xPV19JTlQ6CisgICAgICAgICAgY2FzZSBHTF9NRURJVU1fSU5UOgorICAgICAgICAgIGNhc2UgR0xfSElHSF9JTlQ6CisgICAgICAgICAgICAvLyBTb21lIChtb3N0KSBoYXJkd2FyZSBvbmx5IHN1cHBvcnRzIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVycywKKyAgICAgICAgICAgIC8vIHdoaWNoIGNhbiBhY2N1cmF0ZWx5IHJlcHJlc2VudCBpbnRlZ2VycyB1cCB0byArLy0xNjc3NzIxNgorICAgICAgICAgICAgcmFuZ2VbMF0gPSAyNDsKKyAgICAgICAgICAgIHJhbmdlWzFdID0gMjQ7CisgICAgICAgICAgICAqcHJlY2lzaW9uID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldFNoYWRlclNvdXJjZShHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBzb3VyY2UpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgc2hhZGVyID0gJWQsIEdMc2l6ZWkgYnVmc2l6ZSA9ICVkLCBHTHNpemVpKiBsZW5ndGggPSAweCUwLjhwLCBHTGNoYXIqIHNvdXJjZSA9IDB4JTAuOHApIiwKKyAgICAgICAgICBzaGFkZXIsIGJ1ZnNpemUsIGxlbmd0aCwgc291cmNlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoYnVmc2l6ZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6U2hhZGVyICpzaGFkZXJPYmplY3QgPSBjb250ZXh0LT5nZXRTaGFkZXIoc2hhZGVyKTsKKworICAgICAgICAgICAgaWYoIXNoYWRlck9iamVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaGFkZXJPYmplY3QtPmdldFNvdXJjZShidWZzaXplLCBsZW5ndGgsIHNvdXJjZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKworY29uc3QgR0x1Ynl0ZSogX19zdGRjYWxsIGdsR2V0U3RyaW5nKEdMZW51bSBuYW1lKQoreworICAgIFRSQUNFKCIoR0xlbnVtIG5hbWUgPSAweCVYKSIsIG5hbWUpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgc3dpdGNoIChuYW1lKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9WRU5ET1I6CisgICAgICAgICAgICByZXR1cm4gKEdMdWJ5dGUqKSJUcmFuc0dhbWluZyBJbmMuIjsKKyAgICAgICAgICBjYXNlIEdMX1JFTkRFUkVSOgorICAgICAgICAgICAgcmV0dXJuIChHTHVieXRlKikiU3dpZnRTaGFkZXIiOworICAgICAgICAgIGNhc2UgR0xfVkVSU0lPTjoKKyAgICAgICAgICAgIHJldHVybiAoR0x1Ynl0ZSopIk9wZW5HTCBFUyAyLjAgKFN3aWZ0U2hhZGVyICJWRVJTSU9OX1NUUklORyIpIjsKKyAgICAgICAgICBjYXNlIEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjoKKyAgICAgICAgICAgIHJldHVybiAoR0x1Ynl0ZSopIk9wZW5HTCBFUyBHTFNMIEVTIDEuMDAgKFN3aWZ0U2hhZGVyICJWRVJTSU9OX1NUUklORyIpIjsKKyAgICAgICAgICBjYXNlIEdMX0VYVEVOU0lPTlM6CisgICAgICAgICAgICByZXR1cm4gKEdMdWJ5dGUqKSgoY29udGV4dCAhPSBOVUxMKSA/IGNvbnRleHQtPmdldEV4dGVuc2lvblN0cmluZygpIDogIiIpOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNLCAoR0x1Ynl0ZSopTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlksIChHTHVieXRlKilOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZXRUZXhQYXJhbWV0ZXJmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYLCBHTGVudW0gcG5hbWUgPSAweCVYLCBHTGZsb2F0KiBwYXJhbXMgPSAweCUwLjhwKSIsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6VGV4dHVyZSAqdGV4dHVyZTsKKworICAgICAgICAgICAgc3dpdGNoICh0YXJnZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgICAgICAgICAgICAgICB0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZTJEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUDoKKyAgICAgICAgICAgICAgICB0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZUN1YmVNYXAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChwbmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX01BR19GSUxURVI6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KXRleHR1cmUtPmdldE1hZ0ZpbHRlcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUjoKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gKEdMZmxvYXQpdGV4dHVyZS0+Z2V0TWluRmlsdGVyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9XUkFQX1M6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KXRleHR1cmUtPmdldFdyYXBTKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9XUkFQX1Q6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KXRleHR1cmUtPmdldFdyYXBUKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZXRUZXhQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xlbnVtIHBuYW1lID0gMHglWCwgR0xpbnQqIHBhcmFtcyA9IDB4JTAuOHApIiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpUZXh0dXJlICp0ZXh0dXJlOworCisgICAgICAgICAgICBzd2l0Y2ggKHRhcmdldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFXzJEOgorICAgICAgICAgICAgICAgIHRleHR1cmUgPSBjb250ZXh0LT5nZXRUZXh0dXJlMkQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQOgorICAgICAgICAgICAgICAgIHRleHR1cmUgPSBjb250ZXh0LT5nZXRUZXh0dXJlQ3ViZU1hcCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHBuYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUjoKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gdGV4dHVyZS0+Z2V0TWFnRmlsdGVyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9NSU5fRklMVEVSOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSB0ZXh0dXJlLT5nZXRNaW5GaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfUzoKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gdGV4dHVyZS0+Z2V0V3JhcFMoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfVDoKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gdGV4dHVyZS0+Z2V0V3JhcFQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldFVuaWZvcm1mdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcykKK3sKKyAgICBUUkFDRSgiKEdMdWludCBwcm9ncmFtID0gJWQsIEdMaW50IGxvY2F0aW9uID0gJWQsIEdMZmxvYXQqIHBhcmFtcyA9IDB4JTAuOHApIiwgcHJvZ3JhbSwgbG9jYXRpb24sIHBhcmFtcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihwcm9ncmFtID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnbDo6UHJvZ3JhbSAqcHJvZ3JhbU9iamVjdCA9IGNvbnRleHQtPmdldFByb2dyYW0ocHJvZ3JhbSk7CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtT2JqZWN0IHx8ICFwcm9ncmFtT2JqZWN0LT5pc0xpbmtlZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtT2JqZWN0LT5nZXRVbmlmb3JtZnYobG9jYXRpb24sIHBhcmFtcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldFVuaWZvcm1pdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50KiBwYXJhbXMpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgcHJvZ3JhbSA9ICVkLCBHTGludCBsb2NhdGlvbiA9ICVkLCBHTGludCogcGFyYW1zID0gMHglMC44cCkiLCBwcm9ncmFtLCBsb2NhdGlvbiwgcGFyYW1zKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHByb2dyYW0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdsOjpQcm9ncmFtICpwcm9ncmFtT2JqZWN0ID0gY29udGV4dC0+Z2V0UHJvZ3JhbShwcm9ncmFtKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QgfHwgIXByb2dyYW1PYmplY3QtPmlzTGlua2VkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QtPmdldFVuaWZvcm1pdihsb2NhdGlvbiwgcGFyYW1zKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK2ludCBfX3N0ZGNhbGwgZ2xHZXRVbmlmb3JtTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSkKK3sKKyAgICBUUkFDRSgiKEdMdWludCBwcm9ncmFtID0gJWQsIGNvbnN0IEdMY2hhciogbmFtZSA9IDB4JTAuOHApIiwgcHJvZ3JhbSwgbmFtZSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihzdHJzdHIobmFtZSwgImdsXyIpID09IG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpQcm9ncmFtICpwcm9ncmFtT2JqZWN0ID0gY29udGV4dC0+Z2V0UHJvZ3JhbShwcm9ncmFtKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW1PYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0U2hhZGVyKHByb2dyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFLCAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighcHJvZ3JhbU9iamVjdC0+aXNMaW5rZWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04sIC0xKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHByb2dyYW1PYmplY3QtPmdldFVuaWZvcm1Mb2NhdGlvbihuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSwgLTEpOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZXRWZXJ0ZXhBdHRyaWJmdihHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKQoreworICAgIFRSQUNFKCIoR0x1aW50IGluZGV4ID0gJWQsIEdMZW51bSBwbmFtZSA9IDB4JVgsIEdMZmxvYXQqIHBhcmFtcyA9IDB4JTAuOHApIiwgaW5kZXgsIHBuYW1lLCBwYXJhbXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoaW5kZXggPj0gZ2w6Ok1BWF9WRVJURVhfQVRUUklCUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGdsOjpWZXJ0ZXhBdHRyaWJ1dGUgJmF0dHJpYlN0YXRlID0gY29udGV4dC0+Z2V0VmVydGV4QXR0cmliU3RhdGUoaW5kZXgpOworCisgICAgICAgICAgICBzd2l0Y2ggKHBuYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gKEdMZmxvYXQpKGF0dHJpYlN0YXRlLm1BcnJheUVuYWJsZWQgPyBHTF9UUlVFIDogR0xfRkFMU0UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRToKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gKEdMZmxvYXQpYXR0cmliU3RhdGUubVNpemU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREU6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KWF0dHJpYlN0YXRlLm1TdHJpZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSAoR0xmbG9hdClhdHRyaWJTdGF0ZS5tVHlwZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQ6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KShhdHRyaWJTdGF0ZS5tTm9ybWFsaXplZCA/IEdMX1RSVUUgOiBHTF9GQUxTRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gKEdMZmxvYXQpYXR0cmliU3RhdGUubUJvdW5kQnVmZmVyLmlkKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCOgorICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSBhdHRyaWJTdGF0ZS5tQ3VycmVudFZhbHVlW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xHZXRWZXJ0ZXhBdHRyaWJpdihHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKK3sKKyAgICBUUkFDRSgiKEdMdWludCBpbmRleCA9ICVkLCBHTGVudW0gcG5hbWUgPSAweCVYLCBHTGludCogcGFyYW1zID0gMHglMC44cCkiLCBpbmRleCwgcG5hbWUsIHBhcmFtcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihpbmRleCA+PSBnbDo6TUFYX1ZFUlRFWF9BVFRSSUJTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgZ2w6OlZlcnRleEF0dHJpYnV0ZSAmYXR0cmliU3RhdGUgPSBjb250ZXh0LT5nZXRWZXJ0ZXhBdHRyaWJTdGF0ZShpbmRleCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAocG5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSAoYXR0cmliU3RhdGUubUFycmF5RW5hYmxlZCA/IEdMX1RSVUUgOiBHTF9GQUxTRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSBhdHRyaWJTdGF0ZS5tU2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERToKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gYXR0cmliU3RhdGUubVN0cmlkZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEU6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IGF0dHJpYlN0YXRlLm1UeXBlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDoKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gKGF0dHJpYlN0YXRlLm1Ob3JtYWxpemVkID8gR0xfVFJVRSA6IEdMX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSBhdHRyaWJTdGF0ZS5tQm91bmRCdWZmZXIuaWQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9DVVJSRU5UX1ZFUlRFWF9BVFRSSUI6CisgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDQ7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1cnJlbnRWYWx1ZSA9IGF0dHJpYlN0YXRlLm1DdXJyZW50VmFsdWVbaV07CisgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IChHTGludCkoY3VycmVudFZhbHVlID4gMC4wZiA/IGZsb29yKGN1cnJlbnRWYWx1ZSArIDAuNWYpIDogY2VpbChjdXJyZW50VmFsdWUgLSAwLjVmKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2KEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqKiBwb2ludGVyKQoreworICAgIFRSQUNFKCIoR0x1aW50IGluZGV4ID0gJWQsIEdMZW51bSBwbmFtZSA9IDB4JVgsIEdMdm9pZCoqIHBvaW50ZXIgPSAweCUwLjhwKSIsIGluZGV4LCBwbmFtZSwgcG9pbnRlcik7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihpbmRleCA+PSBnbDo6TUFYX1ZFUlRFWF9BVFRSSUJTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocG5hbWUgIT0gR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqcG9pbnRlciA9IGNvbnN0X2Nhc3Q8R0x2b2lkKj4oY29udGV4dC0+Z2V0VmVydGV4QXR0cmliUG9pbnRlcihpbmRleCkpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsSGludChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkKK3sKKyAgICBUUkFDRSgiKEdMZW51bSB0YXJnZXQgPSAweCVYLCBHTGVudW0gbW9kZSA9IDB4JVgpIiwgdGFyZ2V0LCBtb2RlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgc3dpdGNoIChtb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9GQVNURVNUOgorICAgICAgICAgIGNhc2UgR0xfTklDRVNUOgorICAgICAgICAgIGNhc2UgR0xfRE9OVF9DQVJFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOyAKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKyAgICAgICAgc3dpdGNoICh0YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UOgorICAgICAgICAgICAgaWYoY29udGV4dCkgY29udGV4dC0+c2V0R2VuZXJhdGVNaXBtYXBIaW50KG1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UX09FUzoKKyAgICAgICAgICAgIGlmKGNvbnRleHQpIGNvbnRleHQtPnNldEZyYWdtZW50U2hhZGVyRGVyaXZhdGl2ZUhpbnQobW9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKworR0xib29sZWFuIF9fc3RkY2FsbCBnbElzQnVmZmVyKEdMdWludCBidWZmZXIpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgYnVmZmVyID0gJWQpIiwgYnVmZmVyKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQgJiYgYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6QnVmZmVyICpidWZmZXJPYmplY3QgPSBjb250ZXh0LT5nZXRCdWZmZXIoYnVmZmVyKTsKKworICAgICAgICAgICAgaWYoYnVmZmVyT2JqZWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHTF9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZLCBHTF9GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIEdMX0ZBTFNFOworfQorCitHTGJvb2xlYW4gX19zdGRjYWxsIGdsSXNFbmFibGVkKEdMZW51bSBjYXApCit7CisgICAgVFJBQ0UoIihHTGVudW0gY2FwID0gMHglWCkiLCBjYXApOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjYXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfQ1VMTF9GQUNFOiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC0+aXNDdWxsRmFjZUVuYWJsZWQoKTsKKyAgICAgICAgICAgICAgY2FzZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMOiAgICAgIHJldHVybiBjb250ZXh0LT5pc1BvbHlnb25PZmZzZXRGaWxsRW5hYmxlZCgpOworICAgICAgICAgICAgICBjYXNlIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRTogcmV0dXJuIGNvbnRleHQtPmlzU2FtcGxlQWxwaGFUb0NvdmVyYWdlRW5hYmxlZCgpOworICAgICAgICAgICAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRTogICAgICAgICAgcmV0dXJuIGNvbnRleHQtPmlzU2FtcGxlQ292ZXJhZ2VFbmFibGVkKCk7CisgICAgICAgICAgICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOiAgICAgICAgICAgICByZXR1cm4gY29udGV4dC0+aXNTY2lzc29yVGVzdEVuYWJsZWQoKTsKKyAgICAgICAgICAgICAgY2FzZSBHTF9TVEVOQ0lMX1RFU1Q6ICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LT5pc1N0ZW5jaWxUZXN0RW5hYmxlZCgpOworICAgICAgICAgICAgICBjYXNlIEdMX0RFUFRIX1RFU1Q6ICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQtPmlzRGVwdGhUZXN0RW5hYmxlZCgpOworICAgICAgICAgICAgICBjYXNlIEdMX0JMRU5EOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQtPmlzQmxlbmRFbmFibGVkKCk7CisgICAgICAgICAgICAgIGNhc2UgR0xfRElUSEVSOiAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC0+aXNEaXRoZXJFbmFibGVkKCk7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZLCBmYWxzZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitHTGJvb2xlYW4gX19zdGRjYWxsIGdsSXNGZW5jZU5WKEdMdWludCBmZW5jZSkKK3sKKyAgICBUUkFDRSgiKEdMdWludCBmZW5jZSA9ICVkKSIsIGZlbmNlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpGZW5jZSAqZmVuY2VPYmplY3QgPSBjb250ZXh0LT5nZXRGZW5jZShmZW5jZSk7CisKKyAgICAgICAgICAgIGlmKGZlbmNlT2JqZWN0ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmVuY2VPYmplY3QtPmlzRmVuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSwgR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBHTF9GQUxTRTsKK30KKworR0xib29sZWFuIF9fc3RkY2FsbCBnbElzRnJhbWVidWZmZXIoR0x1aW50IGZyYW1lYnVmZmVyKQoreworICAgIFRSQUNFKCIoR0x1aW50IGZyYW1lYnVmZmVyID0gJWQpIiwgZnJhbWVidWZmZXIpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCAmJiBmcmFtZWJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OkZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlck9iamVjdCA9IGNvbnRleHQtPmdldEZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyKTsKKworICAgICAgICAgICAgaWYoZnJhbWVidWZmZXJPYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlksIEdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gR0xfRkFMU0U7Cit9CisKK0dMYm9vbGVhbiBfX3N0ZGNhbGwgZ2xJc1Byb2dyYW0oR0x1aW50IHByb2dyYW0pCit7CisgICAgVFJBQ0UoIihHTHVpbnQgcHJvZ3JhbSA9ICVkKSIsIHByb2dyYW0pOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCAmJiBwcm9ncmFtKQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6UHJvZ3JhbSAqcHJvZ3JhbU9iamVjdCA9IGNvbnRleHQtPmdldFByb2dyYW0ocHJvZ3JhbSk7CisKKyAgICAgICAgICAgIGlmKHByb2dyYW1PYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlksIEdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gR0xfRkFMU0U7Cit9CisKK0dMYm9vbGVhbiBfX3N0ZGNhbGwgZ2xJc1JlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKQoreworICAgIFRSQUNFKCIoR0x1aW50IHJlbmRlcmJ1ZmZlciA9ICVkKSIsIHJlbmRlcmJ1ZmZlcik7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0ICYmIHJlbmRlcmJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlJlbmRlcmJ1ZmZlciAqcmVuZGVyYnVmZmVyT2JqZWN0ID0gY29udGV4dC0+Z2V0UmVuZGVyYnVmZmVyKHJlbmRlcmJ1ZmZlcik7CisKKyAgICAgICAgICAgIGlmKHJlbmRlcmJ1ZmZlck9iamVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSwgR0xfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBHTF9GQUxTRTsKK30KKworR0xib29sZWFuIF9fc3RkY2FsbCBnbElzU2hhZGVyKEdMdWludCBzaGFkZXIpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgc2hhZGVyID0gJWQpIiwgc2hhZGVyKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQgJiYgc2hhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6U2hhZGVyICpzaGFkZXJPYmplY3QgPSBjb250ZXh0LT5nZXRTaGFkZXIoc2hhZGVyKTsKKworICAgICAgICAgICAgaWYoc2hhZGVyT2JqZWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHTF9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZLCBHTF9GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIEdMX0ZBTFNFOworfQorCitHTGJvb2xlYW4gX19zdGRjYWxsIGdsSXNUZXh0dXJlKEdMdWludCB0ZXh0dXJlKQoreworICAgIFRSQUNFKCIoR0x1aW50IHRleHR1cmUgPSAlZCkiLCB0ZXh0dXJlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQgJiYgdGV4dHVyZSkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlRleHR1cmUgKnRleHR1cmVPYmplY3QgPSBjb250ZXh0LT5nZXRUZXh0dXJlKHRleHR1cmUpOworCisgICAgICAgICAgICBpZih0ZXh0dXJlT2JqZWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHTF9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZLCBHTF9GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIEdMX0ZBTFNFOworfQorCit2b2lkIF9fc3RkY2FsbCBnbExpbmVXaWR0aChHTGZsb2F0IHdpZHRoKQoreworICAgIFRSQUNFKCIoR0xmbG9hdCB3aWR0aCA9ICVmKSIsIHdpZHRoKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYod2lkdGggPD0gMC4wZikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnNldExpbmVXaWR0aCh3aWR0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xMaW5rUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSkKK3sKKyAgICBUUkFDRSgiKEdMdWludCBwcm9ncmFtID0gJWQpIiwgcHJvZ3JhbSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6UHJvZ3JhbSAqcHJvZ3JhbU9iamVjdCA9IGNvbnRleHQtPmdldFByb2dyYW0ocHJvZ3JhbSk7CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtT2JqZWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGNvbnRleHQtPmdldFNoYWRlcihwcm9ncmFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2dyYW1PYmplY3QtPmxpbmsoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFBpeGVsU3RvcmVpKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCit7CisgICAgVFJBQ0UoIihHTGVudW0gcG5hbWUgPSAweCVYLCBHTGludCBwYXJhbSA9ICVkKSIsIHBuYW1lLCBwYXJhbSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHBuYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX1VOUEFDS19BTElHTk1FTlQ6CisgICAgICAgICAgICAgICAgaWYocGFyYW0gIT0gMSAmJiBwYXJhbSAhPSAyICYmIHBhcmFtICE9IDQgJiYgcGFyYW0gIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRVbnBhY2tBbGlnbm1lbnQocGFyYW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgR0xfUEFDS19BTElHTk1FTlQ6CisgICAgICAgICAgICAgICAgaWYocGFyYW0gIT0gMSAmJiBwYXJhbSAhPSAyICYmIHBhcmFtICE9IDQgJiYgcGFyYW0gIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRQYWNrQWxpZ25tZW50KHBhcmFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsUG9seWdvbk9mZnNldChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykKK3sKKyAgICBUUkFDRSgiKEdMZmxvYXQgZmFjdG9yID0gJWYsIEdMZmxvYXQgdW5pdHMgPSAlZikiLCBmYWN0b3IsIHVuaXRzKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnNldFBvbHlnb25PZmZzZXRQYXJhbXMoZmFjdG9yLCB1bml0cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xSZWFkUGl4ZWxzKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkKiBwaXhlbHMpCit7CisgICAgVFJBQ0UoIihHTGludCB4ID0gJWQsIEdMaW50IHkgPSAlZCwgR0xzaXplaSB3aWR0aCA9ICVkLCBHTHNpemVpIGhlaWdodCA9ICVkLCAiCisgICAgICAgICAgIkdMZW51bSBmb3JtYXQgPSAweCVYLCBHTGVudW0gdHlwZSA9IDB4JVgsIEdMdm9pZCogcGl4ZWxzID0gMHglMC44cCkiLAorICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgIHBpeGVscyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfUkdCQToKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdMX0JHUkFfRVhUOgorICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgICAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVZfRVhUOgorICAgICAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWX0VYVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBnbDo6SU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgZ2w6OklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC0+cmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIodm9pZCkKK3sKKyAgICBUUkFDRSgiKCkiKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OlNoYWRlcjo6cmVsZWFzZUNvbXBpbGVyKCk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEUoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQoreworICAgIFRSQUNFKCIoR0xlbnVtIHRhcmdldCA9IDB4JVgsIEdMc2l6ZWkgc2FtcGxlcyA9ICVkLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQgPSAweCVYLCBHTHNpemVpIHdpZHRoID0gJWQsIEdMc2l6ZWkgaGVpZ2h0ID0gJWQpIiwKKyAgICAgICAgICB0YXJnZXQsIHNhbXBsZXMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCFnbDo6SXNDb2xvclJlbmRlcmFibGUoaW50ZXJuYWxmb3JtYXQpICYmICFnbDo6SXNEZXB0aFJlbmRlcmFibGUoaW50ZXJuYWxmb3JtYXQpICYmICFnbDo6SXNTdGVuY2lsUmVuZGVyYWJsZShpbnRlcm5hbGZvcm1hdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICB9CisKKyAgICAgICAgaWYod2lkdGggPCAwIHx8IGhlaWdodCA8IDAgfHwgc2FtcGxlcyA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZih3aWR0aCA+IGdsOjpJTVBMRU1FTlRBVElPTl9NQVhfUkVOREVSQlVGRkVSX1NJWkUgfHwgCisgICAgICAgICAgICAgICAgaGVpZ2h0ID4gZ2w6OklNUExFTUVOVEFUSU9OX01BWF9SRU5ERVJCVUZGRVJfU0laRSB8fAorICAgICAgICAgICAgICAgIHNhbXBsZXMgPiBnbDo6SU1QTEVNRU5UQVRJT05fTUFYX1NBTVBMRVMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBHTHVpbnQgaGFuZGxlID0gY29udGV4dC0+Z2V0UmVuZGVyYnVmZmVySGFuZGxlKCk7CisgICAgICAgICAgICBpZihoYW5kbGUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDE2OgorICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldFJlbmRlcmJ1ZmZlclN0b3JhZ2UobmV3IGdsOjpEZXB0aGJ1ZmZlcih3aWR0aCwgaGVpZ2h0LCBzYW1wbGVzKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfUkdCQTQ6CisgICAgICAgICAgICAgIGNhc2UgR0xfUkdCNV9BMToKKyAgICAgICAgICAgICAgY2FzZSBHTF9SR0I1NjU6CisgICAgICAgICAgICAgIGNhc2UgR0xfUkdCOF9PRVM6CisgICAgICAgICAgICAgIGNhc2UgR0xfUkdCQThfT0VTOgorICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldFJlbmRlcmJ1ZmZlclN0b3JhZ2UobmV3IGdsOjpDb2xvcmJ1ZmZlcih3aWR0aCwgaGVpZ2h0LCBpbnRlcm5hbGZvcm1hdCwgc2FtcGxlcykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1NURU5DSUxfSU5ERVg4OgorICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldFJlbmRlcmJ1ZmZlclN0b3JhZ2UobmV3IGdsOjpTdGVuY2lsYnVmZmVyKHdpZHRoLCBoZWlnaHQsIHNhbXBsZXMpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9ERVBUSDI0X1NURU5DSUw4X09FUzoKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRSZW5kZXJidWZmZXJTdG9yYWdlKG5ldyBnbDo6RGVwdGhTdGVuY2lsYnVmZmVyKHdpZHRoLCBoZWlnaHQsIHNhbXBsZXMpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKK3sKKyAgICBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFKHRhcmdldCwgMCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIF9fc3RkY2FsbCBnbFNhbXBsZUNvdmVyYWdlKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KQoreworICAgIFRSQUNFKCIoR0xjbGFtcGYgdmFsdWUgPSAlZiwgR0xib29sZWFuIGludmVydCA9ICVkKSIsIHZhbHVlLCBpbnZlcnQpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCogY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC0+c2V0U2FtcGxlQ292ZXJhZ2VQYXJhbXMoZ2w6OmNsYW1wMDEodmFsdWUpLCBpbnZlcnQgPT0gR0xfVFJVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xTZXRGZW5jZU5WKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbikKK3sKKyAgICBUUkFDRSgiKEdMdWludCBmZW5jZSA9ICVkLCBHTGVudW0gY29uZGl0aW9uID0gMHglWCkiLCBmZW5jZSwgY29uZGl0aW9uKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoY29uZGl0aW9uICE9IEdMX0FMTF9DT01QTEVURURfTlYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpGZW5jZSAqZmVuY2VPYmplY3QgPSBjb250ZXh0LT5nZXRGZW5jZShmZW5jZSk7CisKKyAgICAgICAgICAgIGlmKGZlbmNlT2JqZWN0ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmVuY2VPYmplY3QtPnNldEZlbmNlKGNvbmRpdGlvbik7ICAgIAorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsU2Npc3NvcihHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKK3sKKyAgICBUUkFDRSgiKEdMaW50IHggPSAlZCwgR0xpbnQgeSA9ICVkLCBHTHNpemVpIHdpZHRoID0gJWQsIEdMc2l6ZWkgaGVpZ2h0ID0gJWQpIiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCogY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC0+c2V0U2Npc3NvclBhcmFtcyh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFNoYWRlckJpbmFyeShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogc2hhZGVycywgR0xlbnVtIGJpbmFyeWZvcm1hdCwgY29uc3QgR0x2b2lkKiBiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKQoreworICAgIFRSQUNFKCIoR0xzaXplaSBuID0gJWQsIGNvbnN0IEdMdWludCogc2hhZGVycyA9IDB4JTAuOHAsIEdMZW51bSBiaW5hcnlmb3JtYXQgPSAweCVYLCAiCisgICAgICAgICAgImNvbnN0IEdMdm9pZCogYmluYXJ5ID0gMHglMC44cCwgR0xzaXplaSBsZW5ndGggPSAlZCkiLAorICAgICAgICAgIG4sIHNoYWRlcnMsIGJpbmFyeWZvcm1hdCwgYmluYXJ5LCBsZW5ndGgpOworCisgICAgdHJ5CisgICAgeworICAgICAgICAvLyBObyBiaW5hcnkgc2hhZGVyIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsU2hhZGVyU291cmNlKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhcioqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCkKK3sKKyAgICBUUkFDRSgiKEdMdWludCBzaGFkZXIgPSAlZCwgR0xzaXplaSBjb3VudCA9ICVkLCBjb25zdCBHTGNoYXIqKiBzdHJpbmcgPSAweCUwLjhwLCBjb25zdCBHTGludCogbGVuZ3RoID0gMHglMC44cCkiLAorICAgICAgICAgIHNoYWRlciwgY291bnQsIHN0cmluZywgbGVuZ3RoKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoY291bnQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlNoYWRlciAqc2hhZGVyT2JqZWN0ID0gY29udGV4dC0+Z2V0U2hhZGVyKHNoYWRlcik7CisKKyAgICAgICAgICAgIGlmKCFzaGFkZXJPYmplY3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0UHJvZ3JhbShzaGFkZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2hhZGVyT2JqZWN0LT5zZXRTb3VyY2UoY291bnQsIHN0cmluZywgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFN0ZW5jaWxGdW5jKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKQoreworICAgIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShHTF9GUk9OVF9BTkRfQkFDSywgZnVuYywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykKK3sKKyAgICBUUkFDRSgiKEdMZW51bSBmYWNlID0gMHglWCwgR0xlbnVtIGZ1bmMgPSAweCVYLCBHTGludCByZWYgPSAlZCwgR0x1aW50IG1hc2sgPSAlZCkiLCBmYWNlLCBmdW5jLCByZWYsIG1hc2spOworCisgICAgdHJ5CisgICAgeworICAgICAgICBzd2l0Y2ggKGZhY2UpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX0ZST05UOgorICAgICAgICAgIGNhc2UgR0xfQkFDSzoKKyAgICAgICAgICBjYXNlIEdMX0ZST05UX0FORF9CQUNLOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChmdW5jKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9ORVZFUjoKKyAgICAgICAgICBjYXNlIEdMX0FMV0FZUzoKKyAgICAgICAgICBjYXNlIEdMX0xFU1M6CisgICAgICAgICAgY2FzZSBHTF9MRVFVQUw6CisgICAgICAgICAgY2FzZSBHTF9FUVVBTDoKKyAgICAgICAgICBjYXNlIEdMX0dFUVVBTDoKKyAgICAgICAgICBjYXNlIEdMX0dSRUFURVI6CisgICAgICAgICAgY2FzZSBHTF9OT1RFUVVBTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihmYWNlID09IEdMX0ZST05UIHx8IGZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC0+c2V0U3RlbmNpbFBhcmFtcyhmdW5jLCByZWYsIG1hc2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihmYWNlID09IEdMX0JBQ0sgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRTdGVuY2lsQmFja1BhcmFtcyhmdW5jLCByZWYsIG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsU3RlbmNpbE1hc2soR0x1aW50IG1hc2spCit7CisgICAgZ2xTdGVuY2lsTWFza1NlcGFyYXRlKEdMX0ZST05UX0FORF9CQUNLLCBtYXNrKTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xTdGVuY2lsTWFza1NlcGFyYXRlKEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzaykKK3sKKyAgICBUUkFDRSgiKEdMZW51bSBmYWNlID0gMHglWCwgR0x1aW50IG1hc2sgPSAlZCkiLCBmYWNlLCBtYXNrKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgc3dpdGNoIChmYWNlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9GUk9OVDoKKyAgICAgICAgICBjYXNlIEdMX0JBQ0s6CisgICAgICAgICAgY2FzZSBHTF9GUk9OVF9BTkRfQkFDSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihmYWNlID09IEdMX0ZST05UIHx8IGZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC0+c2V0U3RlbmNpbFdyaXRlbWFzayhtYXNrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoZmFjZSA9PSBHTF9CQUNLIHx8IGZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC0+c2V0U3RlbmNpbEJhY2tXcml0ZW1hc2sobWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xTdGVuY2lsT3AoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKQoreworICAgIGdsU3RlbmNpbE9wU2VwYXJhdGUoR0xfRlJPTlRfQU5EX0JBQ0ssIGZhaWwsIHpmYWlsLCB6cGFzcyk7Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsU3RlbmNpbE9wU2VwYXJhdGUoR0xlbnVtIGZhY2UsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykKK3sKKyAgICBUUkFDRSgiKEdMZW51bSBmYWNlID0gMHglWCwgR0xlbnVtIGZhaWwgPSAweCVYLCBHTGVudW0gemZhaWwgPSAweCVYLCBHTGVudW0genBhcyA9IDB4JVhzKSIsCisgICAgICAgICAgZmFjZSwgZmFpbCwgemZhaWwsIHpwYXNzKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgc3dpdGNoIChmYWNlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9GUk9OVDoKKyAgICAgICAgICBjYXNlIEdMX0JBQ0s6CisgICAgICAgICAgY2FzZSBHTF9GUk9OVF9BTkRfQkFDSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZmFpbCkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfWkVSTzoKKyAgICAgICAgICBjYXNlIEdMX0tFRVA6CisgICAgICAgICAgY2FzZSBHTF9SRVBMQUNFOgorICAgICAgICAgIGNhc2UgR0xfSU5DUjoKKyAgICAgICAgICBjYXNlIEdMX0RFQ1I6CisgICAgICAgICAgY2FzZSBHTF9JTlZFUlQ6CisgICAgICAgICAgY2FzZSBHTF9JTkNSX1dSQVA6CisgICAgICAgICAgY2FzZSBHTF9ERUNSX1dSQVA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHpmYWlsKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBHTF9aRVJPOgorICAgICAgICAgIGNhc2UgR0xfS0VFUDoKKyAgICAgICAgICBjYXNlIEdMX1JFUExBQ0U6CisgICAgICAgICAgY2FzZSBHTF9JTkNSOgorICAgICAgICAgIGNhc2UgR0xfREVDUjoKKyAgICAgICAgICBjYXNlIEdMX0lOVkVSVDoKKyAgICAgICAgICBjYXNlIEdMX0lOQ1JfV1JBUDoKKyAgICAgICAgICBjYXNlIEdMX0RFQ1JfV1JBUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoenBhc3MpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEdMX1pFUk86CisgICAgICAgICAgY2FzZSBHTF9LRUVQOgorICAgICAgICAgIGNhc2UgR0xfUkVQTEFDRToKKyAgICAgICAgICBjYXNlIEdMX0lOQ1I6CisgICAgICAgICAgY2FzZSBHTF9ERUNSOgorICAgICAgICAgIGNhc2UgR0xfSU5WRVJUOgorICAgICAgICAgIGNhc2UgR0xfSU5DUl9XUkFQOgorICAgICAgICAgIGNhc2UgR0xfREVDUl9XUkFQOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGZhY2UgPT0gR0xfRlJPTlQgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRTdGVuY2lsT3BlcmF0aW9ucyhmYWlsLCB6ZmFpbCwgenBhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihmYWNlID09IEdMX0JBQ0sgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRTdGVuY2lsQmFja09wZXJhdGlvbnMoZmFpbCwgemZhaWwsIHpwYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCitHTGJvb2xlYW4gX19zdGRjYWxsIGdsVGVzdEZlbmNlTlYoR0x1aW50IGZlbmNlKQoreworICAgIFRSQUNFKCIoR0x1aW50IGZlbmNlID0gJWQpIiwgZmVuY2UpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OkZlbmNlICpmZW5jZU9iamVjdCA9IGNvbnRleHQtPmdldEZlbmNlKGZlbmNlKTsKKworICAgICAgICAgICAgaWYoZmVuY2VPYmplY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04sIEdMX1RSVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmVuY2VPYmplY3QtPnRlc3RGZW5jZSgpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gR0xfVFJVRTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xUZXhJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xpbnQgbGV2ZWwgPSAlZCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQgPSAlZCwgR0xzaXplaSB3aWR0aCA9ICVkLCBHTHNpemVpIGhlaWdodCA9ICVkLCAiCisgICAgICAgICAgIkdMaW50IGJvcmRlciA9ICVkLCBHTGVudW0gZm9ybWF0ID0gMHglWCwgR0xlbnVtIHR5cGUgPSAweCVYLCBjb25zdCBHTHZvaWQqIHBpeGVscyA9ICAweCUwLjhwKSIsCisgICAgICAgICAgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZighdmFsaWRJbWFnZVNpemUobGV2ZWwsIHdpZHRoLCBoZWlnaHQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBpZihpbnRlcm5hbGZvcm1hdCAhPSBmb3JtYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfQUxQSEE6CisgICAgICAgICAgY2FzZSBHTF9MVU1JTkFOQ0U6CisgICAgICAgICAgY2FzZSBHTF9MVU1JTkFOQ0VfQUxQSEE6CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICAgICAgICAgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgICAgICAgICAgY2FzZSBHTF9IQUxGX0ZMT0FUX09FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xfUkdCOgorICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgICAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzU6CisgICAgICAgICAgICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgICAgICAgIGNhc2UgR0xfSEFMRl9GTE9BVF9PRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdMX1JHQkE6CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICAgICAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OgorICAgICAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzE6CisgICAgICAgICAgICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgICAgICAgIGNhc2UgR0xfSEFMRl9GTE9BVF9PRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdMX0JHUkFfRVhUOgorICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6ICAvLyBlcnJvciBjYXNlcyBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcyBhcmUgaGFuZGxlZCBiZWxvdworICAgICAgICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6CisgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGJvcmRlciAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0YXJnZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgICAgICAgICAgICAgICBpZih3aWR0aCA+IChnbDo6SU1QTEVNRU5UQVRJT05fTUFYX1RFWFRVUkVfU0laRSA+PiBsZXZlbCkgfHwKKyAgICAgICAgICAgICAgICAgICBoZWlnaHQgPiAoZ2w6OklNUExFTUVOVEFUSU9OX01BWF9URVhUVVJFX1NJWkUgPj4gbGV2ZWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOgorICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWToKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOgorICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjoKKyAgICAgICAgICAgICAgICBpZih3aWR0aCAhPSBoZWlnaHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYod2lkdGggPiAoZ2w6OklNUExFTUVOVEFUSU9OX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgPj4gbGV2ZWwpIHx8CisgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID4gKGdsOjpJTVBMRU1FTlRBVElPTl9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFID4+IGxldmVsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGZvcm1hdCA9PSBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUIHx8CisgICAgICAgICAgICAgICBmb3JtYXQgPT0gR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoUzNUQ19TVVBQT1JUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCQkJCisgICAgICAgICAgICBpZih0YXJnZXQgPT0gR0xfVEVYVFVSRV8yRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnbDo6VGV4dHVyZTJEICp0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZTJEKCk7CisKKyAgICAgICAgICAgICAgICBpZighdGV4dHVyZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGV4dHVyZS0+c2V0SW1hZ2UobGV2ZWwsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgY29udGV4dC0+Z2V0VW5wYWNrQWxpZ25tZW50KCksIHBpeGVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2w6OlRleHR1cmVDdWJlTWFwICp0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZUN1YmVNYXAoKTsKKworICAgICAgICAgICAgICAgIGlmKCF0ZXh0dXJlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisKKwkJCQl0ZXh0dXJlLT5zZXRJbWFnZSh0YXJnZXQsIGxldmVsLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGNvbnRleHQtPmdldFVucGFja0FsaWdubWVudCgpLCBwaXhlbHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVGV4UGFyYW1ldGVyZihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCit7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgcG5hbWUsIChHTGludClwYXJhbSk7Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVGV4UGFyYW1ldGVyZnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMpCit7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgcG5hbWUsIChHTGludCkqcGFyYW1zKTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xUZXhQYXJhbWV0ZXJpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xlbnVtIHBuYW1lID0gMHglWCwgR0xpbnQgcGFyYW0gPSAlZCkiLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6VGV4dHVyZSAqdGV4dHVyZTsKKworICAgICAgICAgICAgc3dpdGNoICh0YXJnZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgICAgICAgICAgICAgICB0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZTJEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUDoKKyAgICAgICAgICAgICAgICB0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZUN1YmVNYXAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChwbmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfUzoKKyAgICAgICAgICAgICAgICBpZighdGV4dHVyZS0+c2V0V3JhcFMoKEdMZW51bSlwYXJhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9XUkFQX1Q6CisgICAgICAgICAgICAgICAgaWYoIXRleHR1cmUtPnNldFdyYXBUKChHTGVudW0pcGFyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUjoKKyAgICAgICAgICAgICAgICBpZighdGV4dHVyZS0+c2V0TWluRmlsdGVyKChHTGVudW0pcGFyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUjoKKyAgICAgICAgICAgICAgICBpZighdGV4dHVyZS0+c2V0TWFnRmlsdGVyKChHTGVudW0pcGFyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVGV4UGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKQoreworICAgIGdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIHBuYW1lLCAqcGFyYW1zKTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpCit7CisgICAgVFJBQ0UoIihHTGVudW0gdGFyZ2V0ID0gMHglWCwgR0xpbnQgbGV2ZWwgPSAlZCwgR0xpbnQgeG9mZnNldCA9ICVkLCBHTGludCB5b2Zmc2V0ID0gJWQsICIKKyAgICAgICAgICAiR0xzaXplaSB3aWR0aCA9ICVkLCBHTHNpemVpIGhlaWdodCA9ICVkLCBHTGVudW0gZm9ybWF0ID0gMHglWCwgR0xlbnVtIHR5cGUgPSAweCVYLCAiCisgICAgICAgICAgImNvbnN0IEdMdm9pZCogcGl4ZWxzID0gMHglMC44cCkiLAorICAgICAgICAgICB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKCFnbDo6SXNUZXh0dXJlVGFyZ2V0KHRhcmdldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICB9CisKKyAgICAgICAgaWYobGV2ZWwgPCAwIHx8IHhvZmZzZXQgPCAwIHx8IHlvZmZzZXQgPCAwIHx8IHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBpZihzdGQ6Om51bWVyaWNfbGltaXRzPEdMc2l6ZWk+OjptYXgoKSAtIHhvZmZzZXQgPCB3aWR0aCB8fCBzdGQ6Om51bWVyaWNfbGltaXRzPEdMc2l6ZWk+OjptYXgoKSAtIHlvZmZzZXQgPCBoZWlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCFnbDo6Q2hlY2tUZXh0dXJlRm9ybWF0VHlwZShmb3JtYXQsIHR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgcGl4ZWxzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihsZXZlbCA+IGdsOjpJTVBMRU1FTlRBVElPTl9NQVhfVEVYVFVSRV9MRVZFTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih0YXJnZXQgPT0gR0xfVEVYVFVSRV8yRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnbDo6VGV4dHVyZTJEICp0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZTJEKCk7CisKKyAgICAgICAgICAgICAgICBpZighdGV4dHVyZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGV4dHVyZS0+c3ViSW1hZ2UobGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgY29udGV4dC0+Z2V0VW5wYWNrQWxpZ25tZW50KCksIHBpeGVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGdsOjpJc0N1YmVtYXBUZXh0dXJlVGFyZ2V0KHRhcmdldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2w6OlRleHR1cmVDdWJlTWFwICp0ZXh0dXJlID0gY29udGV4dC0+Z2V0VGV4dHVyZUN1YmVNYXAoKTsKKworICAgICAgICAgICAgICAgIGlmKCF0ZXh0dXJlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLT5zdWJJbWFnZSh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGNvbnRleHQtPmdldFVucGFja0FsaWdubWVudCgpLCBwaXhlbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xVbmlmb3JtMWYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCkKK3sKKyAgICBnbFVuaWZvcm0xZnYobG9jYXRpb24sIDEsICZ4KTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xVbmlmb3JtMWZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KQoreworICAgIFRSQUNFKCIoR0xpbnQgbG9jYXRpb24gPSAlZCwgR0xzaXplaSBjb3VudCA9ICVkLCBjb25zdCBHTGZsb2F0KiB2ID0gMHglMC44cCkiLCBsb2NhdGlvbiwgY291bnQsIHYpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihjb3VudCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxvY2F0aW9uID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW0gPSBjb250ZXh0LT5nZXRDdXJyZW50UHJvZ3JhbSgpOworCisgICAgICAgICAgICBpZighcHJvZ3JhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighcHJvZ3JhbS0+c2V0VW5pZm9ybTFmdihsb2NhdGlvbiwgY291bnQsIHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xVbmlmb3JtMWkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpCit7CisgICAgZ2xVbmlmb3JtMWl2KGxvY2F0aW9uLCAxLCAmeCk7Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVW5pZm9ybTFpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpCit7CisgICAgVFJBQ0UoIihHTGludCBsb2NhdGlvbiA9ICVkLCBHTHNpemVpIGNvdW50ID0gJWQsIGNvbnN0IEdMaW50KiB2ID0gMHglMC44cCkiLCBsb2NhdGlvbiwgY291bnQsIHYpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihjb3VudCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxvY2F0aW9uID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW0gPSBjb250ZXh0LT5nZXRDdXJyZW50UHJvZ3JhbSgpOworCisgICAgICAgICAgICBpZighcHJvZ3JhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighcHJvZ3JhbS0+c2V0VW5pZm9ybTFpdihsb2NhdGlvbiwgY291bnQsIHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xVbmlmb3JtMmYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KQoreworICAgIEdMZmxvYXQgeHlbMl0gPSB7eCwgeX07CisKKyAgICBnbFVuaWZvcm0yZnYobG9jYXRpb24sIDEsIChHTGZsb2F0KikmeHkpOworfQorCit2b2lkIF9fc3RkY2FsbCBnbFVuaWZvcm0yZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpCit7CisgICAgVFJBQ0UoIihHTGludCBsb2NhdGlvbiA9ICVkLCBHTHNpemVpIGNvdW50ID0gJWQsIGNvbnN0IEdMZmxvYXQqIHYgPSAweCUwLjhwKSIsIGxvY2F0aW9uLCBjb3VudCwgdik7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGNvdW50IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihsb2NhdGlvbiA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpQcm9ncmFtICpwcm9ncmFtID0gY29udGV4dC0+Z2V0Q3VycmVudFByb2dyYW0oKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIXByb2dyYW0tPnNldFVuaWZvcm0yZnYobG9jYXRpb24sIGNvdW50LCB2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVW5pZm9ybTJpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KQoreworICAgIEdMaW50IHh5WzRdID0ge3gsIHl9OworCisgICAgZ2xVbmlmb3JtMml2KGxvY2F0aW9uLCAxLCAoR0xpbnQqKSZ4eSk7Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVW5pZm9ybTJpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpCit7CisgICAgVFJBQ0UoIihHTGludCBsb2NhdGlvbiA9ICVkLCBHTHNpemVpIGNvdW50ID0gJWQsIGNvbnN0IEdMaW50KiB2ID0gMHglMC44cCkiLCBsb2NhdGlvbiwgY291bnQsIHYpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihjb3VudCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxvY2F0aW9uID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW0gPSBjb250ZXh0LT5nZXRDdXJyZW50UHJvZ3JhbSgpOworCisgICAgICAgICAgICBpZighcHJvZ3JhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighcHJvZ3JhbS0+c2V0VW5pZm9ybTJpdihsb2NhdGlvbiwgY291bnQsIHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xVbmlmb3JtM2YoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCit7CisgICAgR0xmbG9hdCB4eXpbM10gPSB7eCwgeSwgen07CisKKyAgICBnbFVuaWZvcm0zZnYobG9jYXRpb24sIDEsIChHTGZsb2F0KikmeHl6KTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xVbmlmb3JtM2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KQoreworICAgIFRSQUNFKCIoR0xpbnQgbG9jYXRpb24gPSAlZCwgR0xzaXplaSBjb3VudCA9ICVkLCBjb25zdCBHTGZsb2F0KiB2ID0gMHglMC44cCkiLCBsb2NhdGlvbiwgY291bnQsIHYpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihjb3VudCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxvY2F0aW9uID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW0gPSBjb250ZXh0LT5nZXRDdXJyZW50UHJvZ3JhbSgpOworCisgICAgICAgICAgICBpZighcHJvZ3JhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighcHJvZ3JhbS0+c2V0VW5pZm9ybTNmdihsb2NhdGlvbiwgY291bnQsIHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xVbmlmb3JtM2koR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopCit7CisgICAgR0xpbnQgeHl6WzNdID0ge3gsIHksIHp9OworCisgICAgZ2xVbmlmb3JtM2l2KGxvY2F0aW9uLCAxLCAoR0xpbnQqKSZ4eXopOworfQorCit2b2lkIF9fc3RkY2FsbCBnbFVuaWZvcm0zaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KQoreworICAgIFRSQUNFKCIoR0xpbnQgbG9jYXRpb24gPSAlZCwgR0xzaXplaSBjb3VudCA9ICVkLCBjb25zdCBHTGludCogdiA9IDB4JTAuOHApIiwgbG9jYXRpb24sIGNvdW50LCB2KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoY291bnQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBpZihsb2NhdGlvbiA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpQcm9ncmFtICpwcm9ncmFtID0gY29udGV4dC0+Z2V0Q3VycmVudFByb2dyYW0oKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIXByb2dyYW0tPnNldFVuaWZvcm0zaXYobG9jYXRpb24sIGNvdW50LCB2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVW5pZm9ybTRmKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpCit7CisgICAgR0xmbG9hdCB4eXp3WzRdID0ge3gsIHksIHosIHd9OworCisgICAgZ2xVbmlmb3JtNGZ2KGxvY2F0aW9uLCAxLCAoR0xmbG9hdCopJnh5encpOworfQorCit2b2lkIF9fc3RkY2FsbCBnbFVuaWZvcm00ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpCit7CisgICAgVFJBQ0UoIihHTGludCBsb2NhdGlvbiA9ICVkLCBHTHNpemVpIGNvdW50ID0gJWQsIGNvbnN0IEdMZmxvYXQqIHYgPSAweCUwLjhwKSIsIGxvY2F0aW9uLCBjb3VudCwgdik7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGNvdW50IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgaWYobG9jYXRpb24gPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6UHJvZ3JhbSAqcHJvZ3JhbSA9IGNvbnRleHQtPmdldEN1cnJlbnRQcm9ncmFtKCk7CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtLT5zZXRVbmlmb3JtNGZ2KGxvY2F0aW9uLCBjb3VudCwgdikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFVuaWZvcm00aShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdykKK3sKKyAgICBHTGludCB4eXp3WzRdID0ge3gsIHksIHosIHd9OworCisgICAgZ2xVbmlmb3JtNGl2KGxvY2F0aW9uLCAxLCAoR0xpbnQqKSZ4eXp3KTsKK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xVbmlmb3JtNGl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikKK3sKKyAgICBUUkFDRSgiKEdMaW50IGxvY2F0aW9uID0gJWQsIEdMc2l6ZWkgY291bnQgPSAlZCwgY29uc3QgR0xpbnQqIHYgPSAweCUwLjhwKSIsIGxvY2F0aW9uLCBjb3VudCwgdik7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGNvdW50IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgaWYobG9jYXRpb24gPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6UHJvZ3JhbSAqcHJvZ3JhbSA9IGNvbnRleHQtPmdldEN1cnJlbnRQcm9ncmFtKCk7CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtLT5zZXRVbmlmb3JtNGl2KGxvY2F0aW9uLCBjb3VudCwgdikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFVuaWZvcm1NYXRyaXgyZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKQoreworICAgIFRSQUNFKCIoR0xpbnQgbG9jYXRpb24gPSAlZCwgR0xzaXplaSBjb3VudCA9ICVkLCBHTGJvb2xlYW4gdHJhbnNwb3NlID0gJWQsIGNvbnN0IEdMZmxvYXQqIHZhbHVlID0gMHglMC44cCkiLAorICAgICAgICAgIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGNvdW50IDwgMCB8fCB0cmFuc3Bvc2UgIT0gR0xfRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxvY2F0aW9uID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW0gPSBjb250ZXh0LT5nZXRDdXJyZW50UHJvZ3JhbSgpOworCisgICAgICAgICAgICBpZighcHJvZ3JhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighcHJvZ3JhbS0+c2V0VW5pZm9ybU1hdHJpeDJmdihsb2NhdGlvbiwgY291bnQsIHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVW5pZm9ybU1hdHJpeDNmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpCit7CisgICAgVFJBQ0UoIihHTGludCBsb2NhdGlvbiA9ICVkLCBHTHNpemVpIGNvdW50ID0gJWQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UgPSAlZCwgY29uc3QgR0xmbG9hdCogdmFsdWUgPSAweCUwLjhwKSIsCisgICAgICAgICAgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoY291bnQgPCAwIHx8IHRyYW5zcG9zZSAhPSBHTF9GQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgaWYobG9jYXRpb24gPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBnbDo6UHJvZ3JhbSAqcHJvZ3JhbSA9IGNvbnRleHQtPmdldEN1cnJlbnRQcm9ncmFtKCk7CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCFwcm9ncmFtLT5zZXRVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xVbmlmb3JtTWF0cml4NGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkKK3sKKyAgICBUUkFDRSgiKEdMaW50IGxvY2F0aW9uID0gJWQsIEdMc2l6ZWkgY291bnQgPSAlZCwgR0xib29sZWFuIHRyYW5zcG9zZSA9ICVkLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSA9IDB4JTAuOHApIiwKKyAgICAgICAgICBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihjb3VudCA8IDAgfHwgdHJhbnNwb3NlICE9IEdMX0ZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBpZihsb2NhdGlvbiA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpQcm9ncmFtICpwcm9ncmFtID0gY29udGV4dC0+Z2V0Q3VycmVudFByb2dyYW0oKTsKKworICAgICAgICAgICAgaWYoIXByb2dyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIXByb2dyYW0tPnNldFVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGNvdW50LCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFVzZVByb2dyYW0oR0x1aW50IHByb2dyYW0pCit7CisgICAgVFJBQ0UoIihHTHVpbnQgcHJvZ3JhbSA9ICVkKSIsIHByb2dyYW0pOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW1PYmplY3QgPSBjb250ZXh0LT5nZXRQcm9ncmFtKHByb2dyYW0pOworCisgICAgICAgICAgICBpZighcHJvZ3JhbU9iamVjdCAmJiBwcm9ncmFtICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dC0+Z2V0U2hhZGVyKHByb2dyYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocHJvZ3JhbSAhPSAwICYmICFwcm9ncmFtT2JqZWN0LT5pc0xpbmtlZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRleHQtPnVzZVByb2dyYW0ocHJvZ3JhbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xWYWxpZGF0ZVByb2dyYW0oR0x1aW50IHByb2dyYW0pCit7CisgICAgVFJBQ0UoIihHTHVpbnQgcHJvZ3JhbSA9ICVkKSIsIHByb2dyYW0pOworCisgICAgdHJ5CisgICAgeworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2w6OlByb2dyYW0gKnByb2dyYW1PYmplY3QgPSBjb250ZXh0LT5nZXRQcm9ncmFtKHByb2dyYW0pOworCisgICAgICAgICAgICBpZighcHJvZ3JhbU9iamVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihjb250ZXh0LT5nZXRTaGFkZXIocHJvZ3JhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm9ncmFtT2JqZWN0LT52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVmVydGV4QXR0cmliMWYoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgaW5kZXggPSAlZCwgR0xmbG9hdCB4ID0gJWYpIiwgaW5kZXgsIHgpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihpbmRleCA+PSBnbDo6TUFYX1ZFUlRFWF9BVFRSSUJTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCB2YWxzWzRdID0geyB4LCAwLCAwLCAxIH07CisgICAgICAgICAgICBjb250ZXh0LT5zZXRWZXJ0ZXhBdHRyaWIoaW5kZXgsIHZhbHMpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVmVydGV4QXR0cmliMWZ2KEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKQoreworICAgIFRSQUNFKCIoR0x1aW50IGluZGV4ID0gJWQsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyA9IDB4JTAuOHApIiwgaW5kZXgsIHZhbHVlcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGluZGV4ID49IGdsOjpNQVhfVkVSVEVYX0FUVFJJQlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IHZhbHNbNF0gPSB7IHZhbHVlc1swXSwgMCwgMCwgMSB9OworICAgICAgICAgICAgY29udGV4dC0+c2V0VmVydGV4QXR0cmliKGluZGV4LCB2YWxzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFZlcnRleEF0dHJpYjJmKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgaW5kZXggPSAlZCwgR0xmbG9hdCB4ID0gJWYsIEdMZmxvYXQgeSA9ICVmKSIsIGluZGV4LCB4LCB5KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoaW5kZXggPj0gZ2w6Ok1BWF9WRVJURVhfQVRUUklCUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgdmFsc1s0XSA9IHsgeCwgeSwgMCwgMSB9OworICAgICAgICAgICAgY29udGV4dC0+c2V0VmVydGV4QXR0cmliKGluZGV4LCB2YWxzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFZlcnRleEF0dHJpYjJmdihHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykKK3sKKyAgICBUUkFDRSgiKEdMdWludCBpbmRleCA9ICVkLCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMgPSAweCUwLjhwKSIsIGluZGV4LCB2YWx1ZXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihpbmRleCA+PSBnbDo6TUFYX1ZFUlRFWF9BVFRSSUJTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCB2YWxzWzRdID0geyB2YWx1ZXNbMF0sIHZhbHVlc1sxXSwgMCwgMSB9OworICAgICAgICAgICAgY29udGV4dC0+c2V0VmVydGV4QXR0cmliKGluZGV4LCB2YWxzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFZlcnRleEF0dHJpYjNmKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKK3sKKyAgICBUUkFDRSgiKEdMdWludCBpbmRleCA9ICVkLCBHTGZsb2F0IHggPSAlZiwgR0xmbG9hdCB5ID0gJWYsIEdMZmxvYXQgeiA9ICVmKSIsIGluZGV4LCB4LCB5LCB6KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoaW5kZXggPj0gZ2w6Ok1BWF9WRVJURVhfQVRUUklCUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgdmFsc1s0XSA9IHsgeCwgeSwgeiwgMSB9OworICAgICAgICAgICAgY29udGV4dC0+c2V0VmVydGV4QXR0cmliKGluZGV4LCB2YWxzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFZlcnRleEF0dHJpYjNmdihHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykKK3sKKyAgICBUUkFDRSgiKEdMdWludCBpbmRleCA9ICVkLCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMgPSAweCUwLjhwKSIsIGluZGV4LCB2YWx1ZXMpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihpbmRleCA+PSBnbDo6TUFYX1ZFUlRFWF9BVFRSSUJTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCB2YWxzWzRdID0geyB2YWx1ZXNbMF0sIHZhbHVlc1sxXSwgdmFsdWVzWzJdLCAxIH07CisgICAgICAgICAgICBjb250ZXh0LT5zZXRWZXJ0ZXhBdHRyaWIoaW5kZXgsIHZhbHMpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVmVydGV4QXR0cmliNGYoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgaW5kZXggPSAlZCwgR0xmbG9hdCB4ID0gJWYsIEdMZmxvYXQgeSA9ICVmLCBHTGZsb2F0IHogPSAlZiwgR0xmbG9hdCB3ID0gJWYpIiwgaW5kZXgsIHgsIHksIHosIHcpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBpZihpbmRleCA+PSBnbDo6TUFYX1ZFUlRFWF9BVFRSSUJTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBnbDo6Q29udGV4dCAqY29udGV4dCA9IGdsOjpnZXRDb250ZXh0KCk7CisKKyAgICAgICAgaWYoY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCB2YWxzWzRdID0geyB4LCB5LCB6LCB3IH07CisgICAgICAgICAgICBjb250ZXh0LT5zZXRWZXJ0ZXhBdHRyaWIoaW5kZXgsIHZhbHMpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoKHN0ZDo6YmFkX2FsbG9jJikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcihHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICB9Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsVmVydGV4QXR0cmliNGZ2KEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKQoreworICAgIFRSQUNFKCIoR0x1aW50IGluZGV4ID0gJWQsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyA9IDB4JTAuOHApIiwgaW5kZXgsIHZhbHVlcyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGlmKGluZGV4ID49IGdsOjpNQVhfVkVSVEVYX0FUVFJJQlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LT5zZXRWZXJ0ZXhBdHRyaWIoaW5kZXgsIHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwdHIpCit7CisgICAgVFJBQ0UoIihHTHVpbnQgaW5kZXggPSAlZCwgR0xpbnQgc2l6ZSA9ICVkLCBHTGVudW0gdHlwZSA9IDB4JVgsICIKKyAgICAgICAgICAiR0xib29sZWFuIG5vcm1hbGl6ZWQgPSAlZCwgR0xzaXplaSBzdHJpZGUgPSAlZCwgY29uc3QgR0x2b2lkKiBwdHIgPSAweCUwLjhwKSIsCisgICAgICAgICAgaW5kZXgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcHRyKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYoaW5kZXggPj0gZ2w6Ok1BWF9WRVJURVhfQVRUUklCUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgaWYoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAodHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfQllURToKKyAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgICAgY2FzZSBHTF9TSE9SVDoKKyAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgorICAgICAgICAgIGNhc2UgR0xfRklYRUQ6CisgICAgICAgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHN0cmlkZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LT5zZXRWZXJ0ZXhBdHRyaWJTdGF0ZShpbmRleCwgY29udGV4dC0+Z2V0QXJyYXlCdWZmZXIoKSwgc2l6ZSwgdHlwZSwgKG5vcm1hbGl6ZWQgPT0gR0xfVFJVRSksIHN0cmlkZSwgcHRyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbFZpZXdwb3J0KEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQoreworICAgIFRSQUNFKCIoR0xpbnQgeCA9ICVkLCBHTGludCB5ID0gJWQsIEdMc2l6ZWkgd2lkdGggPSAlZCwgR0xzaXplaSBoZWlnaHQgPSAlZCkiLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYod2lkdGggPCAwIHx8IGhlaWdodCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsOjpDb250ZXh0ICpjb250ZXh0ID0gZ2w6OmdldENvbnRleHQoKTsKKworICAgICAgICBpZihjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LT5zZXRWaWV3cG9ydFBhcmFtcyh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIF9fc3RkY2FsbCBnbEJsaXRGcmFtZWJ1ZmZlckFOR0xFKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKQoreworICAgIFRSQUNFKCIoR0xpbnQgc3JjWDAgPSAlZCwgR0xpbnQgc3JjWTAgPSAlZCwgR0xpbnQgc3JjWDEgPSAlZCwgR0xpbnQgc3JjWTEgPSAlZCwgIgorICAgICAgICAgICJHTGludCBkc3RYMCA9ICVkLCBHTGludCBkc3RZMCA9ICVkLCBHTGludCBkc3RYMSA9ICVkLCBHTGludCBkc3RZMSA9ICVkLCAiCisgICAgICAgICAgIkdMYml0ZmllbGQgbWFzayA9IDB4JVgsIEdMZW51bSBmaWx0ZXIgPSAweCVYKSIsCisgICAgICAgICAgc3JjWDAsIHNyY1kwLCBzcmNYMSwgc3JjWDEsIGRzdFgwLCBkc3RZMCwgZHN0WDEsIGRzdFkxLCBtYXNrLCBmaWx0ZXIpOworCisgICAgdHJ5CisgICAgeworICAgICAgICBzd2l0Y2ggKGZpbHRlcikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgR0xfTkVBUkVTVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKChtYXNrICYgfihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfU1RFTkNJTF9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHNyY1gxIC0gc3JjWDAgIT0gZHN0WDEgLSBkc3RYMCB8fCBzcmNZMSAtIHNyY1kwICE9IGRzdFkxIC0gZHN0WTApCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiU2NhbGluZyBhbmQgZmxpcHBpbmcgaW4gQmxpdEZyYW1lYnVmZmVyQU5HTEUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICB9CisKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGNvbnRleHQtPmdldFJlYWRGcmFtZWJ1ZmZlckhhbmRsZSgpID09IGNvbnRleHQtPmdldERyYXdGcmFtZWJ1ZmZlckhhbmRsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVSUigiQmxpdHMgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGZyYW1lYnVmZmVyIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC0+YmxpdEZyYW1lYnVmZmVyKHNyY1gwLCBzcmNZMCwgc3JjWDEsIHNyY1kxLCBkc3RYMCwgZHN0WTAsIGRzdFgxLCBkc3RZMSwgbWFzayk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKwordm9pZCBfX3N0ZGNhbGwgZ2xUZXhJbWFnZTNET0VTKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKQoreworICAgIFRSQUNFKCIoR0xlbnVtIHRhcmdldCA9IDB4JVgsIEdMaW50IGxldmVsID0gJWQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCA9IDB4JVgsICIKKyAgICAgICAgICAiR0xzaXplaSB3aWR0aCA9ICVkLCBHTHNpemVpIGhlaWdodCA9ICVkLCBHTHNpemVpIGRlcHRoID0gJWQsIEdMaW50IGJvcmRlciA9ICVkLCAiCisgICAgICAgICAgIkdMZW51bSBmb3JtYXQgPSAweCVYLCBHTGVudW0gdHlwZSA9IDB4JXgsIGNvbnN0IEdMdm9pZCogcGl4ZWxzID0gMHglMC44cCkiLAorICAgICAgICAgIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisKKyAgICB0cnkKKyAgICB7CisgICAgICAgIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQorICAgIH0KKyAgICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYpCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3IoR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCitfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIF9fc3RkY2FsbCBnbEdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIgKnByb2NuYW1lKQoreworICAgIHN0cnVjdCBFeHRlbnNpb24KKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgYWRkcmVzczsKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IEV4dGVuc2lvbiBnbEV4dGVuc2lvbnNbXSA9CisgICAgeworICAgICAgICB7ImdsVGV4SW1hZ2UzRE9FUyIsIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsVGV4SW1hZ2UzRE9FU30sCisgICAgICAgIHsiZ2xCbGl0RnJhbWVidWZmZXJBTkdMRSIsIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsQmxpdEZyYW1lYnVmZmVyQU5HTEV9LAorICAgICAgICB7ImdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEUiLCAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFfSwKKyAgICAgICAgeyJnbERlbGV0ZUZlbmNlc05WIiwgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xEZWxldGVGZW5jZXNOVn0sCisgICAgICAgIHsiZ2xHZW5GZW5jZXNOViIsIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsR2VuRmVuY2VzTlZ9LAorICAgICAgICB7ImdsSXNGZW5jZU5WIiwgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xJc0ZlbmNlTlZ9LAorICAgICAgICB7ImdsVGVzdEZlbmNlTlYiLCAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbFRlc3RGZW5jZU5WfSwKKyAgICAgICAgeyJnbEdldEZlbmNlaXZOViIsIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsR2V0RmVuY2Vpdk5WfSwKKyAgICAgICAgeyJnbEZpbmlzaEZlbmNlTlYiLCAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbEZpbmlzaEZlbmNlTlZ9LAorICAgICAgICB7ImdsU2V0RmVuY2VOViIsIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsU2V0RmVuY2VOVn0sCisgICAgfTsKKworICAgIGZvcihpbnQgZXh0ID0gMDsgZXh0IDwgc2l6ZW9mKGdsRXh0ZW5zaW9ucykgLyBzaXplb2YoRXh0ZW5zaW9uKTsgZXh0KyspCisgICAgeworICAgICAgICBpZihzdHJjbXAocHJvY25hbWUsIGdsRXh0ZW5zaW9uc1tleHRdLm5hbWUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbEV4dGVuc2lvbnNbZXh0XS5hZGRyZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgX19zdGRjYWxsIGdsQmluZFRleEltYWdlKGVnbDo6U3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgICBUUkFDRSgiKGVnbDo6U3VyZmFjZSogc3VyZmFjZSA9IDB4JTAuOHApIiwKKyAgICAgICAgICBzdXJmYWNlKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbDo6Z2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpUZXh0dXJlMkQgKnRleHR1cmVPYmplY3QgPSBjb250ZXh0LT5nZXRUZXh0dXJlMkQoKTsKKworICAgICAgICAgICAgaWYodGV4dHVyZU9iamVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXh0dXJlT2JqZWN0LT5iaW5kVGV4SW1hZ2Uoc3VyZmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKEdMX09VVF9PRl9NRU1PUlkpOworICAgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL2xpYkdMRVN2Mi5kZWYgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvbGliR0xFU3YyLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg2NzJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL2xpYkdMRVN2Mi5kZWYKQEAgLTAsMCArMSwxNzAgQEAKK0xJQlJBUlkgbGliR0xFU3YyCitFWFBPUlRTCisgICAgZ2xBY3RpdmVUZXh0dXJlICAgICAgICAgICAgICAgICBAMQorICAgIGdsQXR0YWNoU2hhZGVyICAgICAgICAgICAgICAgICAgQDIKKyAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbiAgICAgICAgICAgIEAzCisgICAgZ2xCaW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICBANAorICAgIGdsQmluZEZyYW1lYnVmZmVyICAgICAgICAgICAgICAgQDUKKyAgICBnbEJpbmRSZW5kZXJidWZmZXIgICAgICAgICAgICAgIEA2CisgICAgZ2xCaW5kVGV4dHVyZSAgICAgICAgICAgICAgICAgICBANworICAgIGdsQmxlbmRDb2xvciAgICAgICAgICAgICAgICAgICAgQDgKKyAgICBnbEJsZW5kRXF1YXRpb24gICAgICAgICAgICAgICAgIEA5CisgICAgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgICAgICAgICBAMTAKKyAgICBnbEJsZW5kRnVuYyAgICAgICAgICAgICAgICAgICAgIEAxMQorICAgIGdsQmxlbmRGdW5jU2VwYXJhdGUgICAgICAgICAgICAgQDEyCisgICAgZ2xCdWZmZXJEYXRhICAgICAgICAgICAgICAgICAgICBAMTMKKyAgICBnbEJ1ZmZlclN1YkRhdGEgICAgICAgICAgICAgICAgIEAxNAorICAgIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyAgICAgICAgQDE1CisgICAgZ2xDbGVhciAgICAgICAgICAgICAgICAgICAgICAgICBAMTYKKyAgICBnbENsZWFyQ29sb3IgICAgICAgICAgICAgICAgICAgIEAxNworICAgIGdsQ2xlYXJEZXB0aGYgICAgICAgICAgICAgICAgICAgQDE4CisgICAgZ2xDbGVhclN0ZW5jaWwgICAgICAgICAgICAgICAgICBAMTkKKyAgICBnbENvbG9yTWFzayAgICAgICAgICAgICAgICAgICAgIEAyMAorICAgIGdsQ29tcGlsZVNoYWRlciAgICAgICAgICAgICAgICAgQDIxCisgICAgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAgICAgICAgICBAMjIKKyAgICBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEICAgICAgIEAyMworICAgIGdsQ29weVRleEltYWdlMkQgICAgICAgICAgICAgICAgQDI0CisgICAgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAgICAgICAgICAgICBAMjUKKyAgICBnbENyZWF0ZVByb2dyYW0gICAgICAgICAgICAgICAgIEAyNgorICAgIGdsQ3JlYXRlU2hhZGVyICAgICAgICAgICAgICAgICAgQDI3CisgICAgZ2xDdWxsRmFjZSAgICAgICAgICAgICAgICAgICAgICBAMjgKKyAgICBnbERlbGV0ZUJ1ZmZlcnMgICAgICAgICAgICAgICAgIEAyOQorICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzICAgICAgICAgICAgQDMwCisgICAgZ2xEZWxldGVQcm9ncmFtICAgICAgICAgICAgICAgICBAMzIKKyAgICBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMgICAgICAgICAgIEAzMworICAgIGdsRGVsZXRlU2hhZGVyICAgICAgICAgICAgICAgICAgQDM0CisgICAgZ2xEZWxldGVUZXh0dXJlcyAgICAgICAgICAgICAgICBAMzEKKyAgICBnbERlcHRoRnVuYyAgICAgICAgICAgICAgICAgICAgIEAzNgorICAgIGdsRGVwdGhNYXNrICAgICAgICAgICAgICAgICAgICAgQDM3CisgICAgZ2xEZXB0aFJhbmdlZiAgICAgICAgICAgICAgICAgICBAMzgKKyAgICBnbERldGFjaFNoYWRlciAgICAgICAgICAgICAgICAgIEAzNQorICAgIGdsRGlzYWJsZSAgICAgICAgICAgICAgICAgICAgICAgQDM5CisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgICAgICBANDAKKyAgICBnbERyYXdBcnJheXMgICAgICAgICAgICAgICAgICAgIEA0MQorICAgIGdsRHJhd0VsZW1lbnRzICAgICAgICAgICAgICAgICAgQDQyCisgICAgZ2xFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICBANDMKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5ICAgICAgIEA0NAorICAgIGdsRmluaXNoICAgICAgICAgICAgICAgICAgICAgICAgQDQ1CisgICAgZ2xGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICBANDYKKyAgICBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyICAgICAgIEA0NworICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQgICAgICAgICAgQDQ4CisgICAgZ2xGcm9udEZhY2UgICAgICAgICAgICAgICAgICAgICBANDkKKyAgICBnbEdlbkJ1ZmZlcnMgICAgICAgICAgICAgICAgICAgIEA1MAorICAgIGdsR2VuRnJhbWVidWZmZXJzICAgICAgICAgICAgICAgQDUyCisgICAgZ2xHZW5SZW5kZXJidWZmZXJzICAgICAgICAgICAgICBANTMKKyAgICBnbEdlblRleHR1cmVzICAgICAgICAgICAgICAgICAgIEA1NAorICAgIGdsR2VuZXJhdGVNaXBtYXAgICAgICAgICAgICAgICAgQDUxCisgICAgZ2xHZXRBY3RpdmVBdHRyaWIgICAgICAgICAgICAgICBANTUKKyAgICBnbEdldEFjdGl2ZVVuaWZvcm0gICAgICAgICAgICAgIEA1NgorICAgIGdsR2V0QXR0YWNoZWRTaGFkZXJzICAgICAgICAgICAgQDU3CisgICAgZ2xHZXRBdHRyaWJMb2NhdGlvbiAgICAgICAgICAgICBANTgKKyAgICBnbEdldEJvb2xlYW52ICAgICAgICAgICAgICAgICAgIEA1OQorICAgIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgICAgICAgICAgQDYwCisgICAgZ2xHZXRFcnJvciAgICAgICAgICAgICAgICAgICAgICBANjEKKyAgICBnbEdldEZsb2F0diAgICAgICAgICAgICAgICAgICAgIEA2MgorICAgIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYgICBANjMKKyAgICBnbEdldEludGVnZXJ2ICAgICAgICAgICAgICAgICAgIEA2NAorICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cgICAgICAgICAgICAgQDY2CisgICAgZ2xHZXRQcm9ncmFtaXYgICAgICAgICAgICAgICAgICBANjUKKyAgICBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2ICAgIEA2NworICAgIGdsR2V0U2hhZGVySW5mb0xvZyAgICAgICAgICAgICAgQDY5CisgICAgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgICAgICBANzAKKyAgICBnbEdldFNoYWRlclNvdXJjZSAgICAgICAgICAgICAgIEA3MQorICAgIGdsR2V0U2hhZGVyaXYgICAgICAgICAgICAgICAgICAgQDY4CisgICAgZ2xHZXRTdHJpbmcgICAgICAgICAgICAgICAgICAgICBANzIKKyAgICBnbEdldFRleFBhcmFtZXRlcmZ2ICAgICAgICAgICAgIEA3MworICAgIGdsR2V0VGV4UGFyYW1ldGVyaXYgICAgICAgICAgICAgQDc0CisgICAgZ2xHZXRVbmlmb3JtTG9jYXRpb24gICAgICAgICAgICBANzcKKyAgICBnbEdldFVuaWZvcm1mdiAgICAgICAgICAgICAgICAgIEA3NQorICAgIGdsR2V0VW5pZm9ybWl2ICAgICAgICAgICAgICAgICAgQDc2CisgICAgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiAgICAgICBAODAKKyAgICBnbEdldFZlcnRleEF0dHJpYmZ2ICAgICAgICAgICAgIEA3OAorICAgIGdsR2V0VmVydGV4QXR0cmliaXYgICAgICAgICAgICAgQDc5CisgICAgZ2xIaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBAODEKKyAgICBnbElzQnVmZmVyICAgICAgICAgICAgICAgICAgICAgIEA4MgorICAgIGdsSXNFbmFibGVkICAgICAgICAgICAgICAgICAgICAgQDgzCisgICAgZ2xJc0ZyYW1lYnVmZmVyICAgICAgICAgICAgICAgICBAODQKKyAgICBnbElzUHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgIEA4NQorICAgIGdsSXNSZW5kZXJidWZmZXIgICAgICAgICAgICAgICAgQDg2CisgICAgZ2xJc1NoYWRlciAgICAgICAgICAgICAgICAgICAgICBAODcKKyAgICBnbElzVGV4dHVyZSAgICAgICAgICAgICAgICAgICAgIEA4OAorICAgIGdsTGluZVdpZHRoICAgICAgICAgICAgICAgICAgICAgQDg5CisgICAgZ2xMaW5rUHJvZ3JhbSAgICAgICAgICAgICAgICAgICBAOTAKKyAgICBnbFBpeGVsU3RvcmVpICAgICAgICAgICAgICAgICAgIEA5MQorICAgIGdsUG9seWdvbk9mZnNldCAgICAgICAgICAgICAgICAgQDkyCisgICAgZ2xSZWFkUGl4ZWxzICAgICAgICAgICAgICAgICAgICBAOTMKKyAgICBnbFJlbGVhc2VTaGFkZXJDb21waWxlciAgICAgICAgIEA5NAorICAgIGdsUmVuZGVyYnVmZmVyU3RvcmFnZSAgICAgICAgICAgQDk1CisgICAgZ2xTYW1wbGVDb3ZlcmFnZSAgICAgICAgICAgICAgICBAOTYKKyAgICBnbFNjaXNzb3IgICAgICAgICAgICAgICAgICAgICAgIEA5NworICAgIGdsU2hhZGVyQmluYXJ5ICAgICAgICAgICAgICAgICAgQDk4CisgICAgZ2xTaGFkZXJTb3VyY2UgICAgICAgICAgICAgICAgICBAOTkKKyAgICBnbFN0ZW5jaWxGdW5jICAgICAgICAgICAgICAgICAgIEAxMDAKKyAgICBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUgICAgICAgICAgIEAxMDEKKyAgICBnbFN0ZW5jaWxNYXNrICAgICAgICAgICAgICAgICAgIEAxMDIKKyAgICBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUgICAgICAgICAgIEAxMDMKKyAgICBnbFN0ZW5jaWxPcCAgICAgICAgICAgICAgICAgICAgIEAxMDQKKyAgICBnbFN0ZW5jaWxPcFNlcGFyYXRlICAgICAgICAgICAgIEAxMDUKKyAgICBnbFRleEltYWdlMkQgICAgICAgICAgICAgICAgICAgIEAxMDYKKyAgICBnbFRleFBhcmFtZXRlcmYgICAgICAgICAgICAgICAgIEAxMDcKKyAgICBnbFRleFBhcmFtZXRlcmZ2ICAgICAgICAgICAgICAgIEAxMDgKKyAgICBnbFRleFBhcmFtZXRlcmkgICAgICAgICAgICAgICAgIEAxMDkKKyAgICBnbFRleFBhcmFtZXRlcml2ICAgICAgICAgICAgICAgIEAxMTAKKyAgICBnbFRleFN1YkltYWdlMkQgICAgICAgICAgICAgICAgIEAxMTEKKyAgICBnbFVuaWZvcm0xZiAgICAgICAgICAgICAgICAgICAgIEAxMTIKKyAgICBnbFVuaWZvcm0xZnYgICAgICAgICAgICAgICAgICAgIEAxMTMKKyAgICBnbFVuaWZvcm0xaSAgICAgICAgICAgICAgICAgICAgIEAxMTQKKyAgICBnbFVuaWZvcm0xaXYgICAgICAgICAgICAgICAgICAgIEAxMTUKKyAgICBnbFVuaWZvcm0yZiAgICAgICAgICAgICAgICAgICAgIEAxMTYKKyAgICBnbFVuaWZvcm0yZnYgICAgICAgICAgICAgICAgICAgIEAxMTcKKyAgICBnbFVuaWZvcm0yaSAgICAgICAgICAgICAgICAgICAgIEAxMTgKKyAgICBnbFVuaWZvcm0yaXYgICAgICAgICAgICAgICAgICAgIEAxMTkKKyAgICBnbFVuaWZvcm0zZiAgICAgICAgICAgICAgICAgICAgIEAxMjAKKyAgICBnbFVuaWZvcm0zZnYgICAgICAgICAgICAgICAgICAgIEAxMjEKKyAgICBnbFVuaWZvcm0zaSAgICAgICAgICAgICAgICAgICAgIEAxMjIKKyAgICBnbFVuaWZvcm0zaXYgICAgICAgICAgICAgICAgICAgIEAxMjMKKyAgICBnbFVuaWZvcm00ZiAgICAgICAgICAgICAgICAgICAgIEAxMjQKKyAgICBnbFVuaWZvcm00ZnYgICAgICAgICAgICAgICAgICAgIEAxMjUKKyAgICBnbFVuaWZvcm00aSAgICAgICAgICAgICAgICAgICAgIEAxMjYKKyAgICBnbFVuaWZvcm00aXYgICAgICAgICAgICAgICAgICAgIEAxMjcKKyAgICBnbFVuaWZvcm1NYXRyaXgyZnYgICAgICAgICAgICAgIEAxMjgKKyAgICBnbFVuaWZvcm1NYXRyaXgzZnYgICAgICAgICAgICAgIEAxMjkKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYgICAgICAgICAgICAgIEAxMzAKKyAgICBnbFVzZVByb2dyYW0gICAgICAgICAgICAgICAgICAgIEAxMzEKKyAgICBnbFZhbGlkYXRlUHJvZ3JhbSAgICAgICAgICAgICAgIEAxMzIKKyAgICBnbFZlcnRleEF0dHJpYjFmICAgICAgICAgICAgICAgIEAxMzMKKyAgICBnbFZlcnRleEF0dHJpYjFmdiAgICAgICAgICAgICAgIEAxMzQKKyAgICBnbFZlcnRleEF0dHJpYjJmICAgICAgICAgICAgICAgIEAxMzUKKyAgICBnbFZlcnRleEF0dHJpYjJmdiAgICAgICAgICAgICAgIEAxMzYKKyAgICBnbFZlcnRleEF0dHJpYjNmICAgICAgICAgICAgICAgIEAxMzcKKyAgICBnbFZlcnRleEF0dHJpYjNmdiAgICAgICAgICAgICAgIEAxMzgKKyAgICBnbFZlcnRleEF0dHJpYjRmICAgICAgICAgICAgICAgIEAxMzkKKyAgICBnbFZlcnRleEF0dHJpYjRmdiAgICAgICAgICAgICAgIEAxNDAKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIgICAgICAgICAgIEAxNDEKKyAgICBnbFZpZXdwb3J0ICAgICAgICAgICAgICAgICAgICAgIEAxNDIKKworICAgIDsgRXh0ZW5zaW9ucworICAgIGdsVGV4SW1hZ2UzRE9FUyAgICAgICAgICAgICAgICAgQDE0MworICAgIGdsQmxpdEZyYW1lYnVmZmVyQU5HTEUgICAgICAgICAgQDE0OQorICAgIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEUgQDE1MAorICAgIGdsRGVsZXRlRmVuY2VzTlYgICAgICAgICAgICAgICAgQDE1MQorICAgIGdsRmluaXNoRmVuY2VOViAgICAgICAgICAgICAgICAgQDE1MgorICAgIGdsR2VuRmVuY2VzTlYgICAgICAgICAgICAgICAgICAgQDE1MworICAgIGdsR2V0RmVuY2Vpdk5WICAgICAgICAgICAgICAgICAgQDE1NAorICAgIGdsSXNGZW5jZU5WICAgICAgICAgICAgICAgICAgICAgQDE1NQorICAgIGdsU2V0RmVuY2VOViAgICAgICAgICAgICAgICAgICAgQDE1NgorICAgIGdsVGVzdEZlbmNlTlYgICAgICAgICAgICAgICAgICAgQDE1NworCisgICAgOyBFR0wgZGVwZW5kZW5jaWVzCisgICAgZ2xDcmVhdGVDb250ZXh0ICAgICAgICAgICAgICAgICBAMTQ0IE5PTkFNRQorICAgIGdsRGVzdHJveUNvbnRleHQgICAgICAgICAgICAgICAgQDE0NSBOT05BTUUKKyAgICBnbE1ha2VDdXJyZW50ICAgICAgICAgICAgICAgICAgIEAxNDYgTk9OQU1FCisgICAgZ2xHZXRDdXJyZW50Q29udGV4dCAgICAgICAgICAgICBAMTQ3IE5PTkFNRQorICAgIGdsR2V0UHJvY0FkZHJlc3MgICAgICAgICAgICAgICAgQDE0OCBOT05BTUUKKyAgICBnbEJpbmRUZXhJbWFnZSAgICAgICAgICAgICAgICAgIEAxNTggTk9OQU1FCisKKwljcmVhdGVGcmFtZUJ1ZmZlciAgICAgICAgICAgICAgIEAxNTkgTk9OQU1FCisJY3JlYXRlQmFja0J1ZmZlciAgICAgICAgICAgICAgICBAMTYwIE5PTkFNRQorCWNyZWF0ZURldmljZSAgICAgICAgICAgICAgICAgICAgQDE2MSBOT05BTUUKKworCVJlZ2lzdGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL2xpYkdMRVN2Mi5yYyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9saWJHTEVTdjIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4NGYyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9saWJHTEVTdjIucmMKQEAgLTAsMCArMSwxMDIgQEAKKy8vIE1pY3Jvc29mdCBWaXN1YWwgQysrIGdlbmVyYXRlZCByZXNvdXJjZSBzY3JpcHQuCisvLworI2luY2x1ZGUgInJlc291cmNlLmgiCisKKyNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMiByZXNvdXJjZS4KKy8vCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9WZXJzaW9uLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjdW5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRW5nbGlzaCAoVS5TLikgcmVzb3VyY2VzCisKKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkKKyNpZmRlZiBfV0lOMzIKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTCisjcHJhZ21hIGNvZGVfcGFnZSgxMjUyKQorI2VuZGlmIC8vX1dJTjMyCisKKyNpZmRlZiBBUFNUVURJT19JTlZPS0VECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFRFWFRJTkNMVURFCisvLworCisxIFRFWFRJTkNMVURFIAorQkVHSU4KKyAgICAicmVzb3VyY2UuaFwwIgorRU5ECisKKzIgVEVYVElOQ0xVREUgCitCRUdJTgorICAgICIjaW5jbHVkZSAiImFmeHJlcy5oIiJcclxuIgorICAgICIjaW5jbHVkZSAiIi4uL2NvbW1vbi92ZXJzaW9uLmgiIlwwIgorRU5ECisKKzMgVEVYVElOQ0xVREUgCitCRUdJTgorICAgICJcclxuIgorICAgICJcMCIKK0VORAorCisjZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gVmVyc2lvbgorLy8KKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gTUFKT1JfVkVSU0lPTixNSU5PUl9WRVJTSU9OLEJVSUxEX1ZFUlNJT04sQlVJTERfUkVWSVNJT04KKyBQUk9EVUNUVkVSU0lPTiBNQUpPUl9WRVJTSU9OLE1JTk9SX1ZFUlNJT04sQlVJTERfVkVSU0lPTixCVUlMRF9SRVZJU0lPTgorIEZJTEVGTEFHU01BU0sgMHgxN0wKKyNpZmRlZiBfREVCVUcKKyBGSUxFRkxBR1MgMHgxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisgRklMRU9TIDB4NEwKKyBGSUxFVFlQRSAweDJMCisgRklMRVNVQlRZUEUgMHgwTAorQkVHSU4KKyAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJTd2lmdFNoYWRlciBsaWJHTEVTdjIgRHluYW1pYyBMaW5rIExpYnJhcnkiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCBWRVJTSU9OX1NUUklORworICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJsaWJHTEVTdjIiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDExIFRyYW5zR2FtaW5nIEluYy4iCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJsaWJHTEVTdjIuZGxsIgorICAgICAgICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsIFZFUlNJT05fU1RSSU5HCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiU3dpZnRTaGFkZXIgbGliR0xFU3YyIER5bmFtaWMgTGluayBMaWJyYXJ5IgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgVkVSU0lPTl9TVFJJTkcKKyAgICAgICAgRU5ECisgICAgRU5ECisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCisgICAgRU5ECitFTkQKKworI2VuZGlmICAgIC8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisKKyNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4KKy8vCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNlbmRpZiAgICAvLyBub3QgQVBTVFVESU9fSU5WT0tFRApkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL2xpYkdMRVN2Mi52Y3hwcm9qIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL2xpYkdMRVN2Mi52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OWM1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvbGliR0xFU3YyLnZjeHByb2oKQEAgLTAsMCArMSwyODYgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJQcm9maWxlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5Qcm9maWxlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPntCNTg3MUE3QS05NjhDLTQyRTMtQTMzQi05ODFFNkY0NDhFNzh9PC9Qcm9qZWN0R3VpZD4NCisgICAgPFJvb3ROYW1lc3BhY2U+bGliR0xFU3YyPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDMxOS4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxJbmNsdWRlUGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKERYU0RLX0RJUilcSW5jbHVkZTsuLlxpbmNsdWRlOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4NCisgICAgPEluY2x1ZGVQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoRFhTREtfRElSKVxJbmNsdWRlOy4uXGluY2x1ZGU7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPg0KKyAgICA8SW5jbHVkZVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoRFhTREtfRElSKVxJbmNsdWRlOy4uXGluY2x1ZGU7JChEWFNES19ESVIpXEluY2x1ZGU7JChWQ0luc3RhbGxEaXIpUGxhdGZvcm1TREtcaW5jbHVkZTskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+DQorICAgIDxMaWJyYXJ5UGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChEWFNES19ESVIpXExpYlx4ODY7JChWQ0luc3RhbGxEaXIpUGxhdGZvcm1TREtcbGliOyQoTGlicmFyeVBhdGgpPC9MaWJyYXJ5UGF0aD4NCisgICAgPExpYnJhcnlQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoRFhTREtfRElSKVxMaWJceDg2OyQoVkNJbnN0YWxsRGlyKWxpYjskKFZDSW5zdGFsbERpcilhdGxtZmNcbGliOyQoV2luZG93c1Nka0RpcilsaWI7JChGcmFtZXdvcmtTREtEaXIpXGxpYjwvTGlicmFyeVBhdGg+DQorICAgIDxMaWJyYXJ5UGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKERYU0RLX0RJUilcTGliXHg4NjskKFZDSW5zdGFsbERpcilsaWI7JChWQ0luc3RhbGxEaXIpYXRsbWZjXGxpYjskKFdpbmRvd3NTZGtEaXIpbGliOyQoRnJhbWV3b3JrU0RLRGlyKVxsaWI8L0xpYnJhcnlQYXRoPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFNvbHV0aW9uRGlyKTskKFByb2plY3REaXIpLy4uOyQoUHJvamVjdERpcikvLi4vLi47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19XSU5ET1dTO19VU1JETEw7TElCR0xFU1YyX0VYUE9SVFM7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO05PTUlOTUFYOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmR3bWFwaS5saWI7ZHhndWlkLmxpYjtXUzJfMzIubGliO0QzZHg5LmxpYjtkM2Rjb21waWxlci5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+bGliR0xFU3YyLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPFJhbmRvbWl6ZWRCYXNlQWRkcmVzcz5mYWxzZTwvUmFuZG9taXplZEJhc2VBZGRyZXNzPg0KKyAgICAgIDxEYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8L0RhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgICAgPFBvc3RCdWlsZEV2ZW50Pg0KKyAgICAgIDxDb21tYW5kPm1rZGlyICIkKFByb2plY3REaXIpLi5cLi5cbGliXCQoQ29uZmlndXJhdGlvbilcIg0KK2NvcHkgIiQoT3V0RGlyKWxpYkdMRVN2Mi5kbGwiICIkKFByb2plY3REaXIpLi5cLi5cbGliXCQoQ29uZmlndXJhdGlvbilcIg0KK2NvcHkgIiQoT3V0RGlyKWxpYkdMRVN2Mi5saWIiICIkKFByb2plY3REaXIpLi5cLi5cbGliXCQoQ29uZmlndXJhdGlvbilcIg0KKzwvQ29tbWFuZD4NCisgICAgPC9Qb3N0QnVpbGRFdmVudD4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChQcm9qZWN0RGlyKS8uLjskKFByb2plY3REaXIpLy4uLy4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztfVVNSRExMO0xJQkdMRVNWMl9FWFBPUlRTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtOT01JTk1BWDtfU0VDVVJFX1NDTD0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+ZHdtYXBpLmxpYjtkeGd1aWQubGliO1dTMl8zMi5saWI7RDNkeDkubGliO2QzZGNvbXBpbGVyLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPmZhbHNlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT5saWJHTEVTdjIuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICAgIDxQb3N0QnVpbGRFdmVudD4NCisgICAgICA8Q29tbWFuZD5ta2RpciAiJChQcm9qZWN0RGlyKS4uXC4uXGxpYlwkKENvbmZpZ3VyYXRpb24pXCINCitjb3B5ICIkKE91dERpcilsaWJHTEVTdjIuZGxsIiAiJChQcm9qZWN0RGlyKS4uXC4uXGxpYlwkKENvbmZpZ3VyYXRpb24pXCINCitjb3B5ICIkKE91dERpcilsaWJHTEVTdjIubGliIiAiJChQcm9qZWN0RGlyKS4uXC4uXGxpYlwkKENvbmZpZ3VyYXRpb24pXCINCis8L0NvbW1hbmQ+DQorICAgIDwvUG9zdEJ1aWxkRXZlbnQ+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoUHJvamVjdERpcikvLi47ICQoUHJvamVjdERpcikvLi4vLi47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7TElCR0xFU1YyX0VYUE9SVFM7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO05PTUlOTUFYO19TRUNVUkVfU0NMPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmR3bWFwaS5saWI7ZHhndWlkLmxpYjtXUzJfMzIubGliO0QzZHg5LmxpYjtkM2Rjb21waWxlci5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8SWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz5mYWxzZTwvSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+bGliR0xFU3YyLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgICA8UG9zdEJ1aWxkRXZlbnQ+DQorICAgICAgPENvbW1hbmQ+bWtkaXIgIiQoUHJvamVjdERpcikuLlwuLlxsaWJcJChDb25maWd1cmF0aW9uKVwiDQorY29weSAiJChPdXREaXIpbGliR0xFU3YyLmRsbCIgIiQoUHJvamVjdERpcikuLlwuLlxsaWJcJChDb25maWd1cmF0aW9uKVwiDQorY29weSAiJChPdXREaXIpbGliR0xFU3YyLmxpYiIgIiQoUHJvamVjdERpcikuLlwuLlxsaWJcJChDb25maWd1cmF0aW9uKVwiDQorPC9Db21tYW5kPg0KKyAgICA8L1Bvc3RCdWlsZEV2ZW50Pg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJCdWZmZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkNvbnRleHQuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGNvbW1vblxkZWJ1Zy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGV2aWNlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJGZW5jZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRnJhbWVidWZmZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkhhbmRsZUFsbG9jYXRvci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iSW1hZ2UuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkluZGV4RGF0YU1hbmFnZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImxpYkdMRVN2Mi5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ibWFpbi5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iUmVmQ291bnRPYmplY3QuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlJlbmRlcmJ1ZmZlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iUmVzb3VyY2VNYW5hZ2VyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJTaGFkZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlRleHR1cmUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlVua25vd24uY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InV0aWxpdGllcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iVmVydGV4RGF0YU1hbmFnZXIuY3BwIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkJ1ZmZlci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkNvbnRleHQuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEZXZpY2UuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkZlbmNlLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRnJhbWVidWZmZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxpbmNsdWRlXEdMRVMyXGdsMi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcR0xFUzJcZ2wyZXh0LmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5caW5jbHVkZVxHTEVTMlxnbDJwbGF0Zm9ybS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkhhbmRsZUFsbG9jYXRvci5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkltYWdlLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJJbmRleERhdGFNYW5hZ2VyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ibWFpbi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Im1hdGh1dGlsLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iUHJvZ3JhbS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlJlZkNvdW50T2JqZWN0LmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iUmVuZGVyYnVmZmVyLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icmVzb3VyY2UuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJSZXNvdXJjZU1hbmFnZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJTaGFkZXIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJUZXh0dXJlLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iVW5rbm93bi5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idXRpbGl0aWVzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cY29tbW9uXHZlcnNpb24uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJWZXJ0ZXhEYXRhTWFuYWdlci5oIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJsaWJHTEVTdjIuZGVmIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9ImxpYkdMRVN2Mi5yYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cTExWTVx3aW4zMlxBbmFseXNpc1xBbmFseXNpcy52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MDYyMmU4MjctODQ2NC00ODlkLThiMWMtYjBiNDk2ZjM1YzA4fTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxMTFZNXHdpbjMyXENvZGVHZW5cQ29kZUdlbi52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MDhjZWIxYmItYzJhNC00NTg3LWI5YTktYWVkYjhmYjQ0ODk3fTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxMTFZNXHdpbjMyXEV4ZWN1dGlvbkVuZ2luZVxFeGVjdXRpb25FbmdpbmUudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezc2Mjk1YWU4LWEwODMtNDYwZS05ZjgwLTZmMmI4OTIzMjY0YX08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cTExWTVx3aW4zMlxNQ1xNQy52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MTJkMDBjZmEtZTM5My00ODU3LWE0MzYtYzczMjQ4NDlkZTUxfTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxMTFZNXHdpbjMyXFN1cHBvcnRcU3VwcG9ydC52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MjhhYTkxNDYtMzQ4Mi00ZjQxLTljYzYtNDA3YjFkMjU4NTA4fTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxMTFZNXHdpbjMyXFN5c3RlbVxTeXN0ZW0udmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezBmODQwN2YzLWZhMjMtNGNmMS04M2E5LWRjYmUwYjM2MTQ4OX08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cTExWTVx3aW4zMlxUYWJsZUdlblxUYWJsZUdlbi52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MzM5YzIyNDktMjZiNi00MTcyLWI0ODQtODU2NTMwMjlhZjU3fTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxMTFZNXHdpbjMyXFRhcmdldFxUYXJnZXQudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezA1OWZiYWI4LWM3NmQtNDhhMC1hYTc1LTNjNTdiZDNlYWZlNH08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cTExWTVx3aW4zMlxUcmFuc2Zvcm1zXFRyYW5zZm9ybXMudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+e2M1OTM3NGMxLTlmYzAtNDE0Ny1iODM2LTMyN2RmZGM1MmQ5OX08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cTExWTVx3aW4zMlxWTUNvcmVcVk1Db3JlLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns0NWNkNzhkNy1jNWQ5LTQ3ZmUtYWQxMi1mMzI1MWVlZGFmZmJ9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXExMVk1cd2luMzJceDg2XHg4Ni52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MTQ0ZWViZjYtOGM5Yi00NDczLWI3MTUtMmM4MjE2NjZhZjZjfTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxSZWFjdG9yXFJlYWN0b3IudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezI4ZmQwNzZkLTEwYjUtNGJkOC1hNGNmLWY0NGM3MDAyYTgwM308L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cU3dpZnRTaGFkZXJcU3dpZnRTaGFkZXIudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezdiMDJjYjE5LTRjZGYtNGY3OS1iYzliLTdmM2Y2MTY0YTAwM308L1Byb2plY3Q+DQorICAgICAgPFByaXZhdGU+dHJ1ZTwvUHJpdmF0ZT4NCisgICAgICA8UmVmZXJlbmNlT3V0cHV0QXNzZW1ibHk+dHJ1ZTwvUmVmZXJlbmNlT3V0cHV0QXNzZW1ibHk+DQorICAgICAgPENvcHlMb2NhbFNhdGVsbGl0ZUFzc2VtYmxpZXM+ZmFsc2U8L0NvcHlMb2NhbFNhdGVsbGl0ZUFzc2VtYmxpZXM+DQorICAgICAgPExpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPnRydWU8L0xpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPg0KKyAgICAgIDxVc2VMaWJyYXJ5RGVwZW5kZW5jeUlucHV0cz5mYWxzZTwvVXNlTGlicmFyeURlcGVuZGVuY3lJbnB1dHM+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cY29tcGlsZXJcdHJhbnNsYXRvcl9jb21tb24udmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezViM2E2ZGI4LTFlN2UtNDBkNy05MmI5LWRhOGFhZTYxOWZhZH08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cY29tcGlsZXJcdHJhbnNsYXRvcl9obHNsLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns1NjIwZjBlNC02YzQzLTQ5YmMtYTE3OC1iODA0ZTFhMGMzYTd9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL2xpYkdMRVN2Mi52Y3hwcm9qLmZpbHRlcnMgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvbGliR0xFU3YyLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGJjNjY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL2xpYkdMRVN2Mi52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSwxNTUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214PC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iQnVmZmVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iQ29udGV4dC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGNvbW1vblxkZWJ1Zy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkZlbmNlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRnJhbWVidWZmZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJIYW5kbGVBbGxvY2F0b3IuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJJbmRleERhdGFNYW5hZ2VyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ibGliR0xFU3YyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ibWFpbi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJSZWZDb3VudE9iamVjdC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlJlbmRlcmJ1ZmZlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlJlc291cmNlTWFuYWdlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlNoYWRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlRleHR1cmUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJ1dGlsaXRpZXMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJWZXJ0ZXhEYXRhTWFuYWdlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRldmljZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkltYWdlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkJ1ZmZlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJDb250ZXh0LmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkZlbmNlLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkZyYW1lYnVmZmVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcR0xFUzJcZ2wyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcR0xFUzJcZ2wyZXh0LmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXGluY2x1ZGVcR0xFUzJcZ2wycGxhdGZvcm0uaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iSGFuZGxlQWxsb2NhdG9yLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkluZGV4RGF0YU1hbmFnZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ibWFpbi5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJtYXRodXRpbC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJQcm9ncmFtLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlJlZkNvdW50T2JqZWN0LmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlJlbmRlcmJ1ZmZlci5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJyZXNvdXJjZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJSZXNvdXJjZU1hbmFnZXIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iU2hhZGVyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlRleHR1cmUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idXRpbGl0aWVzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGNvbW1vblx2ZXJzaW9uLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlZlcnRleERhdGFNYW5hZ2VyLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRldmljZS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkltYWdlLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iVW5rbm93bi5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9ImxpYkdMRVN2Mi5yYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0ibGliR0xFU3YyLmRlZiIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvbWFpbi5jcHAgYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5OGE2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi9tYWluLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gbWFpbi5jcHA6IERMTCBlbnRyeSBwb2ludCBhbmQgbWFuYWdlbWVudCBvZiB0aHJlYWQtbG9jYWwgZGF0YS4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgIkZyYW1lYnVmZmVyLmgiCisjaW5jbHVkZSAibGliRUdML1N1cmZhY2UuaCIKKyNpbmNsdWRlICJjb21tb24vZGVidWcuaCIKKworc3RhdGljIERXT1JEIGN1cnJlbnRUTFMgPSBUTFNfT1VUX09GX0lOREVYRVM7CisKK0JPT0wgV0lOQVBJIERsbE1haW4oSElOU1RBTkNFIGluc3RhbmNlLCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKK3sKKyAgICBzd2l0Y2ggKHJlYXNvbikKKyAgICB7CisgICAgICBjYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudFRMUyA9IFRsc0FsbG9jKCk7CisKKyAgICAgICAgICAgIGlmKGN1cnJlbnRUTFMgPT0gVExTX09VVF9PRl9JTkRFWEVTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBGYWxsIHRocm91Z2h0IHRvIGluaXRpYWxpemUgaW5kZXgKKyAgICAgIGNhc2UgRExMX1RIUkVBRF9BVFRBQ0g6CisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpDdXJyZW50ICpjdXJyZW50ID0gKGdsOjpDdXJyZW50KilMb2NhbEFsbG9jKExQVFIsIHNpemVvZihnbDo6Q3VycmVudCkpOworCisgICAgICAgICAgICBpZihjdXJyZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRsc1NldFZhbHVlKGN1cnJlbnRUTFMsIGN1cnJlbnQpOworCisgICAgICAgICAgICAgICAgY3VycmVudC0+Y29udGV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgY3VycmVudC0+ZGlzcGxheSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERMTF9USFJFQURfREVUQUNIOgorICAgICAgICB7CisgICAgICAgICAgICB2b2lkICpjdXJyZW50ID0gVGxzR2V0VmFsdWUoY3VycmVudFRMUyk7CisKKyAgICAgICAgICAgIGlmKGN1cnJlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9jYWxGcmVlKChITE9DQUwpY3VycmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERMTF9QUk9DRVNTX0RFVEFDSDoKKyAgICAgICAgeworICAgICAgICAgICAgdm9pZCAqY3VycmVudCA9IFRsc0dldFZhbHVlKGN1cnJlbnRUTFMpOworCisgICAgICAgICAgICBpZihjdXJyZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvY2FsRnJlZSgoSExPQ0FMKWN1cnJlbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUbHNGcmVlKGN1cnJlbnRUTFMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK25hbWVzcGFjZSBnbAorewordm9pZCBtYWtlQ3VycmVudChDb250ZXh0ICpjb250ZXh0LCBlZ2w6OkRpc3BsYXkgKmRpc3BsYXksIGVnbDo6U3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgICBDdXJyZW50ICpjdXJyZW50ID0gKEN1cnJlbnQqKVRsc0dldFZhbHVlKGN1cnJlbnRUTFMpOworCisgICAgY3VycmVudC0+Y29udGV4dCA9IGNvbnRleHQ7CisgICAgY3VycmVudC0+ZGlzcGxheSA9IGRpc3BsYXk7CisKKyAgICBpZihjb250ZXh0ICYmIGRpc3BsYXkgJiYgc3VyZmFjZSkKKyAgICB7CisgICAgICAgIGNvbnRleHQtPm1ha2VDdXJyZW50KGRpc3BsYXksIHN1cmZhY2UpOworICAgIH0KK30KKworQ29udGV4dCAqZ2V0Q29udGV4dCgpCit7CisgICAgQ3VycmVudCAqY3VycmVudCA9IChDdXJyZW50KilUbHNHZXRWYWx1ZShjdXJyZW50VExTKTsKKworICAgIHJldHVybiBjdXJyZW50LT5jb250ZXh0OworfQorCitlZ2w6OkRpc3BsYXkgKmdldERpc3BsYXkoKQoreworICAgIEN1cnJlbnQgKmN1cnJlbnQgPSAoQ3VycmVudCopVGxzR2V0VmFsdWUoY3VycmVudFRMUyk7CisKKyAgICByZXR1cm4gY3VycmVudC0+ZGlzcGxheTsKK30KKworRGV2aWNlICpnZXREZXZpY2UoKQoreworICAgIGVnbDo6RGlzcGxheSAqZGlzcGxheSA9IGdldERpc3BsYXkoKTsKKworICAgIHJldHVybiBkaXNwbGF5LT5nZXREZXZpY2UoKTsKK30KK30KKworLy8gUmVjb3JkcyBhbiBlcnJvciBjb2RlCit2b2lkIGVycm9yKEdMZW51bSBlcnJvckNvZGUpCit7CisgICAgZ2w6OkNvbnRleHQgKmNvbnRleHQgPSBnbEdldEN1cnJlbnRDb250ZXh0KCk7CisKKyAgICBpZihjb250ZXh0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChlcnJvckNvZGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBHTF9JTlZBTElEX0VOVU06CisgICAgICAgICAgICBjb250ZXh0LT5yZWNvcmRJbnZhbGlkRW51bSgpOworICAgICAgICAgICAgVFJBQ0UoIlx0ISBFcnJvciBnZW5lcmF0ZWQ6IGludmFsaWQgZW51bVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9JTlZBTElEX1ZBTFVFOgorICAgICAgICAgICAgY29udGV4dC0+cmVjb3JkSW52YWxpZFZhbHVlKCk7CisgICAgICAgICAgICBUUkFDRSgiXHQhIEVycm9yIGdlbmVyYXRlZDogaW52YWxpZCB2YWx1ZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIGNvbnRleHQtPnJlY29yZEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICAgIFRSQUNFKCJcdCEgRXJyb3IgZ2VuZXJhdGVkOiBpbnZhbGlkIG9wZXJhdGlvblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9PVVRfT0ZfTUVNT1JZOgorICAgICAgICAgICAgY29udGV4dC0+cmVjb3JkT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgICAgIFRSQUNFKCJcdCEgRXJyb3IgZ2VuZXJhdGVkOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOgorICAgICAgICAgICAgY29udGV4dC0+cmVjb3JkSW52YWxpZEZyYW1lYnVmZmVyT3BlcmF0aW9uKCk7CisgICAgICAgICAgICBUUkFDRSgiXHQhIEVycm9yIGdlbmVyYXRlZDogaW52YWxpZCBmcmFtZWJ1ZmZlciBvcGVyYXRpb25cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvbWFpbi5oIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDgzODFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL21haW4uaApAQCAtMCwwICsxLDQ3IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyBtYWluLmg6IE1hbmFnZW1lbnQgb2YgdGhyZWFkLWxvY2FsIGRhdGEuCisKKyNpZm5kZWYgTElCR0xFU1YyX01BSU5fSF8KKyNkZWZpbmUgTElCR0xFU1YyX01BSU5fSF8KKworI2luY2x1ZGUgIkNvbnRleHQuaCIKKyNpbmNsdWRlICJEZXZpY2UuaHBwIgorI2luY2x1ZGUgImNvbW1vbi9kZWJ1Zy5oIgorI2luY2x1ZGUgImxpYkVHTC9EaXNwbGF5LmgiCisKKyNkZWZpbmUgR0xfQVBJQ0FMTAorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCituYW1lc3BhY2UgZ2wKK3sKKwlzdHJ1Y3QgQ3VycmVudAorCXsKKwkJQ29udGV4dCAqY29udGV4dDsKKwkJZWdsOjpEaXNwbGF5ICpkaXNwbGF5OworCX07CisKKwl2b2lkIG1ha2VDdXJyZW50KENvbnRleHQgKmNvbnRleHQsIGVnbDo6RGlzcGxheSAqZGlzcGxheSwgZWdsOjpTdXJmYWNlICpzdXJmYWNlKTsKKworCUNvbnRleHQgKmdldENvbnRleHQoKTsKKwllZ2w6OkRpc3BsYXkgKmdldERpc3BsYXkoKTsKKworCURldmljZSAqZ2V0RGV2aWNlKCk7Cit9CisKK3ZvaWQgZXJyb3IoR0xlbnVtIGVycm9yQ29kZSk7CisKK3RlbXBsYXRlPGNsYXNzIFQ+Citjb25zdCBUICZlcnJvcihHTGVudW0gZXJyb3JDb2RlLCBjb25zdCBUICZyZXR1cm5WYWx1ZSkKK3sKKyAgICBlcnJvcihlcnJvckNvZGUpOworCisgICAgcmV0dXJuIHJldHVyblZhbHVlOworfQorCisjZW5kaWYgICAvLyBMSUJHTEVTVjJfTUFJTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL21hdGh1dGlsLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvbWF0aHV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2MwOGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL21hdGh1dGlsLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisKKy8vIG1hdGh1dGlsLmg6IE1hdGggYW5kIGJpdCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zLgorCisjaWZuZGVmIExJQkdMRVNWMl9NQVRIVVRJTF9IXworI2RlZmluZSBMSUJHTEVTVjJfTUFUSFVUSUxfSF8KKworI2luY2x1ZGUgImNvbW1vbi9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8aW50cmluLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIGdsCit7CitpbmxpbmUgYm9vbCBpc1BvdzIoaW50IHgpCit7CisgICAgcmV0dXJuICh4ICYgKHggLSAxKSkgPT0gMCAmJiAoeCAhPSAwKTsKK30KKworaW5saW5lIGludCBsb2cyKGludCB4KQoreworICAgIGludCByID0gMDsKKyAgICB3aGlsZSgoeCA+PiByKSA+IDEpIHIrKzsKKyAgICByZXR1cm4gcjsKK30KKworaW5saW5lIHVuc2lnbmVkIGludCBjZWlsUG93Mih1bnNpZ25lZCBpbnQgeCkKK3sKKyAgICBpZih4ICE9IDApIHgtLTsKKyAgICB4IHw9IHggPj4gMTsKKyAgICB4IHw9IHggPj4gMjsKKyAgICB4IHw9IHggPj4gNDsKKyAgICB4IHw9IHggPj4gODsKKyAgICB4IHw9IHggPj4gMTY7CisgICAgeCsrOworCisgICAgcmV0dXJuIHg7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE1JTiwgdHlwZW5hbWUgTUFYPgoraW5saW5lIFQgY2xhbXAoVCB4LCBNSU4gbWluLCBNQVggbWF4KQoreworICAgIHJldHVybiB4IDwgbWluID8gbWluIDogKHggPiBtYXggPyBtYXggOiB4KTsKK30KKworaW5saW5lIGZsb2F0IGNsYW1wMDEoZmxvYXQgeCkKK3sKKyAgICByZXR1cm4gY2xhbXAoeCwgMC4wZiwgMS4wZik7Cit9CisKK3RlbXBsYXRlPGNvbnN0IGludCBuPgoraW5saW5lIHVuc2lnbmVkIGludCB1bm9ybShmbG9hdCB4KQoreworICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXggPSAweEZGRkZGRkZGID4+ICgzMiAtIG4pOworCisgICAgaWYoeCA+IDEpCisgICAgeworICAgICAgICByZXR1cm4gbWF4OworICAgIH0KKyAgICBlbHNlIGlmKHggPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgaW50KShtYXggKiB4ICsgMC41Zik7CisgICAgfQorfQorCitpbmxpbmUgc3c6OlJlY3QgdHJhbnNmb3JtUGl4ZWxSZWN0KEdMaW50IHgsIEdMaW50IHksIEdMaW50IHcsIEdMaW50IGgsIEdMaW50IHN1cmZhY2VIZWlnaHQpCit7CisJc3c6OlJlY3QgcmVjdCA9IHt4LAorCSAgICAgICAgICAgICAgICAgc3VyZmFjZUhlaWdodCAtIHkgLSBoLAorCSAgICAgICAgICAgICAgICAgeCArIHcsCisJICAgICAgICAgICAgICAgICBzdXJmYWNlSGVpZ2h0IC0geX07CisKKyAgICByZXR1cm4gcmVjdDsKK30KKworaW5saW5lIGludCB0cmFuc2Zvcm1QaXhlbFlPZmZzZXQoR0xpbnQgeW9mZnNldCwgR0xpbnQgaCwgR0xpbnQgc3VyZmFjZUhlaWdodCkKK3sKKyAgICByZXR1cm4gc3VyZmFjZUhlaWdodCAtIHlvZmZzZXQgLSBoOworfQorCitpbmxpbmUgR0xlbnVtIGFkanVzdFdpbmRpbmcoR0xlbnVtIHdpbmRpbmcpCit7CisgICAgQVNTRVJUKHdpbmRpbmcgPT0gR0xfQ1cgfHwgd2luZGluZyA9PSBHTF9DQ1cpOworICAgIHJldHVybiB3aW5kaW5nID09IEdMX0NXID8gR0xfQ0NXIDogR0xfQ1c7Cit9CisKK2lubGluZSBib29sIHN1cHBvcnRzU1NFMigpCit7CisgICAgc3RhdGljIGJvb2wgY2hlY2tlZCA9IGZhbHNlOworICAgIHN0YXRpYyBib29sIHN1cHBvcnRzID0gZmFsc2U7CisKKyAgICBpZihjaGVja2VkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRzOworICAgIH0KKworICAgIGludCBpbmZvWzRdOworICAgIF9fY3B1aWQoaW5mbywgMCk7CisgICAgCisgICAgaWYoaW5mb1swXSA+PSAxKQorICAgIHsKKyAgICAgICAgX19jcHVpZChpbmZvLCAxKTsKKworICAgICAgICBzdXBwb3J0cyA9IChpbmZvWzNdID4+IDI2KSAmIDE7CisgICAgfQorCisgICAgY2hlY2tlZCA9IHRydWU7CisKKyAgICByZXR1cm4gc3VwcG9ydHM7Cit9Cit9CisKKyNlbmRpZiAgIC8vIExJQkdMRVNWMl9NQVRIVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL3Jlc291cmNlLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWFkYWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL3Jlc291cmNlLmgKQEAgLTAsMCArMSwxNCBAQAorLy97e05PX0RFUEVOREVOQ0lFU319CisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgorLy8gVXNlZCBieSBsaWJHTEVTdjIucmMKKworLy8gTmV4dCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IG9iamVjdHMKKy8vIAorI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKKyNpZm5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworI2RlZmluZSBfQVBTX05FWFRfUkVTT1VSQ0VfVkFMVUUgICAgICAgIDEwMQorI2RlZmluZSBfQVBTX05FWFRfQ09NTUFORF9WQUxVRSAgICAgICAgIDQwMDAxCisjZGVmaW5lIF9BUFNfTkVYVF9DT05UUk9MX1ZBTFVFICAgICAgICAgMTAwMQorI2RlZmluZSBfQVBTX05FWFRfU1lNRURfVkFMVUUgICAgICAgICAgIDEwMQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi91dGlsaXRpZXMuY3BwIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL3V0aWxpdGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlODNkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi91dGlsaXRpZXMuY3BwCkBAIC0wLDAgKzEsODU0IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyB1dGlsaXRpZXMuY3BwOiBDb252ZXJzaW9uIGZ1bmN0aW9ucyBhbmQgb3RoZXIgdXRpbGl0eSByb3V0aW5lcy4KKworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorCisjaW5jbHVkZSAibWF0aHV0aWwuaCIKKyNpbmNsdWRlICJDb250ZXh0LmgiCisjaW5jbHVkZSAiY29tbW9uL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBnbAoreworCWludCBVbmlmb3JtQ29tcG9uZW50Q291bnQoR0xlbnVtIHR5cGUpCisJeworCQlzd2l0Y2godHlwZSkKKwkJeworCQljYXNlIEdMX0JPT0w6CisJCWNhc2UgR0xfRkxPQVQ6CisJCWNhc2UgR0xfSU5UOgorCQljYXNlIEdMX1NBTVBMRVJfMkQ6CisJCWNhc2UgR0xfU0FNUExFUl9DVUJFOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgR0xfQk9PTF9WRUMyOgorCQljYXNlIEdMX0ZMT0FUX1ZFQzI6CisJCWNhc2UgR0xfSU5UX1ZFQzI6CisJCQlyZXR1cm4gMjsKKwkJY2FzZSBHTF9JTlRfVkVDMzoKKwkJY2FzZSBHTF9GTE9BVF9WRUMzOgorCQljYXNlIEdMX0JPT0xfVkVDMzoKKwkJCXJldHVybiAzOworCQljYXNlIEdMX0JPT0xfVkVDNDoKKwkJY2FzZSBHTF9GTE9BVF9WRUM0OgorCQljYXNlIEdMX0lOVF9WRUM0OgorCQljYXNlIEdMX0ZMT0FUX01BVDI6CisJCQlyZXR1cm4gNDsKKwkJY2FzZSBHTF9GTE9BVF9NQVQzOgorCQkJcmV0dXJuIDk7CisJCWNhc2UgR0xfRkxPQVRfTUFUNDoKKwkJCXJldHVybiAxNjsKKwkJZGVmYXVsdDoKKwkJCVVOUkVBQ0hBQkxFKCk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlHTGVudW0gVW5pZm9ybUNvbXBvbmVudFR5cGUoR0xlbnVtIHR5cGUpCisJeworCQlzd2l0Y2godHlwZSkKKwkJeworCQljYXNlIEdMX0JPT0w6CisJCWNhc2UgR0xfQk9PTF9WRUMyOgorCQljYXNlIEdMX0JPT0xfVkVDMzoKKwkJY2FzZSBHTF9CT09MX1ZFQzQ6CisJCQlyZXR1cm4gR0xfQk9PTDsKKwkJY2FzZSBHTF9GTE9BVDoKKwkJY2FzZSBHTF9GTE9BVF9WRUMyOgorCQljYXNlIEdMX0ZMT0FUX1ZFQzM6CisJCWNhc2UgR0xfRkxPQVRfVkVDNDoKKwkJY2FzZSBHTF9GTE9BVF9NQVQyOgorCQljYXNlIEdMX0ZMT0FUX01BVDM6CisJCWNhc2UgR0xfRkxPQVRfTUFUNDoKKwkJCXJldHVybiBHTF9GTE9BVDsKKwkJY2FzZSBHTF9JTlQ6CisJCWNhc2UgR0xfU0FNUExFUl8yRDoKKwkJY2FzZSBHTF9TQU1QTEVSX0NVQkU6CisJCWNhc2UgR0xfSU5UX1ZFQzI6CisJCWNhc2UgR0xfSU5UX1ZFQzM6CisJCWNhc2UgR0xfSU5UX1ZFQzQ6CisJCQlyZXR1cm4gR0xfSU5UOworCQlkZWZhdWx0OgorCQkJVU5SRUFDSEFCTEUoKTsKKwkJfQorCisJCXJldHVybiBHTF9OT05FOworCX0KKworCXNpemVfdCBVbmlmb3JtVHlwZVNpemUoR0xlbnVtIHR5cGUpCisJeworCQlzd2l0Y2godHlwZSkKKwkJeworCQljYXNlIEdMX0JPT0w6ICByZXR1cm4gc2l6ZW9mKEdMYm9vbGVhbik7CisJCWNhc2UgR0xfRkxPQVQ6IHJldHVybiBzaXplb2YoR0xmbG9hdCk7CisJCWNhc2UgR0xfSU5UOiAgIHJldHVybiBzaXplb2YoR0xpbnQpOworCQl9CisKKwkJcmV0dXJuIFVuaWZvcm1UeXBlU2l6ZShVbmlmb3JtQ29tcG9uZW50VHlwZSh0eXBlKSkgKiBVbmlmb3JtQ29tcG9uZW50Q291bnQodHlwZSk7CisJfQorCisJaW50IFZhcmlhYmxlUm93Q291bnQoR0xlbnVtIHR5cGUpCisJeworCQlzd2l0Y2godHlwZSkKKwkJeworCQljYXNlIEdMX05PTkU6CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBHTF9CT09MOgorCQljYXNlIEdMX0ZMT0FUOgorCQljYXNlIEdMX0lOVDoKKwkJY2FzZSBHTF9CT09MX1ZFQzI6CisJCWNhc2UgR0xfRkxPQVRfVkVDMjoKKwkJY2FzZSBHTF9JTlRfVkVDMjoKKwkJY2FzZSBHTF9JTlRfVkVDMzoKKwkJY2FzZSBHTF9GTE9BVF9WRUMzOgorCQljYXNlIEdMX0JPT0xfVkVDMzoKKwkJY2FzZSBHTF9CT09MX1ZFQzQ6CisJCWNhc2UgR0xfRkxPQVRfVkVDNDoKKwkJY2FzZSBHTF9JTlRfVkVDNDoKKwkJCXJldHVybiAxOworCQljYXNlIEdMX0ZMT0FUX01BVDI6CisJCQlyZXR1cm4gMjsKKwkJY2FzZSBHTF9GTE9BVF9NQVQzOgorCQkJcmV0dXJuIDM7CisJCWNhc2UgR0xfRkxPQVRfTUFUNDoKKwkJCXJldHVybiA0OworCQlkZWZhdWx0OgorCQkJVU5SRUFDSEFCTEUoKTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCWludCBWYXJpYWJsZUNvbHVtbkNvdW50KEdMZW51bSB0eXBlKQorCXsKKwkJc3dpdGNoKHR5cGUpCisJCXsKKwkJY2FzZSBHTF9OT05FOgorCQkJcmV0dXJuIDA7CisJCWNhc2UgR0xfQk9PTDoKKwkJY2FzZSBHTF9GTE9BVDoKKwkJY2FzZSBHTF9JTlQ6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBHTF9CT09MX1ZFQzI6CisJCWNhc2UgR0xfRkxPQVRfVkVDMjoKKwkJY2FzZSBHTF9JTlRfVkVDMjoKKwkJY2FzZSBHTF9GTE9BVF9NQVQyOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgR0xfSU5UX1ZFQzM6CisJCWNhc2UgR0xfRkxPQVRfVkVDMzoKKwkJY2FzZSBHTF9CT09MX1ZFQzM6CisJCWNhc2UgR0xfRkxPQVRfTUFUMzoKKwkJCXJldHVybiAzOworCQljYXNlIEdMX0JPT0xfVkVDNDoKKwkJY2FzZSBHTF9GTE9BVF9WRUM0OgorCQljYXNlIEdMX0lOVF9WRUM0OgorCQljYXNlIEdMX0ZMT0FUX01BVDQ6CisJCQlyZXR1cm4gNDsKKwkJZGVmYXVsdDoKKwkJCVVOUkVBQ0hBQkxFKCk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpbnQgQWxsb2NhdGVGaXJzdEZyZWVCaXRzKHVuc2lnbmVkIGludCAqYml0cywgdW5zaWduZWQgaW50IGFsbG9jYXRpb25TaXplLCB1bnNpZ25lZCBpbnQgYml0c1NpemUpCisJeworCQlBU1NFUlQoYWxsb2NhdGlvblNpemUgPD0gYml0c1NpemUpOworCisJCXVuc2lnbmVkIGludCBtYXNrID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBpbnQ+OjptYXgoKSA+PiAoc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBpbnQ+OjpkaWdpdHMgLSBhbGxvY2F0aW9uU2l6ZSk7CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGJpdHNTaXplIC0gYWxsb2NhdGlvblNpemUgKyAxOyBpKyspCisJCXsKKwkJCWlmKCgqYml0cyAmIG1hc2spID09IDApCisJCQl7CisJCQkJKmJpdHMgfD0gbWFzazsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKworCQkJbWFzayA8PD0gMTsKKwkJfQorCisJCXJldHVybiAtMTsKKwl9CisKKwlHTHNpemVpIENvbXB1dGVQaXRjaChHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xpbnQgYWxpZ25tZW50KQorCXsKKwkJQVNTRVJUKGFsaWdubWVudCA+IDAgJiYgaXNQb3cyKGFsaWdubWVudCkpOworCisJCUdMc2l6ZWkgcmF3UGl0Y2ggPSBDb21wdXRlUGl4ZWxTaXplKGZvcm1hdCwgdHlwZSkgKiB3aWR0aDsKKwkJcmV0dXJuIChyYXdQaXRjaCArIGFsaWdubWVudCAtIDEpICYgfihhbGlnbm1lbnQgLSAxKTsKKwl9CisKKwlHTHNpemVpIENvbXB1dGVDb21wcmVzc2VkUGl0Y2goR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCkKKwl7CisJCXJldHVybiBDb21wdXRlQ29tcHJlc3NlZFNpemUod2lkdGgsIDEsIGZvcm1hdCk7CisJfQorCisJR0xzaXplaSBDb21wdXRlQ29tcHJlc3NlZFNpemUoR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQpCisJeworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDoKKwkJY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZXR1cm4gOCAqIChHTHNpemVpKWNlaWwoKGZsb2F0KXdpZHRoIC8gNC4wZikgKiAoR0xzaXplaSljZWlsKChmbG9hdCloZWlnaHQgLyA0LjBmKTsKKwl9CisKKwlib29sIElzQ29tcHJlc3NlZChHTGVudW0gZm9ybWF0KQorCXsKKwkJaWYoZm9ybWF0ID09IEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgfHwKKwkJICAgZm9ybWF0ID09IEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUKQorCQl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8vIFJldHVybnMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhIHNpbmdsZSB0ZXhlbCBpbiBhbiBJbWFnZQorCWludCBDb21wdXRlUGl4ZWxTaXplKEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlKQorCXsKKwkJc3dpdGNoKHR5cGUpCisJCXsKKwkJY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorCQkJc3dpdGNoKGZvcm1hdCkKKwkJCXsKKwkJCWNhc2UgR0xfQUxQSEE6ICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCQkJY2FzZSBHTF9MVU1JTkFOQ0U6ICAgICAgIHJldHVybiBzaXplb2YodW5zaWduZWQgY2hhcik7CisJCQljYXNlIEdMX0xVTUlOQU5DRV9BTFBIQTogcmV0dXJuIHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDI7CisJCQljYXNlIEdMX1JHQjogICAgICAgICAgICAgcmV0dXJuIHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDM7CisJCQljYXNlIEdMX1JHQkE6ICAgICAgICAgICAgcmV0dXJuIHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDQ7CisJCQljYXNlIEdMX0JHUkFfRVhUOiAgICAgICAgcmV0dXJuIHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDQ7CisJCQlkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNDoKKwkJY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOgorCQljYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OgorCQkJcmV0dXJuIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJCWNhc2UgR0xfRkxPQVQ6CisJCQlzd2l0Y2goZm9ybWF0KQorCQkJeworCQkJY2FzZSBHTF9BTFBIQTogICAgICAgICAgIHJldHVybiBzaXplb2YoZmxvYXQpOworCQkJY2FzZSBHTF9MVU1JTkFOQ0U6ICAgICAgIHJldHVybiBzaXplb2YoZmxvYXQpOworCQkJY2FzZSBHTF9MVU1JTkFOQ0VfQUxQSEE6IHJldHVybiBzaXplb2YoZmxvYXQpICogMjsKKwkJCWNhc2UgR0xfUkdCOiAgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKGZsb2F0KSAqIDM7CisJCQljYXNlIEdMX1JHQkE6ICAgICAgICAgICAgcmV0dXJuIHNpemVvZihmbG9hdCkgKiA0OworCQkJZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEdMX0hBTEZfRkxPQVRfT0VTOgorCQkJc3dpdGNoKGZvcm1hdCkKKwkJCXsKKwkJCWNhc2UgR0xfQUxQSEE6ICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwkJCWNhc2UgR0xfTFVNSU5BTkNFOiAgICAgICByZXR1cm4gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwkJCWNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOiByZXR1cm4gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIDI7CisJCQljYXNlIEdMX1JHQjogICAgICAgICAgICAgcmV0dXJuIHNpemVvZih1bnNpZ25lZCBzaG9ydCkgKiAzOworCQkJY2FzZSBHTF9SR0JBOiAgICAgICAgICAgIHJldHVybiBzaXplb2YodW5zaWduZWQgc2hvcnQpICogNDsKKwkJCWRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCWJvb2wgSXNDdWJlbWFwVGV4dHVyZVRhcmdldChHTGVudW0gdGFyZ2V0KQorCXsKKwkJcmV0dXJuICh0YXJnZXQgPj0gR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICYmIHRhcmdldCA8PSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1opOworCX0KKworCUN1YmVGYWNlIENvbnZlcnRDdWJlRmFjZShHTGVudW0gY3ViZUZhY2UpCisJeworCQlDdWJlRmFjZSBmYWNlID0gQ1VCRU1BUF9GQUNFX1BPU0lUSVZFX1g7CisKKwkJLy8gTWFwIGEgY3ViZSBtYXAgdGV4dHVyZSB0YXJnZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgRGV2aWNlIHN1cmZhY2UgaW5kZXguIE5vdGUgdGhhdCB0aGUKKwkJLy8gWSBmYWNlcyBhcmUgc3dhcHBlZCBiZWNhdXNlIHRoZSBZIGNvb3JkaW5hdGUgdG8gdGhlIHRleHR1cmUgbG9va3VwIGludHJpbnNpYyBmdW5jdGlvbnMKKwkJLy8gYXJlIG5lZ2F0ZWQgaW4gdGhlIHBpeGVsIHNoYWRlci4KKwkJc3dpdGNoKGN1YmVGYWNlKQorCQl7CisJCWNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOgorCQkJZmFjZSA9IENVQkVNQVBfRkFDRV9QT1NJVElWRV9YOworCQkJYnJlYWs7CisJCWNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOgorCQkJZmFjZSA9IENVQkVNQVBfRkFDRV9ORUdBVElWRV9YOworCQkJYnJlYWs7CisJCWNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZOgorCQkJZmFjZSA9IENVQkVNQVBfRkFDRV9ORUdBVElWRV9ZOworCQkJYnJlYWs7CisJCWNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZOgorCQkJZmFjZSA9IENVQkVNQVBfRkFDRV9QT1NJVElWRV9ZOworCQkJYnJlYWs7CisJCWNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOgorCQkJZmFjZSA9IENVQkVNQVBfRkFDRV9QT1NJVElWRV9aOworCQkJYnJlYWs7CisJCWNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aOgorCQkJZmFjZSA9IENVQkVNQVBfRkFDRV9ORUdBVElWRV9aOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisJCX0KKworCQlyZXR1cm4gZmFjZTsKKwl9CisKKwlib29sIElzVGV4dHVyZVRhcmdldChHTGVudW0gdGFyZ2V0KQorCXsKKwkJcmV0dXJuIHRhcmdldCA9PSBHTF9URVhUVVJFXzJEIHx8IElzQ3ViZW1hcFRleHR1cmVUYXJnZXQodGFyZ2V0KTsKKwl9CisKKwkvLyBWZXJpZnkgdGhhdCBmb3JtYXQvdHlwZSBhcmUgb25lIG9mIHRoZSBjb21iaW5hdGlvbnMgZnJvbSB0YWJsZSAzLjQuCisJYm9vbCBDaGVja1RleHR1cmVGb3JtYXRUeXBlKEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlKQorCXsKKwkJc3dpdGNoKHR5cGUpCisJCXsKKwkJY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorCQkJc3dpdGNoKGZvcm1hdCkKKwkJCXsKKwkJCWNhc2UgR0xfUkdCQToKKwkJCWNhc2UgR0xfQkdSQV9FWFQ6CisJCQljYXNlIEdMX1JHQjoKKwkJCWNhc2UgR0xfQUxQSEE6CisJCQljYXNlIEdMX0xVTUlOQU5DRToKKwkJCWNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgorCQkJCXJldHVybiB0cnVlOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCWNhc2UgR0xfRkxPQVQ6CisJCWNhc2UgR0xfSEFMRl9GTE9BVF9PRVM6CisJCQlzd2l0Y2goZm9ybWF0KQorCQkJeworCQkJY2FzZSBHTF9SR0JBOgorCQkJY2FzZSBHTF9SR0I6CisJCQljYXNlIEdMX0FMUEhBOgorCQkJY2FzZSBHTF9MVU1JTkFOQ0U6CisJCQljYXNlIEdMX0xVTUlOQU5DRV9BTFBIQToKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQljYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ6CisJCWNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMToKKwkJCXJldHVybiAoZm9ybWF0ID09IEdMX1JHQkEpOworCQljYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OgorCQkJcmV0dXJuIChmb3JtYXQgPT0gR0xfUkdCKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCWJvb2wgSXNDb2xvclJlbmRlcmFibGUoR0xlbnVtIGludGVybmFsZm9ybWF0KQorCXsKKwkJc3dpdGNoKGludGVybmFsZm9ybWF0KQorCQl7CisJCWNhc2UgR0xfUkdCQTQ6CisJCWNhc2UgR0xfUkdCNV9BMToKKwkJY2FzZSBHTF9SR0I1NjU6CisJCWNhc2UgR0xfUkdCOF9PRVM6CisJCWNhc2UgR0xfUkdCQThfT0VTOgorCQkJcmV0dXJuIHRydWU7CisJCWNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMTY6CisJCWNhc2UgR0xfU1RFTkNJTF9JTkRFWDg6CisJCWNhc2UgR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVM6CisJCQlyZXR1cm4gZmFsc2U7CisJCWRlZmF1bHQ6CisJCQlVTklNUExFTUVOVEVEKCk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBJc0RlcHRoUmVuZGVyYWJsZShHTGVudW0gaW50ZXJuYWxmb3JtYXQpCisJeworCQlzd2l0Y2goaW50ZXJuYWxmb3JtYXQpCisJCXsKKwkJY2FzZSBHTF9ERVBUSF9DT01QT05FTlQxNjoKKwkJY2FzZSBHTF9ERVBUSDI0X1NURU5DSUw4X09FUzoKKwkJCXJldHVybiB0cnVlOworCQljYXNlIEdMX1NURU5DSUxfSU5ERVg4OgorCQljYXNlIEdMX1JHQkE0OgorCQljYXNlIEdMX1JHQjVfQTE6CisJCWNhc2UgR0xfUkdCNTY1OgorCQljYXNlIEdMX1JHQjhfT0VTOgorCQljYXNlIEdMX1JHQkE4X09FUzoKKwkJCXJldHVybiBmYWxzZTsKKwkJZGVmYXVsdDoKKwkJCVVOSU1QTEVNRU5URUQoKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlib29sIElzU3RlbmNpbFJlbmRlcmFibGUoR0xlbnVtIGludGVybmFsZm9ybWF0KQorCXsKKwkJc3dpdGNoKGludGVybmFsZm9ybWF0KQorCQl7CisJCWNhc2UgR0xfU1RFTkNJTF9JTkRFWDg6CisJCWNhc2UgR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVM6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJY2FzZSBHTF9SR0JBNDoKKwkJY2FzZSBHTF9SR0I1X0ExOgorCQljYXNlIEdMX1JHQjU2NToKKwkJY2FzZSBHTF9SR0I4X09FUzoKKwkJY2FzZSBHTF9SR0JBOF9PRVM6CisJCWNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMTY6CisJCQlyZXR1cm4gZmFsc2U7CisJCWRlZmF1bHQ6CisJCQlVTklNUExFTUVOVEVEKCk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCituYW1lc3BhY2UgZXMyc3cKK3sKKwlzdzo6Q29udGV4dDo6RGVwdGhDb21wYXJlTW9kZSBDb252ZXJ0RGVwdGhDb21wYXJpc29uKEdMZW51bSBjb21wYXJpc29uKQorCXsKKwkJc3dpdGNoKGNvbXBhcmlzb24pCisJCXsKKwkJY2FzZSBHTF9ORVZFUjogICAgcmV0dXJuIHN3OjpDb250ZXh0OjpERVBUSF9ORVZFUjsKKwkJY2FzZSBHTF9BTFdBWVM6ICAgcmV0dXJuIHN3OjpDb250ZXh0OjpERVBUSF9BTFdBWVM7CisJCWNhc2UgR0xfTEVTUzogICAgIHJldHVybiBzdzo6Q29udGV4dDo6REVQVEhfTEVTUzsKKwkJY2FzZSBHTF9MRVFVQUw6ICAgcmV0dXJuIHN3OjpDb250ZXh0OjpERVBUSF9MRVNTRVFVQUw7CisJCWNhc2UgR0xfRVFVQUw6ICAgIHJldHVybiBzdzo6Q29udGV4dDo6REVQVEhfRVFVQUw7CisJCWNhc2UgR0xfR1JFQVRFUjogIHJldHVybiBzdzo6Q29udGV4dDo6REVQVEhfR1JFQVRFUjsKKwkJY2FzZSBHTF9HRVFVQUw6ICAgcmV0dXJuIHN3OjpDb250ZXh0OjpERVBUSF9HUkVBVEVSRVFVQUw7CisJCWNhc2UgR0xfTk9URVFVQUw6IHJldHVybiBzdzo6Q29udGV4dDo6REVQVEhfTk9URVFVQUw7CisJCWRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisJCX0KKworCQlyZXR1cm4gc3c6OkNvbnRleHQ6OkRFUFRIX0FMV0FZUzsKKwl9CisKKwlzdzo6Q29udGV4dDo6U3RlbmNpbENvbXBhcmVNb2RlIENvbnZlcnRTdGVuY2lsQ29tcGFyaXNvbihHTGVudW0gY29tcGFyaXNvbikKKwl7CisJCXN3aXRjaChjb21wYXJpc29uKQorCQl7CisJCWNhc2UgR0xfTkVWRVI6ICAgIHJldHVybiBzdzo6Q29udGV4dDo6U1RFTkNJTF9ORVZFUjsKKwkJY2FzZSBHTF9BTFdBWVM6ICAgcmV0dXJuIHN3OjpDb250ZXh0OjpTVEVOQ0lMX0FMV0FZUzsKKwkJY2FzZSBHTF9MRVNTOiAgICAgcmV0dXJuIHN3OjpDb250ZXh0OjpTVEVOQ0lMX0xFU1M7CisJCWNhc2UgR0xfTEVRVUFMOiAgIHJldHVybiBzdzo6Q29udGV4dDo6U1RFTkNJTF9MRVNTRVFVQUw7CisJCWNhc2UgR0xfRVFVQUw6ICAgIHJldHVybiBzdzo6Q29udGV4dDo6U1RFTkNJTF9FUVVBTDsKKwkJY2FzZSBHTF9HUkVBVEVSOiAgcmV0dXJuIHN3OjpDb250ZXh0OjpTVEVOQ0lMX0dSRUFURVI7CisJCWNhc2UgR0xfR0VRVUFMOiAgIHJldHVybiBzdzo6Q29udGV4dDo6U1RFTkNJTF9HUkVBVEVSRVFVQUw7CisJCWNhc2UgR0xfTk9URVFVQUw6IHJldHVybiBzdzo6Q29udGV4dDo6U1RFTkNJTF9OT1RFUVVBTDsKKwkJZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsKKwkJfQorCisJCXJldHVybiBzdzo6Q29udGV4dDo6U1RFTkNJTF9BTFdBWVM7CisJfQorCisJc3c6OkNvbG9yPGZsb2F0PiBDb252ZXJ0Q29sb3IoZ2w6OkNvbG9yIGNvbG9yKQorCXsKKwkJcmV0dXJuIHN3OjpDb2xvcjxmbG9hdD4oY29sb3IucmVkLCBjb2xvci5ncmVlbiwgY29sb3IuYmx1ZSwgY29sb3IuYWxwaGEpOworCX0KKworCXN3OjpDb250ZXh0OjpCbGVuZEZhY3RvciBDb252ZXJ0QmxlbmRGdW5jKEdMZW51bSBibGVuZCkKKwl7CisJCXN3aXRjaChibGVuZCkKKwkJeworCQljYXNlIEdMX1pFUk86ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN3OjpDb250ZXh0OjpCTEVORF9aRVJPOworCQljYXNlIEdMX09ORTogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN3OjpDb250ZXh0OjpCTEVORF9PTkU7CisJCWNhc2UgR0xfU1JDX0NPTE9SOiAgICAgICAgICAgICAgICByZXR1cm4gc3c6OkNvbnRleHQ6OkJMRU5EX1NPVVJDRTsKKwkJY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOiAgICAgIHJldHVybiBzdzo6Q29udGV4dDo6QkxFTkRfSU5WU09VUkNFOworCQljYXNlIEdMX0RTVF9DT0xPUjogICAgICAgICAgICAgICAgcmV0dXJuIHN3OjpDb250ZXh0OjpCTEVORF9ERVNUOworCQljYXNlIEdMX09ORV9NSU5VU19EU1RfQ09MT1I6ICAgICAgcmV0dXJuIHN3OjpDb250ZXh0OjpCTEVORF9JTlZERVNUOworCQljYXNlIEdMX1NSQ19BTFBIQTogICAgICAgICAgICAgICAgcmV0dXJuIHN3OjpDb250ZXh0OjpCTEVORF9TT1VSQ0VBTFBIQTsKKwkJY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOiAgICAgIHJldHVybiBzdzo6Q29udGV4dDo6QkxFTkRfSU5WU09VUkNFQUxQSEE7CisJCWNhc2UgR0xfRFNUX0FMUEhBOiAgICAgICAgICAgICAgICByZXR1cm4gc3c6OkNvbnRleHQ6OkJMRU5EX0RFU1RBTFBIQTsKKwkJY2FzZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOiAgICAgIHJldHVybiBzdzo6Q29udGV4dDo6QkxFTkRfSU5WREVTVEFMUEhBOworCQljYXNlIEdMX0NPTlNUQU5UX0NPTE9SOiAgICAgICAgICAgcmV0dXJuIHN3OjpDb250ZXh0OjpCTEVORF9DT05TVEFOVDsKKwkJY2FzZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1I6IHJldHVybiBzdzo6Q29udGV4dDo6QkxFTkRfSU5WQ09OU1RBTlQ7CisJCWNhc2UgR0xfQ09OU1RBTlRfQUxQSEE6ICAgICAgICAgICByZXR1cm4gc3c6OkNvbnRleHQ6OkJMRU5EX0NPTlNUQU5UQUxQSEE7CisJCWNhc2UgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBOiByZXR1cm4gc3c6OkNvbnRleHQ6OkJMRU5EX0lOVkNPTlNUQU5UQUxQSEE7CisJCWNhc2UgR0xfU1JDX0FMUEhBX1NBVFVSQVRFOiAgICAgICByZXR1cm4gc3c6OkNvbnRleHQ6OkJMRU5EX1NSQ0FMUEhBU0FUOworCQlkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworCQl9CisKKwkJcmV0dXJuIHN3OjpDb250ZXh0OjpCTEVORF9aRVJPOworCX0KKworCXN3OjpDb250ZXh0OjpCbGVuZE9wZXJhdGlvbiBDb252ZXJ0QmxlbmRPcChHTGVudW0gYmxlbmRPcCkKKwl7CisJCXN3aXRjaChibGVuZE9wKQorCQl7CisJCWNhc2UgR0xfRlVOQ19BREQ6ICAgICAgICAgICAgICByZXR1cm4gc3c6OkNvbnRleHQ6OkJMRU5ET1BfQUREOworCQljYXNlIEdMX0ZVTkNfU1VCVFJBQ1Q6ICAgICAgICAgcmV0dXJuIHN3OjpDb250ZXh0OjpCTEVORE9QX1NVQjsKKwkJY2FzZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1Q6IHJldHVybiBzdzo6Q29udGV4dDo6QkxFTkRPUF9JTlZTVUI7CisJCWRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisJCX0KKworCQlyZXR1cm4gc3c6OkNvbnRleHQ6OkJMRU5ET1BfQUREOworCX0KKworCXN3OjpDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uIENvbnZlcnRTdGVuY2lsT3AoR0xlbnVtIHN0ZW5jaWxPcCkKKwl7CisJCXN3aXRjaChzdGVuY2lsT3ApCisJCXsKKwkJY2FzZSBHTF9aRVJPOiAgICAgIHJldHVybiBzdzo6Q29udGV4dDo6T1BFUkFUSU9OX1pFUk87CisJCWNhc2UgR0xfS0VFUDogICAgICByZXR1cm4gc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9LRUVQOworCQljYXNlIEdMX1JFUExBQ0U6ICAgcmV0dXJuIHN3OjpDb250ZXh0OjpPUEVSQVRJT05fUkVQTEFDRTsKKwkJY2FzZSBHTF9JTkNSOiAgICAgIHJldHVybiBzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0lOQ1JTQVQ7CisJCWNhc2UgR0xfREVDUjogICAgICByZXR1cm4gc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9ERUNSU0FUOworCQljYXNlIEdMX0lOVkVSVDogICAgcmV0dXJuIHN3OjpDb250ZXh0OjpPUEVSQVRJT05fSU5WRVJUOworCQljYXNlIEdMX0lOQ1JfV1JBUDogcmV0dXJuIHN3OjpDb250ZXh0OjpPUEVSQVRJT05fSU5DUjsKKwkJY2FzZSBHTF9ERUNSX1dSQVA6IHJldHVybiBzdzo6Q29udGV4dDo6T1BFUkFUSU9OX0RFQ1I7CisJCWRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisJCX0KKworCQlyZXR1cm4gc3c6OkNvbnRleHQ6Ok9QRVJBVElPTl9LRUVQOworCX0KKworCXN3OjpBZGRyZXNzaW5nTW9kZSBDb252ZXJ0VGV4dHVyZVdyYXAoR0xlbnVtIHdyYXApCisJeworCQlzd2l0Y2god3JhcCkKKwkJeworCQljYXNlIEdMX1JFUEVBVDogICAgICAgICAgICByZXR1cm4gc3c6OkFERFJFU1NJTkdfV1JBUDsKKwkJY2FzZSBHTF9DTEFNUF9UT19FREdFOiAgICAgcmV0dXJuIHN3OjpBRERSRVNTSU5HX0NMQU1QOworCQljYXNlIEdMX01JUlJPUkVEX1JFUEVBVDogICByZXR1cm4gc3c6OkFERFJFU1NJTkdfTUlSUk9SOworCQlkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworCQl9CisKKwkJcmV0dXJuIHN3OjpBRERSRVNTSU5HX1dSQVA7CisJfQorCisJc3c6OkNvbnRleHQ6OkN1bGxNb2RlIENvbnZlcnRDdWxsTW9kZShHTGVudW0gY3VsbEZhY2UsIEdMZW51bSBmcm9udEZhY2UpCisJeworCQlzd2l0Y2goY3VsbEZhY2UpCisJCXsKKwkJY2FzZSBHTF9GUk9OVDoKKwkJCXJldHVybiAoZnJvbnRGYWNlID09IEdMX0NDVyA/IHN3OjpDb250ZXh0OjpDVUxMX0NMT0NLV0lTRSA6IHN3OjpDb250ZXh0OjpDVUxMX0NPVU5URVJDTE9DS1dJU0UpOworCQljYXNlIEdMX0JBQ0s6CisJCQlyZXR1cm4gKGZyb250RmFjZSA9PSBHTF9DQ1cgPyBzdzo6Q29udGV4dDo6Q1VMTF9DT1VOVEVSQ0xPQ0tXSVNFIDogc3c6OkNvbnRleHQ6OkNVTExfQ0xPQ0tXSVNFKTsKKwkJY2FzZSBHTF9GUk9OVF9BTkRfQkFDSzoKKwkJCXJldHVybiBzdzo6Q29udGV4dDo6Q1VMTF9OT05FOyAgIC8vIGN1bGxpbmcgd2lsbCBiZSBoYW5kbGVkIGR1cmluZyBkcmF3CisJCWRlZmF1bHQ6IFVOUkVBQ0hBQkxFKCk7CisJCX0KKworCQlyZXR1cm4gc3c6OkNvbnRleHQ6OkNVTExfQ09VTlRFUkNMT0NLV0lTRTsKKwl9CisKKwl1bnNpZ25lZCBpbnQgQ29udmVydENvbG9yTWFzayhib29sIHJlZCwgYm9vbCBncmVlbiwgYm9vbCBibHVlLCBib29sIGFscGhhKQorCXsKKwkJcmV0dXJuIChyZWQgICA/IDB4MDAwMDAwMDEgOiAwKSB8CisJCQkgICAoZ3JlZW4gPyAweDAwMDAwMDAyIDogMCkgfAorCQkJICAgKGJsdWUgID8gMHgwMDAwMDAwNCA6IDApIHwKKwkJCSAgIChhbHBoYSA/IDB4MDAwMDAwMDggOiAwKTsKKwl9CisKKwlzdzo6RmlsdGVyVHlwZSBDb252ZXJ0TWFnRmlsdGVyKEdMZW51bSBtYWdGaWx0ZXIpCisJeworCQlzd2l0Y2gobWFnRmlsdGVyKQorCQl7CisJCWNhc2UgR0xfTkVBUkVTVDogcmV0dXJuIHN3OjpGSUxURVJfUE9JTlQ7CisJCWNhc2UgR0xfTElORUFSOiAgcmV0dXJuIHN3OjpGSUxURVJfTElORUFSOworCQlkZWZhdWx0OiBVTlJFQUNIQUJMRSgpOworCQl9CisKKwkJcmV0dXJuIHN3OjpGSUxURVJfUE9JTlQ7CisJfQorCisJdm9pZCBDb252ZXJ0TWluRmlsdGVyKEdMZW51bSB0ZXhGaWx0ZXIsIHN3OjpGaWx0ZXJUeXBlICptaW5GaWx0ZXIsIHN3OjpNaXBtYXBUeXBlICptaXBGaWx0ZXIpCisJeworCQlzd2l0Y2godGV4RmlsdGVyKQorCQl7CisJCWNhc2UgR0xfTkVBUkVTVDoKKwkJCSptaW5GaWx0ZXIgPSBzdzo6RklMVEVSX1BPSU5UOworCQkJKm1pcEZpbHRlciA9IHN3OjpNSVBNQVBfTk9ORTsKKwkJCWJyZWFrOworCQljYXNlIEdMX0xJTkVBUjoKKwkJCSptaW5GaWx0ZXIgPSBzdzo6RklMVEVSX0xJTkVBUjsKKwkJCSptaXBGaWx0ZXIgPSBzdzo6TUlQTUFQX05PTkU7CisJCQlicmVhazsKKwkJY2FzZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUOgorCQkJKm1pbkZpbHRlciA9IHN3OjpGSUxURVJfUE9JTlQ7CisJCQkqbWlwRmlsdGVyID0gc3c6Ok1JUE1BUF9QT0lOVDsKKwkJCWJyZWFrOworCQljYXNlIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVDoKKwkJCSptaW5GaWx0ZXIgPSBzdzo6RklMVEVSX0xJTkVBUjsKKwkJCSptaXBGaWx0ZXIgPSBzdzo6TUlQTUFQX1BPSU5UOworCQkJYnJlYWs7CisJCWNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSOgorCQkJKm1pbkZpbHRlciA9IHN3OjpGSUxURVJfUE9JTlQ7CisJCQkqbWlwRmlsdGVyID0gc3c6Ok1JUE1BUF9MSU5FQVI7CisJCQlicmVhazsKKwkJY2FzZSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUjoKKwkJCSptaW5GaWx0ZXIgPSBzdzo6RklMVEVSX0xJTkVBUjsKKwkJCSptaXBGaWx0ZXIgPSBzdzo6TUlQTUFQX0xJTkVBUjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJKm1pbkZpbHRlciA9IHN3OjpGSUxURVJfUE9JTlQ7CisJCQkqbWlwRmlsdGVyID0gc3c6Ok1JUE1BUF9OT05FOworCQkJVU5SRUFDSEFCTEUoKTsKKwkJfQorCX0KKworCWJvb2wgQ29udmVydFByaW1pdGl2ZVR5cGUoR0xlbnVtIHByaW1pdGl2ZVR5cGUsIEdMc2l6ZWkgZWxlbWVudENvdW50LCAgZ2w6OlByaW1pdGl2ZVR5cGUgJnN3UHJpbWl0aXZlVHlwZSwgaW50ICZwcmltaXRpdmVDb3VudCkKKwl7CisJCXN3aXRjaChwcmltaXRpdmVUeXBlKQorCQl7CisJCWNhc2UgR0xfUE9JTlRTOgorCQkJc3dQcmltaXRpdmVUeXBlID0gZ2w6OkRSQVdfUE9JTlRMSVNUOworCQkJcHJpbWl0aXZlQ291bnQgPSBlbGVtZW50Q291bnQ7CisJCQlicmVhazsKKwkJY2FzZSBHTF9MSU5FUzoKKwkJCXN3UHJpbWl0aXZlVHlwZSA9IGdsOjpEUkFXX0xJTkVMSVNUOworCQkJcHJpbWl0aXZlQ291bnQgPSBlbGVtZW50Q291bnQgLyAyOworCQkJYnJlYWs7CisJCWNhc2UgR0xfTElORV9MT09QOgorCQkJc3dQcmltaXRpdmVUeXBlID0gZ2w6OkRSQVdfTElORUxPT1A7CisJCQlwcmltaXRpdmVDb3VudCA9IGVsZW1lbnRDb3VudDsKKwkJCWJyZWFrOworCQljYXNlIEdMX0xJTkVfU1RSSVA6CisJCQlzd1ByaW1pdGl2ZVR5cGUgPSBnbDo6RFJBV19MSU5FU1RSSVA7CisJCQlwcmltaXRpdmVDb3VudCA9IGVsZW1lbnRDb3VudCAtIDE7CisJCQlicmVhazsKKwkJY2FzZSBHTF9UUklBTkdMRVM6CisJCQlzd1ByaW1pdGl2ZVR5cGUgPSBnbDo6RFJBV19UUklBTkdMRUxJU1Q7CisJCQlwcmltaXRpdmVDb3VudCA9IGVsZW1lbnRDb3VudCAvIDM7CisJCQlicmVhazsKKwkJY2FzZSBHTF9UUklBTkdMRV9TVFJJUDoKKwkJCXN3UHJpbWl0aXZlVHlwZSA9IGdsOjpEUkFXX1RSSUFOR0xFU1RSSVA7CisJCQlwcmltaXRpdmVDb3VudCA9IGVsZW1lbnRDb3VudCAtIDI7CisJCQlicmVhazsKKwkJY2FzZSBHTF9UUklBTkdMRV9GQU46CisJCQlzd1ByaW1pdGl2ZVR5cGUgPSBnbDo6RFJBV19UUklBTkdMRUZBTjsKKwkJCXByaW1pdGl2ZUNvdW50ID0gZWxlbWVudENvdW50IC0gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJc3c6OkZvcm1hdCBDb252ZXJ0UmVuZGVyYnVmZmVyRm9ybWF0KEdMZW51bSBmb3JtYXQpCisJeworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgR0xfUkdCQTQ6CisJCWNhc2UgR0xfUkdCNV9BMToKKwkJY2FzZSBHTF9SR0JBOF9PRVM6ICAgICAgICAgICAgcmV0dXJuIHN3OjpGT1JNQVRfQThSOEc4Qjg7CisJCWNhc2UgR0xfUkdCNTY1OiAgICAgICAgICAgICAgIHJldHVybiBzdzo6Rk9STUFUX1I1RzZCNTsKKwkJY2FzZSBHTF9SR0I4X09FUzogICAgICAgICAgICAgcmV0dXJuIHN3OjpGT1JNQVRfWDhSOEc4Qjg7CisJCWNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMTY6CisJCWNhc2UgR0xfU1RFTkNJTF9JTkRFWDg6ICAgICAgIAorCQljYXNlIEdMX0RFUFRIMjRfU1RFTkNJTDhfT0VTOiByZXR1cm4gc3c6OkZPUk1BVF9EMjRTODsKKwkJZGVmYXVsdDogVU5SRUFDSEFCTEUoKTsgICAgICAgcmV0dXJuIHN3OjpGT1JNQVRfQThSOEc4Qjg7CisJCX0KKwl9Cit9CisKK25hbWVzcGFjZSBzdzJlcworeworCXVuc2lnbmVkIGludCBHZXRTdGVuY2lsU2l6ZShzdzo6Rm9ybWF0IHN0ZW5jaWxGb3JtYXQpCisJeworCQlzd2l0Y2goc3RlbmNpbEZvcm1hdCkKKwkJeworCQljYXNlIHN3OjpGT1JNQVRfRDI0RlM4OgorCQljYXNlIHN3OjpGT1JNQVRfRDI0Uzg6CisJCQlyZXR1cm4gODsKKwkvLwljYXNlIHN3OjpGT1JNQVRfRDI0WDRTNDoKKwkvLwkJcmV0dXJuIDQ7CisJLy8JY2FzZSBzdzo6Rk9STUFUX0QxNVMxOgorCS8vCQlyZXR1cm4gMTsKKwkvLwljYXNlIHN3OjpGT1JNQVRfRDE2X0xPQ0tBQkxFOgorCQljYXNlIHN3OjpGT1JNQVRfRDMyOgorCQljYXNlIHN3OjpGT1JNQVRfRDI0WDg6CisJCWNhc2Ugc3c6OkZPUk1BVF9EMzJGX0xPQ0tBQkxFOgorCQljYXNlIHN3OjpGT1JNQVRfRDE2OgorCQkJcmV0dXJuIDA7CisJLy8JY2FzZSBzdzo6Rk9STUFUX0QzMl9MT0NLQUJMRTogIHJldHVybiAwOyAgIC8vIERpcmVjdFggOUV4IG9ubHkKKwkvLwljYXNlIHN3OjpGT1JNQVRfUzhfTE9DS0FCTEU6ICAgcmV0dXJuIDg7ICAgLy8gRGlyZWN0WCA5RXggb25seQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwl1bnNpZ25lZCBpbnQgR2V0QWxwaGFTaXplKHN3OjpGb3JtYXQgY29sb3JGb3JtYXQpCisJeworCQlzd2l0Y2goY29sb3JGb3JtYXQpCisJCXsKKwkJY2FzZSBzdzo6Rk9STUFUX0ExNkIxNkcxNlIxNkY6CisJCQlyZXR1cm4gMTY7CisJCWNhc2Ugc3c6OkZPUk1BVF9BMzJCMzJHMzJSMzJGOgorCQkJcmV0dXJuIDMyOworCQljYXNlIHN3OjpGT1JNQVRfQTJSMTBHMTBCMTA6CisJCQlyZXR1cm4gMjsKKwkJY2FzZSBzdzo6Rk9STUFUX0E4UjhHOEI4OgorCQkJcmV0dXJuIDg7CisJCWNhc2Ugc3c6OkZPUk1BVF9BMVI1RzVCNToKKwkJCXJldHVybiAxOworCQljYXNlIHN3OjpGT1JNQVRfWDhSOEc4Qjg6CisJCWNhc2Ugc3c6OkZPUk1BVF9SNUc2QjU6CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJdW5zaWduZWQgaW50IEdldFJlZFNpemUoc3c6OkZvcm1hdCBjb2xvckZvcm1hdCkKKwl7CisJCXN3aXRjaChjb2xvckZvcm1hdCkKKwkJeworCQljYXNlIHN3OjpGT1JNQVRfQTE2QjE2RzE2UjE2RjoKKwkJCXJldHVybiAxNjsKKwkJY2FzZSBzdzo6Rk9STUFUX0EzMkIzMkczMlIzMkY6CisJCQlyZXR1cm4gMzI7CisJCWNhc2Ugc3c6OkZPUk1BVF9BMlIxMEcxMEIxMDoKKwkJCXJldHVybiAxMDsKKwkJY2FzZSBzdzo6Rk9STUFUX0E4UjhHOEI4OgorCQljYXNlIHN3OjpGT1JNQVRfWDhSOEc4Qjg6CisJCQlyZXR1cm4gODsKKwkJY2FzZSBzdzo6Rk9STUFUX0ExUjVHNUI1OgorCQljYXNlIHN3OjpGT1JNQVRfUjVHNkI1OgorCQkJcmV0dXJuIDU7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXVuc2lnbmVkIGludCBHZXRHcmVlblNpemUoc3c6OkZvcm1hdCBjb2xvckZvcm1hdCkKKwl7CisJCXN3aXRjaChjb2xvckZvcm1hdCkKKwkJeworCQljYXNlIHN3OjpGT1JNQVRfQTE2QjE2RzE2UjE2RjoKKwkJCXJldHVybiAxNjsKKwkJY2FzZSBzdzo6Rk9STUFUX0EzMkIzMkczMlIzMkY6CisJCQlyZXR1cm4gMzI7CisJCWNhc2Ugc3c6OkZPUk1BVF9BMlIxMEcxMEIxMDoKKwkJCXJldHVybiAxMDsKKwkJY2FzZSBzdzo6Rk9STUFUX0E4UjhHOEI4OgorCQljYXNlIHN3OjpGT1JNQVRfWDhSOEc4Qjg6CisJCQlyZXR1cm4gODsKKwkJY2FzZSBzdzo6Rk9STUFUX0ExUjVHNUI1OgorCQkJcmV0dXJuIDU7CisJCWNhc2Ugc3c6OkZPUk1BVF9SNUc2QjU6CisJCQlyZXR1cm4gNjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJdW5zaWduZWQgaW50IEdldEJsdWVTaXplKHN3OjpGb3JtYXQgY29sb3JGb3JtYXQpCisJeworCQlzd2l0Y2goY29sb3JGb3JtYXQpCisJCXsKKwkJY2FzZSBzdzo6Rk9STUFUX0ExNkIxNkcxNlIxNkY6CisJCQlyZXR1cm4gMTY7CisJCWNhc2Ugc3c6OkZPUk1BVF9BMzJCMzJHMzJSMzJGOgorCQkJcmV0dXJuIDMyOworCQljYXNlIHN3OjpGT1JNQVRfQTJSMTBHMTBCMTA6CisJCQlyZXR1cm4gMTA7CisJCWNhc2Ugc3c6OkZPUk1BVF9BOFI4RzhCODoKKwkJY2FzZSBzdzo6Rk9STUFUX1g4UjhHOEI4OgorCQkJcmV0dXJuIDg7CisJCWNhc2Ugc3c6OkZPUk1BVF9BMVI1RzVCNToKKwkJY2FzZSBzdzo6Rk9STUFUX1I1RzZCNToKKwkJCXJldHVybiA1OworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwl1bnNpZ25lZCBpbnQgR2V0RGVwdGhTaXplKHN3OjpGb3JtYXQgZGVwdGhGb3JtYXQpCisJeworCQlzd2l0Y2goZGVwdGhGb3JtYXQpCisJCXsKKwkvLwljYXNlIHN3OjpGT1JNQVRfRDE2X0xPQ0tBQkxFOiAgcmV0dXJuIDE2OworCQljYXNlIHN3OjpGT1JNQVRfRDMyOiAgICAgICAgICAgcmV0dXJuIDMyOworCS8vCWNhc2Ugc3c6OkZPUk1BVF9EMTVTMTogICAgICAgICByZXR1cm4gMTU7CisJCWNhc2Ugc3c6OkZPUk1BVF9EMjRTODogICAgICAgICByZXR1cm4gMjQ7CisJCWNhc2Ugc3c6OkZPUk1BVF9EMjRYODogICAgICAgICByZXR1cm4gMjQ7CisJLy8JY2FzZSBzdzo6Rk9STUFUX0QyNFg0UzQ6ICAgICAgIHJldHVybiAyNDsKKwkJY2FzZSBzdzo6Rk9STUFUX0QxNjogICAgICAgICAgIHJldHVybiAxNjsKKwkJY2FzZSBzdzo6Rk9STUFUX0QzMkZfTE9DS0FCTEU6IHJldHVybiAzMjsKKwkJY2FzZSBzdzo6Rk9STUFUX0QyNEZTODogICAgICAgIHJldHVybiAyNDsKKwkvLwljYXNlIHN3OjpGT1JNQVRfRDMyX0xPQ0tBQkxFOiAgcmV0dXJuIDMyOworCS8vCWNhc2Ugc3c6OkZPUk1BVF9TOF9MT0NLQUJMRTogICByZXR1cm4gMDsKKwkJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCX0KKwl9CisKKwlHTGVudW0gQ29udmVydEJhY2tCdWZmZXJGb3JtYXQoc3c6OkZvcm1hdCBmb3JtYXQpCisJeworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2Ugc3c6OkZPUk1BVF9BNFI0RzRCNDogcmV0dXJuIEdMX1JHQkE0OworCQljYXNlIHN3OjpGT1JNQVRfQThSOEc4Qjg6IHJldHVybiBHTF9SR0JBOF9PRVM7CisJCWNhc2Ugc3c6OkZPUk1BVF9BMVI1RzVCNTogcmV0dXJuIEdMX1JHQjVfQTE7CisJCWNhc2Ugc3c6OkZPUk1BVF9SNUc2QjU6ICAgcmV0dXJuIEdMX1JHQjU2NTsKKwkJY2FzZSBzdzo6Rk9STUFUX1g4UjhHOEI4OiByZXR1cm4gR0xfUkdCOF9PRVM7CisJCWRlZmF1bHQ6CisJCQlVTlJFQUNIQUJMRSgpOworCQl9CisKKwkJcmV0dXJuIEdMX1JHQkE0OworCX0KKworCUdMZW51bSBDb252ZXJ0RGVwdGhTdGVuY2lsRm9ybWF0KHN3OjpGb3JtYXQgZm9ybWF0KQorCXsKKwkJc3dpdGNoKGZvcm1hdCkKKwkJeworCQljYXNlIHN3OjpGT1JNQVRfRDE2OgorCQljYXNlIHN3OjpGT1JNQVRfRDI0WDg6CisJCWNhc2Ugc3c6OkZPUk1BVF9EMzI6CisJCQlyZXR1cm4gR0xfREVQVEhfQ09NUE9ORU5UMTY7CisJCWNhc2Ugc3c6OkZPUk1BVF9EMjRTODoKKwkJCXJldHVybiBHTF9ERVBUSDI0X1NURU5DSUw4X09FUzsKKwkJZGVmYXVsdDoKKwkJCVVOUkVBQ0hBQkxFKCk7CisJCX0KKworCQlyZXR1cm4gR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVM7CisJfQorfQorCitzdGQ6OnN0cmluZyBnZXRUZW1wUGF0aCgpCit7CisgICAgY2hhciBwYXRoW01BWF9QQVRIXTsKKyAgICBEV09SRCBwYXRoTGVuID0gR2V0VGVtcFBhdGhBKHNpemVvZihwYXRoKSAvIHNpemVvZihwYXRoWzBdKSwgcGF0aCk7CisgICAgaWYocGF0aExlbiA9PSAwKQorICAgIHsKKyAgICAgICAgVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgVUlOVCB1bmlxdWUgPSBHZXRUZW1wRmlsZU5hbWVBKHBhdGgsICJzaCIsIDAsIHBhdGgpOworICAgIGlmKHVuaXF1ZSA9PSAwKQorICAgIHsKKyAgICAgICAgVU5SRUFDSEFCTEUoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHJldHVybiBwYXRoOworfQorCit2b2lkIHdyaXRlRmlsZShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCB2b2lkKiBjb250ZW50LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBGSUxFKiBmaWxlID0gZm9wZW4ocGF0aCwgInciKTsKKyAgICBpZighZmlsZSkKKyAgICB7CisgICAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmd3JpdGUoY29udGVudCwgc2l6ZW9mKGNoYXIpLCBzaXplLCBmaWxlKTsKKyAgICBmY2xvc2UoZmlsZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvdXRpbGl0aWVzLmggYi9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvdXRpbGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmZDY3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9PcGVuR0wgRVMgMi4wL2xpYkdMRVN2Mi91dGlsaXRpZXMuaApAQCAtMCwwICsxLDg5IEBACisvLworLy8gQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworCisvLyB1dGlsaXRpZXMuaDogQ29udmVyc2lvbiBmdW5jdGlvbnMgYW5kIG90aGVyIHV0aWxpdHkgcm91dGluZXMuCisKKyNpZm5kZWYgTElCR0xFU1YyX1VUSUxJVElFU19ICisjZGVmaW5lIExJQkdMRVNWMl9VVElMSVRJRVNfSAorCisjaW5jbHVkZSAiRGV2aWNlLmhwcCIKKyNpbmNsdWRlICJJbWFnZS5ocHAiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorCisjZGVmaW5lIEdMX0FQSUNBTEwKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGdsCit7CisJc3RydWN0IENvbG9yOworCisJZW51bSBDdWJlRmFjZQorCXsKKwkJQ1VCRU1BUF9GQUNFX1BPU0lUSVZFX1ggPSAwLAorCQlDVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWCA9IDEsCisJCUNVQkVNQVBfRkFDRV9QT1NJVElWRV9ZID0gMiwKKwkJQ1VCRU1BUF9GQUNFX05FR0FUSVZFX1kgPSAzLAorCQlDVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWiA9IDQsCisJCUNVQkVNQVBfRkFDRV9ORUdBVElWRV9aID0gNQorCX07CisKKwlpbnQgVW5pZm9ybUNvbXBvbmVudENvdW50KEdMZW51bSB0eXBlKTsKKwlHTGVudW0gVW5pZm9ybUNvbXBvbmVudFR5cGUoR0xlbnVtIHR5cGUpOworCXNpemVfdCBVbmlmb3JtVHlwZVNpemUoR0xlbnVtIHR5cGUpOworCWludCBWYXJpYWJsZVJvd0NvdW50KEdMZW51bSB0eXBlKTsKKwlpbnQgVmFyaWFibGVDb2x1bW5Db3VudChHTGVudW0gdHlwZSk7CisKKwlpbnQgQWxsb2NhdGVGaXJzdEZyZWVCaXRzKHVuc2lnbmVkIGludCAqYml0cywgdW5zaWduZWQgaW50IGFsbG9jYXRpb25TaXplLCB1bnNpZ25lZCBpbnQgYml0c1NpemUpOworCisJaW50IENvbXB1dGVQaXhlbFNpemUoR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpOworCUdMc2l6ZWkgQ29tcHV0ZVBpdGNoKEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTGludCBhbGlnbm1lbnQpOworCUdMc2l6ZWkgQ29tcHV0ZUNvbXByZXNzZWRQaXRjaChHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0KTsKKwlHTHNpemVpIENvbXB1dGVDb21wcmVzc2VkU2l6ZShHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCk7CisJYm9vbCBJc0NvbXByZXNzZWQoR0xlbnVtIGZvcm1hdCk7CisJYm9vbCBJc0N1YmVtYXBUZXh0dXJlVGFyZ2V0KEdMZW51bSB0YXJnZXQpOworCUN1YmVGYWNlIENvbnZlcnRDdWJlRmFjZShHTGVudW0gY3ViZVRhcmdldCk7CisJYm9vbCBJc1RleHR1cmVUYXJnZXQoR0xlbnVtIHRhcmdldCk7CisJYm9vbCBDaGVja1RleHR1cmVGb3JtYXRUeXBlKEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlKTsKKworCWJvb2wgSXNDb2xvclJlbmRlcmFibGUoR0xlbnVtIGludGVybmFsZm9ybWF0KTsKKwlib29sIElzRGVwdGhSZW5kZXJhYmxlKEdMZW51bSBpbnRlcm5hbGZvcm1hdCk7CisJYm9vbCBJc1N0ZW5jaWxSZW5kZXJhYmxlKEdMZW51bSBpbnRlcm5hbGZvcm1hdCk7Cit9CisKK25hbWVzcGFjZSBlczJzdworeworCXN3OjpDb250ZXh0OjpEZXB0aENvbXBhcmVNb2RlIENvbnZlcnREZXB0aENvbXBhcmlzb24oR0xlbnVtIGNvbXBhcmlzb24pOworCXN3OjpDb250ZXh0OjpTdGVuY2lsQ29tcGFyZU1vZGUgQ29udmVydFN0ZW5jaWxDb21wYXJpc29uKEdMZW51bSBjb21wYXJpc29uKTsKKwlzdzo6Q29sb3I8ZmxvYXQ+IENvbnZlcnRDb2xvcihnbDo6Q29sb3IgY29sb3IpOworCXN3OjpDb250ZXh0OjpCbGVuZEZhY3RvciBDb252ZXJ0QmxlbmRGdW5jKEdMZW51bSBibGVuZCk7CisJc3c6OkNvbnRleHQ6OkJsZW5kT3BlcmF0aW9uIENvbnZlcnRCbGVuZE9wKEdMZW51bSBibGVuZE9wKTsKKwlzdzo6Q29udGV4dDo6U3RlbmNpbE9wZXJhdGlvbiBDb252ZXJ0U3RlbmNpbE9wKEdMZW51bSBzdGVuY2lsT3ApOworCXN3OjpBZGRyZXNzaW5nTW9kZSBDb252ZXJ0VGV4dHVyZVdyYXAoR0xlbnVtIHdyYXApOworCXN3OjpDb250ZXh0OjpDdWxsTW9kZSBDb252ZXJ0Q3VsbE1vZGUoR0xlbnVtIGN1bGxGYWNlLCBHTGVudW0gZnJvbnRGYWNlKTsKKwl1bnNpZ25lZCBpbnQgQ29udmVydENvbG9yTWFzayhib29sIHJlZCwgYm9vbCBncmVlbiwgYm9vbCBibHVlLCBib29sIGFscGhhKTsKKwlzdzo6RmlsdGVyVHlwZSBDb252ZXJ0TWFnRmlsdGVyKEdMZW51bSBtYWdGaWx0ZXIpOworCXZvaWQgQ29udmVydE1pbkZpbHRlcihHTGVudW0gdGV4RmlsdGVyLCBzdzo6RmlsdGVyVHlwZSAqbWluRmlsdGVyLCBzdzo6TWlwbWFwVHlwZSAqbWlwRmlsdGVyKTsKKwlib29sIENvbnZlcnRQcmltaXRpdmVUeXBlKEdMZW51bSBwcmltaXRpdmVUeXBlLCBHTHNpemVpIGVsZW1lbnRDb3VudCwgIGdsOjpQcmltaXRpdmVUeXBlICZzd1ByaW1pdGl2ZVR5cGUsIGludCAmcHJpbWl0aXZlQ291bnQpOworCXN3OjpGb3JtYXQgQ29udmVydFJlbmRlcmJ1ZmZlckZvcm1hdChHTGVudW0gZm9ybWF0KTsKK30KKworbmFtZXNwYWNlIHN3MmVzCit7CisJR0x1aW50IEdldEFscGhhU2l6ZShzdzo6Rm9ybWF0IGNvbG9yRm9ybWF0KTsKKwlHTHVpbnQgR2V0UmVkU2l6ZShzdzo6Rm9ybWF0IGNvbG9yRm9ybWF0KTsKKwlHTHVpbnQgR2V0R3JlZW5TaXplKHN3OjpGb3JtYXQgY29sb3JGb3JtYXQpOworCUdMdWludCBHZXRCbHVlU2l6ZShzdzo6Rm9ybWF0IGNvbG9yRm9ybWF0KTsKKwlHTHVpbnQgR2V0RGVwdGhTaXplKHN3OjpGb3JtYXQgZGVwdGhGb3JtYXQpOworCUdMdWludCBHZXRTdGVuY2lsU2l6ZShzdzo6Rm9ybWF0IHN0ZW5jaWxGb3JtYXQpOworCisJR0xlbnVtIENvbnZlcnRCYWNrQnVmZmVyRm9ybWF0KHN3OjpGb3JtYXQgZm9ybWF0KTsKKwlHTGVudW0gQ29udmVydERlcHRoU3RlbmNpbEZvcm1hdChzdzo6Rm9ybWF0IGZvcm1hdCk7Cit9CisKKyNlbmRpZiAgLy8gTElCR0xFU1YyX1VUSUxJVElFU19ICmRpZmYgLS1naXQgYS9zcmMvT3BlbkdMIEVTIDIuMC9saWJHTEVTdjIvdmVydGV4Y29udmVyc2lvbi5oIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL3ZlcnRleGNvbnZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI4Yjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL09wZW5HTCBFUyAyLjAvbGliR0xFU3YyL3ZlcnRleGNvbnZlcnNpb24uaApAQCAtMCwwICsxLDIwOCBAQAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKworLy8gdmVydGV4Y29udmVyc2lvbi5oOiBBIGxpYnJhcnkgb2YgdmVydGV4IGNvbnZlcnNpb24gY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkCisvLyB0aGUgRm9ybWF0Q29udmVydGVyIG9iamVjdHMgdXNlZCBieSB0aGUgYnVmZmVyIGNvbnZlcnNpb24gc3lzdGVtLgorCisjaWZuZGVmIExJQkdMRVNWMl9WRVJURVhDT05WRVJTSU9OX0hfCisjZGVmaW5lIExJQkdMRVNWMl9WRVJURVhDT05WRVJTSU9OX0hfCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgImxpYkdMRVN2Mi9Db250ZXh0LmgiIC8vIERlZmluZXMgSW5kZXgKKworbmFtZXNwYWNlIGdsCit7CisKKy8vIENvbnZlcnNpb24gdHlwZXM6CisvLyBzdGF0aWMgY29uc3QgYm9vbCBpZGVudGl0eTogdHJ1ZSBpZiB0aGlzIGlzIGFuIGlkZW50aXR5IHRyYW5zZm9ybSwgZmFsc2Ugb3RoZXJ3aXNlCisvLyBzdGF0aWMgVSBjb252ZXJ0KFQpOiBjb252ZXJ0IGEgc2luZ2xlIGVsZW1lbnQgZnJvbSB0aGUgaW5wdXQgdHlwZSB0byB0aGUgb3V0cHV0IHR5cGUKKy8vIHR5cGVkZWYgLi4uIE91dHB1dFR5cGU6IHRoZSB0eXBlIHByb2R1Y2VkIGJ5IHRoaXMgY29udmVyc2lvbgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBJZGVudGl0eQoreworICAgIHN0YXRpYyBjb25zdCBib29sIGlkZW50aXR5ID0gdHJ1ZTsKKworICAgIHR5cGVkZWYgVCBPdXRwdXRUeXBlOworCisgICAgc3RhdGljIFQgY29udmVydChUIHgpCisgICAgeworICAgICAgICByZXR1cm4geDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRnJvbVQsIGNsYXNzIFRvVD4KK3N0cnVjdCBDYXN0Cit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaWRlbnRpdHkgPSBmYWxzZTsKKworICAgIHR5cGVkZWYgVG9UIE91dHB1dFR5cGU7CisKKyAgICBzdGF0aWMgVG9UIGNvbnZlcnQoRnJvbVQgeCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUb1Q+KHgpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IENhc3Q8VCwgVD4KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpZGVudGl0eSA9IHRydWU7CisKKyAgICB0eXBlZGVmIFQgT3V0cHV0VHlwZTsKKworICAgIHN0YXRpYyBUIGNvbnZlcnQoVCB4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KHgpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IE5vcm1hbGl6ZQoreworICAgIHN0YXRpYyBjb25zdCBib29sIGlkZW50aXR5ID0gZmFsc2U7CisKKyAgICB0eXBlZGVmIGZsb2F0IE91dHB1dFR5cGU7CisKKyAgICBzdGF0aWMgZmxvYXQgY29udmVydChUIHgpCisgICAgeworICAgICAgICB0eXBlZGVmIHN0ZDo6bnVtZXJpY19saW1pdHM8VD4gTkw7CisgICAgICAgIGZsb2F0IGYgPSBzdGF0aWNfY2FzdDxmbG9hdD4oeCk7CisKKyAgICAgICAgaWYgKE5MOjppc19zaWduZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvbnN0IGZsb2F0ID0+IFZDMjAwOCBjb21wdXRlcyBpdCBhdCBjb21waWxlIHRpbWUKKyAgICAgICAgICAgIC8vIHN0YXRpYyBjb25zdCBmbG9hdCA9PiBWQzIwMDggY29tcHV0ZXMgaXQgdGhlIGZpcnN0IHRpbWUgd2UgZ2V0IGhlcmUsIHN0b3JlcyBpdCB0byBtZW1vcnkgd2l0aCBzdGF0aWMgZ3VhcmQgYW5kIGFsbCB0aGF0LgorICAgICAgICAgICAgY29uc3QgZmxvYXQgZGl2aXNvciA9IDEuMGYvKDIqc3RhdGljX2Nhc3Q8ZmxvYXQ+KE5MOjptYXgoKSkrMSk7CisgICAgICAgICAgICByZXR1cm4gKDIqZisxKSpkaXZpc29yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGYvTkw6Om1heCgpOworICAgICAgICB9CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIEZyb21UeXBlLCBzdGQ6OnNpemVfdCBTY2FsZUJpdHM+CitzdHJ1Y3QgRml4ZWRUb0Zsb2F0Cit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaWRlbnRpdHkgPSBmYWxzZTsKKworICAgIHR5cGVkZWYgZmxvYXQgT3V0cHV0VHlwZTsKKworICAgIHN0YXRpYyBmbG9hdCBjb252ZXJ0KEZyb21UeXBlIHgpCisgICAgeworICAgICAgICBjb25zdCBmbG9hdCBkaXZpc29yID0gMS4wZiAvIHN0YXRpY19jYXN0PGZsb2F0PihzdGF0aWNfY2FzdDxGcm9tVHlwZT4oMSkgPDwgU2NhbGVCaXRzKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0Pih4KSAqIGRpdmlzb3I7CisgICAgfQorfTsKKworLy8gV2lkZW4gdHlwZXM6CisvLyBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGluaXRpYWxXaWR0aDogbnVtYmVyIG9mIGNvbXBvbmVudHMgYmVmb3JlIGNvbnZlcnNpb24KKy8vIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZmluYWxXaWR0aDogbnVtYmVyIG9mIGNvbXBvbmVudHMgYWZ0ZXIgY29udmVyc2lvbgorCisvLyBGbG9hdCBpcyBzdXBwb3J0ZWQgYXQgYW55IHNpemUuCit0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4KK3N0cnVjdCBOb1dpZGVuCit7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGluaXRpYWxXaWR0aCA9IE47CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGZpbmFsV2lkdGggPSBOOworfTsKKworLy8gU0hPUlQsIG5vcm0tU0hPUlQsIG5vcm0tVU5TSUdORURfU0hPUlQgYXJlIHN1cHBvcnRlZCBidXQgb25seSB3aXRoIDIgb3IgNCBjb21wb25lbnRzCit0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4KK3N0cnVjdCBXaWRlblRvRXZlbgoreworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBpbml0aWFsV2lkdGggPSBOOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBmaW5hbFdpZHRoID0gTisoTiYxKTsKK307CisKK3RlbXBsYXRlIDxzdGQ6OnNpemVfdCBOPgorc3RydWN0IFdpZGVuVG9Gb3VyCit7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGluaXRpYWxXaWR0aCA9IE47CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGZpbmFsV2lkdGggPSA0OworfTsKKworLy8gTW9zdCB0eXBlcyBoYXZlIDAgYW5kIDEgdGhhdCBhcmUganVzdCB0aGF0LgordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgU2ltcGxlRGVmYXVsdFZhbHVlcworeworICAgIHN0YXRpYyBUIHplcm8oKSB7IHJldHVybiBzdGF0aWNfY2FzdDxUPigwKTsgfQorICAgIHN0YXRpYyBUIG9uZSgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KDEpOyB9Cit9OworCisvLyBCdXQgbm9ybWFsaXNlZCB0eXBlcyBvbmx5IHN0b3JlIFswLDFdIG9yIFstMSwxXSBzbyAxLjAgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIG1heCB2YWx1ZS4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IE5vcm1hbGl6ZWREZWZhdWx0VmFsdWVzCit7CisgICAgc3RhdGljIFQgemVybygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KDApOyB9CisgICAgc3RhdGljIFQgb25lKCkgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7IH0KK307CisKKy8vIENvbnZlcnRlcjoKKy8vIHN0YXRpYyBjb25zdCBib29sIGlkZW50aXR5OiB0cnVlIGlmIHRoaXMgaXMgYW4gaWRlbnRpdHkgdHJhbnNmb3JtICh3aXRoIG5vIHdpZGVuaW5nKQorLy8gc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGZpbmFsU2l6ZTogbnVtYmVyIG9mIGJ5dGVzIHBlciBvdXRwdXQgdmVydGV4CisvLyBzdGF0aWMgdm9pZCBjb252ZXJ0QXJyYXkoY29uc3Qgdm9pZCAqaW4sIHN0ZDo6c2l6ZV90IHN0cmlkZSwgc3RkOjpzaXplX3Qgbiwgdm9pZCAqb3V0KTogY29udmVydCBhbiBhcnJheSBvZiB2ZXJ0aWNlcy4gSW5wdXQgbWF5IGJlIHN0cmlkZWQsIGJ1dCBvdXRwdXQgd2lsbCBiZSB1bnN0cmlkZWQuCisKK3RlbXBsYXRlIDxjbGFzcyBJblQsIGNsYXNzIFdpZGVuUnVsZSwgY2xhc3MgQ29udmVydGVyLCBjbGFzcyBEZWZhdWx0VmFsdWVSdWxlID0gU2ltcGxlRGVmYXVsdFZhbHVlczxJblQ+ID4KK3N0cnVjdCBWZXJ0ZXhEYXRhQ29udmVydGVyCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDb252ZXJ0ZXI6Ok91dHB1dFR5cGUgT3V0cHV0VHlwZTsKKyAgICB0eXBlZGVmIEluVCBJbnB1dFR5cGU7CisKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpZGVudGl0eSA9IChXaWRlblJ1bGU6OmluaXRpYWxXaWR0aCA9PSBXaWRlblJ1bGU6OmZpbmFsV2lkdGgpICYmIENvbnZlcnRlcjo6aWRlbnRpdHk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGZpbmFsU2l6ZSA9IFdpZGVuUnVsZTo6ZmluYWxXaWR0aCAqIHNpemVvZihPdXRwdXRUeXBlKTsKKworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRBcnJheShjb25zdCBJbnB1dFR5cGUgKmluLCBzdGQ6OnNpemVfdCBzdHJpZGUsIHN0ZDo6c2l6ZV90IG4sIE91dHB1dFR5cGUgKm91dCkKKyAgICB7CisgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IElucHV0VHlwZSAqZWluID0gcG9pbnRlckFkZEJ5dGVzKGluLCBpICogc3RyaWRlKTsKKworICAgICAgICAgICAgY29weUNvbXBvbmVudChvdXQsIGVpbiwgMCwgc3RhdGljX2Nhc3Q8T3V0cHV0VHlwZT4oRGVmYXVsdFZhbHVlUnVsZTo6emVybygpKSk7CisgICAgICAgICAgICBjb3B5Q29tcG9uZW50KG91dCwgZWluLCAxLCBzdGF0aWNfY2FzdDxPdXRwdXRUeXBlPihEZWZhdWx0VmFsdWVSdWxlOjp6ZXJvKCkpKTsKKyAgICAgICAgICAgIGNvcHlDb21wb25lbnQob3V0LCBlaW4sIDIsIHN0YXRpY19jYXN0PE91dHB1dFR5cGU+KERlZmF1bHRWYWx1ZVJ1bGU6Onplcm8oKSkpOworICAgICAgICAgICAgY29weUNvbXBvbmVudChvdXQsIGVpbiwgMywgc3RhdGljX2Nhc3Q8T3V0cHV0VHlwZT4oRGVmYXVsdFZhbHVlUnVsZTo6b25lKCkpKTsKKworICAgICAgICAgICAgb3V0ICs9IFdpZGVuUnVsZTo6ZmluYWxXaWR0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRBcnJheShjb25zdCB2b2lkICppbiwgc3RkOjpzaXplX3Qgc3RyaWRlLCBzdGQ6OnNpemVfdCBuLCB2b2lkICpvdXQpCisgICAgeworICAgICAgICByZXR1cm4gY29udmVydEFycmF5KHN0YXRpY19jYXN0PGNvbnN0IElucHV0VHlwZSo+KGluKSwgc3RyaWRlLCBuLCBzdGF0aWNfY2FzdDxPdXRwdXRUeXBlKj4ob3V0KSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLy8gQWR2YW5jZSB0aGUgZ2l2ZW4gcG9pbnRlciBieSBhIG51bWJlciBvZiBieXRlcyAobm90IHBvaW50ZWQtdG8gZWxlbWVudHMpLgorICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgIHN0YXRpYyBUICpwb2ludGVyQWRkQnl0ZXMoVCAqYmFzZVB0ciwgc3RkOjpzaXplX3QgbnVtQnl0ZXMpCisgICAgeworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUICo+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihiYXNlUHRyKSArIG51bUJ5dGVzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjb3B5Q29tcG9uZW50KE91dHB1dFR5cGUgKm91dCwgY29uc3QgSW5wdXRUeXBlICppbiwgc3RkOjpzaXplX3QgZWxlbWVudGluZGV4LCBPdXRwdXRUeXBlIGRlZmF1bHR2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChXaWRlblJ1bGU6OmZpbmFsV2lkdGggPiBlbGVtZW50aW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChXaWRlblJ1bGU6OmluaXRpYWxXaWR0aCA+IGVsZW1lbnRpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRbZWxlbWVudGluZGV4XSA9IENvbnZlcnRlcjo6Y29udmVydChpbltlbGVtZW50aW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRbZWxlbWVudGluZGV4XSA9IGRlZmF1bHR2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK30KKworI2VuZGlmICAgLy8gTElCR0xFU1YyX1ZFUlRFWENPTlZFUlNJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9SZWFjdG9yL01lbW9yeU1hbmFnZXIuY3BwIGIvc3JjL1JlYWN0b3IvTWVtb3J5TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhODVhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZWFjdG9yL01lbW9yeU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMTI2IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJNZW1vcnlNYW5hZ2VyLmhwcCIKKworI2luY2x1ZGUgIk51Y2xldXMuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwl1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworCU1lbW9yeU1hbmFnZXI6Ok1lbW9yeU1hbmFnZXIoKQorCXsKKwkJcm91dGluZSA9IDA7CisJfQorCisJTWVtb3J5TWFuYWdlcjo6fk1lbW9yeU1hbmFnZXIoKQorCXsKKwkJZGVsZXRlIHJvdXRpbmU7CisJfQorCisJdm9pZCBNZW1vcnlNYW5hZ2VyOjpBbGxvY2F0ZUdPVCgpCisJeworCQkvLyBGSVhNRTogQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl1bnNpZ25lZCBjaGFyICpNZW1vcnlNYW5hZ2VyOjphbGxvY2F0ZVN0dWIoY29uc3QgR2xvYmFsVmFsdWUgKmZ1bmN0aW9uLCB1bnNpZ25lZCBzdHViU2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KQorCXsKKwkJLy8gRklYTUU6IEFTU0VSVChmYWxzZSk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJdW5zaWduZWQgY2hhciAqTWVtb3J5TWFuYWdlcjo6c3RhcnRGdW5jdGlvbkJvZHkoY29uc3QgbGx2bTo6RnVuY3Rpb24gKmZ1bmN0aW9uLCB1aW50cHRyX3QgJmFjdHVhbFNpemUpCisJeworCQlpZihhY3R1YWxTaXplID09IDApCisJCXsKKwkJCWFjdHVhbFNpemUgPSA0MDk2OworCQl9CisKKwkJYWN0dWFsU2l6ZSA9IChhY3R1YWxTaXplICsgMTUpICYgLTE2OworCisJCWRlbGV0ZSByb3V0aW5lOworCQlyb3V0aW5lID0gbmV3IFJvdXRpbmUoYWN0dWFsU2l6ZSk7CisKKwkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKilyb3V0aW5lLT5nZXRCdWZmZXIoKTsKKwl9CisKKwl2b2lkIE1lbW9yeU1hbmFnZXI6OmVuZEZ1bmN0aW9uQm9keShjb25zdCBsbHZtOjpGdW5jdGlvbiAqZnVuY3Rpb24sIHVuc2lnbmVkIGNoYXIgKmZ1bmN0aW9uU3RhcnQsIHVuc2lnbmVkIGNoYXIgKmZ1bmN0aW9uRW5kKQorCXsKKwkJcm91dGluZS0+c2V0RnVuY3Rpb25TaXplKGZ1bmN0aW9uRW5kIC0gZnVuY3Rpb25TdGFydCk7CisJfQorCisJdW5zaWduZWQgY2hhciAqTWVtb3J5TWFuYWdlcjo6c3RhcnRFeGNlcHRpb25UYWJsZShjb25zdCBsbHZtOjpGdW5jdGlvbiogRiwgdWludHB0cl90ICZBY3R1YWxTaXplKQorCXsKKwkJLy8gRklYTUU6IEFTU0VSVChmYWxzZSk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJdm9pZCBNZW1vcnlNYW5hZ2VyOjplbmRFeGNlcHRpb25UYWJsZShjb25zdCBsbHZtOjpGdW5jdGlvbiAqRiwgdW5zaWduZWQgY2hhciAqVGFibGVTdGFydCwgdW5zaWduZWQgY2hhciAqVGFibGVFbmQsIHVuc2lnbmVkIGNoYXIqIEZyYW1lUmVnaXN0ZXIpIAorCXsKKwkJLy8gRklYTUU6IEFTU0VSVChmYWxzZSk7CisJfQorICAgIAorCXVuc2lnbmVkIGNoYXIgKk1lbW9yeU1hbmFnZXI6OmdldEdPVEJhc2UoKSBjb25zdAorCXsKKwkJcmV0dXJuIDA7CisJfQorCisJdW5zaWduZWQgY2hhciAqTWVtb3J5TWFuYWdlcjo6YWxsb2NhdGVTcGFjZShpbnRwdHJfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQpCisJeworCQlyZXR1cm4gMDsKKwl9CisKKwl1bnNpZ25lZCBjaGFyICpNZW1vcnlNYW5hZ2VyOjphbGxvY2F0ZUdsb2JhbCh1aW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50KQorCXsKKwkJcmV0dXJuIDA7CisJfQorCisJdm9pZCBNZW1vcnlNYW5hZ2VyOjpkZWFsbG9jYXRlRnVuY3Rpb25Cb2R5KHZvaWQgKkJvZHkpCisJeworCX0KKworCXZvaWQgTWVtb3J5TWFuYWdlcjo6ZGVhbGxvY2F0ZUV4Y2VwdGlvblRhYmxlKHZvaWQgKkVUKQorCXsKKwl9CisKKwl2b2lkIE1lbW9yeU1hbmFnZXI6OnNldE1lbW9yeVdyaXRhYmxlKCkKKwl7CisJfQorCisJdm9pZCBNZW1vcnlNYW5hZ2VyOjpzZXRNZW1vcnlFeGVjdXRhYmxlKCkKKwl7CisJfQorCisJdm9pZCBNZW1vcnlNYW5hZ2VyOjpzZXRQb2lzb25NZW1vcnkoYm9vbCBwb2lzb24pCisJeworCX0KKworCVJvdXRpbmUgKk1lbW9yeU1hbmFnZXI6OmFjcXVpcmVSb3V0aW5lKCkKKwl7CisJCVJvdXRpbmUgKnJlc3VsdCA9IHJvdXRpbmU7CisKKwkJcm91dGluZSA9IDA7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwl2b2lkIE1lbW9yeU1hbmFnZXI6OlNldERsc3ltVGFibGUodm9pZCAqcG9pbnRlcikKKwl7CisJfQorCisJdm9pZCAqTWVtb3J5TWFuYWdlcjo6Z2V0RGxzeW1UYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvUmVhY3Rvci9NZW1vcnlNYW5hZ2VyLmhwcCBiL3NyYy9SZWFjdG9yL01lbW9yeU1hbmFnZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzhmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVhY3Rvci9NZW1vcnlNYW5hZ2VyLmhwcApAQCAtMCwwICsxLDU0IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZiBzd19NZW1vcnlNYW5hZ2VyX2hwcA0KKyNkZWZpbmUgc3dfTWVtb3J5TWFuYWdlcl9ocHANCisNCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYWx1ZS5oIg0KKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRNZW1vcnlNYW5hZ2VyLmgiDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwljbGFzcyBSb3V0aW5lOw0KKw0KKwljbGFzcyBNZW1vcnlNYW5hZ2VyIDogcHVibGljIGxsdm06OkpJVE1lbW9yeU1hbmFnZXINCisJew0KKwlwdWJsaWM6DQorCQlNZW1vcnlNYW5hZ2VyKCk7DQorDQorCQl+TWVtb3J5TWFuYWdlcigpOw0KKw0KKwkJdm9pZCBBbGxvY2F0ZUdPVCgpOw0KKw0KKwkJdW5zaWduZWQgY2hhciAqYWxsb2NhdGVTdHViKGNvbnN0IGxsdm06Okdsb2JhbFZhbHVlICpmdW5jdGlvbiwgdW5zaWduZWQgc3R1YlNpemUsIHVuc2lnbmVkIGFsaWdubWVudCk7DQorCQl1bnNpZ25lZCBjaGFyICpzdGFydEZ1bmN0aW9uQm9keShjb25zdCBsbHZtOjpGdW5jdGlvbiAqZnVuY3Rpb24sIHVpbnRwdHJfdCAmYWN0dWFsU2l6ZSk7DQorCQl2b2lkIGVuZEZ1bmN0aW9uQm9keShjb25zdCBsbHZtOjpGdW5jdGlvbiAqZnVuY3Rpb24sIHVuc2lnbmVkIGNoYXIgKmZ1bmN0aW9uU3RhcnQsIHVuc2lnbmVkIGNoYXIgKmZ1bmN0aW9uRW5kKTsNCisJCXVuc2lnbmVkIGNoYXIgKnN0YXJ0RXhjZXB0aW9uVGFibGUoY29uc3QgbGx2bTo6RnVuY3Rpb24gKmZ1bmN0aW9uLCB1aW50cHRyX3QgJkFjdHVhbFNpemUpOw0KKwkJdm9pZCBlbmRFeGNlcHRpb25UYWJsZShjb25zdCBsbHZtOjpGdW5jdGlvbiAqZnVuY3Rpb24sIHVuc2lnbmVkIGNoYXIgKnRhYmxlU3RhcnQsIHVuc2lnbmVkIGNoYXIgKnRhYmxlRW5kLCB1bnNpZ25lZCBjaGFyICpmcmFtZVJlZ2lzdGVyKTsNCisJCXVuc2lnbmVkIGNoYXIgKmdldEdPVEJhc2UoKSBjb25zdDsNCisJCXVuc2lnbmVkIGNoYXIgKmFsbG9jYXRlU3BhY2UoaW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50KTsNCisJCXVuc2lnbmVkIGNoYXIgKmFsbG9jYXRlR2xvYmFsKHVpbnRwdHJfdCBTaXplLCB1bnNpZ25lZCBpbnQgQWxpZ25tZW50KTsNCisJCXZvaWQgZGVhbGxvY2F0ZUZ1bmN0aW9uQm9keSh2b2lkICpCb2R5KTsNCisJCXZvaWQgZGVhbGxvY2F0ZUV4Y2VwdGlvblRhYmxlKHZvaWQgKkVUKTsNCisJCXZvaWQgc2V0TWVtb3J5V3JpdGFibGUoKTsNCisJCXZvaWQgc2V0TWVtb3J5RXhlY3V0YWJsZSgpOw0KKwkJdm9pZCBzZXRQb2lzb25NZW1vcnkoYm9vbCBwb2lzb24pOw0KKwkJdm9pZCBTZXREbHN5bVRhYmxlKHZvaWQgKnBvaW50ZXIpOw0KKwkJdm9pZCAqZ2V0RGxzeW1UYWJsZSgpIGNvbnN0Ow0KKw0KKwkJUm91dGluZSAqYWNxdWlyZVJvdXRpbmUoKTsNCisNCisJcHJpdmF0ZToNCisJCVJvdXRpbmUgKnJvdXRpbmU7DQorCX07DQorfQ0KKw0KKyNlbmRpZiAgIC8vIHN3X01lbW9yeU1hbmFnZXJfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL1JlYWN0b3IvTnVjbGV1cy5jcHAgYi9zcmMvUmVhY3Rvci9OdWNsZXVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzc5M2ExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlYWN0b3IvTnVjbGV1cy5jcHAKQEAgLTAsMCArMSw3MDYzIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJOdWNsZXVzLmhwcCIKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzbWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAiLi4vbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvSklULmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklULmgiCisjaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgorCisjaW5jbHVkZSAiTWVtb3J5TWFuYWdlci5ocHAiCisjaW5jbHVkZSAieDg2LmhwcCIKKyNpbmNsdWRlICJDUFVJRC5ocHAiCisjaW5jbHVkZSAiVGhyZWFkLmhwcCIKKyNpbmNsdWRlICJNZW1vcnkuaHBwIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplWDg2VGFyZ2V0KCk7CitleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVYODZUYXJnZXRJbmZvKCk7CisKK2V4dGVybiAiQyIKK3sKKwlib29sICgqQ29kZUFuYWx5c3RJbml0aWFsaXplKSgpID0gMDsKKwl2b2lkICgqQ29kZUFuYWx5c3RDb21wbGV0ZUpJVExvZykoKSA9IDA7CisJYm9vbCAoKkNvZGVBbmFseXN0TG9nSklUQ29kZSkoY29uc3Qgdm9pZCAqaml0Q29kZVN0YXJ0QWRkciwgdW5zaWduZWQgaW50IGppdENvZGVTaXplLCBjb25zdCB3Y2hhcl90ICpmdW5jdGlvbk5hbWUpID0gMDsKK30KKworbmFtZXNwYWNlIGxsdm0KK3sKKwlleHRlcm4gYm9vbCBKSVRFbWl0RGVidWdJbmZvOworfQorCituYW1lc3BhY2Ugc3cKK3sKKwlPcHRpbWl6YXRpb24gb3B0aW1pemF0aW9uWzEwXSA9IHtJbnN0cnVjdGlvbkNvbWJpbmluZywgRGlzYWJsZWR9OworCisJdXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKwlNZW1vcnlNYW5hZ2VyICpOdWNsZXVzOjptZW1vcnlNYW5hZ2VyID0gMDsKKwlFeGVjdXRpb25FbmdpbmUgKk51Y2xldXM6OmV4ZWN1dGlvbkVuZ2luZSA9IDA7CisJQnVpbGRlciAqTnVjbGV1czo6YnVpbGRlciA9IDA7CisJTExWTUNvbnRleHQgKk51Y2xldXM6OmNvbnRleHQgPSAwOworCU1vZHVsZSAqTnVjbGV1czo6bW9kdWxlID0gMDsKKwlsbHZtOjpGdW5jdGlvbiAqTnVjbGV1czo6ZnVuY3Rpb24gPSAwOworCisJY2xhc3MgQnVpbGRlciA6IHB1YmxpYyBJUkJ1aWxkZXI8PgorCXsKKwl9OworCisJUm91dGluZTo6Um91dGluZShpbnQgYnVmZmVyU2l6ZSkgOiBidWZmZXJTaXplKGJ1ZmZlclNpemUpLCBkeW5hbWljKHRydWUpCisJeworCQl2b2lkICptZW1vcnkgPSBhbGxvY2F0ZUV4ZWN1dGFibGUoYnVmZmVyU2l6ZSk7CisKKwkJYnVmZmVyID0gbWVtb3J5OworCQllbnRyeSA9IG1lbW9yeTsKKwkJZnVuY3Rpb25TaXplID0gYnVmZmVyU2l6ZTsgICAvLyBVcGRhdGVkIGJ5IE1lbW9yeU1hbmFnZXI6OmVuZEZ1bmN0aW9uQm9keQorCisJCWJpbmRDb3VudCA9IDA7CisJfQorCisJUm91dGluZTo6Um91dGluZSh2b2lkICptZW1vcnksIGludCBidWZmZXJTaXplLCBpbnQgb2Zmc2V0KSA6IGJ1ZmZlclNpemUoYnVmZmVyU2l6ZSksIGZ1bmN0aW9uU2l6ZShidWZmZXJTaXplKSwgZHluYW1pYyhmYWxzZSkKKwl7CisJCWJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKiltZW1vcnkgLSBvZmZzZXQ7CisJCWVudHJ5ID0gbWVtb3J5OworCisJCWJpbmRDb3VudCA9IDA7CisJfQorCisJUm91dGluZTo6flJvdXRpbmUoKQorCXsKKwkJaWYoZHluYW1pYykKKwkJeworCQkJZGVhbGxvY2F0ZUV4ZWN1dGFibGUoYnVmZmVyLCBidWZmZXJTaXplKTsKKwkJfQorCX0KKworCXZvaWQgUm91dGluZTo6c2V0RnVuY3Rpb25TaXplKGludCBmdW5jdGlvblNpemUpCisJeworCQl0aGlzLT5mdW5jdGlvblNpemUgPSBmdW5jdGlvblNpemU7CisJfQorCisJY29uc3Qgdm9pZCAqUm91dGluZTo6Z2V0QnVmZmVyKCkKKwl7CisJCXJldHVybiBidWZmZXI7CisJfQorCisJY29uc3Qgdm9pZCAqUm91dGluZTo6Z2V0RW50cnkoKQorCXsKKwkJcmV0dXJuIGVudHJ5OworCX0KKworCWludCBSb3V0aW5lOjpnZXRCdWZmZXJTaXplKCkKKwl7CisJCXJldHVybiBidWZmZXJTaXplOworCX0KKworCWludCBSb3V0aW5lOjpnZXRGdW5jdGlvblNpemUoKQorCXsKKwkJcmV0dXJuIGZ1bmN0aW9uU2l6ZTsKKwl9CisKKwlpbnQgUm91dGluZTo6Z2V0Q29kZVNpemUoKQorCXsKKwkJcmV0dXJuIGZ1bmN0aW9uU2l6ZSAtICgodWludHB0cl90KWVudHJ5IC0gKHVpbnRwdHJfdClidWZmZXIpOworCX0KKworCWJvb2wgUm91dGluZTo6aXNEeW5hbWljKCkKKwl7CisJCXJldHVybiBkeW5hbWljOworCX0KKworCXZvaWQgUm91dGluZTo6YmluZCgpCisJeworCQlhdG9taWNJbmNyZW1lbnQoJmJpbmRDb3VudCk7CisJfQorCisJdm9pZCBSb3V0aW5lOjp1bmJpbmQoKQorCXsKKwkJbG9uZyBjb3VudCA9IGF0b21pY0RlY3JlbWVudCgmYmluZENvdW50KTsKKworCQlpZihjb3VudCA9PSAwKQorCQl7CisJCQlkZWxldGUgdGhpczsKKwkJfQorCX0KKworCU51Y2xldXM6Ok51Y2xldXMoKQorCXsKKwkJTExWTUluaXRpYWxpemVYODZUYXJnZXQoKTsKKwkJTExWTUluaXRpYWxpemVYODZUYXJnZXRJbmZvKCk7CisJCUpJVEVtaXREZWJ1Z0luZm8gPSBmYWxzZTsKKworCQlpZighY29udGV4dCkKKwkJeworCQkJY29udGV4dCA9IG5ldyBMTFZNQ29udGV4dCgpOworCQl9CisKKwkJbW9kdWxlID0gbmV3IE1vZHVsZSgiIiwgKmNvbnRleHQpOworCQltZW1vcnlNYW5hZ2VyID0gbmV3IE1lbW9yeU1hbmFnZXIoKTsKKwkJCisJCSNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisJCQljb25zdCBjaGFyICphcmNoaXRlY3R1cmUgPSAieDg2LTY0IjsKKwkJI2Vsc2UKKwkJCWNvbnN0IGNoYXIgKmFyY2hpdGVjdHVyZSA9ICJ4ODYiOworCQkjZW5kaWYKKworCQlTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgMT4gTUF0dHJzOworCQlNQXR0cnMucHVzaF9iYWNrKENQVUlEOjpzdXBwb3J0c01NWCgpICAgID8gIittbXgiICAgOiAiLW1teCIpOworCQlNQXR0cnMucHVzaF9iYWNrKENQVUlEOjpzdXBwb3J0c0NNT1YoKSAgID8gIitjbW92IiAgOiAiLWNtb3YiKTsKKwkJTUF0dHJzLnB1c2hfYmFjayhDUFVJRDo6c3VwcG9ydHNTU0UoKSAgICA/ICIrc3NlIiAgIDogIi1zc2UiKTsKKwkJTUF0dHJzLnB1c2hfYmFjayhDUFVJRDo6c3VwcG9ydHNTU0UyKCkgICA/ICIrc3NlMiIgIDogIi1zc2UyIik7CisJCU1BdHRycy5wdXNoX2JhY2soQ1BVSUQ6OnN1cHBvcnRzU1NFMygpICAgPyAiK3NzZTMiICA6ICItc3NlMyIpOworCQlNQXR0cnMucHVzaF9iYWNrKENQVUlEOjpzdXBwb3J0c1NTU0UzKCkgID8gIitzc3NlMyIgOiAiLXNzc2UzIik7CisJCU1BdHRycy5wdXNoX2JhY2soQ1BVSUQ6OnN1cHBvcnRzU1NFNF8xKCkgPyAiK3NzZTQxIiA6ICItc3NlNDEiKTsKKworCQlleGVjdXRpb25FbmdpbmUgPSBKSVQ6OmNyZWF0ZUpJVChtb2R1bGUsIDAsIG1lbW9yeU1hbmFnZXIsIENvZGVHZW5PcHQ6OkFnZ3Jlc3NpdmUsIHRydWUsIENvZGVNb2RlbDo6RGVmYXVsdCwgYXJjaGl0ZWN0dXJlLCAiIiwgTUF0dHJzKTsKKworCQlpZighYnVpbGRlcikKKwkJeworCQkJYnVpbGRlciA9IHN0YXRpY19jYXN0PEJ1aWxkZXIqPihuZXcgSVJCdWlsZGVyPD4oKmNvbnRleHQpKTsKKworCQkJSE1PRFVMRSBDb2RlQW5hbHlzdCA9IExvYWRMaWJyYXJ5KCJDQUppdE50ZnlMaWIuZGxsIik7CisJCQlpZihDb2RlQW5hbHlzdCkKKwkJCXsKKwkJCQlDb2RlQW5hbHlzdEluaXRpYWxpemUgPSAoYm9vbCgqKSgpKUdldFByb2NBZGRyZXNzKENvZGVBbmFseXN0LCAiQ0FKSVRfSW5pdGlhbGl6ZSIpOworCQkJCUNvZGVBbmFseXN0Q29tcGxldGVKSVRMb2cgPSAodm9pZCgqKSgpKUdldFByb2NBZGRyZXNzKENvZGVBbmFseXN0LCAiQ0FKSVRfQ29tcGxldGVKSVRMb2ciKTsKKwkJCQlDb2RlQW5hbHlzdExvZ0pJVENvZGUgPSAoYm9vbCgqKShjb25zdCB2b2lkKiwgdW5zaWduZWQgaW50LCBjb25zdCB3Y2hhcl90KikpR2V0UHJvY0FkZHJlc3MoQ29kZUFuYWx5c3QsICJDQUpJVF9Mb2dKSVRDb2RlIik7CisJCQkKKwkJCQlDb2RlQW5hbHlzdEluaXRpYWxpemUoKTsKKwkJCX0KKwkJfQorCX0KKworCU51Y2xldXM6On5OdWNsZXVzKCkKKwl7CisJCWRlbGV0ZSBleGVjdXRpb25FbmdpbmU7CisJCWV4ZWN1dGlvbkVuZ2luZSA9IDA7CisKKwkJbWVtb3J5TWFuYWdlciA9IDA7CisJCWZ1bmN0aW9uID0gMDsKKwkJbW9kdWxlID0gMDsKKwl9CisKKwlSb3V0aW5lICpOdWNsZXVzOjphY3F1aXJlUm91dGluZShjb25zdCB3Y2hhcl90ICpuYW1lLCBib29sIHJ1bk9wdGltaXphdGlvbnMpCisJeworCQkjaWYgIShkZWZpbmVkKF9NX0FNRDY0KSB8fCBkZWZpbmVkKF9NX1g2NCkpCisJCQl4ODY6OmVtbXMoKTsKKwkJI2VuZGlmCisKKwkJTnVjbGV1czo6Y3JlYXRlUmV0Vm9pZCgpOworCisJCWlmKGZhbHNlKQorCQl7CisJCQltb2R1bGUtPnByaW50KHJhd19mZF9vc3RyZWFtKCJsbHZtLWR1bXAtdW5vcHQudHh0Iiwgc3RkOjpzdHJpbmcoKSksIDApOworCQl9CisKKwkJaWYocnVuT3B0aW1pemF0aW9ucykKKwkJeworCQkJb3B0aW1pemUoKTsKKwkJfQorCisJCWlmKGZhbHNlKQorCQl7CisJCQltb2R1bGUtPnByaW50KHJhd19mZF9vc3RyZWFtKCJsbHZtLWR1bXAtb3B0LnR4dCIsIHN0ZDo6c3RyaW5nKCkpLCAwKTsKKwkJfQorCisJCXZvaWQgKmVudHJ5ID0gZXhlY3V0aW9uRW5naW5lLT5nZXRQb2ludGVyVG9GdW5jdGlvbihmdW5jdGlvbik7CisKKwkJUm91dGluZSAqcm91dGluZSA9IG1lbW9yeU1hbmFnZXItPmFjcXVpcmVSb3V0aW5lKCk7CisJCXJvdXRpbmUtPmVudHJ5ID0gZW50cnk7CisJCW1hcmtFeGVjdXRhYmxlKHJvdXRpbmUtPmJ1ZmZlciwgcm91dGluZS0+YnVmZmVyU2l6ZSk7CisKKwkJaWYoQ29kZUFuYWx5c3RMb2dKSVRDb2RlKQorCQl7CisJCQlDb2RlQW5hbHlzdExvZ0pJVENvZGUocm91dGluZS0+ZW50cnksIHJvdXRpbmUtPmdldENvZGVTaXplKCksIG5hbWUpOworCQl9CisKKwkJcmV0dXJuIHJvdXRpbmU7CisJfQorCisJdm9pZCBOdWNsZXVzOjpvcHRpbWl6ZSgpCisJeworCQlzdGF0aWMgUGFzc01hbmFnZXIgKnBhc3NNYW5hZ2VyID0gMDsKKwkJCisJCWlmKCFwYXNzTWFuYWdlcikKKwkJeworCQkJcGFzc01hbmFnZXIgPSBuZXcgUGFzc01hbmFnZXIoKTsKKworCQkJVW5zYWZlRlBNYXRoID0gdHJ1ZTsKKwkJLy8JTm9JbmZzRlBNYXRoID0gdHJ1ZTsKKwkJLy8JTm9OYU5zRlBNYXRoID0gdHJ1ZTsKKworCQkJcGFzc01hbmFnZXItPmFkZChuZXcgVGFyZ2V0RGF0YSgqZXhlY3V0aW9uRW5naW5lLT5nZXRUYXJnZXREYXRhKCkpKTsKKwkJCXBhc3NNYW5hZ2VyLT5hZGQoY3JlYXRlU2NhbGFyUmVwbEFnZ3JlZ2F0ZXNQYXNzKCkpOworCisJCQlmb3IoaW50IHBhc3MgPSAwOyBwYXNzIDwgMTAgJiYgb3B0aW1pemF0aW9uW3Bhc3NdICE9IERpc2FibGVkOyBwYXNzKyspCisJCQl7CisJCQkJc3dpdGNoKG9wdGltaXphdGlvbltwYXNzXSkKKwkJCQl7CisJCQkJY2FzZSBEaXNhYmxlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCWNhc2UgQ0ZHU2ltcGxpZmljYXRpb246ICAgIHBhc3NNYW5hZ2VyLT5hZGQoY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAgICBicmVhazsKKwkJCQljYXNlIExJQ006ICAgICAgICAgICAgICAgICBwYXNzTWFuYWdlci0+YWRkKGNyZWF0ZUxJQ01QYXNzKCkpOyAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJY2FzZSBBZ2dyZXNzaXZlRENFOiAgICAgICAgcGFzc01hbmFnZXItPmFkZChjcmVhdGVBZ2dyZXNzaXZlRENFUGFzcygpKTsgICAgICAgIGJyZWFrOworCQkJCWNhc2UgR1ZOOiAgICAgICAgICAgICAgICAgIHBhc3NNYW5hZ2VyLT5hZGQoY3JlYXRlR1ZOUGFzcygpKTsgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQljYXNlIEluc3RydWN0aW9uQ29tYmluaW5nOiBwYXNzTWFuYWdlci0+YWRkKGNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsgYnJlYWs7CisJCQkJY2FzZSBSZWFzc29jaWF0ZTogICAgICAgICAgcGFzc01hbmFnZXItPmFkZChjcmVhdGVSZWFzc29jaWF0ZVBhc3MoKSk7ICAgICAgICAgIGJyZWFrOworCQkJCWNhc2UgRGVhZFN0b3JlRWxpbWluYXRpb246IHBhc3NNYW5hZ2VyLT5hZGQoY3JlYXRlRGVhZFN0b3JlRWxpbWluYXRpb25QYXNzKCkpOyBicmVhazsKKwkJCQljYXNlIFNDQ1A6ICAgICAgICAgICAgICAgICBwYXNzTWFuYWdlci0+YWRkKGNyZWF0ZVNDQ1BQYXNzKCkpOyAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYXNzZXJ0KGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwYXNzTWFuYWdlci0+cnVuKCptb2R1bGUpOworCX0KKworCXZvaWQgTnVjbGV1czo6c2V0RnVuY3Rpb24obGx2bTo6RnVuY3Rpb24gKmZ1bmN0aW9uKQorCXsKKwkJTnVjbGV1czo6ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKworCQlidWlsZGVyLT5TZXRJbnNlcnRQb2ludChCYXNpY0Jsb2NrOjpDcmVhdGUoKmNvbnRleHQsIGZ1bmN0aW9uKSk7CisJfQorCisJTW9kdWxlICpOdWNsZXVzOjpnZXRNb2R1bGUoKQorCXsKKwkJcmV0dXJuIG1vZHVsZTsKKwl9CisKKwlCdWlsZGVyICpOdWNsZXVzOjpnZXRCdWlsZGVyKCkKKwl7CisJCXJldHVybiBidWlsZGVyOworCX0KKworCWxsdm06OkZ1bmN0aW9uICpOdWNsZXVzOjpnZXRGdW5jdGlvbigpCisJeworCQlyZXR1cm4gZnVuY3Rpb247CisJfQorCisJbGx2bTo6TExWTUNvbnRleHQgKk51Y2xldXM6OmdldENvbnRleHQoKQorCXsKKwkJcmV0dXJuIGNvbnRleHQ7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShjb25zdCBUeXBlICp0eXBlLCBpbnQgYXJyYXlTaXplKQorCXsKKwkJLy8gTmVlZCB0byBhbGxvY2F0ZSBpdCBpbiB0aGUgZW50cnkgYmxvY2sgZm9yIG1lbTJyZWcgdG8gd29yaworCQlsbHZtOjpGdW5jdGlvbiAqZnVuY3Rpb24gPSBnZXRGdW5jdGlvbigpOworCQlCYXNpY0Jsb2NrICZlbnRyeUJsb2NrID0gZnVuY3Rpb24tPmdldEVudHJ5QmxvY2soKTsKKworCQlJbnN0cnVjdGlvbiAqZGVjbGFyYXRpb247CisKKwkJaWYoYXJyYXlTaXplKQorCQl7CisJCQlkZWNsYXJhdGlvbiA9IG5ldyBBbGxvY2FJbnN0KHR5cGUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KGFycmF5U2l6ZSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJZGVjbGFyYXRpb24gPSBuZXcgQWxsb2NhSW5zdCh0eXBlLCAoVmFsdWUqKTApOworCQl9CisKKwkJZW50cnlCbG9jay5nZXRJbnN0TGlzdCgpLnB1c2hfZnJvbnQoZGVjbGFyYXRpb24pOworCisJCXJldHVybiBkZWNsYXJhdGlvbjsKKwl9CisKKwlCYXNpY0Jsb2NrICpOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCkKKwl7CisJCXJldHVybiBCYXNpY0Jsb2NrOjpDcmVhdGUoKmNvbnRleHQsIE51Y2xldXM6OmdldEZ1bmN0aW9uKCkpOworCX0KKworCUJhc2ljQmxvY2sgKk51Y2xldXM6OmdldEluc2VydEJsb2NrKCkKKwl7CisJCXJldHVybiBidWlsZGVyLT5HZXRJbnNlcnRCbG9jaygpOworCX0KKworCXZvaWQgTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2soQmFzaWNCbG9jayAqYmFzaWNCbG9jaykKKwl7CisJCXJldHVybiBidWlsZGVyLT5TZXRJbnNlcnRQb2ludChiYXNpY0Jsb2NrKTsKKwl9CisKKwlCYXNpY0Jsb2NrICpOdWNsZXVzOjpnZXRQcmVkZWNlc3NvcihCYXNpY0Jsb2NrICpiYXNpY0Jsb2NrKQorCXsKKwkJcmV0dXJuICpwcmVkX2JlZ2luKGJhc2ljQmxvY2spOworCX0KKworCWxsdm06OkZ1bmN0aW9uICpOdWNsZXVzOjpjcmVhdGVGdW5jdGlvbihjb25zdCBsbHZtOjpUeXBlICpSZXR1cm5UeXBlLCBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBsbHZtOjpUeXBlKj4gJlBhcmFtcykKKwl7CisJCWxsdm06OkZ1bmN0aW9uVHlwZSAqZnVuY3Rpb25UeXBlID0gbGx2bTo6RnVuY3Rpb25UeXBlOjpnZXQoUmV0dXJuVHlwZSwgUGFyYW1zLCBmYWxzZSk7CisJCWxsdm06OkZ1bmN0aW9uICpmdW5jdGlvbiA9IGxsdm06OkZ1bmN0aW9uOjpDcmVhdGUoZnVuY3Rpb25UeXBlLCBsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLCAiIiwgTnVjbGV1czo6Z2V0TW9kdWxlKCkpOworCQlmdW5jdGlvbi0+c2V0Q2FsbGluZ0NvbnYobGx2bTo6Q2FsbGluZ0NvbnY6OkMpOworCisJCXJldHVybiBmdW5jdGlvbjsKKwl9CisKKwlsbHZtOjpBcmd1bWVudCAqTnVjbGV1czo6Z2V0QXJndW1lbnQobGx2bTo6RnVuY3Rpb24gKmZ1bmN0aW9uLCB1bnNpZ25lZCBpbnQgaW5kZXgpCisJeworCQlsbHZtOjpGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGFyZ3MgPSBmdW5jdGlvbi0+YXJnX2JlZ2luKCk7CisKKwkJd2hpbGUoaW5kZXgpCisJCXsKKwkJCWFyZ3MrKzsKKwkJCWluZGV4LS07CisJCX0KKworCQlyZXR1cm4gJiphcmdzOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVSZXRWb2lkKCkKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVSZXRWb2lkKCk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZVJldChWYWx1ZSAqVikKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVSZXQoVik7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUJyKEJhc2ljQmxvY2sgKmRlc3QpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlQnIoZGVzdCk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUNvbmRCcihWYWx1ZSAqY29uZCwgQmFzaWNCbG9jayAqaWZUcnVlLCBCYXNpY0Jsb2NrICppZkZhbHNlKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUNvbmRCcihjb25kLCBpZlRydWUsIGlmRmFsc2UpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVBZGQoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVBZGQobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVTdWIoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVTdWIobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVNdWwoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVNdWwobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVVRGl2KFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlVURpdihsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZVNEaXYoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVTRGl2KGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlRkFkZChWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZBZGQobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVGU3ViKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlRlN1YihsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUZNdWwoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVGTXVsKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlRkRpdihWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZEaXYobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVVUmVtKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlVVJlbShsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZVNSZW0oVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVTUmVtKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlRlJlbShWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZSZW0obGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVTaGwoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVTaGwobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVMU2hyKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlTFNocihsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUFTaHIoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVBU2hyKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlQW5kKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlQW5kKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlT3IoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVPcihsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZVhvcihWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZVhvcihsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZU5lZyhWYWx1ZSAqVikKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVOZWcoVik7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUZOZWcoVmFsdWUgKlYpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlRk5lZyhWKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlTm90KFZhbHVlICpWKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZU5vdChWKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlTG9hZChWYWx1ZSAqcHRyLCBib29sIGlzVm9sYXRpbGUsIHVuc2lnbmVkIGludCBhbGlnbikKKwl7CisJCXJldHVybiBidWlsZGVyLT5JbnNlcnQobmV3IExvYWRJbnN0KHB0ciwgaXNWb2xhdGlsZSwgYWxpZ24pKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlU3RvcmUoVmFsdWUgKnZhbHVlLCBWYWx1ZSAqcHRyLCBib29sIGlzVm9sYXRpbGUsIHVuc2lnbmVkIGludCBhbGlnbikKKwl7CisJCXJldHVybiBidWlsZGVyLT5JbnNlcnQobmV3IFN0b3JlSW5zdCh2YWx1ZSwgcHRyLCBpc1ZvbGF0aWxlLCBhbGlnbikpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVHRVAoVmFsdWUgKnB0ciwgVmFsdWUgKmluZGV4KQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUdFUChwdHIsIGluZGV4KTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlVHJ1bmMoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKmRlc3RUeXBlKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZVRydW5jKFYsIGRlc3RUeXBlKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlWkV4dChWYWx1ZSAqViwgY29uc3QgVHlwZSAqZGVzdFR5cGUpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlWkV4dChWLCBkZXN0VHlwZSk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZVNFeHQoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKmRlc3RUeXBlKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZVNFeHQoViwgZGVzdFR5cGUpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVGUFRvVUkoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKmRlc3RUeXBlKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZQVG9VSShWLCBkZXN0VHlwZSk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUZQVG9TSShWYWx1ZSAqViwgY29uc3QgVHlwZSAqZGVzdFR5cGUpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlRlBUb1NJKFYsIGRlc3RUeXBlKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlVUlUb0ZQKFZhbHVlICpWLCBjb25zdCBUeXBlICpkZXN0VHlwZSkKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVVSVRvRlAoViwgZGVzdFR5cGUpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVTSVRvRlAoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKmRlc3RUeXBlKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZVNJVG9GUChWLCBkZXN0VHlwZSk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUZQVHJ1bmMoVmFsdWUgKlYsIGNvbnN0IFR5cGUgKmRlc3RUeXBlKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZQVHJ1bmMoViwgZGVzdFR5cGUpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVGUEV4dChWYWx1ZSAqViwgY29uc3QgVHlwZSAqZGVzdFR5cGUpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlRlBFeHQoViwgZGVzdFR5cGUpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVQdHJUb0ludChWYWx1ZSAqViwgY29uc3QgVHlwZSAqZGVzdFR5cGUpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlUHRyVG9JbnQoViwgZGVzdFR5cGUpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVJbnRUb1B0cihWYWx1ZSAqViwgY29uc3QgVHlwZSAqZGVzdFR5cGUpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlSW50VG9QdHIoViwgZGVzdFR5cGUpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KFZhbHVlICpWLCBjb25zdCBUeXBlICpkZXN0VHlwZSkKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVCaXRDYXN0KFYsIGRlc3RUeXBlKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlSW50Q2FzdChWYWx1ZSAqViwgY29uc3QgVHlwZSAqZGVzdFR5cGUsIGJvb2wgaXNTaWduZWQpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlSW50Q2FzdChWLCBkZXN0VHlwZSwgaXNTaWduZWQpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVJQ21wRVEoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVJQ21wRVEobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVJQ21wTkUoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVJQ21wTkUobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVJQ21wVUdUKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlSUNtcFVHVChsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUlDbXBVR0UoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVJQ21wVUdFKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlSUNtcFVMVChWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUlDbXBVTFQobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVJQ21wVUxFKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlSUNtcFVMRShsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUlDbXBTR1QoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVJQ21wU0dUKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlSUNtcFNHRShWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUlDbXBTR0UobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVJQ21wU0xUKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlSUNtcFNMVChsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUlDbXBTTEUoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVJQ21wU0xFKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlRkNtcE9FUShWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZDbXBPRVEobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVGQ21wT0dUKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlRkNtcE9HVChsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUZDbXBPR0UoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVGQ21wT0dFKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlRkNtcE9MVChWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZDbXBPTFQobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVGQ21wT0xFKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlRkNtcE9MRShsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUZDbXBPTkUoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVGQ21wT05FKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlRkNtcE9SRChWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZDbXBPUkQobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVGQ21wVU5PKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlRkNtcFVOTyhsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUZDbXBVRVEoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVGQ21wVUVRKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlRkNtcFVHVChWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZDbXBVR1QobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVGQ21wVUdFKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlRkNtcFVHRShsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUZDbXBVTFQoVmFsdWUgKmxocywgVmFsdWUgKnJocykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVGQ21wVUxUKGxocywgcmhzKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlRkNtcFVMRShWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUZDbXBVTEUobGhzLCByaHMpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVGQ21wVU5FKFZhbHVlICpsaHMsIFZhbHVlICpyaHMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlRkNtcFVMRShsaHMsIHJocyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUNhbGwoVmFsdWUgKmNhbGxlZSkKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVDYWxsKGNhbGxlZSk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUNhbGwoVmFsdWUgKmNhbGxlZSwgVmFsdWUgKmFyZykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVDYWxsKGNhbGxlZSwgYXJnKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlQ2FsbChWYWx1ZSAqY2FsbGVlLCBWYWx1ZSAqYXJnMSwgVmFsdWUgKmFyZzIpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlQ2FsbDIoY2FsbGVlLCBhcmcxLCBhcmcyKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlQ2FsbChWYWx1ZSAqY2FsbGVlLCBWYWx1ZSAqYXJnMSwgVmFsdWUgKmFyZzIsIFZhbHVlICphcmczKQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUNhbGwzKGNhbGxlZSwgYXJnMSwgYXJnMiwgYXJnMyk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZUNhbGwoVmFsdWUgKmNhbGxlZSwgVmFsdWUgKmFyZzEsIFZhbHVlICphcmcyLCBWYWx1ZSAqYXJnMywgVmFsdWUgKmFyZzQpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlQ2FsbDQoY2FsbGVlLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQoVmFsdWUgKnZlY3RvciwgaW50IGluZGV4KQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUV4dHJhY3RFbGVtZW50KHZlY3RvciwgY3JlYXRlQ29uc3RhbnRJbnQoaW5kZXgpKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudChWYWx1ZSAqdmVjdG9yLCBWYWx1ZSAqZWxlbWVudCwgaW50IGluZGV4KQorCXsKKwkJcmV0dXJuIGJ1aWxkZXItPkNyZWF0ZUluc2VydEVsZW1lbnQodmVjdG9yLCBlbGVtZW50LCBjcmVhdGVDb25zdGFudEludChpbmRleCkpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKFZhbHVlICpWMSwgVmFsdWUgKlYyLCBWYWx1ZSAqbWFzaykKKwl7CisJCXJldHVybiBidWlsZGVyLT5DcmVhdGVTaHVmZmxlVmVjdG9yKFYxLCBWMiwgbWFzayk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZVNlbGVjdChWYWx1ZSAqQywgVmFsdWUgKmlmVHJ1ZSwgVmFsdWUgKmlmRmFsc2UpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlU2VsZWN0KEMsIGlmVHJ1ZSwgaWZGYWxzZSk7CisJfQorCisJVmFsdWUgKk51Y2xldXM6OmNyZWF0ZVN3aXRjaChsbHZtOjpWYWx1ZSAqViwgbGx2bTo6QmFzaWNCbG9jayAqRGVzdCwgdW5zaWduZWQgTnVtQ2FzZXMpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlU3dpdGNoKFYsIERlc3QsIE51bUNhc2VzKTsKKwl9CisKKwl2b2lkIE51Y2xldXM6OmFkZFN3aXRjaENhc2UobGx2bTo6VmFsdWUgKlN3aXRjaCwgaW50IENhc2UsIGxsdm06OkJhc2ljQmxvY2sgKkJyYW5jaCkKKwl7CisJCXN0YXRpY19jYXN0PFN3aXRjaEluc3QqPihTd2l0Y2gpLT5hZGRDYXNlKE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KENhc2UpLCBCcmFuY2gpOworCX0KKworCVZhbHVlICpOdWNsZXVzOjpjcmVhdGVVbnJlYWNoYWJsZSgpCisJeworCQlyZXR1cm4gYnVpbGRlci0+Q3JlYXRlVW5yZWFjaGFibGUoKTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlU3dpenpsZShWYWx1ZSAqdmFsLCB1bnNpZ25lZCBjaGFyIHNlbGVjdCkKKwl7CisJCUNvbnN0YW50ICpzd2l6emxlWzRdOworCQlzd2l6emxlWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoKHNlbGVjdCA+PiAwKSAmIDB4MDMpOworCQlzd2l6emxlWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoKHNlbGVjdCA+PiAyKSAmIDB4MDMpOworCQlzd2l6emxlWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoKHNlbGVjdCA+PiA0KSAmIDB4MDMpOworCQlzd2l6emxlWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoKHNlbGVjdCA+PiA2KSAmIDB4MDMpOworCisJCVZhbHVlICpzaHVmZmxlID0gTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3Rvcih2YWwsIFVuZGVmVmFsdWU6OmdldCh2YWwtPmdldFR5cGUoKSksIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHN3aXp6bGUsIDQpKTsKKworCQlyZXR1cm4gc2h1ZmZsZTsKKwl9CisKKwlWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlTWFzayhWYWx1ZSAqbGhzLCBWYWx1ZSAqcmhzLCB1bnNpZ25lZCBjaGFyIHNlbGVjdCkKKwl7CisJCWJvb2wgbWFza1s0XSA9IHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX07CisKKwkJbWFza1soc2VsZWN0ID4+IDApICYgMHgwM10gPSB0cnVlOworCQltYXNrWyhzZWxlY3QgPj4gMikgJiAweDAzXSA9IHRydWU7CisJCW1hc2tbKHNlbGVjdCA+PiA0KSAmIDB4MDNdID0gdHJ1ZTsKKwkJbWFza1soc2VsZWN0ID4+IDYpICYgMHgwM10gPSB0cnVlOworCisJCUNvbnN0YW50ICpzd2l6emxlWzRdOworCQlzd2l6emxlWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQobWFza1swXSA/IDQgOiAwKTsKKwkJc3dpenpsZVsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KG1hc2tbMV0gPyA1IDogMSk7CisJCXN3aXp6bGVbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChtYXNrWzJdID8gNiA6IDIpOworCQlzd2l6emxlWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQobWFza1szXSA/IDcgOiAzKTsKKworCQlWYWx1ZSAqc2h1ZmZsZSA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3IobGhzLCByaHMsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHN3aXp6bGUsIDQpKTsKKworCQlyZXR1cm4gc2h1ZmZsZTsKKwl9CisKKwljb25zdCBsbHZtOjpHbG9iYWxWYWx1ZSAqTnVjbGV1czo6Z2V0R2xvYmFsVmFsdWVBdEFkZHJlc3Modm9pZCAqQWRkcikKKwl7CisJCXJldHVybiBleGVjdXRpb25FbmdpbmUtPmdldEdsb2JhbFZhbHVlQXRBZGRyZXNzKEFkZHIpOworCX0KKworCXZvaWQgTnVjbGV1czo6YWRkR2xvYmFsTWFwcGluZyhjb25zdCBsbHZtOjpHbG9iYWxWYWx1ZSAqR1YsIHZvaWQgKkFkZHIpCisJeworCQlleGVjdXRpb25FbmdpbmUtPmFkZEdsb2JhbE1hcHBpbmcoR1YsIEFkZHIpOworCX0KKworCWxsdm06Okdsb2JhbFZhbHVlICpOdWNsZXVzOjpjcmVhdGVHbG9iYWxWYWx1ZShjb25zdCBsbHZtOjpUeXBlICpUeSwgYm9vbCBpc0NvbnN0YW50LCB1bnNpZ25lZCBpbnQgQWxpZ24pCisJeworCQlsbHZtOjpHbG9iYWxWYWx1ZSAqZ2xvYmFsID0gbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKFR5LCBpc0NvbnN0YW50LCBsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLCAwLCAiIiwgZmFsc2UpOworCQlnbG9iYWwtPnNldEFsaWdubWVudChBbGlnbik7CisKKwkJcmV0dXJuIGdsb2JhbDsKKwl9CisKKwlsbHZtOjpUeXBlICpOdWNsZXVzOjpnZXRQb2ludGVyVHlwZShjb25zdCBsbHZtOjpUeXBlICpFbGVtZW50VHlwZSkKKwl7CisJCXJldHVybiBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0KEVsZW1lbnRUeXBlLCAwKTsKKwl9CisKKwlsbHZtOjpDb25zdGFudCAqTnVjbGV1czo6Y3JlYXRlTnVsbFZhbHVlKGNvbnN0IGxsdm06OlR5cGUgKlR5KQorCXsKKwkJcmV0dXJuIGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpOworCX0KKworCWxsdm06OkNvbnN0YW50SW50ICpOdWNsZXVzOjpjcmVhdGVDb25zdGFudExvbmcoaW50NjRfdCBpKQorCXsKKwkJcmV0dXJuIGxsdm06OkNvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeSgqY29udGV4dCksIGksIHRydWUpOworCX0KKworCWxsdm06OkNvbnN0YW50SW50ICpOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChpbnQgaSkKKwl7CisJCXJldHVybiBsbHZtOjpDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKmNvbnRleHQpLCBpLCB0cnVlKTsKKwl9CisKKwlsbHZtOjpDb25zdGFudEludCAqTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQodW5zaWduZWQgaW50IGkpCisJeworCQlyZXR1cm4gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KCpjb250ZXh0KSwgaSwgZmFsc2UpOworCX0KKworCWxsdm06OkNvbnN0YW50SW50ICpOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJvb2woYm9vbCBiKQorCXsKKwkJcmV0dXJuIGxsdm06OkNvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KCpjb250ZXh0KSwgYik7CisJfQorCisJbGx2bTo6Q29uc3RhbnRJbnQgKk51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZShzaWduZWQgY2hhciBpKQorCXsKKwkJcmV0dXJuIGxsdm06OkNvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50OFR5KCpjb250ZXh0KSwgaSwgdHJ1ZSk7CisJfQorCisJbGx2bTo6Q29uc3RhbnRJbnQgKk51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSh1bnNpZ25lZCBjaGFyIGkpCisJeworCQlyZXR1cm4gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ4VHkoKmNvbnRleHQpLCBpLCBmYWxzZSk7CisJfQorCisJbGx2bTo6Q29uc3RhbnRJbnQgKk51Y2xldXM6OmNyZWF0ZUNvbnN0YW50U2hvcnQoc2hvcnQgaSkKKwl7CisJCXJldHVybiBsbHZtOjpDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoKmNvbnRleHQpLCBpLCB0cnVlKTsKKwl9CisKKwlsbHZtOjpDb25zdGFudEludCAqTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydCh1bnNpZ25lZCBzaG9ydCBpKQorCXsKKwkJcmV0dXJuIGxsdm06OkNvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MTZUeSgqY29udGV4dCksIGksIGZhbHNlKTsKKwl9CisKKwlsbHZtOjpDb25zdGFudCAqTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRGbG9hdChmbG9hdCB4KQorCXsKKwkJcmV0dXJuIENvbnN0YW50RlA6OmdldChGbG9hdDo6Z2V0VHlwZSgpLCB4KTsKKwl9CisKKwlsbHZtOjpWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlTnVsbFBvaW50ZXIoY29uc3QgbGx2bTo6VHlwZSAqVHkpCisJeworCQlyZXR1cm4gbGx2bTo6Q29uc3RhbnRQb2ludGVyTnVsbDo6Z2V0KGxsdm06OlBvaW50ZXJUeXBlOjpnZXQoVHksIDApKTsKKwl9CisKKwlsbHZtOjpWYWx1ZSAqTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3IoQ29uc3RhbnQqIGNvbnN0KiBWYWxzLCB1bnNpZ25lZCBOdW1WYWxzKQorCXsKKwkJcmV0dXJuIGxsdm06OkNvbnN0YW50VmVjdG9yOjpnZXQoVmFscywgTnVtVmFscyk7CisJfQorCisJY29uc3QgVHlwZSAqVm9pZDo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVHlwZTo6Z2V0Vm9pZFR5KCpOdWNsZXVzOjpnZXRDb250ZXh0KCkpOworCX0KKworCUJvb2w6OkJvb2woQXJndW1lbnQgKmFyZ3VtZW50KQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGFyZ3VtZW50LCBhZGRyZXNzKTsKKwl9CisKKwlCb29sOjpCb29sKCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKwl9CisKKwlCb29sOjpCb29sKGJvb2wgeCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJvb2woeCksIGFkZHJlc3MpOworCX0KKworCUJvb2w6OkJvb2woY29uc3QgUlZhbHVlPEJvb2w+ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlCb29sOjpCb29sKGNvbnN0IEJvb2wgJnJocykKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxCb29sPiBCb29sOjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEJvb2w+ICZyaHMpIGNvbnN0CisJeworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiByaHM7CisJfQorCisJUlZhbHVlPEJvb2w+IEJvb2w6Om9wZXJhdG9yPShjb25zdCBCb29sICZyaHMpIGNvbnN0CisJeworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiBSVmFsdWU8Qm9vbD4odmFsdWUpOworCX0KKworCVJWYWx1ZTxQb2ludGVyPEJvb2w+PiBCb29sOjpvcGVyYXRvciYoKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxQb2ludGVyPEJvb2w+PihhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhKGNvbnN0IFJWYWx1ZTxCb29sPiAmdmFsKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVOb3QodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yJiYoY29uc3QgUlZhbHVlPEJvb2w+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCb29sPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVBbmQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3J8fChjb25zdCBSVmFsdWU8Qm9vbD4gJmxocywgY29uc3QgUlZhbHVlPEJvb2w+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZU9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJQm9vbCAqQm9vbDo6Z2V0VGhpcygpCisJeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwljb25zdCBUeXBlICpCb29sOjpnZXRUeXBlKCkKKwl7CisJCXJldHVybiBUeXBlOjpnZXRJbnQxVHkoKk51Y2xldXM6OmdldENvbnRleHQoKSk7CisJfQorCisJQnl0ZTo6Qnl0ZShBcmd1bWVudCAqYXJndW1lbnQpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoYXJndW1lbnQsIGFkZHJlc3MpOworCX0KKworCUJ5dGU6OkJ5dGUoY29uc3QgUlZhbHVlPEludD4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmludGVnZXIgPSBOdWNsZXVzOjpjcmVhdGVUcnVuYyhjYXN0LnZhbHVlLCBCeXRlOjpnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGludGVnZXIsIGFkZHJlc3MpOworCX0KKworCUJ5dGU6OkJ5dGUoKQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCX0KKworCUJ5dGU6OkJ5dGUoaW50IHgpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKCh1bnNpZ25lZCBjaGFyKXgpLCBhZGRyZXNzKTsKKwl9CisKKwlCeXRlOjpCeXRlKHVuc2lnbmVkIGNoYXIgeCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoeCksIGFkZHJlc3MpOworCX0KKworCUJ5dGU6OkJ5dGUoY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlCeXRlOjpCeXRlKGNvbnN0IEJ5dGUgJnJocykKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxCeXRlPiBCeXRlOjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpIGNvbnN0CisJeworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiByaHM7CisJfQorCisJUlZhbHVlPEJ5dGU+IEJ5dGU6Om9wZXJhdG9yPShjb25zdCBCeXRlICZyaHMpIGNvbnN0CisJeworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiBSVmFsdWU8Qnl0ZT4odmFsdWUpOworCX0KKworCVJWYWx1ZTxQb2ludGVyPEJ5dGU+PiBCeXRlOjpvcGVyYXRvciYoKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxQb2ludGVyPEJ5dGU+PihhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8Qnl0ZT4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qnl0ZT4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJ5dGU+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJ5dGU+KE51Y2xldXM6OmNyZWF0ZVN1YihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvciooY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlPihOdWNsZXVzOjpjcmVhdGVNdWwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qnl0ZT4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qnl0ZT4oTnVjbGV1czo6Y3JlYXRlVURpdihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlPihOdWNsZXVzOjpjcmVhdGVVUmVtKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJ5dGU+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJ5dGU+KE51Y2xldXM6OmNyZWF0ZUFuZChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlPihOdWNsZXVzOjpjcmVhdGVPcihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlPihOdWNsZXVzOjpjcmVhdGVYb3IobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qnl0ZT4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJ5dGU+KE51Y2xldXM6OmNyZWF0ZVNobChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qnl0ZT4oTnVjbGV1czo6Y3JlYXRlTFNocihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcis9KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICsgcmhzOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvci09KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIC0gcmhzOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcio9KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICogcmhzOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvci89KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIC8gcmhzOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvciU9KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICUgcmhzOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvciY9KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICYgcmhzOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcnw9KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIHwgcmhzOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcl49KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIF4gcmhzOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcjw8PShjb25zdCBCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA8PCByaHM7CisJfQorCisJUlZhbHVlPEJ5dGU+IG9wZXJhdG9yPj49KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzID4+IHJoczsKKwl9CisKKwlSVmFsdWU8Qnl0ZT4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxCeXRlPiAmdmFsKQorCXsKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwlSVmFsdWU8Qnl0ZT4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxCeXRlPiAmdmFsKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlPihOdWNsZXVzOjpjcmVhdGVOZWcodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJ5dGU+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8Qnl0ZT4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8Qnl0ZT4oTnVjbGV1czo6Y3JlYXRlTm90KHZhbC52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcisrKGNvbnN0IEJ5dGUgJnZhbCwgaW50KSAgIC8vIFBvc3QtaW5jcmVtZW50CisJeworCQlSVmFsdWU8Qnl0ZT4gcmVzID0gdmFsOworCisJCVZhbHVlICppbmMgPSBOdWNsZXVzOjpjcmVhdGVBZGQocmVzLnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoKHVuc2lnbmVkIGNoYXIpMSkpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbmMsIHZhbC5hZGRyZXNzKTsKKworCQlyZXR1cm4gcmVzOworCX0KKworCWNvbnN0IEJ5dGUgJm9wZXJhdG9yKysoY29uc3QgQnl0ZSAmdmFsKSAgIC8vIFByZS1pbmNyZW1lbnQKKwl7CisJCVZhbHVlICppbmMgPSBOdWNsZXVzOjpjcmVhdGVBZGQoTnVjbGV1czo6Y3JlYXRlTG9hZCh2YWwuYWRkcmVzcyksIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPEJ5dGU+IG9wZXJhdG9yLS0oY29uc3QgQnl0ZSAmdmFsLCBpbnQpICAgLy8gUG9zdC1kZWNyZW1lbnQKKwl7CisJCVJWYWx1ZTxCeXRlPiByZXMgPSB2YWw7CisKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZVN1YihyZXMudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiByZXM7CisJfQorCisJY29uc3QgQnl0ZSAmb3BlcmF0b3ItLShjb25zdCBCeXRlICZ2YWwpICAgLy8gUHJlLWRlY3JlbWVudAorCXsKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZVN1YihOdWNsZXVzOjpjcmVhdGVMb2FkKHZhbC5hZGRyZXNzKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKCh1bnNpZ25lZCBjaGFyKTEpKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW5jLCB2YWwuYWRkcmVzcyk7CisKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8KGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFVMVChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcjw9KGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFVMRShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj4oY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wVUdUKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPj0oY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wVUdFKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yIT0oY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wTkUobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I9PShjb25zdCBSVmFsdWU8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUlDbXBFUShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCUJ5dGUgKkJ5dGU6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqQnl0ZTo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVHlwZTo6Z2V0SW50OFR5KCpOdWNsZXVzOjpnZXRDb250ZXh0KCkpOworCX0KKworCVNCeXRlOjpTQnl0ZShBcmd1bWVudCAqYXJndW1lbnQpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoYXJndW1lbnQsIGFkZHJlc3MpOworCX0KKworCVNCeXRlOjpTQnl0ZSgpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisJfQorCisJU0J5dGU6OlNCeXRlKHNpZ25lZCBjaGFyIHgpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKHgpLCBhZGRyZXNzKTsKKwl9CisKKwlTQnl0ZTo6U0J5dGUoY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJU0J5dGU6OlNCeXRlKGNvbnN0IFNCeXRlICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8U0J5dGU+IFNCeXRlOjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gU0J5dGU6Om9wZXJhdG9yPShjb25zdCBTQnl0ZSAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPFNCeXRlPih2YWx1ZSk7CisJfQorCisJUlZhbHVlPFBvaW50ZXI8U0J5dGU+PiBTQnl0ZTo6b3BlcmF0b3ImKCkKKwl7CisJCXJldHVybiBSVmFsdWU8UG9pbnRlcjxTQnl0ZT4+KGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZT4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNCeXRlPiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFNCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNCeXRlPihOdWNsZXVzOjpjcmVhdGVTdWIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U0J5dGU+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8U0J5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8U0J5dGU+KE51Y2xldXM6OmNyZWF0ZU11bChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZT4oTnVjbGV1czo6Y3JlYXRlU0RpdihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZT4oTnVjbGV1czo6Y3JlYXRlU1JlbShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZT4oTnVjbGV1czo6Y3JlYXRlQW5kKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNCeXRlPiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPFNCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNCeXRlPihOdWNsZXVzOjpjcmVhdGVPcihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZT4oTnVjbGV1czo6Y3JlYXRlWG9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNCeXRlPiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZT4oTnVjbGV1czo6Y3JlYXRlU2hsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNCeXRlPiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZT4oTnVjbGV1czo6Y3JlYXRlQVNocihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3IrPShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICsgcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3ItPShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIC0gcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3IqPShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICogcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3IvPShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIC8gcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3IlPShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICUgcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3ImPShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICYgcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3J8PShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIHwgcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3JePShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIF4gcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3I8PD0oY29uc3QgU0J5dGUgJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA8PCByaHM7CisJfQorCisJUlZhbHVlPFNCeXRlPiBvcGVyYXRvcj4+PShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzID4+IHJoczsKKwl9CisKKwlSVmFsdWU8U0J5dGU+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8U0J5dGU+ICZ2YWwpCisJeworCQlyZXR1cm4gdmFsOworCX0KKworCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8U0J5dGU+KE51Y2xldXM6OmNyZWF0ZU5lZyh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U0J5dGU+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8U0J5dGU+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPFNCeXRlPihOdWNsZXVzOjpjcmVhdGVOb3QodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNCeXRlPiBvcGVyYXRvcisrKGNvbnN0IFNCeXRlICZ2YWwsIGludCkgICAvLyBQb3N0LWluY3JlbWVudAorCXsKKwkJUlZhbHVlPFNCeXRlPiByZXMgPSB2YWw7CisKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZUFkZChyZXMudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgoc2lnbmVkIGNoYXIpMSkpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbmMsIHZhbC5hZGRyZXNzKTsKKworCQlyZXR1cm4gcmVzOworCX0KKworCWNvbnN0IFNCeXRlICZvcGVyYXRvcisrKGNvbnN0IFNCeXRlICZ2YWwpICAgLy8gUHJlLWluY3JlbWVudAorCXsKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZUFkZChOdWNsZXVzOjpjcmVhdGVMb2FkKHZhbC5hZGRyZXNzKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKChzaWduZWQgY2hhcikxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPFNCeXRlPiBvcGVyYXRvci0tKGNvbnN0IFNCeXRlICZ2YWwsIGludCkgICAvLyBQb3N0LWRlY3JlbWVudAorCXsKKwkJUlZhbHVlPFNCeXRlPiByZXMgPSB2YWw7CisKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZVN1YihyZXMudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgoc2lnbmVkIGNoYXIpMSkpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbmMsIHZhbC5hZGRyZXNzKTsKKworCQlyZXR1cm4gcmVzOworCX0KKworCWNvbnN0IFNCeXRlICZvcGVyYXRvci0tKGNvbnN0IFNCeXRlICZ2YWwpICAgLy8gUHJlLWRlY3JlbWVudAorCXsKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZVN1YihOdWNsZXVzOjpjcmVhdGVMb2FkKHZhbC5hZGRyZXNzKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKChzaWduZWQgY2hhcikxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8U0J5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFNMVChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcjw9KGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wU0xFKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPihjb25zdCBSVmFsdWU8U0J5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFNHVChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wU0dFKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yIT0oY29uc3QgUlZhbHVlPFNCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUlDbXBORShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wRVEobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlTQnl0ZSAqU0J5dGU6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqU0J5dGU6OmdldFR5cGUoKQorCXsKKwkJcmV0dXJuIFR5cGU6OmdldEludDhUeSgqTnVjbGV1czo6Z2V0Q29udGV4dCgpKTsKKwl9CisKKwlTaG9ydDo6U2hvcnQoQXJndW1lbnQgKmFyZ3VtZW50KQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGFyZ3VtZW50LCBhZGRyZXNzKTsKKwl9CisKKwlTaG9ydDo6U2hvcnQoY29uc3QgUlZhbHVlPEludD4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmludGVnZXIgPSBOdWNsZXVzOjpjcmVhdGVUcnVuYyhjYXN0LnZhbHVlLCBTaG9ydDo6Z2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbnRlZ2VyLCBhZGRyZXNzKTsKKwl9CisKKwlTaG9ydDo6U2hvcnQoKQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCX0KKworCVNob3J0OjpTaG9ydChzaG9ydCB4KQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50U2hvcnQoeCksIGFkZHJlc3MpOworCX0KKworCVNob3J0OjpTaG9ydChjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlTaG9ydDo6U2hvcnQoY29uc3QgU2hvcnQgJnJocykKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxTaG9ydD4gU2hvcnQ6Om9wZXJhdG9yPShjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpIGNvbnN0CisJeworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiByaHM7CisJfQorCisJUlZhbHVlPFNob3J0PiBTaG9ydDo6b3BlcmF0b3I9KGNvbnN0IFNob3J0ICZyaHMpIGNvbnN0CisJeworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiBSVmFsdWU8U2hvcnQ+KHZhbHVlKTsKKwl9CisKKwlSVmFsdWU8UG9pbnRlcjxTaG9ydD4+IFNob3J0OjpvcGVyYXRvciYoKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxQb2ludGVyPFNob3J0Pj4oYWRkcmVzcyk7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0PihOdWNsZXVzOjpjcmVhdGVBZGQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8U2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8U2hvcnQ+KE51Y2xldXM6OmNyZWF0ZVN1YihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTaG9ydD4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydD4oTnVjbGV1czo6Y3JlYXRlTXVsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0PihOdWNsZXVzOjpjcmVhdGVTRGl2KGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0PihOdWNsZXVzOjpjcmVhdGVTUmVtKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0PihOdWNsZXVzOjpjcmVhdGVBbmQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8U2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8U2hvcnQ+KE51Y2xldXM6OmNyZWF0ZU9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0PihOdWNsZXVzOjpjcmVhdGVYb3IobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0PihOdWNsZXVzOjpjcmVhdGVTaGwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0PihOdWNsZXVzOjpjcmVhdGVBU2hyKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvcis9KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKyByaHM7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvci09KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLSByaHM7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvcio9KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKiByaHM7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvci89KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLyByaHM7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvciU9KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJSByaHM7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvciY9KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJiByaHM7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvcnw9KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgfCByaHM7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvcl49KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgXiByaHM7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvcjw8PShjb25zdCBTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIDw8IHJoczsKKwl9CisKKwlSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yPj49KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPj4gcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnZhbCkKKwl7CisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPFNob3J0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFNob3J0PiAmdmFsKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydD4oTnVjbGV1czo6Y3JlYXRlTmVnKHZhbC52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTaG9ydD4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8U2hvcnQ+KE51Y2xldXM6OmNyZWF0ZU5vdCh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yKysoY29uc3QgU2hvcnQgJnZhbCwgaW50KSAgIC8vIFBvc3QtaW5jcmVtZW50CisJeworCQlSVmFsdWU8U2hvcnQ+IHJlcyA9IHZhbDsKKworCQlWYWx1ZSAqaW5jID0gTnVjbGV1czo6Y3JlYXRlQWRkKHJlcy52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydCgoc2hvcnQpMSkpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbmMsIHZhbC5hZGRyZXNzKTsKKworCQlyZXR1cm4gcmVzOworCX0KKworCWNvbnN0IFNob3J0ICZvcGVyYXRvcisrKGNvbnN0IFNob3J0ICZ2YWwpICAgLy8gUHJlLWluY3JlbWVudAorCXsKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZUFkZChOdWNsZXVzOjpjcmVhdGVMb2FkKHZhbC5hZGRyZXNzKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydCgoc2hvcnQpMSkpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbmMsIHZhbC5hZGRyZXNzKTsKKworCQlyZXR1cm4gdmFsOworCX0KKworCVJWYWx1ZTxTaG9ydD4gb3BlcmF0b3ItLShjb25zdCBTaG9ydCAmdmFsLCBpbnQpICAgLy8gUG9zdC1kZWNyZW1lbnQKKwl7CisJCVJWYWx1ZTxTaG9ydD4gcmVzID0gdmFsOworCisJCVZhbHVlICppbmMgPSBOdWNsZXVzOjpjcmVhdGVTdWIocmVzLnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KChzaG9ydCkxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiByZXM7CisJfQorCisJY29uc3QgU2hvcnQgJm9wZXJhdG9yLS0oY29uc3QgU2hvcnQgJnZhbCkgICAvLyBQcmUtZGVjcmVtZW50CisJeworCQlWYWx1ZSAqaW5jID0gTnVjbGV1czo6Y3JlYXRlU3ViKE51Y2xldXM6OmNyZWF0ZUxvYWQodmFsLmFkZHJlc3MpLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KChzaG9ydCkxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8U2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFNMVChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcjw9KGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wU0xFKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPihjb25zdCBSVmFsdWU8U2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFNHVChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wU0dFKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yIT0oY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUlDbXBORShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wRVEobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlTaG9ydCAqU2hvcnQ6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqU2hvcnQ6OmdldFR5cGUoKQorCXsKKwkJcmV0dXJuIFR5cGU6OmdldEludDE2VHkoKk51Y2xldXM6OmdldENvbnRleHQoKSk7CisJfQorCisJVVNob3J0OjpVU2hvcnQoQXJndW1lbnQgKmFyZ3VtZW50KQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGFyZ3VtZW50LCBhZGRyZXNzKTsKKwl9CisKKwlVU2hvcnQ6OlVTaG9ydCgpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisJfQorCisJVVNob3J0OjpVU2hvcnQodW5zaWduZWQgc2hvcnQgeCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KHgpLCBhZGRyZXNzKTsKKwl9CisKKwlVU2hvcnQ6OlVTaG9ydChjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJVVNob3J0OjpVU2hvcnQoY29uc3QgVVNob3J0ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0PiBVU2hvcnQ6Om9wZXJhdG9yPShjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxVU2hvcnQ+IFVTaG9ydDo6b3BlcmF0b3I9KGNvbnN0IFVTaG9ydCAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydD4odmFsdWUpOworCX0KKworCVJWYWx1ZTxQb2ludGVyPFVTaG9ydD4+IFVTaG9ydDo6b3BlcmF0b3ImKCkKKwl7CisJCXJldHVybiBSVmFsdWU8UG9pbnRlcjxVU2hvcnQ+PihhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VVNob3J0PihOdWNsZXVzOjpjcmVhdGVBZGQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VVNob3J0PihOdWNsZXVzOjpjcmVhdGVTdWIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0PiBvcGVyYXRvciooY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VVNob3J0PihOdWNsZXVzOjpjcmVhdGVNdWwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0PiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VVNob3J0PihOdWNsZXVzOjpjcmVhdGVVRGl2KGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydD4oTnVjbGV1czo6Y3JlYXRlVVJlbShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVU2hvcnQ+KE51Y2xldXM6OmNyZWF0ZUFuZChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVU2hvcnQ+KE51Y2xldXM6OmNyZWF0ZU9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydD4oTnVjbGV1czo6Y3JlYXRlWG9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVU2hvcnQ+KE51Y2xldXM6OmNyZWF0ZVNobChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VVNob3J0PihOdWNsZXVzOjpjcmVhdGVMU2hyKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3IrPShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKyByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3ItPShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLSByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3IqPShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKiByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3IvPShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLyByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3IlPShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJSByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3ImPShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJiByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3J8PShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgfCByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3JePShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgXiByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3I8PD0oY29uc3QgVVNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIDw8IHJoczsKKwl9CisKKwlSVmFsdWU8VVNob3J0PiBvcGVyYXRvcj4+PShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPj4gcmhzOworCX0KKworCVJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8VVNob3J0PiAmdmFsKQorCXsKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwlSVmFsdWU8VVNob3J0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVTaG9ydD4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8VVNob3J0PihOdWNsZXVzOjpjcmVhdGVOZWcodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydD4oTnVjbGV1czo6Y3JlYXRlTm90KHZhbC52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yKysoY29uc3QgVVNob3J0ICZ2YWwsIGludCkgICAvLyBQb3N0LWluY3JlbWVudAorCXsKKwkJUlZhbHVlPFVTaG9ydD4gcmVzID0gdmFsOworCisJCVZhbHVlICppbmMgPSBOdWNsZXVzOjpjcmVhdGVBZGQocmVzLnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KCh1bnNpZ25lZCBzaG9ydCkxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiByZXM7CisJfQorCisJY29uc3QgVVNob3J0ICZvcGVyYXRvcisrKGNvbnN0IFVTaG9ydCAmdmFsKSAgIC8vIFByZS1pbmNyZW1lbnQKKwl7CisJCVZhbHVlICppbmMgPSBOdWNsZXVzOjpjcmVhdGVBZGQoTnVjbGV1czo6Y3JlYXRlTG9hZCh2YWwuYWRkcmVzcyksIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50U2hvcnQoKHVuc2lnbmVkIHNob3J0KTEpKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW5jLCB2YWwuYWRkcmVzcyk7CisKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwlSVmFsdWU8VVNob3J0PiBvcGVyYXRvci0tKGNvbnN0IFVTaG9ydCAmdmFsLCBpbnQpICAgLy8gUG9zdC1kZWNyZW1lbnQKKwl7CisJCVJWYWx1ZTxVU2hvcnQ+IHJlcyA9IHZhbDsKKworCQlWYWx1ZSAqaW5jID0gTnVjbGV1czo6Y3JlYXRlU3ViKHJlcy52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydCgodW5zaWduZWQgc2hvcnQpMSkpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbmMsIHZhbC5hZGRyZXNzKTsKKworCQlyZXR1cm4gcmVzOworCX0KKworCWNvbnN0IFVTaG9ydCAmb3BlcmF0b3ItLShjb25zdCBVU2hvcnQgJnZhbCkgICAvLyBQcmUtZGVjcmVtZW50CisJeworCQlWYWx1ZSAqaW5jID0gTnVjbGV1czo6Y3JlYXRlU3ViKE51Y2xldXM6OmNyZWF0ZUxvYWQodmFsLmFkZHJlc3MpLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KCh1bnNpZ25lZCBzaG9ydCkxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wVUxUKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPD0oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFVMRShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj4oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFVHVChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUlDbXBVR0UobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhPShjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wTkUobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I9PShjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wRVEobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlVU2hvcnQgKlVTaG9ydDo6Z2V0VGhpcygpCisJeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwljb25zdCBUeXBlICpVU2hvcnQ6OmdldFR5cGUoKQorCXsKKwkJcmV0dXJuIFR5cGU6OmdldEludDE2VHkoKk51Y2xldXM6OmdldENvbnRleHQoKSk7CisJfQorCisJQnl0ZTQgKkJ5dGU0OjpnZXRUaGlzKCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKworCWNvbnN0IFR5cGUgKkJ5dGU0OjpnZXRUeXBlKCkKKwl7CisJCSNpZiAwCisJCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KEJ5dGU6OmdldFR5cGUoKSwgNCk7CisJCSNlbHNlCisJCQlyZXR1cm4gVUludDo6Z2V0VHlwZSgpOyAgIC8vIEZJWE1FOiBMTFZNIGRvZXNuJ3QgbWFuaXB1bGF0ZSBpdCBhcyBvbmUgMzItYml0IGJsb2NrCisJCSNlbmRpZgorCX0KKworCVNCeXRlNCAqU0J5dGU0OjpnZXRUaGlzKCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKworCWNvbnN0IFR5cGUgKlNCeXRlNDo6Z2V0VHlwZSgpCisJeworCQkjaWYgMAorCQkJcmV0dXJuIFZlY3RvclR5cGU6OmdldChTQnl0ZTo6Z2V0VHlwZSgpLCA0KTsKKwkJI2Vsc2UKKwkJCXJldHVybiBJbnQ6OmdldFR5cGUoKTsgICAvLyBGSVhNRTogTExWTSBkb2Vzbid0IG1hbmlwdWxhdGUgaXQgYXMgb25lIDMyLWJpdCBibG9jaworCQkjZW5kaWYKKwl9CisKKwlCeXRlODo6Qnl0ZTgoKQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKwl9CisKKwlCeXRlODo6Qnl0ZTgoYnl0ZSB4MCwgYnl0ZSB4MSwgYnl0ZSB4MiwgYnl0ZSB4MywgYnl0ZSB4NCwgYnl0ZSB4NSwgYnl0ZSB4NiwgYnl0ZSB4NykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJQ29uc3RhbnQgKmNvbnN0YW50VmVjdG9yWzhdOworCQljb25zdGFudFZlY3RvclswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSh4MCk7CisJCWNvbnN0YW50VmVjdG9yWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKHgxKTsKKwkJY29uc3RhbnRWZWN0b3JbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoeDIpOworCQljb25zdGFudFZlY3RvclszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSh4Myk7CisJCWNvbnN0YW50VmVjdG9yWzRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKHg0KTsKKwkJY29uc3RhbnRWZWN0b3JbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoeDUpOworCQljb25zdGFudFZlY3Rvcls2XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSh4Nik7CisJCWNvbnN0YW50VmVjdG9yWzddID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKHg3KTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihjb25zdGFudFZlY3RvciwgOCksIGFkZHJlc3MpOworCX0KKworCUJ5dGU4OjpCeXRlOChpbnQ2NF90IHgpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCUNvbnN0YW50ICpjb25zdGFudFZlY3Rvcls4XTsKKwkJY29uc3RhbnRWZWN0b3JbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoKHVuc2lnbmVkIGNoYXIpKHggPj4gIDApKTsKKwkJY29uc3RhbnRWZWN0b3JbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoKHVuc2lnbmVkIGNoYXIpKHggPj4gIDgpKTsKKwkJY29uc3RhbnRWZWN0b3JbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoKHVuc2lnbmVkIGNoYXIpKHggPj4gMTYpKTsKKwkJY29uc3RhbnRWZWN0b3JbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoKHVuc2lnbmVkIGNoYXIpKHggPj4gMjQpKTsKKwkJY29uc3RhbnRWZWN0b3JbNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoKHVuc2lnbmVkIGNoYXIpKHggPj4gMzIpKTsKKwkJY29uc3RhbnRWZWN0b3JbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoKHVuc2lnbmVkIGNoYXIpKHggPj4gNDApKTsKKwkJY29uc3RhbnRWZWN0b3JbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoKHVuc2lnbmVkIGNoYXIpKHggPj4gNDgpKTsKKwkJY29uc3RhbnRWZWN0b3JbN10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoKHVuc2lnbmVkIGNoYXIpKHggPj4gNTYpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihjb25zdGFudFZlY3RvciwgOCksIGFkZHJlc3MpOworCX0KKworCUJ5dGU4OjpCeXRlOChjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJQnl0ZTg6OkJ5dGU4KGNvbnN0IEJ5dGU4ICZyaHMpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBCeXRlODo6b3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykgY29uc3QKKwl7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJoczsKKwl9CisKKwlSVmFsdWU8Qnl0ZTg+IEJ5dGU4OjpvcGVyYXRvcj0oY29uc3QgQnl0ZTggJnJocykgY29uc3QKKwl7CisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlOD4odmFsdWUpOworCX0KKworCVJWYWx1ZTxCeXRlOD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlOD4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEJ5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJ5dGU4PihOdWNsZXVzOjpjcmVhdGVTdWIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8Qnl0ZTg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qnl0ZTg+KE51Y2xldXM6OmNyZWF0ZU11bChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlOD4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlOD4oTnVjbGV1czo6Y3JlYXRlVURpdihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlOD4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlOD4oTnVjbGV1czo6Y3JlYXRlVVJlbShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlOD4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlOD4oTnVjbGV1czo6Y3JlYXRlQW5kKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPEJ5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJ5dGU4PihOdWNsZXVzOjpjcmVhdGVPcihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCeXRlOD4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCeXRlOD4oTnVjbGV1czo6Y3JlYXRlWG9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisvLwlSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPEJ5dGU4PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKy8vCXsKKy8vCQlyZXR1cm4gUlZhbHVlPEJ5dGU4PihOdWNsZXVzOjpjcmVhdGVTaGwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKy8vCX0KKworLy8JUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxCeXRlOD4gJmxocywgdW5zaWduZWQgY2hhciByaHMpCisvLwl7CisvLwkJcmV0dXJuIFJWYWx1ZTxCeXRlOD4oTnVjbGV1czo6Y3JlYXRlTFNocihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworLy8JfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcis9KGNvbnN0IEJ5dGU4ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKyByaHM7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvci09KGNvbnN0IEJ5dGU4ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLSByaHM7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcio9KGNvbnN0IEJ5dGU4ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKiByaHM7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvci89KGNvbnN0IEJ5dGU4ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLyByaHM7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvciU9KGNvbnN0IEJ5dGU4ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJSByaHM7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvciY9KGNvbnN0IEJ5dGU4ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJiByaHM7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcnw9KGNvbnN0IEJ5dGU4ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgfCByaHM7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcl49KGNvbnN0IEJ5dGU4ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgXiByaHM7CisJfQorCisvLwlSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yPDw9KGNvbnN0IEJ5dGU4ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocykKKy8vCXsKKy8vCQlyZXR1cm4gbGhzID0gbGhzIDw8IHJoczsKKy8vCX0KKworLy8JUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcj4+PShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpCisvLwl7CisvLwkJcmV0dXJuIGxocyA9IGxocyA+PiByaHM7CisvLwl9CisKKwlSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8Qnl0ZTg+ICZ2YWwpCisJeworCQlyZXR1cm4gdmFsOworCX0KKworCVJWYWx1ZTxCeXRlOD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8Qnl0ZTg+KE51Y2xldXM6OmNyZWF0ZU5lZyh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8Qnl0ZTg+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPEJ5dGU4PihOdWNsZXVzOjpjcmVhdGVOb3QodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJ5dGU4PiBBZGRTYXQoY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCwgY29uc3QgUlZhbHVlPEJ5dGU4PiAmeSkKKwl7CisJCXJldHVybiB4ODY6OnBhZGR1c2IoeCwgeSk7CisJfQorCQorCVJWYWx1ZTxCeXRlOD4gU3ViU2F0KGNvbnN0IFJWYWx1ZTxCeXRlOD4gJngsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnkpCisJeworCQlyZXR1cm4geDg2Ojpwc3VidXNiKHgsIHkpOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IFVucGFja0xvdyhjb25zdCBSVmFsdWU8Qnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZ5KQorCXsKKwkJQ29uc3RhbnQgKnNodWZmbGVbOF07CisJCXNodWZmbGVbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKwkJc2h1ZmZsZVsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDgpOworCQlzaHVmZmxlWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSk7CisJCXNodWZmbGVbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg5KTsKKwkJc2h1ZmZsZVs0XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIpOworCQlzaHVmZmxlWzVdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTApOworCQlzaHVmZmxlWzZdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMyk7CisJCXNodWZmbGVbN10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxMSk7CisKKwkJVmFsdWUgKnBhY2tlZCA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3IoeC52YWx1ZSwgeS52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3Ioc2h1ZmZsZSwgOCkpOworCisJCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KHBhY2tlZCwgU2hvcnQ0OjpnZXRUeXBlKCkpKTsKKwl9CisJCisJUlZhbHVlPFNob3J0ND4gVW5wYWNrSGlnaChjb25zdCBSVmFsdWU8Qnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZ5KQorCXsKKwkJQ29uc3RhbnQgKnNodWZmbGVbOF07CisJCXNodWZmbGVbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg0KTsKKwkJc2h1ZmZsZVsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEyKTsKKwkJc2h1ZmZsZVsyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDUpOworCQlzaHVmZmxlWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTMpOworCQlzaHVmZmxlWzRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNik7CisJCXNodWZmbGVbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxNCk7CisJCXNodWZmbGVbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg3KTsKKwkJc2h1ZmZsZVs3XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDE1KTsKKworCQlWYWx1ZSAqcGFja2VkID0gTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3Rvcih4LnZhbHVlLCB5LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3RvcihzaHVmZmxlLCA4KSk7CisKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUJpdENhc3QocGFja2VkLCBTaG9ydDQ6OmdldFR5cGUoKSkpOworCX0KKworCVJWYWx1ZTxJbnQ+IFNpZ25NYXNrKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJngpCisJeworCQlyZXR1cm4geDg2OjpwbW92bXNrYih4KTsKKwl9CisKKy8vCVJWYWx1ZTxCeXRlOD4gQ21wR1QoY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCwgY29uc3QgUlZhbHVlPEJ5dGU4PiAmeSkKKy8vCXsKKy8vCQlyZXR1cm4geDg2OjpwY21wZ3RiKHgsIHkpOyAgIC8vIEZJWE1FOiBTaWduZWRuZXNzCisvLwl9CisJCisJUlZhbHVlPEJ5dGU4PiBDbXBFUShjb25zdCBSVmFsdWU8Qnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZ5KQorCXsKKwkJcmV0dXJuIHg4Njo6cGNtcGVxYih4LCB5KTsKKwl9CisKKwlCeXRlOCAqQnl0ZTg6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqQnl0ZTg6OmdldFR5cGUoKQorCXsKKwkJcmV0dXJuIFZlY3RvclR5cGU6OmdldChCeXRlOjpnZXRUeXBlKCksIDgpOworCX0KKworCVNCeXRlODo6U0J5dGU4KCkKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisJfQorCisJU0J5dGU4OjpTQnl0ZTgoYnl0ZSB4MCwgYnl0ZSB4MSwgYnl0ZSB4MiwgYnl0ZSB4MywgYnl0ZSB4NCwgYnl0ZSB4NSwgYnl0ZSB4NiwgYnl0ZSB4NykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJQ29uc3RhbnQgKmNvbnN0YW50VmVjdG9yWzhdOworCQljb25zdGFudFZlY3RvclswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSh4MCk7CisJCWNvbnN0YW50VmVjdG9yWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKHgxKTsKKwkJY29uc3RhbnRWZWN0b3JbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoeDIpOworCQljb25zdGFudFZlY3RvclszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSh4Myk7CisJCWNvbnN0YW50VmVjdG9yWzRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKHg0KTsKKwkJY29uc3RhbnRWZWN0b3JbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEJ5dGUoeDUpOworCQljb25zdGFudFZlY3Rvcls2XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSh4Nik7CisJCWNvbnN0YW50VmVjdG9yWzddID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKHg3KTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihjb25zdGFudFZlY3RvciwgOCksIGFkZHJlc3MpOworCX0KKworCVNCeXRlODo6U0J5dGU4KGludDY0X3QgeCkKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJQ29uc3RhbnQgKmNvbnN0YW50VmVjdG9yWzhdOworCQljb25zdGFudFZlY3RvclswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikoeCA+PiAgMCkpOworCQljb25zdGFudFZlY3RvclsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikoeCA+PiAgOCkpOworCQljb25zdGFudFZlY3RvclsyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikoeCA+PiAxNikpOworCQljb25zdGFudFZlY3RvclszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikoeCA+PiAyNCkpOworCQljb25zdGFudFZlY3Rvcls0XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikoeCA+PiAzMikpOworCQljb25zdGFudFZlY3Rvcls1XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikoeCA+PiA0MCkpOworCQljb25zdGFudFZlY3Rvcls2XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikoeCA+PiA0OCkpOworCQljb25zdGFudFZlY3Rvcls3XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50Qnl0ZSgodW5zaWduZWQgY2hhcikoeCA+PiA1NikpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKGNvbnN0YW50VmVjdG9yLCA4KSwgYWRkcmVzcyk7CisJfQorCisJU0J5dGU4OjpTQnl0ZTgoY29uc3QgUlZhbHVlPFNCeXRlOD4gJnJocykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlTQnl0ZTg6OlNCeXRlOChjb25zdCBTQnl0ZTggJnJocykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBTQnl0ZTg6Om9wZXJhdG9yPShjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxTQnl0ZTg+IFNCeXRlODo6b3BlcmF0b3I9KGNvbnN0IFNCeXRlOCAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPFNCeXRlOD4odmFsdWUpOworCX0KKworCVJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8U0J5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZTg+KE51Y2xldXM6OmNyZWF0ZUFkZChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8U0J5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZTg+KE51Y2xldXM6OmNyZWF0ZVN1YihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8U0J5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZTg+KE51Y2xldXM6OmNyZWF0ZU11bChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8U0J5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZTg+KE51Y2xldXM6OmNyZWF0ZVNEaXYobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPFNCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8U0J5dGU4PihOdWNsZXVzOjpjcmVhdGVTUmVtKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNCeXRlOD4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNCeXRlOD4oTnVjbGV1czo6Y3JlYXRlQW5kKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNCeXRlOD4gb3BlcmF0b3J8KGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNCeXRlOD4oTnVjbGV1czo6Y3JlYXRlT3IobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPFNCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8U0J5dGU4PihOdWNsZXVzOjpjcmVhdGVYb3IobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKy8vCVJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFNCeXRlOD4gJmxocywgdW5zaWduZWQgY2hhciByaHMpCisvLwl7CisvLwkJcmV0dXJuIFJWYWx1ZTxTQnl0ZTg+KE51Y2xldXM6OmNyZWF0ZVNobChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworLy8JfQorCisvLwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKQorLy8JeworLy8JCXJldHVybiBSVmFsdWU8U0J5dGU4PihOdWNsZXVzOjpjcmVhdGVBU2hyKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisvLwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcis9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyArIHJoczsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvci09KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAtIHJoczsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcio9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAqIHJoczsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvci89KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAvIHJoczsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvciU9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAlIHJoczsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvciY9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAmIHJoczsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcnw9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyB8IHJoczsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcl49KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyBeIHJoczsKKwl9CisKKy8vCVJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yPDw9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKQorLy8JeworLy8JCXJldHVybiBsaHMgPSBsaHMgPDwgcmhzOworLy8JfQorCisvLwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcj4+PShjb25zdCBTQnl0ZTggJmxocywgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnJocykKKy8vCXsKKy8vCQlyZXR1cm4gbGhzID0gbGhzID4+IHJoczsKKy8vCX0KKworCVJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8U0J5dGU4PiAmdmFsKQorCXsKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwlSVmFsdWU8U0J5dGU4PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFNCeXRlOD4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8U0J5dGU4PihOdWNsZXVzOjpjcmVhdGVOZWcodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNCeXRlOD4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPFNCeXRlOD4oTnVjbGV1czo6Y3JlYXRlTm90KHZhbC52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTQnl0ZTg+IEFkZFNhdChjb25zdCBSVmFsdWU8U0J5dGU4PiAmeCwgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnkpCisJeworCQlyZXR1cm4geDg2OjpwYWRkc2IoeCwgeSk7CisJfQorCQorCVJWYWx1ZTxTQnl0ZTg+IFN1YlNhdChjb25zdCBSVmFsdWU8U0J5dGU4PiAmeCwgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnkpCisJeworCQlyZXR1cm4geDg2Ojpwc3Vic2IoeCwgeSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gVW5wYWNrTG93KGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmeSkKKwl7CisJCUNvbnN0YW50ICpzaHVmZmxlWzhdOworCQlzaHVmZmxlWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCXNodWZmbGVbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg4KTsKKwkJc2h1ZmZsZVsyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpOworCQlzaHVmZmxlWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoOSk7CisJCXNodWZmbGVbNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKTsKKwkJc2h1ZmZsZVs1XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEwKTsKKwkJc2h1ZmZsZVs2XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDMpOworCQlzaHVmZmxlWzddID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTEpOworCisJCVZhbHVlICpwYWNrZWQgPSBOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKHgudmFsdWUsIHkudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHNodWZmbGUsIDgpKTsKKworCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChwYWNrZWQsIFNob3J0NDo6Z2V0VHlwZSgpKSk7CisJfQorCQorCVJWYWx1ZTxTaG9ydDQ+IFVucGFja0hpZ2goY29uc3QgUlZhbHVlPFNCeXRlOD4gJngsIGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ5KQorCXsKKwkJQ29uc3RhbnQgKnNodWZmbGVbOF07CisJCXNodWZmbGVbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg0KTsKKwkJc2h1ZmZsZVsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEyKTsKKwkJc2h1ZmZsZVsyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDUpOworCQlzaHVmZmxlWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTMpOworCQlzaHVmZmxlWzRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNik7CisJCXNodWZmbGVbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxNCk7CisJCXNodWZmbGVbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg3KTsKKwkJc2h1ZmZsZVs3XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDE1KTsKKworCQlWYWx1ZSAqcGFja2VkID0gTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3Rvcih4LnZhbHVlLCB5LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3RvcihzaHVmZmxlLCA4KSk7CisKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUJpdENhc3QocGFja2VkLCBTaG9ydDQ6OmdldFR5cGUoKSkpOworCX0KKworCVJWYWx1ZTxJbnQ+IFNpZ25NYXNrKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4KQorCXsKKwkJcmV0dXJuIHg4Njo6cG1vdm1za2IoQXM8Qnl0ZTg+KHgpKTsKKwl9CisKKwlSVmFsdWU8Qnl0ZTg+IENtcEdUKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmeSkKKwl7CisJCXJldHVybiB4ODY6OnBjbXBndGIoeCwgeSk7CisJfQorCQorCVJWYWx1ZTxCeXRlOD4gQ21wRVEoY29uc3QgUlZhbHVlPFNCeXRlOD4gJngsIGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ5KQorCXsKKwkJcmV0dXJuIHg4Njo6cGNtcGVxYihBczxCeXRlOD4oeCksIEFzPEJ5dGU4Pih5KSk7CisJfQorCisJU0J5dGU4ICpTQnl0ZTg6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqU0J5dGU4OjpnZXRUeXBlKCkKKwl7CisJCXJldHVybiBWZWN0b3JUeXBlOjpnZXQoU0J5dGU6OmdldFR5cGUoKSwgOCk7CisJfQorCisJQnl0ZTE2OjpCeXRlMTYoY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlCeXRlMTY6OkJ5dGUxNihjb25zdCBCeXRlMTYgJnJocykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8Qnl0ZTE2PiBCeXRlMTY6Om9wZXJhdG9yPShjb25zdCBSVmFsdWU8Qnl0ZTE2PiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxCeXRlMTY+IEJ5dGUxNjo6b3BlcmF0b3I9KGNvbnN0IEJ5dGUxNiAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPEJ5dGUxNj4odmFsdWUpOworCX0KKworCUJ5dGUxNiAqQnl0ZTE2OjpnZXRUaGlzKCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKworCWNvbnN0IFR5cGUgKkJ5dGUxNjo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KEJ5dGU6OmdldFR5cGUoKSwgMTYpOworCX0KKworCVNCeXRlMTYgKlNCeXRlMTY6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqU0J5dGUxNjo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFNCeXRlOjpnZXRUeXBlKCksIDE2KTsKKwl9CisKKwlTaG9ydDQ6OlNob3J0NChjb25zdCBSVmFsdWU8SW50PiAmY2FzdCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqZXh0ZW5kID0gTnVjbGV1czo6Y3JlYXRlWkV4dChjYXN0LnZhbHVlLCBMb25nOjpnZXRUeXBlKCkpOworCQlWYWx1ZSAqdmVjdG9yID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChleHRlbmQsIFNob3J0NDo6Z2V0VHlwZSgpKTsKKwkJVmFsdWUgKnN3aXp6bGUgPSBOdWNsZXVzOjpjcmVhdGVTd2l6emxlKHZlY3RvciwgMHgwMCk7CisJCQorCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShzd2l6emxlLCBhZGRyZXNzKTsKKwl9CisKKwlTaG9ydDQ6OlNob3J0NChjb25zdCBSVmFsdWU8SW50ND4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnNob3J0OCA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoY2FzdC52YWx1ZSwgU2hvcnQ4OjpnZXRUeXBlKCkpOworCisJCSNpZiAwICAgLy8gRklYTUU6IENoZWNrIGNvZGVnZW4gKHBzaHVmbHcgcGhzaHVmaHcgcHNodWZkKQorCQkJQ29uc3RhbnQgKnBhY2tbOF07CisJCQlwYWNrWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCQlwYWNrWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMik7CisJCQlwYWNrWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNCk7CisJCQlwYWNrWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNik7CisKKwkJCVZhbHVlICpzaG9ydDQgPSBOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKHNob3J0OCwgc2hvcnQ4LCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3RvcihwYWNrLCA0KSk7CisJCSNlbHNlCisJCQlWYWx1ZSAqcGFja2VkOworCisJCQkvLyBGSVhNRTogVXNlIFN3aXp6bGU8U2hvcnQ4PgorCQkJaWYoIUNQVUlEOjpzdXBwb3J0c1NTU0UzKCkpCisJCQl7CisJCQkJQ29uc3RhbnQgKnBzaHVmbHdbOF07CisJCQkJcHNodWZsd1swXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCQkJCXBzaHVmbHdbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKTsKKwkJCQlwc2h1Zmx3WzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCQkJcHNodWZsd1szXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIpOworCQkJCXBzaHVmbHdbNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg0KTsKKwkJCQlwc2h1Zmx3WzVdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNSk7CisJCQkJcHNodWZsd1s2XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDYpOworCQkJCXBzaHVmbHdbN10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg3KTsKKworCQkJCUNvbnN0YW50ICpwc2h1Zmh3WzhdOworCQkJCXBzaHVmaHdbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKwkJCQlwc2h1Zmh3WzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSk7CisJCQkJcHNodWZod1syXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIpOworCQkJCXBzaHVmaHdbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKTsKKwkJCQlwc2h1Zmh3WzRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNCk7CisJCQkJcHNodWZod1s1XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDYpOworCQkJCXBzaHVmaHdbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg0KTsKKwkJCQlwc2h1Zmh3WzddID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNik7CisKKwkJCQlWYWx1ZSAqc2h1ZmZsZTEgPSBOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKHNob3J0OCwgVW5kZWZWYWx1ZTo6Z2V0KFNob3J0ODo6Z2V0VHlwZSgpKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3IocHNodWZsdywgOCkpOworCQkJCVZhbHVlICpzaHVmZmxlMiA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3Ioc2h1ZmZsZTEsIFVuZGVmVmFsdWU6OmdldChTaG9ydDg6OmdldFR5cGUoKSksIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHBzaHVmaHcsIDgpKTsKKwkJCQlWYWx1ZSAqaW50NCA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3Qoc2h1ZmZsZTIsIEludDQ6OmdldFR5cGUoKSk7CisJCQkJcGFja2VkID0gTnVjbGV1czo6Y3JlYXRlU3dpenpsZShpbnQ0LCAweDg4KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlDb25zdGFudCAqcHNodWZiWzE2XTsKKwkJCQlwc2h1ZmJbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKwkJCQlwc2h1ZmJbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKTsKKwkJCQlwc2h1ZmJbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg0KTsKKwkJCQlwc2h1ZmJbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg1KTsKKwkJCQlwc2h1ZmJbNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg4KTsKKwkJCQlwc2h1ZmJbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg5KTsKKwkJCQlwc2h1ZmJbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxMik7CisJCQkJcHNodWZiWzddID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTMpOworCQkJCXBzaHVmYls4XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCQkJCXBzaHVmYls5XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpOworCQkJCXBzaHVmYlsxMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg0KTsKKwkJCQlwc2h1ZmJbMTFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNSk7CisJCQkJcHNodWZiWzEyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDgpOworCQkJCXBzaHVmYlsxM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg5KTsKKwkJCQlwc2h1ZmJbMTRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTIpOworCQkJCXBzaHVmYlsxNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxMyk7CisKKwkJCQlWYWx1ZSAqYnl0ZTE2ID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChjYXN0LnZhbHVlLCBCeXRlMTY6OmdldFR5cGUoKSk7CisJCQkJcGFja2VkID0gTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3RvcihieXRlMTYsIFVuZGVmVmFsdWU6OmdldChCeXRlMTY6OmdldFR5cGUoKSksIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHBzaHVmYiwgMTYpKTsKKwkJCX0KKworCQkJI2lmIDAgICAvLyBGSVhNRTogTm8gb3B0aW1hbCBpbnN0cnVjdGlvbiBzZWxlY3Rpb24KKwkJCQlWYWx1ZSAqcXdvcmQyID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChwYWNrZWQsIExvbmcyOjpnZXRUeXBlKCkpOworCQkJCVZhbHVlICplbGVtZW50ID0gTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQocXdvcmQyLCAwKTsKKwkJCQlWYWx1ZSAqc2hvcnQ0ID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChlbGVtZW50LCBTaG9ydDQ6OmdldFR5cGUoKSk7CisJCQkjZWxzZSAgIC8vIEZJWE1FOiBSZXF1aXJlcyBTU0UKKwkJCQlWYWx1ZSAqaW50MiA9IFJWYWx1ZTxJbnQyPihJbnQyKFJWYWx1ZTxJbnQ0PihwYWNrZWQpKSkudmFsdWU7CisJCQkJVmFsdWUgKnNob3J0NCA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoaW50MiwgU2hvcnQ0OjpnZXRUeXBlKCkpOworCQkJI2VuZGlmCisJCSNlbmRpZgorCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHNob3J0NCwgYWRkcmVzcyk7CisJfQorCisvLwlTaG9ydDQ6OlNob3J0NChjb25zdCBSVmFsdWU8RmxvYXQ+ICZjYXN0KQorLy8JeworLy8JfQorCisJU2hvcnQ0OjpTaG9ydDQoY29uc3QgUlZhbHVlPEZsb2F0ND4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJSW50NCB2NGkzMiA9IEludDQoY2FzdCk7CisJCXY0aTMyID0gQXM8SW50ND4oeDg2OjpwYWNrc3Nkdyh2NGkzMiwgdjRpMzIpKTsKKwkJCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKEFzPFNob3J0ND4oSW50Mih2NGkzMikpLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlTaG9ydDQ6OlNob3J0NCgpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCX0KKworCVNob3J0NDo6U2hvcnQ0KHNob3J0IHgsIHNob3J0IHksIHNob3J0IHosIHNob3J0IHcpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCUNvbnN0YW50ICpjb25zdGFudFZlY3Rvcls0XTsKKwkJY29uc3RhbnRWZWN0b3JbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KHgpOworCQljb25zdGFudFZlY3RvclsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50U2hvcnQoeSk7CisJCWNvbnN0YW50VmVjdG9yWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydCh6KTsKKwkJY29uc3RhbnRWZWN0b3JbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KHcpOworCQlOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihjb25zdGFudFZlY3RvciwgNCk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKGNvbnN0YW50VmVjdG9yLCA0KSwgYWRkcmVzcyk7CisJfQorCisJU2hvcnQ0OjpTaG9ydDQoY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlTaG9ydDQ6OlNob3J0NChjb25zdCBTaG9ydDQgJnJocykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlTaG9ydDQ6OlNob3J0NChjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlTaG9ydDQ6OlNob3J0NChjb25zdCBVU2hvcnQ0ICZyaHMpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gU2hvcnQ0OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocykgY29uc3QKKwl7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJoczsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBTaG9ydDQ6Om9wZXJhdG9yPShjb25zdCBTaG9ydDQgJnJocykgY29uc3QKKwl7CisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KHZhbHVlKTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBTaG9ydDQ6Om9wZXJhdG9yPShjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocykgY29uc3QKKwl7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJoczsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBTaG9ydDQ6Om9wZXJhdG9yPShjb25zdCBVU2hvcnQ0ICZyaHMpIGNvbnN0CisJeworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiBSVmFsdWU8U2hvcnQ0Pih2YWx1ZSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlU3ViKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlTXVsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlU0RpdihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8U2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZVNSZW0obGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVBbmQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVPcihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8U2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZVhvcihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgdW5zaWduZWQgY2hhciByaHMpCisJeworCS8vCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVTaGwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKworCQlyZXR1cm4geDg2Ojpwc2xsdyhsaHMsIHJocyk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8U2hvcnQ0PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUFTaHIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKworCQlyZXR1cm4geDg2Ojpwc3JhdyhsaHMsIHJocyk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8U2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpCisJeworCS8vCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVTaGwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKworCQlyZXR1cm4geDg2Ojpwc2xsdyhsaHMsIHJocyk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8U2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpCisJeworCS8vCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVBU2hyKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisKKwkJcmV0dXJuIHg4Njo6cHNyYXcobGhzLCByaHMpOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yKz0oY29uc3QgU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICsgcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yLT0oY29uc3QgU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIC0gcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yKj0oY29uc3QgU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICogcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yLz0oY29uc3QgU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIC8gcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yJT0oY29uc3QgU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICUgcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yJj0oY29uc3QgU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICYgcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yfD0oY29uc3QgU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIHwgcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yXj0oY29uc3QgU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIF4gcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPDw9KGNvbnN0IFNob3J0NCAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPDwgcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPj49KGNvbnN0IFNob3J0NCAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPj4gcmhzOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPDw9KGNvbnN0IFNob3J0NCAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIDw8IHJoczsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvcj4+PShjb25zdCBTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA+PiByaHM7CisJfQorCisJUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ2YWwpCisJeworCQlyZXR1cm4gdmFsOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8U2hvcnQ0PiAmdmFsKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZU5lZyh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPFNob3J0ND4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVOb3QodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gUm91bmRTaG9ydDQoY29uc3QgUlZhbHVlPEZsb2F0ND4gJmNhc3QpCisJeworCQlSVmFsdWU8SW50ND4gdjRpMzIgPSB4ODY6OmN2dHBzMmRxKGNhc3QpOworCQl2NGkzMiA9IEFzPEludDQ+KHg4Njo6cGFja3NzZHcodjRpMzIsIHY0aTMyKSk7CisJCQorCQlyZXR1cm4gQXM8U2hvcnQ0PihJbnQyKHY0aTMyKSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gTWF4KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwl7CisJCXJldHVybiB4ODY6OnBtYXhzdyh4LCB5KTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBNaW4oY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KQorCXsKKwkJcmV0dXJuIHg4Njo6cG1pbnN3KHgsIHkpOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IEFkZFNhdChjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpCisJeworCQlyZXR1cm4geDg2OjpwYWRkc3coeCwgeSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gU3ViU2F0KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwl7CisJCXJldHVybiB4ODY6OnBzdWJzdyh4LCB5KTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBNdWxIaWdoKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwl7CisJCXJldHVybiB4ODY6OnBtdWxodyh4LCB5KTsKKwl9CisKKwlSVmFsdWU8SW50Mj4gTXVsQWRkKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwl7CisJCXJldHVybiB4ODY6OnBtYWRkd2QoeCwgeSk7CisJfQorCisJUlZhbHVlPFNCeXRlOD4gUGFjayhjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpCisJeworCQlyZXR1cm4geDg2OjpwYWNrc3N3Yih4LCB5KTsKKwl9CisKKwlSVmFsdWU8SW50Mj4gVW5wYWNrTG93KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwl7CisJCUNvbnN0YW50ICpzaHVmZmxlWzRdOworCQlzaHVmZmxlWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCXNodWZmbGVbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg0KTsKKwkJc2h1ZmZsZVsyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpOworCQlzaHVmZmxlWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNSk7CisKKwkJVmFsdWUgKnBhY2tlZCA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3IoeC52YWx1ZSwgeS52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3Ioc2h1ZmZsZSwgNCkpOworCisJCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChwYWNrZWQsIEludDI6OmdldFR5cGUoKSkpOworCX0KKworCVJWYWx1ZTxJbnQyPiBVbnBhY2tIaWdoKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwl7CisJCUNvbnN0YW50ICpzaHVmZmxlWzRdOworCQlzaHVmZmxlWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMik7CisJCXNodWZmbGVbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg2KTsKKwkJc2h1ZmZsZVsyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDMpOworCQlzaHVmZmxlWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNyk7CisKKwkJVmFsdWUgKnBhY2tlZCA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3IoeC52YWx1ZSwgeS52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3Ioc2h1ZmZsZSwgNCkpOworCisJCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChwYWNrZWQsIEludDI6OmdldFR5cGUoKSkpOworCX0KKworCVJWYWx1ZTxTaG9ydDQ+IFN3aXp6bGUoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIHVuc2lnbmVkIGNoYXIgc2VsZWN0KQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZVN3aXp6bGUoeC52YWx1ZSwgc2VsZWN0KSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gSW5zZXJ0KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ2YWwsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmVsZW1lbnQsIGludCBpKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQodmFsLnZhbHVlLCBlbGVtZW50LnZhbHVlLCBpKSk7CisJfQorCisJUlZhbHVlPFNob3J0PiBFeHRyYWN0KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ2YWwsIGludCBpKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydD4oTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQodmFsLnZhbHVlLCBpKSk7CisJfQorCisJUlZhbHVlPFNob3J0ND4gQ21wR1QoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KQorCXsKKwkJcmV0dXJuIHg4Njo6cGNtcGd0dyh4LCB5KTsKKwl9CisKKwlSVmFsdWU8U2hvcnQ0PiBDbXBFUShjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpCisJeworCQlyZXR1cm4geDg2OjpwY21wZXF3KHgsIHkpOworCX0KKworCVNob3J0NCAqU2hvcnQ0OjpnZXRUaGlzKCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKworCWNvbnN0IFR5cGUgKlNob3J0NDo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFNob3J0OjpnZXRUeXBlKCksIDQpOworCX0KKworCVVTaG9ydDQ6OlVTaG9ydDQoY29uc3QgUlZhbHVlPEludDQ+ICZjYXN0KQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCSp0aGlzID0gU2hvcnQ0KGNhc3QpOworCX0KKworCVVTaG9ydDQ6OlVTaG9ydDQoY29uc3QgUlZhbHVlPEZsb2F0ND4gJmNhc3QsIGJvb2wgc2F0dXJhdGUpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJRmxvYXQ0IHNhdDsKKworCQlpZihzYXR1cmF0ZSkKKwkJeworCQkJaWYoQ1BVSUQ6OnN1cHBvcnRzU1NFNF8xKCkpCisJCQl7CisJCQkJc2F0ID0gTWluKGNhc3QsIEZsb2F0NCgweEZGRkYpKTsgICAvLyBwYWNrdXNkdyB0YWtlcyBjYXJlIG9mIDB4MDAwMCBzYXR1cmF0aW9uCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2F0ID0gTWF4KE1pbihjYXN0LCBGbG9hdDQoMHhGRkZGKSksIEZsb2F0NCgweDAwMDApKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXNhdCA9IGNhc3Q7CisJCX0KKworCQlJbnQ0IGludDQoc2F0KTsKKworCQlpZighc2F0dXJhdGUgfHwgIUNQVUlEOjpzdXBwb3J0c1NTRTRfMSgpKQorCQl7CisJCQkqdGhpcyA9IFNob3J0NChJbnQ0KGludDQpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSp0aGlzID0gQXM8U2hvcnQ0PihJbnQyKEFzPEludDQ+KHg4Njo6cGFja3VzZHcoQXM8VUludDQ+KGludDQpLCBBczxVSW50ND4oaW50NCkpKSkpOworCQl9CisJfQorCisJVVNob3J0NDo6VVNob3J0NCgpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCX0KKworCVVTaG9ydDQ6OlVTaG9ydDQodW5zaWduZWQgc2hvcnQgeCwgdW5zaWduZWQgc2hvcnQgeSwgdW5zaWduZWQgc2hvcnQgeiwgdW5zaWduZWQgc2hvcnQgdykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJQ29uc3RhbnQgKmNvbnN0YW50VmVjdG9yWzRdOworCQljb25zdGFudFZlY3RvclswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50U2hvcnQoeCk7CisJCWNvbnN0YW50VmVjdG9yWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydCh5KTsKKwkJY29uc3RhbnRWZWN0b3JbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KHopOworCQljb25zdGFudFZlY3RvclszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50U2hvcnQodyk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3IoY29uc3RhbnRWZWN0b3IsIDQpLCBhZGRyZXNzKTsKKwl9CisKKwlVU2hvcnQ0OjpVU2hvcnQ0KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmcmhzKQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCX0KKworCVVTaG9ydDQ6OlVTaG9ydDQoY29uc3QgVVNob3J0NCAmcmhzKQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCX0KKworCVVTaG9ydDQ6OlVTaG9ydDQoY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocykKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlVU2hvcnQ0OjpVU2hvcnQ0KGNvbnN0IFNob3J0NCAmcmhzKQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBVU2hvcnQ0OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZyaHMpIGNvbnN0CisJeworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydDQ+IFVTaG9ydDQ6Om9wZXJhdG9yPShjb25zdCBVU2hvcnQ0ICZyaHMpIGNvbnN0CisJeworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiBSVmFsdWU8VVNob3J0ND4odmFsdWUpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBVU2hvcnQ0OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocykgY29uc3QKKwl7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJoczsKKwl9CisKKwlSVmFsdWU8VVNob3J0ND4gVVNob3J0NDo6b3BlcmF0b3I9KGNvbnN0IFNob3J0NCAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDQ+KHZhbHVlKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VVNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8VVNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZVN1YihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvciooY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVU2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVNdWwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VVNob3J0ND4gJmxocywgdW5zaWduZWQgY2hhciByaHMpCisJeworCS8vCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVTaGwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKworCQlyZXR1cm4gQXM8VVNob3J0ND4oeDg2Ojpwc2xsdyhBczxTaG9ydDQ+KGxocyksIHJocykpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUxTaHIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKworCQlyZXR1cm4geDg2Ojpwc3JsdyhsaHMsIHJocyk7CisJfQorCisJUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZVNobChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCisJCXJldHVybiBBczxVU2hvcnQ0Pih4ODY6OnBzbGx3KEFzPFNob3J0ND4obGhzKSwgcmhzKSk7CisJfQorCisJUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUxTaHIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKworCQlyZXR1cm4geDg2Ojpwc3JsdyhsaHMsIHJocyk7CisJfQorCisJUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yPDw9KGNvbnN0IFVTaG9ydDQgJmxocywgdW5zaWduZWQgY2hhciByaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIDw8IHJoczsKKwl9CisKKwlSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3I+Pj0oY29uc3QgVVNob3J0NCAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPj4gcmhzOworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcjw8PShjb25zdCBVU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPDwgcmhzOworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcj4+PShjb25zdCBVU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPj4gcmhzOworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZU5vdCh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0ND4gTWF4KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ5KQorCXsKKwkJcmV0dXJuIE1heChBczxTaG9ydDQ+KHgpIC0gU2hvcnQ0KDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCksIEFzPFNob3J0ND4oeSkgLSBTaG9ydDQoMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwKSkgKyBTaG9ydDQoMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwKTs7CisJfQorCisJUlZhbHVlPFVTaG9ydDQ+IE1pbihjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSkKKwl7CisJCXJldHVybiBNaW4oQXM8U2hvcnQ0Pih4KSAtIFNob3J0NCgweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDApLCBBczxTaG9ydDQ+KHkpIC0gU2hvcnQ0KDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCkpICsgU2hvcnQ0KDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCk7OworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBBZGRTYXQoY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnkpCisJeworCQlyZXR1cm4geDg2OjpwYWRkdXN3KHgsIHkpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBTdWJTYXQoY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnkpCisJeworCQlyZXR1cm4geDg2Ojpwc3VidXN3KHgsIHkpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ0PiBNdWxIaWdoKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ5KQorCXsKKwkJcmV0dXJuIHg4Njo6cG11bGh1dyh4LCB5KTsKKwl9CisKKwlSVmFsdWU8VVNob3J0ND4gQXZlcmFnZShjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSkKKwl7CisJCXJldHVybiB4ODY6OnBhdmd3KHgsIHkpOworCX0KKworCVJWYWx1ZTxCeXRlOD4gUGFjayhjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSkKKwl7CisJCXJldHVybiB4ODY6OnBhY2t1c3diKHgsIHkpOworCX0KKworCVVTaG9ydDQgKlVTaG9ydDQ6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqVVNob3J0NDo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFVTaG9ydDo6Z2V0VHlwZSgpLCA0KTsKKwl9CisKKwlTaG9ydDg6OlNob3J0OChzaG9ydCBjMCwgc2hvcnQgYzEsIHNob3J0IGMyLCBzaG9ydCBjMywgc2hvcnQgYzQsIHNob3J0IGM1LCBzaG9ydCBjNiwgc2hvcnQgYzcpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCUNvbnN0YW50ICpjb25zdGFudFZlY3Rvcls4XTsKKwkJY29uc3RhbnRWZWN0b3JbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KGMwKTsKKwkJY29uc3RhbnRWZWN0b3JbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KGMxKTsKKwkJY29uc3RhbnRWZWN0b3JbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KGMyKTsKKwkJY29uc3RhbnRWZWN0b3JbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KGMzKTsKKwkJY29uc3RhbnRWZWN0b3JbNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KGM0KTsKKwkJY29uc3RhbnRWZWN0b3JbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KGM1KTsKKwkJY29uc3RhbnRWZWN0b3JbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KGM2KTsKKwkJY29uc3RhbnRWZWN0b3JbN10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFNob3J0KGM3KTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihjb25zdGFudFZlY3RvciwgOCksIGFkZHJlc3MpOworCX0KKworCVNob3J0ODo6U2hvcnQ4KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJUlZhbHVlPFNob3J0OD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0OD4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0OD4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFNob3J0OD4oTnVjbGV1czo6Y3JlYXRlQW5kKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFNob3J0OD4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8U2hvcnQ4PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJCXJldHVybiB4ODY6OnBzbGx3KGxocywgcmhzKTsgICAvLyBGSVhNRTogRmFsbGJhY2sgcmVxdWlyZWQKKwl9CisKKwlSVmFsdWU8U2hvcnQ4PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKQorCXsKKwkJcmV0dXJuIHg4Njo6cHNyYXcobGhzLCByaHMpOyAgIC8vIEZJWE1FOiBGYWxsYmFjayByZXF1aXJlZAorCX0KKworCVJWYWx1ZTxTaG9ydDg+IENvbmNhdGVuYXRlKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsbywgY29uc3QgUlZhbHVlPFNob3J0ND4gJmhpKQorCXsKKwkJVmFsdWUgKmxvTG9uZyA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QobG8udmFsdWUsIExvbmc6OmdldFR5cGUoKSk7CisJCVZhbHVlICpoaUxvbmcgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGhpLnZhbHVlLCBMb25nOjpnZXRUeXBlKCkpOworCisJCVZhbHVlICpsb25nMiA9IFVuZGVmVmFsdWU6OmdldChMb25nMjo6Z2V0VHlwZSgpKTsKKwkJbG9uZzIgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KGxvbmcyLCBsb0xvbmcsIDApOworCQlsb25nMiA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQobG9uZzIsIGhpTG9uZywgMSk7CisJCVZhbHVlICpzaG9ydDggPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGxvbmcyLCBTaG9ydDg6OmdldFR5cGUoKSk7CisKKwkJcmV0dXJuIFJWYWx1ZTxTaG9ydDg+KHNob3J0OCk7CisJfQorCisJUlZhbHVlPEludDQ+IE11bEFkZChjb25zdCBSVmFsdWU8U2hvcnQ4PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0OD4gJnkpCisJeworCQlyZXR1cm4geDg2OjpwbWFkZHdkKHgsIHkpOyAgIC8vIEZJWE1FOiBGYWxsYmFjayByZXF1aXJlZAorCX0KKworCVJWYWx1ZTxTaG9ydDg+IE11bEhpZ2goY29uc3QgUlZhbHVlPFNob3J0OD4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZ5KQorCXsKKwkJcmV0dXJuIHg4Njo6cG11bGh3KHgsIHkpOyAgIC8vIEZJWE1FOiBGYWxsYmFjayByZXF1aXJlZAorCX0KKworCVNob3J0OCAqU2hvcnQ4OjpnZXRUaGlzKCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKworCWNvbnN0IFR5cGUgKlNob3J0ODo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFNob3J0OjpnZXRUeXBlKCksIDgpOworCX0KKworCVVTaG9ydDg6OlVTaG9ydDgodW5zaWduZWQgc2hvcnQgYzAsIHVuc2lnbmVkIHNob3J0IGMxLCB1bnNpZ25lZCBzaG9ydCBjMiwgdW5zaWduZWQgc2hvcnQgYzMsIHVuc2lnbmVkIHNob3J0IGM0LCB1bnNpZ25lZCBzaG9ydCBjNSwgdW5zaWduZWQgc2hvcnQgYzYsIHVuc2lnbmVkIHNob3J0IGM3KQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlDb25zdGFudCAqY29uc3RhbnRWZWN0b3JbOF07CisJCWNvbnN0YW50VmVjdG9yWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydChjMCk7CisJCWNvbnN0YW50VmVjdG9yWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydChjMSk7CisJCWNvbnN0YW50VmVjdG9yWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydChjMik7CisJCWNvbnN0YW50VmVjdG9yWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydChjMyk7CisJCWNvbnN0YW50VmVjdG9yWzRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydChjNCk7CisJCWNvbnN0YW50VmVjdG9yWzVdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydChjNSk7CisJCWNvbnN0YW50VmVjdG9yWzZdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydChjNik7CisJCWNvbnN0YW50VmVjdG9yWzddID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRTaG9ydChjNyk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3IoY29uc3RhbnRWZWN0b3IsIDgpLCBhZGRyZXNzKTsKKwl9CisKKwlVU2hvcnQ4OjpVU2hvcnQ4KGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ4PiBVU2hvcnQ4OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpIGNvbnN0CisJeworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiByaHM7CisJfQorCisJUlZhbHVlPFVTaG9ydDg+IFVTaG9ydDg6Om9wZXJhdG9yPShjb25zdCBVU2hvcnQ4ICZyaHMpIGNvbnN0CisJeworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiBSVmFsdWU8VVNob3J0OD4odmFsdWUpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVU2hvcnQ4PihOdWNsZXVzOjpjcmVhdGVBbmQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VVNob3J0OD4gJmxocywgdW5zaWduZWQgY2hhciByaHMpCisJeworCQlyZXR1cm4gQXM8VVNob3J0OD4oeDg2Ojpwc2xsdyhBczxTaG9ydDg+KGxocyksIHJocykpOyAgIC8vIEZJWE1FOiBGYWxsYmFjayByZXF1aXJlZAorCX0KKworCVJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJCXJldHVybiB4ODY6OnBzcmx3KGxocywgcmhzKTsgICAvLyBGSVhNRTogRmFsbGJhY2sgcmVxdWlyZWQKKwl9CisKKwlSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0OD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VVNob3J0OD4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8VVNob3J0OD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDg+KE51Y2xldXM6OmNyZWF0ZU11bChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvcis9KGNvbnN0IFVTaG9ydDggJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICsgcmhzOworCX0KKworCVJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDg+KE51Y2xldXM6OmNyZWF0ZU5vdCh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0OD4gU3dpenpsZShjb25zdCBSVmFsdWU8VVNob3J0OD4gJngsIGNoYXIgc2VsZWN0MCwgY2hhciBzZWxlY3QxLCBjaGFyIHNlbGVjdDIsIGNoYXIgc2VsZWN0MywgY2hhciBzZWxlY3Q0LCBjaGFyIHNlbGVjdDUsIGNoYXIgc2VsZWN0NiwgY2hhciBzZWxlY3Q3KQorCXsKKwkJQ29uc3RhbnQgKnBzaHVmYlsxNl07CisJCXBzaHVmYlswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDAgKyAwKTsKKwkJcHNodWZiWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoc2VsZWN0MCArIDEpOworCQlwc2h1ZmJbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChzZWxlY3QxICsgMCk7CisJCXBzaHVmYlszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDEgKyAxKTsKKwkJcHNodWZiWzRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoc2VsZWN0MiArIDApOworCQlwc2h1ZmJbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChzZWxlY3QyICsgMSk7CisJCXBzaHVmYls2XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDMgKyAwKTsKKwkJcHNodWZiWzddID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoc2VsZWN0MyArIDEpOworCQlwc2h1ZmJbOF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChzZWxlY3Q0ICsgMCk7CisJCXBzaHVmYls5XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDQgKyAxKTsKKwkJcHNodWZiWzEwXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDUgKyAwKTsKKwkJcHNodWZiWzExXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDUgKyAxKTsKKwkJcHNodWZiWzEyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDYgKyAwKTsKKwkJcHNodWZiWzEzXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDYgKyAxKTsKKwkJcHNodWZiWzE0XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDcgKyAwKTsKKwkJcHNodWZiWzE1XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHNlbGVjdDcgKyAxKTsKKworCQlWYWx1ZSAqYnl0ZTE2ID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdCh4LnZhbHVlLCBCeXRlMTY6OmdldFR5cGUoKSk7CisJCVZhbHVlICpzaHVmZmxlID0gTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3RvcihieXRlMTYsIFVuZGVmVmFsdWU6OmdldChCeXRlMTY6OmdldFR5cGUoKSksIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHBzaHVmYiwgMTYpKTsKKwkJVmFsdWUgKnNob3J0OCA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3Qoc2h1ZmZsZSwgVVNob3J0ODo6Z2V0VHlwZSgpKTsKKworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDg+KHNob3J0OCk7CisJfQorCisJUlZhbHVlPFVTaG9ydDg+IENvbmNhdGVuYXRlKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbG8sIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmaGkpCisJeworCQlWYWx1ZSAqbG9Mb25nID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChsby52YWx1ZSwgTG9uZzo6Z2V0VHlwZSgpKTsKKwkJVmFsdWUgKmhpTG9uZyA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoaGkudmFsdWUsIExvbmc6OmdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmxvbmcyID0gVW5kZWZWYWx1ZTo6Z2V0KExvbmcyOjpnZXRUeXBlKCkpOworCQlsb25nMiA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQobG9uZzIsIGxvTG9uZywgMCk7CisJCWxvbmcyID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudChsb25nMiwgaGlMb25nLCAxKTsKKwkJVmFsdWUgKnNob3J0OCA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QobG9uZzIsIFNob3J0ODo6Z2V0VHlwZSgpKTsKKworCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDg+KHNob3J0OCk7CisJfQorCisJUlZhbHVlPFVTaG9ydDg+IE11bEhpZ2goY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZ4LCBjb25zdCBSVmFsdWU8VVNob3J0OD4gJnkpCisJeworCQlyZXR1cm4geDg2OjpwbXVsaHV3KHgsIHkpOyAgIC8vIEZJWE1FOiBGYWxsYmFjayByZXF1aXJlZAorCX0KKworCS8vIEZJWE1FOiBJbXBsZW1lbnQgYXMgU2h1ZmZsZSh4LCB5LCBTZWxlY3QoaTAsIC4uLiwgaTE2KSkgYW5kIFNodWZmbGUoeCwgeSwgU0VMRUNUX1BBQ0tfUkVQRUFUKGVsZW1lbnQpKQorLy8JUlZhbHVlPFVTaG9ydDg+IFBhY2tSZXBlYXQoY29uc3QgUlZhbHVlPEJ5dGUxNj4gJngsIGNvbnN0IFJWYWx1ZTxCeXRlMTY+ICZ5LCBpbnQgZWxlbWVudCkKKy8vCXsKKy8vCQlDb25zdGFudCAqcHNodWZiWzE2XTsKKy8vCQlwc2h1ZmJbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgMCk7CisvLwkJcHNodWZiWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoZWxlbWVudCArIDApOworLy8JCXBzaHVmYlsyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KGVsZW1lbnQgKyA0KTsKKy8vCQlwc2h1ZmJbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgNCk7CisvLwkJcHNodWZiWzRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoZWxlbWVudCArIDgpOworLy8JCXBzaHVmYls1XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KGVsZW1lbnQgKyA4KTsKKy8vCQlwc2h1ZmJbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgMTIpOworLy8JCXBzaHVmYls3XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KGVsZW1lbnQgKyAxMik7CisvLwkJcHNodWZiWzhdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoZWxlbWVudCArIDE2KTsKKy8vCQlwc2h1ZmJbOV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgMTYpOworLy8JCXBzaHVmYlsxMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgMjApOworLy8JCXBzaHVmYlsxMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgMjApOworLy8JCXBzaHVmYlsxMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgMjQpOworLy8JCXBzaHVmYlsxM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgMjQpOworLy8JCXBzaHVmYlsxNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgMjgpOworLy8JCXBzaHVmYlsxNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChlbGVtZW50ICsgMjgpOworLy8KKy8vCQlWYWx1ZSAqc2h1ZmZsZSA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3IoeC52YWx1ZSwgeS52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3IocHNodWZiLCAxNikpOworLy8JCVZhbHVlICpzaG9ydDggPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KHNodWZmbGUsIFVTaG9ydDg6OmdldFR5cGUoKSk7CisvLworLy8JCXJldHVybiBSVmFsdWU8VVNob3J0OD4oc2hvcnQ4KTsKKy8vCX0KKworCVVTaG9ydDggKlVTaG9ydDg6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqVVNob3J0ODo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFVTaG9ydDo6Z2V0VHlwZSgpLCA4KTsKKwl9CisKKwlJbnQ6OkludChBcmd1bWVudCAqYXJndW1lbnQpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoYXJndW1lbnQsIGFkZHJlc3MpOworCX0KKworCUludDo6SW50KGNvbnN0IFJWYWx1ZTxCeXRlPiAmY2FzdCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqaW50ZWdlciA9IE51Y2xldXM6OmNyZWF0ZVpFeHQoY2FzdC52YWx1ZSwgSW50OjpnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGludGVnZXIsIGFkZHJlc3MpOworCX0KKworCUludDo6SW50KGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmludGVnZXIgPSBOdWNsZXVzOjpjcmVhdGVTRXh0KGNhc3QudmFsdWUsIEludDo6Z2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbnRlZ2VyLCBhZGRyZXNzKTsKKwl9CisKKwlJbnQ6OkludChjb25zdCBSVmFsdWU8U2hvcnQ+ICZjYXN0KQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICppbnRlZ2VyID0gTnVjbGV1czo6Y3JlYXRlU0V4dChjYXN0LnZhbHVlLCBJbnQ6OmdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW50ZWdlciwgYWRkcmVzcyk7CisJfQorCisJSW50OjpJbnQoY29uc3QgUlZhbHVlPFVTaG9ydD4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmludGVnZXIgPSBOdWNsZXVzOjpjcmVhdGVaRXh0KGNhc3QudmFsdWUsIEludDo6Z2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbnRlZ2VyLCBhZGRyZXNzKTsKKwl9CisKKwlJbnQ6OkludChjb25zdCBSVmFsdWU8SW50Mj4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJKnRoaXMgPSBFeHRyYWN0KGNhc3QsIDApOworCX0KKworCUludDo6SW50KGNvbnN0IFJWYWx1ZTxMb25nPiAmY2FzdCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqaW50ZWdlciA9IE51Y2xldXM6OmNyZWF0ZVRydW5jKGNhc3QudmFsdWUsIEludDo6Z2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbnRlZ2VyLCBhZGRyZXNzKTsKKwl9CisKKwlJbnQ6OkludChjb25zdCBSVmFsdWU8RmxvYXQ+ICZjYXN0KQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICppbnRlZ2VyID0gTnVjbGV1czo6Y3JlYXRlRlBUb1NJKGNhc3QudmFsdWUsIEludDo6Z2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbnRlZ2VyLCBhZGRyZXNzKTsKKwl9CisKKwlJbnQ6OkludCgpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisJfQorCisJSW50OjpJbnQoaW50IHgpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeCksIGFkZHJlc3MpOworCX0KKworCUludDo6SW50KGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlJbnQ6OkludChjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCX0KKworCUludDo6SW50KGNvbnN0IEludCAmcmhzKQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJSW50OjpJbnQoY29uc3QgVUludCAmcmhzKQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJUlZhbHVlPEludD4gSW50OjpvcGVyYXRvcj0oaW50IHJocykgY29uc3QKKwl7CisJCXJldHVybiBSVmFsdWU8SW50PihOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChyaHMpLCBhZGRyZXNzKSk7CisJfQorCisJUlZhbHVlPEludD4gSW50OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEludD4gJnJocykgY29uc3QKKwl7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBJbnQ6Om9wZXJhdG9yPShjb25zdCBSVmFsdWU8VUludD4gJnJocykgY29uc3QKKwl7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBJbnQ6Om9wZXJhdG9yPShjb25zdCBJbnQgJnJocykgY29uc3QKKwl7CisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ+KHZhbHVlKTsKKwl9CisKKwlSVmFsdWU8SW50PiBJbnQ6Om9wZXJhdG9yPShjb25zdCBVSW50ICZyaHMpIGNvbnN0CisJeworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiBSVmFsdWU8SW50Pih2YWx1ZSk7CisJfQorCisJUlZhbHVlPFBvaW50ZXI8SW50Pj4gSW50OjpvcGVyYXRvciYoKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxQb2ludGVyPEludD4+KGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ+KE51Y2xldXM6OmNyZWF0ZUFkZChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ+KE51Y2xldXM6OmNyZWF0ZVN1YihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ+KE51Y2xldXM6OmNyZWF0ZU11bChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ+KE51Y2xldXM6OmNyZWF0ZVNEaXYobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPEludD4gJmxocywgY29uc3QgUlZhbHVlPEludD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8SW50PihOdWNsZXVzOjpjcmVhdGVTUmVtKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludD4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEludD4oTnVjbGV1czo6Y3JlYXRlQW5kKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludD4gb3BlcmF0b3J8KGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEludD4oTnVjbGV1czo6Y3JlYXRlT3IobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPEludD4gJmxocywgY29uc3QgUlZhbHVlPEludD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8SW50PihOdWNsZXVzOjpjcmVhdGVYb3IobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEludD4oTnVjbGV1czo6Y3JlYXRlU2hsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludD4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ+KE51Y2xldXM6OmNyZWF0ZUFTaHIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvcis9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyArIHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvci09KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAtIHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvcio9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAqIHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvci89KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAvIHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvciU9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAlIHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvciY9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAmIHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvcnw9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyB8IHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvcl49KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyBeIHJoczsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvcjw8PShjb25zdCBJbnQgJmxocywgY29uc3QgUlZhbHVlPEludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPDwgcmhzOworCX0KKworCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yPj49KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA+PiByaHM7CisJfQorCisJUlZhbHVlPEludD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxJbnQ+ICZ2YWwpCisJeworCQlyZXR1cm4gdmFsOworCX0KKworCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8SW50PiAmdmFsKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ+KE51Y2xldXM6OmNyZWF0ZU5lZyh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50PiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPEludD4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8SW50PihOdWNsZXVzOjpjcmVhdGVOb3QodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludD4gb3BlcmF0b3IrKyhjb25zdCBJbnQgJnZhbCwgaW50KSAgIC8vIFBvc3QtaW5jcmVtZW50CisJeworCQlSVmFsdWU8SW50PiByZXMgPSB2YWw7CisKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZUFkZChyZXMudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW5jLCB2YWwuYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisKKwljb25zdCBJbnQgJm9wZXJhdG9yKysoY29uc3QgSW50ICZ2YWwpICAgLy8gUHJlLWluY3JlbWVudAorCXsKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZUFkZChOdWNsZXVzOjpjcmVhdGVMb2FkKHZhbC5hZGRyZXNzKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSkpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbmMsIHZhbC5hZGRyZXNzKTsKKworCQlyZXR1cm4gdmFsOworCX0KKworCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yLS0oY29uc3QgSW50ICZ2YWwsIGludCkgICAvLyBQb3N0LWRlY3JlbWVudAorCXsKKwkJUlZhbHVlPEludD4gcmVzID0gdmFsOworCisJCVZhbHVlICppbmMgPSBOdWNsZXVzOjpjcmVhdGVTdWIocmVzLnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiByZXM7CisJfQorCisJY29uc3QgSW50ICZvcGVyYXRvci0tKGNvbnN0IEludCAmdmFsKSAgIC8vIFByZS1kZWNyZW1lbnQKKwl7CisJCVZhbHVlICppbmMgPSBOdWNsZXVzOjpjcmVhdGVTdWIoTnVjbGV1czo6Y3JlYXRlTG9hZCh2YWwuYWRkcmVzcyksIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW5jLCB2YWwuYWRkcmVzcyk7CisKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8KGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUlDbXBTTFQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8PShjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wU0xFKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPihjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wU0dUKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPj0oY29uc3QgUlZhbHVlPEludD4gJmxocywgY29uc3QgUlZhbHVlPEludD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFNHRShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvciE9KGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUlDbXBORShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUlDbXBFUShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQ+IFJvdW5kSW50KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmNhc3QpCisJeworCQlyZXR1cm4geDg2OjpjdnRzczJzaShjYXN0KTsKKworCS8vCXJldHVybiBJZlRoZW5FbHNlKHZhbCA+IEZsb2F0KDApLCBJbnQodmFsICsgRmxvYXQoMC41ZikpLCBJbnQodmFsIC0gRmxvYXQoMC41ZikpKTsKKwl9CisKKwlJbnQgKkludDo6Z2V0VGhpcygpCisJeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwljb25zdCBUeXBlICpJbnQ6OmdldFR5cGUoKQorCXsKKwkJcmV0dXJuIFR5cGU6OmdldEludDMyVHkoKk51Y2xldXM6OmdldENvbnRleHQoKSk7CisJfQorCisJTG9uZzo6TG9uZyhjb25zdCBSVmFsdWU8SW50PiAmY2FzdCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqaW50ZWdlciA9IE51Y2xldXM6OmNyZWF0ZVNFeHQoY2FzdC52YWx1ZSwgTG9uZzo6Z2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbnRlZ2VyLCBhZGRyZXNzKTsKKwl9CisKKwlMb25nOjpMb25nKGNvbnN0IFJWYWx1ZTxVSW50PiAmY2FzdCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqaW50ZWdlciA9IE51Y2xldXM6OmNyZWF0ZVpFeHQoY2FzdC52YWx1ZSwgTG9uZzo6Z2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShpbnRlZ2VyLCBhZGRyZXNzKTsKKwl9CisKKwlMb25nOjpMb25nKCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKwl9CisKKwlMb25nOjpMb25nKGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJUlZhbHVlPExvbmc+IExvbmc6Om9wZXJhdG9yPShpbnQ2NF90IHJocykgY29uc3QKKwl7CisJCXJldHVybiBSVmFsdWU8TG9uZz4oTnVjbGV1czo6Y3JlYXRlU3RvcmUoTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRMb25nKHJocyksIGFkZHJlc3MpKTsKKwl9CisKKwlSVmFsdWU8TG9uZz4gTG9uZzo6b3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxMb25nPiBMb25nOjpvcGVyYXRvcj0oY29uc3QgTG9uZyAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPExvbmc+KHZhbHVlKTsKKwl9CisKKwlSVmFsdWU8TG9uZz4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxMb25nPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZz4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8TG9uZz4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPExvbmc+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8TG9uZz4gJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPExvbmc+KE51Y2xldXM6OmNyZWF0ZVN1YihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxMb25nPiBvcGVyYXRvcis9KGNvbnN0IExvbmcgJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICsgcmhzOworCX0KKworCVJWYWx1ZTxMb25nPiBvcGVyYXRvci09KGNvbnN0IExvbmcgJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIC0gcmhzOworCX0KKworCVJWYWx1ZTxMb25nPiBBZGRBdG9taWMoY29uc3QgUlZhbHVlPFBvaW50ZXI8TG9uZz4+ICZ4LCBjb25zdCBSVmFsdWU8TG9uZz4gJnkpCisJeworCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQljb25zdCBsbHZtOjpUeXBlICp0eXBlID0gTG9uZzo6Z2V0VHlwZSgpOworCQlsbHZtOjpGdW5jdGlvbiAqYXRvbWljID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6YXRvbWljX2xvYWRfYWRkLCAmdHlwZSwgMSk7CisKKwkJcmV0dXJuIFJWYWx1ZTxMb25nPihOdWNsZXVzOjpjcmVhdGVDYWxsKGF0b21pYywgeC52YWx1ZSwgeS52YWx1ZSkpOworCX0KKworCUxvbmcgKkxvbmc6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqTG9uZzo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVHlwZTo6Z2V0SW50NjRUeSgqTnVjbGV1czo6Z2V0Q29udGV4dCgpKTsKKwl9CisKKwlMb25nMTo6TG9uZzEoY29uc3QgUmVmZXJlbmNlPFVJbnQ+ICZjYXN0KQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICp1aW50ID0gTnVjbGV1czo6Y3JlYXRlTG9hZChjYXN0LmFkZHJlc3MpOworCQlWYWx1ZSAqaW50NjQgPSBOdWNsZXVzOjpjcmVhdGVaRXh0KHVpbnQsIExvbmc6OmdldFR5cGUoKSk7CisJCVZhbHVlICpsb25nMSA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoaW50NjQsIExvbmcxOjpnZXRUeXBlKCkpOworCQkKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUobG9uZzEsIGFkZHJlc3MpOworCX0KKworCUxvbmcxOjpMb25nMShjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlMb25nMSAqTG9uZzE6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqTG9uZzE6OmdldFR5cGUoKQorCXsKKwkJcmV0dXJuIFZlY3RvclR5cGU6OmdldChMb25nOjpnZXRUeXBlKCksIDEpOworCX0KKworCVJWYWx1ZTxMb25nMj4gVW5wYWNrSGlnaChjb25zdCBSVmFsdWU8TG9uZzI+ICZ4LCBjb25zdCBSVmFsdWU8TG9uZzI+ICZ5KQorCXsKKwkJQ29uc3RhbnQgKnNodWZmbGVbMl07CisJCXNodWZmbGVbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKTsKKwkJc2h1ZmZsZVsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDMpOworCisJCVZhbHVlICpwYWNrZWQgPSBOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKHgudmFsdWUsIHkudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHNodWZmbGUsIDIpKTsKKworCQlyZXR1cm4gUlZhbHVlPExvbmcyPihwYWNrZWQpOworCX0KKworCUxvbmcyICpMb25nMjo6Z2V0VGhpcygpCisJeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwljb25zdCBUeXBlICpMb25nMjo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KExvbmc6OmdldFR5cGUoKSwgMik7CisJfQorCisJVUludDo6VUludChBcmd1bWVudCAqYXJndW1lbnQpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoYXJndW1lbnQsIGFkZHJlc3MpOworCX0KKworCVVJbnQ6OlVJbnQoY29uc3QgUlZhbHVlPFVTaG9ydD4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmludGVnZXIgPSBOdWNsZXVzOjpjcmVhdGVaRXh0KGNhc3QudmFsdWUsIFVJbnQ6OmdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW50ZWdlciwgYWRkcmVzcyk7CisJfQorCisJVUludDo6VUludChjb25zdCBSVmFsdWU8TG9uZz4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmludGVnZXIgPSBOdWNsZXVzOjpjcmVhdGVUcnVuYyhjYXN0LnZhbHVlLCBVSW50OjpnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGludGVnZXIsIGFkZHJlc3MpOworCX0KKworCVVJbnQ6OlVJbnQoY29uc3QgUlZhbHVlPEZsb2F0PiAmY2FzdCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqaW50ZWdlciA9IE51Y2xldXM6OmNyZWF0ZUZQVG9TSShjYXN0LnZhbHVlLCBVSW50OjpnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGludGVnZXIsIGFkZHJlc3MpOworCX0KKworCVVJbnQ6OlVJbnQoKQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCX0KKworCVVJbnQ6OlVJbnQoaW50IHgpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeCksIGFkZHJlc3MpOworCX0KKworCVVJbnQ6OlVJbnQodW5zaWduZWQgaW50IHgpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeCksIGFkZHJlc3MpOworCX0KKworCVVJbnQ6OlVJbnQoY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlVSW50OjpVSW50KGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlVSW50OjpVSW50KGNvbnN0IFVJbnQgJnJocykKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCX0KKworCVVJbnQ6OlVJbnQoY29uc3QgSW50ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8VUludD4gVUludDo6b3BlcmF0b3I9KHVuc2lnbmVkIGludCByaHMpIGNvbnN0CisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQ+KE51Y2xldXM6OmNyZWF0ZVN0b3JlKE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHJocyksIGFkZHJlc3MpKTsKKwl9CisKKwlSVmFsdWU8VUludD4gVUludDo6b3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxVSW50PiBVSW50OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEludD4gJnJocykgY29uc3QKKwl7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJoczsKKwl9CisKKwlSVmFsdWU8VUludD4gVUludDo6b3BlcmF0b3I9KGNvbnN0IFVJbnQgJnJocykgY29uc3QKKwl7CisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIFJWYWx1ZTxVSW50Pih2YWx1ZSk7CisJfQorCisJUlZhbHVlPFVJbnQ+IFVJbnQ6Om9wZXJhdG9yPShjb25zdCBJbnQgJnJocykgY29uc3QKKwl7CisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIFJWYWx1ZTxVSW50Pih2YWx1ZSk7CisJfQorCisJUlZhbHVlPFBvaW50ZXI8VUludD4+IFVJbnQ6Om9wZXJhdG9yJigpCisJeworCQlyZXR1cm4gUlZhbHVlPFBvaW50ZXI8VUludD4+KGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxVSW50PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFVJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50PihOdWNsZXVzOjpjcmVhdGVBZGQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VUludD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VUludD4oTnVjbGV1czo6Y3JlYXRlU3ViKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQ+KE51Y2xldXM6OmNyZWF0ZU11bChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVSW50PiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPFVJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50PihOdWNsZXVzOjpjcmVhdGVVRGl2KGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQ+KE51Y2xldXM6OmNyZWF0ZVVSZW0obGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VUludD4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VUludD4oTnVjbGV1czo6Y3JlYXRlQW5kKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQ+KE51Y2xldXM6OmNyZWF0ZU9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQ+KE51Y2xldXM6OmNyZWF0ZVhvcihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVSW50PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VUludD4oTnVjbGV1czo6Y3JlYXRlU2hsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFVJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50PihOdWNsZXVzOjpjcmVhdGVMU2hyKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yKz0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKyByaHM7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yLT0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLSByaHM7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yKj0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKiByaHM7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yLz0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLyByaHM7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yJT0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJSByaHM7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yJj0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJiByaHM7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yfD0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgfCByaHM7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yXj0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgXiByaHM7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yPDw9KGNvbnN0IFVJbnQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIDw8IHJoczsKKwl9CisKKwlSVmFsdWU8VUludD4gb3BlcmF0b3I+Pj0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPj4gcmhzOworCX0KKworCVJWYWx1ZTxVSW50PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFVJbnQ+ICZ2YWwpCisJeworCQlyZXR1cm4gdmFsOworCX0KKworCVJWYWx1ZTxVSW50PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVJbnQ+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQ+KE51Y2xldXM6OmNyZWF0ZU5lZyh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VUludD4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxVSW50PiAmdmFsKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50PihOdWNsZXVzOjpjcmVhdGVOb3QodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yKysoY29uc3QgVUludCAmdmFsLCBpbnQpICAgLy8gUG9zdC1pbmNyZW1lbnQKKwl7CisJCVJWYWx1ZTxVSW50PiByZXMgPSB2YWw7CisKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZUFkZChyZXMudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW5jLCB2YWwuYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisKKwljb25zdCBVSW50ICZvcGVyYXRvcisrKGNvbnN0IFVJbnQgJnZhbCkgICAvLyBQcmUtaW5jcmVtZW50CisJeworCQlWYWx1ZSAqaW5jID0gTnVjbGV1czo6Y3JlYXRlQWRkKE51Y2xldXM6OmNyZWF0ZUxvYWQodmFsLmFkZHJlc3MpLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yLS0oY29uc3QgVUludCAmdmFsLCBpbnQpICAgLy8gUG9zdC1kZWNyZW1lbnQKKwl7CisJCVJWYWx1ZTxVSW50PiByZXMgPSB2YWw7CisKKwkJVmFsdWUgKmluYyA9IE51Y2xldXM6OmNyZWF0ZVN1YihyZXMudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW5jLCB2YWwuYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisKKwljb25zdCBVSW50ICZvcGVyYXRvci0tKGNvbnN0IFVJbnQgJnZhbCkgICAvLyBQcmUtZGVjcmVtZW50CisJeworCQlWYWx1ZSAqaW5jID0gTnVjbGV1czo6Y3JlYXRlU3ViKE51Y2xldXM6OmNyZWF0ZUxvYWQodmFsLmFkZHJlc3MpLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKSk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKGluYywgdmFsLmFkZHJlc3MpOworCisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUlDbXBVTFQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8PShjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUlDbXBVTEUobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+KGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFVHVChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcFVHRShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvciE9KGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlSUNtcE5FKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPT0oY29uc3QgUlZhbHVlPFVJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVJQ21wRVEobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKy8vCVJWYWx1ZTxVSW50PiBSb3VuZFVJbnQoY29uc3QgUlZhbHVlPEZsb2F0PiAmY2FzdCkKKy8vCXsKKy8vCQlyZXR1cm4geDg2OjpjdnRzczJzaSh2YWwpOyAgIC8vIEZJWE1FOiBVbnNpZ25lZAorLy8KKy8vCS8vCXJldHVybiBJZlRoZW5FbHNlKHZhbCA+IEZsb2F0KDApLCBJbnQodmFsICsgRmxvYXQoMC41ZikpLCBJbnQodmFsIC0gRmxvYXQoMC41ZikpKTsKKy8vCX0KKworCVVJbnQgKlVJbnQ6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqVUludDo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVHlwZTo6Z2V0SW50MzJUeSgqTnVjbGV1czo6Z2V0Q29udGV4dCgpKTsKKwl9CisKKwlJbnQyOjpJbnQyKGNvbnN0IFJWYWx1ZTxJbnQ+ICZjYXN0KQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICpleHRlbmQgPSBOdWNsZXVzOjpjcmVhdGVaRXh0KGNhc3QudmFsdWUsIExvbmc6OmdldFR5cGUoKSk7CisJCVZhbHVlICp2ZWN0b3IgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGV4dGVuZCwgSW50Mjo6Z2V0VHlwZSgpKTsKKwkJCisJCUNvbnN0YW50ICpzaHVmZmxlWzJdOworCQlzaHVmZmxlWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCXNodWZmbGVbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKworCQlWYWx1ZSAqcmVwbGljYXRlID0gTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3Rvcih2ZWN0b3IsIFVuZGVmVmFsdWU6OmdldChJbnQyOjpnZXRUeXBlKCkpLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3RvcihzaHVmZmxlLCAyKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmVwbGljYXRlLCBhZGRyZXNzKTsKKwl9CisKKwlJbnQyOjpJbnQyKGNvbnN0IFJWYWx1ZTxJbnQ0PiAmY2FzdCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqbG9uZzIgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGNhc3QudmFsdWUsIExvbmcyOjpnZXRUeXBlKCkpOworCQlWYWx1ZSAqZWxlbWVudCA9IE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KGxvbmcyLCAwKTsKKwkJVmFsdWUgKmludDIgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGVsZW1lbnQsIEludDI6OmdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW50MiwgYWRkcmVzcyk7CisJfQorCisJSW50Mjo6SW50MigpCisJeworCS8vCXh5LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKwl9CisKKwlJbnQyOjpJbnQyKGludCB4LCBpbnQgeSkKKwl7CisJLy8JeHkucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCUNvbnN0YW50ICpjb25zdGFudFZlY3RvclsyXTsKKwkJY29uc3RhbnRWZWN0b3JbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh4KTsKKwkJY29uc3RhbnRWZWN0b3JbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh5KTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihjb25zdGFudFZlY3RvciwgMiksIGFkZHJlc3MpOworCX0KKworCUludDI6OkludDIoY29uc3QgUlZhbHVlPEludDI+ICZyaHMpCisJeworCS8vCXh5LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCX0KKworCUludDI6OkludDIoY29uc3QgSW50MiAmcmhzKQorCXsKKwkvLwl4eS5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8SW50Mj4gSW50Mjo6b3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxJbnQyPiBJbnQyOjpvcGVyYXRvcj0oY29uc3QgSW50MiAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPEludDI+KHZhbHVlKTsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50Mj4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludDI+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8SW50Mj4gJmxocywgY29uc3QgUlZhbHVlPEludDI+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEludDI+KE51Y2xldXM6OmNyZWF0ZVN1YihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQyPiBvcGVyYXRvciooY29uc3QgUlZhbHVlPEludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQyPihOdWNsZXVzOjpjcmVhdGVNdWwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50Mj4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlU0RpdihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQyPiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPEludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQyPihOdWNsZXVzOjpjcmVhdGVTUmVtKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludDI+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8SW50Mj4gJmxocywgY29uc3QgUlZhbHVlPEludDI+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEludDI+KE51Y2xldXM6OmNyZWF0ZUFuZChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQyPiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPEludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQyPihOdWNsZXVzOjpjcmVhdGVPcihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQyPiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPEludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQyPihOdWNsZXVzOjpjcmVhdGVYb3IobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8SW50Mj4gJmxocywgdW5zaWduZWQgY2hhciByaHMpCisJeworCS8vCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlU2hsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisKKwkJcmV0dXJuIHg4Njo6cHNsbGQobGhzLCByaHMpOworCX0KKworCVJWYWx1ZTxJbnQyPiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxJbnQyPihOdWNsZXVzOjpjcmVhdGVBU2hyKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisKKwkJcmV0dXJuIHg4Njo6cHNyYWQobGhzLCByaHMpOworCX0KKworCVJWYWx1ZTxJbnQyPiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpCisJeworCS8vCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlU2hsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisKKwkJcmV0dXJuIHg4Njo6cHNsbGQobGhzLCByaHMpOworCX0KKworCVJWYWx1ZTxJbnQyPiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpCisJeworCS8vCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlQVNocihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCisJCXJldHVybiB4ODY6OnBzcmFkKGxocywgcmhzKTsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3IrPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyArIHJoczsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3ItPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAtIHJoczsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3IqPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAqIHJoczsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3IvPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAvIHJoczsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3IlPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAlIHJoczsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3ImPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAmIHJoczsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3J8PShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyB8IHJoczsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3JePShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyBeIHJoczsKKwl9CisKKwlSVmFsdWU8SW50Mj4gb3BlcmF0b3I8PD0oY29uc3QgSW50MiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPDwgcmhzOworCX0KKworCVJWYWx1ZTxJbnQyPiBvcGVyYXRvcj4+PShjb25zdCBJbnQyICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA+PiByaHM7CisJfQorCisJUlZhbHVlPEludDI+IG9wZXJhdG9yPDw9KGNvbnN0IEludDIgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA8PCByaHM7CisJfQorCisJUlZhbHVlPEludDI+IG9wZXJhdG9yPj49KGNvbnN0IEludDIgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA+PiByaHM7CisJfQorCisJUlZhbHVlPEludDI+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8SW50Mj4gJnZhbCkKKwl7CisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPEludDI+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8SW50Mj4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlTmVnKHZhbC52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQyPiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPEludDI+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPEludDI+KE51Y2xldXM6OmNyZWF0ZU5vdCh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8TG9uZzE+IFVucGFja0xvdyhjb25zdCBSVmFsdWU8SW50Mj4gJngsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmeSkKKwl7CisJCUNvbnN0YW50ICpzaHVmZmxlWzJdOworCQlzaHVmZmxlWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCXNodWZmbGVbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKTsKKworCQlWYWx1ZSAqcGFja2VkID0gTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3Rvcih4LnZhbHVlLCB5LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3RvcihzaHVmZmxlLCAyKSk7CisKKwkJcmV0dXJuIFJWYWx1ZTxMb25nMT4oTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChwYWNrZWQsIExvbmcxOjpnZXRUeXBlKCkpKTsKKwl9CisJCisJUlZhbHVlPExvbmcxPiBVbnBhY2tIaWdoKGNvbnN0IFJWYWx1ZTxJbnQyPiAmeCwgY29uc3QgUlZhbHVlPEludDI+ICZ5KQorCXsKKwkJQ29uc3RhbnQgKnNodWZmbGVbMl07CisJCXNodWZmbGVbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKTsKKwkJc2h1ZmZsZVsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDMpOworCisJCVZhbHVlICpwYWNrZWQgPSBOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKHgudmFsdWUsIHkudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHNodWZmbGUsIDIpKTsKKworCQlyZXR1cm4gUlZhbHVlPExvbmcxPihOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KHBhY2tlZCwgTG9uZzE6OmdldFR5cGUoKSkpOworCX0KKworCVJWYWx1ZTxJbnQ+IEV4dHJhY3QoY29uc3QgUlZhbHVlPEludDI+ICZ2YWwsIGludCBpKQorCXsKKwkJaWYoZmFsc2UpICAgLy8gRklYTUU6IExMVk0gZG9lcyBub3QgZ2VuZXJhdGUgb3B0aW1hbCBjb2RlCisJCXsKKwkJCXJldHVybiBSVmFsdWU8SW50PihOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudCh2YWwudmFsdWUsIGkpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKGkgPT0gMCkKKwkJCXsKKwkJCQlyZXR1cm4gUlZhbHVlPEludD4oTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQodmFsLnZhbHVlLCAwKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSW50MiB2YWwyID0gQXM8SW50Mj4oVW5wYWNrSGlnaCh2YWwsIHZhbCkpOworCisJCQkJcmV0dXJuIEV4dHJhY3QodmFsMiwgMCk7CisJCQl9CisJCX0KKwl9CisKKwkvLyBGSVhNRTogQ3Jhc2hlcyBMTFZNCisvLwlSVmFsdWU8SW50Mj4gSW5zZXJ0KGNvbnN0IFJWYWx1ZTxJbnQyPiAmdmFsLCBjb25zdCBSVmFsdWU8SW50PiAmZWxlbWVudCwgaW50IGkpCisvLwl7CisvLwkJcmV0dXJuIFJWYWx1ZTxJbnQyPihOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KHZhbC52YWx1ZSwgZWxlbWVudC52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoaSkpKTsKKy8vCX0KKworCUludDIgKkludDI6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqSW50Mjo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KEludDo6Z2V0VHlwZSgpLCAyKTsKKwl9CisKKwlVSW50Mjo6VUludDIoKQorCXsKKwkvLwl4eS5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisJfQorCisJVUludDI6OlVJbnQyKHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgeSkKKwl7CisJLy8JeHkucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCUNvbnN0YW50ICpjb25zdGFudFZlY3RvclsyXTsKKwkJY29uc3RhbnRWZWN0b3JbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh4KTsKKwkJY29uc3RhbnRWZWN0b3JbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh5KTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihjb25zdGFudFZlY3RvciwgMiksIGFkZHJlc3MpOworCX0KKworCVVJbnQyOjpVSW50Mihjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpCisJeworCS8vCXh5LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCX0KKworCVVJbnQyOjpVSW50Mihjb25zdCBVSW50MiAmcmhzKQorCXsKKwkvLwl4eS5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8VUludDI+IFVJbnQyOjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxVSW50Mj4gVUludDI6Om9wZXJhdG9yPShjb25zdCBVSW50MiAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPFVJbnQyPih2YWx1ZSk7CisJfQorCisJUlZhbHVlPFVJbnQyPiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQyPihOdWNsZXVzOjpjcmVhdGVBZGQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VUludDI+KE51Y2xldXM6OmNyZWF0ZVN1YihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVSW50Mj4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxVSW50Mj4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50Mj4oTnVjbGV1czo6Y3JlYXRlTXVsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQyPiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQyPihOdWNsZXVzOjpjcmVhdGVVRGl2KGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQyPiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQyPihOdWNsZXVzOjpjcmVhdGVVUmVtKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQyPiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQyPihOdWNsZXVzOjpjcmVhdGVBbmQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VUludDI+KE51Y2xldXM6OmNyZWF0ZU9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQyPiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQyPihOdWNsZXVzOjpjcmVhdGVYb3IobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxVSW50Mj4oTnVjbGV1czo6Y3JlYXRlU2hsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisKKwkJcmV0dXJuIEFzPFVJbnQyPih4ODY6OnBzbGxkKEFzPEludDI+KGxocyksIHJocykpOworCX0KKworCVJWYWx1ZTxVSW50Mj4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKQorCXsKKwkvLwlyZXR1cm4gUlZhbHVlPFVJbnQyPihOdWNsZXVzOjpjcmVhdGVMU2hyKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisKKwkJcmV0dXJuIHg4Njo6cHNybGQobGhzLCByaHMpOworCX0KKworCVJWYWx1ZTxVSW50Mj4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxVSW50Mj4oTnVjbGV1czo6Y3JlYXRlU2hsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisKKwkJcmV0dXJuIEFzPFVJbnQyPih4ODY6OnBzbGxkKEFzPEludDI+KGxocyksIHJocykpOworCX0KKworCVJWYWx1ZTxVSW50Mj4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxVSW50Mj4oTnVjbGV1czo6Y3JlYXRlTFNocihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCisJCXJldHVybiB4ODY6OnBzcmxkKGxocywgcmhzKTsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yKz0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyArIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yLT0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAtIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yKj0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAqIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yLz0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAvIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yJT0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAlIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yJj0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAmIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yfD0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyB8IHJoczsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yXj0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyBeIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yPDw9KGNvbnN0IFVJbnQyICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA8PCByaHM7CisJfQorCisJUlZhbHVlPFVJbnQyPiBvcGVyYXRvcj4+PShjb25zdCBVSW50MiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPj4gcmhzOworCX0KKworCVJWYWx1ZTxVSW50Mj4gb3BlcmF0b3I8PD0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA8PCByaHM7CisJfQorCisJUlZhbHVlPFVJbnQyPiBvcGVyYXRvcj4+PShjb25zdCBVSW50MiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzID4+IHJoczsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8VUludDI+ICZ2YWwpCisJeworCQlyZXR1cm4gdmFsOworCX0KKworCVJWYWx1ZTxVSW50Mj4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8VUludDI+KE51Y2xldXM6OmNyZWF0ZU5lZyh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VUludDI+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8VUludDI+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQyPihOdWNsZXVzOjpjcmVhdGVOb3QodmFsLnZhbHVlKSk7CisJfQorCisJVUludDIgKlVJbnQyOjpnZXRUaGlzKCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKworCWNvbnN0IFR5cGUgKlVJbnQyOjpnZXRUeXBlKCkKKwl7CisJCXJldHVybiBJbnQyOjpnZXRUeXBlKCk7CisJfQorCisJSW50NDo6SW50NChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmY2FzdCkKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnh5encgPSBOdWNsZXVzOjpjcmVhdGVGUFRvU0koY2FzdC52YWx1ZSwgSW50NDo6Z2V0VHlwZSgpKTsKKwkvLwlWYWx1ZSAqeHl6dyA9IHg4Njo6Y3Z0dHBzMmRxKGNhc3QpLnZhbHVlOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHh5encsIGFkZHJlc3MpOworCX0KKworCUludDQ6OkludDQoKQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKwl9CisKKwlJbnQ0OjpJbnQ0KGludCB4eXp3KQorCXsKKwkJY29uc3RhbnQoeHl6dywgeHl6dywgeHl6dywgeHl6dyk7CisJfQorCisJSW50NDo6SW50NChpbnQgeCwgaW50IHl6dykKKwl7CisJCWNvbnN0YW50KHgsIHl6dywgeXp3LCB5encpOworCX0KKworCUludDQ6OkludDQoaW50IHgsIGludCB5LCBpbnQgencpCisJeworCQljb25zdGFudCh4LCB5LCB6dywgencpOworCX0KKworCUludDQ6OkludDQoaW50IHgsIGludCB5LCBpbnQgeiwgaW50IHcpCisJeworCQljb25zdGFudCh4LCB5LCB6LCB3KTsKKwl9CisKKwl2b2lkIEludDQ6OmNvbnN0YW50KGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlDb25zdGFudCAqY29uc3RhbnRWZWN0b3JbNF07CisJCWNvbnN0YW50VmVjdG9yWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeCk7CisJCWNvbnN0YW50VmVjdG9yWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeSk7CisJCWNvbnN0YW50VmVjdG9yWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeik7CisJCWNvbnN0YW50VmVjdG9yWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQodyk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3IoY29uc3RhbnRWZWN0b3IsIDQpLCBhZGRyZXNzKTsKKwl9CisKKwlJbnQ0OjpJbnQ0KGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCX0KKworCUludDQ6OkludDQoY29uc3QgSW50NCAmcmhzKQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxJbnQ0PiBJbnQ0OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpIGNvbnN0CisJeworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyaHMudmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiByaHM7CisJfQorCisJUlZhbHVlPEludDQ+IEludDQ6Om9wZXJhdG9yPShjb25zdCBJbnQ0ICZyaHMpIGNvbnN0CisJeworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCisJCXJldHVybiBSVmFsdWU8SW50ND4odmFsdWUpOworCX0KKworCVJWYWx1ZTxJbnQ0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVBZGQobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50ND4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlU3ViKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8SW50ND4gJmxocywgY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZU11bChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQ0PiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPEludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVTRGl2KGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8SW50ND4gJmxocywgY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZVNSZW0obGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50ND4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlQW5kKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8SW50ND4gJmxocywgY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZU9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8SW50ND4gJmxocywgY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZVhvcihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxJbnQ0PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxJbnQ0PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVTaGwobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKworCQlyZXR1cm4geDg2Ojpwc2xsZChsaHMsIHJocyk7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPEludDQ+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKQorCXsKKwkvLwlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZUFTaHIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKworCQlyZXR1cm4geDg2Ojpwc3JhZChsaHMsIHJocyk7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yKz0oY29uc3QgSW50NCAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKyByaHM7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yLT0oY29uc3QgSW50NCAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLSByaHM7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yKj0oY29uc3QgSW50NCAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKiByaHM7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yLz0oY29uc3QgSW50NCAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLyByaHM7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yJT0oY29uc3QgSW50NCAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJSByaHM7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yJj0oY29uc3QgSW50NCAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgJiByaHM7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yfD0oY29uc3QgSW50NCAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgfCByaHM7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yXj0oY29uc3QgSW50NCAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgXiByaHM7CisJfQorCisJUlZhbHVlPEludDQ+IG9wZXJhdG9yPDw9KGNvbnN0IEludDQgJmxocywgdW5zaWduZWQgY2hhciByaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIDw8IHJoczsKKwl9CisKKwlSVmFsdWU8SW50ND4gb3BlcmF0b3I+Pj0oY29uc3QgSW50NCAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPj4gcmhzOworCX0KKworCVJWYWx1ZTxJbnQ0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEludDQ+ICZ2YWwpCisJeworCQlyZXR1cm4gdmFsOworCX0KKworCVJWYWx1ZTxJbnQ0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEludDQ+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZU5lZyh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8SW50ND4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxJbnQ0PiAmdmFsKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVOb3QodmFsLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEludDQ+IFJvdW5kSW50KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZjYXN0KQorCXsKKwkJcmV0dXJuIHg4Njo6Y3Z0cHMyZHEoY2FzdCk7CisJfQorCisJUlZhbHVlPFNob3J0OD4gUGFjayhjb25zdCBSVmFsdWU8SW50ND4gJngsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmeSkKKwl7CisJCXJldHVybiB4ODY6OnBhY2tzc2R3KHgsIHkpOworCX0KKworCVJWYWx1ZTxJbnQ0PiBDb25jYXRlbmF0ZShjb25zdCBSVmFsdWU8SW50Mj4gJmxvLCBjb25zdCBSVmFsdWU8SW50Mj4gJmhpKQorCXsKKwkJVmFsdWUgKmxvTG9uZyA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QobG8udmFsdWUsIExvbmc6OmdldFR5cGUoKSk7CisJCVZhbHVlICpoaUxvbmcgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGhpLnZhbHVlLCBMb25nOjpnZXRUeXBlKCkpOworCisJCVZhbHVlICpsb25nMiA9IFVuZGVmVmFsdWU6OmdldChMb25nMjo6Z2V0VHlwZSgpKTsKKwkJbG9uZzIgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KGxvbmcyLCBsb0xvbmcsIDApOworCQlsb25nMiA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQobG9uZzIsIGhpTG9uZywgMSk7CisJCVZhbHVlICppbnQ0ID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChsb25nMiwgSW50NDo6Z2V0VHlwZSgpKTsKKworCQlyZXR1cm4gUlZhbHVlPEludDQ+KGludDQpOworCX0KKworCVJWYWx1ZTxJbnQ+IEV4dHJhY3QoY29uc3QgUlZhbHVlPEludDQ+ICZ4LCBpbnQgaSkKKwl7CisJCXJldHVybiBSVmFsdWU8SW50PihOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudCh4LnZhbHVlLCBpKSk7CisJfQorCisJUlZhbHVlPEludDQ+IEluc2VydChjb25zdCBSVmFsdWU8SW50ND4gJngsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZlbGVtZW50LCBpbnQgaSkKKwl7CisJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudCh4LnZhbHVlLCBlbGVtZW50LnZhbHVlLCBpKSk7CisJfQorCisJUlZhbHVlPEludD4gU2lnbk1hc2soY29uc3QgUlZhbHVlPEludDQ+ICZ4KQorCXsKKwkJcmV0dXJuIHg4Njo6bW92bXNrcHMoQXM8RmxvYXQ0Pih4KSk7CisJfQorCisJUlZhbHVlPEludDQ+IFN3aXp6bGUoY29uc3QgUlZhbHVlPEludDQ+ICZ4LCB1bnNpZ25lZCBjaGFyIHNlbGVjdCkKKwl7CisJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlU3dpenpsZSh4LnZhbHVlLCBzZWxlY3QpKTsKKwl9CisKKwlJbnQ0ICpJbnQ0OjpnZXRUaGlzKCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKworCWNvbnN0IFR5cGUgKkludDQ6OmdldFR5cGUoKQorCXsKKwkJcmV0dXJuIFZlY3RvclR5cGU6OmdldChJbnQ6OmdldFR5cGUoKSwgNCk7CisJfQorCisJVUludDQ6OlVJbnQ0KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZjYXN0KQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqeHl6dyA9IE51Y2xldXM6OmNyZWF0ZUZQVG9VSShjYXN0LnZhbHVlLCBVSW50NDo6Z2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh4eXp3LCBhZGRyZXNzKTsKKwl9CisKKwlVSW50NDo6VUludDQoKQorCXsKKwkvLwl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKwl9CisKKwlVSW50NDo6VUludDQodW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCB5LCB1bnNpZ25lZCBpbnQgeiwgdW5zaWduZWQgaW50IHcpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCUNvbnN0YW50ICpjb25zdGFudFZlY3Rvcls0XTsKKwkJY29uc3RhbnRWZWN0b3JbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh4KTsKKwkJY29uc3RhbnRWZWN0b3JbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh5KTsKKwkJY29uc3RhbnRWZWN0b3JbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh6KTsKKwkJY29uc3RhbnRWZWN0b3JbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh3KTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihjb25zdGFudFZlY3RvciwgNCksIGFkZHJlc3MpOworCX0KKworCVVJbnQ0OjpVSW50NChjb25zdCBSVmFsdWU8VUludDQ+ICZyaHMpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJVUludDQ6OlVJbnQ0KGNvbnN0IFVJbnQ0ICZyaHMpCisJeworCS8vCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJUlZhbHVlPFVJbnQ0PiBVSW50NDo6b3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocykgY29uc3QKKwl7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDQ+IFVJbnQ0OjpvcGVyYXRvcj0oY29uc3QgVUludDQgJnJocykgY29uc3QKKwl7CisJCVZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh2YWx1ZSwgYWRkcmVzcyk7CisKKwkJcmV0dXJuIFJWYWx1ZTxVSW50ND4odmFsdWUpOworCX0KKworCVJWYWx1ZTxVSW50ND4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxVSW50ND4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50ND4oTnVjbGV1czo6Y3JlYXRlQWRkKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQ0PihOdWNsZXVzOjpjcmVhdGVTdWIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8VUludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8VUludDQ+KE51Y2xldXM6OmNyZWF0ZU11bChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVSW50ND4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxVSW50ND4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50ND4oTnVjbGV1czo6Y3JlYXRlVURpdihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVSW50ND4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxVSW50ND4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50ND4oTnVjbGV1czo6Y3JlYXRlVVJlbShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVSW50ND4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxVSW50ND4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50ND4oTnVjbGV1czo6Y3JlYXRlQW5kKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPFVJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPFVJbnQ0PihOdWNsZXVzOjpjcmVhdGVPcihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVSW50ND4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxVSW50ND4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50ND4oTnVjbGV1czo6Y3JlYXRlWG9yKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxVSW50ND4gJmxocywgdW5zaWduZWQgY2hhciByaHMpCisJeworCS8vCXJldHVybiBSVmFsdWU8VUludDQ+KE51Y2xldXM6OmNyZWF0ZVNobChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCisJCXJldHVybiBBczxVSW50ND4oeDg2Ojpwc2xsZChBczxJbnQ0PihsaHMpLCByaHMpKTsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFVJbnQ0PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJLy8JcmV0dXJuIFJWYWx1ZTxVSW50ND4oTnVjbGV1czo6Y3JlYXRlTFNocihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCisJCXJldHVybiB4ODY6OnBzcmxkKGxocywgcmhzKTsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yKz0oY29uc3QgVUludDQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyArIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yLT0oY29uc3QgVUludDQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAtIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yKj0oY29uc3QgVUludDQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAqIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yLz0oY29uc3QgVUludDQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAvIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yJT0oY29uc3QgVUludDQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAlIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yJj0oY29uc3QgVUludDQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAmIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yfD0oY29uc3QgVUludDQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyB8IHJoczsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yXj0oY29uc3QgVUludDQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyBeIHJoczsKKwl9CisKKwlSVmFsdWU8VUludDQ+IG9wZXJhdG9yPDw9KGNvbnN0IFVJbnQ0ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyA8PCByaHM7CisJfQorCisJUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcj4+PShjb25zdCBVSW50NCAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocykKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgPj4gcmhzOworCX0KKworCVJWYWx1ZTxVSW50ND4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxVSW50ND4gJnZhbCkKKwl7CisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPFVJbnQ0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVJbnQ0PiAmdmFsKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxVSW50ND4oTnVjbGV1czo6Y3JlYXRlTmVnKHZhbC52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxVSW50ND4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxVSW50ND4gJnZhbCkKKwl7CisJCXJldHVybiBSVmFsdWU8VUludDQ+KE51Y2xldXM6OmNyZWF0ZU5vdCh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8VVNob3J0OD4gUGFjayhjb25zdCBSVmFsdWU8VUludDQ+ICZ4LCBjb25zdCBSVmFsdWU8VUludDQ+ICZ5KQorCXsKKwkJcmV0dXJuIHg4Njo6cGFja3VzZHcoeCwgeSk7ICAgLy8gRklYTUU6IEZhbGxiYWNrIHJlcXVpcmVkCisJfQorCisJUlZhbHVlPFVJbnQ0PiBDb25jYXRlbmF0ZShjb25zdCBSVmFsdWU8VUludDI+ICZsbywgY29uc3QgUlZhbHVlPFVJbnQyPiAmaGkpCisJeworCQlWYWx1ZSAqbG9Mb25nID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChsby52YWx1ZSwgTG9uZzo6Z2V0VHlwZSgpKTsKKwkJVmFsdWUgKmhpTG9uZyA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoaGkudmFsdWUsIExvbmc6OmdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmxvbmcyID0gVW5kZWZWYWx1ZTo6Z2V0KExvbmcyOjpnZXRUeXBlKCkpOworCQlsb25nMiA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQobG9uZzIsIGxvTG9uZywgMCk7CisJCWxvbmcyID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudChsb25nMiwgaGlMb25nLCAxKTsKKwkJVmFsdWUgKnVpbnQ0ID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChsb25nMiwgSW50NDo6Z2V0VHlwZSgpKTsKKworCQlyZXR1cm4gUlZhbHVlPFVJbnQ0Pih1aW50NCk7CisJfQorCisJVUludDQgKlVJbnQ0OjpnZXRUaGlzKCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKworCWNvbnN0IFR5cGUgKlVJbnQ0OjpnZXRUeXBlKCkKKwl7CisJCXJldHVybiBWZWN0b3JUeXBlOjpnZXQoVUludDo6Z2V0VHlwZSgpLCA0KTsKKwl9CisKKwlGbG9hdDo6RmxvYXQoY29uc3QgUlZhbHVlPEludD4gJmNhc3QpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmludGVnZXIgPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoY2FzdC52YWx1ZSwgRmxvYXQ6OmdldFR5cGUoKSk7CisKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoaW50ZWdlciwgYWRkcmVzcyk7CisJfQorCisJRmxvYXQ6OkZsb2F0KCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKwl9CisKKwlGbG9hdDo6RmxvYXQoZmxvYXQgeCkKKwl7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVDb25zdGFudEZsb2F0KHgpLCBhZGRyZXNzKTsKKwl9CisKKwlGbG9hdDo6RmxvYXQoY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKQorCXsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJRmxvYXQ6OkZsb2F0KGNvbnN0IEZsb2F0ICZyaHMpCisJeworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ+IEZsb2F0OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxGbG9hdD4gRmxvYXQ6Om9wZXJhdG9yPShjb25zdCBGbG9hdCAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPEZsb2F0Pih2YWx1ZSk7CisJfQorCisJUlZhbHVlPFBvaW50ZXI8RmxvYXQ+PiBGbG9hdDo6b3BlcmF0b3ImKCkKKwl7CisJCXJldHVybiBSVmFsdWU8UG9pbnRlcjxGbG9hdD4+KGFkZHJlc3MpOworCX0KKworCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxGbG9hdD4oTnVjbGV1czo6Y3JlYXRlRkFkZChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxGbG9hdD4oTnVjbGV1czo6Y3JlYXRlRlN1YihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxGbG9hdD4oTnVjbGV1czo6Y3JlYXRlRk11bChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxGbG9hdD4oTnVjbGV1czo6Y3JlYXRlRkRpdihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IrPShjb25zdCBGbG9hdCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICsgcmhzOworCX0KKworCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3ItPShjb25zdCBGbG9hdCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIC0gcmhzOworCX0KKworCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IqPShjb25zdCBGbG9hdCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICogcmhzOworCX0KKworCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IvPShjb25zdCBGbG9hdCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpCisJeworCQlyZXR1cm4gbGhzID0gbGhzIC8gcmhzOworCX0KKworCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnZhbCkKKwl7CisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPEZsb2F0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEZsb2F0PiAmdmFsKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxGbG9hdD4oTnVjbGV1czo6Y3JlYXRlRk5lZyh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVGQ21wT0xUKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPD0oY29uc3QgUlZhbHVlPEZsb2F0PiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUZDbXBPTEUobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVGQ21wT0dUKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEJvb2w+IG9wZXJhdG9yPj0oY29uc3QgUlZhbHVlPEZsb2F0PiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEJvb2w+KE51Y2xldXM6OmNyZWF0ZUZDbXBPR0UobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhPShjb25zdCBSVmFsdWU8RmxvYXQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8Qm9vbD4oTnVjbGV1czo6Y3JlYXRlRkNtcE9ORShsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxCb29sPihOdWNsZXVzOjpjcmVhdGVGQ21wT0VRKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEZsb2F0PiBBYnMoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCkKKwl7CisJCXJldHVybiBJZlRoZW5FbHNlKHggPiBGbG9hdCgwKSwgeCwgLXgpOworCX0KKworCVJWYWx1ZTxGbG9hdD4gTWF4KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnkpCisJeworCQlyZXR1cm4gSWZUaGVuRWxzZSh4ID4geSwgeCwgeSk7CisJfQorCisJUlZhbHVlPEZsb2F0PiBNaW4oY29uc3QgUlZhbHVlPEZsb2F0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0PiAmeSkKKwl7CisJCXJldHVybiBJZlRoZW5FbHNlKHggPCB5LCB4LCB5KTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ+IFJjcF9wcChjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4KQorCXsKKwkJcmV0dXJuIHg4Njo6cmNwc3MoeCk7CisJfQorCQorCVJWYWx1ZTxGbG9hdD4gUmNwU3FydF9wcChjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4KQorCXsKKwkJcmV0dXJuIHg4Njo6cnNxcnRzcyh4KTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ+IFNxcnQoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCkKKwl7CisJCXJldHVybiB4ODY6OnNxcnRzcyh4KTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ+IEZyYWN0aW9uKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJngpCisJeworCQlpZihDUFVJRDo6c3VwcG9ydHNTU0U0XzEoKSkKKwkJeworCQkJcmV0dXJuIHggLSB4ODY6OmZsb29yc3MoeCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gRmxvYXQ0KEZyYWN0aW9uKEZsb2F0NCh4KSkpLng7CisJCX0KKwl9CisKKwlSVmFsdWU8RmxvYXQ+IEZsb29yKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJngpCisJeworCQlpZihDUFVJRDo6c3VwcG9ydHNTU0U0XzEoKSkKKwkJeworCQkJcmV0dXJuIHg4Njo6Zmxvb3Jzcyh4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiBGbG9hdDQoRmxvb3IoRmxvYXQ0KHgpKSkueDsKKwkJfQorCX0KKworCUZsb2F0ICpGbG9hdDo6Z2V0VGhpcygpCisJeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwljb25zdCBUeXBlICpGbG9hdDo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVHlwZTo6Z2V0RmxvYXRUeSgqTnVjbGV1czo6Z2V0Q29udGV4dCgpKTsKKwl9CisKKwlGbG9hdDI6OkZsb2F0Mihjb25zdCBSVmFsdWU8RmxvYXQ0PiAmY2FzdCkKKwl7CisJLy8JeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKmludDY0eDIgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGNhc3QudmFsdWUsIExvbmcyOjpnZXRUeXBlKCkpOworCQlWYWx1ZSAqaW50NjQgPSBOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudChpbnQ2NHgyLCAwKTsKKwkJVmFsdWUgKmZsb2F0MiA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoaW50NjQsIEZsb2F0Mjo6Z2V0VHlwZSgpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShmbG9hdDIsIGFkZHJlc3MpOworCX0KKworCUZsb2F0MiAqRmxvYXQyOjpnZXRUaGlzKCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKworCWNvbnN0IFR5cGUgKkZsb2F0Mjo6Z2V0VHlwZSgpCisJeworCQlyZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KEZsb2F0OjpnZXRUeXBlKCksIDIpOworCX0KKworCUZsb2F0NDo6RmxvYXQ0KGNvbnN0IFJWYWx1ZTxCeXRlND4gJmNhc3QpCisJeworCQl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQkjaWYgMAorCQkJVmFsdWUgKnh5encgPSBOdWNsZXVzOjpjcmVhdGVVSVRvRlAoY2FzdC52YWx1ZSwgRmxvYXQ0OjpnZXRUeXBlKCkpOyAgIC8vIEZJWE1FOiBDcmFzaGVzCisJCSNlbGlmIDAKKwkJCVZhbHVlICp2ZWN0b3IgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKGFkZHJlc3MpOworCisJCQlWYWx1ZSAqaTh4ID0gTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQoY2FzdC52YWx1ZSwgMCk7CisJCQlWYWx1ZSAqZjMyeCA9IE51Y2xldXM6OmNyZWF0ZVVJVG9GUChpOHgsIEZsb2F0OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKnggPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KHZlY3RvciwgZjMyeCwgMCk7CisKKwkJCVZhbHVlICppOHkgPSBOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudChjYXN0LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKSk7CisJCQlWYWx1ZSAqZjMyeSA9IE51Y2xldXM6OmNyZWF0ZVVJVG9GUChpOHksIEZsb2F0OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKnh5ID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudCh4LCBmMzJ5LCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKSk7CisKKwkJCVZhbHVlICppOHogPSBOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudChjYXN0LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKSk7CisJCQlWYWx1ZSAqZjMyeiA9IE51Y2xldXM6OmNyZWF0ZVVJVG9GUChpOHosIEZsb2F0OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKnh5eiA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQoeHksIGYzMnosIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIpKTsKKworCQkJVmFsdWUgKmk4dyA9IE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KGNhc3QudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDMpKTsKKwkJCVZhbHVlICpmMzJ3ID0gTnVjbGV1czo6Y3JlYXRlVUlUb0ZQKGk4dywgRmxvYXQ6OmdldFR5cGUoKSk7CisJCQlWYWx1ZSAqeHl6dyA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQoeHl6LCBmMzJ3LCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKSk7CisJCSNlbHNlCisJCQlWYWx1ZSAqeCA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoY2FzdC52YWx1ZSwgSW50OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKmEgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KFVuZGVmVmFsdWU6OmdldChJbnQ0OjpnZXRUeXBlKCkpLCB4LCAwKTsKKworCQkJVmFsdWUgKmU7CisKKwkJCWlmKENQVUlEOjpzdXBwb3J0c1NTRTRfMSgpKQorCQkJeworCQkJCWUgPSB4ODY6OnBtb3Z6eGJkKFJWYWx1ZTxJbnQ0PihhKSkudmFsdWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQ29uc3RhbnQgKnN3aXp6bGVbMTZdOworCQkJCXN3aXp6bGVbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKwkJCQlzd2l6emxlWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTYpOworCQkJCXN3aXp6bGVbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKTsKKwkJCQlzd2l6emxlWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTcpOworCQkJCXN3aXp6bGVbNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKTsKKwkJCQlzd2l6emxlWzVdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTgpOworCQkJCXN3aXp6bGVbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKTsKKwkJCQlzd2l6emxlWzddID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTkpOworCQkJCXN3aXp6bGVbOF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg0KTsKKwkJCQlzd2l6emxlWzldID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMjApOworCQkJCXN3aXp6bGVbMTBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNSk7CisJCQkJc3dpenpsZVsxMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyMSk7CisJCQkJc3dpenpsZVsxMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg2KTsKKwkJCQlzd2l6emxlWzEzXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIyKTsKKwkJCQlzd2l6emxlWzE0XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDcpOworCQkJCXN3aXp6bGVbMTVdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMjMpOworCisJCQkJVmFsdWUgKmIgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGEsIEJ5dGUxNjo6Z2V0VHlwZSgpKTsKKwkJCQlWYWx1ZSAqYyA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3IoYiwgTnVjbGV1czo6Y3JlYXRlTnVsbFZhbHVlKEJ5dGUxNjo6Z2V0VHlwZSgpKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3Ioc3dpenpsZSwgMTYpKTsKKworCQkJCUNvbnN0YW50ICpzd2l6emxlMls4XTsKKwkJCQlzd2l6emxlMlswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCQkJCXN3aXp6bGUyWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoOCk7CisJCQkJc3dpenpsZTJbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKTsKKwkJCQlzd2l6emxlMlszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDkpOworCQkJCXN3aXp6bGUyWzRdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMik7CisJCQkJc3dpenpsZTJbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxMCk7CisJCQkJc3dpenpsZTJbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKTsKKwkJCQlzd2l6emxlMls3XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDExKTsKKworCQkJCVZhbHVlICpkID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChjLCBTaG9ydDg6OmdldFR5cGUoKSk7CisJCQkJZSA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3IoZCwgTnVjbGV1czo6Y3JlYXRlTnVsbFZhbHVlKFNob3J0ODo6Z2V0VHlwZSgpKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3Ioc3dpenpsZTIsIDgpKTsKKwkJCX0KKworCQkJVmFsdWUgKmYgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGUsIEludDQ6OmdldFR5cGUoKSk7CisJCS8vCVZhbHVlICpnID0gTnVjbGV1czo6Y3JlYXRlU0lUb0ZQKGYsIEZsb2F0NDo6Z2V0VHlwZSgpKTsKKwkJCVZhbHVlICpnID0geDg2OjpjdnRkcTJwcyhSVmFsdWU8SW50ND4oZikpLnZhbHVlOworCQkJVmFsdWUgKnh5encgPSBnOworCQkjZW5kaWYKKwkJCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHh5encsIGFkZHJlc3MpOworCX0KKworCUZsb2F0NDo6RmxvYXQ0KGNvbnN0IFJWYWx1ZTxTQnl0ZTQ+ICZjYXN0KQorCXsKKwkJeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJI2lmIDAKKwkJCVZhbHVlICp4eXp3ID0gTnVjbGV1czo6Y3JlYXRlU0lUb0ZQKGNhc3QudmFsdWUsIEZsb2F0NDo6Z2V0VHlwZSgpKTsgICAvLyBGSVhNRTogQ3Jhc2hlcworCQkjZWxpZiAwCisJCQlWYWx1ZSAqdmVjdG9yID0gTnVjbGV1czo6Y3JlYXRlTG9hZChhZGRyZXNzKTsKKworCQkJVmFsdWUgKmk4eCA9IE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KGNhc3QudmFsdWUsIDApOworCQkJVmFsdWUgKmYzMnggPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoaTh4LCBGbG9hdDo6Z2V0VHlwZSgpKTsKKwkJCVZhbHVlICp4ID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudCh2ZWN0b3IsIGYzMngsIDApOworCisJCQlWYWx1ZSAqaTh5ID0gTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQoY2FzdC52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSkpOworCQkJVmFsdWUgKmYzMnkgPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoaTh5LCBGbG9hdDo6Z2V0VHlwZSgpKTsKKwkJCVZhbHVlICp4eSA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQoeCwgZjMyeSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSkpOworCisJCQlWYWx1ZSAqaTh6ID0gTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQoY2FzdC52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMikpOworCQkJVmFsdWUgKmYzMnogPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoaTh6LCBGbG9hdDo6Z2V0VHlwZSgpKTsKKwkJCVZhbHVlICp4eXogPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KHh5LCBmMzJ6LCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKSk7CisKKwkJCVZhbHVlICppOHcgPSBOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudChjYXN0LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKSk7CisJCQlWYWx1ZSAqZjMydyA9IE51Y2xldXM6OmNyZWF0ZVNJVG9GUChpOHcsIEZsb2F0OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKnh5encgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KHh5eiwgZjMydywgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMykpOworCQkjZWxzZQorCQkJVmFsdWUgKnggPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGNhc3QudmFsdWUsIEludDo6Z2V0VHlwZSgpKTsKKwkJCVZhbHVlICphID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudChVbmRlZlZhbHVlOjpnZXQoSW50NDo6Z2V0VHlwZSgpKSwgeCwgMCk7CisKKwkJCVZhbHVlICpnOworCisJCQlpZihDUFVJRDo6c3VwcG9ydHNTU0U0XzEoKSkKKwkJCXsKKwkJCQlnID0geDg2OjpwbW92c3hiZChSVmFsdWU8SW50ND4oYSkpLnZhbHVlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUNvbnN0YW50ICpzd2l6emxlWzE2XTsKKwkJCQlzd2l6emxlWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCQkJc3dpenpsZVsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCQkJCXN3aXp6bGVbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKTsKKwkJCQlzd2l6emxlWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSk7CisJCQkJc3dpenpsZVs0XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIpOworCQkJCXN3aXp6bGVbNV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKTsKKwkJCQlzd2l6emxlWzZdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMyk7CisJCQkJc3dpenpsZVs3XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDMpOworCQkJCXN3aXp6bGVbOF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg0KTsKKwkJCQlzd2l6emxlWzldID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNCk7CisJCQkJc3dpenpsZVsxMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg1KTsKKwkJCQlzd2l6emxlWzExXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDUpOworCQkJCXN3aXp6bGVbMTJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNik7CisJCQkJc3dpenpsZVsxM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg2KTsKKwkJCQlzd2l6emxlWzE0XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDcpOworCQkJCXN3aXp6bGVbMTVdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNyk7CisKKwkJCQlWYWx1ZSAqYiA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoYSwgQnl0ZTE2OjpnZXRUeXBlKCkpOworCQkJCVZhbHVlICpjID0gTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3RvcihiLCBiLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihzd2l6emxlLCAxNikpOworCisJCQkJQ29uc3RhbnQgKnN3aXp6bGUyWzhdOworCQkJCXN3aXp6bGUyWzBdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCQkJc3dpenpsZTJbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKwkJCQlzd2l6emxlMlsyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpOworCQkJCXN3aXp6bGUyWzNdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSk7CisJCQkJc3dpenpsZTJbNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKTsKKwkJCQlzd2l6emxlMls1XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIpOworCQkJCXN3aXp6bGUyWzZdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMyk7CisJCQkJc3dpenpsZTJbN10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKTsKKworCQkJCVZhbHVlICpkID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChjLCBTaG9ydDg6OmdldFR5cGUoKSk7CisJCQkJVmFsdWUgKmUgPSBOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKGQsIGQsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHN3aXp6bGUyLCA4KSk7CisKKwkJCQlWYWx1ZSAqZiA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoZSwgSW50NDo6Z2V0VHlwZSgpKTsKKwkJCS8vCWcgPSBOdWNsZXVzOjpjcmVhdGVBU2hyKGYsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDI0KSk7CisJCQkJZyA9IHg4Njo6cHNyYWQoUlZhbHVlPEludDQ+KGYpLCAyNCkudmFsdWU7CisJCQl9CisKKwkJLy8JVmFsdWUgKmggPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoZywgRmxvYXQ0OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKmggPSB4ODY6OmN2dGRxMnBzKFJWYWx1ZTxJbnQ0PihnKSkudmFsdWU7CisJCQlWYWx1ZSAqeHl6dyA9IGg7CisJCSNlbmRpZgorCQkKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoeHl6dywgYWRkcmVzcyk7CisJfQorCisJRmxvYXQ0OjpGbG9hdDQoY29uc3QgUlZhbHVlPFNob3J0ND4gJmNhc3QpCisJeworCQl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQkjaWYgMAorCQkJVmFsdWUgKnh5encgPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoY2FzdC52YWx1ZSwgRmxvYXQ0OjpnZXRUeXBlKCkpOyAgIC8vIEZJWE1FOiBDcmFzaGVzCisJCSNlbGlmIDAKKwkJCVZhbHVlICp2ZWN0b3IgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKGFkZHJlc3MpOworCisJCQlWYWx1ZSAqaTE2eCA9IE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KGNhc3QudmFsdWUsIDApOworCQkJVmFsdWUgKmYzMnggPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoaTE2eCwgRmxvYXQ6OmdldFR5cGUoKSk7CisJCQlWYWx1ZSAqeCA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQodmVjdG9yLCBmMzJ4LCAwKTsKKworCQkJVmFsdWUgKmkxNnkgPSBOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudChjYXN0LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKSk7CisJCQlWYWx1ZSAqZjMyeSA9IE51Y2xldXM6OmNyZWF0ZVNJVG9GUChpMTZ5LCBGbG9hdDo6Z2V0VHlwZSgpKTsKKwkJCVZhbHVlICp4eSA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQoeCwgZjMyeSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSkpOworCisJCQlWYWx1ZSAqaTE2eiA9IE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KGNhc3QudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIpKTsKKwkJCVZhbHVlICpmMzJ6ID0gTnVjbGV1czo6Y3JlYXRlU0lUb0ZQKGkxNnosIEZsb2F0OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKnh5eiA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQoeHksIGYzMnosIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIpKTsKKworCQkJVmFsdWUgKmkxNncgPSBOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudChjYXN0LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKSk7CisJCQlWYWx1ZSAqZjMydyA9IE51Y2xldXM6OmNyZWF0ZVNJVG9GUChpMTZ3LCBGbG9hdDo6Z2V0VHlwZSgpKTsKKwkJCVZhbHVlICp4eXp3ID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudCh4eXosIGYzMncsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDMpKTsKKwkJI2Vsc2UKKwkJCVZhbHVlICpsb25nMiA9IFVuZGVmVmFsdWU6OmdldChMb25nMjo6Z2V0VHlwZSgpKTsKKwkJCVZhbHVlICplbGVtZW50ID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChjYXN0LnZhbHVlLCBMb25nOjpnZXRUeXBlKCkpOworCQkJbG9uZzIgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KGxvbmcyLCBlbGVtZW50LCAwKTsKKwkJCVJWYWx1ZTxJbnQ0PiB2ZWN0b3IgPSBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChsb25nMiwgSW50NDo6Z2V0VHlwZSgpKSk7CisKKwkJCVZhbHVlICp4eXp3OworCisJCQlpZihDUFVJRDo6c3VwcG9ydHNTU0U0XzEoKSkKKwkJCXsKKwkJCQlWYWx1ZSAqYyA9IHg4Njo6cG1vdnN4d2QodmVjdG9yKS52YWx1ZTsKKworCQkJCS8vIHh5encgPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoZCwgRmxvYXQ0OjpnZXRUeXBlKCkpOworCQkJCXh5encgPSB4ODY6OmN2dGRxMnBzKFJWYWx1ZTxJbnQ0PihjKSkudmFsdWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJVmFsdWUgKmIgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KHZlY3Rvci52YWx1ZSwgU2hvcnQ4OjpnZXRUeXBlKCkpOworCisJCQkJQ29uc3RhbnQgKnN3aXp6bGVbOF07CisJCQkJc3dpenpsZVswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCQkJCXN3aXp6bGVbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKwkJCQlzd2l6emxlWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSk7CisJCQkJc3dpenpsZVszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpOworCQkJCXN3aXp6bGVbNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKTsKKwkJCQlzd2l6emxlWzVdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMik7CisJCQkJc3dpenpsZVs2XSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDMpOworCQkJCXN3aXp6bGVbN10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKTsKKwkJCQkKKwkJCQlWYWx1ZSAqYyA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3IoYiwgYiwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3Ioc3dpenpsZSwgOCkpOworCQkJCVZhbHVlICpkID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChjLCBJbnQ0OjpnZXRUeXBlKCkpOworCisJCQkJLy8gVmFsdWUgKmUgPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoZCwgRmxvYXQ0OjpnZXRUeXBlKCkpOworCQkJCVZhbHVlICplID0geDg2OjpjdnRkcTJwcyhSVmFsdWU8SW50ND4oZCkpLnZhbHVlOworCQkJCQorCQkJCUNvbnN0YW50ICpjb25zdGFudFZlY3Rvcls0XTsKKwkJCQljb25zdGFudFZlY3RvclswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50RmxvYXQoMS4wZiAvICgxIDw8IDE2KSk7CisJCQkJY29uc3RhbnRWZWN0b3JbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEZsb2F0KDEuMGYgLyAoMSA8PCAxNikpOworCQkJCWNvbnN0YW50VmVjdG9yWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRGbG9hdCgxLjBmIC8gKDEgPDwgMTYpKTsKKwkJCQljb25zdGFudFZlY3RvclszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50RmxvYXQoMS4wZiAvICgxIDw8IDE2KSk7CisKKwkJCQl4eXp3ID0gTnVjbGV1czo6Y3JlYXRlRk11bChlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3Rvcihjb25zdGFudFZlY3RvciwgNCkpOworCQkJfQorCQkjZW5kaWYKKwkJCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHh5encsIGFkZHJlc3MpOworCX0KKworCUZsb2F0NDo6RmxvYXQ0KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmY2FzdCkKKwl7CisJCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCSNpZiAwCisJCQlWYWx1ZSAqeHl6dyA9IE51Y2xldXM6OmNyZWF0ZVVJVG9GUChjYXN0LnZhbHVlLCBGbG9hdDQ6OmdldFR5cGUoKSk7ICAgLy8gRklYTUU6IENyYXNoZXMKKwkJI2VsaWYgMAorCQkJVmFsdWUgKnZlY3RvciA9IE51Y2xldXM6OmNyZWF0ZUxvYWQoYWRkcmVzcyk7CisKKwkJCVZhbHVlICppMTZ4ID0gTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQoY2FzdC52YWx1ZSwgMCk7CisJCQlWYWx1ZSAqZjMyeCA9IE51Y2xldXM6OmNyZWF0ZVVJVG9GUChpMTZ4LCBGbG9hdDo6Z2V0VHlwZSgpKTsKKwkJCVZhbHVlICp4ID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudCh2ZWN0b3IsIGYzMngsIDApOworCisJCQlWYWx1ZSAqaTE2eSA9IE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KGNhc3QudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDEpKTsKKwkJCVZhbHVlICpmMzJ5ID0gTnVjbGV1czo6Y3JlYXRlVUlUb0ZQKGkxNnksIEZsb2F0OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKnh5ID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudCh4LCBmMzJ5LCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKSk7CisKKwkJCVZhbHVlICppMTZ6ID0gTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQoY2FzdC52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMikpOworCQkJVmFsdWUgKmYzMnogPSBOdWNsZXVzOjpjcmVhdGVVSVRvRlAoaTE2eiwgRmxvYXQ6OmdldFR5cGUoKSk7CisJCQlWYWx1ZSAqeHl6ID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudCh4eSwgZjMyeiwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMikpOworCisJCQlWYWx1ZSAqaTE2dyA9IE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KGNhc3QudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDMpKTsKKwkJCVZhbHVlICpmMzJ3ID0gTnVjbGV1czo6Y3JlYXRlVUlUb0ZQKGkxNncsIEZsb2F0OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKnh5encgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KHh5eiwgZjMydywgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMykpOworCQkjZWxzZQorCQkJVmFsdWUgKmxvbmcyID0gVW5kZWZWYWx1ZTo6Z2V0KExvbmcyOjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKmVsZW1lbnQgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGNhc3QudmFsdWUsIExvbmc6OmdldFR5cGUoKSk7CisJCQlsb25nMiA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQobG9uZzIsIGVsZW1lbnQsIDApOworCQkJUlZhbHVlPEludDQ+IHZlY3RvciA9IFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KGxvbmcyLCBJbnQ0OjpnZXRUeXBlKCkpKTsKKworCQkJVmFsdWUgKmM7CisJCQkJCisJCQlpZihDUFVJRDo6c3VwcG9ydHNTU0U0XzEoKSkKKwkJCXsKKwkJCQljID0geDg2OjpwbW92enh3ZChSVmFsdWU8SW50ND4odmVjdG9yKSkudmFsdWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJVmFsdWUgKmIgPSBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KHZlY3Rvci52YWx1ZSwgU2hvcnQ4OjpnZXRUeXBlKCkpOworCisJCQkJQ29uc3RhbnQgKnN3aXp6bGVbOF07CisJCQkJc3dpenpsZVswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCQkJCXN3aXp6bGVbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCg4KTsKKwkJCQlzd2l6emxlWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMSk7CisJCQkJc3dpenpsZVszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDkpOworCQkJCXN3aXp6bGVbNF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgyKTsKKwkJCQlzd2l6emxlWzVdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTApOworCQkJCXN3aXp6bGVbNl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKTsKKwkJCQlzd2l6emxlWzddID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMTEpOworCisJCQkJYyA9IE51Y2xldXM6OmNyZWF0ZVNodWZmbGVWZWN0b3IoYiwgTnVjbGV1czo6Y3JlYXRlTnVsbFZhbHVlKFNob3J0ODo6Z2V0VHlwZSgpKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3Ioc3dpenpsZSwgOCkpOworCQkJfQorCisJCQlWYWx1ZSAqZCA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoYywgSW50NDo6Z2V0VHlwZSgpKTsKKwkJLy8JVmFsdWUgKmUgPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoZCwgRmxvYXQ0OjpnZXRUeXBlKCkpOworCQkJVmFsdWUgKmUgPSB4ODY6OmN2dGRxMnBzKFJWYWx1ZTxJbnQ0PihkKSkudmFsdWU7CisJCQlWYWx1ZSAqeHl6dyA9IGU7CisJCSNlbmRpZgorCQkKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUoeHl6dywgYWRkcmVzcyk7CisJfQorCisJRmxvYXQ0OjpGbG9hdDQoY29uc3QgUlZhbHVlPEludDQ+ICZjYXN0KQorCXsKKwkJeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnh5encgPSBOdWNsZXVzOjpjcmVhdGVTSVRvRlAoY2FzdC52YWx1ZSwgRmxvYXQ0OjpnZXRUeXBlKCkpOworCS8vCVZhbHVlICp4eXp3ID0geDg2OjpjdnRkcTJwcyhjYXN0KS52YWx1ZTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZSh4eXp3LCBhZGRyZXNzKTsKKwl9CisKKwlGbG9hdDQ6OkZsb2F0NChjb25zdCBSVmFsdWU8VUludDQ+ICZjYXN0KQorCXsKKwkJeHl6dy5wYXJlbnQgPSB0aGlzOworCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7CisKKwkJVmFsdWUgKnh5encgPSBOdWNsZXVzOjpjcmVhdGVVSVRvRlAoY2FzdC52YWx1ZSwgRmxvYXQ0OjpnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHh5encsIGFkZHJlc3MpOworCX0KKworCUZsb2F0NDo6RmxvYXQ0KCkKKwl7CisJCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCX0KKwkKKwlGbG9hdDQ6OkZsb2F0NChmbG9hdCB4eXp3KQorCXsKKwkJY29uc3RhbnQoeHl6dywgeHl6dywgeHl6dywgeHl6dyk7CisJfQorCisJRmxvYXQ0OjpGbG9hdDQoZmxvYXQgeCwgZmxvYXQgeXp3KQorCXsKKwkJY29uc3RhbnQoeCwgeXp3LCB5encsIHl6dyk7CisJfQorCisJRmxvYXQ0OjpGbG9hdDQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgencpCisJeworCQljb25zdGFudCh4LCB5LCB6dywgencpOworCX0KKworCUZsb2F0NDo6RmxvYXQ0KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcpCisJeworCQljb25zdGFudCh4LCB5LCB6LCB3KTsKKwl9CisKKwl2b2lkIEZsb2F0NDo6Y29uc3RhbnQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdykKKwl7CisJCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCUNvbnN0YW50ICpjb25zdGFudFZlY3Rvcls0XTsKKwkJY29uc3RhbnRWZWN0b3JbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEZsb2F0KHgpOworCQljb25zdGFudFZlY3RvclsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50RmxvYXQoeSk7CisJCWNvbnN0YW50VmVjdG9yWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRGbG9hdCh6KTsKKwkJY29uc3RhbnRWZWN0b3JbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEZsb2F0KHcpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKGNvbnN0YW50VmVjdG9yLCA0KSwgYWRkcmVzcyk7CisJfQorCisJRmxvYXQ0OjpGbG9hdDQoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnJocykKKwl7CisJCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7CisJfQorCisJRmxvYXQ0OjpGbG9hdDQoY29uc3QgRmxvYXQ0ICZyaHMpCisJeworCQl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOworCX0KKworCUZsb2F0NDo6RmxvYXQ0KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocykKKwl7CisJCXh5encucGFyZW50ID0gdGhpczsKKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOworCisJCVZhbHVlICp2ZWN0b3IgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKGFkZHJlc3MpOworCQlWYWx1ZSAqaW5zZXJ0ID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudCh2ZWN0b3IsIHJocy52YWx1ZSwgMCk7CisKKwkJQ29uc3RhbnQgKnN3aXp6bGVbNF07CisJCXN3aXp6bGVbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKwkJc3dpenpsZVsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCQlzd2l6emxlWzJdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCXN3aXp6bGVbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKworCQlWYWx1ZSAqcmVwbGljYXRlID0gTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3RvcihpbnNlcnQsIFVuZGVmVmFsdWU6OmdldChGbG9hdDQ6OmdldFR5cGUoKSksIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHN3aXp6bGUsIDQpKTsKKworCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShyZXBsaWNhdGUsIGFkZHJlc3MpOworCX0KKworCUZsb2F0NDo6RmxvYXQ0KGNvbnN0IEZsb2F0ICZyaHMpCisJeworCQl4eXp3LnBhcmVudCA9IHRoaXM7CisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoZ2V0VHlwZSgpKTsKKworCQlWYWx1ZSAqdmVjdG9yID0gTnVjbGV1czo6Y3JlYXRlTG9hZChhZGRyZXNzKTsKKwkJVmFsdWUgKmVsZW1lbnQgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsKKwkJVmFsdWUgKmluc2VydCA9IE51Y2xldXM6OmNyZWF0ZUluc2VydEVsZW1lbnQodmVjdG9yLCBlbGVtZW50LCAwKTsKKworCQlDb25zdGFudCAqc3dpenpsZVs0XTsKKwkJc3dpenpsZVswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCQlzd2l6emxlWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoMCk7CisJCXN3aXp6bGVbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgwKTsKKwkJc3dpenpsZVszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCisJCVZhbHVlICpyZXBsaWNhdGUgPSBOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKGluc2VydCwgVW5kZWZWYWx1ZTo6Z2V0KEZsb2F0NDo6Z2V0VHlwZSgpKSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3Ioc3dpenpsZSwgNCkpOworCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJlcGxpY2F0ZSwgYWRkcmVzcyk7CisJfQorCisJUlZhbHVlPEZsb2F0ND4gRmxvYXQ0OjpvcGVyYXRvcj0oZmxvYXQgeCkgY29uc3QKKwl7CisJCXJldHVybiAqdGhpcyA9IEZsb2F0NCh4LCB4LCB4LCB4KTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBGbG9hdDQ6Om9wZXJhdG9yPShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKSBjb25zdAorCXsKKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gcmhzOworCX0KKworCVJWYWx1ZTxGbG9hdDQ+IEZsb2F0NDo6b3BlcmF0b3I9KGNvbnN0IEZsb2F0NCAmcmhzKSBjb25zdAorCXsKKwkJVmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZChyaHMuYWRkcmVzcyk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4odmFsdWUpOworCX0KKworCVJWYWx1ZTxGbG9hdDQ+IEZsb2F0NDo6b3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocykgY29uc3QKKwl7CisJCXJldHVybiAqdGhpcyA9IEZsb2F0NChyaHMpOworCX0KKworCVJWYWx1ZTxGbG9hdDQ+IEZsb2F0NDo6b3BlcmF0b3I9KGNvbnN0IEZsb2F0ICZyaHMpIGNvbnN0CisJeworCQlyZXR1cm4gKnRoaXMgPSBGbG9hdDQocmhzKTsKKwl9CisKKwlSVmFsdWU8UG9pbnRlcjxGbG9hdDQ+PiBGbG9hdDQ6Om9wZXJhdG9yJigpCisJeworCQlyZXR1cm4gUlZhbHVlPFBvaW50ZXI8RmxvYXQ0Pj4oYWRkcmVzcyk7CisJfQorCisJUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlRkFkZChsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxGbG9hdDQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxGbG9hdDQ+KE51Y2xldXM6OmNyZWF0ZUZTdWIobGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvciooY29uc3QgUlZhbHVlPEZsb2F0ND4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnJocykKKwl7CisJCXJldHVybiBSVmFsdWU8RmxvYXQ0PihOdWNsZXVzOjpjcmVhdGVGTXVsKGxocy52YWx1ZSwgcmhzLnZhbHVlKSk7CisJfQorCisJUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZyaHMpCisJeworCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlRkRpdihsaHMudmFsdWUsIHJocy52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxGbG9hdDQ+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxGbG9hdDQ+KE51Y2xldXM6OmNyZWF0ZUZSZW0obGhzLnZhbHVlLCByaHMudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcis9KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyArIHJoczsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvci09KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAtIHJoczsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcio9KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAqIHJoczsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvci89KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAvIHJoczsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvciU9KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAlIHJoczsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCkKKwl7CisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwpCisJeworCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlRk5lZyh2YWwudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBBYnMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngpCisJeworCQlWYWx1ZSAqdmVjdG9yID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdCh4LnZhbHVlLCBJbnQ0OjpnZXRUeXBlKCkpOworCisJCUNvbnN0YW50ICpjb25zdGFudFZlY3Rvcls0XTsKKwkJY29uc3RhbnRWZWN0b3JbMF0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgweDdGRkZGRkZGKTsKKwkJY29uc3RhbnRWZWN0b3JbMV0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgweDdGRkZGRkZGKTsKKwkJY29uc3RhbnRWZWN0b3JbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgweDdGRkZGRkZGKTsKKwkJY29uc3RhbnRWZWN0b3JbM10gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgweDdGRkZGRkZGKTsKKworCQlWYWx1ZSAqcmVzdWx0ID0gTnVjbGV1czo6Y3JlYXRlQW5kKHZlY3RvciwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRWZWN0b3IoY29uc3RhbnRWZWN0b3IsIDQpKTsKKworCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChyZXN1bHQsIEZsb2F0NDo6Z2V0VHlwZSgpKSk7CisJfQorCisJUlZhbHVlPEZsb2F0ND4gTWF4KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSkKKwl7CisJCXJldHVybiB4ODY6Om1heHBzKHgsIHkpOworCX0KKworCVJWYWx1ZTxGbG9hdDQ+IE1pbihjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpCisJeworCQlyZXR1cm4geDg2OjptaW5wcyh4LCB5KTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBSY3BfcHAoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngpCisJeworCQlyZXR1cm4geDg2OjpyY3Bwcyh4KTsKKwl9CisJCisJUlZhbHVlPEZsb2F0ND4gUmNwU3FydF9wcChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCkKKwl7CisJCXJldHVybiB4ODY6OnJzcXJ0cHMoeCk7CisJfQorCisJUlZhbHVlPEZsb2F0ND4gU3FydChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCkKKwl7CisJCXJldHVybiB4ODY6OnNxcnRwcyh4KTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBJbnNlcnQoY29uc3QgRmxvYXQ0ICZ2YWwsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmVsZW1lbnQsIGludCBpKQorCXsKKwkJbGx2bTo6VmFsdWUgKnZhbHVlID0gTnVjbGV1czo6Y3JlYXRlTG9hZCh2YWwuYWRkcmVzcyk7CisJCWxsdm06OlZhbHVlICppbnNlcnQgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KHZhbHVlLCBlbGVtZW50LnZhbHVlLCBpKTsKKworCQl2YWwgPSBSVmFsdWU8RmxvYXQ0PihpbnNlcnQpOworCisJCXJldHVybiB2YWw7CisJfQorCisJUlZhbHVlPEZsb2F0PiBFeHRyYWN0KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBpbnQgaSkKKwl7CisJCXJldHVybiBSVmFsdWU8RmxvYXQ+KE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KHgudmFsdWUsIGkpKTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBTd2l6emxlKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCB1bnNpZ25lZCBjaGFyIHNlbGVjdCkKKwl7CisJCXJldHVybiBSVmFsdWU8RmxvYXQ0PihOdWNsZXVzOjpjcmVhdGVTd2l6emxlKHgudmFsdWUsIHNlbGVjdCkpOworCX0KKworCVJWYWx1ZTxGbG9hdDQ+IFNodWZmbGVMb3dIaWdoKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSwgdW5zaWduZWQgY2hhciBpbW0pCisJeworCQlDb25zdGFudCAqc2h1ZmZsZVs0XTsKKwkJc2h1ZmZsZVswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KCgoaW1tID4+IDApICYgMHgwMykgKyAwKTsKKwkJc2h1ZmZsZVsxXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KCgoaW1tID4+IDIpICYgMHgwMykgKyAwKTsKKwkJc2h1ZmZsZVsyXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KCgoaW1tID4+IDQpICYgMHgwMykgKyA0KTsKKwkJc2h1ZmZsZVszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KCgoaW1tID4+IDYpICYgMHgwMykgKyA0KTsKKworCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlU2h1ZmZsZVZlY3Rvcih4LnZhbHVlLCB5LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudFZlY3RvcihzaHVmZmxlLCA0KSkpOworCX0KKworCVJWYWx1ZTxGbG9hdDQ+IFVucGFja0xvdyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpCisJeworCQlDb25zdGFudCAqc2h1ZmZsZVs0XTsKKwkJc2h1ZmZsZVswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDApOworCQlzaHVmZmxlWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNCk7CisJCXNodWZmbGVbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgxKTsKKwkJc2h1ZmZsZVszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDUpOworCisJCXJldHVybiBSVmFsdWU8RmxvYXQ0PihOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKHgudmFsdWUsIHkudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHNodWZmbGUsIDQpKSk7CisJfQorCisJUlZhbHVlPEZsb2F0ND4gVW5wYWNrSGlnaChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpCisJeworCQlDb25zdGFudCAqc2h1ZmZsZVs0XTsKKwkJc2h1ZmZsZVswXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDIpOworCQlzaHVmZmxlWzFdID0gTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoNik7CisJCXNodWZmbGVbMl0gPSBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCgzKTsKKwkJc2h1ZmZsZVszXSA9IE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KDcpOworCisJCXJldHVybiBSVmFsdWU8RmxvYXQ0PihOdWNsZXVzOjpjcmVhdGVTaHVmZmxlVmVjdG9yKHgudmFsdWUsIHkudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50VmVjdG9yKHNodWZmbGUsIDQpKSk7CisJfQorCQorCVJWYWx1ZTxGbG9hdDQ+IE1hc2soRmxvYXQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZyaHMsIHVuc2lnbmVkIGNoYXIgc2VsZWN0KQorCXsKKwkJVmFsdWUgKnZlY3RvciA9IE51Y2xldXM6OmNyZWF0ZUxvYWQobGhzLmFkZHJlc3MpOworCQlWYWx1ZSAqc2h1ZmZsZSA9IE51Y2xldXM6OmNyZWF0ZU1hc2sodmVjdG9yLCByaHMudmFsdWUsIHNlbGVjdCk7CisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHNodWZmbGUsIGxocy5hZGRyZXNzKTsKKworCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oc2h1ZmZsZSk7CisJfQorCisJUlZhbHVlPEludD4gU2lnbk1hc2soY29uc3QgUlZhbHVlPEZsb2F0ND4gJngpCisJeworCQlyZXR1cm4geDg2Ojptb3Ztc2twcyh4KTsKKwl9CisKKwlSVmFsdWU8SW50ND4gQ21wRVEoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KQorCXsKKwkvLwlyZXR1cm4gQXM8SW50ND4oeDg2OjpjbXBlcXBzKHgsIHkpKTsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVTRXh0KE51Y2xldXM6OmNyZWF0ZUZDbXBPRVEoeC52YWx1ZSwgeS52YWx1ZSksIEludDQ6OmdldFR5cGUoKSkpOworCX0KKworCVJWYWx1ZTxJbnQ0PiBDbXBMVChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpCisJeworCS8vCXJldHVybiBBczxJbnQ0Pih4ODY6OmNtcGx0cHMoeCwgeSkpOworCQlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZVNFeHQoTnVjbGV1czo6Y3JlYXRlRkNtcE9MVCh4LnZhbHVlLCB5LnZhbHVlKSwgSW50NDo6Z2V0VHlwZSgpKSk7CisJfQorCisJUlZhbHVlPEludDQ+IENtcExFKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSkKKwl7CisJLy8JcmV0dXJuIEFzPEludDQ+KHg4Njo6Y21wbGVwcyh4LCB5KSk7CisJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlU0V4dChOdWNsZXVzOjpjcmVhdGVGQ21wT0xFKHgudmFsdWUsIHkudmFsdWUpLCBJbnQ0OjpnZXRUeXBlKCkpKTsKKwl9CisKKwlSVmFsdWU8SW50ND4gQ21wTkVRKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSkKKwl7CisJLy8JcmV0dXJuIEFzPEludDQ+KHg4Njo6Y21wbmVxcHMoeCwgeSkpOworCQlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZVNFeHQoTnVjbGV1czo6Y3JlYXRlRkNtcE9ORSh4LnZhbHVlLCB5LnZhbHVlKSwgSW50NDo6Z2V0VHlwZSgpKSk7CisJfQorCisJUlZhbHVlPEludDQ+IENtcE5MVChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpCisJeworCS8vCXJldHVybiBBczxJbnQ0Pih4ODY6OmNtcG5sdHBzKHgsIHkpKTsKKwkJcmV0dXJuIFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVTRXh0KE51Y2xldXM6OmNyZWF0ZUZDbXBPR0UoeC52YWx1ZSwgeS52YWx1ZSksIEludDQ6OmdldFR5cGUoKSkpOworCX0KKworCVJWYWx1ZTxJbnQ0PiBDbXBOTEUoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KQorCXsKKwkvLwlyZXR1cm4gQXM8SW50ND4oeDg2OjpjbXBubGVwcyh4LCB5KSk7CisJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlU0V4dChOdWNsZXVzOjpjcmVhdGVGQ21wT0dUKHgudmFsdWUsIHkudmFsdWUpLCBJbnQ0OjpnZXRUeXBlKCkpKTsKKwl9CisKKwlSVmFsdWU8RmxvYXQ0PiBGcmFjdGlvbihjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCkKKwl7CisJCWlmKENQVUlEOjpzdXBwb3J0c1NTRTRfMSgpKQorCQl7CisJCQlyZXR1cm4geCAtIHg4Njo6Zmxvb3Jwcyh4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZsb2F0NCBmcmMgPSB4IC0gRmxvYXQ0KEludDQoeCkpOyAgIC8vIFNpZ25lZCBmcmFjdGlvbgorCisJCQlyZXR1cm4gZnJjICsgQXM8RmxvYXQ0PihBczxJbnQ0PihDbXBOTEUoRmxvYXQ0KDAsIDAsIDAsIDApLCBmcmMpKSAmIEFzPEludDQ+KEZsb2F0NCgxLCAxLCAxLCAxKSkpOworCQl9CisJfQorCisJUlZhbHVlPEZsb2F0ND4gRmxvb3IoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngpCisJeworCQlpZihDUFVJRDo6c3VwcG9ydHNTU0U0XzEoKSkKKwkJeworCQkJcmV0dXJuIHg4Njo6Zmxvb3Jwcyh4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZsb2F0NCB0cnVuYyA9IEZsb2F0NChJbnQ0KHgpKTsgICAvLyBSb3VuZGVkIHRvd2FyZCB6ZXJvCisKKwkJCXJldHVybiB0cnVuYyArIEFzPEZsb2F0ND4oQXM8SW50ND4oQ21wTkxFKEZsb2F0NCgwLCAwLCAwLCAwKSwgdHJ1bmMpKSAmIEFzPEludDQ+KEZsb2F0NCgxLCAxLCAxLCAxKSkpOworCQl9CisJfQorCisJRmxvYXQ0ICpGbG9hdDQ6OmdldFRoaXMoKQorCXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJY29uc3QgVHlwZSAqRmxvYXQ0OjpnZXRUeXBlKCkKKwl7CisJCXJldHVybiBWZWN0b3JUeXBlOjpnZXQoRmxvYXQ6OmdldFR5cGUoKSwgNCk7CisJfQorCisJUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gJmxocywgaW50IG9mZnNldCkKKwl7CisJCXJldHVybiBSVmFsdWU8UG9pbnRlcjxCeXRlPj4oTnVjbGV1czo6Y3JlYXRlR0VQKGxocy52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQob2Zmc2V0KSkpOworCX0KKworCVJWYWx1ZTxQb2ludGVyPEJ5dGU+PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZvZmZzZXQpCisJeworCQlyZXR1cm4gUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+KE51Y2xldXM6OmNyZWF0ZUdFUChsaHMudmFsdWUsIG9mZnNldC52YWx1ZSkpOworCX0KKworCVJWYWx1ZTxQb2ludGVyPEJ5dGU+PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmb2Zmc2V0KQorCXsKKwkJcmV0dXJuIFJWYWx1ZTxQb2ludGVyPEJ5dGU+PihOdWNsZXVzOjpjcmVhdGVHRVAobGhzLnZhbHVlLCBvZmZzZXQudmFsdWUpKTsKKwl9CisKKwlSVmFsdWU8UG9pbnRlcjxCeXRlPj4gb3BlcmF0b3IrPShjb25zdCBQb2ludGVyPEJ5dGU+ICZsaHMsIGludCBvZmZzZXQpCisJeworCQlyZXR1cm4gbGhzID0gbGhzICsgb2Zmc2V0OworCX0KKworCVJWYWx1ZTxQb2ludGVyPEJ5dGU+PiBvcGVyYXRvcis9KGNvbnN0IFBvaW50ZXI8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPEludD4gJm9mZnNldCkKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKyBvZmZzZXQ7CisJfQorCisJUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+IG9wZXJhdG9yKz0oY29uc3QgUG9pbnRlcjxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJm9mZnNldCkKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgKyBvZmZzZXQ7CisJfQorCisJUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gJmxocywgaW50IG9mZnNldCkKKwl7CisJCXJldHVybiBsaHMgKyAtb2Zmc2V0OworCX0KKworCVJWYWx1ZTxQb2ludGVyPEJ5dGU+PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZvZmZzZXQpCisJeworCQlyZXR1cm4gbGhzICsgLW9mZnNldDsKKwl9CisKKwlSVmFsdWU8UG9pbnRlcjxCeXRlPj4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxQb2ludGVyPEJ5dGU+PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJm9mZnNldCkKKwl7CisJCXJldHVybiBsaHMgKyAtb2Zmc2V0OworCX0KKworCVJWYWx1ZTxQb2ludGVyPEJ5dGU+PiBvcGVyYXRvci09KGNvbnN0IFBvaW50ZXI8Qnl0ZT4gJmxocywgaW50IG9mZnNldCkKKwl7CisJCXJldHVybiBsaHMgPSBsaHMgLSBvZmZzZXQ7CisJfQorCisJUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+IG9wZXJhdG9yLT0oY29uc3QgUG9pbnRlcjxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmb2Zmc2V0KQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAtIG9mZnNldDsKKwl9CisKKwlSVmFsdWU8UG9pbnRlcjxCeXRlPj4gb3BlcmF0b3ItPShjb25zdCBQb2ludGVyPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmb2Zmc2V0KQorCXsKKwkJcmV0dXJuIGxocyA9IGxocyAtIG9mZnNldDsKKwl9CisKKwl2b2lkIFJldHVybigpCisJeworCQkjaWYgIShkZWZpbmVkKF9NX0FNRDY0KSB8fCBkZWZpbmVkKF9NX1g2NCkpCisJCQl4ODY6OmVtbXMoKTsKKwkJI2VuZGlmCisKKwkJTnVjbGV1czo6Y3JlYXRlUmV0Vm9pZCgpOworCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCkpOworCX0KKworCXZvaWQgUmV0dXJuKGNvbnN0IEludCAmcmV0KQorCXsKKwkJI2lmICEoZGVmaW5lZChfTV9BTUQ2NCkgfHwgZGVmaW5lZChfTV9YNjQpKQorCQkJeDg2OjplbW1zKCk7CisJCSNlbmRpZgorCisJCU51Y2xldXM6OmNyZWF0ZVJldChOdWNsZXVzOjpjcmVhdGVMb2FkKHJldC5hZGRyZXNzKSk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKSk7CisJfQorCisJQmFzaWNCbG9jayAqYmVnaW5Mb29wKCkKKwl7CisJCUJhc2ljQmxvY2sgKmxvb3BCQiA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKworCQlOdWNsZXVzOjpjcmVhdGVCcihsb29wQkIpOworCQlOdWNsZXVzOjpnZXRCdWlsZGVyKCktPlNldEluc2VydFBvaW50KGxvb3BCQik7CisKKwkJcmV0dXJuIGxvb3BCQjsKKwl9CisKKwlib29sIGJyYW5jaChjb25zdCBSVmFsdWU8Qm9vbD4gJmNtcCwgQmFzaWNCbG9jayAqYm9keUJCLCBCYXNpY0Jsb2NrICplbmRCQikKKwl7CisJCU51Y2xldXM6OmNyZWF0ZUNvbmRCcihjbXAudmFsdWUsIGJvZHlCQiwgZW5kQkIpOworCQlOdWNsZXVzOjpnZXRCdWlsZGVyKCktPlNldEluc2VydFBvaW50KGJvZHlCQik7CisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlib29sIGVsc2VCbG9jayhCYXNpY0Jsb2NrICpmYWxzZUJCKQorCXsKKwkJZmFsc2VCQi0+YmFjaygpLmVyYXNlRnJvbVBhcmVudCgpOworCQlOdWNsZXVzOjpnZXRCdWlsZGVyKCktPlNldEluc2VydFBvaW50KGZhbHNlQkIpOworCisJCXJldHVybiB0cnVlOworCX0KKworCVJWYWx1ZTxMb25nPiBUaWNrcygpCisJeworCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQlsbHZtOjpGdW5jdGlvbiAqcmR0c2MgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjpyZWFkY3ljbGVjb3VudGVyKTsKKworCQlyZXR1cm4gUlZhbHVlPExvbmc+KE51Y2xldXM6OmNyZWF0ZUNhbGwocmR0c2MpKTsKKwl9CisKKwl2b2lkIEVtbXMoKQorCXsKKwkJeDg2OjplbW1zKCk7CisJfQorfQorCituYW1lc3BhY2Ugc3cKK3sKKwluYW1lc3BhY2UgeDg2CisJeworCQlSVmFsdWU8SW50PiBjdnRzczJzaShjb25zdCBSVmFsdWU8RmxvYXQ+ICZ2YWwpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqY3Z0c3Myc2kgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlX2N2dHNzMnNpKTsKKwkJCQorCQkJRmxvYXQ0IHZlY3RvcjsKKwkJCXZlY3Rvci54ID0gdmFsOworCisJCQlyZXR1cm4gUlZhbHVlPEludD4oTnVjbGV1czo6Y3JlYXRlQ2FsbChjdnRzczJzaSwgUlZhbHVlPEZsb2F0ND4odmVjdG9yKS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPEludDI+IGN2dHBzMnBpKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqY3Z0cHMycGkgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlX2N2dHBzMnBpKTsKKworCQkJcmV0dXJuIFJWYWx1ZTxJbnQyPihOdWNsZXVzOjpjcmVhdGVDYWxsKGN2dHBzMnBpLCB2YWwudmFsdWUpKTsKKwkJfQorCisJCVJWYWx1ZTxJbnQyPiBjdnR0cHMycGkoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpjdnR0cHMycGkgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlX2N2dHRwczJwaSk7CisKKwkJCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlQ2FsbChjdnR0cHMycGksIHZhbC52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPEludDQ+IGN2dHBzMmRxKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwpCisJCXsKKwkJCWlmKENQVUlEOjpzdXBwb3J0c1NTRTIoKSkKKwkJCXsKKwkJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJCWxsdm06OkZ1bmN0aW9uICpjdnRwczJkcSA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2UyX2N2dHBzMmRxKTsKKworCQkJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChjdnRwczJkcSwgdmFsLnZhbHVlKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSW50MiBsbyA9IHg4Njo6Y3Z0cHMycGkodmFsKTsKKwkJCQlJbnQyIGhpID0geDg2OjpjdnRwczJwaShTd2l6emxlKHZhbCwgMHhFRSkpOworCQkJCQorCQkJCXJldHVybiBDb25jYXRlbmF0ZShsbywgaGkpOworCQkJfQorCQl9CisKKwkJUlZhbHVlPEludDQ+IGN2dHRwczJkcShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmdmFsKQorCQl7CisJCQlpZihDUFVJRDo6c3VwcG9ydHNTU0UyKCkpCisJCQl7CisJCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCQlsbHZtOjpGdW5jdGlvbiAqY3Z0dHBzMmRxID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZTJfY3Z0dHBzMmRxKTsKKworCQkJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChjdnR0cHMyZHEsIHZhbC52YWx1ZSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUludDIgbG8gPSB4ODY6OmN2dHRwczJwaSh2YWwpOworCQkJCUludDIgaGkgPSB4ODY6OmN2dHRwczJwaShTd2l6emxlKHZhbCwgMHhFRSkpOworCQkJCQorCQkJCXJldHVybiBDb25jYXRlbmF0ZShsbywgaGkpOworCQkJfQorCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gY3Z0cGkycHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpjdnRwaTJwcyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0cGkycHMpOworCisJCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChjdnRwaTJwcywgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gY3Z0ZHEycHMoY29uc3QgUlZhbHVlPEludDQ+ICZ2YWwpCisJCXsKKwkJCWlmKENQVUlEOjpzdXBwb3J0c1NTRTIoKSkKKwkJCXsKKwkJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJCWxsdm06OkZ1bmN0aW9uICpjdnRkcTJwcyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2UyX2N2dGRxMnBzKTsKKworCQkJCXJldHVybiBSVmFsdWU8RmxvYXQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKGN2dGRxMnBzLCB2YWwudmFsdWUpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJbnQyIGxvID0gSW50Mih2YWwpOworCQkJCUludDIgaGkgPSBJbnQyKFN3aXp6bGUodmFsLCAweEVFKSk7CisKKwkJCQlGbG9hdDQgc2NyYXRjaDE7CisJCQkJRmxvYXQ0IHNjcmF0Y2gyOworCisJCQkJcmV0dXJuIEZsb2F0NChGbG9hdDQoeDg2OjpjdnRwaTJwcyhzY3JhdGNoMSwgbG8pKS54eSwgRmxvYXQ0KHg4Njo6Y3Z0cGkycHMoc2NyYXRjaDIsIGhpKSkueHkpOworCQkJfQorCQl9CisKKwkJUlZhbHVlPEZsb2F0PiByY3Bzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ2YWwpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcmNwc3MgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlX3JjcF9zcyk7CisKKwkJCVZhbHVlICp2ZWN0b3IgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KFVuZGVmVmFsdWU6OmdldChGbG9hdDQ6OmdldFR5cGUoKSksIHZhbC52YWx1ZSwgMCk7CisJCQkKKwkJCXJldHVybiBSVmFsdWU8RmxvYXQ+KE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KE51Y2xldXM6OmNyZWF0ZUNhbGwocmNwc3MsIHZlY3RvciksIDApKTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdD4gc3FydHNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnZhbCkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpzcXJ0c3MgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlX3NxcnRfc3MpOworCisJCQlWYWx1ZSAqdmVjdG9yID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudChVbmRlZlZhbHVlOjpnZXQoRmxvYXQ0OjpnZXRUeXBlKCkpLCB2YWwudmFsdWUsIDApOworCQkJCisJCQlyZXR1cm4gUlZhbHVlPEZsb2F0PihOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudChOdWNsZXVzOjpjcmVhdGVDYWxsKHNxcnRzcywgdmVjdG9yKSwgMCkpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0PiByc3FydHNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnZhbCkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpyc3FydHNzID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZV9yc3FydF9zcyk7CisJCQkKKwkJCVZhbHVlICp2ZWN0b3IgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KFVuZGVmVmFsdWU6OmdldChGbG9hdDQ6OmdldFR5cGUoKSksIHZhbC52YWx1ZSwgMCk7CisKKwkJCXJldHVybiBSVmFsdWU8RmxvYXQ+KE51Y2xldXM6OmNyZWF0ZUV4dHJhY3RFbGVtZW50KE51Y2xldXM6OmNyZWF0ZUNhbGwocnNxcnRzcywgdmVjdG9yKSwgMCkpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gcmNwcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpyY3BwcyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2VfcmNwX3BzKTsKKwkJCQorCQkJcmV0dXJuIFJWYWx1ZTxGbG9hdDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocmNwcHMsIHZhbC52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gc3FydHBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqc3FydHBzID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZV9zcXJ0X3BzKTsKKwkJCQorCQkJcmV0dXJuIFJWYWx1ZTxGbG9hdDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwoc3FydHBzLCB2YWwudmFsdWUpKTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdDQ+IHJzcXJ0cHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpyc3FydHBzID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZV9yc3FydF9wcyk7CisJCQkKKwkJCXJldHVybiBSVmFsdWU8RmxvYXQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHJzcXJ0cHMsIHZhbC52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gbWF4cHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKm1heHBzID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZV9tYXhfcHMpOworCisJCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChtYXhwcywgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gbWlucHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKm1pbnBzID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZV9taW5fcHMpOworCisJCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChtaW5wcywgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0PiByb3VuZHNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnZhbCwgdW5zaWduZWQgY2hhciBpbW0pCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcm91bmRzcyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2U0MV9yb3VuZF9zcyk7CisKKwkJCVZhbHVlICp1bmRlZiA9IFVuZGVmVmFsdWU6OmdldChGbG9hdDQ6OmdldFR5cGUoKSk7CisJCQlWYWx1ZSAqdmVjdG9yID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudCh1bmRlZiwgdmFsLnZhbHVlLCAwKTsKKworCQkJcmV0dXJuIFJWYWx1ZTxGbG9hdD4oTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQoTnVjbGV1czo6Y3JlYXRlQ2FsbChyb3VuZHNzLCB1bmRlZiwgdmVjdG9yLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludChpbW0pKSwgMCkpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0PiBmbG9vcnNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnZhbCkKKwkJeworCQkJcmV0dXJuIHJvdW5kc3ModmFsLCAxKTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdD4gY2VpbHNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnZhbCkKKwkJeworCQkJcmV0dXJuIHJvdW5kc3ModmFsLCAyKTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdDQ+IHJvdW5kcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCwgdW5zaWduZWQgY2hhciBpbW0pCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcm91bmRwcyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2U0MV9yb3VuZF9wcyk7CisKKwkJCXJldHVybiBSVmFsdWU8RmxvYXQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHJvdW5kcHMsIHZhbC52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoaW1tKSkpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gZmxvb3Jwcyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmdmFsKQorCQl7CisJCQlyZXR1cm4gcm91bmRwcyh2YWwsIDEpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gY2VpbHBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwpCisJCXsKKwkJCXJldHVybiByb3VuZHBzKHZhbCwgMik7CisJCX0KKworCQlSVmFsdWU8RmxvYXQ0PiBjbXBwcyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnksIHVuc2lnbmVkIGNoYXIgaW1tKQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKmNtcHBzID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZV9jbXBfcHMpOworCisJCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChjbXBwcywgeC52YWx1ZSwgeS52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKGltbSkpKTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdDQ+IGNtcGVxcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KQorCQl7CisJCQlyZXR1cm4gY21wcHMoeCwgeSwgMCk7CisJCX0KKworCQlSVmFsdWU8RmxvYXQ0PiBjbXBsdHBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSkKKwkJeworCQkJcmV0dXJuIGNtcHBzKHgsIHksIDEpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gY21wbGVwcyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpCisJCXsKKwkJCXJldHVybiBjbXBwcyh4LCB5LCAyKTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdDQ+IGNtcHVub3JkcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KQorCQl7CisJCQlyZXR1cm4gY21wcHMoeCwgeSwgMyk7CisJCX0KKworCQlSVmFsdWU8RmxvYXQ0PiBjbXBuZXFwcyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpCisJCXsKKwkJCXJldHVybiBjbXBwcyh4LCB5LCA0KTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdDQ+IGNtcG5sdHBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSkKKwkJeworCQkJcmV0dXJuIGNtcHBzKHgsIHksIDUpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0ND4gY21wbmxlcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KQorCQl7CisJCQlyZXR1cm4gY21wcHMoeCwgeSwgNik7CisJCX0KKworCQlSVmFsdWU8RmxvYXQ0PiBjbXBvcmRwcyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpCisJCXsKKwkJCXJldHVybiBjbXBwcyh4LCB5LCA3KTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdD4gY21wc3MoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0PiAmeSwgdW5zaWduZWQgY2hhciBpbW0pCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqY21wc3MgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlX2NtcF9zcyk7CisKKwkJCVZhbHVlICp2ZWN0b3IxID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudChVbmRlZlZhbHVlOjpnZXQoRmxvYXQ0OjpnZXRUeXBlKCkpLCB4LnZhbHVlLCAwKTsKKwkJCVZhbHVlICp2ZWN0b3IyID0gTnVjbGV1czo6Y3JlYXRlSW5zZXJ0RWxlbWVudChVbmRlZlZhbHVlOjpnZXQoRmxvYXQ0OjpnZXRUeXBlKCkpLCB5LnZhbHVlLCAwKTsKKworCQkJcmV0dXJuIFJWYWx1ZTxGbG9hdD4oTnVjbGV1czo6Y3JlYXRlRXh0cmFjdEVsZW1lbnQoTnVjbGV1czo6Y3JlYXRlQ2FsbChjbXBzcywgdmVjdG9yMSwgdmVjdG9yMiwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRCeXRlKGltbSkpLCAwKSk7CisJCX0KKworCQlSVmFsdWU8RmxvYXQ+IGNtcGVxc3MoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0PiAmeSkKKwkJeworCQkJcmV0dXJuIGNtcHNzKHgsIHksIDApOworCQl9CisKKwkJUlZhbHVlPEZsb2F0PiBjbXBsdHNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnkpCisJCXsKKwkJCXJldHVybiBjbXBzcyh4LCB5LCAxKTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdD4gY21wbGVzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZ5KQorCQl7CisJCQlyZXR1cm4gY21wc3MoeCwgeSwgMik7CisJCX0KKworCQlSVmFsdWU8RmxvYXQ+IGNtcHVub3Jkc3MoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0PiAmeSkKKwkJeworCQkJcmV0dXJuIGNtcHNzKHgsIHksIDMpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0PiBjbXBuZXFzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZ5KQorCQl7CisJCQlyZXR1cm4gY21wc3MoeCwgeSwgNCk7CisJCX0KKworCQlSVmFsdWU8RmxvYXQ+IGNtcG5sdHNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnkpCisJCXsKKwkJCXJldHVybiBjbXBzcyh4LCB5LCA1KTsKKwkJfQorCisJCVJWYWx1ZTxGbG9hdD4gY21wbmxlc3MoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0PiAmeSkKKwkJeworCQkJcmV0dXJuIGNtcHNzKHgsIHksIDYpOworCQl9CisKKwkJUlZhbHVlPEZsb2F0PiBjbXBvcmRzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZ5KQorCQl7CisJCQlyZXR1cm4gY21wc3MoeCwgeSwgNyk7CisJCX0KKworCQlSVmFsdWU8SW50ND4gcGFic2QoY29uc3QgUlZhbHVlPEludDQ+ICZ4LCBjb25zdCBSVmFsdWU8SW50ND4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcGFic2QgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NzZTNfcGFic19kXzEyOCk7CisKKwkJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwYWJzZCwgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPFNob3J0ND4gcGFkZHN3KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwYWRkc3cgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BhZGRzX3cpOworCisJCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwYWRkc3csIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCQkKKwkJUlZhbHVlPFNob3J0ND4gcHN1YnN3KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwc3Vic3cgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BzdWJzX3cpOworCisJCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwc3Vic3csIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCisJCVJWYWx1ZTxVU2hvcnQ0PiBwYWRkdXN3KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ5KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKnBhZGR1c3cgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BhZGR1c193KTsKKworCQkJcmV0dXJuIFJWYWx1ZTxVU2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBhZGR1c3csIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCQkKKwkJUlZhbHVlPFVTaG9ydDQ+IHBzdWJ1c3coY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHN1YnVzdyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcHN1YnVzX3cpOworCisJCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocHN1YnVzdywgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPFNCeXRlOD4gcGFkZHNiKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwYWRkc2IgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BhZGRzX2IpOworCisJCQlyZXR1cm4gUlZhbHVlPFNCeXRlOD4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwYWRkc2IsIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCQkKKwkJUlZhbHVlPFNCeXRlOD4gcHN1YnNiKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwc3Vic2IgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BzdWJzX2IpOworCisJCQlyZXR1cm4gUlZhbHVlPFNCeXRlOD4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwc3Vic2IsIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCQkKKwkJUlZhbHVlPEJ5dGU4PiBwYWRkdXNiKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJngsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcGFkZHVzYiA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcGFkZHVzX2IpOworCisJCQlyZXR1cm4gUlZhbHVlPEJ5dGU4PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBhZGR1c2IsIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCQkKKwkJUlZhbHVlPEJ5dGU4PiBwc3VidXNiKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJngsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHN1YnVzYiA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcHN1YnVzX2IpOworCisJCQlyZXR1cm4gUlZhbHVlPEJ5dGU4PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBzdWJ1c2IsIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCisJCVJWYWx1ZTxVU2hvcnQ0PiBwYXZndyhjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwYXZndyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcGF2Z193KTsKKworCQkJcmV0dXJuIFJWYWx1ZTxVU2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBhdmd3LCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8U2hvcnQ0PiBwbWF4c3coY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKnBtYXhzdyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcG1heHNfdyk7CisKKwkJCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBtYXhzdywgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPFNob3J0ND4gcG1pbnN3KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwbWluc3cgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BtaW5zX3cpOworCisJCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwbWluc3csIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCisJCVJWYWx1ZTxTaG9ydDQ+IHBjbXBndHcoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKnBjbXBndHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BjbXBndF93KTsKKworCQkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocGNtcGd0dywgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPFNob3J0ND4gcGNtcGVxdyhjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcGNtcGVxdyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcGNtcGVxX3cpOworCisJCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwY21wZXF3LCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8Qnl0ZTg+IHBjbXBndGIoY29uc3QgUlZhbHVlPFNCeXRlOD4gJngsIGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ5KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKnBjbXBndGIgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BjbXBndF9iKTsKKworCQkJcmV0dXJuIFJWYWx1ZTxCeXRlOD4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwY21wZ3RiLCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8Qnl0ZTg+IHBjbXBlcWIoY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCwgY29uc3QgUlZhbHVlPEJ5dGU4PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwY21wZXFiID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X21teF9wY21wZXFfYik7CisKKwkJCXJldHVybiBSVmFsdWU8Qnl0ZTg+KE51Y2xldXM6OmNyZWF0ZUNhbGwocGNtcGVxYiwgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPFNob3J0ND4gcGFja3NzZHcoY29uc3QgUlZhbHVlPEludDI+ICZ4LCBjb25zdCBSVmFsdWU8SW50Mj4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcGFja3NzZHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BhY2tzc2R3KTsKKworCQkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocGFja3NzZHcsIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCisJCVJWYWx1ZTxTaG9ydDg+IHBhY2tzc2R3KGNvbnN0IFJWYWx1ZTxJbnQ0PiAmeCwgY29uc3QgUlZhbHVlPEludDQ+ICZ5KQorCQl7CisJCQlpZihDUFVJRDo6c3VwcG9ydHNTU0UyKCkpCisJCQl7CisJCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCQlsbHZtOjpGdW5jdGlvbiAqcGFja3NzZHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlMl9wYWNrc3Nkd18xMjgpOworCisJCQkJcmV0dXJuIFJWYWx1ZTxTaG9ydDg+KE51Y2xldXM6OmNyZWF0ZUNhbGwocGFja3NzZHcsIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJbnQyIGxvWCA9IEludDIoeCk7CisJCQkJSW50MiBoaVggPSBJbnQyKFN3aXp6bGUoeCwgMHhFRSkpOworCisJCQkJSW50MiBsb1kgPSBJbnQyKHkpOworCQkJCUludDIgaGlZID0gSW50MihTd2l6emxlKHksIDB4RUUpKTsKKwkJCQkKKwkJCQlTaG9ydDQgbG8gPSB4ODY6OnBhY2tzc2R3KGxvWCwgaGlYKTsKKwkJCQlTaG9ydDQgaGkgPSB4ODY6OnBhY2tzc2R3KGxvWSwgaGlZKTsKKwkJCQkKKwkJCQlyZXR1cm4gQ29uY2F0ZW5hdGUobG8sIGhpKTsKKwkJCX0KKwkJfQorCisJCVJWYWx1ZTxTQnl0ZTg+IHBhY2tzc3diKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwYWNrc3N3YiA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcGFja3Nzd2IpOworCisJCQlyZXR1cm4gUlZhbHVlPFNCeXRlOD4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwYWNrc3N3YiwgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPEJ5dGU4PiBwYWNrdXN3Yihjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwYWNrdXN3YiA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcGFja3Vzd2IpOworCisJCQlyZXR1cm4gUlZhbHVlPEJ5dGU4PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBhY2t1c3diLCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8VVNob3J0OD4gcGFja3VzZHcoY29uc3QgUlZhbHVlPFVJbnQ0PiAmeCwgY29uc3QgUlZhbHVlPFVJbnQ0PiAmeSkKKwkJeworCQkJaWYoQ1BVSUQ6OnN1cHBvcnRzU1NFNF8xKCkpCisJCQl7CisJCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCQlsbHZtOjpGdW5jdGlvbiAqcGFja3VzZHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlNDFfcGFja3VzZHcpOworCQorCQkJCXJldHVybiBSVmFsdWU8VVNob3J0OD4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwYWNrdXNkdywgeC52YWx1ZSwgeS52YWx1ZSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIEZJWE1FOiBOb3QgYW4gZXhhY3QgcmVwbGFjZW1lbnQhCisJCQkJcmV0dXJuIEFzPFVTaG9ydDg+KHBhY2tzc2R3KEFzPEludDQ+KHggLSBVSW50NCgweDAwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwKSksIEFzPEludDQ+KHkgLSBVSW50NCgweDAwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwKSkpICsgU2hvcnQ4KDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwKSk7CisJCQl9CisJCX0KKworCQlSVmFsdWU8VVNob3J0ND4gcHNybHcoY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHNybHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BzcmxpX3cpOworCisJCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocHNybHcsIHgudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHkpKSk7CisJCX0KKworCQlSVmFsdWU8VVNob3J0OD4gcHNybHcoY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHNybHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlMl9wc3JsaV93KTsKKworCQkJcmV0dXJuIFJWYWx1ZTxVU2hvcnQ4PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBzcmx3LCB4LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh5KSkpOworCQl9CisKKwkJUlZhbHVlPFNob3J0ND4gcHNyYXcoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIHVuc2lnbmVkIGNoYXIgeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwc3JhdyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcHNyYWlfdyk7CisKKwkJCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBzcmF3LCB4LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh5KSkpOworCQl9CisKKwkJUlZhbHVlPFNob3J0OD4gcHNyYXcoY29uc3QgUlZhbHVlPFNob3J0OD4gJngsIHVuc2lnbmVkIGNoYXIgeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwc3JhdyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmFpX3cpOworCisJCQlyZXR1cm4gUlZhbHVlPFNob3J0OD4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwc3JhdywgeC52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeSkpKTsKKwkJfQorCisJCVJWYWx1ZTxTaG9ydDQ+IHBzbGx3KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHNsbHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BzbGxpX3cpOworCisJCQlyZXR1cm4gUlZhbHVlPFNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwc2xsdywgeC52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeSkpKTsKKwkJfQorCisJCVJWYWx1ZTxTaG9ydDg+IHBzbGx3KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHNsbHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV93KTsKKworCQkJcmV0dXJuIFJWYWx1ZTxTaG9ydDg+KE51Y2xldXM6OmNyZWF0ZUNhbGwocHNsbHcsIHgudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHkpKSk7CisJCX0KKworCQlSVmFsdWU8SW50Mj4gcHNsbGQoY29uc3QgUlZhbHVlPEludDI+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHNsbGQgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BzbGxpX2QpOworCisJCQlyZXR1cm4gUlZhbHVlPEludDI+KE51Y2xldXM6OmNyZWF0ZUNhbGwocHNsbGQsIHgudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHkpKSk7CisJCX0KKworCQlSVmFsdWU8SW50ND4gcHNsbGQoY29uc3QgUlZhbHVlPEludDQ+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpCisJCXsKKwkJCWlmKENQVUlEOjpzdXBwb3J0c1NTRTIoKSkKKwkJCXsKKwkJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJCWxsdm06OkZ1bmN0aW9uICpwc2xsZCA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxpX2QpOworCisJCQkJcmV0dXJuIFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBzbGxkLCB4LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh5KSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUludDIgbG8gPSBJbnQyKHgpOworCQkJCUludDIgaGkgPSBJbnQyKFN3aXp6bGUoeCwgMHhFRSkpOworCQkJCQorCQkJCWxvID0geDg2Ojpwc2xsZChsbywgeSk7CisJCQkJaGkgPSB4ODY6OnBzbGxkKGhpLCB5KTsKKwkJCQkKKwkJCQlyZXR1cm4gQ29uY2F0ZW5hdGUobG8sIGhpKTsKKwkJCX0KKwkJfQorCisJCVJWYWx1ZTxJbnQyPiBwc3JhZChjb25zdCBSVmFsdWU8SW50Mj4gJngsIHVuc2lnbmVkIGNoYXIgeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwc3JhZCA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcHNyYWlfZCk7CisKKwkJCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwc3JhZCwgeC52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeSkpKTsKKwkJfQorCisJCVJWYWx1ZTxJbnQ0PiBwc3JhZChjb25zdCBSVmFsdWU8SW50ND4gJngsIHVuc2lnbmVkIGNoYXIgeSkKKwkJeworCQkJaWYoQ1BVSUQ6OnN1cHBvcnRzU1NFMigpKQorCQkJeworCQkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQkJbGx2bTo6RnVuY3Rpb24gKnBzcmFkID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZTJfcHNyYWlfZCk7CisKKwkJCQlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocHNyYWQsIHgudmFsdWUsIE51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KHkpKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSW50MiBsbyA9IEludDIoeCk7CisJCQkJSW50MiBoaSA9IEludDIoU3dpenpsZSh4LCAweEVFKSk7CisJCQkJCisJCQkJbG8gPSB4ODY6OnBzcmFkKGxvLCB5KTsKKwkJCQloaSA9IHg4Njo6cHNyYWQoaGksIHkpOworCQkJCQorCQkJCXJldHVybiBDb25jYXRlbmF0ZShsbywgaGkpOworCQkJfQorCQl9CisKKwkJUlZhbHVlPFVJbnQyPiBwc3JsZChjb25zdCBSVmFsdWU8VUludDI+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHNybGQgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BzcmxpX2QpOworCisJCQlyZXR1cm4gUlZhbHVlPFVJbnQyPihOdWNsZXVzOjpjcmVhdGVDYWxsKHBzcmxkLCB4LnZhbHVlLCBOdWNsZXVzOjpjcmVhdGVDb25zdGFudEludCh5KSkpOworCQl9CisKKwkJUlZhbHVlPFVJbnQ0PiBwc3JsZChjb25zdCBSVmFsdWU8VUludDQ+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpCisJCXsKKwkJCWlmKENQVUlEOjpzdXBwb3J0c1NTRTIoKSkKKwkJCXsKKwkJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJCWxsdm06OkZ1bmN0aW9uICpwc3JsZCA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxpX2QpOworCisJCQkJcmV0dXJuIFJWYWx1ZTxVSW50ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwc3JsZCwgeC52YWx1ZSwgTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoeSkpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlVSW50MiBsbyA9IEFzPFVJbnQyPihJbnQyKEFzPEludDQ+KHgpKSk7CisJCQkJVUludDIgaGkgPSBBczxVSW50Mj4oSW50MihTd2l6emxlKEFzPEludDQ+KHgpLCAweEVFKSkpOworCQkJCQorCQkJCWxvID0geDg2Ojpwc3JsZChsbywgeSk7CisJCQkJaGkgPSB4ODY6OnBzcmxkKGhpLCB5KTsKKwkJCQkKKwkJCQlyZXR1cm4gQ29uY2F0ZW5hdGUobG8sIGhpKTsKKwkJCX0KKwkJfQorCisJCVJWYWx1ZTxVU2hvcnQ0PiBwc3Jsdyhjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHNybHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3Bzcmxfdyk7CisKKwkJCXJldHVybiBSVmFsdWU8VVNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwc3JsdywgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPFNob3J0ND4gcHNyYXcoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHNyYXcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BzcmFfdyk7CisKKwkJCXJldHVybiBSVmFsdWU8U2hvcnQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBzcmF3LCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8U2hvcnQ0PiBwc2xsdyhjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPExvbmcxPiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwc2xsdyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcHNsbF93KTsKKworCQkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocHNsbHcsIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCisJCVJWYWx1ZTxJbnQyPiBwc2xsZChjb25zdCBSVmFsdWU8SW50Mj4gJngsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcHNsbGQgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3BzbGxfZCk7CisKKwkJCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwc2xsZCwgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPFVJbnQyPiBwc3JsZChjb25zdCBSVmFsdWU8VUludDI+ICZ4LCBjb25zdCBSVmFsdWU8TG9uZzE+ICZ5KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKnBzcmxkID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X21teF9wc3JsX2QpOworCisJCQlyZXR1cm4gUlZhbHVlPFVJbnQyPihOdWNsZXVzOjpjcmVhdGVDYWxsKHBzcmxkLCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8SW50Mj4gcHNyYWQoY29uc3QgUlZhbHVlPEludDI+ICZ4LCBjb25zdCBSVmFsdWU8TG9uZzE+ICZ5KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKnBzcmxkID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X21teF9wc3JhX2QpOworCisJCQlyZXR1cm4gUlZhbHVlPEludDI+KE51Y2xldXM6OmNyZWF0ZUNhbGwocHNybGQsIHgudmFsdWUsIHkudmFsdWUpKTsKKwkJfQorCisJCVJWYWx1ZTxTaG9ydDQ+IHBtdWxodyhjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcG11bGh3ID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X21teF9wbXVsaF93KTsKKworCQkJcmV0dXJuIFJWYWx1ZTxTaG9ydDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocG11bGh3LCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8VVNob3J0ND4gcG11bGh1dyhjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwbXVsaHV3ID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X21teF9wbXVsaHVfdyk7CisKKwkJCXJldHVybiBSVmFsdWU8VVNob3J0ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwbXVsaHV3LCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8SW50Mj4gcG1hZGR3ZChjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcG1hZGR3ZCA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9tbXhfcG1hZGRfd2QpOworCisJCQlyZXR1cm4gUlZhbHVlPEludDI+KE51Y2xldXM6OmNyZWF0ZUNhbGwocG1hZGR3ZCwgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPFNob3J0OD4gcG11bGh3KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwbXVsaHcgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlMl9wbXVsaF93KTsKKworCQkJcmV0dXJuIFJWYWx1ZTxTaG9ydDg+KE51Y2xldXM6OmNyZWF0ZUNhbGwocG11bGh3LCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8VVNob3J0OD4gcG11bGh1dyhjb25zdCBSVmFsdWU8VVNob3J0OD4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmeSkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwbXVsaHV3ID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZTJfcG11bGh1X3cpOworCisJCQlyZXR1cm4gUlZhbHVlPFVTaG9ydDg+KE51Y2xldXM6OmNyZWF0ZUNhbGwocG11bGh1dywgeC52YWx1ZSwgeS52YWx1ZSkpOworCQl9CisKKwkJUlZhbHVlPEludDQ+IHBtYWRkd2QoY29uc3QgUlZhbHVlPFNob3J0OD4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZ5KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKnBtYWRkd2QgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlMl9wbWFkZF93ZCk7CisKKwkJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwbWFkZHdkLCB4LnZhbHVlLCB5LnZhbHVlKSk7CisJCX0KKworCQlSVmFsdWU8SW50PiBtb3Ztc2twcyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICptb3Ztc2twcyA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2VfbW92bXNrX3BzKTsKKworCQkJcmV0dXJuIFJWYWx1ZTxJbnQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwobW92bXNrcHMsIHgudmFsdWUpKTsKKwkJfQorCisJCVJWYWx1ZTxJbnQ+IHBtb3Ztc2tiKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJngpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcG1vdm1za2IgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X3Btb3Ztc2tiKTsKKworCQkJcmV0dXJuIFJWYWx1ZTxJbnQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocG1vdm1za2IsIHgudmFsdWUpKTsKKwkJfQorCisJCS8vUlZhbHVlPEludDI+IG1vdmQoY29uc3QgUlZhbHVlPFBvaW50ZXI8SW50Pj4gJngpCisJCS8veworCQkvLwlWYWx1ZSAqZWxlbWVudCA9IE51Y2xldXM6OmNyZWF0ZUxvYWQoeC52YWx1ZSk7CisKKwkJLy8vLwlWYWx1ZSAqaW50MiA9IFVuZGVmVmFsdWU6OmdldChJbnQyOjpnZXRUeXBlKCkpOworCQkvLy8vCWludDIgPSBOdWNsZXVzOjpjcmVhdGVJbnNlcnRFbGVtZW50KGludDIsIGVsZW1lbnQsIENvbnN0YW50SW50OjpnZXQoSW50OjpnZXRUeXBlKCksIDApKTsKKworCQkvLwlWYWx1ZSAqaW50MiA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoTnVjbGV1czo6Y3JlYXRlWkV4dChlbGVtZW50LCBMb25nOjpnZXRUeXBlKCkpLCBJbnQyOjpnZXRUeXBlKCkpOworCisJCS8vCXJldHVybiBSVmFsdWU8SW50Mj4oaW50Mik7CisJCS8vfQorCisJCS8vUlZhbHVlPEludDI+IG1vdmRxMnEoY29uc3QgUlZhbHVlPEludDQ+ICZ4KQorCQkvL3sKKwkJLy8JVmFsdWUgKmxvbmcyID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdCh4LnZhbHVlLCBMb25nMjo6Z2V0VHlwZSgpKTsKKwkJLy8JVmFsdWUgKmVsZW1lbnQgPSBOdWNsZXVzOjpjcmVhdGVFeHRyYWN0RWxlbWVudChsb25nMiwgQ29uc3RhbnRJbnQ6OmdldChJbnQ6OmdldFR5cGUoKSwgMCkpOworCisJCS8vCXJldHVybiBSVmFsdWU8SW50Mj4oTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChlbGVtZW50LCBJbnQyOjpnZXRUeXBlKCkpKTsKKwkJLy99CisKKwkJUlZhbHVlPEludDQ+IHBtb3Z6eGJkKGNvbnN0IFJWYWx1ZTxJbnQ0PiAmeCkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwbW92enhiZCA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wbW92enhiZCk7CisJCQorCQkJcmV0dXJuIFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBtb3Z6eGJkLCBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KHgudmFsdWUsIEJ5dGUxNjo6Z2V0VHlwZSgpKSkpOworCQl9CisKKwkJUlZhbHVlPEludDQ+IHBtb3ZzeGJkKGNvbnN0IFJWYWx1ZTxJbnQ0PiAmeCkKKwkJeworCQkJTW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsKKwkJCWxsdm06OkZ1bmN0aW9uICpwbW92c3hiZCA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24obW9kdWxlLCBJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wbW92c3hiZCk7CisJCQorCQkJcmV0dXJuIFJWYWx1ZTxJbnQ0PihOdWNsZXVzOjpjcmVhdGVDYWxsKHBtb3ZzeGJkLCBOdWNsZXVzOjpjcmVhdGVCaXRDYXN0KHgudmFsdWUsIFNCeXRlMTY6OmdldFR5cGUoKSkpKTsKKwkJfQorCisJCVJWYWx1ZTxJbnQ0PiBwbW92enh3ZChjb25zdCBSVmFsdWU8SW50ND4gJngpCisJCXsKKwkJCU1vZHVsZSAqbW9kdWxlID0gTnVjbGV1czo6Z2V0TW9kdWxlKCk7CisJCQlsbHZtOjpGdW5jdGlvbiAqcG1vdnp4d2QgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfc3NlNDFfcG1vdnp4d2QpOworCQkKKwkJCXJldHVybiBSVmFsdWU8SW50ND4oTnVjbGV1czo6Y3JlYXRlQ2FsbChwbW92enh3ZCwgTnVjbGV1czo6Y3JlYXRlQml0Q2FzdCh4LnZhbHVlLCBVU2hvcnQ4OjpnZXRUeXBlKCkpKSk7CisJCX0KKworCQlSVmFsdWU8SW50ND4gcG1vdnN4d2QoY29uc3QgUlZhbHVlPEludDQ+ICZ4KQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKnBtb3ZzeHdkID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbihtb2R1bGUsIEludHJpbnNpYzo6eDg2X3NzZTQxX3Btb3ZzeHdkKTsKKwkJCisJCQlyZXR1cm4gUlZhbHVlPEludDQ+KE51Y2xldXM6OmNyZWF0ZUNhbGwocG1vdnN4d2QsIE51Y2xldXM6OmNyZWF0ZUJpdENhc3QoeC52YWx1ZSwgU2hvcnQ4OjpnZXRUeXBlKCkpKSk7CisJCX0KKworCQl2b2lkIGVtbXMoKQorCQl7CisJCQlNb2R1bGUgKm1vZHVsZSA9IE51Y2xldXM6OmdldE1vZHVsZSgpOworCQkJbGx2bTo6RnVuY3Rpb24gKmVtbXMgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKG1vZHVsZSwgSW50cmluc2ljOjp4ODZfbW14X2VtbXMpOworCisJCQlOdWNsZXVzOjpjcmVhdGVDYWxsKGVtbXMpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1JlYWN0b3IvTnVjbGV1cy5ocHAgYi9zcmMvUmVhY3Rvci9OdWNsZXVzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmExZDgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlYWN0b3IvTnVjbGV1cy5ocHAKQEAgLTAsMCArMSwyODY4IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZiBzd19OdWNsZXVzX2hwcA0KKyNkZWZpbmUgc3dfTnVjbGV1c19ocHANCisNCisjaW5jbHVkZSAiQ29tbW9uL1R5cGVzLmhwcCINCisNCisjaW5jbHVkZSA8c3RkYXJnLmg+DQorI2luY2x1ZGUgPHZlY3Rvcj4NCisNCisjdW5kZWYgYWJzDQorI3VuZGVmIG1heA0KKyN1bmRlZiBtaW4NCisNCituYW1lc3BhY2UgbGx2bQ0KK3sNCisJY2xhc3MgRnVuY3Rpb247DQorCWNsYXNzIE1vZHVsZTsNCisJY2xhc3MgQmFzaWNCbG9jazsNCisJY2xhc3MgVmFsdWU7DQorCWNsYXNzIENvbnN0YW50Ow0KKwljbGFzcyBDb25zdGFudEludDsNCisJY2xhc3MgQ29uc3RhbnRGUDsNCisJY2xhc3MgVHlwZTsNCisJY2xhc3MgQXJndW1lbnQ7DQorCWNsYXNzIEdsb2JhbFZhcmlhYmxlOw0KKwljbGFzcyBHbG9iYWxWYWx1ZTsNCisJY2xhc3MgRXhlY3V0aW9uRW5naW5lOw0KKwljbGFzcyBMTFZNQ29udGV4dDsNCit9DQorDQorbmFtZXNwYWNlIHN3DQorew0KKwllbnVtIE9wdGltaXphdGlvbg0KKwl7DQorCQlEaXNhYmxlZCwNCisJCUluc3RydWN0aW9uQ29tYmluaW5nLA0KKwkJQ0ZHU2ltcGxpZmljYXRpb24sDQorCQlMSUNNLA0KKwkJQWdncmVzc2l2ZURDRSwNCisJCUdWTiwNCisJCVJlYXNzb2NpYXRlLA0KKwkJRGVhZFN0b3JlRWxpbWluYXRpb24sDQorCQlTQ0NQLA0KKw0KKwkJT3B0aW1pemF0aW9uQ291bnQNCisJfTsNCisNCisJZXh0ZXJuIE9wdGltaXphdGlvbiBvcHRpbWl6YXRpb25bMTBdOw0KKw0KKwljbGFzcyBNZW1vcnlNYW5hZ2VyOw0KKwljbGFzcyBCdWlsZGVyOw0KKwljbGFzcyBOdWNsZXVzOw0KKw0KKwljbGFzcyBSb3V0aW5lDQorCXsNCisJCWZyaWVuZCBOdWNsZXVzOw0KKw0KKwlwdWJsaWM6DQorCQlSb3V0aW5lKGludCBidWZmZXJTaXplKTsNCisJCVJvdXRpbmUodm9pZCAqbWVtb3J5LCBpbnQgYnVmZmVyU2l6ZSwgaW50IG9mZnNldCk7DQorDQorCQl+Um91dGluZSgpOw0KKw0KKwkJdm9pZCBzZXRGdW5jdGlvblNpemUoaW50IGZ1bmN0aW9uU2l6ZSk7DQorDQorCQljb25zdCB2b2lkICpnZXRCdWZmZXIoKTsNCisJCWNvbnN0IHZvaWQgKmdldEVudHJ5KCk7DQorCQlpbnQgZ2V0QnVmZmVyU2l6ZSgpOw0KKwkJaW50IGdldEZ1bmN0aW9uU2l6ZSgpOyAgIC8vIEluY2x1ZGVzIGNvbnN0YW50cyBiZWZvcmUgdGhlIGVudHJ5IHBvaW50DQorCQlpbnQgZ2V0Q29kZVNpemUoKTsgICAgICAgLy8gRXhlY3V0YWJsZSBjb2RlIG9ubHkNCisJCWJvb2wgaXNEeW5hbWljKCk7DQorDQorCQl2b2lkIGJpbmQoKTsNCisJCXZvaWQgdW5iaW5kKCk7DQorDQorCXByaXZhdGU6DQorCQl2b2lkICpidWZmZXI7DQorCQljb25zdCB2b2lkICplbnRyeTsNCisJCWludCBidWZmZXJTaXplOw0KKwkJaW50IGZ1bmN0aW9uU2l6ZTsNCisNCisJCXZvbGF0aWxlIGludCBiaW5kQ291bnQ7DQorCQljb25zdCBib29sIGR5bmFtaWM7ICAgLy8gR2VuZXJhdGVkIG9yIHByZWNvbXBpbGVkDQorCX07DQorDQorCWNsYXNzIE51Y2xldXMNCisJew0KKwlwdWJsaWM6DQorCQlOdWNsZXVzKCk7DQorDQorCQl2aXJ0dWFsIH5OdWNsZXVzKCk7DQorDQorCQlSb3V0aW5lICphY3F1aXJlUm91dGluZShjb25zdCB3Y2hhcl90ICpuYW1lLCBib29sIHJ1bk9wdGltaXphdGlvbnMgPSB0cnVlKTsNCisNCisJCXN0YXRpYyB2b2lkIHNldEZ1bmN0aW9uKGxsdm06OkZ1bmN0aW9uICpmdW5jdGlvbik7DQorDQorCQlzdGF0aWMgbGx2bTo6TW9kdWxlICpnZXRNb2R1bGUoKTsNCisJCXN0YXRpYyBCdWlsZGVyICpnZXRCdWlsZGVyKCk7DQorCQlzdGF0aWMgbGx2bTo6RnVuY3Rpb24gKmdldEZ1bmN0aW9uKCk7DQorCQlzdGF0aWMgbGx2bTo6TExWTUNvbnRleHQgKmdldENvbnRleHQoKTsNCisNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqYWxsb2NhdGVTdGFja1ZhcmlhYmxlKGNvbnN0IGxsdm06OlR5cGUgKnR5cGUsIGludCBhcnJheVNpemUgPSAwKTsNCisJCXN0YXRpYyBsbHZtOjpCYXNpY0Jsb2NrICpjcmVhdGVCYXNpY0Jsb2NrKCk7DQorCQlzdGF0aWMgbGx2bTo6QmFzaWNCbG9jayAqZ2V0SW5zZXJ0QmxvY2soKTsNCisJCXN0YXRpYyB2b2lkIHNldEluc2VydEJsb2NrKGxsdm06OkJhc2ljQmxvY2sgKmJhc2ljQmxvY2spOw0KKwkJc3RhdGljIGxsdm06OkJhc2ljQmxvY2sgKmdldFByZWRlY2Vzc29yKGxsdm06OkJhc2ljQmxvY2sgKmJhc2ljQmxvY2spOw0KKw0KKwkJc3RhdGljIGxsdm06OkZ1bmN0aW9uICpjcmVhdGVGdW5jdGlvbihjb25zdCBsbHZtOjpUeXBlICpSZXR1cm5UeXBlLCBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBsbHZtOjpUeXBlKj4gJlBhcmFtcyk7DQorCQlzdGF0aWMgbGx2bTo6QXJndW1lbnQgKmdldEFyZ3VtZW50KGxsdm06OkZ1bmN0aW9uICpmdW5jdGlvbiwgdW5zaWduZWQgaW50IGluZGV4KTsNCisNCisJCS8vIFRlcm1pbmF0b3JzDQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZVJldFZvaWQoKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlUmV0KGxsdm06OlZhbHVlICpWKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlQnIobGx2bTo6QmFzaWNCbG9jayAqZGVzdCk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUNvbmRCcihsbHZtOjpWYWx1ZSAqY29uZCwgbGx2bTo6QmFzaWNCbG9jayAqaWZUcnVlLCBsbHZtOjpCYXNpY0Jsb2NrICppZkZhbHNlKTsNCisJCQ0KKwkJLy8gQmluYXJ5IG9wZXJhdG9ycw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVBZGQobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZVN1YihsbHZtOjpWYWx1ZSAqbGhzLCBsbHZtOjpWYWx1ZSAqcmhzKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlTXVsKGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVVRGl2KGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVTRGl2KGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVGQWRkKGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVGU3ViKGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVGTXVsKGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVGRGl2KGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVVUmVtKGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVTUmVtKGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVGUmVtKGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVTaGwobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUxTaHIobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUFTaHIobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUFuZChsbHZtOjpWYWx1ZSAqbGhzLCBsbHZtOjpWYWx1ZSAqcmhzKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlT3IobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZVhvcihsbHZtOjpWYWx1ZSAqbGhzLCBsbHZtOjpWYWx1ZSAqcmhzKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlTmVnKGxsdm06OlZhbHVlICpWKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlRk5lZyhsbHZtOjpWYWx1ZSAqVik7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZU5vdChsbHZtOjpWYWx1ZSAqVik7DQorICANCisJCS8vIE1lbW9yeSBpbnN0cnVjdGlvbnMNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlTG9hZChsbHZtOjpWYWx1ZSAqcHRyLCBib29sIGlzVm9sYXRpbGUgPSBmYWxzZSwgdW5zaWduZWQgaW50IGFsaWduID0gMCk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZVN0b3JlKGxsdm06OlZhbHVlICp2YWx1ZSwgbGx2bTo6VmFsdWUgKnB0ciwgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsIHVuc2lnbmVkIGludCBhbGlnbiA9IDApOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVHRVAobGx2bTo6VmFsdWUgKnB0ciwgbGx2bTo6VmFsdWUgKmluZGV4KTsNCisNCisJCS8vIENhc3QvQ29udmVyc2lvbiBPcGVyYXRvcnMNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlVHJ1bmMobGx2bTo6VmFsdWUgKlYsIGNvbnN0IGxsdm06OlR5cGUgKmRlc3RUeXBlKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlWkV4dChsbHZtOjpWYWx1ZSAqViwgY29uc3QgbGx2bTo6VHlwZSAqZGVzdFR5cGUpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVTRXh0KGxsdm06OlZhbHVlICpWLCBjb25zdCBsbHZtOjpUeXBlICpkZXN0VHlwZSk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZQVG9VSShsbHZtOjpWYWx1ZSAqViwgY29uc3QgbGx2bTo6VHlwZSAqZGVzdFR5cGUpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVGUFRvU0kobGx2bTo6VmFsdWUgKlYsIGNvbnN0IGxsdm06OlR5cGUgKmRlc3RUeXBlKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlVUlUb0ZQKGxsdm06OlZhbHVlICpWLCBjb25zdCBsbHZtOjpUeXBlICpkZXN0VHlwZSk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZVNJVG9GUChsbHZtOjpWYWx1ZSAqViwgY29uc3QgbGx2bTo6VHlwZSAqZGVzdFR5cGUpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVGUFRydW5jKGxsdm06OlZhbHVlICpWLCBjb25zdCBsbHZtOjpUeXBlICpkZXN0VHlwZSk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZQRXh0KGxsdm06OlZhbHVlICpWLCBjb25zdCBsbHZtOjpUeXBlICpkZXN0VHlwZSk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZVB0clRvSW50KGxsdm06OlZhbHVlICpWLCBjb25zdCBsbHZtOjpUeXBlICpkZXN0VHlwZSk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUludFRvUHRyKGxsdm06OlZhbHVlICpWLCBjb25zdCBsbHZtOjpUeXBlICpkZXN0VHlwZSk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUJpdENhc3QobGx2bTo6VmFsdWUgKlYsIGNvbnN0IGxsdm06OlR5cGUgKmRlc3RUeXBlKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlSW50Q2FzdChsbHZtOjpWYWx1ZSAqViwgY29uc3QgbGx2bTo6VHlwZSAqZGVzdFR5cGUsIGJvb2wgaXNTaWduZWQpOw0KKw0KKwkJLy8gQ29tcGFyZSBpbnN0cnVjdGlvbnMNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlSUNtcEVRKGxsdm06OlZhbHVlICpsaHMsIGxsdm06OlZhbHVlICpyaHMpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVJQ21wTkUobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUlDbXBVR1QobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUlDbXBVR0UobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUlDbXBVTFQobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUlDbXBVTEUobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUlDbXBTR1QobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUlDbXBTR0UobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUlDbXBTTFQobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUlDbXBTTEUobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBPRVEobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBPR1QobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBPR0UobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBPTFQobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBPTEUobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBPTkUobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBPUkQobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBVTk8obGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBVRVEobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBVR1QobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBVR0UobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBVTFQobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBVTEUobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUZDbXBVTkUobGx2bTo6VmFsdWUgKmxocywgbGx2bTo6VmFsdWUgKnJocyk7DQorDQorCQkvLyBDYWxsIGluc3RydWN0aW9ucw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVDYWxsKGxsdm06OlZhbHVlICpjYWxsZWUpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVDYWxsKGxsdm06OlZhbHVlICpjYWxsZWUsIGxsdm06OlZhbHVlICpBcmcpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVDYWxsKGxsdm06OlZhbHVlICpjYWxsZWUsIGxsdm06OlZhbHVlICpBcmcxLCBsbHZtOjpWYWx1ZSAqQXJnMik7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUNhbGwobGx2bTo6VmFsdWUgKmNhbGxlZSwgbGx2bTo6VmFsdWUgKkFyZzEsIGxsdm06OlZhbHVlICpBcmcyLCBsbHZtOjpWYWx1ZSAqQXJnMyk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUNhbGwobGx2bTo6VmFsdWUgKmNhbGxlZSwgbGx2bTo6VmFsdWUgKkFyZzEsIGxsdm06OlZhbHVlICpBcmcyLCBsbHZtOjpWYWx1ZSAqQXJnMyxsbHZtOjpWYWx1ZSAqQXJnNCk7DQorDQorCQkvLyBWZWN0b3IgaW5zdHJ1Y3Rpb25zDQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUV4dHJhY3RFbGVtZW50KGxsdm06OlZhbHVlICp2ZWN0b3IsIGludCBpbmRleCk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUluc2VydEVsZW1lbnQobGx2bTo6VmFsdWUgKnZlY3RvciwgbGx2bTo6VmFsdWUgKmVsZW1lbnQsIGludCBpbmRleCk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZVNodWZmbGVWZWN0b3IobGx2bTo6VmFsdWUgKlYxLCBsbHZtOjpWYWx1ZSAqVjIsIGxsdm06OlZhbHVlICptYXNrKTsNCisNCisJCS8vIE90aGVyIGluc3RydWN0aW9ucw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVTZWxlY3QobGx2bTo6VmFsdWUgKkMsIGxsdm06OlZhbHVlICppZlRydWUsIGxsdm06OlZhbHVlICppZkZhbHNlKTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlU3dpdGNoKGxsdm06OlZhbHVlICpWLCBsbHZtOjpCYXNpY0Jsb2NrICpEZXN0LCB1bnNpZ25lZCBOdW1DYXNlcyA9IDEwKTsNCisJCXN0YXRpYyB2b2lkIGFkZFN3aXRjaENhc2UobGx2bTo6VmFsdWUgKlN3aXRjaCwgaW50IENhc2UsIGxsdm06OkJhc2ljQmxvY2sgKkJyYW5jaCk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZVVucmVhY2hhYmxlKCk7DQorDQorCQkvLyBEZXJpdmVkIGluc3RydWN0aW9ucw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVTd2l6emxlKGxsdm06OlZhbHVlICp2YWwsIHVuc2lnbmVkIGNoYXIgc2VsZWN0KTsNCisJCXN0YXRpYyBsbHZtOjpWYWx1ZSAqY3JlYXRlTWFzayhsbHZtOjpWYWx1ZSAqbGhzLCBsbHZtOjpWYWx1ZSAqcmhzLCB1bnNpZ25lZCBjaGFyIHNlbGVjdCk7DQorDQorCQkvLyBHbG9iYWwgdmFsdWVzDQorCQlzdGF0aWMgY29uc3QgbGx2bTo6R2xvYmFsVmFsdWUgKmdldEdsb2JhbFZhbHVlQXRBZGRyZXNzKHZvaWQgKkFkZHIpOw0KKwkJc3RhdGljIHZvaWQgYWRkR2xvYmFsTWFwcGluZyhjb25zdCBsbHZtOjpHbG9iYWxWYWx1ZSAqR1YsIHZvaWQgKkFkZHIpOw0KKwkJc3RhdGljIGxsdm06Okdsb2JhbFZhbHVlICpjcmVhdGVHbG9iYWxWYWx1ZShjb25zdCBsbHZtOjpUeXBlICpUeSwgYm9vbCBpc0NvbnN0YW50LCB1bnNpZ25lZCBpbnQgQWxpZ24pOw0KKwkJc3RhdGljIGxsdm06OlR5cGUgKmdldFBvaW50ZXJUeXBlKGNvbnN0IGxsdm06OlR5cGUgKkVsZW1lbnRUeXBlKTsNCisNCisJCS8vIENvbnN0YW50IHZhbHVlcw0KKwkJc3RhdGljIGxsdm06OkNvbnN0YW50ICpjcmVhdGVOdWxsVmFsdWUoY29uc3QgbGx2bTo6VHlwZSAqVHkpOw0KKwkJc3RhdGljIGxsdm06OkNvbnN0YW50SW50ICpjcmVhdGVDb25zdGFudExvbmcoaW50NjRfdCBpKTsNCisJCXN0YXRpYyBsbHZtOjpDb25zdGFudEludCAqY3JlYXRlQ29uc3RhbnRJbnQoaW50IGkpOw0KKwkJc3RhdGljIGxsdm06OkNvbnN0YW50SW50ICpjcmVhdGVDb25zdGFudEludCh1bnNpZ25lZCBpbnQgaSk7DQorCQlzdGF0aWMgbGx2bTo6Q29uc3RhbnRJbnQgKmNyZWF0ZUNvbnN0YW50Qm9vbChib29sIGIpOw0KKwkJc3RhdGljIGxsdm06OkNvbnN0YW50SW50ICpjcmVhdGVDb25zdGFudEJ5dGUoc2lnbmVkIGNoYXIgaSk7DQorCQlzdGF0aWMgbGx2bTo6Q29uc3RhbnRJbnQgKmNyZWF0ZUNvbnN0YW50Qnl0ZSh1bnNpZ25lZCBjaGFyIGkpOw0KKwkJc3RhdGljIGxsdm06OkNvbnN0YW50SW50ICpjcmVhdGVDb25zdGFudFNob3J0KHNob3J0IGkpOw0KKwkJc3RhdGljIGxsdm06OkNvbnN0YW50SW50ICpjcmVhdGVDb25zdGFudFNob3J0KHVuc2lnbmVkIHNob3J0IGkpOw0KKwkJc3RhdGljIGxsdm06OkNvbnN0YW50ICpjcmVhdGVDb25zdGFudEZsb2F0KGZsb2F0IHgpOw0KKwkJc3RhdGljIGxsdm06OlZhbHVlICpjcmVhdGVOdWxsUG9pbnRlcihjb25zdCBsbHZtOjpUeXBlICpUeSk7DQorCQlzdGF0aWMgbGx2bTo6VmFsdWUgKmNyZWF0ZUNvbnN0YW50VmVjdG9yKGxsdm06OkNvbnN0YW50KiBjb25zdCogVmFscywgdW5zaWduZWQgTnVtVmFscyk7DQorDQorCXByaXZhdGU6DQorCQl2b2lkIG9wdGltaXplKCk7DQorDQorCQlzdGF0aWMgbGx2bTo6RXhlY3V0aW9uRW5naW5lICpleGVjdXRpb25FbmdpbmU7DQorCQlzdGF0aWMgQnVpbGRlciAqYnVpbGRlcjsNCisJCXN0YXRpYyBsbHZtOjpGdW5jdGlvbiAqZnVuY3Rpb247DQorCQlzdGF0aWMgbGx2bTo6TExWTUNvbnRleHQgKmNvbnRleHQ7DQorCQlzdGF0aWMgbGx2bTo6TW9kdWxlICptb2R1bGU7DQorCQlzdGF0aWMgTWVtb3J5TWFuYWdlciAqbWVtb3J5TWFuYWdlcjsNCisJfTsNCisNCisJY2xhc3MgQnl0ZTsNCisJY2xhc3MgU0J5dGU7DQorCWNsYXNzIEJ5dGU0Ow0KKwljbGFzcyBTQnl0ZTQ7DQorCWNsYXNzIEJ5dGU4Ow0KKwljbGFzcyBTQnl0ZTg7DQorCWNsYXNzIEJ5dGUxNjsNCisJY2xhc3MgU0J5dGUxNjsNCisJY2xhc3MgU2hvcnQ7DQorCWNsYXNzIFVTaG9ydDsNCisJY2xhc3MgU2hvcnQ0Ow0KKwljbGFzcyBVU2hvcnQ0Ow0KKwljbGFzcyBTaG9ydDg7DQorCWNsYXNzIFVTaG9ydDg7DQorCWNsYXNzIEludDsNCisJY2xhc3MgVUludDsNCisJY2xhc3MgSW50MjsNCisJY2xhc3MgVUludDI7DQorCWNsYXNzIEludDQ7DQorCWNsYXNzIFVJbnQ0Ow0KKwljbGFzcyBMb25nOw0KKwljbGFzcyBMb25nMTsNCisJY2xhc3MgTG9uZzI7DQorCWNsYXNzIEZsb2F0Ow0KKwljbGFzcyBGbG9hdDI7DQorCWNsYXNzIEZsb2F0NDsNCisNCisJY2xhc3MgVm9pZA0KKwl7DQorCXB1YmxpYzoNCisJCXN0YXRpYyBjb25zdCBsbHZtOjpUeXBlICpnZXRUeXBlKCk7DQorCQkNCisJCXN0YXRpYyBib29sIGlzVm9pZCgpDQorCQl7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorDQorCQl0eXBlZGVmIHZvaWQgY3R5cGU7DQorCX07DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCWNsYXNzIFZhcmlhYmxlDQorCXsNCisJcHVibGljOg0KKwkJc3RhdGljIGJvb2wgaXNWb2lkKCkNCisJCXsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorDQorCQlsbHZtOjpWYWx1ZSAqYWRkcmVzczsNCisJCXR5cGVkZWYgVCBjdHlwZTsNCisJfTsNCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJY2xhc3MgUlZhbHVlOw0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwljbGFzcyBSZWZlcmVuY2UNCisJew0KKwkJZnJpZW5kIExvbmcxOw0KKw0KKwlwdWJsaWM6DQorCQlleHBsaWNpdCBSZWZlcmVuY2UobGx2bTo6VmFsdWUgKnBvaW50ZXIsIGludCBhbGlnbm1lbnQgPSAxKTsNCisNCisJCVJWYWx1ZTxUPiBvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFQ+ICZyaHMpIGNvbnN0Ow0KKwkJb3BlcmF0b3IgUlZhbHVlPFQ+KCkgY29uc3Q7DQorCQlSVmFsdWU8VD4gb3BlcmF0b3I9KGNvbnN0IFJlZmVyZW5jZTxUPiAmcmVmKSBjb25zdDsNCisNCisJCVJWYWx1ZTxUPiBvcGVyYXRvcis9KGNvbnN0IFJWYWx1ZTxUPiAmcmhzKSBjb25zdDsNCisNCisJcHJpdmF0ZToNCisJCWxsdm06OlZhbHVlICphZGRyZXNzOw0KKw0KKwkJY29uc3QgaW50IGFsaWdubWVudDsNCisJfTsNCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJc3RydWN0IEludExpdGVyYWwNCisJew0KKwkJc3RydWN0IHR5cGU7DQorCX07DQorDQorCXRlbXBsYXRlPD4gc3RydWN0DQorCUludExpdGVyYWw8SW50Pg0KKwl7DQorCQl0eXBlZGVmIGludCB0eXBlOw0KKwl9Ow0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwljbGFzcyBSVmFsdWUNCisJew0KKwlwdWJsaWM6DQorCQlleHBsaWNpdCBSVmFsdWUobGx2bTo6VmFsdWUgKnJ2YWx1ZSk7DQorDQorCQlSVmFsdWUoY29uc3QgVCAmbHZhbHVlKTsNCisJCVJWYWx1ZSh0eXBlbmFtZSBJbnRMaXRlcmFsPFQ+Ojp0eXBlIGkpOw0KKw0KKwkJbGx2bTo6VmFsdWUgKnZhbHVlOyAgIC8vIEZJWE1FOiBNYWtlIHByaXZhdGUNCisJfTsNCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJY2xhc3MgUG9pbnRlcjsNCisNCisJY2xhc3MgQm9vbCA6IHB1YmxpYyBWYXJpYWJsZTxib29sPg0KKwl7DQorCXB1YmxpYzoNCisJCWV4cGxpY2l0IEJvb2wobGx2bTo6QXJndW1lbnQgKmFyZ3VtZW50KTsNCisNCisJCUJvb2woKTsNCisJCUJvb2woYm9vbCB4KTsNCisJCUJvb2woY29uc3QgUlZhbHVlPEJvb2w+ICZyaHMpOw0KKwkJQm9vbChjb25zdCBCb29sICZyaHMpOw0KKw0KKwkvLwlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I9KGJvb2wgcmhzKSBjb25zdDsgICAvLyBGSVhNRTogSW1wbGVtZW50DQorCQlSVmFsdWU8Qm9vbD4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxCb29sPiAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxCb29sPiBvcGVyYXRvcj0oY29uc3QgQm9vbCAmcmhzKSBjb25zdDsNCisNCisJCVJWYWx1ZTxQb2ludGVyPEJvb2w+PiBvcGVyYXRvciYoKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhKGNvbnN0IFJWYWx1ZTxCb29sPiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3ImJihjb25zdCBSVmFsdWU8Qm9vbD4gJmxocywgY29uc3QgUlZhbHVlPEJvb2w+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcnx8KGNvbnN0IFJWYWx1ZTxCb29sPiAmbGhzLCBjb25zdCBSVmFsdWU8Qm9vbD4gJnJocyk7DQorDQorCQlCb29sICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBCeXRlIDogcHVibGljIFZhcmlhYmxlPHVuc2lnbmVkIGNoYXI+DQorCXsNCisJcHVibGljOg0KKwkJZXhwbGljaXQgQnl0ZShsbHZtOjpBcmd1bWVudCAqYXJndW1lbnQpOw0KKw0KKwkJZXhwbGljaXQgQnl0ZShjb25zdCBSVmFsdWU8SW50PiAmY2FzdCk7DQorDQorCQlCeXRlKCk7DQorCQlCeXRlKGludCB4KTsNCisJCUJ5dGUodW5zaWduZWQgY2hhciB4KTsNCisJCUJ5dGUoY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpOw0KKwkJQnl0ZShjb25zdCBCeXRlICZyaHMpOw0KKw0KKwkvLwlSVmFsdWU8Qnl0ZT4gb3BlcmF0b3I9KHVuc2lnbmVkIGNoYXIgcmhzKSBjb25zdDsgICAvLyBGSVhNRTogSW1wbGVtZW50DQorCQlSVmFsdWU8Qnl0ZT4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxCeXRlPiBvcGVyYXRvcj0oY29uc3QgQnl0ZSAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxQb2ludGVyPEJ5dGU+PiBvcGVyYXRvciYoKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlPiBvcGVyYXRvciooY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlPiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3J8KGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlPiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3IrPShjb25zdCBCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3ItPShjb25zdCBCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3IqPShjb25zdCBCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3IvPShjb25zdCBCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3IlPShjb25zdCBCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3ImPShjb25zdCBCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3J8PShjb25zdCBCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3JePShjb25zdCBCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZT4gb3BlcmF0b3I8PD0oY29uc3QgQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU+IG9wZXJhdG9yPj49KGNvbnN0IEJ5dGUgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlPiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEJ5dGU+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlPiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEJ5dGU+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlPiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPEJ5dGU+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlPiBvcGVyYXRvcisrKGNvbnN0IEJ5dGUgJnZhbCwgaW50KTsgICAvLyBQb3N0LWluY3JlbWVudA0KKwkJZnJpZW5kIGNvbnN0IEJ5dGUgJm9wZXJhdG9yKysoY29uc3QgQnl0ZSAmdmFsKTsgICAvLyBQcmUtaW5jcmVtZW50DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU+IG9wZXJhdG9yLS0oY29uc3QgQnl0ZSAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtZGVjcmVtZW50DQorCQlmcmllbmQgY29uc3QgQnl0ZSAmb3BlcmF0b3ItLShjb25zdCBCeXRlICZ2YWwpOyAgIC8vIFByZS1kZWNyZW1lbnQNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8KGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPD0oY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+KGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPj0oY29uc3QgUlZhbHVlPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhPShjb25zdCBSVmFsdWU8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZT4gJnJocyk7DQorDQorCQlCeXRlICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBTQnl0ZSA6IHB1YmxpYyBWYXJpYWJsZTxzaWduZWQgY2hhcj4NCisJew0KKwlwdWJsaWM6DQorCQlleHBsaWNpdCBTQnl0ZShsbHZtOjpBcmd1bWVudCAqYXJndW1lbnQpOw0KKw0KKwkJU0J5dGUoKTsNCisJCVNCeXRlKHNpZ25lZCBjaGFyIHgpOw0KKwkJU0J5dGUoY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKTsNCisJCVNCeXRlKGNvbnN0IFNCeXRlICZyaHMpOw0KKw0KKwkvLwlSVmFsdWU8U0J5dGU+IG9wZXJhdG9yPShzaWduZWQgY2hhciByaHMpIGNvbnN0OyAgIC8vIEZJWE1FOiBJbXBsZW1lbnQNCisJCVJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8U0J5dGU+IG9wZXJhdG9yPShjb25zdCBTQnl0ZSAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxQb2ludGVyPFNCeXRlPj4gb3BlcmF0b3ImKCk7DQorDQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFNCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8U0J5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPFNCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8U0J5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPFNCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFNCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8U0J5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvcis9KGNvbnN0IFNCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvci09KGNvbnN0IFNCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvcio9KGNvbnN0IFNCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvci89KGNvbnN0IFNCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvciU9KGNvbnN0IFNCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvciY9KGNvbnN0IFNCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvcnw9KGNvbnN0IFNCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvcl49KGNvbnN0IFNCeXRlICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvcjw8PShjb25zdCBTQnl0ZSAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3I+Pj0oY29uc3QgU0J5dGUgJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8U0J5dGU+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZT4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlPiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPFNCeXRlPiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU+IG9wZXJhdG9yKysoY29uc3QgU0J5dGUgJnZhbCwgaW50KTsgICAvLyBQb3N0LWluY3JlbWVudA0KKwkJZnJpZW5kIGNvbnN0IFNCeXRlICZvcGVyYXRvcisrKGNvbnN0IFNCeXRlICZ2YWwpOyAgIC8vIFByZS1pbmNyZW1lbnQNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU+IG9wZXJhdG9yLS0oY29uc3QgU0J5dGUgJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkJZnJpZW5kIGNvbnN0IFNCeXRlICZvcGVyYXRvci0tKGNvbnN0IFNCeXRlICZ2YWwpOyAgIC8vIFByZS1kZWNyZW1lbnQNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8KGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8PShjb25zdCBSVmFsdWU8U0J5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPihjb25zdCBSVmFsdWU8U0J5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPj0oY29uc3QgUlZhbHVlPFNCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvciE9KGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I9PShjb25zdCBSVmFsdWU8U0J5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZT4gJnJocyk7DQorDQorCQlTQnl0ZSAqZ2V0VGhpcygpOw0KKwkJc3RhdGljIGNvbnN0IGxsdm06OlR5cGUgKmdldFR5cGUoKTsNCisJfTsNCisNCisJY2xhc3MgU2hvcnQgOiBwdWJsaWMgVmFyaWFibGU8c2hvcnQ+DQorCXsNCisJcHVibGljOg0KKwkJZXhwbGljaXQgU2hvcnQobGx2bTo6QXJndW1lbnQgKmFyZ3VtZW50KTsNCisNCisJCWV4cGxpY2l0IFNob3J0KGNvbnN0IFJWYWx1ZTxJbnQ+ICZjYXN0KTsNCisNCisJCVNob3J0KCk7DQorCQlTaG9ydChzaG9ydCB4KTsNCisJCVNob3J0KGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocyk7DQorCQlTaG9ydChjb25zdCBTaG9ydCAmcmhzKTsNCisNCisJLy8JUlZhbHVlPFNob3J0PiBvcGVyYXRvcj0oc2hvcnQgcmhzKSBjb25zdDsgICAvLyBGSVhNRTogSW1wbGVtZW50DQorCQlSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPFNob3J0PiBvcGVyYXRvcj0oY29uc3QgU2hvcnQgJnJocykgY29uc3Q7DQorCQlSVmFsdWU8UG9pbnRlcjxTaG9ydD4+IG9wZXJhdG9yJigpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8U2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0PiBvcGVyYXRvciooY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8U2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0PiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3J8KGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8U2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3IrPShjb25zdCBTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3ItPShjb25zdCBTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3IqPShjb25zdCBTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3IvPShjb25zdCBTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3IlPShjb25zdCBTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3ImPShjb25zdCBTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3J8PShjb25zdCBTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3JePShjb25zdCBTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3I8PD0oY29uc3QgU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yPj49KGNvbnN0IFNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFNob3J0PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8U2hvcnQ+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0PiBvcGVyYXRvcisrKGNvbnN0IFNob3J0ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1pbmNyZW1lbnQNCisJCWZyaWVuZCBjb25zdCBTaG9ydCAmb3BlcmF0b3IrKyhjb25zdCBTaG9ydCAmdmFsKTsgICAvLyBQcmUtaW5jcmVtZW50DQorCQlmcmllbmQgUlZhbHVlPFNob3J0PiBvcGVyYXRvci0tKGNvbnN0IFNob3J0ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1kZWNyZW1lbnQNCisJCWZyaWVuZCBjb25zdCBTaG9ydCAmb3BlcmF0b3ItLShjb25zdCBTaG9ydCAmdmFsKTsgICAvLyBQcmUtZGVjcmVtZW50DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8U2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPD0oY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj4oY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhPShjb25zdCBSVmFsdWU8U2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPT0oY29uc3QgUlZhbHVlPFNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ+ICZyaHMpOw0KKw0KKwkJU2hvcnQgKmdldFRoaXMoKTsNCisJCXN0YXRpYyBjb25zdCBsbHZtOjpUeXBlICpnZXRUeXBlKCk7DQorCX07DQorDQorCWNsYXNzIFVTaG9ydCA6IHB1YmxpYyBWYXJpYWJsZTx1bnNpZ25lZCBzaG9ydD4NCisJew0KKwlwdWJsaWM6DQorCQlleHBsaWNpdCBVU2hvcnQobGx2bTo6QXJndW1lbnQgKmFyZ3VtZW50KTsNCisNCisJCVVTaG9ydCgpOw0KKwkJVVNob3J0KHVuc2lnbmVkIHNob3J0IHgpOw0KKwkJVVNob3J0KGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJVVNob3J0KGNvbnN0IFVTaG9ydCAmcmhzKTsNCisNCisJLy8JUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3I9KHVuc2lnbmVkIHNob3J0IHJocykgY29uc3Q7ICAgLy8gRklYTUU6IEltcGxlbWVudA0KKwkJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3I9KGNvbnN0IFVTaG9ydCAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxQb2ludGVyPFVTaG9ydD4+IG9wZXJhdG9yJigpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0PiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0PiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VVNob3J0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yKz0oY29uc3QgVVNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yLT0oY29uc3QgVVNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yKj0oY29uc3QgVVNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yLz0oY29uc3QgVVNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yJT0oY29uc3QgVVNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yJj0oY29uc3QgVVNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yfD0oY29uc3QgVVNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yXj0oY29uc3QgVVNob3J0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yPDw9KGNvbnN0IFVTaG9ydCAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0PiBvcGVyYXRvcj4+PShjb25zdCBVU2hvcnQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8VVNob3J0PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0PiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPFVTaG9ydD4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydD4gb3BlcmF0b3IrKyhjb25zdCBVU2hvcnQgJnZhbCwgaW50KTsgICAvLyBQb3N0LWluY3JlbWVudA0KKwkJZnJpZW5kIGNvbnN0IFVTaG9ydCAmb3BlcmF0b3IrKyhjb25zdCBVU2hvcnQgJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ+IG9wZXJhdG9yLS0oY29uc3QgVVNob3J0ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1kZWNyZW1lbnQNCisJCWZyaWVuZCBjb25zdCBVU2hvcnQgJm9wZXJhdG9yLS0oY29uc3QgVVNob3J0ICZ2YWwpOyAgIC8vIFByZS1kZWNyZW1lbnQNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8KGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcjw9KGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj4oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPj0oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yIT0oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPT0oY29uc3QgUlZhbHVlPFVTaG9ydD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydD4gJnJocyk7DQorDQorCQlVU2hvcnQgKmdldFRoaXMoKTsNCisJCXN0YXRpYyBjb25zdCBsbHZtOjpUeXBlICpnZXRUeXBlKCk7DQorCX07DQorDQorCWNsYXNzIEJ5dGU0IDogcHVibGljIFZhcmlhYmxlPGJ5dGU0Pg0KKwl7DQorCXB1YmxpYzoNCisJLy8JQnl0ZTQoKTsNCisJLy8JQnl0ZTQoaW50IHgsIGludCB5LCBpbnQgeiwgaW50IHcpOw0KKwkvLwlCeXRlNChjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZyaHMpOw0KKwkvLwlCeXRlNChjb25zdCBCeXRlNCAmcmhzKTsNCisNCisJLy8JUlZhbHVlPEJ5dGU0PiBvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEJ5dGU0PiAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPEJ5dGU0PiBvcGVyYXRvcj0oY29uc3QgQnl0ZTQgJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxQb2ludGVyPEJ5dGU0Pj4gb3BlcmF0b3ImKCk7DQorDQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPEJ5dGU0PiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGU0PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxCeXRlND4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlND4gb3BlcmF0b3IrPShjb25zdCBCeXRlNCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGU0PiBvcGVyYXRvci09KGNvbnN0IEJ5dGU0ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yKj0oY29uc3QgQnl0ZTQgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlND4gb3BlcmF0b3IvPShjb25zdCBCeXRlNCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGU0PiBvcGVyYXRvciU9KGNvbnN0IEJ5dGU0ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yJj0oY29uc3QgQnl0ZTQgJmxocywgY29uc3QgUlZhbHVlPEJ5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlND4gb3BlcmF0b3J8PShjb25zdCBCeXRlNCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGU0PiBvcGVyYXRvcl49KGNvbnN0IEJ5dGU0ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yPDw9KGNvbnN0IEJ5dGU0ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yPj49KGNvbnN0IEJ5dGU0ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8Qnl0ZTQ+ICZ2YWwpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGU0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEJ5dGU0PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlND4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxCeXRlND4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTQ+IG9wZXJhdG9yKysoY29uc3QgQnl0ZTQgJnZhbCwgaW50KTsgICAvLyBQb3N0LWluY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgQnl0ZTQgJm9wZXJhdG9yKysoY29uc3QgQnl0ZTQgJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGU0PiBvcGVyYXRvci0tKGNvbnN0IEJ5dGU0ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IEJ5dGU0ICZvcGVyYXRvci0tKGNvbnN0IEJ5dGU0ICZ2YWwpOyAgIC8vIFByZS1kZWNyZW1lbnQNCisNCisJCUJ5dGU0ICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBTQnl0ZTQgOiBwdWJsaWMgVmFyaWFibGU8c2J5dGU0Pg0KKwl7DQorCXB1YmxpYzoNCisJLy8JU0J5dGU0KCk7DQorCS8vCVNCeXRlNChpbnQgeCwgaW50IHksIGludCB6LCBpbnQgdyk7DQorCS8vCVNCeXRlNChjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JU0J5dGU0KGNvbnN0IFNCeXRlNCAmcmhzKTsNCisNCisJLy8JUlZhbHVlPFNCeXRlND4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxTQnl0ZTQ+ICZyaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8U0J5dGU0PiBvcGVyYXRvcj0oY29uc3QgU0J5dGU0ICZyaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8UG9pbnRlcjxTQnl0ZTQ+PiBvcGVyYXRvciYoKTsNCisNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8U0J5dGU0PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8U0J5dGU0PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8U0J5dGU0PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8U0J5dGU0PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8U0J5dGU0PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8U0J5dGU0PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8U0J5dGU0PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8U0J5dGU0PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFNCeXRlND4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGU0PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxTQnl0ZTQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlND4gb3BlcmF0b3IrPShjb25zdCBTQnl0ZTQgJmxocywgY29uc3QgUlZhbHVlPFNCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGU0PiBvcGVyYXRvci09KGNvbnN0IFNCeXRlNCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yKj0oY29uc3QgU0J5dGU0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlND4gb3BlcmF0b3IvPShjb25zdCBTQnl0ZTQgJmxocywgY29uc3QgUlZhbHVlPFNCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGU0PiBvcGVyYXRvciU9KGNvbnN0IFNCeXRlNCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yJj0oY29uc3QgU0J5dGU0ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlND4gb3BlcmF0b3J8PShjb25zdCBTQnl0ZTQgJmxocywgY29uc3QgUlZhbHVlPFNCeXRlND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGU0PiBvcGVyYXRvcl49KGNvbnN0IFNCeXRlNCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yPDw9KGNvbnN0IFNCeXRlNCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yPj49KGNvbnN0IFNCeXRlNCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8U0J5dGU0PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8U0J5dGU0PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8U0J5dGU0PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTQ+IG9wZXJhdG9yKysoY29uc3QgU0J5dGU0ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IFNCeXRlNCAmb3BlcmF0b3IrKyhjb25zdCBTQnl0ZTQgJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlND4gb3BlcmF0b3ItLShjb25zdCBTQnl0ZTQgJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgU0J5dGU0ICZvcGVyYXRvci0tKGNvbnN0IFNCeXRlNCAmdmFsKTsgICAvLyBQcmUtZGVjcmVtZW50DQorDQorCQlTQnl0ZTQgKmdldFRoaXMoKTsNCisJCXN0YXRpYyBjb25zdCBsbHZtOjpUeXBlICpnZXRUeXBlKCk7DQorCX07DQorDQorCWNsYXNzIEJ5dGU4IDogcHVibGljIFZhcmlhYmxlPGJ5dGU4Pg0KKwl7DQorCXB1YmxpYzoNCisJCUJ5dGU4KCk7DQorCQlCeXRlOChieXRlIHgwLCBieXRlIHgxLCBieXRlIHgyLCBieXRlIHgzLCBieXRlIHg0LCBieXRlIHg1LCBieXRlIHg2LCBieXRlIHg3KTsNCisJCUJ5dGU4KGludDY0X3QgeCk7DQorCQlCeXRlOChjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJQnl0ZTgoY29uc3QgQnl0ZTggJnJocyk7DQorDQorCQlSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcj0oY29uc3QgQnl0ZTggJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxQb2ludGVyPEJ5dGU4Pj4gb3BlcmF0b3ImKCk7DQorDQorCQlmcmllbmQgUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEJ5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8Qnl0ZTg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU4PiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPEJ5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8Qnl0ZTg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPEJ5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGU4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8Qnl0ZTg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPEJ5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3IrPShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3ItPShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3IqPShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3IvPShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3IlPShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3ImPShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3J8PShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3JePShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcjw8PShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcj4+PShjb25zdCBCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU4PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEJ5dGU4PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZTg+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8Qnl0ZTg+ICZ2YWwpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGU4PiBvcGVyYXRvcisrKGNvbnN0IEJ5dGU4ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IEJ5dGU4ICZvcGVyYXRvcisrKGNvbnN0IEJ5dGU4ICZ2YWwpOyAgIC8vIFByZS1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlOD4gb3BlcmF0b3ItLShjb25zdCBCeXRlOCAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtZGVjcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBCeXRlOCAmb3BlcmF0b3ItLShjb25zdCBCeXRlOCAmdmFsKTsgICAvLyBQcmUtZGVjcmVtZW50DQorDQorCQlmcmllbmQgUlZhbHVlPEJ5dGU4PiBBZGRTYXQoY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCwgY29uc3QgUlZhbHVlPEJ5dGU4PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU4PiBTdWJTYXQoY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCwgY29uc3QgUlZhbHVlPEJ5dGU4PiAmeSk7DQorDQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gVW5wYWNrTG93KGNvbnN0IFJWYWx1ZTxCeXRlOD4gJngsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IFVucGFja0hpZ2goY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCwgY29uc3QgUlZhbHVlPEJ5dGU4PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPEludD4gU2lnbk1hc2soY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCk7DQorDQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTg+IENtcEdUKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJngsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCeXRlOD4gQ21wRVEoY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCwgY29uc3QgUlZhbHVlPEJ5dGU4PiAmeSk7DQorDQorCQlCeXRlOCAqZ2V0VGhpcygpOw0KKwkJc3RhdGljIGNvbnN0IGxsdm06OlR5cGUgKmdldFR5cGUoKTsNCisJfTsNCisNCisJY2xhc3MgU0J5dGU4IDogcHVibGljIFZhcmlhYmxlPHNieXRlOD4NCisJew0KKwlwdWJsaWM6DQorCQlTQnl0ZTgoKTsNCisJCVNCeXRlOChieXRlIHgwLCBieXRlIHgxLCBieXRlIHgyLCBieXRlIHgzLCBieXRlIHg0LCBieXRlIHg1LCBieXRlIHg2LCBieXRlIHg3KTsNCisJCVNCeXRlOChpbnQ2NF90IHgpOw0KKwkJU0J5dGU4KGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZyaHMpOw0KKwkJU0J5dGU4KGNvbnN0IFNCeXRlOCAmcmhzKTsNCisNCisJCVJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yPShjb25zdCBTQnl0ZTggJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxQb2ludGVyPFNCeXRlOD4+IG9wZXJhdG9yJigpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8U0J5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFNCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlOD4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8U0J5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPFNCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlOD4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8U0J5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPFNCeXRlOD4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlOD4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8U0J5dGU4PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcis9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvci09KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcio9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvci89KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvciU9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvciY9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcnw9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcl49KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yPDw9KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yPj49KGNvbnN0IFNCeXRlOCAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U0J5dGU4PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFNCeXRlOD4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlOD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8U0J5dGU4PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTg+IG9wZXJhdG9yKysoY29uc3QgU0J5dGU4ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IFNCeXRlOCAmb3BlcmF0b3IrKyhjb25zdCBTQnl0ZTggJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlOD4gb3BlcmF0b3ItLShjb25zdCBTQnl0ZTggJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgU0J5dGU4ICZvcGVyYXRvci0tKGNvbnN0IFNCeXRlOCAmdmFsKTsgICAvLyBQcmUtZGVjcmVtZW50DQorDQorCQlmcmllbmQgUlZhbHVlPFNCeXRlOD4gQWRkU2F0KGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPFNCeXRlOD4gU3ViU2F0KGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmeSk7DQorDQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gVW5wYWNrTG93KGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gVW5wYWNrSGlnaChjb25zdCBSVmFsdWU8U0J5dGU4PiAmeCwgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ+IFNpZ25NYXNrKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4KTsNCisNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZTg+IENtcEdUKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPEJ5dGU4PiBDbXBFUShjb25zdCBSVmFsdWU8U0J5dGU4PiAmeCwgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnkpOw0KKw0KKwkJU0J5dGU4ICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBCeXRlMTYgOiBwdWJsaWMgVmFyaWFibGU8Ynl0ZTE2Pg0KKwl7DQorCXB1YmxpYzoNCisJLy8JQnl0ZTE2KCk7DQorCS8vCUJ5dGUxNihpbnQgeCwgaW50IHksIGludCB6LCBpbnQgdyk7DQorCQlCeXRlMTYoY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCQlCeXRlMTYoY29uc3QgQnl0ZTE2ICZyaHMpOw0KKw0KKwkJUlZhbHVlPEJ5dGUxNj4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxCeXRlMTY+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPEJ5dGUxNj4gb3BlcmF0b3I9KGNvbnN0IEJ5dGUxNiAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPFBvaW50ZXI8Qnl0ZTE2Pj4gb3BlcmF0b3ImKCk7DQorDQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEJ5dGUxNj4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEJ5dGUxNj4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvciooY29uc3QgUlZhbHVlPEJ5dGUxNj4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPEJ5dGUxNj4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPEJ5dGUxNj4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPEJ5dGUxNj4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPEJ5dGUxNj4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPEJ5dGUxNj4gJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxCeXRlMTY+ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlMTY+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGUxNj4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8Qnl0ZTE2PiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTE2PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlMTY+IG9wZXJhdG9yKz0oY29uc3QgQnl0ZTE2ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlMTY+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGUxNj4gb3BlcmF0b3ItPShjb25zdCBCeXRlMTYgJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcio9KGNvbnN0IEJ5dGUxNiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTE2PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlMTY+IG9wZXJhdG9yLz0oY29uc3QgQnl0ZTE2ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlMTY+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGUxNj4gb3BlcmF0b3IlPShjb25zdCBCeXRlMTYgJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvciY9KGNvbnN0IEJ5dGUxNiAmbGhzLCBjb25zdCBSVmFsdWU8Qnl0ZTE2PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlMTY+IG9wZXJhdG9yfD0oY29uc3QgQnl0ZTE2ICZsaHMsIGNvbnN0IFJWYWx1ZTxCeXRlMTY+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJ5dGUxNj4gb3BlcmF0b3JePShjb25zdCBCeXRlMTYgJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcjw8PShjb25zdCBCeXRlMTYgJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcj4+PShjb25zdCBCeXRlMTYgJmxocywgY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPEJ5dGUxNj4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qnl0ZTE2PiBvcGVyYXRvcisrKGNvbnN0IEJ5dGUxNiAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBCeXRlMTYgJm9wZXJhdG9yKysoY29uc3QgQnl0ZTE2ICZ2YWwpOyAgIC8vIFByZS1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIFJWYWx1ZTxCeXRlMTY+IG9wZXJhdG9yLS0oY29uc3QgQnl0ZTE2ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IEJ5dGUxNiAmb3BlcmF0b3ItLShjb25zdCBCeXRlMTYgJnZhbCk7ICAgLy8gUHJlLWRlY3JlbWVudA0KKw0KKwkJQnl0ZTE2ICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBTQnl0ZTE2IDogcHVibGljIFZhcmlhYmxlPHNieXRlMTY+DQorCXsNCisJcHVibGljOg0KKwkvLwlTQnl0ZTE2KCk7DQorCS8vCVNCeXRlMTYoaW50IHgsIGludCB5LCBpbnQgeiwgaW50IHcpOw0KKwkvLwlTQnl0ZTE2KGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmcmhzKTsNCisJLy8JU0J5dGUxNihjb25zdCBTQnl0ZTE2ICZyaHMpOw0KKw0KKwkvLwlSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPFNCeXRlMTY+IG9wZXJhdG9yPShjb25zdCBTQnl0ZTE2ICZyaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8UG9pbnRlcjxTQnl0ZTE2Pj4gb3BlcmF0b3ImKCk7DQorDQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3J8KGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8U0J5dGUxNj4gJmxocywgY29uc3QgUlZhbHVlPFNCeXRlMTY+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlMTY+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFNCeXRlMTY+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTE2PiBvcGVyYXRvcis9KGNvbnN0IFNCeXRlMTYgJmxocywgY29uc3QgUlZhbHVlPFNCeXRlMTY+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlMTY+IG9wZXJhdG9yLT0oY29uc3QgU0J5dGUxNiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3IqPShjb25zdCBTQnl0ZTE2ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTE2PiBvcGVyYXRvci89KGNvbnN0IFNCeXRlMTYgJmxocywgY29uc3QgUlZhbHVlPFNCeXRlMTY+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlMTY+IG9wZXJhdG9yJT0oY29uc3QgU0J5dGUxNiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3ImPShjb25zdCBTQnl0ZTE2ICZsaHMsIGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTE2PiBvcGVyYXRvcnw9KGNvbnN0IFNCeXRlMTYgJmxocywgY29uc3QgUlZhbHVlPFNCeXRlMTY+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlMTY+IG9wZXJhdG9yXj0oY29uc3QgU0J5dGUxNiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3I8PD0oY29uc3QgU0J5dGUxNiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3I+Pj0oY29uc3QgU0J5dGUxNiAmbGhzLCBjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxTQnl0ZTE2PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTQnl0ZTE2PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFNCeXRlMTY+ICZ2YWwpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNCeXRlMTY+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8U0J5dGUxNj4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3IrKyhjb25zdCBTQnl0ZTE2ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IFNCeXRlMTYgJm9wZXJhdG9yKysoY29uc3QgU0J5dGUxNiAmdmFsKTsgICAvLyBQcmUtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBSVmFsdWU8U0J5dGUxNj4gb3BlcmF0b3ItLShjb25zdCBTQnl0ZTE2ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IFNCeXRlMTYgJm9wZXJhdG9yLS0oY29uc3QgU0J5dGUxNiAmdmFsKTsgICAvLyBQcmUtZGVjcmVtZW50DQorDQorCQlTQnl0ZTE2ICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBTaG9ydDQgOiBwdWJsaWMgVmFyaWFibGU8c2hvcnQ0Pg0KKwl7DQorCXB1YmxpYzoNCisJCWV4cGxpY2l0IFNob3J0NChjb25zdCBSVmFsdWU8SW50PiAmY2FzdCk7DQorCQlleHBsaWNpdCBTaG9ydDQoY29uc3QgUlZhbHVlPEludDQ+ICZjYXN0KTsNCisJLy8JZXhwbGljaXQgU2hvcnQ0KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmNhc3QpOw0KKwkJZXhwbGljaXQgU2hvcnQ0KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZjYXN0KTsNCisNCisJCVNob3J0NCgpOw0KKwkJU2hvcnQ0KHNob3J0IHgsIHNob3J0IHksIHNob3J0IHosIHNob3J0IHcpOw0KKwkJU2hvcnQ0KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpOw0KKwkJU2hvcnQ0KGNvbnN0IFNob3J0NCAmcmhzKTsNCisJCVNob3J0NChjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCQlTaG9ydDQoY29uc3QgVVNob3J0NCAmcmhzKTsNCisNCisJCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8U2hvcnQ0PiAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPShjb25zdCBTaG9ydDQgJnJocykgY29uc3Q7DQorCQlSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPFNob3J0ND4gb3BlcmF0b3I9KGNvbnN0IFVTaG9ydDQgJnJocykgY29uc3Q7DQorCQlSVmFsdWU8UG9pbnRlcjxTaG9ydDQ+PiBvcGVyYXRvciYoKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8U2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8U2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IrPShjb25zdCBTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3ItPShjb25zdCBTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IqPShjb25zdCBTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IvPShjb25zdCBTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IlPShjb25zdCBTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3ImPShjb25zdCBTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3J8PShjb25zdCBTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3JePShjb25zdCBTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3I8PD0oY29uc3QgU2hvcnQ0ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvcj4+PShjb25zdCBTaG9ydDQgJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPDw9KGNvbnN0IFNob3J0NCAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yPj49KGNvbnN0IFNob3J0NCAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8U2hvcnQ0PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFNob3J0ND4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ2YWwpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNob3J0ND4gb3BlcmF0b3IrKyhjb25zdCBTaG9ydDQgJnZhbCwgaW50KTsgICAvLyBQb3N0LWluY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgU2hvcnQ0ICZvcGVyYXRvcisrKGNvbnN0IFNob3J0NCAmdmFsKTsgICAvLyBQcmUtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBSVmFsdWU8U2hvcnQ0PiBvcGVyYXRvci0tKGNvbnN0IFNob3J0NCAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtZGVjcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBTaG9ydDQgJm9wZXJhdG9yLS0oY29uc3QgU2hvcnQ0ICZ2YWwpOyAgIC8vIFByZS1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcjwoY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8PShjb25zdCBSVmFsdWU8U2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj4oY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+PShjb25zdCBSVmFsdWU8U2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvciE9KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPT0oY29uc3QgUlZhbHVlPFNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorDQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gUm91bmRTaG9ydDQoY29uc3QgUlZhbHVlPEZsb2F0ND4gJmNhc3QpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IE1heChjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IE1pbihjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IEFkZFNhdChjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IFN1YlNhdChjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IE11bEhpZ2goY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gTXVsQWRkKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSk7DQorDQorCQlmcmllbmQgUlZhbHVlPFNCeXRlOD4gUGFjayhjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQyPiBVbnBhY2tMb3coY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gVW5wYWNrSGlnaChjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDQ+IFN3aXp6bGUoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIHVuc2lnbmVkIGNoYXIgc2VsZWN0KTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ0PiBJbnNlcnQoY29uc3QgUlZhbHVlPFNob3J0ND4gJnZhbCwgY29uc3QgUlZhbHVlPFNob3J0PiAmZWxlbWVudCwgaW50IGkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydD4gRXh0cmFjdChjb25zdCBSVmFsdWU8U2hvcnQ0PiAmdmFsLCBpbnQgaSk7DQorDQorCQlmcmllbmQgUlZhbHVlPFNob3J0ND4gQ21wR1QoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ0PiBDbXBFUShjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpOw0KKw0KKwkJU2hvcnQ0ICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBVU2hvcnQ0IDogcHVibGljIFZhcmlhYmxlPHVzaG9ydDQ+DQorCXsNCisJcHVibGljOg0KKwkJZXhwbGljaXQgVVNob3J0NChjb25zdCBSVmFsdWU8SW50ND4gJmNhc3QpOw0KKwkJZXhwbGljaXQgVVNob3J0NChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmY2FzdCwgYm9vbCBzYXR1cmF0ZSA9IGZhbHNlKTsNCisNCisJCVVTaG9ydDQoKTsNCisJCVVTaG9ydDQodW5zaWduZWQgc2hvcnQgeCwgdW5zaWduZWQgc2hvcnQgeSwgdW5zaWduZWQgc2hvcnQgeiwgdW5zaWduZWQgc2hvcnQgdyk7DQorCQlVU2hvcnQ0KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmcmhzKTsNCisJCVVTaG9ydDQoY29uc3QgVVNob3J0NCAmcmhzKTsNCisJCVVTaG9ydDQoY29uc3QgUlZhbHVlPFNob3J0ND4gJnJocyk7DQorCQlVU2hvcnQ0KGNvbnN0IFNob3J0NCAmcmhzKTsNCisNCisJCVJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yPShjb25zdCBVU2hvcnQ0ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8U2hvcnQ0PiAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcj0oY29uc3QgU2hvcnQ0ICZyaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8UG9pbnRlcjxVU2hvcnQ0Pj4gb3BlcmF0b3ImKCk7DQorDQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8VVNob3J0ND4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3J8KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8VVNob3J0ND4gJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yKz0oY29uc3QgVVNob3J0NCAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3ItPShjb25zdCBVU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcio9KGNvbnN0IFVTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yLz0oY29uc3QgVVNob3J0NCAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3IlPShjb25zdCBVU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvciY9KGNvbnN0IFVTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yfD0oY29uc3QgVVNob3J0NCAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3JePShjb25zdCBVU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3I8PD0oY29uc3QgVVNob3J0NCAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yPj49KGNvbnN0IFVTaG9ydDQgJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcjw8PShjb25zdCBVU2hvcnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yPj49KGNvbnN0IFVTaG9ydDQgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ2YWwpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8VVNob3J0ND4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8VVNob3J0ND4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3IrKyhjb25zdCBVU2hvcnQ0ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IFVTaG9ydDQgJm9wZXJhdG9yKysoY29uc3QgVVNob3J0NCAmdmFsKTsgICAvLyBQcmUtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0ND4gb3BlcmF0b3ItLShjb25zdCBVU2hvcnQ0ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IFVTaG9ydDQgJm9wZXJhdG9yLS0oY29uc3QgVVNob3J0NCAmdmFsKTsgICAvLyBQcmUtZGVjcmVtZW50DQorDQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IE1heChjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IE1pbihjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IEFkZFNhdChjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IFN1YlNhdChjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDQ+IE11bEhpZ2goY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnkpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ0PiBBdmVyYWdlKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ5KTsNCisNCisJCWZyaWVuZCBSVmFsdWU8Qnl0ZTg+IFBhY2soY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnkpOw0KKw0KKwkJVVNob3J0NCAqZ2V0VGhpcygpOw0KKwkJc3RhdGljIGNvbnN0IGxsdm06OlR5cGUgKmdldFR5cGUoKTsNCisJfTsNCisNCisJY2xhc3MgU2hvcnQ4IDogcHVibGljIFZhcmlhYmxlPHNob3J0OD4NCisJew0KKwlwdWJsaWM6DQorCS8vCVNob3J0OCgpOw0KKwkJU2hvcnQ4KHNob3J0IGMwLCBzaG9ydCBjMSwgc2hvcnQgYzIsIHNob3J0IGMzLCBzaG9ydCBjNCwgc2hvcnQgYzUsIHNob3J0IGM2LCBzaG9ydCBjNyk7DQorCQlTaG9ydDgoY29uc3QgUlZhbHVlPFNob3J0OD4gJnJocyk7DQorCS8vCVNob3J0OChjb25zdCBTaG9ydDggJnJocyk7DQorDQorCS8vCVJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPFNob3J0OD4gb3BlcmF0b3I9KGNvbnN0IFNob3J0OCAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPFBvaW50ZXI8U2hvcnQ4Pj4gb3BlcmF0b3ImKCk7DQorDQorCQlmcmllbmQgUlZhbHVlPFNob3J0OD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNob3J0OD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNob3J0OD4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNob3J0OD4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNob3J0OD4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8U2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8U2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8U2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ4PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ4PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPFNob3J0OD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U2hvcnQ4PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNob3J0OD4gb3BlcmF0b3IrPShjb25zdCBTaG9ydDggJmxocywgY29uc3QgUlZhbHVlPFNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U2hvcnQ4PiBvcGVyYXRvci09KGNvbnN0IFNob3J0OCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yKj0oY29uc3QgU2hvcnQ4ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNob3J0OD4gb3BlcmF0b3IvPShjb25zdCBTaG9ydDggJmxocywgY29uc3QgUlZhbHVlPFNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U2hvcnQ4PiBvcGVyYXRvciU9KGNvbnN0IFNob3J0OCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yJj0oY29uc3QgU2hvcnQ4ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFNob3J0OD4gb3BlcmF0b3J8PShjb25zdCBTaG9ydDggJmxocywgY29uc3QgUlZhbHVlPFNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8U2hvcnQ4PiBvcGVyYXRvcl49KGNvbnN0IFNob3J0OCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yPDw9KGNvbnN0IFNob3J0OCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yPj49KGNvbnN0IFNob3J0OCAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8U2hvcnQ4PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8U2hvcnQ4PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yfihjb25zdCBSVmFsdWU8U2hvcnQ4PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IG9wZXJhdG9yKysoY29uc3QgU2hvcnQ4ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IFNob3J0OCAmb3BlcmF0b3IrKyhjb25zdCBTaG9ydDggJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPFNob3J0OD4gb3BlcmF0b3ItLShjb25zdCBTaG9ydDggJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgU2hvcnQ4ICZvcGVyYXRvci0tKGNvbnN0IFNob3J0OCAmdmFsKTsgICAvLyBQcmUtZGVjcmVtZW50DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPD0oY29uc3QgUlZhbHVlPFNob3J0OD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPj0oY29uc3QgUlZhbHVlPFNob3J0OD4gJmxocywgY29uc3QgUlZhbHVlPFNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhPShjb25zdCBSVmFsdWU8U2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZyaHMpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IENvbmNhdGVuYXRlKGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZsbywgY29uc3QgUlZhbHVlPFNob3J0ND4gJmhpKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8U2hvcnQ4PiBNdWxIaWdoKGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPEludDQ+IE11bEFkZChjb25zdCBSVmFsdWU8U2hvcnQ4PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0OD4gJnkpOw0KKw0KKwkJU2hvcnQ4ICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBVU2hvcnQ4IDogcHVibGljIFZhcmlhYmxlPHVzaG9ydDg+DQorCXsNCisJcHVibGljOg0KKwkvLwlVU2hvcnQ4KCk7DQorCQlVU2hvcnQ4KHVuc2lnbmVkIHNob3J0IGMwLCB1bnNpZ25lZCBzaG9ydCBjMSwgdW5zaWduZWQgc2hvcnQgYzIsIHVuc2lnbmVkIHNob3J0IGMzLCB1bnNpZ25lZCBzaG9ydCBjNCwgdW5zaWduZWQgc2hvcnQgYzUsIHVuc2lnbmVkIHNob3J0IGM2LCB1bnNpZ25lZCBzaG9ydCBjNyk7DQorCQlVU2hvcnQ4KGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJLy8JVVNob3J0OChjb25zdCBVU2hvcnQ4ICZyaHMpOw0KKw0KKwkJUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8VVNob3J0OD4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3I9KGNvbnN0IFVTaG9ydDggJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxQb2ludGVyPFVTaG9ydDg+PiBvcGVyYXRvciYoKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0OD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8VVNob3J0OD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8VVNob3J0OD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8VVNob3J0OD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VVNob3J0OD4gJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VVNob3J0OD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3IrPShjb25zdCBVU2hvcnQ4ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvci09KGNvbnN0IFVTaG9ydDggJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yKj0oY29uc3QgVVNob3J0OCAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3IvPShjb25zdCBVU2hvcnQ4ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvciU9KGNvbnN0IFVTaG9ydDggJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yJj0oY29uc3QgVVNob3J0OCAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3J8PShjb25zdCBVU2hvcnQ4ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvcl49KGNvbnN0IFVTaG9ydDggJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yPDw9KGNvbnN0IFVTaG9ydDggJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yPj49KGNvbnN0IFVTaG9ydDggJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8VVNob3J0OD4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvcisrKGNvbnN0IFVTaG9ydDggJnZhbCwgaW50KTsgICAvLyBQb3N0LWluY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgVVNob3J0OCAmb3BlcmF0b3IrKyhjb25zdCBVU2hvcnQ4ICZ2YWwpOyAgIC8vIFByZS1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBvcGVyYXRvci0tKGNvbnN0IFVTaG9ydDggJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgVVNob3J0OCAmb3BlcmF0b3ItLShjb25zdCBVU2hvcnQ4ICZ2YWwpOyAgIC8vIFByZS1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcjwoY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcjw9KGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+KGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0OD4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+PShjb25zdCBSVmFsdWU8VVNob3J0OD4gJmxocywgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yIT0oY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmbGhzLCBjb25zdCBSVmFsdWU8VVNob3J0OD4gJnJocyk7DQorDQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IFN3aXp6bGUoY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZ4LCBjaGFyIHNlbGVjdDAsIGNoYXIgc2VsZWN0MSwgY2hhciBzZWxlY3QyLCBjaGFyIHNlbGVjdDMsIGNoYXIgc2VsZWN0NCwgY2hhciBzZWxlY3Q1LCBjaGFyIHNlbGVjdDYsIGNoYXIgc2VsZWN0Nyk7DQorCQlmcmllbmQgUlZhbHVlPFVTaG9ydDg+IENvbmNhdGVuYXRlKGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmbG8sIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmaGkpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxVU2hvcnQ4PiBNdWxIaWdoKGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmeCwgY29uc3QgUlZhbHVlPFVTaG9ydDg+ICZ5KTsNCisNCisJCVVTaG9ydDggKmdldFRoaXMoKTsNCisJCXN0YXRpYyBjb25zdCBsbHZtOjpUeXBlICpnZXRUeXBlKCk7DQorCX07DQorDQorCWNsYXNzIEludCA6IHB1YmxpYyBWYXJpYWJsZTxpbnQ+DQorCXsNCisJcHVibGljOg0KKwkJZXhwbGljaXQgSW50KGxsdm06OkFyZ3VtZW50ICphcmd1bWVudCk7DQorDQorCQlleHBsaWNpdCBJbnQoY29uc3QgUlZhbHVlPEJ5dGU+ICZjYXN0KTsNCisJCWV4cGxpY2l0IEludChjb25zdCBSVmFsdWU8U0J5dGU+ICZjYXN0KTsNCisJCWV4cGxpY2l0IEludChjb25zdCBSVmFsdWU8U2hvcnQ+ICZjYXN0KTsNCisJCWV4cGxpY2l0IEludChjb25zdCBSVmFsdWU8VVNob3J0PiAmY2FzdCk7DQorCQlleHBsaWNpdCBJbnQoY29uc3QgUlZhbHVlPEludDI+ICZjYXN0KTsNCisJCWV4cGxpY2l0IEludChjb25zdCBSVmFsdWU8TG9uZz4gJmNhc3QpOw0KKwkJZXhwbGljaXQgSW50KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmNhc3QpOw0KKw0KKwkJSW50KCk7DQorCQlJbnQoaW50IHgpOw0KKwkJSW50KGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKwkJSW50KGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKTsNCisJCUludChjb25zdCBJbnQgJnJocyk7DQorCQlJbnQoY29uc3QgVUludCAmcmhzKTsNCisNCisJCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yPShpbnQgcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8SW50PiAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxJbnQ+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8VUludD4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8SW50PiBvcGVyYXRvcj0oY29uc3QgSW50ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPEludD4gb3BlcmF0b3I9KGNvbnN0IFVJbnQgJnJocykgY29uc3Q7DQorCQlSVmFsdWU8UG9pbnRlcjxJbnQ+PiBvcGVyYXRvciYoKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEludD4gJmxocywgY29uc3QgUlZhbHVlPEludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPEludD4gJmxocywgY29uc3QgUlZhbHVlPEludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludD4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ+IG9wZXJhdG9yJihjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPEludD4gJmxocywgY29uc3QgUlZhbHVlPEludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludD4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ+IG9wZXJhdG9yPDwoY29uc3QgUlZhbHVlPEludD4gJmxocywgY29uc3QgUlZhbHVlPEludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludD4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvcis9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvci09KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvcio9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvci89KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvciU9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvciY9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvcnw9KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvcl49KGNvbnN0IEludCAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvcjw8PShjb25zdCBJbnQgJmxocywgY29uc3QgUlZhbHVlPEludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludD4gb3BlcmF0b3I+Pj0oY29uc3QgSW50ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8SW50PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEludD4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPEludD4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxJbnQ+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ+IG9wZXJhdG9yKysoY29uc3QgSW50ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1pbmNyZW1lbnQNCisJCWZyaWVuZCBjb25zdCBJbnQgJm9wZXJhdG9yKysoY29uc3QgSW50ICZ2YWwpOyAgIC8vIFByZS1pbmNyZW1lbnQNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBvcGVyYXRvci0tKGNvbnN0IEludCAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtZGVjcmVtZW50DQorCQlmcmllbmQgY29uc3QgSW50ICZvcGVyYXRvci0tKGNvbnN0IEludCAmdmFsKTsgICAvLyBQcmUtZGVjcmVtZW50DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8PShjb25zdCBSVmFsdWU8SW50PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+KGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvciE9KGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ+IFJvdW5kSW50KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmNhc3QpOw0KKw0KKwkJSW50ICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBMb25nIDogcHVibGljIFZhcmlhYmxlPHF3b3JkPg0KKwl7DQorCXB1YmxpYzoNCisJLy8JZXhwbGljaXQgTG9uZyhsbHZtOjpBcmd1bWVudCAqYXJndW1lbnQpOw0KKw0KKwkvLwlleHBsaWNpdCBMb25nKGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmNhc3QpOw0KKwkvLwlleHBsaWNpdCBMb25nKGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZjYXN0KTsNCisJCWV4cGxpY2l0IExvbmcoY29uc3QgUlZhbHVlPEludD4gJmNhc3QpOw0KKwkJZXhwbGljaXQgTG9uZyhjb25zdCBSVmFsdWU8VUludD4gJmNhc3QpOw0KKwkvLwlleHBsaWNpdCBMb25nKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmNhc3QpOw0KKw0KKwkJTG9uZygpOw0KKwkvLwlMb25nKHF3b3JkIHgpOw0KKwkJTG9uZyhjb25zdCBSVmFsdWU8TG9uZz4gJnJocyk7DQorCS8vCUxvbmcoY29uc3QgUlZhbHVlPFVMb25nPiAmcmhzKTsNCisJLy8JTG9uZyhjb25zdCBMb25nICZyaHMpOw0KKwkvLwlMb25nKGNvbnN0IFVMb25nICZyaHMpOw0KKw0KKwkJUlZhbHVlPExvbmc+IG9wZXJhdG9yPShpbnQ2NF90IHJocykgY29uc3Q7DQorCQlSVmFsdWU8TG9uZz4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPExvbmc+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8VUxvbmc+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPExvbmc+IG9wZXJhdG9yPShjb25zdCBMb25nICZyaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8TG9uZz4gb3BlcmF0b3I9KGNvbnN0IFVMb25nICZyaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8UG9pbnRlcjxMb25nPj4gb3BlcmF0b3ImKCk7DQorDQorCQlmcmllbmQgUlZhbHVlPExvbmc+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8TG9uZz4gJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvciooY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxMb25nPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZz4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZz4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8TG9uZz4gJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvcis9KGNvbnN0IExvbmcgJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvci09KGNvbnN0IExvbmcgJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmc+IG9wZXJhdG9yKj0oY29uc3QgTG9uZyAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZz4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZz4gb3BlcmF0b3IvPShjb25zdCBMb25nICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvciU9KGNvbnN0IExvbmcgJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmc+IG9wZXJhdG9yJj0oY29uc3QgTG9uZyAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZz4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZz4gb3BlcmF0b3J8PShjb25zdCBMb25nICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvcl49KGNvbnN0IExvbmcgJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmc+IG9wZXJhdG9yPDw9KGNvbnN0IExvbmcgJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmc+IG9wZXJhdG9yPj49KGNvbnN0IExvbmcgJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmc+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8TG9uZz4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZz4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxMb25nPiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPExvbmc+ICZ2YWwpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmc+IG9wZXJhdG9yKysoY29uc3QgTG9uZyAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBMb25nICZvcGVyYXRvcisrKGNvbnN0IExvbmcgJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmc+IG9wZXJhdG9yLS0oY29uc3QgTG9uZyAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtZGVjcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBMb25nICZvcGVyYXRvci0tKGNvbnN0IExvbmcgJnZhbCk7ICAgLy8gUHJlLWRlY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8TG9uZz4gJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPD0oY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj4oY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxMb25nPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZz4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhPShjb25zdCBSVmFsdWU8TG9uZz4gJmxocywgY29uc3QgUlZhbHVlPExvbmc+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPT0oY29uc3QgUlZhbHVlPExvbmc+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nPiAmcmhzKTsNCisNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nPiBSb3VuZExvbmcoY29uc3QgUlZhbHVlPEZsb2F0PiAmY2FzdCk7DQorDQorCQlmcmllbmQgUlZhbHVlPExvbmc+IEFkZEF0b21pYyhjb25zdCBSVmFsdWU8UG9pbnRlcjxMb25nPj4gJngsIGNvbnN0IFJWYWx1ZTxMb25nPiAmeSk7DQorDQorCQlMb25nICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBMb25nMSA6IHB1YmxpYyBWYXJpYWJsZTxxd29yZD4NCisJew0KKwlwdWJsaWM6DQorCS8vCWV4cGxpY2l0IExvbmcxKGxsdm06OkFyZ3VtZW50ICphcmd1bWVudCk7DQorDQorCS8vCWV4cGxpY2l0IExvbmcxKGNvbnN0IFJWYWx1ZTxTaG9ydD4gJmNhc3QpOw0KKwkvLwlleHBsaWNpdCBMb25nMShjb25zdCBSVmFsdWU8VVNob3J0PiAmY2FzdCk7DQorCS8vCWV4cGxpY2l0IExvbmcxKGNvbnN0IFJWYWx1ZTxJbnQ+ICZjYXN0KTsNCisJLy8JZXhwbGljaXQgTG9uZzEoY29uc3QgUlZhbHVlPFVJbnQ+ICZjYXN0KTsNCisJLy8JZXhwbGljaXQgTG9uZzEoY29uc3QgUlZhbHVlPEZsb2F0PiAmY2FzdCk7DQorDQorCQlleHBsaWNpdCBMb25nMShjb25zdCBSZWZlcmVuY2U8VUludD4gJmNhc3QpOw0KKw0KKwkvLwlMb25nMSgpOw0KKwkvLwlMb25nMShxd29yZCB4KTsNCisJCUxvbmcxKGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCS8vCUxvbmcxKGNvbnN0IFJWYWx1ZTxVTG9uZzE+ICZyaHMpOw0KKwkvLwlMb25nMShjb25zdCBMb25nMSAmcmhzKTsNCisJLy8JTG9uZzEoY29uc3QgVUxvbmcxICZyaHMpOw0KKw0KKwkvLwlSVmFsdWU8TG9uZzE+IG9wZXJhdG9yPShxd29yZCByaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8TG9uZzE+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8TG9uZzE+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8VUxvbmcxPiAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPExvbmcxPiBvcGVyYXRvcj0oY29uc3QgTG9uZzEgJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxMb25nMT4gb3BlcmF0b3I9KGNvbnN0IFVMb25nMSAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPFBvaW50ZXI8TG9uZzE+PiBvcGVyYXRvciYoKTsNCisNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3IlKGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3J8KGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3JeKGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8TG9uZzE+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzE+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPExvbmcxPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcxPiBvcGVyYXRvcis9KGNvbnN0IExvbmcxICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzE+IG9wZXJhdG9yLT0oY29uc3QgTG9uZzEgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3IqPShjb25zdCBMb25nMSAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcxPiBvcGVyYXRvci89KGNvbnN0IExvbmcxICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzE+IG9wZXJhdG9yJT0oY29uc3QgTG9uZzEgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3ImPShjb25zdCBMb25nMSAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcxPiBvcGVyYXRvcnw9KGNvbnN0IExvbmcxICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzE+IG9wZXJhdG9yXj0oY29uc3QgTG9uZzEgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3I8PD0oY29uc3QgTG9uZzEgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3I+Pj0oY29uc3QgTG9uZzEgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxMb25nMT4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzE+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8TG9uZzE+ICZ2YWwpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcxPiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPExvbmcxPiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gb3BlcmF0b3IrKyhjb25zdCBMb25nMSAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBMb25nMSAmb3BlcmF0b3IrKyhjb25zdCBMb25nMSAmdmFsKTsgICAvLyBQcmUtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzE+IG9wZXJhdG9yLS0oY29uc3QgTG9uZzEgJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgTG9uZzEgJm9wZXJhdG9yLS0oY29uc3QgTG9uZzEgJnZhbCk7ICAgLy8gUHJlLWRlY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8TG9uZzE+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8PShjb25zdCBSVmFsdWU8TG9uZzE+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+KGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvciE9KGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxMb25nMT4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMT4gUm91bmRMb25nMShjb25zdCBSVmFsdWU8RmxvYXQ+ICZjYXN0KTsNCisNCisJCUxvbmcxICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBMb25nMiA6IHB1YmxpYyBWYXJpYWJsZTxxd29yZDI+DQorCXsNCisJcHVibGljOg0KKwkvLwlleHBsaWNpdCBMb25nMihjb25zdCBSVmFsdWU8TG9uZz4gJmNhc3QpOw0KKwkvLwlleHBsaWNpdCBMb25nMihjb25zdCBSVmFsdWU8TG9uZzE+ICZjYXN0KTsNCisNCisJLy8JTG9uZzIoKTsNCisJLy8JTG9uZzIoaW50IHgsIGludCB5KTsNCisJLy8JTG9uZzIoY29uc3QgUlZhbHVlPExvbmcyPiAmcmhzKTsNCisJLy8JTG9uZzIoY29uc3QgTG9uZzIgJnJocyk7DQorDQorCS8vCVJWYWx1ZTxMb25nMj4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxMb25nMj4gJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxMb25nMj4gb3BlcmF0b3I9KGNvbnN0IExvbmcyICZyaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8UG9pbnRlcjxMb25nMj4+IG9wZXJhdG9yJigpOw0KKw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPExvbmcyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPExvbmcyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvciooY29uc3QgUlZhbHVlPExvbmcyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPExvbmcyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPExvbmcyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPExvbmcyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvcnwoY29uc3QgUlZhbHVlPExvbmcyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPExvbmcyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxMb25nMj4gJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxMb25nMj4gJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxMb25nMj4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8TG9uZzI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzI+IG9wZXJhdG9yKz0oY29uc3QgTG9uZzIgJmxocywgY29uc3QgUlZhbHVlPExvbmcyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gb3BlcmF0b3ItPShjb25zdCBMb25nMiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvcio9KGNvbnN0IExvbmcyICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzI+IG9wZXJhdG9yLz0oY29uc3QgTG9uZzIgJmxocywgY29uc3QgUlZhbHVlPExvbmcyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gb3BlcmF0b3IlPShjb25zdCBMb25nMiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvciY9KGNvbnN0IExvbmcyICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzI+IG9wZXJhdG9yfD0oY29uc3QgTG9uZzIgJmxocywgY29uc3QgUlZhbHVlPExvbmcyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gb3BlcmF0b3JePShjb25zdCBMb25nMiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvcjw8PShjb25zdCBMb25nMiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzI+IG9wZXJhdG9yPj49KGNvbnN0IExvbmcyICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gb3BlcmF0b3I8PD0oY29uc3QgTG9uZzIgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gb3BlcmF0b3I+Pj0oY29uc3QgTG9uZzIgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxMb25nMj4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzI+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8TG9uZzI+ICZ2YWwpOw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPExvbmcyPiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gb3BlcmF0b3IrKyhjb25zdCBMb25nMiAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBMb25nMiAmb3BlcmF0b3IrKyhjb25zdCBMb25nMiAmdmFsKTsgICAvLyBQcmUtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBSVmFsdWU8TG9uZzI+IG9wZXJhdG9yLS0oY29uc3QgTG9uZzIgJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgTG9uZzIgJm9wZXJhdG9yLS0oY29uc3QgTG9uZzIgJnZhbCk7ICAgLy8gUHJlLWRlY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8TG9uZzI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8PShjb25zdCBSVmFsdWU8TG9uZzI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+KGNvbnN0IFJWYWx1ZTxMb25nMj4gJmxocywgY29uc3QgUlZhbHVlPExvbmcyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxMb25nMj4gJmxocywgY29uc3QgUlZhbHVlPExvbmcyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvciE9KGNvbnN0IFJWYWx1ZTxMb25nMj4gJmxocywgY29uc3QgUlZhbHVlPExvbmcyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxMb25nMj4gJmxocywgY29uc3QgUlZhbHVlPExvbmcyPiAmcmhzKTsNCisNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gUm91bmRJbnQoY29uc3QgUlZhbHVlPEZsb2F0ND4gJmNhc3QpOw0KKw0KKwkvLwlmcmllbmQgUlZhbHVlPExvbmcyPiBVbnBhY2tMb3coY29uc3QgUlZhbHVlPExvbmcyPiAmeCwgY29uc3QgUlZhbHVlPExvbmcyPiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPExvbmcyPiBVbnBhY2tIaWdoKGNvbnN0IFJWYWx1ZTxMb25nMj4gJngsIGNvbnN0IFJWYWx1ZTxMb25nMj4gJnkpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEludD4gRXh0cmFjdChjb25zdCBSVmFsdWU8TG9uZzI+ICZ2YWwsIGludCBpKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxMb25nMj4gSW5zZXJ0KGNvbnN0IFJWYWx1ZTxMb25nMj4gJnZhbCwgY29uc3QgUlZhbHVlPEludD4gJmVsZW1lbnQsIGludCBpKTsNCisNCisJCUxvbmcyICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBVSW50IDogcHVibGljIFZhcmlhYmxlPHVuc2lnbmVkIGludD4NCisJew0KKwlwdWJsaWM6DQorCQlleHBsaWNpdCBVSW50KGxsdm06OkFyZ3VtZW50ICphcmd1bWVudCk7DQorDQorCQlleHBsaWNpdCBVSW50KGNvbnN0IFJWYWx1ZTxVU2hvcnQ+ICZjYXN0KTsNCisJCWV4cGxpY2l0IFVJbnQoY29uc3QgUlZhbHVlPExvbmc+ICZjYXN0KTsNCisJCWV4cGxpY2l0IFVJbnQoY29uc3QgUlZhbHVlPEZsb2F0PiAmY2FzdCk7DQorDQorCQlVSW50KCk7DQorCQlVSW50KGludCB4KTsNCisJCVVJbnQodW5zaWduZWQgaW50IHgpOw0KKwkJVUludChjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlVSW50KGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpOw0KKwkJVUludChjb25zdCBVSW50ICZyaHMpOw0KKwkJVUludChjb25zdCBJbnQgJnJocyk7DQorDQorCQlSVmFsdWU8VUludD4gb3BlcmF0b3I9KHVuc2lnbmVkIGludCByaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8VUludD4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8VUludD4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxJbnQ+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yPShjb25zdCBVSW50ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPFVJbnQ+IG9wZXJhdG9yPShjb25zdCBJbnQgJnJocykgY29uc3Q7DQorCQlSVmFsdWU8UG9pbnRlcjxVSW50Pj4gb3BlcmF0b3ImKCk7DQorDQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludD4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50PiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPFVJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludD4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50PiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPFVJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludD4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50PiBvcGVyYXRvcj4+KGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yKz0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yLT0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yKj0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yLz0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yJT0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yJj0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yfD0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yXj0oY29uc3QgVUludCAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ+IG9wZXJhdG9yPDw9KGNvbnN0IFVJbnQgJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50PiBvcGVyYXRvcj4+PShjb25zdCBVSW50ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxVSW50PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxVSW50PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludD4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxVSW50PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludD4gb3BlcmF0b3IrKyhjb25zdCBVSW50ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1pbmNyZW1lbnQNCisJCWZyaWVuZCBjb25zdCBVSW50ICZvcGVyYXRvcisrKGNvbnN0IFVJbnQgJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50PiBvcGVyYXRvci0tKGNvbnN0IFVJbnQgJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkJZnJpZW5kIGNvbnN0IFVJbnQgJm9wZXJhdG9yLS0oY29uc3QgVUludCAmdmFsKTsgICAvLyBQcmUtZGVjcmVtZW50DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcjw9KGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPihjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxVSW50PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yIT0oY29uc3QgUlZhbHVlPFVJbnQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I9PShjb25zdCBSVmFsdWU8VUludD4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZyaHMpOw0KKw0KKwkvLwlmcmllbmQgUlZhbHVlPFVJbnQ+IFJvdW5kVUludChjb25zdCBSVmFsdWU8RmxvYXQ+ICZjYXN0KTsNCisNCisJCVVJbnQgKmdldFRoaXMoKTsNCisJCXN0YXRpYyBjb25zdCBsbHZtOjpUeXBlICpnZXRUeXBlKCk7DQorCX07DQorDQorCWNsYXNzIEludDIgOiBwdWJsaWMgVmFyaWFibGU8aW50Mj4NCisJew0KKwlwdWJsaWM6DQorCQlleHBsaWNpdCBJbnQyKGNvbnN0IFJWYWx1ZTxJbnQ+ICZjYXN0KTsNCisJCWV4cGxpY2l0IEludDIoY29uc3QgUlZhbHVlPEludDQ+ICZjYXN0KTsNCisNCisJCUludDIoKTsNCisJCUludDIoaW50IHgsIGludCB5KTsNCisJCUludDIoY29uc3QgUlZhbHVlPEludDI+ICZyaHMpOw0KKwkJSW50Mihjb25zdCBJbnQyICZyaHMpOw0KKw0KKwkJUlZhbHVlPEludDI+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8SW50Mj4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8SW50Mj4gb3BlcmF0b3I9KGNvbnN0IEludDIgJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxQb2ludGVyPEludDI+PiBvcGVyYXRvciYoKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50Mj4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDI+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8SW50Mj4gJmxocywgY29uc3QgUlZhbHVlPEludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQyPiBvcGVyYXRvciooY29uc3QgUlZhbHVlPEludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50Mj4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDI+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8SW50Mj4gJmxocywgY29uc3QgUlZhbHVlPEludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQyPiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPEludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3J8KGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50Mj4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDI+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8SW50Mj4gJmxocywgY29uc3QgUlZhbHVlPEludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQyPiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDI+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPEludDI+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8SW50Mj4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3I+Pihjb25zdCBSVmFsdWU8SW50Mj4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3IrPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3ItPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3IqPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3IvPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3IlPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3ImPShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3J8PShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3JePShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3I8PD0oY29uc3QgSW50MiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDI+IG9wZXJhdG9yPj49KGNvbnN0IEludDIgJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQyPiBvcGVyYXRvcjw8PShjb25zdCBJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDI+IG9wZXJhdG9yPj49KGNvbnN0IEludDIgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxJbnQyPiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxJbnQyPiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50Mj4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxJbnQyPiAmdmFsKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxJbnQyPiBvcGVyYXRvcisrKGNvbnN0IEludDIgJnZhbCwgaW50KTsgICAvLyBQb3N0LWluY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgSW50MiAmb3BlcmF0b3IrKyhjb25zdCBJbnQyICZ2YWwpOyAgIC8vIFByZS1pbmNyZW1lbnQNCisJLy8JZnJpZW5kIFJWYWx1ZTxJbnQyPiBvcGVyYXRvci0tKGNvbnN0IEludDIgJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgSW50MiAmb3BlcmF0b3ItLShjb25zdCBJbnQyICZ2YWwpOyAgIC8vIFByZS1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcjwoY29uc3QgUlZhbHVlPEludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcjw9KGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50Mj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+KGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50Mj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+PShjb25zdCBSVmFsdWU8SW50Mj4gJmxocywgY29uc3QgUlZhbHVlPEludDI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yIT0oY29uc3QgUlZhbHVlPEludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj09KGNvbnN0IFJWYWx1ZTxJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50Mj4gJnJocyk7DQorDQorCS8vCWZyaWVuZCBSVmFsdWU8SW50Mj4gUm91bmRJbnQoY29uc3QgUlZhbHVlPEZsb2F0ND4gJmNhc3QpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxMb25nMT4gVW5wYWNrTG93KGNvbnN0IFJWYWx1ZTxJbnQyPiAmeCwgY29uc3QgUlZhbHVlPEludDI+ICZ5KTsNCisJCWZyaWVuZCBSVmFsdWU8TG9uZzE+IFVucGFja0hpZ2goY29uc3QgUlZhbHVlPEludDI+ICZ4LCBjb25zdCBSVmFsdWU8SW50Mj4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ+IEV4dHJhY3QoY29uc3QgUlZhbHVlPEludDI+ICZ2YWwsIGludCBpKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxJbnQyPiBJbnNlcnQoY29uc3QgUlZhbHVlPEludDI+ICZ2YWwsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZlbGVtZW50LCBpbnQgaSk7DQorDQorCQlJbnQyICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBVSW50MiA6IHB1YmxpYyBWYXJpYWJsZTx1aW50Mj4NCisJew0KKwlwdWJsaWM6DQorCQlVSW50MigpOw0KKwkJVUludDIodW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCB5KTsNCisJCVVJbnQyKGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocyk7DQorCQlVSW50Mihjb25zdCBVSW50MiAmcmhzKTsNCisNCisJCVJWYWx1ZTxVSW50Mj4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8VUludDI+IG9wZXJhdG9yPShjb25zdCBVSW50MiAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPFBvaW50ZXI8VUludDI+PiBvcGVyYXRvciYoKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8VUludDI+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQyPiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxVSW50Mj4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDI+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQyPiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxVSW50Mj4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQyPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDI+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQyPiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDI+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQyPiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxVSW50Mj4gJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDI+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8TG9uZzE+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3IrPShjb25zdCBVSW50MiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3ItPShjb25zdCBVSW50MiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3IqPShjb25zdCBVSW50MiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3IvPShjb25zdCBVSW50MiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3IlPShjb25zdCBVSW50MiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3ImPShjb25zdCBVSW50MiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3J8PShjb25zdCBVSW50MiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3JePShjb25zdCBVSW50MiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3I8PD0oY29uc3QgVUludDIgJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3I+Pj0oY29uc3QgVUludDIgJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3I8PD0oY29uc3QgVUludDIgJmxocywgY29uc3QgUlZhbHVlPExvbmcxPiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDI+IG9wZXJhdG9yPj49KGNvbnN0IFVJbnQyICZsaHMsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQyPiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFVJbnQyPiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDI+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8VUludDI+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50Mj4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VUludDI+IG9wZXJhdG9yKysoY29uc3QgVUludDIgJnZhbCwgaW50KTsgICAvLyBQb3N0LWluY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgVUludDIgJm9wZXJhdG9yKysoY29uc3QgVUludDIgJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPFVJbnQyPiBvcGVyYXRvci0tKGNvbnN0IFVJbnQyICZ2YWwsIGludCk7ICAgLy8gUG9zdC1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IFVJbnQyICZvcGVyYXRvci0tKGNvbnN0IFVJbnQyICZ2YWwpOyAgIC8vIFByZS1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcjwoY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPD0oY29uc3QgUlZhbHVlPFVJbnQyPiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPihjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+PShjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhPShjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I9PShjb25zdCBSVmFsdWU8VUludDI+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50Mj4gJnJocyk7DQorDQorCS8vCWZyaWVuZCBSVmFsdWU8VUludDI+IFJvdW5kSW50KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZjYXN0KTsNCisNCisJCVVJbnQyICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBJbnQ0IDogcHVibGljIFZhcmlhYmxlPGludDQ+DQorCXsNCisJcHVibGljOg0KKwkJZXhwbGljaXQgSW50NChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmY2FzdCk7DQorDQorCQlJbnQ0KCk7DQorCQlJbnQ0KGludCB4eXp3KTsNCisJCUludDQoaW50IHgsIGludCB5encpOw0KKwkJSW50NChpbnQgeCwgaW50IHksIGludCB6dyk7DQorCQlJbnQ0KGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KTsNCisJCUludDQoY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpOw0KKwkJSW50NChjb25zdCBJbnQ0ICZyaHMpOw0KKw0KKwkJUlZhbHVlPEludDQ+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8SW50ND4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8SW50ND4gb3BlcmF0b3I9KGNvbnN0IEludDQgJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxQb2ludGVyPEludDQ+PiBvcGVyYXRvciYoKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8SW50ND4gJmxocywgY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBvcGVyYXRvciooY29uc3QgUlZhbHVlPEludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDQ+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8SW50ND4gJmxocywgY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBvcGVyYXRvciYoY29uc3QgUlZhbHVlPEludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3J8KGNvbnN0IFJWYWx1ZTxJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDQ+IG9wZXJhdG9yXihjb25zdCBSVmFsdWU8SW50ND4gJmxocywgY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBvcGVyYXRvcjw8KGNvbnN0IFJWYWx1ZTxJbnQ0PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPEludDQ+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3IrPShjb25zdCBJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3ItPShjb25zdCBJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3IqPShjb25zdCBJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3IvPShjb25zdCBJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3IlPShjb25zdCBJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3ImPShjb25zdCBJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3J8PShjb25zdCBJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3JePShjb25zdCBJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gb3BlcmF0b3I8PD0oY29uc3QgSW50NCAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCQlmcmllbmQgUlZhbHVlPEludDQ+IG9wZXJhdG9yPj49KGNvbnN0IEludDQgJmxocywgdW5zaWduZWQgY2hhciByaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEludDQ+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEludDQ+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBvcGVyYXRvcn4oY29uc3QgUlZhbHVlPEludDQ+ICZ2YWwpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEludDQ+IG9wZXJhdG9yKysoY29uc3QgSW50NCAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBJbnQ0ICZvcGVyYXRvcisrKGNvbnN0IEludDQgJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPEludDQ+IG9wZXJhdG9yLS0oY29uc3QgSW50NCAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtZGVjcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBJbnQ0ICZvcGVyYXRvci0tKGNvbnN0IEludDQgJnZhbCk7ICAgLy8gUHJlLWRlY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPChjb25zdCBSVmFsdWU8SW50ND4gJmxocywgY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPD0oY29uc3QgUlZhbHVlPEludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj4oY29uc3QgUlZhbHVlPEludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcj49KGNvbnN0IFJWYWx1ZTxJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhPShjb25zdCBSVmFsdWU8SW50ND4gJmxocywgY29uc3QgUlZhbHVlPEludDQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPT0oY29uc3QgUlZhbHVlPEludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ0PiAmcmhzKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gUm91bmRJbnQoY29uc3QgUlZhbHVlPEZsb2F0ND4gJmNhc3QpOw0KKwkJZnJpZW5kIFJWYWx1ZTxTaG9ydDg+IFBhY2soY29uc3QgUlZhbHVlPEludDQ+ICZ4LCBjb25zdCBSVmFsdWU8SW50ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBDb25jYXRlbmF0ZShjb25zdCBSVmFsdWU8SW50Mj4gJmxvLCBjb25zdCBSVmFsdWU8SW50Mj4gJmhpKTsNCisJCWZyaWVuZCBSVmFsdWU8SW50PiBFeHRyYWN0KGNvbnN0IFJWYWx1ZTxJbnQ0PiAmeCwgaW50IGkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBJbnNlcnQoY29uc3QgUlZhbHVlPEludDQ+ICZ2YWwsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZlbGVtZW50LCBpbnQgaSk7DQorCQlmcmllbmQgUlZhbHVlPEludD4gU2lnbk1hc2soY29uc3QgUlZhbHVlPEludDQ+ICZ4KTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gU3dpenpsZShjb25zdCBSVmFsdWU8SW50ND4gJngsIHVuc2lnbmVkIGNoYXIgc2VsZWN0KTsNCisNCisJCUludDQgKmdldFRoaXMoKTsNCisJCXN0YXRpYyBjb25zdCBsbHZtOjpUeXBlICpnZXRUeXBlKCk7DQorDQorCXByaXZhdGU6DQorCQl2b2lkIGNvbnN0YW50KGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KTsNCisJfTsNCisNCisJY2xhc3MgVUludDQgOiBwdWJsaWMgVmFyaWFibGU8dWludDQ+DQorCXsNCisJcHVibGljOg0KKwkJZXhwbGljaXQgVUludDQoY29uc3QgUlZhbHVlPEZsb2F0ND4gJmNhc3QpOw0KKw0KKwkJVUludDQoKTsNCisJCVVJbnQ0KHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgeSwgdW5zaWduZWQgaW50IHosIHVuc2lnbmVkIGludCB3KTsNCisJCVVJbnQ0KGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlVSW50NChjb25zdCBVSW50NCAmcmhzKTsNCisNCisJCVJWYWx1ZTxVSW50ND4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8VUludDQ+IG9wZXJhdG9yPShjb25zdCBVSW50NCAmcmhzKSBjb25zdDsNCisJLy8JUlZhbHVlPFBvaW50ZXI8VUludDQ+PiBvcGVyYXRvciYoKTsNCisNCisJCWZyaWVuZCBSVmFsdWU8VUludDQ+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8VUludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPFVJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50ND4gb3BlcmF0b3IqKGNvbnN0IFJWYWx1ZTxVSW50ND4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDQ+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8VUludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvciUoY29uc3QgUlZhbHVlPFVJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50ND4gb3BlcmF0b3ImKGNvbnN0IFJWYWx1ZTxVSW50ND4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDQ+IG9wZXJhdG9yfChjb25zdCBSVmFsdWU8VUludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcl4oY29uc3QgUlZhbHVlPFVJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50ND4gb3BlcmF0b3I8PChjb25zdCBSVmFsdWU8VUludDQ+ICZsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDQ+IG9wZXJhdG9yPj4oY29uc3QgUlZhbHVlPFVJbnQ0PiAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcis9KGNvbnN0IFVJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvci09KGNvbnN0IFVJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcio9KGNvbnN0IFVJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvci89KGNvbnN0IFVJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvciU9KGNvbnN0IFVJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvciY9KGNvbnN0IFVJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcnw9KGNvbnN0IFVJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcl49KGNvbnN0IFVJbnQ0ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcjw8PShjb25zdCBVSW50NCAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcj4+PShjb25zdCBVSW50NCAmbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7DQorCQlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPFVJbnQ0PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8VUludDQ+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxVSW50ND4gb3BlcmF0b3J+KGNvbnN0IFJWYWx1ZTxVSW50ND4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8VUludDQ+IG9wZXJhdG9yKysoY29uc3QgVUludDQgJnZhbCwgaW50KTsgICAvLyBQb3N0LWluY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgVUludDQgJm9wZXJhdG9yKysoY29uc3QgVUludDQgJnZhbCk7ICAgLy8gUHJlLWluY3JlbWVudA0KKwkvLwlmcmllbmQgUlZhbHVlPFVJbnQ0PiBvcGVyYXRvci0tKGNvbnN0IFVJbnQ0ICZ2YWwsIGludCk7ICAgLy8gUG9zdC1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIGNvbnN0IFVJbnQ0ICZvcGVyYXRvci0tKGNvbnN0IFVJbnQ0ICZ2YWwpOyAgIC8vIFByZS1kZWNyZW1lbnQNCisJLy8JZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvcjwoY29uc3QgUlZhbHVlPFVJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPD0oY29uc3QgUlZhbHVlPFVJbnQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludDQ+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPihjb25zdCBSVmFsdWU8VUludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I+PShjb25zdCBSVmFsdWU8VUludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3IhPShjb25zdCBSVmFsdWU8VUludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I9PShjb25zdCBSVmFsdWU8VUludDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnJocyk7DQorDQorCS8vCWZyaWVuZCBSVmFsdWU8VUludDQ+IFJvdW5kSW50KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZjYXN0KTsNCisJCWZyaWVuZCBSVmFsdWU8VVNob3J0OD4gUGFjayhjb25zdCBSVmFsdWU8VUludDQ+ICZ4LCBjb25zdCBSVmFsdWU8VUludDQ+ICZ5KTsNCisJCWZyaWVuZCBSVmFsdWU8VUludDQ+IENvbmNhdGVuYXRlKGNvbnN0IFJWYWx1ZTxVSW50Mj4gJmxvLCBjb25zdCBSVmFsdWU8VUludDI+ICZoaSk7DQorDQorCQlVSW50NCAqZ2V0VGhpcygpOw0KKwkJc3RhdGljIGNvbnN0IGxsdm06OlR5cGUgKmdldFR5cGUoKTsNCisJfTsNCisNCisJY2xhc3MgRmxvYXQgOiBwdWJsaWMgVmFyaWFibGU8ZmxvYXQ+DQorCXsNCisJcHVibGljOg0KKwkJZXhwbGljaXQgRmxvYXQoY29uc3QgUlZhbHVlPEludD4gJmNhc3QpOw0KKw0KKwkJRmxvYXQoKTsNCisJCUZsb2F0KGZsb2F0IHgpOw0KKwkJRmxvYXQoY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKTsNCisJCUZsb2F0KGNvbnN0IEZsb2F0ICZyaHMpOw0KKw0KKwkvLwlSVmFsdWU8RmxvYXQ+IG9wZXJhdG9yPShmbG9hdCByaHMpIGNvbnN0OyAgIC8vIEZJWE1FOiBJbXBsZW1lbnQNCisJCVJWYWx1ZTxGbG9hdD4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8RmxvYXQ+IG9wZXJhdG9yPShjb25zdCBGbG9hdCAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxQb2ludGVyPEZsb2F0Pj4gb3BlcmF0b3ImKCk7DQorDQorCQlmcmllbmQgUlZhbHVlPEZsb2F0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEZsb2F0PiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdD4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8RmxvYXQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0PiBvcGVyYXRvci8oY29uc3QgUlZhbHVlPEZsb2F0PiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IrPShjb25zdCBGbG9hdCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdD4gb3BlcmF0b3ItPShjb25zdCBGbG9hdCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IqPShjb25zdCBGbG9hdCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IvPShjb25zdCBGbG9hdCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdD4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0PiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEZsb2F0PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I8PShjb25zdCBSVmFsdWU8RmxvYXQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPihjb25zdCBSVmFsdWU8RmxvYXQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEJvb2w+IG9wZXJhdG9yPj0oY29uc3QgUlZhbHVlPEZsb2F0PiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxCb29sPiBvcGVyYXRvciE9KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8Qm9vbD4gb3BlcmF0b3I9PShjb25zdCBSVmFsdWU8RmxvYXQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocyk7DQorDQorCQlmcmllbmQgUlZhbHVlPEZsb2F0PiBBYnMoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0PiBNYXgoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0PiBNaW4oY29uc3QgUlZhbHVlPEZsb2F0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0PiAmeSk7DQorDQorCQlmcmllbmQgUlZhbHVlPEZsb2F0PiBSY3BfcHAoY29uc3QgUlZhbHVlPEZsb2F0PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ+IFJjcFNxcnRfcHAoY29uc3QgUlZhbHVlPEZsb2F0PiAmdmFsKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ+IFNxcnQoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCk7DQorDQorCQlmcmllbmQgUlZhbHVlPEZsb2F0PiBGcmFjdGlvbihjb25zdCBSVmFsdWU8RmxvYXQ+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdD4gRmxvb3IoY29uc3QgUlZhbHVlPEZsb2F0PiAmdmFsKTsNCisNCisJCUZsb2F0ICpnZXRUaGlzKCk7DQorCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSAqZ2V0VHlwZSgpOw0KKwl9Ow0KKw0KKwljbGFzcyBGbG9hdDIgOiBwdWJsaWMgVmFyaWFibGU8ZmxvYXQyPg0KKwl7DQorCXB1YmxpYzoNCisJLy8JZXhwbGljaXQgRmxvYXQyKGNvbnN0IFJWYWx1ZTxCeXRlMj4gJmNhc3QpOw0KKwkvLwlleHBsaWNpdCBGbG9hdDIoY29uc3QgUlZhbHVlPFNob3J0Mj4gJmNhc3QpOw0KKwkvLwlleHBsaWNpdCBGbG9hdDIoY29uc3QgUlZhbHVlPFVTaG9ydDI+ICZjYXN0KTsNCisJLy8JZXhwbGljaXQgRmxvYXQyKGNvbnN0IFJWYWx1ZTxJbnQyPiAmY2FzdCk7DQorCS8vCWV4cGxpY2l0IEZsb2F0Mihjb25zdCBSVmFsdWU8VUludDI+ICZjYXN0KTsNCisJCWV4cGxpY2l0IEZsb2F0Mihjb25zdCBSVmFsdWU8RmxvYXQ0PiAmY2FzdCk7DQorDQorCS8vCUZsb2F0MigpOw0KKwkvLwlGbG9hdDIoZmxvYXQgeCwgZmxvYXQgeSk7DQorCS8vCUZsb2F0Mihjb25zdCBSVmFsdWU8RmxvYXQyPiAmcmhzKTsNCisJLy8JRmxvYXQyKGNvbnN0IEZsb2F0MiAmcmhzKTsNCisJLy8JRmxvYXQyKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocyk7DQorCS8vCUZsb2F0Mihjb25zdCBGbG9hdCAmcmhzKTsNCisNCisJLy8JdGVtcGxhdGU8aW50IFQ+DQorCS8vCUZsb2F0Mihjb25zdCBTd2l6emxlTWFzazFGbG9hdDQ8VD4gJnJocyk7DQorDQorCS8vCVJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yPShmbG9hdCByZXBsaWNhdGUpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8RmxvYXQyPiBvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEZsb2F0Mj4gJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yPShjb25zdCBGbG9hdDIgJnJocykgY29uc3Q7DQorCS8vCVJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpIGNvbnN0Ow0KKwkvLwlSVmFsdWU8RmxvYXQyPiBvcGVyYXRvcj0oY29uc3QgRmxvYXQgJnJocykgY29uc3Q7DQorDQorCS8vCXRlbXBsYXRlPGludCBUPg0KKwkvLwlSVmFsdWU8RmxvYXQyPiBvcGVyYXRvcj0oY29uc3QgU3dpenpsZU1hc2sxRmxvYXQ0PFQ+ICZyaHMpOw0KKw0KKwkvLwlSVmFsdWU8UG9pbnRlcjxGbG9hdDI+PiBvcGVyYXRvciYoKTsNCisNCisJLy8JZnJpZW5kIFJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8RmxvYXQyPiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8RmxvYXQyPiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yKihjb25zdCBSVmFsdWU8RmxvYXQyPiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yLyhjb25zdCBSVmFsdWU8RmxvYXQyPiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8RmxvYXQyPiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yKz0oY29uc3QgRmxvYXQyICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdDI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEZsb2F0Mj4gb3BlcmF0b3ItPShjb25zdCBGbG9hdDIgJmxocywgY29uc3QgUlZhbHVlPEZsb2F0Mj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8RmxvYXQyPiBvcGVyYXRvcio9KGNvbnN0IEZsb2F0MiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQyPiAmcmhzKTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxGbG9hdDI+IG9wZXJhdG9yLz0oY29uc3QgRmxvYXQyICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdDI+ICZyaHMpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEZsb2F0Mj4gb3BlcmF0b3IlPShjb25zdCBGbG9hdDIgJmxocywgY29uc3QgUlZhbHVlPEZsb2F0Mj4gJnJocyk7DQorCS8vCWZyaWVuZCBSVmFsdWU8RmxvYXQyPiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEZsb2F0Mj4gJnZhbCk7DQorCS8vCWZyaWVuZCBSVmFsdWU8RmxvYXQyPiBvcGVyYXRvci0oY29uc3QgUlZhbHVlPEZsb2F0Mj4gJnZhbCk7DQorDQorCS8vCWZyaWVuZCBSVmFsdWU8RmxvYXQyPiBBYnMoY29uc3QgUlZhbHVlPEZsb2F0Mj4gJngpOw0KKwkvLwlmcmllbmQgUlZhbHVlPEZsb2F0Mj4gTWF4KGNvbnN0IFJWYWx1ZTxGbG9hdDI+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQyPiAmeSk7DQorCS8vCWZyaWVuZCBSVmFsdWU8RmxvYXQyPiBNaW4oY29uc3QgUlZhbHVlPEZsb2F0Mj4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDI+ICZ5KTsNCisNCisJLy8JZnJpZW5kIFJWYWx1ZTxGbG9hdDI+IFN3aXp6bGUoY29uc3QgUlZhbHVlPEZsb2F0Mj4gJngsIHVuc2lnbmVkIGNoYXIgc2VsZWN0KTsNCisJLy8JZnJpZW5kIFJWYWx1ZTxGbG9hdDI+IE1hc2soRmxvYXQyICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdDI+ICZyaHMsIHVuc2lnbmVkIGNoYXIgc2VsZWN0KTsNCisNCisJCUZsb2F0MiAqZ2V0VGhpcygpOw0KKwkJc3RhdGljIGNvbnN0IGxsdm06OlR5cGUgKmdldFR5cGUoKTsNCisJfTsNCisNCisJdGVtcGxhdGU8aW50IFQ+DQorCWNsYXNzIFN3aXp6bGUyRmxvYXQ0DQorCXsNCisJCWZyaWVuZCBGbG9hdDQ7DQorDQorCXB1YmxpYzoNCisJCW9wZXJhdG9yIFJWYWx1ZTxGbG9hdDQ+KCkgY29uc3Q7DQorDQorCXByaXZhdGU6DQorCQlGbG9hdDQgKnBhcmVudDsNCisJfTsNCisNCisJdGVtcGxhdGU8aW50IFQ+DQorCWNsYXNzIFN3aXp6bGVGbG9hdDQNCisJew0KKwlwdWJsaWM6DQorCQlvcGVyYXRvciBSVmFsdWU8RmxvYXQ0PigpIGNvbnN0Ow0KKw0KKwlwcml2YXRlOg0KKwkJRmxvYXQ0ICpwYXJlbnQ7DQorCX07DQorDQorCXRlbXBsYXRlPGludCBUPg0KKwljbGFzcyBTd2l6emxlTWFza0Zsb2F0NA0KKwl7DQorCQlmcmllbmQgRmxvYXQ0Ow0KKw0KKwlwdWJsaWM6DQorCQlvcGVyYXRvciBSVmFsdWU8RmxvYXQ0PigpIGNvbnN0Ow0KKw0KKwkJUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnJocykgY29uc3Q7DQorDQorCXByaXZhdGU6DQorCQlGbG9hdDQgKnBhcmVudDsNCisJfTsNCisNCisJdGVtcGxhdGU8aW50IFQ+DQorCWNsYXNzIFN3aXp6bGVNYXNrMUZsb2F0NA0KKwl7DQorCXB1YmxpYzoNCisJCW9wZXJhdG9yIFJWYWx1ZTxGbG9hdD4oKSBjb25zdDsNCisJCW9wZXJhdG9yIFJWYWx1ZTxGbG9hdDQ+KCkgY29uc3Q7DQorDQorCQlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcj0oZmxvYXQgeCkgY29uc3Q7DQorCQlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEZsb2F0ND4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKSBjb25zdDsNCisNCisJcHJpdmF0ZToNCisJCUZsb2F0NCAqcGFyZW50Ow0KKwl9Ow0KKw0KKwl0ZW1wbGF0ZTxpbnQgVD4NCisJY2xhc3MgU3dpenpsZU1hc2syRmxvYXQ0DQorCXsNCisJCWZyaWVuZCBGbG9hdDQ7DQorDQorCXB1YmxpYzoNCisJCW9wZXJhdG9yIFJWYWx1ZTxGbG9hdDQ+KCkgY29uc3Q7DQorDQorCQlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEZsb2F0ND4gJnJocykgY29uc3Q7DQorDQorCXByaXZhdGU6DQorCQlGbG9hdDQgKnBhcmVudDsNCisJfTsNCisNCisJY2xhc3MgRmxvYXQ0IDogcHVibGljIFZhcmlhYmxlPGZsb2F0ND4NCisJew0KKwlwdWJsaWM6DQorCQlleHBsaWNpdCBGbG9hdDQoY29uc3QgUlZhbHVlPEJ5dGU0PiAmY2FzdCk7DQorCQlleHBsaWNpdCBGbG9hdDQoY29uc3QgUlZhbHVlPFNCeXRlND4gJmNhc3QpOw0KKwkJZXhwbGljaXQgRmxvYXQ0KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZjYXN0KTsNCisJCWV4cGxpY2l0IEZsb2F0NChjb25zdCBSVmFsdWU8VVNob3J0ND4gJmNhc3QpOw0KKwkJZXhwbGljaXQgRmxvYXQ0KGNvbnN0IFJWYWx1ZTxJbnQ0PiAmY2FzdCk7DQorCQlleHBsaWNpdCBGbG9hdDQoY29uc3QgUlZhbHVlPFVJbnQ0PiAmY2FzdCk7DQorDQorCQlGbG9hdDQoKTsNCisJCUZsb2F0NChmbG9hdCB4eXp3KTsNCisJCUZsb2F0NChmbG9hdCB4LCBmbG9hdCB5encpOw0KKwkJRmxvYXQ0KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHp3KTsNCisJCUZsb2F0NChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3KTsNCisJCUZsb2F0NChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKTsNCisJCUZsb2F0NChjb25zdCBGbG9hdDQgJnJocyk7DQorCQlGbG9hdDQoY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKTsNCisJCUZsb2F0NChjb25zdCBGbG9hdCAmcmhzKTsNCisNCisJCXRlbXBsYXRlPGludCBUPg0KKwkJRmxvYXQ0KGNvbnN0IFN3aXp6bGVNYXNrMUZsb2F0NDxUPiAmcmhzKTsNCisJCXRlbXBsYXRlPGludCBYLCBpbnQgWT4NCisJCUZsb2F0NChjb25zdCBTd2l6emxlMkZsb2F0NDxYPiAmeCwgY29uc3QgU3dpenpsZTJGbG9hdDQ8WT4gJnkpOw0KKwkJdGVtcGxhdGU8aW50IFgsIGludCBZPg0KKwkJRmxvYXQ0KGNvbnN0IFN3aXp6bGVNYXNrMkZsb2F0NDxYPiAmeCwgY29uc3QgU3dpenpsZTJGbG9hdDQ8WT4gJnkpOw0KKwkJdGVtcGxhdGU8aW50IFgsIGludCBZPg0KKwkJRmxvYXQ0KGNvbnN0IFN3aXp6bGUyRmxvYXQ0PFg+ICZ4LCBjb25zdCBTd2l6emxlTWFzazJGbG9hdDQ8WT4gJnkpOw0KKwkJdGVtcGxhdGU8aW50IFgsIGludCBZPg0KKwkJRmxvYXQ0KGNvbnN0IFN3aXp6bGVNYXNrMkZsb2F0NDxYPiAmeCwgY29uc3QgU3dpenpsZU1hc2syRmxvYXQ0PFk+ICZ5KTsNCisNCisJCVJWYWx1ZTxGbG9hdDQ+IG9wZXJhdG9yPShmbG9hdCByZXBsaWNhdGUpIGNvbnN0Ow0KKwkJUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3I9KGNvbnN0IEZsb2F0NCAmcmhzKSBjb25zdDsNCisJCVJWYWx1ZTxGbG9hdDQ+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpIGNvbnN0Ow0KKwkJUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3I9KGNvbnN0IEZsb2F0ICZyaHMpIGNvbnN0Ow0KKw0KKwkJdGVtcGxhdGU8aW50IFQ+DQorCQlSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcj0oY29uc3QgU3dpenpsZU1hc2sxRmxvYXQ0PFQ+ICZyaHMpOw0KKw0KKwkJUlZhbHVlPFBvaW50ZXI8RmxvYXQ0Pj4gb3BlcmF0b3ImKCk7DQorDQorCQlmcmllbmQgUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3IrKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdDQ+IG9wZXJhdG9yLShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvciooY29uc3QgUlZhbHVlPEZsb2F0ND4gJmxocywgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnJocyk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3IvKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZsaHMsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZyaHMpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdDQ+IG9wZXJhdG9yJShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcis9KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvci09KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcio9KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvci89KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvciU9KGNvbnN0IEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzKTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ0PiBvcGVyYXRvcisoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0ND4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdDQ+IEFicyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0ND4gTWF4KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0ND4gTWluKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSk7DQorDQorCQlmcmllbmQgUlZhbHVlPEZsb2F0ND4gUmNwX3BwKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdDQ+IFJjcFNxcnRfcHAoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0ND4gU3FydChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCk7DQorDQorCQlmcmllbmQgUlZhbHVlPEZsb2F0ND4gSW5zZXJ0KGNvbnN0IEZsb2F0NCAmdmFsLCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZlbGVtZW50LCBpbnQgaSk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0PiBFeHRyYWN0KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBpbnQgaSk7DQorCQlmcmllbmQgUlZhbHVlPEZsb2F0ND4gU3dpenpsZShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgdW5zaWduZWQgY2hhciBzZWxlY3QpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdDQ+IFNodWZmbGVMb3dIaWdoKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSwgdW5zaWduZWQgY2hhciBpbW0pOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdDQ+IFVucGFja0xvdyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdDQ+IFVucGFja0hpZ2goY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ0PiBNYXNrKEZsb2F0NCAmbGhzLCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmcmhzLCB1bnNpZ25lZCBjaGFyIHNlbGVjdCk7DQorCQlmcmllbmQgUlZhbHVlPEludD4gU2lnbk1hc2soY29uc3QgUlZhbHVlPEZsb2F0ND4gJngpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBDbXBFUShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBDbXBMVChjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBDbXBMRShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpOw0KKwkJZnJpZW5kIFJWYWx1ZTxJbnQ0PiBDbXBORVEoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KTsNCisJCWZyaWVuZCBSVmFsdWU8SW50ND4gQ21wTkxUKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSk7DQorCQlmcmllbmQgUlZhbHVlPEludDQ+IENtcE5MRShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpOw0KKw0KKwkJZnJpZW5kIFJWYWx1ZTxGbG9hdDQ+IEZyYWN0aW9uKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4KTsNCisJCWZyaWVuZCBSVmFsdWU8RmxvYXQ0PiBGbG9vcihjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCk7DQorDQorCQlGbG9hdDQgKmdldFRoaXMoKTsNCisJCXN0YXRpYyBjb25zdCBsbHZtOjpUeXBlICpnZXRUeXBlKCk7DQorDQorCQl1bmlvbg0KKwkJew0KKwkJCVN3aXp6bGVNYXNrMUZsb2F0NDwweDAwPiB4Ow0KKwkJCVN3aXp6bGVNYXNrMUZsb2F0NDwweDU1PiB5Ow0KKwkJCVN3aXp6bGVNYXNrMUZsb2F0NDwweEFBPiB6Ow0KKwkJCVN3aXp6bGVNYXNrMUZsb2F0NDwweEZGPiB3Ow0KKwkJCVN3aXp6bGUyRmxvYXQ0PDB4MDA+ICAgICB4eDsNCisJCQlTd2l6emxlMkZsb2F0NDwweDAxPiAgICAgeXg7DQorCQkJU3dpenpsZTJGbG9hdDQ8MHgwMj4gICAgIHp4Ow0KKwkJCVN3aXp6bGUyRmxvYXQ0PDB4MDM+ICAgICB3eDsNCisJCQlTd2l6emxlTWFzazJGbG9hdDQ8MHg1ND4geHk7DQorCQkJU3dpenpsZTJGbG9hdDQ8MHg1NT4gICAgIHl5Ow0KKwkJCVN3aXp6bGUyRmxvYXQ0PDB4NTY+ICAgICB6eTsNCisJCQlTd2l6emxlMkZsb2F0NDwweDU3PiAgICAgd3k7DQorCQkJU3dpenpsZU1hc2syRmxvYXQ0PDB4QTg+IHh6Ow0KKwkJCVN3aXp6bGVNYXNrMkZsb2F0NDwweEE5PiB5ejsNCisJCQlTd2l6emxlMkZsb2F0NDwweEFBPiAgICAgeno7DQorCQkJU3dpenpsZTJGbG9hdDQ8MHhBQj4gICAgIHd6Ow0KKwkJCVN3aXp6bGVNYXNrMkZsb2F0NDwweEZDPiB4dzsNCisJCQlTd2l6emxlTWFzazJGbG9hdDQ8MHhGRD4geXc7DQorCQkJU3dpenpsZU1hc2syRmxvYXQ0PDB4RkU+IHp3Ow0KKwkJCVN3aXp6bGUyRmxvYXQ0PDB4RkY+ICAgICB3dzsNCisJCQlTd2l6emxlRmxvYXQ0PDB4MDA+ICAgICAgeHh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwMT4gICAgICB5eHg7DQorCQkJU3dpenpsZUZsb2F0NDwweDAyPiAgICAgIHp4eDsNCisJCQlTd2l6emxlRmxvYXQ0PDB4MDM+ICAgICAgd3h4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwND4gICAgICB4eXg7DQorCQkJU3dpenpsZUZsb2F0NDwweDA1PiAgICAgIHl5eDsNCisJCQlTd2l6emxlRmxvYXQ0PDB4MDY+ICAgICAgenl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwNz4gICAgICB3eXg7DQorCQkJU3dpenpsZUZsb2F0NDwweDA4PiAgICAgIHh6eDsNCisJCQlTd2l6emxlRmxvYXQ0PDB4MDk+ICAgICAgeXp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwQT4gICAgICB6eng7DQorCQkJU3dpenpsZUZsb2F0NDwweDBCPiAgICAgIHd6eDsNCisJCQlTd2l6emxlRmxvYXQ0PDB4MEM+ICAgICAgeHd4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwRD4gICAgICB5d3g7DQorCQkJU3dpenpsZUZsb2F0NDwweDBFPiAgICAgIHp3eDsNCisJCQlTd2l6emxlRmxvYXQ0PDB4MEY+ICAgICAgd3d4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1MD4gICAgICB4eHk7DQorCQkJU3dpenpsZUZsb2F0NDwweDUxPiAgICAgIHl4eTsNCisJCQlTd2l6emxlRmxvYXQ0PDB4NTI+ICAgICAgenh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Mz4gICAgICB3eHk7DQorCQkJU3dpenpsZUZsb2F0NDwweDU0PiAgICAgIHh5eTsNCisJCQlTd2l6emxlRmxvYXQ0PDB4NTU+ICAgICAgeXl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Nj4gICAgICB6eXk7DQorCQkJU3dpenpsZUZsb2F0NDwweDU3PiAgICAgIHd5eTsNCisJCQlTd2l6emxlRmxvYXQ0PDB4NTg+ICAgICAgeHp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1OT4gICAgICB5enk7DQorCQkJU3dpenpsZUZsb2F0NDwweDVBPiAgICAgIHp6eTsNCisJCQlTd2l6emxlRmxvYXQ0PDB4NUI+ICAgICAgd3p5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Qz4gICAgICB4d3k7DQorCQkJU3dpenpsZUZsb2F0NDwweDVEPiAgICAgIHl3eTsNCisJCQlTd2l6emxlRmxvYXQ0PDB4NUU+ICAgICAgend5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Rj4gICAgICB3d3k7DQorCQkJU3dpenpsZUZsb2F0NDwweEEwPiAgICAgIHh4ejsNCisJCQlTd2l6emxlRmxvYXQ0PDB4QTE+ICAgICAgeXh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBMj4gICAgICB6eHo7DQorCQkJU3dpenpsZUZsb2F0NDwweEEzPiAgICAgIHd4ejsNCisJCQlTd2l6emxlTWFza0Zsb2F0NDwweEE0PiAgeHl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBNT4gICAgICB5eXo7DQorCQkJU3dpenpsZUZsb2F0NDwweEE2PiAgICAgIHp5ejsNCisJCQlTd2l6emxlRmxvYXQ0PDB4QTc+ICAgICAgd3l6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBOD4gICAgICB4eno7DQorCQkJU3dpenpsZUZsb2F0NDwweEE5PiAgICAgIHl6ejsNCisJCQlTd2l6emxlRmxvYXQ0PDB4QUE+ICAgICAgenp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBQj4gICAgICB3eno7DQorCQkJU3dpenpsZUZsb2F0NDwweEFDPiAgICAgIHh3ejsNCisJCQlTd2l6emxlRmxvYXQ0PDB4QUQ+ICAgICAgeXd6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBRT4gICAgICB6d3o7DQorCQkJU3dpenpsZUZsb2F0NDwweEFGPiAgICAgIHd3ejsNCisJCQlTd2l6emxlRmxvYXQ0PDB4RjA+ICAgICAgeHh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGMT4gICAgICB5eHc7DQorCQkJU3dpenpsZUZsb2F0NDwweEYyPiAgICAgIHp4dzsNCisJCQlTd2l6emxlRmxvYXQ0PDB4RjM+ICAgICAgd3h3Ow0KKwkJCVN3aXp6bGVNYXNrRmxvYXQ0PDB4RjQ+ICB4eXc7DQorCQkJU3dpenpsZUZsb2F0NDwweEY1PiAgICAgIHl5dzsNCisJCQlTd2l6emxlRmxvYXQ0PDB4RjY+ICAgICAgenl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGNz4gICAgICB3eXc7DQorCQkJU3dpenpsZU1hc2tGbG9hdDQ8MHhGOD4gIHh6dzsNCisJCQlTd2l6emxlTWFza0Zsb2F0NDwweEY5PiAgeXp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGQT4gICAgICB6enc7DQorCQkJU3dpenpsZUZsb2F0NDwweEZCPiAgICAgIHd6dzsNCisJCQlTd2l6emxlRmxvYXQ0PDB4RkM+ICAgICAgeHd3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGRD4gICAgICB5d3c7DQorCQkJU3dpenpsZUZsb2F0NDwweEZFPiAgICAgIHp3dzsNCisJCQlTd2l6emxlRmxvYXQ0PDB4RkY+ICAgICAgd3d3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwMD4gICAgICB4eHh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwMT4gICAgICB5eHh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwMj4gICAgICB6eHh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwMz4gICAgICB3eHh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwND4gICAgICB4eXh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwNT4gICAgICB5eXh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwNj4gICAgICB6eXh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwNz4gICAgICB3eXh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwOD4gICAgICB4enh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwOT4gICAgICB5enh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwQT4gICAgICB6enh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwQj4gICAgICB3enh4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwQz4gICAgICB4d3h4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwRD4gICAgICB5d3h4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwRT4gICAgICB6d3h4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgwRj4gICAgICB3d3h4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxMD4gICAgICB4eHl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxMT4gICAgICB5eHl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxMj4gICAgICB6eHl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxMz4gICAgICB3eHl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxND4gICAgICB4eXl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxNT4gICAgICB5eXl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxNj4gICAgICB6eXl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxNz4gICAgICB3eXl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxOD4gICAgICB4enl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxOT4gICAgICB5enl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxQT4gICAgICB6enl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxQj4gICAgICB3enl4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxQz4gICAgICB4d3l4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxRD4gICAgICB5d3l4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxRT4gICAgICB6d3l4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgxRj4gICAgICB3d3l4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyMD4gICAgICB4eHp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyMT4gICAgICB5eHp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyMj4gICAgICB6eHp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyMz4gICAgICB3eHp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyND4gICAgICB4eXp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyNT4gICAgICB5eXp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyNj4gICAgICB6eXp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyNz4gICAgICB3eXp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyOD4gICAgICB4enp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyOT4gICAgICB5enp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyQT4gICAgICB6enp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyQj4gICAgICB3enp4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyQz4gICAgICB4d3p4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyRD4gICAgICB5d3p4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyRT4gICAgICB6d3p4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgyRj4gICAgICB3d3p4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzMD4gICAgICB4eHd4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzMT4gICAgICB5eHd4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzMj4gICAgICB6eHd4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzMz4gICAgICB3eHd4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzND4gICAgICB4eXd4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzNT4gICAgICB5eXd4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzNj4gICAgICB6eXd4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzNz4gICAgICB3eXd4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzOD4gICAgICB4end4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzOT4gICAgICB5end4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzQT4gICAgICB6end4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzQj4gICAgICB3end4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzQz4gICAgICB4d3d4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzRD4gICAgICB5d3d4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzRT4gICAgICB6d3d4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHgzRj4gICAgICB3d3d4Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0MD4gICAgICB4eHh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0MT4gICAgICB5eHh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0Mj4gICAgICB6eHh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0Mz4gICAgICB3eHh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0ND4gICAgICB4eXh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0NT4gICAgICB5eXh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0Nj4gICAgICB6eXh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0Nz4gICAgICB3eXh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0OD4gICAgICB4enh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0OT4gICAgICB5enh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0QT4gICAgICB6enh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0Qj4gICAgICB3enh5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0Qz4gICAgICB4d3h5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0RD4gICAgICB5d3h5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0RT4gICAgICB6d3h5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg0Rj4gICAgICB3d3h5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1MD4gICAgICB4eHl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1MT4gICAgICB5eHl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Mj4gICAgICB6eHl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Mz4gICAgICB3eHl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1ND4gICAgICB4eXl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1NT4gICAgICB5eXl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Nj4gICAgICB6eXl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Nz4gICAgICB3eXl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1OD4gICAgICB4enl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1OT4gICAgICB5enl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1QT4gICAgICB6enl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Qj4gICAgICB3enl5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Qz4gICAgICB4d3l5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1RD4gICAgICB5d3l5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1RT4gICAgICB6d3l5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg1Rj4gICAgICB3d3l5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2MD4gICAgICB4eHp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2MT4gICAgICB5eHp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2Mj4gICAgICB6eHp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2Mz4gICAgICB3eHp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2ND4gICAgICB4eXp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2NT4gICAgICB5eXp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2Nj4gICAgICB6eXp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2Nz4gICAgICB3eXp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2OD4gICAgICB4enp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2OT4gICAgICB5enp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2QT4gICAgICB6enp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2Qj4gICAgICB3enp5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2Qz4gICAgICB4d3p5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2RD4gICAgICB5d3p5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2RT4gICAgICB6d3p5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg2Rj4gICAgICB3d3p5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3MD4gICAgICB4eHd5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3MT4gICAgICB5eHd5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3Mj4gICAgICB6eHd5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3Mz4gICAgICB3eHd5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3ND4gICAgICB4eXd5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3NT4gICAgICB5eXd5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3Nj4gICAgICB6eXd5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3Nz4gICAgICB3eXd5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3OD4gICAgICB4end5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3OT4gICAgICB5end5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3QT4gICAgICB6end5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3Qj4gICAgICB3end5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3Qz4gICAgICB4d3d5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3RD4gICAgICB5d3d5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3RT4gICAgICB6d3d5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg3Rj4gICAgICB3d3d5Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4MD4gICAgICB4eHh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4MT4gICAgICB5eHh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4Mj4gICAgICB6eHh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4Mz4gICAgICB3eHh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4ND4gICAgICB4eXh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4NT4gICAgICB5eXh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4Nj4gICAgICB6eXh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4Nz4gICAgICB3eXh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4OD4gICAgICB4enh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4OT4gICAgICB5enh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4QT4gICAgICB6enh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4Qj4gICAgICB3enh6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4Qz4gICAgICB4d3h6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4RD4gICAgICB5d3h6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4RT4gICAgICB6d3h6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg4Rj4gICAgICB3d3h6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5MD4gICAgICB4eHl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5MT4gICAgICB5eHl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5Mj4gICAgICB6eHl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5Mz4gICAgICB3eHl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5ND4gICAgICB4eXl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5NT4gICAgICB5eXl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5Nj4gICAgICB6eXl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5Nz4gICAgICB3eXl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5OD4gICAgICB4enl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5OT4gICAgICB5enl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5QT4gICAgICB6enl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5Qj4gICAgICB3enl6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5Qz4gICAgICB4d3l6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5RD4gICAgICB5d3l6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5RT4gICAgICB6d3l6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHg5Rj4gICAgICB3d3l6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBMD4gICAgICB4eHp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBMT4gICAgICB5eHp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBMj4gICAgICB6eHp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBMz4gICAgICB3eHp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBND4gICAgICB4eXp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBNT4gICAgICB5eXp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBNj4gICAgICB6eXp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBNz4gICAgICB3eXp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBOD4gICAgICB4enp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBOT4gICAgICB5enp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBQT4gICAgICB6enp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBQj4gICAgICB3enp6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBQz4gICAgICB4d3p6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBRD4gICAgICB5d3p6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBRT4gICAgICB6d3p6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhBRj4gICAgICB3d3p6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCMD4gICAgICB4eHd6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCMT4gICAgICB5eHd6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCMj4gICAgICB6eHd6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCMz4gICAgICB3eHd6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCND4gICAgICB4eXd6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCNT4gICAgICB5eXd6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCNj4gICAgICB6eXd6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCNz4gICAgICB3eXd6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCOD4gICAgICB4end6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCOT4gICAgICB5end6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCQT4gICAgICB6end6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCQj4gICAgICB3end6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCQz4gICAgICB4d3d6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCRD4gICAgICB5d3d6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCRT4gICAgICB6d3d6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhCRj4gICAgICB3d3d6Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDMD4gICAgICB4eHh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDMT4gICAgICB5eHh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDMj4gICAgICB6eHh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDMz4gICAgICB3eHh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDND4gICAgICB4eXh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDNT4gICAgICB5eXh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDNj4gICAgICB6eXh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDNz4gICAgICB3eXh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDOD4gICAgICB4enh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDOT4gICAgICB5enh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDQT4gICAgICB6enh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDQj4gICAgICB3enh3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDQz4gICAgICB4d3h3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDRD4gICAgICB5d3h3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDRT4gICAgICB6d3h3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhDRj4gICAgICB3d3h3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEMD4gICAgICB4eHl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEMT4gICAgICB5eHl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEMj4gICAgICB6eHl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEMz4gICAgICB3eHl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEND4gICAgICB4eXl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhENT4gICAgICB5eXl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhENj4gICAgICB6eXl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhENz4gICAgICB3eXl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEOD4gICAgICB4enl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEOT4gICAgICB5enl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEQT4gICAgICB6enl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEQj4gICAgICB3enl3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhEQz4gICAgICB4d3l3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhERD4gICAgICB5d3l3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhERT4gICAgICB6d3l3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhERj4gICAgICB3d3l3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFMD4gICAgICB4eHp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFMT4gICAgICB5eHp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFMj4gICAgICB6eHp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFMz4gICAgICB3eHp3Ow0KKwkJCVN3aXp6bGVNYXNrRmxvYXQ0PDB4RTQ+ICB4eXp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFNT4gICAgICB5eXp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFNj4gICAgICB6eXp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFNz4gICAgICB3eXp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFOD4gICAgICB4enp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFOT4gICAgICB5enp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFQT4gICAgICB6enp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFQj4gICAgICB3enp3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFQz4gICAgICB4d3p3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFRD4gICAgICB5d3p3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFRT4gICAgICB6d3p3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhFRj4gICAgICB3d3p3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGMD4gICAgICB4eHd3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGMT4gICAgICB5eHd3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGMj4gICAgICB6eHd3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGMz4gICAgICB3eHd3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGND4gICAgICB4eXd3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGNT4gICAgICB5eXd3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGNj4gICAgICB6eXd3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGNz4gICAgICB3eXd3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGOD4gICAgICB4end3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGOT4gICAgICB5end3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGQT4gICAgICB6end3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGQj4gICAgICB3end3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGQz4gICAgICB4d3d3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGRD4gICAgICB5d3d3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGRT4gICAgICB6d3d3Ow0KKwkJCVN3aXp6bGVGbG9hdDQ8MHhGRj4gICAgICB3d3d3Ow0KKwkJfTsNCisNCisJcHJpdmF0ZToNCisJCXZvaWQgY29uc3RhbnQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdyk7DQorCX07DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCWNsYXNzIFBvaW50ZXIgOiBwdWJsaWMgVmFyaWFibGU8VCo+DQorCXsNCisJcHVibGljOg0KKwkJdGVtcGxhdGU8Y2xhc3MgUz4NCisJCVBvaW50ZXIoY29uc3QgUlZhbHVlPFBvaW50ZXI8Uz4+ICZwb2ludGVyUywgaW50IGFsaWdubWVudCA9IDEpIDogYWxpZ25tZW50KGFsaWdubWVudCkNCisJCXsNCisJCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKE51Y2xldXM6OmdldFBvaW50ZXJUeXBlKFQ6OmdldFR5cGUoKSkpOw0KKw0KKwkJCWxsdm06OlZhbHVlICpwb2ludGVyVCA9IE51Y2xldXM6OmNyZWF0ZUJpdENhc3QocG9pbnRlclMudmFsdWUsIE51Y2xldXM6OmdldFBvaW50ZXJUeXBlKFQ6OmdldFR5cGUoKSkpOw0KKwkJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHBvaW50ZXJULCBhZGRyZXNzKTsNCisJCX0NCisNCisJCXRlbXBsYXRlPGNsYXNzIFM+DQorCQlQb2ludGVyKGNvbnN0IFBvaW50ZXI8Uz4gJnBvaW50ZXIsIGludCBhbGlnbm1lbnQgPSAxKSA6IGFsaWdubWVudChhbGlnbm1lbnQpDQorCQl7DQorCQkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShOdWNsZXVzOjpnZXRQb2ludGVyVHlwZShUOjpnZXRUeXBlKCkpKTsNCisNCisJCQlsbHZtOjpWYWx1ZSAqcG9pbnRlclMgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHBvaW50ZXIuYWRkcmVzcyk7DQorCQkJbGx2bTo6VmFsdWUgKnBvaW50ZXJUID0gTnVjbGV1czo6Y3JlYXRlQml0Q2FzdChwb2ludGVyUywgTnVjbGV1czo6Z2V0UG9pbnRlclR5cGUoVDo6Z2V0VHlwZSgpKSk7DQorCQkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocG9pbnRlclQsIGFkZHJlc3MpOw0KKwkJfQ0KKw0KKwkJZXhwbGljaXQgUG9pbnRlcihsbHZtOjpWYWx1ZSAqcG9pbnRlcik7DQorCQlleHBsaWNpdCBQb2ludGVyKGxsdm06OkFyZ3VtZW50ICphcmd1bWVudCk7DQorCQlleHBsaWNpdCBQb2ludGVyKGNvbnN0IHZvaWQgKmV4dGVybmFsKTsNCisNCisJCVBvaW50ZXIoKTsNCisJCVBvaW50ZXIoY29uc3QgUlZhbHVlPFBvaW50ZXI8VD4+ICZyaHMpOw0KKwkJUG9pbnRlcihjb25zdCBQb2ludGVyPFQ+ICZyaHMpOw0KKw0KKwkJUlZhbHVlPFBvaW50ZXI8VD4+IG9wZXJhdG9yPShjb25zdCBSVmFsdWU8UG9pbnRlcjxUPj4gJnJocykgY29uc3Q7DQorCQlSVmFsdWU8UG9pbnRlcjxUPj4gb3BlcmF0b3I9KGNvbnN0IFBvaW50ZXI8VD4gJnJocykgY29uc3Q7DQorDQorCQlSZWZlcmVuY2U8VD4gb3BlcmF0b3IqKCk7DQorDQorCQlmcmllbmQgUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gJmxocywgaW50IG9mZnNldCk7DQorCQlmcmllbmQgUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gJmxocywgY29uc3QgUlZhbHVlPEludD4gJm9mZnNldCk7DQorCQlmcmllbmQgUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+IG9wZXJhdG9yKyhjb25zdCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZvZmZzZXQpOw0KKwkJZnJpZW5kIFJWYWx1ZTxQb2ludGVyPEJ5dGU+PiBvcGVyYXRvcis9KGNvbnN0IFBvaW50ZXI8Qnl0ZT4gJmxocywgaW50IG9mZnNldCk7DQorCQlmcmllbmQgUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+IG9wZXJhdG9yKz0oY29uc3QgUG9pbnRlcjxCeXRlPiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmb2Zmc2V0KTsNCisJCWZyaWVuZCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gb3BlcmF0b3IrPShjb25zdCBQb2ludGVyPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxVSW50PiAmb2Zmc2V0KTsNCisNCisJCWZyaWVuZCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxQb2ludGVyPEJ5dGU+PiAmbGhzLCBpbnQgb2Zmc2V0KTsNCisJCWZyaWVuZCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxQb2ludGVyPEJ5dGU+PiAmbGhzLCBjb25zdCBSVmFsdWU8SW50PiAmb2Zmc2V0KTsNCisJCWZyaWVuZCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gb3BlcmF0b3ItKGNvbnN0IFJWYWx1ZTxQb2ludGVyPEJ5dGU+PiAmbGhzLCBjb25zdCBSVmFsdWU8VUludD4gJm9mZnNldCk7DQorCQlmcmllbmQgUlZhbHVlPFBvaW50ZXI8Qnl0ZT4+IG9wZXJhdG9yLT0oY29uc3QgUG9pbnRlcjxCeXRlPiAmbGhzLCBpbnQgb2Zmc2V0KTsNCisJCWZyaWVuZCBSVmFsdWU8UG9pbnRlcjxCeXRlPj4gb3BlcmF0b3ItPShjb25zdCBQb2ludGVyPEJ5dGU+ICZsaHMsIGNvbnN0IFJWYWx1ZTxJbnQ+ICZvZmZzZXQpOw0KKwkJZnJpZW5kIFJWYWx1ZTxQb2ludGVyPEJ5dGU+PiBvcGVyYXRvci09KGNvbnN0IFBvaW50ZXI8Qnl0ZT4gJmxocywgY29uc3QgUlZhbHVlPFVJbnQ+ICZvZmZzZXQpOw0KKw0KKwkJc3RhdGljIGNvbnN0IGxsdm06OlR5cGUgKmdldFR5cGUoKTsNCisNCisJcHJpdmF0ZToNCisJCWNvbnN0IGludCBhbGlnbm1lbnQ7DQorCX07DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCWNsYXNzIEFycmF5IDogcHVibGljIFZhcmlhYmxlPFRbXT4NCisJew0KKwlwdWJsaWM6DQorCQlBcnJheShpbnQgc2l6ZSk7DQorDQorCQlSZWZlcmVuY2U8VD4gb3BlcmF0b3JbXShpbnQgaW5kZXgpOw0KKwkJUmVmZXJlbmNlPFQ+IG9wZXJhdG9yW10oUlZhbHVlPEludD4gaW5kZXgpOw0KKwkJUmVmZXJlbmNlPFQ+IG9wZXJhdG9yW10oUlZhbHVlPFVJbnQ+IGluZGV4KTsNCisNCisJLy8JZnJpZW5kIFJWYWx1ZTxBcnJheTxUPj4gb3BlcmF0b3IrKyhjb25zdCBBcnJheTxUPiAmdmFsLCBpbnQpOyAgIC8vIFBvc3QtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBjb25zdCBBcnJheTxUPiAmb3BlcmF0b3IrKyhjb25zdCBBcnJheTxUPiAmdmFsKTsgICAvLyBQcmUtaW5jcmVtZW50DQorCS8vCWZyaWVuZCBSVmFsdWU8QXJyYXk8VD4+IG9wZXJhdG9yLS0oY29uc3QgQXJyYXk8VD4gJnZhbCwgaW50KTsgICAvLyBQb3N0LWRlY3JlbWVudA0KKwkvLwlmcmllbmQgY29uc3QgQXJyYXk8VD4gJm9wZXJhdG9yLS0oY29uc3QgQXJyYXk8VD4gJnZhbCk7ICAgLy8gUHJlLWRlY3JlbWVudA0KKwl9Ow0KKw0KKwlsbHZtOjpCYXNpY0Jsb2NrICpiZWdpbkxvb3AoKTsNCisJYm9vbCBicmFuY2goY29uc3QgUlZhbHVlPEJvb2w+ICZjbXAsIGxsdm06OkJhc2ljQmxvY2sgKmJvZHlCQiwgbGx2bTo6QmFzaWNCbG9jayAqZW5kQkIpOw0KKwlib29sIGVsc2VCbG9jayhsbHZtOjpCYXNpY0Jsb2NrICpmYWxzZUJCKTsNCisNCisJdm9pZCBSZXR1cm4oKTsNCisJdm9pZCBSZXR1cm4oY29uc3QgSW50ICZyZXQpOw0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwl2b2lkIFJldHVybihjb25zdCBQb2ludGVyPFQ+ICZyZXQpOw0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwl2b2lkIFJldHVybihjb25zdCBSVmFsdWU8UG9pbnRlcjxUPj4gJnJldCk7DQorDQorCXRlbXBsYXRlPGNsYXNzIFIgPSBWb2lkLCBjbGFzcyBBMSA9IFZvaWQsIGNsYXNzIEEyID0gVm9pZCwgY2xhc3MgQTMgPSBWb2lkLCBjbGFzcyBBNCA9IFZvaWQ+DQorCWNsYXNzIEZ1bmN0aW9uDQorCXsNCisJcHVibGljOg0KKwkJRnVuY3Rpb24oKTsNCisNCisJCXZpcnR1YWwgfkZ1bmN0aW9uKCk7DQorDQorCQlsbHZtOjpBcmd1bWVudCAqYXJnKGludCBpbmRleCk7DQorDQorCQlSb3V0aW5lICpvcGVyYXRvcigpKGNvbnN0IHdjaGFyX3QgKm5hbWUsIC4uLik7DQorDQorCXByaXZhdGU6DQorCQlOdWNsZXVzICpjb3JlOw0KKwkJbGx2bTo6RnVuY3Rpb24gKmZ1bmN0aW9uOw0KKwkJc3RkOjp2ZWN0b3I8Y29uc3QgbGx2bTo6VHlwZSo+IGFyZ3VtZW50czsNCisJfTsNCisNCisJUlZhbHVlPExvbmc+IFRpY2tzKCk7DQorCXZvaWQgRW1tcygpOw0KK30NCisNCituYW1lc3BhY2Ugc3cNCit7DQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVJlZmVyZW5jZTxUPjo6UmVmZXJlbmNlKGxsdm06OlZhbHVlICpwb2ludGVyLCBpbnQgYWxpZ25tZW50KSA6IGFsaWdubWVudChhbGlnbm1lbnQpDQorCXsNCisJCWFkZHJlc3MgPSBwb2ludGVyOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVJWYWx1ZTxUPiBSZWZlcmVuY2U8VD46Om9wZXJhdG9yPShjb25zdCBSVmFsdWU8VD4gJnJocykgY29uc3QNCisJew0KKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzLCBmYWxzZSwgYWxpZ25tZW50KTsNCisNCisJCXJldHVybiByaHM7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJUmVmZXJlbmNlPFQ+OjpvcGVyYXRvciBSVmFsdWU8VD4oKSBjb25zdA0KKwl7DQorCQlyZXR1cm4gUlZhbHVlPFQ+KE51Y2xldXM6OmNyZWF0ZUxvYWQoYWRkcmVzcywgZmFsc2UsIGFsaWdubWVudCkpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVJWYWx1ZTxUPiBSZWZlcmVuY2U8VD46Om9wZXJhdG9yPShjb25zdCBSZWZlcmVuY2U8VD4gJnJlZikgY29uc3QNCisJew0KKwkJbGx2bTo6VmFsdWUgKnRtcCA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmVmLmFkZHJlc3MsIGZhbHNlLCByZWYuYWxpZ25tZW50KTsNCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHRtcCwgYWRkcmVzcywgZmFsc2UsIGFsaWdubWVudCk7DQorDQorCQlyZXR1cm4gUlZhbHVlPFQ+KHRtcCk7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJUlZhbHVlPFQ+IFJlZmVyZW5jZTxUPjo6b3BlcmF0b3IrPShjb25zdCBSVmFsdWU8VD4gJnJocykgY29uc3QNCisJew0KKwkJcmV0dXJuICp0aGlzID0gKnRoaXMgKyByaHM7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJUlZhbHVlPFQ+OjpSVmFsdWUobGx2bTo6VmFsdWUgKnJ2YWx1ZSkNCisJew0KKwkJdmFsdWUgPSBydmFsdWU7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJUlZhbHVlPFQ+OjpSVmFsdWUoY29uc3QgVCAmbHZhbHVlKQ0KKwl7DQorCQl2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQobHZhbHVlLmFkZHJlc3MpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVJWYWx1ZTxUPjo6UlZhbHVlKHR5cGVuYW1lIEludExpdGVyYWw8VD46OnR5cGUgaSkNCisJew0KKwkJdmFsdWUgPSAobGx2bTo6VmFsdWUqKU51Y2xldXM6OmNyZWF0ZUNvbnN0YW50SW50KGkpOw0KKwl9DQorDQorCXRlbXBsYXRlPGludCBUPg0KKwlTd2l6emxlMkZsb2F0NDxUPjo6b3BlcmF0b3IgUlZhbHVlPEZsb2F0ND4oKSBjb25zdA0KKwl7DQorCQlsbHZtOjpWYWx1ZSAqdmVjdG9yID0gTnVjbGV1czo6Y3JlYXRlTG9hZChwYXJlbnQtPmFkZHJlc3MpOw0KKw0KKwkJcmV0dXJuIFJWYWx1ZTxGbG9hdDQ+KE51Y2xldXM6OmNyZWF0ZVN3aXp6bGUodmVjdG9yLCBUKSk7DQorCX0NCisNCisJdGVtcGxhdGU8aW50IFQ+DQorCVN3aXp6bGVGbG9hdDQ8VD46Om9wZXJhdG9yIFJWYWx1ZTxGbG9hdDQ+KCkgY29uc3QNCisJew0KKwkJbGx2bTo6VmFsdWUgKnZlY3RvciA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocGFyZW50LT5hZGRyZXNzKTsNCisNCisJCXJldHVybiBSVmFsdWU8RmxvYXQ0PihOdWNsZXVzOjpjcmVhdGVTd2l6emxlKHZlY3RvciwgVCkpOw0KKwl9DQorDQorCXRlbXBsYXRlPGludCBUPg0KKwlTd2l6emxlTWFza0Zsb2F0NDxUPjo6b3BlcmF0b3IgUlZhbHVlPEZsb2F0ND4oKSBjb25zdA0KKwl7DQorCQlsbHZtOjpWYWx1ZSAqdmVjdG9yID0gTnVjbGV1czo6Y3JlYXRlTG9hZChwYXJlbnQtPmFkZHJlc3MpOw0KKw0KKwkJcmV0dXJuIFJWYWx1ZTxGbG9hdDQ+KE51Y2xldXM6OmNyZWF0ZVN3aXp6bGUodmVjdG9yLCBUKSk7DQorCX0NCisNCisJdGVtcGxhdGU8aW50IFQ+DQorCVJWYWx1ZTxGbG9hdDQ+IFN3aXp6bGVNYXNrRmxvYXQ0PFQ+OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEZsb2F0ND4gJnJocykgY29uc3QNCisJew0KKwkJcmV0dXJuIE1hc2soKnBhcmVudCwgcmhzLCBUKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxpbnQgVD4NCisJUlZhbHVlPEZsb2F0ND4gU3dpenpsZU1hc2tGbG9hdDQ8VD46Om9wZXJhdG9yPShjb25zdCBSVmFsdWU8RmxvYXQ+ICZyaHMpIGNvbnN0DQorCXsNCisJCXJldHVybiBNYXNrKCpwYXJlbnQsIEZsb2F0NChyaHMpLCBUKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxpbnQgVD4NCisJU3dpenpsZU1hc2sxRmxvYXQ0PFQ+OjpvcGVyYXRvciBSVmFsdWU8RmxvYXQ+KCkgY29uc3QgICAvLyBGSVhNRTogQ2FsbCBhIG5vbi10ZW1wbGF0ZSBmdW5jdGlvbg0KKwl7DQorCQlyZXR1cm4gRXh0cmFjdCgqcGFyZW50LCBUICYgMHgzKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxpbnQgVD4NCisJU3dpenpsZU1hc2sxRmxvYXQ0PFQ+OjpvcGVyYXRvciBSVmFsdWU8RmxvYXQ0PigpIGNvbnN0DQorCXsNCisJCWxsdm06OlZhbHVlICp2ZWN0b3IgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHBhcmVudC0+YWRkcmVzcyk7DQorDQorCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlU3dpenpsZSh2ZWN0b3IsIFQpKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxpbnQgVD4NCisJUlZhbHVlPEZsb2F0ND4gU3dpenpsZU1hc2sxRmxvYXQ0PFQ+OjpvcGVyYXRvcj0oZmxvYXQgeCkgY29uc3QNCisJew0KKwkJcmV0dXJuIEluc2VydCgqcGFyZW50LCBGbG9hdCh4KSwgVCAmIDB4Myk7DQorCX0NCisNCisJdGVtcGxhdGU8aW50IFQ+DQorCVJWYWx1ZTxGbG9hdDQ+IFN3aXp6bGVNYXNrMUZsb2F0NDxUPjo6b3BlcmF0b3I9KGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZyaHMpIGNvbnN0DQorCXsNCisJCXJldHVybiBNYXNrKCpwYXJlbnQsIEZsb2F0NChyaHMpLCBUKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxpbnQgVD4NCisJUlZhbHVlPEZsb2F0ND4gU3dpenpsZU1hc2sxRmxvYXQ0PFQ+OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEZsb2F0PiAmcmhzKSBjb25zdCAgIC8vIEZJWE1FOiBDYWxsIGEgbm9uLXRlbXBsYXRlIGZ1bmN0aW9uDQorCXsNCisJCXJldHVybiBJbnNlcnQoKnBhcmVudCwgcmhzLCBUICYgMHgzKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxpbnQgVD4NCisJU3dpenpsZU1hc2syRmxvYXQ0PFQ+OjpvcGVyYXRvciBSVmFsdWU8RmxvYXQ0PigpIGNvbnN0DQorCXsNCisJCWxsdm06OlZhbHVlICp2ZWN0b3IgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHBhcmVudC0+YWRkcmVzcyk7DQorDQorCQlyZXR1cm4gUlZhbHVlPEZsb2F0ND4oTnVjbGV1czo6Y3JlYXRlU3dpenpsZSh2ZWN0b3IsIFQpKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxpbnQgVD4NCisJUlZhbHVlPEZsb2F0ND4gU3dpenpsZU1hc2syRmxvYXQ0PFQ+OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPEZsb2F0ND4gJnJocykgY29uc3QNCisJew0KKwkJcmV0dXJuIE1hc2soKnBhcmVudCwgRmxvYXQ0KHJocyksIFQpOw0KKwl9DQorDQorCXRlbXBsYXRlPGludCBUPg0KKwlGbG9hdDQ6OkZsb2F0NChjb25zdCBTd2l6emxlTWFzazFGbG9hdDQ8VD4gJmxocykNCisJew0KKwkJeHl6dy5wYXJlbnQgPSB0aGlzOw0KKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOw0KKw0KKwkJKnRoaXMgPSBSVmFsdWU8RmxvYXQ0PihsaHMpOw0KKwl9DQorDQorCXRlbXBsYXRlPGludCBYLCBpbnQgWT4NCisJRmxvYXQ0OjpGbG9hdDQoY29uc3QgU3dpenpsZTJGbG9hdDQ8WD4gJngsIGNvbnN0IFN3aXp6bGUyRmxvYXQ0PFk+ICZ5KQ0KKwl7DQorCQl4eXp3LnBhcmVudCA9IHRoaXM7DQorCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7DQorDQorCQkqdGhpcyA9IFNodWZmbGVMb3dIaWdoKCp4LnBhcmVudCwgKnkucGFyZW50LCAoWCAmIDB4RikgfCAoWSAmIDB4RikgPDwgNCk7DQorCX0NCisNCisJdGVtcGxhdGU8aW50IFgsIGludCBZPg0KKwlGbG9hdDQ6OkZsb2F0NChjb25zdCBTd2l6emxlTWFzazJGbG9hdDQ8WD4gJngsIGNvbnN0IFN3aXp6bGUyRmxvYXQ0PFk+ICZ5KQ0KKwl7DQorCQl4eXp3LnBhcmVudCA9IHRoaXM7DQorCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7DQorDQorCQkqdGhpcyA9IFNodWZmbGVMb3dIaWdoKCp4LnBhcmVudCwgKnkucGFyZW50LCAoWCAmIDB4RikgfCAoWSAmIDB4RikgPDwgNCk7DQorCX0NCisNCisJdGVtcGxhdGU8aW50IFgsIGludCBZPg0KKwlGbG9hdDQ6OkZsb2F0NChjb25zdCBTd2l6emxlMkZsb2F0NDxYPiAmeCwgY29uc3QgU3dpenpsZU1hc2syRmxvYXQ0PFk+ICZ5KQ0KKwl7DQorCQl4eXp3LnBhcmVudCA9IHRoaXM7DQorCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKGdldFR5cGUoKSk7DQorDQorCQkqdGhpcyA9IFNodWZmbGVMb3dIaWdoKCp4LnBhcmVudCwgKnkucGFyZW50LCAoWCAmIDB4RikgfCAoWSAmIDB4RikgPDwgNCk7DQorCX0NCisNCisJdGVtcGxhdGU8aW50IFgsIGludCBZPg0KKwlGbG9hdDQ6OkZsb2F0NChjb25zdCBTd2l6emxlTWFzazJGbG9hdDQ8WD4gJngsIGNvbnN0IFN3aXp6bGVNYXNrMkZsb2F0NDxZPiAmeSkNCisJew0KKwkJeHl6dy5wYXJlbnQgPSB0aGlzOw0KKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShnZXRUeXBlKCkpOw0KKw0KKwkJKnRoaXMgPSBTaHVmZmxlTG93SGlnaCgqeC5wYXJlbnQsICp5LnBhcmVudCwgKFggJiAweEYpIHwgKFkgJiAweEYpIDw8IDQpOw0KKwl9DQorDQorCXRlbXBsYXRlPGludCBUPg0KKwlSVmFsdWU8RmxvYXQ0PiBGbG9hdDQ6Om9wZXJhdG9yPShjb25zdCBTd2l6emxlTWFzazFGbG9hdDQ8VD4gJmxocykNCisJew0KKwkJcmV0dXJuICp0aGlzID0gUlZhbHVlPEZsb2F0ND4obGhzKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwlQb2ludGVyPFQ+OjpQb2ludGVyKGxsdm06OlZhbHVlICpwb2ludGVyKSA6IGFsaWdubWVudCgxKQ0KKwl7DQorCQlhZGRyZXNzID0gcG9pbnRlcjsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwlQb2ludGVyPFQ+OjpQb2ludGVyKGxsdm06OkFyZ3VtZW50ICphcmd1bWVudCkgOiBhbGlnbm1lbnQoMSkNCisJew0KKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShOdWNsZXVzOjpnZXRQb2ludGVyVHlwZShUOjpnZXRUeXBlKCkpKTsNCisNCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKChsbHZtOjpWYWx1ZSopYXJndW1lbnQsIGFkZHJlc3MpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVBvaW50ZXI8VD46OlBvaW50ZXIoY29uc3Qgdm9pZCAqZXh0ZXJuYWwpIDogYWxpZ25tZW50KChzaXplX3QpZXh0ZXJuYWwgJiAweDAwMDAwMDBGID8gMSA6IDE2KQ0KKwl7DQorCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKE51Y2xldXM6OmdldFBvaW50ZXJUeXBlKFQ6OmdldFR5cGUoKSkpOw0KKw0KKwkJbGx2bTo6TW9kdWxlICptb2R1bGUgPSBOdWNsZXVzOjpnZXRNb2R1bGUoKTsNCisJCWNvbnN0IGxsdm06Okdsb2JhbFZhbHVlICpnbG9iYWxQb2ludGVyID0gTnVjbGV1czo6Z2V0R2xvYmFsVmFsdWVBdEFkZHJlc3MoY29uc3RfY2FzdDx2b2lkKj4oZXh0ZXJuYWwpKTsgICAvLyBGSVhNRTogQ29uc3QNCisNCisJCWlmKCFnbG9iYWxQb2ludGVyKQ0KKwkJew0KKwkJCWdsb2JhbFBvaW50ZXIgPSBOdWNsZXVzOjpjcmVhdGVHbG9iYWxWYWx1ZShUOjpnZXRUeXBlKCksIGZhbHNlLCBhbGlnbm1lbnQpOw0KKw0KKwkJCU51Y2xldXM6OmFkZEdsb2JhbE1hcHBpbmcoZ2xvYmFsUG9pbnRlciwgY29uc3RfY2FzdDx2b2lkKj4oZXh0ZXJuYWwpKTsgICAvLyBGSVhNRTogQ29uc3QNCisJCX0NCisNCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKChsbHZtOjpWYWx1ZSopZ2xvYmFsUG9pbnRlciwgYWRkcmVzcyk7ICAgLy8gRklYTUU6IENvbnN0DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJUG9pbnRlcjxUPjo6UG9pbnRlcigpIDogYWxpZ25tZW50KDEpDQorCXsNCisJCWFkZHJlc3MgPSBOdWNsZXVzOjphbGxvY2F0ZVN0YWNrVmFyaWFibGUoTnVjbGV1czo6Z2V0UG9pbnRlclR5cGUoVDo6Z2V0VHlwZSgpKSk7DQorDQorCQlOdWNsZXVzOjpjcmVhdGVTdG9yZShOdWNsZXVzOjpjcmVhdGVOdWxsUG9pbnRlcihUOjpnZXRUeXBlKCkpLCBhZGRyZXNzKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwlQb2ludGVyPFQ+OjpQb2ludGVyKGNvbnN0IFJWYWx1ZTxQb2ludGVyPFQ+PiAmcmhzKSA6IGFsaWdubWVudCgxKQ0KKwl7DQorCQlhZGRyZXNzID0gTnVjbGV1czo6YWxsb2NhdGVTdGFja1ZhcmlhYmxlKE51Y2xldXM6OmdldFBvaW50ZXJUeXBlKFQ6OmdldFR5cGUoKSkpOw0KKw0KKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUocmhzLnZhbHVlLCBhZGRyZXNzKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwlQb2ludGVyPFQ+OjpQb2ludGVyKGNvbnN0IFBvaW50ZXI8VD4gJnJocykgOiBhbGlnbm1lbnQocmhzLmFsaWdubWVudCkNCisJew0KKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShOdWNsZXVzOjpnZXRQb2ludGVyVHlwZShUOjpnZXRUeXBlKCkpKTsNCisNCisJCWxsdm06OlZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQocmhzLmFkZHJlc3MpOw0KKwkJTnVjbGV1czo6Y3JlYXRlU3RvcmUodmFsdWUsIGFkZHJlc3MpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVJWYWx1ZTxQb2ludGVyPFQ+PiBQb2ludGVyPFQ+OjpvcGVyYXRvcj0oY29uc3QgUlZhbHVlPFBvaW50ZXI8VD4+ICZyaHMpIGNvbnN0DQorCXsNCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHJocy52YWx1ZSwgYWRkcmVzcyk7DQorDQorCQlyZXR1cm4gcmhzOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVJWYWx1ZTxQb2ludGVyPFQ+PiBQb2ludGVyPFQ+OjpvcGVyYXRvcj0oY29uc3QgUG9pbnRlcjxUPiAmcmhzKSBjb25zdA0KKwl7DQorCQlsbHZtOjpWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHJocy5hZGRyZXNzKTsNCisJCU51Y2xldXM6OmNyZWF0ZVN0b3JlKHZhbHVlLCBhZGRyZXNzKTsNCisNCisJCXJldHVybiBSVmFsdWU8UG9pbnRlcjxUPj4odmFsdWUpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVJlZmVyZW5jZTxUPiBQb2ludGVyPFQ+OjpvcGVyYXRvciooKQ0KKwl7DQorCQlyZXR1cm4gUmVmZXJlbmNlPFQ+KE51Y2xldXM6OmNyZWF0ZUxvYWQoYWRkcmVzcyksIGFsaWdubWVudCk7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJY29uc3QgbGx2bTo6VHlwZSAqUG9pbnRlcjxUPjo6Z2V0VHlwZSgpDQorCXsNCisJCXJldHVybiBOdWNsZXVzOjpnZXRQb2ludGVyVHlwZShUOjpnZXRUeXBlKCkpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCUFycmF5PFQ+OjpBcnJheShpbnQgc2l6ZSkNCisJew0KKwkJYWRkcmVzcyA9IE51Y2xldXM6OmFsbG9jYXRlU3RhY2tWYXJpYWJsZShUOjpnZXRUeXBlKCksIHNpemUpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVJlZmVyZW5jZTxUPiBBcnJheTxUPjo6b3BlcmF0b3JbXShpbnQgaW5kZXgpDQorCXsNCisJCWxsdm06OlZhbHVlICplbGVtZW50ID0gTnVjbGV1czo6Y3JlYXRlR0VQKGFkZHJlc3MsIChsbHZtOjpWYWx1ZSopTnVjbGV1czo6Y3JlYXRlQ29uc3RhbnRJbnQoaW5kZXgpKTsNCisJDQorCQlyZXR1cm4gUmVmZXJlbmNlPFQ+KGVsZW1lbnQpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCVJlZmVyZW5jZTxUPiBBcnJheTxUPjo6b3BlcmF0b3JbXShSVmFsdWU8SW50PiBpbmRleCkNCisJew0KKwkJbGx2bTo6VmFsdWUgKmVsZW1lbnQgPSBOdWNsZXVzOjpjcmVhdGVHRVAoYWRkcmVzcywgaW5kZXgudmFsdWUpOw0KKwkNCisJCXJldHVybiBSZWZlcmVuY2U8VD4oZWxlbWVudCk7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJUmVmZXJlbmNlPFQ+IEFycmF5PFQ+OjpvcGVyYXRvcltdKFJWYWx1ZTxVSW50PiBpbmRleCkNCisJew0KKwkJbGx2bTo6VmFsdWUgKmVsZW1lbnQgPSBOdWNsZXVzOjpjcmVhdGVHRVAoYWRkcmVzcywgaW5kZXgudmFsdWUpOw0KKwkNCisJCXJldHVybiBSZWZlcmVuY2U8VD4oZWxlbWVudCk7DQorCX0NCisNCisvLwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKy8vCVJWYWx1ZTxBcnJheTxUPj4gb3BlcmF0b3IrKyhjb25zdCBBcnJheTxUPiAmdmFsLCBpbnQpDQorLy8Jew0KKy8vCQkvLyBGSVhNRTogUmVxdWlyZXMgc3RvcmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgYXJyYXkNCisvLwl9DQorCQ0KKy8vCXRlbXBsYXRlPGNsYXNzIFQ+DQorLy8JY29uc3QgQXJyYXk8VD4gJm9wZXJhdG9yKysoY29uc3QgQXJyYXk8VD4gJnZhbCkNCisvLwl7DQorLy8JCS8vIEZJWE1FOiBSZXF1aXJlcyBzdG9yaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheQ0KKy8vCX0NCisNCisvLwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKy8vCVJWYWx1ZTxBcnJheTxUPj4gb3BlcmF0b3ItLShjb25zdCBBcnJheTxUPiAmdmFsLCBpbnQpDQorLy8Jew0KKy8vCQkvLyBGSVhNRTogUmVxdWlyZXMgc3RvcmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgYXJyYXkNCisvLwl9DQorDQorLy8JdGVtcGxhdGU8Y2xhc3MgVD4NCisvLwljb25zdCBBcnJheTxUPiAmb3BlcmF0b3ItLShjb25zdCBBcnJheTxUPiAmdmFsKQ0KKy8vCXsNCisvLwkJLy8gRklYTUU6IFJlcXVpcmVzIHN0b3JpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIGFycmF5DQorLy8JfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwlSVmFsdWU8VD4gSWZUaGVuRWxzZShjb25zdCBSVmFsdWU8Qm9vbD4gJmNvbmRpdGlvbiwgY29uc3QgUlZhbHVlPFQ+ICZpZlRydWUsIGNvbnN0IFJWYWx1ZTxUPiAmaWZGYWxzZSkNCisJew0KKwkJcmV0dXJuIFJWYWx1ZTxUPihOdWNsZXVzOjpjcmVhdGVTZWxlY3QoY29uZGl0aW9uLnZhbHVlLCBpZlRydWUudmFsdWUsIGlmRmFsc2UudmFsdWUpKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwlSVmFsdWU8VD4gSWZUaGVuRWxzZShjb25zdCBSVmFsdWU8Qm9vbD4gJmNvbmRpdGlvbiwgY29uc3QgVCAmaWZUcnVlLCBjb25zdCBSVmFsdWU8VD4gJmlmRmFsc2UpDQorCXsNCisJCWxsdm06OlZhbHVlICp0cnVlVmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKGlmVHJ1ZS5hZGRyZXNzKTsNCisNCisJCXJldHVybiBSVmFsdWU8VD4oTnVjbGV1czo6Y3JlYXRlU2VsZWN0KGNvbmRpdGlvbi52YWx1ZSwgdHJ1ZVZhbHVlLCBpZkZhbHNlLnZhbHVlKSk7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJUlZhbHVlPFQ+IElmVGhlbkVsc2UoY29uc3QgUlZhbHVlPEJvb2w+ICZjb25kaXRpb24sIGNvbnN0IFJWYWx1ZTxUPiAmaWZUcnVlLCBjb25zdCBUICZpZkZhbHNlKQ0KKwl7DQorCQlsbHZtOjpWYWx1ZSAqZmFsc2VWYWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQoaWZGYWxzZS5hZGRyZXNzKTsNCisNCisJCXJldHVybiBSVmFsdWU8VD4oTnVjbGV1czo6Y3JlYXRlU2VsZWN0KGNvbmRpdGlvbi52YWx1ZSwgaWZUcnVlLnZhbHVlLCBmYWxzZVZhbHVlKSk7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVD4NCisJUlZhbHVlPFQ+IElmVGhlbkVsc2UoY29uc3QgUlZhbHVlPEJvb2w+ICZjb25kaXRpb24sIGNvbnN0IFQgJmlmVHJ1ZSwgY29uc3QgVCAmaWZGYWxzZSkNCisJew0KKwkJbGx2bTo6VmFsdWUgKnRydWVWYWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQoaWZUcnVlLmFkZHJlc3MpOw0KKwkJbGx2bTo6VmFsdWUgKmZhbHNlVmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKGlmRmFsc2UuYWRkcmVzcyk7DQorDQorCQlyZXR1cm4gUlZhbHVlPFQ+KE51Y2xldXM6OmNyZWF0ZVNlbGVjdChjb25kaXRpb24udmFsdWUsIHRydWVWYWx1ZSwgZmFsc2VWYWx1ZSkpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+DQorCXZvaWQgUmV0dXJuKGNvbnN0IFBvaW50ZXI8VD4gJnJldCkNCisJew0KKwkJTnVjbGV1czo6Y3JlYXRlUmV0KE51Y2xldXM6OmNyZWF0ZUxvYWQocmV0LmFkZHJlc3MpKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPg0KKwl2b2lkIFJldHVybihjb25zdCBSVmFsdWU8UG9pbnRlcjxUPj4gJnJldCkNCisJew0KKwkJTnVjbGV1czo6Y3JlYXRlUmV0KHJldC52YWx1ZSk7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MgQTEsIGNsYXNzIEEyLCBjbGFzcyBBMywgY2xhc3MgQTQ+DQorCUZ1bmN0aW9uPFIsIEExLCBBMiwgQTMsIEE0Pjo6RnVuY3Rpb24oKQ0KKwl7DQorCQljb3JlID0gbmV3IE51Y2xldXMoKTsNCisNCisJCWlmKCFBMTo6aXNWb2lkKCkpIGFyZ3VtZW50cy5wdXNoX2JhY2soQTE6OmdldFR5cGUoKSk7DQorCQlpZighQTI6OmlzVm9pZCgpKSBhcmd1bWVudHMucHVzaF9iYWNrKEEyOjpnZXRUeXBlKCkpOw0KKwkJaWYoIUEzOjppc1ZvaWQoKSkgYXJndW1lbnRzLnB1c2hfYmFjayhBMzo6Z2V0VHlwZSgpKTsNCisJCWlmKCFBNDo6aXNWb2lkKCkpIGFyZ3VtZW50cy5wdXNoX2JhY2soQTQ6OmdldFR5cGUoKSk7DQorDQorCQlmdW5jdGlvbiA9IE51Y2xldXM6OmNyZWF0ZUZ1bmN0aW9uKFI6OmdldFR5cGUoKSwgYXJndW1lbnRzKTsNCisJCU51Y2xldXM6OnNldEZ1bmN0aW9uKGZ1bmN0aW9uKTsJDQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MgQTEsIGNsYXNzIEEyLCBjbGFzcyBBMywgY2xhc3MgQTQ+DQorCUZ1bmN0aW9uPFIsIEExLCBBMiwgQTMsIEE0Pjo6fkZ1bmN0aW9uKCkNCisJew0KKwkJZGVsZXRlIGNvcmU7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MgQTEsIGNsYXNzIEEyLCBjbGFzcyBBMywgY2xhc3MgQTQ+DQorCWxsdm06OkFyZ3VtZW50ICpGdW5jdGlvbjxSLCBBMSwgQTIsIEEzLCBBND46OmFyZyhpbnQgaW5kZXgpDQorCXsNCisJCXJldHVybiBOdWNsZXVzOjpnZXRBcmd1bWVudChmdW5jdGlvbiwgaW5kZXgpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFIsIGNsYXNzIEExLCBjbGFzcyBBMiwgY2xhc3MgQTMsIGNsYXNzIEE0Pg0KKwlSb3V0aW5lICpGdW5jdGlvbjxSLCBBMSwgQTIsIEEzLCBBND46Om9wZXJhdG9yKCkoY29uc3Qgd2NoYXJfdCAqbmFtZSwgLi4uKQ0KKwl7DQorCQl3Y2hhcl90IGZ1bGxOYW1lWzEwMjQgKyAxXTsNCisNCisJCXZhX2xpc3QgdmFyYXJnOw0KKwkJdmFfc3RhcnQodmFyYXJnLCBuYW1lKTsNCisJCXZzd3ByaW50ZihmdWxsTmFtZSwgMTAyNCwgbmFtZSwgdmFyYXJnKTsNCisJCXZhX2VuZCh2YXJhcmcpOw0KKw0KKwkJcmV0dXJuIGNvcmUtPmFjcXVpcmVSb3V0aW5lKGZ1bGxOYW1lLCB0cnVlKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTPg0KKwlSVmFsdWU8VD4gUmVpbnRlcnByZXRDYXN0KGNvbnN0IFJWYWx1ZTxTPiAmdmFsKQ0KKwl7DQorCQlyZXR1cm4gUlZhbHVlPFQ+KE51Y2xldXM6OmNyZWF0ZUJpdENhc3QodmFsLnZhbHVlLCBUOjpnZXRUeXBlKCkpKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTPg0KKwlSVmFsdWU8VD4gUmVpbnRlcnByZXRDYXN0KGNvbnN0IFZhcmlhYmxlPFM+ICZ2YXIpDQorCXsNCisJCWxsdm06OlZhbHVlICp2YWwgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKHZhci5hZGRyZXNzKTsNCisNCisJCXJldHVybiBSVmFsdWU8VD4oTnVjbGV1czo6Y3JlYXRlQml0Q2FzdCh2YWwsIFQ6OmdldFR5cGUoKSkpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFM+DQorCVJWYWx1ZTxUPiBSZWludGVycHJldENhc3QoY29uc3QgUmVmZXJlbmNlPFM+ICZ2YXIpDQorCXsNCisJCXJldHVybiBSZWludGVycHJldENhc3Q8VD4oUlZhbHVlPFM+KHZhcikpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFM+DQorCVJWYWx1ZTxUPiBBcyhjb25zdCBSVmFsdWU8Uz4gJnZhbCkNCisJew0KKwkJcmV0dXJuIFJlaW50ZXJwcmV0Q2FzdDxUPih2YWwpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFM+DQorCVJWYWx1ZTxUPiBBcyhjb25zdCBWYXJpYWJsZTxTPiAmdmFyKQ0KKwl7DQorCQlyZXR1cm4gUmVpbnRlcnByZXRDYXN0PFQ+KHZhcik7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUz4NCisJUlZhbHVlPFQ+IEFzKGNvbnN0IFJlZmVyZW5jZTxTPiAmdmFsKQ0KKwl7DQorCQlyZXR1cm4gUmVpbnRlcnByZXRDYXN0PFQ+KHZhbCk7DQorCX0NCit9DQorDQorI2VuZGlmICAgLy8gc3dfTnVjbGV1c19ocHANCmRpZmYgLS1naXQgYS9zcmMvUmVhY3Rvci9SZWFjdG9yLmhwcCBiL3NyYy9SZWFjdG9yL1JlYWN0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNGQ3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVhY3Rvci9SZWFjdG9yLmhwcApAQCAtMCwwICsxLDEzIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2luY2x1ZGUgIk51Y2xldXMuaHBwIg0KKyNpbmNsdWRlICJTaGVsbC5ocHAiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL1JlYWN0b3IvUmVhY3Rvci52Y3hwcm9qIGIvc3JjL1JlYWN0b3IvUmVhY3Rvci52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Mjg1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVhY3Rvci9SZWFjdG9yLnZjeHByb2oKQEAgLTAsMCArMSwyNTIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezI4RkQwNzZELTEwQjUtNEJEOC1BNENGLUY0NEM3MDAyQTgwM308L1Byb2plY3RHdWlkPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5SZWFjdG9yPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlw7Li5cTExWTVxpbmNsdWRlOy4uXExMVk1cd2luMzI7Li5cQ29tbW9uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfTElCOyBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40NTMwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cOy4uXExMVk1caW5jbHVkZTsuLlxMTFZNXHdpbjMyOy4uXENvbW1vbjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0xJQjsgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ1MzA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXDsuLlxMTFZNXGluY2x1ZGU7Li5cTExWTVx3aW4zMjsuLlxDb21tb247JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDsgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ1MzA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cOy4uXExMVk1caW5jbHVkZTsuLlxMTFZNXHdpbjMyOy4uXENvbW1vbjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0xJQjtfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDUzMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz5mYWxzZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPlNpemU8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXDsuLlxMTFZNXGluY2x1ZGU7Li5cTExWTVx3aW4zMjsuLlxDb21tb247JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDsgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ1MzA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXDsuLlxMTFZNXGluY2x1ZGU7Li5cTExWTVx3aW4zMjsuLlxDb21tb247JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDsgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ1MzA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iTWVtb3J5TWFuYWdlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iTnVjbGV1cy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iU2hlbGwuY3BwIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ik1lbW9yeU1hbmFnZXIuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ik51Y2xldXMuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlJlYWN0b3IuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlNoZWxsLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ4ODYuaHBwIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9SZWFjdG9yL1JlYWN0b3IudmN4cHJvai5maWx0ZXJzIGIvc3JjL1JlYWN0b3IvUmVhY3Rvci52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyY2UyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZWFjdG9yL1JlYWN0b3IudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsNDUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214PC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iUmVzb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPnJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4O3RpZmY7dGlmO3BuZzt3YXY8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ik1lbW9yeU1hbmFnZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJOdWNsZXVzLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iU2hlbGwuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJNZW1vcnlNYW5hZ2VyLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iTnVjbGV1cy5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IlJlYWN0b3IuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJTaGVsbC5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ing4Ni5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9SZWFjdG9yL1NoZWxsLmNwcCBiL3NyYy9SZWFjdG9yL1NoZWxsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY3ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlYWN0b3IvU2hlbGwuY3BwCkBAIC0wLDAgKzEsMzQwIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJTaGVsbC5ocHAiCisKK25hbWVzcGFjZSBzdworeworCVRyYW5zY2VuZGVudGFsUHJlY2lzaW9uIGxvZ1ByZWNpc2lvbiA9IEFDQ1VSQVRFOworCVRyYW5zY2VuZGVudGFsUHJlY2lzaW9uIGV4cFByZWNpc2lvbiA9IEFDQ1VSQVRFOworCVRyYW5zY2VuZGVudGFsUHJlY2lzaW9uIHJjcFByZWNpc2lvbiA9IEFDQ1VSQVRFOworCVRyYW5zY2VuZGVudGFsUHJlY2lzaW9uIHJzcVByZWNpc2lvbiA9IEFDQ1VSQVRFOworCWJvb2wgcGVyc3BlY3RpdmVDb3JyZWN0aW9uID0gdHJ1ZTsKKworCUNvbG9yNGk6OkNvbG9yNGkoKSA6IHgociksIHkoZyksIHooYiksIHcoYSkKKwl7CisJfQorCisJQ29sb3I0aTo6Q29sb3I0aSh1bnNpZ25lZCBzaG9ydCByZWQsIHVuc2lnbmVkIHNob3J0IGdyZWVuLCB1bnNpZ25lZCBzaG9ydCBibHVlLCB1bnNpZ25lZCBzaG9ydCBhbHBoYSkgOiB4KHIpLCB5KGcpLCB6KGIpLCB3KGEpCisJeworCQlyID0gU2hvcnQ0KHJlZCk7CisJCWcgPSBTaG9ydDQoZ3JlZW4pOworCQliID0gU2hvcnQ0KGJsdWUpOworCQlhID0gU2hvcnQ0KGFscGhhKTsKKwl9CisKKwlDb2xvcjRpOjpDb2xvcjRpKGNvbnN0IENvbG9yNGkgJnJocykgOiB4KHIpLCB5KGcpLCB6KGIpLCB3KGEpCisJeworCQlyID0gcmhzLnI7CisJCWcgPSByaHMuZzsKKwkJYiA9IHJocy5iOworCQlhID0gcmhzLmE7CisJfQorCisJQ29sb3I0aSAmQ29sb3I0aTo6b3BlcmF0b3I9KGNvbnN0IENvbG9yNGkgJnJocykKKwl7CisJCXIgPSByaHMucjsKKwkJZyA9IHJocy5nOworCQliID0gcmhzLmI7CisJCWEgPSByaHMuYTsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJU2hvcnQ0ICZDb2xvcjRpOjpvcGVyYXRvcltdKGludCBpKQorCXsKKwkJc3dpdGNoKGkpCisJCXsKKwkJY2FzZSAwOiByZXR1cm4geDsKKwkJY2FzZSAxOiByZXR1cm4geTsKKwkJY2FzZSAyOiByZXR1cm4gejsKKwkJY2FzZSAzOiByZXR1cm4gdzsKKwkJfQorCisJCXJldHVybiB4OworCX0KKworCUNvbG9yNGY6OkNvbG9yNGYoKSA6IHgociksIHkoZyksIHooYiksIHcoYSksIHUociksIHYoZyksIHMoYiksIHQoYSkKKwl7CisJfQorCisJQ29sb3I0Zjo6Q29sb3I0ZihmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSkgOiB4KHIpLCB5KGcpLCB6KGIpLCB3KGEpLCB1KHIpLCB2KGcpLCBzKGIpLCB0KGEpCisJeworCQlyID0gRmxvYXQ0KHJlZCk7CisJCWcgPSBGbG9hdDQoZ3JlZW4pOworCQliID0gRmxvYXQ0KGJsdWUpOworCQlhID0gRmxvYXQ0KGFscGhhKTsKKwl9CisKKwlDb2xvcjRmOjpDb2xvcjRmKGNvbnN0IENvbG9yNGYgJnJocykgOiB4KHIpLCB5KGcpLCB6KGIpLCB3KGEpLCB1KHIpLCB2KGcpLCBzKGIpLCB0KGEpCisJeworCQlyID0gcmhzLnI7CisJCWcgPSByaHMuZzsKKwkJYiA9IHJocy5iOworCQlhID0gcmhzLmE7CisJfQorCisJQ29sb3I0ZiAmQ29sb3I0Zjo6b3BlcmF0b3I9KGNvbnN0IENvbG9yNGYgJnJocykKKwl7CisJCXIgPSByaHMucjsKKwkJZyA9IHJocy5nOworCQliID0gcmhzLmI7CisJCWEgPSByaHMuYTsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJRmxvYXQ0ICZDb2xvcjRmOjpvcGVyYXRvcltdKGludCBpKQorCXsKKwkJc3dpdGNoKGkpCisJCXsKKwkJY2FzZSAwOiByZXR1cm4geDsKKwkJY2FzZSAxOiByZXR1cm4geTsKKwkJY2FzZSAyOiByZXR1cm4gejsKKwkJY2FzZSAzOiByZXR1cm4gdzsKKwkJfQorCisJCXJldHVybiB4OworCX0KKworCUZsb2F0NCBleHBvbmVudGlhbChGbG9hdDQgJnNyYywgYm9vbCBwcCkKKwl7CisJCUZsb2F0NCB4MDsKKwkJRmxvYXQ0IHgxOworCQlJbnQ0IHgyOworCQorCQl4MCA9IHNyYzsKKworCQl4MCA9IE1pbih4MCwgQXM8RmxvYXQ0PihJbnQ0KDB4NDMwMTAwMDAsIDB4NDMwMTAwMDAsIDB4NDMwMTAwMDAsIDB4NDMwMTAwMDApKSk7ICAgLy8gMTI5LjAwMDAwZSswZgorCQl4MCA9IE1heCh4MCwgQXM8RmxvYXQ0PihJbnQ0KDB4QzJGREZGRkYsIDB4QzJGREZGRkYsIDB4QzJGREZGRkYsIDB4QzJGREZGRkYpKSk7ICAgLy8gLTEyNi45OTk5OWUrMGYKKwkJeDEgPSB4MDsKKwkJeDEgLT0gRmxvYXQ0KDAuNWYsIDAuNWYsIDAuNWYsIDAuNWYpOworCQl4MiA9IFJvdW5kSW50KHgxKTsKKwkJeDEgPSBGbG9hdDQoeDIpOworCQl4MiArPSBJbnQ0KDB4MDAwMDAwN0YsIDB4MDAwMDAwN0YsIDB4MDAwMDAwN0YsIDB4MDAwMDAwN0YpOyAgIC8vIDEyNworCQl4MiA9IHgyIDw8IDIzOworCQl4MCAtPSB4MTsKKwkJeDEgPSBBczxGbG9hdDQ+KEludDQoMHgzQUY2MTkwNSwgMHgzQUY2MTkwNSwgMHgzQUY2MTkwNSwgMHgzQUY2MTkwNSkpOyAgIC8vIDEuODc3NTc2N2UtM2YKKwkJeDEgKj0geDA7CisJCXgxICs9IEFzPEZsb2F0ND4oSW50NCgweDNDMTM0ODA2LCAweDNDMTM0ODA2LCAweDNDMTM0ODA2LCAweDNDMTM0ODA2KSk7ICAgLy8gOC45ODkzMzk3ZS0zZgorCQl4MSAqPSB4MDsKKwkJeDEgKz0gQXM8RmxvYXQ0PihJbnQ0KDB4M0Q2NEFBMjMsIDB4M0Q2NEFBMjMsIDB4M0Q2NEFBMjMsIDB4M0Q2NEFBMjMpKTsgICAvLyA1LjU4MjYzMThlLTJmCisJCXgxICo9IHgwOworCQl4MSArPSBBczxGbG9hdDQ+KEludDQoMHgzRTc1RUFENCwgMHgzRTc1RUFENCwgMHgzRTc1RUFENCwgMHgzRTc1RUFENCkpOyAgIC8vIDIuNDAxNTM2MWUtMWYKKwkJeDEgKj0geDA7CisJCXgxICs9IEFzPEZsb2F0ND4oSW50NCgweDNGMzE3MjdCLCAweDNGMzE3MjdCLCAweDNGMzE3MjdCLCAweDNGMzE3MjdCKSk7ICAgLy8gNi45MzE1MzA4ZS0xZgorCQl4MSAqPSB4MDsKKwkJeDEgKz0gQXM8RmxvYXQ0PihJbnQ0KDB4M0Y3RkZGRkYsIDB4M0Y3RkZGRkYsIDB4M0Y3RkZGRkYsIDB4M0Y3RkZGRkYpKTsgICAvLyA5Ljk5OTk5OTRlLTFmCisJCXgxICo9IEFzPEZsb2F0ND4oeDIpOworCQkJCisJCXJldHVybiB4MTsKKwl9CisKKwlGbG9hdDQgbG9nYXJpdGhtKEZsb2F0NCAmc3JjLCBib29sIGFic29sdXRlLCBib29sIHBwKQorCXsKKwkJRmxvYXQ0IHgwOworCQlGbG9hdDQgeDE7CisJCUZsb2F0NCB4MjsKKwkJRmxvYXQ0IHgzOworCQkKKwkJeDAgPSBzcmM7CisJCQorCQl4MSA9IEFzPEZsb2F0ND4oQXM8SW50ND4oeDApICYgSW50NCgweDdGODAwMDAwKSk7CisJCXgxID0gQXM8RmxvYXQ0PihBczxVSW50ND4oeDEpID4+IDgpOworCQl4MSA9IEFzPEZsb2F0ND4oQXM8SW50ND4oeDEpIHwgQXM8SW50ND4oRmxvYXQ0KDEuMGYpKSk7CisJCXgxID0gKHgxIC0gRmxvYXQ0KDEuNDk2MDkzOGYpKSAqIEZsb2F0NCgyNTYuMGYpOyAgIC8vIEZJWE1FOiAoeDEgLSAxLjQ5NjA5MzhmKSAqIDI1Ni4wZjsKKwkJeDAgPSBBczxGbG9hdDQ+KChBczxJbnQ0Pih4MCkgJiBJbnQ0KDB4MDA3RkZGRkYpKSB8IEFzPEludDQ+KEZsb2F0NCgxLjBmKSkpOworCisJCXgyID0gKEZsb2F0NCg5LjU0MjgxNzllLTJmKSAqIHgwICsgRmxvYXQ0KDQuNzc3OTA5NWUtMWYpKSAqIHgwICsgRmxvYXQ0KDEuOTc4MjgxM2UtMWYpOworCQl4MyA9ICgoRmxvYXQ0KDEuNjYxODQ2NmUtMmYpICogeDAgKyBGbG9hdDQoMi4wMzUwNTA4ZS0xZikpICogeDAgKyBGbG9hdDQoMi43MzgyOTAwZS0xZikpICogeDAgKyBGbG9hdDQoNC4wNDk2Njg3ZS0yZik7CisJCXgyIC89IHgzOworCisJCXgxICs9ICh4MCAtIEZsb2F0NCgxLjBmKSkgKiB4MjsKKwkJCQkKKwkJcmV0dXJuIHgxOworCX0KKworCUZsb2F0NCBwb3dlcihGbG9hdDQgJnNyYzAsIEZsb2F0NCAmc3JjMSwgYm9vbCBwcCkKKwl7CisJCUZsb2F0NCBsb2cgPSBsb2dhcml0aG0oc3JjMCwgdHJ1ZSwgcHApOworCQlsb2cgKj0gc3JjMTsKKwkJcmV0dXJuIGV4cG9uZW50aWFsKGxvZywgcHApOworCX0KKworCUZsb2F0NCByZWNpcHJvY2FsKEZsb2F0NCAmc3JjLCBib29sIHBwLCBib29sIGZpbml0ZSkKKwl7CisJCUZsb2F0NCBkc3Q7CisKKwkJaWYoIXBwICYmIHJjcFByZWNpc2lvbiA+PSBXSFFMKQorCQl7CisJCQlkc3QgPSBGbG9hdDQoMSwgMSwgMSwgMSkgLyBzcmM7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkc3QgPSBSY3BfcHAoc3JjKTsKKworCQkJaWYoIXBwKQorCQkJeworCQkJCWRzdCA9IChkc3QgKyBkc3QpIC0gKHNyYyAqIGRzdCAqIGRzdCk7CisJCQl9CisJCX0KKworCQlpZihmaW5pdGUpCisJCXsKKwkJCWludCB4ID0gMHg3RjdGRkZGRjsKKwkJCWRzdCA9IE1pbihkc3QsIEZsb2F0NCgoZmxvYXQmKXgsIChmbG9hdCYpeCwgKGZsb2F0Jil4LCAoZmxvYXQmKXgpKTsKKwkJfQorCisJCXJldHVybiBkc3Q7CisJfQorCisJRmxvYXQ0IHJlY2lwcm9jYWxTcXVhcmVSb290KEZsb2F0NCAmc3JjLCBib29sIGFic29sdXRlLCBib29sIHBwKQorCXsKKwkJRmxvYXQ0IGFicyA9IHNyYzsKKworCQlpZihhYnNvbHV0ZSkKKwkJeworCQkJYWJzID0gQWJzKGFicyk7CisJCX0KKworCQlGbG9hdDQgcnNxOworCisJCWlmKCFwcCAmJiByc3FQcmVjaXNpb24gPj0gSUVFRSkKKwkJeworCQkJcnNxID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpIC8gU3FydChhYnMpOworCQl9CisJCWVsc2UKKwkJeworCQkJcnNxID0gUmNwU3FydF9wcChhYnMpOworCisJCQlpZighcHApCisJCQl7CisJCQkJcnNxID0gcnNxICogKEZsb2F0NCgzLjBmKSAtIHJzcSAqIHJzcSAqIGFicykgKiBGbG9hdDQoMC41Zik7CisJCQl9CisJCX0KKworCQlpbnQgeCA9IDB4N0Y3RkZGRkY7CisJCXJzcSA9IE1pbihyc3EsIEZsb2F0NCgoZmxvYXQmKXgsIChmbG9hdCYpeCwgKGZsb2F0Jil4LCAoZmxvYXQmKXgpKTsKKworCQlyZXR1cm4gcnNxOworCX0KKworCUZsb2F0NCBzaW5lKEZsb2F0NCAmc3JjLCBib29sIHBwKQorCXsKKwkJY29uc3QgRmxvYXQ0IEEgPSBGbG9hdDQoLTQuMDUyODQ3MzRlLTFmKTsgICAvLyAtNC9waV4yCisJCWNvbnN0IEZsb2F0NCBCID0gRmxvYXQ0KDEuMjczMjM5NTRlKzBmKTsgICAgLy8gNC9waQorCQljb25zdCBGbG9hdDQgQyA9IEZsb2F0NCg3Ljc1MTYwOTUwZS0xZik7CisJCWNvbnN0IEZsb2F0NCBEID0gRmxvYXQ0KDIuMjQ4MzkwNDllLTFmKTsKKworCQkvLyBQYXJhYm9sYSBhcHByb3hpbWF0aW5nIHNpbmUKKwkJRmxvYXQ0IHNpbiA9IHNyYyAqIChBYnMoc3JjKSAqIEEgKyBCKTsKKworCQkvLyBJbXByb3ZlIHByZWNpc2lvbiBmcm9tIDAuMDYgdG8gMC4wMDEKKwkJaWYodHJ1ZSkKKwkJeworCQkJc2luID0gc2luICogKEFicyhzaW4pICogRCArIEMpOworCQl9CisKKwkJcmV0dXJuIHNpbjsKKwl9CisKKwlGbG9hdDQgZG90MyhDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxKQorCXsKKwkJcmV0dXJuIHNyYzAueCAqIHNyYzEueCArIHNyYzAueSAqIHNyYzEueSArIHNyYzAueiAqIHNyYzEuejsKKwl9CisKKwlGbG9hdDQgZG90NChDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxKQorCXsKKwkJcmV0dXJuIHNyYzAueCAqIHNyYzEueCArIHNyYzAueSAqIHNyYzEueSArIHNyYzAueiAqIHNyYzEueiArIHNyYzAudyAqIHNyYzEudzsKKwl9CisKKwl2b2lkIHRyYW5zcG9zZTR4NChTaG9ydDQgJnJvdzAsIFNob3J0NCAmcm93MSwgU2hvcnQ0ICZyb3cyLCBTaG9ydDQgJnJvdzMpCisJeworCQlJbnQyIHRtcDAgPSBVbnBhY2tIaWdoKHJvdzAsIHJvdzEpOworCQlJbnQyIHRtcDEgPSBVbnBhY2tIaWdoKHJvdzIsIHJvdzMpOworCQlJbnQyIHRtcDIgPSBVbnBhY2tMb3cocm93MCwgcm93MSk7CisJCUludDIgdG1wMyA9IFVucGFja0xvdyhyb3cyLCByb3czKTsKKworCQlyb3cwID0gQXM8U2hvcnQ0PihVbnBhY2tMb3codG1wMiwgdG1wMykpOworCQlyb3cxID0gQXM8U2hvcnQ0PihVbnBhY2tIaWdoKHRtcDIsIHRtcDMpKTsKKwkJcm93MiA9IEFzPFNob3J0ND4oVW5wYWNrTG93KHRtcDAsIHRtcDEpKTsKKwkJcm93MyA9IEFzPFNob3J0ND4oVW5wYWNrSGlnaCh0bXAwLCB0bXAxKSk7CisJfQorCisJdm9pZCB0cmFuc3Bvc2U0eDQoRmxvYXQ0ICZyb3cwLCBGbG9hdDQgJnJvdzEsIEZsb2F0NCAmcm93MiwgRmxvYXQ0ICZyb3czKQorCXsKKwkJRmxvYXQ0IHRtcDAgPSBVbnBhY2tMb3cocm93MCwgcm93MSk7CisJCUZsb2F0NCB0bXAxID0gVW5wYWNrTG93KHJvdzIsIHJvdzMpOworCQlGbG9hdDQgdG1wMiA9IFVucGFja0hpZ2gocm93MCwgcm93MSk7CisJCUZsb2F0NCB0bXAzID0gVW5wYWNrSGlnaChyb3cyLCByb3czKTsKKworCQlyb3cwID0gRmxvYXQ0KHRtcDAueHksIHRtcDEueHkpOworCQlyb3cxID0gRmxvYXQ0KHRtcDAuencsIHRtcDEuencpOworCQlyb3cyID0gRmxvYXQ0KHRtcDIueHksIHRtcDMueHkpOworCQlyb3czID0gRmxvYXQ0KHRtcDIuencsIHRtcDMuencpOworCX0KKworCXZvaWQgdHJhbnNwb3NlNHgzKEZsb2F0NCAmcm93MCwgRmxvYXQ0ICZyb3cxLCBGbG9hdDQgJnJvdzIsIEZsb2F0NCAmcm93MykKKwl7CisJCUZsb2F0NCB0bXAwID0gVW5wYWNrTG93KHJvdzAsIHJvdzEpOworCQlGbG9hdDQgdG1wMSA9IFVucGFja0xvdyhyb3cyLCByb3czKTsKKwkJRmxvYXQ0IHRtcDIgPSBVbnBhY2tIaWdoKHJvdzAsIHJvdzEpOworCQlGbG9hdDQgdG1wMyA9IFVucGFja0hpZ2gocm93Miwgcm93Myk7CisKKwkJcm93MCA9IEZsb2F0NCh0bXAwLnh5LCB0bXAxLnh5KTsKKwkJcm93MSA9IEZsb2F0NCh0bXAwLnp3LCB0bXAxLnp3KTsKKwkJcm93MiA9IEZsb2F0NCh0bXAyLnh5LCB0bXAzLnh5KTsKKwl9CisKKwl2b2lkIHRyYW5zcG9zZTR4MihGbG9hdDQgJnJvdzAsIEZsb2F0NCAmcm93MSwgRmxvYXQ0ICZyb3cyLCBGbG9hdDQgJnJvdzMpCisJeworCQlGbG9hdDQgdG1wMCA9IFVucGFja0xvdyhyb3cwLCByb3cxKTsKKwkJRmxvYXQ0IHRtcDEgPSBVbnBhY2tMb3cocm93Miwgcm93Myk7CisKKwkJcm93MCA9IEZsb2F0NCh0bXAwLnh5LCB0bXAxLnh5KTsKKwkJcm93MSA9IEZsb2F0NCh0bXAwLnp3LCB0bXAxLnp3KTsKKwl9CisKKwl2b2lkIHRyYW5zcG9zZTR4MShGbG9hdDQgJnJvdzAsIEZsb2F0NCAmcm93MSwgRmxvYXQ0ICZyb3cyLCBGbG9hdDQgJnJvdzMpCisJeworCQlGbG9hdDQgdG1wMCA9IFVucGFja0xvdyhyb3cwLCByb3cxKTsKKwkJRmxvYXQ0IHRtcDEgPSBVbnBhY2tMb3cocm93Miwgcm93Myk7CisKKwkJcm93MCA9IEZsb2F0NCh0bXAwLnh5LCB0bXAxLnh5KTsKKwl9CisKKwl2b2lkIHRyYW5zcG9zZTJ4NChGbG9hdDQgJnJvdzAsIEZsb2F0NCAmcm93MSwgRmxvYXQ0ICZyb3cyLCBGbG9hdDQgJnJvdzMpCisJeworCQlyb3cwID0gVW5wYWNrTG93KHJvdzAsIHJvdzEpOworCQlyb3cxID0gRmxvYXQ0KHJvdzAuencsIHJvdzEuencpOworCQlyb3cyID0gVW5wYWNrSGlnaChyb3cwLCByb3cxKTsKKwkJcm93MyA9IEZsb2F0NChyb3cyLnp3LCByb3czLnp3KTsKKwl9CisKKwl2b2lkIHRyYW5zcG9zZTJ4NGgoRmxvYXQ0ICZyb3cwLCBGbG9hdDQgJnJvdzEsIEZsb2F0NCAmcm93MiwgRmxvYXQ0ICZyb3czKQorCXsKKwkJcm93MCA9IFVucGFja0xvdyhyb3cyLCByb3czKTsKKwkJcm93MSA9IEZsb2F0NChyb3cwLnp3LCByb3cxLnp3KTsKKwkJcm93MiA9IFVucGFja0hpZ2gocm93Miwgcm93Myk7CisJCXJvdzMgPSBGbG9hdDQocm93Mi56dywgcm93My56dyk7CisJfQorCisJdm9pZCB0cmFuc3Bvc2U0eE4oRmxvYXQ0ICZyb3cwLCBGbG9hdDQgJnJvdzEsIEZsb2F0NCAmcm93MiwgRmxvYXQ0ICZyb3czLCBpbnQgTikKKwl7CisJCXN3aXRjaChOKQorCQl7CisJCWNhc2UgMTogdHJhbnNwb3NlNHgxKHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMpOyBicmVhazsKKwkJY2FzZSAyOiB0cmFuc3Bvc2U0eDIocm93MCwgcm93MSwgcm93Miwgcm93Myk7IGJyZWFrOworCQljYXNlIDM6IHRyYW5zcG9zZTR4Myhyb3cwLCByb3cxLCByb3cyLCByb3czKTsgYnJlYWs7CisJCWNhc2UgNDogdHJhbnNwb3NlNHg0KHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMpOyBicmVhazsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9SZWFjdG9yL1NoZWxsLmhwcCBiL3NyYy9SZWFjdG9yL1NoZWxsLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmQyYjFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlYWN0b3IvU2hlbGwuaHBwCkBAIC0wLDAgKzEsMTMzIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZiBzd19TaGVsbF9ocHANCisjZGVmaW5lIHN3X1NoZWxsX2hwcA0KKw0KKyNpbmNsdWRlICJOdWNsZXVzLmhwcCINCisNCituYW1lc3BhY2Ugc3cNCit7DQorCWVudW0gVHJhbnNjZW5kZW50YWxQcmVjaXNpb24NCisJew0KKwkJQVBQUk9YSU1BVEUsDQorCQlQQVJUSUFMLAkvLyAyXi0xMA0KKwkJQUNDVVJBVEUsDQorCQlXSFFMLAkJLy8gMl4tMjENCisJCUlFRUUJCS8vIDJeLTIzDQorCX07DQorDQorCWNsYXNzIENvbG9yNGkNCisJew0KKwlwdWJsaWM6DQorCQlDb2xvcjRpKCk7DQorCQlDb2xvcjRpKHVuc2lnbmVkIHNob3J0IHJlZCwgdW5zaWduZWQgc2hvcnQgZ3JlZW4sIHVuc2lnbmVkIHNob3J0IGJsdWUsIHVuc2lnbmVkIHNob3J0IGFscGhhKTsNCisJCUNvbG9yNGkoY29uc3QgQ29sb3I0aSAmcmhzKTsNCisNCisJCVNob3J0NCAmb3BlcmF0b3JbXShpbnQgaSk7DQorCQlDb2xvcjRpICZvcGVyYXRvcj0oY29uc3QgQ29sb3I0aSAmcmhzKTsNCisNCisJCVNob3J0NCByOw0KKwkJU2hvcnQ0IGc7DQorCQlTaG9ydDQgYjsNCisJCVNob3J0NCBhOw0KKw0KKwkJU2hvcnQ0ICZ4Ow0KKwkJU2hvcnQ0ICZ5Ow0KKwkJU2hvcnQ0ICZ6Ow0KKwkJU2hvcnQ0ICZ3Ow0KKwl9Ow0KKw0KKwljbGFzcyBDb2xvcjRmDQorCXsNCisJcHVibGljOg0KKwkJQ29sb3I0ZigpOw0KKwkJQ29sb3I0ZihmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7DQorCQlDb2xvcjRmKGNvbnN0IENvbG9yNGYgJnJocyk7DQorDQorCQlGbG9hdDQgJm9wZXJhdG9yW10oaW50IGkpOw0KKwkJQ29sb3I0ZiAmb3BlcmF0b3I9KGNvbnN0IENvbG9yNGYgJnJocyk7DQorDQorCQlGbG9hdDQgcjsNCisJCUZsb2F0NCBnOw0KKwkJRmxvYXQ0IGI7DQorCQlGbG9hdDQgYTsNCisNCisJCUZsb2F0NCAmeDsNCisJCUZsb2F0NCAmeTsNCisJCUZsb2F0NCAmejsNCisJCUZsb2F0NCAmdzsNCisNCisJCUZsb2F0NCAmdTsNCisJCUZsb2F0NCAmdjsNCisJCUZsb2F0NCAmczsNCisJCUZsb2F0NCAmdDsNCisJfTsNCisNCisJRmxvYXQ0IGV4cG9uZW50aWFsKEZsb2F0NCAmc3JjLCBib29sIHBwID0gZmFsc2UpOw0KKwlGbG9hdDQgbG9nYXJpdGhtKEZsb2F0NCAmc3JjLCBib29sIGFicywgYm9vbCBwcCA9IGZhbHNlKTsNCisJRmxvYXQ0IHBvd2VyKEZsb2F0NCAmc3JjMCwgRmxvYXQ0ICZzcmMxLCBib29sIHBwID0gZmFsc2UpOw0KKwlGbG9hdDQgcmVjaXByb2NhbChGbG9hdDQgJnNyYywgYm9vbCBwcCA9IGZhbHNlLCBib29sIGZpbml0ZSA9IGZhbHNlKTsNCisJRmxvYXQ0IHJlY2lwcm9jYWxTcXVhcmVSb290KEZsb2F0NCAmc3JjLCBib29sIGFicywgYm9vbCBwcCA9IGZhbHNlKTsNCisJRmxvYXQ0IHNpbmUoRmxvYXQ0ICZzcmMsIGJvb2wgcHAgPSBmYWxzZSk7DQorDQorCUZsb2F0NCBkb3QzKENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEpOw0KKwlGbG9hdDQgZG90NChDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxKTsNCisNCisJdm9pZCB0cmFuc3Bvc2U0eDQoU2hvcnQ0ICZyb3cwLCBTaG9ydDQgJnJvdzEsIFNob3J0NCAmcm93MiwgU2hvcnQ0ICZyb3czKTsNCisJdm9pZCB0cmFuc3Bvc2U0eDQoRmxvYXQ0ICZyb3cwLCBGbG9hdDQgJnJvdzEsIEZsb2F0NCAmcm93MiwgRmxvYXQ0ICZyb3czKTsNCisJdm9pZCB0cmFuc3Bvc2U0eDMoRmxvYXQ0ICZyb3cwLCBGbG9hdDQgJnJvdzEsIEZsb2F0NCAmcm93MiwgRmxvYXQ0ICZyb3czKTsNCisJdm9pZCB0cmFuc3Bvc2U0eDIoRmxvYXQ0ICZyb3cwLCBGbG9hdDQgJnJvdzEsIEZsb2F0NCAmcm93MiwgRmxvYXQ0ICZyb3czKTsNCisJdm9pZCB0cmFuc3Bvc2U0eDEoRmxvYXQ0ICZyb3cwLCBGbG9hdDQgJnJvdzEsIEZsb2F0NCAmcm93MiwgRmxvYXQ0ICZyb3czKTsNCisJdm9pZCB0cmFuc3Bvc2UyeDQoRmxvYXQ0ICZyb3cwLCBGbG9hdDQgJnJvdzEsIEZsb2F0NCAmcm93MiwgRmxvYXQ0ICZyb3czKTsNCisJdm9pZCB0cmFuc3Bvc2UyeDRoKEZsb2F0NCAmcm93MCwgRmxvYXQ0ICZyb3cxLCBGbG9hdDQgJnJvdzIsIEZsb2F0NCAmcm93Myk7DQorCXZvaWQgdHJhbnNwb3NlNHhOKEZsb2F0NCAmcm93MCwgRmxvYXQ0ICZyb3cxLCBGbG9hdDQgJnJvdzIsIEZsb2F0NCAmcm93MywgaW50IE4pOw0KKw0KKwkjZGVmaW5lIEZvcihpbml0LCBjb25kLCBpbmMpICAgICAgICAgICAgICAgICAgICAgXA0KKwlpbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKwlmb3IobGx2bTo6QmFzaWNCbG9jayAqbG9vcEJCX18gPSBiZWdpbkxvb3AoKSwgICAgXA0KKwkJKmJvZHlCQl9fID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpLCAgICAgICAgXA0KKwkJKmVuZEJCX18gPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCksICAgICAgICAgXA0KKwkJKm9uY2VCQl9fID0gZW5kQkJfXzsgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKwkJb25jZUJCX18gJiYgYnJhbmNoKGNvbmQsIGJvZHlCQl9fLCBlbmRCQl9fKTsgXA0KKwkJaW5jLCBvbmNlQkJfXyA9IDAsIE51Y2xldXM6OmNyZWF0ZUJyKGxvb3BCQl9fKSwgTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2soZW5kQkJfXykpDQorDQorCSNkZWZpbmUgV2hpbGUoY29uZCkgRm9yKCgodm9pZCopMCksIGNvbmQsICgodm9pZCopMCkpDQorDQorCSNkZWZpbmUgRG8gXA0KKwl7IFwNCisJCWxsdm06OkJhc2ljQmxvY2sgKmJvZHkgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7IFwNCisJCU51Y2xldXM6OmNyZWF0ZUJyKGJvZHkpOyBcDQorCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhib2R5KTsNCisNCisJI2RlZmluZSBVbnRpbChjb25kKSBcDQorCQlsbHZtOjpCYXNpY0Jsb2NrICplbmQgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7IFwNCisJCU51Y2xldXM6OmNyZWF0ZUNvbmRCcigoY29uZCkudmFsdWUsIGVuZCwgYm9keSk7IFwNCisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGVuZCk7IFwNCisJfQ0KKw0KKwkjZGVmaW5lIElmKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorCWZvcihsbHZtOjpCYXNpY0Jsb2NrICp0cnVlQkJfXyA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKSwgXA0KKwkJKmZhbHNlQkJfXyA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKSwgICAgICAgICAgICAgICAgIFwNCisJCSplbmRCQl9fID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpLCAgICAgICAgICAgICAgICAgICBcDQorCQkqb25jZUJCX18gPSBlbmRCQl9fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKwkJb25jZUJCX18gJiYgYnJhbmNoKGNvbmQsIHRydWVCQl9fLCBmYWxzZUJCX18pOyAgICAgICAgIFwNCisJCW9uY2VCQl9fID0gMCwgTnVjbGV1czo6Y3JlYXRlQnIoZW5kQkJfXyksIE51Y2xldXM6OnNldEluc2VydEJsb2NrKGZhbHNlQkJfXyksIE51Y2xldXM6OmNyZWF0ZUJyKGVuZEJCX18pLCBOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhlbmRCQl9fKSkNCisNCisJI2RlZmluZSBFbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorCWZvcihsbHZtOjpCYXNpY0Jsb2NrICplbmRCQl9fID0gTnVjbGV1czo6Z2V0SW5zZXJ0QmxvY2soKSwgXA0KKwkJKmZhbHNlQkJfXyA9IE51Y2xldXM6OmdldFByZWRlY2Vzc29yKGVuZEJCX18pLCAgICAgICAgIFwNCisJCSpvbmNlQkJfXyA9IGVuZEJCX187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorCQlvbmNlQkJfXyAmJiBlbHNlQmxvY2soZmFsc2VCQl9fKTsgICAgICAgICAgICAgICAgICAgXA0KKwkJb25jZUJCX18gPSAwLCBOdWNsZXVzOjpjcmVhdGVCcihlbmRCQl9fKSwgTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2soZW5kQkJfXykpDQorfQ0KKw0KKyNlbmRpZiAgIC8vIHN3X1NoZWxsX2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9SZWFjdG9yL3g4Ni5ocHAgYi9zcmMvUmVhY3Rvci94ODYuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGQ1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVhY3Rvci94ODYuaHBwCkBAIC0wLDAgKzEsMTMxIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2luY2x1ZGUgIk51Y2xldXMuaHBwIg0KKw0KK25hbWVzcGFjZSBzdw0KK3sNCisJbmFtZXNwYWNlIHg4Ng0KKwl7DQorCQlSVmFsdWU8SW50PiBjdnRzczJzaShjb25zdCBSVmFsdWU8RmxvYXQ+ICZ2YWwpOw0KKwkJUlZhbHVlPEludDI+IGN2dHBzMnBpKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwpOw0KKwkJUlZhbHVlPEludDI+IGN2dHRwczJwaShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmdmFsKTsNCisJCVJWYWx1ZTxJbnQ0PiBjdnRwczJkcShjb25zdCBSVmFsdWU8RmxvYXQ0PiAmdmFsKTsNCisJCVJWYWx1ZTxJbnQ0PiBjdnR0cHMyZHEoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCk7DQorCQkNCisJCVJWYWx1ZTxGbG9hdDQ+IGN2dHBpMnBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8SW50Mj4gJnkpOw0KKwkJUlZhbHVlPEZsb2F0ND4gY3Z0ZHEycHMoY29uc3QgUlZhbHVlPEludDQ+ICZ2YWwpOw0KKw0KKwkJUlZhbHVlPEZsb2F0PiByY3Bzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ2YWwpOw0KKwkJUlZhbHVlPEZsb2F0PiBzcXJ0c3MoY29uc3QgUlZhbHVlPEZsb2F0PiAmdmFsKTsNCisJCVJWYWx1ZTxGbG9hdD4gcnNxcnRzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ2YWwpOw0KKw0KKwkJUlZhbHVlPEZsb2F0ND4gcmNwcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCk7DQorCQlSVmFsdWU8RmxvYXQ0PiBzcXJ0cHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCk7DQorCQlSVmFsdWU8RmxvYXQ0PiByc3FydHBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwpOw0KKwkJUlZhbHVlPEZsb2F0ND4gbWF4cHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdDQ+IG1pbnBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSk7DQorDQorCQlSVmFsdWU8RmxvYXQ+IHJvdW5kc3MoY29uc3QgUlZhbHVlPEZsb2F0PiAmdmFsLCB1bnNpZ25lZCBjaGFyIGltbSk7DQorCQlSVmFsdWU8RmxvYXQ+IGZsb29yc3MoY29uc3QgUlZhbHVlPEZsb2F0PiAmdmFsKTsNCisJCVJWYWx1ZTxGbG9hdD4gY2VpbHNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnZhbCk7DQorDQorCQlSVmFsdWU8RmxvYXQ0PiByb3VuZHBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ2YWwsIHVuc2lnbmVkIGNoYXIgaW1tKTsNCisJCVJWYWx1ZTxGbG9hdDQ+IGZsb29ycHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCk7DQorCQlSVmFsdWU8RmxvYXQ0PiBjZWlscHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJnZhbCk7DQorDQorCQlSVmFsdWU8RmxvYXQ0PiBjbXBwcyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnksIHVuc2lnbmVkIGNoYXIgaW1tKTsNCisJCVJWYWx1ZTxGbG9hdDQ+IGNtcGVxcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdDQ+IGNtcGx0cHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdDQ+IGNtcGxlcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdDQ+IGNtcHVub3JkcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdDQ+IGNtcG5lcXBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSk7DQorCQlSVmFsdWU8RmxvYXQ0PiBjbXBubHRwcyhjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0ND4gJnkpOw0KKwkJUlZhbHVlPEZsb2F0ND4gY21wbmxlcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdDQ+IGNtcG9yZHBzKGNvbnN0IFJWYWx1ZTxGbG9hdDQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ0PiAmeSk7DQorDQorCQlSVmFsdWU8RmxvYXQ+IGNtcHNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnksIHVuc2lnbmVkIGNoYXIgaW1tKTsNCisJCVJWYWx1ZTxGbG9hdD4gY21wZXFzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdD4gY21wbHRzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdD4gY21wbGVzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdD4gY21wdW5vcmRzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdD4gY21wbmVxc3MoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0PiAmeSk7DQorCQlSVmFsdWU8RmxvYXQ+IGNtcG5sdHNzKGNvbnN0IFJWYWx1ZTxGbG9hdD4gJngsIGNvbnN0IFJWYWx1ZTxGbG9hdD4gJnkpOw0KKwkJUlZhbHVlPEZsb2F0PiBjbXBubGVzcyhjb25zdCBSVmFsdWU8RmxvYXQ+ICZ4LCBjb25zdCBSVmFsdWU8RmxvYXQ+ICZ5KTsNCisJCVJWYWx1ZTxGbG9hdD4gY21wb3Jkc3MoY29uc3QgUlZhbHVlPEZsb2F0PiAmeCwgY29uc3QgUlZhbHVlPEZsb2F0PiAmeSk7DQorDQorCQlSVmFsdWU8SW50ND4gcGFic2QoY29uc3QgUlZhbHVlPEludDQ+ICZ4LCBjb25zdCBSVmFsdWU8SW50ND4gJnkpOw0KKw0KKwkJUlZhbHVlPFNob3J0ND4gcGFkZHN3KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSk7DQorCQlSVmFsdWU8U2hvcnQ0PiBwc3Vic3coY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KTsNCisJCVJWYWx1ZTxVU2hvcnQ0PiBwYWRkdXN3KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ5KTsNCisJCVJWYWx1ZTxVU2hvcnQ0PiBwc3VidXN3KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ5KTsNCisJCVJWYWx1ZTxTQnl0ZTg+IHBhZGRzYihjb25zdCBSVmFsdWU8U0J5dGU4PiAmeCwgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnkpOw0KKwkJUlZhbHVlPFNCeXRlOD4gcHN1YnNiKGNvbnN0IFJWYWx1ZTxTQnl0ZTg+ICZ4LCBjb25zdCBSVmFsdWU8U0J5dGU4PiAmeSk7DQorCQlSVmFsdWU8Qnl0ZTg+IHBhZGR1c2IoY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCwgY29uc3QgUlZhbHVlPEJ5dGU4PiAmeSk7DQorCQlSVmFsdWU8Qnl0ZTg+IHBzdWJ1c2IoY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCwgY29uc3QgUlZhbHVlPEJ5dGU4PiAmeSk7DQorDQorCQlSVmFsdWU8VVNob3J0ND4gcGF2Z3coY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnkpOw0KKw0KKwkJUlZhbHVlPFNob3J0ND4gcG1heHN3KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSk7DQorCQlSVmFsdWU8U2hvcnQ0PiBwbWluc3coY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KTsNCisNCisJCVJWYWx1ZTxTaG9ydDQ+IHBjbXBndHcoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KTsNCisJCVJWYWx1ZTxTaG9ydDQ+IHBjbXBlcXcoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KTsNCisJCVJWYWx1ZTxCeXRlOD4gcGNtcGd0Yihjb25zdCBSVmFsdWU8U0J5dGU4PiAmeCwgY29uc3QgUlZhbHVlPFNCeXRlOD4gJnkpOw0KKwkJUlZhbHVlPEJ5dGU4PiBwY21wZXFiKGNvbnN0IFJWYWx1ZTxCeXRlOD4gJngsIGNvbnN0IFJWYWx1ZTxCeXRlOD4gJnkpOw0KKw0KKwkJUlZhbHVlPFNob3J0ND4gcGFja3NzZHcoY29uc3QgUlZhbHVlPEludDI+ICZ4LCBjb25zdCBSVmFsdWU8SW50Mj4gJnkpOw0KKwkJUlZhbHVlPFNob3J0OD4gcGFja3NzZHcoY29uc3QgUlZhbHVlPEludDQ+ICZ4LCBjb25zdCBSVmFsdWU8SW50ND4gJnkpOw0KKwkJUlZhbHVlPFNCeXRlOD4gcGFja3Nzd2IoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ5KTsNCisJCVJWYWx1ZTxCeXRlOD4gcGFja3Vzd2IoY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8VVNob3J0ND4gJnkpOw0KKw0KKwkJUlZhbHVlPFVTaG9ydDg+IHBhY2t1c2R3KGNvbnN0IFJWYWx1ZTxVSW50ND4gJngsIGNvbnN0IFJWYWx1ZTxVSW50ND4gJnkpOw0KKw0KKwkJUlZhbHVlPFVTaG9ydDQ+IHBzcmx3KGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeCwgdW5zaWduZWQgY2hhciB5KTsNCisJCVJWYWx1ZTxVU2hvcnQ4PiBwc3Jsdyhjb25zdCBSVmFsdWU8VVNob3J0OD4gJngsIHVuc2lnbmVkIGNoYXIgeSk7DQorCQlSVmFsdWU8U2hvcnQ0PiBwc3Jhdyhjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgdW5zaWduZWQgY2hhciB5KTsNCisJCVJWYWx1ZTxTaG9ydDg+IHBzcmF3KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpOw0KKwkJUlZhbHVlPFNob3J0ND4gcHNsbHcoY29uc3QgUlZhbHVlPFNob3J0ND4gJngsIHVuc2lnbmVkIGNoYXIgeSk7DQorCQlSVmFsdWU8U2hvcnQ4PiBwc2xsdyhjb25zdCBSVmFsdWU8U2hvcnQ4PiAmeCwgdW5zaWduZWQgY2hhciB5KTsNCisJCVJWYWx1ZTxJbnQyPiBwc2xsZChjb25zdCBSVmFsdWU8SW50Mj4gJngsIHVuc2lnbmVkIGNoYXIgeSk7DQorCQlSVmFsdWU8SW50ND4gcHNsbGQoY29uc3QgUlZhbHVlPEludDQ+ICZ4LCB1bnNpZ25lZCBjaGFyIHkpOw0KKwkJUlZhbHVlPEludDI+IHBzcmFkKGNvbnN0IFJWYWx1ZTxJbnQyPiAmeCwgdW5zaWduZWQgY2hhciB5KTsNCisJCVJWYWx1ZTxJbnQ0PiBwc3JhZChjb25zdCBSVmFsdWU8SW50ND4gJngsIHVuc2lnbmVkIGNoYXIgeSk7DQorCQlSVmFsdWU8VUludDI+IHBzcmxkKGNvbnN0IFJWYWx1ZTxVSW50Mj4gJngsIHVuc2lnbmVkIGNoYXIgeSk7DQorCQlSVmFsdWU8VUludDQ+IHBzcmxkKGNvbnN0IFJWYWx1ZTxVSW50ND4gJngsIHVuc2lnbmVkIGNoYXIgeSk7DQorDQorCQlSVmFsdWU8VVNob3J0ND4gcHNybHcoY29uc3QgUlZhbHVlPFVTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8TG9uZzE+ICZ5KTsNCisJCVJWYWx1ZTxTaG9ydDQ+IHBzcmF3KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8TG9uZzE+ICZ5KTsNCisJCVJWYWx1ZTxTaG9ydDQ+IHBzbGx3KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8TG9uZzE+ICZ5KTsNCisJCVJWYWx1ZTxJbnQyPiBwc2xsZChjb25zdCBSVmFsdWU8SW50Mj4gJngsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnkpOw0KKwkJUlZhbHVlPFVJbnQyPiBwc3JsZChjb25zdCBSVmFsdWU8VUludDI+ICZ4LCBjb25zdCBSVmFsdWU8TG9uZzE+ICZ5KTsNCisJCVJWYWx1ZTxJbnQyPiBwc3JhZChjb25zdCBSVmFsdWU8SW50Mj4gJngsIGNvbnN0IFJWYWx1ZTxMb25nMT4gJnkpOw0KKw0KKwkJUlZhbHVlPFNob3J0ND4gcG11bGh3KGNvbnN0IFJWYWx1ZTxTaG9ydDQ+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeSk7DQorCQlSVmFsdWU8VVNob3J0ND4gcG11bGh1dyhjb25zdCBSVmFsdWU8VVNob3J0ND4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ0PiAmeSk7DQorCQlSVmFsdWU8SW50Mj4gcG1hZGR3ZChjb25zdCBSVmFsdWU8U2hvcnQ0PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0ND4gJnkpOw0KKw0KKwkJUlZhbHVlPFNob3J0OD4gcG11bGh3KGNvbnN0IFJWYWx1ZTxTaG9ydDg+ICZ4LCBjb25zdCBSVmFsdWU8U2hvcnQ4PiAmeSk7DQorCQlSVmFsdWU8VVNob3J0OD4gcG11bGh1dyhjb25zdCBSVmFsdWU8VVNob3J0OD4gJngsIGNvbnN0IFJWYWx1ZTxVU2hvcnQ4PiAmeSk7DQorCQlSVmFsdWU8SW50ND4gcG1hZGR3ZChjb25zdCBSVmFsdWU8U2hvcnQ4PiAmeCwgY29uc3QgUlZhbHVlPFNob3J0OD4gJnkpOw0KKw0KKwkJUlZhbHVlPEludD4gbW92bXNrcHMoY29uc3QgUlZhbHVlPEZsb2F0ND4gJngpOw0KKwkJUlZhbHVlPEludD4gcG1vdm1za2IoY29uc3QgUlZhbHVlPEJ5dGU4PiAmeCk7DQorDQorCQlSVmFsdWU8SW50ND4gcG1vdnp4YmQoY29uc3QgUlZhbHVlPEludDQ+ICZ4KTsNCisJCVJWYWx1ZTxJbnQ0PiBwbW92c3hiZChjb25zdCBSVmFsdWU8SW50ND4gJngpOw0KKwkJUlZhbHVlPEludDQ+IHBtb3Z6eHdkKGNvbnN0IFJWYWx1ZTxJbnQ0PiAmeCk7DQorCQlSVmFsdWU8SW50ND4gcG1vdnN4d2QoY29uc3QgUlZhbHVlPEludDQ+ICZ4KTsNCisNCisJCXZvaWQgZW1tcygpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9SZWFkbWUudHh0IGIvc3JjL1JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjZDc0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZWFkbWUudHh0CkBAIC0wLDAgKzEsMjgzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zR2FtaW5nIEluYy4KKworICAgICAgICAgICAgICAgICAgICAgU3dpZnRTaGFkZXIgRFg5IFNvZnR3YXJlIEdQVSBUb29sa2l0CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIDM2ODkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2N0b2JlciA2LCAyMDExCisgIAorICAgICAgICAgICBTd2lmdFNoYWRlciBpcyBDb3B5cmlnaHQoYykgMjAwMy0yMDExIFRyYW5zR2FtaW5nIEluYy4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK1RoYW5rIHlvdSBmb3IgcHVyY2hhc2luZyBUcmFuc0dhbWluZydzIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIEdQVSBUb29sa2l0LCAKK1RyYW5zR2FtaW5nJ3MgaGlnaC1zcGVlZCBwdXJlLXNvZnR3YXJlIDNEIHJlbmRlcmVyLiBUaGlzIHJlbGVhc2UgaW5jbHVkZXMKK3N1cHBvcnQgZm9yIFNoYWRlciBNb2RlbCAzLjAgbGV2ZWwgZmVhdHVyZXMgd2l0aCBhIERpcmVjdFggZnJvbnQgZW5kIEFQSSwKK2FuZCBhIHByZS1yZWxlYXNlIG9mIGFuIE9wZW5HTCBFUyAyLjAgZnJvbnQgZW5kIEFQSSwgYmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gdGhlIEFOR0xFIHByb2plY3QuCisKK1RyYW5zR2FtaW5nJ3MgU3dpZnRTaGFkZXIgU29mdHdhcmUgR1BVIFRvb2xraXQgaXMgdGhlIHdvcmxkJ3MgZmFzdGVzdAorYW5kIG1vc3QgZmxleGlibGUgZ2VuZXJhbC1wdXJwb3NlIHB1cmUgc29mdHdhcmUgM0QgcmVuZGVyaW5nIHRlY2hub2xvZ3kuCitTd2lmdFNoYWRlcidzIG1vZHVsYXIgYXJjaGl0ZWN0dXJlIGlzIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBtdWx0aXBsZSAKK2FwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMsIHN1Y2ggYXMgRGlyZWN0WCh0bSkgOS4wLCBhbmQgT3BlbkdMKHRtKSAKK0VTIDIuMCwgdGhlIHNhbWUgQVBJcyB0aGF0IGRldmVsb3BlcnMgYXJlIGFscmVhZHkgdXNpbmcgZm9yIGV4aXN0aW5nIAorZ2FtZXMgYW5kIGFwcGxpY2F0aW9ucy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBkaXJlY3RseSBpbnRlZ3JhdGUKK1N3aWZ0U2hhZGVyIGludG8gYXBwbGljYXRpb25zIHdpdGhvdXQgYW55IGNoYW5nZXMgdG8gc291cmNlIGNvZGUuIAorU3dpZnRTaGFkZXIgdGVjaG5vbG9neSBjYW4gYWxzbyBzdXBwb3J0IGN1c3RvbSBmcm9udC1lbmQgQVBJcyB0aGF0IGhhdmUgCitiZWVuIGV4cGxpY2l0bHkgYnVpbHQgZm9yIGEgc3BlY2lmaWMgYXBwbGljYXRpb24uIAorCitSZW5kZXJpbmcgZmVhdHVyZXMgYXZhaWxhYmxlIGluIFN3aWZ0U2hhZGVyIHJhbmdlIGZyb20gYmFzaWMgZml4ZWQgCitmdW5jdGlvbiByZW5kZXJpbmcgdGhyb3VnaCB0byBTaGFkZXIgTW9kZWwgMy4wIGxldmVsIGNhcGFiaWxpdGllcyBzdWNoIAorYXMgYWR2YW5jZWQgc2hhZGVycywgZmxvYXRpbmcgcG9pbnQgcmVuZGVyaW5nLCBtdWx0aS1zYW1wbGUgYW50aS1hbGlhc2luZywgCithbmQgbXVjaCBtb3JlLiAKKworU3dpZnRTaGFkZXIgcGVyZm9ybXMgYXMgbXVjaCBhcyAxMDAgdGltZXMgZmFzdGVyIHRoYW4gdHJhZGl0aW9uYWwgCitzb2Z0d2FyZSByZW5kZXJlcnMgc3VjaCBhcyBNaWNyb3NvZnQncyBEaXJlY3QzRCh0bSkgUmVmZXJlbmNlIFJhc3Rlcml6ZXIuIAorSW4gYmVuY2htYXJrIHRlc3RzIG9uIGEgbW9kZXJuIENQVSwgU3dpZnRTaGFkZXItYmFzZWQgcmVuZGVyZXJzIGNhbiAKK2FjaGlldmUgcGVyZm9ybWFuY2UgdGhhdCBzdXJwYXNzZXMgaW50ZWdyYXRlZCBncmFwaGljcyBoYXJkd2FyZSCWIAorYSBtb2Rlcm4gcXVhZC1jb3JlIENvcmUgaTcgQ1BVIGF0IDMuMiBHSHogcnVubmluZyBTd2lmdFNoYWRlciBzY29yZXMgCis2MjAgaW4gM0RNYXJrMjAwNi4gU3dpZnRTaGFkZXIgYWNoaWV2ZXMgdGhpcyB1bnByZWNlZGVudGVkIGxldmVsIG9mIAorcGVyZm9ybWFuY2UgYnkgZHluYW1pY2FsbHkgY29tcGlsaW5nIGhpZ2hseSBvcHRpbWl6ZWQgY29kZSBzcGVjaWZpYyB0byAKK2FuIGFwcGxpY2F0aW9uJ3MgM0QgcmVuZGVyaW5nIG5lZWRzLCBhbmQgZXhlY3V0aW5nIHRoYXQgY29kZSBhY3Jvc3MgYWxsIAorYXZhaWxhYmxlIENQVSBjb3JlcyBpbiBwYXJhbGxlbC4KKworTk9URTogVXNlIG9mIFN3aWZ0U2hhZGVyIGlzIHN1YmplY3QgdG8gdGhlIHRoZSBTd2lmdFNoYWRlciBMaWNlbnNlIAorYWdyZWVtZW50IHNpZ25lZCBiZXR3ZWVuIFRyYW5zR2FtaW5nIEluYy4gYW5kIHlvdXIgY29tcGFueS4KKworCitTeXN0ZW0gcmVxdWlyZW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogeDg2IENQVSwgU1NFMiBzdXBwb3J0IHJlcXVpcmVkCisqIEJhc2ljIDJEIHZpZGVvIGNhcmQgLSBubyAzRCBjYXJkIG5lY2Vzc2FyeSEKKyogTWljcm9zb2Z0IFdpbmRvd3MgOThTRSwgV2luZG93cyAyMDAwLCBXaW5kb3dzIFhQLCBXaW5kb3dzIFZpc3RhLCBvciBXaW5kb3dzIDcgCisqIDEyOCBNQiBSQU0KKyogMTAgTUIgZnJlZSBoYXJkIGRpc2sgc3BhY2UKKworCitJbnN0YWxsYXRpb24gLSBEaXJlY3RYCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBTd2lmdFNoYWRlciBEWDkgU2hhZGVyIE1vZGVsIDMuMCBBUEkgaXMgcGFja2FnZWQgYXMgYSBzaW5nbGUgRExMIGZpbGU6CisgZDNkOS5kbGwKKworQm90aCAzMi1iaXQgYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiB0aGlzIERMTCBhcmUgaW5jbHVkZWQuCisKKworVGhlc2UgRExMIGZpbGVzIGFyZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnRzIGZvciB0aGUgc3RhbmRhcmQgTWljcm9zb2Z0IEQzRDkgCitETEwuIFRoZXkgbWF5IGJlIHJlbmFtZWQgYW5kIGNvcGllZCBpbnRvIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYW4gYXBwbGljYXRpb24gCit0aGF0IHVzZXMgRGlyZWN0M0QsIGFuZCBTd2lmdFNoYWRlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdXNlZCBpbiBwbGFjZSAKK29mIHRoZSBidWlsdC1pbiBPUyB2ZXJzaW9uIG9mIERpcmVjdDNELgorCitGb3IgYXBwbGljYXRpb25zIHdoaWNoIHdpc2ggdG8gdXNlIFN3aWZ0U2hhZGVyIGFzIGFuIG9wdGlvbmFsIGZhbGxiYWNrCitpbiBjYXNlIHNvbWUgRDNEIGNhcGFiaWxpdHkgaXMgbm90IGF2YWlsYWJsZSBpbiBoYXJkd2FyZSwgdGhlIFN3aWZ0U2hhZGVyIAorRExMcyBjYW4gYmUgcmVuYW1lZCB0byBzd2lmdHNoYWRlcl9kM2Q5LmRsbCwgYW5kIGxvYWRlZCBkaXJlY3RseSB3aXRoIHRoZSAKK1dpbjMyIExvYWRMaWJyYXJ5IGZ1bmN0aW9uIGFzIGZvbGxvd3M6CisKK3N0YXRpYyBITU9EVUxFIHNfaFN3aWZ0U2hhZGVyTW9kdWxlOworCisvLyBMb2FkIFN3aWZ0U2hhZGVyIERMTAorc3RhdGljIExQRElSRUNUM0RDUkVBVEU5IExvYWRTd2lmdFNoYWRlciggdm9pZCApCit7CisgICAgc19oU3dpZnRTaGFkZXJNb2R1bGUgPSBMb2FkTGlicmFyeSggInN3aWZ0c2hhZGVyX2QzZDkuZGxsIiApOworICAgIGlmKCBzX2hTd2lmdFNoYWRlck1vZHVsZSA9PSBOVUxMICkgCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoTFBESVJFQ1QzRENSRUFURTkpR2V0UHJvY0FkZHJlc3MoIHNfaFN3aWZ0U2hhZGVyTW9kdWxlLCAiRGlyZWN0M0RDcmVhdGU5IiApOworfQorCisKK0luc3RhbGxhdGlvbiAtIE9wZW5HTCBFUyAyLjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIFN3aWZ0U2hhZGVyIE9wZW5HTCBFUyAyLjAgQVBJIGlzIHBhY2thZ2VkIGFzIHR3byBETEwgZmlsZXMgYW5kIHR3byBsaWIgZmlsZXM6CisgbGliRUdMLmRsbAorIGxpYkdMRVN2Mi5kbGwKKyBsaWJFR0wubGliCisgbGliR0xFU3YyLmxpYgorIAorVGhlc2UgbGlicmFyaWVzIGNhbiBiZSBsb2FkZWQgYW5kIHVzZWQgd2l0aGluIE9wZW5HTCBFUyAyLjAgcHJvZ3JhbXMuIEZvcgorbW9yZSBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBPcGVuR0wgRVMgMi4wIGJhc2VkIGFwcGxpY2F0aW9ucyBvbiBXaW5kb3dzLCAKK3BsZWFzZSBzZWUgdGhlIHdlYnNpdGUgb2YgdGhlIEFOR0xFIHByb2plY3QsIGFuZCBsb29rIGZvciAiQXBwbGljYXRpb24KK0RldmVsb3BtZW50IHdpdGggQU5HTEUiOgorCisgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZ2xlcHJvamVjdC93aWtpL0RldlNldHVwCisKKworTGljZW5zZSBBdXRoZW50aWNhdGlvbiAtIEMrKyAtIERpcmVjdFgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdXIgbGljZW5zZWQgdmVyc2lvbiBvZiBTd2lmdFNoYWRlciByZXF1aXJlcyB5b3VyIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgCithbiBhdXRob3JpemF0aW9uIGtleSB0byBkaXNhYmxlIHRoZSBTd2lmdFNoYWRlciBEZW1vbnN0cmF0aW9uIExvZ28gT3ZlcmxheS4KKworSW5jb3Jwb3JhdGluZyB0aGUgbGljZW5zZSBjaGVjayBpbiB5b3VyIEMvQysrIGFwcGxpY2F0aW9uIHJlcXVpcmVzIGEgc21hbGwgCitjaGFuZ2UgaW4geW91ciBhcHBsaWNhdGlvbidzIERpcmVjdDNEIHN0YXJ0dXAgc2VxdWVuY2UuIEZvciBoaW50cyBvbiAKK0xpY2Vuc2UgQXV0aGVudGljYXRpb24gd2l0aCBDIy9NYW5hZ2VkIGNsb2RlIHNlZSB0aGUgTWFuYWdlciBEaXJlY3RYCitzZWN0aW9uIGJlbG93LgorCitGb3IgYSBDKysgYXBwbGljYXRpb24gdGhlIFN3aWZ0U2hhZGVyLmggaGVhZGVyIGZpbGUgbXVzdCBmaXJzdCBiZSBjb3BpZWQgCitpbnRvIHlvdXIgYXBwbGljYXRpb24gc291cmNlIGNvZGUgdHJlZSBhbmQgaW5jbHVkZWQgYXMgZm9sbG93czoKKworI2luY2x1ZGUgIlN3aWZ0U2hhZGVyLmgiCisKK05leHQsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gbmVlZHMgdG8gYmUgYWRkZWQgdG8geW91ciBwcm9ncmFtLCBhbmQgY2FsbGVkCitvbmNlIHRoZSBTd2lmdFNoYWRlciBEM0QgaW50ZXJmYWNlIGhhcyBiZWVuIGNyZWF0ZWQuICBZb3Ugd2lsbCBuZWVkIHRvIAorcmVwbGFjZSB0aGUgTGljZW5zZSBLZXkgd2l0aCB0aGUgb25lIHByb3ZpZGVkIHRvIHlvdSBieSBUcmFuc0dhbWluZy4KK05vdGUgdGhhdCB0aGlzIExpY2Vuc2Uga2V5IGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBzaW5nbGUgYXBwbGljYXRpb24gdGhhdAoraGFzIGJlZW4gbGljZW5zZWQgYnkgeW91ciBvcmdhbml6YXRpb24gZm9yIGRpc3RyaWJ1dGlvbiB3aXRoIFN3aWZ0U2hhZGVyLgorVXNlIG9mIHRoZSBTd2lmdFNoYWRlciBETExzIHdpdGggYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gcmVxdWlyZXMgYSAKK3NlcGFyYXRlIGxpY2Vuc2Uga2V5IHB1cmNoYXNlLgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lOiBTd2lmdFNoYWRlckF1dGgoKQorLy8gRGVzYzogQXV0aG9yaXplIExpY2Vuc2UgS2V5IGZvciBTd2lmdFNoYWRlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk9PTCBTd2lmdFNoYWRlckF1dGgoTFBESVJFQ1QzRDkgbHBEM0QpCit7CisJSVN3aWZ0U2hhZGVyUHJpdmF0ZVYxICpwU3dpZnRTaGFkZXI7CisJbHBEM0QtPlF1ZXJ5SW50ZXJmYWNlKElJRF9Td2lmdFNoYWRlclByaXZhdGVWMSwgKHZvaWQqKikmcFN3aWZ0U2hhZGVyKTsKKwlpZiAocFN3aWZ0U2hhZGVyKQorCXsKKwkJcFN3aWZ0U2hhZGVyLT5SZWdpc3RlckxpY2Vuc2VLZXkoInh4eHh4eHh4eHh4eHh4eCIpOworCQlwU3dpZnRTaGFkZXItPlJlbGVhc2UoKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworCitMaWNlbnNlIEF1dGhlbnRpY2F0aW9uIC0gQyAtIERpcmVjdFggb3IgT3BlbkdMIEVTIDIuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgc28gZGVzaXJlZCwgYSBDIGJhc2VkIEFQSSBmb3IgbGljZW5zZSByZWdpc3RyYXRpb24gaXMgYWxzbyBhdmFpbGFibGUsIHdpdGgKK3RoZSBmb2xsb3dpbmcgZnVuY3Rpb24gc2lnbmF0dXJlOgorCisJdm9pZCBfX3N0ZGNhbGwgUmVnaXN0ZXIoY2hhciAqbGljZW5zZUtleSkKKworQXMgd2l0aCB0aGUgQysrIGNvZGUgYWJvdmUgdGhlIFN3aWZ0U2hhZGVyLmggaGVhZGVyIGZpbGUgbXVzdCBmaXJzdCBiZSBjb3BpZWQgCitpbnRvIHlvdXIgYXBwbGljYXRpb24gc291cmNlIGNvZGUgdHJlZSBhbmQgI2luY2x1ZGVkLiBUaGUgR2V0UHJvY0FkZHJlc3MgCitmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSBzdHJhaWdodC1DIGJhc2VkIFJlZ2lzdGVyIGZ1bmN0aW9uLgorCisKK0FkZGl0aW9uYWwgQ29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FuIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW4gYmUgdXNlZCB3aXRoIFN3aWZ0U2hhZGVyIHRvIGNvbnRyb2wKK3JlbmRlcmluZyBmZWF0dXJlcyBhbmQgb3B0aW1pemF0aW9ucy4gIFRoaXMgZmlsZSwgU3dpZnRTaGFkZXIuaW5pLCBzaG91bGQgCitiZSBwdXQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBhcHBsaWNhdGlvbi4KKworQWRkaXRpb25hbGx5LCBieSBkZWZhdWx0IHdoZW5ldmVyIFN3aWZ0U2hhZGVyIGlzIHJ1bm5pbmcsIGEgc2ltcGxlIAorY29uZmlndXJhdGlvbiB3ZWIgc2VydmVyIHdpbGwgYmUgc3RhcnRlZCBsb2NhbGx5IG9uIHBvcnQgODA4MCBvZiB0aGUgCitzeXN0ZW0uIFRoaXMgc2VydmVyIGNhbiBiZSBhY2Nlc3NlZCB2aWE6CisgIAorIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zd2lmdGNvbmZpZworCitDaGFuZ2VzIG1hZGUgdmlhIHRoZSB3ZWJzZXJ2ZXIgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBTd2lmdFNoYWRlci5pbmkgZmlsZQoraW4gdGhlIEFwcGxpY2F0aW9uJ3Mgd29ya2luZyBkaXJlY3RvcnkuICBUaGUgd2Vic2VydmVyIG1heSBiZSBkaXNhYmxlZCB1c2luZwordGhlIERpc2FibGVTZXJ2ZXIgZmllbGQgaW4gdGhlIGNvbmZpZyBmaWxlLgorCitTb21lIG9mIHRoZSBmZWF0dXJlcyBleHBvc2VkIHRocm91Z2ggdGhlIFN3aWZ0U2hhZGVyLmluaSBmaWxlIGNhbiBhbHNvIAorYmUgY29udHJvbGxlZCBwcm9ncmFtbWF0aWNhbGx5LiAgSWYgYSBTd2lmdFNoYWRlci5pbmkgZmlsZSBpcyBwcmVzZW50LCB0aGUgCitwcm9ncmFtbWF0aWMgc2V0dGluZ3Mgd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZ3MgZnJvbSB0aGUgaW5pIGZpbGUuCisKK1Byb2dyYW1tYXRpYyBzZXR0aW5ncyBtdXN0IGJlIG1hZGUgdGhyb3VnaCB0aGUgSVN3aWZ0U2hhZGVyUHJpdmF0ZVYxIAoraW50ZXJmYWNlIGJlZm9yZSBhIEQzRERldmljZSBpcyBjcmVhdGVkLiAgVGhlIFN3aWZ0U2hhZGVyLmggaGVhZGVyIGluY2x1ZGVzIAordGhlIHJlcXVpcmVkIGNvbnN0YW50cyBhcyB1c2VkIGluIHRoZSBleGFtcGxlIGJlbG93LiAgVGhpcyBleGFtcGxlIAorZGVtb25zdHJhdGVzIHRoZSB0eXBlIG9mIHNldHVwIHRoYXQgbWlnaHQgYmUgdXNlZCBmb3IgYSAyRCBnYW1lIGVuZ2luZSAKK3dpdGggbWluaW1hbCB0ZXh0dXJlIGZpbHRlcmluZyBvciBwZXJzcGVjdGl2ZSBjb3JyZWN0aW9uIG5lZWRzLgorCisKK3ZvaWQgU3dpZnRTaGFkZXJBZGp1c3RRdWFsaXR5KExQRElSRUNUM0Q5IGxwRDNEKQoreworCUlTd2lmdFNoYWRlclByaXZhdGVWMSAqcFN3aWZ0U2hhZGVyOworCWxwRDNELT5RdWVyeUludGVyZmFjZShJSURfU3dpZnRTaGFkZXJQcml2YXRlVjEsICh2b2lkKiopJnBTd2lmdFNoYWRlcik7CisJaWYgKHBTd2lmdFNoYWRlcikKKwl7CisJCS8vIEZvcmNlIHRoZSBtYXhpbXVtIHRleHR1cmUgZmlsdGVyaW5nIHF1YWxpdHkgdG8gdXNlIDItcG9pbnQgYXZlcmFnaW5nCisJCXBTd2lmdFNoYWRlci0+U2V0Q29udHJvbFNldHRpbmcoU1dTX01BWElNVU1GSUxURVJRVUFMSVRZLCBTV0ZfQVZFUkFHRTIpOworCisJCS8vIEZvcmNlIGFsbCBtaXBtYXAgZmlsdGVyaW5nIHRvIGJlIGNvbXBsZXRlbHkgZGlzYWJsZWQKKwkJcFN3aWZ0U2hhZGVyLT5TZXRDb250cm9sU2V0dGluZyhTV1NfTUFYSU1VTU1JUE1BUFFVQUxJVFksIFNXRl9OT05FKTsKKworCQkvLyBEaXNhYmxlIHBlcnNwZWN0aXZlIHRleHR1cmUgY29ycmVjdGlvbgorCQlwU3dpZnRTaGFkZXItPlNldENvbnRyb2xTZXR0aW5nKFNXU19QRVJTUEVDVElWRVFVQUxJVFksIFNXUF9OT05FKTsgCisJCXBTd2lmdFNoYWRlci0+UmVsZWFzZSgpOworCX0KK30KKworUHJvZ3JhbW1hdGljIHNldHRpbmdzIGFyZSBub3QgY3VycmVudGx5IGF2YWlsYWJsZSB3aXRoIHRoZSBPcGVuR0wgRVMgMi4wIEFQSS4KKworCitNdWx0aS1jb3JlIFN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitTd2lmdFNoYWRlciBjYW4gdXNlIG11bHRpcGxlIENQVSBjb3JlcyB0byBzcGVlZCB1cCBzb2Z0d2FyZSByZW5kZXJpbmcuICAKK1VzaW5nIFN3aWZ0Q29uZmlnIG9yIHRoZSBTd2lmdFNoYWRlci5pbmkgZmlsZSwgeW91IGNhbiBkZXRlcm1pbmUgaG93IG1hbnkgCit0aHJlYWRzIHdpbGwgYmUgdXNlZCBzaW11bHRhbmVvdXNseS4gIEJ5IGRlZmF1bHQsIFN3aWZ0U2hhZGVyIHdpbGwgdXNlIGFzIAorbWFueSBjb3JlcyBhcyBwb3NzaWJsZS4KKworCitTdXBwb3J0IGZvciAuTmV0IGFuZCBNYW5hZ2VkIENvZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGlsZSBpdCBpcyBwb3NzaWJsZSB0byBlbmFibGUgdGhlIHVzZSBvZiBTd2lmdFNoYWRlciB3aXRoIE1hbmFnZWQgRGlyZWN0WCwKK3RoaXMgQVBJIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYnkgTWljcm9zb2Z0LiBJbnN0ZWFkIG9mIE1hbmFnZWQgRGlyZWN0WCBvciBYTkEsIAord2Ugc3VnZ2VzdCB1c2luZyB0aGUgT3BlbiBTb3VyY2UgU2xpbURYIGxpYnJhcnk6CisKKwlodHRwOy8vc2xpbWR4Lm9yZy8KKworU3dpZnRTaGFkZXIgd29ya3Mgc2VhbWxlc3NseSB3aXRoIFNsaW1EWCwgYW5kIFNsaW1EWCBzdXBwb3J0cyBib3RoIDMyLWJpdCAKK2FuZCA2NC1iaXQgY29kZS4KKworCitTYW1wbGUgU29mdHdhcmUKKy0tLS0tLS0tLS0tLS0tLQorCitSdW5uaW5nIHRoZSBEaXJlY3QzRCBTYW1wbGUgQ29kZSBmb3VuZCBpbiBNaWNyb3NvZnQncyBEaXJlY3RYIFNESyBpcyBhCitnb29kIHdheSB0byBleHBlcmltZW50IHdpdGggdGhlIFNoYWRlciBNb2RlbCAzLjAgc3VwcG9ydCBhdmFpbGFibGUgaW4gCit0aGlzIGJ1aWxkIG9mIFN3aWZ0U2hhZGVyLiAKKworT3RoZXIgRGlyZWN0WCBleGFtcGxlIGNvZGUgY2FuIGJlIGRvd25sb2FkZWQgc2VwYXJhdGVseSBmcm9tIHZhcmlvdXMgCit3ZWIgc2l0ZXMuIFRvIGludmVzdGlnYXRlIHRoZSBhZHZhbmNlZCBzaGFkZXJzIHN1cHBvcnRlZCBieSBTd2lmdFNoYWRlciwgCit3ZSByZWNvbW1lbmQgZG93bmxvYWRpbmcgQVRJJ3MgUmVuZGVyTW9ua2V5IFNoYWRlciBJREUgYW5kIGNvcHlpbmcgaW4gdGhlIAorU3dpZnRTaGFkZXIgZDNkOS5kbGwgZmlsZS4gCisKKworQ29weXJpZ2h0ICYgTG9nbyBSZXF1aXJlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3VyIFN3aWZ0U2hhZGVyIGxpY2Vuc2UgaW5jbHVkZXMgYSByZXF1aXJlbWVudCB0aGF0IHlvdXIgYXBwbGljYXRpb24gCitkaXNwbGF5IHRoZSBTd2lmdFNoYWRlciBsb2dvIGFuZCBpbmNsdWRlIGFwcHJvcHJpYXRlIENvcHlyaWdodCBub3RpY2VzIAoraW4gaXRzIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbi4KKworVGhlIGVuY2xvc2VkIFN3aWZ0U2hhZGVyX0xvZ28ucG5nIGlzIGEgaGlnaCByZXNvbHV0aW9uIHRyYW5zcGFyZW50IAorUE5HIG9mIHRoZSBTd2lmdFNoYWRlciBsb2dvIHRoYXQgeW91IG1heSB1c2UgZm9yIHRoaXMgcHVycG9zZS4KKworVGhlIGRvY3VtZW50YXRpb24gb3IgbGljZW5zZSBmaWxlIGZvciB5b3VyIGFwcGxpY2F0aW9uIG11c3QgaW5jbHVkZQordGhlIGZvbGxvd2luZyB0ZXh0OgorCisgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBHUFUgVG9va2l0LAorICBDb3B5cmlnaHQoYykyMDAzLTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorCisKK0NoYW5nZXMgc2luY2UgcHJldmlvdXMgdmVyc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gVXBkYXRlcyB0byB0aGUgT3BlbkdMIEVTIDIuMCBBUEk7IEQzRFggSExTTCBjb21waWxlciBzdGlsbCByZXF1aXJlZAorLSBWYXJpb3VzIGJ1ZyBmaXhlcworCisKK0NPTlRBQ1RTCistLS0tLS0tLQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgU3dpZnRTaGFkZXIgb3Igb3RoZXIgVHJhbnNHYW1pbmcgCitwcm9kdWN0cywgcGxlYXNlIGNvbnRhY3QgdXMgYXMgZm9sbG93czoKKworU2FsZXMgYW5kIExpY2Vuc2luZyBJbnF1aXJpZXM6CisKKyAgc2FsZXNAdHJhbnNnYW1pbmcuY29tCisKKworVGVjaG5pY2FsIFF1ZXN0aW9ucyBhbmQgSW5mb3JtYXRpb246CisKKyAgc3dpZnRzaGFkZXJAdHJhbnNnYW1pbmcuY29tCmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvQmxpdHRlci5jcHAgYi9zcmMvUmVuZGVyZXIvQmxpdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkMjgyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9CbGl0dGVyLmNwcApAQCAtMCwwICsxLDM0NSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiQmxpdHRlci5ocHAiCisKKyNpbmNsdWRlICJDb21tb24vRGVidWcuaHBwIgorI2luY2x1ZGUgIlJlYWN0b3IvU2hlbGwuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwlCbGl0dGVyOjpCbGl0dGVyKCkKKwl7CisJCWJsaXRDYWNoZSA9IG5ldyBMUlVDYWNoZTxCbGl0U3RhdGUsIFJvdXRpbmU+KDEwMjQpOworCX0KKworCUJsaXR0ZXI6On5CbGl0dGVyKCkKKwl7CisJCWRlbGV0ZSBibGl0Q2FjaGU7CisJfQorCisJdm9pZCBCbGl0dGVyOjpibGl0KFN1cmZhY2UgKnNvdXJjZSwgY29uc3QgUmVjdCAmc1JlY3QsIFN1cmZhY2UgKmRlc3QsIGNvbnN0IFJlY3QgJmRSZWN0LCBib29sIGZpbHRlcikKKwl7CisJCWlmKGJsaXRSZWFjdG9yKHNvdXJjZSwgc1JlY3QsIGRlc3QsIGRSZWN0LCBmaWx0ZXIpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlzb3VyY2UtPmxvY2tJbnRlcm5hbChzUmVjdC5sZWZ0LCBzUmVjdC50b3AsIDAsIHN3OjpMT0NLX1JFQURPTkxZLCBzdzo6UFVCTElDKTsKKwkJZGVzdC0+bG9ja0ludGVybmFsKGRSZWN0LmxlZnQsIGRSZWN0LnRvcCwgMCwgc3c6OkxPQ0tfV1JJVEVPTkxZLCBzdzo6UFVCTElDKTsKKworCQlmbG9hdCB3ID0gMS4wZiAvIChkUmVjdC5yaWdodCAtIGRSZWN0LmxlZnQpICogKHNSZWN0LnJpZ2h0IC0gc1JlY3QubGVmdCk7CisJCWZsb2F0IGggPSAxLjBmIC8gKGRSZWN0LmJvdHRvbSAtIGRSZWN0LnRvcCkgKiAoc1JlY3QuYm90dG9tIC0gc1JlY3QudG9wKTsKKworCQlmbG9hdCB5ID0gKGZsb2F0KXNSZWN0LnRvcCArIDAuNWYgKiBoOworCisJCWZvcihpbnQgaiA9IGRSZWN0LnRvcDsgaiA8IGRSZWN0LmJvdHRvbTsgaisrKQorCQl7CisJCQlmbG9hdCB4ID0gKGZsb2F0KXNSZWN0LmxlZnQgKyAwLjVmICogdzsKKworCQkJZm9yKGludCBpID0gZFJlY3QubGVmdDsgaSA8IGRSZWN0LnJpZ2h0OyBpKyspCisJCQl7CisJCQkJc3c6OkNvbG9yPGZsb2F0PiBjb2xvcjsKKworCQkJCWlmKCFmaWx0ZXIpCisJCQkJeworCQkJCQljb2xvciA9IHNvdXJjZS0+cmVhZEludGVybmFsKChpbnQpeCwgKGludCl5KTsKKwkJCQl9CisJCQkJZWxzZSAgIC8vIEJpbGluZWFyIGZpbHRlcmluZworCQkJCXsKKwkJCQkJY29sb3IgPSBzb3VyY2UtPnNhbXBsZUludGVybmFsKHgsIHkpOworCQkJCX0KKworCQkJCWRlc3QtPndyaXRlSW50ZXJuYWwoaSwgaiwgY29sb3IpOworCisJCQkJeCArPSB3OworCQkJfQorCisJCQl5ICs9IGg7CisJCX0KKworCQlzb3VyY2UtPnVubG9ja0ludGVybmFsKCk7CisJCWRlc3QtPnVubG9ja0ludGVybmFsKCk7CisJfQorCisJYm9vbCBCbGl0dGVyOjpyZWFkKEZsb2F0NCAmYywgUG9pbnRlcjxCeXRlPiBlbGVtZW50LCBGb3JtYXQgZm9ybWF0KQorCXsKKwkJYyA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgRk9STUFUX0w4OgorCQkJYy54eXogPSBGbG9hdChJbnQoKlBvaW50ZXI8Qnl0ZT4oZWxlbWVudCkpKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BOFI4RzhCODoKKwkJCWMgPSBGbG9hdDQoKlBvaW50ZXI8Qnl0ZTQ+KGVsZW1lbnQpKS56eXh3OworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQkJYyA9IEZsb2F0NCgqUG9pbnRlcjxCeXRlND4oZWxlbWVudCkpLnp5eHc7CisJCQljLncgPSBGbG9hdCgxLjBmKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BMTZCMTZHMTZSMTY6CisJCQljID0gRmxvYXQ0KCpQb2ludGVyPFVTaG9ydDQ+KGVsZW1lbnQpKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCQkvLyBGSVhNRTogT3B0aW1pemUKKwkJCWMueCA9IEZsb2F0KEludCgqUG9pbnRlcjxVU2hvcnQ+KGVsZW1lbnQgKyAwKSkpOworCQkJYy55ID0gRmxvYXQoSW50KCpQb2ludGVyPFVTaG9ydD4oZWxlbWVudCArIDIpKSk7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTMyQjMyRzMyUjMyRjoKKwkJCWMgPSAqUG9pbnRlcjxGbG9hdDQ+KGVsZW1lbnQpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0czMlIzMkY6CisJCQljLnggPSAqUG9pbnRlcjxGbG9hdD4oZWxlbWVudCArIDApOworCQkJYy55ID0gKlBvaW50ZXI8RmxvYXQ+KGVsZW1lbnQgKyA0KTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9SMzJGOgorCQkJYy54ID0gKlBvaW50ZXI8RmxvYXQ+KGVsZW1lbnQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlib29sIEJsaXR0ZXI6OmJsaXRSZWFjdG9yKFN1cmZhY2UgKnNvdXJjZSwgY29uc3QgUmVjdCAmc1JlY3QsIFN1cmZhY2UgKmRlc3QsIGNvbnN0IFJlY3QgJmRSZWN0LCBib29sIGZpbHRlcikKKwl7CisJCUJsaXRTdGF0ZSBzdGF0ZTsKKworCQlzdGF0ZS5zb3VyY2VGb3JtYXQgPSBzb3VyY2UtPmdldEludGVybmFsRm9ybWF0KCk7CisJCXN0YXRlLmRlc3RGb3JtYXQgPSBkZXN0LT5nZXRJbnRlcm5hbEZvcm1hdCgpOworCQlzdGF0ZS5maWx0ZXIgPSBmaWx0ZXI7CisKKwkJUm91dGluZSAqYmxpdFJvdXRpbmUgPSBibGl0Q2FjaGUtPnF1ZXJ5KHN0YXRlKTsKKwkJCisJCWlmKCFibGl0Um91dGluZSkKKwkJeworCQkJRnVuY3Rpb248Vm9pZCwgUG9pbnRlcjxCeXRlPj4gZnVuY3Rpb247CisJCQl7CisJCQkJUG9pbnRlcjxCeXRlPiBibGl0KGZ1bmN0aW9uLmFyZygwKSk7CisKKwkJCQlQb2ludGVyPEJ5dGU+IHNvdXJjZSA9ICpQb2ludGVyPFBvaW50ZXI8Qnl0ZT4+KGJsaXQgKyBPRkZTRVQoQmxpdERhdGEsc291cmNlKSk7CisJCQkJUG9pbnRlcjxCeXRlPiBkZXN0ID0gKlBvaW50ZXI8UG9pbnRlcjxCeXRlPj4oYmxpdCArIE9GRlNFVChCbGl0RGF0YSxkZXN0KSk7CisJCQkJSW50IHNQaXRjaEIgPSAqUG9pbnRlcjxJbnQ+KGJsaXQgKyBPRkZTRVQoQmxpdERhdGEsc1BpdGNoQikpOworCQkJCUludCBkUGl0Y2hCID0gKlBvaW50ZXI8SW50PihibGl0ICsgT0ZGU0VUKEJsaXREYXRhLGRQaXRjaEIpKTsKKworCQkJCUZsb2F0IHgwID0gKlBvaW50ZXI8RmxvYXQ+KGJsaXQgKyBPRkZTRVQoQmxpdERhdGEseDApKTsKKwkJCQlGbG9hdCB5MCA9ICpQb2ludGVyPEZsb2F0PihibGl0ICsgT0ZGU0VUKEJsaXREYXRhLHkwKSk7CisJCQkJRmxvYXQgdyA9ICpQb2ludGVyPEZsb2F0PihibGl0ICsgT0ZGU0VUKEJsaXREYXRhLHcpKTsKKwkJCQlGbG9hdCBoID0gKlBvaW50ZXI8RmxvYXQ+KGJsaXQgKyBPRkZTRVQoQmxpdERhdGEsaCkpOworCisJCQkJSW50IHRvcCA9ICpQb2ludGVyPEludD4oYmxpdCArIE9GRlNFVChCbGl0RGF0YSx0b3ApKTsKKwkJCQlJbnQgYm90dG9tID0gKlBvaW50ZXI8SW50PihibGl0ICsgT0ZGU0VUKEJsaXREYXRhLGJvdHRvbSkpOworCQkJCUludCBsZWZ0ID0gKlBvaW50ZXI8SW50PihibGl0ICsgT0ZGU0VUKEJsaXREYXRhLGxlZnQpKTsKKwkJCQlJbnQgcmlnaHQgPSAqUG9pbnRlcjxJbnQ+KGJsaXQgKyBPRkZTRVQoQmxpdERhdGEscmlnaHQpKTsKKworCQkJCUludCB3aWR0aCA9ICpQb2ludGVyPEludD4oYmxpdCArIE9GRlNFVChCbGl0RGF0YSx3aWR0aCkpOworCQkJCUludCBoZWlnaHQgPSAqUG9pbnRlcjxJbnQ+KGJsaXQgKyBPRkZTRVQoQmxpdERhdGEsaGVpZ2h0KSk7CisKKwkJCQlGbG9hdCB5ID0geTA7CisKKwkJCQlGb3IoSW50IGogPSB0b3AsIGogPCBib3R0b20sIGorKykKKwkJCQl7CisJCQkJCUZsb2F0IHggPSB4MDsKKworCQkJCQlGb3IoSW50IGkgPSBsZWZ0LCBpIDwgcmlnaHQsIGkrKykKKwkJCQkJeworCQkJCQkJRmxvYXQ0IGNvbG9yOworCisJCQkJCQlpZighZmlsdGVyKQorCQkJCQkJeworCQkJCQkJCUludCBYID0gSW50KHgpOworCQkJCQkJCUludCBZID0gSW50KHkpOworCisJCQkJCQkJUG9pbnRlcjxCeXRlPiBzID0gc291cmNlICsgWSAqIHNQaXRjaEIgKyBYICogU3VyZmFjZTo6Ynl0ZXMoc3RhdGUuc291cmNlRm9ybWF0KTsKKworCQkJCQkJCWlmKCFyZWFkKGNvbG9yLCBzLCBzdGF0ZS5zb3VyY2VGb3JtYXQpKQorCQkJCQkJCXsKKwkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UgICAvLyBCaWxpbmVhciBmaWx0ZXJpbmcKKwkJCQkJCXsKKwkJCQkJCQlGbG9hdCB4MCA9IHggLSBGbG9hdCgwLjVmKTsKKwkJCQkJCQlGbG9hdCB5MCA9IHkgLSBGbG9hdCgwLjVmKTsKKworCQkJCQkJCUludCBYMCA9IEludCh4MCk7CisJCQkJCQkJSW50IFkwID0gSW50KHkwKTsKKworCQkJCQkJCVgwID0gSWZUaGVuRWxzZShYMCA8IDAsIEludCgwKSwgWDApOworCQkJCQkJCVkwID0gSWZUaGVuRWxzZShZMCA8IDAsIEludCgwKSwgWTApOworCisJCQkJCQkJSW50IFgxID0gSWZUaGVuRWxzZShYMCArIDEgPj0gd2lkdGgsIFgwLCBYMCArIDEpOworCQkJCQkJCUludCBZMSA9IElmVGhlbkVsc2UoWTAgKyAxID49IGhlaWdodCwgWTAsIFkwICsgMSk7CisKKwkJCQkJCQlQb2ludGVyPEJ5dGU+IHMwMCA9IHNvdXJjZSArIFkwICogc1BpdGNoQiArIFgwICogU3VyZmFjZTo6Ynl0ZXMoc3RhdGUuc291cmNlRm9ybWF0KTsKKwkJCQkJCQlQb2ludGVyPEJ5dGU+IHMwMSA9IHNvdXJjZSArIFkwICogc1BpdGNoQiArIFgxICogU3VyZmFjZTo6Ynl0ZXMoc3RhdGUuc291cmNlRm9ybWF0KTsKKwkJCQkJCQlQb2ludGVyPEJ5dGU+IHMxMCA9IHNvdXJjZSArIFkxICogc1BpdGNoQiArIFgwICogU3VyZmFjZTo6Ynl0ZXMoc3RhdGUuc291cmNlRm9ybWF0KTsKKwkJCQkJCQlQb2ludGVyPEJ5dGU+IHMxMSA9IHNvdXJjZSArIFkxICogc1BpdGNoQiArIFgxICogU3VyZmFjZTo6Ynl0ZXMoc3RhdGUuc291cmNlRm9ybWF0KTsKKworCQkJCQkJCUZsb2F0NCBjMDA7IGlmKCFyZWFkKGMwMCwgczAwLCBzdGF0ZS5zb3VyY2VGb3JtYXQpKSByZXR1cm4gZmFsc2U7CisJCQkJCQkJRmxvYXQ0IGMwMTsgaWYoIXJlYWQoYzAxLCBzMDEsIHN0YXRlLnNvdXJjZUZvcm1hdCkpIHJldHVybiBmYWxzZTsKKwkJCQkJCQlGbG9hdDQgYzEwOyBpZighcmVhZChjMTAsIHMxMCwgc3RhdGUuc291cmNlRm9ybWF0KSkgcmV0dXJuIGZhbHNlOworCQkJCQkJCUZsb2F0NCBjMTE7IGlmKCFyZWFkKGMxMSwgczExLCBzdGF0ZS5zb3VyY2VGb3JtYXQpKSByZXR1cm4gZmFsc2U7CisKKwkJCQkJCQlGbG9hdDQgZnggPSBGbG9hdDQoeDAgLSBGbG9hdChYMCkpOworCQkJCQkJCUZsb2F0NCBmeSA9IEZsb2F0NCh5MCAtIEZsb2F0KFkwKSk7CisKKwkJCQkJCQljb2xvciA9IGMwMCAqIChGbG9hdDQoMS4wZikgLSBmeCkgKiAoRmxvYXQ0KDEuMGYpIC0gZnkpICsKKwkJCQkJCQkgICAgICAgIGMwMSAqIGZ4ICogKEZsb2F0NCgxLjBmKSAtIGZ5KSArCisJCQkJCQkJCQljMTAgKiAoRmxvYXQ0KDEuMGYpIC0gZngpICogZnkgKworCQkJCQkJCQkJYzExICogZnggKiBmeTsKKwkJCQkJCX0KKworCQkJCQkJZmxvYXQ0IHVuc2NhbGU7CisKKwkJCQkJCXN3aXRjaChzdGF0ZS5zb3VyY2VGb3JtYXQpCisJCQkJCQl7CisJCQkJCQljYXNlIEZPUk1BVF9MODoKKwkJCQkJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQkJCQkJY2FzZSBGT1JNQVRfWDhSOEc4Qjg6CisJCQkJCQkJdW5zY2FsZSA9IHZlY3RvcigyNTUsIDI1NSwgMjU1LCAyNTUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2OgorCQkJCQkJY2FzZSBGT1JNQVRfRzE2UjE2OgorCQkJCQkJCXVuc2NhbGUgPSB2ZWN0b3IoNjU1MzUsIDY1NTM1LCA2NTUzNSwgNjU1MzUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGT1JNQVRfQTMyQjMyRzMyUjMyRjoKKwkJCQkJCWNhc2UgRk9STUFUX0czMlIzMkY6CisJCQkJCQljYXNlIEZPUk1BVF9SMzJGOgorCQkJCQkJCXVuc2NhbGUgPSB2ZWN0b3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCX0KKworCQkJCQkJZmxvYXQ0IHNjYWxlOworCisJCQkJCQlzd2l0Y2goc3RhdGUuZGVzdEZvcm1hdCkKKwkJCQkJCXsKKwkJCQkJCWNhc2UgRk9STUFUX0w4OgorCQkJCQkJY2FzZSBGT1JNQVRfQThSOEc4Qjg6CisJCQkJCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJCQkJCQlzY2FsZSA9IHZlY3RvcigyNTUsIDI1NSwgMjU1LCAyNTUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2OgorCQkJCQkJY2FzZSBGT1JNQVRfRzE2UjE2OgorCQkJCQkJCXNjYWxlID0gdmVjdG9yKDY1NTM1LCA2NTUzNSwgNjU1MzUsIDY1NTM1KTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgRk9STUFUX0EzMkIzMkczMlIzMkY6CisJCQkJCQljYXNlIEZPUk1BVF9HMzJSMzJGOgorCQkJCQkJY2FzZSBGT1JNQVRfUjMyRjoKKwkJCQkJCQlzY2FsZSA9IHZlY3RvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJfQorCisJCQkJCQlpZih1bnNjYWxlICE9IHNjYWxlKQorCQkJCQkJeworCQkJCQkJCWNvbG9yICo9IEZsb2F0NChzY2FsZS54IC8gdW5zY2FsZS54LCBzY2FsZS55IC8gdW5zY2FsZS55LCBzY2FsZS56IC8gdW5zY2FsZS56LCBzY2FsZS53IC8gdW5zY2FsZS53KTsKKwkJCQkJCX0KKworCQkJCQkJaWYoU3VyZmFjZTo6aXNGbG9hdEZvcm1hdChzdGF0ZS5zb3VyY2VGb3JtYXQpICYmICFTdXJmYWNlOjppc0Zsb2F0Rm9ybWF0KHN0YXRlLmRlc3RGb3JtYXQpKQorCQkJCQkJeworCQkJCQkJCWNvbG9yID0gTWluKGNvbG9yLCBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikpOworCisJCQkJCQkJY29sb3IgPSBNYXgoY29sb3IsIEZsb2F0NChTdXJmYWNlOjppc1Vuc2lnbmVkQ29tcG9uZW50KHN0YXRlLmRlc3RGb3JtYXQsIDApID8gMC4wZiA6IC0xLjBmLAorCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZTo6aXNVbnNpZ25lZENvbXBvbmVudChzdGF0ZS5kZXN0Rm9ybWF0LCAxKSA/IDAuMGYgOiAtMS4wZiwKKwkJCQkJCQkJCQkJCQkgIFN1cmZhY2U6OmlzVW5zaWduZWRDb21wb25lbnQoc3RhdGUuZGVzdEZvcm1hdCwgMikgPyAwLjBmIDogLTEuMGYsCisJCQkJCQkJCQkJCQkJICBTdXJmYWNlOjppc1Vuc2lnbmVkQ29tcG9uZW50KHN0YXRlLmRlc3RGb3JtYXQsIDMpID8gMC4wZiA6IC0xLjBmKSk7CisJCQkJCQl9CisKKwkJCQkJCVBvaW50ZXI8Qnl0ZT4gZCA9IGRlc3QgKyBqICogZFBpdGNoQiArIGkgKiBTdXJmYWNlOjpieXRlcyhzdGF0ZS5kZXN0Rm9ybWF0KTsKKworCQkJCQkJc3dpdGNoKHN0YXRlLmRlc3RGb3JtYXQpCisJCQkJCQl7CisJCQkJCQljYXNlIEZPUk1BVF9MODoKKwkJCQkJCQkqUG9pbnRlcjxCeXRlPihkKSA9IEJ5dGUoUm91bmRJbnQoRmxvYXQoY29sb3IueCkpKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQkJCQkJCXsKKwkJCQkJCQkJVVNob3J0NCBjMCA9IEFzPFVTaG9ydDQ+KFJvdW5kU2hvcnQ0KGNvbG9yLnp5eHcpKTsKKwkJCQkJCQkJQnl0ZTggYzEgPSBQYWNrKGMwLCBjMCk7CisJCQkJCQkJCSpQb2ludGVyPFVJbnQ+KGQpID0gVUludChBczxMb25nPihjMSkpOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQkJCQkJCXsKKwkJCQkJCQkJVVNob3J0NCBjMCA9IEFzPFVTaG9ydDQ+KFJvdW5kU2hvcnQ0KGNvbG9yLnp5eHcpKTsKKwkJCQkJCQkJQnl0ZTggYzEgPSBQYWNrKGMwLCBjMCk7CisJCQkJCQkJCSpQb2ludGVyPFVJbnQ+KGQpID0gVUludChBczxMb25nPihjMSkpIHwgVUludCgweEZGMDAwMDAwKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZPUk1BVF9BMTZCMTZHMTZSMTY6CisJCQkJCQkJKlBvaW50ZXI8VVNob3J0ND4oZCkgPSBVU2hvcnQ0KFJvdW5kSW50KGNvbG9yKSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCQkJCQkJKlBvaW50ZXI8VUludD4oZCkgPSBVSW50KEFzPExvbmc+KFVTaG9ydDQoUm91bmRJbnQoY29sb3IpKSkpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGT1JNQVRfQTMyQjMyRzMyUjMyRjoKKwkJCQkJCQkqUG9pbnRlcjxGbG9hdDQ+KGQpID0gY29sb3I7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZPUk1BVF9HMzJSMzJGOgorCQkJCQkJCSpQb2ludGVyPEZsb2F0Mj4oZCkgPSBGbG9hdDIoY29sb3IpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGT1JNQVRfUjMyRjoKKwkJCQkJCQkqUG9pbnRlcjxGbG9hdD4oZCkgPSBjb2xvci54OworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisKKwkJCQkJCXggKz0gdzsKKwkJCQkJfQorCisJCQkJCXkgKz0gaDsKKwkJCQl9CisKKwkJCQlFbW1zKCk7ICAgLy8gRklYTUU6IE5vdCByZXF1aXJlZCB3aGVuIHBlcmZvcm1pbmcgYmxpdHMgaW4gdGhlIHJlbmRlcmVyIGVuZ2luZQorCQkJfQorCisJCQlibGl0Um91dGluZSA9IGZ1bmN0aW9uKEwiQmxpdFJvdXRpbmUiKTsKKworCQkJYmxpdENhY2hlLT5hZGQoc3RhdGUsIGJsaXRSb3V0aW5lKTsKKwkJfQorCisJCXZvaWQgKF9fY2RlY2wgKmJsaXRGdW5jdGlvbikoY29uc3QgQmxpdERhdGEgKmRhdGEpID0gKHZvaWQoX19jZGVjbCopKGNvbnN0IEJsaXREYXRhKikpYmxpdFJvdXRpbmUtPmdldEVudHJ5KCk7CisKKwkJQmxpdERhdGEgZGF0YTsKKworCQlkYXRhLnNvdXJjZSA9IHNvdXJjZS0+bG9ja0ludGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX1JFQURPTkxZLCBzdzo6UFVCTElDKTsKKwkJZGF0YS5kZXN0ID0gZGVzdC0+bG9ja0ludGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX1dSSVRFT05MWSwgc3c6OlBVQkxJQyk7CisJCWRhdGEuc1BpdGNoQiA9IHNvdXJjZS0+Z2V0SW50ZXJuYWxQaXRjaEIoKTsKKwkJZGF0YS5kUGl0Y2hCID0gZGVzdC0+Z2V0SW50ZXJuYWxQaXRjaEIoKTsKKworCQlkYXRhLncgPSAxLjBmIC8gKGRSZWN0LnJpZ2h0IC0gZFJlY3QubGVmdCkgKiAoc1JlY3QucmlnaHQgLSBzUmVjdC5sZWZ0KTsKKwkJZGF0YS5oID0gMS4wZiAvIChkUmVjdC5ib3R0b20gLSBkUmVjdC50b3ApICogKHNSZWN0LmJvdHRvbSAtIHNSZWN0LnRvcCk7CisJCWRhdGEueDAgPSAoZmxvYXQpc1JlY3QubGVmdCArIDAuNWYgKiBkYXRhLnc7CisJCWRhdGEueTAgPSAoZmxvYXQpc1JlY3QudG9wICsgMC41ZiAqIGRhdGEuaDsKKwkJCisJCWRhdGEudG9wID0gZFJlY3QudG9wOworCQlkYXRhLmJvdHRvbSA9IGRSZWN0LmJvdHRvbTsKKwkJZGF0YS5sZWZ0ID0gZFJlY3QubGVmdDsKKwkJZGF0YS5yaWdodCA9IGRSZWN0LnJpZ2h0OworCisJCWRhdGEud2lkdGggPSBzb3VyY2UtPmdldEludGVybmFsV2lkdGgoKTsKKwkJZGF0YS5oZWlnaHQgPSBzb3VyY2UtPmdldEludGVybmFsSGVpZ2h0KCk7CisKKwkJYmxpdEZ1bmN0aW9uKCZkYXRhKTsKKworCQlzb3VyY2UtPnVubG9ja0ludGVybmFsKCk7CisJCWRlc3QtPnVubG9ja0ludGVybmFsKCk7CisKKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL0JsaXR0ZXIuaHBwIGIvc3JjL1JlbmRlcmVyL0JsaXR0ZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGEzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvQmxpdHRlci5ocHAKQEAgLTAsMCArMSw3MyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgc3dfQmxpdHRlcl9ocHANCisjZGVmaW5lIHN3X0JsaXR0ZXJfaHBwDQorDQorI2luY2x1ZGUgIlN1cmZhY2UuaHBwIg0KKyNpbmNsdWRlICJMUlVDYWNoZS5ocHAiDQorI2luY2x1ZGUgIlJlYWN0b3IvTnVjbGV1cy5ocHAiDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwljbGFzcyBSb3V0aW5lOw0KKw0KKwljbGFzcyBCbGl0dGVyDQorCXsNCisJcHVibGljOg0KKwkJQmxpdHRlcigpOw0KKw0KKwkJdmlydHVhbCB+QmxpdHRlcigpOw0KKw0KKwkJdm9pZCBibGl0KFN1cmZhY2UgKnNvdXJjZSwgY29uc3QgUmVjdCAmc1JlY3QsIFN1cmZhY2UgKmRlc3QsIGNvbnN0IFJlY3QgJmRSZWN0LCBib29sIGZpbHRlcik7DQorDQorCXByaXZhdGU6DQorCQlib29sIHJlYWQoRmxvYXQ0ICZjb2xvciwgUG9pbnRlcjxCeXRlPiBlbGVtZW50LCBGb3JtYXQgZm9ybWF0KTsNCisJCWJvb2wgYmxpdFJlYWN0b3IoU3VyZmFjZSAqc291cmNlLCBjb25zdCBSZWN0ICZzUmVjdCwgU3VyZmFjZSAqZGVzdCwgY29uc3QgUmVjdCAmZFJlY3QsIGJvb2wgZmlsdGVyKTsNCisNCisJCXN0cnVjdCBCbGl0U3RhdGUNCisJCXsNCisJCQlib29sIG9wZXJhdG9yPT0oY29uc3QgQmxpdFN0YXRlICZzdGF0ZSkgY29uc3QNCisJCQl7DQorCQkJCXJldHVybiBtZW1jbXAodGhpcywgJnN0YXRlLCBzaXplb2YoQmxpdFN0YXRlKSkgPT0gMDsNCisJCQl9DQorDQorCQkJRm9ybWF0IHNvdXJjZUZvcm1hdDsNCisJCQlGb3JtYXQgZGVzdEZvcm1hdDsNCisJCQlib29sIGZpbHRlcjsNCisJCX07DQorDQorCQlzdHJ1Y3QgQmxpdERhdGENCisJCXsNCisJCQl2b2lkICpzb3VyY2U7DQorCQkJdm9pZCAqZGVzdDsNCisJCQlpbnQgc1BpdGNoQjsNCisJCQlpbnQgZFBpdGNoQjsNCisNCisJCQlmbG9hdCB4MDsNCisJCQlmbG9hdCB5MDsNCisJCQlmbG9hdCB3Ow0KKwkJCWZsb2F0IGg7DQorDQorCQkJaW50IHRvcDsNCisJCQlpbnQgYm90dG9tOw0KKwkJCWludCBsZWZ0Ow0KKwkJCWludCByaWdodDsNCisNCisJCQlpbnQgd2lkdGg7DQorCQkJaW50IGhlaWdodDsNCisJCX07DQorDQorCQlMUlVDYWNoZTxCbGl0U3RhdGUsIFJvdXRpbmU+ICpibGl0Q2FjaGU7DQorCX07DQorfQ0KKw0KKyNlbmRpZiAgIC8vIHN3X0JsaXR0ZXJfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL0NsaXBwZXIuY3BwIGIvc3JjL1JlbmRlcmVyL0NsaXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNmMxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvQ2xpcHBlci5jcHAKQEAgLTAsMCArMSwzNzQgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkNsaXBwZXIuaHBwIgorCisjaW5jbHVkZSAiUG9seWdvbi5ocHAiCisjaW5jbHVkZSAiUmVuZGVyZXIuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2Ugc3cKK3sKKwlDbGlwcGVyOjpDbGlwcGVyKCkKKwl7CisJfQorCisJQ2xpcHBlcjo6fkNsaXBwZXIoKQorCXsKKwl9CisKKwlib29sIENsaXBwZXI6OmNsaXAoUG9seWdvbiAmcG9seWdvbiwgaW50IGNsaXBGbGFnc09yLCBjb25zdCBEcmF3Q2FsbCAmZHJhdykKKwl7CisJCURyYXdEYXRhICZkYXRhID0gKmRyYXcuZGF0YTsKKworCQlwb2x5Z29uLmIgPSAwOworCisJCWlmKGNsaXBGbGFnc09yICYgMHgwMDAwMDAzRikKKwkJeworCQkJaWYoY2xpcEZsYWdzT3IgJiBDTElQX05FQVIpICAgY2xpcE5lYXIocG9seWdvbik7CisJCQlpZihwb2x5Z29uLm4gPj0gMykgeworCQkJaWYoY2xpcEZsYWdzT3IgJiBDTElQX0ZBUikgICAgY2xpcEZhcihwb2x5Z29uKTsKKwkJCWlmKHBvbHlnb24ubiA+PSAzKSB7CisJCQlpZihjbGlwRmxhZ3NPciAmIENMSVBfTEVGVCkgICBjbGlwTGVmdChwb2x5Z29uLCBkYXRhKTsKKwkJCWlmKHBvbHlnb24ubiA+PSAzKSB7CisJCQlpZihjbGlwRmxhZ3NPciAmIENMSVBfUklHSFQpICBjbGlwUmlnaHQocG9seWdvbiwgZGF0YSk7CisJCQlpZihwb2x5Z29uLm4gPj0gMykgeworCQkJaWYoY2xpcEZsYWdzT3IgJiBDTElQX1RPUCkgICAgY2xpcFRvcChwb2x5Z29uLCBkYXRhKTsKKwkJCWlmKHBvbHlnb24ubiA+PSAzKSB7CisJCQlpZihjbGlwRmxhZ3NPciAmIENMSVBfQk9UVE9NKSBjbGlwQm90dG9tKHBvbHlnb24sIGRhdGEpOworCQkJfX19fX0KKwkJfQorCisJCWlmKGNsaXBGbGFnc09yICYgMHgwMDAwM0YwMCkKKwkJeworCQkJaWYocG9seWdvbi5uID49IDMpIHsKKwkJCWlmKGRyYXcuY2xpcEZsYWdzICYgQ0xJUF9QTEFORTApIGNsaXBQbGFuZShwb2x5Z29uLCBkYXRhLmNsaXBQbGFuZVswXSk7CisJCQlpZihwb2x5Z29uLm4gPj0gMykgeworCQkJaWYoZHJhdy5jbGlwRmxhZ3MgJiBDTElQX1BMQU5FMSkgY2xpcFBsYW5lKHBvbHlnb24sIGRhdGEuY2xpcFBsYW5lWzFdKTsKKwkJCWlmKHBvbHlnb24ubiA+PSAzKSB7CisJCQlpZihkcmF3LmNsaXBGbGFncyAmIENMSVBfUExBTkUyKSBjbGlwUGxhbmUocG9seWdvbiwgZGF0YS5jbGlwUGxhbmVbMl0pOworCQkJaWYocG9seWdvbi5uID49IDMpIHsKKwkJCWlmKGRyYXcuY2xpcEZsYWdzICYgQ0xJUF9QTEFORTMpIGNsaXBQbGFuZShwb2x5Z29uLCBkYXRhLmNsaXBQbGFuZVszXSk7CisJCQlpZihwb2x5Z29uLm4gPj0gMykgeworCQkJaWYoZHJhdy5jbGlwRmxhZ3MgJiBDTElQX1BMQU5FNCkgY2xpcFBsYW5lKHBvbHlnb24sIGRhdGEuY2xpcFBsYW5lWzRdKTsKKwkJCWlmKHBvbHlnb24ubiA+PSAzKSB7CisJCQlpZihkcmF3LmNsaXBGbGFncyAmIENMSVBfUExBTkU1KSBjbGlwUGxhbmUocG9seWdvbiwgZGF0YS5jbGlwUGxhbmVbNV0pOworCQkJfX19fX19CisJCX0KKworCQlyZXR1cm4gcG9seWdvbi5uID49IDM7CisJfQorCisJdm9pZCBDbGlwcGVyOjpjbGlwTmVhcihQb2x5Z29uICZwb2x5Z29uKQorCXsKKwkJaWYocG9seWdvbi5uID09IDApIHJldHVybjsKKworCQljb25zdCBmbG9hdDQgKipWID0gcG9seWdvbi5QW3BvbHlnb24uaV07CisJCWNvbnN0IGZsb2F0NCAqKlQgPSBwb2x5Z29uLlBbcG9seWdvbi5pICsgMV07CisKKwkJaW50IHQgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCBwb2x5Z29uLm47IGkrKykKKwkJeworCQkJaW50IGogPSBpID09IHBvbHlnb24ubiAtIDEgPyAwIDogaSArIDE7CisKKwkJCWZsb2F0IGRpID0gVltpXS0+ejsKKwkJCWZsb2F0IGRqID0gVltqXS0+ejsKKworCQkJaWYoZGkgPj0gMCkKKwkJCXsKKwkJCQlUW3QrK10gPSBWW2ldOworCisJCQkJaWYoZGogPCAwKQorCQkJCXsKKwkJCQkJY2xpcEVkZ2UocG9seWdvbi5CW3BvbHlnb24uYl0sICpWW2ldLCAqVltqXSwgZGksIGRqKTsKKwkJCQkJcG9seWdvbi5CW3BvbHlnb24uYl0ueiA9IDA7CisJCQkJCVRbdCsrXSA9ICZwb2x5Z29uLkJbcG9seWdvbi5iKytdOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZihkaiA+IDApCisJCQkJeworCQkJCQljbGlwRWRnZShwb2x5Z29uLkJbcG9seWdvbi5iXSwgKlZbal0sICpWW2ldLCBkaiwgZGkpOworCQkJCQlwb2x5Z29uLkJbcG9seWdvbi5iXS56ID0gMDsKKwkJCQkJVFt0KytdID0gJnBvbHlnb24uQltwb2x5Z29uLmIrK107CisJCQkJfQorCQkJfQorCQl9CisKKwkJcG9seWdvbi5uID0gdDsKKwkJcG9seWdvbi5pICs9IDE7CisJfQorCisJdm9pZCBDbGlwcGVyOjpjbGlwRmFyKFBvbHlnb24gJnBvbHlnb24pCisJeworCQlpZihwb2x5Z29uLm4gPT0gMCkgcmV0dXJuOworCisJCWNvbnN0IGZsb2F0NCAqKlYgPSBwb2x5Z29uLlBbcG9seWdvbi5pXTsKKwkJY29uc3QgZmxvYXQ0ICoqVCA9IHBvbHlnb24uUFtwb2x5Z29uLmkgKyAxXTsKKworCQlpbnQgdCA9IDA7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IHBvbHlnb24ubjsgaSsrKQorCQl7CisJCQlpbnQgaiA9IGkgPT0gcG9seWdvbi5uIC0gMSA/IDAgOiBpICsgMTsKKworCQkJZmxvYXQgZGkgPSBWW2ldLT53IC0gVltpXS0+ejsKKwkJCWZsb2F0IGRqID0gVltqXS0+dyAtIFZbal0tPno7CisKKwkJCWlmKGRpID49IDApCisJCQl7CisJCQkJVFt0KytdID0gVltpXTsKKworCQkJCWlmKGRqIDwgMCkKKwkJCQl7CisJCQkJCWNsaXBFZGdlKHBvbHlnb24uQltwb2x5Z29uLmJdLCAqVltpXSwgKlZbal0sIGRpLCBkaik7CisJCQkJCXBvbHlnb24uQltwb2x5Z29uLmJdLnogPSBwb2x5Z29uLkJbcG9seWdvbi5iXS53OworCQkJCQlUW3QrK10gPSAmcG9seWdvbi5CW3BvbHlnb24uYisrXTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoZGogPiAwKQorCQkJCXsKKwkJCQkJY2xpcEVkZ2UocG9seWdvbi5CW3BvbHlnb24uYl0sICpWW2pdLCAqVltpXSwgZGosIGRpKTsKKwkJCQkJcG9seWdvbi5CW3BvbHlnb24uYl0ueiA9IHBvbHlnb24uQltwb2x5Z29uLmJdLnc7CisJCQkJCVRbdCsrXSA9ICZwb2x5Z29uLkJbcG9seWdvbi5iKytdOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXBvbHlnb24ubiA9IHQ7CisJCXBvbHlnb24uaSArPSAxOworCX0KKworCXZvaWQgQ2xpcHBlcjo6Y2xpcExlZnQoUG9seWdvbiAmcG9seWdvbiwgY29uc3QgRHJhd0RhdGEgJmRhdGEpCisJeworCQlpZihwb2x5Z29uLm4gPT0gMCkgcmV0dXJuOworCisJCWNvbnN0IGZsb2F0NCAqKlYgPSBwb2x5Z29uLlBbcG9seWdvbi5pXTsKKwkJY29uc3QgZmxvYXQ0ICoqVCA9IHBvbHlnb24uUFtwb2x5Z29uLmkgKyAxXTsKKworCQlpbnQgdCA9IDA7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IHBvbHlnb24ubjsgaSsrKQorCQl7CisJCQlpbnQgaiA9IGkgPT0gcG9seWdvbi5uIC0gMSA/IDAgOiBpICsgMTsKKworCQkJZmxvYXQgZGkgPSBWW2ldLT53ICsgKFZbaV0tPnggKyBkYXRhLm9mZlhbMF0gKiBWW2ldLT53KTsKKwkJCWZsb2F0IGRqID0gVltqXS0+dyArIChWW2pdLT54ICsgZGF0YS5vZmZYWzBdICogVltqXS0+dyk7CisKKwkJCWlmKGRpID49IDApCisJCQl7CisJCQkJVFt0KytdID0gVltpXTsKKworCQkJCWlmKGRqIDwgMCkKKwkJCQl7CisJCQkJCWNsaXBFZGdlKHBvbHlnb24uQltwb2x5Z29uLmJdLCAqVltpXSwgKlZbal0sIGRpLCBkaik7CisJCQkJLy8JcG9seWdvbi5CW3BvbHlnb24uYl0ueCA9IC1wb2x5Z29uLkJbcG9seWdvbi5iXS53OworCQkJCQlUW3QrK10gPSAmcG9seWdvbi5CW3BvbHlnb24uYisrXTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoZGogPiAwKQorCQkJCXsKKwkJCQkJY2xpcEVkZ2UocG9seWdvbi5CW3BvbHlnb24uYl0sICpWW2pdLCAqVltpXSwgZGosIGRpKTsKKwkJCQkvLwlwb2x5Z29uLkJbcG9seWdvbi5iXS54ID0gLXBvbHlnb24uQltwb2x5Z29uLmJdLnc7CisJCQkJCVRbdCsrXSA9ICZwb2x5Z29uLkJbcG9seWdvbi5iKytdOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXBvbHlnb24ubiA9IHQ7CisJCXBvbHlnb24uaSArPSAxOworCX0KKworCXZvaWQgQ2xpcHBlcjo6Y2xpcFJpZ2h0KFBvbHlnb24gJnBvbHlnb24sIGNvbnN0IERyYXdEYXRhICZkYXRhKQorCXsKKwkJaWYocG9seWdvbi5uID09IDApIHJldHVybjsKKworCQljb25zdCBmbG9hdDQgKipWID0gcG9seWdvbi5QW3BvbHlnb24uaV07CisJCWNvbnN0IGZsb2F0NCAqKlQgPSBwb2x5Z29uLlBbcG9seWdvbi5pICsgMV07CisKKwkJaW50IHQgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCBwb2x5Z29uLm47IGkrKykKKwkJeworCQkJaW50IGogPSBpID09IHBvbHlnb24ubiAtIDEgPyAwIDogaSArIDE7CisKKwkJCWZsb2F0IGRpID0gVltpXS0+dyAtIChWW2ldLT54ICsgZGF0YS5vZmZYWzBdICogVltpXS0+dyk7CisJCQlmbG9hdCBkaiA9IFZbal0tPncgLSAoVltqXS0+eCArIGRhdGEub2ZmWFswXSAqIFZbal0tPncpOworCisJCQlpZihkaSA+PSAwKQorCQkJeworCQkJCVRbdCsrXSA9IFZbaV07CisKKwkJCQlpZihkaiA8IDApCisJCQkJeworCQkJCQljbGlwRWRnZShwb2x5Z29uLkJbcG9seWdvbi5iXSwgKlZbaV0sICpWW2pdLCBkaSwgZGopOworCQkJCS8vCXBvbHlnb24uQltwb2x5Z29uLmJdLnggPSBwb2x5Z29uLkJbcG9seWdvbi5iXS53OworCQkJCQlUW3QrK10gPSAmcG9seWdvbi5CW3BvbHlnb24uYisrXTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoZGogPiAwKQorCQkJCXsKKwkJCQkJY2xpcEVkZ2UocG9seWdvbi5CW3BvbHlnb24uYl0sICpWW2pdLCAqVltpXSwgZGosIGRpKTsKKwkJCQkvLwlwb2x5Z29uLkJbcG9seWdvbi5iXS54ID0gcG9seWdvbi5CW3BvbHlnb24uYl0udzsKKwkJCQkJVFt0KytdID0gJnBvbHlnb24uQltwb2x5Z29uLmIrK107CisJCQkJfQorCQkJfQorCQl9CisKKwkJcG9seWdvbi5uID0gdDsKKwkJcG9seWdvbi5pICs9IDE7CisJfQorCisJdm9pZCBDbGlwcGVyOjpjbGlwVG9wKFBvbHlnb24gJnBvbHlnb24sIGNvbnN0IERyYXdEYXRhICZkYXRhKQorCXsKKwkJaWYocG9seWdvbi5uID09IDApIHJldHVybjsKKworCQljb25zdCBmbG9hdDQgKipWID0gcG9seWdvbi5QW3BvbHlnb24uaV07CisJCWNvbnN0IGZsb2F0NCAqKlQgPSBwb2x5Z29uLlBbcG9seWdvbi5pICsgMV07CisKKwkJaW50IHQgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCBwb2x5Z29uLm47IGkrKykKKwkJeworCQkJaW50IGogPSBpID09IHBvbHlnb24ubiAtIDEgPyAwIDogaSArIDE7CisKKwkJCWZsb2F0IGRpID0gVltpXS0+dyAtIChWW2ldLT55ICsgZGF0YS5vZmZZWzBdICogVltpXS0+dyk7CisJCQlmbG9hdCBkaiA9IFZbal0tPncgLSAoVltqXS0+eSArIGRhdGEub2ZmWVswXSAqIFZbal0tPncpOworCisJCQlpZihkaSA+PSAwKQorCQkJeworCQkJCVRbdCsrXSA9IFZbaV07CisKKwkJCQlpZihkaiA8IDApCisJCQkJeworCQkJCQljbGlwRWRnZShwb2x5Z29uLkJbcG9seWdvbi5iXSwgKlZbaV0sICpWW2pdLCBkaSwgZGopOworCQkJCS8vCXBvbHlnb24uQltwb2x5Z29uLmJdLnkgPSBwb2x5Z29uLkJbcG9seWdvbi5iXS53OworCQkJCQlUW3QrK10gPSAmcG9seWdvbi5CW3BvbHlnb24uYisrXTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoZGogPiAwKQorCQkJCXsKKwkJCQkJY2xpcEVkZ2UocG9seWdvbi5CW3BvbHlnb24uYl0sICpWW2pdLCAqVltpXSwgZGosIGRpKTsKKwkJCQkvLwlwb2x5Z29uLkJbcG9seWdvbi5iXS55ID0gcG9seWdvbi5CW3BvbHlnb24uYl0udzsKKwkJCQkJVFt0KytdID0gJnBvbHlnb24uQltwb2x5Z29uLmIrK107CisJCQkJfQorCQkJfQorCQl9CisKKwkJcG9seWdvbi5uID0gdDsKKwkJcG9seWdvbi5pICs9IDE7CisJfQorCisJdm9pZCBDbGlwcGVyOjpjbGlwQm90dG9tKFBvbHlnb24gJnBvbHlnb24sIGNvbnN0IERyYXdEYXRhICZkYXRhKQorCXsKKwkJaWYocG9seWdvbi5uID09IDApIHJldHVybjsKKworCQljb25zdCBmbG9hdDQgKipWID0gcG9seWdvbi5QW3BvbHlnb24uaV07CisJCWNvbnN0IGZsb2F0NCAqKlQgPSBwb2x5Z29uLlBbcG9seWdvbi5pICsgMV07CisKKwkJaW50IHQgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCBwb2x5Z29uLm47IGkrKykKKwkJeworCQkJaW50IGogPSBpID09IHBvbHlnb24ubiAtIDEgPyAwIDogaSArIDE7CisKKwkJCWZsb2F0IGRpID0gVltpXS0+dyArIChWW2ldLT55ICsgZGF0YS5vZmZZWzBdICogVltpXS0+dyk7CisJCQlmbG9hdCBkaiA9IFZbal0tPncgKyAoVltqXS0+eSArIGRhdGEub2ZmWVswXSAqIFZbal0tPncpOworCisJCQlpZihkaSA+PSAwKQorCQkJeworCQkJCVRbdCsrXSA9IFZbaV07CisKKwkJCQlpZihkaiA8IDApCisJCQkJeworCQkJCQljbGlwRWRnZShwb2x5Z29uLkJbcG9seWdvbi5iXSwgKlZbaV0sICpWW2pdLCBkaSwgZGopOworCQkJCS8vCXBvbHlnb24uQltwb2x5Z29uLmJdLnkgPSAtcG9seWdvbi5CW3BvbHlnb24uYl0udzsKKwkJCQkJVFt0KytdID0gJnBvbHlnb24uQltwb2x5Z29uLmIrK107CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKGRqID4gMCkKKwkJCQl7CisJCQkJCWNsaXBFZGdlKHBvbHlnb24uQltwb2x5Z29uLmJdLCAqVltqXSwgKlZbaV0sIGRqLCBkaSk7CisJCQkJLy8JcG9seWdvbi5CW3BvbHlnb24uYl0ueSA9IC1wb2x5Z29uLkJbcG9seWdvbi5iXS53OworCQkJCQlUW3QrK10gPSAmcG9seWdvbi5CW3BvbHlnb24uYisrXTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwb2x5Z29uLm4gPSB0OworCQlwb2x5Z29uLmkgKz0gMTsKKwl9CisKKwl2b2lkIENsaXBwZXI6OmNsaXBQbGFuZShQb2x5Z29uICZwb2x5Z29uLCBjb25zdCBQbGFuZSAmcCkKKwl7CisJCWlmKHBvbHlnb24ubiA9PSAwKSByZXR1cm47CisKKwkJY29uc3QgZmxvYXQ0ICoqViA9IHBvbHlnb24uUFtwb2x5Z29uLmldOworCQljb25zdCBmbG9hdDQgKipUID0gcG9seWdvbi5QW3BvbHlnb24uaSArIDFdOworCisJCWludCB0ID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgcG9seWdvbi5uOyBpKyspCisJCXsKKwkJCWludCBqID0gaSA9PSBwb2x5Z29uLm4gLSAxID8gMCA6IGkgKyAxOworCisJCQlmbG9hdCBkaSA9IHAuQSAqIFZbaV0tPnggKyBwLkIgKiBWW2ldLT55ICsgcC5DICogVltpXS0+eiArIHAuRCAqIFZbaV0tPnc7CisJCQlmbG9hdCBkaiA9IHAuQSAqIFZbal0tPnggKyBwLkIgKiBWW2pdLT55ICsgcC5DICogVltqXS0+eiArIHAuRCAqIFZbal0tPnc7CisKKwkJCWlmKGRpID49IDApCisJCQl7CisJCQkJVFt0KytdID0gVltpXTsKKworCQkJCWlmKGRqIDwgMCkKKwkJCQl7CisJCQkJCWNsaXBFZGdlKHBvbHlnb24uQltwb2x5Z29uLmJdLCAqVltpXSwgKlZbal0sIGRpLCBkaik7CisJCQkJCVRbdCsrXSA9ICZwb2x5Z29uLkJbcG9seWdvbi5iKytdOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZihkaiA+IDApCisJCQkJeworCQkJCQljbGlwRWRnZShwb2x5Z29uLkJbcG9seWdvbi5iXSwgKlZbal0sICpWW2ldLCBkaiwgZGkpOworCQkJCQlUW3QrK10gPSAmcG9seWdvbi5CW3BvbHlnb24uYisrXTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwb2x5Z29uLm4gPSB0OworCQlwb2x5Z29uLmkgKz0gMTsKKwl9CisKKwlpbmxpbmUgdm9pZCBDbGlwcGVyOjpjbGlwRWRnZShmbG9hdDQgJlZvLCBjb25zdCBmbG9hdDQgJlZpLCBjb25zdCBmbG9hdDQgJlZqLCBmbG9hdCBkaSwgZmxvYXQgZGopIGNvbnN0CisJeworCQlmbG9hdCBEID0gMS4wZiAvIChkaiAtIGRpKTsKKworCQlWby54ID0gKGRqICogVmkueCAtIGRpICogVmoueCkgKiBEOworCQlWby55ID0gKGRqICogVmkueSAtIGRpICogVmoueSkgKiBEOworCQlWby56ID0gKGRqICogVmkueiAtIGRpICogVmoueikgKiBEOworCQlWby53ID0gKGRqICogVmkudyAtIGRpICogVmoudykgKiBEOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9DbGlwcGVyLmhwcCBiL3NyYy9SZW5kZXJlci9DbGlwcGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2E3YjBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlbmRlcmVyL0NsaXBwZXIuaHBwCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBzd19DbGlwcGVyX2hwcAorI2RlZmluZSBzd19DbGlwcGVyX2hwcAorCisjaW5jbHVkZSAiUGxhbmUuaHBwIgorI2luY2x1ZGUgIkNvbW1vbi9UeXBlcy5ocHAiCisKK25hbWVzcGFjZSBzdworeworCXN0cnVjdCBQb2x5Z29uOworCXN0cnVjdCBEcmF3Q2FsbDsKKwlzdHJ1Y3QgRHJhd0RhdGE7CisKKwljbGFzcyBDbGlwcGVyCisJeworCXB1YmxpYzoKKwkJZW51bSBDbGlwRmxhZ3MKKwkJeworCQkJQ0xJUF9SSUdIVCAgPSAxIDw8IDAsCisJCQlDTElQX1RPUCAgICA9IDEgPDwgMSwKKwkJCUNMSVBfRkFSICAgID0gMSA8PCAyLAorCQkJQ0xJUF9MRUZUICAgPSAxIDw8IDMsCisJCQlDTElQX0JPVFRPTSA9IDEgPDwgNCwKKwkJCUNMSVBfTkVBUiAgID0gMSA8PCA1LAorCisJCQlDTElQX0ZJTklURSA9IDEgPDwgNywKKworCQkJLy8gVXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcworCQkJQ0xJUF9QTEFORTAJPSAxIDw8IDgsCisJCQlDTElQX1BMQU5FMQk9IDEgPDwgOSwKKwkJCUNMSVBfUExBTkUyCT0gMSA8PCAxMCwKKwkJCUNMSVBfUExBTkUzCT0gMSA8PCAxMSwKKwkJCUNMSVBfUExBTkU0CT0gMSA8PCAxMiwKKwkJCUNMSVBfUExBTkU1CT0gMSA8PCAxMworCQl9OworCisJCUNsaXBwZXIoKTsKKworCQl+Q2xpcHBlcigpOworCisJCWJvb2wgY2xpcChQb2x5Z29uICZwb2x5Z29uLCBpbnQgY2xpcEZsYWdzT3IsIGNvbnN0IERyYXdDYWxsICZkcmF3KTsKKworCXByaXZhdGU6CisJCXZvaWQgY2xpcE5lYXIoUG9seWdvbiAmcG9seWdvbik7CisJCXZvaWQgY2xpcEZhcihQb2x5Z29uICZwb2x5Z29uKTsKKwkJdm9pZCBjbGlwTGVmdChQb2x5Z29uICZwb2x5Z29uLCBjb25zdCBEcmF3RGF0YSAmZGF0YSk7CisJCXZvaWQgY2xpcFJpZ2h0KFBvbHlnb24gJnBvbHlnb24sIGNvbnN0IERyYXdEYXRhICZkYXRhKTsKKwkJdm9pZCBjbGlwVG9wKFBvbHlnb24gJnBvbHlnb24sIGNvbnN0IERyYXdEYXRhICZkYXRhKTsKKwkJdm9pZCBjbGlwQm90dG9tKFBvbHlnb24gJnBvbHlnb24sIGNvbnN0IERyYXdEYXRhICZkYXRhKTsKKwkJdm9pZCBjbGlwUGxhbmUoUG9seWdvbiAmcG9seWdvbiwgY29uc3QgUGxhbmUgJnBsYW5lKTsKKworCQl2b2lkIGNsaXBFZGdlKGZsb2F0NCAmVm8sIGNvbnN0IGZsb2F0NCAmVmksIGNvbnN0IGZsb2F0NCAmVmosIGZsb2F0IGRpLCBmbG9hdCBkaikgY29uc3Q7CisJfTsKK30KKworI2VuZGlmICAgLy8gc3dfQ2xpcHBlcl9ocHAKZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9Db2xvci5jcHAgYi9zcmMvUmVuZGVyZXIvQ29sb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjU0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvQ29sb3IuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIkNvbG9yLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7Cit9CmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvQ29sb3IuaHBwIGIvc3JjL1JlbmRlcmVyL0NvbG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZlODk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlbmRlcmVyL0NvbG9yLmhwcApAQCAtMCwwICsxLDQ0MyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIHN3X0NvbG9yX2hwcAorI2RlZmluZSBzd19Db2xvcl9ocHAKKworI2luY2x1ZGUgIkNvbW1vbi9UeXBlcy5ocHAiCisjaW5jbHVkZSAiQ29tbW9uL01hdGguaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwl0ZW1wbGF0ZTxjbGFzcyBUPgorCXN0cnVjdCBDb2xvcgorCXsKKwkJQ29sb3IoKTsKKwkJCisJCUNvbG9yKGNvbnN0IENvbG9yPGJ5dGU+ICZjKTsKKwkJQ29sb3IoY29uc3QgQ29sb3I8c2hvcnQ+ICZjKTsKKwkJQ29sb3IoY29uc3QgQ29sb3I8ZmxvYXQ+ICZjKTsKKwkJCisJCUNvbG9yKGludCBjKTsKKwkJQ29sb3IodW5zaWduZWQgc2hvcnQgYyk7CisJCUNvbG9yKHVuc2lnbmVkIGxvbmcgYyk7CisJCUNvbG9yKHVuc2lnbmVkIGludCBjKTsKKwkJCisJCUNvbG9yKFQgciwgVCBnLCBUIGIsIFQgYSA9IDEpOworCisJCW9wZXJhdG9yIHVuc2lnbmVkIGludCgpIGNvbnN0OworCisJCVQgJm9wZXJhdG9yW10oaW50IGkpOworCQljb25zdCBUICZvcGVyYXRvcltdKGludCBpKSBjb25zdDsKKworCQlDb2xvciBvcGVyYXRvcisoKSBjb25zdDsKKwkJQ29sb3Igb3BlcmF0b3ItKCkgY29uc3Q7CisKKwkJQ29sb3ImIG9wZXJhdG9yPShjb25zdCBDb2xvciYgYyk7CisKKwkJQ29sb3IgJm9wZXJhdG9yKz0oY29uc3QgQ29sb3IgJmMpOworCQlDb2xvciAmb3BlcmF0b3IqPShmbG9hdCBsKTsKKworCQlzdGF0aWMgQ29sb3IgZ3JhZGllbnQoY29uc3QgQ29sb3IgJmMxLCBjb25zdCBDb2xvciAgJmMyLCBmbG9hdCBkKTsKKwkJc3RhdGljIENvbG9yIHNoYWRlKGNvbnN0IENvbG9yICZjMSwgY29uc3QgQ29sb3IgICZjMiwgZmxvYXQgZCk7CisKKwkJdGVtcGxhdGU8Y2xhc3MgVD4KKwkJZnJpZW5kIENvbG9yIG9wZXJhdG9yKyhjb25zdCBDb2xvciAmYzEsIGNvbnN0IENvbG9yICZjMik7CisJCXRlbXBsYXRlPGNsYXNzIFQ+CisJCWZyaWVuZCBDb2xvciBvcGVyYXRvci0oY29uc3QgQ29sb3IgJmMxLCBjb25zdCBDb2xvciAmYzIpOworCisJCXRlbXBsYXRlPGNsYXNzIFQ+CisJCWZyaWVuZCBDb2xvciBvcGVyYXRvciooZmxvYXQgbCwgY29uc3QgQ29sb3IgJmMpOworCQl0ZW1wbGF0ZTxjbGFzcyBUPgorCQlmcmllbmQgQ29sb3Igb3BlcmF0b3IqKGNvbnN0IENvbG9yICZjMSwgY29uc3QgQ29sb3IgJmMyKTsKKwkJdGVtcGxhdGU8Y2xhc3MgVD4KKwkJZnJpZW5kIENvbG9yIG9wZXJhdG9yLyhjb25zdCBDb2xvciAmYywgZmxvYXQgbCk7CisKKwkJVCByOworCQlUIGc7CisJCVQgYjsKKwkJVCBhOworCX07Cit9CisKKyNpbmNsdWRlICJDb21tb24vTWF0aC5ocHAiCisKK25hbWVzcGFjZSBzdworeworCXRlbXBsYXRlPGNsYXNzIFQ+CisJaW5saW5lIENvbG9yPFQ+OjpDb2xvcigpCisJeworCX0KKworCWlubGluZSBDb2xvcjxieXRlPjo6Q29sb3IoY29uc3QgQ29sb3I8Ynl0ZT4gJmMpCisJeworCQlyID0gYy5yOworCQlnID0gYy5nOworCQliID0gYy5iOworCQlhID0gYy5hOworCX0KKworCWlubGluZSBDb2xvcjxieXRlPjo6Q29sb3IoY29uc3QgQ29sb3I8c2hvcnQ+ICZjKQorCXsKKwkJciA9IGNsYW1wKGMuciA+PiA0LCAwLCAyNTUpOworCQlnID0gY2xhbXAoYy5nID4+IDQsIDAsIDI1NSk7CisJCWIgPSBjbGFtcChjLmIgPj4gNCwgMCwgMjU1KTsKKwkJYSA9IGNsYW1wKGMuYSA+PiA0LCAwLCAyNTUpOworCX0KKworCWlubGluZSBDb2xvcjxieXRlPjo6Q29sb3IoY29uc3QgQ29sb3I8ZmxvYXQ+ICZjKQorCXsKKwkJciA9IGlmbG9vcihjbGFtcChjLnIgKiAyNTYuMGYsIDAuMGYsIDI1NS4wZikpOworCQlnID0gaWZsb29yKGNsYW1wKGMuZyAqIDI1Ni4wZiwgMC4wZiwgMjU1LjBmKSk7CisJCWIgPSBpZmxvb3IoY2xhbXAoYy5iICogMjU2LjBmLCAwLjBmLCAyNTUuMGYpKTsKKwkJYSA9IGlmbG9vcihjbGFtcChjLmEgKiAyNTYuMGYsIDAuMGYsIDI1NS4wZikpOworCX0KKworCWlubGluZSBDb2xvcjxzaG9ydD46OkNvbG9yKGNvbnN0IENvbG9yPHNob3J0PiAmYykKKwl7CisJCXIgPSBjLnI7CisJCWcgPSBjLmc7CisJCWIgPSBjLmI7CisJCWEgPSBjLmE7CisJfQorCisJaW5saW5lIENvbG9yPHNob3J0Pjo6Q29sb3IoY29uc3QgQ29sb3I8Ynl0ZT4gJmMpCisJeworCQlyID0gYy5yIDw8IDQ7CisJCWcgPSBjLmcgPDwgNDsKKwkJYiA9IGMuYiA8PCA0OworCQlhID0gYy5hIDw8IDQ7CisJfQorCisJaW5saW5lIENvbG9yPGZsb2F0Pjo6Q29sb3IoY29uc3QgQ29sb3I8ZmxvYXQ+ICZjKQorCXsKKwkJciA9IGMucjsKKwkJZyA9IGMuZzsKKwkJYiA9IGMuYjsKKwkJYSA9IGMuYTsKKwl9CisKKwlpbmxpbmUgQ29sb3I8c2hvcnQ+OjpDb2xvcihjb25zdCBDb2xvcjxmbG9hdD4gJmMpCisJeworCQlyID0gaXJvdW5kKGNsYW1wKGMuciAqIDQwOTUuMGYsIC00MDk2LjBmLCA0MDk1LjBmKSk7CisJCWcgPSBpcm91bmQoY2xhbXAoYy5nICogNDA5NS4wZiwgLTQwOTYuMGYsIDQwOTUuMGYpKTsKKwkJYiA9IGlyb3VuZChjbGFtcChjLmIgKiA0MDk1LjBmLCAtNDA5Ni4wZiwgNDA5NS4wZikpOworCQlhID0gaXJvdW5kKGNsYW1wKGMuYSAqIDQwOTUuMGYsIC00MDk2LjBmLCA0MDk1LjBmKSk7CisJfQorCisJaW5saW5lIENvbG9yPGZsb2F0Pjo6Q29sb3IoY29uc3QgQ29sb3I8Ynl0ZT4gJmMpCisJeworCQlyID0gYy5yIC8gMjU1LjBmOworCQlnID0gYy5nIC8gMjU1LjBmOworCQliID0gYy5iIC8gMjU1LjBmOworCQlhID0gYy5hIC8gMjU1LjBmOworCX0KKworCWlubGluZSBDb2xvcjxmbG9hdD46OkNvbG9yKGNvbnN0IENvbG9yPHNob3J0PiAmYykKKwl7CisJCXIgPSBjLnIgLyA0MDk1LjBmOworCQlnID0gYy5nIC8gNDA5NS4wZjsKKwkJYiA9IGMuYiAvIDQwOTUuMGY7CisJCWEgPSBjLmEgLyA0MDk1LjBmOworCX0KKworCWlubGluZSBDb2xvcjxmbG9hdD46OkNvbG9yKHVuc2lnbmVkIHNob3J0IGMpCisJeworCQlyID0gKGZsb2F0KShjICYgMHhGODAwKSAvIChmbG9hdCkweEY4MDA7CisJCWcgPSAoZmxvYXQpKGMgJiAweDA3RTApIC8gKGZsb2F0KTB4MDdFMDsKKwkJYiA9IChmbG9hdCkoYyAmIDB4MDAxRikgLyAoZmxvYXQpMHgwMDFGOworCQlhID0gMTsKKwl9CisKKwlpbmxpbmUgQ29sb3I8c2hvcnQ+OjpDb2xvcih1bnNpZ25lZCBzaG9ydCBjKQorCXsKKwkJLy8gNC4xMiBmaXhlZC1wb2ludCBmb3JtYXQKKwkJciA9ICgoYyAmIDB4RjgwMCkgPj4gNCkgKyAoKGMgJiAweEY4MDApID4+IDkpICsgKChjICYgMHhGODAwKSA+PiAxNCk7CisJCWcgPSAoKGMgJiAweDA3RTApIDw8IDEpICsgKChjICYgMHgwN0UwKSA+PiA1KTsKKwkJYiA9ICgoYyAmIDB4MDAxRikgPDwgNykgKyAoKGMgJiAweDAwMUYpIDw8IDIpICsgKChjICYgMHgwMDFGKSA+PiAzKTsKKwkJYSA9IDB4MTAwMDsKKwl9CisKKwlpbmxpbmUgQ29sb3I8Ynl0ZT46OkNvbG9yKHVuc2lnbmVkIHNob3J0IGMpCisJeworCQlyID0gKGJ5dGUpKCgoYyAmIDB4RjgwMCkgPj4gOCkgKyAoKGMgJiAweEUwMDApID4+IDEzKSk7CisJCWcgPSAoYnl0ZSkoKChjICYgMHgwN0UwKSA+PiAzKSArICgoYyAmIDB4MDYwMCkgPj4gOSkpOworCQliID0gKGJ5dGUpKCgoYyAmIDB4MDAxRikgPDwgMykgKyAoKGMgJiAweDAwMUMpID4+IDIpKTsKKwkJYSA9IDB4RkY7CisJfQorCisJaW5saW5lIENvbG9yPGZsb2F0Pjo6Q29sb3IoaW50IGMpCisJeworCQljb25zdCBmbG9hdCBkID0gMS4wZiAvIDI1NS4wZjsKKworCQlyID0gKGZsb2F0KSgoYyAmIDB4MDBGRjAwMDApID4+IDE2KSAqIGQ7CisJCWcgPSAoZmxvYXQpKChjICYgMHgwMDAwRkYwMCkgPj4gOCkgKiBkOworCQliID0gKGZsb2F0KSgoYyAmIDB4MDAwMDAwRkYpID4+IDApICogZDsKKwkJYSA9IChmbG9hdCkoKGMgJiAweEZGMDAwMDAwKSA+PiAyNCkgKiBkOworCX0KKworCWlubGluZSBDb2xvcjxzaG9ydD46OkNvbG9yKGludCBjKQorCXsKKwkJLy8gNC4xMiBmaXhlZC1wb2ludCBmb3JtYXQKKwkJciA9IChzaG9ydCkoKGMgJiAweDAwRkYwMDAwKSA+PiAxMik7CisJCWcgPSAoc2hvcnQpKChjICYgMHgwMDAwRkYwMCkgPj4gNCk7CisJCWIgPSAoc2hvcnQpKChjICYgMHgwMDAwMDBGRikgPDwgNCk7CisJCWEgPSAoc2hvcnQpKChjICYgMHhGRjAwMDAwMCkgPj4gMjApOworCX0KKworCWlubGluZSBDb2xvcjxieXRlPjo6Q29sb3IoaW50IGMpCisJeworCQlyID0gKGJ5dGUpKChjICYgMHgwMEZGMDAwMCkgPj4gMTYpOworCQlnID0gKGJ5dGUpKChjICYgMHgwMDAwRkYwMCkgPj4gOCk7CisJCWIgPSAoYnl0ZSkoKGMgJiAweDAwMDAwMEZGKSA+PiAwKTsKKwkJYSA9IChieXRlKSgoYyAmIDB4RkYwMDAwMDApID4+IDI0KTsKKwl9CisKKwlpbmxpbmUgQ29sb3I8ZmxvYXQ+OjpDb2xvcih1bnNpZ25lZCBpbnQgYykKKwl7CisJCWNvbnN0IGZsb2F0IGQgPSAxLjBmIC8gMjU1LjBmOworCisJCXIgPSAoZmxvYXQpKChjICYgMHgwMEZGMDAwMCkgPj4gMTYpICogZDsKKwkJZyA9IChmbG9hdCkoKGMgJiAweDAwMDBGRjAwKSA+PiA4KSAqIGQ7CisJCWIgPSAoZmxvYXQpKChjICYgMHgwMDAwMDBGRikgPj4gMCkgKiBkOworCQlhID0gKGZsb2F0KSgoYyAmIDB4RkYwMDAwMDApID4+IDI0KSAqIGQ7CisJfQorCisJaW5saW5lIENvbG9yPHNob3J0Pjo6Q29sb3IodW5zaWduZWQgaW50IGMpCisJeworCQkvLyA0LjEyIGZpeGVkLXBvaW50IGZvcm1hdAorCQlyID0gKHNob3J0KSgoYyAmIDB4MDBGRjAwMDApID4+IDEyKTsKKwkJZyA9IChzaG9ydCkoKGMgJiAweDAwMDBGRjAwKSA+PiA0KTsKKwkJYiA9IChzaG9ydCkoKGMgJiAweDAwMDAwMEZGKSA8PCA0KTsKKwkJYSA9IChzaG9ydCkoKGMgJiAweEZGMDAwMDAwKSA+PiAyMCk7CisJfQorCisJaW5saW5lIENvbG9yPGJ5dGU+OjpDb2xvcih1bnNpZ25lZCBpbnQgYykKKwl7CisJCXIgPSAoYnl0ZSkoKGMgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCWcgPSAoYnl0ZSkoKGMgJiAweDAwMDBGRjAwKSA+PiA4KTsKKwkJYiA9IChieXRlKSgoYyAmIDB4MDAwMDAwRkYpID4+IDApOworCQlhID0gKGJ5dGUpKChjICYgMHhGRjAwMDAwMCkgPj4gMjQpOworCX0KKworCWlubGluZSBDb2xvcjxmbG9hdD46OkNvbG9yKHVuc2lnbmVkIGxvbmcgYykKKwl7CisJCWNvbnN0IGZsb2F0IGQgPSAxLjBmIC8gMjU1LjBmOworCisJCXIgPSAoZmxvYXQpKChjICYgMHgwMEZGMDAwMCkgPj4gMTYpICogZDsKKwkJZyA9IChmbG9hdCkoKGMgJiAweDAwMDBGRjAwKSA+PiA4KSAqIGQ7CisJCWIgPSAoZmxvYXQpKChjICYgMHgwMDAwMDBGRikgPj4gMCkgKiBkOworCQlhID0gKGZsb2F0KSgoYyAmIDB4RkYwMDAwMDApID4+IDI0KSAqIGQ7CisJfQorCisJaW5saW5lIENvbG9yPHNob3J0Pjo6Q29sb3IodW5zaWduZWQgbG9uZyBjKQorCXsKKwkJLy8gNC4xMiBmaXhlZC1wb2ludCBmb3JtYXQKKwkJciA9IChzaG9ydCkoKGMgJiAweDAwRkYwMDAwKSA+PiAxMik7CisJCWcgPSAoc2hvcnQpKChjICYgMHgwMDAwRkYwMCkgPj4gNCk7CisJCWIgPSAoc2hvcnQpKChjICYgMHgwMDAwMDBGRikgPDwgNCk7CisJCWEgPSAoc2hvcnQpKChjICYgMHhGRjAwMDAwMCkgPj4gMjApOworCX0KKworCWlubGluZSBDb2xvcjxieXRlPjo6Q29sb3IodW5zaWduZWQgbG9uZyBjKQorCXsKKwkJciA9IChieXRlKSgoYyAmIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJZyA9IChieXRlKSgoYyAmIDB4MDAwMEZGMDApID4+IDgpOworCQliID0gKGJ5dGUpKChjICYgMHgwMDAwMDBGRikgPj4gMCk7CisJCWEgPSAoYnl0ZSkoKGMgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVD4KKwlpbmxpbmUgQ29sb3I8VD46OkNvbG9yKFQgcl8sIFQgZ18sIFQgYl8sIFQgYV8pCisJeworCQlyID0gcl87CisJCWcgPSBnXzsKKwkJYiA9IGJfOworCQlhID0gYV87CisJfQorCisJaW5saW5lIENvbG9yPGZsb2F0Pjo6b3BlcmF0b3IgdW5zaWduZWQgaW50KCkgY29uc3QKKwl7CisJCXJldHVybiAoKHVuc2lnbmVkIGludCltaW4oYiAqIDI1NS4wZiwgMjU1LjBmKSA8PCAwKSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCltaW4oZyAqIDI1NS4wZiwgMjU1LjBmKSA8PCA4KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCltaW4ociAqIDI1NS4wZiwgMjU1LjBmKSA8PCAxNikgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpbWluKGEgKiAyNTUuMGYsIDI1NS4wZikgPDwgMjQpOworCX0KKworCWlubGluZSBDb2xvcjxzaG9ydD46Om9wZXJhdG9yIHVuc2lnbmVkIGludCgpIGNvbnN0CisJeworCQlyZXR1cm4gKCh1bnNpZ25lZCBpbnQpbWluKGIgPj4gNCwgMjU1KSA8PCAwKSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCltaW4oZyA+PiA0LCAyNTUpIDw8IDgpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KW1pbihyID4+IDQsIDI1NSkgPDwgMTYpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KW1pbihhID4+IDQsIDI1NSkgPDwgMjQpOworCX0KKworCWlubGluZSBDb2xvcjxieXRlPjo6b3BlcmF0b3IgdW5zaWduZWQgaW50KCkgY29uc3QKKwl7CisJCXJldHVybiAoYiA8PCAwKSArCisJCSAgICAgICAoZyA8PCA4KSArCisJCSAgICAgICAociA8PCAxNikgKworCQkJICAgKGEgPDwgMjQpOworCX0KKworCXRlbXBsYXRlPGNsYXNzIFQ+CisJaW5saW5lIFQgJkNvbG9yPFQ+OjpvcGVyYXRvcltdKGludCBpKQorCXsKKwkJcmV0dXJuICgmcilbaV07CisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVD4KKwlpbmxpbmUgY29uc3QgVCAmQ29sb3I8VD46Om9wZXJhdG9yW10oaW50IGkpIGNvbnN0CisJeworCQlyZXR1cm4gKCZyKVtpXTsKKwl9CisKKwl0ZW1wbGF0ZTxjbGFzcyBUPgorCWlubGluZSBDb2xvcjxUPiBDb2xvcjxUPjo6b3BlcmF0b3IrKCkgY29uc3QKKwl7CisJCXJldHVybiAqdGhpczsKKwl9CisKKwl0ZW1wbGF0ZTxjbGFzcyBUPgorCWlubGluZSBDb2xvcjxUPiBDb2xvcjxUPjo6b3BlcmF0b3ItKCkgY29uc3QKKwl7CisJCXJldHVybiBDb2xvcigtciwgLWcsIC1iLCAtYSk7CisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVD4KKwlpbmxpbmUgQ29sb3I8VD4gJkNvbG9yPFQ+OjpvcGVyYXRvcj0oY29uc3QgQ29sb3ImIGMpCisJeworCQlyID0gYy5yOworCQlnID0gYy5nOworCQliID0gYy5iOworCQlhID0gYy5hOworCisJCXJldHVybiAqdGhpczsKKwl9CisKKwl0ZW1wbGF0ZTxjbGFzcyBUPgorCWlubGluZSBDb2xvcjxUPiAmQ29sb3I8VD46Om9wZXJhdG9yKz0oY29uc3QgQ29sb3IgJmMpCisJeworCQlyICs9IGMucjsKKwkJZyArPSBjLmc7CisJCWIgKz0gYy5iOworCQlhICs9IGMuYTsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVD4KKwlpbmxpbmUgQ29sb3I8VD4gJkNvbG9yPFQ+OjpvcGVyYXRvcio9KGZsb2F0IGwpCisJeworCQkqdGhpcyA9IGwgKiAqdGhpczsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVD4KKwlpbmxpbmUgQ29sb3I8VD4gb3BlcmF0b3IrKGNvbnN0IENvbG9yPFQ+ICZjMSwgY29uc3QgQ29sb3I8VD4gJmMyKQorCXsKKwkJcmV0dXJuIENvbG9yPFQ+KGMxLnIgKyBjMi5yLAorCQkgICAgICAgICAgICAgICAgYzEuZyArIGMyLmcsCisJCSAgICAgICAgICAgICAgICBjMS5iICsgYzIuYiwKKwkJICAgICAgICAgICAgICAgIGMxLmEgKyBjMi5hKTsJCisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVD4KKwlpbmxpbmUgQ29sb3I8VD4gb3BlcmF0b3ItKGNvbnN0IENvbG9yPFQ+ICZjMSwgY29uc3QgQ29sb3I8VD4gJmMyKQorCXsKKwkJcmV0dXJuIENvbG9yPFQ+KGMxLnIgLSBjMi5yLAorCQkgICAgICAgICAgICAgICAgYzEuZyAtIGMyLmcsCisJCSAgICAgICAgICAgICAgICBjMS5iIC0gYzIuYiwKKwkJICAgICAgICAgICAgICAgIGMxLmEgLSBjMi5hKTsJCisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVD4KKwlpbmxpbmUgQ29sb3I8VD4gb3BlcmF0b3IqKGZsb2F0IGwsIGNvbnN0IENvbG9yPFQ+ICZjKQorCXsKKwkJVCByID0gKFQpKGwgKiBjLnIpOworCQlUIGcgPSAoVCkobCAqIGMuZyk7CisJCVQgYiA9IChUKShsICogYy5iKTsKKwkJVCBhID0gKFQpKGwgKiBjLmEpOworCisJCXJldHVybiBDb2xvcjxUPihyLCBnLCBiLCBhKTsKKwl9CisKKwl0ZW1wbGF0ZTxjbGFzcyBUPgorCWlubGluZSBDb2xvcjxUPiBvcGVyYXRvciooY29uc3QgQ29sb3I8VD4gJmMxLCBjb25zdCBDb2xvcjxUPiAmYzIpCisJeworCQlUIHIgPSBjMS5yICogYzIucjsKKwkJVCBnID0gYzEuZyAqIGMyLmc7CisJCVQgYiA9IGMxLmIgKiBjMi5iOworCQlUIGEgPSBjMS5hICogYzIuYTsKKworCQlyZXR1cm4gQ29sb3I8VD4ociwgZywgYiwgYSk7CisJfQorCisJaW5saW5lIENvbG9yPHNob3J0PiBvcGVyYXRvciooY29uc3QgQ29sb3I8c2hvcnQ+ICZjMSwgY29uc3QgQ29sb3I8c2hvcnQ+ICZjMikKKwl7CisJCXNob3J0IHIgPSBjMS5yICogYzIuciA+PiAxMjsKKwkJc2hvcnQgZyA9IGMxLmcgKiBjMi5nID4+IDEyOworCQlzaG9ydCBiID0gYzEuYiAqIGMyLmIgPj4gMTI7CisJCXNob3J0IGEgPSBjMS5hICogYzIuYSA+PiAxMjsKKworCQlyZXR1cm4gQ29sb3I8c2hvcnQ+KHIsIGcsIGIsIGEpOworCX0KKworCWlubGluZSBDb2xvcjxieXRlPiBvcGVyYXRvciooY29uc3QgQ29sb3I8Ynl0ZT4gJmMxLCBjb25zdCBDb2xvcjxieXRlPiAmYzIpCisJeworCQlieXRlIHIgPSBjMS5yICogYzIuciA+PiA4OworCQlieXRlIGcgPSBjMS5nICogYzIuZyA+PiA4OworCQlieXRlIGIgPSBjMS5iICogYzIuYiA+PiA4OworCQlieXRlIGEgPSBjMS5hICogYzIuYSA+PiA4OworCisJCXJldHVybiBDb2xvcjxieXRlPihyLCBnLCBiLCBhKTsKKwl9CisKKwl0ZW1wbGF0ZTxjbGFzcyBUPgorCWlubGluZSBDb2xvcjxUPiBvcGVyYXRvci8oY29uc3QgQ29sb3I8VD4gJmMsIGZsb2F0IGwpCisJeworCQlsID0gMS4wZiAvIGw7IAorCisJCVQgciA9IChUKShsICogYy5yKTsKKwkJVCBnID0gKFQpKGwgKiBjLmcpOworCQlUIGIgPSAoVCkobCAqIGMuYik7CisJCVQgYSA9IChUKShsICogYy5hKTsKKworCQlyZXR1cm4gQ29sb3I8VD4ociwgZywgYiwgYSk7CisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVD4KKwlpbmxpbmUgQ29sb3I8VD4gQ29sb3I8VD46OmdyYWRpZW50KGNvbnN0IENvbG9yPFQ+ICZjMSwgY29uc3QgQ29sb3I8VD4gJmMyLCBmbG9hdCBkKQorCXsKKwkJZCA9IDEuMGYgLyBkOyAKKworCQlUIHIgPSAoYzIuciAtIGMxLnIpICogZDsKKwkJVCBnID0gKGMyLmcgLSBjMS5nKSAqIGQ7CisJCVQgYiA9IChjMi5iIC0gYzEuYikgKiBkOworCQlUIGEgPSAoYzIuYSAtIGMxLmEpICogZDsKKworCQlyZXR1cm4gQ29sb3I8VD4ociwgZywgYiwgYSk7CisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVD4KKwlpbmxpbmUgQ29sb3I8VD4gQ29sb3I8VD46OnNoYWRlKGNvbnN0IENvbG9yPFQ+ICZjMSwgY29uc3QgQ29sb3I8VD4gICZjMiwgZmxvYXQgZCkKKwl7CisJCVQgciA9IGMxLnIgKyAoVCkoZCAqIChjMi5yIC0gYzEucikpOworCQlUIGcgPSBjMS5nICsgKFQpKGQgKiAoYzIuZyAtIGMxLmcpKTsKKwkJVCBiID0gYzEuYiArIChUKShkICogKGMyLmIgLSBjMS5iKSk7CisJCVQgYSA9IGMxLmEgKyAoVCkoZCAqIChjMi5hIC0gYzEuYSkpOworCisJCXJldHVybiBDb2xvcjxUPihyLCBnLCBiLCBhKTsKKwl9Cit9CisKKyNlbmRpZiAgIC8vIHN3X0NvbG9yX2hwcApkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL0NvbnRleHQuY3BwIGIvc3JjL1JlbmRlcmVyL0NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTgzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvQ29udGV4dC5jcHAKQEAgLTAsMCArMSwxNDM5IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJDb250ZXh0LmhwcCIKKworI2luY2x1ZGUgIlBpeGVsU2hhZGVyLmhwcCIKKyNpbmNsdWRlICJWZXJ0ZXhTaGFkZXIuaHBwIgorI2luY2x1ZGUgIlByaW1pdGl2ZS5ocHAiCisjaW5jbHVkZSAiU3VyZmFjZS5ocHAiCisjaW5jbHVkZSAiTWVtb3J5LmhwcCIKKyNpbmNsdWRlICJDUFVJRC5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKK25hbWVzcGFjZSBzdworeworCWV4dGVybiBib29sIHBlcnNwZWN0aXZlQ29ycmVjdGlvbjsKKworCWJvb2wgZm9yY2VXaW5kb3dlZCA9IGZhbHNlOworCWJvb2wgcXVhZExheW91dEVuYWJsZWQgPSBmYWxzZTsKKwlib29sIHZlcnlFYXJseURlcHRoVGVzdCA9IHRydWU7CisJYm9vbCBjb21wbGVtZW50YXJ5RGVwdGhCdWZmZXIgPSBmYWxzZTsKKwlib29sIHBvc3RCbGVuZFNSR0IgPSBmYWxzZTsKKwlib29sIGV4YWN0Q29sb3JSb3VuZGluZyA9IGZhbHNlOworCUNvbnRleHQ6OlRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyB0cmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcgPSBDb250ZXh0OjpUUkFOU1BBUkVOQ1lfTk9ORTsKKwlib29sIGZvcmNlQ2xlYXJSZWdpc3RlcnMgPSBmYWxzZTsKKworCUNvbnRleHQ6OkNvbnRleHQoKQorCXsKKwkJaW5pdCgpOworCX0KKworCUNvbnRleHQ6On5Db250ZXh0KCkKKwl7CisJfQorCisJdm9pZCAqQ29udGV4dDo6b3BlcmF0b3IgbmV3KHNpemVfdCBieXRlcykKKwl7CisJCXJldHVybiBhbGxvY2F0ZSgodW5zaWduZWQgaW50KWJ5dGVzKTsKKwl9CisKKwl2b2lkIENvbnRleHQ6Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwb2ludGVyLCBzaXplX3QgYnl0ZXMpCisJeworCQlkZWFsbG9jYXRlKHBvaW50ZXIpOworCX0KKworCWJvb2wgQ29udGV4dDo6aXNEcmF3UG9pbnQoYm9vbCBmaWxsTW9kZUF3YXJlKSBjb25zdAorCXsKKwkJc3dpdGNoKGRyYXdUeXBlKQorCQl7CisJCWNhc2UgRFJBV19QT0lOVExJU1Q6CisJCWNhc2UgRFJBV19JTkRFWEVEUE9JTlRMSVNUODoKKwkJY2FzZSBEUkFXX0lOREVYRURQT0lOVExJU1QxNjoKKwkJY2FzZSBEUkFXX0lOREVYRURQT0lOVExJU1QzMjoKKwkJCXJldHVybiB0cnVlOworCQljYXNlIERSQVdfTElORUxJU1Q6CisJCWNhc2UgRFJBV19MSU5FU1RSSVA6CisJCWNhc2UgRFJBV19MSU5FTE9PUDoKKwkJY2FzZSBEUkFXX0lOREVYRURMSU5FTElTVDg6CisJCWNhc2UgRFJBV19JTkRFWEVETElORVNUUklQODoKKwkJY2FzZSBEUkFXX0lOREVYRURMSU5FTE9PUDg6CisJCWNhc2UgRFJBV19JTkRFWEVETElORUxJU1QxNjoKKwkJY2FzZSBEUkFXX0lOREVYRURMSU5FU1RSSVAxNjoKKwkJY2FzZSBEUkFXX0lOREVYRURMSU5FTE9PUDE2OgorCQljYXNlIERSQVdfSU5ERVhFRExJTkVMSVNUMzI6CisJCWNhc2UgRFJBV19JTkRFWEVETElORVNUUklQMzI6CisJCWNhc2UgRFJBV19JTkRFWEVETElORUxPT1AzMjoKKwkJCXJldHVybiBmYWxzZTsKKwkJY2FzZSBEUkFXX1RSSUFOR0xFTElTVDoKKwkJY2FzZSBEUkFXX1RSSUFOR0xFU1RSSVA6CisJCWNhc2UgRFJBV19UUklBTkdMRUZBTjoKKwkJY2FzZSBEUkFXX0lOREVYRURUUklBTkdMRUxJU1Q4OgorCQljYXNlIERSQVdfSU5ERVhFRFRSSUFOR0xFU1RSSVA4OgorCQljYXNlIERSQVdfSU5ERVhFRFRSSUFOR0xFRkFOODoKKwkJY2FzZSBEUkFXX0lOREVYRURUUklBTkdMRUxJU1QxNjoKKwkJY2FzZSBEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMTY6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVGQU4xNjoKKwkJY2FzZSBEUkFXX0lOREVYRURUUklBTkdMRUxJU1QzMjoKKwkJY2FzZSBEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMzI6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVGQU4zMjoKKwkJCXJldHVybiBmaWxsTW9kZUF3YXJlID8gZmlsbE1vZGUgPT0gRklMTF9WRVJURVggOiBmYWxzZTsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBDb250ZXh0Ojppc0RyYXdMaW5lKGJvb2wgZmlsbE1vZGVBd2FyZSkgY29uc3QKKwl7CisJCXN3aXRjaChkcmF3VHlwZSkKKwkJeworCQljYXNlIERSQVdfUE9JTlRMSVNUOgorCQljYXNlIERSQVdfSU5ERVhFRFBPSU5UTElTVDg6CisJCWNhc2UgRFJBV19JTkRFWEVEUE9JTlRMSVNUMTY6CisJCWNhc2UgRFJBV19JTkRFWEVEUE9JTlRMSVNUMzI6CisJCQlyZXR1cm4gZmFsc2U7CisJCWNhc2UgRFJBV19MSU5FTElTVDoKKwkJY2FzZSBEUkFXX0xJTkVTVFJJUDoKKwkJY2FzZSBEUkFXX0xJTkVMT09QOgorCQljYXNlIERSQVdfSU5ERVhFRExJTkVMSVNUODoKKwkJY2FzZSBEUkFXX0lOREVYRURMSU5FU1RSSVA4OgorCQljYXNlIERSQVdfSU5ERVhFRExJTkVMT09QODoKKwkJY2FzZSBEUkFXX0lOREVYRURMSU5FTElTVDE2OgorCQljYXNlIERSQVdfSU5ERVhFRExJTkVTVFJJUDE2OgorCQljYXNlIERSQVdfSU5ERVhFRExJTkVMT09QMTY6CisJCWNhc2UgRFJBV19JTkRFWEVETElORUxJU1QzMjoKKwkJY2FzZSBEUkFXX0lOREVYRURMSU5FU1RSSVAzMjoKKwkJY2FzZSBEUkFXX0lOREVYRURMSU5FTE9PUDMyOgorCQkJcmV0dXJuIHRydWU7CisJCWNhc2UgRFJBV19UUklBTkdMRUxJU1Q6CisJCWNhc2UgRFJBV19UUklBTkdMRVNUUklQOgorCQljYXNlIERSQVdfVFJJQU5HTEVGQU46CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUODoKKwkJY2FzZSBEUkFXX0lOREVYRURUUklBTkdMRVNUUklQODoKKwkJY2FzZSBEUkFXX0lOREVYRURUUklBTkdMRUZBTjg6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMTY6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDE2OgorCQljYXNlIERSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMTY6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMzI6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDMyOgorCQljYXNlIERSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMzI6CisJCQlyZXR1cm4gZmlsbE1vZGVBd2FyZSA/IGZpbGxNb2RlID09IEZJTExfV0lSRUZSQU1FIDogZmFsc2U7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWJvb2wgQ29udGV4dDo6aXNEcmF3VHJpYW5nbGUoYm9vbCBmaWxsTW9kZUF3YXJlKSBjb25zdAorCXsKKwkJc3dpdGNoKGRyYXdUeXBlKQorCQl7CisJCWNhc2UgRFJBV19QT0lOVExJU1Q6CisJCWNhc2UgRFJBV19JTkRFWEVEUE9JTlRMSVNUODoKKwkJY2FzZSBEUkFXX0lOREVYRURQT0lOVExJU1QxNjoKKwkJY2FzZSBEUkFXX0lOREVYRURQT0lOVExJU1QzMjoKKwkJCXJldHVybiBmYWxzZTsKKwkJY2FzZSBEUkFXX0xJTkVMSVNUOgorCQljYXNlIERSQVdfTElORVNUUklQOgorCQljYXNlIERSQVdfTElORUxPT1A6CisJCWNhc2UgRFJBV19JTkRFWEVETElORUxJU1Q4OgorCQljYXNlIERSQVdfSU5ERVhFRExJTkVTVFJJUDg6CisJCWNhc2UgRFJBV19JTkRFWEVETElORUxPT1A4OgorCQljYXNlIERSQVdfSU5ERVhFRExJTkVMSVNUMTY6CisJCWNhc2UgRFJBV19JTkRFWEVETElORVNUUklQMTY6CisJCWNhc2UgRFJBV19JTkRFWEVETElORUxPT1AxNjoKKwkJY2FzZSBEUkFXX0lOREVYRURMSU5FTElTVDMyOgorCQljYXNlIERSQVdfSU5ERVhFRExJTkVTVFJJUDMyOgorCQljYXNlIERSQVdfSU5ERVhFRExJTkVMT09QMzI6CisJCQlyZXR1cm4gZmFsc2U7CisJCWNhc2UgRFJBV19UUklBTkdMRUxJU1Q6CisJCWNhc2UgRFJBV19UUklBTkdMRVNUUklQOgorCQljYXNlIERSQVdfVFJJQU5HTEVGQU46CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUODoKKwkJY2FzZSBEUkFXX0lOREVYRURUUklBTkdMRVNUUklQODoKKwkJY2FzZSBEUkFXX0lOREVYRURUUklBTkdMRUZBTjg6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMTY6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDE2OgorCQljYXNlIERSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMTY6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMzI6CisJCWNhc2UgRFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDMyOgorCQljYXNlIERSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMzI6CisJCQlyZXR1cm4gZmlsbE1vZGVBd2FyZSA/IGZpbGxNb2RlID09IEZJTExfU09MSUQgOiB0cnVlOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCXZvaWQgQ29udGV4dDo6aW5pdCgpCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKQorCQl7CisJCQl0ZXh0dXJlU3RhZ2VbaV0uaW5pdChpLCAmc2FtcGxlcltpXSwgKGkgPj0gMSkgPyAmdGV4dHVyZVN0YWdlW2kgLSAxXSA6IDApOworCQl9CisKKwkJLy8gU2V0IHZlcnRleCBzdHJlYW1zIHRvIG51bGwgc3RyZWFtCisJCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl7CisJCQlpbnB1dFtpXS5kZWZhdWx0cygpOworCQl9CisKKwkJcG9zdFRyYW5zZm9ybSA9IGZhbHNlOworCisJCWZvZ1N0YXJ0ID0gMC4wZjsKKwkJZm9nRW5kID0gMS4wZjsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgdGV4dHVyZVdyYXBbaV0gPSAwOworCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB0ZXhHZW5baV0gPSBURVhHRU5fUEFTU1RIUlU7CisJCWZvcihpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHRleHR1cmVUcmFuc2Zvcm1Db3VudFtpXSA9IDA7CisJCWZvcihpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHRleHR1cmVUcmFuc2Zvcm1Qcm9qZWN0W2ldID0gZmFsc2U7CisJCXRleHR1cmVXcmFwQWN0aXZlID0gZmFsc2U7CisJCWxvY2FsVmlld2VyID0gdHJ1ZTsKKwkJbm9ybWFsaXplTm9ybWFscyA9IGZhbHNlOworCQkKKwkJcmVuZGVyVGFyZ2V0WzBdID0gMDsKKwkJcmVuZGVyVGFyZ2V0WzFdID0gMDsKKwkJcmVuZGVyVGFyZ2V0WzJdID0gMDsKKwkJcmVuZGVyVGFyZ2V0WzNdID0gMDsKKwkJZGVwdGhTdGVuY2lsID0gMDsKKworCQlzdGVuY2lsRW5hYmxlID0gZmFsc2U7CisJCXN0ZW5jaWxDb21wYXJlTW9kZSA9IFNURU5DSUxfQUxXQVlTOworCQlzdGVuY2lsUmVmZXJlbmNlID0gMDsKKwkJc3RlbmNpbE1hc2sgPSAweEZGRkZGRkZGOworCQlzdGVuY2lsRmFpbE9wZXJhdGlvbiA9IE9QRVJBVElPTl9LRUVQOworCQlzdGVuY2lsUGFzc09wZXJhdGlvbiA9IE9QRVJBVElPTl9LRUVQOworCQlzdGVuY2lsWkZhaWxPcGVyYXRpb24gPSBPUEVSQVRJT05fS0VFUDsKKwkJc3RlbmNpbFdyaXRlTWFzayA9IDB4RkZGRkZGRkY7CisJCQorCQl0d29TaWRlZFN0ZW5jaWwgPSBmYWxzZTsKKwkJc3RlbmNpbENvbXBhcmVNb2RlQ0NXID0gU1RFTkNJTF9BTFdBWVM7CisJCXN0ZW5jaWxSZWZlcmVuY2VDQ1cgPSAwOworCQlzdGVuY2lsTWFza0NDVyA9IDB4RkZGRkZGRkY7CisJCXN0ZW5jaWxGYWlsT3BlcmF0aW9uQ0NXID0gT1BFUkFUSU9OX0tFRVA7CisJCXN0ZW5jaWxQYXNzT3BlcmF0aW9uQ0NXID0gT1BFUkFUSU9OX0tFRVA7CisJCXN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyA9IE9QRVJBVElPTl9LRUVQOworCQlzdGVuY2lsV3JpdGVNYXNrQ0NXID0gMHhGRkZGRkZGRjsKKworCQlzZXRHbG9iYWxNaXBtYXBCaWFzKDApOworCisJCWxpZ2h0aW5nRW5hYmxlID0gdHJ1ZTsKKwkJc3BlY3VsYXJFbmFibGUgPSBmYWxzZTsKKwkJZm9yKGludCBpID0gMDsgaSA8IDg7IGkrKykgbGlnaHRFbmFibGVbaV0gPSBmYWxzZTsKKwkJZm9yKGludCBpID0gMDsgaSA8IDg7IGkrKykgd29ybGRMaWdodFBvc2l0aW9uW2ldID0gMDsKKworCQlhbHBoYUNvbXBhcmVNb2RlID0gQUxQSEFfQUxXQVlTOworCQlhbHBoYVRlc3RFbmFibGUgPSBmYWxzZTsKKwkJZmlsbE1vZGUgPSBGSUxMX1NPTElEOworCQlzaGFkaW5nTW9kZSA9IFNIQURJTkdfR09VUkFVRDsKKworCQlkZXB0aENvbXBhcmVNb2RlID0gREVQVEhfTEVTUzsKKwkJZGVwdGhCdWZmZXJFbmFibGUgPSB0cnVlOworCQlkZXB0aFdyaXRlRW5hYmxlID0gdHJ1ZTsKKworCQlhbHBoYUJsZW5kRW5hYmxlID0gZmFsc2U7CisJCXNvdXJjZUJsZW5kRmFjdG9yU3RhdGUgPSBCTEVORF9PTkU7CisJCWRlc3RCbGVuZEZhY3RvclN0YXRlID0gQkxFTkRfWkVSTzsKKwkJYmxlbmRPcGVyYXRpb25TdGF0ZSA9IEJMRU5ET1BfQUREOworCisJCXNlcGFyYXRlQWxwaGFCbGVuZEVuYWJsZSA9IGZhbHNlOworCQlzb3VyY2VCbGVuZEZhY3RvclN0YXRlQWxwaGEgPSBCTEVORF9PTkU7CisJCWRlc3RCbGVuZEZhY3RvclN0YXRlQWxwaGEgPSBCTEVORF9aRVJPOworCQlibGVuZE9wZXJhdGlvblN0YXRlQWxwaGEgPSBCTEVORE9QX0FERDsKKworCQljdWxsTW9kZSA9IENVTExfQ0xPQ0tXSVNFOworCQlhbHBoYVJlZmVyZW5jZSA9IDA7CisJCWNvbG9yV3JpdGVNYXNrWzBdID0gMHgwMDAwMDAwRjsKKwkJY29sb3JXcml0ZU1hc2tbMV0gPSAweDAwMDAwMDBGOworCQljb2xvcldyaXRlTWFza1syXSA9IDB4MDAwMDAwMEY7CisJCWNvbG9yV3JpdGVNYXNrWzNdID0gMHgwMDAwMDAwRjsKKworCQlhbWJpZW50TWF0ZXJpYWxTb3VyY2UgPSBNQVRFUklBTDsKKwkJZGlmZnVzZU1hdGVyaWFsU291cmNlID0gQ09MT1IxOworCQlzcGVjdWxhck1hdGVyaWFsU291cmNlID0gQ09MT1IyOworCQllbWlzc2l2ZU1hdGVyaWFsU291cmNlID0gTUFURVJJQUw7CisJCWNvbG9yVmVydGV4RW5hYmxlID0gdHJ1ZTsKKworCQlmb2dFbmFibGUgPSBmYWxzZTsKKwkJcGl4ZWxGb2dNb2RlID0gRk9HX05PTkU7CisJCXZlcnRleEZvZ01vZGUgPSBGT0dfTk9ORTsKKwkJd0Jhc2VkRm9nID0gZmFsc2U7CisJCXJhbmdlRm9nRW5hYmxlID0gZmFsc2U7CisKKwkJaW5kZXhlZFZlcnRleEJsZW5kRW5hYmxlID0gZmFsc2U7CisJCXZlcnRleEJsZW5kTWF0cml4Q291bnQgPSAwOworCisJCXBpeGVsU2hhZGVyID0gMDsKKwkJdmVydGV4U2hhZGVyID0gMDsKKworCQlvY2NsdXNpb25FbmFibGVkID0gZmFsc2U7CisKKwkJcG9pbnRTcHJpdGVFbmFibGUgPSBmYWxzZTsKKwkJcG9pbnRTY2FsZUVuYWJsZSA9IGZhbHNlOworCisJCXdyaXRlU1JHQiA9IGZhbHNlOworCQlzYW1wbGVNYXNrID0gMHhGRkZGRkZGRjsKKwl9CisKKwljb25zdCBmbG9hdCAmQ29udGV4dDo6ZXhwMkJpYXMoKQorCXsKKwkJcmV0dXJuIGJpYXM7CisJfQorCisJY29uc3QgUG9pbnQgJkNvbnRleHQ6OmdldExpZ2h0UG9zaXRpb24oaW50IGxpZ2h0KQorCXsKKwkJcmV0dXJuIHdvcmxkTGlnaHRQb3NpdGlvbltsaWdodF07CisJfQorCisJdm9pZCBDb250ZXh0OjpzZXRHbG9iYWxNaXBtYXBCaWFzKGZsb2F0IGJpYXMpCisJeworCQl0aGlzLT5iaWFzID0gZXhwMihiaWFzICsgMC41Zik7CisJfQorCisJdm9pZCBDb250ZXh0OjpzZXRMaWdodGluZ0VuYWJsZShib29sIGxpZ2h0aW5nRW5hYmxlKQorCXsKKwkJdGhpcy0+bGlnaHRpbmdFbmFibGUgPSBsaWdodGluZ0VuYWJsZTsKKwl9CisKKwl2b2lkIENvbnRleHQ6OnNldFNwZWN1bGFyRW5hYmxlKGJvb2wgc3BlY3VsYXJFbmFibGUpCisJeworCQlDb250ZXh0OjpzcGVjdWxhckVuYWJsZSA9IHNwZWN1bGFyRW5hYmxlOworCX0KKworCXZvaWQgQ29udGV4dDo6c2V0TGlnaHRFbmFibGUoaW50IGxpZ2h0LCBib29sIGxpZ2h0RW5hYmxlKQorCXsKKwkJQ29udGV4dDo6bGlnaHRFbmFibGVbbGlnaHRdID0gbGlnaHRFbmFibGU7CisJfQorCisJdm9pZCBDb250ZXh0OjpzZXRMaWdodFBvc2l0aW9uKGludCBsaWdodCwgUG9pbnQgd29ybGRMaWdodFBvc2l0aW9uKQorCXsKKwkJQ29udGV4dDo6d29ybGRMaWdodFBvc2l0aW9uW2xpZ2h0XSA9IHdvcmxkTGlnaHRQb3NpdGlvbjsKKwl9CisKKwl2b2lkIENvbnRleHQ6OnNldEFtYmllbnRNYXRlcmlhbFNvdXJjZShNYXRlcmlhbFNvdXJjZSBhbWJpZW50TWF0ZXJpYWxTb3VyY2UpCisJeworCQlDb250ZXh0OjphbWJpZW50TWF0ZXJpYWxTb3VyY2UgPSBhbWJpZW50TWF0ZXJpYWxTb3VyY2U7CisJfQorCisJdm9pZCBDb250ZXh0OjpzZXREaWZmdXNlTWF0ZXJpYWxTb3VyY2UoTWF0ZXJpYWxTb3VyY2UgZGlmZnVzZU1hdGVyaWFsU291cmNlKQorCXsKKwkJQ29udGV4dDo6ZGlmZnVzZU1hdGVyaWFsU291cmNlID0gZGlmZnVzZU1hdGVyaWFsU291cmNlOworCX0KKworCXZvaWQgQ29udGV4dDo6c2V0U3BlY3VsYXJNYXRlcmlhbFNvdXJjZShNYXRlcmlhbFNvdXJjZSBzcGVjdWxhck1hdGVyaWFsU291cmNlKQorCXsKKwkJQ29udGV4dDo6c3BlY3VsYXJNYXRlcmlhbFNvdXJjZSA9IHNwZWN1bGFyTWF0ZXJpYWxTb3VyY2U7CisJfQorCisJdm9pZCBDb250ZXh0OjpzZXRFbWlzc2l2ZU1hdGVyaWFsU291cmNlKE1hdGVyaWFsU291cmNlIGVtaXNzaXZlTWF0ZXJpYWxTb3VyY2UpCisJeworCQlDb250ZXh0OjplbWlzc2l2ZU1hdGVyaWFsU291cmNlID0gZW1pc3NpdmVNYXRlcmlhbFNvdXJjZTsKKwl9CisJCisJdm9pZCBDb250ZXh0OjpzZXRQb2ludFNwcml0ZUVuYWJsZShib29sIHBvaW50U3ByaXRlRW5hYmxlKQorCXsKKwkJQ29udGV4dDo6cG9pbnRTcHJpdGVFbmFibGUgPSBwb2ludFNwcml0ZUVuYWJsZTsKKwl9CisKKwl2b2lkIENvbnRleHQ6OnNldFBvaW50U2NhbGVFbmFibGUoYm9vbCBwb2ludFNjYWxlRW5hYmxlKQorCXsKKwkJQ29udGV4dDo6cG9pbnRTY2FsZUVuYWJsZSA9IHBvaW50U2NhbGVFbmFibGU7CisJfQorCisJYm9vbCBDb250ZXh0OjpzZXREZXB0aEJ1ZmZlckVuYWJsZShib29sIGRlcHRoQnVmZmVyRW5hYmxlKQorCXsKKwkJYm9vbCBtb2RpZmllZCA9IChDb250ZXh0OjpkZXB0aEJ1ZmZlckVuYWJsZSAhPSBkZXB0aEJ1ZmZlckVuYWJsZSk7CisJCUNvbnRleHQ6OmRlcHRoQnVmZmVyRW5hYmxlID0gZGVwdGhCdWZmZXJFbmFibGU7CisJCXJldHVybiBtb2RpZmllZDsKKwl9CisKKwlib29sIENvbnRleHQ6OnNldEFscGhhQmxlbmRFbmFibGUoYm9vbCBhbHBoYUJsZW5kRW5hYmxlKQorCXsKKwkJYm9vbCBtb2RpZmllZCA9IChDb250ZXh0OjphbHBoYUJsZW5kRW5hYmxlICE9IGFscGhhQmxlbmRFbmFibGUpOworCQlDb250ZXh0OjphbHBoYUJsZW5kRW5hYmxlID0gYWxwaGFCbGVuZEVuYWJsZTsKKwkJcmV0dXJuIG1vZGlmaWVkOworCX0KKworCWJvb2wgQ29udGV4dDo6c2V0U291cmNlQmxlbmRGYWN0b3IoQmxlbmRGYWN0b3Igc291cmNlQmxlbmRGYWN0b3IpCisJeworCQlib29sIG1vZGlmaWVkID0gKENvbnRleHQ6OnNvdXJjZUJsZW5kRmFjdG9yU3RhdGUgIT0gc291cmNlQmxlbmRGYWN0b3IpOworCQlDb250ZXh0Ojpzb3VyY2VCbGVuZEZhY3RvclN0YXRlID0gc291cmNlQmxlbmRGYWN0b3I7CisJCXJldHVybiBtb2RpZmllZDsKKwl9CisKKwlib29sIENvbnRleHQ6OnNldERlc3RCbGVuZEZhY3RvcihCbGVuZEZhY3RvciBkZXN0QmxlbmRGYWN0b3IpCisJeworCQlib29sIG1vZGlmaWVkID0gKENvbnRleHQ6OmRlc3RCbGVuZEZhY3RvclN0YXRlICE9IGRlc3RCbGVuZEZhY3Rvcik7CisJCUNvbnRleHQ6OmRlc3RCbGVuZEZhY3RvclN0YXRlID0gZGVzdEJsZW5kRmFjdG9yOworCQlyZXR1cm4gbW9kaWZpZWQ7CisJfQorCisJYm9vbCBDb250ZXh0OjpzZXRCbGVuZE9wZXJhdGlvbihCbGVuZE9wZXJhdGlvbiBibGVuZE9wZXJhdGlvbikKKwl7CisJCWJvb2wgbW9kaWZpZWQgPSAoQ29udGV4dDo6YmxlbmRPcGVyYXRpb25TdGF0ZSAhPSBibGVuZE9wZXJhdGlvbik7CisJCUNvbnRleHQ6OmJsZW5kT3BlcmF0aW9uU3RhdGUgPSBibGVuZE9wZXJhdGlvbjsKKwkJcmV0dXJuIG1vZGlmaWVkOworCX0KKworCWJvb2wgQ29udGV4dDo6c2V0U2VwYXJhdGVBbHBoYUJsZW5kRW5hYmxlKGJvb2wgc2VwYXJhdGVBbHBoYUJsZW5kRW5hYmxlKQorCXsKKwkJYm9vbCBtb2RpZmllZCA9IChDb250ZXh0OjpzZXBhcmF0ZUFscGhhQmxlbmRFbmFibGUgIT0gc2VwYXJhdGVBbHBoYUJsZW5kRW5hYmxlKTsKKwkJQ29udGV4dDo6c2VwYXJhdGVBbHBoYUJsZW5kRW5hYmxlID0gc2VwYXJhdGVBbHBoYUJsZW5kRW5hYmxlOworCQlyZXR1cm4gbW9kaWZpZWQ7CisJfQorCisJYm9vbCBDb250ZXh0OjpzZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKEJsZW5kRmFjdG9yIHNvdXJjZUJsZW5kRmFjdG9yQWxwaGEpCisJeworCQlib29sIG1vZGlmaWVkID0gKENvbnRleHQ6OnNvdXJjZUJsZW5kRmFjdG9yU3RhdGVBbHBoYSAhPSBzb3VyY2VCbGVuZEZhY3RvckFscGhhKTsKKwkJQ29udGV4dDo6c291cmNlQmxlbmRGYWN0b3JTdGF0ZUFscGhhID0gc291cmNlQmxlbmRGYWN0b3JBbHBoYTsKKwkJcmV0dXJuIG1vZGlmaWVkOworCX0KKworCWJvb2wgQ29udGV4dDo6c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoQmxlbmRGYWN0b3IgZGVzdEJsZW5kRmFjdG9yQWxwaGEpCisJeworCQlib29sIG1vZGlmaWVkID0gKENvbnRleHQ6OmRlc3RCbGVuZEZhY3RvclN0YXRlQWxwaGEgIT0gZGVzdEJsZW5kRmFjdG9yQWxwaGEpOworCQlDb250ZXh0OjpkZXN0QmxlbmRGYWN0b3JTdGF0ZUFscGhhID0gZGVzdEJsZW5kRmFjdG9yQWxwaGE7CisJCXJldHVybiBtb2RpZmllZDsKKwl9CisKKwlib29sIENvbnRleHQ6OnNldEJsZW5kT3BlcmF0aW9uQWxwaGEoQmxlbmRPcGVyYXRpb24gYmxlbmRPcGVyYXRpb25BbHBoYSkKKwl7CisJCWJvb2wgbW9kaWZpZWQgPSAoQ29udGV4dDo6YmxlbmRPcGVyYXRpb25TdGF0ZUFscGhhICE9IGJsZW5kT3BlcmF0aW9uQWxwaGEpOworCQlDb250ZXh0OjpibGVuZE9wZXJhdGlvblN0YXRlQWxwaGEgPSBibGVuZE9wZXJhdGlvbkFscGhhOworCQlyZXR1cm4gbW9kaWZpZWQ7CisJfQorCisJYm9vbCBDb250ZXh0OjpzZXRDb2xvcldyaXRlTWFzayhpbnQgaW5kZXgsIGludCBjb2xvcldyaXRlTWFzaykKKwl7CisJCWJvb2wgbW9kaWZpZWQgPSAoQ29udGV4dDo6Y29sb3JXcml0ZU1hc2tbaW5kZXhdICE9IGNvbG9yV3JpdGVNYXNrKTsKKwkJQ29udGV4dDo6Y29sb3JXcml0ZU1hc2tbaW5kZXhdID0gY29sb3JXcml0ZU1hc2s7CisJCXJldHVybiBtb2RpZmllZDsKKwl9CisKKwlib29sIENvbnRleHQ6OnNldFdyaXRlU1JHQihib29sIHNSR0IpCisJeworCQlib29sIG1vZGlmaWVkID0gKENvbnRleHQ6OndyaXRlU1JHQiAhPSBzUkdCKTsKKwkJQ29udGV4dDo6d3JpdGVTUkdCID0gc1JHQjsKKwkJcmV0dXJuIG1vZGlmaWVkOworCX0KKworCXZvaWQgQ29udGV4dDo6c2V0Q29sb3JWZXJ0ZXhFbmFibGUoYm9vbCBjb2xvclZlcnRleEVuYWJsZSkKKwl7CisJCUNvbnRleHQ6OmNvbG9yVmVydGV4RW5hYmxlID0gY29sb3JWZXJ0ZXhFbmFibGU7CisJfQorCisJYm9vbCBDb250ZXh0Ojpmb2dBY3RpdmUoKQorCXsKKwkJaWYoIWNvbG9yVXNlZCgpKSByZXR1cm4gZmFsc2U7CisKKwkJaWYocGl4ZWxTaGFkZXJWZXJzaW9uKCkgPj0gMHgwMzAwKSByZXR1cm4gZmFsc2U7CisKKwkJcmV0dXJuIGZvZ0VuYWJsZTsKKwl9CisKKwlib29sIENvbnRleHQ6OnBvaW50U2l6ZUFjdGl2ZSgpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiBpc0RyYXdQb2ludCh0cnVlKSAmJiAoaW5wdXRbUFNpemVdIHx8ICghcHJlVHJhbnNmb3JtZWQgJiYgcG9pbnRTY2FsZUFjdGl2ZSgpKSk7CisJfQorCisJQ29udGV4dDo6Rm9nTW9kZSBDb250ZXh0OjpwaXhlbEZvZ0FjdGl2ZSgpCisJeworCQlpZihmb2dBY3RpdmUoKSkKKwkJeworCQkJcmV0dXJuIHBpeGVsRm9nTW9kZTsKKwkJfQorCisJCXJldHVybiBGT0dfTk9ORTsKKwl9CisKKwlib29sIENvbnRleHQ6OmRlcHRoV3JpdGVBY3RpdmUoKQorCXsKKwkJaWYoIWRlcHRoQnVmZmVyQWN0aXZlKCkpIHJldHVybiBmYWxzZTsKKworCQlyZXR1cm4gZGVwdGhXcml0ZUVuYWJsZTsKKwl9CisKKwlib29sIENvbnRleHQ6OmFscGhhVGVzdEFjdGl2ZSgpCisJeworCQlpZighYWxwaGFUZXN0RW5hYmxlKSByZXR1cm4gZmFsc2U7CisJCWlmKGFscGhhQ29tcGFyZU1vZGUgPT0gQUxQSEFfQUxXQVlTKSByZXR1cm4gZmFsc2U7CisJCWlmKGFscGhhUmVmZXJlbmNlID09IDAgJiYgYWxwaGFDb21wYXJlTW9kZSA9PSBBTFBIQV9HUkVBVEVSRVFVQUwpIHJldHVybiBmYWxzZTsKKwkJCisJCXJldHVybiB0cnVlOworCX0KKworCWJvb2wgQ29udGV4dDo6ZGVwdGhCdWZmZXJBY3RpdmUoKQorCXsKKwkJcmV0dXJuIGRlcHRoU3RlbmNpbCAmJiBkZXB0aEJ1ZmZlckVuYWJsZTsKKwl9CisKKwlib29sIENvbnRleHQ6OnN0ZW5jaWxBY3RpdmUoKQorCXsKKwkJcmV0dXJuIGRlcHRoU3RlbmNpbCAmJiBzdGVuY2lsRW5hYmxlOworCX0KKworCWJvb2wgQ29udGV4dDo6dmVydGV4TGlnaHRpbmdBY3RpdmUoKQorCXsKKwkJaWYodmVydGV4U2hhZGVyKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gbGlnaHRpbmdFbmFibGUgJiYgIXByZVRyYW5zZm9ybWVkOworCX0KKworCWJvb2wgQ29udGV4dDo6dmVydGV4VGV4dHVyZUFjdGl2ZShpbnQgY29vcmRpbmF0ZSwgaW50IGNvbXBvbmVudCkgICAvLyBGSVhNRTogUmVuYW1lIHRvIHRleENvb3JkQWN0aXZlCisJeworCQlib29sIGhhc1RleHR1cmUgPSBwb2ludFNwcml0ZUFjdGl2ZSgpOworCisJCWlmKHZlcnRleFNoYWRlcikKKwkJeworCQkJaWYoIXByZVRyYW5zZm9ybWVkKQorCQkJeworCQkJCWlmKHZlcnRleFNoYWRlci0+b3V0cHV0W1QwICsgY29vcmRpbmF0ZV1bY29tcG9uZW50XS51c2FnZSA9PSBTaGFkZXJPcGVyYXRpb246OlVTQUdFX1RFWENPT1JEKQorCQkJCXsKKwkJCQkJaGFzVGV4dHVyZSA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWhhc1RleHR1cmUgPSB0cnVlOyAgIC8vIEZJWE1FOiBDaGVjayB2ZXJ0ZXggYnVmZmVyIHN0cmVhbXMKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXN3aXRjaCh0ZXhHZW5bY29vcmRpbmF0ZV0pCisJCQl7CisJCQljYXNlIFRFWEdFTl9QQVNTVEhSVToKKwkJCQlpZihpbnB1dFtUZXhDb29yZDAgKyB0ZXh0dXJlU3RhZ2VbY29vcmRpbmF0ZV0udGV4Q29vcmRJbmRleF0udHlwZSA9PSBTVFJFQU1UWVBFX0ZMT0FUKQorCQkJCXsKKwkJCQkJaGFzVGV4dHVyZSA9IGhhc1RleHR1cmUgfHwgKGNvbXBvbmVudCA8IGlucHV0W1RleENvb3JkMCArIHRleHR1cmVTdGFnZVtjb29yZGluYXRlXS50ZXhDb29yZEluZGV4XS5jb3VudCk7CisJCQkJfQorCQkJCWVsc2UgQVNTRVJUKCFpbnB1dFtUZXhDb29yZDAgKyB0ZXh0dXJlU3RhZ2VbY29vcmRpbmF0ZV0udGV4Q29vcmRJbmRleF0pOworCQkJCWJyZWFrOworCQkJY2FzZSBURVhHRU5fTk9STUFMOgorCQkJCWhhc1RleHR1cmUgPSBoYXNUZXh0dXJlIHx8IChjb21wb25lbnQgPD0gMik7CisJCQkJYnJlYWs7CisJCQljYXNlIFRFWEdFTl9QT1NJVElPTjoKKwkJCQloYXNUZXh0dXJlID0gaGFzVGV4dHVyZSB8fCAoY29tcG9uZW50IDw9IDIpOworCQkJCWJyZWFrOworCQkJY2FzZSBURVhHRU5fUkVGTEVDVElPTjoKKwkJCQloYXNUZXh0dXJlID0gaGFzVGV4dHVyZSB8fCAoY29tcG9uZW50IDw9IDIpOworCQkJCWJyZWFrOworCQkJY2FzZSBURVhHRU5fU1BIRVJFTUFQOgorCQkJCWhhc1RleHR1cmUgPSBoYXNUZXh0dXJlIHx8IChjb21wb25lbnQgPD0gMSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKworCQlib29sIHByb2plY3QgPSBpc1Byb2plY3Rpb25Db21wb25lbnQoY29vcmRpbmF0ZSwgY29tcG9uZW50KTsKKwkJYm9vbCB1c2VzVGV4dHVyZSA9IGZhbHNlOworCisJCWlmKHBpeGVsU2hhZGVyKQorCQl7CisJCQl1c2VzVGV4dHVyZSA9IHBpeGVsU2hhZGVyLT51c2VzVGV4dHVyZShjb29yZGluYXRlLCBjb21wb25lbnQpIHx8IHByb2plY3Q7CisJCX0KKwkJZWxzZQorCQl7CisJCQl1c2VzVGV4dHVyZSA9IHRleHR1cmVTdGFnZVtjb29yZGluYXRlXS51c2VzVGV4dHVyZSgpIHx8IHByb2plY3Q7CisJCX0KKworCQlyZXR1cm4gaGFzVGV4dHVyZSAmJiB1c2VzVGV4dHVyZTsKKwl9CisKKwlib29sIENvbnRleHQ6OnZlcnRleFRleHR1cmVBY3RpdmUoaW50IGNvb3JkaW5hdGUpICAgLy8gRklYTUU6IFJlbmFtZSB0byB0ZXhDb29yZEFjdGl2ZQorCXsKKwkJcmV0dXJuIHZlcnRleFRleHR1cmVBY3RpdmUoY29vcmRpbmF0ZSwgMCkgfHwKKwkJICAgICAgIHZlcnRleFRleHR1cmVBY3RpdmUoY29vcmRpbmF0ZSwgMSkgfHwKKwkJCSAgIHZlcnRleFRleHR1cmVBY3RpdmUoY29vcmRpbmF0ZSwgMikgfHwKKwkJCSAgIHZlcnRleFRleHR1cmVBY3RpdmUoY29vcmRpbmF0ZSwgMyk7CisJfQorCisJYm9vbCBDb250ZXh0Ojppc1Byb2plY3Rpb25Db21wb25lbnQodW5zaWduZWQgaW50IGNvb3JkaW5hdGUsIGludCBjb21wb25lbnQpCisJeworCQlpZihwaXhlbFNoYWRlclZlcnNpb24oKSA8PSAweDAxMDMgJiYgY29vcmRpbmF0ZSA8IDggJiYgdGV4dHVyZVRyYW5zZm9ybVByb2plY3RbY29vcmRpbmF0ZV0pCisJCXsKKwkJCWlmKHRleHR1cmVUcmFuc2Zvcm1Db3VudFtjb29yZGluYXRlXSA9PSAyKQorCQkJeworCQkJCWlmKGNvbXBvbmVudCA9PSAxKSByZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UgaWYodGV4dHVyZVRyYW5zZm9ybUNvdW50W2Nvb3JkaW5hdGVdID09IDMpCisJCQl7CisJCQkJaWYoY29tcG9uZW50ID09IDIpIHJldHVybiB0cnVlOworCQkJfQorCQkJZWxzZSBpZih0ZXh0dXJlVHJhbnNmb3JtQ291bnRbY29vcmRpbmF0ZV0gPT0gNCB8fCB0ZXh0dXJlVHJhbnNmb3JtQ291bnRbY29vcmRpbmF0ZV0gPT0gMCkKKwkJCXsKKwkJCQlpZihjb21wb25lbnQgPT0gMykgcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBDb250ZXh0Ojp2ZXJ0ZXhTcGVjdWxhckFjdGl2ZSgpCisJeworCQlyZXR1cm4gdmVydGV4TGlnaHRpbmdBY3RpdmUoKSAmJiBzcGVjdWxhckVuYWJsZSAmJiB2ZXJ0ZXhOb3JtYWxBY3RpdmUoKTsKKwl9CisKKwlib29sIENvbnRleHQ6OnZlcnRleE5vcm1hbEFjdGl2ZSgpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiBpbnB1dFtOb3JtYWxdOworCX0KKworCWJvb2wgQ29udGV4dDo6dmVydGV4TGlnaHRBY3RpdmUoaW50IGkpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiBsaWdodGluZ0VuYWJsZSAmJiBsaWdodEVuYWJsZVtpXTsKKwl9CisKKwlDb250ZXh0OjpNYXRlcmlhbFNvdXJjZSBDb250ZXh0Ojp2ZXJ0ZXhEaWZmdXNlTWF0ZXJpYWxTb3VyY2VBY3RpdmUoKQorCXsKKwkJaWYodmVydGV4U2hhZGVyKQorCQl7CisJCQlyZXR1cm4gTUFURVJJQUw7CisJCX0KKworCQlpZihkaWZmdXNlTWF0ZXJpYWxTb3VyY2UgPT0gTUFURVJJQUwgfHwgIWNvbG9yVmVydGV4RW5hYmxlIHx8CisJCSAgIChkaWZmdXNlTWF0ZXJpYWxTb3VyY2UgPT0gQ09MT1IxICYmICFpbnB1dFtDb2xvcjBdKSB8fAorCQkgICAoZGlmZnVzZU1hdGVyaWFsU291cmNlID09IENPTE9SMiAmJiAhaW5wdXRbQ29sb3IxXSkpCisJCXsKKwkJCXJldHVybiBNQVRFUklBTDsKKwkJfQorCQkKKwkJcmV0dXJuIGRpZmZ1c2VNYXRlcmlhbFNvdXJjZTsKKwl9CisKKwlDb250ZXh0OjpNYXRlcmlhbFNvdXJjZSBDb250ZXh0Ojp2ZXJ0ZXhTcGVjdWxhck1hdGVyaWFsU291cmNlQWN0aXZlKCkKKwl7CisJCWlmKHZlcnRleFNoYWRlcikKKwkJeworCQkJcmV0dXJuIE1BVEVSSUFMOworCQl9CisKKwkJaWYoc3BlY3VsYXJNYXRlcmlhbFNvdXJjZSA9PSBNQVRFUklBTCB8fCAhY29sb3JWZXJ0ZXhFbmFibGUgfHwKKwkJICAgKHNwZWN1bGFyTWF0ZXJpYWxTb3VyY2UgPT0gQ09MT1IxICYmICFpbnB1dFtDb2xvcjBdKSB8fAorCQkgICAoc3BlY3VsYXJNYXRlcmlhbFNvdXJjZSA9PSBDT0xPUjIgJiYgIWlucHV0W0NvbG9yMV0pKQorCQl7CisJCQlyZXR1cm4gTUFURVJJQUw7CisJCX0KKwkJCisJCXJldHVybiBzcGVjdWxhck1hdGVyaWFsU291cmNlOworCX0KKworCUNvbnRleHQ6Ok1hdGVyaWFsU291cmNlIENvbnRleHQ6OnZlcnRleEFtYmllbnRNYXRlcmlhbFNvdXJjZUFjdGl2ZSgpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCXsKKwkJCXJldHVybiBNQVRFUklBTDsKKwkJfQorCisJCWlmKGFtYmllbnRNYXRlcmlhbFNvdXJjZSA9PSBNQVRFUklBTCB8fCAhY29sb3JWZXJ0ZXhFbmFibGUgfHwKKwkJICAgKGFtYmllbnRNYXRlcmlhbFNvdXJjZSA9PSBDT0xPUjEgJiYgIWlucHV0W0NvbG9yMF0pIHx8CisJCSAgIChhbWJpZW50TWF0ZXJpYWxTb3VyY2UgPT0gQ09MT1IyICYmICFpbnB1dFtDb2xvcjFdKSkKKwkJeworCQkJcmV0dXJuIE1BVEVSSUFMOworCQl9CisJCQorCQlyZXR1cm4gYW1iaWVudE1hdGVyaWFsU291cmNlOworCX0KKworCUNvbnRleHQ6Ok1hdGVyaWFsU291cmNlIENvbnRleHQ6OnZlcnRleEVtaXNzaXZlTWF0ZXJpYWxTb3VyY2VBY3RpdmUoKQorCXsKKwkJaWYodmVydGV4U2hhZGVyKQorCQl7CisJCQlyZXR1cm4gTUFURVJJQUw7CisJCX0KKworCQlpZihlbWlzc2l2ZU1hdGVyaWFsU291cmNlID09IE1BVEVSSUFMIHx8ICFjb2xvclZlcnRleEVuYWJsZSB8fAorCQkgICAoZW1pc3NpdmVNYXRlcmlhbFNvdXJjZSA9PSBDT0xPUjEgJiYgIWlucHV0W0NvbG9yMF0pIHx8CisJCSAgIChlbWlzc2l2ZU1hdGVyaWFsU291cmNlID09IENPTE9SMiAmJiAhaW5wdXRbQ29sb3IxXSkpCisJCXsKKwkJCXJldHVybiBNQVRFUklBTDsKKwkJfQorCQkKKwkJcmV0dXJuIGVtaXNzaXZlTWF0ZXJpYWxTb3VyY2U7CisJfQorCisJYm9vbCBDb250ZXh0Ojpwb2ludFNwcml0ZUFjdGl2ZSgpCisJeworCQlyZXR1cm4gaXNEcmF3UG9pbnQodHJ1ZSkgJiYgcG9pbnRTcHJpdGVFbmFibGU7CisJfQorCisJYm9vbCBDb250ZXh0Ojpwb2ludFNjYWxlQWN0aXZlKCkKKwl7CisJCWlmKHZlcnRleFNoYWRlcikKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIGlzRHJhd1BvaW50KHRydWUpICYmIHBvaW50U2NhbGVFbmFibGU7CisJfQorCisJYm9vbCBDb250ZXh0OjphbHBoYUJsZW5kQWN0aXZlKCkKKwl7CisJCWlmKCFhbHBoYUJsZW5kRW5hYmxlKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZighY29sb3JVc2VkKCkpCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWJvb2wgY29sb3JCbGVuZCA9ICEoYmxlbmRPcGVyYXRpb24oKSA9PSBCTEVORE9QX1NPVVJDRSAmJiBzb3VyY2VCbGVuZEZhY3RvcigpID09IEJMRU5EX09ORSk7CisJCWJvb2wgYWxwaGFCbGVuZCA9IHNlcGFyYXRlQWxwaGFCbGVuZEVuYWJsZSA/ICEoYmxlbmRPcGVyYXRpb25BbHBoYSgpID09IEJMRU5ET1BfU09VUkNFICYmIHNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoKSA9PSBCTEVORF9PTkUpIDogY29sb3JCbGVuZDsKKworCQlyZXR1cm4gY29sb3JCbGVuZCB8fCBhbHBoYUJsZW5kOworCX0KKworCUNvbnRleHQ6OkJsZW5kRmFjdG9yIENvbnRleHQ6OnNvdXJjZUJsZW5kRmFjdG9yKCkKKwl7CisJCWlmKCFhbHBoYUJsZW5kRW5hYmxlKSByZXR1cm4gQkxFTkRfT05FOworCisJCXN3aXRjaChibGVuZE9wZXJhdGlvblN0YXRlKQorCQl7CisJCWNhc2UgQkxFTkRPUF9BREQ6CisJCWNhc2UgQkxFTkRPUF9TVUI6CisJCWNhc2UgQkxFTkRPUF9JTlZTVUI6CisJCQlyZXR1cm4gc291cmNlQmxlbmRGYWN0b3JTdGF0ZTsKKwkJY2FzZSBCTEVORE9QX01JTjoKKwkJCXJldHVybiBCTEVORF9PTkU7CisJCWNhc2UgQkxFTkRPUF9NQVg6CisJCQlyZXR1cm4gQkxFTkRfT05FOyAKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gc291cmNlQmxlbmRGYWN0b3JTdGF0ZTsKKwl9CisKKwlDb250ZXh0OjpCbGVuZEZhY3RvciBDb250ZXh0OjpkZXN0QmxlbmRGYWN0b3IoKQorCXsKKwkJaWYoIWFscGhhQmxlbmRFbmFibGUpIHJldHVybiBCTEVORF9aRVJPOworCisJCXN3aXRjaChibGVuZE9wZXJhdGlvblN0YXRlKQorCQl7CisJCWNhc2UgQkxFTkRPUF9BREQ6CisJCWNhc2UgQkxFTkRPUF9TVUI6CisJCWNhc2UgQkxFTkRPUF9JTlZTVUI6CisJCQlyZXR1cm4gZGVzdEJsZW5kRmFjdG9yU3RhdGU7CisJCWNhc2UgQkxFTkRPUF9NSU46CisJCQlyZXR1cm4gQkxFTkRfT05FOworCQljYXNlIEJMRU5ET1BfTUFYOgorCQkJcmV0dXJuIEJMRU5EX09ORTsgCisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJcmV0dXJuIGRlc3RCbGVuZEZhY3RvclN0YXRlOworCX0KKworCUNvbnRleHQ6OkJsZW5kT3BlcmF0aW9uIENvbnRleHQ6OmJsZW5kT3BlcmF0aW9uKCkKKwl7CisJCWlmKCFhbHBoYUJsZW5kRW5hYmxlKSByZXR1cm4gQkxFTkRPUF9TT1VSQ0U7CisKKwkJc3dpdGNoKGJsZW5kT3BlcmF0aW9uU3RhdGUpCisJCXsKKwkJY2FzZSBCTEVORE9QX0FERDoKKwkJCWlmKHNvdXJjZUJsZW5kRmFjdG9yKCkgPT0gQkxFTkRfWkVSTykKKwkJCXsKKwkJCQlpZihkZXN0QmxlbmRGYWN0b3IoKSA9PSBCTEVORF9aRVJPKQorCQkJCXsKKwkJCQkJcmV0dXJuIEJMRU5ET1BfTlVMTDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIEJMRU5ET1BfREVTVDsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKHNvdXJjZUJsZW5kRmFjdG9yKCkgPT0gQkxFTkRfT05FKQorCQkJeworCQkJCWlmKGRlc3RCbGVuZEZhY3RvcigpID09IEJMRU5EX1pFUk8pCisJCQkJeworCQkJCQlyZXR1cm4gQkxFTkRPUF9TT1VSQ0U7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXJldHVybiBCTEVORE9QX0FERDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoZGVzdEJsZW5kRmFjdG9yKCkgPT0gQkxFTkRfWkVSTykKKwkJCQl7CisJCQkJCXJldHVybiBCTEVORE9QX1NPVVJDRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIEJMRU5ET1BfQUREOworCQkJCX0KKwkJCX0KKwkJY2FzZSBCTEVORE9QX1NVQjoKKwkJCWlmKHNvdXJjZUJsZW5kRmFjdG9yKCkgPT0gQkxFTkRfWkVSTykKKwkJCXsKKwkJCQlyZXR1cm4gQkxFTkRPUF9OVUxMOyAgIC8vIE5lZ2F0aXZlLCBjbGFtcGVkIHRvIHplcm8KKwkJCX0KKwkJCWVsc2UgaWYoc291cmNlQmxlbmRGYWN0b3IoKSA9PSBCTEVORF9PTkUpCisJCQl7CisJCQkJaWYoZGVzdEJsZW5kRmFjdG9yKCkgPT0gQkxFTkRfWkVSTykKKwkJCQl7CisJCQkJCXJldHVybiBCTEVORE9QX1NPVVJDRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIEJMRU5ET1BfU1VCOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZihkZXN0QmxlbmRGYWN0b3IoKSA9PSBCTEVORF9aRVJPKQorCQkJCXsKKwkJCQkJcmV0dXJuIEJMRU5ET1BfU09VUkNFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4gQkxFTkRPUF9TVUI7CisJCQkJfQorCQkJfQorCQljYXNlIEJMRU5ET1BfSU5WU1VCOgorCQkJaWYoc291cmNlQmxlbmRGYWN0b3IoKSA9PSBCTEVORF9aRVJPKQorCQkJeworCQkJCWlmKGRlc3RCbGVuZEZhY3RvcigpID09IEJMRU5EX1pFUk8pCisJCQkJeworCQkJCQlyZXR1cm4gQkxFTkRPUF9OVUxMOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4gQkxFTkRPUF9ERVNUOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoc291cmNlQmxlbmRGYWN0b3IoKSA9PSBCTEVORF9PTkUpCisJCQl7CisJCQkJaWYoZGVzdEJsZW5kRmFjdG9yKCkgPT0gQkxFTkRfWkVSTykKKwkJCQl7CisJCQkJCXJldHVybiBCTEVORE9QX05VTEw7ICAgLy8gTmVnYXRpdmUsIGNsYW1wZWQgdG8gemVybworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4gQkxFTkRPUF9JTlZTVUI7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKGRlc3RCbGVuZEZhY3RvcigpID09IEJMRU5EX1pFUk8pCisJCQkJeworCQkJCQlyZXR1cm4gQkxFTkRPUF9OVUxMOyAgIC8vIE5lZ2F0aXZlLCBjbGFtcGVkIHRvIHplcm8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIEJMRU5ET1BfSU5WU1VCOworCQkJCX0KKwkJCX0KKwkJY2FzZSBCTEVORE9QX01JTjoKKwkJCXJldHVybiBCTEVORE9QX01JTjsKKwkJY2FzZSBCTEVORE9QX01BWDoKKwkJCXJldHVybiBCTEVORE9QX01BWDsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gYmxlbmRPcGVyYXRpb25TdGF0ZTsKKwl9CisKKwlDb250ZXh0OjpCbGVuZEZhY3RvciBDb250ZXh0Ojpzb3VyY2VCbGVuZEZhY3RvckFscGhhKCkKKwl7CisJCWlmKCFzZXBhcmF0ZUFscGhhQmxlbmRFbmFibGUpCisJCXsKKwkJCXJldHVybiBzb3VyY2VCbGVuZEZhY3RvcigpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3dpdGNoKGJsZW5kT3BlcmF0aW9uU3RhdGVBbHBoYSkKKwkJCXsKKwkJCWNhc2UgQkxFTkRPUF9BREQ6CisJCQljYXNlIEJMRU5ET1BfU1VCOgorCQkJY2FzZSBCTEVORE9QX0lOVlNVQjoKKwkJCQlyZXR1cm4gc291cmNlQmxlbmRGYWN0b3JTdGF0ZUFscGhhOworCQkJY2FzZSBCTEVORE9QX01JTjoKKwkJCQlyZXR1cm4gQkxFTkRfT05FOworCQkJY2FzZSBCTEVORE9QX01BWDoKKwkJCQlyZXR1cm4gQkxFTkRfT05FOyAKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKworCQkJcmV0dXJuIHNvdXJjZUJsZW5kRmFjdG9yU3RhdGVBbHBoYTsKKwkJfQorCX0KKworCUNvbnRleHQ6OkJsZW5kRmFjdG9yIENvbnRleHQ6OmRlc3RCbGVuZEZhY3RvckFscGhhKCkKKwl7CisJCWlmKCFzZXBhcmF0ZUFscGhhQmxlbmRFbmFibGUpCisJCXsKKwkJCXJldHVybiBkZXN0QmxlbmRGYWN0b3IoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN3aXRjaChibGVuZE9wZXJhdGlvblN0YXRlQWxwaGEpCisJCQl7CisJCQljYXNlIEJMRU5ET1BfQUREOgorCQkJY2FzZSBCTEVORE9QX1NVQjoKKwkJCWNhc2UgQkxFTkRPUF9JTlZTVUI6CisJCQkJcmV0dXJuIGRlc3RCbGVuZEZhY3RvclN0YXRlQWxwaGE7CisJCQljYXNlIEJMRU5ET1BfTUlOOgorCQkJCXJldHVybiBCTEVORF9PTkU7CisJCQljYXNlIEJMRU5ET1BfTUFYOgorCQkJCXJldHVybiBCTEVORF9PTkU7IAorCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCisJCQlyZXR1cm4gZGVzdEJsZW5kRmFjdG9yU3RhdGVBbHBoYTsKKwkJfQorCX0KKworCUNvbnRleHQ6OkJsZW5kT3BlcmF0aW9uIENvbnRleHQ6OmJsZW5kT3BlcmF0aW9uQWxwaGEoKQorCXsKKwkJaWYoIXNlcGFyYXRlQWxwaGFCbGVuZEVuYWJsZSkKKwkJeworCQkJcmV0dXJuIGJsZW5kT3BlcmF0aW9uKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzd2l0Y2goYmxlbmRPcGVyYXRpb25TdGF0ZUFscGhhKQorCQkJeworCQkJY2FzZSBCTEVORE9QX0FERDoKKwkJCQlpZihzb3VyY2VCbGVuZEZhY3RvckFscGhhKCkgPT0gQkxFTkRfWkVSTykKKwkJCQl7CisJCQkJCWlmKGRlc3RCbGVuZEZhY3RvckFscGhhKCkgPT0gQkxFTkRfWkVSTykKKwkJCQkJeworCQkJCQkJcmV0dXJuIEJMRU5ET1BfTlVMTDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiBCTEVORE9QX0RFU1Q7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihzb3VyY2VCbGVuZEZhY3RvckFscGhhKCkgPT0gQkxFTkRfT05FKQorCQkJCXsKKwkJCQkJaWYoZGVzdEJsZW5kRmFjdG9yQWxwaGEoKSA9PSBCTEVORF9aRVJPKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gQkxFTkRPUF9TT1VSQ0U7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4gQkxFTkRPUF9BREQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYoZGVzdEJsZW5kRmFjdG9yQWxwaGEoKSA9PSBCTEVORF9aRVJPKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gQkxFTkRPUF9TT1VSQ0U7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4gQkxFTkRPUF9BREQ7CisJCQkJCX0KKwkJCQl9CisJCQljYXNlIEJMRU5ET1BfU1VCOgorCQkJCWlmKHNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoKSA9PSBCTEVORF9aRVJPKQorCQkJCXsKKwkJCQkJcmV0dXJuIEJMRU5ET1BfTlVMTDsgICAvLyBOZWdhdGl2ZSwgY2xhbXBlZCB0byB6ZXJvCisJCQkJfQorCQkJCWVsc2UgaWYoc291cmNlQmxlbmRGYWN0b3JBbHBoYSgpID09IEJMRU5EX09ORSkKKwkJCQl7CisJCQkJCWlmKGRlc3RCbGVuZEZhY3RvckFscGhhKCkgPT0gQkxFTkRfWkVSTykKKwkJCQkJeworCQkJCQkJcmV0dXJuIEJMRU5ET1BfU09VUkNFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcmV0dXJuIEJMRU5ET1BfU1VCOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmKGRlc3RCbGVuZEZhY3RvckFscGhhKCkgPT0gQkxFTkRfWkVSTykKKwkJCQkJeworCQkJCQkJcmV0dXJuIEJMRU5ET1BfU09VUkNFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcmV0dXJuIEJMRU5ET1BfU1VCOworCQkJCQl9CisJCQkJfQorCQkJY2FzZSBCTEVORE9QX0lOVlNVQjoKKwkJCQlpZihzb3VyY2VCbGVuZEZhY3RvckFscGhhKCkgPT0gQkxFTkRfWkVSTykKKwkJCQl7CisJCQkJCWlmKGRlc3RCbGVuZEZhY3RvckFscGhhKCkgPT0gQkxFTkRfWkVSTykKKwkJCQkJeworCQkJCQkJcmV0dXJuIEJMRU5ET1BfTlVMTDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiBCTEVORE9QX0RFU1Q7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihzb3VyY2VCbGVuZEZhY3RvckFscGhhKCkgPT0gQkxFTkRfT05FKQorCQkJCXsKKwkJCQkJaWYoZGVzdEJsZW5kRmFjdG9yQWxwaGEoKSA9PSBCTEVORF9aRVJPKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gQkxFTkRPUF9OVUxMOyAgIC8vIE5lZ2F0aXZlLCBjbGFtcGVkIHRvIHplcm8KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiBCTEVORE9QX0lOVlNVQjsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZihkZXN0QmxlbmRGYWN0b3JBbHBoYSgpID09IEJMRU5EX1pFUk8pCisJCQkJCXsKKwkJCQkJCXJldHVybiBCTEVORE9QX05VTEw7ICAgLy8gTmVnYXRpdmUsIGNsYW1wZWQgdG8gemVybworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcmV0dXJuIEJMRU5ET1BfSU5WU1VCOworCQkJCQl9CisJCQkJfQorCQkJY2FzZSBCTEVORE9QX01JTjoKKwkJCQlyZXR1cm4gQkxFTkRPUF9NSU47CisJCQljYXNlIEJMRU5ET1BfTUFYOgorCQkJCXJldHVybiBCTEVORE9QX01BWDsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKworCQkJcmV0dXJuIGJsZW5kT3BlcmF0aW9uU3RhdGVBbHBoYTsKKwkJfQorCX0KKworCWJvb2wgQ29udGV4dDo6aW5kZXhlZFZlcnRleEJsZW5kQWN0aXZlKCkKKwl7CisJCWlmKHZlcnRleFNoYWRlcikKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIGluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZTsKKwl9CisKKwlpbnQgQ29udGV4dDo6dmVydGV4QmxlbmRNYXRyaXhDb3VudEFjdGl2ZSgpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCXsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIHZlcnRleEJsZW5kTWF0cml4Q291bnQ7CisJfQorCisJYm9vbCBDb250ZXh0Ojpsb2NhbFZpZXdlckFjdGl2ZSgpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiBsb2NhbFZpZXdlcjsKKwl9CisKKwlib29sIENvbnRleHQ6Om5vcm1hbGl6ZU5vcm1hbHNBY3RpdmUoKQorCXsKKwkJaWYodmVydGV4U2hhZGVyKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gbm9ybWFsaXplTm9ybWFsczsKKwl9CisKKwlDb250ZXh0OjpGb2dNb2RlIENvbnRleHQ6OnZlcnRleEZvZ01vZGVBY3RpdmUoKQorCXsKKwkJaWYodmVydGV4U2hhZGVyIHx8ICFmb2dBY3RpdmUoKSkKKwkJeworCQkJcmV0dXJuIEZPR19OT05FOworCQl9CisKKwkJcmV0dXJuIHZlcnRleEZvZ01vZGU7CisJfQorCisJYm9vbCBDb250ZXh0OjpyYW5nZUZvZ0FjdGl2ZSgpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIgfHwgIWZvZ0FjdGl2ZSgpKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gcmFuZ2VGb2dFbmFibGU7CisJfQorCisJQ29udGV4dDo6VGV4R2VuIENvbnRleHQ6OnRleEdlbkFjdGl2ZShpbnQgc3RhZ2UpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIgfHwgIXZlcnRleFRleHR1cmVBY3RpdmUoc3RhZ2UpKQorCQl7CisJCQlyZXR1cm4gVEVYR0VOX1BBU1NUSFJVOworCQl9CisKKwkJcmV0dXJuIHRleEdlbltzdGFnZV07CisJfQorCQorCWludCBDb250ZXh0Ojp0ZXh0dXJlVHJhbnNmb3JtQ291bnRBY3RpdmUoaW50IHN0YWdlKQorCXsKKwkJaWYodmVydGV4U2hhZGVyIHx8ICF2ZXJ0ZXhUZXh0dXJlQWN0aXZlKHN0YWdlKSkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZXR1cm4gdGV4dHVyZVRyYW5zZm9ybUNvdW50W3N0YWdlXTsKKwl9CisKKwlpbnQgQ29udGV4dDo6dGV4Q29vcmRJbmRleEFjdGl2ZShpbnQgc3RhZ2UpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIgfHwgIXZlcnRleFRleHR1cmVBY3RpdmUoc3RhZ2UpKQorCQl7CisJCQlyZXR1cm4gc3RhZ2U7CisJCX0KKworCQlyZXR1cm4gdGV4dHVyZVN0YWdlW3N0YWdlXS50ZXhDb29yZEluZGV4OworCX0KKworCWJvb2wgQ29udGV4dDo6cGVyc3BlY3RpdmVBY3RpdmUoKQorCXsKKwkJaWYoIWNvbG9yVXNlZCgpKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZighcGVyc3BlY3RpdmVDb3JyZWN0aW9uKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZihpc0RyYXdQb2ludCh0cnVlKSkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJYm9vbCBDb250ZXh0OjpkaWZmdXNlVXNlZCgpCisJeworCQlyZXR1cm4gZGlmZnVzZVVzZWQoMCkgfHwgZGlmZnVzZVVzZWQoMSkgfHwgZGlmZnVzZVVzZWQoMikgfHwgZGlmZnVzZVVzZWQoMyk7CisJfQorCisJYm9vbCBDb250ZXh0OjpkaWZmdXNlVXNlZChpbnQgY29tcG9uZW50KQorCXsKKwkJaWYoIWNvbG9yVXNlZCgpKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZihwaXhlbFNoYWRlcikKKwkJeworCQkJcmV0dXJuIHBpeGVsU2hhZGVyLT51c2VzRGlmZnVzZShjb21wb25lbnQpOworCQl9CisKKwkJLy8gRGlyZWN0bHkgdXNpbmcgdGhlIGRpZmZ1c2UgaW5wdXQgY29sb3IKKwkJZm9yKGludCBpID0gMDsgaSA8IDg7IGkrKykKKwkJeworCQkJaWYodGV4dHVyZVN0YWdlW2ldLmlzU3RhZ2VEaXNhYmxlZCgpKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZih0ZXh0dXJlU3RhZ2VbaV0udXNlc0RpZmZ1c2UoKSkKKwkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCS8vIFVzaW5nIHRoZSBjdXJyZW50IGNvbG9yIChpbml0aWFsaXplZCB0byBkaWZmdXNlKSBiZWZvcmUgaXQncyBvdmVyd3JpdHRlbgorCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKQorCQl7CisJCQlpZih0ZXh0dXJlU3RhZ2VbaV0udXNlc0N1cnJlbnQoKSB8fCB0ZXh0dXJlU3RhZ2VbaV0uaXNTdGFnZURpc2FibGVkKCkpICAgLy8gQ3VycmVudCBjb2xvciBjb250YWlucyBkaWZmdXNlIGJlZm9yZSBiZWluZyBvdmVyd3JpdHRlbgorCQkJeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQlpZih0ZXh0dXJlU3RhZ2VbaV0ud3JpdGVzQ3VycmVudCgpKQorCQkJeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCWJvb2wgQ29udGV4dDo6ZGlmZnVzZUFjdGl2ZSgpCisJeworCQlyZXR1cm4gZGlmZnVzZUFjdGl2ZSgwKSB8fCBkaWZmdXNlQWN0aXZlKDEpIHx8IGRpZmZ1c2VBY3RpdmUoMikgfHwgZGlmZnVzZUFjdGl2ZSgzKTsKKwl9CisKKwlib29sIENvbnRleHQ6OmRpZmZ1c2VBY3RpdmUoaW50IGNvbXBvbmVudCkKKwl7CisJCWlmKCFjb2xvclVzZWQoKSkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gVmVydGV4IHByb2Nlc3NvciBwcm92aWRlcyBkaWZmdXNlIGNvbXBvbmVudAorCQlib29sIHZlcnRleERpZmZ1c2U7CisJCQorCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCXsKKwkJCXZlcnRleERpZmZ1c2UgPSB2ZXJ0ZXhTaGFkZXItPm91dHB1dFtEMF1bY29tcG9uZW50XS5hY3RpdmUoKTsKKwkJfQorCQllbHNlIGlmKCFwcmVUcmFuc2Zvcm1lZCkKKwkJeworCQkJdmVydGV4RGlmZnVzZSA9IGlucHV0W0NvbG9yMF0gfHwgbGlnaHRpbmdFbmFibGU7CisJCX0KKwkJZWxzZQorCQl7CisJCQl2ZXJ0ZXhEaWZmdXNlID0gaW5wdXRbQ29sb3IwXTsKKwkJfQorCisJCS8vIFBpeGVsIHByb2Nlc3NvciByZXF1aXJlcyBkaWZmdXNlIGNvbXBvbmVudAorCQlib29sIHBpeGVsRGlmZnVzZSA9IGRpZmZ1c2VVc2VkKGNvbXBvbmVudCk7CisKKwkJcmV0dXJuIHZlcnRleERpZmZ1c2UgJiYgcGl4ZWxEaWZmdXNlOworCX0KKworCWJvb2wgQ29udGV4dDo6c3BlY3VsYXJVc2VkKCkKKwl7CisJCXJldHVybiBDb250ZXh0OjpzcGVjdWxhclVzZWQoMCkgfHwgQ29udGV4dDo6c3BlY3VsYXJVc2VkKDEpIHx8IENvbnRleHQ6OnNwZWN1bGFyVXNlZCgyKSB8fCBDb250ZXh0OjpzcGVjdWxhclVzZWQoMyk7CisJfQorCisJYm9vbCBDb250ZXh0OjpzcGVjdWxhclVzZWQoaW50IGNvbXBvbmVudCkKKwl7CisJCWlmKCFjb2xvclVzZWQoKSkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYocGl4ZWxTaGFkZXIpCisJCXsKKwkJCXJldHVybiBwaXhlbFNoYWRlci0+dXNlc1NwZWN1bGFyKGNvbXBvbmVudCk7CisJCX0KKworCQlib29sIHBpeGVsU3BlY3VsYXIgPSBzcGVjdWxhckVuYWJsZTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKQorCQl7CisJCQlpZih0ZXh0dXJlU3RhZ2VbaV0uaXNTdGFnZURpc2FibGVkKCkpIGJyZWFrOworCisJCQlwaXhlbFNwZWN1bGFyID0gcGl4ZWxTcGVjdWxhciB8fCB0ZXh0dXJlU3RhZ2VbaV0udXNlc1NwZWN1bGFyKCk7CisJCX0KKworCQlyZXR1cm4gcGl4ZWxTcGVjdWxhcjsKKwl9CisKKwlib29sIENvbnRleHQ6OnNwZWN1bGFyQWN0aXZlKCkKKwl7CisJCXJldHVybiBzcGVjdWxhckFjdGl2ZSgwKSB8fCBzcGVjdWxhckFjdGl2ZSgxKSB8fCBzcGVjdWxhckFjdGl2ZSgyKSB8fCBzcGVjdWxhckFjdGl2ZSgzKTsKKwl9CisKKwlib29sIENvbnRleHQ6OnNwZWN1bGFyQWN0aXZlKGludCBjb21wb25lbnQpCisJeworCQlpZighY29sb3JVc2VkKCkpCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIFZlcnRleCBwcm9jZXNzb3IgcHJvdmlkZXMgc3BlY3VsYXIgY29tcG9uZW50CisJCWJvb2wgdmVydGV4U3BlY3VsYXI7CisJCQorCQlpZighdmVydGV4U2hhZGVyKQorCQl7CisJCQl2ZXJ0ZXhTcGVjdWxhciA9IGlucHV0W0NvbG9yMV0gfHwgKGxpZ2h0aW5nRW5hYmxlICYmIHNwZWN1bGFyRW5hYmxlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXZlcnRleFNwZWN1bGFyID0gdmVydGV4U2hhZGVyLT5vdXRwdXRbRDFdW2NvbXBvbmVudF0uYWN0aXZlKCk7CisJCX0KKworCQkvLyBQaXhlbCBwcm9jZXNzb3IgcmVxdWlyZXMgc3BlY3VsYXIgY29tcG9uZW50CisJCWJvb2wgcGl4ZWxTcGVjdWxhciA9IHNwZWN1bGFyVXNlZChjb21wb25lbnQpIHx8IGZvZ0FjdGl2ZSgpOworCisJCXJldHVybiB2ZXJ0ZXhTcGVjdWxhciAmJiBwaXhlbFNwZWN1bGFyOworCX0KKworCWJvb2wgQ29udGV4dDo6Y29sb3JBY3RpdmUoaW50IGNvbG9yLCBpbnQgY29tcG9uZW50KQorCXsKKwkJaWYoY29sb3IgPT0gMCkKKwkJeworCQkJcmV0dXJuIGRpZmZ1c2VBY3RpdmUoY29tcG9uZW50KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiBzcGVjdWxhckFjdGl2ZShjb21wb25lbnQpOworCQl9CisJfQorCisJYm9vbCBDb250ZXh0Ojp0ZXh0dXJlQWN0aXZlKCkKKwl7CisJCWZvcihpbnQgaSA9IDA7IGkgPCA4OyBpKyspCisJCXsKKwkJCWlmKHRleHR1cmVBY3RpdmUoaSkpCisJCQl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBDb250ZXh0Ojp0ZXh0dXJlQWN0aXZlKGludCBjb29yZGluYXRlKQorCXsKKwkJcmV0dXJuIHRleHR1cmVBY3RpdmUoY29vcmRpbmF0ZSwgMCkgfHwgdGV4dHVyZUFjdGl2ZShjb29yZGluYXRlLCAxKSB8fCB0ZXh0dXJlQWN0aXZlKGNvb3JkaW5hdGUsIDIpIHx8IHRleHR1cmVBY3RpdmUoY29vcmRpbmF0ZSwgMyk7CisJfQorCisJYm9vbCBDb250ZXh0Ojp0ZXh0dXJlQWN0aXZlKGludCBjb29yZGluYXRlLCBpbnQgY29tcG9uZW50KSAgIC8vIEZJWE1FOiBSZW5hbWUgdG8gdGV4Q29vcmRBY3RpdmUKKwl7CisJCWlmKCFjb2xvclVzZWQoKSkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYoIXZlcnRleFRleHR1cmVBY3RpdmUoY29vcmRpbmF0ZSwgY29tcG9uZW50KSkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYodGV4dHVyZVRyYW5zZm9ybVByb2plY3RbY29vcmRpbmF0ZV0gJiYgcGl4ZWxTaGFkZXJWZXJzaW9uKCkgPD0gMHgwMTAzKQorCQl7CisJCQlpZih0ZXh0dXJlVHJhbnNmb3JtQ291bnRbY29vcmRpbmF0ZV0gPT0gMikKKwkJCXsKKwkJCQlpZihjb21wb25lbnQgPT0gMSkgcmV0dXJuIHRydWU7CisJCQl9CisJCQllbHNlIGlmKHRleHR1cmVUcmFuc2Zvcm1Db3VudFtjb29yZGluYXRlXSA9PSAzKQorCQkJeworCQkJCWlmKGNvbXBvbmVudCA9PSAyKSByZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UgaWYodGV4dHVyZVRyYW5zZm9ybUNvdW50W2Nvb3JkaW5hdGVdID09IDQgfHwgdGV4dHVyZVRyYW5zZm9ybUNvdW50W2Nvb3JkaW5hdGVdID09IDApCisJCQl7CisJCQkJaWYoY29tcG9uZW50ID09IDMpIHJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJaWYoIXBpeGVsU2hhZGVyKQorCQl7CisJCQlib29sIHRleHR1cmUgPSB0ZXh0dXJlU3RhZ2VbY29vcmRpbmF0ZV0udXNlc1RleHR1cmUoKTsKKwkJCWJvb2wgY3ViZSA9IHNhbXBsZXJbY29vcmRpbmF0ZV0uaGFzQ3ViZVRleHR1cmUoKTsKKwkJCWJvb2wgdm9sdW1lID0gc2FtcGxlcltjb29yZGluYXRlXS5oYXNWb2x1bWVUZXh0dXJlKCk7CisKKwkJCWlmKHRleHR1cmUpCisJCQl7CisJCQkJZm9yKGludCBpID0gY29vcmRpbmF0ZSAtIDE7IGkgPj0gMDsgaS0tKQorCQkJCXsKKwkJCQkJaWYodGV4dHVyZVN0YWdlW2ldLnN0YWdlT3BlcmF0aW9uID09IFRleHR1cmVTdGFnZTo6U1RBR0VfRElTQUJMRSkKKwkJCQkJeworCQkJCQkJdGV4dHVyZSA9IGZhbHNlOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJc3dpdGNoKGNvbXBvbmVudCkKKwkJCXsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gdGV4dHVyZTsKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gdGV4dHVyZTsKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gKHRleHR1cmUgJiYgKGN1YmUgfHwgdm9sdW1lKSk7CisJCQljYXNlIDM6CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIHBpeGVsU2hhZGVyLT51c2VzVGV4dHVyZShjb29yZGluYXRlLCBjb21wb25lbnQpOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXVuc2lnbmVkIHNob3J0IENvbnRleHQ6OnBpeGVsU2hhZGVyVmVyc2lvbigpIGNvbnN0CisJeworCQlyZXR1cm4gcGl4ZWxTaGFkZXIgPyBwaXhlbFNoYWRlci0+Z2V0VmVyc2lvbigpIDogMHgwMDAwOworCX0KKworCXVuc2lnbmVkIHNob3J0IENvbnRleHQ6OnZlcnRleFNoYWRlclZlcnNpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuIHZlcnRleFNoYWRlciA/IHZlcnRleFNoYWRlci0+Z2V0VmVyc2lvbigpIDogMHgwMDAwOworCX0KKworCUZvcm1hdCBDb250ZXh0OjpyZW5kZXJUYXJnZXRJbnRlcm5hbEZvcm1hdChpbnQgaW5kZXgpCisJeworCQlpZihyZW5kZXJUYXJnZXRbaW5kZXhdKQorCQl7CisJCQlyZXR1cm4gcmVuZGVyVGFyZ2V0W2luZGV4XS0+Z2V0SW50ZXJuYWxGb3JtYXQoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiBGT1JNQVRfTlVMTDsKKwkJfQorCX0KKworCWludCBDb250ZXh0Ojpjb2xvcldyaXRlQWN0aXZlKCkKKwl7CisJCXJldHVybiBjb2xvcldyaXRlQWN0aXZlKDApIHwgY29sb3JXcml0ZUFjdGl2ZSgxKSB8IGNvbG9yV3JpdGVBY3RpdmUoMikgfCBjb2xvcldyaXRlQWN0aXZlKDMpOworCX0KKworCWludCBDb250ZXh0Ojpjb2xvcldyaXRlQWN0aXZlKGludCBpbmRleCkKKwl7CisJCWlmKCFyZW5kZXJUYXJnZXRbaW5kZXhdIHx8IHJlbmRlclRhcmdldFtpbmRleF0tPmdldEludGVybmFsRm9ybWF0KCkgPT0gRk9STUFUX05VTEwpCisJCXsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYoYmxlbmRPcGVyYXRpb24oKSA9PSBCTEVORE9QX0RFU1QgJiYgZGVzdEJsZW5kRmFjdG9yKCkgPT0gQkxFTkRfT05FICYmCisJCSAgICghc2VwYXJhdGVBbHBoYUJsZW5kRW5hYmxlIHx8IChibGVuZE9wZXJhdGlvbkFscGhhKCkgPT0gQkxFTkRPUF9ERVNUICYmIGRlc3RCbGVuZEZhY3RvckFscGhhKCkgPT0gQkxFTkRfT05FKSkpCisJCXsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIGNvbG9yV3JpdGVNYXNrW2luZGV4XTsKKwl9CisKKwlib29sIENvbnRleHQ6OmNvbG9yVXNlZCgpCisJeworCQlyZXR1cm4gY29sb3JXcml0ZUFjdGl2ZSgpIHx8IGFscGhhVGVzdEFjdGl2ZSgpIHx8IChwaXhlbFNoYWRlciAmJiBwaXhlbFNoYWRlci0+Y29udGFpbnNUZXhraWxsKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9Db250ZXh0LmhwcCBiL3NyYy9SZW5kZXJlci9Db250ZXh0LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjE4ZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlbmRlcmVyL0NvbnRleHQuaHBwCkBAIC0wLDAgKzEsNDgxIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgc3dfQ29udGV4dF9ocHAKKyNkZWZpbmUgc3dfQ29udGV4dF9ocHAKKworI2luY2x1ZGUgIlNhbXBsZXIuaHBwIgorI2luY2x1ZGUgIlRleHR1cmVTdGFnZS5ocHAiCisjaW5jbHVkZSAiU3RyZWFtLmhwcCIKKyNpbmNsdWRlICJQb2ludC5ocHAiCisjaW5jbHVkZSAiVmVydGV4LmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJY2xhc3MgU2FtcGxlcjsKKwljbGFzcyBTdXJmYWNlOworCWNsYXNzIFBpeGVsU2hhZGVyOworCWNsYXNzIFZlcnRleFNoYWRlcjsKKwlzdHJ1Y3QgVHJpYW5nbGU7CisJc3RydWN0IFByaW1pdGl2ZTsKKwlzdHJ1Y3QgVmVydGV4OworCWNsYXNzIFJlc291cmNlOworCisJZW51bSBJbiAgIC8vIERlZmF1bHQgaW5wdXQgc3RyZWFtIHNlbWFudGljCisJeworCQlQb3NpdGlvbiA9IDAsCisJCUJsZW5kV2VpZ2h0ID0gMSwKKwkJQmxlbmRJbmRpY2VzID0gMiwKKwkJTm9ybWFsID0gMywKKwkJUFNpemUgPSA0LAorCQlDb2xvcjAgPSA1LAorCQlDb2xvcjEgPSA2LAorCQlUZXhDb29yZDAgPSA3LAorCQlUZXhDb29yZDEgPSA4LAorCQlUZXhDb29yZDIgPSA5LAorCQlUZXhDb29yZDMgPSAxMCwKKwkJVGV4Q29vcmQ0ID0gMTEsCisJCVRleENvb3JkNSA9IDEyLAorCQlUZXhDb29yZDYgPSAxMywKKwkJVGV4Q29vcmQ3ID0gMTQsCisJCVBvc2l0aW9uVCA9IDE1CisJfTsKKworCWNsYXNzIENvbnRleHQKKwl7CisJcHVibGljOgorCQllbnVtIERyYXdUeXBlCisJCXsKKwkJCURSQVdfUE9JTlRMSVNULAorCQkJRFJBV19MSU5FTElTVCwKKwkJCURSQVdfTElORVNUUklQLAorCQkJRFJBV19MSU5FTE9PUCwKKwkJCURSQVdfVFJJQU5HTEVMSVNULAorCQkJRFJBV19UUklBTkdMRVNUUklQLAorCQkJRFJBV19UUklBTkdMRUZBTiwKKworCQkJRFJBV19JTkRFWEVEUE9JTlRMSVNUOCwKKwkJCURSQVdfSU5ERVhFRExJTkVMSVNUOCwKKwkJCURSQVdfSU5ERVhFRExJTkVTVFJJUDgsCisJCQlEUkFXX0lOREVYRURMSU5FTE9PUDgsCisJCQlEUkFXX0lOREVYRURUUklBTkdMRUxJU1Q4LAorCQkJRFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDgsCisJCQlEUkFXX0lOREVYRURUUklBTkdMRUZBTjgsCisKKwkJCURSQVdfSU5ERVhFRFBPSU5UTElTVDE2LAorCQkJRFJBV19JTkRFWEVETElORUxJU1QxNiwKKwkJCURSQVdfSU5ERVhFRExJTkVTVFJJUDE2LAorCQkJRFJBV19JTkRFWEVETElORUxPT1AxNiwKKwkJCURSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDE2LAorCQkJRFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDE2LAorCQkJRFJBV19JTkRFWEVEVFJJQU5HTEVGQU4xNiwKKworCQkJRFJBV19JTkRFWEVEUE9JTlRMSVNUMzIsCisJCQlEUkFXX0lOREVYRURMSU5FTElTVDMyLAorCQkJRFJBV19JTkRFWEVETElORVNUUklQMzIsCisJCQlEUkFXX0lOREVYRURMSU5FTE9PUDMyLAorCQkJRFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMzIsCisJCQlEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMzIsCisJCQlEUkFXX0lOREVYRURUUklBTkdMRUZBTjMyLAorCisJCQlEUkFXX0xBU1QgPSBEUkFXX0lOREVYRURUUklBTkdMRUZBTjMyCisJCX07CisKKwkJZW51bSBGaWxsTW9kZQorCQl7CisJCQlGSUxMX1NPTElELAorCQkJRklMTF9XSVJFRlJBTUUsCisJCQlGSUxMX1ZFUlRFWCwKKworCQkJRklMTF9MQVNUID0gRklMTF9WRVJURVgKKwkJfTsKKwkJCisJCWVudW0gU2hhZGluZ01vZGUKKwkJeworCQkJU0hBRElOR19GTEFULAorCQkJU0hBRElOR19HT1VSQVVELAorCisJCQlTSEFESU5HX0xBU1QgPSBTSEFESU5HX0dPVVJBVUQKKwkJfTsKKworCQllbnVtIERlcHRoQ29tcGFyZU1vZGUKKwkJeworCQkJREVQVEhfQUxXQVlTLAorCQkJREVQVEhfTkVWRVIsCisJCQlERVBUSF9FUVVBTCwKKwkJCURFUFRIX05PVEVRVUFMLAorCQkJREVQVEhfTEVTUywKKwkJCURFUFRIX0xFU1NFUVVBTCwKKwkJCURFUFRIX0dSRUFURVIsCisJCQlERVBUSF9HUkVBVEVSRVFVQUwsCisKKwkJCURFUFRIX0xBU1QgPSBERVBUSF9HUkVBVEVSRVFVQUwKKwkJfTsKKworCQllbnVtIFN0ZW5jaWxDb21wYXJlTW9kZQorCQl7CisJCQlTVEVOQ0lMX0FMV0FZUywKKwkJCVNURU5DSUxfTkVWRVIsCisJCQlTVEVOQ0lMX0VRVUFMLAorCQkJU1RFTkNJTF9OT1RFUVVBTCwKKwkJCVNURU5DSUxfTEVTUywKKwkJCVNURU5DSUxfTEVTU0VRVUFMLAorCQkJU1RFTkNJTF9HUkVBVEVSLAorCQkJU1RFTkNJTF9HUkVBVEVSRVFVQUwsCisKKwkJCVNURU5DSUxfTEFTVCA9IFNURU5DSUxfR1JFQVRFUkVRVUFMCisJCX07CisKKwkJZW51bSBTdGVuY2lsT3BlcmF0aW9uCisJCXsKKwkJCU9QRVJBVElPTl9LRUVQLAorCQkJT1BFUkFUSU9OX1pFUk8sCisJCQlPUEVSQVRJT05fUkVQTEFDRSwKKwkJCU9QRVJBVElPTl9JTkNSU0FULAorCQkJT1BFUkFUSU9OX0RFQ1JTQVQsCisJCQlPUEVSQVRJT05fSU5WRVJULAorCQkJT1BFUkFUSU9OX0lOQ1IsCisJCQlPUEVSQVRJT05fREVDUiwKKworCQkJT1BFUkFUSU9OX0xBU1QgPSBPUEVSQVRJT05fREVDUgorCQl9OworCisJCWVudW0gQWxwaGFDb21wYXJlTW9kZQorCQl7CisJCQlBTFBIQV9BTFdBWVMsCisJCQlBTFBIQV9ORVZFUiwKKwkJCUFMUEhBX0VRVUFMLAorCQkJQUxQSEFfTk9URVFVQUwsCisJCQlBTFBIQV9MRVNTLAorCQkJQUxQSEFfTEVTU0VRVUFMLAorCQkJQUxQSEFfR1JFQVRFUiwKKwkJCUFMUEhBX0dSRUFURVJFUVVBTCwKKworCQkJQUxQSEFfTEFTVCA9IEFMUEhBX0dSRUFURVJFUVVBTAorCQl9OworCisJCWVudW0gQ3VsbE1vZGUKKwkJeworCQkJQ1VMTF9OT05FLAorCQkJQ1VMTF9DTE9DS1dJU0UsCisJCQlDVUxMX0NPVU5URVJDTE9DS1dJU0UsCisKKwkJCUNVTExfTEFTVCA9IENVTExfQ09VTlRFUkNMT0NLV0lTRQorCQl9OworCisJCWVudW0gQmxlbmRGYWN0b3IKKwkJeworCQkJQkxFTkRfWkVSTywKKwkJCUJMRU5EX09ORSwKKwkJCUJMRU5EX1NPVVJDRSwKKwkJCUJMRU5EX0lOVlNPVVJDRSwKKwkJCUJMRU5EX0RFU1QsCisJCQlCTEVORF9JTlZERVNULAorCQkJQkxFTkRfU09VUkNFQUxQSEEsCisJCQlCTEVORF9JTlZTT1VSQ0VBTFBIQSwKKwkJCUJMRU5EX0RFU1RBTFBIQSwKKwkJCUJMRU5EX0lOVkRFU1RBTFBIQSwKKwkJCUJMRU5EX1NSQ0FMUEhBU0FULAorCQkJQkxFTkRfQ09OU1RBTlQsCisJCQlCTEVORF9JTlZDT05TVEFOVCwKKwkJCUJMRU5EX0NPTlNUQU5UQUxQSEEsCisJCQlCTEVORF9JTlZDT05TVEFOVEFMUEhBLAorCisJCQlCTEVORF9MQVNUID0gQkxFTkRfSU5WQ09OU1RBTlQKKwkJfTsKKworCQllbnVtIEJsZW5kT3BlcmF0aW9uCisJCXsKKwkJCUJMRU5ET1BfQURELAorCQkJQkxFTkRPUF9TVUIsCisJCQlCTEVORE9QX0lOVlNVQiwKKwkJCUJMRU5ET1BfTUlOLAorCQkJQkxFTkRPUF9NQVgsCisKKwkJCUJMRU5ET1BfU09VUkNFLCAgIC8vIENvcHkgc291cmNlCisJCQlCTEVORE9QX0RFU1QsICAgICAvLyBDb3B5IGRlc3QKKwkJCUJMRU5ET1BfTlVMTCwgICAgIC8vIE51bGxpZnkgcmVzdWx0CisKKwkJCUJMRU5ET1BfTEFTVCA9IEJMRU5ET1BfTlVMTAorCQl9OworCisJCWVudW0gTWF0ZXJpYWxTb3VyY2UKKwkJeworCQkJTUFURVJJQUwsCisJCQlDT0xPUjEsCisJCQlDT0xPUjIsCisKKwkJCU1BVEVSSUFMX0xBU1QgPSBDT0xPUjIKKwkJfTsKKworCQllbnVtIEZvZ01vZGUKKwkJeworCQkJRk9HX05PTkUsCisJCQlGT0dfTElORUFSLAorCQkJRk9HX0VYUCwKKwkJCUZPR19FWFAyLAorCisJCQlGT0dfTEFTVCA9IEZPR19FWFAyCisJCX07CisKKwkJZW51bSBUZXhHZW4KKwkJeworCQkJVEVYR0VOX1BBU1NUSFJVLAorCQkJVEVYR0VOX05PUk1BTCwKKwkJCVRFWEdFTl9QT1NJVElPTiwKKwkJCVRFWEdFTl9SRUZMRUNUSU9OLAorCQkJVEVYR0VOX1NQSEVSRU1BUCwKKworCQkJVEVYR0VOX0xBU1QgPSBURVhHRU5fU1BIRVJFTUFQCisJCX07CisKKwkJZW51bSBUcmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcKKwkJeworCQkJVFJBTlNQQVJFTkNZX05PTkUsCisJCQlUUkFOU1BBUkVOQ1lfQUxQSEFfVE9fQ09WRVJBR0UsCisKKwkJCVRSQU5TUEFSRU5DWV9MQVNUID0gVFJBTlNQQVJFTkNZX0FMUEhBX1RPX0NPVkVSQUdFCisJCX07CisKKwkJQ29udGV4dCgpOworCisJCX5Db250ZXh0KCk7CisKKwkJdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBieXRlcyk7CisJCXZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnBvaW50ZXIsIHNpemVfdCBieXRlcyk7CisKKwkJYm9vbCBpc0RyYXdQb2ludChib29sIGZpbGxNb2RlQXdhcmUgPSBmYWxzZSkgY29uc3Q7CisJCWJvb2wgaXNEcmF3TGluZShib29sIGZpbGxNb2RlQXdhcmUgPSBmYWxzZSkgY29uc3Q7CisJCWJvb2wgaXNEcmF3VHJpYW5nbGUoYm9vbCBmaWxsTW9kZUF3YXJlID0gZmFsc2UpIGNvbnN0OworCisJCXZvaWQgaW5pdCgpOworCisJCWNvbnN0IGZsb2F0ICZleHAyQmlhcygpOyAgIC8vIE5PVEU6IE5lZWRzIGFkZHJlc3MgZm9yIEpJVAorCQkKKwkJY29uc3QgUG9pbnQgJmdldExpZ2h0UG9zaXRpb24oaW50IGxpZ2h0KTsKKworCQl2b2lkIHNldEdsb2JhbE1pcG1hcEJpYXMoZmxvYXQgYmlhcyk7CisKKwkJLy8gU2V0IGZpeGVkLWZ1bmN0aW9uIHZlcnRleCBwaXBlbGluZSBzdGF0ZXMKKwkJdm9pZCBzZXRMaWdodGluZ0VuYWJsZShib29sIGxpZ2h0aW5nRW5hYmxlKTsKKwkJdm9pZCBzZXRTcGVjdWxhckVuYWJsZShib29sIHNwZWN1bGFyRW5hYmxlKTsKKwkJdm9pZCBzZXRMaWdodEVuYWJsZShpbnQgbGlnaHQsIGJvb2wgbGlnaHRFbmFibGUpOworCQl2b2lkIHNldExpZ2h0UG9zaXRpb24oaW50IGxpZ2h0LCBQb2ludCB3b3JsZExpZ2h0UG9zaXRpb24pOworCisJCXZvaWQgc2V0Q29sb3JWZXJ0ZXhFbmFibGUoYm9vbCBjb2xvclZlcnRleEVuYWJsZSk7CisJCXZvaWQgc2V0QW1iaWVudE1hdGVyaWFsU291cmNlKE1hdGVyaWFsU291cmNlIGFtYmllbnRNYXRlcmlhbFNvdXJjZSk7CisJCXZvaWQgc2V0RGlmZnVzZU1hdGVyaWFsU291cmNlKE1hdGVyaWFsU291cmNlIGRpZmZ1c2VNYXRlcmlhbFNvdXJjZSk7CisJCXZvaWQgc2V0U3BlY3VsYXJNYXRlcmlhbFNvdXJjZShNYXRlcmlhbFNvdXJjZSBzcGVjdWxhck1hdGVyaWFsU291cmNlKTsKKwkJdm9pZCBzZXRFbWlzc2l2ZU1hdGVyaWFsU291cmNlKE1hdGVyaWFsU291cmNlIGVtaXNzaXZlTWF0ZXJpYWxTb3VyY2UpOworCisJCXZvaWQgc2V0UG9pbnRTcHJpdGVFbmFibGUoYm9vbCBwb2ludFNwcml0ZUVuYWJsZSk7CisJCXZvaWQgc2V0UG9pbnRTY2FsZUVuYWJsZShib29sIHBvaW50U2NhbGVFbmFibGUpOworCisJCS8vIFNldCBmaXhlZC1mdW5jdGlvbiBwaXhlbCBwaXBlbGluZSBzdGF0ZXMsIHJldHVybiB0cnVlIHdoZW4gbW9kaWZpZWQKKwkJYm9vbCBzZXREZXB0aEJ1ZmZlckVuYWJsZShib29sIGRlcHRoQnVmZmVyRW5hYmxlKTsKKworCQlib29sIHNldEFscGhhQmxlbmRFbmFibGUoYm9vbCBhbHBoYUJsZW5kRW5hYmxlKTsKKwkJYm9vbCBzZXRTb3VyY2VCbGVuZEZhY3RvcihCbGVuZEZhY3RvciBzb3VyY2VCbGVuZEZhY3Rvcik7CisJCWJvb2wgc2V0RGVzdEJsZW5kRmFjdG9yKEJsZW5kRmFjdG9yIGRlc3RCbGVuZEZhY3Rvcik7CisJCWJvb2wgc2V0QmxlbmRPcGVyYXRpb24oQmxlbmRPcGVyYXRpb24gYmxlbmRPcGVyYXRpb24pOworCisJCWJvb2wgc2V0U2VwYXJhdGVBbHBoYUJsZW5kRW5hYmxlKGJvb2wgc2VwYXJhdGVBbHBoYUJsZW5kRW5hYmxlKTsKKwkJYm9vbCBzZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKENvbnRleHQ6OkJsZW5kRmFjdG9yIHNvdXJjZUJsZW5kRmFjdG9yQWxwaGEpOworCQlib29sIHNldERlc3RCbGVuZEZhY3RvckFscGhhKENvbnRleHQ6OkJsZW5kRmFjdG9yIGRlc3RCbGVuZEZhY3RvckFscGhhKTsKKwkJYm9vbCBzZXRCbGVuZE9wZXJhdGlvbkFscGhhKENvbnRleHQ6OkJsZW5kT3BlcmF0aW9uIGJsZW5kT3BlcmF0aW9uQWxwaGEpOworCisJCWJvb2wgc2V0Q29sb3JXcml0ZU1hc2soaW50IGluZGV4LCBpbnQgY29sb3JXcml0ZU1hc2spOworCQlib29sIHNldFdyaXRlU1JHQihib29sIHNSR0IpOworCisJCS8vIEFjdGl2ZSBmaXhlZC1mdW5jdGlvbiBwaXhlbCBwaXBlbGluZSBzdGF0ZXMKKwkJYm9vbCBmb2dBY3RpdmUoKTsKKwkJYm9vbCBwb2ludFNpemVBY3RpdmUoKTsKKwkJQ29udGV4dDo6Rm9nTW9kZSBwaXhlbEZvZ0FjdGl2ZSgpOworCQlib29sIGRlcHRoV3JpdGVBY3RpdmUoKTsKKwkJYm9vbCBhbHBoYVRlc3RBY3RpdmUoKTsKKwkJYm9vbCBkZXB0aEJ1ZmZlckFjdGl2ZSgpOworCQlib29sIHN0ZW5jaWxBY3RpdmUoKTsKKworCQlib29sIHBlcnNwZWN0aXZlQWN0aXZlKCk7CisKKwkJLy8gQWN0aXZlIGZpeGVkLWZ1bmN0aW9uIHZlcnRleCBwaXBlbGluZSBzdGF0ZXMKKwkJYm9vbCB2ZXJ0ZXhMaWdodGluZ0FjdGl2ZSgpOworCQlib29sIHZlcnRleFRleHR1cmVBY3RpdmUoaW50IGNvb3JkaW5hdGUsIGludCBjb21wb25lbnQpOworCQlib29sIHZlcnRleFRleHR1cmVBY3RpdmUoaW50IGNvb3JkaW5hdGUpOworCQlib29sIGlzUHJvamVjdGlvbkNvbXBvbmVudCh1bnNpZ25lZCBpbnQgY29vcmRpbmF0ZSwgaW50IGNvbXBvbmVudCk7CisJCWJvb2wgdmVydGV4U3BlY3VsYXJJbnB1dEFjdGl2ZSgpOworCQlib29sIHZlcnRleFNwZWN1bGFyQWN0aXZlKCk7CisJCWJvb2wgdmVydGV4Tm9ybWFsQWN0aXZlKCk7CisJCWJvb2wgdmVydGV4TGlnaHRBY3RpdmUoKTsKKwkJYm9vbCB2ZXJ0ZXhMaWdodEFjdGl2ZShpbnQgaSk7CisJCU1hdGVyaWFsU291cmNlIHZlcnRleERpZmZ1c2VNYXRlcmlhbFNvdXJjZUFjdGl2ZSgpOworCQlNYXRlcmlhbFNvdXJjZSB2ZXJ0ZXhTcGVjdWxhck1hdGVyaWFsU291cmNlQWN0aXZlKCk7CisJCU1hdGVyaWFsU291cmNlIHZlcnRleEFtYmllbnRNYXRlcmlhbFNvdXJjZUFjdGl2ZSgpOworCQlNYXRlcmlhbFNvdXJjZSB2ZXJ0ZXhFbWlzc2l2ZU1hdGVyaWFsU291cmNlQWN0aXZlKCk7CisKKwkJYm9vbCBwb2ludFNwcml0ZUFjdGl2ZSgpOworCQlib29sIHBvaW50U2NhbGVBY3RpdmUoKTsKKworCQlib29sIGFscGhhQmxlbmRBY3RpdmUoKTsKKwkJQmxlbmRGYWN0b3Igc291cmNlQmxlbmRGYWN0b3IoKTsKKwkJQmxlbmRGYWN0b3IgZGVzdEJsZW5kRmFjdG9yKCk7CisJCUJsZW5kT3BlcmF0aW9uIGJsZW5kT3BlcmF0aW9uKCk7CisKKwkJQmxlbmRGYWN0b3Igc291cmNlQmxlbmRGYWN0b3JBbHBoYSgpOworCQlCbGVuZEZhY3RvciBkZXN0QmxlbmRGYWN0b3JBbHBoYSgpOworCQlCbGVuZE9wZXJhdGlvbiBibGVuZE9wZXJhdGlvbkFscGhhKCk7CisKKwkJYm9vbCBpbmRleGVkVmVydGV4QmxlbmRBY3RpdmUoKTsKKwkJaW50IHZlcnRleEJsZW5kTWF0cml4Q291bnRBY3RpdmUoKTsKKwkJYm9vbCBsb2NhbFZpZXdlckFjdGl2ZSgpOworCQlib29sIG5vcm1hbGl6ZU5vcm1hbHNBY3RpdmUoKTsKKwkJRm9nTW9kZSB2ZXJ0ZXhGb2dNb2RlQWN0aXZlKCk7CisJCWJvb2wgcmFuZ2VGb2dBY3RpdmUoKTsKKworCQlUZXhHZW4gdGV4R2VuQWN0aXZlKGludCBzdGFnZSk7CisJCWludCB0ZXh0dXJlVHJhbnNmb3JtQ291bnRBY3RpdmUoaW50IHN0YWdlKTsKKwkJaW50IHRleENvb3JkSW5kZXhBY3RpdmUoaW50IHN0YWdlKTsKKworCQkvLyBBY3RpdmUgY29udGV4dCBzdGF0ZXMKKwkJYm9vbCBkaWZmdXNlVXNlZCgpOyAgICAgLy8gVXNlZCBieSBwaXhlbCBwcm9jZXNzb3IgYnV0IG5vdCBwcm92aWRlZCBieSB2ZXJ0ZXggcHJvY2Vzc29yCisJCWJvb2wgZGlmZnVzZVVzZWQoaW50IGNvbXBvbmVudCk7ICAgICAvLyBVc2VkIGJ5IHBpeGVsIHByb2Nlc3NvciBidXQgbm90IHByb3ZpZGVkIGJ5IHZlcnRleCBwcm9jZXNzb3IKKwkJYm9vbCBkaWZmdXNlQWN0aXZlKCk7CisJCWJvb2wgZGlmZnVzZUFjdGl2ZShpbnQgY29tcG9uZW50KTsKKwkJYm9vbCBzcGVjdWxhclVzZWQoKTsKKwkJYm9vbCBzcGVjdWxhclVzZWQoaW50IGNvbXBvbmVudCk7CisJCWJvb2wgc3BlY3VsYXJBY3RpdmUoKTsKKwkJYm9vbCBzcGVjdWxhckFjdGl2ZShpbnQgY29tcG9uZW50KTsKKwkJYm9vbCBjb2xvckFjdGl2ZShpbnQgY29sb3IsIGludCBjb21wb25lbnQpOworCQlib29sIHRleHR1cmVBY3RpdmUoKTsKKwkJYm9vbCB0ZXh0dXJlQWN0aXZlKGludCBjb29yZGluYXRlKTsKKwkJYm9vbCB0ZXh0dXJlQWN0aXZlKGludCBjb29yZGluYXRlLCBpbnQgY29tcG9uZW50KTsKKworCQl1bnNpZ25lZCBzaG9ydCBwaXhlbFNoYWRlclZlcnNpb24oKSBjb25zdDsKKwkJdW5zaWduZWQgc2hvcnQgdmVydGV4U2hhZGVyVmVyc2lvbigpIGNvbnN0OworCisJCURyYXdUeXBlIGRyYXdUeXBlOworCisJCWJvb2wgc3RlbmNpbEVuYWJsZTsKKwkJU3RlbmNpbENvbXBhcmVNb2RlIHN0ZW5jaWxDb21wYXJlTW9kZTsKKwkJaW50IHN0ZW5jaWxSZWZlcmVuY2U7CisJCWludCBzdGVuY2lsTWFzazsKKwkJU3RlbmNpbE9wZXJhdGlvbiBzdGVuY2lsRmFpbE9wZXJhdGlvbjsKKwkJU3RlbmNpbE9wZXJhdGlvbiBzdGVuY2lsUGFzc09wZXJhdGlvbjsKKwkJU3RlbmNpbE9wZXJhdGlvbiBzdGVuY2lsWkZhaWxPcGVyYXRpb247CisJCWludCBzdGVuY2lsV3JpdGVNYXNrOworCQkKKwkJYm9vbCB0d29TaWRlZFN0ZW5jaWw7CisJCVN0ZW5jaWxDb21wYXJlTW9kZSBzdGVuY2lsQ29tcGFyZU1vZGVDQ1c7CisJCWludCBzdGVuY2lsUmVmZXJlbmNlQ0NXOworCQlpbnQgc3RlbmNpbE1hc2tDQ1c7CisJCVN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbEZhaWxPcGVyYXRpb25DQ1c7CisJCVN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbFBhc3NPcGVyYXRpb25DQ1c7CisJCVN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbFpGYWlsT3BlcmF0aW9uQ0NXOworCQlpbnQgc3RlbmNpbFdyaXRlTWFza0NDVzsKKworCQkvLyBQaXhlbCBwcm9jZXNzb3Igc3RhdGVzCisJCUFscGhhQ29tcGFyZU1vZGUgYWxwaGFDb21wYXJlTW9kZTsKKwkJYm9vbCBhbHBoYVRlc3RFbmFibGU7CisJCUZpbGxNb2RlIGZpbGxNb2RlOworCQlTaGFkaW5nTW9kZSBzaGFkaW5nTW9kZTsKKworCQlDdWxsTW9kZSBjdWxsTW9kZTsKKwkJaW50IGFscGhhUmVmZXJlbmNlOworCQkKKwkJVGV4dHVyZVN0YWdlIHRleHR1cmVTdGFnZVs4XTsKKwkJU2FtcGxlciBzYW1wbGVyWzE2ICsgNF07CisKKwkJRm9ybWF0IHJlbmRlclRhcmdldEludGVybmFsRm9ybWF0KGludCBpbmRleCk7CisJCWludCBjb2xvcldyaXRlQWN0aXZlKCk7CisJCWludCBjb2xvcldyaXRlQWN0aXZlKGludCBpbmRleCk7CisJCWJvb2wgY29sb3JVc2VkKCk7CisKKwkJUmVzb3VyY2UgKnRleHR1cmVbMTYgKyA0XTsKKwkJU3RyZWFtIGlucHV0WzE2XTsKKwkJUmVzb3VyY2UgKmluZGV4QnVmZmVyOworCisJCWJvb2wgcHJlVHJhbnNmb3JtZWQ7ICAgLy8gRklYTUU6IFByaXZhdGUKKwkJYm9vbCBwb3N0VHJhbnNmb3JtOworCisJCWZsb2F0IGZvZ1N0YXJ0OworCQlmbG9hdCBmb2dFbmQ7CisKKwkJdm9pZCBjb21wdXRlSWxsdW1pbmF0aW9uKCk7CisKKwkJYm9vbCB0ZXh0dXJlV3JhcEFjdGl2ZTsKKwkJdW5zaWduZWQgY2hhciB0ZXh0dXJlV3JhcFsxNl07CisJCUNvbnRleHQ6OlRleEdlbiB0ZXhHZW5bOF07CisJCWJvb2wgbG9jYWxWaWV3ZXI7CisJCWJvb2wgbm9ybWFsaXplTm9ybWFsczsKKwkJaW50IHRleHR1cmVUcmFuc2Zvcm1Db3VudFs4XTsKKwkJYm9vbCB0ZXh0dXJlVHJhbnNmb3JtUHJvamVjdFs4XTsKKworCQlTdXJmYWNlICpyZW5kZXJUYXJnZXRbNF07CisJCVN1cmZhY2UgKmRlcHRoU3RlbmNpbDsKKworCQkvLyBGb2cKKwkJYm9vbCBmb2dFbmFibGU7CisJCUZvZ01vZGUgcGl4ZWxGb2dNb2RlOworCQlGb2dNb2RlIHZlcnRleEZvZ01vZGU7CisJCWJvb2wgd0Jhc2VkRm9nOworCQlib29sIHJhbmdlRm9nRW5hYmxlOworCisJCS8vIFZlcnRleCBibGVuZGluZworCQlib29sIGluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZTsKKwkJaW50IHZlcnRleEJsZW5kTWF0cml4Q291bnQ7CisKKwkJLy8gU2hhZGVycworCQljb25zdCBQaXhlbFNoYWRlciAqcGl4ZWxTaGFkZXI7CisJCWNvbnN0IFZlcnRleFNoYWRlciAqdmVydGV4U2hhZGVyOworCisJCS8vIEdsb2JhbCBtaXBtYXAgYmlhcworCQlmbG9hdCBiaWFzOworCisJCS8vIEZpeGVkLWZ1bmN0aW9uIHZlcnRleCBwaXBlbGluZSBzdGF0ZQorCQlib29sIGxpZ2h0aW5nRW5hYmxlOworCQlib29sIHNwZWN1bGFyRW5hYmxlOworCQlib29sIGxpZ2h0RW5hYmxlWzhdOworCQlQb2ludCB3b3JsZExpZ2h0UG9zaXRpb25bOF07CisKKwkJTWF0ZXJpYWxTb3VyY2UgYW1iaWVudE1hdGVyaWFsU291cmNlOworCQlNYXRlcmlhbFNvdXJjZSBkaWZmdXNlTWF0ZXJpYWxTb3VyY2U7CisJCU1hdGVyaWFsU291cmNlIHNwZWN1bGFyTWF0ZXJpYWxTb3VyY2U7CisJCU1hdGVyaWFsU291cmNlIGVtaXNzaXZlTWF0ZXJpYWxTb3VyY2U7CisJCWJvb2wgY29sb3JWZXJ0ZXhFbmFibGU7CisKKwkJYm9vbCBvY2NsdXNpb25FbmFibGVkOworCisJCS8vIFBpeGVsIHByb2Nlc3NvciBzdGF0ZXMKKwkJYm9vbCBkZXB0aEJ1ZmZlckVuYWJsZTsKKwkJRGVwdGhDb21wYXJlTW9kZSBkZXB0aENvbXBhcmVNb2RlOworCQlib29sIGRlcHRoV3JpdGVFbmFibGU7CisKKwkJYm9vbCBhbHBoYUJsZW5kRW5hYmxlOworCQlCbGVuZEZhY3RvciBzb3VyY2VCbGVuZEZhY3RvclN0YXRlOworCQlCbGVuZEZhY3RvciBkZXN0QmxlbmRGYWN0b3JTdGF0ZTsKKwkJQmxlbmRPcGVyYXRpb24gYmxlbmRPcGVyYXRpb25TdGF0ZTsKKworCQlib29sIHNlcGFyYXRlQWxwaGFCbGVuZEVuYWJsZTsKKwkJQmxlbmRGYWN0b3Igc291cmNlQmxlbmRGYWN0b3JTdGF0ZUFscGhhOworCQlCbGVuZEZhY3RvciBkZXN0QmxlbmRGYWN0b3JTdGF0ZUFscGhhOworCQlCbGVuZE9wZXJhdGlvbiBibGVuZE9wZXJhdGlvblN0YXRlQWxwaGE7CisKKwkJYm9vbCBwb2ludFNwcml0ZUVuYWJsZTsKKwkJYm9vbCBwb2ludFNjYWxlRW5hYmxlOworCisJCWludCBjb2xvcldyaXRlTWFza1s0XTsgICAvLyBSR0JBCisJCWJvb2wgd3JpdGVTUkdCOworCQl1bnNpZ25lZCBpbnQgc2FtcGxlTWFzazsKKwkJdW5zaWduZWQgaW50IG11bHRpU2FtcGxlTWFzazsKKwl9OworfQorCisjZW5kaWYgICAvLyBzd19Db250ZXh0X2hwcApkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL0xSVUNhY2hlLmhwcCBiL3NyYy9SZW5kZXJlci9MUlVDYWNoZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlMTVmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9MUlVDYWNoZS5ocHAKQEAgLTAsMCArMSwxNDIgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIHN3X0xSVUNhY2hlX2hwcA0KKyNkZWZpbmUgc3dfTFJVQ2FjaGVfaHBwDQorDQorI2luY2x1ZGUgIkNvbW1vbi9NYXRoLmhwcCINCisNCituYW1lc3BhY2Ugc3cNCit7DQorCXRlbXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgRGF0YT4NCisJY2xhc3MgTFJVQ2FjaGUNCisJew0KKwlwdWJsaWM6DQorCQlMUlVDYWNoZShpbnQgbik7DQorDQorCQl+TFJVQ2FjaGUoKTsNCisNCisJCURhdGEgKnF1ZXJ5KGNvbnN0IEtleSAma2V5KSBjb25zdDsNCisJCURhdGEgKmFkZChjb25zdCBLZXkgJmtleSwgRGF0YSAqZGF0YSk7DQorCQkNCisJCWludCBnZXRTaXplKCkge3JldHVybiBzaXplO30NCisJCUtleSAmZ2V0S2V5KGludCBpKSB7cmV0dXJuIGtleVtpXTt9DQorDQorCXByaXZhdGU6DQorCQlpbnQgc2l6ZTsNCisJCWludCBtYXNrOw0KKwkJaW50IHRvcDsNCisJCWludCBmaWxsOw0KKw0KKwkJS2V5ICprZXk7DQorCQlLZXkgKipyZWY7DQorCQlEYXRhICoqZGF0YTsNCisJfTsNCit9DQorDQorbmFtZXNwYWNlIHN3DQorew0KKwl0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIERhdGE+DQorCUxSVUNhY2hlPEtleSwgRGF0YT46OkxSVUNhY2hlKGludCBuKQ0KKwl7DQorCQlzaXplID0gY2VpbFBvdzIobik7DQorCQltYXNrID0gc2l6ZSAtIDE7DQorCQl0b3AgPSAwOw0KKwkJZmlsbCA9IDA7DQorDQorCQlrZXkgPSBuZXcgS2V5W3NpemVdOw0KKwkJcmVmID0gbmV3IEtleSpbc2l6ZV07DQorCQlkYXRhID0gbmV3IERhdGEqW3NpemVdOw0KKwkJDQorCQlmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKwkJew0KKwkJCWRhdGFbaV0gPSAwOw0KKw0KKwkJCXJlZltpXSA9ICZrZXlbaV07DQorCQl9DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBEYXRhPg0KKwlMUlVDYWNoZTxLZXksIERhdGE+Ojp+TFJVQ2FjaGUoKQ0KKwl7DQorCQlkZWxldGVbXSBrZXk7DQorCQlrZXkgPSAwOw0KKw0KKwkJZGVsZXRlW10gcmVmOw0KKwkJcmVmID0gMDsNCisNCisJCWZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspDQorCQl7DQorCQkJaWYoZGF0YVtpXSkNCisJCQl7DQorCQkJCWRhdGFbaV0tPnVuYmluZCgpOw0KKwkJCQlkYXRhW2ldID0gMDsNCisJCQl9DQorCQl9DQorDQorCQlkZWxldGVbXSBkYXRhOw0KKwkJZGF0YSA9IDA7DQorCX0NCisNCisJdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBEYXRhPg0KKwlEYXRhICpMUlVDYWNoZTxLZXksIERhdGE+OjpxdWVyeShjb25zdCBLZXkgJmtleSkgY29uc3QNCisJew0KKwkJZm9yKGludCBpID0gdG9wOyBpID4gdG9wIC0gZmlsbDsgaS0tKQ0KKwkJew0KKwkJCWludCBqID0gaSAmIG1hc2s7DQorDQorCQkJaWYoa2V5ID09ICpyZWZbal0pDQorCQkJew0KKwkJCQlEYXRhICpoaXQgPSBkYXRhW2pdOw0KKw0KKwkJCQlpZihpICE9IHRvcCkNCisJCQkJew0KKwkJCQkJLy8gTW92ZSBvbmUgdXANCisJCQkJCWludCBrID0gKGogKyAxKSAmIG1hc2s7DQorDQorCQkJCQlEYXRhICpzd2FwRCA9IGRhdGFba107DQorCQkJCQlkYXRhW2tdID0gZGF0YVtqXTsNCisJCQkJCWRhdGFbal0gPSBzd2FwRDsNCisNCisJCQkJCUtleSAqc3dhcEsgPSByZWZba107DQorCQkJCQlyZWZba10gPSByZWZbal07DQorCQkJCQlyZWZbal0gPSBzd2FwSzsNCisJCQkJfQ0KKw0KKwkJCQlyZXR1cm4gaGl0Ow0KKwkJCX0NCisJCX0NCisNCisJCXJldHVybiAwOyAgIC8vIE5vdCBmb3VuZA0KKwl9DQorCQ0KKwl0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIERhdGE+DQorCURhdGEgKkxSVUNhY2hlPEtleSwgRGF0YT46OmFkZChjb25zdCBLZXkgJmtleSwgRGF0YSAqZGF0YSkNCisJew0KKwkJdG9wID0gKHRvcCArIDEpICYgbWFzazsNCisJCWZpbGwgPSBmaWxsICsgMSA8IHNpemUgPyBmaWxsICsgMSA6IHNpemU7DQorDQorCQkqcmVmW3RvcF0gPSBrZXk7DQorCQ0KKwkJZGF0YS0+YmluZCgpOw0KKwkJDQorCQlpZih0aGlzLT5kYXRhW3RvcF0pDQorCQl7DQorCQkJdGhpcy0+ZGF0YVt0b3BdLT51bmJpbmQoKTsNCisJCX0NCisNCisJCXRoaXMtPmRhdGFbdG9wXSA9IGRhdGE7DQorDQorCQlyZXR1cm4gZGF0YTsNCisJfQ0KK30NCisNCisjZW5kaWYgICAvLyBzd19MUlVDYWNoZV9ocHANCmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvTWF0cml4LmNwcCBiL3NyYy9SZW5kZXJlci9NYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlN2FjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvTWF0cml4LmNwcApAQCAtMCwwICsxLDM4OCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiTWF0cml4LmhwcCIKKworI2luY2x1ZGUgIlBvaW50LmhwcCIKKyNpbmNsdWRlICJNYXRoLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJTWF0cml4IE1hdHJpeDo6ZGlhZyhmbG9hdCBtMTEsIGZsb2F0IG0yMiwgZmxvYXQgbTMzLCBmbG9hdCBtNDQpCisJeworCQlyZXR1cm4gTWF0cml4KG0xMSwgMCwgICAwLCAgIDAsCisJCSAgICAgICAgICAgICAgMCwgICBtMjIsIDAsICAgMCwKKwkJICAgICAgICAgICAgICAwLCAgIDAsICAgbTMzLCAwLAorCQkgICAgICAgICAgICAgIDAsICAgMCwgICAwLCAgIG00NCk7CisJfQorCisJTWF0cml4OjpvcGVyYXRvciBmbG9hdCooKQorCXsKKwkJcmV0dXJuICYoKnRoaXMpKDEsIDEpOworCX0KKworCU1hdHJpeCBNYXRyaXg6Om9wZXJhdG9yKygpIGNvbnN0CisJeworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJTWF0cml4IE1hdHJpeDo6b3BlcmF0b3ItKCkgY29uc3QKKwl7CisJCWNvbnN0IE1hdHJpeCAmTSA9ICp0aGlzOworCisJCXJldHVybiBNYXRyaXgoLU0oMSwgMSksIC1NKDEsIDIpLCAtTSgxLCAzKSwgLU0oMSwgNCksIAorCQkgICAgICAgICAgICAgIC1NKDIsIDEpLCAtTSgyLCAyKSwgLU0oMiwgMyksIC1NKDIsIDQpLCAKKwkJICAgICAgICAgICAgICAtTSgzLCAxKSwgLU0oMywgMiksIC1NKDMsIDMpLCAtTSgzLCA0KSwgCisJCSAgICAgICAgICAgICAgLU0oNCwgMSksIC1NKDQsIDIpLCAtTSg0LCAzKSwgLU0oNCwgNCkpOworCX0KKworCU1hdHJpeCBNYXRyaXg6Om9wZXJhdG9yISgpIGNvbnN0CisJeworCQljb25zdCBNYXRyaXggJk0gPSAqdGhpczsKKwkJTWF0cml4IEk7CisKKwkJZmxvYXQgTTMzNDQgPSBNKDMsIDMpICogTSg0LCA0KSAtIE0oNCwgMykgKiBNKDMsIDQpOworCQlmbG9hdCBNMjM0NCA9IE0oMiwgMykgKiBNKDQsIDQpIC0gTSg0LCAzKSAqIE0oMiwgNCk7CisJCWZsb2F0IE0yMzM0ID0gTSgyLCAzKSAqIE0oMywgNCkgLSBNKDMsIDMpICogTSgyLCA0KTsKKwkJZmxvYXQgTTMyNDQgPSBNKDMsIDIpICogTSg0LCA0KSAtIE0oNCwgMikgKiBNKDMsIDQpOworCQlmbG9hdCBNMjI0NCA9IE0oMiwgMikgKiBNKDQsIDQpIC0gTSg0LCAyKSAqIE0oMiwgNCk7CisJCWZsb2F0IE0yMjM0ID0gTSgyLCAyKSAqIE0oMywgNCkgLSBNKDMsIDIpICogTSgyLCA0KTsKKwkJZmxvYXQgTTMyNDMgPSBNKDMsIDIpICogTSg0LCAzKSAtIE0oNCwgMikgKiBNKDMsIDMpOworCQlmbG9hdCBNMjI0MyA9IE0oMiwgMikgKiBNKDQsIDMpIC0gTSg0LCAyKSAqIE0oMiwgMyk7CisJCWZsb2F0IE0yMjMzID0gTSgyLCAyKSAqIE0oMywgMykgLSBNKDMsIDIpICogTSgyLCAzKTsKKwkJZmxvYXQgTTEzNDQgPSBNKDEsIDMpICogTSg0LCA0KSAtIE0oNCwgMykgKiBNKDEsIDQpOworCQlmbG9hdCBNMTMzNCA9IE0oMSwgMykgKiBNKDMsIDQpIC0gTSgzLCAzKSAqIE0oMSwgNCk7CisJCWZsb2F0IE0xMjQ0ID0gTSgxLCAyKSAqIE0oNCwgNCkgLSBNKDQsIDIpICogTSgxLCA0KTsKKwkJZmxvYXQgTTEyMzQgPSBNKDEsIDIpICogTSgzLCA0KSAtIE0oMywgMikgKiBNKDEsIDQpOworCQlmbG9hdCBNMTI0MyA9IE0oMSwgMikgKiBNKDQsIDMpIC0gTSg0LCAyKSAqIE0oMSwgMyk7CisJCWZsb2F0IE0xMjMzID0gTSgxLCAyKSAqIE0oMywgMykgLSBNKDMsIDIpICogTSgxLCAzKTsKKwkJZmxvYXQgTTEzMjQgPSBNKDEsIDMpICogTSgyLCA0KSAtIE0oMiwgMykgKiBNKDEsIDQpOworCQlmbG9hdCBNMTIyNCA9IE0oMSwgMikgKiBNKDIsIDQpIC0gTSgyLCAyKSAqIE0oMSwgNCk7CisJCWZsb2F0IE0xMjIzID0gTSgxLCAyKSAqIE0oMiwgMykgLSBNKDIsIDIpICogTSgxLCAzKTsKKworCQkvLyBBZGpvaW50IE1hdHJpeAorCQlJKDEsIDEpID0gIE0oMiwgMikgKiBNMzM0NCAtIE0oMywgMikgKiBNMjM0NCArIE0oNCwgMikgKiBNMjMzNDsKKwkJSSgyLCAxKSA9IC1NKDIsIDEpICogTTMzNDQgKyBNKDMsIDEpICogTTIzNDQgLSBNKDQsIDEpICogTTIzMzQ7CisJCUkoMywgMSkgPSAgTSgyLCAxKSAqIE0zMjQ0IC0gTSgzLCAxKSAqIE0yMjQ0ICsgTSg0LCAxKSAqIE0yMjM0OworCQlJKDQsIDEpID0gLU0oMiwgMSkgKiBNMzI0MyArIE0oMywgMSkgKiBNMjI0MyAtIE0oNCwgMSkgKiBNMjIzMzsKKworCQlJKDEsIDIpID0gLU0oMSwgMikgKiBNMzM0NCArIE0oMywgMikgKiBNMTM0NCAtIE0oNCwgMikgKiBNMTMzNDsKKwkJSSgyLCAyKSA9ICBNKDEsIDEpICogTTMzNDQgLSBNKDMsIDEpICogTTEzNDQgKyBNKDQsIDEpICogTTEzMzQ7CisJCUkoMywgMikgPSAtTSgxLCAxKSAqIE0zMjQ0ICsgTSgzLCAxKSAqIE0xMjQ0IC0gTSg0LCAxKSAqIE0xMjM0OworCQlJKDQsIDIpID0gIE0oMSwgMSkgKiBNMzI0MyAtIE0oMywgMSkgKiBNMTI0MyArIE0oNCwgMSkgKiBNMTIzMzsKKworCQlJKDEsIDMpID0gIE0oMSwgMikgKiBNMjM0NCAtIE0oMiwgMikgKiBNMTM0NCArIE0oNCwgMikgKiBNMTMyNDsKKwkJSSgyLCAzKSA9IC1NKDEsIDEpICogTTIzNDQgKyBNKDIsIDEpICogTTEzNDQgLSBNKDQsIDEpICogTTEzMjQ7CisJCUkoMywgMykgPSAgTSgxLCAxKSAqIE0yMjQ0IC0gTSgyLCAxKSAqIE0xMjQ0ICsgTSg0LCAxKSAqIE0xMjI0OworCQlJKDQsIDMpID0gLU0oMSwgMSkgKiBNMjI0MyArIE0oMiwgMSkgKiBNMTI0MyAtIE0oNCwgMSkgKiBNMTIyMzsKKworCQlJKDEsIDQpID0gLU0oMSwgMikgKiBNMjMzNCArIE0oMiwgMikgKiBNMTMzNCAtIE0oMywgMikgKiBNMTMyNDsKKwkJSSgyLCA0KSA9ICBNKDEsIDEpICogTTIzMzQgLSBNKDIsIDEpICogTTEzMzQgKyBNKDMsIDEpICogTTEzMjQ7CisJCUkoMywgNCkgPSAtTSgxLCAxKSAqIE0yMjM0ICsgTSgyLCAxKSAqIE0xMjM0IC0gTSgzLCAxKSAqIE0xMjI0OworCQlJKDQsIDQpID0gIE0oMSwgMSkgKiBNMjIzMyAtIE0oMiwgMSkgKiBNMTIzMyArIE0oMywgMSkgKiBNMTIyMzsKKworCQkvLyBEaXZpc2lvbiBieSBkZXRlcm1pbmFudAorCQlJIC89IE0oMSwgMSkgKiBJKDEsIDEpICsKKwkJICAgICBNKDIsIDEpICogSSgxLCAyKSArCisJCSAgICAgTSgzLCAxKSAqIEkoMSwgMykgKworCQkgICAgIE0oNCwgMSkgKiBJKDEsIDQpOworCisJCXJldHVybiBJOworCX0KKworCU1hdHJpeCBNYXRyaXg6Om9wZXJhdG9yfigpIGNvbnN0CisJeworCQljb25zdCBNYXRyaXggJk0gPSAqdGhpczsKKworCQlyZXR1cm4gTWF0cml4KE0oMSwgMSksIE0oMiwgMSksIE0oMywgMSksIE0oNCwgMSksIAorCQkgICAgICAgICAgICAgIE0oMSwgMiksIE0oMiwgMiksIE0oMywgMiksIE0oNCwgMiksIAorCQkgICAgICAgICAgICAgIE0oMSwgMyksIE0oMiwgMyksIE0oMywgMyksIE0oNCwgMyksIAorCQkgICAgICAgICAgICAgIE0oMSwgNCksIE0oMiwgNCksIE0oMywgNCksIE0oNCwgNCkpOworCX0KKworCU1hdHJpeCAmTWF0cml4OjpvcGVyYXRvcis9KGNvbnN0IE1hdHJpeCAmTikKKwl7CisJCU1hdHJpeCAmTSA9ICp0aGlzOworCisJCU0oMSwgMSkgKz0gTigxLCAxKTsgTSgxLCAyKSArPSBOKDEsIDIpOyBNKDEsIDMpICs9IE4oMSwgMyk7IE0oMSwgNCkgKz0gTigxLCA0KTsKKwkJTSgyLCAxKSArPSBOKDIsIDEpOyBNKDIsIDIpICs9IE4oMiwgMik7IE0oMiwgMykgKz0gTigyLCAzKTsgTSgyLCA0KSArPSBOKDIsIDQpOworCQlNKDMsIDEpICs9IE4oMywgMSk7IE0oMywgMikgKz0gTigzLCAyKTsgTSgzLCAzKSArPSBOKDMsIDMpOyBNKDMsIDQpICs9IE4oMywgNCk7CisJCU0oNCwgMSkgKz0gTig0LCAxKTsgTSg0LCAyKSArPSBOKDQsIDIpOyBNKDQsIDMpICs9IE4oNCwgMyk7IE0oNCwgNCkgKz0gTig0LCA0KTsKKworCQlyZXR1cm4gTTsKKwl9CisKKwlNYXRyaXggJk1hdHJpeDo6b3BlcmF0b3ItPShjb25zdCBNYXRyaXggJk4pCisJeworCQlNYXRyaXggJk0gPSAqdGhpczsKKworCQlNKDEsIDEpIC09IE4oMSwgMSk7IE0oMSwgMikgLT0gTigxLCAyKTsgTSgxLCAzKSAtPSBOKDEsIDMpOyBNKDEsIDQpIC09IE4oMSwgNCk7CisJCU0oMiwgMSkgLT0gTigyLCAxKTsgTSgyLCAyKSAtPSBOKDIsIDIpOyBNKDIsIDMpIC09IE4oMiwgMyk7IE0oMiwgNCkgLT0gTigyLCA0KTsKKwkJTSgzLCAxKSAtPSBOKDMsIDEpOyBNKDMsIDIpIC09IE4oMywgMik7IE0oMywgMykgLT0gTigzLCAzKTsgTSgzLCA0KSAtPSBOKDMsIDQpOworCQlNKDQsIDEpIC09IE4oNCwgMSk7IE0oNCwgMikgLT0gTig0LCAyKTsgTSg0LCAzKSAtPSBOKDQsIDMpOyBNKDQsIDQpIC09IE4oNCwgNCk7CisKKwkJcmV0dXJuIE07CisJfQorCisJTWF0cml4ICZNYXRyaXg6Om9wZXJhdG9yKj0oZmxvYXQgcykKKwl7CisJCU1hdHJpeCAmTSA9ICp0aGlzOworCisJCU0oMSwgMSkgKj0gczsgTSgxLCAyKSAqPSBzOyBNKDEsIDMpICo9IHM7IE0oMSwgNCkgKj0gczsKKwkJTSgyLCAxKSAqPSBzOyBNKDIsIDIpICo9IHM7IE0oMiwgMykgKj0gczsgTSgyLCA0KSAqPSBzOworCQlNKDMsIDEpICo9IHM7IE0oMywgMikgKj0gczsgTSgzLCAzKSAqPSBzOyBNKDMsIDQpICo9IHM7CisJCU0oNCwgMSkgKj0gczsgTSg0LCAyKSAqPSBzOyBNKDQsIDMpICo9IHM7IE0oNCwgNCkgKj0gczsKKworCQlyZXR1cm4gTTsKKwl9CisKKwlNYXRyaXggJk1hdHJpeDo6b3BlcmF0b3IqPShjb25zdCBNYXRyaXggJk0pCisJeworCQlyZXR1cm4gKnRoaXMgPSAqdGhpcyAqIE07CisJfQorCisJTWF0cml4ICZNYXRyaXg6Om9wZXJhdG9yLz0oZmxvYXQgcykKKwl7CisJCWZsb2F0IHIgPSAxLjBmIC8gczsKKworCQlyZXR1cm4gKnRoaXMgKj0gcjsKKwl9CisKKwlib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0cml4ICZNLCBjb25zdCBNYXRyaXggJk4pCisJeworCQlpZihNKDEsIDEpID09IE4oMSwgMSkgJiYgTSgxLCAyKSA9PSBOKDEsIDIpICYmIE0oMSwgMykgPT0gTigxLCAzKSAmJiBNKDEsIDQpID09IE4oMSwgNCkgJiYKKwkJICAgTSgyLCAxKSA9PSBOKDIsIDEpICYmIE0oMiwgMikgPT0gTigyLCAyKSAmJiBNKDIsIDMpID09IE4oMiwgMykgJiYgTSgyLCA0KSA9PSBOKDIsIDQpICYmCisJCSAgIE0oMywgMSkgPT0gTigzLCAxKSAmJiBNKDMsIDIpID09IE4oMywgMikgJiYgTSgzLCAzKSA9PSBOKDMsIDMpICYmIE0oMywgNCkgPT0gTigzLCA0KSAmJgorCQkgICBNKDQsIDEpID09IE4oNCwgMSkgJiYgTSg0LCAyKSA9PSBOKDQsIDIpICYmIE0oNCwgMykgPT0gTig0LCAzKSAmJiBNKDQsIDQpID09IE4oNCwgNCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZWxzZQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCWJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXRyaXggJk0sIGNvbnN0IE1hdHJpeCAmTikKKwl7CisJCWlmKE0oMSwgMSkgIT0gTigxLCAxKSB8fCBNKDEsIDIpICE9IE4oMSwgMikgfHwgTSgxLCAzKSAhPSBOKDEsIDMpIHx8IE0oMSwgNCkgIT0gTigxLCA0KSB8fAorCQkgICBNKDIsIDEpICE9IE4oMiwgMSkgfHwgTSgyLCAyKSAhPSBOKDIsIDIpIHx8IE0oMiwgMykgIT0gTigyLCAzKSB8fCBNKDIsIDQpICE9IE4oMiwgNCkgfHwKKwkJICAgTSgzLCAxKSAhPSBOKDMsIDEpIHx8IE0oMywgMikgIT0gTigzLCAyKSB8fCBNKDMsIDMpICE9IE4oMywgMykgfHwgTSgzLCA0KSAhPSBOKDMsIDQpIHx8CisJCSAgIE0oNCwgMSkgIT0gTig0LCAxKSB8fCBNKDQsIDIpICE9IE4oNCwgMikgfHwgTSg0LCAzKSAhPSBOKDQsIDMpIHx8IE0oNCwgNCkgIT0gTig0LCA0KSkKKwkJCXJldHVybiB0cnVlOworCQllbHNlCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJTWF0cml4IG9wZXJhdG9yKyhjb25zdCBNYXRyaXggJk0sIGNvbnN0IE1hdHJpeCAmTikKKwl7CisJCXJldHVybiBNYXRyaXgoTSgxLCAxKSArIE4oMSwgMSksIE0oMSwgMikgKyBOKDEsIDIpLCBNKDEsIDMpICsgTigxLCAzKSwgTSgxLCA0KSArIE4oMSwgNCksIAorCQkgICAgICAgICAgICAgIE0oMiwgMSkgKyBOKDIsIDEpLCBNKDIsIDIpICsgTigyLCAyKSwgTSgyLCAzKSArIE4oMiwgMyksIE0oMiwgNCkgKyBOKDIsIDQpLCAKKwkJICAgICAgICAgICAgICBNKDMsIDEpICsgTigzLCAxKSwgTSgzLCAyKSArIE4oMywgMiksIE0oMywgMykgKyBOKDMsIDMpLCBNKDMsIDQpICsgTigzLCA0KSwgCisJCSAgICAgICAgICAgICAgTSg0LCAxKSArIE4oNCwgMSksIE0oNCwgMikgKyBOKDQsIDIpLCBNKDQsIDMpICsgTig0LCAzKSwgTSg0LCA0KSArIE4oNCwgNCkpOworCX0KKworCU1hdHJpeCBvcGVyYXRvci0oY29uc3QgTWF0cml4ICZNLCBjb25zdCBNYXRyaXggJk4pCisJeworCQlyZXR1cm4gTWF0cml4KE0oMSwgMSkgLSBOKDEsIDEpLCBNKDEsIDIpIC0gTigxLCAyKSwgTSgxLCAzKSAtIE4oMSwgMyksIE0oMSwgNCkgLSBOKDEsIDQpLCAKKwkJICAgICAgICAgICAgICBNKDIsIDEpIC0gTigyLCAxKSwgTSgyLCAyKSAtIE4oMiwgMiksIE0oMiwgMykgLSBOKDIsIDMpLCBNKDIsIDQpIC0gTigyLCA0KSwgCisJCSAgICAgICAgICAgICAgTSgzLCAxKSAtIE4oMywgMSksIE0oMywgMikgLSBOKDMsIDIpLCBNKDMsIDMpIC0gTigzLCAzKSwgTSgzLCA0KSAtIE4oMywgNCksIAorCQkgICAgICAgICAgICAgIE0oNCwgMSkgLSBOKDQsIDEpLCBNKDQsIDIpIC0gTig0LCAyKSwgTSg0LCAzKSAtIE4oNCwgMyksIE0oNCwgNCkgLSBOKDQsIDQpKTsKKwl9CisKKwlNYXRyaXggb3BlcmF0b3IqKGZsb2F0IHMsIGNvbnN0IE1hdHJpeCAmTSkKKwl7CisJCXJldHVybiBNYXRyaXgocyAqIE0oMSwgMSksIHMgKiBNKDEsIDIpLCBzICogTSgxLCAzKSwgcyAqIE0oMSwgNCksIAorCQkgICAgICAgICAgICAgIHMgKiBNKDIsIDEpLCBzICogTSgyLCAyKSwgcyAqIE0oMiwgMyksIHMgKiBNKDIsIDQpLCAKKwkJICAgICAgICAgICAgICBzICogTSgzLCAxKSwgcyAqIE0oMywgMiksIHMgKiBNKDMsIDMpLCBzICogTSgzLCA0KSwgCisJCSAgICAgICAgICAgICAgcyAqIE0oNCwgMSksIHMgKiBNKDQsIDIpLCBzICogTSg0LCAzKSwgcyAqIE0oNCwgNCkpOworCX0KKworCU1hdHJpeCBvcGVyYXRvciooY29uc3QgTWF0cml4ICZNLCBmbG9hdCBzKQorCXsKKwkJcmV0dXJuIE1hdHJpeChNKDEsIDEpICogcywgTSgxLCAyKSAqIHMsIE0oMSwgMykgKiBzLCBNKDEsIDQpICogcywgCisJCSAgICAgICAgICAgICAgTSgyLCAxKSAqIHMsIE0oMiwgMikgKiBzLCBNKDIsIDMpICogcywgTSgyLCA0KSAqIHMsIAorCQkgICAgICAgICAgICAgIE0oMywgMSkgKiBzLCBNKDMsIDIpICogcywgTSgzLCAzKSAqIHMsIE0oMywgNCkgKiBzLCAKKwkJICAgICAgICAgICAgICBNKDQsIDEpICogcywgTSg0LCAyKSAqIHMsIE0oNCwgMykgKiBzLCBNKDQsIDQpICogcyk7CisJfQorCisJTWF0cml4IG9wZXJhdG9yKihjb25zdCBNYXRyaXggJk0sIGNvbnN0IE1hdHJpeCAmTikKKwl7CisJCXJldHVybiBNYXRyaXgoTSgxLCAxKSAqIE4oMSwgMSkgKyBNKDEsIDIpICogTigyLCAxKSArIE0oMSwgMykgKiBOKDMsIDEpICsgTSgxLCA0KSAqIE4oNCwgMSksIE0oMSwgMSkgKiBOKDEsIDIpICsgTSgxLCAyKSAqIE4oMiwgMikgKyBNKDEsIDMpICogTigzLCAyKSArIE0oMSwgNCkgKiBOKDQsIDIpLCBNKDEsIDEpICogTigxLCAzKSArIE0oMSwgMikgKiBOKDIsIDMpICsgTSgxLCAzKSAqIE4oMywgMykgKyBNKDEsIDQpICogTig0LCAzKSwgTSgxLCAxKSAqIE4oMSwgNCkgKyBNKDEsIDIpICogTigyLCA0KSArIE0oMSwgMykgKiBOKDMsIDQpICsgTSgxLCA0KSAqIE4oNCwgNCksIAorCQkgICAgICAgICAgICAgIE0oMiwgMSkgKiBOKDEsIDEpICsgTSgyLCAyKSAqIE4oMiwgMSkgKyBNKDIsIDMpICogTigzLCAxKSArIE0oMiwgNCkgKiBOKDQsIDEpLCBNKDIsIDEpICogTigxLCAyKSArIE0oMiwgMikgKiBOKDIsIDIpICsgTSgyLCAzKSAqIE4oMywgMikgKyBNKDIsIDQpICogTig0LCAyKSwgTSgyLCAxKSAqIE4oMSwgMykgKyBNKDIsIDIpICogTigyLCAzKSArIE0oMiwgMykgKiBOKDMsIDMpICsgTSgyLCA0KSAqIE4oNCwgMyksIE0oMiwgMSkgKiBOKDEsIDQpICsgTSgyLCAyKSAqIE4oMiwgNCkgKyBNKDIsIDMpICogTigzLCA0KSArIE0oMiwgNCkgKiBOKDQsIDQpLCAKKwkJICAgICAgICAgICAgICBNKDMsIDEpICogTigxLCAxKSArIE0oMywgMikgKiBOKDIsIDEpICsgTSgzLCAzKSAqIE4oMywgMSkgKyBNKDMsIDQpICogTig0LCAxKSwgTSgzLCAxKSAqIE4oMSwgMikgKyBNKDMsIDIpICogTigyLCAyKSArIE0oMywgMykgKiBOKDMsIDIpICsgTSgzLCA0KSAqIE4oNCwgMiksIE0oMywgMSkgKiBOKDEsIDMpICsgTSgzLCAyKSAqIE4oMiwgMykgKyBNKDMsIDMpICogTigzLCAzKSArIE0oMywgNCkgKiBOKDQsIDMpLCBNKDMsIDEpICogTigxLCA0KSArIE0oMywgMikgKiBOKDIsIDQpICsgTSgzLCAzKSAqIE4oMywgNCkgKyBNKDMsIDQpICogTig0LCA0KSwgCisJCSAgICAgICAgICAgICAgTSg0LCAxKSAqIE4oMSwgMSkgKyBNKDQsIDIpICogTigyLCAxKSArIE0oNCwgMykgKiBOKDMsIDEpICsgTSg0LCA0KSAqIE4oNCwgMSksIE0oNCwgMSkgKiBOKDEsIDIpICsgTSg0LCAyKSAqIE4oMiwgMikgKyBNKDQsIDMpICogTigzLCAyKSArIE0oNCwgNCkgKiBOKDQsIDIpLCBNKDQsIDEpICogTigxLCAzKSArIE0oNCwgMikgKiBOKDIsIDMpICsgTSg0LCAzKSAqIE4oMywgMykgKyBNKDQsIDQpICogTig0LCAzKSwgTSg0LCAxKSAqIE4oMSwgNCkgKyBNKDQsIDIpICogTigyLCA0KSArIE0oNCwgMykgKiBOKDMsIDQpICsgTSg0LCA0KSAqIE4oNCwgNCkpOworCX0KKworCU1hdHJpeCBvcGVyYXRvci8oY29uc3QgTWF0cml4ICZNLCBmbG9hdCBzKQorCXsKKwkJZmxvYXQgciA9IDEuMGYgLyBzOworCisJCXJldHVybiBNICogcjsKKwl9CisKKwlmbG9hdCBNYXRyaXg6OmRldChjb25zdCBNYXRyaXggJk0pCisJeworCQlmbG9hdCBNMzM0NCA9IE0oMywgMykgKiBNKDQsIDQpIC0gTSg0LCAzKSAqIE0oMywgNCk7CisJCWZsb2F0IE0yMzQ0ID0gTSgyLCAzKSAqIE0oNCwgNCkgLSBNKDQsIDMpICogTSgyLCA0KTsKKwkJZmxvYXQgTTIzMzQgPSBNKDIsIDMpICogTSgzLCA0KSAtIE0oMywgMykgKiBNKDIsIDQpOworCQlmbG9hdCBNMTM0NCA9IE0oMSwgMykgKiBNKDQsIDQpIC0gTSg0LCAzKSAqIE0oMSwgNCk7CisJCWZsb2F0IE0xMzM0ID0gTSgxLCAzKSAqIE0oMywgNCkgLSBNKDMsIDMpICogTSgxLCA0KTsKKwkJZmxvYXQgTTEzMjQgPSBNKDEsIDMpICogTSgyLCA0KSAtIE0oMiwgMykgKiBNKDEsIDQpOworCisJCXJldHVybiBNKDEsIDEpICogKE0oMiwgMikgKiBNMzM0NCAtIE0oMywgMikgKiBNMjM0NCArIE0oNCwgMikgKiBNMjMzNCkgLQorCQkgICAgICAgTSgyLCAxKSAqIChNKDEsIDIpICogTTMzNDQgLSBNKDMsIDIpICogTTEzNDQgKyBNKDQsIDIpICogTTEzMzQpICsKKwkJICAgICAgIE0oMywgMSkgKiAoTSgxLCAyKSAqIE0yMzQ0IC0gTSgyLCAyKSAqIE0xMzQ0ICsgTSg0LCAyKSAqIE0xMzI0KSAtCisJCSAgICAgICBNKDQsIDEpICogKE0oMSwgMikgKiBNMjMzNCAtIE0oMiwgMikgKiBNMTMzNCArIE0oMywgMikgKiBNMTMyNCk7CisJfQorCisJZmxvYXQgTWF0cml4OjpkZXQoZmxvYXQgbTExKQorCXsKKwkJcmV0dXJuIG0xMTsKKwl9CisKKwlmbG9hdCBNYXRyaXg6OmRldChmbG9hdCBtMTEsIGZsb2F0IG0xMiwgCisJICAgICAgICAgICAgICAgICAgZmxvYXQgbTIxLCBmbG9hdCBtMjIpCisJeworCQlyZXR1cm4gbTExICogbTIyIC0gbTEyICogbTIxOyAKKwl9CisKKwlmbG9hdCBNYXRyaXg6OmRldChmbG9hdCBtMTEsIGZsb2F0IG0xMiwgZmxvYXQgbTEzLCAKKwkgICAgICAgICAgICAgICAgICBmbG9hdCBtMjEsIGZsb2F0IG0yMiwgZmxvYXQgbTIzLCAKKwkgICAgICAgICAgICAgICAgICBmbG9hdCBtMzEsIGZsb2F0IG0zMiwgZmxvYXQgbTMzKQorCXsKKwkJcmV0dXJuIG0xMSAqIChtMjIgKiBtMzMgLSBtMzIgKiBtMjMpIC0KKwkJICAgICAgIG0yMSAqIChtMTIgKiBtMzMgLSBtMzIgKiBtMTMpICsKKwkJICAgICAgIG0zMSAqIChtMTIgKiBtMjMgLSBtMjIgKiBtMTMpOworCX0KKworCWZsb2F0IE1hdHJpeDo6ZGV0KGZsb2F0IG0xMSwgZmxvYXQgbTEyLCBmbG9hdCBtMTMsIGZsb2F0IG0xNCwgCisJICAgICAgICAgICAgICAgICAgZmxvYXQgbTIxLCBmbG9hdCBtMjIsIGZsb2F0IG0yMywgZmxvYXQgbTI0LCAKKwkgICAgICAgICAgICAgICAgICBmbG9hdCBtMzEsIGZsb2F0IG0zMiwgZmxvYXQgbTMzLCBmbG9hdCBtMzQsIAorCSAgICAgICAgICAgICAgICAgIGZsb2F0IG00MSwgZmxvYXQgbTQyLCBmbG9hdCBtNDMsIGZsb2F0IG00NCkKKwl7CisJCWZsb2F0IE0zMzQ0ID0gbTMzICogbTQ0IC0gbTQzICogbTM0OworCQlmbG9hdCBNMjM0NCA9IG0yMyAqIG00NCAtIG00MyAqIG0yNDsKKwkJZmxvYXQgTTIzMzQgPSBtMjMgKiBtMzQgLSBtMzMgKiBtMjQ7CisJCWZsb2F0IE0xMzQ0ID0gbTEzICogbTQ0IC0gbTQzICogbTE0OworCQlmbG9hdCBNMTMzNCA9IG0xMyAqIG0zNCAtIG0zMyAqIG0xNDsKKwkJZmxvYXQgTTEzMjQgPSBtMTMgKiBtMjQgLSBtMjMgKiBtMTQ7CisKKwkJcmV0dXJuIG0xMSAqIChtMjIgKiBNMzM0NCAtIG0zMiAqIE0yMzQ0ICsgbTQyICogTTIzMzQpIC0KKwkJICAgICAgIG0yMSAqIChtMTIgKiBNMzM0NCAtIG0zMiAqIE0xMzQ0ICsgbTQyICogTTEzMzQpICsKKwkJICAgICAgIG0zMSAqIChtMTIgKiBNMjM0NCAtIG0yMiAqIE0xMzQ0ICsgbTQyICogTTEzMjQpIC0KKwkJICAgICAgIG00MSAqIChtMTIgKiBNMjMzNCAtIG0yMiAqIE0xMzM0ICsgbTMyICogTTEzMjQpOworCX0KKworCWZsb2F0IE1hdHJpeDo6ZGV0KGNvbnN0IFZlY3RvciAmdjEsIGNvbnN0IFZlY3RvciAmdjIsIGNvbnN0IFZlY3RvciAmdjMpCisJeworCQlyZXR1cm4gdjEgKiAodjIgJSB2Myk7CisJfQorCisJZmxvYXQgTWF0cml4OjpkZXQzKGNvbnN0IE1hdHJpeCAmTSkKKwl7CisJCXJldHVybiBNKDEsIDEpICogKE0oMiwgMikgKiBNKDMsIDMpIC0gTSgzLCAyKSAqIE0oMiwgMykpIC0KKwkJICAgICAgIE0oMiwgMSkgKiAoTSgxLCAyKSAqIE0oMywgMykgLSBNKDMsIDIpICogTSgxLCAzKSkgKworCQkgICAgICAgTSgzLCAxKSAqIChNKDEsIDIpICogTSgyLCAzKSAtIE0oMiwgMikgKiBNKDEsIDMpKTsKKwl9CisKKwlmbG9hdCBNYXRyaXg6OnRyKGNvbnN0IE1hdHJpeCAmTSkKKwl7CisJCXJldHVybiBNKDEsIDEpICsgTSgyLCAyKSArIE0oMywgMykgKyBNKDQsIDQpOworCX0KKworCU1hdHJpeCAmTWF0cml4OjpvcnRob2dvbmFsaXNlKCkKKwl7CisJCS8vIE5PVEU6IE51bW5lcmljYWxseSBpbnN0YWJsZSwgd29uJ3QgcmV0dXJuIGV4YWN0IHRoZSBzYW1lIHJlc3VsdCB3aGVuIGFscmVhZHkgb3JodG9nb25hbAorCisJCU1hdHJpeCAmTSA9ICp0aGlzOworCisJCVZlY3RvciB2MShNKDEsIDEpLCBNKDIsIDEpLCBNKDMsIDEpKTsKKwkJVmVjdG9yIHYyKE0oMSwgMiksIE0oMiwgMiksIE0oMywgMikpOworCQlWZWN0b3IgdjMoTSgxLCAzKSwgTSgyLCAzKSwgTSgzLCAzKSk7CisKKwkJdjIgLT0gdjEgKiAodjEgKiB2MikgLyAodjEgKiB2MSk7CisJCXYzIC09IHYxICogKHYxICogdjMpIC8gKHYxICogdjEpOworCQl2MyAtPSB2MiAqICh2MiAqIHYzKSAvICh2MiAqIHYyKTsKKworCQl2MSAvPSBWZWN0b3I6Ok4odjEpOworCQl2MiAvPSBWZWN0b3I6Ok4odjIpOworCQl2MyAvPSBWZWN0b3I6Ok4odjMpOworCisJCU0oMSwgMSkgPSB2MS54OyAgTSgxLCAyKSA9IHYyLng7ICBNKDEsIDMpID0gdjMueDsKKwkJTSgyLCAxKSA9IHYxLnk7ICBNKDIsIDIpID0gdjIueTsgIE0oMiwgMykgPSB2My55OworCQlNKDMsIDEpID0gdjEuejsgIE0oMywgMikgPSB2Mi56OyAgTSgzLCAzKSA9IHYzLno7CisKKwkJcmV0dXJuICp0aGlzOworCX0KKworCU1hdHJpeCBNYXRyaXg6OmV1bGVyUm90YXRlKGNvbnN0IFZlY3RvciAmdikKKwl7CisJCWZsb2F0IGN6ID0gY29zKHYueik7CisJCWZsb2F0IHN6ID0gc2luKHYueik7CisJCWZsb2F0IGN4ID0gY29zKHYueCk7CisJCWZsb2F0IHN4ID0gc2luKHYueCk7CisJCWZsb2F0IGN5ID0gY29zKHYueSk7CisJCWZsb2F0IHN5ID0gc2luKHYueSk7CisKKwkJZmxvYXQgc3hzeSA9IHN4ICogc3k7CisJCWZsb2F0IHN4Y3kgPSBzeCAqIGN5OworCisJCXJldHVybiBNYXRyaXgoY3kgKiBjeiAtIHN5ICogc3ggKiBzeiwgLWN5ICogc3ogLSBzeSAqIHN4ICogY3osIC1zeSAqIGN4LAorCQkgICAgICAgICAgICAgIGN4ICogc3osICAgICAgICAgICAgICAgICBjeCAqIGN6LCAgICAgICAgICAgICAgICAtc3gsCisJCSAgICAgICAgICAgICAgc3kgKiBjeiArIGN5ICogc3ggKiBzeiwgLXN5ICogc3ogKyBjeSAqIHN4ICogY3osICBjeSAqIGN4KTsKKwl9CisKKwlNYXRyaXggTWF0cml4OjpldWxlclJvdGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQorCXsKKwkJcmV0dXJuIGV1bGVyUm90YXRlKFZlY3Rvcih4LCB5LCB6KSk7CisJfQorCisJTWF0cml4IE1hdHJpeDo6dHJhbnNsYXRlKGNvbnN0IFZlY3RvciAmdikKKwl7CisJCXJldHVybiBNYXRyaXgoMSwgMCwgMCwgdi54LAorCQkgICAgICAgICAgICAgIDAsIDEsIDAsIHYueSwKKwkJICAgICAgICAgICAgICAwLCAwLCAxLCB2LnosCisJCSAgICAgICAgICAgICAgMCwgMCwgMCwgMSk7CisJfQorCisJTWF0cml4IE1hdHJpeDo6dHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCisJeworCQlyZXR1cm4gdHJhbnNsYXRlKFZlY3Rvcih4LCB5LCB6KSk7CisJfQorCisJTWF0cml4IE1hdHJpeDo6c2NhbGUoY29uc3QgVmVjdG9yICZ2KQorCXsKKwkJcmV0dXJuIE1hdHJpeCh2LngsIDAsICAgMCwKKwkJICAgICAgICAgICAgICAwLCAgIHYueSwgMCwKKwkJICAgICAgICAgICAgICAwLCAgIDAsICAgdi56KTsKKwl9CisKKwlNYXRyaXggTWF0cml4OjpzY2FsZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQorCXsKKwkJcmV0dXJuIHNjYWxlKFZlY3Rvcih4LCB5LCB6KSk7CisJfQorCisJTWF0cml4IE1hdHJpeDo6bG9va0F0KGNvbnN0IFZlY3RvciAmdikKKwl7CisJCVZlY3RvciB5ID0gdjsKKwkJeSAvPSBWZWN0b3I6Ok4oeSk7CisKKwkJVmVjdG9yIHggPSB5ICUgVmVjdG9yKDAsIDAsIDEpOworCQl4IC89IFZlY3Rvcjo6Tih4KTsKKworCQlWZWN0b3IgeiA9IHggJSB5OworCQl6IC89IFZlY3Rvcjo6Tih6KTsKKworCQlyZXR1cm4gfk1hdHJpeCh4LCB5LCB6KTsKKwl9CisKKwlNYXRyaXggTWF0cml4Ojpsb29rQXQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKKwl7CisJCXJldHVybiB0cmFuc2xhdGUoVmVjdG9yKHgsIHksIHopKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvTWF0cml4LmhwcCBiL3NyYy9SZW5kZXJlci9NYXRyaXguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYzkzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvTWF0cml4LmhwcApAQCAtMCwwICsxLDIxMSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIE1hdHJpeF9ocHAKKyNkZWZpbmUgTWF0cml4X2hwcAorCituYW1lc3BhY2Ugc3cKK3sKKwlzdHJ1Y3QgVmVjdG9yOworCXN0cnVjdCBQb2ludDsKKworCXN0cnVjdCBNYXRyaXgKKwl7CisJCU1hdHJpeCgpOworCQlNYXRyaXgoY29uc3QgaW50IGkpOworCQlNYXRyaXgoY29uc3QgZmxvYXQgbVsxNl0pOworCQlNYXRyaXgoY29uc3QgZmxvYXQgbVs0XVs0XSk7CisJCU1hdHJpeChmbG9hdCBtMTEsIGZsb2F0IG0xMiwgZmxvYXQgbTEzLAorCQkgICAgICAgZmxvYXQgbTIxLCBmbG9hdCBtMjIsIGZsb2F0IG0yMywKKwkJICAgICAgIGZsb2F0IG0zMSwgZmxvYXQgbTMyLCBmbG9hdCBtMzMpOworCQlNYXRyaXgoZmxvYXQgbTExLCBmbG9hdCBtMTIsIGZsb2F0IG0xMywgZmxvYXQgbTE0LAorCQkgICAgICAgZmxvYXQgbTIxLCBmbG9hdCBtMjIsIGZsb2F0IG0yMywgZmxvYXQgbTI0LAorCQkgICAgICAgZmxvYXQgbTMxLCBmbG9hdCBtMzIsIGZsb2F0IG0zMywgZmxvYXQgbTM0LAorCQkgICAgICAgZmxvYXQgbTQxLCBmbG9hdCBtNDIsIGZsb2F0IG00MywgZmxvYXQgbTQ0KTsKKwkJTWF0cml4KGNvbnN0IFZlY3RvciAmdjEsIGNvbnN0IFZlY3RvciAmdjIsIGNvbnN0IFZlY3RvciAmdjMpOyAgIC8vIENvbHVtbiB2ZWN0b3JzCisKKwkJTWF0cml4ICZvcGVyYXRvcj0oY29uc3QgTWF0cml4ICZOKTsKKworCQkvLyBSb3cgbWFqb3Igb3JkZXIKKwkJZmxvYXQgbVs0XVs0XTsKKworCQlzdGF0aWMgTWF0cml4IGRpYWcoZmxvYXQgbTExLCBmbG9hdCBtMjIsIGZsb2F0IG0zMywgZmxvYXQgbTQ0KTsKKworCQlvcGVyYXRvciBmbG9hdCooKTsKKworCQlNYXRyaXggb3BlcmF0b3IrKCkgY29uc3Q7CisJCU1hdHJpeCBvcGVyYXRvci0oKSBjb25zdDsKKworCQlNYXRyaXggb3BlcmF0b3IhKCkgY29uc3Q7ICAgLy8gSW52ZXJzZQorCQlNYXRyaXggb3BlcmF0b3J+KCkgY29uc3Q7ICAgLy8gVHJhbnNwb3NlCisKKwkJTWF0cml4ICZvcGVyYXRvcis9KGNvbnN0IE1hdHJpeCAmTik7CisJCU1hdHJpeCAmb3BlcmF0b3ItPShjb25zdCBNYXRyaXggJk4pOworCQlNYXRyaXggJm9wZXJhdG9yKj0oZmxvYXQgcyk7CisJCU1hdHJpeCAmb3BlcmF0b3IqPShjb25zdCBNYXRyaXggJk4pOworCQlNYXRyaXggJm9wZXJhdG9yLz0oZmxvYXQgcyk7CisKKwkJZmxvYXQgKm9wZXJhdG9yW10oaW50IGkpOyAgIC8vIEFjY2VzcyBlbGVtZW50IFtyb3ddW2NvbF0sIHN0YXJ0aW5nIHdpdGggWzBdWzBdCisJCWNvbnN0IGZsb2F0ICpvcGVyYXRvcltdKGludCBpKSBjb25zdDsKKworCQlmbG9hdCAmb3BlcmF0b3IoKShpbnQgaSwgaW50IGopOyAgIC8vIEFjY2VzcyBlbGVtZW50IChyb3csIGNvbCksIHN0YXJ0aW5nIHdpdGggKDEsIDEpCisJCWNvbnN0IGZsb2F0ICZvcGVyYXRvcigpKGludCBpLCBpbnQgaikgY29uc3Q7CisKKwkJZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRyaXggJk0sIGNvbnN0IE1hdHJpeCAmTik7CisJCWZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWF0cml4ICZNLCBjb25zdCBNYXRyaXggJk4pOworCisJCWZyaWVuZCBNYXRyaXggb3BlcmF0b3IrKGNvbnN0IE1hdHJpeCAmTSwgY29uc3QgTWF0cml4ICZOKTsKKwkJZnJpZW5kIE1hdHJpeCBvcGVyYXRvci0oY29uc3QgTWF0cml4ICZNLCBjb25zdCBNYXRyaXggJk4pOworCQlmcmllbmQgTWF0cml4IG9wZXJhdG9yKihmbG9hdCBzLCBjb25zdCBNYXRyaXggJk0pOworCQlmcmllbmQgTWF0cml4IG9wZXJhdG9yKihjb25zdCBNYXRyaXggJk0sIGNvbnN0IE1hdHJpeCAmTik7CisJCWZyaWVuZCBNYXRyaXggb3BlcmF0b3IvKGNvbnN0IE1hdHJpeCAmTSwgZmxvYXQgcyk7CisKKwkJc3RhdGljIGZsb2F0IGRldChjb25zdCBNYXRyaXggJk0pOworCQlzdGF0aWMgZmxvYXQgZGV0KGZsb2F0IG0xMSk7CisJCXN0YXRpYyBmbG9hdCBkZXQoZmxvYXQgbTExLCBmbG9hdCBtMTIsCisJCSAgICAgICAgICAgICAgICAgZmxvYXQgbTIxLCBmbG9hdCBtMjIpOworCQlzdGF0aWMgZmxvYXQgZGV0KGZsb2F0IG0xMSwgZmxvYXQgbTEyLCBmbG9hdCBtMTMsCisJCSAgICAgICAgICAgICAgICAgZmxvYXQgbTIxLCBmbG9hdCBtMjIsIGZsb2F0IG0yMywKKwkJICAgICAgICAgICAgICAgICBmbG9hdCBtMzEsIGZsb2F0IG0zMiwgZmxvYXQgbTMzKTsKKwkJc3RhdGljIGZsb2F0IGRldChmbG9hdCBtMTEsIGZsb2F0IG0xMiwgZmxvYXQgbTEzLCBmbG9hdCBtMTQsCisJCSAgICAgICAgICAgICAgICAgZmxvYXQgbTIxLCBmbG9hdCBtMjIsIGZsb2F0IG0yMywgZmxvYXQgbTI0LAorCQkgICAgICAgICAgICAgICAgIGZsb2F0IG0zMSwgZmxvYXQgbTMyLCBmbG9hdCBtMzMsIGZsb2F0IG0zNCwKKwkJICAgICAgICAgICAgICAgICBmbG9hdCBtNDEsIGZsb2F0IG00MiwgZmxvYXQgbTQzLCBmbG9hdCBtNDQpOworCQlzdGF0aWMgZmxvYXQgZGV0KGNvbnN0IFZlY3RvciAmdjEsIGNvbnN0IFZlY3RvciAmdjIsIGNvbnN0IFZlY3RvciAmdjMpOworCQlzdGF0aWMgZmxvYXQgZGV0Myhjb25zdCBNYXRyaXggJk0pOworCisJCXN0YXRpYyBmbG9hdCB0cihjb25zdCBNYXRyaXggJk0pOworCisJCU1hdHJpeCAmb3J0aG9nb25hbGlzZSgpOyAgIC8vIEdyYW0tU2NobWlkdCBvcnRob2dvbmFsaXNhdGlvbiBvZiAzeDMgc3VibWF0cml4CisKKwkJc3RhdGljIE1hdHJpeCBldWxlclJvdGF0ZShjb25zdCBWZWN0b3IgJnYpOworCQlzdGF0aWMgTWF0cml4IGV1bGVyUm90YXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworCQkKKwkJc3RhdGljIE1hdHJpeCB0cmFuc2xhdGUoY29uc3QgVmVjdG9yICZ2KTsKKwkJc3RhdGljIE1hdHJpeCB0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CisJCQorCQlzdGF0aWMgTWF0cml4IHNjYWxlKGNvbnN0IFZlY3RvciAmdik7CisJCXN0YXRpYyBNYXRyaXggc2NhbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CisKKwkJc3RhdGljIE1hdHJpeCBsb29rQXQoY29uc3QgVmVjdG9yICZ2KTsKKwkJc3RhdGljIE1hdHJpeCBsb29rQXQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CisJfTsKK30KKworI2luY2x1ZGUgIlZlY3Rvci5ocHAiCisKK25hbWVzcGFjZSBzdworeworCWlubGluZSBNYXRyaXg6Ok1hdHJpeCgpCisJeworCX0KKworCWlubGluZSBNYXRyaXg6Ok1hdHJpeChjb25zdCBpbnQgaSkKKwl7CisJCWNvbnN0IGZsb2F0IHMgPSAoZmxvYXQpaTsKKworCQlNYXRyaXggJk0gPSAqdGhpczsKKworCQlNKDEsIDEpID0gczsgTSgxLCAyKSA9IDA7IE0oMSwgMykgPSAwOyBNKDEsIDQpID0gMDsKKwkJTSgyLCAxKSA9IDA7IE0oMiwgMikgPSBzOyBNKDIsIDMpID0gMDsgTSgyLCA0KSA9IDA7CisJCU0oMywgMSkgPSAwOyBNKDMsIDIpID0gMDsgTSgzLCAzKSA9IHM7IE0oMywgNCkgPSAwOworCQlNKDQsIDEpID0gMDsgTSg0LCAyKSA9IDA7IE0oNCwgMykgPSAwOyBNKDQsIDQpID0gczsKKwl9CisKKwlpbmxpbmUgTWF0cml4OjpNYXRyaXgoY29uc3QgZmxvYXQgbVsxNl0pCisJeworCQlNYXRyaXggJk0gPSAqdGhpczsKKworCQlNKDEsIDEpID0gbVswXTsgIE0oMSwgMikgPSBtWzFdOyAgTSgxLCAzKSA9IG1bMl07ICBNKDEsIDQpID0gbVszXTsKKwkJTSgyLCAxKSA9IG1bNF07ICBNKDIsIDIpID0gbVs1XTsgIE0oMiwgMykgPSBtWzZdOyAgTSgyLCA0KSA9IG1bN107CisJCU0oMywgMSkgPSBtWzhdOyAgTSgzLCAyKSA9IG1bOF07ICBNKDMsIDMpID0gbVsxMF07IE0oMywgNCkgPSBtWzExXTsKKwkJTSg0LCAxKSA9IG1bMTJdOyBNKDQsIDIpID0gbVsxM107IE0oNCwgMykgPSBtWzE0XTsgTSg0LCA0KSA9IG1bMTVdOworCX0KKworCWlubGluZSBNYXRyaXg6Ok1hdHJpeChjb25zdCBmbG9hdCBtWzRdWzRdKQorCXsKKwkJTWF0cml4ICZNID0gKnRoaXM7CisKKwkJTVswXVswXSA9IG1bMF1bMF07ICBNWzBdWzFdID0gbVswXVsxXTsgIE1bMF1bMl0gPSBtWzBdWzJdOyAgTVswXVszXSA9IG1bMF1bM107CisJCU1bMV1bMF0gPSBtWzFdWzBdOyAgTVsxXVsxXSA9IG1bMV1bMV07ICBNWzFdWzJdID0gbVsxXVsyXTsgIE1bMV1bM10gPSBtWzFdWzNdOworCQlNWzJdWzBdID0gbVsyXVswXTsgIE1bMl1bMV0gPSBtWzJdWzFdOyAgTVsyXVsyXSA9IG1bMl1bMl07ICBNWzJdWzNdID0gbVsyXVszXTsKKwkJTVszXVswXSA9IG1bM11bMF07ICBNWzNdWzFdID0gbVszXVsxXTsgIE1bM11bMl0gPSBtWzNdWzJdOyAgTVszXVszXSA9IG1bM11bM107CisJfQorCisJaW5saW5lIE1hdHJpeDo6TWF0cml4KGZsb2F0IG0xMSwgZmxvYXQgbTEyLCBmbG9hdCBtMTMsIAorCSAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtMjEsIGZsb2F0IG0yMiwgZmxvYXQgbTIzLCAKKwkgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbTMxLCBmbG9hdCBtMzIsIGZsb2F0IG0zMykKKwl7CisJCU1hdHJpeCAmTSA9ICp0aGlzOworCisJCU0oMSwgMSkgPSBtMTE7IE0oMSwgMikgPSBtMTI7IE0oMSwgMykgPSBtMTM7IE0oMSwgNCkgPSAwOworCQlNKDIsIDEpID0gbTIxOyBNKDIsIDIpID0gbTIyOyBNKDIsIDMpID0gbTIzOyBNKDIsIDQpID0gMDsKKwkJTSgzLCAxKSA9IG0zMTsgTSgzLCAyKSA9IG0zMjsgTSgzLCAzKSA9IG0zMzsgTSgzLCA0KSA9IDA7CisJCU0oNCwgMSkgPSAwOyAgIE0oNCwgMikgPSAwOyAgIE0oNCwgMykgPSAwOyAgIE0oNCwgNCkgPSAxOworCX0KKworCWlubGluZSBNYXRyaXg6Ok1hdHJpeChmbG9hdCBtMTEsIGZsb2F0IG0xMiwgZmxvYXQgbTEzLCBmbG9hdCBtMTQsIAorCSAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtMjEsIGZsb2F0IG0yMiwgZmxvYXQgbTIzLCBmbG9hdCBtMjQsIAorCSAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtMzEsIGZsb2F0IG0zMiwgZmxvYXQgbTMzLCBmbG9hdCBtMzQsIAorCSAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtNDEsIGZsb2F0IG00MiwgZmxvYXQgbTQzLCBmbG9hdCBtNDQpCisJeworCQlNYXRyaXggJk0gPSAqdGhpczsKKworCQlNKDEsIDEpID0gbTExOyBNKDEsIDIpID0gbTEyOyBNKDEsIDMpID0gbTEzOyBNKDEsIDQpID0gbTE0OworCQlNKDIsIDEpID0gbTIxOyBNKDIsIDIpID0gbTIyOyBNKDIsIDMpID0gbTIzOyBNKDIsIDQpID0gbTI0OworCQlNKDMsIDEpID0gbTMxOyBNKDMsIDIpID0gbTMyOyBNKDMsIDMpID0gbTMzOyBNKDMsIDQpID0gbTM0OworCQlNKDQsIDEpID0gbTQxOyBNKDQsIDIpID0gbTQyOyBNKDQsIDMpID0gbTQzOyBNKDQsIDQpID0gbTQ0OworCX0KKworCWlubGluZSBNYXRyaXg6Ok1hdHJpeChjb25zdCBWZWN0b3IgJnYxLCBjb25zdCBWZWN0b3IgJnYyLCBjb25zdCBWZWN0b3IgJnYzKQorCXsKKwkJTWF0cml4ICZNID0gKnRoaXM7CisKKwkJTSgxLCAxKSA9IHYxLng7IE0oMSwgMikgPSB2Mi54OyBNKDEsIDMpID0gdjMueDsgTSgxLCA0KSA9IDA7CisJCU0oMiwgMSkgPSB2MS55OyBNKDIsIDIpID0gdjIueTsgTSgyLCAzKSA9IHYzLnk7IE0oMiwgNCkgPSAwOworCQlNKDMsIDEpID0gdjEuejsgTSgzLCAyKSA9IHYyLno7IE0oMywgMykgPSB2My56OyBNKDMsIDQpID0gMDsKKwkJTSg0LCAxKSA9IDA7ICAgIE0oNCwgMikgPSAwOyAgICBNKDQsIDMpID0gMDsgICAgTSg0LCA0KSA9IDE7CisJfQorCisJaW5saW5lIE1hdHJpeCAmTWF0cml4OjpvcGVyYXRvcj0oY29uc3QgTWF0cml4ICZOKQorCXsKKwkJTWF0cml4ICZNID0gKnRoaXM7CisKKwkJTSgxLCAxKSA9IE4oMSwgMSk7IE0oMSwgMikgPSBOKDEsIDIpOyBNKDEsIDMpID0gTigxLCAzKTsgTSgxLCA0KSA9IE4oMSwgNCk7CisJCU0oMiwgMSkgPSBOKDIsIDEpOyBNKDIsIDIpID0gTigyLCAyKTsgTSgyLCAzKSA9IE4oMiwgMyk7IE0oMiwgNCkgPSBOKDIsIDQpOworCQlNKDMsIDEpID0gTigzLCAxKTsgTSgzLCAyKSA9IE4oMywgMik7IE0oMywgMykgPSBOKDMsIDMpOyBNKDMsIDQpID0gTigzLCA0KTsKKwkJTSg0LCAxKSA9IE4oNCwgMSk7IE0oNCwgMikgPSBOKDQsIDIpOyBNKDQsIDMpID0gTig0LCAzKTsgTSg0LCA0KSA9IE4oNCwgNCk7CisKKwkJcmV0dXJuIE07CisJfQorCisJaW5saW5lIGZsb2F0ICpNYXRyaXg6Om9wZXJhdG9yW10oaW50IGkpCisJeworCQlyZXR1cm4gbVtpXTsKKwl9CisKKwlpbmxpbmUgY29uc3QgZmxvYXQgKk1hdHJpeDo6b3BlcmF0b3JbXShpbnQgaSkgY29uc3QKKwl7CisJCXJldHVybiBtW2ldOworCX0KKworCWlubGluZSBmbG9hdCAmTWF0cml4OjpvcGVyYXRvcigpKGludCBpLCBpbnQgaikKKwl7CisJCXJldHVybiBtW2kgLSAxXVtqIC0gMV07CisJfQorCisJaW5saW5lIGNvbnN0IGZsb2F0ICZNYXRyaXg6Om9wZXJhdG9yKCkoaW50IGksIGludCBqKSBjb25zdAorCXsKKwkJcmV0dXJuIG1baSAtIDFdW2ogLSAxXTsKKwl9Cit9CisKKyNlbmRpZiAgIC8vIE1hdHJpeF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9QaXhlbFByb2Nlc3Nvci5jcHAgYi9zcmMvUmVuZGVyZXIvUGl4ZWxQcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjI4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvUGl4ZWxQcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsMTA1NCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiUGl4ZWxQcm9jZXNzb3IuaHBwIgorCisjaW5jbHVkZSAiUXVhZFJhc3Rlcml6ZXIuaHBwIgorI2luY2x1ZGUgIlBpeGVsU2hhZGVyLmhwcCIKKyNpbmNsdWRlICJNZXRhTWFjcm8uaHBwIgorI2luY2x1ZGUgIlN1cmZhY2UuaHBwIgorI2luY2x1ZGUgIlByaW1pdGl2ZS5ocHAiCisjaW5jbHVkZSAiQ29uc3RhbnRzLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKK25hbWVzcGFjZSBzdworeworCWV4dGVybiBib29sIGNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlcjsKKwlleHRlcm4gQ29udGV4dDo6VHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nIHRyYW5zcGFyZW5jeUFudGlhbGlhc2luZzsKKwlleHRlcm4gYm9vbCBwZXJzcGVjdGl2ZUNvcnJlY3Rpb247CisKKwl1bnNpZ25lZCBpbnQgUGl4ZWxQcm9jZXNzb3I6OlN0YXRlczo6Y29tcHV0ZUhhc2goKQorCXsKKwkJdW5zaWduZWQgaW50ICpzdGF0ZSA9ICh1bnNpZ25lZCBpbnQqKXRoaXM7CisJCXVuc2lnbmVkIGludCBoYXNoID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKFN0YXRlcykgLyA0OyBpKyspCisJCXsKKwkJCWhhc2ggXj0gc3RhdGVbaV07CisJCX0KKworCQlyZXR1cm4gaGFzaDsKKwl9CisKKwlQaXhlbFByb2Nlc3Nvcjo6U3RhdGU6OlN0YXRlKCkKKwl7CisJCW1lbXNldCh0aGlzLCAwLCBzaXplb2YoU3RhdGUpKTsKKwl9CisKKwlib29sIFBpeGVsUHJvY2Vzc29yOjpTdGF0ZTo6b3BlcmF0b3I9PShjb25zdCBTdGF0ZSAmc3RhdGUpIGNvbnN0CisJeworCQlpZihoYXNoICE9IHN0YXRlLmhhc2gpCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiBtZW1jbXAoc3RhdGljX2Nhc3Q8Y29uc3QgU3RhdGVzKj4odGhpcyksIHN0YXRpY19jYXN0PGNvbnN0IFN0YXRlcyo+KCZzdGF0ZSksIHNpemVvZihTdGF0ZXMpKSA9PSAwOworCX0KKworCVBpeGVsUHJvY2Vzc29yOjpQaXhlbFByb2Nlc3NvcihDb250ZXh0ICpjb250ZXh0KSA6IGNvbnRleHQoY29udGV4dCkKKwl7CisJCXNldEdsb2JhbE1pcG1hcEJpYXMoMC4wZik7ICAgLy8gUm91bmQgdG8gaGlnaGVzdCBMT0QgWzAuNSwgMS4wXTogLTAuNQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJvdW5kIHRvIG5lYXJlc3QgTE9EIFswLjcsIDEuNF06ICAwLjAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3VuZCB0byBsb3dlc3QgTE9EICBbMS4wLCAyLjBdOiAgMC41CisKKwkJcm91dGluZUNhY2hlID0gMDsKKwkJc2V0Um91dGluZUNhY2hlU2l6ZSgxMDI0KTsKKwl9CisKKwlQaXhlbFByb2Nlc3Nvcjo6flBpeGVsUHJvY2Vzc29yKCkKKwl7CisJCWRlbGV0ZSByb3V0aW5lQ2FjaGU7CisJCXJvdXRpbmVDYWNoZSA9IDA7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0RmxvYXRDb25zdGFudCh1bnNpZ25lZCBpbnQgaW5kZXgsIGNvbnN0IGZsb2F0IHZhbHVlWzRdKQorCXsKKwkJaWYoaW5kZXggPCAyMjQpCisJCXsKKwkJCWNbaW5kZXhdWzBdID0gdmFsdWVbMF07CisJCQljW2luZGV4XVsxXSA9IHZhbHVlWzFdOworCQkJY1tpbmRleF1bMl0gPSB2YWx1ZVsyXTsKKwkJCWNbaW5kZXhdWzNdID0gdmFsdWVbM107CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCisJCWlmKGluZGV4IDwgOCkgICAvLyBwc18xX3ggY29uc3RhbnRzCisJCXsKKwkJCS8vIEZJWE1FOiBDb21wYWN0IGludG8gZ2VuZXJpYyBmdW5jdGlvbgorCQkJc2hvcnQgeCA9IGlyb3VuZCg0MDk1ICogY2xhbXAodmFsdWVbMF0sIC0xLjBmLCAxLjBmKSk7CisJCQlzaG9ydCB5ID0gaXJvdW5kKDQwOTUgKiBjbGFtcCh2YWx1ZVsxXSwgLTEuMGYsIDEuMGYpKTsKKwkJCXNob3J0IHogPSBpcm91bmQoNDA5NSAqIGNsYW1wKHZhbHVlWzJdLCAtMS4wZiwgMS4wZikpOworCQkJc2hvcnQgdyA9IGlyb3VuZCg0MDk1ICogY2xhbXAodmFsdWVbM10sIC0xLjBmLCAxLjBmKSk7CisKKwkJCWNXW2luZGV4XVswXVswXSA9IHg7CisJCQljV1tpbmRleF1bMF1bMV0gPSB4OworCQkJY1dbaW5kZXhdWzBdWzJdID0geDsKKwkJCWNXW2luZGV4XVswXVszXSA9IHg7CisKKwkJCWNXW2luZGV4XVsxXVswXSA9IHk7CisJCQljV1tpbmRleF1bMV1bMV0gPSB5OworCQkJY1dbaW5kZXhdWzFdWzJdID0geTsKKwkJCWNXW2luZGV4XVsxXVszXSA9IHk7CisKKwkJCWNXW2luZGV4XVsyXVswXSA9IHo7CisJCQljV1tpbmRleF1bMl1bMV0gPSB6OworCQkJY1dbaW5kZXhdWzJdWzJdID0gejsKKwkJCWNXW2luZGV4XVsyXVszXSA9IHo7CisKKwkJCWNXW2luZGV4XVszXVswXSA9IHc7CisJCQljV1tpbmRleF1bM11bMV0gPSB3OworCQkJY1dbaW5kZXhdWzNdWzJdID0gdzsKKwkJCWNXW2luZGV4XVszXVszXSA9IHc7CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRJbnRlZ2VyQ29uc3RhbnQodW5zaWduZWQgaW50IGluZGV4LCBjb25zdCBpbnQgdmFsdWVbNF0pCisJeworCQlpZihpbmRleCA8IDE2KQorCQl7CisJCQlpW2luZGV4XVswXSA9IHZhbHVlWzBdOworCQkJaVtpbmRleF1bMV0gPSB2YWx1ZVsxXTsKKwkJCWlbaW5kZXhdWzJdID0gdmFsdWVbMl07CisJCQlpW2luZGV4XVszXSA9IHZhbHVlWzNdOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRCb29sZWFuQ29uc3RhbnQodW5zaWduZWQgaW50IGluZGV4LCBpbnQgYm9vbGVhbikKKwl7CisJCWlmKGluZGV4IDwgMTYpCisJCXsKKwkJCWJbaW5kZXhdID0gYm9vbGVhbiAhPSAwOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRSZW5kZXJUYXJnZXQoaW50IGluZGV4LCBTdXJmYWNlICpyZW5kZXJUYXJnZXQpCisJeworCQljb250ZXh0LT5yZW5kZXJUYXJnZXRbaW5kZXhdID0gcmVuZGVyVGFyZ2V0OworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldERlcHRoU3RlbmNpbChTdXJmYWNlICpkZXB0aFN0ZW5jaWwpCisJeworCQljb250ZXh0LT5kZXB0aFN0ZW5jaWwgPSBkZXB0aFN0ZW5jaWw7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0VGV4Q29vcmRJbmRleCh1bnNpZ25lZCBpbnQgc3RhZ2UsIGludCB0ZXhDb29yZEluZGV4KQorCXsKKwkJaWYoc3RhZ2UgPCA4KQorCQl7CisJCQljb250ZXh0LT50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnNldFRleENvb3JkSW5kZXgodGV4Q29vcmRJbmRleCk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldFN0YWdlT3BlcmF0aW9uKHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpTdGFnZU9wZXJhdGlvbiBzdGFnZU9wZXJhdGlvbikKKwl7CisJCWlmKHN0YWdlIDwgOCkKKwkJeworCQkJY29udGV4dC0+dGV4dHVyZVN0YWdlW3N0YWdlXS5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZU9wZXJhdGlvbik7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEZpcnN0QXJndW1lbnQodW5zaWduZWQgaW50IHN0YWdlLCBUZXh0dXJlU3RhZ2U6OlNvdXJjZUFyZ3VtZW50IGZpcnN0QXJndW1lbnQpCisJeworCQlpZihzdGFnZSA8IDgpCisJCXsKKwkJCWNvbnRleHQtPnRleHR1cmVTdGFnZVtzdGFnZV0uc2V0Rmlyc3RBcmd1bWVudChmaXJzdEFyZ3VtZW50KTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0U2Vjb25kQXJndW1lbnQodW5zaWduZWQgaW50IHN0YWdlLCBUZXh0dXJlU3RhZ2U6OlNvdXJjZUFyZ3VtZW50IHNlY29uZEFyZ3VtZW50KQorCXsKKwkJaWYoc3RhZ2UgPCA4KQorCQl7CisJCQljb250ZXh0LT50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnNldFNlY29uZEFyZ3VtZW50KHNlY29uZEFyZ3VtZW50KTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0VGhpcmRBcmd1bWVudCh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6U291cmNlQXJndW1lbnQgdGhpcmRBcmd1bWVudCkKKwl7CisJCWlmKHN0YWdlIDwgOCkKKwkJeworCQkJY29udGV4dC0+dGV4dHVyZVN0YWdlW3N0YWdlXS5zZXRUaGlyZEFyZ3VtZW50KHRoaXJkQXJndW1lbnQpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTdGFnZU9wZXJhdGlvbkFscGhhKHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpTdGFnZU9wZXJhdGlvbiBzdGFnZU9wZXJhdGlvbkFscGhhKQorCXsKKwkJaWYoc3RhZ2UgPCA4KQorCQl7CisJCQljb250ZXh0LT50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2VPcGVyYXRpb25BbHBoYSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEZpcnN0QXJndW1lbnRBbHBoYSh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6U291cmNlQXJndW1lbnQgZmlyc3RBcmd1bWVudEFscGhhKQorCXsKKwkJaWYoc3RhZ2UgPCA4KQorCQl7CisJCQljb250ZXh0LT50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnNldEZpcnN0QXJndW1lbnRBbHBoYShmaXJzdEFyZ3VtZW50QWxwaGEpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTZWNvbmRBcmd1bWVudEFscGhhKHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpTb3VyY2VBcmd1bWVudCBzZWNvbmRBcmd1bWVudEFscGhhKQorCXsKKwkJaWYoc3RhZ2UgPCA4KQorCQl7CisJCQljb250ZXh0LT50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnNldFNlY29uZEFyZ3VtZW50QWxwaGEoc2Vjb25kQXJndW1lbnRBbHBoYSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldFRoaXJkQXJndW1lbnRBbHBoYSh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6U291cmNlQXJndW1lbnQgdGhpcmRBcmd1bWVudEFscGhhKQorCXsKKwkJaWYoc3RhZ2UgPCA4KQorCQl7CisJCQljb250ZXh0LT50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnNldFRoaXJkQXJndW1lbnRBbHBoYSh0aGlyZEFyZ3VtZW50QWxwaGEpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRGaXJzdE1vZGlmaWVyKHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpBcmd1bWVudE1vZGlmaWVyIGZpcnN0TW9kaWZpZXIpCisJeworCQlpZihzdGFnZSA8IDgpCisJCXsKKwkJCWNvbnRleHQtPnRleHR1cmVTdGFnZVtzdGFnZV0uc2V0Rmlyc3RNb2RpZmllcihmaXJzdE1vZGlmaWVyKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0U2Vjb25kTW9kaWZpZXIodW5zaWduZWQgaW50IHN0YWdlLCBUZXh0dXJlU3RhZ2U6OkFyZ3VtZW50TW9kaWZpZXIgc2Vjb25kTW9kaWZpZXIpCisJeworCQlpZihzdGFnZSA8IDgpCisJCXsKKwkJCWNvbnRleHQtPnRleHR1cmVTdGFnZVtzdGFnZV0uc2V0U2Vjb25kTW9kaWZpZXIoc2Vjb25kTW9kaWZpZXIpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRUaGlyZE1vZGlmaWVyKHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpBcmd1bWVudE1vZGlmaWVyIHRoaXJkTW9kaWZpZXIpCisJeworCQlpZihzdGFnZSA8IDgpCisJCXsKKwkJCWNvbnRleHQtPnRleHR1cmVTdGFnZVtzdGFnZV0uc2V0VGhpcmRNb2RpZmllcih0aGlyZE1vZGlmaWVyKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0Rmlyc3RNb2RpZmllckFscGhhKHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpBcmd1bWVudE1vZGlmaWVyIGZpcnN0TW9kaWZpZXJBbHBoYSkKKwl7CisJCWlmKHN0YWdlIDwgOCkKKwkJeworCQkJY29udGV4dC0+dGV4dHVyZVN0YWdlW3N0YWdlXS5zZXRGaXJzdE1vZGlmaWVyQWxwaGEoZmlyc3RNb2RpZmllckFscGhhKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0U2Vjb25kTW9kaWZpZXJBbHBoYSh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6QXJndW1lbnRNb2RpZmllciBzZWNvbmRNb2RpZmllckFscGhhKQorCXsKKwkJaWYoc3RhZ2UgPCA4KQorCQl7CisJCQljb250ZXh0LT50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnNldFNlY29uZE1vZGlmaWVyQWxwaGEoc2Vjb25kTW9kaWZpZXJBbHBoYSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldFRoaXJkTW9kaWZpZXJBbHBoYSh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6QXJndW1lbnRNb2RpZmllciB0aGlyZE1vZGlmaWVyQWxwaGEpCisJeworCQlpZihzdGFnZSA8IDgpCisJCXsKKwkJCWNvbnRleHQtPnRleHR1cmVTdGFnZVtzdGFnZV0uc2V0VGhpcmRNb2RpZmllckFscGhhKHRoaXJkTW9kaWZpZXJBbHBoYSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldERlc3RpbmF0aW9uQXJndW1lbnQodW5zaWduZWQgaW50IHN0YWdlLCBUZXh0dXJlU3RhZ2U6OkRlc3RpbmF0aW9uQXJndW1lbnQgZGVzdGluYXRpb25Bcmd1bWVudCkKKwl7CisJCWlmKHN0YWdlIDwgOCkKKwkJeworCQkJY29udGV4dC0+dGV4dHVyZVN0YWdlW3N0YWdlXS5zZXREZXN0aW5hdGlvbkFyZ3VtZW50KGRlc3RpbmF0aW9uQXJndW1lbnQpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRDb25zdGFudENvbG9yKHVuc2lnbmVkIGludCBzdGFnZSwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZjb25zdGFudENvbG9yKQorCXsKKwkJaWYoc3RhZ2UgPCA4KQorCQl7CisJCQljb250ZXh0LT50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnNldENvbnN0YW50Q29sb3IoY29uc3RhbnRDb2xvcik7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEJ1bXBtYXBNYXRyaXgodW5zaWduZWQgaW50IHN0YWdlLCBpbnQgZWxlbWVudCwgZmxvYXQgdmFsdWUpCisJeworCQlpZihzdGFnZSA8IDgpCisJCXsKKwkJCWNvbnRleHQtPnRleHR1cmVTdGFnZVtzdGFnZV0uc2V0QnVtcG1hcE1hdHJpeChlbGVtZW50LCB2YWx1ZSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEx1bWluYW5jZVNjYWxlKHVuc2lnbmVkIGludCBzdGFnZSwgZmxvYXQgdmFsdWUpCisJeworCQlpZihzdGFnZSA8IDgpCisJCXsKKwkJCWNvbnRleHQtPnRleHR1cmVTdGFnZVtzdGFnZV0uc2V0THVtaW5hbmNlU2NhbGUodmFsdWUpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRMdW1pbmFuY2VPZmZzZXQodW5zaWduZWQgaW50IHN0YWdlLCBmbG9hdCB2YWx1ZSkKKwl7CisJCWlmKHN0YWdlIDwgOCkKKwkJeworCQkJY29udGV4dC0+dGV4dHVyZVN0YWdlW3N0YWdlXS5zZXRMdW1pbmFuY2VPZmZzZXQodmFsdWUpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRUZXh0dXJlRmlsdGVyKHVuc2lnbmVkIGludCBzYW1wbGVyLCBGaWx0ZXJUeXBlIHRleHR1cmVGaWx0ZXIpCisJeworCQlpZihzYW1wbGVyIDwgMTYpCisJCXsKKwkJCWNvbnRleHQtPnNhbXBsZXJbc2FtcGxlcl0uc2V0VGV4dHVyZUZpbHRlcih0ZXh0dXJlRmlsdGVyKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0TWlwbWFwRmlsdGVyKHVuc2lnbmVkIGludCBzYW1wbGVyLCBNaXBtYXBUeXBlIG1pcG1hcEZpbHRlcikKKwl7CisJCWlmKHNhbXBsZXIgPCAxNikKKwkJeworCQkJY29udGV4dC0+c2FtcGxlcltzYW1wbGVyXS5zZXRNaXBtYXBGaWx0ZXIobWlwbWFwRmlsdGVyKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0R2F0aGVyRW5hYmxlKHVuc2lnbmVkIGludCBzYW1wbGVyLCBib29sIGVuYWJsZSkKKwl7CisJCWlmKHNhbXBsZXIgPCAxNikKKwkJeworCQkJY29udGV4dC0+c2FtcGxlcltzYW1wbGVyXS5zZXRHYXRoZXJFbmFibGUoZW5hYmxlKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0QWRkcmVzc2luZ01vZGVVKHVuc2lnbmVkIGludCBzYW1wbGVyLCBBZGRyZXNzaW5nTW9kZSBhZGRyZXNzTW9kZSkKKwl7CisJCWlmKHNhbXBsZXIgPCAxNikKKwkJeworCQkJY29udGV4dC0+c2FtcGxlcltzYW1wbGVyXS5zZXRBZGRyZXNzaW5nTW9kZVUoYWRkcmVzc01vZGUpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRBZGRyZXNzaW5nTW9kZVYodW5zaWduZWQgaW50IHNhbXBsZXIsIEFkZHJlc3NpbmdNb2RlIGFkZHJlc3NNb2RlKQorCXsKKwkJaWYoc2FtcGxlciA8IDE2KQorCQl7CisJCQljb250ZXh0LT5zYW1wbGVyW3NhbXBsZXJdLnNldEFkZHJlc3NpbmdNb2RlVihhZGRyZXNzTW9kZSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEFkZHJlc3NpbmdNb2RlVyh1bnNpZ25lZCBpbnQgc2FtcGxlciwgQWRkcmVzc2luZ01vZGUgYWRkcmVzc01vZGUpCisJeworCQlpZihzYW1wbGVyIDwgMTYpCisJCXsKKwkJCWNvbnRleHQtPnNhbXBsZXJbc2FtcGxlcl0uc2V0QWRkcmVzc2luZ01vZGVXKGFkZHJlc3NNb2RlKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0UmVhZFNSR0IodW5zaWduZWQgaW50IHNhbXBsZXIsIGJvb2wgc1JHQikKKwl7CisJCWlmKHNhbXBsZXIgPCAxNikKKwkJeworCQkJY29udGV4dC0+c2FtcGxlcltzYW1wbGVyXS5zZXRSZWFkU1JHQihzUkdCKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0TWlwbWFwTE9EKHVuc2lnbmVkIGludCBzYW1wbGVyLCBmbG9hdCBiaWFzKQorCXsKKwkJaWYoc2FtcGxlciA8IDE2KQorCQl7CisJCQljb250ZXh0LT5zYW1wbGVyW3NhbXBsZXJdLnNldE1pcG1hcExPRChiaWFzKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0Qm9yZGVyQ29sb3IodW5zaWduZWQgaW50IHNhbXBsZXIsIGNvbnN0IENvbG9yPGZsb2F0PiAmYm9yZGVyQ29sb3IpCisJeworCQlpZihzYW1wbGVyIDwgMTYpCisJCXsKKwkJCWNvbnRleHQtPnNhbXBsZXJbc2FtcGxlcl0uc2V0Qm9yZGVyQ29sb3IoYm9yZGVyQ29sb3IpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRNYXhBbmlzb3Ryb3B5KHVuc2lnbmVkIGludCBzYW1wbGVyLCB1bnNpZ25lZCBpbnQgbWF4QW5pc290cm9weSkKKwl7CisJCWlmKHNhbXBsZXIgPCAxNikKKwkJeworCQkJY29udGV4dC0+c2FtcGxlcltzYW1wbGVyXS5zZXRNYXhBbmlzb3Ryb3B5KG1heEFuaXNvdHJvcHkpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRXcml0ZVNSR0IoYm9vbCBzUkdCKQorCXsKKwkJY29udGV4dC0+c2V0V3JpdGVTUkdCKHNSR0IpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldERlcHRoQnVmZmVyRW5hYmxlKGJvb2wgZGVwdGhCdWZmZXJFbmFibGUpCisJeworCQljb250ZXh0LT5zZXREZXB0aEJ1ZmZlckVuYWJsZShkZXB0aEJ1ZmZlckVuYWJsZSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0RGVwdGhDb21wYXJlKENvbnRleHQ6OkRlcHRoQ29tcGFyZU1vZGUgZGVwdGhDb21wYXJlTW9kZSkKKwl7CisJCWNvbnRleHQtPmRlcHRoQ29tcGFyZU1vZGUgPSBkZXB0aENvbXBhcmVNb2RlOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEFscGhhQ29tcGFyZShDb250ZXh0OjpBbHBoYUNvbXBhcmVNb2RlIGFscGhhQ29tcGFyZU1vZGUpCisJeworCQljb250ZXh0LT5hbHBoYUNvbXBhcmVNb2RlID0gYWxwaGFDb21wYXJlTW9kZTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXREZXB0aFdyaXRlRW5hYmxlKGJvb2wgZGVwdGhXcml0ZUVuYWJsZSkKKwl7CisJCWNvbnRleHQtPmRlcHRoV3JpdGVFbmFibGUgPSBkZXB0aFdyaXRlRW5hYmxlOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEFscGhhVGVzdEVuYWJsZShib29sIGFscGhhVGVzdEVuYWJsZSkKKwl7CisJCWNvbnRleHQtPmFscGhhVGVzdEVuYWJsZSA9IGFscGhhVGVzdEVuYWJsZTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRDdWxsTW9kZShDb250ZXh0OjpDdWxsTW9kZSBjdWxsTW9kZSkKKwl7CisJCWNvbnRleHQtPmN1bGxNb2RlID0gY3VsbE1vZGU7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0Q29sb3JXcml0ZU1hc2soaW50IGluZGV4LCBpbnQgcmdiYU1hc2spCisJeworCQljb250ZXh0LT5zZXRDb2xvcldyaXRlTWFzayhpbmRleCwgcmdiYU1hc2spOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldFN0ZW5jaWxFbmFibGUoYm9vbCBzdGVuY2lsRW5hYmxlKQorCXsKKwkJY29udGV4dC0+c3RlbmNpbEVuYWJsZSA9IHN0ZW5jaWxFbmFibGU7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0U3RlbmNpbENvbXBhcmUoQ29udGV4dDo6U3RlbmNpbENvbXBhcmVNb2RlIHN0ZW5jaWxDb21wYXJlTW9kZSkKKwl7CisJCWNvbnRleHQtPnN0ZW5jaWxDb21wYXJlTW9kZSA9IHN0ZW5jaWxDb21wYXJlTW9kZTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTdGVuY2lsUmVmZXJlbmNlKGludCBzdGVuY2lsUmVmZXJlbmNlKQorCXsKKwkJY29udGV4dC0+c3RlbmNpbFJlZmVyZW5jZSA9IHN0ZW5jaWxSZWZlcmVuY2U7CisJCXN0ZW5jaWwuc2V0KHN0ZW5jaWxSZWZlcmVuY2UsIGNvbnRleHQtPnN0ZW5jaWxNYXNrLCBjb250ZXh0LT5zdGVuY2lsV3JpdGVNYXNrKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTdGVuY2lsUmVmZXJlbmNlQ0NXKGludCBzdGVuY2lsUmVmZXJlbmNlQ0NXKQorCXsKKwkJY29udGV4dC0+c3RlbmNpbFJlZmVyZW5jZUNDVyA9IHN0ZW5jaWxSZWZlcmVuY2VDQ1c7CisJCXN0ZW5jaWxDQ1cuc2V0KHN0ZW5jaWxSZWZlcmVuY2VDQ1csIGNvbnRleHQtPnN0ZW5jaWxNYXNrQ0NXLCBjb250ZXh0LT5zdGVuY2lsV3JpdGVNYXNrQ0NXKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTdGVuY2lsTWFzayhpbnQgc3RlbmNpbE1hc2spCisJeworCQljb250ZXh0LT5zdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrOworCQlzdGVuY2lsLnNldChjb250ZXh0LT5zdGVuY2lsUmVmZXJlbmNlLCBzdGVuY2lsTWFzaywgY29udGV4dC0+c3RlbmNpbFdyaXRlTWFzayk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0U3RlbmNpbE1hc2tDQ1coaW50IHN0ZW5jaWxNYXNrQ0NXKQorCXsKKwkJY29udGV4dC0+c3RlbmNpbE1hc2tDQ1cgPSBzdGVuY2lsTWFza0NDVzsKKwkJc3RlbmNpbENDVy5zZXQoY29udGV4dC0+c3RlbmNpbFJlZmVyZW5jZUNDVywgc3RlbmNpbE1hc2tDQ1csIGNvbnRleHQtPnN0ZW5jaWxXcml0ZU1hc2tDQ1cpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKENvbnRleHQ6OlN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbEZhaWxPcGVyYXRpb24pCisJeworCQljb250ZXh0LT5zdGVuY2lsRmFpbE9wZXJhdGlvbiA9IHN0ZW5jaWxGYWlsT3BlcmF0aW9uOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKENvbnRleHQ6OlN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbFBhc3NPcGVyYXRpb24pCisJeworCQljb250ZXh0LT5zdGVuY2lsUGFzc09wZXJhdGlvbiA9IHN0ZW5jaWxQYXNzT3BlcmF0aW9uOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uIHN0ZW5jaWxaRmFpbE9wZXJhdGlvbikKKwl7CisJCWNvbnRleHQtPnN0ZW5jaWxaRmFpbE9wZXJhdGlvbiA9IHN0ZW5jaWxaRmFpbE9wZXJhdGlvbjsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTdGVuY2lsV3JpdGVNYXNrKGludCBzdGVuY2lsV3JpdGVNYXNrKQorCXsKKwkJY29udGV4dC0+c3RlbmNpbFdyaXRlTWFzayA9IHN0ZW5jaWxXcml0ZU1hc2s7CisJCXN0ZW5jaWwuc2V0KGNvbnRleHQtPnN0ZW5jaWxSZWZlcmVuY2UsIGNvbnRleHQtPnN0ZW5jaWxNYXNrLCBzdGVuY2lsV3JpdGVNYXNrKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTdGVuY2lsV3JpdGVNYXNrQ0NXKGludCBzdGVuY2lsV3JpdGVNYXNrQ0NXKQorCXsKKwkJY29udGV4dC0+c3RlbmNpbFdyaXRlTWFza0NDVyA9IHN0ZW5jaWxXcml0ZU1hc2tDQ1c7CisJCXN0ZW5jaWxDQ1cuc2V0KGNvbnRleHQtPnN0ZW5jaWxSZWZlcmVuY2VDQ1csIGNvbnRleHQtPnN0ZW5jaWxNYXNrQ0NXLCBzdGVuY2lsV3JpdGVNYXNrQ0NXKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRUd29TaWRlZFN0ZW5jaWwoYm9vbCBlbmFibGUpCisJeworCQljb250ZXh0LT50d29TaWRlZFN0ZW5jaWwgPSBlbmFibGU7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0U3RlbmNpbENvbXBhcmVDQ1coQ29udGV4dDo6U3RlbmNpbENvbXBhcmVNb2RlIHN0ZW5jaWxDb21wYXJlTW9kZSkKKwl7CisJCWNvbnRleHQtPnN0ZW5jaWxDb21wYXJlTW9kZUNDVyA9IHN0ZW5jaWxDb21wYXJlTW9kZTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTdGVuY2lsRmFpbE9wZXJhdGlvbkNDVyhDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uIHN0ZW5jaWxGYWlsT3BlcmF0aW9uKQorCXsKKwkJY29udGV4dC0+c3RlbmNpbEZhaWxPcGVyYXRpb25DQ1cgPSBzdGVuY2lsRmFpbE9wZXJhdGlvbjsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uIHN0ZW5jaWxQYXNzT3BlcmF0aW9uKQorCXsKKwkJY29udGV4dC0+c3RlbmNpbFBhc3NPcGVyYXRpb25DQ1cgPSBzdGVuY2lsUGFzc09wZXJhdGlvbjsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1coQ29udGV4dDo6U3RlbmNpbE9wZXJhdGlvbiBzdGVuY2lsWkZhaWxPcGVyYXRpb24pCisJeworCQljb250ZXh0LT5zdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1cgPSBzdGVuY2lsWkZhaWxPcGVyYXRpb247CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0VGV4dHVyZUZhY3Rvcihjb25zdCBDb2xvcjxmbG9hdD4gJnRleHR1cmVGYWN0b3IpCisJeworCQkvLyBGSVhNRTogQ29tcGFjdCBpbnRvIGdlbmVyaWMgZnVuY3Rpb24gICAvLyBGSVhNRTogQ2xhbXAKKwkJc2hvcnQgdGV4dHVyZUZhY3RvclIgPSBpcm91bmQoNDA5NSAqIHRleHR1cmVGYWN0b3Iucik7CisJCXNob3J0IHRleHR1cmVGYWN0b3JHID0gaXJvdW5kKDQwOTUgKiB0ZXh0dXJlRmFjdG9yLmcpOworCQlzaG9ydCB0ZXh0dXJlRmFjdG9yQiA9IGlyb3VuZCg0MDk1ICogdGV4dHVyZUZhY3Rvci5iKTsKKwkJc2hvcnQgdGV4dHVyZUZhY3RvckEgPSBpcm91bmQoNDA5NSAqIHRleHR1cmVGYWN0b3IuYSk7CisKKwkJZmFjdG9yLnRleHR1cmVGYWN0b3I0WzBdWzBdID0gdGV4dHVyZUZhY3RvclI7CisJCWZhY3Rvci50ZXh0dXJlRmFjdG9yNFswXVsxXSA9IHRleHR1cmVGYWN0b3JSOworCQlmYWN0b3IudGV4dHVyZUZhY3RvcjRbMF1bMl0gPSB0ZXh0dXJlRmFjdG9yUjsKKwkJZmFjdG9yLnRleHR1cmVGYWN0b3I0WzBdWzNdID0gdGV4dHVyZUZhY3RvclI7CisKKwkJZmFjdG9yLnRleHR1cmVGYWN0b3I0WzFdWzBdID0gdGV4dHVyZUZhY3Rvckc7CisJCWZhY3Rvci50ZXh0dXJlRmFjdG9yNFsxXVsxXSA9IHRleHR1cmVGYWN0b3JHOworCQlmYWN0b3IudGV4dHVyZUZhY3RvcjRbMV1bMl0gPSB0ZXh0dXJlRmFjdG9yRzsKKwkJZmFjdG9yLnRleHR1cmVGYWN0b3I0WzFdWzNdID0gdGV4dHVyZUZhY3Rvckc7CisKKwkJZmFjdG9yLnRleHR1cmVGYWN0b3I0WzJdWzBdID0gdGV4dHVyZUZhY3RvckI7CisJCWZhY3Rvci50ZXh0dXJlRmFjdG9yNFsyXVsxXSA9IHRleHR1cmVGYWN0b3JCOworCQlmYWN0b3IudGV4dHVyZUZhY3RvcjRbMl1bMl0gPSB0ZXh0dXJlRmFjdG9yQjsKKwkJZmFjdG9yLnRleHR1cmVGYWN0b3I0WzJdWzNdID0gdGV4dHVyZUZhY3RvckI7CisKKwkJZmFjdG9yLnRleHR1cmVGYWN0b3I0WzNdWzBdID0gdGV4dHVyZUZhY3RvckE7CisJCWZhY3Rvci50ZXh0dXJlRmFjdG9yNFszXVsxXSA9IHRleHR1cmVGYWN0b3JBOworCQlmYWN0b3IudGV4dHVyZUZhY3RvcjRbM11bMl0gPSB0ZXh0dXJlRmFjdG9yQTsKKwkJZmFjdG9yLnRleHR1cmVGYWN0b3I0WzNdWzNdID0gdGV4dHVyZUZhY3RvckE7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0QmxlbmRDb25zdGFudChjb25zdCBDb2xvcjxmbG9hdD4gJmJsZW5kQ29uc3RhbnQpCisJeworCQkvLyBGSVhNRTogQ29tcGFjdCBpbnRvIGdlbmVyaWMgZnVuY3Rpb24gICAvLyBGSVhNRTogQ2xhbXAKKwkJc2hvcnQgYmxlbmRDb25zdGFudFIgPSBpcm91bmQoNjU1MzUgKiBibGVuZENvbnN0YW50LnIpOworCQlzaG9ydCBibGVuZENvbnN0YW50RyA9IGlyb3VuZCg2NTUzNSAqIGJsZW5kQ29uc3RhbnQuZyk7CisJCXNob3J0IGJsZW5kQ29uc3RhbnRCID0gaXJvdW5kKDY1NTM1ICogYmxlbmRDb25zdGFudC5iKTsKKwkJc2hvcnQgYmxlbmRDb25zdGFudEEgPSBpcm91bmQoNjU1MzUgKiBibGVuZENvbnN0YW50LmEpOworCisJCWZhY3Rvci5ibGVuZENvbnN0YW50NFdbMF1bMF0gPSBibGVuZENvbnN0YW50UjsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0V1swXVsxXSA9IGJsZW5kQ29uc3RhbnRSOworCQlmYWN0b3IuYmxlbmRDb25zdGFudDRXWzBdWzJdID0gYmxlbmRDb25zdGFudFI7CisJCWZhY3Rvci5ibGVuZENvbnN0YW50NFdbMF1bM10gPSBibGVuZENvbnN0YW50UjsKKworCQlmYWN0b3IuYmxlbmRDb25zdGFudDRXWzFdWzBdID0gYmxlbmRDb25zdGFudEc7CisJCWZhY3Rvci5ibGVuZENvbnN0YW50NFdbMV1bMV0gPSBibGVuZENvbnN0YW50RzsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0V1sxXVsyXSA9IGJsZW5kQ29uc3RhbnRHOworCQlmYWN0b3IuYmxlbmRDb25zdGFudDRXWzFdWzNdID0gYmxlbmRDb25zdGFudEc7CisKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0V1syXVswXSA9IGJsZW5kQ29uc3RhbnRCOworCQlmYWN0b3IuYmxlbmRDb25zdGFudDRXWzJdWzFdID0gYmxlbmRDb25zdGFudEI7CisJCWZhY3Rvci5ibGVuZENvbnN0YW50NFdbMl1bMl0gPSBibGVuZENvbnN0YW50QjsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0V1syXVszXSA9IGJsZW5kQ29uc3RhbnRCOworCisJCWZhY3Rvci5ibGVuZENvbnN0YW50NFdbM11bMF0gPSBibGVuZENvbnN0YW50QTsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0V1szXVsxXSA9IGJsZW5kQ29uc3RhbnRBOworCQlmYWN0b3IuYmxlbmRDb25zdGFudDRXWzNdWzJdID0gYmxlbmRDb25zdGFudEE7CisJCWZhY3Rvci5ibGVuZENvbnN0YW50NFdbM11bM10gPSBibGVuZENvbnN0YW50QTsKKwkKKwkJLy8gRklYTUU6IENvbXBhY3QgaW50byBnZW5lcmljIGZ1bmN0aW9uICAgLy8gRklYTUU6IENsYW1wCisJCXNob3J0IGludkJsZW5kQ29uc3RhbnRSID0gaXJvdW5kKDY1NTM1ICogKDEgLSBibGVuZENvbnN0YW50LnIpKTsKKwkJc2hvcnQgaW52QmxlbmRDb25zdGFudEcgPSBpcm91bmQoNjU1MzUgKiAoMSAtIGJsZW5kQ29uc3RhbnQuZykpOworCQlzaG9ydCBpbnZCbGVuZENvbnN0YW50QiA9IGlyb3VuZCg2NTUzNSAqICgxIC0gYmxlbmRDb25zdGFudC5iKSk7CisJCXNob3J0IGludkJsZW5kQ29uc3RhbnRBID0gaXJvdW5kKDY1NTM1ICogKDEgLSBibGVuZENvbnN0YW50LmEpKTsKKworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRXWzBdWzBdID0gaW52QmxlbmRDb25zdGFudFI7CisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NFdbMF1bMV0gPSBpbnZCbGVuZENvbnN0YW50UjsKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0V1swXVsyXSA9IGludkJsZW5kQ29uc3RhbnRSOworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRXWzBdWzNdID0gaW52QmxlbmRDb25zdGFudFI7CisKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0V1sxXVswXSA9IGludkJsZW5kQ29uc3RhbnRHOworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRXWzFdWzFdID0gaW52QmxlbmRDb25zdGFudEc7CisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NFdbMV1bMl0gPSBpbnZCbGVuZENvbnN0YW50RzsKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0V1sxXVszXSA9IGludkJsZW5kQ29uc3RhbnRHOworCisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NFdbMl1bMF0gPSBpbnZCbGVuZENvbnN0YW50QjsKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0V1syXVsxXSA9IGludkJsZW5kQ29uc3RhbnRCOworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRXWzJdWzJdID0gaW52QmxlbmRDb25zdGFudEI7CisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NFdbMl1bM10gPSBpbnZCbGVuZENvbnN0YW50QjsKKworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRXWzNdWzBdID0gaW52QmxlbmRDb25zdGFudEE7CisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NFdbM11bMV0gPSBpbnZCbGVuZENvbnN0YW50QTsKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0V1szXVsyXSA9IGludkJsZW5kQ29uc3RhbnRBOworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRXWzNdWzNdID0gaW52QmxlbmRDb25zdGFudEE7CisKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0RlswXVswXSA9IGJsZW5kQ29uc3RhbnQucjsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0RlswXVsxXSA9IGJsZW5kQ29uc3RhbnQucjsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0RlswXVsyXSA9IGJsZW5kQ29uc3RhbnQucjsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0RlswXVszXSA9IGJsZW5kQ29uc3RhbnQucjsKKworCQlmYWN0b3IuYmxlbmRDb25zdGFudDRGWzFdWzBdID0gYmxlbmRDb25zdGFudC5nOworCQlmYWN0b3IuYmxlbmRDb25zdGFudDRGWzFdWzFdID0gYmxlbmRDb25zdGFudC5nOworCQlmYWN0b3IuYmxlbmRDb25zdGFudDRGWzFdWzJdID0gYmxlbmRDb25zdGFudC5nOworCQlmYWN0b3IuYmxlbmRDb25zdGFudDRGWzFdWzNdID0gYmxlbmRDb25zdGFudC5nOworCQkKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0RlsyXVswXSA9IGJsZW5kQ29uc3RhbnQuYjsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0RlsyXVsxXSA9IGJsZW5kQ29uc3RhbnQuYjsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0RlsyXVsyXSA9IGJsZW5kQ29uc3RhbnQuYjsKKwkJZmFjdG9yLmJsZW5kQ29uc3RhbnQ0RlsyXVszXSA9IGJsZW5kQ29uc3RhbnQuYjsKKwkJCisJCWZhY3Rvci5ibGVuZENvbnN0YW50NEZbM11bMF0gPSBibGVuZENvbnN0YW50LmE7CisJCWZhY3Rvci5ibGVuZENvbnN0YW50NEZbM11bMV0gPSBibGVuZENvbnN0YW50LmE7CisJCWZhY3Rvci5ibGVuZENvbnN0YW50NEZbM11bMl0gPSBibGVuZENvbnN0YW50LmE7CisJCWZhY3Rvci5ibGVuZENvbnN0YW50NEZbM11bM10gPSBibGVuZENvbnN0YW50LmE7CisKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0RlswXVswXSA9IDEgLSBibGVuZENvbnN0YW50LnI7CisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NEZbMF1bMV0gPSAxIC0gYmxlbmRDb25zdGFudC5yOworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRGWzBdWzJdID0gMSAtIGJsZW5kQ29uc3RhbnQucjsKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0RlswXVszXSA9IDEgLSBibGVuZENvbnN0YW50LnI7CisKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0RlsxXVswXSA9IDEgLSBibGVuZENvbnN0YW50Lmc7CisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NEZbMV1bMV0gPSAxIC0gYmxlbmRDb25zdGFudC5nOworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRGWzFdWzJdID0gMSAtIGJsZW5kQ29uc3RhbnQuZzsKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0RlsxXVszXSA9IDEgLSBibGVuZENvbnN0YW50Lmc7CisJCQorCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRGWzJdWzBdID0gMSAtIGJsZW5kQ29uc3RhbnQuYjsKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0RlsyXVsxXSA9IDEgLSBibGVuZENvbnN0YW50LmI7CisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NEZbMl1bMl0gPSAxIC0gYmxlbmRDb25zdGFudC5iOworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRGWzJdWzNdID0gMSAtIGJsZW5kQ29uc3RhbnQuYjsKKwkJCisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NEZbM11bMF0gPSAxIC0gYmxlbmRDb25zdGFudC5hOworCQlmYWN0b3IuaW52QmxlbmRDb25zdGFudDRGWzNdWzFdID0gMSAtIGJsZW5kQ29uc3RhbnQuYTsKKwkJZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0RlszXVsyXSA9IDEgLSBibGVuZENvbnN0YW50LmE7CisJCWZhY3Rvci5pbnZCbGVuZENvbnN0YW50NEZbM11bM10gPSAxIC0gYmxlbmRDb25zdGFudC5hOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEZpbGxNb2RlKENvbnRleHQ6OkZpbGxNb2RlIGZpbGxNb2RlKQorCXsKKwkJY29udGV4dC0+ZmlsbE1vZGUgPSBmaWxsTW9kZTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTaGFkaW5nTW9kZShDb250ZXh0OjpTaGFkaW5nTW9kZSBzaGFkaW5nTW9kZSkKKwl7CisJCWNvbnRleHQtPnNoYWRpbmdNb2RlID0gc2hhZGluZ01vZGU7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0QWxwaGFCbGVuZEVuYWJsZShib29sIGFscGhhQmxlbmRFbmFibGUpCisJeworCQljb250ZXh0LT5zZXRBbHBoYUJsZW5kRW5hYmxlKGFscGhhQmxlbmRFbmFibGUpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldFNvdXJjZUJsZW5kRmFjdG9yKENvbnRleHQ6OkJsZW5kRmFjdG9yIHNvdXJjZUJsZW5kRmFjdG9yKQorCXsKKwkJY29udGV4dC0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc291cmNlQmxlbmRGYWN0b3IpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldERlc3RCbGVuZEZhY3RvcihDb250ZXh0OjpCbGVuZEZhY3RvciBkZXN0QmxlbmRGYWN0b3IpCisJeworCQljb250ZXh0LT5zZXREZXN0QmxlbmRGYWN0b3IoZGVzdEJsZW5kRmFjdG9yKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRCbGVuZE9wZXJhdGlvbihDb250ZXh0OjpCbGVuZE9wZXJhdGlvbiBibGVuZE9wZXJhdGlvbikKKwl7CisJCWNvbnRleHQtPnNldEJsZW5kT3BlcmF0aW9uKGJsZW5kT3BlcmF0aW9uKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTZXBhcmF0ZUFscGhhQmxlbmRFbmFibGUoYm9vbCBzZXBhcmF0ZUFscGhhQmxlbmRFbmFibGUpCisJeworCQljb250ZXh0LT5zZXRTZXBhcmF0ZUFscGhhQmxlbmRFbmFibGUoc2VwYXJhdGVBbHBoYUJsZW5kRW5hYmxlKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKENvbnRleHQ6OkJsZW5kRmFjdG9yIHNvdXJjZUJsZW5kRmFjdG9yQWxwaGEpCisJeworCQljb250ZXh0LT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHNvdXJjZUJsZW5kRmFjdG9yQWxwaGEpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldERlc3RCbGVuZEZhY3RvckFscGhhKENvbnRleHQ6OkJsZW5kRmFjdG9yIGRlc3RCbGVuZEZhY3RvckFscGhhKQorCXsKKwkJY29udGV4dC0+c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoZGVzdEJsZW5kRmFjdG9yQWxwaGEpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEJsZW5kT3BlcmF0aW9uQWxwaGEoQ29udGV4dDo6QmxlbmRPcGVyYXRpb24gYmxlbmRPcGVyYXRpb25BbHBoYSkKKwl7CisJCWNvbnRleHQtPnNldEJsZW5kT3BlcmF0aW9uQWxwaGEoYmxlbmRPcGVyYXRpb25BbHBoYSk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0QWxwaGFSZWZlcmVuY2UoaW50IGFscGhhUmVmZXJlbmNlKQorCXsKKwkJY29udGV4dC0+YWxwaGFSZWZlcmVuY2UgPSBhbHBoYVJlZmVyZW5jZTsKKworCQlmYWN0b3IuYWxwaGFSZWZlcmVuY2U0WzBdID0gKHdvcmQpaXJvdW5kKChmbG9hdClhbHBoYVJlZmVyZW5jZSAqIDB4MTAwMCAvIDB4RkYpOworCQlmYWN0b3IuYWxwaGFSZWZlcmVuY2U0WzFdID0gKHdvcmQpaXJvdW5kKChmbG9hdClhbHBoYVJlZmVyZW5jZSAqIDB4MTAwMCAvIDB4RkYpOworCQlmYWN0b3IuYWxwaGFSZWZlcmVuY2U0WzJdID0gKHdvcmQpaXJvdW5kKChmbG9hdClhbHBoYVJlZmVyZW5jZSAqIDB4MTAwMCAvIDB4RkYpOworCQlmYWN0b3IuYWxwaGFSZWZlcmVuY2U0WzNdID0gKHdvcmQpaXJvdW5kKChmbG9hdClhbHBoYVJlZmVyZW5jZSAqIDB4MTAwMCAvIDB4RkYpOworCX0KKworCXZvaWQgUGl4ZWxQcm9jZXNzb3I6OnNldEdsb2JhbE1pcG1hcEJpYXMoZmxvYXQgYmlhcykKKwl7CisJCWNvbnRleHQtPnNldEdsb2JhbE1pcG1hcEJpYXMoYmlhcyk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0Rm9nU3RhcnQoZmxvYXQgc3RhcnQpCisJeworCQlzZXRGb2dSYW5nZXMoc3RhcnQsIGNvbnRleHQtPmZvZ0VuZCk7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0Rm9nRW5kKGZsb2F0IGVuZCkKKwl7CisJCXNldEZvZ1Jhbmdlcyhjb250ZXh0LT5mb2dTdGFydCwgZW5kKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRGb2dDb2xvcihDb2xvcjxmbG9hdD4gZm9nQ29sb3IpCisJeworCQkvLyBUT0RPOiBDb21wYWN0IGludG8gZ2VuZXJpYyBmdW5jdGlvbgorCQl3b3JkIGZvZ1IgPSAodW5zaWduZWQgc2hvcnQpKDY1NTM1ICogZm9nQ29sb3Iucik7CisJCXdvcmQgZm9nRyA9ICh1bnNpZ25lZCBzaG9ydCkoNjU1MzUgKiBmb2dDb2xvci5nKTsKKwkJd29yZCBmb2dCID0gKHVuc2lnbmVkIHNob3J0KSg2NTUzNSAqIGZvZ0NvbG9yLmIpOworCisJCWZvZy5jb2xvcjRbMF1bMF0gPSBmb2dSOworCQlmb2cuY29sb3I0WzBdWzFdID0gZm9nUjsKKwkJZm9nLmNvbG9yNFswXVsyXSA9IGZvZ1I7CisJCWZvZy5jb2xvcjRbMF1bM10gPSBmb2dSOworCisJCWZvZy5jb2xvcjRbMV1bMF0gPSBmb2dHOworCQlmb2cuY29sb3I0WzFdWzFdID0gZm9nRzsKKwkJZm9nLmNvbG9yNFsxXVsyXSA9IGZvZ0c7CisJCWZvZy5jb2xvcjRbMV1bM10gPSBmb2dHOworCisJCWZvZy5jb2xvcjRbMl1bMF0gPSBmb2dCOworCQlmb2cuY29sb3I0WzJdWzFdID0gZm9nQjsKKwkJZm9nLmNvbG9yNFsyXVsyXSA9IGZvZ0I7CisJCWZvZy5jb2xvcjRbMl1bM10gPSBmb2dCOworCisJCWZvZy5jb2xvckZbMF0gPSByZXBsaWNhdGUoZm9nQ29sb3Iucik7CisJCWZvZy5jb2xvckZbMV0gPSByZXBsaWNhdGUoZm9nQ29sb3IuZyk7CisJCWZvZy5jb2xvckZbMl0gPSByZXBsaWNhdGUoZm9nQ29sb3IuYik7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0Rm9nRGVuc2l0eShmbG9hdCBmb2dEZW5zaXR5KQorCXsKKwkJZm9nLmRlbnNpdHlFID0gcmVwbGljYXRlKC1mb2dEZW5zaXR5ICogMS40NDI2OTVmKTsgICAvLyAxL2VeeCA9IDJeKC14KjEuNDQpCisJCWZvZy5kZW5zaXR5RTIgPSByZXBsaWNhdGUoZm9nRGVuc2l0eSAqIDEuMjAxMTIyZik7ICAgLy8gMS9lXih4XjIpID0gMl4oLSh4KjEuMjApXjIpCisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0UGl4ZWxGb2dNb2RlKENvbnRleHQ6OkZvZ01vZGUgZm9nTW9kZSkKKwl7CisJCWNvbnRleHQtPnBpeGVsRm9nTW9kZSA9IGZvZ01vZGU7CisJfQorCisJdm9pZCBQaXhlbFByb2Nlc3Nvcjo6c2V0UGVyc3BlY3RpdmVDb3JyZWN0aW9uKGJvb2wgcGVyc3BlY3RpdmVFbmFibGUpCisJeworCQlwZXJzcGVjdGl2ZUNvcnJlY3Rpb24gPSBwZXJzcGVjdGl2ZUVuYWJsZTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRPY2NsdXNpb25FbmFibGVkKGJvb2wgZW5hYmxlKQorCXsKKwkJY29udGV4dC0+b2NjbHVzaW9uRW5hYmxlZCA9IGVuYWJsZTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRSb3V0aW5lQ2FjaGVTaXplKGludCBjYWNoZVNpemUpCisJeworCQlkZWxldGUgcm91dGluZUNhY2hlOworCQlyb3V0aW5lQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8U3RhdGUsIFJvdXRpbmU+KGNsYW1wKGNhY2hlU2l6ZSwgMSwgNjU1MzYpKTsKKwl9CisKKwl2b2lkIFBpeGVsUHJvY2Vzc29yOjpzZXRGb2dSYW5nZXMoZmxvYXQgc3RhcnQsIGZsb2F0IGVuZCkKKwl7CisJCWNvbnRleHQtPmZvZ1N0YXJ0ID0gc3RhcnQ7CisJCWNvbnRleHQtPmZvZ0VuZCA9IGVuZDsKKworCQlpZihzdGFydCA9PSBlbmQpCisJCXsKKwkJCWVuZCArPSAwLjAwMWY7ICAgLy8gSGFjazogZW5zdXJlIHRoZXJlIGlzIGEgc21hbGwgcmFuZ2UKKwkJfQorCisJCWZsb2F0IGZvZ1NjYWxlID0gLTEuMGYgLyAoZW5kIC0gc3RhcnQpOworCQlmbG9hdCBmb2dPZmZzZXQgPSBlbmQgKiAtZm9nU2NhbGU7CisKKwkJZm9nLnNjYWxlID0gcmVwbGljYXRlKGZvZ1NjYWxlKTsKKwkJZm9nLm9mZnNldCA9IHJlcGxpY2F0ZShmb2dPZmZzZXQpOworCX0KKworCWNvbnN0IFBpeGVsUHJvY2Vzc29yOjpTdGF0ZSBQaXhlbFByb2Nlc3Nvcjo6dXBkYXRlKCkgY29uc3QKKwl7CisJCVN0YXRlIHN0YXRlOworCisJCWlmKGNvbnRleHQtPnBpeGVsU2hhZGVyKQorCQl7CisJCQlzdGF0ZS5zaGFkZXJIYXNoID0gY29udGV4dC0+cGl4ZWxTaGFkZXItPmdldEhhc2goKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlLnNoYWRlckhhc2ggPSAwOworCQl9CisKKwkJc3RhdGUuZGVwdGhPdmVycmlkZSA9IGNvbnRleHQtPnBpeGVsU2hhZGVyICYmIGNvbnRleHQtPnBpeGVsU2hhZGVyLT5kZXB0aE92ZXJyaWRlKCk7CisJCXN0YXRlLnNoYWRlckNvbnRhaW5zVGV4a2lsbCA9IGNvbnRleHQtPnBpeGVsU2hhZGVyID8gY29udGV4dC0+cGl4ZWxTaGFkZXItPmNvbnRhaW5zVGV4a2lsbCgpIDogZmFsc2U7CisJCQorCQlpZihjb250ZXh0LT5hbHBoYVRlc3RBY3RpdmUoKSkKKwkJeworCQkJc3RhdGUuYWxwaGFDb21wYXJlTW9kZSA9IGNvbnRleHQtPmFscGhhQ29tcGFyZU1vZGU7CisKKwkJCXN0YXRlLnRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyA9IGNvbnRleHQtPnJlbmRlclRhcmdldFswXS0+Z2V0TXVsdGlTYW1wbGVDb3VudCgpID4gMSA/IHRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyA6IENvbnRleHQ6OlRSQU5TUEFSRU5DWV9OT05FOworCQl9CisKKwkJc3RhdGUuZGVwdGhXcml0ZUVuYWJsZSA9IGNvbnRleHQtPmRlcHRoV3JpdGVBY3RpdmUoKTsKKworCQlpZihjb250ZXh0LT5zdGVuY2lsQWN0aXZlKCkpCisJCXsKKwkJCXN0YXRlLnN0ZW5jaWxBY3RpdmUgPSB0cnVlOworCQkJc3RhdGUuc3RlbmNpbENvbXBhcmVNb2RlID0gY29udGV4dC0+c3RlbmNpbENvbXBhcmVNb2RlOworCQkJc3RhdGUuc3RlbmNpbEZhaWxPcGVyYXRpb24gPSBjb250ZXh0LT5zdGVuY2lsRmFpbE9wZXJhdGlvbjsKKwkJCXN0YXRlLnN0ZW5jaWxQYXNzT3BlcmF0aW9uID0gY29udGV4dC0+c3RlbmNpbFBhc3NPcGVyYXRpb247CisJCQlzdGF0ZS5zdGVuY2lsWkZhaWxPcGVyYXRpb24gPSBjb250ZXh0LT5zdGVuY2lsWkZhaWxPcGVyYXRpb247CisJCQlzdGF0ZS5ub1N0ZW5jaWxNYXNrID0gKGNvbnRleHQtPnN0ZW5jaWxNYXNrID09IDB4RkYpOworCQkJc3RhdGUubm9TdGVuY2lsV3JpdGVNYXNrID0gKGNvbnRleHQtPnN0ZW5jaWxXcml0ZU1hc2sgPT0gMHhGRik7CisJCQlzdGF0ZS5zdGVuY2lsV3JpdGVNYXNrZWQgPSAoY29udGV4dC0+c3RlbmNpbFdyaXRlTWFzayA9PSAweDAwKTsKKworCQkJc3RhdGUudHdvU2lkZWRTdGVuY2lsID0gY29udGV4dC0+dHdvU2lkZWRTdGVuY2lsOworCQkJc3RhdGUuc3RlbmNpbENvbXBhcmVNb2RlQ0NXID0gY29udGV4dC0+dHdvU2lkZWRTdGVuY2lsID8gY29udGV4dC0+c3RlbmNpbENvbXBhcmVNb2RlQ0NXIDogc3RhdGUuc3RlbmNpbENvbXBhcmVNb2RlOworCQkJc3RhdGUuc3RlbmNpbEZhaWxPcGVyYXRpb25DQ1cgPSBjb250ZXh0LT50d29TaWRlZFN0ZW5jaWwgPyBjb250ZXh0LT5zdGVuY2lsRmFpbE9wZXJhdGlvbkNDVyA6IHN0YXRlLnN0ZW5jaWxGYWlsT3BlcmF0aW9uOworCQkJc3RhdGUuc3RlbmNpbFBhc3NPcGVyYXRpb25DQ1cgPSBjb250ZXh0LT50d29TaWRlZFN0ZW5jaWwgPyBjb250ZXh0LT5zdGVuY2lsUGFzc09wZXJhdGlvbkNDVyA6IHN0YXRlLnN0ZW5jaWxQYXNzT3BlcmF0aW9uOworCQkJc3RhdGUuc3RlbmNpbFpGYWlsT3BlcmF0aW9uQ0NXID0gY29udGV4dC0+dHdvU2lkZWRTdGVuY2lsID8gY29udGV4dC0+c3RlbmNpbFpGYWlsT3BlcmF0aW9uQ0NXIDogc3RhdGUuc3RlbmNpbFpGYWlsT3BlcmF0aW9uOworCQkJc3RhdGUubm9TdGVuY2lsTWFza0NDVyA9IGNvbnRleHQtPnR3b1NpZGVkU3RlbmNpbCA/IChjb250ZXh0LT5zdGVuY2lsTWFza0NDVyA9PSAweEZGKSA6IHN0YXRlLm5vU3RlbmNpbE1hc2s7CisJCQlzdGF0ZS5ub1N0ZW5jaWxXcml0ZU1hc2tDQ1cgPSBjb250ZXh0LT50d29TaWRlZFN0ZW5jaWwgPyAoY29udGV4dC0+c3RlbmNpbFdyaXRlTWFza0NDVyA9PSAweEZGKSA6IHN0YXRlLm5vU3RlbmNpbFdyaXRlTWFzazsKKwkJCXN0YXRlLnN0ZW5jaWxXcml0ZU1hc2tlZENDVyA9IGNvbnRleHQtPnR3b1NpZGVkU3RlbmNpbCA/IChjb250ZXh0LT5zdGVuY2lsV3JpdGVNYXNrQ0NXID09IDB4MDApIDogc3RhdGUuc3RlbmNpbFdyaXRlTWFza2VkOworCQl9CisKKwkJaWYoY29udGV4dC0+ZGVwdGhCdWZmZXJBY3RpdmUoKSkKKwkJeworCQkJc3RhdGUuZGVwdGhUZXN0QWN0aXZlID0gdHJ1ZTsKKwkJCXN0YXRlLmRlcHRoQ29tcGFyZU1vZGUgPSBjb250ZXh0LT5kZXB0aENvbXBhcmVNb2RlOworCQkJc3RhdGUucXVhZExheW91dERlcHRoQnVmZmVyID0gY29udGV4dC0+ZGVwdGhTdGVuY2lsLT5nZXRJbnRlcm5hbEZvcm1hdCgpICE9IEZPUk1BVF9EMzJGX0xPQ0tBQkxFICYmCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5kZXB0aFN0ZW5jaWwtPmdldEludGVybmFsRm9ybWF0KCkgIT0gRk9STUFUX0QzMkZfVEVYVFVSRSAmJgorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZGVwdGhTdGVuY2lsLT5nZXRJbnRlcm5hbEZvcm1hdCgpICE9IEZPUk1BVF9EMzJGX1NIQURPVzsKKwkJfQorCisJCXN0YXRlLm9jY2x1c2lvbkVuYWJsZWQgPSBjb250ZXh0LT5vY2NsdXNpb25FbmFibGVkOworCisJCXN0YXRlLmZvZ0FjdGl2ZSA9IGNvbnRleHQtPmZvZ0FjdGl2ZSgpOworCQlzdGF0ZS5waXhlbEZvZ01vZGUgPSBjb250ZXh0LT5waXhlbEZvZ0FjdGl2ZSgpOworCQlzdGF0ZS53QmFzZWRGb2cgPSBjb250ZXh0LT53QmFzZWRGb2cgJiYgY29udGV4dC0+cGl4ZWxGb2dBY3RpdmUoKSAhPSBDb250ZXh0OjpGT0dfTk9ORTsKKwkJc3RhdGUucGVyc3BlY3RpdmUgPSBjb250ZXh0LT5wZXJzcGVjdGl2ZUFjdGl2ZSgpOworCisJCWlmKGNvbnRleHQtPmFscGhhQmxlbmRBY3RpdmUoKSkKKwkJeworCQkJc3RhdGUuYWxwaGFCbGVuZEFjdGl2ZSA9IHRydWU7CisJCQlzdGF0ZS5zb3VyY2VCbGVuZEZhY3RvciA9IGNvbnRleHQtPnNvdXJjZUJsZW5kRmFjdG9yKCk7CisJCQlzdGF0ZS5kZXN0QmxlbmRGYWN0b3IgPSBjb250ZXh0LT5kZXN0QmxlbmRGYWN0b3IoKTsKKwkJCXN0YXRlLmJsZW5kT3BlcmF0aW9uID0gY29udGV4dC0+YmxlbmRPcGVyYXRpb24oKTsKKwkJCXN0YXRlLnNvdXJjZUJsZW5kRmFjdG9yQWxwaGEgPSBjb250ZXh0LT5zb3VyY2VCbGVuZEZhY3RvckFscGhhKCk7CisJCQlzdGF0ZS5kZXN0QmxlbmRGYWN0b3JBbHBoYSA9IGNvbnRleHQtPmRlc3RCbGVuZEZhY3RvckFscGhhKCk7CisJCQlzdGF0ZS5ibGVuZE9wZXJhdGlvbkFscGhhID0gY29udGV4dC0+YmxlbmRPcGVyYXRpb25BbHBoYSgpOworCQl9CisJCQorCQlzdGF0ZS5jb2xvcldyaXRlTWFzayA9IChjb250ZXh0LT5jb2xvcldyaXRlQWN0aXZlKDApIDw8IDApIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAoY29udGV4dC0+Y29sb3JXcml0ZUFjdGl2ZSgxKSA8PCA0KSB8CisJCSAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRleHQtPmNvbG9yV3JpdGVBY3RpdmUoMikgPDwgOCkgfAorCQkgICAgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LT5jb2xvcldyaXRlQWN0aXZlKDMpIDw8IDEyKTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQorCQl7CisJCQlzdGF0ZS50YXJnZXRGb3JtYXRbaV0gPSBjb250ZXh0LT5yZW5kZXJUYXJnZXRJbnRlcm5hbEZvcm1hdChpKTsKKwkJfQorCisJCXN0YXRlLndyaXRlU1JHQgk9IGNvbnRleHQtPndyaXRlU1JHQiAmJiBTdXJmYWNlOjppc1NSR0J3cml0YWJsZShjb250ZXh0LT5yZW5kZXJUYXJnZXRbMF0tPmdldEV4dGVybmFsRm9ybWF0KCkpOworCQlzdGF0ZS5tdWx0aVNhbXBsZSA9IGNvbnRleHQtPnJlbmRlclRhcmdldFswXS0+Z2V0TXVsdGlTYW1wbGVDb3VudCgpOworCQlzdGF0ZS5tdWx0aVNhbXBsZU1hc2sgPSBjb250ZXh0LT5tdWx0aVNhbXBsZU1hc2s7CisKKwkJaWYoc3RhdGUubXVsdGlTYW1wbGUgPiAxICYmIGNvbnRleHQtPnBpeGVsU2hhZGVyKQorCQl7CisJCQlzdGF0ZS5jZW50cm9pZCA9IGNvbnRleHQtPnBpeGVsU2hhZGVyLT5jb250YWluc0NlbnRyb2lkKCk7CisJCX0KKworCQlpZighY29udGV4dC0+cGl4ZWxTaGFkZXIpCisJCXsKKwkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCA4OyBpKyspCisJCQl7CisJCQkJc3RhdGUudGV4dHVyZVN0YWdlW2ldID0gY29udGV4dC0+dGV4dHVyZVN0YWdlW2ldLnRleHR1cmVTdGFnZVN0YXRlKCk7CisJCQl9CisKKwkJCXN0YXRlLnNwZWN1bGFyQWRkID0gY29udGV4dC0+c3BlY3VsYXJBY3RpdmUoKSAmJiBjb250ZXh0LT5zcGVjdWxhckVuYWJsZTsKKwkJfQorCisJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl7CisJCQlpZihjb250ZXh0LT5waXhlbFNoYWRlcikKKwkJCXsKKwkJCQlpZihjb250ZXh0LT5waXhlbFNoYWRlci0+dXNlc1NhbXBsZXIoaSkpCisJCQkJeworCQkJCQlzdGF0ZS5zYW1wbGVyW2ldID0gY29udGV4dC0+c2FtcGxlcltpXS5zYW1wbGVyU3RhdGUoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoaSA8IDggJiYgc3RhdGUudGV4dHVyZVN0YWdlW2ldLnN0YWdlT3BlcmF0aW9uICE9IFRleHR1cmVTdGFnZTo6U1RBR0VfRElTQUJMRSkKKwkJCQl7CisJCQkJCXN0YXRlLnNhbXBsZXJbaV0gPSBjb250ZXh0LT5zYW1wbGVyW2ldLnNhbXBsZXJTdGF0ZSgpOworCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQl9CisKKwkJY29uc3QgYm9vbCBwb2ludCA9IGNvbnRleHQtPmlzRHJhd1BvaW50KHRydWUpOworCQljb25zdCBib29sIHNwcml0ZSA9IGNvbnRleHQtPnBvaW50U3ByaXRlQWN0aXZlKCk7CisJCWNvbnN0IGJvb2wgZmxhdFNoYWRpbmcgPSAoY29udGV4dC0+c2hhZGluZ01vZGUgPT0gQ29udGV4dDo6U0hBRElOR19GTEFUKSB8fCBwb2ludDsKKworCQlpZihjb250ZXh0LT5waXhlbFNoYWRlclZlcnNpb24oKSA8IDB4MDMwMCkKKwkJeworCQkJZm9yKGludCBjb29yZGluYXRlID0gMDsgY29vcmRpbmF0ZSA8IDg7IGNvb3JkaW5hdGUrKykKKwkJCXsKKwkJCQlmb3IoaW50IGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDQ7IGNvbXBvbmVudCsrKQorCQkJCXsKKwkJCQkJaWYoY29udGV4dC0+dGV4dHVyZUFjdGl2ZShjb29yZGluYXRlLCBjb21wb25lbnQpKQorCQkJCQl7CisJCQkJCQlzdGF0ZS50ZXh0dXJlW2Nvb3JkaW5hdGVdLmNvbXBvbmVudCB8PSAxIDw8IGNvbXBvbmVudDsKKworCQkJCQkJaWYocG9pbnQgJiYgIXNwcml0ZSkKKwkJCQkJCXsKKwkJCQkJCQlzdGF0ZS50ZXh0dXJlW2Nvb3JkaW5hdGVdLmZsYXQgfD0gMSA8PCBjb21wb25lbnQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZihjb250ZXh0LT50ZXh0dXJlVHJhbnNmb3JtUHJvamVjdFtjb29yZGluYXRlXSAmJiBjb250ZXh0LT5waXhlbFNoYWRlclZlcnNpb24oKSA8PSAweDAxMDMpCisJCQkJeworCQkJCQlpZihjb250ZXh0LT50ZXh0dXJlVHJhbnNmb3JtQ291bnRbY29vcmRpbmF0ZV0gPT0gMikKKwkJCQkJeworCQkJCQkJc3RhdGUudGV4dHVyZVtjb29yZGluYXRlXS5wcm9qZWN0ID0gMTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKGNvbnRleHQtPnRleHR1cmVUcmFuc2Zvcm1Db3VudFtjb29yZGluYXRlXSA9PSAzKQorCQkJCQl7CisJCQkJCQlzdGF0ZS50ZXh0dXJlW2Nvb3JkaW5hdGVdLnByb2plY3QgPSAyOworCQkJCQl9CisJCQkJCWVsc2UgaWYoY29udGV4dC0+dGV4dHVyZVRyYW5zZm9ybUNvdW50W2Nvb3JkaW5hdGVdID09IDQgfHwgY29udGV4dC0+dGV4dHVyZVRyYW5zZm9ybUNvdW50W2Nvb3JkaW5hdGVdID09IDApCisJCQkJCXsKKwkJCQkJCXN0YXRlLnRleHR1cmVbY29vcmRpbmF0ZV0ucHJvamVjdCA9IDM7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWZvcihpbnQgY29sb3IgPSAwOyBjb2xvciA8IDI7IGNvbG9yKyspCisJCQl7CisJCQkJZm9yKGludCBjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCA0OyBjb21wb25lbnQrKykKKwkJCQl7CisJCQkJCWlmKGNvbnRleHQtPmNvbG9yQWN0aXZlKGNvbG9yLCBjb21wb25lbnQpKQorCQkJCQl7CisJCQkJCQlzdGF0ZS5jb2xvcltjb2xvcl0uY29tcG9uZW50IHw9IDEgPDwgY29tcG9uZW50OworCQkJCQkJCisJCQkJCQlpZihwb2ludCB8fCBmbGF0U2hhZGluZykKKwkJCQkJCXsKKwkJCQkJCQlzdGF0ZS5jb2xvcltjb2xvcl0uZmxhdCB8PSAxIDw8IGNvbXBvbmVudDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYoY29udGV4dC0+Zm9nQWN0aXZlKCkpCisJCQl7CisJCQkJc3RhdGUuZm9nLmNvbXBvbmVudCA9IHRydWU7CisJCQkJCisJCQkJaWYocG9pbnQpCisJCQkJeworCQkJCQlzdGF0ZS5mb2cuZmxhdCA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZm9yKGludCBpbnRlcnBvbGFudCA9IDA7IGludGVycG9sYW50IDwgMTA7IGludGVycG9sYW50KyspCisJCQl7CisJCQkJZm9yKGludCBjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCA0OyBjb21wb25lbnQrKykKKwkJCQl7CisJCQkJCWlmKGNvbnRleHQtPnBpeGVsU2hhZGVyLT5zZW1hbnRpY1tpbnRlcnBvbGFudF1bY29tcG9uZW50XS5hY3RpdmUoKSkKKwkJCQkJeworCQkJCQkJYm9vbCBmbGF0ID0gcG9pbnQ7CisKKwkJCQkJCXN3aXRjaChjb250ZXh0LT5waXhlbFNoYWRlci0+c2VtYW50aWNbaW50ZXJwb2xhbnRdW2NvbXBvbmVudF0udXNhZ2UpCisJCQkJCQl7CisJCQkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfVEVYQ09PUkQ6CWZsYXQgPSBwb2ludCAmJiAhc3ByaXRlOwlicmVhazsKKwkJCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9DT0xPUjoJCWZsYXQgPSBmbGF0U2hhZGluZzsJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJc3RhdGUuaW50ZXJwb2xhbnRbaW50ZXJwb2xhbnRdLmNvbXBvbmVudCB8PSAxIDw8IGNvbXBvbmVudDsKKworCQkJCQkJaWYoZmxhdCkKKwkJCQkJCXsKKwkJCQkJCQlzdGF0ZS5pbnRlcnBvbGFudFtpbnRlcnBvbGFudF0uZmxhdCB8PSAxIDw8IGNvbXBvbmVudDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmKHN0YXRlLmNlbnRyb2lkKQorCQl7CisJCQlmb3IoaW50IGludGVycG9sYW50ID0gMDsgaW50ZXJwb2xhbnQgPCAxMDsgaW50ZXJwb2xhbnQrKykKKwkJCXsKKwkJCQlmb3IoaW50IGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDQ7IGNvbXBvbmVudCsrKQorCQkJCXsKKwkJCQkJc3RhdGUuaW50ZXJwb2xhbnRbaW50ZXJwb2xhbnRdLmNlbnRyb2lkID0gY29udGV4dC0+cGl4ZWxTaGFkZXItPnNlbWFudGljW2ludGVycG9sYW50XVswXS5jZW50cm9pZDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlzdGF0ZS5oYXNoID0gc3RhdGUuY29tcHV0ZUhhc2goKTsKKworCQlyZXR1cm4gc3RhdGU7CisJfQorCisJUm91dGluZSAqUGl4ZWxQcm9jZXNzb3I6OnJvdXRpbmUoY29uc3QgU3RhdGUgJnN0YXRlKQorCXsKKwkJUm91dGluZSAqcm91dGluZSA9IHJvdXRpbmVDYWNoZS0+cXVlcnkoc3RhdGUpOworCisJCWlmKCFyb3V0aW5lKQorCQl7CisJCQlSYXN0ZXJpemVyICpnZW5lcmF0b3IgPSBuZXcgUXVhZFJhc3Rlcml6ZXIoc3RhdGUsIGNvbnRleHQtPnBpeGVsU2hhZGVyKTsKKwkJCWdlbmVyYXRvci0+Z2VuZXJhdGUoKTsKKwkJCXJvdXRpbmUgPSBnZW5lcmF0b3ItPmdldFJvdXRpbmUoKTsKKwkJCWRlbGV0ZSBnZW5lcmF0b3I7CisKKwkJCXJvdXRpbmVDYWNoZS0+YWRkKHN0YXRlLCByb3V0aW5lKTsKKwkJfQorCisJCXJldHVybiByb3V0aW5lOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9QaXhlbFByb2Nlc3Nvci5ocHAgYi9zcmMvUmVuZGVyZXIvUGl4ZWxQcm9jZXNzb3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjczY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvUGl4ZWxQcm9jZXNzb3IuaHBwCkBAIC0wLDAgKzEsMzA5IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgc3dfUGl4ZWxQcm9jZXNzb3JfaHBwCisjZGVmaW5lIHN3X1BpeGVsUHJvY2Vzc29yX2hwcAorCisjaW5jbHVkZSAiQ29udGV4dC5ocHAiCisjaW5jbHVkZSAiTFJVQ2FjaGUuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwljbGFzcyBQaXhlbFNoYWRlcjsKKwljbGFzcyBSYXN0ZXJpemVyOworCXN0cnVjdCBUZXh0dXJlOworCWNsYXNzIFJvdXRpbmU7CisJc3RydWN0IERyYXdEYXRhOworCisJY2xhc3MgUGl4ZWxQcm9jZXNzb3IKKwl7CisJcHVibGljOgorCQlzdHJ1Y3QgU3RhdGVzCisJCXsKKwkJCXVuc2lnbmVkIGludCBjb21wdXRlSGFzaCgpOworCisJCQl1aW50NjRfdCBzaGFkZXJIYXNoOworCisJCQl1bnNpZ25lZCBpbnQgZGVwdGhPdmVycmlkZSAgICAgICAgICAgIDogMTsKKwkJCXVuc2lnbmVkIGludCBzaGFkZXJDb250YWluc1RleGtpbGwgICAgOiAxOworCisJCQl1bnNpZ25lZCBpbnQgZGVwdGhDb21wYXJlTW9kZSAgICAgICAgIDogQklUUyhDb250ZXh0OjpERVBUSF9MQVNUKTsKKwkJCXVuc2lnbmVkIGludCBhbHBoYUNvbXBhcmVNb2RlICAgICAgICAgOiBCSVRTKENvbnRleHQ6OkFMUEhBX0xBU1QpOworCQkJdW5zaWduZWQgaW50IGRlcHRoV3JpdGVFbmFibGUgICAgICAgICA6IDE7CisJCQl1bnNpZ25lZCBpbnQgcXVhZExheW91dERlcHRoQnVmZmVyICAgIDogMTsKKworCQkJdW5zaWduZWQgaW50IHN0ZW5jaWxBY3RpdmUgICAgICAgICAgICA6IDE7CisJCQl1bnNpZ25lZCBpbnQgc3RlbmNpbENvbXBhcmVNb2RlICAgICAgIDogQklUUyhDb250ZXh0OjpTVEVOQ0lMX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHN0ZW5jaWxGYWlsT3BlcmF0aW9uICAgICA6IEJJVFMoQ29udGV4dDo6T1BFUkFUSU9OX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHN0ZW5jaWxQYXNzT3BlcmF0aW9uICAgICA6IEJJVFMoQ29udGV4dDo6T1BFUkFUSU9OX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHN0ZW5jaWxaRmFpbE9wZXJhdGlvbiAgICA6IEJJVFMoQ29udGV4dDo6T1BFUkFUSU9OX0xBU1QpOworCQkJdW5zaWduZWQgaW50IG5vU3RlbmNpbE1hc2sgICAgICAgICAgICA6IDE7CisJCQl1bnNpZ25lZCBpbnQgbm9TdGVuY2lsV3JpdGVNYXNrICAgICAgIDogMTsKKwkJCXVuc2lnbmVkIGludCBzdGVuY2lsV3JpdGVNYXNrZWQgICAgICAgOiAxOworCQkJdW5zaWduZWQgaW50IHR3b1NpZGVkU3RlbmNpbCAgICAgICAgICA6IDE7CisJCQl1bnNpZ25lZCBpbnQgc3RlbmNpbENvbXBhcmVNb2RlQ0NXICAgIDogQklUUyhDb250ZXh0OjpTVEVOQ0lMX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHN0ZW5jaWxGYWlsT3BlcmF0aW9uQ0NXICA6IEJJVFMoQ29udGV4dDo6T1BFUkFUSU9OX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHN0ZW5jaWxQYXNzT3BlcmF0aW9uQ0NXICA6IEJJVFMoQ29udGV4dDo6T1BFUkFUSU9OX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyA6IEJJVFMoQ29udGV4dDo6T1BFUkFUSU9OX0xBU1QpOworCQkJdW5zaWduZWQgaW50IG5vU3RlbmNpbE1hc2tDQ1cgICAgICAgICA6IDE7CisJCQl1bnNpZ25lZCBpbnQgbm9TdGVuY2lsV3JpdGVNYXNrQ0NXICAgIDogMTsKKwkJCXVuc2lnbmVkIGludCBzdGVuY2lsV3JpdGVNYXNrZWRDQ1cgICAgOiAxOworCisJCQl1bnNpZ25lZCBpbnQgZGVwdGhUZXN0QWN0aXZlICAgICAgICAgIDogMTsKKwkJCXVuc2lnbmVkIGludCBmb2dBY3RpdmUgICAgICAgICAgICAgICAgOiAxOworCQkJdW5zaWduZWQgaW50IHBpeGVsRm9nTW9kZSAgICAgICAgICAgICA6IEJJVFMoQ29udGV4dDo6Rk9HX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHNwZWN1bGFyQWRkICAgICAgICAgICAgICA6IDE7CisJCQl1bnNpZ25lZCBpbnQgb2NjbHVzaW9uRW5hYmxlZCAgICAgICAgIDogMTsKKwkJCXVuc2lnbmVkIGludCB3QmFzZWRGb2cgICAgICAgICAgICAgICAgOiAxOworCQkJdW5zaWduZWQgaW50IHBlcnNwZWN0aXZlICAgICAgICAgICAgICA6IDE7CisKKwkJCXVuc2lnbmVkIGludCBhbHBoYUJsZW5kQWN0aXZlICAgICAgICAgOiAxOworCQkJdW5zaWduZWQgaW50IHNvdXJjZUJsZW5kRmFjdG9yICAgICAgICA6IEJJVFMoQ29udGV4dDo6QkxFTkRfTEFTVCk7CisJCQl1bnNpZ25lZCBpbnQgZGVzdEJsZW5kRmFjdG9yICAgICAgICAgIDogQklUUyhDb250ZXh0OjpCTEVORF9MQVNUKTsKKwkJCXVuc2lnbmVkIGludCBibGVuZE9wZXJhdGlvbiAgICAgICAgICAgOiBCSVRTKENvbnRleHQ6OkJMRU5ET1BfTEFTVCk7CisJCQl1bnNpZ25lZCBpbnQgc291cmNlQmxlbmRGYWN0b3JBbHBoYSAgIDogQklUUyhDb250ZXh0OjpCTEVORF9MQVNUKTsKKwkJCXVuc2lnbmVkIGludCBkZXN0QmxlbmRGYWN0b3JBbHBoYSAgICAgOiBCSVRTKENvbnRleHQ6OkJMRU5EX0xBU1QpOworCQkJdW5zaWduZWQgaW50IGJsZW5kT3BlcmF0aW9uQWxwaGEgICAgICA6IEJJVFMoQ29udGV4dDo6QkxFTkRPUF9MQVNUKTsKKwkJCQorCQkJdW5zaWduZWQgaW50IGNvbG9yV3JpdGVNYXNrICAgICAgICAgICA6IDE2OyAgIC8vIChmb3VyIHRpbWVzIGZvdXIgY29tcG9uZW50IGJpdCBtYXNrKQorCQkJdW5zaWduZWQgY2hhciB0YXJnZXRGb3JtYXRbNF07CisJCQl1bnNpZ25lZCBpbnQgd3JpdGVTUkdCICAgICAgICAgICAgICAgIDogMTsKKwkJCXVuc2lnbmVkIGludCBtdWx0aVNhbXBsZSAgICAgICAgICAgICAgOiAzOworCQkJdW5zaWduZWQgaW50IG11bHRpU2FtcGxlTWFzayAgICAgICAgICA6IDQ7CisJCQl1bnNpZ25lZCBpbnQgdHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nIDogQklUUyhDb250ZXh0OjpUUkFOU1BBUkVOQ1lfTEFTVCk7CisJCQl1bnNpZ25lZCBpbnQgY2VudHJvaWQgICAgICAgICAgICAgICAgIDogMTsKKworCQkJU2FtcGxlcjo6U3RhdGUgc2FtcGxlclsxNl07CisJCQlUZXh0dXJlU3RhZ2U6OlN0YXRlIHRleHR1cmVTdGFnZVs4XTsKKworCQkJc3RydWN0IEludGVycG9sYW50CisJCQl7CisJCQkJdW5zaWduZWQgY2hhciBjb21wb25lbnQgOiA0OworCQkJCXVuc2lnbmVkIGNoYXIgZmxhdCA6IDQ7CisJCQkJdW5zaWduZWQgY2hhciBwcm9qZWN0IDogMjsKKwkJCQl1bnNpZ25lZCBjaGFyIGNlbnRyb2lkIDogMTsKKwkJCX07CisKKwkJCXVuaW9uCisJCQl7CisJCQkJc3RydWN0CisJCQkJeworCQkJCQlJbnRlcnBvbGFudCBjb2xvclsyXTsKKwkJCQkJSW50ZXJwb2xhbnQgdGV4dHVyZVs4XTsKKwkJCQkJSW50ZXJwb2xhbnQgZm9nOworCQkJCX07CisKKwkJCQlJbnRlcnBvbGFudCBpbnRlcnBvbGFudFsxMF07CisJCQl9OworCQl9OworCisJCXN0cnVjdCBTdGF0ZSA6IFN0YXRlcworCQl7CisJCQlTdGF0ZSgpOworCisJCQlib29sIG9wZXJhdG9yPT0oY29uc3QgU3RhdGUgJnN0YXRlKSBjb25zdDsKKworCQkJaW50IGNvbG9yV3JpdGVBY3RpdmUoaW50IGluZGV4KSBjb25zdAorCQkJeworCQkJCXJldHVybiAoY29sb3JXcml0ZU1hc2sgPj4gKGluZGV4ICogNCkpICYgMHhGOworCQkJfQorCisJCQlib29sIGFscGhhVGVzdEFjdGl2ZSgpIGNvbnN0CisJCQl7CisJCQkJcmV0dXJuIGFscGhhQ29tcGFyZU1vZGUgIT0gQ29udGV4dDo6QUxQSEFfQUxXQVlTOworCQkJfQorCisJCQlib29sIHBpeGVsRm9nQWN0aXZlKCkgY29uc3QKKwkJCXsKKwkJCQlyZXR1cm4gcGl4ZWxGb2dNb2RlICE9IENvbnRleHQ6OkZPR19OT05FOworCQkJfQorCisJCQl1bnNpZ25lZCBpbnQgaGFzaDsKKwkJfTsKKworCQlzdHJ1Y3QgU3RlbmNpbAorCQl7CisJCQlpbnQ2NF90IHRlc3RNYXNrUTsKKwkJCWludDY0X3QgcmVmZXJlbmNlTWFza2VkUTsKKwkJCWludDY0X3QgcmVmZXJlbmNlTWFza2VkU2lnbmVkUTsKKwkJCWludDY0X3Qgd3JpdGVNYXNrUTsKKwkJCWludDY0X3QgaW52V3JpdGVNYXNrUTsKKwkJCWludDY0X3QgcmVmZXJlbmNlUTsKKworCQkJdm9pZCBzZXQoaW50IHJlZmVyZW5jZSwgaW50IHRlc3RNYXNrLCBpbnQgd3JpdGVNYXNrKQorCQkJeworCQkJCXJlZmVyZW5jZVEgPSByZXBsaWNhdGUocmVmZXJlbmNlKTsKKwkJCQl0ZXN0TWFza1EgPSByZXBsaWNhdGUodGVzdE1hc2spOworCQkJCXdyaXRlTWFza1EgPSByZXBsaWNhdGUod3JpdGVNYXNrKTsKKwkJCQlpbnZXcml0ZU1hc2tRID0gfndyaXRlTWFza1E7CisJCQkJcmVmZXJlbmNlTWFza2VkUSA9IHJlZmVyZW5jZVEgJiB0ZXN0TWFza1E7CisJCQkJcmVmZXJlbmNlTWFza2VkU2lnbmVkUSA9IHJlcGxpY2F0ZSgocmVmZXJlbmNlICsgMHg4MCkgJiAweEZGICYgdGVzdE1hc2spOworCQkJfQorCisJCQlzdGF0aWMgaW50NjRfdCByZXBsaWNhdGUoaW50IGIpCisJCQl7CisJCQkJaW50NjRfdCB3ID0gYiAmIDB4RkY7CisKKwkJCQlyZXR1cm4gKHcgPDwgMCkgfCAodyA8PCA4KSB8ICh3IDw8IDE2KSB8ICh3IDw8IDI0KSB8ICh3IDw8IDMyKSB8ICh3IDw8IDQwKSB8ICh3IDw8IDQ4KSB8ICh3IDw8IDU2KTsKKwkJCX0KKwkJfTsKKworCQlzdHJ1Y3QgRm9nCisJCXsKKwkJCWZsb2F0NCBzY2FsZTsKKwkJCWZsb2F0NCBvZmZzZXQ7CisJCQl3b3JkNCBjb2xvcjRbM107CisJCQlmbG9hdDQgY29sb3JGWzNdOworCQkJZmxvYXQ0IGRlbnNpdHlFOworCQkJZmxvYXQ0IGRlbnNpdHlFMjsKKwkJfTsKKworCQlzdHJ1Y3QgRmFjdG9yCisJCXsKKwkJCXdvcmQ0IHRleHR1cmVGYWN0b3I0WzRdOworCisJCQl3b3JkNCBhbHBoYVJlZmVyZW5jZTQ7CisKKwkJCXdvcmQ0IGJsZW5kQ29uc3RhbnQ0V1s0XTsKKwkJCWZsb2F0NCBibGVuZENvbnN0YW50NEZbNF07CisJCQl3b3JkNCBpbnZCbGVuZENvbnN0YW50NFdbNF07CisJCQlmbG9hdDQgaW52QmxlbmRDb25zdGFudDRGWzRdOworCQl9OworCisJcHVibGljOgorCQl0eXBlZGVmIHZvaWQgKF9fY2RlY2wgKlJvdXRpbmVQb2ludGVyKShjb25zdCBQcmltaXRpdmUgKnByaW1pdGl2ZSwgaW50IGNvdW50LCBpbnQgdGhyZWFkLCBEcmF3RGF0YSAqZHJhdyk7CisKKwkJUGl4ZWxQcm9jZXNzb3IoQ29udGV4dCAqY29udGV4dCk7CisKKwkJdmlydHVhbCB+UGl4ZWxQcm9jZXNzb3IoKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0RmxvYXRDb25zdGFudCh1bnNpZ25lZCBpbnQgaW5kZXgsIGNvbnN0IGZsb2F0IHZhbHVlWzRdKTsKKwkJdmlydHVhbCB2b2lkIHNldEludGVnZXJDb25zdGFudCh1bnNpZ25lZCBpbnQgaW5kZXgsIGNvbnN0IGludCB2YWx1ZVs0XSk7CisJCXZpcnR1YWwgdm9pZCBzZXRCb29sZWFuQ29uc3RhbnQodW5zaWduZWQgaW50IGluZGV4LCBpbnQgYm9vbGVhbik7CisKKwkJdmlydHVhbCB2b2lkIHNldFJlbmRlclRhcmdldChpbnQgaW5kZXgsIFN1cmZhY2UgKnJlbmRlclRhcmdldCk7CisJCXZpcnR1YWwgdm9pZCBzZXREZXB0aFN0ZW5jaWwoU3VyZmFjZSAqZGVwdGhTdGVuY2lsKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0VGV4Q29vcmRJbmRleCh1bnNpZ25lZCBpbnQgc3RhZ2UsIGludCB0ZXhDb29yZEluZGV4KTsKKwkJdmlydHVhbCB2b2lkIHNldFN0YWdlT3BlcmF0aW9uKHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpTdGFnZU9wZXJhdGlvbiBzdGFnZU9wZXJhdGlvbik7CisJCXZpcnR1YWwgdm9pZCBzZXRGaXJzdEFyZ3VtZW50KHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpTb3VyY2VBcmd1bWVudCBmaXJzdEFyZ3VtZW50KTsKKwkJdmlydHVhbCB2b2lkIHNldFNlY29uZEFyZ3VtZW50KHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpTb3VyY2VBcmd1bWVudCBzZWNvbmRBcmd1bWVudCk7CisJCXZpcnR1YWwgdm9pZCBzZXRUaGlyZEFyZ3VtZW50KHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpTb3VyY2VBcmd1bWVudCB0aGlyZEFyZ3VtZW50KTsKKwkJdmlydHVhbCB2b2lkIHNldFN0YWdlT3BlcmF0aW9uQWxwaGEodW5zaWduZWQgaW50IHN0YWdlLCBUZXh0dXJlU3RhZ2U6OlN0YWdlT3BlcmF0aW9uIHN0YWdlT3BlcmF0aW9uQWxwaGEpOworCQl2aXJ0dWFsIHZvaWQgc2V0Rmlyc3RBcmd1bWVudEFscGhhKHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpTb3VyY2VBcmd1bWVudCBmaXJzdEFyZ3VtZW50QWxwaGEpOworCQl2aXJ0dWFsIHZvaWQgc2V0U2Vjb25kQXJndW1lbnRBbHBoYSh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6U291cmNlQXJndW1lbnQgc2Vjb25kQXJndW1lbnRBbHBoYSk7CisJCXZpcnR1YWwgdm9pZCBzZXRUaGlyZEFyZ3VtZW50QWxwaGEodW5zaWduZWQgaW50IHN0YWdlLCBUZXh0dXJlU3RhZ2U6OlNvdXJjZUFyZ3VtZW50IHRoaXJkQXJndW1lbnRBbHBoYSk7CisJCXZpcnR1YWwgdm9pZCBzZXRGaXJzdE1vZGlmaWVyKHVuc2lnbmVkIGludCBzdGFnZSwgVGV4dHVyZVN0YWdlOjpBcmd1bWVudE1vZGlmaWVyIGZpcnN0TW9kaWZpZXIpOworCQl2aXJ0dWFsIHZvaWQgc2V0U2Vjb25kTW9kaWZpZXIodW5zaWduZWQgaW50IHN0YWdlLCBUZXh0dXJlU3RhZ2U6OkFyZ3VtZW50TW9kaWZpZXIgc2Vjb25kTW9kaWZpZXIpOworCQl2aXJ0dWFsIHZvaWQgc2V0VGhpcmRNb2RpZmllcih1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6QXJndW1lbnRNb2RpZmllciB0aGlyZE1vZGlmaWVyKTsKKwkJdmlydHVhbCB2b2lkIHNldEZpcnN0TW9kaWZpZXJBbHBoYSh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6QXJndW1lbnRNb2RpZmllciBmaXJzdE1vZGlmaWVyQWxwaGEpOworCQl2aXJ0dWFsIHZvaWQgc2V0U2Vjb25kTW9kaWZpZXJBbHBoYSh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6QXJndW1lbnRNb2RpZmllciBzZWNvbmRNb2RpZmllckFscGhhKTsKKwkJdmlydHVhbCB2b2lkIHNldFRoaXJkTW9kaWZpZXJBbHBoYSh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6QXJndW1lbnRNb2RpZmllciB0aGlyZE1vZGlmaWVyQWxwaGEpOworCQl2aXJ0dWFsIHZvaWQgc2V0RGVzdGluYXRpb25Bcmd1bWVudCh1bnNpZ25lZCBpbnQgc3RhZ2UsIFRleHR1cmVTdGFnZTo6RGVzdGluYXRpb25Bcmd1bWVudCBkZXN0aW5hdGlvbkFyZ3VtZW50KTsKKwkJdmlydHVhbCB2b2lkIHNldENvbnN0YW50Q29sb3IodW5zaWduZWQgaW50IHN0YWdlLCBjb25zdCBDb2xvcjxmbG9hdD4gJmNvbnN0YW50Q29sb3IpOworCQl2aXJ0dWFsIHZvaWQgc2V0QnVtcG1hcE1hdHJpeCh1bnNpZ25lZCBpbnQgc3RhZ2UsIGludCBlbGVtZW50LCBmbG9hdCB2YWx1ZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRMdW1pbmFuY2VTY2FsZSh1bnNpZ25lZCBpbnQgc3RhZ2UsIGZsb2F0IHZhbHVlKTsKKwkJdmlydHVhbCB2b2lkIHNldEx1bWluYW5jZU9mZnNldCh1bnNpZ25lZCBpbnQgc3RhZ2UsIGZsb2F0IHZhbHVlKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0VGV4dHVyZUZpbHRlcih1bnNpZ25lZCBpbnQgc2FtcGxlciwgRmlsdGVyVHlwZSB0ZXh0dXJlRmlsdGVyKTsKKwkJdmlydHVhbCB2b2lkIHNldE1pcG1hcEZpbHRlcih1bnNpZ25lZCBpbnQgc2FtcGxlciwgTWlwbWFwVHlwZSBtaXBtYXBGaWx0ZXIpOworCQl2aXJ0dWFsIHZvaWQgc2V0R2F0aGVyRW5hYmxlKHVuc2lnbmVkIGludCBzYW1wbGVyLCBib29sIGVuYWJsZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRBZGRyZXNzaW5nTW9kZVUodW5zaWduZWQgaW50IHNhbXBsZXIsIEFkZHJlc3NpbmdNb2RlIGFkZHJlc3NpbmdNb2RlKTsKKwkJdmlydHVhbCB2b2lkIHNldEFkZHJlc3NpbmdNb2RlVih1bnNpZ25lZCBpbnQgc2FtcGxlciwgQWRkcmVzc2luZ01vZGUgYWRkcmVzc2luZ01vZGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0QWRkcmVzc2luZ01vZGVXKHVuc2lnbmVkIGludCBzYW1wbGVyLCBBZGRyZXNzaW5nTW9kZSBhZGRyZXNzaW5nTW9kZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRSZWFkU1JHQih1bnNpZ25lZCBpbnQgc2FtcGxlciwgYm9vbCBzUkdCKTsKKwkJdmlydHVhbCB2b2lkIHNldE1pcG1hcExPRCh1bnNpZ25lZCBpbnQgc2FtcGxlciwgZmxvYXQgYmlhcyk7CisJCXZpcnR1YWwgdm9pZCBzZXRCb3JkZXJDb2xvcih1bnNpZ25lZCBpbnQgc2FtcGxlciwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZib3JkZXJDb2xvcik7CisJCXZpcnR1YWwgdm9pZCBzZXRNYXhBbmlzb3Ryb3B5KHVuc2lnbmVkIGludCBzYW1wbGVyLCB1bnNpZ25lZCBpbnQgbWF4QW5pc290cm9weSk7CisKKwkJdmlydHVhbCB2b2lkIHNldFdyaXRlU1JHQihib29sIHNSR0IpOworCQl2aXJ0dWFsIHZvaWQgc2V0RGVwdGhCdWZmZXJFbmFibGUoYm9vbCBkZXB0aEJ1ZmZlckVuYWJsZSk7CisJCXZpcnR1YWwgdm9pZCBzZXREZXB0aENvbXBhcmUoQ29udGV4dDo6RGVwdGhDb21wYXJlTW9kZSBkZXB0aENvbXBhcmVNb2RlKTsKKwkJdmlydHVhbCB2b2lkIHNldEFscGhhQ29tcGFyZShDb250ZXh0OjpBbHBoYUNvbXBhcmVNb2RlIGFscGhhQ29tcGFyZU1vZGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0RGVwdGhXcml0ZUVuYWJsZShib29sIGRlcHRoV3JpdGVFbmFibGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0QWxwaGFUZXN0RW5hYmxlKGJvb2wgYWxwaGFUZXN0RW5hYmxlKTsKKwkJdmlydHVhbCB2b2lkIHNldEN1bGxNb2RlKENvbnRleHQ6OkN1bGxNb2RlIGN1bGxNb2RlKTsKKwkJdmlydHVhbCB2b2lkIHNldENvbG9yV3JpdGVNYXNrKGludCBpbmRleCwgaW50IHJnYmFNYXNrKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0U3RlbmNpbEVuYWJsZShib29sIHN0ZW5jaWxFbmFibGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0U3RlbmNpbENvbXBhcmUoQ29udGV4dDo6U3RlbmNpbENvbXBhcmVNb2RlIHN0ZW5jaWxDb21wYXJlTW9kZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRTdGVuY2lsUmVmZXJlbmNlKGludCBzdGVuY2lsUmVmZXJlbmNlKTsKKwkJdmlydHVhbCB2b2lkIHNldFN0ZW5jaWxNYXNrKGludCBzdGVuY2lsTWFzayk7CisJCXZpcnR1YWwgdm9pZCBzZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uIHN0ZW5jaWxGYWlsT3BlcmF0aW9uKTsKKwkJdmlydHVhbCB2b2lkIHNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKENvbnRleHQ6OlN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbFBhc3NPcGVyYXRpb24pOworCQl2aXJ0dWFsIHZvaWQgc2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKENvbnRleHQ6OlN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbFpGYWlsT3BlcmF0aW9uKTsKKwkJdmlydHVhbCB2b2lkIHNldFN0ZW5jaWxXcml0ZU1hc2soaW50IHN0ZW5jaWxXcml0ZU1hc2spOworCQl2aXJ0dWFsIHZvaWQgc2V0VHdvU2lkZWRTdGVuY2lsKGJvb2wgZW5hYmxlKTsKKwkJdmlydHVhbCB2b2lkIHNldFN0ZW5jaWxDb21wYXJlQ0NXKENvbnRleHQ6OlN0ZW5jaWxDb21wYXJlTW9kZSBzdGVuY2lsQ29tcGFyZU1vZGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0U3RlbmNpbFJlZmVyZW5jZUNDVyhpbnQgc3RlbmNpbFJlZmVyZW5jZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRTdGVuY2lsTWFza0NDVyhpbnQgc3RlbmNpbE1hc2spOworCQl2aXJ0dWFsIHZvaWQgc2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coQ29udGV4dDo6U3RlbmNpbE9wZXJhdGlvbiBzdGVuY2lsRmFpbE9wZXJhdGlvbik7CisJCXZpcnR1YWwgdm9pZCBzZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uIHN0ZW5jaWxQYXNzT3BlcmF0aW9uKTsKKwkJdmlydHVhbCB2b2lkIHNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uIHN0ZW5jaWxaRmFpbE9wZXJhdGlvbik7CisJCXZpcnR1YWwgdm9pZCBzZXRTdGVuY2lsV3JpdGVNYXNrQ0NXKGludCBzdGVuY2lsV3JpdGVNYXNrKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0VGV4dHVyZUZhY3Rvcihjb25zdCBDb2xvcjxmbG9hdD4gJnRleHR1cmVGYWN0b3IpOworCQl2aXJ0dWFsIHZvaWQgc2V0QmxlbmRDb25zdGFudChjb25zdCBDb2xvcjxmbG9hdD4gJmJsZW5kQ29uc3RhbnQpOworCisJCXZpcnR1YWwgdm9pZCBzZXRGaWxsTW9kZShDb250ZXh0OjpGaWxsTW9kZSBmaWxsTW9kZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRTaGFkaW5nTW9kZShDb250ZXh0OjpTaGFkaW5nTW9kZSBzaGFkaW5nTW9kZSk7CisJCQorCQl2aXJ0dWFsIHZvaWQgc2V0QWxwaGFCbGVuZEVuYWJsZShib29sIGFscGhhQmxlbmRFbmFibGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0U291cmNlQmxlbmRGYWN0b3IoQ29udGV4dDo6QmxlbmRGYWN0b3Igc291cmNlQmxlbmRGYWN0b3IpOworCQl2aXJ0dWFsIHZvaWQgc2V0RGVzdEJsZW5kRmFjdG9yKENvbnRleHQ6OkJsZW5kRmFjdG9yIGRlc3RCbGVuZEZhY3Rvcik7CisJCXZpcnR1YWwgdm9pZCBzZXRCbGVuZE9wZXJhdGlvbihDb250ZXh0OjpCbGVuZE9wZXJhdGlvbiBibGVuZE9wZXJhdGlvbik7CisKKwkJdmlydHVhbCB2b2lkIHNldFNlcGFyYXRlQWxwaGFCbGVuZEVuYWJsZShib29sIHNlcGFyYXRlQWxwaGFCbGVuZEVuYWJsZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKENvbnRleHQ6OkJsZW5kRmFjdG9yIHNvdXJjZUJsZW5kRmFjdG9yQWxwaGEpOworCQl2aXJ0dWFsIHZvaWQgc2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoQ29udGV4dDo6QmxlbmRGYWN0b3IgZGVzdEJsZW5kRmFjdG9yQWxwaGEpOworCQl2aXJ0dWFsIHZvaWQgc2V0QmxlbmRPcGVyYXRpb25BbHBoYShDb250ZXh0OjpCbGVuZE9wZXJhdGlvbiBibGVuZE9wZXJhdGlvbkFscGhhKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0QWxwaGFSZWZlcmVuY2UoaW50IGFscGhhUmVmZXJlbmNlKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0R2xvYmFsTWlwbWFwQmlhcyhmbG9hdCBiaWFzKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0Rm9nU3RhcnQoZmxvYXQgc3RhcnQpOworCQl2aXJ0dWFsIHZvaWQgc2V0Rm9nRW5kKGZsb2F0IGVuZCk7CisJCXZpcnR1YWwgdm9pZCBzZXRGb2dDb2xvcihDb2xvcjxmbG9hdD4gZm9nQ29sb3IpOworCQl2aXJ0dWFsIHZvaWQgc2V0Rm9nRGVuc2l0eShmbG9hdCBmb2dEZW5zaXR5KTsKKwkJdmlydHVhbCB2b2lkIHNldFBpeGVsRm9nTW9kZShDb250ZXh0OjpGb2dNb2RlIGZvZ01vZGUpOworCisJCXZpcnR1YWwgdm9pZCBzZXRQZXJzcGVjdGl2ZUNvcnJlY3Rpb24oYm9vbCBwZXJzcGVjdGl2ZUNvcnJlY3Rpb24pOworCisJCXZpcnR1YWwgdm9pZCBzZXRPY2NsdXNpb25FbmFibGVkKGJvb2wgZW5hYmxlKTsKKworCXByb3RlY3RlZDoKKwkJY29uc3QgU3RhdGUgdXBkYXRlKCkgY29uc3Q7CisJCVJvdXRpbmUgKnJvdXRpbmUoY29uc3QgU3RhdGUgJnN0YXRlKTsKKwkJdm9pZCBzZXRSb3V0aW5lQ2FjaGVTaXplKGludCByb3V0aW5lQ2FjaGVTaXplKTsKKworCQkvLyBTaGFkZXIgY29uc3RhbnRzCisJCXdvcmQ0IGNXWzhdWzRdOworCQlmbG9hdDQgY1syMjRdOworCQlpbnQ0IGlbMTZdOworCQlib29sIGJbMTZdOworCisJCS8vIE90aGVyIHNlbWktY29uc3RhbnRzCisJCVN0ZW5jaWwgc3RlbmNpbDsKKwkJU3RlbmNpbCBzdGVuY2lsQ0NXOworCQlGb2cgZm9nOworCQlGYWN0b3IgZmFjdG9yOworCisJcHJpdmF0ZToKKwkJdm9pZCBzZXRGb2dSYW5nZXMoZmxvYXQgc3RhcnQsIGZsb2F0IGVuZCk7CisKKwkJQ29udGV4dCAqY29uc3QgY29udGV4dDsKKworCQlMUlVDYWNoZTxTdGF0ZSwgUm91dGluZT4gKnJvdXRpbmVDYWNoZTsKKwl9OworfQorCisjZW5kaWYgICAvLyBzd19QaXhlbFByb2Nlc3Nvcl9ocHAKZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9QbGFuZS5jcHAgYi9zcmMvUmVuZGVyZXIvUGxhbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMGZiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvUGxhbmUuY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJQbGFuZS5ocHAiCisKKyNpbmNsdWRlICJNYXRyaXguaHBwIgorI2luY2x1ZGUgIlBvaW50LmhwcCIKKyNpbmNsdWRlICJNYXRoLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJUGxhbmU6OlBsYW5lKCkKKwl7CisJfQorCisJUGxhbmU6OlBsYW5lKGNvbnN0IFBsYW5lICZwKQorCXsKKwkJbiA9IHAubjsKKwkJRCA9IHAuRDsKKwl9CisKKwlQbGFuZTo6UGxhbmUoY29uc3QgVmVjdG9yICZwX24sIGZsb2F0IHBfRCkKKwl7CisJCW4gPSBwX247CisJCUQgPSBwX0Q7CisJfQorCisJUGxhbmU6OlBsYW5lKGNvbnN0IFZlY3RvciAmcF9uLCBjb25zdCBQb2ludCAmUCkKKwl7CisJCW4gPSBwX247CisJCUQgPSAtKG4gKiBQKTsKKwl9CisKKwlQbGFuZTo6UGxhbmUoY29uc3QgUG9pbnQgJlAwLCBjb25zdCBQb2ludCAmUDEsIGNvbnN0IFBvaW50ICZQMikKKwl7CisJCW4gPSAoUDEgLSBQMCkgJSAoUDIgLSBQMCk7CisJCUQgPSAtKG4gKiBQMCk7CisJfQorCisJUGxhbmU6OlBsYW5lKGZsb2F0IHBfQSwgZmxvYXQgcF9CLCBmbG9hdCBwX0MsIGZsb2F0IHBfRCkKKwl7CisJCUEgPSBwX0E7CisJCUIgPSBwX0I7CisJCUMgPSBwX0M7CisJCUQgPSBwX0Q7CisJfQorCisJUGxhbmU6OlBsYW5lKGNvbnN0IGZsb2F0IEFCQ0RbNF0pCisJeworCQlBID0gQUJDRFswXTsKKwkJQiA9IEFCQ0RbMV07CisJCUMgPSBBQkNEWzJdOworCQlEID0gQUJDRFszXTsKKwl9CisKKwlQbGFuZSBQbGFuZTo6b3BlcmF0b3IrKCkgY29uc3QKKwl7CisJCXJldHVybiAqdGhpczsKKwl9CisKKwlQbGFuZSBQbGFuZTo6b3BlcmF0b3ItKCkgY29uc3QKKwl7CisJCXJldHVybiBQbGFuZSgtbiwgLUQpOworCX0KKworCVBsYW5lICZQbGFuZTo6b3BlcmF0b3I9KGNvbnN0IFBsYW5lICZwKQorCXsKKwkJbiA9IHAubjsKKwkJRCA9IHAuRDsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJUGxhbmUgJlBsYW5lOjpvcGVyYXRvcio9KGNvbnN0IE1hdHJpeCAmTSkKKwl7CisJCXJldHVybiAqdGhpcyA9ICp0aGlzICogTTsKKwl9CisKKwlQbGFuZSBvcGVyYXRvciooY29uc3QgUGxhbmUgJnAsIGNvbnN0IE1hdHJpeCAmVCkKKwl7CisJCU1hdHJpeCBNID0gIVQ7CisKKwkJcmV0dXJuIFBsYW5lKHAuQSAqIE0oMSwgMSkgKyBwLkIgKiBNKDEsIDIpICsgcC5DICogTSgxLCAzKSArIHAuRCAqIE0oMSwgNCksCisJCSAgICAgICAgICAgICBwLkEgKiBNKDIsIDEpICsgcC5CICogTSgyLCAyKSArIHAuQyAqIE0oMiwgMykgKyBwLkQgKiBNKDIsIDQpLAorCQkgICAgICAgICAgICAgcC5BICogTSgzLCAxKSArIHAuQiAqIE0oMywgMikgKyBwLkMgKiBNKDMsIDMpICsgcC5EICogTSgzLCA0KSwKKwkJICAgICAgICAgICAgIHAuQSAqIE0oNCwgMSkgKyBwLkIgKiBNKDQsIDIpICsgcC5DICogTSg0LCAzKSArIHAuRCAqIE0oNCwgNCkpOworCX0KKworCVBsYW5lIG9wZXJhdG9yKihjb25zdCBNYXRyaXggJlQsIGNvbnN0IFBsYW5lICZwKQorCXsKKwkJTWF0cml4IE0gPSAhVDsKKworCQlyZXR1cm4gUGxhbmUoTSgxLCAxKSAqIHAuQSArIE0oMiwgMSkgKiBwLkIgKyBNKDMsIDEpICogcC5DICsgTSg0LCAxKSAqIHAuRCwKKwkJICAgICAgICAgICAgIE0oMSwgMikgKiBwLkEgKyBNKDIsIDIpICogcC5CICsgTSgzLCAyKSAqIHAuQyArIE0oNCwgMikgKiBwLkQsCisJCSAgICAgICAgICAgICBNKDEsIDMpICogcC5BICsgTSgyLCAzKSAqIHAuQiArIE0oMywgMykgKiBwLkMgKyBNKDQsIDMpICogcC5ELAorCQkgICAgICAgICAgICAgTSgxLCA0KSAqIHAuQSArIE0oMiwgNCkgKiBwLkIgKyBNKDMsIDQpICogcC5DICsgTSg0LCA0KSAqIHAuRCk7CisJfQorCisJZmxvYXQgb3BlcmF0b3JeKGNvbnN0IFBsYW5lICZwMSwgY29uc3QgUGxhbmUgJnAyKQorCXsKKwkJcmV0dXJuIGFjb3MocDEubiAqIHAyLm4gLyAoVmVjdG9yOjpOKHAxLm4pICogVmVjdG9yOjpOKHAyLm4pKSk7CisJfQorCisJZmxvYXQgUGxhbmU6OmQoY29uc3QgUG9pbnQgJlApIGNvbnN0CisJeworCQlyZXR1cm4gUCAqIG4gKyBEOworCX0KKworCWZsb2F0IFBsYW5lOjpkKGNvbnN0IFBvaW50ICZQLCBjb25zdCBQbGFuZSAmcCkKKwl7CisJCXJldHVybiBQICogcC5uICsgcC5EOworCX0KKworCWZsb2F0IFBsYW5lOjpkKGNvbnN0IFBsYW5lICZwLCBjb25zdCBQb2ludCAmUCkKKwl7CisJCXJldHVybiBwLm4gKiBQICsgcC5EOworCX0KKworCVBsYW5lICZQbGFuZTo6bm9ybWFsaXNlKCkKKwl7CisJCWZsb2F0IGwgPSBWZWN0b3I6Ok4obik7CisKKwkJbiAvPSBsOworCQlEIC89IGw7CisKKwkJcmV0dXJuICp0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9QbGFuZS5ocHAgYi9zcmMvUmVuZGVyZXIvUGxhbmUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Zjc2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvUGxhbmUuaHBwCkBAIC0wLDAgKzEsNjkgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBQbGFuZV9ocHAKKyNkZWZpbmUgUGxhbmVfaHBwCisKKyNpbmNsdWRlICJWZWN0b3IuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwlzdHJ1Y3QgTWF0cml4OworCXN0cnVjdCBQb2ludDsKKworCXN0cnVjdCBQbGFuZQorCXsKKwkJdW5pb24KKwkJeworCQkJc3RydWN0CisJCQl7CisJCQkJZmxvYXQgQTsKKwkJCQlmbG9hdCBCOworCQkJCWZsb2F0IEM7CisJCQl9OworCQkJc3RydWN0CisJCQl7CisJCQkJVmVjdG9yIG47CisJCQl9OworCQl9OworCisJCWZsb2F0IEQ7ICAgLy8gRGlzdGFuY2UgdG8gb3JpZ2luIGFsb25nIG5vcm1hbAorCisJCVBsYW5lKCk7CisJCVBsYW5lKGNvbnN0IFBsYW5lICZwKTsKKwkJUGxhbmUoY29uc3QgVmVjdG9yICZuLCBmbG9hdCBEKTsgICAvLyBOb3JtYWwgYW5kIGRpc3RhbmNlIHRvIG9yaWdpbgorCQlQbGFuZShjb25zdCBWZWN0b3IgJm4sIGNvbnN0IFBvaW50ICZQKTsgICAvLyBOb3JtYWwgYW5kIHBvaW50IG9uIHBsYW5lCisJCVBsYW5lKGNvbnN0IFBvaW50ICZQMCwgY29uc3QgUG9pbnQgJlAxLCBjb25zdCBQb2ludCAmUDIpOyAgIC8vIFRocm91Z2ggdGhyZWUgcG9pbnRzCisJCVBsYW5lKGZsb2F0IEEsIGZsb2F0IEIsIGZsb2F0IEMsIGZsb2F0IEQpOyAgIC8vIFBsYW5lIGVxdWF0aW9uIAorCQlQbGFuZShjb25zdCBmbG9hdCBBQkNEWzRdKTsKKworCQlQbGFuZSAmb3BlcmF0b3I9KGNvbnN0IFBsYW5lICZwKTsKKworCQlQbGFuZSBvcGVyYXRvcisoKSBjb25zdDsKKwkJUGxhbmUgb3BlcmF0b3ItKCkgY29uc3Q7ICAgLy8gRmxpcCBub3JtYWwKKworCQlQbGFuZSAmb3BlcmF0b3IqPShjb25zdCBNYXRyaXggJkEpOyAgIC8vIFRyYW5zZm9ybSBwbGFuZSBieSBtYXRyaXggKHBvc3QtbXVsdGlwbHkpCisKKwkJZnJpZW5kIFBsYW5lIG9wZXJhdG9yKihjb25zdCBQbGFuZSAmcCwgY29uc3QgTWF0cml4ICZBKTsgICAvLyBUcmFuc2Zvcm0gcGxhbmUgYnkgbWF0cml4IChwb3N0LW11bHRpcGx5KQorCQlmcmllbmQgUGxhbmUgb3BlcmF0b3IqKGNvbnN0IE1hdHJpeCAmQSwgY29uc3QgUGxhbmUgJnApOyAgIC8vIFRyYW5zZm9ybSBwbGFuZSBieSBtYXRyaXggKHByZS1tdWx0aXBseSkKKworCQlmcmllbmQgZmxvYXQgb3BlcmF0b3JeKGNvbnN0IFBsYW5lICZwMSwgY29uc3QgUGxhbmUgJnAyKTsgICAvLyBBbmdsZSBiZXR3ZWVuIHBsYW5lcworCisJCWZsb2F0IGQoY29uc3QgUG9pbnQgJlApIGNvbnN0OyAgIC8vIE9yaWVudGVkIGRpc3RhbmNlIGJldHdlZW4gcG9pbnQgYW5kIHBsYW5lCisKKwkJc3RhdGljIGZsb2F0IGQoY29uc3QgUG9pbnQgJlAsIGNvbnN0IFBsYW5lICZwKTsgICAvLyBPcmllbnRlZCBkaXN0YW5jZSBiZXR3ZWVuIHBvaW50IGFuZCBwbGFuZQorCQlzdGF0aWMgZmxvYXQgZChjb25zdCBQbGFuZSAmcCwgY29uc3QgUG9pbnQgJlApOyAgIC8vIE9yaWVudGVkIGRpc3RhbmNlIGJldHdlZW4gcGxhbmUgYW5kIHBvaW50CisKKwkJUGxhbmUgJm5vcm1hbGlzZSgpOyAgIC8vIE5vcm1hbGlzZSB0aGUgUGxhbmUgZXF1YXRpb24KKwl9OworfQorCisjZW5kaWYgICAvLyBQbGFuZV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9Qb2ludC5jcHAgYi9zcmMvUmVuZGVyZXIvUG9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzU1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvUG9pbnQuY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIlBvaW50LmhwcCIKKworI2luY2x1ZGUgIk1hdHJpeC5ocHAiCisKK25hbWVzcGFjZSBzdworeworCVBvaW50ICZQb2ludDo6b3BlcmF0b3IrPShjb25zdCBWZWN0b3IgJnYpCisJeworCQl4ICs9IHYueDsKKwkJeSArPSB2Lnk7CisJCXogKz0gdi56OworCisJCXJldHVybiAqdGhpczsKKwl9CisKKwlQb2ludCAmUG9pbnQ6Om9wZXJhdG9yLT0oY29uc3QgVmVjdG9yICZ2KQorCXsKKwkJeCAtPSB2Lng7CisJCXkgLT0gdi55OworCQl6IC09IHYuejsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJUG9pbnQgb3BlcmF0b3IrKGNvbnN0IFBvaW50ICZQLCBjb25zdCBWZWN0b3IgJnYpCisJeworCQlyZXR1cm4gUG9pbnQoUC54ICsgdi54LCBQLnkgKyB2LnksIFAueiArIHYueik7CisJfQorCisJUG9pbnQgb3BlcmF0b3ItKGNvbnN0IFBvaW50ICZQLCBjb25zdCBWZWN0b3IgJnYpCisJeworCQlyZXR1cm4gUG9pbnQoUC54IC0gdi54LCBQLnkgLSB2LnksIFAueiAtIHYueik7CisJfQorCisJVmVjdG9yIG9wZXJhdG9yLShjb25zdCBQb2ludCAmUCwgY29uc3QgUG9pbnQgJlEpCisJeworCQlyZXR1cm4gVmVjdG9yKFAueCAtIFEueCwgUC55IC0gUS55LCBQLnogLSBRLnopOworCX0KKworCVBvaW50IG9wZXJhdG9yKihjb25zdCBNYXRyaXggJk0sIGNvbnN0IFBvaW50ICZQKQorCXsKKwkJcmV0dXJuIFBvaW50KE0oMSwgMSkgKiBQLnggKyBNKDEsIDIpICogUC55ICsgTSgxLCAzKSAqIFAueiArIE0oMSwgNCksCisJCSAgICAgICAgICAgICBNKDIsIDEpICogUC54ICsgTSgyLCAyKSAqIFAueSArIE0oMiwgMykgKiBQLnogKyBNKDIsIDQpLAorCQkgICAgICAgICAgICAgTSgzLCAxKSAqIFAueCArIE0oMywgMikgKiBQLnkgKyBNKDMsIDMpICogUC56ICsgTSgzLCA0KSk7CisJfQorCisJUG9pbnQgb3BlcmF0b3IqKGNvbnN0IFBvaW50ICZQLCBjb25zdCBNYXRyaXggJk0pCisJeworCQlyZXR1cm4gUG9pbnQoUC54ICogTSgxLCAxKSArIFAueSAqIE0oMiwgMSkgKyBQLnogKiBNKDMsIDEpLAorCQkgICAgICAgICAgICAgUC54ICogTSgxLCAyKSArIFAueSAqIE0oMiwgMikgKyBQLnogKiBNKDMsIDIpLAorCQkgICAgICAgICAgICAgUC54ICogTSgxLCAzKSArIFAueSAqIE0oMiwgMykgKyBQLnogKiBNKDMsIDMpKTsKKwl9CisKKwlQb2ludCAmb3BlcmF0b3IqPShQb2ludCAmUCwgY29uc3QgTWF0cml4ICZNKQorCXsKKwkJcmV0dXJuIFAgPSBQICogTTsKKwl9CisKKwlmbG9hdCBQb2ludDo6ZChjb25zdCBQb2ludCAmUCkgY29uc3QKKwl7CisJCXJldHVybiBWZWN0b3I6Ok4oKnRoaXMgLSBQKTsKKwl9CisKKwlmbG9hdCBQb2ludDo6ZDIoY29uc3QgUG9pbnQgJlApIGNvbnN0CisJeworCQlyZXR1cm4gVmVjdG9yOjpOMigqdGhpcyAtIFApOworCX0KKworCWZsb2F0IFBvaW50OjpkKGNvbnN0IFBvaW50ICZQLCBjb25zdCBQb2ludCAmUSkKKwl7CisJCXJldHVybiBWZWN0b3I6Ok4oUCAtIFEpOworCX0KKworCWZsb2F0IFBvaW50OjpkMihjb25zdCBQb2ludCAmUCwgY29uc3QgUG9pbnQgJlEpCisJeworCQlyZXR1cm4gVmVjdG9yOjpOMihQIC0gUSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1BvaW50LmhwcCBiL3NyYy9SZW5kZXJlci9Qb2ludC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1MGY1OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9Qb2ludC5ocHAKQEAgLTAsMCArMSwxMzYgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBQb2ludF9ocHAKKyNkZWZpbmUgUG9pbnRfaHBwCisKK25hbWVzcGFjZSBzdworeworCXN0cnVjdCBWZWN0b3I7CisJc3RydWN0IE1hdHJpeDsKKworCXN0cnVjdCBQb2ludAorCXsKKwkJUG9pbnQoKTsKKwkJUG9pbnQoY29uc3QgaW50IGkpOworCQlQb2ludChjb25zdCBQb2ludCAmUCk7CisJCVBvaW50KGNvbnN0IFZlY3RvciAmdik7CisJCVBvaW50KGZsb2F0IFB4LCBmbG9hdCBQeSwgZmxvYXQgUHopOworCisJCVBvaW50ICZvcGVyYXRvcj0oY29uc3QgUG9pbnQgJlApOworCisJCXVuaW9uCisJCXsKKwkJCWZsb2F0IHBbM107CisKKwkJCXN0cnVjdAorCQkJewkJCisJCQkJZmxvYXQgeDsKKwkJCQlmbG9hdCB5OworCQkJCWZsb2F0IHo7CisJCQl9OworCQl9OworCisJCWZsb2F0ICZvcGVyYXRvcltdKGludCBpKTsKKwkJZmxvYXQgJm9wZXJhdG9yKCkoaW50IGkpOworCisJCWNvbnN0IGZsb2F0ICZvcGVyYXRvcltdKGludCBpKSBjb25zdDsKKwkJY29uc3QgZmxvYXQgJm9wZXJhdG9yKCkoaW50IGkpIGNvbnN0OworCisJCVBvaW50ICZvcGVyYXRvcis9KGNvbnN0IFZlY3RvciAmdik7CisJCVBvaW50ICZvcGVyYXRvci09KGNvbnN0IFZlY3RvciAmdik7CisKKwkJZnJpZW5kIFBvaW50IG9wZXJhdG9yKyhjb25zdCBQb2ludCAmUCwgY29uc3QgVmVjdG9yICZ2KTsKKwkJZnJpZW5kIFBvaW50IG9wZXJhdG9yLShjb25zdCBQb2ludCAmUCwgY29uc3QgVmVjdG9yICZ2KTsKKworCQlmcmllbmQgVmVjdG9yIG9wZXJhdG9yLShjb25zdCBQb2ludCAmUCwgY29uc3QgUG9pbnQgJlEpOworCisJCWZyaWVuZCBQb2ludCBvcGVyYXRvciooY29uc3QgTWF0cml4ICZNLCBjb25zdCBQb2ludCYgUCk7CisJCWZyaWVuZCBQb2ludCBvcGVyYXRvciooY29uc3QgUG9pbnQgJlAsIGNvbnN0IE1hdHJpeCAmTSk7CisJCWZyaWVuZCBQb2ludCAmb3BlcmF0b3IqPShQb2ludCAmUCwgY29uc3QgTWF0cml4ICZNKTsKKworCQlmbG9hdCBkKGNvbnN0IFBvaW50ICZQKSBjb25zdDsgICAvLyBEaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMKKwkJZmxvYXQgZDIoY29uc3QgUG9pbnQgJlApIGNvbnN0OyAgIC8vIFNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzCisKKwkJc3RhdGljIGZsb2F0IGQoY29uc3QgUG9pbnQgJlAsIGNvbnN0IFBvaW50ICZRKTsgICAvLyBEaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMKKwkJc3RhdGljIGZsb2F0IGQyKGNvbnN0IFBvaW50ICZQLCBjb25zdCBQb2ludCAmUSk7ICAgLy8gU3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMKKwl9OworfQorCisjaW5jbHVkZSAiVmVjdG9yLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJaW5saW5lIFBvaW50OjpQb2ludCgpCisJeworCX0KKworCWlubGluZSBQb2ludDo6UG9pbnQoY29uc3QgaW50IGkpCisJeworCQljb25zdCBmbG9hdCBzID0gKGZsb2F0KWk7CisKKwkJeCA9IHM7CisJCXkgPSBzOworCQl6ID0gczsKKwl9CisKKwlpbmxpbmUgUG9pbnQ6OlBvaW50KGNvbnN0IFBvaW50ICZQKQorCXsKKwkJeCA9IFAueDsKKwkJeSA9IFAueTsKKwkJeiA9IFAuejsKKwl9CisKKwlpbmxpbmUgUG9pbnQ6OlBvaW50KGNvbnN0IFZlY3RvciAmdikKKwl7CisJCXggPSB2Lng7CisJCXkgPSB2Lnk7CisJCXogPSB2Lno7CisJfQorCisJaW5saW5lIFBvaW50OjpQb2ludChmbG9hdCBQX3gsIGZsb2F0IFBfeSwgZmxvYXQgUF96KQorCXsKKwkJeCA9IFBfeDsKKwkJeSA9IFBfeTsKKwkJeiA9IFBfejsKKwl9CisKKwlpbmxpbmUgUG9pbnQgJlBvaW50OjpvcGVyYXRvcj0oY29uc3QgUG9pbnQgJlApCisJeworCQl4ID0gUC54OworCQl5ID0gUC55OworCQl6ID0gUC56OworCisJCXJldHVybiAqdGhpczsKKwl9CisKKwlpbmxpbmUgZmxvYXQgJlBvaW50OjpvcGVyYXRvcigpKGludCBpKQorCXsKKwkJcmV0dXJuIHBbaV07CisJfQorCisJaW5saW5lIGZsb2F0ICZQb2ludDo6b3BlcmF0b3JbXShpbnQgaSkKKwl7CisJCXJldHVybiBwW2ldOworCX0KKworCWlubGluZSBjb25zdCBmbG9hdCAmUG9pbnQ6Om9wZXJhdG9yKCkoaW50IGkpIGNvbnN0CisJeworCQlyZXR1cm4gcFtpXTsKKwl9CisKKwlpbmxpbmUgY29uc3QgZmxvYXQgJlBvaW50OjpvcGVyYXRvcltdKGludCBpKSBjb25zdAorCXsKKwkJcmV0dXJuIHBbaV07CisJfQorfQorCisjZW5kaWYgICAvLyBQb2ludF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9Qb2x5Z29uLmhwcCBiL3NyYy9SZW5kZXJlci9Qb2x5Z29uLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQxNjI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlbmRlcmVyL1BvbHlnb24uaHBwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIHN3X1BvbHlnb25faHBwDQorI2RlZmluZSBzd19Qb2x5Z29uX2hwcA0KKw0KKyNpbmNsdWRlICJWZXJ0ZXguaHBwIg0KKw0KK25hbWVzcGFjZSBzdw0KK3sNCisJc3RydWN0IFBvbHlnb24NCisJew0KKwkJUG9seWdvbihjb25zdCBmbG9hdDQgKlAwLCBjb25zdCBmbG9hdDQgKlAxLCBjb25zdCBmbG9hdDQgKlAyKQ0KKwkJew0KKwkJCVBbMF1bMF0gPSBQMDsNCisJCQlQWzBdWzFdID0gUDE7DQorCQkJUFswXVsyXSA9IFAyOw0KKw0KKwkJCW4gPSAzOw0KKwkJCWkgPSAwOw0KKwkJfQ0KKw0KKwkJUG9seWdvbihjb25zdCBmbG9hdDQgKlAsIGludCBuKQ0KKwkJew0KKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspDQorCQkJew0KKwkJCQl0aGlzLT5QWzBdW2ldID0gJlBbaV07DQorCQkJfQ0KKw0KKwkJCXRoaXMtPm4gPSBuOw0KKwkJCXRoaXMtPmkgPSAwOw0KKwkJfQ0KKw0KKwkJZmxvYXQ0IEJbMTZdOyAgICAgICAgICAgICAgLy8gQnVmZmVyIGZvciBjbGlwcGVkIHZlcnRpY2VzDQorCQljb25zdCBmbG9hdDQgKlBbMTZdWzE2XTsgICAvLyBQb2ludGVycyB0byBjbGlwcGVkIHBvbHlnb24ncyB2ZXJ0aWNlcw0KKw0KKwkJaW50IGk7DQorCQlpbnQgYjsNCisJCWludCBuOw0KKwl9Ow0KK30NCisNCisjZW5kaWYgICAvLyBzd19Qb2x5Z29uX2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9QcmltaXRpdmUuaHBwIGIvc3JjL1JlbmRlcmVyL1ByaW1pdGl2ZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2MjFhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9QcmltaXRpdmUuaHBwCkBAIC0wLDAgKzEsNzUgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIHN3X1ByaW1pdGl2ZV9ocHANCisjZGVmaW5lIHN3X1ByaW1pdGl2ZV9ocHANCisNCisjaW5jbHVkZSAiVmVydGV4LmhwcCINCisjaW5jbHVkZSAiQ29uZmlnLmhwcCINCisNCituYW1lc3BhY2Ugc3cNCit7DQorCXN0cnVjdCBUcmlhbmdsZQ0KKwl7DQorCQlWZXJ0ZXggdjA7DQorCQlWZXJ0ZXggdjE7DQorCQlWZXJ0ZXggdjI7DQorCX07DQorDQorCXN0cnVjdCBQbGFuZUVxdWF0aW9uICAgLy8geiA9IEEgKiB4ICsgQiAqIHkgKyBDDQorCXsNCisJCWZsb2F0NCBBOw0KKwkJZmxvYXQ0IEI7DQorCQlmbG9hdDQgQzsNCisJfTsNCisNCisJc3RydWN0IFByaW1pdGl2ZQ0KKwl7DQorCQlpbnQgeU1pbjsNCisJCWludCB5TWF4Ow0KKw0KKwkJZmxvYXQ0IHhRdWFkOw0KKwkJZmxvYXQ0IHlRdWFkOw0KKw0KKwkJUGxhbmVFcXVhdGlvbiB6Ow0KKwkJUGxhbmVFcXVhdGlvbiB3Ow0KKw0KKwkJdW5pb24NCisJCXsNCisJCQlzdHJ1Y3QNCisJCQl7DQorCQkJCVBsYW5lRXF1YXRpb24gQ1syXVs0XTsNCisJCQkJUGxhbmVFcXVhdGlvbiBUWzhdWzRdOw0KKwkJCQlQbGFuZUVxdWF0aW9uIGY7DQorCQkJfTsNCisNCisJCQlQbGFuZUVxdWF0aW9uIFZbMTBdWzRdOw0KKwkJfTsNCisNCisJCWZsb2F0IGFyZWE7DQorDQorCQkvLyBNYXNrcyBmb3IgdHdvLXNpZGVkIHN0ZW5jaWwNCisJCWludDY0X3QgY2xvY2t3aXNlTWFzazsNCisJCWludDY0X3QgaW52Q2xvY2t3aXNlTWFzazsNCisNCisJCXN0cnVjdCBTcGFuDQorCQl7DQorCQkJdW5zaWduZWQgc2hvcnQgbGVmdDsNCisJCQl1bnNpZ25lZCBzaG9ydCByaWdodDsNCisJCX07DQorDQorCQlTcGFuIG91dGxpbmVVbmRlcmZsb3c7DQorCQlTcGFuIG91dGxpbmVbT1VUTElORV9SRVNPTFVUSU9OXTsNCisJCVNwYW4gb3V0bGluZU92ZXJmbG93Ow0KKwl9Ow0KK30NCisNCisjZW5kaWYgICAvLyBzd19QcmltaXRpdmVfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1F1YWRSYXN0ZXJpemVyLmNwcCBiL3NyYy9SZW5kZXJlci9RdWFkUmFzdGVyaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmY2YxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9RdWFkUmFzdGVyaXplci5jcHAKQEAgLTAsMCArMSwzMjAgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIlF1YWRSYXN0ZXJpemVyLmhwcCIKKworI2luY2x1ZGUgIk1hdGguaHBwIgorI2luY2x1ZGUgIlByaW1pdGl2ZS5ocHAiCisjaW5jbHVkZSAiUmVuZGVyZXIuaHBwIgorI2luY2x1ZGUgIkNvbnN0YW50cy5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwlleHRlcm4gYm9vbCB2ZXJ5RWFybHlEZXB0aFRlc3Q7CisJZXh0ZXJuIGJvb2wgY29tcGxlbWVudGFyeURlcHRoQnVmZmVyOworCisJZXh0ZXJuIGludCBjbHVzdGVyQ291bnQ7CisKKwlRdWFkUmFzdGVyaXplcjo6UXVhZFJhc3Rlcml6ZXIoY29uc3QgUGl4ZWxQcm9jZXNzb3I6OlN0YXRlICZzdGF0ZSwgY29uc3QgUGl4ZWxTaGFkZXIgKnBpeGVsU2hhZGVyKSA6IFBpeGVsUm91dGluZShzdGF0ZSwgcGl4ZWxTaGFkZXIpCisJeworCX0KKworCVF1YWRSYXN0ZXJpemVyOjp+UXVhZFJhc3Rlcml6ZXIoKQorCXsKKwl9CisKKwl2b2lkIFF1YWRSYXN0ZXJpemVyOjpnZW5lcmF0ZSgpCisJeworCQlGdW5jdGlvbjxWb2lkLCBQb2ludGVyPEJ5dGU+LCBJbnQsIEludCwgUG9pbnRlcjxCeXRlPj4gZnVuY3Rpb247CisJCXsKKwkJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCQlMb25nIHBpeGVsVGltZSA9IFRpY2tzKCk7CisJCQkjZW5kaWYKKworCQkJUG9pbnRlcjxCeXRlPiBwcmltaXRpdmUoZnVuY3Rpb24uYXJnKDApKTsKKwkJCUludCBjb3VudChmdW5jdGlvbi5hcmcoMSkpOworCQkJSW50IGNsdXN0ZXIoZnVuY3Rpb24uYXJnKDIpKTsKKwkJCVBvaW50ZXI8Qnl0ZT4gZGF0YShmdW5jdGlvbi5hcmcoMykpOworCisJCQlSZWdpc3RlcnMgcjsKKwkJCXIuY29uc3RhbnRzID0gKlBvaW50ZXI8UG9pbnRlcjxCeXRlPj4oZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb25zdGFudHMpKTsKKwkJCXIuY2x1c3RlciA9IGNsdXN0ZXI7CisJCQlyLmRhdGEgPSBkYXRhOworCQkJCisJCQlEbworCQkJeworCQkJCXIucHJpbWl0aXZlID0gcHJpbWl0aXZlOworCisJCQkJSW50IHlNaW4gPSAqUG9pbnRlcjxJbnQ+KHByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUseU1pbikpOworCQkJCUludCB5TWF4ID0gKlBvaW50ZXI8SW50PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHlNYXgpKTsKKworCQkJCUludCBjbHVzdGVyMiA9IHIuY2x1c3RlciArIHIuY2x1c3RlcjsKKwkJCQl5TWluICs9IGNsdXN0ZXJDb3VudCAqIDIgLSAyIC0gY2x1c3RlcjI7CisJCQkJeU1pbiAmPSAtY2x1c3RlckNvdW50ICogMjsKKwkJCQl5TWluICs9IGNsdXN0ZXIyOworCisJCQkJSWYoeU1pbiA8IHlNYXgpCisJCQkJeworCQkJCQlyYXN0ZXJpemUociwgeU1pbiwgeU1heCk7CisJCQkJfQorCisJCQkJcHJpbWl0aXZlICs9IHNpemVvZihQcmltaXRpdmUpICogc3RhdGUubXVsdGlTYW1wbGU7CisJCQkJY291bnQtLTsKKwkJCX0KKwkJCVVudGlsKGNvdW50ID09IDApCisKKwkJCWlmKHN0YXRlLm9jY2x1c2lvbkVuYWJsZWQpCisJCQl7CisJCQkJVUludCBjbHVzdGVyT2NjbHVzaW9uID0gKlBvaW50ZXI8VUludD4oZGF0YSArIE9GRlNFVChEcmF3RGF0YSxvY2NsdXNpb24pICsgNCAqIGNsdXN0ZXIpOworCQkJCWNsdXN0ZXJPY2NsdXNpb24gKz0gci5vY2NsdXNpb247CisJCQkJKlBvaW50ZXI8VUludD4oZGF0YSArIE9GRlNFVChEcmF3RGF0YSxvY2NsdXNpb24pICsgNCAqIGNsdXN0ZXIpID0gY2x1c3Rlck9jY2x1c2lvbjsKKwkJCX0KKworCQkJI2lmIFBFUkZfUFJPRklMRQorCQkJCXIuY3ljbGVzW1BFUkZfUElYRUxdID0gVGlja3MoKSAtIHBpeGVsVGltZTsKKworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBQRVJGX1RJTUVSUzsgaSsrKQorCQkJCXsKKwkJCQkJKlBvaW50ZXI8TG9uZz4oZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjeWNsZXNbaV0pICsgOCAqIGNsdXN0ZXIpICs9IHIuY3ljbGVzW2ldOworCQkJCX0KKwkJCSNlbmRpZgorCisJCQlSZXR1cm4oKTsKKwkJfQorCisJCXJvdXRpbmUgPSBmdW5jdGlvbihMIlBpeGVsUm91dGluZV8lMC4xNmxsWCIsIHN0YXRlLnNoYWRlckhhc2gpOworCX0KKworCXZvaWQgUXVhZFJhc3Rlcml6ZXI6OnJhc3Rlcml6ZShSZWdpc3RlcnMgJnIsIEludCAmeU1pbiwgSW50ICZ5TWF4KQorCXsKKwkJUG9pbnRlcjxCeXRlPiBjQnVmZmVyWzRdOworCQlQb2ludGVyPEJ5dGU+IHpCdWZmZXI7CisJCVBvaW50ZXI8Qnl0ZT4gc0J1ZmZlcjsKKworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKQorCQl7CisJCQlpZihzdGF0ZS5jb2xvcldyaXRlQWN0aXZlKGluZGV4KSkKKwkJCXsKKwkJCQljQnVmZmVyW2luZGV4XSA9ICpQb2ludGVyPFBvaW50ZXI8Qnl0ZT4+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvckJ1ZmZlcltpbmRleF0pKSArIHlNaW4gKiAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclBpdGNoQltpbmRleF0pKTsKKwkJCX0KKwkJfQorCisJCWlmKHN0YXRlLmRlcHRoVGVzdEFjdGl2ZSkKKwkJeworCQkJekJ1ZmZlciA9ICpQb2ludGVyPFBvaW50ZXI8Qnl0ZT4+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxkZXB0aEJ1ZmZlcikpICsgeU1pbiAqICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGRlcHRoUGl0Y2hCKSk7CisJCX0KKworCQlpZihzdGF0ZS5zdGVuY2lsQWN0aXZlKQorCQl7CisJCQlzQnVmZmVyID0gKlBvaW50ZXI8UG9pbnRlcjxCeXRlPj4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHN0ZW5jaWxCdWZmZXIpKSArIHlNaW4gKiAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxzdGVuY2lsUGl0Y2hCKSk7CisJCX0KKworCQlJbnQgeSA9IHlNaW47CisJCQorCQlEbworCQl7CisJCQlJbnQgeDA7CisJCQlJbnQgeDE7CisJCQlJbnQgeDI7CisKKwkJCXgwID0gSW50KCpQb2ludGVyPFNob3J0PihyLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsb3V0bGluZS0+bGVmdCkgKyAoeSArIDApICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpKTsKKwkJCXgyID0gSW50KCpQb2ludGVyPFNob3J0PihyLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsb3V0bGluZS0+bGVmdCkgKyAoeSArIDEpICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpKTsKKwkJCXgwID0gSWZUaGVuRWxzZSh4MCA8IHgyLCB4MCwgeDIpOworCQkJCisJCQlmb3IodW5zaWduZWQgaW50IHEgPSAxOyBxIDwgc3RhdGUubXVsdGlTYW1wbGU7IHErKykKKwkJCXsKKwkJCQlJbnQgeDBxID0gSW50KCpQb2ludGVyPFNob3J0PihyLnByaW1pdGl2ZSArIHEgKiBzaXplb2YoUHJpbWl0aXZlKSArIE9GRlNFVChQcmltaXRpdmUsb3V0bGluZS0+bGVmdCkgKyAoeSArIDApICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpKTsKKwkJCQlJbnQgeDJxID0gSW50KCpQb2ludGVyPFNob3J0PihyLnByaW1pdGl2ZSArIHEgKiBzaXplb2YoUHJpbWl0aXZlKSArIE9GRlNFVChQcmltaXRpdmUsb3V0bGluZS0+bGVmdCkgKyAoeSArIDEpICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpKTsKKwkJCQl4MHEgPSBJZlRoZW5FbHNlKHgwcSA8IHgycSwgeDBxLCB4MnEpOworCisJCQkJeDAgPSBJZlRoZW5FbHNlKHgwcSA8IHgwLCB4MHEsIHgwKTsKKwkJCX0KKwkJCQorCQkJeDAgJj0gMHhGRkZGRkZGRTsKKworCQkJeDEgPSBJbnQoKlBvaW50ZXI8U2hvcnQ+KHIucHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSxvdXRsaW5lLT5yaWdodCkgKyAoeSArIDApICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpKTsKKwkJCXgyID0gSW50KCpQb2ludGVyPFNob3J0PihyLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsb3V0bGluZS0+cmlnaHQpICsgKHkgKyAxKSAqIHNpemVvZihQcmltaXRpdmU6OlNwYW4pKSk7CisJCQl4MSA9IElmVGhlbkVsc2UoeDEgPiB4MiwgeDEsIHgyKTsKKworCQkJZm9yKHVuc2lnbmVkIGludCBxID0gMTsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCQl7CisJCQkJSW50IHgxcSA9IEludCgqUG9pbnRlcjxTaG9ydD4oci5wcmltaXRpdmUgKyBxICogc2l6ZW9mKFByaW1pdGl2ZSkgKyBPRkZTRVQoUHJpbWl0aXZlLG91dGxpbmUtPnJpZ2h0KSArICh5ICsgMCkgKiBzaXplb2YoUHJpbWl0aXZlOjpTcGFuKSkpOworCQkJCUludCB4MnEgPSBJbnQoKlBvaW50ZXI8U2hvcnQ+KHIucHJpbWl0aXZlICsgcSAqIHNpemVvZihQcmltaXRpdmUpICsgT0ZGU0VUKFByaW1pdGl2ZSxvdXRsaW5lLT5yaWdodCkgKyAoeSArIDEpICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpKTsKKwkJCQl4MXEgPSBJZlRoZW5FbHNlKHgxcSA+IHgycSwgeDFxLCB4MnEpOworCisJCQkJeDEgPSBJZlRoZW5FbHNlKHgxcSA+IHgxLCB4MXEsIHgxKTsKKwkJCX0KKworCQkJRmxvYXQ0IHl5eXkgPSBGbG9hdDQoRmxvYXQoeSkpICsgKlBvaW50ZXI8RmxvYXQ0PihyLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUseVF1YWQpLCAxNik7CisKKwkJCWlmKHN0YXRlLmRlcHRoVGVzdEFjdGl2ZSB8fCBzdGF0ZS5waXhlbEZvZ0FjdGl2ZSgpKQorCQkJeworCQkJCWZvcih1bnNpZ25lZCBpbnQgcSA9IDA7IHEgPCBzdGF0ZS5tdWx0aVNhbXBsZTsgcSsrKQorCQkJCXsKKwkJCQkJRmxvYXQ0IHkgPSB5eXl5OworCisJCQkJCWlmKHN0YXRlLm11bHRpU2FtcGxlID4gMSkKKwkJCQkJeworCQkJCQkJeSAtPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxZKSArIHEgKiBzaXplb2YoZmxvYXQ0KSk7CisJCQkJCX0KKworCQkJCQlyLkR6W3FdID0gKlBvaW50ZXI8RmxvYXQ0PihyLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsei5DKSwgMTYpICsgeSAqICpQb2ludGVyPEZsb2F0ND4oci5wcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHouQiksIDE2KTsKKwkJCQl9CisJCQl9CisKKwkJCWlmKHZlcnlFYXJseURlcHRoVGVzdCAmJiBzdGF0ZS5tdWx0aVNhbXBsZSA9PSAxKQorCQkJeworCQkJCWlmKCFzdGF0ZS5zdGVuY2lsQWN0aXZlICYmIHN0YXRlLmRlcHRoVGVzdEFjdGl2ZSAmJiAoc3RhdGUuZGVwdGhDb21wYXJlTW9kZSA9PSBDb250ZXh0OjpERVBUSF9MRVNTRVFVQUwgfHwgc3RhdGUuZGVwdGhDb21wYXJlTW9kZSA9PSBDb250ZXh0OjpERVBUSF9MRVNTKSkgICAvLyBGSVhNRTogQm90aCBtb2RlcyBvaz8KKwkJCQl7CisJCQkJCUZsb2F0NCB4eHh4ID0gRmxvYXQ0KEZsb2F0KHgwKSkgKyAqUG9pbnRlcjxGbG9hdDQ+KHIucHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSx4UXVhZCksIDE2KTsKKworCQkJCQlQb2ludGVyPEJ5dGU+IGJ1ZmZlcjsKKwkJCQkJSW50IHBpdGNoOworCisJCQkJCWlmKCFzdGF0ZS5xdWFkTGF5b3V0RGVwdGhCdWZmZXIpCisJCQkJCXsKKwkJCQkJCWJ1ZmZlciA9IHpCdWZmZXIgKyA0ICogeDA7CisJCQkJCQlwaXRjaCA9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGRlcHRoUGl0Y2hCKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CQorCQkJCQkJYnVmZmVyID0gekJ1ZmZlciArIDggKiB4MDsKKwkJCQkJfQorCisJCQkJCUZvcihJbnQgeCA9IHgwLCB4IDwgeDEsIHggKz0gMikKKwkJCQkJeworCQkJCQkJRmxvYXQ0IHogPSBpbnRlcnBvbGF0ZSh4eHh4LCByLkR6WzBdLCB6LCByLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUseiksIGZhbHNlLCBmYWxzZSk7CisKKwkJCQkJCUZsb2F0NCB6VmFsdWU7CisJCQkJCQkKKwkJCQkJCWlmKCFzdGF0ZS5xdWFkTGF5b3V0RGVwdGhCdWZmZXIpCisJCQkJCQl7CisJCQkJCQkJLy8gRklYTUU6IFByb3Blcmx5IG9wdGltaXplcz8KKwkJCQkJCQl6VmFsdWUueHkgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlcik7CisJCQkJCQkJelZhbHVlLnp3ID0gKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIgKyBwaXRjaCAtIDgpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXpWYWx1ZSA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyLCAxNik7CisJCQkJCQl9CisKKwkJCQkJCUludDQgelRlc3Q7CisKKwkJCQkJCWlmKGNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlcikKKwkJCQkJCXsKKwkJCQkJCQl6VGVzdCA9IENtcExFKHpWYWx1ZSwgeik7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJelRlc3QgPSBDbXBOTFQoelZhbHVlLCB6KTsKKwkJCQkJCX0KKworCQkJCQkJSW50IHpNYXNrID0gU2lnbk1hc2soelRlc3QpOworCisJCQkJCQlJZih6TWFzayA9PSAwKQorCQkJCQkJeworCQkJCQkJCXgwICs9IDI7CisJCQkJCQl9CisJCQkJCQlFbHNlCisJCQkJCQl7CisJCQkJCQkJeCA9IHgxOworCQkJCQkJfQorCisJCQkJCQl4eHh4ICs9IEZsb2F0NCgyKTsKKworCQkJCQkJaWYoIXN0YXRlLnF1YWRMYXlvdXREZXB0aEJ1ZmZlcikKKwkJCQkJCXsKKwkJCQkJCQlidWZmZXIgKz0gODsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlidWZmZXIgKz0gMTY7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCUlmKHgwIDwgeDEpCisJCQl7CisJCQkJaWYoc3RhdGUucGVyc3BlY3RpdmUpCisJCQkJeworCQkJCQlyLkR3ID0gKlBvaW50ZXI8RmxvYXQ0PihyLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsdy5DKSwgMTYpICsgeXl5eSAqICpQb2ludGVyPEZsb2F0ND4oci5wcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHcuQiksIDE2KTsKKwkJCQl9CisKKwkJCQlmb3IoaW50IGludGVycG9sYW50ID0gMDsgaW50ZXJwb2xhbnQgPCAxMTsgaW50ZXJwb2xhbnQrKykKKwkJCQl7CisJCQkJCWludCBjb21wb25lbnRDb3VudCA9IGludGVycG9sYW50IDwgMTAgPyA0IDogMTsgICAvLyBGb2cgb25seSBoYXMgb25lIGNvbXBvbmVudAorCisJCQkJCWZvcihpbnQgY29tcG9uZW50ID0gMDsgY29tcG9uZW50IDwgY29tcG9uZW50Q291bnQ7IGNvbXBvbmVudCsrKQorCQkJCQl7CisJCQkJCQlpZihzdGF0ZS5pbnRlcnBvbGFudFtpbnRlcnBvbGFudF0uY29tcG9uZW50ICYgKDEgPDwgY29tcG9uZW50KSkKKwkJCQkJCXsKKwkJCQkJCQlyLkR2W2ludGVycG9sYW50XVtjb21wb25lbnRdID0gKlBvaW50ZXI8RmxvYXQ0PihyLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsVltpbnRlcnBvbGFudF1bY29tcG9uZW50XS5DKSwgMTYpOworCisJCQkJCQkJaWYoIShzdGF0ZS5pbnRlcnBvbGFudFtpbnRlcnBvbGFudF0uZmxhdCAmICgxIDw8IGNvbXBvbmVudCkpKQorCQkJCQkJCXsKKwkJCQkJCQkJci5EdltpbnRlcnBvbGFudF1bY29tcG9uZW50XSArPSB5eXl5ICogKlBvaW50ZXI8RmxvYXQ0PihyLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsVltpbnRlcnBvbGFudF1bY29tcG9uZW50XS5CKSwgMTYpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCVNob3J0NCB4TGVmdFs0XTsKKwkJCQlTaG9ydDQgeFJpZ2h0WzRdOworCisJCQkJZm9yKHVuc2lnbmVkIGludCBxID0gMDsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCQkJeworCQkJCQl4TGVmdFtxXSA9ICpQb2ludGVyPFNob3J0ND4oci5wcmltaXRpdmUgKyBxICogc2l6ZW9mKFByaW1pdGl2ZSkgKyBPRkZTRVQoUHJpbWl0aXZlLG91dGxpbmUpICsgeSAqIHNpemVvZihQcmltaXRpdmU6OlNwYW4pKTsKKwkJCQkJeFJpZ2h0W3FdID0geExlZnRbcV07CisKKwkJCQkJeExlZnRbcV0gPSBTd2l6emxlKHhMZWZ0W3FdLCAweEEwKSAtIFNob3J0NCgxLCAyLCAxLCAyKTsKKwkJCQkJeFJpZ2h0W3FdID0gU3dpenpsZSh4UmlnaHRbcV0sIDB4RjUpIC0gU2hvcnQ0KDAsIDEsIDAsIDEpOworCQkJCX0KKworCQkJCUZvcihJbnQgeCA9IHgwLCB4IDwgeDEsIHggKz0gMikKKwkJCQl7CisJCQkJCVNob3J0NCB4eHh4ID0gU2hvcnQ0KHgpOworCQkJCQlJbnQgY01hc2tbNF07CisKKwkJCQkJZm9yKHVuc2lnbmVkIGludCBxID0gMDsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCQkJCXsKKwkJCQkJCVNob3J0NCBtYXNrID0gQ21wR1QoeHh4eCwgeExlZnRbcV0pICYgQ21wR1QoeFJpZ2h0W3FdLCB4eHh4KTsKKwkJCQkJCWNNYXNrW3FdID0gU2lnbk1hc2soUGFjayhtYXNrLCBtYXNrKSkgJiAweDAwMDAwMDBGOworCQkJCQl9CisKKwkJCQkJcXVhZChyLCBjQnVmZmVyLCB6QnVmZmVyLCBzQnVmZmVyLCBjTWFzaywgeCwgeSk7CisJCQkJfQorCQkJfQorCisJCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKQorCQkJeworCQkJCWlmKHN0YXRlLmNvbG9yV3JpdGVBY3RpdmUoaW5kZXgpKQorCQkJCXsKKwkJCQkJY0J1ZmZlcltpbmRleF0gKz0gKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsY29sb3JQaXRjaEJbaW5kZXhdKSkgPDwgKDEgKyBsb2cyKGNsdXN0ZXJDb3VudCkpOyAgIC8vIEZJWE1FOiBQcmVjb21wdXRlCisJCQkJfQorCQkJfQorCisJCQlpZihzdGF0ZS5kZXB0aFRlc3RBY3RpdmUpCisJCQl7CisJCQkJekJ1ZmZlciArPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxkZXB0aFBpdGNoQikpIDw8ICgxICsgbG9nMihjbHVzdGVyQ291bnQpKTsgICAvLyBGSVhNRTogUHJlY29tcHV0ZQorCQkJfQorCisJCQlpZihzdGF0ZS5zdGVuY2lsQWN0aXZlKQorCQkJeworCQkJCXNCdWZmZXIgKz0gKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsc3RlbmNpbFBpdGNoQikpIDw8ICgxICsgbG9nMihjbHVzdGVyQ291bnQpKTsgICAvLyBGSVhNRTogUHJlY29tcHV0ZQorCQkJfQorCisJCQl5ICs9IDIgKiBjbHVzdGVyQ291bnQ7CisJCX0KKwkJVW50aWwoeSA+PSB5TWF4KQorCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9RdWFkUmFzdGVyaXplci5ocHAgYi9zcmMvUmVuZGVyZXIvUXVhZFJhc3Rlcml6ZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTg0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvUXVhZFJhc3Rlcml6ZXIuaHBwCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBzd19RdWFkUmFzdGVyaXplcl9ocHAKKyNkZWZpbmUgc3dfUXVhZFJhc3Rlcml6ZXJfaHBwCisKKyNpbmNsdWRlICJSYXN0ZXJpemVyLmhwcCIKKyNpbmNsdWRlICJQaXhlbFJvdXRpbmUuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwljbGFzcyBRdWFkUmFzdGVyaXplciA6IHB1YmxpYyBQaXhlbFJvdXRpbmUKKwl7CisJcHVibGljOgorCQlRdWFkUmFzdGVyaXplcihjb25zdCBQaXhlbFByb2Nlc3Nvcjo6U3RhdGUgJnN0YXRlLCBjb25zdCBQaXhlbFNoYWRlciAqcGl4ZWxTaGFkZXIpOworCisJCXZpcnR1YWwgflF1YWRSYXN0ZXJpemVyKCk7CisKKwlwcml2YXRlOgorCQl2b2lkIGdlbmVyYXRlKCk7CisKKwkJdm9pZCByYXN0ZXJpemUoUmVnaXN0ZXJzICZyLCBJbnQgJnlNaW4sIEludCAmeU1heCk7CisJfTsKK30KKworI2VuZGlmICAgLy8gc3dfUXVhZFJhc3Rlcml6ZXJfaHBwCmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvUmFzdGVyaXplci5jcHAgYi9zcmMvUmVuZGVyZXIvUmFzdGVyaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYzdlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9SYXN0ZXJpemVyLmNwcApAQCAtMCwwICsxLDI4IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJSYXN0ZXJpemVyLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJUmFzdGVyaXplcjo6UmFzdGVyaXplcihjb25zdCBQaXhlbFByb2Nlc3Nvcjo6U3RhdGUgJnN0YXRlKSA6IHN0YXRlKHN0YXRlKQorCXsKKwl9CisKKwlSYXN0ZXJpemVyOjp+UmFzdGVyaXplcigpCisJeworCX0KKworCVJvdXRpbmUgKlJhc3Rlcml6ZXI6OmdldFJvdXRpbmUoKQorCXsKKwkJcmV0dXJuIHJvdXRpbmU7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1Jhc3Rlcml6ZXIuaHBwIGIvc3JjL1JlbmRlcmVyL1Jhc3Rlcml6ZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzczNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvUmFzdGVyaXplci5ocHAKQEAgLTAsMCArMSwzOSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIHN3X1Jhc3Rlcml6ZXJfaHBwCisjZGVmaW5lIHN3X1Jhc3Rlcml6ZXJfaHBwCisKKyNpbmNsdWRlICJDb250ZXh0LmhwcCIKKworI2luY2x1ZGUgIlBpeGVsUHJvY2Vzc29yLmhwcCIKKyNpbmNsdWRlICJDb25maWcuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwljbGFzcyBSYXN0ZXJpemVyCisJeworCXB1YmxpYzoKKwkJUmFzdGVyaXplcihjb25zdCBQaXhlbFByb2Nlc3Nvcjo6U3RhdGUgJnN0YXRlKTsKKworCQl2aXJ0dWFsIH5SYXN0ZXJpemVyKCk7CisKKwkJdmlydHVhbCB2b2lkIGdlbmVyYXRlKCkgPSAwOworCQlSb3V0aW5lICpnZXRSb3V0aW5lKCk7CisKKwlwcm90ZWN0ZWQ6CisJCVJvdXRpbmUgKnJvdXRpbmU7CisKKwkJY29uc3QgUGl4ZWxQcm9jZXNzb3I6OlN0YXRlICZzdGF0ZTsKKwl9OworfQorCisjZW5kaWYgICAvLyBzd19SYXN0ZXJpemVyX2hwcApkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1JlbmRlcmVyLmNwcCBiL3NyYy9SZW5kZXJlci9SZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5NGYzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9SZW5kZXJlci5jcHAKQEAgLTAsMCArMSwyNjA3IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJSZW5kZXJlci5ocHAiCisKKyNpbmNsdWRlICJDbGlwcGVyLmhwcCIKKyNpbmNsdWRlICJNYXRoLmhwcCIKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlci5ocHAiCisjaW5jbHVkZSAiVGltZXIuaHBwIgorI2luY2x1ZGUgIlN1cmZhY2UuaHBwIgorI2luY2x1ZGUgIkhhbGYuaHBwIgorI2luY2x1ZGUgIlByaW1pdGl2ZS5ocHAiCisjaW5jbHVkZSAiUG9seWdvbi5ocHAiCisjaW5jbHVkZSAiU3dpZnRDb25maWcuaHBwIgorI2luY2x1ZGUgIk11dGV4TG9jay5ocHAiCisjaW5jbHVkZSAiQ1BVSUQuaHBwIgorI2luY2x1ZGUgIk1lbW9yeS5ocHAiCisjaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgorI2luY2x1ZGUgIkNvbnN0YW50cy5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorI2luY2x1ZGUgIlN3aWZ0U2hhZGVyLmgiCisjaW5jbHVkZSAiUmVhY3Rvci9TaGVsbC5ocHAiCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjdW5kZWYgbWF4CisKK1NXRklMVEVSIG1heGltdW1GaWx0ZXJRdWFsaXR5ID0gU1dGX0RFRkFVTFQ7CitTV0ZJTFRFUiBtYXhpbXVtTWlwbWFwUXVhbGl0eSA9IFNXRl9ERUZBVUxUOworU1dQRVJTUEVDVElWRSBwZXJzcGVjdGl2ZVF1YWxpdHkgPSBTV1BfREVGQVVMVDsKK2Jvb2wgZGlzYWJsZVNlcnZlciA9IGZhbHNlOworCisjaWZuZGVmIE5ERUJVRwordW5zaWduZWQgaW50IG1pblByaW1pdGl2ZXMgPSAxOwordW5zaWduZWQgaW50IG1heFByaW1pdGl2ZXMgPSAxIDw8IDIxOworI2VuZGlmCisKK25hbWVzcGFjZSBzdworeworCWV4dGVybiBib29sIGZvcmNlV2luZG93ZWQ7CisJZXh0ZXJuIGJvb2wgY29tcGxlbWVudGFyeURlcHRoQnVmZmVyOworCWV4dGVybiBib29sIHBvc3RCbGVuZFNSR0I7CisJZXh0ZXJuIGJvb2wgZXhhY3RDb2xvclJvdW5kaW5nOworCWV4dGVybiBDb250ZXh0OjpUcmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcgdHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nOworCWV4dGVybiBib29sIGZvcmNlQ2xlYXJSZWdpc3RlcnM7CisKKwlleHRlcm4gVHJhbnNjZW5kZW50YWxQcmVjaXNpb24gbG9nUHJlY2lzaW9uOworCWV4dGVybiBUcmFuc2NlbmRlbnRhbFByZWNpc2lvbiBleHBQcmVjaXNpb247CisJZXh0ZXJuIFRyYW5zY2VuZGVudGFsUHJlY2lzaW9uIHJjcFByZWNpc2lvbjsKKwlleHRlcm4gVHJhbnNjZW5kZW50YWxQcmVjaXNpb24gcnNxUHJlY2lzaW9uOworCWV4dGVybiBib29sIHBlcnNwZWN0aXZlQ29ycmVjdGlvbjsKKworCWludCBiYXRjaFNpemUgPSAxMjg7CisJaW50IHRocmVhZENvdW50ID0gMTsKKwlpbnQgdW5pdENvdW50ID0gMTsKKwlpbnQgY2x1c3RlckNvdW50ID0gMTsKKworCXN0cnVjdCBQYXJhbWV0ZXJzCisJeworCQlSZW5kZXJlciAqcmVuZGVyZXI7CisJCWludCB0aHJlYWRJbmRleDsKKwl9OworCisJRHJhd0NhbGw6OkRyYXdDYWxsKCkKKwl7CisJCXF1ZXJpZXMgPSAwOworCisJCXZzRGlydHlDb25zdEYgPSAyNTYgKyAxOworCQl2c0RpcnR5Q29uc3RJID0gMTY7CisJCXZzRGlydHlDb25zdEIgPSAxNjsKKworCQlwc0RpcnR5Q29uc3RGID0gMjI0OworCQlwc0RpcnR5Q29uc3RJID0gMTY7CisJCXBzRGlydHlDb25zdEIgPSAxNjsKKworCQlyZWZlcmVuY2VzID0gLTE7CisKKwkJZGF0YSA9IChEcmF3RGF0YSopYWxsb2NhdGUoc2l6ZW9mKERyYXdEYXRhKSk7CisJCWRhdGEtPmNvbnN0YW50cyA9ICZjb25zdGFudHM7CisJfQorCisJRHJhd0NhbGw6On5EcmF3Q2FsbCgpCisJeworCQlkZWxldGUgcXVlcmllczsKKworCQlkZWFsbG9jYXRlKGRhdGEpOworCX0KKworCVJlbmRlcmVyOjpSZW5kZXJlcihDb250ZXh0ICpjb250ZXh0LCBTdXJmYWNlICpyZW5kZXJUYXJnZXQpIDogY29udGV4dChjb250ZXh0KSwgVmVydGV4UHJvY2Vzc29yKGNvbnRleHQpLCBQaXhlbFByb2Nlc3Nvcihjb250ZXh0KSwgU2V0dXBQcm9jZXNzb3IoY29udGV4dCksIHZpZXdwb3J0KCkKKwl7CisJCXNldFJlbmRlclRhcmdldCgwLCByZW5kZXJUYXJnZXQpOworCisJCWNsaXBwZXIgPSBuZXcgQ2xpcHBlcigpOworCisJCXBvc1NjYWxlID0gdmVjdG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQlwb3NPZmZzZXQgPSB2ZWN0b3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisKKwkJdXBkYXRlVmlld01hdHJpeCA9IHRydWU7CisJCXVwZGF0ZUJhc2VNYXRyaXggPSB0cnVlOworCQl1cGRhdGVQcm9qZWN0aW9uTWF0cml4ID0gdHJ1ZTsKKwkJdXBkYXRlQ2xpcFBsYW5lcyA9IHRydWU7CisKKwkJI2lmIFBFUkZfSFVECisJCQlyZXNldFRpbWVycygpOworCQkjZW5kaWYKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJdmVydGV4VGFza1tpXSA9IDA7CisKKwkJCXdvcmtlcltpXSA9IDA7CisJCQlyZXN1bWVbaV0gPSAwOworCQkJc3VzcGVuZFtpXSA9IDA7CisJCX0KKworCQl0aHJlYWRzQXdha2UgPSAwOworCQlyZXN1bWVBcHAgPSBuZXcgRXZlbnQoKTsKKworCQljdXJyZW50RHJhdyA9IDA7CisJCW5leHREcmF3ID0gMDsKKworCQlxSGVhZCA9IDA7CisJCXFTaXplID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJdHJpYW5nbGVCYXRjaFtpXSA9IDA7CisJCQlwcmltaXRpdmVCYXRjaFtpXSA9IDA7CisJCX0KKworCQlmb3IoaW50IGRyYXcgPSAwOyBkcmF3IDwgRFJBV19DT1VOVDsgZHJhdysrKQorCQl7CisJCQlkcmF3Q2FsbFtkcmF3XSA9IG5ldyBEcmF3Q2FsbCgpOworCQkJZHJhd0xpc3RbZHJhd10gPSBkcmF3Q2FsbFtkcmF3XTsKKwkJfQorCisJCWZvcihpbnQgdW5pdCA9IDA7IHVuaXQgPCAxNjsgdW5pdCsrKQorCQl7CisJCQlwcmltaXRpdmVQcm9ncmVzc1t1bml0XS5pbml0KCk7CisJCX0KKworCQlmb3IoaW50IGNsdXN0ZXIgPSAwOyBjbHVzdGVyIDwgMTY7IGNsdXN0ZXIrKykKKwkJeworCQkJcGl4ZWxQcm9ncmVzc1tjbHVzdGVyXS5pbml0KCk7CisJCX0KKworCQljbGlwRmxhZ3MgPSAwOworCisJCXN3aWZ0Q29uZmlnID0gbmV3IFN3aWZ0Q29uZmlnKGRpc2FibGVTZXJ2ZXIpOworCQl1cGRhdGVDb25maWd1cmF0aW9uKHRydWUpOworCQlzdGFydHVwQ29uZmlndXJhdGlvbigpOworCX0KKworCVJlbmRlcmVyOjp+UmVuZGVyZXIoKQorCXsKKwkJZGVsZXRlIGNsaXBwZXI7CisJCWNsaXBwZXIgPSAwOworCisJCXRlcm1pbmF0ZVRocmVhZHMoKTsKKwkJZGVsZXRlIHJlc3VtZUFwcDsKKworCQlmb3IoaW50IGRyYXcgPSAwOyBkcmF3IDwgRFJBV19DT1VOVDsgZHJhdysrKQorCQl7CisJCQlkZWxldGUgZHJhd0NhbGxbZHJhd107CisJCX0KKworCQlkZWxldGVCYXRjaGVzKCk7CisKKwkJZGVsZXRlIHN3aWZ0Q29uZmlnOworCX0KKworCXZvaWQgUmVuZGVyZXI6OmJsaXQoU3VyZmFjZSAqc291cmNlLCBjb25zdCBSZWN0ICZzUmVjdCwgU3VyZmFjZSAqZGVzdCwgY29uc3QgUmVjdCAmZFJlY3QsIGJvb2wgZmlsdGVyKQorCXsKKwkJYmxpdHRlci5ibGl0KHNvdXJjZSwgc1JlY3QsIGRlc3QsIGRSZWN0LCBmaWx0ZXIpOworCX0KKworCXZvaWQgUmVuZGVyZXI6OmRyYXcoQ29udGV4dDo6RHJhd1R5cGUgZHJhd1R5cGUsIHVuc2lnbmVkIGludCBpbmRleE9mZnNldCwgdW5zaWduZWQgaW50IGNvdW50LCBib29sIHVwZGF0ZSkKKwl7CisJCSNpZm5kZWYgTkRFQlVHCisJCQlpZihjb3VudCA8IG1pblByaW1pdGl2ZXMgfHwgY291bnQgPiBtYXhQcmltaXRpdmVzKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJI2VuZGlmCisKKwkJY29udGV4dC0+ZHJhd1R5cGUgPSBkcmF3VHlwZTsKKworCQl1cGRhdGVDb25maWd1cmF0aW9uKCk7CisJCXVwZGF0ZUNsaXBwZXIoKTsKKworCQlpbnQgc3MgPSBjb250ZXh0LT5yZW5kZXJUYXJnZXRbMF0tPmdldFN1cGVyU2FtcGxlQ291bnQoKTsKKwkJaW50IG1zID0gY29udGV4dC0+cmVuZGVyVGFyZ2V0WzBdLT5nZXRNdWx0aVNhbXBsZUNvdW50KCk7CisKKwkJZm9yKGludCBxID0gMDsgcSA8IHNzOyBxKyspCisJCXsKKwkJCWludCBvbGRNdWx0aVNhbXBsZU1hc2sgPSBjb250ZXh0LT5tdWx0aVNhbXBsZU1hc2s7CisJCQljb250ZXh0LT5tdWx0aVNhbXBsZU1hc2sgPSAoY29udGV4dC0+c2FtcGxlTWFzayA+PiAobXMgKiBxKSkgJiAoKHVuc2lnbmVkKTB4RkZGRkZGRkYgID4+ICgzMiAtIG1zKSk7CisKKwkJCWlmKCFjb250ZXh0LT5tdWx0aVNhbXBsZU1hc2spCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmKHVwZGF0ZSB8fCBvbGRNdWx0aVNhbXBsZU1hc2sgIT0gY29udGV4dC0+bXVsdGlTYW1wbGVNYXNrKQorCQkJeworCQkJCXZlcnRleFN0YXRlID0gVmVydGV4UHJvY2Vzc29yOjp1cGRhdGUoKTsKKwkJCQlzZXR1cFN0YXRlID0gU2V0dXBQcm9jZXNzb3I6OnVwZGF0ZSgpOworCQkJCXBpeGVsU3RhdGUgPSBQaXhlbFByb2Nlc3Nvcjo6dXBkYXRlKCk7CisKKwkJCQl2ZXJ0ZXhSb3V0aW5lID0gVmVydGV4UHJvY2Vzc29yOjpyb3V0aW5lKHZlcnRleFN0YXRlKTsKKwkJCQlzZXR1cFJvdXRpbmUgPSBTZXR1cFByb2Nlc3Nvcjo6cm91dGluZShzZXR1cFN0YXRlKTsKKwkJCQlwaXhlbFJvdXRpbmUgPSBQaXhlbFByb2Nlc3Nvcjo6cm91dGluZShwaXhlbFN0YXRlKTsKKwkJCX0KKworCQkJaW50IGJhdGNoID0gYmF0Y2hTaXplIC8gbXM7CisKKwkJCWlmKGNvbnRleHQtPmlzRHJhd1RyaWFuZ2xlKCkpCisJCQl7CisJCQkJc3dpdGNoKGNvbnRleHQtPmZpbGxNb2RlKQorCQkJCXsKKwkJCQljYXNlIENvbnRleHQ6OkZJTExfU09MSUQ6CisJCQkJCXNldHVwUHJpbWl0aXZlcyA9IHNldHVwU29saWRUcmlhbmdsZXM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ29udGV4dDo6RklMTF9XSVJFRlJBTUU6CisJCQkJCXNldHVwUHJpbWl0aXZlcyA9IHNldHVwV2lyZWZyYW1lVHJpYW5nbGU7CisJCQkJCWJhdGNoID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDb250ZXh0OjpGSUxMX1ZFUlRFWDoKKwkJCQkJc2V0dXBQcmltaXRpdmVzID0gc2V0dXBWZXJ0ZXhUcmlhbmdsZTsKKwkJCQkJYmF0Y2ggPSAxOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OiBBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoY29udGV4dC0+aXNEcmF3TGluZSgpKQorCQkJeworCQkJCXNldHVwUHJpbWl0aXZlcyA9IHNldHVwTGluZXM7CisJCQl9CisJCQllbHNlICAgLy8gUG9pbnQgZHJhdworCQkJeworCQkJCXNldHVwUHJpbWl0aXZlcyA9IHNldHVwUG9pbnRzOworCQkJfQorCisJCQlEcmF3Q2FsbCAqZHJhdyA9IDA7CisKKwkJCWRvCisJCQl7CisJCQkJZm9yKGludCBpID0gMDsgaSA8IERSQVdfQ09VTlQ7IGkrKykKKwkJCQl7CisJCQkJCWlmKGRyYXdDYWxsW2ldLT5yZWZlcmVuY2VzID09IC0xKQorCQkJCQl7CisJCQkJCQlkcmF3ID0gZHJhd0NhbGxbaV07CisJCQkJCQlkcmF3TGlzdFtuZXh0RHJhdyAlIERSQVdfQ09VTlRdID0gZHJhdzsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZighZHJhdykKKwkJCQl7CisJCQkJCXJlc3VtZUFwcC0+d2FpdCgpOworCQkJCX0KKwkJCX0KKwkJCXdoaWxlKCFkcmF3KTsKKworCQkJRHJhd0RhdGEgKmRhdGEgPSBkcmF3LT5kYXRhOworCisJCQlpZihxdWVyaWVzLnNpemUoKSAhPSAwKQorCQkJeworCQkJCWZvcihzdGQ6Omxpc3Q8UXVlcnkqPjo6aXRlcmF0b3IgcXVlcnkgPSBxdWVyaWVzLmJlZ2luKCk7IHF1ZXJ5ICE9IHF1ZXJpZXMuZW5kKCk7IHF1ZXJ5KyspCisJCQkJeworCQkJCQlJbnRlcmxvY2tlZEluY3JlbWVudCgodm9sYXRpbGUgbG9uZyopJigqcXVlcnkpLT5yZWZlcmVuY2UpOworCQkJCX0KKworCQkJCWRyYXctPnF1ZXJpZXMgPSBuZXcgc3RkOjpsaXN0PFF1ZXJ5Kj4ocXVlcmllcyk7CisJCQl9CisKKwkJCWRyYXctPmRyYXdUeXBlID0gZHJhd1R5cGU7CisJCQlkcmF3LT5iYXRjaFNpemUgPSBiYXRjaDsKKworCQkJdmVydGV4Um91dGluZS0+YmluZCgpOworCQkJc2V0dXBSb3V0aW5lLT5iaW5kKCk7CisJCQlwaXhlbFJvdXRpbmUtPmJpbmQoKTsKKworCQkJZHJhdy0+dmVydGV4Um91dGluZSA9IHZlcnRleFJvdXRpbmU7CisJCQlkcmF3LT5zZXR1cFJvdXRpbmUgPSBzZXR1cFJvdXRpbmU7CisJCQlkcmF3LT5waXhlbFJvdXRpbmUgPSBwaXhlbFJvdXRpbmU7CisJCQlkcmF3LT52ZXJ0ZXhQb2ludGVyID0gKFZlcnRleFByb2Nlc3Nvcjo6Um91dGluZVBvaW50ZXIpdmVydGV4Um91dGluZS0+Z2V0RW50cnkoKTs7CisJCQlkcmF3LT5zZXR1cFBvaW50ZXIgPSAoU2V0dXBQcm9jZXNzb3I6OlJvdXRpbmVQb2ludGVyKXNldHVwUm91dGluZS0+Z2V0RW50cnkoKTsKKwkJCWRyYXctPnBpeGVsUG9pbnRlciA9IChQaXhlbFByb2Nlc3Nvcjo6Um91dGluZVBvaW50ZXIpcGl4ZWxSb3V0aW5lLT5nZXRFbnRyeSgpOworCQkJZHJhdy0+c2V0dXBQcmltaXRpdmVzID0gc2V0dXBQcmltaXRpdmVzOworCQkJZHJhdy0+c2V0dXBTdGF0ZSA9IHNldHVwU3RhdGU7CisKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJeworCQkJCWRyYXctPnZlcnRleFN0cmVhbVtpXSA9IGNvbnRleHQtPmlucHV0W2ldLnJlc291cmNlOworCQkJCWRhdGEtPmlucHV0W2ldID0gY29udGV4dC0+aW5wdXRbaV0uYnVmZmVyOworCQkJCWRhdGEtPnN0cmlkZVtpXSA9IGNvbnRleHQtPmlucHV0W2ldLnN0cmlkZTsKKworCQkJCWlmKGRyYXctPnZlcnRleFN0cmVhbVtpXSkKKwkJCQl7CisJCQkJCWRyYXctPnZlcnRleFN0cmVhbVtpXS0+bG9jayhQVUJMSUMsIFBSSVZBVEUpOworCQkJCX0KKwkJCX0KKworCQkJaWYoY29udGV4dC0+aW5kZXhCdWZmZXIpCisJCQl7CisJCQkJZGF0YS0+aW5kaWNlcyA9ICh1bnNpZ25lZCBjaGFyKiljb250ZXh0LT5pbmRleEJ1ZmZlci0+bG9jayhQVUJMSUMsIFBSSVZBVEUpICsgaW5kZXhPZmZzZXQ7CisJCQl9CisKKwkJCWRyYXctPmluZGV4QnVmZmVyID0gY29udGV4dC0+aW5kZXhCdWZmZXI7CisKKwkJCWZvcihpbnQgc2FtcGxlciA9IDA7IHNhbXBsZXIgPCAyMDsgc2FtcGxlcisrKQorCQkJeworCQkJCWRyYXctPnRleHR1cmVbc2FtcGxlcl0gPSAwOworCQkJfQorCisJCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgMTY7IHNhbXBsZXIrKykKKwkJCXsKKwkJCQlpZihwaXhlbFN0YXRlLnNhbXBsZXJbc2FtcGxlcl0udGV4dHVyZVR5cGUgIT0gVEVYVFVSRV9OVUxMKQorCQkJCXsKKwkJCQkJZHJhdy0+dGV4dHVyZVtzYW1wbGVyXSA9IGNvbnRleHQtPnRleHR1cmVbc2FtcGxlcl07CisJCQkJCWRyYXctPnRleHR1cmVbc2FtcGxlcl0tPmxvY2soUFVCTElDLCBpc1JlYWRXcml0ZVRleHR1cmUoc2FtcGxlcikgPyBNQU5BR0VEIDogUFJJVkFURSk7ICAgLy8gSWYgdGhlIHRleHVyZSBpcyBib3RoIHJlYWQgYW5kIHdyaXR0ZW4sIHVzZSB0aGUgc2FtZSByZWFkL3dyaXRlIGxvY2sgYXMgcmVuZGVyIHRhcmdldHMKKworCQkJCQlkYXRhLT5taXBtYXBbc2FtcGxlcl0gPSBjb250ZXh0LT5zYW1wbGVyW3NhbXBsZXJdLmdldFRleHR1cmVEYXRhKCk7CisJCQkJfQorCQkJfQorCisJCQlpZihjb250ZXh0LT5waXhlbFNoYWRlcikKKwkJCXsKKwkJCQlpZihkcmF3LT5wc0RpcnR5Q29uc3RGKQorCQkJCXsKKwkJCQkJbWVtY3B5KCZkYXRhLT5wcy5jVywgUGl4ZWxQcm9jZXNzb3I6OmNXLCBzaXplb2Yod29yZDQpICogNCAqIChkcmF3LT5wc0RpcnR5Q29uc3RGIDwgOCA/IGRyYXctPnBzRGlydHlDb25zdEYgOiA4KSk7CisJCQkJCW1lbWNweSgmZGF0YS0+cHMuYywgUGl4ZWxQcm9jZXNzb3I6OmMsIHNpemVvZihmbG9hdDQpICogZHJhdy0+cHNEaXJ0eUNvbnN0Rik7CisJCQkJCWRyYXctPnBzRGlydHlDb25zdEYgPSAwOworCQkJCX0KKworCQkJCWlmKGRyYXctPnBzRGlydHlDb25zdEkpCisJCQkJeworCQkJCQltZW1jcHkoJmRhdGEtPnBzLmksIFBpeGVsUHJvY2Vzc29yOjppLCBzaXplb2YoaW50NCkgKiBkcmF3LT5wc0RpcnR5Q29uc3RJKTsKKwkJCQkJZHJhdy0+cHNEaXJ0eUNvbnN0SSA9IDA7CisJCQkJfQorCisJCQkJaWYoZHJhdy0+cHNEaXJ0eUNvbnN0QikKKwkJCQl7CisJCQkJCW1lbWNweSgmZGF0YS0+cHMuYiwgUGl4ZWxQcm9jZXNzb3I6OmIsIHNpemVvZihib29sKSAqIGRyYXctPnBzRGlydHlDb25zdEIpOworCQkJCQlkcmF3LT5wc0RpcnR5Q29uc3RCID0gMDsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmKGNvbnRleHQtPnBpeGVsU2hhZGVyVmVyc2lvbigpIDw9IDB4MDEwNCkKKwkJCXsKKwkJCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQorCQkJCXsKKwkJCQkJaWYocGl4ZWxTdGF0ZS50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnN0YWdlT3BlcmF0aW9uICE9IFRleHR1cmVTdGFnZTo6U1RBR0VfRElTQUJMRSB8fCBjb250ZXh0LT5waXhlbFNoYWRlcikKKwkJCQkJeworCQkJCQkJZGF0YS0+dGV4dHVyZVN0YWdlW3N0YWdlXSA9IGNvbnRleHQtPnRleHR1cmVTdGFnZVtzdGFnZV0udW5pZm9ybXM7CisJCQkJCX0KKwkJCQkJZWxzZSBicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmKGNvbnRleHQtPnZlcnRleFNoYWRlcikKKwkJCXsKKwkJCQlpZihjb250ZXh0LT52ZXJ0ZXhTaGFkZXItPmdldFZlcnNpb24oKSA+PSAweDAzMDApCisJCQkJeworCQkJCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgNDsgc2FtcGxlcisrKQorCQkJCQl7CisJCQkJCQlpZih2ZXJ0ZXhTdGF0ZS5zYW1wbGVyU3RhdGVbc2FtcGxlcl0udGV4dHVyZVR5cGUgIT0gVEVYVFVSRV9OVUxMKQorCQkJCQkJeworCQkJCQkJCWRyYXctPnRleHR1cmVbMTYgKyBzYW1wbGVyXSA9IGNvbnRleHQtPnRleHR1cmVbMTYgKyBzYW1wbGVyXTsKKwkJCQkJCQlkcmF3LT50ZXh0dXJlWzE2ICsgc2FtcGxlcl0tPmxvY2soUFVCTElDLCBQUklWQVRFKTsKKworCQkJCQkJCWRhdGEtPm1pcG1hcFsxNiArIHNhbXBsZXJdID0gY29udGV4dC0+c2FtcGxlclsxNiArIHNhbXBsZXJdLmdldFRleHR1cmVEYXRhKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZihkcmF3LT52c0RpcnR5Q29uc3RGKQorCQkJCXsKKwkJCQkJbWVtY3B5KCZkYXRhLT52cy5jLCBWZXJ0ZXhQcm9jZXNzb3I6OmMsIHNpemVvZihmbG9hdDQpICogZHJhdy0+dnNEaXJ0eUNvbnN0Rik7CisJCQkJCWRyYXctPnZzRGlydHlDb25zdEYgPSAwOworCQkJCX0KKworCQkJCWlmKGRyYXctPnZzRGlydHlDb25zdEkpCisJCQkJeworCQkJCQltZW1jcHkoJmRhdGEtPnZzLmksIFZlcnRleFByb2Nlc3Nvcjo6aSwgc2l6ZW9mKGludDQpICogZHJhdy0+dnNEaXJ0eUNvbnN0SSk7CisJCQkJCWRyYXctPnZzRGlydHlDb25zdEkgPSAwOworCQkJCX0KKworCQkJCWlmKGRyYXctPnZzRGlydHlDb25zdEIpCisJCQkJeworCQkJCQltZW1jcHkoJmRhdGEtPnZzLmIsIFZlcnRleFByb2Nlc3Nvcjo6Yiwgc2l6ZW9mKGJvb2wpICogZHJhdy0+dnNEaXJ0eUNvbnN0Qik7CisJCQkJCWRyYXctPnZzRGlydHlDb25zdEIgPSAwOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkYXRhLT5mZiA9IGZmOworCisJCQkJZHJhdy0+dnNEaXJ0eUNvbnN0RiA9IDI1NiArIDE7CisJCQkJZHJhdy0+dnNEaXJ0eUNvbnN0SSA9IDE2OworCQkJCWRyYXctPnZzRGlydHlDb25zdEIgPSAxNjsKKwkJCX0KKworCQkJaWYocGl4ZWxTdGF0ZS5zdGVuY2lsQWN0aXZlKQorCQkJeworCQkJCWRhdGEtPnN0ZW5jaWxbMF0gPSBzdGVuY2lsOworCQkJCWRhdGEtPnN0ZW5jaWxbMV0gPSBzdGVuY2lsQ0NXOworCQkJfQorCisJCQlpZihwaXhlbFN0YXRlLmZvZ0FjdGl2ZSkKKwkJCXsKKwkJCQlkYXRhLT5mb2cgPSBmb2c7CisJCQl9CisKKwkJCWlmKHNldHVwU3RhdGUuaXNEcmF3UG9pbnQpCisJCQl7CisJCQkJZGF0YS0+cG9pbnQgPSBwb2ludDsKKwkJCX0KKworCQkJZGF0YS0+ZmFjdG9yID0gZmFjdG9yOworCisJCQlpZihwaXhlbFN0YXRlLnRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyA9PSBDb250ZXh0OjpUUkFOU1BBUkVOQ1lfQUxQSEFfVE9fQ09WRVJBR0UpCisJCQl7CisJCQkJZmxvYXQgcmVmID0gKGZsb2F0KWNvbnRleHQtPmFscGhhUmVmZXJlbmNlICogKDEuMGYgLyAyNTUuMGYpOworCQkJCWZsb2F0IG1hcmdpbiA9IHN3OjptaW4ocmVmLCAxLjBmIC0gcmVmKTsKKworCQkJCWlmKG1zID09IDQpCisJCQkJeworCQkJCQlkYXRhLT5hMmMwID0gcmVwbGljYXRlKHJlZiAtIG1hcmdpbiAqIDAuNmYpOworCQkJCQlkYXRhLT5hMmMxID0gcmVwbGljYXRlKHJlZiAtIG1hcmdpbiAqIDAuMmYpOworCQkJCQlkYXRhLT5hMmMyID0gcmVwbGljYXRlKHJlZiArIG1hcmdpbiAqIDAuMmYpOworCQkJCQlkYXRhLT5hMmMzID0gcmVwbGljYXRlKHJlZiArIG1hcmdpbiAqIDAuNmYpOworCQkJCX0KKwkJCQllbHNlIGlmKG1zID09IDIpCisJCQkJeworCQkJCQlkYXRhLT5hMmMwID0gcmVwbGljYXRlKHJlZiAtIG1hcmdpbiAqIDAuM2YpOworCQkJCQlkYXRhLT5hMmMxID0gcmVwbGljYXRlKHJlZiArIG1hcmdpbiAqIDAuM2YpOworCQkJCX0KKwkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCQl9CisKKwkJCWlmKHBpeGVsU3RhdGUub2NjbHVzaW9uRW5hYmxlZCkKKwkJCXsKKwkJCQlmb3IoaW50IGNsdXN0ZXIgPSAwOyBjbHVzdGVyIDwgY2x1c3RlckNvdW50OyBjbHVzdGVyKyspCisJCQkJeworCQkJCQlkYXRhLT5vY2NsdXNpb25bY2x1c3Rlcl0gPSAwOworCQkJCX0KKwkJCX0KKworCQkJI2lmIFBFUkZfUFJPRklMRQorCQkJCWZvcihpbnQgY2x1c3RlciA9IDA7IGNsdXN0ZXIgPCBjbHVzdGVyQ291bnQ7IGNsdXN0ZXIrKykKKwkJCQl7CisJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBQRVJGX1RJTUVSUzsgaSsrKQorCQkJCQl7CisJCQkJCQlkYXRhLT5jeWNsZXNbaV1bY2x1c3Rlcl0gPSAwOworCQkJCQl9CisJCQkJfQorCQkJI2VuZGlmCisKKwkJCS8vIFZpZXdwb3J0CisJCQl7CisJCQkJZmxvYXQgVyA9IDAuNWYgKiB2aWV3cG9ydC5nZXRXaWR0aCgpOworCQkJCWZsb2F0IEggPSAwLjVmICogdmlld3BvcnQuZ2V0SGVpZ2h0KCk7CisJCQkJZmxvYXQgTCA9IHZpZXdwb3J0LmdldExlZnQoKSArIFc7CisJCQkJZmxvYXQgVCA9IHZpZXdwb3J0LmdldFRvcCgpICsgSDsKKwkJCQlmbG9hdCBOID0gdmlld3BvcnQuZ2V0TmVhcigpOworCQkJCWZsb2F0IEYgPSB2aWV3cG9ydC5nZXRGYXIoKTsKKwkJCQlmbG9hdCBaID0gRiAtIE47CisKKwkJCQlpZihjb250ZXh0LT5pc0RyYXdUcmlhbmdsZShmYWxzZSkpCisJCQkJeworCQkJCQlOICs9IGRlcHRoQmlhczsKKwkJCQl9CisKKwkJCQlpZihjb21wbGVtZW50YXJ5RGVwdGhCdWZmZXIpCisJCQkJeworCQkJCQlaID0gLVo7CisJCQkJCU4gPSAxIC0gTjsKKwkJCQl9CisKKwkJCQlzdGF0aWMgY29uc3QgZmxvYXQgWFs1XVsxNl0gPSAgIC8vIEZyYWdtZW50IG9mZnNldHMKKwkJCQl7CisJCQkJCXsrMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZn0sICAgLy8gMSBzYW1wbGUKKwkJCQkJey0wLjI1MDBmLCArMC4yNTAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmfSwgICAvLyAyIHNhbXBsZXMKKwkJCQkJey0wLjMwMDBmLCArMC4xMDAwZiwgKzAuMzAwMGYsIC0wLjEwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmfSwgICAvLyA0IHNhbXBsZXMKKwkJCQkJeyswLjE4NzVmLCAtMC4zMTI1ZiwgKzAuMzEyNWYsIC0wLjQzNzVmLCAtMC4wNjI1ZiwgKzAuNDM3NWYsICswLjA2MjVmLCAtMC4xODc1ZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmfSwgICAvLyA4IHNhbXBsZXMKKwkJCQkJeyswLjI1NTNmLCAtMC4xMTU1ZiwgKzAuMTY2MWYsIC0wLjE4MjhmLCArMC4yMjkzZiwgLTAuNDEzMmYsIC0wLjE3NzNmLCAtMC4wNTc3ZiwgKzAuMzg5MWYsIC0wLjQ2NTZmLCArMC40MTAzZiwgKzAuNDI0OGYsIC0wLjIxMDlmLCArMC4zOTY2ZiwgLTAuMjY2NGYsIC0wLjM4NzJmfSAgICAvLyAxNiBzYW1wbGVzCisJCQkJfTsKKworCQkJCXN0YXRpYyBjb25zdCBmbG9hdCBZWzVdWzE2XSA9ICAgLy8gRnJhZ21lbnQgb2Zmc2V0cworCQkJCXsKKwkJCQkJeyswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmfSwgICAvLyAxIHNhbXBsZQorCQkJCQl7LTAuMjUwMGYsICswLjI1MDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGZ9LCAgIC8vIDIgc2FtcGxlcworCQkJCQl7LTAuMTAwMGYsIC0wLjMwMDBmLCArMC4xMDAwZiwgKzAuMzAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGZ9LCAgIC8vIDQgc2FtcGxlcworCQkJCQl7LTAuNDM3NWYsIC0wLjMxMjVmLCAtMC4xODc1ZiwgLTAuMDYyNWYsICswLjA2MjVmLCArMC4xODc1ZiwgKzAuMzEyNWYsICswLjQzNzVmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGYsICswLjAwMDBmLCArMC4wMDAwZiwgKzAuMDAwMGZ9LCAgIC8vIDggc2FtcGxlcworCQkJCQl7LTAuNDUwM2YsICswLjE4ODNmLCArMC4zNjg0ZiwgLTAuNDY2OGYsIC0wLjA2OTBmLCAtMC4xMzE1ZiwgKzAuNDk5OWYsICswLjA3MjhmLCArMC4xMDcwZiwgLTAuMzA4NmYsICswLjM3MjVmLCAtMC4xNTQ3ZiwgLTAuMTEwMmYsIC0wLjM1ODhmLCArMC4xNzg5ZiwgKzAuMDI2OWZ9ICAgIC8vIDE2IHNhbXBsZXMKKwkJCQl9OworCisJCQkJaW50IHMgPSBzdzo6bG9nMihzcyk7CisKKwkJCQlkYXRhLT5XV1dXeDE2ID0gcmVwbGljYXRlKFcgKiAxNik7CisJCQkJZGF0YS0+SEhISHgxNiA9IHJlcGxpY2F0ZSgtSCAqIDE2KTsKKwkJCQlkYXRhLT5MTExMeDE2ID0gcmVwbGljYXRlKEwgKiAxNik7CisJCQkJZGF0YS0+VFRUVHgxNiA9IHJlcGxpY2F0ZShUICogMTYpOworCQkJCWRhdGEtPlhYWFggPSByZXBsaWNhdGUoWFtzXVtxXSAvIFcpOworCQkJCWRhdGEtPllZWVkgPSByZXBsaWNhdGUoWVtzXVtxXSAvIEgpOworCQkJCWRhdGEtPm9mZlggPSByZXBsaWNhdGUoKzAuNWYgLyBXKTsKKwkJCQlkYXRhLT5vZmZZID0gcmVwbGljYXRlKC0wLjVmIC8gSCk7CisJCQkJZGF0YS0+cG9zU2NhbGUgPSBwb3NTY2FsZTsKKwkJCQlkYXRhLT5wb3NPZmZzZXQgPSBwb3NPZmZzZXQ7CisJCQkJZGF0YS0+dmlld3BvcnRIZWlnaHQgPSB2aWV3cG9ydC5nZXRIZWlnaHQoKTsgICAvLyBGSVhNRTogU2hvdWxkIHVzZSB0cnVlIHZpZXdwb3J0IHNpemUsIG5vdCBzY2lzc29yZWQgdmlld3BvcnQKKwkJCQlkYXRhLT5zbG9wZURlcHRoQmlhcyA9IHNsb3BlRGVwdGhCaWFzOworCQkJCWRhdGEtPmRlcHRoUmFuZ2UgPSBaOworCQkJCWRhdGEtPmRlcHRoTmVhciA9IE47CisJCQkJZHJhdy0+Y2xpcEZsYWdzID0gY2xpcEZsYWdzOworCisJCQkJaWYoY2xpcEZsYWdzKQorCQkJCXsKKwkJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTApIGRhdGEtPmNsaXBQbGFuZVswXSA9IGNsaXBQbGFuZVswXTsKKwkJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTEpIGRhdGEtPmNsaXBQbGFuZVsxXSA9IGNsaXBQbGFuZVsxXTsKKwkJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTIpIGRhdGEtPmNsaXBQbGFuZVsyXSA9IGNsaXBQbGFuZVsyXTsKKwkJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTMpIGRhdGEtPmNsaXBQbGFuZVszXSA9IGNsaXBQbGFuZVszXTsKKwkJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTQpIGRhdGEtPmNsaXBQbGFuZVs0XSA9IGNsaXBQbGFuZVs0XTsKKwkJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTUpIGRhdGEtPmNsaXBQbGFuZVs1XSA9IGNsaXBQbGFuZVs1XTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFRhcmdldAorCQkJeworCQkJCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspCisJCQkJeworCQkJCQlkcmF3LT5yZW5kZXJUYXJnZXRbaW5kZXhdID0gY29udGV4dC0+cmVuZGVyVGFyZ2V0W2luZGV4XTsKKworCQkJCQlpZihkcmF3LT5yZW5kZXJUYXJnZXRbaW5kZXhdKQorCQkJCQl7CisJCQkJCQlkYXRhLT5jb2xvckJ1ZmZlcltpbmRleF0gPSAodW5zaWduZWQgaW50Kiljb250ZXh0LT5yZW5kZXJUYXJnZXRbaW5kZXhdLT5sb2NrSW50ZXJuYWwoMCwgMCwgcSAqIG1zLCBMT0NLX1JFQURXUklURSwgTUFOQUdFRCk7CisJCQkJCQlkYXRhLT5jb2xvclBpdGNoQltpbmRleF0gPSBjb250ZXh0LT5yZW5kZXJUYXJnZXRbaW5kZXhdLT5nZXRJbnRlcm5hbFBpdGNoQigpOworCQkJCQkJZGF0YS0+Y29sb3JTbGljZUJbaW5kZXhdID0gY29udGV4dC0+cmVuZGVyVGFyZ2V0W2luZGV4XS0+Z2V0SW50ZXJuYWxTbGljZUIoKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWRyYXctPmRlcHRoU3RlbmNpbCA9IGNvbnRleHQtPmRlcHRoU3RlbmNpbDsKKworCQkJCWlmKGRyYXctPmRlcHRoU3RlbmNpbCkKKwkJCQl7CisJCQkJCWRhdGEtPmRlcHRoQnVmZmVyID0gKGZsb2F0Kiljb250ZXh0LT5kZXB0aFN0ZW5jaWwtPmxvY2tJbnRlcm5hbCgwLCAwLCBxICogbXMsIExPQ0tfUkVBRFdSSVRFLCBNQU5BR0VEKTsKKwkJCQkJZGF0YS0+ZGVwdGhQaXRjaEIgPSBjb250ZXh0LT5kZXB0aFN0ZW5jaWwtPmdldEludGVybmFsUGl0Y2hCKCk7CisJCQkJCWRhdGEtPmRlcHRoU2xpY2VCID0gY29udGV4dC0+ZGVwdGhTdGVuY2lsLT5nZXRJbnRlcm5hbFNsaWNlQigpOworCisJCQkJCWRhdGEtPnN0ZW5jaWxCdWZmZXIgPSAodW5zaWduZWQgY2hhciopY29udGV4dC0+ZGVwdGhTdGVuY2lsLT5sb2NrU3RlbmNpbChxICogbXMsIE1BTkFHRUQpOworCQkJCQlkYXRhLT5zdGVuY2lsUGl0Y2hCID0gY29udGV4dC0+ZGVwdGhTdGVuY2lsLT5nZXRTdGVuY2lsUGl0Y2hCKCk7CisJCQkJCWRhdGEtPnN0ZW5jaWxTbGljZUIgPSBjb250ZXh0LT5kZXB0aFN0ZW5jaWwtPmdldFN0ZW5jaWxTbGljZUIoKTsKKwkJCQl9CisJCQl9CisKKwkJCWRyYXctPnByaW1pdGl2ZSA9IDA7CisJCQlkcmF3LT5jb3VudCA9IGNvdW50OworCisJCQlkcmF3LT5yZWZlcmVuY2VzID0gKGNvdW50ICsgYmF0Y2ggLSAxKSAvIGJhdGNoOworCisJCQltdXRleC5sb2NrKCk7CisJCQluZXh0RHJhdysrOworCQkJbXV0ZXgudW5sb2NrKCk7CisKKwkJCWlmKCF0aHJlYWRzQXdha2UpCisJCQl7CisJCQkJc3VzcGVuZFswXS0+d2FpdCgpOworCisJCQkJdGhyZWFkc0F3YWtlID0gMTsKKwkJCQl0YXNrWzBdLnR5cGUgPSBUYXNrOjpSRVNVTUU7CisKKwkJCQlyZXN1bWVbMF0tPnNpZ25hbCgpOworCQkJfQorCQl9CisJfQorCisJdm9pZCBSZW5kZXJlcjo6dGhyZWFkRnVuY3Rpb24odm9pZCAqcGFyYW1ldGVycykKKwl7CisJCVJlbmRlcmVyICpyZW5kZXJlciA9IHN0YXRpY19jYXN0PFBhcmFtZXRlcnMqPihwYXJhbWV0ZXJzKS0+cmVuZGVyZXI7CisJCWludCB0aHJlYWRJbmRleCA9IHN0YXRpY19jYXN0PFBhcmFtZXRlcnMqPihwYXJhbWV0ZXJzKS0+dGhyZWFkSW5kZXg7CisKKwkJaWYobG9nUHJlY2lzaW9uIDwgSUVFRSkKKwkJeworCQkJX2NvbnRyb2xmcChfRE5fRkxVU0gsIF9NQ1dfRE4pOworCQl9CisKKwkJcmVuZGVyZXItPnRocmVhZExvb3AodGhyZWFkSW5kZXgpOworCX0KKworCXZvaWQgUmVuZGVyZXI6OnRocmVhZExvb3AoaW50IHRocmVhZEluZGV4KQorCXsKKwkJd2hpbGUoIWV4aXRUaHJlYWRzKQorCQl7CisJCQl0YXNrTG9vcCh0aHJlYWRJbmRleCk7CisKKwkJCXN1c3BlbmRbdGhyZWFkSW5kZXhdLT5zaWduYWwoKTsKKwkJCXJlc3VtZVt0aHJlYWRJbmRleF0tPndhaXQoKTsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnRhc2tMb29wKGludCB0aHJlYWRJbmRleCkKKwl7CisJCXdoaWxlKHRhc2tbdGhyZWFkSW5kZXhdLnR5cGUgIT0gVGFzazo6U1VTUEVORCkKKwkJeworCQkJc2NoZWR1bGVUYXNrKHRocmVhZEluZGV4KTsKKwkJCWV4ZWN1dGVUYXNrKHRocmVhZEluZGV4KTsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OmZpbmRBdmFpbGFibGVUYXNrcygpCisJeworCQkvLyBGaW5kIHBpeGVsIHRhc2tzCisJCWZvcihpbnQgY2x1c3RlciA9IDA7IGNsdXN0ZXIgPCBjbHVzdGVyQ291bnQ7IGNsdXN0ZXIrKykKKwkJeworCQkJaWYoIXBpeGVsUHJvZ3Jlc3NbY2x1c3Rlcl0uZXhlY3V0aW5nKQorCQkJeworCQkJCWZvcihpbnQgdW5pdCA9IDA7IHVuaXQgPCB1bml0Q291bnQ7IHVuaXQrKykKKwkJCQl7CisJCQkJCWlmKHByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLnJlZmVyZW5jZXMgPiAwKSAgIC8vIENvbnRhaW5zIHByb2Nlc3NlZCBwcmltaXRpdmVzCisJCQkJCXsKKwkJCQkJCWlmKHBpeGVsUHJvZ3Jlc3NbY2x1c3Rlcl0uZHJhd0NhbGwgPT0gcHJpbWl0aXZlUHJvZ3Jlc3NbdW5pdF0uZHJhd0NhbGwpCisJCQkJCQl7CisJCQkJCQkJaWYocGl4ZWxQcm9ncmVzc1tjbHVzdGVyXS5wcm9jZXNzZWRQcmltaXRpdmVzID09IHByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLmZpcnN0UHJpbWl0aXZlKSAgIC8vIFByZXZpb3VzIHByaW1pdGl2ZXMgaGF2ZSBiZWVuIHJlbmRlcmVkCisJCQkJCQkJeworCQkJCQkJCQlUYXNrICZ0YXNrID0gdGFza1F1ZXVlW3FIZWFkXTsKKwkJCQkJCQkJdGFzay50eXBlID0gVGFzazo6UElYRUxTOworCQkJCQkJCQl0YXNrLnByaW1pdGl2ZVVuaXQgPSB1bml0OworCQkJCQkJCQl0YXNrLnBpeGVsQ2x1c3RlciA9IGNsdXN0ZXI7CisKKwkJCQkJCQkJcGl4ZWxQcm9ncmVzc1tjbHVzdGVyXS5leGVjdXRpbmcgPSB0cnVlOworCisJCQkJCQkJCS8vIENvbW1pdCB0byB0aGUgdGFzayBxdWV1ZQorCQkJCQkJCQlxSGVhZCA9IChxSGVhZCArIDEpICUgMzI7CisJCQkJCQkJCXFTaXplKys7CisKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCisJCS8vIEZpbmQgcHJpbWl0aXZlIHRhc2tzCisJCWlmKGN1cnJlbnREcmF3ID09IG5leHREcmF3KQorCQl7CisJCQlyZXR1cm47ICAgLy8gTm8gbW9yZSBwcmltaXRpdmVzIHRvIHByb2Nlc3MKKwkJfQorCisJCWZvcihpbnQgdW5pdCA9IDA7IHVuaXQgPCB1bml0Q291bnQ7IHVuaXQrKykKKwkJeworCQkJRHJhd0NhbGwgKmRyYXcgPSBkcmF3TGlzdFtjdXJyZW50RHJhdyAlIERSQVdfQ09VTlRdOworCisJCQlpZihkcmF3LT5wcmltaXRpdmUgPj0gZHJhdy0+Y291bnQpCisJCQl7CisJCQkJY3VycmVudERyYXcrKzsKKworCQkJCWlmKGN1cnJlbnREcmF3ID09IG5leHREcmF3KQorCQkJCXsKKwkJCQkJcmV0dXJuOyAgIC8vIE5vIG1vcmUgcHJpbWl0aXZlcyB0byBwcm9jZXNzCisJCQkJfQorCisJCQkJZHJhdyA9IGRyYXdMaXN0W2N1cnJlbnREcmF3ICUgRFJBV19DT1VOVF07CisJCQl9CisKKwkJCWlmKCFwcmltaXRpdmVQcm9ncmVzc1t1bml0XS5yZWZlcmVuY2VzKSAgIC8vIFRhc2sgbm90IGFscmVhZHkgYmVpbmcgZXhlY3V0ZWQgYW5kIG5vdCBzdGlsbCBpbiB1c2UgYnkgYSBwaXhlbCB1bml0CisJCQl7CisJCQkJaW50IHByaW1pdGl2ZSA9IGRyYXctPnByaW1pdGl2ZTsKKwkJCQlpbnQgY291bnQgPSBkcmF3LT5jb3VudDsKKwkJCQlpbnQgYmF0Y2ggPSBkcmF3LT5iYXRjaFNpemU7CisKKwkJCQlwcmltaXRpdmVQcm9ncmVzc1t1bml0XS5kcmF3Q2FsbCA9IGN1cnJlbnREcmF3OworCQkJCXByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLmZpcnN0UHJpbWl0aXZlID0gcHJpbWl0aXZlOworCQkJCXByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLnByaW1pdGl2ZUNvdW50ID0gY291bnQgLSBwcmltaXRpdmUgPj0gYmF0Y2ggPyBiYXRjaCA6IGNvdW50IC0gcHJpbWl0aXZlOworCisJCQkJZHJhdy0+cHJpbWl0aXZlICs9IGJhdGNoOworCisJCQkJVGFzayAmdGFzayA9IHRhc2tRdWV1ZVtxSGVhZF07CisJCQkJdGFzay50eXBlID0gVGFzazo6UFJJTUlUSVZFUzsKKwkJCQl0YXNrLnByaW1pdGl2ZVVuaXQgPSB1bml0OworCisJCQkJcHJpbWl0aXZlUHJvZ3Jlc3NbdW5pdF0ucmVmZXJlbmNlcyA9IC0xOworCisJCQkJLy8gQ29tbWl0IHRvIHRoZSB0YXNrIHF1ZXVlCisJCQkJcUhlYWQgPSAocUhlYWQgKyAxKSAlIDMyOworCQkJCXFTaXplKys7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzY2hlZHVsZVRhc2soaW50IHRocmVhZEluZGV4KQorCXsKKwkJbXV0ZXgubG9jaygpOworCisJCWlmKChpbnQpcVNpemUgPCB0aHJlYWRDb3VudCAtIHRocmVhZHNBd2FrZSArIDEpCisJCXsKKwkJCWZpbmRBdmFpbGFibGVUYXNrcygpOworCQl9CisKKwkJaWYocVNpemUgIT0gMCkKKwkJeworCQkJdGFza1t0aHJlYWRJbmRleF0gPSB0YXNrUXVldWVbKHFIZWFkIC0gcVNpemUpICUgMzJdOworCQkJcVNpemUtLTsKKworCQkJaWYodGhyZWFkc0F3YWtlICE9IHRocmVhZENvdW50KQorCQkJeworCQkJCWludCB3YWtldXAgPSBxU2l6ZSAtIHRocmVhZHNBd2FrZSArIDE7CisKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGhyZWFkQ291bnQgJiYgd2FrZXVwID4gMDsgaSsrKQorCQkJCXsKKwkJCQkJaWYodGFza1tpXS50eXBlID09IFRhc2s6OlNVU1BFTkQpCisJCQkJCXsKKwkJCQkJCXN1c3BlbmRbaV0tPndhaXQoKTsKKwkJCQkJCXRhc2tbaV0udHlwZSA9IFRhc2s6OlJFU1VNRTsKKwkJCQkJCXJlc3VtZVtpXS0+c2lnbmFsKCk7CisKKwkJCQkJCXRocmVhZHNBd2FrZSsrOworCQkJCQkJd2FrZXVwLS07CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl0YXNrW3RocmVhZEluZGV4XS50eXBlID0gVGFzazo6U1VTUEVORDsKKworCQkJdGhyZWFkc0F3YWtlLS07CisJCX0KKworCQltdXRleC51bmxvY2soKTsKKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpleGVjdXRlVGFzayhpbnQgdGhyZWFkSW5kZXgpCisJeworCQkjaWYgUEVSRl9IVUQKKwkJCWludDY0X3Qgc3RhcnRUaWNrID0gVGltZXI6OnRpY2tzKCk7CisJCSNlbmRpZgorCisJCXN3aXRjaCh0YXNrW3RocmVhZEluZGV4XS50eXBlKQorCQl7CisJCWNhc2UgVGFzazo6UFJJTUlUSVZFUzoKKwkJCXsKKwkJCQlpbnQgdW5pdCA9IHRhc2tbdGhyZWFkSW5kZXhdLnByaW1pdGl2ZVVuaXQ7CisJCQkJCisJCQkJaW50IGlucHV0ID0gcHJpbWl0aXZlUHJvZ3Jlc3NbdW5pdF0uZmlyc3RQcmltaXRpdmU7CisJCQkJaW50IGNvdW50ID0gcHJpbWl0aXZlUHJvZ3Jlc3NbdW5pdF0ucHJpbWl0aXZlQ291bnQ7CisJCQkJRHJhd0NhbGwgKmRyYXcgPSBkcmF3TGlzdFtwcmltaXRpdmVQcm9ncmVzc1t1bml0XS5kcmF3Q2FsbCAlIERSQVdfQ09VTlRdOworCQkJCWludCAoKnNldHVwUHJpbWl0aXZlcykoUmVuZGVyZXIgKnJlbmRlcmVyLCBpbnQgYmF0Y2gsIGludCBjb3VudCkgPSBkcmF3LT5zZXR1cFByaW1pdGl2ZXM7CisKKwkJCQlwcm9jZXNzUHJpbWl0aXZlVmVydGljZXModW5pdCwgaW5wdXQsIGNvdW50LCBkcmF3LT5jb3VudCwgdGhyZWFkSW5kZXgpOworCisJCQkJI2lmIFBFUkZfSFVECisJCQkJCWludDY0X3QgdGltZSA9IFRpbWVyOjp0aWNrcygpOworCQkJCQl2ZXJ0ZXhUaW1lW3RocmVhZEluZGV4XSArPSB0aW1lIC0gc3RhcnRUaWNrOworCQkJCQlzdGFydFRpY2sgPSB0aW1lOworCQkJCSNlbmRpZgorCisJCQkJaW50IHZpc2libGUgPSBzZXR1cFByaW1pdGl2ZXModGhpcywgdW5pdCwgY291bnQpOworCisJCQkJcHJpbWl0aXZlUHJvZ3Jlc3NbdW5pdF0udmlzaWJsZSA9IHZpc2libGU7CisJCQkJcHJpbWl0aXZlUHJvZ3Jlc3NbdW5pdF0ucmVmZXJlbmNlcyA9IGNsdXN0ZXJDb3VudDsKKworCQkJCSNpZiBQRVJGX0hVRAorCQkJCQlzZXR1cFRpbWVbdGhyZWFkSW5kZXhdICs9IFRpbWVyOjp0aWNrcygpIC0gc3RhcnRUaWNrOworCQkJCSNlbmRpZgorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGFzazo6UElYRUxTOgorCQkJeworCQkJCWludCB1bml0ID0gdGFza1t0aHJlYWRJbmRleF0ucHJpbWl0aXZlVW5pdDsKKwkJCQlpbnQgdmlzaWJsZSA9IHByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLnZpc2libGU7CisKKwkJCQlpZih2aXNpYmxlID4gMCkKKwkJCQl7CisJCQkJCWludCBjbHVzdGVyID0gdGFza1t0aHJlYWRJbmRleF0ucGl4ZWxDbHVzdGVyOworCQkJCQlQcmltaXRpdmUgKnByaW1pdGl2ZSA9IHByaW1pdGl2ZUJhdGNoW3VuaXRdOworCQkJCQlEcmF3Q2FsbCAqZHJhdyA9IGRyYXdMaXN0W3BpeGVsUHJvZ3Jlc3NbY2x1c3Rlcl0uZHJhd0NhbGwgJSBEUkFXX0NPVU5UXTsKKwkJCQkJRHJhd0RhdGEgKmRhdGEgPSBkcmF3LT5kYXRhOworCQkJCQlQaXhlbFByb2Nlc3Nvcjo6Um91dGluZVBvaW50ZXIgcGl4ZWxSb3V0aW5lID0gZHJhdy0+cGl4ZWxQb2ludGVyOworCisJCQkJCXBpeGVsUm91dGluZShwcmltaXRpdmUsIHZpc2libGUsIGNsdXN0ZXIsIGRhdGEpOworCQkJCX0KKworCQkJCWZpbmlzaFJlbmRlcmluZyh0YXNrW3RocmVhZEluZGV4XSk7CisKKwkJCQkjaWYgUEVSRl9IVUQKKwkJCQkJcGl4ZWxUaW1lW3RocmVhZEluZGV4XSArPSBUaW1lcjo6dGlja3MoKSAtIHN0YXJ0VGljazsKKwkJCQkjZW5kaWYKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRhc2s6OlJFU1VNRToKKwkJCWJyZWFrOworCQljYXNlIFRhc2s6OlNVU1BFTkQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpmaW5pc2hSZW5kZXJpbmcoVGFzayAmcGl4ZWxUYXNrKQorCXsKKwkJaW50IHVuaXQgPSBwaXhlbFRhc2sucHJpbWl0aXZlVW5pdDsKKwkJaW50IGNsdXN0ZXIgPSBwaXhlbFRhc2sucGl4ZWxDbHVzdGVyOworCisJCURyYXdDYWxsICZkcmF3ID0gKmRyYXdMaXN0W3ByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLmRyYXdDYWxsICUgRFJBV19DT1VOVF07CisJCURyYXdEYXRhICZkYXRhID0gKmRyYXcuZGF0YTsKKwkJaW50IHByaW1pdGl2ZSA9IHByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLmZpcnN0UHJpbWl0aXZlOworCQlpbnQgY291bnQgPSBwcmltaXRpdmVQcm9ncmVzc1t1bml0XS5wcmltaXRpdmVDb3VudDsKKworCQlwaXhlbFByb2dyZXNzW2NsdXN0ZXJdLnByb2Nlc3NlZFByaW1pdGl2ZXMgPSBwcmltaXRpdmUgKyBjb3VudDsKKworCQlpZihwaXhlbFByb2dyZXNzW2NsdXN0ZXJdLnByb2Nlc3NlZFByaW1pdGl2ZXMgPj0gZHJhdy5jb3VudCkKKwkJeworCQkJcGl4ZWxQcm9ncmVzc1tjbHVzdGVyXS5kcmF3Q2FsbCsrOworCQkJcGl4ZWxQcm9ncmVzc1tjbHVzdGVyXS5wcm9jZXNzZWRQcmltaXRpdmVzID0gMDsKKwkJfQorCisJCWludCByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgodm9sYXRpbGUgbG9uZyopJnByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLnJlZmVyZW5jZXMpOworCisJCWlmKHJlZiA9PSAwKQorCQl7CisJCQlyZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgodm9sYXRpbGUgbG9uZyopJmRyYXcucmVmZXJlbmNlcyk7CisKKwkJCWlmKHJlZiA9PSAwKQorCQkJeworCQkJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCQkJZm9yKGludCBjbHVzdGVyID0gMDsgY2x1c3RlciA8IGNsdXN0ZXJDb3VudDsgY2x1c3RlcisrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgUEVSRl9USU1FUlM7IGkrKykKKwkJCQkJCXsKKwkJCQkJCQlwcm9maWxlci5jeWNsZXNbaV0gKz0gZGF0YS5jeWNsZXNbaV1bY2x1c3Rlcl07CisJCQkJCQl9CisJCQkJCX0KKwkJCQkjZW5kaWYKKworCQkJCWlmKGRyYXcucXVlcmllcykKKwkJCQl7CisJCQkJCWZvcihzdGQ6Omxpc3Q8UXVlcnkqPjo6aXRlcmF0b3IgcSA9IGRyYXcucXVlcmllcy0+YmVnaW4oKTsgcSAhPSBkcmF3LnF1ZXJpZXMtPmVuZCgpOyBxKyspCisJCQkJCXsKKwkJCQkJCVF1ZXJ5ICpxdWVyeSA9ICpxOworCisJCQkJCQlmb3IoaW50IGNsdXN0ZXIgPSAwOyBjbHVzdGVyIDwgY2x1c3RlckNvdW50OyBjbHVzdGVyKyspCisJCQkJCQl7CisJCQkJCQkJSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgodm9sYXRpbGUgbG9uZyopJnF1ZXJ5LT5kYXRhLCBkYXRhLm9jY2x1c2lvbltjbHVzdGVyXSk7CisJCQkJCQl9CisKKwkJCQkJCUludGVybG9ja2VkRGVjcmVtZW50KCh2b2xhdGlsZSBsb25nKikmcXVlcnktPnJlZmVyZW5jZSk7CisJCQkJCX0KKworCQkJCQlkZWxldGUgZHJhdy5xdWVyaWVzOworCQkJCQlkcmF3LnF1ZXJpZXMgPSAwOworCQkJCX0KKworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspCisJCQkJeworCQkJCQlpZihkcmF3LnJlbmRlclRhcmdldFtpXSkKKwkJCQkJeworCQkJCQkJZHJhdy5yZW5kZXJUYXJnZXRbaV0tPnVubG9ja0ludGVybmFsKCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZihkcmF3LmRlcHRoU3RlbmNpbCkKKwkJCQl7CisJCQkJCWRyYXcuZGVwdGhTdGVuY2lsLT51bmxvY2tJbnRlcm5hbCgpOworCQkJCQlkcmF3LmRlcHRoU3RlbmNpbC0+dW5sb2NrU3RlbmNpbCgpOworCQkJCX0KKworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCAxNiArIDQ7IGkrKykKKwkJCQl7CisJCQkJCWlmKGRyYXcudGV4dHVyZVtpXSkKKwkJCQkJeworCQkJCQkJZHJhdy50ZXh0dXJlW2ldLT51bmxvY2soKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJCXsKKwkJCQkJaWYoZHJhdy52ZXJ0ZXhTdHJlYW1baV0pCisJCQkJCXsKKwkJCQkJCWRyYXcudmVydGV4U3RyZWFtW2ldLT51bmxvY2soKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmKGRyYXcuaW5kZXhCdWZmZXIpCisJCQkJeworCQkJCQlkcmF3LmluZGV4QnVmZmVyLT51bmxvY2soKTsKKwkJCQl9CisKKwkJCQlkcmF3LnZlcnRleFJvdXRpbmUtPnVuYmluZCgpOworCQkJCWRyYXcuc2V0dXBSb3V0aW5lLT51bmJpbmQoKTsKKwkJCQlkcmF3LnBpeGVsUm91dGluZS0+dW5iaW5kKCk7CisKKwkJCQlkcmF3LnJlZmVyZW5jZXMgPSAtMTsKKwkJCQlyZXN1bWVBcHAtPnNpZ25hbCgpOworCQkJfQorCQl9CisKKwkJcGl4ZWxQcm9ncmVzc1tjbHVzdGVyXS5leGVjdXRpbmcgPSBmYWxzZTsKKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpwcm9jZXNzUHJpbWl0aXZlVmVydGljZXMoaW50IHVuaXQsIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgbG9vcCwgaW50IHRocmVhZCkKKwl7CisJCVRyaWFuZ2xlICp0cmlhbmdsZSA9IHRyaWFuZ2xlQmF0Y2hbdW5pdF07CisJCURyYXdDYWxsICpkcmF3ID0gZHJhd0xpc3RbcHJpbWl0aXZlUHJvZ3Jlc3NbdW5pdF0uZHJhd0NhbGwgJSBEUkFXX0NPVU5UXTsKKwkJRHJhd0RhdGEgKmRhdGEgPSBkcmF3LT5kYXRhOworCQlWZXJ0ZXhUYXNrICp0YXNrID0gdmVydGV4VGFza1t0aHJlYWRdOworCisJCWNvbnN0IHZvaWQgKmluZGljZXMgPSBkYXRhLT5pbmRpY2VzOworCQlWZXJ0ZXhQcm9jZXNzb3I6OlJvdXRpbmVQb2ludGVyIHZlcnRleFJvdXRpbmUgPSBkcmF3LT52ZXJ0ZXhQb2ludGVyOworCisJCWlmKHRhc2stPnZlcnRleENhY2hlLmRyYXdDYWxsICE9IHByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLmRyYXdDYWxsKQorCQl7CisJCQl0YXNrLT52ZXJ0ZXhDYWNoZS5jbGVhcigpOworCQkJdGFzay0+dmVydGV4Q2FjaGUuZHJhd0NhbGwgPSBwcmltaXRpdmVQcm9ncmVzc1t1bml0XS5kcmF3Q2FsbDsKKwkJfQorCisJCXVuc2lnbmVkIGludCBiYXRjaFsxMjhdWzNdOyAgIC8vIEZJWE1FOiBBZGp1c3QgdG8gZHluYW1pYyBiYXRjaCBzaXplCisKKwkJc3dpdGNoKGRyYXctPmRyYXdUeXBlKQorCQl7CisJCWNhc2UgQ29udGV4dDo6RFJBV19QT0lOVExJU1Q6CisJCQl7CisJCQkJdW5zaWduZWQgaW50IGluZGV4ID0gc3RhcnQ7CisKKwkJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCQl7CisJCQkJCWJhdGNoW2ldWzBdID0gaW5kZXg7CisJCQkJCWJhdGNoW2ldWzFdID0gaW5kZXg7CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXg7CisKKwkJCQkJaW5kZXggKz0gMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpEUkFXX0xJTkVMSVNUOgorCQkJeworCQkJCXVuc2lnbmVkIGludCBpbmRleCA9IDIgKiBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSBpbmRleCArIDA7CisJCQkJCWJhdGNoW2ldWzFdID0gaW5kZXggKyAxOworCQkJCQliYXRjaFtpXVsyXSA9IGluZGV4ICsgMTsKKworCQkJCQlpbmRleCArPSAyOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfTElORVNUUklQOgorCQkJeworCQkJCXVuc2lnbmVkIGludCBpbmRleCA9IHN0YXJ0OworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9IGluZGV4ICsgMDsKKwkJCQkJYmF0Y2hbaV1bMV0gPSBpbmRleCArIDE7CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXggKyAxOworCisJCQkJCWluZGV4ICs9IDE7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6RFJBV19MSU5FTE9PUDoKKwkJCXsKKwkJCQl1bnNpZ25lZCBpbnQgaW5kZXggPSBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSAoaW5kZXggKyAwKSAlIGxvb3A7CisJCQkJCWJhdGNoW2ldWzFdID0gKGluZGV4ICsgMSkgJSBsb29wOworCQkJCQliYXRjaFtpXVsyXSA9IChpbmRleCArIDEpICUgbG9vcDsKKworCQkJCQlpbmRleCArPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfVFJJQU5HTEVMSVNUOgorCQkJeworCQkJCXVuc2lnbmVkIGludCBpbmRleCA9IDMgKiBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSBpbmRleCArIDA7CisJCQkJCWJhdGNoW2ldWzFdID0gaW5kZXggKyAxOworCQkJCQliYXRjaFtpXVsyXSA9IGluZGV4ICsgMjsKKworCQkJCQlpbmRleCArPSAzOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfVFJJQU5HTEVTVFJJUDoKKwkJCXsKKwkJCQl1bnNpZ25lZCBpbnQgaW5kZXggPSBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSBpbmRleCArIDA7CisJCQkJCWJhdGNoW2ldWzFdID0gaW5kZXggKyAoaW5kZXggJiAxKSArIDE7CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXggKyAofmluZGV4ICYgMSkgKyAxOworCisJCQkJCWluZGV4ICs9IDE7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6RFJBV19UUklBTkdMRUZBTjoKKwkJCXsKKwkJCQl1bnNpZ25lZCBpbnQgaW5kZXggPSBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSBpbmRleCArIDE7CisJCQkJCWJhdGNoW2ldWzFdID0gaW5kZXggKyAyOworCQkJCQliYXRjaFtpXVsyXSA9IDA7CisKKwkJCQkJaW5kZXggKz0gMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpEUkFXX0lOREVYRURQT0lOVExJU1Q4OgorCQkJeworCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluZGV4ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWluZGljZXMgKyBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSAqaW5kZXg7CisJCQkJCWJhdGNoW2ldWzFdID0gKmluZGV4OworCQkJCQliYXRjaFtpXVsyXSA9ICppbmRleDsKKworCQkJCQlpbmRleCArPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfSU5ERVhFRFBPSU5UTElTVDE2OgorCQkJeworCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0ICppbmRleCA9IChjb25zdCB1bnNpZ25lZCBzaG9ydCopaW5kaWNlcyArIHN0YXJ0OworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9ICppbmRleDsKKwkJCQkJYmF0Y2hbaV1bMV0gPSAqaW5kZXg7CisJCQkJCWJhdGNoW2ldWzJdID0gKmluZGV4OworCisJCQkJCWluZGV4ICs9IDE7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6RFJBV19JTkRFWEVEUE9JTlRMSVNUMzI6CisJCQl7CisJCQkJY29uc3QgdW5zaWduZWQgaW50ICppbmRleCA9IChjb25zdCB1bnNpZ25lZCBpbnQqKWluZGljZXMgKyBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSAqaW5kZXg7CisJCQkJCWJhdGNoW2ldWzFdID0gKmluZGV4OworCQkJCQliYXRjaFtpXVsyXSA9ICppbmRleDsKKworCQkJCQlpbmRleCArPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfSU5ERVhFRExJTkVMSVNUODoKKwkJCXsKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICppbmRleCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilpbmRpY2VzICsgMiAqIHN0YXJ0OworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9IGluZGV4WzBdOworCQkJCQliYXRjaFtpXVsxXSA9IGluZGV4WzFdOworCQkJCQliYXRjaFtpXVsyXSA9IGluZGV4WzFdOworCisJCQkJCWluZGV4ICs9IDI7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6RFJBV19JTkRFWEVETElORUxJU1QxNjoKKwkJCXsKKwkJCQljb25zdCB1bnNpZ25lZCBzaG9ydCAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgc2hvcnQqKWluZGljZXMgKyAyICogc3RhcnQ7CisKKwkJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCQl7CisJCQkJCWJhdGNoW2ldWzBdID0gaW5kZXhbMF07CisJCQkJCWJhdGNoW2ldWzFdID0gaW5kZXhbMV07CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXhbMV07CisKKwkJCQkJaW5kZXggKz0gMjsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpEUkFXX0lOREVYRURMSU5FTElTVDMyOgorCQkJeworCQkJCWNvbnN0IHVuc2lnbmVkIGludCAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgaW50KilpbmRpY2VzICsgMiAqIHN0YXJ0OworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9IGluZGV4WzBdOworCQkJCQliYXRjaFtpXVsxXSA9IGluZGV4WzFdOworCQkJCQliYXRjaFtpXVsyXSA9IGluZGV4WzFdOworCisJCQkJCWluZGV4ICs9IDI7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6RFJBV19JTkRFWEVETElORVNUUklQODoKKwkJCXsKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICppbmRleCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilpbmRpY2VzICsgc3RhcnQ7CisKKwkJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCQl7CisJCQkJCWJhdGNoW2ldWzBdID0gaW5kZXhbMF07CisJCQkJCWJhdGNoW2ldWzFdID0gaW5kZXhbMV07CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXhbMV07CisKKwkJCQkJaW5kZXggKz0gMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpEUkFXX0lOREVYRURMSU5FU1RSSVAxNjoKKwkJCXsKKwkJCQljb25zdCB1bnNpZ25lZCBzaG9ydCAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgc2hvcnQqKWluZGljZXMgKyBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSBpbmRleFswXTsKKwkJCQkJYmF0Y2hbaV1bMV0gPSBpbmRleFsxXTsKKwkJCQkJYmF0Y2hbaV1bMl0gPSBpbmRleFsxXTsKKworCQkJCQlpbmRleCArPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfSU5ERVhFRExJTkVTVFJJUDMyOgorCQkJeworCQkJCWNvbnN0IHVuc2lnbmVkIGludCAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgaW50KilpbmRpY2VzICsgc3RhcnQ7CisKKwkJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCQl7CisJCQkJCWJhdGNoW2ldWzBdID0gaW5kZXhbMF07CisJCQkJCWJhdGNoW2ldWzFdID0gaW5kZXhbMV07CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXhbMV07CisKKwkJCQkJaW5kZXggKz0gMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpEUkFXX0lOREVYRURMSU5FTE9PUDg6CisJCQl7CisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgY2hhciopaW5kaWNlcyArIHN0YXJ0OworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9IGluZGV4WyhpICsgMCkgJSBsb29wXTsKKwkJCQkJYmF0Y2hbaV1bMV0gPSBpbmRleFsoaSArIDEpICUgbG9vcF07CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXhbKGkgKyAxKSAlIGxvb3BdOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfSU5ERVhFRExJTkVMT09QMTY6CisJCQl7CisJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQgKmluZGV4ID0gKGNvbnN0IHVuc2lnbmVkIHNob3J0KilpbmRpY2VzICsgc3RhcnQ7CisKKwkJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCQl7CisJCQkJCWJhdGNoW2ldWzBdID0gaW5kZXhbKGkgKyAwKSAlIGxvb3BdOworCQkJCQliYXRjaFtpXVsxXSA9IGluZGV4WyhpICsgMSkgJSBsb29wXTsKKwkJCQkJYmF0Y2hbaV1bMl0gPSBpbmRleFsoaSArIDEpICUgbG9vcF07CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6RFJBV19JTkRFWEVETElORUxPT1AzMjoKKwkJCXsKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgKmluZGV4ID0gKGNvbnN0IHVuc2lnbmVkIGludCopaW5kaWNlcyArIHN0YXJ0OworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9IGluZGV4WyhpICsgMCkgJSBsb29wXTsKKwkJCQkJYmF0Y2hbaV1bMV0gPSBpbmRleFsoaSArIDEpICUgbG9vcF07CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXhbKGkgKyAxKSAlIGxvb3BdOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDg6CisJCQl7CisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgY2hhciopaW5kaWNlcyArIDMgKiBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSBpbmRleFswXTsKKwkJCQkJYmF0Y2hbaV1bMV0gPSBpbmRleFsxXTsKKwkJCQkJYmF0Y2hbaV1bMl0gPSBpbmRleFsyXTsKKworCQkJCQlpbmRleCArPSAzOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDE2OgorCQkJeworCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0ICppbmRleCA9IChjb25zdCB1bnNpZ25lZCBzaG9ydCopaW5kaWNlcyArIDMgKiBzdGFydDsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSBpbmRleFswXTsKKwkJCQkJYmF0Y2hbaV1bMV0gPSBpbmRleFsxXTsKKwkJCQkJYmF0Y2hbaV1bMl0gPSBpbmRleFsyXTsKKworCQkJCQlpbmRleCArPSAzOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDMyOgorCQkJeworCQkJCWNvbnN0IHVuc2lnbmVkIGludCAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgaW50KilpbmRpY2VzICsgMyAqIHN0YXJ0OworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9IGluZGV4WzBdOworCQkJCQliYXRjaFtpXVsxXSA9IGluZGV4WzFdOworCQkJCQliYXRjaFtpXVsyXSA9IGluZGV4WzJdOworCisJCQkJCWluZGV4ICs9IDM7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6RFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDg6CisJCQl7CisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgY2hhciopaW5kaWNlcyArIHN0YXJ0OworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9IGluZGV4WzBdOworCQkJCQliYXRjaFtpXVsxXSA9IGluZGV4Wygoc3RhcnQgKyBpKSAmIDEpICsgMV07CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXhbKH4oc3RhcnQgKyBpKSAmIDEpICsgMV07CisKKwkJCQkJaW5kZXggKz0gMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMTY6CisJCQl7CisJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQgKmluZGV4ID0gKGNvbnN0IHVuc2lnbmVkIHNob3J0KilpbmRpY2VzICsgc3RhcnQ7CisKKwkJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCQl7CisJCQkJCWJhdGNoW2ldWzBdID0gaW5kZXhbMF07CisJCQkJCWJhdGNoW2ldWzFdID0gaW5kZXhbKChzdGFydCArIGkpICYgMSkgKyAxXTsKKwkJCQkJYmF0Y2hbaV1bMl0gPSBpbmRleFsofihzdGFydCArIGkpICYgMSkgKyAxXTsKKworCQkJCQlpbmRleCArPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRSQVdfSU5ERVhFRFRSSUFOR0xFU1RSSVAzMjoKKwkJCXsKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgKmluZGV4ID0gKGNvbnN0IHVuc2lnbmVkIGludCopaW5kaWNlcyArIHN0YXJ0OworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9IGluZGV4WzBdOworCQkJCQliYXRjaFtpXVsxXSA9IGluZGV4Wygoc3RhcnQgKyBpKSAmIDEpICsgMV07CisJCQkJCWJhdGNoW2ldWzJdID0gaW5kZXhbKH4oc3RhcnQgKyBpKSAmIDEpICsgMV07CisKKwkJCQkJaW5kZXggKz0gMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRUZBTjg6CisJCQl7CisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgY2hhciopaW5kaWNlczsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSBpbmRleFtzdGFydCArIGkgKyAxXTsKKwkJCQkJYmF0Y2hbaV1bMV0gPSBpbmRleFtzdGFydCArIGkgKyAyXTsKKwkJCQkJYmF0Y2hbaV1bMl0gPSBpbmRleFswXTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRUZBTjE2OgorCQkJeworCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0ICppbmRleCA9IChjb25zdCB1bnNpZ25lZCBzaG9ydCopaW5kaWNlczsKKworCQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJYmF0Y2hbaV1bMF0gPSBpbmRleFtzdGFydCArIGkgKyAxXTsKKwkJCQkJYmF0Y2hbaV1bMV0gPSBpbmRleFtzdGFydCArIGkgKyAyXTsKKwkJCQkJYmF0Y2hbaV1bMl0gPSBpbmRleFswXTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpEUkFXX0lOREVYRURUUklBTkdMRUZBTjMyOgorCQkJeworCQkJCWNvbnN0IHVuc2lnbmVkIGludCAqaW5kZXggPSAoY29uc3QgdW5zaWduZWQgaW50KilpbmRpY2VzOworCisJCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJeworCQkJCQliYXRjaFtpXVswXSA9IGluZGV4W3N0YXJ0ICsgaSArIDFdOworCQkJCQliYXRjaFtpXVsxXSA9IGluZGV4W3N0YXJ0ICsgaSArIDJdOworCQkJCQliYXRjaFtpXVsyXSA9IGluZGV4WzBdOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXRhc2stPmNvdW50ID0gY291bnQgKiAzOworCQl2ZXJ0ZXhSb3V0aW5lKCZ0cmlhbmdsZS0+djAsICh1bnNpZ25lZCBpbnQqKSZiYXRjaCwgdGFzaywgZGF0YSk7CisJfQorCisJaW50IFJlbmRlcmVyOjpzZXR1cFNvbGlkVHJpYW5nbGVzKFJlbmRlcmVyICpyZW5kZXJlciwgaW50IHVuaXQsIGludCBjb3VudCkKKwl7CisJCVRyaWFuZ2xlICp0cmlhbmdsZSA9IHJlbmRlcmVyLT50cmlhbmdsZUJhdGNoW3VuaXRdOworCQlQcmltaXRpdmUgKnByaW1pdGl2ZSA9IHJlbmRlcmVyLT5wcmltaXRpdmVCYXRjaFt1bml0XTsKKworCQlEcmF3Q2FsbCAmZHJhdyA9ICpyZW5kZXJlci0+ZHJhd0xpc3RbcmVuZGVyZXItPnByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLmRyYXdDYWxsICUgRFJBV19DT1VOVF07CisJCVNldHVwUHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUgPSBkcmF3LnNldHVwU3RhdGU7CisJCWNvbnN0IFNldHVwUHJvY2Vzc29yOjpSb3V0aW5lUG9pbnRlciAmc2V0dXBSb3V0aW5lID0gZHJhdy5zZXR1cFBvaW50ZXI7CisKKwkJaW50IG1zID0gc3RhdGUubXVsdGlTYW1wbGU7CisJCWludCBwb3MgPSBzdGF0ZS5wb3NpdGlvblJlZ2lzdGVyOworCQljb25zdCBEcmF3RGF0YSAqZGF0YSA9IGRyYXcuZGF0YTsKKwkJaW50IHZpc2libGUgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCB0cmlhbmdsZSsrKQorCQl7CisJCQlWZXJ0ZXggJnYwID0gdHJpYW5nbGUtPnYwOworCQkJVmVydGV4ICZ2MSA9IHRyaWFuZ2xlLT52MTsKKwkJCVZlcnRleCAmdjIgPSB0cmlhbmdsZS0+djI7CisKKwkJCWlmKCh2MC5jbGlwRmxhZ3MgJiB2MS5jbGlwRmxhZ3MgJiB2Mi5jbGlwRmxhZ3MpID09IENsaXBwZXI6OkNMSVBfRklOSVRFKQorCQkJeworCQkJCVBvbHlnb24gcG9seWdvbigmdjAudltwb3NdLCAmdjEudltwb3NdLCAmdjIudltwb3NdKTsKKworCQkJCWludCBjbGlwRmxhZ3NPciA9IHYwLmNsaXBGbGFncyB8IHYxLmNsaXBGbGFncyB8IHYyLmNsaXBGbGFncyB8IGRyYXcuY2xpcEZsYWdzOworCisJCQkJaWYoY2xpcEZsYWdzT3IgIT0gQ2xpcHBlcjo6Q0xJUF9GSU5JVEUpCisJCQkJeworCQkJCQlpZighcmVuZGVyZXItPmNsaXBwZXItPmNsaXAocG9seWdvbiwgY2xpcEZsYWdzT3IsIGRyYXcpKQorCQkJCQl7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmKHNldHVwUm91dGluZShwcmltaXRpdmUsIHRyaWFuZ2xlLCAmcG9seWdvbiwgZGF0YSkpCisJCQkJeworCQkJCQlwcmltaXRpdmUgKz0gbXM7CisJCQkJCXZpc2libGUrKzsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gdmlzaWJsZTsKKwl9CisKKwlpbnQgUmVuZGVyZXI6OnNldHVwV2lyZWZyYW1lVHJpYW5nbGUoUmVuZGVyZXIgKnJlbmRlcmVyLCBpbnQgdW5pdCwgaW50IGNvdW50KQorCXsKKwkJVHJpYW5nbGUgKnRyaWFuZ2xlID0gcmVuZGVyZXItPnRyaWFuZ2xlQmF0Y2hbdW5pdF07CisJCVByaW1pdGl2ZSAqcHJpbWl0aXZlID0gcmVuZGVyZXItPnByaW1pdGl2ZUJhdGNoW3VuaXRdOworCQlpbnQgdmlzaWJsZSA9IDA7CisKKwkJRHJhd0NhbGwgJmRyYXcgPSAqcmVuZGVyZXItPmRyYXdMaXN0W3JlbmRlcmVyLT5wcmltaXRpdmVQcm9ncmVzc1t1bml0XS5kcmF3Q2FsbCAlIERSQVdfQ09VTlRdOworCQlTZXR1cFByb2Nlc3Nvcjo6U3RhdGUgJnN0YXRlID0gZHJhdy5zZXR1cFN0YXRlOworCQlTZXR1cFByb2Nlc3Nvcjo6Um91dGluZVBvaW50ZXIgc2V0dXBSb3V0aW5lID0gZHJhdy5zZXR1cFBvaW50ZXI7CisKKwkJY29uc3QgVmVydGV4ICZ2MCA9IHRyaWFuZ2xlWzBdLnYwOworCQljb25zdCBWZXJ0ZXggJnYxID0gdHJpYW5nbGVbMF0udjE7CisJCWNvbnN0IFZlcnRleCAmdjIgPSB0cmlhbmdsZVswXS52MjsKKworCQlmbG9hdCBkID0gKHYwLnkgKiB2MS54IC0gdjAueCAqIHYxLnkpICogdjIudyArICh2MC54ICogdjIueSAtIHYwLnkgKiB2Mi54KSAqIHYxLncgKyAodjIueCAqIHYxLnkgLSB2MS54ICogdjIueSkgKiB2MC53OworCisJCWlmKHN0YXRlLmN1bGxNb2RlID09IENvbnRleHQ6OkNVTExfQ0xPQ0tXSVNFKQorCQl7CisJCQlpZihkID49IDApIHJldHVybiAwOworCQl9CisJCWVsc2UgaWYoc3RhdGUuY3VsbE1vZGUgPT0gQ29udGV4dDo6Q1VMTF9DT1VOVEVSQ0xPQ0tXSVNFKQorCQl7CisJCQlpZihkIDw9IDApIHJldHVybiAwOworCQl9CisKKwkJLy8gQ29weSBhdHRyaWJ1dGVzCisJCXRyaWFuZ2xlWzFdLnYwID0gdjE7CisJCXRyaWFuZ2xlWzFdLnYxID0gdjI7CisJCXRyaWFuZ2xlWzJdLnYwID0gdjI7CisJCXRyaWFuZ2xlWzJdLnYxID0gdjA7CisKKwkJaWYoc3RhdGUuY29sb3JbMF1bMF0uZmxhdCkgICAvLyBGSVhNRQorCQl7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJeworCQkJCXRyaWFuZ2xlWzFdLnYwLkNbaV0gPSB0cmlhbmdsZVswXS52MC5DW2ldOworCQkJCXRyaWFuZ2xlWzFdLnYxLkNbaV0gPSB0cmlhbmdsZVswXS52MS5DW2ldOworCQkJCXRyaWFuZ2xlWzJdLnYwLkNbaV0gPSB0cmlhbmdsZVswXS52MC5DW2ldOworCQkJCXRyaWFuZ2xlWzJdLnYxLkNbaV0gPSB0cmlhbmdsZVswXS52MS5DW2ldOworCQkJfQorCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKKwkJeworCQkJaWYoc2V0dXBMaW5lKHJlbmRlcmVyLCAqcHJpbWl0aXZlLCAqdHJpYW5nbGUsIGRyYXcpKQorCQkJeworCQkJCXByaW1pdGl2ZS0+YXJlYSA9IDAuNWYgKiBkOworCisJCQkJcHJpbWl0aXZlKys7CisJCQkJdmlzaWJsZSsrOworCQkJfQorCisJCQl0cmlhbmdsZSsrOworCQl9CisKKwkJcmV0dXJuIHZpc2libGU7CisJfQorCQorCWludCBSZW5kZXJlcjo6c2V0dXBWZXJ0ZXhUcmlhbmdsZShSZW5kZXJlciAqcmVuZGVyZXIsIGludCB1bml0LCBpbnQgY291bnQpCisJeworCQlUcmlhbmdsZSAqdHJpYW5nbGUgPSByZW5kZXJlci0+dHJpYW5nbGVCYXRjaFt1bml0XTsKKwkJUHJpbWl0aXZlICpwcmltaXRpdmUgPSByZW5kZXJlci0+cHJpbWl0aXZlQmF0Y2hbdW5pdF07CisJCWludCB2aXNpYmxlID0gMDsKKworCQlEcmF3Q2FsbCAmZHJhdyA9ICpyZW5kZXJlci0+ZHJhd0xpc3RbcmVuZGVyZXItPnByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLmRyYXdDYWxsICUgRFJBV19DT1VOVF07CisJCVNldHVwUHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUgPSBkcmF3LnNldHVwU3RhdGU7CisKKwkJY29uc3QgVmVydGV4ICZ2MCA9IHRyaWFuZ2xlWzBdLnYwOworCQljb25zdCBWZXJ0ZXggJnYxID0gdHJpYW5nbGVbMF0udjE7CisJCWNvbnN0IFZlcnRleCAmdjIgPSB0cmlhbmdsZVswXS52MjsKKworCQlmbG9hdCBkID0gKHYwLnkgKiB2MS54IC0gdjAueCAqIHYxLnkpICogdjIudyArICh2MC54ICogdjIueSAtIHYwLnkgKiB2Mi54KSAqIHYxLncgKyAodjIueCAqIHYxLnkgLSB2MS54ICogdjIueSkgKiB2MC53OworCisJCWlmKHN0YXRlLmN1bGxNb2RlID09IENvbnRleHQ6OkNVTExfQ0xPQ0tXSVNFKQorCQl7CisJCQlpZihkID49IDApIHJldHVybiAwOworCQl9CisJCWVsc2UgaWYoc3RhdGUuY3VsbE1vZGUgPT0gQ29udGV4dDo6Q1VMTF9DT1VOVEVSQ0xPQ0tXSVNFKQorCQl7CisJCQlpZihkIDw9IDApIHJldHVybiAwOworCQl9CisKKwkJLy8gQ29weSBhdHRyaWJ1dGVzCisJCXRyaWFuZ2xlWzFdLnYwID0gdjE7CisJCXRyaWFuZ2xlWzJdLnYwID0gdjI7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKKwkJeworCQkJaWYoc2V0dXBQb2ludChyZW5kZXJlciwgKnByaW1pdGl2ZSwgKnRyaWFuZ2xlLCBkcmF3KSkKKwkJCXsKKwkJCQlwcmltaXRpdmUtPmFyZWEgPSAwLjVmICogZDsKKworCQkJCXByaW1pdGl2ZSsrOworCQkJCXZpc2libGUrKzsKKwkJCX0KKworCQkJdHJpYW5nbGUrKzsKKwkJfQorCisJCXJldHVybiB2aXNpYmxlOworCX0KKworCWludCBSZW5kZXJlcjo6c2V0dXBMaW5lcyhSZW5kZXJlciAqcmVuZGVyZXIsIGludCB1bml0LCBpbnQgY291bnQpCisJeworCQlUcmlhbmdsZSAqdHJpYW5nbGUgPSByZW5kZXJlci0+dHJpYW5nbGVCYXRjaFt1bml0XTsKKwkJUHJpbWl0aXZlICpwcmltaXRpdmUgPSByZW5kZXJlci0+cHJpbWl0aXZlQmF0Y2hbdW5pdF07CisJCWludCB2aXNpYmxlID0gMDsKKworCQlEcmF3Q2FsbCAmZHJhdyA9ICpyZW5kZXJlci0+ZHJhd0xpc3RbcmVuZGVyZXItPnByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLmRyYXdDYWxsICUgRFJBV19DT1VOVF07CisJCVNldHVwUHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUgPSBkcmF3LnNldHVwU3RhdGU7CisKKwkJaW50IG1zID0gc3RhdGUubXVsdGlTYW1wbGU7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCWlmKHNldHVwTGluZShyZW5kZXJlciwgKnByaW1pdGl2ZSwgKnRyaWFuZ2xlLCBkcmF3KSkKKwkJCXsKKwkJCQlwcmltaXRpdmUgKz0gbXM7CisJCQkJdmlzaWJsZSsrOworCQkJfQorCisJCQl0cmlhbmdsZSsrOworCQl9CisKKwkJcmV0dXJuIHZpc2libGU7CisJfQorCisJaW50IFJlbmRlcmVyOjpzZXR1cFBvaW50cyhSZW5kZXJlciAqcmVuZGVyZXIsIGludCB1bml0LCBpbnQgY291bnQpCisJeworCQlUcmlhbmdsZSAqdHJpYW5nbGUgPSByZW5kZXJlci0+dHJpYW5nbGVCYXRjaFt1bml0XTsKKwkJUHJpbWl0aXZlICpwcmltaXRpdmUgPSByZW5kZXJlci0+cHJpbWl0aXZlQmF0Y2hbdW5pdF07CisJCWludCB2aXNpYmxlID0gMDsKKworCQlEcmF3Q2FsbCAmZHJhdyA9ICpyZW5kZXJlci0+ZHJhd0xpc3RbcmVuZGVyZXItPnByaW1pdGl2ZVByb2dyZXNzW3VuaXRdLmRyYXdDYWxsICUgRFJBV19DT1VOVF07CisJCVNldHVwUHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUgPSBkcmF3LnNldHVwU3RhdGU7CisKKwkJaW50IG1zID0gc3RhdGUubXVsdGlTYW1wbGU7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCWlmKHNldHVwUG9pbnQocmVuZGVyZXIsICpwcmltaXRpdmUsICp0cmlhbmdsZSwgZHJhdykpCisJCQl7CisJCQkJcHJpbWl0aXZlICs9IG1zOworCQkJCXZpc2libGUrKzsKKwkJCX0KKworCQkJdHJpYW5nbGUrKzsKKwkJfQorCisJCXJldHVybiB2aXNpYmxlOworCX0KKworCWJvb2wgUmVuZGVyZXI6OnNldHVwTGluZShSZW5kZXJlciAqcmVuZGVyZXIsIFByaW1pdGl2ZSAmcHJpbWl0aXZlLCBUcmlhbmdsZSAmdHJpYW5nbGUsIGNvbnN0IERyYXdDYWxsICZkcmF3KQorCXsKKwkJY29uc3QgU2V0dXBQcm9jZXNzb3I6OlJvdXRpbmVQb2ludGVyICZzZXR1cFJvdXRpbmUgPSBkcmF3LnNldHVwUG9pbnRlcjsKKwkJY29uc3QgU2V0dXBQcm9jZXNzb3I6OlN0YXRlICZzdGF0ZSA9IGRyYXcuc2V0dXBTdGF0ZTsKKwkJY29uc3QgRHJhd0RhdGEgJmRhdGEgPSAqZHJhdy5kYXRhOworCisJCVZlcnRleCAmdjAgPSB0cmlhbmdsZS52MDsKKwkJVmVydGV4ICZ2MSA9IHRyaWFuZ2xlLnYxOworCisJCWludCBwb3MgPSBzdGF0ZS5wb3NpdGlvblJlZ2lzdGVyOworCisJCWNvbnN0IGZsb2F0NCAmUDAgPSB2MC52W3Bvc107CisJCWNvbnN0IGZsb2F0NCAmUDEgPSB2MS52W3Bvc107CisKKwkJaWYoUDAudyA8PSAwICYmIFAxLncgPD0gMCkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJY29uc3QgZmxvYXQgVyA9ICBkYXRhLldXV1d4MTZbMF0gKiAoMS4wZiAvIDE2LjBmKTsKKwkJY29uc3QgZmxvYXQgSCA9IC1kYXRhLkhISEh4MTZbMF0gKiAoMS4wZiAvIDE2LjBmKTsKKworCQlmbG9hdCBkeCA9IFcgKiAoUDEueCAvIFAxLncgLSBQMC54IC8gUDAudyk7CisJCWZsb2F0IGR5ID0gSCAqIChQMS55IC8gUDEudyAtIFAwLnkgLyBQMC53KTsKKworCQlpZihkeCA9PSAwICYmIGR5ID09IDApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmKGZhbHNlKSAgIC8vIFJlY3RhbmdsZQorCQl7CisJCQlmbG9hdDQgUFs0XTsKKwkJCWludCBDWzRdOworCisJCQlQWzBdID0gUDA7CisJCQlQWzFdID0gUDE7CisJCQlQWzJdID0gUDE7CisJCQlQWzNdID0gUDA7CisKKwkJCWZsb2F0IHNjYWxlID0gMC41ZiAvIHNxcnQoZHgqZHggKyBkeSpkeSk7CisKKwkJCWR4ICo9IHNjYWxlOworCQkJZHkgKj0gc2NhbGU7CisKKwkJCWZsb2F0IGR4MHcgPSBkeCAqIFAwLncgLyBXOworCQkJZmxvYXQgZHkwaCA9IGR5ICogUDAudyAvIEg7CisJCQlmbG9hdCBkeDBoID0gZHggKiBQMC53IC8gSDsKKwkJCWZsb2F0IGR5MHcgPSBkeSAqIFAwLncgLyBXOworCisJCQlmbG9hdCBkeDF3ID0gZHggKiBQMS53IC8gVzsKKwkJCWZsb2F0IGR5MWggPSBkeSAqIFAxLncgLyBIOworCQkJZmxvYXQgZHgxaCA9IGR4ICogUDEudyAvIEg7CisJCQlmbG9hdCBkeTF3ID0gZHkgKiBQMS53IC8gVzsKKworCQkJUFswXS54ICs9ICtkeTB3ICsgLWR4MHc7CisJCQlQWzBdLnkgKz0gLWR4MGggKyAtZHkwaDsKKwkJCUNbMF0gPSBjb21wdXRlQ2xpcEZsYWdzKFBbMF0sIGRhdGEpOworCisJCQlQWzFdLnggKz0gK2R5MXcgKyArZHgxdzsKKwkJCVBbMV0ueSArPSAtZHgxaCArICtkeTFoOworCQkJQ1sxXSA9IGNvbXB1dGVDbGlwRmxhZ3MoUFsxXSwgZGF0YSk7CisKKwkJCVBbMl0ueCArPSAtZHkxdyArICtkeDF3OworCQkJUFsyXS55ICs9ICtkeDFoICsgK2R5MWg7CisJCQlDWzJdID0gY29tcHV0ZUNsaXBGbGFncyhQWzJdLCBkYXRhKTsKKworCQkJUFszXS54ICs9IC1keTB3ICsgLWR4MHc7CisJCQlQWzNdLnkgKz0gK2R4MGggKyAtZHkwaDsKKwkJCUNbM10gPSBjb21wdXRlQ2xpcEZsYWdzKFBbM10sIGRhdGEpOworCisJCQlpZigoQ1swXSAmIENbMV0gJiBDWzJdICYgQ1szXSkgPT0gQ2xpcHBlcjo6Q0xJUF9GSU5JVEUpCisJCQl7CisJCQkJUG9seWdvbiBwb2x5Z29uKFAsIDQpOworCisJCQkJaW50IGNsaXBGbGFnc09yID0gQ1swXSB8IENbMV0gfCBDWzJdIHwgQ1szXSB8IGRyYXcuY2xpcEZsYWdzOworCisJCQkJaWYoY2xpcEZsYWdzT3IgIT0gQ2xpcHBlcjo6Q0xJUF9GSU5JVEUpCisJCQkJeworCQkJCQlpZighcmVuZGVyZXItPmNsaXBwZXItPmNsaXAocG9seWdvbiwgY2xpcEZsYWdzT3IsIGRyYXcpKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gc2V0dXBSb3V0aW5lKCZwcmltaXRpdmUsICZ0cmlhbmdsZSwgJnBvbHlnb24sICZkYXRhKTsKKwkJCX0KKwkJfQorCQllbHNlICAgLy8gRGlhbW9uZCB0ZXN0IGNvbnZlbnRpb24KKwkJeworCQkJZmxvYXQ0IFBbOF07CisJCQlpbnQgQ1s4XTsKKworCQkJUFswXSA9IFAwOworCQkJUFsxXSA9IFAwOworCQkJUFsyXSA9IFAwOworCQkJUFszXSA9IFAwOworCQkJUFs0XSA9IFAxOworCQkJUFs1XSA9IFAxOworCQkJUFs2XSA9IFAxOworCQkJUFs3XSA9IFAxOworCisJCQlmbG9hdCBkeDAgPSAwLjVmICogUDAudyAvIFc7CisJCQlmbG9hdCBkeTAgPSAwLjVmICogUDAudyAvIEg7CisKKwkJCWZsb2F0IGR4MSA9IDAuNWYgKiBQMS53IC8gVzsKKwkJCWZsb2F0IGR5MSA9IDAuNWYgKiBQMS53IC8gSDsKKworCQkJUFswXS54ICs9IC1keDA7CisJCQlDWzBdID0gY29tcHV0ZUNsaXBGbGFncyhQWzBdLCBkYXRhKTsKKworCQkJUFsxXS55ICs9IC1keTA7CisJCQlDWzFdID0gY29tcHV0ZUNsaXBGbGFncyhQWzFdLCBkYXRhKTsKKworCQkJUFsyXS54ICs9ICtkeDA7CisJCQlDWzJdID0gY29tcHV0ZUNsaXBGbGFncyhQWzJdLCBkYXRhKTsKKworCQkJUFszXS55ICs9ICtkeTA7CisJCQlDWzNdID0gY29tcHV0ZUNsaXBGbGFncyhQWzNdLCBkYXRhKTsKKworCQkJUFs0XS54ICs9IC1keDE7CisJCQlDWzRdID0gY29tcHV0ZUNsaXBGbGFncyhQWzRdLCBkYXRhKTsKKworCQkJUFs1XS55ICs9IC1keTE7CisJCQlDWzVdID0gY29tcHV0ZUNsaXBGbGFncyhQWzVdLCBkYXRhKTsKKworCQkJUFs2XS54ICs9ICtkeDE7CisJCQlDWzZdID0gY29tcHV0ZUNsaXBGbGFncyhQWzZdLCBkYXRhKTsKKworCQkJUFs3XS55ICs9ICtkeTE7CisJCQlDWzddID0gY29tcHV0ZUNsaXBGbGFncyhQWzddLCBkYXRhKTsKKworCQkJaWYoKENbMF0gJiBDWzFdICYgQ1syXSAmIENbM10gJiBDWzRdICYgQ1s1XSAmIENbNl0gJiBDWzddKSA9PSBDbGlwcGVyOjpDTElQX0ZJTklURSkKKwkJCXsKKwkJCQlmbG9hdDQgTFs2XTsKKworCQkJCWlmKGR4ID4gZHkpCisJCQkJeworCQkJCQlpZihkeCA+IC1keSkgICAvLyBSaWdodAorCQkJCQl7CisJCQkJCQlMWzBdID0gUFswXTsKKwkJCQkJCUxbMV0gPSBQWzFdOworCQkJCQkJTFsyXSA9IFBbNV07CisJCQkJCQlMWzNdID0gUFs2XTsKKwkJCQkJCUxbNF0gPSBQWzddOworCQkJCQkJTFs1XSA9IFBbM107CisJCQkJCX0KKwkJCQkJZWxzZSAgIC8vIERvd24KKwkJCQkJeworCQkJCQkJTFswXSA9IFBbMF07CisJCQkJCQlMWzFdID0gUFs0XTsKKwkJCQkJCUxbMl0gPSBQWzVdOworCQkJCQkJTFszXSA9IFBbNl07CisJCQkJCQlMWzRdID0gUFsyXTsKKwkJCQkJCUxbNV0gPSBQWzNdOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmKGR4ID4gLWR5KSAgIC8vIFVwCisJCQkJCXsKKwkJCQkJCUxbMF0gPSBQWzBdOworCQkJCQkJTFsxXSA9IFBbMV07CisJCQkJCQlMWzJdID0gUFsyXTsKKwkJCQkJCUxbM10gPSBQWzZdOworCQkJCQkJTFs0XSA9IFBbN107CisJCQkJCQlMWzVdID0gUFs0XTsKKwkJCQkJfQorCQkJCQllbHNlICAgLy8gTGVmdAorCQkJCQl7CisJCQkJCQlMWzBdID0gUFsxXTsKKwkJCQkJCUxbMV0gPSBQWzJdOworCQkJCQkJTFsyXSA9IFBbM107CisJCQkJCQlMWzNdID0gUFs3XTsKKwkJCQkJCUxbNF0gPSBQWzRdOworCQkJCQkJTFs1XSA9IFBbNV07CisJCQkJCX0KKwkJCQl9CisKKwkJCQlQb2x5Z29uIHBvbHlnb24oTCwgNik7CisKKwkJCQlpbnQgY2xpcEZsYWdzT3IgPSBDWzBdIHwgQ1sxXSB8IENbMl0gfCBDWzNdIHwgQ1s0XSB8IENbNV0gfCBDWzZdIHwgQ1s3XSB8IGRyYXcuY2xpcEZsYWdzOworCisJCQkJaWYoY2xpcEZsYWdzT3IgIT0gQ2xpcHBlcjo6Q0xJUF9GSU5JVEUpCisJCQkJeworCQkJCQlpZighcmVuZGVyZXItPmNsaXBwZXItPmNsaXAocG9seWdvbiwgY2xpcEZsYWdzT3IsIGRyYXcpKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gc2V0dXBSb3V0aW5lKCZwcmltaXRpdmUsICZ0cmlhbmdsZSwgJnBvbHlnb24sICZkYXRhKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlib29sIFJlbmRlcmVyOjpzZXR1cFBvaW50KFJlbmRlcmVyICpyZW5kZXJlciwgUHJpbWl0aXZlICZwcmltaXRpdmUsIFRyaWFuZ2xlICZ0cmlhbmdsZSwgY29uc3QgRHJhd0NhbGwgJmRyYXcpCisJeworCQljb25zdCBTZXR1cFByb2Nlc3Nvcjo6Um91dGluZVBvaW50ZXIgJnNldHVwUm91dGluZSA9IGRyYXcuc2V0dXBQb2ludGVyOworCQljb25zdCBTZXR1cFByb2Nlc3Nvcjo6U3RhdGUgJnN0YXRlID0gZHJhdy5zZXR1cFN0YXRlOworCQljb25zdCBEcmF3RGF0YSAmZGF0YSA9ICpkcmF3LmRhdGE7CisKKwkJVmVydGV4ICZ2ID0gdHJpYW5nbGUudjA7CisKKwkJZmxvYXQgcFNpemU7CisKKwkJaW50IHB0cyA9IHN0YXRlLnBvaW50U2l6ZVJlZ2lzdGVyOworCisJCWlmKHN0YXRlLnBvaW50U2l6ZVJlZ2lzdGVyICE9IDB4RikKKwkJeworCQkJcFNpemUgPSB2LnZbcHRzXS55OworCQl9CisJCWVsc2UKKwkJeworCQkJcFNpemUgPSBkYXRhLnBvaW50LnBvaW50U2l6ZVswXTsKKwkJfQorCisJCXBTaXplID0gY2xhbXAocFNpemUsIGRhdGEucG9pbnQucG9pbnRTaXplTWluLCBkYXRhLnBvaW50LnBvaW50U2l6ZU1heCk7CisKKwkJZmxvYXQ0IFBbNF07CisJCWludCBDWzRdOworCisJCWludCBwb3MgPSBzdGF0ZS5wb3NpdGlvblJlZ2lzdGVyOworCisJCVBbMF0gPSB2LnZbcG9zXTsKKwkJUFsxXSA9IHYudltwb3NdOworCQlQWzJdID0gdi52W3Bvc107CisJCVBbM10gPSB2LnZbcG9zXTsKKworCQljb25zdCBmbG9hdCBYID0gMC41ZiAqIHBTaXplICogUFswXS53IC8gIChkYXRhLldXV1d4MTZbMF0gKiAoMS4wZiAvIDE2LjBmKSk7CisJCWNvbnN0IGZsb2F0IFkgPSAwLjVmICogcFNpemUgKiBQWzBdLncgLyAtKGRhdGEuSEhISHgxNlswXSAqICgxLjBmIC8gMTYuMGYpKTsKKworCQlQWzBdLnggLT0gWDsKKwkJUFswXS55IC09IFk7CisJCUNbMF0gPSBjb21wdXRlQ2xpcEZsYWdzKFBbMF0sIGRhdGEpOworCisJCVBbMV0ueCArPSBYOworCQlQWzFdLnkgLT0gWTsKKwkJQ1sxXSA9IGNvbXB1dGVDbGlwRmxhZ3MoUFsxXSwgZGF0YSk7CisKKwkJUFsyXS54ICs9IFg7CisJCVBbMl0ueSArPSBZOworCQlDWzJdID0gY29tcHV0ZUNsaXBGbGFncyhQWzJdLCBkYXRhKTsKKworCQlQWzNdLnggLT0gWDsKKwkJUFszXS55ICs9IFk7CisJCUNbM10gPSBjb21wdXRlQ2xpcEZsYWdzKFBbM10sIGRhdGEpOworCisJCXRyaWFuZ2xlLnYxID0gdHJpYW5nbGUudjA7CisJCXRyaWFuZ2xlLnYyID0gdHJpYW5nbGUudjA7CisKKwkJdHJpYW5nbGUudjEuWCArPSBpcm91bmQoMTYgKiAwLjVmICogcFNpemUpOworCQl0cmlhbmdsZS52Mi5ZIC09IGlyb3VuZCgxNiAqIDAuNWYgKiBwU2l6ZSk7CisKKwkJUG9seWdvbiBwb2x5Z29uKFAsIDQpOworCisJCWlmKChDWzBdICYgQ1sxXSAmIENbMl0gJiBDWzNdKSA9PSBDbGlwcGVyOjpDTElQX0ZJTklURSkKKwkJeworCQkJaW50IGNsaXBGbGFnc09yID0gQ1swXSB8IENbMV0gfCBDWzJdIHwgQ1szXSB8IGRyYXcuY2xpcEZsYWdzOworCisJCQlpZihjbGlwRmxhZ3NPciAhPSBDbGlwcGVyOjpDTElQX0ZJTklURSkKKwkJCXsKKwkJCQlpZighcmVuZGVyZXItPmNsaXBwZXItPmNsaXAocG9seWdvbiwgY2xpcEZsYWdzT3IsIGRyYXcpKQorCQkJCXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCQorCQkJcmV0dXJuIHNldHVwUm91dGluZSgmcHJpbWl0aXZlLCAmdHJpYW5nbGUsICZwb2x5Z29uLCAmZGF0YSk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJdW5zaWduZWQgaW50IFJlbmRlcmVyOjpjb21wdXRlQ2xpcEZsYWdzKGNvbnN0IGZsb2F0NCAmdiwgY29uc3QgRHJhd0RhdGEgJmRhdGEpCisJeworCQlmbG9hdCBjbFggPSB2LnggKyBkYXRhLm9mZlhbMF0gKiB2Lnc7CisJCWZsb2F0IGNsWSA9IHYueSArIGRhdGEub2ZmWVswXSAqIHYudzsKKworCQlyZXR1cm4gKChjbFggPiB2LncpICA8PCAwKSB8CisJCQkgICAoKGNsWSA+IHYudykgIDw8IDEpIHwKKwkJCSAgICgodi56ID4gdi53KSAgPDwgMikgfAorCQkJICAgKChjbFggPCAtdi53KSA8PCAzKSB8CisJCSAgICAgICAoKGNsWSA8IC12LncpIDw8IDQpIHwKKwkJCSAgICgodi56IDwgMCkgICAgPDwgNSkgfAorCQkJICAgQ2xpcHBlcjo6Q0xJUF9GSU5JVEU7ICAgLy8gRklYTUU6IHh5eiBmaW5pdGUKKwl9CisKKwl2b2lkIFJlbmRlcmVyOjppbml0aWFsaXplVGhyZWFkcyhpbnQgdGhyZWFkcykKKwl7CisJCXRlcm1pbmF0ZVRocmVhZHMoKTsKKwkJZGVsZXRlQmF0Y2hlcygpOworCisJCXRocmVhZENvdW50ID0gdGhyZWFkczsKKwkJdW5pdENvdW50ID0gY2VpbFBvdzIodGhyZWFkcyk7CisJCWNsdXN0ZXJDb3VudCA9IGNlaWxQb3cyKHRocmVhZHMpOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCB1bml0Q291bnQ7IGkrKykKKwkJeworCQkJdHJpYW5nbGVCYXRjaFtpXSA9IChUcmlhbmdsZSopYWxsb2NhdGUoYmF0Y2hTaXplICogc2l6ZW9mKFRyaWFuZ2xlKSk7CisJCQlwcmltaXRpdmVCYXRjaFtpXSA9IChQcmltaXRpdmUqKWFsbG9jYXRlKGJhdGNoU2l6ZSAqIHNpemVvZihQcmltaXRpdmUpKTsKKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCB0aHJlYWRDb3VudDsgaSsrKQorCQl7CisJCQl2ZXJ0ZXhUYXNrW2ldID0gKFZlcnRleFRhc2sqKWFsbG9jYXRlKHNpemVvZihWZXJ0ZXhUYXNrKSk7CisJCQl2ZXJ0ZXhUYXNrW2ldLT52ZXJ0ZXhDYWNoZS5kcmF3Q2FsbCA9IC0xOworCisJCQl0YXNrW2ldLnR5cGUgPSBUYXNrOjpTVVNQRU5EOworCisJCQlyZXN1bWVbaV0gPSBuZXcgRXZlbnQoKTsKKwkJCXN1c3BlbmRbaV0gPSBuZXcgRXZlbnQoKTsKKworCQkJUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworCQkJcGFyYW1ldGVycy50aHJlYWRJbmRleCA9IGk7CisJCQlwYXJhbWV0ZXJzLnJlbmRlcmVyID0gdGhpczsKKworCQkJZXhpdFRocmVhZHMgPSBmYWxzZTsKKwkJCXdvcmtlcltpXSA9IG5ldyBUaHJlYWQodGhyZWFkRnVuY3Rpb24sICZwYXJhbWV0ZXJzKTsKKworCQkJc3VzcGVuZFtpXS0+d2FpdCgpOworCQkJc3VzcGVuZFtpXS0+c2lnbmFsKCk7CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjp0ZXJtaW5hdGVUaHJlYWRzKCkKKwl7CisJCXdoaWxlKHRocmVhZHNBd2FrZSAhPSAwKQorCQl7CisJCQlUaHJlYWQ6OnNsZWVwKDEwMCk7CisJCX0KKworCQlmb3IoaW50IHRocmVhZCA9IDA7IHRocmVhZCA8IHRocmVhZENvdW50OyB0aHJlYWQrKykKKwkJeworCQkJaWYod29ya2VyW3RocmVhZF0pCisJCQl7CisJCQkJZXhpdFRocmVhZHMgPSB0cnVlOworCQkJCXJlc3VtZVt0aHJlYWRdLT5zaWduYWwoKTsKKwkJCQl3b3JrZXJbdGhyZWFkXS0+am9pbigpOworCQkJCQorCQkJCWRlbGV0ZSB3b3JrZXJbdGhyZWFkXTsKKwkJCQl3b3JrZXJbdGhyZWFkXSA9IDA7CisJCQkJZGVsZXRlIHJlc3VtZVt0aHJlYWRdOworCQkJCXJlc3VtZVt0aHJlYWRdID0gMDsKKwkJCQlkZWxldGUgc3VzcGVuZFt0aHJlYWRdOworCQkJCXN1c3BlbmRbdGhyZWFkXSA9IDA7CisJCQl9CisJCQorCQkJZGVhbGxvY2F0ZSh2ZXJ0ZXhUYXNrW3RocmVhZF0pOworCQkJdmVydGV4VGFza1t0aHJlYWRdID0gMDsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OmRlbGV0ZUJhdGNoZXMoKQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCWRlYWxsb2NhdGUodHJpYW5nbGVCYXRjaFtpXSk7CisJCQl0cmlhbmdsZUJhdGNoW2ldID0gMDsKKworCQkJZGVhbGxvY2F0ZShwcmltaXRpdmVCYXRjaFtpXSk7CisJCQlwcmltaXRpdmVCYXRjaFtpXSA9IDA7CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpsb2FkQ29uc3RhbnRzKGNvbnN0IFZlcnRleFNoYWRlciAqdmVydGV4U2hhZGVyKQorCXsKKwkJaWYoIXZlcnRleFNoYWRlcikgcmV0dXJuOworCisJCWludCBjb3VudCA9IHZlcnRleFNoYWRlci0+Z2V0TGVuZ3RoKCk7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCWNvbnN0IFNoYWRlckluc3RydWN0aW9uICppbnN0cnVjdGlvbiA9IHZlcnRleFNoYWRlci0+Z2V0SW5zdHJ1Y3Rpb24oaSk7CisKKwkJCWlmKGluc3RydWN0aW9uLT5nZXRPcGNvZGUoKSA9PSBWZXJ0ZXhTaGFkZXJJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfREVGKQorCQkJeworCQkJCWludCBpbmRleCA9IGluc3RydWN0aW9uLT5nZXREZXN0aW5hdGlvblBhcmFtZXRlcigpLmluZGV4OworCQkJCWZsb2F0IHZhbHVlWzRdOworCisJCQkJdmFsdWVbMF0gPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDApLnZhbHVlOworCQkJCXZhbHVlWzFdID0gaW5zdHJ1Y3Rpb24tPmdldFNvdXJjZVBhcmFtZXRlcigxKS52YWx1ZTsKKwkJCQl2YWx1ZVsyXSA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMikudmFsdWU7CisJCQkJdmFsdWVbM10gPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDMpLnZhbHVlOworCisJCQkJc2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKGluZGV4LCB2YWx1ZSk7CisJCQl9CisJCQllbHNlIGlmKGluc3RydWN0aW9uLT5nZXRPcGNvZGUoKSA9PSBWZXJ0ZXhTaGFkZXJJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfREVGSSkKKwkJCXsKKwkJCQlpbnQgaW5kZXggPSBpbnN0cnVjdGlvbi0+Z2V0RGVzdGluYXRpb25QYXJhbWV0ZXIoKS5pbmRleDsKKwkJCQlpbnQgaW50ZWdlcls0XTsKKworCQkJCWludGVnZXJbMF0gPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDApLmludGVnZXI7CisJCQkJaW50ZWdlclsxXSA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMSkuaW50ZWdlcjsKKwkJCQlpbnRlZ2VyWzJdID0gaW5zdHJ1Y3Rpb24tPmdldFNvdXJjZVBhcmFtZXRlcigyKS5pbnRlZ2VyOworCQkJCWludGVnZXJbM10gPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDMpLmludGVnZXI7CisKKwkJCQlzZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkoaW5kZXgsIGludGVnZXIpOworCQkJfQorCQkJZWxzZSBpZihpbnN0cnVjdGlvbi0+Z2V0T3Bjb2RlKCkgPT0gVmVydGV4U2hhZGVySW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX0RFRkIpCisJCQl7CisJCQkJaW50IGluZGV4ID0gaW5zdHJ1Y3Rpb24tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkuaW5kZXg7CisJCQkJaW50IGJvb2xlYW47CisKKwkJCQlib29sZWFuID0gaW5zdHJ1Y3Rpb24tPmdldFNvdXJjZVBhcmFtZXRlcigwKS5ib29sZWFuOworCisJCQkJc2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKGluZGV4LCAmYm9vbGVhbik7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpsb2FkQ29uc3RhbnRzKGNvbnN0IFBpeGVsU2hhZGVyICpwaXhlbFNoYWRlcikKKwl7CisJCWlmKCFwaXhlbFNoYWRlcikgcmV0dXJuOworCisJCWludCBjb3VudCA9IHBpeGVsU2hhZGVyLT5nZXRMZW5ndGgoKTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJeworCQkJY29uc3QgU2hhZGVySW5zdHJ1Y3Rpb24gKmluc3RydWN0aW9uID0gcGl4ZWxTaGFkZXItPmdldEluc3RydWN0aW9uKGkpOworCisJCQlpZihpbnN0cnVjdGlvbi0+Z2V0T3Bjb2RlKCkgPT0gUGl4ZWxTaGFkZXJJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfREVGKQorCQkJeworCQkJCWludCBpbmRleCA9IGluc3RydWN0aW9uLT5nZXREZXN0aW5hdGlvblBhcmFtZXRlcigpLmluZGV4OworCQkJCWZsb2F0IHZhbHVlWzRdOworCisJCQkJdmFsdWVbMF0gPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDApLnZhbHVlOworCQkJCXZhbHVlWzFdID0gaW5zdHJ1Y3Rpb24tPmdldFNvdXJjZVBhcmFtZXRlcigxKS52YWx1ZTsKKwkJCQl2YWx1ZVsyXSA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMikudmFsdWU7CisJCQkJdmFsdWVbM10gPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDMpLnZhbHVlOworCisJCQkJc2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoaW5kZXgsIHZhbHVlKTsKKwkJCX0KKwkJCWVsc2UgaWYoaW5zdHJ1Y3Rpb24tPmdldE9wY29kZSgpID09IFBpeGVsU2hhZGVySW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX0RFRkkpCisJCQl7CisJCQkJaW50IGluZGV4ID0gaW5zdHJ1Y3Rpb24tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkuaW5kZXg7CisJCQkJaW50IGludGVnZXJbNF07CisKKwkJCQlpbnRlZ2VyWzBdID0gaW5zdHJ1Y3Rpb24tPmdldFNvdXJjZVBhcmFtZXRlcigwKS5pbnRlZ2VyOworCQkJCWludGVnZXJbMV0gPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDEpLmludGVnZXI7CisJCQkJaW50ZWdlclsyXSA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMikuaW50ZWdlcjsKKwkJCQlpbnRlZ2VyWzNdID0gaW5zdHJ1Y3Rpb24tPmdldFNvdXJjZVBhcmFtZXRlcigzKS5pbnRlZ2VyOworCisJCQkJc2V0UGl4ZWxTaGFkZXJDb25zdGFudEkoaW5kZXgsIGludGVnZXIpOworCQkJfQorCQkJZWxzZSBpZihpbnN0cnVjdGlvbi0+Z2V0T3Bjb2RlKCkgPT0gUGl4ZWxTaGFkZXJJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfREVGQikKKwkJCXsKKwkJCQlpbnQgaW5kZXggPSBpbnN0cnVjdGlvbi0+Z2V0RGVzdGluYXRpb25QYXJhbWV0ZXIoKS5pbmRleDsKKwkJCQlpbnQgYm9vbGVhbjsKKworCQkJCWJvb2xlYW4gPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDApLmJvb2xlYW47CisKKwkJCQlzZXRQaXhlbFNoYWRlckNvbnN0YW50QihpbmRleCwgJmJvb2xlYW4pOworCQkJfQorCQl9CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0SW5kZXhCdWZmZXIoUmVzb3VyY2UgKmluZGV4QnVmZmVyKQorCXsKKwkJY29udGV4dC0+aW5kZXhCdWZmZXIgPSBpbmRleEJ1ZmZlcjsKKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRNdWx0aVNhbXBsZU1hc2sodW5zaWduZWQgaW50IG1hc2spCisJeworCQljb250ZXh0LT5zYW1wbGVNYXNrID0gbWFzazsKKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRUcmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcoQ29udGV4dDo6VHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nIHRyYW5zcGFyZW5jeUFudGlhbGlhc2luZykKKwl7CisJCXN3Ojp0cmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcgPSB0cmFuc3BhcmVuY3lBbnRpYWxpYXNpbmc7CisJfQorCisJYm9vbCBSZW5kZXJlcjo6aXNSZWFkV3JpdGVUZXh0dXJlKGludCBzYW1wbGVyKQorCXsKKwkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykKKwkJeworCQkJaWYoY29udGV4dC0+cmVuZGVyVGFyZ2V0W2luZGV4XSAmJiBjb250ZXh0LT50ZXh0dXJlW3NhbXBsZXJdID09IGNvbnRleHQtPnJlbmRlclRhcmdldFtpbmRleF0tPmdldFJlc291cmNlKCkpCisJCQl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkKKwkJaWYoY29udGV4dC0+ZGVwdGhTdGVuY2lsICYmIGNvbnRleHQtPnRleHR1cmVbc2FtcGxlcl0gPT0gY29udGV4dC0+ZGVwdGhTdGVuY2lsLT5nZXRSZXNvdXJjZSgpKQorCQl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJdm9pZCBSZW5kZXJlcjo6dXBkYXRlQ2xpcHBlcigpCisJeworCQlpZih1cGRhdGVDbGlwUGxhbmVzKQorCQl7CisJCQkvLyBUcmFuc2Zvcm1hdGlvbiBmcm9tIHZpZXdwb3J0IGNsaXAgc3BhY2UgdG8gc2Npc3NvcmVkIHZpZXdwb3J0IGNsaXAgc3BhY2UKKwkJCU1hdHJpeCBzY2lzc29yQ2xpcChwb3NTY2FsZS54LCAwLjBmLCAgICAgICAgMC4wZiwgcG9zT2Zmc2V0LngsCisJCQkgICAgICAgICAgICAgICAgICAgMC4wZiwgICAgICAgcG9zU2NhbGUueSwgIDAuMGYsIHBvc09mZnNldC55LAorCQkJICAgICAgICAgICAgICAgICAgIDAuMGYsICAgICAgIDAuMGYsICAgICAgICAxLjBmLCAwLjBmLAorCQkJICAgICAgICAgICAgICAgICAgIDAuMGYgLCAgICAgIDAuMGYsICAgICAgICAwLjBmLCAxLjBmKTsKKworCQkJaWYoVmVydGV4UHJvY2Vzc29yOjppc0ZpeGVkRnVuY3Rpb24oKSkgICAvLyBVc2VyIHBsYW5lIGluIHdvcmxkIHNwYWNlCisJCQl7CisJCQkJY29uc3QgTWF0cml4ICZzY2lzc29yV29ybGQgPSBzY2lzc29yQ2xpcCAqIGdldFZpZXdUcmFuc2Zvcm0oKTsKKworCQkJCWlmKGNsaXBGbGFncyAmIENsaXBwZXI6OkNMSVBfUExBTkUwKSBjbGlwUGxhbmVbMF0gPSBzY2lzc29yV29ybGQgKiB1c2VyUGxhbmVbMF07CisJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTEpIGNsaXBQbGFuZVsxXSA9IHNjaXNzb3JXb3JsZCAqIHVzZXJQbGFuZVsxXTsKKwkJCQlpZihjbGlwRmxhZ3MgJiBDbGlwcGVyOjpDTElQX1BMQU5FMikgY2xpcFBsYW5lWzJdID0gc2Npc3NvcldvcmxkICogdXNlclBsYW5lWzJdOworCQkJCWlmKGNsaXBGbGFncyAmIENsaXBwZXI6OkNMSVBfUExBTkUzKSBjbGlwUGxhbmVbM10gPSBzY2lzc29yV29ybGQgKiB1c2VyUGxhbmVbM107CisJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTQpIGNsaXBQbGFuZVs0XSA9IHNjaXNzb3JXb3JsZCAqIHVzZXJQbGFuZVs0XTsKKwkJCQlpZihjbGlwRmxhZ3MgJiBDbGlwcGVyOjpDTElQX1BMQU5FNSkgY2xpcFBsYW5lWzVdID0gc2Npc3NvcldvcmxkICogdXNlclBsYW5lWzVdOworCQkJfQorCQkJZWxzZSAgIC8vIFVzZXIgcGxhbmUgaW4gY2xpcCBzcGFjZQorCQkJeworCQkJCWlmKGNsaXBGbGFncyAmIENsaXBwZXI6OkNMSVBfUExBTkUwKSBjbGlwUGxhbmVbMF0gPSBzY2lzc29yQ2xpcCAqIHVzZXJQbGFuZVswXTsKKwkJCQlpZihjbGlwRmxhZ3MgJiBDbGlwcGVyOjpDTElQX1BMQU5FMSkgY2xpcFBsYW5lWzFdID0gc2Npc3NvckNsaXAgKiB1c2VyUGxhbmVbMV07CisJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTIpIGNsaXBQbGFuZVsyXSA9IHNjaXNzb3JDbGlwICogdXNlclBsYW5lWzJdOworCQkJCWlmKGNsaXBGbGFncyAmIENsaXBwZXI6OkNMSVBfUExBTkUzKSBjbGlwUGxhbmVbM10gPSBzY2lzc29yQ2xpcCAqIHVzZXJQbGFuZVszXTsKKwkJCQlpZihjbGlwRmxhZ3MgJiBDbGlwcGVyOjpDTElQX1BMQU5FNCkgY2xpcFBsYW5lWzRdID0gc2Npc3NvckNsaXAgKiB1c2VyUGxhbmVbNF07CisJCQkJaWYoY2xpcEZsYWdzICYgQ2xpcHBlcjo6Q0xJUF9QTEFORTUpIGNsaXBQbGFuZVs1XSA9IHNjaXNzb3JDbGlwICogdXNlclBsYW5lWzVdOworCQkJfQorCisJCQl1cGRhdGVDbGlwUGxhbmVzID0gZmFsc2U7CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRUZXh0dXJlUmVzb3VyY2UodW5zaWduZWQgaW50IHNhbXBsZXIsIFJlc291cmNlICpyZXNvdXJjZSkKKwl7CisJCUFTU0VSVChzYW1wbGVyIDwgKDE2ICsgNCkpOworCisJCWNvbnRleHQtPnRleHR1cmVbc2FtcGxlcl0gPSByZXNvdXJjZTsKKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRUZXh0dXJlTGV2ZWwodW5zaWduZWQgaW50IHNhbXBsZXIsIHVuc2lnbmVkIGludCBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwsIFN1cmZhY2UgKnN1cmZhY2UsIFRleHR1cmVUeXBlIHR5cGUpCisJeworCQlBU1NFUlQoc2FtcGxlciA8ICgxNiArIDQpICYmIGZhY2UgPCA2ICYmIGxldmVsIDwgTUlQTUFQX0xFVkVMUyk7CisJCQorCQljb250ZXh0LT5zYW1wbGVyW3NhbXBsZXJdLnNldFRleHR1cmVMZXZlbChmYWNlLCBsZXZlbCwgc3VyZmFjZSwgdHlwZSk7CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0VGV4dHVyZUZpbHRlcihTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgRmlsdGVyVHlwZSB0ZXh0dXJlRmlsdGVyKQorCXsKKwkJaWYodHlwZSA9PSBTQU1QTEVSX1BJWEVMKQorCQl7CisJCQlQaXhlbFByb2Nlc3Nvcjo6c2V0VGV4dHVyZUZpbHRlcihzYW1wbGVyLCB0ZXh0dXJlRmlsdGVyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVZlcnRleFByb2Nlc3Nvcjo6c2V0VGV4dHVyZUZpbHRlcihzYW1wbGVyLCB0ZXh0dXJlRmlsdGVyKTsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldE1pcG1hcEZpbHRlcihTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgTWlwbWFwVHlwZSBtaXBtYXBGaWx0ZXIpCisJeworCQlpZih0eXBlID09IFNBTVBMRVJfUElYRUwpCisJCXsKKwkJCVBpeGVsUHJvY2Vzc29yOjpzZXRNaXBtYXBGaWx0ZXIoc2FtcGxlciwgbWlwbWFwRmlsdGVyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVZlcnRleFByb2Nlc3Nvcjo6c2V0TWlwbWFwRmlsdGVyKHNhbXBsZXIsIG1pcG1hcEZpbHRlcik7CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRHYXRoZXJFbmFibGUoU2FtcGxlclR5cGUgdHlwZSwgaW50IHNhbXBsZXIsIGJvb2wgZW5hYmxlKQorCXsKKwkJaWYodHlwZSA9PSBTQU1QTEVSX1BJWEVMKQorCQl7CisJCQlQaXhlbFByb2Nlc3Nvcjo6c2V0R2F0aGVyRW5hYmxlKHNhbXBsZXIsIGVuYWJsZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlWZXJ0ZXhQcm9jZXNzb3I6OnNldEdhdGhlckVuYWJsZShzYW1wbGVyLCBlbmFibGUpOworCQl9CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0QWRkcmVzc2luZ01vZGVVKFNhbXBsZXJUeXBlIHR5cGUsIGludCBzYW1wbGVyLCBBZGRyZXNzaW5nTW9kZSBhZGRyZXNzTW9kZSkKKwl7CisJCWlmKHR5cGUgPT0gU0FNUExFUl9QSVhFTCkKKwkJeworCQkJUGl4ZWxQcm9jZXNzb3I6OnNldEFkZHJlc3NpbmdNb2RlVShzYW1wbGVyLCBhZGRyZXNzTW9kZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlWZXJ0ZXhQcm9jZXNzb3I6OnNldEFkZHJlc3NpbmdNb2RlVShzYW1wbGVyLCBhZGRyZXNzTW9kZSk7CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRBZGRyZXNzaW5nTW9kZVYoU2FtcGxlclR5cGUgdHlwZSwgaW50IHNhbXBsZXIsIEFkZHJlc3NpbmdNb2RlIGFkZHJlc3NNb2RlKQorCXsKKwkJaWYodHlwZSA9PSBTQU1QTEVSX1BJWEVMKQorCQl7CisJCQlQaXhlbFByb2Nlc3Nvcjo6c2V0QWRkcmVzc2luZ01vZGVWKHNhbXBsZXIsIGFkZHJlc3NNb2RlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVZlcnRleFByb2Nlc3Nvcjo6c2V0QWRkcmVzc2luZ01vZGVWKHNhbXBsZXIsIGFkZHJlc3NNb2RlKTsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldEFkZHJlc3NpbmdNb2RlVyhTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgQWRkcmVzc2luZ01vZGUgYWRkcmVzc01vZGUpCisJeworCQlpZih0eXBlID09IFNBTVBMRVJfUElYRUwpCisJCXsKKwkJCVBpeGVsUHJvY2Vzc29yOjpzZXRBZGRyZXNzaW5nTW9kZVcoc2FtcGxlciwgYWRkcmVzc01vZGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJVmVydGV4UHJvY2Vzc29yOjpzZXRBZGRyZXNzaW5nTW9kZVcoc2FtcGxlciwgYWRkcmVzc01vZGUpOworCQl9CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0UmVhZFNSR0IoU2FtcGxlclR5cGUgdHlwZSwgaW50IHNhbXBsZXIsIGJvb2wgc1JHQikKKwl7CisJCWlmKHR5cGUgPT0gU0FNUExFUl9QSVhFTCkKKwkJeworCQkJUGl4ZWxQcm9jZXNzb3I6OnNldFJlYWRTUkdCKHNhbXBsZXIsIHNSR0IpOworCQl9CisJCWVsc2UKKwkJeworCQkJVmVydGV4UHJvY2Vzc29yOjpzZXRSZWFkU1JHQihzYW1wbGVyLCBzUkdCKTsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldE1pcG1hcExPRChTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgZmxvYXQgYmlhcykKKwl7CisJCWlmKHR5cGUgPT0gU0FNUExFUl9QSVhFTCkKKwkJeworCQkJUGl4ZWxQcm9jZXNzb3I6OnNldE1pcG1hcExPRChzYW1wbGVyLCBiaWFzKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVZlcnRleFByb2Nlc3Nvcjo6c2V0TWlwbWFwTE9EKHNhbXBsZXIsIGJpYXMpOworCQl9CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0Qm9yZGVyQ29sb3IoU2FtcGxlclR5cGUgdHlwZSwgaW50IHNhbXBsZXIsIGNvbnN0IENvbG9yPGZsb2F0PiAmYm9yZGVyQ29sb3IpCisJeworCQlpZih0eXBlID09IFNBTVBMRVJfUElYRUwpCisJCXsKKwkJCVBpeGVsUHJvY2Vzc29yOjpzZXRCb3JkZXJDb2xvcihzYW1wbGVyLCBib3JkZXJDb2xvcik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlWZXJ0ZXhQcm9jZXNzb3I6OnNldEJvcmRlckNvbG9yKHNhbXBsZXIsIGJvcmRlckNvbG9yKTsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldE1heEFuaXNvdHJvcHkoU2FtcGxlclR5cGUgdHlwZSwgaW50IHNhbXBsZXIsIHVuc2lnbmVkIGludCBtYXhBbmlzb3Ryb3B5KQorCXsKKwkJaWYodHlwZSA9PSBTQU1QTEVSX1BJWEVMKQorCQl7CisJCQlQaXhlbFByb2Nlc3Nvcjo6c2V0TWF4QW5pc290cm9weShzYW1wbGVyLCBtYXhBbmlzb3Ryb3B5KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVZlcnRleFByb2Nlc3Nvcjo6c2V0TWF4QW5pc290cm9weShzYW1wbGVyLCBtYXhBbmlzb3Ryb3B5KTsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldFBvaW50U3ByaXRlRW5hYmxlKGJvb2wgcG9pbnRTcHJpdGVFbmFibGUpCisJeworCQljb250ZXh0LT5zZXRQb2ludFNwcml0ZUVuYWJsZShwb2ludFNwcml0ZUVuYWJsZSk7CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0UG9pbnRTY2FsZUVuYWJsZShib29sIHBvaW50U2NhbGVFbmFibGUpCisJeworCQljb250ZXh0LT5zZXRQb2ludFNjYWxlRW5hYmxlKHBvaW50U2NhbGVFbmFibGUpOworCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldERlcHRoQmlhcyhmbG9hdCBiaWFzKQorCXsKKwkJZGVwdGhCaWFzID0gYmlhczsKKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRTbG9wZURlcHRoQmlhcyhmbG9hdCBzbG9wZUJpYXMpCisJeworCQlzbG9wZURlcHRoQmlhcyA9IHNsb3BlQmlhczsKKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRQaXhlbFNoYWRlcihjb25zdCBQaXhlbFNoYWRlciAqc2hhZGVyKQorCXsKKwkJY29udGV4dC0+cGl4ZWxTaGFkZXIgPSBzaGFkZXI7CisKKwkJbG9hZENvbnN0YW50cyhzaGFkZXIpOworCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldFZlcnRleFNoYWRlcihjb25zdCBWZXJ0ZXhTaGFkZXIgKnNoYWRlcikKKwl7CisJCWNvbnRleHQtPnZlcnRleFNoYWRlciA9IHNoYWRlcjsKKworCQlsb2FkQ29uc3RhbnRzKHNoYWRlcik7CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoaW50IGluZGV4LCBjb25zdCBmbG9hdCB2YWx1ZVs0XSwgaW50IGNvdW50KQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IERSQVdfQ09VTlQ7IGkrKykKKwkJeworCQkJaWYoZHJhd0NhbGxbaV0tPnBzRGlydHlDb25zdEYgPCBpbmRleCArIGNvdW50KQorCQkJeworCQkJCWRyYXdDYWxsW2ldLT5wc0RpcnR5Q29uc3RGID0gaW5kZXggKyBjb3VudDsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl7CisJCQlQaXhlbFByb2Nlc3Nvcjo6c2V0RmxvYXRDb25zdGFudChpbmRleCArIGksIHZhbHVlKTsKKwkJCXZhbHVlICs9IDQ7CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRQaXhlbFNoYWRlckNvbnN0YW50SShpbnQgaW5kZXgsIGNvbnN0IGludCB2YWx1ZVs0XSwgaW50IGNvdW50KQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IERSQVdfQ09VTlQ7IGkrKykKKwkJeworCQkJaWYoZHJhd0NhbGxbaV0tPnBzRGlydHlDb25zdEkgPCBpbmRleCArIGNvdW50KQorCQkJeworCQkJCWRyYXdDYWxsW2ldLT5wc0RpcnR5Q29uc3RJID0gaW5kZXggKyBjb3VudDsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl7CisJCQlQaXhlbFByb2Nlc3Nvcjo6c2V0SW50ZWdlckNvbnN0YW50KGluZGV4ICsgaSwgdmFsdWUpOworCQkJdmFsdWUgKz0gNDsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldFBpeGVsU2hhZGVyQ29uc3RhbnRCKGludCBpbmRleCwgY29uc3QgaW50ICpib29sZWFuLCBpbnQgY291bnQpCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgRFJBV19DT1VOVDsgaSsrKQorCQl7CisJCQlpZihkcmF3Q2FsbFtpXS0+cHNEaXJ0eUNvbnN0QiA8IGluZGV4ICsgY291bnQpCisJCQl7CisJCQkJZHJhd0NhbGxbaV0tPnBzRGlydHlDb25zdEIgPSBpbmRleCArIGNvdW50OworCQkJfQorCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCVBpeGVsUHJvY2Vzc29yOjpzZXRCb29sZWFuQ29uc3RhbnQoaW5kZXggKyBpLCAqYm9vbGVhbik7CisJCQlib29sZWFuKys7CisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoaW50IGluZGV4LCBjb25zdCBmbG9hdCB2YWx1ZVs0XSwgaW50IGNvdW50KQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IERSQVdfQ09VTlQ7IGkrKykKKwkJeworCQkJaWYoZHJhd0NhbGxbaV0tPnZzRGlydHlDb25zdEYgPCBpbmRleCArIGNvdW50KQorCQkJeworCQkJCWRyYXdDYWxsW2ldLT52c0RpcnR5Q29uc3RGID0gaW5kZXggKyBjb3VudDsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl7CisJCQlWZXJ0ZXhQcm9jZXNzb3I6OnNldEZsb2F0Q29uc3RhbnQoaW5kZXggKyBpLCB2YWx1ZSk7CisJCQl2YWx1ZSArPSA0OworCQl9CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKGludCBpbmRleCwgY29uc3QgaW50IHZhbHVlWzRdLCBpbnQgY291bnQpCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgRFJBV19DT1VOVDsgaSsrKQorCQl7CisJCQlpZihkcmF3Q2FsbFtpXS0+dnNEaXJ0eUNvbnN0SSA8IGluZGV4ICsgY291bnQpCisJCQl7CisJCQkJZHJhd0NhbGxbaV0tPnZzRGlydHlDb25zdEkgPSBpbmRleCArIGNvdW50OworCQkJfQorCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCVZlcnRleFByb2Nlc3Nvcjo6c2V0SW50ZWdlckNvbnN0YW50KGluZGV4ICsgaSwgdmFsdWUpOworCQkJdmFsdWUgKz0gNDsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldFZlcnRleFNoYWRlckNvbnN0YW50QihpbnQgaW5kZXgsIGNvbnN0IGludCAqYm9vbGVhbiwgaW50IGNvdW50KQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IERSQVdfQ09VTlQ7IGkrKykKKwkJeworCQkJaWYoZHJhd0NhbGxbaV0tPnZzRGlydHlDb25zdEIgPCBpbmRleCArIGNvdW50KQorCQkJeworCQkJCWRyYXdDYWxsW2ldLT52c0RpcnR5Q29uc3RCID0gaW5kZXggKyBjb3VudDsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl7CisJCQlWZXJ0ZXhQcm9jZXNzb3I6OnNldEJvb2xlYW5Db25zdGFudChpbmRleCArIGksICpib29sZWFuKTsKKwkJCWJvb2xlYW4rKzsKKwkJfQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldE1vZGVsTWF0cml4KGNvbnN0IE1hdHJpeCAmTSwgaW50IGkpCisJeworCQlWZXJ0ZXhQcm9jZXNzb3I6OnNldE1vZGVsTWF0cml4KE0sIGkpOworCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldFZpZXdNYXRyaXgoY29uc3QgTWF0cml4ICZWKQorCXsKKwkJVmVydGV4UHJvY2Vzc29yOjpzZXRWaWV3TWF0cml4KFYpOworCQl1cGRhdGVDbGlwUGxhbmVzID0gdHJ1ZTsKKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzZXRCYXNlTWF0cml4KGNvbnN0IE1hdHJpeCAmQikKKwl7CisJCVZlcnRleFByb2Nlc3Nvcjo6c2V0QmFzZU1hdHJpeChCKTsKKwkJdXBkYXRlQ2xpcFBsYW5lcyA9IHRydWU7CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0UHJvamVjdGlvbk1hdHJpeChjb25zdCBNYXRyaXggJlApCisJeworCQlWZXJ0ZXhQcm9jZXNzb3I6OnNldFByb2plY3Rpb25NYXRyaXgoUCk7CisJCXVwZGF0ZUNsaXBQbGFuZXMgPSB0cnVlOworCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldFBvc3RUcmFuc2Zvcm1FbmFibGUoYm9vbCBlbmFibGUpCisJeworCQljb250ZXh0LT5wb3N0VHJhbnNmb3JtID0gZW5hYmxlOworCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldFBvc1NjYWxlKGZsb2F0IHgsIGZsb2F0IHkpCisJeworCQlwb3NTY2FsZVswXSA9IHg7CisJCXBvc1NjYWxlWzFdID0geTsKKwkJcG9zU2NhbGVbMl0gPSAxOworCQlwb3NTY2FsZVszXSA9IDE7CisKKwkJdXBkYXRlQ2xpcFBsYW5lcyA9IHRydWU7CisJfQorCisJdm9pZCBSZW5kZXJlcjo6c2V0UG9zT2Zmc2V0KGZsb2F0IHgsIGZsb2F0IHkpCisJeworCQlwb3NPZmZzZXRbMF0gPSB4OworCQlwb3NPZmZzZXRbMV0gPSB5OworCQlwb3NPZmZzZXRbMl0gPSAwOworCQlwb3NPZmZzZXRbM10gPSAwOworCisJCXVwZGF0ZUNsaXBQbGFuZXMgPSB0cnVlOworCX0KKworCXZvaWQgUmVuZGVyZXI6OmFkZFF1ZXJ5KFF1ZXJ5ICpxdWVyeSkKKwl7CisJCXF1ZXJpZXMucHVzaF9iYWNrKHF1ZXJ5KTsKKwl9CisJCisJdm9pZCBSZW5kZXJlcjo6cmVtb3ZlUXVlcnkoUXVlcnkgKnF1ZXJ5KQorCXsKKwkJcXVlcmllcy5yZW1vdmUocXVlcnkpOworCX0KKworCSNpZiBQRVJGX0hVRAorCQlpbnQgUmVuZGVyZXI6OmdldFRocmVhZENvdW50KCkKKwkJeworCQkJcmV0dXJuIHRocmVhZENvdW50OworCQl9CisJCQorCQlpbnQ2NF90IFJlbmRlcmVyOjpnZXRWZXJ0ZXhUaW1lKGludCB0aHJlYWQpCisJCXsKKwkJCXJldHVybiB2ZXJ0ZXhUaW1lW3RocmVhZF07CisJCX0KKworCQlpbnQ2NF90IFJlbmRlcmVyOjpnZXRTZXR1cFRpbWUoaW50IHRocmVhZCkKKwkJeworCQkJcmV0dXJuIHNldHVwVGltZVt0aHJlYWRdOworCQl9CisJCQkKKwkJaW50NjRfdCBSZW5kZXJlcjo6Z2V0UGl4ZWxUaW1lKGludCB0aHJlYWQpCisJCXsKKwkJCXJldHVybiBwaXhlbFRpbWVbdGhyZWFkXTsKKwkJfQorCisJCXZvaWQgUmVuZGVyZXI6OnJlc2V0VGltZXJzKCkKKwkJeworCQkJZm9yKGludCB0aHJlYWQgPSAwOyB0aHJlYWQgPCB0aHJlYWRDb3VudDsgdGhyZWFkKyspCisJCQl7CisJCQkJdmVydGV4VGltZVt0aHJlYWRdID0gMDsKKwkJCQlzZXR1cFRpbWVbdGhyZWFkXSA9IDA7CisJCQkJcGl4ZWxUaW1lW3RocmVhZF0gPSAwOworCQkJfQorCQl9CisJI2VuZGlmCisKKwl2b2lkIFJlbmRlcmVyOjpzZXRWaWV3cG9ydChjb25zdCBWaWV3cG9ydCAmdmlld3BvcnQpCisJeworCQl0aGlzLT52aWV3cG9ydCA9IHZpZXdwb3J0OworCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldENsaXBGbGFncyhpbnQgZmxhZ3MpCisJeworCQljbGlwRmxhZ3MgPSBmbGFncyA8PCA4OyAgIC8vIEJvdHRvbSA4IGJpdHMgdXNlZCBieSBsZWdhY3kgZnJ1c3R1bQorCX0KKworCXZvaWQgUmVuZGVyZXI6OnNldENsaXBQbGFuZSh1bnNpZ25lZCBpbnQgaW5kZXgsIGNvbnN0IGZsb2F0IHBsYW5lWzRdKQorCXsKKwkJaWYoaW5kZXggPCA2KQorCQl7CisJCQl1c2VyUGxhbmVbaW5kZXhdID0gcGxhbmU7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCisJCXVwZGF0ZUNsaXBQbGFuZXMgPSB0cnVlOworCX0KKworCXZvaWQgUmVuZGVyZXI6OnVwZGF0ZUNvbmZpZ3VyYXRpb24oYm9vbCBpbml0aWFsVXBkYXRlKQorCXsKKwkJYm9vbCBuZXdDb25maWd1cmF0aW9uID0gc3dpZnRDb25maWctPmhhc05ld0NvbmZpZ3VyYXRpb24oKTsKKworCQlpZihuZXdDb25maWd1cmF0aW9uIHx8IGluaXRpYWxVcGRhdGUpCisJCXsKKwkJCXRlcm1pbmF0ZVRocmVhZHMoKTsKKworCQkJU3dpZnRDb25maWc6OkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHswfTsKKwkJCXN3aWZ0Q29uZmlnLT5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOworCisJCQlWZXJ0ZXhQcm9jZXNzb3I6OnNldFJvdXRpbmVDYWNoZVNpemUoY29uZmlndXJhdGlvbi52ZXJ0ZXhSb3V0aW5lQ2FjaGVTaXplKTsKKwkJCVBpeGVsUHJvY2Vzc29yOjpzZXRSb3V0aW5lQ2FjaGVTaXplKGNvbmZpZ3VyYXRpb24ucGl4ZWxSb3V0aW5lQ2FjaGVTaXplKTsKKwkJCVNldHVwUHJvY2Vzc29yOjpzZXRSb3V0aW5lQ2FjaGVTaXplKGNvbmZpZ3VyYXRpb24uc2V0dXBSb3V0aW5lQ2FjaGVTaXplKTsKKworCQkJc3dpdGNoKGNvbmZpZ3VyYXRpb24udGV4dHVyZVNhbXBsZVF1YWxpdHkpCisJCQl7CisJCQljYXNlIDA6ICBTYW1wbGVyOjpzZXRGaWx0ZXJRdWFsaXR5KEZJTFRFUl9QT0lOVCk7CQkJYnJlYWs7CisJCQljYXNlIDE6ICBTYW1wbGVyOjpzZXRGaWx0ZXJRdWFsaXR5KEZJTFRFUl9MSU5FQVIpOwkJCWJyZWFrOworCQkJY2FzZSAyOiAgU2FtcGxlcjo6c2V0RmlsdGVyUXVhbGl0eShGSUxURVJfQU5JU09UUk9QSUMpOwlicmVhazsKKwkJCWRlZmF1bHQ6IFNhbXBsZXI6OnNldEZpbHRlclF1YWxpdHkoRklMVEVSX0FOSVNPVFJPUElDKTsJYnJlYWs7CisJCQl9CisKKwkJCXN3aXRjaChjb25maWd1cmF0aW9uLm1pcG1hcFF1YWxpdHkpCisJCQl7CisJCQljYXNlIDA6ICBTYW1wbGVyOjpzZXRNaXBtYXBRdWFsaXR5KE1JUE1BUF9QT0lOVCk7ICBicmVhazsKKwkJCWNhc2UgMTogIFNhbXBsZXI6OnNldE1pcG1hcFF1YWxpdHkoTUlQTUFQX0xJTkVBUik7IGJyZWFrOworCQkJZGVmYXVsdDogU2FtcGxlcjo6c2V0TWlwbWFwUXVhbGl0eShNSVBNQVBfTElORUFSKTsgIGJyZWFrOworCQkJfQorCisJCQlzZXRQZXJzcGVjdGl2ZUNvcnJlY3Rpb24oY29uZmlndXJhdGlvbi5wZXJzcGVjdGl2ZUNvcnJlY3Rpb24pOworCisJCQlzd2l0Y2goY29uZmlndXJhdGlvbi50cmFuc2NlbmRlbnRhbFByZWNpc2lvbikKKwkJCXsKKwkJCWNhc2UgMDoKKwkJCQlsb2dQcmVjaXNpb24gPSBBUFBST1hJTUFURTsKKwkJCQlleHBQcmVjaXNpb24gPSBBUFBST1hJTUFURTsKKwkJCQlyY3BQcmVjaXNpb24gPSBBUFBST1hJTUFURTsKKwkJCQlyc3FQcmVjaXNpb24gPSBBUFBST1hJTUFURTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlsb2dQcmVjaXNpb24gPSBQQVJUSUFMOworCQkJCWV4cFByZWNpc2lvbiA9IFBBUlRJQUw7CisJCQkJcmNwUHJlY2lzaW9uID0gUEFSVElBTDsKKwkJCQlyc3FQcmVjaXNpb24gPSBQQVJUSUFMOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWxvZ1ByZWNpc2lvbiA9IEFDQ1VSQVRFOworCQkJCWV4cFByZWNpc2lvbiA9IEFDQ1VSQVRFOworCQkJCXJjcFByZWNpc2lvbiA9IEFDQ1VSQVRFOworCQkJCXJzcVByZWNpc2lvbiA9IEFDQ1VSQVRFOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWxvZ1ByZWNpc2lvbiA9IFdIUUw7CisJCQkJZXhwUHJlY2lzaW9uID0gV0hRTDsKKwkJCQlyY3BQcmVjaXNpb24gPSBXSFFMOworCQkJCXJzcVByZWNpc2lvbiA9IFdIUUw7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJbG9nUHJlY2lzaW9uID0gSUVFRTsKKwkJCQlleHBQcmVjaXNpb24gPSBJRUVFOworCQkJCXJjcFByZWNpc2lvbiA9IElFRUU7CisJCQkJcnNxUHJlY2lzaW9uID0gSUVFRTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbG9nUHJlY2lzaW9uID0gQUNDVVJBVEU7CisJCQkJZXhwUHJlY2lzaW9uID0gQUNDVVJBVEU7CisJCQkJcmNwUHJlY2lzaW9uID0gQUNDVVJBVEU7CisJCQkJcnNxUHJlY2lzaW9uID0gQUNDVVJBVEU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXN3aXRjaChjb25maWd1cmF0aW9uLnRyYW5zcGFyZW5jeUFudGlhbGlhc2luZykKKwkJCXsKKwkJCWNhc2UgMDoJCXRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyA9IENvbnRleHQ6OlRSQU5TUEFSRU5DWV9OT05FOwkJCQlicmVhazsKKwkJCWNhc2UgMToJCXRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyA9IENvbnRleHQ6OlRSQU5TUEFSRU5DWV9BTFBIQV9UT19DT1ZFUkFHRTsJYnJlYWs7CisJCQlkZWZhdWx0Ogl0cmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcgPSBDb250ZXh0OjpUUkFOU1BBUkVOQ1lfTk9ORTsJCQkJYnJlYWs7CisJCQl9CisKKwkJCXN3aXRjaChjb25maWd1cmF0aW9uLnRocmVhZENvdW50KQorCQkJeworCQkJY2FzZSAtMTogaW5pdGlhbGl6ZVRocmVhZHMoQ1BVSUQ6OmNvcmVDb3VudCgpKTsgICAgICAgIGJyZWFrOworCQkJY2FzZSAwOiAgaW5pdGlhbGl6ZVRocmVhZHMoQ1BVSUQ6OnByb2Nlc3NBZmZpbml0eSgpKTsgIGJyZWFrOworCQkJZGVmYXVsdDogaW5pdGlhbGl6ZVRocmVhZHMoY29uZmlndXJhdGlvbi50aHJlYWRDb3VudCk7IGJyZWFrOworCQkJfQorCisJCQlDUFVJRDo6c2V0RW5hYmxlU1NFNF8xKGNvbmZpZ3VyYXRpb24uZW5hYmxlU1NFNF8xKTsKKwkJCUNQVUlEOjpzZXRFbmFibGVTU1NFMyhjb25maWd1cmF0aW9uLmVuYWJsZVNTU0UzKTsKKwkJCUNQVUlEOjpzZXRFbmFibGVTU0UzKGNvbmZpZ3VyYXRpb24uZW5hYmxlU1NFMyk7CisJCQlDUFVJRDo6c2V0RW5hYmxlU1NFMihjb25maWd1cmF0aW9uLmVuYWJsZVNTRTIpOworCQkJQ1BVSUQ6OnNldEVuYWJsZVNTRShjb25maWd1cmF0aW9uLmVuYWJsZVNTRSk7CisKKwkJCWZvcihpbnQgcGFzcyA9IDA7IHBhc3MgPCAxMDsgcGFzcysrKQorCQkJeworCQkJCW9wdGltaXphdGlvbltwYXNzXSA9IGNvbmZpZ3VyYXRpb24ub3B0aW1pemF0aW9uW3Bhc3NdOworCQkJfQorCisJCQlmb3JjZVdpbmRvd2VkID0gY29uZmlndXJhdGlvbi5mb3JjZVdpbmRvd2VkOworCQkJY29tcGxlbWVudGFyeURlcHRoQnVmZmVyID0gY29uZmlndXJhdGlvbi5jb21wbGVtZW50YXJ5RGVwdGhCdWZmZXI7CisJCQlwb3N0QmxlbmRTUkdCID0gY29uZmlndXJhdGlvbi5wb3N0QmxlbmRTUkdCOworCQkJZXhhY3RDb2xvclJvdW5kaW5nID0gY29uZmlndXJhdGlvbi5leGFjdENvbG9yUm91bmRpbmc7CisJCQlmb3JjZUNsZWFyUmVnaXN0ZXJzID0gY29uZmlndXJhdGlvbi5mb3JjZUNsZWFyUmVnaXN0ZXJzOworCisJCSNpZm5kZWYgTkRFQlVHCisJCQltaW5QcmltaXRpdmVzID0gY29uZmlndXJhdGlvbi5taW5QcmltaXRpdmVzOworCQkJbWF4UHJpbWl0aXZlcyA9IGNvbmZpZ3VyYXRpb24ubWF4UHJpbWl0aXZlczsKKwkJI2VuZGlmCisJCX0KKwl9CisKKwl2b2lkIFJlbmRlcmVyOjpzdGFydHVwQ29uZmlndXJhdGlvbigpCisJeworCQlpZighQ1BVSUQ6OnN1cHBvcnRzU1NFMigpKQorCQl7CisJCQlNZXNzYWdlQm94KDAsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncmFwaGljczogc29mdHdhcmUgbW9kZSByZXF1aXJlcyBTU0UyIHN1cHBvcnQgKFBlbnRpdW0gNCwgQXRobG9uIDY0LCBvciBoaWdoZXIpLiBBYm9ydGluZyBhcHBsaWNhdGlvbi4iLCAwLCBNQl9JQ09ORVJST1IpOworCisJCQlleGl0KDApOworCQl9CisKKwkJaWYobWF4aW11bUZpbHRlclF1YWxpdHkgIT0gU1dGX0RFRkFVTFQpCisJCXsKKwkJCXN3aXRjaChtYXhpbXVtRmlsdGVyUXVhbGl0eSkKKwkJCXsKKwkJCWNhc2UgU1dGX0RFRkFVTFQ6CVNhbXBsZXI6OnNldEZpbHRlclF1YWxpdHkoRklMVEVSX0xJTkVBUik7CWJyZWFrOworCQkJY2FzZSBTV0ZfTk9ORToJCVNhbXBsZXI6OnNldEZpbHRlclF1YWxpdHkoRklMVEVSX1BPSU5UKTsJYnJlYWs7CisJCQljYXNlIFNXRl9QT0lOVDoJCVNhbXBsZXI6OnNldEZpbHRlclF1YWxpdHkoRklMVEVSX1BPSU5UKTsJYnJlYWs7CisJCQljYXNlIFNXRl9BVkVSQUdFMjoJU2FtcGxlcjo6c2V0RmlsdGVyUXVhbGl0eShGSUxURVJfTElORUFSKTsJYnJlYWs7CisJCQljYXNlIFNXRl9BVkVSQUdFNDoJU2FtcGxlcjo6c2V0RmlsdGVyUXVhbGl0eShGSUxURVJfTElORUFSKTsJYnJlYWs7CisJCQljYXNlIFNXRl9QT0xZR09OOglTYW1wbGVyOjpzZXRGaWx0ZXJRdWFsaXR5KEZJTFRFUl9MSU5FQVIpOwlicmVhazsKKwkJCWNhc2UgU1dGX0xJTkVBUjoJU2FtcGxlcjo6c2V0RmlsdGVyUXVhbGl0eShGSUxURVJfTElORUFSKTsJYnJlYWs7CisJCQljYXNlIFNXRl9NQVhJTVVNOglTYW1wbGVyOjpzZXRGaWx0ZXJRdWFsaXR5KEZJTFRFUl9MSU5FQVIpOwlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCisJCWlmKG1heGltdW1NaXBtYXBRdWFsaXR5ICE9IFNXRl9ERUZBVUxUKQorCQl7CisJCQlzd2l0Y2gobWF4aW11bU1pcG1hcFF1YWxpdHkpCisJCQl7CisJCQljYXNlIFNXRl9ERUZBVUxUOglTYW1wbGVyOjpzZXRNaXBtYXBRdWFsaXR5KE1JUE1BUF9QT0lOVCk7CWJyZWFrOworCQkJY2FzZSBTV0ZfTk9ORToJCVNhbXBsZXI6OnNldE1pcG1hcFF1YWxpdHkoTUlQTUFQX05PTkUpOwlicmVhazsKKwkJCWNhc2UgU1dGX1BPSU5UOgkJU2FtcGxlcjo6c2V0TWlwbWFwUXVhbGl0eShNSVBNQVBfUE9JTlQpOwlicmVhazsKKwkJCWNhc2UgU1dGX0FWRVJBR0UyOglTYW1wbGVyOjpzZXRNaXBtYXBRdWFsaXR5KE1JUE1BUF9QT0lOVCk7CWJyZWFrOworCQkJY2FzZSBTV0ZfQVZFUkFHRTQ6CVNhbXBsZXI6OnNldE1pcG1hcFF1YWxpdHkoTUlQTUFQX1BPSU5UKTsJYnJlYWs7CisJCQljYXNlIFNXRl9QT0xZR09OOglTYW1wbGVyOjpzZXRNaXBtYXBRdWFsaXR5KE1JUE1BUF9QT0lOVCk7CWJyZWFrOworCQkJY2FzZSBTV0ZfTElORUFSOglTYW1wbGVyOjpzZXRNaXBtYXBRdWFsaXR5KE1JUE1BUF9MSU5FQVIpOwlicmVhazsKKwkJCWNhc2UgU1dGX01BWElNVU06CVNhbXBsZXI6OnNldE1pcG1hcFF1YWxpdHkoTUlQTUFQX0xJTkVBUik7CWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCQl9CisKKwkJaWYocGVyc3BlY3RpdmVRdWFsaXR5ICE9IFNXUF9ERUZBVUxUKQorCQl7CisJCQlzd2l0Y2gocGVyc3BlY3RpdmVRdWFsaXR5KQorCQkJeworCQkJY2FzZSBTV1BfREVGQVVMVDoJc2V0UGVyc3BlY3RpdmVDb3JyZWN0aW9uKHRydWUpOwkJYnJlYWs7CisJCQljYXNlIFNXUF9OT05FOgkJc2V0UGVyc3BlY3RpdmVDb3JyZWN0aW9uKGZhbHNlKTsJYnJlYWs7CisJCQljYXNlIFNXUF9GQVNUOgkJc2V0UGVyc3BlY3RpdmVDb3JyZWN0aW9uKHRydWUpOwkJYnJlYWs7CisJCQljYXNlIFNXUF9BQ0NVUkFURToJc2V0UGVyc3BlY3RpdmVDb3JyZWN0aW9uKHRydWUpOwkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKworCQljb25zdCBjaGFyICpjb21tYW5kTGluZSA9IEdldENvbW1hbmRMaW5lKCk7CisJCWJvb2wgd2hxbCA9IChzdHJzdHIoY29tbWFuZExpbmUsICItV0hRTCIpICE9IDApIHx8IChzdHJzdHIoY29tbWFuZExpbmUsICItVEhRTCIpICE9IDApOworCisJCWlmKHdocWwpCisJCXsKKwkJCVNhbXBsZXI6OnNldEZpbHRlclF1YWxpdHkoRklMVEVSX0FOSVNPVFJPUElDKTsKKwkJCVNhbXBsZXI6OnNldE1pcG1hcFF1YWxpdHkoTUlQTUFQX0xJTkVBUik7CisKKwkJCWxvZ1ByZWNpc2lvbiA9IFdIUUw7CisJCQlleHBQcmVjaXNpb24gPSBXSFFMOworCQkJcmNwUHJlY2lzaW9uID0gV0hRTDsKKwkJCXJzcVByZWNpc2lvbiA9IFdIUUw7CisJCQlwZXJzcGVjdGl2ZUNvcnJlY3Rpb24gPSB0cnVlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1JlbmRlcmVyLmhwcCBiL3NyYy9SZW5kZXJlci9SZW5kZXJlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2OGYzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9SZW5kZXJlci5ocHAKQEAgLTAsMCArMSw0MTEgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBzd19SZW5kZXJlcl9ocHAKKyNkZWZpbmUgc3dfUmVuZGVyZXJfaHBwCisKKyNpbmNsdWRlICJWZXJ0ZXhQcm9jZXNzb3IuaHBwIgorI2luY2x1ZGUgIlBpeGVsUHJvY2Vzc29yLmhwcCIKKyNpbmNsdWRlICJTZXR1cFByb2Nlc3Nvci5ocHAiCisjaW5jbHVkZSAiVmlld3BvcnQuaHBwIgorI2luY2x1ZGUgIlBsYW5lLmhwcCIKKyNpbmNsdWRlICJCbGl0dGVyLmhwcCIKKyNpbmNsdWRlICJDb21tb24vTXV0ZXhMb2NrLmhwcCIKKyNpbmNsdWRlICJDb21tb24vVGhyZWFkLmhwcCIKKyNpbmNsdWRlICJNYWluL0NvbmZpZy5ocHAiCisKKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2Ugc3cKK3sKKwljbGFzcyBDbGlwcGVyOworCWNsYXNzIFZpZXdwb3J0OworCWNsYXNzIFBpeGVsU2hhZGVyOworCWNsYXNzIFZlcnRleFNoYWRlcjsKKwljbGFzcyBTd2lmdENvbmZpZzsKKwlzdHJ1Y3QgVGFzazsKKwljbGFzcyBSZXNvdXJjZTsKKwljbGFzcyBSZW5kZXJlcjsKKworCWV4dGVybiBpbnQgYmF0Y2hTaXplOworCWV4dGVybiBpbnQgdGhyZWFkQ291bnQ7CisJZXh0ZXJuIGludCB1bml0Q291bnQ7CisJZXh0ZXJuIGludCBjbHVzdGVyQ291bnQ7CisKKwlzdHJ1Y3QgUXVlcnkKKwl7CisJCVF1ZXJ5KCkKKwkJeworCQkJYnVpbGRpbmcgPSBmYWxzZTsKKwkJCXJlZmVyZW5jZSA9IDA7CisJCQlkYXRhID0gMDsKKwkJfQorCisJCXZvaWQgYmVnaW4oKQorCQl7CisJCQlidWlsZGluZyA9IHRydWU7CisJCQlkYXRhID0gMDsKKwkJfQorCisJCXZvaWQgZW5kKCkKKwkJeworCQkJYnVpbGRpbmcgPSBmYWxzZTsKKwkJfQorCisJCWJvb2wgYnVpbGRpbmc7CisJCXZvbGF0aWxlIGludCByZWZlcmVuY2U7CisJCXZvbGF0aWxlIHVuc2lnbmVkIGludCBkYXRhOworCX07CisKKwlzdHJ1Y3QgRHJhd0RhdGEKKwl7CisJCWNvbnN0IHZvaWQgKmNvbnN0YW50czsKKworCQljb25zdCB2b2lkICppbnB1dFsxNl07CisJCXVuc2lnbmVkIGludCBzdHJpZGVbMTZdOworCQlUZXh0dXJlIG1pcG1hcFsxNiArIDRdOworCQljb25zdCB2b2lkICppbmRpY2VzOworCisJCXN0cnVjdCBWUworCQl7CisJCQlmbG9hdDQgY1syNTYgKyAxXTsgICAvLyBPbmUgZXh0cmEgZm9yIGluZGljZXMgb3V0IG9mIHJhbmdlLCBjWzI1Nl0gPSB7MCwgMCwgMCwgMH0KKwkJCWludDQgaVsxNl07CisJCQlib29sIGJbMTZdOworCQl9OworCisJCXN0cnVjdCBQUworCQl7CisJCQl3b3JkNCBjV1s4XVs0XTsKKwkJCWZsb2F0NCBjWzIyNF07CisJCQlpbnQ0IGlbMTZdOworCQkJYm9vbCBiWzE2XTsKKwkJfTsKKworCQl1bmlvbgorCQl7CisJCQlWUyB2czsKKwkJCVZlcnRleFByb2Nlc3Nvcjo6Rml4ZWRGdW5jdGlvbiBmZjsKKwkJfTsKKworCQlQUyBwczsKKworCQlWZXJ0ZXhQcm9jZXNzb3I6OlBvaW50U3ByaXRlIHBvaW50OworCisJCVBpeGVsUHJvY2Vzc29yOjpTdGVuY2lsIHN0ZW5jaWxbMl07ICAgLy8gY2xvY2t3aXNlLCBjb3VudGVyY2xvY2t3aXNlCisJCVBpeGVsUHJvY2Vzc29yOjpTdGVuY2lsIHN0ZW5jaWxDQ1c7CisJCVBpeGVsUHJvY2Vzc29yOjpGb2cgZm9nOworCQlQaXhlbFByb2Nlc3Nvcjo6RmFjdG9yIGZhY3RvcjsKKwkJdW5zaWduZWQgaW50IG9jY2x1c2lvblsxNl07ICAgLy8gTnVtYmVyIG9mIHBpeGVscyBwYXNzaW5nIGRlcHRoIHRlc3QKKworCQkjaWYgUEVSRl9QUk9GSUxFCisJCQlpbnQ2NF90IGN5Y2xlc1tQRVJGX1RJTUVSU11bMTZdOworCQkjZW5kaWYKKworCQlUZXh0dXJlU3RhZ2U6OlVuaWZvcm1zIHRleHR1cmVTdGFnZVs4XTsKKworCQlmbG9hdDQgV1dXV3gxNjsKKwkJZmxvYXQ0IEhISEh4MTY7CisJCWZsb2F0NCBMTExMeDE2OworCQlmbG9hdDQgVFRUVHgxNjsKKwkJZmxvYXQ0IFpaWlo7CisJCWZsb2F0NCBYWFhYOworCQlmbG9hdDQgWVlZWTsKKwkJZmxvYXQ0IG9mZlg7CisJCWZsb2F0NCBvZmZZOworCQlmbG9hdDQgcG9zU2NhbGU7CisJCWZsb2F0NCBwb3NPZmZzZXQ7CisJCWZsb2F0IHZpZXdwb3J0SGVpZ2h0OworCQlmbG9hdCBzbG9wZURlcHRoQmlhczsKKwkJZmxvYXQgZGVwdGhSYW5nZTsKKwkJZmxvYXQgZGVwdGhOZWFyOworCQlQbGFuZSBjbGlwUGxhbmVbNl07CisKKwkJdW5zaWduZWQgaW50ICpjb2xvckJ1ZmZlcls0XTsKKwkJaW50IGNvbG9yUGl0Y2hCWzRdOworCQlpbnQgY29sb3JTbGljZUJbNF07CisJCWZsb2F0ICpkZXB0aEJ1ZmZlcjsKKwkJaW50IGRlcHRoUGl0Y2hCOworCQlpbnQgZGVwdGhTbGljZUI7CisJCXVuc2lnbmVkIGNoYXIgKnN0ZW5jaWxCdWZmZXI7CisJCWludCBzdGVuY2lsUGl0Y2hCOworCQlpbnQgc3RlbmNpbFNsaWNlQjsKKworCQlmbG9hdDQgYTJjMDsKKwkJZmxvYXQ0IGEyYzE7CisJCWZsb2F0NCBhMmMyOworCQlmbG9hdDQgYTJjMzsKKwl9OworCisJc3RydWN0IERyYXdDYWxsCisJeworCQlEcmF3Q2FsbCgpOworCisJCX5EcmF3Q2FsbCgpOworCisJCUNvbnRleHQ6OkRyYXdUeXBlIGRyYXdUeXBlOworCQlpbnQgYmF0Y2hTaXplOworCisJCVJvdXRpbmUgKnZlcnRleFJvdXRpbmU7CisJCVJvdXRpbmUgKnNldHVwUm91dGluZTsKKwkJUm91dGluZSAqcGl4ZWxSb3V0aW5lOworCisJCVZlcnRleFByb2Nlc3Nvcjo6Um91dGluZVBvaW50ZXIgdmVydGV4UG9pbnRlcjsKKwkJU2V0dXBQcm9jZXNzb3I6OlJvdXRpbmVQb2ludGVyIHNldHVwUG9pbnRlcjsKKwkJUGl4ZWxQcm9jZXNzb3I6OlJvdXRpbmVQb2ludGVyIHBpeGVsUG9pbnRlcjsKKworCQlpbnQgKCpzZXR1cFByaW1pdGl2ZXMpKFJlbmRlcmVyICpyZW5kZXJlciwgaW50IGJhdGNoLCBpbnQgY291bnQpOworCQlTZXR1cFByb2Nlc3Nvcjo6U3RhdGUgc2V0dXBTdGF0ZTsKKworCQlSZXNvdXJjZSAqdmVydGV4U3RyZWFtWzE2XTsKKwkJUmVzb3VyY2UgKmluZGV4QnVmZmVyOworCQlTdXJmYWNlICpyZW5kZXJUYXJnZXRbNF07CisJCVN1cmZhY2UgKmRlcHRoU3RlbmNpbDsKKwkJUmVzb3VyY2UgKnRleHR1cmVbMTYgKyA0XTsKKworCQlpbnQgdnNEaXJ0eUNvbnN0RjsKKwkJaW50IHZzRGlydHlDb25zdEk7CisJCWludCB2c0RpcnR5Q29uc3RCOworCisJCWludCBwc0RpcnR5Q29uc3RGOworCQlpbnQgcHNEaXJ0eUNvbnN0STsKKwkJaW50IHBzRGlydHlDb25zdEI7CisKKwkJc3RkOjpsaXN0PFF1ZXJ5Kj4gKnF1ZXJpZXM7CisKKwkJaW50IGNsaXBGbGFnczsKKworCQl2b2xhdGlsZSBpbnQgcHJpbWl0aXZlOyAgICAvLyBDdXJyZW50IHByaW1pdGl2ZSB0byBlbnRlciBwaXBlbGluZQorCQl2b2xhdGlsZSBpbnQgY291bnQ7ICAgICAgICAvLyBOdW1iZXIgb2YgcHJpbWl0aXZlcyB0byByZW5kZXIKKwkJdm9sYXRpbGUgaW50IHJlZmVyZW5jZXM7ICAgLy8gUmVtYWluaW5nIHJlZmVyZW5jZXMgdG8gdGhpcyBkcmF3IGNhbGwsIDAgd2hlbiBkb25lIGRyYXdpbmcsIC0xIHdoZW4gcmVzb3VyY2VzIHVubG9ja2VkIGFuZCBzbG90IGlzIGZyZWUKKworCQlEcmF3RGF0YSAqZGF0YTsKKwl9OworCisJY2xhc3MgUmVuZGVyZXIgOiBwdWJsaWMgVmVydGV4UHJvY2Vzc29yLCBwdWJsaWMgUGl4ZWxQcm9jZXNzb3IsIHB1YmxpYyBTZXR1cFByb2Nlc3NvcgorCXsKKwkJc3RydWN0IFRhc2sKKwkJeworCQkJZW51bSBUeXBlCisJCQl7CisJCQkJUFJJTUlUSVZFUywKKwkJCQlQSVhFTFMsCisKKwkJCQlSRVNVTUUsCisJCQkJU1VTUEVORAorCQkJfTsKKworCQkJdm9sYXRpbGUgVHlwZSB0eXBlOworCQkJdm9sYXRpbGUgaW50IHByaW1pdGl2ZVVuaXQ7CisJCQl2b2xhdGlsZSBpbnQgcGl4ZWxDbHVzdGVyOworCQl9OworCisJCXN0cnVjdCBQcmltaXRpdmVQcm9ncmVzcworCQl7CisJCQl2b2lkIGluaXQoKQorCQkJeworCQkJCWRyYXdDYWxsID0gMDsKKwkJCQlmaXJzdFByaW1pdGl2ZSA9IDA7CisJCQkJcHJpbWl0aXZlQ291bnQgPSAwOworCQkJCXZpc2libGUgPSAwOworCQkJCXJlZmVyZW5jZXMgPSAwOworCQkJfQorCisJCQl2b2xhdGlsZSBpbnQgZHJhd0NhbGw7CisJCQl2b2xhdGlsZSBpbnQgZmlyc3RQcmltaXRpdmU7CisJCQl2b2xhdGlsZSBpbnQgcHJpbWl0aXZlQ291bnQ7CisJCQl2b2xhdGlsZSBpbnQgdmlzaWJsZTsKKwkJCXZvbGF0aWxlIGludCByZWZlcmVuY2VzOworCQl9OworCisJCXN0cnVjdCBQaXhlbFByb2dyZXNzCisJCXsKKwkJCXZvaWQgaW5pdCgpCisJCQl7CisJCQkJZHJhd0NhbGwgPSAwOworCQkJCXByb2Nlc3NlZFByaW1pdGl2ZXMgPSAwOworCQkJCWV4ZWN1dGluZyA9IGZhbHNlOworCQkJfQorCisJCQl2b2xhdGlsZSBpbnQgZHJhd0NhbGw7CisJCQl2b2xhdGlsZSBpbnQgcHJvY2Vzc2VkUHJpbWl0aXZlczsKKwkJCXZvbGF0aWxlIGJvb2wgZXhlY3V0aW5nOworCQl9OworCisJcHVibGljOgorCQlSZW5kZXJlcihDb250ZXh0ICpjb250ZXh0LCBTdXJmYWNlICpyZW5kZXJUYXJnZXQgPSAwKTsKKworCQl2aXJ0dWFsIH5SZW5kZXJlcigpOworCisJCXZpcnR1YWwgdm9pZCBibGl0KFN1cmZhY2UgKnNvdXJjZSwgY29uc3QgUmVjdCAmc1JlY3QsIFN1cmZhY2UgKmRlc3QsIGNvbnN0IFJlY3QgJmRSZWN0LCBib29sIGZpbHRlcik7CisJCXZpcnR1YWwgdm9pZCBkcmF3KENvbnRleHQ6OkRyYXdUeXBlIGRyYXdUeXBlLCB1bnNpZ25lZCBpbnQgaW5kZXhPZmZzZXQsIHVuc2lnbmVkIGludCBjb3VudCwgYm9vbCB1cGRhdGUgPSB0cnVlKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0SW5kZXhCdWZmZXIoUmVzb3VyY2UgKmluZGV4QnVmZmVyKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0TXVsdGlTYW1wbGVNYXNrKHVuc2lnbmVkIGludCBtYXNrKTsKKwkJdmlydHVhbCB2b2lkIHNldFRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyhDb250ZXh0OjpUcmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcgdHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0VGV4dHVyZVJlc291cmNlKHVuc2lnbmVkIGludCBzYW1wbGVyLCBSZXNvdXJjZSAqcmVzb3VyY2UpOworCQl2aXJ0dWFsIHZvaWQgc2V0VGV4dHVyZUxldmVsKHVuc2lnbmVkIGludCBzYW1wbGVyLCB1bnNpZ25lZCBpbnQgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsLCBTdXJmYWNlICpzdXJmYWNlLCBUZXh0dXJlVHlwZSB0eXBlKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0VGV4dHVyZUZpbHRlcihTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgRmlsdGVyVHlwZSB0ZXh0dXJlRmlsdGVyKTsKKwkJdmlydHVhbCB2b2lkIHNldE1pcG1hcEZpbHRlcihTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgTWlwbWFwVHlwZSBtaXBtYXBGaWx0ZXIpOworCQl2aXJ0dWFsIHZvaWQgc2V0R2F0aGVyRW5hYmxlKFNhbXBsZXJUeXBlIHR5cGUsIGludCBzYW1wbGVyLCBib29sIGVuYWJsZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRBZGRyZXNzaW5nTW9kZVUoU2FtcGxlclR5cGUgdHlwZSwgaW50IHNhbXBsZXIsIEFkZHJlc3NpbmdNb2RlIGFkZHJlc3NpbmdNb2RlKTsKKwkJdmlydHVhbCB2b2lkIHNldEFkZHJlc3NpbmdNb2RlVihTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgQWRkcmVzc2luZ01vZGUgYWRkcmVzc2luZ01vZGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0QWRkcmVzc2luZ01vZGVXKFNhbXBsZXJUeXBlIHR5cGUsIGludCBzYW1wbGVyLCBBZGRyZXNzaW5nTW9kZSBhZGRyZXNzaW5nTW9kZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRSZWFkU1JHQihTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgYm9vbCBzUkdCKTsKKwkJdmlydHVhbCB2b2lkIHNldE1pcG1hcExPRChTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgZmxvYXQgYmlhcyk7CisJCXZpcnR1YWwgdm9pZCBzZXRCb3JkZXJDb2xvcihTYW1wbGVyVHlwZSB0eXBlLCBpbnQgc2FtcGxlciwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZib3JkZXJDb2xvcik7CisJCXZpcnR1YWwgdm9pZCBzZXRNYXhBbmlzb3Ryb3B5KFNhbXBsZXJUeXBlIHR5cGUsIGludCBzYW1wbGVyLCB1bnNpZ25lZCBpbnQgbWF4QW5pc290cm9weSk7CisJCQorCQl2aXJ0dWFsIHZvaWQgc2V0UG9pbnRTcHJpdGVFbmFibGUoYm9vbCBwb2ludFNwcml0ZUVuYWJsZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRQb2ludFNjYWxlRW5hYmxlKGJvb2wgcG9pbnRTY2FsZUVuYWJsZSk7CisKKwkJdmlydHVhbCB2b2lkIHNldERlcHRoQmlhcyhmbG9hdCBiaWFzKTsKKwkJdmlydHVhbCB2b2lkIHNldFNsb3BlRGVwdGhCaWFzKGZsb2F0IHNsb3BlQmlhcyk7CisKKwkJLy8gUHJvZ3JhbW1hYmxlIHBpcGVsaW5lcworCQl2aXJ0dWFsIHZvaWQgc2V0UGl4ZWxTaGFkZXIoY29uc3QgUGl4ZWxTaGFkZXIgKnNoYWRlcik7CisJCXZpcnR1YWwgdm9pZCBzZXRWZXJ0ZXhTaGFkZXIoY29uc3QgVmVydGV4U2hhZGVyICpzaGFkZXIpOworCisJCXZpcnR1YWwgdm9pZCBzZXRQaXhlbFNoYWRlckNvbnN0YW50RihpbnQgaW5kZXgsIGNvbnN0IGZsb2F0IHZhbHVlWzRdLCBpbnQgY291bnQgPSAxKTsKKwkJdmlydHVhbCB2b2lkIHNldFBpeGVsU2hhZGVyQ29uc3RhbnRJKGludCBpbmRleCwgY29uc3QgaW50IHZhbHVlWzRdLCBpbnQgY291bnQgPSAxKTsKKwkJdmlydHVhbCB2b2lkIHNldFBpeGVsU2hhZGVyQ29uc3RhbnRCKGludCBpbmRleCwgY29uc3QgaW50ICpib29sZWFuLCBpbnQgY291bnQgPSAxKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKGludCBpbmRleCwgY29uc3QgZmxvYXQgdmFsdWVbNF0sIGludCBjb3VudCA9IDEpOworCQl2aXJ0dWFsIHZvaWQgc2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKGludCBpbmRleCwgY29uc3QgaW50IHZhbHVlWzRdLCBpbnQgY291bnQgPSAxKTsKKwkJdmlydHVhbCB2b2lkIHNldFZlcnRleFNoYWRlckNvbnN0YW50QihpbnQgaW5kZXgsIGNvbnN0IGludCAqYm9vbGVhbiwgaW50IGNvdW50ID0gMSk7CisKKwkJLy8gVmlld3BvcnQgJiBDbGlwcGVyCisJCXZpcnR1YWwgdm9pZCBzZXRWaWV3cG9ydChjb25zdCBWaWV3cG9ydCAmdmlld3BvcnQpOworCQl2aXJ0dWFsIHZvaWQgc2V0Q2xpcEZsYWdzKGludCBmbGFncyk7CisJCXZpcnR1YWwgdm9pZCBzZXRDbGlwUGxhbmUodW5zaWduZWQgaW50IGluZGV4LCBjb25zdCBmbG9hdCBwbGFuZVs0XSk7CisKKwkJLy8gUGFydGlhbCB0cmFuc2Zvcm0KKwkJdmlydHVhbCB2b2lkIHNldE1vZGVsTWF0cml4KGNvbnN0IE1hdHJpeCAmTSwgaW50IGkgPSAwKTsKKwkJdmlydHVhbCB2b2lkIHNldFZpZXdNYXRyaXgoY29uc3QgTWF0cml4ICZWKTsKKwkJdmlydHVhbCB2b2lkIHNldEJhc2VNYXRyaXgoY29uc3QgTWF0cml4ICZCKTsKKwkJdmlydHVhbCB2b2lkIHNldFByb2plY3Rpb25NYXRyaXgoY29uc3QgTWF0cml4ICZQKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0UG9zdFRyYW5zZm9ybUVuYWJsZShib29sIGVuYWJsZSk7CisKKwkJdmlydHVhbCB2b2lkIHNldFBvc1NjYWxlKGZsb2F0IHgsIGZsb2F0IHkpOworCQl2aXJ0dWFsIHZvaWQgc2V0UG9zT2Zmc2V0KGZsb2F0IHgsIGZsb2F0IHkpOworCisJCXZpcnR1YWwgdm9pZCBhZGRRdWVyeShRdWVyeSAqcXVlcnkpOworCQl2aXJ0dWFsIHZvaWQgcmVtb3ZlUXVlcnkoUXVlcnkgKnF1ZXJ5KTsKKworCQkjaWYgUEVSRl9IVUQKKwkJCS8vIFBlcmZvcm1hbmNlIHRpbWVycworCQkJaW50IGdldFRocmVhZENvdW50KCk7CisJCQlpbnQ2NF90IGdldFZlcnRleFRpbWUoaW50IHRocmVhZCk7CisJCQlpbnQ2NF90IGdldFNldHVwVGltZShpbnQgdGhyZWFkKTsKKwkJCWludDY0X3QgZ2V0UGl4ZWxUaW1lKGludCB0aHJlYWQpOworCQkJdm9pZCByZXNldFRpbWVycygpOworCQkjZW5kaWYKKworCXByaXZhdGU6CisJCXN0YXRpYyB2b2lkIHRocmVhZEZ1bmN0aW9uKHZvaWQgKnBhcmFtZXRlcnMpOworCQl2b2lkIHRocmVhZExvb3AoaW50IHRocmVhZEluZGV4KTsKKwkJdm9pZCB0YXNrTG9vcChpbnQgdGhyZWFkSW5kZXgpOworCQl2b2lkIGZpbmRBdmFpbGFibGVUYXNrcygpOworCQl2b2lkIHNjaGVkdWxlVGFzayhpbnQgdGhyZWFkSW5kZXgpOworCQl2b2lkIGV4ZWN1dGVUYXNrKGludCB0aHJlYWRJbmRleCk7CisJCXZvaWQgZmluaXNoUmVuZGVyaW5nKFRhc2sgJnBpeGVsVGFzayk7CisKKwkJdm9pZCBwcm9jZXNzUHJpbWl0aXZlVmVydGljZXMoaW50IHVuaXQsIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgbG9vcCwgaW50IHRocmVhZCk7CisKKwkJc3RhdGljIGludCBzZXR1cFNvbGlkVHJpYW5nbGVzKFJlbmRlcmVyICpyZW5kZXJlciwgaW50IGJhdGNoLCBpbnQgY291bnQpOworCQlzdGF0aWMgaW50IHNldHVwV2lyZWZyYW1lVHJpYW5nbGUoUmVuZGVyZXIgKnJlbmRlcmVyLCBpbnQgYmF0Y2gsIGludCBjb3VudCk7CisJCXN0YXRpYyBpbnQgc2V0dXBWZXJ0ZXhUcmlhbmdsZShSZW5kZXJlciAqcmVuZGVyZXIsIGludCBiYXRjaCwgaW50IGNvdW50KTsKKwkJc3RhdGljIGludCBzZXR1cExpbmVzKFJlbmRlcmVyICpyZW5kZXJlciwgaW50IGJhdGNoLCBpbnQgY291bnQpOworCQlzdGF0aWMgaW50IHNldHVwUG9pbnRzKFJlbmRlcmVyICpyZW5kZXJlciwgaW50IGJhdGNoLCBpbnQgY291bnQpOworCisJCXN0YXRpYyBib29sIHNldHVwTGluZShSZW5kZXJlciAqcmVuZGVyZXIsIFByaW1pdGl2ZSAmcHJpbWl0aXZlLCBUcmlhbmdsZSAmdHJpYW5nbGUsIGNvbnN0IERyYXdDYWxsICZkcmF3KTsKKwkJc3RhdGljIGJvb2wgc2V0dXBQb2ludChSZW5kZXJlciAqcmVuZGVyZXIsIFByaW1pdGl2ZSAmcHJpbWl0aXZlLCBUcmlhbmdsZSAmdHJpYW5nbGUsIGNvbnN0IERyYXdDYWxsICZkcmF3KTsKKworCQlib29sIGlzUmVhZFdyaXRlVGV4dHVyZShpbnQgc2FtcGxlcik7CisJCXZvaWQgdXBkYXRlQ2xpcHBlcigpOworCQl2b2lkIHVwZGF0ZUNvbmZpZ3VyYXRpb24oYm9vbCBpbml0aWFsVXBkYXRlID0gZmFsc2UpOworCQl2b2lkIHN0YXJ0dXBDb25maWd1cmF0aW9uKCk7CisJCXN0YXRpYyB1bnNpZ25lZCBpbnQgY29tcHV0ZUNsaXBGbGFncyhjb25zdCBmbG9hdDQgJnYsIGNvbnN0IERyYXdEYXRhICZkYXRhKTsKKwkJdm9pZCBpbml0aWFsaXplVGhyZWFkcyhpbnQgdGhyZWFkQ291bnQpOworCQl2b2lkIHRlcm1pbmF0ZVRocmVhZHMoKTsKKwkJdm9pZCBkZWxldGVCYXRjaGVzKCk7CisKKwkJdm9pZCBsb2FkQ29uc3RhbnRzKGNvbnN0IFZlcnRleFNoYWRlciAqdmVydGV4U2hhZGVyKTsKKwkJdm9pZCBsb2FkQ29uc3RhbnRzKGNvbnN0IFBpeGVsU2hhZGVyICpwaXhlbFNoYWRlcik7CisKKwkJQ29udGV4dCAqY29udGV4dDsKKwkJQ2xpcHBlciAqY2xpcHBlcjsKKwkJVmlld3BvcnQgdmlld3BvcnQ7CisJCWZsb2F0NCBwb3NTY2FsZTsKKwkJZmxvYXQ0IHBvc09mZnNldDsKKwkJaW50IGNsaXBGbGFnczsKKworCQlUcmlhbmdsZSAqdHJpYW5nbGVCYXRjaFsxNl07CisJCVByaW1pdGl2ZSAqcHJpbWl0aXZlQmF0Y2hbMTZdOworCisJCS8vIFVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXMKKwkJUGxhbmUgdXNlclBsYW5lWzZdOworCQlQbGFuZSBjbGlwUGxhbmVbNl07ICAgLy8gVHJhbmZvcm1lZCB0byBjbGlwIHNwYWNlCisJCWJvb2wgdXBkYXRlQ2xpcFBsYW5lczsKKworCQl2b2xhdGlsZSBib29sIGV4aXRUaHJlYWRzOworCQl2b2xhdGlsZSBpbnQgdGhyZWFkc0F3YWtlOworCQlUaHJlYWQgKndvcmtlclsxNl07CisJCUV2ZW50ICpyZXN1bWVbMTZdOyAgICAgICAgIC8vIEV2ZW50cyBmb3IgcmVzdW1pbmcgdGhyZWFkcworCQlFdmVudCAqc3VzcGVuZFsxNl07ICAgICAgICAvLyBFdmVudHMgZm9yIHN1c3BlbmRpbmcgdGhyZWFkcworCQlFdmVudCAqcmVzdW1lQXBwOyAgICAgICAgICAvLyBFdmVudCBmb3IgcmVzdW1pbmcgdGhlIGFwcGxpY2F0aW9uIHRocmVhZAorCisJCVByaW1pdGl2ZVByb2dyZXNzIHByaW1pdGl2ZVByb2dyZXNzWzE2XTsKKwkJUGl4ZWxQcm9ncmVzcyBwaXhlbFByb2dyZXNzWzE2XTsKKwkJVGFzayB0YXNrWzE2XTsgICAvLyBDdXJyZW50IHRhc2tzIGZvciB0aHJlYWRzCisKKwkJZW51bSB7RFJBV19DT1VOVCA9IDE2fTsgICAvLyBOdW1iZXIgb2YgZHJhdyBjYWxscyBidWZmZXJlZAorCQlEcmF3Q2FsbCAqZHJhd0NhbGxbRFJBV19DT1VOVF07CisJCURyYXdDYWxsICpkcmF3TGlzdFtEUkFXX0NPVU5UXTsKKworCQl2b2xhdGlsZSBpbnQgY3VycmVudERyYXc7CisJCXZvbGF0aWxlIGludCBuZXh0RHJhdzsKKworCQlUYXNrIHRhc2tRdWV1ZVszMl07CisJCXVuc2lnbmVkIGludCBxSGVhZDsKKwkJdW5zaWduZWQgaW50IHFTaXplOworCisJCUJhY2tvZmZMb2NrIG11dGV4OworCisJCSNpZiBQRVJGX0hVRAorCQkJaW50NjRfdCB2ZXJ0ZXhUaW1lWzE2XTsKKwkJCWludDY0X3Qgc2V0dXBUaW1lWzE2XTsKKwkJCWludDY0X3QgcGl4ZWxUaW1lWzE2XTsKKwkJI2VuZGlmCisKKwkJVmVydGV4VGFzayAqdmVydGV4VGFza1sxNl07CisKKwkJU3dpZnRDb25maWcgKnN3aWZ0Q29uZmlnOworCisJCXN0ZDo6bGlzdDxRdWVyeSo+IHF1ZXJpZXM7CisKKwkJVmVydGV4UHJvY2Vzc29yOjpTdGF0ZSB2ZXJ0ZXhTdGF0ZTsKKwkJU2V0dXBQcm9jZXNzb3I6OlN0YXRlIHNldHVwU3RhdGU7CisJCVBpeGVsUHJvY2Vzc29yOjpTdGF0ZSBwaXhlbFN0YXRlOworCQlpbnQgKCpzZXR1cFByaW1pdGl2ZXMpKFJlbmRlcmVyICpyZW5kZXJlciwgaW50IGJhdGNoLCBpbnQgY291bnQpOworCisJCVJvdXRpbmUgKnZlcnRleFJvdXRpbmU7CisJCVJvdXRpbmUgKnNldHVwUm91dGluZTsKKwkJUm91dGluZSAqcGl4ZWxSb3V0aW5lOworCisJCUJsaXR0ZXIgYmxpdHRlcjsKKwl9OworfQorCisjZW5kaWYgICAvLyBzd19SZW5kZXJlcl9ocHAKZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9TYW1wbGVyLmNwcCBiL3NyYy9SZW5kZXJlci9TYW1wbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjdjNjUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlbmRlcmVyL1NhbXBsZXIuY3BwCkBAIC0wLDAgKzEsNDAwIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJTYW1wbGVyLmhwcCIKKworI2luY2x1ZGUgIk1ldGFNYWNyby5ocHAiCisjaW5jbHVkZSAiQ29udGV4dC5ocHAiCisjaW5jbHVkZSAiU3VyZmFjZS5ocHAiCisjaW5jbHVkZSAiQ1BVSUQuaHBwIgorI2luY2x1ZGUgIlBpeGVsUm91dGluZS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBzdworeworCUZpbHRlclR5cGUgU2FtcGxlcjo6bWF4aW11bVRleHR1cmVGaWx0ZXJRdWFsaXR5ID0gRklMVEVSX0xJTkVBUjsKKwlNaXBtYXBUeXBlIFNhbXBsZXI6Om1heGltdW1NaXBtYXBGaWx0ZXJRdWFsaXR5ID0gTUlQTUFQX1BPSU5UOworCisJU2FtcGxlcjo6U3RhdGU6OlN0YXRlKCkKKwl7CisJCW1lbXNldCh0aGlzLCAwLCBzaXplb2YoU3RhdGUpKTsKKwl9CisKKwlTYW1wbGVyOjpTYW1wbGVyKCkKKwl7CisJCS8vIEZJWE1FOiBNaXBtYXA6OmluaXQKKwkJc3RhdGljIHVuc2lnbmVkIGludCB6ZXJvID0gMHgwMEZGMDBGRjsKKworCQlmb3IoaW50IGxldmVsID0gMDsgbGV2ZWwgPCBNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQorCQl7CisJCQlNaXBtYXAgJm1pcG1hcCA9IHRleHR1cmUubWlwbWFwW2xldmVsXTsKKworCQkJbWVtc2V0KCZtaXBtYXAsIDAsIHNpemVvZihNaXBtYXApKTsKKworCQkJZm9yKGludCBmYWNlID0gMDsgZmFjZSA8IDY7IGZhY2UrKykgICAKKwkJCXsKKwkJCQltaXBtYXAuYnVmZmVyW2ZhY2VdID0gJnplcm87CisJCQl9CisKKwkJCW1pcG1hcC51RnJhYyA9IDE2OworCQkJbWlwbWFwLnZGcmFjID0gMTY7CisJCQltaXBtYXAud0ZyYWMgPSAxNjsKKwkJfQorCisJCWV4dGVybmFsVGV4dHVyZUZvcm1hdCA9IEZPUk1BVF9OVUxMOworCQlpbnRlcm5hbFRleHR1cmVGb3JtYXQgPSBGT1JNQVRfTlVMTDsKKwkJdGV4dHVyZVR5cGUgPSBURVhUVVJFX05VTEw7CisKKwkJdGV4dHVyZUZpbHRlciA9IEZJTFRFUl9MSU5FQVI7CisJCWFkZHJlc3NpbmdNb2RlVSA9IEFERFJFU1NJTkdfV1JBUDsKKwkJYWRkcmVzc2luZ01vZGVWID0gQUREUkVTU0lOR19XUkFQOworCQlhZGRyZXNzaW5nTW9kZVcgPSBBRERSRVNTSU5HX1dSQVA7CisJCW1pcG1hcEZpbHRlclN0YXRlID0gTUlQTUFQX05PTkU7CisJCXNSR0IgPSBmYWxzZTsKKwkJZ2F0aGVyID0gZmFsc2U7CisKKwkJdGV4dHVyZS5MT0QgPSAwLjBmOworCQlleHAyTE9EID0gMS4wZjsKKwl9CisKKwlTYW1wbGVyOjp+U2FtcGxlcigpCisJeworCX0KKworCVNhbXBsZXI6OlN0YXRlIFNhbXBsZXI6OnNhbXBsZXJTdGF0ZSgpIGNvbnN0CisJeworCQlTdGF0ZSBzdGF0ZTsKKworCQlpZih0ZXh0dXJlVHlwZSAhPSBURVhUVVJFX05VTEwpCisJCXsKKwkJCXN0YXRlLnRleHR1cmVUeXBlID0gdGV4dHVyZVR5cGU7CisJCQlzdGF0ZS50ZXh0dXJlRm9ybWF0ID0gaW50ZXJuYWxUZXh0dXJlRm9ybWF0OworCQkJc3RhdGUudGV4dHVyZUZpbHRlciA9IGdldFRleHR1cmVGaWx0ZXIoKTsKKwkJCXN0YXRlLmFkZHJlc3NpbmdNb2RlVSA9IGdldEFkZHJlc3NpbmdNb2RlVSgpOworCQkJc3RhdGUuYWRkcmVzc2luZ01vZGVWID0gZ2V0QWRkcmVzc2luZ01vZGVWKCk7CisJCQlzdGF0ZS5hZGRyZXNzaW5nTW9kZVcgPSBnZXRBZGRyZXNzaW5nTW9kZVcoKTsKKwkJCXN0YXRlLm1pcG1hcEZpbHRlciA9IG1pcG1hcEZpbHRlcigpOworCQkJc3RhdGUuaGFzTlBPVFRleHR1cmUgPSBoYXNOUE9UVGV4dHVyZSgpOworCQkJc3RhdGUuc1JHQiA9IHNSR0IgJiYgU3VyZmFjZTo6aXNTUkdCcmVhZGFibGUoZXh0ZXJuYWxUZXh0dXJlRm9ybWF0KTsKKworCQkJI2lmIFBFUkZfUFJPRklMRQorCQkJCXN0YXRlLmNvbXByZXNzZWRGb3JtYXQgPSBTdXJmYWNlOjppc0NvbXByZXNzZWQoZXh0ZXJuYWxUZXh0dXJlRm9ybWF0KTsKKwkJCSNlbmRpZgorCQl9CisKKwkJcmV0dXJuIHN0YXRlOworCX0KKworCXZvaWQgU2FtcGxlcjo6c2V0VGV4dHVyZUxldmVsKGludCBmYWNlLCBpbnQgbGV2ZWwsIFN1cmZhY2UgKnN1cmZhY2UsIFRleHR1cmVUeXBlIHR5cGUpCisJeworCQlpZihzdXJmYWNlKQorCQl7CisJCQlNaXBtYXAgJm1pcG1hcCA9IHRleHR1cmUubWlwbWFwW2xldmVsXTsKKworCQkJbWlwbWFwLmJ1ZmZlcltmYWNlXSA9IHN1cmZhY2UtPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBMT0NLX1VOTE9DS0VELCBQUklWQVRFKTsKKworCQkJaWYoZmFjZSA9PSAwKQorCQkJeworCQkJCWV4dGVybmFsVGV4dHVyZUZvcm1hdCA9IHN1cmZhY2UtPmdldEV4dGVybmFsRm9ybWF0KCk7CisJCQkJaW50ZXJuYWxUZXh0dXJlRm9ybWF0ID0gc3VyZmFjZS0+Z2V0SW50ZXJuYWxGb3JtYXQoKTsKKworCQkJCWludCB3aWR0aCA9IHN1cmZhY2UtPmdldEludGVybmFsV2lkdGgoKTsKKwkJCQlpbnQgaGVpZ2h0ID0gc3VyZmFjZS0+Z2V0SW50ZXJuYWxIZWlnaHQoKTsKKwkJCQlpbnQgZGVwdGggPSBzdXJmYWNlLT5nZXRJbnRlcm5hbERlcHRoKCk7CisJCQkJaW50IHBpdGNoUCA9IHN1cmZhY2UtPmdldEludGVybmFsUGl0Y2hQKCk7CisJCQkJaW50IHNsaWNlUCA9IHN1cmZhY2UtPmdldEludGVybmFsU2xpY2VQKCk7CisKKwkJCQlpbnQgbG9nV2lkdGggPSBsb2cyKHdpZHRoKTsKKwkJCQlpbnQgbG9nSGVpZ2h0ID0gbG9nMihoZWlnaHQpOworCQkJCWludCBsb2dEZXB0aCA9IGxvZzIoZGVwdGgpOworCisJCQkJaWYobGV2ZWwgPT0gMCkKKwkJCQl7CisJCQkJCXRleHR1cmUud2lkdGhIZWlnaHRMT0RbMF0gPSB3aWR0aCAqIGV4cDJMT0Q7CisJCQkJCXRleHR1cmUud2lkdGhIZWlnaHRMT0RbMV0gPSB3aWR0aCAqIGV4cDJMT0Q7CisJCQkJCXRleHR1cmUud2lkdGhIZWlnaHRMT0RbMl0gPSBoZWlnaHQgKiBleHAyTE9EOworCQkJCQl0ZXh0dXJlLndpZHRoSGVpZ2h0TE9EWzNdID0gaGVpZ2h0ICogZXhwMkxPRDsKKworCQkJCQl0ZXh0dXJlLndpZHRoTE9EWzBdID0gd2lkdGggKiBleHAyTE9EOworCQkJCQl0ZXh0dXJlLndpZHRoTE9EWzFdID0gd2lkdGggKiBleHAyTE9EOworCQkJCQl0ZXh0dXJlLndpZHRoTE9EWzJdID0gd2lkdGggKiBleHAyTE9EOworCQkJCQl0ZXh0dXJlLndpZHRoTE9EWzNdID0gd2lkdGggKiBleHAyTE9EOworCisJCQkJCXRleHR1cmUuaGVpZ2h0TE9EWzBdID0gaGVpZ2h0ICogZXhwMkxPRDsKKwkJCQkJdGV4dHVyZS5oZWlnaHRMT0RbMV0gPSBoZWlnaHQgKiBleHAyTE9EOworCQkJCQl0ZXh0dXJlLmhlaWdodExPRFsyXSA9IGhlaWdodCAqIGV4cDJMT0Q7CisJCQkJCXRleHR1cmUuaGVpZ2h0TE9EWzNdID0gaGVpZ2h0ICogZXhwMkxPRDsKKworCQkJCQl0ZXh0dXJlLmRlcHRoTE9EWzBdID0gZGVwdGggKiBleHAyTE9EOworCQkJCQl0ZXh0dXJlLmRlcHRoTE9EWzFdID0gZGVwdGggKiBleHAyTE9EOworCQkJCQl0ZXh0dXJlLmRlcHRoTE9EWzJdID0gZGVwdGggKiBleHAyTE9EOworCQkJCQl0ZXh0dXJlLmRlcHRoTE9EWzNdID0gZGVwdGggKiBleHAyTE9EOworCQkJCX0KKworCQkJCWlmKCFTdXJmYWNlOjppc0Zsb2F0Rm9ybWF0KGludGVybmFsVGV4dHVyZUZvcm1hdCkpCisJCQkJeworCQkJCQltaXBtYXAudUludCA9IGxvZ1dpZHRoOworCQkJCQltaXBtYXAudkludCA9IGxvZ0hlaWdodDsKKwkJCQkJbWlwbWFwLndJbnQgPSBsb2dEZXB0aDsKKwkJCQkJbWlwbWFwLnVGcmFjID0gMTYgLSBsb2dXaWR0aDsKKwkJCQkJbWlwbWFwLnZGcmFjID0gMTYgLSBsb2dIZWlnaHQ7CisJCQkJCW1pcG1hcC53RnJhYyA9IDE2IC0gbG9nRGVwdGg7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW1pcG1hcC5mV2lkdGhbMF0gPSAoZmxvYXQpd2lkdGggLyA2NTUzNi4wZjsKKwkJCQkJbWlwbWFwLmZXaWR0aFsxXSA9IChmbG9hdCl3aWR0aCAvIDY1NTM2LjBmOworCQkJCQltaXBtYXAuZldpZHRoWzJdID0gKGZsb2F0KXdpZHRoIC8gNjU1MzYuMGY7CisJCQkJCW1pcG1hcC5mV2lkdGhbM10gPSAoZmxvYXQpd2lkdGggLyA2NTUzNi4wZjsKKworCQkJCQltaXBtYXAuZkhlaWdodFswXSA9IChmbG9hdCloZWlnaHQgLyA2NTUzNi4wZjsKKwkJCQkJbWlwbWFwLmZIZWlnaHRbMV0gPSAoZmxvYXQpaGVpZ2h0IC8gNjU1MzYuMGY7CisJCQkJCW1pcG1hcC5mSGVpZ2h0WzJdID0gKGZsb2F0KWhlaWdodCAvIDY1NTM2LjBmOworCQkJCQltaXBtYXAuZkhlaWdodFszXSA9IChmbG9hdCloZWlnaHQgLyA2NTUzNi4wZjsKKworCQkJCQltaXBtYXAuZkRlcHRoWzBdID0gKGZsb2F0KWRlcHRoIC8gNjU1MzYuMGY7CisJCQkJCW1pcG1hcC5mRGVwdGhbMV0gPSAoZmxvYXQpZGVwdGggLyA2NTUzNi4wZjsKKwkJCQkJbWlwbWFwLmZEZXB0aFsyXSA9IChmbG9hdClkZXB0aCAvIDY1NTM2LjBmOworCQkJCQltaXBtYXAuZkRlcHRoWzNdID0gKGZsb2F0KWRlcHRoIC8gNjU1MzYuMGY7CisJCQkJfQorCisJCQkJc2hvcnQgaGFsZlRleGVsVSA9IGlzUG93Mih3aWR0aCkgID8gMHg4MDAwID4+IGxvZ1dpZHRoICA6IDB4ODAwMCAvIHdpZHRoOworCQkJCXNob3J0IGhhbGZUZXhlbFYgPSBpc1BvdzIoaGVpZ2h0KSA/IDB4ODAwMCA+PiBsb2dIZWlnaHQgOiAweDgwMDAgLyBoZWlnaHQ7CisJCQkJc2hvcnQgaGFsZlRleGVsVyA9IGlzUG93MihkZXB0aCkgID8gMHg4MDAwID4+IGxvZ0RlcHRoICA6IDB4ODAwMCAvIGRlcHRoOworCisJCQkJbWlwbWFwLnVIYWxmWzBdID0gaGFsZlRleGVsVTsKKwkJCQltaXBtYXAudUhhbGZbMV0gPSBoYWxmVGV4ZWxVOworCQkJCW1pcG1hcC51SGFsZlsyXSA9IGhhbGZUZXhlbFU7CisJCQkJbWlwbWFwLnVIYWxmWzNdID0gaGFsZlRleGVsVTsKKworCQkJCW1pcG1hcC52SGFsZlswXSA9IGhhbGZUZXhlbFY7CisJCQkJbWlwbWFwLnZIYWxmWzFdID0gaGFsZlRleGVsVjsKKwkJCQltaXBtYXAudkhhbGZbMl0gPSBoYWxmVGV4ZWxWOworCQkJCW1pcG1hcC52SGFsZlszXSA9IGhhbGZUZXhlbFY7CisKKwkJCQltaXBtYXAud0hhbGZbMF0gPSBoYWxmVGV4ZWxXOworCQkJCW1pcG1hcC53SGFsZlsxXSA9IGhhbGZUZXhlbFc7CisJCQkJbWlwbWFwLndIYWxmWzJdID0gaGFsZlRleGVsVzsKKwkJCQltaXBtYXAud0hhbGZbM10gPSBoYWxmVGV4ZWxXOworCisJCQkJbWlwbWFwLndpZHRoWzBdID0gd2lkdGg7CisJCQkJbWlwbWFwLndpZHRoWzFdID0gd2lkdGg7CisJCQkJbWlwbWFwLndpZHRoWzJdID0gd2lkdGg7CisJCQkJbWlwbWFwLndpZHRoWzNdID0gd2lkdGg7CisKKwkJCQltaXBtYXAuaGVpZ2h0WzBdID0gaGVpZ2h0OworCQkJCW1pcG1hcC5oZWlnaHRbMV0gPSBoZWlnaHQ7CisJCQkJbWlwbWFwLmhlaWdodFsyXSA9IGhlaWdodDsKKwkJCQltaXBtYXAuaGVpZ2h0WzNdID0gaGVpZ2h0OworCisJCQkJbWlwbWFwLmRlcHRoWzBdID0gZGVwdGg7CisJCQkJbWlwbWFwLmRlcHRoWzFdID0gZGVwdGg7CisJCQkJbWlwbWFwLmRlcHRoWzJdID0gZGVwdGg7CisJCQkJbWlwbWFwLmRlcHRoWzNdID0gZGVwdGg7CisKKwkJCQltaXBtYXAub25lUGl0Y2hQWzBdID0gMTsKKwkJCQltaXBtYXAub25lUGl0Y2hQWzFdID0gcGl0Y2hQOworCQkJCW1pcG1hcC5vbmVQaXRjaFBbMl0gPSAxOworCQkJCW1pcG1hcC5vbmVQaXRjaFBbM10gPSBwaXRjaFA7CisKKwkJCQltaXBtYXAuc2xpY2VQWzBdID0gc2xpY2VQOworCQkJCW1pcG1hcC5zbGljZVBbMV0gPSBzbGljZVA7CisJCQl9CisJCX0KKworCQl0ZXh0dXJlVHlwZSA9IHR5cGU7CisJfQorCisJdm9pZCBTYW1wbGVyOjpzZXRUZXh0dXJlRmlsdGVyKEZpbHRlclR5cGUgdGV4dHVyZUZpbHRlcikKKwl7CisJCXRoaXMtPnRleHR1cmVGaWx0ZXIgPSAoRmlsdGVyVHlwZSltaW4odGV4dHVyZUZpbHRlciwgbWF4aW11bVRleHR1cmVGaWx0ZXJRdWFsaXR5KTsKKwl9CisKKwl2b2lkIFNhbXBsZXI6OnNldE1pcG1hcEZpbHRlcihNaXBtYXBUeXBlIG1pcG1hcEZpbHRlcikKKwl7CisJCW1pcG1hcEZpbHRlclN0YXRlID0gKE1pcG1hcFR5cGUpbWluKG1pcG1hcEZpbHRlciwgbWF4aW11bU1pcG1hcEZpbHRlclF1YWxpdHkpOworCX0KKworCXZvaWQgU2FtcGxlcjo6c2V0R2F0aGVyRW5hYmxlKGJvb2wgZW5hYmxlKQorCXsKKwkJZ2F0aGVyID0gZW5hYmxlOworCX0KKworCXZvaWQgU2FtcGxlcjo6c2V0QWRkcmVzc2luZ01vZGVVKEFkZHJlc3NpbmdNb2RlIGFkZHJlc3NpbmdNb2RlKQorCXsKKwkJYWRkcmVzc2luZ01vZGVVID0gYWRkcmVzc2luZ01vZGU7CisJfQorCisJdm9pZCBTYW1wbGVyOjpzZXRBZGRyZXNzaW5nTW9kZVYoQWRkcmVzc2luZ01vZGUgYWRkcmVzc2luZ01vZGUpCisJeworCQlhZGRyZXNzaW5nTW9kZVYgPSBhZGRyZXNzaW5nTW9kZTsKKwl9CisKKwl2b2lkIFNhbXBsZXI6OnNldEFkZHJlc3NpbmdNb2RlVyhBZGRyZXNzaW5nTW9kZSBhZGRyZXNzaW5nTW9kZSkKKwl7CisJCWFkZHJlc3NpbmdNb2RlVyA9IGFkZHJlc3NpbmdNb2RlOworCX0KKworCXZvaWQgU2FtcGxlcjo6c2V0UmVhZFNSR0IoYm9vbCBzUkdCKQorCXsKKwkJdGhpcy0+c1JHQiA9IHNSR0I7CisJfQorCisJdm9pZCBTYW1wbGVyOjpzZXRCb3JkZXJDb2xvcihjb25zdCBDb2xvcjxmbG9hdD4gJmJvcmRlckNvbG9yKQorCXsKKwkJLy8gRklYTUU6IENvbXBhY3QgaW50byBnZW5lcmljIGZ1bmN0aW9uICAgLy8gRklYTUU6IENsYW1wCisJCXNob3J0IHIgPSBpcm91bmQoMHhGRkZGICogYm9yZGVyQ29sb3Iucik7CisJCXNob3J0IGcgPSBpcm91bmQoMHhGRkZGICogYm9yZGVyQ29sb3IuZyk7CisJCXNob3J0IGIgPSBpcm91bmQoMHhGRkZGICogYm9yZGVyQ29sb3IuYik7CisJCXNob3J0IGEgPSBpcm91bmQoMHhGRkZGICogYm9yZGVyQ29sb3IuYSk7CisKKwkJdGV4dHVyZS5ib3JkZXJDb2xvcjRbMF1bMF0gPSB0ZXh0dXJlLmJvcmRlckNvbG9yNFswXVsxXSA9IHRleHR1cmUuYm9yZGVyQ29sb3I0WzBdWzJdID0gdGV4dHVyZS5ib3JkZXJDb2xvcjRbMF1bM10gPSByOworCQl0ZXh0dXJlLmJvcmRlckNvbG9yNFsxXVswXSA9IHRleHR1cmUuYm9yZGVyQ29sb3I0WzFdWzFdID0gdGV4dHVyZS5ib3JkZXJDb2xvcjRbMV1bMl0gPSB0ZXh0dXJlLmJvcmRlckNvbG9yNFsxXVszXSA9IGc7CisJCXRleHR1cmUuYm9yZGVyQ29sb3I0WzJdWzBdID0gdGV4dHVyZS5ib3JkZXJDb2xvcjRbMl1bMV0gPSB0ZXh0dXJlLmJvcmRlckNvbG9yNFsyXVsyXSA9IHRleHR1cmUuYm9yZGVyQ29sb3I0WzJdWzNdID0gYjsKKwkJdGV4dHVyZS5ib3JkZXJDb2xvcjRbM11bMF0gPSB0ZXh0dXJlLmJvcmRlckNvbG9yNFszXVsxXSA9IHRleHR1cmUuYm9yZGVyQ29sb3I0WzNdWzJdID0gdGV4dHVyZS5ib3JkZXJDb2xvcjRbM11bM10gPSBhOworCisJCXRleHR1cmUuYm9yZGVyQ29sb3JGWzBdWzBdID0gdGV4dHVyZS5ib3JkZXJDb2xvckZbMF1bMV0gPSB0ZXh0dXJlLmJvcmRlckNvbG9yRlswXVsyXSA9IHRleHR1cmUuYm9yZGVyQ29sb3JGWzBdWzNdID0gYm9yZGVyQ29sb3IucjsKKwkJdGV4dHVyZS5ib3JkZXJDb2xvckZbMV1bMF0gPSB0ZXh0dXJlLmJvcmRlckNvbG9yRlsxXVsxXSA9IHRleHR1cmUuYm9yZGVyQ29sb3JGWzFdWzJdID0gdGV4dHVyZS5ib3JkZXJDb2xvckZbMV1bM10gPSBib3JkZXJDb2xvci5nOworCQl0ZXh0dXJlLmJvcmRlckNvbG9yRlsyXVswXSA9IHRleHR1cmUuYm9yZGVyQ29sb3JGWzJdWzFdID0gdGV4dHVyZS5ib3JkZXJDb2xvckZbMl1bMl0gPSB0ZXh0dXJlLmJvcmRlckNvbG9yRlsyXVszXSA9IGJvcmRlckNvbG9yLmI7CisJCXRleHR1cmUuYm9yZGVyQ29sb3JGWzNdWzBdID0gdGV4dHVyZS5ib3JkZXJDb2xvckZbM11bMV0gPSB0ZXh0dXJlLmJvcmRlckNvbG9yRlszXVsyXSA9IHRleHR1cmUuYm9yZGVyQ29sb3JGWzNdWzNdID0gYm9yZGVyQ29sb3IuYTsKKwl9CisKKwl2b2lkIFNhbXBsZXI6OnNldE1heEFuaXNvdHJvcHkodW5zaWduZWQgaW50IG1heEFuaXNvdHJvcHkpCisJeworCQl0ZXh0dXJlLm1heEFuaXNvdHJvcHkgPSAoZmxvYXQpbWF4QW5pc290cm9weTsKKwl9CisKKwl2b2lkIFNhbXBsZXI6OnNldEZpbHRlclF1YWxpdHkoRmlsdGVyVHlwZSBtYXhpbXVtRmlsdGVyUXVhbGl0eSkKKwl7CisJCVNhbXBsZXI6Om1heGltdW1UZXh0dXJlRmlsdGVyUXVhbGl0eSA9IG1heGltdW1GaWx0ZXJRdWFsaXR5OworCX0KKworCXZvaWQgU2FtcGxlcjo6c2V0TWlwbWFwUXVhbGl0eShNaXBtYXBUeXBlIG1heGltdW1GaWx0ZXJRdWFsaXR5KQorCXsKKwkJU2FtcGxlcjo6bWF4aW11bU1pcG1hcEZpbHRlclF1YWxpdHkgPSBtYXhpbXVtRmlsdGVyUXVhbGl0eTsKKwl9CisKKwl2b2lkIFNhbXBsZXI6OnNldE1pcG1hcExPRChmbG9hdCBMT0QpCisJeworCQl0ZXh0dXJlLkxPRCA9IExPRDsKKwkJZXhwMkxPRCA9IGV4cDIoTE9EKTsKKwl9CisKKwlib29sIFNhbXBsZXI6Omhhc1RleHR1cmUoKSBjb25zdAorCXsKKwkJcmV0dXJuIHRleHR1cmVUeXBlICE9IFRFWFRVUkVfTlVMTDsKKwl9CisKKwlib29sIFNhbXBsZXI6Omhhc1Vuc2lnbmVkVGV4dHVyZSgpIGNvbnN0CisJeworCQlyZXR1cm4gU3VyZmFjZTo6aXNVbnNpZ25lZENvbXBvbmVudChpbnRlcm5hbFRleHR1cmVGb3JtYXQsIDApICYmCisJCSAgICAgICBTdXJmYWNlOjppc1Vuc2lnbmVkQ29tcG9uZW50KGludGVybmFsVGV4dHVyZUZvcm1hdCwgMSkgJiYKKwkJCSAgIFN1cmZhY2U6OmlzVW5zaWduZWRDb21wb25lbnQoaW50ZXJuYWxUZXh0dXJlRm9ybWF0LCAyKSAmJgorCQkJICAgU3VyZmFjZTo6aXNVbnNpZ25lZENvbXBvbmVudChpbnRlcm5hbFRleHR1cmVGb3JtYXQsIDMpOworCX0KKworCWJvb2wgU2FtcGxlcjo6aGFzQ3ViZVRleHR1cmUoKSBjb25zdAorCXsKKwkJcmV0dXJuIHRleHR1cmVUeXBlID09IFRFWFRVUkVfQ1VCRTsKKwl9CisKKwlib29sIFNhbXBsZXI6Omhhc1ZvbHVtZVRleHR1cmUoKSBjb25zdAorCXsKKwkJcmV0dXJuIHRleHR1cmVUeXBlID09IFRFWFRVUkVfM0Q7CisJfQorCisJY29uc3QgVGV4dHVyZSAmU2FtcGxlcjo6Z2V0VGV4dHVyZURhdGEoKQorCXsKKwkJcmV0dXJuIHRleHR1cmU7CisJfQorCisJTWlwbWFwVHlwZSBTYW1wbGVyOjptaXBtYXBGaWx0ZXIoKSBjb25zdAorCXsKKwkJaWYobWlwbWFwRmlsdGVyU3RhdGUgIT0gTUlQTUFQX05PTkUpCisJCXsKKwkJCWZvcihpbnQgaSA9IDE7IGkgPCBNSVBNQVBfTEVWRUxTOyBpKyspCisJCQl7CisJCQkJaWYodGV4dHVyZS5taXBtYXBbMF0uYnVmZmVyWzBdICE9IHRleHR1cmUubWlwbWFwW2ldLmJ1ZmZlclswXSkKKwkJCQl7CisJCQkJCXJldHVybiBtaXBtYXBGaWx0ZXJTdGF0ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBPbmx5IG9uZSBtaXBtYXAgbGV2ZWwKKwkJcmV0dXJuIE1JUE1BUF9OT05FOworCX0KKworCWJvb2wgU2FtcGxlcjo6aGFzTlBPVFRleHR1cmUoKSBjb25zdAorCXsKKwkJaWYodGV4dHVyZVR5cGUgPT0gVEVYVFVSRV9OVUxMKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gIWlzUG93Mih0ZXh0dXJlLm1pcG1hcFswXS53aWR0aFswXSkgfHwgIWlzUG93Mih0ZXh0dXJlLm1pcG1hcFswXS5oZWlnaHRbMF0pIHx8ICFpc1BvdzIodGV4dHVyZS5taXBtYXBbMF0uZGVwdGhbMF0pOworCX0KKworCVRleHR1cmVUeXBlIFNhbXBsZXI6OmdldFRleHR1cmVUeXBlKCkgY29uc3QKKwl7CisJCXJldHVybiB0ZXh0dXJlVHlwZTsKKwl9CisKKwlGaWx0ZXJUeXBlIFNhbXBsZXI6OmdldFRleHR1cmVGaWx0ZXIoKSBjb25zdAorCXsKKwkJRmlsdGVyVHlwZSBmaWx0ZXIgPSB0ZXh0dXJlRmlsdGVyOworCisJCWlmKGdhdGhlciAmJiBTdXJmYWNlOjpjb21wb25lbnRDb3VudChpbnRlcm5hbFRleHR1cmVGb3JtYXQpID09IDEpCisJCXsKKwkJCWZpbHRlciA9IEZJTFRFUl9HQVRIRVI7CisJCX0KKworCQlpZih0ZXh0dXJlVHlwZSAhPSBURVhUVVJFXzJEIHx8IHRleHR1cmUubWF4QW5pc290cm9weSA9PSAxLjBmKQorCQl7CisJCQlyZXR1cm4gKEZpbHRlclR5cGUpbWluKGZpbHRlciwgRklMVEVSX0xJTkVBUik7CisJCX0KKworCQlyZXR1cm4gZmlsdGVyOworCX0KKworCUFkZHJlc3NpbmdNb2RlIFNhbXBsZXI6OmdldEFkZHJlc3NpbmdNb2RlVSgpIGNvbnN0CisJeworCQlpZihoYXNDdWJlVGV4dHVyZSgpKQorCQl7CisJCQlyZXR1cm4gQUREUkVTU0lOR19DTEFNUDsKKwkJfQorCisJCXJldHVybiBhZGRyZXNzaW5nTW9kZVU7CisJfQorCisJQWRkcmVzc2luZ01vZGUgU2FtcGxlcjo6Z2V0QWRkcmVzc2luZ01vZGVWKCkgY29uc3QKKwl7CisJCWlmKGhhc0N1YmVUZXh0dXJlKCkpCisJCXsKKwkJCXJldHVybiBBRERSRVNTSU5HX0NMQU1QOworCQl9CisKKwkJcmV0dXJuIGFkZHJlc3NpbmdNb2RlVjsKKwl9CisKKwlBZGRyZXNzaW5nTW9kZSBTYW1wbGVyOjpnZXRBZGRyZXNzaW5nTW9kZVcoKSBjb25zdAorCXsKKwkJaWYoaGFzQ3ViZVRleHR1cmUoKSkKKwkJeworCQkJcmV0dXJuIEFERFJFU1NJTkdfQ0xBTVA7CisJCX0KKworCQlyZXR1cm4gYWRkcmVzc2luZ01vZGVXOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9TYW1wbGVyLmhwcCBiL3NyYy9SZW5kZXJlci9TYW1wbGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTMyYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlbmRlcmVyL1NhbXBsZXIuaHBwCkBAIC0wLDAgKzEsMTk1IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgc3dfU2FtcGxlcl9ocHAKKyNkZWZpbmUgc3dfU2FtcGxlcl9ocHAKKworI2luY2x1ZGUgIk1haW4vQ29uZmlnLmhwcCIKKyNpbmNsdWRlICJSZW5kZXJlci9TdXJmYWNlLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJc3RydWN0IE1pcG1hcAorCXsKKwkJdm9pZCAqYnVmZmVyWzZdOworCisJCXVuaW9uCisJCXsKKwkJCXN0cnVjdAorCQkJeworCQkJCWludDY0X3QgdUludDsKKwkJCQlpbnQ2NF90IHZJbnQ7CisJCQkJaW50NjRfdCB3SW50OworCQkJCWludDY0X3QgdUZyYWM7CisJCQkJaW50NjRfdCB2RnJhYzsKKwkJCQlpbnQ2NF90IHdGcmFjOworCQkJfTsKKworCQkJc3RydWN0CisJCQl7CisJCQkJZmxvYXQ0IGZXaWR0aDsKKwkJCQlmbG9hdDQgZkhlaWdodDsKKwkJCQlmbG9hdDQgZkRlcHRoOworCQkJfTsKKwkJfTsKKworCQlzaG9ydCB1SGFsZls0XTsKKwkJc2hvcnQgdkhhbGZbNF07CisJCXNob3J0IHdIYWxmWzRdOworCQlzaG9ydCB3aWR0aFs0XTsKKwkJc2hvcnQgaGVpZ2h0WzRdOworCQlzaG9ydCBkZXB0aFs0XTsKKwkJc2hvcnQgb25lUGl0Y2hQWzRdOworCQlpbnQgc2xpY2VQWzJdOworCX07CisKKwlzdHJ1Y3QgVGV4dHVyZQorCXsKKwkJTWlwbWFwIG1pcG1hcFtNSVBNQVBfTEVWRUxTXTsKKworCQlmbG9hdCBMT0Q7CisJCWZsb2F0NCB3aWR0aEhlaWdodExPRDsKKwkJZmxvYXQ0IHdpZHRoTE9EOworCQlmbG9hdDQgaGVpZ2h0TE9EOworCQlmbG9hdDQgZGVwdGhMT0Q7CisKKwkJd29yZDQgYm9yZGVyQ29sb3I0WzRdOworCQlmbG9hdDQgYm9yZGVyQ29sb3JGWzRdOworCQlmbG9hdCBtYXhBbmlzb3Ryb3B5OworCX07CisKKwllbnVtIFNhbXBsZXJUeXBlCisJeworCQlTQU1QTEVSX1BJWEVMLAorCQlTQU1QTEVSX1ZFUlRFWAorCX07CisKKwllbnVtIFRleHR1cmVUeXBlCisJeworCQlURVhUVVJFX05VTEwsCisJCVRFWFRVUkVfMkQsCisJCVRFWFRVUkVfQ1VCRSwKKwkJVEVYVFVSRV8zRCwKKworCQlURVhUVVJFX0xBU1QgPSBURVhUVVJFXzNECisJfTsKKworCWVudW0gRmlsdGVyVHlwZQorCXsKKwkJRklMVEVSX1BPSU5ULAorCQlGSUxURVJfR0FUSEVSLAorCQlGSUxURVJfTElORUFSLAorCQlGSUxURVJfQU5JU09UUk9QSUMsCisKKwkJRklMVEVSX0xBU1QgPSBGSUxURVJfQU5JU09UUk9QSUMKKwl9OworCisJZW51bSBNaXBtYXBUeXBlCisJeworCQlNSVBNQVBfTk9ORSwKKwkJTUlQTUFQX1BPSU5ULAorCQlNSVBNQVBfTElORUFSLAorCQkKKwkJTUlQTUFQX0xBU1QgPSBNSVBNQVBfTElORUFSCisJfTsKKworCWVudW0gQWRkcmVzc2luZ01vZGUKKwl7CisJCUFERFJFU1NJTkdfV1JBUCwKKwkJQUREUkVTU0lOR19DTEFNUCwKKwkJQUREUkVTU0lOR19NSVJST1IsCisJCUFERFJFU1NJTkdfTUlSUk9ST05DRSwKKwkJQUREUkVTU0lOR19CT1JERVIsCisKKwkJQUREUkVTU0lOR19MQVNUID0gQUREUkVTU0lOR19CT1JERVIKKwl9OworCisJY2xhc3MgU2FtcGxlcgorCXsKKwlwdWJsaWM6CisJCXN0cnVjdCBTdGF0ZQorCQl7CisJCQlTdGF0ZSgpOworCisJCQl1bnNpZ25lZCBpbnQgdGV4dHVyZVR5cGUgICAgIDogQklUUyhURVhUVVJFX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHRleHR1cmVGb3JtYXQgICA6IEJJVFMoRk9STUFUX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHRleHR1cmVGaWx0ZXIgICA6IEJJVFMoRklMVEVSX0xBU1QpOworCQkJdW5zaWduZWQgaW50IGFkZHJlc3NpbmdNb2RlVSA6IEJJVFMoQUREUkVTU0lOR19MQVNUKTsKKwkJCXVuc2lnbmVkIGludCBhZGRyZXNzaW5nTW9kZVYgOiBCSVRTKEFERFJFU1NJTkdfTEFTVCk7CisJCQl1bnNpZ25lZCBpbnQgYWRkcmVzc2luZ01vZGVXIDogQklUUyhBRERSRVNTSU5HX0xBU1QpOworCQkJdW5zaWduZWQgaW50IG1pcG1hcEZpbHRlciAgICA6IEJJVFMoRklMVEVSX0xBU1QpOworCQkJdW5zaWduZWQgaW50IGhhc05QT1RUZXh0dXJlCSA6IDE7CisJCQl1bnNpZ25lZCBpbnQgc1JHQiAgICAgICAgICAgIDogMTsKKworCQkJI2lmIFBFUkZfUFJPRklMRQorCQkJYm9vbCBjb21wcmVzc2VkRm9ybWF0ICAgICAgICA6IDE7CisJCQkjZW5kaWYKKwkJfTsKKworCQlTYW1wbGVyKCk7CisKKwkJflNhbXBsZXIoKTsKKworCQlTdGF0ZSBzYW1wbGVyU3RhdGUoKSBjb25zdDsKKworCQl2b2lkIHNldFRleHR1cmVMZXZlbChpbnQgZmFjZSwgaW50IGxldmVsLCBTdXJmYWNlICpzdXJmYWNlLCBUZXh0dXJlVHlwZSB0eXBlKTsKKworCQl2b2lkIHNldFRleHR1cmVGaWx0ZXIoRmlsdGVyVHlwZSB0ZXh0dXJlRmlsdGVyKTsKKwkJdm9pZCBzZXRNaXBtYXBGaWx0ZXIoTWlwbWFwVHlwZSBtaXBtYXBGaWx0ZXIpOworCQl2b2lkIHNldEdhdGhlckVuYWJsZShib29sIGVuYWJsZSk7CisJCXZvaWQgc2V0QWRkcmVzc2luZ01vZGVVKEFkZHJlc3NpbmdNb2RlIGFkZHJlc3NpbmdNb2RlKTsKKwkJdm9pZCBzZXRBZGRyZXNzaW5nTW9kZVYoQWRkcmVzc2luZ01vZGUgYWRkcmVzc2luZ01vZGUpOworCQl2b2lkIHNldEFkZHJlc3NpbmdNb2RlVyhBZGRyZXNzaW5nTW9kZSBhZGRyZXNzaW5nTW9kZSk7CisJCXZvaWQgc2V0UmVhZFNSR0IoYm9vbCBzUkdCKTsKKwkJdm9pZCBzZXRCb3JkZXJDb2xvcihjb25zdCBDb2xvcjxmbG9hdD4gJmJvcmRlckNvbG9yKTsKKwkJdm9pZCBzZXRNYXhBbmlzb3Ryb3B5KHVuc2lnbmVkIGludCBtYXhBbmlzb3Ryb3B5KTsKKworCQlzdGF0aWMgdm9pZCBzZXRGaWx0ZXJRdWFsaXR5KEZpbHRlclR5cGUgbWF4aW11bUZpbHRlclF1YWxpdHkpOworCQlzdGF0aWMgdm9pZCBzZXRNaXBtYXBRdWFsaXR5KE1pcG1hcFR5cGUgbWF4aW11bUZpbHRlclF1YWxpdHkpOworCQl2b2lkIHNldE1pcG1hcExPRChmbG9hdCBsb2QpOworCisJCWJvb2wgaGFzVGV4dHVyZSgpIGNvbnN0OworCQlib29sIGhhc1Vuc2lnbmVkVGV4dHVyZSgpIGNvbnN0OworCQlib29sIGhhc0N1YmVUZXh0dXJlKCkgY29uc3Q7CisJCWJvb2wgaGFzVm9sdW1lVGV4dHVyZSgpIGNvbnN0OworCisJCWNvbnN0IFRleHR1cmUgJmdldFRleHR1cmVEYXRhKCk7CisKKwlwcml2YXRlOgorCQlNaXBtYXBUeXBlIG1pcG1hcEZpbHRlcigpIGNvbnN0OworCQlib29sIGhhc05QT1RUZXh0dXJlKCkgY29uc3Q7CisJCVRleHR1cmVUeXBlIGdldFRleHR1cmVUeXBlKCkgY29uc3Q7CisJCUZpbHRlclR5cGUgZ2V0VGV4dHVyZUZpbHRlcigpIGNvbnN0OworCQlBZGRyZXNzaW5nTW9kZSBnZXRBZGRyZXNzaW5nTW9kZVUoKSBjb25zdDsKKwkJQWRkcmVzc2luZ01vZGUgZ2V0QWRkcmVzc2luZ01vZGVWKCkgY29uc3Q7CisJCUFkZHJlc3NpbmdNb2RlIGdldEFkZHJlc3NpbmdNb2RlVygpIGNvbnN0OworCisJCUZvcm1hdCBleHRlcm5hbFRleHR1cmVGb3JtYXQ7CisJCUZvcm1hdCBpbnRlcm5hbFRleHR1cmVGb3JtYXQ7CisJCVRleHR1cmVUeXBlIHRleHR1cmVUeXBlOworCisJCUZpbHRlclR5cGUgdGV4dHVyZUZpbHRlcjsKKwkJQWRkcmVzc2luZ01vZGUgYWRkcmVzc2luZ01vZGVVOworCQlBZGRyZXNzaW5nTW9kZSBhZGRyZXNzaW5nTW9kZVY7CisJCUFkZHJlc3NpbmdNb2RlIGFkZHJlc3NpbmdNb2RlVzsKKwkJTWlwbWFwVHlwZSBtaXBtYXBGaWx0ZXJTdGF0ZTsKKwkJYm9vbCBzUkdCOworCQlib29sIGdhdGhlcjsKKworCQlUZXh0dXJlIHRleHR1cmU7CisJCWZsb2F0IGV4cDJMT0Q7CisKKwkJc3RhdGljIEZpbHRlclR5cGUgbWF4aW11bVRleHR1cmVGaWx0ZXJRdWFsaXR5OworCQlzdGF0aWMgTWlwbWFwVHlwZSBtYXhpbXVtTWlwbWFwRmlsdGVyUXVhbGl0eTsKKwl9OworfQorCisjZW5kaWYgICAvLyBzd19TYW1wbGVyX2hwcApkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1NldHVwUHJvY2Vzc29yLmNwcCBiL3NyYy9SZW5kZXJlci9TZXR1cFByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3MzdhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9TZXR1cFByb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMzYgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIlNldHVwUHJvY2Vzc29yLmhwcCIKKworI2luY2x1ZGUgIlNldHVwUm91dGluZS5ocHAiCisjaW5jbHVkZSAiUHJpbWl0aXZlLmhwcCIKKyNpbmNsdWRlICJQb2x5Z29uLmhwcCIKKyNpbmNsdWRlICJWaWV3cG9ydC5ocHAiCisjaW5jbHVkZSAiQ29udGV4dC5ocHAiCisjaW5jbHVkZSAiUmVuZGVyZXIuaHBwIgorI2luY2x1ZGUgIkNvbnN0YW50cy5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwlleHRlcm4gYm9vbCBjb21wbGVtZW50YXJ5RGVwdGhCdWZmZXI7CisKKwl1bnNpZ25lZCBpbnQgU2V0dXBQcm9jZXNzb3I6OlN0YXRlczo6Y29tcHV0ZUhhc2goKQorCXsKKwkJdW5zaWduZWQgaW50ICpzdGF0ZSA9ICh1bnNpZ25lZCBpbnQqKXRoaXM7CisJCXVuc2lnbmVkIGludCBoYXNoID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKFN0YXRlcykgLyA0OyBpKyspCisJCXsKKwkJCWhhc2ggXj0gc3RhdGVbaV07CisJCX0KKworCQlyZXR1cm4gaGFzaDsKKwl9CisKKwlTZXR1cFByb2Nlc3Nvcjo6U3RhdGU6OlN0YXRlKGludCBpKQorCXsKKwkJbWVtc2V0KHRoaXMsIDAsIHNpemVvZihTdGF0ZSkpOworCX0KKworCWJvb2wgU2V0dXBQcm9jZXNzb3I6OlN0YXRlOjpvcGVyYXRvcj09KGNvbnN0IFN0YXRlICZzdGF0ZSkgY29uc3QKKwl7CisJCWlmKGhhc2ggIT0gc3RhdGUuaGFzaCkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIG1lbWNtcChzdGF0aWNfY2FzdDxjb25zdCBTdGF0ZXMqPih0aGlzKSwgc3RhdGljX2Nhc3Q8Y29uc3QgU3RhdGVzKj4oJnN0YXRlKSwgc2l6ZW9mKFN0YXRlcykpID09IDA7CisJfQorCisJU2V0dXBQcm9jZXNzb3I6OlNldHVwUHJvY2Vzc29yKENvbnRleHQgKmNvbnRleHQpIDogY29udGV4dChjb250ZXh0KQorCXsKKwkJcm91dGluZUNhY2hlID0gMDsKKwkJc2V0Um91dGluZUNhY2hlU2l6ZSgxMDI0KTsKKwl9CisKKwlTZXR1cFByb2Nlc3Nvcjo6flNldHVwUHJvY2Vzc29yKCkKKwl7CisJCWRlbGV0ZSByb3V0aW5lQ2FjaGU7CisJCXJvdXRpbmVDYWNoZSA9IDA7CisJfQorCisJU2V0dXBQcm9jZXNzb3I6OlN0YXRlIFNldHVwUHJvY2Vzc29yOjp1cGRhdGUoKSBjb25zdAorCXsKKwkJU3RhdGUgc3RhdGU7CisKKwkJc3RhdGUuaXNEcmF3UG9pbnQgPSBjb250ZXh0LT5pc0RyYXdQb2ludCh0cnVlKTsKKwkJc3RhdGUuaXNEcmF3TGluZSA9IGNvbnRleHQtPmlzRHJhd0xpbmUodHJ1ZSk7CisJCXN0YXRlLmlzRHJhd1RyaWFuZ2xlID0gY29udGV4dC0+aXNEcmF3VHJpYW5nbGUoZmFsc2UpOworCQlzdGF0ZS5pc0RyYXdTb2xpZFRyaWFuZ2xlID0gY29udGV4dC0+aXNEcmF3VHJpYW5nbGUodHJ1ZSk7CisJCXN0YXRlLmludGVycG9sYXRlRGVwdGggPSBjb250ZXh0LT5kZXB0aEJ1ZmZlckFjdGl2ZSgpIHx8IGNvbnRleHQtPnBpeGVsRm9nQWN0aXZlKCkgIT0gQ29udGV4dDo6Rk9HX05PTkU7CisJCXN0YXRlLnBlcnNwZWN0aXZlID0gY29udGV4dC0+cGVyc3BlY3RpdmVBY3RpdmUoKTsKKwkJc3RhdGUucG9pbnRTcHJpdGUgPSBjb250ZXh0LT5wb2ludFNwcml0ZUFjdGl2ZSgpOworCQlzdGF0ZS5jdWxsTW9kZSA9IGNvbnRleHQtPmN1bGxNb2RlOworCQlzdGF0ZS50d29TaWRlZFN0ZW5jaWwgPSBjb250ZXh0LT5zdGVuY2lsQWN0aXZlKCkgJiYgY29udGV4dC0+dHdvU2lkZWRTdGVuY2lsOworCQlzdGF0ZS5zbG9wZURlcHRoQmlhcyA9IHNsb3BlRGVwdGhCaWFzICE9IDAuMGY7CisJCXN0YXRlLnZGYWNlID0gY29udGV4dC0+cGl4ZWxTaGFkZXIgJiYgY29udGV4dC0+cGl4ZWxTaGFkZXItPnZGYWNlRGVjbGFyZWQ7CisKKwkJc3RhdGUucG9zaXRpb25SZWdpc3RlciA9IFBvczsKKwkJc3RhdGUucG9pbnRTaXplUmVnaXN0ZXIgPSAweEY7ICAgLy8gTm8gdmVydGV4IHBvaW50IHNpemUKKworCQlzdGF0ZS5tdWx0aVNhbXBsZSA9IGNvbnRleHQtPnJlbmRlclRhcmdldFswXS0+Z2V0TXVsdGlTYW1wbGVDb3VudCgpOworCisJCWlmKGNvbnRleHQtPnZlcnRleFNoYWRlcikKKwkJeworCQkJc3RhdGUucG9zaXRpb25SZWdpc3RlciA9IGNvbnRleHQtPnZlcnRleFNoYWRlci0+cG9zaXRpb25SZWdpc3RlcjsKKwkJCXN0YXRlLnBvaW50U2l6ZVJlZ2lzdGVyID0gY29udGV4dC0+dmVydGV4U2hhZGVyLT5wb2ludFNpemVSZWdpc3RlcjsKKwkJfQorCQllbHNlIGlmKGNvbnRleHQtPnBvaW50U2l6ZUFjdGl2ZSgpKQorCQl7CisJCQlzdGF0ZS5wb2ludFNpemVSZWdpc3RlciA9IFB0czsKKwkJfQorCisJCWZvcihpbnQgaW50ZXJwb2xhbnQgPSAwOyBpbnRlcnBvbGFudCA8IDExOyBpbnRlcnBvbGFudCsrKQorCQl7CisJCQlpbnQgY29tcG9uZW50Q291bnQgPSBpbnRlcnBvbGFudCA8IDEwID8gNCA6IDE7ICAgLy8gRm9nIG9ubHkgaGFzIG9uZSBjb21wb25lbnQKKworCQkJZm9yKGludCBjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCBjb21wb25lbnRDb3VudDsgY29tcG9uZW50KyspCisJCQl7CisJCQkJc3RhdGUuZ3JhZGllbnRbaW50ZXJwb2xhbnRdW2NvbXBvbmVudF0uYXR0cmlidXRlID0gMHgzRjsKKwkJCQlzdGF0ZS5ncmFkaWVudFtpbnRlcnBvbGFudF1bY29tcG9uZW50XS5mbGF0ID0gZmFsc2U7CisJCQkJc3RhdGUuZ3JhZGllbnRbaW50ZXJwb2xhbnRdW2NvbXBvbmVudF0ud3JhcCA9IGZhbHNlOworCQkJfQorCQl9CisKKwkJY29uc3QgYm9vbCBwb2ludCA9IGNvbnRleHQtPmlzRHJhd1BvaW50KHRydWUpOworCQljb25zdCBib29sIHNwcml0ZSA9IGNvbnRleHQtPnBvaW50U3ByaXRlQWN0aXZlKCk7CisJCWNvbnN0IGJvb2wgZmxhdFNoYWRpbmcgPSAoY29udGV4dC0+c2hhZGluZ01vZGUgPT0gQ29udGV4dDo6U0hBRElOR19GTEFUKSB8fCBwb2ludDsKKworCQlpZihjb250ZXh0LT52ZXJ0ZXhTaGFkZXIgJiYgY29udGV4dC0+cGl4ZWxTaGFkZXIpCisJCXsKKwkJCWZvcihpbnQgaW50ZXJwb2xhbnQgPSAwOyBpbnRlcnBvbGFudCA8IDEwOyBpbnRlcnBvbGFudCsrKQorCQkJeworCQkJCWZvcihpbnQgY29tcG9uZW50ID0gMDsgY29tcG9uZW50IDwgNDsgY29tcG9uZW50KyspCisJCQkJeworCQkJCQlpbnQgcHJvamVjdCA9IGNvbnRleHQtPmlzUHJvamVjdGlvbkNvbXBvbmVudChpbnRlcnBvbGFudCAtIDIsIGNvbXBvbmVudCkgPyAxIDogMDsKKworCQkJCQlpZihjb250ZXh0LT5waXhlbFNoYWRlci0+c2VtYW50aWNbaW50ZXJwb2xhbnRdW2NvbXBvbmVudCAtIHByb2plY3RdLmFjdGl2ZSgpKQorCQkJCQl7CisJCQkJCQlpbnQgaW5wdXQgPSBpbnRlcnBvbGFudDsKKwkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCAxMjsgaSsrKQorCQkJCQkJeworCQkJCQkJCWlmKGNvbnRleHQtPnBpeGVsU2hhZGVyLT5zZW1hbnRpY1tpbnRlcnBvbGFudF1bY29tcG9uZW50IC0gcHJvamVjdF0gPT0gY29udGV4dC0+dmVydGV4U2hhZGVyLT5vdXRwdXRbaV1bY29tcG9uZW50IC0gcHJvamVjdF0pCisJCQkJCQkJeworCQkJCQkJCQlpbnB1dCA9IGk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJYm9vbCBmbGF0ID0gcG9pbnQ7CisKKwkJCQkJCXN3aXRjaChjb250ZXh0LT5waXhlbFNoYWRlci0+c2VtYW50aWNbaW50ZXJwb2xhbnRdW2NvbXBvbmVudCAtIHByb2plY3RdLnVzYWdlKQorCQkJCQkJeworCQkJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246OlVTQUdFX1RFWENPT1JEOiBmbGF0ID0gcG9pbnQgJiYgIXNwcml0ZTsgYnJlYWs7CisJCQkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfQ09MT1I6ICAgIGZsYXQgPSBmbGF0U2hhZGluZzsgICAgICBicmVhazsKKwkJCQkJCX0KKworCQkJCQkJc3RhdGUuZ3JhZGllbnRbaW50ZXJwb2xhbnRdW2NvbXBvbmVudF0uYXR0cmlidXRlID0gaW5wdXQ7CisJCQkJCQlzdGF0ZS5ncmFkaWVudFtpbnRlcnBvbGFudF1bY29tcG9uZW50XS5mbGF0ID0gZmxhdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmKGNvbnRleHQtPnByZVRyYW5zZm9ybWVkICYmIGNvbnRleHQtPnBpeGVsU2hhZGVyKQorCQl7CisJCQlmb3IoaW50IGludGVycG9sYW50ID0gMDsgaW50ZXJwb2xhbnQgPCAxMDsgaW50ZXJwb2xhbnQrKykKKwkJCXsKKwkJCQlmb3IoaW50IGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDQ7IGNvbXBvbmVudCsrKQorCQkJCXsKKwkJCQkJaW50IGluZGV4ID0gY29udGV4dC0+cGl4ZWxTaGFkZXItPnNlbWFudGljW2ludGVycG9sYW50XVtjb21wb25lbnRdLmluZGV4OworCisJCQkJCXN3aXRjaChjb250ZXh0LT5waXhlbFNoYWRlci0+c2VtYW50aWNbaW50ZXJwb2xhbnRdW2NvbXBvbmVudF0udXNhZ2UpCisJCQkJCXsKKwkJCQkJY2FzZSAweEZGOgorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9URVhDT09SRDoKKwkJCQkJCXN0YXRlLmdyYWRpZW50W2ludGVycG9sYW50XVtjb21wb25lbnRdLmF0dHJpYnV0ZSA9IFQwICsgaW5kZXg7CisJCQkJCQlzdGF0ZS5ncmFkaWVudFtpbnRlcnBvbGFudF1bY29tcG9uZW50XS5mbGF0ID0gcG9pbnQgJiYgIXNwcml0ZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfQ09MT1I6CisJCQkJCQlzdGF0ZS5ncmFkaWVudFtpbnRlcnBvbGFudF1bY29tcG9uZW50XS5hdHRyaWJ1dGUgPSBEMCArIGluZGV4OworCQkJCQkJc3RhdGUuZ3JhZGllbnRbaW50ZXJwb2xhbnRdW2NvbXBvbmVudF0uZmxhdCA9IGZsYXRTaGFkaW5nOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgaWYoY29udGV4dC0+cGl4ZWxTaGFkZXJWZXJzaW9uKCkgPCAweDAzMDApCisJCXsKKwkJCWZvcihpbnQgY29vcmRpbmF0ZSA9IDA7IGNvb3JkaW5hdGUgPCA4OyBjb29yZGluYXRlKyspCisJCQl7CisJCQkJZm9yKGludCBjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCA0OyBjb21wb25lbnQrKykKKwkJCQl7CisJCQkJCWlmKGNvbnRleHQtPnRleHR1cmVBY3RpdmUoY29vcmRpbmF0ZSwgY29tcG9uZW50KSkKKwkJCQkJeworCQkJCQkJc3RhdGUudGV4dHVyZVtjb29yZGluYXRlXVtjb21wb25lbnRdLmF0dHJpYnV0ZSA9IFQwICsgY29vcmRpbmF0ZTsKKwkJCQkJCXN0YXRlLnRleHR1cmVbY29vcmRpbmF0ZV1bY29tcG9uZW50XS5mbGF0ID0gcG9pbnQgJiYgIXNwcml0ZTsKKwkJCQkJCXN0YXRlLnRleHR1cmVbY29vcmRpbmF0ZV1bY29tcG9uZW50XS53cmFwID0gKGNvbnRleHQtPnRleHR1cmVXcmFwW2Nvb3JkaW5hdGVdICYgKDEgPDwgY29tcG9uZW50KSkgIT0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJZm9yKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMjsgY29sb3IrKykKKwkJCXsKKwkJCQlmb3IoaW50IGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDQ7IGNvbXBvbmVudCsrKQorCQkJCXsKKwkJCQkJaWYoY29udGV4dC0+Y29sb3JBY3RpdmUoY29sb3IsIGNvbXBvbmVudCkpCisJCQkJCXsKKwkJCQkJCXN0YXRlLmNvbG9yW2NvbG9yXVtjb21wb25lbnRdLmF0dHJpYnV0ZSA9IEQwICsgY29sb3I7CisJCQkJCQlzdGF0ZS5jb2xvcltjb2xvcl1bY29tcG9uZW50XS5mbGF0ID0gZmxhdFNoYWRpbmc7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCisJCWlmKGNvbnRleHQtPmZvZ0FjdGl2ZSgpKQorCQl7CisJCQlzdGF0ZS5mb2cuYXR0cmlidXRlID0gRm9nOworCQkJc3RhdGUuZm9nLmZsYXQgPSBwb2ludDsKKwkJfQorCisJCXN0YXRlLmhhc2ggPSBzdGF0ZS5jb21wdXRlSGFzaCgpOworCisJCXJldHVybiBzdGF0ZTsKKwl9CisKKwlSb3V0aW5lICpTZXR1cFByb2Nlc3Nvcjo6cm91dGluZShjb25zdCBTdGF0ZSAmc3RhdGUpCisJeworCQlSb3V0aW5lICpyb3V0aW5lID0gcm91dGluZUNhY2hlLT5xdWVyeShzdGF0ZSk7CisKKwkJaWYoIXJvdXRpbmUpCisJCXsKKwkJCVNldHVwUm91dGluZSAqZ2VuZXJhdG9yID0gbmV3IFNldHVwUm91dGluZShzdGF0ZSk7CisJCQlnZW5lcmF0b3ItPmdlbmVyYXRlKCk7CisJCQlyb3V0aW5lID0gZ2VuZXJhdG9yLT5nZXRSb3V0aW5lKCk7CisJCQlkZWxldGUgZ2VuZXJhdG9yOworCisJCQlyb3V0aW5lQ2FjaGUtPmFkZChzdGF0ZSwgcm91dGluZSk7CisJCX0KKworCQlyZXR1cm4gcm91dGluZTsKKwl9CisKKwl2b2lkIFNldHVwUHJvY2Vzc29yOjpzZXRSb3V0aW5lQ2FjaGVTaXplKGludCBjYWNoZVNpemUpCisJeworCQlkZWxldGUgcm91dGluZUNhY2hlOworCQlyb3V0aW5lQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8U3RhdGUsIFJvdXRpbmU+KGNsYW1wKGNhY2hlU2l6ZSwgMSwgNjU1MzYpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvU2V0dXBQcm9jZXNzb3IuaHBwIGIvc3JjL1JlbmRlcmVyL1NldHVwUHJvY2Vzc29yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2FkZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlbmRlcmVyL1NldHVwUHJvY2Vzc29yLmhwcApAQCAtMCwwICsxLDEwNiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgc3dfU2V0dXBQcm9jZXNzb3JfaHBwDQorI2RlZmluZSBzd19TZXR1cFByb2Nlc3Nvcl9ocHANCisNCisjaW5jbHVkZSAiQ29udGV4dC5ocHAiDQorI2luY2x1ZGUgIkxSVUNhY2hlLmhwcCINCisjaW5jbHVkZSAiU2hhZGVyL1ZlcnRleFNoYWRlci5ocHAiDQorI2luY2x1ZGUgIlNoYWRlci9QaXhlbFNoYWRlci5ocHAiDQorI2luY2x1ZGUgIkNvbW1vbi9UeXBlcy5ocHAiDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwlzdHJ1Y3QgUHJpbWl0aXZlOw0KKwlzdHJ1Y3QgVHJpYW5nbGU7DQorCXN0cnVjdCBQb2x5Z29uOw0KKwlzdHJ1Y3QgVmVydGV4Ow0KKwljbGFzcyBWaWV3cG9ydDsNCisJY2xhc3MgUm91dGluZTsNCisJc3RydWN0IERyYXdDYWxsOw0KKwlzdHJ1Y3QgRHJhd0RhdGE7DQorDQorCWNsYXNzIFNldHVwUHJvY2Vzc29yDQorCXsNCisJcHVibGljOg0KKwkJc3RydWN0IFN0YXRlcw0KKwkJew0KKwkJCXVuc2lnbmVkIGludCBjb21wdXRlSGFzaCgpOw0KKw0KKwkJCXVuc2lnbmVkIGludCBpc0RyYXdQb2ludAkJCTogMTsNCisJCQl1bnNpZ25lZCBpbnQgaXNEcmF3TGluZQkJCQk6IDE7DQorCQkJdW5zaWduZWQgaW50IGlzRHJhd1RyaWFuZ2xlCQkJOiAxOw0KKwkJCXVuc2lnbmVkIGludCBpc0RyYXdTb2xpZFRyaWFuZ2xlCTogMTsNCisJCQl1bnNpZ25lZCBpbnQgaW50ZXJwb2xhdGVEZXB0aAkJOiAxOw0KKwkJCXVuc2lnbmVkIGludCBwZXJzcGVjdGl2ZQkJCTogMTsNCisJCQl1bnNpZ25lZCBpbnQgcG9pbnRTcHJpdGUJCQk6IDE7DQorCQkJdW5zaWduZWQgaW50IHBvc2l0aW9uUmVnaXN0ZXIJCTogNDsNCisJCQl1bnNpZ25lZCBpbnQgcG9pbnRTaXplUmVnaXN0ZXIJCTogNDsNCisJCQl1bnNpZ25lZCBpbnQgY3VsbE1vZGUJCQkJOiBCSVRTKENvbnRleHQ6OkNVTExfTEFTVCk7DQorCQkJdW5zaWduZWQgaW50IHR3b1NpZGVkU3RlbmNpbAkJOiAxOw0KKwkJCXVuc2lnbmVkIGludCBzbG9wZURlcHRoQmlhcwkJCTogMTsNCisJCQl1bnNpZ25lZCBpbnQgdkZhY2UJCQkJCTogMTsNCisNCisJCQl1bnNpZ25lZCBpbnQgbXVsdGlTYW1wbGUJCQk6IDM7ICAgLy8gMSwgMiBvciA0DQorDQorCQkJc3RydWN0IEdyYWRpZW50DQorCQkJew0KKwkJCQl1bnNpZ25lZCBjaGFyIGF0dHJpYnV0ZSA6IDY7DQorCQkJCXVuc2lnbmVkIGNoYXIgZmxhdCA6IDE7DQorCQkJCXVuc2lnbmVkIGNoYXIgd3JhcCA6IDE7DQorCQkJfTsNCisNCisJCQl1bmlvbg0KKwkJCXsNCisJCQkJc3RydWN0DQorCQkJCXsNCisJCQkJCUdyYWRpZW50IGNvbG9yWzJdWzRdOw0KKwkJCQkJR3JhZGllbnQgdGV4dHVyZVs4XVs0XTsNCisJCQkJCUdyYWRpZW50IGZvZzsNCisJCQkJfTsNCisNCisJCQkJR3JhZGllbnQgZ3JhZGllbnRbMTBdWzRdOw0KKwkJCX07DQorCQl9Ow0KKw0KKwkJc3RydWN0IFN0YXRlIDogU3RhdGVzDQorCQl7DQorCQkJU3RhdGUoaW50IGkgPSAwKTsNCisNCisJCQlib29sIG9wZXJhdG9yPT0oY29uc3QgU3RhdGUgJnN0YXRlcykgY29uc3Q7DQorDQorCQkJdW5zaWduZWQgaW50IGhhc2g7DQorCQl9Ow0KKw0KKwkJdHlwZWRlZiBib29sIChfX2NkZWNsICpSb3V0aW5lUG9pbnRlcikoUHJpbWl0aXZlICpwcmltaXRpdmUsIGNvbnN0IFRyaWFuZ2xlICp0cmlhbmdsZSwgY29uc3QgUG9seWdvbiAqcG9seWdvbiwgY29uc3QgRHJhd0RhdGEgKmRyYXcpOw0KKw0KKwkJU2V0dXBQcm9jZXNzb3IoQ29udGV4dCAqY29udGV4dCk7DQorDQorCQl+U2V0dXBQcm9jZXNzb3IoKTsNCisNCisJcHJvdGVjdGVkOg0KKwkJU3RhdGUgdXBkYXRlKCkgY29uc3Q7DQorCQlSb3V0aW5lICpyb3V0aW5lKGNvbnN0IFN0YXRlICZzdGF0ZSk7DQorDQorCQl2b2lkIHNldFJvdXRpbmVDYWNoZVNpemUoaW50IGNhY2hlU2l6ZSk7DQorDQorCQlmbG9hdCBkZXB0aEJpYXM7DQorCQlmbG9hdCBzbG9wZURlcHRoQmlhczsNCisNCisJcHJpdmF0ZToNCisJCUNvbnRleHQgKmNvbnN0IGNvbnRleHQ7DQorDQorCQlMUlVDYWNoZTxTdGF0ZSwgUm91dGluZT4gKnJvdXRpbmVDYWNoZTsNCisJfTsNCit9DQorDQorI2VuZGlmICAgLy8gc3dfU2V0dXBQcm9jZXNzb3JfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1N0cmVhbS5ocHAgYi9zcmMvUmVuZGVyZXIvU3RyZWFtLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTVmMjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JlbmRlcmVyL1N0cmVhbS5ocHAKQEAgLTAsMCArMSw5OCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIHN3X1N0cmVhbV9ocHAKKyNkZWZpbmUgc3dfU3RyZWFtX2hwcAorCisjaW5jbHVkZSAiQ29tbW9uL1R5cGVzLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJY2xhc3MgUmVzb3VyY2U7CisKKwllbnVtIFN0cmVhbVR5cGUKKwl7CisJCVNUUkVBTVRZUEVfQ09MT1IsICAgICAvLyA0IG5vcm1hbGl6ZWQgdW5zaWduZWQgYnl0ZXMsIFpZWFcgb3JkZXIKKwkJU1RSRUFNVFlQRV9VREVDMywgICAgIC8vIDMgdW5zaWduZWQgMTAtYml0IGZpZWxkcworCQlTVFJFQU1UWVBFX0RFQzNOLCAgICAgLy8gMyBub3JtYWxpemVkIHNpZ25lZCAxMC1iaXQgZmllbGRzCisJCVNUUkVBTVRZUEVfSU5ESUNFUywgICAvLyA0IHVuc2lnbmVkIGJ5dGVzLCBzdG9yZWQgdW5jb252ZXJ0ZWQgaW50byBYIGNvbXBvbmVudAorCQlTVFJFQU1UWVBFX0ZMT0FULCAgICAgLy8gTm9ybWFsaXphdGlvbiBpZ25vcmVkCisJCVNUUkVBTVRZUEVfQllURSwKKwkJU1RSRUFNVFlQRV9TQllURSwKKwkJU1RSRUFNVFlQRV9TSE9SVCwKKwkJU1RSRUFNVFlQRV9VU0hPUlQsCisJCVNUUkVBTVRZUEVfRklYRUQsICAgICAvLyBOb3JtYWxpemF0aW9uIGlnbm9yZWQgKDE2LjE2IGZvcm1hdCkKKwkJU1RSRUFNVFlQRV9IQUxGLCAgICAgIC8vIE5vcm1hbGl6YXRpb24gaWdub3JlZAorCisJCVNUUkVBTVRZUEVfTEFTVCA9IFNUUkVBTVRZUEVfSEFMRgorCX07CisKKwlzdHJ1Y3QgU3RyZWFtUmVzb3VyY2UKKwl7CisJCVJlc291cmNlICpyZXNvdXJjZTsKKwkJY29uc3Qgdm9pZCAqYnVmZmVyOworCQl1bnNpZ25lZCBpbnQgc3RyaWRlOworCX07CisKKwlzdHJ1Y3QgU3RyZWFtIDogcHVibGljIFN0cmVhbVJlc291cmNlCisJeworCQlTdHJlYW0oUmVzb3VyY2UgKnJlc291cmNlID0gMCwgY29uc3Qgdm9pZCAqYnVmZmVyID0gMCwgdW5zaWduZWQgaW50IHN0cmlkZSA9IDApCisJCXsKKwkJCXRoaXMtPnJlc291cmNlID0gcmVzb3VyY2U7CisJCQl0aGlzLT5idWZmZXIgPSBidWZmZXI7CisJCQl0aGlzLT5zdHJpZGUgPSBzdHJpZGU7CisJCX0KKworCQlTdHJlYW0gJmRlZmluZShTdHJlYW1UeXBlIHR5cGUsIHVuc2lnbmVkIGludCBjb3VudCwgYm9vbCBub3JtYWxpemVkID0gZmFsc2UpCisJCXsKKwkJCXRoaXMtPnR5cGUgPSB0eXBlOworCQkJdGhpcy0+Y291bnQgPSBjb3VudDsKKwkJCXRoaXMtPm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkOworCisJCQlyZXR1cm4gKnRoaXM7CisJCX0KKworCQlTdHJlYW0gJmRlZmluZShjb25zdCB2b2lkICpidWZmZXIsIFN0cmVhbVR5cGUgdHlwZSwgdW5zaWduZWQgaW50IGNvdW50LCBib29sIG5vcm1hbGl6ZWQgPSBmYWxzZSkKKwkJeworCQkJdGhpcy0+YnVmZmVyID0gYnVmZmVyOworCQkJdGhpcy0+dHlwZSA9IHR5cGU7CisJCQl0aGlzLT5jb3VudCA9IGNvdW50OworCQkJdGhpcy0+bm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQ7CisKKwkJCXJldHVybiAqdGhpczsKKwkJfQorCisJCVN0cmVhbSAmZGVmYXVsdHMoKQorCQl7CisJCQlzdGF0aWMgY29uc3QgZmxvYXQ0IG51bGwgPSB7MCwgMCwgMCwgMX07CisJCisJCQlyZXNvdXJjZSA9IDA7CisJCQlidWZmZXIgPSAmbnVsbDsKKwkJCXN0cmlkZSA9IDA7CisJCQl0eXBlID0gU1RSRUFNVFlQRV9GTE9BVDsKKwkJCWNvdW50ID0gMDsKKwkJCW5vcm1hbGl6ZWQgPSBmYWxzZTsKKworCQkJcmV0dXJuICp0aGlzOworCQl9CisKKwkJb3BlcmF0b3IgYm9vbCgpIGNvbnN0ICAgLy8gUmV0dXJucyB0cnVlIGlmIHN0cmVhbSBjb250YWlucyBkYXRhCisJCXsKKwkJCXJldHVybiBjb3VudCAhPSAwOworCQl9CisKKwkJU3RyZWFtVHlwZSB0eXBlOworCQl1bnNpZ25lZCBpbnQgY291bnQ7CisJCWJvb2wgbm9ybWFsaXplZDsKKwl9OworfQorCisjZW5kaWYgICAvLyBzd19TdHJlYW1faHBwCmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvU3VyZmFjZS5jcHAgYi9zcmMvUmVuZGVyZXIvU3VyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3MmExNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9TdXJmYWNlLmNwcApAQCAtMCwwICsxLDQ3NDcgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIlN1cmZhY2UuaHBwIgorCisjaW5jbHVkZSAiQ29sb3IuaHBwIgorI2luY2x1ZGUgIkNvbnRleHQuaHBwIgorI2luY2x1ZGUgIkNvbW1vbi9IYWxmLmhwcCIKKyNpbmNsdWRlICJDb21tb24vTWVtb3J5LmhwcCIKKyNpbmNsdWRlICJDb21tb24vQ1BVSUQuaHBwIgorI2luY2x1ZGUgIkNvbW1vbi9SZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiQ29tbW9uL0RlYnVnLmhwcCIKKyNpbmNsdWRlICJSZWFjdG9yL1NoZWxsLmhwcCIKKworI2luY2x1ZGUgPHhtbWludHJpbi5oPgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisjdW5kZWYgbWluCisjdW5kZWYgbWF4CisKK25hbWVzcGFjZSBzdworeworCWV4dGVybiBib29sIHF1YWRMYXlvdXRFbmFibGVkOworCWV4dGVybiBib29sIGNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlcjsKKwlleHRlcm4gVHJhbnNjZW5kZW50YWxQcmVjaXNpb24gbG9nUHJlY2lzaW9uOworCisJdW5zaWduZWQgaW50ICpTdXJmYWNlOjpwYWxldHRlID0gMDsKKwl1bnNpZ25lZCBpbnQgU3VyZmFjZTo6cGFsZXR0ZUlEID0gMDsKKworCXZvaWQgU3VyZmFjZTo6QnVmZmVyOjp3cml0ZShpbnQgeCwgaW50IHksIGludCB6LCBjb25zdCBDb2xvcjxmbG9hdD4gJmNvbG9yKQorCXsKKwkJdm9pZCAqZWxlbWVudCA9ICh1bnNpZ25lZCBjaGFyKilidWZmZXIgKyB4ICogYnl0ZXMgKyB5ICogcGl0Y2hCICsgeiAqIHNsaWNlQjsKKworCQl3cml0ZShlbGVtZW50LCBjb2xvcik7CisJfQorCisJdm9pZCBTdXJmYWNlOjpCdWZmZXI6OndyaXRlKGludCB4LCBpbnQgeSwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZjb2xvcikKKwl7CisJCXZvaWQgKmVsZW1lbnQgPSAodW5zaWduZWQgY2hhciopYnVmZmVyICsgeCAqIGJ5dGVzICsgeSAqIHBpdGNoQjsKKworCQl3cml0ZShlbGVtZW50LCBjb2xvcik7CisJfQorCisJaW5saW5lIHZvaWQgU3VyZmFjZTo6QnVmZmVyOjp3cml0ZSh2b2lkICplbGVtZW50LCBjb25zdCBDb2xvcjxmbG9hdD4gJmNvbG9yKQorCXsKKwkJc3dpdGNoKGZvcm1hdCkKKwkJeworCQljYXNlIEZPUk1BVF9BODoKKwkJCSoodW5zaWduZWQgY2hhciopZWxlbWVudCA9IHVub3JtPDg+KGNvbG9yLmEpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1I4OgorCQkJKih1bnNpZ25lZCBjaGFyKillbGVtZW50ID0gdW5vcm08OD4oY29sb3Iucik7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfUjNHM0IyOgorCQkJKih1bnNpZ25lZCBjaGFyKillbGVtZW50ID0gKHVub3JtPDM+KGNvbG9yLnIpIDw8IDUpIHwgKHVub3JtPDM+KGNvbG9yLmcpIDw8IDIpIHwgKHVub3JtPDI+KGNvbG9yLmIpIDw8IDApOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0E4UjNHM0IyOgorCQkJKih1bnNpZ25lZCBzaG9ydCopZWxlbWVudCA9ICh1bm9ybTw4Pihjb2xvci5hKSA8PCA4KSB8ICh1bm9ybTwzPihjb2xvci5yKSA8PCA1KSB8ICh1bm9ybTwzPihjb2xvci5nKSA8PCAyKSB8ICh1bm9ybTwyPihjb2xvci5iKSA8PCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9YNFI0RzRCNDoKKwkJCSoodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQgPSAweEYwMDAgfCAodW5vcm08ND4oY29sb3IucikgPDwgOCkgfCAodW5vcm08ND4oY29sb3IuZykgPDwgNCkgfCAodW5vcm08ND4oY29sb3IuYikgPDwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTRSNEc0QjQ6CisJCQkqKHVuc2lnbmVkIHNob3J0KillbGVtZW50ID0gKHVub3JtPDQ+KGNvbG9yLmEpIDw8IDEyKSB8ICh1bm9ybTw0Pihjb2xvci5yKSA8PCA4KSB8ICh1bm9ybTw0Pihjb2xvci5nKSA8PCA0KSB8ICh1bm9ybTw0Pihjb2xvci5iKSA8PCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9SNUc2QjU6CisJCQkqKHVuc2lnbmVkIHNob3J0KillbGVtZW50ID0gKHVub3JtPDU+KGNvbG9yLnIpIDw8IDExKSB8ICh1bm9ybTw2Pihjb2xvci5nKSA8PCA1KSB8ICh1bm9ybTw1Pihjb2xvci5iKSA8PCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BMVI1RzVCNToKKwkJCSoodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQgPSAodW5vcm08MT4oY29sb3IuYSkgPDwgMTUpIHwgKHVub3JtPDU+KGNvbG9yLnIpIDw8IDEwKSB8ICh1bm9ybTw1Pihjb2xvci5nKSA8PCA1KSB8ICh1bm9ybTw1Pihjb2xvci5iKSA8PCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9YMVI1RzVCNToKKwkJCSoodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQgPSAweDgwMDAgfCAodW5vcm08NT4oY29sb3IucikgPDwgMTApIHwgKHVub3JtPDU+KGNvbG9yLmcpIDw8IDUpIHwgKHVub3JtPDU+KGNvbG9yLmIpIDw8IDApOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQkJKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQgPSAodW5vcm08OD4oY29sb3IuYSkgPDwgMjQpIHwgKHVub3JtPDg+KGNvbG9yLnIpIDw8IDE2KSB8ICh1bm9ybTw4Pihjb2xvci5nKSA8PCA4KSB8ICh1bm9ybTw4Pihjb2xvci5iKSA8PCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJCSoodW5zaWduZWQgaW50KillbGVtZW50ID0gMHhGRjAwMDAwMCB8ICh1bm9ybTw4Pihjb2xvci5yKSA8PCAxNikgfCAodW5vcm08OD4oY29sb3IuZykgPDwgOCkgfCAodW5vcm08OD4oY29sb3IuYikgPDwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQThCOEc4Ujg6CisJCQkqKHVuc2lnbmVkIGludCopZWxlbWVudCA9ICh1bm9ybTw4Pihjb2xvci5hKSA8PCAyNCkgfCAodW5vcm08OD4oY29sb3IuYikgPDwgMTYpIHwgKHVub3JtPDg+KGNvbG9yLmcpIDw8IDgpIHwgKHVub3JtPDg+KGNvbG9yLnIpIDw8IDApOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1g4QjhHOFI4OgorCQkJKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQgPSAweEZGMDAwMDAwIHwgKHVub3JtPDg+KGNvbG9yLmIpIDw8IDE2KSB8ICh1bm9ybTw4Pihjb2xvci5nKSA8PCA4KSB8ICh1bm9ybTw4Pihjb2xvci5yKSA8PCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BMlIxMEcxMEIxMDoKKwkJCSoodW5zaWduZWQgaW50KillbGVtZW50ID0gKHVub3JtPDI+KGNvbG9yLmEpIDw8IDMwKSB8ICh1bm9ybTwxMD4oY29sb3IucikgPDwgMjApIHwgKHVub3JtPDEwPihjb2xvci5nKSA8PCAxMCkgfCAodW5vcm08MTA+KGNvbG9yLmIpIDw8IDApOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0EyQjEwRzEwUjEwOgorCQkJKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQgPSAodW5vcm08Mj4oY29sb3IuYSkgPDwgMzApIHwgKHVub3JtPDEwPihjb2xvci5iKSA8PCAyMCkgfCAodW5vcm08MTA+KGNvbG9yLmcpIDw8IDEwKSB8ICh1bm9ybTwxMD4oY29sb3IucikgPDwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfRzhSODoKKwkJCSoodW5zaWduZWQgaW50KillbGVtZW50ID0gKHVub3JtPDg+KGNvbG9yLmcpIDw8IDgpIHwgKHVub3JtPDg+KGNvbG9yLnIpIDw8IDApOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0cxNlIxNjoKKwkJCSoodW5zaWduZWQgaW50KillbGVtZW50ID0gKHVub3JtPDE2Pihjb2xvci5nKSA8PCAxNikgfCAodW5vcm08MTY+KGNvbG9yLnIpIDw8IDApOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNjoKKwkJCSgodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQpWzBdID0gdW5vcm08MTY+KGNvbG9yLnIpOworCQkJKCh1bnNpZ25lZCBzaG9ydCopZWxlbWVudClbMV0gPSB1bm9ybTwxNj4oY29sb3IuZyk7CisJCQkoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVsyXSA9IHVub3JtPDE2Pihjb2xvci5iKTsKKwkJCSgodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQpWzNdID0gdW5vcm08MTY+KGNvbG9yLmEpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1Y4VTg6CisJCQkqKHVuc2lnbmVkIHNob3J0KillbGVtZW50ID0gKHNub3JtPDg+KGNvbG9yLmcpIDw8IDgpIHwgKHNub3JtPDg+KGNvbG9yLnIpIDw8IDApOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0w2VjVVNToKKwkJCSoodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQgPSAodW5vcm08Nj4oY29sb3IuYikgPDwgMTApIHwgKHNub3JtPDU+KGNvbG9yLmcpIDw8IDUpIHwgKHNub3JtPDU+KGNvbG9yLnIpIDw8IDApOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1E4VzhWOFU4OgorCQkJKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQgPSAoc25vcm08OD4oY29sb3IuYSkgPDwgMjQpIHwgKHNub3JtPDg+KGNvbG9yLmIpIDw8IDE2KSB8IChzbm9ybTw4Pihjb2xvci5nKSA8PCA4KSB8IChzbm9ybTw4Pihjb2xvci5yKSA8PCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9YOEw4VjhVODoKKwkJCSoodW5zaWduZWQgaW50KillbGVtZW50ID0gMHhGRjAwMDAwMCB8ICh1bm9ybTw4Pihjb2xvci5iKSA8PCAxNikgfCAoc25vcm08OD4oY29sb3IuZykgPDwgOCkgfCAoc25vcm08OD4oY29sb3IucikgPDwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfVjE2VTE2OgorCQkJKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQgPSAoc25vcm08MTY+KGNvbG9yLmcpIDw8IDE2KSB8IChzbm9ybTwxNj4oY29sb3IucikgPDwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTJXMTBWMTBVMTA6CisJCQkqKHVuc2lnbmVkIGludCopZWxlbWVudCA9ICh1bm9ybTwyPihjb2xvci5hKSA8PCAzMCkgfCAoc25vcm08MTA+KGNvbG9yLmIpIDw8IDIwKSB8IChzbm9ybTwxMD4oY29sb3IuZykgPDwgMTApIHwgKHNub3JtPDEwPihjb2xvci5yKSA8PCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BMTZXMTZWMTZVMTY6CisJCQkoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVswXSA9IHNub3JtPDE2Pihjb2xvci5yKTsKKwkJCSgodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQpWzFdID0gc25vcm08MTY+KGNvbG9yLmcpOworCQkJKCh1bnNpZ25lZCBzaG9ydCopZWxlbWVudClbMl0gPSBzbm9ybTwxNj4oY29sb3IuYik7CisJCQkoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVszXSA9IHVub3JtPDE2Pihjb2xvci5hKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9RMTZXMTZWMTZVMTY6CisJCQkoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVswXSA9IHNub3JtPDE2Pihjb2xvci5yKTsKKwkJCSgodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQpWzFdID0gc25vcm08MTY+KGNvbG9yLmcpOworCQkJKCh1bnNpZ25lZCBzaG9ydCopZWxlbWVudClbMl0gPSBzbm9ybTwxNj4oY29sb3IuYik7CisJCQkoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVszXSA9IHNub3JtPDE2Pihjb2xvci5hKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9SOEc4Qjg6CisJCQkoKHVuc2lnbmVkIGNoYXIqKWVsZW1lbnQpWzBdID0gdW5vcm08OD4oY29sb3IuYik7CisJCQkoKHVuc2lnbmVkIGNoYXIqKWVsZW1lbnQpWzFdID0gdW5vcm08OD4oY29sb3IuZyk7CisJCQkoKHVuc2lnbmVkIGNoYXIqKWVsZW1lbnQpWzJdID0gdW5vcm08OD4oY29sb3Iucik7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfUjE2RjoKKwkJCSooaGFsZiopZWxlbWVudCA9IChoYWxmKWNvbG9yLnI7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfRzE2UjE2RjoKKwkJCSgoaGFsZiopZWxlbWVudClbMF0gPSAoaGFsZiljb2xvci5yOworCQkJKChoYWxmKillbGVtZW50KVsxXSA9IChoYWxmKWNvbG9yLmc7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2RjoKKwkJCSgoaGFsZiopZWxlbWVudClbMF0gPSAoaGFsZiljb2xvci5yOworCQkJKChoYWxmKillbGVtZW50KVsxXSA9IChoYWxmKWNvbG9yLmc7CisJCQkoKGhhbGYqKWVsZW1lbnQpWzJdID0gKGhhbGYpY29sb3IuYjsKKwkJCSgoaGFsZiopZWxlbWVudClbM10gPSAoaGFsZiljb2xvci5hOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1IzMkY6CisJCQkqKGZsb2F0KillbGVtZW50ID0gY29sb3IucjsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9HMzJSMzJGOgorCQkJKChmbG9hdCopZWxlbWVudClbMF0gPSBjb2xvci5yOworCQkJKChmbG9hdCopZWxlbWVudClbMV0gPSBjb2xvci5nOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0EzMkIzMkczMlIzMkY6CisJCQkoKGZsb2F0KillbGVtZW50KVswXSA9IGNvbG9yLnI7CisJCQkoKGZsb2F0KillbGVtZW50KVsxXSA9IGNvbG9yLmc7CisJCQkoKGZsb2F0KillbGVtZW50KVsyXSA9IGNvbG9yLmI7CisJCQkoKGZsb2F0KillbGVtZW50KVszXSA9IGNvbG9yLmE7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfRDMyRjoKKwkJY2FzZSBGT1JNQVRfRDMyRl9MT0NLQUJMRToKKwkJY2FzZSBGT1JNQVRfRDMyRl9URVhUVVJFOgorCQljYXNlIEZPUk1BVF9EMzJGX1NIQURPVzoKKwkJCSooKGZsb2F0KillbGVtZW50KSA9IGNvbG9yLnI7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfRDMyRl9DT01QTEVNRU5UQVJZOgorCQkJKigoZmxvYXQqKWVsZW1lbnQpID0gMSAtIGNvbG9yLnI7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfUzg6CisJCQkqKCh1bnNpZ25lZCBjaGFyKillbGVtZW50KSA9IHVub3JtPDg+KGNvbG9yLnIpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0w4OgorCQkJKih1bnNpZ25lZCBjaGFyKillbGVtZW50ID0gdW5vcm08OD4oY29sb3Iucik7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTRMNDoKKwkJCSoodW5zaWduZWQgY2hhciopZWxlbWVudCA9ICh1bm9ybTw0Pihjb2xvci5hKSA8PCA0KSB8ICh1bm9ybTw0Pihjb2xvci5yKSA8PCAwKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9MMTY6CisJCQkqKHVuc2lnbmVkIHNob3J0KillbGVtZW50ID0gdW5vcm08MTY+KGNvbG9yLnIpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0E4TDg6CisJCQkqKHVuc2lnbmVkIHNob3J0KillbGVtZW50ID0gKHVub3JtPDg+KGNvbG9yLmEpIDw8IDgpIHwgKHVub3JtPDg+KGNvbG9yLnIpIDw8IDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisJfQorCisJQ29sb3I8ZmxvYXQ+IFN1cmZhY2U6OkJ1ZmZlcjo6cmVhZChpbnQgeCwgaW50IHksIGludCB6KSBjb25zdAorCXsKKwkJdm9pZCAqZWxlbWVudCA9ICh1bnNpZ25lZCBjaGFyKilidWZmZXIgKyB4ICogYnl0ZXMgKyB5ICogcGl0Y2hCICsgeiAqIHNsaWNlQjsKKworCQlyZXR1cm4gcmVhZChlbGVtZW50KTsKKwl9CisKKwlDb2xvcjxmbG9hdD4gU3VyZmFjZTo6QnVmZmVyOjpyZWFkKGludCB4LCBpbnQgeSkgY29uc3QKKwl7CisJCXZvaWQgKmVsZW1lbnQgPSAodW5zaWduZWQgY2hhciopYnVmZmVyICsgeCAqIGJ5dGVzICsgeSAqIHBpdGNoQjsKKworCQlyZXR1cm4gcmVhZChlbGVtZW50KTsKKwl9CisKKwlpbmxpbmUgQ29sb3I8ZmxvYXQ+IFN1cmZhY2U6OkJ1ZmZlcjo6cmVhZCh2b2lkICplbGVtZW50KSBjb25zdAorCXsKKwkJZmxvYXQgciA9IDE7CisJCWZsb2F0IGcgPSAxOworCQlmbG9hdCBiID0gMTsKKwkJZmxvYXQgYSA9IDE7CisKKwkJc3dpdGNoKGZvcm1hdCkKKwkJeworCQljYXNlIEZPUk1BVF9QODoKKwkJCXsKKwkJCQlBU1NFUlQocGFsZXR0ZSk7CisKKwkJCQl1bnNpZ25lZCBpbnQgYWJnciA9IHBhbGV0dGVbKih1bnNpZ25lZCBjaGFyKillbGVtZW50XTsKKwkJCQkKKwkJCQlyID0gKGFiZ3IgJiAweDAwMDAwMEZGKSAqICgxLjBmIC8gMHgwMDAwMDBGRik7CisJCQkJZyA9IChhYmdyICYgMHgwMDAwRkYwMCkgKiAoMS4wZiAvIDB4MDAwMEZGMDApOworCQkJCWIgPSAoYWJnciAmIDB4MDBGRjAwMDApICogKDEuMGYgLyAweDAwRkYwMDAwKTsKKwkJCQlhID0gKGFiZ3IgJiAweEZGMDAwMDAwKSAqICgxLjBmIC8gMHhGRjAwMDAwMCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQThQODoKKwkJCXsKKwkJCQlBU1NFUlQocGFsZXR0ZSk7CisKKwkJCQl1bnNpZ25lZCBpbnQgYmdyID0gcGFsZXR0ZVsoKHVuc2lnbmVkIGNoYXIqKWVsZW1lbnQpWzBdXTsKKwkJCQkKKwkJCQlyID0gKGJnciAmIDB4MDAwMDAwRkYpICogKDEuMGYgLyAweDAwMDAwMEZGKTsKKwkJCQlnID0gKGJnciAmIDB4MDAwMEZGMDApICogKDEuMGYgLyAweDAwMDBGRjAwKTsKKwkJCQliID0gKGJnciAmIDB4MDBGRjAwMDApICogKDEuMGYgLyAweDAwRkYwMDAwKTsKKwkJCQlhID0gKCh1bnNpZ25lZCBjaGFyKillbGVtZW50KVsxXSAqICgxLjBmIC8gMHhGRik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTg6CisJCQlyID0gMDsKKwkJCWcgPSAwOworCQkJYiA9IDA7CisJCQlhID0gKih1bnNpZ25lZCBjaGFyKillbGVtZW50ICogKDEuMGYgLyAweEZGKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9SODoKKwkJCXIgPSAqKHVuc2lnbmVkIGNoYXIqKWVsZW1lbnQgKiAoMS4wZiAvIDB4RkYpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1IzRzNCMjoKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyIHJnYiA9ICoodW5zaWduZWQgY2hhciopZWxlbWVudDsKKwkJCQkKKwkJCQlyID0gKHJnYiAmIDB4RTApICogKDEuMGYgLyAweEUwKTsKKwkJCQlnID0gKHJnYiAmIDB4MUMpICogKDEuMGYgLyAweDFDKTsKKwkJCQliID0gKHJnYiAmIDB4MDMpICogKDEuMGYgLyAweDAzKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BOFIzRzNCMjoKKwkJCXsKKwkJCQl1bnNpZ25lZCBzaG9ydCBhcmdiID0gKih1bnNpZ25lZCBzaG9ydCopZWxlbWVudDsKKwkJCQkKKwkJCQlhID0gKGFyZ2IgJiAweEZGMDApICogKDEuMGYgLyAweEZGMDApOworCQkJCXIgPSAoYXJnYiAmIDB4MDBFMCkgKiAoMS4wZiAvIDB4MDBFMCk7CisJCQkJZyA9IChhcmdiICYgMHgwMDFDKSAqICgxLjBmIC8gMHgwMDFDKTsKKwkJCQliID0gKGFyZ2IgJiAweDAwMDMpICogKDEuMGYgLyAweDAwMDMpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1g0UjRHNEI0OgorCQkJeworCQkJCXVuc2lnbmVkIHNob3J0IHJnYiA9ICoodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQ7CisJCQkJCisJCQkJciA9IChyZ2IgJiAweDBGMDApICogKDEuMGYgLyAweDBGMDApOworCQkJCWcgPSAocmdiICYgMHgwMEYwKSAqICgxLjBmIC8gMHgwMEYwKTsKKwkJCQliID0gKHJnYiAmIDB4MDAwRikgKiAoMS4wZiAvIDB4MDAwRik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTRSNEc0QjQ6CisJCQl7CisJCQkJdW5zaWduZWQgc2hvcnQgYXJnYiA9ICoodW5zaWduZWQgc2hvcnQqKWVsZW1lbnQ7CisJCQkJCisJCQkJYSA9IChhcmdiICYgMHhGMDAwKSAqICgxLjBmIC8gMHhGMDAwKTsKKwkJCQlyID0gKGFyZ2IgJiAweDBGMDApICogKDEuMGYgLyAweDBGMDApOworCQkJCWcgPSAoYXJnYiAmIDB4MDBGMCkgKiAoMS4wZiAvIDB4MDBGMCk7CisJCQkJYiA9IChhcmdiICYgMHgwMDBGKSAqICgxLjBmIC8gMHgwMDBGKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9SNUc2QjU6CisJCQl7CisJCQkJdW5zaWduZWQgc2hvcnQgcmdiID0gKih1bnNpZ25lZCBzaG9ydCopZWxlbWVudDsKKwkJCQkKKwkJCQlyID0gKHJnYiAmIDB4RjgwMCkgKiAoMS4wZiAvIDB4RjgwMCk7CisJCQkJZyA9IChyZ2IgJiAweDA3RTApICogKDEuMGYgLyAweDA3RTApOworCQkJCWIgPSAocmdiICYgMHgwMDFGKSAqICgxLjBmIC8gMHgwMDFGKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BMVI1RzVCNToKKwkJCXsKKwkJCQl1bnNpZ25lZCBzaG9ydCBhcmdiID0gKih1bnNpZ25lZCBzaG9ydCopZWxlbWVudDsKKwkJCQkKKwkJCQlhID0gKGFyZ2IgJiAweDgwMDApICogKDEuMGYgLyAweDgwMDApOworCQkJCXIgPSAoYXJnYiAmIDB4N0MwMCkgKiAoMS4wZiAvIDB4N0MwMCk7CisJCQkJZyA9IChhcmdiICYgMHgwM0UwKSAqICgxLjBmIC8gMHgwM0UwKTsKKwkJCQliID0gKGFyZ2IgJiAweDAwMUYpICogKDEuMGYgLyAweDAwMUYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1gxUjVHNUI1OgorCQkJeworCQkJCXVuc2lnbmVkIHNob3J0IHhyZ2IgPSAqKHVuc2lnbmVkIHNob3J0KillbGVtZW50OworCQkJCQorCQkJCXIgPSAoeHJnYiAmIDB4N0MwMCkgKiAoMS4wZiAvIDB4N0MwMCk7CisJCQkJZyA9ICh4cmdiICYgMHgwM0UwKSAqICgxLjBmIC8gMHgwM0UwKTsKKwkJCQliID0gKHhyZ2IgJiAweDAwMUYpICogKDEuMGYgLyAweDAwMUYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQkJeworCQkJCXVuc2lnbmVkIGludCBhcmdiID0gKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQ7CisJCQkJCisJCQkJYSA9IChhcmdiICYgMHhGRjAwMDAwMCkgKiAoMS4wZiAvIDB4RkYwMDAwMDApOworCQkJCXIgPSAoYXJnYiAmIDB4MDBGRjAwMDApICogKDEuMGYgLyAweDAwRkYwMDAwKTsKKwkJCQlnID0gKGFyZ2IgJiAweDAwMDBGRjAwKSAqICgxLjBmIC8gMHgwMDAwRkYwMCk7CisJCQkJYiA9IChhcmdiICYgMHgwMDAwMDBGRikgKiAoMS4wZiAvIDB4MDAwMDAwRkYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQkJeworCQkJCXVuc2lnbmVkIGludCB4cmdiID0gKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQ7CisJCQkJCisJCQkJciA9ICh4cmdiICYgMHgwMEZGMDAwMCkgKiAoMS4wZiAvIDB4MDBGRjAwMDApOworCQkJCWcgPSAoeHJnYiAmIDB4MDAwMEZGMDApICogKDEuMGYgLyAweDAwMDBGRjAwKTsKKwkJCQliID0gKHhyZ2IgJiAweDAwMDAwMEZGKSAqICgxLjBmIC8gMHgwMDAwMDBGRik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQThCOEc4Ujg6CisJCQl7CisJCQkJdW5zaWduZWQgaW50IGFiZ3IgPSAqKHVuc2lnbmVkIGludCopZWxlbWVudDsKKwkJCQkKKwkJCQlhID0gKGFiZ3IgJiAweEZGMDAwMDAwKSAqICgxLjBmIC8gMHhGRjAwMDAwMCk7CisJCQkJYiA9IChhYmdyICYgMHgwMEZGMDAwMCkgKiAoMS4wZiAvIDB4MDBGRjAwMDApOworCQkJCWcgPSAoYWJnciAmIDB4MDAwMEZGMDApICogKDEuMGYgLyAweDAwMDBGRjAwKTsKKwkJCQlyID0gKGFiZ3IgJiAweDAwMDAwMEZGKSAqICgxLjBmIC8gMHgwMDAwMDBGRik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfWDhCOEc4Ujg6CisJCQl7CisJCQkJdW5zaWduZWQgaW50IHhiZ3IgPSAqKHVuc2lnbmVkIGludCopZWxlbWVudDsKKwkJCQkKKwkJCQliID0gKHhiZ3IgJiAweDAwRkYwMDAwKSAqICgxLjBmIC8gMHgwMEZGMDAwMCk7CisJCQkJZyA9ICh4YmdyICYgMHgwMDAwRkYwMCkgKiAoMS4wZiAvIDB4MDAwMEZGMDApOworCQkJCXIgPSAoeGJnciAmIDB4MDAwMDAwRkYpICogKDEuMGYgLyAweDAwMDAwMEZGKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9HOFI4OgorCQkJeworCQkJCXVuc2lnbmVkIHNob3J0IGdyID0gKih1bnNpZ25lZCBzaG9ydCopZWxlbWVudDsKKwkJCQkKKwkJCQlnID0gKGdyICYgMHhGRjAwKSAqICgxLjBmIC8gMHhGRjAwKTsKKwkJCQlyID0gKGdyICYgMHgwMEZGKSAqICgxLjBmIC8gMHgwMEZGKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCQl7CisJCQkJdW5zaWduZWQgaW50IGdyID0gKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQ7CisJCQkJCisJCQkJZyA9IChnciAmIDB4RkZGRjAwMDApICogKDEuMGYgLyAweEZGRkYwMDAwKTsKKwkJCQlyID0gKGdyICYgMHgwMDAwRkZGRikgKiAoMS4wZiAvIDB4MDAwMEZGRkYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0EyUjEwRzEwQjEwOgorCQkJeworCQkJCXVuc2lnbmVkIGludCBhcmdiID0gKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQ7CisJCQkJCisJCQkJYSA9IChhcmdiICYgMHhDMDAwMDAwMCkgKiAoMS4wZiAvIDB4QzAwMDAwMDApOworCQkJCXIgPSAoYXJnYiAmIDB4M0ZGMDAwMDApICogKDEuMGYgLyAweDNGRjAwMDAwKTsKKwkJCQlnID0gKGFyZ2IgJiAweDAwMEZGQzAwKSAqICgxLjBmIC8gMHgwMDBGRkMwMCk7CisJCQkJYiA9IChhcmdiICYgMHgwMDAwMDNGRikgKiAoMS4wZiAvIDB4MDAwMDAzRkYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0EyQjEwRzEwUjEwOgorCQkJeworCQkJCXVuc2lnbmVkIGludCBhYmdyID0gKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQ7CisJCQkJCisJCQkJYSA9IChhYmdyICYgMHhDMDAwMDAwMCkgKiAoMS4wZiAvIDB4QzAwMDAwMDApOworCQkJCWIgPSAoYWJnciAmIDB4M0ZGMDAwMDApICogKDEuMGYgLyAweDNGRjAwMDAwKTsKKwkJCQlnID0gKGFiZ3IgJiAweDAwMEZGQzAwKSAqICgxLjBmIC8gMHgwMDBGRkMwMCk7CisJCQkJciA9IChhYmdyICYgMHgwMDAwMDNGRikgKiAoMS4wZiAvIDB4MDAwMDAzRkYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNjoKKwkJCXIgPSAoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVswXSAqICgxLjBmIC8gMHhGRkZGKTsKKwkJCWcgPSAoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVsxXSAqICgxLjBmIC8gMHhGRkZGKTsKKwkJCWIgPSAoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVsyXSAqICgxLjBmIC8gMHhGRkZGKTsKKwkJCWEgPSAoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVszXSAqICgxLjBmIC8gMHhGRkZGKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9WOFU4OgorCQkJeworCQkJCXVuc2lnbmVkIHNob3J0IHZ1ID0gKih1bnNpZ25lZCBzaG9ydCopZWxlbWVudDsKKworCQkJCXIgPSAoKGludCkodnUgJiAweDAwRkYpIDw8IDI0KSAqICgxLjBmIC8gMHg3RjAwMDAwMCk7CisJCQkJZyA9ICgoaW50KSh2dSAmIDB4RkYwMCkgPDwgMTYpICogKDEuMGYgLyAweDdGMDAwMDAwKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9MNlY1VTU6CisJCQl7CisJCQkJdW5zaWduZWQgc2hvcnQgbHZ1ID0gKih1bnNpZ25lZCBzaG9ydCopZWxlbWVudDsKKwkJCQkKKwkJCQlyID0gKChpbnQpKGx2dSAmIDB4MDAxRikgPDwgMjcpICogKDEuMGYgLyAweDc4MDAwMDAwKTsKKwkJCQlnID0gKChpbnQpKGx2dSAmIDB4MDNFMCkgPDwgMjIpICogKDEuMGYgLyAweDc4MDAwMDAwKTsKKwkJCQliID0gKGx2dSAmIDB4RkMwMCkgKiAoMS4wZiAvIDB4RkMwMCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfUThXOFY4VTg6CisJCQl7CisJCQkJdW5zaWduZWQgaW50IHF3dnUgPSAqKHVuc2lnbmVkIGludCopZWxlbWVudDsKKwkJCQkKKwkJCQlyID0gKChpbnQpKHF3dnUgJiAweDAwMDAwMEZGKSA8PCAyNCkgKiAoMS4wZiAvIDB4N0YwMDAwMDApOworCQkJCWcgPSAoKGludCkocXd2dSAmIDB4MDAwMEZGMDApIDw8IDE2KSAqICgxLjBmIC8gMHg3RjAwMDAwMCk7CisJCQkJYiA9ICgoaW50KShxd3Z1ICYgMHgwMEZGMDAwMCkgPDwgOCkgICogKDEuMGYgLyAweDdGMDAwMDAwKTsKKwkJCQlhID0gKChpbnQpKHF3dnUgJiAweEZGMDAwMDAwKSA8PCAwKSAgKiAoMS4wZiAvIDB4N0YwMDAwMDApOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1g4TDhWOFU4OgorCQkJeworCQkJCXVuc2lnbmVkIGludCB4bHZ1ID0gKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQ7CisJCQkJCisJCQkJciA9ICgoaW50KSh4bHZ1ICYgMHgwMDAwMDBGRikgPDwgMjQpICogKDEuMGYgLyAweDdGMDAwMDAwKTsKKwkJCQlnID0gKChpbnQpKHhsdnUgJiAweDAwMDBGRjAwKSA8PCAxNikgKiAoMS4wZiAvIDB4N0YwMDAwMDApOworCQkJCWIgPSAoeGx2dSAmIDB4MDBGRjAwMDApICogKDEuMGYgLyAweDAwRkYwMDAwKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9SOEc4Qjg6CisJCQlyID0gKCh1bnNpZ25lZCBjaGFyKillbGVtZW50KVsyXSAqICgxLjBmIC8gMHhGRik7CisJCQlnID0gKCh1bnNpZ25lZCBjaGFyKillbGVtZW50KVsxXSAqICgxLjBmIC8gMHhGRik7CisJCQliID0gKCh1bnNpZ25lZCBjaGFyKillbGVtZW50KVswXSAqICgxLjBmIC8gMHhGRik7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfVjE2VTE2OgorCQkJeworCQkJCXVuc2lnbmVkIGludCB2dSA9ICoodW5zaWduZWQgaW50KillbGVtZW50OworCQkJCQorCQkJCXIgPSAoKGludCkodnUgJiAweDAwMDBGRkZGKSA8PCAxNikgKiAoMS4wZiAvIDB4N0ZGRjAwMDApOworCQkJCWcgPSAoKGludCkodnUgJiAweEZGRkYwMDAwKSA8PCAwKSAgKiAoMS4wZiAvIDB4N0ZGRjAwMDApOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0EyVzEwVjEwVTEwOgorCQkJeworCQkJCXVuc2lnbmVkIGludCBhd3Z1ID0gKih1bnNpZ25lZCBpbnQqKWVsZW1lbnQ7CisJCQkJCisJCQkJciA9ICgoaW50KShhd3Z1ICYgMHgwMDAwMDNGRikgPDwgMjIpICogKDEuMGYgLyAweDdGQzAwMDAwKTsKKwkJCQlnID0gKChpbnQpKGF3dnUgJiAweDAwMEZGQzAwKSA8PCAxMikgKiAoMS4wZiAvIDB4N0ZDMDAwMDApOworCQkJCWIgPSAoKGludCkoYXd2dSAmIDB4M0ZGMDAwMDApIDw8IDIpICAqICgxLjBmIC8gMHg3RkMwMDAwMCk7CisJCQkJYSA9IChhd3Z1ICYgMHhDMDAwMDAwMCkgKiAoMS4wZiAvIDB4QzAwMDAwMDApOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0ExNlcxNlYxNlUxNjoKKwkJCXIgPSAoKHNpZ25lZCBzaG9ydCopZWxlbWVudClbMF0gKiAoMS4wZiAvIDB4N0ZGRik7CisJCQlnID0gKChzaWduZWQgc2hvcnQqKWVsZW1lbnQpWzFdICogKDEuMGYgLyAweDdGRkYpOworCQkJYiA9ICgoc2lnbmVkIHNob3J0KillbGVtZW50KVsyXSAqICgxLjBmIC8gMHg3RkZGKTsKKwkJCWEgPSAoKHVuc2lnbmVkIHNob3J0KillbGVtZW50KVszXSAqICgxLjBmIC8gMHhGRkZGKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9RMTZXMTZWMTZVMTY6CisJCQlyID0gKChzaWduZWQgc2hvcnQqKWVsZW1lbnQpWzBdICogKDEuMGYgLyAweDdGRkYpOworCQkJZyA9ICgoc2lnbmVkIHNob3J0KillbGVtZW50KVsxXSAqICgxLjBmIC8gMHg3RkZGKTsKKwkJCWIgPSAoKHNpZ25lZCBzaG9ydCopZWxlbWVudClbMl0gKiAoMS4wZiAvIDB4N0ZGRik7CisJCQlhID0gKChzaWduZWQgc2hvcnQqKWVsZW1lbnQpWzNdICogKDEuMGYgLyAweDdGRkYpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0w4OgorCQkJciA9CisJCQlnID0KKwkJCWIgPSAqKHVuc2lnbmVkIGNoYXIqKWVsZW1lbnQgKiAoMS4wZiAvIDB4RkYpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0E0TDQ6CisJCQl7CisJCQkJdW5zaWduZWQgY2hhciBhbCA9ICoodW5zaWduZWQgY2hhciopZWxlbWVudDsKKwkJCQkKKwkJCQlyID0KKwkJCQlnID0KKwkJCQliID0gKGFsICYgMHgwRikgKiAoMS4wZiAvIDB4MEYpOworCQkJCWEgPSAoYWwgJiAweEYwKSAqICgxLjBmIC8gMHhGMCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfTDE2OgorCQkJciA9CisJCQlnID0KKwkJCWIgPSAqKHVuc2lnbmVkIHNob3J0KillbGVtZW50ICogKDEuMGYgLyAweEZGRkYpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0E4TDg6CisJCQlyID0KKwkJCWcgPQorCQkJYiA9ICgodW5zaWduZWQgY2hhciopZWxlbWVudClbMF0gKiAoMS4wZiAvIDB4RkYpOworCQkJYSA9ICgodW5zaWduZWQgY2hhciopZWxlbWVudClbMV0gKiAoMS4wZiAvIDB4RkYpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1IxNkY6CisJCQlyID0gKihoYWxmKillbGVtZW50OworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0cxNlIxNkY6CisJCQlyID0gKChoYWxmKillbGVtZW50KVswXTsKKwkJCWcgPSAoKGhhbGYqKWVsZW1lbnQpWzFdOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNkY6CisJCQlyID0gKChoYWxmKillbGVtZW50KVswXTsKKwkJCWcgPSAoKGhhbGYqKWVsZW1lbnQpWzFdOworCQkJYiA9ICgoaGFsZiopZWxlbWVudClbMl07CisJCQlhID0gKChoYWxmKillbGVtZW50KVszXTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9SMzJGOgorCQkJciA9ICooZmxvYXQqKWVsZW1lbnQ7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfRzMyUjMyRjoKKwkJCXIgPSAoKGZsb2F0KillbGVtZW50KVswXTsKKwkJCWcgPSAoKGZsb2F0KillbGVtZW50KVsxXTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BMzJCMzJHMzJSMzJGOgorCQkJciA9ICgoZmxvYXQqKWVsZW1lbnQpWzBdOworCQkJZyA9ICgoZmxvYXQqKWVsZW1lbnQpWzFdOworCQkJYiA9ICgoZmxvYXQqKWVsZW1lbnQpWzJdOworCQkJYSA9ICgoZmxvYXQqKWVsZW1lbnQpWzNdOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0QzMkY6CisJCWNhc2UgRk9STUFUX0QzMkZfTE9DS0FCTEU6CisJCWNhc2UgRk9STUFUX0QzMkZfVEVYVFVSRToKKwkJY2FzZSBGT1JNQVRfRDMyRl9TSEFET1c6CisJCQlyID0gKihmbG9hdCopZWxlbWVudDsKKwkJCWcgPSByOworCQkJYiA9IHI7CisJCQlhID0gcjsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9EMzJGX0NPTVBMRU1FTlRBUlk6CisJCQlyID0gMSAtICooZmxvYXQqKWVsZW1lbnQ7CisJCQlnID0gcjsKKwkJCWIgPSByOworCQkJYSA9IHI7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfUzg6CisJCQlyID0gKih1bnNpZ25lZCBjaGFyKillbGVtZW50ICogKDEuMGYgLyAweEZGKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJLy8JaWYoc1JHQikKKwkvLwl7CisJLy8JCXIgPSBzUkdCdG9MaW5lYXIocik7CisJLy8JCWcgPSBzUkdCdG9MaW5lYXIoZyk7CisJLy8JCWIgPSBzUkdCdG9MaW5lYXIoYik7CisJLy8JfQorCisJCXJldHVybiBDb2xvcjxmbG9hdD4ociwgZywgYiwgYSk7CisJfQorCisJQ29sb3I8ZmxvYXQ+IFN1cmZhY2U6OkJ1ZmZlcjo6c2FtcGxlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIGNvbnN0CisJeworCQl4IC09IDAuNWY7CisJCXkgLT0gMC41ZjsKKwkJeiAtPSAwLjVmOworCisJCWludCB4MCA9IGNsYW1wKChpbnQpeCwgMCwgd2lkdGggLSAxKTsKKwkJaW50IHgxID0gKHgwICsgMSA+PSB3aWR0aCkgPyB4MCA6IHgwICsgMTsKKworCQlpbnQgeTAgPSBjbGFtcCgoaW50KXksIDAsIGhlaWdodCAtIDEpOworCQlpbnQgeTEgPSAoeTAgKyAxID49IGhlaWdodCkgPyB5MCA6IHkwICsgMTsKKworCQlpbnQgejAgPSBjbGFtcCgoaW50KXosIDAsIGRlcHRoIC0gMSk7CisJCWludCB6MSA9ICh6MCArIDEgPj0gZGVwdGgpID8gejAgOiB6MCArIDE7CisKKwkJQ29sb3I8ZmxvYXQ+IGMwMDAgPSByZWFkKHgwLCB5MCwgejApOworCQlDb2xvcjxmbG9hdD4gYzEwMCA9IHJlYWQoeDEsIHkwLCB6MCk7CisJCUNvbG9yPGZsb2F0PiBjMDEwID0gcmVhZCh4MCwgeTEsIHowKTsKKwkJQ29sb3I8ZmxvYXQ+IGMxMTAgPSByZWFkKHgxLCB5MSwgejApOworCQlDb2xvcjxmbG9hdD4gYzAwMSA9IHJlYWQoeDAsIHkwLCB6MSk7CisJCUNvbG9yPGZsb2F0PiBjMTAxID0gcmVhZCh4MSwgeTAsIHoxKTsKKwkJQ29sb3I8ZmxvYXQ+IGMwMTEgPSByZWFkKHgwLCB5MSwgejEpOworCQlDb2xvcjxmbG9hdD4gYzExMSA9IHJlYWQoeDEsIHkxLCB6MSk7CisKKwkJZmxvYXQgZnggPSB4IC0geDA7CisJCWZsb2F0IGZ5ID0geSAtIHkwOworCQlmbG9hdCBmeiA9IHogLSB6MDsKKworCQljMDAwICo9ICgxIC0gZngpICogKDEgLSBmeSkgKiAoMSAtIGZ6KTsKKwkJYzEwMCAqPSBmeCAqICgxIC0gZnkpICogKDEgLSBmeik7CisJCWMwMTAgKj0gKDEgLSBmeCkgKiBmeSAqICgxIC0gZnopOworCQljMTEwICo9IGZ4ICogZnkgKiAoMSAtIGZ6KTsKKwkJYzAwMSAqPSAoMSAtIGZ4KSAqICgxIC0gZnkpICogZno7CisJCWMxMDEgKj0gZnggKiAoMSAtIGZ5KSAqIGZ6OworCQljMDExICo9ICgxIC0gZngpICogZnkgKiBmejsKKwkJYzExMSAqPSBmeCAqIGZ5ICogZno7CisKKwkJcmV0dXJuIGMwMDAgKyBjMTAwICsgYzAxMCArIGMxMTAgKyBjMDAxICsgYzEwMSArIGMwMTEgKyBjMTExOworCX0KKworCUNvbG9yPGZsb2F0PiBTdXJmYWNlOjpCdWZmZXI6OnNhbXBsZShmbG9hdCB4LCBmbG9hdCB5KSBjb25zdAorCXsKKwkJeCAtPSAwLjVmOworCQl5IC09IDAuNWY7CisKKwkJaW50IHgwID0gY2xhbXAoKGludCl4LCAwLCB3aWR0aCAtIDEpOworCQlpbnQgeDEgPSAoeDAgKyAxID49IHdpZHRoKSA/IHgwIDogeDAgKyAxOworCisJCWludCB5MCA9IGNsYW1wKChpbnQpeSwgMCwgaGVpZ2h0IC0gMSk7CisJCWludCB5MSA9ICh5MCArIDEgPj0gaGVpZ2h0KSA/IHkwIDogeTAgKyAxOworCisJCUNvbG9yPGZsb2F0PiBjMDAgPSByZWFkKHgwLCB5MCk7CisJCUNvbG9yPGZsb2F0PiBjMTAgPSByZWFkKHgxLCB5MCk7CisJCUNvbG9yPGZsb2F0PiBjMDEgPSByZWFkKHgwLCB5MSk7CisJCUNvbG9yPGZsb2F0PiBjMTEgPSByZWFkKHgxLCB5MSk7CisKKwkJZmxvYXQgZnggPSB4IC0geDA7CisJCWZsb2F0IGZ5ID0geSAtIHkwOworCisJCWMwMCAqPSAoMSAtIGZ4KSAqICgxIC0gZnkpOworCQljMTAgKj0gZnggKiAoMSAtIGZ5KTsKKwkJYzAxICo9ICgxIC0gZngpICogZnk7CisJCWMxMSAqPSBmeCAqIGZ5OworCisJCXJldHVybiBjMDAgKyBjMTAgKyBjMDEgKyBjMTE7CisJfQorCisJdm9pZCAqU3VyZmFjZTo6QnVmZmVyOjpsb2NrUmVjdChpbnQgbGVmdCwgaW50IHRvcCwgaW50IGZyb250LCBMb2NrIGxvY2spCisJeworCQl0aGlzLT5sb2NrID0gbG9jazsKKworCQlzd2l0Y2gobG9jaykKKwkJeworCQljYXNlIExPQ0tfVU5MT0NLRUQ6CisJCWNhc2UgTE9DS19SRUFET05MWToKKwkJCWJyZWFrOworCQljYXNlIExPQ0tfV1JJVEVPTkxZOgorCQljYXNlIExPQ0tfUkVBRFdSSVRFOgorCQljYXNlIExPQ0tfRElTQ0FSRDoKKwkJCWRpcnR5ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJI2lmIFMzVENfU1VQUE9SVAorCQljYXNlIEZPUk1BVF9EWFQxOgorCQljYXNlIEZPUk1BVF9BVEkxOgorCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKilidWZmZXIgKyA4ICogKGxlZnQgLyA0KSArICh0b3AgLyA0KSAqIHBpdGNoQiArIGZyb250ICogc2xpY2VCOworCQljYXNlIEZPUk1BVF9EWFQzOgorCQljYXNlIEZPUk1BVF9EWFQ1OgorCQljYXNlIEZPUk1BVF9BVEkyOgorCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKilidWZmZXIgKyAxNiAqIChsZWZ0IC8gNCkgKyAodG9wIC8gNCkgKiBwaXRjaEIgKyBmcm9udCAqIHNsaWNlQjsKKwkJI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlciArIGxlZnQgKiBieXRlcyArIHRvcCAqIHBpdGNoQiArIGZyb250ICogc2xpY2VCOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJdm9pZCBTdXJmYWNlOjpCdWZmZXI6OnVubG9ja1JlY3QoKQorCXsKKwkJbG9jayA9IExPQ0tfVU5MT0NLRUQ7CisJfQorCisJU3VyZmFjZTo6U3VyZmFjZShSZXNvdXJjZSAqdGV4dHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIEZvcm1hdCBmb3JtYXQsIGJvb2wgbG9ja2FibGUsIGJvb2wgcmVuZGVyVGFyZ2V0KSA6IGxvY2thYmxlKGxvY2thYmxlKSwgcmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCkKKwl7CisJCXJlc291cmNlID0gdGV4dHVyZSA/IHRleHR1cmUgOiBuZXcgUmVzb3VyY2UoMCk7CisJCWhhc1BhcmVudCA9IHRleHR1cmU7CisJCWRlcHRoID0gbWF4KDEsIGRlcHRoKTsKKworCQlleHRlcm5hbC5idWZmZXIgPSAwOworCQlleHRlcm5hbC53aWR0aCA9IHdpZHRoOworCQlleHRlcm5hbC5oZWlnaHQgPSBoZWlnaHQ7CisJCWV4dGVybmFsLmRlcHRoID0gZGVwdGg7CisJCWV4dGVybmFsLmZvcm1hdCA9IGZvcm1hdDsKKwkJZXh0ZXJuYWwuYnl0ZXMgPSBieXRlcyhleHRlcm5hbC5mb3JtYXQpOworCQlleHRlcm5hbC5waXRjaEIgPSBwaXRjaEIoZXh0ZXJuYWwud2lkdGgsIGV4dGVybmFsLmZvcm1hdCwgcmVuZGVyVGFyZ2V0ICYmICF0ZXh0dXJlKTsKKwkJZXh0ZXJuYWwucGl0Y2hQID0gcGl0Y2hQKGV4dGVybmFsLndpZHRoLCBleHRlcm5hbC5mb3JtYXQsIHJlbmRlclRhcmdldCAmJiAhdGV4dHVyZSk7CisJCWV4dGVybmFsLnNsaWNlQiA9IHNsaWNlQihleHRlcm5hbC53aWR0aCwgZXh0ZXJuYWwuaGVpZ2h0LCBleHRlcm5hbC5mb3JtYXQsIHJlbmRlclRhcmdldCAmJiAhdGV4dHVyZSk7CisJCWV4dGVybmFsLnNsaWNlUCA9IHNsaWNlUChleHRlcm5hbC53aWR0aCwgZXh0ZXJuYWwuaGVpZ2h0LCBleHRlcm5hbC5mb3JtYXQsIHJlbmRlclRhcmdldCAmJiAhdGV4dHVyZSk7CisJCWV4dGVybmFsLmxvY2sgPSBMT0NLX1VOTE9DS0VEOworCQlleHRlcm5hbC5kaXJ0eSA9IGZhbHNlOworCQlleHRlcm5hbC5wYWxldHRlVXNlZCA9IDA7CisKKwkJaW50ZXJuYWwuYnVmZmVyID0gMDsKKwkJaW50ZXJuYWwud2lkdGggPSB3aWR0aDsKKwkJaW50ZXJuYWwuaGVpZ2h0ID0gaGVpZ2h0OworCQlpbnRlcm5hbC5kZXB0aCA9IGRlcHRoOworCQlpbnRlcm5hbC5mb3JtYXQgPSBzZWxlY3RJbnRlcm5hbEZvcm1hdChmb3JtYXQpOworCQlpbnRlcm5hbC5ieXRlcyA9IGJ5dGVzKGludGVybmFsLmZvcm1hdCk7CisJCWludGVybmFsLnBpdGNoQiA9IHBpdGNoQihpbnRlcm5hbC53aWR0aCwgaW50ZXJuYWwuZm9ybWF0LCByZW5kZXJUYXJnZXQpOworCQlpbnRlcm5hbC5waXRjaFAgPSBwaXRjaFAoaW50ZXJuYWwud2lkdGgsIGludGVybmFsLmZvcm1hdCwgcmVuZGVyVGFyZ2V0KTsKKwkJaW50ZXJuYWwuc2xpY2VCID0gc2xpY2VCKGludGVybmFsLndpZHRoLCBpbnRlcm5hbC5oZWlnaHQsIGludGVybmFsLmZvcm1hdCwgcmVuZGVyVGFyZ2V0KTsKKwkJaW50ZXJuYWwuc2xpY2VQID0gc2xpY2VQKGludGVybmFsLndpZHRoLCBpbnRlcm5hbC5oZWlnaHQsIGludGVybmFsLmZvcm1hdCwgcmVuZGVyVGFyZ2V0KTsKKwkJaW50ZXJuYWwubG9jayA9IExPQ0tfVU5MT0NLRUQ7CisJCWludGVybmFsLmRpcnR5ID0gZmFsc2U7CisJCWludGVybmFsLnBhbGV0dGVVc2VkID0gMDsKKworCQlzdGVuY2lsLmJ1ZmZlciA9IDA7CisJCXN0ZW5jaWwud2lkdGggPSB3aWR0aDsKKwkJc3RlbmNpbC5oZWlnaHQgPSBoZWlnaHQ7CisJCXN0ZW5jaWwuZGVwdGggPSBkZXB0aDsKKwkJc3RlbmNpbC5mb3JtYXQgPSBGT1JNQVRfUzg7CisJCXN0ZW5jaWwuYnl0ZXMgPSBieXRlcyhzdGVuY2lsLmZvcm1hdCk7CisJCXN0ZW5jaWwucGl0Y2hCID0gcGl0Y2hCKHN0ZW5jaWwud2lkdGgsIHN0ZW5jaWwuZm9ybWF0LCByZW5kZXJUYXJnZXQpOworCQlzdGVuY2lsLnBpdGNoUCA9IHBpdGNoUChzdGVuY2lsLndpZHRoLCBzdGVuY2lsLmZvcm1hdCwgcmVuZGVyVGFyZ2V0KTsKKwkJc3RlbmNpbC5zbGljZUIgPSBzbGljZUIoc3RlbmNpbC53aWR0aCwgc3RlbmNpbC5oZWlnaHQsIHN0ZW5jaWwuZm9ybWF0LCByZW5kZXJUYXJnZXQpOworCQlzdGVuY2lsLnNsaWNlUCA9IHNsaWNlUChzdGVuY2lsLndpZHRoLCBzdGVuY2lsLmhlaWdodCwgc3RlbmNpbC5mb3JtYXQsIHJlbmRlclRhcmdldCk7CisJCXN0ZW5jaWwubG9jayA9IExPQ0tfVU5MT0NLRUQ7CisJCXN0ZW5jaWwuZGlydHkgPSBmYWxzZTsKKwkJc3RlbmNpbC5wYWxldHRlVXNlZCA9IDA7CisKKwkJZGlydHlNaXBtYXBzID0gdHJ1ZTsKKwl9CisKKwlTdXJmYWNlOjp+U3VyZmFjZSgpCisJeworCQlpZighaGFzUGFyZW50KQorCQl7CisJCQlyZXNvdXJjZS0+ZGVzdHJ1Y3QoKTsKKwkJfQorCisJCWRlYWxsb2NhdGUoZXh0ZXJuYWwuYnVmZmVyKTsKKworCQlpZihpbnRlcm5hbC5idWZmZXIgIT0gZXh0ZXJuYWwuYnVmZmVyKQorCQl7CisJCQlkZWFsbG9jYXRlKGludGVybmFsLmJ1ZmZlcik7CisJCX0KKworCQlkZWFsbG9jYXRlKHN0ZW5jaWwuYnVmZmVyKTsKKworCQlleHRlcm5hbC5idWZmZXIgPSAwOworCQlpbnRlcm5hbC5idWZmZXIgPSAwOworCQlzdGVuY2lsLmJ1ZmZlciA9IDA7CisJfQorCisJdm9pZCAqU3VyZmFjZTo6bG9ja0V4dGVybmFsKGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgZnJvbnQsIExvY2sgbG9jaywgQWNjZXNzb3IgY2xpZW50KQorCXsKKwkJcmVzb3VyY2UtPmxvY2soY2xpZW50KTsKKworCQlpZighZXh0ZXJuYWwuYnVmZmVyKQorCQl7CisJCQlpZihpbnRlcm5hbC5idWZmZXIgJiYgaWRlbnRpY2FsRm9ybWF0cygpKQorCQkJeworCQkJCWV4dGVybmFsLmJ1ZmZlciA9IGludGVybmFsLmJ1ZmZlcjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlleHRlcm5hbC5idWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcihleHRlcm5hbC53aWR0aCwgZXh0ZXJuYWwuaGVpZ2h0LCBleHRlcm5hbC5kZXB0aCwgZXh0ZXJuYWwuZm9ybWF0KTsKKwkJCX0KKwkJfQorCisJCWlmKGludGVybmFsLmRpcnR5KQorCQl7CisJCQlpZihsb2NrICE9IExPQ0tfRElTQ0FSRCkKKwkJCXsKKwkJCQl1cGRhdGUoZXh0ZXJuYWwsIGludGVybmFsKTsKKwkJCX0KKwkJfQorCisJCXN3aXRjaChsb2NrKQorCQl7CisJCWNhc2UgTE9DS19SRUFET05MWToKKwkJCWJyZWFrOworCQljYXNlIExPQ0tfV1JJVEVPTkxZOgorCQljYXNlIExPQ0tfUkVBRFdSSVRFOgorCQljYXNlIExPQ0tfRElTQ0FSRDoKKwkJCWRpcnR5TWlwbWFwcyA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gZXh0ZXJuYWwubG9ja1JlY3QobGVmdCwgdG9wLCBmcm9udCwgbG9jayk7CisJfQorCisJdm9pZCBTdXJmYWNlOjp1bmxvY2tFeHRlcm5hbCgpCisJeworCQlyZXNvdXJjZS0+dW5sb2NrKCk7CisKKwkJZXh0ZXJuYWwudW5sb2NrUmVjdCgpOworCX0KKworCXZvaWQgKlN1cmZhY2U6OmxvY2tJbnRlcm5hbChpbnQgbGVmdCwgaW50IHRvcCwgaW50IGZyb250LCBMb2NrIGxvY2ssIEFjY2Vzc29yIGNsaWVudCkKKwl7CisJCWlmKGxvY2sgIT0gTE9DS19VTkxPQ0tFRCkKKwkJeworCQkJcmVzb3VyY2UtPmxvY2soY2xpZW50KTsKKwkJfQorCisJCWlmKCFpbnRlcm5hbC5idWZmZXIpCisJCXsKKwkJCWlmKGV4dGVybmFsLmJ1ZmZlciAmJiBpZGVudGljYWxGb3JtYXRzKCkpCisJCQl7CisJCQkJaW50ZXJuYWwuYnVmZmVyID0gZXh0ZXJuYWwuYnVmZmVyOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWludGVybmFsLmJ1ZmZlciA9IGFsbG9jYXRlQnVmZmVyKGludGVybmFsLndpZHRoLCBpbnRlcm5hbC5oZWlnaHQsIGludGVybmFsLmRlcHRoLCBpbnRlcm5hbC5mb3JtYXQpOworCQkJfQorCQl9CisKKwkJLy8gRklYTUU6IFdIUUwgcmVxdWlyZXMgY29udmVyc2lvbiB0byBsb3dlciBleHRlcm5hbCBwcmVjaXNpb24gYW5kIGJhY2sKKwkJaWYobG9nUHJlY2lzaW9uID49IFdIUUwpCisJCXsKKwkJCWlmKGludGVybmFsLmRpcnR5ICYmIHJlbmRlclRhcmdldCAmJiBpbnRlcm5hbC5mb3JtYXQgIT0gZXh0ZXJuYWwuZm9ybWF0KQorCQkJeworCQkJCWlmKGxvY2sgIT0gTE9DS19ESVNDQVJEKQorCQkJCXsKKwkJCQkJc3dpdGNoKGV4dGVybmFsLmZvcm1hdCkKKwkJCQkJeworCQkJCQljYXNlIEZPUk1BVF9SM0czQjI6CisJCQkJCWNhc2UgRk9STUFUX0E4UjNHM0IyOgorCQkJCQljYXNlIEZPUk1BVF9BMVI1RzVCNToKKwkJCQkJY2FzZSBGT1JNQVRfQTJSMTBHMTBCMTA6CisJCQkJCWNhc2UgRk9STUFUX0EyQjEwRzEwUjEwOgorCQkJCQkJbG9ja0V4dGVybmFsKDAsIDAsIDAsIExPQ0tfUkVBRFdSSVRFLCBjbGllbnQpOworCQkJCQkJdW5sb2NrRXh0ZXJuYWwoKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJLy8gRGlmZmVyZW5jZSBwYXNzZXMgV0hRTAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZihleHRlcm5hbC5kaXJ0eSkKKwkJeworCQkJaWYobG9jayAhPSBMT0NLX0RJU0NBUkQpCisJCQl7CisJCQkJdXBkYXRlKGludGVybmFsLCBleHRlcm5hbCk7CisJCQl9CisJCX0KKworCQlpZihpc1BhbGV0dGUoZXh0ZXJuYWwuZm9ybWF0KSAmJiBpbnRlcm5hbC5wYWxldHRlVXNlZCAhPSBTdXJmYWNlOjpwYWxldHRlSUQpCisJCXsKKwkJCXVwZGF0ZShpbnRlcm5hbCwgZXh0ZXJuYWwpOworCQl9CisKKwkJc3dpdGNoKGxvY2spCisJCXsKKwkJY2FzZSBMT0NLX1VOTE9DS0VEOgorCQljYXNlIExPQ0tfUkVBRE9OTFk6CisJCQlicmVhazsKKwkJY2FzZSBMT0NLX1dSSVRFT05MWToKKwkJY2FzZSBMT0NLX1JFQURXUklURToKKwkJY2FzZSBMT0NLX0RJU0NBUkQ6CisJCQlkaXJ0eU1pcG1hcHMgPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJaWYobG9jayA9PSBMT0NLX1JFQURPTkxZICYmIGNsaWVudCA9PSBQVUJMSUMpCisJCXsKKwkJCXJlc29sdmUoKTsKKwkJfQorCisJCXJldHVybiBpbnRlcm5hbC5sb2NrUmVjdChsZWZ0LCB0b3AsIGZyb250LCBsb2NrKTsKKwl9CisKKwl2b2lkIFN1cmZhY2U6OnVubG9ja0ludGVybmFsKCkKKwl7CisJCXJlc291cmNlLT51bmxvY2soKTsKKworCQlpbnRlcm5hbC51bmxvY2tSZWN0KCk7CisJfQorCisJdm9pZCAqU3VyZmFjZTo6bG9ja1N0ZW5jaWwoaW50IGZyb250LCBBY2Nlc3NvciBjbGllbnQpCisJeworCQlyZXNvdXJjZS0+bG9jayhjbGllbnQpOworCisJCWlmKCFzdGVuY2lsLmJ1ZmZlcikKKwkJeworCQkJc3RlbmNpbC5idWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcihzdGVuY2lsLndpZHRoLCBzdGVuY2lsLmhlaWdodCwgc3RlbmNpbC5kZXB0aCwgc3RlbmNpbC5mb3JtYXQpOworCQl9CisKKwkJaWYoZXh0ZXJuYWwuZGlydHkpCisJCXsKKwkJCXVwZGF0ZShzdGVuY2lsLCBleHRlcm5hbCk7ICAgLy8gRklYTUU6IE9ubHkgd2hlbiBub3QgZGlzY2FyZGluZworCQl9CisKKwkJcmV0dXJuIHN0ZW5jaWwubG9ja1JlY3QoMCwgMCwgZnJvbnQsIExPQ0tfUkVBRFdSSVRFKTsgICAvLyBGSVhNRQorCX0KKworCXZvaWQgU3VyZmFjZTo6dW5sb2NrU3RlbmNpbCgpCisJeworCQlyZXNvdXJjZS0+dW5sb2NrKCk7CisKKwkJc3RlbmNpbC51bmxvY2tSZWN0KCk7CisJfQorCisJaW50IFN1cmZhY2U6OmJ5dGVzKEZvcm1hdCBmb3JtYXQpCisJeworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgRk9STUFUX05VTEw6CQkJCXJldHVybiAwOworCQljYXNlIEZPUk1BVF9QODoJCQkJCXJldHVybiAxOworCQljYXNlIEZPUk1BVF9BOFA4OgkJCQlyZXR1cm4gMjsKKwkJY2FzZSBGT1JNQVRfQTg6CQkJCQlyZXR1cm4gMTsKKwkJY2FzZSBGT1JNQVRfUjg6CQkJCQlyZXR1cm4gMTsKKwkJY2FzZSBGT1JNQVRfUjNHM0IyOgkJCQlyZXR1cm4gMTsKKwkJY2FzZSBGT1JNQVRfQThSM0czQjI6CQkJcmV0dXJuIDI7CisJCWNhc2UgRk9STUFUX1I1RzZCNToJCQkJcmV0dXJuIDI7CisJCWNhc2UgRk9STUFUX0ExUjVHNUI1OgkJCXJldHVybiAyOworCQljYXNlIEZPUk1BVF9YMVI1RzVCNToJCQlyZXR1cm4gMjsKKwkJY2FzZSBGT1JNQVRfWDRSNEc0QjQ6CQkJcmV0dXJuIDI7CisJCWNhc2UgRk9STUFUX0E0UjRHNEI0OgkJCXJldHVybiAyOworCQljYXNlIEZPUk1BVF9SOEc4Qjg6CQkJCXJldHVybiAzOworCQljYXNlIEZPUk1BVF9YOFI4RzhCODoJCQlyZXR1cm4gNDsKKwkvLwljYXNlIEZPUk1BVF9YOEc4UjhCOFE6CQkJcmV0dXJuIDQ7CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgkJCXJldHVybiA0OworCS8vCWNhc2UgRk9STUFUX0E4RzhSOEI4UToJCQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfWDhCOEc4Ujg6CQkJcmV0dXJuIDQ7CisJCWNhc2UgRk9STUFUX0E4QjhHOFI4OgkJCXJldHVybiA0OworCQljYXNlIEZPUk1BVF9BMlIxMEcxMEIxMDoJCXJldHVybiA0OworCQljYXNlIEZPUk1BVF9BMkIxMEcxMFIxMDoJCXJldHVybiA0OworCQljYXNlIEZPUk1BVF9HOFI4OgkJCQlyZXR1cm4gMjsKKwkJY2FzZSBGT1JNQVRfRzE2UjE2OgkJCQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2OgkJcmV0dXJuIDg7CisJCS8vIENvbXByZXNzZWQgZm9ybWF0cworCQkjaWYgUzNUQ19TVVBQT1JUCisJCWNhc2UgRk9STUFUX0RYVDE6CQkJCXJldHVybiAyOyAgIC8vIENvbHVtbiBvZiBmb3VyIHBpeGVscworCQljYXNlIEZPUk1BVF9EWFQzOgkJCQlyZXR1cm4gNDsgICAvLyBDb2x1bW4gb2YgZm91ciBwaXhlbHMKKwkJY2FzZSBGT1JNQVRfRFhUNToJCQkJcmV0dXJuIDQ7ICAgLy8gQ29sdW1uIG9mIGZvdXIgcGl4ZWxzCisJCWNhc2UgRk9STUFUX0FUSTE6CQkJCXJldHVybiAyOyAgIC8vIENvbHVtbiBvZiBmb3VyIHBpeGVscworCQljYXNlIEZPUk1BVF9BVEkyOgkJCQlyZXR1cm4gNDsgICAvLyBDb2x1bW4gb2YgZm91ciBwaXhlbHMKKwkJI2VuZGlmCisJCS8vIEJ1bXBtYXAgZm9ybWF0cworCQljYXNlIEZPUk1BVF9WOFU4OgkJCQlyZXR1cm4gMjsKKwkJY2FzZSBGT1JNQVRfTDZWNVU1OgkJCQlyZXR1cm4gMjsKKwkJY2FzZSBGT1JNQVRfUThXOFY4VTg6CQkJcmV0dXJuIDQ7CisJCWNhc2UgRk9STUFUX1g4TDhWOFU4OgkJCXJldHVybiA0OworCQljYXNlIEZPUk1BVF9BMlcxMFYxMFUxMDoJCXJldHVybiA0OworCQljYXNlIEZPUk1BVF9WMTZVMTY6CQkJCXJldHVybiA0OworCQljYXNlIEZPUk1BVF9BMTZXMTZWMTZVMTY6CQlyZXR1cm4gODsKKwkJY2FzZSBGT1JNQVRfUTE2VzE2VjE2VTE2OgkJcmV0dXJuIDg7CisJCS8vIEx1bWluYW5jZSBmb3JtYXRzCisJCWNhc2UgRk9STUFUX0w4OgkJCQkJcmV0dXJuIDE7CisJCWNhc2UgRk9STUFUX0E0TDQ6CQkJCXJldHVybiAxOworCQljYXNlIEZPUk1BVF9MMTY6CQkJCXJldHVybiAyOworCQljYXNlIEZPUk1BVF9BOEw4OgkJCQlyZXR1cm4gMjsKKwkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cworCQljYXNlIEZPUk1BVF9SMTZGOgkJCQlyZXR1cm4gMjsKKwkJY2FzZSBGT1JNQVRfRzE2UjE2RjoJCQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2RjoJCXJldHVybiA4OworCQljYXNlIEZPUk1BVF9SMzJGOgkJCQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfRzMyUjMyRjoJCQlyZXR1cm4gODsKKwkJY2FzZSBGT1JNQVRfQTMyQjMyRzMyUjMyRjoJCXJldHVybiAxNjsKKwkJLy8gRGVwdGgvc3RlbmNpbCBmb3JtYXRzCisJCWNhc2UgRk9STUFUX0QxNjoJCQkJcmV0dXJuIDI7CisJCWNhc2UgRk9STUFUX0QzMjoJCQkJcmV0dXJuIDQ7CisJCWNhc2UgRk9STUFUX0QyNFg4OgkJCQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfRDI0Uzg6CQkJCXJldHVybiA0OworCQljYXNlIEZPUk1BVF9EMjRGUzg6CQkJCXJldHVybiA0OworCQljYXNlIEZPUk1BVF9EMzJGOgkJCQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfRDMyRl9DT01QTEVNRU5UQVJZOglyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfRDMyRl9MT0NLQUJMRToJCXJldHVybiA0OworCQljYXNlIEZPUk1BVF9EMzJGX1RFWFRVUkU6CQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfRDMyRl9TSEFET1c6CQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfREYyNDoJCQkJcmV0dXJuIDQ7CisJCWNhc2UgRk9STUFUX0RGMTY6CQkJCXJldHVybiAyOworCQljYXNlIEZPUk1BVF9JTlRaOgkJCQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfUzg6CQkJCQlyZXR1cm4gMTsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpbnQgU3VyZmFjZTo6cGl0Y2hCKGludCB3aWR0aCwgRm9ybWF0IGZvcm1hdCwgYm9vbCB0YXJnZXQpCisJeworCQlpZih0YXJnZXQgfHwgaXNEZXB0aChmb3JtYXQpIHx8IGlzU3RlbmNpbChmb3JtYXQpKQorCQl7CisJCQl3aWR0aCA9ICgod2lkdGggKyAxKSAmIH4xKTsKKwkJfQorCisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJI2lmIFMzVENfU1VQUE9SVAorCQljYXNlIEZPUk1BVF9EWFQxOgorCQkJcmV0dXJuIDggKiAoKHdpZHRoICsgMykgLyA0KTsgICAgLy8gNjQgYml0IHBlciA0eDQgYmxvY2ssIGNvbXB1dGVkIHBlciA0IHJvd3MKKwkJY2FzZSBGT1JNQVRfRFhUMzoKKwkJY2FzZSBGT1JNQVRfRFhUNToKKwkJCXJldHVybiAxNiAqICgod2lkdGggKyAzKSAvIDQpOyAgIC8vIDEyOCBiaXQgcGVyIDR4NCBibG9jaywgY29tcHV0ZWQgcGVyIDQgcm93cworCQljYXNlIEZPUk1BVF9BVEkxOgorCQkJcmV0dXJuIDIgKiAoKHdpZHRoICsgMykgLyA0KTsgICAgLy8gNjQgYml0IHBlciA0eDQgYmxvY2ssIGNvbXB1dGVkIHBlciByb3cKKwkJY2FzZSBGT1JNQVRfQVRJMjoKKwkJCXJldHVybiA0ICogKCh3aWR0aCArIDMpIC8gNCk7ICAgIC8vIDEyOCBiaXQgcGVyIDR4NCBibG9jaywgY29tcHV0ZWQgcGVyIHJvdworCQkjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBieXRlcyhmb3JtYXQpICogd2lkdGg7CisJCX0KKwl9CisKKwlpbnQgU3VyZmFjZTo6cGl0Y2hQKGludCB3aWR0aCwgRm9ybWF0IGZvcm1hdCwgYm9vbCB0YXJnZXQpCisJeworCQlpbnQgQiA9IGJ5dGVzKGZvcm1hdCk7CisKKwkJcmV0dXJuIEIgPiAwID8gcGl0Y2hCKHdpZHRoLCBmb3JtYXQsIHRhcmdldCkgLyBCIDogMDsKKwl9CisKKwlpbnQgU3VyZmFjZTo6c2xpY2VCKGludCB3aWR0aCwgaW50IGhlaWdodCwgRm9ybWF0IGZvcm1hdCwgYm9vbCB0YXJnZXQpCisJeworCQlpZih0YXJnZXQgfHwgaXNEZXB0aChmb3JtYXQpIHx8IGlzU3RlbmNpbChmb3JtYXQpKQorCQl7CisJCQloZWlnaHQgPSAoKGhlaWdodCArIDEpICYgfjEpOworCQl9CisKKwkJc3dpdGNoKGZvcm1hdCkKKwkJeworCQkjaWYgUzNUQ19TVVBQT1JUCisJCWNhc2UgRk9STUFUX0RYVDE6CisJCWNhc2UgRk9STUFUX0RYVDM6CisJCWNhc2UgRk9STUFUX0RYVDU6CisJCQlyZXR1cm4gcGl0Y2hCKHdpZHRoLCBmb3JtYXQsIHRhcmdldCkgKiAoKGhlaWdodCArIDMpIC8gNCk7ICAgLy8gUGl0Y2ggY29tcHV0ZWQgcGVyIDQgcm93cworCQljYXNlIEZPUk1BVF9BVEkxOiAgIC8vIFBpdGNoIGNvbXB1dGVkIHBlciByb3cKKwkJY2FzZSBGT1JNQVRfQVRJMjogICAvLyBQaXRjaCBjb21wdXRlZCBwZXIgcm93CisJCSNlbmRpZgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIHBpdGNoQih3aWR0aCwgZm9ybWF0LCB0YXJnZXQpICogaGVpZ2h0OworCQl9CisJfQorCisJaW50IFN1cmZhY2U6OnNsaWNlUChpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZvcm1hdCBmb3JtYXQsIGJvb2wgdGFyZ2V0KQorCXsKKwkJaW50IEIgPSBieXRlcyhmb3JtYXQpOworCisJCXJldHVybiBCID4gMCA/IHNsaWNlQih3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHRhcmdldCkgLyBCIDogMDsKKwl9CisKKwl2b2lkIFN1cmZhY2U6OnVwZGF0ZShCdWZmZXIgJmRlc3RpbmF0aW9uLCBCdWZmZXIgJnNvdXJjZSkKKwl7CisJLy8JQVNTRVJUKHNvdXJjZS5sb2NrICE9IExPQ0tfVU5MT0NLRUQpOworCS8vCUFTU0VSVChkZXN0aW5hdGlvbi5sb2NrICE9IExPQ0tfVU5MT0NLRUQpOworCQkKKwkJaWYoZGVzdGluYXRpb24uYnVmZmVyICE9IHNvdXJjZS5idWZmZXIpCisJCXsKKwkJCUFTU0VSVChzb3VyY2UuZGlydHkgJiYgIWRlc3RpbmF0aW9uLmRpcnR5KTsKKworCQkJc3dpdGNoKHNvdXJjZS5mb3JtYXQpCisJCQl7CisJCQljYXNlIEZPUk1BVF9SOEc4Qjg6CQlkZWNvZGVSOEc4QjgoZGVzdGluYXRpb24sIHNvdXJjZSk7CQlicmVhazsgICAvLyBGSVhNRTogQ2hlY2sgZGVzdGluYXRpb24gZm9ybWF0CisJCQljYXNlIEZPUk1BVF9YOEI4RzhSODoJZGVjb2RlWDhCOEc4UjgoZGVzdGluYXRpb24sIHNvdXJjZSk7CWJyZWFrOyAgIC8vIEZJWE1FOiBDaGVjayBkZXN0aW5hdGlvbiBmb3JtYXQKKwkJCWNhc2UgRk9STUFUX0E4QjhHOFI4OglkZWNvZGVBOEI4RzhSOChkZXN0aW5hdGlvbiwgc291cmNlKTsJYnJlYWs7ICAgLy8gRklYTUU6IENoZWNrIGRlc3RpbmF0aW9uIGZvcm1hdAorCQkJY2FzZSBGT1JNQVRfUjVHNkI1OgkJZGVjb2RlUjVHNkI1KGRlc3RpbmF0aW9uLCBzb3VyY2UpOwkJYnJlYWs7ICAgLy8gRklYTUU6IENoZWNrIGRlc3RpbmF0aW9uIGZvcm1hdAorCQkJY2FzZSBGT1JNQVRfWDFSNUc1QjU6CWRlY29kZVgxUjVHNUI1KGRlc3RpbmF0aW9uLCBzb3VyY2UpOwlicmVhazsgICAvLyBGSVhNRTogQ2hlY2sgZGVzdGluYXRpb24gZm9ybWF0CisJCQljYXNlIEZPUk1BVF9BMVI1RzVCNToJZGVjb2RlQTFSNUc1QjUoZGVzdGluYXRpb24sIHNvdXJjZSk7CWJyZWFrOyAgIC8vIEZJWE1FOiBDaGVjayBkZXN0aW5hdGlvbiBmb3JtYXQKKwkJCWNhc2UgRk9STUFUX1g0UjRHNEI0OglkZWNvZGVYNFI0RzRCNChkZXN0aW5hdGlvbiwgc291cmNlKTsJYnJlYWs7ICAgLy8gRklYTUU6IENoZWNrIGRlc3RpbmF0aW9uIGZvcm1hdAorCQkJY2FzZSBGT1JNQVRfQTRSNEc0QjQ6CWRlY29kZUE0UjRHNEI0KGRlc3RpbmF0aW9uLCBzb3VyY2UpOwlicmVhazsgICAvLyBGSVhNRTogQ2hlY2sgZGVzdGluYXRpb24gZm9ybWF0CisJCQljYXNlIEZPUk1BVF9QODoJCQlkZWNvZGVQOChkZXN0aW5hdGlvbiwgc291cmNlKTsJCQlicmVhazsgICAvLyBGSVhNRTogQ2hlY2sgZGVzdGluYXRpb24gZm9ybWF0CisJCQkjaWYgUzNUQ19TVVBQT1JUCisJCQljYXNlIEZPUk1BVF9EWFQxOgkJZGVjb2RlRFhUMShkZXN0aW5hdGlvbiwgc291cmNlKTsJCWJyZWFrOyAgIC8vIEZJWE1FOiBDaGVjayBkZXN0aW5hdGlvbiBmb3JtYXQKKwkJCWNhc2UgRk9STUFUX0RYVDM6CQlkZWNvZGVEWFQzKGRlc3RpbmF0aW9uLCBzb3VyY2UpOwkJYnJlYWs7ICAgLy8gRklYTUU6IENoZWNrIGRlc3RpbmF0aW9uIGZvcm1hdAorCQkJY2FzZSBGT1JNQVRfRFhUNToJCWRlY29kZURYVDUoZGVzdGluYXRpb24sIHNvdXJjZSk7CQlicmVhazsgICAvLyBGSVhNRTogQ2hlY2sgZGVzdGluYXRpb24gZm9ybWF0CisJCQljYXNlIEZPUk1BVF9BVEkxOgkJZGVjb2RlQVRJMShkZXN0aW5hdGlvbiwgc291cmNlKTsJCWJyZWFrOyAgIC8vIEZJWE1FOiBDaGVjayBkZXN0aW5hdGlvbiBmb3JtYXQKKwkJCWNhc2UgRk9STUFUX0FUSTI6CQlkZWNvZGVBVEkyKGRlc3RpbmF0aW9uLCBzb3VyY2UpOwkJYnJlYWs7ICAgLy8gRklYTUU6IENoZWNrIGRlc3RpbmF0aW9uIGZvcm1hdAorCQkJI2VuZGlmCisJCQlkZWZhdWx0OgkJCQlnZW5lcmljVXBkYXRlKGRlc3RpbmF0aW9uLCBzb3VyY2UpOwkJYnJlYWs7CisJCQl9CisJCX0KKworCQlzb3VyY2UuZGlydHkgPSBmYWxzZTsKKwkJZGVzdGluYXRpb24ucGFsZXR0ZVVzZWQgPSBTdXJmYWNlOjpwYWxldHRlSUQ7CisJfQorCisJdm9pZCBTdXJmYWNlOjpnZW5lcmljVXBkYXRlKEJ1ZmZlciAmZGVzdGluYXRpb24sIEJ1ZmZlciAmc291cmNlKQorCXsKKwkJdW5zaWduZWQgY2hhciAqc291cmNlU2xpY2UgPSAodW5zaWduZWQgY2hhciopc291cmNlLmJ1ZmZlcjsKKwkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25TbGljZSA9ICh1bnNpZ25lZCBjaGFyKilkZXN0aW5hdGlvbi5idWZmZXI7CisKKwkJaW50IGRlcHRoID0gbWluKGRlc3RpbmF0aW9uLmRlcHRoLCBzb3VyY2UuZGVwdGgpOworCQlpbnQgaGVpZ2h0ID0gbWluKGRlc3RpbmF0aW9uLmhlaWdodCwgc291cmNlLmhlaWdodCk7CisJCWludCB3aWR0aCA9IG1pbihkZXN0aW5hdGlvbi53aWR0aCwgc291cmNlLndpZHRoKTsKKwkJaW50IHJvd0J5dGVzID0gd2lkdGggKiBzb3VyY2UuYnl0ZXM7CisKKwkJZm9yKGludCB6ID0gMDsgeiA8IGRlcHRoOyB6KyspCisJCXsKKwkJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZVJvdyA9IHNvdXJjZVNsaWNlOworCQkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25Sb3cgPSBkZXN0aW5hdGlvblNsaWNlOworCisJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQl7CisJCQkJaWYoc291cmNlLmZvcm1hdCA9PSBkZXN0aW5hdGlvbi5mb3JtYXQpCisJCQkJeworCQkJCQltZW1jcHkoZGVzdGluYXRpb25Sb3csIHNvdXJjZVJvdywgcm93Qnl0ZXMpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VFbGVtZW50ID0gc291cmNlUm93OworCQkJCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvbkVsZW1lbnQgPSBkZXN0aW5hdGlvblJvdzsKKworCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkJCQkJeworCQkJCQkJQ29sb3I8ZmxvYXQ+IGNvbG9yID0gc291cmNlLnJlYWQoc291cmNlRWxlbWVudCk7CisJCQkJCQlkZXN0aW5hdGlvbi53cml0ZShkZXN0aW5hdGlvbkVsZW1lbnQsIGNvbG9yKTsKKworCQkJCQkJc291cmNlRWxlbWVudCArPSBzb3VyY2UuYnl0ZXM7CisJCQkJCQlkZXN0aW5hdGlvbkVsZW1lbnQgKz0gZGVzdGluYXRpb24uYnl0ZXM7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlzb3VyY2VSb3cgKz0gc291cmNlLnBpdGNoQjsKKwkJCQlkZXN0aW5hdGlvblJvdyArPSBkZXN0aW5hdGlvbi5waXRjaEI7CisJCQl9CisKKwkJCXNvdXJjZVNsaWNlICs9IHNvdXJjZS5zbGljZUI7CisJCQlkZXN0aW5hdGlvblNsaWNlICs9IGRlc3RpbmF0aW9uLnNsaWNlQjsKKwkJfQorCX0KKworCXZvaWQgU3VyZmFjZTo6ZGVjb2RlUjhHOEI4KEJ1ZmZlciAmZGVzdGluYXRpb24sIGNvbnN0IEJ1ZmZlciAmc291cmNlKQorCXsKKwkJdW5zaWduZWQgY2hhciAqc291cmNlU2xpY2UgPSAodW5zaWduZWQgY2hhciopc291cmNlLmJ1ZmZlcjsKKwkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25TbGljZSA9ICh1bnNpZ25lZCBjaGFyKilkZXN0aW5hdGlvbi5idWZmZXI7CisKKwkJZm9yKGludCB6ID0gMDsgeiA8IGRlc3RpbmF0aW9uLmRlcHRoICYmIHogPCBzb3VyY2UuZGVwdGg7IHorKykKKwkJeworCQkJdW5zaWduZWQgY2hhciAqc291cmNlUm93ID0gc291cmNlU2xpY2U7CisJCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvblJvdyA9IGRlc3RpbmF0aW9uU2xpY2U7CisKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBkZXN0aW5hdGlvbi5oZWlnaHQgJiYgeSA8IHNvdXJjZS5oZWlnaHQ7IHkrKykKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VFbGVtZW50ID0gc291cmNlUm93OworCQkJCXVuc2lnbmVkIGNoYXIgKmRlc3RpbmF0aW9uRWxlbWVudCA9IGRlc3RpbmF0aW9uUm93OworCisJCQkJZm9yKGludCB4ID0gMDsgeCA8IGRlc3RpbmF0aW9uLndpZHRoICYmIHggPCBzb3VyY2Uud2lkdGg7IHgrKykKKwkJCQl7CisJCQkJCXVuc2lnbmVkIGludCBiID0gc291cmNlRWxlbWVudFswXTsKKwkJCQkJdW5zaWduZWQgaW50IGcgPSBzb3VyY2VFbGVtZW50WzFdOworCQkJCQl1bnNpZ25lZCBpbnQgciA9IHNvdXJjZUVsZW1lbnRbMl07CisKKwkJCQkJKih1bnNpZ25lZCBpbnQqKWRlc3RpbmF0aW9uRWxlbWVudCA9IDB4RkYwMDAwMDAgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IChiIDw8IDApOworCisJCQkJCXNvdXJjZUVsZW1lbnQgKz0gc291cmNlLmJ5dGVzOworCQkJCQlkZXN0aW5hdGlvbkVsZW1lbnQgKz0gZGVzdGluYXRpb24uYnl0ZXM7CisJCQkJfQorCisJCQkJc291cmNlUm93ICs9IHNvdXJjZS5waXRjaEI7CisJCQkJZGVzdGluYXRpb25Sb3cgKz0gZGVzdGluYXRpb24ucGl0Y2hCOworCQkJfQorCisJCQlzb3VyY2VTbGljZSArPSBzb3VyY2Uuc2xpY2VCOworCQkJZGVzdGluYXRpb25TbGljZSArPSBkZXN0aW5hdGlvbi5zbGljZUI7CisJCX0KKwl9CisKKwl2b2lkIFN1cmZhY2U6OmRlY29kZVg4QjhHOFI4KEJ1ZmZlciAmZGVzdGluYXRpb24sIGNvbnN0IEJ1ZmZlciAmc291cmNlKQorCXsKKwkJdW5zaWduZWQgY2hhciAqc291cmNlU2xpY2UgPSAodW5zaWduZWQgY2hhciopc291cmNlLmJ1ZmZlcjsKKwkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25TbGljZSA9ICh1bnNpZ25lZCBjaGFyKilkZXN0aW5hdGlvbi5idWZmZXI7CisKKwkJZm9yKGludCB6ID0gMDsgeiA8IGRlc3RpbmF0aW9uLmRlcHRoICYmIHogPCBzb3VyY2UuZGVwdGg7IHorKykKKwkJeworCQkJdW5zaWduZWQgY2hhciAqc291cmNlUm93ID0gc291cmNlU2xpY2U7CisJCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvblJvdyA9IGRlc3RpbmF0aW9uU2xpY2U7CisKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBkZXN0aW5hdGlvbi5oZWlnaHQgJiYgeSA8IHNvdXJjZS5oZWlnaHQ7IHkrKykKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VFbGVtZW50ID0gc291cmNlUm93OworCQkJCXVuc2lnbmVkIGNoYXIgKmRlc3RpbmF0aW9uRWxlbWVudCA9IGRlc3RpbmF0aW9uUm93OworCisJCQkJZm9yKGludCB4ID0gMDsgeCA8IGRlc3RpbmF0aW9uLndpZHRoICYmIHggPCBzb3VyY2Uud2lkdGg7IHgrKykKKwkJCQl7CisJCQkJCXVuc2lnbmVkIGludCByID0gc291cmNlRWxlbWVudFswXTsKKwkJCQkJdW5zaWduZWQgaW50IGcgPSBzb3VyY2VFbGVtZW50WzFdOworCQkJCQl1bnNpZ25lZCBpbnQgYiA9IHNvdXJjZUVsZW1lbnRbMl07CisKKwkJCQkJKih1bnNpZ25lZCBpbnQqKWRlc3RpbmF0aW9uRWxlbWVudCA9IDB4RkYwMDAwMDAgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IChiIDw8IDApOworCisJCQkJCXNvdXJjZUVsZW1lbnQgKz0gc291cmNlLmJ5dGVzOworCQkJCQlkZXN0aW5hdGlvbkVsZW1lbnQgKz0gZGVzdGluYXRpb24uYnl0ZXM7CisJCQkJfQorCisJCQkJc291cmNlUm93ICs9IHNvdXJjZS5waXRjaEI7CisJCQkJZGVzdGluYXRpb25Sb3cgKz0gZGVzdGluYXRpb24ucGl0Y2hCOworCQkJfQorCisJCQlzb3VyY2VTbGljZSArPSBzb3VyY2Uuc2xpY2VCOworCQkJZGVzdGluYXRpb25TbGljZSArPSBkZXN0aW5hdGlvbi5zbGljZUI7CisJCX0KKwl9CisKKwl2b2lkIFN1cmZhY2U6OmRlY29kZUE4QjhHOFI4KEJ1ZmZlciAmZGVzdGluYXRpb24sIGNvbnN0IEJ1ZmZlciAmc291cmNlKQorCXsKKwkJdW5zaWduZWQgY2hhciAqc291cmNlU2xpY2UgPSAodW5zaWduZWQgY2hhciopc291cmNlLmJ1ZmZlcjsKKwkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25TbGljZSA9ICh1bnNpZ25lZCBjaGFyKilkZXN0aW5hdGlvbi5idWZmZXI7CisKKwkJZm9yKGludCB6ID0gMDsgeiA8IGRlc3RpbmF0aW9uLmRlcHRoICYmIHogPCBzb3VyY2UuZGVwdGg7IHorKykKKwkJeworCQkJdW5zaWduZWQgY2hhciAqc291cmNlUm93ID0gc291cmNlU2xpY2U7CisJCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvblJvdyA9IGRlc3RpbmF0aW9uU2xpY2U7CisKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBkZXN0aW5hdGlvbi5oZWlnaHQgJiYgeSA8IHNvdXJjZS5oZWlnaHQ7IHkrKykKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VFbGVtZW50ID0gc291cmNlUm93OworCQkJCXVuc2lnbmVkIGNoYXIgKmRlc3RpbmF0aW9uRWxlbWVudCA9IGRlc3RpbmF0aW9uUm93OworCisJCQkJZm9yKGludCB4ID0gMDsgeCA8IGRlc3RpbmF0aW9uLndpZHRoICYmIHggPCBzb3VyY2Uud2lkdGg7IHgrKykKKwkJCQl7CisJCQkJCXVuc2lnbmVkIGludCByID0gc291cmNlRWxlbWVudFswXTsKKwkJCQkJdW5zaWduZWQgaW50IGcgPSBzb3VyY2VFbGVtZW50WzFdOworCQkJCQl1bnNpZ25lZCBpbnQgYiA9IHNvdXJjZUVsZW1lbnRbMl07CisJCQkJCXVuc2lnbmVkIGludCBhID0gc291cmNlRWxlbWVudFszXTsKKworCQkJCQkqKHVuc2lnbmVkIGludCopZGVzdGluYXRpb25FbGVtZW50ID0gKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYiA8PCAwKTsKKworCQkJCQlzb3VyY2VFbGVtZW50ICs9IHNvdXJjZS5ieXRlczsKKwkJCQkJZGVzdGluYXRpb25FbGVtZW50ICs9IGRlc3RpbmF0aW9uLmJ5dGVzOworCQkJCX0KKworCQkJCXNvdXJjZVJvdyArPSBzb3VyY2UucGl0Y2hCOworCQkJCWRlc3RpbmF0aW9uUm93ICs9IGRlc3RpbmF0aW9uLnBpdGNoQjsKKwkJCX0KKworCQkJc291cmNlU2xpY2UgKz0gc291cmNlLnNsaWNlQjsKKwkJCWRlc3RpbmF0aW9uU2xpY2UgKz0gZGVzdGluYXRpb24uc2xpY2VCOworCQl9CisJfQorCisJdm9pZCBTdXJmYWNlOjpkZWNvZGVSNUc2QjUoQnVmZmVyICZkZXN0aW5hdGlvbiwgY29uc3QgQnVmZmVyICZzb3VyY2UpCisJeworCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VTbGljZSA9ICh1bnNpZ25lZCBjaGFyKilzb3VyY2UuYnVmZmVyOworCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvblNsaWNlID0gKHVuc2lnbmVkIGNoYXIqKWRlc3RpbmF0aW9uLmJ1ZmZlcjsKKworCQlmb3IoaW50IHogPSAwOyB6IDwgZGVzdGluYXRpb24uZGVwdGggJiYgeiA8IHNvdXJjZS5kZXB0aDsgeisrKQorCQl7CisJCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VSb3cgPSBzb3VyY2VTbGljZTsKKwkJCXVuc2lnbmVkIGNoYXIgKmRlc3RpbmF0aW9uUm93ID0gZGVzdGluYXRpb25TbGljZTsKKworCQkJZm9yKGludCB5ID0gMDsgeSA8IGRlc3RpbmF0aW9uLmhlaWdodCAmJiB5IDwgc291cmNlLmhlaWdodDsgeSsrKQorCQkJeworCQkJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZUVsZW1lbnQgPSBzb3VyY2VSb3c7CisJCQkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25FbGVtZW50ID0gZGVzdGluYXRpb25Sb3c7CisKKwkJCQlmb3IoaW50IHggPSAwOyB4IDwgZGVzdGluYXRpb24ud2lkdGggJiYgeCA8IHNvdXJjZS53aWR0aDsgeCsrKQorCQkJCXsKKwkJCQkJdW5zaWduZWQgaW50IHJnYiA9ICoodW5zaWduZWQgc2hvcnQqKXNvdXJjZUVsZW1lbnQ7CisJCQkJCQkKKwkJCQkJdW5zaWduZWQgaW50IHIgPSAoKChyZ2IgJiAweEY4MDApICogNjczODUgKyAweDgwMDAwMCkgPj4gOCkgJiAweDAwRkYwMDAwOworCQkJCQl1bnNpZ25lZCBpbnQgZyA9ICgoKHJnYiAmIDB4MDdFMCkgKiA4Mjg5ICArIDB4ODAwMCkgPj4gOCkgJiAweDAwMDBGRjAwOworCQkJCQl1bnNpZ25lZCBpbnQgYiA9ICgoKHJnYiAmIDB4MDAxRikgKiAyMTA2ICArIDB4ODApID4+IDgpOworCisJCQkJCSoodW5zaWduZWQgaW50KilkZXN0aW5hdGlvbkVsZW1lbnQgPSAweEZGMDAwMDAwIHwgciB8IGcgfCBiOworCisJCQkJCXNvdXJjZUVsZW1lbnQgKz0gc291cmNlLmJ5dGVzOworCQkJCQlkZXN0aW5hdGlvbkVsZW1lbnQgKz0gZGVzdGluYXRpb24uYnl0ZXM7CisJCQkJfQorCisJCQkJc291cmNlUm93ICs9IHNvdXJjZS5waXRjaEI7CisJCQkJZGVzdGluYXRpb25Sb3cgKz0gZGVzdGluYXRpb24ucGl0Y2hCOworCQkJfQorCisJCQlzb3VyY2VTbGljZSArPSBzb3VyY2Uuc2xpY2VCOworCQkJZGVzdGluYXRpb25TbGljZSArPSBkZXN0aW5hdGlvbi5zbGljZUI7CisJCX0KKwl9CisKKwl2b2lkIFN1cmZhY2U6OmRlY29kZVgxUjVHNUI1KEJ1ZmZlciAmZGVzdGluYXRpb24sIGNvbnN0IEJ1ZmZlciAmc291cmNlKQorCXsKKwkJdW5zaWduZWQgY2hhciAqc291cmNlU2xpY2UgPSAodW5zaWduZWQgY2hhciopc291cmNlLmJ1ZmZlcjsKKwkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25TbGljZSA9ICh1bnNpZ25lZCBjaGFyKilkZXN0aW5hdGlvbi5idWZmZXI7CisKKwkJZm9yKGludCB6ID0gMDsgeiA8IGRlc3RpbmF0aW9uLmRlcHRoICYmIHogPCBzb3VyY2UuZGVwdGg7IHorKykKKwkJeworCQkJdW5zaWduZWQgY2hhciAqc291cmNlUm93ID0gc291cmNlU2xpY2U7CisJCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvblJvdyA9IGRlc3RpbmF0aW9uU2xpY2U7CisKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBkZXN0aW5hdGlvbi5oZWlnaHQgJiYgeSA8IHNvdXJjZS5oZWlnaHQ7IHkrKykKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VFbGVtZW50ID0gc291cmNlUm93OworCQkJCXVuc2lnbmVkIGNoYXIgKmRlc3RpbmF0aW9uRWxlbWVudCA9IGRlc3RpbmF0aW9uUm93OworCisJCQkJZm9yKGludCB4ID0gMDsgeCA8IGRlc3RpbmF0aW9uLndpZHRoICYmIHggPCBzb3VyY2Uud2lkdGg7IHgrKykKKwkJCQl7CisJCQkJCXVuc2lnbmVkIGludCB4cmdiID0gKih1bnNpZ25lZCBzaG9ydCopc291cmNlRWxlbWVudDsKKwkJCQkJCQorCQkJCQl1bnNpZ25lZCBpbnQgciA9ICgoKHhyZ2IgJiAweDdDMDApICogMTM0NzcxICsgMHg4MDAwMDApID4+IDgpICYgMHgwMEZGMDAwMDsKKwkJCQkJdW5zaWduZWQgaW50IGcgPSAoKCh4cmdiICYgMHgwM0UwKSAqIDE2ODQ2ICsgMHg4MDAwKSA+PiA4KSAmIDB4MDAwMEZGMDA7CisJCQkJCXVuc2lnbmVkIGludCBiID0gKCgoeHJnYiAmIDB4MDAxRikgKiAyMTA2ICArIDB4ODApID4+IDgpOworCisJCQkJCSoodW5zaWduZWQgaW50KilkZXN0aW5hdGlvbkVsZW1lbnQgPSAweEZGMDAwMDAwIHwgciB8IGcgfCBiOworCisJCQkJCXNvdXJjZUVsZW1lbnQgKz0gc291cmNlLmJ5dGVzOworCQkJCQlkZXN0aW5hdGlvbkVsZW1lbnQgKz0gZGVzdGluYXRpb24uYnl0ZXM7CisJCQkJfQorCisJCQkJc291cmNlUm93ICs9IHNvdXJjZS5waXRjaEI7CisJCQkJZGVzdGluYXRpb25Sb3cgKz0gZGVzdGluYXRpb24ucGl0Y2hCOworCQkJfQorCisJCQlzb3VyY2VTbGljZSArPSBzb3VyY2Uuc2xpY2VCOworCQkJZGVzdGluYXRpb25TbGljZSArPSBkZXN0aW5hdGlvbi5zbGljZUI7CisJCX0KKwl9CisKKwl2b2lkIFN1cmZhY2U6OmRlY29kZUExUjVHNUI1KEJ1ZmZlciAmZGVzdGluYXRpb24sIGNvbnN0IEJ1ZmZlciAmc291cmNlKQorCXsKKwkJdW5zaWduZWQgY2hhciAqc291cmNlU2xpY2UgPSAodW5zaWduZWQgY2hhciopc291cmNlLmJ1ZmZlcjsKKwkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25TbGljZSA9ICh1bnNpZ25lZCBjaGFyKilkZXN0aW5hdGlvbi5idWZmZXI7CisKKwkJZm9yKGludCB6ID0gMDsgeiA8IGRlc3RpbmF0aW9uLmRlcHRoICYmIHogPCBzb3VyY2UuZGVwdGg7IHorKykKKwkJeworCQkJdW5zaWduZWQgY2hhciAqc291cmNlUm93ID0gc291cmNlU2xpY2U7CisJCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvblJvdyA9IGRlc3RpbmF0aW9uU2xpY2U7CisKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBkZXN0aW5hdGlvbi5oZWlnaHQgJiYgeSA8IHNvdXJjZS5oZWlnaHQ7IHkrKykKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VFbGVtZW50ID0gc291cmNlUm93OworCQkJCXVuc2lnbmVkIGNoYXIgKmRlc3RpbmF0aW9uRWxlbWVudCA9IGRlc3RpbmF0aW9uUm93OworCisJCQkJZm9yKGludCB4ID0gMDsgeCA8IGRlc3RpbmF0aW9uLndpZHRoICYmIHggPCBzb3VyY2Uud2lkdGg7IHgrKykKKwkJCQl7CisJCQkJCXVuc2lnbmVkIGludCBhcmdiID0gKih1bnNpZ25lZCBzaG9ydCopc291cmNlRWxlbWVudDsKKwkJCQkJCisJCQkJCXVuc2lnbmVkIGludCBhID0gICAoYXJnYiAmIDB4ODAwMCkgKiAxMzA1NjA7CisJCQkJCXVuc2lnbmVkIGludCByID0gKCgoYXJnYiAmIDB4N0MwMCkgKiAxMzQ3NzEgKyAweDgwMDAwMCkgPj4gOCkgJiAweDAwRkYwMDAwOworCQkJCQl1bnNpZ25lZCBpbnQgZyA9ICgoKGFyZ2IgJiAweDAzRTApICogMTY4NDYgICsgMHg4MDAwKSA+PiA4KSAmIDB4MDAwMEZGMDA7CisJCQkJCXVuc2lnbmVkIGludCBiID0gKCgoYXJnYiAmIDB4MDAxRikgKiAyMTA2ICAgKyAweDgwKSA+PiA4KTsKKworCQkJCQkqKHVuc2lnbmVkIGludCopZGVzdGluYXRpb25FbGVtZW50ID0gYSB8IHIgfCBnIHwgYjsKKworCQkJCQlzb3VyY2VFbGVtZW50ICs9IHNvdXJjZS5ieXRlczsKKwkJCQkJZGVzdGluYXRpb25FbGVtZW50ICs9IGRlc3RpbmF0aW9uLmJ5dGVzOworCQkJCX0KKworCQkJCXNvdXJjZVJvdyArPSBzb3VyY2UucGl0Y2hCOworCQkJCWRlc3RpbmF0aW9uUm93ICs9IGRlc3RpbmF0aW9uLnBpdGNoQjsKKwkJCX0KKworCQkJc291cmNlU2xpY2UgKz0gc291cmNlLnNsaWNlQjsKKwkJCWRlc3RpbmF0aW9uU2xpY2UgKz0gZGVzdGluYXRpb24uc2xpY2VCOworCQl9CisJfQorCisJdm9pZCBTdXJmYWNlOjpkZWNvZGVYNFI0RzRCNChCdWZmZXIgJmRlc3RpbmF0aW9uLCBjb25zdCBCdWZmZXIgJnNvdXJjZSkKKwl7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZVNsaWNlID0gKHVuc2lnbmVkIGNoYXIqKXNvdXJjZS5idWZmZXI7CisJCXVuc2lnbmVkIGNoYXIgKmRlc3RpbmF0aW9uU2xpY2UgPSAodW5zaWduZWQgY2hhciopZGVzdGluYXRpb24uYnVmZmVyOworCisJCWZvcihpbnQgeiA9IDA7IHogPCBkZXN0aW5hdGlvbi5kZXB0aCAmJiB6IDwgc291cmNlLmRlcHRoOyB6KyspCisJCXsKKwkJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZVJvdyA9IHNvdXJjZVNsaWNlOworCQkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25Sb3cgPSBkZXN0aW5hdGlvblNsaWNlOworCisJCQlmb3IoaW50IHkgPSAwOyB5IDwgZGVzdGluYXRpb24uaGVpZ2h0ICYmIHkgPCBzb3VyY2UuaGVpZ2h0OyB5KyspCisJCQl7CisJCQkJdW5zaWduZWQgY2hhciAqc291cmNlRWxlbWVudCA9IHNvdXJjZVJvdzsKKwkJCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvbkVsZW1lbnQgPSBkZXN0aW5hdGlvblJvdzsKKworCQkJCWZvcihpbnQgeCA9IDA7IHggPCBkZXN0aW5hdGlvbi53aWR0aCAmJiB4IDwgc291cmNlLndpZHRoOyB4KyspCisJCQkJeworCQkJCQl1bnNpZ25lZCBpbnQgeHJnYiA9ICoodW5zaWduZWQgc2hvcnQqKXNvdXJjZUVsZW1lbnQ7CisJCQkJCQkKKwkJCQkJdW5zaWduZWQgaW50IHIgPSAoKHhyZ2IgJiAweDBGMDApICogMHgwMDAwMTEwMCkgJiAweDAwRkYwMDAwOworCQkJCQl1bnNpZ25lZCBpbnQgZyA9ICgoeHJnYiAmIDB4MDBGMCkgKiAweDAwMDAwMTEwKSAmIDB4MDAwMEZGMDA7CisJCQkJCXVuc2lnbmVkIGludCBiID0gICh4cmdiICYgMHgwMDBGKSAqIDB4MDAwMDAwMTE7CisKKwkJCQkJKih1bnNpZ25lZCBpbnQqKWRlc3RpbmF0aW9uRWxlbWVudCA9IDB4RkYwMDAwMDAgfCByIHwgZyB8IGI7CisKKwkJCQkJc291cmNlRWxlbWVudCArPSBzb3VyY2UuYnl0ZXM7CisJCQkJCWRlc3RpbmF0aW9uRWxlbWVudCArPSBkZXN0aW5hdGlvbi5ieXRlczsKKwkJCQl9CisKKwkJCQlzb3VyY2VSb3cgKz0gc291cmNlLnBpdGNoQjsKKwkJCQlkZXN0aW5hdGlvblJvdyArPSBkZXN0aW5hdGlvbi5waXRjaEI7CisJCQl9CisKKwkJCXNvdXJjZVNsaWNlICs9IHNvdXJjZS5zbGljZUI7CisJCQlkZXN0aW5hdGlvblNsaWNlICs9IGRlc3RpbmF0aW9uLnNsaWNlQjsKKwkJfQorCX0KKworCXZvaWQgU3VyZmFjZTo6ZGVjb2RlQTRSNEc0QjQoQnVmZmVyICZkZXN0aW5hdGlvbiwgY29uc3QgQnVmZmVyICZzb3VyY2UpCisJeworCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VTbGljZSA9ICh1bnNpZ25lZCBjaGFyKilzb3VyY2UuYnVmZmVyOworCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvblNsaWNlID0gKHVuc2lnbmVkIGNoYXIqKWRlc3RpbmF0aW9uLmJ1ZmZlcjsKKworCQlmb3IoaW50IHogPSAwOyB6IDwgZGVzdGluYXRpb24uZGVwdGggJiYgeiA8IHNvdXJjZS5kZXB0aDsgeisrKQorCQl7CisJCQl1bnNpZ25lZCBjaGFyICpzb3VyY2VSb3cgPSBzb3VyY2VTbGljZTsKKwkJCXVuc2lnbmVkIGNoYXIgKmRlc3RpbmF0aW9uUm93ID0gZGVzdGluYXRpb25TbGljZTsKKworCQkJZm9yKGludCB5ID0gMDsgeSA8IGRlc3RpbmF0aW9uLmhlaWdodCAmJiB5IDwgc291cmNlLmhlaWdodDsgeSsrKQorCQkJeworCQkJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZUVsZW1lbnQgPSBzb3VyY2VSb3c7CisJCQkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25FbGVtZW50ID0gZGVzdGluYXRpb25Sb3c7CisKKwkJCQlmb3IoaW50IHggPSAwOyB4IDwgZGVzdGluYXRpb24ud2lkdGggJiYgeCA8IHNvdXJjZS53aWR0aDsgeCsrKQorCQkJCXsKKwkJCQkJdW5zaWduZWQgaW50IGFyZ2IgPSAqKHVuc2lnbmVkIHNob3J0Kilzb3VyY2VFbGVtZW50OworCQkJCQkKKwkJCQkJdW5zaWduZWQgaW50IGEgPSAoKGFyZ2IgJiAweEYwMDApICogMHgwMDAxMTAwMCkgJiAweEZGMDAwMDAwOworCQkJCQl1bnNpZ25lZCBpbnQgciA9ICgoYXJnYiAmIDB4MEYwMCkgKiAweDAwMDAxMTAwKSAmIDB4MDBGRjAwMDA7CisJCQkJCXVuc2lnbmVkIGludCBnID0gKChhcmdiICYgMHgwMEYwKSAqIDB4MDAwMDAxMTApICYgMHgwMDAwRkYwMDsKKwkJCQkJdW5zaWduZWQgaW50IGIgPSAgKGFyZ2IgJiAweDAwMEYpICogMHgwMDAwMDAxMTsKKworCQkJCQkqKHVuc2lnbmVkIGludCopZGVzdGluYXRpb25FbGVtZW50ID0gYSB8IHIgfCBnIHwgYjsKKworCQkJCQlzb3VyY2VFbGVtZW50ICs9IHNvdXJjZS5ieXRlczsKKwkJCQkJZGVzdGluYXRpb25FbGVtZW50ICs9IGRlc3RpbmF0aW9uLmJ5dGVzOworCQkJCX0KKworCQkJCXNvdXJjZVJvdyArPSBzb3VyY2UucGl0Y2hCOworCQkJCWRlc3RpbmF0aW9uUm93ICs9IGRlc3RpbmF0aW9uLnBpdGNoQjsKKwkJCX0KKworCQkJc291cmNlU2xpY2UgKz0gc291cmNlLnNsaWNlQjsKKwkJCWRlc3RpbmF0aW9uU2xpY2UgKz0gZGVzdGluYXRpb24uc2xpY2VCOworCQl9CisJfQorCisJdm9pZCBTdXJmYWNlOjpkZWNvZGVQOChCdWZmZXIgJmRlc3RpbmF0aW9uLCBjb25zdCBCdWZmZXIgJnNvdXJjZSkKKwl7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZVNsaWNlID0gKHVuc2lnbmVkIGNoYXIqKXNvdXJjZS5idWZmZXI7CisJCXVuc2lnbmVkIGNoYXIgKmRlc3RpbmF0aW9uU2xpY2UgPSAodW5zaWduZWQgY2hhciopZGVzdGluYXRpb24uYnVmZmVyOworCisJCWZvcihpbnQgeiA9IDA7IHogPCBkZXN0aW5hdGlvbi5kZXB0aCAmJiB6IDwgc291cmNlLmRlcHRoOyB6KyspCisJCXsKKwkJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZVJvdyA9IHNvdXJjZVNsaWNlOworCQkJdW5zaWduZWQgY2hhciAqZGVzdGluYXRpb25Sb3cgPSBkZXN0aW5hdGlvblNsaWNlOworCisJCQlmb3IoaW50IHkgPSAwOyB5IDwgZGVzdGluYXRpb24uaGVpZ2h0ICYmIHkgPCBzb3VyY2UuaGVpZ2h0OyB5KyspCisJCQl7CisJCQkJdW5zaWduZWQgY2hhciAqc291cmNlRWxlbWVudCA9IHNvdXJjZVJvdzsKKwkJCQl1bnNpZ25lZCBjaGFyICpkZXN0aW5hdGlvbkVsZW1lbnQgPSBkZXN0aW5hdGlvblJvdzsKKworCQkJCWZvcihpbnQgeCA9IDA7IHggPCBkZXN0aW5hdGlvbi53aWR0aCAmJiB4IDwgc291cmNlLndpZHRoOyB4KyspCisJCQkJeworCQkJCQl1bnNpZ25lZCBpbnQgYWJnciA9IHBhbGV0dGVbKih1bnNpZ25lZCBjaGFyKilzb3VyY2VFbGVtZW50XTsKKworCQkJCQl1bnNpZ25lZCBpbnQgciA9IChhYmdyICYgMHgwMDAwMDBGRikgPDwgMTY7CisJCQkJCXVuc2lnbmVkIGludCBnID0gKGFiZ3IgJiAweDAwMDBGRjAwKSA8PCAwOworCQkJCQl1bnNpZ25lZCBpbnQgYiA9IChhYmdyICYgMHgwMEZGMDAwMCkgPj4gMTY7CisJCQkJCXVuc2lnbmVkIGludCBhID0gKGFiZ3IgJiAweEZGMDAwMDAwKSA+PiAwOworCisJCQkJCSoodW5zaWduZWQgaW50KilkZXN0aW5hdGlvbkVsZW1lbnQgPSBhIHwgciB8IGcgfCBiOworCisJCQkJCXNvdXJjZUVsZW1lbnQgKz0gc291cmNlLmJ5dGVzOworCQkJCQlkZXN0aW5hdGlvbkVsZW1lbnQgKz0gZGVzdGluYXRpb24uYnl0ZXM7CisJCQkJfQorCisJCQkJc291cmNlUm93ICs9IHNvdXJjZS5waXRjaEI7CisJCQkJZGVzdGluYXRpb25Sb3cgKz0gZGVzdGluYXRpb24ucGl0Y2hCOworCQkJfQorCisJCQlzb3VyY2VTbGljZSArPSBzb3VyY2Uuc2xpY2VCOworCQkJZGVzdGluYXRpb25TbGljZSArPSBkZXN0aW5hdGlvbi5zbGljZUI7CisJCX0KKwl9CisKKyNpZiBTM1RDX1NVUFBPUlQKKwl2b2lkIFN1cmZhY2U6OmRlY29kZURYVDEoQnVmZmVyICZpbnRlcm5hbCwgY29uc3QgQnVmZmVyICZleHRlcm5hbCkKKwl7CisJCXVuc2lnbmVkIGludCAqZGVzdFNsaWNlID0gKHVuc2lnbmVkIGludCopaW50ZXJuYWwuYnVmZmVyOworCQlEWFQxICpzb3VyY2UgPSAoRFhUMSopZXh0ZXJuYWwuYnVmZmVyOworCisJCWZvcihpbnQgeiA9IDA7IHogPCBleHRlcm5hbC5kZXB0aDsgeisrKQorCQl7CisJCQl1bnNpZ25lZCBpbnQgKmRlc3QgPSBkZXN0U2xpY2U7CisKKwkJCWZvcihpbnQgeSA9IDA7IHkgPCBleHRlcm5hbC5oZWlnaHQ7IHkgKz0gNCkKKwkJCXsKKwkJCQlmb3IoaW50IHggPSAwOyB4IDwgZXh0ZXJuYWwud2lkdGg7IHggKz0gNCkKKwkJCQl7CisJCQkJCUNvbG9yPGJ5dGU+IGNbNF07CisKKwkJCQkJY1swXSA9IHNvdXJjZS0+YzA7CisJCQkJCWNbMV0gPSBzb3VyY2UtPmMxOworCisJCQkJCWlmKHNvdXJjZS0+YzAgPiBzb3VyY2UtPmMxKSAgIC8vIE5vIHRyYW5zcGFyZW5jeQorCQkJCQl7CisJCQkJCQkvLyBjMiA9IDIgLyAzICogYzAgKyAxIC8gMyAqIGMxCisJCQkJCQljWzJdLnIgPSAoYnl0ZSkoKDIgKiAod29yZCljWzBdLnIgKyAod29yZCljWzFdLnIgKyAxKSAvIDMpOworCQkJCQkJY1syXS5nID0gKGJ5dGUpKCgyICogKHdvcmQpY1swXS5nICsgKHdvcmQpY1sxXS5nICsgMSkgLyAzKTsKKwkJCQkJCWNbMl0uYiA9IChieXRlKSgoMiAqICh3b3JkKWNbMF0uYiArICh3b3JkKWNbMV0uYiArIDEpIC8gMyk7CisJCQkJCQljWzJdLmEgPSAweEZGOworCisJCQkJCQkvLyBjMyA9IDEgLyAzICogYzAgKyAyIC8gMyAqIGMxCisJCQkJCQljWzNdLnIgPSAoYnl0ZSkoKCh3b3JkKWNbMF0uciArIDIgKiAod29yZCljWzFdLnIgKyAxKSAvIDMpOworCQkJCQkJY1szXS5nID0gKGJ5dGUpKCgod29yZCljWzBdLmcgKyAyICogKHdvcmQpY1sxXS5nICsgMSkgLyAzKTsKKwkJCQkJCWNbM10uYiA9IChieXRlKSgoKHdvcmQpY1swXS5iICsgMiAqICh3b3JkKWNbMV0uYiArIDEpIC8gMyk7CisJCQkJCQljWzNdLmEgPSAweEZGOworCQkJCQl9CisJCQkJCWVsc2UgICAvLyBjMyB0cmFuc3BhcmVudAorCQkJCQl7CisJCQkJCQkvLyBjMiA9IDEgLyAyICogYzAgKyAxIC8gMiAqIGMxCisJCQkJCQljWzJdLnIgPSAoYnl0ZSkoKCh3b3JkKWNbMF0uciArICh3b3JkKWNbMV0ucikgLyAyKTsKKwkJCQkJCWNbMl0uZyA9IChieXRlKSgoKHdvcmQpY1swXS5nICsgKHdvcmQpY1sxXS5nKSAvIDIpOworCQkJCQkJY1syXS5iID0gKGJ5dGUpKCgod29yZCljWzBdLmIgKyAod29yZCljWzFdLmIpIC8gMik7CisJCQkJCQljWzJdLmEgPSAweEZGOworCisJCQkJCQljWzNdLnIgPSAwOworCQkJCQkJY1szXS5nID0gMDsKKwkJCQkJCWNbM10uYiA9IDA7CisJCQkJCQljWzNdLmEgPSAwOworCQkJCQl9CisKKwkJCQkJZm9yKGludCBqID0gMDsgaiA8IDQgJiYgKHkgKyBqKSA8IGludGVybmFsLmhlaWdodDsgaisrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgNCAmJiAoeCArIGkpIDwgaW50ZXJuYWwud2lkdGg7IGkrKykKKwkJCQkJCXsKKwkJCQkJCQlkZXN0Wyh4ICsgaSkgKyAoeSArIGopICogaW50ZXJuYWwud2lkdGhdID0gY1sodW5zaWduZWQgaW50KShzb3VyY2UtPmx1dCA+PiAyICogKGkgKyBqICogNCkpICUgNF07CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlzb3VyY2UrKzsKKwkJCQl9CisJCQl9CisKKwkJCShieXRlKiYpZGVzdFNsaWNlICs9IGludGVybmFsLnNsaWNlQjsKKwkJfQorCX0KKworCXZvaWQgU3VyZmFjZTo6ZGVjb2RlRFhUMyhCdWZmZXIgJmludGVybmFsLCBjb25zdCBCdWZmZXIgJmV4dGVybmFsKQorCXsKKwkJdW5zaWduZWQgaW50ICpkZXN0U2xpY2UgPSAodW5zaWduZWQgaW50KilpbnRlcm5hbC5idWZmZXI7CisJCURYVDMgKnNvdXJjZSA9IChEWFQzKilleHRlcm5hbC5idWZmZXI7CisKKwkJZm9yKGludCB6ID0gMDsgeiA8IGV4dGVybmFsLmRlcHRoOyB6KyspCisJCXsKKwkJCXVuc2lnbmVkIGludCAqZGVzdCA9IGRlc3RTbGljZTsKKworCQkJZm9yKGludCB5ID0gMDsgeSA8IGV4dGVybmFsLmhlaWdodDsgeSArPSA0KQorCQkJeworCQkJCWZvcihpbnQgeCA9IDA7IHggPCBleHRlcm5hbC53aWR0aDsgeCArPSA0KQorCQkJCXsKKwkJCQkJQ29sb3I8Ynl0ZT4gY1s0XTsKKworCQkJCQljWzBdID0gc291cmNlLT5jMDsKKwkJCQkJY1sxXSA9IHNvdXJjZS0+YzE7CisKKwkJCQkJLy8gYzIgPSAyIC8gMyAqIGMwICsgMSAvIDMgKiBjMQorCQkJCQljWzJdLnIgPSAoYnl0ZSkoKDIgKiAod29yZCljWzBdLnIgKyAod29yZCljWzFdLnIgKyAxKSAvIDMpOworCQkJCQljWzJdLmcgPSAoYnl0ZSkoKDIgKiAod29yZCljWzBdLmcgKyAod29yZCljWzFdLmcgKyAxKSAvIDMpOworCQkJCQljWzJdLmIgPSAoYnl0ZSkoKDIgKiAod29yZCljWzBdLmIgKyAod29yZCljWzFdLmIgKyAxKSAvIDMpOworCisJCQkJCS8vIGMzID0gMSAvIDMgKiBjMCArIDIgLyAzICogYzEKKwkJCQkJY1szXS5yID0gKGJ5dGUpKCgod29yZCljWzBdLnIgKyAyICogKHdvcmQpY1sxXS5yICsgMSkgLyAzKTsKKwkJCQkJY1szXS5nID0gKGJ5dGUpKCgod29yZCljWzBdLmcgKyAyICogKHdvcmQpY1sxXS5nICsgMSkgLyAzKTsKKwkJCQkJY1szXS5iID0gKGJ5dGUpKCgod29yZCljWzBdLmIgKyAyICogKHdvcmQpY1sxXS5iICsgMSkgLyAzKTsKKworCQkJCQlmb3IoaW50IGogPSAwOyBqIDwgNCAmJiAoeSArIGopIDwgaW50ZXJuYWwuaGVpZ2h0OyBqKyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCA0ICYmICh4ICsgaSkgPCBpbnRlcm5hbC53aWR0aDsgaSsrKQorCQkJCQkJeworCQkJCQkJCXVuc2lnbmVkIGludCBhID0gKHVuc2lnbmVkIGludCkoc291cmNlLT5hID4+IDQgKiAoaSArIGogKiA0KSkgJiAweDBGOworCQkJCQkJCXVuc2lnbmVkIGludCBjb2xvciA9IChjWyh1bnNpZ25lZCBpbnQpKHNvdXJjZS0+bHV0ID4+IDIgKiAoaSArIGogKiA0KSkgJSA0XSAmIDB4MDBGRkZGRkYpIHwgKChhIDw8IDI4KSArIChhIDw8IDI0KSk7CisKKwkJCQkJCQlkZXN0Wyh4ICsgaSkgKyAoeSArIGopICogaW50ZXJuYWwud2lkdGhdID0gY29sb3I7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlzb3VyY2UrKzsKKwkJCQl9CisJCQl9CisKKwkJCShieXRlKiYpZGVzdFNsaWNlICs9IGludGVybmFsLnNsaWNlQjsKKwkJfQorCX0KKworCXZvaWQgU3VyZmFjZTo6ZGVjb2RlRFhUNShCdWZmZXIgJmludGVybmFsLCBjb25zdCBCdWZmZXIgJmV4dGVybmFsKQorCXsKKwkJdW5zaWduZWQgaW50ICpkZXN0U2xpY2UgPSAodW5zaWduZWQgaW50KilpbnRlcm5hbC5idWZmZXI7CisJCURYVDUgKnNvdXJjZSA9IChEWFQ1KilleHRlcm5hbC5idWZmZXI7CisKKwkJZm9yKGludCB6ID0gMDsgeiA8IGV4dGVybmFsLmRlcHRoOyB6KyspCisJCXsKKwkJCXVuc2lnbmVkIGludCAqZGVzdCA9IGRlc3RTbGljZTsKKworCQkJZm9yKGludCB5ID0gMDsgeSA8IGV4dGVybmFsLmhlaWdodDsgeSArPSA0KQorCQkJeworCQkJCWZvcihpbnQgeCA9IDA7IHggPCBleHRlcm5hbC53aWR0aDsgeCArPSA0KQorCQkJCXsKKwkJCQkJQ29sb3I8Ynl0ZT4gY1s0XTsKKworCQkJCQljWzBdID0gc291cmNlLT5jMDsKKwkJCQkJY1sxXSA9IHNvdXJjZS0+YzE7CisKKwkJCQkJLy8gYzIgPSAyIC8gMyAqIGMwICsgMSAvIDMgKiBjMQorCQkJCQljWzJdLnIgPSAoYnl0ZSkoKDIgKiAod29yZCljWzBdLnIgKyAod29yZCljWzFdLnIgKyAxKSAvIDMpOworCQkJCQljWzJdLmcgPSAoYnl0ZSkoKDIgKiAod29yZCljWzBdLmcgKyAod29yZCljWzFdLmcgKyAxKSAvIDMpOworCQkJCQljWzJdLmIgPSAoYnl0ZSkoKDIgKiAod29yZCljWzBdLmIgKyAod29yZCljWzFdLmIgKyAxKSAvIDMpOworCisJCQkJCS8vIGMzID0gMSAvIDMgKiBjMCArIDIgLyAzICogYzEKKwkJCQkJY1szXS5yID0gKGJ5dGUpKCgod29yZCljWzBdLnIgKyAyICogKHdvcmQpY1sxXS5yICsgMSkgLyAzKTsKKwkJCQkJY1szXS5nID0gKGJ5dGUpKCgod29yZCljWzBdLmcgKyAyICogKHdvcmQpY1sxXS5nICsgMSkgLyAzKTsKKwkJCQkJY1szXS5iID0gKGJ5dGUpKCgod29yZCljWzBdLmIgKyAyICogKHdvcmQpY1sxXS5iICsgMSkgLyAzKTsKKworCQkJCQlieXRlIGFbOF07CisKKwkJCQkJYVswXSA9IHNvdXJjZS0+YTA7CisJCQkJCWFbMV0gPSBzb3VyY2UtPmExOworCQkJCQkKKwkJCQkJaWYoYVswXSA+IGFbMV0pCisJCQkJCXsKKwkJCQkJCWFbMl0gPSAoYnl0ZSkoKDYgKiAod29yZClhWzBdICsgMSAqICh3b3JkKWFbMV0gKyAzKSAvIDcpOworCQkJCQkJYVszXSA9IChieXRlKSgoNSAqICh3b3JkKWFbMF0gKyAyICogKHdvcmQpYVsxXSArIDMpIC8gNyk7CisJCQkJCQlhWzRdID0gKGJ5dGUpKCg0ICogKHdvcmQpYVswXSArIDMgKiAod29yZClhWzFdICsgMykgLyA3KTsKKwkJCQkJCWFbNV0gPSAoYnl0ZSkoKDMgKiAod29yZClhWzBdICsgNCAqICh3b3JkKWFbMV0gKyAzKSAvIDcpOworCQkJCQkJYVs2XSA9IChieXRlKSgoMiAqICh3b3JkKWFbMF0gKyA1ICogKHdvcmQpYVsxXSArIDMpIC8gNyk7CisJCQkJCQlhWzddID0gKGJ5dGUpKCgxICogKHdvcmQpYVswXSArIDYgKiAod29yZClhWzFdICsgMykgLyA3KTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWFbMl0gPSAoYnl0ZSkoKDQgKiAod29yZClhWzBdICsgMSAqICh3b3JkKWFbMV0gKyAyKSAvIDUpOworCQkJCQkJYVszXSA9IChieXRlKSgoMyAqICh3b3JkKWFbMF0gKyAyICogKHdvcmQpYVsxXSArIDIpIC8gNSk7CisJCQkJCQlhWzRdID0gKGJ5dGUpKCgyICogKHdvcmQpYVswXSArIDMgKiAod29yZClhWzFdICsgMikgLyA1KTsKKwkJCQkJCWFbNV0gPSAoYnl0ZSkoKDEgKiAod29yZClhWzBdICsgNCAqICh3b3JkKWFbMV0gKyAyKSAvIDUpOworCQkJCQkJYVs2XSA9IDA7CisJCQkJCQlhWzddID0gMHhGRjsKKwkJCQkJfQorCisJCQkJCWZvcihpbnQgaiA9IDA7IGogPCA0ICYmICh5ICsgaikgPCBpbnRlcm5hbC5oZWlnaHQ7IGorKykKKwkJCQkJeworCQkJCQkJZm9yKGludCBpID0gMDsgaSA8IDQgJiYgKHggKyBpKSA8IGludGVybmFsLndpZHRoOyBpKyspCisJCQkJCQl7CisJCQkJCQkJdW5zaWduZWQgaW50IGFscGhhID0gKHVuc2lnbmVkIGludClhWyh1bnNpZ25lZCBpbnQpKHNvdXJjZS0+YWx1dCA+PiAoMTYgKyAzICogKGkgKyBqICogNCkpKSAlIDhdIDw8IDI0OworCQkJCQkJCXVuc2lnbmVkIGludCBjb2xvciA9IChjWyhzb3VyY2UtPmNsdXQgPj4gMiAqIChpICsgaiAqIDQpKSAlIDRdICYgMHgwMEZGRkZGRikgfCBhbHBoYTsKKwkJCQkJCQkKKwkJCQkJCQlkZXN0Wyh4ICsgaSkgKyAoeSArIGopICogaW50ZXJuYWwud2lkdGhdID0gY29sb3I7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlzb3VyY2UrKzsKKwkJCQl9CisJCQl9CisKKwkJCShieXRlKiYpZGVzdFNsaWNlICs9IGludGVybmFsLnNsaWNlQjsKKwkJfQorCX0KKworCXZvaWQgU3VyZmFjZTo6ZGVjb2RlQVRJMShCdWZmZXIgJmludGVybmFsLCBjb25zdCBCdWZmZXIgJmV4dGVybmFsKQorCXsKKwkJYnl0ZSAqZGVzdFNsaWNlID0gKGJ5dGUqKWludGVybmFsLmJ1ZmZlcjsKKwkJQVRJMSAqc291cmNlID0gKEFUSTEqKWV4dGVybmFsLmJ1ZmZlcjsKKworCQlmb3IoaW50IHogPSAwOyB6IDwgZXh0ZXJuYWwuZGVwdGg7IHorKykKKwkJeworCQkJYnl0ZSAqZGVzdCA9IGRlc3RTbGljZTsKKworCQkJZm9yKGludCB5ID0gMDsgeSA8IGV4dGVybmFsLmhlaWdodDsgeSArPSA0KQorCQkJeworCQkJCWZvcihpbnQgeCA9IDA7IHggPCBleHRlcm5hbC53aWR0aDsgeCArPSA0KQorCQkJCXsKKwkJCQkJYnl0ZSByWzhdOworCisJCQkJCXJbMF0gPSBzb3VyY2UtPnIwOworCQkJCQlyWzFdID0gc291cmNlLT5yMTsKKwkJCQkJCisJCQkJCWlmKHJbMF0gPiByWzFdKQorCQkJCQl7CisJCQkJCQlyWzJdID0gKGJ5dGUpKCg2ICogKHdvcmQpclswXSArIDEgKiAod29yZClyWzFdICsgMykgLyA3KTsKKwkJCQkJCXJbM10gPSAoYnl0ZSkoKDUgKiAod29yZClyWzBdICsgMiAqICh3b3JkKXJbMV0gKyAzKSAvIDcpOworCQkJCQkJcls0XSA9IChieXRlKSgoNCAqICh3b3JkKXJbMF0gKyAzICogKHdvcmQpclsxXSArIDMpIC8gNyk7CisJCQkJCQlyWzVdID0gKGJ5dGUpKCgzICogKHdvcmQpclswXSArIDQgKiAod29yZClyWzFdICsgMykgLyA3KTsKKwkJCQkJCXJbNl0gPSAoYnl0ZSkoKDIgKiAod29yZClyWzBdICsgNSAqICh3b3JkKXJbMV0gKyAzKSAvIDcpOworCQkJCQkJcls3XSA9IChieXRlKSgoMSAqICh3b3JkKXJbMF0gKyA2ICogKHdvcmQpclsxXSArIDMpIC8gNyk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyWzJdID0gKGJ5dGUpKCg0ICogKHdvcmQpclswXSArIDEgKiAod29yZClyWzFdICsgMikgLyA1KTsKKwkJCQkJCXJbM10gPSAoYnl0ZSkoKDMgKiAod29yZClyWzBdICsgMiAqICh3b3JkKXJbMV0gKyAyKSAvIDUpOworCQkJCQkJcls0XSA9IChieXRlKSgoMiAqICh3b3JkKXJbMF0gKyAzICogKHdvcmQpclsxXSArIDIpIC8gNSk7CisJCQkJCQlyWzVdID0gKGJ5dGUpKCgxICogKHdvcmQpclswXSArIDQgKiAod29yZClyWzFdICsgMikgLyA1KTsKKwkJCQkJCXJbNl0gPSAwOworCQkJCQkJcls3XSA9IDB4RkY7CisJCQkJCX0KKworCQkJCQlmb3IoaW50IGogPSAwOyBqIDwgNCAmJiAoeSArIGopIDwgaW50ZXJuYWwuaGVpZ2h0OyBqKyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCA0ICYmICh4ICsgaSkgPCBpbnRlcm5hbC53aWR0aDsgaSsrKQorCQkJCQkJeworCQkJCQkJCWRlc3RbKHggKyBpKSArICh5ICsgaikgKiBpbnRlcm5hbC53aWR0aF0gPSByWyh1bnNpZ25lZCBpbnQpKHNvdXJjZS0+cmx1dCA+PiAoMTYgKyAzICogKGkgKyBqICogNCkpKSAlIDhdOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJc291cmNlKys7CisJCQkJfQorCQkJfQorCisJCQlkZXN0U2xpY2UgKz0gaW50ZXJuYWwuc2xpY2VCOworCQl9CisJfQorCisJdm9pZCBTdXJmYWNlOjpkZWNvZGVBVEkyKEJ1ZmZlciAmaW50ZXJuYWwsIGNvbnN0IEJ1ZmZlciAmZXh0ZXJuYWwpCisJeworCQl3b3JkICpkZXN0U2xpY2UgPSAod29yZCopaW50ZXJuYWwuYnVmZmVyOworCQlBVEkyICpzb3VyY2UgPSAoQVRJMiopZXh0ZXJuYWwuYnVmZmVyOworCisJCWZvcihpbnQgeiA9IDA7IHogPCBleHRlcm5hbC5kZXB0aDsgeisrKQorCQl7CisJCQl3b3JkICpkZXN0ID0gZGVzdFNsaWNlOworCisJCQlmb3IoaW50IHkgPSAwOyB5IDwgZXh0ZXJuYWwuaGVpZ2h0OyB5ICs9IDQpCisJCQl7CisJCQkJZm9yKGludCB4ID0gMDsgeCA8IGV4dGVybmFsLndpZHRoOyB4ICs9IDQpCisJCQkJeworCQkJCQlieXRlIFhbOF07CisKKwkJCQkJWFswXSA9IHNvdXJjZS0+eDA7CisJCQkJCVhbMV0gPSBzb3VyY2UtPngxOworCQkJCQkKKwkJCQkJaWYoWFswXSA+IFhbMV0pCisJCQkJCXsKKwkJCQkJCVhbMl0gPSAoYnl0ZSkoKDYgKiAod29yZClYWzBdICsgMSAqICh3b3JkKVhbMV0gKyAzKSAvIDcpOworCQkJCQkJWFszXSA9IChieXRlKSgoNSAqICh3b3JkKVhbMF0gKyAyICogKHdvcmQpWFsxXSArIDMpIC8gNyk7CisJCQkJCQlYWzRdID0gKGJ5dGUpKCg0ICogKHdvcmQpWFswXSArIDMgKiAod29yZClYWzFdICsgMykgLyA3KTsKKwkJCQkJCVhbNV0gPSAoYnl0ZSkoKDMgKiAod29yZClYWzBdICsgNCAqICh3b3JkKVhbMV0gKyAzKSAvIDcpOworCQkJCQkJWFs2XSA9IChieXRlKSgoMiAqICh3b3JkKVhbMF0gKyA1ICogKHdvcmQpWFsxXSArIDMpIC8gNyk7CisJCQkJCQlYWzddID0gKGJ5dGUpKCgxICogKHdvcmQpWFswXSArIDYgKiAod29yZClYWzFdICsgMykgLyA3KTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVhbMl0gPSAoYnl0ZSkoKDQgKiAod29yZClYWzBdICsgMSAqICh3b3JkKVhbMV0gKyAyKSAvIDUpOworCQkJCQkJWFszXSA9IChieXRlKSgoMyAqICh3b3JkKVhbMF0gKyAyICogKHdvcmQpWFsxXSArIDIpIC8gNSk7CisJCQkJCQlYWzRdID0gKGJ5dGUpKCgyICogKHdvcmQpWFswXSArIDMgKiAod29yZClYWzFdICsgMikgLyA1KTsKKwkJCQkJCVhbNV0gPSAoYnl0ZSkoKDEgKiAod29yZClYWzBdICsgNCAqICh3b3JkKVhbMV0gKyAyKSAvIDUpOworCQkJCQkJWFs2XSA9IDA7CisJCQkJCQlYWzddID0gMHhGRjsKKwkJCQkJfQorCisJCQkJCWJ5dGUgWVs4XTsKKworCQkJCQlZWzBdID0gc291cmNlLT55MDsKKwkJCQkJWVsxXSA9IHNvdXJjZS0+eTE7CisJCQkJCQorCQkJCQlpZihZWzBdID4gWVsxXSkKKwkJCQkJeworCQkJCQkJWVsyXSA9IChieXRlKSgoNiAqICh3b3JkKVlbMF0gKyAxICogKHdvcmQpWVsxXSArIDMpIC8gNyk7CisJCQkJCQlZWzNdID0gKGJ5dGUpKCg1ICogKHdvcmQpWVswXSArIDIgKiAod29yZClZWzFdICsgMykgLyA3KTsKKwkJCQkJCVlbNF0gPSAoYnl0ZSkoKDQgKiAod29yZClZWzBdICsgMyAqICh3b3JkKVlbMV0gKyAzKSAvIDcpOworCQkJCQkJWVs1XSA9IChieXRlKSgoMyAqICh3b3JkKVlbMF0gKyA0ICogKHdvcmQpWVsxXSArIDMpIC8gNyk7CisJCQkJCQlZWzZdID0gKGJ5dGUpKCgyICogKHdvcmQpWVswXSArIDUgKiAod29yZClZWzFdICsgMykgLyA3KTsKKwkJCQkJCVlbN10gPSAoYnl0ZSkoKDEgKiAod29yZClZWzBdICsgNiAqICh3b3JkKVlbMV0gKyAzKSAvIDcpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJWVsyXSA9IChieXRlKSgoNCAqICh3b3JkKVlbMF0gKyAxICogKHdvcmQpWVsxXSArIDIpIC8gNSk7CisJCQkJCQlZWzNdID0gKGJ5dGUpKCgzICogKHdvcmQpWVswXSArIDIgKiAod29yZClZWzFdICsgMikgLyA1KTsKKwkJCQkJCVlbNF0gPSAoYnl0ZSkoKDIgKiAod29yZClZWzBdICsgMyAqICh3b3JkKVlbMV0gKyAyKSAvIDUpOworCQkJCQkJWVs1XSA9IChieXRlKSgoMSAqICh3b3JkKVlbMF0gKyA0ICogKHdvcmQpWVsxXSArIDIpIC8gNSk7CisJCQkJCQlZWzZdID0gMDsKKwkJCQkJCVlbN10gPSAweEZGOworCQkJCQl9CisKKwkJCQkJZm9yKGludCBqID0gMDsgaiA8IDQgJiYgKHkgKyBqKSA8IGludGVybmFsLmhlaWdodDsgaisrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgNCAmJiAoeCArIGkpIDwgaW50ZXJuYWwud2lkdGg7IGkrKykKKwkJCQkJCXsKKwkJCQkJCQl3b3JkIHIgPSBYWyh1bnNpZ25lZCBpbnQpKHNvdXJjZS0+eGx1dCA+PiAoMTYgKyAzICogKGkgKyBqICogNCkpKSAlIDhdOworCQkJCQkJCXdvcmQgZyA9IFlbKHVuc2lnbmVkIGludCkoc291cmNlLT55bHV0ID4+ICgxNiArIDMgKiAoaSArIGogKiA0KSkpICUgOF07CisKKwkJCQkJCQlkZXN0Wyh4ICsgaSkgKyAoeSArIGopICogaW50ZXJuYWwud2lkdGhdID0gKGcgPDwgOCkgKyByOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJc291cmNlKys7CisJCQkJfQorCQkJfQorCisJCQkoYnl0ZSomKWRlc3RTbGljZSArPSBpbnRlcm5hbC5zbGljZUI7CisJCX0KKwl9CisjZW5kaWYKKworCXVuc2lnbmVkIGludCBTdXJmYWNlOjpzaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBGb3JtYXQgZm9ybWF0KQorCXsKKwkJLy8gRGltZW5zaW9ucyByb3VuZGVkIHVwIHRvIG11bHRpcGxlcyBvZiA0LCB1c2VkIGZvciBEWFRDIGZvcm1hdHMKKwkJaW50IHdpZHRoNCA9ICh3aWR0aCArIDMpICYgfjM7CisJCWludCBoZWlnaHQ0ID0gKGhlaWdodCArIDMpICYgfjM7CisKKwkJc3dpdGNoKGZvcm1hdCkKKwkJeworCQkjaWYgUzNUQ19TVVBQT1JUCisJCWNhc2UgRk9STUFUX0RYVDE6CisJCWNhc2UgRk9STUFUX0FUSTE6CisJCQlyZXR1cm4gd2lkdGg0ICogaGVpZ2h0NCAqIGRlcHRoIC8gMjsKKwkJY2FzZSBGT1JNQVRfRFhUMzoKKwkJY2FzZSBGT1JNQVRfRFhUNToKKwkJY2FzZSBGT1JNQVRfQVRJMjoKKwkJCXJldHVybiB3aWR0aDQgKiBoZWlnaHQ0ICogZGVwdGg7CisJCSNlbmRpZgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIGJ5dGVzKGZvcm1hdCkgKiB3aWR0aCAqIGhlaWdodCAqIGRlcHRoOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJYm9vbCBTdXJmYWNlOjppc1N0ZW5jaWwoRm9ybWF0IGZvcm1hdCkKKwl7CisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJY2FzZSBGT1JNQVRfRDMyOgorCQljYXNlIEZPUk1BVF9EMTY6CisJCWNhc2UgRk9STUFUX0QyNFg4OgorCQljYXNlIEZPUk1BVF9EMzJGOgorCQljYXNlIEZPUk1BVF9EMzJGX0NPTVBMRU1FTlRBUlk6CisJCWNhc2UgRk9STUFUX0QzMkZfTE9DS0FCTEU6CisJCQlyZXR1cm4gZmFsc2U7CisJCWNhc2UgRk9STUFUX0QyNFM4OgorCQljYXNlIEZPUk1BVF9EMjRGUzg6CisJCWNhc2UgRk9STUFUX1M4OgorCQljYXNlIEZPUk1BVF9ERjI0OgorCQljYXNlIEZPUk1BVF9ERjE2OgorCQljYXNlIEZPUk1BVF9EMzJGX1RFWFRVUkU6CisJCWNhc2UgRk9STUFUX0QzMkZfU0hBRE9XOgorCQljYXNlIEZPUk1BVF9JTlRaOgorCQkJcmV0dXJuIHRydWU7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlib29sIFN1cmZhY2U6OmlzRGVwdGgoRm9ybWF0IGZvcm1hdCkKKwl7CisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJY2FzZSBGT1JNQVRfRDMyOgorCQljYXNlIEZPUk1BVF9EMTY6CisJCWNhc2UgRk9STUFUX0QyNFg4OgorCQljYXNlIEZPUk1BVF9EMjRTODoKKwkJY2FzZSBGT1JNQVRfRDI0RlM4OgorCQljYXNlIEZPUk1BVF9EMzJGOgorCQljYXNlIEZPUk1BVF9EMzJGX0NPTVBMRU1FTlRBUlk6CisJCWNhc2UgRk9STUFUX0QzMkZfTE9DS0FCTEU6CisJCWNhc2UgRk9STUFUX0RGMjQ6CisJCWNhc2UgRk9STUFUX0RGMTY6CisJCWNhc2UgRk9STUFUX0QzMkZfVEVYVFVSRToKKwkJY2FzZSBGT1JNQVRfRDMyRl9TSEFET1c6CisJCWNhc2UgRk9STUFUX0lOVFo6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJY2FzZSBGT1JNQVRfUzg6CisJCQlyZXR1cm4gZmFsc2U7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlib29sIFN1cmZhY2U6OmlzUGFsZXR0ZShGb3JtYXQgZm9ybWF0KQorCXsKKwkJc3dpdGNoKGZvcm1hdCkKKwkJeworCQljYXNlIEZPUk1BVF9QODoKKwkJY2FzZSBGT1JNQVRfQThQODoKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJYm9vbCBTdXJmYWNlOjppc0Zsb2F0Rm9ybWF0KEZvcm1hdCBmb3JtYXQpCisJeworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9BOFI4RzhCODoKKwkJY2FzZSBGT1JNQVRfRzhSODoKKwkJY2FzZSBGT1JNQVRfRzE2UjE2OgorCQljYXNlIEZPUk1BVF9BMTZCMTZHMTZSMTY6CisJCWNhc2UgRk9STUFUX1Y4VTg6CisJCWNhc2UgRk9STUFUX1E4VzhWOFU4OgorCQljYXNlIEZPUk1BVF9YOEw4VjhVODoKKwkJY2FzZSBGT1JNQVRfVjE2VTE2OgorCQljYXNlIEZPUk1BVF9BMTZXMTZWMTZVMTY6CisJCWNhc2UgRk9STUFUX1ExNlcxNlYxNlUxNjoKKwkJY2FzZSBGT1JNQVRfQTg6CisJCWNhc2UgRk9STUFUX1I4OgorCQljYXNlIEZPUk1BVF9MODoKKwkJY2FzZSBGT1JNQVRfTDE2OgorCQljYXNlIEZPUk1BVF9BOEw4OgorCQkJcmV0dXJuIGZhbHNlOworCQljYXNlIEZPUk1BVF9SMzJGOgorCQljYXNlIEZPUk1BVF9HMzJSMzJGOgorCQljYXNlIEZPUk1BVF9BMzJCMzJHMzJSMzJGOgorCQljYXNlIEZPUk1BVF9EMzJGOgorCQljYXNlIEZPUk1BVF9EMzJGX0NPTVBMRU1FTlRBUlk6CisJCWNhc2UgRk9STUFUX0QzMkZfTE9DS0FCTEU6CisJCWNhc2UgRk9STUFUX0QzMkZfVEVYVFVSRToKKwkJY2FzZSBGT1JNQVRfRDMyRl9TSEFET1c6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlib29sIFN1cmZhY2U6OmlzVW5zaWduZWRDb21wb25lbnQoRm9ybWF0IGZvcm1hdCwgaW50IGNvbXBvbmVudCkKKwl7CisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJY2FzZSBGT1JNQVRfTlVMTDoKKwkJY2FzZSBGT1JNQVRfWDhSOEc4Qjg6CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9HOFI4OgorCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNjoKKwkJY2FzZSBGT1JNQVRfRDMyRjoKKwkJY2FzZSBGT1JNQVRfRDMyRl9DT01QTEVNRU5UQVJZOgorCQljYXNlIEZPUk1BVF9EMzJGX0xPQ0tBQkxFOgorCQljYXNlIEZPUk1BVF9EMzJGX1RFWFRVUkU6CisJCWNhc2UgRk9STUFUX0QzMkZfU0hBRE9XOgorCQljYXNlIEZPUk1BVF9BODoKKwkJY2FzZSBGT1JNQVRfUjg6CisJCWNhc2UgRk9STUFUX0w4OgorCQljYXNlIEZPUk1BVF9MMTY6CisJCWNhc2UgRk9STUFUX0E4TDg6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJY2FzZSBGT1JNQVRfVjhVODoKKwkJY2FzZSBGT1JNQVRfWDhMOFY4VTg6CisJCWNhc2UgRk9STUFUX1YxNlUxNjoKKwkJCWlmKGNvbXBvbmVudCA8IDIpCisJCQl7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQljYXNlIEZPUk1BVF9BMTZXMTZWMTZVMTY6CisJCQlpZihjb21wb25lbnQgPCAzKQorCQkJeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJY2FzZSBGT1JNQVRfUThXOFY4VTg6CisJCWNhc2UgRk9STUFUX1ExNlcxNlYxNlUxNjoKKwkJCXJldHVybiBmYWxzZTsKKwkJY2FzZSBGT1JNQVRfUjMyRjoKKwkJCWlmKGNvbXBvbmVudCA8IDEpCisJCQl7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQljYXNlIEZPUk1BVF9HMzJSMzJGOgorCQkJaWYoY29tcG9uZW50IDwgMikKKwkJCXsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCWNhc2UgRk9STUFUX0EzMkIzMkczMlIzMkY6CisJCQlyZXR1cm4gZmFsc2U7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBTdXJmYWNlOjppc1NSR0JyZWFkYWJsZShGb3JtYXQgZm9ybWF0KQorCXsKKwkJLy8gS2VlcCBpbiBzeW5jIHdpdGggQ2FwYWJpbGl0aWVzOjppc1NSR0JyZWFkYWJsZQorCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgRk9STUFUX0w4OgorCQljYXNlIEZPUk1BVF9BOEw4OgorCQljYXNlIEZPUk1BVF9SOEc4Qjg6CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJY2FzZSBGT1JNQVRfQThCOEc4Ujg6CisJCWNhc2UgRk9STUFUX1g4QjhHOFI4OgorCQljYXNlIEZPUk1BVF9SNUc2QjU6CisJCWNhc2UgRk9STUFUX1gxUjVHNUI1OgorCQljYXNlIEZPUk1BVF9BMVI1RzVCNToKKwkJY2FzZSBGT1JNQVRfQTRSNEc0QjQ6CisJCSNpZiBTM1RDX1NVUFBPUlQKKwkJY2FzZSBGT1JNQVRfRFhUMToKKwkJY2FzZSBGT1JNQVRfRFhUMzoKKwkJY2FzZSBGT1JNQVRfRFhUNToKKwkJY2FzZSBGT1JNQVRfQVRJMToKKwkJY2FzZSBGT1JNQVRfQVRJMjoKKwkJI2VuZGlmCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlib29sIFN1cmZhY2U6OmlzU1JHQndyaXRhYmxlKEZvcm1hdCBmb3JtYXQpCisJeworCQkvLyBLZWVwIGluIHN5bmMgd2l0aCBDYXBhYmlsaXRpZXM6OmlzU1JHQndyaXRhYmxlCisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJY2FzZSBGT1JNQVRfTlVMTDoKKwkJY2FzZSBGT1JNQVRfQThSOEc4Qjg6CisJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9BOEI4RzhSODoKKwkJY2FzZSBGT1JNQVRfWDhCOEc4Ujg6CisJCWNhc2UgRk9STUFUX1I1RzZCNToKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJYm9vbCBTdXJmYWNlOjppc0NvbXByZXNzZWQoRm9ybWF0IGZvcm1hdCkKKwl7CisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJI2lmIFMzVENfU1VQUE9SVAorCQljYXNlIEZPUk1BVF9EWFQxOgorCQljYXNlIEZPUk1BVF9EWFQzOgorCQljYXNlIEZPUk1BVF9EWFQ1OgorCQljYXNlIEZPUk1BVF9BVEkxOgorCQljYXNlIEZPUk1BVF9BVEkyOgorCQkJcmV0dXJuIHRydWU7CisJCSNlbmRpZgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJaW50IFN1cmZhY2U6OmNvbXBvbmVudENvdW50KEZvcm1hdCBmb3JtYXQpCisJeworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgkJcmV0dXJuIDM7CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgkJcmV0dXJuIDQ7CisJCWNhc2UgRk9STUFUX0c4Ujg6CQkJcmV0dXJuIDI7CisJCWNhc2UgRk9STUFUX0cxNlIxNjoJCQlyZXR1cm4gMjsKKwkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2OglyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfVjhVODoJCQlyZXR1cm4gMjsKKwkJY2FzZSBGT1JNQVRfUThXOFY4VTg6CQlyZXR1cm4gNDsKKwkJY2FzZSBGT1JNQVRfWDhMOFY4VTg6CQlyZXR1cm4gMzsKKwkJY2FzZSBGT1JNQVRfVjE2VTE2OgkJCXJldHVybiAyOworCQljYXNlIEZPUk1BVF9BMTZXMTZWMTZVMTY6CXJldHVybiA0OworCQljYXNlIEZPUk1BVF9RMTZXMTZWMTZVMTY6CXJldHVybiA0OworCQljYXNlIEZPUk1BVF9SMzJGOgkJCXJldHVybiAxOworCQljYXNlIEZPUk1BVF9HMzJSMzJGOgkJcmV0dXJuIDI7CisJCWNhc2UgRk9STUFUX0EzMkIzMkczMlIzMkY6CXJldHVybiA0OworCQljYXNlIEZPUk1BVF9EMzJGX0xPQ0tBQkxFOglyZXR1cm4gMTsKKwkJY2FzZSBGT1JNQVRfRDMyRl9URVhUVVJFOglyZXR1cm4gMTsKKwkJY2FzZSBGT1JNQVRfRDMyRl9TSEFET1c6CXJldHVybiAxOworCQljYXNlIEZPUk1BVF9BODoJCQkJcmV0dXJuIDE7CisJCWNhc2UgRk9STUFUX1I4OgkJCQlyZXR1cm4gMTsKKwkJY2FzZSBGT1JNQVRfTDg6CQkJCXJldHVybiAxOworCQljYXNlIEZPUk1BVF9MMTY6CQkJcmV0dXJuIDE7CisJCWNhc2UgRk9STUFUX0E4TDg6CQkJcmV0dXJuIDI7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJdm9pZCAqU3VyZmFjZTo6YWxsb2NhdGVCdWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIEZvcm1hdCBmb3JtYXQpCisJeworCQlpbnQgd2lkdGg0ID0gKHdpZHRoICsgMykgJiB+MzsKKwkJaW50IGhlaWdodDQgPSAoaGVpZ2h0ICsgMykgJiB+MzsKKworCQl2b2lkICpidWZmZXIgPSBhbGxvY2F0ZShzaXplKHdpZHRoNCwgaGVpZ2h0NCwgZGVwdGgsIGZvcm1hdCkpOworCisJCXJldHVybiBidWZmZXI7CisJfQorCisJdm9pZCBTdXJmYWNlOjptZW1maWxsKHZvaWQgKmJ1ZmZlciwgaW50IHBhdHRlcm4sIGludCBieXRlcykKKwl7CisJCXdoaWxlKChzaXplX3QpYnVmZmVyICYgMHgxICYmIGJ5dGVzID49IDEpCisJCXsKKwkJCSooY2hhciopYnVmZmVyID0gKGNoYXIpcGF0dGVybjsKKwkJCShjaGFyKiYpYnVmZmVyICs9IDE7CisJCQlieXRlcyAtPSAxOworCQl9CisKKwkJd2hpbGUoKHNpemVfdClidWZmZXIgJiAweDMgJiYgYnl0ZXMgPj0gMikKKwkJeworCQkJKihzaG9ydCopYnVmZmVyID0gKHNob3J0KXBhdHRlcm47CisJCQkoc2hvcnQqJilidWZmZXIgKz0gMTsKKwkJCWJ5dGVzIC09IDI7CisJCX0KKworCQlpZihDUFVJRDo6c3VwcG9ydHNTU0UoKSkKKwkJeworCQkJd2hpbGUoKHNpemVfdClidWZmZXIgJiAweEYgJiYgYnl0ZXMgPj0gNCkKKwkJCXsKKwkJCQkqKGludCopYnVmZmVyID0gcGF0dGVybjsKKwkJCQkoaW50KiYpYnVmZmVyICs9IDE7CisJCQkJYnl0ZXMgLT0gNDsKKwkJCX0KKworCQkJX19tMTI4IHF1YWQgPSBfbW1fc2V0X3BzMSgoZmxvYXQmKXBhdHRlcm4pOworCQkJCisJCQlmbG9hdCAqcG9pbnRlciA9IChmbG9hdCopYnVmZmVyOworCQkJaW50IHF4d29yZHMgPSBieXRlcyAvIDY0OworCQkJYnl0ZXMgLT0gcXh3b3JkcyAqIDY0OworCisJCQl3aGlsZShxeHdvcmRzLS0pCisJCQl7CisJCQkJX21tX3N0cmVhbV9wcyhwb2ludGVyICsgMCwgcXVhZCk7CisJCQkJX21tX3N0cmVhbV9wcyhwb2ludGVyICsgNCwgcXVhZCk7CisJCQkJX21tX3N0cmVhbV9wcyhwb2ludGVyICsgOCwgcXVhZCk7CisJCQkJX21tX3N0cmVhbV9wcyhwb2ludGVyICsgMTIsIHF1YWQpOworCisJCQkJcG9pbnRlciArPSAxNjsKKwkJCX0KKworCQkJYnVmZmVyID0gcG9pbnRlcjsKKwkJfQorCisJCXdoaWxlKGJ5dGVzID49IDQpCisJCXsKKwkJCSooaW50KilidWZmZXIgPSAoaW50KXBhdHRlcm47CisJCQkoaW50KiYpYnVmZmVyICs9IDE7CisJCQlieXRlcyAtPSA0OworCQl9CisKKwkJd2hpbGUoYnl0ZXMgPj0gMikKKwkJeworCQkJKihzaG9ydCopYnVmZmVyID0gKHNob3J0KXBhdHRlcm47CisJCQkoc2hvcnQqJilidWZmZXIgKz0gMTsKKwkJCWJ5dGVzIC09IDI7CisJCX0KKworCQl3aGlsZShieXRlcyA+PSAxKQorCQl7CisJCQkqKGNoYXIqKWJ1ZmZlciA9IChjaGFyKXBhdHRlcm47CisJCQkoY2hhciomKWJ1ZmZlciArPSAxOworCQkJYnl0ZXMgLT0gMTsKKwkJfQorCX0KKworCXZvaWQgU3VyZmFjZTo6Y2xlYXJDb2xvckJ1ZmZlcih1bnNpZ25lZCBpbnQgY29sb3IsIHVuc2lnbmVkIGludCByZ2JhTWFzaywgaW50IHgwLCBpbnQgeTAsIGludCB3aWR0aCwgaW50IGhlaWdodCkKKwl7CisJCS8vIEZJWE1FOiBBbHNvIGNsZWFyIGJ1ZmZlcnMgaW4gb3RoZXIgZm9ybWF0cz8KKworCQkvLyBOb3Qgb3ZlcmxhcHBpbmcKKwkJaWYoeDAgPiBpbnRlcm5hbC53aWR0aCkgcmV0dXJuOworCQlpZih5MCA+IGludGVybmFsLmhlaWdodCkgcmV0dXJuOworCQlpZih4MCArIHdpZHRoIDwgMCkgcmV0dXJuOworCQlpZih5MCArIGhlaWdodCA8IDApIHJldHVybjsKKworCQkvLyBDbGlwIGFnYWluc3QgZGltZW5zaW9ucworCQlpZih4MCA8IDApIHt3aWR0aCArPSB4MDsgeDAgPSAwO30KKwkJaWYoeDAgKyB3aWR0aCA+IGludGVybmFsLndpZHRoKSB3aWR0aCA9IGludGVybmFsLndpZHRoIC0geDA7CisJCWlmKHkwIDwgMCkge2hlaWdodCArPSB5MDsgeTAgPSAwO30KKwkJaWYoeTAgKyBoZWlnaHQgPiBpbnRlcm5hbC5oZWlnaHQpIGhlaWdodCA9IGludGVybmFsLmhlaWdodCAtIHkwOworCisJCWNvbnN0IGJvb2wgZW50aXJlID0geDAgPT0gMCAmJiB5MCA9PSAwICYmIHdpZHRoID09IGludGVybmFsLndpZHRoICYmIGhlaWdodCA9PSBpbnRlcm5hbC5oZWlnaHQ7CisJCWNvbnN0IExvY2sgbG9jayA9IGVudGlyZSA/IExPQ0tfRElTQ0FSRCA6IExPQ0tfV1JJVEVPTkxZOworCisJCWludCB3aWR0aDIgPSAoaW50ZXJuYWwud2lkdGggKyAxKSAmIH4xOworCisJCWludCB4MSA9IHgwICsgd2lkdGg7CisJCWludCB5MSA9IHkwICsgaGVpZ2h0OworCisJCWludCBieXRlcyA9IDQgKiAoeDEgLSB4MCk7CisKKwkvLwlpZihsb2NrYWJsZSB8fCAhcXVhZExheW91dEVuYWJsZWQpCisJCXsKKwkJCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKilsb2NrSW50ZXJuYWwoeDAsIHkwLCAwLCBsb2NrLCBQVUJMSUMpOworCisJCQl1bnNpZ25lZCBjaGFyIHI4ID0gKGNvbG9yICYgMHgwMEZGMDAwMCkgPj4gMTY7CisJCQl1bnNpZ25lZCBjaGFyIGc4ID0gKGNvbG9yICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJCXVuc2lnbmVkIGNoYXIgYjggPSAoY29sb3IgJiAweDAwMDAwMEZGKSA+PiAwOworCQkJdW5zaWduZWQgY2hhciBhOCA9IChjb2xvciAmIDB4RkYwMDAwMDApID4+IDI0OworCisJCQl1bnNpZ25lZCBzaG9ydCByMTYgPSAocjggPDwgOCkgKyByODsKKwkJCXVuc2lnbmVkIHNob3J0IGcxNiA9IChnOCA8PCA4KSArIGc4OworCQkJdW5zaWduZWQgc2hvcnQgYjE2ID0gKGI4IDw8IDgpICsgYjg7CisJCQl1bnNpZ25lZCBzaG9ydCBhMTYgPSAoYTggPDwgOCkgKyBhODsKKworCQkJZmxvYXQgcjMyZiA9IHI4IC8gMjU1LjBmOworCQkJZmxvYXQgZzMyZiA9IGc4IC8gMjU1LjBmOworCQkJZmxvYXQgYjMyZiA9IGI4IC8gMjU1LjBmOworCQkJZmxvYXQgYTMyZiA9IGE4IC8gMjU1LjBmOworCQkJCisJCQl1bnNpZ25lZCBjaGFyIGc4cjhbNF0gPSB7cjgsIGc4LCByOCwgZzh9OworCQkJdW5zaWduZWQgc2hvcnQgZzE2cjE2WzJdID0ge3IxNiwgZzE2fTsKKworCQkJZm9yKGludCB6ID0gMDsgeiA8IGludGVybmFsLmRlcHRoOyB6KyspCisJCQl7CisJCQkJdW5zaWduZWQgY2hhciAqdGFyZ2V0ID0gYnVmZmVyOworCisJCQkJZm9yKGludCB5ID0geTA7IHkgPCB5MTsgeSsrKQorCQkJCXsKKwkJCQkJc3dpdGNoKGludGVybmFsLmZvcm1hdCkKKwkJCQkJeworCQkJCQljYXNlIEZPUk1BVF9OVUxMOgorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQkJCQljYXNlIEZPUk1BVF9BOFI4RzhCODoKKwkJCQkvLwljYXNlIEZPUk1BVF9YOEc4UjhCOFE6ICAgLy8gRklYTUUKKwkJCQkvLwljYXNlIEZPUk1BVF9BOEc4UjhCOFE6ICAgLy8gRklYTUUKKwkJCQkJCWlmKHJnYmFNYXNrID09IDB4RiB8fCAoaW50ZXJuYWwuZm9ybWF0ID09IEZPUk1BVF9YOFI4RzhCOCAmJiByZ2JhTWFzayA9PSAweEYpKQorCQkJCQkJeworCQkJCQkJCW1lbWZpbGwodGFyZ2V0LCBjb2xvciwgNCAqICh4MSAtIHgwKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJdW5zaWduZWQgaW50IGJncmFNYXNrID0gKHJnYmFNYXNrICYgMHgxID8gMHgwMEZGMDAwMCA6IDApIHwgKHJnYmFNYXNrICYgMHgyID8gMHgwMDAwRkYwMCA6IDApIHwgKHJnYmFNYXNrICYgMHg0ID8gMHgwMDAwMDBGRiA6IDApIHwgKHJnYmFNYXNrICYgMHg4ID8gMHhGRjAwMDAwMCA6IDApOworCQkJCQkJCXVuc2lnbmVkIGludCBpbnZNYXNrID0gfmJncmFNYXNrOworCQkJCQkJCXVuc2lnbmVkIGludCBtYXNrZWRDb2xvciA9IGNvbG9yICYgYmdyYU1hc2s7CisJCQkJCQkJdW5zaWduZWQgaW50ICp0YXJnZXQzMiA9ICh1bnNpZ25lZCBpbnQqKXRhcmdldDsKKworCQkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQkJCXsKKwkJCQkJCQkJdGFyZ2V0MzJbeF0gPSBtYXNrZWRDb2xvciB8ICh0YXJnZXQzMlt4XSAmIGludk1hc2spOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEZPUk1BVF9HOFI4OgorCQkJCQkJaWYoKHJnYmFNYXNrICYgMHgzKSA9PSAweDMpCisJCQkJCQl7CisJCQkJCQkJbWVtZmlsbCh0YXJnZXQsIChpbnQmKWc4cjgsIDIgKiAoeDEgLSB4MCkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXVuc2lnbmVkIHNob3J0IHJnTWFzayA9IChyZ2JhTWFzayAmIDB4MSA/IDB4MDAwMDAwRkYgOiAwKSB8IChyZ2JhTWFzayAmIDB4MiA/IDB4MDAwMEZGMDAgOiAwKTsKKwkJCQkJCQl1bnNpZ25lZCBzaG9ydCBpbnZNYXNrID0gfnJnTWFzazsKKwkJCQkJCQl1bnNpZ25lZCBzaG9ydCBtYXNrZWRDb2xvciA9ICh1bnNpZ25lZCBzaG9ydCYpZzhyOCAmIHJnTWFzazsKKwkJCQkJCQl1bnNpZ25lZCBzaG9ydCAqdGFyZ2V0MTYgPSAodW5zaWduZWQgc2hvcnQqKXRhcmdldDsKKworCQkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQkJCXsKKwkJCQkJCQkJdGFyZ2V0MTZbeF0gPSBtYXNrZWRDb2xvciB8ICh0YXJnZXQxNlt4XSAmIGludk1hc2spOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCQkJCQlpZigocmdiYU1hc2sgJiAweDMpID09IDB4MykKKwkJCQkJCXsKKwkJCQkJCQltZW1maWxsKHRhcmdldCwgKGludCYpZzE2cjE2LCA0ICogKHgxIC0geDApKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgcmdNYXNrID0gKHJnYmFNYXNrICYgMHgxID8gMHgwMDAwRkZGRiA6IDApIHwgKHJnYmFNYXNrICYgMHgyID8gMHhGRkZGMDAwMCA6IDApOworCQkJCQkJCXVuc2lnbmVkIGludCBpbnZNYXNrID0gfnJnTWFzazsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgbWFza2VkQ29sb3IgPSAodW5zaWduZWQgaW50JilnMTZyMTYgJiByZ01hc2s7CisJCQkJCQkJdW5zaWduZWQgaW50ICp0YXJnZXQzMiA9ICh1bnNpZ25lZCBpbnQqKXRhcmdldDsKKworCQkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQkJCXsKKwkJCQkJCQkJdGFyZ2V0MzJbeF0gPSBtYXNrZWRDb2xvciB8ICh0YXJnZXQzMlt4XSAmIGludk1hc2spOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEZPUk1BVF9BMTZCMTZHMTZSMTY6CisJCQkJCQlpZihyZ2JhTWFzayA9PSAweEYpCisJCQkJCQl7CisJCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCQkJCQkJeworCQkJCQkJCQkoKHVuc2lnbmVkIHNob3J0Kil0YXJnZXQpWzQgKiB4ICsgMF0gPSByMTY7CisJCQkJCQkJCSgodW5zaWduZWQgc2hvcnQqKXRhcmdldClbNCAqIHggKyAxXSA9IGcxNjsKKwkJCQkJCQkJKCh1bnNpZ25lZCBzaG9ydCopdGFyZ2V0KVs0ICogeCArIDJdID0gYjE2OworCQkJCQkJCQkoKHVuc2lnbmVkIHNob3J0Kil0YXJnZXQpWzQgKiB4ICsgM10gPSBhMTY7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWlmKHJnYmFNYXNrICYgMHgxKSBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgKCh1bnNpZ25lZCBzaG9ydCopdGFyZ2V0KVs0ICogeCArIDBdID0gcjE2OworCQkJCQkJCWlmKHJnYmFNYXNrICYgMHgyKSBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgKCh1bnNpZ25lZCBzaG9ydCopdGFyZ2V0KVs0ICogeCArIDFdID0gZzE2OworCQkJCQkJCWlmKHJnYmFNYXNrICYgMHg0KSBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgKCh1bnNpZ25lZCBzaG9ydCopdGFyZ2V0KVs0ICogeCArIDJdID0gYjE2OworCQkJCQkJCWlmKHJnYmFNYXNrICYgMHg4KSBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgKCh1bnNpZ25lZCBzaG9ydCopdGFyZ2V0KVs0ICogeCArIDNdID0gYTE2OworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRk9STUFUX1IzMkY6CisJCQkJCQlpZihyZ2JhTWFzayAmIDB4MSkKKwkJCQkJCXsKKwkJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkJCQkJCQl7CisJCQkJCQkJCSgoZmxvYXQqKXRhcmdldClbeF0gPSByMzJmOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEZPUk1BVF9HMzJSMzJGOgorCQkJCQkJaWYoKHJnYmFNYXNrICYgMHgzKSA9PSAweDMpCisJCQkJCQl7CisJCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCQkJCQkJeworCQkJCQkJCQkoKGZsb2F0Kil0YXJnZXQpWzIgKiB4ICsgMF0gPSByMzJmOworCQkJCQkJCQkoKGZsb2F0Kil0YXJnZXQpWzIgKiB4ICsgMV0gPSBnMzJmOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpZihyZ2JhTWFzayAmIDB4MSkgZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspICgoZmxvYXQqKXRhcmdldClbMiAqIHggKyAwXSA9IHIzMmY7CisJCQkJCQkJaWYocmdiYU1hc2sgJiAweDIpIGZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSAoKGZsb2F0Kil0YXJnZXQpWzIgKiB4ICsgMV0gPSBnMzJmOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRk9STUFUX0EzMkIzMkczMlIzMkY6CisJCQkJCQlpZihyZ2JhTWFzayA9PSAweEYpCisJCQkJCQl7CisJCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCQkJCQkJeworCQkJCQkJCQkoKGZsb2F0Kil0YXJnZXQpWzQgKiB4ICsgMF0gPSByMzJmOworCQkJCQkJCQkoKGZsb2F0Kil0YXJnZXQpWzQgKiB4ICsgMV0gPSBnMzJmOworCQkJCQkJCQkoKGZsb2F0Kil0YXJnZXQpWzQgKiB4ICsgMl0gPSBiMzJmOworCQkJCQkJCQkoKGZsb2F0Kil0YXJnZXQpWzQgKiB4ICsgM10gPSBhMzJmOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpZihyZ2JhTWFzayAmIDB4MSkgZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspICgoZmxvYXQqKXRhcmdldClbNCAqIHggKyAwXSA9IHIzMmY7CisJCQkJCQkJaWYocmdiYU1hc2sgJiAweDIpIGZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSAoKGZsb2F0Kil0YXJnZXQpWzQgKiB4ICsgMV0gPSBnMzJmOworCQkJCQkJCWlmKHJnYmFNYXNrICYgMHg0KSBmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgKChmbG9hdCopdGFyZ2V0KVs0ICogeCArIDJdID0gYjMyZjsKKwkJCQkJCQlpZihyZ2JhTWFzayAmIDB4OCkgZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspICgoZmxvYXQqKXRhcmdldClbNCAqIHggKyAzXSA9IGEzMmY7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJCX0KKworCQkJCQl0YXJnZXQgKz0gaW50ZXJuYWwucGl0Y2hCOworCQkJCX0KKworCQkJCWJ1ZmZlciArPSBpbnRlcm5hbC5zbGljZUI7CisJCQl9CisKKwkJCXVubG9ja0ludGVybmFsKCk7CisJCX0KKwkvKgllbHNlCisJCXsKKwkJLy8JdW5zaWduZWQgY2hhciAqdGFyZ2V0ID0gKHVuc2lnbmVkIGNoYXIqJilidWZmZXI7CisJCS8vCisJCS8vCWZvcihpbnQgeSA9IHkwOyB5IDwgeTE7IHkrKykKKwkJLy8JeworCQkvLwkJZm9yKGludCB4ID0geDA7IHggPCB4MTsgeCsrKQorCQkvLwkJeworCQkvLwkJCXRhcmdldFt3aWR0aDIgKiA0ICogKHkgJiB+MSkgKyAyICogKHkgJiAxKSArIDggKiAoeCAmIH4xKSArICh4ICYgMSkgKyAwXSA9ICAoY29sb3IgJiAweDAwMDAwMEZGKSA+PiAwOworCQkvLwkJCXRhcmdldFt3aWR0aDIgKiA0ICogKHkgJiB+MSkgKyAyICogKHkgJiAxKSArIDggKiAoeCAmIH4xKSArICh4ICYgMSkgKyA0XSA9ICAoY29sb3IgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJLy8JCQl0YXJnZXRbd2lkdGgyICogNCAqICh5ICYgfjEpICsgMiAqICh5ICYgMSkgKyA4ICogKHggJiB+MSkgKyAoeCAmIDEpICsgOF0gPSAgKGNvbG9yICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJLy8JCQl0YXJnZXRbd2lkdGgyICogNCAqICh5ICYgfjEpICsgMiAqICh5ICYgMSkgKyA4ICogKHggJiB+MSkgKyAoeCAmIDEpICsgMTJdID0gKGNvbG9yICYgMHhGRjAwMDAwMCkgPj4gMjQ7CisJCS8vCQl9CisJCS8vCX0KKworCQkJdW5zaWduZWQgY2hhciBjb2xvclFbMTZdOworCisJCQljb2xvclFbMF0gPSAgKGNvbG9yICYgMHgwMDAwMDBGRikgPj4gMDsKKwkJCWNvbG9yUVsxXSA9ICAoY29sb3IgJiAweDAwMDAwMEZGKSA+PiAwOworCQkJY29sb3JRWzJdID0gIChjb2xvciAmIDB4MDAwMDAwRkYpID4+IDA7CisJCQljb2xvclFbM10gPSAgKGNvbG9yICYgMHgwMDAwMDBGRikgPj4gMDsKKwkJCWNvbG9yUVs0XSA9ICAoY29sb3IgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJCWNvbG9yUVs1XSA9ICAoY29sb3IgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJCWNvbG9yUVs2XSA9ICAoY29sb3IgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJCWNvbG9yUVs3XSA9ICAoY29sb3IgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJCWNvbG9yUVs4XSA9ICAoY29sb3IgJiAweDAwMDBGRjAwKSA+PiA4OworCQkJY29sb3JRWzldID0gIChjb2xvciAmIDB4MDAwMEZGMDApID4+IDg7CisJCQljb2xvclFbMTBdID0gKGNvbG9yICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJCWNvbG9yUVsxMV0gPSAoY29sb3IgJiAweDAwMDBGRjAwKSA+PiA4OworCQkJY29sb3JRWzEyXSA9IChjb2xvciAmIDB4RkYwMDAwMDApID4+IDI0OworCQkJY29sb3JRWzEzXSA9IChjb2xvciAmIDB4RkYwMDAwMDApID4+IDI0OworCQkJY29sb3JRWzE0XSA9IChjb2xvciAmIDB4RkYwMDAwMDApID4+IDI0OworCQkJY29sb3JRWzE1XSA9IChjb2xvciAmIDB4RkYwMDAwMDApID4+IDI0OworCisJCQlmb3IoaW50IHkgPSB5MDsgeSA8IHkxOyB5KyspCisJCQl7CisJCQkJdW5zaWduZWQgY2hhciAqdGFyZ2V0ID0gKHVuc2lnbmVkIGNoYXIqKWxvY2tJbnRlcm5hbCgwLCAwLCAwLCBsb2NrKSArIHdpZHRoMiAqIDQgKiAoeSAmIH4xKSArIDIgKiAoeSAmIDEpOyAgIC8vIEZJWE1FOiBVbmxvY2sKKworCQkJCWlmKCh5ICYgMSkgPT0gMCAmJiB5ICsgMSA8IHkxKSAgIC8vIEZpbGwgcXVhZCBsaW5lIGF0IG9uY2UKKwkJCQl7CisJCQkJCWlmKCh4MCAmIDEpICE9IDApCisJCQkJCXsKKwkJCQkJCXRhcmdldFs4ICogKHgwICYgfjEpICsgMSArIDBdID0gIChjb2xvciAmIDB4MDAwMDAwRkYpID4+IDA7CisJCQkJCQl0YXJnZXRbOCAqICh4MCAmIH4xKSArIDEgKyA0XSA9ICAoY29sb3IgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJCQkJCXRhcmdldFs4ICogKHgwICYgfjEpICsgMSArIDhdID0gIChjb2xvciAmIDB4MDAwMEZGMDApID4+IDg7CisJCQkJCQl0YXJnZXRbOCAqICh4MCAmIH4xKSArIDEgKyAxMl0gPSAoY29sb3IgJiAweEZGMDAwMDAwKSA+PiAyNDsKKworCQkJCQkJdGFyZ2V0WzggKiAoeDAgJiB+MSkgKyAzICsgMF0gPSAgKGNvbG9yICYgMHgwMDAwMDBGRikgPj4gMDsKKwkJCQkJCXRhcmdldFs4ICogKHgwICYgfjEpICsgMyArIDRdID0gIChjb2xvciAmIDB4MDBGRjAwMDApID4+IDE2OworCQkJCQkJdGFyZ2V0WzggKiAoeDAgJiB+MSkgKyAzICsgOF0gPSAgKGNvbG9yICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJCQkJCXRhcmdldFs4ICogKHgwICYgfjEpICsgMyArIDEyXSA9IChjb2xvciAmIDB4RkYwMDAwMDApID4+IDI0OworCQkJCQl9CisKKwkJCQkJX19hc20KKwkJCQkJeworCQkJCQkJbW92cSBtbTAsIGNvbG9yUSswCisJCQkJCQltb3ZxIG1tMSwgY29sb3JRKzgKKworCQkJCQkJbW92IGVheCwgeDAKKwkJCQkJCWFkZCBlYXgsIDEKKwkJCQkJCWFuZCBlYXgsIDB4RkZGRkZGRkUKKwkJCQkJCWNtcCBlYXgsIHgxCisJCQkJCQlqZ2UgcUVuZAorCisJCQkJCQltb3YgZWRpLCB0YXJnZXQKKworCQkJCQlxTG9vcDoKKwkJCQkJCW1vdm50cSBbZWRpKzgqZWF4KzBdLCBtbTAKKwkJCQkJCW1vdm50cSBbZWRpKzgqZWF4KzhdLCBtbTEKKworCQkJCQkJYWRkIGVheCwgMgorCQkJCQkJY21wIGVheCwgeDEKKwkJCQkJCWpsIHFMb29wCisJCQkJCXFFbmQ6CisJCQkJCQllbW1zCisJCQkJCX0KKworCQkJCQlpZigoeDEgJiAxKSAhPSAwKQorCQkJCQl7CisJCQkJCQl0YXJnZXRbOCAqICh4MSAmIH4xKSArIDAgKyAwXSA9ICAoY29sb3IgJiAweDAwMDAwMEZGKSA+PiAwOworCQkJCQkJdGFyZ2V0WzggKiAoeDEgJiB+MSkgKyAwICsgNF0gPSAgKGNvbG9yICYgMHgwMEZGMDAwMCkgPj4gMTY7CisJCQkJCQl0YXJnZXRbOCAqICh4MSAmIH4xKSArIDAgKyA4XSA9ICAoY29sb3IgJiAweDAwMDBGRjAwKSA+PiA4OworCQkJCQkJdGFyZ2V0WzggKiAoeDEgJiB+MSkgKyAwICsgMTJdID0gKGNvbG9yICYgMHhGRjAwMDAwMCkgPj4gMjQ7CisKKwkJCQkJCXRhcmdldFs4ICogKHgxICYgfjEpICsgMiArIDBdID0gIChjb2xvciAmIDB4MDAwMDAwRkYpID4+IDA7CisJCQkJCQl0YXJnZXRbOCAqICh4MSAmIH4xKSArIDIgKyA0XSA9ICAoY29sb3IgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJCQkJCXRhcmdldFs4ICogKHgxICYgfjEpICsgMiArIDhdID0gIChjb2xvciAmIDB4MDAwMEZGMDApID4+IDg7CisJCQkJCQl0YXJnZXRbOCAqICh4MSAmIH4xKSArIDIgKyAxMl0gPSAoY29sb3IgJiAweEZGMDAwMDAwKSA+PiAyNDsKKwkJCQkJfQorCisJCQkJCXkrKzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZm9yKGludCB4ID0geDA7IHggPCB4MTsgeCsrKQorCQkJCQl7CisJCQkJCQl0YXJnZXRbOCAqICh4ICYgfjEpICsgKHggJiAxKSArIDBdID0gIChjb2xvciAmIDB4MDAwMDAwRkYpID4+IDA7CisJCQkJCQl0YXJnZXRbOCAqICh4ICYgfjEpICsgKHggJiAxKSArIDRdID0gIChjb2xvciAmIDB4MDBGRjAwMDApID4+IDE2OworCQkJCQkJdGFyZ2V0WzggKiAoeCAmIH4xKSArICh4ICYgMSkgKyA4XSA9ICAoY29sb3IgJiAweDAwMDBGRjAwKSA+PiA4OworCQkJCQkJdGFyZ2V0WzggKiAoeCAmIH4xKSArICh4ICYgMSkgKyAxMl0gPSAoY29sb3IgJiAweEZGMDAwMDAwKSA+PiAyNDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSovCisJfQorCisJdm9pZCBTdXJmYWNlOjpjbGVhckRlcHRoQnVmZmVyKGZsb2F0IGRlcHRoLCBpbnQgeDAsIGludCB5MCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorCXsKKwkJLy8gTm90IG92ZXJsYXBwaW5nCisJCWlmKHgwID4gaW50ZXJuYWwud2lkdGgpIHJldHVybjsKKwkJaWYoeTAgPiBpbnRlcm5hbC5oZWlnaHQpIHJldHVybjsKKwkJaWYoeDAgKyB3aWR0aCA8IDApIHJldHVybjsKKwkJaWYoeTAgKyBoZWlnaHQgPCAwKSByZXR1cm47CisKKwkJLy8gQ2xpcCBhZ2FpbnN0IGRpbWVuc2lvbnMKKwkJaWYoeDAgPCAwKSB7d2lkdGggKz0geDA7IHgwID0gMDt9CisJCWlmKHgwICsgd2lkdGggPiBpbnRlcm5hbC53aWR0aCkgd2lkdGggPSBpbnRlcm5hbC53aWR0aCAtIHgwOworCQlpZih5MCA8IDApIHtoZWlnaHQgKz0geTA7IHkwID0gMDt9CisJCWlmKHkwICsgaGVpZ2h0ID4gaW50ZXJuYWwuaGVpZ2h0KSBoZWlnaHQgPSBpbnRlcm5hbC5oZWlnaHQgLSB5MDsKKworCQljb25zdCBib29sIGVudGlyZSA9IHgwID09IDAgJiYgeTAgPT0gMCAmJiB3aWR0aCA9PSBpbnRlcm5hbC53aWR0aCAmJiBoZWlnaHQgPT0gaW50ZXJuYWwuaGVpZ2h0OworCQljb25zdCBMb2NrIGxvY2sgPSBlbnRpcmUgPyBMT0NLX0RJU0NBUkQgOiBMT0NLX1dSSVRFT05MWTsKKworCQlpbnQgd2lkdGgyID0gKGludGVybmFsLndpZHRoICsgMSkgJiB+MTsKKworCQlpbnQgeDEgPSB4MCArIHdpZHRoOworCQlpbnQgeTEgPSB5MCArIGhlaWdodDsKKworCQlpZihpbnRlcm5hbC5mb3JtYXQgPT0gRk9STUFUX0QzMkZfTE9DS0FCTEUgfHwKKwkJICAgaW50ZXJuYWwuZm9ybWF0ID09IEZPUk1BVF9EMzJGX1RFWFRVUkUgfHwKKwkJICAgaW50ZXJuYWwuZm9ybWF0ID09IEZPUk1BVF9EMzJGX1NIQURPVykKKwkJeworCQkJZmxvYXQgKnRhcmdldCA9IChmbG9hdCopbG9ja0ludGVybmFsKDAsIDAsIDAsIGxvY2ssIFBVQkxJQykgKyB4MCArIHdpZHRoMiAqIHkwOworCisJCQlmb3IoaW50IHogPSAwOyB6IDwgaW50ZXJuYWwuZGVwdGg7IHorKykKKwkJCXsKKwkJCQlmb3IoaW50IHkgPSB5MDsgeSA8IHkxOyB5KyspCisJCQkJeworCQkJCQltZW1maWxsKHRhcmdldCwgKGludCYpZGVwdGgsIDQgKiB3aWR0aCk7CisJCQkJCXRhcmdldCArPSB3aWR0aDI7CisJCQkJfQorCQkJfQorCisJCQl1bmxvY2tJbnRlcm5hbCgpOworCQl9CisJCWVsc2UgICAvLyBRdWFkIGxheW91dAorCQl7CisJCQlpZihjb21wbGVtZW50YXJ5RGVwdGhCdWZmZXIpCisJCQl7CisJCQkJZGVwdGggPSAxIC0gZGVwdGg7CisJCQl9CisKKwkJCWZsb2F0ICpidWZmZXIgPSAoZmxvYXQqKWxvY2tJbnRlcm5hbCgwLCAwLCAwLCBsb2NrLCBQVUJMSUMpOworCisJCQlmb3IoaW50IHogPSAwOyB6IDwgaW50ZXJuYWwuZGVwdGg7IHorKykKKwkJCXsKKwkJCQlmb3IoaW50IHkgPSB5MDsgeSA8IHkxOyB5KyspCisJCQkJeworCQkJCQlmbG9hdCAqdGFyZ2V0ID0gYnVmZmVyICsgKHkgJiB+MSkgKiB3aWR0aDIgKyAoeSAmIDEpICogMjsKKwkJCQorCQkJCQlpZigoeSAmIDEpID09IDAgJiYgeSArIDEgPCB5MSkgICAvLyBGaWxsIHF1YWQgbGluZSBhdCBvbmNlCisJCQkJCXsKKwkJCQkJCWlmKCh4MCAmIDEpICE9IDApCisJCQkJCQl7CisJCQkJCQkJdGFyZ2V0Wyh4MCAmIH4xKSAqIDIgKyAxXSA9IGRlcHRoOworCQkJCQkJCXRhcmdldFsoeDAgJiB+MSkgKiAyICsgM10gPSBkZXB0aDsKKwkJCQkJCX0KKworCQkJCQkvLwlmb3IoaW50IHgyID0gKCh4MCArIDEpICYgfjEpICogMjsgeDIgPCB4MSAqIDI7IHgyICs9IDQpCisJCQkJCS8vCXsKKwkJCQkJLy8JCXRhcmdldFt4MiArIDBdID0gZGVwdGg7CisJCQkJCS8vCQl0YXJnZXRbeDIgKyAxXSA9IGRlcHRoOworCQkJCQkvLwkJdGFyZ2V0W3gyICsgMl0gPSBkZXB0aDsKKwkJCQkJLy8JCXRhcmdldFt4MiArIDNdID0gZGVwdGg7CisJCQkJCS8vCX0KKworCQkJCQkvLwlfX2FzbQorCQkJCQkvLwl7CisJCQkJCS8vCQltb3ZzcyB4bW0wLCBkZXB0aAorCQkJCQkvLwkJc2h1ZnBzIHhtbTAsIHhtbTAsIDB4MDAKKwkJCQkJLy8KKwkJCQkJLy8JCW1vdiBlYXgsIHgwCisJCQkJCS8vCQlhZGQgZWF4LCAxCisJCQkJCS8vCQlhbmQgZWF4LCAweEZGRkZGRkZFCisJCQkJCS8vCQljbXAgZWF4LCB4MQorCQkJCQkvLwkJamdlIHFFbmQKKwkJCQkJLy8KKwkJCQkJLy8JCW1vdiBlZGksIHRhcmdldAorCQkJCQkvLworCQkJCQkvLwlxTG9vcDoKKwkJCQkJLy8JCW1vdm50cHMgW2VkaSs4KmVheF0sIHhtbTAKKwkJCQkJLy8KKwkJCQkJLy8JCWFkZCBlYXgsIDIKKwkJCQkJLy8JCWNtcCBlYXgsIHgxCisJCQkJCS8vCQlqbCBxTG9vcAorCQkJCQkvLwlxRW5kOgorCQkJCQkvLwl9CisKKwkJCQkJCW1lbWZpbGwoJnRhcmdldFsoKHgwICsgMSkgJiB+MSkgKiAyXSwgKGludCYpZGVwdGgsIDggKiAoKHgxICYgfjEpIC0gKCh4MCArIDEpICYgfjEpKSk7CisKKwkJCQkJCWlmKCh4MSAmIDEpICE9IDApCisJCQkJCQl7CisJCQkJCQkJdGFyZ2V0Wyh4MSAmIH4xKSAqIDIgKyAwXSA9IGRlcHRoOworCQkJCQkJCXRhcmdldFsoeDEgJiB+MSkgKiAyICsgMl0gPSBkZXB0aDsKKwkJCQkJCX0KKworCQkJCQkJeSsrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0geDA7IHggPCB4MTsgeCsrKQorCQkJCQkJeworCQkJCQkJCXRhcmdldFsoeCAmIH4xKSAqIDIgKyAoeCAmIDEpXSA9IGRlcHRoOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJYnVmZmVyICs9IGludGVybmFsLnNsaWNlUDsKKwkJCX0KKworCQkJdW5sb2NrSW50ZXJuYWwoKTsKKwkJfQorCX0KKworCXZvaWQgU3VyZmFjZTo6Y2xlYXJTdGVuY2lsQnVmZmVyKHVuc2lnbmVkIGNoYXIgcywgdW5zaWduZWQgY2hhciBtYXNrLCBpbnQgeDAsIGludCB5MCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorCXsKKwkJLy8gTm90IG92ZXJsYXBwaW5nCisJCWlmKHgwID4gaW50ZXJuYWwud2lkdGgpIHJldHVybjsKKwkJaWYoeTAgPiBpbnRlcm5hbC5oZWlnaHQpIHJldHVybjsKKwkJaWYoeDAgKyB3aWR0aCA8IDApIHJldHVybjsKKwkJaWYoeTAgKyBoZWlnaHQgPCAwKSByZXR1cm47CisKKwkJLy8gQ2xpcCBhZ2FpbnN0IGRpbWVuc2lvbnMKKwkJaWYoeDAgPCAwKSB7d2lkdGggKz0geDA7IHgwID0gMDt9CisJCWlmKHgwICsgd2lkdGggPiBpbnRlcm5hbC53aWR0aCkgd2lkdGggPSBpbnRlcm5hbC53aWR0aCAtIHgwOworCQlpZih5MCA8IDApIHtoZWlnaHQgKz0geTA7IHkwID0gMDt9CisJCWlmKHkwICsgaGVpZ2h0ID4gaW50ZXJuYWwuaGVpZ2h0KSBoZWlnaHQgPSBpbnRlcm5hbC5oZWlnaHQgLSB5MDsKKworCQlpbnQgd2lkdGgyID0gKGludGVybmFsLndpZHRoICsgMSkgJiB+MTsKKworCQlpbnQgeDEgPSB4MCArIHdpZHRoOworCQlpbnQgeTEgPSB5MCArIGhlaWdodDsKKworCQl1bnNpZ25lZCBjaGFyIG1hc2tlZFMgPSBzICYgbWFzazsKKwkJdW5zaWduZWQgY2hhciBpbnZNYXNrID0gfm1hc2s7CisJCXVuc2lnbmVkIGludCBmaWxsID0gbWFza2VkUzsKKwkJZmlsbCA9IGZpbGwgfCAoZmlsbCA8PCA4KSB8IChmaWxsIDw8IDE2KSArIChmaWxsIDw8IDI0KTsKKworCQlpZihmYWxzZSkKKwkJeworCQkJY2hhciAqdGFyZ2V0ID0gKGNoYXIqKWxvY2tTdGVuY2lsKDAsIFBVQkxJQykgKyB4MCArIHdpZHRoMiAqIHkwOworCisJCQlmb3IoaW50IHogPSAwOyB6IDwgc3RlbmNpbC5kZXB0aDsgeisrKQorCQkJeworCQkJCWZvcihpbnQgeSA9IHkwOyB5IDwgeTAgKyBoZWlnaHQ7IHkrKykKKwkJCQl7CisJCQkJCWlmKG1hc2sgPT0gMHhGRikKKwkJCQkJeworCQkJCQkJbWVtZmlsbCh0YXJnZXQsIGZpbGwsIHdpZHRoKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCXRhcmdldFt4XSA9IG1hc2tlZFMgfCAodGFyZ2V0W3hdICYgaW52TWFzayk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQl0YXJnZXQgKz0gd2lkdGgyOworCQkJCX0KKwkJCX0KKworCQkJdW5sb2NrU3RlbmNpbCgpOworCQl9CisJCWVsc2UgICAvLyBRdWFkIGxheW91dAorCQl7CisJCQljaGFyICpidWZmZXIgPSAoY2hhciopbG9ja1N0ZW5jaWwoMCwgUFVCTElDKTsKKworCQkJaWYobWFzayA9PSAweEZGKQorCQkJeworCQkJCWZvcihpbnQgeiA9IDA7IHogPCBzdGVuY2lsLmRlcHRoOyB6KyspCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSB5MDsgeSA8IHkxOyB5KyspCisJCQkJCXsKKwkJCQkJCWNoYXIgKnRhcmdldCA9IGJ1ZmZlciArICh5ICYgfjEpICogd2lkdGgyICsgKHkgJiAxKSAqIDI7CisKKwkJCQkJCWlmKCh5ICYgMSkgPT0gMCAmJiB5ICsgMSA8IHkxICYmIG1hc2sgPT0gMHhGRikgICAvLyBGaWxsIHF1YWQgbGluZSBhdCBvbmNlCisJCQkJCQl7CisJCQkJCQkJaWYoKHgwICYgMSkgIT0gMCkKKwkJCQkJCQl7CisJCQkJCQkJCXRhcmdldFsoeDAgJiB+MSkgKiAyICsgMV0gPSBmaWxsOworCQkJCQkJCQl0YXJnZXRbKHgwICYgfjEpICogMiArIDNdID0gZmlsbDsKKwkJCQkJCQl9CisKKwkJCQkJCQltZW1maWxsKCZ0YXJnZXRbKCh4MCArIDEpICYgfjEpICogMl0sIGZpbGwsICgoeDEgKyAxKSAmIH4xKSAqIDIgLSAoKHgwICsgMSkgJiB+MSkgKiAyKTsKKworCQkJCQkJCWlmKCh4MSAmIDEpICE9IDApCisJCQkJCQkJeworCQkJCQkJCQl0YXJnZXRbKHgxICYgfjEpICogMiArIDBdID0gZmlsbDsKKwkJCQkJCQkJdGFyZ2V0Wyh4MSAmIH4xKSAqIDIgKyAyXSA9IGZpbGw7CisJCQkJCQkJfQorCisJCQkJCQkJeSsrOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWZvcihpbnQgeCA9IHgwOyB4IDwgeDE7IHgrKykKKwkJCQkJCQl7CisJCQkJCQkJCXRhcmdldFsoeCAmIH4xKSAqIDIgKyAoeCAmIDEpXSA9IG1hc2tlZFMgfCAodGFyZ2V0W3hdICYgaW52TWFzayk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnVmZmVyICs9IHN0ZW5jaWwuc2xpY2VQOworCQkJCX0KKwkJCX0KKworCQkJdW5sb2NrU3RlbmNpbCgpOworCQl9CisJfQorCisJdm9pZCBTdXJmYWNlOjpmaWxsKGNvbnN0IENvbG9yPGZsb2F0PiAmY29sb3IsIGludCB4MCwgaW50IHkwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisJeworCQl1bnNpZ25lZCBjaGFyICpyb3c7CisJCUJ1ZmZlciAqYnVmZmVyOworCQkKKwkJaWYoaW50ZXJuYWwuZGlydHkpCisJCXsKKwkJCXJvdyA9ICh1bnNpZ25lZCBjaGFyKilsb2NrSW50ZXJuYWwoeDAsIHkwLCAwLCBMT0NLX1dSSVRFT05MWSwgUFVCTElDKTsKKwkJCWJ1ZmZlciA9ICZpbnRlcm5hbDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJvdyA9ICh1bnNpZ25lZCBjaGFyKilsb2NrRXh0ZXJuYWwoeDAsIHkwLCAwLCBMT0NLX1dSSVRFT05MWSwgUFVCTElDKTsKKwkJCWJ1ZmZlciA9ICZleHRlcm5hbDsKKwkJfQorCisJCWlmKGJ1ZmZlci0+Ynl0ZXMgPD0gNCkKKwkJeworCQkJaW50IGM7CisJCQlidWZmZXItPndyaXRlKCZjLCBjb2xvcik7CisKKwkJCWlmKGJ1ZmZlci0+Ynl0ZXMgPD0gMSkgYyA9IChjIDw8IDgpICB8IGM7CisJCQlpZihidWZmZXItPmJ5dGVzIDw9IDIpIGMgPSAoYyA8PCAxNikgfCBjOworCisJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQl7CisJCQkJbWVtZmlsbChyb3csIGMsIHdpZHRoICogYnVmZmVyLT5ieXRlcyk7CisKKwkJCQlyb3cgKz0gYnVmZmVyLT5waXRjaEI7CisJCQl9CisJCX0KKwkJZWxzZSAgIC8vIEdlbmVyaWMKKwkJeworCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJeworCQkJCXVuc2lnbmVkIGNoYXIgKmVsZW1lbnQgPSByb3c7CisKKwkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkJCQl7CisJCQkJCWJ1ZmZlci0+d3JpdGUoZWxlbWVudCwgY29sb3IpOworCisJCQkJCWVsZW1lbnQgKz0gYnVmZmVyLT5ieXRlczsKKwkJCQl9CisKKwkJCQlyb3cgKz0gYnVmZmVyLT5waXRjaEI7CisJCQl9CisJCX0KKworCQlpZihidWZmZXIgPT0gJmludGVybmFsKQorCQl7CisJCQl1bmxvY2tJbnRlcm5hbCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJdW5sb2NrRXh0ZXJuYWwoKTsKKwkJfQorCX0KKworCUNvbG9yPGZsb2F0PiBTdXJmYWNlOjpyZWFkRXh0ZXJuYWwoaW50IHgsIGludCB5LCBpbnQgeikgY29uc3QKKwl7CisJCUFTU0VSVChleHRlcm5hbC5sb2NrICE9IExPQ0tfVU5MT0NLRUQpOworCisJCXJldHVybiBleHRlcm5hbC5yZWFkKHgsIHksIHopOworCX0KKworCUNvbG9yPGZsb2F0PiBTdXJmYWNlOjpyZWFkRXh0ZXJuYWwoaW50IHgsIGludCB5KSBjb25zdAorCXsKKwkJQVNTRVJUKGV4dGVybmFsLmxvY2sgIT0gTE9DS19VTkxPQ0tFRCk7CisKKwkJcmV0dXJuIGV4dGVybmFsLnJlYWQoeCwgeSk7CisJfQorCisJQ29sb3I8ZmxvYXQ+IFN1cmZhY2U6OnNhbXBsZUV4dGVybmFsKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIGNvbnN0CisJeworCQlBU1NFUlQoZXh0ZXJuYWwubG9jayAhPSBMT0NLX1VOTE9DS0VEKTsKKworCQlyZXR1cm4gZXh0ZXJuYWwuc2FtcGxlKHgsIHksIHopOworCX0KKworCUNvbG9yPGZsb2F0PiBTdXJmYWNlOjpzYW1wbGVFeHRlcm5hbChmbG9hdCB4LCBmbG9hdCB5KSBjb25zdAorCXsKKwkJQVNTRVJUKGV4dGVybmFsLmxvY2sgIT0gTE9DS19VTkxPQ0tFRCk7CisKKwkJcmV0dXJuIGV4dGVybmFsLnNhbXBsZSh4LCB5KTsKKwl9CisKKwl2b2lkIFN1cmZhY2U6OndyaXRlRXh0ZXJuYWwoaW50IHgsIGludCB5LCBpbnQgeiwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZjb2xvcikKKwl7CisJCUFTU0VSVChleHRlcm5hbC5sb2NrICE9IExPQ0tfVU5MT0NLRUQpOworCisJCWV4dGVybmFsLndyaXRlKHgsIHksIHosIGNvbG9yKTsKKwl9CisKKwl2b2lkIFN1cmZhY2U6OndyaXRlRXh0ZXJuYWwoaW50IHgsIGludCB5LCBjb25zdCBDb2xvcjxmbG9hdD4gJmNvbG9yKQorCXsKKwkJQVNTRVJUKGV4dGVybmFsLmxvY2sgIT0gTE9DS19VTkxPQ0tFRCk7CisKKwkJZXh0ZXJuYWwud3JpdGUoeCwgeSwgY29sb3IpOworCX0KKworCUNvbG9yPGZsb2F0PiBTdXJmYWNlOjpyZWFkSW50ZXJuYWwoaW50IHgsIGludCB5LCBpbnQgeikgY29uc3QKKwl7CisJCUFTU0VSVChpbnRlcm5hbC5sb2NrICE9IExPQ0tfVU5MT0NLRUQpOworCisJCXJldHVybiBpbnRlcm5hbC5yZWFkKHgsIHksIHopOworCX0KKworCUNvbG9yPGZsb2F0PiBTdXJmYWNlOjpyZWFkSW50ZXJuYWwoaW50IHgsIGludCB5KSBjb25zdAorCXsKKwkJQVNTRVJUKGludGVybmFsLmxvY2sgIT0gTE9DS19VTkxPQ0tFRCk7CisKKwkJcmV0dXJuIGludGVybmFsLnJlYWQoeCwgeSk7CisJfQorCisJQ29sb3I8ZmxvYXQ+IFN1cmZhY2U6OnNhbXBsZUludGVybmFsKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIGNvbnN0CisJeworCQlBU1NFUlQoaW50ZXJuYWwubG9jayAhPSBMT0NLX1VOTE9DS0VEKTsKKworCQlyZXR1cm4gaW50ZXJuYWwuc2FtcGxlKHgsIHksIHopOworCX0KKworCUNvbG9yPGZsb2F0PiBTdXJmYWNlOjpzYW1wbGVJbnRlcm5hbChmbG9hdCB4LCBmbG9hdCB5KSBjb25zdAorCXsKKwkJQVNTRVJUKGludGVybmFsLmxvY2sgIT0gTE9DS19VTkxPQ0tFRCk7CisKKwkJcmV0dXJuIGludGVybmFsLnNhbXBsZSh4LCB5KTsKKwl9CisKKwl2b2lkIFN1cmZhY2U6OndyaXRlSW50ZXJuYWwoaW50IHgsIGludCB5LCBpbnQgeiwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZjb2xvcikKKwl7CisJCUFTU0VSVChpbnRlcm5hbC5sb2NrICE9IExPQ0tfVU5MT0NLRUQpOworCisJCWludGVybmFsLndyaXRlKHgsIHksIHosIGNvbG9yKTsKKwl9CisKKwl2b2lkIFN1cmZhY2U6OndyaXRlSW50ZXJuYWwoaW50IHgsIGludCB5LCBjb25zdCBDb2xvcjxmbG9hdD4gJmNvbG9yKQorCXsKKwkJQVNTRVJUKGludGVybmFsLmxvY2sgIT0gTE9DS19VTkxPQ0tFRCk7CisKKwkJaW50ZXJuYWwud3JpdGUoeCwgeSwgY29sb3IpOworCX0KKworCWJvb2wgU3VyZmFjZTo6aGFzU3RlbmNpbCgpIGNvbnN0CisJeworCQlyZXR1cm4gaXNTdGVuY2lsKGV4dGVybmFsLmZvcm1hdCk7CisJfQorCQorCWJvb2wgU3VyZmFjZTo6aGFzRGVwdGgoKSBjb25zdAorCXsKKwkJcmV0dXJuIGlzRGVwdGgoZXh0ZXJuYWwuZm9ybWF0KTsKKwl9CisKKwlib29sIFN1cmZhY2U6Omhhc1BhbGV0dGUoKSBjb25zdAorCXsKKwkJcmV0dXJuIGlzUGFsZXR0ZShleHRlcm5hbC5mb3JtYXQpOworCX0KKworCWJvb2wgU3VyZmFjZTo6aXNSZW5kZXJUYXJnZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuIHJlbmRlclRhcmdldDsKKwl9CisKKwlib29sIFN1cmZhY2U6Omhhc0RpcnR5TWlwbWFwcygpIGNvbnN0CisJeworCQlyZXR1cm4gZGlydHlNaXBtYXBzOworCX0KKworCXZvaWQgU3VyZmFjZTo6Y2xlYW5NaXBtYXBzKCkKKwl7CisJCWRpcnR5TWlwbWFwcyA9IGZhbHNlOworCX0KKworCVJlc291cmNlICpTdXJmYWNlOjpnZXRSZXNvdXJjZSgpCisJeworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJYm9vbCBTdXJmYWNlOjppZGVudGljYWxGb3JtYXRzKCkgY29uc3QKKwl7CisJCXJldHVybiBleHRlcm5hbC5mb3JtYXQgID09IGludGVybmFsLmZvcm1hdCAmJgorCQkgICAgICAgZXh0ZXJuYWwud2lkdGggICA9PSBpbnRlcm5hbC53aWR0aCAmJgorCQkJICAgZXh0ZXJuYWwuaGVpZ2h0ICA9PSBpbnRlcm5hbC5oZWlnaHQgJiYKKwkJCSAgIGV4dGVybmFsLmRlcHRoICAgPT0gaW50ZXJuYWwuZGVwdGggJiYKKwkJCSAgIGV4dGVybmFsLnBpdGNoQiAgPT0gaW50ZXJuYWwucGl0Y2hCICYmCisJCQkgICBleHRlcm5hbC5zbGljZUIgID09IGludGVybmFsLnNsaWNlQjsKKwl9CisKKwlGb3JtYXQgU3VyZmFjZTo6c2VsZWN0SW50ZXJuYWxGb3JtYXQoRm9ybWF0IGZvcm1hdCkgY29uc3QKKwl7CisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJY2FzZSBGT1JNQVRfTlVMTDoKKwkJCXJldHVybiBGT1JNQVRfTlVMTDsKKwkJY2FzZSBGT1JNQVRfUDg6CisJCWNhc2UgRk9STUFUX0E4UDg6CisJCWNhc2UgRk9STUFUX0E0UjRHNEI0OgorCQljYXNlIEZPUk1BVF9BMVI1RzVCNToKKwkJY2FzZSBGT1JNQVRfQThSM0czQjI6CisJCQlyZXR1cm4gRk9STUFUX0E4UjhHOEI4OworCQljYXNlIEZPUk1BVF9BODoKKwkJCXJldHVybiBGT1JNQVRfQTg7CisJCWNhc2UgRk9STUFUX1I4OgorCQkJcmV0dXJuIEZPUk1BVF9SODsKKwkJY2FzZSBGT1JNQVRfQTJSMTBHMTBCMTA6CisJCWNhc2UgRk9STUFUX0EyQjEwRzEwUjEwOgorCQljYXNlIEZPUk1BVF9BMTZCMTZHMTZSMTY6CisJCQlyZXR1cm4gRk9STUFUX0ExNkIxNkcxNlIxNjsKKwkJY2FzZSBGT1JNQVRfRzhSODoKKwkJCXJldHVybiBGT1JNQVRfRzhSODsKKwkJY2FzZSBGT1JNQVRfRzE2UjE2OgorCQkJcmV0dXJuIEZPUk1BVF9HMTZSMTY7CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9BOEI4RzhSODoKKwkJCWlmKGxvY2thYmxlIHx8ICFxdWFkTGF5b3V0RW5hYmxlZCkKKwkJCXsKKwkJCQlyZXR1cm4gRk9STUFUX0E4UjhHOEI4OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBGT1JNQVRfQThHOFI4QjhROworCQkJfQorCQljYXNlIEZPUk1BVF9SM0czQjI6CisJCWNhc2UgRk9STUFUX1I1RzZCNToKKwkJY2FzZSBGT1JNQVRfUjhHOEI4OgorCQljYXNlIEZPUk1BVF9YNFI0RzRCNDoKKwkJY2FzZSBGT1JNQVRfWDFSNUc1QjU6CisJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9YOEI4RzhSODoKKwkJCWlmKGxvY2thYmxlIHx8ICFxdWFkTGF5b3V0RW5hYmxlZCkKKwkJCXsKKwkJCQlyZXR1cm4gRk9STUFUX1g4UjhHOEI4OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBGT1JNQVRfWDhHOFI4QjhROworCQkJfQorCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKKwkJI2lmIFMzVENfU1VQUE9SVAorCQljYXNlIEZPUk1BVF9EWFQxOgorCQljYXNlIEZPUk1BVF9EWFQzOgorCQljYXNlIEZPUk1BVF9EWFQ1OgorCQkJcmV0dXJuIEZPUk1BVF9BOFI4RzhCODsKKwkJY2FzZSBGT1JNQVRfQVRJMToKKwkJCXJldHVybiBGT1JNQVRfUjg7CisJCWNhc2UgRk9STUFUX0FUSTI6CisJCQlyZXR1cm4gRk9STUFUX0c4Ujg7CisJCSNlbmRpZgorCQkvLyBCdW1wbWFwIGZvcm1hdHMKKwkJY2FzZSBGT1JNQVRfVjhVODoJCQlyZXR1cm4gRk9STUFUX1Y4VTg7CisJCWNhc2UgRk9STUFUX0w2VjVVNToJCQlyZXR1cm4gRk9STUFUX1g4TDhWOFU4OworCQljYXNlIEZPUk1BVF9ROFc4VjhVODoJCXJldHVybiBGT1JNQVRfUThXOFY4VTg7CisJCWNhc2UgRk9STUFUX1g4TDhWOFU4OgkJcmV0dXJuIEZPUk1BVF9YOEw4VjhVODsKKwkJY2FzZSBGT1JNQVRfVjE2VTE2OgkJCXJldHVybiBGT1JNQVRfVjE2VTE2OworCQljYXNlIEZPUk1BVF9BMlcxMFYxMFUxMDoJcmV0dXJuIEZPUk1BVF9BMTZXMTZWMTZVMTY7CisJCWNhc2UgRk9STUFUX1ExNlcxNlYxNlUxNjoJcmV0dXJuIEZPUk1BVF9RMTZXMTZWMTZVMTY7CisJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKKwkJY2FzZSBGT1JNQVRfUjE2RjoJCQlyZXR1cm4gRk9STUFUX1IzMkY7CisJCWNhc2UgRk9STUFUX0cxNlIxNkY6CQlyZXR1cm4gRk9STUFUX0czMlIzMkY7CisJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNkY6CXJldHVybiBGT1JNQVRfQTMyQjMyRzMyUjMyRjsKKwkJY2FzZSBGT1JNQVRfUjMyRjoJCQlyZXR1cm4gRk9STUFUX1IzMkY7CisJCWNhc2UgRk9STUFUX0czMlIzMkY6CQlyZXR1cm4gRk9STUFUX0czMlIzMkY7CisJCWNhc2UgRk9STUFUX0EzMkIzMkczMlIzMkY6CXJldHVybiBGT1JNQVRfQTMyQjMyRzMyUjMyRjsKKwkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKKwkJY2FzZSBGT1JNQVRfTDg6CQkJCXJldHVybiBGT1JNQVRfTDg7CisJCWNhc2UgRk9STUFUX0E0TDQ6CQkJcmV0dXJuIEZPUk1BVF9BOEw4OworCQljYXNlIEZPUk1BVF9MMTY6CQkJcmV0dXJuIEZPUk1BVF9MMTY7CisJCWNhc2UgRk9STUFUX0E4TDg6CQkJcmV0dXJuIEZPUk1BVF9BOEw4OworCQkvLyBEZXB0aC9zdGVuY2lsIGZvcm1hdHMKKwkJY2FzZSBGT1JNQVRfRDE2OgorCQljYXNlIEZPUk1BVF9EMzI6CisJCWNhc2UgRk9STUFUX0QyNFg4OgorCQljYXNlIEZPUk1BVF9EMjRTODoKKwkJY2FzZSBGT1JNQVRfRDI0RlM4OgorCQkJaWYoaGFzUGFyZW50KSAgIC8vIFRleHR1cmUKKwkJCXsKKwkJCQlyZXR1cm4gRk9STUFUX0QzMkZfU0hBRE9XOworCQkJfQorCQkJZWxzZSBpZihjb21wbGVtZW50YXJ5RGVwdGhCdWZmZXIpCisJCQl7CisJCQkJcmV0dXJuIEZPUk1BVF9EMzJGX0NPTVBMRU1FTlRBUlk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEZPUk1BVF9EMzJGOworCQkJfQorCQljYXNlIEZPUk1BVF9EMzJGX0xPQ0tBQkxFOglyZXR1cm4gRk9STUFUX0QzMkZfTE9DS0FCTEU7CisJCWNhc2UgRk9STUFUX0lOVFo6CQkJcmV0dXJuIEZPUk1BVF9EMzJGX1RFWFRVUkU7CisJCWNhc2UgRk9STUFUX0RGMjQ6CQkJcmV0dXJuIEZPUk1BVF9EMzJGX1NIQURPVzsKKwkJY2FzZSBGT1JNQVRfREYxNjoJCQlyZXR1cm4gRk9STUFUX0QzMkZfU0hBRE9XOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiBGT1JNQVRfTlVMTDsKKwl9CisKKwl2b2lkIFN1cmZhY2U6OnNldFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCAqcGFsZXR0ZSkKKwl7CisJCVN1cmZhY2U6OnBhbGV0dGUgPSBwYWxldHRlOworCQlTdXJmYWNlOjpwYWxldHRlSUQrKzsKKwl9CisKKwl2b2lkIFN1cmZhY2U6OnJlc29sdmUoKQorCXsKKwkJaWYoaW50ZXJuYWwuZGVwdGggPD0gMSB8fCAhaW50ZXJuYWwuZGlydHkgfHwgIXJlbmRlclRhcmdldCB8fCBpbnRlcm5hbC5mb3JtYXQgPT0gRk9STUFUX05VTEwpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCXZvaWQgKnNvdXJjZSA9IGludGVybmFsLmxvY2tSZWN0KDAsIDAsIDAsIExPQ0tfUkVBRFdSSVRFKTsKKworCQlpbnQgcXVhbGl0eSA9IGludGVybmFsLmRlcHRoOworCQlpbnQgd2lkdGggPSBpbnRlcm5hbC53aWR0aDsKKwkJaW50IGhlaWdodCA9IGludGVybmFsLmhlaWdodDsKKwkJaW50IHBpdGNoID0gaW50ZXJuYWwucGl0Y2hCOworCQlpbnQgc2xpY2UgPSBpbnRlcm5hbC5zbGljZUI7CisKKwkJdW5zaWduZWQgY2hhciAqc291cmNlMCA9ICh1bnNpZ25lZCBjaGFyKilzb3VyY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZTEgPSBzb3VyY2UwICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZTIgPSBzb3VyY2UxICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZTMgPSBzb3VyY2UyICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZTQgPSBzb3VyY2UzICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZTUgPSBzb3VyY2U0ICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZTYgPSBzb3VyY2U1ICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZTcgPSBzb3VyY2U2ICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZTggPSBzb3VyY2U3ICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZTkgPSBzb3VyY2U4ICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZUEgPSBzb3VyY2U5ICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZUIgPSBzb3VyY2VBICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZUMgPSBzb3VyY2VCICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZUQgPSBzb3VyY2VDICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZUUgPSBzb3VyY2VEICsgc2xpY2U7CisJCXVuc2lnbmVkIGNoYXIgKnNvdXJjZUYgPSBzb3VyY2VFICsgc2xpY2U7CisKKwkJaWYoaW50ZXJuYWwuZm9ybWF0ID09IEZPUk1BVF9YOFI4RzhCOCB8fCBpbnRlcm5hbC5mb3JtYXQgPT0gRk9STUFUX0E4UjhHOEI4KQorCQl7CisJCQlpZihDUFVJRDo6c3VwcG9ydHNTU0UyKCkgJiYgKHdpZHRoICUgNCkgPT0gMCkKKwkJCXsKKwkJCQlpZihpbnRlcm5hbC5kZXB0aCA9PSAyKQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHggKz0gNCkKKwkJCQkJCXsKKwkJCQkJCQlfX20xMjhpIGMwID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UwICsgNCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGMxID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UxICsgNCAqIHgpKTsKKwkJCQkJCQkKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1OChjMCwgYzEpOworCisJCQkJCQkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDQgKiB4KSwgYzApOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDQpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCArPSA0KQorCQkJCQkJeworCQkJCQkJCV9fbTEyOGkgYzAgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTAgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOGkgYzEgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTEgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOGkgYzIgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTIgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOGkgYzMgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTMgKyA0ICogeCkpOworCQkJCQkJCQorCQkJCQkJCWMwID0gX21tX2F2Z19lcHU4KGMwLCBjMSk7CisJCQkJCQkJYzIgPSBfbW1fYXZnX2VwdTgoYzIsIGMzKTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1OChjMCwgYzIpOworCisJCQkJCQkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDQgKiB4KSwgYzApOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gOCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDQpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4aSBjMCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMyArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNyArIDQgKiB4KSk7CisJCQkJCQkJCisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTgoYzAsIGMxKTsKKwkJCQkJCQljMiA9IF9tbV9hdmdfZXB1OChjMiwgYzMpOworCQkJCQkJCWM0ID0gX21tX2F2Z19lcHU4KGM0LCBjNSk7CisJCQkJCQkJYzYgPSBfbW1fYXZnX2VwdTgoYzYsIGM3KTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1OChjMCwgYzIpOworCQkJCQkJCWM0ID0gX21tX2F2Z19lcHU4KGM0LCBjNik7CisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTgoYzAsIGM0KTsKKworCQkJCQkJCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTAgKyA0ICogeCksIGMwKTsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSAxNikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDQpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4aSBjMCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMyArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNyArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjOCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlOCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjOSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlOSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjQSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlQSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjQiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlQiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjQyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlQyArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjRCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlRCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjRSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlRSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjRiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlRiArIDQgKiB4KSk7CisKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1OChjMCwgYzEpOworCQkJCQkJCWMyID0gX21tX2F2Z19lcHU4KGMyLCBjMyk7CisJCQkJCQkJYzQgPSBfbW1fYXZnX2VwdTgoYzQsIGM1KTsKKwkJCQkJCQljNiA9IF9tbV9hdmdfZXB1OChjNiwgYzcpOworCQkJCQkJCWM4ID0gX21tX2F2Z19lcHU4KGM4LCBjOSk7CisJCQkJCQkJY0EgPSBfbW1fYXZnX2VwdTgoY0EsIGNCKTsKKwkJCQkJCQljQyA9IF9tbV9hdmdfZXB1OChjQywgY0QpOworCQkJCQkJCWNFID0gX21tX2F2Z19lcHU4KGNFLCBjRik7CisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTgoYzAsIGMyKTsKKwkJCQkJCQljNCA9IF9tbV9hdmdfZXB1OChjNCwgYzYpOworCQkJCQkJCWM4ID0gX21tX2F2Z19lcHU4KGM4LCBjQSk7CisJCQkJCQkJY0MgPSBfbW1fYXZnX2VwdTgoY0MsIGNFKTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1OChjMCwgYzQpOworCQkJCQkJCWM4ID0gX21tX2F2Z19lcHU4KGM4LCBjQyk7CisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTgoYzAsIGM4KTsKKworCQkJCQkJCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTAgKyA0ICogeCksIGMwKTsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U4ICs9IHBpdGNoOworCQkJCQkJc291cmNlOSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VCICs9IHBpdGNoOworCQkJCQkJc291cmNlQyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VFICs9IHBpdGNoOworCQkJCQkJc291cmNlRiArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJI2RlZmluZSBBVkVSQUdFKHgsIHkpICgoKHgpICYgKHkpKSArICgoKCh4KSBeICh5KSkgPj4gMSkgJiAweDdGN0Y3RjdGKSArICgoKHgpIF4gKHkpKSAmIDB4MDEwMTAxMDEpKQorCisJCQkJaWYoaW50ZXJuYWwuZGVwdGggPT0gMikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCQkJCQl7CisJCQkJCQkJdW5zaWduZWQgaW50IGMwID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMSArIDQgKiB4KTsKKworCQkJCQkJCWMwID0gQVZFUkFHRShjMCwgYzEpOworCisJCQkJCQkJKih1bnNpZ25lZCBpbnQqKShzb3VyY2UwICsgNCAqIHgpID0gYzA7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gNCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCQkJCQl7CisJCQkJCQkJdW5zaWduZWQgaW50IGMwID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMSArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzIgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTIgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGMzID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UzICsgNCAqIHgpOworCisJCQkJCQkJYzAgPSBBVkVSQUdFKGMwLCBjMSk7CisJCQkJCQkJYzIgPSBBVkVSQUdFKGMyLCBjMyk7CisJCQkJCQkJYzAgPSBBVkVSQUdFKGMwLCBjMik7CisKKwkJCQkJCQkqKHVuc2lnbmVkIGludCopKHNvdXJjZTAgKyA0ICogeCkgPSBjMDsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDgpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCXVuc2lnbmVkIGludCBjMCA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzEgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTEgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGMyID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UyICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMyA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMyArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzQgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTQgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGM1ID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2U1ICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjNiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlNiArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzcgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTcgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMxKTsKKwkJCQkJCQljMiA9IEFWRVJBR0UoYzIsIGMzKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM1KTsKKwkJCQkJCQljNiA9IEFWRVJBR0UoYzYsIGM3KTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMyKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM2KTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGM0KTsKKworCQkJCQkJCSoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQkJc291cmNlNCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U2ICs9IHBpdGNoOworCQkJCQkJc291cmNlNyArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDE2KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzAgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTAgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGMxID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UxICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMiArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzMgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTMgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGM0ID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2U0ICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjNSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlNSArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzYgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTYgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGM3ID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2U3ICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjOCA9ICoodW5zaWduZWQgaW50Kikoc291cmNlOCArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzkgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTkgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGNBID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2VBICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjQiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlQiArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgY0MgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZUMgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGNEID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2VEICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjRSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlRSArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgY0YgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZUYgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMxKTsKKwkJCQkJCQljMiA9IEFWRVJBR0UoYzIsIGMzKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM1KTsKKwkJCQkJCQljNiA9IEFWRVJBR0UoYzYsIGM3KTsKKwkJCQkJCQljOCA9IEFWRVJBR0UoYzgsIGM5KTsKKwkJCQkJCQljQSA9IEFWRVJBR0UoY0EsIGNCKTsKKwkJCQkJCQljQyA9IEFWRVJBR0UoY0MsIGNEKTsKKwkJCQkJCQljRSA9IEFWRVJBR0UoY0UsIGNGKTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMyKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM2KTsKKwkJCQkJCQljOCA9IEFWRVJBR0UoYzgsIGNBKTsKKwkJCQkJCQljQyA9IEFWRVJBR0UoY0MsIGNFKTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGM0KTsKKwkJCQkJCQljOCA9IEFWRVJBR0UoYzgsIGNDKTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGM4KTsKKworCQkJCQkJCSoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQkJc291cmNlNCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U2ICs9IHBpdGNoOworCQkJCQkJc291cmNlNyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTggKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U5ICs9IHBpdGNoOworCQkJCQkJc291cmNlQSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VDICs9IHBpdGNoOworCQkJCQkJc291cmNlRCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VGICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKworCQkJCSN1bmRlZiBBVkVSQUdFCisJCQl9CisJCX0KKwkJZWxzZSBpZihpbnRlcm5hbC5mb3JtYXQgPT0gRk9STUFUX0cxNlIxNikKKwkJeworCQkJaWYoQ1BVSUQ6OnN1cHBvcnRzU1NFMigpICYmICh3aWR0aCAlIDQpID09IDApCisJCQl7CisJCQkJaWYoaW50ZXJuYWwuZGVwdGggPT0gMikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDQpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4aSBjMCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMSArIDQgKiB4KSk7CisJCQkJCQkJCisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTE2KGMwLCBjMSk7CisKKwkJCQkJCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UwICsgNCAqIHgpLCBjMCk7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gNCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDQpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4aSBjMCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMyArIDQgKiB4KSk7CisJCQkJCQkJCisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTE2KGMwLCBjMSk7CisJCQkJCQkJYzIgPSBfbW1fYXZnX2VwdTE2KGMyLCBjMyk7CisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTE2KGMwLCBjMik7CisKKwkJCQkJCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UwICsgNCAqIHgpLCBjMCk7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQkJc291cmNlMiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTMgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSA4KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHggKz0gNCkKKwkJCQkJCXsKKwkJCQkJCQlfX20xMjhpIGMwID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UwICsgNCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGMxID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UxICsgNCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGMyID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UyICsgNCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGMzID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UzICsgNCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGM0ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2U0ICsgNCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGM1ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2U1ICsgNCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGM2ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2U2ICsgNCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGM3ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2U3ICsgNCAqIHgpKTsKKwkJCQkJCQkKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGMxKTsKKwkJCQkJCQljMiA9IF9tbV9hdmdfZXB1MTYoYzIsIGMzKTsKKwkJCQkJCQljNCA9IF9tbV9hdmdfZXB1MTYoYzQsIGM1KTsKKwkJCQkJCQljNiA9IF9tbV9hdmdfZXB1MTYoYzYsIGM3KTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGMyKTsKKwkJCQkJCQljNCA9IF9tbV9hdmdfZXB1MTYoYzQsIGM2KTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGM0KTsKKworCQkJCQkJCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTAgKyA0ICogeCksIGMwKTsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSAxNikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDQpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4aSBjMCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMyArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNyArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjOCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlOCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjOSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlOSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjQSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlQSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjQiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlQiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjQyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlQyArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjRCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlRCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjRSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlRSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjRiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlRiArIDQgKiB4KSk7CisKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGMxKTsKKwkJCQkJCQljMiA9IF9tbV9hdmdfZXB1MTYoYzIsIGMzKTsKKwkJCQkJCQljNCA9IF9tbV9hdmdfZXB1MTYoYzQsIGM1KTsKKwkJCQkJCQljNiA9IF9tbV9hdmdfZXB1MTYoYzYsIGM3KTsKKwkJCQkJCQljOCA9IF9tbV9hdmdfZXB1MTYoYzgsIGM5KTsKKwkJCQkJCQljQSA9IF9tbV9hdmdfZXB1MTYoY0EsIGNCKTsKKwkJCQkJCQljQyA9IF9tbV9hdmdfZXB1MTYoY0MsIGNEKTsKKwkJCQkJCQljRSA9IF9tbV9hdmdfZXB1MTYoY0UsIGNGKTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGMyKTsKKwkJCQkJCQljNCA9IF9tbV9hdmdfZXB1MTYoYzQsIGM2KTsKKwkJCQkJCQljOCA9IF9tbV9hdmdfZXB1MTYoYzgsIGNBKTsKKwkJCQkJCQljQyA9IF9tbV9hdmdfZXB1MTYoY0MsIGNFKTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGM0KTsKKwkJCQkJCQljOCA9IF9tbV9hdmdfZXB1MTYoYzgsIGNDKTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGM4KTsKKworCQkJCQkJCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTAgKyA0ICogeCksIGMwKTsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U4ICs9IHBpdGNoOworCQkJCQkJc291cmNlOSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VCICs9IHBpdGNoOworCQkJCQkJc291cmNlQyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VFICs9IHBpdGNoOworCQkJCQkJc291cmNlRiArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJI2RlZmluZSBBVkVSQUdFKHgsIHkpICgoKHgpICYgKHkpKSArICgoKCh4KSBeICh5KSkgPj4gMSkgJiAweDdGRkY3RkZGKSArICgoKHgpIF4gKHkpKSAmIDB4MDAwMTAwMDEpKQorCisJCQkJaWYoaW50ZXJuYWwuZGVwdGggPT0gMikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCQkJCQl7CisJCQkJCQkJdW5zaWduZWQgaW50IGMwID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMSArIDQgKiB4KTsKKworCQkJCQkJCWMwID0gQVZFUkFHRShjMCwgYzEpOworCisJCQkJCQkJKih1bnNpZ25lZCBpbnQqKShzb3VyY2UwICsgNCAqIHgpID0gYzA7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gNCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCQkJCQl7CisJCQkJCQkJdW5zaWduZWQgaW50IGMwID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMSArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzIgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTIgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGMzID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UzICsgNCAqIHgpOworCisJCQkJCQkJYzAgPSBBVkVSQUdFKGMwLCBjMSk7CisJCQkJCQkJYzIgPSBBVkVSQUdFKGMyLCBjMyk7CisJCQkJCQkJYzAgPSBBVkVSQUdFKGMwLCBjMik7CisKKwkJCQkJCQkqKHVuc2lnbmVkIGludCopKHNvdXJjZTAgKyA0ICogeCkgPSBjMDsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDgpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCXVuc2lnbmVkIGludCBjMCA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzEgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTEgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGMyID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UyICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMyA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMyArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzQgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTQgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGM1ID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2U1ICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjNiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlNiArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzcgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTcgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMxKTsKKwkJCQkJCQljMiA9IEFWRVJBR0UoYzIsIGMzKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM1KTsKKwkJCQkJCQljNiA9IEFWRVJBR0UoYzYsIGM3KTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMyKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM2KTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGM0KTsKKworCQkJCQkJCSoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQkJc291cmNlNCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U2ICs9IHBpdGNoOworCQkJCQkJc291cmNlNyArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDE2KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzAgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTAgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGMxID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UxICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMiArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzMgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTMgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGM0ID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2U0ICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjNSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlNSArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzYgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTYgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGM3ID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2U3ICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjOCA9ICoodW5zaWduZWQgaW50Kikoc291cmNlOCArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzkgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTkgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGNBID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2VBICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjQiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlQiArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgY0MgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZUMgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGNEID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2VEICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjRSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlRSArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgY0YgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZUYgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMxKTsKKwkJCQkJCQljMiA9IEFWRVJBR0UoYzIsIGMzKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM1KTsKKwkJCQkJCQljNiA9IEFWRVJBR0UoYzYsIGM3KTsKKwkJCQkJCQljOCA9IEFWRVJBR0UoYzgsIGM5KTsKKwkJCQkJCQljQSA9IEFWRVJBR0UoY0EsIGNCKTsKKwkJCQkJCQljQyA9IEFWRVJBR0UoY0MsIGNEKTsKKwkJCQkJCQljRSA9IEFWRVJBR0UoY0UsIGNGKTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMyKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM2KTsKKwkJCQkJCQljOCA9IEFWRVJBR0UoYzgsIGNBKTsKKwkJCQkJCQljQyA9IEFWRVJBR0UoY0MsIGNFKTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGM0KTsKKwkJCQkJCQljOCA9IEFWRVJBR0UoYzgsIGNDKTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGM4KTsKKworCQkJCQkJCSoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQkJc291cmNlNCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U2ICs9IHBpdGNoOworCQkJCQkJc291cmNlNyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTggKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U5ICs9IHBpdGNoOworCQkJCQkJc291cmNlQSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VDICs9IHBpdGNoOworCQkJCQkJc291cmNlRCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VGICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKworCQkJCSN1bmRlZiBBVkVSQUdFCisJCQl9CisJCX0KKwkJZWxzZSBpZihpbnRlcm5hbC5mb3JtYXQgPT0gRk9STUFUX0ExNkIxNkcxNlIxNikKKwkJeworCQkJaWYoQ1BVSUQ6OnN1cHBvcnRzU1NFMigpICYmICh3aWR0aCAlIDIpID09IDApCisJCQl7CisJCQkJaWYoaW50ZXJuYWwuZGVwdGggPT0gMikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4aSBjMCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMSArIDggKiB4KSk7CisJCQkJCQkJCisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTE2KGMwLCBjMSk7CisKKwkJCQkJCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UwICsgOCAqIHgpLCBjMCk7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gNCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4aSBjMCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMiArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMyArIDggKiB4KSk7CisJCQkJCQkJCisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTE2KGMwLCBjMSk7CisJCQkJCQkJYzIgPSBfbW1fYXZnX2VwdTE2KGMyLCBjMyk7CisJCQkJCQkJYzAgPSBfbW1fYXZnX2VwdTE2KGMwLCBjMik7CisKKwkJCQkJCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UwICsgOCAqIHgpLCBjMCk7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQkJc291cmNlMiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTMgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSA4KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMikKKwkJCQkJCXsKKwkJCQkJCQlfX20xMjhpIGMwID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UwICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGMxID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UxICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGMyID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UyICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGMzID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2UzICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGM0ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2U0ICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGM1ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2U1ICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGM2ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2U2ICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjhpIGM3ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShzb3VyY2U3ICsgOCAqIHgpKTsKKwkJCQkJCQkKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGMxKTsKKwkJCQkJCQljMiA9IF9tbV9hdmdfZXB1MTYoYzIsIGMzKTsKKwkJCQkJCQljNCA9IF9tbV9hdmdfZXB1MTYoYzQsIGM1KTsKKwkJCQkJCQljNiA9IF9tbV9hdmdfZXB1MTYoYzYsIGM3KTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGMyKTsKKwkJCQkJCQljNCA9IF9tbV9hdmdfZXB1MTYoYzQsIGM2KTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGM0KTsKKworCQkJCQkJCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTAgKyA4ICogeCksIGMwKTsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSAxNikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4aSBjMCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMiArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjMyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlMyArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNiArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjNyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlNyArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjOCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlOCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjOSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlOSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjQSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlQSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjQiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlQiArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjQyA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlQyArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjRCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlRCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjRSA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlRSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4aSBjRiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc291cmNlRiArIDggKiB4KSk7CisKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGMxKTsKKwkJCQkJCQljMiA9IF9tbV9hdmdfZXB1MTYoYzIsIGMzKTsKKwkJCQkJCQljNCA9IF9tbV9hdmdfZXB1MTYoYzQsIGM1KTsKKwkJCQkJCQljNiA9IF9tbV9hdmdfZXB1MTYoYzYsIGM3KTsKKwkJCQkJCQljOCA9IF9tbV9hdmdfZXB1MTYoYzgsIGM5KTsKKwkJCQkJCQljQSA9IF9tbV9hdmdfZXB1MTYoY0EsIGNCKTsKKwkJCQkJCQljQyA9IF9tbV9hdmdfZXB1MTYoY0MsIGNEKTsKKwkJCQkJCQljRSA9IF9tbV9hdmdfZXB1MTYoY0UsIGNGKTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGMyKTsKKwkJCQkJCQljNCA9IF9tbV9hdmdfZXB1MTYoYzQsIGM2KTsKKwkJCQkJCQljOCA9IF9tbV9hdmdfZXB1MTYoYzgsIGNBKTsKKwkJCQkJCQljQyA9IF9tbV9hdmdfZXB1MTYoY0MsIGNFKTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGM0KTsKKwkJCQkJCQljOCA9IF9tbV9hdmdfZXB1MTYoYzgsIGNDKTsKKwkJCQkJCQljMCA9IF9tbV9hdmdfZXB1MTYoYzAsIGM4KTsKKworCQkJCQkJCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHNvdXJjZTAgKyA4ICogeCksIGMwKTsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U4ICs9IHBpdGNoOworCQkJCQkJc291cmNlOSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VCICs9IHBpdGNoOworCQkJCQkJc291cmNlQyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VFICs9IHBpdGNoOworCQkJCQkJc291cmNlRiArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJI2RlZmluZSBBVkVSQUdFKHgsIHkpICgoKHgpICYgKHkpKSArICgoKCh4KSBeICh5KSkgPj4gMSkgJiAweDdGRkY3RkZGKSArICgoKHgpIF4gKHkpKSAmIDB4MDAwMTAwMDEpKQorCisJCQkJaWYoaW50ZXJuYWwuZGVwdGggPT0gMikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IDIgKiB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCXVuc2lnbmVkIGludCBjMCA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzEgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTEgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMxKTsKKworCQkJCQkJCSoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDQpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCAyICogd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzAgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTAgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGMxID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UxICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMiArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzMgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTMgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMxKTsKKwkJCQkJCQljMiA9IEFWRVJBR0UoYzIsIGMzKTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMyKTsKKworCQkJCQkJCSoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gOCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IDIgKiB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCXVuc2lnbmVkIGludCBjMCA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzEgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTEgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGMyID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UyICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMyA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMyArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzQgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTQgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGM1ID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2U1ICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjNiA9ICoodW5zaWduZWQgaW50Kikoc291cmNlNiArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzcgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTcgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMxKTsKKwkJCQkJCQljMiA9IEFWRVJBR0UoYzIsIGMzKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM1KTsKKwkJCQkJCQljNiA9IEFWRVJBR0UoYzYsIGM3KTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGMyKTsKKwkJCQkJCQljNCA9IEFWRVJBR0UoYzQsIGM2KTsKKwkJCQkJCQljMCA9IEFWRVJBR0UoYzAsIGM0KTsKKworCQkJCQkJCSoodW5zaWduZWQgaW50Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQkJc291cmNlNCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U2ICs9IHBpdGNoOworCQkJCQkJc291cmNlNyArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDE2KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgMiAqIHdpZHRoOyB4KyspCisJCQkJCQl7CisJCQkJCQkJdW5zaWduZWQgaW50IGMwID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjMSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlMSArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzIgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTIgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGMzID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2UzICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjNCA9ICoodW5zaWduZWQgaW50Kikoc291cmNlNCArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzUgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTUgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGM2ID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2U2ICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjNyA9ICoodW5zaWduZWQgaW50Kikoc291cmNlNyArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYzggPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZTggKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGM5ID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2U5ICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjQSA9ICoodW5zaWduZWQgaW50Kikoc291cmNlQSArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgY0IgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZUIgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGNDID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2VDICsgNCAqIHgpOworCQkJCQkJCXVuc2lnbmVkIGludCBjRCA9ICoodW5zaWduZWQgaW50Kikoc291cmNlRCArIDQgKiB4KTsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgY0UgPSAqKHVuc2lnbmVkIGludCopKHNvdXJjZUUgKyA0ICogeCk7CisJCQkJCQkJdW5zaWduZWQgaW50IGNGID0gKih1bnNpZ25lZCBpbnQqKShzb3VyY2VGICsgNCAqIHgpOworCisJCQkJCQkJYzAgPSBBVkVSQUdFKGMwLCBjMSk7CisJCQkJCQkJYzIgPSBBVkVSQUdFKGMyLCBjMyk7CisJCQkJCQkJYzQgPSBBVkVSQUdFKGM0LCBjNSk7CisJCQkJCQkJYzYgPSBBVkVSQUdFKGM2LCBjNyk7CisJCQkJCQkJYzggPSBBVkVSQUdFKGM4LCBjOSk7CisJCQkJCQkJY0EgPSBBVkVSQUdFKGNBLCBjQik7CisJCQkJCQkJY0MgPSBBVkVSQUdFKGNDLCBjRCk7CisJCQkJCQkJY0UgPSBBVkVSQUdFKGNFLCBjRik7CisJCQkJCQkJYzAgPSBBVkVSQUdFKGMwLCBjMik7CisJCQkJCQkJYzQgPSBBVkVSQUdFKGM0LCBjNik7CisJCQkJCQkJYzggPSBBVkVSQUdFKGM4LCBjQSk7CisJCQkJCQkJY0MgPSBBVkVSQUdFKGNDLCBjRSk7CisJCQkJCQkJYzAgPSBBVkVSQUdFKGMwLCBjNCk7CisJCQkJCQkJYzggPSBBVkVSQUdFKGM4LCBjQyk7CisJCQkJCQkJYzAgPSBBVkVSQUdFKGMwLCBjOCk7CisKKwkJCQkJCQkqKHVuc2lnbmVkIGludCopKHNvdXJjZTAgKyA0ICogeCkgPSBjMDsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U4ICs9IHBpdGNoOworCQkJCQkJc291cmNlOSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VCICs9IHBpdGNoOworCQkJCQkJc291cmNlQyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VFICs9IHBpdGNoOworCQkJCQkJc291cmNlRiArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisKKwkJCQkjdW5kZWYgQVZFUkFHRQorCQkJfQorCQl9CisJCWVsc2UgaWYoaW50ZXJuYWwuZm9ybWF0ID09IEZPUk1BVF9SMzJGKQorCQl7CisJCQlpZihDUFVJRDo6c3VwcG9ydHNTU0UoKSAmJiAod2lkdGggJSA0KSA9PSAwKQorCQkJeworCQkJCWlmKGludGVybmFsLmRlcHRoID09IDIpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCArPSA0KQorCQkJCQkJeworCQkJCQkJCV9fbTEyOCBjMCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTAgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTEgKyA0ICogeCkpOworCQkJCQkJCQorCQkJCQkJCWMwID0gX21tX2FkZF9wcyhjMCwgYzEpOworCQkJCQkJCWMwID0gX21tX211bF9wcyhjMCwgX21tX3NldDFfcHMoMS4wZiAvIDIuMGYpKTsgCisKKwkJCQkJCQlfbW1fc3RvcmVfcHMoKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KSwgYzApOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDQpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCArPSA0KQorCQkJCQkJeworCQkJCQkJCV9fbTEyOCBjMCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTAgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTEgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMiA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTIgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMyA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTMgKyA0ICogeCkpOworCQkJCQkJCQorCQkJCQkJCWMwID0gX21tX2FkZF9wcyhjMCwgYzEpOworCQkJCQkJCWMyID0gX21tX2FkZF9wcyhjMiwgYzMpOworCQkJCQkJCWMwID0gX21tX2FkZF9wcyhjMCwgYzIpOworCQkJCQkJCWMwID0gX21tX211bF9wcyhjMCwgX21tX3NldDFfcHMoMS4wZiAvIDQuMGYpKTsgCisKKwkJCQkJCQlfbW1fc3RvcmVfcHMoKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KSwgYzApOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gOCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDQpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4IGMwID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4IGMxID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4IGMyID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4IGMzID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMyArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4IGM0ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNCArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4IGM1ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNSArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4IGM2ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNiArIDQgKiB4KSk7CisJCQkJCQkJX19tMTI4IGM3ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNyArIDQgKiB4KSk7CisJCQkJCQkJCisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMSk7CisJCQkJCQkJYzIgPSBfbW1fYWRkX3BzKGMyLCBjMyk7CisJCQkJCQkJYzQgPSBfbW1fYWRkX3BzKGM0LCBjNSk7CisJCQkJCQkJYzYgPSBfbW1fYWRkX3BzKGM2LCBjNyk7CisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMik7CisJCQkJCQkJYzQgPSBfbW1fYWRkX3BzKGM0LCBjNik7CisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjNCk7CisJCQkJCQkJYzAgPSBfbW1fbXVsX3BzKGMwLCBfbW1fc2V0MV9wcygxLjBmIC8gOC4wZikpOyAKKworCQkJCQkJCV9tbV9zdG9yZV9wcygoZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpLCBjMCk7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQkJc291cmNlMiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTMgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U0ICs9IHBpdGNoOworCQkJCQkJc291cmNlNSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTYgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U3ICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gMTYpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCArPSA0KQorCQkJCQkJeworCQkJCQkJCV9fbTEyOCBjMCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTAgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTEgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMiA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTIgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMyA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTMgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjNCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTQgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjNSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTUgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjNiA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTYgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjNyA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTcgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjOCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTggKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjOSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTkgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjQSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZUEgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjQiA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZUIgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjQyA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZUMgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjRCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZUQgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjRSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZUUgKyA0ICogeCkpOworCQkJCQkJCV9fbTEyOCBjRiA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZUYgKyA0ICogeCkpOworCisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMSk7CisJCQkJCQkJYzIgPSBfbW1fYWRkX3BzKGMyLCBjMyk7CisJCQkJCQkJYzQgPSBfbW1fYWRkX3BzKGM0LCBjNSk7CisJCQkJCQkJYzYgPSBfbW1fYWRkX3BzKGM2LCBjNyk7CisJCQkJCQkJYzggPSBfbW1fYWRkX3BzKGM4LCBjOSk7CisJCQkJCQkJY0EgPSBfbW1fYWRkX3BzKGNBLCBjQik7CisJCQkJCQkJY0MgPSBfbW1fYWRkX3BzKGNDLCBjRCk7CisJCQkJCQkJY0UgPSBfbW1fYWRkX3BzKGNFLCBjRik7CisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMik7CisJCQkJCQkJYzQgPSBfbW1fYWRkX3BzKGM0LCBjNik7CisJCQkJCQkJYzggPSBfbW1fYWRkX3BzKGM4LCBjQSk7CisJCQkJCQkJY0MgPSBfbW1fYWRkX3BzKGNDLCBjRSk7CisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjNCk7CisJCQkJCQkJYzggPSBfbW1fYWRkX3BzKGM4LCBjQyk7CisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjOCk7CisJCQkJCQkJYzAgPSBfbW1fbXVsX3BzKGMwLCBfbW1fc2V0MV9wcygxLjBmIC8gMTYuMGYpKTsgCisKKwkJCQkJCQlfbW1fc3RvcmVfcHMoKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KSwgYzApOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQkJc291cmNlNCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U2ICs9IHBpdGNoOworCQkJCQkJc291cmNlNyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTggKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U5ICs9IHBpdGNoOworCQkJCQkJc291cmNlQSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VDICs9IHBpdGNoOworCQkJCQkJc291cmNlRCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VGICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZihpbnRlcm5hbC5kZXB0aCA9PSAyKQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQlmbG9hdCBjMCA9ICooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMxID0gKihmbG9hdCopKHNvdXJjZTEgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IGMwICsgYzE7CisJCQkJCQkJYzAgKj0gMS4wZiAvIDIuMGY7CisKKwkJCQkJCQkqKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDQpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCWZsb2F0IGMwID0gKihmbG9hdCopKHNvdXJjZTAgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzEgPSAqKGZsb2F0Kikoc291cmNlMSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjMiA9ICooZmxvYXQqKShzb3VyY2UyICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMzID0gKihmbG9hdCopKHNvdXJjZTMgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IGMwICsgYzE7CisJCQkJCQkJYzIgPSBjMiArIGMzOworCQkJCQkJCWMwID0gYzAgKyBjMjsKKwkJCQkJCQljMCAqPSAxLjBmIC8gNC4wZjsKKworCQkJCQkJCSooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpID0gYzA7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQkJc291cmNlMiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTMgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSA4KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQlmbG9hdCBjMCA9ICooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMxID0gKihmbG9hdCopKHNvdXJjZTEgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzIgPSAqKGZsb2F0Kikoc291cmNlMiArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjMyA9ICooZmxvYXQqKShzb3VyY2UzICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM0ID0gKihmbG9hdCopKHNvdXJjZTQgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzUgPSAqKGZsb2F0Kikoc291cmNlNSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjNiA9ICooZmxvYXQqKShzb3VyY2U2ICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM3ID0gKihmbG9hdCopKHNvdXJjZTcgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IGMwICsgYzE7CisJCQkJCQkJYzIgPSBjMiArIGMzOworCQkJCQkJCWM0ID0gYzQgKyBjNTsKKwkJCQkJCQljNiA9IGM2ICsgYzc7CisJCQkJCQkJYzAgPSBjMCArIGMyOworCQkJCQkJCWM0ID0gYzQgKyBjNjsKKwkJCQkJCQljMCA9IGMwICsgYzQ7CisJCQkJCQkJYzAgKj0gMS4wZiAvIDguMGY7CisKKwkJCQkJCQkqKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQkJc291cmNlNCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U2ICs9IHBpdGNoOworCQkJCQkJc291cmNlNyArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDE2KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQlmbG9hdCBjMCA9ICooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMxID0gKihmbG9hdCopKHNvdXJjZTEgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzIgPSAqKGZsb2F0Kikoc291cmNlMiArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjMyA9ICooZmxvYXQqKShzb3VyY2UzICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM0ID0gKihmbG9hdCopKHNvdXJjZTQgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzUgPSAqKGZsb2F0Kikoc291cmNlNSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjNiA9ICooZmxvYXQqKShzb3VyY2U2ICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM3ID0gKihmbG9hdCopKHNvdXJjZTcgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzggPSAqKGZsb2F0Kikoc291cmNlOCArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjOSA9ICooZmxvYXQqKShzb3VyY2U5ICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGNBID0gKihmbG9hdCopKHNvdXJjZUEgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgY0IgPSAqKGZsb2F0Kikoc291cmNlQiArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjQyA9ICooZmxvYXQqKShzb3VyY2VDICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGNEID0gKihmbG9hdCopKHNvdXJjZUQgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgY0UgPSAqKGZsb2F0Kikoc291cmNlRSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjRiA9ICooZmxvYXQqKShzb3VyY2VGICsgNCAqIHgpOworCisJCQkJCQkJYzAgPSBjMCArIGMxOworCQkJCQkJCWMyID0gYzIgKyBjMzsKKwkJCQkJCQljNCA9IGM0ICsgYzU7CisJCQkJCQkJYzYgPSBjNiArIGM3OworCQkJCQkJCWM4ID0gYzggKyBjOTsKKwkJCQkJCQljQSA9IGNBICsgY0I7CisJCQkJCQkJY0MgPSBjQyArIGNEOworCQkJCQkJCWNFID0gY0UgKyBjRjsKKwkJCQkJCQljMCA9IGMwICsgYzI7CisJCQkJCQkJYzQgPSBjNCArIGM2OworCQkJCQkJCWM4ID0gYzggKyBjQTsKKwkJCQkJCQljQyA9IGNDICsgY0U7CisJCQkJCQkJYzAgPSBjMCArIGM0OworCQkJCQkJCWM4ID0gYzggKyBjQzsKKwkJCQkJCQljMCA9IGMwICsgYzg7CisJCQkJCQkJYzAgKj0gMS4wZiAvIDE2LjBmOworCisJCQkJCQkJKihmbG9hdCopKHNvdXJjZTAgKyA0ICogeCkgPSBjMDsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U4ICs9IHBpdGNoOworCQkJCQkJc291cmNlOSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VCICs9IHBpdGNoOworCQkJCQkJc291cmNlQyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VFICs9IHBpdGNoOworCQkJCQkJc291cmNlRiArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZihpbnRlcm5hbC5mb3JtYXQgPT0gRk9STUFUX0czMlIzMkYpCisJCXsKKwkJCWlmKENQVUlEOjpzdXBwb3J0c1NTRSgpICYmICh3aWR0aCAlIDIpID09IDApCisJCQl7CisJCQkJaWYoaW50ZXJuYWwuZGVwdGggPT0gMikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4IGMwID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGMxID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMSArIDggKiB4KSk7CisJCQkJCQkJCisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMSk7CisJCQkJCQkJYzAgPSBfbW1fbXVsX3BzKGMwLCBfbW1fc2V0MV9wcygxLjBmIC8gMi4wZikpOyAKKworCQkJCQkJCV9tbV9zdG9yZV9wcygoZmxvYXQqKShzb3VyY2UwICsgOCAqIHgpLCBjMCk7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gNCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4IGMwID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGMxID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGMyID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMiArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGMzID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMyArIDggKiB4KSk7CisJCQkJCQkJCisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMSk7CisJCQkJCQkJYzIgPSBfbW1fYWRkX3BzKGMyLCBjMyk7CisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMik7CisJCQkJCQkJYzAgPSBfbW1fbXVsX3BzKGMwLCBfbW1fc2V0MV9wcygxLjBmIC8gNC4wZikpOyAKKworCQkJCQkJCV9tbV9zdG9yZV9wcygoZmxvYXQqKShzb3VyY2UwICsgOCAqIHgpLCBjMCk7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQkJc291cmNlMiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTMgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSA4KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMikKKwkJCQkJCXsKKwkJCQkJCQlfX20xMjggYzAgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2UwICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzEgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2UxICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzIgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2UyICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzMgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2UzICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzQgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2U0ICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzUgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2U1ICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzYgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2U2ICsgOCAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzcgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2U3ICsgOCAqIHgpKTsKKwkJCQkJCQkKKwkJCQkJCQljMCA9IF9tbV9hZGRfcHMoYzAsIGMxKTsKKwkJCQkJCQljMiA9IF9tbV9hZGRfcHMoYzIsIGMzKTsKKwkJCQkJCQljNCA9IF9tbV9hZGRfcHMoYzQsIGM1KTsKKwkJCQkJCQljNiA9IF9tbV9hZGRfcHMoYzYsIGM3KTsKKwkJCQkJCQljMCA9IF9tbV9hZGRfcHMoYzAsIGMyKTsKKwkJCQkJCQljNCA9IF9tbV9hZGRfcHMoYzQsIGM2KTsKKwkJCQkJCQljMCA9IF9tbV9hZGRfcHMoYzAsIGM0KTsKKwkJCQkJCQljMCA9IF9tbV9tdWxfcHMoYzAsIF9tbV9zZXQxX3BzKDEuMGYgLyA4LjBmKSk7IAorCisJCQkJCQkJX21tX3N0b3JlX3BzKChmbG9hdCopKHNvdXJjZTAgKyA4ICogeCksIGMwKTsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSAxNikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpCisJCQkJCQl7CisJCQkJCQkJX19tMTI4IGMwID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGMxID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGMyID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMiArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGMzID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMyArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGM0ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGM1ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGM2ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNiArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGM3ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNyArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGM4ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlOCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGM5ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlOSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGNBID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlQSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGNCID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlQiArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGNDID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlQyArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGNEID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlRCArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGNFID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlRSArIDggKiB4KSk7CisJCQkJCQkJX19tMTI4IGNGID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlRiArIDggKiB4KSk7CisKKwkJCQkJCQljMCA9IF9tbV9hZGRfcHMoYzAsIGMxKTsKKwkJCQkJCQljMiA9IF9tbV9hZGRfcHMoYzIsIGMzKTsKKwkJCQkJCQljNCA9IF9tbV9hZGRfcHMoYzQsIGM1KTsKKwkJCQkJCQljNiA9IF9tbV9hZGRfcHMoYzYsIGM3KTsKKwkJCQkJCQljOCA9IF9tbV9hZGRfcHMoYzgsIGM5KTsKKwkJCQkJCQljQSA9IF9tbV9hZGRfcHMoY0EsIGNCKTsKKwkJCQkJCQljQyA9IF9tbV9hZGRfcHMoY0MsIGNEKTsKKwkJCQkJCQljRSA9IF9tbV9hZGRfcHMoY0UsIGNGKTsKKwkJCQkJCQljMCA9IF9tbV9hZGRfcHMoYzAsIGMyKTsKKwkJCQkJCQljNCA9IF9tbV9hZGRfcHMoYzQsIGM2KTsKKwkJCQkJCQljOCA9IF9tbV9hZGRfcHMoYzgsIGNBKTsKKwkJCQkJCQljQyA9IF9tbV9hZGRfcHMoY0MsIGNFKTsKKwkJCQkJCQljMCA9IF9tbV9hZGRfcHMoYzAsIGM0KTsKKwkJCQkJCQljOCA9IF9tbV9hZGRfcHMoYzgsIGNDKTsKKwkJCQkJCQljMCA9IF9tbV9hZGRfcHMoYzAsIGM4KTsKKwkJCQkJCQljMCA9IF9tbV9tdWxfcHMoYzAsIF9tbV9zZXQxX3BzKDEuMGYgLyAxNi4wZikpOyAKKworCQkJCQkJCV9tbV9zdG9yZV9wcygoZmxvYXQqKShzb3VyY2UwICsgOCAqIHgpLCBjMCk7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQkJc291cmNlMiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTMgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U0ICs9IHBpdGNoOworCQkJCQkJc291cmNlNSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTYgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U3ICs9IHBpdGNoOworCQkJCQkJc291cmNlOCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTkgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VBICs9IHBpdGNoOworCQkJCQkJc291cmNlQiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUMgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VEICs9IHBpdGNoOworCQkJCQkJc291cmNlRSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUYgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBBU1NFUlQoZmFsc2UpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKGludGVybmFsLmRlcHRoID09IDIpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCAyICogd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQlmbG9hdCBjMCA9ICooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMxID0gKihmbG9hdCopKHNvdXJjZTEgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IGMwICsgYzE7CisJCQkJCQkJYzAgKj0gMS4wZiAvIDIuMGY7CisKKwkJCQkJCQkqKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDQpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCAyICogd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQlmbG9hdCBjMCA9ICooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMxID0gKihmbG9hdCopKHNvdXJjZTEgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzIgPSAqKGZsb2F0Kikoc291cmNlMiArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjMyA9ICooZmxvYXQqKShzb3VyY2UzICsgNCAqIHgpOworCisJCQkJCQkJYzAgPSBjMCArIGMxOworCQkJCQkJCWMyID0gYzIgKyBjMzsKKwkJCQkJCQljMCA9IGMwICsgYzI7CisJCQkJCQkJYzAgKj0gMS4wZiAvIDQuMGY7CisKKwkJCQkJCQkqKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gOCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IDIgKiB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCWZsb2F0IGMwID0gKihmbG9hdCopKHNvdXJjZTAgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzEgPSAqKGZsb2F0Kikoc291cmNlMSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjMiA9ICooZmxvYXQqKShzb3VyY2UyICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMzID0gKihmbG9hdCopKHNvdXJjZTMgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzQgPSAqKGZsb2F0Kikoc291cmNlNCArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjNSA9ICooZmxvYXQqKShzb3VyY2U1ICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM2ID0gKihmbG9hdCopKHNvdXJjZTYgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzcgPSAqKGZsb2F0Kikoc291cmNlNyArIDQgKiB4KTsKKworCQkJCQkJCWMwID0gYzAgKyBjMTsKKwkJCQkJCQljMiA9IGMyICsgYzM7CisJCQkJCQkJYzQgPSBjNCArIGM1OworCQkJCQkJCWM2ID0gYzYgKyBjNzsKKwkJCQkJCQljMCA9IGMwICsgYzI7CisJCQkJCQkJYzQgPSBjNCArIGM2OworCQkJCQkJCWMwID0gYzAgKyBjNDsKKwkJCQkJCQljMCAqPSAxLjBmIC8gOC4wZjsKKworCQkJCQkJCSooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpID0gYzA7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQkJc291cmNlMiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTMgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U0ICs9IHBpdGNoOworCQkJCQkJc291cmNlNSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTYgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U3ICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gMTYpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCAyICogd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQlmbG9hdCBjMCA9ICooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMxID0gKihmbG9hdCopKHNvdXJjZTEgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzIgPSAqKGZsb2F0Kikoc291cmNlMiArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjMyA9ICooZmxvYXQqKShzb3VyY2UzICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM0ID0gKihmbG9hdCopKHNvdXJjZTQgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzUgPSAqKGZsb2F0Kikoc291cmNlNSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjNiA9ICooZmxvYXQqKShzb3VyY2U2ICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM3ID0gKihmbG9hdCopKHNvdXJjZTcgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzggPSAqKGZsb2F0Kikoc291cmNlOCArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjOSA9ICooZmxvYXQqKShzb3VyY2U5ICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGNBID0gKihmbG9hdCopKHNvdXJjZUEgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgY0IgPSAqKGZsb2F0Kikoc291cmNlQiArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjQyA9ICooZmxvYXQqKShzb3VyY2VDICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGNEID0gKihmbG9hdCopKHNvdXJjZUQgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgY0UgPSAqKGZsb2F0Kikoc291cmNlRSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjRiA9ICooZmxvYXQqKShzb3VyY2VGICsgNCAqIHgpOworCisJCQkJCQkJYzAgPSBjMCArIGMxOworCQkJCQkJCWMyID0gYzIgKyBjMzsKKwkJCQkJCQljNCA9IGM0ICsgYzU7CisJCQkJCQkJYzYgPSBjNiArIGM3OworCQkJCQkJCWM4ID0gYzggKyBjOTsKKwkJCQkJCQljQSA9IGNBICsgY0I7CisJCQkJCQkJY0MgPSBjQyArIGNEOworCQkJCQkJCWNFID0gY0UgKyBjRjsKKwkJCQkJCQljMCA9IGMwICsgYzI7CisJCQkJCQkJYzQgPSBjNCArIGM2OworCQkJCQkJCWM4ID0gYzggKyBjQTsKKwkJCQkJCQljQyA9IGNDICsgY0U7CisJCQkJCQkJYzAgPSBjMCArIGM0OworCQkJCQkJCWM4ID0gYzggKyBjQzsKKwkJCQkJCQljMCA9IGMwICsgYzg7CisJCQkJCQkJYzAgKj0gMS4wZiAvIDE2LjBmOworCisJCQkJCQkJKihmbG9hdCopKHNvdXJjZTAgKyA0ICogeCkgPSBjMDsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U4ICs9IHBpdGNoOworCQkJCQkJc291cmNlOSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VCICs9IHBpdGNoOworCQkJCQkJc291cmNlQyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VFICs9IHBpdGNoOworCQkJCQkJc291cmNlRiArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZihpbnRlcm5hbC5mb3JtYXQgPT0gRk9STUFUX0EzMkIzMkczMlIzMkYpCisJCXsKKwkJCWlmKENQVUlEOjpzdXBwb3J0c1NTRSgpKQorCQkJeworCQkJCWlmKGludGVybmFsLmRlcHRoID09IDIpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCV9fbTEyOCBjMCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTAgKyAxNiAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzEgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2UxICsgMTYgKiB4KSk7CisJCQkJCQkJCisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMSk7CisJCQkJCQkJYzAgPSBfbW1fbXVsX3BzKGMwLCBfbW1fc2V0MV9wcygxLjBmIC8gMi4wZikpOyAKKworCQkJCQkJCV9tbV9zdG9yZV9wcygoZmxvYXQqKShzb3VyY2UwICsgMTYgKiB4KSwgYzApOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGludGVybmFsLmRlcHRoID09IDQpCisJCQkJeworCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQkJCXsKKwkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCV9fbTEyOCBjMCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTAgKyAxNiAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzEgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2UxICsgMTYgKiB4KSk7CisJCQkJCQkJX19tMTI4IGMyID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMiArIDE2ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMyA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTMgKyAxNiAqIHgpKTsKKwkJCQkJCQkKKwkJCQkJCQljMCA9IF9tbV9hZGRfcHMoYzAsIGMxKTsKKwkJCQkJCQljMiA9IF9tbV9hZGRfcHMoYzIsIGMzKTsKKwkJCQkJCQljMCA9IF9tbV9hZGRfcHMoYzAsIGMyKTsKKwkJCQkJCQljMCA9IF9tbV9tdWxfcHMoYzAsIF9tbV9zZXQxX3BzKDEuMGYgLyA0LjBmKSk7IAorCisJCQkJCQkJX21tX3N0b3JlX3BzKChmbG9hdCopKHNvdXJjZTAgKyAxNiAqIHgpLCBjMCk7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQkJc291cmNlMiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTMgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSA4KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQlfX20xMjggYzAgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2UwICsgMTYgKiB4KSk7CisJCQkJCQkJX19tMTI4IGMxID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMSArIDE2ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMiA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTIgKyAxNiAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzMgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2UzICsgMTYgKiB4KSk7CisJCQkJCQkJX19tMTI4IGM0ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNCArIDE2ICogeCkpOworCQkJCQkJCV9fbTEyOCBjNSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTUgKyAxNiAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzYgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2U2ICsgMTYgKiB4KSk7CisJCQkJCQkJX19tMTI4IGM3ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNyArIDE2ICogeCkpOworCQkJCQkJCQorCQkJCQkJCWMwID0gX21tX2FkZF9wcyhjMCwgYzEpOworCQkJCQkJCWMyID0gX21tX2FkZF9wcyhjMiwgYzMpOworCQkJCQkJCWM0ID0gX21tX2FkZF9wcyhjNCwgYzUpOworCQkJCQkJCWM2ID0gX21tX2FkZF9wcyhjNiwgYzcpOworCQkJCQkJCWMwID0gX21tX2FkZF9wcyhjMCwgYzIpOworCQkJCQkJCWM0ID0gX21tX2FkZF9wcyhjNCwgYzYpOworCQkJCQkJCWMwID0gX21tX2FkZF9wcyhjMCwgYzQpOworCQkJCQkJCWMwID0gX21tX211bF9wcyhjMCwgX21tX3NldDFfcHMoMS4wZiAvIDguMGYpKTsgCisKKwkJCQkJCQlfbW1fc3RvcmVfcHMoKGZsb2F0Kikoc291cmNlMCArIDE2ICogeCksIGMwKTsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSAxNikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCQkJCQl7CisJCQkJCQkJX19tMTI4IGMwID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMCArIDE2ICogeCkpOworCQkJCQkJCV9fbTEyOCBjMSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTEgKyAxNiAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzIgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2UyICsgMTYgKiB4KSk7CisJCQkJCQkJX19tMTI4IGMzID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlMyArIDE2ICogeCkpOworCQkJCQkJCV9fbTEyOCBjNCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTQgKyAxNiAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzUgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2U1ICsgMTYgKiB4KSk7CisJCQkJCQkJX19tMTI4IGM2ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlNiArIDE2ICogeCkpOworCQkJCQkJCV9fbTEyOCBjNyA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZTcgKyAxNiAqIHgpKTsKKwkJCQkJCQlfX20xMjggYzggPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2U4ICsgMTYgKiB4KSk7CisJCQkJCQkJX19tMTI4IGM5ID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlOSArIDE2ICogeCkpOworCQkJCQkJCV9fbTEyOCBjQSA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZUEgKyAxNiAqIHgpKTsKKwkJCQkJCQlfX20xMjggY0IgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2VCICsgMTYgKiB4KSk7CisJCQkJCQkJX19tMTI4IGNDID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlQyArIDE2ICogeCkpOworCQkJCQkJCV9fbTEyOCBjRCA9IF9tbV9sb2FkX3BzKChmbG9hdCopKHNvdXJjZUQgKyAxNiAqIHgpKTsKKwkJCQkJCQlfX20xMjggY0UgPSBfbW1fbG9hZF9wcygoZmxvYXQqKShzb3VyY2VFICsgMTYgKiB4KSk7CisJCQkJCQkJX19tMTI4IGNGID0gX21tX2xvYWRfcHMoKGZsb2F0Kikoc291cmNlRiArIDE2ICogeCkpOworCisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMSk7CisJCQkJCQkJYzIgPSBfbW1fYWRkX3BzKGMyLCBjMyk7CisJCQkJCQkJYzQgPSBfbW1fYWRkX3BzKGM0LCBjNSk7CisJCQkJCQkJYzYgPSBfbW1fYWRkX3BzKGM2LCBjNyk7CisJCQkJCQkJYzggPSBfbW1fYWRkX3BzKGM4LCBjOSk7CisJCQkJCQkJY0EgPSBfbW1fYWRkX3BzKGNBLCBjQik7CisJCQkJCQkJY0MgPSBfbW1fYWRkX3BzKGNDLCBjRCk7CisJCQkJCQkJY0UgPSBfbW1fYWRkX3BzKGNFLCBjRik7CisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjMik7CisJCQkJCQkJYzQgPSBfbW1fYWRkX3BzKGM0LCBjNik7CisJCQkJCQkJYzggPSBfbW1fYWRkX3BzKGM4LCBjQSk7CisJCQkJCQkJY0MgPSBfbW1fYWRkX3BzKGNDLCBjRSk7CisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjNCk7CisJCQkJCQkJYzggPSBfbW1fYWRkX3BzKGM4LCBjQyk7CisJCQkJCQkJYzAgPSBfbW1fYWRkX3BzKGMwLCBjOCk7CisJCQkJCQkJYzAgPSBfbW1fbXVsX3BzKGMwLCBfbW1fc2V0MV9wcygxLjBmIC8gMTYuMGYpKTsgCisKKwkJCQkJCQlfbW1fc3RvcmVfcHMoKGZsb2F0Kikoc291cmNlMCArIDE2ICogeCksIGMwKTsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U4ICs9IHBpdGNoOworCQkJCQkJc291cmNlOSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VCICs9IHBpdGNoOworCQkJCQkJc291cmNlQyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VFICs9IHBpdGNoOworCQkJCQkJc291cmNlRiArPSBwaXRjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoaW50ZXJuYWwuZGVwdGggPT0gMikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IDQgKiB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCWZsb2F0IGMwID0gKihmbG9hdCopKHNvdXJjZTAgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzEgPSAqKGZsb2F0Kikoc291cmNlMSArIDQgKiB4KTsKKworCQkJCQkJCWMwID0gYzAgKyBjMTsKKwkJCQkJCQljMCAqPSAxLjBmIC8gMi4wZjsKKworCQkJCQkJCSooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpID0gYzA7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoaW50ZXJuYWwuZGVwdGggPT0gNCkKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IDQgKiB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCWZsb2F0IGMwID0gKihmbG9hdCopKHNvdXJjZTAgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzEgPSAqKGZsb2F0Kikoc291cmNlMSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjMiA9ICooZmxvYXQqKShzb3VyY2UyICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMzID0gKihmbG9hdCopKHNvdXJjZTMgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IGMwICsgYzE7CisJCQkJCQkJYzIgPSBjMiArIGMzOworCQkJCQkJCWMwID0gYzAgKyBjMjsKKwkJCQkJCQljMCAqPSAxLjBmIC8gNC4wZjsKKworCQkJCQkJCSooZmxvYXQqKShzb3VyY2UwICsgNCAqIHgpID0gYzA7CisJCQkJCQl9CisKKwkJCQkJCXNvdXJjZTAgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UxICs9IHBpdGNoOworCQkJCQkJc291cmNlMiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTMgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSA4KQorCQkJCXsKKwkJCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IoaW50IHggPSAwOyB4IDwgNCAqIHdpZHRoOyB4KyspCisJCQkJCQl7CisJCQkJCQkJZmxvYXQgYzAgPSAqKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjMSA9ICooZmxvYXQqKShzb3VyY2UxICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMyID0gKihmbG9hdCopKHNvdXJjZTIgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzMgPSAqKGZsb2F0Kikoc291cmNlMyArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjNCA9ICooZmxvYXQqKShzb3VyY2U0ICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM1ID0gKihmbG9hdCopKHNvdXJjZTUgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzYgPSAqKGZsb2F0Kikoc291cmNlNiArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjNyA9ICooZmxvYXQqKShzb3VyY2U3ICsgNCAqIHgpOworCisJCQkJCQkJYzAgPSBjMCArIGMxOworCQkJCQkJCWMyID0gYzIgKyBjMzsKKwkJCQkJCQljNCA9IGM0ICsgYzU7CisJCQkJCQkJYzYgPSBjNiArIGM3OworCQkJCQkJCWMwID0gYzAgKyBjMjsKKwkJCQkJCQljNCA9IGM0ICsgYzY7CisJCQkJCQkJYzAgPSBjMCArIGM0OworCQkJCQkJCWMwICo9IDEuMGYgLyA4LjBmOworCisJCQkJCQkJKihmbG9hdCopKHNvdXJjZTAgKyA0ICogeCkgPSBjMDsKKwkJCQkJCX0KKworCQkJCQkJc291cmNlMCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTEgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UyICs9IHBpdGNoOworCQkJCQkJc291cmNlMyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTQgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U1ICs9IHBpdGNoOworCQkJCQkJc291cmNlNiArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTcgKz0gcGl0Y2g7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZihpbnRlcm5hbC5kZXB0aCA9PSAxNikKKwkJCQl7CisJCQkJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yKGludCB4ID0gMDsgeCA8IDQgKiB3aWR0aDsgeCsrKQorCQkJCQkJeworCQkJCQkJCWZsb2F0IGMwID0gKihmbG9hdCopKHNvdXJjZTAgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzEgPSAqKGZsb2F0Kikoc291cmNlMSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjMiA9ICooZmxvYXQqKShzb3VyY2UyICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGMzID0gKihmbG9hdCopKHNvdXJjZTMgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzQgPSAqKGZsb2F0Kikoc291cmNlNCArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjNSA9ICooZmxvYXQqKShzb3VyY2U1ICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM2ID0gKihmbG9hdCopKHNvdXJjZTYgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgYzcgPSAqKGZsb2F0Kikoc291cmNlNyArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjOCA9ICooZmxvYXQqKShzb3VyY2U4ICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGM5ID0gKihmbG9hdCopKHNvdXJjZTkgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgY0EgPSAqKGZsb2F0Kikoc291cmNlQSArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjQiA9ICooZmxvYXQqKShzb3VyY2VCICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGNDID0gKihmbG9hdCopKHNvdXJjZUMgKyA0ICogeCk7CisJCQkJCQkJZmxvYXQgY0QgPSAqKGZsb2F0Kikoc291cmNlRCArIDQgKiB4KTsKKwkJCQkJCQlmbG9hdCBjRSA9ICooZmxvYXQqKShzb3VyY2VFICsgNCAqIHgpOworCQkJCQkJCWZsb2F0IGNGID0gKihmbG9hdCopKHNvdXJjZUYgKyA0ICogeCk7CisKKwkJCQkJCQljMCA9IGMwICsgYzE7CisJCQkJCQkJYzIgPSBjMiArIGMzOworCQkJCQkJCWM0ID0gYzQgKyBjNTsKKwkJCQkJCQljNiA9IGM2ICsgYzc7CisJCQkJCQkJYzggPSBjOCArIGM5OworCQkJCQkJCWNBID0gY0EgKyBjQjsKKwkJCQkJCQljQyA9IGNDICsgY0Q7CisJCQkJCQkJY0UgPSBjRSArIGNGOworCQkJCQkJCWMwID0gYzAgKyBjMjsKKwkJCQkJCQljNCA9IGM0ICsgYzY7CisJCQkJCQkJYzggPSBjOCArIGNBOworCQkJCQkJCWNDID0gY0MgKyBjRTsKKwkJCQkJCQljMCA9IGMwICsgYzQ7CisJCQkJCQkJYzggPSBjOCArIGNDOworCQkJCQkJCWMwID0gYzAgKyBjODsKKwkJCQkJCQljMCAqPSAxLjBmIC8gMTYuMGY7CisKKwkJCQkJCQkqKGZsb2F0Kikoc291cmNlMCArIDQgKiB4KSA9IGMwOworCQkJCQkJfQorCisJCQkJCQlzb3VyY2UwICs9IHBpdGNoOworCQkJCQkJc291cmNlMSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2UzICs9IHBpdGNoOworCQkJCQkJc291cmNlNCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U2ICs9IHBpdGNoOworCQkJCQkJc291cmNlNyArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZTggKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2U5ICs9IHBpdGNoOworCQkJCQkJc291cmNlQSArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUIgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VDICs9IHBpdGNoOworCQkJCQkJc291cmNlRCArPSBwaXRjaDsKKwkJCQkJCXNvdXJjZUUgKz0gcGl0Y2g7CisJCQkJCQlzb3VyY2VGICs9IHBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJLy8JVU5JTVBMRU1FTlRFRCgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1N1cmZhY2UuaHBwIGIvc3JjL1JlbmRlcmVyL1N1cmZhY2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDZhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvU3VyZmFjZS5ocHAKQEAgLTAsMCArMSw0NzMgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIHN3X1N1cmZhY2VfaHBwDQorI2RlZmluZSBzd19TdXJmYWNlX2hwcA0KKw0KKyNpbmNsdWRlICJDb2xvci5ocHAiDQorI2luY2x1ZGUgIk1haW4vQ29uZmlnLmhwcCINCisjaW5jbHVkZSAiQ29tbW9uL1Jlc291cmNlLmhwcCINCisNCituYW1lc3BhY2Ugc3cNCit7DQorCWNsYXNzIFJlc291cmNlOw0KKw0KKwlzdHJ1Y3QgUmVjdCAgIC8vIFRvcC1sZWZ0IGNvb3JkaW5hdGUgc3lzdGVtDQorCXsNCisJCXVuaW9uIHtpbnQgbGVmdDsgICBpbnQgeDE7fTsNCisJCXVuaW9uIHtpbnQgdG9wOyAgICBpbnQgeTE7fTsNCisJCXVuaW9uIHtpbnQgcmlnaHQ7ICBpbnQgeDI7fTsNCisJCXVuaW9uIHtpbnQgYm90dG9tOyBpbnQgeTI7fTsNCisJfTsNCisNCisJZW51bSBGb3JtYXQNCisJew0KKwkJRk9STUFUX05VTEwsDQorDQorCQlGT1JNQVRfQTgsDQorCQlGT1JNQVRfUjgsDQorCQlGT1JNQVRfUjNHM0IyLA0KKwkJRk9STUFUX0E4UjNHM0IyLA0KKwkJRk9STUFUX1g0UjRHNEI0LA0KKwkJRk9STUFUX0E0UjRHNEI0LA0KKwkJRk9STUFUX1I1RzZCNSwNCisJCUZPUk1BVF9SOEc4QjgsDQorCQlGT1JNQVRfWDhSOEc4QjgsDQorCQlGT1JNQVRfQThSOEc4QjgsDQorCQlGT1JNQVRfWDhCOEc4UjgsDQorCQlGT1JNQVRfQThCOEc4UjgsDQorCQlGT1JNQVRfWDFSNUc1QjUsDQorCQlGT1JNQVRfQTFSNUc1QjUsDQorCQlGT1JNQVRfRzhSOCwNCisJCUZPUk1BVF9HMTZSMTYsDQorCQlGT1JNQVRfQTJSMTBHMTBCMTAsDQorCQlGT1JNQVRfQTJCMTBHMTBSMTAsDQorCQlGT1JNQVRfQTE2QjE2RzE2UjE2LA0KKwkJLy8gUGFsZXR0ZWQgZm9ybWF0cw0KKwkJRk9STUFUX1A4LA0KKwkJRk9STUFUX0E4UDgsDQorCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMNCisJCSNpZiBTM1RDX1NVUFBPUlQNCisJCUZPUk1BVF9EWFQxLA0KKwkJRk9STUFUX0RYVDMsDQorCQlGT1JNQVRfRFhUNSwNCisJCUZPUk1BVF9BVEkxLA0KKwkJRk9STUFUX0FUSTIsDQorCQkjZW5kaWYNCisJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMNCisJCUZPUk1BVF9SMTZGLA0KKwkJRk9STUFUX0cxNlIxNkYsDQorCQlGT1JNQVRfQTE2QjE2RzE2UjE2RiwNCisJCUZPUk1BVF9SMzJGLA0KKwkJRk9STUFUX0czMlIzMkYsDQorCQlGT1JNQVRfQTMyQjMyRzMyUjMyRiwgDQorCQkvLyBCdW1wIG1hcCBmb3JtYXRzDQorCQlGT1JNQVRfVjhVOCwNCisJCUZPUk1BVF9MNlY1VTUsDQorCQlGT1JNQVRfUThXOFY4VTgsDQorCQlGT1JNQVRfWDhMOFY4VTgsDQorCQlGT1JNQVRfQTJXMTBWMTBVMTAsDQorCQlGT1JNQVRfVjE2VTE2LA0KKwkJRk9STUFUX0ExNlcxNlYxNlUxNiwNCisJCUZPUk1BVF9RMTZXMTZWMTZVMTYsDQorCQkvLyBMdW1pbmFuY2UgZm9ybWF0cw0KKwkJRk9STUFUX0w4LA0KKwkJRk9STUFUX0E0TDQsDQorCQlGT1JNQVRfTDE2LA0KKwkJRk9STUFUX0E4TDgsDQorCQkvLyBEZXB0aC9zdGVuY2lsIGZvcm1hdHMNCisJCUZPUk1BVF9EMTYsDQorCQlGT1JNQVRfRDMyLA0KKwkJRk9STUFUX0QyNFg4LA0KKwkJRk9STUFUX0QyNFM4LA0KKwkJRk9STUFUX0QyNEZTOCwNCisJCUZPUk1BVF9EMzJGLCAgICAgICAgICAgICAgICAgLy8gUXVhZCBsYXlvdXQNCisJCUZPUk1BVF9EMzJGX0NPTVBMRU1FTlRBUlksICAgLy8gUXVhZCBsYXlvdXQsIDEgLSB6DQorCQlGT1JNQVRfRDMyRl9MT0NLQUJMRSwgICAgICAgIC8vIExpbmVhciBsYXlvdXQNCisJCUZPUk1BVF9EMzJGX1RFWFRVUkUsICAgICAgICAgLy8gTGluZWFyIGxheW91dCwgbm8gUENGDQorCQlGT1JNQVRfRDMyRl9TSEFET1csICAgICAgICAgIC8vIExpbmVhciBsYXlvdXQsIFBDRg0KKwkJRk9STUFUX0RGMjQsDQorCQlGT1JNQVRfREYxNiwNCisJCUZPUk1BVF9JTlRaLA0KKwkJRk9STUFUX1M4LA0KKwkJLy8gUXVhZCBsYXlvdXQgZnJhbWVidWZmZXINCisJCUZPUk1BVF9YOEc4UjhCOFEsDQorCQlGT1JNQVRfQThHOFI4QjhRLA0KKw0KKwkJRk9STUFUX0xBU1QgPSBGT1JNQVRfQThHOFI4QjhRDQorCX07DQorDQorCWVudW0gTG9jaw0KKwl7DQorCQlMT0NLX1VOTE9DS0VELA0KKwkJTE9DS19SRUFET05MWSwNCisJCUxPQ0tfV1JJVEVPTkxZLA0KKwkJTE9DS19SRUFEV1JJVEUsDQorCQlMT0NLX0RJU0NBUkQNCisJfTsNCisNCisJY2xhc3MgU3VyZmFjZQ0KKwl7DQorCXByaXZhdGU6DQorCQlzdHJ1Y3QgQnVmZmVyDQorCQl7DQorCQlwdWJsaWM6DQorCQkJdm9pZCB3cml0ZShpbnQgeCwgaW50IHksIGludCB6LCBjb25zdCBDb2xvcjxmbG9hdD4gJmNvbG9yKTsNCisJCQl2b2lkIHdyaXRlKGludCB4LCBpbnQgeSwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZjb2xvcik7DQorCQkJdm9pZCB3cml0ZSh2b2lkICplbGVtZW50LCBjb25zdCBDb2xvcjxmbG9hdD4gJmNvbG9yKTsNCisJCQlDb2xvcjxmbG9hdD4gcmVhZChpbnQgeCwgaW50IHksIGludCB6KSBjb25zdDsNCisJCQlDb2xvcjxmbG9hdD4gcmVhZChpbnQgeCwgaW50IHkpIGNvbnN0Ow0KKwkJCUNvbG9yPGZsb2F0PiByZWFkKHZvaWQgKmVsZW1lbnQpIGNvbnN0Ow0KKwkJCUNvbG9yPGZsb2F0PiBzYW1wbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgY29uc3Q7DQorCQkJQ29sb3I8ZmxvYXQ+IHNhbXBsZShmbG9hdCB4LCBmbG9hdCB5KSBjb25zdDsNCisNCisJCQl2b2lkICpsb2NrUmVjdChpbnQgbGVmdCwgaW50IHRvcCwgaW50IGZyb250LCBMb2NrIGxvY2spOw0KKwkJCXZvaWQgdW5sb2NrUmVjdCgpOw0KKw0KKwkJCXZvaWQgKmJ1ZmZlcjsNCisJCQlpbnQgd2lkdGg7DQorCQkJaW50IGhlaWdodDsNCisJCQlpbnQgZGVwdGg7DQorCQkJaW50IGJ5dGVzOw0KKwkJCWludCBwaXRjaEI7DQorCQkJaW50IHBpdGNoUDsNCisJCQlpbnQgc2xpY2VCOw0KKwkJCWludCBzbGljZVA7DQorCQkJRm9ybWF0IGZvcm1hdDsNCisJCQlMb2NrIGxvY2s7DQorCQkJDQorCQkJYm9vbCBkaXJ0eTsNCisJCQl1bnNpZ25lZCBpbnQgcGFsZXR0ZVVzZWQ7DQorCQl9Ow0KKw0KKwlwdWJsaWM6DQorCQlTdXJmYWNlKFJlc291cmNlICp0ZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgRm9ybWF0IGZvcm1hdCwgYm9vbCBsb2NrYWJsZSwgYm9vbCByZW5kZXJUYXJnZXQpOw0KKwkJDQorCQl2aXJ0dWFsIH5TdXJmYWNlKCk7DQorDQorCQl2b2lkICpsb2NrRXh0ZXJuYWwoaW50IGxlZnQsIGludCB0b3AsIGludCBmcm9udCwgTG9jayBsb2NrLCBBY2Nlc3NvciBjbGllbnQpOw0KKwkJdm9pZCB1bmxvY2tFeHRlcm5hbCgpOw0KKwkJaW5saW5lIGludCBnZXRFeHRlcm5hbFdpZHRoKCkgY29uc3Q7DQorCQlpbmxpbmUgaW50IGdldEV4dGVybmFsSGVpZ2h0KCkgY29uc3Q7DQorCQlpbmxpbmUgaW50IGdldEV4dGVybmFsRGVwdGgoKSBjb25zdDsNCisJCWlubGluZSBGb3JtYXQgZ2V0RXh0ZXJuYWxGb3JtYXQoKSBjb25zdDsNCisJCWlubGluZSBpbnQgZ2V0RXh0ZXJuYWxQaXRjaEIoKSBjb25zdDsNCisJCWlubGluZSBpbnQgZ2V0RXh0ZXJuYWxQaXRjaFAoKSBjb25zdDsNCisJCWlubGluZSBpbnQgZ2V0RXh0ZXJuYWxTbGljZUIoKSBjb25zdDsNCisJCWlubGluZSBpbnQgZ2V0RXh0ZXJuYWxTbGljZVAoKSBjb25zdDsNCisNCisJCXZpcnR1YWwgdm9pZCAqbG9ja0ludGVybmFsKGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgZnJvbnQsIExvY2sgbG9jaywgQWNjZXNzb3IgY2xpZW50KTsNCisJCXZpcnR1YWwgdm9pZCB1bmxvY2tJbnRlcm5hbCgpOw0KKwkJaW5saW5lIGludCBnZXRJbnRlcm5hbFdpZHRoKCkgY29uc3Q7DQorCQlpbmxpbmUgaW50IGdldEludGVybmFsSGVpZ2h0KCkgY29uc3Q7DQorCQlpbmxpbmUgaW50IGdldEludGVybmFsRGVwdGgoKSBjb25zdDsNCisJCWlubGluZSBGb3JtYXQgZ2V0SW50ZXJuYWxGb3JtYXQoKSBjb25zdDsNCisJCWlubGluZSBpbnQgZ2V0SW50ZXJuYWxQaXRjaEIoKSBjb25zdDsNCisJCWlubGluZSBpbnQgZ2V0SW50ZXJuYWxQaXRjaFAoKSBjb25zdDsNCisJCWlubGluZSBpbnQgZ2V0SW50ZXJuYWxTbGljZUIoKSBjb25zdDsNCisJCWlubGluZSBpbnQgZ2V0SW50ZXJuYWxTbGljZVAoKSBjb25zdDsNCisNCisJCXZvaWQgKmxvY2tTdGVuY2lsKGludCBmcm9udCwgQWNjZXNzb3IgY2xpZW50KTsNCisJCXZvaWQgdW5sb2NrU3RlbmNpbCgpOw0KKwkJaW5saW5lIGludCBnZXRTdGVuY2lsUGl0Y2hCKCkgY29uc3Q7DQorCQlpbmxpbmUgaW50IGdldFN0ZW5jaWxQaXRjaFAoKSBjb25zdDsNCisJCWlubGluZSBpbnQgZ2V0U3RlbmNpbFNsaWNlQigpIGNvbnN0Ow0KKw0KKwkJaW5saW5lIGludCBnZXRNdWx0aVNhbXBsZUNvdW50KCkgY29uc3Q7DQorCQlpbmxpbmUgaW50IGdldFN1cGVyU2FtcGxlQ291bnQoKSBjb25zdDsNCisNCisJCXZvaWQgY2xlYXJDb2xvckJ1ZmZlcih1bnNpZ25lZCBpbnQgY29sb3IsIHVuc2lnbmVkIGludCByZ2JhTWFzaywgaW50IHgwLCBpbnQgeTAsIGludCB3aWR0aCwgaW50IGhlaWdodCk7DQorCQl2b2lkIGNsZWFyRGVwdGhCdWZmZXIoZmxvYXQgZGVwdGgsIGludCB4MCwgaW50IHkwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOw0KKwkJdm9pZCBjbGVhclN0ZW5jaWxCdWZmZXIodW5zaWduZWQgY2hhciBzdGVuY2lsLCB1bnNpZ25lZCBjaGFyIG1hc2ssIGludCB4MCwgaW50IHkwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOw0KKwkJdm9pZCBmaWxsKGNvbnN0IENvbG9yPGZsb2F0PiAmY29sb3IsIGludCB4MCwgaW50IHkwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOw0KKw0KKwkJQ29sb3I8ZmxvYXQ+IHJlYWRFeHRlcm5hbChpbnQgeCwgaW50IHksIGludCB6KSBjb25zdDsNCisJCUNvbG9yPGZsb2F0PiByZWFkRXh0ZXJuYWwoaW50IHgsIGludCB5KSBjb25zdDsNCisJCUNvbG9yPGZsb2F0PiBzYW1wbGVFeHRlcm5hbChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSBjb25zdDsNCisJCUNvbG9yPGZsb2F0PiBzYW1wbGVFeHRlcm5hbChmbG9hdCB4LCBmbG9hdCB5KSBjb25zdDsNCisJCXZvaWQgd3JpdGVFeHRlcm5hbChpbnQgeCwgaW50IHksIGludCB6LCBjb25zdCBDb2xvcjxmbG9hdD4gJmNvbG9yKTsNCisJCXZvaWQgd3JpdGVFeHRlcm5hbChpbnQgeCwgaW50IHksIGNvbnN0IENvbG9yPGZsb2F0PiAmY29sb3IpOw0KKwkJDQorCQlDb2xvcjxmbG9hdD4gcmVhZEludGVybmFsKGludCB4LCBpbnQgeSwgaW50IHopIGNvbnN0Ow0KKwkJQ29sb3I8ZmxvYXQ+IHJlYWRJbnRlcm5hbChpbnQgeCwgaW50IHkpIGNvbnN0Ow0KKwkJQ29sb3I8ZmxvYXQ+IHNhbXBsZUludGVybmFsKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIGNvbnN0Ow0KKwkJQ29sb3I8ZmxvYXQ+IHNhbXBsZUludGVybmFsKGZsb2F0IHgsIGZsb2F0IHkpIGNvbnN0Ow0KKwkJdm9pZCB3cml0ZUludGVybmFsKGludCB4LCBpbnQgeSwgaW50IHosIGNvbnN0IENvbG9yPGZsb2F0PiAmY29sb3IpOw0KKwkJdm9pZCB3cml0ZUludGVybmFsKGludCB4LCBpbnQgeSwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZjb2xvcik7DQorDQorCQlib29sIGhhc1N0ZW5jaWwoKSBjb25zdDsNCisJCWJvb2wgaGFzRGVwdGgoKSBjb25zdDsNCisJCWJvb2wgaGFzUGFsZXR0ZSgpIGNvbnN0Ow0KKwkJYm9vbCBpc1JlbmRlclRhcmdldCgpIGNvbnN0Ow0KKw0KKwkJYm9vbCBoYXNEaXJ0eU1pcG1hcHMoKSBjb25zdDsNCisJCXZvaWQgY2xlYW5NaXBtYXBzKCk7DQorCQlSZXNvdXJjZSAqZ2V0UmVzb3VyY2UoKTsNCisNCisJCXN0YXRpYyBpbnQgYnl0ZXMoRm9ybWF0IGZvcm1hdCk7DQorCQlzdGF0aWMgaW50IHBpdGNoQihpbnQgd2lkdGgsIEZvcm1hdCBmb3JtYXQsIGJvb2wgdGFyZ2V0KTsNCisJCXN0YXRpYyBpbnQgcGl0Y2hQKGludCB3aWR0aCwgRm9ybWF0IGZvcm1hdCwgYm9vbCB0YXJnZXQpOw0KKwkJc3RhdGljIGludCBzbGljZUIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGb3JtYXQgZm9ybWF0LCBib29sIHRhcmdldCk7DQorCQlzdGF0aWMgaW50IHNsaWNlUChpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZvcm1hdCBmb3JtYXQsIGJvb2wgdGFyZ2V0KTsNCisJCXN0YXRpYyB1bnNpZ25lZCBpbnQgc2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgRm9ybWF0IGZvcm1hdCk7ICAgLy8gRklYTUU6IHNsaWNlICogZGVwdGgNCisNCisJCXN0YXRpYyBib29sIGlzU3RlbmNpbChGb3JtYXQgZm9ybWF0KTsNCisJCXN0YXRpYyBib29sIGlzRGVwdGgoRm9ybWF0IGZvcm1hdCk7DQorCQlzdGF0aWMgYm9vbCBpc1BhbGV0dGUoRm9ybWF0IGZvcm1hdCk7DQorDQorCQlzdGF0aWMgYm9vbCBpc0Zsb2F0Rm9ybWF0KEZvcm1hdCBmb3JtYXQpOw0KKwkJc3RhdGljIGJvb2wgaXNVbnNpZ25lZENvbXBvbmVudChGb3JtYXQgZm9ybWF0LCBpbnQgY29tcG9uZW50KTsNCisJCXN0YXRpYyBib29sIGlzU1JHQnJlYWRhYmxlKEZvcm1hdCBmb3JtYXQpOw0KKwkJc3RhdGljIGJvb2wgaXNTUkdCd3JpdGFibGUoRm9ybWF0IGZvcm1hdCk7DQorCQlzdGF0aWMgYm9vbCBpc0NvbXByZXNzZWQoRm9ybWF0IGZvcm1hdCk7DQorCQlzdGF0aWMgaW50IGNvbXBvbmVudENvdW50KEZvcm1hdCBmb3JtYXQpOw0KKw0KKwkJc3RhdGljIHZvaWQgc2V0VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50ICpwYWxldHRlKTsNCisNCisJcHJpdmF0ZToNCisJCXR5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlOw0KKwkJdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB3b3JkOw0KKwkJdHlwZWRlZiB1bnNpZ25lZCBpbnQgZHdvcmQ7DQorCQl0eXBlZGVmIHVpbnQ2NF90IHF3b3JkOw0KKw0KKwkJI2lmIFMzVENfU1VQUE9SVA0KKwkJc3RydWN0IERYVDENCisJCXsNCisJCQl3b3JkIGMwOw0KKwkJCXdvcmQgYzE7DQorCQkJZHdvcmQgbHV0Ow0KKwkJfTsNCisNCisJCXN0cnVjdCBEWFQzDQorCQl7DQorCQkJcXdvcmQgYTsNCisNCisJCQl3b3JkIGMwOw0KKwkJCXdvcmQgYzE7DQorCQkJZHdvcmQgbHV0Ow0KKwkJfTsNCisNCisJCXN0cnVjdCBEWFQ1DQorCQl7DQorCQkJdW5pb24NCisJCQl7DQorCQkJCXN0cnVjdA0KKwkJCQl7DQorCQkJCQlieXRlIGEwOw0KKwkJCQkJYnl0ZSBhMTsNCisJCQkJfTsNCisNCisJCQkJcXdvcmQgYWx1dDsgICAvLyBTa2lwIGZpcnN0IDE2IGJpdA0KKwkJCX07DQorDQorCQkJd29yZCBjMDsNCisJCQl3b3JkIGMxOw0KKwkJCWR3b3JkIGNsdXQ7DQorCQl9Ow0KKw0KKwkJc3RydWN0IEFUSTINCisJCXsNCisJCQl1bmlvbg0KKwkJCXsNCisJCQkJc3RydWN0DQorCQkJCXsNCisJCQkJCWJ5dGUgeTA7DQorCQkJCQlieXRlIHkxOw0KKwkJCQl9Ow0KKw0KKwkJCQlxd29yZCB5bHV0OyAgIC8vIFNraXAgZmlyc3QgMTYgYml0DQorCQkJfTsNCisNCisJCQl1bmlvbg0KKwkJCXsNCisJCQkJc3RydWN0DQorCQkJCXsNCisJCQkJCWJ5dGUgeDA7DQorCQkJCQlieXRlIHgxOw0KKwkJCQl9Ow0KKw0KKwkJCQlxd29yZCB4bHV0OyAgIC8vIFNraXAgZmlyc3QgMTYgYml0DQorCQkJfTsNCisJCX07DQorDQorCQlzdHJ1Y3QgQVRJMQ0KKwkJew0KKwkJCXVuaW9uDQorCQkJew0KKwkJCQlzdHJ1Y3QNCisJCQkJew0KKwkJCQkJYnl0ZSByMDsNCisJCQkJCWJ5dGUgcjE7DQorCQkJCX07DQorDQorCQkJCXF3b3JkIHJsdXQ7ICAgLy8gU2tpcCBmaXJzdCAxNiBiaXQNCisJCQl9Ow0KKwkJfTsNCisJCSNlbmRpZg0KKw0KKwkJc3RhdGljIHZvaWQgZGVjb2RlUjhHOEI4KEJ1ZmZlciAmZGVzdGluYXRpb24sIGNvbnN0IEJ1ZmZlciAmc291cmNlKTsNCisJCXN0YXRpYyB2b2lkIGRlY29kZVg4QjhHOFI4KEJ1ZmZlciAmZGVzdGluYXRpb24sIGNvbnN0IEJ1ZmZlciAmc291cmNlKTsNCisJCXN0YXRpYyB2b2lkIGRlY29kZUE4QjhHOFI4KEJ1ZmZlciAmZGVzdGluYXRpb24sIGNvbnN0IEJ1ZmZlciAmc291cmNlKTsNCisJCXN0YXRpYyB2b2lkIGRlY29kZVI1RzZCNShCdWZmZXIgJmRlc3RpbmF0aW9uLCBjb25zdCBCdWZmZXIgJnNvdXJjZSk7DQorCQlzdGF0aWMgdm9pZCBkZWNvZGVYMVI1RzVCNShCdWZmZXIgJmRlc3RpbmF0aW9uLCBjb25zdCBCdWZmZXIgJnNvdXJjZSk7DQorCQlzdGF0aWMgdm9pZCBkZWNvZGVBMVI1RzVCNShCdWZmZXIgJmRlc3RpbmF0aW9uLCBjb25zdCBCdWZmZXIgJnNvdXJjZSk7DQorCQlzdGF0aWMgdm9pZCBkZWNvZGVYNFI0RzRCNChCdWZmZXIgJmRlc3RpbmF0aW9uLCBjb25zdCBCdWZmZXIgJnNvdXJjZSk7DQorCQlzdGF0aWMgdm9pZCBkZWNvZGVBNFI0RzRCNChCdWZmZXIgJmRlc3RpbmF0aW9uLCBjb25zdCBCdWZmZXIgJnNvdXJjZSk7DQorCQlzdGF0aWMgdm9pZCBkZWNvZGVQOChCdWZmZXIgJmRlc3RpbmF0aW9uLCBjb25zdCBCdWZmZXIgJnNvdXJjZSk7DQorDQorCQkjaWYgUzNUQ19TVVBQT1JUDQorCQlzdGF0aWMgdm9pZCBkZWNvZGVEWFQxKEJ1ZmZlciAmaW50ZXJuYWwsIGNvbnN0IEJ1ZmZlciAmZXh0ZXJuYWwpOw0KKwkJc3RhdGljIHZvaWQgZGVjb2RlRFhUMyhCdWZmZXIgJmludGVybmFsLCBjb25zdCBCdWZmZXIgJmV4dGVybmFsKTsNCisJCXN0YXRpYyB2b2lkIGRlY29kZURYVDUoQnVmZmVyICZpbnRlcm5hbCwgY29uc3QgQnVmZmVyICZleHRlcm5hbCk7DQorDQorCQlzdGF0aWMgdm9pZCBkZWNvZGVBVEkxKEJ1ZmZlciAmaW50ZXJuYWwsIGNvbnN0IEJ1ZmZlciAmZXh0ZXJuYWwpOw0KKwkJc3RhdGljIHZvaWQgZGVjb2RlQVRJMihCdWZmZXIgJmludGVybmFsLCBjb25zdCBCdWZmZXIgJmV4dGVybmFsKTsNCisJCSNlbmRpZg0KKw0KKwkJc3RhdGljIHZvaWQgdXBkYXRlKEJ1ZmZlciAmZGVzdGluYXRpb24sIEJ1ZmZlciAmc291cmNlKTsNCisJCXN0YXRpYyB2b2lkIGdlbmVyaWNVcGRhdGUoQnVmZmVyICZkZXN0aW5hdGlvbiwgQnVmZmVyICZzb3VyY2UpOw0KKwkJc3RhdGljIHZvaWQgKmFsbG9jYXRlQnVmZmVyKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBGb3JtYXQgZm9ybWF0KTsNCisJCXN0YXRpYyB2b2lkIG1lbWZpbGwodm9pZCAqYnVmZmVyLCBpbnQgcGF0dGVybiwgaW50IGJ5dGVzKTsNCisNCisJCWJvb2wgaWRlbnRpY2FsRm9ybWF0cygpIGNvbnN0Ow0KKwkJRm9ybWF0IHNlbGVjdEludGVybmFsRm9ybWF0KEZvcm1hdCBmb3JtYXQpIGNvbnN0Ow0KKw0KKwkJdm9pZCByZXNvbHZlKCk7DQorDQorCQlCdWZmZXIgZXh0ZXJuYWw7DQorCQlCdWZmZXIgaW50ZXJuYWw7DQorCQlCdWZmZXIgc3RlbmNpbDsNCisNCisJCWNvbnN0IGJvb2wgbG9ja2FibGU7DQorCQljb25zdCBib29sIHJlbmRlclRhcmdldDsNCisNCisJCXN0YXRpYyB1bnNpZ25lZCBpbnQgKnBhbGV0dGU7ICAgLy8gRklYTUU6IE5vdCBtdWx0aS1kZXZpY2Ugc2FmZQ0KKwkJc3RhdGljIHVuc2lnbmVkIGludCBwYWxldHRlSUQ7DQorDQorCQlib29sIGRpcnR5TWlwbWFwczsNCisNCisJCXN3OjpSZXNvdXJjZSAqcmVzb3VyY2U7DQorCQlib29sIGhhc1BhcmVudDsNCisJfTsNCit9DQorDQorI3VuZGVmIG1pbg0KKyN1bmRlZiBtYXgNCisNCituYW1lc3BhY2Ugc3cNCit7DQorCWludCBTdXJmYWNlOjpnZXRFeHRlcm5hbFdpZHRoKCkgY29uc3QNCisJew0KKwkJcmV0dXJuIGV4dGVybmFsLndpZHRoOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRFeHRlcm5hbEhlaWdodCgpIGNvbnN0DQorCXsNCisJCXJldHVybiBleHRlcm5hbC5oZWlnaHQ7DQorCX0NCisNCisJaW50IFN1cmZhY2U6OmdldEV4dGVybmFsRGVwdGgoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4gZXh0ZXJuYWwuZGVwdGg7DQorCX0NCisNCisJRm9ybWF0IFN1cmZhY2U6OmdldEV4dGVybmFsRm9ybWF0KCkgY29uc3QNCisJew0KKwkJcmV0dXJuIGV4dGVybmFsLmZvcm1hdDsNCisJfQ0KKw0KKwlpbnQgU3VyZmFjZTo6Z2V0RXh0ZXJuYWxQaXRjaEIoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4gZXh0ZXJuYWwucGl0Y2hCOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRFeHRlcm5hbFBpdGNoUCgpIGNvbnN0DQorCXsNCisJCXJldHVybiBleHRlcm5hbC5waXRjaFA7DQorCX0NCisNCisJaW50IFN1cmZhY2U6OmdldEV4dGVybmFsU2xpY2VCKCkgY29uc3QNCisJew0KKwkJcmV0dXJuIGV4dGVybmFsLnNsaWNlQjsNCisJfQ0KKw0KKwlpbnQgU3VyZmFjZTo6Z2V0RXh0ZXJuYWxTbGljZVAoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4gZXh0ZXJuYWwuc2xpY2VQOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRJbnRlcm5hbFdpZHRoKCkgY29uc3QNCisJew0KKwkJcmV0dXJuIGludGVybmFsLndpZHRoOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRJbnRlcm5hbEhlaWdodCgpIGNvbnN0DQorCXsNCisJCXJldHVybiBpbnRlcm5hbC5oZWlnaHQ7DQorCX0NCisNCisJaW50IFN1cmZhY2U6OmdldEludGVybmFsRGVwdGgoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4gaW50ZXJuYWwuZGVwdGg7DQorCX0NCisNCisJRm9ybWF0IFN1cmZhY2U6OmdldEludGVybmFsRm9ybWF0KCkgY29uc3QNCisJew0KKwkJcmV0dXJuIGludGVybmFsLmZvcm1hdDsNCisJfQ0KKw0KKwlpbnQgU3VyZmFjZTo6Z2V0SW50ZXJuYWxQaXRjaEIoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4gaW50ZXJuYWwucGl0Y2hCOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRJbnRlcm5hbFBpdGNoUCgpIGNvbnN0DQorCXsNCisJCXJldHVybiBpbnRlcm5hbC5waXRjaFA7DQorCX0NCisNCisJaW50IFN1cmZhY2U6OmdldEludGVybmFsU2xpY2VCKCkgY29uc3QNCisJew0KKwkJcmV0dXJuIGludGVybmFsLnNsaWNlQjsNCisJfQ0KKw0KKwlpbnQgU3VyZmFjZTo6Z2V0SW50ZXJuYWxTbGljZVAoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4gaW50ZXJuYWwuc2xpY2VQOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRTdGVuY2lsUGl0Y2hCKCkgY29uc3QNCisJew0KKwkJcmV0dXJuIHN0ZW5jaWwucGl0Y2hCOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRTdGVuY2lsUGl0Y2hQKCkgY29uc3QNCisJew0KKwkJcmV0dXJuIHN0ZW5jaWwucGl0Y2hQOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRTdGVuY2lsU2xpY2VCKCkgY29uc3QNCisJew0KKwkJcmV0dXJuIHN0ZW5jaWwuc2xpY2VCOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRNdWx0aVNhbXBsZUNvdW50KCkgY29uc3QNCisJew0KKwkJcmV0dXJuIHN3OjptaW4oaW50ZXJuYWwuZGVwdGgsIDQpOw0KKwl9DQorDQorCWludCBTdXJmYWNlOjpnZXRTdXBlclNhbXBsZUNvdW50KCkgY29uc3QNCisJew0KKwkJcmV0dXJuIGludGVybmFsLmRlcHRoID4gNCA/IGludGVybmFsLmRlcHRoIC8gNCA6IDE7DQorCX0NCit9DQorDQorI2VuZGlmICAgLy8gc3dfU3VyZmFjZV9ocHANCmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvVGV4dHVyZVN0YWdlLmNwcCBiL3NyYy9SZW5kZXJlci9UZXh0dXJlU3RhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjNkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvVGV4dHVyZVN0YWdlLmNwcApAQCAtMCwwICsxLDQwNCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiVGV4dHVyZVN0YWdlLmhwcCIKKworI2luY2x1ZGUgIlNhbXBsZXIuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJVGV4dHVyZVN0YWdlOjpTdGF0ZTo6U3RhdGUoKQorCXsKKwkJbWVtc2V0KHRoaXMsIDAsIHNpemVvZihTdGF0ZSkpOworCX0KKworCVRleHR1cmVTdGFnZTo6VGV4dHVyZVN0YWdlKCkgOiBzYW1wbGVyKDApLCBwcmV2aW91c1N0YWdlKDApCisJeworCX0KKworCVRleHR1cmVTdGFnZTo6flRleHR1cmVTdGFnZSgpCisJeworCX0KKworCXZvaWQgVGV4dHVyZVN0YWdlOjppbml0KGludCBzdGFnZSwgY29uc3QgU2FtcGxlciAqc2FtcGxlciwgY29uc3QgVGV4dHVyZVN0YWdlICpwcmV2aW91c1N0YWdlKQorCXsKKwkJdGhpcy0+c3RhZ2UgPSBzdGFnZTsKKworCQlzdGFnZU9wZXJhdGlvbiA9IChzdGFnZSA9PSAwID8gU1RBR0VfTU9EVUxBVEUgOiBTVEFHRV9ESVNBQkxFKTsKKwkJZmlyc3RBcmd1bWVudCA9IFNPVVJDRV9URVhUVVJFOworCQlzZWNvbmRBcmd1bWVudCA9IFNPVVJDRV9DVVJSRU5UOworCQl0aGlyZEFyZ3VtZW50ID0gU09VUkNFX0NVUlJFTlQ7CisJCXN0YWdlT3BlcmF0aW9uQWxwaGEgPSAoc3RhZ2UgPT0gMCA/IFNUQUdFX1NFTEVDVEFSRzEgOiBTVEFHRV9ESVNBQkxFKTsKKwkJZmlyc3RBcmd1bWVudEFscGhhID0gU09VUkNFX0RJRkZVU0U7CisJCXNlY29uZEFyZ3VtZW50QWxwaGEgPSBTT1VSQ0VfQ1VSUkVOVDsKKwkJdGhpcmRBcmd1bWVudEFscGhhID0gU09VUkNFX0NVUlJFTlQ7CisJCWZpcnN0TW9kaWZpZXIgPSBNT0RJRklFUl9DT0xPUjsKKwkJc2Vjb25kTW9kaWZpZXIgPSBNT0RJRklFUl9DT0xPUjsKKwkJdGhpcmRNb2RpZmllciA9IE1PRElGSUVSX0NPTE9SOworCQlkZXN0aW5hdGlvbkFyZ3VtZW50ID0gREVTVElOQVRJT05fQ1VSUkVOVDsKKworCQl0ZXhDb29yZEluZGV4ID0gc3RhZ2U7CisJCXRoaXMtPnNhbXBsZXIgPSBzYW1wbGVyOworCQl0aGlzLT5wcmV2aW91c1N0YWdlID0gcHJldmlvdXNTdGFnZTsKKwl9CisKKwlUZXh0dXJlU3RhZ2U6OlN0YXRlIFRleHR1cmVTdGFnZTo6dGV4dHVyZVN0YWdlU3RhdGUoKSBjb25zdAorCXsKKwkJU3RhdGUgc3RhdGU7CisKKwkJaWYoIWlzU3RhZ2VEaXNhYmxlZCgpKQorCQl7CisJCQlzdGF0ZS5zdGFnZU9wZXJhdGlvbiA9IHN0YWdlT3BlcmF0aW9uOworCQkJc3RhdGUuZmlyc3RBcmd1bWVudCA9IGZpcnN0QXJndW1lbnQ7CisJCQlzdGF0ZS5zZWNvbmRBcmd1bWVudCA9IHNlY29uZEFyZ3VtZW50OworCQkJc3RhdGUudGhpcmRBcmd1bWVudCA9IHRoaXJkQXJndW1lbnQ7CisJCQlzdGF0ZS5zdGFnZU9wZXJhdGlvbkFscGhhID0gc3RhZ2VPcGVyYXRpb25BbHBoYTsKKwkJCXN0YXRlLmZpcnN0QXJndW1lbnRBbHBoYSA9IGZpcnN0QXJndW1lbnRBbHBoYTsKKwkJCXN0YXRlLnNlY29uZEFyZ3VtZW50QWxwaGEgPSBzZWNvbmRBcmd1bWVudEFscGhhOworCQkJc3RhdGUudGhpcmRBcmd1bWVudEFscGhhID0gdGhpcmRBcmd1bWVudEFscGhhOworCQkJc3RhdGUuZmlyc3RNb2RpZmllciA9IGZpcnN0TW9kaWZpZXI7CisJCQlzdGF0ZS5zZWNvbmRNb2RpZmllciA9IHNlY29uZE1vZGlmaWVyOworCQkJc3RhdGUudGhpcmRNb2RpZmllciA9IHRoaXJkTW9kaWZpZXI7CisJCQlzdGF0ZS5maXJzdE1vZGlmaWVyQWxwaGEgPSBmaXJzdE1vZGlmaWVyQWxwaGE7CisJCQlzdGF0ZS5zZWNvbmRNb2RpZmllckFscGhhID0gc2Vjb25kTW9kaWZpZXJBbHBoYTsKKwkJCXN0YXRlLnRoaXJkTW9kaWZpZXJBbHBoYSA9IHRoaXJkTW9kaWZpZXJBbHBoYTsKKwkJCXN0YXRlLmRlc3RpbmF0aW9uQXJndW1lbnQgPSBkZXN0aW5hdGlvbkFyZ3VtZW50OworCQkJc3RhdGUudGV4Q29vcmRJbmRleCA9IHRleENvb3JkSW5kZXg7CisKKwkJCXN0YXRlLmNhbnRVbmRlcmZsb3cgPSBzYW1wbGVyLT5oYXNVbnNpZ25lZFRleHR1cmUoKSB8fCAhdXNlc1RleHR1cmUoKTsKKwkJCXN0YXRlLnVzZXNUZXh0dXJlID0gdXNlc1RleHR1cmUoKTsKKwkJfQorCisJCXJldHVybiBzdGF0ZTsKKwl9CisKKwl2b2lkIFRleHR1cmVTdGFnZTo6c2V0Q29uc3RhbnRDb2xvcihjb25zdCBDb2xvcjxmbG9hdD4gJmNvbnN0YW50Q29sb3IpCisJeworCQkvLyBGSVhNRTogQ29tcGFjdCBpbnRvIGdlbmVyaWMgZnVuY3Rpb24gICAvLyBGSVhNRTogQ2xhbXAKKwkJc2hvcnQgciA9IGlyb3VuZCg0MDk1ICogY29uc3RhbnRDb2xvci5yKTsKKwkJc2hvcnQgZyA9IGlyb3VuZCg0MDk1ICogY29uc3RhbnRDb2xvci5nKTsKKwkJc2hvcnQgYiA9IGlyb3VuZCg0MDk1ICogY29uc3RhbnRDb2xvci5iKTsKKwkJc2hvcnQgYSA9IGlyb3VuZCg0MDk1ICogY29uc3RhbnRDb2xvci5hKTsKKworCQl1bmlmb3Jtcy5jb25zdGFudENvbG9yNFswXVswXSA9IHVuaWZvcm1zLmNvbnN0YW50Q29sb3I0WzBdWzFdID0gdW5pZm9ybXMuY29uc3RhbnRDb2xvcjRbMF1bMl0gPSB1bmlmb3Jtcy5jb25zdGFudENvbG9yNFswXVszXSA9IHI7CisJCXVuaWZvcm1zLmNvbnN0YW50Q29sb3I0WzFdWzBdID0gdW5pZm9ybXMuY29uc3RhbnRDb2xvcjRbMV1bMV0gPSB1bmlmb3Jtcy5jb25zdGFudENvbG9yNFsxXVsyXSA9IHVuaWZvcm1zLmNvbnN0YW50Q29sb3I0WzFdWzNdID0gZzsKKwkJdW5pZm9ybXMuY29uc3RhbnRDb2xvcjRbMl1bMF0gPSB1bmlmb3Jtcy5jb25zdGFudENvbG9yNFsyXVsxXSA9IHVuaWZvcm1zLmNvbnN0YW50Q29sb3I0WzJdWzJdID0gdW5pZm9ybXMuY29uc3RhbnRDb2xvcjRbMl1bM10gPSBiOworCQl1bmlmb3Jtcy5jb25zdGFudENvbG9yNFszXVswXSA9IHVuaWZvcm1zLmNvbnN0YW50Q29sb3I0WzNdWzFdID0gdW5pZm9ybXMuY29uc3RhbnRDb2xvcjRbM11bMl0gPSB1bmlmb3Jtcy5jb25zdGFudENvbG9yNFszXVszXSA9IGE7CisJfQorCisJdm9pZCBUZXh0dXJlU3RhZ2U6OnNldEJ1bXBtYXBNYXRyaXgoaW50IGVsZW1lbnQsIGZsb2F0IHZhbHVlKQorCXsKKwkJdW5pZm9ybXMuYnVtcG1hcE1hdHJpeDRGW2VsZW1lbnQgLyAyXVtlbGVtZW50ICUgMl1bMF0gPSB2YWx1ZTsKKwkJdW5pZm9ybXMuYnVtcG1hcE1hdHJpeDRGW2VsZW1lbnQgLyAyXVtlbGVtZW50ICUgMl1bMV0gPSB2YWx1ZTsKKwkJdW5pZm9ybXMuYnVtcG1hcE1hdHJpeDRGW2VsZW1lbnQgLyAyXVtlbGVtZW50ICUgMl1bMl0gPSB2YWx1ZTsKKwkJdW5pZm9ybXMuYnVtcG1hcE1hdHJpeDRGW2VsZW1lbnQgLyAyXVtlbGVtZW50ICUgMl1bM10gPSB2YWx1ZTsKKworCQl1bmlmb3Jtcy5idW1wbWFwTWF0cml4NFdbZWxlbWVudCAvIDJdW2VsZW1lbnQgJSAyXVswXSA9IGlyb3VuZCg0MDk1ICogdmFsdWUpOworCQl1bmlmb3Jtcy5idW1wbWFwTWF0cml4NFdbZWxlbWVudCAvIDJdW2VsZW1lbnQgJSAyXVsxXSA9IGlyb3VuZCg0MDk1ICogdmFsdWUpOworCQl1bmlmb3Jtcy5idW1wbWFwTWF0cml4NFdbZWxlbWVudCAvIDJdW2VsZW1lbnQgJSAyXVsyXSA9IGlyb3VuZCg0MDk1ICogdmFsdWUpOworCQl1bmlmb3Jtcy5idW1wbWFwTWF0cml4NFdbZWxlbWVudCAvIDJdW2VsZW1lbnQgJSAyXVszXSA9IGlyb3VuZCg0MDk1ICogdmFsdWUpOworCX0KKworCXZvaWQgVGV4dHVyZVN0YWdlOjpzZXRMdW1pbmFuY2VTY2FsZShmbG9hdCB2YWx1ZSkKKwl7CisJCXNob3J0IHNjYWxlID0gaXJvdW5kKDQwOTUgKiB2YWx1ZSk7CisKKwkJdW5pZm9ybXMubHVtaW5hbmNlU2NhbGU0WzBdID0gdW5pZm9ybXMubHVtaW5hbmNlU2NhbGU0WzFdID0gdW5pZm9ybXMubHVtaW5hbmNlU2NhbGU0WzJdID0gdW5pZm9ybXMubHVtaW5hbmNlU2NhbGU0WzNdID0gc2NhbGU7CisJfQorCisJdm9pZCBUZXh0dXJlU3RhZ2U6OnNldEx1bWluYW5jZU9mZnNldChmbG9hdCB2YWx1ZSkKKwl7CisJCXNob3J0IG9mZnNldCA9IGlyb3VuZCg0MDk1ICogdmFsdWUpOworCisJCXVuaWZvcm1zLmx1bWluYW5jZU9mZnNldDRbMF0gPSB1bmlmb3Jtcy5sdW1pbmFuY2VPZmZzZXQ0WzFdID0gdW5pZm9ybXMubHVtaW5hbmNlT2Zmc2V0NFsyXSA9IHVuaWZvcm1zLmx1bWluYW5jZU9mZnNldDRbM10gPSBvZmZzZXQ7CisJfQorCisJdm9pZCBUZXh0dXJlU3RhZ2U6OnNldFRleENvb3JkSW5kZXgodW5zaWduZWQgaW50IHRleENvb3JkSW5kZXgpCisJeworCQlBU1NFUlQodGV4Q29vcmRJbmRleCA8IDgpOworCisJCXRoaXMtPnRleENvb3JkSW5kZXggPSB0ZXhDb29yZEluZGV4OworCX0KKworCXZvaWQgVGV4dHVyZVN0YWdlOjpzZXRTdGFnZU9wZXJhdGlvbihTdGFnZU9wZXJhdGlvbiBzdGFnZU9wZXJhdGlvbikKKwl7CisJCXRoaXMtPnN0YWdlT3BlcmF0aW9uID0gc3RhZ2VPcGVyYXRpb247CisJfQorCisJdm9pZCBUZXh0dXJlU3RhZ2U6OnNldEZpcnN0QXJndW1lbnQoU291cmNlQXJndW1lbnQgZmlyc3RBcmd1bWVudCkKKwl7CisJCXRoaXMtPmZpcnN0QXJndW1lbnQgPSBmaXJzdEFyZ3VtZW50OworCX0KKworCXZvaWQgVGV4dHVyZVN0YWdlOjpzZXRTZWNvbmRBcmd1bWVudChTb3VyY2VBcmd1bWVudCBzZWNvbmRBcmd1bWVudCkKKwl7CisJCXRoaXMtPnNlY29uZEFyZ3VtZW50ID0gc2Vjb25kQXJndW1lbnQ7CisJfQorCisJdm9pZCBUZXh0dXJlU3RhZ2U6OnNldFRoaXJkQXJndW1lbnQoU291cmNlQXJndW1lbnQgdGhpcmRBcmd1bWVudCkKKwl7CisJCXRoaXMtPnRoaXJkQXJndW1lbnQgPSB0aGlyZEFyZ3VtZW50OworCX0KKworCXZvaWQgVGV4dHVyZVN0YWdlOjpzZXRTdGFnZU9wZXJhdGlvbkFscGhhKFN0YWdlT3BlcmF0aW9uIHN0YWdlT3BlcmF0aW9uQWxwaGEpCisJeworCQl0aGlzLT5zdGFnZU9wZXJhdGlvbkFscGhhID0gc3RhZ2VPcGVyYXRpb25BbHBoYTsKKwl9CisKKwl2b2lkIFRleHR1cmVTdGFnZTo6c2V0Rmlyc3RBcmd1bWVudEFscGhhKFNvdXJjZUFyZ3VtZW50IGZpcnN0QXJndW1lbnRBbHBoYSkKKwl7CisJCXRoaXMtPmZpcnN0QXJndW1lbnRBbHBoYSA9IGZpcnN0QXJndW1lbnRBbHBoYTsKKwl9CisKKwl2b2lkIFRleHR1cmVTdGFnZTo6c2V0U2Vjb25kQXJndW1lbnRBbHBoYShTb3VyY2VBcmd1bWVudCBzZWNvbmRBcmd1bWVudEFscGhhKQorCXsKKwkJdGhpcy0+c2Vjb25kQXJndW1lbnRBbHBoYSA9IHNlY29uZEFyZ3VtZW50QWxwaGE7CisJfQorCisJdm9pZCBUZXh0dXJlU3RhZ2U6OnNldFRoaXJkQXJndW1lbnRBbHBoYShTb3VyY2VBcmd1bWVudCB0aGlyZEFyZ3VtZW50QWxwaGEpCisJeworCQl0aGlzLT50aGlyZEFyZ3VtZW50QWxwaGE9IHRoaXJkQXJndW1lbnRBbHBoYTsKKwl9CisKKwl2b2lkIFRleHR1cmVTdGFnZTo6c2V0Rmlyc3RNb2RpZmllcihBcmd1bWVudE1vZGlmaWVyIGZpcnN0TW9kaWZpZXIpCisJeworCQl0aGlzLT5maXJzdE1vZGlmaWVyID0gZmlyc3RNb2RpZmllcjsKKwl9CisKKwl2b2lkIFRleHR1cmVTdGFnZTo6c2V0U2Vjb25kTW9kaWZpZXIoQXJndW1lbnRNb2RpZmllciBzZWNvbmRNb2RpZmllcikKKwl7CisJCXRoaXMtPnNlY29uZE1vZGlmaWVyID0gc2Vjb25kTW9kaWZpZXI7CisJfQorCisJdm9pZCBUZXh0dXJlU3RhZ2U6OnNldFRoaXJkTW9kaWZpZXIoQXJndW1lbnRNb2RpZmllciB0aGlyZE1vZGlmaWVyKQorCXsKKwkJdGhpcy0+dGhpcmRNb2RpZmllciA9IHRoaXJkTW9kaWZpZXI7CisJfQorCisJdm9pZCBUZXh0dXJlU3RhZ2U6OnNldEZpcnN0TW9kaWZpZXJBbHBoYShBcmd1bWVudE1vZGlmaWVyIGZpcnN0TW9kaWZpZXJBbHBoYSkKKwl7CisJCXRoaXMtPmZpcnN0TW9kaWZpZXJBbHBoYSA9IGZpcnN0TW9kaWZpZXJBbHBoYTsKKwl9CisKKwl2b2lkIFRleHR1cmVTdGFnZTo6c2V0U2Vjb25kTW9kaWZpZXJBbHBoYShBcmd1bWVudE1vZGlmaWVyIHNlY29uZE1vZGlmaWVyQWxwaGEpCisJeworCQl0aGlzLT5zZWNvbmRNb2RpZmllckFscGhhID0gc2Vjb25kTW9kaWZpZXJBbHBoYTsKKwl9CisKKwl2b2lkIFRleHR1cmVTdGFnZTo6c2V0VGhpcmRNb2RpZmllckFscGhhKEFyZ3VtZW50TW9kaWZpZXIgdGhpcmRNb2RpZmllckFscGhhKQorCXsKKwkJdGhpcy0+dGhpcmRNb2RpZmllckFscGhhID0gdGhpcmRNb2RpZmllckFscGhhOworCX0KKworCXZvaWQgVGV4dHVyZVN0YWdlOjpzZXREZXN0aW5hdGlvbkFyZ3VtZW50KERlc3RpbmF0aW9uQXJndW1lbnQgZGVzdGluYXRpb25Bcmd1bWVudCkKKwl7CisJCXRoaXMtPmRlc3RpbmF0aW9uQXJndW1lbnQgPSBkZXN0aW5hdGlvbkFyZ3VtZW50OworCX0KKworCWJvb2wgVGV4dHVyZVN0YWdlOjp1c2VzQ29sb3IoU291cmNlQXJndW1lbnQgc291cmNlKSBjb25zdAorCXsKKwkJLy8gT25lIGFyZ3VtZW50CisJCWlmKHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX1NFTEVDVEFSRzEgfHwgc3RhZ2VPcGVyYXRpb24gPT0gU1RBR0VfUFJFTU9EVUxBVEUpCisJCXsKKwkJCXJldHVybiBmaXJzdEFyZ3VtZW50ID09IHNvdXJjZTsKKwkJfQorCQllbHNlIGlmKHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX1NFTEVDVEFSRzIpCisJCXsKKwkJCXJldHVybiBzZWNvbmRBcmd1bWVudCA9PSBzb3VyY2U7CisJCX0KKwkJZWxzZSBpZihzdGFnZU9wZXJhdGlvbiA9PSBTVEFHRV9TRUxFQ1RBUkczKQorCQl7CisJCQlyZXR1cm4gdGhpcmRBcmd1bWVudCA9PSBzb3VyY2U7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBUd28gYXJndW1lbnRzIG9yIG1vcmUKKwkJCWlmKGZpcnN0QXJndW1lbnQgPT0gc291cmNlIHx8IHNlY29uZEFyZ3VtZW50ID09IHNvdXJjZSkKKwkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJLy8gVGhyZWUgYXJndW1lbnRzCisJCQlpZihzdGFnZU9wZXJhdGlvbiA9PSBTVEFHRV9NVUxUSVBMWUFERCB8fCBzdGFnZU9wZXJhdGlvbiA9PSBTVEFHRV9MRVJQKQorCQkJeworCQkJCXJldHVybiB0aGlyZEFyZ3VtZW50ID09IHNvdXJjZTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWJvb2wgVGV4dHVyZVN0YWdlOjp1c2VzQWxwaGEoU291cmNlQXJndW1lbnQgc291cmNlKSBjb25zdAorCXsKKwkJaWYoc3RhZ2VPcGVyYXRpb25BbHBoYSA9PSBTVEFHRV9ESVNBQkxFKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZihzb3VyY2UgPT0gU09VUkNFX1RFWFRVUkUpCisJCXsKKwkJCWlmKHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBIHx8CXN0YWdlT3BlcmF0aW9uID09IFNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBUE0pCisJCQl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJZWxzZSBpZihzb3VyY2UgPT0gU09VUkNFX0NVUlJFTlQpCisJCXsKKwkJCWlmKHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBKQorCQkJeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCWVsc2UgaWYoc291cmNlID09IFNPVVJDRV9ESUZGVVNFKQorCQl7CisJCQlpZihzdGFnZU9wZXJhdGlvbiA9PSBTVEFHRV9CTEVORERJRkZVU0VBTFBIQSkKKwkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKHNvdXJjZSA9PSBTT1VSQ0VfVEZBQ1RPUikKKwkJeworCQkJaWYoc3RhZ2VPcGVyYXRpb24gPT0gU1RBR0VfQkxFTkRGQUNUT1JBTFBIQSkKKwkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCS8vIE9uZSBhcmd1bWVudAorCQlpZihzdGFnZU9wZXJhdGlvbiA9PSBTVEFHRV9TRUxFQ1RBUkcxIHx8IHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX1BSRU1PRFVMQVRFKQorCQl7CisJCQlpZihmaXJzdEFyZ3VtZW50ID09IHNvdXJjZSAmJiAoZmlyc3RNb2RpZmllciA9PSBNT0RJRklFUl9BTFBIQSB8fCBmaXJzdE1vZGlmaWVyID09IE1PRElGSUVSX0lOVkFMUEhBKSkKKwkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX1NFTEVDVEFSRzIpCisJCXsKKwkJCWlmKHNlY29uZEFyZ3VtZW50ID09IHNvdXJjZSAmJiAoc2Vjb25kTW9kaWZpZXIgPT0gTU9ESUZJRVJfQUxQSEEgfHwgc2Vjb25kTW9kaWZpZXIgPT0gTU9ESUZJRVJfSU5WQUxQSEEpKQorCQkJeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCWVsc2UgaWYoc3RhZ2VPcGVyYXRpb24gPT0gU1RBR0VfU0VMRUNUQVJHMykKKwkJeworCQkJaWYodGhpcmRBcmd1bWVudCA9PSBzb3VyY2UgJiYgKHRoaXJkTW9kaWZpZXIgPT0gTU9ESUZJRVJfQUxQSEEgfHwgdGhpcmRNb2RpZmllciA9PSBNT0RJRklFUl9JTlZBTFBIQSkpCisJCQl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBUd28gYXJndW1lbnRzIG9yIG1vcmUKKwkJCWlmKGZpcnN0QXJndW1lbnQgPT0gc291cmNlIHx8IHNlY29uZEFyZ3VtZW50ID09IHNvdXJjZSkKKwkJCXsKKwkJCQlpZihmaXJzdEFyZ3VtZW50ID09IHNvdXJjZSAmJiAoZmlyc3RNb2RpZmllciA9PSBNT0RJRklFUl9BTFBIQSB8fCBmaXJzdE1vZGlmaWVyID09IE1PRElGSUVSX0lOVkFMUEhBKSkKKwkJCQl7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKworCQkJCWlmKHNlY29uZEFyZ3VtZW50ID09IHNvdXJjZSAmJiAoc2Vjb25kTW9kaWZpZXIgPT0gTU9ESUZJRVJfQUxQSEEgfHwgc2Vjb25kTW9kaWZpZXIgPT0gTU9ESUZJRVJfSU5WQUxQSEEpKQorCQkJCXsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCisJCQkvLyBUaHJlZSBhcmd1bWVudHMKKwkJCWlmKHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX01VTFRJUExZQUREIHx8IHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX0xFUlApCisJCQl7CisJCQkJaWYodGhpcmRBcmd1bWVudCA9PSBzb3VyY2UgJiYgKHRoaXJkTW9kaWZpZXIgPT0gTU9ESUZJRVJfQUxQSEEgfHwgdGhpcmRNb2RpZmllciA9PSBNT0RJRklFUl9JTlZBTFBIQSkpCisJCQkJeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBPbmUgYXJndW1lbnQKKwkJaWYoc3RhZ2VPcGVyYXRpb25BbHBoYSA9PSBTVEFHRV9TRUxFQ1RBUkcxIHx8IHN0YWdlT3BlcmF0aW9uQWxwaGEgPT0gU1RBR0VfUFJFTU9EVUxBVEUpCisJCXsKKwkJCXJldHVybiBmaXJzdEFyZ3VtZW50QWxwaGEgPT0gc291cmNlOworCQl9CisJCWVsc2UgaWYoc3RhZ2VPcGVyYXRpb25BbHBoYSA9PSBTVEFHRV9TRUxFQ1RBUkcyKQorCQl7CisJCQlyZXR1cm4gc2Vjb25kQXJndW1lbnRBbHBoYSA9PSBzb3VyY2U7CisJCX0KKwkJZWxzZSBpZihzdGFnZU9wZXJhdGlvbkFscGhhID09IFNUQUdFX1NFTEVDVEFSRzMpCisJCXsKKwkJCXJldHVybiB0aGlyZEFyZ3VtZW50QWxwaGEgPT0gc291cmNlOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVHdvIGFyZ3VtZW50cyBvciBtb3JlCisJCQlpZihmaXJzdEFyZ3VtZW50QWxwaGEgPT0gc291cmNlIHx8IHNlY29uZEFyZ3VtZW50QWxwaGEgPT0gc291cmNlKQorCQkJeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQkvLyBUaHJlZSBhcmd1bWVudHMKKwkJCWlmKHN0YWdlT3BlcmF0aW9uQWxwaGEgPT0gU1RBR0VfTVVMVElQTFlBREQgfHwgc3RhZ2VPcGVyYXRpb25BbHBoYSA9PSBTVEFHRV9MRVJQKQorCQkJeworCQkJCXJldHVybiB0aGlyZEFyZ3VtZW50QWxwaGEgPT0gc291cmNlOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBUZXh0dXJlU3RhZ2U6OnVzZXMoU291cmNlQXJndW1lbnQgc291cmNlKSBjb25zdAorCXsKKwkJcmV0dXJuIHVzZXNDb2xvcihzb3VyY2UpIHx8IHVzZXNBbHBoYShzb3VyY2UpOworCX0KKworCWJvb2wgVGV4dHVyZVN0YWdlOjp1c2VzQ3VycmVudCgpIGNvbnN0CisJeworCQlyZXR1cm4gdXNlcyhTT1VSQ0VfQ1VSUkVOVCkgfHwgKHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBIHx8IHN0YWdlT3BlcmF0aW9uQWxwaGEgPT0gU1RBR0VfQkxFTkRDVVJSRU5UQUxQSEEpOworCX0KKworCWJvb2wgVGV4dHVyZVN0YWdlOjp1c2VzRGlmZnVzZSgpIGNvbnN0CisJeworCQlyZXR1cm4gdXNlcyhTT1VSQ0VfRElGRlVTRSkgfHwgKHN0YWdlT3BlcmF0aW9uID09IFNUQUdFX0JMRU5ERElGRlVTRUFMUEhBIHx8IHN0YWdlT3BlcmF0aW9uQWxwaGEgPT0gU1RBR0VfQkxFTkRESUZGVVNFQUxQSEEpOworCX0KKworCWJvb2wgVGV4dHVyZVN0YWdlOjp1c2VzU3BlY3VsYXIoKSBjb25zdAorCXsKKwkJcmV0dXJuIHVzZXMoU09VUkNFX1NQRUNVTEFSKTsKKwl9CisKKwlib29sIFRleHR1cmVTdGFnZTo6dXNlc1RleHR1cmUoKSBjb25zdAorCXsKKwkJcmV0dXJuIHVzZXMoU09VUkNFX1RFWFRVUkUpIHx8CisJCSAgICAgICBzdGFnZU9wZXJhdGlvbiA9PSBTVEFHRV9CTEVORFRFWFRVUkVBTFBIQSB8fAorCQkgICAgICAgc3RhZ2VPcGVyYXRpb25BbHBoYSA9PSBTVEFHRV9CTEVORFRFWFRVUkVBTFBIQSB8fAorCQkgICAgICAgc3RhZ2VPcGVyYXRpb24gPT0gU1RBR0VfQkxFTkRURVhUVVJFQUxQSEFQTSB8fAorCQkgICAgICAgc3RhZ2VPcGVyYXRpb25BbHBoYSA9PSBTVEFHRV9CTEVORFRFWFRVUkVBTFBIQVBNIHx8CisJCSAgICAgICAocHJldmlvdXNTdGFnZSAmJiBwcmV2aW91c1N0YWdlLT5zdGFnZU9wZXJhdGlvbiA9PSBTVEFHRV9QUkVNT0RVTEFURSkgfHwKKwkJICAgICAgIChwcmV2aW91c1N0YWdlICYmIHByZXZpb3VzU3RhZ2UtPnN0YWdlT3BlcmF0aW9uQWxwaGEgPT0gU1RBR0VfUFJFTU9EVUxBVEUpOworCX0KKworCWJvb2wgVGV4dHVyZVN0YWdlOjppc1N0YWdlRGlzYWJsZWQoKSBjb25zdAorCXsKKwkJYm9vbCBkaXNhYmxlZCA9IChzdGFnZU9wZXJhdGlvbiA9PSBTVEFHRV9ESVNBQkxFKSB8fCAoIXNhbXBsZXItPmhhc1RleHR1cmUoKSAmJiB1c2VzVGV4dHVyZSgpKTsKKworCQlpZighcHJldmlvdXNTdGFnZSB8fCBkaXNhYmxlZCkKKwkJeworCQkJcmV0dXJuIGRpc2FibGVkOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIHByZXZpb3VzU3RhZ2UtPmlzU3RhZ2VEaXNhYmxlZCgpOworCQl9CisJfQorCisJYm9vbCBUZXh0dXJlU3RhZ2U6OndyaXRlc0N1cnJlbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuICFpc1N0YWdlRGlzYWJsZWQoKSAmJiBkZXN0aW5hdGlvbkFyZ3VtZW50ID09IERFU1RJTkFUSU9OX0NVUlJFTlQgJiYgc3RhZ2VPcGVyYXRpb24gIT0gU1RBR0VfQlVNUEVOVk1BUCAmJiBzdGFnZU9wZXJhdGlvbiAhPSBTVEFHRV9CVU1QRU5WTUFQTFVNSU5BTkNFOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9UZXh0dXJlU3RhZ2UuaHBwIGIvc3JjL1JlbmRlcmVyL1RleHR1cmVTdGFnZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwZjk0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9UZXh0dXJlU3RhZ2UuaHBwCkBAIC0wLDAgKzEsMTk2IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcg0KKy8vDQorLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuDQorLy8NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLA0KKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyDQorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuDQorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzDQorLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91Lg0KKy8vDQorDQorI2lmbmRlZiBzd19UZXh0dXJlU3RhZ2VfaHBwDQorI2RlZmluZSBzd19UZXh0dXJlU3RhZ2VfaHBwDQorDQorI2luY2x1ZGUgIkNvbW1vbi9UeXBlcy5ocHAiDQorI2luY2x1ZGUgIkNvbW1vbi9NYXRoLmhwcCINCisjaW5jbHVkZSAiUmVuZGVyZXIvQ29sb3IuaHBwIg0KKw0KK25hbWVzcGFjZSBzdw0KK3sNCisJY2xhc3MgU2FtcGxlcjsNCisJY2xhc3MgUGl4ZWxSb3V0aW5lOw0KKwljbGFzcyBDb250ZXh0Ow0KKw0KKwljbGFzcyBUZXh0dXJlU3RhZ2UNCisJew0KKwkJZnJpZW5kIENvbnRleHQ7ICAgICAgICAvLyBGSVhNRQ0KKwkJZnJpZW5kIFBpeGVsUm91dGluZTsgICAvLyBGSVhNRQ0KKw0KKwlwdWJsaWM6DQorCQllbnVtIFN0YWdlT3BlcmF0aW9uDQorCQl7DQorCQkJU1RBR0VfRElTQUJMRSwNCisJCQlTVEFHRV9TRUxFQ1RBUkcxLA0KKwkJCVNUQUdFX1NFTEVDVEFSRzIsDQorCQkJU1RBR0VfU0VMRUNUQVJHMywNCisJCQlTVEFHRV9NT0RVTEFURSwNCisJCQlTVEFHRV9NT0RVTEFURTJYLA0KKwkJCVNUQUdFX01PRFVMQVRFNFgsDQorCQkJU1RBR0VfQURELA0KKwkJCVNUQUdFX0FERFNJR05FRCwNCisJCQlTVEFHRV9BRERTSUdORUQyWCwNCisJCQlTVEFHRV9TVUJUUkFDVCwNCisJCQlTVEFHRV9BRERTTU9PVEgsDQorCQkJU1RBR0VfTVVMVElQTFlBREQsDQorCQkJU1RBR0VfTEVSUCwNCisJCQlTVEFHRV9ET1QzLA0KKwkJCVNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBLA0KKwkJCVNUQUdFX0JMRU5ERElGRlVTRUFMUEhBLA0KKwkJCVNUQUdFX0JMRU5ERkFDVE9SQUxQSEEsDQorCQkJU1RBR0VfQkxFTkRURVhUVVJFQUxQSEEsDQorCQkJU1RBR0VfQkxFTkRURVhUVVJFQUxQSEFQTSwNCisJCQlTVEFHRV9QUkVNT0RVTEFURSwNCisJCQlTVEFHRV9NT0RVTEFURUFMUEhBX0FERENPTE9SLA0KKwkJCVNUQUdFX01PRFVMQVRFQ09MT1JfQUREQUxQSEEsDQorCQkJU1RBR0VfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiwNCisJCQlTVEFHRV9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBLA0KKwkJCVNUQUdFX0JVTVBFTlZNQVAsDQorCQkJU1RBR0VfQlVNUEVOVk1BUExVTUlOQU5DRSwNCisNCisJCQlTVEFHRV9MQVNUID0gU1RBR0VfQlVNUEVOVk1BUExVTUlOQU5DRQ0KKwkJfTsNCisNCisJCWVudW0gU291cmNlQXJndW1lbnQNCisJCXsNCisJCQlTT1VSQ0VfVEVYVFVSRSwNCisJCQlTT1VSQ0VfQ09OU1RBTlQsDQorCQkJU09VUkNFX0NVUlJFTlQsDQorCQkJU09VUkNFX0RJRkZVU0UsDQorCQkJU09VUkNFX1NQRUNVTEFSLA0KKwkJCVNPVVJDRV9URU1QLA0KKwkJCVNPVVJDRV9URkFDVE9SLA0KKw0KKwkJCVNPVVJDRV9MQVNUID0gU09VUkNFX1RGQUNUT1INCisJCX07DQorDQorCQllbnVtIERlc3RpbmF0aW9uQXJndW1lbnQNCisJCXsNCisJCQlERVNUSU5BVElPTl9DVVJSRU5ULA0KKwkJCURFU1RJTkFUSU9OX1RFTVAsDQorDQorCQkJREVTVElOQVRJT05fTEFTVCA9IERFU1RJTkFUSU9OX1RFTVANCisJCX07DQorDQorCQllbnVtIEFyZ3VtZW50TW9kaWZpZXINCisJCXsNCisJCQlNT0RJRklFUl9DT0xPUiwNCisJCQlNT0RJRklFUl9JTlZDT0xPUiwNCisJCQlNT0RJRklFUl9BTFBIQSwNCisJCQlNT0RJRklFUl9JTlZBTFBIQSwNCisNCisJCQlNT0RJRklFUl9MQVNUID0gTU9ESUZJRVJfSU5WQUxQSEENCisJCX07DQorDQorCQlzdHJ1Y3QgU3RhdGUNCisJCXsNCisJCQlTdGF0ZSgpOw0KKw0KKwkJCXVuc2lnbmVkIGludCBzdGFnZU9wZXJhdGlvbgkJCTogQklUUyhTVEFHRV9MQVNUKTsNCisJCQl1bnNpZ25lZCBpbnQgZmlyc3RBcmd1bWVudAkJCTogQklUUyhTT1VSQ0VfTEFTVCk7DQorCQkJdW5zaWduZWQgaW50IHNlY29uZEFyZ3VtZW50CQkJOiBCSVRTKFNPVVJDRV9MQVNUKTsNCisJCQl1bnNpZ25lZCBpbnQgdGhpcmRBcmd1bWVudAkJCTogQklUUyhTT1VSQ0VfTEFTVCk7DQorCQkJdW5zaWduZWQgaW50IHN0YWdlT3BlcmF0aW9uQWxwaGEJOiBCSVRTKFNUQUdFX0xBU1QpOw0KKwkJCXVuc2lnbmVkIGludCBmaXJzdEFyZ3VtZW50QWxwaGEJCTogQklUUyhTT1VSQ0VfTEFTVCk7DQorCQkJdW5zaWduZWQgaW50IHNlY29uZEFyZ3VtZW50QWxwaGEJOiBCSVRTKFNPVVJDRV9MQVNUKTsNCisJCQl1bnNpZ25lZCBpbnQgdGhpcmRBcmd1bWVudEFscGhhCQk6IEJJVFMoU09VUkNFX0xBU1QpOw0KKwkJCXVuc2lnbmVkIGludCBmaXJzdE1vZGlmaWVyCQkJOiBCSVRTKE1PRElGSUVSX0xBU1QpOw0KKwkJCXVuc2lnbmVkIGludCBzZWNvbmRNb2RpZmllcgkJCTogQklUUyhNT0RJRklFUl9MQVNUKTsNCisJCQl1bnNpZ25lZCBpbnQgdGhpcmRNb2RpZmllcgkJCTogQklUUyhNT0RJRklFUl9MQVNUKTsNCisJCQl1bnNpZ25lZCBpbnQgZmlyc3RNb2RpZmllckFscGhhCQk6IEJJVFMoTU9ESUZJRVJfTEFTVCk7DQorCQkJdW5zaWduZWQgaW50IHNlY29uZE1vZGlmaWVyQWxwaGEJOiBCSVRTKE1PRElGSUVSX0xBU1QpOw0KKwkJCXVuc2lnbmVkIGludCB0aGlyZE1vZGlmaWVyQWxwaGEJCTogQklUUyhNT0RJRklFUl9MQVNUKTsNCisJCQl1bnNpZ25lZCBpbnQgZGVzdGluYXRpb25Bcmd1bWVudAk6IEJJVFMoREVTVElOQVRJT05fTEFTVCk7DQorCQkJdW5zaWduZWQgaW50IHRleENvb3JkSW5kZXgJCQk6IEJJVFMoNyk7DQorDQorCQkJdW5zaWduZWQgaW50IGNhbnRVbmRlcmZsb3cJCQk6IDE7DQorCQkJdW5zaWduZWQgaW50IHVzZXNUZXh0dXJlCQkJOiAxOw0KKwkJfTsNCisNCisJCXN0cnVjdCBVbmlmb3Jtcw0KKwkJew0KKwkJCXdvcmQ0IGNvbnN0YW50Q29sb3I0WzRdOw0KKwkJCWZsb2F0NCBidW1wbWFwTWF0cml4NEZbMl1bMl07DQorCQkJd29yZDQgYnVtcG1hcE1hdHJpeDRXWzJdWzJdOw0KKwkJCXdvcmQ0IGx1bWluYW5jZVNjYWxlNDsNCisJCQl3b3JkNCBsdW1pbmFuY2VPZmZzZXQ0Ow0KKwkJfTsNCisNCisJCVRleHR1cmVTdGFnZSgpOw0KKw0KKwkJflRleHR1cmVTdGFnZSgpOw0KKw0KKwkJdm9pZCBpbml0KGludCBzdGFnZSwgY29uc3QgU2FtcGxlciAqc2FtcGxlciwgY29uc3QgVGV4dHVyZVN0YWdlICpwcmV2aW91c1N0YWdlKTsNCisNCisJCVN0YXRlIHRleHR1cmVTdGFnZVN0YXRlKCkgY29uc3Q7DQorDQorCQl2b2lkIHNldENvbnN0YW50Q29sb3IoY29uc3QgQ29sb3I8ZmxvYXQ+ICZjb25zdGFudENvbG9yKTsNCisJCXZvaWQgc2V0QnVtcG1hcE1hdHJpeChpbnQgZWxlbWVudCwgZmxvYXQgdmFsdWUpOw0KKwkJdm9pZCBzZXRMdW1pbmFuY2VTY2FsZShmbG9hdCB2YWx1ZSk7DQorCQl2b2lkIHNldEx1bWluYW5jZU9mZnNldChmbG9hdCB2YWx1ZSk7DQorDQorCQl2b2lkIHNldFRleENvb3JkSW5kZXgodW5zaWduZWQgaW50IHRleENvb3JkSW5kZXgpOw0KKwkJdm9pZCBzZXRTdGFnZU9wZXJhdGlvbihTdGFnZU9wZXJhdGlvbiBzdGFnZU9wZXJhdGlvbik7DQorCQl2b2lkIHNldEZpcnN0QXJndW1lbnQoU291cmNlQXJndW1lbnQgZmlyc3RBcmd1bWVudCk7DQorCQl2b2lkIHNldFNlY29uZEFyZ3VtZW50KFNvdXJjZUFyZ3VtZW50IHNlY29uZEFyZ3VtZW50KTsNCisJCXZvaWQgc2V0VGhpcmRBcmd1bWVudChTb3VyY2VBcmd1bWVudCB0aGlyZEFyZ3VtZW50KTsNCisJCXZvaWQgc2V0U3RhZ2VPcGVyYXRpb25BbHBoYShTdGFnZU9wZXJhdGlvbiBzdGFnZU9wZXJhdGlvbkFscGhhKTsNCisJCXZvaWQgc2V0Rmlyc3RBcmd1bWVudEFscGhhKFNvdXJjZUFyZ3VtZW50IGZpcnN0QXJndW1lbnRBbHBoYSk7DQorCQl2b2lkIHNldFNlY29uZEFyZ3VtZW50QWxwaGEoU291cmNlQXJndW1lbnQgc2Vjb25kQXJndW1lbnRBbHBoYSk7DQorCQl2b2lkIHNldFRoaXJkQXJndW1lbnRBbHBoYShTb3VyY2VBcmd1bWVudCB0aGlyZEFyZ3VtZW50QWxwaGEpOw0KKwkJdm9pZCBzZXRGaXJzdE1vZGlmaWVyKEFyZ3VtZW50TW9kaWZpZXIgZmlyc3RNb2RpZmllcik7DQorCQl2b2lkIHNldFNlY29uZE1vZGlmaWVyKEFyZ3VtZW50TW9kaWZpZXIgc2Vjb25kTW9kaWZpZXIpOw0KKwkJdm9pZCBzZXRUaGlyZE1vZGlmaWVyKEFyZ3VtZW50TW9kaWZpZXIgdGhpcmRNb2RpZmllcik7DQorCQl2b2lkIHNldEZpcnN0TW9kaWZpZXJBbHBoYShBcmd1bWVudE1vZGlmaWVyIGZpcnN0TW9kaWZpZXJBbHBoYSk7DQorCQl2b2lkIHNldFNlY29uZE1vZGlmaWVyQWxwaGEoQXJndW1lbnRNb2RpZmllciBzZWNvbmRNb2RpZmllckFscGhhKTsNCisJCXZvaWQgc2V0VGhpcmRNb2RpZmllckFscGhhKEFyZ3VtZW50TW9kaWZpZXIgdGhpcmRNb2RpZmllckFscGhhKTsNCisJCXZvaWQgc2V0RGVzdGluYXRpb25Bcmd1bWVudChEZXN0aW5hdGlvbkFyZ3VtZW50IGRlc3RpbmF0aW9uQXJndW1lbnQpOw0KKw0KKwkJVW5pZm9ybXMgdW5pZm9ybXM7ICAgLy8gRklYTUU6IFByaXZhdGUNCisNCisJcHJpdmF0ZToNCisJCWJvb2wgdXNlc0NvbG9yKFNvdXJjZUFyZ3VtZW50IHNvdXJjZSkgY29uc3Q7DQorCQlib29sIHVzZXNBbHBoYShTb3VyY2VBcmd1bWVudCBzb3VyY2UpIGNvbnN0Ow0KKwkJYm9vbCB1c2VzKFNvdXJjZUFyZ3VtZW50IHNvdXJjZSkgY29uc3Q7DQorCQlib29sIHVzZXNDdXJyZW50KCkgY29uc3Q7DQorCQlib29sIHVzZXNEaWZmdXNlKCkgY29uc3Q7DQorCQlib29sIHVzZXNTcGVjdWxhcigpIGNvbnN0Ow0KKwkJYm9vbCB1c2VzVGV4dHVyZSgpIGNvbnN0Ow0KKwkJYm9vbCBpc1N0YWdlRGlzYWJsZWQoKSBjb25zdDsNCisJCWJvb2wgd3JpdGVzQ3VycmVudCgpIGNvbnN0Ow0KKw0KKwkJaW50IHN0YWdlOw0KKwkJDQorCQlTdGFnZU9wZXJhdGlvbiBzdGFnZU9wZXJhdGlvbjsNCisJCVNvdXJjZUFyZ3VtZW50IGZpcnN0QXJndW1lbnQ7DQorCQlTb3VyY2VBcmd1bWVudCBzZWNvbmRBcmd1bWVudDsNCisJCVNvdXJjZUFyZ3VtZW50IHRoaXJkQXJndW1lbnQ7DQorCQlTdGFnZU9wZXJhdGlvbiBzdGFnZU9wZXJhdGlvbkFscGhhOw0KKwkJU291cmNlQXJndW1lbnQgZmlyc3RBcmd1bWVudEFscGhhOw0KKwkJU291cmNlQXJndW1lbnQgc2Vjb25kQXJndW1lbnRBbHBoYTsNCisJCVNvdXJjZUFyZ3VtZW50IHRoaXJkQXJndW1lbnRBbHBoYTsNCisJCUFyZ3VtZW50TW9kaWZpZXIgZmlyc3RNb2RpZmllcjsNCisJCUFyZ3VtZW50TW9kaWZpZXIgc2Vjb25kTW9kaWZpZXI7DQorCQlBcmd1bWVudE1vZGlmaWVyIHRoaXJkTW9kaWZpZXI7DQorCQlBcmd1bWVudE1vZGlmaWVyIGZpcnN0TW9kaWZpZXJBbHBoYTsNCisJCUFyZ3VtZW50TW9kaWZpZXIgc2Vjb25kTW9kaWZpZXJBbHBoYTsNCisJCUFyZ3VtZW50TW9kaWZpZXIgdGhpcmRNb2RpZmllckFscGhhOw0KKwkJRGVzdGluYXRpb25Bcmd1bWVudCBkZXN0aW5hdGlvbkFyZ3VtZW50Ow0KKw0KKwkJaW50IHRleENvb3JkSW5kZXg7DQorCQljb25zdCBTYW1wbGVyICpzYW1wbGVyOw0KKwkJY29uc3QgVGV4dHVyZVN0YWdlICpwcmV2aW91c1N0YWdlOw0KKwl9Ow0KK30NCisNCisjZW5kaWYgc3dfVGV4dHVyZVN0YWdlX2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9UcmlhbmdsZS5ocHAgYi9zcmMvUmVuZGVyZXIvVHJpYW5nbGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NWZlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvVHJpYW5nbGUuaHBwCkBAIC0wLDAgKzEsMjcgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyDQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4NCisvLw0KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsDQorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXINCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4NCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MNCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuDQorLy8NCisNCisjaWZuZGVmIHN3X1RyaWFuZ2xlX2hwcA0KKyNkZWZpbmUgc3dfVHJpYW5nbGVfaHBwDQorDQorI2luY2x1ZGUgIlZlcnRleC5ocHAiDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwlzdHJ1Y3QgVHJpYW5nbGUNCisJew0KKwkJVmVydGV4IFYwOw0KKwkJVmVydGV4IFYxOw0KKwkJVmVydGV4IFYyOw0KKwl9Ow0KK30NCisNCisjZW5kaWYgICAvLyBzd19UcmlhbmdsZV9ocHANCmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvVmVjdG9yLmNwcCBiL3NyYy9SZW5kZXJlci9WZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2N2E2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvVmVjdG9yLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiVmVjdG9yLmhwcCIKKworI2luY2x1ZGUgIk1hdGguaHBwIgorI2luY2x1ZGUgIk1hdHJpeC5ocHAiCisKK25hbWVzcGFjZSBzdworeworCVZlY3RvciBWZWN0b3I6Om9wZXJhdG9yKygpIGNvbnN0CisJeworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJVmVjdG9yIFZlY3Rvcjo6b3BlcmF0b3ItKCkgY29uc3QKKwl7CisJCXJldHVybiBWZWN0b3IoLXgsIC15LCAteik7CisJfQorCisJVmVjdG9yICZWZWN0b3I6Om9wZXJhdG9yKz0oY29uc3QgVmVjdG9yICZ2KQorCXsKKwkJeCArPSB2Lng7CisJCXkgKz0gdi55OworCQl6ICs9IHYuejsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJVmVjdG9yICZWZWN0b3I6Om9wZXJhdG9yLT0oY29uc3QgVmVjdG9yICZ2KQorCXsKKwkJeCAtPSB2Lng7CisJCXkgLT0gdi55OworCQl6IC09IHYuejsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJVmVjdG9yICZWZWN0b3I6Om9wZXJhdG9yKj0oZmxvYXQgcykKKwl7CisJCXggKj0gczsKKwkJeSAqPSBzOworCQl6ICo9IHM7CisKKwkJcmV0dXJuICp0aGlzOworCX0KKworCVZlY3RvciAmVmVjdG9yOjpvcGVyYXRvci89KGZsb2F0IHMpCisJeworCQlmbG9hdCByID0gMS4wZiAvIHM7CisKKwkJcmV0dXJuICp0aGlzICo9IHI7CisJfQorCisJYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlY3RvciAmVSwgY29uc3QgVmVjdG9yICZ2KQorCXsKKwkJaWYoVS54ID09IHYueCAmJiBVLnkgPT0gdi55ICYmIFUueiA9PSB2LnopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZWxzZQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCWJvb2wgb3BlcmF0b3IhPShjb25zdCBWZWN0b3IgJlUsIGNvbnN0IFZlY3RvciAmdikKKwl7CisJCWlmKFUueCAhPSB2LnggfHwgVS55ICE9IHYueSB8fCBVLnogIT0gdi56KQorCQkJcmV0dXJuIHRydWU7CisJCWVsc2UKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlib29sIG9wZXJhdG9yPihjb25zdCBWZWN0b3IgJnUsIGNvbnN0IFZlY3RvciAmdikKKwl7CisJCWlmKCh1XjIpID4gKHZeMikpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZWxzZQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCWJvb2wgb3BlcmF0b3I8KGNvbnN0IFZlY3RvciAmdSwgY29uc3QgVmVjdG9yICZ2KQorCXsKKwkJaWYoKHVeMikgPCAodl4yKSkKKwkJCXJldHVybiB0cnVlOworCQllbHNlCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJVmVjdG9yIG9wZXJhdG9yKyhjb25zdCBWZWN0b3IgJnUsIGNvbnN0IFZlY3RvciAmdikKKwl7CisJCXJldHVybiBWZWN0b3IodS54ICsgdi54LCB1LnkgKyB2LnksIHUueiArIHYueik7CisJfQorCisJVmVjdG9yIG9wZXJhdG9yLShjb25zdCBWZWN0b3IgJnUsIGNvbnN0IFZlY3RvciAmdikKKwl7CisJCXJldHVybiBWZWN0b3IodS54IC0gdi54LCB1LnkgLSB2LnksIHUueiAtIHYueik7CisJfQorCisJZmxvYXQgb3BlcmF0b3IqKGNvbnN0IFZlY3RvciAmdSwgY29uc3QgVmVjdG9yICZ2KQorCXsKKwkJcmV0dXJuIHUueCAqIHYueCArIHUueSAqIHYueSArIHUueiAqIHYuejsKKwl9CisKKwlWZWN0b3Igb3BlcmF0b3IqKGZsb2F0IHMsIGNvbnN0IFZlY3RvciAmdikKKwl7CisJCXJldHVybiBWZWN0b3IocyAqIHYueCwgcyAqIHYueSwgcyAqIHYueik7CisJfQorCisJVmVjdG9yIG9wZXJhdG9yKihjb25zdCBWZWN0b3IgJnYsIGZsb2F0IHMpCisJeworCQlyZXR1cm4gVmVjdG9yKHYueCAqIHMsIHYueSAqIHMsIHYueiAqIHMpOworCX0KKworCVZlY3RvciBvcGVyYXRvci8oY29uc3QgVmVjdG9yICZ2LCBmbG9hdCBzKQorCXsKKwkJZmxvYXQgciA9IDEuMGYgLyBzOworCisJCXJldHVybiBWZWN0b3Iodi54ICogciwgdi55ICogciwgdi56ICogcik7CisJfQorCisJZmxvYXQgb3BlcmF0b3JeKGNvbnN0IFZlY3RvciAmdSwgY29uc3QgVmVjdG9yICZ2KQorCXsKKwkJcmV0dXJuIGFjb3ModSAvIFZlY3Rvcjo6Tih1KSAqIHYgLyBWZWN0b3I6Ok4odikpOworCX0KKworCVZlY3RvciBvcGVyYXRvciUoY29uc3QgVmVjdG9yICZ1LCBjb25zdCBWZWN0b3IgJnYpCisJeworCQlyZXR1cm4gVmVjdG9yKHUueSAqIHYueiAtIHUueiAqIHYueSwgdS56ICogdi54IC0gdS54ICogdi56LCB1LnggKiB2LnkgLSB1LnkgKiB2LngpOworCX0KKworCVZlY3RvciBvcGVyYXRvciooY29uc3QgTWF0cml4ICZNLCBjb25zdCBWZWN0b3IgJnYpCisJeworCQlyZXR1cm4gVmVjdG9yKE0oMSwgMSkgKiB2LnggKyBNKDEsIDIpICogdi55ICsgTSgxLCAzKSAqIHYueiwKKwkJICAgICAgICAgICAgICBNKDIsIDEpICogdi54ICsgTSgyLCAyKSAqIHYueSArIE0oMiwgMykgKiB2LnosCisJCSAgICAgICAgICAgICAgTSgzLCAxKSAqIHYueCArIE0oMywgMikgKiB2LnkgKyBNKDMsIDMpICogdi56KTsKKwl9CisKKwlWZWN0b3Igb3BlcmF0b3IqKGNvbnN0IFZlY3RvciAmdiwgY29uc3QgTWF0cml4ICZNKQorCXsKKwkJcmV0dXJuIFZlY3Rvcih2LnggKiBNKDEsIDEpICsgdi55ICogTSgyLCAxKSArIHYueiAqIE0oMywgMSkgKyBNKDQsIDEpLAorCQkgICAgICAgICAgICAgIHYueCAqIE0oMSwgMikgKyB2LnkgKiBNKDIsIDIpICsgdi56ICogTSgzLCAyKSArIE0oNCwgMiksCisJCSAgICAgICAgICAgICAgdi54ICogTSgxLCAzKSArIHYueSAqIE0oMiwgMykgKyB2LnogKiBNKDMsIDMpICsgTSg0LCAzKSk7CisJfQorCisJVmVjdG9yICZvcGVyYXRvcio9KFZlY3RvciAmdiwgY29uc3QgTWF0cml4ICZNKQorCXsKKwkJcmV0dXJuIHYgPSB2ICogTTsKKwl9CisKKwlmbG9hdCBWZWN0b3I6Ok4oY29uc3QgVmVjdG9yICZ2KQorCXsKKwkJcmV0dXJuIHNxcnQodi54KnYueCArIHYueSp2LnkgKyB2Lnoqdi56KTsKKwl9CisKKwlmbG9hdCBWZWN0b3I6Ok4yKGNvbnN0IFZlY3RvciAmdikKKwl7CisJCXJldHVybiB2Lngqdi54ICsgdi55KnYueSArIHYueip2Lno7CisJfQorCisJVmVjdG9yIGxlcnAoY29uc3QgVmVjdG9yICZ1LCBjb25zdCBWZWN0b3IgJnYsIGZsb2F0IHQpCisJeworCQlyZXR1cm4gVmVjdG9yKHUueCArIHQgKiAodi54IC0gdS54KSwKKwkJICAgICAgICAgICAgICB1LnkgKyB0ICogKHYueSAtIHUueSksCisJCQkJCSAgdS56ICsgdCAqICh2LnogLSB1LngpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvVmVjdG9yLmhwcCBiL3NyYy9SZW5kZXJlci9WZWN0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjE3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvVmVjdG9yLmhwcApAQCAtMCwwICsxLDE1MCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIFZlY3Rvcl9ocHAKKyNkZWZpbmUgVmVjdG9yX2hwcAorCituYW1lc3BhY2Ugc3cKK3sKKwlzdHJ1Y3QgUG9pbnQ7CisJc3RydWN0IE1hdHJpeDsKKwlzdHJ1Y3QgUGxhbmU7CisKKwlzdHJ1Y3QgVmVjdG9yCisJeworCQlWZWN0b3IoKTsKKwkJVmVjdG9yKGNvbnN0IGludCBpKTsKKwkJVmVjdG9yKGNvbnN0IFZlY3RvciAmdik7CisJCVZlY3Rvcihjb25zdCBQb2ludCAmcCk7CisJCVZlY3RvcihmbG9hdCB2X3gsIGZsb2F0IHZfeSwgZmxvYXQgdl96KTsKKworCQlWZWN0b3IgJm9wZXJhdG9yPShjb25zdCBWZWN0b3IgJnYpOworCisJCXVuaW9uCisJCXsKKwkJCWZsb2F0IHZbM107CisKKwkJCXN0cnVjdAorCQkJeworCQkJCWZsb2F0IHg7CisJCQkJZmxvYXQgeTsKKwkJCQlmbG9hdCB6OworCQkJfTsKKwkJfTsKKworCQlmbG9hdCAmb3BlcmF0b3JbXShpbnQgaSk7CisJCWZsb2F0ICZvcGVyYXRvcigpKGludCBpKTsKKworCQljb25zdCBmbG9hdCAmb3BlcmF0b3JbXShpbnQgaSkgY29uc3Q7CisJCWNvbnN0IGZsb2F0ICZvcGVyYXRvcigpKGludCBpKSBjb25zdDsKKworCQlWZWN0b3Igb3BlcmF0b3IrKCkgY29uc3Q7CisJCVZlY3RvciBvcGVyYXRvci0oKSBjb25zdDsKKworCQlWZWN0b3IgJm9wZXJhdG9yKz0oY29uc3QgVmVjdG9yICZ2KTsKKwkJVmVjdG9yICZvcGVyYXRvci09KGNvbnN0IFZlY3RvciAmdik7CisJCVZlY3RvciAmb3BlcmF0b3IqPShmbG9hdCBzKTsKKwkJVmVjdG9yICZvcGVyYXRvci89KGZsb2F0IHMpOworCisJCWZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yICZ1LCBjb25zdCBWZWN0b3IgJnYpOworCQlmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFZlY3RvciAmdSwgY29uc3QgVmVjdG9yICZ2KTsKKworCQlmcmllbmQgVmVjdG9yIG9wZXJhdG9yKyhjb25zdCBWZWN0b3IgJnUsIGNvbnN0IFZlY3RvciAmdik7CisJCWZyaWVuZCBWZWN0b3Igb3BlcmF0b3ItKGNvbnN0IFZlY3RvciAmdSwgY29uc3QgVmVjdG9yICZ2KTsKKwkJZnJpZW5kIGZsb2F0IG9wZXJhdG9yKihjb25zdCBWZWN0b3IgJnUsIGNvbnN0IFZlY3RvciAmdik7ICAgLy8gRG90IHByb2R1Y3QKKwkJZnJpZW5kIFZlY3RvciBvcGVyYXRvciooZmxvYXQgcywgY29uc3QgVmVjdG9yICZ2KTsKKwkJZnJpZW5kIFZlY3RvciBvcGVyYXRvciooY29uc3QgVmVjdG9yICZ2LCBmbG9hdCBzKTsKKwkJZnJpZW5kIFZlY3RvciBvcGVyYXRvci8oY29uc3QgVmVjdG9yICZ2LCBmbG9hdCBzKTsKKwkJZnJpZW5kIGZsb2F0IG9wZXJhdG9yXihjb25zdCBWZWN0b3IgJnUsIGNvbnN0IFZlY3RvciAmdik7ICAgLy8gQW5nbGUgYmV0d2VlbiB2ZWN0b3JzCisJCWZyaWVuZCBWZWN0b3Igb3BlcmF0b3IlKGNvbnN0IFZlY3RvciAmdSwgY29uc3QgVmVjdG9yICZ2KTsgICAvLyBDcm9zcyBwcm9kdWN0CisKKwkJZnJpZW5kIFZlY3RvciBvcGVyYXRvciooY29uc3QgTWF0cml4ICZNLCBjb25zdCBWZWN0b3ImIHYpOworCQlmcmllbmQgVmVjdG9yIG9wZXJhdG9yKihjb25zdCBWZWN0b3IgJnYsIGNvbnN0IE1hdHJpeCAmTSk7CisJCWZyaWVuZCBWZWN0b3IgJm9wZXJhdG9yKj0oVmVjdG9yICZ2LCBjb25zdCBNYXRyaXggJk0pOworCisJCXN0YXRpYyBmbG9hdCBOKGNvbnN0IFZlY3RvciAmdik7ICAgLy8gTm9ybQorCQlzdGF0aWMgZmxvYXQgTjIoY29uc3QgVmVjdG9yICZ2KTsgICAvLyBTcXVhcmVkIG5vcm0KKworCQlzdGF0aWMgVmVjdG9yIG1pcnJvcihjb25zdCBWZWN0b3IgJnYsIGNvbnN0IFBsYW5lICZwKTsKKwkJc3RhdGljIFZlY3RvciByZWZsZWN0KGNvbnN0IFZlY3RvciAmdiwgY29uc3QgUGxhbmUgJnApOworCQlzdGF0aWMgVmVjdG9yIGxlcnAoY29uc3QgVmVjdG9yICZ1LCBjb25zdCBWZWN0b3IgJnYsIGZsb2F0IHQpOworCX07Cit9CisKKyNpbmNsdWRlICJQb2ludC5ocHAiCisKK25hbWVzcGFjZSBzdworeworCWlubGluZSBWZWN0b3I6OlZlY3RvcigpCisJeworCX0KKworCWlubGluZSBWZWN0b3I6OlZlY3Rvcihjb25zdCBpbnQgaSkKKwl7CisJCWNvbnN0IGZsb2F0IHMgPSAoZmxvYXQpaTsKKworCQl4ID0gczsKKwkJeSA9IHM7CisJCXogPSBzOworCX0KKworCWlubGluZSBWZWN0b3I6OlZlY3Rvcihjb25zdCBWZWN0b3IgJnYpCisJeworCQl4ID0gdi54OworCQl5ID0gdi55OworCQl6ID0gdi56OworCX0KKworCWlubGluZSBWZWN0b3I6OlZlY3Rvcihjb25zdCBQb2ludCAmUCkKKwl7CisJCXggPSBQLng7CisJCXkgPSBQLnk7CisJCXogPSBQLno7CisJfQorCisJaW5saW5lIFZlY3Rvcjo6VmVjdG9yKGZsb2F0IHZfeCwgZmxvYXQgdl95LCBmbG9hdCB2X3opCisJeworCQl4ID0gdl94OworCQl5ID0gdl95OworCQl6ID0gdl96OworCX0KKworCWlubGluZSBWZWN0b3IgJlZlY3Rvcjo6b3BlcmF0b3I9KGNvbnN0IFZlY3RvciAmdikKKwl7CisJCXggPSB2Lng7CisJCXkgPSB2Lnk7CisJCXogPSB2Lno7CisKKwkJcmV0dXJuICp0aGlzOworCX0KKworCWlubGluZSBmbG9hdCAmVmVjdG9yOjpvcGVyYXRvcigpKGludCBpKQorCXsKKwkJcmV0dXJuIHZbaV07CisJfQorCisJaW5saW5lIGZsb2F0ICZWZWN0b3I6Om9wZXJhdG9yW10oaW50IGkpCisJeworCQlyZXR1cm4gdltpXTsKKwl9CisKKwlpbmxpbmUgY29uc3QgZmxvYXQgJlZlY3Rvcjo6b3BlcmF0b3IoKShpbnQgaSkgY29uc3QKKwl7CisJCXJldHVybiB2W2ldOworCX0KKworCWlubGluZSBjb25zdCBmbG9hdCAmVmVjdG9yOjpvcGVyYXRvcltdKGludCBpKSBjb25zdAorCXsKKwkJcmV0dXJuIHZbaV07CisJfQorfQorCisjZW5kaWYgICAvLyBWZWN0b3JfaHBwCmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvVmVydGV4LmhwcCBiL3NyYy9SZW5kZXJlci9WZXJ0ZXguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjc3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvVmVydGV4LmhwcApAQCAtMCwwICsxLDk5IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgVmVydGV4X2hwcAorI2RlZmluZSBWZXJ0ZXhfaHBwCisKKyNpbmNsdWRlICJDb2xvci5ocHAiCisjaW5jbHVkZSAiQ29tbW9uL01ldGFNYWNyby5ocHAiCisjaW5jbHVkZSAiQ29tbW9uL1R5cGVzLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJZW51bSBPdXQgICAvLyBEZWZhdWx0IHZlcnRleCBhdHRyaWJ1dGUgc2VtYW50aWMKKwl7CisJCVBvcyA9IDAsCisJCUQwID0gMSwKKwkJRDEgPSAyLAorCQlUMCA9IDMsCisJCVQxID0gNCwKKwkJVDIgPSA1LAorCQlUMyA9IDYsCisJCVQ0ID0gNywKKwkJVDUgPSA4LAorCQlUNiA9IDksCisJCVQ3ID0gMTAsCisJCUZvZyA9IDExLCAgIC8vIHggY29tcG9uZW50CisJCVB0cyA9IEZvZyAgIC8vIHkgY29tcG9uZW50CisJfTsKKworCXN0cnVjdCBVVldRCisJeworCQlmbG9hdCB1OworCQlmbG9hdCB2OworCQlmbG9hdCB3OworCQlmbG9hdCBxOworCisJCWZsb2F0ICZvcGVyYXRvcltdKGludCBpKQorCQl7CisJCQlyZXR1cm4gKCZ1KVtpXTsKKwkJfQorCX07CisKKwlBTElHTigxNiwgc3RydWN0IFZlcnRleAorCXsKKwkJdW5pb24KKwkJeworCQkJc3RydWN0ICAgLy8gRml4ZWQgc2VtYW50aWNzCisJCQl7CisJCQkJdW5pb24gICAvLyBQb3NpdGlvbgorCQkJCXsKKwkJCQkJc3RydWN0CisJCQkJCXsKKwkJCQkJCWZsb2F0IHg7CisJCQkJCQlmbG9hdCB5OworCQkJCQkJZmxvYXQgejsKKwkJCQkJCWZsb2F0IHc7CisJCQkJCX07CisKKwkJCQkJc3RydWN0CisJCQkJCXsKKwkJCQkJCWZsb2F0NCBQOworCQkJCQl9OworCQkJCX07CisKKwkJCQlDb2xvcjxmbG9hdD4gQ1syXTsgICAvLyBEaWZmdXNlIGFuZCBzcGVjdWxhciBjb2xvcgorCisJCQkJVVZXUSBUWzhdOyAgICAgICAgICAgLy8gVGV4dHVyZSBjb29yZGluYXRlcworCisJCQkJZmxvYXQgZjsgICAgICAgICAgICAgLy8gRm9nCisJCQkJZmxvYXQgcFNpemU7ICAgICAgICAgLy8gUG9pbnQgc2l6ZQorCQkJCXVuc2lnbmVkIGNoYXIgcGFkZGluZzBbNF07CisJCQkJdW5zaWduZWQgY2hhciBjbGlwRmxhZ3M7CisJCQkJdW5zaWduZWQgY2hhciBwYWRkaW5nMVszXTsKKwkJCX07CisKKwkJCWZsb2F0NCB2WzEyXTsgICAvLyBHZW5lcmljIGNvbXBvbmVudHMgdXNpbmcgc2VtYW50aWMgZGVjbGFyYXRpb24KKwkJfTsKKworCQlzdHJ1Y3QgICAvLyBQcm9qZWN0ZWQgY29vcmRpbmF0ZXMKKwkJeworCQkJaW50IFg7CisJCQlpbnQgWTsKKwkJCWZsb2F0IFo7CisJCQlmbG9hdCBXOworCQl9OworCX0pOworCisJTUVUQV9BU1NFUlQoKHNpemVvZihWZXJ0ZXgpICYgMHgwMDAwMDAwRikgPT0gMCk7Cit9CisKKyNlbmRpZiAgIC8vIFZlcnRleF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9SZW5kZXJlci9WZXJ0ZXhQcm9jZXNzb3IuY3BwIGIvc3JjL1JlbmRlcmVyL1ZlcnRleFByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyM2JlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9WZXJ0ZXhQcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsOTc4IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJWZXJ0ZXhQcm9jZXNzb3IuaHBwIgorCisjaW5jbHVkZSAiVmlld3BvcnQuaHBwIgorI2luY2x1ZGUgIk1hdGguaHBwIgorI2luY2x1ZGUgIlZlcnRleFBpcGVsaW5lLmhwcCIKKyNpbmNsdWRlICJWZXJ0ZXhQcm9ncmFtLmhwcCIKKyNpbmNsdWRlICJWZXJ0ZXhTaGFkZXIuaHBwIgorI2luY2x1ZGUgIlBpeGVsU2hhZGVyLmhwcCIKKyNpbmNsdWRlICJDb25zdGFudHMuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorCituYW1lc3BhY2Ugc3cKK3sKKwl2b2lkIFZlcnRleENhY2hlOjpjbGVhcigpCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJdGFnW2ldID0gMHg4MDAwMDAwMDsKKwkJfQorCX0KKworCXVuc2lnbmVkIGludCBWZXJ0ZXhQcm9jZXNzb3I6OlN0YXRlczo6Y29tcHV0ZUhhc2goKQorCXsKKwkJdW5zaWduZWQgaW50ICpzdGF0ZSA9ICh1bnNpZ25lZCBpbnQqKXRoaXM7CisJCXVuc2lnbmVkIGludCBoYXNoID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKFN0YXRlcykgLyA0OyBpKyspCisJCXsKKwkJCWhhc2ggXj0gc3RhdGVbaV07CisJCX0KKworCQlyZXR1cm4gaGFzaDsKKwl9CisKKwlWZXJ0ZXhQcm9jZXNzb3I6OlN0YXRlOjpTdGF0ZSgpCisJeworCQltZW1zZXQodGhpcywgMCwgc2l6ZW9mKFN0YXRlKSk7CisJfQorCisJYm9vbCBWZXJ0ZXhQcm9jZXNzb3I6OlN0YXRlOjpvcGVyYXRvcj09KGNvbnN0IFN0YXRlICZzdGF0ZSkgY29uc3QKKwl7CisJCWlmKGhhc2ggIT0gc3RhdGUuaGFzaCkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIG1lbWNtcChzdGF0aWNfY2FzdDxjb25zdCBTdGF0ZXMqPih0aGlzKSwgc3RhdGljX2Nhc3Q8Y29uc3QgU3RhdGVzKj4oJnN0YXRlKSwgc2l6ZW9mKFN0YXRlcykpID09IDA7CisJfQorCisJVmVydGV4UHJvY2Vzc29yOjpWZXJ0ZXhQcm9jZXNzb3IoQ29udGV4dCAqY29udGV4dCkgOiBjb250ZXh0KGNvbnRleHQpCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTI7IGkrKykKKwkJeworCQkJTVtpXSA9IDE7CisJCX0KKworCQlWID0gMTsKKwkJQiA9IDE7CisJCVAgPSAwOworCQlQQiA9IDA7CisJCVBCViA9IDA7CisJCQorCQlmb3IoaW50IGkgPSAwOyBpIDwgMTI7IGkrKykKKwkJeworCQkJUEJWTVtpXSA9IDA7CisJCX0KKworCQlzZXRMaWdodGluZ0VuYWJsZSh0cnVlKTsKKwkJc2V0U3BlY3VsYXJFbmFibGUoZmFsc2UpOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCA4OyBpKyspCisJCXsKKwkJCXNldExpZ2h0RW5hYmxlKGksIGZhbHNlKTsKKwkJCXNldExpZ2h0UG9zaXRpb24oaSwgMCk7CisJCX0KKworCQl1cGRhdGVNYXRyaXggPSB0cnVlOworCQl1cGRhdGVWaWV3TWF0cml4ID0gdHJ1ZTsKKwkJdXBkYXRlQmFzZU1hdHJpeCA9IHRydWU7CisJCXVwZGF0ZVByb2plY3Rpb25NYXRyaXggPSB0cnVlOworCQl1cGRhdGVMaWdodGluZyA9IHRydWU7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDEyOyBpKyspCisJCXsKKwkJCXVwZGF0ZU1vZGVsTWF0cml4W2ldID0gdHJ1ZTsKKwkJfQorCisJCXJvdXRpbmVDYWNoZSA9IDA7CisJCXNldFJvdXRpbmVDYWNoZVNpemUoMTAyNCk7CisJfQorCisJVmVydGV4UHJvY2Vzc29yOjp+VmVydGV4UHJvY2Vzc29yKCkKKwl7CisJCWRlbGV0ZSByb3V0aW5lQ2FjaGU7CisJCXJvdXRpbmVDYWNoZSA9IDA7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldElucHV0U3RyZWFtKGludCBpbmRleCwgY29uc3QgU3RyZWFtICZzdHJlYW0pCisJeworCQljb250ZXh0LT5pbnB1dFtpbmRleF0gPSBzdHJlYW07CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldElucHV0UG9zaXRpb25TdHJlYW0oY29uc3QgU3RyZWFtICZzdHJlYW0pCisJeworCQljb250ZXh0LT5pbnB1dFtQb3NpdGlvbl0gPSBzdHJlYW07CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldElucHV0QmxlbmRXZWlnaHRTdHJlYW0oY29uc3QgU3RyZWFtICZzdHJlYW0pCisJeworCQljb250ZXh0LT5pbnB1dFtCbGVuZFdlaWdodF0gPSBzdHJlYW07CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldElucHV0QmxlbmRJbmRpY2VzU3RyZWFtKGNvbnN0IFN0cmVhbSAmc3RyZWFtKQorCXsKKwkJY29udGV4dC0+aW5wdXRbQmxlbmRJbmRpY2VzXSA9IHN0cmVhbTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0SW5wdXROb3JtYWxTdHJlYW0oY29uc3QgU3RyZWFtICZzdHJlYW0pCisJeworCQljb250ZXh0LT5pbnB1dFtOb3JtYWxdID0gc3RyZWFtOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRJbnB1dFBTaXplU3RyZWFtKGNvbnN0IFN0cmVhbSAmc3RyZWFtKQorCXsKKwkJY29udGV4dC0+aW5wdXRbUFNpemVdID0gc3RyZWFtOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRJbnB1dFRleENvb3JkU3RyZWFtKGNvbnN0IFN0cmVhbSAmc3RyZWFtLCBpbnQgaW5kZXgpCisJeworCQljb250ZXh0LT5pbnB1dFtUZXhDb29yZDAgKyBpbmRleF0gPSBzdHJlYW07CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldElucHV0UG9zaXRpb250U3RyZWFtKGNvbnN0IFN0cmVhbSAmc3RyZWFtKQorCXsKKwkJY29udGV4dC0+aW5wdXRbUG9zaXRpb25UXSA9IHN0cmVhbTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0SW5wdXRDb2xvclN0cmVhbShjb25zdCBTdHJlYW0gJnN0cmVhbSwgaW50IGluZGV4KQorCXsKKwkJY29udGV4dC0+aW5wdXRbQ29sb3IwICsgaW5kZXhdID0gc3RyZWFtOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpyZXNldElucHV0U3RyZWFtcyhib29sIHByZVRyYW5zZm9ybWVkKQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCWNvbnRleHQtPmlucHV0W2ldLmRlZmF1bHRzKCk7CisJCX0KKworCQljb250ZXh0LT5wcmVUcmFuc2Zvcm1lZCA9IHByZVRyYW5zZm9ybWVkOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRGbG9hdENvbnN0YW50KHVuc2lnbmVkIGludCBpbmRleCwgY29uc3QgZmxvYXQgdmFsdWVbNF0pCisJeworCQlpZihpbmRleCA8IDI1NikKKwkJeworCQkJY1tpbmRleF1bMF0gPSB2YWx1ZVswXTsKKwkJCWNbaW5kZXhdWzFdID0gdmFsdWVbMV07CisJCQljW2luZGV4XVsyXSA9IHZhbHVlWzJdOworCQkJY1tpbmRleF1bM10gPSB2YWx1ZVszXTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldEludGVnZXJDb25zdGFudCh1bnNpZ25lZCBpbnQgaW5kZXgsIGNvbnN0IGludCBpbnRlZ2VyWzRdKQorCXsKKwkJaWYoaW5kZXggPCAxNikKKwkJeworCQkJaVtpbmRleF1bMF0gPSBpbnRlZ2VyWzBdOworCQkJaVtpbmRleF1bMV0gPSBpbnRlZ2VyWzFdOworCQkJaVtpbmRleF1bMl0gPSBpbnRlZ2VyWzJdOworCQkJaVtpbmRleF1bM10gPSBpbnRlZ2VyWzNdOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0Qm9vbGVhbkNvbnN0YW50KHVuc2lnbmVkIGludCBpbmRleCwgaW50IGJvb2xlYW4pCisJeworCQlpZihpbmRleCA8IDE2KQorCQl7CisJCQliW2luZGV4XSA9IGJvb2xlYW4gIT0gMDsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldE1vZGVsTWF0cml4KGNvbnN0IE1hdHJpeCAmTSwgaW50IGkpCisJeworCQlpZihpIDwgMTIpCisJCXsKKwkJCXRoaXMtPk1baV0gPSBNOworCisJCQl1cGRhdGVNYXRyaXggPSB0cnVlOworCQkJdXBkYXRlTW9kZWxNYXRyaXhbaV0gPSB0cnVlOworCQkJdXBkYXRlTGlnaHRpbmcgPSB0cnVlOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0Vmlld01hdHJpeChjb25zdCBNYXRyaXggJlYpCisJeworCQl0aGlzLT5WID0gVjsKKworCQl1cGRhdGVNYXRyaXggPSB0cnVlOworCQl1cGRhdGVWaWV3TWF0cml4ID0gdHJ1ZTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0QmFzZU1hdHJpeChjb25zdCBNYXRyaXggJkIpCisJeworCQl0aGlzLT5CID0gQjsKKworCQl1cGRhdGVNYXRyaXggPSB0cnVlOworCQl1cGRhdGVCYXNlTWF0cml4ID0gdHJ1ZTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0UHJvamVjdGlvbk1hdHJpeChjb25zdCBNYXRyaXggJlApCisJeworCQl0aGlzLT5QID0gUDsKKwkJY29udGV4dC0+d0Jhc2VkRm9nID0gKFBbM11bMF0gIT0gMC4wZikgfHwgKFBbM11bMV0gIT0gMC4wZikgfHwgKFBbM11bMl0gIT0gMC4wZikgfHwgKFBbM11bM10gIT0gMS4wZik7CisKKwkJdXBkYXRlTWF0cml4ID0gdHJ1ZTsKKwkJdXBkYXRlUHJvamVjdGlvbk1hdHJpeCA9IHRydWU7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldExpZ2h0aW5nRW5hYmxlKGJvb2wgbGlnaHRpbmdFbmFibGUpCisJeworCQljb250ZXh0LT5zZXRMaWdodGluZ0VuYWJsZShsaWdodGluZ0VuYWJsZSk7CisKKwkJdXBkYXRlTGlnaHRpbmcgPSB0cnVlOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRMaWdodEVuYWJsZSh1bnNpZ25lZCBpbnQgbGlnaHQsIGJvb2wgbGlnaHRFbmFibGUpCisJeworCQlpZihsaWdodCA8IDgpCisJCXsKKwkJCWNvbnRleHQtPnNldExpZ2h0RW5hYmxlKGxpZ2h0LCBsaWdodEVuYWJsZSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCisJCXVwZGF0ZUxpZ2h0aW5nID0gdHJ1ZTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0U3BlY3VsYXJFbmFibGUoYm9vbCBzcGVjdWxhckVuYWJsZSkKKwl7CisJCWNvbnRleHQtPnNldFNwZWN1bGFyRW5hYmxlKHNwZWN1bGFyRW5hYmxlKTsKKworCQl1cGRhdGVMaWdodGluZyA9IHRydWU7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldExpZ2h0UG9zaXRpb24odW5zaWduZWQgaW50IGxpZ2h0LCBjb25zdCBQb2ludCAmbGlnaHRQb3NpdGlvbikKKwl7CisJCWlmKGxpZ2h0IDwgOCkKKwkJeworCQkJY29udGV4dC0+c2V0TGlnaHRQb3NpdGlvbihsaWdodCwgbGlnaHRQb3NpdGlvbik7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCisJCXVwZGF0ZUxpZ2h0aW5nID0gdHJ1ZTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0TGlnaHREaWZmdXNlKHVuc2lnbmVkIGludCBsaWdodCwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZsaWdodERpZmZ1c2UpCisJeworCQlpZihsaWdodCA8IDgpCisJCXsKKwkJCWZmLmxpZ2h0RGlmZnVzZVtsaWdodF1bMF0gPSBsaWdodERpZmZ1c2UucjsKKwkJCWZmLmxpZ2h0RGlmZnVzZVtsaWdodF1bMV0gPSBsaWdodERpZmZ1c2UuZzsKKwkJCWZmLmxpZ2h0RGlmZnVzZVtsaWdodF1bMl0gPSBsaWdodERpZmZ1c2UuYjsKKwkJCWZmLmxpZ2h0RGlmZnVzZVtsaWdodF1bM10gPSBsaWdodERpZmZ1c2UuYTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldExpZ2h0U3BlY3VsYXIodW5zaWduZWQgaW50IGxpZ2h0LCBjb25zdCBDb2xvcjxmbG9hdD4gJmxpZ2h0U3BlY3VsYXIpCisJeworCQlpZihsaWdodCA8IDgpCisJCXsKKwkJCWZmLmxpZ2h0U3BlY3VsYXJbbGlnaHRdWzBdID0gbGlnaHRTcGVjdWxhci5yOworCQkJZmYubGlnaHRTcGVjdWxhcltsaWdodF1bMV0gPSBsaWdodFNwZWN1bGFyLmc7CisJCQlmZi5saWdodFNwZWN1bGFyW2xpZ2h0XVsyXSA9IGxpZ2h0U3BlY3VsYXIuYjsKKwkJCWZmLmxpZ2h0U3BlY3VsYXJbbGlnaHRdWzNdID0gbGlnaHRTcGVjdWxhci5hOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0TGlnaHRBbWJpZW50KHVuc2lnbmVkIGludCBsaWdodCwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZsaWdodEFtYmllbnQpCisJeworCQlpZihsaWdodCA8IDgpCisJCXsKKwkJCWZmLmxpZ2h0QW1iaWVudFtsaWdodF1bMF0gPSBsaWdodEFtYmllbnQucjsKKwkJCWZmLmxpZ2h0QW1iaWVudFtsaWdodF1bMV0gPSBsaWdodEFtYmllbnQuZzsKKwkJCWZmLmxpZ2h0QW1iaWVudFtsaWdodF1bMl0gPSBsaWdodEFtYmllbnQuYjsKKwkJCWZmLmxpZ2h0QW1iaWVudFtsaWdodF1bM10gPSBsaWdodEFtYmllbnQuYTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldExpZ2h0QXR0ZW51YXRpb24odW5zaWduZWQgaW50IGxpZ2h0LCBmbG9hdCBjb25zdGFudCwgZmxvYXQgbGluZWFyLCBmbG9hdCBxdWFkcmF0aWMpCisJeworCQlpZihsaWdodCA8IDgpCisJCXsKKwkJCWZmLmF0dGVudWF0aW9uQ29uc3RhbnRbbGlnaHRdID0gcmVwbGljYXRlKGNvbnN0YW50KTsJCQkKKwkJCWZmLmF0dGVudWF0aW9uTGluZWFyW2xpZ2h0XSA9IHJlcGxpY2F0ZShsaW5lYXIpOworCQkJZmYuYXR0ZW51YXRpb25RdWFkcmF0aWNbbGlnaHRdID0gcmVwbGljYXRlKHF1YWRyYXRpYyk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRMaWdodFJhbmdlKHVuc2lnbmVkIGludCBsaWdodCwgZmxvYXQgbGlnaHRSYW5nZSkKKwl7CisJCWlmKGxpZ2h0IDwgOCkKKwkJeworCQkJZmYubGlnaHRSYW5nZVtsaWdodF0gPSBsaWdodFJhbmdlOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0Rm9nRW5hYmxlKGJvb2wgZm9nRW5hYmxlKQorCXsKKwkJY29udGV4dC0+Zm9nRW5hYmxlID0gZm9nRW5hYmxlOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRWZXJ0ZXhGb2dNb2RlKENvbnRleHQ6OkZvZ01vZGUgZm9nTW9kZSkKKwl7CisJCWNvbnRleHQtPnZlcnRleEZvZ01vZGUgPSBmb2dNb2RlOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRDb2xvclZlcnRleEVuYWJsZShib29sIGNvbG9yVmVydGV4RW5hYmxlKQorCXsKKwkJY29udGV4dC0+c2V0Q29sb3JWZXJ0ZXhFbmFibGUoY29sb3JWZXJ0ZXhFbmFibGUpOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXREaWZmdXNlTWF0ZXJpYWxTb3VyY2UoQ29udGV4dDo6TWF0ZXJpYWxTb3VyY2UgZGlmZnVzZU1hdGVyaWFsU291cmNlKQorCXsKKwkJY29udGV4dC0+c2V0RGlmZnVzZU1hdGVyaWFsU291cmNlKGRpZmZ1c2VNYXRlcmlhbFNvdXJjZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldFNwZWN1bGFyTWF0ZXJpYWxTb3VyY2UoQ29udGV4dDo6TWF0ZXJpYWxTb3VyY2Ugc3BlY3VsYXJNYXRlcmlhbFNvdXJjZSkKKwl7CisJCWNvbnRleHQtPnNldFNwZWN1bGFyTWF0ZXJpYWxTb3VyY2Uoc3BlY3VsYXJNYXRlcmlhbFNvdXJjZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldEFtYmllbnRNYXRlcmlhbFNvdXJjZShDb250ZXh0OjpNYXRlcmlhbFNvdXJjZSBhbWJpZW50TWF0ZXJpYWxTb3VyY2UpCisJeworCQljb250ZXh0LT5zZXRBbWJpZW50TWF0ZXJpYWxTb3VyY2UoYW1iaWVudE1hdGVyaWFsU291cmNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0RW1pc3NpdmVNYXRlcmlhbFNvdXJjZShDb250ZXh0OjpNYXRlcmlhbFNvdXJjZSBlbWlzc2l2ZU1hdGVyaWFsU291cmNlKQorCXsKKwkJY29udGV4dC0+c2V0RW1pc3NpdmVNYXRlcmlhbFNvdXJjZShlbWlzc2l2ZU1hdGVyaWFsU291cmNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0R2xvYmFsQW1iaWVudChjb25zdCBDb2xvcjxmbG9hdD4gJmdsb2JhbEFtYmllbnQpCisJeworCQlmZi5nbG9iYWxBbWJpZW50WzBdID0gZ2xvYmFsQW1iaWVudC5yOworCQlmZi5nbG9iYWxBbWJpZW50WzFdID0gZ2xvYmFsQW1iaWVudC5nOworCQlmZi5nbG9iYWxBbWJpZW50WzJdID0gZ2xvYmFsQW1iaWVudC5iOworCQlmZi5nbG9iYWxBbWJpZW50WzNdID0gZ2xvYmFsQW1iaWVudC5hOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRNYXRlcmlhbEVtaXNzaW9uKGNvbnN0IENvbG9yPGZsb2F0PiAmZW1pc3Npb24pCisJeworCQlmZi5tYXRlcmlhbEVtaXNzaW9uWzBdID0gZW1pc3Npb24ucjsKKwkJZmYubWF0ZXJpYWxFbWlzc2lvblsxXSA9IGVtaXNzaW9uLmc7CisJCWZmLm1hdGVyaWFsRW1pc3Npb25bMl0gPSBlbWlzc2lvbi5iOworCQlmZi5tYXRlcmlhbEVtaXNzaW9uWzNdID0gZW1pc3Npb24uYTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0TWF0ZXJpYWxBbWJpZW50KGNvbnN0IENvbG9yPGZsb2F0PiAmbWF0ZXJpYWxBbWJpZW50KQorCXsKKwkJZmYubWF0ZXJpYWxBbWJpZW50WzBdID0gbWF0ZXJpYWxBbWJpZW50LnI7CisJCWZmLm1hdGVyaWFsQW1iaWVudFsxXSA9IG1hdGVyaWFsQW1iaWVudC5nOworCQlmZi5tYXRlcmlhbEFtYmllbnRbMl0gPSBtYXRlcmlhbEFtYmllbnQuYjsKKwkJZmYubWF0ZXJpYWxBbWJpZW50WzNdID0gbWF0ZXJpYWxBbWJpZW50LmE7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldE1hdGVyaWFsRGlmZnVzZShjb25zdCBDb2xvcjxmbG9hdD4gJmRpZmZ1c2VDb2xvcikKKwl7CisJCWZmLm1hdGVyaWFsRGlmZnVzZVswXSA9IGRpZmZ1c2VDb2xvci5yOworCQlmZi5tYXRlcmlhbERpZmZ1c2VbMV0gPSBkaWZmdXNlQ29sb3IuZzsKKwkJZmYubWF0ZXJpYWxEaWZmdXNlWzJdID0gZGlmZnVzZUNvbG9yLmI7CisJCWZmLm1hdGVyaWFsRGlmZnVzZVszXSA9IGRpZmZ1c2VDb2xvci5hOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRNYXRlcmlhbFNwZWN1bGFyKGNvbnN0IENvbG9yPGZsb2F0PiAmc3BlY3VsYXJDb2xvcikKKwl7CisJCWZmLm1hdGVyaWFsU3BlY3VsYXJbMF0gPSBzcGVjdWxhckNvbG9yLnI7CisJCWZmLm1hdGVyaWFsU3BlY3VsYXJbMV0gPSBzcGVjdWxhckNvbG9yLmc7CisJCWZmLm1hdGVyaWFsU3BlY3VsYXJbMl0gPSBzcGVjdWxhckNvbG9yLmI7CisJCWZmLm1hdGVyaWFsU3BlY3VsYXJbM10gPSBzcGVjdWxhckNvbG9yLmE7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldE1hdGVyaWFsU2hpbmluZXNzKGZsb2F0IHNwZWN1bGFyUG93ZXIpCisJeworCQlmZi5tYXRlcmlhbFNoaW5pbmVzcyA9IHNwZWN1bGFyUG93ZXI7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldExpZ2h0Vmlld1Bvc2l0aW9uKHVuc2lnbmVkIGludCBsaWdodCwgY29uc3QgUG9pbnQgJlApCisJeworCQlpZihsaWdodCA8IDgpCisJCXsKKwkJCWZmLmxpZ2h0UG9zaXRpb25bbGlnaHRdWzBdID0gUC54OworCQkJZmYubGlnaHRQb3NpdGlvbltsaWdodF1bMV0gPSBQLnk7CisJCQlmZi5saWdodFBvc2l0aW9uW2xpZ2h0XVsyXSA9IFAuejsKKwkJCWZmLmxpZ2h0UG9zaXRpb25bbGlnaHRdWzNdID0gMTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldFJhbmdlRm9nRW5hYmxlKGJvb2wgZW5hYmxlKQorCXsKKwkJY29udGV4dC0+cmFuZ2VGb2dFbmFibGUgPSBlbmFibGU7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldEluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZShib29sIGluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZSkKKwl7CisJCWNvbnRleHQtPmluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZSA9IGluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0VmVydGV4QmxlbmRNYXRyaXhDb3VudCh1bnNpZ25lZCBpbnQgdmVydGV4QmxlbmRNYXRyaXhDb3VudCkKKwl7CisJCWlmKHZlcnRleEJsZW5kTWF0cml4Q291bnQgPD0gNCkKKwkJeworCQkJY29udGV4dC0+dmVydGV4QmxlbmRNYXRyaXhDb3VudCA9IHZlcnRleEJsZW5kTWF0cml4Q291bnQ7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRUZXh0dXJlV3JhcCh1bnNpZ25lZCBpbnQgc3RhZ2UsIGludCBtYXNrKQorCXsKKwkJaWYoc3RhZ2UgPCAxNikKKwkJeworCQkJY29udGV4dC0+dGV4dHVyZVdyYXBbc3RhZ2VdID0gbWFzazsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisKKwkJY29udGV4dC0+dGV4dHVyZVdyYXBBY3RpdmUgPSBmYWxzZTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJY29udGV4dC0+dGV4dHVyZVdyYXBBY3RpdmUgfD0gKGNvbnRleHQtPnRleHR1cmVXcmFwW2ldICE9IDB4MDApOworCQl9CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldFRleEdlbih1bnNpZ25lZCBpbnQgc3RhZ2UsIENvbnRleHQ6OlRleEdlbiB0ZXhHZW4pCisJeworCQlpZihzdGFnZSA8IDgpCisJCXsKKwkJCWNvbnRleHQtPnRleEdlbltzdGFnZV0gPSB0ZXhHZW47CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRMb2NhbFZpZXdlcihib29sIGxvY2FsVmlld2VyKQorCXsKKwkJY29udGV4dC0+bG9jYWxWaWV3ZXIgPSBsb2NhbFZpZXdlcjsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0Tm9ybWFsaXplTm9ybWFscyhib29sIG5vcm1hbGl6ZU5vcm1hbHMpCisJeworCQljb250ZXh0LT5ub3JtYWxpemVOb3JtYWxzID0gbm9ybWFsaXplTm9ybWFsczsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0VGV4dHVyZU1hdHJpeChpbnQgc3RhZ2UsIGNvbnN0IE1hdHJpeCAmVCkKKwl7CisJCWZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspCisJCXsKKwkJCWZvcihpbnQgaiA9IDA7IGogPCA0OyBqKyspCisJCQl7CisJCQkJZmYudGV4dHVyZVRyYW5zZm9ybVtzdGFnZV1baV1bal0gPSBUW2ldW2pdOworCQkJfQorCQl9CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldFRleHR1cmVUcmFuc2Zvcm0oaW50IHN0YWdlLCBpbnQgY291bnQsIGJvb2wgcHJvamVjdCkKKwl7CisJCWNvbnRleHQtPnRleHR1cmVUcmFuc2Zvcm1Db3VudFtzdGFnZV0gPSBjb3VudDsKKwkJY29udGV4dC0+dGV4dHVyZVRyYW5zZm9ybVByb2plY3Rbc3RhZ2VdID0gcHJvamVjdDsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0VGV4dHVyZUZpbHRlcih1bnNpZ25lZCBpbnQgc2FtcGxlciwgRmlsdGVyVHlwZSB0ZXh0dXJlRmlsdGVyKQorCXsKKwkJaWYoc2FtcGxlciA8IDQpCisJCXsKKwkJCWNvbnRleHQtPnNhbXBsZXJbMTYgKyBzYW1wbGVyXS5zZXRUZXh0dXJlRmlsdGVyKHRleHR1cmVGaWx0ZXIpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0TWlwbWFwRmlsdGVyKHVuc2lnbmVkIGludCBzYW1wbGVyLCBNaXBtYXBUeXBlIG1pcG1hcEZpbHRlcikKKwl7CisJCWlmKHNhbXBsZXIgPCA0KQorCQl7CisJCQljb250ZXh0LT5zYW1wbGVyWzE2ICsgc2FtcGxlcl0uc2V0TWlwbWFwRmlsdGVyKG1pcG1hcEZpbHRlcik7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRHYXRoZXJFbmFibGUodW5zaWduZWQgaW50IHNhbXBsZXIsIGJvb2wgZW5hYmxlKQorCXsKKwkJaWYoc2FtcGxlciA8IDQpCisJCXsKKwkJCWNvbnRleHQtPnNhbXBsZXJbMTYgKyBzYW1wbGVyXS5zZXRHYXRoZXJFbmFibGUoZW5hYmxlKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldEFkZHJlc3NpbmdNb2RlVSh1bnNpZ25lZCBpbnQgc2FtcGxlciwgQWRkcmVzc2luZ01vZGUgYWRkcmVzc01vZGUpCisJeworCQlpZihzYW1wbGVyIDwgNCkKKwkJeworCQkJY29udGV4dC0+c2FtcGxlclsxNiArIHNhbXBsZXJdLnNldEFkZHJlc3NpbmdNb2RlVShhZGRyZXNzTW9kZSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRBZGRyZXNzaW5nTW9kZVYodW5zaWduZWQgaW50IHNhbXBsZXIsIEFkZHJlc3NpbmdNb2RlIGFkZHJlc3NNb2RlKQorCXsKKwkJaWYoc2FtcGxlciA8IDQpCisJCXsKKwkJCWNvbnRleHQtPnNhbXBsZXJbMTYgKyBzYW1wbGVyXS5zZXRBZGRyZXNzaW5nTW9kZVYoYWRkcmVzc01vZGUpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0QWRkcmVzc2luZ01vZGVXKHVuc2lnbmVkIGludCBzYW1wbGVyLCBBZGRyZXNzaW5nTW9kZSBhZGRyZXNzTW9kZSkKKwl7CisJCWlmKHNhbXBsZXIgPCA0KQorCQl7CisJCQljb250ZXh0LT5zYW1wbGVyWzE2ICsgc2FtcGxlcl0uc2V0QWRkcmVzc2luZ01vZGVXKGFkZHJlc3NNb2RlKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldFJlYWRTUkdCKHVuc2lnbmVkIGludCBzYW1wbGVyLCBib29sIHNSR0IpCisJeworCQlpZihzYW1wbGVyIDwgNCkKKwkJeworCQkJY29udGV4dC0+c2FtcGxlclsxNiArIHNhbXBsZXJdLnNldFJlYWRTUkdCKHNSR0IpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0TWlwbWFwTE9EKHVuc2lnbmVkIGludCBzYW1wbGVyLCBmbG9hdCBiaWFzKQorCXsKKwkJaWYoc2FtcGxlciA8IDQpCisJCXsKKwkJCWNvbnRleHQtPnNhbXBsZXJbMTYgKyBzYW1wbGVyXS5zZXRNaXBtYXBMT0QoYmlhcyk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRCb3JkZXJDb2xvcih1bnNpZ25lZCBpbnQgc2FtcGxlciwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZib3JkZXJDb2xvcikKKwl7CisJCWlmKHNhbXBsZXIgPCA0KQorCQl7CisJCQljb250ZXh0LT5zYW1wbGVyWzE2ICsgc2FtcGxlcl0uc2V0Qm9yZGVyQ29sb3IoYm9yZGVyQ29sb3IpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0TWF4QW5pc290cm9weSh1bnNpZ25lZCBpbnQgc2FtcGxlciwgdW5zaWduZWQgaW50IG1heEFuaXNvdHJvcHkpCisJeworCQlpZihzYW1wbGVyIDwgNCkKKwkJeworCQkJY29udGV4dC0+c2FtcGxlclsxNiArIHNhbXBsZXJdLnNldE1heEFuaXNvdHJvcHkobWF4QW5pc290cm9weSk7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRQb2ludFNpemUoZmxvYXQgcG9pbnRTaXplKQorCXsKKwkJcG9pbnQucG9pbnRTaXplID0gcmVwbGljYXRlKHBvaW50U2l6ZSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldFBvaW50U2l6ZU1pbihmbG9hdCBwb2ludFNpemVNaW4pCisJeworCQlwb2ludC5wb2ludFNpemVNaW4gPSBwb2ludFNpemVNaW47CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldFBvaW50U2l6ZU1heChmbG9hdCBwb2ludFNpemVNYXgpCisJeworCQlwb2ludC5wb2ludFNpemVNYXggPSBwb2ludFNpemVNYXg7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldFBvaW50U2NhbGVBKGZsb2F0IHBvaW50U2NhbGVBKQorCXsKKwkJcG9pbnQucG9pbnRTY2FsZUEgPSBwb2ludFNjYWxlQTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2Nlc3Nvcjo6c2V0UG9pbnRTY2FsZUIoZmxvYXQgcG9pbnRTY2FsZUIpCisJeworCQlwb2ludC5wb2ludFNjYWxlQiA9IHBvaW50U2NhbGVCOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRQb2ludFNjYWxlQyhmbG9hdCBwb2ludFNjYWxlQykKKwl7CisJCXBvaW50LnBvaW50U2NhbGVDID0gcG9pbnRTY2FsZUM7CisJfQorCisJY29uc3QgTWF0cml4ICZWZXJ0ZXhQcm9jZXNzb3I6OmdldE1vZGVsVHJhbnNmb3JtKGludCBpKQorCXsKKwkJdXBkYXRlVHJhbnNmb3JtKCk7CisJCXJldHVybiBQQlZNW2ldOworCX0KKworCWNvbnN0IE1hdHJpeCAmVmVydGV4UHJvY2Vzc29yOjpnZXRWaWV3VHJhbnNmb3JtKCkKKwl7CisJCXVwZGF0ZVRyYW5zZm9ybSgpOworCQlyZXR1cm4gUEJWOworCX0KKworCWJvb2wgVmVydGV4UHJvY2Vzc29yOjppc0ZpeGVkRnVuY3Rpb24oKQorCXsKKwkJcmV0dXJuICFjb250ZXh0LT52ZXJ0ZXhTaGFkZXI7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldFRyYW5zZm9ybShjb25zdCBNYXRyaXggJk0sIGludCBpKQorCXsKKwkJZmYudHJhbnNmb3JtVFtpXVswXVswXSA9IE1bMF1bMF07CisJCWZmLnRyYW5zZm9ybVRbaV1bMF1bMV0gPSBNWzFdWzBdOworCQlmZi50cmFuc2Zvcm1UW2ldWzBdWzJdID0gTVsyXVswXTsKKwkJZmYudHJhbnNmb3JtVFtpXVswXVszXSA9IE1bM11bMF07CisKKwkJZmYudHJhbnNmb3JtVFtpXVsxXVswXSA9IE1bMF1bMV07CisJCWZmLnRyYW5zZm9ybVRbaV1bMV1bMV0gPSBNWzFdWzFdOworCQlmZi50cmFuc2Zvcm1UW2ldWzFdWzJdID0gTVsyXVsxXTsKKwkJZmYudHJhbnNmb3JtVFtpXVsxXVszXSA9IE1bM11bMV07CisKKwkJZmYudHJhbnNmb3JtVFtpXVsyXVswXSA9IE1bMF1bMl07CisJCWZmLnRyYW5zZm9ybVRbaV1bMl1bMV0gPSBNWzFdWzJdOworCQlmZi50cmFuc2Zvcm1UW2ldWzJdWzJdID0gTVsyXVsyXTsKKwkJZmYudHJhbnNmb3JtVFtpXVsyXVszXSA9IE1bM11bMl07CisKKwkJZmYudHJhbnNmb3JtVFtpXVszXVswXSA9IE1bMF1bM107CisJCWZmLnRyYW5zZm9ybVRbaV1bM11bMV0gPSBNWzFdWzNdOworCQlmZi50cmFuc2Zvcm1UW2ldWzNdWzJdID0gTVsyXVszXTsKKwkJZmYudHJhbnNmb3JtVFtpXVszXVszXSA9IE1bM11bM107CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldENhbWVyYVRyYW5zZm9ybShjb25zdCBNYXRyaXggJk0sIGludCBpKQorCXsKKwkJZmYuY2FtZXJhVHJhbnNmb3JtVFtpXVswXVswXSA9IE1bMF1bMF07CisJCWZmLmNhbWVyYVRyYW5zZm9ybVRbaV1bMF1bMV0gPSBNWzFdWzBdOworCQlmZi5jYW1lcmFUcmFuc2Zvcm1UW2ldWzBdWzJdID0gTVsyXVswXTsKKwkJZmYuY2FtZXJhVHJhbnNmb3JtVFtpXVswXVszXSA9IE1bM11bMF07CisKKwkJZmYuY2FtZXJhVHJhbnNmb3JtVFtpXVsxXVswXSA9IE1bMF1bMV07CisJCWZmLmNhbWVyYVRyYW5zZm9ybVRbaV1bMV1bMV0gPSBNWzFdWzFdOworCQlmZi5jYW1lcmFUcmFuc2Zvcm1UW2ldWzFdWzJdID0gTVsyXVsxXTsKKwkJZmYuY2FtZXJhVHJhbnNmb3JtVFtpXVsxXVszXSA9IE1bM11bMV07CisKKwkJZmYuY2FtZXJhVHJhbnNmb3JtVFtpXVsyXVswXSA9IE1bMF1bMl07CisJCWZmLmNhbWVyYVRyYW5zZm9ybVRbaV1bMl1bMV0gPSBNWzFdWzJdOworCQlmZi5jYW1lcmFUcmFuc2Zvcm1UW2ldWzJdWzJdID0gTVsyXVsyXTsKKwkJZmYuY2FtZXJhVHJhbnNmb3JtVFtpXVsyXVszXSA9IE1bM11bMl07CisKKwkJZmYuY2FtZXJhVHJhbnNmb3JtVFtpXVszXVswXSA9IE1bMF1bM107CisJCWZmLmNhbWVyYVRyYW5zZm9ybVRbaV1bM11bMV0gPSBNWzFdWzNdOworCQlmZi5jYW1lcmFUcmFuc2Zvcm1UW2ldWzNdWzJdID0gTVsyXVszXTsKKwkJZmYuY2FtZXJhVHJhbnNmb3JtVFtpXVszXVszXSA9IE1bM11bM107CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnNldE5vcm1hbFRyYW5zZm9ybShjb25zdCBNYXRyaXggJk0sIGludCBpKQorCXsKKwkJZmYubm9ybWFsVHJhbnNmb3JtVFtpXVswXVswXSA9IE1bMF1bMF07CisJCWZmLm5vcm1hbFRyYW5zZm9ybVRbaV1bMF1bMV0gPSBNWzFdWzBdOworCQlmZi5ub3JtYWxUcmFuc2Zvcm1UW2ldWzBdWzJdID0gTVsyXVswXTsKKwkJZmYubm9ybWFsVHJhbnNmb3JtVFtpXVswXVszXSA9IE1bM11bMF07CisKKwkJZmYubm9ybWFsVHJhbnNmb3JtVFtpXVsxXVswXSA9IE1bMF1bMV07CisJCWZmLm5vcm1hbFRyYW5zZm9ybVRbaV1bMV1bMV0gPSBNWzFdWzFdOworCQlmZi5ub3JtYWxUcmFuc2Zvcm1UW2ldWzFdWzJdID0gTVsyXVsxXTsKKwkJZmYubm9ybWFsVHJhbnNmb3JtVFtpXVsxXVszXSA9IE1bM11bMV07CisKKwkJZmYubm9ybWFsVHJhbnNmb3JtVFtpXVsyXVswXSA9IE1bMF1bMl07CisJCWZmLm5vcm1hbFRyYW5zZm9ybVRbaV1bMl1bMV0gPSBNWzFdWzJdOworCQlmZi5ub3JtYWxUcmFuc2Zvcm1UW2ldWzJdWzJdID0gTVsyXVsyXTsKKwkJZmYubm9ybWFsVHJhbnNmb3JtVFtpXVsyXVszXSA9IE1bM11bMl07CisKKwkJZmYubm9ybWFsVHJhbnNmb3JtVFtpXVszXVswXSA9IE1bMF1bM107CisJCWZmLm5vcm1hbFRyYW5zZm9ybVRbaV1bM11bMV0gPSBNWzFdWzNdOworCQlmZi5ub3JtYWxUcmFuc2Zvcm1UW2ldWzNdWzJdID0gTVsyXVszXTsKKwkJZmYubm9ybWFsVHJhbnNmb3JtVFtpXVszXVszXSA9IE1bM11bM107CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9jZXNzb3I6OnVwZGF0ZVRyYW5zZm9ybSgpCisJeworCQlpZighdXBkYXRlTWF0cml4KSByZXR1cm47CisKKwkJaW50IGFjdGl2ZU1hdHJpY2VzID0gY29udGV4dC0+aW5kZXhlZFZlcnRleEJsZW5kRW5hYmxlID8gMTIgOiBtYXgoY29udGV4dC0+dmVydGV4QmxlbmRNYXRyaXhDb3VudCwgMSk7CisKKwkJaWYodXBkYXRlUHJvamVjdGlvbk1hdHJpeCkKKwkJeworCQkJUEIgPSBQICogQjsKKwkJCVBCViA9IFBCICogVjsKKwkJCQorCQkJZm9yKGludCBpID0gMDsgaSA8IGFjdGl2ZU1hdHJpY2VzOyBpKyspCisJCQl7CisJCQkJUEJWTVtpXSA9IFBCViAqIE1baV07CisJCQkJdXBkYXRlTW9kZWxNYXRyaXhbaV0gPSBmYWxzZTsKKwkJCX0KKworCQkJdXBkYXRlUHJvamVjdGlvbk1hdHJpeCA9IGZhbHNlOworCQkJdXBkYXRlQmFzZU1hdHJpeCA9IGZhbHNlOworCQkJdXBkYXRlVmlld01hdHJpeCA9IGZhbHNlOworCQl9CisKKwkJaWYodXBkYXRlQmFzZU1hdHJpeCkKKwkJeworCQkJUEIgPSBQICogQjsKKwkJCVBCViA9IFBCICogVjsKKwkJCQorCQkJZm9yKGludCBpID0gMDsgaSA8IGFjdGl2ZU1hdHJpY2VzOyBpKyspCisJCQl7CisJCQkJUEJWTVtpXSA9IFBCViAqIE1baV07CisJCQkJdXBkYXRlTW9kZWxNYXRyaXhbaV0gPSBmYWxzZTsKKwkJCX0KKworCQkJdXBkYXRlQmFzZU1hdHJpeCA9IGZhbHNlOworCQkJdXBkYXRlVmlld01hdHJpeCA9IGZhbHNlOworCQl9CisKKwkJaWYodXBkYXRlVmlld01hdHJpeCkKKwkJeworCQkJUEJWID0gUEIgKiBWOworCQkJCisJCQlmb3IoaW50IGkgPSAwOyBpIDwgYWN0aXZlTWF0cmljZXM7IGkrKykKKwkJCXsKKwkJCQlQQlZNW2ldID0gUEJWICogTVtpXTsKKwkJCQl1cGRhdGVNb2RlbE1hdHJpeFtpXSA9IGZhbHNlOworCQkJfQorCisJCQl1cGRhdGVWaWV3TWF0cml4ID0gZmFsc2U7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgYWN0aXZlTWF0cmljZXM7IGkrKykKKwkJeworCQkJaWYodXBkYXRlTW9kZWxNYXRyaXhbaV0pCisJCQl7CisJCQkJUEJWTVtpXSA9IFBCViAqIE1baV07CisJCQkJdXBkYXRlTW9kZWxNYXRyaXhbaV0gPSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCBhY3RpdmVNYXRyaWNlczsgaSsrKQorCQl7CisJCQlzZXRUcmFuc2Zvcm0oUEJWTVtpXSwgaSk7CisJCQlzZXRDYW1lcmFUcmFuc2Zvcm0oQiAqIFYgKiBNW2ldLCBpKTsKKwkJCXNldE5vcm1hbFRyYW5zZm9ybSh+IShCICogViAqIE1baV0pLCBpKTsKKwkJfQorCisJCXVwZGF0ZU1hdHJpeCA9IGZhbHNlOworCX0KKworCXZvaWQgVmVydGV4UHJvY2Vzc29yOjpzZXRSb3V0aW5lQ2FjaGVTaXplKGludCBjYWNoZVNpemUpCisJeworCQlkZWxldGUgcm91dGluZUNhY2hlOworCQlyb3V0aW5lQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8U3RhdGUsIFJvdXRpbmU+KGNsYW1wKGNhY2hlU2l6ZSwgMSwgNjU1MzYpKTsKKwl9CisKKwljb25zdCBWZXJ0ZXhQcm9jZXNzb3I6OlN0YXRlIFZlcnRleFByb2Nlc3Nvcjo6dXBkYXRlKCkKKwl7CisJCWlmKGlzRml4ZWRGdW5jdGlvbigpKQorCQl7CisJCQl1cGRhdGVUcmFuc2Zvcm0oKTsKKworCQkJaWYodXBkYXRlTGlnaHRpbmcpCisJCQl7CisJCQkJZm9yKGludCBpID0gMDsgaSA8IDg7IGkrKykKKwkJCQl7CisJCQkJCWlmKGNvbnRleHQtPnZlcnRleExpZ2h0QWN0aXZlKGkpKQorCQkJCQl7CisJCQkJCQkvLyBMaWdodCBwb3NpdGlvbiBpbiBjYW1lcmEgY29vcmRpbmF0ZXMKKwkJCQkJCXNldExpZ2h0Vmlld1Bvc2l0aW9uKGksIEIgKiBWICogY29udGV4dC0+Z2V0TGlnaHRQb3NpdGlvbihpKSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQl1cGRhdGVMaWdodGluZyA9IGZhbHNlOworCQkJfQorCQl9CisKKwkJU3RhdGUgc3RhdGU7CisKKwkJaWYoY29udGV4dC0+dmVydGV4U2hhZGVyKQorCQl7CisJCQlzdGF0ZS5zaGFkZXJIYXNoID0gY29udGV4dC0+dmVydGV4U2hhZGVyLT5nZXRIYXNoKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZS5zaGFkZXJIYXNoID0gMDsKKwkJfQorCisJCXN0YXRlLmZpeGVkRnVuY3Rpb24gPSAhY29udGV4dC0+dmVydGV4U2hhZGVyICYmIGNvbnRleHQtPnBpeGVsU2hhZGVyVmVyc2lvbigpIDwgMHgwMzAwOworCQlzdGF0ZS5zaGFkZXJDb250YWluc1RleGxkbCA9IGNvbnRleHQtPnZlcnRleFNoYWRlciA/IGNvbnRleHQtPnZlcnRleFNoYWRlci0+Y29udGFpbnNUZXhsZGwoKSA6IGZhbHNlOworCQlzdGF0ZS5wb3NpdGlvblJlZ2lzdGVyID0gY29udGV4dC0+dmVydGV4U2hhZGVyID8gY29udGV4dC0+dmVydGV4U2hhZGVyLT5wb3NpdGlvblJlZ2lzdGVyIDogUG9zOworCQlzdGF0ZS5wb2ludFNpemVSZWdpc3RlciA9IGNvbnRleHQtPnZlcnRleFNoYWRlciA/IGNvbnRleHQtPnZlcnRleFNoYWRlci0+cG9pbnRTaXplUmVnaXN0ZXIgOiBQdHM7CisJCQorCQlzdGF0ZS52ZXJ0ZXhCbGVuZE1hdHJpeENvdW50ID0gY29udGV4dC0+dmVydGV4QmxlbmRNYXRyaXhDb3VudEFjdGl2ZSgpOworCQlzdGF0ZS5pbmRleGVkVmVydGV4QmxlbmRFbmFibGUgPSBjb250ZXh0LT5pbmRleGVkVmVydGV4QmxlbmRBY3RpdmUoKTsKKwkJc3RhdGUudmVydGV4Tm9ybWFsQWN0aXZlID0gY29udGV4dC0+dmVydGV4Tm9ybWFsQWN0aXZlKCk7CisJCXN0YXRlLm5vcm1hbGl6ZU5vcm1hbHMgPSBjb250ZXh0LT5ub3JtYWxpemVOb3JtYWxzQWN0aXZlKCk7CisJCXN0YXRlLnZlcnRleExpZ2h0aW5nQWN0aXZlID0gY29udGV4dC0+dmVydGV4TGlnaHRpbmdBY3RpdmUoKTsKKwkJc3RhdGUuZGlmZnVzZUFjdGl2ZSA9IGNvbnRleHQtPmRpZmZ1c2VBY3RpdmUoKTsKKwkJc3RhdGUuc3BlY3VsYXJBY3RpdmUgPSBjb250ZXh0LT5zcGVjdWxhckFjdGl2ZSgpOworCQlzdGF0ZS52ZXJ0ZXhTcGVjdWxhckFjdGl2ZSA9IGNvbnRleHQtPnZlcnRleFNwZWN1bGFyQWN0aXZlKCk7CisKKwkJc3RhdGUudmVydGV4TGlnaHRBY3RpdmUgPSBjb250ZXh0LT52ZXJ0ZXhMaWdodEFjdGl2ZSgwKSA8PCAwIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT52ZXJ0ZXhMaWdodEFjdGl2ZSgxKSA8PCAxIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT52ZXJ0ZXhMaWdodEFjdGl2ZSgyKSA8PCAyIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT52ZXJ0ZXhMaWdodEFjdGl2ZSgzKSA8PCAzIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT52ZXJ0ZXhMaWdodEFjdGl2ZSg0KSA8PCA0IHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT52ZXJ0ZXhMaWdodEFjdGl2ZSg1KSA8PCA1IHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT52ZXJ0ZXhMaWdodEFjdGl2ZSg2KSA8PCA2IHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT52ZXJ0ZXhMaWdodEFjdGl2ZSg3KSA8PCA3OworCisJCXN0YXRlLnZlcnRleERpZmZ1c2VNYXRlcmlhbFNvdXJjZUFjdGl2ZSA9IGNvbnRleHQtPnZlcnRleERpZmZ1c2VNYXRlcmlhbFNvdXJjZUFjdGl2ZSgpOworCQlzdGF0ZS52ZXJ0ZXhTcGVjdWxhck1hdGVyaWFsU291cmNlQWN0aXZlID0gY29udGV4dC0+dmVydGV4U3BlY3VsYXJNYXRlcmlhbFNvdXJjZUFjdGl2ZSgpOworCQlzdGF0ZS52ZXJ0ZXhBbWJpZW50TWF0ZXJpYWxTb3VyY2VBY3RpdmUgPSBjb250ZXh0LT52ZXJ0ZXhBbWJpZW50TWF0ZXJpYWxTb3VyY2VBY3RpdmUoKTsKKwkJc3RhdGUudmVydGV4RW1pc3NpdmVNYXRlcmlhbFNvdXJjZUFjdGl2ZSA9IGNvbnRleHQtPnZlcnRleEVtaXNzaXZlTWF0ZXJpYWxTb3VyY2VBY3RpdmUoKTsKKwkJc3RhdGUuZm9nQWN0aXZlID0gY29udGV4dC0+Zm9nQWN0aXZlKCk7CisJCXN0YXRlLnZlcnRleEZvZ01vZGUgPSBjb250ZXh0LT52ZXJ0ZXhGb2dNb2RlQWN0aXZlKCk7CisJCXN0YXRlLnJhbmdlRm9nQWN0aXZlID0gY29udGV4dC0+cmFuZ2VGb2dBY3RpdmUoKTsKKwkJc3RhdGUubG9jYWxWaWV3ZXJBY3RpdmUgPSBjb250ZXh0LT5sb2NhbFZpZXdlckFjdGl2ZSgpOworCQlzdGF0ZS5wb2ludFNpemVBY3RpdmUgPSBjb250ZXh0LT5wb2ludFNpemVBY3RpdmUoKTsKKwkJc3RhdGUucG9pbnRTY2FsZUFjdGl2ZSA9IGNvbnRleHQtPnBvaW50U2NhbGVBY3RpdmUoKTsKKworCQlzdGF0ZS5wcmVUcmFuc2Zvcm1lZCA9IGNvbnRleHQtPnByZVRyYW5zZm9ybWVkOworCQlzdGF0ZS5wb3N0VHJhbnNmb3JtID0gY29udGV4dC0+cG9zdFRyYW5zZm9ybTsKKwkJc3RhdGUuc3VwZXJTYW1wbGluZyA9IGNvbnRleHQtPnJlbmRlclRhcmdldFswXS0+Z2V0U3VwZXJTYW1wbGVDb3VudCgpID4gMTsKKwkJc3RhdGUubXVsdGlTYW1wbGluZyA9IGNvbnRleHQtPnJlbmRlclRhcmdldFswXS0+Z2V0TXVsdGlTYW1wbGVDb3VudCgpID4gMTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJc3RhdGUuaW5wdXRbaV0udHlwZSA9IGNvbnRleHQtPmlucHV0W2ldLnR5cGU7CisJCQlzdGF0ZS5pbnB1dFtpXS5jb3VudCA9IGNvbnRleHQtPmlucHV0W2ldLmNvdW50OworCQkJc3RhdGUuaW5wdXRbaV0ubm9ybWFsaXplZCA9IGNvbnRleHQtPmlucHV0W2ldLm5vcm1hbGl6ZWQ7CisJCX0KKworCQlpZighY29udGV4dC0+dmVydGV4U2hhZGVyKQorCQl7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKQorCQkJeworCQkJLy8Jc3RhdGUudGV4dHVyZVN0YXRlW2ldLnZlcnRleFRleHR1cmVBY3RpdmUgPSBjb250ZXh0LT52ZXJ0ZXhUZXh0dXJlQWN0aXZlKGksIDApOworCQkJCXN0YXRlLnRleHR1cmVTdGF0ZVtpXS50ZXhHZW5BY3RpdmUgPSBjb250ZXh0LT50ZXhHZW5BY3RpdmUoaSk7CisJCQkJc3RhdGUudGV4dHVyZVN0YXRlW2ldLnRleHR1cmVUcmFuc2Zvcm1Db3VudEFjdGl2ZSA9IGNvbnRleHQtPnRleHR1cmVUcmFuc2Zvcm1Db3VudEFjdGl2ZShpKTsKKwkJCQlzdGF0ZS50ZXh0dXJlU3RhdGVbaV0udGV4Q29vcmRJbmRleEFjdGl2ZSA9IGNvbnRleHQtPnRleENvb3JkSW5kZXhBY3RpdmUoaSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJeworCQkJCWlmKGNvbnRleHQtPnZlcnRleFNoYWRlci0+dXNlc1NhbXBsZXIoaSkpCisJCQkJeworCQkJCQlzdGF0ZS5zYW1wbGVyU3RhdGVbaV0gPSBjb250ZXh0LT5zYW1wbGVyWzE2ICsgaV0uc2FtcGxlclN0YXRlKCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoY29udGV4dC0+dmVydGV4U2hhZGVyKSAgIC8vIEZJWE1FOiBBbHNvIHdoZW4gcHJlLXRyYW5zZm9ybWVkPworCQl7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgMTI7IGkrKykKKwkJCXsKKwkJCQlzdGF0ZS5vdXRwdXRbaV0ueFdyaXRlID0gY29udGV4dC0+dmVydGV4U2hhZGVyLT5vdXRwdXRbaV1bMF0uYWN0aXZlKCk7CisJCQkJc3RhdGUub3V0cHV0W2ldLnlXcml0ZSA9IGNvbnRleHQtPnZlcnRleFNoYWRlci0+b3V0cHV0W2ldWzFdLmFjdGl2ZSgpOworCQkJCXN0YXRlLm91dHB1dFtpXS56V3JpdGUgPSBjb250ZXh0LT52ZXJ0ZXhTaGFkZXItPm91dHB1dFtpXVsyXS5hY3RpdmUoKTsKKwkJCQlzdGF0ZS5vdXRwdXRbaV0ud1dyaXRlID0gY29udGV4dC0+dmVydGV4U2hhZGVyLT5vdXRwdXRbaV1bM10uYWN0aXZlKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZighY29udGV4dC0+cHJlVHJhbnNmb3JtZWQgfHwgY29udGV4dC0+cGl4ZWxTaGFkZXJWZXJzaW9uKCkgPCAweDAzMDApCisJCXsKKwkJCXN0YXRlLm91dHB1dFtQb3NdLndyaXRlID0gMHhGOworCisJCQlpZihjb250ZXh0LT5kaWZmdXNlQWN0aXZlKCkgJiYgKGNvbnRleHQtPmxpZ2h0aW5nRW5hYmxlIHx8IGNvbnRleHQtPmlucHV0W0NvbG9yMF0pKQorCQkJeworCQkJCXN0YXRlLm91dHB1dFtEMF0ud3JpdGUgPSAweEY7CisJCQl9CisJCQkKKwkJCWlmKGNvbnRleHQtPnNwZWN1bGFyQWN0aXZlKCkpCisJCQl7CisJCQkJc3RhdGUub3V0cHV0W0QxXS53cml0ZSA9IDB4RjsKKwkJCX0KKworCQkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKKwkJCXsKKwkJCQlpZihjb250ZXh0LT52ZXJ0ZXhUZXh0dXJlQWN0aXZlKHN0YWdlLCAwKSkgc3RhdGUub3V0cHV0W1QwICsgc3RhZ2VdLndyaXRlIHw9IDB4MDE7CisJCQkJaWYoY29udGV4dC0+dmVydGV4VGV4dHVyZUFjdGl2ZShzdGFnZSwgMSkpIHN0YXRlLm91dHB1dFtUMCArIHN0YWdlXS53cml0ZSB8PSAweDAyOworCQkJCWlmKGNvbnRleHQtPnZlcnRleFRleHR1cmVBY3RpdmUoc3RhZ2UsIDIpKSBzdGF0ZS5vdXRwdXRbVDAgKyBzdGFnZV0ud3JpdGUgfD0gMHgwNDsKKwkJCQlpZihjb250ZXh0LT52ZXJ0ZXhUZXh0dXJlQWN0aXZlKHN0YWdlLCAzKSkgc3RhdGUub3V0cHV0W1QwICsgc3RhZ2VdLndyaXRlIHw9IDB4MDg7CisJCQl9CisKKwkJCWlmKGNvbnRleHQtPmZvZ0FjdGl2ZSgpKQorCQkJeworCQkJCXN0YXRlLm91dHB1dFtGb2ddLnhXcml0ZSA9IHRydWU7CisJCQl9CisKKwkJCWlmKGNvbnRleHQtPnBvaW50U2l6ZUFjdGl2ZSgpKQorCQkJeworCQkJCXN0YXRlLm91dHB1dFtQdHNdLnlXcml0ZSA9IHRydWU7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZS5vdXRwdXRbUG9zXS53cml0ZSA9IDB4RjsKKworCQkJZm9yKGludCBpID0gMDsgaSA8IDI7IGkrKykKKwkJCXsKKwkJCQlpZihjb250ZXh0LT5pbnB1dFtDb2xvcjAgKyBpXSkKKwkJCQl7CisJCQkJCXN0YXRlLm91dHB1dFtEMCArIGldLndyaXRlID0gMHhGOworCQkJCX0KKwkJCX0KKworCQkJZm9yKGludCBpID0gMDsgaSA8IDg7IGkrKykKKwkJCXsKKwkJCQlpZihjb250ZXh0LT5pbnB1dFtUZXhDb29yZDAgKyBpXSkKKwkJCQl7CisJCQkJCXN0YXRlLm91dHB1dFtUMCArIGldLndyaXRlID0gMHhGOworCQkJCX0KKwkJCX0KKworCQkJaWYoY29udGV4dC0+aW5wdXRbUFNpemVdKQorCQkJeworCQkJCXN0YXRlLm91dHB1dFtQdHNdLnlXcml0ZSA9IHRydWU7CisJCQl9CisJCX0KKworCQlpZihjb250ZXh0LT52ZXJ0ZXhTaGFkZXJWZXJzaW9uKCkgPCAweDAzMDApCisJCXsKKwkJCXN0YXRlLm91dHB1dFtEMF0uY2xhbXAgPSAweEY7CisJCQlzdGF0ZS5vdXRwdXRbRDFdLmNsYW1wID0gMHhGOworCQkJc3RhdGUub3V0cHV0W0ZvZ10ueENsYW1wID0gdHJ1ZTsKKwkJfQorCisJCXN0YXRlLmhhc2ggPSBzdGF0ZS5jb21wdXRlSGFzaCgpOworCisJCXJldHVybiBzdGF0ZTsKKwl9CisKKwlSb3V0aW5lICpWZXJ0ZXhQcm9jZXNzb3I6OnJvdXRpbmUoY29uc3QgU3RhdGUgJnN0YXRlKQorCXsKKwkJUm91dGluZSAqcm91dGluZSA9IHJvdXRpbmVDYWNoZS0+cXVlcnkoc3RhdGUpOworCisJCWlmKCFyb3V0aW5lKSAgIC8vIENyZWF0ZSBvbmUKKwkJeworCQkJVmVydGV4Um91dGluZSAqZ2VuZXJhdG9yID0gMDsKKworCQkJaWYoc3RhdGUuZml4ZWRGdW5jdGlvbikKKwkJCXsKKwkJCQlnZW5lcmF0b3IgPSBuZXcgVmVydGV4UGlwZWxpbmUoc3RhdGUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWdlbmVyYXRvciA9IG5ldyBWZXJ0ZXhQcm9ncmFtKHN0YXRlLCBjb250ZXh0LT52ZXJ0ZXhTaGFkZXIpOworCQkJfQorCisJCQlnZW5lcmF0b3ItPmdlbmVyYXRlKCk7CisJCQlyb3V0aW5lID0gZ2VuZXJhdG9yLT5nZXRSb3V0aW5lKCk7CisJCQlkZWxldGUgZ2VuZXJhdG9yOworCisJCQlyb3V0aW5lQ2FjaGUtPmFkZChzdGF0ZSwgcm91dGluZSk7CisJCX0KKworCQlyZXR1cm4gcm91dGluZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvUmVuZGVyZXIvVmVydGV4UHJvY2Vzc29yLmhwcCBiL3NyYy9SZW5kZXJlci9WZXJ0ZXhQcm9jZXNzb3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzhkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVuZGVyZXIvVmVydGV4UHJvY2Vzc29yLmhwcApAQCAtMCwwICsxLDMxMyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIHN3X1ZlcnRleFByb2Nlc3Nvcl9ocHAKKyNkZWZpbmUgc3dfVmVydGV4UHJvY2Vzc29yX2hwcAorCisjaW5jbHVkZSAiTWF0cml4LmhwcCIKKyNpbmNsdWRlICJDb250ZXh0LmhwcCIKKyNpbmNsdWRlICJMUlVDYWNoZS5ocHAiCisKK25hbWVzcGFjZSBzdworeworCWNsYXNzIFZpZXdwb3J0OworCWNsYXNzIFJvdXRpbmU7CisJc3RydWN0IERyYXdEYXRhOworCisJc3RydWN0IFZlcnRleENhY2hlICAgLy8gRklYTUU6IFZhcmlhYmxlIHNpemUKKwl7CisJCXZvaWQgY2xlYXIoKTsKKworCQlWZXJ0ZXggdmVydGV4WzE2XVs0XTsKKwkJdW5zaWduZWQgaW50IHRhZ1sxNl07CisKKwkJaW50IGRyYXdDYWxsOworCX07CisKKwlzdHJ1Y3QgVmVydGV4VGFzaworCXsKKwkJdW5zaWduZWQgaW50IGNvdW50OworCQlWZXJ0ZXhDYWNoZSB2ZXJ0ZXhDYWNoZTsKKwl9OworCisJY2xhc3MgVmVydGV4UHJvY2Vzc29yCisJeworCXB1YmxpYzoKKwkJc3RydWN0IFN0YXRlcworCQl7CisJCQl1bnNpZ25lZCBpbnQgY29tcHV0ZUhhc2goKTsKKworCQkJdWludDY0X3Qgc2hhZGVySGFzaDsKKworCQkJdW5zaWduZWQgaW50IGZpeGVkRnVuY3Rpb24JCQkJCQk6IDE7CisJCQl1bnNpZ25lZCBpbnQgc2hhZGVyQ29udGFpbnNUZXhsZGwJCQkJOiAxOworCQkJdW5zaWduZWQgaW50IHBvc2l0aW9uUmVnaXN0ZXIJCQkJCTogNDsKKwkJCXVuc2lnbmVkIGludCBwb2ludFNpemVSZWdpc3RlcgkJCQkJOiA0OyAgIC8vIDB4RiBzaWduaWZpZXMgbm8gdmVydGV4IHBvaW50IHNpemUKKwkJCQkKKwkJCXVuc2lnbmVkIGludCB2ZXJ0ZXhCbGVuZE1hdHJpeENvdW50CQkJCTogMzsKKwkJCXVuc2lnbmVkIGludCBpbmRleGVkVmVydGV4QmxlbmRFbmFibGUJCQk6IDE7CisJCQl1bnNpZ25lZCBpbnQgdmVydGV4Tm9ybWFsQWN0aXZlCQkJCQk6IDE7CisJCQl1bnNpZ25lZCBpbnQgbm9ybWFsaXplTm9ybWFscwkJCQkJOiAxOworCQkJdW5zaWduZWQgaW50IHZlcnRleExpZ2h0aW5nQWN0aXZlCQkJCTogMTsKKwkJCXVuc2lnbmVkIGludCBkaWZmdXNlQWN0aXZlCQkJCQkJOiAxOworCQkJdW5zaWduZWQgaW50IHNwZWN1bGFyQWN0aXZlCQkJCQkJOiAxOworCQkJdW5zaWduZWQgaW50IHZlcnRleFNwZWN1bGFyQWN0aXZlCQkJCTogMTsKKwkJCXVuc2lnbmVkIGludCB2ZXJ0ZXhMaWdodEFjdGl2ZQkJCQkJOiA4OworCQkJdW5zaWduZWQgaW50IHZlcnRleERpZmZ1c2VNYXRlcmlhbFNvdXJjZUFjdGl2ZQk6IEJJVFMoQ29udGV4dDo6TUFURVJJQUxfTEFTVCk7CisJCQl1bnNpZ25lZCBpbnQgdmVydGV4U3BlY3VsYXJNYXRlcmlhbFNvdXJjZUFjdGl2ZQk6IEJJVFMoQ29udGV4dDo6TUFURVJJQUxfTEFTVCk7CisJCQl1bnNpZ25lZCBpbnQgdmVydGV4QW1iaWVudE1hdGVyaWFsU291cmNlQWN0aXZlCTogQklUUyhDb250ZXh0OjpNQVRFUklBTF9MQVNUKTsKKwkJCXVuc2lnbmVkIGludCB2ZXJ0ZXhFbWlzc2l2ZU1hdGVyaWFsU291cmNlQWN0aXZlCTogQklUUyhDb250ZXh0OjpNQVRFUklBTF9MQVNUKTsKKwkJCXVuc2lnbmVkIGludCBmb2dBY3RpdmUJCQkJCQkJOiAxOworCQkJdW5zaWduZWQgaW50IHZlcnRleEZvZ01vZGUJCQkJCQk6IEJJVFMoQ29udGV4dDo6Rk9HX0xBU1QpOworCQkJdW5zaWduZWQgaW50IHJhbmdlRm9nQWN0aXZlCQkJCQkJOiAxOworCQkJdW5zaWduZWQgaW50IGxvY2FsVmlld2VyQWN0aXZlCQkJCQk6IDE7CisJCQl1bnNpZ25lZCBpbnQgcG9pbnRTaXplQWN0aXZlCQkJCQk6IDE7CisJCQl1bnNpZ25lZCBpbnQgcG9pbnRTY2FsZUFjdGl2ZQkJCQkJOiAxOworCisJCQl1bnNpZ25lZCBpbnQgcHJlVHJhbnNmb3JtZWQJCQkJCQk6IDE7CisJCQl1bnNpZ25lZCBpbnQgcG9zdFRyYW5zZm9ybQkJCQkJCTogMTsKKwkJCXVuc2lnbmVkIGludCBzdXBlclNhbXBsaW5nCQkJCQkJOiAxOworCQkJdW5zaWduZWQgaW50IG11bHRpU2FtcGxpbmcJCQkJCQk6IDE7CisKKwkJCXN0cnVjdCBUZXh0dXJlU3RhdGUKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyIHRleEdlbkFjdGl2ZSA6IEJJVFMoQ29udGV4dDo6VEVYR0VOX0xBU1QpOworCQkJCXVuc2lnbmVkIGNoYXIgdGV4dHVyZVRyYW5zZm9ybUNvdW50QWN0aXZlIDogMzsKKwkJCQl1bnNpZ25lZCBjaGFyIHRleENvb3JkSW5kZXhBY3RpdmUgOiAzOworCQkJfTsKKworCQkJVGV4dHVyZVN0YXRlIHRleHR1cmVTdGF0ZVs4XTsKKworCQkJU2FtcGxlcjo6U3RhdGUgc2FtcGxlclN0YXRlWzRdOworCisJCQlzdHJ1Y3QgSW5wdXQKKwkJCXsKKwkJCQlvcGVyYXRvciBib29sKCkgY29uc3QgICAvLyBSZXR1cm5zIHRydWUgaWYgc3RyZWFtIGNvbnRhaW5zIGRhdGEKKwkJCQl7CisJCQkJCXJldHVybiBjb3VudCAhPSAwOworCQkJCX0KKworCQkJCXVuc2lnbmVkIGludCB0eXBlICAgICAgIDogQklUUyhTVFJFQU1UWVBFX0xBU1QpOworCQkJCXVuc2lnbmVkIGludCBjb3VudCAgICAgIDogMzsKKwkJCQl1bnNpZ25lZCBpbnQgbm9ybWFsaXplZCA6IDE7CisJCQl9OworCisJCQlzdHJ1Y3QgT3V0cHV0CisJCQl7CisJCQkJdW5pb24KKwkJCQl7CisJCQkJCXVuc2lnbmVkIGNoYXIgd3JpdGUgOiA0OworCisJCQkJCXN0cnVjdAorCQkJCQl7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHhXcml0ZSA6IDE7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHlXcml0ZSA6IDE7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHpXcml0ZSA6IDE7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHdXcml0ZSA6IDE7CisJCQkJCX07CisJCQkJfTsKKworCQkJCXVuaW9uCisJCQkJeworCQkJCQl1bnNpZ25lZCBjaGFyIGNsYW1wIDogNDsKKwkJCQkJCisJCQkJCXN0cnVjdAorCQkJCQl7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHhDbGFtcCA6IDE7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHlDbGFtcCA6IDE7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHpDbGFtcCA6IDE7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHdDbGFtcCA6IDE7CisJCQkJCX07CisJCQkJfTsKKwkJCX07CisKKwkJCUlucHV0IGlucHV0WzE2XTsKKwkJCU91dHB1dCBvdXRwdXRbMTJdOworCQl9OworCisJCXN0cnVjdCBTdGF0ZSA6IFN0YXRlcworCQl7CisJCQlTdGF0ZSgpOworCisJCQlib29sIG9wZXJhdG9yPT0oY29uc3QgU3RhdGUgJnN0YXRlKSBjb25zdDsKKworCQkJdW5zaWduZWQgaW50IGhhc2g7CisJCX07CisKKwkJc3RydWN0IEZpeGVkRnVuY3Rpb24KKwkJeworCQkJZmxvYXQ0IHRyYW5zZm9ybVRbMTJdWzRdOworCQkJZmxvYXQ0IGNhbWVyYVRyYW5zZm9ybVRbMTJdWzRdOworCQkJZmxvYXQ0IG5vcm1hbFRyYW5zZm9ybVRbMTJdWzRdOworCQkJZmxvYXQ0IHRleHR1cmVUcmFuc2Zvcm1bOF1bNF07CisJCQkKKwkJCWZsb2F0NCBsaWdodFBvc2l0aW9uWzhdOworCQkJZmxvYXQ0IGxpZ2h0QW1iaWVudFs4XTsKKwkJCWZsb2F0NCBsaWdodFNwZWN1bGFyWzhdOworCQkJZmxvYXQ0IGxpZ2h0RGlmZnVzZVs4XTsKKwkJCWZsb2F0NCBhdHRlbnVhdGlvbkNvbnN0YW50WzhdOworCQkJZmxvYXQ0IGF0dGVudWF0aW9uTGluZWFyWzhdOworCQkJZmxvYXQ0IGF0dGVudWF0aW9uUXVhZHJhdGljWzhdOworCQkJZmxvYXQgbGlnaHRSYW5nZVs4XTsKKwkJCWZsb2F0NCBtYXRlcmlhbERpZmZ1c2U7CisJCQlmbG9hdDQgbWF0ZXJpYWxTcGVjdWxhcjsKKwkJCWZsb2F0IG1hdGVyaWFsU2hpbmluZXNzOworCQkJZmxvYXQ0IGdsb2JhbEFtYmllbnQ7CisJCQlmbG9hdDQgbWF0ZXJpYWxFbWlzc2lvbjsKKwkJCWZsb2F0NCBtYXRlcmlhbEFtYmllbnQ7CisJCX07CisKKwkJc3RydWN0IFBvaW50U3ByaXRlCisJCXsKKwkJCWZsb2F0NCBwb2ludFNpemU7CisJCQlmbG9hdCBwb2ludFNpemVNaW47CisJCQlmbG9hdCBwb2ludFNpemVNYXg7CisJCQlmbG9hdCBwb2ludFNjYWxlQTsKKwkJCWZsb2F0IHBvaW50U2NhbGVCOworCQkJZmxvYXQgcG9pbnRTY2FsZUM7CisJCX07CisKKwkJdHlwZWRlZiB2b2lkIChfX2NkZWNsICpSb3V0aW5lUG9pbnRlcikoVmVydGV4ICpvdXRwdXQsIHVuc2lnbmVkIGludCAqYmF0Y2gsIFZlcnRleFRhc2sgKnZlcnRleFRhc2ssIERyYXdEYXRhICpkcmF3KTsKKworCQlWZXJ0ZXhQcm9jZXNzb3IoQ29udGV4dCAqY29udGV4dCk7CisKKwkJdmlydHVhbCB+VmVydGV4UHJvY2Vzc29yKCk7CisKKwkJdmlydHVhbCB2b2lkIHNldElucHV0U3RyZWFtKGludCBpbmRleCwgY29uc3QgU3RyZWFtICZzdHJlYW0pOworCisJCXZpcnR1YWwgdm9pZCBzZXRJbnB1dFBvc2l0aW9uU3RyZWFtKGNvbnN0IFN0cmVhbSAmc3RyZWFtKTsKKwkJdmlydHVhbCB2b2lkIHNldElucHV0QmxlbmRXZWlnaHRTdHJlYW0oY29uc3QgU3RyZWFtICZzdHJlYW0pOworCQl2aXJ0dWFsIHZvaWQgc2V0SW5wdXRCbGVuZEluZGljZXNTdHJlYW0oY29uc3QgU3RyZWFtICZzdHJlYW0pOworCQl2aXJ0dWFsIHZvaWQgc2V0SW5wdXROb3JtYWxTdHJlYW0oY29uc3QgU3RyZWFtICZzdHJlYW0pOworCQl2aXJ0dWFsIHZvaWQgc2V0SW5wdXRQU2l6ZVN0cmVhbShjb25zdCBTdHJlYW0gJnN0cmVhbSk7CisJCXZpcnR1YWwgdm9pZCBzZXRJbnB1dFRleENvb3JkU3RyZWFtKGNvbnN0IFN0cmVhbSAmc3RyZWFtLCBpbnQgaW5kZXgpOworCQl2aXJ0dWFsIHZvaWQgc2V0SW5wdXRQb3NpdGlvbnRTdHJlYW0oY29uc3QgU3RyZWFtICZzdHJlYW0pOworCQl2aXJ0dWFsIHZvaWQgc2V0SW5wdXRDb2xvclN0cmVhbShjb25zdCBTdHJlYW0gJnN0cmVhbSwgaW50IGluZGV4KTsKKworCQl2aXJ0dWFsIHZvaWQgcmVzZXRJbnB1dFN0cmVhbXMoYm9vbCBwcmVUcmFuc2Zvcm1lZCk7CisKKwkJdmlydHVhbCB2b2lkIHNldEZsb2F0Q29uc3RhbnQodW5zaWduZWQgaW50IGluZGV4LCBjb25zdCBmbG9hdCB2YWx1ZVs0XSk7CisJCXZpcnR1YWwgdm9pZCBzZXRJbnRlZ2VyQ29uc3RhbnQodW5zaWduZWQgaW50IGluZGV4LCBjb25zdCBpbnQgaW50ZWdlcls0XSk7CisJCXZpcnR1YWwgdm9pZCBzZXRCb29sZWFuQ29uc3RhbnQodW5zaWduZWQgaW50IGluZGV4LCBpbnQgYm9vbGVhbik7CisKKwkJLy8gVHJhbnNmb3JtYXRpb25zCisJCXZpcnR1YWwgdm9pZCBzZXRNb2RlbE1hdHJpeChjb25zdCBNYXRyaXggJk0sIGludCBpID0gMCk7CisJCXZpcnR1YWwgdm9pZCBzZXRWaWV3TWF0cml4KGNvbnN0IE1hdHJpeCAmVik7CisJCXZpcnR1YWwgdm9pZCBzZXRCYXNlTWF0cml4KGNvbnN0IE1hdHJpeCAmQik7CisJCXZpcnR1YWwgdm9pZCBzZXRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IE1hdHJpeCAmUCk7CisKKwkJLy8gTGlnaHRpbmcKKwkJdmlydHVhbCB2b2lkIHNldExpZ2h0aW5nRW5hYmxlKGJvb2wgbGlnaHRpbmdFbmFibGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0TGlnaHRFbmFibGUodW5zaWduZWQgaW50IGxpZ2h0LCBib29sIGxpZ2h0RW5hYmxlKTsKKwkJdmlydHVhbCB2b2lkIHNldFNwZWN1bGFyRW5hYmxlKGJvb2wgc3BlY3VsYXJFbmFibGUpOworCisJCXZpcnR1YWwgdm9pZCBzZXRHbG9iYWxBbWJpZW50KGNvbnN0IENvbG9yPGZsb2F0PiAmZ2xvYmFsQW1iaWVudCk7CisJCXZpcnR1YWwgdm9pZCBzZXRMaWdodFBvc2l0aW9uKHVuc2lnbmVkIGludCBsaWdodCwgY29uc3QgUG9pbnQgJmxpZ2h0UG9zaXRpb24pOworCQl2aXJ0dWFsIHZvaWQgc2V0TGlnaHRWaWV3UG9zaXRpb24odW5zaWduZWQgaW50IGxpZ2h0LCBjb25zdCBQb2ludCAmbGlnaHRQb3NpdGlvbik7CisJCXZpcnR1YWwgdm9pZCBzZXRMaWdodERpZmZ1c2UodW5zaWduZWQgaW50IGxpZ2h0LCBjb25zdCBDb2xvcjxmbG9hdD4gJmxpZ2h0RGlmZnVzZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRMaWdodFNwZWN1bGFyKHVuc2lnbmVkIGludCBsaWdodCwgY29uc3QgQ29sb3I8ZmxvYXQ+ICZsaWdodFNwZWN1bGFyKTsKKwkJdmlydHVhbCB2b2lkIHNldExpZ2h0QW1iaWVudCh1bnNpZ25lZCBpbnQgbGlnaHQsIGNvbnN0IENvbG9yPGZsb2F0PiAmbGlnaHRBbWJpZW50KTsKKwkJdmlydHVhbCB2b2lkIHNldExpZ2h0QXR0ZW51YXRpb24odW5zaWduZWQgaW50IGxpZ2h0LCBmbG9hdCBjb25zdGFudCwgZmxvYXQgbGluZWFyLCBmbG9hdCBxdWFkcmF0aWMpOworCQl2aXJ0dWFsIHZvaWQgc2V0TGlnaHRSYW5nZSh1bnNpZ25lZCBpbnQgbGlnaHQsIGZsb2F0IGxpZ2h0UmFuZ2UpOworCisJCXZpcnR1YWwgdm9pZCBzZXRGb2dFbmFibGUoYm9vbCBmb2dFbmFibGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0VmVydGV4Rm9nTW9kZShDb250ZXh0OjpGb2dNb2RlIGZvZ01vZGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0UmFuZ2VGb2dFbmFibGUoYm9vbCBlbmFibGUpOworCisJCXZpcnR1YWwgdm9pZCBzZXRDb2xvclZlcnRleEVuYWJsZShib29sIGNvbG9yVmVydGV4RW5hYmxlKTsKKwkJdmlydHVhbCB2b2lkIHNldERpZmZ1c2VNYXRlcmlhbFNvdXJjZShDb250ZXh0OjpNYXRlcmlhbFNvdXJjZSBkaWZmdXNlTWF0ZXJpYWxTb3VyY2UpOworCQl2aXJ0dWFsIHZvaWQgc2V0U3BlY3VsYXJNYXRlcmlhbFNvdXJjZShDb250ZXh0OjpNYXRlcmlhbFNvdXJjZSBzcGVjdWxhck1hdGVyaWFsU291cmNlKTsKKwkJdmlydHVhbCB2b2lkIHNldEFtYmllbnRNYXRlcmlhbFNvdXJjZShDb250ZXh0OjpNYXRlcmlhbFNvdXJjZSBhbWJpZW50TWF0ZXJpYWxTb3VyY2UpOworCQl2aXJ0dWFsIHZvaWQgc2V0RW1pc3NpdmVNYXRlcmlhbFNvdXJjZShDb250ZXh0OjpNYXRlcmlhbFNvdXJjZSBlbWlzc2l2ZU1hdGVyaWFsU291cmNlKTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0TWF0ZXJpYWxFbWlzc2lvbihjb25zdCBDb2xvcjxmbG9hdD4gJmVtaXNzaW9uKTsKKwkJdmlydHVhbCB2b2lkIHNldE1hdGVyaWFsQW1iaWVudChjb25zdCBDb2xvcjxmbG9hdD4gJm1hdGVyaWFsQW1iaWVudCk7CisJCXZpcnR1YWwgdm9pZCBzZXRNYXRlcmlhbERpZmZ1c2UoY29uc3QgQ29sb3I8ZmxvYXQ+ICZkaWZmdXNlQ29sb3IpOworCQl2aXJ0dWFsIHZvaWQgc2V0TWF0ZXJpYWxTcGVjdWxhcihjb25zdCBDb2xvcjxmbG9hdD4gJnNwZWN1bGFyQ29sb3IpOworCQl2aXJ0dWFsIHZvaWQgc2V0TWF0ZXJpYWxTaGluaW5lc3MoZmxvYXQgc3BlY3VsYXJQb3dlcik7CisKKwkJdmlydHVhbCB2b2lkIHNldEluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZShib29sIGluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRWZXJ0ZXhCbGVuZE1hdHJpeENvdW50KHVuc2lnbmVkIGludCB2ZXJ0ZXhCbGVuZE1hdHJpeENvdW50KTsKKworCQl2aXJ0dWFsIHZvaWQgc2V0VGV4dHVyZVdyYXAodW5zaWduZWQgaW50IHN0YWdlLCBpbnQgbWFzayk7CisJCXZpcnR1YWwgdm9pZCBzZXRUZXhHZW4odW5zaWduZWQgaW50IHN0YWdlLCBDb250ZXh0OjpUZXhHZW4gdGV4R2VuKTsKKwkJdmlydHVhbCB2b2lkIHNldExvY2FsVmlld2VyKGJvb2wgbG9jYWxWaWV3ZXIpOworCQl2aXJ0dWFsIHZvaWQgc2V0Tm9ybWFsaXplTm9ybWFscyhib29sIG5vcm1hbGl6ZU5vcm1hbHMpOworCQl2aXJ0dWFsIHZvaWQgc2V0VGV4dHVyZU1hdHJpeChpbnQgc3RhZ2UsIGNvbnN0IE1hdHJpeCAmVCk7CisJCXZpcnR1YWwgdm9pZCBzZXRUZXh0dXJlVHJhbnNmb3JtKGludCBzdGFnZSwgaW50IGNvdW50LCBib29sIHByb2plY3QpOworCisJCXZpcnR1YWwgdm9pZCBzZXRUZXh0dXJlRmlsdGVyKHVuc2lnbmVkIGludCBzYW1wbGVyLCBGaWx0ZXJUeXBlIHRleHR1cmVGaWx0ZXIpOworCQl2aXJ0dWFsIHZvaWQgc2V0TWlwbWFwRmlsdGVyKHVuc2lnbmVkIGludCBzYW1wbGVyLCBNaXBtYXBUeXBlIG1pcG1hcEZpbHRlcik7CisJCXZpcnR1YWwgdm9pZCBzZXRHYXRoZXJFbmFibGUodW5zaWduZWQgaW50IHNhbXBsZXIsIGJvb2wgZW5hYmxlKTsKKwkJdmlydHVhbCB2b2lkIHNldEFkZHJlc3NpbmdNb2RlVSh1bnNpZ25lZCBpbnQgc2FtcGxlciwgQWRkcmVzc2luZ01vZGUgYWRkcmVzc2luZ01vZGUpOworCQl2aXJ0dWFsIHZvaWQgc2V0QWRkcmVzc2luZ01vZGVWKHVuc2lnbmVkIGludCBzYW1wbGVyLCBBZGRyZXNzaW5nTW9kZSBhZGRyZXNzaW5nTW9kZSk7CisJCXZpcnR1YWwgdm9pZCBzZXRBZGRyZXNzaW5nTW9kZVcodW5zaWduZWQgaW50IHNhbXBsZXIsIEFkZHJlc3NpbmdNb2RlIGFkZHJlc3NpbmdNb2RlKTsKKwkJdmlydHVhbCB2b2lkIHNldFJlYWRTUkdCKHVuc2lnbmVkIGludCBzYW1wbGVyLCBib29sIHNSR0IpOworCQl2aXJ0dWFsIHZvaWQgc2V0TWlwbWFwTE9EKHVuc2lnbmVkIGludCBzYW1wbGVyLCBmbG9hdCBiaWFzKTsKKwkJdmlydHVhbCB2b2lkIHNldEJvcmRlckNvbG9yKHVuc2lnbmVkIGludCBzYW1wbGVyLCBjb25zdCBDb2xvcjxmbG9hdD4gJmJvcmRlckNvbG9yKTsKKwkJdmlydHVhbCB2b2lkIHNldE1heEFuaXNvdHJvcHkodW5zaWduZWQgaW50IHN0YWdlLCB1bnNpZ25lZCBpbnQgbWF4QW5pc290cm9weSk7CisKKwkJdmlydHVhbCB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBwb2ludFNpemUpOworCQl2aXJ0dWFsIHZvaWQgc2V0UG9pbnRTaXplTWluKGZsb2F0IHBvaW50U2l6ZU1pbik7CisJCXZpcnR1YWwgdm9pZCBzZXRQb2ludFNpemVNYXgoZmxvYXQgcG9pbnRTaXplTWF4KTsKKwkJdmlydHVhbCB2b2lkIHNldFBvaW50U2NhbGVBKGZsb2F0IHBvaW50U2NhbGVBKTsKKwkJdmlydHVhbCB2b2lkIHNldFBvaW50U2NhbGVCKGZsb2F0IHBvaW50U2NhbGVCKTsKKwkJdmlydHVhbCB2b2lkIHNldFBvaW50U2NhbGVDKGZsb2F0IHBvaW50U2NhbGVDKTsKKworCXByb3RlY3RlZDoKKwkJY29uc3QgTWF0cml4ICZnZXRNb2RlbFRyYW5zZm9ybShpbnQgaSk7CisJCWNvbnN0IE1hdHJpeCAmZ2V0Vmlld1RyYW5zZm9ybSgpOworCisJCWNvbnN0IFN0YXRlIHVwZGF0ZSgpOworCQlSb3V0aW5lICpyb3V0aW5lKGNvbnN0IFN0YXRlICZzdGF0ZSk7CisKKwkJYm9vbCBpc0ZpeGVkRnVuY3Rpb24oKTsKKwkJdm9pZCBzZXRSb3V0aW5lQ2FjaGVTaXplKGludCBjYWNoZVNpemUpOworCisJCS8vIFNoYWRlciBjb25zdGFudHMKKwkJZmxvYXQ0IGNbMjU2ICsgMV07ICAgLy8gT25lIGV4dHJhIGZvciBpbmRpY2VzIG91dCBvZiByYW5nZSwgY1syNTZdID0gezAsIDAsIDAsIDB9CisJCWludDQgaVsxNl07CisJCWJvb2wgYlsxNl07CisKKwkJUG9pbnRTcHJpdGUgcG9pbnQ7CisJCUZpeGVkRnVuY3Rpb24gZmY7CisKKwlwcml2YXRlOgorCQl2b2lkIHVwZGF0ZVRyYW5zZm9ybSgpOworCisJCXZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0IE1hdHJpeCAmTSwgaW50IGkpOworCQl2b2lkIHNldENhbWVyYVRyYW5zZm9ybShjb25zdCBNYXRyaXggJk0sIGludCBpKTsKKwkJdm9pZCBzZXROb3JtYWxUcmFuc2Zvcm0oY29uc3QgTWF0cml4ICZNLCBpbnQgaSk7CisKKwkJQ29udGV4dCAqY29uc3QgY29udGV4dDsKKworCQlMUlVDYWNoZTxTdGF0ZSwgUm91dGluZT4gKnJvdXRpbmVDYWNoZTsKKworCXByb3RlY3RlZDoKKwkJTWF0cml4IE1bMTJdOyAgICAgIC8vIE1vZGVsL0dlb21ldHJ5L1dvcmxkIG1hdHJpeAorCQlNYXRyaXggVjsgICAgICAgICAgLy8gVmlldy9DYW1lcmEvRXllIG1hdHJpeAorCQlNYXRyaXggQjsgICAgICAgICAgLy8gQmFzZSBtYXRyaXgKKwkJTWF0cml4IFA7ICAgICAgICAgIC8vIFByb2plY3Rpb24gbWF0cml4CisJCU1hdHJpeCBQQjsgICAgICAgICAvLyBQICogQgorCQlNYXRyaXggUEJWOyAgICAgICAgLy8gUCAqIEIgKiBWCisJCU1hdHJpeCBQQlZNWzEyXTsgICAvLyBQICogQiAqIFYgKiBNCisKKwkJLy8gVXBkYXRlIGhpZXJhcmNoeQorCQlib29sIHVwZGF0ZU1hdHJpeDsKKwkJYm9vbCB1cGRhdGVNb2RlbE1hdHJpeFsxMl07CisJCWJvb2wgdXBkYXRlVmlld01hdHJpeDsKKwkJYm9vbCB1cGRhdGVCYXNlTWF0cml4OworCQlib29sIHVwZGF0ZVByb2plY3Rpb25NYXRyaXg7CisJCWJvb2wgdXBkYXRlTGlnaHRpbmc7CisJfTsKK30KKworI2VuZGlmICAgLy8gc3dfVmVydGV4UHJvY2Vzc29yX2hwcApkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1ZpZXdwb3J0LmNwcCBiL3NyYy9SZW5kZXJlci9WaWV3cG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1YzY5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9WaWV3cG9ydC5jcHAKQEAgLTAsMCArMSw5MCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiVmlld3BvcnQuaHBwIgorCisjaW5jbHVkZSAiTWF0aC5ocHAiCisKK25hbWVzcGFjZSBzdworeworCVZpZXdwb3J0OjpWaWV3cG9ydCgpCisJeworCQl3aWR0aCA9IDA7CisJCWhlaWdodCA9IDA7CisKKwkJbGVmdCA9IDA7CisJCXRvcCA9IDA7CisJfQorCisJVmlld3BvcnQ6On5WaWV3cG9ydCgpCisJeworCX0KKworCXZvaWQgVmlld3BvcnQ6OnNldExlZnQoZmxvYXQgbCkKKwl7CisJCWxlZnQgPSBsOworCX0KKworCXZvaWQgVmlld3BvcnQ6OnNldFRvcChmbG9hdCB0KQorCXsKKwkJdG9wID0gdDsKKwl9CisKKwl2b2lkIFZpZXdwb3J0OjpzZXRXaWR0aChmbG9hdCB3KQorCXsKKwkJd2lkdGggPSB3OworCX0KKworCXZvaWQgVmlld3BvcnQ6OnNldEhlaWdodChmbG9hdCBoKQorCXsKKwkJaGVpZ2h0ID0gaDsKKwl9CisKKwl2b2lkIFZpZXdwb3J0OjpzZXROZWFyKGZsb2F0IG4pCisJeworCQltaW4gPSBuOworCX0KKworCXZvaWQgVmlld3BvcnQ6OnNldEZhcihmbG9hdCBmKQorCXsKKwkJbWF4ID0gZjsKKwl9CisKKwlmbG9hdCBWaWV3cG9ydDo6Z2V0TGVmdCgpIGNvbnN0CisJeworCQlyZXR1cm4gbGVmdDsKKwl9CisKKwlmbG9hdCBWaWV3cG9ydDo6Z2V0VG9wKCkgY29uc3QKKwl7CisJCXJldHVybiB0b3A7CisJfQorCisJZmxvYXQgVmlld3BvcnQ6OmdldFdpZHRoKCkgY29uc3QKKwl7CisJCXJldHVybiB3aWR0aDsKKwl9CisKKwlmbG9hdCBWaWV3cG9ydDo6Z2V0SGVpZ2h0KCkgY29uc3QKKwl7CisJCXJldHVybiBoZWlnaHQ7CisJfQorCisJZmxvYXQgVmlld3BvcnQ6OmdldE5lYXIoKSBjb25zdAorCXsKKwkJcmV0dXJuIG1pbjsKKwl9CisKKwlmbG9hdCBWaWV3cG9ydDo6Z2V0RmFyKCkgY29uc3QKKwl7CisJCXJldHVybiBtYXg7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1JlbmRlcmVyL1ZpZXdwb3J0LmhwcCBiL3NyYy9SZW5kZXJlci9WaWV3cG9ydC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwZDkyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZW5kZXJlci9WaWV3cG9ydC5ocHAKQEAgLTAsMCArMSw0OCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIHN3X1ZpZXdwb3J0X2hwcAorI2RlZmluZSBzd19WaWV3cG9ydF9ocHAKKworbmFtZXNwYWNlIHN3Cit7CisJY2xhc3MgVmlld3BvcnQKKwl7CisJcHVibGljOgorCQlWaWV3cG9ydCgpOworCisJCX5WaWV3cG9ydCgpOworCisJCXZvaWQgc2V0TGVmdChmbG9hdCBsKTsKKwkJdm9pZCBzZXRUb3AoZmxvYXQgdCk7CisJCXZvaWQgc2V0V2lkdGgoZmxvYXQgdyk7CisJCXZvaWQgc2V0SGVpZ2h0KGZsb2F0IGgpOworCQl2b2lkIHNldE5lYXIoZmxvYXQgbik7CisJCXZvaWQgc2V0RmFyKGZsb2F0IGYpOworCisJCWZsb2F0IGdldExlZnQoKSBjb25zdDsKKwkJZmxvYXQgZ2V0VG9wKCkgY29uc3Q7CisJCWZsb2F0IGdldFdpZHRoKCkgY29uc3Q7CisJCWZsb2F0IGdldEhlaWdodCgpIGNvbnN0OworCQlmbG9hdCBnZXROZWFyKCkgY29uc3Q7CisJCWZsb2F0IGdldEZhcigpIGNvbnN0OworCisJcHJpdmF0ZToKKwkJZmxvYXQgbGVmdDsgICAgIC8vIExlZnRtb3N0IHBpeGVsIGNvbHVtbgorCQlmbG9hdCB0b3A7ICAgICAgLy8gSGlnaGVzdCBwaXhlbCByb3cKKwkJZmxvYXQgd2lkdGg7ICAgIC8vIFdpZHRoIGluIHBpeGVscworCQlmbG9hdCBoZWlnaHQ7ICAgLy8gSGVpZ2h0IGluIHBpeGVscworCQlmbG9hdCBtaW47CisJCWZsb2F0IG1heDsKKwl9OworfQorCisjZW5kaWYgICAvLyBzd19WaWV3cG9ydF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9TaGFkZXIvQ29uc3RhbnRzLmNwcCBiL3NyYy9TaGFkZXIvQ29uc3RhbnRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTExZTVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1NoYWRlci9Db25zdGFudHMuY3BwCkBAIC0wLDAgKzEsMzQ1IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJDb25zdGFudHMuaHBwIgorCisjaW5jbHVkZSAiTWF0aC5ocHAiCisjaW5jbHVkZSAiSGFsZi5ocHAiCisKKyNpbmNsdWRlIDxtZW1vcnkuaD4KKworbmFtZXNwYWNlIHN3Cit7CisJQ29uc3RhbnRzOjpDb25zdGFudHMoKQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQorCQl7CisJCQlzUkdCdG9MaW5lYXI4W2ldID0gKHVuc2lnbmVkIHNob3J0KShzdzo6c1JHQnRvTGluZWFyKChmbG9hdClpIC8gMHhGRikgKiAweDEwMDAgKyAwLjVmKTsKKwkJfQorCisJCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHJhbnNwb3NlQml0MFsxNl0gPQorCQl7CisJCQkweDAwMDAwMDAwLAorCQkJMHgwMDAwMDAwMSwKKwkJCTB4MDAwMDAwMTAsCisJCQkweDAwMDAwMDExLAorCQkJMHgwMDAwMDEwMCwKKwkJCTB4MDAwMDAxMDEsCisJCQkweDAwMDAwMTEwLAorCQkJMHgwMDAwMDExMSwKKwkJCTB4MDAwMDEwMDAsCisJCQkweDAwMDAxMDAxLAorCQkJMHgwMDAwMTAxMCwKKwkJCTB4MDAwMDEwMTEsCisJCQkweDAwMDAxMTAwLAorCQkJMHgwMDAwMTEwMSwKKwkJCTB4MDAwMDExMTAsCisJCQkweDAwMDAxMTExCisJCX07CisKKwkJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0cmFuc3Bvc2VCaXQxWzE2XSA9CisJCXsKKwkJCTB4MDAwMDAwMDAsCisJCQkweDAwMDAwMDAyLAorCQkJMHgwMDAwMDAyMCwKKwkJCTB4MDAwMDAwMjIsCisJCQkweDAwMDAwMjAwLAorCQkJMHgwMDAwMDIwMiwKKwkJCTB4MDAwMDAyMjAsCisJCQkweDAwMDAwMjIyLAorCQkJMHgwMDAwMjAwMCwKKwkJCTB4MDAwMDIwMDIsCisJCQkweDAwMDAyMDIwLAorCQkJMHgwMDAwMjAyMiwKKwkJCTB4MDAwMDIyMDAsCisJCQkweDAwMDAyMjAyLAorCQkJMHgwMDAwMjIyMCwKKwkJCTB4MDAwMDIyMjIKKwkJfTsKKworCQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRyYW5zcG9zZUJpdDJbMTZdID0KKwkJeworCQkJMHgwMDAwMDAwMCwKKwkJCTB4MDAwMDAwMDQsCisJCQkweDAwMDAwMDQwLAorCQkJMHgwMDAwMDA0NCwKKwkJCTB4MDAwMDA0MDAsCisJCQkweDAwMDAwNDA0LAorCQkJMHgwMDAwMDQ0MCwKKwkJCTB4MDAwMDA0NDQsCisJCQkweDAwMDA0MDAwLAorCQkJMHgwMDAwNDAwNCwKKwkJCTB4MDAwMDQwNDAsCisJCQkweDAwMDA0MDQ0LAorCQkJMHgwMDAwNDQwMCwKKwkJCTB4MDAwMDQ0MDQsCisJCQkweDAwMDA0NDQwLAorCQkJMHgwMDAwNDQ0NAorCQl9OworCisJCW1lbWNweSgmdGhpcy0+dHJhbnNwb3NlQml0MCwgdHJhbnNwb3NlQml0MCwgc2l6ZW9mKHRyYW5zcG9zZUJpdDApKTsKKwkJbWVtY3B5KCZ0aGlzLT50cmFuc3Bvc2VCaXQxLCB0cmFuc3Bvc2VCaXQxLCBzaXplb2YodHJhbnNwb3NlQml0MSkpOworCQltZW1jcHkoJnRoaXMtPnRyYW5zcG9zZUJpdDIsIHRyYW5zcG9zZUJpdDIsIHNpemVvZih0cmFuc3Bvc2VCaXQyKSk7CisKKwkJc3RhdGljIGNvbnN0IHVzaG9ydDQgY1dlaWdodFsxN10gPQorCQl7CisJCQl7MHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGfSwgICAvLyAweEZGRkYgLyAxICA9IDB4RkZGRgorCQkJezB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRn0sICAgLy8gMHhGRkZGIC8gMSAgPSAweEZGRkYKKwkJCXsweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDB9LCAgIC8vIDB4RkZGRiAvIDIgID0gMHg4MDAwCisJCQl7MHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1fSwgICAvLyAweEZGRkYgLyAzICA9IDB4NTU1NQorCQkJezB4NDAwMCwgMHg0MDAwLCAweDQwMDAsIDB4NDAwMH0sICAgLy8gMHhGRkZGIC8gNCAgPSAweDQwMDAKKwkJCXsweDMzMzMsIDB4MzMzMywgMHgzMzMzLCAweDMzMzN9LCAgIC8vIDB4RkZGRiAvIDUgID0gMHgzMzMzCisJCQl7MHgyQUFBLCAweDJBQUEsIDB4MkFBQSwgMHgyQUFBfSwgICAvLyAweEZGRkYgLyA2ICA9IDB4MkFBQQorCQkJezB4MjQ5MiwgMHgyNDkyLCAweDI0OTIsIDB4MjQ5Mn0sICAgLy8gMHhGRkZGIC8gNyAgPSAweDI0OTIKKwkJCXsweDIwMDAsIDB4MjAwMCwgMHgyMDAwLCAweDIwMDB9LCAgIC8vIDB4RkZGRiAvIDggID0gMHgyMDAwCisJCQl7MHgxQzcxLCAweDFDNzEsIDB4MUM3MSwgMHgxQzcxfSwgICAvLyAweEZGRkYgLyA5ICA9IDB4MUM3MQorCQkJezB4MTk5OSwgMHgxOTk5LCAweDE5OTksIDB4MTk5OX0sICAgLy8gMHhGRkZGIC8gMTAgPSAweDE5OTkKKwkJCXsweDE3NDUsIDB4MTc0NSwgMHgxNzQ1LCAweDE3NDV9LCAgIC8vIDB4RkZGRiAvIDExID0gMHgxNzQ1CisJCQl7MHgxNTU1LCAweDE1NTUsIDB4MTU1NSwgMHgxNTU1fSwgICAvLyAweEZGRkYgLyAxMiA9IDB4MTU1NQorCQkJezB4MTNCMSwgMHgxM0IxLCAweDEzQjEsIDB4MTNCMX0sICAgLy8gMHhGRkZGIC8gMTMgPSAweDEzQjEKKwkJCXsweDEyNDksIDB4MTI0OSwgMHgxMjQ5LCAweDEyNDl9LCAgIC8vIDB4RkZGRiAvIDE0ID0gMHgxMjQ5CisJCQl7MHgxMTExLCAweDExMTEsIDB4MTExMSwgMHgxMTExfSwgICAvLyAweEZGRkYgLyAxNSA9IDB4MTExMQorCQkJezB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMH0sICAgLy8gMHhGRkZGIC8gMTYgPSAweDEwMDAKKwkJfTsKKworCQlzdGF0aWMgY29uc3QgZmxvYXQ0IHV2V2VpZ2h0WzE3XSA9CisJCXsKKwkJCXsxLjBmIC8gMS4wZiwgIDEuMGYgLyAxLjBmLCAgMS4wZiAvIDEuMGYsICAxLjBmIC8gMS4wZn0sCisJCQl7MS4wZiAvIDEuMGYsICAxLjBmIC8gMS4wZiwgIDEuMGYgLyAxLjBmLCAgMS4wZiAvIDEuMGZ9LAorCQkJezEuMGYgLyAyLjBmLCAgMS4wZiAvIDIuMGYsICAxLjBmIC8gMi4wZiwgIDEuMGYgLyAyLjBmfSwKKwkJCXsxLjBmIC8gMy4wZiwgIDEuMGYgLyAzLjBmLCAgMS4wZiAvIDMuMGYsICAxLjBmIC8gMy4wZn0sCisJCQl7MS4wZiAvIDQuMGYsICAxLjBmIC8gNC4wZiwgIDEuMGYgLyA0LjBmLCAgMS4wZiAvIDQuMGZ9LAorCQkJezEuMGYgLyA1LjBmLCAgMS4wZiAvIDUuMGYsICAxLjBmIC8gNS4wZiwgIDEuMGYgLyA1LjBmfSwKKwkJCXsxLjBmIC8gNi4wZiwgIDEuMGYgLyA2LjBmLCAgMS4wZiAvIDYuMGYsICAxLjBmIC8gNi4wZn0sCisJCQl7MS4wZiAvIDcuMGYsICAxLjBmIC8gNy4wZiwgIDEuMGYgLyA3LjBmLCAgMS4wZiAvIDcuMGZ9LAorCQkJezEuMGYgLyA4LjBmLCAgMS4wZiAvIDguMGYsICAxLjBmIC8gOC4wZiwgIDEuMGYgLyA4LjBmfSwKKwkJCXsxLjBmIC8gOS4wZiwgIDEuMGYgLyA5LjBmLCAgMS4wZiAvIDkuMGYsICAxLjBmIC8gOS4wZn0sCisJCQl7MS4wZiAvIDEwLjBmLCAxLjBmIC8gMTAuMGYsIDEuMGYgLyAxMC4wZiwgMS4wZiAvIDEwLjBmfSwKKwkJCXsxLjBmIC8gMTEuMGYsIDEuMGYgLyAxMS4wZiwgMS4wZiAvIDExLjBmLCAxLjBmIC8gMTEuMGZ9LAorCQkJezEuMGYgLyAxMi4wZiwgMS4wZiAvIDEyLjBmLCAxLjBmIC8gMTIuMGYsIDEuMGYgLyAxMi4wZn0sCisJCQl7MS4wZiAvIDEzLjBmLCAxLjBmIC8gMTMuMGYsIDEuMGYgLyAxMy4wZiwgMS4wZiAvIDEzLjBmfSwKKwkJCXsxLjBmIC8gMTQuMGYsIDEuMGYgLyAxNC4wZiwgMS4wZiAvIDE0LjBmLCAxLjBmIC8gMTQuMGZ9LAorCQkJezEuMGYgLyAxNS4wZiwgMS4wZiAvIDE1LjBmLCAxLjBmIC8gMTUuMGYsIDEuMGYgLyAxNS4wZn0sCisJCQl7MS4wZiAvIDE2LjBmLCAxLjBmIC8gMTYuMGYsIDEuMGYgLyAxNi4wZiwgMS4wZiAvIDE2LjBmfSwKKwkJfTsKKworCQlzdGF0aWMgY29uc3QgZmxvYXQ0IHV2U3RhcnRbMTddID0KKwkJeworCQkJey0wLjBmIC8gMi4wZiwgICAtMC4wZiAvIDIuMGYsICAgLTAuMGYgLyAyLjBmLCAgIC0wLjBmIC8gMi4wZn0sCisJCQl7LTAuMGYgLyAyLjBmLCAgIC0wLjBmIC8gMi4wZiwgICAtMC4wZiAvIDIuMGYsICAgLTAuMGYgLyAyLjBmfSwKKwkJCXstMS4wZiAvIDQuMGYsICAgLTEuMGYgLyA0LjBmLCAgIC0xLjBmIC8gNC4wZiwgICAtMS4wZiAvIDQuMGZ9LAorCQkJey0yLjBmIC8gNi4wZiwgICAtMi4wZiAvIDYuMGYsICAgLTIuMGYgLyA2LjBmLCAgIC0yLjBmIC8gNi4wZn0sCisJCQl7LTMuMGYgLyA4LjBmLCAgIC0zLjBmIC8gOC4wZiwgICAtMy4wZiAvIDguMGYsICAgLTMuMGYgLyA4LjBmfSwKKwkJCXstNC4wZiAvIDEwLjBmLCAgLTQuMGYgLyAxMC4wZiwgIC00LjBmIC8gMTAuMGYsICAtNC4wZiAvIDEwLjBmfSwKKwkJCXstNS4wZiAvIDEyLjBmLCAgLTUuMGYgLyAxMi4wZiwgIC01LjBmIC8gMTIuMGYsICAtNS4wZiAvIDEyLjBmfSwKKwkJCXstNi4wZiAvIDE0LjBmLCAgLTYuMGYgLyAxNC4wZiwgIC02LjBmIC8gMTQuMGYsICAtNi4wZiAvIDE0LjBmfSwKKwkJCXstNy4wZiAvIDE2LjBmLCAgLTcuMGYgLyAxNi4wZiwgIC03LjBmIC8gMTYuMGYsICAtNy4wZiAvIDE2LjBmfSwKKwkJCXstOC4wZiAvIDE4LjBmLCAgLTguMGYgLyAxOC4wZiwgIC04LjBmIC8gMTguMGYsICAtOC4wZiAvIDE4LjBmfSwKKwkJCXstOS4wZiAvIDIwLjBmLCAgLTkuMGYgLyAyMC4wZiwgIC05LjBmIC8gMjAuMGYsICAtOS4wZiAvIDIwLjBmfSwKKwkJCXstMTAuMGYgLyAyMi4wZiwgLTEwLjBmIC8gMjIuMGYsIC0xMC4wZiAvIDIyLjBmLCAtMTAuMGYgLyAyMi4wZn0sCisJCQl7LTExLjBmIC8gMjQuMGYsIC0xMS4wZiAvIDI0LjBmLCAtMTEuMGYgLyAyNC4wZiwgLTExLjBmIC8gMjQuMGZ9LAorCQkJey0xMi4wZiAvIDI2LjBmLCAtMTIuMGYgLyAyNi4wZiwgLTEyLjBmIC8gMjYuMGYsIC0xMi4wZiAvIDI2LjBmfSwKKwkJCXstMTMuMGYgLyAyOC4wZiwgLTEzLjBmIC8gMjguMGYsIC0xMy4wZiAvIDI4LjBmLCAtMTMuMGYgLyAyOC4wZn0sCisJCQl7LTE0LjBmIC8gMzAuMGYsIC0xNC4wZiAvIDMwLjBmLCAtMTQuMGYgLyAzMC4wZiwgLTE0LjBmIC8gMzAuMGZ9LAorCQkJey0xNS4wZiAvIDMyLjBmLCAtMTUuMGYgLyAzMi4wZiwgLTE1LjBmIC8gMzIuMGYsIC0xNS4wZiAvIDMyLjBmfSwKKwkJfTsKKworCQltZW1jcHkoJnRoaXMtPmNXZWlnaHQsIGNXZWlnaHQsIHNpemVvZihjV2VpZ2h0KSk7CisJCW1lbWNweSgmdGhpcy0+dXZXZWlnaHQsIHV2V2VpZ2h0LCBzaXplb2YodXZXZWlnaHQpKTsKKwkJbWVtY3B5KCZ0aGlzLT51dlN0YXJ0LCB1dlN0YXJ0LCBzaXplb2YodXZTdGFydCkpOworCisJCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgb2NjbHVzaW9uQ291bnRbMTZdID0gezAsIDEsIDEsIDIsIDEsIDIsIDIsIDMsIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDR9OworCisJCW1lbWNweSgmdGhpcy0+b2NjbHVzaW9uQ291bnQsICZvY2NsdXNpb25Db3VudCwgc2l6ZW9mKG9jY2x1c2lvbkNvdW50KSk7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCW1hc2tCNFFbaV1bMF0gPSAtKGkgPj4gMCAmIDEpOworCQkJbWFza0I0UVtpXVsxXSA9IC0oaSA+PiAxICYgMSk7CisJCQltYXNrQjRRW2ldWzJdID0gLShpID4+IDIgJiAxKTsKKwkJCW1hc2tCNFFbaV1bM10gPSAtKGkgPj4gMyAmIDEpOworCQkJbWFza0I0UVtpXVs0XSA9IC0oaSA+PiAwICYgMSk7CisJCQltYXNrQjRRW2ldWzVdID0gLShpID4+IDEgJiAxKTsKKwkJCW1hc2tCNFFbaV1bNl0gPSAtKGkgPj4gMiAmIDEpOworCQkJbWFza0I0UVtpXVs3XSA9IC0oaSA+PiAzICYgMSk7CisKKwkJCWludk1hc2tCNFFbaV1bMF0gPSB+LShpID4+IDAgJiAxKTsKKwkJCWludk1hc2tCNFFbaV1bMV0gPSB+LShpID4+IDEgJiAxKTsKKwkJCWludk1hc2tCNFFbaV1bMl0gPSB+LShpID4+IDIgJiAxKTsKKwkJCWludk1hc2tCNFFbaV1bM10gPSB+LShpID4+IDMgJiAxKTsKKwkJCWludk1hc2tCNFFbaV1bNF0gPSB+LShpID4+IDAgJiAxKTsKKwkJCWludk1hc2tCNFFbaV1bNV0gPSB+LShpID4+IDEgJiAxKTsKKwkJCWludk1hc2tCNFFbaV1bNl0gPSB+LShpID4+IDIgJiAxKTsKKwkJCWludk1hc2tCNFFbaV1bN10gPSB+LShpID4+IDMgJiAxKTsKKworCQkJbWFza1c0UVtpXVswXSA9IC0oaSA+PiAwICYgMSk7CisJCQltYXNrVzRRW2ldWzFdID0gLShpID4+IDEgJiAxKTsKKwkJCW1hc2tXNFFbaV1bMl0gPSAtKGkgPj4gMiAmIDEpOworCQkJbWFza1c0UVtpXVszXSA9IC0oaSA+PiAzICYgMSk7CisKKwkJCWludk1hc2tXNFFbaV1bMF0gPSB+LShpID4+IDAgJiAxKTsKKwkJCWludk1hc2tXNFFbaV1bMV0gPSB+LShpID4+IDEgJiAxKTsKKwkJCWludk1hc2tXNFFbaV1bMl0gPSB+LShpID4+IDIgJiAxKTsKKwkJCWludk1hc2tXNFFbaV1bM10gPSB+LShpID4+IDMgJiAxKTsKKworCQkJbWFza0Q0WFtpXVswXSA9IC0oaSA+PiAwICYgMSk7CisJCQltYXNrRDRYW2ldWzFdID0gLShpID4+IDEgJiAxKTsKKwkJCW1hc2tENFhbaV1bMl0gPSAtKGkgPj4gMiAmIDEpOworCQkJbWFza0Q0WFtpXVszXSA9IC0oaSA+PiAzICYgMSk7CisKKwkJCWludk1hc2tENFhbaV1bMF0gPSB+LShpID4+IDAgJiAxKTsKKwkJCWludk1hc2tENFhbaV1bMV0gPSB+LShpID4+IDEgJiAxKTsKKwkJCWludk1hc2tENFhbaV1bMl0gPSB+LShpID4+IDIgJiAxKTsKKwkJCWludk1hc2tENFhbaV1bM10gPSB+LShpID4+IDMgJiAxKTsKKworCQkJbWFza1EwUVtpXSA9IC0oaSA+PiAwICYgMSk7CisJCQltYXNrUTFRW2ldID0gLShpID4+IDEgJiAxKTsKKwkJCW1hc2tRMlFbaV0gPSAtKGkgPj4gMiAmIDEpOworCQkJbWFza1EzUVtpXSA9IC0oaSA+PiAzICYgMSk7CisKKwkJCWludk1hc2tRMFFbaV0gPSB+LShpID4+IDAgJiAxKTsKKwkJCWludk1hc2tRMVFbaV0gPSB+LShpID4+IDEgJiAxKTsKKwkJCWludk1hc2tRMlFbaV0gPSB+LShpID4+IDIgJiAxKTsKKwkJCWludk1hc2tRM1FbaV0gPSB+LShpID4+IDMgJiAxKTsKKworCQkJbWFza1gwWFtpXVswXSA9IG1hc2tYMFhbaV1bMV0gPSBtYXNrWDBYW2ldWzJdID0gbWFza1gwWFtpXVszXSA9IC0oaSA+PiAwICYgMSk7CisJCQltYXNrWDFYW2ldWzBdID0gbWFza1gxWFtpXVsxXSA9IG1hc2tYMVhbaV1bMl0gPSBtYXNrWDFYW2ldWzNdID0gLShpID4+IDEgJiAxKTsKKwkJCW1hc2tYMlhbaV1bMF0gPSBtYXNrWDJYW2ldWzFdID0gbWFza1gyWFtpXVsyXSA9IG1hc2tYMlhbaV1bM10gPSAtKGkgPj4gMiAmIDEpOworCQkJbWFza1gzWFtpXVswXSA9IG1hc2tYM1hbaV1bMV0gPSBtYXNrWDNYW2ldWzJdID0gbWFza1gzWFtpXVszXSA9IC0oaSA+PiAzICYgMSk7CisKKwkJCWludk1hc2tYMFhbaV1bMF0gPSBpbnZNYXNrWDBYW2ldWzFdID0gaW52TWFza1gwWFtpXVsyXSA9IGludk1hc2tYMFhbaV1bM10gPSB+LShpID4+IDAgJiAxKTsKKwkJCWludk1hc2tYMVhbaV1bMF0gPSBpbnZNYXNrWDFYW2ldWzFdID0gaW52TWFza1gxWFtpXVsyXSA9IGludk1hc2tYMVhbaV1bM10gPSB+LShpID4+IDEgJiAxKTsKKwkJCWludk1hc2tYMlhbaV1bMF0gPSBpbnZNYXNrWDJYW2ldWzFdID0gaW52TWFza1gyWFtpXVsyXSA9IGludk1hc2tYMlhbaV1bM10gPSB+LShpID4+IDIgJiAxKTsKKwkJCWludk1hc2tYM1hbaV1bMF0gPSBpbnZNYXNrWDNYW2ldWzFdID0gaW52TWFza1gzWFtpXVsyXSA9IGludk1hc2tYM1hbaV1bM10gPSB+LShpID4+IDMgJiAxKTsKKworCQkJbWFza0QwMVFbaV1bMF0gPSAtKGkgPj4gMCAmIDEpOworCQkJbWFza0QwMVFbaV1bMV0gPSAtKGkgPj4gMSAmIDEpOworCQkJbWFza0QyM1FbaV1bMF0gPSAtKGkgPj4gMiAmIDEpOworCQkJbWFza0QyM1FbaV1bMV0gPSAtKGkgPj4gMyAmIDEpOworCisJCQlpbnZNYXNrRDAxUVtpXVswXSA9IH4tKGkgPj4gMCAmIDEpOworCQkJaW52TWFza0QwMVFbaV1bMV0gPSB+LShpID4+IDEgJiAxKTsKKwkJCWludk1hc2tEMjNRW2ldWzBdID0gfi0oaSA+PiAyICYgMSk7CisJCQlpbnZNYXNrRDIzUVtpXVsxXSA9IH4tKGkgPj4gMyAmIDEpOworCisJCQltYXNrUTAxWFtpXVswXSA9IC0oaSA+PiAwICYgMSk7CisJCQltYXNrUTAxWFtpXVsxXSA9IC0oaSA+PiAxICYgMSk7CisJCQltYXNrUTIzWFtpXVswXSA9IC0oaSA+PiAyICYgMSk7CisJCQltYXNrUTIzWFtpXVsxXSA9IC0oaSA+PiAzICYgMSk7CisKKwkJCWludk1hc2tRMDFYW2ldWzBdID0gfi0oaSA+PiAwICYgMSk7CisJCQlpbnZNYXNrUTAxWFtpXVsxXSA9IH4tKGkgPj4gMSAmIDEpOworCQkJaW52TWFza1EyM1hbaV1bMF0gPSB+LShpID4+IDIgJiAxKTsKKwkJCWludk1hc2tRMjNYW2ldWzFdID0gfi0oaSA+PiAzICYgMSk7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQorCQl7CisJCQltYXNrVzAxUVtpXVswXSA9ICAtKGkgPj4gMCAmIDEpOworCQkJbWFza1cwMVFbaV1bMV0gPSAgLShpID4+IDEgJiAxKTsKKwkJCW1hc2tXMDFRW2ldWzJdID0gIC0oaSA+PiAwICYgMSk7CisJCQltYXNrVzAxUVtpXVszXSA9ICAtKGkgPj4gMSAmIDEpOworCisJCQlpbnZNYXNrVzAxUVtpXVswXSA9ICB+LShpID4+IDAgJiAxKTsKKwkJCWludk1hc2tXMDFRW2ldWzFdID0gIH4tKGkgPj4gMSAmIDEpOworCQkJaW52TWFza1cwMVFbaV1bMl0gPSAgfi0oaSA+PiAwICYgMSk7CisJCQlpbnZNYXNrVzAxUVtpXVszXSA9ICB+LShpID4+IDEgJiAxKTsKKworCQkJbWFza0QwMVhbaV1bMF0gPSAgLShpID4+IDAgJiAxKTsKKwkJCW1hc2tEMDFYW2ldWzFdID0gIC0oaSA+PiAxICYgMSk7CisJCQltYXNrRDAxWFtpXVsyXSA9ICAtKGkgPj4gMCAmIDEpOworCQkJbWFza0QwMVhbaV1bM10gPSAgLShpID4+IDEgJiAxKTsKKworCQkJaW52TWFza0QwMVhbaV1bMF0gPSAgfi0oaSA+PiAwICYgMSk7CisJCQlpbnZNYXNrRDAxWFtpXVsxXSA9ICB+LShpID4+IDEgJiAxKTsKKwkJCWludk1hc2tEMDFYW2ldWzJdID0gIH4tKGkgPj4gMCAmIDEpOworCQkJaW52TWFza0QwMVhbaV1bM10gPSAgfi0oaSA+PiAxICYgMSk7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMHgxMDAwOyBpKyspCisJCXsKKwkJCWxpblRvU1JHQjEyXzE2W2ldID0gKHVuc2lnbmVkIHNob3J0KShjbGFtcChzdzo6bGluZWFyVG9TUkdCKChmbG9hdClpIC8gMHgwRkZGKSAqIDB4RkZGRiArIDAuNWYsIDAuMGYsIChmbG9hdCkweEZGRkYpKTsKKwkJCXNSR0J0b0xpbjEyXzE2W2ldID0gKHVuc2lnbmVkIHNob3J0KShjbGFtcChzdzo6c1JHQnRvTGluZWFyKChmbG9hdClpIC8gMHgwRkZGKSAqIDB4RkZGRiArIDAuNWYsIDAuMGYsIChmbG9hdCkweEZGRkYpKTsKKwkJfQorCisJCWZvcihpbnQgcSA9IDA7IHEgPCA0OyBxKyspCisJCXsKKwkJCWZvcihpbnQgYyA9IDA7IGMgPCAxNjsgYysrKQorCQkJeworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspCisJCQkJeworCQkJCQljb25zdCBmbG9hdCBYWzRdID0geyswLjMxMjVmLCAtMC4zMTI1ZiwgLTAuMTI1MGYsICswLjEyNTBmfTsKKwkJCQkJY29uc3QgZmxvYXQgWVs0XSA9IHsrMC4xMjUwZiwgLTAuMTI1MGYsICswLjMxMjVmLCAtMC4zMTI1Zn07CisKKwkJCQkJc2FtcGxlWFtxXVtjXVtpXSA9IGMgJiAoMSA8PCBpKSA/IFhbcV0gOiAwLjBmOworCQkJCQlzYW1wbGVZW3FdW2NdW2ldID0gYyAmICgxIDw8IGkpID8gWVtxXSA6IDAuMGY7CisJCQkJCXdlaWdodFtjXVtpXSA9IGMgJiAoMSA8PCBpKSA/IDEuMGYgOiAwLjBmOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWNvbnN0IGludCBYZls0XSA9IHstNSwgKzUsICsyLCAtMn07ICAgLy8gRnJhZ21lbnQgb2Zmc2V0cworCQljb25zdCBpbnQgWWZbNF0gPSB7LTIsICsyLCAtNSwgKzV9OyAgIC8vIEZyYWdtZW50IG9mZnNldHMKKworCQltZW1jcHkoJnRoaXMtPlhmLCAmWGYsIHNpemVvZihYZikpOworCQltZW1jcHkoJnRoaXMtPllmLCAmWWYsIHNpemVvZihZZikpOworCisJCXN0YXRpYyBjb25zdCBmbG9hdDQgWFs0XSA9IHt7LTAuMzEyNWYsIC0wLjMxMjVmLCAtMC4zMTI1ZiwgLTAuMzEyNWZ9LAorCQkJCQkgICAgICAgICAgICAgICAgeyswLjMxMjVmLCArMC4zMTI1ZiwgKzAuMzEyNWYsICswLjMxMjVmfSwKKwkJCQkJICAgICAgICAgICAgICAgIHsrMC4xMjUwZiwgKzAuMTI1MGYsICswLjEyNTBmLCArMC4xMjUwZn0sCisJCQkJCSAgICAgICAgICAgICAgICB7LTAuMTI1MGYsIC0wLjEyNTBmLCAtMC4xMjUwZiwgLTAuMTI1MGZ9fTsKKworCQlzdGF0aWMgY29uc3QgZmxvYXQ0IFlbNF0gPSB7ey0wLjEyNTBmLCAtMC4xMjUwZiwgLTAuMTI1MGYsIC0wLjEyNTBmfSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsrMC4xMjUwZiwgKzAuMTI1MGYsICswLjEyNTBmLCArMC4xMjUwZn0sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuMzEyNWYsIC0wLjMxMjVmLCAtMC4zMTI1ZiwgLTAuMzEyNWZ9LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyswLjMxMjVmLCArMC4zMTI1ZiwgKzAuMzEyNWYsICswLjMxMjVmfX07CisKKwkJbWVtY3B5KCZ0aGlzLT5YLCAmWCwgc2l6ZW9mKFgpKTsKKwkJbWVtY3B5KCZ0aGlzLT5ZLCAmWSwgc2l6ZW9mKFkpKTsKKworCQljb25zdCBkd29yZCBtYXhYWzE2XSA9IHsweDAwMDAwMDAwLCAweDAwMDAwMDAxLCAweDAwMDAwMTAwLCAweDAwMDAwMTAxLCAweDAwMDEwMDAwLCAweDAwMDEwMDAxLCAweDAwMDEwMTAwLCAweDAwMDEwMTAxLCAweDAxMDAwMDAwLCAweDAxMDAwMDAxLCAweDAxMDAwMTAwLCAweDAxMDAwMTAxLCAweDAxMDEwMDAwLCAweDAxMDEwMDAxLCAweDAxMDEwMTAwLCAweDAxMDEwMTAxfTsKKwkJY29uc3QgZHdvcmQgbWF4WVsxNl0gPSB7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDIwMCwgMHgwMDAwMDIwMiwgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMiwgMHgwMDAyMDIwMCwgMHgwMDAyMDIwMiwgMHgwMjAwMDAwMCwgMHgwMjAwMDAwMiwgMHgwMjAwMDIwMCwgMHgwMjAwMDIwMiwgMHgwMjAyMDAwMCwgMHgwMjAyMDAwMiwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMn07CisJCWNvbnN0IGR3b3JkIG1heFpbMTZdID0gezB4MDAwMDAwMDAsIDB4MDAwMDAwMDQsIDB4MDAwMDA0MDAsIDB4MDAwMDA0MDQsIDB4MDAwNDAwMDAsIDB4MDAwNDAwMDQsIDB4MDAwNDA0MDAsIDB4MDAwNDA0MDQsIDB4MDQwMDAwMDAsIDB4MDQwMDAwMDQsIDB4MDQwMDA0MDAsIDB4MDQwMDA0MDQsIDB4MDQwNDAwMDAsIDB4MDQwNDAwMDQsIDB4MDQwNDA0MDAsIDB4MDQwNDA0MDR9OworCQljb25zdCBkd29yZCBtaW5YWzE2XSA9IHsweDAwMDAwMDAwLCAweDAwMDAwMDA4LCAweDAwMDAwODAwLCAweDAwMDAwODA4LCAweDAwMDgwMDAwLCAweDAwMDgwMDA4LCAweDAwMDgwODAwLCAweDAwMDgwODA4LCAweDA4MDAwMDAwLCAweDA4MDAwMDA4LCAweDA4MDAwODAwLCAweDA4MDAwODA4LCAweDA4MDgwMDAwLCAweDA4MDgwMDA4LCAweDA4MDgwODAwLCAweDA4MDgwODA4fTsKKwkJY29uc3QgZHdvcmQgbWluWVsxNl0gPSB7MHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgwMDAwMTAwMCwgMHgwMDAwMTAxMCwgMHgwMDEwMDAwMCwgMHgwMDEwMDAxMCwgMHgwMDEwMTAwMCwgMHgwMDEwMTAxMCwgMHgxMDAwMDAwMCwgMHgxMDAwMDAxMCwgMHgxMDAwMTAwMCwgMHgxMDAwMTAxMCwgMHgxMDEwMDAwMCwgMHgxMDEwMDAxMCwgMHgxMDEwMTAwMCwgMHgxMDEwMTAxMH07CisJCWNvbnN0IGR3b3JkIG1pblpbMTZdID0gezB4MDAwMDAwMDAsIDB4MDAwMDAwMjAsIDB4MDAwMDIwMDAsIDB4MDAwMDIwMjAsIDB4MDAyMDAwMDAsIDB4MDAyMDAwMjAsIDB4MDAyMDIwMDAsIDB4MDAyMDIwMjAsIDB4MjAwMDAwMDAsIDB4MjAwMDAwMjAsIDB4MjAwMDIwMDAsIDB4MjAwMDIwMjAsIDB4MjAyMDAwMDAsIDB4MjAyMDAwMjAsIDB4MjAyMDIwMDAsIDB4MjAyMDIwMjB9OworCQljb25zdCBkd29yZCBmaW5pWzE2XSA9IHsweDAwMDAwMDAwLCAweDAwMDAwMDgwLCAweDAwMDA4MDAwLCAweDAwMDA4MDgwLCAweDAwODAwMDAwLCAweDAwODAwMDgwLCAweDAwODA4MDAwLCAweDAwODA4MDgwLCAweDgwMDAwMDAwLCAweDgwMDAwMDgwLCAweDgwMDA4MDAwLCAweDgwMDA4MDgwLCAweDgwODAwMDAwLCAweDgwODAwMDgwLCAweDgwODA4MDAwLCAweDgwODA4MDgwfTsKKworCQltZW1jcHkoJnRoaXMtPm1heFgsICZtYXhYLCBzaXplb2YobWF4WCkpOworCQltZW1jcHkoJnRoaXMtPm1heFksICZtYXhZLCBzaXplb2YobWF4WSkpOworCQltZW1jcHkoJnRoaXMtPm1heFosICZtYXhaLCBzaXplb2YobWF4WikpOworCQltZW1jcHkoJnRoaXMtPm1pblgsICZtaW5YLCBzaXplb2YobWluWCkpOworCQltZW1jcHkoJnRoaXMtPm1pblksICZtaW5ZLCBzaXplb2YobWluWSkpOworCQltZW1jcHkoJnRoaXMtPm1pblosICZtaW5aLCBzaXplb2YobWluWikpOworCQltZW1jcHkoJnRoaXMtPmZpbmksICZmaW5pLCBzaXplb2YoZmluaSkpOworCisJCXN0YXRpYyBjb25zdCBkd29yZDQgbWF4UG9zID0gezB4N0Y3RkZGRkYsIDB4N0Y3RkZGRkYsIDB4N0Y3RkZGRkYsIDB4N0Y3RkZGRkV9OworCisJCW1lbWNweSgmdGhpcy0+bWF4UG9zLCAmbWF4UG9zLCBzaXplb2YobWF4UG9zKSk7CisKKwkJc3RhdGljIGNvbnN0IGZsb2F0NCB1bnNjYWxlQnl0ZSA9IHsxLjBmIC8gMHhGRiwgMS4wZiAvIDB4RkYsIDEuMGYgLyAweEZGLCAxLjBmIC8gMHhGRn07CisJCXN0YXRpYyBjb25zdCBmbG9hdDQgdW5zY2FsZVNCeXRlID0gezEuMGYgLyAweDdGLCAxLjBmIC8gMHg3RiwgMS4wZiAvIDB4N0YsIDEuMGYgLyAweDdGfTsKKwkJc3RhdGljIGNvbnN0IGZsb2F0NCB1bnNjYWxlU2hvcnQgPSB7MS4wZiAvIDB4N0ZGRiwgMS4wZiAvIDB4N0ZGRiwgMS4wZiAvIDB4N0ZGRiwgMS4wZiAvIDB4N0ZGRn07CisJCXN0YXRpYyBjb25zdCBmbG9hdDQgdW5zY2FsZVVTaG9ydCA9IHsxLjBmIC8gMHhGRkZGLCAxLjBmIC8gMHhGRkZGLCAxLjBmIC8gMHhGRkZGLCAxLjBmIC8gMHhGRkZGfTsKKwkJc3RhdGljIGNvbnN0IGZsb2F0NCB1bnNjYWxlRml4ZWQgPSB7MS4wZiAvIDB4MDAwMTAwMDAsIDEuMGYgLyAweDAwMDEwMDAwLCAxLjBmIC8gMHgwMDAxMDAwMCwgMS4wZiAvIDB4MDAwMTAwMDB9OworCisJCW1lbWNweSgmdGhpcy0+dW5zY2FsZUJ5dGUsICZ1bnNjYWxlQnl0ZSwgc2l6ZW9mKHVuc2NhbGVCeXRlKSk7CisJCW1lbWNweSgmdGhpcy0+dW5zY2FsZVNCeXRlLCAmdW5zY2FsZVNCeXRlLCBzaXplb2YodW5zY2FsZVNCeXRlKSk7CisJCW1lbWNweSgmdGhpcy0+dW5zY2FsZVNob3J0LCAmdW5zY2FsZVNob3J0LCBzaXplb2YodW5zY2FsZVNob3J0KSk7CisJCW1lbWNweSgmdGhpcy0+dW5zY2FsZVVTaG9ydCwgJnVuc2NhbGVVU2hvcnQsIHNpemVvZih1bnNjYWxlVVNob3J0KSk7CisJCW1lbWNweSgmdGhpcy0+dW5zY2FsZUZpeGVkLCAmdW5zY2FsZUZpeGVkLCBzaXplb2YodW5zY2FsZUZpeGVkKSk7CisKKwkJZm9yKGludCBpID0gMDsgaSA8PSAweEZGRkY7IGkrKykKKwkJeworCQkJaGFsZjJmbG9hdFtpXSA9IChmbG9hdClyZWludGVycHJldF9jYXN0PGhhbGYmPihpKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvU2hhZGVyL0NvbnN0YW50cy5ocHAgYi9zcmMvU2hhZGVyL0NvbnN0YW50cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwM2VkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvQ29uc3RhbnRzLmhwcApAQCAtMCwwICsxLDEwMiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpbmNsdWRlICJUeXBlcy5ocHAiDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwlzdHJ1Y3QgQ29uc3RhbnRzDQorCXsNCisJCUNvbnN0YW50cygpOw0KKw0KKwkJdW5zaWduZWQgc2hvcnQgc1JHQnRvTGluZWFyOFsyNTZdOw0KKw0KKwkJdW5zaWduZWQgaW50IHRyYW5zcG9zZUJpdDBbMTZdOw0KKwkJdW5zaWduZWQgaW50IHRyYW5zcG9zZUJpdDFbMTZdOw0KKwkJdW5zaWduZWQgaW50IHRyYW5zcG9zZUJpdDJbMTZdOw0KKw0KKwkJdXNob3J0NCBjV2VpZ2h0WzE3XTsNCisJCWZsb2F0NCB1dldlaWdodFsxN107DQorCQlmbG9hdDQgdXZTdGFydFsxN107DQorDQorCQl1bnNpZ25lZCBpbnQgb2NjbHVzaW9uQ291bnRbMTZdOw0KKw0KKwkJYnl0ZTggbWFza0I0UVsxNl07DQorCQlieXRlOCBpbnZNYXNrQjRRWzE2XTsNCisJCXdvcmQ0IG1hc2tXNFFbMTZdOw0KKwkJd29yZDQgaW52TWFza1c0UVsxNl07DQorCQlkd29yZDQgbWFza0Q0WFsxNl07DQorCQlkd29yZDQgaW52TWFza0Q0WFsxNl07DQorCQlxd29yZCBtYXNrUTBRWzE2XTsNCisJCXF3b3JkIG1hc2tRMVFbMTZdOw0KKwkJcXdvcmQgbWFza1EyUVsxNl07DQorCQlxd29yZCBtYXNrUTNRWzE2XTsNCisJCXF3b3JkIGludk1hc2tRMFFbMTZdOw0KKwkJcXdvcmQgaW52TWFza1ExUVsxNl07DQorCQlxd29yZCBpbnZNYXNrUTJRWzE2XTsNCisJCXF3b3JkIGludk1hc2tRM1FbMTZdOw0KKwkJZHdvcmQ0IG1hc2tYMFhbMTZdOw0KKwkJZHdvcmQ0IG1hc2tYMVhbMTZdOw0KKwkJZHdvcmQ0IG1hc2tYMlhbMTZdOw0KKwkJZHdvcmQ0IG1hc2tYM1hbMTZdOw0KKwkJZHdvcmQ0IGludk1hc2tYMFhbMTZdOw0KKwkJZHdvcmQ0IGludk1hc2tYMVhbMTZdOw0KKwkJZHdvcmQ0IGludk1hc2tYMlhbMTZdOw0KKwkJZHdvcmQ0IGludk1hc2tYM1hbMTZdOw0KKwkJZHdvcmQyIG1hc2tEMDFRWzE2XTsNCisJCWR3b3JkMiBtYXNrRDIzUVsxNl07DQorCQlkd29yZDIgaW52TWFza0QwMVFbMTZdOw0KKwkJZHdvcmQyIGludk1hc2tEMjNRWzE2XTsNCisJCXF3b3JkMiBtYXNrUTAxWFsxNl07DQorCQlxd29yZDIgbWFza1EyM1hbMTZdOw0KKwkJcXdvcmQyIGludk1hc2tRMDFYWzE2XTsNCisJCXF3b3JkMiBpbnZNYXNrUTIzWFsxNl07DQorCQl3b3JkNCBtYXNrVzAxUVs0XTsNCisJCXdvcmQ0IGludk1hc2tXMDFRWzRdOw0KKwkJZHdvcmQ0IG1hc2tEMDFYWzRdOw0KKwkJZHdvcmQ0IGludk1hc2tEMDFYWzRdOw0KKw0KKwkJdW5zaWduZWQgc2hvcnQgbGluVG9TUkdCMTJfMTZbNDA5Nl07DQorCQl1bnNpZ25lZCBzaG9ydCBzUkdCdG9MaW4xMl8xNls0MDk2XTsNCisNCisJCS8vIENlbnRyb2lkIHBhcmFtZXRlcnMNCisJCWZsb2F0NCBzYW1wbGVYWzRdWzE2XTsNCisJCWZsb2F0NCBzYW1wbGVZWzRdWzE2XTsNCisJCWZsb2F0NCB3ZWlnaHRbMTZdOw0KKw0KKwkJLy8gRnJhZ21lbnQgb2Zmc2V0cw0KKwkJaW50IFhmWzRdOw0KKwkJaW50IFlmWzRdOw0KKw0KKwkJZmxvYXQ0IFhbNF07DQorCQlmbG9hdDQgWVs0XTsNCisNCisJCWR3b3JkIG1heFhbMTZdOw0KKwkJZHdvcmQgbWF4WVsxNl07DQorCQlkd29yZCBtYXhaWzE2XTsNCisJCWR3b3JkIG1pblhbMTZdOw0KKwkJZHdvcmQgbWluWVsxNl07DQorCQlkd29yZCBtaW5aWzE2XTsNCisJCWR3b3JkIGZpbmlbMTZdOw0KKw0KKwkJZHdvcmQ0IG1heFBvczsNCisNCisJCWZsb2F0NCB1bnNjYWxlQnl0ZTsNCisJCWZsb2F0NCB1bnNjYWxlU0J5dGU7DQorCQlmbG9hdDQgdW5zY2FsZVNob3J0Ow0KKwkJZmxvYXQ0IHVuc2NhbGVVU2hvcnQ7DQorCQlmbG9hdDQgdW5zY2FsZUZpeGVkOw0KKw0KKwkJZmxvYXQgaGFsZjJmbG9hdFs2NTUzNl07DQorCX07DQorDQorCXN0YXRpYyBDb25zdGFudHMgY29uc3RhbnRzOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvU2hhZGVyL1BpeGVsUm91dGluZS5jcHAgYi9zcmMvU2hhZGVyL1BpeGVsUm91dGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhYzViZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvUGl4ZWxSb3V0aW5lLmNwcApAQCAtMCwwICsxLDUzOTkgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIlBpeGVsUm91dGluZS5ocHAiCisKKyNpbmNsdWRlICJSZW5kZXJlci5ocHAiCisjaW5jbHVkZSAiUGl4ZWxTaGFkZXIuaHBwIgorI2luY2x1ZGUgIlF1YWRSYXN0ZXJpemVyLmhwcCIKKyNpbmNsdWRlICJTdXJmYWNlLmhwcCIKKyNpbmNsdWRlICJQcmltaXRpdmUuaHBwIgorI2luY2x1ZGUgIkNQVUlELmhwcCIKKyNpbmNsdWRlICJTYW1wbGVyQ29yZS5ocHAiCisjaW5jbHVkZSAiQ29uc3RhbnRzLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworZXh0ZXJuIGJvb2wgbG9jYWxTaGFkZXJDb25zdGFudHM7CisKK25hbWVzcGFjZSBzdworeworCWV4dGVybiBib29sIGNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlcjsKKwlleHRlcm4gYm9vbCBwb3N0QmxlbmRTUkdCOworCWV4dGVybiBib29sIGV4YWN0Q29sb3JSb3VuZGluZzsKKworCVBpeGVsUm91dGluZTo6UGl4ZWxSb3V0aW5lKGNvbnN0IFBpeGVsUHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUsIGNvbnN0IFBpeGVsU2hhZGVyICpwaXhlbFNoYWRlcikgOiBSYXN0ZXJpemVyKHN0YXRlKSwgcGl4ZWxTaGFkZXIocGl4ZWxTaGFkZXIpCisJeworCQlwZXJ0dXJiYXRlID0gZmFsc2U7CisJCWx1bWluYW5jZSA9IGZhbHNlOworCQlwcmV2aW91c1NjYWxpbmcgPSBmYWxzZTsKKworCQlyZXR1cm5zID0gZmFsc2U7CisJCWlmRGVwdGggPSAwOworCQlsb29wUmVwRGVwdGggPSAwOworCQlicmVha0RlcHRoID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMjA0ODsgaSsrKQorCQl7CisJCQlsYWJlbEJsb2NrW2ldID0gMDsKKwkJfQorCX0KKworCVBpeGVsUm91dGluZTo6flBpeGVsUm91dGluZSgpCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJZGVsZXRlIHNhbXBsZXJbaV07CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6cXVhZChSZWdpc3RlcnMgJnIsIFBvaW50ZXI8Qnl0ZT4gY0J1ZmZlcls0XSwgUG9pbnRlcjxCeXRlPiAmekJ1ZmZlciwgUG9pbnRlcjxCeXRlPiAmc0J1ZmZlciwgSW50IGNNYXNrWzRdLCBJbnQgJngsIEludCAmeSkKKwl7CisJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCUxvbmcgcGlwZVRpbWUgPSBUaWNrcygpOworCQkjZW5kaWYKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJc2FtcGxlcltpXSA9IG5ldyBTYW1wbGVyQ29yZShyLmNvbnN0YW50cywgc3RhdGUuc2FtcGxlcltpXSk7CisJCX0KKworCQljb25zdCBib29sIGVhcmx5RGVwdGhUZXN0ID0gIXN0YXRlLmRlcHRoT3ZlcnJpZGUgJiYgIXN0YXRlLmFscGhhVGVzdEFjdGl2ZSgpOworCQljb25zdCBib29sIGludGVnZXJQaXBlbGluZSA9IHBpeGVsU2hhZGVyVmVyc2lvbigpIDw9IDB4MDEwNDsKKworCQlJbnQgek1hc2tbNF07ICAgLy8gRGVwdGggbWFzaworCQlJbnQgc01hc2tbNF07ICAgLy8gU3RlbmNpbCBtYXNrCisKKwkJZm9yKHVuc2lnbmVkIGludCBxID0gMDsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCXsKKwkJCXpNYXNrW3FdID0gY01hc2tbcV07CisJCQlzTWFza1txXSA9IGNNYXNrW3FdOworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBxID0gMDsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCXsKKwkJCXN0ZW5jaWxUZXN0KHIsIHNCdWZmZXIsIHEsIHgsIHNNYXNrW3FdLCBjTWFza1txXSk7CisJCX0KKworCQlGbG9hdDQgZjsKKworCQlDb2xvcjRpICZjdXJyZW50ID0gci5yaVswXTsKKwkJQ29sb3I0aSAmZGlmZnVzZSA9IHIudmlbMF07CisJCUNvbG9yNGkgJnNwZWN1bGFyID0gci52aVsxXTsKKworCQlGbG9hdDQgKCZ6KVs0XSA9IHIuejsKKwkJRmxvYXQ0ICZyaHcgPSByLnJodzsKKwkJRmxvYXQ0IHJod0NlbnRyb2lkOworCisJCUZsb2F0NCB4eHh4ID0gRmxvYXQ0KEZsb2F0KHgpKSArICpQb2ludGVyPEZsb2F0ND4oci5wcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHhRdWFkKSwgMTYpOworCQlGbG9hdDQgeXl5eSA9IEZsb2F0NChGbG9hdCh5KSkgKyAqUG9pbnRlcjxGbG9hdDQ+KHIucHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSx5UXVhZCksIDE2KTsKKworCQlpZihzdGF0ZS5kZXB0aFRlc3RBY3RpdmUgfHwgc3RhdGUucGl4ZWxGb2dBY3RpdmUoKSkKKwkJeworCQkJZm9yKHVuc2lnbmVkIGludCBxID0gMDsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCQl7CisJCQkJRmxvYXQ0IHggPSB4eHh4OworCQkJCisJCQkJaWYoc3RhdGUubXVsdGlTYW1wbGUgPiAxKQorCQkJCXsKKwkJCQkJeCAtPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxYKSArIHEgKiBzaXplb2YoZmxvYXQ0KSk7CisJCQkJfQorCisJCQkJeltxXSA9IGludGVycG9sYXRlKHgsIHIuRHpbcV0sIHpbcV0sIHIucHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSx6KSwgZmFsc2UsIGZhbHNlKTsKKwkJCX0KKwkJfQorCisJCUJvb2wgZGVwdGhQYXNzID0gZmFsc2U7CisKKwkJaWYoZWFybHlEZXB0aFRlc3QpCisJCXsKKwkJCWZvcih1bnNpZ25lZCBpbnQgcSA9IDA7IHEgPCBzdGF0ZS5tdWx0aVNhbXBsZTsgcSsrKQorCQkJeworCQkJCWRlcHRoUGFzcyA9IGRlcHRoUGFzcyB8fCBkZXB0aFRlc3QociwgekJ1ZmZlciwgcSwgeCwgeltxXSwgc01hc2tbcV0sIHpNYXNrW3FdLCBjTWFza1txXSk7CisJCQl9CisJCX0KKworCQlJZihkZXB0aFBhc3MgfHwgQm9vbCghZWFybHlEZXB0aFRlc3QpKQorCQl7CisJCQkjaWYgUEVSRl9QUk9GSUxFCisJCQkJTG9uZyBpbnRlcnBUaW1lID0gVGlja3MoKTsKKwkJCSNlbmRpZgorCisJCQkvLyBDZW50cm9pZCBsb2NhdGlvbnMKKwkJCUZsb2F0NCBYWFhYID0gRmxvYXQ0KDAuMGYpOworCQkJRmxvYXQ0IFlZWVkgPSBGbG9hdDQoMC4wZik7CisKKwkJCWlmKHN0YXRlLmNlbnRyb2lkKQorCQkJeworCQkJCUZsb2F0NCBXV1dXKDEuMGUtOWYpOworCisJCQkJZm9yKHVuc2lnbmVkIGludCBxID0gMDsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCQkJeworCQkJCQlYWFhYICs9ICpQb2ludGVyPEZsb2F0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLHNhbXBsZVhbcV0pICsgMTYgKiBjTWFza1txXSk7CisJCQkJCVlZWVkgKz0gKlBvaW50ZXI8RmxvYXQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsc2FtcGxlWVtxXSkgKyAxNiAqIGNNYXNrW3FdKTsKKwkJCQkJV1dXVyArPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx3ZWlnaHQpICsgMTYgKiBjTWFza1txXSk7CisJCQkJfQorCisJCQkJV1dXVyA9IFJjcF9wcChXV1dXKTsKKwkJCQlYWFhYICo9IFdXV1c7CisJCQkJWVlZWSAqPSBXV1dXOworCisJCQkJWFhYWCArPSB4eHh4OworCQkJCVlZWVkgKz0geXl5eTsKKwkJCX0KKworCQkJaWYoc3RhdGUucGVyc3BlY3RpdmUpCisJCQl7CisJCQkJcmh3ID0gcmVjaXByb2NhbChpbnRlcnBvbGF0ZSh4eHh4LCByLkR3LCByaHcsIHIucHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSx3KSwgZmFsc2UsIGZhbHNlKSk7CisKKwkJCQlpZihzdGF0ZS5jZW50cm9pZCkKKwkJCQl7CisJCQkJCXJod0NlbnRyb2lkID0gcmVjaXByb2NhbChpbnRlcnBvbGF0ZUNlbnRyb2lkKFhYWFgsIFlZWVksIHJod0NlbnRyb2lkLCByLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsdyksIGZhbHNlLCBmYWxzZSkpOworCQkJCX0KKwkJCX0KKworCQkJZm9yKGludCBpbnRlcnBvbGFudCA9IDA7IGludGVycG9sYW50IDwgMTA7IGludGVycG9sYW50KyspCisJCQl7CisJCQkJZm9yKGludCBjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCA0OyBjb21wb25lbnQrKykKKwkJCQl7CisJCQkJCUFycmF5PEZsb2F0ND4gKnB2OworCisJCQkJCXN3aXRjaChjb21wb25lbnQpCisJCQkJCXsKKwkJCQkJY2FzZSAwOiBwdiA9ICZyLnZ4OyBicmVhazsKKwkJCQkJY2FzZSAxOiBwdiA9ICZyLnZ5OyBicmVhazsKKwkJCQkJY2FzZSAyOiBwdiA9ICZyLnZ6OyBicmVhazsKKwkJCQkJY2FzZSAzOiBwdiA9ICZyLnZ3OyBicmVhazsKKwkJCQkJfQorCisJCQkJCUFycmF5PEZsb2F0ND4gJnYgPSAqcHY7CisKKwkJCQkJaWYoc3RhdGUuaW50ZXJwb2xhbnRbaW50ZXJwb2xhbnRdLmNvbXBvbmVudCAmICgxIDw8IGNvbXBvbmVudCkpCisJCQkJCXsKKwkJCQkJCWlmKCFzdGF0ZS5pbnRlcnBvbGFudFtpbnRlcnBvbGFudF0uY2VudHJvaWQpCisJCQkJCQl7CisJCQkJCQkJdltpbnRlcnBvbGFudF0gPSBpbnRlcnBvbGF0ZSh4eHh4LCByLkR2W2ludGVycG9sYW50XVtjb21wb25lbnRdLCByaHcsIHIucHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSxWW2ludGVycG9sYW50XVtjb21wb25lbnRdKSwgc3RhdGUuaW50ZXJwb2xhbnRbaW50ZXJwb2xhbnRdLmZsYXQgJiAoMSA8PCBjb21wb25lbnQpLCBzdGF0ZS5wZXJzcGVjdGl2ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJdltpbnRlcnBvbGFudF0gPSBpbnRlcnBvbGF0ZUNlbnRyb2lkKFhYWFgsIFlZWVksIHJod0NlbnRyb2lkLCByLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsVltpbnRlcnBvbGFudF1bY29tcG9uZW50XSksIHN0YXRlLmludGVycG9sYW50W2ludGVycG9sYW50XS5mbGF0ICYgKDEgPDwgY29tcG9uZW50KSwgc3RhdGUucGVyc3BlY3RpdmUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJRmxvYXQ0IHJjcDsKKworCQkJCXN3aXRjaChzdGF0ZS5pbnRlcnBvbGFudFtpbnRlcnBvbGFudF0ucHJvamVjdCkKKwkJCQl7CisJCQkJY2FzZSAwOgorCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXJjcCA9IHJlY2lwcm9jYWwoRmxvYXQ0KHIudnlbaW50ZXJwb2xhbnRdKSk7CisJCQkJCXIudnhbaW50ZXJwb2xhbnRdID0gci52eFtpbnRlcnBvbGFudF0gKiByY3A7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJcmNwID0gcmVjaXByb2NhbChGbG9hdDQoci52eltpbnRlcnBvbGFudF0pKTsKKwkJCQkJci52eFtpbnRlcnBvbGFudF0gPSByLnZ4W2ludGVycG9sYW50XSAqIHJjcDsKKwkJCQkJci52eVtpbnRlcnBvbGFudF0gPSByLnZ5W2ludGVycG9sYW50XSAqIHJjcDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCQlyY3AgPSByZWNpcHJvY2FsKEZsb2F0NChyLnZ3W2ludGVycG9sYW50XSkpOworCQkJCQlyLnZ4W2ludGVycG9sYW50XSA9IHIudnhbaW50ZXJwb2xhbnRdICogcmNwOworCQkJCQlyLnZ5W2ludGVycG9sYW50XSA9IHIudnlbaW50ZXJwb2xhbnRdICogcmNwOworCQkJCQlyLnZ6W2ludGVycG9sYW50XSA9IHIudnpbaW50ZXJwb2xhbnRdICogcmNwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmKHN0YXRlLmZvZy5jb21wb25lbnQpCisJCQl7CisJCQkJZiA9IGludGVycG9sYXRlKHh4eHgsIHIuRGYsIHJodywgci5wcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLGYpLCBzdGF0ZS5mb2cuZmxhdCAmIDB4MDEsIHN0YXRlLnBlcnNwZWN0aXZlKTsKKwkJCX0KKworCQkJaWYoaW50ZWdlclBpcGVsaW5lKQorCQkJeworCQkJCWlmKHN0YXRlLmNvbG9yWzBdLmNvbXBvbmVudCAmIDB4MSkgZGlmZnVzZS54ID0gY29udmVydEZpeGVkMTIoRmxvYXQ0KHIudnhbMF0pKTsgZWxzZSBkaWZmdXNlLnggPSBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKTsKKwkJCQlpZihzdGF0ZS5jb2xvclswXS5jb21wb25lbnQgJiAweDIpIGRpZmZ1c2UueSA9IGNvbnZlcnRGaXhlZDEyKEZsb2F0NChyLnZ5WzBdKSk7IGVsc2UgZGlmZnVzZS55ID0gU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCk7CisJCQkJaWYoc3RhdGUuY29sb3JbMF0uY29tcG9uZW50ICYgMHg0KSBkaWZmdXNlLnogPSBjb252ZXJ0Rml4ZWQxMihGbG9hdDQoci52elswXSkpOyBlbHNlIGRpZmZ1c2UueiA9IFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApOworCQkJCWlmKHN0YXRlLmNvbG9yWzBdLmNvbXBvbmVudCAmIDB4OCkgZGlmZnVzZS53ID0gY29udmVydEZpeGVkMTIoRmxvYXQ0KHIudndbMF0pKTsgZWxzZSBkaWZmdXNlLncgPSBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKTsKKworCQkJCWlmKHN0YXRlLmNvbG9yWzFdLmNvbXBvbmVudCAmIDB4MSkgc3BlY3VsYXIueCA9IGNvbnZlcnRGaXhlZDEyKEZsb2F0NChyLnZ4WzFdKSk7IGVsc2Ugc3BlY3VsYXIueCA9IFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApOworCQkJCWlmKHN0YXRlLmNvbG9yWzFdLmNvbXBvbmVudCAmIDB4Mikgc3BlY3VsYXIueSA9IGNvbnZlcnRGaXhlZDEyKEZsb2F0NChyLnZ5WzFdKSk7IGVsc2Ugc3BlY3VsYXIueSA9IFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApOworCQkJCWlmKHN0YXRlLmNvbG9yWzFdLmNvbXBvbmVudCAmIDB4NCkgc3BlY3VsYXIueiA9IGNvbnZlcnRGaXhlZDEyKEZsb2F0NChyLnZ6WzFdKSk7IGVsc2Ugc3BlY3VsYXIueiA9IFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApOworCQkJCWlmKHN0YXRlLmNvbG9yWzFdLmNvbXBvbmVudCAmIDB4OCkgc3BlY3VsYXIudyA9IGNvbnZlcnRGaXhlZDEyKEZsb2F0NChyLnZ3WzFdKSk7IGVsc2Ugc3BlY3VsYXIudyA9IFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApOworCQkJfQorCQkJZWxzZSBpZihwaXhlbFNoYWRlclZlcnNpb24oKSA+PSAweDAzMDApCisJCQl7CisJCQkJaWYocGl4ZWxTaGFkZXItPnZQb3NEZWNsYXJlZCkKKwkJCQl7CisJCQkJCXIudlBvcy54ID0gRmxvYXQ0KEZsb2F0KHgpKSArIEZsb2F0NCgwLCAxLCAwLCAxKTsKKwkJCQkJci52UG9zLnkgPSBGbG9hdDQoRmxvYXQoeSkpICsgRmxvYXQ0KDAsIDAsIDEsIDEpOworCQkJCX0KKworCQkJCWlmKHBpeGVsU2hhZGVyLT52RmFjZURlY2xhcmVkKQorCQkJCXsKKwkJCQkJRmxvYXQ0IGFyZWEgPSAqUG9pbnRlcjxGbG9hdD4oci5wcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLGFyZWEpKTsKKwkJCQkJCisJCQkJCXIudkZhY2UueCA9IGFyZWE7CisJCQkJCXIudkZhY2UueSA9IGFyZWE7CisJCQkJCXIudkZhY2UueiA9IGFyZWE7CisJCQkJCXIudkZhY2UudyA9IGFyZWE7CisJCQkJfQorCQkJfQorCisJCQkjaWYgUEVSRl9QUk9GSUxFCisJCQkJci5jeWNsZXNbUEVSRl9JTlRFUlBdICs9IFRpY2tzKCkgLSBpbnRlcnBUaW1lOworCQkJI2VuZGlmCisKKwkJCUJvb2wgYWxwaGFQYXNzID0gdHJ1ZTsKKworCQkJaWYoY29sb3JVc2VkKCkpCisJCQl7CisJCQkJI2lmIFBFUkZfUFJPRklMRQorCQkJCQlMb25nIHNoYWRlclRpbWUgPSBUaWNrcygpOworCQkJCSNlbmRpZgorCisJCQkJaWYocGl4ZWxTaGFkZXIpCisJCQkJeworCQkJCS8vCXBpeGVsU2hhZGVyLT5wcmludCgiUGl4ZWxTaGFkZXItJTAuMTZsbFgudHh0Iiwgc3RhdGUuc2hhZGVySGFzaCk7CisKKwkJCQkJaWYocGl4ZWxTaGFkZXItPmdldFZlcnNpb24oKSA8PSAweDAxMDQpCisJCQkJCXsKKwkJCQkJCXBzXzFfeChyLCBjTWFzayk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwc18yX3gociwgY01hc2spOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWN1cnJlbnQgPSBkaWZmdXNlOworCQkJCQlDb2xvcjRpIHRlbXAoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKTsKKworCQkJCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQorCQkJCQl7CisJCQkJCQlpZihzdGF0ZS50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnN0YWdlT3BlcmF0aW9uID09IFRleHR1cmVTdGFnZTo6U1RBR0VfRElTQUJMRSkKKwkJCQkJCXsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJQ29sb3I0aSB0ZXh0dXJlOworCisJCQkJCQlpZihzdGF0ZS50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLnVzZXNUZXh0dXJlKQorCQkJCQkJeworCQkJCQkJCXNhbXBsZVRleHR1cmUociwgdGV4dHVyZSwgc3RhZ2UsIHN0YWdlKTsKKwkJCQkJCX0KKworCQkJCQkJYmxlbmRUZXh0dXJlKHIsIGN1cnJlbnQsIHRlbXAsIHRleHR1cmUsIHN0YWdlKTsKKwkJCQkJfQorCisJCQkJCXNwZWN1bGFyUGl4ZWwoY3VycmVudCwgc3BlY3VsYXIpOworCQkJCX0KKworCQkJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCQkJci5jeWNsZXNbUEVSRl9TSEFERVJdICs9IFRpY2tzKCkgLSBzaGFkZXJUaW1lOworCQkJCSNlbmRpZgorCisJCQkJaWYoaW50ZWdlclBpcGVsaW5lKQorCQkJCXsKKwkJCQkJY3VycmVudC5yID0gTWluKGN1cnJlbnQuciwgU2hvcnQ0KDB4MEZGRiwgMHgwRkZGLCAweDBGRkYsIDB4MEZGRikpOyBjdXJyZW50LnIgPSBNYXgoY3VycmVudC5yLCBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKSk7CisJCQkJCWN1cnJlbnQuZyA9IE1pbihjdXJyZW50LmcsIFNob3J0NCgweDBGRkYsIDB4MEZGRiwgMHgwRkZGLCAweDBGRkYpKTsgY3VycmVudC5nID0gTWF4KGN1cnJlbnQuZywgU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCkpOworCQkJCQljdXJyZW50LmIgPSBNaW4oY3VycmVudC5iLCBTaG9ydDQoMHgwRkZGLCAweDBGRkYsIDB4MEZGRiwgMHgwRkZGKSk7IGN1cnJlbnQuYiA9IE1heChjdXJyZW50LmIsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKTsKKwkJCQkJY3VycmVudC5hID0gTWluKGN1cnJlbnQuYSwgU2hvcnQ0KDB4MEZGRiwgMHgwRkZGLCAweDBGRkYsIDB4MEZGRikpOyBjdXJyZW50LmEgPSBNYXgoY3VycmVudC5hLCBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKSk7CisKKwkJCQkJYWxwaGFQYXNzID0gYWxwaGFUZXN0KHIsIGNNYXNrLCBjdXJyZW50KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJY2xhbXBDb2xvcihyLm9DKTsKKworCQkJCQlhbHBoYVBhc3MgPSBhbHBoYVRlc3QociwgY01hc2ssIHIub0NbMF0pOworCQkJCX0KKworCQkJCWlmKChwaXhlbFNoYWRlciAmJiBwaXhlbFNoYWRlci0+Y29udGFpbnNUZXhraWxsKCkpIHx8IHN0YXRlLmFscGhhVGVzdEFjdGl2ZSgpKQorCQkJCXsKKwkJCQkJZm9yKHVuc2lnbmVkIGludCBxID0gMDsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCQkJCXsKKwkJCQkJCXpNYXNrW3FdICY9IGNNYXNrW3FdOworCQkJCQkJc01hc2tbcV0gJj0gY01hc2tbcV07CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCUlmKGFscGhhUGFzcykKKwkJCXsKKwkJCQlpZighZWFybHlEZXB0aFRlc3QpCisJCQkJeworCQkJCQlmb3IodW5zaWduZWQgaW50IHEgPSAwOyBxIDwgc3RhdGUubXVsdGlTYW1wbGU7IHErKykKKwkJCQkJeworCQkJCQkJZGVwdGhQYXNzID0gZGVwdGhQYXNzIHx8IGRlcHRoVGVzdChyLCB6QnVmZmVyLCBxLCB4LCB6W3FdLCBzTWFza1txXSwgek1hc2tbcV0sIGNNYXNrW3FdKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCQkJTG9uZyByb3BUaW1lID0gVGlja3MoKTsKKwkJCQkjZW5kaWYKKworCQkJCUlmKGRlcHRoUGFzcyB8fCBCb29sKGVhcmx5RGVwdGhUZXN0KSkKKwkJCQl7CisJCQkJCWZvcih1bnNpZ25lZCBpbnQgcSA9IDA7IHEgPCBzdGF0ZS5tdWx0aVNhbXBsZTsgcSsrKQorCQkJCQl7CisJCQkJCQlpZihzdGF0ZS5tdWx0aVNhbXBsZU1hc2sgJiAoMSA8PCBxKSkKKwkJCQkJCXsKKwkJCQkJCQl3cml0ZURlcHRoKHIsIHpCdWZmZXIsIHEsIHgsIHpbcV0sIHpNYXNrW3FdKTsKKworCQkJCQkJCWlmKHN0YXRlLm9jY2x1c2lvbkVuYWJsZWQpCisJCQkJCQkJeworCQkJCQkJCQlyLm9jY2x1c2lvbiArPSAqUG9pbnRlcjxVSW50PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsb2NjbHVzaW9uQ291bnQpICsgNCAqICh6TWFza1txXSAmIHNNYXNrW3FdKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYoY29sb3JVc2VkKCkpCisJCQkJCXsKKwkJCQkJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCQkJCQlBZGRBdG9taWMoUG9pbnRlcjxMb25nPigmcHJvZmlsZXIucm9wT3BlcmF0aW9ucyksIExvbmcoNCkpOworCQkJCQkJI2VuZGlmCisKKwkJCQkJCWlmKGludGVnZXJQaXBlbGluZSkKKwkJCQkJCXsKKwkJCQkJCQlyYXN0ZXJPcGVyYXRpb24oY3VycmVudCwgciwgZiwgY0J1ZmZlclswXSwgeCwgc01hc2ssIHpNYXNrLCBjTWFzayk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcmFzdGVyT3BlcmF0aW9uKHIub0MsIHIsIGYsIGNCdWZmZXIsIHgsIHNNYXNrLCB6TWFzaywgY01hc2spOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJI2lmIFBFUkZfUFJPRklMRQorCQkJCQlyLmN5Y2xlc1tQRVJGX1JPUF0gKz0gVGlja3MoKSAtIHJvcFRpbWU7CisJCQkJI2VuZGlmCisJCQl9CisJCX0KKworCQlmb3IodW5zaWduZWQgaW50IHEgPSAwOyBxIDwgc3RhdGUubXVsdGlTYW1wbGU7IHErKykKKwkJeworCQkJaWYoc3RhdGUubXVsdGlTYW1wbGVNYXNrICYgKDEgPDwgcSkpCisJCQl7CisJCQkJd3JpdGVTdGVuY2lsKHIsIHNCdWZmZXIsIHEsIHgsIHNNYXNrW3FdLCB6TWFza1txXSwgY01hc2tbcV0pOworCQkJfQorCQl9CisKKwkJI2lmIFBFUkZfUFJPRklMRQorCQkJci5jeWNsZXNbUEVSRl9QSVBFXSArPSBUaWNrcygpIC0gcGlwZVRpbWU7CisJCSNlbmRpZgorCX0KKworCUZsb2F0NCBQaXhlbFJvdXRpbmU6OmludGVycG9sYXRlKEZsb2F0NCAmeCwgRmxvYXQ0ICZELCBGbG9hdDQgJnJodywgUG9pbnRlcjxCeXRlPiBwbGFuZUVxdWF0aW9uLCBib29sIGZsYXQsIGJvb2wgcGVyc3BlY3RpdmUpCisJeworCQlGbG9hdDQgaW50ZXJwb2xhbnQgPSBEOworCisJCWlmKCFmbGF0KQorCQl7CisJCQlpbnRlcnBvbGFudCArPSB4ICogKlBvaW50ZXI8RmxvYXQ0PihwbGFuZUVxdWF0aW9uICsgT0ZGU0VUKFBsYW5lRXF1YXRpb24sQSksIDE2KTsKKworCQkJaWYocGVyc3BlY3RpdmUpCisJCQl7CisJCQkJaW50ZXJwb2xhbnQgKj0gcmh3OworCQkJfQorCQl9CisKKwkJcmV0dXJuIGludGVycG9sYW50OworCX0KKworCUZsb2F0NCBQaXhlbFJvdXRpbmU6OmludGVycG9sYXRlQ2VudHJvaWQoRmxvYXQ0ICZ4LCBGbG9hdDQgJnksIEZsb2F0NCAmcmh3LCBQb2ludGVyPEJ5dGU+IHBsYW5lRXF1YXRpb24sIGJvb2wgZmxhdCwgYm9vbCBwZXJzcGVjdGl2ZSkKKwl7CisJCUZsb2F0NCBpbnRlcnBvbGFudCA9ICpQb2ludGVyPEZsb2F0ND4ocGxhbmVFcXVhdGlvbiArIE9GRlNFVChQbGFuZUVxdWF0aW9uLEMpLCAxNik7CisKKwkJaWYoIWZsYXQpCisJCXsKKwkJCWludGVycG9sYW50ICs9IHggKiAqUG9pbnRlcjxGbG9hdDQ+KHBsYW5lRXF1YXRpb24gKyBPRkZTRVQoUGxhbmVFcXVhdGlvbixBKSwgMTYpICsKKwkJCSAgICAgICAgICAgICAgIHkgKiAqUG9pbnRlcjxGbG9hdDQ+KHBsYW5lRXF1YXRpb24gKyBPRkZTRVQoUGxhbmVFcXVhdGlvbixCKSwgMTYpOworCisJCQlpZihwZXJzcGVjdGl2ZSkKKwkJCXsKKwkJCQlpbnRlcnBvbGFudCAqPSByaHc7CisJCQl9CisJCX0KKworCQlyZXR1cm4gaW50ZXJwb2xhbnQ7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OnN0ZW5jaWxUZXN0KFJlZ2lzdGVycyAmciwgUG9pbnRlcjxCeXRlPiAmc0J1ZmZlciwgaW50IHEsIEludCAmeCwgSW50ICZzTWFzaywgSW50ICZjTWFzaykKKwl7CisJCWlmKCFzdGF0ZS5zdGVuY2lsQWN0aXZlKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyAoU3RlbmNpbFJlZiAmIFN0ZW5jaWxNYXNrKSBDb21wRnVuYyAoU3RlbmNpbEJ1ZmZlclZhbHVlICYgU3RlbmNpbE1hc2spCisKKwkJUG9pbnRlcjxCeXRlPiBidWZmZXIgPSBzQnVmZmVyICsgMiAqIHg7CisKKwkJaWYocSA+IDApCisJCXsKKwkJCWJ1ZmZlciArPSBxICogKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsc3RlbmNpbFNsaWNlQikpOworCQl9CisKKwkJQnl0ZTggdmFsdWUgPSBBczxCeXRlOD4oTG9uZzEoKlBvaW50ZXI8VUludD4oYnVmZmVyKSkpOworCQlCeXRlOCB2YWx1ZUNDVyA9IHZhbHVlOworCisJCWlmKCFzdGF0ZS5ub1N0ZW5jaWxNYXNrKQorCQl7CisJCQl2YWx1ZSAmPSAqUG9pbnRlcjxCeXRlOD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHN0ZW5jaWxbMF0udGVzdE1hc2tRKSk7CisJCX0KKworCQlzdGVuY2lsVGVzdChyLCB2YWx1ZSwgKENvbnRleHQ6OlN0ZW5jaWxDb21wYXJlTW9kZSlzdGF0ZS5zdGVuY2lsQ29tcGFyZU1vZGUsIGZhbHNlKTsKKworCQlpZihzdGF0ZS50d29TaWRlZFN0ZW5jaWwpCisJCXsKKwkJCWlmKCFzdGF0ZS5ub1N0ZW5jaWxNYXNrQ0NXKQorCQkJeworCQkJCXZhbHVlQ0NXICY9ICpQb2ludGVyPEJ5dGU4PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsc3RlbmNpbFsxXS50ZXN0TWFza1EpKTsKKwkJCX0KKworCQkJc3RlbmNpbFRlc3QociwgdmFsdWVDQ1csIChDb250ZXh0OjpTdGVuY2lsQ29tcGFyZU1vZGUpc3RhdGUuc3RlbmNpbENvbXBhcmVNb2RlQ0NXLCB0cnVlKTsKKworCQkJdmFsdWUgJj0gKlBvaW50ZXI8Qnl0ZTg+KHIucHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSxjbG9ja3dpc2VNYXNrKSk7CisJCQl2YWx1ZUNDVyAmPSAqUG9pbnRlcjxCeXRlOD4oci5wcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLGludkNsb2Nrd2lzZU1hc2spKTsKKwkJCXZhbHVlIHw9IHZhbHVlQ0NXOworCQl9CisKKwkJc01hc2sgPSBTaWduTWFzayh2YWx1ZSkgJiBjTWFzazsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6c3RlbmNpbFRlc3QoUmVnaXN0ZXJzICZyLCBCeXRlOCAmdmFsdWUsIENvbnRleHQ6OlN0ZW5jaWxDb21wYXJlTW9kZSBzdGVuY2lsQ29tcGFyZU1vZGUsIGJvb2wgQ0NXKQorCXsKKwkJQnl0ZTggZXF1YWw7CisKKwkJc3dpdGNoKHN0ZW5jaWxDb21wYXJlTW9kZSkKKwkJeworCQljYXNlIENvbnRleHQ6OlNURU5DSUxfQUxXQVlTOgorCQkJdmFsdWUgPSBCeXRlOCgweEZGRkZGRkZGRkZGRkZGRkYpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6U1RFTkNJTF9ORVZFUjoKKwkJCXZhbHVlID0gQnl0ZTgoMHgwMDAwMDAwMDAwMDAwMDAwKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OlNURU5DSUxfTEVTUzoJCQkvLyBhIDwgYiB+IGIgPiBhCisJCQl2YWx1ZSArPSBCeXRlOCgweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwKTsKKwkJCXZhbHVlID0gQ21wR1QoQXM8U0J5dGU4Pih2YWx1ZSksICpQb2ludGVyPFNCeXRlOD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHN0ZW5jaWxbQ0NXXS5yZWZlcmVuY2VNYXNrZWRTaWduZWRRKSkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6U1RFTkNJTF9FUVVBTDoKKwkJCXZhbHVlID0gQ21wRVEodmFsdWUsICpQb2ludGVyPEJ5dGU4PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsc3RlbmNpbFtDQ1ddLnJlZmVyZW5jZU1hc2tlZFEpKSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpTVEVOQ0lMX05PVEVRVUFMOgkJLy8gYSAhPSBiIH4gIShhID09IGIpCisJCQl2YWx1ZSA9IENtcEVRKHZhbHVlLCAqUG9pbnRlcjxCeXRlOD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHN0ZW5jaWxbQ0NXXS5yZWZlcmVuY2VNYXNrZWRRKSkpOworCQkJdmFsdWUgXj0gQnl0ZTgoMHhGRkZGRkZGRkZGRkZGRkZGKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OlNURU5DSUxfTEVTU0VRVUFMOgkvLyBhIDw9IGIgfiAoYiA+IGEpIHx8IChhID09IGIpCisJCQllcXVhbCA9IHZhbHVlOworCQkJZXF1YWwgPSBDbXBFUShlcXVhbCwgKlBvaW50ZXI8Qnl0ZTg+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxzdGVuY2lsW0NDV10ucmVmZXJlbmNlTWFza2VkUSkpKTsKKwkJCXZhbHVlICs9IEJ5dGU4KDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODApOworCQkJdmFsdWUgPSBDbXBHVChBczxTQnl0ZTg+KHZhbHVlKSwgKlBvaW50ZXI8U0J5dGU4PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsc3RlbmNpbFtDQ1ddLnJlZmVyZW5jZU1hc2tlZFNpZ25lZFEpKSk7CisJCQl2YWx1ZSB8PSBlcXVhbDsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OlNURU5DSUxfR1JFQVRFUjoJCS8vIGEgPiBiCisJCQllcXVhbCA9ICpQb2ludGVyPEJ5dGU4PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsc3RlbmNpbFtDQ1ddLnJlZmVyZW5jZU1hc2tlZFNpZ25lZFEpKTsKKwkJCXZhbHVlICs9IEJ5dGU4KDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODApOworCQkJZXF1YWwgPSBDbXBHVChBczxTQnl0ZTg+KGVxdWFsKSwgQXM8U0J5dGU4Pih2YWx1ZSkpOworCQkJdmFsdWUgPSBlcXVhbDsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OlNURU5DSUxfR1JFQVRFUkVRVUFMOgkvLyBhID49IGIgfiAhKGEgPCBiKSB+ICEoYiA+IGEpCisJCQl2YWx1ZSArPSBCeXRlOCgweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwKTsKKwkJCXZhbHVlID0gQ21wR1QoQXM8U0J5dGU4Pih2YWx1ZSksICpQb2ludGVyPFNCeXRlOD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHN0ZW5jaWxbQ0NXXS5yZWZlcmVuY2VNYXNrZWRTaWduZWRRKSkpOworCQkJdmFsdWUgXj0gQnl0ZTgoMHhGRkZGRkZGRkZGRkZGRkZGKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCX0KKworCUJvb2wgUGl4ZWxSb3V0aW5lOjpkZXB0aFRlc3QoUmVnaXN0ZXJzICZyLCBQb2ludGVyPEJ5dGU+ICZ6QnVmZmVyLCBpbnQgcSwgSW50ICZ4LCBGbG9hdDQgJnosIEludCAmc01hc2ssIEludCAmek1hc2ssIEludCAmY01hc2spCisJeworCQlpZighc3RhdGUuZGVwdGhUZXN0QWN0aXZlKQorCQl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCUZsb2F0NCBaID0gejsKKworCQlpZihwaXhlbFNoYWRlciAmJiBwaXhlbFNoYWRlci0+ZGVwdGhPdmVycmlkZSgpKQorCQl7CisJCQlpZihjb21wbGVtZW50YXJ5RGVwdGhCdWZmZXIpCisJCQl7CisJCQkJWiA9IEZsb2F0NCgxLCAxLCAxLCAxKSAtIHIub0RlcHRoOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVogPSByLm9EZXB0aDsKKwkJCX0KKwkJfQorCisJCVBvaW50ZXI8Qnl0ZT4gYnVmZmVyOworCQlJbnQgcGl0Y2g7CisKKwkJaWYoIXN0YXRlLnF1YWRMYXlvdXREZXB0aEJ1ZmZlcikKKwkJeworCQkJYnVmZmVyID0gekJ1ZmZlciArIDQgKiB4OworCQkJcGl0Y2ggPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxkZXB0aFBpdGNoQikpOworCQl9CisJCWVsc2UKKwkJeworCQkJYnVmZmVyID0gekJ1ZmZlciArIDggKiB4OworCQl9CisKKwkJaWYocSA+IDApCisJCXsKKwkJCWJ1ZmZlciArPSBxICogKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZGVwdGhTbGljZUIpKTsKKwkJfQorCisJCUZsb2F0NCB6VmFsdWU7CisKKwkJaWYoc3RhdGUuZGVwdGhDb21wYXJlTW9kZSAhPSBDb250ZXh0OjpERVBUSF9ORVZFUiB8fCAoc3RhdGUuZGVwdGhDb21wYXJlTW9kZSAhPSBDb250ZXh0OjpERVBUSF9BTFdBWVMgJiYgIXN0YXRlLmRlcHRoV3JpdGVFbmFibGUpKQorCQl7CisJCQlpZighc3RhdGUucXVhZExheW91dERlcHRoQnVmZmVyKQorCQkJeworCQkJCS8vIEZJWE1FOiBQcm9wZXJseSBvcHRpbWl6ZXM/CisJCQkJelZhbHVlLnh5ID0gKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIpOworCQkJCXpWYWx1ZS56dyA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyICsgcGl0Y2ggLSA4KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl6VmFsdWUgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlciwgMTYpOworCQkJfQorCQl9CisKKwkJSW50NCB6VGVzdDsKKworCQlzd2l0Y2goc3RhdGUuZGVwdGhDb21wYXJlTW9kZSkKKwkJeworCQljYXNlIENvbnRleHQ6OkRFUFRIX0FMV0FZUzoKKwkJCS8vIE9wdGltaXplZAorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6REVQVEhfTkVWRVI6CisJCQkvLyBPcHRpbWl6ZWQKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRFUFRIX0VRVUFMOgorCQkJelRlc3QgPSBDbXBFUSh6VmFsdWUsIFopOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6REVQVEhfTk9URVFVQUw6CisJCQl6VGVzdCA9IENtcE5FUSh6VmFsdWUsIFopOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6REVQVEhfTEVTUzoKKwkJCWlmKGNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlcikKKwkJCXsKKwkJCQl6VGVzdCA9IENtcExUKHpWYWx1ZSwgWik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJelRlc3QgPSBDbXBOTEUoelZhbHVlLCBaKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRFUFRIX0dSRUFURVJFUVVBTDoKKwkJCWlmKGNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlcikKKwkJCXsKKwkJCQl6VGVzdCA9IENtcE5MVCh6VmFsdWUsIFopOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXpUZXN0ID0gQ21wTEUoelZhbHVlLCBaKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRFUFRIX0xFU1NFUVVBTDoKKwkJCWlmKGNvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlcikKKwkJCXsKKwkJCQl6VGVzdCA9IENtcExFKHpWYWx1ZSwgWik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJelRlc3QgPSBDbXBOTFQoelZhbHVlLCBaKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkRFUFRIX0dSRUFURVI6CisJCQlpZihjb21wbGVtZW50YXJ5RGVwdGhCdWZmZXIpCisJCQl7CisJCQkJelRlc3QgPSBDbXBOTEUoelZhbHVlLCBaKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl6VGVzdCA9IENtcExUKHpWYWx1ZSwgWik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlzd2l0Y2goc3RhdGUuZGVwdGhDb21wYXJlTW9kZSkKKwkJeworCQljYXNlIENvbnRleHQ6OkRFUFRIX0FMV0FZUzoKKwkJCXpNYXNrID0gY01hc2s7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpERVBUSF9ORVZFUjoKKwkJCXpNYXNrID0gMHgwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl6TWFzayA9IFNpZ25NYXNrKHpUZXN0KSAmIGNNYXNrOworCQkJYnJlYWs7CisJCX0KKwkJCisJCWlmKHN0YXRlLnN0ZW5jaWxBY3RpdmUpCisJCXsKKwkJCXpNYXNrICY9IHNNYXNrOworCQl9CisKKwkJcmV0dXJuIHpNYXNrICE9IDA7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OmJsZW5kVGV4dHVyZShSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmN1cnJlbnQsIENvbG9yNGkgJnRlbXAsIENvbG9yNGkgJnRleHR1cmUsIGludCBzdGFnZSkKKwl7CisJCUNvbG9yNGkgKmFyZzE7CisJCUNvbG9yNGkgKmFyZzI7CisJCUNvbG9yNGkgKmFyZzM7CisJCUNvbG9yNGkgcmVzOworCisJCUNvbG9yNGkgY29uc3RhbnQ7CisJCUNvbG9yNGkgdGZhY3RvcjsKKworCQljb25zdCBUZXh0dXJlU3RhZ2U6OlN0YXRlICZ0ZXh0dXJlU3RhZ2UgPSBzdGF0ZS50ZXh0dXJlU3RhZ2Vbc3RhZ2VdOworCisJCWlmKHRleHR1cmVTdGFnZS5maXJzdEFyZ3VtZW50ID09IFRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UIHx8CisJCSAgIHRleHR1cmVTdGFnZS5maXJzdEFyZ3VtZW50QWxwaGEgPT0gVGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ09OU1RBTlQgfHwKKwkJICAgdGV4dHVyZVN0YWdlLnNlY29uZEFyZ3VtZW50ID09IFRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UIHx8CisJCSAgIHRleHR1cmVTdGFnZS5zZWNvbmRBcmd1bWVudEFscGhhID09IFRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UIHx8CisJCSAgIHRleHR1cmVTdGFnZS50aGlyZEFyZ3VtZW50ID09IFRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UIHx8CisJCSAgIHRleHR1cmVTdGFnZS50aGlyZEFyZ3VtZW50QWxwaGEgPT0gVGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ09OU1RBTlQpCisJCXsKKwkJCWNvbnN0YW50LnIgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmNvbnN0YW50Q29sb3I0WzBdKSk7CisJCQljb25zdGFudC5nID0gKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdGV4dHVyZVN0YWdlW3N0YWdlXS5jb25zdGFudENvbG9yNFsxXSkpOworCQkJY29uc3RhbnQuYiA9ICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0uY29uc3RhbnRDb2xvcjRbMl0pKTsKKwkJCWNvbnN0YW50LmEgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmNvbnN0YW50Q29sb3I0WzNdKSk7CisJCX0KKworCQlpZih0ZXh0dXJlU3RhZ2UuZmlyc3RBcmd1bWVudCA9PSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SIHx8CisJCSAgIHRleHR1cmVTdGFnZS5maXJzdEFyZ3VtZW50QWxwaGEgPT0gVGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEZBQ1RPUiB8fAorCQkgICB0ZXh0dXJlU3RhZ2Uuc2Vjb25kQXJndW1lbnQgPT0gVGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEZBQ1RPUiB8fAorCQkgICB0ZXh0dXJlU3RhZ2Uuc2Vjb25kQXJndW1lbnRBbHBoYSA9PSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SIHx8CisJCSAgIHRleHR1cmVTdGFnZS50aGlyZEFyZ3VtZW50ID09IFRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IgfHwKKwkJICAgdGV4dHVyZVN0YWdlLnRoaXJkQXJndW1lbnRBbHBoYSA9PSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SKQorCQl7CisJCQl0ZmFjdG9yLnIgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IudGV4dHVyZUZhY3RvcjRbMF0pKTsKKwkJCXRmYWN0b3IuZyA9ICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci50ZXh0dXJlRmFjdG9yNFsxXSkpOworCQkJdGZhY3Rvci5iID0gKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLnRleHR1cmVGYWN0b3I0WzJdKSk7CisJCQl0ZmFjdG9yLmEgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IudGV4dHVyZUZhY3RvcjRbM10pKTsKKwkJfQorCisJCS8vIFByZW1vZHVsYXRlCisJCWlmKHN0YWdlID4gMCAmJiB0ZXh0dXJlU3RhZ2UudXNlc1RleHR1cmUpCisJCXsKKwkJCWlmKHN0YXRlLnRleHR1cmVTdGFnZVtzdGFnZSAtIDFdLnN0YWdlT3BlcmF0aW9uID09IFRleHR1cmVTdGFnZTo6U1RBR0VfUFJFTU9EVUxBVEUpCisJCQl7CisJCQkJY3VycmVudC5yID0gTXVsSGlnaChjdXJyZW50LnIsIHRleHR1cmUucikgPDwgNDsKKwkJCQljdXJyZW50LmcgPSBNdWxIaWdoKGN1cnJlbnQuZywgdGV4dHVyZS5nKSA8PCA0OworCQkJCWN1cnJlbnQuYiA9IE11bEhpZ2goY3VycmVudC5iLCB0ZXh0dXJlLmIpIDw8IDQ7CisJCQl9CisKKwkJCWlmKHN0YXRlLnRleHR1cmVTdGFnZVtzdGFnZSAtIDFdLnN0YWdlT3BlcmF0aW9uQWxwaGEgPT0gVGV4dHVyZVN0YWdlOjpTVEFHRV9QUkVNT0RVTEFURSkKKwkJCXsKKwkJCQljdXJyZW50LmEgPSBNdWxIaWdoKGN1cnJlbnQuYSwgdGV4dHVyZS5hKSA8PCA0OworCQkJfQorCQl9CisKKwkJaWYobHVtaW5hbmNlKQorCQl7CisJCQl0ZXh0dXJlLnIgPSBNdWxIaWdoKHRleHR1cmUuciwgci5MKSA8PCA0OworCQkJdGV4dHVyZS5nID0gTXVsSGlnaCh0ZXh0dXJlLmcsIHIuTCkgPDwgNDsKKwkJCXRleHR1cmUuYiA9IE11bEhpZ2godGV4dHVyZS5iLCByLkwpIDw8IDQ7CisKKwkJCWx1bWluYW5jZSA9IGZhbHNlOworCQl9CisKKwkJc3dpdGNoKHRleHR1cmVTdGFnZS5maXJzdEFyZ3VtZW50KQorCQl7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRToJYXJnMSA9ICZ0ZXh0dXJlOwkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ09OU1RBTlQ6CWFyZzEgPSAmY29uc3RhbnQ7CQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UOglhcmcxID0gJmN1cnJlbnQ7CQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9ESUZGVVNFOglhcmcxID0gJnIuZGlmZnVzZTsJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX1NQRUNVTEFSOglhcmcxID0gJnIuc3BlY3VsYXI7CQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QOgkJYXJnMSA9ICZ0ZW1wOwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1I6CWFyZzEgPSAmdGZhY3RvcjsJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXN3aXRjaCh0ZXh0dXJlU3RhZ2Uuc2Vjb25kQXJndW1lbnQpCisJCXsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFOglhcmcyID0gJnRleHR1cmU7CQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DT05TVEFOVDoJYXJnMiA9ICZjb25zdGFudDsJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQ6CWFyZzIgPSAmY3VycmVudDsJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0U6CWFyZzIgPSAmci5kaWZmdXNlOwkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVI6CWFyZzIgPSAmci5zcGVjdWxhcjsJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVA6CQlhcmcyID0gJnRlbXA7CQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEZBQ1RPUjoJYXJnMiA9ICZ0ZmFjdG9yOwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJc3dpdGNoKHRleHR1cmVTdGFnZS50aGlyZEFyZ3VtZW50KQorCQl7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRToJYXJnMyA9ICZ0ZXh0dXJlOwkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ09OU1RBTlQ6CWFyZzMgPSAmY29uc3RhbnQ7CQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UOglhcmczID0gJmN1cnJlbnQ7CQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9ESUZGVVNFOglhcmczID0gJnIuZGlmZnVzZTsJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX1NQRUNVTEFSOglhcmczID0gJnIuc3BlY3VsYXI7CQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QOgkJYXJnMyA9ICZ0ZW1wOwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1I6CWFyZzMgPSAmdGZhY3RvcjsJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCUNvbG9yNGkgbW9kMTsKKwkJQ29sb3I0aSBtb2QyOworCQlDb2xvcjRpIG1vZDM7CisKKwkJc3dpdGNoKHRleHR1cmVTdGFnZS5maXJzdE1vZGlmaWVyKQorCQl7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUjoKKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1I6CisJCQl7CisJCQkJbW9kMS5yID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmcxLT5yKTsKKwkJCQltb2QxLmcgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIGFyZzEtPmcpOworCQkJCW1vZDEuYiA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgYXJnMS0+Yik7CisJCQkJbW9kMS5hID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmcxLT5hKTsKKworCQkJCWFyZzEgPSAmbW9kMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQUxQSEE6CisJCQl7CisJCQkJbW9kMS5yID0gYXJnMS0+YTsKKwkJCQltb2QxLmcgPSBhcmcxLT5hOworCQkJCW1vZDEuYiA9IGFyZzEtPmE7CisJCQkJbW9kMS5hID0gYXJnMS0+YTsKKworCQkJCWFyZzEgPSAmbW9kMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQUxQSEE6CisJCQl7CisJCQkJbW9kMS5yID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmcxLT5hKTsKKwkJCQltb2QxLmcgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIGFyZzEtPmEpOworCQkJCW1vZDEuYiA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgYXJnMS0+YSk7CisJCQkJbW9kMS5hID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmcxLT5hKTsKKworCQkJCWFyZzEgPSAmbW9kMTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXN3aXRjaCh0ZXh0dXJlU3RhZ2Uuc2Vjb25kTW9kaWZpZXIpCisJCXsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0NPTE9SOgorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUjoKKwkJCXsKKwkJCQltb2QyLnIgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIGFyZzItPnIpOworCQkJCW1vZDIuZyA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgYXJnMi0+Zyk7CisJCQkJbW9kMi5iID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmcyLT5iKTsKKwkJCQltb2QyLmEgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIGFyZzItPmEpOworCisJCQkJYXJnMiA9ICZtb2QyOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQToKKwkJCXsKKwkJCQltb2QyLnIgPSBhcmcyLT5hOworCQkJCW1vZDIuZyA9IGFyZzItPmE7CisJCQkJbW9kMi5iID0gYXJnMi0+YTsKKwkJCQltb2QyLmEgPSBhcmcyLT5hOworCisJCQkJYXJnMiA9ICZtb2QyOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQToKKwkJCXsKKwkJCQltb2QyLnIgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIGFyZzItPmEpOworCQkJCW1vZDIuZyA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgYXJnMi0+YSk7CisJCQkJbW9kMi5iID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmcyLT5hKTsKKwkJCQltb2QyLmEgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIGFyZzItPmEpOworCisJCQkJYXJnMiA9ICZtb2QyOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJc3dpdGNoKHRleHR1cmVTdGFnZS50aGlyZE1vZGlmaWVyKQorCQl7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUjoKKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1I6CisJCQl7CisJCQkJbW9kMy5yID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmczLT5yKTsKKwkJCQltb2QzLmcgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIGFyZzMtPmcpOworCQkJCW1vZDMuYiA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgYXJnMy0+Yik7CisJCQkJbW9kMy5hID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmczLT5hKTsKKworCQkJCWFyZzMgPSAmbW9kMzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQUxQSEE6CisJCQl7CisJCQkJbW9kMy5yID0gYXJnMy0+YTsKKwkJCQltb2QzLmcgPSBhcmczLT5hOworCQkJCW1vZDMuYiA9IGFyZzMtPmE7CisJCQkJbW9kMy5hID0gYXJnMy0+YTsKKworCQkJCWFyZzMgPSAmbW9kMzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQUxQSEE6CisJCQl7CisJCQkJbW9kMy5yID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmczLT5hKTsKKwkJCQltb2QzLmcgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIGFyZzMtPmEpOworCQkJCW1vZDMuYiA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgYXJnMy0+YSk7CisJCQkJbW9kMy5hID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmczLT5hKTsKKworCQkJCWFyZzMgPSAmbW9kMzsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXN3aXRjaCh0ZXh0dXJlU3RhZ2Uuc3RhZ2VPcGVyYXRpb24pCisJCXsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0RJU0FCTEU6CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzE6CQkJCQkvLyBBcmcxCisJCQl7CisJCQkJcmVzLnIgPSBhcmcxLT5yOworCQkJCXJlcy5nID0gYXJnMS0+ZzsKKwkJCQlyZXMuYiA9IGFyZzEtPmI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzI6CQkJCQkvLyBBcmcyCisJCQl7CisJCQkJcmVzLnIgPSBhcmcyLT5yOworCQkJCXJlcy5nID0gYXJnMi0+ZzsKKwkJCQlyZXMuYiA9IGFyZzItPmI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzM6CQkJCQkvLyBBcmczCisJCQl7CisJCQkJcmVzLnIgPSBhcmczLT5yOworCQkJCXJlcy5nID0gYXJnMy0+ZzsKKwkJCQlyZXMuYiA9IGFyZzMtPmI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFOgkJCQkJLy8gQXJnMSAqIEFyZzIKKwkJCXsKKwkJCQlyZXMuciA9IE11bEhpZ2goYXJnMS0+ciwgYXJnMi0+cikgPDwgNDsKKwkJCQlyZXMuZyA9IE11bEhpZ2goYXJnMS0+ZywgYXJnMi0+ZykgPDwgNDsKKwkJCQlyZXMuYiA9IE11bEhpZ2goYXJnMS0+YiwgYXJnMi0+YikgPDwgNDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUyWDoJCQkJCS8vIEFyZzEgKiBBcmcyICogMgorCQkJeworCQkJCXJlcy5yID0gTXVsSGlnaChhcmcxLT5yLCBhcmcyLT5yKSA8PCA1OworCQkJCXJlcy5nID0gTXVsSGlnaChhcmcxLT5nLCBhcmcyLT5nKSA8PCA1OworCQkJCXJlcy5iID0gTXVsSGlnaChhcmcxLT5iLCBhcmcyLT5iKSA8PCA1OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTRYOgkJCQkJLy8gQXJnMSAqIEFyZzIgKiA0CisJCQl7CisJCQkJcmVzLnIgPSBNdWxIaWdoKGFyZzEtPnIsIGFyZzItPnIpIDw8IDY7CisJCQkJcmVzLmcgPSBNdWxIaWdoKGFyZzEtPmcsIGFyZzItPmcpIDw8IDY7CisJCQkJcmVzLmIgPSBNdWxIaWdoKGFyZzEtPmIsIGFyZzItPmIpIDw8IDY7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERDoJCQkJCQkvLyBBcmcxICsgQXJnMgorCQkJeworCQkJCXJlcy5yID0gQWRkU2F0KGFyZzEtPnIsIGFyZzItPnIpOworCQkJCXJlcy5nID0gQWRkU2F0KGFyZzEtPmcsIGFyZzItPmcpOworCQkJCXJlcy5iID0gQWRkU2F0KGFyZzEtPmIsIGFyZzItPmIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQ6CQkJCQkvLyBBcmcxICsgQXJnMiAtIDAuNQorCQkJeworCQkJCXJlcy5yID0gQWRkU2F0KGFyZzEtPnIsIGFyZzItPnIpOworCQkJCXJlcy5nID0gQWRkU2F0KGFyZzEtPmcsIGFyZzItPmcpOworCQkJCXJlcy5iID0gQWRkU2F0KGFyZzEtPmIsIGFyZzItPmIpOworCisJCQkJcmVzLnIgPSBTdWJTYXQocmVzLnIsIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCQlyZXMuZyA9IFN1YlNhdChyZXMuZywgU2hvcnQ0KDB4MDgwMCwgMHgwODAwLCAweDA4MDAsIDB4MDgwMCkpOworCQkJCXJlcy5iID0gU3ViU2F0KHJlcy5iLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERFNJR05FRDJYOgkJCQkvLyAoQXJnMSArIEFyZzIgLSAwLjUpIDw8IDEKKwkJCXsKKwkJCQlyZXMuciA9IEFkZFNhdChhcmcxLT5yLCBhcmcyLT5yKTsKKwkJCQlyZXMuZyA9IEFkZFNhdChhcmcxLT5nLCBhcmcyLT5nKTsKKwkJCQlyZXMuYiA9IEFkZFNhdChhcmcxLT5iLCBhcmcyLT5iKTsKKworCQkJCXJlcy5yID0gU3ViU2F0KHJlcy5yLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7CisJCQkJcmVzLmcgPSBTdWJTYXQocmVzLmcsIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCQlyZXMuYiA9IFN1YlNhdChyZXMuYiwgU2hvcnQ0KDB4MDgwMCwgMHgwODAwLCAweDA4MDAsIDB4MDgwMCkpOworCisJCQkJcmVzLnIgPSBBZGRTYXQocmVzLnIsIHJlcy5yKTsKKwkJCQlyZXMuZyA9IEFkZFNhdChyZXMuZywgcmVzLmcpOworCQkJCXJlcy5iID0gQWRkU2F0KHJlcy5iLCByZXMuYik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NVQlRSQUNUOgkJCQkJLy8gQXJnMSAtIEFyZzIKKwkJCXsKKwkJCQlyZXMuciA9IFN1YlNhdChhcmcxLT5yLCBhcmcyLT5yKTsKKwkJCQlyZXMuZyA9IFN1YlNhdChhcmcxLT5nLCBhcmcyLT5nKTsKKwkJCQlyZXMuYiA9IFN1YlNhdChhcmcxLT5iLCBhcmcyLT5iKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQUREU01PT1RIOgkJCQkJLy8gQXJnMSArIEFyZzIgLSBBcmcxICogQXJnMgorCQkJeworCQkJCVNob3J0NCB0bXA7CisKKwkJCQl0bXAgPSBNdWxIaWdoKGFyZzEtPnIsIGFyZzItPnIpIDw8IDQ7IHJlcy5yID0gQWRkU2F0KGFyZzEtPnIsIGFyZzItPnIpOyByZXMuciA9IFN1YlNhdChyZXMuciwgdG1wKTsKKwkJCQl0bXAgPSBNdWxIaWdoKGFyZzEtPmcsIGFyZzItPmcpIDw8IDQ7IHJlcy5nID0gQWRkU2F0KGFyZzEtPmcsIGFyZzItPmcpOyByZXMuZyA9IFN1YlNhdChyZXMuZywgdG1wKTsKKwkJCQl0bXAgPSBNdWxIaWdoKGFyZzEtPmIsIGFyZzItPmIpIDw8IDQ7IHJlcy5iID0gQWRkU2F0KGFyZzEtPmIsIGFyZzItPmIpOyByZXMuYiA9IFN1YlNhdChyZXMuYiwgdG1wKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTVVMVElQTFlBREQ6CQkJCS8vIEFyZzMgKyBBcmcxICogQXJnMgorCQkJeworCQkJCXJlcy5yID0gTXVsSGlnaChhcmcxLT5yLCBhcmcyLT5yKSA8PCA0OyByZXMuciA9IEFkZFNhdChyZXMuciwgYXJnMy0+cik7CisJCQkJcmVzLmcgPSBNdWxIaWdoKGFyZzEtPmcsIGFyZzItPmcpIDw8IDQ7IHJlcy5nID0gQWRkU2F0KHJlcy5nLCBhcmczLT5nKTsKKwkJCQlyZXMuYiA9IE11bEhpZ2goYXJnMS0+YiwgYXJnMi0+YikgPDwgNDsgcmVzLmIgPSBBZGRTYXQocmVzLmIsIGFyZzMtPmIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9MRVJQOgkJCQkJCS8vIEFyZzMgKiAoQXJnMSAtIEFyZzIpICsgQXJnMgorCQkJeworCQkJCXJlcy5yID0gU3ViU2F0KGFyZzEtPnIsIGFyZzItPnIpOyByZXMuciA9IE11bEhpZ2gocmVzLnIsIGFyZzMtPnIpIDw8IDQ7IHJlcy5yID0gQWRkU2F0KHJlcy5yLCBhcmcyLT5yKTsKKwkJCQlyZXMuZyA9IFN1YlNhdChhcmcxLT5nLCBhcmcyLT5nKTsgcmVzLmcgPSBNdWxIaWdoKHJlcy5nLCBhcmczLT5nKSA8PCA0OyByZXMuZyA9IEFkZFNhdChyZXMuZywgYXJnMi0+Zyk7CisJCQkJcmVzLmIgPSBTdWJTYXQoYXJnMS0+YiwgYXJnMi0+Yik7IHJlcy5iID0gTXVsSGlnaChyZXMuYiwgYXJnMy0+YikgPDwgNDsgcmVzLmIgPSBBZGRTYXQocmVzLmIsIGFyZzItPmIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9ET1QzOgkJCQkJCS8vIDIgKiAoQXJnMS5yIC0gMC41KSAqIDIgKiAoQXJnMi5yIC0gMC41KSArIDIgKiAoQXJnMS5nIC0gMC41KSAqIDIgKiAoQXJnMi5nIC0gMC41KSArIDIgKiAoQXJnMS5iIC0gMC41KSAqIDIgKiAoQXJnMi5iIC0gMC41KQorCQkJeworCQkJCVNob3J0NCB0bXA7CisKKwkJCQlyZXMuciA9IFN1YlNhdChhcmcxLT5yLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7IHRtcCA9IFN1YlNhdChhcmcyLT5yLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7IHJlcy5yID0gTXVsSGlnaChyZXMuciwgdG1wKTsKKwkJCQlyZXMuZyA9IFN1YlNhdChhcmcxLT5nLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7IHRtcCA9IFN1YlNhdChhcmcyLT5nLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7IHJlcy5nID0gTXVsSGlnaChyZXMuZywgdG1wKTsKKwkJCQlyZXMuYiA9IFN1YlNhdChhcmcxLT5iLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7IHRtcCA9IFN1YlNhdChhcmcyLT5iLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7IHJlcy5iID0gTXVsSGlnaChyZXMuYiwgdG1wKTsKKworCQkJCXJlcy5yID0gcmVzLnIgPDwgNjsKKwkJCQlyZXMuZyA9IHJlcy5nIDw8IDY7CisJCQkJcmVzLmIgPSByZXMuYiA8PCA2OworCisJCQkJcmVzLnIgPSBBZGRTYXQocmVzLnIsIHJlcy5nKTsKKwkJCQlyZXMuciA9IEFkZFNhdChyZXMuciwgcmVzLmIpOworCisJCQkJLy8gQ2xhbXAgdG8gWzAsIDFdCisJCQkJcmVzLnIgPSBNYXgocmVzLnIsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKTsKKwkJCQlyZXMuciA9IE1pbihyZXMuciwgU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOworCisJCQkJcmVzLmcgPSByZXMucjsKKwkJCQlyZXMuYiA9IHJlcy5yOworCQkJCXJlcy5hID0gcmVzLnI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBOgkJCS8vIEFscGhhICogKEFyZzEgLSBBcmcyKSArIEFyZzIKKwkJCXsKKwkJCQlyZXMuciA9IFN1YlNhdChhcmcxLT5yLCBhcmcyLT5yKTsgcmVzLnIgPSBNdWxIaWdoKHJlcy5yLCBjdXJyZW50LmEpIDw8IDQ7IHJlcy5yID0gQWRkU2F0KHJlcy5yLCBhcmcyLT5yKTsKKwkJCQlyZXMuZyA9IFN1YlNhdChhcmcxLT5nLCBhcmcyLT5nKTsgcmVzLmcgPSBNdWxIaWdoKHJlcy5nLCBjdXJyZW50LmEpIDw8IDQ7IHJlcy5nID0gQWRkU2F0KHJlcy5nLCBhcmcyLT5nKTsKKwkJCQlyZXMuYiA9IFN1YlNhdChhcmcxLT5iLCBhcmcyLT5iKTsgcmVzLmIgPSBNdWxIaWdoKHJlcy5iLCBjdXJyZW50LmEpIDw8IDQ7IHJlcy5iID0gQWRkU2F0KHJlcy5iLCBhcmcyLT5iKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRESUZGVVNFQUxQSEE6CQkJLy8gQWxwaGEgKiAoQXJnMSAtIEFyZzIpICsgQXJnMgorCQkJeworCQkJCXJlcy5yID0gU3ViU2F0KGFyZzEtPnIsIGFyZzItPnIpOyByZXMuciA9IE11bEhpZ2gocmVzLnIsIHIuZGlmZnVzZS5hKSA8PCA0OyByZXMuciA9IEFkZFNhdChyZXMuciwgYXJnMi0+cik7CisJCQkJcmVzLmcgPSBTdWJTYXQoYXJnMS0+ZywgYXJnMi0+Zyk7IHJlcy5nID0gTXVsSGlnaChyZXMuZywgci5kaWZmdXNlLmEpIDw8IDQ7IHJlcy5nID0gQWRkU2F0KHJlcy5nLCBhcmcyLT5nKTsKKwkJCQlyZXMuYiA9IFN1YlNhdChhcmcxLT5iLCBhcmcyLT5iKTsgcmVzLmIgPSBNdWxIaWdoKHJlcy5iLCByLmRpZmZ1c2UuYSkgPDwgNDsgcmVzLmIgPSBBZGRTYXQocmVzLmIsIGFyZzItPmIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVOREZBQ1RPUkFMUEhBOgkJCS8vIEFscGhhICogKEFyZzEgLSBBcmcyKSArIEFyZzIKKwkJCXsKKwkJCQlyZXMuciA9IFN1YlNhdChhcmcxLT5yLCBhcmcyLT5yKTsgcmVzLnIgPSBNdWxIaWdoKHJlcy5yLCAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IudGV4dHVyZUZhY3RvcjRbM10pKSkgPDwgNDsgcmVzLnIgPSBBZGRTYXQocmVzLnIsIGFyZzItPnIpOworCQkJCXJlcy5nID0gU3ViU2F0KGFyZzEtPmcsIGFyZzItPmcpOyByZXMuZyA9IE11bEhpZ2gocmVzLmcsICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci50ZXh0dXJlRmFjdG9yNFszXSkpKSA8PCA0OyByZXMuZyA9IEFkZFNhdChyZXMuZywgYXJnMi0+Zyk7CisJCQkJcmVzLmIgPSBTdWJTYXQoYXJnMS0+YiwgYXJnMi0+Yik7IHJlcy5iID0gTXVsSGlnaChyZXMuYiwgKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLnRleHR1cmVGYWN0b3I0WzNdKSkpIDw8IDQ7IHJlcy5iID0gQWRkU2F0KHJlcy5iLCBhcmcyLT5iKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRURVhUVVJFQUxQSEE6CQkJLy8gQWxwaGEgKiAoQXJnMSAtIEFyZzIpICsgQXJnMgorCQkJeworCQkJCXJlcy5yID0gU3ViU2F0KGFyZzEtPnIsIGFyZzItPnIpOyByZXMuciA9IE11bEhpZ2gocmVzLnIsIHRleHR1cmUuYSkgPDwgNDsgcmVzLnIgPSBBZGRTYXQocmVzLnIsIGFyZzItPnIpOworCQkJCXJlcy5nID0gU3ViU2F0KGFyZzEtPmcsIGFyZzItPmcpOyByZXMuZyA9IE11bEhpZ2gocmVzLmcsIHRleHR1cmUuYSkgPDwgNDsgcmVzLmcgPSBBZGRTYXQocmVzLmcsIGFyZzItPmcpOworCQkJCXJlcy5iID0gU3ViU2F0KGFyZzEtPmIsIGFyZzItPmIpOyByZXMuYiA9IE11bEhpZ2gocmVzLmIsIHRleHR1cmUuYSkgPDwgNDsgcmVzLmIgPSBBZGRTYXQocmVzLmIsIGFyZzItPmIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQVBNOgkJLy8gQXJnMSArIEFyZzIgKiAoMSAtIEFscGhhKQorCQkJeworCQkJCXJlcy5yID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCB0ZXh0dXJlLmEpOyByZXMuciA9IE11bEhpZ2gocmVzLnIsIGFyZzItPnIpIDw8IDQ7IHJlcy5yID0gQWRkU2F0KHJlcy5yLCBhcmcxLT5yKTsKKwkJCQlyZXMuZyA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgdGV4dHVyZS5hKTsgcmVzLmcgPSBNdWxIaWdoKHJlcy5nLCBhcmcyLT5nKSA8PCA0OyByZXMuZyA9IEFkZFNhdChyZXMuZywgYXJnMS0+Zyk7CisJCQkJcmVzLmIgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIHRleHR1cmUuYSk7IHJlcy5iID0gTXVsSGlnaChyZXMuYiwgYXJnMi0+YikgPDwgNDsgcmVzLmIgPSBBZGRTYXQocmVzLmIsIGFyZzEtPmIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9QUkVNT0RVTEFURToKKwkJCXsKKwkJCQlyZXMuciA9IGFyZzEtPnI7CisJCQkJcmVzLmcgPSBhcmcxLT5nOworCQkJCXJlcy5iID0gYXJnMS0+YjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVBTFBIQV9BRERDT0xPUjoJCS8vIEFyZzEgKyBBcmcxLmEgKiBBcmcyCisJCQl7CisJCQkJcmVzLnIgPSBNdWxIaWdoKGFyZzEtPmEsIGFyZzItPnIpIDw8IDQ7IHJlcy5yID0gQWRkU2F0KHJlcy5yLCBhcmcxLT5yKTsKKwkJCQlyZXMuZyA9IE11bEhpZ2goYXJnMS0+YSwgYXJnMi0+ZykgPDwgNDsgcmVzLmcgPSBBZGRTYXQocmVzLmcsIGFyZzEtPmcpOworCQkJCXJlcy5iID0gTXVsSGlnaChhcmcxLT5hLCBhcmcyLT5iKSA8PCA0OyByZXMuYiA9IEFkZFNhdChyZXMuYiwgYXJnMS0+Yik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFQ09MT1JfQUREQUxQSEE6CQkvLyBBcmcxICogQXJnMiArIEFyZzEuYQorCQkJeworCQkJCXJlcy5yID0gTXVsSGlnaChhcmcxLT5yLCBhcmcyLT5yKSA8PCA0OyByZXMuciA9IEFkZFNhdChyZXMuciwgYXJnMS0+YSk7CisJCQkJcmVzLmcgPSBNdWxIaWdoKGFyZzEtPmcsIGFyZzItPmcpIDw8IDQ7IHJlcy5nID0gQWRkU2F0KHJlcy5nLCBhcmcxLT5hKTsKKwkJCQlyZXMuYiA9IE11bEhpZ2goYXJnMS0+YiwgYXJnMi0+YikgPDwgNDsgcmVzLmIgPSBBZGRTYXQocmVzLmIsIGFyZzEtPmEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgkvLyAoMSAtIEFyZzEuYSkgKiBBcmcyICsgQXJnMQorCQkJeworCQkJCVNob3J0NCB0bXA7CisKKwkJCQlyZXMuciA9IEFkZFNhdChhcmcxLT5yLCBhcmcyLT5yKTsgdG1wID0gTXVsSGlnaChhcmcxLT5hLCBhcmcyLT5yKSA8PCA0OyByZXMuciA9IFN1YlNhdChyZXMuciwgdG1wKTsKKwkJCQlyZXMuZyA9IEFkZFNhdChhcmcxLT5nLCBhcmcyLT5nKTsgdG1wID0gTXVsSGlnaChhcmcxLT5hLCBhcmcyLT5nKSA8PCA0OyByZXMuZyA9IFN1YlNhdChyZXMuZywgdG1wKTsKKwkJCQlyZXMuYiA9IEFkZFNhdChhcmcxLT5iLCBhcmcyLT5iKTsgdG1wID0gTXVsSGlnaChhcmcxLT5hLCBhcmcyLT5iKSA8PCA0OyByZXMuYiA9IFN1YlNhdChyZXMuYiwgdG1wKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQToJLy8gKDEgLSBBcmcxKSAqIEFyZzIgKyBBcmcxLmEKKwkJCXsKKwkJCQlTaG9ydDQgdG1wOworCisJCQkJcmVzLnIgPSBBZGRTYXQoYXJnMS0+YSwgYXJnMi0+cik7IHRtcCA9IE11bEhpZ2goYXJnMS0+ciwgYXJnMi0+cikgPDwgNDsgcmVzLnIgPSBTdWJTYXQocmVzLnIsIHRtcCk7CisJCQkJcmVzLmcgPSBBZGRTYXQoYXJnMS0+YSwgYXJnMi0+Zyk7IHRtcCA9IE11bEhpZ2goYXJnMS0+ZywgYXJnMi0+ZykgPDwgNDsgcmVzLmcgPSBTdWJTYXQocmVzLmcsIHRtcCk7CisJCQkJcmVzLmIgPSBBZGRTYXQoYXJnMS0+YSwgYXJnMi0+Yik7IHRtcCA9IE11bEhpZ2goYXJnMS0+YiwgYXJnMi0+YikgPDwgNDsgcmVzLmIgPSBTdWJTYXQocmVzLmIsIHRtcCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JVTVBFTlZNQVA6CisJCQl7CisJCQkJci5kdSA9IEZsb2F0NCh0ZXh0dXJlLnIpICogRmxvYXQ0KDEuMGYgLyAweDBGRTAsIDEuMGYgLyAweDBGRTAsIDEuMGYgLyAweDBGRTAsIDEuMGYgLyAweDBGRTApOworCQkJCXIuZHYgPSBGbG9hdDQodGV4dHVyZS5nKSAqIEZsb2F0NCgxLjBmIC8gMHgwRkUwLCAxLjBmIC8gMHgwRkUwLCAxLjBmIC8gMHgwRkUwLCAxLjBmIC8gMHgwRkUwKTsKKwkJCQorCQkJCUZsb2F0NCBkdTI7CisJCQkJRmxvYXQ0IGR2MjsKKworCQkJCWR1MiA9IHIuZHU7CisJCQkJZHYyID0gci5kdjsKKwkJCQlyLmR1ICo9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0uYnVtcG1hcE1hdHJpeDRGWzBdWzBdKSk7CisJCQkJZHYyICo9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0uYnVtcG1hcE1hdHJpeDRGWzFdWzBdKSk7CisJCQkJci5kdSArPSBkdjI7CisJCQkJci5kdiAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0RlsxXVsxXSkpOworCQkJCWR1MiAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0RlswXVsxXSkpOworCQkJCXIuZHYgKz0gZHUyOworCisJCQkJcGVydHVyYmF0ZSA9IHRydWU7CisKKwkJCQlyZXMuciA9IHIuY3VycmVudC5yOworCQkJCXJlcy5nID0gci5jdXJyZW50Lmc7CisJCQkJcmVzLmIgPSByLmN1cnJlbnQuYjsKKwkJCQlyZXMuYSA9IHIuY3VycmVudC5hOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CVU1QRU5WTUFQTFVNSU5BTkNFOgorCQkJeworCQkJCXIuZHUgPSBGbG9hdDQodGV4dHVyZS5yKSAqIEZsb2F0NCgxLjBmIC8gMHgwRkUwLCAxLjBmIC8gMHgwRkUwLCAxLjBmIC8gMHgwRkUwLCAxLjBmIC8gMHgwRkUwKTsKKwkJCQlyLmR2ID0gRmxvYXQ0KHRleHR1cmUuZykgKiBGbG9hdDQoMS4wZiAvIDB4MEZFMCwgMS4wZiAvIDB4MEZFMCwgMS4wZiAvIDB4MEZFMCwgMS4wZiAvIDB4MEZFMCk7CisJCQkKKwkJCQlGbG9hdDQgZHUyOworCQkJCUZsb2F0NCBkdjI7CisKKwkJCQlkdTIgPSByLmR1OworCQkJCWR2MiA9IHIuZHY7CisKKwkJCQlyLmR1ICo9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0uYnVtcG1hcE1hdHJpeDRGWzBdWzBdKSk7CisJCQkJZHYyICo9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0uYnVtcG1hcE1hdHJpeDRGWzFdWzBdKSk7CisJCQkJci5kdSArPSBkdjI7CisJCQkJci5kdiAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0RlsxXVsxXSkpOworCQkJCWR1MiAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0RlswXVsxXSkpOworCQkJCXIuZHYgKz0gZHUyOworCisJCQkJcGVydHVyYmF0ZSA9IHRydWU7CisKKwkJCQlyLkwgPSB0ZXh0dXJlLmI7CisJCQkJci5MID0gTXVsSGlnaChyLkwsICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0ubHVtaW5hbmNlU2NhbGU0KSkpOworCQkJCXIuTCA9IHIuTCA8PCA0OworCQkJCXIuTCA9IEFkZFNhdChyLkwsICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0ubHVtaW5hbmNlT2Zmc2V0NCkpKTsKKwkJCQlyLkwgPSBNYXgoci5MLCBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKSk7CisJCQkJci5MID0gTWluKHIuTCwgU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOworCisJCQkJbHVtaW5hbmNlID0gdHJ1ZTsKKworCQkJCXJlcy5yID0gci5jdXJyZW50LnI7CisJCQkJcmVzLmcgPSByLmN1cnJlbnQuZzsKKwkJCQlyZXMuYiA9IHIuY3VycmVudC5iOworCQkJCXJlcy5hID0gci5jdXJyZW50LmE7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlpZih0ZXh0dXJlU3RhZ2Uuc3RhZ2VPcGVyYXRpb24gIT0gVGV4dHVyZVN0YWdlOjpTVEFHRV9ET1QzKQorCQl7CisJCQlzd2l0Y2godGV4dHVyZVN0YWdlLmZpcnN0QXJndW1lbnRBbHBoYSkKKwkJCXsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRToJYXJnMSA9ICZ0ZXh0dXJlOwkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UOglhcmcxID0gJmNvbnN0YW50OwkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQ6CWFyZzEgPSAmY3VycmVudDsJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9ESUZGVVNFOglhcmcxID0gJnIuZGlmZnVzZTsJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9TUEVDVUxBUjoJYXJnMSA9ICZyLnNwZWN1bGFyOwkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVA6CQlhcmcxID0gJnRlbXA7CQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1I6CWFyZzEgPSAmdGZhY3RvcjsJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCisJCQlzd2l0Y2godGV4dHVyZVN0YWdlLnNlY29uZEFyZ3VtZW50QWxwaGEpCisJCQl7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX1RFWFRVUkU6CWFyZzIgPSAmdGV4dHVyZTsJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DT05TVEFOVDoJYXJnMiA9ICZjb25zdGFudDsJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UOglhcmcyID0gJmN1cnJlbnQ7CQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfRElGRlVTRToJYXJnMiA9ICZyLmRpZmZ1c2U7CQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVI6CWFyZzIgPSAmci5zcGVjdWxhcjsJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QOgkJYXJnMiA9ICZ0ZW1wOwkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SOglhcmcyID0gJnRmYWN0b3I7CQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKworCQkJc3dpdGNoKHRleHR1cmVTdGFnZS50aGlyZEFyZ3VtZW50QWxwaGEpCisJCQl7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U09VUkNFX1RFWFRVUkU6CWFyZzMgPSAmdGV4dHVyZTsJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DT05TVEFOVDoJYXJnMyA9ICZjb25zdGFudDsJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UOglhcmczID0gJmN1cnJlbnQ7CQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfRElGRlVTRToJYXJnMyA9ICZyLmRpZmZ1c2U7CQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVI6CWFyZzMgPSAmci5zcGVjdWxhcjsJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QOgkJYXJnMyA9ICZ0ZW1wOwkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SOglhcmczID0gJnRmYWN0b3I7CQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKworCQkJc3dpdGNoKHRleHR1cmVTdGFnZS5maXJzdE1vZGlmaWVyQWxwaGEpICAgLy8gRklYTUU6IENoZWNrIGlmIGFjdHVhbGx5IHVzZWQKKwkJCXsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUjoKKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUjoKKwkJCQl7CisJCQkJCW1vZDEuYSA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgYXJnMS0+YSk7CisKKwkJCQkJYXJnMSA9ICZtb2QxOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQToKKwkJCQl7CisJCQkJCS8vIFJlZHVkYW50CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBOgorCQkJCXsKKwkJCQkJbW9kMS5hID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmcxLT5hKTsKKworCQkJCQlhcmcxID0gJm1vZDE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCisJCQlzd2l0Y2godGV4dHVyZVN0YWdlLnNlY29uZE1vZGlmaWVyQWxwaGEpICAgLy8gRklYTUU6IENoZWNrIGlmIGFjdHVhbGx5IHVzZWQKKwkJCXsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUjoKKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUjoKKwkJCQl7CisJCQkJCW1vZDIuYSA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgYXJnMi0+YSk7CisKKwkJCQkJYXJnMiA9ICZtb2QyOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQToKKwkJCQl7CisJCQkJCS8vIFJlZHVkYW50CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBOgorCQkJCXsKKwkJCQkJbW9kMi5hID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmcyLT5hKTsKKworCQkJCQlhcmcyID0gJm1vZDI7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCisJCQlzd2l0Y2godGV4dHVyZVN0YWdlLnRoaXJkTW9kaWZpZXJBbHBoYSkgICAvLyBGSVhNRTogQ2hlY2sgaWYgYWN0dWFsbHkgdXNlZAorCQkJeworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0NPTE9SOgorCQkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkNPTE9SOgorCQkJCXsKKwkJCQkJbW9kMy5hID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCBhcmczLT5hKTsKKworCQkJCQlhcmczID0gJm1vZDM7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0FMUEhBOgorCQkJCXsKKwkJCQkJLy8gUmVkdWRhbnQKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQUxQSEE6CisJCQkJeworCQkJCQltb2QzLmEgPSBTdWJTYXQoU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCksIGFyZzMtPmEpOworCisJCQkJCWFyZzMgPSAmbW9kMzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCQorCQkJc3dpdGNoKHRleHR1cmVTdGFnZS5zdGFnZU9wZXJhdGlvbkFscGhhKQorCQkJeworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0RJU0FCTEU6CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMToJCQkJCS8vIEFyZzEKKwkJCQl7CisJCQkJCXJlcy5hID0gYXJnMS0+YTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMjoJCQkJCS8vIEFyZzIKKwkJCQl7CisJCQkJCXJlcy5hID0gYXJnMi0+YTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMzoJCQkJCS8vIEFyZzMKKwkJCQl7CisJCQkJCXJlcy5hID0gYXJnMy0+YTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEU6CQkJCQkvLyBBcmcxICogQXJnMgorCQkJCXsKKwkJCQkJcmVzLmEgPSBNdWxIaWdoKGFyZzEtPmEsIGFyZzItPmEpIDw8IDQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFMlg6CQkJCQkvLyBBcmcxICogQXJnMiAqIDIKKwkJCQl7CisJCQkJCXJlcy5hID0gTXVsSGlnaChhcmcxLT5hLCBhcmcyLT5hKSA8PCA1OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTRYOgkJCQkJLy8gQXJnMSAqIEFyZzIgKiA0CisJCQkJeworCQkJCQlyZXMuYSA9IE11bEhpZ2goYXJnMS0+YSwgYXJnMi0+YSkgPDwgNjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQUREOgkJCQkJCS8vIEFyZzEgKyBBcmcyCisJCQkJeworCQkJCQlyZXMuYSA9IEFkZFNhdChhcmcxLT5hLCBhcmcyLT5hKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEOgkJCQkJLy8gQXJnMSArIEFyZzIgLSAwLjUKKwkJCQl7CisJCQkJCXJlcy5hID0gQWRkU2F0KGFyZzEtPmEsIGFyZzItPmEpOworCQkJCQlyZXMuYSA9IFN1YlNhdChyZXMuYSwgU2hvcnQ0KDB4MDgwMCwgMHgwODAwLCAweDA4MDAsIDB4MDgwMCkpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQyWDoJCQkJCS8vIChBcmcxICsgQXJnMiAtIDAuNSkgPDwgMQorCQkJCXsKKwkJCQkJcmVzLmEgPSBBZGRTYXQoYXJnMS0+YSwgYXJnMi0+YSk7CisJCQkJCXJlcy5hID0gU3ViU2F0KHJlcy5hLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7CisJCQkJCXJlcy5hID0gQWRkU2F0KHJlcy5hLCByZXMuYSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NVQlRSQUNUOgkJCQkJLy8gQXJnMSAtIEFyZzIKKwkJCQl7CisJCQkJCXJlcy5hID0gU3ViU2F0KGFyZzEtPmEsIGFyZzItPmEpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTTU9PVEg6CQkJCQkvLyBBcmcxICsgQXJnMiAtIEFyZzEgKiBBcmcyCisJCQkJeworCQkJCQlTaG9ydDQgdG1wOworCisJCQkJCXRtcCA9IE11bEhpZ2goYXJnMS0+YSwgYXJnMi0+YSkgPDwgNDsgcmVzLmEgPSBBZGRTYXQoYXJnMS0+YSwgYXJnMi0+YSk7IHJlcy5hID0gU3ViU2F0KHJlcy5hLCB0bXApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NVUxUSVBMWUFERDoJCQkJLy8gQXJnMyArIEFyZzEgKiBBcmcyCisJCQkJeworCQkJCQlyZXMuYSA9IE11bEhpZ2goYXJnMS0+YSwgYXJnMi0+YSkgPDwgNDsgcmVzLmEgPSBBZGRTYXQocmVzLmEsIGFyZzMtPmEpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9MRVJQOgkJCQkJCS8vIEFyZzMgKiAoQXJnMSAtIEFyZzIpICsgQXJnMgorCQkJCXsKKwkJCQkJcmVzLmEgPSBTdWJTYXQoYXJnMS0+YSwgYXJnMi0+YSk7IHJlcy5hID0gTXVsSGlnaChyZXMuYSwgYXJnMy0+YSkgPDwgNDsgcmVzLmEgPSBBZGRTYXQocmVzLmEsIGFyZzItPmEpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9ET1QzOgorCQkJCWJyZWFrOyAgIC8vIEFscmVhZHkgY29tcHV0ZWQgaW4gY29sb3IgY2hhbm5lbAorCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBOgkJCS8vIEFscGhhICogKEFyZzEgLSBBcmcyKSArIEFyZzIKKwkJCQl7CisJCQkJCXJlcy5hID0gU3ViU2F0KGFyZzEtPmEsIGFyZzItPmEpOyByZXMuYSA9IE11bEhpZ2gocmVzLmEsIGN1cnJlbnQuYSkgPDwgNDsgcmVzLmEgPSBBZGRTYXQocmVzLmEsIGFyZzItPmEpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORERJRkZVU0VBTFBIQToJCQkvLyBBcmcxICogKEFscGhhKSArIEFyZzIgKiAoMSAtIEFscGhhKQorCQkJCXsKKwkJCQkJcmVzLmEgPSBTdWJTYXQoYXJnMS0+YSwgYXJnMi0+YSk7IHJlcy5hID0gTXVsSGlnaChyZXMuYSwgci5kaWZmdXNlLmEpIDw8IDQ7IHJlcy5hID0gQWRkU2F0KHJlcy5hLCBhcmcyLT5hKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRGQUNUT1JBTFBIQToKKwkJCQl7CisJCQkJCXJlcy5hID0gU3ViU2F0KGFyZzEtPmEsIGFyZzItPmEpOyByZXMuYSA9IE11bEhpZ2gocmVzLmEsICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci50ZXh0dXJlRmFjdG9yNFszXSkpKSA8PCA0OyByZXMuYSA9IEFkZFNhdChyZXMuYSwgYXJnMi0+YSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBOgkJCS8vIEFyZzEgKiAoQWxwaGEpICsgQXJnMiAqICgxIC0gQWxwaGEpCisJCQkJeworCQkJCQlyZXMuYSA9IFN1YlNhdChhcmcxLT5hLCBhcmcyLT5hKTsgcmVzLmEgPSBNdWxIaWdoKHJlcy5hLCB0ZXh0dXJlLmEpIDw8IDQ7IHJlcy5hID0gQWRkU2F0KHJlcy5hLCBhcmcyLT5hKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRURVhUVVJFQUxQSEFQTToJCS8vIEFyZzEgKyBBcmcyICogKDEgLSBBbHBoYSkKKwkJCQl7CisJCQkJCXJlcy5hID0gU3ViU2F0KFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApLCB0ZXh0dXJlLmEpOyByZXMuYSA9IE11bEhpZ2gocmVzLmEsIGFyZzItPmEpIDw8IDQ7IHJlcy5hID0gQWRkU2F0KHJlcy5hLCBhcmcxLT5hKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfUFJFTU9EVUxBVEU6CisJCQkJeworCQkJCQlyZXMuYSA9IGFyZzEtPmE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVDT0xPUl9BRERBTFBIQToKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgorCQkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6CisJCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUDoKKwkJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CVU1QRU5WTUFQTFVNSU5BTkNFOgorCQkJCWJyZWFrOyAgIC8vIEludmFsaWQgYWxwaGEgb3BlcmF0aW9ucworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCQl9CisKKwkJLy8gQ2xhbXAgcmVzdWx0IHRvIFswLCAxXQorCisJCXN3aXRjaCh0ZXh0dXJlU3RhZ2Uuc3RhZ2VPcGVyYXRpb24pCisJCXsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0RJU0FCTEU6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9TRUxFQ1RBUkcxOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMjoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzM6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFMlg6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTRYOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQUREOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTVVMVElQTFlBREQ6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9MRVJQOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRDVVJSRU5UQUxQSEE6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORERJRkZVU0VBTFBIQToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5ERkFDVE9SQUxQSEE6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBUE06CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9ET1QzOiAgIC8vIEFscmVhZHkgY2xhbXBlZAorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfUFJFTU9EVUxBVEU6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUFMUEhBX0FERENPTE9SOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVDT0xPUl9BRERBTFBIQToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1I6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JVTVBFTlZNQVBMVU1JTkFOQ0U6CisJCQlpZihzdGF0ZS50ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmNhbnRVbmRlcmZsb3cpCisJCQl7CisJCQkJYnJlYWs7ICAgLy8gQ2FuJ3QgZ28gYmVsb3cgemVybworCQkJfQorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEMlg6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9TVUJUUkFDVDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERFNNT09USDoKKwkJCXJlcy5yID0gTWF4KHJlcy5yLCBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKSk7CisJCQlyZXMuZyA9IE1heChyZXMuZywgU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCkpOworCQkJcmVzLmIgPSBNYXgocmVzLmIsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXN3aXRjaCh0ZXh0dXJlU3RhZ2Uuc3RhZ2VPcGVyYXRpb25BbHBoYSkKKwkJeworCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfRElTQUJMRToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzE6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9TRUxFQ1RBUkcyOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMzoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUyWDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFNFg6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9BREQ6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NVUxUSVBMWUFERDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0xFUlA6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORENVUlJFTlRBTFBIQToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5ERElGRlVTRUFMUEhBOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRGQUNUT1JBTFBIQToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRURVhUVVJFQUxQSEFQTToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0RPVDM6ICAgLy8gQWxyZWFkeSBjbGFtcGVkCisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9QUkVNT0RVTEFURToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUNPTE9SX0FEREFMUEhBOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUjoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CVU1QRU5WTUFQOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUExVTUlOQU5DRToKKwkJCWlmKHN0YXRlLnRleHR1cmVTdGFnZVtzdGFnZV0uY2FudFVuZGVyZmxvdykKKwkJCXsKKwkJCQlicmVhazsgICAvLyBDYW4ndCBnbyBiZWxvdyB6ZXJvCisJCQl9CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQ6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQyWDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NVQlRSQUNUOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQUREU01PT1RIOgorCQkJcmVzLmEgPSBNYXgocmVzLmEsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXN3aXRjaCh0ZXh0dXJlU3RhZ2Uuc3RhZ2VPcGVyYXRpb24pCisJCXsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0RJU0FCTEU6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9TRUxFQ1RBUkcxOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMjoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzM6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NVQlRSQUNUOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQUREU01PT1RIOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTEVSUDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRESUZGVVNFQUxQSEE6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVOREZBQ1RPUkFMUEhBOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRURVhUVVJFQUxQSEE6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9ET1QzOiAgIC8vIEFscmVhZHkgY2xhbXBlZAorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfUFJFTU9EVUxBVEU6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JVTVBFTlZNQVA6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CVU1QRU5WTUFQTFVNSU5BTkNFOgorCQkJYnJlYWs7ICAgLy8gQ2FuJ3QgZ28gYWJvdmUgb25lCisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTJYOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEU0WDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERFNJR05FRDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERFNJR05FRDJYOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTVVMVElQTFlBREQ6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQVBNOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVBTFBIQV9BRERDT0xPUjoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFQ09MT1JfQUREQUxQSEE6CisJCQlyZXMuciA9IE1pbihyZXMuciwgU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOworCQkJcmVzLmcgPSBNaW4ocmVzLmcsIFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApKTsKKwkJCXJlcy5iID0gTWluKHJlcy5iLCBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlzd2l0Y2godGV4dHVyZVN0YWdlLnN0YWdlT3BlcmF0aW9uQWxwaGEpCisJCXsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0RJU0FCTEU6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9TRUxFQ1RBUkcxOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMjoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzM6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX1NVQlRSQUNUOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQUREU01PT1RIOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTEVSUDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRESUZGVVNFQUxQSEE6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVOREZBQ1RPUkFMUEhBOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRURVhUVVJFQUxQSEE6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9ET1QzOiAgIC8vIEFscmVhZHkgY2xhbXBlZAorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfUFJFTU9EVUxBVEU6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQToKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0JVTVBFTlZNQVA6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CVU1QRU5WTUFQTFVNSU5BTkNFOgorCQkJYnJlYWs7ICAgLy8gQ2FuJ3QgZ28gYWJvdmUgb25lCisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTJYOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEU0WDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERFNJR05FRDoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERFNJR05FRDJYOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTVVMVElQTFlBREQ6CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQVBNOgorCQljYXNlIFRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVBTFBIQV9BRERDT0xPUjoKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFQ09MT1JfQUREQUxQSEE6CisJCQlyZXMuYSA9IE1pbihyZXMuYSwgU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJc3dpdGNoKHRleHR1cmVTdGFnZS5kZXN0aW5hdGlvbkFyZ3VtZW50KQorCQl7CisJCWNhc2UgVGV4dHVyZVN0YWdlOjpERVNUSU5BVElPTl9DVVJSRU5UOgorCQkJY3VycmVudC5yID0gcmVzLnI7CisJCQljdXJyZW50LmcgPSByZXMuZzsKKwkJCWN1cnJlbnQuYiA9IHJlcy5iOworCQkJY3VycmVudC5hID0gcmVzLmE7CisJCQlicmVhazsKKwkJY2FzZSBUZXh0dXJlU3RhZ2U6OkRFU1RJTkFUSU9OX1RFTVA6CisJCQl0ZW1wLnIgPSByZXMucjsKKwkJCXRlbXAuZyA9IHJlcy5nOworCQkJdGVtcC5iID0gcmVzLmI7CisJCQl0ZW1wLmEgPSByZXMuYTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjphbHBoYVRlc3QoUmVnaXN0ZXJzICZyLCBJbnQgJmFNYXNrLCBTaG9ydDQgJmFscGhhKQorCXsKKwkJU2hvcnQ0IGNtcDsKKwkJU2hvcnQ0IGVxdWFsOworCisJCXN3aXRjaChzdGF0ZS5hbHBoYUNvbXBhcmVNb2RlKQorCQl7CisJCWNhc2UgQ29udGV4dDo6QUxQSEFfQUxXQVlTOgorCQkJYU1hc2sgPSAweEY7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpBTFBIQV9ORVZFUjoKKwkJCWFNYXNrID0gMHgwOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QUxQSEFfRVFVQUw6CisJCQljbXAgPSBDbXBFUShhbHBoYSwgKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmFscGhhUmVmZXJlbmNlNCkpKTsKKwkJCWFNYXNrID0gU2lnbk1hc2soUGFjayhjbXAsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpBTFBIQV9OT1RFUVVBTDoJCS8vIGEgIT0gYiB+ICEoYSA9PSBiKQorCQkJY21wID0gQ21wRVEoYWxwaGEsICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5hbHBoYVJlZmVyZW5jZTQpKSkgXiBTaG9ydDQoKHNob3J0KTB4RkZGRiwgKHNob3J0KTB4RkZGRiwgKHNob3J0KTB4RkZGRiwgKHNob3J0KTB4RkZGRik7ICAgLy8gRklYTUUKKwkJCWFNYXNrID0gU2lnbk1hc2soUGFjayhjbXAsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpBTFBIQV9MRVNTOgkJCS8vIGEgPCBiIH4gYiA+IGEKKwkJCWNtcCA9IENtcEdUKCpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5hbHBoYVJlZmVyZW5jZTQpKSwgYWxwaGEpOworCQkJYU1hc2sgPSBTaWduTWFzayhQYWNrKGNtcCwgU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCkpKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkFMUEhBX0dSRUFURVJFUVVBTDoJLy8gYSA+PSBiIH4gKGEgPiBiKSB8fCAoYSA9PSBiKSB+ICEoYiA+IGEpICAgLy8gVE9ETzogQXBwcm94aW1hdGUKKwkJCWVxdWFsID0gQ21wRVEoYWxwaGEsICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5hbHBoYVJlZmVyZW5jZTQpKSk7CisJCQljbXAgPSBDbXBHVChhbHBoYSwgKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmFscGhhUmVmZXJlbmNlNCkpKTsKKwkJCWNtcCB8PSBlcXVhbDsKKwkJCWFNYXNrID0gU2lnbk1hc2soUGFjayhjbXAsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpBTFBIQV9MRVNTRVFVQUw6CQkvLyBhIDw9IGIgfiAhKGEgPiBiKQorCQkJY21wID0gQ21wR1QoYWxwaGEsICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5hbHBoYVJlZmVyZW5jZTQpKSkgXiBTaG9ydDQoKHNob3J0KTB4RkZGRiwgKHNob3J0KTB4RkZGRiwgKHNob3J0KTB4RkZGRiwgKHNob3J0KTB4RkZGRik7ICAgLy8gRklYTUUKKwkJCWFNYXNrID0gU2lnbk1hc2soUGFjayhjbXAsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpBTFBIQV9HUkVBVEVSOgkJCS8vIGEgPiBiCisJCQljbXAgPSBDbXBHVChhbHBoYSwgKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmFscGhhUmVmZXJlbmNlNCkpKTsKKwkJCWFNYXNrID0gU2lnbk1hc2soUGFjayhjbXAsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6YWxwaGFUb0NvdmVyYWdlKFJlZ2lzdGVycyAmciwgSW50IGNNYXNrWzRdLCBGbG9hdDQgJmFscGhhKQorCXsKKwkJSW50NCBjb3ZlcmFnZTAgPSBDbXBOTFQoYWxwaGEsICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGEyYzApKSk7CisJCUludDQgY292ZXJhZ2UxID0gQ21wTkxUKGFscGhhLCAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxhMmMxKSkpOworCQlJbnQ0IGNvdmVyYWdlMiA9IENtcE5MVChhbHBoYSwgKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsYTJjMikpKTsKKwkJSW50NCBjb3ZlcmFnZTMgPSBDbXBOTFQoYWxwaGEsICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGEyYzMpKSk7CisKKwkJSW50IGFNYXNrMCA9IFNpZ25NYXNrKGNvdmVyYWdlMCk7CisJCUludCBhTWFzazEgPSBTaWduTWFzayhjb3ZlcmFnZTEpOworCQlJbnQgYU1hc2syID0gU2lnbk1hc2soY292ZXJhZ2UyKTsKKwkJSW50IGFNYXNrMyA9IFNpZ25NYXNrKGNvdmVyYWdlMyk7CisKKwkJY01hc2tbMF0gJj0gYU1hc2swOworCQljTWFza1sxXSAmPSBhTWFzazE7CisJCWNNYXNrWzJdICY9IGFNYXNrMjsKKwkJY01hc2tbM10gJj0gYU1hc2szOworCX0KKworCUJvb2wgUGl4ZWxSb3V0aW5lOjphbHBoYVRlc3QoUmVnaXN0ZXJzICZyLCBJbnQgY01hc2tbNF0sIENvbG9yNGkgJmN1cnJlbnQpCisJeworCQlpZighc3RhdGUuYWxwaGFUZXN0QWN0aXZlKCkpCisJCXsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJSW50IGFNYXNrOworCisJCWlmKHN0YXRlLnRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyA9PSBDb250ZXh0OjpUUkFOU1BBUkVOQ1lfTk9ORSkKKwkJeworCQkJYWxwaGFUZXN0KHIsIGFNYXNrLCBjdXJyZW50LmEpOworCisJCQlmb3IodW5zaWduZWQgaW50IHEgPSAwOyBxIDwgc3RhdGUubXVsdGlTYW1wbGU7IHErKykKKwkJCXsKKwkJCQljTWFza1txXSAmPSBhTWFzazsKKwkJCX0KKwkJfQorCQllbHNlIGlmKHN0YXRlLnRyYW5zcGFyZW5jeUFudGlhbGlhc2luZyA9PSBDb250ZXh0OjpUUkFOU1BBUkVOQ1lfQUxQSEFfVE9fQ09WRVJBR0UpCisJCXsKKwkJCUZsb2F0NCBhbHBoYSA9IEZsb2F0NChjdXJyZW50LmEpICogRmxvYXQ0KDEuMGYgLyAweDEwMDApOworCisJCQlhbHBoYVRvQ292ZXJhZ2UociwgY01hc2ssIGFscGhhKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisKKwkJSW50IHBhc3MgPSBjTWFza1swXTsKKworCQlmb3IodW5zaWduZWQgaW50IHEgPSAxOyBxIDwgc3RhdGUubXVsdGlTYW1wbGU7IHErKykKKwkJeworCQkJcGFzcyA9IHBhc3MgfCBjTWFza1txXTsKKwkJfQorCisJCXJldHVybiBwYXNzICE9IDB4MDsKKwl9CisKKwlCb29sIFBpeGVsUm91dGluZTo6YWxwaGFUZXN0KFJlZ2lzdGVycyAmciwgSW50IGNNYXNrWzRdLCBDb2xvcjRmICZjMCkKKwl7CisJCWlmKCFzdGF0ZS5hbHBoYVRlc3RBY3RpdmUoKSkKKwkJeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlJbnQgYU1hc2s7CisKKwkJaWYoc3RhdGUudHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nID09IENvbnRleHQ6OlRSQU5TUEFSRU5DWV9OT05FKQorCQl7CisJCQlTaG9ydDQgYWxwaGEgPSBSb3VuZFNob3J0NChjMC5hICogRmxvYXQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOworCisJCQlhbHBoYVRlc3QociwgYU1hc2ssIGFscGhhKTsKKworCQkJZm9yKHVuc2lnbmVkIGludCBxID0gMDsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCQl7CisJCQkJY01hc2tbcV0gJj0gYU1hc2s7CisJCQl9CisJCX0KKwkJZWxzZSBpZihzdGF0ZS50cmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcgPT0gQ29udGV4dDo6VFJBTlNQQVJFTkNZX0FMUEhBX1RPX0NPVkVSQUdFKQorCQl7CisJCQlhbHBoYVRvQ292ZXJhZ2UociwgY01hc2ssIGMwLmEpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKworCQlJbnQgcGFzcyA9IGNNYXNrWzBdOworCisJCWZvcih1bnNpZ25lZCBpbnQgcSA9IDE7IHEgPCBzdGF0ZS5tdWx0aVNhbXBsZTsgcSsrKQorCQl7CisJCQlwYXNzID0gcGFzcyB8IGNNYXNrW3FdOworCQl9CisKKwkJcmV0dXJuIHBhc3MgIT0gMHgwOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpmb2dCbGVuZChSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmN1cnJlbnQsIEZsb2F0NCAmZiwgRmxvYXQ0ICZ6LCBGbG9hdDQgJnJodykKKwl7CisJCWlmKCFzdGF0ZS5mb2dBY3RpdmUpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmKHN0YXRlLnBpeGVsRm9nTW9kZSAhPSBDb250ZXh0OjpGT0dfTk9ORSkKKwkJeworCQkJcGl4ZWxGb2cociwgZiwgeiwgcmh3KTsKKwkJfQorCQkKKwkJVVNob3J0NCBmb2cgPSBjb252ZXJ0Rml4ZWQxNihmLCB0cnVlKTsKKworCQljdXJyZW50LnIgPSBBczxTaG9ydDQ+KE11bEhpZ2goQXM8VVNob3J0ND4oY3VycmVudC5yKSwgZm9nKSk7CisJCWN1cnJlbnQuZyA9IEFzPFNob3J0ND4oTXVsSGlnaChBczxVU2hvcnQ0PihjdXJyZW50LmcpLCBmb2cpKTsKKwkJY3VycmVudC5iID0gQXM8U2hvcnQ0PihNdWxIaWdoKEFzPFVTaG9ydDQ+KGN1cnJlbnQuYiksIGZvZykpOworCisJCVVTaG9ydDQgaW52Rm9nID0gVVNob3J0NCgweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYpIC0gZm9nOworCisJCWN1cnJlbnQuciArPSBBczxTaG9ydDQ+KE11bEhpZ2goaW52Rm9nLCAqUG9pbnRlcjxVU2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZm9nLmNvbG9yNFswXSkpKSk7CisJCWN1cnJlbnQuZyArPSBBczxTaG9ydDQ+KE11bEhpZ2goaW52Rm9nLCAqUG9pbnRlcjxVU2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZm9nLmNvbG9yNFsxXSkpKSk7CisJCWN1cnJlbnQuYiArPSBBczxTaG9ydDQ+KE11bEhpZ2goaW52Rm9nLCAqUG9pbnRlcjxVU2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZm9nLmNvbG9yNFsyXSkpKSk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OmZvZ0JsZW5kKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmYzAsIEZsb2F0NCAmZm9nLCBGbG9hdDQgJnosIEZsb2F0NCAmcmh3KQorCXsKKwkJaWYoIXN0YXRlLmZvZ0FjdGl2ZSkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYoc3RhdGUucGl4ZWxGb2dNb2RlICE9IENvbnRleHQ6OkZPR19OT05FKQorCQl7CisJCQlwaXhlbEZvZyhyLCBmb2csIHosIHJodyk7CisKKwkJCWZvZyA9IE1pbihmb2csIEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSk7CisJCQlmb2cgPSBNYXgoZm9nLCBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworCQl9CisKKwkJYzAuciAtPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmb2cuY29sb3JGWzBdKSk7CisJCWMwLmcgLT0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZm9nLmNvbG9yRlsxXSkpOworCQljMC5iIC09ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZvZy5jb2xvckZbMl0pKTsKKworCQljMC5yICo9IGZvZzsKKwkJYzAuZyAqPSBmb2c7CisJCWMwLmIgKj0gZm9nOworCisJCWMwLnIgKz0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZm9nLmNvbG9yRlswXSkpOworCQljMC5nICs9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZvZy5jb2xvckZbMV0pKTsKKwkJYzAuYiArPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmb2cuY29sb3JGWzJdKSk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OnBpeGVsRm9nKFJlZ2lzdGVycyAmciwgRmxvYXQ0ICZ2aXNpYmlsaXR5LCBGbG9hdDQgJnosIEZsb2F0NCAmcmh3KQorCXsKKwkJRmxvYXQ0ICZ6dyA9IHZpc2liaWxpdHk7CisKKwkJaWYoc3RhdGUucGl4ZWxGb2dNb2RlICE9IENvbnRleHQ6OkZPR19OT05FKQorCQl7CisJCQlpZihzdGF0ZS53QmFzZWRGb2cpCisJCQl7CisJCQkJencgPSByaHc7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoY29tcGxlbWVudGFyeURlcHRoQnVmZmVyKQorCQkJCXsKKwkJCQkJencgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikgLSB6OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl6dyA9IHo7CisJCQkJfQorCQkJfQorCQl9CisKKwkJc3dpdGNoKHN0YXRlLnBpeGVsRm9nTW9kZSkKKwkJeworCQljYXNlIENvbnRleHQ6OkZPR19OT05FOgorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6Rk9HX0xJTkVBUjoKKwkJCXp3ICo9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZvZy5zY2FsZSkpOworCQkJencgKz0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZm9nLm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6Rk9HX0VYUDoKKwkJCXp3ICo9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZvZy5kZW5zaXR5RSkpOworCQkJencgPSBleHBvbmVudGlhbCh6dywgdHJ1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpGT0dfRVhQMjoKKwkJCXp3ICo9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZvZy5kZW5zaXR5RTIpKTsKKwkJCXp3ICo9IHp3OworCQkJencgPSBleHBvbmVudGlhbCh6dywgdHJ1ZSk7CisJCQl6dyA9IFJjcF9wcCh6dyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6c3BlY3VsYXJQaXhlbChDb2xvcjRpICZjdXJyZW50LCBDb2xvcjRpICZzcGVjdWxhcikKKwl7CisJCWlmKCFzdGF0ZS5zcGVjdWxhckFkZCkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJY3VycmVudC5yID0gQWRkU2F0KGN1cnJlbnQuciwgc3BlY3VsYXIucik7CisJCWN1cnJlbnQuZyA9IEFkZFNhdChjdXJyZW50LmcsIHNwZWN1bGFyLmcpOworCQljdXJyZW50LmIgPSBBZGRTYXQoY3VycmVudC5iLCBzcGVjdWxhci5iKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6d3JpdGVEZXB0aChSZWdpc3RlcnMgJnIsIFBvaW50ZXI8Qnl0ZT4gJnpCdWZmZXIsIGludCBxLCBJbnQgJngsIEZsb2F0NCAmeiwgSW50ICZ6TWFzaykKKwl7CisJCWlmKCFzdGF0ZS5kZXB0aFdyaXRlRW5hYmxlKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlGbG9hdDQgWiA9IHo7CisKKwkJaWYocGl4ZWxTaGFkZXIgJiYgcGl4ZWxTaGFkZXItPmRlcHRoT3ZlcnJpZGUoKSkKKwkJeworCQkJaWYoY29tcGxlbWVudGFyeURlcHRoQnVmZmVyKQorCQkJeworCQkJCVogPSBGbG9hdDQoMSwgMSwgMSwgMSkgLSByLm9EZXB0aDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlaID0gci5vRGVwdGg7CisJCQl9CisJCX0KKworCQlQb2ludGVyPEJ5dGU+IGJ1ZmZlcjsKKwkJSW50IHBpdGNoOworCisJCWlmKCFzdGF0ZS5xdWFkTGF5b3V0RGVwdGhCdWZmZXIpCisJCXsJCisJCQlidWZmZXIgPSB6QnVmZmVyICsgNCAqIHg7CisJCQlwaXRjaCA9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGRlcHRoUGl0Y2hCKSk7CisJCX0KKwkJZWxzZQorCQl7CQorCQkJYnVmZmVyID0gekJ1ZmZlciArIDggKiB4OworCQl9CisKKwkJaWYocSA+IDApCisJCXsKKwkJCWJ1ZmZlciArPSBxICogKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZGVwdGhTbGljZUIpKTsKKwkJfQorCisJCUZsb2F0NCB6VmFsdWU7CisKKwkJaWYoc3RhdGUuZGVwdGhDb21wYXJlTW9kZSAhPSBDb250ZXh0OjpERVBUSF9ORVZFUiB8fCAoc3RhdGUuZGVwdGhDb21wYXJlTW9kZSAhPSBDb250ZXh0OjpERVBUSF9BTFdBWVMgJiYgIXN0YXRlLmRlcHRoV3JpdGVFbmFibGUpKQorCQl7CisJCQlpZighc3RhdGUucXVhZExheW91dERlcHRoQnVmZmVyKQorCQkJeworCQkJCS8vIEZJWE1FOiBQcm9wZXJseSBvcHRpbWl6ZXM/CisJCQkJelZhbHVlLnh5ID0gKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIpOworCQkJCXpWYWx1ZS56dyA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyICsgcGl0Y2ggLSA4KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl6VmFsdWUgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlciwgMTYpOworCQkJfQorCQl9CisKKwkJWiA9IEFzPEZsb2F0ND4oQXM8SW50ND4oWikgJiAqUG9pbnRlcjxJbnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza0Q0WCkgKyB6TWFzayAqIDE2LCAxNikpOworCQl6VmFsdWUgPSBBczxGbG9hdDQ+KEFzPEludDQ+KHpWYWx1ZSkgJiAqUG9pbnRlcjxJbnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaW52TWFza0Q0WCkgKyB6TWFzayAqIDE2LCAxNikpOworCQlaID0gQXM8RmxvYXQ0PihBczxJbnQ0PihaKSB8IEFzPEludDQ+KHpWYWx1ZSkpOworCisJCWlmKCFzdGF0ZS5xdWFkTGF5b3V0RGVwdGhCdWZmZXIpCisJCXsKKwkJCS8vIEZJWE1FOiBQcm9wZXJseSBvcHRpbWl6ZXM/CisJCQkqUG9pbnRlcjxGbG9hdDI+KGJ1ZmZlcikgPSBGbG9hdDIoWi54eSk7CisJCQkqUG9pbnRlcjxGbG9hdDI+KGJ1ZmZlciArIHBpdGNoKSA9IEZsb2F0MihaLnp3KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSpQb2ludGVyPEZsb2F0ND4oYnVmZmVyLCAxNikgPSBaOworCQl9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OndyaXRlU3RlbmNpbChSZWdpc3RlcnMgJnIsIFBvaW50ZXI8Qnl0ZT4gJnNCdWZmZXIsIGludCBxLCBJbnQgJngsIEludCAmc01hc2ssIEludCAmek1hc2ssIEludCAmY01hc2spCisJeworCQlpZighc3RhdGUuc3RlbmNpbEFjdGl2ZSkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYoc3RhdGUuc3RlbmNpbFBhc3NPcGVyYXRpb24gPT0gQ29udGV4dDo6T1BFUkFUSU9OX0tFRVAgJiYgc3RhdGUuc3RlbmNpbFpGYWlsT3BlcmF0aW9uID09IENvbnRleHQ6Ok9QRVJBVElPTl9LRUVQICYmIHN0YXRlLnN0ZW5jaWxGYWlsT3BlcmF0aW9uID09IENvbnRleHQ6Ok9QRVJBVElPTl9LRUVQKQorCQl7CisJCQlpZighc3RhdGUudHdvU2lkZWRTdGVuY2lsIHx8IChzdGF0ZS5zdGVuY2lsUGFzc09wZXJhdGlvbkNDVyA9PSBDb250ZXh0OjpPUEVSQVRJT05fS0VFUCAmJiBzdGF0ZS5zdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1cgPT0gQ29udGV4dDo6T1BFUkFUSU9OX0tFRVAgJiYgc3RhdGUuc3RlbmNpbEZhaWxPcGVyYXRpb25DQ1cgPT0gQ29udGV4dDo6T1BFUkFUSU9OX0tFRVApKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCWlmKHN0YXRlLnN0ZW5jaWxXcml0ZU1hc2tlZCAmJiAoIXN0YXRlLnR3b1NpZGVkU3RlbmNpbCB8fCBzdGF0ZS5zdGVuY2lsV3JpdGVNYXNrZWRDQ1cpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlQb2ludGVyPEJ5dGU+IGJ1ZmZlciA9IHNCdWZmZXIgKyAyICogeDsKKworCQlpZihxID4gMCkKKwkJeworCQkJYnVmZmVyICs9IHEgKiAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxzdGVuY2lsU2xpY2VCKSk7CisJCX0KKworCQlCeXRlOCBidWZmZXJWYWx1ZSA9IEFzPEJ5dGU4PihMb25nMSgqUG9pbnRlcjxVSW50PihidWZmZXIpKSk7CisJCisJCUJ5dGU4IG5ld1ZhbHVlOworCQlzdGVuY2lsT3BlcmF0aW9uKHIsIG5ld1ZhbHVlLCBidWZmZXJWYWx1ZSwgKENvbnRleHQ6OlN0ZW5jaWxPcGVyYXRpb24pc3RhdGUuc3RlbmNpbFBhc3NPcGVyYXRpb24sIChDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uKXN0YXRlLnN0ZW5jaWxaRmFpbE9wZXJhdGlvbiwgKENvbnRleHQ6OlN0ZW5jaWxPcGVyYXRpb24pc3RhdGUuc3RlbmNpbEZhaWxPcGVyYXRpb24sIGZhbHNlLCB6TWFzaywgc01hc2spOworCisJCWlmKCFzdGF0ZS5ub1N0ZW5jaWxXcml0ZU1hc2spCisJCXsKKwkJCUJ5dGU4IG1hc2tlZFZhbHVlID0gYnVmZmVyVmFsdWU7CisJCQluZXdWYWx1ZSAmPSAqUG9pbnRlcjxCeXRlOD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHN0ZW5jaWxbMF0ud3JpdGVNYXNrUSkpOworCQkJbWFza2VkVmFsdWUgJj0gKlBvaW50ZXI8Qnl0ZTg+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxzdGVuY2lsWzBdLmludldyaXRlTWFza1EpKTsKKwkJCW5ld1ZhbHVlIHw9IG1hc2tlZFZhbHVlOworCQl9CisKKwkJaWYoc3RhdGUudHdvU2lkZWRTdGVuY2lsKQorCQl7CisJCQlCeXRlOCBuZXdWYWx1ZUNDVzsKKworCQkJc3RlbmNpbE9wZXJhdGlvbihyLCBuZXdWYWx1ZUNDVywgYnVmZmVyVmFsdWUsIChDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uKXN0YXRlLnN0ZW5jaWxQYXNzT3BlcmF0aW9uQ0NXLCAoQ29udGV4dDo6U3RlbmNpbE9wZXJhdGlvbilzdGF0ZS5zdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1csIChDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uKXN0YXRlLnN0ZW5jaWxGYWlsT3BlcmF0aW9uQ0NXLCB0cnVlLCB6TWFzaywgc01hc2spOworCisJCQlpZighc3RhdGUubm9TdGVuY2lsV3JpdGVNYXNrQ0NXKQorCQkJeworCQkJCUJ5dGU4IG1hc2tlZFZhbHVlID0gYnVmZmVyVmFsdWU7CisJCQkJbmV3VmFsdWVDQ1cgJj0gKlBvaW50ZXI8Qnl0ZTg+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxzdGVuY2lsWzFdLndyaXRlTWFza1EpKTsKKwkJCQltYXNrZWRWYWx1ZSAmPSAqUG9pbnRlcjxCeXRlOD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHN0ZW5jaWxbMV0uaW52V3JpdGVNYXNrUSkpOworCQkJCW5ld1ZhbHVlQ0NXIHw9IG1hc2tlZFZhbHVlOworCQkJfQorCisJCQluZXdWYWx1ZSAmPSAqUG9pbnRlcjxCeXRlOD4oci5wcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLGNsb2Nrd2lzZU1hc2spKTsKKwkJCW5ld1ZhbHVlQ0NXICY9ICpQb2ludGVyPEJ5dGU4PihyLnByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsaW52Q2xvY2t3aXNlTWFzaykpOworCQkJbmV3VmFsdWUgfD0gbmV3VmFsdWVDQ1c7CisJCX0KKworCQluZXdWYWx1ZSAmPSAqUG9pbnRlcjxCeXRlOD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tCNFEpICsgOCAqIGNNYXNrKTsKKwkJYnVmZmVyVmFsdWUgJj0gKlBvaW50ZXI8Qnl0ZTg+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrQjRRKSArIDggKiBjTWFzayk7CisJCW5ld1ZhbHVlIHw9IGJ1ZmZlclZhbHVlOworCisJCSpQb2ludGVyPFVJbnQ+KGJ1ZmZlcikgPSBVSW50KEFzPExvbmc+KG5ld1ZhbHVlKSk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OnN0ZW5jaWxPcGVyYXRpb24oUmVnaXN0ZXJzICZyLCBCeXRlOCAmbmV3VmFsdWUsIEJ5dGU4ICZidWZmZXJWYWx1ZSwgQ29udGV4dDo6U3RlbmNpbE9wZXJhdGlvbiBzdGVuY2lsUGFzc09wZXJhdGlvbiwgQ29udGV4dDo6U3RlbmNpbE9wZXJhdGlvbiBzdGVuY2lsWkZhaWxPcGVyYXRpb24sIENvbnRleHQ6OlN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbEZhaWxPcGVyYXRpb24sIGJvb2wgQ0NXLCBJbnQgJnpNYXNrLCBJbnQgJnNNYXNrKQorCXsKKwkJQnl0ZTggJnBhc3MgPSBuZXdWYWx1ZTsKKwkJQnl0ZTggZmFpbDsKKwkJQnl0ZTggekZhaWw7CisKKwkJc3RlbmNpbE9wZXJhdGlvbihyLCBwYXNzLCBidWZmZXJWYWx1ZSwgc3RlbmNpbFBhc3NPcGVyYXRpb24sIENDVyk7CisKKwkJaWYoc3RlbmNpbFpGYWlsT3BlcmF0aW9uICE9IHN0ZW5jaWxQYXNzT3BlcmF0aW9uKQorCQl7CisJCQlzdGVuY2lsT3BlcmF0aW9uKHIsIHpGYWlsLCBidWZmZXJWYWx1ZSwgc3RlbmNpbFpGYWlsT3BlcmF0aW9uLCBDQ1cpOworCQl9CisKKwkJaWYoc3RlbmNpbEZhaWxPcGVyYXRpb24gIT0gc3RlbmNpbFBhc3NPcGVyYXRpb24gfHwgc3RlbmNpbEZhaWxPcGVyYXRpb24gIT0gc3RlbmNpbFpGYWlsT3BlcmF0aW9uKQorCQl7CisJCQlzdGVuY2lsT3BlcmF0aW9uKHIsIGZhaWwsIGJ1ZmZlclZhbHVlLCBzdGVuY2lsRmFpbE9wZXJhdGlvbiwgQ0NXKTsKKwkJfQorCisJCWlmKHN0ZW5jaWxGYWlsT3BlcmF0aW9uICE9IHN0ZW5jaWxQYXNzT3BlcmF0aW9uIHx8IHN0ZW5jaWxGYWlsT3BlcmF0aW9uICE9IHN0ZW5jaWxaRmFpbE9wZXJhdGlvbikKKwkJeworCQkJaWYoc3RhdGUuZGVwdGhUZXN0QWN0aXZlICYmIHN0ZW5jaWxaRmFpbE9wZXJhdGlvbiAhPSBzdGVuY2lsUGFzc09wZXJhdGlvbikgICAvLyB6TWFzayB2YWxpZCBhbmQgdmFsdWVzIG5vdCB0aGUgc2FtZQorCQkJeworCQkJCXBhc3MgJj0gKlBvaW50ZXI8Qnl0ZTg+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrQjRRKSArIDggKiB6TWFzayk7CisJCQkJekZhaWwgJj0gKlBvaW50ZXI8Qnl0ZTg+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrQjRRKSArIDggKiB6TWFzayk7CisJCQkJcGFzcyB8PSB6RmFpbDsKKwkJCX0KKworCQkJcGFzcyAmPSAqUG9pbnRlcjxCeXRlOD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tCNFEpICsgOCAqIHNNYXNrKTsKKwkJCWZhaWwgJj0gKlBvaW50ZXI8Qnl0ZTg+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrQjRRKSArIDggKiBzTWFzayk7CisJCQlwYXNzIHw9IGZhaWw7CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6c3RlbmNpbE9wZXJhdGlvbihSZWdpc3RlcnMgJnIsIEJ5dGU4ICZvdXRwdXQsIEJ5dGU4ICZidWZmZXJWYWx1ZSwgQ29udGV4dDo6U3RlbmNpbE9wZXJhdGlvbiBvcGVyYXRpb24sIGJvb2wgQ0NXKQorCXsKKwkJc3dpdGNoKG9wZXJhdGlvbikKKwkJeworCQljYXNlIENvbnRleHQ6Ok9QRVJBVElPTl9LRUVQOgorCQkJb3V0cHV0ID0gYnVmZmVyVmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpPUEVSQVRJT05fWkVSTzoKKwkJCW91dHB1dCA9IEJ5dGU4KDB4MDAwMDAwMDAwMDAwMDAwMCk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpPUEVSQVRJT05fUkVQTEFDRToKKwkJCW91dHB1dCA9ICpQb2ludGVyPEJ5dGU4PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsc3RlbmNpbFtDQ1ddLnJlZmVyZW5jZVEpKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6Ok9QRVJBVElPTl9JTkNSU0FUOgorCQkJb3V0cHV0ID0gQWRkU2F0KGJ1ZmZlclZhbHVlLCBCeXRlOCgxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpPUEVSQVRJT05fREVDUlNBVDoKKwkJCW91dHB1dCA9IFN1YlNhdChidWZmZXJWYWx1ZSwgQnl0ZTgoMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6T1BFUkFUSU9OX0lOVkVSVDoKKwkJCW91dHB1dCA9IGJ1ZmZlclZhbHVlIF4gQnl0ZTgoMHhGRkZGRkZGRkZGRkZGRkZGKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6Ok9QRVJBVElPTl9JTkNSOgorCQkJb3V0cHV0ID0gYnVmZmVyVmFsdWUgKyBCeXRlOCgxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6Ok9QRVJBVElPTl9ERUNSOgorCQkJb3V0cHV0ID0gYnVmZmVyVmFsdWUgLSBCeXRlOCgxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpzYW1wbGVUZXh0dXJlKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmYywgaW50IGNvb3JkaW5hdGVzLCBpbnQgc3RhZ2UsIGJvb2wgcHJvamVjdCkKKwl7CisJCUZsb2F0NCB1ID0gci52eFsyICsgY29vcmRpbmF0ZXNdOworCQlGbG9hdDQgdiA9IHIudnlbMiArIGNvb3JkaW5hdGVzXTsKKwkJRmxvYXQ0IHcgPSByLnZ6WzIgKyBjb29yZGluYXRlc107CisJCUZsb2F0NCBxID0gci52d1syICsgY29vcmRpbmF0ZXNdOworCisJCWlmKHBlcnR1cmJhdGUpCisJCXsKKwkJCXUgKz0gci5kdTsKKwkJCXYgKz0gci5kdjsKKworCQkJcGVydHVyYmF0ZSA9IGZhbHNlOworCQl9CisKKwkJc2FtcGxlVGV4dHVyZShyLCBjLCBzdGFnZSwgdSwgdiwgdywgcSwgcHJvamVjdCk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OnNhbXBsZVRleHR1cmUoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZjLCBpbnQgc3RhZ2UsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJncsIEZsb2F0NCAmcSwgYm9vbCBwcm9qZWN0LCBib29sIGJpYXMsIGJvb2wgZml4ZWQxMikKKwl7CisJCUNvbG9yNGYgZHN4OworCQlDb2xvcjRmIGRzeTsKKworCQlzYW1wbGVUZXh0dXJlKHIsIGMsIHN0YWdlLCB1LCB2LCB3LCBxLCBkc3gsIGRzeSwgcHJvamVjdCwgYmlhcywgZml4ZWQxMiwgZmFsc2UpOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpzYW1wbGVUZXh0dXJlKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmYywgaW50IHN0YWdlLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdDQgJnEsIENvbG9yNGYgJmRzeCwgQ29sb3I0ZiAmZHN5LCBib29sIHByb2plY3QsIGJvb2wgYmlhcywgYm9vbCBmaXhlZDEyLCBib29sIGdyYWRpZW50cywgYm9vbCBsb2RQcm92aWRlZCkKKwl7CisJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCUxvbmcgdGV4VGltZSA9IFRpY2tzKCk7CisJCSNlbmRpZgorCisJCVBvaW50ZXI8Qnl0ZT4gdGV4dHVyZSA9IHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxtaXBtYXApICsgc3RhZ2UgKiBzaXplb2YoVGV4dHVyZSk7CisKKwkJaWYoIXByb2plY3QpCisJCXsKKwkJCXNhbXBsZXJbc3RhZ2VdLT5zYW1wbGVUZXh0dXJlKHRleHR1cmUsIGMsIHUsIHYsIHcsIHEsIGRzeCwgZHN5LCBiaWFzLCBmaXhlZDEyLCBncmFkaWVudHMsIGxvZFByb3ZpZGVkKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZsb2F0NCBycSA9IHJlY2lwcm9jYWwocSk7CisKKwkJCUZsb2F0NCB1X3EgPSB1ICogcnE7CisJCQlGbG9hdDQgdl9xID0gdiAqIHJxOworCQkJRmxvYXQ0IHdfcSA9IHcgKiBycTsKKworCQkJc2FtcGxlcltzdGFnZV0tPnNhbXBsZVRleHR1cmUodGV4dHVyZSwgYywgdV9xLCB2X3EsIHdfcSwgcSwgZHN4LCBkc3ksIGJpYXMsIGZpeGVkMTIsIGdyYWRpZW50cywgbG9kUHJvdmlkZWQpOworCQl9CisKKwkJI2lmIFBFUkZfUFJPRklMRQorCQkJci5jeWNsZXNbUEVSRl9URVhdICs9IFRpY2tzKCkgLSB0ZXhUaW1lOworCQkjZW5kaWYKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6c2FtcGxlVGV4dHVyZShSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmMsIGludCBzdGFnZSwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmdywgRmxvYXQ0ICZxLCBDb2xvcjRmICZkc3gsIENvbG9yNGYgJmRzeSwgYm9vbCBwcm9qZWN0LCBib29sIGJpYXMsIGJvb2wgZ3JhZGllbnRzLCBib29sIGxvZFByb3ZpZGVkKQorCXsKKwkJI2lmIFBFUkZfUFJPRklMRQorCQkJTG9uZyB0ZXhUaW1lID0gVGlja3MoKTsKKwkJI2VuZGlmCisKKwkJUG9pbnRlcjxCeXRlPiB0ZXh0dXJlID0gci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLG1pcG1hcCkgKyBzdGFnZSAqIHNpemVvZihUZXh0dXJlKTsKKworCQlpZighcHJvamVjdCkKKwkJeworCQkJc2FtcGxlcltzdGFnZV0tPnNhbXBsZVRleHR1cmUodGV4dHVyZSwgYywgdSwgdiwgdywgcSwgZHN4LCBkc3ksIGJpYXMsIGdyYWRpZW50cywgbG9kUHJvdmlkZWQpOworCQl9CisJCWVsc2UKKwkJeworCQkJRmxvYXQ0IHJxID0gcmVjaXByb2NhbChxKTsKKworCQkJRmxvYXQ0IHVfcSA9IHUgKiBycTsKKwkJCUZsb2F0NCB2X3EgPSB2ICogcnE7CisJCQlGbG9hdDQgd19xID0gdyAqIHJxOworCisJCQlzYW1wbGVyW3N0YWdlXS0+c2FtcGxlVGV4dHVyZSh0ZXh0dXJlLCBjLCB1X3EsIHZfcSwgd19xLCBxLCBkc3gsIGRzeSwgYmlhcywgZ3JhZGllbnRzLCBsb2RQcm92aWRlZCk7CisJCX0KKworCQkjaWYgUEVSRl9QUk9GSUxFCisJCQlyLmN5Y2xlc1tQRVJGX1RFWF0gKz0gVGlja3MoKSAtIHRleFRpbWU7CisJCSNlbmRpZgorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpjbGFtcENvbG9yKENvbG9yNGYgb0NbNF0pCisJeworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKQorCQl7CisJCQlpZighc3RhdGUuY29sb3JXcml0ZUFjdGl2ZShpbmRleCkgJiYgIShpbmRleCA9PSAwICYmIHN0YXRlLmFscGhhVGVzdEFjdGl2ZSgpKSkKKwkJCXsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3dpdGNoKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0pCisJCQl7CisJCQljYXNlIEZPUk1BVF9OVUxMOgorCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2OgorCQkJY2FzZSBGT1JNQVRfQThSOEc4Qjg6CisJCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJCWNhc2UgRk9STUFUX0cxNlIxNjoKKwkJCQlvQ1tpbmRleF0uciA9IE1heChvQ1tpbmRleF0uciwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsgb0NbaW5kZXhdLnIgPSBNaW4ob0NbaW5kZXhdLnIsIEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSk7CisJCQkJb0NbaW5kZXhdLmcgPSBNYXgob0NbaW5kZXhdLmcsIEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSk7IG9DW2luZGV4XS5nID0gTWluKG9DW2luZGV4XS5nLCBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikpOworCQkJCW9DW2luZGV4XS5iID0gTWF4KG9DW2luZGV4XS5iLCBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOyBvQ1tpbmRleF0uYiA9IE1pbihvQ1tpbmRleF0uYiwgRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpKTsKKwkJCQlvQ1tpbmRleF0uYSA9IE1heChvQ1tpbmRleF0uYSwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsgb0NbaW5kZXhdLmEgPSBNaW4ob0NbaW5kZXhdLmEsIEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9SMzJGOgorCQkJY2FzZSBGT1JNQVRfRzMyUjMyRjoKKwkJCWNhc2UgRk9STUFUX0EzMkIzMkczMlIzMkY6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6cmFzdGVyT3BlcmF0aW9uKENvbG9yNGkgJmN1cnJlbnQsIFJlZ2lzdGVycyAmciwgRmxvYXQ0ICZmb2csIFBvaW50ZXI8Qnl0ZT4gJmNCdWZmZXIsIEludCAmeCwgSW50IHNNYXNrWzRdLCBJbnQgek1hc2tbNF0sIEludCBjTWFza1s0XSkKKwl7CisJCWlmKCFzdGF0ZS5jb2xvcldyaXRlQWN0aXZlKDApKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlDb2xvcjRmIG9DOworCisJCXN3aXRjaChzdGF0ZS50YXJnZXRGb3JtYXRbMF0pCisJCXsKKwkJY2FzZSBGT1JNQVRfWDhSOEc4Qjg6CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNjoKKwkJCWlmKCFwb3N0QmxlbmRTUkdCICYmIHN0YXRlLndyaXRlU1JHQikKKwkJCXsKKwkJCQlsaW5lYXJUb1NSR0IxMl8xNihyLCBjdXJyZW50KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljdXJyZW50LnIgPDw9IDQ7CisJCQkJY3VycmVudC5nIDw8PSA0OworCQkJCWN1cnJlbnQuYiA8PD0gNDsKKwkJCQljdXJyZW50LmEgPDw9IDQ7CisJCQl9CisKKwkJCWZvZ0JsZW5kKHIsIGN1cnJlbnQsIGZvZywgci56WzBdLCByLnJodyk7CisKKwkJCWZvcih1bnNpZ25lZCBpbnQgcSA9IDA7IHEgPCBzdGF0ZS5tdWx0aVNhbXBsZTsgcSsrKQorCQkJeworCQkJCVBvaW50ZXI8Qnl0ZT4gYnVmZmVyID0gY0J1ZmZlciArIHEgKiAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclNsaWNlQlswXSkpOworCQkJCUNvbG9yNGkgY29sb3IgPSBjdXJyZW50OworCisJCQkJaWYoc3RhdGUubXVsdGlTYW1wbGVNYXNrICYgKDEgPDwgcSkpCisJCQkJeworCQkJCQlhbHBoYUJsZW5kKHIsIDAsIGJ1ZmZlciwgY29sb3IsIHgpOworCQkJCQl3cml0ZUNvbG9yKHIsIDAsIGJ1ZmZlciwgeCwgY29sb3IsIHNNYXNrW3FdLCB6TWFza1txXSwgY01hc2tbcV0pOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9SMzJGOgorCQljYXNlIEZPUk1BVF9HMzJSMzJGOgorCQljYXNlIEZPUk1BVF9BMzJCMzJHMzJSMzJGOgorCQkJY29udmVydFNpZ25lZDEyKG9DLCBjdXJyZW50KTsKKwkJCWZvZ0JsZW5kKHIsIG9DLCBmb2csIHIuelswXSwgci5yaHcpOworCQkJCisJCQlmb3IodW5zaWduZWQgaW50IHEgPSAwOyBxIDwgc3RhdGUubXVsdGlTYW1wbGU7IHErKykKKwkJCXsKKwkJCQlQb2ludGVyPEJ5dGU+IGJ1ZmZlciA9IGNCdWZmZXIgKyBxICogKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsY29sb3JTbGljZUJbMF0pKTsKKwkJCQlDb2xvcjRmIGNvbG9yID0gb0M7CisKKwkJCQlpZihzdGF0ZS5tdWx0aVNhbXBsZU1hc2sgJiAoMSA8PCBxKSkKKwkJCQl7CisJCQkJCWFscGhhQmxlbmQociwgMCwgYnVmZmVyLCBjb2xvciwgeCk7CisJCQkJCXdyaXRlQ29sb3IociwgMCwgYnVmZmVyLCB4LCBjb2xvciwgc01hc2tbcV0sIHpNYXNrW3FdLCBjTWFza1txXSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OnJhc3Rlck9wZXJhdGlvbihDb2xvcjRmIG9DWzRdLCBSZWdpc3RlcnMgJnIsIEZsb2F0NCAmZm9nLCBQb2ludGVyPEJ5dGU+IGNCdWZmZXJbNF0sIEludCAmeCwgSW50IHNNYXNrWzRdLCBJbnQgek1hc2tbNF0sIEludCBjTWFza1s0XSkKKwl7CisJCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspCisJCXsKKwkJCWlmKCFzdGF0ZS5jb2xvcldyaXRlQWN0aXZlKGluZGV4KSkKKwkJCXsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYoIXBvc3RCbGVuZFNSR0IgJiYgc3RhdGUud3JpdGVTUkdCKQorCQkJeworCQkJCW9DW2luZGV4XS5yID0gbGluZWFyVG9TUkdCKG9DW2luZGV4XS5yKTsKKwkJCQlvQ1tpbmRleF0uZyA9IGxpbmVhclRvU1JHQihvQ1tpbmRleF0uZyk7CisJCQkJb0NbaW5kZXhdLmIgPSBsaW5lYXJUb1NSR0Iob0NbaW5kZXhdLmIpOworCQkJfQorCisJCQlpZihpbmRleCA9PSAwKQorCQkJeworCQkJCWZvZ0JsZW5kKHIsIG9DW2luZGV4XSwgZm9nLCByLnpbMF0sIHIucmh3KTsKKwkJCX0KKworCQkJc3dpdGNoKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0pCisJCQl7CisJCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQkJY2FzZSBGT1JNQVRfRzE2UjE2OgorCQkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2OgorCQkJCWZvcih1bnNpZ25lZCBpbnQgcSA9IDA7IHEgPCBzdGF0ZS5tdWx0aVNhbXBsZTsgcSsrKQorCQkJCXsKKwkJCQkJUG9pbnRlcjxCeXRlPiBidWZmZXIgPSBjQnVmZmVyW2luZGV4XSArIHEgKiAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclNsaWNlQltpbmRleF0pKTsKKwkJCQkJQ29sb3I0aSBjb2xvcjsKKworCQkJCQljb2xvci5yID0gY29udmVydEZpeGVkMTYob0NbaW5kZXhdLnIsIGZhbHNlKTsKKwkJCQkJY29sb3IuZyA9IGNvbnZlcnRGaXhlZDE2KG9DW2luZGV4XS5nLCBmYWxzZSk7CisJCQkJCWNvbG9yLmIgPSBjb252ZXJ0Rml4ZWQxNihvQ1tpbmRleF0uYiwgZmFsc2UpOworCQkJCQljb2xvci5hID0gY29udmVydEZpeGVkMTYob0NbaW5kZXhdLmEsIGZhbHNlKTsKKworCQkJCQlpZihzdGF0ZS5tdWx0aVNhbXBsZU1hc2sgJiAoMSA8PCBxKSkKKwkJCQkJeworCQkJCQkJYWxwaGFCbGVuZChyLCBpbmRleCwgYnVmZmVyLCBjb2xvciwgeCk7CisJCQkJCQl3cml0ZUNvbG9yKHIsIGluZGV4LCBidWZmZXIsIHgsIGNvbG9yLCBzTWFza1txXSwgek1hc2tbcV0sIGNNYXNrW3FdKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1IzMkY6CisJCQljYXNlIEZPUk1BVF9HMzJSMzJGOgorCQkJY2FzZSBGT1JNQVRfQTMyQjMyRzMyUjMyRjoKKwkJCQlmb3IodW5zaWduZWQgaW50IHEgPSAwOyBxIDwgc3RhdGUubXVsdGlTYW1wbGU7IHErKykKKwkJCQl7CisJCQkJCVBvaW50ZXI8Qnl0ZT4gYnVmZmVyID0gY0J1ZmZlcltpbmRleF0gKyBxICogKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsY29sb3JTbGljZUJbaW5kZXhdKSk7CisJCQkJCUNvbG9yNGYgY29sb3IgPSBvQ1tpbmRleF07CisKKwkJCQkJaWYoc3RhdGUubXVsdGlTYW1wbGVNYXNrICYgKDEgPDwgcSkpCisJCQkJCXsKKwkJCQkJCWFscGhhQmxlbmQociwgaW5kZXgsIGJ1ZmZlciwgY29sb3IsIHgpOworCQkJCQkJd3JpdGVDb2xvcihyLCBpbmRleCwgYnVmZmVyLCB4LCBjb2xvciwgc01hc2tbcV0sIHpNYXNrW3FdLCBjTWFza1txXSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6YmxlbmRGYWN0b3IoUmVnaXN0ZXJzICZyLCBjb25zdCBDb2xvcjRpICZibGVuZEZhY3RvciwgY29uc3QgQ29sb3I0aSAmY3VycmVudCwgY29uc3QgQ29sb3I0aSAmcGl4ZWwsIENvbnRleHQ6OkJsZW5kRmFjdG9yIGJsZW5kRmFjdG9yQWN0aXZlKQorCXsKKwkJc3dpdGNoKGJsZW5kRmFjdG9yQWN0aXZlKQorCQl7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfWkVSTzoKKwkJCS8vIE9wdGltaXplZAorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfT05FOgorCQkJLy8gT3B0aW1pemVkCisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9TT1VSQ0U6CisJCQlibGVuZEZhY3Rvci5yID0gY3VycmVudC5yOworCQkJYmxlbmRGYWN0b3IuZyA9IGN1cnJlbnQuZzsKKwkJCWJsZW5kRmFjdG9yLmIgPSBjdXJyZW50LmI7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0U6CisJCQlibGVuZEZhY3Rvci5yID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBjdXJyZW50LnI7CisJCQlibGVuZEZhY3Rvci5nID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBjdXJyZW50Lmc7CisJCQlibGVuZEZhY3Rvci5iID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBjdXJyZW50LmI7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9ERVNUOgorCQkJYmxlbmRGYWN0b3IuciA9IHBpeGVsLnI7CisJCQlibGVuZEZhY3Rvci5nID0gcGl4ZWwuZzsKKwkJCWJsZW5kRmFjdG9yLmIgPSBwaXhlbC5iOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfSU5WREVTVDoKKwkJCWJsZW5kRmFjdG9yLnIgPSBTaG9ydDQoMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGKSAtIHBpeGVsLnI7CisJCQlibGVuZEZhY3Rvci5nID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBwaXhlbC5nOworCQkJYmxlbmRGYWN0b3IuYiA9IFNob3J0NCgweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYpIC0gcGl4ZWwuYjsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBOgorCQkJYmxlbmRGYWN0b3IuciA9IGN1cnJlbnQuYTsKKwkJCWJsZW5kRmFjdG9yLmcgPSBjdXJyZW50LmE7CisJCQlibGVuZEZhY3Rvci5iID0gY3VycmVudC5hOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfSU5WU09VUkNFQUxQSEE6CisJCQlibGVuZEZhY3Rvci5yID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBjdXJyZW50LmE7CisJCQlibGVuZEZhY3Rvci5nID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBjdXJyZW50LmE7CisJCQlibGVuZEZhY3Rvci5iID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBjdXJyZW50LmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9ERVNUQUxQSEE6CisJCQlibGVuZEZhY3Rvci5yID0gcGl4ZWwuYTsKKwkJCWJsZW5kRmFjdG9yLmcgPSBwaXhlbC5hOworCQkJYmxlbmRGYWN0b3IuYiA9IHBpeGVsLmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9JTlZERVNUQUxQSEE6CisJCQlibGVuZEZhY3Rvci5yID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBwaXhlbC5hOworCQkJYmxlbmRGYWN0b3IuZyA9IFNob3J0NCgweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYpIC0gcGl4ZWwuYTsKKwkJCWJsZW5kRmFjdG9yLmIgPSBTaG9ydDQoMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGKSAtIHBpeGVsLmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9TUkNBTFBIQVNBVDoKKwkJCWJsZW5kRmFjdG9yLnIgPSBTaG9ydDQoMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGKSAtIHBpeGVsLmE7CisJCQlibGVuZEZhY3Rvci5yID0gTWluKEFzPFVTaG9ydDQ+KGJsZW5kRmFjdG9yLnIpLCBBczxVU2hvcnQ0PihjdXJyZW50LmEpKTsKKwkJCWJsZW5kRmFjdG9yLmcgPSBibGVuZEZhY3Rvci5yOworCQkJYmxlbmRGYWN0b3IuYiA9IGJsZW5kRmFjdG9yLnI7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9DT05TVEFOVDoKKwkJCWJsZW5kRmFjdG9yLnIgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IuYmxlbmRDb25zdGFudDRXWzBdKSk7CisJCQlibGVuZEZhY3Rvci5nID0gKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmJsZW5kQ29uc3RhbnQ0V1sxXSkpOworCQkJYmxlbmRGYWN0b3IuYiA9ICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5ibGVuZENvbnN0YW50NFdbMl0pKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0lOVkNPTlNUQU5UOgorCQkJYmxlbmRGYWN0b3IuciA9ICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5pbnZCbGVuZENvbnN0YW50NFdbMF0pKTsKKwkJCWJsZW5kRmFjdG9yLmcgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IuaW52QmxlbmRDb25zdGFudDRXWzFdKSk7CisJCQlibGVuZEZhY3Rvci5iID0gKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0V1syXSkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfQ09OU1RBTlRBTFBIQToKKwkJCWJsZW5kRmFjdG9yLnIgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IuYmxlbmRDb25zdGFudDRXWzNdKSk7CisJCQlibGVuZEZhY3Rvci5nID0gKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmJsZW5kQ29uc3RhbnQ0V1szXSkpOworCQkJYmxlbmRGYWN0b3IuYiA9ICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5ibGVuZENvbnN0YW50NFdbM10pKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0lOVkNPTlNUQU5UQUxQSEE6CisJCQlibGVuZEZhY3Rvci5yID0gKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0V1szXSkpOworCQkJYmxlbmRGYWN0b3IuZyA9ICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5pbnZCbGVuZENvbnN0YW50NFdbM10pKTsKKwkJCWJsZW5kRmFjdG9yLmIgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IuaW52QmxlbmRDb25zdGFudDRXWzNdKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKwl9CisJCisJdm9pZCBQaXhlbFJvdXRpbmU6OmJsZW5kRmFjdG9yQWxwaGEoUmVnaXN0ZXJzICZyLCBjb25zdCBDb2xvcjRpICZibGVuZEZhY3RvciwgY29uc3QgQ29sb3I0aSAmY3VycmVudCwgY29uc3QgQ29sb3I0aSAmcGl4ZWwsIENvbnRleHQ6OkJsZW5kRmFjdG9yIGJsZW5kRmFjdG9yQWxwaGFBY3RpdmUpCisJeworCQlzd2l0Y2goYmxlbmRGYWN0b3JBbHBoYUFjdGl2ZSkKKwkJeworCQljYXNlIENvbnRleHQ6OkJMRU5EX1pFUk86CisJCQkvLyBPcHRpbWl6ZWQKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX09ORToKKwkJCS8vIE9wdGltaXplZAorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfU09VUkNFOgorCQkJYmxlbmRGYWN0b3IuYSA9IGN1cnJlbnQuYTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0lOVlNPVVJDRToKKwkJCWJsZW5kRmFjdG9yLmEgPSBTaG9ydDQoMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGKSAtIGN1cnJlbnQuYTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0RFU1Q6CisJCQlibGVuZEZhY3Rvci5hID0gcGl4ZWwuYTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0lOVkRFU1Q6CisJCQlibGVuZEZhY3Rvci5hID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBwaXhlbC5hOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfU09VUkNFQUxQSEE6CisJCQlibGVuZEZhY3Rvci5hID0gY3VycmVudC5hOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfSU5WU09VUkNFQUxQSEE6CisJCQlibGVuZEZhY3Rvci5hID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRikgLSBjdXJyZW50LmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9ERVNUQUxQSEE6CisJCQlibGVuZEZhY3Rvci5hID0gcGl4ZWwuYTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0lOVkRFU1RBTFBIQToKKwkJCWJsZW5kRmFjdG9yLmEgPSBTaG9ydDQoMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGKSAtIHBpeGVsLmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9TUkNBTFBIQVNBVDoKKwkJCWJsZW5kRmFjdG9yLmEgPSBTaG9ydDQoMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0NPTlNUQU5UOgorCQljYXNlIENvbnRleHQ6OkJMRU5EX0NPTlNUQU5UQUxQSEE6CisJCQlibGVuZEZhY3Rvci5hID0gKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmJsZW5kQ29uc3RhbnQ0V1szXSkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfSU5WQ09OU1RBTlQ6CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfSU5WQ09OU1RBTlRBTFBIQToKKwkJCWJsZW5kRmFjdG9yLmEgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IuaW52QmxlbmRDb25zdGFudDRXWzNdKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6YWxwaGFCbGVuZChSZWdpc3RlcnMgJnIsIGludCBpbmRleCwgUG9pbnRlcjxCeXRlPiAmY0J1ZmZlciwgQ29sb3I0aSAmY3VycmVudCwgSW50ICZ4KQorCXsKKwkJaWYoIXN0YXRlLmFscGhhQmxlbmRBY3RpdmUpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCQkgCisJCVBvaW50ZXI8Qnl0ZT4gYnVmZmVyOworCisJCUNvbG9yNGkgcGl4ZWw7CisJCVNob3J0NCBjMDE7CisJCVNob3J0NCBjMjM7CisKKwkJLy8gUmVhZCBwaXhlbAorCQlzd2l0Y2goc3RhdGUudGFyZ2V0Rm9ybWF0W2luZGV4XSkKKwkJeworCQljYXNlIEZPUk1BVF9BOFI4RzhCODoKKwkJCWJ1ZmZlciA9IGNCdWZmZXIgKyA0ICogeDsKKwkJCWMwMSA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyKTsKKwkJCWJ1ZmZlciArPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclBpdGNoQltpbmRleF0pKTsKKwkJCWMyMyA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyKTsKKwkJCXBpeGVsLmIgPSBjMDE7CisJCQlwaXhlbC5nID0gYzAxOworCQkJcGl4ZWwuYiA9IFVucGFja0xvdyhBczxCeXRlOD4ocGl4ZWwuYiksIEFzPEJ5dGU4PihjMjMpKTsKKwkJCXBpeGVsLmcgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4PihwaXhlbC5nKSwgQXM8Qnl0ZTg+KGMyMykpOworCQkJcGl4ZWwuciA9IHBpeGVsLmI7CisJCQlwaXhlbC5iID0gVW5wYWNrTG93KEFzPEJ5dGU4PihwaXhlbC5iKSwgQXM8Qnl0ZTg+KHBpeGVsLmcpKTsKKwkJCXBpeGVsLnIgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4PihwaXhlbC5yKSwgQXM8Qnl0ZTg+KHBpeGVsLmcpKTsKKwkJCXBpeGVsLmcgPSBwaXhlbC5iOworCQkJcGl4ZWwuYSA9IHBpeGVsLnI7CisJCQlwaXhlbC5yID0gVW5wYWNrTG93KEFzPEJ5dGU4PihwaXhlbC5yKSwgQXM8Qnl0ZTg+KHBpeGVsLnIpKTsKKwkJCXBpeGVsLmcgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4PihwaXhlbC5nKSwgQXM8Qnl0ZTg+KHBpeGVsLmcpKTsKKwkJCXBpeGVsLmIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KHBpeGVsLmIpLCBBczxCeXRlOD4ocGl4ZWwuYikpOworCQkJcGl4ZWwuYSA9IFVucGFja0hpZ2goQXM8Qnl0ZTg+KHBpeGVsLmEpLCBBczxCeXRlOD4ocGl4ZWwuYSkpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQkJYnVmZmVyID0gY0J1ZmZlciArIDQgKiB4OworCQkJYzAxID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIpOworCQkJYnVmZmVyICs9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGNvbG9yUGl0Y2hCW2luZGV4XSkpOworCQkJYzIzID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIpOworCQkJcGl4ZWwuYiA9IGMwMTsKKwkJCXBpeGVsLmcgPSBjMDE7CisJCQlwaXhlbC5iID0gVW5wYWNrTG93KEFzPEJ5dGU4PihwaXhlbC5iKSwgQXM8Qnl0ZTg+KGMyMykpOworCQkJcGl4ZWwuZyA9IFVucGFja0hpZ2goQXM8Qnl0ZTg+KHBpeGVsLmcpLCBBczxCeXRlOD4oYzIzKSk7CisJCQlwaXhlbC5yID0gcGl4ZWwuYjsKKwkJCXBpeGVsLmIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KHBpeGVsLmIpLCBBczxCeXRlOD4ocGl4ZWwuZykpOworCQkJcGl4ZWwuciA9IFVucGFja0hpZ2goQXM8Qnl0ZTg+KHBpeGVsLnIpLCBBczxCeXRlOD4ocGl4ZWwuZykpOworCQkJcGl4ZWwuZyA9IHBpeGVsLmI7CisJCQlwaXhlbC5yID0gVW5wYWNrTG93KEFzPEJ5dGU4PihwaXhlbC5yKSwgQXM8Qnl0ZTg+KHBpeGVsLnIpKTsKKwkJCXBpeGVsLmcgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4PihwaXhlbC5nKSwgQXM8Qnl0ZTg+KHBpeGVsLmcpKTsKKwkJCXBpeGVsLmIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KHBpeGVsLmIpLCBBczxCeXRlOD4ocGl4ZWwuYikpOworCQkJcGl4ZWwuYSA9IFNob3J0NCgweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0E4RzhSOEI4UToKKwkJCVVOSU1QTEVNRU5URUQoKTsKKwkJLy8JcGl4ZWwuYiA9IFVucGFja0xvdyhBczxCeXRlOD4ocGl4ZWwuYiksICpQb2ludGVyPEJ5dGU4PihjQnVmZmVyICsgOCAqIHggKyAwKSk7CisJCS8vCXBpeGVsLnIgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4PihwaXhlbC5yKSwgKlBvaW50ZXI8Qnl0ZTg+KGNCdWZmZXIgKyA4ICogeCArIDApKTsKKwkJLy8JcGl4ZWwuZyA9IFVucGFja0xvdyhBczxCeXRlOD4ocGl4ZWwuZyksICpQb2ludGVyPEJ5dGU4PihjQnVmZmVyICsgOCAqIHggKyA4KSk7CisJCS8vCXBpeGVsLmEgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4PihwaXhlbC5hKSwgKlBvaW50ZXI8Qnl0ZTg+KGNCdWZmZXIgKyA4ICogeCArIDgpKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9YOEc4UjhCOFE6CisJCQlVTklNUExFTUVOVEVEKCk7CisJCS8vCXBpeGVsLmIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KHBpeGVsLmIpLCAqUG9pbnRlcjxCeXRlOD4oY0J1ZmZlciArIDggKiB4ICsgMCkpOworCQkvLwlwaXhlbC5yID0gVW5wYWNrSGlnaChBczxCeXRlOD4ocGl4ZWwuciksICpQb2ludGVyPEJ5dGU4PihjQnVmZmVyICsgOCAqIHggKyAwKSk7CisJCS8vCXBpeGVsLmcgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KHBpeGVsLmcpLCAqUG9pbnRlcjxCeXRlOD4oY0J1ZmZlciArIDggKiB4ICsgOCkpOworCQkvLwlwaXhlbC5hID0gU2hvcnQ0KDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRik7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2OgorCQkJYnVmZmVyICA9IGNCdWZmZXI7CisJCQlwaXhlbC5yID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIgKyA4ICogeCk7CisJCQlwaXhlbC5nID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIgKyA4ICogeCArIDgpOworCQkJYnVmZmVyICs9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGNvbG9yUGl0Y2hCW2luZGV4XSkpOworCQkJcGl4ZWwuYiA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyICsgOCAqIHgpOworCQkJcGl4ZWwuYSA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyICsgOCAqIHggKyA4KTsKKwkJCXRyYW5zcG9zZTR4NChwaXhlbC5yLCBwaXhlbC5nLCBwaXhlbC5iLCBwaXhlbC5hKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCQlidWZmZXIgPSBjQnVmZmVyOworCQkJcGl4ZWwuciA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyICArIDQgKiB4KTsKKwkJCWJ1ZmZlciArPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclBpdGNoQltpbmRleF0pKTsKKwkJCXBpeGVsLmcgPSAqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlciAgKyA0ICogeCk7CisJCQlwaXhlbC5iID0gcGl4ZWwucjsKKwkJCXBpeGVsLnIgPSBBczxTaG9ydDQ+KFVucGFja0xvdyhwaXhlbC5yLCBwaXhlbC5nKSk7CisJCQlwaXhlbC5iID0gQXM8U2hvcnQ0PihVbnBhY2tIaWdoKHBpeGVsLmIsIHBpeGVsLmcpKTsKKwkJCXBpeGVsLmcgPSBwaXhlbC5iOworCQkJcGl4ZWwuciA9IEFzPFNob3J0ND4oVW5wYWNrTG93KHBpeGVsLnIsIHBpeGVsLmIpKTsKKwkJCXBpeGVsLmcgPSBBczxTaG9ydDQ+KFVucGFja0hpZ2gocGl4ZWwuZywgcGl4ZWwuYikpOworCQkJcGl4ZWwuYiA9IFNob3J0NCgweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYpOworCQkJcGl4ZWwuYSA9IFNob3J0NCgweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJaWYocG9zdEJsZW5kU1JHQiAmJiBzdGF0ZS53cml0ZVNSR0IpCisJCXsKKwkJCXNSR0J0b0xpbmVhcjE2XzE2KHIsIHBpeGVsKTsJCisJCX0KKworCQkvLyBGaW5hbCBDb2xvciA9IE9iamVjdENvbG9yICogU291cmNlQmxlbmRGYWN0b3IgKyBQaXhlbENvbG9yICogRGVzdGluYXRpb25CbGVuZEZhY3RvcgorCQlDb2xvcjRpIHNvdXJjZUZhY3RvcjsKKwkJQ29sb3I0aSBkZXN0RmFjdG9yOworCisJCWJsZW5kRmFjdG9yKHIsIHNvdXJjZUZhY3RvciwgY3VycmVudCwgcGl4ZWwsIChDb250ZXh0OjpCbGVuZEZhY3RvcilzdGF0ZS5zb3VyY2VCbGVuZEZhY3Rvcik7CisJCWJsZW5kRmFjdG9yKHIsIGRlc3RGYWN0b3IsIGN1cnJlbnQsIHBpeGVsLCAoQ29udGV4dDo6QmxlbmRGYWN0b3Ipc3RhdGUuZGVzdEJsZW5kRmFjdG9yKTsKKworCQlpZihzdGF0ZS5zb3VyY2VCbGVuZEZhY3RvciAhPSBDb250ZXh0OjpCTEVORF9PTkUgJiYgc3RhdGUuc291cmNlQmxlbmRGYWN0b3IgIT0gQ29udGV4dDo6QkxFTkRfWkVSTykKKwkJeworCQkJY3VycmVudC5yID0gTXVsSGlnaChBczxVU2hvcnQ0PihjdXJyZW50LnIpLCBBczxVU2hvcnQ0Pihzb3VyY2VGYWN0b3IucikpOworCQkJY3VycmVudC5nID0gTXVsSGlnaChBczxVU2hvcnQ0PihjdXJyZW50LmcpLCBBczxVU2hvcnQ0Pihzb3VyY2VGYWN0b3IuZykpOworCQkJY3VycmVudC5iID0gTXVsSGlnaChBczxVU2hvcnQ0PihjdXJyZW50LmIpLCBBczxVU2hvcnQ0Pihzb3VyY2VGYWN0b3IuYikpOworCQl9CisJCisJCWlmKHN0YXRlLmRlc3RCbGVuZEZhY3RvciAhPSBDb250ZXh0OjpCTEVORF9PTkUgJiYgc3RhdGUuZGVzdEJsZW5kRmFjdG9yICE9IENvbnRleHQ6OkJMRU5EX1pFUk8pCisJCXsKKwkJCXBpeGVsLnIgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KHBpeGVsLnIpLCBBczxVU2hvcnQ0PihkZXN0RmFjdG9yLnIpKTsKKwkJCXBpeGVsLmcgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KHBpeGVsLmcpLCBBczxVU2hvcnQ0PihkZXN0RmFjdG9yLmcpKTsKKwkJCXBpeGVsLmIgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KHBpeGVsLmIpLCBBczxVU2hvcnQ0PihkZXN0RmFjdG9yLmIpKTsKKwkJfQorCisJCXN3aXRjaChzdGF0ZS5ibGVuZE9wZXJhdGlvbikKKwkJeworCQljYXNlIENvbnRleHQ6OkJMRU5ET1BfQUREOgorCQkJY3VycmVudC5yID0gQWRkU2F0KEFzPFVTaG9ydDQ+KGN1cnJlbnQuciksIEFzPFVTaG9ydDQ+KHBpeGVsLnIpKTsKKwkJCWN1cnJlbnQuZyA9IEFkZFNhdChBczxVU2hvcnQ0PihjdXJyZW50LmcpLCBBczxVU2hvcnQ0PihwaXhlbC5nKSk7CisJCQljdXJyZW50LmIgPSBBZGRTYXQoQXM8VVNob3J0ND4oY3VycmVudC5iKSwgQXM8VVNob3J0ND4ocGl4ZWwuYikpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9TVUI6CisJCQljdXJyZW50LnIgPSBTdWJTYXQoQXM8VVNob3J0ND4oY3VycmVudC5yKSwgQXM8VVNob3J0ND4ocGl4ZWwucikpOworCQkJY3VycmVudC5nID0gU3ViU2F0KEFzPFVTaG9ydDQ+KGN1cnJlbnQuZyksIEFzPFVTaG9ydDQ+KHBpeGVsLmcpKTsKKwkJCWN1cnJlbnQuYiA9IFN1YlNhdChBczxVU2hvcnQ0PihjdXJyZW50LmIpLCBBczxVU2hvcnQ0PihwaXhlbC5iKSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX0lOVlNVQjoKKwkJCWN1cnJlbnQuciA9IFN1YlNhdChBczxVU2hvcnQ0PihwaXhlbC5yKSwgQXM8VVNob3J0ND4oY3VycmVudC5yKSk7CisJCQljdXJyZW50LmcgPSBTdWJTYXQoQXM8VVNob3J0ND4ocGl4ZWwuZyksIEFzPFVTaG9ydDQ+KGN1cnJlbnQuZykpOworCQkJY3VycmVudC5iID0gU3ViU2F0KEFzPFVTaG9ydDQ+KHBpeGVsLmIpLCBBczxVU2hvcnQ0PihjdXJyZW50LmIpKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5ET1BfTUlOOgorCQkJY3VycmVudC5yID0gTWluKEFzPFVTaG9ydDQ+KGN1cnJlbnQuciksIEFzPFVTaG9ydDQ+KHBpeGVsLnIpKTsKKwkJCWN1cnJlbnQuZyA9IE1pbihBczxVU2hvcnQ0PihjdXJyZW50LmcpLCBBczxVU2hvcnQ0PihwaXhlbC5nKSk7CisJCQljdXJyZW50LmIgPSBNaW4oQXM8VVNob3J0ND4oY3VycmVudC5iKSwgQXM8VVNob3J0ND4ocGl4ZWwuYikpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9NQVg6CisJCQljdXJyZW50LnIgPSBNYXgoQXM8VVNob3J0ND4oY3VycmVudC5yKSwgQXM8VVNob3J0ND4ocGl4ZWwucikpOworCQkJY3VycmVudC5nID0gTWF4KEFzPFVTaG9ydDQ+KGN1cnJlbnQuZyksIEFzPFVTaG9ydDQ+KHBpeGVsLmcpKTsKKwkJCWN1cnJlbnQuYiA9IE1heChBczxVU2hvcnQ0PihjdXJyZW50LmIpLCBBczxVU2hvcnQ0PihwaXhlbC5iKSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX1NPVVJDRToKKwkJCS8vIE5vIG9wZXJhdGlvbgorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9ERVNUOgorCQkJY3VycmVudC5yID0gcGl4ZWwucjsKKwkJCWN1cnJlbnQuZyA9IHBpeGVsLmc7CisJCQljdXJyZW50LmIgPSBwaXhlbC5iOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9OVUxMOgorCQkJY3VycmVudC5yID0gU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCk7CisJCQljdXJyZW50LmcgPSBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKTsKKwkJCWN1cnJlbnQuYiA9IFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJYmxlbmRGYWN0b3JBbHBoYShyLCBzb3VyY2VGYWN0b3IsIGN1cnJlbnQsIHBpeGVsLCAoQ29udGV4dDo6QmxlbmRGYWN0b3Ipc3RhdGUuc291cmNlQmxlbmRGYWN0b3JBbHBoYSk7CisJCWJsZW5kRmFjdG9yQWxwaGEociwgZGVzdEZhY3RvciwgY3VycmVudCwgcGl4ZWwsIChDb250ZXh0OjpCbGVuZEZhY3RvcilzdGF0ZS5kZXN0QmxlbmRGYWN0b3JBbHBoYSk7CisKKwkJaWYoc3RhdGUuc291cmNlQmxlbmRGYWN0b3JBbHBoYSAhPSBDb250ZXh0OjpCTEVORF9PTkUgJiYgc3RhdGUuc291cmNlQmxlbmRGYWN0b3JBbHBoYSAhPSBDb250ZXh0OjpCTEVORF9aRVJPKQorCQl7CisJCQljdXJyZW50LmEgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGN1cnJlbnQuYSksIEFzPFVTaG9ydDQ+KHNvdXJjZUZhY3Rvci5hKSk7CisJCX0KKwkKKwkJaWYoc3RhdGUuZGVzdEJsZW5kRmFjdG9yQWxwaGEgIT0gQ29udGV4dDo6QkxFTkRfT05FICYmIHN0YXRlLmRlc3RCbGVuZEZhY3RvckFscGhhICE9IENvbnRleHQ6OkJMRU5EX1pFUk8pCisJCXsKKwkJCXBpeGVsLmEgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KHBpeGVsLmEpLCBBczxVU2hvcnQ0PihkZXN0RmFjdG9yLmEpKTsKKwkJfQorCisJCXN3aXRjaChzdGF0ZS5ibGVuZE9wZXJhdGlvbkFscGhhKQorCQl7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9BREQ6CisJCQljdXJyZW50LmEgPSBBZGRTYXQoQXM8VVNob3J0ND4oY3VycmVudC5hKSwgQXM8VVNob3J0ND4ocGl4ZWwuYSkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9TVUI6CisJCQljdXJyZW50LmEgPSBTdWJTYXQoQXM8VVNob3J0ND4oY3VycmVudC5hKSwgQXM8VVNob3J0ND4ocGl4ZWwuYSkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9JTlZTVUI6CisJCQljdXJyZW50LmEgPSBTdWJTYXQoQXM8VVNob3J0ND4ocGl4ZWwuYSksIEFzPFVTaG9ydDQ+KGN1cnJlbnQuYSkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9NSU46CisJCQljdXJyZW50LmEgPSBNaW4oQXM8VVNob3J0ND4oY3VycmVudC5hKSwgQXM8VVNob3J0ND4ocGl4ZWwuYSkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9NQVg6CisJCQljdXJyZW50LmEgPSBNYXgoQXM8VVNob3J0ND4oY3VycmVudC5hKSwgQXM8VVNob3J0ND4ocGl4ZWwuYSkpOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9TT1VSQ0U6CisJCQkvLyBObyBvcGVyYXRpb24KKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5ET1BfREVTVDoKKwkJCWN1cnJlbnQuYSA9IHBpeGVsLmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX05VTEw6CisJCQljdXJyZW50LmEgPSBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjp3cml0ZUNvbG9yKFJlZ2lzdGVycyAmciwgaW50IGluZGV4LCBQb2ludGVyPEJ5dGU+ICZjQnVmZmVyLCBJbnQgJngsIENvbG9yNGkgJmN1cnJlbnQsIEludCAmc01hc2ssIEludCAmek1hc2ssIEludCAmY01hc2spCisJeworCQlpZighc3RhdGUuY29sb3JXcml0ZUFjdGl2ZShpbmRleCkpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmKHBvc3RCbGVuZFNSR0IgJiYgc3RhdGUud3JpdGVTUkdCKQorCQl7CisJCQlsaW5lYXJUb1NSR0IxNl8xNihyLCBjdXJyZW50KTsKKwkJfQorCisJCWlmKGV4YWN0Q29sb3JSb3VuZGluZykKKwkJeworCQkJc3dpdGNoKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0pCisJCQl7CisJCQljYXNlIEZPUk1BVF9YOEc4UjhCOFE6CisJCQljYXNlIEZPUk1BVF9BOEc4UjhCOFE6CisJCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQkJCXsKKwkJCQkJY3VycmVudC5yID0gY3VycmVudC5yIC0gQXM8U2hvcnQ0PihBczxVU2hvcnQ0PihjdXJyZW50LnIpID4+IDgpICsgU2hvcnQ0KDB4MDA4MCwgMHgwMDgwLCAweDAwODAsIDB4MDA4MCk7CisJCQkJCWN1cnJlbnQuZyA9IGN1cnJlbnQuZyAtIEFzPFNob3J0ND4oQXM8VVNob3J0ND4oY3VycmVudC5nKSA+PiA4KSArIFNob3J0NCgweDAwODAsIDB4MDA4MCwgMHgwMDgwLCAweDAwODApOworCQkJCQljdXJyZW50LmIgPSBjdXJyZW50LmIgLSBBczxTaG9ydDQ+KEFzPFVTaG9ydDQ+KGN1cnJlbnQuYikgPj4gOCkgKyBTaG9ydDQoMHgwMDgwLCAweDAwODAsIDB4MDA4MCwgMHgwMDgwKTsKKwkJCQkJY3VycmVudC5hID0gY3VycmVudC5hIC0gQXM8U2hvcnQ0PihBczxVU2hvcnQ0PihjdXJyZW50LmEpID4+IDgpICsgU2hvcnQ0KDB4MDA4MCwgMHgwMDgwLCAweDAwODAsIDB4MDA4MCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaW50IHJnYmFXcml0ZU1hc2sgPSBzdGF0ZS5jb2xvcldyaXRlQWN0aXZlKGluZGV4KTsKKwkJaW50IGJncmFXcml0ZU1hc2sgPSByZ2JhV3JpdGVNYXNrICYgMHgwMDAwMDAwQSB8IChyZ2JhV3JpdGVNYXNrICYgMHgwMDAwMDAwMSkgPDwgMiB8IChyZ2JhV3JpdGVNYXNrICYgMHgwMDAwMDAwNCkgPj4gMjsKKwkJaW50IGJyZ2FXcml0ZU1hc2sgPSByZ2JhV3JpdGVNYXNrICYgMHgwMDAwMDAwOCB8IChyZ2JhV3JpdGVNYXNrICYgMHgwMDAwMDAwMSkgPDwgMSB8IChyZ2JhV3JpdGVNYXNrICYgMHgwMDAwMDAwMikgPDwgMSB8IChyZ2JhV3JpdGVNYXNrICYgMHgwMDAwMDAwNCkgPj4gMjsKKworCQlzd2l0Y2goc3RhdGUudGFyZ2V0Rm9ybWF0W2luZGV4XSkKKwkJeworCQljYXNlIEZPUk1BVF9YOEc4UjhCOFE6CisJCQlVTklNUExFTUVOVEVEKCk7CisJCS8vCWN1cnJlbnQuciA9IEFzPFNob3J0ND4oQXM8VVNob3J0ND4oY3VycmVudC5yKSA+PiA4KTsKKwkJLy8JY3VycmVudC5nID0gQXM8U2hvcnQ0PihBczxVU2hvcnQ0PihjdXJyZW50LmcpID4+IDgpOworCQkvLwljdXJyZW50LmIgPSBBczxTaG9ydDQ+KEFzPFVTaG9ydDQ+KGN1cnJlbnQuYikgPj4gOCk7CisKKwkJLy8JY3VycmVudC5iID0gQXM8U2hvcnQ0PihQYWNrKEFzPFVTaG9ydDQ+KGN1cnJlbnQuYiksIEFzPFVTaG9ydDQ+KGN1cnJlbnQucikpKTsKKwkJLy8JY3VycmVudC5nID0gQXM8U2hvcnQ0PihQYWNrKEFzPFVTaG9ydDQ+KGN1cnJlbnQuZyksIEFzPFVTaG9ydDQ+KGN1cnJlbnQuZykpKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BOEc4UjhCOFE6CisJCQlVTklNUExFTUVOVEVEKCk7CisJCS8vCWN1cnJlbnQuciA9IEFzPFNob3J0ND4oQXM8VVNob3J0ND4oY3VycmVudC5yKSA+PiA4KTsKKwkJLy8JY3VycmVudC5nID0gQXM8U2hvcnQ0PihBczxVU2hvcnQ0PihjdXJyZW50LmcpID4+IDgpOworCQkvLwljdXJyZW50LmIgPSBBczxTaG9ydDQ+KEFzPFVTaG9ydDQ+KGN1cnJlbnQuYikgPj4gOCk7CisJCS8vCWN1cnJlbnQuYSA9IEFzPFNob3J0ND4oQXM8VVNob3J0ND4oY3VycmVudC5hKSA+PiA4KTsKKworCQkvLwljdXJyZW50LmIgPSBBczxTaG9ydDQ+KFBhY2soQXM8VVNob3J0ND4oY3VycmVudC5iKSwgQXM8VVNob3J0ND4oY3VycmVudC5yKSkpOworCQkvLwljdXJyZW50LmcgPSBBczxTaG9ydDQ+KFBhY2soQXM8VVNob3J0ND4oY3VycmVudC5nKSwgQXM8VVNob3J0ND4oY3VycmVudC5hKSkpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9BOFI4RzhCODoKKwkJCWlmKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0gPT0gRk9STUFUX1g4UjhHOEI4IHx8IHJnYmFXcml0ZU1hc2sgPT0gMHg3KQorCQkJeworCQkJCWN1cnJlbnQuciA9IEFzPFNob3J0ND4oQXM8VVNob3J0ND4oY3VycmVudC5yKSA+PiA4KTsKKwkJCQljdXJyZW50LmcgPSBBczxTaG9ydDQ+KEFzPFVTaG9ydDQ+KGN1cnJlbnQuZykgPj4gOCk7CisJCQkJY3VycmVudC5iID0gQXM8U2hvcnQ0PihBczxVU2hvcnQ0PihjdXJyZW50LmIpID4+IDgpOworCisJCQkJY3VycmVudC5iID0gQXM8U2hvcnQ0PihQYWNrKEFzPFVTaG9ydDQ+KGN1cnJlbnQuYiksIEFzPFVTaG9ydDQ+KGN1cnJlbnQucikpKTsKKwkJCQljdXJyZW50LmcgPSBBczxTaG9ydDQ+KFBhY2soQXM8VVNob3J0ND4oY3VycmVudC5nKSwgQXM8VVNob3J0ND4oY3VycmVudC5nKSkpOworCisJCQkJY3VycmVudC5yID0gY3VycmVudC5iOworCQkJCWN1cnJlbnQuYiA9IFVucGFja0xvdyhBczxCeXRlOD4oY3VycmVudC5iKSwgQXM8Qnl0ZTg+KGN1cnJlbnQuZykpOworCQkJCWN1cnJlbnQuciA9IFVucGFja0hpZ2goQXM8Qnl0ZTg+KGN1cnJlbnQuciksIEFzPEJ5dGU4PihjdXJyZW50LmcpKTsKKwkJCQljdXJyZW50LmcgPSBjdXJyZW50LmI7CisJCQkJY3VycmVudC5iID0gQXM8U2hvcnQ0PihVbnBhY2tMb3coY3VycmVudC5iLCBjdXJyZW50LnIpKTsKKwkJCQljdXJyZW50LmcgPSBBczxTaG9ydDQ+KFVucGFja0hpZ2goY3VycmVudC5nLCBjdXJyZW50LnIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljdXJyZW50LnIgPSBBczxTaG9ydDQ+KEFzPFVTaG9ydDQ+KGN1cnJlbnQucikgPj4gOCk7CisJCQkJY3VycmVudC5nID0gQXM8U2hvcnQ0PihBczxVU2hvcnQ0PihjdXJyZW50LmcpID4+IDgpOworCQkJCWN1cnJlbnQuYiA9IEFzPFNob3J0ND4oQXM8VVNob3J0ND4oY3VycmVudC5iKSA+PiA4KTsKKwkJCQljdXJyZW50LmEgPSBBczxTaG9ydDQ+KEFzPFVTaG9ydDQ+KGN1cnJlbnQuYSkgPj4gOCk7CisKKwkJCQljdXJyZW50LmIgPSBBczxTaG9ydDQ+KFBhY2soQXM8VVNob3J0ND4oY3VycmVudC5iKSwgQXM8VVNob3J0ND4oY3VycmVudC5yKSkpOworCQkJCWN1cnJlbnQuZyA9IEFzPFNob3J0ND4oUGFjayhBczxVU2hvcnQ0PihjdXJyZW50LmcpLCBBczxVU2hvcnQ0PihjdXJyZW50LmEpKSk7CisKKwkJCQljdXJyZW50LnIgPSBjdXJyZW50LmI7CisJCQkJY3VycmVudC5iID0gVW5wYWNrTG93KEFzPEJ5dGU4PihjdXJyZW50LmIpLCBBczxCeXRlOD4oY3VycmVudC5nKSk7CisJCQkJY3VycmVudC5yID0gVW5wYWNrSGlnaChBczxCeXRlOD4oY3VycmVudC5yKSwgQXM8Qnl0ZTg+KGN1cnJlbnQuZykpOworCQkJCWN1cnJlbnQuZyA9IGN1cnJlbnQuYjsKKwkJCQljdXJyZW50LmIgPSBBczxTaG9ydDQ+KFVucGFja0xvdyhjdXJyZW50LmIsIGN1cnJlbnQucikpOworCQkJCWN1cnJlbnQuZyA9IEFzPFNob3J0ND4oVW5wYWNrSGlnaChjdXJyZW50LmcsIGN1cnJlbnQucikpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0cxNlIxNjoKKwkJCWN1cnJlbnQuYiA9IGN1cnJlbnQucjsKKwkJCWN1cnJlbnQuciA9IEFzPFNob3J0ND4oVW5wYWNrTG93KGN1cnJlbnQuciwgY3VycmVudC5nKSk7CisJCQljdXJyZW50LmIgPSBBczxTaG9ydDQ+KFVucGFja0hpZ2goY3VycmVudC5iLCBjdXJyZW50LmcpKTsKKwkJCWN1cnJlbnQuZyA9IGN1cnJlbnQuYjsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BMTZCMTZHMTZSMTY6CisJCQl0cmFuc3Bvc2U0eDQoY3VycmVudC5yLCBjdXJyZW50LmcsIGN1cnJlbnQuYiwgY3VycmVudC5hKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9SMzJGOgorCQljYXNlIEZPUk1BVF9HMzJSMzJGOgorCQljYXNlIEZPUk1BVF9BMzJCMzJHMzJSMzJGOgorCQkJeworCQkJCUNvbG9yNGYgb0M7CisKKwkJCQlvQy5yID0gY29udmVydFVuc2lnbmVkMTYoVVNob3J0NChjdXJyZW50LnIpKTsKKwkJCQlvQy5nID0gY29udmVydFVuc2lnbmVkMTYoVVNob3J0NChjdXJyZW50LmcpKTsKKwkJCQlvQy5iID0gY29udmVydFVuc2lnbmVkMTYoVVNob3J0NChjdXJyZW50LmIpKTsKKwkJCQlvQy5hID0gY29udmVydFVuc2lnbmVkMTYoVVNob3J0NChjdXJyZW50LmEpKTsKKworCQkJCXdyaXRlQ29sb3IociwgaW5kZXgsIGNCdWZmZXIsIHgsIG9DLCBzTWFzaywgek1hc2ssIGNNYXNrKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlTaG9ydDQgYzAxID0gY3VycmVudC5iOworCQlTaG9ydDQgYzIzID0gY3VycmVudC5nOworCisJCUludCB4TWFzazsgICAvLyBDb21iaW5hdGlvbiBvZiBhbGwgbWFza3MKKworCQlpZihzdGF0ZS5kZXB0aFRlc3RBY3RpdmUpCisJCXsKKwkJCXhNYXNrID0gek1hc2s7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4TWFzayA9IGNNYXNrOworCQl9CisKKwkJaWYoc3RhdGUuc3RlbmNpbEFjdGl2ZSkKKwkJeworCQkJeE1hc2sgJj0gc01hc2s7CisJCX0KKworCQlQb2ludGVyPEJ5dGU+IGJ1ZmZlcjsKKwkJU2hvcnQ0IHZhbHVlOworCisJCXN3aXRjaChzdGF0ZS50YXJnZXRGb3JtYXRbaW5kZXhdKQorCQl7CisJCWNhc2UgRk9STUFUX0E4RzhSOEI4UToKKwkJY2FzZSBGT1JNQVRfWDhHOFI4QjhROiAgIC8vIEZJWE1FOiBEb24ndCB0b3VjaCBhbHBoYT8KKwkJCVVOSU1QTEVNRU5URUQoKTsKKwkJLy8JdmFsdWUgPSAqUG9pbnRlcjxTaG9ydDQ+KGNCdWZmZXIgKyA4ICogeCArIDApOworCisJCS8vCWlmKChzdGF0ZS50YXJnZXRGb3JtYXRbaW5kZXhdID09IEZPUk1BVF9BOEc4UjhCOFEgJiYgYmdyYVdyaXRlTWFzayAhPSAweDAwMDAwMDBGKSB8fAorCQkvLwkgICAoKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0gPT0gRk9STUFUX1g4RzhSOEI4USAmJiBiZ3JhV3JpdGVNYXNrICE9IDB4MDAwMDAwMDcpICYmCisJCS8vCSAgICAoc3RhdGUudGFyZ2V0Rm9ybWF0W2luZGV4XSA9PSBGT1JNQVRfWDhHOFI4QjhRICYmIGJncmFXcml0ZU1hc2sgIT0gMHgwMDAwMDAwRikpKSAgIC8vIEZJWE1FOiBOZWVkIGZvciBtYXNraW5nIHdoZW4gWFJHQiAmJiBGaD8KKwkJLy8JeworCQkvLwkJU2hvcnQ0IG1hc2tlZCA9IHZhbHVlOworCQkvLwkJYzAxICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tCNFFbYmdyYVdyaXRlTWFza11bMF0pKTsKKwkJLy8JCW1hc2tlZCAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrQjRRW2JncmFXcml0ZU1hc2tdWzBdKSk7CisJCS8vCQljMDEgfD0gbWFza2VkOworCQkvLwl9CisKKwkJLy8JYzAxICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tEMDFRKSArIHhNYXNrICogOCk7CisJCS8vCXZhbHVlICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tEMDFRKSArIHhNYXNrICogOCk7CisJCS8vCWMwMSB8PSB2YWx1ZTsKKwkJLy8JKlBvaW50ZXI8U2hvcnQ0PihjQnVmZmVyICsgOCAqIHggKyAwKSA9IGMwMTsKKworCQkvLwl2YWx1ZSA9ICpQb2ludGVyPFNob3J0ND4oY0J1ZmZlciArIDggKiB4ICsgOCk7CisKKwkJLy8JaWYoKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0gPT0gRk9STUFUX0E4RzhSOEI4USAmJiBiZ3JhV3JpdGVNYXNrICE9IDB4MDAwMDAwMEYpIHx8CisJCS8vCSAgICgoc3RhdGUudGFyZ2V0Rm9ybWF0W2luZGV4XSA9PSBGT1JNQVRfWDhHOFI4QjhRICYmIGJncmFXcml0ZU1hc2sgIT0gMHgwMDAwMDAwNykgJiYKKwkJLy8JICAgIChzdGF0ZS50YXJnZXRGb3JtYXRbaW5kZXhdID09IEZPUk1BVF9YOEc4UjhCOFEgJiYgYmdyYVdyaXRlTWFzayAhPSAweDAwMDAwMDBGKSkpICAgLy8gRklYTUU6IE5lZWQgZm9yIG1hc2tpbmcgd2hlbiBYUkdCICYmIEZoPworCQkvLwl7CisJCS8vCQlTaG9ydDQgbWFza2VkID0gdmFsdWU7CisJCS8vCQljMjMgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza0I0UVtiZ3JhV3JpdGVNYXNrXVswXSkpOworCQkvLwkJbWFza2VkICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tCNFFbYmdyYVdyaXRlTWFza11bMF0pKTsKKwkJLy8JCWMyMyB8PSBtYXNrZWQ7CisJCS8vCX0KKworCQkvLwljMjMgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza0QyM1EpICsgeE1hc2sgKiA4KTsKKwkJLy8JdmFsdWUgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaW52TWFza0QyM1EpICsgeE1hc2sgKiA4KTsKKwkJLy8JYzIzIHw9IHZhbHVlOworCQkvLwkqUG9pbnRlcjxTaG9ydDQ+KGNCdWZmZXIgKyA4ICogeCArIDgpID0gYzIzOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9YOFI4RzhCODogICAvLyBGSVhNRTogRG9uJ3QgdG91Y2ggYWxwaGE/CisJCQlidWZmZXIgPSBjQnVmZmVyICsgeCAqIDQ7CisJCQl2YWx1ZSA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyKTsKKworCQkJaWYoKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0gPT0gRk9STUFUX0E4UjhHOEI4ICYmIGJncmFXcml0ZU1hc2sgIT0gMHgwMDAwMDAwRikgfHwKKwkJCSAgICgoc3RhdGUudGFyZ2V0Rm9ybWF0W2luZGV4XSA9PSBGT1JNQVRfWDhSOEc4QjggJiYgYmdyYVdyaXRlTWFzayAhPSAweDAwMDAwMDA3KSAmJgorCQkJICAgIChzdGF0ZS50YXJnZXRGb3JtYXRbaW5kZXhdID09IEZPUk1BVF9YOFI4RzhCOCAmJiBiZ3JhV3JpdGVNYXNrICE9IDB4MDAwMDAwMEYpKSkgICAvLyBGSVhNRTogTmVlZCBmb3IgbWFza2luZyB3aGVuIFhSR0IgJiYgRmg/CisJCQl7CisJCQkJU2hvcnQ0IG1hc2tlZCA9IHZhbHVlOworCQkJCWMwMSAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrQjRRW2JncmFXcml0ZU1hc2tdWzBdKSk7CisJCQkJbWFza2VkICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tCNFFbYmdyYVdyaXRlTWFza11bMF0pKTsKKwkJCQljMDEgfD0gbWFza2VkOworCQkJfQorCisJCQljMDEgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza0QwMVEpICsgeE1hc2sgKiA4KTsKKwkJCXZhbHVlICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tEMDFRKSArIHhNYXNrICogOCk7CisJCQljMDEgfD0gdmFsdWU7CisJCQkqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlcikgPSBjMDE7CisKKwkJCWJ1ZmZlciArPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclBpdGNoQltpbmRleF0pKTsKKwkJCXZhbHVlID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIpOworCisJCQlpZigoc3RhdGUudGFyZ2V0Rm9ybWF0W2luZGV4XSA9PSBGT1JNQVRfQThSOEc4QjggJiYgYmdyYVdyaXRlTWFzayAhPSAweDAwMDAwMDBGKSB8fAorCQkJICAgKChzdGF0ZS50YXJnZXRGb3JtYXRbaW5kZXhdID09IEZPUk1BVF9YOFI4RzhCOCAmJiBiZ3JhV3JpdGVNYXNrICE9IDB4MDAwMDAwMDcpICYmCisJCQkgICAgKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0gPT0gRk9STUFUX1g4UjhHOEI4ICYmIGJncmFXcml0ZU1hc2sgIT0gMHgwMDAwMDAwRikpKSAgIC8vIEZJWE1FOiBOZWVkIGZvciBtYXNraW5nIHdoZW4gWFJHQiAmJiBGaD8KKwkJCXsKKwkJCQlTaG9ydDQgbWFza2VkID0gdmFsdWU7CisJCQkJYzIzICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tCNFFbYmdyYVdyaXRlTWFza11bMF0pKTsKKwkJCQltYXNrZWQgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaW52TWFza0I0UVtiZ3JhV3JpdGVNYXNrXVswXSkpOworCQkJCWMyMyB8PSBtYXNrZWQ7CisJCQl9CisKKwkJCWMyMyAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrRDIzUSkgKyB4TWFzayAqIDgpOworCQkJdmFsdWUgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaW52TWFza0QyM1EpICsgeE1hc2sgKiA4KTsKKwkJCWMyMyB8PSB2YWx1ZTsKKwkJCSpQb2ludGVyPFNob3J0ND4oYnVmZmVyKSA9IGMyMzsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCQlidWZmZXIgPSBjQnVmZmVyICsgNCAqIHg7CisKKwkJCXZhbHVlID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIpOworCisJCQlpZigocmdiYVdyaXRlTWFzayAmIDB4MDAwMDAwMDMpICE9IDB4MDAwMDAwMDMpCisJCQl7CisJCQkJU2hvcnQ0IG1hc2tlZCA9IHZhbHVlOworCQkJCWN1cnJlbnQuciAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrVzAxUVtyZ2JhV3JpdGVNYXNrICYgMHgzXVswXSkpOworCQkJCW1hc2tlZCAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrVzAxUVtyZ2JhV3JpdGVNYXNrICYgMHgzXVswXSkpOworCQkJCWN1cnJlbnQuciB8PSBtYXNrZWQ7CisJCQl9CisKKwkJCWN1cnJlbnQuciAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrRDAxUSkgKyB4TWFzayAqIDgpOworCQkJdmFsdWUgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaW52TWFza0QwMVEpICsgeE1hc2sgKiA4KTsKKwkJCWN1cnJlbnQuciB8PSB2YWx1ZTsKKwkJCSpQb2ludGVyPFNob3J0ND4oYnVmZmVyKSA9IGN1cnJlbnQucjsKKworCQkJYnVmZmVyICs9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGNvbG9yUGl0Y2hCW2luZGV4XSkpOworCisJCQl2YWx1ZSA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyKTsKKworCQkJaWYoKHJnYmFXcml0ZU1hc2sgJiAweDAwMDAwMDAzKSAhPSAweDAwMDAwMDAzKQorCQkJeworCQkJCVNob3J0NCBtYXNrZWQgPSB2YWx1ZTsKKwkJCQljdXJyZW50LmcgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza1cwMVFbcmdiYVdyaXRlTWFzayAmIDB4M11bMF0pKTsKKwkJCQltYXNrZWQgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaW52TWFza1cwMVFbcmdiYVdyaXRlTWFzayAmIDB4M11bMF0pKTsKKwkJCQljdXJyZW50LmcgfD0gbWFza2VkOworCQkJfQorCisJCQljdXJyZW50LmcgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza0QyM1EpICsgeE1hc2sgKiA4KTsKKwkJCXZhbHVlICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tEMjNRKSArIHhNYXNrICogOCk7CisJCQljdXJyZW50LmcgfD0gdmFsdWU7CisJCQkqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlcikgPSBjdXJyZW50Lmc7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2OgorCQkJYnVmZmVyID0gY0J1ZmZlciArIDggKiB4OworCisJCQl7CisJCQkJdmFsdWUgPSAqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlcik7CisKKwkJCQlpZihyZ2JhV3JpdGVNYXNrICE9IDB4MDAwMDAwMEYpCisJCQkJeworCQkJCQlTaG9ydDQgbWFza2VkID0gdmFsdWU7CisJCQkJCWN1cnJlbnQuciAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrVzRRW3JnYmFXcml0ZU1hc2tdWzBdKSk7CisJCQkJCW1hc2tlZCAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrVzRRW3JnYmFXcml0ZU1hc2tdWzBdKSk7CisJCQkJCWN1cnJlbnQuciB8PSBtYXNrZWQ7CisJCQkJfQorCisJCQkJY3VycmVudC5yICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tRMFEpICsgeE1hc2sgKiA4KTsKKwkJCQl2YWx1ZSAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrUTBRKSArIHhNYXNrICogOCk7CisJCQkJY3VycmVudC5yIHw9IHZhbHVlOworCQkJCSpQb2ludGVyPFNob3J0ND4oYnVmZmVyKSA9IGN1cnJlbnQucjsKKwkJCX0KKworCQkJeworCQkJCXZhbHVlID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIgKyA4KTsKKworCQkJCWlmKHJnYmFXcml0ZU1hc2sgIT0gMHgwMDAwMDAwRikKKwkJCQl7CisJCQkJCVNob3J0NCBtYXNrZWQgPSB2YWx1ZTsKKwkJCQkJY3VycmVudC5nICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tXNFFbcmdiYVdyaXRlTWFza11bMF0pKTsKKwkJCQkJbWFza2VkICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tXNFFbcmdiYVdyaXRlTWFza11bMF0pKTsKKwkJCQkJY3VycmVudC5nIHw9IG1hc2tlZDsKKwkJCQl9CisKKwkJCQljdXJyZW50LmcgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza1ExUSkgKyB4TWFzayAqIDgpOworCQkJCXZhbHVlICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tRMVEpICsgeE1hc2sgKiA4KTsKKwkJCQljdXJyZW50LmcgfD0gdmFsdWU7CisJCQkJKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIgKyA4KSA9IGN1cnJlbnQuZzsKKwkJCX0KKworCQkJYnVmZmVyICs9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGNvbG9yUGl0Y2hCW2luZGV4XSkpOworCisJCQl7CisJCQkJdmFsdWUgPSAqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlcik7CisKKwkJCQlpZihyZ2JhV3JpdGVNYXNrICE9IDB4MDAwMDAwMEYpCisJCQkJeworCQkJCQlTaG9ydDQgbWFza2VkID0gdmFsdWU7CisJCQkJCWN1cnJlbnQuYiAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrVzRRW3JnYmFXcml0ZU1hc2tdWzBdKSk7CisJCQkJCW1hc2tlZCAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrVzRRW3JnYmFXcml0ZU1hc2tdWzBdKSk7CisJCQkJCWN1cnJlbnQuYiB8PSBtYXNrZWQ7CisJCQkJfQorCisJCQkJY3VycmVudC5iICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tRMlEpICsgeE1hc2sgKiA4KTsKKwkJCQl2YWx1ZSAmPSAqUG9pbnRlcjxTaG9ydDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrUTJRKSArIHhNYXNrICogOCk7CisJCQkJY3VycmVudC5iIHw9IHZhbHVlOworCQkJCSpQb2ludGVyPFNob3J0ND4oYnVmZmVyKSA9IGN1cnJlbnQuYjsKKwkJCX0KKworCQkJeworCQkJCXZhbHVlID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIgKyA4KTsKKworCQkJCWlmKHJnYmFXcml0ZU1hc2sgIT0gMHgwMDAwMDAwRikKKwkJCQl7CisJCQkJCVNob3J0NCBtYXNrZWQgPSB2YWx1ZTsKKwkJCQkJY3VycmVudC5hICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tXNFFbcmdiYVdyaXRlTWFza11bMF0pKTsKKwkJCQkJbWFza2VkICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tXNFFbcmdiYVdyaXRlTWFza11bMF0pKTsKKwkJCQkJY3VycmVudC5hIHw9IG1hc2tlZDsKKwkJCQl9CisKKwkJCQljdXJyZW50LmEgJj0gKlBvaW50ZXI8U2hvcnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza1EzUSkgKyB4TWFzayAqIDgpOworCQkJCXZhbHVlICY9ICpQb2ludGVyPFNob3J0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tRM1EpICsgeE1hc2sgKiA4KTsKKwkJCQljdXJyZW50LmEgfD0gdmFsdWU7CisJCQkJKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIgKyA4KSA9IGN1cnJlbnQuYTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpibGVuZEZhY3RvcihSZWdpc3RlcnMgJnIsIGNvbnN0IENvbG9yNGYgJmJsZW5kRmFjdG9yLCBjb25zdCBDb2xvcjRmICZvQywgY29uc3QgQ29sb3I0ZiAmcGl4ZWwsIENvbnRleHQ6OkJsZW5kRmFjdG9yIGJsZW5kRmFjdG9yQWN0aXZlKSAKKwl7CisJCXN3aXRjaChibGVuZEZhY3RvckFjdGl2ZSkKKwkJeworCQljYXNlIENvbnRleHQ6OkJMRU5EX1pFUk86CisJCQkvLyBPcHRpbWl6ZWQKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX09ORToKKwkJCS8vIE9wdGltaXplZAorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfU09VUkNFOgorCQkJYmxlbmRGYWN0b3IuciA9IG9DLnI7CisJCQlibGVuZEZhY3Rvci5nID0gb0MuZzsKKwkJCWJsZW5kRmFjdG9yLmIgPSBvQy5iOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfSU5WU09VUkNFOgorCQkJYmxlbmRGYWN0b3IuciA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSAtIG9DLnI7CisJCQlibGVuZEZhY3Rvci5nID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpIC0gb0MuZzsKKwkJCWJsZW5kRmFjdG9yLmIgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikgLSBvQy5iOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfREVTVDoKKwkJCWJsZW5kRmFjdG9yLnIgPSBwaXhlbC5yOworCQkJYmxlbmRGYWN0b3IuZyA9IHBpeGVsLmc7CisJCQlibGVuZEZhY3Rvci5iID0gcGl4ZWwuYjsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0lOVkRFU1Q6CisJCQlibGVuZEZhY3Rvci5yID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpIC0gcGl4ZWwucjsKKwkJCWJsZW5kRmFjdG9yLmcgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikgLSBwaXhlbC5nOworCQkJYmxlbmRGYWN0b3IuYiA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSAtIHBpeGVsLmI7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9TT1VSQ0VBTFBIQToKKwkJCWJsZW5kRmFjdG9yLnIgPSBvQy5hOworCQkJYmxlbmRGYWN0b3IuZyA9IG9DLmE7CisJCQlibGVuZEZhY3Rvci5iID0gb0MuYTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0lOVlNPVVJDRUFMUEhBOgorCQkJYmxlbmRGYWN0b3IuciA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSAtIG9DLmE7CisJCQlibGVuZEZhY3Rvci5nID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpIC0gb0MuYTsKKwkJCWJsZW5kRmFjdG9yLmIgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikgLSBvQy5hOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfREVTVEFMUEhBOgorCQkJYmxlbmRGYWN0b3IuciA9IHBpeGVsLmE7CisJCQlibGVuZEZhY3Rvci5nID0gcGl4ZWwuYTsKKwkJCWJsZW5kRmFjdG9yLmIgPSBwaXhlbC5hOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfSU5WREVTVEFMUEhBOgorCQkJYmxlbmRGYWN0b3IuciA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSAtIHBpeGVsLmE7CisJCQlibGVuZEZhY3Rvci5nID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpIC0gcGl4ZWwuYTsKKwkJCWJsZW5kRmFjdG9yLmIgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikgLSBwaXhlbC5hOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfU1JDQUxQSEFTQVQ6CisJCQlibGVuZEZhY3Rvci5yID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpIC0gcGl4ZWwuYTsKKwkJCWJsZW5kRmFjdG9yLnIgPSBNaW4oYmxlbmRGYWN0b3Iuciwgb0MuYSk7CisJCQlibGVuZEZhY3Rvci5nID0gYmxlbmRGYWN0b3IucjsKKwkJCWJsZW5kRmFjdG9yLmIgPSBibGVuZEZhY3Rvci5yOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfQ09OU1RBTlQ6CisJCQlibGVuZEZhY3Rvci5yID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmJsZW5kQ29uc3RhbnQ0RlswXSkpOworCQkJYmxlbmRGYWN0b3IuZyA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5ibGVuZENvbnN0YW50NEZbMV0pKTsKKwkJCWJsZW5kRmFjdG9yLmIgPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IuYmxlbmRDb25zdGFudDRGWzJdKSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9JTlZDT05TVEFOVDoKKwkJCWJsZW5kRmFjdG9yLnIgPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmYWN0b3IuaW52QmxlbmRDb25zdGFudDRGWzBdKSk7CisJCQlibGVuZEZhY3Rvci5nID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmFjdG9yLmludkJsZW5kQ29uc3RhbnQ0RlsxXSkpOworCQkJYmxlbmRGYWN0b3IuYiA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5pbnZCbGVuZENvbnN0YW50NEZbMl0pKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpibGVuZEZhY3RvckFscGhhKFJlZ2lzdGVycyAmciwgY29uc3QgQ29sb3I0ZiAmYmxlbmRGYWN0b3IsIGNvbnN0IENvbG9yNGYgJm9DLCBjb25zdCBDb2xvcjRmICZwaXhlbCwgQ29udGV4dDo6QmxlbmRGYWN0b3IgYmxlbmRGYWN0b3JBbHBoYUFjdGl2ZSkgCisJeworCQlzd2l0Y2goYmxlbmRGYWN0b3JBbHBoYUFjdGl2ZSkKKwkJeworCQljYXNlIENvbnRleHQ6OkJMRU5EX1pFUk86CisJCQkvLyBPcHRpbWl6ZWQKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX09ORToKKwkJCS8vIE9wdGltaXplZAorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfU09VUkNFOgorCQkJYmxlbmRGYWN0b3IuYSA9IG9DLmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0U6CisJCQlibGVuZEZhY3Rvci5hID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpIC0gb0MuYTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0RFU1Q6CisJCQlibGVuZEZhY3Rvci5hID0gcGl4ZWwuYTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0lOVkRFU1Q6CisJCQlibGVuZEZhY3Rvci5hID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpIC0gcGl4ZWwuYTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX1NPVVJDRUFMUEhBOgorCQkJYmxlbmRGYWN0b3IuYSA9IG9DLmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9JTlZTT1VSQ0VBTFBIQToKKwkJCWJsZW5kRmFjdG9yLmEgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikgLSBvQy5hOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRfREVTVEFMUEhBOgorCQkJYmxlbmRGYWN0b3IuYSA9IHBpeGVsLmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORF9JTlZERVNUQUxQSEE6CisJCQlibGVuZEZhY3Rvci5hID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpIC0gcGl4ZWwuYTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX1NSQ0FMUEhBU0FUOgorCQkJYmxlbmRGYWN0b3IuYSA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0NPTlNUQU5UOgorCQkJYmxlbmRGYWN0b3IuYSA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5ibGVuZENvbnN0YW50NEZbM10pKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5EX0lOVkNPTlNUQU5UOgorCQkJYmxlbmRGYWN0b3IuYSA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZhY3Rvci5pbnZCbGVuZENvbnN0YW50NEZbM10pKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjphbHBoYUJsZW5kKFJlZ2lzdGVycyAmciwgaW50IGluZGV4LCBQb2ludGVyPEJ5dGU+ICZjQnVmZmVyLCBDb2xvcjRmICZvQywgSW50ICZ4KQorCXsKKwkJaWYoIXN0YXRlLmFscGhhQmxlbmRBY3RpdmUpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCVBvaW50ZXI8Qnl0ZT4gYnVmZmVyOworCQlDb2xvcjRmIHBpeGVsOworCisJCUNvbG9yNGkgY29sb3I7CisJCVNob3J0NCBjMDE7CisJCVNob3J0NCBjMjM7CisKKwkJLy8gUmVhZCBwaXhlbAorCQlzd2l0Y2goc3RhdGUudGFyZ2V0Rm9ybWF0W2luZGV4XSkKKwkJeworCQljYXNlIEZPUk1BVF9BOFI4RzhCODoKKwkJCWJ1ZmZlciA9IGNCdWZmZXIgKyA0ICogeDsKKwkJCWMwMSA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyKTsKKwkJCWJ1ZmZlciArPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclBpdGNoQltpbmRleF0pKTsKKwkJCWMyMyA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyKTsKKwkJCWNvbG9yLmIgPSBjMDE7CisJCQljb2xvci5nID0gYzAxOworCQkJY29sb3IuYiA9IFVucGFja0xvdyhBczxCeXRlOD4oY29sb3IuYiksIEFzPEJ5dGU4PihjMjMpKTsKKwkJCWNvbG9yLmcgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4Pihjb2xvci5nKSwgQXM8Qnl0ZTg+KGMyMykpOworCQkJY29sb3IuciA9IGNvbG9yLmI7CisJCQljb2xvci5iID0gVW5wYWNrTG93KEFzPEJ5dGU4Pihjb2xvci5iKSwgQXM8Qnl0ZTg+KGNvbG9yLmcpKTsKKwkJCWNvbG9yLnIgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4Pihjb2xvci5yKSwgQXM8Qnl0ZTg+KGNvbG9yLmcpKTsKKwkJCWNvbG9yLmcgPSBjb2xvci5iOworCQkJY29sb3IuYSA9IGNvbG9yLnI7CisJCQljb2xvci5yID0gVW5wYWNrTG93KEFzPEJ5dGU4Pihjb2xvci5yKSwgQXM8Qnl0ZTg+KGNvbG9yLnIpKTsKKwkJCWNvbG9yLmcgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4Pihjb2xvci5nKSwgQXM8Qnl0ZTg+KGNvbG9yLmcpKTsKKwkJCWNvbG9yLmIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KGNvbG9yLmIpLCBBczxCeXRlOD4oY29sb3IuYikpOworCQkJY29sb3IuYSA9IFVucGFja0hpZ2goQXM8Qnl0ZTg+KGNvbG9yLmEpLCBBczxCeXRlOD4oY29sb3IuYSkpOworCisJCQlwaXhlbC5yID0gY29udmVydFVuc2lnbmVkMTYoQXM8VVNob3J0ND4oY29sb3IucikpOworCQkJcGl4ZWwuZyA9IGNvbnZlcnRVbnNpZ25lZDE2KEFzPFVTaG9ydDQ+KGNvbG9yLmcpKTsKKwkJCXBpeGVsLmIgPSBjb252ZXJ0VW5zaWduZWQxNihBczxVU2hvcnQ0Pihjb2xvci5iKSk7CisJCQlwaXhlbC5hID0gY29udmVydFVuc2lnbmVkMTYoQXM8VVNob3J0ND4oY29sb3IuYSkpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1g4UjhHOEI4OgorCQkJYnVmZmVyID0gY0J1ZmZlciArIDQgKiB4OworCQkJYzAxID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIpOworCQkJYnVmZmVyICs9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGNvbG9yUGl0Y2hCW2luZGV4XSkpOworCQkJYzIzID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXIpOworCQkJY29sb3IuYiA9IGMwMTsKKwkJCWNvbG9yLmcgPSBjMDE7CisJCQljb2xvci5iID0gVW5wYWNrTG93KEFzPEJ5dGU4Pihjb2xvci5iKSwgQXM8Qnl0ZTg+KGMyMykpOworCQkJY29sb3IuZyA9IFVucGFja0hpZ2goQXM8Qnl0ZTg+KGNvbG9yLmcpLCBBczxCeXRlOD4oYzIzKSk7CisJCQljb2xvci5yID0gY29sb3IuYjsKKwkJCWNvbG9yLmIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KGNvbG9yLmIpLCBBczxCeXRlOD4oY29sb3IuZykpOworCQkJY29sb3IuciA9IFVucGFja0hpZ2goQXM8Qnl0ZTg+KGNvbG9yLnIpLCBBczxCeXRlOD4oY29sb3IuZykpOworCQkJY29sb3IuZyA9IGNvbG9yLmI7CisJCQljb2xvci5yID0gVW5wYWNrTG93KEFzPEJ5dGU4Pihjb2xvci5yKSwgQXM8Qnl0ZTg+KGNvbG9yLnIpKTsKKwkJCWNvbG9yLmcgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4Pihjb2xvci5nKSwgQXM8Qnl0ZTg+KGNvbG9yLmcpKTsKKwkJCWNvbG9yLmIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KGNvbG9yLmIpLCBBczxCeXRlOD4oY29sb3IuYikpOworCisJCQlwaXhlbC5yID0gY29udmVydFVuc2lnbmVkMTYoQXM8VVNob3J0ND4oY29sb3IucikpOworCQkJcGl4ZWwuZyA9IGNvbnZlcnRVbnNpZ25lZDE2KEFzPFVTaG9ydDQ+KGNvbG9yLmcpKTsKKwkJCXBpeGVsLmIgPSBjb252ZXJ0VW5zaWduZWQxNihBczxVU2hvcnQ0Pihjb2xvci5iKSk7CisJCQlwaXhlbC5hID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0E4RzhSOEI4UToKK1VOSU1QTEVNRU5URUQoKTsKKwkJLy8JVW5wYWNrTG93KHBpeGVsLmIsIHF3b3JkX3B0ciBbY0J1ZmZlcis4KngrMF0pOworCQkvLwlVbnBhY2tIaWdoKHBpeGVsLnIsIHF3b3JkX3B0ciBbY0J1ZmZlcis4KngrMF0pOworCQkvLwlVbnBhY2tMb3cocGl4ZWwuZywgcXdvcmRfcHRyIFtjQnVmZmVyKzgqeCs4XSk7CisJCS8vCVVucGFja0hpZ2gocGl4ZWwuYSwgcXdvcmRfcHRyIFtjQnVmZmVyKzgqeCs4XSk7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfWDhHOFI4QjhROgorVU5JTVBMRU1FTlRFRCgpOworCQkvLwlVbnBhY2tMb3cocGl4ZWwuYiwgcXdvcmRfcHRyIFtjQnVmZmVyKzgqeCswXSk7CisJCS8vCVVucGFja0hpZ2gocGl4ZWwuciwgcXdvcmRfcHRyIFtjQnVmZmVyKzgqeCswXSk7CisJCS8vCVVucGFja0xvdyhwaXhlbC5nLCBxd29yZF9wdHIgW2NCdWZmZXIrOCp4KzhdKTsKKwkJLy8JcGl4ZWwuYSA9IFNob3J0NCgweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNjoKKwkJCWJ1ZmZlciAgPSBjQnVmZmVyOworCQkJY29sb3IuciA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyICsgOCAqIHgpOworCQkJY29sb3IuZyA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyICsgOCAqIHggKyA4KTsKKwkJCWJ1ZmZlciArPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclBpdGNoQltpbmRleF0pKTsKKwkJCWNvbG9yLmIgPSAqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlciArIDggKiB4KTsKKwkJCWNvbG9yLmEgPSAqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlciArIDggKiB4ICsgOCk7CisJCQkKKwkJCXRyYW5zcG9zZTR4NChjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCBjb2xvci5hKTsKKworCQkJcGl4ZWwuciA9IGNvbnZlcnRVbnNpZ25lZDE2KEFzPFVTaG9ydDQ+KGNvbG9yLnIpKTsKKwkJCXBpeGVsLmcgPSBjb252ZXJ0VW5zaWduZWQxNihBczxVU2hvcnQ0Pihjb2xvci5nKSk7CisJCQlwaXhlbC5iID0gY29udmVydFVuc2lnbmVkMTYoQXM8VVNob3J0ND4oY29sb3IuYikpOworCQkJcGl4ZWwuYSA9IGNvbnZlcnRVbnNpZ25lZDE2KEFzPFVTaG9ydDQ+KGNvbG9yLmEpKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCQlidWZmZXIgPSBjQnVmZmVyOworCQkJY29sb3IuciA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyICArIDQgKiB4KTsKKwkJCWJ1ZmZlciArPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclBpdGNoQltpbmRleF0pKTsKKwkJCWNvbG9yLmcgPSAqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlciAgKyA0ICogeCk7CisJCQljb2xvci5iID0gY29sb3IucjsKKwkJCWNvbG9yLnIgPSBBczxTaG9ydDQ+KFVucGFja0xvdyhjb2xvci5yLCBjb2xvci5nKSk7CisJCQljb2xvci5iID0gQXM8U2hvcnQ0PihVbnBhY2tIaWdoKGNvbG9yLmIsIGNvbG9yLmcpKTsKKwkJCWNvbG9yLmcgPSBjb2xvci5iOworCQkJY29sb3IuciA9IEFzPFNob3J0ND4oVW5wYWNrTG93KGNvbG9yLnIsIGNvbG9yLmIpKTsKKwkJCWNvbG9yLmcgPSBBczxTaG9ydDQ+KFVucGFja0hpZ2goY29sb3IuZywgY29sb3IuYikpOworCQkJCisJCQlwaXhlbC5yID0gY29udmVydFVuc2lnbmVkMTYoQXM8VVNob3J0ND4oY29sb3IucikpOworCQkJcGl4ZWwuZyA9IGNvbnZlcnRVbnNpZ25lZDE2KEFzPFVTaG9ydDQ+KGNvbG9yLmcpKTsKKwkJCXBpeGVsLmIgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQlwaXhlbC5hID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQkJYnJlYWs7CisJCWNhc2UgRk9STUFUX1IzMkY6CisJCQlidWZmZXIgPSBjQnVmZmVyOworCQkJLy8gRklYTUU6IG1vdmxwcworCQkJcGl4ZWwuci54ID0gKlBvaW50ZXI8RmxvYXQ+KGJ1ZmZlciArIDQgKiB4ICsgMCk7CisJCQlwaXhlbC5yLnkgPSAqUG9pbnRlcjxGbG9hdD4oYnVmZmVyICsgNCAqIHggKyA0KTsKKwkJCWJ1ZmZlciArPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclBpdGNoQltpbmRleF0pKTsKKwkJCS8vIEZJWE1FOiBtb3ZocHMKKwkJCXBpeGVsLnIueiA9ICpQb2ludGVyPEZsb2F0PihidWZmZXIgKyA0ICogeCArIDApOworCQkJcGl4ZWwuci53ID0gKlBvaW50ZXI8RmxvYXQ+KGJ1ZmZlciArIDQgKiB4ICsgNCk7CisJCQlwaXhlbC5nID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQkJcGl4ZWwuYiA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwkJCXBpeGVsLmEgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfRzMyUjMyRjoKKwkJCWJ1ZmZlciA9IGNCdWZmZXI7CisJCQlwaXhlbC5yID0gKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIgKyA4ICogeCwgMTYpOworCQkJYnVmZmVyICs9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGNvbG9yUGl0Y2hCW2luZGV4XSkpOworCQkJcGl4ZWwuZyA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyICsgOCAqIHgsIDE2KTsKKwkJCXBpeGVsLmIgPSBwaXhlbC5yOworCQkJcGl4ZWwuciA9IFNodWZmbGVMb3dIaWdoKHBpeGVsLnIsIHBpeGVsLmcsIDB4ODgpOworCQkJcGl4ZWwuYiA9IFNodWZmbGVMb3dIaWdoKHBpeGVsLmIsIHBpeGVsLmcsIDB4REQpOworCQkJcGl4ZWwuZyA9IHBpeGVsLmI7CisJCQlwaXhlbC5iID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQkJcGl4ZWwuYSA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BMzJCMzJHMzJSMzJGOgorCQkJYnVmZmVyID0gY0J1ZmZlcjsKKwkJCXBpeGVsLnIgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlciArIDE2ICogeCwgMTYpOworCQkJcGl4ZWwuZyA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyICsgMTYgKiB4ICsgMTYsIDE2KTsKKwkJCWJ1ZmZlciArPSAqUG9pbnRlcjxJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxjb2xvclBpdGNoQltpbmRleF0pKTsKKwkJCXBpeGVsLmIgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlciArIDE2ICogeCwgMTYpOworCQkJcGl4ZWwuYSA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyICsgMTYgKiB4ICsgMTYsIDE2KTsKKwkJCXRyYW5zcG9zZTR4NChwaXhlbC5yLCBwaXhlbC5nLCBwaXhlbC5iLCBwaXhlbC5hKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWlmKHBvc3RCbGVuZFNSR0IgJiYgc3RhdGUud3JpdGVTUkdCKQorCQl7CisJCQlzUkdCdG9MaW5lYXIocGl4ZWwucik7CisJCQlzUkdCdG9MaW5lYXIocGl4ZWwuZyk7CisJCQlzUkdCdG9MaW5lYXIocGl4ZWwuYik7CisJCX0KKworCQkvLyBGaW5hbCBDb2xvciA9IE9iamVjdENvbG9yICogU291cmNlQmxlbmRGYWN0b3IgKyBQaXhlbENvbG9yICogRGVzdGluYXRpb25CbGVuZEZhY3RvcgorCQlDb2xvcjRmIHNvdXJjZUZhY3RvcjsKKwkJQ29sb3I0ZiBkZXN0RmFjdG9yOworCisJCWJsZW5kRmFjdG9yKHIsIHNvdXJjZUZhY3Rvciwgb0MsIHBpeGVsLCAoQ29udGV4dDo6QmxlbmRGYWN0b3Ipc3RhdGUuc291cmNlQmxlbmRGYWN0b3IpOworCQlibGVuZEZhY3RvcihyLCBkZXN0RmFjdG9yLCBvQywgcGl4ZWwsIChDb250ZXh0OjpCbGVuZEZhY3RvcilzdGF0ZS5kZXN0QmxlbmRGYWN0b3IpOworCisJCWlmKHN0YXRlLnNvdXJjZUJsZW5kRmFjdG9yICE9IENvbnRleHQ6OkJMRU5EX09ORSAmJiBzdGF0ZS5zb3VyY2VCbGVuZEZhY3RvciAhPSBDb250ZXh0OjpCTEVORF9aRVJPKQorCQl7CisJCQlvQy5yICo9IHNvdXJjZUZhY3Rvci5yOworCQkJb0MuZyAqPSBzb3VyY2VGYWN0b3IuZzsKKwkJCW9DLmIgKj0gc291cmNlRmFjdG9yLmI7CisJCX0KKwkKKwkJaWYoc3RhdGUuZGVzdEJsZW5kRmFjdG9yICE9IENvbnRleHQ6OkJMRU5EX09ORSAmJiBzdGF0ZS5kZXN0QmxlbmRGYWN0b3IgIT0gQ29udGV4dDo6QkxFTkRfWkVSTykKKwkJeworCQkJcGl4ZWwuciAqPSBkZXN0RmFjdG9yLnI7CisJCQlwaXhlbC5nICo9IGRlc3RGYWN0b3IuZzsKKwkJCXBpeGVsLmIgKj0gZGVzdEZhY3Rvci5iOworCQl9CisKKwkJc3dpdGNoKHN0YXRlLmJsZW5kT3BlcmF0aW9uKQorCQl7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9BREQ6CisJCQlvQy5yICs9IHBpeGVsLnI7CisJCQlvQy5nICs9IHBpeGVsLmc7CisJCQlvQy5iICs9IHBpeGVsLmI7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX1NVQjoKKwkJCW9DLnIgLT0gcGl4ZWwucjsKKwkJCW9DLmcgLT0gcGl4ZWwuZzsKKwkJCW9DLmIgLT0gcGl4ZWwuYjsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5ET1BfSU5WU1VCOgorCQkJb0MuciA9IHBpeGVsLnIgLSBvQy5yOworCQkJb0MuZyA9IHBpeGVsLmcgLSBvQy5nOworCQkJb0MuYiA9IHBpeGVsLmIgLSBvQy5iOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9NSU46CisJCQlvQy5yID0gTWluKG9DLnIsIHBpeGVsLnIpOworCQkJb0MuZyA9IE1pbihvQy5nLCBwaXhlbC5nKTsKKwkJCW9DLmIgPSBNaW4ob0MuYiwgcGl4ZWwuYik7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX01BWDoKKwkJCW9DLnIgPSBNYXgob0MuciwgcGl4ZWwucik7CisJCQlvQy5nID0gTWF4KG9DLmcsIHBpeGVsLmcpOworCQkJb0MuYiA9IE1heChvQy5iLCBwaXhlbC5iKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5ET1BfU09VUkNFOgorCQkJLy8gTm8gb3BlcmF0aW9uCisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX0RFU1Q6CisJCQlvQy5yID0gcGl4ZWwucjsKKwkJCW9DLmcgPSBwaXhlbC5nOworCQkJb0MuYiA9IHBpeGVsLmI7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX05VTEw6CisJCQlvQy5yID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJb0MuZyA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCW9DLmIgPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlibGVuZEZhY3RvckFscGhhKHIsIHNvdXJjZUZhY3Rvciwgb0MsIHBpeGVsLCAoQ29udGV4dDo6QmxlbmRGYWN0b3Ipc3RhdGUuc291cmNlQmxlbmRGYWN0b3JBbHBoYSk7CisJCWJsZW5kRmFjdG9yQWxwaGEociwgZGVzdEZhY3Rvciwgb0MsIHBpeGVsLCAoQ29udGV4dDo6QmxlbmRGYWN0b3Ipc3RhdGUuZGVzdEJsZW5kRmFjdG9yQWxwaGEpOworCisJCWlmKHN0YXRlLnNvdXJjZUJsZW5kRmFjdG9yQWxwaGEgIT0gQ29udGV4dDo6QkxFTkRfT05FICYmIHN0YXRlLnNvdXJjZUJsZW5kRmFjdG9yQWxwaGEgIT0gQ29udGV4dDo6QkxFTkRfWkVSTykKKwkJeworCQkJb0MuYSAqPSBzb3VyY2VGYWN0b3IuYTsKKwkJfQorCQorCQlpZihzdGF0ZS5kZXN0QmxlbmRGYWN0b3JBbHBoYSAhPSBDb250ZXh0OjpCTEVORF9PTkUgJiYgc3RhdGUuZGVzdEJsZW5kRmFjdG9yQWxwaGEgIT0gQ29udGV4dDo6QkxFTkRfWkVSTykKKwkJeworCQkJcGl4ZWwuYSAqPSBkZXN0RmFjdG9yLmE7CisJCX0KKworCQlzd2l0Y2goc3RhdGUuYmxlbmRPcGVyYXRpb25BbHBoYSkKKwkJeworCQljYXNlIENvbnRleHQ6OkJMRU5ET1BfQUREOgorCQkJb0MuYSArPSBwaXhlbC5hOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9TVUI6CisJCQlvQy5hIC09IHBpeGVsLmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX0lOVlNVQjoKKwkJCXBpeGVsLmEgLT0gb0MuYTsKKwkJCW9DLmEgPSBwaXhlbC5hOworCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9NSU46CQorCQkJb0MuYSA9IE1pbihvQy5hLCBwaXhlbC5hKTsKKwkJCWJyZWFrOworCQljYXNlIENvbnRleHQ6OkJMRU5ET1BfTUFYOgkKKwkJCW9DLmEgPSBNYXgob0MuYSwgcGl4ZWwuYSk7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX1NPVVJDRToKKwkJCS8vIE5vIG9wZXJhdGlvbgorCQkJYnJlYWs7CisJCWNhc2UgQ29udGV4dDo6QkxFTkRPUF9ERVNUOgorCQkJb0MuYSA9IHBpeGVsLmE7CisJCQlicmVhazsKKwkJY2FzZSBDb250ZXh0OjpCTEVORE9QX05VTEw6CisJCQlvQy5hID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OndyaXRlQ29sb3IoUmVnaXN0ZXJzICZyLCBpbnQgaW5kZXgsIFBvaW50ZXI8Qnl0ZT4gJmNCdWZmZXIsIEludCAmeCwgQ29sb3I0ZiAmb0MsIEludCAmc01hc2ssIEludCAmek1hc2ssIEludCAmY01hc2spCisJeworCQlpZighc3RhdGUuY29sb3JXcml0ZUFjdGl2ZShpbmRleCkpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCUNvbG9yNGkgY29sb3I7CisKKwkJc3dpdGNoKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0pCisJCXsKKwkJY2FzZSBGT1JNQVRfWDhSOEc4Qjg6CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OgorCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNjoKKwkJCWNvbnZlcnRGaXhlZDE2KGNvbG9yLCBvQywgdHJ1ZSk7CisJCQl3cml0ZUNvbG9yKHIsIGluZGV4LCBjQnVmZmVyLCB4LCBjb2xvciwgc01hc2ssIHpNYXNrLCBjTWFzayk7CisJCQlyZXR1cm47CisJCWNhc2UgRk9STUFUX1IzMkY6CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfRzMyUjMyRjoKKwkJCW9DLmIgPSBvQy5yOworCQkJb0MuciA9IFVucGFja0xvdyhvQy5yLCBvQy5nKTsKKwkJCW9DLmIgPSBVbnBhY2tIaWdoKG9DLmIsIG9DLmcpOworCQkJb0MuZyA9IG9DLmI7CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfQTMyQjMyRzMyUjMyRjoKKwkJCXRyYW5zcG9zZTR4NChvQy5yLCBvQy5nLCBvQy5iLCBvQy5hKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWludCByZ2JhV3JpdGVNYXNrID0gc3RhdGUuY29sb3JXcml0ZUFjdGl2ZShpbmRleCk7CisKKwkJSW50IHhNYXNrOyAgIC8vIENvbWJpbmF0aW9uIG9mIGFsbCBtYXNrcworCisJCWlmKHN0YXRlLmRlcHRoVGVzdEFjdGl2ZSkKKwkJeworCQkJeE1hc2sgPSB6TWFzazsKKwkJfQorCQllbHNlCisJCXsKKwkJCXhNYXNrID0gY01hc2s7CisJCX0KKworCQlpZihzdGF0ZS5zdGVuY2lsQWN0aXZlKQorCQl7CisJCQl4TWFzayAmPSBzTWFzazsKKwkJfQorCisJCVBvaW50ZXI8Qnl0ZT4gYnVmZmVyOworCQlGbG9hdDQgdmFsdWU7CisKKwkJc3dpdGNoKHN0YXRlLnRhcmdldEZvcm1hdFtpbmRleF0pCisJCXsKKwkJY2FzZSBGT1JNQVRfUjMyRjoKKwkJCWlmKHJnYmFXcml0ZU1hc2sgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCWJ1ZmZlciA9IGNCdWZmZXIgKyA0ICogeDsKKworCQkJCS8vIEZJWE1FOiBtb3ZscHMKKwkJCQl2YWx1ZS54ID0gKlBvaW50ZXI8RmxvYXQ+KGJ1ZmZlciArIDApOworCQkJCXZhbHVlLnkgPSAqUG9pbnRlcjxGbG9hdD4oYnVmZmVyICsgNCk7CisKKwkJCQlidWZmZXIgKz0gKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsY29sb3JQaXRjaEJbaW5kZXhdKSk7CisKKwkJCQkvLyBGSVhNRTogbW92aHBzCisJCQkJdmFsdWUueiA9ICpQb2ludGVyPEZsb2F0PihidWZmZXIgKyAwKTsKKwkJCQl2YWx1ZS53ID0gKlBvaW50ZXI8RmxvYXQ+KGJ1ZmZlciArIDQpOworCisJCQkJb0MuciA9IEFzPEZsb2F0ND4oQXM8SW50ND4ob0MucikgJiAqUG9pbnRlcjxJbnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza0Q0WCkgKyB4TWFzayAqIDE2LCAxNikpOworCQkJCXZhbHVlID0gQXM8RmxvYXQ0PihBczxJbnQ0Pih2YWx1ZSkgJiAqUG9pbnRlcjxJbnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaW52TWFza0Q0WCkgKyB4TWFzayAqIDE2LCAxNikpOworCQkJCW9DLnIgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLnIpIHwgQXM8SW50ND4odmFsdWUpKTsKKworCQkJCS8vIEZJWE1FOiBtb3ZocHMKKwkJCQkqUG9pbnRlcjxGbG9hdD4oYnVmZmVyICsgMCkgPSBvQy5yLno7CisJCQkJKlBvaW50ZXI8RmxvYXQ+KGJ1ZmZlciArIDQpID0gb0Muci53OworCisJCQkJYnVmZmVyIC09ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGNvbG9yUGl0Y2hCW2luZGV4XSkpOworCisJCQkJLy8gRklYTUU6IG1vdmxwcworCQkJCSpQb2ludGVyPEZsb2F0PihidWZmZXIgKyAwKSA9IG9DLnIueDsKKwkJCQkqUG9pbnRlcjxGbG9hdD4oYnVmZmVyICsgNCkgPSBvQy5yLnk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfRzMyUjMyRjoKKwkJCWJ1ZmZlciA9IGNCdWZmZXIgKyA4ICogeDsKKworCQkJdmFsdWUgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlcik7CisKKwkJCWlmKChyZ2JhV3JpdGVNYXNrICYgMHgwMDAwMDAwMykgIT0gMHgwMDAwMDAwMykKKwkJCXsKKwkJCQlGbG9hdDQgbWFza2VkID0gdmFsdWU7CisJCQkJb0MuciA9IEFzPEZsb2F0ND4oQXM8SW50ND4ob0MucikgJiAqUG9pbnRlcjxJbnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza0QwMVhbcmdiYVdyaXRlTWFzayAmIDB4M11bMF0pKSk7CisJCQkJbWFza2VkID0gQXM8RmxvYXQ0PihBczxJbnQ0PihtYXNrZWQpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tEMDFYW3JnYmFXcml0ZU1hc2sgJiAweDNdWzBdKSkpOworCQkJCW9DLnIgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLnIpIHwgQXM8SW50ND4obWFza2VkKSk7CisJCQl9CisKKwkJCW9DLnIgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLnIpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tRMDFYKSArIHhNYXNrICogMTYsIDE2KSk7CisJCQl2YWx1ZSA9IEFzPEZsb2F0ND4oQXM8SW50ND4odmFsdWUpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tRMDFYKSArIHhNYXNrICogMTYsIDE2KSk7CisJCQlvQy5yID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5yKSB8IEFzPEludDQ+KHZhbHVlKSk7CisJCQkqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlcikgPSBvQy5yOworCisJCQlidWZmZXIgKz0gKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsY29sb3JQaXRjaEJbaW5kZXhdKSk7CisKKwkJCXZhbHVlID0gKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIpOworCisJCQlpZigocmdiYVdyaXRlTWFzayAmIDB4MDAwMDAwMDMpICE9IDB4MDAwMDAwMDMpCisJCQl7CisJCQkJRmxvYXQ0IG1hc2tlZDsKKworCQkJCW1hc2tlZCA9IHZhbHVlOworCQkJCW9DLmcgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLmcpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tEMDFYW3JnYmFXcml0ZU1hc2sgJiAweDNdWzBdKSkpOworCQkJCW1hc2tlZCA9IEFzPEZsb2F0ND4oQXM8SW50ND4obWFza2VkKSAmICpQb2ludGVyPEludDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrRDAxWFtyZ2JhV3JpdGVNYXNrICYgMHgzXVswXSkpKTsKKwkJCQlvQy5nID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5nKSB8IEFzPEludDQ+KG1hc2tlZCkpOworCQkJfQorCisJCQlvQy5nID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5nKSAmICpQb2ludGVyPEludDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrUTIzWCkgKyB4TWFzayAqIDE2LCAxNikpOworCQkJdmFsdWUgPSBBczxGbG9hdDQ+KEFzPEludDQ+KHZhbHVlKSAmICpQb2ludGVyPEludDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrUTIzWCkgKyB4TWFzayAqIDE2LCAxNikpOworCQkJb0MuZyA9IEFzPEZsb2F0ND4oQXM8SW50ND4ob0MuZykgfCBBczxJbnQ0Pih2YWx1ZSkpOworCQkJKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIpID0gb0MuZzsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF9BMzJCMzJHMzJSMzJGOgorCQkJYnVmZmVyID0gY0J1ZmZlciArIDE2ICogeDsKKworCQkJeworCQkJCXZhbHVlID0gKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIsIDE2KTsKKworCQkJCWlmKHJnYmFXcml0ZU1hc2sgIT0gMHgwMDAwMDAwRikKKwkJCQl7CisJCQkJCUZsb2F0NCBtYXNrZWQgPSB2YWx1ZTsKKwkJCQkJb0MuciA9IEFzPEZsb2F0ND4oQXM8SW50ND4ob0MucikgJiAqUG9pbnRlcjxJbnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWFza0Q0WFtyZ2JhV3JpdGVNYXNrXVswXSkpKTsKKwkJCQkJbWFza2VkID0gQXM8RmxvYXQ0PihBczxJbnQ0PihtYXNrZWQpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tENFhbcmdiYVdyaXRlTWFza11bMF0pKSk7CisJCQkJCW9DLnIgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLnIpIHwgQXM8SW50ND4obWFza2VkKSk7CisJCQkJfQorCQkJCQorCQkJCW9DLnIgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLnIpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tYMFgpICsgeE1hc2sgKiAxNiwgMTYpKTsKKwkJCQl2YWx1ZSA9IEFzPEZsb2F0ND4oQXM8SW50ND4odmFsdWUpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tYMFgpICsgeE1hc2sgKiAxNiwgMTYpKTsKKwkJCQlvQy5yID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5yKSB8IEFzPEludDQ+KHZhbHVlKSk7CisJCQkJKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIsIDE2KSA9IG9DLnI7CisJCQl9CisKKwkJCXsKKwkJCQl2YWx1ZSA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyICsgMTYsIDE2KTsKKworCQkJCWlmKHJnYmFXcml0ZU1hc2sgIT0gMHgwMDAwMDAwRikKKwkJCQl7CQorCQkJCQlGbG9hdDQgbWFza2VkID0gdmFsdWU7CisJCQkJCW9DLmcgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLmcpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tENFhbcmdiYVdyaXRlTWFza11bMF0pKSk7CisJCQkJCW1hc2tlZCA9IEFzPEZsb2F0ND4oQXM8SW50ND4obWFza2VkKSAmICpQb2ludGVyPEludDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrRDRYW3JnYmFXcml0ZU1hc2tdWzBdKSkpOworCQkJCQlvQy5nID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5nKSB8IEFzPEludDQ+KG1hc2tlZCkpOworCQkJCX0KKworCQkJCW9DLmcgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLmcpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tYMVgpICsgeE1hc2sgKiAxNiwgMTYpKTsKKwkJCQl2YWx1ZSA9IEFzPEZsb2F0ND4oQXM8SW50ND4odmFsdWUpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tYMVgpICsgeE1hc2sgKiAxNiwgMTYpKTsKKwkJCQlvQy5nID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5nKSB8IEFzPEludDQ+KHZhbHVlKSk7CisJCQkJKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIgKyAxNiwgMTYpID0gb0MuZzsKKwkJCX0KKworCQkJYnVmZmVyICs9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGNvbG9yUGl0Y2hCW2luZGV4XSkpOworCisJCQl7CisJCQkJdmFsdWUgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlciwgMTYpOworCisJCQkJaWYocmdiYVdyaXRlTWFzayAhPSAweDAwMDAwMDBGKQorCQkJCXsKKwkJCQkJRmxvYXQ0IG1hc2tlZCA9IHZhbHVlOworCQkJCQlvQy5iID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5iKSAmICpQb2ludGVyPEludDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrRDRYW3JnYmFXcml0ZU1hc2tdWzBdKSkpOworCQkJCQltYXNrZWQgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG1hc2tlZCkgJiAqUG9pbnRlcjxJbnQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaW52TWFza0Q0WFtyZ2JhV3JpdGVNYXNrXVswXSkpKTsKKwkJCQkJb0MuYiA9IEFzPEZsb2F0ND4oQXM8SW50ND4ob0MuYikgfCBBczxJbnQ0PihtYXNrZWQpKTsKKwkJCQl9CisKKwkJCQlvQy5iID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5iKSAmICpQb2ludGVyPEludDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXNrWDJYKSArIHhNYXNrICogMTYsIDE2KSk7CisJCQkJdmFsdWUgPSBBczxGbG9hdDQ+KEFzPEludDQ+KHZhbHVlKSAmICpQb2ludGVyPEludDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrWDJYKSArIHhNYXNrICogMTYsIDE2KSk7CisJCQkJb0MuYiA9IEFzPEZsb2F0ND4oQXM8SW50ND4ob0MuYikgfCBBczxJbnQ0Pih2YWx1ZSkpOworCQkJCSpQb2ludGVyPEZsb2F0ND4oYnVmZmVyLCAxNikgPSBvQy5iOworCQkJfQorCisJCQl7CisJCQkJdmFsdWUgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlciArIDE2LCAxNik7CisKKwkJCQlpZihyZ2JhV3JpdGVNYXNrICE9IDB4MDAwMDAwMEYpCisJCQkJeworCQkJCQlGbG9hdDQgbWFza2VkID0gdmFsdWU7CisJCQkJCW9DLmEgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLmEpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tENFhbcmdiYVdyaXRlTWFza11bMF0pKSk7CisJCQkJCW1hc2tlZCA9IEFzPEZsb2F0ND4oQXM8SW50ND4obWFza2VkKSAmICpQb2ludGVyPEludDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxpbnZNYXNrRDRYW3JnYmFXcml0ZU1hc2tdWzBdKSkpOworCQkJCQlvQy5hID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5hKSB8IEFzPEludDQ+KG1hc2tlZCkpOworCQkJCX0KKworCQkJCW9DLmEgPSBBczxGbG9hdDQ+KEFzPEludDQ+KG9DLmEpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1hc2tYM1gpICsgeE1hc2sgKiAxNiwgMTYpKTsKKwkJCQl2YWx1ZSA9IEFzPEZsb2F0ND4oQXM8SW50ND4odmFsdWUpICYgKlBvaW50ZXI8SW50ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGludk1hc2tYM1gpICsgeE1hc2sgKiAxNiwgMTYpKTsKKwkJCQlvQy5hID0gQXM8RmxvYXQ0PihBczxJbnQ0PihvQy5hKSB8IEFzPEludDQ+KHZhbHVlKSk7CisJCQkJKlBvaW50ZXI8RmxvYXQ0PihidWZmZXIgKyAxNiwgMTYpID0gb0MuYTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpwc18xX3goUmVnaXN0ZXJzICZyLCBJbnQgY01hc2tbNF0pCisJeworCQlpbnQgcGFkID0gMDsgICAgICAgIC8vIENvdW50IG51bWJlciBvZiB0ZXhtM3gzcGFkIGluc3RydWN0aW9ucworCQlDb2xvcjRpIGRQYWlyaW5nOyAgIC8vIERlc3RpbmF0aW9uIGZvciBmaXJzdCBwYWlyaW5nIGluc3RydWN0aW9uCisKKwkJZm9yKGludCBpID0gMDsgaSA8IHBpeGVsU2hhZGVyLT5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQljb25zdCBTaGFkZXJJbnN0cnVjdGlvbiAqaW5zdHJ1Y3Rpb24gPSBwaXhlbFNoYWRlci0+Z2V0SW5zdHJ1Y3Rpb24oaSk7CisJCQlPcDo6T3Bjb2RlIG9wY29kZSA9IGluc3RydWN0aW9uLT5nZXRPcGNvZGUoKTsKKworCQkvLwkjaWZuZGVmIE5ERUJVRyAgIC8vIEZJWE1FOiBDZW50cmFsaXplIGRlYnVnIG91dHB1dCBjb250cm9sCisJCS8vCQlwaXhlbFNoYWRlci0+cHJpbnRJbnN0cnVjdGlvbihpLCAiZGVidWcudHh0Iik7CisJCS8vCSNlbmRpZgorCisJCQlpZihvcGNvZGUgPT0gT3A6Ok9QQ09ERV9EQ0wgfHwgb3Bjb2RlID09IE9wOjpPUENPREVfREVGIHx8IG9wY29kZSA9PSBPcDo6T1BDT0RFX0RFRkkgfHwgb3Bjb2RlID09IE9wOjpPUENPREVfREVGQikKKwkJCXsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJY29uc3QgRHN0ICZkc3QgPSBpbnN0cnVjdGlvbi0+Z2V0RGVzdGluYXRpb25QYXJhbWV0ZXIoKTsKKwkJCWNvbnN0IFNyYyAmc3JjMCA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMCk7CisJCQljb25zdCBTcmMgJnNyYzEgPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDEpOworCQkJY29uc3QgU3JjICZzcmMyID0gaW5zdHJ1Y3Rpb24tPmdldFNvdXJjZVBhcmFtZXRlcigyKTsKKwkJCWNvbnN0IFNyYyAmc3JjMyA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMyk7CisKKwkJCWJvb2wgcGFpcmluZyA9IGkgKyAxIDwgcGl4ZWxTaGFkZXItPmdldExlbmd0aCgpICYmIHBpeGVsU2hhZGVyLT5nZXRJbnN0cnVjdGlvbihpICsgMSktPmlzQ29pc3N1ZSgpOyAgIC8vIEZpcnN0IGluc3RydWN0aW9uIG9mIHBhaXIKKwkJCWJvb2wgY29pc3N1ZSA9IGluc3RydWN0aW9uLT5pc0NvaXNzdWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlY29uZCBpbnN0cnVjdGlvbiBvZiBwYWlyCisKKwkJCUNvbG9yNGkgZDsKKwkJCUNvbG9yNGkgczA7CisJCQlDb2xvcjRpIHMxOworCQkJQ29sb3I0aSBzMjsKKwkJCUNvbG9yNGkgczM7CisKKwkJCWlmKHNyYzAudHlwZSAhPSBTcmM6OlBBUkFNRVRFUl9WT0lEKSBzMCA9IHJlZ2kociwgc3JjMCk7CisJCQlpZihzcmMxLnR5cGUgIT0gU3JjOjpQQVJBTUVURVJfVk9JRCkgczEgPSByZWdpKHIsIHNyYzEpOworCQkJaWYoc3JjMi50eXBlICE9IFNyYzo6UEFSQU1FVEVSX1ZPSUQpIHMyID0gcmVnaShyLCBzcmMyKTsKKwkJCWlmKHNyYzMudHlwZSAhPSBTcmM6OlBBUkFNRVRFUl9WT0lEKSBzMyA9IHJlZ2kociwgc3JjMyk7CisKKwkJCXN3aXRjaChvcGNvZGUpCisJCQl7CisJCQljYXNlIE9wOjpPUENPREVfUFNfMV8wOgkJCQkJCQkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1BTXzFfMToJCQkJCQkJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9QU18xXzI6CQkJCQkJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfUFNfMV8zOgkJCQkJCQkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1BTXzFfNDoJCQkJCQkJCQkJCQkJCQlicmVhazsKKworCQkJY2FzZSBPcDo6T1BDT0RFX0RFRjoJCQkJCQkJCQkJCQkJCQlicmVhazsKKworCQkJY2FzZSBPcDo6T1BDT0RFX05PUDoJCQkJCQkJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9NT1Y6CQkJTU9WKGQsIHMwKTsJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfQUREOgkJCUFERChkLCBzMCwgczEpOwkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1NVQjoJCQlTVUIoZCwgczAsIHMxKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9NQUQ6CQkJTUFEKGQsIHMwLCBzMSwgczIpOwkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTVVMOgkJCU1VTChkLCBzMCwgczEpOwkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0RQMzoJCQlEUDMoZCwgczAsIHMxKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9EUDQ6CQkJRFA0KGQsIHMwLCBzMSk7CQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTFJQOgkJCUxSUChkLCBzMCwgczEsIHMyKTsJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1RFWENPT1JEOgorCQkJCWlmKHBpeGVsU2hhZGVyLT5nZXRWZXJzaW9uKCkgPCAweDAxMDQpCisJCQkJeworCQkJCQlURVhDT09SRChkLCBGbG9hdDQoci52eFsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ5WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnpbMiArIGRzdC5pbmRleF0pLCBkc3QuaW5kZXgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZigoc3JjMC5zd2l6emxlICYgMHgzMCkgPT0gMHgyMCkgICAvLyAueHl6CisJCQkJCXsKKwkJCQkJCVRFWENSRChkLCBGbG9hdDQoci52eFsyICsgc3JjMC5pbmRleF0pLCBGbG9hdDQoci52eVsyICsgc3JjMC5pbmRleF0pLCBGbG9hdDQoci52elsyICsgc3JjMC5pbmRleF0pLCBzcmMwLmluZGV4LCBzcmMwLm1vZGlmaWVyID09IFNoYWRlckluc3RydWN0aW9uOjpTb3VyY2VQYXJhbWV0ZXI6Ok1PRElGSUVSX0RaIHx8IHNyYzAubW9kaWZpZXIgPT0gU2hhZGVySW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlcjo6TU9ESUZJRVJfRFcpOworCQkJCQl9CisJCQkJCWVsc2UgICAvLyAueHl3CisJCQkJCXsKKwkJCQkJCVRFWENSRChkLCBGbG9hdDQoci52eFsyICsgc3JjMC5pbmRleF0pLCBGbG9hdDQoci52eVsyICsgc3JjMC5pbmRleF0pLCBGbG9hdDQoci52d1syICsgc3JjMC5pbmRleF0pLCBzcmMwLmluZGV4LCBzcmMwLm1vZGlmaWVyID09IFNoYWRlckluc3RydWN0aW9uOjpTb3VyY2VQYXJhbWV0ZXI6Ok1PRElGSUVSX0RaIHx8IHNyYzAubW9kaWZpZXIgPT0gU2hhZGVySW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlcjo6TU9ESUZJRVJfRFcpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1RFWEtJTEw6CisJCQkJaWYocGl4ZWxTaGFkZXItPmdldFZlcnNpb24oKSA8IDB4MDEwNCkKKwkJCQl7CisJCQkJCVRFWEtJTEwoY01hc2ssIEZsb2F0NChyLnZ4WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnlbMiArIGRzdC5pbmRleF0pLCBGbG9hdDQoci52elsyICsgZHN0LmluZGV4XSkpOworCQkJCX0KKwkJCQllbHNlIGlmKHBpeGVsU2hhZGVyLT5nZXRWZXJzaW9uKCkgPT0gMHgwMTA0KQorCQkJCXsKKwkJCQkJaWYoZHN0LnR5cGUgPT0gRHN0OjpQQVJBTUVURVJfVEVYVFVSRSkKKwkJCQkJeworCQkJCQkJVEVYS0lMTChjTWFzaywgRmxvYXQ0KHIudnhbMiArIGRzdC5pbmRleF0pLCBGbG9hdDQoci52eVsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ6WzIgKyBkc3QuaW5kZXhdKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlURVhLSUxMKGNNYXNrLCByLnJpW2RzdC5pbmRleF0pOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVg6CisJCQkJaWYocGl4ZWxTaGFkZXItPmdldFZlcnNpb24oKSA8IDB4MDEwNCkKKwkJCQl7CisJCQkJCVRFWChyLCBkLCBGbG9hdDQoci52eFsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ5WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnpbMiArIGRzdC5pbmRleF0pLCBkc3QuaW5kZXgsIGZhbHNlKTsKKwkJCQl9CisJCQkJZWxzZSBpZihwaXhlbFNoYWRlci0+Z2V0VmVyc2lvbigpID09IDB4MDEwNCkKKwkJCQl7CisJCQkJCWlmKHNyYzAudHlwZSA9PSBTcmM6OlBBUkFNRVRFUl9URVhUVVJFKQorCQkJCQl7CisJCQkJCQlpZigoc3JjMC5zd2l6emxlICYgMHgzMCkgPT0gMHgyMCkgICAvLyAueHl6CisJCQkJCQl7CisJCQkJCQkJVEVYKHIsIGQsIEZsb2F0NChyLnZ4WzIgKyBzcmMwLmluZGV4XSksIEZsb2F0NChyLnZ5WzIgKyBzcmMwLmluZGV4XSksIEZsb2F0NChyLnZ6WzIgKyBzcmMwLmluZGV4XSksIGRzdC5pbmRleCwgc3JjMC5tb2RpZmllciA9PSBTaGFkZXJJbnN0cnVjdGlvbjo6U291cmNlUGFyYW1ldGVyOjpNT0RJRklFUl9EWiB8fCBzcmMwLm1vZGlmaWVyID09IFNoYWRlckluc3RydWN0aW9uOjpTb3VyY2VQYXJhbWV0ZXI6Ok1PRElGSUVSX0RXKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgICAvLyAueHl3CisJCQkJCQl7CisJCQkJCQkJVEVYKHIsIGQsIEZsb2F0NChyLnZ4WzIgKyBzcmMwLmluZGV4XSksIEZsb2F0NChyLnZ5WzIgKyBzcmMwLmluZGV4XSksIEZsb2F0NChyLnZ3WzIgKyBzcmMwLmluZGV4XSksIGRzdC5pbmRleCwgc3JjMC5tb2RpZmllciA9PSBTaGFkZXJJbnN0cnVjdGlvbjo6U291cmNlUGFyYW1ldGVyOjpNT0RJRklFUl9EWiB8fCBzcmMwLm1vZGlmaWVyID09IFNoYWRlckluc3RydWN0aW9uOjpTb3VyY2VQYXJhbWV0ZXI6Ok1PRElGSUVSX0RXKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVRFWExEKHIsIGQsIHMwLCBkc3QuaW5kZXgsIHNyYzAubW9kaWZpZXIgPT0gU2hhZGVySW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlcjo6TU9ESUZJRVJfRFogfHwgc3JjMC5tb2RpZmllciA9PSBTaGFkZXJJbnN0cnVjdGlvbjo6U291cmNlUGFyYW1ldGVyOjpNT0RJRklFUl9EVyk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBBU1NFUlQoZmFsc2UpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1RFWEJFTToJCQlURVhCRU0ociwgZCwgczAsIEZsb2F0NChyLnZ4WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnlbMiArIGRzdC5pbmRleF0pLCBGbG9hdDQoci52elsyICsgZHN0LmluZGV4XSksIGRzdC5pbmRleCk7CWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1RFWEJFTUw6CQlURVhCRU1MKHIsIGQsIHMwLCBGbG9hdDQoci52eFsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ5WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnpbMiArIGRzdC5pbmRleF0pLCBkc3QuaW5kZXgpOwlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVhSRUcyQVI6CQlURVhSRUcyQVIociwgZCwgczAsIGRzdC5pbmRleCk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVhSRUcyR0I6CQlURVhSRUcyR0IociwgZCwgczAsIGRzdC5pbmRleCk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVhNM1gyUEFEOgkJVEVYTTNYMlBBRChyLCBGbG9hdDQoci52eFsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ5WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnpbMiArIGRzdC5pbmRleF0pLCBzMCwgMCwgc3JjMC5tb2RpZmllciA9PSBTcmM6Ok1PRElGSUVSX1NJR04pOwlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVhNM1gyVEVYOgkJVEVYTTNYMlRFWChyLCBkLCBGbG9hdDQoci52eFsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ5WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnpbMiArIGRzdC5pbmRleF0pLCBkc3QuaW5kZXgsIHMwLCBzcmMwLm1vZGlmaWVyID09IFNyYzo6TU9ESUZJRVJfU0lHTik7CWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1RFWE0zWDNQQUQ6CQlURVhNM1gzUEFEKHIsIEZsb2F0NChyLnZ4WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnlbMiArIGRzdC5pbmRleF0pLCBGbG9hdDQoci52elsyICsgZHN0LmluZGV4XSksIHMwLCBwYWQrKyAlIDIsIHNyYzAubW9kaWZpZXIgPT0gU3JjOjpNT0RJRklFUl9TSUdOKTsJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfVEVYTTNYM1RFWDoJCVRFWE0zWDNURVgociwgZCwgRmxvYXQ0KHIudnhbMiArIGRzdC5pbmRleF0pLCBGbG9hdDQoci52eVsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ6WzIgKyBkc3QuaW5kZXhdKSwgZHN0LmluZGV4LCBzMCwgc3JjMC5tb2RpZmllciA9PSBTcmM6Ok1PRElGSUVSX1NJR04pOwlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVhNM1gzU1BFQzoJVEVYTTNYM1NQRUMociwgZCwgRmxvYXQ0KHIudnhbMiArIGRzdC5pbmRleF0pLCBGbG9hdDQoci52eVsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ6WzIgKyBkc3QuaW5kZXhdKSwgZHN0LmluZGV4LCBzMCwgczEpOwkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfVEVYTTNYM1ZTUEVDOglURVhNM1gzVlNQRUMociwgZCwgRmxvYXQ0KHIudnhbMiArIGRzdC5pbmRleF0pLCBGbG9hdDQoci52eVsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ6WzIgKyBkc3QuaW5kZXhdKSwgZHN0LmluZGV4LCBzMCk7CQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9DTkQ6CQkJQ05EKGQsIHMwLCBzMSwgczIpOwkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfVEVYUkVHMlJHQjoJCVRFWFJFRzJSR0IociwgZCwgczAsIGRzdC5pbmRleCk7CQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1RFWERQM1RFWDoJCVRFWERQM1RFWChyLCBkLCBGbG9hdDQoci52eFsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ5WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnpbMiArIGRzdC5pbmRleF0pLCBkc3QuaW5kZXgsIHMwKTsJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfVEVYTTNYMkRFUFRIOglURVhNM1gyREVQVEgociwgZCwgRmxvYXQ0KHIudnhbMiArIGRzdC5pbmRleF0pLCBGbG9hdDQoci52eVsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ6WzIgKyBkc3QuaW5kZXhdKSwgczAsIHNyYzAubW9kaWZpZXIgPT0gU3JjOjpNT0RJRklFUl9TSUdOKTsJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfVEVYRFAzOgkJCVRFWERQMyhyLCBkLCBGbG9hdDQoci52eFsyICsgZHN0LmluZGV4XSksIEZsb2F0NChyLnZ5WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnpbMiArIGRzdC5pbmRleF0pLCBzMCk7CQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1RFWE0zWDM6CQlURVhNM1gzKHIsIGQsIEZsb2F0NChyLnZ4WzIgKyBkc3QuaW5kZXhdKSwgRmxvYXQ0KHIudnlbMiArIGRzdC5pbmRleF0pLCBGbG9hdDQoci52elsyICsgZHN0LmluZGV4XSksIHMwLCBzcmMwLm1vZGlmaWVyID09IFNyYzo6TU9ESUZJRVJfU0lHTik7IAlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVhERVBUSDoJCVRFWERFUFRIKHIpOwkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0NNUDoJCQlDTVAoZCwgczAsIHMxLCBzMik7CQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9CRU06CQkJQkVNKHIsIGQsIHMwLCBzMSwgZHN0LmluZGV4KTsJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1BIQVNFOgkJCQkJCQkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0VORDoJCQkJCQkJCQkJCQkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKworCQkJaWYoZHN0LnR5cGUgIT0gRHN0OjpQQVJBTUVURVJfVk9JRCAmJiBvcGNvZGUgIT0gT3A6Ok9QQ09ERV9URVhLSUxMKQorCQkJeworCQkJCWlmKGRzdC5zaGlmdCA+IDApCisJCQkJeworCQkJCQlpZihkc3QubWFzayAmIDB4MSkge2QuciA9IEFkZFNhdChkLnIsIGQucik7IGlmKGRzdC5zaGlmdCA+IDEpIGQuciA9IEFkZFNhdChkLnIsIGQucik7IGlmKGRzdC5zaGlmdCA+IDIpIGQuciA9IEFkZFNhdChkLnIsIGQucik7fQorCQkJCQlpZihkc3QubWFzayAmIDB4Mikge2QuZyA9IEFkZFNhdChkLmcsIGQuZyk7IGlmKGRzdC5zaGlmdCA+IDEpIGQuZyA9IEFkZFNhdChkLmcsIGQuZyk7IGlmKGRzdC5zaGlmdCA+IDIpIGQuZyA9IEFkZFNhdChkLmcsIGQuZyk7fQorCQkJCQlpZihkc3QubWFzayAmIDB4NCkge2QuYiA9IEFkZFNhdChkLmIsIGQuYik7IGlmKGRzdC5zaGlmdCA+IDEpIGQuYiA9IEFkZFNhdChkLmIsIGQuYik7IGlmKGRzdC5zaGlmdCA+IDIpIGQuYiA9IEFkZFNhdChkLmIsIGQuYik7fQorCQkJCQlpZihkc3QubWFzayAmIDB4OCkge2QuYSA9IEFkZFNhdChkLmEsIGQuYSk7IGlmKGRzdC5zaGlmdCA+IDEpIGQuYSA9IEFkZFNhdChkLmEsIGQuYSk7IGlmKGRzdC5zaGlmdCA+IDIpIGQuYSA9IEFkZFNhdChkLmEsIGQuYSk7fQorCQkJCX0KKwkJCQllbHNlIGlmKGRzdC5zaGlmdCA8IDApCisJCQkJeworCQkJCQlpZihkc3QubWFzayAmIDB4MSkgZC5yID0gZC5yID4+IC1kc3Quc2hpZnQ7CisJCQkJCWlmKGRzdC5tYXNrICYgMHgyKSBkLmcgPSBkLmcgPj4gLWRzdC5zaGlmdDsKKwkJCQkJaWYoZHN0Lm1hc2sgJiAweDQpIGQuYiA9IGQuYiA+PiAtZHN0LnNoaWZ0OworCQkJCQlpZihkc3QubWFzayAmIDB4OCkgZC5hID0gZC5hID4+IC1kc3Quc2hpZnQ7CisJCQkJfQorCisJCQkJaWYoZHN0LnNhdHVyYXRlKQorCQkJCXsKKwkJCQkJaWYoZHN0Lm1hc2sgJiAweDEpIHtkLnIgPSBNaW4oZC5yLCBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSk7IGQuciA9IE1heChkLnIsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKTt9CisJCQkJCWlmKGRzdC5tYXNrICYgMHgyKSB7ZC5nID0gTWluKGQuZywgU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOyBkLmcgPSBNYXgoZC5nLCBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKSk7fQorCQkJCQlpZihkc3QubWFzayAmIDB4NCkge2QuYiA9IE1pbihkLmIsIFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApKTsgZC5iID0gTWF4KGQuYiwgU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCkpO30KKwkJCQkJaWYoZHN0Lm1hc2sgJiAweDgpIHtkLmEgPSBNaW4oZC5hLCBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSk7IGQuYSA9IE1heChkLmEsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKTt9CisJCQkJfQorCisJCQkJaWYocGFpcmluZykKKwkJCQl7CisJCQkJCWlmKGRzdC5tYXNrICYgMHgxKSBkUGFpcmluZy5yID0gZC5yOworCQkJCQlpZihkc3QubWFzayAmIDB4MikgZFBhaXJpbmcuZyA9IGQuZzsKKwkJCQkJaWYoZHN0Lm1hc2sgJiAweDQpIGRQYWlyaW5nLmIgPSBkLmI7CisJCQkJCWlmKGRzdC5tYXNrICYgMHg4KSBkUGFpcmluZy5hID0gZC5hOworCQkJCX0KKwkJCQorCQkJCWlmKGNvaXNzdWUpCisJCQkJeworCQkJCQljb25zdCBEc3QgJmRzdCA9IHBpeGVsU2hhZGVyLT5nZXRJbnN0cnVjdGlvbihpIC0gMSktPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCk7CisKKwkJCQkJd3JpdGVEZXN0aW5hdGlvbihyLCBkUGFpcmluZywgZHN0KTsKKwkJCQl9CisJCQkKKwkJCQlpZighcGFpcmluZykKKwkJCQl7CisJCQkJCXdyaXRlRGVzdGluYXRpb24ociwgZCwgZHN0KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6cHNfMl94KFJlZ2lzdGVycyAmciwgSW50IGNNYXNrWzRdKQorCXsKKwkJci5lbmFibGVJbmRleCA9IDA7CisJCXIuc3RhY2tJbmRleCA9IDA7CisJCQorCQlmb3IoaW50IGkgPSAwOyBpIDwgcGl4ZWxTaGFkZXItPmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCWNvbnN0IFNoYWRlckluc3RydWN0aW9uICppbnN0cnVjdGlvbiA9IHBpeGVsU2hhZGVyLT5nZXRJbnN0cnVjdGlvbihpKTsKKwkJCU9wOjpPcGNvZGUgb3Bjb2RlID0gaW5zdHJ1Y3Rpb24tPmdldE9wY29kZSgpOworCisJCS8vCSNpZm5kZWYgTkRFQlVHICAgLy8gRklYTUU6IENlbnRyYWxpemUgZGVidWcgb3V0cHV0IGNvbnRyb2wKKwkJLy8JCXBpeGVsU2hhZGVyLT5wcmludEluc3RydWN0aW9uKGksICJkZWJ1Zy50eHQiKTsKKwkJLy8JI2VuZGlmCisKKwkJCWlmKG9wY29kZSA9PSBPcDo6T1BDT0RFX0RDTCB8fCBvcGNvZGUgPT0gT3A6Ok9QQ09ERV9ERUYgfHwgb3Bjb2RlID09IE9wOjpPUENPREVfREVGSSB8fCBvcGNvZGUgPT0gT3A6Ok9QQ09ERV9ERUZCKQorCQkJeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQljb25zdCBEc3QgJmRzdCA9IGluc3RydWN0aW9uLT5nZXREZXN0aW5hdGlvblBhcmFtZXRlcigpOworCQkJY29uc3QgU3JjICZzcmMwID0gaW5zdHJ1Y3Rpb24tPmdldFNvdXJjZVBhcmFtZXRlcigwKTsKKwkJCWNvbnN0IFNyYyAmc3JjMSA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMSk7CisJCQljb25zdCBTcmMgJnNyYzIgPSBpbnN0cnVjdGlvbi0+Z2V0U291cmNlUGFyYW1ldGVyKDIpOworCQkJY29uc3QgU3JjICZzcmMzID0gaW5zdHJ1Y3Rpb24tPmdldFNvdXJjZVBhcmFtZXRlcigzKTsKKworCQkJYm9vbCBwcmVkaWNhdGUgPSBpbnN0cnVjdGlvbi0+aXNQcmVkaWNhdGUoKTsKKwkJCUNvbnRyb2wgY29udHJvbCA9IGluc3RydWN0aW9uLT5nZXRDb250cm9sKCk7CisJCQlib29sIHBwID0gZHN0LnBhcnRpYWxQcmVjaXNpb247CisJCQlib29sIHByb2plY3QgPSBpbnN0cnVjdGlvbi0+aXNQcm9qZWN0KCk7CisJCQlib29sIGJpYXMgPSBpbnN0cnVjdGlvbi0+aXNCaWFzKCk7CisKKwkJCUNvbG9yNGYgZDsKKwkJCUNvbG9yNGYgczA7CisJCQlDb2xvcjRmIHMxOworCQkJQ29sb3I0ZiBzMjsKKwkJCUNvbG9yNGYgczM7CisKKwkJCWlmKG9wY29kZSA9PSBPcDo6T1BDT0RFX1RFWEtJTEwpCisJCQl7CisJCQkJaWYoZHN0LnR5cGUgPT0gRHN0OjpQQVJBTUVURVJfVEVYVFVSRSkKKwkJCQl7CisJCQkJCWQueCA9IHIudnhbMiArIGRzdC5pbmRleF07CisJCQkJCWQueSA9IHIudnlbMiArIGRzdC5pbmRleF07CisJCQkJCWQueiA9IHIudnpbMiArIGRzdC5pbmRleF07CisJCQkJCWQudyA9IHIudndbMiArIGRzdC5pbmRleF07CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWQgPSByLnJmW2RzdC5pbmRleF07CisJCQkJfQorCQkJfQorCisJCQlpZihzcmMwLnR5cGUgIT0gU3JjOjpQQVJBTUVURVJfVk9JRCkgczAgPSByZWcociwgc3JjMCk7CisJCQlpZihzcmMxLnR5cGUgIT0gU3JjOjpQQVJBTUVURVJfVk9JRCkgczEgPSByZWcociwgc3JjMSk7CisJCQlpZihzcmMyLnR5cGUgIT0gU3JjOjpQQVJBTUVURVJfVk9JRCkgczIgPSByZWcociwgc3JjMik7CisJCQlpZihzcmMzLnR5cGUgIT0gU3JjOjpQQVJBTUVURVJfVk9JRCkgczMgPSByZWcociwgc3JjMyk7CisKKwkJCXN3aXRjaChvcGNvZGUpCisJCQl7CisJCQljYXNlIE9wOjpPUENPREVfUFNfMl8wOgkJCQkJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfUFNfMl94OgkJCQkJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfUFNfM18wOgkJCQkJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfREVGOgkJCQkJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfRENMOgkJCQkJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTk9QOgkJCQkJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTU9WOgkJbW92KGQsIHMwKTsJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfQUREOgkJYWRkKGQsIHMwLCBzMSk7CQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfU1VCOgkJc3ViKGQsIHMwLCBzMSk7CQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTVVMOgkJbXVsKGQsIHMwLCBzMSk7CQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTUFEOgkJbWFkKGQsIHMwLCBzMSwgczIpOwkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfRFAyQUREOgkJZHAyYWRkKGQsIHMwLCBzMSwgczIpOwkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9EUDM6CQlkcDMoZCwgczAsIHMxKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9EUDQ6CQlkcDQoZCwgczAsIHMxKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9DTVA6CQljbXAoZCwgczAsIHMxLCBzMik7CQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9GUkM6CQlmcmMoZCwgczApOwkJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9FWFA6CQlleHAoZCwgczAsIHBwKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9MT0c6CQlsb2coZCwgczAsIHBwKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9SQ1A6CQlyY3AoZCwgczAsIHBwKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9SU1E6CQlyc3EoZCwgczAsIHBwKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9NSU46CQltaW4oZCwgczAsIHMxKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9NQVg6CQltYXgoZCwgczAsIHMxKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9MUlA6CQlscnAoZCwgczAsIHMxLCBzMik7CQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9QT1c6CQlwb3coZCwgczAsIHMxLCBwcCk7CQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9DUlM6CQljcnMoZCwgczAsIHMxKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9OUk06CQlucm0oZCwgczAsIHBwKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9BQlM6CQlhYnMoZCwgczApOwkJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9TSU5DT1M6CQlzaW5jb3MoZCwgczAsIHBwKTsJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX000WDQ6CQlNNFg0KHIsIGQsIHMwLCBzcmMxKTsJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTTRYMzoJCU00WDMociwgZCwgczAsIHNyYzEpOwkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9NM1g0OgkJTTNYNChyLCBkLCBzMCwgc3JjMSk7CQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX00zWDM6CQlNM1gzKHIsIGQsIHMwLCBzcmMxKTsJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTTNYMjoJCU0zWDIociwgZCwgczAsIHNyYzEpOwkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVg6CQlURVhMRChyLCBkLCBzMCwgc3JjMSwgcHJvamVjdCwgYmlhcyk7CQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfVEVYTEREOgkJVEVYTEREKHIsIGQsIHMwLCBzcmMxLCBzMiwgczMsIHByb2plY3QsIGJpYXMpOwlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVhMREw6CQlURVhMREwociwgZCwgczAsIHNyYzEsIHByb2plY3QsIGJpYXMpOwkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1RFWEtJTEw6CVRFWEtJTEwoY01hc2ssIGQsIGRzdC5tYXNrKTsJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0RTWDoJCURTWChkLCBzMCk7CQkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0RTWToJCURTWShkLCBzMCk7CQkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0JSRUFLOgkJQlJFQUsocik7CQkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0JSRUFLQzoJCUJSRUFLQyhyLCBzMCwgczEsIGNvbnRyb2wpOwkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0JSRUFLUDoJCUJSRUFLUChyLCBzcmMwKTsJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0NBTEw6CQlDQUxMKHIsIGRzdC5pbmRleCk7CQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9DQUxMTlo6CQlDQUxMTloociwgZHN0LmluZGV4LCBzcmMwKTsJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9FTFNFOgkJRUxTRShyKTsJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfRU5ESUY6CQlFTkRJRihyKTsJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfRU5ETE9PUDoJRU5ETE9PUChyKTsJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfRU5EUkVQOgkJRU5EUkVQKHIpOwkJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9JRjoJCQlJRihyLCBzcmMwKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9JRkM6CQlJRkMociwgczAsIHMxLCBjb250cm9sKTsJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9MQUJFTDoJCUxBQkVMKGRzdC5pbmRleCk7CQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9MT09QOgkJTE9PUChyLCBzcmMxKTsJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9SRVA6CQlSRVAociwgc3JjMCk7CQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfUkVUOgkJUkVUKHIpOwkJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfU0VUUDoJCXNldHAoZCwgczAsIHMxLCBjb250cm9sKTsJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9FTkQ6CQkJCQkJCQkJCQkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKworCQkJaWYoZHN0LnR5cGUgIT0gRHN0OjpQQVJBTUVURVJfVk9JRCAmJiBkc3QudHlwZSAhPSBEc3Q6OlBBUkFNRVRFUl9MQUJFTCAmJiBvcGNvZGUgIT0gT3A6Ok9QQ09ERV9URVhLSUxMKQorCQkJeworCQkJCWlmKGRzdC5zYXR1cmF0ZSkKKwkJCQl7CisJCQkJCWlmKGRzdC54KSBkLnIgPSBNYXgoZC5yLCBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworCQkJCQlpZihkc3QueSkgZC5nID0gTWF4KGQuZywgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKwkJCQkJaWYoZHN0LnopIGQuYiA9IE1heChkLmIsIEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSk7CisJCQkJCWlmKGRzdC53KSBkLmEgPSBNYXgoZC5hLCBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworCisJCQkJCWlmKGRzdC54KSBkLnIgPSBNaW4oZC5yLCBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikpOworCQkJCQlpZihkc3QueSkgZC5nID0gTWluKGQuZywgRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpKTsKKwkJCQkJaWYoZHN0LnopIGQuYiA9IE1pbihkLmIsIEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSk7CisJCQkJCWlmKGRzdC53KSBkLmEgPSBNaW4oZC5hLCBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikpOworCQkJCX0KKworCQkJCWlmKHBpeGVsU2hhZGVyLT5jb250YWluc0R5bmFtaWNCcmFuY2hpbmcoKSkKKwkJCQl7CisJCQkJCUNvbG9yNGYgcERzdDsgICAvLyBGSVhNRTogUmVuYW1lCisKKwkJCQkJc3dpdGNoKGRzdC50eXBlKQorCQkJCQl7CisJCQkJCWNhc2UgRHN0OjpQQVJBTUVURVJfVEVNUDoKKwkJCQkJCWlmKGRzdC54KSBwRHN0LnggPSByLnJmW2RzdC5pbmRleF0ueDsKKwkJCQkJCWlmKGRzdC55KSBwRHN0LnkgPSByLnJmW2RzdC5pbmRleF0ueTsKKwkJCQkJCWlmKGRzdC56KSBwRHN0LnogPSByLnJmW2RzdC5pbmRleF0uejsKKwkJCQkJCWlmKGRzdC53KSBwRHN0LncgPSByLnJmW2RzdC5pbmRleF0udzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIERzdDo6UEFSQU1FVEVSX0NPTE9ST1VUOgorCQkJCQkJaWYoZHN0LngpIHBEc3QueCA9IHIub0NbZHN0LmluZGV4XS54OworCQkJCQkJaWYoZHN0LnkpIHBEc3QueSA9IHIub0NbZHN0LmluZGV4XS55OworCQkJCQkJaWYoZHN0LnopIHBEc3QueiA9IHIub0NbZHN0LmluZGV4XS56OworCQkJCQkJaWYoZHN0LncpIHBEc3QudyA9IHIub0NbZHN0LmluZGV4XS53OworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRHN0OjpQQVJBTUVURVJfUFJFRElDQVRFOgorCQkJCQkJaWYoZHN0LngpIHBEc3QueCA9IHIucDAueDsKKwkJCQkJCWlmKGRzdC55KSBwRHN0LnkgPSByLnAwLnk7CisJCQkJCQlpZihkc3QueikgcERzdC56ID0gci5wMC56OworCQkJCQkJaWYoZHN0LncpIHBEc3QudyA9IHIucDAudzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIERzdDo6UEFSQU1FVEVSX0RFUFRIT1VUOgorCQkJCQkJcERzdC54ID0gci5vRGVwdGg7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJCX0KKwkJCQkKKwkJCQkJSW50NCBlbmFibGUgPSByLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXhdICYgci5lbmFibGVCcmVhazsKKworCQkJCQlJbnQ0IHhFbmFibGUgPSBlbmFibGU7CisJCQkJCUludDQgeUVuYWJsZSA9IGVuYWJsZTsKKwkJCQkJSW50NCB6RW5hYmxlID0gZW5hYmxlOworCQkJCQlJbnQ0IHdFbmFibGUgPSBlbmFibGU7CisKKwkJCQkJaWYocHJlZGljYXRlKQorCQkJCQl7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHBTd2l6emxlID0gaW5zdHJ1Y3Rpb24tPmdldFByZWRpY2F0ZVN3aXp6bGUoKTsKKworCQkJCQkJRmxvYXQ0IHhQcmVkaWNhdGUgPSByLnAwWyhwU3dpenpsZSA+PiAwKSAmIDB4MDNdOworCQkJCQkJRmxvYXQ0IHlQcmVkaWNhdGUgPSByLnAwWyhwU3dpenpsZSA+PiAyKSAmIDB4MDNdOworCQkJCQkJRmxvYXQ0IHpQcmVkaWNhdGUgPSByLnAwWyhwU3dpenpsZSA+PiA0KSAmIDB4MDNdOworCQkJCQkJRmxvYXQ0IHdQcmVkaWNhdGUgPSByLnAwWyhwU3dpenpsZSA+PiA2KSAmIDB4MDNdOworCisJCQkJCQlpZighaW5zdHJ1Y3Rpb24tPmlzUHJlZGljYXRlTm90KCkpCisJCQkJCQl7CisJCQkJCQkJaWYoZHN0LngpIHhFbmFibGUgPSB4RW5hYmxlICYgQXM8SW50ND4oeFByZWRpY2F0ZSk7CisJCQkJCQkJaWYoZHN0LnkpIHlFbmFibGUgPSB5RW5hYmxlICYgQXM8SW50ND4oeVByZWRpY2F0ZSk7CisJCQkJCQkJaWYoZHN0LnopIHpFbmFibGUgPSB6RW5hYmxlICYgQXM8SW50ND4oelByZWRpY2F0ZSk7CisJCQkJCQkJaWYoZHN0LncpIHdFbmFibGUgPSB3RW5hYmxlICYgQXM8SW50ND4od1ByZWRpY2F0ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJaWYoZHN0LngpIHhFbmFibGUgPSB4RW5hYmxlICYgfkFzPEludDQ+KHhQcmVkaWNhdGUpOworCQkJCQkJCWlmKGRzdC55KSB5RW5hYmxlID0geUVuYWJsZSAmIH5BczxJbnQ0Pih5UHJlZGljYXRlKTsKKwkJCQkJCQlpZihkc3QueikgekVuYWJsZSA9IHpFbmFibGUgJiB+QXM8SW50ND4oelByZWRpY2F0ZSk7CisJCQkJCQkJaWYoZHN0LncpIHdFbmFibGUgPSB3RW5hYmxlICYgfkFzPEludDQ+KHdQcmVkaWNhdGUpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYoZHN0LngpIGQueCA9IEFzPEZsb2F0ND4oQXM8SW50ND4oZC54KSAmIHhFbmFibGUpOworCQkJCQlpZihkc3QueSkgZC55ID0gQXM8RmxvYXQ0PihBczxJbnQ0PihkLnkpICYgeUVuYWJsZSk7CisJCQkJCWlmKGRzdC56KSBkLnogPSBBczxGbG9hdDQ+KEFzPEludDQ+KGQueikgJiB6RW5hYmxlKTsKKwkJCQkJaWYoZHN0LncpIGQudyA9IEFzPEZsb2F0ND4oQXM8SW50ND4oZC53KSAmIHdFbmFibGUpOworCisJCQkJCWlmKGRzdC54KSBkLnggPSBBczxGbG9hdDQ+KEFzPEludDQ+KGQueCkgfCAoQXM8SW50ND4ocERzdC54KSAmIH54RW5hYmxlKSk7CisJCQkJCWlmKGRzdC55KSBkLnkgPSBBczxGbG9hdDQ+KEFzPEludDQ+KGQueSkgfCAoQXM8SW50ND4ocERzdC55KSAmIH55RW5hYmxlKSk7CisJCQkJCWlmKGRzdC56KSBkLnogPSBBczxGbG9hdDQ+KEFzPEludDQ+KGQueikgfCAoQXM8SW50ND4ocERzdC56KSAmIH56RW5hYmxlKSk7CisJCQkJCWlmKGRzdC53KSBkLncgPSBBczxGbG9hdDQ+KEFzPEludDQ+KGQudykgfCAoQXM8SW50ND4ocERzdC53KSAmIH53RW5hYmxlKSk7CisJCQkJfQorCisJCQkJc3dpdGNoKGRzdC50eXBlKQorCQkJCXsKKwkJCQljYXNlIERzdDo6UEFSQU1FVEVSX1RFTVA6CisJCQkJCWlmKGRzdC54KSByLnJmW2RzdC5pbmRleF0ueCA9IGQueDsKKwkJCQkJaWYoZHN0LnkpIHIucmZbZHN0LmluZGV4XS55ID0gZC55OworCQkJCQlpZihkc3Queikgci5yZltkc3QuaW5kZXhdLnogPSBkLno7CisJCQkJCWlmKGRzdC53KSByLnJmW2RzdC5pbmRleF0udyA9IGQudzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9DT0xPUk9VVDoKKwkJCQkJaWYoZHN0LngpIHIub0NbZHN0LmluZGV4XS54ID0gZC54OworCQkJCQlpZihkc3QueSkgci5vQ1tkc3QuaW5kZXhdLnkgPSBkLnk7CisJCQkJCWlmKGRzdC56KSByLm9DW2RzdC5pbmRleF0ueiA9IGQuejsKKwkJCQkJaWYoZHN0LncpIHIub0NbZHN0LmluZGV4XS53ID0gZC53OworCQkJCQlicmVhazsKKwkJCQljYXNlIERzdDo6UEFSQU1FVEVSX1BSRURJQ0FURToKKwkJCQkJaWYoZHN0LngpIHIucDAueCA9IGQueDsKKwkJCQkJaWYoZHN0LnkpIHIucDAueSA9IGQueTsKKwkJCQkJaWYoZHN0LnopIHIucDAueiA9IGQuejsKKwkJCQkJaWYoZHN0LncpIHIucDAudyA9IGQudzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9ERVBUSE9VVDoKKwkJCQkJci5vRGVwdGggPSBkLng7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYocmV0dXJucykKKwkJeworCQkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2socmV0dXJuQmxvY2spOworCQl9CisJfQorCisJU2hvcnQ0IFBpeGVsUm91dGluZTo6Y29udmVydEZpeGVkMTIoRmxvYXQ0ICZjZikKKwl7CisJCXJldHVybiBSb3VuZFNob3J0NChjZiAqIEZsb2F0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6Y29udmVydEZpeGVkMTIoQ29sb3I0aSAmY2ksIENvbG9yNGYgJmNmKQorCXsKKwkJY2kuciA9IGNvbnZlcnRGaXhlZDEyKGNmLnIpOworCQljaS5nID0gY29udmVydEZpeGVkMTIoY2YuZyk7CisJCWNpLmIgPSBjb252ZXJ0Rml4ZWQxMihjZi5iKTsKKwkJY2kuYSA9IGNvbnZlcnRGaXhlZDEyKGNmLmEpOworCX0KKworCVVTaG9ydDQgUGl4ZWxSb3V0aW5lOjpjb252ZXJ0Rml4ZWQxNihGbG9hdDQgJmNmLCBib29sIHNhdHVyYXRlKQorCXsKKwkJcmV0dXJuIFVTaG9ydDQoY2YgKiBGbG9hdDQoMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGKSwgc2F0dXJhdGUpOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpjb252ZXJ0Rml4ZWQxNihDb2xvcjRpICZjaSwgQ29sb3I0ZiAmY2YsIGJvb2wgc2F0dXJhdGUpCisJeworCQljaS5yID0gY29udmVydEZpeGVkMTYoY2Yuciwgc2F0dXJhdGUpOworCQljaS5nID0gY29udmVydEZpeGVkMTYoY2YuZywgc2F0dXJhdGUpOworCQljaS5iID0gY29udmVydEZpeGVkMTYoY2YuYiwgc2F0dXJhdGUpOworCQljaS5hID0gY29udmVydEZpeGVkMTYoY2YuYSwgc2F0dXJhdGUpOworCX0KKworCUZsb2F0NCBQaXhlbFJvdXRpbmU6OmNvbnZlcnRTaWduZWQxMihTaG9ydDQgJmNpKQorCXsKKwkJcmV0dXJuIEZsb2F0NChjaSkgKiBGbG9hdDQoMS4wZiAvIDB4MEZGRSk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OmNvbnZlcnRTaWduZWQxMihDb2xvcjRmICZjZiwgQ29sb3I0aSAmY2kpCisJeworCQljZi5yID0gY29udmVydFNpZ25lZDEyKGNpLnIpOworCQljZi5nID0gY29udmVydFNpZ25lZDEyKGNpLmcpOworCQljZi5iID0gY29udmVydFNpZ25lZDEyKGNpLmIpOworCQljZi5hID0gY29udmVydFNpZ25lZDEyKGNpLmEpOworCX0KKworCUZsb2F0NCBQaXhlbFJvdXRpbmU6OmNvbnZlcnRVbnNpZ25lZDE2KFVTaG9ydDQgY2kpCisJeworCQlyZXR1cm4gRmxvYXQ0KGNpKSAqIEZsb2F0NCgxLjBmIC8gMHhGRkZGLCAxLjBmIC8gMHhGRkZGLCAxLjBmIC8gMHhGRkZGLCAxLjBmIC8gMHhGRkZGKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6c1JHQnRvTGluZWFyMTZfMTYoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZjKQorCXsKKwkJYy5yID0gQXM8VVNob3J0ND4oYy5yKSA+PiA0OworCQljLmcgPSBBczxVU2hvcnQ0PihjLmcpID4+IDQ7CisJCWMuYiA9IEFzPFVTaG9ydDQ+KGMuYikgPj4gNDsKKworCQlzUkdCdG9MaW5lYXIxMl8xNihyLCBjKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6c1JHQnRvTGluZWFyMTJfMTYoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZjKQorCXsKKwkJUG9pbnRlcjxCeXRlPiBMVVQgPSByLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsc1JHQnRvTGluMTJfMTYpOworCisJCWMuciA9IEluc2VydChjLnIsICpQb2ludGVyPFNob3J0PihMVVQgKyAyICogSW50KEV4dHJhY3QoYy5yLCAwKSkpLCAwKTsKKwkJYy5yID0gSW5zZXJ0KGMuciwgKlBvaW50ZXI8U2hvcnQ+KExVVCArIDIgKiBJbnQoRXh0cmFjdChjLnIsIDEpKSksIDEpOworCQljLnIgPSBJbnNlcnQoYy5yLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMuciwgMikpKSwgMik7CisJCWMuciA9IEluc2VydChjLnIsICpQb2ludGVyPFNob3J0PihMVVQgKyAyICogSW50KEV4dHJhY3QoYy5yLCAzKSkpLCAzKTsKKworCQljLmcgPSBJbnNlcnQoYy5nLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMuZywgMCkpKSwgMCk7CisJCWMuZyA9IEluc2VydChjLmcsICpQb2ludGVyPFNob3J0PihMVVQgKyAyICogSW50KEV4dHJhY3QoYy5nLCAxKSkpLCAxKTsKKwkJYy5nID0gSW5zZXJ0KGMuZywgKlBvaW50ZXI8U2hvcnQ+KExVVCArIDIgKiBJbnQoRXh0cmFjdChjLmcsIDIpKSksIDIpOworCQljLmcgPSBJbnNlcnQoYy5nLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMuZywgMykpKSwgMyk7CisKKwkJYy5iID0gSW5zZXJ0KGMuYiwgKlBvaW50ZXI8U2hvcnQ+KExVVCArIDIgKiBJbnQoRXh0cmFjdChjLmIsIDApKSksIDApOworCQljLmIgPSBJbnNlcnQoYy5iLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMuYiwgMSkpKSwgMSk7CisJCWMuYiA9IEluc2VydChjLmIsICpQb2ludGVyPFNob3J0PihMVVQgKyAyICogSW50KEV4dHJhY3QoYy5iLCAyKSkpLCAyKTsKKwkJYy5iID0gSW5zZXJ0KGMuYiwgKlBvaW50ZXI8U2hvcnQ+KExVVCArIDIgKiBJbnQoRXh0cmFjdChjLmIsIDMpKSksIDMpOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpsaW5lYXJUb1NSR0IxNl8xNihSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmMpCisJeworCQljLnIgPSBBczxVU2hvcnQ0PihjLnIpID4+IDQ7CisJCWMuZyA9IEFzPFVTaG9ydDQ+KGMuZykgPj4gNDsKKwkJYy5iID0gQXM8VVNob3J0ND4oYy5iKSA+PiA0OworCisJCWxpbmVhclRvU1JHQjEyXzE2KHIsIGMpOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpsaW5lYXJUb1NSR0IxMl8xNihSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmMpCisJeworCQlQb2ludGVyPEJ5dGU+IExVVCA9IHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxsaW5Ub1NSR0IxMl8xNik7CisKKwkJYy5yID0gSW5zZXJ0KGMuciwgKlBvaW50ZXI8U2hvcnQ+KExVVCArIDIgKiBJbnQoRXh0cmFjdChjLnIsIDApKSksIDApOworCQljLnIgPSBJbnNlcnQoYy5yLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMuciwgMSkpKSwgMSk7CisJCWMuciA9IEluc2VydChjLnIsICpQb2ludGVyPFNob3J0PihMVVQgKyAyICogSW50KEV4dHJhY3QoYy5yLCAyKSkpLCAyKTsKKwkJYy5yID0gSW5zZXJ0KGMuciwgKlBvaW50ZXI8U2hvcnQ+KExVVCArIDIgKiBJbnQoRXh0cmFjdChjLnIsIDMpKSksIDMpOworCisJCWMuZyA9IEluc2VydChjLmcsICpQb2ludGVyPFNob3J0PihMVVQgKyAyICogSW50KEV4dHJhY3QoYy5nLCAwKSkpLCAwKTsKKwkJYy5nID0gSW5zZXJ0KGMuZywgKlBvaW50ZXI8U2hvcnQ+KExVVCArIDIgKiBJbnQoRXh0cmFjdChjLmcsIDEpKSksIDEpOworCQljLmcgPSBJbnNlcnQoYy5nLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMuZywgMikpKSwgMik7CisJCWMuZyA9IEluc2VydChjLmcsICpQb2ludGVyPFNob3J0PihMVVQgKyAyICogSW50KEV4dHJhY3QoYy5nLCAzKSkpLCAzKTsKKworCQljLmIgPSBJbnNlcnQoYy5iLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMuYiwgMCkpKSwgMCk7CisJCWMuYiA9IEluc2VydChjLmIsICpQb2ludGVyPFNob3J0PihMVVQgKyAyICogSW50KEV4dHJhY3QoYy5iLCAxKSkpLCAxKTsKKwkJYy5iID0gSW5zZXJ0KGMuYiwgKlBvaW50ZXI8U2hvcnQ+KExVVCArIDIgKiBJbnQoRXh0cmFjdChjLmIsIDIpKSksIDIpOworCQljLmIgPSBJbnNlcnQoYy5iLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMuYiwgMykpKSwgMyk7CisJfQorCisJRmxvYXQ0IFBpeGVsUm91dGluZTo6bGluZWFyVG9TUkdCKGNvbnN0IEZsb2F0NCAmeCkgICAvLyBBcHByb3hpbWF0ZXMgeF4oMS4wLzIuMikKKwl7CisJCUZsb2F0NCBzcXJ0eCA9IFJjcF9wcChSY3BTcXJ0X3BwKHgpKTsKKwkJRmxvYXQ0IHNSR0IgPSBzcXJ0eCAqIEZsb2F0NCgxLjE0ZikgLSB4ICogRmxvYXQ0KDAuMTRmKTsKKworCQlyZXR1cm4gTWluKE1heChzUkdCLCBGbG9hdDQoMC4wZikpLCBGbG9hdDQoMS4wZikpOworCX0KKworCUZsb2F0NCBQaXhlbFJvdXRpbmU6OnNSR0J0b0xpbmVhcihjb25zdCBGbG9hdDQgJngpICAgLy8gQXBwcm94aW1hdGVzIHheMi4yCisJeworCQlGbG9hdDQgbGluZWFyID0geCAqIHg7CisJCWxpbmVhciA9IGxpbmVhciAqIEZsb2F0NCgwLjczZikgKyBsaW5lYXIgKiB4ICogRmxvYXQ0KDAuMjdmKTsKKworCQlyZXR1cm4gTWluKE1heChsaW5lYXIsIEZsb2F0NCgwLjBmKSksIEZsb2F0NCgxLjBmKSk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6Ok1PVihDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzApCisJeworCQlkc3QuciA9IHNyYzAueDsKKwkJZHN0LmcgPSBzcmMwLnk7CisJCWRzdC5iID0gc3JjMC56OworCQlkc3QuYSA9IHNyYzAudzsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6QUREKENvbG9yNGkgJmRzdCwgQ29sb3I0aSAmc3JjMCwgQ29sb3I0aSAmc3JjMSkKKwl7CisJCWRzdC5yID0gQWRkU2F0KHNyYzAueCwgc3JjMS54KTsKKwkJZHN0LmcgPSBBZGRTYXQoc3JjMC55LCBzcmMxLnkpOworCQlkc3QuYiA9IEFkZFNhdChzcmMwLnosIHNyYzEueik7CisJCWRzdC5hID0gQWRkU2F0KHNyYzAudywgc3JjMS53KTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6U1VCKENvbG9yNGkgJmRzdCwgQ29sb3I0aSAmc3JjMCwgQ29sb3I0aSAmc3JjMSkKKwl7CisJCWRzdC5yID0gU3ViU2F0KHNyYzAueCwgc3JjMS54KTsKKwkJZHN0LmcgPSBTdWJTYXQoc3JjMC55LCBzcmMxLnkpOworCQlkc3QuYiA9IFN1YlNhdChzcmMwLnosIHNyYzEueik7CisJCWRzdC5hID0gU3ViU2F0KHNyYzAudywgc3JjMS53KTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6TUFEKENvbG9yNGkgJmRzdCwgQ29sb3I0aSAmc3JjMCwgQ29sb3I0aSAmc3JjMSwgQ29sb3I0aSAmc3JjMikKKwl7CisJCS8vIEZJWE1FOiBMb25nIGZpeGVkLXBvaW50IG11bHRpcGx5IGZpeHVwCisJCXtkc3QueCA9IE11bEhpZ2goc3JjMC54LCBzcmMxLngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgZHN0LngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgZHN0LngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgZHN0LngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgZHN0LngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgc3JjMi54KTt9CisJCXtkc3QueSA9IE11bEhpZ2goc3JjMC55LCBzcmMxLnkpOyBkc3QueSA9IEFkZFNhdChkc3QueSwgZHN0LnkpOyBkc3QueSA9IEFkZFNhdChkc3QueSwgZHN0LnkpOyBkc3QueSA9IEFkZFNhdChkc3QueSwgZHN0LnkpOyBkc3QueSA9IEFkZFNhdChkc3QueSwgZHN0LnkpOyBkc3QueSA9IEFkZFNhdChkc3QueSwgc3JjMi55KTt9CisJCXtkc3QueiA9IE11bEhpZ2goc3JjMC56LCBzcmMxLnopOyBkc3QueiA9IEFkZFNhdChkc3QueiwgZHN0LnopOyBkc3QueiA9IEFkZFNhdChkc3QueiwgZHN0LnopOyBkc3QueiA9IEFkZFNhdChkc3QueiwgZHN0LnopOyBkc3QueiA9IEFkZFNhdChkc3QueiwgZHN0LnopOyBkc3QueiA9IEFkZFNhdChkc3Queiwgc3JjMi56KTt9CisJCXtkc3QudyA9IE11bEhpZ2goc3JjMC53LCBzcmMxLncpOyBkc3QudyA9IEFkZFNhdChkc3QudywgZHN0LncpOyBkc3QudyA9IEFkZFNhdChkc3QudywgZHN0LncpOyBkc3QudyA9IEFkZFNhdChkc3QudywgZHN0LncpOyBkc3QudyA9IEFkZFNhdChkc3QudywgZHN0LncpOyBkc3QudyA9IEFkZFNhdChkc3Qudywgc3JjMi53KTt9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6Ok1VTChDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpCisJeworCQkvLyBGSVhNRTogTG9uZyBmaXhlZC1wb2ludCBtdWx0aXBseSBmaXh1cAorCQl7ZHN0LnggPSBNdWxIaWdoKHNyYzAueCwgc3JjMS54KTsgZHN0LnggPSBBZGRTYXQoZHN0LngsIGRzdC54KTsgZHN0LnggPSBBZGRTYXQoZHN0LngsIGRzdC54KTsgZHN0LnggPSBBZGRTYXQoZHN0LngsIGRzdC54KTsgZHN0LnggPSBBZGRTYXQoZHN0LngsIGRzdC54KTt9CisJCXtkc3QueSA9IE11bEhpZ2goc3JjMC55LCBzcmMxLnkpOyBkc3QueSA9IEFkZFNhdChkc3QueSwgZHN0LnkpOyBkc3QueSA9IEFkZFNhdChkc3QueSwgZHN0LnkpOyBkc3QueSA9IEFkZFNhdChkc3QueSwgZHN0LnkpOyBkc3QueSA9IEFkZFNhdChkc3QueSwgZHN0LnkpO30KKwkJe2RzdC56ID0gTXVsSGlnaChzcmMwLnosIHNyYzEueik7IGRzdC56ID0gQWRkU2F0KGRzdC56LCBkc3Queik7IGRzdC56ID0gQWRkU2F0KGRzdC56LCBkc3Queik7IGRzdC56ID0gQWRkU2F0KGRzdC56LCBkc3Queik7IGRzdC56ID0gQWRkU2F0KGRzdC56LCBkc3Queik7fQorCQl7ZHN0LncgPSBNdWxIaWdoKHNyYzAudywgc3JjMS53KTsgZHN0LncgPSBBZGRTYXQoZHN0LncsIGRzdC53KTsgZHN0LncgPSBBZGRTYXQoZHN0LncsIGRzdC53KTsgZHN0LncgPSBBZGRTYXQoZHN0LncsIGRzdC53KTsgZHN0LncgPSBBZGRTYXQoZHN0LncsIGRzdC53KTt9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OkRQMyhDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpCisJeworCQlTaG9ydDQgdDA7CisJCVNob3J0NCB0MTsKKworCQkvLyBGSVhNRTogTG9uZyBmaXhlZC1wb2ludCBtdWx0aXBseSBmaXh1cAorCQl0MCA9IE11bEhpZ2goc3JjMC54LCBzcmMxLngpOyB0MCA9IEFkZFNhdCh0MCwgdDApOyB0MCA9IEFkZFNhdCh0MCwgdDApOyB0MCA9IEFkZFNhdCh0MCwgdDApOyB0MCA9IEFkZFNhdCh0MCwgdDApOyAKKwkJdDEgPSBNdWxIaWdoKHNyYzAueSwgc3JjMS55KTsgdDEgPSBBZGRTYXQodDEsIHQxKTsgdDEgPSBBZGRTYXQodDEsIHQxKTsgdDEgPSBBZGRTYXQodDEsIHQxKTsgdDEgPSBBZGRTYXQodDEsIHQxKTsgCisJCXQwID0gQWRkU2F0KHQwLCB0MSk7CisJCXQxID0gTXVsSGlnaChzcmMwLnosIHNyYzEueik7IHQxID0gQWRkU2F0KHQxLCB0MSk7IHQxID0gQWRkU2F0KHQxLCB0MSk7IHQxID0gQWRkU2F0KHQxLCB0MSk7IHQxID0gQWRkU2F0KHQxLCB0MSk7IAorCQl0MCA9IEFkZFNhdCh0MCwgdDEpOworCisJCWRzdC5yID0gdDA7CisJCWRzdC5nID0gdDA7CisJCWRzdC5iID0gdDA7CisJCWRzdC5hID0gdDA7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OkRQNChDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpCisJeworCQlTaG9ydDQgdDA7CisJCVNob3J0NCB0MTsKKworCQkvLyBGSVhNRTogTG9uZyBmaXhlZC1wb2ludCBtdWx0aXBseSBmaXh1cAorCQl0MCA9IE11bEhpZ2goc3JjMC54LCBzcmMxLngpOyB0MCA9IEFkZFNhdCh0MCwgdDApOyB0MCA9IEFkZFNhdCh0MCwgdDApOyB0MCA9IEFkZFNhdCh0MCwgdDApOyB0MCA9IEFkZFNhdCh0MCwgdDApOyAKKwkJdDEgPSBNdWxIaWdoKHNyYzAueSwgc3JjMS55KTsgdDEgPSBBZGRTYXQodDEsIHQxKTsgdDEgPSBBZGRTYXQodDEsIHQxKTsgdDEgPSBBZGRTYXQodDEsIHQxKTsgdDEgPSBBZGRTYXQodDEsIHQxKTsgCisJCXQwID0gQWRkU2F0KHQwLCB0MSk7CisJCXQxID0gTXVsSGlnaChzcmMwLnosIHNyYzEueik7IHQxID0gQWRkU2F0KHQxLCB0MSk7IHQxID0gQWRkU2F0KHQxLCB0MSk7IHQxID0gQWRkU2F0KHQxLCB0MSk7IHQxID0gQWRkU2F0KHQxLCB0MSk7IAorCQl0MCA9IEFkZFNhdCh0MCwgdDEpOworCQl0MSA9IE11bEhpZ2goc3JjMC53LCBzcmMxLncpOyB0MSA9IEFkZFNhdCh0MSwgdDEpOyB0MSA9IEFkZFNhdCh0MSwgdDEpOyB0MSA9IEFkZFNhdCh0MSwgdDEpOyB0MSA9IEFkZFNhdCh0MSwgdDEpOyAKKwkJdDAgPSBBZGRTYXQodDAsIHQxKTsKKworCQlkc3QuciA9IHQwOworCQlkc3QuZyA9IHQwOworCQlkc3QuYiA9IHQwOworCQlkc3QuYSA9IHQwOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpMUlAoQ29sb3I0aSAmZHN0LCBDb2xvcjRpICZzcmMwLCBDb2xvcjRpICZzcmMxLCBDb2xvcjRpICZzcmMyKQorCXsKKwkJLy8gRklYTUU6IExvbmcgZml4ZWQtcG9pbnQgbXVsdGlwbHkgZml4dXAKKwkJe2RzdC54ID0gU3ViU2F0KHNyYzEueCwgc3JjMi54KTsgZHN0LnggPSBNdWxIaWdoKGRzdC54LCBzcmMwLngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgZHN0LngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgZHN0LngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgZHN0LngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgZHN0LngpOyBkc3QueCA9IEFkZFNhdChkc3QueCwgc3JjMi54KTt9CisJCXtkc3QueSA9IFN1YlNhdChzcmMxLnksIHNyYzIueSk7IGRzdC55ID0gTXVsSGlnaChkc3QueSwgc3JjMC55KTsgZHN0LnkgPSBBZGRTYXQoZHN0LnksIGRzdC55KTsgZHN0LnkgPSBBZGRTYXQoZHN0LnksIGRzdC55KTsgZHN0LnkgPSBBZGRTYXQoZHN0LnksIGRzdC55KTsgZHN0LnkgPSBBZGRTYXQoZHN0LnksIGRzdC55KTsgZHN0LnkgPSBBZGRTYXQoZHN0LnksIHNyYzIueSk7fQorCQl7ZHN0LnogPSBTdWJTYXQoc3JjMS56LCBzcmMyLnopOyBkc3QueiA9IE11bEhpZ2goZHN0LnosIHNyYzAueik7IGRzdC56ID0gQWRkU2F0KGRzdC56LCBkc3Queik7IGRzdC56ID0gQWRkU2F0KGRzdC56LCBkc3Queik7IGRzdC56ID0gQWRkU2F0KGRzdC56LCBkc3Queik7IGRzdC56ID0gQWRkU2F0KGRzdC56LCBkc3Queik7IGRzdC56ID0gQWRkU2F0KGRzdC56LCBzcmMyLnopO30KKwkJe2RzdC53ID0gU3ViU2F0KHNyYzEudywgc3JjMi53KTsgZHN0LncgPSBNdWxIaWdoKGRzdC53LCBzcmMwLncpOyBkc3QudyA9IEFkZFNhdChkc3QudywgZHN0LncpOyBkc3QudyA9IEFkZFNhdChkc3QudywgZHN0LncpOyBkc3QudyA9IEFkZFNhdChkc3QudywgZHN0LncpOyBkc3QudyA9IEFkZFNhdChkc3QudywgZHN0LncpOyBkc3QudyA9IEFkZFNhdChkc3Qudywgc3JjMi53KTt9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWENPT1JEKENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgaW50IGNvb3JkaW5hdGUpCisJeworCQlGbG9hdDQgdXc7CisJCUZsb2F0NCB2dzsKKwkJRmxvYXQ0IHN3OworCisJCWlmKHN0YXRlLmludGVycG9sYW50WzIgKyBjb29yZGluYXRlXS5jb21wb25lbnQgJiAweDAxKQorCQl7CisJCQl1dyA9IE1heCh1LCBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworCQkJdXcgPSBNaW4odXcsIEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSk7CisJCQlkc3QuciA9IGNvbnZlcnRGaXhlZDEyKHV3KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRzdC5yID0gU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCk7CisJCX0KKworCQlpZihzdGF0ZS5pbnRlcnBvbGFudFsyICsgY29vcmRpbmF0ZV0uY29tcG9uZW50ICYgMHgwMikKKwkJeworCQkJdncgPSBNYXgodiwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKwkJCXZ3ID0gTWluKHZ3LCBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikpOworCQkJZHN0LmcgPSBjb252ZXJ0Rml4ZWQxMih2dyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkc3QuZyA9IFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApOworCQl9CisKKwkJaWYoc3RhdGUuaW50ZXJwb2xhbnRbMiArIGNvb3JkaW5hdGVdLmNvbXBvbmVudCAmIDB4MDQpCisJCXsKKwkJCXN3ID0gTWF4KHMsIEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSk7CisJCQlzdyA9IE1pbihzdywgRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpKTsKKwkJCWRzdC5iID0gY29udmVydEZpeGVkMTIoc3cpOworCQl9CisJCWVsc2UKKwkJeworCQkJZHN0LmIgPSBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKTsKKwkJfQorCisJCWRzdC5hID0gU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWENSRChDb2xvcjRpICZkc3QsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJnMsIGludCBjb29yZGluYXRlLCBib29sIHByb2plY3QpCisJeworCQlGbG9hdDQgdXcgPSB1OworCQlGbG9hdDQgdncgPSB2OworCQlGbG9hdDQgc3cgPSBzOworCisJCWlmKHByb2plY3QpCisJCXsKKwkJCXV3ICo9IFJjcF9wcChzKTsKKwkJCXZ3ICo9IFJjcF9wcChzKTsKKwkJfQorCisJCWlmKHN0YXRlLmludGVycG9sYW50WzIgKyBjb29yZGluYXRlXS5jb21wb25lbnQgJiAweDAxKQorCQl7CisJCQl1dyAqPSBGbG9hdDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKTsKKwkJCXV3ID0gTWF4KHV3LCBGbG9hdDQoLTB4ODAwMCwgLTB4ODAwMCwgLTB4ODAwMCwgLTB4ODAwMCkpOworCQkJdXcgPSBNaW4odXcsIEZsb2F0NCgweDdGRkYsIDB4N0ZGRiwgMHg3RkZGLCAweDdGRkYpKTsKKwkJCWRzdC5yID0gUm91bmRTaG9ydDQodXcpOworCQl9CisJCWVsc2UKKwkJeworCQkJZHN0LnIgPSBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKTsKKwkJfQorCisJCWlmKHN0YXRlLmludGVycG9sYW50WzIgKyBjb29yZGluYXRlXS5jb21wb25lbnQgJiAweDAyKQorCQl7CisJCQl2dyAqPSBGbG9hdDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKTsKKwkJCXZ3ID0gTWF4KHZ3LCBGbG9hdDQoLTB4ODAwMCwgLTB4ODAwMCwgLTB4ODAwMCwgLTB4ODAwMCkpOworCQkJdncgPSBNaW4odncsIEZsb2F0NCgweDdGRkYsIDB4N0ZGRiwgMHg3RkZGLCAweDdGRkYpKTsKKwkJCWRzdC5nID0gUm91bmRTaG9ydDQodncpOworCQl9CisJCWVsc2UKKwkJeworCQkJZHN0LmcgPSBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKTsKKwkJfQorCQkKKwkJaWYoc3RhdGUuaW50ZXJwb2xhbnRbMiArIGNvb3JkaW5hdGVdLmNvbXBvbmVudCAmIDB4MDQpCisJCXsKKwkJCXN3ICo9IEZsb2F0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApOworCQkJc3cgPSBNYXgoc3csIEZsb2F0NCgtMHg4MDAwLCAtMHg4MDAwLCAtMHg4MDAwLCAtMHg4MDAwKSk7CisJCQlzdyA9IE1pbihzdywgRmxvYXQ0KDB4N0ZGRiwgMHg3RkZGLCAweDdGRkYsIDB4N0ZGRikpOworCQkJZHN0LmIgPSBSb3VuZFNob3J0NChzdyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkc3QuYiA9IFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApOworCQl9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWERQMyhSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgQ29sb3I0aSAmc3JjKQorCXsKKwkJVEVYTTNYM1BBRChyLCB1LCB2LCBzLCBzcmMsIDAsIGZhbHNlKTsKKworCQlTaG9ydDQgdDAgPSBSb3VuZFNob3J0NChyLnVfICogRmxvYXQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOworCisJCWRzdC5yID0gdDA7CisJCWRzdC5nID0gdDA7CisJCWRzdC5iID0gdDA7CisJCWRzdC5hID0gdDA7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWERQM1RFWChSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgaW50IHN0YWdlLCBDb2xvcjRpICZzcmMwKQorCXsKKwkJVEVYTTNYM1BBRChyLCB1LCB2LCBzLCBzcmMwLCAwLCBmYWxzZSk7CisKKwkJci52XyA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJci53XyA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKworCQlzYW1wbGVUZXh0dXJlKHIsIGRzdCwgc3RhZ2UsIHIudV8sIHIudl8sIHIud18sIHIud18pOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpURVhLSUxMKEludCBjTWFza1s0XSwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcykKKwl7CisJCUludCBraWxsID0gU2lnbk1hc2soQ21wTkxUKHUsIEZsb2F0NCgwLCAwLCAwLCAwKSkpICYKKwkJICAgICAgICAgICBTaWduTWFzayhDbXBOTFQodiwgRmxvYXQ0KDAsIDAsIDAsIDApKSkgJgorCQkgICAgICAgICAgIFNpZ25NYXNrKENtcE5MVChzLCBGbG9hdDQoMCwgMCwgMCwgMCkpKTsKKworCQlmb3IodW5zaWduZWQgaW50IHEgPSAwOyBxIDwgc3RhdGUubXVsdGlTYW1wbGU7IHErKykKKwkJeworCQkJY01hc2tbcV0gJj0ga2lsbDsKKwkJfQorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpURVhLSUxMKEludCBjTWFza1s0XSwgQ29sb3I0aSAmc3JjKQorCXsKKwkJU2hvcnQ0IHRlc3QgPSBzcmMuciB8IHNyYy5nIHwgc3JjLmI7CisJCUludCBraWxsID0gU2lnbk1hc2soUGFjayh0ZXN0LCB0ZXN0KSkgXiAweDAwMDAwMDBGOworCisJCWZvcih1bnNpZ25lZCBpbnQgcSA9IDA7IHEgPCBzdGF0ZS5tdWx0aVNhbXBsZTsgcSsrKQorCQl7CisJCQljTWFza1txXSAmPSBraWxsOworCQl9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWChSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgaW50IHNhbXBsZXIsIGJvb2wgcHJvamVjdCkKKwl7CisJCXNhbXBsZVRleHR1cmUociwgZHN0LCBzYW1wbGVyLCB1LCB2LCBzLCBzLCBwcm9qZWN0KTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6VEVYTEQoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYywgaW50IHNhbXBsZXIsIGJvb2wgcHJvamVjdCkKKwl7CisJCUZsb2F0NCB1ID0gRmxvYXQ0KHNyYy5yKSAqIEZsb2F0NCgxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFKTsKKwkJRmxvYXQ0IHYgPSBGbG9hdDQoc3JjLmcpICogRmxvYXQ0KDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUpOworCQlGbG9hdDQgcyA9IEZsb2F0NChzcmMuYikgKiBGbG9hdDQoMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSk7CisKKwkJc2FtcGxlVGV4dHVyZShyLCBkc3QsIHNhbXBsZXIsIHUsIHYsIHMsIHMsIHByb2plY3QpOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpURVhCRU0oUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgaW50IHN0YWdlKQorCXsKKwkJRmxvYXQ0IGR1ID0gRmxvYXQ0KHNyYy5yKSAqIEZsb2F0NCgxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFKTsKKwkJRmxvYXQ0IGR2ID0gRmxvYXQ0KHNyYy5nKSAqIEZsb2F0NCgxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFKTsKKworCQlGbG9hdDQgZHUyID0gZHU7CisJCUZsb2F0NCBkdjIgPSBkdjsKKworCQlkdSAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0RlswXVswXSkpOworCQlkdjIgKj0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdGV4dHVyZVN0YWdlW3N0YWdlXS5idW1wbWFwTWF0cml4NEZbMV1bMF0pKTsKKwkJZHUgKz0gZHYyOworCQlkdiAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0RlsxXVsxXSkpOworCQlkdTIgKj0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdGV4dHVyZVN0YWdlW3N0YWdlXS5idW1wbWFwTWF0cml4NEZbMF1bMV0pKTsKKwkJZHYgKz0gZHUyOworCisJCUZsb2F0NCB1XyA9IHUgKyBkdTsKKwkJRmxvYXQ0IHZfID0gdiArIGR2OworCisJCXNhbXBsZVRleHR1cmUociwgZHN0LCBzdGFnZSwgdV8sIHZfLCBzLCBzKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6VEVYQkVNTChSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgQ29sb3I0aSAmc3JjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBpbnQgc3RhZ2UpCisJeworCQlGbG9hdDQgZHUgPSBGbG9hdDQoc3JjLnIpICogRmxvYXQ0KDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUpOworCQlGbG9hdDQgZHYgPSBGbG9hdDQoc3JjLmcpICogRmxvYXQ0KDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUpOworCisJCUZsb2F0NCBkdTIgPSBkdTsKKwkJRmxvYXQ0IGR2MiA9IGR2OworCisJCWR1ICo9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0uYnVtcG1hcE1hdHJpeDRGWzBdWzBdKSk7CisJCWR2MiAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0RlsxXVswXSkpOworCQlkdSArPSBkdjI7CisJCWR2ICo9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0uYnVtcG1hcE1hdHJpeDRGWzFdWzFdKSk7CisJCWR1MiAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0RlswXVsxXSkpOworCQlkdiArPSBkdTI7CisKKwkJRmxvYXQ0IHVfID0gdSArIGR1OworCQlGbG9hdDQgdl8gPSB2ICsgZHY7CisKKwkJc2FtcGxlVGV4dHVyZShyLCBkc3QsIHN0YWdlLCB1Xywgdl8sIHMsIHMpOworCisJCVNob3J0NCBMOworCisJCUwgPSBzcmMuYjsKKwkJTCA9IE11bEhpZ2goTCwgKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdGV4dHVyZVN0YWdlW3N0YWdlXS5sdW1pbmFuY2VTY2FsZTQpKSk7CisJCUwgPSBMIDw8IDQ7CisJCUwgPSBBZGRTYXQoTCwgKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdGV4dHVyZVN0YWdlW3N0YWdlXS5sdW1pbmFuY2VPZmZzZXQ0KSkpOworCQlMID0gTWF4KEwsIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKTsKKwkJTCA9IE1pbihMLCBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSk7CisKKwkJZHN0LnIgPSBNdWxIaWdoKGRzdC5yLCBMKTsgZHN0LnIgPSBkc3QuciA8PCA0OworCQlkc3QuZyA9IE11bEhpZ2goZHN0LmcsIEwpOyBkc3QuZyA9IGRzdC5nIDw8IDQ7CisJCWRzdC5iID0gTXVsSGlnaChkc3QuYiwgTCk7IGRzdC5iID0gZHN0LmIgPDwgNDsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6VEVYUkVHMkFSKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBDb2xvcjRpICZzcmMwLCBpbnQgc3RhZ2UpCisJeworCQlGbG9hdDQgdSA9IEZsb2F0NChzcmMwLmEpICogRmxvYXQ0KDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUpOworCQlGbG9hdDQgdiA9IEZsb2F0NChzcmMwLnIpICogRmxvYXQ0KDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUpOworCQlGbG9hdDQgcyA9IEZsb2F0NChzcmMwLmIpICogRmxvYXQ0KDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUpOworCisJCXNhbXBsZVRleHR1cmUociwgZHN0LCBzdGFnZSwgdSwgdiwgcywgcyk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWFJFRzJHQihSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgQ29sb3I0aSAmc3JjMCwgaW50IHN0YWdlKQorCXsKKwkJRmxvYXQ0IHUgPSBGbG9hdDQoc3JjMC5nKSAqIEZsb2F0NCgxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFKTsKKwkJRmxvYXQ0IHYgPSBGbG9hdDQoc3JjMC5iKSAqIEZsb2F0NCgxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFKTsKKwkJRmxvYXQ0IHMgPSB2OworCisJCXNhbXBsZVRleHR1cmUociwgZHN0LCBzdGFnZSwgdSwgdiwgcywgcyk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWFJFRzJSR0IoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIGludCBzdGFnZSkKKwl7CisJCUZsb2F0NCB1ID0gRmxvYXQ0KHNyYzAucikgKiBGbG9hdDQoMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSk7CisJCUZsb2F0NCB2ID0gRmxvYXQ0KHNyYzAuZykgKiBGbG9hdDQoMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSk7CisJCUZsb2F0NCBzID0gRmxvYXQ0KHNyYzAuYikgKiBGbG9hdDQoMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSk7CisKKwkJc2FtcGxlVGV4dHVyZShyLCBkc3QsIHN0YWdlLCB1LCB2LCBzLCBzKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6VEVYTTNYMkRFUFRIKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBDb2xvcjRpICZzcmMsIGJvb2wgc2lnbmVkU2NhbGluZykKKwl7CisJCVRFWE0zWDJQQUQociwgdSwgdiwgcywgc3JjLCAxLCBzaWduZWRTY2FsaW5nKTsKKworCQkvLyB6IC8gdworCQlyLnVfICo9IFJjcF9wcChyLnZfKTsgICAvLyBGSVhNRTogU2V0IHJlc3VsdCB0byAxLjAgd2hlbiBkaXZpc2lvbiBieSB6ZXJvCisKKwkJci5vRGVwdGggPSByLnVfOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpURVhNM1gyUEFEKFJlZ2lzdGVycyAmciwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgQ29sb3I0aSAmc3JjMCwgaW50IGNvbXBvbmVudCwgYm9vbCBzaWduZWRTY2FsaW5nKQorCXsKKwkJVEVYTTNYM1BBRChyLCB1LCB2LCBzLCBzcmMwLCBjb21wb25lbnQsIHNpZ25lZFNjYWxpbmcpOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpURVhNM1gyVEVYKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBpbnQgc3RhZ2UsIENvbG9yNGkgJnNyYzAsIGJvb2wgc2lnbmVkU2NhbGluZykKKwl7CisJCVRFWE0zWDJQQUQociwgdSwgdiwgcywgc3JjMCwgMSwgc2lnbmVkU2NhbGluZyk7CisKKwkJci53XyA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKworCQlzYW1wbGVUZXh0dXJlKHIsIGRzdCwgc3RhZ2UsIHIudV8sIHIudl8sIHIud18sIHIud18pOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpURVhNM1gzKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBDb2xvcjRpICZzcmMwLCBib29sIHNpZ25lZFNjYWxpbmcpCisJeworCQlURVhNM1gzUEFEKHIsIHUsIHYsIHMsIHNyYzAsIDIsIHNpZ25lZFNjYWxpbmcpOworCisJCWRzdC5yID0gUm91bmRTaG9ydDQoci51XyAqIEZsb2F0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApKTsKKwkJZHN0LmcgPSBSb3VuZFNob3J0NChyLnZfICogRmxvYXQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOworCQlkc3QuYiA9IFJvdW5kU2hvcnQ0KHIud18gKiBGbG9hdDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSk7CisJCWRzdC5hID0gU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWE0zWDNQQUQoUmVnaXN0ZXJzICZyLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBDb2xvcjRpICZzcmMwLCBpbnQgY29tcG9uZW50LCBib29sIHNpZ25lZFNjYWxpbmcpCisJeworCQlpZihjb21wb25lbnQgPT0gMCB8fCBwcmV2aW91c1NjYWxpbmcgIT0gc2lnbmVkU2NhbGluZykgICAvLyBGSVhNRTogT3RoZXIgc291cmNlIG1vZGlmaWVycz8KKwkJeworCQkJci5VID0gRmxvYXQ0KHNyYzAucik7CisJCQlyLlYgPSBGbG9hdDQoc3JjMC5nKTsKKwkJCXIuVyA9IEZsb2F0NChzcmMwLmIpOworCisJCQlwcmV2aW91c1NjYWxpbmcgPSBzaWduZWRTY2FsaW5nOworCQl9CisKKwkJRmxvYXQ0IHggPSByLlUgKiB1ICsgci5WICogdiArIHIuVyAqIHM7CisKKwkJeCAqPSBGbG9hdDQoMS4wZiAvIDB4MTAwMCwgMS4wZiAvIDB4MTAwMCwgMS4wZiAvIDB4MTAwMCwgMS4wZiAvIDB4MTAwMCk7CisKKwkJc3dpdGNoKGNvbXBvbmVudCkKKwkJeworCQljYXNlIDA6CXIudV8gPSB4OyBicmVhazsKKwkJY2FzZSAxOglyLnZfID0geDsgYnJlYWs7CisJCWNhc2UgMjogci53XyA9IHg7IGJyZWFrOworCQlkZWZhdWx0OiBBU1NFUlQoZmFsc2UpOworCQl9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWE0zWDNTUEVDKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBpbnQgc3RhZ2UsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpCisJeworCQlURVhNM1gzUEFEKHIsIHUsIHYsIHMsIHNyYzAsIDIsIGZhbHNlKTsKKworCQlGbG9hdDQgRVszXTsgICAvLyBFeWUgdmVjdG9yCisKKwkJRVswXSA9IEZsb2F0NChzcmMxLnIpICogRmxvYXQ0KDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUsIDEuMGYgLyAweDBGRkUpOworCQlFWzFdID0gRmxvYXQ0KHNyYzEuZykgKiBGbG9hdDQoMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSwgMS4wZiAvIDB4MEZGRSk7CisJCUVbMl0gPSBGbG9hdDQoc3JjMS5iKSAqIEZsb2F0NCgxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFLCAxLjBmIC8gMHgwRkZFKTsKKworCQkvLyBSZWZsZWN0aW9uCisJCUZsb2F0NCB1X187CisJCUZsb2F0NCB2X187CisJCUZsb2F0NCB3X187CisKKwkJLy8gKHUnJywgdicnLCB3JycpID0gMiAqIChOIC4gRSkgKiBOIC0gRSAqIChOIC4gTikKKwkJdV9fID0gci51XyAqIEVbMF07CisJCXZfXyA9IHIudl8gKiBFWzFdOworCQl3X18gPSByLndfICogRVsyXTsKKwkJdV9fICs9IHZfXyArIHdfXzsKKwkJdV9fICs9IHVfXzsKKwkJdl9fID0gdV9fOworCQl3X18gPSB1X187CisJCXVfXyAqPSByLnVfOworCQl2X18gKj0gci52XzsKKwkJd19fICo9IHIud187CisJCXIudV8gKj0gci51XzsKKwkJci52XyAqPSByLnZfOworCQlyLndfICo9IHIud187CisJCXIudV8gKz0gci52XyArIHIud187CisJCXVfXyAtPSBFWzBdICogci51XzsKKwkJdl9fIC09IEVbMV0gKiByLnVfOworCQl3X18gLT0gRVsyXSAqIHIudV87CisKKwkJc2FtcGxlVGV4dHVyZShyLCBkc3QsIHN0YWdlLCAgdV9fLCB2X18sIHdfXywgd19fKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6VEVYTTNYM1RFWChSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgaW50IHN0YWdlLCBDb2xvcjRpICZzcmMwLCBib29sIHNpZ25lZFNjYWxpbmcpCisJeworCQlURVhNM1gzUEFEKHIsIHUsIHYsIHMsIHNyYzAsIDIsIHNpZ25lZFNjYWxpbmcpOworCisJCXNhbXBsZVRleHR1cmUociwgZHN0LCBzdGFnZSwgci51Xywgci52Xywgci53Xywgci53Xyk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWE0zWDNWU1BFQyhSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgaW50IHN0YWdlLCBDb2xvcjRpICZzcmMwKQorCXsKKwkJVEVYTTNYM1BBRChyLCB1LCB2LCBzLCBzcmMwLCAyLCBmYWxzZSk7CisKKwkJRmxvYXQ0IEVbM107ICAgLy8gRXllIHZlY3RvcgorCisJCUVbMF0gPSByLnZ3WzIgKyBzdGFnZSAtIDJdOworCQlFWzFdID0gci52d1syICsgc3RhZ2UgLSAxXTsKKwkJRVsyXSA9IHIudndbMiArIHN0YWdlIC0gMF07CisKKwkJLy8gUmVmbGVjdGlvbgorCQlGbG9hdDQgdV9fOworCQlGbG9hdDQgdl9fOworCQlGbG9hdDQgd19fOworCisJCS8vICh1JycsIHYnJywgdycnKSA9IDIgKiAoTiAuIEUpICogTiAtIEUgKiAoTiAuIE4pCisJCXVfXyA9IHIudV8gKiBFWzBdOworCQl2X18gPSByLnZfICogRVsxXTsKKwkJd19fID0gci53XyAqIEVbMl07CisJCXVfXyArPSB2X18gKyB3X187CisJCXVfXyArPSB1X187CisJCXZfXyA9IHVfXzsKKwkJd19fID0gdV9fOworCQl1X18gKj0gci51XzsKKwkJdl9fICo9IHIudl87CisJCXdfXyAqPSByLndfOworCQlyLnVfICo9IHIudV87CisJCXIudl8gKj0gci52XzsKKwkJci53XyAqPSByLndfOworCQlyLnVfICs9IHIudl8gKyByLndfOworCQl1X18gLT0gRVswXSAqIHIudV87CisJCXZfXyAtPSBFWzFdICogci51XzsKKwkJd19fIC09IEVbMl0gKiByLnVfOworCisJCXNhbXBsZVRleHR1cmUociwgZHN0LCBzdGFnZSwgdV9fLCB2X18sIHdfXywgd19fKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6VEVYREVQVEgoUmVnaXN0ZXJzICZyKQorCXsKKwkJci51XyA9IEZsb2F0NChyLnJpWzVdLnIpOworCQlyLnZfID0gRmxvYXQ0KHIucmlbNV0uZyk7CisKKwkJLy8geiAvIHcKKwkJci51XyAqPSBSY3BfcHAoci52Xyk7ICAgLy8gRklYTUU6IFNldCByZXN1bHQgdG8gMS4wIHdoZW4gZGl2aXNpb24gYnkgemVybworCisJCXIub0RlcHRoID0gci51XzsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6Q05EKENvbG9yNGkgJmRzdCwgQ29sb3I0aSAmc3JjMCwgQ29sb3I0aSAmc3JjMSwgQ29sb3I0aSAmc3JjMikKKwl7CisJCXtTaG9ydDQgdDA7IHQwID0gc3JjMC54OyB0MCA9IENtcEdUKHQwLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7IFNob3J0NCB0MTsgdDEgPSBzcmMxLng7IHQxID0gdDEgJiB0MDsgdDAgPSB+dDAgJiBzcmMyLng7IHQwID0gdDAgfCB0MTsgZHN0LnIgPSB0MDt9OworCQl7U2hvcnQ0IHQwOyB0MCA9IHNyYzAueTsgdDAgPSBDbXBHVCh0MCwgU2hvcnQ0KDB4MDgwMCwgMHgwODAwLCAweDA4MDAsIDB4MDgwMCkpOyBTaG9ydDQgdDE7IHQxID0gc3JjMS55OyB0MSA9IHQxICYgdDA7IHQwID0gfnQwICYgc3JjMi55OyB0MCA9IHQwIHwgdDE7IGRzdC5nID0gdDA7fTsKKwkJe1Nob3J0NCB0MDsgdDAgPSBzcmMwLno7IHQwID0gQ21wR1QodDAsIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsgU2hvcnQ0IHQxOyB0MSA9IHNyYzEuejsgdDEgPSB0MSAmIHQwOyB0MCA9IH50MCAmIHNyYzIuejsgdDAgPSB0MCB8IHQxOyBkc3QuYiA9IHQwO307CisJCXtTaG9ydDQgdDA7IHQwID0gc3JjMC53OyB0MCA9IENtcEdUKHQwLCBTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSk7IFNob3J0NCB0MTsgdDEgPSBzcmMxLnc7IHQxID0gdDEgJiB0MDsgdDAgPSB+dDAgJiBzcmMyLnc7IHQwID0gdDAgfCB0MTsgZHN0LmEgPSB0MDt9OworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpDTVAoQ29sb3I0aSAmZHN0LCBDb2xvcjRpICZzcmMwLCBDb2xvcjRpICZzcmMxLCBDb2xvcjRpICZzcmMyKQorCXsKKwkJe1Nob3J0NCB0MCA9IENtcEdUKFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApLCBzcmMwLngpOyBTaG9ydDQgdDE7IHQxID0gc3JjMi54OyB0MSAmPSB0MDsgdDAgPSB+dDAgJiBzcmMxLng7IHQwIHw9IHQxOyBkc3QuciA9IHQwO307CisJCXtTaG9ydDQgdDAgPSBDbXBHVChTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKSwgc3JjMC55KTsgU2hvcnQ0IHQxOyB0MSA9IHNyYzIueTsgdDEgJj0gdDA7IHQwID0gfnQwICYgc3JjMS55OyB0MCB8PSB0MTsgZHN0LmcgPSB0MDt9OworCQl7U2hvcnQ0IHQwID0gQ21wR1QoU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCksIHNyYzAueik7IFNob3J0NCB0MTsgdDEgPSBzcmMyLno7IHQxICY9IHQwOyB0MCA9IH50MCAmIHNyYzEuejsgdDAgfD0gdDE7IGRzdC5iID0gdDA7fTsKKwkJe1Nob3J0NCB0MCA9IENtcEdUKFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApLCBzcmMwLncpOyBTaG9ydDQgdDE7IHQxID0gc3JjMi53OyB0MSAmPSB0MDsgdDAgPSB+dDAgJiBzcmMxLnc7IHQwIHw9IHQxOyBkc3QuYSA9IHQwO307CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OkJFTShSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgQ29sb3I0aSAmc3JjMCwgQ29sb3I0aSAmc3JjMSwgaW50IHN0YWdlKQorCXsKKwkJU2hvcnQ0IHQwOworCQlTaG9ydDQgdDE7CisKKwkJLy8gZHN0LnIgPSBzcmMwLnIgKyBCVU1QRU5WTUFUMDAoc3RhZ2UpICogc3JjMS5yICsgQlVNUEVOVk1BVDEwKHN0YWdlKSAqIHNyYzEuZworCQl0MCA9IE11bEhpZ2goc3JjMS54LCAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0V1swXVswXSkpKTsgdDAgPSB0MCA8PCA0OyAgIC8vIEZJWE1FOiBNYXRyaXggY29tcG9uZW50cyByYW5nZT8gT3ZlcmZsb3cgaGF6YXJkLgorCQl0MSA9IE11bEhpZ2goc3JjMS55LCAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx0ZXh0dXJlU3RhZ2Vbc3RhZ2VdLmJ1bXBtYXBNYXRyaXg0V1sxXVswXSkpKTsgdDEgPSB0MSA8PCA0OyAgIC8vIEZJWE1FOiBNYXRyaXggY29tcG9uZW50cyByYW5nZT8gT3ZlcmZsb3cgaGF6YXJkLgorCQl0MCA9IEFkZFNhdCh0MCwgdDEpOworCQl0MCA9IEFkZFNhdCh0MCwgc3JjMC54KTsKKwkJZHN0LnIgPSB0MDsKKworCQkvLyBkc3QuZyA9IHNyYzAuZyArIEJVTVBFTlZNQVQwMShzdGFnZSkgKiBzcmMxLnIgKyBCVU1QRU5WTUFUMTEoc3RhZ2UpICogc3JjMS5nCisJCXQwID0gTXVsSGlnaChzcmMxLngsICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0uYnVtcG1hcE1hdHJpeDRXWzBdWzFdKSkpOyB0MCA9IHQwIDw8IDQ7ICAgLy8gRklYTUU6IE1hdHJpeCBjb21wb25lbnRzIHJhbmdlPyBPdmVyZmxvdyBoYXphcmQuCisJCXQxID0gTXVsSGlnaChzcmMxLnksICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHRleHR1cmVTdGFnZVtzdGFnZV0uYnVtcG1hcE1hdHJpeDRXWzFdWzFdKSkpOyB0MSA9IHQxIDw8IDQ7ICAgLy8gRklYTUU6IE1hdHJpeCBjb21wb25lbnRzIHJhbmdlPyBPdmVyZmxvdyBoYXphcmQuCisJCXQwID0gQWRkU2F0KHQwLCB0MSk7CisJCXQwID0gQWRkU2F0KHQwLCBzcmMwLnkpOworCQlkc3QuZyA9IHQwOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpNM1gyKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBjb25zdCBTcmMgJnNyYzEpCisJeworCQlDb2xvcjRmIHJvdzAgPSByZWcociwgc3JjMSwgMCk7CisJCUNvbG9yNGYgcm93MSA9IHJlZyhyLCBzcmMxLCAxKTsKKworCQlkc3QueCA9IGRvdDMoc3JjMCwgcm93MCk7CisJCWRzdC55ID0gZG90MyhzcmMwLCByb3cxKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6TTNYMyhSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgY29uc3QgU3JjICZzcmMxKQorCXsKKwkJQ29sb3I0ZiByb3cwID0gcmVnKHIsIHNyYzEsIDApOworCQlDb2xvcjRmIHJvdzEgPSByZWcociwgc3JjMSwgMSk7CisJCUNvbG9yNGYgcm93MiA9IHJlZyhyLCBzcmMxLCAyKTsKKworCQlkc3QueCA9IGRvdDMoc3JjMCwgcm93MCk7CisJCWRzdC55ID0gZG90MyhzcmMwLCByb3cxKTsKKwkJZHN0LnogPSBkb3QzKHNyYzAsIHJvdzIpOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpNM1g0KFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBjb25zdCBTcmMgJnNyYzEpCisJeworCQlDb2xvcjRmIHJvdzAgPSByZWcociwgc3JjMSwgMCk7CisJCUNvbG9yNGYgcm93MSA9IHJlZyhyLCBzcmMxLCAxKTsKKwkJQ29sb3I0ZiByb3cyID0gcmVnKHIsIHNyYzEsIDIpOworCQlDb2xvcjRmIHJvdzMgPSByZWcociwgc3JjMSwgMyk7CisKKwkJZHN0LnggPSBkb3QzKHNyYzAsIHJvdzApOworCQlkc3QueSA9IGRvdDMoc3JjMCwgcm93MSk7CisJCWRzdC56ID0gZG90MyhzcmMwLCByb3cyKTsKKwkJZHN0LncgPSBkb3QzKHNyYzAsIHJvdzMpOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpNNFgzKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBjb25zdCBTcmMgJnNyYzEpCisJeworCQlDb2xvcjRmIHJvdzAgPSByZWcociwgc3JjMSwgMCk7CisJCUNvbG9yNGYgcm93MSA9IHJlZyhyLCBzcmMxLCAxKTsKKwkJQ29sb3I0ZiByb3cyID0gcmVnKHIsIHNyYzEsIDIpOworCisJCWRzdC54ID0gZG90NChzcmMwLCByb3cwKTsKKwkJZHN0LnkgPSBkb3Q0KHNyYzAsIHJvdzEpOworCQlkc3QueiA9IGRvdDQoc3JjMCwgcm93Mik7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6Ok00WDQoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIGNvbnN0IFNyYyAmc3JjMSkKKwl7CisJCUNvbG9yNGYgcm93MCA9IHJlZyhyLCBzcmMxLCAwKTsKKwkJQ29sb3I0ZiByb3cxID0gcmVnKHIsIHNyYzEsIDEpOworCQlDb2xvcjRmIHJvdzIgPSByZWcociwgc3JjMSwgMik7CisJCUNvbG9yNGYgcm93MyA9IHJlZyhyLCBzcmMxLCAzKTsKKworCQlkc3QueCA9IGRvdDQoc3JjMCwgcm93MCk7CisJCWRzdC55ID0gZG90NChzcmMwLCByb3cxKTsKKwkJZHN0LnogPSBkb3Q0KHNyYzAsIHJvdzIpOworCQlkc3QudyA9IGRvdDQoc3JjMCwgcm93Myk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWExEKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBjb25zdCBTcmMgJnNyYzEsIGJvb2wgcHJvamVjdCwgYm9vbCBiaWFzKQorCXsKKwkJQ29sb3I0ZiB0bXA7CisKKwkJc2FtcGxlVGV4dHVyZShyLCB0bXAsIHNyYzEuaW5kZXgsIHNyYzAudSwgc3JjMC52LCBzcmMwLnMsIHNyYzAudCwgc3JjMCwgc3JjMCwgcHJvamVjdCwgYmlhcyk7CisKKwkJZHN0LnggPSB0bXBbKHNyYzEuc3dpenpsZSA+PiAwKSAmIDB4M107CisJCWRzdC55ID0gdG1wWyhzcmMxLnN3aXp6bGUgPj4gMikgJiAweDNdOworCQlkc3QueiA9IHRtcFsoc3JjMS5zd2l6emxlID4+IDQpICYgMHgzXTsKKwkJZHN0LncgPSB0bXBbKHNyYzEuc3dpenpsZSA+PiA2KSAmIDB4M107CisJfQorCQorCXZvaWQgUGl4ZWxSb3V0aW5lOjpURVhMREQoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIGNvbnN0IFNyYyAmc3JjMSwgQ29sb3I0ZiAmc3JjMiwgIENvbG9yNGYgJnNyYzMsIGJvb2wgcHJvamVjdCwgYm9vbCBiaWFzKQorCXsKKwkJQ29sb3I0ZiB0bXA7CisKKwkJc2FtcGxlVGV4dHVyZShyLCB0bXAsIHNyYzEuaW5kZXgsIHNyYzAudSwgc3JjMC52LCBzcmMwLnMsIHNyYzAudCwgc3JjMiwgc3JjMywgcHJvamVjdCwgYmlhcywgdHJ1ZSk7CisKKwkJZHN0LnggPSB0bXBbKHNyYzEuc3dpenpsZSA+PiAwKSAmIDB4M107CisJCWRzdC55ID0gdG1wWyhzcmMxLnN3aXp6bGUgPj4gMikgJiAweDNdOworCQlkc3QueiA9IHRtcFsoc3JjMS5zd2l6emxlID4+IDQpICYgMHgzXTsKKwkJZHN0LncgPSB0bXBbKHNyYzEuc3dpenpsZSA+PiA2KSAmIDB4M107CisJfQorCQorCXZvaWQgUGl4ZWxSb3V0aW5lOjpURVhMREwoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIGNvbnN0IFNyYyAmc3JjMSwgYm9vbCBwcm9qZWN0LCBib29sIGJpYXMpCisJeworCQlDb2xvcjRmIHRtcDsKKworCQlzYW1wbGVUZXh0dXJlKHIsIHRtcCwgc3JjMS5pbmRleCwgc3JjMC51LCBzcmMwLnYsIHNyYzAucywgc3JjMC50LCBzcmMwLCBzcmMwLCBwcm9qZWN0LCBiaWFzLCBmYWxzZSwgdHJ1ZSk7CisKKwkJZHN0LnggPSB0bXBbKHNyYzEuc3dpenpsZSA+PiAwKSAmIDB4M107CisJCWRzdC55ID0gdG1wWyhzcmMxLnN3aXp6bGUgPj4gMikgJiAweDNdOworCQlkc3QueiA9IHRtcFsoc3JjMS5zd2l6emxlID4+IDQpICYgMHgzXTsKKwkJZHN0LncgPSB0bXBbKHNyYzEuc3dpenpsZSA+PiA2KSAmIDB4M107CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlRFWEtJTEwoSW50IGNNYXNrWzRdLCBDb2xvcjRmICZzcmMsIHVuc2lnbmVkIGNoYXIgbWFzaykKKwl7CisJCUludCBraWxsID0gLTE7CisJCQorCQlpZihtYXNrICYgMHgxKSBraWxsICY9IFNpZ25NYXNrKENtcE5MVChzcmMueCwgRmxvYXQ0KDAsIDAsIDAsIDApKSk7CisJCWlmKG1hc2sgJiAweDIpIGtpbGwgJj0gU2lnbk1hc2soQ21wTkxUKHNyYy55LCBGbG9hdDQoMCwgMCwgMCwgMCkpKTsKKwkJaWYobWFzayAmIDB4NCkga2lsbCAmPSBTaWduTWFzayhDbXBOTFQoc3JjLnosIEZsb2F0NCgwLCAwLCAwLCAwKSkpOworCQlpZihtYXNrICYgMHg4KSBraWxsICY9IFNpZ25NYXNrKENtcE5MVChzcmMudywgRmxvYXQ0KDAsIDAsIDAsIDApKSk7CisKKwkJZm9yKHVuc2lnbmVkIGludCBxID0gMDsgcSA8IHN0YXRlLm11bHRpU2FtcGxlOyBxKyspCisJCXsKKwkJCWNNYXNrW3FdICY9IGtpbGw7CisJCX0KKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6RFNYKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjKQorCXsKKwkJZHN0LnggPSBzcmMueC55eXl5IC0gc3JjLngueHh4eDsKKwkJZHN0LnkgPSBzcmMueS55eXl5IC0gc3JjLnkueHh4eDsKKwkJZHN0LnogPSBzcmMuei55eXl5IC0gc3JjLnoueHh4eDsKKwkJZHN0LncgPSBzcmMudy55eXl5IC0gc3JjLncueHh4eDsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6RFNZKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjKQorCXsKKwkJZHN0LnggPSBzcmMueC56enp6IC0gc3JjLngueHh4eDsKKwkJZHN0LnkgPSBzcmMueS56enp6IC0gc3JjLnkueHh4eDsKKwkJZHN0LnogPSBzcmMuei56enp6IC0gc3JjLnoueHh4eDsKKwkJZHN0LncgPSBzcmMudy56enp6IC0gc3JjLncueHh4eDsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6QlJFQUsoUmVnaXN0ZXJzICZyKQorCXsKKwkJbGx2bTo6QmFzaWNCbG9jayAqZGVhZEJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQlsbHZtOjpCYXNpY0Jsb2NrICplbmRCbG9jayA9IGxvb3BSZXBFbmRCbG9ja1tsb29wUmVwRGVwdGggLSAxXTsKKworCQlpZihicmVha0RlcHRoID09IDApCisJCXsKKwkJCU51Y2xldXM6OmNyZWF0ZUJyKGVuZEJsb2NrKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXIuZW5hYmxlQnJlYWsgPSByLmVuYWJsZUJyZWFrICYgfnIuZW5hYmxlU3RhY2tbci5lbmFibGVJbmRleF07CisJCQlCb29sIGFsbEJyZWFrID0gU2lnbk1hc2soci5lbmFibGVCcmVhaykgPT0gMHgwOworCisJCQlicmFuY2goYWxsQnJlYWssIGVuZEJsb2NrLCBkZWFkQmxvY2spOworCQl9CisKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2soZGVhZEJsb2NrKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6QlJFQUtDKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSwgQ29udHJvbCBjb250cm9sKQorCXsKKwkJSW50NCBjb25kaXRpb247CisKKwkJc3dpdGNoKGNvbnRyb2wpCisJCXsKKwkJY2FzZSBPcDo6Q09OVFJPTF9HVDogY29uZGl0aW9uID0gQ21wTkxFKHNyYzAueCwgIHNyYzEueCk7CWJyZWFrOworCQljYXNlIE9wOjpDT05UUk9MX0VROiBjb25kaXRpb24gPSBDbXBFUShzcmMwLngsIHNyYzEueCk7CQlicmVhazsKKwkJY2FzZSBPcDo6Q09OVFJPTF9HRTogY29uZGl0aW9uID0gQ21wTkxUKHNyYzAueCwgc3JjMS54KTsJYnJlYWs7CisJCWNhc2UgT3A6OkNPTlRST0xfTFQ6IGNvbmRpdGlvbiA9IENtcExUKHNyYzAueCwgIHNyYzEueCk7CWJyZWFrOworCQljYXNlIE9wOjpDT05UUk9MX05FOiBjb25kaXRpb24gPSBDbXBORVEoc3JjMC54LCBzcmMxLngpOwlicmVhazsKKwkJY2FzZSBPcDo6Q09OVFJPTF9MRTogY29uZGl0aW9uID0gQ21wTEUoc3JjMC54LCBzcmMxLngpOwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJY29uZGl0aW9uICY9IHIuZW5hYmxlU3RhY2tbci5lbmFibGVJbmRleF07CisKKwkJbGx2bTo6QmFzaWNCbG9jayAqY29udGludWVCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJbGx2bTo6QmFzaWNCbG9jayAqZW5kQmxvY2sgPSBsb29wUmVwRW5kQmxvY2tbbG9vcFJlcERlcHRoIC0gMV07CisKKwkJci5lbmFibGVCcmVhayA9IHIuZW5hYmxlQnJlYWsgJiB+Y29uZGl0aW9uOworCQlCb29sIGFsbEJyZWFrID0gU2lnbk1hc2soci5lbmFibGVCcmVhaykgPT0gMHgwOworCisJCWJyYW5jaChhbGxCcmVhaywgZW5kQmxvY2ssIGNvbnRpbnVlQmxvY2spOworCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhjb250aW51ZUJsb2NrKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6QlJFQUtQKFJlZ2lzdGVycyAmciwgY29uc3QgU3JjICZwcmVkaWNhdGVSZWdpc3RlcikgICAvLyBGSVhNRTogRmFjdG9yIG91dCBwYXJ0cyBjb21tb24gd2l0aCBCUkVBS0MKKwl7CisJCUludDQgY29uZGl0aW9uID0gQXM8SW50ND4oci5wMFtwcmVkaWNhdGVSZWdpc3Rlci5zd2l6emxlICYgMHgzXSk7CisKKwkJaWYocHJlZGljYXRlUmVnaXN0ZXIubW9kaWZpZXIgPT0gU3JjOjpNT0RJRklFUl9OT1QpCisJCXsKKwkJCWNvbmRpdGlvbiA9IH5jb25kaXRpb247CisJCX0KKworCQljb25kaXRpb24gJj0gci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XTsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICpjb250aW51ZUJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQlsbHZtOjpCYXNpY0Jsb2NrICplbmRCbG9jayA9IGxvb3BSZXBFbmRCbG9ja1tsb29wUmVwRGVwdGggLSAxXTsKKworCQlyLmVuYWJsZUJyZWFrID0gci5lbmFibGVCcmVhayAmIH5jb25kaXRpb247CisJCUJvb2wgYWxsQnJlYWsgPSBTaWduTWFzayhyLmVuYWJsZUJyZWFrKSA9PSAweDA7CisKKwkJYnJhbmNoKGFsbEJyZWFrLCBlbmRCbG9jaywgY29udGludWVCbG9jayk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGNvbnRpbnVlQmxvY2spOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpDQUxMKFJlZ2lzdGVycyAmciwgaW50IGxhYmVsSW5kZXgpCisJeworCQlpZighbGFiZWxCbG9ja1tsYWJlbEluZGV4XSkKKwkJeworCQkJbGFiZWxCbG9ja1tsYWJlbEluZGV4XSA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJfQorCisJCWxsdm06OkJhc2ljQmxvY2sgKnJldEJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQljYWxsUmV0QmxvY2sucHVzaF9iYWNrKHJldEJsb2NrKTsKKworCQlyLmNhbGxTdGFja1tyLnN0YWNrSW5kZXgrK10gPSBVSW50KChpbnQpY2FsbFJldEJsb2NrLnNpemUoKSAtIDEpOyAgIC8vIEZJWE1FCisKKwkJTnVjbGV1czo6Y3JlYXRlQnIobGFiZWxCbG9ja1tsYWJlbEluZGV4XSk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKHJldEJsb2NrKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6Q0FMTE5aKFJlZ2lzdGVycyAmciwgaW50IGxhYmVsSW5kZXgsIGNvbnN0IFNyYyAmc3JjKQorCXsKKwkJaWYoc3JjLnR5cGUgPT0gU3JjOjpQQVJBTUVURVJfQ09OU1RCT09MKQorCQl7CisJCQlDQUxMTlpiKHIsIGxhYmVsSW5kZXgsIHNyYyk7CisJCX0KKwkJZWxzZSBpZihzcmMudHlwZSA9PSBTcmM6OlBBUkFNRVRFUl9QUkVESUNBVEUpCisJCXsKKwkJCUNBTExOWnAociwgbGFiZWxJbmRleCwgc3JjKTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OkNBTExOWmIoUmVnaXN0ZXJzICZyLCBpbnQgbGFiZWxJbmRleCwgY29uc3QgU3JjICZib29sUmVnaXN0ZXIpCisJeworCQlCb29sIGNvbmRpdGlvbiA9ICgqUG9pbnRlcjxCeXRlPihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEscHMuYltib29sUmVnaXN0ZXIuaW5kZXhdKSkgIT0gQnl0ZSgwKSk7ICAgLy8gRklYTUUKKwkJCisJCWlmKGJvb2xSZWdpc3Rlci5tb2RpZmllciA9PSBTcmM6Ok1PRElGSUVSX05PVCkKKwkJeworCQkJY29uZGl0aW9uID0gIWNvbmRpdGlvbjsJCisJCX0KKworCQlpZighbGFiZWxCbG9ja1tsYWJlbEluZGV4XSkKKwkJeworCQkJbGFiZWxCbG9ja1tsYWJlbEluZGV4XSA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJfQorCisJCWxsdm06OkJhc2ljQmxvY2sgKnJldEJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQljYWxsUmV0QmxvY2sucHVzaF9iYWNrKHJldEJsb2NrKTsKKworCQlyLmNhbGxTdGFja1tyLnN0YWNrSW5kZXgrK10gPSBVSW50KChpbnQpY2FsbFJldEJsb2NrLnNpemUoKSAtIDEpOyAgIC8vIEZJWE1FCisKKwkJYnJhbmNoKGNvbmRpdGlvbiwgbGFiZWxCbG9ja1tsYWJlbEluZGV4XSwgcmV0QmxvY2spOworCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhyZXRCbG9jayk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OkNBTExOWnAoUmVnaXN0ZXJzICZyLCBpbnQgbGFiZWxJbmRleCwgY29uc3QgU3JjICZwcmVkaWNhdGVSZWdpc3RlcikKKwl7CisJCUludDQgY29uZGl0aW9uID0gQXM8SW50ND4oci5wMFtwcmVkaWNhdGVSZWdpc3Rlci5zd2l6emxlICYgMHgzXSk7CisKKwkJaWYocHJlZGljYXRlUmVnaXN0ZXIubW9kaWZpZXIgPT0gU3JjOjpNT0RJRklFUl9OT1QpCisJCXsKKwkJCWNvbmRpdGlvbiA9IH5jb25kaXRpb247CisJCX0KKworCQljb25kaXRpb24gJj0gci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XTsKKworCQlpZighbGFiZWxCbG9ja1tsYWJlbEluZGV4XSkKKwkJeworCQkJbGFiZWxCbG9ja1tsYWJlbEluZGV4XSA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJfQorCisJCWxsdm06OkJhc2ljQmxvY2sgKnJldEJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQljYWxsUmV0QmxvY2sucHVzaF9iYWNrKHJldEJsb2NrKTsKKworCQlyLmNhbGxTdGFja1tyLnN0YWNrSW5kZXgrK10gPSBVSW50KChpbnQpY2FsbFJldEJsb2NrLnNpemUoKSAtIDEpOyAgIC8vIEZJWE1FCisKKwkJci5lbmFibGVJbmRleCsrOworCQlyLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXhdID0gY29uZGl0aW9uOworCisJCUJvb2wgbm90QWxsRmFsc2UgPSBTaWduTWFzayhjb25kaXRpb24gJiByLmVuYWJsZUJyZWFrKSAhPSAwOworCisJCWJyYW5jaChub3RBbGxGYWxzZSwgbGFiZWxCbG9ja1tsYWJlbEluZGV4XSwgcmV0QmxvY2spOworCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhyZXRCbG9jayk7CisKKwkJci5lbmFibGVJbmRleC0tOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpFTFNFKFJlZ2lzdGVycyAmcikKKwl7CisJCWlmRGVwdGgtLTsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICpmYWxzZUJsb2NrID0gaWZGYWxzZUJsb2NrW2lmRGVwdGhdOworCQlsbHZtOjpCYXNpY0Jsb2NrICplbmRCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKworCQlpZihpc0NvbmRpdGlvbmFsSWZbaWZEZXB0aF0pCisJCXsKKwkJCUludDQgY29uZGl0aW9uID0gfnIuZW5hYmxlU3RhY2tbci5lbmFibGVJbmRleF0gJiByLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXggLSAxXTsKKwkJCUJvb2wgbm90QWxsRmFsc2UgPSBTaWduTWFzayhjb25kaXRpb24gJiByLmVuYWJsZUJyZWFrKSAhPSAwOworCisJCQlicmFuY2gobm90QWxsRmFsc2UsIGZhbHNlQmxvY2ssIGVuZEJsb2NrKTsKKworCQkJci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XSA9IH5yLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXhdICYgci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4IC0gMV07CisJCX0KKwkJZWxzZQorCQl7CisJCQlOdWNsZXVzOjpjcmVhdGVCcihlbmRCbG9jayk7CisJCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhmYWxzZUJsb2NrKTsKKwkJfQorCisJCWlmRmFsc2VCbG9ja1tpZkRlcHRoXSA9IGVuZEJsb2NrOworCisJCWlmRGVwdGgrKzsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6RU5ESUYoUmVnaXN0ZXJzICZyKQorCXsKKwkJaWZEZXB0aC0tOworCisJCWxsdm06OkJhc2ljQmxvY2sgKmVuZEJsb2NrID0gaWZGYWxzZUJsb2NrW2lmRGVwdGhdOworCisJCU51Y2xldXM6OmNyZWF0ZUJyKGVuZEJsb2NrKTsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2soZW5kQmxvY2spOworCisJCWlmKGlzQ29uZGl0aW9uYWxJZltpZkRlcHRoXSkKKwkJeworCQkJYnJlYWtEZXB0aC0tOworCQkJci5lbmFibGVJbmRleC0tOworCQl9CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OkVORFJFUChSZWdpc3RlcnMgJnIpCisJeworCQlsb29wUmVwRGVwdGgtLTsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICp0ZXN0QmxvY2sgPSBsb29wUmVwVGVzdEJsb2NrW2xvb3BSZXBEZXB0aF07CisJCWxsdm06OkJhc2ljQmxvY2sgKmVuZEJsb2NrID0gbG9vcFJlcEVuZEJsb2NrW2xvb3BSZXBEZXB0aF07CisKKwkJTnVjbGV1czo6Y3JlYXRlQnIodGVzdEJsb2NrKTsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2soZW5kQmxvY2spOworCisJCXIubG9vcERlcHRoLS07CisJCXIuZW5hYmxlQnJlYWsgPSBJbnQ0KDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpFTkRMT09QKFJlZ2lzdGVycyAmcikKKwl7CisJCWxvb3BSZXBEZXB0aC0tOworCisJCXIuYUxbci5sb29wRGVwdGhdID0gci5hTFtyLmxvb3BEZXB0aF0gKyByLmluY3JlbWVudFtyLmxvb3BEZXB0aF07ICAgLy8gRklYTUU6ICs9CisKKwkJbGx2bTo6QmFzaWNCbG9jayAqdGVzdEJsb2NrID0gbG9vcFJlcFRlc3RCbG9ja1tsb29wUmVwRGVwdGhdOworCQlsbHZtOjpCYXNpY0Jsb2NrICplbmRCbG9jayA9IGxvb3BSZXBFbmRCbG9ja1tsb29wUmVwRGVwdGhdOworCisJCU51Y2xldXM6OmNyZWF0ZUJyKHRlc3RCbG9jayk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGVuZEJsb2NrKTsKKworCQlyLmxvb3BEZXB0aC0tOworCQlyLmVuYWJsZUJyZWFrID0gSW50NCgweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6SUYoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJnNyYykKKwl7CisJCWlmKHNyYy50eXBlID09IFNyYzo6UEFSQU1FVEVSX0NPTlNUQk9PTCkKKwkJeworCQkJSUZiKHIsIHNyYyk7CisJCX0KKwkJZWxzZSBpZihzcmMudHlwZSA9PSBTcmM6OlBBUkFNRVRFUl9QUkVESUNBVEUpCisJCXsKKwkJCUlGcChyLCBzcmMpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6SUZiKFJlZ2lzdGVycyAmciwgY29uc3QgU3JjICZib29sUmVnaXN0ZXIpCisJeworCQlCb29sIGNvbmRpdGlvbiA9ICgqUG9pbnRlcjxCeXRlPihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEscHMuYltib29sUmVnaXN0ZXIuaW5kZXhdKSkgIT0gQnl0ZSgwKSk7ICAgLy8gRklYTUUKKworCQlpZihib29sUmVnaXN0ZXIubW9kaWZpZXIgPT0gU3JjOjpNT0RJRklFUl9OT1QpCisJCXsKKwkJCWNvbmRpdGlvbiA9ICFjb25kaXRpb247CQorCQl9CisKKwkJbGx2bTo6QmFzaWNCbG9jayAqdHJ1ZUJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQlsbHZtOjpCYXNpY0Jsb2NrICpmYWxzZUJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCisJCWJyYW5jaChjb25kaXRpb24sIHRydWVCbG9jaywgZmFsc2VCbG9jayk7CisKKwkJaXNDb25kaXRpb25hbElmW2lmRGVwdGhdID0gZmFsc2U7CisJCWlmRmFsc2VCbG9ja1tpZkRlcHRoXSA9IGZhbHNlQmxvY2s7CisKKwkJaWZEZXB0aCsrOworCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjpJRnAoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJnByZWRpY2F0ZVJlZ2lzdGVyKSAgIC8vIEZJWE1FOiBGYWN0b3Igb3V0IHBhcnRzIGNvbW1vbiB3aXRoIElGQworCXsKKwkJSW50NCBjb25kaXRpb24gPSBBczxJbnQ0PihyLnAwW3ByZWRpY2F0ZVJlZ2lzdGVyLnN3aXp6bGUgJiAweDNdKTsKKworCQlpZihwcmVkaWNhdGVSZWdpc3Rlci5tb2RpZmllciA9PSBTcmM6Ok1PRElGSUVSX05PVCkKKwkJeworCQkJY29uZGl0aW9uID0gfmNvbmRpdGlvbjsKKwkJfQorCisJCWNvbmRpdGlvbiAmPSByLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXhdOworCisJCXIuZW5hYmxlSW5kZXgrKzsKKwkJci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XSA9IGNvbmRpdGlvbjsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICp0cnVlQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCWxsdm06OkJhc2ljQmxvY2sgKmZhbHNlQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisKKwkJQm9vbCBub3RBbGxGYWxzZSA9IFNpZ25NYXNrKGNvbmRpdGlvbiAmIHIuZW5hYmxlQnJlYWspICE9IDA7CisKKwkJYnJhbmNoKG5vdEFsbEZhbHNlLCB0cnVlQmxvY2ssIGZhbHNlQmxvY2spOworCisJCWlzQ29uZGl0aW9uYWxJZltpZkRlcHRoXSA9IHRydWU7CisJCWlmRmFsc2VCbG9ja1tpZkRlcHRoXSA9IGZhbHNlQmxvY2s7CisKKwkJaWZEZXB0aCsrOworCQlicmVha0RlcHRoKys7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OklGQyhSZWdpc3RlcnMgJnIsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEsIENvbnRyb2wgY29udHJvbCkKKwl7CisJCUludDQgY29uZGl0aW9uOworCisJCXN3aXRjaChjb250cm9sKQorCQl7CisJCWNhc2UgT3A6OkNPTlRST0xfR1Q6IGNvbmRpdGlvbiA9IENtcE5MRShzcmMwLngsICBzcmMxLngpOwlicmVhazsKKwkJY2FzZSBPcDo6Q09OVFJPTF9FUTogY29uZGl0aW9uID0gQ21wRVEoc3JjMC54LCBzcmMxLngpOwkJYnJlYWs7CisJCWNhc2UgT3A6OkNPTlRST0xfR0U6IGNvbmRpdGlvbiA9IENtcE5MVChzcmMwLngsIHNyYzEueCk7CWJyZWFrOworCQljYXNlIE9wOjpDT05UUk9MX0xUOiBjb25kaXRpb24gPSBDbXBMVChzcmMwLngsICBzcmMxLngpOwlicmVhazsKKwkJY2FzZSBPcDo6Q09OVFJPTF9ORTogY29uZGl0aW9uID0gQ21wTkVRKHNyYzAueCwgc3JjMS54KTsJYnJlYWs7CisJCWNhc2UgT3A6OkNPTlRST0xfTEU6IGNvbmRpdGlvbiA9IENtcExFKHNyYzAueCwgc3JjMS54KTsJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWNvbmRpdGlvbiAmPSByLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXhdOworCisJCXIuZW5hYmxlSW5kZXgrKzsKKwkJci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XSA9IGNvbmRpdGlvbjsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICp0cnVlQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCWxsdm06OkJhc2ljQmxvY2sgKmZhbHNlQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisKKwkJQm9vbCBub3RBbGxGYWxzZSA9IFNpZ25NYXNrKGNvbmRpdGlvbiAmIHIuZW5hYmxlQnJlYWspICE9IDA7CisKKwkJYnJhbmNoKG5vdEFsbEZhbHNlLCB0cnVlQmxvY2ssIGZhbHNlQmxvY2spOworCisJCWlzQ29uZGl0aW9uYWxJZltpZkRlcHRoXSA9IHRydWU7CisJCWlmRmFsc2VCbG9ja1tpZkRlcHRoXSA9IGZhbHNlQmxvY2s7CisKKwkJaWZEZXB0aCsrOworCQlicmVha0RlcHRoKys7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OkxBQkVMKGludCBsYWJlbEluZGV4KQorCXsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2sobGFiZWxCbG9ja1tsYWJlbEluZGV4XSk7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OkxPT1AoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJmludGVnZXJSZWdpc3RlcikKKwl7CisJCXIubG9vcERlcHRoKys7CisKKwkJci5pdGVyYXRpb25bci5sb29wRGVwdGhdID0gKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEscHMuaVtpbnRlZ2VyUmVnaXN0ZXIuaW5kZXhdWzBdKSk7CisJCXIuYUxbci5sb29wRGVwdGhdID0gKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEscHMuaVtpbnRlZ2VyUmVnaXN0ZXIuaW5kZXhdWzFdKSk7CisJCXIuaW5jcmVtZW50W3IubG9vcERlcHRoXSA9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHBzLmlbaW50ZWdlclJlZ2lzdGVyLmluZGV4XVsyXSkpOworCisJLy8JSWYoci5pbmNyZW1lbnRbci5sb29wRGVwdGhdID09IDApCisJLy8JeworCS8vCQlyLmluY3JlbWVudFtyLmxvb3BEZXB0aF0gPSAxOworCS8vCX0KKworCQlsbHZtOjpCYXNpY0Jsb2NrICpsb29wQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCWxsdm06OkJhc2ljQmxvY2sgKnRlc3RCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJbGx2bTo6QmFzaWNCbG9jayAqZW5kQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisKKwkJbG9vcFJlcFRlc3RCbG9ja1tsb29wUmVwRGVwdGhdID0gdGVzdEJsb2NrOworCQlsb29wUmVwRW5kQmxvY2tbbG9vcFJlcERlcHRoXSA9IGVuZEJsb2NrOworCisJCS8vIEZJWE1FOiBqdW1wKHRlc3RCbG9jaykKKwkJTnVjbGV1czo6Y3JlYXRlQnIodGVzdEJsb2NrKTsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2sodGVzdEJsb2NrKTsKKworCQlicmFuY2goci5pdGVyYXRpb25bci5sb29wRGVwdGhdID4gMCwgbG9vcEJsb2NrLCBlbmRCbG9jayk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGxvb3BCbG9jayk7CisKKwkJci5pdGVyYXRpb25bci5sb29wRGVwdGhdID0gci5pdGVyYXRpb25bci5sb29wRGVwdGhdIC0gMTsgICAvLyBGSVhNRTogLS0KKwkJCisJCWxvb3BSZXBEZXB0aCsrOworCQlicmVha0RlcHRoID0gMDsKKwl9CisKKwl2b2lkIFBpeGVsUm91dGluZTo6UkVQKFJlZ2lzdGVycyAmciwgY29uc3QgU3JjICZpbnRlZ2VyUmVnaXN0ZXIpCisJeworCQlyLmxvb3BEZXB0aCsrOworCisJCXIuaXRlcmF0aW9uW3IubG9vcERlcHRoXSA9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHBzLmlbaW50ZWdlclJlZ2lzdGVyLmluZGV4XVswXSkpOworCQlyLmFMW3IubG9vcERlcHRoXSA9IHIuYUxbci5sb29wRGVwdGggLSAxXTsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICpsb29wQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCWxsdm06OkJhc2ljQmxvY2sgKnRlc3RCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJbGx2bTo6QmFzaWNCbG9jayAqZW5kQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisKKwkJbG9vcFJlcFRlc3RCbG9ja1tsb29wUmVwRGVwdGhdID0gdGVzdEJsb2NrOworCQlsb29wUmVwRW5kQmxvY2tbbG9vcFJlcERlcHRoXSA9IGVuZEJsb2NrOworCisJCS8vIEZJWE1FOiBqdW1wKHRlc3RCbG9jaykKKwkJTnVjbGV1czo6Y3JlYXRlQnIodGVzdEJsb2NrKTsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2sodGVzdEJsb2NrKTsKKworCQlicmFuY2goci5pdGVyYXRpb25bci5sb29wRGVwdGhdID4gMCwgbG9vcEJsb2NrLCBlbmRCbG9jayk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGxvb3BCbG9jayk7CisKKwkJci5pdGVyYXRpb25bci5sb29wRGVwdGhdID0gci5pdGVyYXRpb25bci5sb29wRGVwdGhdIC0gMTsgICAvLyBGSVhNRTogLS0KKworCQlsb29wUmVwRGVwdGgrKzsKKwkJYnJlYWtEZXB0aCA9IDA7CisJfQorCisJdm9pZCBQaXhlbFJvdXRpbmU6OlJFVChSZWdpc3RlcnMgJnIpCisJeworCQlpZighcmV0dXJucykKKwkJeworCQkJcmV0dXJuQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCQlOdWNsZXVzOjpjcmVhdGVCcihyZXR1cm5CbG9jayk7CisKKwkJCXJldHVybnMgPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gRklYTUU6IEVuY2Fwc3VsYXRlCisJCQlVSW50IGluZGV4ID0gci5jYWxsU3RhY2tbLS1yLnN0YWNrSW5kZXhdOworIAorCQkJbGx2bTo6QmFzaWNCbG9jayAqdW5yZWFjaGFibGVCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJCWxsdm06OlZhbHVlICp2YWx1ZSA9IE51Y2xldXM6OmNyZWF0ZUxvYWQoaW5kZXguYWRkcmVzcyk7CisJCQlsbHZtOjpWYWx1ZSAqc3dpdGNoSW5zdCA9IE51Y2xldXM6OmNyZWF0ZVN3aXRjaCh2YWx1ZSwgdW5yZWFjaGFibGVCbG9jaywgKGludCljYWxsUmV0QmxvY2suc2l6ZSgpKTsKKworCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNhbGxSZXRCbG9jay5zaXplKCk7IGkrKykKKwkJCXsKKwkJCQlOdWNsZXVzOjphZGRTd2l0Y2hDYXNlKHN3aXRjaEluc3QsIGksIGNhbGxSZXRCbG9ja1tpXSk7CisJCQl9CisKKwkJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKHVucmVhY2hhYmxlQmxvY2spOworCQkJTnVjbGV1czo6Y3JlYXRlVW5yZWFjaGFibGUoKTsKKwkJfQorCX0KKworCXZvaWQgUGl4ZWxSb3V0aW5lOjp3cml0ZURlc3RpbmF0aW9uKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZCwgY29uc3QgRHN0ICZkc3QpCisJeworCQlzd2l0Y2goZHN0LnR5cGUpCisJCXsKKwkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9URU1QOgorCQkJaWYoZHN0Lm1hc2sgJiAweDEpIHIucmlbZHN0LmluZGV4XS54ID0gZC54OworCQkJaWYoZHN0Lm1hc2sgJiAweDIpIHIucmlbZHN0LmluZGV4XS55ID0gZC55OworCQkJaWYoZHN0Lm1hc2sgJiAweDQpIHIucmlbZHN0LmluZGV4XS56ID0gZC56OworCQkJaWYoZHN0Lm1hc2sgJiAweDgpIHIucmlbZHN0LmluZGV4XS53ID0gZC53OworCQkJYnJlYWs7CisJCWNhc2UgRHN0OjpQQVJBTUVURVJfSU5QVVQ6CisJCQlpZihkc3QubWFzayAmIDB4MSkgci52aVtkc3QuaW5kZXhdLnggPSBkLng7CisJCQlpZihkc3QubWFzayAmIDB4Mikgci52aVtkc3QuaW5kZXhdLnkgPSBkLnk7CisJCQlpZihkc3QubWFzayAmIDB4NCkgci52aVtkc3QuaW5kZXhdLnogPSBkLno7CisJCQlpZihkc3QubWFzayAmIDB4OCkgci52aVtkc3QuaW5kZXhdLncgPSBkLnc7CisJCQlicmVhazsKKwkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9DT05TVDoJCQlBU1NFUlQoZmFsc2UpOwlicmVhazsKKwkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9URVhUVVJFOgorCQkJaWYoZHN0Lm1hc2sgJiAweDEpIHIudGlbZHN0LmluZGV4XS54ID0gZC54OworCQkJaWYoZHN0Lm1hc2sgJiAweDIpIHIudGlbZHN0LmluZGV4XS55ID0gZC55OworCQkJaWYoZHN0Lm1hc2sgJiAweDQpIHIudGlbZHN0LmluZGV4XS56ID0gZC56OworCQkJaWYoZHN0Lm1hc2sgJiAweDgpIHIudGlbZHN0LmluZGV4XS53ID0gZC53OworCQkJYnJlYWs7CisJCWNhc2UgRHN0OjpQQVJBTUVURVJfQ09MT1JPVVQ6CisJCQlpZihkc3QubWFzayAmIDB4MSkgci52aVtkc3QuaW5kZXhdLnggPSBkLng7CisJCQlpZihkc3QubWFzayAmIDB4Mikgci52aVtkc3QuaW5kZXhdLnkgPSBkLnk7CisJCQlpZihkc3QubWFzayAmIDB4NCkgci52aVtkc3QuaW5kZXhdLnogPSBkLno7CisJCQlpZihkc3QubWFzayAmIDB4OCkgci52aVtkc3QuaW5kZXhdLncgPSBkLnc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKwl9CisKKwlDb2xvcjRpIFBpeGVsUm91dGluZTo6cmVnaShSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmc3JjKQorCXsKKwkJQ29sb3I0aSAqcmVnOworCQlpbnQgaSA9IHNyYy5pbmRleDsKKworCQlDb2xvcjRpIGM7CisKKwkJaWYoc3JjLnR5cGUgPT0gU2hhZGVyUGFyYW1ldGVyOjpQQVJBTUVURVJfQ09OU1QpCisJCXsKKwkJCWMuciA9ICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHBzLmNXW2ldWzBdKSk7CisJCQljLmcgPSAqUG9pbnRlcjxTaG9ydDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxwcy5jV1tpXVsxXSkpOworCQkJYy5iID0gKlBvaW50ZXI8U2hvcnQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEscHMuY1dbaV1bMl0pKTsKKwkJCWMuYSA9ICpQb2ludGVyPFNob3J0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHBzLmNXW2ldWzNdKSk7CisJCX0KKworCQlzd2l0Y2goc3JjLnR5cGUpCisJCXsKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9URU1QOgkJCXJlZyA9ICZyLnJpW2ldOwlicmVhazsKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9JTlBVVDoJCQlyZWcgPSAmci52aVtpXTsJYnJlYWs7CisJCWNhc2UgU3JjOjpQQVJBTUVURVJfQ09OU1Q6CQkJcmVnID0gJmM7CQlicmVhazsKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9URVhUVVJFOgkJcmVnID0gJnIudGlbaV07CWJyZWFrOworCQljYXNlIFNyYzo6UEFSQU1FVEVSX1ZPSUQ6CQkJcmV0dXJuIHIucmlbMF07ICAgLy8gRHVtbXkKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9GTE9BVExJVEVSQUw6CXJldHVybiByLnJpWzBdOyAgIC8vIER1bW15CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJU2hvcnQ0ICZ4ID0gKCpyZWcpWyhzcmMuc3dpenpsZSA+PiAwKSAmIDB4M107CisJCVNob3J0NCAmeSA9ICgqcmVnKVsoc3JjLnN3aXp6bGUgPj4gMikgJiAweDNdOworCQlTaG9ydDQgJnogPSAoKnJlZylbKHNyYy5zd2l6emxlID4+IDQpICYgMHgzXTsKKwkJU2hvcnQ0ICZ3ID0gKCpyZWcpWyhzcmMuc3dpenpsZSA+PiA2KSAmIDB4M107CisKKwkJQ29sb3I0aSBtb2Q7CisKKwkJc3dpdGNoKHNyYy5tb2RpZmllcikKKwkJeworCQljYXNlIFNyYzo6TU9ESUZJRVJfTk9ORToKKwkJCW1vZC5yID0geDsKKwkJCW1vZC5nID0geTsKKwkJCW1vZC5iID0gejsKKwkJCW1vZC5hID0gdzsKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfQklBUzoKKwkJCW1vZC5yID0gU3ViU2F0KHgsIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCW1vZC5nID0gU3ViU2F0KHksIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCW1vZC5iID0gU3ViU2F0KHosIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCW1vZC5hID0gU3ViU2F0KHcsIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfQklBU19ORUdBVEU6CisJCQltb2QuciA9IFN1YlNhdChTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSwgeCk7CisJCQltb2QuZyA9IFN1YlNhdChTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSwgeSk7CisJCQltb2QuYiA9IFN1YlNhdChTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSwgeik7CisJCQltb2QuYSA9IFN1YlNhdChTaG9ydDQoMHgwODAwLCAweDA4MDAsIDB4MDgwMCwgMHgwODAwKSwgdyk7CisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX0NPTVBMRU1FTlQ6CisJCQltb2QuciA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgeCk7CisJCQltb2QuZyA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgeSk7CisJCQltb2QuYiA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgeik7CisJCQltb2QuYSA9IFN1YlNhdChTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSwgdyk7CisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX05FR0FURToKKwkJCW1vZC5yID0gLXg7CisJCQltb2QuZyA9IC15OworCQkJbW9kLmIgPSAtejsKKwkJCW1vZC5hID0gLXc7CisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX1gyOgorCQkJbW9kLnIgPSBBZGRTYXQoeCwgeCk7CisJCQltb2QuZyA9IEFkZFNhdCh5LCB5KTsKKwkJCW1vZC5iID0gQWRkU2F0KHosIHopOworCQkJbW9kLmEgPSBBZGRTYXQodywgdyk7CisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX1gyX05FR0FURToKKwkJCW1vZC5yID0gLUFkZFNhdCh4LCB4KTsKKwkJCW1vZC5nID0gLUFkZFNhdCh5LCB5KTsKKwkJCW1vZC5iID0gLUFkZFNhdCh6LCB6KTsKKwkJCW1vZC5hID0gLUFkZFNhdCh3LCB3KTsKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfU0lHTjoKKwkJCW1vZC5yID0gU3ViU2F0KHgsIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCW1vZC5nID0gU3ViU2F0KHksIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCW1vZC5iID0gU3ViU2F0KHosIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCW1vZC5hID0gU3ViU2F0KHcsIFNob3J0NCgweDA4MDAsIDB4MDgwMCwgMHgwODAwLCAweDA4MDApKTsKKwkJCW1vZC5yID0gQWRkU2F0KG1vZC5yLCBtb2Qucik7CisJCQltb2QuZyA9IEFkZFNhdChtb2QuZywgbW9kLmcpOworCQkJbW9kLmIgPSBBZGRTYXQobW9kLmIsIG1vZC5iKTsKKwkJCW1vZC5hID0gQWRkU2F0KG1vZC5hLCBtb2QuYSk7CisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX1NJR05fTkVHQVRFOgorCQkJbW9kLnIgPSBTdWJTYXQoU2hvcnQ0KDB4MDgwMCwgMHgwODAwLCAweDA4MDAsIDB4MDgwMCksIHgpOworCQkJbW9kLmcgPSBTdWJTYXQoU2hvcnQ0KDB4MDgwMCwgMHgwODAwLCAweDA4MDAsIDB4MDgwMCksIHkpOworCQkJbW9kLmIgPSBTdWJTYXQoU2hvcnQ0KDB4MDgwMCwgMHgwODAwLCAweDA4MDAsIDB4MDgwMCksIHopOworCQkJbW9kLmEgPSBTdWJTYXQoU2hvcnQ0KDB4MDgwMCwgMHgwODAwLCAweDA4MDAsIDB4MDgwMCksIHcpOworCQkJbW9kLnIgPSBBZGRTYXQobW9kLnIsIG1vZC5yKTsKKwkJCW1vZC5nID0gQWRkU2F0KG1vZC5nLCBtb2QuZyk7CisJCQltb2QuYiA9IEFkZFNhdChtb2QuYiwgbW9kLmIpOworCQkJbW9kLmEgPSBBZGRTYXQobW9kLmEsIG1vZC5hKTsKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfRFo6CisJCQltb2QuciA9IHg7CisJCQltb2QuZyA9IHk7CisJCQltb2QuYiA9IHo7CisJCQltb2QuYSA9IHc7CisJCQkvLyBQcm9qZWN0aW9uIHBlcmZvcm1lZCBieSB0ZXh0dXJlIHNhbXBsZXIKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfRFc6CisJCQltb2QuciA9IHg7CisJCQltb2QuZyA9IHk7CisJCQltb2QuYiA9IHo7CisJCQltb2QuYSA9IHc7CisJCQkvLyBQcm9qZWN0aW9uIHBlcmZvcm1lZCBieSB0ZXh0dXJlIHNhbXBsZXIKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWlmKHNyYy50eXBlID09IFNoYWRlclBhcmFtZXRlcjo6UEFSQU1FVEVSX0NPTlNUICYmIChzcmMubW9kaWZpZXIgPT0gU3JjOjpNT0RJRklFUl9YMiB8fCBzcmMubW9kaWZpZXIgPT0gU3JjOjpNT0RJRklFUl9YMl9ORUdBVEUpKQorCQl7CisJCQltb2QuciA9IE1pbihtb2QuciwgU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOyBtb2QuciA9IE1heChtb2QuciwgU2hvcnQ0KC0weDEwMDAsIC0weDEwMDAsIC0weDEwMDAsIC0weDEwMDApKTsKKwkJCW1vZC5nID0gTWluKG1vZC5nLCBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKSk7IG1vZC5nID0gTWF4KG1vZC5nLCBTaG9ydDQoLTB4MTAwMCwgLTB4MTAwMCwgLTB4MTAwMCwgLTB4MTAwMCkpOworCQkJbW9kLmIgPSBNaW4obW9kLmIsIFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApKTsgbW9kLmIgPSBNYXgobW9kLmIsIFNob3J0NCgtMHgxMDAwLCAtMHgxMDAwLCAtMHgxMDAwLCAtMHgxMDAwKSk7CisJCQltb2QuYSA9IE1pbihtb2QuYSwgU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOyBtb2QuYSA9IE1heChtb2QuYSwgU2hvcnQ0KC0weDEwMDAsIC0weDEwMDAsIC0weDEwMDAsIC0weDEwMDApKTsKKwkJfQorCisJCXJldHVybiBtb2Q7CisJfQorCisJQ29sb3I0ZiBQaXhlbFJvdXRpbmU6OnJlZyhSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmc3JjLCBpbnQgb2Zmc2V0KQorCXsKKwkJQ29sb3I0ZiByZWc7CisJCWludCBpID0gc3JjLmluZGV4ICsgb2Zmc2V0OworCisJCXN3aXRjaChzcmMudHlwZSkKKwkJeworCQljYXNlIFNyYzo6UEFSQU1FVEVSX1RFTVA6CQkJcmVnID0gci5yZltpXTsJCWJyZWFrOworCQljYXNlIFNyYzo6UEFSQU1FVEVSX0lOUFVUOgorCQkJeworCQkJCWlmKCFzcmMucmVsYXRpdmUpCisJCQkJeworCQkJCQlyZWcueCA9IHIudnhbaV07CisJCQkJCXJlZy55ID0gci52eVtpXTsKKwkJCQkJcmVnLnogPSByLnZ6W2ldOworCQkJCQlyZWcudyA9IHIudndbaV07CisJCQkJfQorCQkJCWVsc2UgaWYoc3JjLnJlbGF0aXZlVHlwZSA9PSBTcmM6OlBBUkFNRVRFUl9MT09QKQorCQkJCXsKKwkJCQkJSW50IGFMID0gci5hTFtyLmxvb3BEZXB0aF07CisKKwkJCQkJcmVnLnggPSByLnZ4W2kgKyBhTF07CisJCQkJCXJlZy55ID0gci52eVtpICsgYUxdOworCQkJCQlyZWcueiA9IHIudnpbaSArIGFMXTsKKwkJCQkJcmVnLncgPSByLnZ3W2kgKyBhTF07CisJCQkJfQorCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNyYzo6UEFSQU1FVEVSX0NPTlNUOgorCQkJeworCQkJCXJlZy5yID0gcmVnLmcgPSByZWcuYiA9IHJlZy5hID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEscHMuY1tpXSkpOworCisJCQkJcmVnLnIgPSByZWcuci54eHh4OworCQkJCXJlZy5nID0gcmVnLmcueXl5eTsKKwkJCQlyZWcuYiA9IHJlZy5iLnp6eno7CisJCQkJcmVnLmEgPSByZWcuYS53d3d3OworCisJCQkJaWYobG9jYWxTaGFkZXJDb25zdGFudHMpICAgLy8gQ29uc3RhbnQgbWF5IGJlIGtub3duIGF0IGNvbXBpbGUgdGltZQorCQkJCXsKKwkJCQkJZm9yKGludCBqID0gMDsgaiA8IHBpeGVsU2hhZGVyLT5nZXRMZW5ndGgoKTsgaisrKQorCQkJCQl7CisJCQkJCQljb25zdCBTaGFkZXJJbnN0cnVjdGlvbiAmaW5zdHJ1Y3Rpb24gPSAqcGl4ZWxTaGFkZXItPmdldEluc3RydWN0aW9uKGopOworCisJCQkJCQlpZihpbnN0cnVjdGlvbi5nZXRPcGNvZGUoKSA9PSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9ERUYpCisJCQkJCQl7CisJCQkJCQkJaWYoaW5zdHJ1Y3Rpb24uZ2V0RGVzdGluYXRpb25QYXJhbWV0ZXIoKS5pbmRleCA9PSBpKQorCQkJCQkJCXsKKwkJCQkJCQkJcmVnLnIgPSBGbG9hdDQoaW5zdHJ1Y3Rpb24uZ2V0U291cmNlUGFyYW1ldGVyKDApLnZhbHVlKTsKKwkJCQkJCQkJcmVnLmcgPSBGbG9hdDQoaW5zdHJ1Y3Rpb24uZ2V0U291cmNlUGFyYW1ldGVyKDEpLnZhbHVlKTsKKwkJCQkJCQkJcmVnLmIgPSBGbG9hdDQoaW5zdHJ1Y3Rpb24uZ2V0U291cmNlUGFyYW1ldGVyKDIpLnZhbHVlKTsKKwkJCQkJCQkJcmVnLmEgPSBGbG9hdDQoaW5zdHJ1Y3Rpb24uZ2V0U291cmNlUGFyYW1ldGVyKDMpLnZhbHVlKTsKKworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9URVhUVVJFOgorCQkJeworCQkJCXJlZy54ID0gci52eFsyICsgaV07CisJCQkJcmVnLnkgPSByLnZ5WzIgKyBpXTsKKwkJCQlyZWcueiA9IHIudnpbMiArIGldOworCQkJCXJlZy53ID0gci52d1syICsgaV07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9NSVNDVFlQRToKKwkJCWlmKHNyYy5pbmRleCA9PSAwKQkJCQlyZWcgPSByLnZQb3M7CisJCQlpZihzcmMuaW5kZXggPT0gMSkJCQkJcmVnID0gci52RmFjZTsKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6UEFSQU1FVEVSX1NBTVBMRVI6CQlyZXR1cm4gci5yZlswXTsgICAvLyBEdW1teQorCQljYXNlIFNyYzo6UEFSQU1FVEVSX1BSRURJQ0FURToJCXJldHVybiByLnJmWzBdOyAgIC8vIER1bW15CisJCWNhc2UgU3JjOjpQQVJBTUVURVJfVk9JRDoJCQlyZXR1cm4gci5yZlswXTsgICAvLyBEdW1teQorCQljYXNlIFNyYzo6UEFSQU1FVEVSX0ZMT0FUTElURVJBTDoJcmV0dXJuIHIucmZbMF07ICAgLy8gRHVtbXkKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9DT05TVElOVDoJCXJldHVybiByLnJmWzBdOyAgIC8vIER1bW15CisJCWNhc2UgU3JjOjpQQVJBTUVURVJfQ09OU1RCT09MOgkJcmV0dXJuIHIucmZbMF07ICAgLy8gRHVtbXkKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9MT09QOgkJCXJldHVybiByLnJmWzBdOyAgIC8vIER1bW15CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJRmxvYXQ0ICZ4ID0gcmVnWyhzcmMuc3dpenpsZSA+PiAwKSAmIDB4M107CisJCUZsb2F0NCAmeSA9IHJlZ1soc3JjLnN3aXp6bGUgPj4gMikgJiAweDNdOworCQlGbG9hdDQgJnogPSByZWdbKHNyYy5zd2l6emxlID4+IDQpICYgMHgzXTsKKwkJRmxvYXQ0ICZ3ID0gcmVnWyhzcmMuc3dpenpsZSA+PiA2KSAmIDB4M107CisKKwkJQ29sb3I0ZiBtb2Q7CisKKwkJc3dpdGNoKHNyYy5tb2RpZmllcikKKwkJeworCQljYXNlIFNyYzo6TU9ESUZJRVJfTk9ORToKKwkJCW1vZC54ID0geDsKKwkJCW1vZC55ID0geTsKKwkJCW1vZC56ID0gejsKKwkJCW1vZC53ID0gdzsKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfTkVHQVRFOgorCQkJbW9kLnggPSAteDsKKwkJCW1vZC55ID0gLXk7CisJCQltb2QueiA9IC16OworCQkJbW9kLncgPSAtdzsKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfQUJTOgorCQkJbW9kLnggPSBBYnMoeCk7CisJCQltb2QueSA9IEFicyh5KTsKKwkJCW1vZC56ID0gQWJzKHopOworCQkJbW9kLncgPSBBYnModyk7CisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX0FCU19ORUdBVEU6CisJCQltb2QueCA9IC1BYnMoeCk7CisJCQltb2QueSA9IC1BYnMoeSk7CisJCQltb2QueiA9IC1BYnMoeik7CisJCQltb2QudyA9IC1BYnModyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gbW9kOworCX0KKworCWJvb2wgUGl4ZWxSb3V0aW5lOjpjb2xvclVzZWQoKQorCXsKKwkJcmV0dXJuIHN0YXRlLmNvbG9yV3JpdGVNYXNrIHx8IHN0YXRlLmFscGhhVGVzdEFjdGl2ZSgpIHx8IHN0YXRlLnNoYWRlckNvbnRhaW5zVGV4a2lsbDsKKwl9CisKKwl1bnNpZ25lZCBzaG9ydCBQaXhlbFJvdXRpbmU6OnBpeGVsU2hhZGVyVmVyc2lvbigpIGNvbnN0CisJeworCQlyZXR1cm4gcGl4ZWxTaGFkZXIgPyBwaXhlbFNoYWRlci0+Z2V0VmVyc2lvbigpIDogMHgwMDAwOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9TaGFkZXIvUGl4ZWxSb3V0aW5lLmhwcCBiL3NyYy9TaGFkZXIvUGl4ZWxSb3V0aW5lLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA3MGZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1NoYWRlci9QaXhlbFJvdXRpbmUuaHBwCkBAIC0wLDAgKzEsMzA0IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgc3dfUGl4ZWxSb3V0aW5lX2hwcAorI2RlZmluZSBzd19QaXhlbFJvdXRpbmVfaHBwCisKKyNpbmNsdWRlICJSYXN0ZXJpemVyLmhwcCIKKyNpbmNsdWRlICJTaGFkZXJDb3JlLmhwcCIKKworI2luY2x1ZGUgIlR5cGVzLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJZXh0ZXJuIGJvb2wgZm9yY2VDbGVhclJlZ2lzdGVyczsKKworCWNsYXNzIFBpeGVsU2hhZGVyOworCWNsYXNzIFNhbXBsZXJDb3JlOworCisJY2xhc3MgUGl4ZWxSb3V0aW5lIDogcHVibGljIFJhc3Rlcml6ZXIsIHB1YmxpYyBTaGFkZXJDb3JlCisJeworCQlmcmllbmQgUGl4ZWxQcm9jZXNzb3I7ICAgLy8gRklYTUUKKworCXB1YmxpYzoKKwkJUGl4ZWxSb3V0aW5lKGNvbnN0IFBpeGVsUHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUsIGNvbnN0IFBpeGVsU2hhZGVyICpwaXhlbFNoYWRlcik7CisKKwkJflBpeGVsUm91dGluZSgpOworCisJcHJvdGVjdGVkOgorCQlzdHJ1Y3QgUmVnaXN0ZXJzCisJCXsKKwkJCVJlZ2lzdGVycygpIDogY3VycmVudChyaVswXSksIGRpZmZ1c2UodmlbMF0pLCBzcGVjdWxhcih2aVsxXSksIGNhbGxTdGFjayg0KSwgYUwoNCksIGluY3JlbWVudCg0KSwgaXRlcmF0aW9uKDQpLCBlbmFibGVTdGFjaygxICsgMjQpLCB2eCgxMCksIHZ5KDEwKSwgdnooMTApLCB2dygxMCkKKwkJCXsKKwkJCQlpZihmb3JjZUNsZWFyUmVnaXN0ZXJzKQorCQkJCXsKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IDEwOyBpKyspCisJCQkJCXsKKwkJCQkJCXZ4W2ldID0gRmxvYXQ0KDAsIDAsIDAsIDApOworCQkJCQkJdnlbaV0gPSBGbG9hdDQoMCwgMCwgMCwgMCk7CisJCQkJCQl2eltpXSA9IEZsb2F0NCgwLCAwLCAwLCAwKTsKKwkJCQkJCXZ3W2ldID0gRmxvYXQ0KDAsIDAsIDAsIDApOworCQkJCQl9CisKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IDQ7IGkrKykKKwkJCQkJeworCQkJCQkJb0NbaV0uciA9IEZsb2F0NCgwLjBmKTsKKwkJCQkJCW9DW2ldLmcgPSBGbG9hdDQoMC4wZik7CisJCQkJCQlvQ1tpXS5iID0gRmxvYXQ0KDAuMGYpOworCQkJCQkJb0NbaV0uYSA9IEZsb2F0NCgwLjBmKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWxvb3BEZXB0aCA9IC0xOworCQkJCWVuYWJsZVN0YWNrWzBdID0gSW50NCgweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGKTsKKwkJCQllbmFibGVCcmVhayA9IEludDQoMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7CisKKwkJCQlvY2NsdXNpb24gPSAwOworCQkJCQorCQkJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IFBFUkZfVElNRVJTOyBpKyspCisJCQkJCXsKKwkJCQkJCWN5Y2xlc1tpXSA9IDA7CisJCQkJCX0KKwkJCQkjZW5kaWYKKwkJCX0KKworCQkJUG9pbnRlcjxCeXRlPiBjb25zdGFudHM7CisKKwkJCVBvaW50ZXI8Qnl0ZT4gcHJpbWl0aXZlOworCQkJSW50IGNsdXN0ZXI7CisJCQlQb2ludGVyPEJ5dGU+IGRhdGE7CisKKwkJCUZsb2F0NCB6WzRdOworCQkJRmxvYXQ0IHJodzsKKworCQkJRmxvYXQ0IER6WzRdOworCQkJRmxvYXQ0IER3OworCQkJRmxvYXQ0IER2WzEwXVs0XTsKKwkJCUZsb2F0NCBEZjsKKworCQkJQ29sb3I0aSAmY3VycmVudDsKKwkJCUNvbG9yNGkgJmRpZmZ1c2U7CisJCQlDb2xvcjRpICZzcGVjdWxhcjsKKworCQkJQ29sb3I0aSByaVs2XTsKKwkJCUNvbG9yNGkgdmlbMl07CisJCQlDb2xvcjRpIHRpWzZdOworCisJCQlDb2xvcjRmIHJmWzMyXTsKKwkJCUFycmF5PEZsb2F0ND4gdng7CisJCQlBcnJheTxGbG9hdDQ+IHZ5OworCQkJQXJyYXk8RmxvYXQ0PiB2ejsKKwkJCUFycmF5PEZsb2F0ND4gdnc7CisKKwkJCUNvbG9yNGYgdlBvczsKKwkJCUNvbG9yNGYgdkZhY2U7CisKKwkJCUNvbG9yNGYgb0NbNF07CisJCQlGbG9hdDQgb0RlcHRoOworCisJCQlDb2xvcjRmIHAwOworCQkJQXJyYXk8SW50PiBhTDsKKworCQkJQXJyYXk8SW50PiBpbmNyZW1lbnQ7CisJCQlBcnJheTxJbnQ+IGl0ZXJhdGlvbjsKKworCQkJSW50IGxvb3BEZXB0aDsKKwkJCUludCBzdGFja0luZGV4OyAgIC8vIEZJWE1FOiBJbmMvZGVjcmVtZW50IGNhbGxTdGFjaworCQkJQXJyYXk8VUludD4gY2FsbFN0YWNrOworCisJCQlJbnQgZW5hYmxlSW5kZXg7CisJCQlBcnJheTxJbnQ0PiBlbmFibGVTdGFjazsKKwkJCUludDQgZW5hYmxlQnJlYWs7CisKKwkJCS8vIGJlbShsKSBvZmZzZXRzIGFuZCBsdW1pbmFuY2UKKwkJCUZsb2F0NCBkdTsKKwkJCUZsb2F0NCBkdjsKKwkJCVNob3J0NCBMOworCisJCQkvLyB0ZXhtM3gzIHRlbXBvcmFyaWVzCisJCQlGbG9hdDQgdV87ICAgLy8gRklYTUUKKwkJCUZsb2F0NCB2XzsgICAvLyBGSVhNRQorCQkJRmxvYXQ0IHdfOyAgIC8vIEZJWE1FCisJCQlGbG9hdDQgVTsgICAvLyBGSVhNRQorCQkJRmxvYXQ0IFY7ICAgLy8gRklYTUUKKwkJCUZsb2F0NCBXOyAgIC8vIEZJWE1FCisKKwkJCVVJbnQgb2NjbHVzaW9uOworCisJCQkjaWYgUEVSRl9QUk9GSUxFCisJCQkJTG9uZyBjeWNsZXNbUEVSRl9USU1FUlNdOworCQkJI2VuZGlmCisJCX07CisKKwkJdm9pZCBxdWFkKFJlZ2lzdGVycyAmciwgUG9pbnRlcjxCeXRlPiBjQnVmZmVyWzRdLCBQb2ludGVyPEJ5dGU+ICZ6QnVmZmVyLCBQb2ludGVyPEJ5dGU+ICZzQnVmZmVyLCBJbnQgY01hc2tbNF0sIEludCAmeCwgSW50ICZ5KTsKKworCQlGbG9hdDQgaW50ZXJwb2xhdGUoRmxvYXQ0ICZ4LCBGbG9hdDQgJkQsIEZsb2F0NCAmcmh3LCBQb2ludGVyPEJ5dGU+IHBsYW5lRXF1YXRpb24sIGJvb2wgZmxhdCwgYm9vbCBwZXJzcGVjdGl2ZSk7CisJCUZsb2F0NCBpbnRlcnBvbGF0ZUNlbnRyb2lkKEZsb2F0NCAmeCwgRmxvYXQ0ICZ5LCBGbG9hdDQgJnJodywgUG9pbnRlcjxCeXRlPiBwbGFuZUVxdWF0aW9uLCBib29sIGZsYXQsIGJvb2wgcGVyc3BlY3RpdmUpOworCQl2b2lkIHN0ZW5jaWxUZXN0KFJlZ2lzdGVycyAmciwgUG9pbnRlcjxCeXRlPiAmc0J1ZmZlciwgaW50IHEsIEludCAmeCwgSW50ICZzTWFzaywgSW50ICZjTWFzayk7CisJCXZvaWQgc3RlbmNpbFRlc3QoUmVnaXN0ZXJzICZyLCBCeXRlOCAmdmFsdWUsIENvbnRleHQ6OlN0ZW5jaWxDb21wYXJlTW9kZSBzdGVuY2lsQ29tcGFyZU1vZGUsIGJvb2wgQ0NXKTsKKwkJdm9pZCBzdGVuY2lsT3BlcmF0aW9uKFJlZ2lzdGVycyAmciwgQnl0ZTggJm5ld1ZhbHVlLCBCeXRlOCAmYnVmZmVyVmFsdWUsIENvbnRleHQ6OlN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbFBhc3NPcGVyYXRpb24sIENvbnRleHQ6OlN0ZW5jaWxPcGVyYXRpb24gc3RlbmNpbFpGYWlsT3BlcmF0aW9uLCBDb250ZXh0OjpTdGVuY2lsT3BlcmF0aW9uIHN0ZW5jaWxGYWlsT3BlcmF0aW9uLCBib29sIENDVywgSW50ICZ6TWFzaywgSW50ICZzTWFzayk7CisJCXZvaWQgc3RlbmNpbE9wZXJhdGlvbihSZWdpc3RlcnMgJnIsIEJ5dGU4ICZvdXRwdXQsIEJ5dGU4ICZidWZmZXJWYWx1ZSwgQ29udGV4dDo6U3RlbmNpbE9wZXJhdGlvbiBvcGVyYXRpb24sIGJvb2wgQ0NXKTsKKwkJQm9vbCBkZXB0aFRlc3QoUmVnaXN0ZXJzICZyLCBQb2ludGVyPEJ5dGU+ICZ6QnVmZmVyLCBpbnQgcSwgSW50ICZ4LCBGbG9hdDQgJnosIEludCAmc01hc2ssIEludCAmek1hc2ssIEludCAmY01hc2spOworCQl2b2lkIGJsZW5kVGV4dHVyZShSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmN1cnJlbnQsIENvbG9yNGkgJnRlbXAsIENvbG9yNGkgJnRleHR1cmUsIGludCBzdGFnZSk7CisJCXZvaWQgYWxwaGFUZXN0KFJlZ2lzdGVycyAmciwgSW50ICZhTWFzaywgU2hvcnQ0ICZhbHBoYSk7CisJCXZvaWQgYWxwaGFUb0NvdmVyYWdlKFJlZ2lzdGVycyAmciwgSW50IGNNYXNrWzRdLCBGbG9hdDQgJmFscGhhKTsKKwkJQm9vbCBhbHBoYVRlc3QoUmVnaXN0ZXJzICZyLCBJbnQgY01hc2tbNF0sIENvbG9yNGkgJmN1cnJlbnQpOworCQlCb29sIGFscGhhVGVzdChSZWdpc3RlcnMgJnIsIEludCBjTWFza1s0XSwgQ29sb3I0ZiAmYzApOworCQl2b2lkIGZvZ0JsZW5kKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmY3VycmVudCwgRmxvYXQ0ICZmb2csIEZsb2F0NCAmeiwgRmxvYXQ0ICZyaHcpOworCQl2b2lkIGZvZ0JsZW5kKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmYzAsIEZsb2F0NCAmZm9nLCBGbG9hdDQgJnosIEZsb2F0NCAmcmh3KTsKKwkJdm9pZCBwaXhlbEZvZyhSZWdpc3RlcnMgJnIsIEZsb2F0NCAmdmlzaWJpbGl0eSwgRmxvYXQ0ICZ6LCBGbG9hdDQgJnJodyk7CisJCXZvaWQgc3BlY3VsYXJQaXhlbChDb2xvcjRpICZjdXJyZW50LCBDb2xvcjRpICZzcGVjdWxhcik7CisKKwkJdm9pZCBzYW1wbGVUZXh0dXJlKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmYywgaW50IGNvb3JkaW5hdGVzLCBpbnQgc2FtcGxlciwgYm9vbCBwcm9qZWN0ID0gZmFsc2UpOworCQl2b2lkIHNhbXBsZVRleHR1cmUoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZjLCBpbnQgc2FtcGxlciwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmdywgRmxvYXQ0ICZxLCBib29sIHByb2plY3QgPSBmYWxzZSwgYm9vbCBiaWFzID0gZmFsc2UsIGJvb2wgZml4ZWQxMiA9IHRydWUpOworCQl2b2lkIHNhbXBsZVRleHR1cmUoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZjLCBpbnQgc2FtcGxlciwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmdywgRmxvYXQ0ICZxLCBDb2xvcjRmICZkc3gsIENvbG9yNGYgJmRzeSwgYm9vbCBwcm9qZWN0ID0gZmFsc2UsIGJvb2wgYmlhcyA9IGZhbHNlLCBib29sIGZpeGVkMTIgPSB0cnVlLCBib29sIGdyYWRpZW50cyA9IGZhbHNlLCBib29sIGxvZFByb3ZpZGVkID0gZmFsc2UpOworCQl2b2lkIHNhbXBsZVRleHR1cmUoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZjLCBpbnQgc2FtcGxlciwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmdywgRmxvYXQ0ICZxLCBDb2xvcjRmICZkc3gsIENvbG9yNGYgJmRzeSwgYm9vbCBwcm9qZWN0ID0gZmFsc2UsIGJvb2wgYmlhcyA9IGZhbHNlLCBib29sIGdyYWRpZW50cyA9IGZhbHNlLCBib29sIGxvZFByb3ZpZGVkID0gZmFsc2UpOworCQorCQkvLyBSYXN0ZXIgb3BlcmF0aW9ucworCQl2b2lkIGNsYW1wQ29sb3IoQ29sb3I0ZiBvQ1s0XSk7CisJCXZvaWQgcmFzdGVyT3BlcmF0aW9uKENvbG9yNGkgJmN1cnJlbnQsIFJlZ2lzdGVycyAmciwgRmxvYXQ0ICZmb2csIFBvaW50ZXI8Qnl0ZT4gJmNCdWZmZXIsIEludCAmeCwgSW50IHNNYXNrWzRdLCBJbnQgek1hc2tbNF0sIEludCBjTWFza1s0XSk7CisJCXZvaWQgcmFzdGVyT3BlcmF0aW9uKENvbG9yNGYgb0NbNF0sIFJlZ2lzdGVycyAmciwgRmxvYXQ0ICZmb2csIFBvaW50ZXI8Qnl0ZT4gY0J1ZmZlcls0XSwgSW50ICZ4LCBJbnQgc01hc2tbNF0sIEludCB6TWFza1s0XSwgSW50IGNNYXNrWzRdKTsKKwkJdm9pZCBibGVuZEZhY3RvcihSZWdpc3RlcnMgJnIsIGNvbnN0IENvbG9yNGkgJmJsZW5kRmFjdG9yLCBjb25zdCBDb2xvcjRpICZjdXJyZW50LCBjb25zdCBDb2xvcjRpICZwaXhlbCwgQ29udGV4dDo6QmxlbmRGYWN0b3IgYmxlbmRGYWN0b3JBY3RpdmUpOworCQl2b2lkIGJsZW5kRmFjdG9yQWxwaGEoUmVnaXN0ZXJzICZyLCBjb25zdCBDb2xvcjRpICZibGVuZEZhY3RvciwgY29uc3QgQ29sb3I0aSAmY3VycmVudCwgY29uc3QgQ29sb3I0aSAmcGl4ZWwsIENvbnRleHQ6OkJsZW5kRmFjdG9yIGJsZW5kRmFjdG9yQWxwaGFBY3RpdmUpOworCQl2b2lkIGFscGhhQmxlbmQoUmVnaXN0ZXJzICZyLCBpbnQgaW5kZXgsIFBvaW50ZXI8Qnl0ZT4gJmNCdWZmZXIsIENvbG9yNGkgJmN1cnJlbnQsIEludCAmeCk7CisJCXZvaWQgd3JpdGVDb2xvcihSZWdpc3RlcnMgJnIsIGludCBpbmRleCwgUG9pbnRlcjxCeXRlPiAmY0J1ZmZlciwgSW50ICZpLCBDb2xvcjRpICZjdXJyZW50LCBJbnQgJnNNYXNrLCBJbnQgJnpNYXNrLCBJbnQgJmNNYXNrKTsKKwkJdm9pZCBibGVuZEZhY3RvcihSZWdpc3RlcnMgJnIsIGNvbnN0IENvbG9yNGYgJmJsZW5kRmFjdG9yLCBjb25zdCBDb2xvcjRmICZvQywgY29uc3QgQ29sb3I0ZiAmcGl4ZWwsIENvbnRleHQ6OkJsZW5kRmFjdG9yIGJsZW5kRmFjdG9yQWN0aXZlKTsKKwkJdm9pZCBibGVuZEZhY3RvckFscGhhKFJlZ2lzdGVycyAmciwgY29uc3QgQ29sb3I0ZiAmYmxlbmRGYWN0b3IsIGNvbnN0IENvbG9yNGYgJm9DLCBjb25zdCBDb2xvcjRmICZwaXhlbCwgQ29udGV4dDo6QmxlbmRGYWN0b3IgYmxlbmRGYWN0b3JBbHBoYUFjdGl2ZSk7CisJCXZvaWQgYWxwaGFCbGVuZChSZWdpc3RlcnMgJnIsIGludCBpbmRleCwgUG9pbnRlcjxCeXRlPiAmY0J1ZmZlciwgQ29sb3I0ZiAmb0MsIEludCAmeCk7CisJCXZvaWQgd3JpdGVDb2xvcihSZWdpc3RlcnMgJnIsIGludCBpbmRleCwgUG9pbnRlcjxCeXRlPiAmY0J1ZmZlciwgSW50ICZpLCBDb2xvcjRmICZvQywgSW50ICZzTWFzaywgSW50ICZ6TWFzaywgSW50ICZjTWFzayk7CisJCXZvaWQgd3JpdGVTdGVuY2lsKFJlZ2lzdGVycyAmciwgUG9pbnRlcjxCeXRlPiAmc0J1ZmZlciwgaW50IHEsIEludCAmeCwgSW50ICZzTWFzaywgSW50ICZ6TWFzaywgSW50ICZjTWFzayk7CisJCXZvaWQgd3JpdGVEZXB0aChSZWdpc3RlcnMgJnIsIFBvaW50ZXI8Qnl0ZT4gJnpCdWZmZXIsIGludCBxLCBJbnQgJngsIEZsb2F0NCAmeiwgSW50ICZ6TWFzayk7CisKKwkJdm9pZCBwc18xX3goUmVnaXN0ZXJzICZyLCBJbnQgY01hc2tbNF0pOworCQl2b2lkIHBzXzJfeChSZWdpc3RlcnMgJnIsIEludCBjTWFza1s0XSk7CisKKwkJU2hvcnQ0IGNvbnZlcnRGaXhlZDEyKEZsb2F0NCAmY2YpOworCQl2b2lkIGNvbnZlcnRGaXhlZDEyKENvbG9yNGkgJmNpLCBDb2xvcjRmICZjZik7CisJCUZsb2F0NCBjb252ZXJ0U2lnbmVkMTIoU2hvcnQ0ICZjaSk7CisJCXZvaWQgY29udmVydFNpZ25lZDEyKENvbG9yNGYgJmNmLCBDb2xvcjRpICZjaSk7CisJCUZsb2F0NCBjb252ZXJ0VW5zaWduZWQxNihVU2hvcnQ0IGNpKTsKKwkJVVNob3J0NCBjb252ZXJ0Rml4ZWQxNihGbG9hdDQgJmNmLCBib29sIHNhdHVyYXRlID0gdHJ1ZSk7CisJCXZvaWQgY29udmVydEZpeGVkMTYoQ29sb3I0aSAmY2ksIENvbG9yNGYgJmNmLCBib29sIHNhdHVyYXRlID0gdHJ1ZSk7CisJCXZvaWQgc1JHQnRvTGluZWFyMTZfMTYoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZjKTsKKwkJdm9pZCBzUkdCdG9MaW5lYXIxMl8xNihSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmMpOworCQl2b2lkIGxpbmVhclRvU1JHQjE2XzE2KFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmYyk7CisJCXZvaWQgbGluZWFyVG9TUkdCMTJfMTYoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZjKTsKKwkJRmxvYXQ0IHNSR0J0b0xpbmVhcihjb25zdCBGbG9hdDQgJngpOworCQlGbG9hdDQgbGluZWFyVG9TUkdCKGNvbnN0IEZsb2F0NCAmeCk7CisKKwkJdHlwZWRlZiBTaGFkZXI6Okluc3RydWN0aW9uOjpEZXN0aW5hdGlvblBhcmFtZXRlciBEc3Q7CisJCXR5cGVkZWYgU2hhZGVyOjpJbnN0cnVjdGlvbjo6U291cmNlUGFyYW1ldGVyIFNyYzsKKwkJdHlwZWRlZiBTaGFkZXI6Okluc3RydWN0aW9uOjpPcGVyYXRpb24gT3A7CisJCXR5cGVkZWYgU2hhZGVyOjpJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpDb250cm9sIENvbnRyb2w7CisKKwkJLy8gcHNfMV94IGluc3RydWN0aW9ucworCQl2b2lkIE1PVihDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzApOworCQl2b2lkIEFERChDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpOworCQl2b2lkIFNVQihDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpOworCQl2b2lkIE1BRChDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEsIENvbG9yNGkgJnNyYzIpOworCQl2b2lkIE1VTChDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpOworCQl2b2lkIERQMyhDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpOworCQl2b2lkIERQNChDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpOworCQl2b2lkIExSUChDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEsIENvbG9yNGkgJnNyYzIpOworCQl2b2lkIFRFWENPT1JEKENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgaW50IGNvb3JkaW5hdGUpOworCQl2b2lkIFRFWENSRChDb2xvcjRpICZkc3QsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJnMsIGludCBjb29yZGluYXRlLCBib29sIHByb2plY3QpOworCQl2b2lkIFRFWERQMyhSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgQ29sb3I0aSAmc3JjKTsKKwkJdm9pZCBURVhEUDNURVgoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkc3QsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJnMsIGludCBzdGFnZSwgQ29sb3I0aSAmc3JjMCk7CisJCXZvaWQgVEVYS0lMTChJbnQgY01hc2tbNF0sIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJnMpOworCQl2b2lkIFRFWEtJTEwoSW50IGNNYXNrWzRdLCBDb2xvcjRpICZkc3QpOworCQl2b2lkIFRFWChSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgaW50IHN0YWdlLCBib29sIHByb2plY3QpOworCQl2b2lkIFRFWExEKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBDb2xvcjRpICZzcmMsIGludCBzdGFnZSwgYm9vbCBwcm9qZWN0KTsKKwkJdm9pZCBURVhCRU0oUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgaW50IHN0YWdlKTsKKwkJdm9pZCBURVhCRU1MKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBDb2xvcjRpICZzcmMsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJnMsIGludCBzdGFnZSk7CisJCXZvaWQgVEVYUkVHMkFSKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBDb2xvcjRpICZzcmMwLCBpbnQgc3RhZ2UpOworCQl2b2lkIFRFWFJFRzJHQihSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgQ29sb3I0aSAmc3JjMCwgaW50IHN0YWdlKTsKKwkJdm9pZCBURVhSRUcyUkdCKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBDb2xvcjRpICZzcmMwLCBpbnQgc3RhZ2UpOworCQl2b2lkIFRFWE0zWDJERVBUSChSZWdpc3RlcnMgJnIsIENvbG9yNGkgJmRzdCwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmcywgQ29sb3I0aSAmc3JjLCBib29sIHNpZ25lZFNjYWxpbmcpOworCQl2b2lkIFRFWE0zWDJQQUQoUmVnaXN0ZXJzICZyLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBDb2xvcjRpICZzcmMwLCBpbnQgY29tcG9uZW50LCBib29sIHNpZ25lZFNjYWxpbmcpOworCQl2b2lkIFRFWE0zWDJURVgoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkc3QsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJnMsIGludCBzdGFnZSwgQ29sb3I0aSAmc3JjMCwgYm9vbCBzaWduZWRTY2FsaW5nKTsKKwkJdm9pZCBURVhNM1gzKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBDb2xvcjRpICZzcmMwLCBib29sIHNpZ25lZFNjYWxpbmcpOworCQl2b2lkIFRFWE0zWDNQQUQoUmVnaXN0ZXJzICZyLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBDb2xvcjRpICZzcmMwLCBpbnQgY29tcG9uZW50LCBib29sIHNpZ25lZFNjYWxpbmcpOworCQl2b2lkIFRFWE0zWDNTUEVDKFJlZ2lzdGVycyAmciwgQ29sb3I0aSAmZHN0LCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZzLCBpbnQgc3RhZ2UsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEpOworCQl2b2lkIFRFWE0zWDNURVgoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkc3QsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJnMsIGludCBzdGFnZSwgQ29sb3I0aSAmc3JjMCwgYm9vbCBzaW5nZWRTY2FsaW5nKTsKKwkJdm9pZCBURVhNM1gzVlNQRUMoUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkc3QsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJnMsIGludCBzdGFnZSwgQ29sb3I0aSAmc3JjMCk7CisJCXZvaWQgVEVYREVQVEgoUmVnaXN0ZXJzICZyKTsKKwkJdm9pZCBDTkQoQ29sb3I0aSAmZHN0LCBDb2xvcjRpICZzcmMwLCBDb2xvcjRpICZzcmMxLCBDb2xvcjRpICZzcmMyKTsKKwkJdm9pZCBDTVAoQ29sb3I0aSAmZHN0LCBDb2xvcjRpICZzcmMwLCBDb2xvcjRpICZzcmMxLCBDb2xvcjRpICZzcmMyKTsKKwkJdm9pZCBCRU0oUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkc3QsIENvbG9yNGkgJnNyYzAsIENvbG9yNGkgJnNyYzEsIGludCBzdGFnZSk7CisKKwkJLy8gcHNfMl94IGluc3RydWN0aW9ucworCQl2b2lkIE0zWDIoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIGNvbnN0IFNyYyAmc3JjMSk7CisJCXZvaWQgTTNYMyhSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgY29uc3QgU3JjICZzcmMxKTsKKwkJdm9pZCBNM1g0KFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBjb25zdCBTcmMgJnNyYzEpOworCQl2b2lkIE00WDMoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIGNvbnN0IFNyYyAmc3JjMSk7CisJCXZvaWQgTTRYNChSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgY29uc3QgU3JjICZzcmMxKTsKKwkJdm9pZCBURVhMRChSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgY29uc3QgU3JjICZzcmMxLCBib29sIHByb2plY3QsIGJvb2wgYmlhcyk7CisJCXZvaWQgVEVYTEREKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBjb25zdCBTcmMgJnNyYzEsIENvbG9yNGYgJnNyYzIsICBDb2xvcjRmICZzcmMzLCBib29sIHByb2plY3QsIGJvb2wgYmlhcyk7CisJCXZvaWQgVEVYTERMKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBjb25zdCBTcmMgJnNyYzEsIGJvb2wgcHJvamVjdCwgYm9vbCBiaWFzKTsKKwkJdm9pZCBURVhLSUxMKEludCBjTWFza1s0XSwgQ29sb3I0ZiAmc3JjLCB1bnNpZ25lZCBjaGFyIG1hc2spOworCQl2b2lkIERTWChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYyk7CisJCXZvaWQgRFNZKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjKTsKKwkJdm9pZCBCUkVBSyhSZWdpc3RlcnMgJnIpOworCQl2b2lkIEJSRUFLQyhSZWdpc3RlcnMgJnIsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEsIENvbnRyb2wpOworCQl2b2lkIEJSRUFLUChSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmcHJlZGljYXRlUmVnaXN0ZXIpOworCQl2b2lkIENBTEwoUmVnaXN0ZXJzICZyLCBpbnQgbGFiZWxJbmRleCk7CisJCXZvaWQgQ0FMTE5aKFJlZ2lzdGVycyAmciwgaW50IGxhYmVsSW5kZXgsIGNvbnN0IFNyYyAmc3JjKTsKKwkJdm9pZCBDQUxMTlpiKFJlZ2lzdGVycyAmciwgaW50IGxhYmVsSW5kZXgsIGNvbnN0IFNyYyAmYm9vbFJlZ2lzdGVyKTsKKwkJdm9pZCBDQUxMTlpwKFJlZ2lzdGVycyAmciwgaW50IGxhYmVsSW5kZXgsIGNvbnN0IFNyYyAmcHJlZGljYXRlUmVnaXN0ZXIpOworCQl2b2lkIEVMU0UoUmVnaXN0ZXJzICZyKTsKKwkJdm9pZCBFTkRJRihSZWdpc3RlcnMgJnIpOworCQl2b2lkIEVORExPT1AoUmVnaXN0ZXJzICZyKTsKKwkJdm9pZCBFTkRSRVAoUmVnaXN0ZXJzICZyKTsKKwkJdm9pZCBJRihSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmc3JjKTsKKwkJdm9pZCBJRmIoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJmJvb2xSZWdpc3Rlcik7CisJCXZvaWQgSUZwKFJlZ2lzdGVycyAmciwgY29uc3QgU3JjICZwcmVkaWNhdGVSZWdpc3Rlcik7CisJCXZvaWQgSUZDKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSwgQ29udHJvbCk7CisJCXZvaWQgTEFCRUwoaW50IGxhYmVsSW5kZXgpOworCQl2b2lkIExPT1AoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJmludGVnZXJSZWdpc3Rlcik7CisJCXZvaWQgUkVQKFJlZ2lzdGVycyAmciwgY29uc3QgU3JjICZpbnRlZ2VyUmVnaXN0ZXIpOworCQl2b2lkIFJFVChSZWdpc3RlcnMgJnIpOworCisJCXZvaWQgcmVhZENvbnN0YW50KFJlZ2lzdGVycyAmciwgaW50IGluZGV4KTsKKworCQl2b2lkIHdyaXRlRGVzdGluYXRpb24oUmVnaXN0ZXJzICZyLCBDb2xvcjRpICZkLCBjb25zdCBEc3QgJmRzdCk7CisJCUNvbG9yNGkgcmVnaShSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmc3JjKTsKKwkJQ29sb3I0ZiByZWcoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJnNyYywgaW50IG9mZnNldCA9IDApOworCisJCWJvb2wgY29sb3JVc2VkKCk7CisJCXVuc2lnbmVkIHNob3J0IHBpeGVsU2hhZGVyVmVyc2lvbigpIGNvbnN0OworCisJcHJpdmF0ZToKKwkJU2FtcGxlckNvcmUgKnNhbXBsZXJbMTZdOworCisJCWJvb2wgcGVydHVyYmF0ZTsKKwkJYm9vbCBsdW1pbmFuY2U7CisJCWJvb2wgcHJldmlvdXNTY2FsaW5nOworCisJCWJvb2wgcmV0dXJuczsKKwkJaW50IGlmRGVwdGg7CisJCWludCBsb29wUmVwRGVwdGg7CisJCWludCBicmVha0RlcHRoOworCisJCS8vIEZJWE1FOiBHZXQgcmlkIG9mIGxsdm06OgorCQlsbHZtOjpCYXNpY0Jsb2NrICppZkZhbHNlQmxvY2tbMjQgKyAyNF07CisJCWxsdm06OkJhc2ljQmxvY2sgKmxvb3BSZXBUZXN0QmxvY2tbNF07CisJCWxsdm06OkJhc2ljQmxvY2sgKmxvb3BSZXBFbmRCbG9ja1s0XTsKKwkJbGx2bTo6QmFzaWNCbG9jayAqbGFiZWxCbG9ja1syMDQ4XTsKKwkJc3RkOjp2ZWN0b3I8bGx2bTo6QmFzaWNCbG9jayo+IGNhbGxSZXRCbG9jazsKKwkJbGx2bTo6QmFzaWNCbG9jayAqcmV0dXJuQmxvY2s7CisJCWJvb2wgaXNDb25kaXRpb25hbElmWzI0ICsgMjRdOworCisJCWNvbnN0IFBpeGVsU2hhZGVyICpjb25zdCBwaXhlbFNoYWRlcjsKKwl9OworfQorCisjZW5kaWYgICAvLyBzd19QaXhlbFJvdXRpbmVfaHBwCmRpZmYgLS1naXQgYS9zcmMvU2hhZGVyL1BpeGVsU2hhZGVyLmNwcCBiL3NyYy9TaGFkZXIvUGl4ZWxTaGFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjA3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU2hhZGVyL1BpeGVsU2hhZGVyLmNwcApAQCAtMCwwICsxLDcyOCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiUGl4ZWxTaGFkZXIuaHBwIgorCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwlQaXhlbFNoYWRlcjo6UGl4ZWxTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqdG9rZW4pIDogU2hhZGVyKHRva2VuKQorCXsKKwkJcGFyc2UodG9rZW4pOworCX0KKworCVBpeGVsU2hhZGVyOjp+UGl4ZWxTaGFkZXIoKQorCXsKKwl9CisKKwl2b2lkIFBpeGVsU2hhZGVyOjpwYXJzZShjb25zdCB1bnNpZ25lZCBsb25nICp0b2tlbikKKwl7CisJCW1pbm9yVmVyc2lvbiA9ICh1bnNpZ25lZCBjaGFyKSh0b2tlblswXSAmIDB4MDAwMDAwRkYpOworCQltYWpvclZlcnNpb24gPSAodW5zaWduZWQgY2hhcikoKHRva2VuWzBdICYgMHgwMDAwRkYwMCkgPj4gOCk7CisJCXNoYWRlclR5cGUgPSAoU2hhZGVyVHlwZSkoKHRva2VuWzBdICYgMHhGRkZGMDAwMCkgPj4gMTYpOworCisJCWxlbmd0aCA9IHZhbGlkYXRlKHRva2VuKTsKKwkJQVNTRVJUKGxlbmd0aCAhPSAwKTsKKworCQlpbnN0cnVjdGlvbiA9IG5ldyBTaGFkZXI6Okluc3RydWN0aW9uKltsZW5ndGhdOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJeworCQkJd2hpbGUoKCp0b2tlbiAmIDB4MDAwMEZGRkYpID09IDB4MDAwMEZGRkUpICAgLy8gQ29tbWVudCB0b2tlbgorCQkJeworCQkJCWludCBsZW5ndGggPSAoKnRva2VuICYgMHg3RkZGMDAwMCkgPj4gMTY7CisKKwkJCQl0b2tlbiArPSBsZW5ndGggKyAxOworCQkJfQorCisJCQlpbnQgbGVuZ3RoID0gc2l6ZSgqdG9rZW4pOworCisJCQlpbnN0cnVjdGlvbltpXSA9IG5ldyBJbnN0cnVjdGlvbih0b2tlbiwgbGVuZ3RoLCBtYWpvclZlcnNpb24pOworCisJCQl0b2tlbiArPSBsZW5ndGggKyAxOworCQl9CisKKwkJYW5hbHl6ZVpPdmVycmlkZSgpOworCQlhbmFseXplVGV4a2lsbCgpOworCQlhbmFseXplSW50ZXJwb2xhbnRzKCk7CisJCWFuYWx5emVEaXJ0eUNvbnN0YW50cygpOworCQlhbmFseXplRHluYW1pY0JyYW5jaGluZygpOworCQlhbmFseXplU2FtcGxlcnMoKTsKKwl9CisKKwlpbnQgUGl4ZWxTaGFkZXI6OnZhbGlkYXRlKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmNvbnN0IHRva2VuKQorCXsKKwkJaWYoIXRva2VuKQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXVuc2lnbmVkIHNob3J0IHZlcnNpb24gPSAodW5zaWduZWQgc2hvcnQpKHRva2VuWzBdICYgMHgwMDAwRkZGRik7CisJCXVuc2lnbmVkIGNoYXIgbWlub3JWZXJzaW9uID0gKHVuc2lnbmVkIGNoYXIpKHRva2VuWzBdICYgMHgwMDAwMDBGRik7CisJCXVuc2lnbmVkIGNoYXIgbWFqb3JWZXJzaW9uID0gKHVuc2lnbmVkIGNoYXIpKCh0b2tlblswXSAmIDB4MDAwMEZGMDApID4+IDgpOworCQlTaGFkZXJUeXBlIHNoYWRlclR5cGUgPSAoU2hhZGVyVHlwZSkoKHRva2VuWzBdICYgMHhGRkZGMDAwMCkgPj4gMTYpOworCisJCWlmKHNoYWRlclR5cGUgIT0gU0hBREVSX1BJWEVMIHx8IG1ham9yVmVyc2lvbiA+IDMpCisJCXsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaW50IGluc3RydWN0aW9uQ291bnQgPSAxOworCisJCWZvcihpbnQgaSA9IDA7IHRva2VuW2ldICE9IDB4MDAwMEZGRkY7IGkrKykKKwkJeworCQkJaWYoKHRva2VuW2ldICYgMHgwMDAwRkZGRikgPT0gMHgwMDAwRkZGRSkgICAvLyBDb21tZW50IHRva2VuCisJCQl7CisJCQkJaW50IGxlbmd0aCA9ICh0b2tlbltpXSAmIDB4N0ZGRjAwMDApID4+IDE2OworCisJCQkJaSArPSBsZW5ndGg7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJU2hhZGVyT3Bjb2RlIG9wY29kZSA9IChTaGFkZXJPcGNvZGUpKHRva2VuW2ldICYgMHgwMDAwRkZGRik7CisKKwkJCQlzd2l0Y2gob3Bjb2RlKQorCQkJCXsKKwkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1JFU0VSVkVEMDoKKwkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX01PVkE6CisJCQkJCXJldHVybiAwOyAgIC8vIFVuc3VwcG9ydGVkIG9wZXJhdGlvbgorCQkJCWRlZmF1bHQ6CisJCQkJCWluc3RydWN0aW9uQ291bnQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaSArPSBzaXplKHRva2VuW2ldLCB2ZXJzaW9uKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBpbnN0cnVjdGlvbkNvdW50OworCX0KKworCWJvb2wgUGl4ZWxTaGFkZXI6OmRlcHRoT3ZlcnJpZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuIHpPdmVycmlkZTsKKwl9CisKKwlib29sIFBpeGVsU2hhZGVyOjpjb250YWluc1RleGtpbGwoKSBjb25zdAorCXsKKwkJcmV0dXJuIHRleGtpbGw7CisJfQorCisJYm9vbCBQaXhlbFNoYWRlcjo6Y29udGFpbnNDZW50cm9pZCgpIGNvbnN0CisJeworCQlyZXR1cm4gY2VudHJvaWQ7CisJfQorCisJYm9vbCBQaXhlbFNoYWRlcjo6dXNlc0RpZmZ1c2UoaW50IGNvbXBvbmVudCkgY29uc3QKKwl7CisJCXJldHVybiBzZW1hbnRpY1swXVtjb21wb25lbnRdLmFjdGl2ZSgpOworCX0KKworCWJvb2wgUGl4ZWxTaGFkZXI6OnVzZXNTcGVjdWxhcihpbnQgY29tcG9uZW50KSBjb25zdAorCXsKKwkJcmV0dXJuIHNlbWFudGljWzFdW2NvbXBvbmVudF0uYWN0aXZlKCk7CisJfQorCisJYm9vbCBQaXhlbFNoYWRlcjo6dXNlc1RleHR1cmUoaW50IGNvb3JkaW5hdGUsIGludCBjb21wb25lbnQpIGNvbnN0CisJeworCQlyZXR1cm4gc2VtYW50aWNbMiArIGNvb3JkaW5hdGVdW2NvbXBvbmVudF0uYWN0aXZlKCk7CisJfQorCisJdm9pZCBQaXhlbFNoYWRlcjo6YW5hbHl6ZVpPdmVycmlkZSgpCisJeworCQl6T3ZlcnJpZGUgPSBmYWxzZTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmKGluc3RydWN0aW9uW2ldLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYTTNYMkRFUFRIIHx8CisJCQkgICBpbnN0cnVjdGlvbltpXS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWERFUFRIIHx8CisJCQkgICBpbnN0cnVjdGlvbltpXS0+Z2V0RGVzdGluYXRpb25QYXJhbWV0ZXIoKS50eXBlID09IEluc3RydWN0aW9uOjpEZXN0aW5hdGlvblBhcmFtZXRlcjo6UEFSQU1FVEVSX0RFUFRIT1VUKQorCQkJeworCQkJCXpPdmVycmlkZSA9IHRydWU7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgUGl4ZWxTaGFkZXI6OmFuYWx5emVUZXhraWxsKCkKKwl7CisJCXRleGtpbGwgPSBmYWxzZTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmKGluc3RydWN0aW9uW2ldLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYS0lMTCkKKwkJCXsKKwkJCQl0ZXhraWxsID0gdHJ1ZTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJdm9pZCBQaXhlbFNoYWRlcjo6YW5hbHl6ZUludGVycG9sYW50cygpCisJeworCQl2UG9zRGVjbGFyZWQgPSBmYWxzZTsKKwkJdkZhY2VEZWNsYXJlZCA9IGZhbHNlOworCQljZW50cm9pZCA9IGZhbHNlOworCisJCWlmKHZlcnNpb24gPCAweDAzMDApCisJCXsKKwkJCS8vIFNldCBkZWZhdWx0IG1hcHBpbmc7IGRpc2FibGUgdW51c2VkIGludGVycG9sYW50cyBiZWxvdworCQkJc2VtYW50aWNbMF1bMF0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX0NPTE9SLCAwKTsKKwkJCXNlbWFudGljWzBdWzFdID0gU2VtYW50aWMoU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9DT0xPUiwgMCk7CisJCQlzZW1hbnRpY1swXVsyXSA9IFNlbWFudGljKFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfQ09MT1IsIDApOworCQkJc2VtYW50aWNbMF1bM10gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX0NPTE9SLCAwKTsKKworCQkJc2VtYW50aWNbMV1bMF0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX0NPTE9SLCAxKTsKKwkJCXNlbWFudGljWzFdWzFdID0gU2VtYW50aWMoU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9DT0xPUiwgMSk7CisJCQlzZW1hbnRpY1sxXVsyXSA9IFNlbWFudGljKFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfQ09MT1IsIDEpOworCQkJc2VtYW50aWNbMV1bM10gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX0NPTE9SLCAxKTsKKworCQkJZm9yKGludCBpID0gMDsgaSA8IDg7IGkrKykKKwkJCXsKKwkJCQlzZW1hbnRpY1syICsgaV1bMF0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX1RFWENPT1JELCBpKTsKKwkJCQlzZW1hbnRpY1syICsgaV1bMV0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX1RFWENPT1JELCBpKTsKKwkJCQlzZW1hbnRpY1syICsgaV1bMl0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX1RFWENPT1JELCBpKTsKKwkJCQlzZW1hbnRpY1syICsgaV1bM10gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX1RFWENPT1JELCBpKTsKKwkJCX0KKworCQkJSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6U2FtcGxlclR5cGUgc2FtcGxlclR5cGVbMTZdOworCisJCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCXsKKwkJCQlzYW1wbGVyVHlwZVtpXSA9IEluc3RydWN0aW9uOjpPcGVyYXRpb246OlNBTVBMRVJfVU5LTk9XTjsKKwkJCX0KKworCQkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmKGluc3RydWN0aW9uW2ldLT5nZXREZXN0aW5hdGlvblBhcmFtZXRlcigpLnR5cGUgPT0gSW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlcjo6UEFSQU1FVEVSX1NBTVBMRVIpCisJCQkJeworCQkJCQlpbnQgc2FtcGxlciA9IGluc3RydWN0aW9uW2ldLT5nZXREZXN0aW5hdGlvblBhcmFtZXRlcigpLmluZGV4OworCisJCQkJCXNhbXBsZXJUeXBlW3NhbXBsZXJdID0gaW5zdHJ1Y3Rpb25baV0tPmdldFNhbXBsZXJUeXBlKCk7CisJCQkJfQorCQkJfQorCisJCQlib29sIGludGVycG9sYW50WzEwXVs0XSA9IHtmYWxzZX07ICAgLy8gSW50ZXJwb2xhbnRzIGluIHVzZQorCisJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYoaW5zdHJ1Y3Rpb25baV0tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkudHlwZSA9PSBJbnN0cnVjdGlvbjo6U291cmNlUGFyYW1ldGVyOjpQQVJBTUVURVJfVEVYVFVSRSkKKwkJCQl7CQorCQkJCQlpbnQgaW5kZXggPSBpbnN0cnVjdGlvbltpXS0+Z2V0RGVzdGluYXRpb25QYXJhbWV0ZXIoKS5pbmRleCArIDI7CisJCQkJCWludCBtYXNrID0gaW5zdHJ1Y3Rpb25baV0tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkubWFzazsKKworCQkJCQlzd2l0Y2goaW5zdHJ1Y3Rpb25baV0tPmdldE9wY29kZSgpKQorCQkJCQl7CisJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWDoKKwkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYQkVNOgorCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVhCRU1MOgorCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVhDT09SRDoKKwkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYRFAzOgorCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVhEUDNURVg6CisJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDJERVBUSDoKKwkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYTTNYMlBBRDoKKwkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYTTNYMlRFWDoKKwkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYTTNYMzoKKwkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYTTNYM1BBRDoKKwkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYTTNYM1RFWDoKKwkJCQkJCWludGVycG9sYW50W2luZGV4XVswXSA9IHRydWU7CisJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMV0gPSB0cnVlOworCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVhLSUxMOgorCQkJCQkJaWYobWFqb3JWZXJzaW9uIDwgMikKKwkJCQkJCXsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMF0gPSB0cnVlOworCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSA9IHRydWU7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMF0gPSB0cnVlOworCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSA9IHRydWU7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdID0gdHJ1ZTsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bM10gPSB0cnVlOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDNWU1BFQzoKKwkJCQkJCWludGVycG9sYW50W2luZGV4XVswXSA9IHRydWU7CisJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMV0gPSB0cnVlOworCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdID0gdHJ1ZTsKKwkJCQkJCWludGVycG9sYW50W2luZGV4IC0gMl1bM10gPSB0cnVlOworCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggLSAxXVszXSA9IHRydWU7CisJCQkJCQlpbnRlcnBvbGFudFtpbmRleCAtIDBdWzNdID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9EQ0w6CisJCQkJCQlicmVhazsgICAvLyBJZ25vcmUKKwkJCQkJZGVmYXVsdDogICAvLyBBcml0aG1ldGljIGluc3RydWN0aW9uCisJCQkJCQlpZih2ZXJzaW9uID49IDB4MDEwNCkKKwkJCQkJCXsKKwkJCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJZm9yKGludCBhcmd1bWVudCA9IDA7IGFyZ3VtZW50IDwgNDsgYXJndW1lbnQrKykKKwkJCQl7CisJCQkJCWlmKGluc3RydWN0aW9uW2ldLT5nZXRTb3VyY2VQYXJhbWV0ZXIoYXJndW1lbnQpLnR5cGUgPT0gSW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlcjo6UEFSQU1FVEVSX0lOUFVUIHx8CisJCQkJCSAgIGluc3RydWN0aW9uW2ldLT5nZXRTb3VyY2VQYXJhbWV0ZXIoYXJndW1lbnQpLnR5cGUgPT0gSW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlcjo6UEFSQU1FVEVSX1RFWFRVUkUpCisJCQkJCXsKKwkJCQkJCWludCBpbmRleCA9IGluc3RydWN0aW9uW2ldLT5nZXRTb3VyY2VQYXJhbWV0ZXIoYXJndW1lbnQpLmluZGV4OworCQkJCQkJaW50IHN3aXp6bGUgPSBpbnN0cnVjdGlvbltpXS0+Z2V0U291cmNlUGFyYW1ldGVyKGFyZ3VtZW50KS5zd2l6emxlOworCQkJCQkJaW50IG1hc2sgPSBpbnN0cnVjdGlvbltpXS0+Z2V0RGVzdGluYXRpb25QYXJhbWV0ZXIoKS5tYXNrOworCQkJCQkJCisJCQkJCQlpZihpbnN0cnVjdGlvbltpXS0+Z2V0U291cmNlUGFyYW1ldGVyKGFyZ3VtZW50KS50eXBlID09IEluc3RydWN0aW9uOjpTb3VyY2VQYXJhbWV0ZXI6OlBBUkFNRVRFUl9URVhUVVJFKQorCQkJCQkJeworCQkJCQkJCWluZGV4ICs9IDI7CisJCQkJCQl9CisKKwkJCQkJCXN3aXRjaChpbnN0cnVjdGlvbltpXS0+Z2V0T3Bjb2RlKCkpCisJCQkJCQl7CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVg6CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVhMREQ6CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVhMREw6CisJCQkJCQkJeworCQkJCQkJCQlpbnQgc2FtcGxlciA9IGluc3RydWN0aW9uW2ldLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMSkuaW5kZXg7CisKKwkJCQkJCQkJc3dpdGNoKHNhbXBsZXJUeXBlW3NhbXBsZXJdKQorCQkJCQkJCQl7CisJCQkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6U0FNUExFUl9VTktOT1dOOgorCQkJCQkJCQkJaWYodmVyc2lvbiA9PSAweDAxMDQpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJaWYoKGluc3RydWN0aW9uW2ldLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMCkuc3dpenpsZSAmIDB4MzApID09IDB4MjApICAgLy8gLnh5egorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdID0gdHJ1ZTsKKwkJCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzFdID0gdHJ1ZTsKKwkJCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdID0gdHJ1ZTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJZWxzZSAgIC8vIC54eXcKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVswXSA9IHRydWU7CisJCQkJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSA9IHRydWU7CisJCQkJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVszXSA9IHRydWU7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpTQU1QTEVSXzFEOgorCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdID0gdHJ1ZTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246OlNBTVBMRVJfMkQ6CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMF0gPSB0cnVlOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzFdID0gdHJ1ZTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246OlNBTVBMRVJfQ1VCRToKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVswXSA9IHRydWU7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMV0gPSB0cnVlOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdID0gdHJ1ZTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246OlNBTVBMRVJfVk9MVU1FOgorCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdID0gdHJ1ZTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSA9IHRydWU7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMl0gPSB0cnVlOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCQkJCQl9CisKKwkJCQkJCQkJaWYoaW5zdHJ1Y3Rpb25baV0tPmlzQmlhcygpKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bM10gPSB0cnVlOworCQkJCQkJCQl9CisKKwkJCQkJCQkJaWYoaW5zdHJ1Y3Rpb25baV0tPmlzUHJvamVjdCgpKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bM10gPSB0cnVlOworCQkJCQkJCQl9CisKKwkJCQkJCQkJaWYodmVyc2lvbiA9PSAweDAxMDQgJiYgaW5zdHJ1Y3Rpb25baV0tPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVgpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWlmKGluc3RydWN0aW9uW2ldLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMCkubW9kaWZpZXIgPT0gSW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlcjo6TU9ESUZJRVJfRFopCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdID0gdHJ1ZTsKKwkJCQkJCQkJCX0KKworCQkJCQkJCQkJaWYoaW5zdHJ1Y3Rpb25baV0tPmdldFNvdXJjZVBhcmFtZXRlcigwKS5tb2RpZmllciA9PSBJbnN0cnVjdGlvbjo6U291cmNlUGFyYW1ldGVyOjpNT0RJRklFUl9EVykKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bM10gPSB0cnVlOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfTTNYMjoKKwkJCQkJCQlpZihtYXNrICYgMHgxKQorCQkJCQkJCXsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAwLCAweDcpOworCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMV0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDEsIDB4Nyk7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsyXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMiwgMHg3KTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAzLCAweDcpOworCQkJCQkJCX0KKworCQkJCQkJCWlmKGFyZ3VtZW50ID09IDEpCisJCQkJCQkJeworCQkJCQkJCQlpZihtYXNrICYgMHgyKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDFdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAwLCAweDcpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAxXVsxXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMSwgMHg3KTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMV1bMl0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDIsIDB4Nyk7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDFdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAzLCAweDcpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfTTNYMzoKKwkJCQkJCQlpZihtYXNrICYgMHgxKQorCQkJCQkJCXsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAwLCAweDcpOworCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMV0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDEsIDB4Nyk7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsyXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMiwgMHg3KTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAzLCAweDcpOworCQkJCQkJCX0KKworCQkJCQkJCWlmKGFyZ3VtZW50ID09IDEpCisJCQkJCQkJeworCQkJCQkJCQlpZihtYXNrICYgMHgyKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDFdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAwLCAweDcpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAxXVsxXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMSwgMHg3KTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMV1bMl0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDIsIDB4Nyk7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDFdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAzLCAweDcpOworCQkJCQkJCQl9CisKKwkJCQkJCQkJaWYobWFzayAmIDB4NCkKKwkJCQkJCQkJeworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAyXVswXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMCwgMHg3KTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMl1bMV0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDEsIDB4Nyk7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDJdWzJdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAyLCAweDcpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAyXVszXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMywgMHg3KTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX00zWDQ6CisJCQkJCQkJaWYobWFzayAmIDB4MSkKKwkJCQkJCQl7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVswXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMCwgMHg3KTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzFdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAxLCAweDcpOworCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMl0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDIsIDB4Nyk7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVszXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMywgMHg3KTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZihhcmd1bWVudCA9PSAxKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYobWFzayAmIDB4MikKKwkJCQkJCQkJeworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAxXVswXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMCwgMHg3KTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMV1bMV0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDEsIDB4Nyk7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDFdWzJdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAyLCAweDcpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAxXVszXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMywgMHg3KTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWlmKG1hc2sgJiAweDQpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMl1bMF0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDAsIDB4Nyk7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDJdWzFdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAxLCAweDcpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAyXVsyXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMiwgMHg3KTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMl1bM10gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDMsIDB4Nyk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlpZihtYXNrICYgMHg4KQorCQkJCQkJCQl7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDNdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAwLCAweDcpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAzXVsxXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMSwgMHg3KTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgM11bMl0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDIsIDB4Nyk7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDNdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAzLCAweDcpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfTTRYMzoKKwkJCQkJCQlpZihtYXNrICYgMHgxKQorCQkJCQkJCXsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAwKTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzFdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAxKTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAyKTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAzKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZihhcmd1bWVudCA9PSAxKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYobWFzayAmIDB4MikKKwkJCQkJCQkJeworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAxXVswXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMCk7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDFdWzFdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAxKTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMV1bMl0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50KHN3aXp6bGUsIDIpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAxXVszXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMyk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlpZihtYXNrICYgMHg0KQorCQkJCQkJCQl7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDJdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAwKTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMl1bMV0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50KHN3aXp6bGUsIDEpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAyXVsyXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMik7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDJdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAzKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX000WDQ6CisJCQkJCQkJaWYobWFzayAmIDB4MSkKKwkJCQkJCQl7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVswXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMCk7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMSk7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsyXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMik7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVszXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMyk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYoYXJndW1lbnQgPT0gMSkKKwkJCQkJCQl7CisJCQkJCQkJCWlmKG1hc2sgJiAweDIpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMV1bMF0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50KHN3aXp6bGUsIDApOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAxXVsxXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMSk7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDFdWzJdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAyKTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMV1bM10gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50KHN3aXp6bGUsIDMpOworCQkJCQkJCQl9CisKKwkJCQkJCQkJaWYobWFzayAmIDB4NCkKKwkJCQkJCQkJeworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAyXVswXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMCk7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDJdWzFdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAxKTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgMl1bMl0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50KHN3aXp6bGUsIDIpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAyXVszXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMyk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlpZihtYXNrICYgMHg4KQorCQkJCQkJCQl7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDNdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAwKTsKKwkJCQkJCQkJCWludGVycG9sYW50W2luZGV4ICsgM11bMV0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50KHN3aXp6bGUsIDEpOworCQkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXggKyAzXVsyXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMik7CisJCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleCArIDNdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAzKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX0NSUzoKKwkJCQkJCQlpZihtYXNrICYgMHgxKQorCQkJCQkJCXsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAwLCAweDYpOworCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMV0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDEsIDB4Nik7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsyXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMiwgMHg2KTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAzLCAweDYpOworCQkJCQkJCX0KKworCQkJCQkJCWlmKG1hc2sgJiAweDIpCisJCQkJCQkJeworCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMF0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDAsIDB4NSk7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMSwgMHg1KTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAyLCAweDUpOworCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bM10gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDMsIDB4NSk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYobWFzayAmIDB4NCkKKwkJCQkJCQl7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVswXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMCwgMHgzKTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzFdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAxLCAweDMpOworCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMl0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDIsIDB4Myk7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVszXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMywgMHgzKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9EUDJBREQ6CisJCQkJCQkJaWYoYXJndW1lbnQgPT0gMCB8fCBhcmd1bWVudCA9PSAxKQorCQkJCQkJCXsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAwLCAweDMpOworCQkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMV0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDEsIDB4Myk7CisJCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsyXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMiwgMHgzKTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAzLCAweDMpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlICAgLy8gYXJndW1lbnQgPT0gMgorCQkJCQkJCXsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAwKTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzFdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAxKTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAyKTsKKwkJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAzKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9EUDM6CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAwLCAweDcpOworCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMSwgMHg3KTsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMl0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDIsIDB4Nyk7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAzLCAweDcpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfRFA0OgorCQkJCQkJCWludGVycG9sYW50W2luZGV4XVswXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMCk7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzFdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAxKTsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMl0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50KHN3aXp6bGUsIDIpOworCQkJCQkJCWludGVycG9sYW50W2luZGV4XVszXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9TSU5DT1M6CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9FWFA6CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9MT0c6CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9QT1c6CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9SQ1A6CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9SU1E6CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAwKTsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMV0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50KHN3aXp6bGUsIDEpOworCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsyXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoc3dpenpsZSwgMik7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzNdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudChzd2l6emxlLCAzKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX05STToKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMF0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDAsIDB4NyB8IG1hc2spOworCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMSwgMHg3IHwgbWFzayk7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAyLCAweDcgfCBtYXNrKTsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bM10gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDMsIDB4NyB8IG1hc2spOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfTU9WOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfQUREOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfU1VCOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfTVVMOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfTUFEOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfQUJTOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfQ01QOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfQ05EOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfRlJDOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfTFJQOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfTUFYOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfTUlOOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfU0VUUDoKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX0JSRUFLQzoKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX0RTWDoKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX0RTWToKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMF0gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDAsIG1hc2spOworCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSB8PSBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoc3dpenpsZSwgMSwgbWFzayk7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdIHw9IHN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChzd2l6emxlLCAyLCBtYXNrKTsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bM10gfD0gc3dpenpsZUNvbnRhaW5zQ29tcG9uZW50TWFza2VkKHN3aXp6bGUsIDMsIG1hc2spOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYQ09PUkQ6CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzBdID0gdHJ1ZTsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMV0gPSB0cnVlOworCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsyXSA9IHRydWU7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzNdID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWERQMzoKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWERQM1RFWDoKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDJQQUQ6CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVhNM1gzUEFEOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYTTNYMlRFWDoKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDNTUEVDOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYTTNYM1ZTUEVDOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYQkVNOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYQkVNTDoKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDJERVBUSDoKKwkJCQkJCWNhc2UgSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDM6CisJCQkJCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9URVhNM1gzVEVYOgorCQkJCQkJCWludGVycG9sYW50W2luZGV4XVswXSA9IHRydWU7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzFdID0gdHJ1ZTsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMl0gPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYUkVHMkFSOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYUkVHMkdCOgorCQkJCQkJY2FzZSBJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPUENPREVfVEVYUkVHMlJHQjoKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkvLwlBU1NFUlQoZmFsc2UpOyAgIC8vIFJlZmluZSBjb21wb25lbnQgdXNhZ2UKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bMF0gPSB0cnVlOworCQkJCQkJCWludGVycG9sYW50W2luZGV4XVsxXSA9IHRydWU7CisJCQkJCQkJaW50ZXJwb2xhbnRbaW5kZXhdWzJdID0gdHJ1ZTsKKwkJCQkJCQlpbnRlcnBvbGFudFtpbmRleF1bM10gPSB0cnVlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCAxMDsgaW5kZXgrKykKKwkJCXsKKwkJCQlmb3IoaW50IGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDQ7IGNvbXBvbmVudCsrKQorCQkJCXsKKwkJCQkJaWYoIWludGVycG9sYW50W2luZGV4XVtjb21wb25lbnRdKQorCQkJCQl7CisJCQkJCQlzZW1hbnRpY1tpbmRleF1bY29tcG9uZW50XSA9IFNlbWFudGljKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSAgIC8vIFNoYWRlciBNb2RlbCAzLjAgaW5wdXQgZGVjbGFyYXRpb247IHYjIGluZGV4YWJsZQorCQl7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYoaW5zdHJ1Y3Rpb25baV0tPmdldE9wY29kZSgpID09IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX0RDTCkKKwkJCQl7CisJCQkJCWlmKGluc3RydWN0aW9uW2ldLT5nZXREZXN0aW5hdGlvblBhcmFtZXRlcigpLnR5cGUgPT0gU2hhZGVyUGFyYW1ldGVyOjpQQVJBTUVURVJfSU5QVVQpCisJCQkJCXsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgdXNhZ2UgPSBpbnN0cnVjdGlvbltpXS0+Z2V0VXNhZ2UoKTsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgaW5kZXggPSBpbnN0cnVjdGlvbltpXS0+Z2V0VXNhZ2VJbmRleCgpOworCQkJCQkJdW5zaWduZWQgY2hhciBtYXNrID0gaW5zdHJ1Y3Rpb25baV0tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkubWFzazsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgcmVnID0gaW5zdHJ1Y3Rpb25baV0tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkuaW5kZXg7CisKKwkJCQkJCWlmKG1hc2sgJiAweDAxKQorCQkJCQkJeworCQkJCQkJCXNlbWFudGljW3JlZ11bMF0gPSBTZW1hbnRpYyh1c2FnZSwgaW5kZXgpOworCQkJCQkJfQorCisJCQkJCQlpZihtYXNrICYgMHgwMikKKwkJCQkJCXsKKwkJCQkJCQlzZW1hbnRpY1tyZWddWzFdID0gU2VtYW50aWModXNhZ2UsIGluZGV4KTsKKwkJCQkJCX0KKworCQkJCQkJaWYobWFzayAmIDB4MDQpCisJCQkJCQl7CisJCQkJCQkJc2VtYW50aWNbcmVnXVsyXSA9IFNlbWFudGljKHVzYWdlLCBpbmRleCk7CisJCQkJCQl9CisKKwkJCQkJCWlmKG1hc2sgJiAweDA4KQorCQkJCQkJeworCQkJCQkJCXNlbWFudGljW3JlZ11bM10gPSBTZW1hbnRpYyh1c2FnZSwgaW5kZXgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgaWYoaW5zdHJ1Y3Rpb25baV0tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkudHlwZSA9PSBTaGFkZXJQYXJhbWV0ZXI6OlBBUkFNRVRFUl9NSVNDVFlQRSkKKwkJCQkJeworCQkJCQkJdW5zaWduZWQgY2hhciBpbmRleCA9IGluc3RydWN0aW9uW2ldLT5nZXREZXN0aW5hdGlvblBhcmFtZXRlcigpLmluZGV4OworCisJCQkJCQlpZihpbmRleCA9PSAwKQorCQkJCQkJeworCQkJCQkJCXZQb3NEZWNsYXJlZCA9IHRydWU7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKGluZGV4ID09IDEpCisJCQkJCQl7CisJCQkJCQkJdkZhY2VEZWNsYXJlZCA9IHRydWU7CisJCQkJCQl9CisJCQkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZih2ZXJzaW9uID49IDB4MDIwMCkKKwkJeworCQkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmKGluc3RydWN0aW9uW2ldLT5nZXRPcGNvZGUoKSA9PSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9EQ0wpCisJCQkJeworCQkJCQlib29sIGNlbnRyb2lkID0gaW5zdHJ1Y3Rpb25baV0tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkuY2VudHJvaWQ7CisJCQkJCXVuc2lnbmVkIGNoYXIgcmVnID0gaW5zdHJ1Y3Rpb25baV0tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkuaW5kZXg7CisKKwkJCQkJc3dpdGNoKGluc3RydWN0aW9uW2ldLT5nZXREZXN0aW5hdGlvblBhcmFtZXRlcigpLnR5cGUpCisJCQkJCXsKKwkJCQkJY2FzZSBTaGFkZXJQYXJhbWV0ZXI6OlBBUkFNRVRFUl9JTlBVVDoKKwkJCQkJCXNlbWFudGljW3JlZ11bMF0uY2VudHJvaWQgPSBjZW50cm9pZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNoYWRlclBhcmFtZXRlcjo6UEFSQU1FVEVSX1RFWFRVUkU6CisJCQkJCQlzZW1hbnRpY1syICsgcmVnXVswXS5jZW50cm9pZCA9IGNlbnRyb2lkOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQl0aGlzLT5jZW50cm9pZCA9IHRoaXMtPmNlbnRyb2lkIHx8IGNlbnRyb2lkOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9TaGFkZXIvUGl4ZWxTaGFkZXIuaHBwIGIvc3JjL1NoYWRlci9QaXhlbFNoYWRlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmOWI5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvUGl4ZWxTaGFkZXIuaHBwCkBAIC0wLDAgKzEsNTQgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBzd19QaXhlbFNoYWRlcl9ocHAKKyNkZWZpbmUgc3dfUGl4ZWxTaGFkZXJfaHBwCisKKyNpbmNsdWRlICJTaGFkZXIuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwljbGFzcyBQaXhlbFNoYWRlciA6IHB1YmxpYyBTaGFkZXIKKwl7CisJcHVibGljOgorCQlQaXhlbFNoYWRlcihjb25zdCB1bnNpZ25lZCBsb25nICp0b2tlbik7CisKKwkJdmlydHVhbCB+UGl4ZWxTaGFkZXIoKTsKKworCQlzdGF0aWMgaW50IHZhbGlkYXRlKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmNvbnN0IHRva2VuKTsgICAvLyBSZXR1cm5zIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaWYgdmFsaWQKKwkJYm9vbCBkZXB0aE92ZXJyaWRlKCkgY29uc3Q7CisJCWJvb2wgY29udGFpbnNUZXhraWxsKCkgY29uc3Q7CisJCWJvb2wgY29udGFpbnNDZW50cm9pZCgpIGNvbnN0OworCQlib29sIHVzZXNEaWZmdXNlKGludCBjb21wb25lbnQpIGNvbnN0OworCQlib29sIHVzZXNTcGVjdWxhcihpbnQgY29tcG9uZW50KSBjb25zdDsKKwkJYm9vbCB1c2VzVGV4dHVyZShpbnQgY29vcmRpbmF0ZSwgaW50IGNvbXBvbmVudCkgY29uc3Q7CisKKwkJU2VtYW50aWMgc2VtYW50aWNbMTBdWzRdOyAgIC8vIEZJWE1FOiBQcml2YXRlCisKKwkJYm9vbCB2UG9zRGVjbGFyZWQ7CisJCWJvb2wgdkZhY2VEZWNsYXJlZDsKKworCXByaXZhdGU6CisJCXZvaWQgcGFyc2UoY29uc3QgdW5zaWduZWQgbG9uZyAqdG9rZW4pOworCisJCXZvaWQgYW5hbHl6ZVpPdmVycmlkZSgpOworCQl2b2lkIGFuYWx5emVUZXhraWxsKCk7CisJCXZvaWQgYW5hbHl6ZUludGVycG9sYW50cygpOworCisJCWJvb2wgek92ZXJyaWRlOworCQlib29sIHRleGtpbGw7CisJCWJvb2wgY2VudHJvaWQ7CisJfTsKKworCXR5cGVkZWYgUGl4ZWxTaGFkZXI6Okluc3RydWN0aW9uIFBpeGVsU2hhZGVySW5zdHJ1Y3Rpb247Cit9CisKKyNlbmRpZiAgIC8vIHN3X1BpeGVsU2hhZGVyX2hwcApkaWZmIC0tZ2l0IGEvc3JjL1NoYWRlci9TYW1wbGVyQ29yZS5jcHAgYi9zcmMvU2hhZGVyL1NhbXBsZXJDb3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzA1NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1NoYWRlci9TYW1wbGVyQ29yZS5jcHAKQEAgLTAsMCArMSwxODc3IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJTYW1wbGVyQ29yZS5ocHAiCisKKyNpbmNsdWRlICJDb25zdGFudHMuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJU2FtcGxlckNvcmU6OlNhbXBsZXJDb3JlKFBvaW50ZXI8Qnl0ZT4gJmNvbnN0YW50cywgY29uc3QgU2FtcGxlcjo6U3RhdGUgJnN0YXRlKSA6IGNvbnN0YW50cyhjb25zdGFudHMpLCBzdGF0ZShzdGF0ZSkKKwl7CisJfQorCisJdm9pZCBTYW1wbGVyQ29yZTo6c2FtcGxlVGV4dHVyZShQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBDb2xvcjRpICZjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdDQgJnEsIENvbG9yNGYgJmRzeCwgQ29sb3I0ZiAmZHN5LCBib29sIGJpYXMsIGJvb2wgZml4ZWQxMiwgYm9vbCBncmFkaWVudHMsIGJvb2wgbG9kUHJvdmlkZWQpCisJeworCQkjaWYgUEVSRl9QUk9GSUxFCisJCQlBZGRBdG9taWMoUG9pbnRlcjxMb25nPigmcHJvZmlsZXIudGV4T3BlcmF0aW9ucyksIExvbmcoNCkpOworCisJCQlpZihzdGF0ZS5jb21wcmVzc2VkRm9ybWF0KQorCQkJeworCQkJCUFkZEF0b21pYyhQb2ludGVyPExvbmc+KCZwcm9maWxlci5jb21wcmVzc2VkVGV4KSwgTG9uZyg0KSk7CisJCQl9CisJCSNlbmRpZgorCisJCWJvb2wgY3ViZVRleHR1cmUgPSBzdGF0ZS50ZXh0dXJlVHlwZSA9PSBURVhUVVJFX0NVQkU7CisJCWJvb2wgdm9sdW1lVGV4dHVyZSA9IHN0YXRlLnRleHR1cmVUeXBlID09IFRFWFRVUkVfM0Q7CisKKwkJRmxvYXQ0IHV1dXUgPSB1OworCQlGbG9hdDQgdnZ2diA9IHY7CisJCUZsb2F0NCB3d3d3ID0gdzsKKworCQlpZihzdGF0ZS50ZXh0dXJlVHlwZSA9PSBURVhUVVJFX05VTEwpCisJCXsKKwkJCWMuciA9IFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApOworCQkJYy5nID0gU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCk7CisJCQljLmIgPSBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKTsKKworCQkJaWYoZml4ZWQxMikgICAvLyBGSVhNRTogQ29udmVydCB0byBmaXhlZDEyIGF0IGhpZ2hlciBsZXZlbCwgd2hlbiByZXF1aXJlZAorCQkJeworCQkJCWMuYSA9IFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWMuYSA9IFNob3J0NCgoc2hvcnQpMHhGRkZGLCAoc2hvcnQpMHhGRkZGLCAoc2hvcnQpMHhGRkZGLCAoc2hvcnQpMHhGRkZGKTsgICAvLyBGSVhNRQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJSW50IGZhY2VbNF07CisJCQlGbG9hdDQgbG9kVTsKKwkJCUZsb2F0NCBsb2RWOworCisJCQlpZihjdWJlVGV4dHVyZSkKKwkJCXsKKwkJCQljdWJlRmFjZShmYWNlLCB1dXV1LCB2dnZ2LCBsb2RVLCBsb2RWLCB1LCB2LCB3KTsKKwkJCX0KKworCQkJRmxvYXQgbG9kOworCQkJRmxvYXQgYW5pc290cm9weTsKKwkJCUZsb2F0NCB1RGVsdGE7CisJCQlGbG9hdDQgdkRlbHRhOworCisJCQlpZighdm9sdW1lVGV4dHVyZSkKKwkJCXsKKwkJCQlpZighY3ViZVRleHR1cmUpCisJCQkJeworCQkJCQljb21wdXRlTG9kKHRleHR1cmUsIGxvZCwgYW5pc290cm9weSwgdURlbHRhLCB2RGVsdGEsIHV1dXUsIHZ2dnYsIEZsb2F0KHEueCksIGRzeCwgZHN5LCBiaWFzLCBncmFkaWVudHMsIGxvZFByb3ZpZGVkKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJY29tcHV0ZUxvZCh0ZXh0dXJlLCBsb2QsIGFuaXNvdHJvcHksIHVEZWx0YSwgdkRlbHRhLCBsb2RVLCBsb2RWLCBGbG9hdChxLngpLCBkc3gsIGRzeSwgYmlhcywgZ3JhZGllbnRzLCBsb2RQcm92aWRlZCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWNvbXB1dGVMb2QzRCh0ZXh0dXJlLCBsb2QsIHV1dXUsIHZ2dnYsIHd3d3csIEZsb2F0KHEueCksIGRzeCwgZHN5LCBiaWFzLCBncmFkaWVudHMsIGxvZFByb3ZpZGVkKTsKKwkJCX0KKworCQkJaWYoY3ViZVRleHR1cmUpCisJCQl7CisJCQkJdXV1dSArPSBGbG9hdDQoMC41ZiwgMC41ZiwgMC41ZiwgMC41Zik7CisJCQkJdnZ2diArPSBGbG9hdDQoMC41ZiwgMC41ZiwgMC41ZiwgMC41Zik7CisJCQl9CisKKwkJCWlmKCFoYXNGbG9hdFRleHR1cmUoKSkKKwkJCXsKKwkJCQlzYW1wbGVGaWx0ZXIodGV4dHVyZSwgYywgdXV1dSwgdnZ2diwgd3d3dywgbG9kLCBhbmlzb3Ryb3B5LCB1RGVsdGEsIHZEZWx0YSwgZmFjZSwgbG9kUHJvdmlkZWQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUNvbG9yNGYgY2Y7CisKKwkJCQlzYW1wbGVGbG9hdEZpbHRlcih0ZXh0dXJlLCBjZiwgdXV1dSwgdnZ2diwgd3d3dywgbG9kLCBhbmlzb3Ryb3B5LCB1RGVsdGEsIHZEZWx0YSwgZmFjZSwgbG9kUHJvdmlkZWQpOworCisJCQkJY29udmVydEZpeGVkMTIoYywgY2YpOworCQkJfQorCisJCQlpZihmaXhlZDEyICYmICFoYXNGbG9hdFRleHR1cmUoKSkKKwkJCXsKKwkJCQlmb3IoaW50IGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IHRleHR1cmVDb21wb25lbnRDb3VudCgpOyBjb21wb25lbnQrKykKKwkJCQl7CisJCQkJCWlmKHN0YXRlLnNSR0IgJiYgaXNSR0JDb21wb25lbnQoY29tcG9uZW50KSkKKwkJCQkJeworCQkJCQkJc1JHQnRvTGluZWFyMTZfMTIoY1tjb21wb25lbnRdKTsgICAvLyBGSVhNRTogUGVyZm9ybSBsaW5lYXJpemF0aW9uIGF0IHN1cmZhY2UgbGV2ZWwgZm9yIHJlYWQtb25seSB0ZXh0dXJlcworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KGNvbXBvbmVudCkpCisJCQkJCQl7CisJCQkJCQkJY1tjb21wb25lbnRdID0gQXM8VVNob3J0ND4oY1tjb21wb25lbnRdKSA+PiA0OworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWNbY29tcG9uZW50XSA9IGNbY29tcG9uZW50XSA+PiAzOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZihmaXhlZDEyICYmIHN0YXRlLnRleHR1cmVGaWx0ZXIgIT0gRklMVEVSX0dBVEhFUikKKwkJCXsKKwkJCQlpbnQgY29tcG9uZW50Q291bnQgPSB0ZXh0dXJlQ29tcG9uZW50Q291bnQoKTsKKworCQkJCXN3aXRjaChzdGF0ZS50ZXh0dXJlRm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEZPUk1BVF9SODoKKwkJCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJCQljYXNlIEZPUk1BVF9BOFI4RzhCODoKKwkJCQljYXNlIEZPUk1BVF9WOFU4OgorCQkJCWNhc2UgRk9STUFUX1E4VzhWOFU4OgorCQkJCWNhc2UgRk9STUFUX1g4TDhWOFU4OgorCQkJCWNhc2UgRk9STUFUX1YxNlUxNjoKKwkJCQljYXNlIEZPUk1BVF9BMTZXMTZWMTZVMTY6CisJCQkJY2FzZSBGT1JNQVRfUTE2VzE2VjE2VTE2OgorCQkJCWNhc2UgRk9STUFUX0c4Ujg6CisJCQkJY2FzZSBGT1JNQVRfRzE2UjE2OgorCQkJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNjoKKwkJCQkJaWYoY29tcG9uZW50Q291bnQgPCAyKSBjLmcgPSBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKTsKKwkJCQkJaWYoY29tcG9uZW50Q291bnQgPCAzKSBjLmIgPSBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKTsKKwkJCQkJaWYoY29tcG9uZW50Q291bnQgPCA0KSBjLmEgPSBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGT1JNQVRfQTg6CisJCQkJCWMuYSA9IGMucjsKKwkJCQkJYy5yID0gU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCk7CisJCQkJCWMuZyA9IFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApOworCQkJCQljLmIgPSBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGT1JNQVRfTDg6CisJCQkJY2FzZSBGT1JNQVRfTDE2OgorCQkJCQljLmcgPSBjLnI7CisJCQkJCWMuYiA9IGMucjsKKwkJCQkJYy5hID0gU2hvcnQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRk9STUFUX0E4TDg6CisJCQkJCWMuYSA9IGMuZzsKKwkJCQkJYy5nID0gYy5yOworCQkJCQljLmIgPSBjLnI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRk9STUFUX1IzMkY6CisJCQkJCWMuZyA9IFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApOworCQkJCWNhc2UgRk9STUFUX0czMlIzMkY6CisJCQkJCWMuYiA9IFNob3J0NCgweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDApOworCQkJCQljLmEgPSBTaG9ydDQoMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwKTsKKwkJCQljYXNlIEZPUk1BVF9BMzJCMzJHMzJSMzJGOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEZPUk1BVF9EMzJGX0xPQ0tBQkxFOgorCQkJCWNhc2UgRk9STUFUX0QzMkZfVEVYVFVSRToKKwkJCQljYXNlIEZPUk1BVF9EMzJGX1NIQURPVzoKKwkJCQkJYy5nID0gYy5yOworCQkJCQljLmIgPSBjLnI7CisJCQkJCWMuYSA9IGMucjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpzYW1wbGVUZXh0dXJlKFBvaW50ZXI8Qnl0ZT4gJnRleHR1cmUsIENvbG9yNGYgJmMsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJncsIEZsb2F0NCAmcSwgQ29sb3I0ZiAmZHN4LCBDb2xvcjRmICZkc3ksIGJvb2wgYmlhcywgYm9vbCBncmFkaWVudHMsIGJvb2wgbG9kUHJvdmlkZWQpCisJeworCQkjaWYgUEVSRl9QUk9GSUxFCisJCQlBZGRBdG9taWMoUG9pbnRlcjxMb25nPigmcHJvZmlsZXIudGV4T3BlcmF0aW9ucyksIExvbmcoNCkpOworCisJCQlpZihzdGF0ZS5jb21wcmVzc2VkRm9ybWF0KQorCQkJeworCQkJCUFkZEF0b21pYyhQb2ludGVyPExvbmc+KCZwcm9maWxlci5jb21wcmVzc2VkVGV4KSwgTG9uZyg0KSk7CisJCQl9CisJCSNlbmRpZgorCisJCWJvb2wgY3ViZVRleHR1cmUgPSBzdGF0ZS50ZXh0dXJlVHlwZSA9PSBURVhUVVJFX0NVQkU7CisJCWJvb2wgdm9sdW1lVGV4dHVyZSA9IHN0YXRlLnRleHR1cmVUeXBlID09IFRFWFRVUkVfM0Q7CisKKwkJaWYoc3RhdGUudGV4dHVyZVR5cGUgPT0gVEVYVFVSRV9OVUxMKQorCQl7CisJCQljLnIgPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQljLmcgPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQljLmIgPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQljLmEgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihoYXNGbG9hdFRleHR1cmUoKSkgICAvLyBGSVhNRTogTW9zdGx5IGlkZW50aWNhbCB0byBpbnRlZ2VyIHNhbXBsaW5nCisJCQl7CisJCQkJRmxvYXQ0IHV1dXUgPSB1OworCQkJCUZsb2F0NCB2dnZ2ID0gdjsKKwkJCQlGbG9hdDQgd3d3dyA9IHc7CisKKwkJCQlJbnQgZmFjZVs0XTsKKwkJCQlGbG9hdDQgbG9kVTsKKwkJCQlGbG9hdDQgbG9kVjsKKworCQkJCWlmKGN1YmVUZXh0dXJlKQorCQkJCXsKKwkJCQkJY3ViZUZhY2UoZmFjZSwgdXV1dSwgdnZ2diwgbG9kVSwgbG9kViwgdSwgdiwgdyk7CisJCQkJfQorCisJCQkJRmxvYXQgbG9kOworCQkJCUZsb2F0IGFuaXNvdHJvcHk7CisJCQkJRmxvYXQ0IHVEZWx0YTsKKwkJCQlGbG9hdDQgdkRlbHRhOworCisJCQkJaWYoIXZvbHVtZVRleHR1cmUpCisJCQkJeworCQkJCQlpZighY3ViZVRleHR1cmUpCisJCQkJCXsKKwkJCQkJCWNvbXB1dGVMb2QodGV4dHVyZSwgbG9kLCBhbmlzb3Ryb3B5LCB1RGVsdGEsIHZEZWx0YSwgdXV1dSwgdnZ2diwgRmxvYXQocS54KSwgZHN4LCBkc3ksIGJpYXMsIGdyYWRpZW50cywgbG9kUHJvdmlkZWQpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJY29tcHV0ZUxvZCh0ZXh0dXJlLCBsb2QsIGFuaXNvdHJvcHksIHVEZWx0YSwgdkRlbHRhLCBsb2RVLCBsb2RWLCBGbG9hdChxLngpLCBkc3gsIGRzeSwgYmlhcywgZ3JhZGllbnRzLCBsb2RQcm92aWRlZCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJY29tcHV0ZUxvZDNEKHRleHR1cmUsIGxvZCwgdXV1dSwgdnZ2diwgd3d3dywgRmxvYXQocS54KSwgZHN4LCBkc3ksIGJpYXMsIGdyYWRpZW50cywgbG9kUHJvdmlkZWQpOworCQkJCX0KKworCQkJCWlmKGN1YmVUZXh0dXJlKQorCQkJCXsKKwkJCQkJdXV1dSArPSBGbG9hdDQoMC41ZiwgMC41ZiwgMC41ZiwgMC41Zik7CisJCQkJCXZ2dnYgKz0gRmxvYXQ0KDAuNWYsIDAuNWYsIDAuNWYsIDAuNWYpOworCQkJCX0KKworCQkJCXNhbXBsZUZsb2F0RmlsdGVyKHRleHR1cmUsIGMsIHV1dXUsIHZ2dnYsIHd3d3csIGxvZCwgYW5pc290cm9weSwgdURlbHRhLCB2RGVsdGEsIGZhY2UsIGxvZFByb3ZpZGVkKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlDb2xvcjRpIGNpOworCisJCQkJc2FtcGxlVGV4dHVyZSh0ZXh0dXJlLCBjaSwgdSwgdiwgdywgcSwgZHN4LCBkc3ksIGJpYXMsIGZhbHNlLCBncmFkaWVudHMsIGxvZFByb3ZpZGVkKTsKKworCQkJCWZvcihpbnQgY29tcG9uZW50ID0gMDsgY29tcG9uZW50IDwgdGV4dHVyZUNvbXBvbmVudENvdW50KCk7IGNvbXBvbmVudCsrKQorCQkJCXsKKwkJCQkJaWYoc3RhdGUuc1JHQiAmJiBpc1JHQkNvbXBvbmVudChjb21wb25lbnQpKQorCQkJCQl7CisJCQkJCQlzUkdCdG9MaW5lYXIxNl8xMihjaVtjb21wb25lbnRdKTsgICAvLyBGSVhNRTogUGVyZm9ybSBsaW5lYXJpemF0aW9uIGF0IHN1cmZhY2UgbGV2ZWwgZm9yIHJlYWQtb25seSB0ZXh0dXJlcworCQkJCQkJY29udmVydFNpZ25lZDEyKGNbY29tcG9uZW50XSwgY2lbY29tcG9uZW50XSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlpZihoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoY29tcG9uZW50KSkKKwkJCQkJCXsKKwkJCQkJCQljb252ZXJ0VW5zaWduZWQxNihjW2NvbXBvbmVudF0sIGNpW2NvbXBvbmVudF0pOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWNvbnZlcnRTaWduZWQxNShjW2NvbXBvbmVudF0sIGNpW2NvbXBvbmVudF0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpbnQgY29tcG9uZW50Q291bnQgPSB0ZXh0dXJlQ29tcG9uZW50Q291bnQoKTsKKworCQkJaWYoc3RhdGUudGV4dHVyZUZpbHRlciAhPSBGSUxURVJfR0FUSEVSKQorCQkJeworCQkJCXN3aXRjaChzdGF0ZS50ZXh0dXJlRm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEZPUk1BVF9SODoKKwkJCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJCQljYXNlIEZPUk1BVF9BOFI4RzhCODoKKwkJCQljYXNlIEZPUk1BVF9WOFU4OgorCQkJCWNhc2UgRk9STUFUX1E4VzhWOFU4OgorCQkJCWNhc2UgRk9STUFUX1g4TDhWOFU4OgorCQkJCWNhc2UgRk9STUFUX1YxNlUxNjoKKwkJCQljYXNlIEZPUk1BVF9BMTZXMTZWMTZVMTY6CisJCQkJY2FzZSBGT1JNQVRfUTE2VzE2VjE2VTE2OgorCQkJCWNhc2UgRk9STUFUX0c4Ujg6CisJCQkJY2FzZSBGT1JNQVRfRzE2UjE2OgorCQkJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNjoKKwkJCQkJaWYoY29tcG9uZW50Q291bnQgPCAyKSBjLmcgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJCWlmKGNvbXBvbmVudENvdW50IDwgMykgYy5iID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQkJCQlpZihjb21wb25lbnRDb3VudCA8IDQpIGMuYSA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGT1JNQVRfQTg6CisJCQkJCWMuYSA9IGMucjsKKwkJCQkJYy5yID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJCQljLmcgPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQkJCWMuYiA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGT1JNQVRfTDg6CisJCQkJY2FzZSBGT1JNQVRfTDE2OgorCQkJCQljLmcgPSBjLnI7CisJCQkJCWMuYiA9IGMucjsKKwkJCQkJYy5hID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZPUk1BVF9BOEw4OgorCQkJCQljLmEgPSBjLmc7CisJCQkJCWMuZyA9IGMucjsKKwkJCQkJYy5iID0gYy5yOworCQkJCQlicmVhazsKKwkJCQljYXNlIEZPUk1BVF9SMzJGOgorCQkJCQljLmcgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJY2FzZSBGT1JNQVRfRzMyUjMyRjoKKwkJCQkJYy5iID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQkJCQljLmEgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJY2FzZSBGT1JNQVRfQTMyQjMyRzMyUjMyRjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGT1JNQVRfRDMyRl9MT0NLQUJMRToKKwkJCQljYXNlIEZPUk1BVF9EMzJGX1RFWFRVUkU6CisJCQkJY2FzZSBGT1JNQVRfRDMyRl9TSEFET1c6CisJCQkJCWMuZyA9IGMucjsKKwkJCQkJYy5iID0gYy5yOworCQkJCQljLmEgPSBjLnI7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJdm9pZCBTYW1wbGVyQ29yZTo6Ym9yZGVyKFNob3J0NCAmbWFzaywgRmxvYXQ0ICZjb29yZGluYXRlcykKKwl7CisJCUludDQgYm9yZGVyID0gQXM8SW50ND4oQ21wTFQoQWJzKGNvb3JkaW5hdGVzIC0gRmxvYXQ0KDAuNWYpKSwgRmxvYXQ0KDAuNWYpKSk7CisJCW1hc2sgPSBBczxTaG9ydDQ+KEludDIoQXM8SW50ND4oUGFjayhib3JkZXIsIGJvcmRlcikpKSk7CisJfQorCisJdm9pZCBTYW1wbGVyQ29yZTo6Ym9yZGVyKEludDQgJm1hc2ssIEZsb2F0NCAmY29vcmRpbmF0ZXMpCisJeworCQltYXNrID0gQXM8SW50ND4oQ21wTFQoQWJzKGNvb3JkaW5hdGVzIC0gRmxvYXQ0KDAuNWYpKSwgRmxvYXQ0KDAuNWYpKSk7CisJfQorCisJU2hvcnQ0IFNhbXBsZXJDb3JlOjpvZmZzZXRTYW1wbGUoU2hvcnQ0ICZ1dncsIFBvaW50ZXI8Qnl0ZT4gJm1pcG1hcCwgaW50IGhhbGZPZmZzZXQsIGJvb2wgd3JhcCwgaW50IGNvdW50KQorCXsKKwkJaWYod3JhcCkKKwkJeworCQkJc3dpdGNoKGNvdW50KQorCQkJeworCQkJY2FzZSAtMTogcmV0dXJuIHV2dyAtICpQb2ludGVyPFNob3J0ND4obWlwbWFwICsgaGFsZk9mZnNldCk7CisJCQljYXNlICAwOiByZXR1cm4gdXZ3OworCQkJY2FzZSArMTogcmV0dXJuIHV2dyArICpQb2ludGVyPFNob3J0ND4obWlwbWFwICsgaGFsZk9mZnNldCk7CisJCQljYXNlICAyOiByZXR1cm4gdXZ3ICsgKlBvaW50ZXI8U2hvcnQ0PihtaXBtYXAgKyBoYWxmT2Zmc2V0KSArICpQb2ludGVyPFNob3J0ND4obWlwbWFwICsgaGFsZk9mZnNldCk7CisJCQl9CisJCX0KKwkJZWxzZSAgIC8vIENsYW1wIG9yIG1pcnJvcgorCQl7CisJCQlzd2l0Y2goY291bnQpCisJCQl7CisJCQljYXNlIC0xOiByZXR1cm4gU3ViU2F0KEFzPFVTaG9ydDQ+KHV2dyksICpQb2ludGVyPFVTaG9ydDQ+KG1pcG1hcCArIGhhbGZPZmZzZXQpKTsKKwkJCWNhc2UgIDA6IHJldHVybiB1dnc7CisJCQljYXNlICsxOiByZXR1cm4gQWRkU2F0KEFzPFVTaG9ydDQ+KHV2dyksICpQb2ludGVyPFVTaG9ydDQ+KG1pcG1hcCArIGhhbGZPZmZzZXQpKTsKKwkJCWNhc2UgIDI6IHJldHVybiBBZGRTYXQoQWRkU2F0KEFzPFVTaG9ydDQ+KHV2dyksICpQb2ludGVyPFVTaG9ydDQ+KG1pcG1hcCArIGhhbGZPZmZzZXQpKSwgKlBvaW50ZXI8VVNob3J0ND4obWlwbWFwICsgaGFsZk9mZnNldCkpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHV2dzsKKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpzYW1wbGVGaWx0ZXIoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgQ29sb3I0aSAmYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmdywgRmxvYXQgJmxvZCwgRmxvYXQgJmFuaXNvdHJvcHksIEZsb2F0NCAmdURlbHRhLCBGbG9hdDQgJnZEZWx0YSwgSW50IGZhY2VbNF0sIGJvb2wgbG9kUHJvdmlkZWQpCisJeworCQlib29sIHZvbHVtZVRleHR1cmUgPSBzdGF0ZS50ZXh0dXJlVHlwZSA9PSBURVhUVVJFXzNEOworCisJCXNhbXBsZUFuaXNvKHRleHR1cmUsIGMsIHUsIHYsIHcsIGxvZCwgYW5pc290cm9weSwgdURlbHRhLCB2RGVsdGEsIGZhY2UsIGZhbHNlLCBsb2RQcm92aWRlZCk7CisKKwkJaWYoc3RhdGUubWlwbWFwRmlsdGVyID4gTUlQTUFQX1BPSU5UKQorCQl7CisJCQlDb2xvcjRpIGNjOworCisJCQlzYW1wbGVBbmlzbyh0ZXh0dXJlLCBjYywgdSwgdiwgdywgbG9kLCBhbmlzb3Ryb3B5LCB1RGVsdGEsIHZEZWx0YSwgZmFjZSwgdHJ1ZSwgbG9kUHJvdmlkZWQpOworCisJCQlsb2QgKj0gRmxvYXQoMSA8PCAxNik7CisKKwkJCVVTaG9ydDQgdXRyaSA9IFVTaG9ydDQoRmxvYXQ0KGxvZCkpOyAgIC8vIEZJWE1FOiBPcHRpbWl6ZQorCQkJU2hvcnQ0IHN0cmkgPSB1dHJpID4+IDE7ICAgLy8gRklYTUU6IE9wdGltaXplCisKKwkJCWlmKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgwKSkgY2MuciA9IE11bEhpZ2goQXM8VVNob3J0ND4oY2MuciksIHV0cmkpOyBlbHNlIGNjLnIgPSBNdWxIaWdoKGNjLnIsIHN0cmkpOworCQkJaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDEpKSBjYy5nID0gTXVsSGlnaChBczxVU2hvcnQ0PihjYy5nKSwgdXRyaSk7IGVsc2UgY2MuZyA9IE11bEhpZ2goY2MuZywgc3RyaSk7CisJCQlpZihoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMikpIGNjLmIgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGNjLmIpLCB1dHJpKTsgZWxzZSBjYy5iID0gTXVsSGlnaChjYy5iLCBzdHJpKTsKKwkJCWlmKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgzKSkgY2MuYSA9IE11bEhpZ2goQXM8VVNob3J0ND4oY2MuYSksIHV0cmkpOyBlbHNlIGNjLmEgPSBNdWxIaWdoKGNjLmEsIHN0cmkpOworCisJCQl1dHJpID0gfnV0cmk7CisJCQlzdHJpID0gU2hvcnQ0KDB4N0ZGRiwgMHg3RkZGLCAweDdGRkYsIDB4N0ZGRikgLSBzdHJpOworCisJCQlpZihoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMCkpIGMuciA9IE11bEhpZ2goQXM8VVNob3J0ND4oYy5yKSwgdXRyaSk7IGVsc2UgYy5yID0gTXVsSGlnaChjLnIsIHN0cmkpOworCQkJaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDEpKSBjLmcgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMuZyksIHV0cmkpOyBlbHNlIGMuZyA9IE11bEhpZ2goYy5nLCBzdHJpKTsKKwkJCWlmKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgyKSkgYy5iID0gTXVsSGlnaChBczxVU2hvcnQ0PihjLmIpLCB1dHJpKTsgZWxzZSBjLmIgPSBNdWxIaWdoKGMuYiwgc3RyaSk7CisJCQlpZihoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMykpIGMuYSA9IE11bEhpZ2goQXM8VVNob3J0ND4oYy5hKSwgdXRyaSk7IGVsc2UgYy5hID0gTXVsSGlnaChjLmEsIHN0cmkpOworCQkJCisJCQljLnIgKz0gY2MucjsKKwkJCWMuZyArPSBjYy5nOworCQkJYy5iICs9IGNjLmI7CisJCQljLmEgKz0gY2MuYTsKKwkJCQorCQkJaWYoIWhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgwKSkgYy5yICs9IGMucjsKKwkJCWlmKCFoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMSkpIGMuZyArPSBjLmc7CisJCQlpZighaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDIpKSBjLmIgKz0gYy5iOworCQkJaWYoIWhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgzKSkgYy5hICs9IGMuYTsKKwkJfQorCisJCVNob3J0NCBib3JkZXJNYXNrOworCisJCWlmKChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVUgPT0gQUREUkVTU0lOR19CT1JERVIpCisJCXsKKwkJCVNob3J0NCB1MDsKKwkJCQorCQkJYm9yZGVyKHUwLCB1KTsKKworCQkJYm9yZGVyTWFzayA9IHUwOworCQl9CisKKwkJaWYoKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX0JPUkRFUikKKwkJeworCQkJU2hvcnQ0IHYwOworCQkJCisJCQlib3JkZXIodjAsIHYpOworCisJCQlpZigoQWRkcmVzc2luZ01vZGUpc3RhdGUuYWRkcmVzc2luZ01vZGVVID09IEFERFJFU1NJTkdfQk9SREVSKQorCQkJeworCQkJCWJvcmRlck1hc2sgJj0gdjA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYm9yZGVyTWFzayA9IHYwOworCQkJfQorCQl9CisKKwkJaWYoKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVyA9PSBBRERSRVNTSU5HX0JPUkRFUiAmJiB2b2x1bWVUZXh0dXJlKQorCQl7CisJCQlTaG9ydDQgczA7CisKKwkJCWJvcmRlcihzMCwgdyk7CisKKwkJCWlmKChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVUgPT0gQUREUkVTU0lOR19CT1JERVIgfHwKKwkJCSAgIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVYgPT0gQUREUkVTU0lOR19CT1JERVIpCisJCQl7CisJCQkJYm9yZGVyTWFzayAmPSBzMDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlib3JkZXJNYXNrID0gczA7CisJCQl9CisJCX0KKworCQlpZigoQWRkcmVzc2luZ01vZGUpc3RhdGUuYWRkcmVzc2luZ01vZGVVID09IEFERFJFU1NJTkdfQk9SREVSIHx8CisJCSAgIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVYgPT0gQUREUkVTU0lOR19CT1JERVIgfHwKKwkJICAgKChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVcgPT0gQUREUkVTU0lOR19CT1JERVIgJiYgdm9sdW1lVGV4dHVyZSkpCisJCXsKKwkJCVNob3J0NCBiOworCisJCQljLnIgPSBib3JkZXJNYXNrICYgYy5yIHwgfmJvcmRlck1hc2sgJiAoKlBvaW50ZXI8U2hvcnQ0Pih0ZXh0dXJlICsgT0ZGU0VUKFRleHR1cmUsYm9yZGVyQ29sb3I0WzBdKSkgPj4gKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgwKSA/IDAgOiAxKSk7CisJCQljLmcgPSBib3JkZXJNYXNrICYgYy5nIHwgfmJvcmRlck1hc2sgJiAoKlBvaW50ZXI8U2hvcnQ0Pih0ZXh0dXJlICsgT0ZGU0VUKFRleHR1cmUsYm9yZGVyQ29sb3I0WzFdKSkgPj4gKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgxKSA/IDAgOiAxKSk7CisJCQljLmIgPSBib3JkZXJNYXNrICYgYy5iIHwgfmJvcmRlck1hc2sgJiAoKlBvaW50ZXI8U2hvcnQ0Pih0ZXh0dXJlICsgT0ZGU0VUKFRleHR1cmUsYm9yZGVyQ29sb3I0WzJdKSkgPj4gKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgyKSA/IDAgOiAxKSk7CisJCQljLmEgPSBib3JkZXJNYXNrICYgYy5hIHwgfmJvcmRlck1hc2sgJiAoKlBvaW50ZXI8U2hvcnQ0Pih0ZXh0dXJlICsgT0ZGU0VUKFRleHR1cmUsYm9yZGVyQ29sb3I0WzNdKSkgPj4gKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgzKSA/IDAgOiAxKSk7CisJCX0KKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpzYW1wbGVBbmlzbyhQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBDb2xvcjRpICZjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdCAmbG9kLCBGbG9hdCAmYW5pc290cm9weSwgRmxvYXQ0ICZ1RGVsdGEsIEZsb2F0NCAmdkRlbHRhLCBJbnQgZmFjZVs0XSwgYm9vbCBzZWNvbmRMT0QsIGJvb2wgbG9kUHJvdmlkZWQpCisJeworCQlpZihzdGF0ZS50ZXh0dXJlRmlsdGVyICE9IEZJTFRFUl9BTklTT1RST1BJQyB8fCBsb2RQcm92aWRlZCkKKwkJeworCQkJc2FtcGxlUXVhZCh0ZXh0dXJlLCBjLCB1LCB2LCB3LCBsb2QsIGZhY2UsIHNlY29uZExPRCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJbnQgYSA9IFJvdW5kSW50KGFuaXNvdHJvcHkpOworCisJCQlDb2xvcjRpIGNTdW07CisKKwkJCWNTdW0uciA9IFNob3J0NCgwLCAwLCAwLCAwKTsKKwkJCWNTdW0uZyA9IFNob3J0NCgwLCAwLCAwLCAwKTsKKwkJCWNTdW0uYiA9IFNob3J0NCgwLCAwLCAwLCAwKTsKKwkJCWNTdW0uYSA9IFNob3J0NCgwLCAwLCAwLCAwKTsKKworCQkJRmxvYXQ0IEEgPSAqUG9pbnRlcjxGbG9hdDQ+KGNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsdXZXZWlnaHQpICsgMTYgKiBhKTsKKwkJCUZsb2F0NCBCID0gKlBvaW50ZXI8RmxvYXQ0Pihjb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLHV2U3RhcnQpICsgMTYgKiBhKTsKKwkJCVVTaG9ydDQgY3cgPSAqUG9pbnRlcjxVU2hvcnQ0Pihjb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGNXZWlnaHQpICsgOCAqIGEpOworCQkJU2hvcnQ0IHN3ID0gU2hvcnQ0KGN3ID4+IDEpOworCisJCQlGbG9hdDQgZHUgPSB1RGVsdGE7CisJCQlGbG9hdDQgZHYgPSB2RGVsdGE7CisKKwkJCUZsb2F0NCB1MCA9IHUgKyBCICogZHU7CisJCQlGbG9hdDQgdjAgPSB2ICsgQiAqIGR2OworCisJCQlkdSAqPSBBOworCQkJZHYgKj0gQTsKKworCQkJSW50IGkgPSAwOworCisJCQlEbworCQkJeworCQkJCXNhbXBsZVF1YWQodGV4dHVyZSwgYywgdTAsIHYwLCB3LCBsb2QsIGZhY2UsIHNlY29uZExPRCk7CisKKwkJCQl1MCArPSBkdTsKKwkJCQl2MCArPSBkdjsKKworCQkJCWlmKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgwKSkgY1N1bS5yICs9IEFzPFNob3J0ND4oTXVsSGlnaChBczxVU2hvcnQ0PihjLnIpLCBjdykpOyBlbHNlIGNTdW0uciArPSBNdWxIaWdoKGMuciwgc3cpOworCQkJCWlmKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgxKSkgY1N1bS5nICs9IEFzPFNob3J0ND4oTXVsSGlnaChBczxVU2hvcnQ0PihjLmcpLCBjdykpOyBlbHNlIGNTdW0uZyArPSBNdWxIaWdoKGMuZywgc3cpOworCQkJCWlmKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgyKSkgY1N1bS5iICs9IEFzPFNob3J0ND4oTXVsSGlnaChBczxVU2hvcnQ0PihjLmIpLCBjdykpOyBlbHNlIGNTdW0uYiArPSBNdWxIaWdoKGMuYiwgc3cpOworCQkJCWlmKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgzKSkgY1N1bS5hICs9IEFzPFNob3J0ND4oTXVsSGlnaChBczxVU2hvcnQ0PihjLmEpLCBjdykpOyBlbHNlIGNTdW0uYSArPSBNdWxIaWdoKGMuYSwgc3cpOworCisJCQkJaSsrOworCQkJfQorCQkJVW50aWwoaSA+PSBhKQorCisJCQlpZihoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMCkpIGMuciA9IGNTdW0ucjsgZWxzZSBjLnIgPSBBZGRTYXQoY1N1bS5yLCBjU3VtLnIpOworCQkJaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDEpKSBjLmcgPSBjU3VtLmc7IGVsc2UgYy5nID0gQWRkU2F0KGNTdW0uZywgY1N1bS5nKTsKKwkJCWlmKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgyKSkgYy5iID0gY1N1bS5iOyBlbHNlIGMuYiA9IEFkZFNhdChjU3VtLmIsIGNTdW0uYik7CisJCQlpZihoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMykpIGMuYSA9IGNTdW0uYTsgZWxzZSBjLmEgPSBBZGRTYXQoY1N1bS5hLCBjU3VtLmEpOworCQl9CisJfQorCisJdm9pZCBTYW1wbGVyQ29yZTo6c2FtcGxlUXVhZChQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBDb2xvcjRpICZjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdCAmbG9kLCBJbnQgZmFjZVs0XSwgYm9vbCBzZWNvbmRMT0QpCisJeworCQlpZihzdGF0ZS50ZXh0dXJlVHlwZSAhPSBURVhUVVJFXzNEKQorCQl7CisJCQlzYW1wbGVRdWFkMkQodGV4dHVyZSwgYywgdSwgdiwgbG9kLCBmYWNlLCBzZWNvbmRMT0QpOworCQl9CisJCWVsc2UKKwkJeworCQkJc2FtcGxlM0QodGV4dHVyZSwgYywgdSwgdiwgdywgbG9kLCBzZWNvbmRMT0QpOworCQl9CisJfQorCisJdm9pZCBTYW1wbGVyQ29yZTo6c2FtcGxlUXVhZDJEKFBvaW50ZXI8Qnl0ZT4gJnRleHR1cmUsIENvbG9yNGkgJmMsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdCAmbG9kLCBJbnQgZmFjZVs0XSwgYm9vbCBzZWNvbmRMT0QpCisJeworCQlpbnQgY29tcG9uZW50Q291bnQgPSB0ZXh0dXJlQ29tcG9uZW50Q291bnQoKTsKKwkJYm9vbCBnYXRoZXIgPSBzdGF0ZS50ZXh0dXJlRmlsdGVyID09IEZJTFRFUl9HQVRIRVI7CisKKwkJUG9pbnRlcjxCeXRlPiBtaXBtYXA7CisJCVBvaW50ZXI8Qnl0ZT4gYnVmZmVyWzRdOworCisJCXNlbGVjdE1pcG1hcCh0ZXh0dXJlLCBidWZmZXIsIG1pcG1hcCwgbG9kLCBmYWNlLCBzZWNvbmRMT0QpOworCisJCVNob3J0NCB1dXV1OworCQlTaG9ydDQgdnZ2djsKKworCQlhZGRyZXNzKHV1dXUsIHUsIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVUpOworCQlhZGRyZXNzKHZ2dnYsIHYsIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVYpOworCisJCWlmKHN0YXRlLnRleHR1cmVGaWx0ZXIgPT0gRklMVEVSX1BPSU5UKQorCQl7CisJCQlzYW1wbGVUZXhlbChjLCB1dXV1LCB2dnZ2LCB2dnZ2LCBtaXBtYXAsIGJ1ZmZlcik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlDb2xvcjRpIGMwOworCQkJQ29sb3I0aSBjMTsKKwkJCUNvbG9yNGkgYzI7CisJCQlDb2xvcjRpIGMzOworCisJCQlTaG9ydDQgdXV1dTAgPSBvZmZzZXRTYW1wbGUodXV1dSwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHVIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVSA9PSBBRERSRVNTSU5HX1dSQVAsIGdhdGhlciA/IDAgOiAtMSk7CisJCQlTaG9ydDQgdnZ2djAgPSBvZmZzZXRTYW1wbGUodnZ2diwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHZIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX1dSQVAsIGdhdGhlciA/IDAgOiAtMSk7CisJCQlTaG9ydDQgdXV1dTEgPSBvZmZzZXRTYW1wbGUodXV1dSwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHVIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVSA9PSBBRERSRVNTSU5HX1dSQVAsIGdhdGhlciA/IDIgOiArMSk7CisJCQlTaG9ydDQgdnZ2djEgPSBvZmZzZXRTYW1wbGUodnZ2diwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHZIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX1dSQVAsIGdhdGhlciA/IDIgOiArMSk7CisKKwkJCXNhbXBsZVRleGVsKGMwLCB1dXV1MCwgdnZ2djAsIHZ2dnYwLCBtaXBtYXAsIGJ1ZmZlcik7CisJCQlzYW1wbGVUZXhlbChjMSwgdXV1dTEsIHZ2dnYwLCB2dnZ2MCwgbWlwbWFwLCBidWZmZXIpOworCQkJc2FtcGxlVGV4ZWwoYzIsIHV1dXUwLCB2dnZ2MSwgdnZ2djEsIG1pcG1hcCwgYnVmZmVyKTsKKwkJCXNhbXBsZVRleGVsKGMzLCB1dXV1MSwgdnZ2djEsIHZ2dnYxLCBtaXBtYXAsIGJ1ZmZlcik7CisJCisJCQlpZighZ2F0aGVyKSAgIC8vIEJsZW5kCisJCQl7CisJCQkJLy8gRnJhY3Rpb25zCisJCQkJVVNob3J0NCBmMHUgPSB1dXV1MDsKKwkJCQlVU2hvcnQ0IGYwdiA9IHZ2dnYwOworCQkJCisJCQkJaWYoIXN0YXRlLmhhc05QT1RUZXh0dXJlKQorCQkJCXsKKwkJCQkJZjB1ID0gZjB1IDw8ICpQb2ludGVyPExvbmcxPihtaXBtYXAgKyBPRkZTRVQoTWlwbWFwLHVJbnQpKTsgICAvLyAudQorCQkJCQlmMHYgPSBmMHYgPDwgKlBvaW50ZXI8TG9uZzE+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsdkludCkpOyAgIC8vIC52CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWYwdSA9IGYwdSAqICpQb2ludGVyPFVTaG9ydDQ+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsd2lkdGgpKTsKKwkJCQkJZjB2ID0gZjB2ICogKlBvaW50ZXI8VVNob3J0ND4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCxoZWlnaHQpKTsKKwkJCQl9CisKKwkJCQlTaG9ydDQgZjF1ID0gfmYwdTsKKwkJCQlTaG9ydDQgZjF2ID0gfmYwdjsKKwkJCQorCQkJCVNob3J0NCBmMHUwdiA9IE11bEhpZ2goQXM8VVNob3J0ND4oZjB1KSwgQXM8VVNob3J0ND4oZjB2KSk7CisJCQkJU2hvcnQ0IGYxdTB2ID0gTXVsSGlnaChBczxVU2hvcnQ0PihmMXUpLCBBczxVU2hvcnQ0PihmMHYpKTsKKwkJCQlTaG9ydDQgZjB1MXYgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGYwdSksIEFzPFVTaG9ydDQ+KGYxdikpOworCQkJCVNob3J0NCBmMXUxdiA9IE11bEhpZ2goQXM8VVNob3J0ND4oZjF1KSwgQXM8VVNob3J0ND4oZjF2KSk7CisKKwkJCQkvLyBTaWduZWQgZnJhY3Rpb25zCisJCQkJU2hvcnQ0IGYxdTF2czsKKwkJCQlTaG9ydDQgZjB1MXZzOworCQkJCVNob3J0NCBmMXUwdnM7CisJCQkJU2hvcnQ0IGYwdTB2czsKKworCQkJCWlmKCFoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMCkgfHwgIWhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgxKSB8fCAhaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDIpIHx8ICFoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMykpCisJCQkJeworCQkJCQlmMXUxdnMgPSBBczxVU2hvcnQ0PihmMXUxdikgPj4gMTsKKwkJCQkJZjB1MXZzID0gQXM8VVNob3J0ND4oZjB1MXYpID4+IDE7CisJCQkJCWYxdTB2cyA9IEFzPFVTaG9ydDQ+KGYxdTB2KSA+PiAxOworCQkJCQlmMHUwdnMgPSBBczxVU2hvcnQ0PihmMHUwdikgPj4gMTsKKwkJCQl9CisKKwkJCQkvLyBCaWxpbmVhciBpbnRlcnBvbGF0aW9uCisJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMSkKKwkJCQl7CisJCQkJCWlmKGhhczE2Yml0VGV4dHVyZSgpICYmIGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgwKSkKKwkJCQkJeworCQkJCQkJYzAuciA9IEFzPFVTaG9ydDQ+KGMwLnIpIC0gTXVsSGlnaChBczxVU2hvcnQ0PihjMC5yKSwgZjB1KSArIE11bEhpZ2goQXM8VVNob3J0ND4oYzEuciksIGYwdSk7CisJCQkJCQljMi5yID0gQXM8VVNob3J0ND4oYzIucikgLSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMyLnIpLCBmMHUpICsgTXVsSGlnaChBczxVU2hvcnQ0PihjMy5yKSwgZjB1KTsKKwkJCQkJCWMuciAgPSBBczxVU2hvcnQ0PihjMC5yKSAtIE11bEhpZ2goQXM8VVNob3J0ND4oYzAuciksIGYwdikgKyBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMyLnIpLCBmMHYpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDApKQorCQkJCQkJeworCQkJCQkJCWMwLnIgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMwLnIpLCBBczxVU2hvcnQ0PihmMXUxdikpOworCQkJCQkJCWMxLnIgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMxLnIpLCBBczxVU2hvcnQ0PihmMHUxdikpOworCQkJCQkJCWMyLnIgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMyLnIpLCBBczxVU2hvcnQ0PihmMXUwdikpOworCQkJCQkJCWMzLnIgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMzLnIpLCBBczxVU2hvcnQ0PihmMHUwdikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWMwLnIgPSBNdWxIaWdoKGMwLnIsIGYxdTF2cyk7CisJCQkJCQkJYzEuciA9IE11bEhpZ2goYzEuciwgZjB1MXZzKTsKKwkJCQkJCQljMi5yID0gTXVsSGlnaChjMi5yLCBmMXUwdnMpOworCQkJCQkJCWMzLnIgPSBNdWxIaWdoKGMzLnIsIGYwdTB2cyk7CisJCQkJCQl9CisKKwkJCQkJCWMuciA9IChjMC5yICsgYzEucikgKyAoYzIuciArIGMzLnIpOworCQkJCQkJaWYoIWhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgwKSkgYy5yID0gQWRkU2F0KGMuciwgYy5yKTsgICAvLyBDb3JyZWN0IGZvciBzaWduZWQgZnJhY3Rpb25zCisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZihjb21wb25lbnRDb3VudCA+PSAyKQorCQkJCXsKKwkJCQkJaWYoaGFzMTZiaXRUZXh0dXJlKCkgJiYgaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDEpKQorCQkJCQl7CisJCQkJCQljMC5nID0gQXM8VVNob3J0ND4oYzAuZykgLSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMwLmcpLCBmMHUpICsgTXVsSGlnaChBczxVU2hvcnQ0PihjMS5nKSwgZjB1KTsKKwkJCQkJCWMyLmcgPSBBczxVU2hvcnQ0PihjMi5nKSAtIE11bEhpZ2goQXM8VVNob3J0ND4oYzIuZyksIGYwdSkgKyBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMzLmcpLCBmMHUpOworCQkJCQkJYy5nICA9IEFzPFVTaG9ydDQ+KGMwLmcpIC0gTXVsSGlnaChBczxVU2hvcnQ0PihjMC5nKSwgZjB2KSArIE11bEhpZ2goQXM8VVNob3J0ND4oYzIuZyksIGYwdik7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlpZihoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMSkpCisJCQkJCQl7CisJCQkJCQkJYzAuZyA9IE11bEhpZ2goQXM8VVNob3J0ND4oYzAuZyksIEFzPFVTaG9ydDQ+KGYxdTF2KSk7CisJCQkJCQkJYzEuZyA9IE11bEhpZ2goQXM8VVNob3J0ND4oYzEuZyksIEFzPFVTaG9ydDQ+KGYwdTF2KSk7CisJCQkJCQkJYzIuZyA9IE11bEhpZ2goQXM8VVNob3J0ND4oYzIuZyksIEFzPFVTaG9ydDQ+KGYxdTB2KSk7CisJCQkJCQkJYzMuZyA9IE11bEhpZ2goQXM8VVNob3J0ND4oYzMuZyksIEFzPFVTaG9ydDQ+KGYwdTB2KSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJYzAuZyA9IE11bEhpZ2goYzAuZywgZjF1MXZzKTsKKwkJCQkJCQljMS5nID0gTXVsSGlnaChjMS5nLCBmMHUxdnMpOworCQkJCQkJCWMyLmcgPSBNdWxIaWdoKGMyLmcsIGYxdTB2cyk7CisJCQkJCQkJYzMuZyA9IE11bEhpZ2goYzMuZywgZjB1MHZzKTsKKwkJCQkJCX0KKworCQkJCQkJYy5nID0gKGMwLmcgKyBjMS5nKSArIChjMi5nICsgYzMuZyk7CisJCQkJCQlpZighaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDEpKSBjLmcgPSBBZGRTYXQoYy5nLCBjLmcpOyAgIC8vIENvcnJlY3QgZm9yIHNpZ25lZCBmcmFjdGlvbnMKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmKGNvbXBvbmVudENvdW50ID49IDMpCisJCQkJeworCQkJCQlpZihoYXMxNmJpdFRleHR1cmUoKSAmJiBoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMikpCisJCQkJCXsKKwkJCQkJCWMwLmIgPSBBczxVU2hvcnQ0PihjMC5iKSAtIE11bEhpZ2goQXM8VVNob3J0ND4oYzAuYiksIGYwdSkgKyBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMxLmIpLCBmMHUpOworCQkJCQkJYzIuYiA9IEFzPFVTaG9ydDQ+KGMyLmIpIC0gTXVsSGlnaChBczxVU2hvcnQ0PihjMi5iKSwgZjB1KSArIE11bEhpZ2goQXM8VVNob3J0ND4oYzMuYiksIGYwdSk7CisJCQkJCQljLmIgID0gQXM8VVNob3J0ND4oYzAuYikgLSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMwLmIpLCBmMHYpICsgTXVsSGlnaChBczxVU2hvcnQ0PihjMi5iKSwgZjB2KTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWlmKGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgyKSkKKwkJCQkJCXsKKwkJCQkJCQljMC5iID0gTXVsSGlnaChBczxVU2hvcnQ0PihjMC5iKSwgQXM8VVNob3J0ND4oZjF1MXYpKTsKKwkJCQkJCQljMS5iID0gTXVsSGlnaChBczxVU2hvcnQ0PihjMS5iKSwgQXM8VVNob3J0ND4oZjB1MXYpKTsKKwkJCQkJCQljMi5iID0gTXVsSGlnaChBczxVU2hvcnQ0PihjMi5iKSwgQXM8VVNob3J0ND4oZjF1MHYpKTsKKwkJCQkJCQljMy5iID0gTXVsSGlnaChBczxVU2hvcnQ0PihjMy5iKSwgQXM8VVNob3J0ND4oZjB1MHYpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQljMC5iID0gTXVsSGlnaChjMC5iLCBmMXUxdnMpOworCQkJCQkJCWMxLmIgPSBNdWxIaWdoKGMxLmIsIGYwdTF2cyk7CisJCQkJCQkJYzIuYiA9IE11bEhpZ2goYzIuYiwgZjF1MHZzKTsKKwkJCQkJCQljMy5iID0gTXVsSGlnaChjMy5iLCBmMHUwdnMpOworCQkJCQkJfQorCisJCQkJCQljLmIgPSAoYzAuYiArIGMxLmIpICsgKGMyLmIgKyBjMy5iKTsKKwkJCQkJCWlmKCFoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMikpIGMuYiA9IEFkZFNhdChjLmIsIGMuYik7ICAgLy8gQ29ycmVjdCBmb3Igc2lnbmVkIGZyYWN0aW9ucworCQkJCQl9CisJCQkJfQorCisJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gNCkKKwkJCQl7CisJCQkJCWlmKGhhczE2Yml0VGV4dHVyZSgpICYmIGhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgzKSkKKwkJCQkJeworCQkJCQkJYzAuYSA9IEFzPFVTaG9ydDQ+KGMwLmEpIC0gTXVsSGlnaChBczxVU2hvcnQ0PihjMC5hKSwgZjB1KSArIE11bEhpZ2goQXM8VVNob3J0ND4oYzEuYSksIGYwdSk7CisJCQkJCQljMi5hID0gQXM8VVNob3J0ND4oYzIuYSkgLSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMyLmEpLCBmMHUpICsgTXVsSGlnaChBczxVU2hvcnQ0PihjMy5hKSwgZjB1KTsKKwkJCQkJCWMuYSAgPSBBczxVU2hvcnQ0PihjMC5hKSAtIE11bEhpZ2goQXM8VVNob3J0ND4oYzAuYSksIGYwdikgKyBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMyLmEpLCBmMHYpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDMpKQorCQkJCQkJeworCQkJCQkJCWMwLmEgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMwLmEpLCBBczxVU2hvcnQ0PihmMXUxdikpOworCQkJCQkJCWMxLmEgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMxLmEpLCBBczxVU2hvcnQ0PihmMHUxdikpOworCQkJCQkJCWMyLmEgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMyLmEpLCBBczxVU2hvcnQ0PihmMXUwdikpOworCQkJCQkJCWMzLmEgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGMzLmEpLCBBczxVU2hvcnQ0PihmMHUwdikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWMwLmEgPSBNdWxIaWdoKGMwLmEsIGYxdTF2cyk7CisJCQkJCQkJYzEuYSA9IE11bEhpZ2goYzEuYSwgZjB1MXZzKTsKKwkJCQkJCQljMi5hID0gTXVsSGlnaChjMi5hLCBmMXUwdnMpOworCQkJCQkJCWMzLmEgPSBNdWxIaWdoKGMzLmEsIGYwdTB2cyk7CisJCQkJCQl9CisKKwkJCQkJCWMuYSA9IChjMC5hICsgYzEuYSkgKyAoYzIuYSArIGMzLmEpOworCQkJCQkJaWYoIWhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgzKSkgYy5hID0gQWRkU2F0KGMuYSwgYy5hKTsgICAvLyBDb3JyZWN0IGZvciBzaWduZWQgZnJhY3Rpb25zCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYy5yID0gYzEucjsKKwkJCQljLmcgPSBjMi5yOworCQkJCWMuYiA9IGMzLnI7CisJCQkJYy5hID0gYzAucjsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgU2FtcGxlckNvcmU6OnNhbXBsZTNEKFBvaW50ZXI8Qnl0ZT4gJnRleHR1cmUsIENvbG9yNGkgJmNfLCBGbG9hdDQgJnVfLCBGbG9hdDQgJnZfLCBGbG9hdDQgJndfLCBGbG9hdCAmbG9kLCBib29sIHNlY29uZExPRCkKKwl7CisJCWludCBjb21wb25lbnRDb3VudCA9IHRleHR1cmVDb21wb25lbnRDb3VudCgpOworCisJCVBvaW50ZXI8Qnl0ZT4gbWlwbWFwOworCQlQb2ludGVyPEJ5dGU+IGJ1ZmZlcls0XTsKKwkJSW50IGZhY2VbNF07CisJCQorCQlzZWxlY3RNaXBtYXAodGV4dHVyZSwgYnVmZmVyLCBtaXBtYXAsIGxvZCwgZmFjZSwgc2Vjb25kTE9EKTsKKworCQlTaG9ydDQgdXV1dTsKKwkJU2hvcnQ0IHZ2dnY7CisJCVNob3J0NCB3d3d3OworCisJCWFkZHJlc3ModXV1dSwgdV8sIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVUpOworCQlhZGRyZXNzKHZ2dnYsIHZfLCAoQWRkcmVzc2luZ01vZGUpc3RhdGUuYWRkcmVzc2luZ01vZGVWKTsKKwkJYWRkcmVzcyh3d3d3LCB3XywgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVyk7CisKKwkJaWYoc3RhdGUudGV4dHVyZUZpbHRlciA8PSBGSUxURVJfUE9JTlQpCisJCXsKKwkJCXNhbXBsZVRleGVsKGNfLCB1dXV1LCB2dnZ2LCB3d3d3LCBtaXBtYXAsIGJ1ZmZlcik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlDb2xvcjRpIGNbMl1bMl1bMl07CisKKwkJCVNob3J0NCB1WzJdWzJdWzJdOworCQkJU2hvcnQ0IHZbMl1bMl1bMl07CisJCQlTaG9ydDQgc1syXVsyXVsyXTsKKworCQkJZm9yKGludCBpID0gMDsgaSA8IDI7IGkrKykKKwkJCXsKKwkJCQlmb3IoaW50IGogPSAwOyBqIDwgMjsgaisrKQorCQkJCXsKKwkJCQkJZm9yKGludCBrID0gMDsgayA8IDI7IGsrKykKKwkJCQkJeworCQkJCQkJdVtpXVtqXVtrXSA9IG9mZnNldFNhbXBsZSh1dXV1LCBtaXBtYXAsIE9GRlNFVChNaXBtYXAsdUhhbGYpLCAoQWRkcmVzc2luZ01vZGUpc3RhdGUuYWRkcmVzc2luZ01vZGVVID09IEFERFJFU1NJTkdfV1JBUCwgaSAqIDIgLSAxKTsKKwkJCQkJCXZbaV1bal1ba10gPSBvZmZzZXRTYW1wbGUodnZ2diwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHZIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX1dSQVAsIGogKiAyIC0gMSk7CisJCQkJCQlzW2ldW2pdW2tdID0gb2Zmc2V0U2FtcGxlKHd3d3csIG1pcG1hcCwgT0ZGU0VUKE1pcG1hcCx3SGFsZiksIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVcgPT0gQUREUkVTU0lOR19XUkFQLCBrICogMiAtIDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlTaG9ydDQgZlsyXVsyXVsyXTsKKwkJCVNob3J0NCBmc1syXVsyXVsyXTsKKwkJCVNob3J0NCBmMHU7CisJCQlTaG9ydDQgZjB2OworCQkJU2hvcnQ0IGYwczsKKwkJCVNob3J0NCBmMXU7CisJCQlTaG9ydDQgZjF2OworCQkJU2hvcnQ0IGYxczsKKworCQkJLy8gRnJhY3Rpb25zCisJCQlmMHUgPSB1WzBdWzBdWzBdOworCQkJZjB2ID0gdlswXVswXVswXTsKKwkJCWYwcyA9IHNbMF1bMF1bMF07CisKKwkJCWlmKCFzdGF0ZS5oYXNOUE9UVGV4dHVyZSkKKwkJCXsKKwkJCQlmMHUgPSBmMHUgPDwgKlBvaW50ZXI8TG9uZzE+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsdUludCkpOworCQkJCWYwdiA9IGYwdiA8PCAqUG9pbnRlcjxMb25nMT4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCx2SW50KSk7CisJCQkJZjBzID0gZjBzIDw8ICpQb2ludGVyPExvbmcxPihtaXBtYXAgKyBPRkZTRVQoTWlwbWFwLHdJbnQpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmMHUgKj0gKlBvaW50ZXI8U2hvcnQ0PihtaXBtYXAgKyBPRkZTRVQoTWlwbWFwLHdpZHRoKSk7CisJCQkJZjB2ICo9ICpQb2ludGVyPFNob3J0ND4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCxoZWlnaHQpKTsKKwkJCQlmMHMgKj0gKlBvaW50ZXI8U2hvcnQ0PihtaXBtYXAgKyBPRkZTRVQoTWlwbWFwLGRlcHRoKSk7CisJCQl9CisKKwkJCWYxdSA9IH5mMHU7CisJCQlmMXYgPSB+ZjB2OworCQkJZjFzID0gfmYwczsKKworCQkJZlsxXVsxXVsxXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZjF1KSwgQXM8VVNob3J0ND4oZjF2KSk7CisJCQlmWzBdWzFdWzFdID0gTXVsSGlnaChBczxVU2hvcnQ0PihmMHUpLCBBczxVU2hvcnQ0PihmMXYpKTsKKwkJCWZbMV1bMF1bMV0gPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGYxdSksIEFzPFVTaG9ydDQ+KGYwdikpOworCQkJZlswXVswXVsxXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZjB1KSwgQXM8VVNob3J0ND4oZjB2KSk7CisJCQlmWzFdWzFdWzBdID0gTXVsSGlnaChBczxVU2hvcnQ0PihmMXUpLCBBczxVU2hvcnQ0PihmMXYpKTsKKwkJCWZbMF1bMV1bMF0gPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGYwdSksIEFzPFVTaG9ydDQ+KGYxdikpOworCQkJZlsxXVswXVswXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZjF1KSwgQXM8VVNob3J0ND4oZjB2KSk7CisJCQlmWzBdWzBdWzBdID0gTXVsSGlnaChBczxVU2hvcnQ0PihmMHUpLCBBczxVU2hvcnQ0PihmMHYpKTsKKworCQkJZlsxXVsxXVsxXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZlsxXVsxXVsxXSksIEFzPFVTaG9ydDQ+KGYxcykpOworCQkJZlswXVsxXVsxXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZlswXVsxXVsxXSksIEFzPFVTaG9ydDQ+KGYxcykpOworCQkJZlsxXVswXVsxXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZlsxXVswXVsxXSksIEFzPFVTaG9ydDQ+KGYxcykpOworCQkJZlswXVswXVsxXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZlswXVswXVsxXSksIEFzPFVTaG9ydDQ+KGYxcykpOworCQkJZlsxXVsxXVswXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZlsxXVsxXVswXSksIEFzPFVTaG9ydDQ+KGYwcykpOworCQkJZlswXVsxXVswXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZlswXVsxXVswXSksIEFzPFVTaG9ydDQ+KGYwcykpOworCQkJZlsxXVswXVswXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZlsxXVswXVswXSksIEFzPFVTaG9ydDQ+KGYwcykpOworCQkJZlswXVswXVswXSA9IE11bEhpZ2goQXM8VVNob3J0ND4oZlswXVswXVswXSksIEFzPFVTaG9ydDQ+KGYwcykpOworCisJCQkvLyBTaWduZWQgZnJhY3Rpb25zCisJCQlpZighaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDApIHx8ICFoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMSkgfHwgIWhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgyKSB8fCAhaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDMpKQorCQkJeworCQkJCWZzWzBdWzBdWzBdID0gQXM8VVNob3J0ND4oZlswXVswXVswXSkgPj4gMTsKKwkJCQlmc1swXVswXVsxXSA9IEFzPFVTaG9ydDQ+KGZbMF1bMF1bMV0pID4+IDE7CisJCQkJZnNbMF1bMV1bMF0gPSBBczxVU2hvcnQ0PihmWzBdWzFdWzBdKSA+PiAxOworCQkJCWZzWzBdWzFdWzFdID0gQXM8VVNob3J0ND4oZlswXVsxXVsxXSkgPj4gMTsKKwkJCQlmc1sxXVswXVswXSA9IEFzPFVTaG9ydDQ+KGZbMV1bMF1bMF0pID4+IDE7CisJCQkJZnNbMV1bMF1bMV0gPSBBczxVU2hvcnQ0PihmWzFdWzBdWzFdKSA+PiAxOworCQkJCWZzWzFdWzFdWzBdID0gQXM8VVNob3J0ND4oZlsxXVsxXVswXSkgPj4gMTsKKwkJCQlmc1sxXVsxXVsxXSA9IEFzPFVTaG9ydDQ+KGZbMV1bMV1bMV0pID4+IDE7CisJCQl9CisKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCAyOyBpKyspCisJCQl7CisJCQkJZm9yKGludCBqID0gMDsgaiA8IDI7IGorKykKKwkJCQl7CisJCQkJCWZvcihpbnQgayA9IDA7IGsgPCAyOyBrKyspCisJCQkJCXsKKwkJCQkJCXNhbXBsZVRleGVsKGNbaV1bal1ba10sIHVbaV1bal1ba10sIHZbaV1bal1ba10sIHNbaV1bal1ba10sIG1pcG1hcCwgYnVmZmVyKTsKKworCQkJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMSkgaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDApKSBjW2ldW2pdW2tdLnIgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGNbaV1bal1ba10uciksIEFzPFVTaG9ydDQ+KGZbMSAtIGldWzEgLSBqXVsxIC0ga10pKTsgZWxzZSBjW2ldW2pdW2tdLnIgPSBNdWxIaWdoKGNbaV1bal1ba10uciwgZnNbMSAtIGldWzEgLSBqXVsxIC0ga10pOworCQkJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMikgaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDEpKSBjW2ldW2pdW2tdLmcgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGNbaV1bal1ba10uZyksIEFzPFVTaG9ydDQ+KGZbMSAtIGldWzEgLSBqXVsxIC0ga10pKTsgZWxzZSBjW2ldW2pdW2tdLmcgPSBNdWxIaWdoKGNbaV1bal1ba10uZywgZnNbMSAtIGldWzEgLSBqXVsxIC0ga10pOworCQkJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMykgaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDIpKSBjW2ldW2pdW2tdLmIgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGNbaV1bal1ba10uYiksIEFzPFVTaG9ydDQ+KGZbMSAtIGldWzEgLSBqXVsxIC0ga10pKTsgZWxzZSBjW2ldW2pdW2tdLmIgPSBNdWxIaWdoKGNbaV1bal1ba10uYiwgZnNbMSAtIGldWzEgLSBqXVsxIC0ga10pOworCQkJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gNCkgaWYoaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDMpKSBjW2ldW2pdW2tdLmEgPSBNdWxIaWdoKEFzPFVTaG9ydDQ+KGNbaV1bal1ba10uYSksIEFzPFVTaG9ydDQ+KGZbMSAtIGldWzEgLSBqXVsxIC0ga10pKTsgZWxzZSBjW2ldW2pdW2tdLmEgPSBNdWxIaWdoKGNbaV1bal1ba10uYSwgZnNbMSAtIGldWzEgLSBqXVsxIC0ga10pOworCisJCQkJCQlpZihpICE9IDAgfHwgaiAhPSAwIHx8IGsgIT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlpZihjb21wb25lbnRDb3VudCA+PSAxKSBjWzBdWzBdWzBdLnIgKz0gY1tpXVtqXVtrXS5yOworCQkJCQkJCWlmKGNvbXBvbmVudENvdW50ID49IDIpIGNbMF1bMF1bMF0uZyArPSBjW2ldW2pdW2tdLmc7CisJCQkJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMykgY1swXVswXVswXS5iICs9IGNbaV1bal1ba10uYjsKKwkJCQkJCQlpZihjb21wb25lbnRDb3VudCA+PSA0KSBjWzBdWzBdWzBdLmEgKz0gY1tpXVtqXVtrXS5hOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZihjb21wb25lbnRDb3VudCA+PSAxKSBjXy5yID0gY1swXVswXVswXS5yOworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMikgY18uZyA9IGNbMF1bMF1bMF0uZzsKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDMpIGNfLmIgPSBjWzBdWzBdWzBdLmI7CisJCQlpZihjb21wb25lbnRDb3VudCA+PSA0KSBjXy5hID0gY1swXVswXVswXS5hOworCisJCQkvLyBDb3JyZWN0IGZvciBzaWduZWQgZnJhY3Rpb25zCisJCQlpZihjb21wb25lbnRDb3VudCA+PSAxKSBpZighaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDApKSBjXy5yID0gQWRkU2F0KGNfLnIsIGNfLnIpOworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMikgaWYoIWhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudCgxKSkgY18uZyA9IEFkZFNhdChjXy5nLCBjXy5nKTsKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDMpIGlmKCFoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoMikpIGNfLmIgPSBBZGRTYXQoY18uYiwgY18uYik7CisJCQlpZihjb21wb25lbnRDb3VudCA+PSA0KSBpZighaGFzVW5zaWduZWRUZXh0dXJlQ29tcG9uZW50KDMpKSBjXy5hID0gQWRkU2F0KGNfLmEsIGNfLmEpOworCQl9CisJfQorCisJdm9pZCBTYW1wbGVyQ29yZTo6c2FtcGxlRmxvYXRGaWx0ZXIoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgQ29sb3I0ZiAmYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmdywgRmxvYXQgJmxvZCwgRmxvYXQgJmFuaXNvdHJvcHksIEZsb2F0NCAmdURlbHRhLCBGbG9hdDQgJnZEZWx0YSwgSW50IGZhY2VbNF0sIGJvb2wgbG9kUHJvdmlkZWQpCisJeworCQlib29sIHZvbHVtZVRleHR1cmUgPSBzdGF0ZS50ZXh0dXJlVHlwZSA9PSBURVhUVVJFXzNEOworCisJCXNhbXBsZUZsb2F0QW5pc28odGV4dHVyZSwgYywgdSwgdiwgdywgbG9kLCBhbmlzb3Ryb3B5LCB1RGVsdGEsIHZEZWx0YSwgZmFjZSwgZmFsc2UsIGxvZFByb3ZpZGVkKTsKKworCQlpZihzdGF0ZS5taXBtYXBGaWx0ZXIgPiBNSVBNQVBfUE9JTlQpCisJCXsKKwkJCUNvbG9yNGYgY2M7CisKKwkJCXNhbXBsZUZsb2F0QW5pc28odGV4dHVyZSwgY2MsIHUsIHYsIHcsIGxvZCwgYW5pc290cm9weSwgdURlbHRhLCB2RGVsdGEsIGZhY2UsIHRydWUsIGxvZFByb3ZpZGVkKTsKKworCQkJRmxvYXQ0IGxvZDQgPSBGbG9hdDQoRnJhY3Rpb24obG9kKSk7CisKKwkJCWMuciA9IChjYy5yIC0gYy5yKSAqIGxvZDQgKyBjLnI7CisJCQljLmcgPSAoY2MuZyAtIGMuZykgKiBsb2Q0ICsgYy5nOworCQkJYy5iID0gKGNjLmIgLSBjLmIpICogbG9kNCArIGMuYjsKKwkJCWMuYSA9IChjYy5hIC0gYy5hKSAqIGxvZDQgKyBjLmE7CisJCX0KKworCQlJbnQ0IGJvcmRlck1hc2s7CisKKwkJaWYoKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVSA9PSBBRERSRVNTSU5HX0JPUkRFUikKKwkJeworCQkJSW50NCB1MDsKKwkJCQorCQkJYm9yZGVyKHUwLCB1KTsKKworCQkJYm9yZGVyTWFzayA9IHUwOworCQl9CisKKwkJaWYoKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX0JPUkRFUikKKwkJeworCQkJSW50NCB2MDsKKwkJCQorCQkJYm9yZGVyKHYwLCB2KTsKKworCQkJaWYoKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVSA9PSBBRERSRVNTSU5HX0JPUkRFUikKKwkJCXsKKwkJCQlib3JkZXJNYXNrICY9IHYwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJvcmRlck1hc2sgPSB2MDsKKwkJCX0KKwkJfQorCisJCWlmKChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVcgPT0gQUREUkVTU0lOR19CT1JERVIgJiYgdm9sdW1lVGV4dHVyZSkKKwkJeworCQkJSW50NCBzMDsKKworCQkJYm9yZGVyKHMwLCB3KTsKKworCQkJaWYoKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVSA9PSBBRERSRVNTSU5HX0JPUkRFUiB8fAorCQkJICAgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX0JPUkRFUikKKwkJCXsKKwkJCQlib3JkZXJNYXNrICY9IHMwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJvcmRlck1hc2sgPSBzMDsKKwkJCX0KKwkJfQorCisJCWlmKChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVUgPT0gQUREUkVTU0lOR19CT1JERVIgfHwKKwkJICAgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX0JPUkRFUiB8fAorCQkgICAoKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVyA9PSBBRERSRVNTSU5HX0JPUkRFUiAmJiB2b2x1bWVUZXh0dXJlKSkKKwkJeworCQkJSW50NCBiOworCisJCQljLnIgPSBBczxGbG9hdDQ+KGJvcmRlck1hc2sgJiBBczxJbnQ0PihjLnIpIHwgfmJvcmRlck1hc2sgJiAqUG9pbnRlcjxJbnQ0Pih0ZXh0dXJlICsgT0ZGU0VUKFRleHR1cmUsYm9yZGVyQ29sb3JGWzBdKSkpOworCQkJYy5nID0gQXM8RmxvYXQ0Pihib3JkZXJNYXNrICYgQXM8SW50ND4oYy5nKSB8IH5ib3JkZXJNYXNrICYgKlBvaW50ZXI8SW50ND4odGV4dHVyZSArIE9GRlNFVChUZXh0dXJlLGJvcmRlckNvbG9yRlsxXSkpKTsKKwkJCWMuYiA9IEFzPEZsb2F0ND4oYm9yZGVyTWFzayAmIEFzPEludDQ+KGMuYikgfCB+Ym9yZGVyTWFzayAmICpQb2ludGVyPEludDQ+KHRleHR1cmUgKyBPRkZTRVQoVGV4dHVyZSxib3JkZXJDb2xvckZbMl0pKSk7CisJCQljLmEgPSBBczxGbG9hdDQ+KGJvcmRlck1hc2sgJiBBczxJbnQ0PihjLmEpIHwgfmJvcmRlck1hc2sgJiAqUG9pbnRlcjxJbnQ0Pih0ZXh0dXJlICsgT0ZGU0VUKFRleHR1cmUsYm9yZGVyQ29sb3JGWzNdKSkpOworCQl9CisJfQorCisJdm9pZCBTYW1wbGVyQ29yZTo6c2FtcGxlRmxvYXRBbmlzbyhQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBDb2xvcjRmICZjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdCAmbG9kLCBGbG9hdCAmYW5pc290cm9weSwgRmxvYXQ0ICZ1RGVsdGEsIEZsb2F0NCAmdkRlbHRhLCBJbnQgZmFjZVs0XSwgYm9vbCBzZWNvbmRMT0QsIGJvb2wgbG9kUHJvdmlkZWQpCisJeworCQlpZihzdGF0ZS50ZXh0dXJlRmlsdGVyICE9IEZJTFRFUl9BTklTT1RST1BJQyB8fCBsb2RQcm92aWRlZCkKKwkJeworCQkJc2FtcGxlRmxvYXQodGV4dHVyZSwgYywgdSwgdiwgdywgbG9kLCBmYWNlLCBzZWNvbmRMT0QpOworCQl9CisJCWVsc2UKKwkJeworCQkJSW50IGEgPSBSb3VuZEludChhbmlzb3Ryb3B5KTsKKworCQkJQ29sb3I0ZiBjU3VtOworCisJCQljU3VtLnIgPSBGbG9hdDQoMCwgMCwgMCwgMCk7CisJCQljU3VtLmcgPSBGbG9hdDQoMCwgMCwgMCwgMCk7CisJCQljU3VtLmIgPSBGbG9hdDQoMCwgMCwgMCwgMCk7CisJCQljU3VtLmEgPSBGbG9hdDQoMCwgMCwgMCwgMCk7CisKKwkJCUZsb2F0NCBBID0gKlBvaW50ZXI8RmxvYXQ0Pihjb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLHV2V2VpZ2h0KSArIDE2ICogYSk7CisJCQlGbG9hdDQgQiA9ICpQb2ludGVyPEZsb2F0ND4oY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1dlN0YXJ0KSArIDE2ICogYSk7CisKKwkJCUZsb2F0NCBkdSA9IHVEZWx0YTsKKwkJCUZsb2F0NCBkdiA9IHZEZWx0YTsKKworCQkJRmxvYXQ0IHUwID0gdSArIEIgKiBkdTsKKwkJCUZsb2F0NCB2MCA9IHYgKyBCICogZHY7CisKKwkJCWR1ICo9IEE7CisJCQlkdiAqPSBBOworCisJCQlJbnQgaSA9IDA7CisKKwkJCURvCisJCQl7CisJCQkJc2FtcGxlRmxvYXQodGV4dHVyZSwgYywgdTAsIHYwLCB3LCBsb2QsIGZhY2UsIHNlY29uZExPRCk7CisKKwkJCQl1MCArPSBkdTsKKwkJCQl2MCArPSBkdjsKKworCQkJCWNTdW0uciArPSBjLnIgKiBBOworCQkJCWNTdW0uZyArPSBjLmcgKiBBOworCQkJCWNTdW0uYiArPSBjLmIgKiBBOworCQkJCWNTdW0uYSArPSBjLmEgKiBBOworCisJCQkJaSsrOworCQkJfQorCQkJVW50aWwoaSA+PSBhKQorCisJCQljLnIgPSBjU3VtLnI7CisJCQljLmcgPSBjU3VtLmc7CisJCQljLmIgPSBjU3VtLmI7CisJCQljLmEgPSBjU3VtLmE7CisJCX0KKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpzYW1wbGVGbG9hdChQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBDb2xvcjRmICZjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdCAmbG9kLCBJbnQgZmFjZVs0XSwgYm9vbCBzZWNvbmRMT0QpCisJeworCQlpZihzdGF0ZS50ZXh0dXJlVHlwZSAhPSBURVhUVVJFXzNEKQorCQl7CisJCQlzYW1wbGVGbG9hdDJEKHRleHR1cmUsIGMsIHUsIHYsIHcsIGxvZCwgZmFjZSwgc2Vjb25kTE9EKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXNhbXBsZUZsb2F0M0QodGV4dHVyZSwgYywgdSwgdiwgdywgbG9kLCBzZWNvbmRMT0QpOworCQl9CisJfQorCQorCXZvaWQgU2FtcGxlckNvcmU6OnNhbXBsZUZsb2F0MkQoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgQ29sb3I0ZiAmYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmeiwgRmxvYXQgJmxvZCwgSW50IGZhY2VbNF0sIGJvb2wgc2Vjb25kTE9EKQorCXsKKwkJaW50IGNvbXBvbmVudENvdW50ID0gdGV4dHVyZUNvbXBvbmVudENvdW50KCk7CisJCWJvb2wgZ2F0aGVyID0gc3RhdGUudGV4dHVyZUZpbHRlciA9PSBGSUxURVJfR0FUSEVSOworCisJCVBvaW50ZXI8Qnl0ZT4gbWlwbWFwOworCQlQb2ludGVyPEJ5dGU+IGJ1ZmZlcls0XTsKKwkJCisJCXNlbGVjdE1pcG1hcCh0ZXh0dXJlLCBidWZmZXIsIG1pcG1hcCwgbG9kLCBmYWNlLCBzZWNvbmRMT0QpOworCisJCVNob3J0NCB1dXV1OworCQlTaG9ydDQgdnZ2djsKKworCQlhZGRyZXNzKHV1dXUsIHUsIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVUpOworCQlhZGRyZXNzKHZ2dnYsIHYsIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVYpOworCisJCWlmKHN0YXRlLnRleHR1cmVGaWx0ZXIgPT0gRklMVEVSX1BPSU5UKQorCQl7CisJCQlzYW1wbGVUZXhlbChjLCB1dXV1LCB2dnZ2LCB2dnZ2LCB6LCBtaXBtYXAsIGJ1ZmZlcik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlDb2xvcjRmIGMwOworCQkJQ29sb3I0ZiBjMTsKKwkJCUNvbG9yNGYgYzI7CisJCQlDb2xvcjRmIGMzOworCisJCQlTaG9ydDQgdXV1dTAgPSBvZmZzZXRTYW1wbGUodXV1dSwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHVIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVSA9PSBBRERSRVNTSU5HX1dSQVAsIGdhdGhlciA/IDAgOiAtMSk7CisJCQlTaG9ydDQgdnZ2djAgPSBvZmZzZXRTYW1wbGUodnZ2diwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHZIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX1dSQVAsIGdhdGhlciA/IDAgOiAtMSk7CisJCQlTaG9ydDQgdXV1dTEgPSBvZmZzZXRTYW1wbGUodXV1dSwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHVIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlVSA9PSBBRERSRVNTSU5HX1dSQVAsIGdhdGhlciA/IDIgOiArMSk7CisJCQlTaG9ydDQgdnZ2djEgPSBvZmZzZXRTYW1wbGUodnZ2diwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHZIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX1dSQVAsIGdhdGhlciA/IDIgOiArMSk7CisKKwkJCXNhbXBsZVRleGVsKGMwLCB1dXV1MCwgdnZ2djAsIHZ2dnYwLCB6LCBtaXBtYXAsIGJ1ZmZlcik7CQkKKwkJCXNhbXBsZVRleGVsKGMxLCB1dXV1MSwgdnZ2djAsIHZ2dnYwLCB6LCBtaXBtYXAsIGJ1ZmZlcik7CisJCQlzYW1wbGVUZXhlbChjMiwgdXV1dTAsIHZ2dnYxLCB2dnZ2MSwgeiwgbWlwbWFwLCBidWZmZXIpOworCQkJc2FtcGxlVGV4ZWwoYzMsIHV1dXUxLCB2dnZ2MSwgdnZ2djEsIHosIG1pcG1hcCwgYnVmZmVyKTsKKworCQkJaWYoIWdhdGhlcikgICAvLyBCbGVuZAorCQkJeworCQkJCS8vIEZyYWN0aW9ucworCQkJCUZsb2F0NCBmdSA9IEZyYWN0aW9uKEZsb2F0NChBczxVU2hvcnQ0Pih1dXV1MCkpICogKlBvaW50ZXI8RmxvYXQ0PihtaXBtYXAgKyBPRkZTRVQoTWlwbWFwLGZXaWR0aCkpKTsKKwkJCQlGbG9hdDQgZnYgPSBGcmFjdGlvbihGbG9hdDQoQXM8VVNob3J0ND4odnZ2djApKSAqICpQb2ludGVyPEZsb2F0ND4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCxmSGVpZ2h0KSkpOworCisJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMSkgYzAuciA9IGMwLnIgKyBmdSAqIChjMS5yIC0gYzAucik7CisJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMikgYzAuZyA9IGMwLmcgKyBmdSAqIChjMS5nIC0gYzAuZyk7CisJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMykgYzAuYiA9IGMwLmIgKyBmdSAqIChjMS5iIC0gYzAuYik7CisJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gNCkgYzAuYSA9IGMwLmEgKyBmdSAqIChjMS5hIC0gYzAuYSk7CisKKwkJCQlpZihjb21wb25lbnRDb3VudCA+PSAxKSBjMi5yID0gYzIuciArIGZ1ICogKGMzLnIgLSBjMi5yKTsKKwkJCQlpZihjb21wb25lbnRDb3VudCA+PSAyKSBjMi5nID0gYzIuZyArIGZ1ICogKGMzLmcgLSBjMi5nKTsKKwkJCQlpZihjb21wb25lbnRDb3VudCA+PSAzKSBjMi5iID0gYzIuYiArIGZ1ICogKGMzLmIgLSBjMi5iKTsKKwkJCQlpZihjb21wb25lbnRDb3VudCA+PSA0KSBjMi5hID0gYzIuYSArIGZ1ICogKGMzLmEgLSBjMi5hKTsKKworCQkJCWlmKGNvbXBvbmVudENvdW50ID49IDEpIGMuciA9IGMwLnIgKyBmdiAqIChjMi5yIC0gYzAucik7CisJCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMikgYy5nID0gYzAuZyArIGZ2ICogKGMyLmcgLSBjMC5nKTsKKwkJCQlpZihjb21wb25lbnRDb3VudCA+PSAzKSBjLmIgPSBjMC5iICsgZnYgKiAoYzIuYiAtIGMwLmIpOworCQkJCWlmKGNvbXBvbmVudENvdW50ID49IDQpIGMuYSA9IGMwLmEgKyBmdiAqIChjMi5hIC0gYzAuYSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYy5yID0gYzEucjsKKwkJCQljLmcgPSBjMi5yOworCQkJCWMuYiA9IGMzLnI7CisJCQkJYy5hID0gYzAucjsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgU2FtcGxlckNvcmU6OnNhbXBsZUZsb2F0M0QoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgQ29sb3I0ZiAmYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmdywgRmxvYXQgJmxvZCwgYm9vbCBzZWNvbmRMT0QpCisJeworCQlpbnQgY29tcG9uZW50Q291bnQgPSB0ZXh0dXJlQ29tcG9uZW50Q291bnQoKTsKKworCQlQb2ludGVyPEJ5dGU+IG1pcG1hcDsKKwkJUG9pbnRlcjxCeXRlPiBidWZmZXJbNF07CisJCUludCBmYWNlWzRdOworCisJCXNlbGVjdE1pcG1hcCh0ZXh0dXJlLCBidWZmZXIsIG1pcG1hcCwgbG9kLCBmYWNlLCBzZWNvbmRMT0QpOworCisJCVNob3J0NCB1dXV1OworCQlTaG9ydDQgdnZ2djsKKwkJU2hvcnQ0IHd3d3c7CisKKwkJYWRkcmVzcyh1dXV1LCB1LCAoQWRkcmVzc2luZ01vZGUpc3RhdGUuYWRkcmVzc2luZ01vZGVVKTsKKwkJYWRkcmVzcyh2dnZ2LCB2LCAoQWRkcmVzc2luZ01vZGUpc3RhdGUuYWRkcmVzc2luZ01vZGVWKTsKKwkJYWRkcmVzcyh3d3d3LCB3LCAoQWRkcmVzc2luZ01vZGUpc3RhdGUuYWRkcmVzc2luZ01vZGVXKTsKKworCQlpZihzdGF0ZS50ZXh0dXJlRmlsdGVyIDw9IEZJTFRFUl9QT0lOVCkKKwkJeworCQkJc2FtcGxlVGV4ZWwoYywgdXV1dSwgdnZ2diwgd3d3dywgdywgbWlwbWFwLCBidWZmZXIpOworCQl9CisJCWVsc2UKKwkJeworCQkJQ29sb3I0ZiAmYzAgPSBjOworCQkJQ29sb3I0ZiBjMTsKKwkJCUNvbG9yNGYgYzI7CisJCQlDb2xvcjRmIGMzOworCQkJQ29sb3I0ZiBjNDsKKwkJCUNvbG9yNGYgYzU7CisJCQlDb2xvcjRmIGM2OworCQkJQ29sb3I0ZiBjNzsKKworCQkJU2hvcnQ0IHV1dXUwID0gb2Zmc2V0U2FtcGxlKHV1dXUsIG1pcG1hcCwgT0ZGU0VUKE1pcG1hcCx1SGFsZiksIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVUgPT0gQUREUkVTU0lOR19XUkFQLCAtMSk7CisJCQlTaG9ydDQgdnZ2djAgPSBvZmZzZXRTYW1wbGUodnZ2diwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHZIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX1dSQVAsIC0xKTsKKwkJCVNob3J0NCB3d3d3MCA9IG9mZnNldFNhbXBsZSh3d3d3LCBtaXBtYXAsIE9GRlNFVChNaXBtYXAsd0hhbGYpLCAoQWRkcmVzc2luZ01vZGUpc3RhdGUuYWRkcmVzc2luZ01vZGVXID09IEFERFJFU1NJTkdfV1JBUCwgLTEpOworCQkJU2hvcnQ0IHV1dXUxID0gb2Zmc2V0U2FtcGxlKHV1dXUsIG1pcG1hcCwgT0ZGU0VUKE1pcG1hcCx1SGFsZiksIChBZGRyZXNzaW5nTW9kZSlzdGF0ZS5hZGRyZXNzaW5nTW9kZVUgPT0gQUREUkVTU0lOR19XUkFQLCArMSk7CisJCQlTaG9ydDQgdnZ2djEgPSBvZmZzZXRTYW1wbGUodnZ2diwgbWlwbWFwLCBPRkZTRVQoTWlwbWFwLHZIYWxmKSwgKEFkZHJlc3NpbmdNb2RlKXN0YXRlLmFkZHJlc3NpbmdNb2RlViA9PSBBRERSRVNTSU5HX1dSQVAsICsxKTsKKwkJCVNob3J0NCB3d3d3MSA9IG9mZnNldFNhbXBsZSh3d3d3LCBtaXBtYXAsIE9GRlNFVChNaXBtYXAsd0hhbGYpLCAoQWRkcmVzc2luZ01vZGUpc3RhdGUuYWRkcmVzc2luZ01vZGVXID09IEFERFJFU1NJTkdfV1JBUCwgKzEpOworCisJCQlzYW1wbGVUZXhlbChjMCwgdXV1dTAsIHZ2dnYwLCB3d3d3MCwgdywgbWlwbWFwLCBidWZmZXIpOworCQkJc2FtcGxlVGV4ZWwoYzEsIHV1dXUxLCB2dnZ2MCwgd3d3dzAsIHcsIG1pcG1hcCwgYnVmZmVyKTsKKwkJCXNhbXBsZVRleGVsKGMyLCB1dXV1MCwgdnZ2djEsIHd3d3cwLCB3LCBtaXBtYXAsIGJ1ZmZlcik7CisJCQlzYW1wbGVUZXhlbChjMywgdXV1dTEsIHZ2dnYxLCB3d3d3MCwgdywgbWlwbWFwLCBidWZmZXIpOworCQkJc2FtcGxlVGV4ZWwoYzQsIHV1dXUwLCB2dnZ2MCwgd3d3dzEsIHcsIG1pcG1hcCwgYnVmZmVyKTsKKwkJCXNhbXBsZVRleGVsKGM1LCB1dXV1MSwgdnZ2djAsIHd3d3cxLCB3LCBtaXBtYXAsIGJ1ZmZlcik7CisJCQlzYW1wbGVUZXhlbChjNiwgdXV1dTAsIHZ2dnYxLCB3d3d3MSwgdywgbWlwbWFwLCBidWZmZXIpOworCQkJc2FtcGxlVGV4ZWwoYzcsIHV1dXUxLCB2dnZ2MSwgd3d3dzEsIHcsIG1pcG1hcCwgYnVmZmVyKTsKKworCQkJLy8gRnJhY3Rpb25zCisJCQlGbG9hdDQgZnUgPSBGcmFjdGlvbihGbG9hdDQoQXM8VVNob3J0ND4odXV1dTApKSAqICpQb2ludGVyPEZsb2F0ND4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCxmV2lkdGgpKSk7CisJCQlGbG9hdDQgZnYgPSBGcmFjdGlvbihGbG9hdDQoQXM8VVNob3J0ND4odnZ2djApKSAqICpQb2ludGVyPEZsb2F0ND4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCxmSGVpZ2h0KSkpOworCQkJRmxvYXQ0IGZ3ID0gRnJhY3Rpb24oRmxvYXQ0KEFzPFVTaG9ydDQ+KHd3d3cwKSkgKiAqUG9pbnRlcjxGbG9hdDQ+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsZkRlcHRoKSkpOworCisJCQkvLyBCbGVuZCBmaXJzdCBzbGljZQorCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMSkgYzAuciA9IGMwLnIgKyBmdSAqIChjMS5yIC0gYzAucik7CisJCQlpZihjb21wb25lbnRDb3VudCA+PSAyKSBjMC5nID0gYzAuZyArIGZ1ICogKGMxLmcgLSBjMC5nKTsKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDMpIGMwLmIgPSBjMC5iICsgZnUgKiAoYzEuYiAtIGMwLmIpOworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gNCkgYzAuYSA9IGMwLmEgKyBmdSAqIChjMS5hIC0gYzAuYSk7CisKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDEpIGMyLnIgPSBjMi5yICsgZnUgKiAoYzMuciAtIGMyLnIpOworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMikgYzIuZyA9IGMyLmcgKyBmdSAqIChjMy5nIC0gYzIuZyk7CisJCQlpZihjb21wb25lbnRDb3VudCA+PSAzKSBjMi5iID0gYzIuYiArIGZ1ICogKGMzLmIgLSBjMi5iKTsKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDQpIGMyLmEgPSBjMi5hICsgZnUgKiAoYzMuYSAtIGMyLmEpOworCisJCQlpZihjb21wb25lbnRDb3VudCA+PSAxKSBjMC5yID0gYzAuciArIGZ2ICogKGMyLnIgLSBjMC5yKTsKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDIpIGMwLmcgPSBjMC5nICsgZnYgKiAoYzIuZyAtIGMwLmcpOworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMykgYzAuYiA9IGMwLmIgKyBmdiAqIChjMi5iIC0gYzAuYik7CisJCQlpZihjb21wb25lbnRDb3VudCA+PSA0KSBjMC5hID0gYzAuYSArIGZ2ICogKGMyLmEgLSBjMC5hKTsKKworCQkJLy8gQmxlbmQgc2Vjb25kIHNsaWNlCisJCQlpZihjb21wb25lbnRDb3VudCA+PSAxKSBjNC5yID0gYzQuciArIGZ1ICogKGM1LnIgLSBjNC5yKTsKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDIpIGM0LmcgPSBjNC5nICsgZnUgKiAoYzUuZyAtIGM0LmcpOworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMykgYzQuYiA9IGM0LmIgKyBmdSAqIChjNS5iIC0gYzQuYik7CisJCQlpZihjb21wb25lbnRDb3VudCA+PSA0KSBjNC5hID0gYzQuYSArIGZ1ICogKGM1LmEgLSBjNC5hKTsKKworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMSkgYzYuciA9IGM2LnIgKyBmdSAqIChjNy5yIC0gYzYucik7CisJCQlpZihjb21wb25lbnRDb3VudCA+PSAyKSBjNi5nID0gYzYuZyArIGZ1ICogKGM3LmcgLSBjNi5nKTsKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDMpIGM2LmIgPSBjNi5iICsgZnUgKiAoYzcuYiAtIGM2LmIpOworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gNCkgYzYuYSA9IGM2LmEgKyBmdSAqIChjNy5hIC0gYzYuYSk7CisKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDEpIGM0LnIgPSBjNC5yICsgZnYgKiAoYzYuciAtIGM0LnIpOworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMikgYzQuZyA9IGM0LmcgKyBmdiAqIChjNi5nIC0gYzQuZyk7CisJCQlpZihjb21wb25lbnRDb3VudCA+PSAzKSBjNC5iID0gYzQuYiArIGZ2ICogKGM2LmIgLSBjNC5iKTsKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDQpIGM0LmEgPSBjNC5hICsgZnYgKiAoYzYuYSAtIGM0LmEpOworCisJCQkvLyBCbGVuZCBzbGljZXMKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDEpIGMwLnIgPSBjMC5yICsgZncgKiAoYzQuciAtIGMwLnIpOworCQkJaWYoY29tcG9uZW50Q291bnQgPj0gMikgYzAuZyA9IGMwLmcgKyBmdyAqIChjNC5nIC0gYzAuZyk7CisJCQlpZihjb21wb25lbnRDb3VudCA+PSAzKSBjMC5iID0gYzAuYiArIGZ3ICogKGM0LmIgLSBjMC5iKTsKKwkJCWlmKGNvbXBvbmVudENvdW50ID49IDQpIGMwLmEgPSBjMC5hICsgZncgKiAoYzQuYSAtIGMwLmEpOworCQl9CisJfQorCisJdm9pZCBTYW1wbGVyQ29yZTo6Y29tcHV0ZUxvZChQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBGbG9hdCAmbG9kLCBGbG9hdCAmYW5pc290cm9weSwgRmxvYXQ0ICZ1RGVsdGEsIEZsb2F0NCAmdkRlbHRhLCBGbG9hdDQgJnV1dXUsIEZsb2F0NCAmdnZ2diwgRmxvYXQgJmxvZEJpYXMsIENvbG9yNGYgJmRzeCwgQ29sb3I0ZiAmZHN5LCBib29sIGJpYXMsIGJvb2wgZ3JhZGllbnRzLCBib29sIGxvZFByb3ZpZGVkKQorCXsKKwkJaWYoIWxvZFByb3ZpZGVkKQorCQl7CisJCQlGbG9hdDQgZHV2ZHh5OworCisJCQlpZighZ3JhZGllbnRzKQorCQkJeworCQkJCWR1dmR4eSA9IEZsb2F0NCh1dXV1Lnl6LCB2dnZ2Lnl6KSAtIEZsb2F0NCh1dXV1Lnh4LCB2dnZ2Lnh4KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlGbG9hdDQgZHVkeHkgPSBGbG9hdDQoZHN4LngueHgsIGRzeS54Lnh4KTsKKwkJCQlGbG9hdDQgZHZkeHkgPSBGbG9hdDQoZHN4LnkueHgsIGRzeS55Lnh4KTsKKwkJCQkKKwkJCQlkdXZkeHkgPSBGbG9hdDQoZHVkeHkueHosIGR2ZHh5Lnh6KTsKKwkJCX0KKworCQkJLy8gU2NhbGUgYnkgdGV4dHVyZSBkaW1lbnNpb25zIGFuZCBMT0QKKwkJCUZsb2F0NCBkVVZkeHkgPSBkdXZkeHkgKiAqUG9pbnRlcjxGbG9hdDQ+KHRleHR1cmUgKyBPRkZTRVQoVGV4dHVyZSx3aWR0aEhlaWdodExPRCkpOworCisJCQlGbG9hdDQgZFVWMmR4eSA9IGRVVmR4eSAqIGRVVmR4eTsKKwkJCUZsb2F0NCBkVVYyID0gZFVWMmR4eS54eSArIGRVVjJkeHkuenc7CisKKwkJCWxvZCA9IE1heChGbG9hdChkVVYyLngpLCBGbG9hdChkVVYyLnkpKTsgICAvLyBTcXVhcmUgbGVuZ3RoIG9mIG1ham9yIGF4aXMKKworCQkJaWYoc3RhdGUudGV4dHVyZUZpbHRlciA9PSBGSUxURVJfQU5JU09UUk9QSUMpCisJCQl7CisJCQkJRmxvYXQgZGV0ID0gQWJzKEZsb2F0KGRVVmR4eS54KSAqIEZsb2F0KGRVVmR4eS53KSAtIEZsb2F0KGRVVmR4eS55KSAqIEZsb2F0KGRVVmR4eS56KSk7CisKKwkJCQlGbG9hdDQgZHVkeCA9IGR1dmR4eS54eHh4OworCQkJCUZsb2F0NCBkdWR5ID0gZHV2ZHh5Lnl5eXk7CisJCQkJRmxvYXQ0IGR2ZHggPSBkdXZkeHkuenp6ejsKKwkJCQlGbG9hdDQgZHZkeSA9IGR1dmR4eS53d3d3OworCisJCQkJSW50NCBtYXNrID0gQXM8SW50ND4oQ21wTkxUKGRVVjIueCwgZFVWMi55KSk7CisJCQkJdURlbHRhID0gQXM8RmxvYXQ0PihBczxJbnQ0PihkdWR4KSAmIG1hc2sgfCBBczxJbnQ0PihkdWR5KSAmIH5tYXNrKTsKKwkJCQl2RGVsdGEgPSBBczxGbG9hdDQ+KEFzPEludDQ+KGR2ZHgpICYgbWFzayB8IEFzPEludDQ+KGR2ZHkpICYgfm1hc2spOworCisJCQkJYW5pc290cm9weSA9IGxvZCAqIFJjcF9wcChkZXQpOworCQkJCWFuaXNvdHJvcHkgPSBNaW4oYW5pc290cm9weSwgKlBvaW50ZXI8RmxvYXQ+KHRleHR1cmUgKyBPRkZTRVQoVGV4dHVyZSxtYXhBbmlzb3Ryb3B5KSkpOworCisJCQkJbG9kICo9IFJjcF9wcChhbmlzb3Ryb3B5ICogYW5pc290cm9weSk7CisJCQl9CisKKwkJCS8vIGxvZzIoc3FydChsb2QpKQorCQkJbG9kID0gRmxvYXQoQXM8SW50Pihsb2QpKTsKKwkJCWxvZCAtPSBGbG9hdCgweDNGODAwMDAwKTsKKwkJCWxvZCAqPSBBczxGbG9hdD4oSW50KDB4MzM4MDAwMDApKTsKKworCQkJaWYoYmlhcykKKwkJCXsKKwkJCQlsb2QgKz0gbG9kQmlhczsKKwkJCX0KKworCQkJLy8gRklYTUU6IEhhY2sgdG8gc2F0aXNmeSBXSFFMCisJCQlpZihzdGF0ZS50ZXh0dXJlVHlwZSA9PSBURVhUVVJFX0NVQkUpCisJCQl7CisJCQkJbG9kICs9IEZsb2F0KC0wLjE1Zik7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlsb2QgPSBsb2RCaWFzICsgKlBvaW50ZXI8RmxvYXQ+KHRleHR1cmUgKyBPRkZTRVQoVGV4dHVyZSxMT0QpKTsKKwkJfQorCisJCWxvZCA9IE1heChsb2QsIEZsb2F0KDApKTsKKwkJbG9kID0gTWluKGxvZCwgRmxvYXQoTUlQTUFQX0xFVkVMUyAtIDIpKTsgICAvLyBUcmlsaW5lYXIgYWNjZXNzZXMgbG9kKzEKKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpjb21wdXRlTG9kM0QoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgRmxvYXQgJmxvZCwgRmxvYXQ0ICZ1dXV1LCBGbG9hdDQgJnZ2dnYsIEZsb2F0NCAmd3d3dywgRmxvYXQgJmxvZEJpYXMsIENvbG9yNGYgJmRzeCwgQ29sb3I0ZiAmZHN5LCBib29sIGJpYXMsIGJvb2wgZ3JhZGllbnRzLCBib29sIGxvZFByb3ZpZGVkKQorCXsKKwkJaWYoc3RhdGUubWlwbWFwRmlsdGVyID09IE1JUE1BUF9OT05FKQorCQl7CisJCX0KKwkJZWxzZSAgIC8vIFBvaW50IGFuZCBsaW5lYXIgZmlsdGVyCisJCXsKKwkJCWlmKCFsb2RQcm92aWRlZCkKKwkJCXsKKwkJCQlGbG9hdDQgZHVkeHk7CisJCQkJRmxvYXQ0IGR2ZHh5OworCQkJCUZsb2F0NCBkc2R4eTsKKworCQkJCWlmKCFncmFkaWVudHMpCisJCQkJeworCQkJCQlkdWR4eSA9IHV1dXUueXd5dyAtIHV1dXU7CisJCQkJCWR2ZHh5ID0gdnZ2di55d3l3IC0gdnZ2djsKKwkJCQkJZHNkeHkgPSB3d3d3Lnl3eXcgLSB3d3d3OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlkdWR4eSA9IGRzeC54OworCQkJCQlkdmR4eSA9IGRzeC55OworCQkJCQlkc2R4eSA9IGRzeC56OworCisJCQkJCWR1ZHh5ID0gRmxvYXQ0KGR1ZHh5Lnh4LCBkc3kueC54eCk7CisJCQkJCWR2ZHh5ID0gRmxvYXQ0KGR2ZHh5Lnh4LCBkc3kueS54eCk7CisJCQkJCWRzZHh5ID0gRmxvYXQ0KGRzZHh5Lnh4LCBkc3kuei54eCk7CisKKwkJCQkJZHVkeHkgPSBGbG9hdDQoZHVkeHkueHosIGR1ZHh5Lnh6KTsKKwkJCQkJZHZkeHkgPSBGbG9hdDQoZHZkeHkueHosIGR2ZHh5Lnh6KTsKKwkJCQkJZHNkeHkgPSBGbG9hdDQoZHNkeHkueHosIGRzZHh5Lnh6KTsKKwkJCQl9CisKKwkJCQkvLyBTY2FsZSBieSB0ZXh0dXJlIGRpbWVuc2lvbnMgYW5kIExPRAorCQkJCWR1ZHh5ICo9ICpQb2ludGVyPEZsb2F0ND4odGV4dHVyZSArIE9GRlNFVChUZXh0dXJlLHdpZHRoTE9EKSk7CisJCQkJZHZkeHkgKj0gKlBvaW50ZXI8RmxvYXQ0Pih0ZXh0dXJlICsgT0ZGU0VUKFRleHR1cmUsaGVpZ2h0TE9EKSk7CisJCQkJZHNkeHkgKj0gKlBvaW50ZXI8RmxvYXQ0Pih0ZXh0dXJlICsgT0ZGU0VUKFRleHR1cmUsZGVwdGhMT0QpKTsKKworCQkJCWR1ZHh5ICo9IGR1ZHh5OworCQkJCWR2ZHh5ICo9IGR2ZHh5OworCQkJCWRzZHh5ICo9IGRzZHh5OworCisJCQkJZHVkeHkgKz0gZHZkeHk7CisJCQkJZHVkeHkgKz0gZHNkeHk7CisKKwkJCQlsb2QgPSBNYXgoRmxvYXQoZHVkeHkueCksIEZsb2F0KGR1ZHh5LnkpKTsgICAvLyBGSVhNRTogTWF4KGR1ZHh5LngsIGR1ZHh5LnkpOworCisJCQkJLy8gbG9nMihzcXJ0KGxvZCkpCisJCQkJbG9kID0gRmxvYXQoQXM8SW50Pihsb2QpKTsKKwkJCQlsb2QgLT0gRmxvYXQoMHgzRjgwMDAwMCk7CisJCQkJbG9kICo9IEFzPEZsb2F0PihJbnQoMHgzMzgwMDAwMCkpOworCisJCQkJaWYoYmlhcykKKwkJCQl7CisJCQkJCWxvZCArPSBsb2RCaWFzOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlsb2QgPSBsb2RCaWFzICsgKlBvaW50ZXI8RmxvYXQ+KHRleHR1cmUgKyBPRkZTRVQoVGV4dHVyZSxMT0QpKTsKKwkJCX0KKworCQkJbG9kID0gTWF4KGxvZCwgRmxvYXQoMC4wZikpOyAgICAvLyBGSVhNRQorCQkJbG9kID0gTWluKGxvZCwgRmxvYXQoTUlQTUFQX0xFVkVMUyAtIDIpKTsgICAvLyBUcmlsaW5lYXIgYWNjZXNzZXMgbG9kKzEKKwkJfQorCX0KKworCXZvaWQgU2FtcGxlckNvcmU6OmN1YmVGYWNlKEludCBmYWNlWzRdLCBGbG9hdDQgJlUsIEZsb2F0NCAmViwgRmxvYXQ0ICZsb2RVLCBGbG9hdDQgJmxvZFYsIEZsb2F0NCAmeCwgRmxvYXQ0ICZ5LCBGbG9hdDQgJnopCisJeworCQlJbnQ0IHhwID0gQ21wTkxFKHgsIEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSk7ICAgLy8geCA+IDAKKwkJSW50NCB5cCA9IENtcE5MRSh5LCBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOyAgIC8vIHkgPiAwCisJCUludDQgenAgPSBDbXBOTEUoeiwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsgICAvLyB6ID4gMAorCisJCUZsb2F0NCBhYnNYID0gQWJzKHgpOworCQlGbG9hdDQgYWJzWSA9IEFicyh5KTsKKwkJRmxvYXQ0IGFic1ogPSBBYnMoeik7CisJCUludDQgeHkgPSBDbXBOTEUoYWJzWCwgYWJzWSk7ICAgLy8gYWJzKHgpID4gYWJzKHkpCisJCUludDQgeXogPSBDbXBOTEUoYWJzWSwgYWJzWik7ICAgLy8gYWJzKHkpID4gYWJzKHopCisJCUludDQgenggPSBDbXBOTEUoYWJzWiwgYWJzWCk7ICAgLy8gYWJzKHopID4gYWJzKHgpCisKKwkJSW50NCB4eXogPSB+enggJiB4eTsgICAvLyBhYnMoeCkgPiBhYnMoeSkgJiYgYWJzKHgpID4gYWJzKHopCisJCUludDQgeXp4ID0gfnh5ICYgeXo7ICAgLy8gYWJzKHkpID4gYWJzKHopICYmIGFicyh5KSA+IGFicyh4KQorCQlJbnQ0IHp4eSA9IH55eiAmIHp4OyAgIC8vIGFicyh6KSA+IGFicyh4KSAmJiBhYnMoeikgPiBhYnMoeSkKKworCQkvLyBGQUNFX1BPU0lUSVZFX1ggPSAwMDBiCisJCS8vIEZBQ0VfTkVHQVRJVkVfWCA9IDAwMWIKKwkJLy8gRkFDRV9QT1NJVElWRV9ZID0gMDEwYgorCQkvLyBGQUNFX05FR0FUSVZFX1kgPSAwMTFiCisJCS8vIEZBQ0VfUE9TSVRJVkVfWiA9IDEwMGIKKwkJLy8gRkFDRV9ORUdBVElWRV9aID0gMTAxYgorCisJCUludCB5QXhpcyA9IFNpZ25NYXNrKHl6eCk7CisJCUludCB6QXhpcyA9IFNpZ25NYXNrKHp4eSk7CisKKwkJSW50NCBuID0gKH54cCAmIHh5eikgfCAofnlwICYgeXp4KSB8ICh+enAgJiB6eHkpOworCQlJbnQgbmVnYXRpdmUgPSBTaWduTWFzayhuKTsKKworCQlmYWNlWzBdID0gKlBvaW50ZXI8SW50Pihjb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLHRyYW5zcG9zZUJpdDApICsgbmVnYXRpdmUgKiA0KTsKKwkJZmFjZVswXSB8PSAqUG9pbnRlcjxJbnQ+KGNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsdHJhbnNwb3NlQml0MSkgKyB5QXhpcyAqIDQpOworCQlmYWNlWzBdIHw9ICpQb2ludGVyPEludD4oY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx0cmFuc3Bvc2VCaXQyKSArIHpBeGlzICogNCk7CisJCWZhY2VbMV0gPSAoZmFjZVswXSA+PiA0KSAgJiAweDc7CisJCWZhY2VbMl0gPSAoZmFjZVswXSA+PiA4KSAgJiAweDc7CisJCWZhY2VbM10gPSAoZmFjZVswXSA+PiAxMikgJiAweDc7CisJCWZhY2VbMF0gJj0gMHg3OworCisJCS8vIFUgPSB4eXogKiAteiArIH54eXogKiAoeXp4ICogfnlwICogLXggKyAoeXp4ICogfnlwKSAqIHgpCisJCVUgPSBBczxGbG9hdDQ+KCh4eXogJiBBczxJbnQ0PigteikpIHwgKH54eXogJiAoKCh5enggJiB+eXApICYgSW50NCgweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwKSkgXiBBczxJbnQ0Pih4KSkpKTsKKworCQkvLyBWID0geXp4ICogeiArIH55enggKiAofm5lZyAqIC15ICsgbmVnICogeSkKKwkJViA9IEFzPEZsb2F0ND4oKH55enggJiAoKH5uICYgSW50NCgweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwKSkgXiBBczxJbnQ0Pih5KSkpIHwgKHl6eCAmIEFzPEludDQ+KHopKSk7CisKKwkJLy8gTSA9IHh5eiAqIHggKyB5enggKiB5ICsgenh5ICogegorCQlGbG9hdDQgTSA9IEFzPEZsb2F0ND4oKHh5eiAmIEFzPEludDQ+KHgpKSB8ICh5enggJiBBczxJbnQ0Pih5KSkgfCAoenh5ICYgQXM8SW50ND4oeikpKTsKKwkJCisJCU0gPSByZWNpcHJvY2FsKE0pOworCQlVICo9IE0gKiBGbG9hdDQoMC41ZiwgMC41ZiwgMC41ZiwgMC41Zik7CisJCVYgKj0gTSAqIEZsb2F0NCgwLjVmLCAwLjVmLCAwLjVmLCAwLjVmKTsKKworCQkvLyBQcm9qZWN0IGNvb3JkaW5hdGVzIG9udG8gb25lIGZhY2UgZm9yIGNvbnNpc3RlbnQgTE9EIGNhbGN1bGF0aW9uCisJCXsKKwkJCXlwID0gU3dpenpsZSh5cCwgMCk7CisJCQluID0gU3dpenpsZShuLCAwKTsKKwkJCXh5eiA9IFN3aXp6bGUoeHl6LCAwKTsKKwkJCXl6eCA9IFN3aXp6bGUoeXp4LCAwKTsKKwkJCXp4eSA9IFN3aXp6bGUoenh5LCAwKTsKKworCQkJLy8gVSA9IHh5eiAqIC16ICsgfnh5eiAqICh5enggKiB+eXAgKiAteCArICh5enggKiB+eXApICogeCkKKwkJCWxvZFUgPSBBczxGbG9hdDQ+KCh4eXogJiBBczxJbnQ0PigteikpIHwgKH54eXogJiAoKCh5enggJiB+eXApICYgSW50NCgweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwKSkgXiBBczxJbnQ0Pih4KSkpKTsKKworCQkJLy8gViA9IHl6eCAqIHogKyB+eXp4ICogKH5uZWcgKiAteSArIG5lZyAqIHkpCisJCQlsb2RWID0gQXM8RmxvYXQ0Pigofnl6eCAmICgofm4gJiBJbnQ0KDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDApKSBeIEFzPEludDQ+KHkpKSkgfCAoeXp4ICYgQXM8SW50ND4oeikpKTsKKworCQkJLy8gTSA9IHh5eiAqIHggKyB5enggKiB5ICsgenh5ICogegorCQkJRmxvYXQ0IE0gPSBBczxGbG9hdDQ+KCh4eXogJiBBczxJbnQ0Pih4KSkgfCAoeXp4ICYgQXM8SW50ND4oeSkpIHwgKHp4eSAmIEFzPEludDQ+KHopKSk7CisJCQkKKwkJCU0gPSBSY3BfcHAoTSk7CisJCQlsb2RVICo9IE0gKiBGbG9hdDQoMC41ZiwgMC41ZiwgMC41ZiwgMC41Zik7CisJCQlsb2RWICo9IE0gKiBGbG9hdDQoMC41ZiwgMC41ZiwgMC41ZiwgMC41Zik7CisJCX0KKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpjb21wdXRlSW5kaWNlcyhJbnQgaW5kZXhbNF0sIFNob3J0NCB1dXV1LCBTaG9ydDQgdnZ2diwgU2hvcnQ0IHd3d3csIGNvbnN0IFBvaW50ZXI8Qnl0ZT4gJm1pcG1hcCkKKwl7CisJCVNob3J0NCB1dXUyOworCisJCWlmKCFzdGF0ZS5oYXNOUE9UVGV4dHVyZSAmJiAhaGFzRmxvYXRUZXh0dXJlKCkpCisJCXsKKwkJCXZ2dnYgPSBBczxVU2hvcnQ0Pih2dnZ2KSA+PiAqUG9pbnRlcjxMb25nMT4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCx2RnJhYykpOworCQkJdXV1MiA9IHV1dXU7CisJCQl1dXV1ID0gQXM8U2hvcnQ0PihVbnBhY2tMb3codXV1dSwgdnZ2dikpOworCQkJdXV1MiA9IEFzPFNob3J0ND4oVW5wYWNrSGlnaCh1dXUyLCB2dnZ2KSk7CisJCQl1dXV1ID0gQXM8U2hvcnQ0PihBczxVSW50Mj4odXV1dSkgPj4gKlBvaW50ZXI8TG9uZzE+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsdUZyYWMpKSk7CisJCQl1dXUyID0gQXM8U2hvcnQ0PihBczxVSW50Mj4odXV1MikgPj4gKlBvaW50ZXI8TG9uZzE+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsdUZyYWMpKSk7CisKKwkJCWlmKHN0YXRlLnRleHR1cmVUeXBlID09IFRFWFRVUkVfM0QpCisJCQl7CisJCQkJd3d3dyA9IEFzPFVTaG9ydDQ+KHd3d3cpID4+ICpQb2ludGVyPExvbmcxPihtaXBtYXAgKyBPRkZTRVQoTWlwbWFwLHdGcmFjKSk7CisJCQkJU2hvcnQ0IHd3dzIgPSB3d3d3OworCQkJCXd3d3cgPSBBczxTaG9ydDQ+KFVucGFja0xvdyh3d3d3LCB3d3d3KSk7CisJCQkJd3d3MiA9IEFzPFNob3J0ND4oVW5wYWNrSGlnaCh3d3cyLCB3d3cyKSk7CisJCQkJd3d3dyA9IEFzPFNob3J0ND4oQXM8VUludDI+KHd3d3cpID4+IDE2KTsKKwkJCQl3d3cyID0gQXM8U2hvcnQ0PihBczxVSW50Mj4od3d3MikgPj4gMTYpOworCQkJCXd3d3cgPSBBczxTaG9ydDQ+KEFzPEludDI+KHd3d3cpIDw8ICpQb2ludGVyPExvbmcxPihtaXBtYXAgKyBPRkZTRVQoTWlwbWFwLHVJbnQpKSk7CisJCQkJd3d3MiA9IEFzPFNob3J0ND4oQXM8SW50Mj4od3d3MikgPDwgKlBvaW50ZXI8TG9uZzE+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsdUludCkpKTsKKwkJCQl3d3d3ID0gQXM8U2hvcnQ0PihBczxJbnQyPih3d3d3KSA8PCAqUG9pbnRlcjxMb25nMT4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCx2SW50KSkpOyAgIC8vIEZJWE1FOiBDb21iaW5lIHVJbnQgYW5kIHZJbnQgc2hpZnQKKwkJCQl3d3cyID0gQXM8U2hvcnQ0PihBczxJbnQyPih3d3cyKSA8PCAqUG9pbnRlcjxMb25nMT4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCx2SW50KSkpOworCQkJCXV1dXUgPSBBczxTaG9ydDQ+KEFzPEludDI+KHV1dXUpICsgQXM8SW50Mj4od3d3dykpOworCQkJCXV1dTIgPSBBczxTaG9ydDQ+KEFzPEludDI+KHV1dTIpICsgQXM8SW50Mj4od3d3MikpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJdXV1dSA9IE11bEhpZ2goQXM8VVNob3J0ND4odXV1dSksICpQb2ludGVyPFVTaG9ydDQ+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsd2lkdGgpKSk7CisJCQl2dnZ2ID0gTXVsSGlnaChBczxVU2hvcnQ0Pih2dnZ2KSwgKlBvaW50ZXI8VVNob3J0ND4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCxoZWlnaHQpKSk7CisJCQl1dXUyID0gdXV1dTsKKwkJCXV1dXUgPSBBczxTaG9ydDQ+KFVucGFja0xvdyh1dXV1LCB2dnZ2KSk7CisJCQl1dXUyID0gQXM8U2hvcnQ0PihVbnBhY2tIaWdoKHV1dTIsIHZ2dnYpKTsKKwkJCXV1dXUgPSBBczxTaG9ydDQ+KE11bEFkZCh1dXV1LCAqUG9pbnRlcjxTaG9ydDQ+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsb25lUGl0Y2hQKSkpKTsKKwkJCXV1dTIgPSBBczxTaG9ydDQ+KE11bEFkZCh1dXUyLCAqUG9pbnRlcjxTaG9ydDQ+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsb25lUGl0Y2hQKSkpKTsKKworCQkJaWYoc3RhdGUudGV4dHVyZVR5cGUgPT0gVEVYVFVSRV8zRCkKKwkJCXsKKwkJCQl3d3d3ID0gTXVsSGlnaChBczxVU2hvcnQ0Pih3d3d3KSwgKlBvaW50ZXI8VVNob3J0ND4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCxkZXB0aCkpKTsKKwkJCQlTaG9ydDQgd3d3MiA9IHd3d3c7CisJCQkJd3d3dyA9IEFzPFNob3J0ND4oVW5wYWNrTG93KHd3d3csIFNob3J0NCgweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDApKSk7CisJCQkJd3d3MiA9IEFzPFNob3J0ND4oVW5wYWNrSGlnaCh3d3cyLCBTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKSkpOworCQkJCXd3d3cgPSBBczxTaG9ydDQ+KE11bEFkZCh3d3d3LCAqUG9pbnRlcjxTaG9ydDQ+KG1pcG1hcCArIE9GRlNFVChNaXBtYXAsc2xpY2VQKSkpKTsKKwkJCQl3d3cyID0gQXM8U2hvcnQ0PihNdWxBZGQod3d3MiwgKlBvaW50ZXI8U2hvcnQ0PihtaXBtYXAgKyBPRkZTRVQoTWlwbWFwLHNsaWNlUCkpKSk7CisJCQkJdXV1dSA9IEFzPFNob3J0ND4oQXM8SW50Mj4odXV1dSkgKyBBczxJbnQyPih3d3d3KSk7CisJCQkJdXV1MiA9IEFzPFNob3J0ND4oQXM8SW50Mj4odXV1MikgKyBBczxJbnQyPih3d3cyKSk7CisJCQl9CisJCX0KKworCQlpbmRleFswXSA9IEV4dHJhY3QoQXM8SW50Mj4odXV1dSksIDApOworCQlpbmRleFsxXSA9IEV4dHJhY3QoQXM8SW50Mj4odXV1dSksIDEpOworCQlpbmRleFsyXSA9IEV4dHJhY3QoQXM8SW50Mj4odXV1MiksIDApOworCQlpbmRleFszXSA9IEV4dHJhY3QoQXM8SW50Mj4odXV1MiksIDEpOworCX0KKworCXZvaWQgU2FtcGxlckNvcmU6OnNhbXBsZVRleGVsKENvbG9yNGkgJmMsIFNob3J0NCAmdXV1dSwgU2hvcnQ0ICZ2dnZ2LCBTaG9ydDQgJnd3d3csIFBvaW50ZXI8Qnl0ZT4gJm1pcG1hcCwgUG9pbnRlcjxCeXRlPiBidWZmZXJbNF0pCisJeworCQlJbnQgaW5kZXhbNF07CisKKwkJY29tcHV0ZUluZGljZXMoaW5kZXgsIHV1dXUsIHZ2dnYsIHd3d3csIG1pcG1hcCk7CisKKwkJaW50IGYwID0gc3RhdGUudGV4dHVyZVR5cGUgPT0gVEVYVFVSRV9DVUJFID8gMCA6IDA7CisJCWludCBmMSA9IHN0YXRlLnRleHR1cmVUeXBlID09IFRFWFRVUkVfQ1VCRSA/IDEgOiAwOworCQlpbnQgZjIgPSBzdGF0ZS50ZXh0dXJlVHlwZSA9PSBURVhUVVJFX0NVQkUgPyAyIDogMDsKKwkJaW50IGYzID0gc3RhdGUudGV4dHVyZVR5cGUgPT0gVEVYVFVSRV9DVUJFID8gMyA6IDA7CisKKwkJaWYoIWhhczE2Yml0VGV4dHVyZSgpKQorCQl7CisJCQlJbnQgYzA7CisJCQlJbnQgYzE7CisJCQlJbnQgYzI7CisJCQlJbnQgYzM7CisKKwkJCXN3aXRjaCh0ZXh0dXJlQ29tcG9uZW50Q291bnQoKSkKKwkJCXsKKwkJCWNhc2UgNDoKKwkJCQl7CisJCQkJCUJ5dGU4IGMwID0gKlBvaW50ZXI8Qnl0ZTg+KGJ1ZmZlcltmMF0gKyA0ICogaW5kZXhbMF0pOworCQkJCQlCeXRlOCBjMSA9ICpQb2ludGVyPEJ5dGU4PihidWZmZXJbZjFdICsgNCAqIGluZGV4WzFdKTsKKwkJCQkJQnl0ZTggYzIgPSAqUG9pbnRlcjxCeXRlOD4oYnVmZmVyW2YyXSArIDQgKiBpbmRleFsyXSk7CisJCQkJCUJ5dGU4IGMzID0gKlBvaW50ZXI8Qnl0ZTg+KGJ1ZmZlcltmM10gKyA0ICogaW5kZXhbM10pOworCQkJCQljLnIgPSBVbnBhY2tMb3coYzAsIGMxKTsKKwkJCQkJYy5nID0gVW5wYWNrTG93KGMyLCBjMyk7CisJCQkJCQorCQkJCQlzd2l0Y2goc3RhdGUudGV4dHVyZUZvcm1hdCkKKwkJCQkJeworCQkJCQljYXNlIEZPUk1BVF9BOFI4RzhCODoKKwkJCQkJCWMuYiA9IGMucjsKKwkJCQkJCWMuYiA9IEFzPFNob3J0ND4oVW5wYWNrTG93KGMuYiwgYy5nKSk7CisJCQkJCQljLnIgPSBBczxTaG9ydDQ+KFVucGFja0hpZ2goYy5yLCBjLmcpKTsKKwkJCQkJCWMuZyA9IGMuYjsKKwkJCQkJCWMuYSA9IGMucjsKKwkJCQkJCWMuYiA9IFVucGFja0xvdyhBczxCeXRlOD4oYy5iKSwgQXM8Qnl0ZTg+KGMuYikpOworCQkJCQkJYy5nID0gVW5wYWNrSGlnaChBczxCeXRlOD4oYy5nKSwgQXM8Qnl0ZTg+KGMuZykpOworCQkJCQkJYy5yID0gVW5wYWNrTG93KEFzPEJ5dGU4PihjLnIpLCBBczxCeXRlOD4oYy5yKSk7CisJCQkJCQljLmEgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4PihjLmEpLCBBczxCeXRlOD4oYy5hKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBGT1JNQVRfUThXOFY4VTg6CisJCQkJCQljLmIgPSBjLnI7CisJCQkJCQljLnIgPSBBczxTaG9ydDQ+KFVucGFja0xvdyhjLnIsIGMuZykpOworCQkJCQkJYy5iID0gQXM8U2hvcnQ0PihVbnBhY2tIaWdoKGMuYiwgYy5nKSk7CisJCQkJCQljLmcgPSBjLnI7CisJCQkJCQljLmEgPSBjLmI7CisJCQkJCQljLnIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KGMuciksIEFzPEJ5dGU4PihjLnIpKTsKKwkJCQkJCWMuZyA9IFVucGFja0hpZ2goQXM8Qnl0ZTg+KGMuZyksIEFzPEJ5dGU4PihjLmcpKTsKKwkJCQkJCWMuYiA9IFVucGFja0xvdyhBczxCeXRlOD4oYy5iKSwgQXM8Qnl0ZTg+KGMuYikpOworCQkJCQkJYy5hID0gVW5wYWNrSGlnaChBczxCeXRlOD4oYy5hKSwgQXM8Qnl0ZTg+KGMuYSkpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXsKKwkJCQkJQnl0ZTggYzAgPSAqUG9pbnRlcjxCeXRlOD4oYnVmZmVyW2YwXSArIDQgKiBpbmRleFswXSk7CisJCQkJCUJ5dGU4IGMxID0gKlBvaW50ZXI8Qnl0ZTg+KGJ1ZmZlcltmMV0gKyA0ICogaW5kZXhbMV0pOworCQkJCQlCeXRlOCBjMiA9ICpQb2ludGVyPEJ5dGU4PihidWZmZXJbZjJdICsgNCAqIGluZGV4WzJdKTsKKwkJCQkJQnl0ZTggYzMgPSAqUG9pbnRlcjxCeXRlOD4oYnVmZmVyW2YzXSArIDQgKiBpbmRleFszXSk7CisJCQkJCWMuciA9IFVucGFja0xvdyhjMCwgYzEpOworCQkJCQljLmcgPSBVbnBhY2tMb3coYzIsIGMzKTsKKworCQkJCQlzd2l0Y2goc3RhdGUudGV4dHVyZUZvcm1hdCkKKwkJCQkJeworCQkJCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJCQkJCWMuYiA9IGMucjsKKwkJCQkJCWMuYiA9IEFzPFNob3J0ND4oVW5wYWNrTG93KGMuYiwgYy5nKSk7CisJCQkJCQljLnIgPSBBczxTaG9ydDQ+KFVucGFja0hpZ2goYy5yLCBjLmcpKTsKKwkJCQkJCWMuZyA9IGMuYjsKKwkJCQkJCWMuYiA9IFVucGFja0xvdyhBczxCeXRlOD4oYy5iKSwgQXM8Qnl0ZTg+KGMuYikpOworCQkJCQkJYy5nID0gVW5wYWNrSGlnaChBczxCeXRlOD4oYy5nKSwgQXM8Qnl0ZTg+KGMuZykpOworCQkJCQkJYy5yID0gVW5wYWNrTG93KEFzPEJ5dGU4PihjLnIpLCBBczxCeXRlOD4oYy5yKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBGT1JNQVRfWDhMOFY4VTg6CisJCQkJCQljLmIgPSBjLnI7CisJCQkJCQljLnIgPSBBczxTaG9ydDQ+KFVucGFja0xvdyhjLnIsIGMuZykpOworCQkJCQkJYy5iID0gQXM8U2hvcnQ0PihVbnBhY2tIaWdoKGMuYiwgYy5nKSk7CisJCQkJCQljLmcgPSBjLnI7CisJCQkJCQljLnIgPSBVbnBhY2tMb3coQXM8Qnl0ZTg+KGMuciksIEFzPEJ5dGU4PihTaG9ydDQoMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwKSkpOworCQkJCQkJYy5yID0gYy5yIDw8IDg7CisJCQkJCQljLmcgPSBVbnBhY2tIaWdoKEFzPEJ5dGU4PihjLmcpLCBBczxCeXRlOD4oU2hvcnQ0KDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCkpKTsKKwkJCQkJCWMuZyA9IGMuZyA8PCA4OworCQkJCQkJYy5iID0gVW5wYWNrTG93KEFzPEJ5dGU4PihjLmIpLCBBczxCeXRlOD4oYy5iKSk7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJYy5yID0gSW5zZXJ0KGMuciwgKlBvaW50ZXI8U2hvcnQ+KGJ1ZmZlcltmMF0gKyAyICogaW5kZXhbMF0pLCAwKTsKKwkJCQljLnIgPSBJbnNlcnQoYy5yLCAqUG9pbnRlcjxTaG9ydD4oYnVmZmVyW2YxXSArIDIgKiBpbmRleFsxXSksIDEpOworCQkJCWMuciA9IEluc2VydChjLnIsICpQb2ludGVyPFNob3J0PihidWZmZXJbZjJdICsgMiAqIGluZGV4WzJdKSwgMik7CisJCQkJYy5yID0gSW5zZXJ0KGMuciwgKlBvaW50ZXI8U2hvcnQ+KGJ1ZmZlcltmM10gKyAyICogaW5kZXhbM10pLCAzKTsKKworCQkJCXN3aXRjaChzdGF0ZS50ZXh0dXJlRm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEZPUk1BVF9HOFI4OgorCQkJCWNhc2UgRk9STUFUX1Y4VTg6CisJCQkJY2FzZSBGT1JNQVRfQThMODoKKwkJCQkJLy8gRklYTUU6IFVucGFjayBwcm9wZXJseSB0byAwLjE2IGZvcm1hdAorCQkJCQljLmcgPSBjLnI7CisJCQkJCWMuciA9IGMuciA8PCA4OworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQljMCA9IEludCgqUG9pbnRlcjxCeXRlPihidWZmZXJbZjBdICsgaW5kZXhbMF0pKTsKKwkJCQljMSA9IEludCgqUG9pbnRlcjxCeXRlPihidWZmZXJbZjFdICsgaW5kZXhbMV0pKTsKKwkJCQljMiA9IEludCgqUG9pbnRlcjxCeXRlPihidWZmZXJbZjJdICsgaW5kZXhbMl0pKTsKKwkJCQljMyA9IEludCgqUG9pbnRlcjxCeXRlPihidWZmZXJbZjNdICsgaW5kZXhbM10pKTsKKwkJCQljMCA9IGMwIHwgKGMxIDw8IDgpIHwgKGMyIDw8IDE2KSB8IChjMyA8PCAyNCk7CisJCQkJYy5yID0gQXM8U2hvcnQ0PihJbnQyKGMwKSk7CisJCQkJYy5yID0gVW5wYWNrTG93KEFzPEJ5dGU4PihjLnIpLCBBczxCeXRlOD4oYy5yKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzd2l0Y2godGV4dHVyZUNvbXBvbmVudENvdW50KCkpCisJCQl7CisJCQljYXNlIDQ6CisJCQkJYy5yID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXJbZjBdICsgOCAqIGluZGV4WzBdKTsKKwkJCQljLmcgPSAqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlcltmMV0gKyA4ICogaW5kZXhbMV0pOworCQkJCWMuYiA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyW2YyXSArIDggKiBpbmRleFsyXSk7CisJCQkJYy5hID0gKlBvaW50ZXI8U2hvcnQ0PihidWZmZXJbZjNdICsgOCAqIGluZGV4WzNdKTsKKwkJCQl0cmFuc3Bvc2U0eDQoYy5yLCBjLmcsIGMuYiwgYy5hKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQljLnIgPSAqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlcltmMF0gKyA0ICogaW5kZXhbMF0pOworCQkJCWMuciA9IEFzPFNob3J0ND4oVW5wYWNrTG93KGMuciwgKlBvaW50ZXI8U2hvcnQ0PihidWZmZXJbZjFdICsgNCAqIGluZGV4WzFdKSkpOworCQkJCWMuYiA9ICpQb2ludGVyPFNob3J0ND4oYnVmZmVyW2YyXSArIDQgKiBpbmRleFsyXSk7CisJCQkJYy5iID0gQXM8U2hvcnQ0PihVbnBhY2tMb3coYy5iLCAqUG9pbnRlcjxTaG9ydDQ+KGJ1ZmZlcltmM10gKyA0ICogaW5kZXhbM10pKSk7CisJCQkJYy5nID0gYy5yOworCQkJCWMuciA9IEFzPFNob3J0ND4oVW5wYWNrTG93KEFzPEludDI+KGMuciksIEFzPEludDI+KGMuYikpKTsKKwkJCQljLmcgPSBBczxTaG9ydDQ+KFVucGFja0hpZ2goQXM8SW50Mj4oYy5nKSwgQXM8SW50Mj4oYy5iKSkpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWMuciA9IEluc2VydChjLnIsICpQb2ludGVyPFNob3J0PihidWZmZXJbZjBdICsgMiAqIGluZGV4WzBdKSwgMCk7CisJCQkJYy5yID0gSW5zZXJ0KGMuciwgKlBvaW50ZXI8U2hvcnQ+KGJ1ZmZlcltmMV0gKyAyICogaW5kZXhbMV0pLCAxKTsKKwkJCQljLnIgPSBJbnNlcnQoYy5yLCAqUG9pbnRlcjxTaG9ydD4oYnVmZmVyW2YyXSArIDIgKiBpbmRleFsyXSksIDIpOworCQkJCWMuciA9IEluc2VydChjLnIsICpQb2ludGVyPFNob3J0PihidWZmZXJbZjNdICsgMiAqIGluZGV4WzNdKSwgMyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpzYW1wbGVUZXhlbChDb2xvcjRmICZjLCBTaG9ydDQgJnV1dXUsIFNob3J0NCAmdnZ2diwgU2hvcnQ0ICZ3d3d3LCBGbG9hdDQgJnosIFBvaW50ZXI8Qnl0ZT4gJm1pcG1hcCwgUG9pbnRlcjxCeXRlPiBidWZmZXJbNF0pCisJeworCQlJbnQgaW5kZXhbNF07CisKKwkJY29tcHV0ZUluZGljZXMoaW5kZXgsIHV1dXUsIHZ2dnYsIHd3d3csIG1pcG1hcCk7CisKKwkJaW50IGYwID0gc3RhdGUudGV4dHVyZVR5cGUgPT0gVEVYVFVSRV9DVUJFID8gMCA6IDA7CisJCWludCBmMSA9IHN0YXRlLnRleHR1cmVUeXBlID09IFRFWFRVUkVfQ1VCRSA/IDEgOiAwOworCQlpbnQgZjIgPSBzdGF0ZS50ZXh0dXJlVHlwZSA9PSBURVhUVVJFX0NVQkUgPyAyIDogMDsKKwkJaW50IGYzID0gc3RhdGUudGV4dHVyZVR5cGUgPT0gVEVYVFVSRV9DVUJFID8gMyA6IDA7CisKKwkJLy8gUmVhZCB0ZXhlbHMKKwkJc3dpdGNoKHRleHR1cmVDb21wb25lbnRDb3VudCgpKQorCQl7CisJCWNhc2UgNDoKKwkJCWMuciA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyW2YwXSArIGluZGV4WzBdICogMTYsIDE2KTsKKwkJCWMuZyA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyW2YxXSArIGluZGV4WzFdICogMTYsIDE2KTsKKwkJCWMuYiA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyW2YyXSArIGluZGV4WzJdICogMTYsIDE2KTsKKwkJCWMuYSA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyW2YzXSArIGluZGV4WzNdICogMTYsIDE2KTsKKwkJCXRyYW5zcG9zZTR4NChjLnIsIGMuZywgYy5iLCBjLmEpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCS8vIEZJWE1FOiBPcHRpbWFsIHNodWZmbGluZz8KKwkJCWMuci54eSA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyW2YwXSArIGluZGV4WzBdICogOCk7CisJCQljLnIuencgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlcltmMV0gKyBpbmRleFsxXSAqIDggLSA4KTsKKwkJCWMuYi54eSA9ICpQb2ludGVyPEZsb2F0ND4oYnVmZmVyW2YyXSArIGluZGV4WzJdICogOCk7CisJCQljLmIuencgPSAqUG9pbnRlcjxGbG9hdDQ+KGJ1ZmZlcltmM10gKyBpbmRleFszXSAqIDggLSA4KTsKKwkJCWMuZyA9IGMucjsKKwkJCWMuciA9IEZsb2F0NChjLnIueHosIGMuYi54eik7CisJCQljLmcgPSBGbG9hdDQoYy5nLnl3LCBjLmIueXcpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCS8vIEZJWE1FOiBPcHRpbWFsIHNodWZmbGluZz8KKwkJCWMuci54ID0gKlBvaW50ZXI8RmxvYXQ+KGJ1ZmZlcltmMF0gKyBpbmRleFswXSAqIDQpOworCQkJYy5yLnkgPSAqUG9pbnRlcjxGbG9hdD4oYnVmZmVyW2YxXSArIGluZGV4WzFdICogNCk7CisJCQljLnIueiA9ICpQb2ludGVyPEZsb2F0PihidWZmZXJbZjJdICsgaW5kZXhbMl0gKiA0KTsKKwkJCWMuci53ID0gKlBvaW50ZXI8RmxvYXQ+KGJ1ZmZlcltmM10gKyBpbmRleFszXSAqIDQpOworCisJCQlpZihzdGF0ZS50ZXh0dXJlRm9ybWF0ID09IEZPUk1BVF9EMzJGX1NIQURPVyAmJiBzdGF0ZS50ZXh0dXJlRmlsdGVyICE9IEZJTFRFUl9HQVRIRVIpCisJCQl7CisJCQkJRmxvYXQ0IGQgPSBNaW4oTWF4KHosIEZsb2F0NCgwLjBmKSksIEZsb2F0NCgxLjBmKSk7CisKKwkJCQljLnIgPSBBczxGbG9hdDQ+KEFzPEludDQ+KENtcE5MVChjLnIsIGQpKSAmIEFzPEludDQ+KEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSkpOyAgIC8vIEZJWE1FOiBPbmx5IGxlc3MtZXF1YWw/CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpzZWxlY3RNaXBtYXAoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgUG9pbnRlcjxCeXRlPiBidWZmZXJbNF0sIFBvaW50ZXI8Qnl0ZT4gJm1pcG1hcCwgRmxvYXQgJmxvZCwgSW50IGZhY2VbNF0sIGJvb2wgc2Vjb25kTE9EKQorCXsKKwkJaWYoc3RhdGUubWlwbWFwRmlsdGVyIDwgTUlQTUFQX1BPSU5UKQorCQl7CisJCQltaXBtYXAgPSB0ZXh0dXJlICsgT0ZGU0VUKFRleHR1cmUsbWlwbWFwWzBdKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUludCBpbG9kOworCisJCQlpZihzdGF0ZS5taXBtYXBGaWx0ZXIgPT0gTUlQTUFQX1BPSU5UKQorCQkJeworCQkJCWlsb2QgPSBSb3VuZEludChsb2QpOworCQkJfQorCQkJZWxzZSAgIC8vIExpbmVhcgorCQkJeworCQkJCWlsb2QgPSBJbnQobG9kKTsKKwkJCX0KKworCQkJbWlwbWFwID0gdGV4dHVyZSArIE9GRlNFVChUZXh0dXJlLG1pcG1hcCkgKyBpbG9kICogc2l6ZW9mKE1pcG1hcCkgKyBzZWNvbmRMT0QgKiBzaXplb2YoTWlwbWFwKTsKKwkJfQorCisJCWlmKHN0YXRlLnRleHR1cmVUeXBlICE9IFRFWFRVUkVfQ1VCRSkKKwkJeworCQkJYnVmZmVyWzBdID0gKlBvaW50ZXI8UG9pbnRlcjxCeXRlPj4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCxidWZmZXJbMF0pKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspCisJCQl7CisJCQkJYnVmZmVyW2ldID0gKlBvaW50ZXI8UG9pbnRlcjxCeXRlPj4obWlwbWFwICsgT0ZGU0VUKE1pcG1hcCxidWZmZXIpICsgZmFjZVtpXSAqIHNpemVvZih2b2lkKikpOworCQkJfQorCQl9CisJfQorCisJdm9pZCBTYW1wbGVyQ29yZTo6YWRkcmVzcyhTaG9ydDQgJnV1dXUsIEZsb2F0NCAmdXcsIEFkZHJlc3NpbmdNb2RlIGFkZHJlc3NpbmdNb2RlKQorCXsKKwkJaWYoYWRkcmVzc2luZ01vZGUgPT0gQUREUkVTU0lOR19DTEFNUCkKKwkJeworCQkJRmxvYXQ0IGNsYW1wID0gTWluKE1heCh1dywgRmxvYXQ0KDAuMGYpKSwgRmxvYXQ0KDY1NTM1LjBmIC8gNjU1MzYuMGYpKTsKKworCQkJdXV1dSA9IFNob3J0NChJbnQ0KGNsYW1wICogRmxvYXQ0KDEgPDwgMTYpKSk7CisJCX0KKwkJZWxzZSBpZihhZGRyZXNzaW5nTW9kZSA9PSBBRERSRVNTSU5HX01JUlJPUikKKwkJeworCQkJSW50NCBjb252ZXJ0ID0gSW50NCh1dyAqIEZsb2F0NCgxIDw8IDE2KSk7CisJCQlJbnQ0IG1pcnJvciA9IChjb252ZXJ0IDw8IDE1KSA+PiAzMTsKKworCQkJY29udmVydCBePSBtaXJyb3I7CisKKwkJCXV1dXUgPSBTaG9ydDQoY29udmVydCk7CisJCX0KKwkJZWxzZSBpZihhZGRyZXNzaW5nTW9kZSA9PSBBRERSRVNTSU5HX01JUlJPUk9OQ0UpCisJCXsKKwkJCS8vIEFic29sdXRlIHZhbHVlCisJCQlJbnQ0IGNvbnZlcnQgPSBJbnQ0KEFicyh1dyAqIEZsb2F0NCgxIDw8IDE2KSkpOworCisJCQkvLyBDbGFtcAorCQkJY29udmVydCAtPSBJbnQ0KDB4MDAwMDgwMDAsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDApOworCQkJY29udmVydCA9IEFzPEludDQ+KFBhY2soY29udmVydCwgY29udmVydCkpOworCisJCQl1dXV1ID0gQXM8U2hvcnQ0PihJbnQyKGNvbnZlcnQpKSArIFNob3J0NCgoc2hvcnQpMHg4MDAwLCAoc2hvcnQpMHg4MDAwLCAoc2hvcnQpMHg4MDAwLCAoc2hvcnQpMHg4MDAwKTsKKwkJfQorCQllbHNlICAgLy8gV3JhcCAob3IgYm9yZGVyKQorCQl7CisJCQl1dXV1ID0gU2hvcnQ0KEludDQodXcgKiBGbG9hdDQoMSA8PCAxNikpKTsKKwkJfQorCX0KKworCXZvaWQgU2FtcGxlckNvcmU6OmNvbnZlcnRGaXhlZDEyKFNob3J0NCAmY2ksIEZsb2F0NCAmY2YpCisJeworCQljaSA9IFJvdW5kU2hvcnQ0KGNmICogRmxvYXQ0KDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCkpOworCX0KKworCXZvaWQgU2FtcGxlckNvcmU6OmNvbnZlcnRGaXhlZDEyKENvbG9yNGkgJmNpLCBDb2xvcjRmICZjZikKKwl7CisJCWNvbnZlcnRGaXhlZDEyKGNpLnIsIGNmLnIpOworCQljb252ZXJ0Rml4ZWQxMihjaS5nLCBjZi5nKTsKKwkJY29udmVydEZpeGVkMTIoY2kuYiwgY2YuYik7CisJCWNvbnZlcnRGaXhlZDEyKGNpLmEsIGNmLmEpOworCX0KKworCXZvaWQgU2FtcGxlckNvcmU6OmNvbnZlcnRTaWduZWQxMihGbG9hdDQgJmNmLCBTaG9ydDQgJmNpKQorCXsKKwkJY2YgPSBGbG9hdDQoY2kpICogRmxvYXQ0KDEuMGYgLyAweDBGRkUpOworCX0KKworLy8Jdm9pZCBTYW1wbGVyQ29yZTo6Y29udmVydFNpZ25lZDEyKENvbG9yNGYgJmNmLCBDb2xvcjRpICZjaSkKKy8vCXsKKy8vCQljb252ZXJ0U2lnbmVkMTIoY2YuciwgY2kucik7CisvLwkJY29udmVydFNpZ25lZDEyKGNmLmcsIGNpLmcpOworLy8JCWNvbnZlcnRTaWduZWQxMihjZi5iLCBjaS5iKTsKKy8vCQljb252ZXJ0U2lnbmVkMTIoY2YuYSwgY2kuYSk7CisvLwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpjb252ZXJ0U2lnbmVkMTUoRmxvYXQ0ICZjZiwgU2hvcnQ0ICZjaSkKKwl7CisJCWNmID0gRmxvYXQ0KGNpKSAqIEZsb2F0NCgxLjBmIC8gMHg3RkZGLCAxLjBmIC8gMHg3RkZGLCAxLjBmIC8gMHg3RkZGLCAxLjBmIC8gMHg3RkZGKTsKKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpjb252ZXJ0VW5zaWduZWQxNihGbG9hdDQgJmNmLCBTaG9ydDQgJmNpKQorCXsKKwkJY2YgPSBGbG9hdDQoQXM8VVNob3J0ND4oY2kpKSAqIEZsb2F0NCgxLjBmIC8gMHhGRkZGLCAxLjBmIC8gMHhGRkZGLCAxLjBmIC8gMHhGRkZGLCAxLjBmIC8gMHhGRkZGKTsKKwl9CisKKwl2b2lkIFNhbXBsZXJDb3JlOjpzUkdCdG9MaW5lYXIxNl8xMihTaG9ydDQgJmMpCisJeworCQljID0gQXM8VVNob3J0ND4oYykgPj4gODsKKworCQlQb2ludGVyPEJ5dGU+IExVVCA9IFBvaW50ZXI8Qnl0ZT4oY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxzUkdCdG9MaW5lYXI4KSk7CisKKwkJYyA9IEluc2VydChjLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMsIDApKSksIDApOworCQljID0gSW5zZXJ0KGMsICpQb2ludGVyPFNob3J0PihMVVQgKyAyICogSW50KEV4dHJhY3QoYywgMSkpKSwgMSk7CisJCWMgPSBJbnNlcnQoYywgKlBvaW50ZXI8U2hvcnQ+KExVVCArIDIgKiBJbnQoRXh0cmFjdChjLCAyKSkpLCAyKTsKKwkJYyA9IEluc2VydChjLCAqUG9pbnRlcjxTaG9ydD4oTFVUICsgMiAqIEludChFeHRyYWN0KGMsIDMpKSksIDMpOworCX0KKworCWJvb2wgU2FtcGxlckNvcmU6Omhhc0Zsb2F0VGV4dHVyZSgpIGNvbnN0CisJeworCQlyZXR1cm4gU3VyZmFjZTo6aXNGbG9hdEZvcm1hdCgoRm9ybWF0KXN0YXRlLnRleHR1cmVGb3JtYXQpOworCX0KKworCWJvb2wgU2FtcGxlckNvcmU6Omhhc1Vuc2lnbmVkVGV4dHVyZUNvbXBvbmVudChpbnQgY29tcG9uZW50KSBjb25zdAorCXsKKwkJcmV0dXJuIFN1cmZhY2U6OmlzVW5zaWduZWRDb21wb25lbnQoKEZvcm1hdClzdGF0ZS50ZXh0dXJlRm9ybWF0LCBjb21wb25lbnQpOworCX0KKworCWludCBTYW1wbGVyQ29yZTo6dGV4dHVyZUNvbXBvbmVudENvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiBTdXJmYWNlOjpjb21wb25lbnRDb3VudCgoRm9ybWF0KXN0YXRlLnRleHR1cmVGb3JtYXQpOworCX0KKworCWJvb2wgU2FtcGxlckNvcmU6OmhhczE2Yml0VGV4dHVyZSgpIGNvbnN0CisJeworCQlzd2l0Y2goc3RhdGUudGV4dHVyZUZvcm1hdCkKKwkJeworCQljYXNlIEZPUk1BVF9HOFI4OgorCQljYXNlIEZPUk1BVF9YOFI4RzhCODoKKwkJY2FzZSBGT1JNQVRfQThSOEc4Qjg6CisJCWNhc2UgRk9STUFUX1Y4VTg6CisJCWNhc2UgRk9STUFUX1E4VzhWOFU4OgorCQljYXNlIEZPUk1BVF9YOEw4VjhVODoKKwkJY2FzZSBGT1JNQVRfUjMyRjoKKwkJY2FzZSBGT1JNQVRfRzMyUjMyRjoKKwkJY2FzZSBGT1JNQVRfQTMyQjMyRzMyUjMyRjoKKwkJY2FzZSBGT1JNQVRfQTg6CisJCWNhc2UgRk9STUFUX1I4OgorCQljYXNlIEZPUk1BVF9MODoKKwkJY2FzZSBGT1JNQVRfQThMODoKKwkJY2FzZSBGT1JNQVRfRDMyRl9MT0NLQUJMRToKKwkJY2FzZSBGT1JNQVRfRDMyRl9URVhUVVJFOgorCQljYXNlIEZPUk1BVF9EMzJGX1NIQURPVzoKKwkJCXJldHVybiBmYWxzZTsKKwkJY2FzZSBGT1JNQVRfTDE2OgorCQljYXNlIEZPUk1BVF9HMTZSMTY6CisJCWNhc2UgRk9STUFUX0ExNkIxNkcxNlIxNjoKKwkJY2FzZSBGT1JNQVRfVjE2VTE2OgorCQljYXNlIEZPUk1BVF9BMTZXMTZWMTZVMTY6CisJCWNhc2UgRk9STUFUX1ExNlcxNlYxNlUxNjoKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWJvb2wgU2FtcGxlckNvcmU6OmlzUkdCQ29tcG9uZW50KGludCBjb21wb25lbnQpIGNvbnN0CisJeworCQlzd2l0Y2goc3RhdGUudGV4dHVyZUZvcm1hdCkKKwkJeworCQljYXNlIEZPUk1BVF9HOFI4OiAgICAgICAgICByZXR1cm4gY29tcG9uZW50IDwgMjsKKwkJY2FzZSBGT1JNQVRfWDhSOEc4Qjg6ICAgICAgcmV0dXJuIGNvbXBvbmVudCA8IDM7CisJCWNhc2UgRk9STUFUX0E4UjhHOEI4OiAgICAgIHJldHVybiBjb21wb25lbnQgPCAzOworCQljYXNlIEZPUk1BVF9WOFU4OiAgICAgICAgICByZXR1cm4gZmFsc2U7CisJCWNhc2UgRk9STUFUX1E4VzhWOFU4OiAgICAgIHJldHVybiBmYWxzZTsKKwkJY2FzZSBGT1JNQVRfWDhMOFY4VTg6ICAgICAgcmV0dXJuIGZhbHNlOworCQljYXNlIEZPUk1BVF9SMzJGOiAgICAgICAgICByZXR1cm4gY29tcG9uZW50IDwgMTsKKwkJY2FzZSBGT1JNQVRfRzMyUjMyRjogICAgICAgcmV0dXJuIGNvbXBvbmVudCA8IDI7CisJCWNhc2UgRk9STUFUX0EzMkIzMkczMlIzMkY6IHJldHVybiBjb21wb25lbnQgPCAzOworCQljYXNlIEZPUk1BVF9BODogICAgICAgICAgICByZXR1cm4gZmFsc2U7CisJCWNhc2UgRk9STUFUX1I4OiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQgPCAxOworCQljYXNlIEZPUk1BVF9MODogICAgICAgICAgICByZXR1cm4gY29tcG9uZW50IDwgMTsKKwkJY2FzZSBGT1JNQVRfQThMODogICAgICAgICAgcmV0dXJuIGNvbXBvbmVudCA8IDE7CisJCWNhc2UgRk9STUFUX0QzMkZfTE9DS0FCTEU6IHJldHVybiBmYWxzZTsKKwkJY2FzZSBGT1JNQVRfRDMyRl9URVhUVVJFOiAgcmV0dXJuIGZhbHNlOworCQljYXNlIEZPUk1BVF9EMzJGX1NIQURPVzogICByZXR1cm4gZmFsc2U7CisJCWNhc2UgRk9STUFUX0wxNjogICAgICAgICAgIHJldHVybiBjb21wb25lbnQgPCAxOworCQljYXNlIEZPUk1BVF9HMTZSMTY6ICAgICAgICByZXR1cm4gY29tcG9uZW50IDwgMjsKKwkJY2FzZSBGT1JNQVRfQTE2QjE2RzE2UjE2OiAgcmV0dXJuIGNvbXBvbmVudCA8IDM7CisJCWNhc2UgRk9STUFUX1YxNlUxNjogICAgICAgIHJldHVybiBmYWxzZTsKKwkJY2FzZSBGT1JNQVRfQTE2VzE2VjE2VTE2OiAgcmV0dXJuIGZhbHNlOworCQljYXNlIEZPUk1BVF9RMTZXMTZWMTZVMTY6ICByZXR1cm4gZmFsc2U7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1NoYWRlci9TYW1wbGVyQ29yZS5ocHAgYi9zcmMvU2hhZGVyL1NhbXBsZXJDb3JlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2MxMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1NoYWRlci9TYW1wbGVyQ29yZS5ocHAKQEAgLTAsMCArMSw2OSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgc3dfU2FtcGxlckNvcmVfaHBwDQorI2RlZmluZSBzd19TYW1wbGVyQ29yZV9ocHANCisNCisjaW5jbHVkZSAiUGl4ZWxSb3V0aW5lLmhwcCINCisjaW5jbHVkZSAiUmVhY3Rvci9OdWNsZXVzLmhwcCINCisNCituYW1lc3BhY2Ugc3cNCit7DQorCWNsYXNzIFNhbXBsZXJDb3JlDQorCXsNCisJcHVibGljOg0KKwkJU2FtcGxlckNvcmUoUG9pbnRlcjxCeXRlPiAmciwgY29uc3QgU2FtcGxlcjo6U3RhdGUgJnN0YXRlKTsNCisNCisJCXZvaWQgc2FtcGxlVGV4dHVyZShQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBDb2xvcjRpICZjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdDQgJnEsIENvbG9yNGYgJmRzeCwgQ29sb3I0ZiAmZHN5LCBib29sIGJpYXMgPSBmYWxzZSwgYm9vbCBmaXhlZDEyID0gdHJ1ZSwgYm9vbCBncmFkaWVudHMgPSBmYWxzZSwgYm9vbCBsb2RQcm92aWRlZCA9IGZhbHNlKTsNCisJCXZvaWQgc2FtcGxlVGV4dHVyZShQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBDb2xvcjRmICZjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdDQgJnEsIENvbG9yNGYgJmRzeCwgQ29sb3I0ZiAmZHN5LCBib29sIGJpYXMgPSBmYWxzZSwgYm9vbCBncmFkaWVudHMgPSBmYWxzZSwgYm9vbCBsb2RQcm92aWRlZCA9IGZhbHNlKTsNCisNCisJcHJpdmF0ZToNCisJCXZvaWQgYm9yZGVyKFNob3J0NCAmbWFzaywgRmxvYXQ0ICZjb29yZGluYXRlcyk7DQorCQl2b2lkIGJvcmRlcihJbnQ0ICZtYXNrLCBGbG9hdDQgJmNvb3JkaW5hdGVzKTsNCisJCVNob3J0NCBvZmZzZXRTYW1wbGUoU2hvcnQ0ICZ1dncsIFBvaW50ZXI8Qnl0ZT4gJm1pcG1hcCwgaW50IGhhbGZPZmZzZXQsIGJvb2wgd3JhcCwgaW50IGNvdW50KTsNCisJCXZvaWQgc2FtcGxlRmlsdGVyKFBvaW50ZXI8Qnl0ZT4gJnRleHR1cmUsIENvbG9yNGkgJmMsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJncsIEZsb2F0ICZsb2QsIEZsb2F0ICZhbmlzb3Ryb3B5LCBGbG9hdDQgJnVEZWx0YSwgRmxvYXQ0ICZ2RGVsdGEsIEludCBmYWNlWzRdLCBib29sIGxvZFByb3ZpZGVkKTsNCisJCXZvaWQgc2FtcGxlQW5pc28oUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgQ29sb3I0aSAmYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmdywgRmxvYXQgJmxvZCwgRmxvYXQgJmFuaXNvdHJvcHksIEZsb2F0NCAmdURlbHRhLCBGbG9hdDQgJnZEZWx0YSwgSW50IGZhY2VbNF0sIGJvb2wgc2Vjb25kTE9ELCBib29sIGxvZFByb3ZpZGVkKTsNCisJCXZvaWQgc2FtcGxlUXVhZChQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBDb2xvcjRpICZjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdCAmbG9kLCBJbnQgZmFjZVs0XSwgYm9vbCBzZWNvbmRMT0QpOw0KKwkJdm9pZCBzYW1wbGVRdWFkMkQoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgQ29sb3I0aSAmYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0ICZsb2QsIEludCBmYWNlWzRdLCBib29sIHNlY29uZExPRCk7DQorCQl2b2lkIHNhbXBsZTNEKFBvaW50ZXI8Qnl0ZT4gJnRleHR1cmUsIENvbG9yNGkgJmMsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJncsIEZsb2F0ICZsb2QsIGJvb2wgc2Vjb25kTE9EKTsNCisJCXZvaWQgc2FtcGxlRmxvYXRGaWx0ZXIoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgQ29sb3I0ZiAmYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmdywgRmxvYXQgJmxvZCwgRmxvYXQgJmFuaXNvdHJvcHksIEZsb2F0NCAmdURlbHRhLCBGbG9hdDQgJnZEZWx0YSwgSW50IGZhY2VbNF0sIGJvb2wgbG9kUHJvdmlkZWQpOw0KKwkJdm9pZCBzYW1wbGVGbG9hdEFuaXNvKFBvaW50ZXI8Qnl0ZT4gJnRleHR1cmUsIENvbG9yNGYgJmMsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJncsIEZsb2F0ICZsb2QsIEZsb2F0ICZhbmlzb3Ryb3B5LCBGbG9hdDQgJnVEZWx0YSwgRmxvYXQ0ICZ2RGVsdGEsIEludCBmYWNlWzRdLCBib29sIHNlY29uZExPRCwgYm9vbCBsb2RQcm92aWRlZCk7DQorCQl2b2lkIHNhbXBsZUZsb2F0KFBvaW50ZXI8Qnl0ZT4gJnRleHR1cmUsIENvbG9yNGYgJmMsIEZsb2F0NCAmdSwgRmxvYXQ0ICZ2LCBGbG9hdDQgJncsIEZsb2F0ICZsb2QsIEludCBmYWNlWzRdLCBib29sIHNlY29uZExPRCk7DQorCQl2b2lkIHNhbXBsZUZsb2F0MkQoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgQ29sb3I0ZiAmYywgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0NCAmeiwgRmxvYXQgJmxvZCwgSW50IGZhY2VbNF0sIGJvb2wgc2Vjb25kTE9EKTsNCisJCXZvaWQgc2FtcGxlRmxvYXQzRChQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBDb2xvcjRmICZjLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdCAmbG9kLCBib29sIHNlY29uZExPRCk7DQorCQl2b2lkIGNvbXB1dGVMb2QoUG9pbnRlcjxCeXRlPiAmdGV4dHVyZSwgRmxvYXQgJmxvZCwgRmxvYXQgJmFuaXNvdHJvcHksIEZsb2F0NCAmdURlbHRhLCBGbG9hdDQgJnZEZWx0YSwgRmxvYXQ0ICZ1LCBGbG9hdDQgJnYsIEZsb2F0ICZsb2RCaWFzLCBDb2xvcjRmICZkc3gsIENvbG9yNGYgJmRzeSwgYm9vbCBiaWFzLCBib29sIGdyYWRpZW50cywgYm9vbCBsb2RQcm92aWRlZCk7DQorCQl2b2lkIGNvbXB1dGVMb2QzRChQb2ludGVyPEJ5dGU+ICZ0ZXh0dXJlLCBGbG9hdCAmbG9kLCBGbG9hdDQgJnUsIEZsb2F0NCAmdiwgRmxvYXQ0ICZ3LCBGbG9hdCAmbG9kQmlhcywgQ29sb3I0ZiAmZHN4LCBDb2xvcjRmICZkc3ksIGJvb2wgYmlhcywgYm9vbCBncmFkaWVudHMsIGJvb2wgbG9kUHJvdmlkZWQpOw0KKwkJdm9pZCBjdWJlRmFjZShJbnQgZmFjZVs0XSwgRmxvYXQ0ICZVLCBGbG9hdDQgJlYsIEZsb2F0NCAmbG9kVSwgRmxvYXQ0ICZsb2RWLCBGbG9hdDQgJngsIEZsb2F0NCAmeSwgRmxvYXQ0ICZ6KTsNCisJCXZvaWQgY29tcHV0ZUluZGljZXMoSW50IGluZGV4WzRdLCBTaG9ydDQgdXV1dSwgU2hvcnQ0IHZ2dnYsIFNob3J0NCB3d3d3LCBjb25zdCBQb2ludGVyPEJ5dGU+ICZtaXBtYXApOw0KKwkJdm9pZCBzYW1wbGVUZXhlbChDb2xvcjRpICZjLCBTaG9ydDQgJnUsIFNob3J0NCAmdiwgU2hvcnQ0ICZzLCBQb2ludGVyPEJ5dGU+ICZtaXBtYXAsIFBvaW50ZXI8Qnl0ZT4gYnVmZmVyWzRdKTsNCisJCXZvaWQgc2FtcGxlVGV4ZWwoQ29sb3I0ZiAmYywgU2hvcnQ0ICZ1LCBTaG9ydDQgJnYsIFNob3J0NCAmcywgRmxvYXQ0ICZ6LCBQb2ludGVyPEJ5dGU+ICZtaXBtYXAsIFBvaW50ZXI8Qnl0ZT4gYnVmZmVyWzRdKTsNCisJCXZvaWQgc2VsZWN0TWlwbWFwKFBvaW50ZXI8Qnl0ZT4gJnRleHR1cmUsIFBvaW50ZXI8Qnl0ZT4gYnVmZmVyWzRdLCBQb2ludGVyPEJ5dGU+ICZtaXBtYXAsIEZsb2F0ICZsb2QsIEludCBmYWNlWzRdLCBib29sIHNlY29uZExPRCk7DQorCQl2b2lkIGFkZHJlc3MoU2hvcnQ0ICZ1dXV1LCBGbG9hdDQgJnV3LCBBZGRyZXNzaW5nTW9kZSBhZGRyZXNzaW5nTW9kZSk7DQorDQorCQl2b2lkIGNvbnZlcnRGaXhlZDEyKFNob3J0NCAmY2ksIEZsb2F0NCAmY2YpOw0KKwkJdm9pZCBjb252ZXJ0Rml4ZWQxMihDb2xvcjRpICZjaSwgQ29sb3I0ZiAmY2YpOw0KKwkJdm9pZCBjb252ZXJ0U2lnbmVkMTIoRmxvYXQ0ICZjZiwgU2hvcnQ0ICZjaSk7DQorCQl2b2lkIGNvbnZlcnRTaWduZWQxNShGbG9hdDQgJmNmLCBTaG9ydDQgJmNpKTsNCisJCXZvaWQgY29udmVydFVuc2lnbmVkMTYoRmxvYXQ0ICZjZiwgU2hvcnQ0ICZjaSk7DQorCQl2b2lkIHNSR0J0b0xpbmVhcjE2XzEyKFNob3J0NCAmYyk7DQorDQorCQlib29sIGhhc0Zsb2F0VGV4dHVyZSgpIGNvbnN0Ow0KKwkJYm9vbCBoYXNVbnNpZ25lZFRleHR1cmVDb21wb25lbnQoaW50IGNvbXBvbmVudCkgY29uc3Q7DQorCQlpbnQgdGV4dHVyZUNvbXBvbmVudENvdW50KCkgY29uc3Q7DQorCQlib29sIGhhczE2Yml0VGV4dHVyZSgpIGNvbnN0Ow0KKwkJYm9vbCBpc1JHQkNvbXBvbmVudChpbnQgY29tcG9uZW50KSBjb25zdDsNCisNCisJCVBvaW50ZXI8Qnl0ZT4gJmNvbnN0YW50czsNCisJCWNvbnN0IFNhbXBsZXI6OlN0YXRlICZzdGF0ZTsNCisJfTsNCit9DQorDQorI2VuZGlmICAgLy8gc3dfU2FtcGxlckNvcmVfaHBwDQpkaWZmIC0tZ2l0IGEvc3JjL1NoYWRlci9TZXR1cFJvdXRpbmUuY3BwIGIvc3JjL1NoYWRlci9TZXR1cFJvdXRpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYTJhMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU2hhZGVyL1NldHVwUm91dGluZS5jcHAKQEAgLTAsMCArMSw2NjEgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIlNldHVwUm91dGluZS5ocHAiCisKKyNpbmNsdWRlICJDb25zdGFudHMuaHBwIgorI2luY2x1ZGUgIlJlbmRlcmVyL1ByaW1pdGl2ZS5ocHAiCisjaW5jbHVkZSAiUmVuZGVyZXIvUG9seWdvbi5ocHAiCisjaW5jbHVkZSAiUmVuZGVyZXIvUmVuZGVyZXIuaHBwIgorI2luY2x1ZGUgIlJlYWN0b3IvU2hlbGwuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwlleHRlcm4gYm9vbCBjb21wbGVtZW50YXJ5RGVwdGhCdWZmZXI7CisJZXh0ZXJuIFRyYW5zY2VuZGVudGFsUHJlY2lzaW9uIGxvZ1ByZWNpc2lvbjsKKworCVNldHVwUm91dGluZTo6U2V0dXBSb3V0aW5lKGNvbnN0IFNldHVwUHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUpIDogc3RhdGUoc3RhdGUpCisJeworCQlyb3V0aW5lID0gMDsKKwl9CisKKwlTZXR1cFJvdXRpbmU6On5TZXR1cFJvdXRpbmUoKQorCXsKKwl9CisKKwl2b2lkIFNldHVwUm91dGluZTo6Z2VuZXJhdGUoKQorCXsKKwkJRnVuY3Rpb248Qm9vbCwgUG9pbnRlcjxCeXRlPiwgUG9pbnRlcjxCeXRlPiwgUG9pbnRlcjxCeXRlPiwgUG9pbnRlcjxCeXRlPj4gZnVuY3Rpb247CisJCXsKKwkJCVBvaW50ZXI8Qnl0ZT4gcHJpbWl0aXZlKGZ1bmN0aW9uLmFyZygwKSk7CisJCQlQb2ludGVyPEJ5dGU+IHRyaShmdW5jdGlvbi5hcmcoMSkpOworCQkJUG9pbnRlcjxCeXRlPiBwb2x5Z29uKGZ1bmN0aW9uLmFyZygyKSk7CisJCQlQb2ludGVyPEJ5dGU+IGRhdGEoZnVuY3Rpb24uYXJnKDMpKTsKKworCQkJUG9pbnRlcjxCeXRlPiBjb25zdGFudHMgPSAqUG9pbnRlcjxQb2ludGVyPEJ5dGU+PihkYXRhICsgT0ZGU0VUKERyYXdEYXRhLGNvbnN0YW50cykpOworCisJCQljb25zdCBib29sIHBvaW50ID0gc3RhdGUuaXNEcmF3UG9pbnQ7CisJCQljb25zdCBib29sIHNwcml0ZSA9IHN0YXRlLnBvaW50U3ByaXRlOworCQkJY29uc3QgYm9vbCBsaW5lID0gc3RhdGUuaXNEcmF3TGluZTsKKwkJCWNvbnN0IGJvb2wgdHJpYW5nbGUgPSBzdGF0ZS5pc0RyYXdTb2xpZFRyaWFuZ2xlIHx8IHNwcml0ZTsKKwkJCWNvbnN0IGJvb2wgc29saWRUcmlhbmdsZSA9IHN0YXRlLmlzRHJhd1NvbGlkVHJpYW5nbGU7CisKKwkJCWNvbnN0IGludCBWMCA9IE9GRlNFVChUcmlhbmdsZSx2MCk7CisJCQljb25zdCBpbnQgVjEgPSAodHJpYW5nbGUgfHwgbGluZSkgPyBPRkZTRVQoVHJpYW5nbGUsdjEpIDogT0ZGU0VUKFRyaWFuZ2xlLHYwKTsKKwkJCWNvbnN0IGludCBWMiA9IHRyaWFuZ2xlID8gT0ZGU0VUKFRyaWFuZ2xlLHYyKSA6IChsaW5lID8gT0ZGU0VUKFRyaWFuZ2xlLHYxKSA6IE9GRlNFVChUcmlhbmdsZSx2MCkpOworCisJCQlpbnQgcG9zID0gc3RhdGUucG9zaXRpb25SZWdpc3RlcjsKKworCQkJUG9pbnRlcjxCeXRlPiB2MCA9IHRyaSArIFYwOworCQkJUG9pbnRlcjxCeXRlPiB2MSA9IHRyaSArIFYxOworCQkJUG9pbnRlcjxCeXRlPiB2MiA9IHRyaSArIFYyOworCisJCQlBcnJheTxJbnQ+IFgoMTYpOworCQkJQXJyYXk8SW50PiBZKDE2KTsKKworCQkJWFswXSA9ICpQb2ludGVyPEludD4odjAgKyBPRkZTRVQoVmVydGV4LFgpKTsKKwkJCVhbMV0gPSAqUG9pbnRlcjxJbnQ+KHYxICsgT0ZGU0VUKFZlcnRleCxYKSk7CisJCQlYWzJdID0gKlBvaW50ZXI8SW50Pih2MiArIE9GRlNFVChWZXJ0ZXgsWCkpOworCisJCQlZWzBdID0gKlBvaW50ZXI8SW50Pih2MCArIE9GRlNFVChWZXJ0ZXgsWSkpOworCQkJWVsxXSA9ICpQb2ludGVyPEludD4odjEgKyBPRkZTRVQoVmVydGV4LFkpKTsKKwkJCVlbMl0gPSAqUG9pbnRlcjxJbnQ+KHYyICsgT0ZGU0VUKFZlcnRleCxZKSk7CisKKwkJCUludCBkID0gMTsgICAgIC8vIFdpbmRpbmcgZGlyZWN0aW9uCisKKwkJCS8vIEN1bGxpbmcKKwkJCWlmKHNvbGlkVHJpYW5nbGUpCisJCQl7CisJCQkJRmxvYXQgeDAgPSBGbG9hdChYWzBdKTsKKwkJCQlGbG9hdCB4MSA9IEZsb2F0KFhbMV0pOworCQkJCUZsb2F0IHgyID0gRmxvYXQoWFsyXSk7CisKKwkJCQlGbG9hdCB5MCA9IEZsb2F0KFlbMF0pOworCQkJCUZsb2F0IHkxID0gRmxvYXQoWVsxXSk7CisJCQkJRmxvYXQgeTIgPSBGbG9hdChZWzJdKTsKKworCQkJCUZsb2F0IEEgPSAoeTIgLSB5MCkgKiB4MSArICh5MSAtIHkyKSAqIHgwICsgKHkwIC0geTEpICogeDI7ICAgLy8gQXJlYQorCisJCQkJSWYoQSA9PSBGbG9hdCgwLjBmKSkKKwkJCQl7CisJCQkJCVJldHVybihmYWxzZSk7CisJCQkJfQorCisJCQkJRmxvYXQgdzB3MXcyID0gKlBvaW50ZXI8RmxvYXQ+KHYwICsgcG9zICogMTYgKyAxMikgKgorCQkJCQkJCSAgICpQb2ludGVyPEZsb2F0Pih2MSArIHBvcyAqIDE2ICsgMTIpICoKKwkJCQkJCQkgICAqUG9pbnRlcjxGbG9hdD4odjIgKyBwb3MgKiAxNiArIDEyKTsKKworCQkJCUEgPSBJZlRoZW5FbHNlKHcwdzF3MiA8IEZsb2F0KDAuMGYpLCAtQSwgQSk7CisKKwkJCQlpZihzdGF0ZS5jdWxsTW9kZSA9PSBDb250ZXh0OjpDVUxMX0NMT0NLV0lTRSkKKwkJCQl7CisJCQkJCUlmKEEgPj0gRmxvYXQoMC4wZikpIFJldHVybihmYWxzZSk7CisJCQkJfQorCQkJCWVsc2UgaWYoc3RhdGUuY3VsbE1vZGUgPT0gQ29udGV4dDo6Q1VMTF9DT1VOVEVSQ0xPQ0tXSVNFKQorCQkJCXsKKwkJCQkJSWYoQSA8PSBGbG9hdCgwLjBmKSkgUmV0dXJuKGZhbHNlKTsKKwkJCQl9CisKKwkJCQlkID0gSWZUaGVuRWxzZShBIDwgRmxvYXQoMC4wZiksIGQsIEludCgwKSk7CisKKwkJCQlpZihzdGF0ZS50d29TaWRlZFN0ZW5jaWwpCisJCQkJeworCQkJCQlCeXRlOCBjbG9ja3dpc2VNYXNrID0gSWZUaGVuRWxzZShBID4gRmxvYXQoMC4wZiksIEJ5dGU4KDB4RkZGRkZGRkZGRkZGRkZGRiksIEJ5dGU4KDB4MDAwMDAwMDAwMDAwMDAwMCkpOworCisJCQkJCSpQb2ludGVyPEJ5dGU4PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLGNsb2Nrd2lzZU1hc2spKSA9ICBjbG9ja3dpc2VNYXNrOworCQkJCQkqUG9pbnRlcjxCeXRlOD4ocHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSxpbnZDbG9ja3dpc2VNYXNrKSkgPSB+Y2xvY2t3aXNlTWFzazsKKwkJCQl9CisKKwkJCQlpZihzdGF0ZS52RmFjZSkKKwkJCQl7CisJCQkJCSpQb2ludGVyPEZsb2F0PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLGFyZWEpKSA9IEZsb2F0KDAuNWYpICogQTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoc3RhdGUudHdvU2lkZWRTdGVuY2lsKQorCQkJCXsKKwkJCQkJKlBvaW50ZXI8Qnl0ZTg+KHByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUsY2xvY2t3aXNlTWFzaykpID0gIEJ5dGU4KDB4RkZGRkZGRkZGRkZGRkZGRik7CisJCQkJCSpQb2ludGVyPEJ5dGU4PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLGludkNsb2Nrd2lzZU1hc2spKSA9IEJ5dGU4KDB4MDAwMDAwMDAwMDAwMDAwMCk7CisJCQkJfQorCQkJfQorCisJCQlJbnQgbiA9ICpQb2ludGVyPEludD4ocG9seWdvbiArIE9GRlNFVChQb2x5Z29uLG4pKTsKKwkJCUludCBtID0gKlBvaW50ZXI8SW50Pihwb2x5Z29uICsgT0ZGU0VUKFBvbHlnb24saSkpOworCisJCQlJZihtICE9IDAgfHwgQm9vbCghc29saWRUcmlhbmdsZSkpICAgLy8gQ2xpcHBlZCB0cmlhbmdsZTsgcmVwcm9qZWN0CisJCQl7CisJCQkJUG9pbnRlcjxCeXRlPiBWID0gcG9seWdvbiArIE9GRlNFVChQb2x5Z29uLFApICsgbSAqIHNpemVvZih2b2lkKikgKiAxNjsKKwkJCisJCQkJSW50IGkgPSAwOworCisJCQkJRG8KKwkJCQl7CisJCQkJCVBvaW50ZXI8RmxvYXQ0PiBwID0gKlBvaW50ZXI8UG9pbnRlcjxGbG9hdDQ+PihWICsgaSAqIHNpemVvZih2b2lkKikpOworCQkJCQlGbG9hdDQgdiA9ICpQb2ludGVyPEZsb2F0ND4ocCwgMTYpOworCisJCQkJCUZsb2F0IHcgPSB2Lnc7CisJCQkJCUZsb2F0IHJodyA9IElmVGhlbkVsc2UodyAhPSBGbG9hdCgwLjBmKSwgRmxvYXQoMS4wZikgLyB3LCBGbG9hdCgxLjBmKSk7CisKKwkJCQkJWFtpXSA9IFJvdW5kSW50KCpQb2ludGVyPEZsb2F0PihkYXRhICsgT0ZGU0VUKERyYXdEYXRhLExMTEx4MTYpKSArIHYueCAqIHJodyAqICpQb2ludGVyPEZsb2F0PihkYXRhICsgT0ZGU0VUKERyYXdEYXRhLFdXV1d4MTYpKSk7CisJCQkJCVlbaV0gPSBSb3VuZEludCgqUG9pbnRlcjxGbG9hdD4oZGF0YSArIE9GRlNFVChEcmF3RGF0YSxUVFRUeDE2KSkgKyB2LnkgKiByaHcgKiAqUG9pbnRlcjxGbG9hdD4oZGF0YSArIE9GRlNFVChEcmF3RGF0YSxISEhIeDE2KSkpOworCisJCQkJCWkrKzsKKwkJCQl9CisJCQkJVW50aWwoaSA+PSBuKQorCQkJfQorCisJCQkvLyBWZXJ0aWNhbCByYW5nZQorCQkJSW50IHlNaW4gPSBZWzBdOworCQkJSW50IHlNYXggPSBZWzBdOworCQkJCisJCQlJbnQgaSA9IDE7CisJCQkKKwkJCURvCisJCQl7CisJCQkJeU1pbiA9IElmVGhlbkVsc2UoWVtpXSA8IHlNaW4sIEludChZW2ldKSwgeU1pbik7ICAgLy8gRklYTUU6IE1pbihZW2ldLCB5TWluKQorCQkJCXlNYXggPSBJZlRoZW5FbHNlKFlbaV0gPiB5TWF4LCBJbnQoWVtpXSksIHlNYXgpOyAgIC8vIEZJWE1FOiBNYXgoWVtpXSwgeU1heCkKKworCQkJCWkrKzsKKwkJCX0KKwkJCVVudGlsKGkgPj0gbikKKworCQkJaWYoc3RhdGUubXVsdGlTYW1wbGUgPiAxKQorCQkJeworCQkJCXlNaW4gPSAoeU1pbiArIDB4MEEpID4+IDQ7CisJCQkJeU1heCA9ICh5TWF4ICsgMHgxNCkgPj4gNDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl5TWluID0gKHlNaW4gKyAweDBGKSA+PiA0OworCQkJCXlNYXggPSAoeU1heCArIDB4MEYpID4+IDQ7CisJCQl9CisKKwkJCUlmKHlNaW4gPT0geU1heCkKKwkJCXsKKwkJCQlSZXR1cm4oZmFsc2UpOworCQkJfQorCQkKKwkJCUZvcihJbnQgcSA9IDAsIHEgPCBzdGF0ZS5tdWx0aVNhbXBsZSwgcSsrKQorCQkJeworCQkJCUFycmF5PEludD4gWHEoMTYpOworCQkJCUFycmF5PEludD4gWXEoMTYpOworCisJCQkJSW50IGkgPSAwOworCisJCQkJRG8KKwkJCQl7CisJCQkJCVhxW2ldID0gWFtpXTsKKwkJCQkJWXFbaV0gPSBZW2ldOworCisJCQkJCWlmKHN0YXRlLm11bHRpU2FtcGxlID4gMSkKKwkJCQkJeworCQkJCQkJWHFbaV0gPSBYcVtpXSArICpQb2ludGVyPEludD4oY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxYZikgKyBxICogc2l6ZW9mKGludCkpOworCQkJCQkJWXFbaV0gPSBZcVtpXSArICpQb2ludGVyPEludD4oY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxZZikgKyBxICogc2l6ZW9mKGludCkpOworCQkJCQl9CisKKwkJCQkJaSsrOworCQkJCX0KKwkJCQlVbnRpbChpID49IG4pCisKKwkJCQlQb2ludGVyPEJ5dGU+IGxlZnRFZGdlID0gUG9pbnRlcjxCeXRlPihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLG91dGxpbmUtPmxlZnQpKSArIHEgKiBzaXplb2YoUHJpbWl0aXZlKTsKKwkJCQlQb2ludGVyPEJ5dGU+IHJpZ2h0RWRnZSA9IFBvaW50ZXI8Qnl0ZT4ocHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSxvdXRsaW5lLT5yaWdodCkpICsgcSAqIHNpemVvZihQcmltaXRpdmUpOworCisJCQkJaWYoc3RhdGUubXVsdGlTYW1wbGUgPiAxKQorCQkJCXsKKwkJCQkJU2hvcnQgeCA9IFNob3J0KChYWzBdICsgMHhGKSA+PiA0KTsKKworCQkJCQlGb3IoSW50IHkgPSB5TWluIC0gMSwgeSA8IHlNYXggKyAxLCB5KyspCisJCQkJCXsKKwkJCQkJCSpQb2ludGVyPFNob3J0PihsZWZ0RWRnZSArIHkgKiBzaXplb2YoUHJpbWl0aXZlOjpTcGFuKSkgPSB4OworCQkJCQkJKlBvaW50ZXI8U2hvcnQ+KHJpZ2h0RWRnZSArIHkgKiBzaXplb2YoUHJpbWl0aXZlOjpTcGFuKSkgPSB4OworCQkJCQl9CisJCQkJfQorCisJCQkJWHFbbl0gPSBYcVswXTsKKwkJCQlZcVtuXSA9IFlxWzBdOworCisJCQkJLy8gUmFzdGVyaXplCisJCQkJeworCQkJCQlJbnQgaSA9IDA7CisKKwkJCQkJRG8KKwkJCQkJeworCQkJCQkJZWRnZShwcmltaXRpdmUsIEludChYcVtpICsgMSAtIGRdKSwgSW50KFlxW2kgKyAxIC0gZF0pLCBJbnQoWHFbaSArIGRdKSwgSW50KFlxW2kgKyBkXSksIHEpOworCisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQkJVW50aWwoaSA+PSBuKQorCQkJCX0KKworCQkJCWlmKHN0YXRlLm11bHRpU2FtcGxlID09IDEpCisJCQkJeworCQkJCQlGb3IoeU1pbiwgeU1pbiA8IHlNYXggJiYgKlBvaW50ZXI8U2hvcnQ+KGxlZnRFZGdlICsgeU1pbiAqIHNpemVvZihQcmltaXRpdmU6OlNwYW4pKSA9PSAqUG9pbnRlcjxTaG9ydD4ocmlnaHRFZGdlICsgeU1pbiAqIHNpemVvZihQcmltaXRpdmU6OlNwYW4pKSwgeU1pbisrKQorCQkJCQl7CisJCQkJCQkvLyBJbmNyZW1lbnRzIHlNaW4KKwkJCQkJfQorCisJCQkJCUZvcih5TWF4LCB5TWF4ID4geU1pbiAmJiAqUG9pbnRlcjxTaG9ydD4obGVmdEVkZ2UgKyAoeU1heCAtIDEpICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpID09ICpQb2ludGVyPFNob3J0PihyaWdodEVkZ2UgKyAoeU1heCAtIDEpICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpLCB5TWF4LS0pCisJCQkJCXsKKwkJCQkJCS8vIERlY3JlbWVudHMgeU1heAorCQkJCQl9CisKKwkJCQkJSWYoeU1pbiA9PSB5TWF4KQorCQkJCQl7CisJCQkJCQlSZXR1cm4oZmFsc2UpOworCQkJCQl9CisKKwkJCQkJKlBvaW50ZXI8U2hvcnQ+KGxlZnRFZGdlICsgKHlNaW4gLSAxKSAqIHNpemVvZihQcmltaXRpdmU6OlNwYW4pKSA9ICpQb2ludGVyPFNob3J0PihsZWZ0RWRnZSArIHlNaW4gKiBzaXplb2YoUHJpbWl0aXZlOjpTcGFuKSk7CisJCQkJCSpQb2ludGVyPFNob3J0PihyaWdodEVkZ2UgKyAoeU1pbiAtIDEpICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpID0gKlBvaW50ZXI8U2hvcnQ+KGxlZnRFZGdlICsgeU1pbiAqIHNpemVvZihQcmltaXRpdmU6OlNwYW4pKTsKKwkJCQkJKlBvaW50ZXI8U2hvcnQ+KGxlZnRFZGdlICsgeU1heCAqIHNpemVvZihQcmltaXRpdmU6OlNwYW4pKSA9ICpQb2ludGVyPFNob3J0PihsZWZ0RWRnZSArICh5TWF4IC0gMSkgKiBzaXplb2YoUHJpbWl0aXZlOjpTcGFuKSk7CisJCQkJCSpQb2ludGVyPFNob3J0PihyaWdodEVkZ2UgKyB5TWF4ICogc2l6ZW9mKFByaW1pdGl2ZTo6U3BhbikpID0gKlBvaW50ZXI8U2hvcnQ+KGxlZnRFZGdlICsgKHlNYXggLSAxKSAqIHNpemVvZihQcmltaXRpdmU6OlNwYW4pKTsKKwkJCQl9CisJCQl9CisKKwkJCSpQb2ludGVyPEludD4ocHJpbWl0aXZlICsgT0ZGU0VUKFByaW1pdGl2ZSx5TWluKSkgPSB5TWluOworCQkJKlBvaW50ZXI8SW50PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHlNYXgpKSA9IHlNYXg7CisKKwkJCS8vIFNvcnQgYnkgbWluaW11bSB5CisJCQlpZihzb2xpZFRyaWFuZ2xlICYmIGxvZ1ByZWNpc2lvbiA+PSBXSFFMKQorCQkJeworCQkJCUZsb2F0IHkwID0gKlBvaW50ZXI8RmxvYXQ+KHYwICsgcG9zICogMTYgKyA0KTsKKwkJCQlGbG9hdCB5MSA9ICpQb2ludGVyPEZsb2F0Pih2MSArIHBvcyAqIDE2ICsgNCk7CisJCQkJRmxvYXQgeTIgPSAqUG9pbnRlcjxGbG9hdD4odjIgKyBwb3MgKiAxNiArIDQpOworCisJCQkJRmxvYXQgeU1pbiA9IE1pbihNaW4oeTAsIHkxKSwgeTIpOworCisJCQkJY29uZGl0aW9uYWxSb3RhdGUxKHlNaW4gPT0geTEsIHYwLCB2MSwgdjIpOworCQkJCWNvbmRpdGlvbmFsUm90YXRlMih5TWluID09IHkyLCB2MCwgdjEsIHYyKTsKKwkJCX0KKworCQkJLy8gU29ydCBieSBtYXhpbXVtIHcKKwkJCWlmKHNvbGlkVHJpYW5nbGUpCisJCQl7CisJCQkJRmxvYXQgdzAgPSAqUG9pbnRlcjxGbG9hdD4odjAgKyBwb3MgKiAxNiArIDEyKTsKKwkJCQlGbG9hdCB3MSA9ICpQb2ludGVyPEZsb2F0Pih2MSArIHBvcyAqIDE2ICsgMTIpOworCQkJCUZsb2F0IHcyID0gKlBvaW50ZXI8RmxvYXQ+KHYyICsgcG9zICogMTYgKyAxMik7CisKKwkJCQlGbG9hdCB3TWF4ID0gTWF4KE1heCh3MCwgdzEpLCB3Mik7CisKKwkJCQljb25kaXRpb25hbFJvdGF0ZTEod01heCA9PSB3MSwgdjAsIHYxLCB2Mik7CisJCQkJY29uZGl0aW9uYWxSb3RhdGUyKHdNYXggPT0gdzIsIHYwLCB2MSwgdjIpOworCQkJfQorCisJCQlGbG9hdDQgcDAgPSAqUG9pbnRlcjxGbG9hdDQ+KHYwICsgcG9zICogMTYsIDE2KTsKKwkJCUZsb2F0NCBwMSA9ICpQb2ludGVyPEZsb2F0ND4odjEgKyBwb3MgKiAxNiwgMTYpOworCQkJRmxvYXQ0IHAyID0gKlBvaW50ZXI8RmxvYXQ0Pih2MiArIHBvcyAqIDE2LCAxNik7CisKKwkJCUZsb2F0IHcwID0gcDAudzsKKwkJCUZsb2F0IHcxID0gcDEudzsKKwkJCUZsb2F0IHcyID0gcDIudzsKKworCQkJRmxvYXQ0IHcwMTI7CisKKwkJCXcwMTIueCA9IHcwOworCQkJdzAxMi55ID0gdzE7CisJCQl3MDEyLnogPSB3MjsKKwkJCXcwMTIudyA9IDE7CisKKwkJCUZsb2F0IHJodzAgPSAqUG9pbnRlcjxGbG9hdD4odjAgKyBPRkZTRVQoVmVydGV4LFcpKTsKKworCQkJSW50IFgwID0gKlBvaW50ZXI8SW50Pih2MCArIE9GRlNFVChWZXJ0ZXgsWCkpOworCQkJSW50IFgxID0gKlBvaW50ZXI8SW50Pih2MSArIE9GRlNFVChWZXJ0ZXgsWCkpOworCQkJSW50IFgyID0gKlBvaW50ZXI8SW50Pih2MiArIE9GRlNFVChWZXJ0ZXgsWCkpOworCisJCQlJbnQgWTAgPSAqUG9pbnRlcjxJbnQ+KHYwICsgT0ZGU0VUKFZlcnRleCxZKSk7CisJCQlJbnQgWTEgPSAqUG9pbnRlcjxJbnQ+KHYxICsgT0ZGU0VUKFZlcnRleCxZKSk7CisJCQlJbnQgWTIgPSAqUG9pbnRlcjxJbnQ+KHYyICsgT0ZGU0VUKFZlcnRleCxZKSk7CisKKwkJCWlmKGxpbmUpCisJCQl7CisJCQkJWDIgPSBYMSArIFkxIC0gWTA7CisJCQkJWTIgPSBZMSArIFgwIC0gWDE7CisJCQl9CisKKwkJCUZsb2F0IGR4ID0gRmxvYXQoWDApICogRmxvYXQoMS4wZiAvIDE2LjBmKTsKKwkJCUZsb2F0IGR5ID0gRmxvYXQoWTApICogRmxvYXQoMS4wZiAvIDE2LjBmKTsKKworCQkJWDEgLT0gWDA7CisJCQlZMSAtPSBZMDsKKworCQkJWDIgLT0gWDA7CisJCQlZMiAtPSBZMDsKKworCQkJRmxvYXQgeDEgPSB3MSAqIEZsb2F0KDEuMGYgLyAxNi4wZikgKiBGbG9hdChYMSk7CisJCQlGbG9hdCB5MSA9IHcxICogRmxvYXQoMS4wZiAvIDE2LjBmKSAqIEZsb2F0KFkxKTsKKworCQkJRmxvYXQgeDIgPSB3MiAqIEZsb2F0KDEuMGYgLyAxNi4wZikgKiBGbG9hdChYMik7CisJCQlGbG9hdCB5MiA9IHcyICogRmxvYXQoMS4wZiAvIDE2LjBmKSAqIEZsb2F0KFkyKTsKKworCQkJRmxvYXQgYSA9IHgxICogeTIgLSB4MiAqIHkxOworCisJCQlGbG9hdDQgeFF1YWQgPSBGbG9hdDQoMCwgMSwgMCwgMSkgLSBGbG9hdDQoZHgpOworCQkJRmxvYXQ0IHlRdWFkID0gRmxvYXQ0KDAsIDAsIDEsIDEpIC0gRmxvYXQ0KGR5KTsKKworCQkJKlBvaW50ZXI8RmxvYXQ0PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHhRdWFkKSwgMTYpID0geFF1YWQ7CisJCQkqUG9pbnRlcjxGbG9hdDQ+KHByaW1pdGl2ZSArIE9GRlNFVChQcmltaXRpdmUseVF1YWQpLCAxNikgPSB5UXVhZDsKKworCQkJRmxvYXQ0IE1bM107CisKKwkJCU1bMF0gPSBGbG9hdDQoMCwgMCwgMCwgMCk7CisJCQlNWzFdID0gRmxvYXQ0KDAsIDAsIDAsIDApOworCQkJTVsyXSA9IEZsb2F0NCgwLCAwLCAwLCAwKTsKKworCQkJTVswXS56ID0gcmh3MDsKKworCQkJSWYoYSAhPSBGbG9hdCgwLjBmKSkKKwkJCXsKKwkJCQlGbG9hdCBBID0gRmxvYXQoMSkgLyBhOworCQkJCUZsb2F0IEQgPSBBICogcmh3MDsKKworCQkJCU1bMF0ueCA9ICh5MSAqIHcyIC0geTIgKiB3MSkgKiBEOworCQkJCU1bMF0ueSA9ICh4MiAqIHcxIC0geDEgKiB3MikgKiBEOworCQkJLy8JTVswXS56ID0gcmh3MDsKKwkJCS8vCU1bMF0udyA9IDA7CisKKwkJCQlNWzFdLnggPSB5MiAqIEE7CisJCQkJTVsxXS55ID0gLXgyICogQTsKKwkJCS8vCU1bMV0ueiA9IDA7CisJCQkvLwlNWzFdLncgPSAwOworCisJCQkJTVsyXS54ID0gLXkxICogQTsKKwkJCQlNWzJdLnkgPSB4MSAqIEE7CisJCQkvLwlNWzJdLnogPSAwOworCQkJLy8JTVsyXS53ID0gMDsKKwkJCX0KKworCQkJaWYoc3RhdGUucGVyc3BlY3RpdmUpCisJCQl7CisJCQkJRmxvYXQ0IEFCQyA9IE1bMF0gKyBNWzFdICsgTVsyXTsKKworCQkJCUZsb2F0NCBBID0gQUJDLng7CisJCQkJRmxvYXQ0IEIgPSBBQkMueTsKKwkJCQlGbG9hdDQgQyA9IEFCQy56OworCisJCQkJKlBvaW50ZXI8RmxvYXQ0PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHcuQSksIDE2KSA9IEE7CisJCQkJKlBvaW50ZXI8RmxvYXQ0PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHcuQiksIDE2KSA9IEI7CisJCQkJKlBvaW50ZXI8RmxvYXQ0PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHcuQyksIDE2KSA9IEM7CisJCQl9CisKKwkJCWlmKHN0YXRlLmludGVycG9sYXRlRGVwdGgpCisJCQl7CisJCQkJRmxvYXQgejAgPSAqUG9pbnRlcjxGbG9hdD4odjAgKyBPRkZTRVQoVmVydGV4LFopKTsKKwkJCQlGbG9hdCB6MSA9ICpQb2ludGVyPEZsb2F0Pih2MSArIE9GRlNFVChWZXJ0ZXgsWikpOworCQkJCUZsb2F0IHoyID0gKlBvaW50ZXI8RmxvYXQ+KHYyICsgT0ZGU0VUKFZlcnRleCxaKSk7CisKKwkJCQl6MSAtPSB6MDsKKwkJCQl6MiAtPSB6MDsKKworCQkJCUZsb2F0NCBBOworCQkJCUZsb2F0NCBCOworCQkJCUZsb2F0NCBDOworCisJCQkJaWYoIXBvaW50KQorCQkJCXsKKwkJCQkJRmxvYXQgeDEgPSBGbG9hdChYMSkgKiBGbG9hdCgxLjBmIC8gMTYuMGYpOworCQkJCQlGbG9hdCB5MSA9IEZsb2F0KFkxKSAqIEZsb2F0KDEuMGYgLyAxNi4wZik7CisJCQkJCUZsb2F0IHgyID0gRmxvYXQoWDIpICogRmxvYXQoMS4wZiAvIDE2LjBmKTsKKwkJCQkJRmxvYXQgeTIgPSBGbG9hdChZMikgKiBGbG9hdCgxLjBmIC8gMTYuMGYpOworCisJCQkJCUZsb2F0IEQgPSAqUG9pbnRlcjxGbG9hdD4oZGF0YSArIE9GRlNFVChEcmF3RGF0YSxkZXB0aFJhbmdlKSkgLyAoeDEgKiB5MiAtIHgyICogeTEpOworCisJCQkJCUZsb2F0IGEgPSAoeTIgKiB6MSAtIHkxICogejIpICogRDsKKwkJCQkJRmxvYXQgYiA9ICh4MSAqIHoyIC0geDIgKiB6MSkgKiBEOworCisJCQkJCUEgPSBGbG9hdDQoYSk7CisJCQkJCUIgPSBGbG9hdDQoYik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUEgPSBGbG9hdDQoMCwgMCwgMCwgMCk7CisJCQkJCUIgPSBGbG9hdDQoMCwgMCwgMCwgMCk7CisJCQkJfQorCisJCQkJKlBvaW50ZXI8RmxvYXQ0PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHouQSksIDE2KSA9IEE7CisJCQkJKlBvaW50ZXI8RmxvYXQ0PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHouQiksIDE2KSA9IEI7CisKKwkJCQlGbG9hdCBjID0gejA7CisKKwkJCQlpZihzdGF0ZS5pc0RyYXdUcmlhbmdsZSAmJiBzdGF0ZS5zbG9wZURlcHRoQmlhcykKKwkJCQl7CisJCQkJCUZsb2F0IGJpYXMgPSBNYXgoQWJzKEZsb2F0KEEueCkpLCBBYnMoRmxvYXQoQi54KSkpOworCQkJCQliaWFzICo9ICpQb2ludGVyPEZsb2F0PihkYXRhICsgT0ZGU0VUKERyYXdEYXRhLHNsb3BlRGVwdGhCaWFzKSk7CisKKwkJCQkJaWYoY29tcGxlbWVudGFyeURlcHRoQnVmZmVyKQorCQkJCQl7CisJCQkJCQliaWFzID0gLWJpYXM7CisJCQkJCX0KKworCQkJCQljICs9IGJpYXM7CisJCQkJfQorCisJCQkJQyA9IEZsb2F0NChjICogKlBvaW50ZXI8RmxvYXQ+KGRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZGVwdGhSYW5nZSkpICsgKlBvaW50ZXI8RmxvYXQ+KGRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZGVwdGhOZWFyKSkpOworCisJCQkJKlBvaW50ZXI8RmxvYXQ0PihwcmltaXRpdmUgKyBPRkZTRVQoUHJpbWl0aXZlLHouQyksIDE2KSA9IEM7CisJCQl9CisKKwkJCWZvcihpbnQgaW50ZXJwb2xhbnQgPSAwOyBpbnRlcnBvbGFudCA8IDExOyBpbnRlcnBvbGFudCsrKQorCQkJeworCQkJCWludCBjb21wb25lbnRDb3VudCA9IGludGVycG9sYW50IDwgMTAgPyA0IDogMTsgICAvLyBGb2cgb25seSBoYXMgb25lIGNvbXBvbmVudAorCisJCQkJZm9yKGludCBjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCBjb21wb25lbnRDb3VudDsgY29tcG9uZW50KyspCisJCQkJeworCQkJCQlpbnQgYXR0cmlidXRlID0gc3RhdGUuZ3JhZGllbnRbaW50ZXJwb2xhbnRdW2NvbXBvbmVudF0uYXR0cmlidXRlOworCQkJCQlib29sIGZsYXQgPSBzdGF0ZS5ncmFkaWVudFtpbnRlcnBvbGFudF1bY29tcG9uZW50XS5mbGF0OworCQkJCQlib29sIHdyYXAgPSBzdGF0ZS5ncmFkaWVudFtpbnRlcnBvbGFudF1bY29tcG9uZW50XS53cmFwOworCisJCQkJCWlmKGF0dHJpYnV0ZSA8IDEyKQorCQkJCQl7CisJCQkJCQlzZXR1cEdyYWRpZW50KHByaW1pdGl2ZSwgdHJpLCB3MDEyLCBNLCB2MCwgdjEsIHYyLCBPRkZTRVQoVmVydGV4LHZbYXR0cmlidXRlXVtjb21wb25lbnRdKSwgT0ZGU0VUKFByaW1pdGl2ZSxWW2ludGVycG9sYW50XVtjb21wb25lbnRdKSwgZmxhdCwgc3ByaXRlLCBzdGF0ZS5wZXJzcGVjdGl2ZSwgd3JhcCwgY29tcG9uZW50KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJUmV0dXJuKHRydWUpOworCQl9CisKKwkJcm91dGluZSA9IGZ1bmN0aW9uKEwiU2V0dXBSb3V0aW5lIik7CisJfQorCisJdm9pZCBTZXR1cFJvdXRpbmU6OnNldHVwR3JhZGllbnQoUG9pbnRlcjxCeXRlPiAmcHJpbWl0aXZlLCBQb2ludGVyPEJ5dGU+ICZ0cmlhbmdsZSwgRmxvYXQ0ICZ3MDEyLCBGbG9hdDQgKCZtKVszXSwgUG9pbnRlcjxCeXRlPiAmdjAsIFBvaW50ZXI8Qnl0ZT4gJnYxLCBQb2ludGVyPEJ5dGU+ICZ2MiwgaW50IGF0dHJpYnV0ZSwgaW50IHBsYW5lRXF1YXRpb24sIGJvb2wgZmxhdCwgYm9vbCBzcHJpdGUsIGJvb2wgcGVyc3BlY3RpdmUsIGJvb2wgd3JhcCwgaW50IGNvbXBvbmVudCkKKwl7CisJCUZsb2F0NCBpOworCisJCWlmKCFmbGF0KQorCQl7CisJCQlpZighc3ByaXRlKQorCQkJeworCQkJCWkueCA9ICpQb2ludGVyPEZsb2F0Pih2MCArIGF0dHJpYnV0ZSk7CisJCQkJaS55ID0gKlBvaW50ZXI8RmxvYXQ+KHYxICsgYXR0cmlidXRlKTsKKwkJCQlpLnogPSAqUG9pbnRlcjxGbG9hdD4odjIgKyBhdHRyaWJ1dGUpOworCQkJCWkudyA9IDA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoY29tcG9uZW50ID09IDApIGkueCA9IEZsb2F0KDAuNWYpOworCQkJCWlmKGNvbXBvbmVudCA9PSAxKSBpLnggPSBGbG9hdCgwLjVmKTsKKwkJCQlpZihjb21wb25lbnQgPT0gMikgaS54ID0gRmxvYXQoMC4wZik7CisJCQkJaWYoY29tcG9uZW50ID09IDMpIGkueCA9IEZsb2F0KDEuMGYpOworCisJCQkJaWYoY29tcG9uZW50ID09IDApIGkueSA9IEZsb2F0KDEuMGYpOworCQkJCWlmKGNvbXBvbmVudCA9PSAxKSBpLnkgPSBGbG9hdCgwLjVmKTsKKwkJCQlpZihjb21wb25lbnQgPT0gMikgaS55ID0gRmxvYXQoMC4wZik7CisJCQkJaWYoY29tcG9uZW50ID09IDMpIGkueSA9IEZsb2F0KDEuMGYpOworCisJCQkJaWYoY29tcG9uZW50ID09IDApIGkueiA9IEZsb2F0KDAuNWYpOworCQkJCWlmKGNvbXBvbmVudCA9PSAxKSBpLnogPSBGbG9hdCgwLjBmKTsKKwkJCQlpZihjb21wb25lbnQgPT0gMikgaS56ID0gRmxvYXQoMC4wZik7CisJCQkJaWYoY29tcG9uZW50ID09IDMpIGkueiA9IEZsb2F0KDEuMGYpOworCQkJCQorCQkJCWkudyA9IDA7CisJCQl9CisKKwkJCWlmKHdyYXApCisJCQl7CisJCQkJRmxvYXQgbTsKKworCQkJCW0gPSAqUG9pbnRlcjxGbG9hdD4odjAgKyBhdHRyaWJ1dGUpOworCQkJCW0gPSBNYXgobSwgKlBvaW50ZXI8RmxvYXQ+KHYxICsgYXR0cmlidXRlKSk7CisJCQkJbSA9IE1heChtLCAqUG9pbnRlcjxGbG9hdD4odjIgKyBhdHRyaWJ1dGUpKTsKKwkJCQltIC09IEZsb2F0KDAuNWYpOyAgIC8vIEZJWE1FOiBtIC09IDAuNWY7CisKKwkJCQkvLyBGSVhNRTogVmVjdG9yaXplCisJCQkJSWYoRmxvYXQoaS54KSA8IG0pIGkueCA9IEZsb2F0KGkueCkgKyBGbG9hdCgxLjBmKTsKKwkJCQlJZihGbG9hdChpLnkpIDwgbSkgaS55ID0gRmxvYXQoaS55KSArIEZsb2F0KDEuMGYpOworCQkJCUlmKEZsb2F0KGkueikgPCBtKSBpLnogPSBGbG9hdChpLnopICsgRmxvYXQoMS4wZik7CisJCQl9CisKKwkJCWlmKCFwZXJzcGVjdGl2ZSkKKwkJCXsKKwkJCQlpICo9IHcwMTI7CisJCQl9CisKKwkJCUZsb2F0NCBBOworCQkJRmxvYXQ0IEI7CisJCQlGbG9hdDQgQzsKKworCQkJQSA9IGkueHh4eDsKKwkJCUIgPSBpLnl5eXk7CisJCQlDID0gaS56enp6OworCisJCQlBICo9IG1bMF07CisJCQlCICo9IG1bMV07CisJCQlDICo9IG1bMl07CisKKwkJCUMgPSBBICsgQiArIEM7CisKKwkJCUEgPSBDLnh4eHg7CisJCQlCID0gQy55eXl5OworCQkJQyA9IEMuenp6ejsKKworCQkJKlBvaW50ZXI8RmxvYXQ0PihwcmltaXRpdmUgKyBwbGFuZUVxdWF0aW9uICsgMCwgMTYpID0gQTsKKwkJCSpQb2ludGVyPEZsb2F0ND4ocHJpbWl0aXZlICsgcGxhbmVFcXVhdGlvbiArIDE2LCAxNikgPSBCOworCQkJKlBvaW50ZXI8RmxvYXQ0PihwcmltaXRpdmUgKyBwbGFuZUVxdWF0aW9uICsgMzIsIDE2KSA9IEM7CisJCX0KKwkJZWxzZQorCQl7CisJCQlGbG9hdCBDID0gKlBvaW50ZXI8RmxvYXQ+KHRyaWFuZ2xlICsgT0ZGU0VUKFRyaWFuZ2xlLHYwKSArIGF0dHJpYnV0ZSk7CisKKwkJCSpQb2ludGVyPEZsb2F0ND4ocHJpbWl0aXZlICsgcGxhbmVFcXVhdGlvbiArIDAsIDE2KSA9IEZsb2F0NCgwLCAwLCAwLCAwKTsKKwkJCSpQb2ludGVyPEZsb2F0ND4ocHJpbWl0aXZlICsgcGxhbmVFcXVhdGlvbiArIDE2LCAxNikgPSBGbG9hdDQoMCwgMCwgMCwgMCk7CisJCQkqUG9pbnRlcjxGbG9hdDQ+KHByaW1pdGl2ZSArIHBsYW5lRXF1YXRpb24gKyAzMiwgMTYpID0gRmxvYXQ0KEMpOworCQl9CisJfQorCisJdm9pZCBTZXR1cFJvdXRpbmU6OmVkZ2UoUG9pbnRlcjxCeXRlPiAmcHJpbWl0aXZlLCBJbnQgJlgxLCBJbnQgJlkxLCBJbnQgJlgyLCBJbnQgJlkyLCBJbnQgJnEpCisJeworCQlJZihZMSAhPSBZMikKKwkJeworCQkJQm9vbCBzd2FwID0gWTIgPCBZMTsKKworCQkJUG9pbnRlcjxCeXRlPiBsZWZ0RWRnZSA9IHByaW1pdGl2ZSArIHEgKiBzaXplb2YoUHJpbWl0aXZlKSArIE9GRlNFVChQcmltaXRpdmUsb3V0bGluZS0+bGVmdCk7CisJCQlQb2ludGVyPEJ5dGU+IHJpZ2h0RWRnZSA9IHByaW1pdGl2ZSArIHEgKiBzaXplb2YoUHJpbWl0aXZlKSArIE9GRlNFVChQcmltaXRpdmUsb3V0bGluZS0+cmlnaHQpOworCQkJUG9pbnRlcjxCeXRlPiBlZGdlID0gSWZUaGVuRWxzZShzd2FwLCByaWdodEVkZ2UsIGxlZnRFZGdlKTsKKworCQkJSW50IFgwID0gWDE7CisJCQlJbnQgWTAgPSBZMTsKKwkJCVgxID0gSWZUaGVuRWxzZShzd2FwLCBYMiwgWDEpOworCQkJWDIgPSBJZlRoZW5FbHNlKHN3YXAsIFgwLCBYMik7CisJCQlZMSA9IElmVGhlbkVsc2Uoc3dhcCwgWTIsIFkxKTsKKwkJCVkyID0gSWZUaGVuRWxzZShzd2FwLCBZMCwgWTIpOworCisJCQlJbnQgeTEgPSAoWTEgKyAweDAwMDAwMDBGKSA+PiA0OworCQkJSW50IHkyID0gKFkyICsgMHgwMDAwMDAwRikgPj4gNDsKKworCQkJSWYoeTEgIT0geTIpCisJCQl7CisJCQkJLy8gRGVsdGFzCisJCQkJSW50IERYMTIgPSBYMiAtIFgxOworCQkJCUludCBEWTEyID0gWTIgLSBZMTsKKworCQkJCUludCBGRFgxMiA9IERYMTIgPDwgNDsKKwkJCQlJbnQgRkRZMTIgPSBEWTEyIDw8IDQ7CisKKwkJCQlJbnQgWCA9IERYMTIgKiAoLVkxICYgMHhGKSArIFgxICogRFkxMjsKKwkJCQlJbnQgeCA9IFggLyBGRFkxMjsgICAgIC8vIEVkZ2UKKwkJCQlJbnQgZCA9IFggJSBGRFkxMjsgICAgIC8vIEVycm9yLXRlcm0KKwkJCQlJbnQgY2VpbCA9IC1kID4+IDMxOyAgIC8vIENlaWxpbmcgZGl2aXNpb246IHJlbWFpbmRlciA8PSAwCisJCQkJeCAtPSBjZWlsOworCQkJCWQgLT0gY2VpbCAmIEZEWTEyOworCQkJCQorCQkJCUludCBRID0gRkRYMTIgLyBGRFkxMjsgICAvLyBFZGdlLXN0ZXAKKwkJCQlJbnQgUiA9IEZEWDEyICUgRkRZMTI7ICAgLy8gRXJyb3Itc3RlcAorCQkJCUludCBmbG9vciA9IFIgPj4gMzE7ICAgICAvLyBGbG9vcmluZyBkaXZpc2lvbjogcmVtYWluZGVyID49IDAKKwkJCQlRICs9IGZsb29yOworCQkJCVIgKz0gZmxvb3IgJiBGRFkxMjsKKworCQkJCUludCBEID0gRkRZMTI7ICAgLy8gRXJyb3Itb3ZlcmZsb3cKKwkJCQlJbnQgeSA9IHkxOworCisJCQkJRG8KKwkJCQl7CisJCQkJCSpQb2ludGVyPFNob3J0PihlZGdlICsgeSAqIHNpemVvZihQcmltaXRpdmU6OlNwYW4pKSA9IFNob3J0KHgpOworCisJCQkJCXggKz0gUTsKKwkJCQkJZCArPSBSOworCisJCQkJCUludCBvdmVyZmxvdyA9IC1kID4+IDMxOworCQkJCisJCQkJCWQgLT0gRCAmIG92ZXJmbG93OworCQkJCQl4IC09IG92ZXJmbG93OworCisJCQkJCXkrKzsKKwkJCQl9CisJCQkJVW50aWwoeSA+PSB5MikKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgU2V0dXBSb3V0aW5lOjpjb25kaXRpb25hbFJvdGF0ZTEoQm9vbCBjb25kaXRpb24sIFBvaW50ZXI8Qnl0ZT4gJnYwLCBQb2ludGVyPEJ5dGU+ICZ2MSwgUG9pbnRlcjxCeXRlPiAmdjIpCisJeworCQkjaWYgMCAgIC8vIFJlbHkgb24gTExWTSBvcHRpbWl6YXRpb24KKwkJCUlmKGNvbmRpdGlvbikKKwkJCXsKKwkJCQlQb2ludGVyPEJ5dGU+IHZYOworCQkJCisJCQkJdlggPSB2MDsKKwkJCQl2MCA9IHYxOworCQkJCXYxID0gdjI7CisJCQkJdjIgPSB2WDsKKwkJCX0KKwkJI2Vsc2UKKwkJCVBvaW50ZXI8Qnl0ZT4gdlggPSB2MDsKKwkJCXYwID0gSWZUaGVuRWxzZShjb25kaXRpb24sIHYxLCB2MCk7CisJCQl2MSA9IElmVGhlbkVsc2UoY29uZGl0aW9uLCB2MiwgdjEpOworCQkJdjIgPSBJZlRoZW5FbHNlKGNvbmRpdGlvbiwgdlgsIHYyKTsKKwkJI2VuZGlmCisJfQorCisJdm9pZCBTZXR1cFJvdXRpbmU6OmNvbmRpdGlvbmFsUm90YXRlMihCb29sIGNvbmRpdGlvbiwgUG9pbnRlcjxCeXRlPiAmdjAsIFBvaW50ZXI8Qnl0ZT4gJnYxLCBQb2ludGVyPEJ5dGU+ICZ2MikKKwl7CisJCSNpZiAwICAgLy8gUmVseSBvbiBMTFZNIG9wdGltaXphdGlvbgorCQkJSWYoY29uZGl0aW9uKQorCQkJeworCQkJCVBvaW50ZXI8Qnl0ZT4gdlg7CisJCQkKKwkJCQl2WCA9IHYyOworCQkJCXYyID0gdjE7CisJCQkJdjEgPSB2MDsKKwkJCQl2MCA9IHZYOworCQkJfQorCQkjZWxzZQorCQkJUG9pbnRlcjxCeXRlPiB2WCA9IHYyOworCQkJdjIgPSBJZlRoZW5FbHNlKGNvbmRpdGlvbiwgdjEsIHYyKTsKKwkJCXYxID0gSWZUaGVuRWxzZShjb25kaXRpb24sIHYwLCB2MSk7CisJCQl2MCA9IElmVGhlbkVsc2UoY29uZGl0aW9uLCB2WCwgdjApOworCQkjZW5kaWYKKwl9CisKKwlSb3V0aW5lICpTZXR1cFJvdXRpbmU6OmdldFJvdXRpbmUoKQorCXsKKwkJcmV0dXJuIHJvdXRpbmU7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1NoYWRlci9TZXR1cFJvdXRpbmUuaHBwIGIvc3JjL1NoYWRlci9TZXR1cFJvdXRpbmUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDAyODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU2hhZGVyL1NldHVwUm91dGluZS5ocHAKQEAgLTAsMCArMSw0NCBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgc3dfU2V0dXBSb3V0aW5lX2hwcA0KKyNkZWZpbmUgc3dfU2V0dXBSb3V0aW5lX2hwcA0KKw0KKyNpbmNsdWRlICJTZXR1cFByb2Nlc3Nvci5ocHAiDQorI2luY2x1ZGUgIlJlYWN0b3IvTnVjbGV1cy5ocHAiDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwljbGFzcyBDb250ZXh0Ow0KKw0KKwljbGFzcyBTZXR1cFJvdXRpbmUNCisJew0KKwlwdWJsaWM6DQorCQlTZXR1cFJvdXRpbmUoY29uc3QgU2V0dXBQcm9jZXNzb3I6OlN0YXRlICZzdGF0ZSk7DQorDQorCQl2aXJ0dWFsIH5TZXR1cFJvdXRpbmUoKTsNCisNCisJCXZvaWQgZ2VuZXJhdGUoKTsNCisJCVJvdXRpbmUgKmdldFJvdXRpbmUoKTsNCisNCisJcHJpdmF0ZToNCisJCXZvaWQgc2V0dXBHcmFkaWVudChQb2ludGVyPEJ5dGU+ICZwcmltaXRpdmUsIFBvaW50ZXI8Qnl0ZT4gJnRyaWFuZ2xlLCBGbG9hdDQgJncwMTIsIEZsb2F0NCAoJm0pWzNdLCBQb2ludGVyPEJ5dGU+ICZ2MCwgUG9pbnRlcjxCeXRlPiAmdjEsIFBvaW50ZXI8Qnl0ZT4gJnYyLCBpbnQgYXR0cmlidXRlLCBpbnQgcGxhbmVFcXVhdGlvbiwgYm9vbCBmbGF0U2hhZGluZywgYm9vbCBzcHJpdGUsIGJvb2wgcGVyc3BlY3RpdmUsIGJvb2wgd3JhcCwgaW50IGNvbXBvbmVudCk7DQorCQl2b2lkIGVkZ2UoUG9pbnRlcjxCeXRlPiAmcHJpbWl0aXZlLCBJbnQgJlgxLCBJbnQgJlkxLCBJbnQgJlgyLCBJbnQgJlkyLCBJbnQgJnEpOw0KKwkJdm9pZCBjb25kaXRpb25hbFJvdGF0ZTEoQm9vbCBjb25kaXRpb24sIFBvaW50ZXI8Qnl0ZT4gJnYwLCBQb2ludGVyPEJ5dGU+ICZ2MSwgUG9pbnRlcjxCeXRlPiAmdjIpOw0KKwkJdm9pZCBjb25kaXRpb25hbFJvdGF0ZTIoQm9vbCBjb25kaXRpb24sIFBvaW50ZXI8Qnl0ZT4gJnYwLCBQb2ludGVyPEJ5dGU+ICZ2MSwgUG9pbnRlcjxCeXRlPiAmdjIpOw0KKw0KKwkJY29uc3QgU2V0dXBQcm9jZXNzb3I6OlN0YXRlICZzdGF0ZTsNCisNCisJCVJvdXRpbmUgKnJvdXRpbmU7DQorCX07DQorfQ0KKw0KKyNlbmRpZiAgIC8vIHN3X1NldHVwUm91dGluZV9ocHANCmRpZmYgLS1naXQgYS9zcmMvU2hhZGVyL1NoYWRlci5jcHAgYi9zcmMvU2hhZGVyL1NoYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlOGJkYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvU2hhZGVyLmNwcApAQCAtMCwwICsxLDEzMTggQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIlNoYWRlci5ocHAiCisKKyNpbmNsdWRlICJNYXRoLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK25hbWVzcGFjZSBzdworeworCVNoYWRlcjo6SW5zdHJ1Y3Rpb246Okluc3RydWN0aW9uKCkKKwl7CisJCW9wZXJhdGlvbi5vcGNvZGUgPSBPcGVyYXRpb246Ok9QQ09ERV9OT1A7CisJCWRlc3RpbmF0aW9uUGFyYW1ldGVyLnR5cGUgPSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9WT0lEOworCQlzb3VyY2VQYXJhbWV0ZXJbMF0udHlwZSA9IFBhcmFtZXRlcjo6UEFSQU1FVEVSX1ZPSUQ7CisJCXNvdXJjZVBhcmFtZXRlclsxXS50eXBlID0gUGFyYW1ldGVyOjpQQVJBTUVURVJfVk9JRDsKKwkJc291cmNlUGFyYW1ldGVyWzJdLnR5cGUgPSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9WT0lEOworCQlzb3VyY2VQYXJhbWV0ZXJbM10udHlwZSA9IFBhcmFtZXRlcjo6UEFSQU1FVEVSX1ZPSUQ7CisJfQorCisJU2hhZGVyOjpJbnN0cnVjdGlvbjo6SW5zdHJ1Y3Rpb24oY29uc3QgdW5zaWduZWQgbG9uZyAqdG9rZW4sIGludCBzaXplLCB1bnNpZ25lZCBjaGFyIG1ham9yVmVyc2lvbikKKwl7CisJCXBhcnNlT3BlcmF0aW9uVG9rZW4oKnRva2VuKyssIG1ham9yVmVyc2lvbik7CisKKwkJaWYob3BlcmF0aW9uLm9wY29kZSA9PSBPcGVyYXRpb246Ok9QQ09ERV9JRiB8fAorCQkgICBvcGVyYXRpb24ub3Bjb2RlID09IE9wZXJhdGlvbjo6T1BDT0RFX0lGQyB8fAorCQkgICBvcGVyYXRpb24ub3Bjb2RlID09IE9wZXJhdGlvbjo6T1BDT0RFX0xPT1AgfHwKKwkJICAgb3BlcmF0aW9uLm9wY29kZSA9PSBPcGVyYXRpb246Ok9QQ09ERV9SRVAgfHwKKwkJICAgb3BlcmF0aW9uLm9wY29kZSA9PSBPcGVyYXRpb246Ok9QQ09ERV9CUkVBS0MgfHwKKwkJICAgb3BlcmF0aW9uLm9wY29kZSA9PSBPcGVyYXRpb246Ok9QQ09ERV9CUkVBS1ApICAgLy8gTm8gZGVzdGluYXRpb24gb3BlcmFuZAorCQl7CisJCQlpZihzaXplID4gMCkgcGFyc2VTb3VyY2VUb2tlbigwLCB0b2tlbisrLCBtYWpvclZlcnNpb24pOworCQkJaWYoc2l6ZSA+IDEpIHBhcnNlU291cmNlVG9rZW4oMSwgdG9rZW4rKywgbWFqb3JWZXJzaW9uKTsKKwkJCWlmKHNpemUgPiAyKSBwYXJzZVNvdXJjZVRva2VuKDIsIHRva2VuKyssIG1ham9yVmVyc2lvbik7CisJCQlpZihzaXplID4gMykgQVNTRVJUKGZhbHNlKTsKKwkJfQorCQllbHNlIGlmKG9wZXJhdGlvbi5vcGNvZGUgPT0gT3BlcmF0aW9uOjpPUENPREVfRENMKQorCQl7CisJCQlwYXJzZURlY2xhcmF0aW9uVG9rZW4oKnRva2VuKyspOworCQkJcGFyc2VEZXN0aW5hdGlvblRva2VuKHRva2VuKyssIG1ham9yVmVyc2lvbik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihzaXplID4gMCkKKwkJCXsKKwkJCQlwYXJzZURlc3RpbmF0aW9uVG9rZW4odG9rZW4sIG1ham9yVmVyc2lvbik7CisKKwkJCQlpZihkZXN0aW5hdGlvblBhcmFtZXRlci5yZWxhdGl2ZSAmJiBtYWpvclZlcnNpb24gPj0gMykKKwkJCQl7CisJCQkJCXRva2VuKys7CisJCQkJCXNpemUtLTsKKwkJCQl9CisJCQkJCisJCQkJdG9rZW4rKzsKKwkJCQlzaXplLS07CisJCQl9CisKKwkJCWlmKG9wZXJhdGlvbi5wcmVkaWNhdGUpCisJCQl7CisJCQkJQVNTRVJUKHNpemUgIT0gMCk7CisKKwkJCQlvcGVyYXRpb24ucHJlZGljYXRlTm90ID0gKFNvdXJjZVBhcmFtZXRlcjo6TW9kaWZpZXIpKCgqdG9rZW4gJiAweDBGMDAwMDAwKSA+PiAyNCkgPT0gU291cmNlUGFyYW1ldGVyOjpNT0RJRklFUl9OT1Q7CisJCQkJb3BlcmF0aW9uLnByZWRpY2F0ZVN3aXp6bGUgPSAodW5zaWduZWQgY2hhcikoKCp0b2tlbiAmIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJCQkKKwkJCQl0b2tlbisrOworCQkJCXNpemUtLTsKKwkJCX0KKworCQkJZm9yKGludCBpID0gMDsgc2l6ZSA+IDA7IGkrKykKKwkJCXsKKwkJCQlwYXJzZVNvdXJjZVRva2VuKGksIHRva2VuLCBtYWpvclZlcnNpb24pOworCisJCQkJdG9rZW4rKzsKKwkJCQlzaXplLS07CisKKwkJCQlpZihzb3VyY2VQYXJhbWV0ZXJbaV0ucmVsYXRpdmUgJiYgbWFqb3JWZXJzaW9uID49IDIpCisJCQkJeworCQkJCQl0b2tlbisrOworCQkJCQlzaXplLS07CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJU2hhZGVyOjpJbnN0cnVjdGlvbjo6fkluc3RydWN0aW9uKCkKKwl7CisJfQorCisJU2hhZGVyOjpJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpPcGNvZGUgU2hhZGVyOjpJbnN0cnVjdGlvbjo6Z2V0T3Bjb2RlKCkgY29uc3QKKwl7CisJCXJldHVybiBvcGVyYXRpb24ub3Bjb2RlOworCX0KKworCWNvbnN0IFNoYWRlcjo6SW5zdHJ1Y3Rpb246OkRlc3RpbmF0aW9uUGFyYW1ldGVyICZTaGFkZXI6Okluc3RydWN0aW9uOjpnZXREZXN0aW5hdGlvblBhcmFtZXRlcigpIGNvbnN0CisJeworCQlyZXR1cm4gZGVzdGluYXRpb25QYXJhbWV0ZXI7CisJfQorCisJY29uc3QgU2hhZGVyOjpJbnN0cnVjdGlvbjo6U291cmNlUGFyYW1ldGVyICZTaGFkZXI6Okluc3RydWN0aW9uOjpnZXRTb3VyY2VQYXJhbWV0ZXIoaW50IGkpIGNvbnN0CisJeworCQlyZXR1cm4gc291cmNlUGFyYW1ldGVyW2ldOworCX0KKworCWJvb2wgU2hhZGVyOjpJbnN0cnVjdGlvbjo6aXNDb2lzc3VlKCkgY29uc3QKKwl7CisJCXJldHVybiBvcGVyYXRpb24uY29pc3N1ZTsKKwl9CisKKwlib29sIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OmlzUHJvamVjdCgpIGNvbnN0CisJeworCQlyZXR1cm4gb3BlcmF0aW9uLnByb2plY3Q7CisJfQorCisJYm9vbCBTaGFkZXI6Okluc3RydWN0aW9uOjppc0JpYXMoKSBjb25zdAorCXsKKwkJcmV0dXJuIG9wZXJhdGlvbi5iaWFzOworCX0KKworCWJvb2wgU2hhZGVyOjpJbnN0cnVjdGlvbjo6aXNQcmVkaWNhdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuIG9wZXJhdGlvbi5wcmVkaWNhdGU7CisJfQorCisJYm9vbCBTaGFkZXI6Okluc3RydWN0aW9uOjppc1ByZWRpY2F0ZU5vdCgpIGNvbnN0CisJeworCQlyZXR1cm4gb3BlcmF0aW9uLnByZWRpY2F0ZU5vdDsKKwl9CisKKwl1bnNpZ25lZCBjaGFyIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OmdldFByZWRpY2F0ZVN3aXp6bGUoKSBjb25zdAorCXsKKwkJcmV0dXJuIG9wZXJhdGlvbi5wcmVkaWNhdGVTd2l6emxlOworCX0KKworCVNoYWRlcjo6SW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6Q29udHJvbCBTaGFkZXI6Okluc3RydWN0aW9uOjpnZXRDb250cm9sKCkgY29uc3QKKwl7CisJCXJldHVybiBvcGVyYXRpb24uY29udHJvbDsKKwl9CisKKwlTaGFkZXI6Okluc3RydWN0aW9uOjpPcGVyYXRpb246OlVzYWdlIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OmdldFVzYWdlKCkgY29uc3QKKwl7CisJCXJldHVybiBvcGVyYXRpb24udXNhZ2U7CisJfQorCisJdW5zaWduZWQgY2hhciBTaGFkZXI6Okluc3RydWN0aW9uOjpnZXRVc2FnZUluZGV4KCkgY29uc3QKKwl7CisJCXJldHVybiBvcGVyYXRpb24udXNhZ2VJbmRleDsKKwl9CisKKwlTaGFkZXI6Okluc3RydWN0aW9uOjpPcGVyYXRpb246OlNhbXBsZXJUeXBlIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OmdldFNhbXBsZXJUeXBlKCkgY29uc3QKKwl7CisJCXJldHVybiBvcGVyYXRpb24uc2FtcGxlclR5cGU7CisJfQorCisJc3RkOjpzdHJpbmcgU2hhZGVyOjpJbnN0cnVjdGlvbjo6c3RyaW5nKFNoYWRlclR5cGUgc2hhZGVyVHlwZSwgdW5zaWduZWQgc2hvcnQgdmVyc2lvbikgY29uc3QKKwl7CisJCXN0ZDo6c3RyaW5nIGluc3RydWN0aW9uU3RyaW5nOworCQkKKwkJaWYob3BlcmF0aW9uLm9wY29kZSAhPSBPcGVyYXRpb246Ok9QQ09ERV9EQ0wpCisJCXsKKwkJCWluc3RydWN0aW9uU3RyaW5nICs9IG9wZXJhdGlvbi5jb2lzc3VlID8gIisgIiA6ICIiOworCQkJCisJCQlpZihvcGVyYXRpb24ucHJlZGljYXRlKQorCQkJeworCQkJCWluc3RydWN0aW9uU3RyaW5nICs9IG9wZXJhdGlvbi5wcmVkaWNhdGVOb3QgPyAiKCFwMCIgOiAiKHAwIjsKKwkJCQlpbnN0cnVjdGlvblN0cmluZyArPSBzd2l6emxlU3RyaW5nKFBhcmFtZXRlcjo6UEFSQU1FVEVSX1BSRURJQ0FURSwgb3BlcmF0aW9uLnByZWRpY2F0ZVN3aXp6bGUpOworCQkJCWluc3RydWN0aW9uU3RyaW5nICs9ICIpICI7CisJCQl9CisKKwkJCWluc3RydWN0aW9uU3RyaW5nICs9IG9wZXJhdGlvbi5zdHJpbmcodmVyc2lvbikgKyBvcGVyYXRpb24uY29udHJvbFN0cmluZygpICsgZGVzdGluYXRpb25QYXJhbWV0ZXIuc2hpZnRTdHJpbmcoKSArIGRlc3RpbmF0aW9uUGFyYW1ldGVyLm1vZGlmaWVyU3RyaW5nKCk7CisKKwkJCWlmKGRlc3RpbmF0aW9uUGFyYW1ldGVyLnR5cGUgIT0gUGFyYW1ldGVyOjpQQVJBTUVURVJfVk9JRCkKKwkJCXsKKwkJCQlpbnN0cnVjdGlvblN0cmluZyArPSAiICIgKyBkZXN0aW5hdGlvblBhcmFtZXRlci5zdHJpbmcoc2hhZGVyVHlwZSwgdmVyc2lvbikgKworCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGFyYW1ldGVyLnJlbGF0aXZlU3RyaW5nKCkgKworCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGFyYW1ldGVyLm1hc2tTdHJpbmcoKTsgCisJCQl9CisKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspCisJCQl7CisJCQkJaWYoc291cmNlUGFyYW1ldGVyW2ldLnR5cGUgIT0gUGFyYW1ldGVyOjpQQVJBTUVURVJfVk9JRCkKKwkJCQl7CisJCQkJCWluc3RydWN0aW9uU3RyaW5nICs9IChkZXN0aW5hdGlvblBhcmFtZXRlci50eXBlICE9IFBhcmFtZXRlcjo6UEFSQU1FVEVSX1ZPSUQgfHwgaSA+IDApID8gIiwgIiA6ICIgIjsKKwkJCQkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gc291cmNlUGFyYW1ldGVyW2ldLnByZU1vZGlmaWVyU3RyaW5nKCkgKworCQkJCQkJCQkJCSBzb3VyY2VQYXJhbWV0ZXJbaV0uc3RyaW5nKHNoYWRlclR5cGUsIHZlcnNpb24pICsKKwkJCQkJCQkJCQkgc291cmNlUGFyYW1ldGVyW2ldLnJlbGF0aXZlU3RyaW5nKCkgKyAKKwkJCQkJCQkJCQkgc291cmNlUGFyYW1ldGVyW2ldLnBvc3RNb2RpZmllclN0cmluZygpICsgCisJCQkJCQkJCQkJIHNvdXJjZVBhcmFtZXRlcltpXS5zd2l6emxlU3RyaW5nKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgICAvLyBEQ0wKKwkJeworCQkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gImRjbCI7CisKKwkJCWlmKGRlc3RpbmF0aW9uUGFyYW1ldGVyLnR5cGUgPT0gUGFyYW1ldGVyOjpQQVJBTUVURVJfU0FNUExFUikKKwkJCXsKKwkJCQlzd2l0Y2gob3BlcmF0aW9uLnNhbXBsZXJUeXBlKQorCQkJCXsKKwkJCQljYXNlIE9wZXJhdGlvbjo6U0FNUExFUl9VTktOT1dOOglpbnN0cnVjdGlvblN0cmluZyArPSAiICI7CQkJYnJlYWs7CisJCQkJY2FzZSBPcGVyYXRpb246OlNBTVBMRVJfMUQ6CQkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIl8xZCAiOwkJYnJlYWs7CisJCQkJY2FzZSBPcGVyYXRpb246OlNBTVBMRVJfMkQ6CQkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIl8yZCAiOwkJYnJlYWs7CisJCQkJY2FzZSBPcGVyYXRpb246OlNBTVBMRVJfQ1VCRToJCWluc3RydWN0aW9uU3RyaW5nICs9ICJfY3ViZSAiOwkJYnJlYWs7CisJCQkJY2FzZSBPcGVyYXRpb246OlNBTVBMRVJfVk9MVU1FOgkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIl92b2x1bWUgIjsJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisKKwkJCQlpbnN0cnVjdGlvblN0cmluZyArPSBkZXN0aW5hdGlvblBhcmFtZXRlci5zdHJpbmcoc2hhZGVyVHlwZSwgdmVyc2lvbik7CisJCQl9CisJCQllbHNlIGlmKGRlc3RpbmF0aW9uUGFyYW1ldGVyLnR5cGUgPT0gUGFyYW1ldGVyOjpQQVJBTUVURVJfSU5QVVQgfHwKKwkJCQkgICAgZGVzdGluYXRpb25QYXJhbWV0ZXIudHlwZSA9PSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9PVVRQVVQgfHwKKwkJCQkgICAgZGVzdGluYXRpb25QYXJhbWV0ZXIudHlwZSA9PSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9URVhUVVJFKQorCQkJeworCQkJCWlmKHZlcnNpb24gPj0gMHgwMzAwKQorCQkJCXsKKwkJCQkJc3dpdGNoKG9wZXJhdGlvbi51c2FnZSkKKwkJCQkJeworCQkJCQljYXNlIE9wZXJhdGlvbjo6VVNBR0VfUE9TSVRJT046CQlpbnN0cnVjdGlvblN0cmluZyArPSAiX3Bvc2l0aW9uIjsJCWJyZWFrOworCQkJCQljYXNlIE9wZXJhdGlvbjo6VVNBR0VfQkxFTkRXRUlHSFQ6CWluc3RydWN0aW9uU3RyaW5nICs9ICJfYmxlbmR3ZWlnaHQiOwlicmVhazsKKwkJCQkJY2FzZSBPcGVyYXRpb246OlVTQUdFX0JMRU5ESU5ESUNFUzoJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIl9ibGVuZGluZGljZXMiOwlicmVhazsKKwkJCQkJY2FzZSBPcGVyYXRpb246OlVTQUdFX05PUk1BTDoJCWluc3RydWN0aW9uU3RyaW5nICs9ICJfbm9ybWFsIjsJCQlicmVhazsKKwkJCQkJY2FzZSBPcGVyYXRpb246OlVTQUdFX1BTSVpFOgkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIl9wc2l6ZSI7CQkJYnJlYWs7CisJCQkJCWNhc2UgT3BlcmF0aW9uOjpVU0FHRV9URVhDT09SRDoJCWluc3RydWN0aW9uU3RyaW5nICs9ICJfdGV4Y29vcmQiOwkJYnJlYWs7CisJCQkJCWNhc2UgT3BlcmF0aW9uOjpVU0FHRV9UQU5HRU5UOgkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIl90YW5nZW50IjsJCWJyZWFrOworCQkJCQljYXNlIE9wZXJhdGlvbjo6VVNBR0VfQklOT1JNQUw6CQlpbnN0cnVjdGlvblN0cmluZyArPSAiX2Jpbm9ybWFsIjsJCWJyZWFrOworCQkJCQljYXNlIE9wZXJhdGlvbjo6VVNBR0VfVEVTU0ZBQ1RPUjoJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIl90ZXNzZmFjdG9yIjsJCWJyZWFrOworCQkJCQljYXNlIE9wZXJhdGlvbjo6VVNBR0VfUE9TSVRJT05UOglpbnN0cnVjdGlvblN0cmluZyArPSAiX3Bvc2l0aW9udCI7CQlicmVhazsKKwkJCQkJY2FzZSBPcGVyYXRpb246OlVTQUdFX0NPTE9SOgkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIl9jb2xvciI7CQkJYnJlYWs7CisJCQkJCWNhc2UgT3BlcmF0aW9uOjpVU0FHRV9GT0c6CQkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIl9mb2ciOwkJCWJyZWFrOworCQkJCQljYXNlIE9wZXJhdGlvbjo6VVNBR0VfREVQVEg6CQlpbnN0cnVjdGlvblN0cmluZyArPSAiX2RlcHRoIjsJCQlicmVhazsKKwkJCQkJY2FzZSBPcGVyYXRpb246OlVTQUdFX1NBTVBMRToJCWluc3RydWN0aW9uU3RyaW5nICs9ICJfc2FtcGxlIjsJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJCX0KKworCQkJCQlpZihvcGVyYXRpb24udXNhZ2VJbmRleCA+IDApCisJCQkJCXsKKwkJCQkJCXN0ZDo6b3N0cmluZ3N0cmVhbSBidWZmZXI7CisKKwkJCQkJCWJ1ZmZlciA8PCAoaW50KW9wZXJhdGlvbi51c2FnZUluZGV4OworCisJCQkJCQlpbnN0cnVjdGlvblN0cmluZyArPSBidWZmZXIuc3RyKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBBU1NFUlQoZGVzdGluYXRpb25QYXJhbWV0ZXIudHlwZSAhPSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9PVVRQVVQpOworCisJCQkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gIiAiOworCisJCQkJaW5zdHJ1Y3Rpb25TdHJpbmcgKz0gZGVzdGluYXRpb25QYXJhbWV0ZXIuc3RyaW5nKHNoYWRlclR5cGUsIHZlcnNpb24pOworCQkJCWluc3RydWN0aW9uU3RyaW5nICs9IGRlc3RpbmF0aW9uUGFyYW1ldGVyLm1hc2tTdHJpbmcoKTsKKwkJCX0KKwkJCWVsc2UgaWYoZGVzdGluYXRpb25QYXJhbWV0ZXIudHlwZSA9PSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9NSVNDVFlQRSkgICAvLyB2UG9zIGFuZCB2RmFjZQorCQkJeworCQkJCWluc3RydWN0aW9uU3RyaW5nICs9ICIgIjsKKworCQkJCWluc3RydWN0aW9uU3RyaW5nICs9IGRlc3RpbmF0aW9uUGFyYW1ldGVyLnN0cmluZyhzaGFkZXJUeXBlLCB2ZXJzaW9uKTsKKwkJCX0KKwkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiBpbnN0cnVjdGlvblN0cmluZzsKKwl9CisKKwlzdGQ6OnN0cmluZyBTaGFkZXI6Okluc3RydWN0aW9uOjpPcGVyYXRpb246OnN0cmluZyh1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uKSBjb25zdAorCXsKKwkJc3dpdGNoKG9wY29kZSkKKwkJeworCQljYXNlIE9QQ09ERV9OT1A6CQkJcmV0dXJuICJub3AiOworCQljYXNlIE9QQ09ERV9NT1Y6CQkJcmV0dXJuICJtb3YiOworCQljYXNlIE9QQ09ERV9BREQ6CQkJcmV0dXJuICJhZGQiOworCQljYXNlIE9QQ09ERV9TVUI6CQkJcmV0dXJuICJzdWIiOworCQljYXNlIE9QQ09ERV9NQUQ6CQkJcmV0dXJuICJtYWQiOworCQljYXNlIE9QQ09ERV9NVUw6CQkJcmV0dXJuICJtdWwiOworCQljYXNlIE9QQ09ERV9SQ1A6CQkJcmV0dXJuICJyY3AiOworCQljYXNlIE9QQ09ERV9SU1E6CQkJcmV0dXJuICJyc3EiOworCQljYXNlIE9QQ09ERV9EUDM6CQkJcmV0dXJuICJkcDMiOworCQljYXNlIE9QQ09ERV9EUDQ6CQkJcmV0dXJuICJkcDQiOworCQljYXNlIE9QQ09ERV9NSU46CQkJcmV0dXJuICJtaW4iOworCQljYXNlIE9QQ09ERV9NQVg6CQkJcmV0dXJuICJtYXgiOworCQljYXNlIE9QQ09ERV9TTFQ6CQkJcmV0dXJuICJzbHQiOworCQljYXNlIE9QQ09ERV9TR0U6CQkJcmV0dXJuICJzZ2UiOworCQljYXNlIE9QQ09ERV9FWFA6CQkJcmV0dXJuICJleHAiOworCQljYXNlIE9QQ09ERV9MT0c6CQkJcmV0dXJuICJsb2ciOworCQljYXNlIE9QQ09ERV9MSVQ6CQkJcmV0dXJuICJsaXQiOworCQljYXNlIE9QQ09ERV9EU1Q6CQkJcmV0dXJuICJkc3QiOworCQljYXNlIE9QQ09ERV9MUlA6CQkJcmV0dXJuICJscnAiOworCQljYXNlIE9QQ09ERV9GUkM6CQkJcmV0dXJuICJmcmMiOworCQljYXNlIE9QQ09ERV9NNFg0OgkJCXJldHVybiAibTR4NCI7CisJCWNhc2UgT1BDT0RFX000WDM6CQkJcmV0dXJuICJtNHgzIjsKKwkJY2FzZSBPUENPREVfTTNYNDoJCQlyZXR1cm4gIm0zeDQiOworCQljYXNlIE9QQ09ERV9NM1gzOgkJCXJldHVybiAibTN4MyI7CisJCWNhc2UgT1BDT0RFX00zWDI6CQkJcmV0dXJuICJtM3gyIjsKKwkJY2FzZSBPUENPREVfQ0FMTDoJCQlyZXR1cm4gImNhbGwiOworCQljYXNlIE9QQ09ERV9DQUxMTlo6CQkJcmV0dXJuICJjYWxsbnoiOworCQljYXNlIE9QQ09ERV9MT09QOgkJCXJldHVybiAibG9vcCI7CisJCWNhc2UgT1BDT0RFX1JFVDoJCQlyZXR1cm4gInJldCI7CisJCWNhc2UgT1BDT0RFX0VORExPT1A6CQlyZXR1cm4gImVuZGxvb3AiOworCQljYXNlIE9QQ09ERV9MQUJFTDoJCQlyZXR1cm4gImxhYmVsIjsKKwkJY2FzZSBPUENPREVfRENMOgkJCXJldHVybiAiZGNsIjsKKwkJY2FzZSBPUENPREVfUE9XOgkJCXJldHVybiAicG93IjsKKwkJY2FzZSBPUENPREVfQ1JTOgkJCXJldHVybiAiY3JzIjsKKwkJY2FzZSBPUENPREVfU0dOOgkJCXJldHVybiAic2duIjsKKwkJY2FzZSBPUENPREVfQUJTOgkJCXJldHVybiAiYWJzIjsKKwkJY2FzZSBPUENPREVfTlJNOgkJCXJldHVybiAibnJtIjsKKwkJY2FzZSBPUENPREVfU0lOQ09TOgkJCXJldHVybiAic2luY29zIjsKKwkJY2FzZSBPUENPREVfUkVQOgkJCXJldHVybiAicmVwIjsKKwkJY2FzZSBPUENPREVfRU5EUkVQOgkJCXJldHVybiAiZW5kcmVwIjsKKwkJY2FzZSBPUENPREVfSUY6CQkJCXJldHVybiAiaWYiOworCQljYXNlIE9QQ09ERV9JRkM6CQkJcmV0dXJuICJpZmMiOworCQljYXNlIE9QQ09ERV9FTFNFOgkJCXJldHVybiAiZWxzZSI7CisJCWNhc2UgT1BDT0RFX0VORElGOgkJCXJldHVybiAiZW5kaWYiOworCQljYXNlIE9QQ09ERV9CUkVBSzoJCQlyZXR1cm4gImJyZWFrIjsKKwkJY2FzZSBPUENPREVfQlJFQUtDOgkJCXJldHVybiAiYnJlYWtjIjsKKwkJY2FzZSBPUENPREVfTU9WQToJCQlyZXR1cm4gIm1vdmEiOworCQljYXNlIE9QQ09ERV9ERUZCOgkJCXJldHVybiAiZGVmYiI7CisJCWNhc2UgT1BDT0RFX0RFRkk6CQkJcmV0dXJuICJkZWZpIjsKKwkJY2FzZSBPUENPREVfVEVYQ09PUkQ6CQlyZXR1cm4gInRleGNvb3JkIjsKKwkJY2FzZSBPUENPREVfVEVYS0lMTDoJCXJldHVybiAidGV4a2lsbCI7CisJCWNhc2UgT1BDT0RFX1RFWDoKKwkJCWlmKHZlcnNpb24gPCAweDAxMDQpCXJldHVybiAidGV4IjsKKwkJCWVsc2UJCQkJCXJldHVybiAidGV4bGQiOworCQljYXNlIE9QQ09ERV9URVhCRU06CQkJcmV0dXJuICJ0ZXhiZW0iOworCQljYXNlIE9QQ09ERV9URVhCRU1MOgkJcmV0dXJuICJ0ZXhiZW1sIjsKKwkJY2FzZSBPUENPREVfVEVYUkVHMkFSOgkJcmV0dXJuICJ0ZXhyZWcyYXIiOworCQljYXNlIE9QQ09ERV9URVhSRUcyR0I6CQlyZXR1cm4gInRleHJlZzJnYiI7CisJCWNhc2UgT1BDT0RFX1RFWE0zWDJQQUQ6CQlyZXR1cm4gInRleG0zeDJwYWQiOworCQljYXNlIE9QQ09ERV9URVhNM1gyVEVYOgkJcmV0dXJuICJ0ZXhtM3gydGV4IjsKKwkJY2FzZSBPUENPREVfVEVYTTNYM1BBRDoJCXJldHVybiAidGV4bTN4M3BhZCI7CisJCWNhc2UgT1BDT0RFX1RFWE0zWDNURVg6CQlyZXR1cm4gInRleG0zeDN0ZXgiOworCQljYXNlIE9QQ09ERV9SRVNFUlZFRDA6CQlyZXR1cm4gInJlc2VydmVkMCI7CisJCWNhc2UgT1BDT0RFX1RFWE0zWDNTUEVDOglyZXR1cm4gInRleG0zeDNzcGVjIjsKKwkJY2FzZSBPUENPREVfVEVYTTNYM1ZTUEVDOglyZXR1cm4gInRleG0zeDN2c3BlYyI7CisJCWNhc2UgT1BDT0RFX0VYUFA6CQkJcmV0dXJuICJleHBwIjsKKwkJY2FzZSBPUENPREVfTE9HUDoJCQlyZXR1cm4gImxvZ3AiOworCQljYXNlIE9QQ09ERV9DTkQ6CQkJcmV0dXJuICJjbmQiOworCQljYXNlIE9QQ09ERV9ERUY6CQkJcmV0dXJuICJkZWYiOworCQljYXNlIE9QQ09ERV9URVhSRUcyUkdCOgkJcmV0dXJuICJ0ZXhyZWcycmdiIjsKKwkJY2FzZSBPUENPREVfVEVYRFAzVEVYOgkJcmV0dXJuICJ0ZXhkcDN0ZXgiOworCQljYXNlIE9QQ09ERV9URVhNM1gyREVQVEg6CXJldHVybiAidGV4bTN4MmRlcHRoIjsKKwkJY2FzZSBPUENPREVfVEVYRFAzOgkJCXJldHVybiAidGV4ZHAzIjsKKwkJY2FzZSBPUENPREVfVEVYTTNYMzoJCXJldHVybiAidGV4bTN4MyI7CisJCWNhc2UgT1BDT0RFX1RFWERFUFRIOgkJcmV0dXJuICJ0ZXhkZXB0aCI7CisJCWNhc2UgT1BDT0RFX0NNUDoJCQlyZXR1cm4gImNtcCI7CisJCWNhc2UgT1BDT0RFX0JFTToJCQlyZXR1cm4gImJlbSI7CisJCWNhc2UgT1BDT0RFX0RQMkFERDoJCQlyZXR1cm4gImRwMmFkZCI7CisJCWNhc2UgT1BDT0RFX0RTWDoJCQlyZXR1cm4gImRzeCI7CisJCWNhc2UgT1BDT0RFX0RTWToJCQlyZXR1cm4gImRzeSI7CisJCWNhc2UgT1BDT0RFX1RFWExERDoJCQlyZXR1cm4gInRleGxkZCI7CisJCWNhc2UgT1BDT0RFX1NFVFA6CQkJcmV0dXJuICJzZXRwIjsKKwkJY2FzZSBPUENPREVfVEVYTERMOgkJCXJldHVybiAidGV4bGRsIjsKKwkJY2FzZSBPUENPREVfQlJFQUtQOgkJCXJldHVybiAiYnJlYWtwIjsKKwkJY2FzZSBPUENPREVfUEhBU0U6CQkJcmV0dXJuICJwaGFzZSI7CisJCWNhc2UgT1BDT0RFX0NPTU1FTlQ6CQlyZXR1cm4gImNvbW1lbnQiOworCQljYXNlIE9QQ09ERV9FTkQ6CQkJcmV0dXJuICJlbmQiOworCQljYXNlIE9QQ09ERV9QU18xXzA6CQkJcmV0dXJuICJwc18xXzAiOworCQljYXNlIE9QQ09ERV9QU18xXzE6CQkJcmV0dXJuICJwc18xXzEiOworCQljYXNlIE9QQ09ERV9QU18xXzI6CQkJcmV0dXJuICJwc18xXzIiOworCQljYXNlIE9QQ09ERV9QU18xXzM6CQkJcmV0dXJuICJwc18xXzMiOworCQljYXNlIE9QQ09ERV9QU18xXzQ6CQkJcmV0dXJuICJwc18xXzQiOworCQljYXNlIE9QQ09ERV9QU18yXzA6CQkJcmV0dXJuICJwc18yXzAiOworCQljYXNlIE9QQ09ERV9QU18yX3g6CQkJcmV0dXJuICJwc18yX3giOworCQljYXNlIE9QQ09ERV9QU18zXzA6CQkJcmV0dXJuICJwc18zXzAiOworCQljYXNlIE9QQ09ERV9WU18xXzA6CQkJcmV0dXJuICJ2c18xXzAiOworCQljYXNlIE9QQ09ERV9WU18xXzE6CQkJcmV0dXJuICJ2c18xXzEiOworCQljYXNlIE9QQ09ERV9WU18yXzA6CQkJcmV0dXJuICJ2c18yXzAiOworCQljYXNlIE9QQ09ERV9WU18yX3g6CQkJcmV0dXJuICJ2c18yX3giOworCQljYXNlIE9QQ09ERV9WU18yX3N3OgkJcmV0dXJuICJ2c18yX3N3IjsKKwkJY2FzZSBPUENPREVfVlNfM18wOgkJCXJldHVybiAidnNfM18wIjsKKwkJY2FzZSBPUENPREVfVlNfM19zdzoJCXJldHVybiAidnNfM19zdyI7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJcmV0dXJuICI8dW5rbm93bj4iOworCX0KKworCXN0ZDo6c3RyaW5nIFNoYWRlcjo6SW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6Y29udHJvbFN0cmluZygpIGNvbnN0CisJeworCQlpZihvcGNvZGUgIT0gT1BDT0RFX0xPT1AgJiYgb3Bjb2RlICE9IE9QQ09ERV9CUkVBS0MgJiYgb3Bjb2RlICE9IE9QQ09ERV9JRkMgJiYgb3Bjb2RlICE9IE9QQ09ERV9TRVRQKQorCQl7CisJCQlpZihwcm9qZWN0KSByZXR1cm4gInAiOworCisJCQlpZihiaWFzKSByZXR1cm4gImIiOworCisJCQkvLyBGSVhNRTogTE9ECisJCX0KKworCQlzd2l0Y2goY29udHJvbCkKKwkJeworCQljYXNlIDE6IHJldHVybiAiX2d0IjsKKwkJY2FzZSAyOiByZXR1cm4gIl9lcSI7CisJCWNhc2UgMzogcmV0dXJuICJfZ2UiOworCQljYXNlIDQ6IHJldHVybiAiX2x0IjsKKwkJY2FzZSA1OiByZXR1cm4gIl9uZSI7CisJCWNhc2UgNjogcmV0dXJuICJfbGUiOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICIiOworCQkvLwlBU1NFUlQoZmFsc2UpOyAgIC8vIEZJWE1FCisJCX0KKwl9CisKKwlzdGQ6OnN0cmluZyBTaGFkZXI6Okluc3RydWN0aW9uOjpEZXN0aW5hdGlvblBhcmFtZXRlcjo6bW9kaWZpZXJTdHJpbmcoKSBjb25zdAorCXsKKwkJaWYodHlwZSA9PSBQQVJBTUVURVJfVk9JRCB8fCB0eXBlID09IFBBUkFNRVRFUl9MQUJFTCkKKwkJeworCQkJcmV0dXJuICIiOworCQl9CisKKwkJc3RkOjpzdHJpbmcgbW9kaWZpZXJTdHJpbmc7CisKKwkJaWYoc2F0dXJhdGUpCisJCXsKKwkJCW1vZGlmaWVyU3RyaW5nICs9ICJfc2F0IjsKKwkJfQorCisJCWlmKHBhcnRpYWxQcmVjaXNpb24pCisJCXsKKwkJCW1vZGlmaWVyU3RyaW5nICs9ICJfcHAiOworCQl9CisKKwkJaWYoY2VudHJvaWQpCisJCXsKKwkJCW1vZGlmaWVyU3RyaW5nICs9ICJfY2VudHJvaWQiOworCQl9CisKKwkJcmV0dXJuIG1vZGlmaWVyU3RyaW5nOworCX0KKworCXN0ZDo6c3RyaW5nIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OkRlc3RpbmF0aW9uUGFyYW1ldGVyOjpzaGlmdFN0cmluZygpIGNvbnN0CisJeworCQlpZih0eXBlID09IFBBUkFNRVRFUl9WT0lEIHx8IHR5cGUgPT0gUEFSQU1FVEVSX0xBQkVMKQorCQl7CisJCQlyZXR1cm4gIiI7CisJCX0KKworCQlzd2l0Y2goc2hpZnQpCisJCXsKKwkJY2FzZSAwOgkJcmV0dXJuICIiOworCQljYXNlIDE6CQlyZXR1cm4gIl94MiI7CisJCWNhc2UgMjoJCXJldHVybiAiX3g0IjsgCisJCWNhc2UgMzoJCXJldHVybiAiX3g4IjsKKwkJY2FzZSAtMToJcmV0dXJuICJfZDIiOworCQljYXNlIC0yOglyZXR1cm4gIl9kNCI7IAorCQljYXNlIC0zOglyZXR1cm4gIl9kOCI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIiI7CisJCS8vCUFTU0VSVChmYWxzZSk7ICAgLy8gRklYTUUKKwkJfQorCX0KKworCXN0ZDo6c3RyaW5nIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OkRlc3RpbmF0aW9uUGFyYW1ldGVyOjptYXNrU3RyaW5nKCkgY29uc3QKKwl7CisJCWlmKHR5cGUgPT0gUEFSQU1FVEVSX1ZPSUQgfHwgdHlwZSA9PSBQQVJBTUVURVJfTEFCRUwpCisJCXsKKwkJCXJldHVybiAiIjsKKwkJfQorCisJCXN3aXRjaChtYXNrKQorCQl7CisJCWNhc2UgMHgwOglyZXR1cm4gIiI7CisJCWNhc2UgMHgxOglyZXR1cm4gIi54IjsKKwkJY2FzZSAweDI6CXJldHVybiAiLnkiOworCQljYXNlIDB4MzoJcmV0dXJuICIueHkiOworCQljYXNlIDB4NDoJcmV0dXJuICIueiI7CisJCWNhc2UgMHg1OglyZXR1cm4gIi54eiI7CisJCWNhc2UgMHg2OglyZXR1cm4gIi55eiI7CisJCWNhc2UgMHg3OglyZXR1cm4gIi54eXoiOworCQljYXNlIDB4ODoJcmV0dXJuICIudyI7CisJCWNhc2UgMHg5OglyZXR1cm4gIi54dyI7CisJCWNhc2UgMHhBOglyZXR1cm4gIi55dyI7CisJCWNhc2UgMHhCOglyZXR1cm4gIi54eXciOworCQljYXNlIDB4QzoJcmV0dXJuICIuenciOworCQljYXNlIDB4RDoJcmV0dXJuICIueHp3IjsKKwkJY2FzZSAweEU6CXJldHVybiAiLnl6dyI7CisJCWNhc2UgMHhGOglyZXR1cm4gIiI7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJcmV0dXJuICIiOworCX0KKworCXN0ZDo6c3RyaW5nIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlcjo6cHJlTW9kaWZpZXJTdHJpbmcoKSBjb25zdAorCXsKKwkJaWYodHlwZSA9PSBQQVJBTUVURVJfVk9JRCkKKwkJeworCQkJcmV0dXJuICIiOworCQl9CisKKwkJc3dpdGNoKG1vZGlmaWVyKQorCQl7CisJCWNhc2UgTU9ESUZJRVJfTk9ORToJCQlyZXR1cm4gIiI7CisJCWNhc2UgTU9ESUZJRVJfTkVHQVRFOgkJcmV0dXJuICItIjsKKwkJY2FzZSBNT0RJRklFUl9CSUFTOgkJCXJldHVybiAiIjsKKwkJY2FzZSBNT0RJRklFUl9CSUFTX05FR0FURToJcmV0dXJuICItIjsKKwkJY2FzZSBNT0RJRklFUl9TSUdOOgkJCXJldHVybiAiIjsKKwkJY2FzZSBNT0RJRklFUl9TSUdOX05FR0FURToJcmV0dXJuICItIjsKKwkJY2FzZSBNT0RJRklFUl9DT01QTEVNRU5UOglyZXR1cm4gIjEtIjsKKwkJY2FzZSBNT0RJRklFUl9YMjoJCQlyZXR1cm4gIiI7CisJCWNhc2UgTU9ESUZJRVJfWDJfTkVHQVRFOglyZXR1cm4gIi0iOworCQljYXNlIE1PRElGSUVSX0RaOgkJCXJldHVybiAiIjsKKwkJY2FzZSBNT0RJRklFUl9EVzoJCQlyZXR1cm4gIiI7CisJCWNhc2UgTU9ESUZJRVJfQUJTOgkJCXJldHVybiAiIjsKKwkJY2FzZSBNT0RJRklFUl9BQlNfTkVHQVRFOglyZXR1cm4gIi0iOworCQljYXNlIE1PRElGSUVSX05PVDoJCQlyZXR1cm4gIiEiOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiAiIjsKKwl9CisKKwlzdGQ6OnN0cmluZyBTaGFkZXI6Okluc3RydWN0aW9uOjpQYXJhbWV0ZXI6OnJlbGF0aXZlU3RyaW5nKCkgY29uc3QKKwl7CisJCWlmKCFyZWxhdGl2ZSkgcmV0dXJuICIiOworCisJCWlmKHJlbGF0aXZlVHlwZSA9PSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9BRERSKQorCQl7CisJCQlzd2l0Y2gocmVsYXRpdmVTd2l6emxlICYgMHgwMykKKwkJCXsKKwkJCWNhc2UgMDogcmV0dXJuICJbYTAueF0iOworCQkJY2FzZSAxOiByZXR1cm4gIlthMC55XSI7CisJCQljYXNlIDI6IHJldHVybiAiW2EwLnpdIjsKKwkJCWNhc2UgMzogcmV0dXJuICJbYTAud10iOworCQkJfQorCQl9CisJCWVsc2UgaWYocmVsYXRpdmVUeXBlID09IFBhcmFtZXRlcjo6UEFSQU1FVEVSX0xPT1ApCisJCXsKKwkJCXJldHVybiAiW2FMXSI7CisJCX0KKwkJZWxzZSBBU1NFUlQoZmFsc2UpOworCisJCXJldHVybiAiIjsKKwl9CisKKwlzdGQ6OnN0cmluZyBTaGFkZXI6Okluc3RydWN0aW9uOjpTb3VyY2VQYXJhbWV0ZXI6OnBvc3RNb2RpZmllclN0cmluZygpIGNvbnN0CisJeworCQlpZih0eXBlID09IFBBUkFNRVRFUl9WT0lEKQorCQl7CisJCQlyZXR1cm4gIiI7CisJCX0KKworCQlzd2l0Y2gobW9kaWZpZXIpCisJCXsKKwkJY2FzZSBNT0RJRklFUl9OT05FOgkJCXJldHVybiAiIjsKKwkJY2FzZSBNT0RJRklFUl9ORUdBVEU6CQlyZXR1cm4gIiI7CisJCWNhc2UgTU9ESUZJRVJfQklBUzoJCQlyZXR1cm4gIl9iaWFzIjsKKwkJY2FzZSBNT0RJRklFUl9CSUFTX05FR0FURToJcmV0dXJuICJfYmlhcyI7CisJCWNhc2UgTU9ESUZJRVJfU0lHTjoJCQlyZXR1cm4gIl9ieDIiOworCQljYXNlIE1PRElGSUVSX1NJR05fTkVHQVRFOglyZXR1cm4gIl9ieDIiOworCQljYXNlIE1PRElGSUVSX0NPTVBMRU1FTlQ6CXJldHVybiAiIjsKKwkJY2FzZSBNT0RJRklFUl9YMjoJCQlyZXR1cm4gIl94MiI7CisJCWNhc2UgTU9ESUZJRVJfWDJfTkVHQVRFOglyZXR1cm4gIl94MiI7CisJCWNhc2UgTU9ESUZJRVJfRFo6CQkJcmV0dXJuICJfZHoiOworCQljYXNlIE1PRElGSUVSX0RXOgkJCXJldHVybiAiX2R3IjsKKwkJY2FzZSBNT0RJRklFUl9BQlM6CQkJcmV0dXJuICJfYWJzIjsKKwkJY2FzZSBNT0RJRklFUl9BQlNfTkVHQVRFOglyZXR1cm4gIl9hYnMiOworCQljYXNlIE1PRElGSUVSX05PVDoJCQlyZXR1cm4gIiI7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJcmV0dXJuICIiOworCX0KKworCXN0ZDo6c3RyaW5nIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlcjo6c3dpenpsZVN0cmluZygpIGNvbnN0CisJeworCQlyZXR1cm4gSW5zdHJ1Y3Rpb246OnN3aXp6bGVTdHJpbmcodHlwZSwgc3dpenpsZSk7CisJfQorCisJdm9pZCBTaGFkZXI6Okluc3RydWN0aW9uOjpwYXJzZU9wZXJhdGlvblRva2VuKHVuc2lnbmVkIGxvbmcgdG9rZW4sIHVuc2lnbmVkIGNoYXIgbWFqb3JWZXJzaW9uKQorCXsKKwkJaWYoKHRva2VuICYgMHhGRkZGMDAwMCkgPT0gMHhGRkZGMDAwMCB8fCAodG9rZW4gJiAweEZGRkYwMDAwKSA9PSAweEZGRkUwMDAwKSAgIC8vIFZlcnNpb24gdG9rZW4KKwkJeworCQkJb3BlcmF0aW9uLm9wY29kZSA9IChPcGVyYXRpb246Ok9wY29kZSl0b2tlbjsKKwkJCW9wZXJhdGlvbi5wcmVkaWNhdGUgPSBmYWxzZTsKKwkJCW9wZXJhdGlvbi5jb2lzc3VlID0gZmFsc2U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcGVyYXRpb24ub3Bjb2RlID0gKE9wZXJhdGlvbjo6T3Bjb2RlKSh0b2tlbiAmIDB4MDAwMEZGRkYpOworCQkJb3BlcmF0aW9uLmNvbnRyb2wgPSAoT3BlcmF0aW9uOjpDb250cm9sKSgodG9rZW4gJiAweDAwRkYwMDAwKSA+PiAxNik7CisKKwkJCWludCBzaXplID0gKHRva2VuICYgMHgwRjAwMDAwMCkgPj4gMjQ7CisKKwkJCW9wZXJhdGlvbi5wcmVkaWNhdGUgPSAodG9rZW4gJiAweDEwMDAwMDAwKSAhPSAweDAwMDAwMDAwOworCQkJb3BlcmF0aW9uLmNvaXNzdWUgPSAodG9rZW4gJiAweDQwMDAwMDAwKSAhPSAweDAwMDAwMDAwOworCisJCQlpZihtYWpvclZlcnNpb24gPCAyKQorCQkJeworCQkJCWlmKHNpemUgIT0gMCkKKwkJCQl7CisJCQkJCUFTU0VSVChmYWxzZSk7ICAgLy8gUmVzZXJ2ZWQKKwkJCQl9CisJCQl9CisKKwkJCWlmKG1ham9yVmVyc2lvbiA8IDIpCisJCQl7CisJCQkJaWYob3BlcmF0aW9uLnByZWRpY2F0ZSkKKwkJCQl7CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJfQorCisJCQlpZigodG9rZW4gJiAweDIwMDAwMDAwKSAhPSAweDAwMDAwMDAwKQorCQkJeworCQkJCUFTU0VSVChmYWxzZSk7ICAgLy8gUmVzZXJ2ZWQKKwkJCX0KKworCQkJaWYobWFqb3JWZXJzaW9uID49IDIpCisJCQl7CisJCQkJaWYob3BlcmF0aW9uLmNvaXNzdWUpCisJCQkJeworCQkJCQlBU1NFUlQoZmFsc2UpOyAgIC8vIFJlc2VydmVkCisJCQkJfQorCQkJfQorCisJCQlpZigodG9rZW4gJiAweDgwMDAwMDAwKSAhPSAweDAwMDAwMDAwKQorCQkJeworCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OnBhcnNlRGVjbGFyYXRpb25Ub2tlbih1bnNpZ25lZCBsb25nIHRva2VuKQorCXsKKwkJb3BlcmF0aW9uLnNhbXBsZXJUeXBlID0gKE9wZXJhdGlvbjo6U2FtcGxlclR5cGUpKCh0b2tlbiAmIDB4NzgwMDAwMDApID4+IDI3KTsKKwkJb3BlcmF0aW9uLnVzYWdlID0gKE9wZXJhdGlvbjo6VXNhZ2UpKHRva2VuICYgMHgwMDAwMDAxRik7CisJCW9wZXJhdGlvbi51c2FnZUluZGV4ID0gKHVuc2lnbmVkIGNoYXIpKCh0b2tlbiAmIDB4MDAwRjAwMDApID4+IDE2KTsKKwl9CisKKwl2b2lkIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OnBhcnNlRGVzdGluYXRpb25Ub2tlbihjb25zdCB1bnNpZ25lZCBsb25nICp0b2tlbiwgdW5zaWduZWQgY2hhciBtYWpvclZlcnNpb24pCisJeworCQlkZXN0aW5hdGlvblBhcmFtZXRlci5pbmRleCA9ICh1bnNpZ25lZCBzaG9ydCkodG9rZW5bMF0gJiAweDAwMDAwN0ZGKTsKKwkJZGVzdGluYXRpb25QYXJhbWV0ZXIudHlwZSA9IChQYXJhbWV0ZXI6OlR5cGUpKCgodG9rZW5bMF0gJiAweDAwMDAxODAwKSA+PiA4KSB8ICgodG9rZW5bMF0gJiAweDcwMDAwMDAwKSA+PiAyOCkpOworCisJCS8vIFRPRE86IENoZWNrIHR5cGUgYW5kIGluZGV4IHJhbmdlCisKKwkJZGVzdGluYXRpb25QYXJhbWV0ZXIucmVsYXRpdmUgPSAodG9rZW5bMF0gJiAweDAwMDAyMDAwKSAhPSAweDAwMDAwMDAwOworCQlkZXN0aW5hdGlvblBhcmFtZXRlci5yZWxhdGl2ZVR5cGUgPSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9BRERSOworCQlkZXN0aW5hdGlvblBhcmFtZXRlci5yZWxhdGl2ZVN3aXp6bGUgPSAweDAwOworCisJCWlmKGRlc3RpbmF0aW9uUGFyYW1ldGVyLnJlbGF0aXZlICYmIG1ham9yVmVyc2lvbiA+PSAzKQorCQl7CisJCQlkZXN0aW5hdGlvblBhcmFtZXRlci5yZWxhdGl2ZVR5cGUgPSAoUGFyYW1ldGVyOjpUeXBlKSgoKHRva2VuWzFdICYgMHgwMDAwMTgwMCkgPj4gOCkgfCAoKHRva2VuWzFdICYgMHg3MDAwMDAwMCkgPj4gMjgpKTsKKwkJCWRlc3RpbmF0aW9uUGFyYW1ldGVyLnJlbGF0aXZlU3dpenpsZSA9ICh1bnNpZ25lZCBjaGFyKSgodG9rZW5bMV0gJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCX0KKwkJZWxzZSBpZihkZXN0aW5hdGlvblBhcmFtZXRlci5yZWxhdGl2ZSkgQVNTRVJUKGZhbHNlKTsgICAvLyBSZXNlcnZlZAorCisJCWlmKCh0b2tlblswXSAmIDB4MDAwMEMwMDApICE9IDB4MDAwMDAwMDApCisJCXsKKwkJCUFTU0VSVChmYWxzZSk7ICAgLy8gUmVzZXJ2ZWQKKwkJfQorCisJCWRlc3RpbmF0aW9uUGFyYW1ldGVyLm1hc2sgPSAodW5zaWduZWQgY2hhcikoKHRva2VuWzBdICYgMHgwMDBGMDAwMCkgPj4gMTYpOworCQlkZXN0aW5hdGlvblBhcmFtZXRlci5zYXR1cmF0ZSA9ICh0b2tlblswXSAmIDB4MDAxMDAwMDApICE9IDA7CisJCWRlc3RpbmF0aW9uUGFyYW1ldGVyLnBhcnRpYWxQcmVjaXNpb24gPSAodG9rZW5bMF0gJiAweDAwMjAwMDAwKSAhPSAwOworCQlkZXN0aW5hdGlvblBhcmFtZXRlci5jZW50cm9pZCA9ICh0b2tlblswXSAmIDB4MDA0MDAwMDApICE9IDA7CisJCWRlc3RpbmF0aW9uUGFyYW1ldGVyLnNoaWZ0ID0gKHNpZ25lZCBjaGFyKSgodG9rZW5bMF0gJiAweDBGMDAwMDAwKSA+PiAyMCkgPj4gNDsKKworCQlpZihtYWpvclZlcnNpb24gPj0gMikKKwkJeworCQkJaWYoZGVzdGluYXRpb25QYXJhbWV0ZXIuc2hpZnQpCisJCQl7CisJCQkJQVNTRVJUKGZhbHNlKTsgICAvLyBSZXNlcnZlZAorCQkJfQorCQl9CisKKwkJaWYoKHRva2VuWzBdICYgMHg4MDAwMDAwMCkgIT0gMHg4MDAwMDAwMCkKKwkJeworCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCX0KKworCXZvaWQgU2hhZGVyOjpJbnN0cnVjdGlvbjo6cGFyc2VTb3VyY2VUb2tlbihpbnQgaSwgY29uc3QgdW5zaWduZWQgbG9uZyAqdG9rZW4sIHVuc2lnbmVkIGNoYXIgbWFqb3JWZXJzaW9uKQorCXsKKwkJLy8gRGVmYXVsdHMKKwkJc291cmNlUGFyYW1ldGVyW2ldLnZhbHVlID0gKGZsb2F0JikqdG9rZW47CisJCXNvdXJjZVBhcmFtZXRlcltpXS50eXBlID0gUGFyYW1ldGVyOjpQQVJBTUVURVJfVk9JRDsKKwkJc291cmNlUGFyYW1ldGVyW2ldLm1vZGlmaWVyID0gU291cmNlUGFyYW1ldGVyOjpNT0RJRklFUl9OT05FOworCQlzb3VyY2VQYXJhbWV0ZXJbaV0uc3dpenpsZSA9IDB4RTQ7CisJCXNvdXJjZVBhcmFtZXRlcltpXS5yZWxhdGl2ZSA9IGZhbHNlOworCQlzb3VyY2VQYXJhbWV0ZXJbaV0ucmVsYXRpdmVUeXBlID0gUGFyYW1ldGVyOjpQQVJBTUVURVJfQUREUjsKKwkJc291cmNlUGFyYW1ldGVyW2ldLnJlbGF0aXZlU3dpenpsZSA9IDB4MDA7CisJCQorCQlzd2l0Y2gob3BlcmF0aW9uLm9wY29kZSkKKwkJeworCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9ERUY6CisJCQlzb3VyY2VQYXJhbWV0ZXJbaV0udHlwZSA9IFBhcmFtZXRlcjo6UEFSQU1FVEVSX0ZMT0FUTElURVJBTDsKKwkJCWJyZWFrOworCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9ERUZCOgorCQkJc291cmNlUGFyYW1ldGVyW2ldLnR5cGUgPSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9CT09MTElURVJBTDsKKwkJCWJyZWFrOworCQljYXNlIEluc3RydWN0aW9uOjpPcGVyYXRpb246Ok9QQ09ERV9ERUZJOgorCQkJc291cmNlUGFyYW1ldGVyW2ldLnR5cGUgPSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9JTlRMSVRFUkFMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzb3VyY2VQYXJhbWV0ZXJbaV0uaW5kZXggPSAodW5zaWduZWQgc2hvcnQpKHRva2VuWzBdICYgMHgwMDAwMDdGRik7CisJCQlzb3VyY2VQYXJhbWV0ZXJbaV0udHlwZSA9IChQYXJhbWV0ZXI6OlR5cGUpKCgodG9rZW5bMF0gJiAweDAwMDAxODAwKSA+PiA4KSB8ICgodG9rZW5bMF0gJiAweDcwMDAwMDAwKSA+PiAyOCkpOworCisJCQkvLyBGSVhNRTogQ2hlY2sgdHlwZSBhbmQgaW5kZXggcmFuZ2UKKworCQkJc291cmNlUGFyYW1ldGVyW2ldLnJlbGF0aXZlID0gKHRva2VuWzBdICYgMHgwMDAwMjAwMCkgIT0gMHgwMDAwMDAwMDsKKworCQkJaWYoKHRva2VuWzBdICYgMHgwMDAwQzAwMCkgIT0gMHgwMDAwMDAwMCkKKwkJCXsKKwkJCQlpZihvcGVyYXRpb24ub3Bjb2RlICE9IE9wZXJhdGlvbjo6T1BDT0RFX0RFRiAmJgorCQkJCSAgIG9wZXJhdGlvbi5vcGNvZGUgIT0gT3BlcmF0aW9uOjpPUENPREVfREVGSSAmJgorCQkJCSAgIG9wZXJhdGlvbi5vcGNvZGUgIT0gT3BlcmF0aW9uOjpPUENPREVfREVGQikKKwkJCQl7CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJfQorCisJCQlzb3VyY2VQYXJhbWV0ZXJbaV0uc3dpenpsZSA9ICh1bnNpZ25lZCBjaGFyKSgodG9rZW5bMF0gJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCQlzb3VyY2VQYXJhbWV0ZXJbaV0ubW9kaWZpZXIgPSAoU291cmNlUGFyYW1ldGVyOjpNb2RpZmllcikoKHRva2VuWzBdICYgMHgwRjAwMDAwMCkgPj4gMjQpOworCisJCQlpZigodG9rZW5bMF0gJiAweDgwMDAwMDAwKSAhPSAweDgwMDAwMDAwKQorCQkJeworCQkJCWlmKG9wZXJhdGlvbi5vcGNvZGUgIT0gT3BlcmF0aW9uOjpPUENPREVfREVGICYmCisJCQkJICAgb3BlcmF0aW9uLm9wY29kZSAhPSBPcGVyYXRpb246Ok9QQ09ERV9ERUZJICYmCisJCQkJICAgb3BlcmF0aW9uLm9wY29kZSAhPSBPcGVyYXRpb246Ok9QQ09ERV9ERUZCKQorCQkJCXsKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmKHNvdXJjZVBhcmFtZXRlcltpXS5yZWxhdGl2ZSAmJiBtYWpvclZlcnNpb24gPj0gMikKKwkJCXsKKwkJCQlzb3VyY2VQYXJhbWV0ZXJbaV0ucmVsYXRpdmVUeXBlID0gKFBhcmFtZXRlcjo6VHlwZSkoKCh0b2tlblsxXSAmIDB4MDAwMDE4MDApID4+IDgpIHwgKCh0b2tlblsxXSAmIDB4NzAwMDAwMDApID4+IDI4KSk7CisJCQkJc291cmNlUGFyYW1ldGVyW2ldLnJlbGF0aXZlU3dpenpsZSA9ICh1bnNpZ25lZCBjaGFyKSgodG9rZW5bMV0gJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCQl9CisJCX0KKwl9CisKKwlzdGQ6OnN0cmluZyBTaGFkZXI6Okluc3RydWN0aW9uOjpzd2l6emxlU3RyaW5nKFBhcmFtZXRlcjo6VHlwZSB0eXBlLCB1bnNpZ25lZCBjaGFyIHN3aXp6bGUpCisJeworCQlpZih0eXBlID09IFBhcmFtZXRlcjo6UEFSQU1FVEVSX1ZPSUQgfHwgdHlwZSA9PSBQYXJhbWV0ZXI6OlBBUkFNRVRFUl9MQUJFTCB8fCBzd2l6emxlID09IDB4RTQpCisJCXsKKwkJCXJldHVybiAiIjsKKwkJfQorCisJCWludCB4ID0gKHN3aXp6bGUgJiAweDAzKSA+PiAwOworCQlpbnQgeSA9IChzd2l6emxlICYgMHgwQykgPj4gMjsKKwkJaW50IHogPSAoc3dpenpsZSAmIDB4MzApID4+IDQ7CisJCWludCB3ID0gKHN3aXp6bGUgJiAweEMwKSA+PiA2OworCisJCXN0ZDo6c3RyaW5nIHN3aXp6bGVTdHJpbmcgPSAiLiI7CisKKwkJc3dpdGNoKHgpCisJCXsKKwkJY2FzZSAwOiBzd2l6emxlU3RyaW5nICs9ICJ4IjsgYnJlYWs7CisJCWNhc2UgMTogc3dpenpsZVN0cmluZyArPSAieSI7IGJyZWFrOworCQljYXNlIDI6IHN3aXp6bGVTdHJpbmcgKz0gInoiOyBicmVhazsKKwkJY2FzZSAzOiBzd2l6emxlU3RyaW5nICs9ICJ3IjsgYnJlYWs7CisJCX0KKworCQlpZighKHggPT0geSAmJiB5ID09IHogJiYgeiA9PSB3KSkKKwkJeworCQkJc3dpdGNoKHkpCisJCQl7CisJCQljYXNlIDA6IHN3aXp6bGVTdHJpbmcgKz0gIngiOyBicmVhazsKKwkJCWNhc2UgMTogc3dpenpsZVN0cmluZyArPSAieSI7IGJyZWFrOworCQkJY2FzZSAyOiBzd2l6emxlU3RyaW5nICs9ICJ6IjsgYnJlYWs7CisJCQljYXNlIDM6IHN3aXp6bGVTdHJpbmcgKz0gInciOyBicmVhazsKKwkJCX0KKworCQkJaWYoISh5ID09IHogJiYgeiA9PSB3KSkKKwkJCXsKKwkJCQlzd2l0Y2goeikKKwkJCQl7CisJCQkJY2FzZSAwOiBzd2l6emxlU3RyaW5nICs9ICJ4IjsgYnJlYWs7CisJCQkJY2FzZSAxOiBzd2l6emxlU3RyaW5nICs9ICJ5IjsgYnJlYWs7CisJCQkJY2FzZSAyOiBzd2l6emxlU3RyaW5nICs9ICJ6IjsgYnJlYWs7CisJCQkJY2FzZSAzOiBzd2l6emxlU3RyaW5nICs9ICJ3IjsgYnJlYWs7CisJCQkJfQorCisJCQkJaWYoISh6ID09IHcpKQorCQkJCXsKKwkJCQkJc3dpdGNoKHcpCisJCQkJCXsKKwkJCQkJY2FzZSAwOiBzd2l6emxlU3RyaW5nICs9ICJ4IjsgYnJlYWs7CisJCQkJCWNhc2UgMTogc3dpenpsZVN0cmluZyArPSAieSI7IGJyZWFrOworCQkJCQljYXNlIDI6IHN3aXp6bGVTdHJpbmcgKz0gInoiOyBicmVhazsKKwkJCQkJY2FzZSAzOiBzd2l6emxlU3RyaW5nICs9ICJ3IjsgYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gc3dpenpsZVN0cmluZzsKKwl9CisKKwlzdGQ6OnN0cmluZyBTaGFkZXI6Okluc3RydWN0aW9uOjpQYXJhbWV0ZXI6OnN0cmluZyhTaGFkZXJUeXBlIHNoYWRlclR5cGUsIHVuc2lnbmVkIHNob3J0IHZlcnNpb24pIGNvbnN0CisJeworCQlzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmZmVyOworCisJCWlmKHR5cGUgPT0gUEFSQU1FVEVSX0ZMT0FUTElURVJBTCkKKwkJeworCQkJYnVmZmVyIDw8IHZhbHVlOworCisJCQlyZXR1cm4gYnVmZmVyLnN0cigpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYodHlwZSAhPSBQQVJBTUVURVJfUkFTVE9VVCAmJiAhKHR5cGUgPT0gUEFSQU1FVEVSX0FERFIgJiYgc2hhZGVyVHlwZSA9PSBTSEFERVJfVkVSVEVYKSAmJiB0eXBlICE9IFBBUkFNRVRFUl9MT09QICYmIHR5cGUgIT0gUEFSQU1FVEVSX1BSRURJQ0FURSAmJiB0eXBlICE9IFBBUkFNRVRFUl9NSVNDVFlQRSkKKwkJCXsKKwkJCQlidWZmZXIgPDwgaW5kZXg7CisKKwkJCQlyZXR1cm4gdHlwZVN0cmluZyhzaGFkZXJUeXBlLCB2ZXJzaW9uKSArIGJ1ZmZlci5zdHIoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gdHlwZVN0cmluZyhzaGFkZXJUeXBlLCB2ZXJzaW9uKTsKKwkJCX0KKwkJfQorCX0KKworCXN0ZDo6c3RyaW5nIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OlBhcmFtZXRlcjo6dHlwZVN0cmluZyhTaGFkZXJUeXBlIHNoYWRlclR5cGUsIHVuc2lnbmVkIHNob3J0IHZlcnNpb24pIGNvbnN0CisJeworCQlzd2l0Y2godHlwZSkKKwkJeworCQljYXNlIFBBUkFNRVRFUl9URU1QOgkJCXJldHVybiAiciI7CisJCWNhc2UgUEFSQU1FVEVSX0lOUFVUOgkJCXJldHVybiAidiI7CisJCWNhc2UgUEFSQU1FVEVSX0NPTlNUOgkJCXJldHVybiAiYyI7CisJCWNhc2UgUEFSQU1FVEVSX1RFWFRVUkU6CisJLy8JY2FzZSBQQVJBTUVURVJfQUREUjoKKwkJCWlmKHNoYWRlclR5cGUgPT0gU0hBREVSX1BJWEVMKQlyZXR1cm4gInQiOworCQkJZWxzZQkJCQkJCQlyZXR1cm4gImEwIjsKKwkJY2FzZSBQQVJBTUVURVJfUkFTVE9VVDoKKwkJCWlmKGluZGV4ID09IDApICAgICAgICAgICAgICByZXR1cm4gIm9Qb3MiOworCQkJZWxzZSBpZihpbmRleCA9PSAxKSAgICAgICAgIHJldHVybiAib0ZvZyI7CisJCQllbHNlIGlmKGluZGV4ID09IDIpICAgICAgICAgcmV0dXJuICJvUHRzIjsKKwkJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoZmFsc2UpOworCQljYXNlIFBBUkFNRVRFUl9BVFRST1VUOgkJCXJldHVybiAib0QiOworCQljYXNlIFBBUkFNRVRFUl9URVhDUkRPVVQ6CisJLy8JY2FzZSBQQVJBTUVURVJfT1VUUFVUOgkJCXJldHVybiAiIjsKKwkJCWlmKHZlcnNpb24gPCAweDAzMDApCQlyZXR1cm4gIm9UIjsKKwkJCWVsc2UJCQkJCQlyZXR1cm4gIm8iOworCQljYXNlIFBBUkFNRVRFUl9DT05TVElOVDoJCXJldHVybiAiaSI7CisJCWNhc2UgUEFSQU1FVEVSX0NPTE9ST1VUOgkJcmV0dXJuICJvQyI7CisJCWNhc2UgUEFSQU1FVEVSX0RFUFRIT1VUOgkJcmV0dXJuICJvRGVwdGgiOworCQljYXNlIFBBUkFNRVRFUl9TQU1QTEVSOgkJCXJldHVybiAicyI7CisJLy8JY2FzZSBQQVJBTUVURVJfQ09OU1QyOgkJCXJldHVybiAiIjsKKwkvLwljYXNlIFBBUkFNRVRFUl9DT05TVDM6CQkJcmV0dXJuICIiOworCS8vCWNhc2UgUEFSQU1FVEVSX0NPTlNUNDoJCQlyZXR1cm4gIiI7CisJCWNhc2UgUEFSQU1FVEVSX0NPTlNUQk9PTDoJCXJldHVybiAiYiI7CisJCWNhc2UgUEFSQU1FVEVSX0xPT1A6CQkJcmV0dXJuICJhTCI7CisJLy8JY2FzZSBQQVJBTUVURVJfVEVNUEZMT0FUMTY6CQlyZXR1cm4gIiI7CisJCWNhc2UgUEFSQU1FVEVSX01JU0NUWVBFOgorCQkJaWYoaW5kZXggPT0gMCkJCQkJcmV0dXJuICJ2UG9zIjsKKwkJCWVsc2UgaWYoaW5kZXggPT0gMSkJCQlyZXR1cm4gInZGYWNlIjsKKwkJCWVsc2UJCQkJCQlBU1NFUlQoZmFsc2UpOworCQljYXNlIFBBUkFNRVRFUl9MQUJFTDoJCQlyZXR1cm4gImwiOworCQljYXNlIFBBUkFNRVRFUl9QUkVESUNBVEU6CQlyZXR1cm4gInAwIjsKKwkJY2FzZSBQQVJBTUVURVJfRkxPQVRMSVRFUkFMOglyZXR1cm4gIiI7CisJCWNhc2UgUEFSQU1FVEVSX0JPT0xMSVRFUkFMOgkJcmV0dXJuICIiOworCQljYXNlIFBBUkFNRVRFUl9JTlRMSVRFUkFMOgkJcmV0dXJuICIiOworCS8vCWNhc2UgUEFSQU1FVEVSX1ZPSUQ6CQkJcmV0dXJuICIiOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiAiIjsKKwl9CisKKwlTaGFkZXI6OlNoYWRlcihjb25zdCB1bnNpZ25lZCBsb25nICpzaGFkZXJUb2tlbikKKwl7CisJCWluc3RydWN0aW9uID0gMDsKKwkJbGVuZ3RoID0gMDsKKworCQl0b2tlbkNvdW50ID0gMDsKKworCQl3aGlsZShzaGFkZXJUb2tlblt0b2tlbkNvdW50XSAhPSAweDAwMDBGRkZGKQorCQl7CisJCQl0b2tlbkNvdW50ICs9IHN3OjpTaGFkZXI6OnNpemUoc2hhZGVyVG9rZW5bdG9rZW5Db3VudF0sICh1bnNpZ25lZCBzaG9ydCkoc2hhZGVyVG9rZW5bMF0gJiAweEZGRkYpKSArIDE7CisJCX0KKworCQl0b2tlbkNvdW50ICs9IDE7CisKKwkJdGhpcy0+c2hhZGVyVG9rZW4gPSBuZXcgdW5zaWduZWQgbG9uZ1t0b2tlbkNvdW50XTsKKwkJbWVtY3B5KHRoaXMtPnNoYWRlclRva2VuLCBzaGFkZXJUb2tlbiwgdG9rZW5Db3VudCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwkJdW5zaWduZWQgbG9uZyAqaGFzaFRva2VucyA9IG5ldyB1bnNpZ25lZCBsb25nW3Rva2VuQ291bnRdOworCQltZW1jcHkoaGFzaFRva2Vucywgc2hhZGVyVG9rZW4sIHRva2VuQ291bnQgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCQlyZW1vdmVDb21tZW50cyhoYXNoVG9rZW5zLCB0b2tlbkNvdW50KTsKKwkJaGFzaCA9IEZOVl8xKCh1bnNpZ25lZCBjaGFyKiloYXNoVG9rZW5zLCB0b2tlbkNvdW50ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJZGVsZXRlW10gaGFzaFRva2VuczsKKwl9CisKKwlTaGFkZXI6On5TaGFkZXIoKQorCXsKKwkJZGVsZXRlW10gc2hhZGVyVG9rZW47CisJCXNoYWRlclRva2VuID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXsKKwkJCWRlbGV0ZSBpbnN0cnVjdGlvbltpXTsKKwkJCWluc3RydWN0aW9uW2ldID0gMDsKKwkJfQorCisJCWRlbGV0ZVtdIGluc3RydWN0aW9uOworCQlpbnN0cnVjdGlvbiA9IDA7CisJfQorCisJdm9pZCBTaGFkZXI6OmdldEZ1bmN0aW9uKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCAqc2l6ZSkKKwl7CisJCWlmKGRhdGEpCisJCXsKKwkJCW1lbWNweShkYXRhLCBzaGFkZXJUb2tlbiwgdG9rZW5Db3VudCAqIDQpOworCQl9CisKKwkJKnNpemUgPSB0b2tlbkNvdW50ICogNDsKKwl9CisKKwlpbnQgU2hhZGVyOjpzaXplKHVuc2lnbmVkIGxvbmcgb3Bjb2RlKSBjb25zdAorCXsKKwkJcmV0dXJuIHNpemUob3Bjb2RlLCB2ZXJzaW9uKTsKKwl9CisKKwlpbnQgU2hhZGVyOjpzaXplKHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uKQorCXsKKwkJaWYodmVyc2lvbiA+IDB4MDMwMCkKKwkJeworCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXN0YXRpYyBjb25zdCBjaGFyIHNpemVbXSA9CisJCXsKKwkJCTAsICAgLy8gTk9QID0gMAorCQkJMiwgICAvLyBNT1YKKwkJCTMsICAgLy8gQURECisJCQkzLCAgIC8vIFNVQgorCQkJNCwgICAvLyBNQUQKKwkJCTMsICAgLy8gTVVMCisJCQkyLCAgIC8vIFJDUAorCQkJMiwgICAvLyBSU1EKKwkJCTMsICAgLy8gRFAzCisJCQkzLCAgIC8vIERQNAorCQkJMywgICAvLyBNSU4KKwkJCTMsICAgLy8gTUFYCisJCQkzLCAgIC8vIFNMVAorCQkJMywgICAvLyBTR0UKKwkJCTIsICAgLy8gRVhQCisJCQkyLCAgIC8vIExPRworCQkJMiwgICAvLyBMSVQKKwkJCTMsICAgLy8gRFNUCisJCQk0LCAgIC8vIExSUAorCQkJMiwgICAvLyBGUkMKKwkJCTMsICAgLy8gTTR4NAorCQkJMywgICAvLyBNNHgzCisJCQkzLCAgIC8vIE0zeDQKKwkJCTMsICAgLy8gTTN4MworCQkJMywgICAvLyBNM3gyCisJCQkxLCAgIC8vIENBTEwKKwkJCTIsICAgLy8gQ0FMTE5aCisJCQkyLCAgIC8vIExPT1AKKwkJCTAsICAgLy8gUkVUCisJCQkwLCAgIC8vIEVORExPT1AKKwkJCTEsICAgLy8gTEFCRUwKKwkJCTIsICAgLy8gRENMCisJCQkzLCAgIC8vIFBPVworCQkJMywgICAvLyBDUlMKKwkJCTQsICAgLy8gU0dOCisJCQkyLCAgIC8vIEFCUworCQkJMiwgICAvLyBOUk0KKwkJCTQsICAgLy8gU0lOQ09TCisJCQkxLCAgIC8vIFJFUAorCQkJMCwgICAvLyBFTkRSRVAKKwkJCTEsICAgLy8gSUYKKwkJCTIsICAgLy8gSUZDCisJCQkwLCAgIC8vIEVMU0UKKwkJCTAsICAgLy8gRU5ESUYKKwkJCTAsICAgLy8gQlJFQUsKKwkJCTIsICAgLy8gQlJFQUtDCisJCQkyLCAgIC8vIE1PVkEKKwkJCTIsICAgLy8gREVGQgorCQkJNSwgICAvLyBERUZJCisJCQktMSwgIC8vIDQ5CisJCQktMSwgIC8vIDUwCisJCQktMSwgIC8vIDUxCisJCQktMSwgIC8vIDUyCisJCQktMSwgIC8vIDUzCisJCQktMSwgIC8vIDU0CisJCQktMSwgIC8vIDU1CisJCQktMSwgIC8vIDU2CisJCQktMSwgIC8vIDU3CisJCQktMSwgIC8vIDU4CisJCQktMSwgIC8vIDU5CisJCQktMSwgIC8vIDYwCisJCQktMSwgIC8vIDYxCisJCQktMSwgIC8vIDYyCisJCQktMSwgIC8vIDYzCisJCQkxLCAgIC8vIFRFWENPT1JEID0gNjQKKwkJCTEsICAgLy8gVEVYS0lMTAorCQkJMSwgICAvLyBURVgKKwkJCTIsICAgLy8gVEVYQkVNCisJCQkyLCAgIC8vIFRFWEJFTUwKKwkJCTIsICAgLy8gVEVYUkVHMkFSCisJCQkyLCAgIC8vIFRFWFJFRzJHQgorCQkJMiwgICAvLyBURVhNM3gyUEFECisJCQkyLCAgIC8vIFRFWE0zeDJURVgKKwkJCTIsICAgLy8gVEVYTTN4M1BBRAorCQkJMiwgICAvLyBURVhNM3gzVEVYCisJCQktMSwgIC8vIFJFU0VSVkVEMAorCQkJMywgICAvLyBURVhNM3gzU1BFQworCQkJMiwgICAvLyBURVhNM3gzVlNQRUMKKwkJCTIsICAgLy8gRVhQUAorCQkJMiwgICAvLyBMT0dQCisJCQk0LCAgIC8vIENORAorCQkJNSwgICAvLyBERUYKKwkJCTIsICAgLy8gVEVYUkVHMlJHQgorCQkJMiwgICAvLyBURVhEUDNURVgKKwkJCTIsICAgLy8gVEVYTTN4MkRFUFRICisJCQkyLCAgIC8vIFRFWERQMworCQkJMiwgICAvLyBURVhNM3gzCisJCQkxLCAgIC8vIFRFWERFUFRICisJCQk0LCAgIC8vIENNUAorCQkJMywgICAvLyBCRU0KKwkJCTQsICAgLy8gRFAyQURECisJCQkyLCAgIC8vIERTWAorCQkJMiwgICAvLyBEU1kKKwkJCTUsICAgLy8gVEVYTERECisJCQkzLCAgIC8vIFNFVFAKKwkJCTMsICAgLy8gVEVYTERMCisJCQkyLCAgIC8vIEJSRUFLUAorCQkJLTEsICAvLyA5NworCQkJLTEsICAvLyA5OAorCQkJLTEsICAvLyA5OQorCQkJLTEsICAvLyAxMDAKKwkJCS0xLCAgLy8gMTAxCisJCQktMSwgIC8vIDEwMgorCQkJLTEsICAvLyAxMDMKKwkJCS0xLCAgLy8gMTA0CisJCQktMSwgIC8vIDEwNQorCQkJLTEsICAvLyAxMDYKKwkJCS0xLCAgLy8gMTA3CisJCQktMSwgIC8vIDEwOAorCQkJLTEsICAvLyAxMDkKKwkJCS0xLCAgLy8gMTEwCisJCQktMSwgIC8vIDExMQorCQkJLTEsICAvLyAxMTIKKwkJfTsKKworCQlpbnQgbGVuZ3RoID0gMDsKKworCQlpZigob3Bjb2RlICYgMHgwMDAwRkZGRikgPT0gU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfQ09NTUVOVCkKKwkJeworCQkJcmV0dXJuIChvcGNvZGUgJiAweDdGRkYwMDAwKSA+PiAxNjsKKwkJfQorCisJCWlmKG9wY29kZSAhPSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9QU18xXzAgJiYKKwkJICAgb3Bjb2RlICE9IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1BTXzFfMSAmJgorCQkgICBvcGNvZGUgIT0gU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfUFNfMV8yICYmCisJCSAgIG9wY29kZSAhPSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9QU18xXzMgJiYKKwkJICAgb3Bjb2RlICE9IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1BTXzFfNCAmJgorCQkgICBvcGNvZGUgIT0gU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfUFNfMl8wICYmCisJCSAgIG9wY29kZSAhPSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9QU18yX3ggJiYKKwkJICAgb3Bjb2RlICE9IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1BTXzNfMCAmJgorCQkgICBvcGNvZGUgIT0gU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVlNfMV8wICYmCisJCSAgIG9wY29kZSAhPSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9WU18xXzEgJiYKKwkJICAgb3Bjb2RlICE9IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1ZTXzJfMCAmJgorCQkgICBvcGNvZGUgIT0gU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVlNfMl94ICYmCisJCSAgIG9wY29kZSAhPSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9WU18yX3N3ICYmCisJCSAgIG9wY29kZSAhPSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9WU18zXzAgJiYKKwkJICAgb3Bjb2RlICE9IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1ZTXzNfc3cgJiYKKwkJICAgb3Bjb2RlICE9IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1BIQVNFICYmCisJCSAgIG9wY29kZSAhPSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9FTkQpCisJCXsKKwkJCWlmKHZlcnNpb24gPj0gMHgwMjAwKQorCQkJeworCQkJCWxlbmd0aCA9IChvcGNvZGUgJiAweDBGMDAwMDAwKSA+PiAyNDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlsZW5ndGggPSBzaXplW29wY29kZSAmIDB4MDAwMEZGRkZdOworCQkJfQorCQl9CisKKwkJaWYobGVuZ3RoIDwgMCkKKwkJeworCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWlmKHZlcnNpb24gPT0gMHgwMTA0KQorCQl7CisJCQlzd2l0Y2gob3Bjb2RlICYgMHgwMDAwRkZGRikKKwkJCXsKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYOgorCQkJCWxlbmd0aCArPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhDT09SRDoKKwkJCQlsZW5ndGggKz0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbGVuZ3RoOworCX0KKworCWJvb2wgU2hhZGVyOjptYXNrQ29udGFpbnNDb21wb25lbnQoaW50IG1hc2ssIGludCBjb21wb25lbnQpCisJeworCQlyZXR1cm4gKG1hc2sgJiAoMSA8PCBjb21wb25lbnQpKSAhPSAwOworCX0KKworCWJvb2wgU2hhZGVyOjpzd2l6emxlQ29udGFpbnNDb21wb25lbnQoaW50IHN3aXp6bGUsIGludCBjb21wb25lbnQpCisJeworCQlpZigoc3dpenpsZSAmIDB4MDMpID4+IDAgPT0gY29tcG9uZW50KSByZXR1cm4gdHJ1ZTsKKwkJaWYoKHN3aXp6bGUgJiAweDBDKSA+PiAyID09IGNvbXBvbmVudCkgcmV0dXJuIHRydWU7CisJCWlmKChzd2l6emxlICYgMHgzMCkgPj4gNCA9PSBjb21wb25lbnQpIHJldHVybiB0cnVlOworCQlpZigoc3dpenpsZSAmIDB4QzApID4+IDYgPT0gY29tcG9uZW50KSByZXR1cm4gdHJ1ZTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBTaGFkZXI6OnN3aXp6bGVDb250YWluc0NvbXBvbmVudE1hc2tlZChpbnQgc3dpenpsZSwgaW50IGNvbXBvbmVudCwgaW50IG1hc2spCisJeworCQlpZihtYXNrICYgMHgxKSBpZigoc3dpenpsZSAmIDB4MDMpID4+IDAgPT0gY29tcG9uZW50KSByZXR1cm4gdHJ1ZTsKKwkJaWYobWFzayAmIDB4MikgaWYoKHN3aXp6bGUgJiAweDBDKSA+PiAyID09IGNvbXBvbmVudCkgcmV0dXJuIHRydWU7CisJCWlmKG1hc2sgJiAweDQpIGlmKChzd2l6emxlICYgMHgzMCkgPj4gNCA9PSBjb21wb25lbnQpIHJldHVybiB0cnVlOworCQlpZihtYXNrICYgMHg4KSBpZigoc3dpenpsZSAmIDB4QzApID4+IDYgPT0gY29tcG9uZW50KSByZXR1cm4gdHJ1ZTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBTaGFkZXI6OmNvbnRhaW5zRHluYW1pY0JyYW5jaGluZygpIGNvbnN0CisJeworCQlyZXR1cm4gZHluYW1pY0JyYW5jaGluZzsKKwl9CisKKwlib29sIFNoYWRlcjo6dXNlc1NhbXBsZXIoaW50IGluZGV4KSBjb25zdAorCXsKKwkJcmV0dXJuIChzYW1wbGVyICYgKDEgPDwgaW5kZXgpKSAhPSAwOworCX0KKworCWludDY0X3QgU2hhZGVyOjpnZXRIYXNoKCkgY29uc3QKKwl7CisJCXJldHVybiBoYXNoOworCX0KKworCWludCBTaGFkZXI6OmdldExlbmd0aCgpIGNvbnN0CisJeworCQlyZXR1cm4gbGVuZ3RoOworCX0KKworCVNoYWRlcjo6U2hhZGVyVHlwZSBTaGFkZXI6OmdldFNoYWRlclR5cGUoKSBjb25zdAorCXsKKwkJcmV0dXJuIHNoYWRlclR5cGU7CisJfQorCisJdW5zaWduZWQgc2hvcnQgU2hhZGVyOjpnZXRWZXJzaW9uKCkgY29uc3QKKwl7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCXZvaWQgU2hhZGVyOjpwcmludChjb25zdCBjaGFyICpmaWxlTmFtZSwgLi4uKSBjb25zdAorCXsKKwkJY2hhciBmdWxsTmFtZVsxMDI0ICsgMV07CisKKwkJdmFfbGlzdCB2YXJhcmc7CisJCXZhX3N0YXJ0KHZhcmFyZywgZmlsZU5hbWUpOworCQl2c25wcmludGYoZnVsbE5hbWUsIDEwMjQsIGZpbGVOYW1lLCB2YXJhcmcpOworCQl2YV9lbmQodmFyYXJnKTsKKworCQlzdGQ6Om9mc3RyZWFtIGZpbGUoZnVsbE5hbWUsIHN0ZDo6b2ZzdHJlYW06Om91dCB8IHN0ZDo6b2ZzdHJlYW06OmFwcCk7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQl7CisJCQlmaWxlIDw8IGluc3RydWN0aW9uW2ldLT5zdHJpbmcoc2hhZGVyVHlwZSwgdmVyc2lvbikgPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJdm9pZCBTaGFkZXI6OnByaW50SW5zdHJ1Y3Rpb24oaW50IGluZGV4LCBjb25zdCBjaGFyICpmaWxlTmFtZSkgY29uc3QKKwl7CisJCXN0ZDo6b2ZzdHJlYW0gZmlsZShmaWxlTmFtZSwgc3RkOjpvZnN0cmVhbTo6b3V0IHwgc3RkOjpvZnN0cmVhbTo6YXBwKTsKKworCQlmaWxlIDw8IGluc3RydWN0aW9uW2luZGV4XS0+c3RyaW5nKHNoYWRlclR5cGUsIHZlcnNpb24pIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwljb25zdCBTaGFkZXJJbnN0cnVjdGlvbiAqU2hhZGVyOjpnZXRJbnN0cnVjdGlvbihpbnQgaSkgY29uc3QKKwl7CisJCWlmKGkgPCAwIHx8IGkgPj0gbGVuZ3RoKQorCQl7CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJcmV0dXJuIGluc3RydWN0aW9uW2ldOworCX0KKworCXZvaWQgU2hhZGVyOjphbmFseXplRGlydHlDb25zdGFudHMoKQorCXsKKwkJZGlydHlDb25zdGFudHNGID0gMDsKKwkJZGlydHlDb25zdGFudHNJID0gMDsKKwkJZGlydHlDb25zdGFudHNCID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXsKKwkJCXN3aXRjaChpbnN0cnVjdGlvbltpXS0+b3BlcmF0aW9uLm9wY29kZSkKKwkJCXsKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfREVGOgorCQkJCWlmKGluc3RydWN0aW9uW2ldLT5kZXN0aW5hdGlvblBhcmFtZXRlci5pbmRleCArIDEgPiBkaXJ0eUNvbnN0YW50c0YpCisJCQkJeworCQkJCQlkaXJ0eUNvbnN0YW50c0YgPSBpbnN0cnVjdGlvbltpXS0+ZGVzdGluYXRpb25QYXJhbWV0ZXIuaW5kZXggKyAxOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfREVGSToKKwkJCQlpZihpbnN0cnVjdGlvbltpXS0+ZGVzdGluYXRpb25QYXJhbWV0ZXIuaW5kZXggKyAxID4gZGlydHlDb25zdGFudHNJKQorCQkJCXsKKwkJCQkJZGlydHlDb25zdGFudHNJID0gaW5zdHJ1Y3Rpb25baV0tPmRlc3RpbmF0aW9uUGFyYW1ldGVyLmluZGV4ICsgMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX0RFRkI6CisJCQkJaWYoaW5zdHJ1Y3Rpb25baV0tPmRlc3RpbmF0aW9uUGFyYW1ldGVyLmluZGV4ICsgMSA+IGRpcnR5Q29uc3RhbnRzQikKKwkJCQl7CisJCQkJCWRpcnR5Q29uc3RhbnRzQiA9IGluc3RydWN0aW9uW2ldLT5kZXN0aW5hdGlvblBhcmFtZXRlci5pbmRleCArIDE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJdm9pZCBTaGFkZXI6OmFuYWx5emVEeW5hbWljQnJhbmNoaW5nKCkKKwl7CisJCWR5bmFtaWNCcmFuY2hpbmcgPSBmYWxzZTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXsKKwkJCXN3aXRjaChpbnN0cnVjdGlvbltpXS0+Z2V0T3Bjb2RlKCkpCisJCQl7CisJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX0NBTExOWjoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfSUY6CisJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX0lGQzoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfQlJFQUs6CisJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX0JSRUFLQzoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfU0VUUDoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfQlJFQUtQOgorCQkJCWlmKGluc3RydWN0aW9uW2ldLT5zb3VyY2VQYXJhbWV0ZXJbMF0udHlwZSAhPSBTaGFkZXJQYXJhbWV0ZXI6OlBBUkFNRVRFUl9DT05TVEJPT0wpCisJCQkJeworCQkJCQlkeW5hbWljQnJhbmNoaW5nID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJdm9pZCBTaGFkZXI6OmFuYWx5emVTYW1wbGVycygpCisJeworCQlzYW1wbGVyID0gMDsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXsKKwkJCXN3aXRjaChpbnN0cnVjdGlvbltpXS0+Z2V0T3Bjb2RlKCkpCisJCQl7CisJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWDoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYQkVNOgorCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhCRU1MOgorCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhSRUcyQVI6CisJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWFJFRzJHQjoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYTTNYMlRFWDoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYTTNYM1RFWDoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYTTNYM1NQRUM6CisJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDNWU1BFQzoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYUkVHMlJHQjoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYRFAzVEVYOgorCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhNM1gyREVQVEg6CisJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWExERDoKKwkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYTERMOgorCQkJCXsKKwkJCQkJU2hhZGVyUGFyYW1ldGVyICZkc3QgPSBpbnN0cnVjdGlvbltpXS0+ZGVzdGluYXRpb25QYXJhbWV0ZXI7CisJCQkJCVNoYWRlclBhcmFtZXRlciAmc3JjMSA9IGluc3RydWN0aW9uW2ldLT5zb3VyY2VQYXJhbWV0ZXJbMV07CisKKwkJCQkJaWYobWFqb3JWZXJzaW9uID49IDIpCisJCQkJCXsKKwkJCQkJCUFTU0VSVChzcmMxLnR5cGUgPT0gU2hhZGVyUGFyYW1ldGVyOjpQQVJBTUVURVJfU0FNUExFUik7CisJCQkJCQlzYW1wbGVyIHw9IDEgPDwgc3JjMS5pbmRleDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXNhbXBsZXIgfD0gMSA8PCBkc3QuaW5kZXg7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIFNoYWRlcjo6cmVtb3ZlQ29tbWVudHModW5zaWduZWQgbG9uZyAqc2hhZGVyVG9rZW4sIGludCB0b2tlbkNvdW50KQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IHRva2VuQ291bnQ7ICkKKwkJeworCQkJaW50IGluc3RydWN0aW9uU2l6ZSA9IHN3OjpTaGFkZXI6OnNpemUoc2hhZGVyVG9rZW5baV0sICh1bnNpZ25lZCBzaG9ydCkoc2hhZGVyVG9rZW5bMF0gJiAweEZGRkYpKSArIDE7CisKKwkJCWlmKChzaGFkZXJUb2tlbltpXSAmIDB4MDAwMEZGRkYpID09IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX0NPTU1FTlQpCisJCQl7CisJCQkJZm9yKGludCBqID0gMDsgaiA8IGluc3RydWN0aW9uU2l6ZTsgaisrKQorCQkJCXsKKwkJCQkJc2hhZGVyVG9rZW5baSArIGpdID0gU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfTk9QOworCQkJCX0KKwkJCX0KKworCQkJaSArPSBpbnN0cnVjdGlvblNpemU7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvU2hhZGVyL1NoYWRlci5ocHAgYi9zcmMvU2hhZGVyL1NoYWRlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkNmZlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvU2hhZGVyLmhwcApAQCAtMCwwICsxLDQ1OSBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaWZuZGVmIHN3X1NoYWRlcl9ocHAKKyNkZWZpbmUgc3dfU2hhZGVyX2hwcAorCisjaW5jbHVkZSAiQ29tbW9uL1R5cGVzLmhwcCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHN3Cit7CisJY2xhc3MgU2hhZGVyCisJeworCXB1YmxpYzoKKwkJZW51bSBTaGFkZXJUeXBlCisJCXsKKwkJCVNIQURFUl9QSVhFTCA9IDB4RkZGRiwKKwkJCVNIQURFUl9WRVJURVggPSAweEZGRkUsCisJCQlTSEFERVJfR0VPTUVUUlkgPSAweEZGRkQKKwkJfTsKKworCQljbGFzcyBJbnN0cnVjdGlvbgorCQl7CisJCQlmcmllbmQgU2hhZGVyOworCisJCXB1YmxpYzoKKwkJCUluc3RydWN0aW9uKCk7CisJCQlJbnN0cnVjdGlvbihjb25zdCB1bnNpZ25lZCBsb25nICp0b2tlbiwgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgbWFqb3JWZXJzaW9uKTsKKworCQkJdmlydHVhbCB+SW5zdHJ1Y3Rpb24oKTsKKworCQkJc3RydWN0IE9wZXJhdGlvbgorCQkJeworCQkJCWVudW0gT3Bjb2RlCisJCQkJeworCQkJCQkvLyBFeHRyYWN0ZWQgZnJvbSBkM2Q5dHlwZXMuaAorCQkJCQlPUENPREVfTk9QID0gMCwKKwkJCQkJT1BDT0RFX01PViwKKwkJCQkJT1BDT0RFX0FERCwKKwkJCQkJT1BDT0RFX1NVQiwKKwkJCQkJT1BDT0RFX01BRCwKKwkJCQkJT1BDT0RFX01VTCwKKwkJCQkJT1BDT0RFX1JDUCwKKwkJCQkJT1BDT0RFX1JTUSwKKwkJCQkJT1BDT0RFX0RQMywKKwkJCQkJT1BDT0RFX0RQNCwKKwkJCQkJT1BDT0RFX01JTiwKKwkJCQkJT1BDT0RFX01BWCwKKwkJCQkJT1BDT0RFX1NMVCwKKwkJCQkJT1BDT0RFX1NHRSwKKwkJCQkJT1BDT0RFX0VYUCwKKwkJCQkJT1BDT0RFX0xPRywKKwkJCQkJT1BDT0RFX0xJVCwKKwkJCQkJT1BDT0RFX0RTVCwKKwkJCQkJT1BDT0RFX0xSUCwKKwkJCQkJT1BDT0RFX0ZSQywKKwkJCQkJT1BDT0RFX000WDQsCisJCQkJCU9QQ09ERV9NNFgzLAorCQkJCQlPUENPREVfTTNYNCwKKwkJCQkJT1BDT0RFX00zWDMsCisJCQkJCU9QQ09ERV9NM1gyLAorCQkJCQlPUENPREVfQ0FMTCwKKwkJCQkJT1BDT0RFX0NBTExOWiwKKwkJCQkJT1BDT0RFX0xPT1AsCisJCQkJCU9QQ09ERV9SRVQsCisJCQkJCU9QQ09ERV9FTkRMT09QLAorCQkJCQlPUENPREVfTEFCRUwsCisJCQkJCU9QQ09ERV9EQ0wsCisJCQkJCU9QQ09ERV9QT1csCisJCQkJCU9QQ09ERV9DUlMsCisJCQkJCU9QQ09ERV9TR04sCisJCQkJCU9QQ09ERV9BQlMsCisJCQkJCU9QQ09ERV9OUk0sCisJCQkJCU9QQ09ERV9TSU5DT1MsCisJCQkJCU9QQ09ERV9SRVAsCisJCQkJCU9QQ09ERV9FTkRSRVAsCisJCQkJCU9QQ09ERV9JRiwKKwkJCQkJT1BDT0RFX0lGQywKKwkJCQkJT1BDT0RFX0VMU0UsCisJCQkJCU9QQ09ERV9FTkRJRiwKKwkJCQkJT1BDT0RFX0JSRUFLLAorCQkJCQlPUENPREVfQlJFQUtDLAorCQkJCQlPUENPREVfTU9WQSwKKwkJCQkJT1BDT0RFX0RFRkIsCisJCQkJCU9QQ09ERV9ERUZJLAorCisJCQkJCU9QQ09ERV9URVhDT09SRCA9IDY0LAorCQkJCQlPUENPREVfVEVYS0lMTCwKKwkJCQkJT1BDT0RFX1RFWCwKKwkJCQkJT1BDT0RFX1RFWEJFTSwKKwkJCQkJT1BDT0RFX1RFWEJFTUwsCisJCQkJCU9QQ09ERV9URVhSRUcyQVIsCisJCQkJCU9QQ09ERV9URVhSRUcyR0IsCisJCQkJCU9QQ09ERV9URVhNM1gyUEFELAorCQkJCQlPUENPREVfVEVYTTNYMlRFWCwKKwkJCQkJT1BDT0RFX1RFWE0zWDNQQUQsCisJCQkJCU9QQ09ERV9URVhNM1gzVEVYLAorCQkJCQlPUENPREVfUkVTRVJWRUQwLAorCQkJCQlPUENPREVfVEVYTTNYM1NQRUMsCisJCQkJCU9QQ09ERV9URVhNM1gzVlNQRUMsCisJCQkJCU9QQ09ERV9FWFBQLAorCQkJCQlPUENPREVfTE9HUCwKKwkJCQkJT1BDT0RFX0NORCwKKwkJCQkJT1BDT0RFX0RFRiwKKwkJCQkJT1BDT0RFX1RFWFJFRzJSR0IsCisJCQkJCU9QQ09ERV9URVhEUDNURVgsCisJCQkJCU9QQ09ERV9URVhNM1gyREVQVEgsCisJCQkJCU9QQ09ERV9URVhEUDMsCisJCQkJCU9QQ09ERV9URVhNM1gzLAorCQkJCQlPUENPREVfVEVYREVQVEgsCisJCQkJCU9QQ09ERV9DTVAsCisJCQkJCU9QQ09ERV9CRU0sCisJCQkJCU9QQ09ERV9EUDJBREQsCisJCQkJCU9QQ09ERV9EU1gsCisJCQkJCU9QQ09ERV9EU1ksCisJCQkJCU9QQ09ERV9URVhMREQsCisJCQkJCU9QQ09ERV9TRVRQLAorCQkJCQlPUENPREVfVEVYTERMLAorCQkJCQlPUENPREVfQlJFQUtQLAorCisJCQkJCU9QQ09ERV9QSEFTRSA9IDB4RkZGRCwKKwkJCQkJT1BDT0RFX0NPTU1FTlQgPSAweEZGRkUsCisJCQkJCU9QQ09ERV9FTkQgPSAweEZGRkYsCisKKwkJCQkJT1BDT0RFX1BTXzFfMCA9IDB4RkZGRjAxMDAsCisJCQkJCU9QQ09ERV9QU18xXzEgPSAweEZGRkYwMTAxLAorCQkJCQlPUENPREVfUFNfMV8yID0gMHhGRkZGMDEwMiwKKwkJCQkJT1BDT0RFX1BTXzFfMyA9IDB4RkZGRjAxMDMsCisJCQkJCU9QQ09ERV9QU18xXzQgPSAweEZGRkYwMTA0LAorCQkJCQlPUENPREVfUFNfMl8wID0gMHhGRkZGMDIwMCwKKwkJCQkJT1BDT0RFX1BTXzJfeCA9IDB4RkZGRjAyMDEsCisJCQkJCU9QQ09ERV9QU18zXzAgPSAweEZGRkYwMzAwLAorCQkJCQkKKwkJCQkJT1BDT0RFX1ZTXzFfMCA9IDB4RkZGRTAxMDAsCisJCQkJCU9QQ09ERV9WU18xXzEgPSAweEZGRkUwMTAxLAorCQkJCQlPUENPREVfVlNfMl8wID0gMHhGRkZFMDIwMCwKKwkJCQkJT1BDT0RFX1ZTXzJfeCA9IDB4RkZGRTAyMDEsCisJCQkJCU9QQ09ERV9WU18yX3N3ID0gMHhGRkZFMDJGRiwKKwkJCQkJT1BDT0RFX1ZTXzNfMCA9IDB4RkZGRTAzMDAsCisJCQkJCU9QQ09ERV9WU18zX3N3ID0gMHhGRkZFMDNGRiwKKwkJCQl9OworCisJCQkJZW51bSBDb250cm9sCisJCQkJeworCQkJCQlDT05UUk9MX1JFU0VSVkVEMCwKKwkJCQkJQ09OVFJPTF9HVCwKKwkJCQkJQ09OVFJPTF9FUSwKKwkJCQkJQ09OVFJPTF9HRSwKKwkJCQkJQ09OVFJPTF9MVCwKKwkJCQkJQ09OVFJPTF9ORSwKKwkJCQkJQ09OVFJPTF9MRSwKKwkJCQkJQ09OVFJPTF9SRVNFUlZFRDEKKwkJCQl9OworCisJCQkJZW51bSBTYW1wbGVyVHlwZQorCQkJCXsKKwkJCQkJU0FNUExFUl9VTktOT1dOLAorCQkJCQlTQU1QTEVSXzFELAorCQkJCQlTQU1QTEVSXzJELAorCQkJCQlTQU1QTEVSX0NVQkUsCisJCQkJCVNBTVBMRVJfVk9MVU1FCisJCQkJfTsKKworCQkJCWVudW0gVXNhZ2UgICAvLyBGb3IgdmVydGV4IGlucHV0L291dHB1dCBkZWNsYXJhdGlvbnMKKwkJCQl7CisJCQkJCVVTQUdFX1BPU0lUSU9OID0gMCwKKwkJCQkJVVNBR0VfQkxFTkRXRUlHSFQgPSAxLAorCQkJCQlVU0FHRV9CTEVORElORElDRVMgPSAyLAorCQkJCQlVU0FHRV9OT1JNQUwgPSAzLAorCQkJCQlVU0FHRV9QU0laRSA9IDQsCisJCQkJCVVTQUdFX1RFWENPT1JEID0gNSwKKwkJCQkJVVNBR0VfVEFOR0VOVCA9IDYsCisJCQkJCVVTQUdFX0JJTk9STUFMID0gNywKKwkJCQkJVVNBR0VfVEVTU0ZBQ1RPUiA9IDgsCisJCQkJCVVTQUdFX1BPU0lUSU9OVCA9IDksCisJCQkJCVVTQUdFX0NPTE9SID0gMTAsCisJCQkJCVVTQUdFX0ZPRyA9IDExLAorCQkJCQlVU0FHRV9ERVBUSCA9IDEyLAorCQkJCQlVU0FHRV9TQU1QTEUgPSAxMworCQkJCX07CisKKwkJCQlPcGVyYXRpb24oKSA6IG9wY29kZShPUENPREVfTk9QKSwgY29udHJvbChDT05UUk9MX1JFU0VSVkVEMCksIHByZWRpY2F0ZShmYWxzZSksIHByZWRpY2F0ZU5vdChmYWxzZSksIHByZWRpY2F0ZVN3aXp6bGUoMHhFNCksIGNvaXNzdWUoZmFsc2UpLCBzYW1wbGVyVHlwZShTQU1QTEVSX1VOS05PV04pLCB1c2FnZShVU0FHRV9QT1NJVElPTiksIHVzYWdlSW5kZXgoMCkKKwkJCQl7CisJCQkJfQorCisJCQkJc3RkOjpzdHJpbmcgc3RyaW5nKHVuc2lnbmVkIHNob3J0IHZlcnNpb24pIGNvbnN0OworCQkJCXN0ZDo6c3RyaW5nIGNvbnRyb2xTdHJpbmcoKSBjb25zdDsKKworCQkJCU9wY29kZSBvcGNvZGU7CisJCQkJCisJCQkJdW5pb24KKwkJCQl7CisJCQkJCUNvbnRyb2wgY29udHJvbDsKKwkJCQkJCisJCQkJCXN0cnVjdAorCQkJCQl7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHByb2plY3QgOiAxOworCQkJCQkJdW5zaWduZWQgY2hhciBiaWFzIDogMTsKKwkJCQkJfTsKKwkJCQl9OworCisJCQkJYm9vbCBwcmVkaWNhdGU7CisJCQkJYm9vbCBwcmVkaWNhdGVOb3Q7ICAgLy8gTmVnYXRpdmUgcHJlZGljYXRlCisJCQkJdW5zaWduZWQgY2hhciBwcmVkaWNhdGVTd2l6emxlOworCisJCQkJYm9vbCBjb2lzc3VlOworCQkJCVNhbXBsZXJUeXBlIHNhbXBsZXJUeXBlOworCQkJCVVzYWdlIHVzYWdlOworCQkJCXVuc2lnbmVkIGNoYXIgdXNhZ2VJbmRleDsKKwkJCX07CisKKwkJCXN0cnVjdCBQYXJhbWV0ZXIKKwkJCXsKKwkJCQllbnVtIFR5cGUKKwkJCQl7CisJCQkJCVBBUkFNRVRFUl9URU1QID0gMCwKKwkJCQkJUEFSQU1FVEVSX0lOUFVUID0gMSwKKwkJCQkJUEFSQU1FVEVSX0NPTlNUID0gMiwKKwkJCQkJUEFSQU1FVEVSX1RFWFRVUkUgPSAzLAorCQkJCQlQQVJBTUVURVJfQUREUiA9IDMsCisJCQkJCVBBUkFNRVRFUl9SQVNUT1VUID0gNCwKKwkJCQkJUEFSQU1FVEVSX0FUVFJPVVQgPSA1LAorCQkJCQlQQVJBTUVURVJfVEVYQ1JET1VUID0gNiwKKwkJCQkJUEFSQU1FVEVSX09VVFBVVCA9IDYsCisJCQkJCVBBUkFNRVRFUl9DT05TVElOVCA9IDcsCisJCQkJCVBBUkFNRVRFUl9DT0xPUk9VVCA9IDgsCisJCQkJCVBBUkFNRVRFUl9ERVBUSE9VVCA9IDksCisJCQkJCVBBUkFNRVRFUl9TQU1QTEVSID0gMTAsCisJCQkJCVBBUkFNRVRFUl9DT05TVDIgPSAxMSwKKwkJCQkJUEFSQU1FVEVSX0NPTlNUMyA9IDEyLAorCQkJCQlQQVJBTUVURVJfQ09OU1Q0ID0gMTMsCisJCQkJCVBBUkFNRVRFUl9DT05TVEJPT0wgPSAxNCwKKwkJCQkJUEFSQU1FVEVSX0xPT1AgPSAxNSwKKwkJCQkJUEFSQU1FVEVSX1RFTVBGTE9BVDE2ID0gMTYsCisJCQkJCVBBUkFNRVRFUl9NSVNDVFlQRSA9IDE3LAorCQkJCQlQQVJBTUVURVJfTEFCRUwgPSAxOCwKKwkJCQkJUEFSQU1FVEVSX1BSRURJQ0FURSA9IDE5LAorCisJCQkJCS8vIEludGVybmFsbHkgdXNlZAorCQkJCQlQQVJBTUVURVJfRkxPQVRMSVRFUkFMID0gMjAsCisJCQkJCVBBUkFNRVRFUl9CT09MTElURVJBTCA9IDIxLAorCQkJCQlQQVJBTUVURVJfSU5UTElURVJBTCA9IDIyLAorCisJCQkJCVBBUkFNRVRFUl9WT0lECisJCQkJfTsKKworCQkJCXVuaW9uCisJCQkJeworCQkJCQl1bnNpZ25lZCBpbnQgaW5kZXg7ICAgLy8gRm9yIHJlZ2lzdGVycworCQkJCQlmbG9hdCB2YWx1ZTsgICAgICAgICAgLy8gRm9yIGZsb2F0IGNvbnN0YW50cworCQkJCQlpbnQgaW50ZWdlcjsgICAgICAgICAgLy8gRm9yIGludGVnZXIgY29uc3RhbnRzCisJCQkJCWJvb2wgYm9vbGVhbjsgICAgICAgICAvLyBGb3IgYm9vbGVhbiBjb25zdGFudHMKKwkJCQl9OworCisJCQkJUGFyYW1ldGVyKCkgOiB0eXBlKFBBUkFNRVRFUl9WT0lEKSwgaW5kZXgoMCksIHJlbGF0aXZlKGZhbHNlKSwgcmVsYXRpdmVUeXBlKFBBUkFNRVRFUl9WT0lEKSwgcmVsYXRpdmVTd2l6emxlKDB4RTQpCisJCQkJeworCQkJCX0KKworCQkJCXN0ZDo6c3RyaW5nIHN0cmluZyhTaGFkZXJUeXBlIHNoYWRlclR5cGUsIHVuc2lnbmVkIHNob3J0IHZlcnNpb24pIGNvbnN0OworCQkJCXN0ZDo6c3RyaW5nIHR5cGVTdHJpbmcoU2hhZGVyVHlwZSBzaGFkZXJUeXBlLCB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uKSBjb25zdDsKKwkJCQlzdGQ6OnN0cmluZyByZWxhdGl2ZVN0cmluZygpIGNvbnN0OworCisJCQkJVHlwZSB0eXBlOworCQkJCWJvb2wgcmVsYXRpdmU7CisJCQkJVHlwZSByZWxhdGl2ZVR5cGU7CisJCQkJdW5zaWduZWQgY2hhciByZWxhdGl2ZVN3aXp6bGU7CisJCQl9OworCisJCQlzdHJ1Y3QgRGVzdGluYXRpb25QYXJhbWV0ZXIgOiBQYXJhbWV0ZXIKKwkJCXsKKwkJCQl1bmlvbgorCQkJCXsKKwkJCQkJdW5zaWduZWQgY2hhciBtYXNrOworCisJCQkJCXN0cnVjdAorCQkJCQl7CisJCQkJCQlib29sIHggOiAxOworCQkJCQkJYm9vbCB5IDogMTsKKwkJCQkJCWJvb2wgeiA6IDE7CisJCQkJCQlib29sIHcgOiAxOworCQkJCQl9OworCQkJCX07CisKKwkJCQlEZXN0aW5hdGlvblBhcmFtZXRlcigpIDogbWFzaygweEYpLCBzYXR1cmF0ZShmYWxzZSksIHBhcnRpYWxQcmVjaXNpb24oZmFsc2UpLCBjZW50cm9pZChmYWxzZSksIHNoaWZ0KDApCisJCQkJeworCQkJCX0KKworCQkJCXN0ZDo6c3RyaW5nIG1vZGlmaWVyU3RyaW5nKCkgY29uc3Q7CisJCQkJc3RkOjpzdHJpbmcgc2hpZnRTdHJpbmcoKSBjb25zdDsKKwkJCQlzdGQ6OnN0cmluZyBtYXNrU3RyaW5nKCkgY29uc3Q7CisKKwkJCQlib29sIHNhdHVyYXRlOworCQkJCWJvb2wgcGFydGlhbFByZWNpc2lvbjsKKwkJCQlib29sIGNlbnRyb2lkOworCQkJCXNpZ25lZCBjaGFyIHNoaWZ0OworCQkJfTsKKworCQkJc3RydWN0IFNvdXJjZVBhcmFtZXRlciA6IFBhcmFtZXRlcgorCQkJeworCQkJCWVudW0gTW9kaWZpZXIKKwkJCQl7CisJCQkJCU1PRElGSUVSX05PTkUsCisJCQkJCU1PRElGSUVSX05FR0FURSwKKwkJCQkJTU9ESUZJRVJfQklBUywKKwkJCQkJTU9ESUZJRVJfQklBU19ORUdBVEUsCisJCQkJCU1PRElGSUVSX1NJR04sCisJCQkJCU1PRElGSUVSX1NJR05fTkVHQVRFLAorCQkJCQlNT0RJRklFUl9DT01QTEVNRU5ULAorCQkJCQlNT0RJRklFUl9YMiwKKwkJCQkJTU9ESUZJRVJfWDJfTkVHQVRFLAorCQkJCQlNT0RJRklFUl9EWiwKKwkJCQkJTU9ESUZJRVJfRFcsCisJCQkJCU1PRElGSUVSX0FCUywKKwkJCQkJTU9ESUZJRVJfQUJTX05FR0FURSwKKwkJCQkJTU9ESUZJRVJfTk9UCisJCQkJfTsKKworCQkJCVNvdXJjZVBhcmFtZXRlcigpIDogc3dpenpsZSgweEU0KSwgbW9kaWZpZXIoTU9ESUZJRVJfTk9ORSkKKwkJCQl7CisJCQkJfQorCisJCQkJc3RkOjpzdHJpbmcgc3dpenpsZVN0cmluZygpIGNvbnN0OworCQkJCXN0ZDo6c3RyaW5nIHByZU1vZGlmaWVyU3RyaW5nKCkgY29uc3Q7CisJCQkJc3RkOjpzdHJpbmcgcG9zdE1vZGlmaWVyU3RyaW5nKCkgY29uc3Q7CisKKwkJCQl1bnNpZ25lZCBjaGFyIHN3aXp6bGU7CisJCQkJTW9kaWZpZXIgbW9kaWZpZXI7CisJCQl9OworCisJCQl2b2lkIHBhcnNlT3BlcmF0aW9uVG9rZW4odW5zaWduZWQgbG9uZyB0b2tlbiwgdW5zaWduZWQgY2hhciBtYWpvclZlcnNpb24pOworCQkJdm9pZCBwYXJzZURlY2xhcmF0aW9uVG9rZW4odW5zaWduZWQgbG9uZyB0b2tlbik7CisJCQl2b2lkIHBhcnNlRGVzdGluYXRpb25Ub2tlbihjb25zdCB1bnNpZ25lZCBsb25nICp0b2tlbiwgdW5zaWduZWQgY2hhciBtYWpvclZlcnNpb24pOworCQkJdm9pZCBwYXJzZVNvdXJjZVRva2VuKGludCBpLCBjb25zdCB1bnNpZ25lZCBsb25nICp0b2tlbiwgdW5zaWduZWQgY2hhciBtYWpvclZlcnNpb24pOworCisJCQlPcGVyYXRpb246Ok9wY29kZSBnZXRPcGNvZGUoKSBjb25zdDsKKwkJCWNvbnN0IERlc3RpbmF0aW9uUGFyYW1ldGVyICZnZXREZXN0aW5hdGlvblBhcmFtZXRlcigpIGNvbnN0OworCQkJY29uc3QgU291cmNlUGFyYW1ldGVyICZnZXRTb3VyY2VQYXJhbWV0ZXIoaW50IGkpIGNvbnN0OworCisJCQlib29sIGlzQ29pc3N1ZSgpIGNvbnN0OworCQkJYm9vbCBpc1Byb2plY3QoKSBjb25zdDsKKwkJCWJvb2wgaXNCaWFzKCkgY29uc3Q7CisJCQlib29sIGlzUHJlZGljYXRlKCkgY29uc3Q7CisJCQlib29sIGlzUHJlZGljYXRlTm90KCkgY29uc3Q7CisJCQl1bnNpZ25lZCBjaGFyIGdldFByZWRpY2F0ZVN3aXp6bGUoKSBjb25zdDsKKwkJCU9wZXJhdGlvbjo6Q29udHJvbCBnZXRDb250cm9sKCkgY29uc3Q7CisJCQlPcGVyYXRpb246OlVzYWdlIGdldFVzYWdlKCkgY29uc3Q7CisJCQl1bnNpZ25lZCBjaGFyIGdldFVzYWdlSW5kZXgoKSBjb25zdDsKKwkJCU9wZXJhdGlvbjo6U2FtcGxlclR5cGUgZ2V0U2FtcGxlclR5cGUoKSBjb25zdDsKKworCQkJc3RkOjpzdHJpbmcgc3RyaW5nKFNoYWRlclR5cGUgc2hhZGVyVHlwZSwgdW5zaWduZWQgc2hvcnQgdmVyc2lvbikgY29uc3Q7CisKKwkJcHJvdGVjdGVkOgorCQkJT3BlcmF0aW9uIG9wZXJhdGlvbjsKKwkJCURlc3RpbmF0aW9uUGFyYW1ldGVyIGRlc3RpbmF0aW9uUGFyYW1ldGVyOworCQkJU291cmNlUGFyYW1ldGVyIHNvdXJjZVBhcmFtZXRlcls0XTsKKworCQlwcml2YXRlOgorCQkJc3RhdGljIHN0ZDo6c3RyaW5nIHN3aXp6bGVTdHJpbmcoUGFyYW1ldGVyOjpUeXBlIHR5cGUsIHVuc2lnbmVkIGNoYXIgc3dpenpsZSk7CisJCX07CisKKwkJU2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuKTsKKworCQl+U2hhZGVyKCk7CisKKwkJdm9pZCBnZXRGdW5jdGlvbih2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgKnNpemUpOworCisJCWludDY0X3QgZ2V0SGFzaCgpIGNvbnN0OworCQlpbnQgZ2V0TGVuZ3RoKCkgY29uc3Q7CisJCVNoYWRlclR5cGUgZ2V0U2hhZGVyVHlwZSgpIGNvbnN0OworCQl1bnNpZ25lZCBzaG9ydCBnZXRWZXJzaW9uKCkgY29uc3Q7CisKKwkJY29uc3QgSW5zdHJ1Y3Rpb24gKmdldEluc3RydWN0aW9uKGludCBpKSBjb25zdDsKKwkJaW50IHNpemUodW5zaWduZWQgbG9uZyBvcGNvZGUpIGNvbnN0OworCQlzdGF0aWMgaW50IHNpemUodW5zaWduZWQgbG9uZyBvcGNvZGUsIHVuc2lnbmVkIHNob3J0IHZlcnNpb24pOworCisJCXZvaWQgcHJpbnQoY29uc3QgY2hhciAqZmlsZU5hbWUsIC4uLikgY29uc3Q7CisJCXZvaWQgcHJpbnRJbnN0cnVjdGlvbihpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmZpbGVOYW1lKSBjb25zdDsKKworCQlzdGF0aWMgYm9vbCBtYXNrQ29udGFpbnNDb21wb25lbnQoaW50IG1hc2ssIGludCBjb21wb25lbnQpOworCQlzdGF0aWMgYm9vbCBzd2l6emxlQ29udGFpbnNDb21wb25lbnQoaW50IHN3aXp6bGUsIGludCBjb21wb25lbnQpOworCQlzdGF0aWMgYm9vbCBzd2l6emxlQ29udGFpbnNDb21wb25lbnRNYXNrZWQoaW50IHN3aXp6bGUsIGludCBjb21wb25lbnQsIGludCBtYXNrKTsKKworCQlib29sIGNvbnRhaW5zRHluYW1pY0JyYW5jaGluZygpIGNvbnN0OworCQlib29sIHVzZXNTYW1wbGVyKGludCBpKSBjb25zdDsKKworCQlzdHJ1Y3QgU2VtYW50aWMKKwkJeworCQkJU2VtYW50aWModW5zaWduZWQgY2hhciB1c2FnZSA9IDB4RkYsIHVuc2lnbmVkIGNoYXIgaW5kZXggPSAweEZGKSA6IHVzYWdlKHVzYWdlKSwgaW5kZXgoaW5kZXgpLCBjZW50cm9pZChmYWxzZSkKKwkJCXsKKwkJCX0KKworCQkJYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlbWFudGljICZzZW1hbnRpYykgY29uc3QKKwkJCXsKKwkJCQlyZXR1cm4gdXNhZ2UgPT0gc2VtYW50aWMudXNhZ2UgJiYgaW5kZXggPT0gc2VtYW50aWMuaW5kZXg7CisJCQl9CisKKwkJCWJvb2wgYWN0aXZlKCkgY29uc3QKKwkJCXsKKwkJCQlyZXR1cm4gdXNhZ2UgIT0gMHhGRjsKKwkJCX0KKworCQkJdW5zaWduZWQgY2hhciB1c2FnZTsKKwkJCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisJCQlib29sIGNlbnRyb2lkOworCQl9OworCisJCXVuc2lnbmVkIGludCBkaXJ0eUNvbnN0YW50c0Y7ICAgLy8gRklYTUU6IFByaXZhdGUKKwkJdW5zaWduZWQgaW50IGRpcnR5Q29uc3RhbnRzSTsgICAvLyBGSVhNRTogUHJpdmF0ZQorCQl1bnNpZ25lZCBpbnQgZGlydHlDb25zdGFudHNCOyAgIC8vIEZJWE1FOiBQcml2YXRlCisKKwlwcm90ZWN0ZWQ6CisJCXZvaWQgYW5hbHl6ZURpcnR5Q29uc3RhbnRzKCk7CisJCXZvaWQgYW5hbHl6ZUR5bmFtaWNCcmFuY2hpbmcoKTsKKwkJdm9pZCBhbmFseXplU2FtcGxlcnMoKTsKKworCQlTaGFkZXJUeXBlIHNoYWRlclR5cGU7CisKKwkJdW5pb24KKwkJeworCQkJdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKKworCQkJc3RydWN0CisJCQl7CisJCQkJdW5zaWduZWQgY2hhciBtaW5vclZlcnNpb247CisJCQkJdW5zaWduZWQgY2hhciBtYWpvclZlcnNpb247CisJCQl9OworCQl9OworCisJCWludCBsZW5ndGg7CisJCUluc3RydWN0aW9uICoqaW5zdHJ1Y3Rpb247CisKKwlwcml2YXRlOgorCQlzdGF0aWMgdm9pZCByZW1vdmVDb21tZW50cyh1bnNpZ25lZCBsb25nICpzaGFkZXJUb2tlbiwgaW50IHRva2VuQ291bnQpOworCisJCWludDY0X3QgaGFzaDsKKworCQlib29sIGR5bmFtaWNCcmFuY2hpbmc7CisJCXVuc2lnbmVkIHNob3J0IHNhbXBsZXI7CisKKwkJdW5zaWduZWQgbG9uZyAqc2hhZGVyVG9rZW47CisJCWludCB0b2tlbkNvdW50OworCX07CisKKwl0eXBlZGVmIFNoYWRlcjo6SW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbiBTaGFkZXJPcGVyYXRpb247CisJdHlwZWRlZiBTaGFkZXI6Okluc3RydWN0aW9uIFNoYWRlckluc3RydWN0aW9uOworCXR5cGVkZWYgU2hhZGVyOjpJbnN0cnVjdGlvbjo6UGFyYW1ldGVyIFNoYWRlclBhcmFtZXRlcjsKKwl0eXBlZGVmIFNoYWRlcjo6SW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T3Bjb2RlIFNoYWRlck9wY29kZTsKK30KKworI2VuZGlmICAgLy8gc3dfU2hhZGVyX2hwcApkaWZmIC0tZ2l0IGEvc3JjL1NoYWRlci9TaGFkZXJDb3JlLmNwcCBiL3NyYy9TaGFkZXIvU2hhZGVyQ29yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmYWNhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvU2hhZGVyQ29yZS5jcHAKQEAgLTAsMCArMSwzOTYgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2luY2x1ZGUgIlNoYWRlckNvcmUuaHBwIgorCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwl2b2lkIFNoYWRlckNvcmU6Om1vdihDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYywgYm9vbCBmbG9vclRvSW50ZWdlcikKKwl7CisJCWlmKGZsb29yVG9JbnRlZ2VyKQorCQl7CisJCQlkc3QueCA9IEZsb29yKHNyYy54KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRzdCA9IHNyYzsKKwkJfQorCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6YWRkKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSkKKwl7CisJCWRzdC54ID0gc3JjMC54ICsgc3JjMS54OworCQlkc3QueSA9IHNyYzAueSArIHNyYzEueTsKKwkJZHN0LnogPSBzcmMwLnogKyBzcmMxLno7CisJCWRzdC53ID0gc3JjMC53ICsgc3JjMS53OworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6c3ViKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSkKKwl7CisJCWRzdC54ID0gc3JjMC54IC0gc3JjMS54OworCQlkc3QueSA9IHNyYzAueSAtIHNyYzEueTsKKwkJZHN0LnogPSBzcmMwLnogLSBzcmMxLno7CisJCWRzdC53ID0gc3JjMC53IC0gc3JjMS53OworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6bWFkKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSwgQ29sb3I0ZiAmc3JjMikKKwl7CisJCWRzdC54ID0gc3JjMC54ICogc3JjMS54ICsgc3JjMi54OworCQlkc3QueSA9IHNyYzAueSAqIHNyYzEueSArIHNyYzIueTsKKwkJZHN0LnogPSBzcmMwLnogKiBzcmMxLnogKyBzcmMyLno7CisJCWRzdC53ID0gc3JjMC53ICogc3JjMS53ICsgc3JjMi53OworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6bXVsKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSkKKwl7CisJCWRzdC54ID0gc3JjMC54ICogc3JjMS54OworCQlkc3QueSA9IHNyYzAueSAqIHNyYzEueTsKKwkJZHN0LnogPSBzcmMwLnogKiBzcmMxLno7CisJCWRzdC53ID0gc3JjMC53ICogc3JjMS53OworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6cmNwKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjLCBib29sIHBwKQorCXsKKwkJRmxvYXQ0IHJjcCA9IHJlY2lwcm9jYWwoc3JjLngsIHBwLCB0cnVlKTsKKworCQlkc3QueCA9IHJjcDsKKwkJZHN0LnkgPSByY3A7CisJCWRzdC56ID0gcmNwOworCQlkc3QudyA9IHJjcDsKKwl9CisKKwl2b2lkIFNoYWRlckNvcmU6OnJzcShDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYywgYm9vbCBwcCkKKwl7CisJCUZsb2F0NCByc3EgPSByZWNpcHJvY2FsU3F1YXJlUm9vdChzcmMueCwgdHJ1ZSwgcHApOworCisJCWRzdC5yID0gcnNxOworCQlkc3QuZyA9IHJzcTsKKwkJZHN0LmIgPSByc3E7CisJCWRzdC5hID0gcnNxOworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6ZHAzKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSkKKwl7CisJCUZsb2F0NCBkb3QgPSBkb3QzKHNyYzAsIHNyYzEpOworCisJCWRzdC54ID0gZG90OworCQlkc3QueSA9IGRvdDsKKwkJZHN0LnogPSBkb3Q7CisJCWRzdC53ID0gZG90OworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6ZHA0KENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSkKKwl7CisJCUZsb2F0NCBkb3QgPSBkb3Q0KHNyYzAsIHNyYzEpOworCisJCWRzdC54ID0gZG90OworCQlkc3QueSA9IGRvdDsKKwkJZHN0LnogPSBkb3Q7CisJCWRzdC53ID0gZG90OworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6bWluKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSkKKwl7CisJCWRzdC54ID0gTWluKHNyYzAueCwgc3JjMS54KTsKKwkJZHN0LnkgPSBNaW4oc3JjMC55LCBzcmMxLnkpOworCQlkc3QueiA9IE1pbihzcmMwLnosIHNyYzEueik7CisJCWRzdC53ID0gTWluKHNyYzAudywgc3JjMS53KTsKKwl9CisKKwl2b2lkIFNoYWRlckNvcmU6Om1heChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEpCisJeworCQlkc3QueCA9IE1heChzcmMwLngsIHNyYzEueCk7CisJCWRzdC55ID0gTWF4KHNyYzAueSwgc3JjMS55KTsKKwkJZHN0LnogPSBNYXgoc3JjMC56LCBzcmMxLnopOworCQlkc3QudyA9IE1heChzcmMwLncsIHNyYzEudyk7CisJfQorCisJdm9pZCBTaGFkZXJDb3JlOjpzbHQoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxKQorCXsKKwkJSW50NCB4TWFzayA9IEFzPEludDQ+KENtcExUKHNyYzAueCwgc3JjMS54KSk7CisJCUludDQgeU1hc2sgPSBBczxJbnQ0PihDbXBMVChzcmMwLnksIHNyYzEueSkpOworCQlJbnQ0IHpNYXNrID0gQXM8SW50ND4oQ21wTFQoc3JjMC56LCBzcmMxLnopKTsKKwkJSW50NCB3TWFzayA9IEFzPEludDQ+KENtcExUKHNyYzAudywgc3JjMS53KSk7CisKKwkJSW50NCBpT25lID0gQXM8SW50ND4oRmxvYXQ0KDEsIDEsIDEsIDEpKTsKKworCQlkc3QueCA9IEFzPEZsb2F0ND4oeE1hc2sgJiBpT25lKTsKKwkJZHN0LnkgPSBBczxGbG9hdDQ+KHlNYXNrICYgaU9uZSk7CisJCWRzdC56ID0gQXM8RmxvYXQ0Pih6TWFzayAmIGlPbmUpOworCQlkc3QudyA9IEFzPEZsb2F0ND4od01hc2sgJiBpT25lKTsKKwl9CisKKwl2b2lkIFNoYWRlckNvcmU6OnNnZShDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEpCisJeworCQlJbnQ0IHhNYXNrID0gQXM8SW50ND4oQ21wTkxUKHNyYzAueCwgc3JjMS54KSk7CisJCUludDQgeU1hc2sgPSBBczxJbnQ0PihDbXBOTFQoc3JjMC55LCBzcmMxLnkpKTsKKwkJSW50NCB6TWFzayA9IEFzPEludDQ+KENtcE5MVChzcmMwLnosIHNyYzEueikpOworCQlJbnQ0IHdNYXNrID0gQXM8SW50ND4oQ21wTkxUKHNyYzAudywgc3JjMS53KSk7CisKKwkJSW50NCBpT25lID0gQXM8SW50ND4oRmxvYXQ0KDEsIDEsIDEsIDEpKTsKKworCQlkc3QueCA9IEFzPEZsb2F0ND4oeE1hc2sgJiBpT25lKTsKKwkJZHN0LnkgPSBBczxGbG9hdDQ+KHlNYXNrICYgaU9uZSk7CisJCWRzdC56ID0gQXM8RmxvYXQ0Pih6TWFzayAmIGlPbmUpOworCQlkc3QudyA9IEFzPEZsb2F0ND4od01hc2sgJiBpT25lKTsKKwl9CisKKwl2b2lkIFNoYWRlckNvcmU6OmV4cChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYywgYm9vbCBwcCkKKwl7IAorCQlGbG9hdDQgZXhwID0gZXhwb25lbnRpYWwoc3JjLngsIHBwKTsKKworCQlkc3QueCA9IGV4cDsKKwkJZHN0LnkgPSBleHA7CisJCWRzdC56ID0gZXhwOworCQlkc3QudyA9IGV4cDsKKwl9CisKKwl2b2lkIFNoYWRlckNvcmU6OmxvZyhDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYywgYm9vbCBwcCkKKwl7CisJCUZsb2F0NCBsb2cgPSBsb2dhcml0aG0oc3JjLngsIHRydWUsIHBwKTsKKworCQlkc3QueCA9IGxvZzsKKwkJZHN0LnkgPSBsb2c7CisJCWRzdC56ID0gbG9nOworCQlkc3QudyA9IGxvZzsKKwl9CisKKwl2b2lkIFNoYWRlckNvcmU6OmxpdChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYykKKwl7CisJCWRzdC54ID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQlkc3QueSA9IE1heChzcmMueCwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKworCQlGbG9hdDQgcG93OworCisJCXBvdyA9IHNyYy53OworCQlwb3cgPSBNaW4ocG93LCBGbG9hdDQoMTI3Ljk5NjFmLCAxMjcuOTk2MWYsIDEyNy45OTYxZiwgMTI3Ljk5NjFmKSk7CisJCXBvdyA9IE1heChwb3csIEZsb2F0NCgtMTI3Ljk5NjFmLCAtMTI3Ljk5NjFmLCAtMTI3Ljk5NjFmLCAtMTI3Ljk5NjFmKSk7CisKKwkJZHN0LnogPSBwb3dlcihzcmMueSwgcG93KTsKKwkJZHN0LnogPSBBczxGbG9hdDQ+KEFzPEludDQ+KGRzdC56KSAmIENtcE5MVChzcmMueCwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKSk7CisJCWRzdC56ID0gQXM8RmxvYXQ0PihBczxJbnQ0Pihkc3QueikgJiBDbXBOTFQoc3JjLnksIEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSkpOworCisJCWRzdC53ID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6ZHN0KENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSkKKwl7CisJCWRzdC54ID0gMTsKKwkJZHN0LnkgPSBzcmMwLnkgKiBzcmMxLnk7CisJCWRzdC56ID0gc3JjMC56OworCQlkc3QudyA9IHNyYzEudzsKKwl9CisKKwl2b2lkIFNoYWRlckNvcmU6OmxycChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEsIENvbG9yNGYgJnNyYzIpCisJeworCQlkc3QueCA9IHNyYzAueCAqIChzcmMxLnggLSBzcmMyLngpICsgc3JjMi54OworCQlkc3QueSA9IHNyYzAueSAqIChzcmMxLnkgLSBzcmMyLnkpICsgc3JjMi55OworCQlkc3QueiA9IHNyYzAueiAqIChzcmMxLnogLSBzcmMyLnopICsgc3JjMi56OworCQlkc3QudyA9IHNyYzAudyAqIChzcmMxLncgLSBzcmMyLncpICsgc3JjMi53OworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6ZnJjKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjKQorCXsKKwkJZHN0LnggPSBGcmFjdGlvbihzcmMueCk7CisJCWRzdC55ID0gRnJhY3Rpb24oc3JjLnkpOworCQlkc3QueiA9IEZyYWN0aW9uKHNyYy56KTsKKwkJZHN0LncgPSBGcmFjdGlvbihzcmMudyk7CisJfQorCisJdm9pZCBTaGFkZXJDb3JlOjpwb3coQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxLCBib29sIHBwKQorCXsKKwkJRmxvYXQ0IHBvdyA9IHBvd2VyKHNyYzAueCwgc3JjMS54LCBwcCk7CisKKwkJZHN0LnggPSBwb3c7CisJCWRzdC55ID0gcG93OworCQlkc3QueiA9IHBvdzsKKwkJZHN0LncgPSBwb3c7CisJfQorCisJdm9pZCBTaGFkZXJDb3JlOjpjcnMoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxKQorCXsKKwkJZHN0LnggPSBzcmMwLnkgKiBzcmMxLnogLSBzcmMwLnogKiBzcmMxLnk7CisJCWRzdC55ID0gc3JjMC56ICogc3JjMS54IC0gc3JjMC54ICogc3JjMS56OworCQlkc3QueiA9IHNyYzAueCAqIHNyYzEueSAtIHNyYzAueSAqIHNyYzEueDsKKwl9CisKKwl2b2lkIFNoYWRlckNvcmU6OnNnbihDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYykKKwl7CisJCXNnbihkc3QueCwgc3JjLngpOworCQlzZ24oZHN0LnksIHNyYy55KTsKKwkJc2duKGRzdC56LCBzcmMueik7CisJCXNnbihkc3Qudywgc3JjLncpOworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6YWJzKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjKQorCXsKKwkJZHN0LnggPSBBYnMoc3JjLngpOworCQlkc3QueSA9IEFicyhzcmMueSk7CisJCWRzdC56ID0gQWJzKHNyYy56KTsKKwkJZHN0LncgPSBBYnMoc3JjLncpOworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6bnJtKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjLCBib29sIHBwKQorCXsKKwkJRmxvYXQ0IGRvdCA9IGRvdDMoc3JjLCBzcmMpOworCQlGbG9hdDQgcnNxID0gcmVjaXByb2NhbFNxdWFyZVJvb3QoZG90LCBmYWxzZSwgcHApOworCisJCWRzdC54ID0gc3JjLnggKiByc3E7CisJCWRzdC55ID0gc3JjLnkgKiByc3E7CisJCWRzdC56ID0gc3JjLnogKiByc3E7CisJCWRzdC53ID0gc3JjLncgKiByc3E7CisJfQorCQorCXZvaWQgU2hhZGVyQ29yZTo6c2luY29zKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjLCBib29sIHBwKQorCXsKKwkJRmxvYXQ0IHRtcDA7CisJCUZsb2F0NCB0bXAxOworCisJCXRtcDAgPSBzcmMueDsKKworCQkvLyBjb3MoeCkgPSBzaW4oeCArIHBpLzIpCisJCXRtcDAgKz0gRmxvYXQ0KDEuNTcwNzk2MzJlKzBmKTsKKwkJdG1wMSA9IEFzPEZsb2F0ND4oQ21wTkxUKHRtcDAsIEZsb2F0NCgzLjE0MTU5MjY1ZSswZikpICYgQXM8SW50ND4oRmxvYXQ0KDYuMjgzMTg1MzBlKzBmKSkpOworCQl0bXAwIC09IHRtcDE7CisKKwkJZHN0LnggPSBzaW5lKHRtcDAsIHBwKTsKKwkJZHN0LnkgPSBzaW5lKHNyYy54LCBwcCk7CisJfQorCisJdm9pZCBTaGFkZXJDb3JlOjpleHBwKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjLCB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uKQorCXsKKwkJaWYodmVyc2lvbiA8IDB4MDIwMCkKKwkJeworCQkJRmxvYXQ0IGZyYyA9IEZyYWN0aW9uKHNyYy54KTsKKwkJCUZsb2F0NCBmbG9vciA9IHNyYy54IC0gZnJjOworCisJCQlkc3QueCA9IGV4cG9uZW50aWFsKGZsb29yLCB0cnVlKTsKKwkJCWRzdC55ID0gZnJjOworCQkJZHN0LnogPSBleHBvbmVudGlhbChzcmMueCwgdHJ1ZSk7CisJCQlkc3QudyA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwkJfQorCQllbHNlICAgLy8gVmVyc2lvbiA+PSAyLjAKKwkJeworCQkJZXhwKGRzdCwgc3JjLCB0cnVlKTsgICAvLyBGSVhNRTogMTAtYml0IHByZWNpc2lvbiBzdWZmaWNlcworCQl9CisJfQorCQorCXZvaWQgU2hhZGVyQ29yZTo6bG9ncChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYywgdW5zaWduZWQgc2hvcnQgdmVyc2lvbikKKwl7CisJCWlmKHZlcnNpb24gPCAweDAyMDApCisJCXsKKwkJCUZsb2F0NCB0bXAwOworCQkJRmxvYXQ0IHRtcDE7CisJCQlGbG9hdDQgdDsKKwkJCUludDQgcjsKKworCQkJdG1wMCA9IEFicyhzcmMueCk7CisJCQl0bXAxID0gdG1wMDsKKworCQkJLy8gWCBjb21wb25lbnQKKwkJCXIgPSBBczxJbnQ0PihBczxVSW50ND4odG1wMCkgPj4gMjMpIC0gSW50NCgxMjcsIDEyNywgMTI3LCAxMjcpOworCQkJZHN0LnggPSBGbG9hdDQocik7CisKKwkJCS8vIFkgY29tcG9uZW50CisJCQlkc3QueSA9IEFzPEZsb2F0ND4oKEFzPEludDQ+KHRtcDEpICYgSW50NCgweDAwN0ZGRkZGKSkgfCBBczxJbnQ0PihGbG9hdDQoMS4wZikpKTsKKworCQkJLy8gWiBjb21wb25lbnQKKwkJCWRzdC56ID0gbG9nYXJpdGhtKHNyYy54LCB0cnVlLCB0cnVlKTsKKworCQkJLy8gVyBjb21wb25lbnQKKwkJCWRzdC53ID0gMS4wZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxvZyhkc3QsIHNyYywgdHJ1ZSk7CisJCX0KKwl9CisJCisJdm9pZCBTaGFkZXJDb3JlOjpjbXAoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxLCBDb2xvcjRmICZzcmMyKQorCXsKKwkJY21wKGRzdC54LCBzcmMwLngsIHNyYzEueCwgc3JjMi54KTsKKwkJY21wKGRzdC55LCBzcmMwLnksIHNyYzEueSwgc3JjMi55KTsKKwkJY21wKGRzdC56LCBzcmMwLnosIHNyYzEueiwgc3JjMi56KTsKKwkJY21wKGRzdC53LCBzcmMwLncsIHNyYzEudywgc3JjMi53KTsKKwl9CisJCisJdm9pZCBTaGFkZXJDb3JlOjpkcDJhZGQoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxLCBDb2xvcjRmICZzcmMyKQorCXsKKwkJRmxvYXQ0IHQgPSBzcmMwLnggKiBzcmMxLnggKyBzcmMwLnkgKiBzcmMxLnkgKyBzcmMyLng7CisKKwkJZHN0LnggPSB0OworCQlkc3QueSA9IHQ7CisJCWRzdC56ID0gdDsKKwkJZHN0LncgPSB0OworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6c2duKEZsb2F0NCAmZHN0LCBGbG9hdDQgJnNyYykKKwl7CisJCUludDQgbmVnID0gQXM8SW50ND4oQ21wTFQoc3JjLCBGbG9hdDQoMCwgMCwgMCwgMCkpKSAmIEFzPEludDQ+KEZsb2F0NCgtMSwgLTEsIC0xLCAtMSkpOworCQlJbnQ0IHBvcyA9IEFzPEludDQ+KENtcE5MVChzcmMsIEZsb2F0NCgwLCAwLCAwLCAwKSkpICYgQXM8SW50ND4oRmxvYXQ0KDEsIDEsIDEsIDEpKTsKKwkJZHN0ID0gQXM8RmxvYXQ0PihuZWcgfCBwb3MpOworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6Y21wKEZsb2F0NCAmZHN0LCBGbG9hdDQgJnNyYzAsIEZsb2F0NCAmc3JjMSwgRmxvYXQ0ICZzcmMyKQorCXsKKwkJSW50NCBwb3MgPSBDbXBOTEUoRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLCBzcmMwKTsKKwkJSW50NCB0MCA9IHBvcyAmIEFzPEludDQ+KHNyYzIpOworCQlJbnQ0IHQxID0gfnBvcyAmIEFzPEludDQ+KHNyYzEpOworCQlkc3QgPSBBczxGbG9hdDQ+KHQwIHwgdDEpOworCX0KKworCXZvaWQgU2hhZGVyQ29yZTo6c2V0cChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEsIENvbnRyb2wgY29udHJvbCkKKwl7CisJCXN3aXRjaChjb250cm9sKQorCQl7CisJCWNhc2UgT3A6OkNPTlRST0xfR1Q6CisJCQlkc3QueCA9IEFzPEZsb2F0ND4oQ21wTkxFKHNyYzAueCwgc3JjMS54KSk7CisJCQlkc3QueSA9IEFzPEZsb2F0ND4oQ21wTkxFKHNyYzAueSwgc3JjMS55KSk7CisJCQlkc3QueiA9IEFzPEZsb2F0ND4oQ21wTkxFKHNyYzAueiwgc3JjMS56KSk7CisJCQlkc3QudyA9IEFzPEZsb2F0ND4oQ21wTkxFKHNyYzAudywgc3JjMS53KSk7CisJCQlicmVhazsKKwkJY2FzZSBPcDo6Q09OVFJPTF9FUToKKwkJCWRzdC54ID0gQXM8RmxvYXQ0PihDbXBFUShzcmMwLngsIHNyYzEueCkpOworCQkJZHN0LnkgPSBBczxGbG9hdDQ+KENtcEVRKHNyYzAueSwgc3JjMS55KSk7CisJCQlkc3QueiA9IEFzPEZsb2F0ND4oQ21wRVEoc3JjMC56LCBzcmMxLnopKTsKKwkJCWRzdC53ID0gQXM8RmxvYXQ0PihDbXBFUShzcmMwLncsIHNyYzEudykpOworCQkJYnJlYWs7CisJCWNhc2UgT3A6OkNPTlRST0xfR0U6CisJCQlkc3QueCA9IEFzPEZsb2F0ND4oQ21wTkxUKHNyYzAueCwgc3JjMS54KSk7CisJCQlkc3QueSA9IEFzPEZsb2F0ND4oQ21wTkxUKHNyYzAueSwgc3JjMS55KSk7CisJCQlkc3QueiA9IEFzPEZsb2F0ND4oQ21wTkxUKHNyYzAueiwgc3JjMS56KSk7CisJCQlkc3QudyA9IEFzPEZsb2F0ND4oQ21wTkxUKHNyYzAudywgc3JjMS53KSk7CisJCQlicmVhazsKKwkJY2FzZSBPcDo6Q09OVFJPTF9MVDoKKwkJCWRzdC54ID0gQXM8RmxvYXQ0PihDbXBMVChzcmMwLngsIHNyYzEueCkpOworCQkJZHN0LnkgPSBBczxGbG9hdDQ+KENtcExUKHNyYzAueSwgc3JjMS55KSk7CisJCQlkc3QueiA9IEFzPEZsb2F0ND4oQ21wTFQoc3JjMC56LCBzcmMxLnopKTsKKwkJCWRzdC53ID0gQXM8RmxvYXQ0PihDbXBMVChzcmMwLncsIHNyYzEudykpOworCQkJYnJlYWs7CisJCWNhc2UgT3A6OkNPTlRST0xfTkU6CisJCQlkc3QueCA9IEFzPEZsb2F0ND4oQ21wTkVRKHNyYzAueCwgc3JjMS54KSk7CisJCQlkc3QueSA9IEFzPEZsb2F0ND4oQ21wTkVRKHNyYzAueSwgc3JjMS55KSk7CisJCQlkc3QueiA9IEFzPEZsb2F0ND4oQ21wTkVRKHNyYzAueiwgc3JjMS56KSk7CisJCQlkc3QudyA9IEFzPEZsb2F0ND4oQ21wTkVRKHNyYzAudywgc3JjMS53KSk7CisJCQlicmVhazsKKwkJY2FzZSBPcDo6Q09OVFJPTF9MRToKKwkJCWRzdC54ID0gQXM8RmxvYXQ0PihDbXBMRShzcmMwLngsIHNyYzEueCkpOworCQkJZHN0LnkgPSBBczxGbG9hdDQ+KENtcExFKHNyYzAueSwgc3JjMS55KSk7CisJCQlkc3QueiA9IEFzPEZsb2F0ND4oQ21wTEUoc3JjMC56LCBzcmMxLnopKTsKKwkJCWRzdC53ID0gQXM8RmxvYXQ0PihDbXBMRShzcmMwLncsIHNyYzEudykpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL1NoYWRlci9TaGFkZXJDb3JlLmhwcCBiL3NyYy9TaGFkZXIvU2hhZGVyQ29yZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyZTUwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvU2hhZGVyQ29yZS5ocHAKQEAgLTAsMCArMSw2MyBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXINCisvLw0KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLg0KKy8vDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwNCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcg0KKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbg0KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcw0KKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4NCisvLw0KKw0KKyNpZm5kZWYgc3dfU2hhZGVyQ29yZV9ocHANCisjZGVmaW5lIHN3X1NoYWRlckNvcmVfaHBwDQorDQorI2luY2x1ZGUgIlNoYWRlci5ocHAiDQorI2luY2x1ZGUgIlJlYWN0b3IvUmVhY3Rvci5ocHAiDQorDQorbmFtZXNwYWNlIHN3DQorew0KKwljbGFzcyBTaGFkZXJDb3JlDQorCXsNCisJCXR5cGVkZWYgU2hhZGVyOjpJbnN0cnVjdGlvbjo6T3BlcmF0aW9uOjpDb250cm9sIENvbnRyb2w7DQorCQl0eXBlZGVmIFNoYWRlcjo6SW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbiBPcDsNCisNCisJcHVibGljOg0KKwkJdm9pZCBtb3YoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMsIGJvb2wgZmxvb3JUb0ludGVnZXIgPSBmYWxzZSk7DQorCQl2b2lkIGFkZChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEpOw0KKwkJdm9pZCBzdWIoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxKTsNCisJCXZvaWQgbWFkKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSwgQ29sb3I0ZiAmc3JjMik7DQorCQl2b2lkIG11bChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEpOw0KKwkJdm9pZCByY3AoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMsIGJvb2wgcHAgPSBmYWxzZSk7DQorCQl2b2lkIHJzcShDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYywgYm9vbCBwcCA9IGZhbHNlKTsNCisJCXZvaWQgZHAzKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSk7DQorCQl2b2lkIGRwNChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEpOw0KKwkJdm9pZCBtaW4oQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxKTsNCisJCXZvaWQgbWF4KENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSk7DQorCQl2b2lkIHNsdChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEpOw0KKwkJdm9pZCBzZ2UoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxKTsNCisJCXZvaWQgZXhwKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjLCBib29sIHBwID0gZmFsc2UpOw0KKwkJdm9pZCBsb2coQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMsIGJvb2wgcHAgPSBmYWxzZSk7DQorCQl2b2lkIGxpdChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYyk7DQorCQl2b2lkIGRzdChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEpOw0KKwkJdm9pZCBscnAoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxLCBDb2xvcjRmICZzcmMyKTsNCisJCXZvaWQgZnJjKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjKTsNCisJCXZvaWQgcG93KENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSwgYm9vbCBwcCA9IGZhbHNlKTsNCisJCXZvaWQgY3JzKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgQ29sb3I0ZiAmc3JjMSk7DQorCQl2b2lkIHNnbihDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYyk7DQorCQl2b2lkIGFicyhDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYyk7DQorCQl2b2lkIG5ybShDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYywgYm9vbCBwcCA9IGZhbHNlKTsNCisJCXZvaWQgc2luY29zKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjLCBib29sIHBwID0gZmFsc2UpOw0KKwkJdm9pZCBleHBwKENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjLCB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uKTsNCisJCXZvaWQgbG9ncChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYywgdW5zaWduZWQgc2hvcnQgdmVyc2lvbik7DQorCQl2b2lkIGNtcChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEsIENvbG9yNGYgJnNyYzIpOw0KKwkJdm9pZCBkcDJhZGQoQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxLCBDb2xvcjRmICZzcmMyKTsNCisJCXZvaWQgc2V0cChDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEsIENvbnRyb2wgY29udHJvbCk7DQorDQorCXByaXZhdGU6DQorCQl2b2lkIHNnbihGbG9hdDQgJmRzdCwgRmxvYXQ0ICZzcmMpOw0KKwkJdm9pZCBjbXAoRmxvYXQ0ICZkc3QsIEZsb2F0NCAmc3JjMCwgRmxvYXQ0ICZzcmMxLCBGbG9hdDQgJnNyYzIpOw0KKwl9Ow0KK30NCisNCisjZW5kaWYgICAvLyBzd19TaGFkZXJDb3JlX2hwcA0KZGlmZiAtLWdpdCBhL3NyYy9TaGFkZXIvVmVydGV4UGlwZWxpbmUuY3BwIGIvc3JjL1NoYWRlci9WZXJ0ZXhQaXBlbGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyYjQ1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvVmVydGV4UGlwZWxpbmUuY3BwCkBAIC0wLDAgKzEsOTQ2IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJWZXJ0ZXhQaXBlbGluZS5ocHAiCisKKyNpbmNsdWRlICJWZXJ0ZXguaHBwIgorI2luY2x1ZGUgIlJlbmRlcmVyLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjdW5kZWYgbWF4CisjdW5kZWYgbWluCisKK25hbWVzcGFjZSBzdworeworCVZlcnRleFBpcGVsaW5lOjpWZXJ0ZXhQaXBlbGluZShjb25zdCBWZXJ0ZXhQcm9jZXNzb3I6OlN0YXRlICZzdGF0ZSkgOiBWZXJ0ZXhSb3V0aW5lKHN0YXRlKQorCXsKKwl9CisKKwlWZXJ0ZXhQaXBlbGluZTo6flZlcnRleFBpcGVsaW5lKCkKKwl7CisJfQorCisJQ29sb3I0ZiBWZXJ0ZXhQaXBlbGluZTo6dHJhbnNmb3JtQmxlbmQoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZzcmMsIFBvaW50ZXI8Qnl0ZT4gJm1hdHJpeCwgYm9vbCBob21vZ2VuZW91cykKKwl7CisJCUNvbG9yNGYgZHN0OworCisJCWlmKHN0YXRlLnZlcnRleEJsZW5kTWF0cml4Q291bnQgPT0gMCkKKwkJeworCQkJZHN0ID0gdHJhbnNmb3JtKHNyYywgbWF0cml4LCBob21vZ2VuZW91cyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlVSW50IGluZGV4MFs0XTsKKwkJCVVJbnQgaW5kZXgxWzRdOworCQkJVUludCBpbmRleDJbNF07CisJCQlVSW50IGluZGV4M1s0XTsKKworCQkJaWYoc3RhdGUuaW5kZXhlZFZlcnRleEJsZW5kRW5hYmxlKQorCQkJeworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspCisJCQkJeworCQkJCQlVSW50IGluZGljZXM7CisJCQkJCQorCQkJCQlzd2l0Y2goaSkKKwkJCQkJeworCQkJCQljYXNlIDA6IGluZGljZXMgPSBBczxVSW50PihGbG9hdChyLnZbQmxlbmRJbmRpY2VzXS54LngpKTsgYnJlYWs7CisJCQkJCWNhc2UgMTogaW5kaWNlcyA9IEFzPFVJbnQ+KEZsb2F0KHIudltCbGVuZEluZGljZXNdLngueSkpOyBicmVhazsKKwkJCQkJY2FzZSAyOiBpbmRpY2VzID0gQXM8VUludD4oRmxvYXQoci52W0JsZW5kSW5kaWNlc10ueC56KSk7IGJyZWFrOworCQkJCQljYXNlIDM6IGluZGljZXMgPSBBczxVSW50PihGbG9hdChyLnZbQmxlbmRJbmRpY2VzXS54LncpKTsgYnJlYWs7CisJCQkJCX0KKworCQkJCQlpbmRleDBbaV0gPSAoaW5kaWNlcyAmIFVJbnQoMHgwMDAwMDBGRikpIDw8IFVJbnQoNik7ICAgLy8gRklYTUU6IChpbmRpY2VzICYgMHgwMDAwMDBGRikgPDwgNgorCQkJCQlpbmRleDFbaV0gPSAoaW5kaWNlcyAmIFVJbnQoMHgwMDAwRkYwMCkpID4+IFVJbnQoMik7CisJCQkJCWluZGV4MltpXSA9IChpbmRpY2VzICYgVUludCgweDAwRkYwMDAwKSkgPj4gVUludCgxMCk7CisJCQkJCWluZGV4M1tpXSA9IChpbmRpY2VzICYgVUludCgweEZGMDAwMDAwKSkgPj4gVUludCgxOCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspCisJCQkJeworCQkJCQlpbmRleDBbaV0gPSBJbnQoMCAqIDY0KTsgICAvLyBGSVhNRTogaW5kZXgwID0gMCAqIDY0OworCQkJCQlpbmRleDFbaV0gPSBJbnQoMSAqIDY0KTsgICAvLyBGSVhNRTogaW5kZXgxID0gMSAqIDY0OworCQkJCQlpbmRleDJbaV0gPSBJbnQoMiAqIDY0KTsgICAvLyBGSVhNRTogaW5kZXgyID0gMiAqIDY0OworCQkJCQlpbmRleDNbaV0gPSBJbnQoMyAqIDY0KTsgICAvLyBGSVhNRTogaW5kZXgzID0gMyAqIDY0OworCQkJCX0KKwkJCX0KKworCQkJRmxvYXQ0IHdlaWdodDA7CisJCQlGbG9hdDQgd2VpZ2h0MTsKKwkJCUZsb2F0NCB3ZWlnaHQyOworCQkJRmxvYXQ0IHdlaWdodDM7CisKKwkJCXN3aXRjaChzdGF0ZS52ZXJ0ZXhCbGVuZE1hdHJpeENvdW50KQorCQkJeworCQkJY2FzZSA0OiB3ZWlnaHQyID0gci52W0JsZW5kV2VpZ2h0XS56OworCQkJY2FzZSAzOiB3ZWlnaHQxID0gci52W0JsZW5kV2VpZ2h0XS55OworCQkJY2FzZSAyOiB3ZWlnaHQwID0gci52W0JsZW5kV2VpZ2h0XS54OworCQkJY2FzZSAxOgorCQkJCWJyZWFrOworCQkJfQorCisJCQlpZihzdGF0ZS52ZXJ0ZXhCbGVuZE1hdHJpeENvdW50ID09IDEpCisJCQl7CisJCQkJZHN0ID0gdHJhbnNmb3JtKHNyYywgbWF0cml4LCBpbmRleDAsIGhvbW9nZW5lb3VzKTsKKwkJCX0KKwkJCWVsc2UgaWYoc3RhdGUudmVydGV4QmxlbmRNYXRyaXhDb3VudCA9PSAyKQorCQkJeworCQkJCXdlaWdodDEgPSBGbG9hdDQoMS4wZikgLSB3ZWlnaHQwOworCisJCQkJQ29sb3I0ZiBwb3MwOworCQkJCUNvbG9yNGYgcG9zMTsKKworCQkJCXBvczAgPSB0cmFuc2Zvcm0oc3JjLCBtYXRyaXgsIGluZGV4MCwgaG9tb2dlbmVvdXMpOworCQkJCXBvczEgPSB0cmFuc2Zvcm0oc3JjLCBtYXRyaXgsIGluZGV4MSwgaG9tb2dlbmVvdXMpOworCisJCQkJZHN0LnggPSBwb3MwLnggKiB3ZWlnaHQwICsgcG9zMS54ICogd2VpZ2h0MTsgICAvLyBGSVhNRTogQ29sb3I0ZiBvcGVyYXRvcnMKKwkJCQlkc3QueSA9IHBvczAueSAqIHdlaWdodDAgKyBwb3MxLnkgKiB3ZWlnaHQxOworCQkJCWRzdC56ID0gcG9zMC56ICogd2VpZ2h0MCArIHBvczEueiAqIHdlaWdodDE7CisJCQkJZHN0LncgPSBwb3MwLncgKiB3ZWlnaHQwICsgcG9zMS53ICogd2VpZ2h0MTsKKwkJCX0KKwkJCWVsc2UgaWYoc3RhdGUudmVydGV4QmxlbmRNYXRyaXhDb3VudCA9PSAzKQorCQkJeworCQkJCXdlaWdodDIgPSBGbG9hdDQoMS4wZikgLSAod2VpZ2h0MCArIHdlaWdodDEpOworCisJCQkJQ29sb3I0ZiBwb3MwOworCQkJCUNvbG9yNGYgcG9zMTsKKwkJCQlDb2xvcjRmIHBvczI7CisKKwkJCQlwb3MwID0gdHJhbnNmb3JtKHNyYywgbWF0cml4LCBpbmRleDAsIGhvbW9nZW5lb3VzKTsKKwkJCQlwb3MxID0gdHJhbnNmb3JtKHNyYywgbWF0cml4LCBpbmRleDEsIGhvbW9nZW5lb3VzKTsKKwkJCQlwb3MyID0gdHJhbnNmb3JtKHNyYywgbWF0cml4LCBpbmRleDIsIGhvbW9nZW5lb3VzKTsKKworCQkJCWRzdC54ID0gcG9zMC54ICogd2VpZ2h0MCArIHBvczEueCAqIHdlaWdodDEgKyBwb3MyLnggKiB3ZWlnaHQyOworCQkJCWRzdC55ID0gcG9zMC55ICogd2VpZ2h0MCArIHBvczEueSAqIHdlaWdodDEgKyBwb3MyLnkgKiB3ZWlnaHQyOworCQkJCWRzdC56ID0gcG9zMC56ICogd2VpZ2h0MCArIHBvczEueiAqIHdlaWdodDEgKyBwb3MyLnogKiB3ZWlnaHQyOworCQkJCWRzdC53ID0gcG9zMC53ICogd2VpZ2h0MCArIHBvczEudyAqIHdlaWdodDEgKyBwb3MyLncgKiB3ZWlnaHQyOworCQkJfQorCQkJZWxzZSBpZihzdGF0ZS52ZXJ0ZXhCbGVuZE1hdHJpeENvdW50ID09IDQpCisJCQl7CisJCQkJd2VpZ2h0MyA9IEZsb2F0NCgxLjBmKSAtICh3ZWlnaHQwICsgd2VpZ2h0MSArIHdlaWdodDIpOworCisJCQkJQ29sb3I0ZiBwb3MwOworCQkJCUNvbG9yNGYgcG9zMTsKKwkJCQlDb2xvcjRmIHBvczI7CisJCQkJQ29sb3I0ZiBwb3MzOworCisJCQkJcG9zMCA9IHRyYW5zZm9ybShzcmMsIG1hdHJpeCwgaW5kZXgwLCBob21vZ2VuZW91cyk7CisJCQkJcG9zMSA9IHRyYW5zZm9ybShzcmMsIG1hdHJpeCwgaW5kZXgxLCBob21vZ2VuZW91cyk7CisJCQkJcG9zMiA9IHRyYW5zZm9ybShzcmMsIG1hdHJpeCwgaW5kZXgyLCBob21vZ2VuZW91cyk7CisJCQkJcG9zMyA9IHRyYW5zZm9ybShzcmMsIG1hdHJpeCwgaW5kZXgzLCBob21vZ2VuZW91cyk7CisKKwkJCQlkc3QueCA9IHBvczAueCAqIHdlaWdodDAgKyBwb3MxLnggKiB3ZWlnaHQxICsgcG9zMi54ICogd2VpZ2h0MiArIHBvczMueCAqIHdlaWdodDM7CisJCQkJZHN0LnkgPSBwb3MwLnkgKiB3ZWlnaHQwICsgcG9zMS55ICogd2VpZ2h0MSArIHBvczIueSAqIHdlaWdodDIgKyBwb3MzLnkgKiB3ZWlnaHQzOworCQkJCWRzdC56ID0gcG9zMC56ICogd2VpZ2h0MCArIHBvczEueiAqIHdlaWdodDEgKyBwb3MyLnogKiB3ZWlnaHQyICsgcG9zMy56ICogd2VpZ2h0MzsKKwkJCQlkc3QudyA9IHBvczAudyAqIHdlaWdodDAgKyBwb3MxLncgKiB3ZWlnaHQxICsgcG9zMi53ICogd2VpZ2h0MiArIHBvczMudyAqIHdlaWdodDM7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZHN0OworCX0KKworCXZvaWQgVmVydGV4UGlwZWxpbmU6OnBpcGVsaW5lKFJlZ2lzdGVycyAmcikKKwl7CisJCUNvbG9yNGYgcG9zaXRpb247CisJCUNvbG9yNGYgbm9ybWFsOworCisJCWlmKCFzdGF0ZS5wcmVUcmFuc2Zvcm1lZCkKKwkJeworCQkJcG9zaXRpb24gPSB0cmFuc2Zvcm1CbGVuZChyLCByLnZbUG9zaXRpb25dLCBQb2ludGVyPEJ5dGU+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmZi50cmFuc2Zvcm1UKSksIHRydWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJcG9zaXRpb24gPSByLnZbUG9zaXRpb25UXTsKKwkJfQorCisJCXIub3hbUG9zXSA9IHBvc2l0aW9uLng7CisJCXIub3lbUG9zXSA9IHBvc2l0aW9uLnk7CisJCXIub3pbUG9zXSA9IHBvc2l0aW9uLno7CisJCXIub3dbUG9zXSA9IHBvc2l0aW9uLnc7CisKKwkJaWYoc3RhdGUudmVydGV4Tm9ybWFsQWN0aXZlKQorCQl7CisJCQlub3JtYWwgPSB0cmFuc2Zvcm1CbGVuZChyLCByLnZbTm9ybWFsXSwgUG9pbnRlcjxCeXRlPihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmYubm9ybWFsVHJhbnNmb3JtVCkpLCBmYWxzZSk7CisKKwkJCWlmKHN0YXRlLm5vcm1hbGl6ZU5vcm1hbHMpCisJCQl7CisJCQkJbm9ybWFsID0gbm9ybWFsaXplKG5vcm1hbCk7CisJCQl9CisJCX0KKworCQlpZighc3RhdGUudmVydGV4TGlnaHRpbmdBY3RpdmUpCisJCXsKKwkJCS8vIEZJWE1FOiBEb24ndCBwcm9jZXNzIGlmIG5vdCB1c2VkIGF0IGFsbAorCQkJaWYoc3RhdGUuZGlmZnVzZUFjdGl2ZSAmJiBzdGF0ZS5pbnB1dFtDb2xvcjBdKQorCQkJeworCQkJCUNvbG9yNGYgZGlmZnVzZSA9IHIudltDb2xvcjBdOworCisJCQkJci5veFtEMF0gPSBkaWZmdXNlLng7CisJCQkJci5veVtEMF0gPSBkaWZmdXNlLnk7CisJCQkJci5veltEMF0gPSBkaWZmdXNlLno7CisJCQkJci5vd1tEMF0gPSBkaWZmdXNlLnc7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJci5veFtEMF0gPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJci5veVtEMF0gPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJci5veltEMF0gPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJci5vd1tEMF0gPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQl9CisKKwkJCS8vIEZJWE1FOiBEb24ndCBwcm9jZXNzIGlmIG5vdCB1c2VkIGF0IGFsbAorCQkJaWYoc3RhdGUuc3BlY3VsYXJBY3RpdmUgJiYgc3RhdGUuaW5wdXRbQ29sb3IxXSkKKwkJCXsKKwkJCQlDb2xvcjRmIHNwZWN1bGFyID0gci52W0NvbG9yMV07CisKKwkJCQlyLm94W0QxXSA9IHNwZWN1bGFyLng7CisJCQkJci5veVtEMV0gPSBzcGVjdWxhci55OworCQkJCXIub3pbRDFdID0gc3BlY3VsYXIuejsKKwkJCQlyLm93W0QxXSA9IHNwZWN1bGFyLnc7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJci5veFtEMV0gPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQkJci5veVtEMV0gPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQkJci5veltEMV0gPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQkJci5vd1tEMV0gPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlDb2xvcjRmIGRpZmZ1c2VTdW07CisKKwkJCXIub3hbRDBdID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJci5veVtEMF0gPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQlyLm96W0QwXSA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCXIub3dbRDBdID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCisJCQlyLm94W0QxXSA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCXIub3lbRDFdID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJci5veltEMV0gPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQlyLm93W0QxXSA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKworCQkJZGlmZnVzZVN1bS54ID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJZGlmZnVzZVN1bS55ID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJZGlmZnVzZVN1bS56ID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJZGlmZnVzZVN1bS53ID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCisJCQlDb2xvcjRmIHZlcnRleFBvc2l0aW9uID0gdHJhbnNmb3JtQmxlbmQociwgci52W1Bvc2l0aW9uXSwgUG9pbnRlcjxCeXRlPihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmYuY2FtZXJhVHJhbnNmb3JtVCkpLCB0cnVlKTsKKworCQkJZm9yKGludCBpID0gMDsgaSA8IDg7IGkrKykKKwkJCXsKKwkJCQlpZighKHN0YXRlLnZlcnRleExpZ2h0QWN0aXZlICYgKDEgPDwgaSkpKQorCQkJCXsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJQ29sb3I0ZiBMOyAgICAvLyBMaWdodCB2ZWN0b3IKKwkJCQlGbG9hdDQgYXR0OyAgIC8vIEF0dGVudWF0aW9uCisKKwkJCQkvLyBBdHRlbnVhdGlvbgorCQkJCXsKKwkJCQkJRmxvYXQ0IGQ7ICAgLy8gRGlzdGFuY2UKKworCQkJCQlMLnggPSBMLnkgPSBMLnogPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmZi5saWdodFBvc2l0aW9uW2ldKSk7ICAgLy8gRklYTUU6IFVucGFjaworCQkJCQlMLnggPSBMLngueHh4eDsKKwkJCQkJTC55ID0gTC55Lnl5eXk7CisJCQkJCUwueiA9IEwuei56enp6OworCisJCQkJCUwueCAtPSB2ZXJ0ZXhQb3NpdGlvbi54OworCQkJCQlMLnkgLT0gdmVydGV4UG9zaXRpb24ueTsKKwkJCQkJTC56IC09IHZlcnRleFBvc2l0aW9uLno7CisJCQkJCWQgPSBkb3QzKEwsIEwpOworCQkJCQlkID0gUmNwU3FydF9wcChkKTsgICAgIC8vIEZJWE1FOiBTdWZmaWNpZW50IHByZWNpc2lvbj8KKwkJCQkJTC54ICo9IGQ7CisJCQkJCUwueSAqPSBkOworCQkJCQlMLnogKj0gZDsKKwkJCQkJZCA9IFJjcF9wcChkKTsgICAgICAgLy8gRklYTUU6IFN1ZmZpY2llbnQgcHJlY2lzaW9uPworCisJCQkJCUZsb2F0NCBxID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmYuYXR0ZW51YXRpb25RdWFkcmF0aWNbaV0pKTsKKwkJCQkJRmxvYXQ0IGwgPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmZi5hdHRlbnVhdGlvbkxpbmVhcltpXSkpOworCQkJCQlGbG9hdDQgYyA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZmLmF0dGVudWF0aW9uQ29uc3RhbnRbaV0pKTsKKworCQkJCQlhdHQgPSBSY3BfcHAoKHEgKiBkICsgbCkgKiBkICsgYyk7CisJCQkJfQorCisJCQkJLy8gQW1iaWVudCBwZXIgbGlnaHQKKwkJCQl7CisJCQkJCUZsb2F0NCBsaWdodEFtYmllbnQgPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmZi5saWdodEFtYmllbnRbaV0pKTsgICAvLyBGSVhNRTogVW5wYWNrCisKKwkJCQkJci5veFtEMF0gPSByLm94W0QwXSArIGxpZ2h0QW1iaWVudC54ICogYXR0OworCQkJCQlyLm95W0QwXSA9IHIub3lbRDBdICsgbGlnaHRBbWJpZW50LnkgKiBhdHQ7CisJCQkJCXIub3pbRDBdID0gci5veltEMF0gKyBsaWdodEFtYmllbnQueiAqIGF0dDsKKwkJCQl9CisKKwkJCQkvLyBEaWZmdXNlCisJCQkJaWYoc3RhdGUudmVydGV4Tm9ybWFsQWN0aXZlKQorCQkJCXsKKwkJCQkJRmxvYXQ0IGRvdDsKKworCQkJCQlkb3QgPSBkb3QzKEwsIG5vcm1hbCk7CisJCQkJCWRvdCA9IE1heChkb3QsIEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSk7CisJCQkJCWRvdCAqPSBhdHQ7CisKKwkJCQkJQ29sb3I0ZiBkaWZmOworCisJCQkJCWlmKHN0YXRlLnZlcnRleERpZmZ1c2VNYXRlcmlhbFNvdXJjZUFjdGl2ZSA9PSBDb250ZXh0OjpNQVRFUklBTCkKKwkJCQkJeworCQkJCQkJZGlmZi54ID0gZGlmZi55ID0gZGlmZi56ID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmYubWF0ZXJpYWxEaWZmdXNlKSk7ICAgLy8gRklYTUU6IFVucGFjaworCQkJCQkJZGlmZi54ID0gZGlmZi54Lnh4eHg7CisJCQkJCQlkaWZmLnkgPSBkaWZmLnkueXl5eTsKKwkJCQkJCWRpZmYueiA9IGRpZmYuei56enp6OworCQkJCQl9CisJCQkJCWVsc2UgaWYoc3RhdGUudmVydGV4RGlmZnVzZU1hdGVyaWFsU291cmNlQWN0aXZlID09IENvbnRleHQ6OkNPTE9SMSkKKwkJCQkJeworCQkJCQkJZGlmZiA9IHIudltDb2xvcjBdOworCQkJCQl9CisJCQkJCWVsc2UgaWYoc3RhdGUudmVydGV4RGlmZnVzZU1hdGVyaWFsU291cmNlQWN0aXZlID09IENvbnRleHQ6OkNPTE9SMikKKwkJCQkJeworCQkJCQkJZGlmZiA9IHIudltDb2xvcjFdOworCQkJCQl9CisJCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKworCQkJCQlGbG9hdDQgbGlnaHREaWZmdXNlID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmYubGlnaHREaWZmdXNlW2ldKSk7CisKKwkJCQkJZGlmZnVzZVN1bS54ICs9IGRpZmYueCAqIGRvdCAqIGxpZ2h0RGlmZnVzZS54OyAgIC8vIEZJWE1FOiBDbGFtcCBmaXJzdD8KKwkJCQkJZGlmZnVzZVN1bS55ICs9IGRpZmYueSAqIGRvdCAqIGxpZ2h0RGlmZnVzZS55OyAgIC8vIEZJWE1FOiBDbGFtcCBmaXJzdD8KKwkJCQkJZGlmZnVzZVN1bS56ICs9IGRpZmYueiAqIGRvdCAqIGxpZ2h0RGlmZnVzZS56OyAgIC8vIEZJWE1FOiBDbGFtcCBmaXJzdD8KKwkJCQl9CisKKwkJCQkvLyBTcGVjdWxhcgorCQkJCWlmKHN0YXRlLnZlcnRleFNwZWN1bGFyQWN0aXZlKQorCQkJCXsKKwkJCQkJQ29sb3I0ZiBTOworCQkJCQlDb2xvcjRmIEM7ICAgLy8gQ2FtZXJhIHZlY3RvcgorCQkJCQlGbG9hdDQgcG93OworCisJCQkJCXBvdyA9ICpQb2ludGVyPEZsb2F0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmYubWF0ZXJpYWxTaGluaW5lc3MpKTsKKworCQkJCQlTLnggPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikgLSB2ZXJ0ZXhQb3NpdGlvbi54OworCQkJCQlTLnkgPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikgLSB2ZXJ0ZXhQb3NpdGlvbi55OworCQkJCQlTLnogPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikgLSB2ZXJ0ZXhQb3NpdGlvbi56OworCQkJCQlDID0gbm9ybWFsaXplKFMpOworCisJCQkJCVMueCA9IEwueCArIEMueDsKKwkJCQkJUy55ID0gTC55ICsgQy55OworCQkJCQlTLnogPSBMLnogKyBDLno7CisJCQkJCUMgPSBub3JtYWxpemUoUyk7CisKKwkJCQkJRmxvYXQ0IGRvdCA9IE1heChkb3QzKEMsIG5vcm1hbCksIEZsb2F0NCgwLjBmKSk7ICAgLy8gRklYTUU6IG1heChkb3QzKEMsIG5vcm1hbCksIDApCisKKwkJCQkJRmxvYXQ0IFAgPSBwb3dlcihkb3QsIHBvdyk7CisJCQkJCVAgKj0gYXR0OworCisJCQkJCUNvbG9yNGYgc3BlYzsKKworCQkJCQlpZihzdGF0ZS52ZXJ0ZXhTcGVjdWxhck1hdGVyaWFsU291cmNlQWN0aXZlID09IENvbnRleHQ6Ok1BVEVSSUFMKQorCQkJCQl7CisJCQkJCQlGbG9hdDQgbWF0ZXJpYWxTcGVjdWxhciA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZmLm1hdGVyaWFsU3BlY3VsYXIpKTsgICAvLyBGSVhNRTogVW5wYWNrCisKKwkJCQkJCXNwZWMueCA9IG1hdGVyaWFsU3BlY3VsYXIueDsKKwkJCQkJCXNwZWMueSA9IG1hdGVyaWFsU3BlY3VsYXIueTsKKwkJCQkJCXNwZWMueiA9IG1hdGVyaWFsU3BlY3VsYXIuejsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHN0YXRlLnZlcnRleFNwZWN1bGFyTWF0ZXJpYWxTb3VyY2VBY3RpdmUgPT0gQ29udGV4dDo6Q09MT1IxKQorCQkJCQl7CisJCQkJCQlzcGVjID0gci52W0NvbG9yMF07CisJCQkJCX0KKwkJCQkJZWxzZSBpZihzdGF0ZS52ZXJ0ZXhTcGVjdWxhck1hdGVyaWFsU291cmNlQWN0aXZlID09IENvbnRleHQ6OkNPTE9SMikKKwkJCQkJeworCQkJCQkJc3BlYyA9IHIudltDb2xvcjFdOworCQkJCQl9CisJCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKworCQkJCQlGbG9hdDQgbGlnaHRTcGVjdWxhciA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZmLmxpZ2h0U3BlY3VsYXJbaV0pKTsKKworCQkJCQlzcGVjLnggKj0gbGlnaHRTcGVjdWxhci54OworCQkJCQlzcGVjLnkgKj0gbGlnaHRTcGVjdWxhci55OworCQkJCQlzcGVjLnogKj0gbGlnaHRTcGVjdWxhci56OworCisJCQkJCXNwZWMueCAqPSBQOworCQkJCQlzcGVjLnkgKj0gUDsKKwkJCQkJc3BlYy56ICo9IFA7CisKKwkJCQkJc3BlYy54ID0gTWF4KHNwZWMueCwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKwkJCQkJc3BlYy55ID0gTWF4KHNwZWMueSwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKwkJCQkJc3BlYy56ID0gTWF4KHNwZWMueiwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKworCQkJCQlyLm94W0QxXSA9IHIub3hbRDFdICsgc3BlYy54OworCQkJCQlyLm95W0QxXSA9IHIub3lbRDFdICsgc3BlYy55OworCQkJCQlyLm96W0QxXSA9IHIub3pbRDFdICsgc3BlYy56OworCQkJCX0KKwkJCX0KKworCQkJRmxvYXQ0IGdsb2JhbEFtYmllbnQgPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmZi5nbG9iYWxBbWJpZW50KSk7ICAgLy8gRklYTUU6IFVucGFjaworCisJCQlyLm94W0QwXSA9IHIub3hbRDBdICsgZ2xvYmFsQW1iaWVudC54OworCQkJci5veVtEMF0gPSByLm95W0QwXSArIGdsb2JhbEFtYmllbnQueTsKKwkJCXIub3pbRDBdID0gci5veltEMF0gKyBnbG9iYWxBbWJpZW50Lno7CisKKwkJCWlmKHN0YXRlLnZlcnRleEFtYmllbnRNYXRlcmlhbFNvdXJjZUFjdGl2ZSA9PSBDb250ZXh0OjpNQVRFUklBTCkKKwkJCXsKKwkJCQlGbG9hdDQgbWF0ZXJpYWxBbWJpZW50ID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmYubWF0ZXJpYWxBbWJpZW50KSk7ICAgLy8gRklYTUU6IFVucGFjaworCisJCQkJci5veFtEMF0gPSByLm94W0QwXSAqIG1hdGVyaWFsQW1iaWVudC54OworCQkJCXIub3lbRDBdID0gci5veVtEMF0gKiBtYXRlcmlhbEFtYmllbnQueTsKKwkJCQlyLm96W0QwXSA9IHIub3pbRDBdICogbWF0ZXJpYWxBbWJpZW50Lno7CisJCQl9CisJCQllbHNlIGlmKHN0YXRlLnZlcnRleEFtYmllbnRNYXRlcmlhbFNvdXJjZUFjdGl2ZSA9PSBDb250ZXh0OjpDT0xPUjEpCisJCQl7CisJCQkJQ29sb3I0ZiBtYXRlcmlhbERpZmZ1c2UgPSByLnZbQ29sb3IwXTsKKworCQkJCXIub3hbRDBdID0gci5veFtEMF0gKiBtYXRlcmlhbERpZmZ1c2UueDsKKwkJCQlyLm95W0QwXSA9IHIub3lbRDBdICogbWF0ZXJpYWxEaWZmdXNlLnk7CisJCQkJci5veltEMF0gPSByLm96W0QwXSAqIG1hdGVyaWFsRGlmZnVzZS56OworCQkJfQorCQkJZWxzZSBpZihzdGF0ZS52ZXJ0ZXhBbWJpZW50TWF0ZXJpYWxTb3VyY2VBY3RpdmUgPT0gQ29udGV4dDo6Q09MT1IyKQorCQkJeworCQkJCUNvbG9yNGYgbWF0ZXJpYWxTcGVjdWxhciA9IHIudltDb2xvcjFdOworCisJCQkJci5veFtEMF0gPSByLm94W0QwXSAqIG1hdGVyaWFsU3BlY3VsYXIueDsKKwkJCQlyLm95W0QwXSA9IHIub3lbRDBdICogbWF0ZXJpYWxTcGVjdWxhci55OworCQkJCXIub3pbRDBdID0gci5veltEMF0gKiBtYXRlcmlhbFNwZWN1bGFyLno7CisJCQl9CisJCQllbHNlIEFTU0VSVChmYWxzZSk7CisKKwkJCXIub3hbRDBdID0gci5veFtEMF0gKyBkaWZmdXNlU3VtLng7CisJCQlyLm95W0QwXSA9IHIub3lbRDBdICsgZGlmZnVzZVN1bS55OworCQkJci5veltEMF0gPSByLm96W0QwXSArIGRpZmZ1c2VTdW0uejsKKworCQkJLy8gRW1pc3NpdmUKKwkJCWlmKHN0YXRlLnZlcnRleEVtaXNzaXZlTWF0ZXJpYWxTb3VyY2VBY3RpdmUgPT0gQ29udGV4dDo6TUFURVJJQUwpCisJCQl7CisJCQkJRmxvYXQ0IG1hdGVyaWFsRW1pc3Npb24gPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmZi5tYXRlcmlhbEVtaXNzaW9uKSk7ICAgLy8gRklYTUU6IFVucGFjaworCisJCQkJci5veFtEMF0gPSByLm94W0QwXSArIG1hdGVyaWFsRW1pc3Npb24ueDsKKwkJCQlyLm95W0QwXSA9IHIub3lbRDBdICsgbWF0ZXJpYWxFbWlzc2lvbi55OworCQkJCXIub3pbRDBdID0gci5veltEMF0gKyBtYXRlcmlhbEVtaXNzaW9uLno7CisJCQl9CisJCQllbHNlIGlmKHN0YXRlLnZlcnRleEVtaXNzaXZlTWF0ZXJpYWxTb3VyY2VBY3RpdmUgPT0gQ29udGV4dDo6Q09MT1IxKQorCQkJeworCQkJCUNvbG9yNGYgbWF0ZXJpYWxTcGVjdWxhciA9IHIudltDb2xvcjBdOworCisJCQkJci5veFtEMF0gPSByLm94W0QwXSArIG1hdGVyaWFsU3BlY3VsYXIueDsKKwkJCQlyLm95W0QwXSA9IHIub3lbRDBdICsgbWF0ZXJpYWxTcGVjdWxhci55OworCQkJCXIub3pbRDBdID0gci5veltEMF0gKyBtYXRlcmlhbFNwZWN1bGFyLno7CisJCQl9CisJCQllbHNlIGlmKHN0YXRlLnZlcnRleEVtaXNzaXZlTWF0ZXJpYWxTb3VyY2VBY3RpdmUgPT0gQ29udGV4dDo6Q09MT1IyKQorCQkJeworCQkJCUNvbG9yNGYgbWF0ZXJpYWxTcGVjdWxhciA9IHIudltDb2xvcjFdOworCisJCQkJci5veFtEMF0gPSByLm94W0QwXSArIG1hdGVyaWFsU3BlY3VsYXIueDsKKwkJCQlyLm95W0QwXSA9IHIub3lbRDBdICsgbWF0ZXJpYWxTcGVjdWxhci55OworCQkJCXIub3pbRDBdID0gci5veltEMF0gKyBtYXRlcmlhbFNwZWN1bGFyLno7CisJCQl9CisJCQllbHNlIEFTU0VSVChmYWxzZSk7CisKKwkJCS8vIERpZmZ1c2UgYWxwaGEgY29tcG9uZW50CisJCQlpZihzdGF0ZS52ZXJ0ZXhEaWZmdXNlTWF0ZXJpYWxTb3VyY2VBY3RpdmUgPT0gQ29udGV4dDo6TUFURVJJQUwpCisJCQl7CisJCQkJci5vd1tEMF0gPSBGbG9hdDQoKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmYubWF0ZXJpYWxEaWZmdXNlWzBdKSkpLnd3d3c7ICAgLy8gRklYTUU6IFVucGFjaworCQkJfQorCQkJZWxzZSBpZihzdGF0ZS52ZXJ0ZXhEaWZmdXNlTWF0ZXJpYWxTb3VyY2VBY3RpdmUgPT0gQ29udGV4dDo6Q09MT1IxKQorCQkJeworCQkJCUNvbG9yNGYgYWxwaGEgPSByLnZbQ29sb3IwXTsKKwkJCQlyLm93W0QwXSA9IGFscGhhLnc7CisJCQl9CisJCQllbHNlIGlmKHN0YXRlLnZlcnRleERpZmZ1c2VNYXRlcmlhbFNvdXJjZUFjdGl2ZSA9PSBDb250ZXh0OjpDT0xPUjIpCisJCQl7CisJCQkJQ29sb3I0ZiBhbHBoYSA9IHIudltDb2xvcjFdOworCQkJCXIub3dbRDBdID0gYWxwaGEudzsKKwkJCX0KKwkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKworCQkJaWYoc3RhdGUudmVydGV4U3BlY3VsYXJBY3RpdmUpCisJCQl7CisJCQkJLy8gU3BlY3VsYXIgYWxwaGEgY29tcG9uZW50CisJCQkJaWYoc3RhdGUudmVydGV4U3BlY3VsYXJNYXRlcmlhbFNvdXJjZUFjdGl2ZSA9PSBDb250ZXh0OjpNQVRFUklBTCkKKwkJCQl7CisJCQkJCXIub3dbRDFdID0gRmxvYXQ0KCpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZmLm1hdGVyaWFsU3BlY3VsYXJbM10pKSkud3d3dzsgICAvLyBGSVhNRTogVW5wYWNrCisJCQkJfQorCQkJCWVsc2UgaWYoc3RhdGUudmVydGV4U3BlY3VsYXJNYXRlcmlhbFNvdXJjZUFjdGl2ZSA9PSBDb250ZXh0OjpDT0xPUjEpCisJCQkJeworCQkJCQlDb2xvcjRmIGFscGhhID0gci52W0NvbG9yMF07CisJCQkJCXIub3dbRDFdID0gYWxwaGEudzsKKwkJCQl9CisJCQkJZWxzZSBpZihzdGF0ZS52ZXJ0ZXhTcGVjdWxhck1hdGVyaWFsU291cmNlQWN0aXZlID09IENvbnRleHQ6OkNPTE9SMikKKwkJCQl7CisJCQkJCUNvbG9yNGYgYWxwaGEgPSByLnZbQ29sb3IxXTsKKwkJCQkJci5vd1tEMV0gPSBhbHBoYS53OworCQkJCX0KKwkJCQllbHNlIEFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKworCQlpZihzdGF0ZS5mb2dBY3RpdmUpCisJCXsKKwkJCXN3aXRjaChzdGF0ZS52ZXJ0ZXhGb2dNb2RlKQorCQkJeworCQkJY2FzZSBDb250ZXh0OjpGT0dfTk9ORToKKwkJCQlpZihzdGF0ZS5zcGVjdWxhckFjdGl2ZSkKKwkJCQl7CisJCQkJCXIub3hbRm9nXSA9IHIub3dbRDFdOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyLm94W0ZvZ10gPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBDb250ZXh0OjpGT0dfTElORUFSOgorCQkJY2FzZSBDb250ZXh0OjpGT0dfRVhQOgorCQkJY2FzZSBDb250ZXh0OjpGT0dfRVhQMjoKKwkJCQlpZighc3RhdGUucmFuZ2VGb2dBY3RpdmUpCisJCQkJeworCQkJCQlyLm94W0ZvZ10gPSByLm96W1Bvc107CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUNvbG9yNGYgcG9zOworCisJCQkJCXBvcy54ID0gci5veFtQb3NdOworCQkJCQlwb3MueSA9IHIub3lbUG9zXTsKKwkJCQkJcG9zLnogPSByLm96W1Bvc107CisJCQkJCXBvcy53ID0gci5vd1tQb3NdOworCisJCQkJCXIub3hbRm9nXSA9IFNxcnQoZG90Myhwb3MsIHBvcykpOyAgIC8vIEZJWE1FOiBvRm9nID0gbGVuZ3RoKG9bUG9zXSk7CisJCQkJfQorCisJCQkJci5veFtGb2ddID0gci5veFtGb2ddICogKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZm9nLnNjYWxlKSkgKyAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmb2cub2Zmc2V0KSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKworCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQorCQl7CisJCQlwcm9jZXNzVGV4dHVyZUNvb3JkaW5hdGUociwgc3RhZ2UsIG5vcm1hbCwgcG9zaXRpb24pOworCQl9CisKKwkJcHJvY2Vzc1BvaW50U2l6ZShyKTsKKwl9CisKKwl2b2lkIFZlcnRleFBpcGVsaW5lOjpwcm9jZXNzVGV4dHVyZUNvb3JkaW5hdGUoUmVnaXN0ZXJzICZyLCBpbnQgc3RhZ2UsIENvbG9yNGYgJm5vcm1hbCwgQ29sb3I0ZiAmcG9zaXRpb24pCisJeworCQlpZihzdGF0ZS5vdXRwdXRbVDAgKyBzdGFnZV0ud3JpdGUpCisJCXsKKwkJCWludCBpID0gc3RhdGUudGV4dHVyZVN0YXRlW3N0YWdlXS50ZXhDb29yZEluZGV4QWN0aXZlOworCisJCQlzd2l0Y2goc3RhdGUudGV4dHVyZVN0YXRlW3N0YWdlXS50ZXhHZW5BY3RpdmUpCisJCQl7CisJCQljYXNlIENvbnRleHQ6OlRFWEdFTl9QQVNTVEhSVToKKwkJCQl7CisJCQkJCUNvbG9yNGYgdiA9IHIudltUZXhDb29yZDAgKyBpXTsKKworCQkJCQlyLm94W1QwICsgc3RhZ2VdID0gdi54OworCQkJCQlyLm95W1QwICsgc3RhZ2VdID0gdi55OworCQkJCQlyLm96W1QwICsgc3RhZ2VdID0gdi56OworCQkJCQlyLm93W1QwICsgc3RhZ2VdID0gdi53OworCisJCQkJCWlmKHN0YXRlLmlucHV0W1RleENvb3JkMCArIGldLnR5cGUgPT0gU1RSRUFNVFlQRV9GTE9BVCkKKwkJCQkJeworCQkJCQkJc3dpdGNoKHN0YXRlLmlucHV0W1RleENvb3JkMCArIGldLmNvdW50KQorCQkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJCXIub3lbVDAgKyBzdGFnZV0gPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJCQkJci5veltUMCArIHN0YWdlXSA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJCQlyLm93W1QwICsgc3RhZ2VdID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCXIub3pbVDAgKyBzdGFnZV0gPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJCQkJci5vd1tUMCArIHN0YWdlXSA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMzoKKwkJCQkJCQlyLm93W1QwICsgc3RhZ2VdID0gRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgQVNTRVJUKCFzdGF0ZS5pbnB1dFtUZXhDb29yZDAgKyBpXSk7ICAgLy8gUG9pbnQgc3ByaXRlOyBjb29yZGluYXRlcyBwcm92aWRlZCBieSBzZXR1cAorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ29udGV4dDo6VEVYR0VOX05PUk1BTDoKKwkJCQl7CisJCQkJCUNvbG9yNGYgTmM7ICAgLy8gTm9ybWFsIHZlY3RvciBpbiBjYW1lcmEgc3BhY2UKKworCQkJCQlpZihzdGF0ZS52ZXJ0ZXhOb3JtYWxBY3RpdmUpCisJCQkJCXsKKwkJCQkJCU5jID0gbm9ybWFsOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJTmMueCA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJCU5jLnkgPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCQkJCQlOYy56ID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQkJCQl9CisKKwkJCQkJTmMudyA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwkJCQkJCisJCQkJCXIub3hbVDAgKyBzdGFnZV0gPSBOYy54OworCQkJCQlyLm95W1QwICsgc3RhZ2VdID0gTmMueTsKKwkJCQkJci5veltUMCArIHN0YWdlXSA9IE5jLno7CisJCQkJCXIub3dbVDAgKyBzdGFnZV0gPSBOYy53OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ29udGV4dDo6VEVYR0VOX1BPU0lUSU9OOgorCQkJCXsKKwkJCQkJQ29sb3I0ZiBQbiA9IHRyYW5zZm9ybUJsZW5kKHIsIHIudltQb3NpdGlvbl0sIFBvaW50ZXI8Qnl0ZT4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZmLmNhbWVyYVRyYW5zZm9ybVQpKSwgdHJ1ZSk7ICAgLy8gUG9zaXRpb24gaW4gY2FtZXJhIHNwYWNlCisKKwkJCQkJUG4udyA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwkJCQkJCisJCQkJCXIub3hbVDAgKyBzdGFnZV0gPSBQbi54OworCQkJCQlyLm95W1QwICsgc3RhZ2VdID0gUG4ueTsKKwkJCQkJci5veltUMCArIHN0YWdlXSA9IFBuLno7CisJCQkJCXIub3dbVDAgKyBzdGFnZV0gPSBQbi53OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ29udGV4dDo6VEVYR0VOX1JFRkxFQ1RJT046CisJCQkJeworCQkJCQlDb2xvcjRmIFI7ICAgLy8gUmVmbGVjdGlvbiB2ZWN0b3IKKworCQkJCQlpZihzdGF0ZS52ZXJ0ZXhOb3JtYWxBY3RpdmUpCisJCQkJCXsKKwkJCQkJCUNvbG9yNGYgTmM7ICAgLy8gTm9ybWFsIHZlY3RvciBpbiBjYW1lcmEgc3BhY2UKKworCQkJCQkJTmMgPSBub3JtYWw7CisKKwkJCQkJCWlmKHN0YXRlLmxvY2FsVmlld2VyQWN0aXZlKQorCQkJCQkJeworCQkJCQkJCUNvbG9yNGYgRWM7ICAgLy8gRXllIHZlY3RvciBpbiBjYW1lcmEgc3BhY2UKKwkJCQkJCQlDb2xvcjRmIE4yOworCisJCQkJCQkJRWMgPSB0cmFuc2Zvcm1CbGVuZChyLCByLnZbUG9zaXRpb25dLCBQb2ludGVyPEJ5dGU+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmZi5jYW1lcmFUcmFuc2Zvcm1UKSksIHRydWUpOworCQkJCQkJCUVjID0gbm9ybWFsaXplKEVjKTsKKworCQkJCQkJCS8vIFIgPSBFIC0gMiAqIE4gKiAoRSAuIE4pCisJCQkJCQkJRmxvYXQ0IGRvdCA9IEZsb2F0NCgyLjBmLCAyLjBmLCAyLjBmLCAyLjBmKSAqIGRvdDMoRWMsIE5jKTsKKworCQkJCQkJCVIueCA9IEVjLnggLSBOYy54ICogZG90OworCQkJCQkJCVIueSA9IEVjLnkgLSBOYy55ICogZG90OworCQkJCQkJCVIueiA9IEVjLnogLSBOYy56ICogZG90OworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIHUgPSAtMiAqIE56ICogTngKKwkJCQkJCQkvLyB2ID0gLTIgKiBOeiAqIE55CisJCQkJCQkJLy8gdyA9IDEgLSAyICogTnogKiBOegorCisJCQkJCQkJUi54ID0gLUZsb2F0NCgyLjBmLCAyLjBmLCAyLjBmLCAyLjBmKSAqIE5jLnogKiBOYy54OworCQkJCQkJCVIueSA9IC1GbG9hdDQoMi4wZiwgMi4wZiwgMi4wZiwgMi4wZikgKiBOYy56ICogTmMueTsKKwkJCQkJCQlSLnogPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikgLSBGbG9hdDQoMi4wZiwgMi4wZiwgMi4wZiwgMi4wZikgKiBOYy56ICogTmMuejsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIueCA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJCVIueSA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJCVIueiA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJfQorCisJCQkJCVIudyA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKworCQkJCQlyLm94W1QwICsgc3RhZ2VdID0gUi54OworCQkJCQlyLm95W1QwICsgc3RhZ2VdID0gUi55OworCQkJCQlyLm96W1QwICsgc3RhZ2VdID0gUi56OworCQkJCQlyLm93W1QwICsgc3RhZ2VdID0gUi53OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ29udGV4dDo6VEVYR0VOX1NQSEVSRU1BUDoKKwkJCQl7CisJCQkJCUNvbG9yNGYgUjsgICAvLyBSZWZsZWN0aW9uIHZlY3RvcgorCisJCQkJCWlmKHN0YXRlLnZlcnRleE5vcm1hbEFjdGl2ZSkKKwkJCQkJeworCQkJCQkJQ29sb3I0ZiBOYzsgICAvLyBOb3JtYWwgdmVjdG9yIGluIGNhbWVyYSBzcGFjZQorCisJCQkJCQlOYyA9IG5vcm1hbDsKKworCQkJCQkJaWYoc3RhdGUubG9jYWxWaWV3ZXJBY3RpdmUpCisJCQkJCQl7CisJCQkJCQkJQ29sb3I0ZiBFYzsgICAvLyBFeWUgdmVjdG9yIGluIGNhbWVyYSBzcGFjZQorCQkJCQkJCUNvbG9yNGYgTjI7CisKKwkJCQkJCQlFYyA9IHRyYW5zZm9ybUJsZW5kKHIsIHIudltQb3NpdGlvbl0sIFBvaW50ZXI8Qnl0ZT4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZmLmNhbWVyYVRyYW5zZm9ybVQpKSwgdHJ1ZSk7CisJCQkJCQkJRWMgPSBub3JtYWxpemUoRWMpOworCisJCQkJCQkJLy8gUiA9IEUgLSAyICogTiAqIChFIC4gTikKKwkJCQkJCQlGbG9hdDQgZG90ID0gRmxvYXQ0KDIuMGYsIDIuMGYsIDIuMGYsIDIuMGYpICogZG90MyhFYywgTmMpOworCQkJCQkJCQorCQkJCQkJCVIueCA9IEVjLnggLSBOYy54ICogZG90OworCQkJCQkJCVIueSA9IEVjLnkgLSBOYy55ICogZG90OworCQkJCQkJCVIueiA9IEVjLnogLSBOYy56ICogZG90OworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIHUgPSAtMiAqIE56ICogTngKKwkJCQkJCQkvLyB2ID0gLTIgKiBOeiAqIE55CisJCQkJCQkJLy8gdyA9IDEgLSAyICogTnogKiBOegorCisJCQkJCQkJUi54ID0gLUZsb2F0NCgyLjBmLCAyLjBmLCAyLjBmLCAyLjBmKSAqIE5jLnogKiBOYy54OworCQkJCQkJCVIueSA9IC1GbG9hdDQoMi4wZiwgMi4wZiwgMi4wZiwgMi4wZikgKiBOYy56ICogTmMueTsKKwkJCQkJCQlSLnogPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikgLSBGbG9hdDQoMi4wZiwgMi4wZiwgMi4wZiwgMi4wZikgKiBOYy56ICogTmMuejsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIueCA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJCVIueSA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJCVIueiA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJCQkJfQorCisJCQkJCVIueiAtPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisJCQkJCVIgPSBub3JtYWxpemUoUik7CisJCQkJCVIueCA9IEZsb2F0NCgwLjVmLCAwLjVmLCAwLjVmLCAwLjVmKSAqIFIueCArIEZsb2F0NCgwLjVmLCAwLjVmLCAwLjVmLCAwLjVmKTsKKwkJCQkJUi55ID0gRmxvYXQ0KDAuNWYsIDAuNWYsIDAuNWYsIDAuNWYpICogUi55ICsgRmxvYXQ0KDAuNWYsIDAuNWYsIDAuNWYsIDAuNWYpOworCisJCQkJCVIueiA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwkJCQkJUi53ID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCisJCQkJCXIub3hbVDAgKyBzdGFnZV0gPSBSLng7CisJCQkJCXIub3lbVDAgKyBzdGFnZV0gPSBSLnk7CisJCQkJCXIub3pbVDAgKyBzdGFnZV0gPSBSLno7CisJCQkJCXIub3dbVDAgKyBzdGFnZV0gPSBSLnc7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCisJCQlDb2xvcjRmIHRleFRyYW5zMDsKKwkJCUNvbG9yNGYgdGV4VHJhbnMxOworCQkJQ29sb3I0ZiB0ZXhUcmFuczI7CisJCQlDb2xvcjRmIHRleFRyYW5zMzsKKworCQkJQ29sb3I0ZiBUOworCQkJQ29sb3I0ZiB0OworCisJCQlULnggPSByLm94W1QwICsgc3RhZ2VdOworCQkJVC55ID0gci5veVtUMCArIHN0YWdlXTsKKwkJCVQueiA9IHIub3pbVDAgKyBzdGFnZV07CisJCQlULncgPSByLm93W1QwICsgc3RhZ2VdOworCisJCQlzd2l0Y2goc3RhdGUudGV4dHVyZVN0YXRlW3N0YWdlXS50ZXh0dXJlVHJhbnNmb3JtQ291bnRBY3RpdmUpCisJCQl7CisJCQljYXNlIDQ6CisJCQkJdGV4VHJhbnMzLnggPSB0ZXhUcmFuczMueSA9IHRleFRyYW5zMy56ID0gdGV4VHJhbnMzLncgPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmZi50ZXh0dXJlVHJhbnNmb3JtW3N0YWdlXVszXSkpOyAgIC8vIEZJWE1FOiBVbnBhY2sKKwkJCQl0ZXhUcmFuczMueCA9IHRleFRyYW5zMy54Lnh4eHg7CisJCQkJdGV4VHJhbnMzLnkgPSB0ZXhUcmFuczMueS55eXl5OworCQkJCXRleFRyYW5zMy56ID0gdGV4VHJhbnMzLnouenp6ejsKKwkJCQl0ZXhUcmFuczMudyA9IHRleFRyYW5zMy53Lnd3d3c7CisJCQkJdC53ID0gZG90NChULCB0ZXhUcmFuczMpOworCQkJY2FzZSAzOgorCQkJCXRleFRyYW5zMi54ID0gdGV4VHJhbnMyLnkgPSB0ZXhUcmFuczIueiA9IHRleFRyYW5zMi53ID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsZmYudGV4dHVyZVRyYW5zZm9ybVtzdGFnZV1bMl0pKTsgICAvLyBGSVhNRTogVW5wYWNrCisJCQkJdGV4VHJhbnMyLnggPSB0ZXhUcmFuczIueC54eHh4OworCQkJCXRleFRyYW5zMi55ID0gdGV4VHJhbnMyLnkueXl5eTsKKwkJCQl0ZXhUcmFuczIueiA9IHRleFRyYW5zMi56Lnp6eno7CisJCQkJdGV4VHJhbnMyLncgPSB0ZXhUcmFuczIudy53d3d3OworCQkJCXQueiA9IGRvdDQoVCwgdGV4VHJhbnMyKTsKKwkJCWNhc2UgMjoKKwkJCQl0ZXhUcmFuczEueCA9IHRleFRyYW5zMS55ID0gdGV4VHJhbnMxLnogPSB0ZXhUcmFuczEudyA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZmLnRleHR1cmVUcmFuc2Zvcm1bc3RhZ2VdWzFdKSk7ICAgLy8gRklYTUU6IFVucGFjaworCQkJCXRleFRyYW5zMS54ID0gdGV4VHJhbnMxLngueHh4eDsKKwkJCQl0ZXhUcmFuczEueSA9IHRleFRyYW5zMS55Lnl5eXk7CisJCQkJdGV4VHJhbnMxLnogPSB0ZXhUcmFuczEuei56enp6OworCQkJCXRleFRyYW5zMS53ID0gdGV4VHJhbnMxLncud3d3dzsKKwkJCQl0LnkgPSBkb3Q0KFQsIHRleFRyYW5zMSk7CisJCQljYXNlIDE6CisJCQkJdGV4VHJhbnMwLnggPSB0ZXhUcmFuczAueSA9IHRleFRyYW5zMC56ID0gdGV4VHJhbnMwLncgPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxmZi50ZXh0dXJlVHJhbnNmb3JtW3N0YWdlXVswXSkpOyAgIC8vIEZJWE1FOiBVbnBhY2sKKwkJCQl0ZXhUcmFuczAueCA9IHRleFRyYW5zMC54Lnh4eHg7CisJCQkJdGV4VHJhbnMwLnkgPSB0ZXhUcmFuczAueS55eXl5OworCQkJCXRleFRyYW5zMC56ID0gdGV4VHJhbnMwLnouenp6ejsKKwkJCQl0ZXhUcmFuczAudyA9IHRleFRyYW5zMC53Lnd3d3c7CisJCQkJdC54ID0gZG90NChULCB0ZXhUcmFuczApOworCisJCQkJci5veFtUMCArIHN0YWdlXSA9IHQueDsKKwkJCQlyLm95W1QwICsgc3RhZ2VdID0gdC55OworCQkJCXIub3pbVDAgKyBzdGFnZV0gPSB0Lno7CisJCQkJci5vd1tUMCArIHN0YWdlXSA9IHQudzsKKwkJCWNhc2UgMDoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgVmVydGV4UGlwZWxpbmU6OnByb2Nlc3NQb2ludFNpemUoUmVnaXN0ZXJzICZyKQorCXsKKwkJaWYoIXN0YXRlLnBvaW50U2l6ZUFjdGl2ZSkKKwkJeworCQkJcmV0dXJuOyAgIC8vIFVzZSBnbG9iYWwgcG9pbnRzaXplCisJCX0KKworCQlpZihzdGF0ZS5pbnB1dFtQU2l6ZV0pCisJCXsKKwkJCXIub3lbUHRzXSA9IHIudltQU2l6ZV0ueDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXIub3lbUHRzXSA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHBvaW50LnBvaW50U2l6ZSkpOworCQl9CisKKwkJaWYoc3RhdGUucG9pbnRTY2FsZUFjdGl2ZSAmJiAhc3RhdGUucHJlVHJhbnNmb3JtZWQpCisJCXsKKwkJCUNvbG9yNGYgcCA9IHRyYW5zZm9ybUJsZW5kKHIsIHIudltQb3NpdGlvbl0sIFBvaW50ZXI8Qnl0ZT4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLGZmLmNhbWVyYVRyYW5zZm9ybVQpKSwgdHJ1ZSk7CisKKwkJCUZsb2F0NCBkID0gU3FydChkb3QzKHAsIHApKTsgICAvLyBGSVhNRTogbGVuZ3RoKHApOworCisJCQlGbG9hdDQgQSA9ICpQb2ludGVyPEZsb2F0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEscG9pbnQucG9pbnRTY2FsZUEpKTsgICAvLyBGSVhNRTogVW5wYWNrCisJCQlGbG9hdDQgQiA9ICpQb2ludGVyPEZsb2F0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEscG9pbnQucG9pbnRTY2FsZUIpKTsgICAvLyBGSVhNRTogVW5wYWNrCisJCQlGbG9hdDQgQyA9ICpQb2ludGVyPEZsb2F0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEscG9pbnQucG9pbnRTY2FsZUMpKTsgICAvLyBGSVhNRTogVW5wYWNrCisKKwkJCUEgPSBSY3BTcXJ0X3BwKEEgKyBkICogKEIgKyBkICogQykpOworCisJCQlyLm95W1B0c10gPSByLm95W1B0c10gKiBGbG9hdDQoKlBvaW50ZXI8RmxvYXQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx2aWV3cG9ydEhlaWdodCkpKSAqIEE7ICAgLy8gRklYTUU6IFVucGFjaworCQl9CisJfQorCisJQ29sb3I0ZiBWZXJ0ZXhQaXBlbGluZTo6dHJhbnNmb3JtKENvbG9yNGYgJnNyYywgUG9pbnRlcjxCeXRlPiAmbWF0cml4LCBib29sIGhvbW9nZW5lb3VzKQorCXsKKwkJQ29sb3I0ZiBkc3Q7CisKKwkJQ29sb3I0ZiByb3cwOworCQlDb2xvcjRmIHJvdzE7CisJCUNvbG9yNGYgcm93MjsKKwkJQ29sb3I0ZiByb3czOworCisJCWlmKGhvbW9nZW5lb3VzKQorCQl7CisJCQlGbG9hdDQgbVs0XVs0XTsKKworCQkJZm9yKGludCBqID0gMDsgaiA8IDQ7IGorKykKKwkJCXsKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJCXsKKwkJCQkJbVtqXVtpXS54ID0gKlBvaW50ZXI8RmxvYXQ+KG1hdHJpeCArIDE2ICogaSArIDQgKiBqKTsKKwkJCQkJbVtqXVtpXS55ID0gKlBvaW50ZXI8RmxvYXQ+KG1hdHJpeCArIDE2ICogaSArIDQgKiBqKTsKKwkJCQkJbVtqXVtpXS56ID0gKlBvaW50ZXI8RmxvYXQ+KG1hdHJpeCArIDE2ICogaSArIDQgKiBqKTsKKwkJCQkJbVtqXVtpXS53ID0gKlBvaW50ZXI8RmxvYXQ+KG1hdHJpeCArIDE2ICogaSArIDQgKiBqKTsKKwkJCQl9CisJCQl9CisKKwkJCWRzdC54ID0gc3JjLnggKiBtWzBdWzBdICsgc3JjLnkgKiBtWzBdWzFdICsgc3JjLnogKiBtWzBdWzJdICsgbVswXVszXTsKKwkJCWRzdC55ID0gc3JjLnggKiBtWzFdWzBdICsgc3JjLnkgKiBtWzFdWzFdICsgc3JjLnogKiBtWzFdWzJdICsgbVsxXVszXTsKKwkJCWRzdC56ID0gc3JjLnggKiBtWzJdWzBdICsgc3JjLnkgKiBtWzJdWzFdICsgc3JjLnogKiBtWzJdWzJdICsgbVsyXVszXTsKKwkJCWRzdC53ID0gc3JjLnggKiBtWzNdWzBdICsgc3JjLnkgKiBtWzNdWzFdICsgc3JjLnogKiBtWzNdWzJdICsgbVszXVszXTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZsb2F0NCBtWzNdWzNdOworCisJCQlmb3IoaW50IGogPSAwOyBqIDwgMzsgaisrKQorCQkJeworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisJCQkJeworCQkJCQltW2pdW2ldLnggPSAqUG9pbnRlcjxGbG9hdD4obWF0cml4ICsgMTYgKiBpICsgNCAqIGopOworCQkJCQltW2pdW2ldLnkgPSAqUG9pbnRlcjxGbG9hdD4obWF0cml4ICsgMTYgKiBpICsgNCAqIGopOworCQkJCQltW2pdW2ldLnogPSAqUG9pbnRlcjxGbG9hdD4obWF0cml4ICsgMTYgKiBpICsgNCAqIGopOworCQkJCQltW2pdW2ldLncgPSAqUG9pbnRlcjxGbG9hdD4obWF0cml4ICsgMTYgKiBpICsgNCAqIGopOworCQkJCX0KKwkJCX0KKworCQkJZHN0LnggPSBzcmMueCAqIG1bMF1bMF0gKyBzcmMueSAqIG1bMF1bMV0gKyBzcmMueiAqIG1bMF1bMl07CisJCQlkc3QueSA9IHNyYy54ICogbVsxXVswXSArIHNyYy55ICogbVsxXVsxXSArIHNyYy56ICogbVsxXVsyXTsKKwkJCWRzdC56ID0gc3JjLnggKiBtWzJdWzBdICsgc3JjLnkgKiBtWzJdWzFdICsgc3JjLnogKiBtWzJdWzJdOworCQl9CisKKwkJcmV0dXJuIGRzdDsKKwl9CisKKwlDb2xvcjRmIFZlcnRleFBpcGVsaW5lOjp0cmFuc2Zvcm0oQ29sb3I0ZiAmc3JjLCBQb2ludGVyPEJ5dGU+ICZtYXRyaXgsIFVJbnQgaW5kZXhbNF0sIGJvb2wgaG9tb2dlbmVvdXMpCisJeworCQlDb2xvcjRmIGRzdDsKKwkJCisJCUNvbG9yNGYgcm93MDsKKwkJQ29sb3I0ZiByb3cxOworCQlDb2xvcjRmIHJvdzI7CisJCUNvbG9yNGYgcm93MzsKKworCQlpZihob21vZ2VuZW91cykKKwkJeworCQkJRmxvYXQ0IG1bNF1bNF07CisKKwkJCWZvcihpbnQgaiA9IDA7IGogPCA0OyBqKyspCisJCQl7CisJCQkJZm9yKGludCBpID0gMDsgaSA8IDQ7IGkrKykKKwkJCQl7CisJCQkJCW1bal1baV0ueCA9ICpQb2ludGVyPEZsb2F0PihtYXRyaXggKyAxNiAqIGkgKyA0ICogaiArIGluZGV4WzBdKTsKKwkJCQkJbVtqXVtpXS55ID0gKlBvaW50ZXI8RmxvYXQ+KG1hdHJpeCArIDE2ICogaSArIDQgKiBqICsgaW5kZXhbMV0pOworCQkJCQltW2pdW2ldLnogPSAqUG9pbnRlcjxGbG9hdD4obWF0cml4ICsgMTYgKiBpICsgNCAqIGogKyBpbmRleFsyXSk7CisJCQkJCW1bal1baV0udyA9ICpQb2ludGVyPEZsb2F0PihtYXRyaXggKyAxNiAqIGkgKyA0ICogaiArIGluZGV4WzNdKTsKKwkJCQl9CisJCQl9CisKKwkJCWRzdC54ID0gc3JjLnggKiBtWzBdWzBdICsgc3JjLnkgKiBtWzBdWzFdICsgc3JjLnogKiBtWzBdWzJdICsgbVswXVszXTsKKwkJCWRzdC55ID0gc3JjLnggKiBtWzFdWzBdICsgc3JjLnkgKiBtWzFdWzFdICsgc3JjLnogKiBtWzFdWzJdICsgbVsxXVszXTsKKwkJCWRzdC56ID0gc3JjLnggKiBtWzJdWzBdICsgc3JjLnkgKiBtWzJdWzFdICsgc3JjLnogKiBtWzJdWzJdICsgbVsyXVszXTsKKwkJCWRzdC53ID0gc3JjLnggKiBtWzNdWzBdICsgc3JjLnkgKiBtWzNdWzFdICsgc3JjLnogKiBtWzNdWzJdICsgbVszXVszXTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZsb2F0NCBtWzNdWzNdOworCisJCQlmb3IoaW50IGogPSAwOyBqIDwgMzsgaisrKQorCQkJeworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisJCQkJeworCQkJCQltW2pdW2ldLnggPSAqUG9pbnRlcjxGbG9hdD4obWF0cml4ICsgMTYgKiBpICsgNCAqIGogKyBpbmRleFswXSk7CisJCQkJCW1bal1baV0ueSA9ICpQb2ludGVyPEZsb2F0PihtYXRyaXggKyAxNiAqIGkgKyA0ICogaiArIGluZGV4WzFdKTsKKwkJCQkJbVtqXVtpXS56ID0gKlBvaW50ZXI8RmxvYXQ+KG1hdHJpeCArIDE2ICogaSArIDQgKiBqICsgaW5kZXhbMl0pOworCQkJCQltW2pdW2ldLncgPSAqUG9pbnRlcjxGbG9hdD4obWF0cml4ICsgMTYgKiBpICsgNCAqIGogKyBpbmRleFszXSk7CisJCQkJfQorCQkJfQorCisJCQlkc3QueCA9IHNyYy54ICogbVswXVswXSArIHNyYy55ICogbVswXVsxXSArIHNyYy56ICogbVswXVsyXTsKKwkJCWRzdC55ID0gc3JjLnggKiBtWzFdWzBdICsgc3JjLnkgKiBtWzFdWzFdICsgc3JjLnogKiBtWzFdWzJdOworCQkJZHN0LnogPSBzcmMueCAqIG1bMl1bMF0gKyBzcmMueSAqIG1bMl1bMV0gKyBzcmMueiAqIG1bMl1bMl07CisJCX0KKworCQlyZXR1cm4gZHN0OworCX0KKworCUNvbG9yNGYgVmVydGV4UGlwZWxpbmU6Om5vcm1hbGl6ZShDb2xvcjRmICZzcmMpCisJeworCQlDb2xvcjRmIGRzdDsKKworCQlGbG9hdDQgcmNwTGVuZ3RoID0gUmNwU3FydF9wcChkb3QzKHNyYywgc3JjKSk7CisJCQorCQlkc3QueCA9IHNyYy54ICogcmNwTGVuZ3RoOworCQlkc3QueSA9IHNyYy55ICogcmNwTGVuZ3RoOworCQlkc3QueiA9IHNyYy56ICogcmNwTGVuZ3RoOworCisJCXJldHVybiBkc3Q7CisJfQorCisJRmxvYXQ0IFZlcnRleFBpcGVsaW5lOjpwb3dlcihGbG9hdDQgJnNyYzAsIEZsb2F0NCAmc3JjMSkKKwl7CisJCUZsb2F0NCBkc3QgPSBzcmMwOworCQkJCQorCQlkc3QgPSBkc3QgKiBkc3Q7CisJCWRzdCA9IGRzdCAqIGRzdDsKKwkJZHN0ID0gRmxvYXQ0KEFzPEludDQ+KGRzdCkgLSBBczxJbnQ0PihGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikpKTsKKwkJCQkKKwkJZHN0ICo9IHNyYzE7CisKKwkJZHN0ID0gQXM8RmxvYXQ0PihJbnQ0KGRzdCkgKyBBczxJbnQ0PihGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikpKTsKKwkJZHN0ID0gUmNwU3FydF9wcChkc3QpOworCQlkc3QgPSBSY3BTcXJ0X3BwKGRzdCk7CisKKwkJcmV0dXJuIGRzdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvU2hhZGVyL1ZlcnRleFBpcGVsaW5lLmhwcCBiL3NyYy9TaGFkZXIvVmVydGV4UGlwZWxpbmUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjg1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU2hhZGVyL1ZlcnRleFBpcGVsaW5lLmhwcApAQCAtMCwwICsxLDQyIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgc3dfVmVydGV4UGlwZWxpbmVfaHBwCisjZGVmaW5lIHN3X1ZlcnRleFBpcGVsaW5lX2hwcAorCisjaW5jbHVkZSAiVmVydGV4Um91dGluZS5ocHAiCisKKyNpbmNsdWRlICJDb250ZXh0LmhwcCIKKyNpbmNsdWRlICJWZXJ0ZXhQcm9jZXNzb3IuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwljbGFzcyBWZXJ0ZXhQaXBlbGluZSA6IHB1YmxpYyBWZXJ0ZXhSb3V0aW5lCisJeworCXB1YmxpYzoKKwkJVmVydGV4UGlwZWxpbmUoY29uc3QgVmVydGV4UHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUpOworCisJCXZpcnR1YWwgflZlcnRleFBpcGVsaW5lKCk7CisKKwlwcml2YXRlOgorCQl2b2lkIHBpcGVsaW5lKFJlZ2lzdGVycyAmcik7CisJCXZvaWQgcHJvY2Vzc1RleHR1cmVDb29yZGluYXRlKFJlZ2lzdGVycyAmciwgaW50IHN0YWdlLCBDb2xvcjRmICZub3JtYWwsIENvbG9yNGYgJnBvc2l0aW9uKTsKKwkJdm9pZCBwcm9jZXNzUG9pbnRTaXplKFJlZ2lzdGVycyAmcik7CisKKwkJQ29sb3I0ZiB0cmFuc2Zvcm1CbGVuZChSZWdpc3RlcnMgJnIsIENvbG9yNGYgJnNyYywgUG9pbnRlcjxCeXRlPiAmbWF0cml4LCBib29sIGhvbW9nZW5vdXMpOworCQlDb2xvcjRmIHRyYW5zZm9ybShDb2xvcjRmICZzcmMsIFBvaW50ZXI8Qnl0ZT4gJm1hdHJpeCwgYm9vbCBob21vZ2Vub3VzKTsKKwkJQ29sb3I0ZiB0cmFuc2Zvcm0oQ29sb3I0ZiAmc3JjLCBQb2ludGVyPEJ5dGU+ICZtYXRyaXgsIFVJbnQgaW5kZXhbNF0sIGJvb2wgaG9tb2dlbm91cyk7CisJCUNvbG9yNGYgbm9ybWFsaXplKENvbG9yNGYgJnNyYyk7CisJCUZsb2F0NCBwb3dlcihGbG9hdDQgJnNyYzAsIEZsb2F0NCAmc3JjMSk7CisJfTsKK307CisKKyNlbmRpZiAgIC8vIHN3X1ZlcnRleFBpcGVsaW5lX2hwcApkaWZmIC0tZ2l0IGEvc3JjL1NoYWRlci9WZXJ0ZXhQcm9ncmFtLmNwcCBiL3NyYy9TaGFkZXIvVmVydGV4UHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExNTNiZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvVmVydGV4UHJvZ3JhbS5jcHAKQEAgLTAsMCArMSwxMTMwIEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJWZXJ0ZXhQcm9ncmFtLmhwcCIKKworI2luY2x1ZGUgIlJlbmRlcmVyLmhwcCIKKyNpbmNsdWRlICJWZXJ0ZXhTaGFkZXIuaHBwIgorI2luY2x1ZGUgIlZlcnRleC5ocHAiCisjaW5jbHVkZSAiSGFsZi5ocHAiCisjaW5jbHVkZSAiU2FtcGxlckNvcmUuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworZXh0ZXJuIGJvb2wgbG9jYWxTaGFkZXJDb25zdGFudHM7CisKK25hbWVzcGFjZSBzdworeworCVZlcnRleFByb2dyYW06OlZlcnRleFByb2dyYW0oY29uc3QgVmVydGV4UHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUsIGNvbnN0IFZlcnRleFNoYWRlciAqdmVydGV4U2hhZGVyKSA6IFZlcnRleFJvdXRpbmUoc3RhdGUpLCB2ZXJ0ZXhTaGFkZXIodmVydGV4U2hhZGVyKQorCXsKKwkJcmV0dXJucyA9IGZhbHNlOworCQlpZkRlcHRoID0gMDsKKwkJbG9vcFJlcERlcHRoID0gMDsKKwkJYnJlYWtEZXB0aCA9IDA7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDIwNDg7IGkrKykKKwkJeworCQkJbGFiZWxCbG9ja1tpXSA9IDA7CisJCX0KKwl9CisKKwlWZXJ0ZXhQcm9ncmFtOjp+VmVydGV4UHJvZ3JhbSgpCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQorCQl7CisJCQlkZWxldGUgc2FtcGxlcltpXTsKKwkJfQorCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6cGlwZWxpbmUoUmVnaXN0ZXJzICZyKQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IDQ7IGkrKykKKwkJeworCQkJc2FtcGxlcltpXSA9IG5ldyBTYW1wbGVyQ29yZShyLmNvbnN0YW50cywgc3RhdGUuc2FtcGxlclN0YXRlW2ldKTsKKwkJfQorCisJCWlmKCFzdGF0ZS5wcmVUcmFuc2Zvcm1lZCkKKwkJeworCQkJc2hhZGVyKHIpOworCQl9CisJCWVsc2UKKwkJeworCQkJcGFzc1Rocm91Z2gocik7CisJCX0KKwl9CisKKwlDb2xvcjRmIFZlcnRleFByb2dyYW06OnJlYWRDb25zdGFudChSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmc3JjLCBpbnQgb2Zmc2V0KQorCXsKKwkJQ29sb3I0ZiBjOworCisJCWludCBpID0gc3JjLmluZGV4ICsgb2Zmc2V0OworCQlib29sIHJlbGF0aXZlID0gc3JjLnJlbGF0aXZlOworCisJCWlmKCFyZWxhdGl2ZSkKKwkJeworCQkJYy5yID0gYy5nID0gYy5iID0gYy5hID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdnMuY1tpXSkpOworCisJCQljLnIgPSBjLnIueHh4eDsKKwkJCWMuZyA9IGMuZy55eXl5OworCQkJYy5iID0gYy5iLnp6eno7CisJCQljLmEgPSBjLmEud3d3dzsKKworCQkJaWYobG9jYWxTaGFkZXJDb25zdGFudHMpICAgLy8gQ29uc3RhbnQgbWF5IGJlIGtub3duIGF0IGNvbXBpbGUgdGltZQorCQkJeworCQkJCWZvcihpbnQgaiA9IDA7IGogPCB2ZXJ0ZXhTaGFkZXItPmdldExlbmd0aCgpOyBqKyspCisJCQkJeworCQkJCQljb25zdCBTaGFkZXJJbnN0cnVjdGlvbiAmaW5zdHJ1Y3Rpb24gPSAqdmVydGV4U2hhZGVyLT5nZXRJbnN0cnVjdGlvbihqKTsKKworCQkJCQlpZihpbnN0cnVjdGlvbi5nZXRPcGNvZGUoKSA9PSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9ERUYpCisJCQkJCXsKKwkJCQkJCWlmKGluc3RydWN0aW9uLmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkuaW5kZXggPT0gaSkKKwkJCQkJCXsKKwkJCQkJCQljLnIgPSBGbG9hdDQoaW5zdHJ1Y3Rpb24uZ2V0U291cmNlUGFyYW1ldGVyKDApLnZhbHVlKTsKKwkJCQkJCQljLmcgPSBGbG9hdDQoaW5zdHJ1Y3Rpb24uZ2V0U291cmNlUGFyYW1ldGVyKDEpLnZhbHVlKTsKKwkJCQkJCQljLmIgPSBGbG9hdDQoaW5zdHJ1Y3Rpb24uZ2V0U291cmNlUGFyYW1ldGVyKDIpLnZhbHVlKTsKKwkJCQkJCQljLmEgPSBGbG9hdDQoaW5zdHJ1Y3Rpb24uZ2V0U291cmNlUGFyYW1ldGVyKDMpLnZhbHVlKTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgaWYoc3JjLnJlbGF0aXZlVHlwZSA9PSBTcmM6OlBBUkFNRVRFUl9MT09QKQorCQl7CisJCQlJbnQgbG9vcENvdW50ZXIgPSByLmFMW3IubG9vcERlcHRoXTsKKworCQkJYy5yID0gYy5nID0gYy5iID0gYy5hID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdnMuY1tpXSkgKyBsb29wQ291bnRlciAqIDE2KTsKKworCQkJYy5yID0gYy5yLnh4eHg7CisJCQljLmcgPSBjLmcueXl5eTsKKwkJCWMuYiA9IGMuYi56enp6OworCQkJYy5hID0gYy5hLnd3d3c7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJbnQgaW5kZXgwOworCQkJSW50IGluZGV4MTsKKwkJCUludCBpbmRleDI7CisJCQlJbnQgaW5kZXgzOworCisJCQlGbG9hdDQgYTBfOworCisJCQlzd2l0Y2goc3JjLnJlbGF0aXZlU3dpenpsZSAmIDB4MDMpCisJCQl7CisJCQljYXNlIDA6IGEwXyA9IHIuYTAueDsgYnJlYWs7CisJCQljYXNlIDE6IGEwXyA9IHIuYTAueTsgYnJlYWs7CisJCQljYXNlIDI6IGEwXyA9IHIuYTAuejsgYnJlYWs7CisJCQljYXNlIDM6IGEwXyA9IHIuYTAudzsgYnJlYWs7CisJCQl9CisKKwkJCWluZGV4MCA9IGkgKyBSb3VuZEludChGbG9hdChhMF8ueCkpOworCQkJaW5kZXgxID0gaSArIFJvdW5kSW50KEZsb2F0KGEwXy55KSk7CisJCQlpbmRleDIgPSBpICsgUm91bmRJbnQoRmxvYXQoYTBfLnopKTsKKwkJCWluZGV4MyA9IGkgKyBSb3VuZEludChGbG9hdChhMF8udykpOworCisJCQkvLyBDbGFtcCB0byBjb25zdGFudCByZWdpc3RlciByYW5nZSwgY1syNTZdID0gezAsIDAsIDAsIDB9CisJCQlpbmRleDAgPSBJZlRoZW5FbHNlKFVJbnQoaW5kZXgwKSA+IFVJbnQoMjU2KSwgSW50KDI1NiksIGluZGV4MCk7CisJCQlpbmRleDEgPSBJZlRoZW5FbHNlKFVJbnQoaW5kZXgxKSA+IFVJbnQoMjU2KSwgSW50KDI1NiksIGluZGV4MSk7CisJCQlpbmRleDIgPSBJZlRoZW5FbHNlKFVJbnQoaW5kZXgyKSA+IFVJbnQoMjU2KSwgSW50KDI1NiksIGluZGV4Mik7CisJCQlpbmRleDMgPSBJZlRoZW5FbHNlKFVJbnQoaW5kZXgzKSA+IFVJbnQoMjU2KSwgSW50KDI1NiksIGluZGV4Myk7CisKKwkJCWMueCA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHZzLmMpICsgaW5kZXgwICogMTYsIDE2KTsKKwkJCWMueSA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHZzLmMpICsgaW5kZXgxICogMTYsIDE2KTsKKwkJCWMueiA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHZzLmMpICsgaW5kZXgyICogMTYsIDE2KTsKKwkJCWMudyA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHZzLmMpICsgaW5kZXgzICogMTYsIDE2KTsKKworCQkJdHJhbnNwb3NlNHg0KGMueCwgYy55LCBjLnosIGMudyk7CisJCX0KKworCQlyZXR1cm4gYzsKKwl9CisKKwl2b2lkIFZlcnRleFByb2dyYW06OnNoYWRlcihSZWdpc3RlcnMgJnIpCisJeworCS8vCXZlcnRleFNoYWRlci0+cHJpbnQoIlZlcnRleFNoYWRlci0lMC4xNmxsWC50eHQiLCBzdGF0ZS5zaGFkZXJIYXNoKTsKKworCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gdmVydGV4U2hhZGVyLT5nZXRWZXJzaW9uKCk7CisKKwkJci5lbmFibGVJbmRleCA9IDA7CisJCXIuc3RhY2tJbmRleCA9IDA7CisJCisJCWZvcihpbnQgaSA9IDA7IGkgPCB2ZXJ0ZXhTaGFkZXItPmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCWNvbnN0IFNoYWRlckluc3RydWN0aW9uICppbnN0cnVjdGlvbiA9IHZlcnRleFNoYWRlci0+Z2V0SW5zdHJ1Y3Rpb24oaSk7CisJCQlPcDo6T3Bjb2RlIG9wY29kZSA9IGluc3RydWN0aW9uLT5nZXRPcGNvZGUoKTsKKworCQkvLwkjaWZuZGVmIE5ERUJVRyAgIC8vIEZJWE1FOiBDZW50cmFsaXplIGRlYnVnIG91dHB1dCBjb250cm9sCisJCS8vCQl2ZXJ0ZXhTaGFkZXItPnByaW50SW5zdHJ1Y3Rpb24oaSwgImRlYnVnLnR4dCIpOworCQkvLwkjZW5kaWYKKworCQkJaWYob3Bjb2RlID09IE9wOjpPUENPREVfRENMIHx8IG9wY29kZSA9PSBPcDo6T1BDT0RFX0RFRiB8fCBvcGNvZGUgPT0gT3A6Ok9QQ09ERV9ERUZJIHx8IG9wY29kZSA9PSBPcDo6T1BDT0RFX0RFRkIpCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCURzdCBkZXN0ID0gaW5zdHJ1Y3Rpb24tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCk7CisJCQlTcmMgc3JjMCA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMCk7CisJCQlTcmMgc3JjMSA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMSk7CisJCQlTcmMgc3JjMiA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMik7CisJCQlTcmMgc3JjMyA9IGluc3RydWN0aW9uLT5nZXRTb3VyY2VQYXJhbWV0ZXIoMyk7CisKKwkJCWJvb2wgcHJlZGljYXRlID0gaW5zdHJ1Y3Rpb24tPmlzUHJlZGljYXRlKCk7CisJCQlpbnQgc2l6ZSA9IHZlcnRleFNoYWRlci0+c2l6ZShvcGNvZGUpOworCQkJVXNhZ2UgdXNhZ2UgPSBpbnN0cnVjdGlvbi0+Z2V0VXNhZ2UoKTsKKwkJCXVuc2lnbmVkIGNoYXIgdXNhZ2VJbmRleCA9IGluc3RydWN0aW9uLT5nZXRVc2FnZUluZGV4KCk7CisJCQlDb250cm9sIGNvbnRyb2wgPSBpbnN0cnVjdGlvbi0+Z2V0Q29udHJvbCgpOworCQkJYm9vbCBpbnRlZ2VyID0gZGVzdC50eXBlID09IERzdDo6UEFSQU1FVEVSX0FERFI7CisJCQlib29sIHBwID0gZGVzdC5wYXJ0aWFsUHJlY2lzaW9uOworCisJCQlDb2xvcjRmIGQ7CisJCQlDb2xvcjRmIHMwOworCQkJQ29sb3I0ZiBzMTsKKwkJCUNvbG9yNGYgczI7CisJCQlDb2xvcjRmIHMzOworCisJCQlpZihzcmMwLnR5cGUgIT0gU3JjOjpQQVJBTUVURVJfVk9JRCkgczAgPSByZWcociwgc3JjMCk7CisJCQlpZihzcmMxLnR5cGUgIT0gU3JjOjpQQVJBTUVURVJfVk9JRCkgczEgPSByZWcociwgc3JjMSk7CisJCQlpZihzcmMyLnR5cGUgIT0gU3JjOjpQQVJBTUVURVJfVk9JRCkgczIgPSByZWcociwgc3JjMik7CisJCQlpZihzcmMzLnR5cGUgIT0gU3JjOjpQQVJBTUVURVJfVk9JRCkgczMgPSByZWcociwgc3JjMyk7CisKKwkJCXN3aXRjaChvcGNvZGUpCisJCQl7CisJCQljYXNlIE9wOjpPUENPREVfVlNfMV8wOgkJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9WU18xXzE6CQkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1ZTXzJfMDoJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfVlNfMl94OgkJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9WU18yX3N3OgkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1ZTXzNfMDoJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfVlNfM19zdzoJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9EQ0w6CQkJCQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0RFRjoJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfREVGSToJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfREVGQjoJCQkJCQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTk9QOgkJCQkJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9BQlM6CQlhYnMoZCwgczApOwkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0FERDoJCWFkZChkLCBzMCwgczEpOwkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfQ1JTOgkJY3JzKGQsIHMwLCBzMSk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9EUDM6CQlkcDMoZCwgczAsIHMxKTsJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0RQNDoJCWRwNChkLCBzMCwgczEpOwkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfRFNUOgkJZHN0KGQsIHMwLCBzMSk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9FWFA6CQlleHAoZCwgczAsIHBwKTsJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0VYUFA6CQlleHBwKGQsIHMwLCB2ZXJzaW9uKTsJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9GUkM6CQlmcmMoZCwgczApOwkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0xJVDoJCWxpdChkLCBzMCk7CQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTE9HOgkJbG9nKGQsIHMwLCBwcCk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9MT0dQOgkJbG9ncChkLCBzMCwgdmVyc2lvbik7CQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTFJQOgkJbHJwKGQsIHMwLCBzMSwgczIpOwkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9NM1gyOgkJTTNYMihyLCBkLCBzMCwgc3JjMSk7CQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTTNYMzoJCU0zWDMociwgZCwgczAsIHNyYzEpOwkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX00zWDQ6CQlNM1g0KHIsIGQsIHMwLCBzcmMxKTsJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9NNFgzOgkJTTRYMyhyLCBkLCBzMCwgc3JjMSk7CQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTTRYNDoJCU00WDQociwgZCwgczAsIHNyYzEpOwkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX01BRDoJCW1hZChkLCBzMCwgczEsIHMyKTsJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTUFYOgkJbWF4KGQsIHMwLCBzMSk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9NSU46CQltaW4oZCwgczAsIHMxKTsJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX01PVjoJCW1vdihkLCBzMCwgaW50ZWdlcik7CQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTU9WQToJCW1vdihkLCBzMCk7CQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTVVMOgkJbXVsKGQsIHMwLCBzMSk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9OUk06CQlucm0oZCwgczAsIHBwKTsJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1BPVzoJCXBvdyhkLCBzMCwgczEsIHBwKTsJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfUkNQOgkJcmNwKGQsIHMwLCBwcCk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9SU1E6CQlyc3EoZCwgczAsIHBwKTsJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1NHRToJCXNnZShkLCBzMCwgczEpOwkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfU0dOOgkJc2duKGQsIHMwKTsJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9TSU5DT1M6CQlzaW5jb3MoZCwgczAsIHBwKTsJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfU0xUOgkJc2x0KGQsIHMwLCBzMSk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9TVUI6CQlzdWIoZCwgczAsIHMxKTsJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0JSRUFLOgkJQlJFQUsocik7CQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfQlJFQUtDOgkJQlJFQUtDKHIsIHMwLCBzMSwgY29udHJvbCk7CQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9CUkVBS1A6CQlCUkVBS1Aociwgc3JjMCk7CQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0NBTEw6CQlDQUxMKHIsIGRlc3QuaW5kZXgpOwkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0NBTExOWjoJCUNBTExOWihyLCBkZXN0LmluZGV4LCBzcmMwKTsJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfRUxTRToJCUVMU0Uocik7CQkJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfRU5ESUY6CQlFTkRJRihyKTsJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9FTkRMT09QOglFTkRMT09QKHIpOwkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0VORFJFUDoJCUVORFJFUChyKTsJCQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9JRjoJCQlJRihyLCBzcmMwKTsJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0lGQzoJCUlGQyhyLCBzMCwgczEsIGNvbnRyb2wpOwkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTEFCRUw6CQlMQUJFTChkZXN0LmluZGV4KTsJCQkJYnJlYWs7CisJCQljYXNlIE9wOjpPUENPREVfTE9PUDoJCUxPT1Aociwgc3JjMSk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9SRVA6CQlSRVAociwgc3JjMCk7CQkJCQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9SRVQ6CQlSRVQocik7CQkJCQkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX1NFVFA6CQlzZXRwKGQsIHMwLCBzMSwgY29udHJvbCk7CQlicmVhazsKKwkJCWNhc2UgT3A6Ok9QQ09ERV9URVhMREw6CQlURVhMREwociwgZCwgczAsIHNyYzEpOwkJCWJyZWFrOworCQkJY2FzZSBPcDo6T1BDT0RFX0VORDoJCQkJCQkJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisKKwkJCWlmKGRlc3QudHlwZSAhPSBEc3Q6OlBBUkFNRVRFUl9WT0lEICYmIGRlc3QudHlwZSAhPSBEc3Q6OlBBUkFNRVRFUl9MQUJFTCkKKwkJCXsKKwkJCQlpZihkZXN0LnNhdHVyYXRlKQorCQkJCXsKKwkJCQkJaWYoZGVzdC54KSBkLnIgPSBNYXgoZC5yLCBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworCQkJCQlpZihkZXN0LnkpIGQuZyA9IE1heChkLmcsIEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSk7CisJCQkJCWlmKGRlc3QueikgZC5iID0gTWF4KGQuYiwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKwkJCQkJaWYoZGVzdC53KSBkLmEgPSBNYXgoZC5hLCBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworCisJCQkJCWlmKGRlc3QueCkgZC5yID0gTWluKGQuciwgRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpKTsKKwkJCQkJaWYoZGVzdC55KSBkLmcgPSBNaW4oZC5nLCBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikpOworCQkJCQlpZihkZXN0LnopIGQuYiA9IE1pbihkLmIsIEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSk7CisJCQkJCWlmKGRlc3QudykgZC5hID0gTWluKGQuYSwgRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpKTsKKwkJCQl9CisKKwkJCQlpZih2ZXJ0ZXhTaGFkZXItPmNvbnRhaW5zRHluYW1pY0JyYW5jaGluZygpKQorCQkJCXsKKwkJCQkJQ29sb3I0ZiBwRHN0OyAgIC8vIEZJWE1FOiBSZW5hbWUKKworCQkJCQlzd2l0Y2goZGVzdC50eXBlKQorCQkJCQl7CisJCQkJCWNhc2UgRHN0OjpQQVJBTUVURVJfVk9JRDoJCQkJCQkJCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9URU1QOgkJcERzdCA9IHIucltkZXN0LmluZGV4XTsJCQkJCQkJCQkJCWJyZWFrOworCQkJCQljYXNlIERzdDo6UEFSQU1FVEVSX0FERFI6CQlwRHN0ID0gci5hMDsJCQkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRHN0OjpQQVJBTUVURVJfUkFTVE9VVDoKKwkJCQkJCXN3aXRjaChkZXN0LmluZGV4KQorCQkJCQkJeworCQkJCQkJY2FzZSAwOgorCQkJCQkJCWlmKGRlc3QueCkgcERzdC54ID0gci5veFtQb3NdOworCQkJCQkJCWlmKGRlc3QueSkgcERzdC55ID0gci5veVtQb3NdOworCQkJCQkJCWlmKGRlc3QueikgcERzdC56ID0gci5veltQb3NdOworCQkJCQkJCWlmKGRlc3QudykgcERzdC53ID0gci5vd1tQb3NdOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAxOgorCQkJCQkJCXBEc3QueCA9IHIub3hbRm9nXTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlwRHN0LnggPSByLm95W1B0c107CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9BVFRST1VUOgorCQkJCQkJaWYoZGVzdC54KSBwRHN0LnggPSByLm94W0QwICsgZGVzdC5pbmRleF07CisJCQkJCQlpZihkZXN0LnkpIHBEc3QueSA9IHIub3lbRDAgKyBkZXN0LmluZGV4XTsKKwkJCQkJCWlmKGRlc3QueikgcERzdC56ID0gci5veltEMCArIGRlc3QuaW5kZXhdOworCQkJCQkJaWYoZGVzdC53KSBwRHN0LncgPSByLm93W0QwICsgZGVzdC5pbmRleF07CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9URVhDUkRPVVQ6CisJCQkJLy8JY2FzZSBEc3Q6OlBBUkFNRVRFUl9PVVRQVVQ6CisJCQkJCQlpZih2ZXJzaW9uIDwgMHgwMzAwKQorCQkJCQkJeworCQkJCQkJCWlmKGRlc3QueCkgcERzdC54ID0gci5veFtUMCArIGRlc3QuaW5kZXhdOworCQkJCQkJCWlmKGRlc3QueSkgcERzdC55ID0gci5veVtUMCArIGRlc3QuaW5kZXhdOworCQkJCQkJCWlmKGRlc3QueikgcERzdC56ID0gci5veltUMCArIGRlc3QuaW5kZXhdOworCQkJCQkJCWlmKGRlc3QudykgcERzdC53ID0gci5vd1tUMCArIGRlc3QuaW5kZXhdOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWlmKCFkZXN0LnJlbGF0aXZlKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYoZGVzdC54KSBwRHN0LnggPSByLm94W2Rlc3QuaW5kZXhdOworCQkJCQkJCQlpZihkZXN0LnkpIHBEc3QueSA9IHIub3lbZGVzdC5pbmRleF07CisJCQkJCQkJCWlmKGRlc3QueikgcERzdC56ID0gci5veltkZXN0LmluZGV4XTsKKwkJCQkJCQkJaWYoZGVzdC53KSBwRHN0LncgPSByLm93W2Rlc3QuaW5kZXhdOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlJbnQgYUwgPSByLmFMW3IubG9vcERlcHRoXTsKKworCQkJCQkJCQlpZihkZXN0LngpIHBEc3QueCA9IHIub3hbZGVzdC5pbmRleCArIGFMXTsKKwkJCQkJCQkJaWYoZGVzdC55KSBwRHN0LnkgPSByLm95W2Rlc3QuaW5kZXggKyBhTF07CisJCQkJCQkJCWlmKGRlc3QueikgcERzdC56ID0gci5veltkZXN0LmluZGV4ICsgYUxdOworCQkJCQkJCQlpZihkZXN0LncpIHBEc3QudyA9IHIub3dbZGVzdC5pbmRleCArIGFMXTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9MQUJFTDoJCQkJCQkJCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9QUkVESUNBVEU6CXBEc3QgPSByLnAwOwkJCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9JTlBVVDoJCQkJCQkJCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJCX0KKworCQkJCQlJbnQ0IGVuYWJsZSA9IHIuZW5hYmxlU3RhY2tbci5lbmFibGVJbmRleF0gJiByLmVuYWJsZUJyZWFrOworCisJCQkJCUludDQgeEVuYWJsZSA9IGVuYWJsZTsKKwkJCQkJSW50NCB5RW5hYmxlID0gZW5hYmxlOworCQkJCQlJbnQ0IHpFbmFibGUgPSBlbmFibGU7CisJCQkJCUludDQgd0VuYWJsZSA9IGVuYWJsZTsKKworCQkJCQlpZihwcmVkaWNhdGUpCisJCQkJCXsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgcFN3aXp6bGUgPSBpbnN0cnVjdGlvbi0+Z2V0UHJlZGljYXRlU3dpenpsZSgpOworCisJCQkJCQlGbG9hdDQgeFByZWRpY2F0ZSA9IHIucDBbKHBTd2l6emxlID4+IDApICYgMHgwM107CisJCQkJCQlGbG9hdDQgeVByZWRpY2F0ZSA9IHIucDBbKHBTd2l6emxlID4+IDIpICYgMHgwM107CisJCQkJCQlGbG9hdDQgelByZWRpY2F0ZSA9IHIucDBbKHBTd2l6emxlID4+IDQpICYgMHgwM107CisJCQkJCQlGbG9hdDQgd1ByZWRpY2F0ZSA9IHIucDBbKHBTd2l6emxlID4+IDYpICYgMHgwM107CisKKwkJCQkJCWlmKCFpbnN0cnVjdGlvbi0+aXNQcmVkaWNhdGVOb3QoKSkKKwkJCQkJCXsKKwkJCQkJCQlpZihkZXN0LngpIHhFbmFibGUgPSB4RW5hYmxlICYgQXM8SW50ND4oeFByZWRpY2F0ZSk7CisJCQkJCQkJaWYoZGVzdC55KSB5RW5hYmxlID0geUVuYWJsZSAmIEFzPEludDQ+KHlQcmVkaWNhdGUpOworCQkJCQkJCWlmKGRlc3QueikgekVuYWJsZSA9IHpFbmFibGUgJiBBczxJbnQ0Pih6UHJlZGljYXRlKTsKKwkJCQkJCQlpZihkZXN0LncpIHdFbmFibGUgPSB3RW5hYmxlICYgQXM8SW50ND4od1ByZWRpY2F0ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJaWYoZGVzdC54KSB4RW5hYmxlID0geEVuYWJsZSAmIH5BczxJbnQ0Pih4UHJlZGljYXRlKTsKKwkJCQkJCQlpZihkZXN0LnkpIHlFbmFibGUgPSB5RW5hYmxlICYgfkFzPEludDQ+KHlQcmVkaWNhdGUpOworCQkJCQkJCWlmKGRlc3QueikgekVuYWJsZSA9IHpFbmFibGUgJiB+QXM8SW50ND4oelByZWRpY2F0ZSk7CisJCQkJCQkJaWYoZGVzdC53KSB3RW5hYmxlID0gd0VuYWJsZSAmIH5BczxJbnQ0Pih3UHJlZGljYXRlKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmKGRlc3QueCkgZC54ID0gQXM8RmxvYXQ0PihBczxJbnQ0PihkLngpICYgeEVuYWJsZSk7CisJCQkJCWlmKGRlc3QueSkgZC55ID0gQXM8RmxvYXQ0PihBczxJbnQ0PihkLnkpICYgeUVuYWJsZSk7CisJCQkJCWlmKGRlc3QueikgZC56ID0gQXM8RmxvYXQ0PihBczxJbnQ0PihkLnopICYgekVuYWJsZSk7CisJCQkJCWlmKGRlc3QudykgZC53ID0gQXM8RmxvYXQ0PihBczxJbnQ0PihkLncpICYgd0VuYWJsZSk7CisKKwkJCQkJaWYoZGVzdC54KSBkLnggPSBBczxGbG9hdDQ+KEFzPEludDQ+KGQueCkgfCAoQXM8SW50ND4ocERzdC54KSAmIH54RW5hYmxlKSk7CisJCQkJCWlmKGRlc3QueSkgZC55ID0gQXM8RmxvYXQ0PihBczxJbnQ0PihkLnkpIHwgKEFzPEludDQ+KHBEc3QueSkgJiB+eUVuYWJsZSkpOworCQkJCQlpZihkZXN0LnopIGQueiA9IEFzPEZsb2F0ND4oQXM8SW50ND4oZC56KSB8IChBczxJbnQ0PihwRHN0LnopICYgfnpFbmFibGUpKTsKKwkJCQkJaWYoZGVzdC53KSBkLncgPSBBczxGbG9hdDQ+KEFzPEludDQ+KGQudykgfCAoQXM8SW50ND4ocERzdC53KSAmIH53RW5hYmxlKSk7CisJCQkJfQorCisJCQkJc3dpdGNoKGRlc3QudHlwZSkKKwkJCQl7CisJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9WT0lEOgorCQkJCQlicmVhazsKKwkJCQljYXNlIERzdDo6UEFSQU1FVEVSX1RFTVA6CisJCQkJCWlmKGRlc3QueCkgci5yW2Rlc3QuaW5kZXhdLnggPSBkLng7CisJCQkJCWlmKGRlc3QueSkgci5yW2Rlc3QuaW5kZXhdLnkgPSBkLnk7CisJCQkJCWlmKGRlc3Queikgci5yW2Rlc3QuaW5kZXhdLnogPSBkLno7CisJCQkJCWlmKGRlc3Qudykgci5yW2Rlc3QuaW5kZXhdLncgPSBkLnc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRHN0OjpQQVJBTUVURVJfQUREUjoKKwkJCQkJaWYoZGVzdC54KSByLmEwLnggPSBkLng7CisJCQkJCWlmKGRlc3QueSkgci5hMC55ID0gZC55OworCQkJCQlpZihkZXN0LnopIHIuYTAueiA9IGQuejsKKwkJCQkJaWYoZGVzdC53KSByLmEwLncgPSBkLnc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRHN0OjpQQVJBTUVURVJfUkFTVE9VVDoKKwkJCQkJc3dpdGNoKGRlc3QuaW5kZXgpCisJCQkJCXsKKwkJCQkJY2FzZSAwOgorCQkJCQkJaWYoZGVzdC54KSByLm94W1Bvc10gPSBkLng7CisJCQkJCQlpZihkZXN0LnkpIHIub3lbUG9zXSA9IGQueTsKKwkJCQkJCWlmKGRlc3Queikgci5veltQb3NdID0gZC56OworCQkJCQkJaWYoZGVzdC53KSByLm93W1Bvc10gPSBkLnc7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJci5veFtGb2ddID0gZC54OworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoJCQorCQkJCQkJci5veVtQdHNdID0gZC54OworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CUFTU0VSVChmYWxzZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9BVFRST1VUOgkKKwkJCQkJaWYoZGVzdC54KSByLm94W0QwICsgZGVzdC5pbmRleF0gPSBkLng7CisJCQkJCWlmKGRlc3QueSkgci5veVtEMCArIGRlc3QuaW5kZXhdID0gZC55OworCQkJCQlpZihkZXN0LnopIHIub3pbRDAgKyBkZXN0LmluZGV4XSA9IGQuejsKKwkJCQkJaWYoZGVzdC53KSByLm93W0QwICsgZGVzdC5pbmRleF0gPSBkLnc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRHN0OjpQQVJBTUVURVJfVEVYQ1JET1VUOgorCQkJLy8JY2FzZSBEc3Q6OlBBUkFNRVRFUl9PVVRQVVQ6CisJCQkJCWlmKHZlcnNpb24gPCAweDAzMDApCisJCQkJCXsKKwkJCQkJCWlmKGRlc3QueCkgci5veFtUMCArIGRlc3QuaW5kZXhdID0gZC54OworCQkJCQkJaWYoZGVzdC55KSByLm95W1QwICsgZGVzdC5pbmRleF0gPSBkLnk7CisJCQkJCQlpZihkZXN0LnopIHIub3pbVDAgKyBkZXN0LmluZGV4XSA9IGQuejsKKwkJCQkJCWlmKGRlc3Qudykgci5vd1tUMCArIGRlc3QuaW5kZXhdID0gZC53OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWYoIWRlc3QucmVsYXRpdmUpCisJCQkJCQl7CisJCQkJCQkJaWYoZGVzdC54KSByLm94W2Rlc3QuaW5kZXhdID0gZC54OworCQkJCQkJCWlmKGRlc3QueSkgci5veVtkZXN0LmluZGV4XSA9IGQueTsKKwkJCQkJCQlpZihkZXN0LnopIHIub3pbZGVzdC5pbmRleF0gPSBkLno7CisJCQkJCQkJaWYoZGVzdC53KSByLm93W2Rlc3QuaW5kZXhdID0gZC53OworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCUludCBhTCA9IHIuYUxbci5sb29wRGVwdGhdOworCisJCQkJCQkJaWYoZGVzdC54KSByLm94W2Rlc3QuaW5kZXggKyBhTF0gPSBkLng7CisJCQkJCQkJaWYoZGVzdC55KSByLm95W2Rlc3QuaW5kZXggKyBhTF0gPSBkLnk7CisJCQkJCQkJaWYoZGVzdC56KSByLm96W2Rlc3QuaW5kZXggKyBhTF0gPSBkLno7CisJCQkJCQkJaWYoZGVzdC53KSByLm93W2Rlc3QuaW5kZXggKyBhTF0gPSBkLnc7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEc3Q6OlBBUkFNRVRFUl9MQUJFTDoJCQkJCQkJCQkJCQkJCQkJCQlicmVhazsKKwkJCQljYXNlIERzdDo6UEFSQU1FVEVSX1BSRURJQ0FURToJci5wMCA9IGQ7CQkJCQkJCQkJCQkJCQlicmVhazsKKwkJCQljYXNlIERzdDo6UEFSQU1FVEVSX0lOUFVUOgkJCQkJCQkJCQkJCQkJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYocmV0dXJucykKKwkJeworCQkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2socmV0dXJuQmxvY2spOworCQl9CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpwYXNzVGhyb3VnaChSZWdpc3RlcnMgJnIpCisJeworCQlpZih2ZXJ0ZXhTaGFkZXIpCisJCXsKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCAxMjsgaSsrKQorCQkJeworCQkJCXVuc2lnbmVkIGNoYXIgdXNhZ2UgPSB2ZXJ0ZXhTaGFkZXItPm91dHB1dFtpXVswXS51c2FnZTsKKwkJCQl1bnNpZ25lZCBjaGFyIGluZGV4ID0gdmVydGV4U2hhZGVyLT5vdXRwdXRbaV1bMF0uaW5kZXg7CisKKwkJCQlzd2l0Y2godXNhZ2UpCisJCQkJeworCQkJCWNhc2UgMHhGRjoKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246OlVTQUdFX1BTSVpFOgorCQkJCQlyLm95W2ldID0gci52W2ldLng7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9URVhDT09SRDoKKwkJCQkJci5veFtpXSA9IHIudltpXS54OworCQkJCQlyLm95W2ldID0gci52W2ldLnk7CisJCQkJCXIub3pbaV0gPSByLnZbaV0uejsKKwkJCQkJci5vd1tpXSA9IHIudltpXS53OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfUE9TSVRJT046CisJCQkJCXIub3hbaV0gPSByLnZbaV0ueDsKKwkJCQkJci5veVtpXSA9IHIudltpXS55OworCQkJCQlyLm96W2ldID0gci52W2ldLno7CisJCQkJCXIub3dbaV0gPSByLnZbaV0udzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246OlVTQUdFX0NPTE9SOgorCQkJCQlyLm94W2ldID0gci52W2ldLng7CisJCQkJCXIub3lbaV0gPSByLnZbaV0ueTsKKwkJCQkJci5veltpXSA9IHIudltpXS56OworCQkJCQlyLm93W2ldID0gci52W2ldLnc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9GT0c6CisJCQkJCXIub3hbaV0gPSByLnZbaV0ueDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlyLm94W1Bvc10gPSByLnZbUG9zaXRpb25UXS54OworCQkJci5veVtQb3NdID0gci52W1Bvc2l0aW9uVF0ueTsKKwkJCXIub3pbUG9zXSA9IHIudltQb3NpdGlvblRdLno7CisJCQlyLm93W1Bvc10gPSByLnZbUG9zaXRpb25UXS53OworCisJCQlmb3IoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJeworCQkJCXIub3hbRDAgKyBpXSA9IHIudltDb2xvcjAgKyBpXS54OworCQkJCXIub3lbRDAgKyBpXSA9IHIudltDb2xvcjAgKyBpXS55OworCQkJCXIub3pbRDAgKyBpXSA9IHIudltDb2xvcjAgKyBpXS56OworCQkJCXIub3dbRDAgKyBpXSA9IHIudltDb2xvcjAgKyBpXS53OworCQkJfQorCisJCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKQorCQkJeworCQkJCXIub3hbVDAgKyBpXSA9IHIudltUZXhDb29yZDAgKyBpXS54OworCQkJCXIub3lbVDAgKyBpXSA9IHIudltUZXhDb29yZDAgKyBpXS55OworCQkJCXIub3pbVDAgKyBpXSA9IHIudltUZXhDb29yZDAgKyBpXS56OworCQkJCXIub3dbVDAgKyBpXSA9IHIudltUZXhDb29yZDAgKyBpXS53OworCQkJfQorCisJCQlyLm95W1B0c10gPSByLnZbUFNpemVdLng7CisJCX0KKwl9CisKKwlDb2xvcjRmIFZlcnRleFByb2dyYW06OnJlZyhSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmc3JjLCBpbnQgb2Zmc2V0KQorCXsKKwkJaW50IGkgPSBzcmMuaW5kZXggKyBvZmZzZXQ7CisKKwkJQ29sb3I0ZiByZWc7CisKKwkJaWYoc3JjLnR5cGUgPT0gU3JjOjpQQVJBTUVURVJfQ09OU1QpCisJCXsKKwkJCXJlZyA9IHJlYWRDb25zdGFudChyLCBzcmMsIG9mZnNldCk7CisJCX0KKwkJCisJCXN3aXRjaChzcmMudHlwZSkKKwkJeworCQljYXNlIFNyYzo6UEFSQU1FVEVSX1RFTVA6CQkJcmVnID0gci5yW2ldOwlicmVhazsKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9DT05TVDoJCQkJCQkJYnJlYWs7CisJCWNhc2UgU3JjOjpQQVJBTUVURVJfSU5QVVQ6CQkJcmVnID0gci52W2ldOwlicmVhazsKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9WT0lEOgkJCXJldHVybiByLnJbMF07ICAgLy8gRHVtbXkKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9GTE9BVExJVEVSQUw6CXJldHVybiByLnJbMF07ICAgLy8gRHVtbXkKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9BRERSOgkJCXJlZyA9IHIuYTA7CQlicmVhazsKKwkJY2FzZSBTcmM6OlBBUkFNRVRFUl9DT05TVEJPT0w6CQlyZXR1cm4gci5yWzBdOyAgIC8vIER1bW15CisJCWNhc2UgU3JjOjpQQVJBTUVURVJfQ09OU1RJTlQ6CQlyZXR1cm4gci5yWzBdOyAgIC8vIER1bW15CisJCWNhc2UgU3JjOjpQQVJBTUVURVJfTE9PUDoJCQlyZXR1cm4gci5yWzBdOyAgIC8vIER1bW15CisJCWNhc2UgU3JjOjpQQVJBTUVURVJfUFJFRElDQVRFOgkJcmV0dXJuIHIuclswXTsgICAvLyBEdW1teQorCQljYXNlIFNyYzo6UEFSQU1FVEVSX1NBTVBMRVI6CQlyZXR1cm4gci5yWzBdOyAgIC8vIER1bW15CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJQ29sb3I0ZiBtb2Q7CisKKwkJbW9kLnggPSByZWdbKHNyYy5zd2l6emxlID4+IDApICYgMHgwM107CisJCW1vZC55ID0gcmVnWyhzcmMuc3dpenpsZSA+PiAyKSAmIDB4MDNdOworCQltb2QueiA9IHJlZ1soc3JjLnN3aXp6bGUgPj4gNCkgJiAweDAzXTsKKwkJbW9kLncgPSByZWdbKHNyYy5zd2l6emxlID4+IDYpICYgMHgwM107CisKKwkJc3dpdGNoKHNyYy5tb2RpZmllcikKKwkJeworCQljYXNlIFNyYzo6TU9ESUZJRVJfTk9ORToKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfTkVHQVRFOgorCQkJbW9kLnggPSAtbW9kLng7CisJCQltb2QueSA9IC1tb2QueTsKKwkJCW1vZC56ID0gLW1vZC56OworCQkJbW9kLncgPSAtbW9kLnc7CisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX0JJQVM6CisJCQlBU1NFUlQoZmFsc2UpOyAgIC8vIE5PVEU6IFVuaW1wbGVtZW50ZWQKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfQklBU19ORUdBVEU6CisJCQlBU1NFUlQoZmFsc2UpOyAgIC8vIE5PVEU6IFVuaW1wbGVtZW50ZWQKKwkJCWJyZWFrOworCQljYXNlIFNyYzo6TU9ESUZJRVJfU0lHTjoKKwkJCUFTU0VSVChmYWxzZSk7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZAorCQkJYnJlYWs7CisJCWNhc2UgU3JjOjpNT0RJRklFUl9TSUdOX05FR0FURToKKwkJCUFTU0VSVChmYWxzZSk7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZAorCQkJYnJlYWs7CisJCWNhc2UgU3JjOjpNT0RJRklFUl9DT01QTEVNRU5UOgorCQkJQVNTRVJUKGZhbHNlKTsgICAvLyBOT1RFOiBVbmltcGxlbWVudGVkCisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX1gyOgorCQkJQVNTRVJUKGZhbHNlKTsgICAvLyBOT1RFOiBVbmltcGxlbWVudGVkCisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX1gyX05FR0FURToKKwkJCUFTU0VSVChmYWxzZSk7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZAorCQkJYnJlYWs7CisJCWNhc2UgU3JjOjpNT0RJRklFUl9EWjoKKwkJCUFTU0VSVChmYWxzZSk7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZAorCQkJYnJlYWs7CisJCWNhc2UgU3JjOjpNT0RJRklFUl9EVzoKKwkJCUFTU0VSVChmYWxzZSk7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZAorCQkJYnJlYWs7CisJCWNhc2UgU3JjOjpNT0RJRklFUl9BQlM6CisJCQltb2QueCA9IEFicyhtb2QueCk7CisJCQltb2QueSA9IEFicyhtb2QueSk7CisJCQltb2QueiA9IEFicyhtb2Queik7CisJCQltb2QudyA9IEFicyhtb2Qudyk7CisJCQlicmVhazsKKwkJY2FzZSBTcmM6Ok1PRElGSUVSX0FCU19ORUdBVEU6CisJCQltb2QueCA9IC1BYnMobW9kLngpOworCQkJbW9kLnkgPSAtQWJzKG1vZC55KTsKKwkJCW1vZC56ID0gLUFicyhtb2Queik7CisJCQltb2QudyA9IC1BYnMobW9kLncpOworCQkJYnJlYWs7CisJCWNhc2UgU3JjOjpNT0RJRklFUl9OT1Q6CisJCQlVTklNUExFTUVOVEVEKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gbW9kOworCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6TTNYMihSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgU3JjICZzcmMxKQorCXsKKwkJQ29sb3I0ZiByb3cwID0gcmVnKHIsIHNyYzEsIDApOworCQlDb2xvcjRmIHJvdzEgPSByZWcociwgc3JjMSwgMSk7CisKKwkJZHN0LnggPSBkb3QzKHNyYzAsIHJvdzApOworCQlkc3QueSA9IGRvdDMoc3JjMCwgcm93MSk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpNM1gzKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBTcmMgJnNyYzEpCisJeworCQlDb2xvcjRmIHJvdzAgPSByZWcociwgc3JjMSwgMCk7CisJCUNvbG9yNGYgcm93MSA9IHJlZyhyLCBzcmMxLCAxKTsKKwkJQ29sb3I0ZiByb3cyID0gcmVnKHIsIHNyYzEsIDIpOworCisJCWRzdC54ID0gZG90MyhzcmMwLCByb3cwKTsKKwkJZHN0LnkgPSBkb3QzKHNyYzAsIHJvdzEpOworCQlkc3QueiA9IGRvdDMoc3JjMCwgcm93Mik7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpNM1g0KFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBTcmMgJnNyYzEpCisJeworCQlDb2xvcjRmIHJvdzAgPSByZWcociwgc3JjMSwgMCk7CisJCUNvbG9yNGYgcm93MSA9IHJlZyhyLCBzcmMxLCAxKTsKKwkJQ29sb3I0ZiByb3cyID0gcmVnKHIsIHNyYzEsIDIpOworCQlDb2xvcjRmIHJvdzMgPSByZWcociwgc3JjMSwgMyk7CisKKwkJZHN0LnggPSBkb3QzKHNyYzAsIHJvdzApOworCQlkc3QueSA9IGRvdDMoc3JjMCwgcm93MSk7CisJCWRzdC56ID0gZG90MyhzcmMwLCByb3cyKTsKKwkJZHN0LncgPSBkb3QzKHNyYzAsIHJvdzMpOworCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6TTRYMyhSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgU3JjICZzcmMxKQorCXsKKwkJQ29sb3I0ZiByb3cwID0gcmVnKHIsIHNyYzEsIDApOworCQlDb2xvcjRmIHJvdzEgPSByZWcociwgc3JjMSwgMSk7CisJCUNvbG9yNGYgcm93MiA9IHJlZyhyLCBzcmMxLCAyKTsKKworCQlkc3QueCA9IGRvdDQoc3JjMCwgcm93MCk7CisJCWRzdC55ID0gZG90NChzcmMwLCByb3cxKTsKKwkJZHN0LnogPSBkb3Q0KHNyYzAsIHJvdzIpOworCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6TTRYNChSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgU3JjICZzcmMxKQorCXsKKwkJQ29sb3I0ZiByb3cwID0gcmVnKHIsIHNyYzEsIDApOworCQlDb2xvcjRmIHJvdzEgPSByZWcociwgc3JjMSwgMSk7CisJCUNvbG9yNGYgcm93MiA9IHJlZyhyLCBzcmMxLCAyKTsKKwkJQ29sb3I0ZiByb3czID0gcmVnKHIsIHNyYzEsIDMpOworCisJCWRzdC54ID0gZG90NChzcmMwLCByb3cwKTsKKwkJZHN0LnkgPSBkb3Q0KHNyYzAsIHJvdzEpOworCQlkc3QueiA9IGRvdDQoc3JjMCwgcm93Mik7CisJCWRzdC53ID0gZG90NChzcmMwLCByb3czKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2dyYW06OkJSRUFLKFJlZ2lzdGVycyAmcikKKwl7CisJCWxsdm06OkJhc2ljQmxvY2sgKmRlYWRCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJbGx2bTo6QmFzaWNCbG9jayAqZW5kQmxvY2sgPSBsb29wUmVwRW5kQmxvY2tbbG9vcFJlcERlcHRoIC0gMV07CisKKwkJaWYoYnJlYWtEZXB0aCA9PSAwKQorCQl7CisJCQlOdWNsZXVzOjpjcmVhdGVCcihlbmRCbG9jayk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyLmVuYWJsZUJyZWFrID0gci5lbmFibGVCcmVhayAmIH5yLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXhdOworCQkJQm9vbCBhbGxCcmVhayA9IFNpZ25NYXNrKHIuZW5hYmxlQnJlYWspID09IDB4MDsKKworCQkJYnJhbmNoKGFsbEJyZWFrLCBlbmRCbG9jaywgZGVhZEJsb2NrKTsKKwkJfQorCisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGRlYWRCbG9jayk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpCUkVBS0MoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxLCBDb250cm9sIGNvbnRyb2wpCisJeworCQlJbnQ0IGNvbmRpdGlvbjsKKworCQlzd2l0Y2goY29udHJvbCkKKwkJeworCQljYXNlIE9wOjpDT05UUk9MX0dUOiBjb25kaXRpb24gPSBDbXBOTEUoc3JjMC54LCAgc3JjMS54KTsJYnJlYWs7CisJCWNhc2UgT3A6OkNPTlRST0xfRVE6IGNvbmRpdGlvbiA9IENtcEVRKHNyYzAueCwgc3JjMS54KTsJCWJyZWFrOworCQljYXNlIE9wOjpDT05UUk9MX0dFOiBjb25kaXRpb24gPSBDbXBOTFQoc3JjMC54LCBzcmMxLngpOwlicmVhazsKKwkJY2FzZSBPcDo6Q09OVFJPTF9MVDogY29uZGl0aW9uID0gQ21wTFQoc3JjMC54LCAgc3JjMS54KTsJYnJlYWs7CisJCWNhc2UgT3A6OkNPTlRST0xfTkU6IGNvbmRpdGlvbiA9IENtcE5FUShzcmMwLngsIHNyYzEueCk7CWJyZWFrOworCQljYXNlIE9wOjpDT05UUk9MX0xFOiBjb25kaXRpb24gPSBDbXBMRShzcmMwLngsIHNyYzEueCk7CQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQljb25kaXRpb24gJj0gci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XTsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICpjb250aW51ZUJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQlsbHZtOjpCYXNpY0Jsb2NrICplbmRCbG9jayA9IGxvb3BSZXBFbmRCbG9ja1tsb29wUmVwRGVwdGggLSAxXTsKKworCQlyLmVuYWJsZUJyZWFrID0gci5lbmFibGVCcmVhayAmIH5jb25kaXRpb247CisJCUJvb2wgYWxsQnJlYWsgPSBTaWduTWFzayhyLmVuYWJsZUJyZWFrKSA9PSAweDA7CisKKwkJYnJhbmNoKGFsbEJyZWFrLCBlbmRCbG9jaywgY29udGludWVCbG9jayk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGNvbnRpbnVlQmxvY2spOworCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6QlJFQUtQKFJlZ2lzdGVycyAmciwgY29uc3QgU3JjICZwcmVkaWNhdGVSZWdpc3RlcikgICAvLyBGSVhNRTogRmFjdG9yIG91dCBwYXJ0cyBjb21tb24gd2l0aCBCUkVBS0MKKwl7CisJCUludDQgY29uZGl0aW9uID0gQXM8SW50ND4oci5wMFtwcmVkaWNhdGVSZWdpc3Rlci5zd2l6emxlICYgMHgzXSk7CisKKwkJaWYocHJlZGljYXRlUmVnaXN0ZXIubW9kaWZpZXIgPT0gU3JjOjpNT0RJRklFUl9OT1QpCisJCXsKKwkJCWNvbmRpdGlvbiA9IH5jb25kaXRpb247CisJCX0KKworCQljb25kaXRpb24gJj0gci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XTsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICpjb250aW51ZUJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQlsbHZtOjpCYXNpY0Jsb2NrICplbmRCbG9jayA9IGxvb3BSZXBFbmRCbG9ja1tsb29wUmVwRGVwdGggLSAxXTsKKworCQlyLmVuYWJsZUJyZWFrID0gci5lbmFibGVCcmVhayAmIH5jb25kaXRpb247CisJCUJvb2wgYWxsQnJlYWsgPSBTaWduTWFzayhyLmVuYWJsZUJyZWFrKSA9PSAweDA7CisKKwkJYnJhbmNoKGFsbEJyZWFrLCBlbmRCbG9jaywgY29udGludWVCbG9jayk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGNvbnRpbnVlQmxvY2spOworCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6Q0FMTChSZWdpc3RlcnMgJnIsIGludCBsYWJlbEluZGV4KQorCXsKKwkJaWYoIWxhYmVsQmxvY2tbbGFiZWxJbmRleF0pCisJCXsKKwkJCWxhYmVsQmxvY2tbbGFiZWxJbmRleF0gPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCX0KKworCQlsbHZtOjpCYXNpY0Jsb2NrICpyZXRCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJY2FsbFJldEJsb2NrLnB1c2hfYmFjayhyZXRCbG9jayk7CisKKwkJci5jYWxsU3RhY2tbci5zdGFja0luZGV4KytdID0gVUludCgodW5zaWduZWQgaW50KWNhbGxSZXRCbG9jay5zaXplKCkgLSAxKTsgICAvLyBGSVhNRQorCisJCU51Y2xldXM6OmNyZWF0ZUJyKGxhYmVsQmxvY2tbbGFiZWxJbmRleF0pOworCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhyZXRCbG9jayk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpDQUxMTlooUmVnaXN0ZXJzICZyLCBpbnQgbGFiZWxJbmRleCwgY29uc3QgU3JjICZzcmMpCisJeworCQlpZihzcmMudHlwZSA9PSBTcmM6OlBBUkFNRVRFUl9DT05TVEJPT0wpCisJCXsKKwkJCUNBTExOWmIociwgbGFiZWxJbmRleCwgc3JjKTsKKwkJfQorCQllbHNlIGlmKHNyYy50eXBlID09IFNyYzo6UEFSQU1FVEVSX1BSRURJQ0FURSkKKwkJeworCQkJQ0FMTE5acChyLCBsYWJlbEluZGV4LCBzcmMpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2dyYW06OkNBTExOWmIoUmVnaXN0ZXJzICZyLCBpbnQgbGFiZWxJbmRleCwgY29uc3QgU3JjICZib29sUmVnaXN0ZXIpCisJeworCQlCb29sIGNvbmRpdGlvbiA9ICgqUG9pbnRlcjxCeXRlPihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdnMuYltib29sUmVnaXN0ZXIuaW5kZXhdKSkgIT0gQnl0ZSgwKSk7ICAgLy8gRklYTUUKKwkJCisJCWlmKGJvb2xSZWdpc3Rlci5tb2RpZmllciA9PSBTcmM6Ok1PRElGSUVSX05PVCkKKwkJeworCQkJY29uZGl0aW9uID0gIWNvbmRpdGlvbjsJCisJCX0KKworCQlpZighbGFiZWxCbG9ja1tsYWJlbEluZGV4XSkKKwkJeworCQkJbGFiZWxCbG9ja1tsYWJlbEluZGV4XSA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJfQorCisJCWxsdm06OkJhc2ljQmxvY2sgKnJldEJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQljYWxsUmV0QmxvY2sucHVzaF9iYWNrKHJldEJsb2NrKTsKKworCQlyLmNhbGxTdGFja1tyLnN0YWNrSW5kZXgrK10gPSBVSW50KChpbnQpY2FsbFJldEJsb2NrLnNpemUoKSAtIDEpOyAgIC8vIEZJWE1FCisKKwkJYnJhbmNoKGNvbmRpdGlvbiwgbGFiZWxCbG9ja1tsYWJlbEluZGV4XSwgcmV0QmxvY2spOworCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhyZXRCbG9jayk7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpDQUxMTlpwKFJlZ2lzdGVycyAmciwgaW50IGxhYmVsSW5kZXgsIGNvbnN0IFNyYyAmcHJlZGljYXRlUmVnaXN0ZXIpCisJeworCQlJbnQ0IGNvbmRpdGlvbiA9IEFzPEludDQ+KHIucDBbcHJlZGljYXRlUmVnaXN0ZXIuc3dpenpsZSAmIDB4M10pOworCisJCWlmKHByZWRpY2F0ZVJlZ2lzdGVyLm1vZGlmaWVyID09IFNyYzo6TU9ESUZJRVJfTk9UKQorCQl7CisJCQljb25kaXRpb24gPSB+Y29uZGl0aW9uOworCQl9CisKKwkJY29uZGl0aW9uICY9IHIuZW5hYmxlU3RhY2tbci5lbmFibGVJbmRleF07CisKKwkJaWYoIWxhYmVsQmxvY2tbbGFiZWxJbmRleF0pCisJCXsKKwkJCWxhYmVsQmxvY2tbbGFiZWxJbmRleF0gPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCX0KKworCQlsbHZtOjpCYXNpY0Jsb2NrICpyZXRCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJY2FsbFJldEJsb2NrLnB1c2hfYmFjayhyZXRCbG9jayk7CisKKwkJci5jYWxsU3RhY2tbci5zdGFja0luZGV4KytdID0gVUludCgoaW50KWNhbGxSZXRCbG9jay5zaXplKCkgLSAxKTsgICAvLyBGSVhNRQorCisJCXIuZW5hYmxlSW5kZXgrKzsKKwkJci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XSA9IGNvbmRpdGlvbjsKKworCQlCb29sIG5vdEFsbEZhbHNlID0gU2lnbk1hc2soY29uZGl0aW9uICYgci5lbmFibGVCcmVhaykgIT0gMDsKKworCQlicmFuY2gobm90QWxsRmFsc2UsIGxhYmVsQmxvY2tbbGFiZWxJbmRleF0sIHJldEJsb2NrKTsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2socmV0QmxvY2spOworCisJCXIuZW5hYmxlSW5kZXgtLTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2dyYW06OkVMU0UoUmVnaXN0ZXJzICZyKQorCXsKKwkJaWZEZXB0aC0tOworCisJCWxsdm06OkJhc2ljQmxvY2sgKmZhbHNlQmxvY2sgPSBpZkZhbHNlQmxvY2tbaWZEZXB0aF07CisJCWxsdm06OkJhc2ljQmxvY2sgKmVuZEJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCisJCWlmKGlzQ29uZGl0aW9uYWxJZltpZkRlcHRoXSkKKwkJeworCQkJSW50NCBjb25kaXRpb24gPSB+ci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XSAmIHIuZW5hYmxlU3RhY2tbci5lbmFibGVJbmRleCAtIDFdOworCQkJQm9vbCBub3RBbGxGYWxzZSA9IFNpZ25NYXNrKGNvbmRpdGlvbiAmIHIuZW5hYmxlQnJlYWspICE9IDA7CisKKwkJCWJyYW5jaChub3RBbGxGYWxzZSwgZmFsc2VCbG9jaywgZW5kQmxvY2spOworCisJCQlyLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXhdID0gfnIuZW5hYmxlU3RhY2tbci5lbmFibGVJbmRleF0gJiByLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXggLSAxXTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU51Y2xldXM6OmNyZWF0ZUJyKGVuZEJsb2NrKTsKKwkJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGZhbHNlQmxvY2spOworCQl9CisKKwkJaWZGYWxzZUJsb2NrW2lmRGVwdGhdID0gZW5kQmxvY2s7CisKKwkJaWZEZXB0aCsrOworCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6RU5ESUYoUmVnaXN0ZXJzICZyKQorCXsKKwkJaWZEZXB0aC0tOworCisJCWxsdm06OkJhc2ljQmxvY2sgKmVuZEJsb2NrID0gaWZGYWxzZUJsb2NrW2lmRGVwdGhdOworCisJCU51Y2xldXM6OmNyZWF0ZUJyKGVuZEJsb2NrKTsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2soZW5kQmxvY2spOworCisJCWlmKGlzQ29uZGl0aW9uYWxJZltpZkRlcHRoXSkKKwkJeworCQkJYnJlYWtEZXB0aC0tOworCQkJci5lbmFibGVJbmRleC0tOworCQl9CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpFTkRSRVAoUmVnaXN0ZXJzICZyKQorCXsKKwkJbG9vcFJlcERlcHRoLS07CisKKwkJbGx2bTo6QmFzaWNCbG9jayAqdGVzdEJsb2NrID0gbG9vcFJlcFRlc3RCbG9ja1tsb29wUmVwRGVwdGhdOworCQlsbHZtOjpCYXNpY0Jsb2NrICplbmRCbG9jayA9IGxvb3BSZXBFbmRCbG9ja1tsb29wUmVwRGVwdGhdOworCisJCU51Y2xldXM6OmNyZWF0ZUJyKHRlc3RCbG9jayk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGVuZEJsb2NrKTsKKworCQlyLmxvb3BEZXB0aC0tOworCQlyLmVuYWJsZUJyZWFrID0gSW50NCgweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2dyYW06OkVORExPT1AoUmVnaXN0ZXJzICZyKQorCXsKKwkJbG9vcFJlcERlcHRoLS07CisKKwkJci5hTFtyLmxvb3BEZXB0aF0gPSByLmFMW3IubG9vcERlcHRoXSArIHIuaW5jcmVtZW50W3IubG9vcERlcHRoXTsgICAvLyBGSVhNRTogKz0KKworCQlsbHZtOjpCYXNpY0Jsb2NrICp0ZXN0QmxvY2sgPSBsb29wUmVwVGVzdEJsb2NrW2xvb3BSZXBEZXB0aF07CisJCWxsdm06OkJhc2ljQmxvY2sgKmVuZEJsb2NrID0gbG9vcFJlcEVuZEJsb2NrW2xvb3BSZXBEZXB0aF07CisKKwkJTnVjbGV1czo6Y3JlYXRlQnIodGVzdEJsb2NrKTsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2soZW5kQmxvY2spOworCisJCXIubG9vcERlcHRoLS07CisJCXIuZW5hYmxlQnJlYWsgPSBJbnQ0KDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOworCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6SUYoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJnNyYykKKwl7CisJCWlmKHNyYy50eXBlID09IFNyYzo6UEFSQU1FVEVSX0NPTlNUQk9PTCkKKwkJeworCQkJSUZiKHIsIHNyYyk7CisJCX0KKwkJZWxzZSBpZihzcmMudHlwZSA9PSBTcmM6OlBBUkFNRVRFUl9QUkVESUNBVEUpCisJCXsKKwkJCUlGcChyLCBzcmMpOworCQl9CisJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2dyYW06OklGYihSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmYm9vbFJlZ2lzdGVyKQorCXsKKwkJQVNTRVJUKGlmRGVwdGggPCAyNCArIDQpOworCisJCUJvb2wgY29uZGl0aW9uID0gKCpQb2ludGVyPEJ5dGU+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSx2cy5iW2Jvb2xSZWdpc3Rlci5pbmRleF0pKSAhPSBCeXRlKDApKTsgICAvLyBGSVhNRQorCisJCWlmKGJvb2xSZWdpc3Rlci5tb2RpZmllciA9PSBTcmM6Ok1PRElGSUVSX05PVCkKKwkJeworCQkJY29uZGl0aW9uID0gIWNvbmRpdGlvbjsJCisJCX0KKworCQlsbHZtOjpCYXNpY0Jsb2NrICp0cnVlQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCWxsdm06OkJhc2ljQmxvY2sgKmZhbHNlQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisKKwkJYnJhbmNoKGNvbmRpdGlvbiwgdHJ1ZUJsb2NrLCBmYWxzZUJsb2NrKTsKKworCQlpc0NvbmRpdGlvbmFsSWZbaWZEZXB0aF0gPSBmYWxzZTsKKwkJaWZGYWxzZUJsb2NrW2lmRGVwdGhdID0gZmFsc2VCbG9jazsKKworCQlpZkRlcHRoKys7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpJRnAoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJnByZWRpY2F0ZVJlZ2lzdGVyKSAgIC8vIEZJWE1FOiBGYWN0b3Igb3V0IHBhcnRzIGNvbW1vbiB3aXRoIElGQworCXsKKwkJSW50NCBjb25kaXRpb24gPSBBczxJbnQ0PihyLnAwW3ByZWRpY2F0ZVJlZ2lzdGVyLnN3aXp6bGUgJiAweDNdKTsKKworCQlpZihwcmVkaWNhdGVSZWdpc3Rlci5tb2RpZmllciA9PSBTcmM6Ok1PRElGSUVSX05PVCkKKwkJeworCQkJY29uZGl0aW9uID0gfmNvbmRpdGlvbjsKKwkJfQorCisJCWNvbmRpdGlvbiAmPSByLmVuYWJsZVN0YWNrW3IuZW5hYmxlSW5kZXhdOworCisJCXIuZW5hYmxlSW5kZXgrKzsKKwkJci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XSA9IGNvbmRpdGlvbjsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICp0cnVlQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCWxsdm06OkJhc2ljQmxvY2sgKmZhbHNlQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisKKwkJQm9vbCBub3RBbGxGYWxzZSA9IFNpZ25NYXNrKGNvbmRpdGlvbiAmIHIuZW5hYmxlQnJlYWspICE9IDA7CisKKwkJYnJhbmNoKG5vdEFsbEZhbHNlLCB0cnVlQmxvY2ssIGZhbHNlQmxvY2spOworCisJCWlzQ29uZGl0aW9uYWxJZltpZkRlcHRoXSA9IHRydWU7CisJCWlmRmFsc2VCbG9ja1tpZkRlcHRoXSA9IGZhbHNlQmxvY2s7CisKKwkJaWZEZXB0aCsrOworCQlicmVha0RlcHRoKys7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpJRkMoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxLCBDb250cm9sIGNvbnRyb2wpCisJeworCQlJbnQ0IGNvbmRpdGlvbjsKKworCQlzd2l0Y2goY29udHJvbCkKKwkJeworCQljYXNlIE9wOjpDT05UUk9MX0dUOiBjb25kaXRpb24gPSBDbXBOTEUoc3JjMC54LCAgc3JjMS54KTsJYnJlYWs7CisJCWNhc2UgT3A6OkNPTlRST0xfRVE6IGNvbmRpdGlvbiA9IENtcEVRKHNyYzAueCwgc3JjMS54KTsJCWJyZWFrOworCQljYXNlIE9wOjpDT05UUk9MX0dFOiBjb25kaXRpb24gPSBDbXBOTFQoc3JjMC54LCBzcmMxLngpOwlicmVhazsKKwkJY2FzZSBPcDo6Q09OVFJPTF9MVDogY29uZGl0aW9uID0gQ21wTFQoc3JjMC54LCAgc3JjMS54KTsJYnJlYWs7CisJCWNhc2UgT3A6OkNPTlRST0xfTkU6IGNvbmRpdGlvbiA9IENtcE5FUShzcmMwLngsIHNyYzEueCk7CWJyZWFrOworCQljYXNlIE9wOjpDT05UUk9MX0xFOiBjb25kaXRpb24gPSBDbXBMRShzcmMwLngsIHNyYzEueCk7CQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQljb25kaXRpb24gJj0gci5lbmFibGVTdGFja1tyLmVuYWJsZUluZGV4XTsKKworCQlyLmVuYWJsZUluZGV4Kys7CisJCXIuZW5hYmxlU3RhY2tbci5lbmFibGVJbmRleF0gPSBjb25kaXRpb247CisKKwkJbGx2bTo6QmFzaWNCbG9jayAqdHJ1ZUJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQlsbHZtOjpCYXNpY0Jsb2NrICpmYWxzZUJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCisJCUJvb2wgbm90QWxsRmFsc2UgPSBTaWduTWFzayhjb25kaXRpb24gJiByLmVuYWJsZUJyZWFrKSAhPSAwOworCisJCWJyYW5jaChub3RBbGxGYWxzZSwgdHJ1ZUJsb2NrLCBmYWxzZUJsb2NrKTsKKworCQlpc0NvbmRpdGlvbmFsSWZbaWZEZXB0aF0gPSB0cnVlOworCQlpZkZhbHNlQmxvY2tbaWZEZXB0aF0gPSBmYWxzZUJsb2NrOworCisJCWlmRGVwdGgrKzsKKwkJYnJlYWtEZXB0aCsrOworCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6TEFCRUwoaW50IGxhYmVsSW5kZXgpCisJeworCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayhsYWJlbEJsb2NrW2xhYmVsSW5kZXhdKTsKKwl9CisKKwl2b2lkIFZlcnRleFByb2dyYW06OkxPT1AoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJmludGVnZXJSZWdpc3RlcikKKwl7CisJCXIubG9vcERlcHRoKys7CisKKwkJci5pdGVyYXRpb25bci5sb29wRGVwdGhdID0gKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdnMuaVtpbnRlZ2VyUmVnaXN0ZXIuaW5kZXhdWzBdKSk7CisJCXIuYUxbci5sb29wRGVwdGhdID0gKlBvaW50ZXI8SW50PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsdnMuaVtpbnRlZ2VyUmVnaXN0ZXIuaW5kZXhdWzFdKSk7CisJCXIuaW5jcmVtZW50W3IubG9vcERlcHRoXSA9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHZzLmlbaW50ZWdlclJlZ2lzdGVyLmluZGV4XVsyXSkpOworCisJCS8vIEZJWE1FOiBDb21waWxlcyB0byB0d28gaW5zdHJ1Y3Rpb25zPworCQlJZihyLmluY3JlbWVudFtyLmxvb3BEZXB0aF0gPT0gMCkKKwkJeworCQkJci5pbmNyZW1lbnRbci5sb29wRGVwdGhdID0gMTsKKwkJfQorCisJCWxsdm06OkJhc2ljQmxvY2sgKmxvb3BCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJbGx2bTo6QmFzaWNCbG9jayAqdGVzdEJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQlsbHZtOjpCYXNpY0Jsb2NrICplbmRCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKworCQlsb29wUmVwVGVzdEJsb2NrW2xvb3BSZXBEZXB0aF0gPSB0ZXN0QmxvY2s7CisJCWxvb3BSZXBFbmRCbG9ja1tsb29wUmVwRGVwdGhdID0gZW5kQmxvY2s7CisKKwkJLy8gRklYTUU6IGp1bXAodGVzdEJsb2NrKQorCQlOdWNsZXVzOjpjcmVhdGVCcih0ZXN0QmxvY2spOworCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayh0ZXN0QmxvY2spOworCisJCWJyYW5jaChyLml0ZXJhdGlvbltyLmxvb3BEZXB0aF0gPiAwLCBsb29wQmxvY2ssIGVuZEJsb2NrKTsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2sobG9vcEJsb2NrKTsKKworCQlyLml0ZXJhdGlvbltyLmxvb3BEZXB0aF0gPSByLml0ZXJhdGlvbltyLmxvb3BEZXB0aF0gLSAxOyAgIC8vIEZJWE1FOiAtLQorCQkKKwkJbG9vcFJlcERlcHRoKys7CisJCWJyZWFrRGVwdGggPSAwOworCX0KKworCXZvaWQgVmVydGV4UHJvZ3JhbTo6UkVQKFJlZ2lzdGVycyAmciwgY29uc3QgU3JjICZpbnRlZ2VyUmVnaXN0ZXIpCisJeworCQlyLmxvb3BEZXB0aCsrOworCisJCXIuaXRlcmF0aW9uW3IubG9vcERlcHRoXSA9ICpQb2ludGVyPEludD4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHZzLmlbaW50ZWdlclJlZ2lzdGVyLmluZGV4XVswXSkpOworCQlyLmFMW3IubG9vcERlcHRoXSA9IHIuYUxbci5sb29wRGVwdGggLSAxXTsKKworCQlsbHZtOjpCYXNpY0Jsb2NrICpsb29wQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCWxsdm06OkJhc2ljQmxvY2sgKnRlc3RCbG9jayA9IE51Y2xldXM6OmNyZWF0ZUJhc2ljQmxvY2soKTsKKwkJbGx2bTo6QmFzaWNCbG9jayAqZW5kQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisKKwkJbG9vcFJlcFRlc3RCbG9ja1tsb29wUmVwRGVwdGhdID0gdGVzdEJsb2NrOworCQlsb29wUmVwRW5kQmxvY2tbbG9vcFJlcERlcHRoXSA9IGVuZEJsb2NrOworCisJCS8vIEZJWE1FOiBqdW1wKHRlc3RCbG9jaykKKwkJTnVjbGV1czo6Y3JlYXRlQnIodGVzdEJsb2NrKTsKKwkJTnVjbGV1czo6c2V0SW5zZXJ0QmxvY2sodGVzdEJsb2NrKTsKKworCQlicmFuY2goci5pdGVyYXRpb25bci5sb29wRGVwdGhdID4gMCwgbG9vcEJsb2NrLCBlbmRCbG9jayk7CisJCU51Y2xldXM6OnNldEluc2VydEJsb2NrKGxvb3BCbG9jayk7CisKKwkJci5pdGVyYXRpb25bci5sb29wRGVwdGhdID0gci5pdGVyYXRpb25bci5sb29wRGVwdGhdIC0gMTsgICAvLyBGSVhNRTogLS0KKworCQlsb29wUmVwRGVwdGgrKzsKKwkJYnJlYWtEZXB0aCA9IDA7CisJfQorCisJdm9pZCBWZXJ0ZXhQcm9ncmFtOjpSRVQoUmVnaXN0ZXJzICZyKQorCXsKKwkJaWYoIXJldHVybnMpCisJCXsKKwkJCXJldHVybkJsb2NrID0gTnVjbGV1czo6Y3JlYXRlQmFzaWNCbG9jaygpOworCQkJTnVjbGV1czo6Y3JlYXRlQnIocmV0dXJuQmxvY2spOworCisJCQlyZXR1cm5zID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIEZJWE1FOiBFbmNhcHN1bGF0ZQorCQkJVUludCBpbmRleCA9IHIuY2FsbFN0YWNrWy0tci5zdGFja0luZGV4XTsKKyAKKwkJCWxsdm06OkJhc2ljQmxvY2sgKnVucmVhY2hhYmxlQmxvY2sgPSBOdWNsZXVzOjpjcmVhdGVCYXNpY0Jsb2NrKCk7CisJCQlsbHZtOjpWYWx1ZSAqdmFsdWUgPSBOdWNsZXVzOjpjcmVhdGVMb2FkKGluZGV4LmFkZHJlc3MpOworCQkJbGx2bTo6VmFsdWUgKnN3aXRjaEluc3QgPSBOdWNsZXVzOjpjcmVhdGVTd2l0Y2godmFsdWUsIHVucmVhY2hhYmxlQmxvY2ssIChpbnQpY2FsbFJldEJsb2NrLnNpemUoKSk7CisKKwkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjYWxsUmV0QmxvY2suc2l6ZSgpOyBpKyspCisJCQl7CisJCQkJTnVjbGV1czo6YWRkU3dpdGNoQ2FzZShzd2l0Y2hJbnN0LCBpLCBjYWxsUmV0QmxvY2tbaV0pOworCQkJfQorCisJCQlOdWNsZXVzOjpzZXRJbnNlcnRCbG9jayh1bnJlYWNoYWJsZUJsb2NrKTsKKwkJCU51Y2xldXM6OmNyZWF0ZVVucmVhY2hhYmxlKCk7CisJCX0KKwl9CisKKwl2b2lkIFZlcnRleFByb2dyYW06OlRFWExETChSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgY29uc3QgU3JjICZzcmMxKQorCXsKKwkJUG9pbnRlcjxCeXRlPiB0ZXh0dXJlID0gci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLG1pcG1hcFsxNl0pICsgc3JjMS5pbmRleCAqIHNpemVvZihUZXh0dXJlKTsKKworCQlDb2xvcjRmIHRtcDsKKworCQlzYW1wbGVyW3NyYzEuaW5kZXhdLT5zYW1wbGVUZXh0dXJlKHRleHR1cmUsIHRtcCwgc3JjMC54LCBzcmMwLnksIHNyYzAueiwgc3JjMC53LCBzcmMwLCBzcmMwLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCisJCWRzdC54ID0gdG1wWyhzcmMxLnN3aXp6bGUgPj4gMCkgJiAweDNdOworCQlkc3QueSA9IHRtcFsoc3JjMS5zd2l6emxlID4+IDIpICYgMHgzXTsKKwkJZHN0LnogPSB0bXBbKHNyYzEuc3dpenpsZSA+PiA0KSAmIDB4M107CisJCWRzdC53ID0gdG1wWyhzcmMxLnN3aXp6bGUgPj4gNikgJiAweDNdOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9TaGFkZXIvVmVydGV4UHJvZ3JhbS5ocHAgYi9zcmMvU2hhZGVyL1ZlcnRleFByb2dyYW0uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTk3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU2hhZGVyL1ZlcnRleFByb2dyYW0uaHBwCkBAIC0wLDAgKzEsOTQgQEAKKy8vIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIFJlbmRlcmVyCisvLworLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTm8gcGFydCBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKKy8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCisvLyBsYW5ndWFnZSBieSBhbnkgbWVhbnMsIG9yIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHdyaXR0ZW4KKy8vIGFncmVlbWVudCBvZiBUcmFuc0dhbWluZyBJbmMuIFdpdGhvdXQgc3VjaCBhbiBhZ3JlZW1lbnQsIG5vIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcworLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgorLy8KKworI2lmbmRlZiBzd19WZXJ0ZXhQcm9ncmFtX2hwcAorI2RlZmluZSBzd19WZXJ0ZXhQcm9ncmFtX2hwcAorCisjaW5jbHVkZSAiVmVydGV4Um91dGluZS5ocHAiCisjaW5jbHVkZSAiU2hhZGVyQ29yZS5ocHAiCisKKyNpbmNsdWRlICJTdHJlYW0uaHBwIgorI2luY2x1ZGUgIlR5cGVzLmhwcCIKKworbmFtZXNwYWNlIHN3Cit7CisJc3RydWN0IFN0cmVhbTsKKwljbGFzcyBWZXJ0ZXhTaGFkZXI7CisJY2xhc3MgU2FtcGxlckNvcmU7CisKKwljbGFzcyBWZXJ0ZXhQcm9ncmFtIDogcHVibGljIFZlcnRleFJvdXRpbmUsIHB1YmxpYyBTaGFkZXJDb3JlCisJeworCXB1YmxpYzoKKwkJVmVydGV4UHJvZ3JhbShjb25zdCBWZXJ0ZXhQcm9jZXNzb3I6OlN0YXRlICZzdGF0ZSwgY29uc3QgVmVydGV4U2hhZGVyICp2ZXJ0ZXhTaGFkZXIpOworCisJCXZpcnR1YWwgflZlcnRleFByb2dyYW0oKTsKKworCXByaXZhdGU6CisJCXR5cGVkZWYgU2hhZGVyOjpJbnN0cnVjdGlvbjo6RGVzdGluYXRpb25QYXJhbWV0ZXIgRHN0OworCQl0eXBlZGVmIFNoYWRlcjo6SW5zdHJ1Y3Rpb246OlNvdXJjZVBhcmFtZXRlciBTcmM7CisJCXR5cGVkZWYgU2hhZGVyOjpJbnN0cnVjdGlvbjo6T3BlcmF0aW9uIE9wOworCQl0eXBlZGVmIFNoYWRlcjo6SW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6Q29udHJvbCBDb250cm9sOworCQl0eXBlZGVmIFNoYWRlcjo6SW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6VXNhZ2UgVXNhZ2U7CisKKwkJQ29sb3I0ZiByZWFkQ29uc3RhbnQoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJnNyYywgaW50IG9mZnNldCA9IDApOworCQl2b2lkIHBpcGVsaW5lKFJlZ2lzdGVycyAmcik7CisJCXZvaWQgc2hhZGVyKFJlZ2lzdGVycyAmcik7CisJCXZvaWQgcGFzc1Rocm91Z2goUmVnaXN0ZXJzICZyKTsKKworCQlDb2xvcjRmIHJlZyhSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmc3JjLCBpbnQgb2Zmc2V0ID0gMCk7CisKKwkJdm9pZCBNM1gyKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBTcmMgJnNyYzEpOworCQl2b2lkIE0zWDMoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIFNyYyAmc3JjMSk7CisJCXZvaWQgTTNYNChSZWdpc3RlcnMgJnIsIENvbG9yNGYgJmRzdCwgQ29sb3I0ZiAmc3JjMCwgU3JjICZzcmMxKTsKKwkJdm9pZCBNNFgzKFJlZ2lzdGVycyAmciwgQ29sb3I0ZiAmZHN0LCBDb2xvcjRmICZzcmMwLCBTcmMgJnNyYzEpOworCQl2b2lkIE00WDQoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYzAsIFNyYyAmc3JjMSk7CisJCXZvaWQgQlJFQUsoUmVnaXN0ZXJzICZyKTsKKwkJdm9pZCBCUkVBS0MoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZzcmMwLCBDb2xvcjRmICZzcmMxLCBDb250cm9sKTsKKwkJdm9pZCBCUkVBS1AoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJnByZWRpY2F0ZVJlZ2lzdGVyKTsKKwkJdm9pZCBDQUxMKFJlZ2lzdGVycyAmciwgaW50IGxhYmVsSW5kZXgpOworCQl2b2lkIENBTExOWihSZWdpc3RlcnMgJnIsIGludCBsYWJlbEluZGV4LCBjb25zdCBTcmMgJnNyYyk7CisJCXZvaWQgQ0FMTE5aYihSZWdpc3RlcnMgJnIsIGludCBsYWJlbEluZGV4LCBjb25zdCBTcmMgJmJvb2xSZWdpc3Rlcik7CisJCXZvaWQgQ0FMTE5acChSZWdpc3RlcnMgJnIsIGludCBsYWJlbEluZGV4LCBjb25zdCBTcmMgJnByZWRpY2F0ZVJlZ2lzdGVyKTsKKwkJdm9pZCBFTFNFKFJlZ2lzdGVycyAmcik7CisJCXZvaWQgRU5ESUYoUmVnaXN0ZXJzICZyKTsKKwkJdm9pZCBFTkRMT09QKFJlZ2lzdGVycyAmcik7CisJCXZvaWQgRU5EUkVQKFJlZ2lzdGVycyAmcik7CisJCXZvaWQgSUYoUmVnaXN0ZXJzICZyLCBjb25zdCBTcmMgJnNyYyk7CisJCXZvaWQgSUZiKFJlZ2lzdGVycyAmciwgY29uc3QgU3JjICZib29sUmVnaXN0ZXIpOworCQl2b2lkIElGcChSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmcHJlZGljYXRlUmVnaXN0ZXIpOworCQl2b2lkIElGQyhSZWdpc3RlcnMgJnIsIENvbG9yNGYgJnNyYzAsIENvbG9yNGYgJnNyYzEsIENvbnRyb2wpOworCQl2b2lkIExBQkVMKGludCBsYWJlbEluZGV4KTsKKwkJdm9pZCBMT09QKFJlZ2lzdGVycyAmciwgY29uc3QgU3JjICZpbnRlZ2VyUmVnaXN0ZXIpOworCQl2b2lkIFJFUChSZWdpc3RlcnMgJnIsIGNvbnN0IFNyYyAmaW50ZWdlclJlZ2lzdGVyKTsKKwkJdm9pZCBSRVQoUmVnaXN0ZXJzICZyKTsKKwkJdm9pZCBURVhMREwoUmVnaXN0ZXJzICZyLCBDb2xvcjRmICZkc3QsIENvbG9yNGYgJnNyYywgY29uc3QgU3JjJik7CisKKwkJU2FtcGxlckNvcmUgKnNhbXBsZXJbNF07CisKKwkJYm9vbCByZXR1cm5zOworCQlpbnQgaWZEZXB0aDsKKwkJaW50IGxvb3BSZXBEZXB0aDsKKwkJaW50IGJyZWFrRGVwdGg7CisKKwkJLy8gRklYTUU6IEdldCByaWQgb2YgbGx2bTo6CisJCWxsdm06OkJhc2ljQmxvY2sgKmlmRmFsc2VCbG9ja1syNCArIDI0XTsKKwkJbGx2bTo6QmFzaWNCbG9jayAqbG9vcFJlcFRlc3RCbG9ja1s0XTsKKwkJbGx2bTo6QmFzaWNCbG9jayAqbG9vcFJlcEVuZEJsb2NrWzRdOworCQlsbHZtOjpCYXNpY0Jsb2NrICpsYWJlbEJsb2NrWzIwNDhdOworCQlzdGQ6OnZlY3RvcjxsbHZtOjpCYXNpY0Jsb2NrKj4gY2FsbFJldEJsb2NrOworCQlsbHZtOjpCYXNpY0Jsb2NrICpyZXR1cm5CbG9jazsKKwkJYm9vbCBpc0NvbmRpdGlvbmFsSWZbMjQgKyAyNF07CisKKwkJY29uc3QgVmVydGV4U2hhZGVyICpjb25zdCB2ZXJ0ZXhTaGFkZXI7CisJfTsKK30KKworI2VuZGlmICAgLy8gc3dfVmVydGV4UHJvZ3JhbV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9TaGFkZXIvVmVydGV4Um91dGluZS5jcHAgYi9zcmMvU2hhZGVyL1ZlcnRleFJvdXRpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOGE3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU2hhZGVyL1ZlcnRleFJvdXRpbmUuY3BwCkBAIC0wLDAgKzEsNjA1IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpbmNsdWRlICJWZXJ0ZXhSb3V0aW5lLmhwcCIKKworI2luY2x1ZGUgIlZlcnRleFNoYWRlci5ocHAiCisjaW5jbHVkZSAiVmVydGV4LmhwcCIKKyNpbmNsdWRlICJIYWxmLmhwcCIKKyNpbmNsdWRlICJSZW5kZXJlci5ocHAiCisjaW5jbHVkZSAiQ29uc3RhbnRzLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKK25hbWVzcGFjZSBzdworeworCVZlcnRleFJvdXRpbmU6OlZlcnRleFJvdXRpbmUoY29uc3QgVmVydGV4UHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUpIDogc3RhdGUoc3RhdGUpCisJeworCQlyb3V0aW5lID0gMDsKKwl9CisKKwlWZXJ0ZXhSb3V0aW5lOjp+VmVydGV4Um91dGluZSgpCisJeworCX0KKworCXZvaWQgVmVydGV4Um91dGluZTo6Z2VuZXJhdGUoKQorCXsKKwkJRnVuY3Rpb248Vm9pZCwgUG9pbnRlcjxCeXRlPiwgUG9pbnRlcjxCeXRlPiwgUG9pbnRlcjxCeXRlPiwgUG9pbnRlcjxCeXRlPj4gZnVuY3Rpb247CisJCXsKKwkJCVBvaW50ZXI8Qnl0ZT4gdmVydGV4KGZ1bmN0aW9uLmFyZygwKSk7CisJCQlQb2ludGVyPEJ5dGU+IGJhdGNoKGZ1bmN0aW9uLmFyZygxKSk7CisJCQlQb2ludGVyPEJ5dGU+IHRhc2soZnVuY3Rpb24uYXJnKDIpKTsKKwkJCVBvaW50ZXI8Qnl0ZT4gZGF0YShmdW5jdGlvbi5hcmcoMykpOworCisJCQljb25zdCBib29sIHRleGxkbCA9IHN0YXRlLnNoYWRlckNvbnRhaW5zVGV4bGRsOworCisJCQlQb2ludGVyPEJ5dGU+IGNhY2hlID0gdGFzayArIE9GRlNFVChWZXJ0ZXhUYXNrLHZlcnRleENhY2hlKTsKKwkJCVBvaW50ZXI8Qnl0ZT4gdmVydGV4Q2FjaGUgPSBjYWNoZSArIE9GRlNFVChWZXJ0ZXhDYWNoZSx2ZXJ0ZXgpOworCQkJUG9pbnRlcjxCeXRlPiB0YWdDYWNoZSA9IGNhY2hlICsgT0ZGU0VUKFZlcnRleENhY2hlLHRhZyk7CisKKwkJCVVJbnQgY291bnQgPSAqUG9pbnRlcjxVSW50Pih0YXNrKyBPRkZTRVQoVmVydGV4VGFzayxjb3VudCkpOworCisJCQlSZWdpc3RlcnMgcjsKKwkJCXIuZGF0YSA9IGRhdGE7CisJCQlyLmNvbnN0YW50cyA9ICpQb2ludGVyPFBvaW50ZXI8Qnl0ZT4+KGRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsY29uc3RhbnRzKSk7CisKKwkJCURvCisJCQl7CisJCQkJVUludCBpbmRleCA9ICpQb2ludGVyPFVJbnQ+KGJhdGNoKTsKKwkJCQlVSW50IHRhZ0luZGV4ID0gaW5kZXggJiBVSW50KDB4MDAwMDAwM0MpOworCQkJCVVJbnQgaW5kZXhRID0gIXRleGxkbCA/IGluZGV4ICYgVUludCgweEZGRkZGRkZDKSA6IGluZGV4OyAgIC8vIEZJWE1FOiBURVhMREwgaGFjayB0byBoYXZlIGluZGVwZW5kZW50IExPRHMsIGh1cnRzIHBlcmZvcm1hbmNlLgorCisJCQkJSWYoKlBvaW50ZXI8VUludD4odGFnQ2FjaGUgKyB0YWdJbmRleCkgIT0gaW5kZXhRKQorCQkJCXsKKwkJCQkJKlBvaW50ZXI8VUludD4odGFnQ2FjaGUgKyB0YWdJbmRleCkgPSBpbmRleFE7CisKKwkJCQkJcmVhZElucHV0KHIsIGluZGV4USk7CisJCQkJCXBpcGVsaW5lKHIpOworCQkJCQlwb3N0VHJhbnNmb3JtKHIpOworCQkJCQljb21wdXRlQ2xpcEZsYWdzKHIpOworCisJCQkJCVBvaW50ZXI8Qnl0ZT4gY2FjaGVMaW5lMCA9IHZlcnRleENhY2hlICsgdGFnSW5kZXggKiBVSW50KChpbnQpc2l6ZW9mKFZlcnRleCkpOworCQkJCQl3cml0ZUNhY2hlKGNhY2hlTGluZTAsIHIpOworCQkJCX0KKworCQkJCVVJbnQgY2FjaGVJbmRleCA9IGluZGV4ICYgVUludCgweDAwMDAwMDNGKTsKKwkJCQlQb2ludGVyPEJ5dGU+IGNhY2hlTGluZSA9IHZlcnRleENhY2hlICsgY2FjaGVJbmRleCAqIFVJbnQoKGludClzaXplb2YoVmVydGV4KSk7CisJCQkJd3JpdGVWZXJ0ZXgodmVydGV4LCBjYWNoZUxpbmUpOworCisJCQkJdmVydGV4ICs9IHNpemVvZihWZXJ0ZXgpOworCQkJCWJhdGNoICs9IHNpemVvZih1bnNpZ25lZCBpbnQpOworCQkJCWNvdW50LS07CisJCQl9CisJCQlVbnRpbChjb3VudCA9PSBVSW50KDApKQorCisJCQlSZXR1cm4oKTsKKwkJfQorCisJCXJvdXRpbmUgPSBmdW5jdGlvbihMIlZlcnRleFJvdXRpbmVfJTAuMTZsbFgiLCBzdGF0ZS5zaGFkZXJIYXNoKTsKKwl9CisKKwlSb3V0aW5lICpWZXJ0ZXhSb3V0aW5lOjpnZXRSb3V0aW5lKCkKKwl7CisJCXJldHVybiByb3V0aW5lOworCX0KKworCXZvaWQgVmVydGV4Um91dGluZTo6cmVhZElucHV0KFJlZ2lzdGVycyAmciwgVUludCAmaW5kZXgpCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJUG9pbnRlcjxCeXRlPiBpbnB1dCA9ICpQb2ludGVyPFBvaW50ZXI8Qnl0ZT4+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxpbnB1dCkgKyBzaXplb2Yodm9pZCopICogaSk7CisJCQlVSW50IHN0cmlkZSA9ICpQb2ludGVyPFVJbnQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxzdHJpZGUpICsgc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBpKTsKKworCQkJci52W2ldID0gcmVhZFN0cmVhbShyLCBpbnB1dCwgc3RyaWRlLCBzdGF0ZS5pbnB1dFtpXSwgaW5kZXgpOworCQl9CisJfQorCisJdm9pZCBWZXJ0ZXhSb3V0aW5lOjpjb21wdXRlQ2xpcEZsYWdzKFJlZ2lzdGVycyAmcikKKwl7CisJCWludCBwb3MgPSBzdGF0ZS5wb3NpdGlvblJlZ2lzdGVyOworCisJCS8vIEJhY2t0cmFuc2Zvcm0KKwkJaWYoc3RhdGUucHJlVHJhbnNmb3JtZWQpCisJCXsKKwkJCUZsb2F0NCByaHcgPSBGbG9hdDQoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikgLyByLm93W3Bvc107CisKKwkJCUZsb2F0NCBXID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsV1dXV3gxNikpICogRmxvYXQ0KDEuMGYgLyAxNi4wZiwgMS4wZiAvIDE2LjBmLCAxLjBmIC8gMTYuMGYsIDEuMGYgLyAxNi4wZik7CisJCQlGbG9hdDQgSCA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLEhISEh4MTYpKSAqIEZsb2F0NCgxLjBmIC8gMTYuMGYsIDEuMGYgLyAxNi4wZiwgMS4wZiAvIDE2LjBmLCAxLjBmIC8gMTYuMGYpOworCQkJRmxvYXQ0IEwgPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxMTExMeDE2KSkgKiBGbG9hdDQoMS4wZiAvIDE2LjBmLCAxLjBmIC8gMTYuMGYsIDEuMGYgLyAxNi4wZiwgMS4wZiAvIDE2LjBmKTsKKwkJCUZsb2F0NCBUID0gKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsVFRUVHgxNikpICogRmxvYXQ0KDEuMGYgLyAxNi4wZiwgMS4wZiAvIDE2LjBmLCAxLjBmIC8gMTYuMGYsIDEuMGYgLyAxNi4wZik7CisKKwkJCXIub3hbcG9zXSA9IChyLm94W3Bvc10gLSBMKSAvIFcgKiByaHc7CisJCQlyLm95W3Bvc10gPSAoci5veVtwb3NdIC0gVCkgLyBIICogcmh3OworCQkJci5veltwb3NdID0gci5veltwb3NdICogcmh3OworCQkJci5vd1twb3NdID0gcmh3OworCQl9CisKKwkJaWYoc3RhdGUuc3VwZXJTYW1wbGluZykKKwkJeworCQkJci5veFtwb3NdID0gci5veFtwb3NdICsgKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsWFhYWCkpICogci5vd1twb3NdOworCQkJci5veVtwb3NdID0gci5veVtwb3NdICsgKlBvaW50ZXI8RmxvYXQ0PihyLmRhdGEgKyBPRkZTRVQoRHJhd0RhdGEsWVlZWSkpICogci5vd1twb3NdOworCQl9CisKKwkJRmxvYXQ0IGNsaXBYID0gci5veFtwb3NdOworCQlGbG9hdDQgY2xpcFkgPSByLm95W3Bvc107CisKKwkJaWYoc3RhdGUubXVsdGlTYW1wbGluZykgICAvLyBDbGlwIGF0IHBpeGVsIGVkZ2VzIGluc3RlYWQgb2YgcGl4ZWwgY2VudGVycworCQl7CisJCQljbGlwWCArPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxvZmZYKSkgKiByLm93W3Bvc107CisJCQljbGlwWSArPSAqUG9pbnRlcjxGbG9hdDQ+KHIuZGF0YSArIE9GRlNFVChEcmF3RGF0YSxvZmZZKSkgKiByLm93W3Bvc107CisJCX0KKworCQlJbnQ0IG1heFggPSBDbXBMVChyLm93W3Bvc10sIGNsaXBYKTsKKwkJSW50NCBtYXhZID0gQ21wTFQoci5vd1twb3NdLCBjbGlwWSk7CisJCUludDQgbWF4WiA9IENtcExUKHIub3dbcG9zXSwgci5veltwb3NdKTsKKworCQlJbnQ0IG1pblggPSBDbXBOTEUoLXIub3dbcG9zXSwgY2xpcFgpOworCQlJbnQ0IG1pblkgPSBDbXBOTEUoLXIub3dbcG9zXSwgY2xpcFkpOworCQlJbnQ0IG1pblogPSBDbXBOTEUoRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLCByLm96W3Bvc10pOworCisJCUludCBmbGFnczsKKworCQlmbGFncyA9IFNpZ25NYXNrKG1heFgpOworCQlyLmNsaXBGbGFncyA9ICpQb2ludGVyPEludD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1heFgpICsgZmxhZ3MgKiA0KTsgICAvLyBGSVhNRTogQXJyYXkgaW5kZXhpbmcKKwkJZmxhZ3MgPSBTaWduTWFzayhtYXhZKTsKKwkJci5jbGlwRmxhZ3MgfD0gKlBvaW50ZXI8SW50PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWF4WSkgKyBmbGFncyAqIDQpOworCQlmbGFncyA9IFNpZ25NYXNrKG1heFopOworCQlyLmNsaXBGbGFncyB8PSAqUG9pbnRlcjxJbnQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtYXhaKSArIGZsYWdzICogNCk7CisJCWZsYWdzID0gU2lnbk1hc2sobWluWCk7CisJCXIuY2xpcEZsYWdzIHw9ICpQb2ludGVyPEludD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1pblgpICsgZmxhZ3MgKiA0KTsKKwkJZmxhZ3MgPSBTaWduTWFzayhtaW5ZKTsKKwkJci5jbGlwRmxhZ3MgfD0gKlBvaW50ZXI8SW50PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsbWluWSkgKyBmbGFncyAqIDQpOworCQlmbGFncyA9IFNpZ25NYXNrKG1pblopOworCQlyLmNsaXBGbGFncyB8PSAqUG9pbnRlcjxJbnQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxtaW5aKSArIGZsYWdzICogNCk7CisKKwkJSW50NCBmaW5pdGVYID0gQ21wTEUoQWJzKHIub3hbcG9zXSksICpQb2ludGVyPEZsb2F0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1heFBvcykpKTsKKwkJSW50NCBmaW5pdGVZID0gQ21wTEUoQWJzKHIub3lbcG9zXSksICpQb2ludGVyPEZsb2F0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1heFBvcykpKTsKKwkJSW50NCBmaW5pdGVaID0gQ21wTEUoQWJzKHIub3pbcG9zXSksICpQb2ludGVyPEZsb2F0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLG1heFBvcykpKTsKKworCQlmbGFncyA9IFNpZ25NYXNrKGZpbml0ZVggJiBmaW5pdGVZICYgZmluaXRlWik7CisJCXIuY2xpcEZsYWdzIHw9ICpQb2ludGVyPEludD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGZpbmkpICsgZmxhZ3MgKiA0KTsKKworCQlpZihzdGF0ZS5wcmVUcmFuc2Zvcm1lZCkKKwkJeworCQkJci5jbGlwRmxhZ3MgJj0gMHhGQkZCRkJGQjsgICAvLyBEb24ndCBjbGlwIGFnYWluc3QgZmFyIGNsaXAgcGxhbmUKKwkJfQorCX0KKworCUNvbG9yNGYgVmVydGV4Um91dGluZTo6cmVhZFN0cmVhbShSZWdpc3RlcnMgJnIsIFBvaW50ZXI8Qnl0ZT4gJmJ1ZmZlciwgVUludCAmc3RyaWRlLCBjb25zdCBTdHJlYW0gJnN0cmVhbSwgY29uc3QgVUludCAmaW5kZXgpCisJeworCQljb25zdCBib29sIHRleGxkbCA9IHN0YXRlLnNoYWRlckNvbnRhaW5zVGV4bGRsOworCisJCUNvbG9yNGYgdjsKKworCQlQb2ludGVyPEJ5dGU+IHNvdXJjZTAgPSBidWZmZXIgKyBpbmRleCAqIHN0cmlkZTsKKwkJUG9pbnRlcjxCeXRlPiBzb3VyY2UxID0gc291cmNlMCArICghdGV4bGRsID8gc3RyaWRlIDogMCk7CisJCVBvaW50ZXI8Qnl0ZT4gc291cmNlMiA9IHNvdXJjZTEgKyAoIXRleGxkbCA/IHN0cmlkZSA6IDApOworCQlQb2ludGVyPEJ5dGU+IHNvdXJjZTMgPSBzb3VyY2UyICsgKCF0ZXhsZGwgPyBzdHJpZGUgOiAwKTsKKworCQlzd2l0Y2goc3RyZWFtLnR5cGUpCisJCXsKKwkJY2FzZSBTVFJFQU1UWVBFX0ZMT0FUOgorCQkJeworCQkJCWlmKHN0cmVhbS5jb3VudCA9PSAwKQorCQkJCXsKKwkJCQkJLy8gTnVsbCBzdHJlYW0sIGFsbCBkZWZhdWx0IGNvbXBvbmVudHMKKwkJCQl9CisJCQkJZWxzZSBpZihzdHJlYW0uY291bnQgPT0gMSkKKwkJCQl7CisJCQkJCXYueC54ID0gKlBvaW50ZXI8RmxvYXQ+KHNvdXJjZTApOworCQkJCQl2LngueSA9ICpQb2ludGVyPEZsb2F0Pihzb3VyY2UxKTsKKwkJCQkJdi54LnogPSAqUG9pbnRlcjxGbG9hdD4oc291cmNlMik7CisJCQkJCXYueC53ID0gKlBvaW50ZXI8RmxvYXQ+KHNvdXJjZTMpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl2LnggPSAqUG9pbnRlcjxGbG9hdDQ+KHNvdXJjZTApOworCQkJCQl2LnkgPSAqUG9pbnRlcjxGbG9hdDQ+KHNvdXJjZTEpOworCQkJCQl2LnogPSAqUG9pbnRlcjxGbG9hdDQ+KHNvdXJjZTIpOworCQkJCQl2LncgPSAqUG9pbnRlcjxGbG9hdDQ+KHNvdXJjZTMpOworCisJCQkJCXRyYW5zcG9zZTR4Tih2LngsIHYueSwgdi56LCB2LncsIHN0cmVhbS5jb3VudCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RSRUFNVFlQRV9CWVRFOgorCQkJeworCQkJCXYueCA9IEZsb2F0NCgqUG9pbnRlcjxCeXRlND4oc291cmNlMCkpOworCQkJCXYueSA9IEZsb2F0NCgqUG9pbnRlcjxCeXRlND4oc291cmNlMSkpOworCQkJCXYueiA9IEZsb2F0NCgqUG9pbnRlcjxCeXRlND4oc291cmNlMikpOworCQkJCXYudyA9IEZsb2F0NCgqUG9pbnRlcjxCeXRlND4oc291cmNlMykpOworCisJCQkJdHJhbnNwb3NlNHhOKHYueCwgdi55LCB2LnosIHYudywgc3RyZWFtLmNvdW50KTsKKworCQkJCWlmKHN0cmVhbS5ub3JtYWxpemVkKQorCQkJCXsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDEpIHYueCAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlQnl0ZSkpOworCQkJCQlpZihzdHJlYW0uY291bnQgPj0gMikgdi55ICo9ICpQb2ludGVyPEZsb2F0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLHVuc2NhbGVCeXRlKSk7CisJCQkJCWlmKHN0cmVhbS5jb3VudCA+PSAzKSB2LnogKj0gKlBvaW50ZXI8RmxvYXQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsdW5zY2FsZUJ5dGUpKTsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDQpIHYudyAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlQnl0ZSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUUkVBTVRZUEVfU0JZVEU6CisJCQl7CisJCQkJdi54ID0gRmxvYXQ0KCpQb2ludGVyPFNCeXRlND4oc291cmNlMCkpOworCQkJCXYueSA9IEZsb2F0NCgqUG9pbnRlcjxTQnl0ZTQ+KHNvdXJjZTEpKTsKKwkJCQl2LnogPSBGbG9hdDQoKlBvaW50ZXI8U0J5dGU0Pihzb3VyY2UyKSk7CisJCQkJdi53ID0gRmxvYXQ0KCpQb2ludGVyPFNCeXRlND4oc291cmNlMykpOworCisJCQkJdHJhbnNwb3NlNHhOKHYueCwgdi55LCB2LnosIHYudywgc3RyZWFtLmNvdW50KTsKKworCQkJCWlmKHN0cmVhbS5ub3JtYWxpemVkKQorCQkJCXsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDEpIHYueCAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlU0J5dGUpKTsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDIpIHYueSAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlU0J5dGUpKTsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDMpIHYueiAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlU0J5dGUpKTsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDQpIHYudyAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlU0J5dGUpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVFJFQU1UWVBFX0NPTE9SOgorCQkJeworCQkJCXYueCA9IEZsb2F0NCgqUG9pbnRlcjxCeXRlND4oc291cmNlMCkpICogKlBvaW50ZXI8RmxvYXQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsdW5zY2FsZUJ5dGUpKTsKKwkJCQl2LnkgPSBGbG9hdDQoKlBvaW50ZXI8Qnl0ZTQ+KHNvdXJjZTEpKSAqICpQb2ludGVyPEZsb2F0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLHVuc2NhbGVCeXRlKSk7CisJCQkJdi56ID0gRmxvYXQ0KCpQb2ludGVyPEJ5dGU0Pihzb3VyY2UyKSkgKiAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlQnl0ZSkpOworCQkJCXYudyA9IEZsb2F0NCgqUG9pbnRlcjxCeXRlND4oc291cmNlMykpICogKlBvaW50ZXI8RmxvYXQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsdW5zY2FsZUJ5dGUpKTsKKworCQkJCXRyYW5zcG9zZTR4NCh2LngsIHYueSwgdi56LCB2LncpOworCisJCQkJLy8gU3dhcCByZWQgYW5kIGJsdWUKKwkJCQlGbG9hdDQgdCA9IHYueDsKKwkJCQl2LnggPSB2Lno7CisJCQkJdi56ID0gdDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUUkVBTVRZUEVfU0hPUlQ6CisJCQl7CisJCQkJdi54ID0gRmxvYXQ0KCpQb2ludGVyPFNob3J0ND4oc291cmNlMCkpOworCQkJCXYueSA9IEZsb2F0NCgqUG9pbnRlcjxTaG9ydDQ+KHNvdXJjZTEpKTsKKwkJCQl2LnogPSBGbG9hdDQoKlBvaW50ZXI8U2hvcnQ0Pihzb3VyY2UyKSk7CisJCQkJdi53ID0gRmxvYXQ0KCpQb2ludGVyPFNob3J0ND4oc291cmNlMykpOworCQkJCisJCQkJdHJhbnNwb3NlNHhOKHYueCwgdi55LCB2LnosIHYudywgc3RyZWFtLmNvdW50KTsKKworCQkJCWlmKHN0cmVhbS5ub3JtYWxpemVkKQorCQkJCXsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDEpIHYueCAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlU2hvcnQpKTsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDIpIHYueSAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlU2hvcnQpKTsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDMpIHYueiAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlU2hvcnQpKTsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDQpIHYudyAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlU2hvcnQpKTsKKwkJCQl9CQkJCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVFJFQU1UWVBFX1VTSE9SVDoKKwkJCXsKKwkJCQl2LnggPSBGbG9hdDQoKlBvaW50ZXI8VVNob3J0ND4oc291cmNlMCkpOworCQkJCXYueSA9IEZsb2F0NCgqUG9pbnRlcjxVU2hvcnQ0Pihzb3VyY2UxKSk7CisJCQkJdi56ID0gRmxvYXQ0KCpQb2ludGVyPFVTaG9ydDQ+KHNvdXJjZTIpKTsKKwkJCQl2LncgPSBGbG9hdDQoKlBvaW50ZXI8VVNob3J0ND4oc291cmNlMykpOworCQkJCisJCQkJdHJhbnNwb3NlNHhOKHYueCwgdi55LCB2LnosIHYudywgc3RyZWFtLmNvdW50KTsKKworCQkJCWlmKHN0cmVhbS5ub3JtYWxpemVkKQorCQkJCXsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDEpIHYueCAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlVVNob3J0KSk7CisJCQkJCWlmKHN0cmVhbS5jb3VudCA+PSAyKSB2LnkgKj0gKlBvaW50ZXI8RmxvYXQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsdW5zY2FsZVVTaG9ydCkpOworCQkJCQlpZihzdHJlYW0uY291bnQgPj0gMykgdi56ICo9ICpQb2ludGVyPEZsb2F0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLHVuc2NhbGVVU2hvcnQpKTsKKwkJCQkJaWYoc3RyZWFtLmNvdW50ID49IDQpIHYudyAqPSAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlVVNob3J0KSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RSRUFNVFlQRV9VREVDMzoKKwkJCXsKKwkJCQkvLyBGSVhNRTogVmVjdG9yaXplCisJCQkJeworCQkJCQlJbnQgeCwgeSwgejsKKwkJCQkJCisJCQkJCXggPSB5ID0geiA9ICpQb2ludGVyPEludD4oc291cmNlMCk7CisKKwkJCQkJdi54LnggPSBGbG9hdCh4ICYgMHgwMDAwMDNGRik7CisJCQkJCXYueC55ID0gRmxvYXQoeSAmIDB4MDAwRkZDMDApOworCQkJCQl2LngueiA9IEZsb2F0KHogJiAweDNGRjAwMDAwKTsKKwkJCQl9CisKKwkJCQl7CisJCQkJCUludCB4LCB5LCB6OworCQkJCQkKKwkJCQkJeCA9IHkgPSB6ID0gKlBvaW50ZXI8SW50Pihzb3VyY2UxKTsKKworCQkJCQl2LnkueCA9IEZsb2F0KHggJiAweDAwMDAwM0ZGKTsKKwkJCQkJdi55LnkgPSBGbG9hdCh5ICYgMHgwMDBGRkMwMCk7CisJCQkJCXYueS56ID0gRmxvYXQoeiAmIDB4M0ZGMDAwMDApOworCQkJCX0KKworCQkJCXsKKwkJCQkJSW50IHgsIHksIHo7CisJCQkJCQorCQkJCQl4ID0geSA9IHogPSAqUG9pbnRlcjxJbnQ+KHNvdXJjZTIpOworCisJCQkJCXYuei54ID0gRmxvYXQoeCAmIDB4MDAwMDAzRkYpOworCQkJCQl2LnoueSA9IEZsb2F0KHkgJiAweDAwMEZGQzAwKTsKKwkJCQkJdi56LnogPSBGbG9hdCh6ICYgMHgzRkYwMDAwMCk7CisJCQkJfQorCisJCQkJeworCQkJCQlJbnQgeCwgeSwgejsKKwkJCQkJCisJCQkJCXggPSB5ID0geiA9ICpQb2ludGVyPEludD4oc291cmNlMyk7CisKKwkJCQkJdi53LnggPSBGbG9hdCh4ICYgMHgwMDAwMDNGRik7CisJCQkJCXYudy55ID0gRmxvYXQoeSAmIDB4MDAwRkZDMDApOworCQkJCQl2LncueiA9IEZsb2F0KHogJiAweDNGRjAwMDAwKTsKKwkJCQl9CisKKwkJCQl0cmFuc3Bvc2U0eDModi54LCB2LnksIHYueiwgdi53KTsKKworCQkJCXYueSAqPSBGbG9hdDQoMS4wZiAvIDB4MDAwMDA0MDAsIDEuMGYgLyAweDAwMDAwNDAwLCAxLjBmIC8gMHgwMDAwMDQwMCwgMS4wZiAvIDB4MDAwMDA0MDApOworCQkJCXYueiAqPSBGbG9hdDQoMS4wZiAvIDB4MDAxMDAwMDAsIDEuMGYgLyAweDAwMTAwMDAwLCAxLjBmIC8gMHgwMDEwMDAwMCwgMS4wZiAvIDB4MDAxMDAwMDApOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RSRUFNVFlQRV9ERUMzTjoKKwkJCXsKKwkJCQkvLyBGSVhNRTogVmVjdG9yaXplCisJCQkJeworCQkJCQlJbnQgeCwgeSwgejsKKwkJCQkJCisJCQkJCXggPSB5ID0geiA9ICpQb2ludGVyPEludD4oc291cmNlMCk7CisKKwkJCQkJdi54LnggPSBGbG9hdCgoeCA8PCAyMikgJiAweEZGQzAwMDAwKTsKKwkJCQkJdi54LnkgPSBGbG9hdCgoeSA8PCAxMikgJiAweEZGQzAwMDAwKTsKKwkJCQkJdi54LnogPSBGbG9hdCgoeiA8PCAyKSAgJiAweEZGQzAwMDAwKTsKKwkJCQl9CisKKwkJCQl7CisJCQkJCUludCB4LCB5LCB6OworCQkJCQkKKwkJCQkJeCA9IHkgPSB6ID0gKlBvaW50ZXI8SW50Pihzb3VyY2UxKTsKKworCQkJCQl2LnkueCA9IEZsb2F0KCh4IDw8IDIyKSAmIDB4RkZDMDAwMDApOworCQkJCQl2LnkueSA9IEZsb2F0KCh5IDw8IDEyKSAmIDB4RkZDMDAwMDApOworCQkJCQl2LnkueiA9IEZsb2F0KCh6IDw8IDIpICAmIDB4RkZDMDAwMDApOworCQkJCX0KKworCQkJCXsKKwkJCQkJSW50IHgsIHksIHo7CisJCQkJCQorCQkJCQl4ID0geSA9IHogPSAqUG9pbnRlcjxJbnQ+KHNvdXJjZTIpOworCisJCQkJCXYuei54ID0gRmxvYXQoKHggPDwgMjIpICYgMHhGRkMwMDAwMCk7CisJCQkJCXYuei55ID0gRmxvYXQoKHkgPDwgMTIpICYgMHhGRkMwMDAwMCk7CisJCQkJCXYuei56ID0gRmxvYXQoKHogPDwgMikgICYgMHhGRkMwMDAwMCk7CisJCQkJfQorCisJCQkJeworCQkJCQlJbnQgeCwgeSwgejsKKwkJCQkJCisJCQkJCXggPSB5ID0geiA9ICpQb2ludGVyPEludD4oc291cmNlMyk7CisKKwkJCQkJdi53LnggPSBGbG9hdCgoeCA8PCAyMikgJiAweEZGQzAwMDAwKTsKKwkJCQkJdi53LnkgPSBGbG9hdCgoeSA8PCAxMikgJiAweEZGQzAwMDAwKTsKKwkJCQkJdi53LnogPSBGbG9hdCgoeiA8PCAyKSAgJiAweEZGQzAwMDAwKTsKKwkJCQl9CisKKwkJCQl0cmFuc3Bvc2U0eDModi54LCB2LnksIHYueiwgdi53KTsKKworCQkJCXYueCAqPSBGbG9hdDQoMS4wZiAvIDB4MDA0MDAwMDAgLyA1MTEuMGYsIDEuMGYgLyAweDAwNDAwMDAwIC8gNTExLjBmLCAxLjBmIC8gMHgwMDQwMDAwMCAvIDUxMS4wZiwgMS4wZiAvIDB4MDA0MDAwMDAgLyA1MTEuMGYpOworCQkJCXYueSAqPSBGbG9hdDQoMS4wZiAvIDB4MDA0MDAwMDAgLyA1MTEuMGYsIDEuMGYgLyAweDAwNDAwMDAwIC8gNTExLjBmLCAxLjBmIC8gMHgwMDQwMDAwMCAvIDUxMS4wZiwgMS4wZiAvIDB4MDA0MDAwMDAgLyA1MTEuMGYpOworCQkJCXYueiAqPSBGbG9hdDQoMS4wZiAvIDB4MDA0MDAwMDAgLyA1MTEuMGYsIDEuMGYgLyAweDAwNDAwMDAwIC8gNTExLjBmLCAxLjBmIC8gMHgwMDQwMDAwMCAvIDUxMS4wZiwgMS4wZiAvIDB4MDA0MDAwMDAgLyA1MTEuMGYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RSRUFNVFlQRV9GSVhFRDoKKwkJCXsKKwkJCQl2LnggPSBGbG9hdDQoKlBvaW50ZXI8SW50ND4oc291cmNlMCkpICogKlBvaW50ZXI8RmxvYXQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsdW5zY2FsZUZpeGVkKSk7CisJCQkJdi55ID0gRmxvYXQ0KCpQb2ludGVyPEludDQ+KHNvdXJjZTEpKSAqICpQb2ludGVyPEZsb2F0ND4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLHVuc2NhbGVGaXhlZCkpOworCQkJCXYueiA9IEZsb2F0NCgqUG9pbnRlcjxJbnQ0Pihzb3VyY2UyKSkgKiAqUG9pbnRlcjxGbG9hdDQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyx1bnNjYWxlRml4ZWQpKTsKKwkJCQl2LncgPSBGbG9hdDQoKlBvaW50ZXI8SW50ND4oc291cmNlMykpICogKlBvaW50ZXI8RmxvYXQ0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsdW5zY2FsZUZpeGVkKSk7CisKKwkJCQl0cmFuc3Bvc2U0eE4odi54LCB2LnksIHYueiwgdi53LCBzdHJlYW0uY291bnQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RSRUFNVFlQRV9IQUxGOgorCQkJeworCQkJCWlmKHN0cmVhbS5jb3VudCA+PSAxKQorCQkJCXsKKwkJCQkJVVNob3J0IHgwID0gKlBvaW50ZXI8VVNob3J0Pihzb3VyY2UwICsgMCk7CisJCQkJCVVTaG9ydCB4MSA9ICpQb2ludGVyPFVTaG9ydD4oc291cmNlMSArIDApOworCQkJCQlVU2hvcnQgeDIgPSAqUG9pbnRlcjxVU2hvcnQ+KHNvdXJjZTIgKyAwKTsKKwkJCQkJVVNob3J0IHgzID0gKlBvaW50ZXI8VVNob3J0Pihzb3VyY2UzICsgMCk7CisKKwkJCQkJdi54LnggPSAqUG9pbnRlcjxGbG9hdD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGhhbGYyZmxvYXQpICsgSW50KHgwKSAqIDQpOworCQkJCQl2LngueSA9ICpQb2ludGVyPEZsb2F0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaGFsZjJmbG9hdCkgKyBJbnQoeDEpICogNCk7CisJCQkJCXYueC56ID0gKlBvaW50ZXI8RmxvYXQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxoYWxmMmZsb2F0KSArIEludCh4MikgKiA0KTsKKwkJCQkJdi54LncgPSAqUG9pbnRlcjxGbG9hdD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGhhbGYyZmxvYXQpICsgSW50KHgzKSAqIDQpOworCQkJCX0KKworCQkJCWlmKHN0cmVhbS5jb3VudCA+PSAyKQorCQkJCXsKKwkJCQkJVVNob3J0IHkwID0gKlBvaW50ZXI8VVNob3J0Pihzb3VyY2UwICsgMik7CisJCQkJCVVTaG9ydCB5MSA9ICpQb2ludGVyPFVTaG9ydD4oc291cmNlMSArIDIpOworCQkJCQlVU2hvcnQgeTIgPSAqUG9pbnRlcjxVU2hvcnQ+KHNvdXJjZTIgKyAyKTsKKwkJCQkJVVNob3J0IHkzID0gKlBvaW50ZXI8VVNob3J0Pihzb3VyY2UzICsgMik7CisKKwkJCQkJdi55LnggPSAqUG9pbnRlcjxGbG9hdD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGhhbGYyZmxvYXQpICsgSW50KHkwKSAqIDQpOworCQkJCQl2LnkueSA9ICpQb2ludGVyPEZsb2F0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaGFsZjJmbG9hdCkgKyBJbnQoeTEpICogNCk7CisJCQkJCXYueS56ID0gKlBvaW50ZXI8RmxvYXQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxoYWxmMmZsb2F0KSArIEludCh5MikgKiA0KTsKKwkJCQkJdi55LncgPSAqUG9pbnRlcjxGbG9hdD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGhhbGYyZmxvYXQpICsgSW50KHkzKSAqIDQpOworCQkJCX0KKworCQkJCWlmKHN0cmVhbS5jb3VudCA+PSAzKQorCQkJCXsKKwkJCQkJVVNob3J0IHowID0gKlBvaW50ZXI8VVNob3J0Pihzb3VyY2UwICsgNCk7CisJCQkJCVVTaG9ydCB6MSA9ICpQb2ludGVyPFVTaG9ydD4oc291cmNlMSArIDQpOworCQkJCQlVU2hvcnQgejIgPSAqUG9pbnRlcjxVU2hvcnQ+KHNvdXJjZTIgKyA0KTsKKwkJCQkJVVNob3J0IHozID0gKlBvaW50ZXI8VVNob3J0Pihzb3VyY2UzICsgNCk7CisKKwkJCQkJdi56LnggPSAqUG9pbnRlcjxGbG9hdD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGhhbGYyZmxvYXQpICsgSW50KHowKSAqIDQpOworCQkJCQl2LnoueSA9ICpQb2ludGVyPEZsb2F0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaGFsZjJmbG9hdCkgKyBJbnQoejEpICogNCk7CisJCQkJCXYuei56ID0gKlBvaW50ZXI8RmxvYXQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxoYWxmMmZsb2F0KSArIEludCh6MikgKiA0KTsKKwkJCQkJdi56LncgPSAqUG9pbnRlcjxGbG9hdD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGhhbGYyZmxvYXQpICsgSW50KHozKSAqIDQpOworCQkJCX0KKworCQkJCWlmKHN0cmVhbS5jb3VudCA+PSA0KQorCQkJCXsKKwkJCQkJVVNob3J0IHcwID0gKlBvaW50ZXI8VVNob3J0Pihzb3VyY2UwICsgNik7CisJCQkJCVVTaG9ydCB3MSA9ICpQb2ludGVyPFVTaG9ydD4oc291cmNlMSArIDYpOworCQkJCQlVU2hvcnQgdzIgPSAqUG9pbnRlcjxVU2hvcnQ+KHNvdXJjZTIgKyA2KTsKKwkJCQkJVVNob3J0IHczID0gKlBvaW50ZXI8VVNob3J0Pihzb3VyY2UzICsgNik7CisKKwkJCQkJdi53LnggPSAqUG9pbnRlcjxGbG9hdD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGhhbGYyZmxvYXQpICsgSW50KHcwKSAqIDQpOworCQkJCQl2LncueSA9ICpQb2ludGVyPEZsb2F0PihyLmNvbnN0YW50cyArIE9GRlNFVChDb25zdGFudHMsaGFsZjJmbG9hdCkgKyBJbnQodzEpICogNCk7CisJCQkJCXYudy56ID0gKlBvaW50ZXI8RmxvYXQ+KHIuY29uc3RhbnRzICsgT0ZGU0VUKENvbnN0YW50cyxoYWxmMmZsb2F0KSArIEludCh3MikgKiA0KTsKKwkJCQkJdi53LncgPSAqUG9pbnRlcjxGbG9hdD4oci5jb25zdGFudHMgKyBPRkZTRVQoQ29uc3RhbnRzLGhhbGYyZmxvYXQpICsgSW50KHczKSAqIDQpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUUkVBTVRZUEVfSU5ESUNFUzoKKwkJCXsKKwkJCQl2LngueCA9ICpQb2ludGVyPEZsb2F0Pihzb3VyY2UwKTsKKwkJCQl2LngueSA9ICpQb2ludGVyPEZsb2F0Pihzb3VyY2UxKTsKKwkJCQl2LngueiA9ICpQb2ludGVyPEZsb2F0Pihzb3VyY2UyKTsKKwkJCQl2LngudyA9ICpQb2ludGVyPEZsb2F0Pihzb3VyY2UzKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWlmKHN0cmVhbS5jb3VudCA8IDEpIHYueCA9IEZsb2F0NCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKwkJaWYoc3RyZWFtLmNvdW50IDwgMikgdi55ID0gRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCQlpZihzdHJlYW0uY291bnQgPCAzKSB2LnogPSBGbG9hdDQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisJCWlmKHN0cmVhbS5jb3VudCA8IDQpIHYudyA9IEZsb2F0NCgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKworCQlyZXR1cm4gdjsKKwl9CisKKwl2b2lkIFZlcnRleFJvdXRpbmU6OnBvc3RUcmFuc2Zvcm0oUmVnaXN0ZXJzICZyKQorCXsKKwkJaW50IHBvcyA9IHN0YXRlLnBvc2l0aW9uUmVnaXN0ZXI7CisKKwkJaWYoc3RhdGUucG9zdFRyYW5zZm9ybSAmJiAhc3RhdGUucHJlVHJhbnNmb3JtZWQpCisJCXsKKwkJCUZsb2F0NCBwb3NTY2FsZSA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHBvc1NjYWxlKSk7ICAgLy8gRklYTUU6IFVucGFjaworCisJCQlyLm94W3Bvc10gPSByLm94W3Bvc10gKiBwb3NTY2FsZS54OworCQkJci5veVtwb3NdID0gci5veVtwb3NdICogcG9zU2NhbGUueTsKKworCQkJRmxvYXQ0IHBvc09mZnNldCA9ICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLHBvc09mZnNldCkpOyAgIC8vIEZJWE1FOiBVbnBhY2sKKworCQkJci5veFtwb3NdID0gci5veFtwb3NdICsgci5vd1twb3NdICogcG9zT2Zmc2V0Lng7CisJCQlyLm95W3Bvc10gPSByLm95W3Bvc10gKyByLm93W3Bvc10gKiBwb3NPZmZzZXQueTsKKwkJfQorCX0KKworCXZvaWQgVmVydGV4Um91dGluZTo6d3JpdGVDYWNoZShQb2ludGVyPEJ5dGU+ICZjYWNoZUxpbmUsIFJlZ2lzdGVycyAmcikKKwl7CisJCUNvbG9yNGYgdjsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTI7IGkrKykKKwkJeworCQkJaWYoc3RhdGUub3V0cHV0W2ldLndyaXRlKQorCQkJeworCQkJCXYueCA9IHIub3hbaV07CisJCQkJdi55ID0gci5veVtpXTsKKwkJCQl2LnogPSByLm96W2ldOworCQkJCXYudyA9IHIub3dbaV07CisKKwkJCQlpZihzdGF0ZS5vdXRwdXRbaV0ueENsYW1wKQorCQkJCXsKKwkJCQkJdi54ID0gTWF4KHYueCwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKwkJCQkJdi54ID0gTWluKHYueCwgRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpKTsKKwkJCQl9CisKKwkJCQlpZihzdGF0ZS5vdXRwdXRbaV0ueUNsYW1wKQorCQkJCXsKKwkJCQkJdi55ID0gTWF4KHYueSwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKwkJCQkJdi55ID0gTWluKHYueSwgRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpKTsKKwkJCQl9CisKKwkJCQlpZihzdGF0ZS5vdXRwdXRbaV0uekNsYW1wKQorCQkJCXsKKwkJCQkJdi56ID0gTWF4KHYueiwgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKwkJCQkJdi56ID0gTWluKHYueiwgRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpKTsKKwkJCQl9CisKKwkJCQlpZihzdGF0ZS5vdXRwdXRbaV0ud0NsYW1wKQorCQkJCXsKKwkJCQkJdi53ID0gTWF4KHYudywgRmxvYXQ0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKKwkJCQkJdi53ID0gTWluKHYudywgRmxvYXQ0KDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpKTsKKwkJCQl9CisKKwkJCQlpZihzdGF0ZS5vdXRwdXRbaV0ud3JpdGUgPT0gMHgwMSkKKwkJCQl7CisJCQkJCSpQb2ludGVyPEZsb2F0PihjYWNoZUxpbmUgKyBPRkZTRVQoVmVydGV4LHZbaV0pICsgc2l6ZW9mKFZlcnRleCkgKiAwKSA9IHYueC54OworCQkJCQkqUG9pbnRlcjxGbG9hdD4oY2FjaGVMaW5lICsgT0ZGU0VUKFZlcnRleCx2W2ldKSArIHNpemVvZihWZXJ0ZXgpICogMSkgPSB2LngueTsKKwkJCQkJKlBvaW50ZXI8RmxvYXQ+KGNhY2hlTGluZSArIE9GRlNFVChWZXJ0ZXgsdltpXSkgKyBzaXplb2YoVmVydGV4KSAqIDIpID0gdi54Lno7CisJCQkJCSpQb2ludGVyPEZsb2F0PihjYWNoZUxpbmUgKyBPRkZTRVQoVmVydGV4LHZbaV0pICsgc2l6ZW9mKFZlcnRleCkgKiAzKSA9IHYueC53OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZihzdGF0ZS5vdXRwdXRbaV0ud3JpdGUgPT0gMHgwMikKKwkJCQkJeworCQkJCQkJdHJhbnNwb3NlMng0KHYueCwgdi55LCB2LnosIHYudyk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQl0cmFuc3Bvc2U0eDQodi54LCB2LnksIHYueiwgdi53KTsKKwkJCQkJfQorCisJCQkJCSpQb2ludGVyPEZsb2F0ND4oY2FjaGVMaW5lICsgT0ZGU0VUKFZlcnRleCx2W2ldKSArIHNpemVvZihWZXJ0ZXgpICogMCwgMTYpID0gdi54OworCQkJCQkqUG9pbnRlcjxGbG9hdDQ+KGNhY2hlTGluZSArIE9GRlNFVChWZXJ0ZXgsdltpXSkgKyBzaXplb2YoVmVydGV4KSAqIDEsIDE2KSA9IHYueTsKKwkJCQkJKlBvaW50ZXI8RmxvYXQ0PihjYWNoZUxpbmUgKyBPRkZTRVQoVmVydGV4LHZbaV0pICsgc2l6ZW9mKFZlcnRleCkgKiAyLCAxNikgPSB2Lno7CisJCQkJCSpQb2ludGVyPEZsb2F0ND4oY2FjaGVMaW5lICsgT0ZGU0VUKFZlcnRleCx2W2ldKSArIHNpemVvZihWZXJ0ZXgpICogMywgMTYpID0gdi53OworCQkJCX0KKwkJCX0KKwkJfQorCisJCSpQb2ludGVyPEludD4oY2FjaGVMaW5lICsgT0ZGU0VUKFZlcnRleCxjbGlwRmxhZ3MpICsgc2l6ZW9mKFZlcnRleCkgKiAwKSA9IChyLmNsaXBGbGFncyA+PiAwKSAgJiAweDAwMDAwMDBGRjsgICAvLyBGSVhNRTogdW5zaWduZWQgY2hhciBWZXJ0ZXg6OmNsaXBGbGFncworCQkqUG9pbnRlcjxJbnQ+KGNhY2hlTGluZSArIE9GRlNFVChWZXJ0ZXgsY2xpcEZsYWdzKSArIHNpemVvZihWZXJ0ZXgpICogMSkgPSAoci5jbGlwRmxhZ3MgPj4gOCkgICYgMHgwMDAwMDAwRkY7CisJCSpQb2ludGVyPEludD4oY2FjaGVMaW5lICsgT0ZGU0VUKFZlcnRleCxjbGlwRmxhZ3MpICsgc2l6ZW9mKFZlcnRleCkgKiAyKSA9IChyLmNsaXBGbGFncyA+PiAxNikgJiAweDAwMDAwMDBGRjsKKwkJKlBvaW50ZXI8SW50PihjYWNoZUxpbmUgKyBPRkZTRVQoVmVydGV4LGNsaXBGbGFncykgKyBzaXplb2YoVmVydGV4KSAqIDMpID0gKHIuY2xpcEZsYWdzID4+IDI0KSAmIDB4MDAwMDAwMEZGOworCisJCWludCBwb3MgPSBzdGF0ZS5wb3NpdGlvblJlZ2lzdGVyOworCisJCXYueCA9IHIub3hbcG9zXTsKKwkJdi55ID0gci5veVtwb3NdOworCQl2LnogPSByLm96W3Bvc107CisJCXYudyA9IHIub3dbcG9zXTsKKworCQlGbG9hdDQgdyA9IEFzPEZsb2F0ND4oQXM8SW50ND4odi53KSB8IChBczxJbnQ0PihDbXBFUSh2LncsIEZsb2F0NCgwLCAwLCAwLCAwKSkpICYgQXM8SW50ND4oRmxvYXQ0KDEsIDEsIDEsIDEpKSkpOworCQlGbG9hdDQgcmh3ID0gRmxvYXQ0KDEuMGYpIC8gdzsKKworCQl2LnggPSBBczxGbG9hdDQ+KFJvdW5kSW50KCpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLExMTEx4MTYpKSArIHYueCAqIHJodyAqICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLFdXV1d4MTYpKSkpOworCQl2LnkgPSBBczxGbG9hdDQ+KFJvdW5kSW50KCpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLFRUVFR4MTYpKSArIHYueSAqIHJodyAqICpQb2ludGVyPEZsb2F0ND4oci5kYXRhICsgT0ZGU0VUKERyYXdEYXRhLEhISEh4MTYpKSkpOworCQl2LnogPSB2LnogKiByaHc7CisJCXYudyA9IHJodzsKKworCQl0cmFuc3Bvc2U0eDQodi54LCB2LnksIHYueiwgdi53KTsKKworCQkqUG9pbnRlcjxGbG9hdDQ+KGNhY2hlTGluZSArIE9GRlNFVChWZXJ0ZXgsWCkgKyBzaXplb2YoVmVydGV4KSAqIDAsIDE2KSA9IHYueDsKKwkJKlBvaW50ZXI8RmxvYXQ0PihjYWNoZUxpbmUgKyBPRkZTRVQoVmVydGV4LFgpICsgc2l6ZW9mKFZlcnRleCkgKiAxLCAxNikgPSB2Lnk7CisJCSpQb2ludGVyPEZsb2F0ND4oY2FjaGVMaW5lICsgT0ZGU0VUKFZlcnRleCxYKSArIHNpemVvZihWZXJ0ZXgpICogMiwgMTYpID0gdi56OworCQkqUG9pbnRlcjxGbG9hdDQ+KGNhY2hlTGluZSArIE9GRlNFVChWZXJ0ZXgsWCkgKyBzaXplb2YoVmVydGV4KSAqIDMsIDE2KSA9IHYudzsKKwl9CisKKwl2b2lkIFZlcnRleFJvdXRpbmU6OndyaXRlVmVydGV4KFBvaW50ZXI8Qnl0ZT4gJnZlcnRleCwgUG9pbnRlcjxCeXRlPiAmY2FjaGUpCisJeworCQlmb3IoaW50IGkgPSAwOyBpIDwgMTI7IGkrKykKKwkJeworCQkJaWYoc3RhdGUub3V0cHV0W2ldLndyaXRlKQorCQkJeworCQkJCSpQb2ludGVyPEZsb2F0ND4odmVydGV4ICsgT0ZGU0VUKFZlcnRleCx2W2ldKSkgPSAqUG9pbnRlcjxGbG9hdDQ+KGNhY2hlICsgT0ZGU0VUKFZlcnRleCx2W2ldKSk7CisJCQl9CisJCX0KKworCQkqUG9pbnRlcjxJbnQ+KHZlcnRleCArIE9GRlNFVChWZXJ0ZXgsY2xpcEZsYWdzKSkgPSAqUG9pbnRlcjxJbnQ+KGNhY2hlICsgT0ZGU0VUKFZlcnRleCxjbGlwRmxhZ3MpKTsKKwkJKlBvaW50ZXI8RmxvYXQ0Pih2ZXJ0ZXggKyBPRkZTRVQoVmVydGV4LFgpKSA9ICpQb2ludGVyPEZsb2F0ND4oY2FjaGUgKyBPRkZTRVQoVmVydGV4LFgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvU2hhZGVyL1ZlcnRleFJvdXRpbmUuaHBwIGIvc3JjL1NoYWRlci9WZXJ0ZXhSb3V0aW5lLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzIxNjYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1NoYWRlci9WZXJ0ZXhSb3V0aW5lLmhwcApAQCAtMCwwICsxLDg4IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgc3dfVmVydGV4Um91dGluZV9ocHAKKyNkZWZpbmUgc3dfVmVydGV4Um91dGluZV9ocHAKKworI2luY2x1ZGUgIlJlbmRlcmVyL0NvbG9yLmhwcCIKKyNpbmNsdWRlICJSZW5kZXJlci9WZXJ0ZXhQcm9jZXNzb3IuaHBwIgorI2luY2x1ZGUgIlJlYWN0b3IvUmVhY3Rvci5ocHAiCisKK25hbWVzcGFjZSBzdworeworCWNsYXNzIFZlcnRleFJvdXRpbmUKKwl7CisJcHJvdGVjdGVkOgorCQlzdHJ1Y3QgUmVnaXN0ZXJzCisJCXsKKwkJCVJlZ2lzdGVycygpIDogY2FsbFN0YWNrKDQpLCBhTCg0KSwgaW5jcmVtZW50KDQpLCBpdGVyYXRpb24oNCksIGVuYWJsZVN0YWNrKDEgKyAyNCksIG94KDEyKSwgb3koMTIpLCBveigxMiksIG93KDEyKQorCQkJeworCQkJCWxvb3BEZXB0aCA9IC0xOworCQkJCWVuYWJsZVN0YWNrWzBdID0gSW50NCgweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGKTsKKwkJCQllbmFibGVCcmVhayA9IEludDQoMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7CisJCQl9CisKKwkJCVBvaW50ZXI8Qnl0ZT4gZGF0YTsKKwkJCVBvaW50ZXI8Qnl0ZT4gY29uc3RhbnRzOworCisJCQlBcnJheTxGbG9hdDQ+IG94OworCQkJQXJyYXk8RmxvYXQ0PiBveTsKKwkJCUFycmF5PEZsb2F0ND4gb3o7CisJCQlBcnJheTxGbG9hdDQ+IG93OworCisJCQlJbnQgY2xpcEZsYWdzOworCisJCQlDb2xvcjRmIHZbMTZdOworCQkJQ29sb3I0ZiByWzMyXTsKKwkJCUNvbG9yNGYgYTA7CisJCQlBcnJheTxJbnQ+IGFMOworCQkJQ29sb3I0ZiBwMDsKKworCQkJQXJyYXk8SW50PiBpbmNyZW1lbnQ7CisJCQlBcnJheTxJbnQ+IGl0ZXJhdGlvbjsKKworCQkJSW50IGxvb3BEZXB0aDsKKwkJCUludCBzdGFja0luZGV4OyAgIC8vIEZJWE1FOiBJbmMvZGVjcmVtZW50IGNhbGxTdGFjaworCQkJQXJyYXk8VUludD4gY2FsbFN0YWNrOworCisJCQlJbnQgZW5hYmxlSW5kZXg7CisJCQlBcnJheTxJbnQ0PiBlbmFibGVTdGFjazsKKwkJCUludDQgZW5hYmxlQnJlYWs7CisJCX07CisKKwlwdWJsaWM6CisJCVZlcnRleFJvdXRpbmUoY29uc3QgVmVydGV4UHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGUpOworCisJCXZpcnR1YWwgflZlcnRleFJvdXRpbmUoKTsKKworCQl2b2lkIGdlbmVyYXRlKCk7CisJCVJvdXRpbmUgKmdldFJvdXRpbmUoKTsKKworCXByb3RlY3RlZDoKKwkJY29uc3QgVmVydGV4UHJvY2Vzc29yOjpTdGF0ZSAmc3RhdGU7CisKKwlwcml2YXRlOgkJCisJCXZpcnR1YWwgdm9pZCBwaXBlbGluZShSZWdpc3RlcnMgJnIpID0gMDsKKworCQl0eXBlZGVmIFZlcnRleFByb2Nlc3Nvcjo6U3RhdGU6OklucHV0IFN0cmVhbTsKKwkJCisJCUNvbG9yNGYgcmVhZFN0cmVhbShSZWdpc3RlcnMgJnIsIFBvaW50ZXI8Qnl0ZT4gJmJ1ZmZlciwgVUludCAmc3RyaWRlLCBjb25zdCBTdHJlYW0gJnN0cmVhbSwgY29uc3QgVUludCAmaW5kZXgpOworCQl2b2lkIHJlYWRJbnB1dChSZWdpc3RlcnMgJnIsIFVJbnQgJmluZGV4KTsKKwkJdm9pZCBjb21wdXRlQ2xpcEZsYWdzKFJlZ2lzdGVycyAmcik7CisJCXZvaWQgcG9zdFRyYW5zZm9ybShSZWdpc3RlcnMgJnIpOworCQl2b2lkIHdyaXRlQ2FjaGUoUG9pbnRlcjxCeXRlPiAmY2FjaGVMaW5lLCBSZWdpc3RlcnMgJnIpOworCQl2b2lkIHdyaXRlVmVydGV4KFBvaW50ZXI8Qnl0ZT4gJnZlcnRleCwgUG9pbnRlcjxCeXRlPiAmY2FjaGVMaW5lKTsKKworCQlSb3V0aW5lICpyb3V0aW5lOworCX07Cit9CisKKyNlbmRpZiAgIC8vIHN3X1ZlcnRleFJvdXRpbmVfaHBwCmRpZmYgLS1naXQgYS9zcmMvU2hhZGVyL1ZlcnRleFNoYWRlci5jcHAgYi9zcmMvU2hhZGVyL1ZlcnRleFNoYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1ODgyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvVmVydGV4U2hhZGVyLmNwcApAQCAtMCwwICsxLDI2NiBAQAorLy8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKKy8vCisvLyBDb3B5cmlnaHQoYykgMjAwNS0yMDExIFRyYW5zR2FtaW5nIEluYy4KKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBObyBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAorLy8gdHJhbnNjcmliZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIHRyYW5zbGF0ZWQgaW50byBhbnkgaHVtYW4gb3IgY29tcHV0ZXIKKy8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgorLy8gYWdyZWVtZW50IG9mIFRyYW5zR2FtaW5nIEluYy4gV2l0aG91dCBzdWNoIGFuIGFncmVlbWVudCwgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzCisvLyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzLCBhcmUgZ3JhbnRlZCB0byB5b3UuCisvLworCisjaW5jbHVkZSAiVmVydGV4U2hhZGVyLmhwcCIKKworI2luY2x1ZGUgIlZlcnRleC5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwlWZXJ0ZXhTaGFkZXI6OlZlcnRleFNoYWRlcihjb25zdCB1bnNpZ25lZCBsb25nICp0b2tlbikgOiBTaGFkZXIodG9rZW4pCisJeworCQlwYXJzZSh0b2tlbik7CisJfQorCisJVmVydGV4U2hhZGVyOjp+VmVydGV4U2hhZGVyKCkKKwl7CisJfQorCisJdm9pZCBWZXJ0ZXhTaGFkZXI6OnBhcnNlKGNvbnN0IHVuc2lnbmVkIGxvbmcgKnRva2VuKQorCXsKKwkJbWlub3JWZXJzaW9uID0gKHVuc2lnbmVkIGNoYXIpKHRva2VuWzBdICYgMHgwMDAwMDBGRik7CisJCW1ham9yVmVyc2lvbiA9ICh1bnNpZ25lZCBjaGFyKSgodG9rZW5bMF0gJiAweDAwMDBGRjAwKSA+PiA4KTsKKwkJc2hhZGVyVHlwZSA9IChTaGFkZXJUeXBlKSgodG9rZW5bMF0gJiAweEZGRkYwMDAwKSA+PiAxNik7CisKKwkJbGVuZ3RoID0gdmFsaWRhdGUodG9rZW4pOworCQlBU1NFUlQobGVuZ3RoICE9IDApOworCisJCWluc3RydWN0aW9uID0gbmV3IFNoYWRlcjo6SW5zdHJ1Y3Rpb24qW2xlbmd0aF07CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQl7CisJCQl3aGlsZSgoKnRva2VuICYgMHgwMDAwRkZGRikgPT0gMHgwMDAwRkZGRSkgICAvLyBDb21tZW50IHRva2VuCisJCQl7CisJCQkJaW50IGxlbmd0aCA9ICgqdG9rZW4gJiAweDdGRkYwMDAwKSA+PiAxNjsKKworCQkJCXRva2VuICs9IGxlbmd0aCArIDE7CisJCQl9CisKKwkJCWludCB0b2tlbkNvdW50ID0gc2l6ZSgqdG9rZW4pOworCisJCQlpbnN0cnVjdGlvbltpXSA9IG5ldyBJbnN0cnVjdGlvbih0b2tlbiwgdG9rZW5Db3VudCwgbWFqb3JWZXJzaW9uKTsKKworCQkJdG9rZW4gKz0gMSArIHRva2VuQ291bnQ7CisJCX0KKworCQlhbmFseXplSW5wdXQoKTsKKwkJYW5hbHl6ZU91dHB1dCgpOworCQlhbmFseXplRGlydHlDb25zdGFudHMoKTsKKwkJYW5hbHl6ZVRleGxkbCgpOworCQlhbmFseXplRHluYW1pY0JyYW5jaGluZygpOworCQlhbmFseXplU2FtcGxlcnMoKTsKKwl9CisKKwlpbnQgVmVydGV4U2hhZGVyOjp2YWxpZGF0ZShjb25zdCB1bnNpZ25lZCBsb25nICpjb25zdCB0b2tlbikKKwl7CisJCWlmKCF0b2tlbikKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKworCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gKHVuc2lnbmVkIHNob3J0KSh0b2tlblswXSAmIDB4MDAwMEZGRkYpOworCQl1bnNpZ25lZCBjaGFyIG1pbm9yVmVyc2lvbiA9ICh1bnNpZ25lZCBjaGFyKSh0b2tlblswXSAmIDB4MDAwMDAwRkYpOworCQl1bnNpZ25lZCBjaGFyIG1ham9yVmVyc2lvbiA9ICh1bnNpZ25lZCBjaGFyKSgodG9rZW5bMF0gJiAweDAwMDBGRjAwKSA+PiA4KTsKKwkJU2hhZGVyVHlwZSBzaGFkZXJUeXBlID0gKFNoYWRlclR5cGUpKCh0b2tlblswXSAmIDB4RkZGRjAwMDApID4+IDE2KTsKKworCQlpZihzaGFkZXJUeXBlICE9IFNIQURFUl9WRVJURVggfHwgbWFqb3JWZXJzaW9uID4gMykKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpbnQgaW5zdHJ1Y3Rpb25Db3VudCA9IDE7CisKKwkJZm9yKGludCBpID0gMDsgdG9rZW5baV0gIT0gMHgwMDAwRkZGRjsgaSsrKQorCQl7CisJCQlpZigodG9rZW5baV0gJiAweDAwMDBGRkZGKSA9PSAweDAwMDBGRkZFKSAgIC8vIENvbW1lbnQgdG9rZW4KKwkJCXsKKwkJCQlpbnQgbGVuZ3RoID0gKHRva2VuW2ldICYgMHg3RkZGMDAwMCkgPj4gMTY7CisKKwkJCQlpICs9IGxlbmd0aDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlTaGFkZXJPcGNvZGUgb3Bjb2RlID0gKFNoYWRlck9wY29kZSkodG9rZW5baV0gJiAweDAwMDBGRkZGKTsKKworCQkJCXN3aXRjaChvcGNvZGUpCisJCQkJeworCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYQ09PUkQ6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhLSUxMOgorCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYOgorCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYQkVNOgorCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYQkVNTDoKKwkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWFJFRzJBUjoKKwkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWFJFRzJHQjoKKwkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDJQQUQ6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhNM1gyVEVYOgorCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYTTNYM1BBRDoKKwkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDNURVg6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9SRVNFUlZFRDA6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhNM1gzU1BFQzoKKwkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWE0zWDNWU1BFQzoKKwkJCQljYXNlIFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX1RFWFJFRzJSR0I6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhEUDNURVg6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhNM1gyREVQVEg6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhEUDM6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhNM1gzOgorCQkJCWNhc2UgU2hhZGVyT3BlcmF0aW9uOjpPUENPREVfVEVYREVQVEg6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9DTVA6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9CRU06CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9EUDJBREQ6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9EU1g6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9EU1k6CisJCQkJY2FzZSBTaGFkZXJPcGVyYXRpb246Ok9QQ09ERV9URVhMREQ6CisJCQkJCXJldHVybiAwOyAgIC8vIFVuc3VwcG9ydGVkIG9wZXJhdGlvbgorCQkJCWRlZmF1bHQ6CisJCQkJCWluc3RydWN0aW9uQ291bnQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaSArPSBzaXplKHRva2VuW2ldLCB2ZXJzaW9uKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBpbnN0cnVjdGlvbkNvdW50OworCX0KKworCWJvb2wgVmVydGV4U2hhZGVyOjpjb250YWluc1RleGxkbCgpIGNvbnN0CisJeworCQlyZXR1cm4gdGV4bGRsOworCX0KKworCXZvaWQgVmVydGV4U2hhZGVyOjphbmFseXplSW5wdXQoKQorCXsKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCWlucHV0W2ldID0gU2VtYW50aWMoLTEsIC0xKTsKKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJeworCQkJaWYoaW5zdHJ1Y3Rpb25baV0tPmdldE9wY29kZSgpID09IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX0RDTCAmJgorCQkJICAgaW5zdHJ1Y3Rpb25baV0tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCkudHlwZSA9PSBTaGFkZXJQYXJhbWV0ZXI6OlBBUkFNRVRFUl9JTlBVVCkKKwkJCXsKKwkJCQlpbnQgaW5kZXggPSBpbnN0cnVjdGlvbltpXS0+Z2V0RGVzdGluYXRpb25QYXJhbWV0ZXIoKS5pbmRleDsKKworCQkJCWlucHV0W2luZGV4XSA9IFNlbWFudGljKGluc3RydWN0aW9uW2ldLT5nZXRVc2FnZSgpLCBpbnN0cnVjdGlvbltpXS0+Z2V0VXNhZ2VJbmRleCgpKTsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgVmVydGV4U2hhZGVyOjphbmFseXplT3V0cHV0KCkKKwl7CisJCXBvc2l0aW9uUmVnaXN0ZXIgPSBQb3M7CisJCXBvaW50U2l6ZVJlZ2lzdGVyID0gLTE7ICAgLy8gTm8gdmVydGV4IHBvaW50IHNpemUKKworCQlpZih2ZXJzaW9uIDwgMHgwMzAwKQorCQl7CisJCQlvdXRwdXRbUG9zXVswXSA9IFNlbWFudGljKFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfUE9TSVRJT04sIDApOworCQkJb3V0cHV0W1Bvc11bMV0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX1BPU0lUSU9OLCAwKTsKKwkJCW91dHB1dFtQb3NdWzJdID0gU2VtYW50aWMoU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9QT1NJVElPTiwgMCk7CisJCQlvdXRwdXRbUG9zXVszXSA9IFNlbWFudGljKFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfUE9TSVRJT04sIDApOworCisJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQl7CisJCQkJY29uc3QgSW5zdHJ1Y3Rpb246OkRlc3RpbmF0aW9uUGFyYW1ldGVyICZkc3QgPSBpbnN0cnVjdGlvbltpXS0+Z2V0RGVzdGluYXRpb25QYXJhbWV0ZXIoKTsKKworCQkJCXN3aXRjaChkc3QudHlwZSkKKwkJCQl7CisJCQkJY2FzZSBTaGFkZXJQYXJhbWV0ZXI6OlBBUkFNRVRFUl9SQVNUT1VUOgorCQkJCQlzd2l0Y2goZHN0LmluZGV4KQorCQkJCQl7CisJCQkJCWNhc2UgMDoKKwkJCQkJCS8vIFBvc2l0aW9uIGFscmVhZHkgYXNzdW1lZCB3cml0dGVuCisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJb3V0cHV0W0ZvZ11bMF0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX0ZPRywgMCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJb3V0cHV0W1B0c11bMV0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX1BTSVpFLCAwKTsKKwkJCQkJCXBvaW50U2l6ZVJlZ2lzdGVyID0gUHRzOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6IEFTU0VSVChmYWxzZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaGFkZXJQYXJhbWV0ZXI6OlBBUkFNRVRFUl9BVFRST1VUOgorCQkJCQlpZihkc3QuaW5kZXggPT0gMCkKKwkJCQkJeworCQkJCQkJaWYoZHN0LngpIG91dHB1dFtEMF1bMF0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX0NPTE9SLCAwKTsKKwkJCQkJCWlmKGRzdC55KSBvdXRwdXRbRDBdWzFdID0gU2VtYW50aWMoU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9DT0xPUiwgMCk7CisJCQkJCQlpZihkc3Queikgb3V0cHV0W0QwXVsyXSA9IFNlbWFudGljKFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfQ09MT1IsIDApOworCQkJCQkJaWYoZHN0LncpIG91dHB1dFtEMF1bM10gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX0NPTE9SLCAwKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKGRzdC5pbmRleCA9PSAxKQorCQkJCQl7CisJCQkJCQlpZihkc3QueCkgb3V0cHV0W0QxXVswXSA9IFNlbWFudGljKFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfQ09MT1IsIDEpOworCQkJCQkJaWYoZHN0LnkpIG91dHB1dFtEMV1bMV0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX0NPTE9SLCAxKTsKKwkJCQkJCWlmKGRzdC56KSBvdXRwdXRbRDFdWzJdID0gU2VtYW50aWMoU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9DT0xPUiwgMSk7CisJCQkJCQlpZihkc3Qudykgb3V0cHV0W0QxXVszXSA9IFNlbWFudGljKFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfQ09MT1IsIDEpOworCQkJCQl9CisJCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaGFkZXJQYXJhbWV0ZXI6OlBBUkFNRVRFUl9URVhDUkRPVVQ6CisJCQkJCWlmKGRzdC54KSBvdXRwdXRbVDAgKyBkc3QuaW5kZXhdWzBdID0gU2VtYW50aWMoU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9URVhDT09SRCwgZHN0LmluZGV4KTsKKwkJCQkJaWYoZHN0LnkpIG91dHB1dFtUMCArIGRzdC5pbmRleF1bMV0gPSBTZW1hbnRpYyhTaGFkZXJPcGVyYXRpb246OlVTQUdFX1RFWENPT1JELCBkc3QuaW5kZXgpOworCQkJCQlpZihkc3Queikgb3V0cHV0W1QwICsgZHN0LmluZGV4XVsyXSA9IFNlbWFudGljKFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfVEVYQ09PUkQsIGRzdC5pbmRleCk7CisJCQkJCWlmKGRzdC53KSBvdXRwdXRbVDAgKyBkc3QuaW5kZXhdWzNdID0gU2VtYW50aWMoU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9URVhDT09SRCwgZHN0LmluZGV4KTsJCisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlICAgLy8gU2hhZGVyIE1vZGVsIDMuMCBpbnB1dCBkZWNsYXJhdGlvbgorCQl7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYoaW5zdHJ1Y3Rpb25baV0tPmdldE9wY29kZSgpID09IFNoYWRlck9wZXJhdGlvbjo6T1BDT0RFX0RDTCAmJgorCQkJCSAgIGluc3RydWN0aW9uW2ldLT5nZXREZXN0aW5hdGlvblBhcmFtZXRlcigpLnR5cGUgPT0gU2hhZGVyUGFyYW1ldGVyOjpQQVJBTUVURVJfT1VUUFVUKQorCQkJCXsKKwkJCQkJdW5zaWduZWQgY2hhciB1c2FnZSA9IGluc3RydWN0aW9uW2ldLT5nZXRVc2FnZSgpOworCQkJCQl1bnNpZ25lZCBjaGFyIHVzYWdlSW5kZXggPSBpbnN0cnVjdGlvbltpXS0+Z2V0VXNhZ2VJbmRleCgpOworCisJCQkJCWNvbnN0IEluc3RydWN0aW9uOjpEZXN0aW5hdGlvblBhcmFtZXRlciAmZHN0ID0gaW5zdHJ1Y3Rpb25baV0tPmdldERlc3RpbmF0aW9uUGFyYW1ldGVyKCk7CisKKwkJCQkJaWYoZHN0LngpIG91dHB1dFtkc3QuaW5kZXhdWzBdID0gU2VtYW50aWModXNhZ2UsIHVzYWdlSW5kZXgpOworCQkJCQlpZihkc3QueSkgb3V0cHV0W2RzdC5pbmRleF1bMV0gPSBTZW1hbnRpYyh1c2FnZSwgdXNhZ2VJbmRleCk7CisJCQkJCWlmKGRzdC56KSBvdXRwdXRbZHN0LmluZGV4XVsyXSA9IFNlbWFudGljKHVzYWdlLCB1c2FnZUluZGV4KTsKKwkJCQkJaWYoZHN0LncpIG91dHB1dFtkc3QuaW5kZXhdWzNdID0gU2VtYW50aWModXNhZ2UsIHVzYWdlSW5kZXgpOworCisJCQkJCWlmKHVzYWdlID09IFNoYWRlck9wZXJhdGlvbjo6VVNBR0VfUE9TSVRJT04gJiYgdXNhZ2VJbmRleCA9PSAwKQorCQkJCQl7CisJCQkJCQlwb3NpdGlvblJlZ2lzdGVyID0gZHN0LmluZGV4OworCQkJCQl9CisKKwkJCQkJaWYodXNhZ2UgPT0gU2hhZGVyT3BlcmF0aW9uOjpVU0FHRV9QU0laRSAmJiB1c2FnZUluZGV4ID09IDApCisJCQkJCXsKKwkJCQkJCXBvaW50U2l6ZVJlZ2lzdGVyID0gZHN0LmluZGV4OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJdm9pZCBWZXJ0ZXhTaGFkZXI6OmFuYWx5emVUZXhsZGwoKQorCXsKKwkJdGV4bGRsID0gZmFsc2U7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQl7CisJCQlpZihpbnN0cnVjdGlvbltpXS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Ok9wZXJhdGlvbjo6T1BDT0RFX1RFWExETCkKKwkJCXsKKwkJCQl0ZXhsZGwgPSB0cnVlOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvU2hhZGVyL1ZlcnRleFNoYWRlci5ocHAgYi9zcmMvU2hhZGVyL1ZlcnRleFNoYWRlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwMGIyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9TaGFkZXIvVmVydGV4U2hhZGVyLmhwcApAQCAtMCwwICsxLDQ4IEBACisvLyBTd2lmdFNoYWRlciBTb2Z0d2FyZSBSZW5kZXJlcgorLy8KKy8vIENvcHlyaWdodChjKSAyMDA1LTIwMTEgVHJhbnNHYW1pbmcgSW5jLgorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCisvLyB0cmFuc2NyaWJlZCwgc3RvcmVkIGluIGEgcmV0cmlldmFsIHN5c3RlbSwgdHJhbnNsYXRlZCBpbnRvIGFueSBodW1hbiBvciBjb21wdXRlcgorLy8gbGFuZ3VhZ2UgYnkgYW55IG1lYW5zLCBvciBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyB3aXRob3V0IHRoZSBleHBsaWNpdCB3cml0dGVuCisvLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKKy8vIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMsIGFyZSBncmFudGVkIHRvIHlvdS4KKy8vCisKKyNpZm5kZWYgc3dfVmVydGV4U2hhZGVyX2hwcAorI2RlZmluZSBzd19WZXJ0ZXhTaGFkZXJfaHBwCisKKyNpbmNsdWRlICJTaGFkZXIuaHBwIgorCituYW1lc3BhY2Ugc3cKK3sKKwljbGFzcyBWZXJ0ZXhTaGFkZXIgOiBwdWJsaWMgU2hhZGVyCisJeworCXB1YmxpYzoKKwkJVmVydGV4U2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKnRva2VuKTsKKworCQl2aXJ0dWFsIH5WZXJ0ZXhTaGFkZXIoKTsKKworCQlzdGF0aWMgaW50IHZhbGlkYXRlKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmNvbnN0IHRva2VuKTsgICAvLyBSZXR1cm5zIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaWYgdmFsaWQKKwkJYm9vbCBjb250YWluc1RleGxkbCgpIGNvbnN0OworCQkKKwkJaW50IHBvc2l0aW9uUmVnaXN0ZXI7ICAgICAvLyBGSVhNRTogUHJpdmF0ZQorCQlpbnQgcG9pbnRTaXplUmVnaXN0ZXI7ICAgIC8vIEZJWE1FOiBQcml2YXRlCisKKwkJU2VtYW50aWMgaW5wdXRbMTZdOyAgICAgICAvLyBGSVhNRTogUHJpdmF0ZQorCQlTZW1hbnRpYyBvdXRwdXRbMTJdWzRdOyAgIC8vIEZJWE1FOiBQcml2YXRlCisKKwlwcml2YXRlOgorCQl2b2lkIHBhcnNlKGNvbnN0IHVuc2lnbmVkIGxvbmcgKnRva2VuKTsKKworCQl2b2lkIGFuYWx5emVJbnB1dCgpOworCQl2b2lkIGFuYWx5emVPdXRwdXQoKTsKKwkJdm9pZCBhbmFseXplVGV4bGRsKCk7CisKKwkJYm9vbCB0ZXhsZGw7CisJfTsKKworCXR5cGVkZWYgVmVydGV4U2hhZGVyOjpJbnN0cnVjdGlvbiBWZXJ0ZXhTaGFkZXJJbnN0cnVjdGlvbjsKK30KKworI2VuZGlmICAgLy8gc3dfVmVydGV4U2hhZGVyX2hwcApkaWZmIC0tZ2l0IGEvc3JjL1N3aWZ0U2hhZGVyLVZTMDguc2xuIGIvc3JjL1N3aWZ0U2hhZGVyLVZTMDguc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzgxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU3dpZnRTaGFkZXItVlMwOC5zbG4KQEAgLTAsMCArMSwzNTkgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwDQorIyBWaXN1YWwgU3R1ZGlvIDIwMDgNCitQcm9qZWN0KCJ7MjE1MEUzMzMtOEZEQy00MkEzLTk0NzQtMUEzOTU2RDQ2REU4fSIpID0gIkxMVk0iLCAiTExWTSIsICJ7QjQwOEI5OEEtRTg4OC00RUNGLTgxRTAtN0EzN0E2ODU0QjE3fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJPcGVuR0wgRVMgMi4wIiwgIk9wZW5HTCBFUyAyLjAiLCAie0QzMzExNEQ3LUU1ODItNEQ2MS1CMjdELUZBQjAyOTdDNDNGRn0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiU3dpZnRTaGFkZXIiLCAiU3dpZnRTaGFkZXJcU3dpZnRTaGFkZXIudmNwcm9qIiwgIns3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fSA9IHswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9DQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fSA9IHsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9DQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fSA9IHszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9DQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfSA9IHsyOEZEMDc2RC0xMEI1LTRCRDgtQTRDRi1GNDRDNzAwMkE4MDN9DQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fSA9IHswNTlGQkFCOC1DNzZELTQ4QTAtQUE3NS0zQzU3QkQzRUFGRTR9DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fSA9IHswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fSA9IHtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9DQorCQl7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfSA9IHs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fSA9IHswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9DQorCQl7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfSA9IHsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9DQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfSA9IHsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiRDNEOSIsICJEM0Q5XEQzRDkudmNwcm9qIiwgIntGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfSA9IHs3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9DQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fSA9IHszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiQW5hbHlzaXMiLCAiTExWTVx3aW4zMlxBbmFseXNpc1xBbmFseXNpcy52Y3Byb2oiLCAiezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9ID0gezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJDb2RlR2VuIiwgIkxMVk1cd2luMzJcQ29kZUdlblxDb2RlR2VuLnZjcHJvaiIsICJ7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30gPSB7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fQ0KKwkJezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0gPSB7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfQ0KKwkJezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX0gPSB7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIkV4ZWN1dGlvbkVuZ2luZSIsICJMTFZNXHdpbjMyXEV4ZWN1dGlvbkVuZ2luZVxFeGVjdXRpb25FbmdpbmUudmNwcm9qIiwgIns3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAic3VwcG9ydCIsICJMTFZNXHdpbjMyXFN1cHBvcnRcU3VwcG9ydC52Y3Byb2oiLCAiezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiU3lzdGVtIiwgIkxMVk1cd2luMzJcU3lzdGVtXFN5c3RlbS52Y3Byb2oiLCAiezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiVGFibGVHZW4iLCAiTExWTVx3aW4zMlxUYWJsZUdlblxUYWJsZUdlbi52Y3Byb2oiLCAiezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9ID0gezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0NCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9ID0gezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJUYXJnZXQiLCAiTExWTVx3aW4zMlxUYXJnZXRcVGFyZ2V0LnZjcHJvaiIsICJ7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX0gPSB7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIlRyYW5zZm9ybXMiLCAiTExWTVx3aW4zMlxUcmFuc2Zvcm1zXFRyYW5zZm9ybXMudmNwcm9qIiwgIntDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fSA9IHszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiVk1Db3JlIiwgIkxMVk1cd2luMzJcVk1Db3JlXFZNQ29yZS52Y3Byb2oiLCAiezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9ID0gezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ4ODYiLCAiTExWTVx3aW4zMlx4ODZceDg2LnZjcHJvaiIsICJ7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30gPSB7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fQ0KKwkJezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0gPSB7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIlJlYWN0b3IiLCAiUmVhY3RvclxSZWFjdG9yLnZjcHJvaiIsICJ7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0gPSB7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fQ0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0gPSB7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fQ0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30gPSB7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fQ0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0gPSB7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fQ0KKwkJezA4Q0VCMUJCLUMyQTQtNDU4Ny1COUE5LUFFREI4RkI0NDg5N30gPSB7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fQ0KKwkJe0M1OTM3NEMxLTlGQzAtNDE0Ny1CODM2LTMyN0RGREM1MkQ5OX0gPSB7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fQ0KKwkJezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0gPSB7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfQ0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0gPSB7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfQ0KKwkJezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0gPSB7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fQ0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30gPSB7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfQ0KKwkJezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX0gPSB7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIk1DIiwgIkxMVk1cd2luMzJcTUNcTUMudmNwcm9qIiwgInsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibGliR0xFU3YyIiwgIk9wZW5HTCBFUyAyLjBcbGliR0xFU3YyXGxpYkdMRVN2Mi52Y3Byb2oiLCAie0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXs3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9ID0gezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30NCisJCXswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9ID0gezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0NCisJCXsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9ID0gezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0NCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9ID0gezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30NCisJCXsyOEZEMDc2RC0xMEI1LTRCRDgtQTRDRi1GNDRDNzAwMkE4MDN9ID0gezI4RkQwNzZELTEwQjUtNEJEOC1BNENGLUY0NEM3MDAyQTgwM30NCisJCXs1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9ID0gezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0NCisJCXswNTlGQkFCOC1DNzZELTQ4QTAtQUE3NS0zQzU3QkQzRUFGRTR9ID0gezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0NCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9ID0gezA4Q0VCMUJCLUMyQTQtNDU4Ny1COUE5LUFFREI4RkI0NDg5N30NCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9ID0ge0M1OTM3NEMxLTlGQzAtNDE0Ny1CODM2LTMyN0RGREM1MkQ5OX0NCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9ID0gezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0NCisJCXs1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9ID0gezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30NCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9ID0gezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0NCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9ID0gezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0NCisJCXsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9ID0gezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30NCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9ID0gezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJFR0wiLCAiT3BlbkdMIEVTIDIuMFxsaWJFR0xcbGliRUdMLnZjcHJvaiIsICJ7RTc0NkZDQTktNjRDMy00MzNFLTg1RTgtOUE1QTY3QUI3RUQ2fSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0gPSB7QjU4NzFBN0EtOTY4Qy00MkUzLUEzM0ItOTgxRTZGNDQ4RTc4fQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRyYW5zbGF0b3JfaGxzbCIsICJPcGVuR0wgRVMgMi4wXGNvbXBpbGVyXHRyYW5zbGF0b3JfaGxzbC52Y3Byb2oiLCAiezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidHJhbnNsYXRvcl9jb21tb24iLCAiT3BlbkdMIEVTIDIuMFxjb21waWxlclx0cmFuc2xhdG9yX2NvbW1vbi52Y3Byb2oiLCAiezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0DQorCQlQcm9maWxlfFdpbjMyID0gUHJvZmlsZXxXaW4zMg0KKwkJUHJvZmlsZXx4NjQgPSBQcm9maWxlfHg2NA0KKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9LlByb2ZpbGV8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXs3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LlByb2ZpbGV8V2luMzIuQWN0aXZlQ2ZnID0gUHJvZmlsZXxXaW4zMg0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH0uUHJvZmlsZXxXaW4zMi5CdWlsZC4wID0gUHJvZmlsZXxXaW4zMg0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH0uUHJvZmlsZXx4NjQuQWN0aXZlQ2ZnID0gUHJvZmlsZXx4NjQNCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LlByb2ZpbGV8eDY0LkJ1aWxkLjAgPSBQcm9maWxlfHg2NA0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7RjE4RDVBQkYtQ0EzQS00Qjc0LUJEQjItNEExOTU3Qzg2RjE4fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7RjE4RDVBQkYtQ0EzQS00Qjc0LUJEQjItNEExOTU3Qzg2RjE4fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfHg2NA0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uUHJvZmlsZXx4NjQuQnVpbGQuMCA9IFByb2ZpbGV8eDY0DQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFByb2ZpbGV8eDY0DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUHJvZmlsZXx4NjQNCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezA4Q0VCMUJCLUMyQTQtNDU4Ny1COUE5LUFFREI4RkI0NDg5N30uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezA4Q0VCMUJCLUMyQTQtNDU4Ny1COUE5LUFFREI4RkI0NDg5N30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LlByb2ZpbGV8V2luMzIuQWN0aXZlQ2ZnID0gUHJvZmlsZXxXaW4zMg0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0uUHJvZmlsZXxXaW4zMi5CdWlsZC4wID0gUHJvZmlsZXxXaW4zMg0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0uUHJvZmlsZXx4NjQuQWN0aXZlQ2ZnID0gUHJvZmlsZXx4NjQNCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LlByb2ZpbGV8eDY0LkJ1aWxkLjAgPSBQcm9maWxlfHg2NA0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfHg2NA0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uUHJvZmlsZXx4NjQuQnVpbGQuMCA9IFByb2ZpbGV8eDY0DQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFByb2ZpbGV8eDY0DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUHJvZmlsZXx4NjQNCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9LlByb2ZpbGV8V2luMzIuQWN0aXZlQ2ZnID0gUHJvZmlsZXxXaW4zMg0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uUHJvZmlsZXxXaW4zMi5CdWlsZC4wID0gUHJvZmlsZXxXaW4zMg0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uUHJvZmlsZXx4NjQuQWN0aXZlQ2ZnID0gUHJvZmlsZXx4NjQNCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9LlByb2ZpbGV8eDY0LkJ1aWxkLjAgPSBQcm9maWxlfHg2NA0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfHg2NA0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uUHJvZmlsZXx4NjQuQnVpbGQuMCA9IFByb2ZpbGV8eDY0DQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXswNTlGQkFCOC1DNzZELTQ4QTAtQUE3NS0zQzU3QkQzRUFGRTR9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXswNTlGQkFCOC1DNzZELTQ4QTAtQUE3NS0zQzU3QkQzRUFGRTR9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFByb2ZpbGV8eDY0DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUHJvZmlsZXx4NjQNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9LlByb2ZpbGV8V2luMzIuQWN0aXZlQ2ZnID0gUHJvZmlsZXxXaW4zMg0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uUHJvZmlsZXxXaW4zMi5CdWlsZC4wID0gUHJvZmlsZXxXaW4zMg0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uUHJvZmlsZXx4NjQuQWN0aXZlQ2ZnID0gUHJvZmlsZXx4NjQNCisJCXsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9LlByb2ZpbGV8eDY0LkJ1aWxkLjAgPSBQcm9maWxlfHg2NA0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezI4RkQwNzZELTEwQjUtNEJEOC1BNENGLUY0NEM3MDAyQTgwM30uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezI4RkQwNzZELTEwQjUtNEJEOC1BNENGLUY0NEM3MDAyQTgwM30uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfHg2NA0KKwkJezI4RkQwNzZELTEwQjUtNEJEOC1BNENGLUY0NEM3MDAyQTgwM30uUHJvZmlsZXx4NjQuQnVpbGQuMCA9IFByb2ZpbGV8eDY0DQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsyOEZEMDc2RC0xMEI1LTRCRDgtQTRDRi1GNDRDNzAwMkE4MDN9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyOEZEMDc2RC0xMEI1LTRCRDgtQTRDRi1GNDRDNzAwMkE4MDN9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFByb2ZpbGV8eDY0DQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUHJvZmlsZXx4NjQNCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtCNTg3MUE3QS05NjhDLTQyRTMtQTMzQi05ODFFNkY0NDhFNzh9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QjU4NzFBN0EtOTY4Qy00MkUzLUEzM0ItOTgxRTZGNDQ4RTc4fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXtCNTg3MUE3QS05NjhDLTQyRTMtQTMzQi05ODFFNkY0NDhFNzh9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXtCNTg3MUE3QS05NjhDLTQyRTMtQTMzQi05ODFFNkY0NDhFNzh9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtCNTg3MUE3QS05NjhDLTQyRTMtQTMzQi05ODFFNkY0NDhFNzh9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0U3NDZGQ0E5LTY0QzMtNDMzRS04NUU4LTlBNUE2N0FCN0VENn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtFNzQ2RkNBOS02NEMzLTQzM0UtODVFOC05QTVBNjdBQjdFRDZ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0U3NDZGQ0E5LTY0QzMtNDMzRS04NUU4LTlBNUE2N0FCN0VENn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7RTc0NkZDQTktNjRDMy00MzNFLTg1RTgtOUE1QTY3QUI3RUQ2fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXtFNzQ2RkNBOS02NEMzLTQzM0UtODVFOC05QTVBNjdBQjdFRDZ9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXtFNzQ2RkNBOS02NEMzLTQzM0UtODVFOC05QTVBNjdBQjdFRDZ9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtFNzQ2RkNBOS02NEMzLTQzM0UtODVFOC05QTVBNjdBQjdFRDZ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0U3NDZGQ0E5LTY0QzMtNDMzRS04NUU4LTlBNUE2N0FCN0VENn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0U3NDZGQ0E5LTY0QzMtNDMzRS04NUU4LTlBNUE2N0FCN0VENn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NTYyMEYwRTQtNkM0My00OUJDLUExNzgtQjgwNEUxQTBDM0E3fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NUIzQTZEQjgtMUU3RS00MEQ3LTkyQjktREE4QUFFNjE5RkFEfS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKE5lc3RlZFByb2plY3RzKSA9IHByZVNvbHV0aW9uDQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7QjU4NzFBN0EtOTY4Qy00MkUzLUEzM0ItOTgxRTZGNDQ4RTc4fSA9IHtEMzMxMTRENy1FNTgyLTRENjEtQjI3RC1GQUIwMjk3QzQzRkZ9DQorCQl7RTc0NkZDQTktNjRDMy00MzNFLTg1RTgtOUE1QTY3QUI3RUQ2fSA9IHtEMzMxMTRENy1FNTgyLTRENjEtQjI3RC1GQUIwMjk3QzQzRkZ9DQorCQl7NTYyMEYwRTQtNkM0My00OUJDLUExNzgtQjgwNEUxQTBDM0E3fSA9IHtEMzMxMTRENy1FNTgyLTRENjEtQjI3RC1GQUIwMjk3QzQzRkZ9DQorCQl7NUIzQTZEQjgtMUU3RS00MEQ3LTkyQjktREE4QUFFNjE5RkFEfSA9IHtEMzMxMTRENy1FNTgyLTRENjEtQjI3RC1GQUIwMjk3QzQzRkZ9DQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9zcmMvU3dpZnRTaGFkZXItVlMxMC5zbG4gYi9zcmMvU3dpZnRTaGFkZXItVlMxMC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmODFhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Td2lmdFNoYWRlci1WUzEwLnNsbgpAQCAtMCwwICsxLDMzNiBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDANCisjIFZpc3VhbCBTdHVkaW8gMjAxMA0KK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiTExWTSIsICJMTFZNIiwgIntCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIlN3aWZ0U2hhZGVyIiwgIlN3aWZ0U2hhZGVyXFN3aWZ0U2hhZGVyLnZjeHByb2oiLCAiezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9ID0gezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0NCisJCXsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9ID0gezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0NCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9ID0gezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30NCisJCXsyOEZEMDc2RC0xMEI1LTRCRDgtQTRDRi1GNDRDNzAwMkE4MDN9ID0gezI4RkQwNzZELTEwQjUtNEJEOC1BNENGLUY0NEM3MDAyQTgwM30NCisJCXswNTlGQkFCOC1DNzZELTQ4QTAtQUE3NS0zQzU3QkQzRUFGRTR9ID0gezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0NCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9ID0gezA4Q0VCMUJCLUMyQTQtNDU4Ny1COUE5LUFFREI4RkI0NDg5N30NCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9ID0ge0M1OTM3NEMxLTlGQzAtNDE0Ny1CODM2LTMyN0RGREM1MkQ5OX0NCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9ID0gezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0NCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9ID0gezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0NCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9ID0gezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0NCisJCXsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9ID0gezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30NCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9ID0gezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJEM0Q5IiwgIkQzRDlcRDNEOS52Y3hwcm9qIiwgIntGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fSA9IHszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiQW5hbHlzaXMiLCAiTExWTVx3aW4zMlxBbmFseXNpc1xBbmFseXNpcy52Y3hwcm9qIiwgInswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiQ29kZUdlbiIsICJMTFZNXHdpbjMyXENvZGVHZW5cQ29kZUdlbi52Y3hwcm9qIiwgInswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiRXhlY3V0aW9uRW5naW5lIiwgIkxMVk1cd2luMzJcRXhlY3V0aW9uRW5naW5lXEV4ZWN1dGlvbkVuZ2luZS52Y3hwcm9qIiwgIns3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIlN1cHBvcnQiLCAiTExWTVx3aW4zMlxTdXBwb3J0XFN1cHBvcnQudmN4cHJvaiIsICJ7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJTeXN0ZW0iLCAiTExWTVx3aW4zMlxTeXN0ZW1cU3lzdGVtLnZjeHByb2oiLCAiezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiVGFibGVHZW4iLCAiTExWTVx3aW4zMlxUYWJsZUdlblxUYWJsZUdlbi52Y3hwcm9qIiwgInszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIlRhcmdldCIsICJMTFZNXHdpbjMyXFRhcmdldFxUYXJnZXQudmN4cHJvaiIsICJ7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJUcmFuc2Zvcm1zIiwgIkxMVk1cd2luMzJcVHJhbnNmb3Jtc1xUcmFuc2Zvcm1zLnZjeHByb2oiLCAie0M1OTM3NEMxLTlGQzAtNDE0Ny1CODM2LTMyN0RGREM1MkQ5OX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9ID0gezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJWTUNvcmUiLCAiTExWTVx3aW4zMlxWTUNvcmVcVk1Db3JlLnZjeHByb2oiLCAiezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9ID0gezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ4ODYiLCAiTExWTVx3aW4zMlx4ODZceDg2LnZjeHByb2oiLCAiezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9ID0gezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30NCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9ID0gezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJSZWFjdG9yIiwgIlJlYWN0b3JcUmVhY3Rvci52Y3hwcm9qIiwgInsyOEZEMDc2RC0xMEI1LTRCRDgtQTRDRi1GNDRDNzAwMkE4MDN9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fSA9IHswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9DQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fSA9IHsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9DQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fSA9IHszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9DQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fSA9IHswNTlGQkFCOC1DNzZELTQ4QTAtQUE3NS0zQzU3QkQzRUFGRTR9DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fSA9IHswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fSA9IHtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9DQorCQl7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfSA9IHs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fSA9IHswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9DQorCQl7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfSA9IHsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9DQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfSA9IHsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiTUMiLCAiTExWTVx3aW4zMlxNQ1xNQy52Y3hwcm9qIiwgInsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiT3BlbkdMIEVTIDIuMCIsICJPcGVuR0wgRVMgMi4wIiwgIntEMzMxMTRENy1FNTgyLTRENjEtQjI3RC1GQUIwMjk3QzQzRkZ9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxpYkdMRVN2MiIsICJPcGVuR0wgRVMgMi4wXGxpYkdMRVN2MlxsaWJHTEVTdjIudmN4cHJvaiIsICJ7QjU4NzFBN0EtOTY4Qy00MkUzLUEzM0ItOTgxRTZGNDQ4RTc4fSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30gPSB7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfQ0KKwkJezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0gPSB7NUIzQTZEQjgtMUU3RS00MEQ3LTkyQjktREE4QUFFNjE5RkFEfQ0KKwkJezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30gPSB7NTYyMEYwRTQtNkM0My00OUJDLUExNzgtQjgwNEUxQTBDM0E3fQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxpYkVHTCIsICJPcGVuR0wgRVMgMi4wXGxpYkVHTFxsaWJFR0wudmN4cHJvaiIsICJ7RTc0NkZDQTktNjRDMy00MzNFLTg1RTgtOUE1QTY3QUI3RUQ2fSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30gPSB7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfQ0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0gPSB7QjU4NzFBN0EtOTY4Qy00MkUzLUEzM0ItOTgxRTZGNDQ4RTc4fQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRyYW5zbGF0b3JfaGxzbCIsICJPcGVuR0wgRVMgMi4wXGNvbXBpbGVyXHRyYW5zbGF0b3JfaGxzbC52Y3hwcm9qIiwgIns1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRyYW5zbGF0b3JfY29tbW9uIiwgIk9wZW5HTCBFUyAyLjBcY29tcGlsZXJcdHJhbnNsYXRvcl9jb21tb24udmN4cHJvaiIsICJ7NUIzQTZEQjgtMUU3RS00MEQ3LTkyQjktREE4QUFFNjE5RkFEfSINCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyDQorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQNCisJCVByb2ZpbGV8V2luMzIgPSBQcm9maWxlfFdpbjMyDQorCQlQcm9maWxlfHg2NCA9IFByb2ZpbGV8eDY0DQorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMg0KKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NA0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQorCQl7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfHg2NA0KKwkJezdCMDJDQjE5LTRDREYtNEY3OS1CQzlCLTdGM0Y2MTY0QTAwM30uUHJvZmlsZXx4NjQuQnVpbGQuMCA9IFByb2ZpbGV8eDY0DQorCQl7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7N0IwMkNCMTktNENERi00Rjc5LUJDOUItN0YzRjYxNjRBMDAzfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7RjE4RDVBQkYtQ0EzQS00Qjc0LUJEQjItNEExOTU3Qzg2RjE4fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7RjE4RDVBQkYtQ0EzQS00Qjc0LUJEQjItNEExOTU3Qzg2RjE4fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFByb2ZpbGV8eDY0DQorCQl7RjE4RDVBQkYtQ0EzQS00Qjc0LUJEQjItNEExOTU3Qzg2RjE4fS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUHJvZmlsZXx4NjQNCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1N0M4NkYxOH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTdDODZGMTh9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9LlByb2ZpbGV8V2luMzIuQWN0aXZlQ2ZnID0gUHJvZmlsZXxXaW4zMg0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uUHJvZmlsZXxXaW4zMi5CdWlsZC4wID0gUHJvZmlsZXxXaW4zMg0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uUHJvZmlsZXx4NjQuQWN0aXZlQ2ZnID0gUHJvZmlsZXx4NjQNCisJCXswNjIyRTgyNy04NDY0LTQ4OUQtOEIxQy1CMEI0OTZGMzVDMDh9LlByb2ZpbGV8eDY0LkJ1aWxkLjAgPSBQcm9maWxlfHg2NA0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezA2MjJFODI3LTg0NjQtNDg5RC04QjFDLUIwQjQ5NkYzNUMwOH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezA4Q0VCMUJCLUMyQTQtNDU4Ny1COUE5LUFFREI4RkI0NDg5N30uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezA4Q0VCMUJCLUMyQTQtNDU4Ny1COUE5LUFFREI4RkI0NDg5N30uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfHg2NA0KKwkJezA4Q0VCMUJCLUMyQTQtNDU4Ny1COUE5LUFFREI4RkI0NDg5N30uUHJvZmlsZXx4NjQuQnVpbGQuMCA9IFByb2ZpbGV8eDY0DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXswOENFQjFCQi1DMkE0LTQ1ODctQjlBOS1BRURCOEZCNDQ4OTd9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFByb2ZpbGV8eDY0DQorCQl7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUHJvZmlsZXx4NjQNCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezc2Mjk1QUU4LUEwODMtNDYwRS05RjgwLTZGMkI4OTIzMjY0QX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs3NjI5NUFFOC1BMDgzLTQ2MEUtOUY4MC02RjJCODkyMzI2NEF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9LlByb2ZpbGV8V2luMzIuQWN0aXZlQ2ZnID0gUHJvZmlsZXxXaW4zMg0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uUHJvZmlsZXxXaW4zMi5CdWlsZC4wID0gUHJvZmlsZXxXaW4zMg0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uUHJvZmlsZXx4NjQuQWN0aXZlQ2ZnID0gUHJvZmlsZXx4NjQNCisJCXsyOEFBOTE0Ni0zNDgyLTRGNDEtOUNDNi00MDdCMUQyNTg1MDh9LlByb2ZpbGV8eDY0LkJ1aWxkLjAgPSBQcm9maWxlfHg2NA0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezI4QUE5MTQ2LTM0ODItNEY0MS05Q0M2LTQwN0IxRDI1ODUwOH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfHg2NA0KKwkJezBGODQwN0YzLUZBMjMtNENGMS04M0E5LURDQkUwQjM2MTQ4OX0uUHJvZmlsZXx4NjQuQnVpbGQuMCA9IFByb2ZpbGV8eDY0DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXswRjg0MDdGMy1GQTIzLTRDRjEtODNBOS1EQ0JFMEIzNjE0ODl9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXszMzlDMjI0OS0yNkI2LTQxNzItQjQ4NC04NTY1MzAyOUFGNTd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUHJvZmlsZXxXaW4zMg0KKwkJezMzOUMyMjQ5LTI2QjYtNDE3Mi1CNDg0LTg1NjUzMDI5QUY1N30uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXswNTlGQkFCOC1DNzZELTQ4QTAtQUE3NS0zQzU3QkQzRUFGRTR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXswNTlGQkFCOC1DNzZELTQ4QTAtQUE3NS0zQzU3QkQzRUFGRTR9LlByb2ZpbGV8V2luMzIuQWN0aXZlQ2ZnID0gUHJvZmlsZXxXaW4zMg0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uUHJvZmlsZXxXaW4zMi5CdWlsZC4wID0gUHJvZmlsZXxXaW4zMg0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uUHJvZmlsZXx4NjQuQWN0aXZlQ2ZnID0gUHJvZmlsZXx4NjQNCisJCXswNTlGQkFCOC1DNzZELTQ4QTAtQUE3NS0zQzU3QkQzRUFGRTR9LlByb2ZpbGV8eDY0LkJ1aWxkLjAgPSBQcm9maWxlfHg2NA0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezA1OUZCQUI4LUM3NkQtNDhBMC1BQTc1LTNDNTdCRDNFQUZFNH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1OTM3NEMxLTlGQzAtNDE0Ny1CODM2LTMyN0RGREM1MkQ5OX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJe0M1OTM3NEMxLTlGQzAtNDE0Ny1CODM2LTMyN0RGREM1MkQ5OX0uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfHg2NA0KKwkJe0M1OTM3NEMxLTlGQzAtNDE0Ny1CODM2LTMyN0RGREM1MkQ5OX0uUHJvZmlsZXx4NjQuQnVpbGQuMCA9IFByb2ZpbGV8eDY0DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNTkzNzRDMS05RkMwLTQxNDctQjgzNi0zMjdERkRDNTJEOTl9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFByb2ZpbGV8eDY0DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUHJvZmlsZXx4NjQNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ1Q0Q3OEQ3LUM1RDktNDdGRS1BRDEyLUYzMjUxRUVEQUZGQn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs0NUNENzhENy1DNUQ5LTQ3RkUtQUQxMi1GMzI1MUVFREFGRkJ9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9LlByb2ZpbGV8V2luMzIuQWN0aXZlQ2ZnID0gUHJvZmlsZXxXaW4zMg0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uUHJvZmlsZXxXaW4zMi5CdWlsZC4wID0gUHJvZmlsZXxXaW4zMg0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uUHJvZmlsZXx4NjQuQWN0aXZlQ2ZnID0gUHJvZmlsZXx4NjQNCisJCXsxNDRFRUJGNi04QzlCLTQ0NzMtQjcxNS0yQzgyMTY2NkFGNkN9LlByb2ZpbGV8eDY0LkJ1aWxkLjAgPSBQcm9maWxlfHg2NA0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezE0NEVFQkY2LThDOUItNDQ3My1CNzE1LTJDODIxNjY2QUY2Q30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezI4RkQwNzZELTEwQjUtNEJEOC1BNENGLUY0NEM3MDAyQTgwM30uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezI4RkQwNzZELTEwQjUtNEJEOC1BNENGLUY0NEM3MDAyQTgwM30uUHJvZmlsZXxXaW4zMi5BY3RpdmVDZmcgPSBQcm9maWxlfFdpbjMyDQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5Qcm9maWxlfFdpbjMyLkJ1aWxkLjAgPSBQcm9maWxlfFdpbjMyDQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5Qcm9maWxlfHg2NC5BY3RpdmVDZmcgPSBQcm9maWxlfHg2NA0KKwkJezI4RkQwNzZELTEwQjUtNEJEOC1BNENGLUY0NEM3MDAyQTgwM30uUHJvZmlsZXx4NjQuQnVpbGQuMCA9IFByb2ZpbGV8eDY0DQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsyOEZEMDc2RC0xMEI1LTRCRDgtQTRDRi1GNDRDNzAwMkE4MDN9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyOEZEMDc2RC0xMEI1LTRCRDgtQTRDRi1GNDRDNzAwMkE4MDN9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7MjhGRDA3NkQtMTBCNS00QkQ4LUE0Q0YtRjQ0QzcwMDJBODAzfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFByb2ZpbGV8eDY0DQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfS5Qcm9maWxlfHg2NC5CdWlsZC4wID0gUHJvZmlsZXx4NjQNCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezEyRDAwQ0ZBLUUzOTMtNDg1Ny1BNDM2LUM3MzI0ODQ5REU1MX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXsxMkQwMENGQS1FMzkzLTQ4NTctQTQzNi1DNzMyNDg0OURFNTF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtCNTg3MUE3QS05NjhDLTQyRTMtQTMzQi05ODFFNkY0NDhFNzh9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QjU4NzFBN0EtOTY4Qy00MkUzLUEzM0ItOTgxRTZGNDQ4RTc4fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXtCNTg3MUE3QS05NjhDLTQyRTMtQTMzQi05ODFFNkY0NDhFNzh9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXtCNTg3MUE3QS05NjhDLTQyRTMtQTMzQi05ODFFNkY0NDhFNzh9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtCNTg3MUE3QS05NjhDLTQyRTMtQTMzQi05ODFFNkY0NDhFNzh9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0I1ODcxQTdBLTk2OEMtNDJFMy1BMzNCLTk4MUU2RjQ0OEU3OH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0U3NDZGQ0E5LTY0QzMtNDMzRS04NUU4LTlBNUE2N0FCN0VENn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtFNzQ2RkNBOS02NEMzLTQzM0UtODVFOC05QTVBNjdBQjdFRDZ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0U3NDZGQ0E5LTY0QzMtNDMzRS04NUU4LTlBNUE2N0FCN0VENn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7RTc0NkZDQTktNjRDMy00MzNFLTg1RTgtOUE1QTY3QUI3RUQ2fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXtFNzQ2RkNBOS02NEMzLTQzM0UtODVFOC05QTVBNjdBQjdFRDZ9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXtFNzQ2RkNBOS02NEMzLTQzM0UtODVFOC05QTVBNjdBQjdFRDZ9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtFNzQ2RkNBOS02NEMzLTQzM0UtODVFOC05QTVBNjdBQjdFRDZ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0U3NDZGQ0E5LTY0QzMtNDMzRS04NUU4LTlBNUE2N0FCN0VENn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0U3NDZGQ0E5LTY0QzMtNDMzRS04NUU4LTlBNUE2N0FCN0VENn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NTYyMEYwRTQtNkM0My00OUJDLUExNzgtQjgwNEUxQTBDM0E3fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs1NjIwRjBFNC02QzQzLTQ5QkMtQTE3OC1CODA0RTFBMEMzQTd9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezU2MjBGMEU0LTZDNDMtNDlCQy1BMTc4LUI4MDRFMUEwQzNBN30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NUIzQTZEQjgtMUU3RS00MEQ3LTkyQjktREE4QUFFNjE5RkFEfS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs1QjNBNkRCOC0xRTdFLTQwRDctOTJCOS1EQThBQUU2MTlGQUR9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezVCM0E2REI4LTFFN0UtNDBENy05MkI5LURBOEFBRTYxOUZBRH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKE5lc3RlZFByb2plY3RzKSA9IHByZVNvbHV0aW9uDQorCQl7MDYyMkU4MjctODQ2NC00ODlELThCMUMtQjBCNDk2RjM1QzA4fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MDhDRUIxQkItQzJBNC00NTg3LUI5QTktQUVEQjhGQjQ0ODk3fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7NzYyOTVBRTgtQTA4My00NjBFLTlGODAtNkYyQjg5MjMyNjRBfSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MjhBQTkxNDYtMzQ4Mi00RjQxLTlDQzYtNDA3QjFEMjU4NTA4fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MEY4NDA3RjMtRkEyMy00Q0YxLTgzQTktRENCRTBCMzYxNDg5fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MzM5QzIyNDktMjZCNi00MTcyLUI0ODQtODU2NTMwMjlBRjU3fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MDU5RkJBQjgtQzc2RC00OEEwLUFBNzUtM0M1N0JEM0VBRkU0fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7QzU5Mzc0QzEtOUZDMC00MTQ3LUI4MzYtMzI3REZEQzUyRDk5fSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7NDVDRDc4RDctQzVEOS00N0ZFLUFEMTItRjMyNTFFRURBRkZCfSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MTQ0RUVCRjYtOEM5Qi00NDczLUI3MTUtMkM4MjE2NjZBRjZDfSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7MTJEMDBDRkEtRTM5My00ODU3LUE0MzYtQzczMjQ4NDlERTUxfSA9IHtCNDA4Qjk4QS1FODg4LTRFQ0YtODFFMC03QTM3QTY4NTRCMTd9DQorCQl7QjU4NzFBN0EtOTY4Qy00MkUzLUEzM0ItOTgxRTZGNDQ4RTc4fSA9IHtEMzMxMTRENy1FNTgyLTRENjEtQjI3RC1GQUIwMjk3QzQzRkZ9DQorCQl7RTc0NkZDQTktNjRDMy00MzNFLTg1RTgtOUE1QTY3QUI3RUQ2fSA9IHtEMzMxMTRENy1FNTgyLTRENjEtQjI3RC1GQUIwMjk3QzQzRkZ9DQorCQl7NTYyMEYwRTQtNkM0My00OUJDLUExNzgtQjgwNEUxQTBDM0E3fSA9IHtEMzMxMTRENy1FNTgyLTRENjEtQjI3RC1GQUIwMjk3QzQzRkZ9DQorCQl7NUIzQTZEQjgtMUU3RS00MEQ3LTkyQjktREE4QUFFNjE5RkFEfSA9IHtEMzMxMTRENy1FNTgyLTRENjEtQjI3RC1GQUIwMjk3QzQzRkZ9DQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9zcmMvU3dpZnRTaGFkZXIvU3dpZnRDb25maWcudXJsIGIvc3JjL1N3aWZ0U2hhZGVyL1N3aWZ0Q29uZmlnLnVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTMyYzlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1N3aWZ0U2hhZGVyL1N3aWZ0Q29uZmlnLnVybApAQCAtMCwwICsxLDYgQEAKK1tJbnRlcm5ldFNob3J0Y3V0XQ0KK1VSTD1odHRwOi8vbG9jYWxob3N0OjgwODAvc3dpZnRjb25maWcNCitJRExpc3Q9DQorSG90S2V5PTANCitbezAwMDIxNEEwLTAwMDAtMDAwMC1DMDAwLTAwMDAwMDAwMDA0Nn1dDQorUHJvcDM9MTksMg0KZGlmZiAtLWdpdCBhL3NyYy9Td2lmdFNoYWRlci9Td2lmdFNoYWRlci5pbmkgYi9zcmMvU3dpZnRTaGFkZXIvU3dpZnRTaGFkZXIuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTZjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU3dpZnRTaGFkZXIvU3dpZnRTaGFkZXIuaW5pCkBAIC0wLDAgKzEsNTggQEAKKzsgU3dpZnRTaGFkZXIgQ29uZmlndXJhdGlvbiBGaWxlCis7Cis7IFRvIGdldCBhbiBvdmVydmlldyBvZiB0aGUgdmFsaWQgc2V0dGluZ3MgYW5kIHRoZWlyIG1lYW5pbmcsCis7IHJ1biB0aGUgYXBwbGljYXRpb24gaW4gd2luZG93ZWQgbW9kZSBhbmQgb3BlbiB0aGUKKzsgU3dpZnRDb25maWcgYXBwbGljYXRpb24gb3IgZ28gdG8gaHR0cDovL2xvY2FsaG9zdDo4MDgwL3N3aWZ0Y29uZmlnLgorCitbQ2FwYWJpbGl0aWVzXQorUGl4ZWxTaGFkZXJWZXJzaW9uPTMwCitWZXJ0ZXhTaGFkZXJWZXJzaW9uPTMwCitUZXh0dXJlTWVtb3J5PTI1NgorSWRlbnRpZmllcj0wCisKK1tDYWNoZXNdCitWZXJ0ZXhSb3V0aW5lQ2FjaGVTaXplPTEwMjQKK1BpeGVsUm91dGluZUNhY2hlU2l6ZT0xMDI0CitTZXR1cFJvdXRpbmVDYWNoZVNpemU9MTAyNAorVmVydGV4Q2FjaGVTaXplPTY0CisKK1tRdWFsaXR5XQorVGV4dHVyZVNhbXBsZVF1YWxpdHk9MgorTWlwbWFwUXVhbGl0eT0xCitQZXJzcGVjdGl2ZUNvcnJlY3Rpb249MQorVHJhbnNjZW5kZW50YWxQcmVjaXNpb249MgorVHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nPTAKKworW1Byb2Nlc3Nvcl0KK1RocmVhZENvdW50PTAKK0VuYWJsZVNTRTM9MQorRW5hYmxlU1NTRTM9MQorRW5hYmxlU1NFNF8xPTEKKworW09wdGltaXphdGlvbl0KK09wdGltaXphdGlvblBhc3MxPTEKK09wdGltaXphdGlvblBhc3MyPTAKK09wdGltaXphdGlvblBhc3MzPTAKK09wdGltaXphdGlvblBhc3M0PTAKK09wdGltaXphdGlvblBhc3M1PTAKK09wdGltaXphdGlvblBhc3M2PTAKK09wdGltaXphdGlvblBhc3M3PTAKK09wdGltaXphdGlvblBhc3M4PTAKK09wdGltaXphdGlvblBhc3M5PTAKK09wdGltaXphdGlvblBhc3MxMD0wCisKK1tUZXN0aW5nXQorRGlzYWJsZVNlcnZlcj0xCitGb3JjZVdpbmRvd2VkPTAKK0NvbXBsZW1lbnRhcnlEZXB0aEJ1ZmZlcj0wCitQb3N0QmxlbmRTUkdCPTAKK0V4YWN0Q29sb3JSb3VuZGluZz0wCitEaXNhYmxlQWxwaGFNb2RlPTAKK0Rpc2FibGUxMEJpdE1vZGU9MAorRnJhbWVCdWZmZXJBUEk9MAorU2hhZG93TWFwcGluZz0zCitGb3JjZUNsZWFyUmVnaXN0ZXJzPTAKKworW0xhc3RNb2RpZmllZF0KK1RpbWU9MTI4NzgwNTAzNAorCmRpZmYgLS1naXQgYS9zcmMvU3dpZnRTaGFkZXIvU3dpZnRTaGFkZXIucmMgYi9zcmMvU3dpZnRTaGFkZXIvU3dpZnRTaGFkZXIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjNWQ1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Td2lmdFNoYWRlci9Td2lmdFNoYWRlci5yYwpAQCAtMCwwICsxLDYxIEBACisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBnZW5lcmF0ZWQgcmVzb3VyY2Ugc2NyaXB0Lg0KKy8vDQorI2luY2x1ZGUgInJlc291cmNlLmgiDQorDQorI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAyIHJlc291cmNlLg0KKy8vDQorI2luY2x1ZGUgImFmeHJlcy5oIg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcw0KKw0KKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkNCitMQU5HVUFHRSA5LCAxDQorI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikNCisNCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBURVhUSU5DTFVERQ0KKy8vDQorDQorMSBURVhUSU5DTFVERSAgDQorQkVHSU4NCisgICAgInJlc291cmNlLmhcMCINCitFTkQNCisNCisyIFRFWFRJTkNMVURFICANCitCRUdJTg0KKyAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiINCisgICAgIlwwIg0KK0VORA0KKw0KKzMgVEVYVElOQ0xVREUgIA0KK0JFR0lODQorICAgICJcclxuIg0KKyAgICAiXDAiDQorRU5EDQorDQorI2VuZGlmICAgIC8vIEFQU1RVRElPX0lOVk9LRUQNCisNCisjZW5kaWYgICAgLy8gRW5nbGlzaCAoVS5TLikgcmVzb3VyY2VzDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisNCisNCisjaWZuZGVmIEFQU1RVRElPX0lOVk9LRUQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDMgcmVzb3VyY2UuDQorLy8NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKyNlbmRpZiAgICAvLyBub3QgQVBTVFVESU9fSU5WT0tFRA0KKw0KZGlmZiAtLWdpdCBhL3NyYy9Td2lmdFNoYWRlci9Td2lmdFNoYWRlci52Y3hwcm9qIGIvc3JjL1N3aWZ0U2hhZGVyL1N3aWZ0U2hhZGVyLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5NzllZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Td2lmdFNoYWRlci9Td2lmdFNoYWRlci52Y3hwcm9qCkBAIC0wLDAgKzEsNDE4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlByb2ZpbGV8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlByb2ZpbGU8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlByb2ZpbGV8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5Qcm9maWxlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPns3QjAyQ0IxOS00Q0RGLTRGNzktQkM5Qi03RjNGNjE2NEEwMDN9PC9Qcm9qZWN0R3VpZD4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk5vdFNldDwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKU1pY3Jvc29mdC5DUFAuVXBncmFkZUZyb21WQzcxLnByb3BzIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKU1pY3Jvc29mdC5DUFAuVXBncmFkZUZyb21WQzcxLnByb3BzIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClNaWNyb3NvZnQuQ1BQLlVwZ3JhZGVGcm9tVkM3MS5wcm9wcyIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNQUC5VcGdyYWRlRnJvbVZDNzEucHJvcHMiIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKU1pY3Jvc29mdC5DUFAuVXBncmFkZUZyb21WQzcxLnByb3BzIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNQUC5VcGdyYWRlRnJvbVZDNzEucHJvcHMiIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDMxOS4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkRlZmF1bHQ8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPk5laXRoZXI8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlw7Li5cTWFpbjsuLlxSZW5kZXJlcjsuLlxTaGFkZXI7Li5cQ29tbW9uOy4uXFN3aWZ0QXNtOy4uXGxpYmpwZWc7Li5cU3dpZnRTaGFkZXI7Li5cRDNEOTsuLlxSZWFjdG9yOy4uXExMVk1caW5jbHVkZTsuLlxMTFZNXHdpbjMyOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfTElCO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ1MzA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+TWVtb3J5TWFuYWdlci5ocHA7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgIDwvTGliPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkRlZmF1bHQ8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KKyAgICAgIDxGYXZvclNpemVPclNwZWVkPk5laXRoZXI8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPmZhbHNlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlw7Li5cTWFpbjsuLlxSZW5kZXJlcjsuLlxTaGFkZXI7Li5cQ29tbW9uOy4uXFN3aWZ0QXNtOy4uXGxpYmpwZWc7Li5cU3dpZnRTaGFkZXI7Li5cRDNEOTsuLlxSZWFjdG9yOy4uXExMVk1caW5jbHVkZTsuLlxMTFZNXHdpbjMyOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfTElCO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ1MzA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+TWVtb3J5TWFuYWdlci5ocHA7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgIDwvTGliPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cOy4uXE1haW47Li5cUmVuZGVyZXI7Li5cU2hhZGVyOy4uXENvbW1vbjsuLlxTd2lmdEFzbTsuLlxsaWJqcGVnOy4uXFN3aWZ0U2hhZGVyOy4uXEQzRDk7Li5cUmVhY3RvcjsuLlxMTFZNXGluY2x1ZGU7Li5cTExWTVx3aW4zMjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0xJQjtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPlN5bmM8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8Rm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPnRydWU8L0ZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDUzMDslKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz4lKEZvcmNlZEluY2x1ZGVGaWxlcyk8L0ZvcmNlZEluY2x1ZGVGaWxlcz4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgPC9MaWI+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlPg0KKyAgICAgIDxMaW5rTGlicmFyeURlcGVuZGVuY2llcz50cnVlPC9MaW5rTGlicmFyeURlcGVuZGVuY2llcz4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+ZmFsc2U8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlw7Li5cTWFpbjsuLlxSZW5kZXJlcjsuLlxTaGFkZXI7Li5cQ29tbW9uOy4uXFN3aWZ0QXNtOy4uXGxpYmpwZWc7Li5cU3dpZnRTaGFkZXI7Li5cRDNEOTsuLlxSZWFjdG9yOy4uXExMVk1caW5jbHVkZTsuLlxMTFZNXHdpbjMyOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfTElCO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40NTMwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPiUoRm9yY2VkSW5jbHVkZUZpbGVzKTwvRm9yY2VkSW5jbHVkZUZpbGVzPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4lKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlw7Li5cTWFpbjsuLlxSZW5kZXJlcjsuLlxTaGFkZXI7Li5cQ29tbW9uOy4uXFN3aWZ0QXNtOy4uXGxpYmpwZWc7Li5cU3dpZnRTaGFkZXI7Li5cRDNEOTsuLlxSZWFjdG9yOy4uXExMVk1caW5jbHVkZTsuLlxMTFZNXHdpbjMyOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfTElCO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfU0VDVVJFX1NDTD0wO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+U3luYzwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40NTMwOyUoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPiUoRm9yY2VkSW5jbHVkZUZpbGVzKTwvRm9yY2VkSW5jbHVkZUZpbGVzPg0KKyAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4lKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+QW55U3VpdGFibGU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+ZmFsc2U8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5TaXplPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXDsuLlxNYWluOy4uXFJlbmRlcmVyOy4uXFNoYWRlcjsuLlxDb21tb247Li5cU3dpZnRBc207Li5cbGlianBlZzsuLlxTd2lmdFNoYWRlcjsuLlxEM0Q5Oy4uXFJlYWN0b3I7Li5cTExWTVxpbmNsdWRlOy4uXExMVk1cd2luMzI7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5TeW5jPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ1MzA7JShEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgIDwvTGliPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxDb21tb25cVGhyZWFkLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNYWluXENvbmZpZy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTWFpblxDUkMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1haW5cUmVnaXN0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFNoYWRlclxDb25zdGFudHMuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFNoYWRlclxQaXhlbFJvdXRpbmUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFNoYWRlclxQaXhlbFNoYWRlci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cU2hhZGVyXFNhbXBsZXJDb3JlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxTaGFkZXJcU2V0dXBSb3V0aW5lLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxTaGFkZXJcU2hhZGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxTaGFkZXJcU2hhZGVyQ29yZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cU2hhZGVyXFZlcnRleFBpcGVsaW5lLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxTaGFkZXJcVmVydGV4UHJvZ3JhbS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cU2hhZGVyXFZlcnRleFJvdXRpbmUuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFNoYWRlclxWZXJ0ZXhTaGFkZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXEJsaXR0ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXENsaXBwZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXENvbG9yLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxDb250ZXh0LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxNYXRyaXguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFBpeGVsUHJvY2Vzc29yLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxQbGFuZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUG9pbnQuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFF1YWRSYXN0ZXJpemVyLmNwcCI+DQorICAgICAgPFByZXByb2Nlc3NUb0ZpbGUgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPmZhbHNlPC9QcmVwcm9jZXNzVG9GaWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzU3VwcHJlc3NMaW5lTnVtYmVycyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZmFsc2U8L1ByZXByb2Nlc3NTdXBwcmVzc0xpbmVOdW1iZXJzPg0KKyAgICAgIDxQcmVwcm9jZXNzS2VlcENvbW1lbnRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5mYWxzZTwvUHJlcHJvY2Vzc0tlZXBDb21tZW50cz4NCisgICAgICA8UHJlcHJvY2Vzc1RvRmlsZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPmZhbHNlPC9QcmVwcm9jZXNzVG9GaWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzU3VwcHJlc3NMaW5lTnVtYmVycyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPmZhbHNlPC9QcmVwcm9jZXNzU3VwcHJlc3NMaW5lTnVtYmVycz4NCisgICAgICA8UHJlcHJvY2Vzc0tlZXBDb21tZW50cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPmZhbHNlPC9QcmVwcm9jZXNzS2VlcENvbW1lbnRzPg0KKyAgICAgIDxQcmVwcm9jZXNzVG9GaWxlIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPmZhbHNlPC9QcmVwcm9jZXNzVG9GaWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzVG9GaWxlIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPmZhbHNlPC9QcmVwcm9jZXNzVG9GaWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzU3VwcHJlc3NMaW5lTnVtYmVycyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvUHJlcHJvY2Vzc1N1cHByZXNzTGluZU51bWJlcnM+DQorICAgICAgPFByZXByb2Nlc3NTdXBwcmVzc0xpbmVOdW1iZXJzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPmZhbHNlPC9QcmVwcm9jZXNzU3VwcHJlc3NMaW5lTnVtYmVycz4NCisgICAgICA8UHJlcHJvY2Vzc0tlZXBDb21tZW50cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvUHJlcHJvY2Vzc0tlZXBDb21tZW50cz4NCisgICAgICA8UHJlcHJvY2Vzc0tlZXBDb21tZW50cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj5mYWxzZTwvUHJlcHJvY2Vzc0tlZXBDb21tZW50cz4NCisgICAgICA8UHJlcHJvY2Vzc1RvRmlsZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZmFsc2U8L1ByZXByb2Nlc3NUb0ZpbGU+DQorICAgICAgPFByZXByb2Nlc3NUb0ZpbGUgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfHg2NCciPmZhbHNlPC9QcmVwcm9jZXNzVG9GaWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzU3VwcHJlc3NMaW5lTnVtYmVycyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZmFsc2U8L1ByZXByb2Nlc3NTdXBwcmVzc0xpbmVOdW1iZXJzPg0KKyAgICAgIDxQcmVwcm9jZXNzU3VwcHJlc3NMaW5lTnVtYmVycyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+ZmFsc2U8L1ByZXByb2Nlc3NTdXBwcmVzc0xpbmVOdW1iZXJzPg0KKyAgICAgIDxQcmVwcm9jZXNzS2VlcENvbW1lbnRzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvUHJlcHJvY2Vzc0tlZXBDb21tZW50cz4NCisgICAgICA8UHJlcHJvY2Vzc0tlZXBDb21tZW50cyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8eDY0JyI+ZmFsc2U8L1ByZXByb2Nlc3NLZWVwQ29tbWVudHM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFJhc3Rlcml6ZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFJlbmRlcmVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxTYW1wbGVyLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxTZXR1cFByb2Nlc3Nvci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcU3VyZmFjZS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcVGV4dHVyZVN0YWdlLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxWZWN0b3IuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFZlcnRleFByb2Nlc3Nvci5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcVmlld3BvcnQuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1haW5cRnJhbWVCdWZmZXIuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1haW5cRnJhbWVCdWZmZXJERC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTWFpblxGcmFtZUJ1ZmZlckdESS5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTWFpblxMb2dvLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNYWluXHNlcmlhbHZhbGlkLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNYWluXFN3aWZ0Q29uZmlnLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxDb21tb25cQ29uZmlndXJhdG9yLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxDb21tb25cQ1BVSUQuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXENvbW1vblxEZWJ1Zy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cQ29tbW9uXEhhbGYuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXENvbW1vblxNYXRoLmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxDb21tb25cTWVtb3J5LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxDb21tb25cUmVzb3VyY2UuY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXENvbW1vblxUaW1lci5jcHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXFRocmVhZC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXFZlcnNpb24uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxNYWluXFJlZ2lzdGVyLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxTaGFkZXJcQ29uc3RhbnRzLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxTaGFkZXJcUGl4ZWxSb3V0aW5lLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxTaGFkZXJcUGl4ZWxTaGFkZXIuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFNoYWRlclxTYW1wbGVyQ29yZS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFNldHVwUm91dGluZS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFNoYWRlci5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFNoYWRlckNvcmUuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFNoYWRlclxWZXJ0ZXhQaXBlbGluZS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFZlcnRleFByb2dyYW0uaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFNoYWRlclxWZXJ0ZXhSb3V0aW5lLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxTaGFkZXJcVmVydGV4U2hhZGVyLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxCbGl0dGVyLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxDbGlwcGVyLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxDb2xvci5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcQ29udGV4dC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcTFJVQ2FjaGUuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXE1hdHJpeC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUGl4ZWxQcm9jZXNzb3IuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFBsYW5lLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxQb2ludC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUHJpbWl0aXZlLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxRdWFkUmFzdGVyaXplci5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUmFzdGVyaXplci5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUmVuZGVyZXIuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFNhbXBsZXIuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFNldHVwUHJvY2Vzc29yLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxTdHJlYW0uaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFN1cmZhY2UuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFRleHR1cmVTdGFnZS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcVmVjdG9yLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxWZXJ0ZXguaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFZlcnRleFByb2Nlc3Nvci5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcVmlld3BvcnQuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXE1haW5cQ29uZmlnLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxNYWluXGNyYy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXE1haW5cRnJhbWVCdWZmZXIuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXE1haW5cRnJhbWVCdWZmZXJERC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cTWFpblxGcmFtZUJ1ZmZlckdESS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cTWFpblxzZXJpYWxjb21tb24uaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxNYWluXHNlcmlhbHZhbGlkLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cTWFpblxTd2lmdENvbmZpZy5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXENvbmZpZ3VyYXRvci5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXENQVUlELmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxDb21tb25cRGVidWcuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXENvbW1vblxIYWxmLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxDb21tb25cTWF0aC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXE1lbW9yeS5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXE1ldGFNYWNyby5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXE11dGV4TG9jay5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXFJlc291cmNlLmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxDb21tb25cVGltZXIuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXENvbW1vblxUeXBlcy5ocHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxOb25lIEluY2x1ZGU9IlN3aWZ0U2hhZGVyLmluaSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvU3dpZnRTaGFkZXIvU3dpZnRTaGFkZXIudmN4cHJvai5maWx0ZXJzIGIvc3JjL1N3aWZ0U2hhZGVyL1N3aWZ0U2hhZGVyLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQ5ODQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1N3aWZ0U2hhZGVyL1N3aWZ0U2hhZGVyLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDM0OCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXg8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlc1xTaGFkZXIiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntjYTFkNDgwNy0wMGE1LTQ1MWYtYWI0MC0zZTQ1MjQ4M2MzNzB9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNcUmVuZGVyZXIiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns4MGEyNWNmYS02NzJkLTQ1MzItYmViZS1kYjdkZTRjZmFlMjF9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNcTWFpbiI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezA4ZTJmZGNlLTA2MjEtNDllNy1iYzJkLWM0MmVjNWJlMGY2OX08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlc1xDb21tb24iPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2YmIxNmFmMi0yOGM5LTRiYjktYWJlNC03NTFmMTk0ZDJjNTd9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzXFNoYWRlciI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2Q5YmFkNDc4LTY0YTctNDc2NS1hNTBmLTQ0YTg2OWNiZWQ2Nn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlc1xSZW5kZXJlciI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2I3Njg3YWEzLTA5OTEtNDJlOS04MGNmLWM0ZWI2Y2U2NDNlYn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlc1xNYWluIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MzlmZWNmZGUtMzZmNS00YWQ2LWJhOTUtNzBmZGViNzk1M2NjfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzXENvbW1vbiI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezQ5OWU4NzE5LWI4NGYtNDdmNC05MGM4LTg5NDhkZWU2YmZiN308L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFNoYWRlclxDb25zdGFudHMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cU2hhZGVyXFBpeGVsUm91dGluZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNoYWRlcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxTaGFkZXJcUGl4ZWxTaGFkZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cU2hhZGVyXFNhbXBsZXJDb3JlLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcU2hhZGVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFNoYWRlclxTZXR1cFJvdXRpbmUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cU2hhZGVyXFNoYWRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNoYWRlcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxTaGFkZXJcU2hhZGVyQ29yZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNoYWRlcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxTaGFkZXJcVmVydGV4UGlwZWxpbmUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cU2hhZGVyXFZlcnRleFByb2dyYW0uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cU2hhZGVyXFZlcnRleFJvdXRpbmUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cU2hhZGVyXFZlcnRleFNoYWRlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFNoYWRlcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxCbGl0dGVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcQ2xpcHBlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXENvbG9yLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcQ29udGV4dC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXE1hdHJpeC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFBpeGVsUHJvY2Vzc29yLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUGxhbmUuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xSZW5kZXJlcjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxQb2ludC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFF1YWRSYXN0ZXJpemVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUmFzdGVyaXplci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFJlbmRlcmVyLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcU2FtcGxlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFNldHVwUHJvY2Vzc29yLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcU3VyZmFjZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFRleHR1cmVTdGFnZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFZlY3Rvci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFZlcnRleFByb2Nlc3Nvci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFZpZXdwb3J0LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTWFpblxGcmFtZUJ1ZmZlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXE1haW48L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTWFpblxGcmFtZUJ1ZmZlckRELmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcTWFpbjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNYWluXEZyYW1lQnVmZmVyR0RJLmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcTWFpbjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNYWluXExvZ28uY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xNYWluPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1haW5cc2VyaWFsdmFsaWQuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xNYWluPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1haW5cU3dpZnRDb25maWcuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xNYWluPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXENvbW1vblxDb25maWd1cmF0b3IuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xDb21tb248L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cQ29tbW9uXENQVUlELmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcQ29tbW9uPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXENvbW1vblxEZWJ1Zy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxDb21tb25cSGFsZi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxDb21tb25cTWF0aC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxDb21tb25cTWVtb3J5LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcQ29tbW9uPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXENvbW1vblxSZXNvdXJjZS5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxDb21tb25cVGltZXIuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xDb21tb248L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cQ29tbW9uXFRocmVhZC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNYWluXENvbmZpZy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXE1haW48L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTWFpblxSZWdpc3Rlci5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXE1haW48L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTWFpblxDUkMuY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xNYWluPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFNoYWRlclxDb25zdGFudHMuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFBpeGVsUm91dGluZS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXFNoYWRlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxTaGFkZXJcUGl4ZWxTaGFkZXIuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFNhbXBsZXJDb3JlLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcU2hhZGVyPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFNoYWRlclxTZXR1cFJvdXRpbmUuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFNoYWRlci5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXFNoYWRlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxTaGFkZXJcU2hhZGVyQ29yZS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXFNoYWRlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxTaGFkZXJcVmVydGV4UGlwZWxpbmUuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFZlcnRleFByb2dyYW0uaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFZlcnRleFJvdXRpbmUuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xTaGFkZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cU2hhZGVyXFZlcnRleFNoYWRlci5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXFNoYWRlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxCbGl0dGVyLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcQ2xpcHBlci5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXENvbG9yLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcQ29udGV4dC5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXExSVUNhY2hlLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcTWF0cml4LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUGl4ZWxQcm9jZXNzb3IuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xSZW5kZXJlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxQbGFuZS5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXFJlbmRlcmVyPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFJlbmRlcmVyXFBvaW50LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUHJpbWl0aXZlLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUXVhZFJhc3Rlcml6ZXIuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xSZW5kZXJlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxSYXN0ZXJpemVyLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcUmVuZGVyZXIuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xSZW5kZXJlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxTYW1wbGVyLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcU2V0dXBQcm9jZXNzb3IuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xSZW5kZXJlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxTdHJlYW0uaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xSZW5kZXJlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxSZW5kZXJlclxTdXJmYWNlLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcVGV4dHVyZVN0YWdlLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcVmVjdG9yLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcVmVydGV4LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcVmVydGV4UHJvY2Vzc29yLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcUmVuZGVyZXI8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUmVuZGVyZXJcVmlld3BvcnQuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xSZW5kZXJlcjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxNYWluXENvbmZpZy5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXE1haW48L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cTWFpblxjcmMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcTWFpbjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxNYWluXEZyYW1lQnVmZmVyLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcTWFpbjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxNYWluXEZyYW1lQnVmZmVyREQuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xNYWluPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXE1haW5cRnJhbWVCdWZmZXJHREkuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xNYWluPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXE1haW5cc2VyaWFsY29tbW9uLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXE1haW48L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cTWFpblxzZXJpYWx2YWxpZC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xNYWluPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXE1haW5cU3dpZnRDb25maWcuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xNYWluPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXENvbW1vblxDb25maWd1cmF0b3IuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xDb21tb248L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXENQVUlELmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcQ29tbW9uPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXENvbW1vblxEZWJ1Zy5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxDb21tb25cSGFsZi5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxDb21tb25cTWF0aC5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxDb21tb25cTWVtb3J5LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcQ29tbW9uPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXENvbW1vblxNZXRhTWFjcm8uaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xDb21tb248L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXE11dGV4TG9jay5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxDb21tb25cUmVzb3VyY2UuaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlc1xDb21tb248L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cQ29tbW9uXFRpbWVyLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcQ29tbW9uPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXENvbW1vblxUeXBlcy5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXENvbW1vbjwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxDb21tb25cVGhyZWFkLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXNcQ29tbW9uPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXENvbW1vblxWZXJzaW9uLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cTWFpblxSZWdpc3Rlci5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzXE1haW48L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxOb25lIEluY2x1ZGU9IlN3aWZ0U2hhZGVyLmluaSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvU3dpZnRTaGFkZXIvcmVzb3VyY2UuaCBiL3NyYy9Td2lmdFNoYWRlci9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjMzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvU3dpZnRTaGFkZXIvcmVzb3VyY2UuaApAQCAtMCwwICsxLDE0IEBACisvL3t7Tk9fREVQRU5ERU5DSUVTfX0KKy8vIE1pY3Jvc29mdCBWaXN1YWwgQysrIGdlbmVyYXRlZCBpbmNsdWRlIGZpbGUuCisvLyBVc2VkIGJ5IFN3aWZ0U2hhZGVyLWxpYi5yYworCisvLyBOZXh0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgb2JqZWN0cworLy8gCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorI2lmbmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRSAgICAgICAgMTAxCisjZGVmaW5lIF9BUFNfTkVYVF9DT01NQU5EX1ZBTFVFICAgICAgICAgNDAwMDEKKyNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDAxCisjZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAgICAgICAgICAgMTAxCisjZW5kaWYKKyNlbmRpZgo=